Version in base suite: 10.11.6-0+deb12u1 Base version: mariadb_10.11.6-0+deb12u1 Target version: mariadb_10.11.9-0+deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/m/mariadb/mariadb_10.11.6-0+deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/m/mariadb/mariadb_10.11.9-0+deb12u1.dsc /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/ca-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/client-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/server-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/3072/client-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/4096/client-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-cert-chain.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert-ext.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-crl-dist.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc384-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEccCrl.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl2.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/csr.dsa.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-priv-2048.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-pub-2048.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-rsa-server.p12 |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/client-ed448.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/root-ed448.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/fpki-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-multi-response.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-response-nointern.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-response-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-response.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/ca-p521.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/client-p521.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/root-p521.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rid-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/client-cert-rpk.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/client-ecc-cert-rpk.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/server-cert-rpk.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/server-ecc-cert-rpk.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-cert-chain.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-comp.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-rsa.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-self.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc384-cert.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-keyPub.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level1_key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level3_key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level5_key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level1_key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level3_key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level5_key.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-degenerate.p7b |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-servercert-rc2.p12 |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-servercert.p12 |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-stream-sign.p7b |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-bad-neg-int.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-bad-oid.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-bad-utf8.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-mnc.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ncdns.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ncmixed.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/ktri-keyid-cms.msg |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltname.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltnull.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcn.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcnnull.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-garbage.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodalt.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcn.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-localhost.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/x942dh2048.der |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.pcap |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.pcap |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl.rc |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/autoinc_import_101.frm |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/autoinc_import_57.frm |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/mysql80/t2.cfg |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/mysql80/t2.ibd |binary /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_i_s_innodb_locks.result |binary mariadb-10.11.9/.clang-format | 1 mariadb-10.11.9/.gitlab-ci.yml | 86 mariadb-10.11.9/BUILD/SETUP.sh | 6 mariadb-10.11.9/CMakeLists.txt | 31 mariadb-10.11.9/Docs/INFO_SRC | 8 mariadb-10.11.9/README.md | 32 mariadb-10.11.9/THIRDPARTY | 29 mariadb-10.11.9/VERSION | 2 mariadb-10.11.9/appveyor.yml | 10 mariadb-10.11.9/client/CMakeLists.txt | 4 mariadb-10.11.9/client/client_priv.h | 77 mariadb-10.11.9/client/mysql.cc | 606 mariadb-10.11.9/client/mysql_plugin.c | 8 mariadb-10.11.9/client/mysql_upgrade.c | 81 mariadb-10.11.9/client/mysqladmin.cc | 54 mariadb-10.11.9/client/mysqlbinlog.cc | 36 mariadb-10.11.9/client/mysqlcheck.c | 31 mariadb-10.11.9/client/mysqldump.c | 414 mariadb-10.11.9/client/mysqlimport.c | 38 mariadb-10.11.9/client/mysqlshow.c | 14 mariadb-10.11.9/client/mysqlslap.c | 61 mariadb-10.11.9/client/mysqltest.cc | 620 mariadb-10.11.9/cmake/FindPMEM.cmake | 18 mariadb-10.11.9/cmake/libfmt.cmake | 14 mariadb-10.11.9/cmake/libutils.cmake | 6 mariadb-10.11.9/cmake/maintainer.cmake | 6 mariadb-10.11.9/cmake/mariadb_connector_c.cmake | 7 mariadb-10.11.9/cmake/mysql_version.cmake | 2 mariadb-10.11.9/cmake/os/Windows.cmake | 1 mariadb-10.11.9/cmake/os/WindowsCache.cmake | 1 mariadb-10.11.9/cmake/package_name.cmake | 6 mariadb-10.11.9/cmake/pcre.cmake | 50 mariadb-10.11.9/cmake/plugin.cmake | 4 mariadb-10.11.9/cmake/readline.cmake | 3 mariadb-10.11.9/cmake/ssl.cmake | 5 mariadb-10.11.9/cmake/wsrep.cmake | 6 mariadb-10.11.9/cmake/zlib.cmake | 18 mariadb-10.11.9/config.h.cmake | 3 mariadb-10.11.9/configure.cmake | 19 mariadb-10.11.9/debian/changelog | 23 mariadb-10.11.9/debian/gbp.conf | 10 mariadb-10.11.9/debian/libmariadb-dev.install | 1 mariadb-10.11.9/debian/mariadb-client.NEWS | 42 mariadb-10.11.9/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch | 51 mariadb-10.11.9/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch | 283 mariadb-10.11.9/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch | 4 mariadb-10.11.9/debian/patches/series | 2 mariadb-10.11.9/debian/salsa-ci.yml | 8 mariadb-10.11.9/debian/source/lintian-overrides | 2 mariadb-10.11.9/debian/tests/configuration-tracing | 3 mariadb-10.11.9/debian/tests/traces/mariadb-verbose-help.expected | 165 mariadb-10.11.9/debian/tests/traces/mariadbd-verbose-help.expected | 43 mariadb-10.11.9/debian/watch | 2 mariadb-10.11.9/extra/CMakeLists.txt | 2 mariadb-10.11.9/extra/mariabackup/CMakeLists.txt | 17 mariadb-10.11.9/extra/mariabackup/aria_backup_client.cc | 1016 mariadb-10.11.9/extra/mariabackup/aria_backup_client.h | 38 mariadb-10.11.9/extra/mariabackup/backup_copy.cc | 498 mariadb-10.11.9/extra/mariabackup/backup_copy.h | 33 mariadb-10.11.9/extra/mariabackup/backup_debug.h | 21 mariadb-10.11.9/extra/mariabackup/backup_mysql.cc | 350 mariadb-10.11.9/extra/mariabackup/backup_mysql.h | 24 mariadb-10.11.9/extra/mariabackup/changed_page_bitmap.cc | 1040 mariadb-10.11.9/extra/mariabackup/changed_page_bitmap.h | 85 mariadb-10.11.9/extra/mariabackup/common.h | 3 mariadb-10.11.9/extra/mariabackup/common_engine.cc | 512 mariadb-10.11.9/extra/mariabackup/common_engine.h | 39 mariadb-10.11.9/extra/mariabackup/datasink.cc | 28 mariadb-10.11.9/extra/mariabackup/datasink.h | 17 mariadb-10.11.9/extra/mariabackup/ddl_log.cc | 553 mariadb-10.11.9/extra/mariabackup/ddl_log.h | 15 mariadb-10.11.9/extra/mariabackup/ds_buffer.cc | 9 mariadb-10.11.9/extra/mariabackup/ds_compress.cc | 9 mariadb-10.11.9/extra/mariabackup/ds_local.cc | 105 mariadb-10.11.9/extra/mariabackup/ds_stdout.cc | 8 mariadb-10.11.9/extra/mariabackup/ds_tmpfile.cc | 8 mariadb-10.11.9/extra/mariabackup/ds_xbstream.cc | 61 mariadb-10.11.9/extra/mariabackup/encryption_plugin.cc | 249 mariadb-10.11.9/extra/mariabackup/encryption_plugin.h | 7 mariadb-10.11.9/extra/mariabackup/fil_cur.cc | 17 mariadb-10.11.9/extra/mariabackup/fil_cur.h | 1 mariadb-10.11.9/extra/mariabackup/innobackupex.cc | 78 mariadb-10.11.9/extra/mariabackup/read_filt.cc | 142 mariadb-10.11.9/extra/mariabackup/read_filt.h | 29 mariadb-10.11.9/extra/mariabackup/thread_pool.cc | 50 mariadb-10.11.9/extra/mariabackup/thread_pool.h | 62 mariadb-10.11.9/extra/mariabackup/write_filt.cc | 12 mariadb-10.11.9/extra/mariabackup/wsrep.cc | 56 mariadb-10.11.9/extra/mariabackup/xb_plugin.cc | 229 mariadb-10.11.9/extra/mariabackup/xb_plugin.h | 5 mariadb-10.11.9/extra/mariabackup/xbstream.cc | 64 mariadb-10.11.9/extra/mariabackup/xbstream.h | 19 mariadb-10.11.9/extra/mariabackup/xbstream_read.cc | 105 mariadb-10.11.9/extra/mariabackup/xbstream_write.cc | 152 mariadb-10.11.9/extra/mariabackup/xtrabackup.cc | 1100 mariadb-10.11.9/extra/mariabackup/xtrabackup.h | 59 mariadb-10.11.9/extra/my_print_defaults.c | 1 mariadb-10.11.9/extra/perror.c | 3 mariadb-10.11.9/extra/wolfssl/CMakeLists.txt | 184 mariadb-10.11.9/extra/wolfssl/user_settings.h.in | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/.cyignore | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/.editorconfig | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/async.yml | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/curl.yml | 70 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/cyrus-sasl.yml | 91 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/disabled/haproxy.yml | 60 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/disabled/hostap.yml | 292 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml | 19 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/grpc.yml | 101 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml | 51 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hitch.yml | 103 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/hostapd.config | 122 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/tests | 1677 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/wpa_supplicant.config | 164 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/b607d2723e927a3446d89aed813f1aa6068186bb/tests | 51 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/extra.patch | 47 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/tests | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-vm.yml | 313 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap.yml | 279 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/ipmitool.yml | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/jwt-cpp.yml | 85 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/krb5.yml | 96 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml | 67 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/libvncserver.yml | 79 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/main.yml | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/memcached.sh | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/memcached.yml | 116 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml | 63 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml | 34 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/net-snmp.yml | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/nginx.yml | 219 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/no-malloc.yml | 43 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/ocsp.yml | 37 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/openssh.yml | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/os-check.yml | 44 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/packaging.yml | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/pam-ipmi.yml | 86 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/socat.yml | 76 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml | 128 mariadb-10.11.9/extra/wolfssl/wolfssl/.gitignore | 72 mariadb-10.11.9/extra/wolfssl/wolfssl/CMakeLists.txt | 737 mariadb-10.11.9/extra/wolfssl/wolfssl/ChangeLog.md | 353 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/Dockerfile | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/OpenWrt/runTests.sh | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/README.md | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/buildAndPush.sh | 37 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/include.am | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/packaging/debian/Dockerfile | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/packaging/fedora/Dockerfile | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/run.sh | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/wolfCLU/Dockerfile | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md | 184 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt | 21 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino | 965 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md | 134 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino | 909 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh | 362 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/AURIX/user_settings.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/main.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/user_settings.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/deos_wolfssl/.project | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/user_settings.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/MICRIUM/README.md | 72 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README.md | 219 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README_32se.md | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/UPDATE.md | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/compileAllExamples.sh | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/dummy_test_paths.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/README.md | 120 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/CMakeLists.txt | 73 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/README.md | 72 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/VisualGDB/wolfssl_template_IDF_v5.1_ESP32.vgdbproj | 269 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt | 538 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h | 631 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/CMakeLists.txt | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/include/main.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/main.c | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/partitions_singleapp_large.csv | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/sdkconfig.defaults | 35 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/CMakeLists.txt | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/Makefile | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/README.md | 95 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v5_ESP32.vgdbproj | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt | 839 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk | 280 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h | 752 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/CMakeLists.txt | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/component.mk | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/include/main.h | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c | 164 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.h | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/partitions_singleapp_large.csv | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/sdkconfig.defaults | 65 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/CMakeLists.txt | 93 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile | 128 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md | 196 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README_server_sm.md | 512 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/README.md | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.sln | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.vgdbproj | 269 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln | 61 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.vgdbproj | 269 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt | 635 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk | 290 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h | 586 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/CMakeLists.txt | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/Kconfig.projbuild | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c | 546 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h | 95 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h | 55 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h | 126 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c | 305 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c | 382 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c | 441 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/partitions_singleapp_large.csv | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj | 292 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/CMakeLists.txt | 93 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README.md | 106 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README_server_sm.md | 512 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/README.md | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.sln | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.vgdbproj | 269 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.sln | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.vgdbproj | 269 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt | 635 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk | 288 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h | 583 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/CMakeLists.txt | 43 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/Kconfig.projbuild | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/main.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/server-tls.h | 60 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/time_helper.h | 55 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/wifi_connect.h | 87 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/main.c | 248 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c | 365 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/time_helper.c | 333 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/wifi_connect.c | 342 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/partitions_singleapp_large.csv | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/CMakeLists.txt | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/Makefile | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/README.md | 51 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32.vgdbproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt | 838 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk | 280 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h | 775 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/CMakeLists.txt | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/component.mk | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/include/main.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c | 194 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.c | 119 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.h | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/partitions_singleapp_large.csv | 34 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/sdkconfig.defaults | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testAll.sh | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testMonitor.sh | 230 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/wolfssl_test_ESP8266.vgdbproj | 292 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/README.md | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/main.c | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/CMakeLists.txt | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/component.mk | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/setup_win.bat | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h | 370 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/README.md | 202 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/include.am | 101 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/Header/user_settings.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/Makefile.common | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/linker_fips.ld | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/HEXAGON/ecc-verify-benchmark.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/.gitignore | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/.gitignore | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt | 2382 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt | 2400 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt | 2382 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-MSP430/README.md | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-MSP430/main.c | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/README.md | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/include.am | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/user_settings.h | 168 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/M68K/Makefile | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_c.patch | 44 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_h.patch | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/benchmark/source/run_benchmark.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/wolfcrypt_test.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/LPC43xx/time-LCP43xx.c | 28 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-BARE-METAL.h | 70 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-FS.h | 69 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-RTX-TCP-FS.h | 71 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/main.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/shell.c | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/STM32F2xx_StdPeriph_Lib/time-STM32F2xx.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Conf/user_settings.h | 93 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Inc/wolfssl_MDK_ARM.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvoptx | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvprojx | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/RTE/wolfSSL/user_settings.h | 497 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/main.c | 93 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvoptx | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvprojx | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/RTE/wolfSSL/user_settings.h | 497 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/main.c | 68 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvoptx | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvprojx | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/RTE/wolfSSL/user_settings.h | 495 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/main.c | 68 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvoptx | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvprojx | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/RTE/wolfSSL/user_settings.h | 497 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/main.c | 108 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/RTE/wolfSSL/user_settings.h | 497 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvoptx | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvprojx | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/main.c | 112 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/RTE/wolfSSL/user_settings.h | 497 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvoptx | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvprojx | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/main.c | 73 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/main.c | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/shell.c | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/wolfsslFull.uvoptx | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/wolfsslFull.uvprojx | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/RTE/wolfSSL/user_settings.h | 497 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvoptx | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvprojx | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/README.md | 60 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Src/ssl-dummy.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/include.am | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md | 62 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h | 414 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile | 113 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml | 285 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml | 25 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile | 113 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml | 290 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml | 34 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/user_settings.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/wolfssl_new_azsphere/CMakeLists.txt | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/NETOS/user_settings.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/README.md | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/README.md | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/CMakeLists.txt | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/README.md | 214 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/README | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/main.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/lib/README | 46 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/platformio.ini | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/sdkconfig.defaults | 98 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/CMakeLists.txt | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/main.c | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/test/README | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/wolfssl_benchmark.code-workspace | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_platformio.code-workspace | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/CMakeLists.txt | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/README.md | 241 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/README | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/main.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/lib/README | 46 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/platformio.ini | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/sdkconfig.defaults | 98 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/CMakeLists.txt | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/main.c | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/test/README | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/wolfssl_test.code-workspace | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/include.am | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/QNX/README.md | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/arm_startup.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/README_en.txt | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/wolf_client.c | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/README.md | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/benchmark-template/src/app_entry.c | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/test/src/wolf_client.c | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/tools/rsa_pss_sign.sh | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README.md | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README_APRA6M_en.md | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/README.md | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/wolfssl_demo.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/key_data/key_data.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/key_data/key_data_sce.c | 104 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/src/test_main.c | 194 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/src/wolf_client.c | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/src/wolfssl_sce_unit_test.c | 353 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/wolfssl/.cproject | 244 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/wolfssl/.project | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/GR-ROSE/common/user_settings.h | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/GR-ROSE/common/wolfssl_dummy.c | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/GR-ROSE/test/src/wolf_client.c | 66 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/GR-ROSE/wolfssl/.project | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/GR-ROSE/wolfssl/wolfssl.rcpc | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/RSK/resource/section.esi | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/RSK/wolfssl/.project | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/RSK/wolfssl_demo/key_data.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/RSK/wolfssl_demo/user_settings.h | 25 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX65N/RSK/wolfssl_demo/wolfssl_demo.c | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/README_EN.md | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/README_JP.md | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/common/wolfssl_dummy.c | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/.cproject | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/.project | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/client/simple_tls_tsip_client.c | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/test_main.c | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/wolfssl_simple_demo.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/test.scfg | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/.project | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/wolfssl.rcpc | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl/.project | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/user_settings.h | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.c | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_tsip_unit_test.c | 340 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/README.md | 543 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/user_settings.h | 115 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/wolfssl_demo.h | 108 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/include.am | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.cproject | 1219 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.project | 440 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/script/fsp_ram_execution.ld | 243 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/rzn2l_tst_thread_entry.c | 438 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/serial_io/.gitignore | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_client.c | 184 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_server.c | 210 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolfssl_rsip_unit_test.c | 1325 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfCrypt/.gitignore | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfSSL/.gitignore | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfssl_dummy.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STARCORE/starcore_test.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STARCORE/user_settings.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/README.md | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/STM32_Benchmarks.md | 349 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/default_conf.ftl | 83 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/main.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/README.md | 92 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/include.am | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/test_wolf.c | 244 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/user_settings.h | 521 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/VisualDSP/user_settings.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WICED-STUDIO/user_settings.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/README.txt | 118 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/include.am | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/resource.h | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/test.vcxproj | 277 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/user_settings.h | 177 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.rc | 100 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.sln | 61 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.vcxproj | 391 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/README.txt | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/test.vcxproj | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/user_settings.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/wolfssl-fips.vcxproj | 34 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/README.txt | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/test.vcxproj | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/user_settings.h | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.rc | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.vcxproj | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WINCE/user_settings.h | 983 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WORKBENCH/README.md | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/Intel/user_settings.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/M1/user_settings.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/user_settings.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv5/user_settings.h | 302 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj | 363 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj | 484 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/README.md | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/graph.sh | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/.gitignore | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/README.md | 92 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/build-wolfssl-framework.sh | 110 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/include.am | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform.xcodeproj/project.pbxproj | 403 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AccentColor.colorset/Contents.json | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AppIcon.appiconset/Contents.json | 63 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/Contents.json | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/ContentView.swift | 47 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.c | 149 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.h | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatform.entitlements | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatformApp.swift | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.c | 62 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.h | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/include.am | 88 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/iotsafe/memory-tls.c | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/iotsafe/user_settings.h | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/INSTALL | 178 mariadb-10.11.9/extra/wolfssl/wolfssl/Makefile.am | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/README | 231 mariadb-10.11.9/extra/wolfssl/wolfssl/README.md | 276 mariadb-10.11.9/extra/wolfssl/wolfssl/SCRIPTS-LIST | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/async-check.sh | 127 mariadb-10.11.9/extra/wolfssl/wolfssl/autogen.sh | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/ca-cert.pem | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/client-cert.pem | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/server-cert.pem | 72 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/3072/client-cert.pem | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/4096/client-cert.pem | 139 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-cert.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc-cert.pem | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.pem | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-absolute-urn.pem | 60 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ca.pem | 88 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert-ext.pem | 60 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert.pem | 60 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-crl-dist.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc-cert.pem | 28 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc384-cert.pem | 28 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-relative-uri.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-uri-cert.pem | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int-ecc.pem | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int2-ecc.pem | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int2.pem | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEcc384Crl.pem | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEccCrl.pem | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/cliCrl.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/client-int-ecc.pem | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/client-int.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.pem | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.revoked | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl2.pem | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl_rsapss.pem | 53 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/eccCliCRL.pem | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/eccSrvCRL.pem | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/extra-crls/ca-int-cert-revoked.pem | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/extra-crls/general-server-crl.pem | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/gencrls.sh | 65 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/include.am | 46 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodaltCrl.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodaltwildCrl.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodcnCrl.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodcnwildCrl.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-int-ecc.pem | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-int.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-priv-2048.pem | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-pub-2048.pem | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dsa2048.pem | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-params.der | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-params.pem | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-privOnlyCert.pem | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-privkey.der | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.pem | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.pem | 62 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.pem | 62 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/genecc.sh | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.pem | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.pem | 74 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.pem | 74 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.pem | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.pem | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.der | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.pem | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/include.am | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.pem | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519-cert.pem | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.pem | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.pem | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/client-ed448.pem | 36 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/root-ed448.pem | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448-cert.pem | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/entity-no-ca-bool-cert.pem | 110 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/include.am | 216 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.pem | 108 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.pem | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.pem | 110 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.pem | 46 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt-ecc.pem | 82 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt.pem | 120 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.pem | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain.pem | 80 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.pem | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.pem | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/genintcerts.sh | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/include.am | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt-ecc.pem | 86 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt.pem | 120 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.pem | 46 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-short.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain.pem | 80 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.pem | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.pem | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate1-ca-cert.pem | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate2-ca-cert.pem | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate3-ca-cert.pem | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/ocsp-responder-cert.pem | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/renewcerts.sh | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/root-ca-cert.pem | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server1-cert.pem | 150 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server2-cert.pem | 150 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server3-cert.pem | 150 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server4-cert.pem | 150 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server5-cert.pem | 150 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/ca-p521.pem | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/client-p521.pem | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/root-p521.pem | 34 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521-cert.pem | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521.pem | 62 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/renewcerts.sh | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/include.am | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.pem | 68 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.pem | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.pem | 74 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss-cert.pem | 70 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.pem | 138 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-mix-rsapss-cert.pem | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss-cert.pem | 50 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.pem | 98 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-cert.pem | 112 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-comp.pem | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-rsa.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-self.pem | 59 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc.pem | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc384-cert.pem | 36 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-keyPub.pem | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-revoked-cert.pem | 112 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.pem | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.pem | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.pem | 51 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.pem | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.pem | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2.pem | 63 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-certs.sh | 124 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-keys.sh | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/include.am | 37 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.pem | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.pem | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2.pem | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-cert.pem | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-key.pem | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-priv.pem | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-cert.pem | 57 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.pem | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.pem | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2.pem | 108 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-ICA1-pathlen0.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-assembled.pem | 104 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-entity.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA1-pathlen0.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA2-pathlen1.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-assembled.pem | 154 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-entity.pem | 50 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-ICA1-pathlen1.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-assembled.pem | 104 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-entity.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-ICA1-pathlen127.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-assembled.pem | 104 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-entity.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-ICA1-pathlen128.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-assembled.pem | 104 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-entity.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA1-pathlen1.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA2-pathlen0.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-assembled.pem | 154 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-entity.pem | 50 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA1-pathlen0.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA2-pathlen1.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA3-pathlen99.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA4-pathlen5.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA5-pathlen20.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA6-pathlen10.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA7-pathlen100.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-assembled.pem | 394 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-entity.pem | 50 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA1-pathlen0.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA2-pathlen2.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA3-pathlen2.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA4-pathlen2.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-assembled.pem | 250 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-entity.pem | 50 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA1-no_pathlen.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA2-no_pathlen.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA3-pathlen2.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-assembled.pem | 200 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-entity.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA4-pathlen2.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-assembled.pem | 248 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-entity.pem | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.pem | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.pem | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.cfg | 150 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.pem | 63 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.cfg | 61 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.pem | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/digsigku.pem | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/include.am | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltname.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltnull.pem | 57 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcn.pem | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcnnull.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.pem | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.pem | 112 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-duplicate-policy.pem | 112 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-garbage.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodalt.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcn.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-localhost.pem | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/README.md | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/config.in | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/functions.cmake | 222 mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/include.am | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/modules/FindARIA.cmake | 108 mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/options.h.in | 378 mariadb-10.11.9/extra/wolfssl/wolfssl/configure.ac | 2553 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.sln | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.vcproj | 319 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/aes.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/des3.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/hmac.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/misc.c | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/random.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/rsa.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha256.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha512.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_first.c | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_last.c | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/callbacks.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/certs_test.h | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/crl.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/aes.h | 61 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/arc4.h | 36 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn.h | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn_public.h | 75 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-impl.h | 43 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-int.h | 44 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2.h | 45 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/camellia.h | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/chacha.h | 36 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/coding.h | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/compress.h | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/des3.h | 49 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dh.h | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dsa.h | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ecc.h | 69 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/error-crypt.h | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/fips_test.h | 59 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/hmac.h | 45 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/include.am | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/integer.h | 35 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/logging.h | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md2.h | 43 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md4.h | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md5.h | 45 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/memory.h | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/misc.h | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_class.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_superclass.h | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pkcs7.h | 53 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/poly1305.h | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/port/pic32/pic32mz-crypt.h | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pwdbased.h | 37 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/random.h | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ripemd.h | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/rsa.h | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings.h | 702 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings_comp.h | 69 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha.h | 37 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha256.h | 46 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha512.h | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/tfm.h | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/types.h | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/visibility.h | 73 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/wc_port.h | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/error-ssl.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/include.am | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/internal.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ocsp.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/asn1.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/bio.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/bn.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/conf.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/crypto.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/des.h | 28 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/dh.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/dsa.h | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec25519.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec448.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ecdh.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ecdsa.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ed25519.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ed448.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/engine.h | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/err.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/evp.h | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/hmac.h | 28 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/include.am | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/lhash.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/md4.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/md5.h | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ocsp.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/opensslconf.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/opensslv.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ossl_typ.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/pem.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/pkcs12.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/rand.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ripemd.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/rsa.h | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/sha.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ssl.h | 34 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ssl23.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/stack.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ui.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/x509.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/x509v3.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/options.h.in | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer_error.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer_error.rc | 93 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ssl.h | 722 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/test.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/version.h | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/version.h.in | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/debian/changelog.in | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/debian/control.in | 44 mariadb-10.11.9/extra/wolfssl/wolfssl/debian/copyright | 217 mariadb-10.11.9/extra/wolfssl/wolfssl/debian/include.am | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/QUIC.md | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/check_api.sh | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/aes.h | 330 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/asn_public.h | 1932 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/chacha20_poly1305.h | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/cmac.h | 151 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve25519.h | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve448.h | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_groups.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_pages.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ecc.h | 102 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ed25519.h | 407 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/hmac.h | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/pwdbased.h | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/rsa.h | 143 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/srp.h | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ssl.h | 4156 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/aes.h | 691 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/asn_public.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/cmac.h | 64 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_groups.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_pages.h | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ecc.h | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ed25519.h | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/hmac.h | 439 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/iotsafe.h | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/kdf.h | 261 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/memory.h | 192 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/rsa.h | 53 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/sha3.h | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ssl.h | 623 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/README.md | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/asn1/asn1.c | 71 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/README.md | 34 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_client.c | 277 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_server.c | 363 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_tls.c | 158 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_tls.h | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/include.am | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/benchmark/tls_bench.c | 287 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.c | 421 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.vcproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.vcxproj | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/README.md | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/include.am | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_EBSnet.h | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_all.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_arduino.h | 486 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_platformio.h | 791 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_stm32.h | 133 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_template.h | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_tls12.h | 158 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfboot_keytools.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfssh.h | 214 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolftpm.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.c | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcxproj | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.c | 162 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcxproj | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/include.am | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/pem/include.am | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/pem/pem.c | 1048 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/sctp/sctp-client-dtls.c | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/sctp/sctp-server-dtls.c | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.c | 276 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.vcproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.vcxproj | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/fips-check.sh | 725 mariadb-10.11.9/extra/wolfssl/wolfssl/gencertbuf.pl | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/lib/dummy | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/Kbuild | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/Makefile | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/include.am | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/linuxkm_memory.c | 216 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/linuxkm_wc_port.h | 458 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/lkcapi_glue.c | 3153 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/module_exports.c.template | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/module_hooks.c | 224 mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/x86_vector_register_glue.c | 574 mariadb-10.11.9/extra/wolfssl/wolfssl/mcapi/crypto.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/mcapi/mcapi_test.c | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.h | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/pre-commit.sh | 45 mariadb-10.11.9/extra/wolfssl/wolfssl/pre-push.sh | 19 mariadb-10.11.9/extra/wolfssl/wolfssl/rpm/include.am | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/rpm/spec.in | 262 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/aria-cmake-build-test.sh | 200 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/benchmark_compare.sh | 164 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/crl-revoked.test | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtls.test | 169 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtls13.test | 171 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtlscid.test | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/external.test | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/include.am | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/makedistsmall.sh | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/ocsp-stapling.test | 44 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/ocsp-stapling2.test | 52 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/openssl.test | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/pem.test | 459 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-gen.sh | 178 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-testsuite.test | 72 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.out | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.sslkeylog | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.out | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.sslkeylog | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/src/bio.c | 254 mariadb-10.11.9/extra/wolfssl/wolfssl/src/conf.c | 35 mariadb-10.11.9/extra/wolfssl/wolfssl/src/crl.c | 806 mariadb-10.11.9/extra/wolfssl/wolfssl/src/dtls.c | 159 mariadb-10.11.9/extra/wolfssl/wolfssl/src/dtls13.c | 174 mariadb-10.11.9/extra/wolfssl/wolfssl/src/include.am | 634 mariadb-10.11.9/extra/wolfssl/wolfssl/src/internal.c | 7625 - mariadb-10.11.9/extra/wolfssl/wolfssl/src/keys.c | 569 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ocsp.c | 347 mariadb-10.11.9/extra/wolfssl/wolfssl/src/pk.c | 3144 mariadb-10.11.9/extra/wolfssl/wolfssl/src/quic.c | 150 mariadb-10.11.9/extra/wolfssl/wolfssl/src/sniffer.c | 614 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl.c |20449 --- mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_asn1.c | 69 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_bn.c | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_certman.c | 2425 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_crypto.c | 3499 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_load.c | 5831 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_misc.c | 222 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_p7p12.c | 2123 mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_sess.c | 4567 mariadb-10.11.9/extra/wolfssl/wolfssl/src/tls.c | 2302 mariadb-10.11.9/extra/wolfssl/wolfssl/src/tls13.c | 2798 mariadb-10.11.9/extra/wolfssl/wolfssl/src/wolfio.c | 252 mariadb-10.11.9/extra/wolfssl/wolfssl/src/x509.c | 862 mariadb-10.11.9/extra/wolfssl/wolfssl/src/x509_str.c | 372 mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/README.md | 88 mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcxproj | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSnifferTest/snifftest.c | 151 mariadb-10.11.9/extra/wolfssl/wolfssl/support/gen-debug-trace-error-codes.sh | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/support/include.am | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/support/wolfssl.pc.in | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/api.c |65127 ++++++---- mariadb-10.11.9/extra/wolfssl/wolfssl/tests/include.am | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/quic.c | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/srp.c | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/suites.c | 74 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls.conf | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-downgrade.conf | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-pq-2-frag.conf | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-pq-frag.conf | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-sm2.conf | 189 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-tls13-down.conf | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test.conf | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/unit.c | 81 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/unit.h | 117 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/utils.h | 443 mariadb-10.11.9/extra/wolfssl/wolfssl/tests/w64wrapper.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.c | 311 mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.vcproj | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.vcxproj | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.c | 8272 + mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.h | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.vcxproj | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes.c | 5791 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.S | 167 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.asm | 68 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.S | 1194 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.asm | 2214 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_x86_asm.S | 300 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.S | 2782 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.asm | 2832 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/asm.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/asn.c | 5327 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/camellia.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha.c | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha20_poly1305.c | 60 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.S | 130 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.asm | 1426 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cmac.c | 226 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/coding.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/compress.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cpuid.c | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cryptocb.c | 538 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/curve25519.c | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/des3.c | 94 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dh.c | 69 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dilithium.c | 8288 + mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dsa.c | 50 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ecc.c | 1430 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/eccsi.c | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ed25519.c | 254 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ed448.c | 194 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/error.c | 47 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/evp.c | 2803 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_kyber.c | 84 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_lms.c | 1051 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_xmss.c | 1045 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/falcon.c | 201 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_448.c | 257 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_operations.c | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.h | 630 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.i | 630 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_asm.S |17348 +- mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_448.c | 1149 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_low_mem.c | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_operations.c | 263 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hash.c | 429 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hmac.c | 252 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hpke.c | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/include.am | 25 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/integer.c | 108 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/kdf.c | 772 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/logging.c | 250 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/md2.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/md5.c | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/memory.c | 724 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/misc.c | 136 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs12.c | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs7.c | 3056 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305.c | 28 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.S | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.asm | 1060 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/README.md | 92 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_aes.c | 442 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_mp.c | 3249 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_sha.c | 1794 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_util.c | 744 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.c | 280 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.c | 442 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.c | 468 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_common.c | 376 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_aes.c | 816 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_rsa.c | 348 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c | 686 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_util.c | 1252 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_aes.c | 589 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_rsa.c | 437 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_sha.c | 267 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_util.c | 1160 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c | 99 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c | 302 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_util.c | 865 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/afalg_aes.c | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/wc_afalg.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-crypt.c | 303 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-cryptocb.c | 603 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm.S | 4634 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c | 4794 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519.S |13839 -- mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519_c.c |14321 +- mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S | 319 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c | 527 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm.S | 2400 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c | 2356 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S | 1808 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c | 2159 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-aes.c |13706 +- mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-chacha.c | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519.S |12015 + mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519_c.c |11834 + mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha256.c | 296 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm.S | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm.S | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512.c | 37 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm.S | 3369 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm_c.c | 3052 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519.S | 6485 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519_c.c | 6900 + mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm.S | 1490 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c | 1468 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm.S | 1176 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c | 1162 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm.S | 3677 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c | 3583 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/atmel/atmel.c | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/README.md | 45 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/cryif.c | 103 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/crypto.c | 495 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/csm.c | 298 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/include.am | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/test.c | 430 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_driver.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_qnx.c | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_ecdsa.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_fsl_nxp.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hash.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hmac.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_init.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_seco.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cavium/cavium_octeon_sync.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/README.md | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/aes-cuda.cu | 1096 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/devcrypto/devcrypto_rsa.c | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/intel/quickassist_sync.c | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/iotsafe/iotsafe.c | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_aes.c | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_dh.c | 65 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hash.c | 97 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hmac.c | 25 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_rsa.c | 158 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/liboqs/liboqs.c | 132 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/maxim/maxq10xx.c | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/README_SE050.md | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/dcp_port.c | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/ksdk_port.c | 32 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/se050_port.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/pic32/pic32mz-crypt.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/psa/psa_pkcbs.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/riscv/riscv-64-aes.c | 9413 + mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/README.md | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_ecc.c | 325 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_hash.c | 138 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stm32.c | 582 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stsafe.c | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-aes.c | 1054 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-hash.c | 43 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-aesgcm.c | 77 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-sha3.c | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-glue.c | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-trng.c | 15 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pwdbased.c | 80 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/random.c | 673 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/rsa.c | 584 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sakke.c | 61 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha.c | 327 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha256.c | 926 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha256_asm.S | 1244 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha3.c | 153 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha3_asm.S | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha512.c | 695 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha512_asm.S | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/signature.c | 19 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/siphash.c | 20 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm2.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm3.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm3_asm.S | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm4.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm32.c |35191 ++--- mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm64.c | 5453 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_armthumb.c | 3426 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c32.c | 1417 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c64.c | 1467 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_cortexm.c |62107 ++++++--- mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_dsp32.c | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_int.c | 747 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm32.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm64.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_armthumb.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c32.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c64.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_cortexm.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64.c | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64_asm.S | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64.c | 2327 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.S | 806 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.asm | 6719 - mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sphincs.c | 54 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/srp.c | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/tfm.c | 410 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_dsp.c | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_encrypt.c | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber.c | 1311 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_asm.S |27812 ++++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_poly.c | 3711 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms.c | 1145 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms_impl.c | 3092 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_pkcs11.c | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_port.c | 767 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss.c | 1672 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss_impl.c | 4339 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wolfevent.c | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wolfmath.c | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/test/test.c |13461 +- mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/test/test.h | 31 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/Makefile.am | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/README.txt | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/autogen.sh | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/configure.ac | 44 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include.am | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include/user_rsa.h | 137 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/src/rsa.c | 2797 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl.vcproj | 44 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl.vcxproj | 66 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/certs_test.h | 5105 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/crl.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/error-ssl.h | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/include.am | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/internal.h | 860 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/ocsp.h | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/aes.h | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/bio.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/bn.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/crypto.h | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/ec.h | 53 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/engine.h | 3 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/evp.h | 189 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/hmac.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/objects.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/opensslv.h | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/rsa.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/sha.h | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/sha3.h | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/ssl.h | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/tls1.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/x509.h | 40 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/x509v3.h | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/options.h.in | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/quic.h | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer.h | 29 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer_error.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer_error.rc | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/ssl.h | 652 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/test.h | 1211 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/version.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/aes.h | 317 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn.h | 297 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn_public.h | 84 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/chacha.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cmac.h | 28 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cpuid.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cryptocb.h | 133 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/curve25519.h | 9 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/des3.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dh.h | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dilithium.h | 715 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ecc.h | 97 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed25519.h | 25 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed448.h | 16 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/error-crypt.h | 61 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_kyber.h | 10 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_lms.h | 65 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_xmss.h | 56 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/falcon.h | 42 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_448.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_operations.h | 26 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fips_test.h | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_448.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_operations.h | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hash.h | 49 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hmac.h | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/include.am | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/integer.h | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kdf.h | 66 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kyber.h | 14 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/lms.h | 169 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/logging.h | 59 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/mem_track.h | 188 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/memory.h | 302 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/misc.h | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs12.h | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs7.h | 22 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/poly1305.h | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp-sdk-lib.h | 229 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h | 919 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h | 345 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-types.h | 325 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h | 278 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h | 137 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h | 19 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-crypt.h | 80 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-cryptocb.h | 69 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/CryIf.h | 49 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Crypto.h | 55 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Csm.h | 295 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/StandardTypes.h | 66 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_driver.h | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_qnx.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam.h | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_fsl_nxp.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/liboqs/liboqs.h | 62 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/nxp/ksdk_port.h | 80 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/psa/psa.h | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/riscv/riscv-64-asm.h | 133 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h | 15 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_hash.h | 74 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/st/stm32.h | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/ti/ti-ccm.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pwdbased.h | 4 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/random.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/rsa.h | 65 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/settings.h | 792 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha.h | 98 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha256.h | 70 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha3.h | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha512.h | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm2.h | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm3.h | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm4.h | 27 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp.h | 70 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp_int.h | 50 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sphincs.h | 41 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/tfm.h | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/types.h | 718 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/visibility.h | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_kyber.h | 282 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_lms.h | 470 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_port.h | 226 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_xmss.h | 285 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/xmss.h | 203 mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfio.h | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/.gitignore | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/README.md | 117 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/ada_binding.c | 105 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/client.gpr | 78 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/default.gpr | 86 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/gnat.adc | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/include.am | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.adb | 174 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.ads | 142 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.adb | 18 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.ads | 43 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.adb | 376 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.ads | 38 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client_main.adb | 33 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.adb | 393 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.ads | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server_main.adb | 39 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/user_settings.h | 381 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.adb | 768 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.ads | 631 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/README.md | 58 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs | 53 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Client/wolfSSL-TLS-PSK-Client.cs | 12 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs | 132 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs | 17 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs | 146 mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/include.am | 1 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/CMakeLists.txt | 113 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/Kconfig | 23 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/Kconfig.tls-generic | 5 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/README.md | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/include.am | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/nrf5340dk_nrf5340_user_settings.h | 133 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp.conf | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp_ns.conf | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/prj.conf | 8 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/sample.yaml | 13 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp.conf | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp_ns.conf | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj-no-malloc.conf | 30 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj.conf | 6 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/sample.yaml | 21 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj-no-malloc.conf | 57 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj.conf | 11 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/sample.yaml | 24 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/src/tls_sock.c | 83 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp.conf | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp_ns.conf | 2 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/prj.conf | 7 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/sample.yaml | 19 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/src/tls_threaded.c | 48 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings-no-malloc.h | 170 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings-tls-generic.h | 161 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings.h | 436 mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/wolfssl/options.h | 1 mariadb-10.11.9/include/byte_order_generic_x86_64.h | 2 mariadb-10.11.9/include/m_ctype.h | 3 mariadb-10.11.9/include/m_string.h | 63 mariadb-10.11.9/include/my_alloc.h | 6 mariadb-10.11.9/include/my_attribute.h | 14 mariadb-10.11.9/include/my_base.h | 7 mariadb-10.11.9/include/my_bitmap.h | 67 mariadb-10.11.9/include/my_global.h | 2 mariadb-10.11.9/include/my_pthread.h | 28 mariadb-10.11.9/include/my_rdtsc.h | 24 mariadb-10.11.9/include/my_sys.h | 4 mariadb-10.11.9/include/myisamchk.h | 1 mariadb-10.11.9/include/mysql.h | 4 mariadb-10.11.9/include/mysql/plugin.h | 16 mariadb-10.11.9/include/mysql/plugin_audit.h.pp | 3 mariadb-10.11.9/include/mysql/plugin_auth.h.pp | 3 mariadb-10.11.9/include/mysql/plugin_data_type.h.pp | 3 mariadb-10.11.9/include/mysql/plugin_encryption.h.pp | 3 mariadb-10.11.9/include/mysql/plugin_ftparser.h.pp | 3 mariadb-10.11.9/include/mysql/plugin_function.h.pp | 3 mariadb-10.11.9/include/mysql/plugin_password_validation.h.pp | 3 mariadb-10.11.9/include/mysql/service_print_check_msg.h | 44 mariadb-10.11.9/include/mysql/service_sql.h | 6 mariadb-10.11.9/include/mysql/service_wsrep.h | 3 mariadb-10.11.9/include/mysql_com.h | 3 mariadb-10.11.9/include/service_versions.h | 1 mariadb-10.11.9/include/source_revision.h | 1 mariadb-10.11.9/include/sslopt-longopts.h | 10 mariadb-10.11.9/include/violite.h | 8 mariadb-10.11.9/libmariadb/.gitattributes | 9 mariadb-10.11.9/libmariadb/.gitignore | 116 mariadb-10.11.9/libmariadb/.travis.yml | 103 mariadb-10.11.9/libmariadb/CMakeLists.txt | 8 mariadb-10.11.9/libmariadb/cmake/FindZStd.cmake | 2 mariadb-10.11.9/libmariadb/include/CMakeLists.txt | 1 mariadb-10.11.9/libmariadb/include/errmsg.h | 3 mariadb-10.11.9/libmariadb/include/ma_hash.h | 22 mariadb-10.11.9/libmariadb/include/mariadb_com.h | 8 mariadb-10.11.9/libmariadb/include/mysql/client_plugin.h | 2 mariadb-10.11.9/libmariadb/include/mysql/plugin_auth_common.h | 110 mariadb-10.11.9/libmariadb/libmariadb/ma_default.c | 1 mariadb-10.11.9/libmariadb/libmariadb/ma_errmsg.c | 3 mariadb-10.11.9/libmariadb/libmariadb/mariadb_async.c | 2 mariadb-10.11.9/libmariadb/libmariadb/mariadb_lib.c | 82 mariadb-10.11.9/libmariadb/libmariadb/secure/openssl.c | 2 mariadb-10.11.9/libmariadb/plugins/io/remote_io.c | 4 mariadb-10.11.9/libmariadb/plugins/pvio/pvio_npipe.c | 27 mariadb-10.11.9/libmariadb/plugins/pvio/pvio_socket.c | 2 mariadb-10.11.9/libmariadb/plugins/trace/trace_example.c | 2 mariadb-10.11.9/libmariadb/unittest/libmariadb/bulk1.c | 4 mariadb-10.11.9/libmariadb/unittest/libmariadb/charset.c | 12 mariadb-10.11.9/libmariadb/unittest/libmariadb/connection.c | 32 mariadb-10.11.9/libmariadb/unittest/libmariadb/ps_bugs.c | 4 mariadb-10.11.9/libmysqld/CMakeLists.txt | 6 mariadb-10.11.9/libmysqld/embedded_priv.h | 2 mariadb-10.11.9/libmysqld/examples/CMakeLists.txt | 2 mariadb-10.11.9/libmysqld/lib_sql.cc | 34 mariadb-10.11.9/libmysqld/libmysql.c | 6 mariadb-10.11.9/libmysqld/libmysqld.c | 4 mariadb-10.11.9/libservices/CMakeLists.txt | 1 mariadb-10.11.9/libservices/print_check_msg_service.c | 18 mariadb-10.11.9/man/CMakeLists.txt | 3 mariadb-10.11.9/man/my_print_defaults.1 | 18 mariadb-10.11.9/man/myisamchk.1 | 4 mariadb-10.11.9/man/mysql_upgrade.1 | 4 mariadb-10.11.9/man/mysqladmin.1 | 2 mariadb-10.11.9/man/mysqlbinlog.1 | 24 mariadb-10.11.9/man/mysqlcheck.1 | 2 mariadb-10.11.9/man/mysqld_safe.1 | 2 mariadb-10.11.9/man/mysqldump.1 | 18 mariadb-10.11.9/man/wsrep_sst_backup.1 | 16 mariadb-10.11.9/mysql-test/README | 4 mariadb-10.11.9/mysql-test/collections/buildbot_suites.bat | 2 mariadb-10.11.9/mysql-test/dgcov.pl | 3 mariadb-10.11.9/mysql-test/include/analyze-format.inc | 2 mariadb-10.11.9/mysql-test/include/aria_log_control_load.inc | 11 mariadb-10.11.9/mysql-test/include/check-testcase.test | 12 mariadb-10.11.9/mysql-test/include/commit.inc | 20 mariadb-10.11.9/mysql-test/include/crash_mysqld.inc | 2 mariadb-10.11.9/mysql-test/include/ctype_myanmar.inc | 8 mariadb-10.11.9/mysql-test/include/ctype_numconv.inc | 46 mariadb-10.11.9/mysql-test/include/ctype_pad.inc | 15 mariadb-10.11.9/mysql-test/include/ctype_str_to_date.inc | 5 mariadb-10.11.9/mysql-test/include/ctype_utf8mb4.inc | 42 mariadb-10.11.9/mysql-test/include/deadlock.inc | 1 mariadb-10.11.9/mysql-test/include/default_mysqld.cnf | 4 mariadb-10.11.9/mysql-test/include/delete_anonymous_users.inc | 2 mariadb-10.11.9/mysql-test/include/empty_string_literal.inc | 21 mariadb-10.11.9/mysql-test/include/expect_crash.inc | 2 mariadb-10.11.9/mysql-test/include/explain_non_select.inc | 13 mariadb-10.11.9/mysql-test/include/galera_sst_method.combinations | 5 mariadb-10.11.9/mysql-test/include/galera_sst_method.inc | 4 mariadb-10.11.9/mysql-test/include/gis_debug.inc | 22 mariadb-10.11.9/mysql-test/include/gis_generic.inc | 2 mariadb-10.11.9/mysql-test/include/have_innodb.combinations | 39 mariadb-10.11.9/mysql-test/include/have_innodb.inc | 5 mariadb-10.11.9/mysql-test/include/have_innodb.opt | 17 mariadb-10.11.9/mysql-test/include/have_normal_bzip.inc | 9 mariadb-10.11.9/mysql-test/include/have_normal_zlib.inc | 9 mariadb-10.11.9/mysql-test/include/index_merge1.inc | 17 mariadb-10.11.9/mysql-test/include/innodb_rollback_on_timeout.inc | 2 mariadb-10.11.9/mysql-test/include/innodb_stable_estimates.inc | 12 mariadb-10.11.9/mysql-test/include/innodb_stable_estimates.opt | 1 mariadb-10.11.9/mysql-test/include/kill_and_restart_mysqld.inc | 2 mariadb-10.11.9/mysql-test/include/kill_galera.inc | 2 mariadb-10.11.9/mysql-test/include/kill_mysqld.inc | 2 mariadb-10.11.9/mysql-test/include/log_bin.combinations | 4 mariadb-10.11.9/mysql-test/include/log_bin.inc | 3 mariadb-10.11.9/mysql-test/include/log_slow_grep.inc | 9 mariadb-10.11.9/mysql-test/include/not_valgrind_build.inc | 4 mariadb-10.11.9/mysql-test/include/read_head.inc | 30 mariadb-10.11.9/mysql-test/include/rowid_filter_debug_kill.inc | 28 mariadb-10.11.9/mysql-test/include/rpl_change_topology.inc | 7 mariadb-10.11.9/mysql-test/include/rpl_clone_slave_using_mariadb-backup.inc | 297 mariadb-10.11.9/mysql-test/include/rpl_start_server.inc | 2 mariadb-10.11.9/mysql-test/include/rpl_stop_server.inc | 2 mariadb-10.11.9/mysql-test/include/search_pattern_in_file.inc | 34 mariadb-10.11.9/mysql-test/include/shutdown_mysqld.inc | 9 mariadb-10.11.9/mysql-test/include/slow_environ.inc | 9 mariadb-10.11.9/mysql-test/include/start_mysqld.inc | 4 mariadb-10.11.9/mysql-test/include/stop_slave_io.inc | 11 mariadb-10.11.9/mysql-test/include/sync_slave_sql_with_io.inc | 7 mariadb-10.11.9/mysql-test/include/sync_with_master_gtid.inc | 7 mariadb-10.11.9/mysql-test/include/wait_for_pattern_in_file.inc | 55 mariadb-10.11.9/mysql-test/include/wait_for_slave_io_error.inc | 2 mariadb-10.11.9/mysql-test/include/wait_for_slave_io_to_stop.inc | 21 mariadb-10.11.9/mysql-test/include/wait_for_slave_param.inc | 16 mariadb-10.11.9/mysql-test/include/wait_for_slave_sql_to_stop.inc | 13 mariadb-10.11.9/mysql-test/include/wait_until_connected_again.inc | 2 mariadb-10.11.9/mysql-test/lib/My/Debugger.pm | 1 mariadb-10.11.9/mysql-test/lib/My/Platform.pm | 19 mariadb-10.11.9/mysql-test/lib/mtr_cases.pm | 9 mariadb-10.11.9/mysql-test/lib/mtr_report.pm | 4 mariadb-10.11.9/mysql-test/main/alter_table.result | 11 mariadb-10.11.9/mysql-test/main/alter_table.test | 10 mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.opt | 1 mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.result | 32 mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.test | 74 mariadb-10.11.9/mysql-test/main/analyze_format_json.result | 42 mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.opt | 1 mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.result | 60 mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.test | 77 mariadb-10.11.9/mysql-test/main/backup_interaction.result | 5 mariadb-10.11.9/mysql-test/main/backup_interaction.test | 5 mariadb-10.11.9/mysql-test/main/backup_lock.result | 8 mariadb-10.11.9/mysql-test/main/backup_lock.test | 9 mariadb-10.11.9/mysql-test/main/backup_locks.result | 79 mariadb-10.11.9/mysql-test/main/backup_locks.test | 73 mariadb-10.11.9/mysql-test/main/backup_stages.result | 1 mariadb-10.11.9/mysql-test/main/backup_stages.test | 1 mariadb-10.11.9/mysql-test/main/bad_startup_options_debug.result | 7 mariadb-10.11.9/mysql-test/main/bad_startup_options_debug.test | 34 mariadb-10.11.9/mysql-test/main/bootstrap.test | 2 mariadb-10.11.9/mysql-test/main/cast.result | 2 mariadb-10.11.9/mysql-test/main/cast.test | 28 mariadb-10.11.9/mysql-test/main/change_user.result | 4 mariadb-10.11.9/mysql-test/main/column_compression.result | 288 mariadb-10.11.9/mysql-test/main/column_compression.test | 2 mariadb-10.11.9/mysql-test/main/column_compression_parts.result | 15 mariadb-10.11.9/mysql-test/main/column_compression_rpl.test | 2 mariadb-10.11.9/mysql-test/main/commit_1innodb.result | 13 mariadb-10.11.9/mysql-test/main/connect-no-db.result | 9 mariadb-10.11.9/mysql-test/main/connect-no-db.test | 10 mariadb-10.11.9/mysql-test/main/connect.result | 4 mariadb-10.11.9/mysql-test/main/constraints.result | 13 mariadb-10.11.9/mysql-test/main/constraints.test | 15 mariadb-10.11.9/mysql-test/main/crash_commit_before.test | 2 mariadb-10.11.9/mysql-test/main/create.result | 9 mariadb-10.11.9/mysql-test/main/create.test | 9 mariadb-10.11.9/mysql-test/main/create_or_replace.result | 176 mariadb-10.11.9/mysql-test/main/create_or_replace.test | 44 mariadb-10.11.9/mysql-test/main/cset_narrowing.test | 9 mariadb-10.11.9/mysql-test/main/cte_nonrecursive.result | 338 mariadb-10.11.9/mysql-test/main/cte_nonrecursive.test | 229 mariadb-10.11.9/mysql-test/main/ctype_big5.result | 80 mariadb-10.11.9/mysql-test/main/ctype_binary.result | 68 mariadb-10.11.9/mysql-test/main/ctype_binary.test | 14 mariadb-10.11.9/mysql-test/main/ctype_collate.result | 30 mariadb-10.11.9/mysql-test/main/ctype_collate.test | 15 mariadb-10.11.9/mysql-test/main/ctype_collate_context.result | 100 mariadb-10.11.9/mysql-test/main/ctype_collate_context.test | 100 mariadb-10.11.9/mysql-test/main/ctype_cp1251.result | 68 mariadb-10.11.9/mysql-test/main/ctype_cp932.result | 90 mariadb-10.11.9/mysql-test/main/ctype_cp932.test | 3 mariadb-10.11.9/mysql-test/main/ctype_eucjpms.result | 80 mariadb-10.11.9/mysql-test/main/ctype_euckr.result | 80 mariadb-10.11.9/mysql-test/main/ctype_gb2312.result | 80 mariadb-10.11.9/mysql-test/main/ctype_gbk.result | 80 mariadb-10.11.9/mysql-test/main/ctype_gbk.test | 3 mariadb-10.11.9/mysql-test/main/ctype_latin1.result | 152 mariadb-10.11.9/mysql-test/main/ctype_latin1.test | 7 mariadb-10.11.9/mysql-test/main/ctype_ldml.result | 88 mariadb-10.11.9/mysql-test/main/ctype_ldml.test | 57 mariadb-10.11.9/mysql-test/main/ctype_nopad_8bit.result | 1840 mariadb-10.11.9/mysql-test/main/ctype_sjis.result | 94 mariadb-10.11.9/mysql-test/main/ctype_swe7.result | 80 mariadb-10.11.9/mysql-test/main/ctype_tis620.result | 80 mariadb-10.11.9/mysql-test/main/ctype_uca.result | 44 mariadb-10.11.9/mysql-test/main/ctype_uca.test | 29 mariadb-10.11.9/mysql-test/main/ctype_ucs.result | 172 mariadb-10.11.9/mysql-test/main/ctype_ucs.test | 25 mariadb-10.11.9/mysql-test/main/ctype_ucs2_uca.result | 80 mariadb-10.11.9/mysql-test/main/ctype_ujis.result | 96 mariadb-10.11.9/mysql-test/main/ctype_ujis.test | 17 mariadb-10.11.9/mysql-test/main/ctype_utf16.result | 80 mariadb-10.11.9/mysql-test/main/ctype_utf16_uca.result | 84 mariadb-10.11.9/mysql-test/main/ctype_utf16le.result | 80 mariadb-10.11.9/mysql-test/main/ctype_utf32.result | 209 mariadb-10.11.9/mysql-test/main/ctype_utf32.test | 112 mariadb-10.11.9/mysql-test/main/ctype_utf32_uca.result | 84 mariadb-10.11.9/mysql-test/main/ctype_utf8.result | 188 mariadb-10.11.9/mysql-test/main/ctype_utf8.test | 32 mariadb-10.11.9/mysql-test/main/ctype_utf8_uca.result | 80 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4.result | 162 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4.test | 71 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_heap.result | 60 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_innodb.result | 60 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_innodb.test | 3 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_myisam.result | 60 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_uca.result | 84 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_unicode_ci_def.result | 45 mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_unicode_ci_def.test | 42 mariadb-10.11.9/mysql-test/main/date_formats.result | 17 mariadb-10.11.9/mysql-test/main/date_formats.test | 11 mariadb-10.11.9/mysql-test/main/ddl_i18n_koi8r.result | 6 mariadb-10.11.9/mysql-test/main/ddl_i18n_utf8.result | 6 mariadb-10.11.9/mysql-test/main/deadlock_innodb.result | 5 mariadb-10.11.9/mysql-test/main/derived_cond_pushdown.result | 821 mariadb-10.11.9/mysql-test/main/derived_cond_pushdown.test | 87 mariadb-10.11.9/mysql-test/main/derived_cond_pushdown_innodb.result | 39 mariadb-10.11.9/mysql-test/main/derived_cond_pushdown_innodb.test | 31 mariadb-10.11.9/mysql-test/main/derived_split_innodb.result | 72 mariadb-10.11.9/mysql-test/main/derived_split_innodb.test | 60 mariadb-10.11.9/mysql-test/main/derived_view.result | 111 mariadb-10.11.9/mysql-test/main/derived_view.test | 108 mariadb-10.11.9/mysql-test/main/desc_index_range.result | 28 mariadb-10.11.9/mysql-test/main/desc_index_range.test | 38 mariadb-10.11.9/mysql-test/main/disabled.def | 1 mariadb-10.11.9/mysql-test/main/distinct_notembedded.result | 322 mariadb-10.11.9/mysql-test/main/distinct_notembedded.test | 113 mariadb-10.11.9/mysql-test/main/drop.result | 5 mariadb-10.11.9/mysql-test/main/drop.test | 6 mariadb-10.11.9/mysql-test/main/dyncol.result | 33 mariadb-10.11.9/mysql-test/main/dyncol.test | 41 mariadb-10.11.9/mysql-test/main/empty_server_name-8224.test | 4 mariadb-10.11.9/mysql-test/main/empty_string_literal.result | 26 mariadb-10.11.9/mysql-test/main/empty_string_literal.test | 15 mariadb-10.11.9/mysql-test/main/enforce_storage_engine.result | 7 mariadb-10.11.9/mysql-test/main/enforce_storage_engine.test | 15 mariadb-10.11.9/mysql-test/main/execution_constants.test | 1 mariadb-10.11.9/mysql-test/main/explain.result | 40 mariadb-10.11.9/mysql-test/main/explain.test | 23 mariadb-10.11.9/mysql-test/main/explain_json.result | 50 mariadb-10.11.9/mysql-test/main/fulltext_left_join.result | 8 mariadb-10.11.9/mysql-test/main/fulltext_left_join.test | 7 mariadb-10.11.9/mysql-test/main/fulltext_order_by.result | 4 mariadb-10.11.9/mysql-test/main/func_analyse.result | 25 mariadb-10.11.9/mysql-test/main/func_analyse.test | 25 mariadb-10.11.9/mysql-test/main/func_compress.test | 2 mariadb-10.11.9/mysql-test/main/func_date_add.result | 31 mariadb-10.11.9/mysql-test/main/func_date_add.test | 17 mariadb-10.11.9/mysql-test/main/func_encrypt_nossl.result | 42 mariadb-10.11.9/mysql-test/main/func_extract.result | 882 mariadb-10.11.9/mysql-test/main/func_extract.test | 251 mariadb-10.11.9/mysql-test/main/func_gconcat.result | 99 mariadb-10.11.9/mysql-test/main/func_gconcat.test | 61 mariadb-10.11.9/mysql-test/main/func_group_innodb.result | 4 mariadb-10.11.9/mysql-test/main/func_group_innodb.test | 5 mariadb-10.11.9/mysql-test/main/func_hybrid_type.result | 25 mariadb-10.11.9/mysql-test/main/func_hybrid_type.test | 23 mariadb-10.11.9/mysql-test/main/func_in.result | 90 mariadb-10.11.9/mysql-test/main/func_in.test | 67 mariadb-10.11.9/mysql-test/main/func_json.result | 84 mariadb-10.11.9/mysql-test/main/func_json.test | 91 mariadb-10.11.9/mysql-test/main/func_json_notembedded.result | 3 mariadb-10.11.9/mysql-test/main/func_json_notembedded.test | 4 mariadb-10.11.9/mysql-test/main/func_math.result | 15 mariadb-10.11.9/mysql-test/main/func_math.test | 10 mariadb-10.11.9/mysql-test/main/func_misc.result | 13 mariadb-10.11.9/mysql-test/main/func_misc.test | 15 mariadb-10.11.9/mysql-test/main/func_regexp.result | 52 mariadb-10.11.9/mysql-test/main/func_regexp.test | 47 mariadb-10.11.9/mysql-test/main/func_regexp_pcre.result | 43 mariadb-10.11.9/mysql-test/main/func_regexp_pcre.test | 41 mariadb-10.11.9/mysql-test/main/func_replace.result | 124 mariadb-10.11.9/mysql-test/main/func_replace.test | 86 mariadb-10.11.9/mysql-test/main/func_sformat.result | 38 mariadb-10.11.9/mysql-test/main/func_sformat.test | 56 mariadb-10.11.9/mysql-test/main/func_str.result | 193 mariadb-10.11.9/mysql-test/main/func_str.test | 153 mariadb-10.11.9/mysql-test/main/func_time.result | 74 mariadb-10.11.9/mysql-test/main/func_time.test | 39 mariadb-10.11.9/mysql-test/main/func_time_hires.result | 16 mariadb-10.11.9/mysql-test/main/func_time_hires.test | 11 mariadb-10.11.9/mysql-test/main/function_defaults.result | 25 mariadb-10.11.9/mysql-test/main/function_defaults.test | 23 mariadb-10.11.9/mysql-test/main/gis-debug.result | 42 mariadb-10.11.9/mysql-test/main/gis-precise.result | 497 mariadb-10.11.9/mysql-test/main/gis-precise.test | 247 mariadb-10.11.9/mysql-test/main/gis.result | 139 mariadb-10.11.9/mysql-test/main/gis.test | 65 mariadb-10.11.9/mysql-test/main/grant.result | 5 mariadb-10.11.9/mysql-test/main/grant.test | 7 mariadb-10.11.9/mysql-test/main/group_min_max.result | 8 mariadb-10.11.9/mysql-test/main/group_min_max_innodb.result | 107 mariadb-10.11.9/mysql-test/main/group_min_max_innodb.test | 47 mariadb-10.11.9/mysql-test/main/group_min_max_notembedded.test | 3 mariadb-10.11.9/mysql-test/main/having.test | 9 mariadb-10.11.9/mysql-test/main/having_cond_pushdown.result | 358 mariadb-10.11.9/mysql-test/main/having_cond_pushdown.test | 99 mariadb-10.11.9/mysql-test/main/host_cache_size_functionality.test | 8 mariadb-10.11.9/mysql-test/main/in_subq_cond_pushdown.result | 1318 mariadb-10.11.9/mysql-test/main/index_merge_myisam.result | 18 mariadb-10.11.9/mysql-test/main/information_schema2.result | 18 mariadb-10.11.9/mysql-test/main/information_schema2.test | 23 mariadb-10.11.9/mysql-test/main/init_file_set_password-7656.test | 4 mariadb-10.11.9/mysql-test/main/innodb_ext_key,covering,on.rdiff | 20 mariadb-10.11.9/mysql-test/main/innodb_ext_key,off.rdiff | 6 mariadb-10.11.9/mysql-test/main/innodb_ext_key,on,unoptimized.rdiff | 20 mariadb-10.11.9/mysql-test/main/innodb_ext_key.result | 28 mariadb-10.11.9/mysql-test/main/innodb_ext_key.test | 30 mariadb-10.11.9/mysql-test/main/insert_select.result | 8 mariadb-10.11.9/mysql-test/main/item_types.result | 16 mariadb-10.11.9/mysql-test/main/item_types.test | 15 mariadb-10.11.9/mysql-test/main/join.result | 58 mariadb-10.11.9/mysql-test/main/join.test | 46 mariadb-10.11.9/mysql-test/main/join_cache.result | 78 mariadb-10.11.9/mysql-test/main/join_cache.test | 96 mariadb-10.11.9/mysql-test/main/join_outer.test | 18 mariadb-10.11.9/mysql-test/main/json_debug_nonembedded.result | 13 mariadb-10.11.9/mysql-test/main/json_debug_nonembedded.test | 22 mariadb-10.11.9/mysql-test/main/json_debug_nonembedded_noasan.result | 13 mariadb-10.11.9/mysql-test/main/json_debug_nonembedded_noasan.test | 23 mariadb-10.11.9/mysql-test/main/json_equals.result | 10 mariadb-10.11.9/mysql-test/main/json_equals.test | 7 mariadb-10.11.9/mysql-test/main/keywords.result | 16 mariadb-10.11.9/mysql-test/main/kill_processlist-6619.test | 14 mariadb-10.11.9/mysql-test/main/load_timezones_with_alter_algorithm_inplace.result | 18 mariadb-10.11.9/mysql-test/main/load_timezones_with_alter_algorithm_inplace.test | 40 mariadb-10.11.9/mysql-test/main/lock_sync.result | 24 mariadb-10.11.9/mysql-test/main/lock_sync.test | 27 mariadb-10.11.9/mysql-test/main/lock_view.result | 2 mariadb-10.11.9/mysql-test/main/log_errchk.test | 4 mariadb-10.11.9/mysql-test/main/log_slow.result | 26 mariadb-10.11.9/mysql-test/main/log_slow.test | 31 mariadb-10.11.9/mysql-test/main/log_slow_debug.result | 7 mariadb-10.11.9/mysql-test/main/log_slow_debug.test | 11 mariadb-10.11.9/mysql-test/main/log_slow_filter.opt | 4 mariadb-10.11.9/mysql-test/main/log_slow_filter.result | 8 mariadb-10.11.9/mysql-test/main/log_slow_filter.test | 7 mariadb-10.11.9/mysql-test/main/log_slow_innodb.result | 16 mariadb-10.11.9/mysql-test/main/log_slow_innodb.test | 2 mariadb-10.11.9/mysql-test/main/log_tables.result | 125 mariadb-10.11.9/mysql-test/main/log_tables.test | 201 mariadb-10.11.9/mysql-test/main/long_host.result | 8 mariadb-10.11.9/mysql-test/main/long_host.test | 8 mariadb-10.11.9/mysql-test/main/long_unique_bugs.result | 158 mariadb-10.11.9/mysql-test/main/long_unique_bugs.test | 137 mariadb-10.11.9/mysql-test/main/long_unique_bugs_no_sp_protocol.result | 95 mariadb-10.11.9/mysql-test/main/long_unique_bugs_no_sp_protocol.test | 68 mariadb-10.11.9/mysql-test/main/lotofstack.result | 101 mariadb-10.11.9/mysql-test/main/lotofstack.test | 133 mariadb-10.11.9/mysql-test/main/lowercase_fs_on.test | 4 mariadb-10.11.9/mysql-test/main/lowercase_table5.result | 178 mariadb-10.11.9/mysql-test/main/lowercase_table5.test | 169 mariadb-10.11.9/mysql-test/main/max_password_errors.result | 23 mariadb-10.11.9/mysql-test/main/max_password_errors.test | 26 mariadb-10.11.9/mysql-test/main/mdl.result | 2 mariadb-10.11.9/mysql-test/main/mdl.test | 2 mariadb-10.11.9/mysql-test/main/mdl_sync.result | 7 mariadb-10.11.9/mysql-test/main/mdl_sync.test | 10 mariadb-10.11.9/mysql-test/main/mrr_icp_extra.result | 6 mariadb-10.11.9/mysql-test/main/myisam.result | 1 mariadb-10.11.9/mysql-test/main/myisam.test | 3 mariadb-10.11.9/mysql-test/main/myisam_crash_before_flush_keys.test | 4 mariadb-10.11.9/mysql-test/main/myisam_explain_non_select_all.result | 81 mariadb-10.11.9/mysql-test/main/mysql-interactive.result | 24 mariadb-10.11.9/mysql-test/main/mysql-interactive.test | 31 mariadb-10.11.9/mysql-test/main/mysql.result | 51 mariadb-10.11.9/mysql-test/main/mysql.test | 60 mariadb-10.11.9/mysql-test/main/mysql_client_test.result | 1 mariadb-10.11.9/mysql-test/main/mysql_client_test.test | 8 mariadb-10.11.9/mysql-test/main/mysql_client_test_comp.test | 2 mariadb-10.11.9/mysql-test/main/mysql_client_test_nonblock.test | 2 mariadb-10.11.9/mysql-test/main/mysql_connector_net.ps1 | 58 mariadb-10.11.9/mysql-test/main/mysql_connector_net.result | 2 mariadb-10.11.9/mysql-test/main/mysql_connector_net.test | 11 mariadb-10.11.9/mysql-test/main/mysql_install_db_win.test | 4 mariadb-10.11.9/mysql-test/main/mysql_install_db_win_admin.result | 6 mariadb-10.11.9/mysql-test/main/mysql_install_db_win_admin.test | 5 mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade.result | 301 mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade.test | 36 mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.result | 198 mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.test | 35 mariadb-10.11.9/mysql-test/main/mysql_json_table_recreate.result | 70 mariadb-10.11.9/mysql-test/main/mysql_json_table_recreate.test | 73 mariadb-10.11.9/mysql-test/main/mysql_tzinfo_to_sql_symlink.result | 32 mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.opt | 2 mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.result | 186 mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.test | 26 mariadb-10.11.9/mysql-test/main/mysql_upgrade.result | 8 mariadb-10.11.9/mysql-test/main/mysql_upgrade.test | 11 mariadb-10.11.9/mysql-test/main/mysql_upgrade_file_leak.result | 4 mariadb-10.11.9/mysql-test/main/mysql_upgrade_file_leak.test | 24 mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json.result | 301 mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json.test | 36 mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_system_tables.result | 94 mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_system_tables.test | 52 mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.result | 198 mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.test | 35 mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_compressed.result | 220 mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_compressed.test | 5 mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_minimal.result | 36 mariadb-10.11.9/mysql-test/main/mysqlbinlog_stmt_compressed.result | 154 mariadb-10.11.9/mysql-test/main/mysqlbinlog_stmt_compressed.test | 3 mariadb-10.11.9/mysql-test/main/mysqld--help,win.rdiff | 20 mariadb-10.11.9/mysql-test/main/mysqld--help.result | 25 mariadb-10.11.9/mysql-test/main/mysqld--help.test | 2 mariadb-10.11.9/mysql-test/main/mysqld_option_err.result | 11 mariadb-10.11.9/mysql-test/main/mysqld_option_err.test | 34 mariadb-10.11.9/mysql-test/main/mysqldump-compat-102.result | 1 mariadb-10.11.9/mysql-test/main/mysqldump-max.result | 24 mariadb-10.11.9/mysql-test/main/mysqldump-nl.result | 2 mariadb-10.11.9/mysql-test/main/mysqldump-no-binlog.result | 1 mariadb-10.11.9/mysql-test/main/mysqldump-order-by-size.result | 1 mariadb-10.11.9/mysql-test/main/mysqldump-system.result | 23 mariadb-10.11.9/mysql-test/main/mysqldump-timing.result | 2 mariadb-10.11.9/mysql-test/main/mysqldump-utf8mb4.result | 1 mariadb-10.11.9/mysql-test/main/mysqldump.result | 167 mariadb-10.11.9/mysql-test/main/mysqldump.test | 31 mariadb-10.11.9/mysql-test/main/name_const_replacement.result | 97 mariadb-10.11.9/mysql-test/main/name_const_replacement.test | 42 mariadb-10.11.9/mysql-test/main/olap.result | 8 mariadb-10.11.9/mysql-test/main/olap.test | 7 mariadb-10.11.9/mysql-test/main/old-mode.result | 10 mariadb-10.11.9/mysql-test/main/old-mode.test | 8 mariadb-10.11.9/mysql-test/main/openssl_1.result | 3 mariadb-10.11.9/mysql-test/main/openssl_1.test | 2 mariadb-10.11.9/mysql-test/main/opt_trace.result | 93 mariadb-10.11.9/mysql-test/main/opt_trace.test | 183 mariadb-10.11.9/mysql-test/main/opt_trace_index_merge.test | 2 mariadb-10.11.9/mysql-test/main/opt_trace_index_merge_innodb.test | 2 mariadb-10.11.9/mysql-test/main/opt_trace_ucs2.test | 3 mariadb-10.11.9/mysql-test/main/order_by.result | 136 mariadb-10.11.9/mysql-test/main/order_by.test | 76 mariadb-10.11.9/mysql-test/main/order_by_pack_big.result | 14 mariadb-10.11.9/mysql-test/main/order_by_pack_big.test | 8 mariadb-10.11.9/mysql-test/main/parser.result | 92 mariadb-10.11.9/mysql-test/main/parser.test | 54 mariadb-10.11.9/mysql-test/main/partition.result | 1 mariadb-10.11.9/mysql-test/main/partition_binlog.result | 1 mariadb-10.11.9/mysql-test/main/partition_innodb.result | 12 mariadb-10.11.9/mysql-test/main/partition_innodb.test | 9 mariadb-10.11.9/mysql-test/main/partition_key_cache.result | 1 mariadb-10.11.9/mysql-test/main/partition_key_cache.test | 4 mariadb-10.11.9/mysql-test/main/partition_mgm_err.result | 13 mariadb-10.11.9/mysql-test/main/partition_mgm_err.test | 17 mariadb-10.11.9/mysql-test/main/perror-win.result | 1 mariadb-10.11.9/mysql-test/main/perror.result | 4 mariadb-10.11.9/mysql-test/main/plugin_auth.result | 1 mariadb-10.11.9/mysql-test/main/plugin_loaderr.test | 4 mariadb-10.11.9/mysql-test/main/ps.result | 191 mariadb-10.11.9/mysql-test/main/ps.test | 197 mariadb-10.11.9/mysql-test/main/ps_2myisam.result | 4 mariadb-10.11.9/mysql-test/main/ps_3innodb.result | 4 mariadb-10.11.9/mysql-test/main/ps_4heap.result | 4 mariadb-10.11.9/mysql-test/main/ps_5merge.result | 8 mariadb-10.11.9/mysql-test/main/ps_mem_leaks.result | 104 mariadb-10.11.9/mysql-test/main/ps_mem_leaks.test | 109 mariadb-10.11.9/mysql-test/main/ps_missed_cmds_bin_prot.test | 4 mariadb-10.11.9/mysql-test/main/query_cache.result | 33 mariadb-10.11.9/mysql-test/main/query_cache.test | 43 mariadb-10.11.9/mysql-test/main/range.result | 8 mariadb-10.11.9/mysql-test/main/range.test | 7 mariadb-10.11.9/mysql-test/main/range_mrr_icp.result | 8 mariadb-10.11.9/mysql-test/main/range_notembedded.test | 3 mariadb-10.11.9/mysql-test/main/read_only_innodb.result | 25 mariadb-10.11.9/mysql-test/main/read_only_innodb.test | 28 mariadb-10.11.9/mysql-test/main/rowid_filter.result | 19 mariadb-10.11.9/mysql-test/main/rowid_filter.test | 17 mariadb-10.11.9/mysql-test/main/rowid_filter_innodb.result | 198 mariadb-10.11.9/mysql-test/main/rowid_filter_innodb.test | 122 mariadb-10.11.9/mysql-test/main/rowid_filter_innodb_debug.result | 18 mariadb-10.11.9/mysql-test/main/rowid_filter_myisam_debug.result | 18 mariadb-10.11.9/mysql-test/main/rpl_mysqldump_slave.result | 218 mariadb-10.11.9/mysql-test/main/rpl_mysqldump_slave.test | 143 mariadb-10.11.9/mysql-test/main/secondary_key_costs.result | 180 mariadb-10.11.9/mysql-test/main/secondary_key_costs.test | 112 mariadb-10.11.9/mysql-test/main/selectivity_innodb_notembedded.result | 131 mariadb-10.11.9/mysql-test/main/selectivity_notembedded.result | 131 mariadb-10.11.9/mysql-test/main/selectivity_notembedded.test | 114 mariadb-10.11.9/mysql-test/main/set_password.result | 4 mariadb-10.11.9/mysql-test/main/show_analyze.result | 8 mariadb-10.11.9/mysql-test/main/show_analyze.test | 12 mariadb-10.11.9/mysql-test/main/show_check.result | 6 mariadb-10.11.9/mysql-test/main/show_explain.result | 11 mariadb-10.11.9/mysql-test/main/show_explain.test | 4 mariadb-10.11.9/mysql-test/main/show_explain_json.result | 8 mariadb-10.11.9/mysql-test/main/show_explain_json.test | 12 mariadb-10.11.9/mysql-test/main/shutdown.test | 4 mariadb-10.11.9/mysql-test/main/skip_grants.test | 4 mariadb-10.11.9/mysql-test/main/sp-no-valgrind.test | 2 mariadb-10.11.9/mysql-test/main/sp-vars.result | 2 mariadb-10.11.9/mysql-test/main/sp.result | 91 mariadb-10.11.9/mysql-test/main/sp.test | 60 mariadb-10.11.9/mysql-test/main/sp_notembedded.result | 119 mariadb-10.11.9/mysql-test/main/sp_notembedded.test | 163 mariadb-10.11.9/mysql-test/main/ssl.result | 18 mariadb-10.11.9/mysql-test/main/ssl.test | 3 mariadb-10.11.9/mysql-test/main/ssl_and_innodb.test | 2 mariadb-10.11.9/mysql-test/main/ssl_crl.result | 2 mariadb-10.11.9/mysql-test/main/ssl_crl.test | 4 mariadb-10.11.9/mysql-test/main/ssl_timeout.result | 2 mariadb-10.11.9/mysql-test/main/ssl_timeout.test | 3 mariadb-10.11.9/mysql-test/main/stat_tables_partition.result | 3 mariadb-10.11.9/mysql-test/main/stat_tables_rbr.result | 1 mariadb-10.11.9/mysql-test/main/strict.result | 2 mariadb-10.11.9/mysql-test/main/strict.test | 2 mariadb-10.11.9/mysql-test/main/subselect.result | 53 mariadb-10.11.9/mysql-test/main/subselect.test | 65 mariadb-10.11.9/mysql-test/main/subselect4.result | 174 mariadb-10.11.9/mysql-test/main/subselect4.test | 51 mariadb-10.11.9/mysql-test/main/subselect_elimination.result | 268 mariadb-10.11.9/mysql-test/main/subselect_elimination.test | 242 mariadb-10.11.9/mysql-test/main/subselect_innodb.result | 33 mariadb-10.11.9/mysql-test/main/subselect_innodb.test | 25 mariadb-10.11.9/mysql-test/main/subselect_mat.result | 7 mariadb-10.11.9/mysql-test/main/subselect_mat.test | 8 mariadb-10.11.9/mysql-test/main/subselect_mat_analyze_json.result | 1188 mariadb-10.11.9/mysql-test/main/subselect_mat_analyze_json.test | 99 mariadb-10.11.9/mysql-test/main/subselect_no_exists_to_in.result | 53 mariadb-10.11.9/mysql-test/main/subselect_no_mat.result | 53 mariadb-10.11.9/mysql-test/main/subselect_no_opts.result | 53 mariadb-10.11.9/mysql-test/main/subselect_no_scache.result | 53 mariadb-10.11.9/mysql-test/main/subselect_no_semijoin.result | 53 mariadb-10.11.9/mysql-test/main/subselect_nulls_innodb.result | 27 mariadb-10.11.9/mysql-test/main/subselect_nulls_innodb.test | 32 mariadb-10.11.9/mysql-test/main/subselect_sj_mat.test | 9 mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50030.result | 2 mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50117.result | 2 mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50568.result | 2 mariadb-10.11.9/mysql-test/main/table_value_constr.result | 4 mariadb-10.11.9/mysql-test/main/table_value_constr.test | 4 mariadb-10.11.9/mysql-test/main/temp_table.result | 65 mariadb-10.11.9/mysql-test/main/temp_table.test | 70 mariadb-10.11.9/mysql-test/main/temp_table_symlink.test | 2 mariadb-10.11.9/mysql-test/main/timezone2.result | 36 mariadb-10.11.9/mysql-test/main/timezone2.test | 33 mariadb-10.11.9/mysql-test/main/trigger.result | 6 mariadb-10.11.9/mysql-test/main/trigger.test | 9 mariadb-10.11.9/mysql-test/main/trigger_wl3253.result | 2 mariadb-10.11.9/mysql-test/main/type_char.result | 40 mariadb-10.11.9/mysql-test/main/type_char.test | 19 mariadb-10.11.9/mysql-test/main/type_datetime.result | 68 mariadb-10.11.9/mysql-test/main/type_datetime.test | 50 mariadb-10.11.9/mysql-test/main/type_decimal.result | 173 mariadb-10.11.9/mysql-test/main/type_decimal.test | 90 mariadb-10.11.9/mysql-test/main/type_float.result | 116 mariadb-10.11.9/mysql-test/main/type_float.test | 78 mariadb-10.11.9/mysql-test/main/type_int.result | 161 mariadb-10.11.9/mysql-test/main/type_int.test | 82 mariadb-10.11.9/mysql-test/main/type_json.result | 2 mariadb-10.11.9/mysql-test/main/type_newdecimal.result | 87 mariadb-10.11.9/mysql-test/main/type_newdecimal.test | 65 mariadb-10.11.9/mysql-test/main/type_num_innodb.result | 48 mariadb-10.11.9/mysql-test/main/type_num_innodb.test | 30 mariadb-10.11.9/mysql-test/main/type_ranges.result | 4 mariadb-10.11.9/mysql-test/main/type_ranges.test | 2 mariadb-10.11.9/mysql-test/main/type_timestamp.result | 119 mariadb-10.11.9/mysql-test/main/type_timestamp.test | 96 mariadb-10.11.9/mysql-test/main/type_varchar.result | 237 mariadb-10.11.9/mysql-test/main/type_varchar.test | 83 mariadb-10.11.9/mysql-test/main/type_varchar_mysql41.result | 149 mariadb-10.11.9/mysql-test/main/type_varchar_mysql41.test | 85 mariadb-10.11.9/mysql-test/main/udf.result | 64 mariadb-10.11.9/mysql-test/main/udf.test | 34 mariadb-10.11.9/mysql-test/main/union.result | 4 mariadb-10.11.9/mysql-test/main/view.result | 50 mariadb-10.11.9/mysql-test/main/view.test | 53 mariadb-10.11.9/mysql-test/main/view_grant.result | 33 mariadb-10.11.9/mysql-test/main/view_grant.test | 31 mariadb-10.11.9/mysql-test/main/win.result | 352 mariadb-10.11.9/mysql-test/main/win.test | 231 mariadb-10.11.9/mysql-test/main/win_avg.result | 8 mariadb-10.11.9/mysql-test/main/win_avg.test | 7 mariadb-10.11.9/mysql-test/main/win_big.result | 24 mariadb-10.11.9/mysql-test/main/win_big.test | 30 mariadb-10.11.9/mysql-test/main/win_nth_value.result | 30 mariadb-10.11.9/mysql-test/main/win_nth_value.test | 32 mariadb-10.11.9/mysql-test/main/win_ntile.result | 6 mariadb-10.11.9/mysql-test/main/win_ntile.test | 7 mariadb-10.11.9/mysql-test/main/win_percentile.result | 6 mariadb-10.11.9/mysql-test/main/win_percentile.test | 7 mariadb-10.11.9/mysql-test/main/win_sum.result | 8 mariadb-10.11.9/mysql-test/main/win_sum.test | 8 mariadb-10.11.9/mysql-test/main/xml.result | 206 mariadb-10.11.9/mysql-test/main/xml.test | 141 mariadb-10.11.9/mysql-test/mariadb-test-run.pl | 29 mariadb-10.11.9/mysql-test/std_data/mdev-25731.dat | 6 mariadb-10.11.9/mysql-test/suite.pm | 9 mariadb-10.11.9/mysql-test/suite/archive/archive.test | 2 mariadb-10.11.9/mysql-test/suite/archive/archive_bitfield.result | 1 mariadb-10.11.9/mysql-test/suite/atomic/alter_table.test | 7 mariadb-10.11.9/mysql-test/suite/binlog/include/binlog_index.inc | 12 mariadb-10.11.9/mysql-test/suite/binlog/include/print_optional_metadata.inc | 3 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_gis_user_var_stm.result | 12 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_raw_flush.result | 1 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result | 666 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result | 195 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result | 195 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result | 38 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_annotate.result | 156 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result | 22 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result | 56 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_show_binlog_events_invalid_offset_silent.result | 21 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result | 22 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_active_log.result | 8 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_multi_engine.result | 10 mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_multi_log.result | 2 mariadb-10.11.9/mysql-test/suite/binlog/r/flashback.result | 18 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_autocommit_off_no_hang.test | 4 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_gis_user_var_stm.test | 15 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_mysqlbinlog_raw_flush.test | 4 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_recover_checksum_error.test | 2 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_rotate_perf.test | 4 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_show_binlog_events_invalid_offset_silent.test | 53 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_active_log.inc | 2 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_active_log.test | 2 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.test | 6 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_log.test | 2 mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_log_unsafe.test | 2 mariadb-10.11.9/mysql-test/suite/binlog/t/flashback.test | 16 mariadb-10.11.9/mysql-test/suite/binlog_encryption/binlog_row_annotate.result | 78 mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.result | 2 mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.test | 3 mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.result | 2 mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.test | 3 mariadb-10.11.9/mysql-test/suite/binlog_encryption/restart_server.inc | 4 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result | 13 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_mixed_binlog_max_cache_size.result | 2 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_packet.result | 2 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_ignored_errors.result | 3 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_missed_error_handling.result | 1 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_slave_bgc_kill.result | 8 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_stop_slave.result | 4 mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_semi_sync.result | 13 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/column_compression.result | 250 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/empty_string_literal.result | 6 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_concat.result | 38 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_decode.result | 12 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_pad.result | 4 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_qualified.result | 2547 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_regexp_replace.result | 34 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_replace.result | 4 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_substr.result | 4 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_trim.result | 6 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/gis.result | 32 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result | 113 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/parser.result | 16 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/ps.result | 4 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result | 2 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result | 1 mariadb-10.11.9/mysql-test/suite/compat/oracle/r/vcol_innodb.result | 54 mariadb-10.11.9/mysql-test/suite/compat/oracle/t/column_compression.test | 2 mariadb-10.11.9/mysql-test/suite/compat/oracle/t/func_qualified.test | 248 mariadb-10.11.9/mysql-test/suite/compat/oracle/t/func_regexp_replace.test | 26 mariadb-10.11.9/mysql-test/suite/compat/oracle/t/mysqldump_restore_func_qualified.test | 50 mariadb-10.11.9/mysql-test/suite/compat/oracle/t/vcol_innodb.test | 47 mariadb-10.11.9/mysql-test/suite/csv/lowercase_table0.result | 15 mariadb-10.11.9/mysql-test/suite/csv/lowercase_table0.test | 16 mariadb-10.11.9/mysql-test/suite/encryption/r/corrupted_during_recovery.result | 2 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change.result | 24 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change2.result | 18 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change4.result | 6 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-compressed-blob.result | 6 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-encryption-disable.result | 7 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-force-corrupt.result | 6 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-missing-key.result | 6 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-redo-nokeys.result | 11 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result | 16 mariadb-10.11.9/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result | 108 mariadb-10.11.9/mysql-test/suite/encryption/r/tempfiles_encrypted.result | 352 mariadb-10.11.9/mysql-test/suite/encryption/t/encrypt_and_grep.test | 6 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change.test | 4 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change2.test | 6 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change3.test | 12 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-compressed-blob.test | 6 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-encryption-disable.test | 7 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-force-corrupt.test | 6 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-missing-key.test | 2 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-redo-nokeys.test | 4 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encrypt_freed.test | 2 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test | 12 mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test | 108 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/db_use_error.result | 2 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_change_master.result | 5 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_get_lock.result | 3 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_row_until.result | 4 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_server_id1.result | 2 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_session_var.result | 11 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_slave_status.result | 1 mariadb-10.11.9/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result | 1 mariadb-10.11.9/mysql-test/suite/engines/funcs/t/rpl_server_id1.test | 2 mariadb-10.11.9/mysql-test/suite/federated/federatedx.result | 1 mariadb-10.11.9/mysql-test/suite/federated/federatedx_create_handlers.result | 65 mariadb-10.11.9/mysql-test/suite/federated/federatedx_create_handlers.test | 61 mariadb-10.11.9/mysql-test/suite/federated/update.result | 36 mariadb-10.11.9/mysql-test/suite/federated/update.test | 32 mariadb-10.11.9/mysql-test/suite/funcs_1/r/innodb_func_view.result | 16 mariadb-10.11.9/mysql-test/suite/funcs_1/r/innodb_views.result | 2 mariadb-10.11.9/mysql-test/suite/funcs_1/r/is_columns_is.result | 16 mariadb-10.11.9/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result | 16 mariadb-10.11.9/mysql-test/suite/funcs_1/r/memory_func_view.result | 16 mariadb-10.11.9/mysql-test/suite/funcs_1/r/memory_views.result | 2 mariadb-10.11.9/mysql-test/suite/funcs_1/r/myisam_func_view.result | 16 mariadb-10.11.9/mysql-test/suite/funcs_1/r/myisam_views-big.result | 2 mariadb-10.11.9/mysql-test/suite/funcs_1/r/storedproc.result | 150 mariadb-10.11.9/mysql-test/suite/funcs_1/t/storedproc.test | 211 mariadb-10.11.9/mysql-test/suite/funcs_1/views/views_master.inc | 9 mariadb-10.11.9/mysql-test/suite/galera/disabled.def | 11 mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes.cnf | 3 mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes_as_master.cnf | 3 mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes_as_slave.cnf | 3 mariadb-10.11.9/mysql-test/suite/galera/galera_2x2nodes.cnf | 6 mariadb-10.11.9/mysql-test/suite/galera/galera_3nodes_as_slave.cnf | 3 mariadb-10.11.9/mysql-test/suite/galera/galera_4nodes.cnf | 7 mariadb-10.11.9/mysql-test/suite/galera/include/galera_sst_restore.inc | 2 mariadb-10.11.9/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc | 4 mariadb-10.11.9/mysql-test/suite/galera/include/kill_galera.inc | 2 mariadb-10.11.9/mysql-test/suite/galera/include/shutdown_mysqld.inc | 18 mariadb-10.11.9/mysql-test/suite/galera/include/start_mysqld.inc | 4 mariadb-10.11.9/mysql-test/suite/galera/r/GAL-401.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/GAL-419.result | 9 mariadb-10.11.9/mysql-test/suite/galera/r/GCF-939.result | 4 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-21479.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-22232.result | 27 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-24143.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-25731.result | 47 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-26499.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-26575.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-27276.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-27806.result | 52 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-29142.result | 12 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-31272.result | 36 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-32549.result | 24 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-32938.result | 21 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33064.result | 26 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33136.result | 21 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33523.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33828.result | 41 mariadb-10.11.9/mysql-test/suite/galera/r/MW-284.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/MW-329.result | 3 mariadb-10.11.9/mysql-test/suite/galera/r/MW-336.result | 46 mariadb-10.11.9/mysql-test/suite/galera/r/MW-369.result | 126 mariadb-10.11.9/mysql-test/suite/galera/r/MW-388.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/MW-402.result | 108 mariadb-10.11.9/mysql-test/suite/galera/r/MW-86-wait1.result | 4 mariadb-10.11.9/mysql-test/suite/galera/r/MW-86-wait8.result | 4 mariadb-10.11.9/mysql-test/suite/galera/r/galera#500.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera-features#117.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_as_master.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_as_slave_gtid_myisam.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_abort_mariabackup.result | 24 mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_abort_shutdown.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_kill.result | 11 mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_lock_wait.result | 20 mariadb-10.11.9/mysql-test/suite/galera/r/galera_create_table_as_select.result | 13 mariadb-10.11.9/mysql-test/suite/galera/r/galera_desync_overlapped.result | 4 mariadb-10.11.9/mysql-test/suite/galera/r/galera_drop_database.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_drop_multi.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_events2.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_forced_binlog_format_ctas.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result | 19 mariadb-10.11.9/mysql-test/suite/galera/r/galera_gra_log.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_gtid_server_id.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_mariabackup_verify_ca.result | 21 mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_mysqldump.result | 8 mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_rsync_verify_ca.result | 21 mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_applier.result | 8 mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_bf.result | 25 mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_ddl.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_load_data.result | 305 mariadb-10.11.9/mysql-test/suite/galera/r/galera_mdl_race.result | 50 mariadb-10.11.9/mysql-test/suite/galera/r/galera_myisam_autocommit.result | 38 mariadb-10.11.9/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_partition.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_partition_key.result | 46 mariadb-10.11.9/mysql-test/suite/galera/r/galera_query_cache_invalidate.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/galera_replica_no_gtid.result | 71 mariadb-10.11.9/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_sequence_engine.result | 12 mariadb-10.11.9/mysql-test/suite/galera/r/galera_shutdown_nonprim.result | 7 mariadb-10.11.9/mysql-test/suite/galera/r/galera_ssl_compression.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_ssl_upgrade.result | 8 mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff | 11 mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mariabackup.result | 20 mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mysqldump.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/galera_table_with_hyphen.result | 52 mariadb-10.11.9/mysql-test/suite/galera/r/galera_toi_ddl_error.result | 4 mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_ignore_apply_errors.result | 12 mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_node_address.result | 22 mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_retry_autocommit.result | 5 mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_slave_threads.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_wsrep_start_position.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result | 7 mariadb-10.11.9/mysql-test/suite/galera/r/galera_wan.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/galera_wan_restart_sst.result | 9 mariadb-10.11.9/mysql-test/suite/galera/r/galera_wsrep_provider_options_syntax.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/mdev-22063.result | 241 mariadb-10.11.9/mysql-test/suite/galera/r/mdev-28433.result | 2 mariadb-10.11.9/mysql-test/suite/galera/r/mdev-31285.result | 21 mariadb-10.11.9/mysql-test/suite/galera/r/mdev-31651.result | 4 mariadb-10.11.9/mysql-test/suite/galera/r/mysql-wsrep#33.result | 6 mariadb-10.11.9/mysql-test/suite/galera/r/mysql-wsrep#332.result | 12 mariadb-10.11.9/mysql-test/suite/galera/r/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.result | 211 mariadb-10.11.9/mysql-test/suite/galera/r/versioning_trx_id.result | 8 mariadb-10.11.9/mysql-test/suite/galera/suite.pm | 8 mariadb-10.11.9/mysql-test/suite/galera/t/GAL-401.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/GAL-419.test | 9 mariadb-10.11.9/mysql-test/suite/galera/t/GCF-939.test | 5 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-21479.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-22232.test | 66 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-24143.test | 6 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-25731.test | 34 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26499.test | 20 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26575.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26597.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27276.test | 43 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27806.opt | 1 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27806.test | 51 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27862.test | 3 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-29142.test | 16 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-31272.combinations | 5 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-31272.test | 58 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-32549.test | 28 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-32938.test | 57 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33064.test | 57 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33136.test | 44 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33523.test | 11 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33828.cnf | 4 mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33828.test | 45 mariadb-10.11.9/mysql-test/suite/galera/t/MW-284.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/MW-329.test | 6 mariadb-10.11.9/mysql-test/suite/galera/t/MW-336.cnf | 2 mariadb-10.11.9/mysql-test/suite/galera/t/MW-336.test | 62 mariadb-10.11.9/mysql-test/suite/galera/t/MW-369.inc | 40 mariadb-10.11.9/mysql-test/suite/galera/t/MW-369.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/enforce_storage_engine2.cnf | 4 mariadb-10.11.9/mysql-test/suite/galera/t/galera#414.cnf | 1 mariadb-10.11.9/mysql-test/suite/galera/t/galera#500.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera-features#117.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_as_master.test | 6 mariadb-10.11.9/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test | 14 mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_abort_mariabackup.test | 15 mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_kill.test | 28 mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_lock_wait.test | 14 mariadb-10.11.9/mysql-test/suite/galera/t/galera_create_table_as_select.test | 22 mariadb-10.11.9/mysql-test/suite/galera/t/galera_desync_overlapped.test | 7 mariadb-10.11.9/mysql-test/suite/galera/t/galera_drop_database.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_drop_multi.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_events2.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_fk_truncate.test | 1 mariadb-10.11.9/mysql-test/suite/galera/t/galera_forced_binlog_format_ctas.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test | 19 mariadb-10.11.9/mysql-test/suite/galera/t/galera_gra_log.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_gtid_server_id.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.cnf | 22 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.test | 61 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mysqldump.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_restart_joiner.test | 3 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.cnf | 17 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.test | 60 mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_applier.test | 8 mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_bf.test | 41 mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_ddl.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_load_data.test | 304 mariadb-10.11.9/mysql-test/suite/galera/t/galera_log_output_csv.test | 4 mariadb-10.11.9/mysql-test/suite/galera/t/galera_mdl_race.test | 60 mariadb-10.11.9/mysql-test/suite/galera/t/galera_myisam_autocommit.test | 25 mariadb-10.11.9/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_parallel_simple.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_partition.test | 6 mariadb-10.11.9/mysql-test/suite/galera/t/galera_partition_key.test | 55 mariadb-10.11.9/mysql-test/suite/galera/t/galera_pc_recovery.test | 8 mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache.test | 3 mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache_invalidate.test | 4 mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test | 4 mariadb-10.11.9/mysql-test/suite/galera/t/galera_replica_no_gtid.cnf | 9 mariadb-10.11.9/mysql-test/suite/galera/t/galera_replica_no_gtid.test | 124 mariadb-10.11.9/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test | 6 mariadb-10.11.9/mysql-test/suite/galera/t/galera_restart_replica.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_sequence_engine.test | 16 mariadb-10.11.9/mysql-test/suite/galera/t/galera_shutdown_nonprim.test | 16 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ssl_compression.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_ssl_upgrade.test | 10 mariadb-10.11.9/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf | 5 mariadb-10.11.9/mysql-test/suite/galera/t/galera_sst_mariabackup.test | 27 mariadb-10.11.9/mysql-test/suite/galera/t/galera_table_with_hyphen.inc | 48 mariadb-10.11.9/mysql-test/suite/galera/t/galera_table_with_hyphen.test | 34 mariadb-10.11.9/mysql-test/suite/galera/t/galera_toi_ddl_error.test | 4 mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test | 13 mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_node_address.cnf | 10 mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_node_address.test | 32 mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_slave_threads.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf | 6 mariadb-10.11.9/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test | 20 mariadb-10.11.9/mysql-test/suite/galera/t/galera_wan.test | 8 mariadb-10.11.9/mysql-test/suite/galera/t/galera_wan_restart_sst.test | 36 mariadb-10.11.9/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/mdev-22063.test | 184 mariadb-10.11.9/mysql-test/suite/galera/t/mdev-22543.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/mdev-28433.test | 2 mariadb-10.11.9/mysql-test/suite/galera/t/mdev-30013.test | 1 mariadb-10.11.9/mysql-test/suite/galera/t/mdev-31285.test | 33 mariadb-10.11.9/mysql-test/suite/galera/t/mdev-31651.test | 5 mariadb-10.11.9/mysql-test/suite/galera/t/mysql-wsrep#332.test | 113 mariadb-10.11.9/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.cnf | 10 mariadb-10.11.9/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.test | 9 mariadb-10.11.9/mysql-test/suite/galera/t/versioning_trx_id.test | 14 mariadb-10.11.9/mysql-test/suite/galera_3nodes/disabled.def | 12 mariadb-10.11.9/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf | 3 mariadb-10.11.9/mysql-test/suite/galera_3nodes/galera_3nodes.cnf | 3 mariadb-10.11.9/mysql-test/suite/galera_3nodes/include/galera_resume.inc | 1 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-354.result | 8 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-363.result | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-376.result | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/MDEV-29171.result | 25 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera-features#119.result | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_allowlist.result | 3 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_duplicate_primary_value.result | 68 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_garbd.result | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_garbd_backup.result | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result | 166 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_gtid_consistency.result | 220 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result | 8 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_ist_gcache_rollover.result | 27 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_A.result | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result | 10 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result | 8 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_safe_to_bootstrap.result | 16 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_toi_vote.result | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_var_node_address.result | 22 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_vote_rejoin_mysqldump.result | 22 mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/inconsistency_shutdown.result | 10 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-354.test | 8 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-363.test | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-376.test | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/MDEV-29171.test | 55 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera-features#119.test | 7 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_allowlist.test | 9 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.cnf | 19 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.test | 81 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_garbd.test | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_garbd_backup.test | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf | 8 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test | 39 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf | 38 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.test | 347 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test | 7 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.cnf | 14 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.test | 33 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_A.test | 6 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test | 11 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test | 8 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test | 16 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_toi_vote.test | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_var_node_address.cnf | 7 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_var_node_address.test | 32 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_vote_rejoin_mysqldump.test | 21 mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test | 10 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/disabled.def | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/GCF-832.result | 12 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/galera_sr_kill_slave_before_apply.result | 17 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/GCF-336.test | 10 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/GCF-832.test | 21 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/galera_sr_isolate_master.test | 2 mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/galera_sr_kill_slave_before_apply.test | 16 mariadb-10.11.9/mysql-test/suite/galera_sr/disabled.def | 4 mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-27615.result | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-28971.result | 17 mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-30838.result | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_bf_abort_idle.result | 33 mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_cc_master.result | 32 mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_mysqldump_sst.result | 6 mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_shutdown_slave.result | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_ws_size.result | 8 mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_ws_size2.result | 16 mariadb-10.11.9/mysql-test/suite/galera_sr/r/mdev_18631.result | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result | 16 mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-1008.test | 1 mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-1051.test | 1 mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-845.test | 1 mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-851.test | 1 mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-889.test | 1 mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-21613.test | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-25718.test | 5 mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-27615.test | 3 mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-28971.test | 20 mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-30838.test | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_bf_abort_idle.test | 68 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_cc_master.test | 28 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test | 4 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_large_fragment.test | 3 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_many_fragments.test | 4 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_shutdown_slave.test | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_ws_size.test | 8 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_ws_size2.test | 16 mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_var_ignore_apply_errors_sr.test | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/t/mdev_18631.test | 3 mariadb-10.11.9/mysql-test/suite/galera_sr/t/mysql-wsrep-bugs-900.test | 2 mariadb-10.11.9/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc | 6 mariadb-10.11.9/mysql-test/suite/gcol/inc/innodb_v_large_col.inc | 2 mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_bugfixes.result | 38 mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_partition_innodb.result | 5 mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_purge.result | 2 mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_update.result | 3 mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_prefix_index_check.result | 29 mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_debug.result | 3 mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result | 10 mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_purge.result | 3 mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_bugfixes.test | 35 mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_partition_innodb.test | 7 mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_purge.test | 2 mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_update.test | 5 mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_prefix_index_check.test | 43 mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_debug.test | 6 mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test | 8 mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_purge.test | 5 mariadb-10.11.9/mysql-test/suite/innodb/include/crc32.pl | 23 mariadb-10.11.9/mysql-test/suite/innodb/include/innodb-util.pl | 19 mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc | 3 mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc | 3 mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc | 3 mariadb-10.11.9/mysql-test/suite/innodb/include/no_checkpoint_start.inc | 23 mariadb-10.11.9/mysql-test/suite/innodb/r/add_foreign_key.result | 31 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy_bulk,OFF.rdiff | 11 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy_bulk.result | 24 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_kill.result | 5 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,COPY,NON-STRICT.rdiff | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,COPY,STRICT.rdiff | 181 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,INPLACE,STRICT.rdiff | 164 mariadb-10.11.9/mysql-test/suite/innodb/r/alter_table.result | 14 mariadb-10.11.9/mysql-test/suite/innodb/r/autoinc_debug.result | 57 mariadb-10.11.9/mysql-test/suite/innodb/r/autoinc_import.result | 232 mariadb-10.11.9/mysql-test/suite/innodb/r/cascade_lock_wait.result | 76 mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,32k.rdiff | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,4k.rdiff | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,64k.rdiff | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,8k.rdiff | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/corrupted_during_recovery.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/cursor-restore-unique-null.result | 24 mariadb-10.11.9/mysql-test/suite/innodb/r/deadlock_detect.result | 8 mariadb-10.11.9/mysql-test/suite/innodb/r/dml_purge.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/doublewrite.result | 256 mariadb-10.11.9/mysql-test/suite/innodb/r/doublewrite_debug.result | 94 mariadb-10.11.9/mysql-test/suite/innodb/r/fk_col_alter.result | 13 mariadb-10.11.9/mysql-test/suite/innodb/r/fk_drop_alter.result | 44 mariadb-10.11.9/mysql-test/suite/innodb/r/foreign-keys.result | 7 mariadb-10.11.9/mysql-test/suite/innodb/r/foreign_key.result | 74 mariadb-10.11.9/mysql-test/suite/innodb/r/full_crc32_import.result | 23 mariadb-10.11.9/mysql-test/suite/innodb/r/ibuf_not_empty.result | 1 mariadb-10.11.9/mysql-test/suite/innodb/r/import_bugs.result | 78 mariadb-10.11.9/mysql-test/suite/innodb/r/import_hidden_fts.result | 45 mariadb-10.11.9/mysql-test/suite/innodb/r/import_hidden_fts_debug.result | 76 mariadb-10.11.9/mysql-test/suite/innodb/r/import_update_stats.result | 72 mariadb-10.11.9/mysql-test/suite/innodb/r/index_length.result | 31 mariadb-10.11.9/mysql-test/suite/innodb/r/index_merge_threshold.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-16k.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-32k.result | 21 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-64k.result | 20 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-ac-non-locking-select.result | 62 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter-debug.result | 15 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter-tempfile.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter.result | 56 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-blob.result | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-debug.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-online-fk.result | 67 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-online.result | 31 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-lock-inherit-read_commited.result | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result | 10 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-read-view.result | 41 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-system-table-view.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-table-online.result | 36 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-truncate.result | 9 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522,crc32.rdiff | 5 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522,strict_crc32.rdiff | 17 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522-1.result | 14 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result | 9 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_buffer_pool_fail.result | 1 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_bug12902967.result | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_bug30113362.result | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_big5.result | 40 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_latin1.result | 40 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_utf8.result | 40 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_force_recovery.result | 9 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_i_s_innodb_trx.result | 90 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_information_schema_tables.result | 1 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_mysql.result | 24 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_prefix_index_restart_server.result | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_scrub.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc.result | 44 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_ddl.result | 34 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_lots.result | 202 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_on_nonexistent.result | 60 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_external_pages.result | 10 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_fetch.result | 41 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_flag_global,off.rdiff | 34 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_flag_global.result | 207 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_persistent.result | 28 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_sample_pages.result | 29 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_table_flag_auto_recalc.result | 82 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_table_flag_sample_pages.result | 95 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_status_variables.result | 1 mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_timeout_rollback.result | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/insert_into_empty,4k.rdiff | 12 mariadb-10.11.9/mysql-test/suite/innodb/r/insert_into_empty.result | 74 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_bugs.result | 28 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_crash.result | 30 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff | 8 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_debug.result | 57 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_extend.result | 11 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_import.result | 1 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_purge.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_rollback.result | 1 mariadb-10.11.9/mysql-test/suite/innodb/r/lock_insert_into_empty.result | 5 mariadb-10.11.9/mysql-test/suite/innodb/r/lock_isolation.result | 157 mariadb-10.11.9/mysql-test/suite/innodb/r/lock_memory.result | 20 mariadb-10.11.9/mysql-test/suite/innodb/r/lock_memory_debug.result | 13 mariadb-10.11.9/mysql-test/suite/innodb/r/lock_move_wait_lock_race.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/lock_release.result | 23 mariadb-10.11.9/mysql-test/suite/innodb/r/log_file.result | 15 mariadb-10.11.9/mysql-test/suite/innodb/r/log_file_name.result | 1 mariadb-10.11.9/mysql-test/suite/innodb/r/log_file_overwrite.result | 21 mariadb-10.11.9/mysql-test/suite/innodb/r/log_upgrade_101_flags.result | 12 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,compact,innodb.rdiff | 80 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,compact.rdiff | 80 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,dynamic,innodb.rdiff | 224 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,dynamic.rdiff | 224 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,innodb,redundant.rdiff | 80 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,redundant.rdiff | 80 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,compact,innodb.rdiff | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,compact.rdiff | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,dynamic,innodb.rdiff | 366 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,dynamic.rdiff | 366 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,innodb,redundant.rdiff | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,redundant.rdiff | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,compact,innodb.rdiff | 62 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,compact.rdiff | 62 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,dynamic,innodb.rdiff | 128 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,dynamic.rdiff | 128 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,innodb,redundant.rdiff | 62 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,redundant.rdiff | 62 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,compact,innodb.rdiff | 203 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,compact.rdiff | 203 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,dynamic,innodb.rdiff | 501 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,dynamic.rdiff | 501 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,innodb,redundant.rdiff | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,redundant.rdiff | 121 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,compact,innodb.rdiff | 35 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,compact.rdiff | 35 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,dynamic,innodb.rdiff | 134 mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,dynamic.rdiff | 134 mariadb-10.11.9/mysql-test/suite/innodb/r/mem_pressure.result | 25 mariadb-10.11.9/mysql-test/suite/innodb/r/monitor.result | 56 mariadb-10.11.9/mysql-test/suite/innodb/r/no_pad.result | 46 mariadb-10.11.9/mysql-test/suite/innodb/r/open_files_limit.result | 6 mariadb-10.11.9/mysql-test/suite/innodb/r/page_id_innochecksum.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/page_reorganize.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/purge.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/purge_secondary.result | 4 mariadb-10.11.9/mysql-test/suite/innodb/r/purge_thread_shutdown.result | 27 mariadb-10.11.9/mysql-test/suite/innodb/r/read_only_recovery.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range,4k.rdiff | 8 mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range,8k.rdiff | 8 mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range.result | 1275 mariadb-10.11.9/mysql-test/suite/innodb/r/recovery_memory,debug.rdiff | 10 mariadb-10.11.9/mysql-test/suite/innodb/r/rename_table.result | 10 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,16k,innodb.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,16k.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,32k,innodb.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,32k.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,4k,innodb.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,4k.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,64k,innodb.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,64k.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,8k,innodb.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/restart,8k.rdiff | 16 mariadb-10.11.9/mysql-test/suite/innodb/r/row_format_redundant.result | 11 mariadb-10.11.9/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result | 8 mariadb-10.11.9/mysql-test/suite/innodb/r/scrub_debug.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/table_flags.result | 23 mariadb-10.11.9/mysql-test/suite/innodb/r/tablespace_per_table_not_windows.result | 128 mariadb-10.11.9/mysql-test/suite/innodb/r/tablespace_per_table_windows.result | 48 mariadb-10.11.9/mysql-test/suite/innodb/r/temporary_table.result | 10 mariadb-10.11.9/mysql-test/suite/innodb/r/truncate_crash.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/truncate_foreign.result | 9 mariadb-10.11.9/mysql-test/suite/innodb/r/trx_id_future.result | 2 mariadb-10.11.9/mysql-test/suite/innodb/r/undo_log.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/undo_space_dblwr.result | 11 mariadb-10.11.9/mysql-test/suite/innodb/r/undo_truncate.result | 3 mariadb-10.11.9/mysql-test/suite/innodb/r/undo_upgrade.result | 24 mariadb-10.11.9/mysql-test/suite/innodb/r/xa_recovery.result | 17 mariadb-10.11.9/mysql-test/suite/innodb/t/add_foreign_key.test | 38 mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy_bulk.combinations | 5 mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy_bulk.test | 44 mariadb-10.11.9/mysql-test/suite/innodb/t/alter_crash.test | 6 mariadb-10.11.9/mysql-test/suite/innodb/t/alter_kill.test | 3 mariadb-10.11.9/mysql-test/suite/innodb/t/alter_rename_existing.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/alter_table.test | 15 mariadb-10.11.9/mysql-test/suite/innodb/t/autoinc_debug.test | 66 mariadb-10.11.9/mysql-test/suite/innodb/t/autoinc_import.test | 168 mariadb-10.11.9/mysql-test/suite/innodb/t/cascade_lock_wait.test | 45 mariadb-10.11.9/mysql-test/suite/innodb/t/corrupted_during_recovery.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/cursor-restore-unique-null.test | 36 mariadb-10.11.9/mysql-test/suite/innodb/t/deadlock_detect.test | 21 mariadb-10.11.9/mysql-test/suite/innodb/t/dml_purge.test | 5 mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite.test | 429 mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite_debug.combinations | 7 mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite_debug.test | 170 mariadb-10.11.9/mysql-test/suite/innodb/t/fk_col_alter.test | 14 mariadb-10.11.9/mysql-test/suite/innodb/t/fk_drop_alter.test | 35 mariadb-10.11.9/mysql-test/suite/innodb/t/foreign-keys.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/foreign_key.test | 86 mariadb-10.11.9/mysql-test/suite/innodb/t/full_crc32_import.test | 16 mariadb-10.11.9/mysql-test/suite/innodb/t/group_commit_crash.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/group_commit_crash_no_optimize_thread.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/ibuf_not_empty.test | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/import_bugs.test | 82 mariadb-10.11.9/mysql-test/suite/innodb/t/import_hidden_fts.test | 46 mariadb-10.11.9/mysql-test/suite/innodb/t/import_hidden_fts_debug.test | 101 mariadb-10.11.9/mysql-test/suite/innodb/t/import_update_stats.test | 80 mariadb-10.11.9/mysql-test/suite/innodb/t/index_length.test | 31 mariadb-10.11.9/mysql-test/suite/innodb/t/index_merge_threshold.test | 6 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-16k.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-32k.test | 14 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-64k.test | 13 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-ac-non-locking-select.test | 117 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter-debug.test | 22 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter-tempfile.test | 7 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter.test | 26 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-corrupted-table.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-index-online-fk.test | 45 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-index-online.test | 33 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-lock-inherit-read_commited.test | 110 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test | 24 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-read-view.test | 48 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-system-table-view.test | 5 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-table-online.test | 32 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-truncate.test | 8 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-wl5522-1.test | 21 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-wl5522-debug.test | 6 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test | 47 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_buffer_pool_fail.test | 5 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_bug12902967.test | 25 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_bug60196.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_defrag_stats.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_force_recovery.test | 10 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_i_s_innodb_locks.test | 169 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_i_s_innodb_trx.test | 95 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_information_schema_tables.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_information_schema_tables.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_prefix_index_restart_server.test | 14 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_scrub.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.test | 48 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.test | 49 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.test | 45 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.test | 88 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_external_pages.test | 79 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_fetch.opt | 7 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_fetch.test | 35 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global.combinations | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global.test | 91 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global_analyze.inc | 13 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_persistent.test | 41 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_sample_pages.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_sample_pages.test | 53 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_table_flag_auto_recalc.test | 83 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_table_flag_sample_pages.test | 103 mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_timeout_rollback.test | 3 mariadb-10.11.9/mysql-test/suite/innodb/t/insert_into_empty.test | 101 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_bugs.test | 32 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_crash.test | 28 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_debug.test | 60 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_extend.test | 13 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_import.test | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_purge.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_rollback.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/lock_insert_into_empty.test | 4 mariadb-10.11.9/mysql-test/suite/innodb/t/lock_isolation.test | 183 mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory.test | 29 mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory_debug.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory_debug.test | 19 mariadb-10.11.9/mysql-test/suite/innodb/t/lock_move_wait_lock_race.test | 3 mariadb-10.11.9/mysql-test/suite/innodb/t/lock_release.test | 26 mariadb-10.11.9/mysql-test/suite/innodb/t/log_file.test | 14 mariadb-10.11.9/mysql-test/suite/innodb/t/log_file_name.test | 7 mariadb-10.11.9/mysql-test/suite/innodb/t/log_file_overwrite.test | 31 mariadb-10.11.9/mysql-test/suite/innodb/t/log_upgrade_101_flags.test | 91 mariadb-10.11.9/mysql-test/suite/innodb/t/mdev-14846.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/mem_pressure.test | 44 mariadb-10.11.9/mysql-test/suite/innodb/t/monitor.test | 62 mariadb-10.11.9/mysql-test/suite/innodb/t/no_pad.test | 46 mariadb-10.11.9/mysql-test/suite/innodb/t/open_files_limit.opt | 3 mariadb-10.11.9/mysql-test/suite/innodb/t/open_files_limit.test | 12 mariadb-10.11.9/mysql-test/suite/innodb/t/page_id_innochecksum.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/purge.test | 5 mariadb-10.11.9/mysql-test/suite/innodb/t/purge_secondary.test | 9 mariadb-10.11.9/mysql-test/suite/innodb/t/purge_thread_shutdown.test | 43 mariadb-10.11.9/mysql-test/suite/innodb/t/read_only_recovery.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/records_in_range.test | 432 mariadb-10.11.9/mysql-test/suite/innodb/t/recovery_memory.test | 7 mariadb-10.11.9/mysql-test/suite/innodb/t/rename_table.test | 9 mariadb-10.11.9/mysql-test/suite/innodb/t/row_format_redundant.opt | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/row_format_redundant.test | 6 mariadb-10.11.9/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test | 18 mariadb-10.11.9/mysql-test/suite/innodb/t/scrub_debug.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/table_flags.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/table_flags.test | 20 mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.test | 162 mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_windows.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_windows.test | 77 mariadb-10.11.9/mysql-test/suite/innodb/t/temporary_table.test | 21 mariadb-10.11.9/mysql-test/suite/innodb/t/truncate_crash.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/truncate_foreign.test | 10 mariadb-10.11.9/mysql-test/suite/innodb/t/trx_id_future.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/undo_log.test | 5 mariadb-10.11.9/mysql-test/suite/innodb/t/undo_space_dblwr.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb/t/undo_space_dblwr.test | 14 mariadb-10.11.9/mysql-test/suite/innodb/t/undo_truncate.test | 5 mariadb-10.11.9/mysql-test/suite/innodb/t/undo_truncate_recover.test | 2 mariadb-10.11.9/mysql-test/suite/innodb/t/undo_upgrade.test | 43 mariadb-10.11.9/mysql-test/suite/innodb/t/xa_recovery.test | 16 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/crash_recovery.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/create,orig.rdiff | 11 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/create.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/foreign_key_check.result | 27 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/foreign_key_update.result | 46 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/ft_result_cache_limit.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/fts_sync_commit_resiliency.result | 63 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/fulltext_order_by.result | 4 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/index_table.result | 265 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers.rdiff | 57 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers_trx.rdiff | 57 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers.rdiff | 10 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers_trx.rdiff | 10 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb_fts_proximity.result | 5 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/limit_union.result | 157 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc.result | 1878 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_1.result | 922 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_debug,vers.rdiff | 66 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_debug,vers_trx.rdiff | 66 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/opt.result | 1654 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/phrase.result | 84 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/result_cache_limit.result | 31 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/savepoint.result | 318 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/subexpr.result | 105 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/sync_ddl,vers.rdiff | 12 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/sync_ddl,vers_trx.rdiff | 12 mariadb-10.11.9/mysql-test/suite/innodb_fts/r/sync_ddl.result | 5 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/crash_recovery.test | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/create.test | 6 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/foreign_key_check.test | 41 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/foreign_key_update.test | 47 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.test | 47 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/index_table.opt | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/index_table.test | 121 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test | 33 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test | 5 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/limit_union.test | 143 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc.test | 1511 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc_1.test | 894 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc_debug.test | 16 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/opt.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/opt.test | 1086 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/phrase.opt | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/phrase.test | 39 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/result_cache_limit.test | 52 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/savepoint.test | 475 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/subexpr.test | 58 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/sync.test | 2 mariadb-10.11.9/mysql-test/suite/innodb_fts/t/sync_ddl.test | 5 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/1.result | 12 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/check_rtree.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/gis.result | 12 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/precise.result | 42 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rollback.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_add_index.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_compress.result | 8 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_create_inplace.result | 36 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_purge.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_undo.result | 12 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/1.test | 11 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/geometry.test | 3 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/gis.test | 11 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rollback.test | 2 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_add_index.test | 2 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_compress.test | 6 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_create_inplace.opt | 1 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_create_inplace.test | 38 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_purge.test | 2 mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_undo.test | 4 mariadb-10.11.9/mysql-test/suite/innodb_zip/include/innodb_dml_ops.inc | 82 mariadb-10.11.9/mysql-test/suite/innodb_zip/r/blob.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_zip/r/innochecksum_3.result | 2 mariadb-10.11.9/mysql-test/suite/innodb_zip/r/restart.result | 37 mariadb-10.11.9/mysql-test/suite/innodb_zip/t/blob.test | 2 mariadb-10.11.9/mysql-test/suite/innodb_zip/t/innochecksum_2.test | 5 mariadb-10.11.9/mysql-test/suite/innodb_zip/t/restart.opt | 7 mariadb-10.11.9/mysql-test/suite/innodb_zip/t/restart.test | 18 mariadb-10.11.9/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test | 6 mariadb-10.11.9/mysql-test/suite/json/r/json_no_table.result | 20 mariadb-10.11.9/mysql-test/suite/json/r/json_table.result | 25 mariadb-10.11.9/mysql-test/suite/json/r/type_json.result | 8 mariadb-10.11.9/mysql-test/suite/json/t/json_table.test | 22 mariadb-10.11.9/mysql-test/suite/json/t/type_json.test | 9 mariadb-10.11.9/mysql-test/suite/large_tests/r/maria_recover_encrypted.result | 2 mariadb-10.11.9/mysql-test/suite/large_tests/t/maria_recover_encrypted.test | 8 mariadb-10.11.9/mysql-test/suite/maria/alter.result | 26 mariadb-10.11.9/mysql-test/suite/maria/alter.test | 28 mariadb-10.11.9/mysql-test/suite/maria/bulk_insert_crash.test | 2 mariadb-10.11.9/mysql-test/suite/maria/encrypt-no-key.test | 8 mariadb-10.11.9/mysql-test/suite/maria/encrypt-wrong-key.test | 12 mariadb-10.11.9/mysql-test/suite/maria/ps_maria.result | 4 mariadb-10.11.9/mysql-test/suite/maria/range.result | 6 mariadb-10.11.9/mysql-test/suite/maria/range.test | 22 mariadb-10.11.9/mysql-test/suite/maria/repair.result | 23 mariadb-10.11.9/mysql-test/suite/maria/repair.test | 19 mariadb-10.11.9/mysql-test/suite/mariabackup/absolute_ibdata_paths.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/alter_copy_race.result | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/alter_copy_race.test | 4 mariadb-10.11.9/mysql-test/suite/mariabackup/apply-log-only-incr.test | 4 mariadb-10.11.9/mysql-test/suite/mariabackup/apply-log-only.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.opt | 1 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.result | 780 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.test | 425 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log.opt | 1 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path.result | 1 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path.test | 6 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result | 1 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.opt | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.result | 58 mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test | 82 mariadb-10.11.9/mysql-test/suite/mariabackup/auth_plugin_win.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/backup_grants.result | 15 mariadb-10.11.9/mysql-test/suite/mariabackup/backup_grants.test | 69 mariadb-10.11.9/mysql-test/suite/mariabackup/backup_ssl.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/binlog.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/compress_qpress.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/create_during_backup.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/create_with_data_directory_during_backup.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/data_directory.test | 5 mariadb-10.11.9/mysql-test/suite/mariabackup/ddl_for_common_engine.result | 67 mariadb-10.11.9/mysql-test/suite/mariabackup/ddl_for_common_engine.test | 79 mariadb-10.11.9/mysql-test/suite/mariabackup/disabled.def | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.opt | 6 mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.result | 14 mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.test | 29 mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_page_compressed.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_page_corruption.test | 4 mariadb-10.11.9/mysql-test/suite/mariabackup/extra_lsndir.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/full_backup.result | 8 mariadb-10.11.9/mysql-test/suite/mariabackup/full_backup.test | 13 mariadb-10.11.9/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/huge_lsn.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/incremental_encrypted.test | 10 mariadb-10.11.9/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.result | 5 mariadb-10.11.9/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test | 18 mariadb-10.11.9/mysql-test/suite/mariabackup/lock_ddl_per_table.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/log_checksum_mismatch.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.result | 20 mariadb-10.11.9/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.test | 47 mariadb-10.11.9/mysql-test/suite/mariabackup/log_tables.result | 24 mariadb-10.11.9/mysql-test/suite/mariabackup/log_tables.test | 49 mariadb-10.11.9/mysql-test/suite/mariabackup/mdev-14447.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/missing_ibd.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/nolock_ddl_during_backup_end.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/partial.result | 8 mariadb-10.11.9/mysql-test/suite/mariabackup/partial.test | 21 mariadb-10.11.9/mysql-test/suite/mariabackup/partial_exclude.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/partition_datadir.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/partition_partial.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_backup.result | 12 mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_backup.test | 27 mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_mdl_lock.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/rpl_clone_slave.result | 202 mariadb-10.11.9/mysql-test/suite/mariabackup/rpl_clone_slave.test | 17 mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.cnf | 13 mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.result | 48 mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.test | 170 mariadb-10.11.9/mysql-test/suite/mariabackup/small_ibd.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/suite.opt | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/system_versioning.test | 4 mariadb-10.11.9/mysql-test/suite/mariabackup/truncate_during_backup.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/undo_space_id.result | 7 mariadb-10.11.9/mysql-test/suite/mariabackup/undo_space_id.test | 21 mariadb-10.11.9/mysql-test/suite/mariabackup/unencrypted_page_compressed.result | 3 mariadb-10.11.9/mysql-test/suite/mariabackup/unencrypted_page_compressed.test | 5 mariadb-10.11.9/mysql-test/suite/mariabackup/unsupported_redo.test | 8 mariadb-10.11.9/mysql-test/suite/mariabackup/xb_aws_key_management.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/xb_file_key_management.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/xb_history.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/xb_page_compress.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/xb_partition.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/xb_rocksdb.test | 4 mariadb-10.11.9/mysql-test/suite/mariabackup/xb_rocksdb_datadir.test | 2 mariadb-10.11.9/mysql-test/suite/mariabackup/xbstream.test | 2 mariadb-10.11.9/mysql-test/suite/multi_source/gtid_ignore_duplicates.result | 108 mariadb-10.11.9/mysql-test/suite/multi_source/gtid_ignore_duplicates.test | 68 mariadb-10.11.9/mysql-test/suite/multi_source/gtid_slave_pos.result | 3 mariadb-10.11.9/mysql-test/suite/multi_source/gtid_slave_pos.test | 4 mariadb-10.11.9/mysql-test/suite/multi_source/info_logs.result | 12 mariadb-10.11.9/mysql-test/suite/multi_source/mdev-9544.test | 1 mariadb-10.11.9/mysql-test/suite/multi_source/multi_source_slave_alias_replica.result | 4 mariadb-10.11.9/mysql-test/suite/multi_source/reset_slave.result | 8 mariadb-10.11.9/mysql-test/suite/multi_source/simple.result | 14 mariadb-10.11.9/mysql-test/suite/multi_source/syntax.result | 6 mariadb-10.11.9/mysql-test/suite/parts/inc/partition_crash.inc | 4 mariadb-10.11.9/mysql-test/suite/parts/r/alter_table.result | 12 mariadb-10.11.9/mysql-test/suite/parts/r/mdev_21007.result | 5 mariadb-10.11.9/mysql-test/suite/parts/r/mdev_24610.result | 24 mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter4_innodb.result | 24 mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter4_myisam.result | 24 mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter_innodb.result | 3 mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter_myisam.result | 22 mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result | 1 mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result | 1 mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result | 1 mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result | 1 mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result | 1 mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result | 1 mariadb-10.11.9/mysql-test/suite/parts/r/partition_purge.result | 2 mariadb-10.11.9/mysql-test/suite/parts/r/partition_recover_myisam.result | 3 mariadb-10.11.9/mysql-test/suite/parts/t/alter_table.test | 30 mariadb-10.11.9/mysql-test/suite/parts/t/mdev_21007.test | 9 mariadb-10.11.9/mysql-test/suite/parts/t/mdev_24610.test | 22 mariadb-10.11.9/mysql-test/suite/parts/t/partition_alter_innodb.test | 3 mariadb-10.11.9/mysql-test/suite/parts/t/partition_alter_myisam.test | 15 mariadb-10.11.9/mysql-test/suite/parts/t/partition_purge.test | 2 mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam-master.opt | 1 mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam.opt | 1 mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam.test | 8 mariadb-10.11.9/mysql-test/suite/perfschema/include/memory_aggregate_load.inc | 3 mariadb-10.11.9/mysql-test/suite/perfschema/include/pfs_running_event_scheduler.inc | 6 mariadb-10.11.9/mysql-test/suite/perfschema/include/program_execution.inc | 2 mariadb-10.11.9/mysql-test/suite/perfschema/include/stage_setup.inc | 23 mariadb-10.11.9/mysql-test/suite/perfschema/r/alter_table_progress.result | 3 mariadb-10.11.9/mysql-test/suite/perfschema/r/digest_view.result | 50 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate.result | 378 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a.result | 266 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_h.result | 228 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u.result | 146 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u_no_h.result | 108 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_h.result | 340 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_u.result | 258 mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_u_no_h.result | 220 mariadb-10.11.9/mysql-test/suite/perfschema/r/max_program_zero.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/mdl_func.result | 1 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_32bit.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_h.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u_no_h.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_h.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_u.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_u_no_h.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/misc.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/misc_session_status.result | 20 mariadb-10.11.9/mysql-test/suite/perfschema/r/nesting.result | 56 mariadb-10.11.9/mysql-test/suite/perfschema/r/ortho_iter.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/privilege_table_io.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/rpl_threads.result | 6 mariadb-10.11.9/mysql-test/suite/perfschema/r/stage_mdl_global.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/stage_mdl_table.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_idle.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_stages.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_statements.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_transactions.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_waits.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_innodb.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_index.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_table_lock.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_account.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_cond_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_file_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_file_inst.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_host.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_index.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mdl.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_memory_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_socket_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stage_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stages_history.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statement_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statements_history.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_inst.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_lock.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_thread_class.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result | 2 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_user.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_waits_history.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_off.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_on.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_variables.result | 8 mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_lost_inst.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_nesting_event_check.result | 4 mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_non_nested.result | 6 mariadb-10.11.9/mysql-test/suite/perfschema/r/threads_history.result | 428 mariadb-10.11.9/mysql-test/suite/perfschema/t/bad_option.test | 4 mariadb-10.11.9/mysql-test/suite/perfschema/t/mdl_func.test | 8 mariadb-10.11.9/mysql-test/suite/perfschema/t/misc.test | 1 mariadb-10.11.9/mysql-test/suite/perfschema/t/misc_session_status.test | 20 mariadb-10.11.9/mysql-test/suite/perfschema/t/processlist_57.test | 10 mariadb-10.11.9/mysql-test/suite/perfschema/t/rpl_threads.test | 6 mariadb-10.11.9/mysql-test/suite/perfschema/t/setup_instruments_defaults.test | 4 mariadb-10.11.9/mysql-test/suite/perfschema/t/statement_program_lost_inst.test | 4 mariadb-10.11.9/mysql-test/suite/perfschema/t/threads_history.test | 494 mariadb-10.11.9/mysql-test/suite/period/r/overlaps.result | 82 mariadb-10.11.9/mysql-test/suite/period/t/overlaps.test | 77 mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff | 12 mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff | 12 mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff | 12 mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff | 12 mariadb-10.11.9/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff | 11 mariadb-10.11.9/mysql-test/suite/plugins/r/compression.result | 7 mariadb-10.11.9/mysql-test/suite/plugins/r/sql_error_log.result | 1 mariadb-10.11.9/mysql-test/suite/plugins/r/sql_error_log_withdbinfo.result | 41 mariadb-10.11.9/mysql-test/suite/plugins/r/test_sql_service.result | 2 mariadb-10.11.9/mysql-test/suite/plugins/t/compression.combinations | 5 mariadb-10.11.9/mysql-test/suite/plugins/t/compression.test | 4 mariadb-10.11.9/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.opt | 1 mariadb-10.11.9/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.test | 49 mariadb-10.11.9/mysql-test/suite/plugins/t/test_sql_service.test | 8 mariadb-10.11.9/mysql-test/suite/roles/definer.result | 1 mariadb-10.11.9/mysql-test/suite/roles/set_default_role_for.result | 2 mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid.result | 6 mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid.test | 1 mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve-master.opt | 1 mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.result | 85 mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.test | 78 mariadb-10.11.9/mysql-test/suite/rpl/include/mdev-31448_conservative.inc | 7 mariadb-10.11.9/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc | 7 mariadb-10.11.9/mysql-test/suite/rpl/include/mysqlbinlog_slave_consistency.inc | 1 mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_binlog_max_cache_size.test | 5 mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_change_master_demote.inc | 11 mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_extra_col_master.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_parallel_29322.inc | 11 mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_shutdown_wait_slaves.inc | 5 mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_start_stop_slave.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_stop_middle_group.test | 7 mariadb-10.11.9/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result | 3 mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup.result | 8 mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup_lsu_off.result | 8 mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup_slave_binlog_off.result | 8 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_auditing.result | 64 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_loaddata.result | 38 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_row.result | 51 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_dump_slave_gtid_state_info.result | 7 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result | 44 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_change_master.result | 5 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_change_master_demote.result | 28 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_circular_semi_sync.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_connection.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_deadlock_show_slave_status.result | 66 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_delayed_slave.result | 3 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_io_crash.result | 35 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_master_crash.result | 6 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_restart.result | 3 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result | 10 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result | 10 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_fail_register.result | 5 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_get_lock.result | 3 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gis_user_var.result | 21 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_basic.result | 13 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_crash.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_errorlog.result | 5 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_grouping.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_header_valid.result | 146 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_mdev4820.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_slave_filtering.result | 78 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_startpos.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat.result | 7 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat_debug.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_invoked_features.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mariadb_slave_capability.result | 5 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mark_optimize_tbl_ddl.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev33798.result | 143 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev382.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev_17614.result | 6 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_memory_engine_truncate_on_restart.result | 39 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mysql_manager_race_condition.result | 31 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mysqldump_gtid_slave_pos.result | 150 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_packet.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_ignored_errors.result | 3 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_kill.result | 6 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_missed_error_handling.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_multi_domain_xa.result | 58 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result | 3 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa_lsu_off.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_retry.result | 22 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_sbm.result | 9 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_seq.result | 10 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_slave_bgc_kill.result | 8 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_stop_slave.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_temptable.result | 18 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_perfschema_connect_config.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_rewrite_db_sys_vars.result | 20 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_big_table_id.result | 12 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_corruption.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_find_row_debug.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_idempotency.result | 16 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_until.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result | 8 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync.result | 13 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync.result | 13 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync_row.result | 13 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_cond_var_per_thd.result | 35 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_event.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_event_after_sync.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_fail_over.result | 62 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_master_shutdown.result | 11 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_no_missed_ack_after_add_slave.result | 48 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_shutdown_await_ack.result | 275 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_slave_enabled_consistent.result | 38 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_slave_reply_fail.result | 7 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semisync_ali_issues.result | 11 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_session_var.result | 11 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_session_var2.result | 69 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_show_slave_status.result | 75 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_shutdown_sighup.result | 50 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_skip_error.result | 25 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_load_tmpdir_not_exist.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_restart_long_password.result | 28 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_status.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_sql_thd_start_errno_cleared.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_ssl1.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_1.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_2.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_3.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_4.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_5.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_6.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_7.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_8.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_options.result | 14 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result | 3 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_start_stop_slave.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result | 4 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stop_slave_error.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result | 64 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_using_gtid_default.result | 5 mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_xa_empty_transaction.result | 82 mariadb-10.11.9/mysql-test/suite/rpl/r/semisync_future-7591.result | 2 mariadb-10.11.9/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/create_or_replace.inc | 7 mariadb-10.11.9/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test | 7 mariadb-10.11.9/mysql-test/suite/rpl/t/parallel_backup_xa.inc | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_auditing.test | 77 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_loaddata.test | 47 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_row.test | 61 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_dump_slave_gtid_state_info.test | 11 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_change_master.test | 5 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_change_master_demote.test | 62 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_checksum.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_circular_semi_sync.test | 11 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_connection.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_deadlock_show_slave_status.test | 121 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_delayed_slave.test | 6 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_io_crash.test | 75 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_master_crash.test | 27 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_restart.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_fail_register.test | 9 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_get_lock.test | 15 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gis_user_var.test | 18 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_basic.test | 7 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash-slave.opt | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash_myisam.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_errorlog.test | 6 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_grouping.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_header_valid.test | 213 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.cnf | 28 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.test | 109 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_startpos.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test | 20 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat.test | 8 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat_basic.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test | 11 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_invoked_features.test | 9 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test | 15 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev12179.test | 20 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev33798.cnf | 17 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev33798.test | 182 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev_17614.test | 6 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_memory_engine_truncate_on_restart.test | 82 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mysql_manager_race_condition.test | 64 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mysqldump_gtid_slave_pos.test | 138 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_packet.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_ignored_errors.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_missed_error_handling.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_multi_domain_xa.test | 181 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_optimistic_xa.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_retry.test | 39 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_sbm.test | 16 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_seq.test | 18 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_slave_bgc_kill.test | 10 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_stop_slave.test | 23 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_temptable.test | 24 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_coordinator.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_worker.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_relay_max_extension.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_rewrite_db_sys_vars.test | 22 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_corruption.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_find_row_debug.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_idempotency.test | 31 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_until.test | 7 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test | 10 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync.test | 20 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.cnf | 10 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.test | 80 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_crash.inc | 30 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_event.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_fail_over.test | 13 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_master_shutdown.test | 21 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.cnf | 12 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test | 126 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.cnf | 6 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.inc | 102 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.test | 187 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_compressed_protocol.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_enabled_consistent.test | 76 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_reply_fail.test | 7 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semisync_ali_issues.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var.test | 6 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2-master.opt | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2-slave.opt | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_show_slave_status.test | 27 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_shutdown_sighup.test | 154 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_shutdown_wait_semisync_slaves.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_skip_error.test | 42 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_restart_long_password.test | 80 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_status.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_sql_thd_start_errno_cleared.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_ssl1.test | 6 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_1.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_2.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_3.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_4.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_5.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_6.test | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_7.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_8.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test | 5 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test | 10 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_stop_slave_error.test | 15 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_sync.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2.test | 9 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all-slave.opt | 1 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all.test | 3 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_errors.test | 4 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_using_gtid_default.test | 6 mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_xa_empty_transaction.test | 131 mariadb-10.11.9/mysql-test/suite/rpl/t/semisync_future-7591.test | 2 mariadb-10.11.9/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test | 6 mariadb-10.11.9/mysql-test/suite/s3/amazon.result | 10 mariadb-10.11.9/mysql-test/suite/s3/amazon.test | 18 mariadb-10.11.9/mysql-test/suite/s3/debug.result | 32 mariadb-10.11.9/mysql-test/suite/s3/debug.test | 34 mariadb-10.11.9/mysql-test/suite/s3/mysqldump.result | 2 mariadb-10.11.9/mysql-test/suite/s3/partition.result | 2 mariadb-10.11.9/mysql-test/suite/sql_sequence/alter.result | 58 mariadb-10.11.9/mysql-test/suite/sql_sequence/alter.test | 45 mariadb-10.11.9/mysql-test/suite/sql_sequence/mysqldump.result | 21 mariadb-10.11.9/mysql-test/suite/sys_vars/r/debug_basic.result | 2 mariadb-10.11.9/mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result | 31 mariadb-10.11.9/mysql-test/suite/sys_vars/r/innodb_fil_make_page_dirty_debug_basic.result | 5 mariadb-10.11.9/mysql-test/suite/sys_vars/r/innodb_saved_page_number_debug_basic.result | 1 mariadb-10.11.9/mysql-test/suite/sys_vars/r/old_mode_basic.result | 4 mariadb-10.11.9/mysql-test/suite/sys_vars/r/old_passwords_func.result | 6 mariadb-10.11.9/mysql-test/suite/sys_vars/r/pseudo_slave_mode_notembedded.result | 14 mariadb-10.11.9/mysql-test/suite/sys_vars/r/replicate_rewrite_db.result | 8 mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_basic.result | 20 mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_func.result | 6 mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_grant.result | 6 mariadb-10.11.9/mysql-test/suite/sys_vars/r/slave_transaction_retry_errors.result | 10 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_debug.result | 2 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff | 77 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_innodb.result | 52 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff | 161 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result | 28 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff | 177 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,win.rdiff | 1465 mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result | 30 mariadb-10.11.9/mysql-test/suite/sys_vars/t/allow_suspicious_udfs.test | 4 mariadb-10.11.9/mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test | 29 mariadb-10.11.9/mysql-test/suite/sys_vars/t/innodb_fil_make_page_dirty_debug_basic.test | 4 mariadb-10.11.9/mysql-test/suite/sys_vars/t/innodb_saved_page_number_debug_basic.test | 1 mariadb-10.11.9/mysql-test/suite/sys_vars/t/old_mode_basic.test | 2 mariadb-10.11.9/mysql-test/suite/sys_vars/t/pseudo_slave_mode_notembedded.test | 20 mariadb-10.11.9/mysql-test/suite/sys_vars/t/replicate_rewrite_db.test | 7 mariadb-10.11.9/mysql-test/suite/sys_vars/t/sysvars_star.test | 4 mariadb-10.11.9/mysql-test/suite/sysschema/t/fn_ps_thread_trx_info.test | 2 mariadb-10.11.9/mysql-test/suite/vcol/r/func_regexp.result | 24 mariadb-10.11.9/mysql-test/suite/vcol/r/partition.result | 22 mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_keys_myisam.result | 37 mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_syntax.result | 10 mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_utf32.result | 37 mariadb-10.11.9/mysql-test/suite/vcol/t/func_regexp.test | 30 mariadb-10.11.9/mysql-test/suite/vcol/t/partition.test | 21 mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_keys_myisam.test | 29 mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_syntax.test | 10 mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_utf32.test | 18 mariadb-10.11.9/mysql-test/suite/versioning/r/alter.result | 71 mariadb-10.11.9/mysql-test/suite/versioning/r/data.result | 6 mariadb-10.11.9/mysql-test/suite/versioning/r/delete_history.result | 4 mariadb-10.11.9/mysql-test/suite/versioning/r/partition,heap.rdiff | 18 mariadb-10.11.9/mysql-test/suite/versioning/r/partition.result | 33 mariadb-10.11.9/mysql-test/suite/versioning/r/select.result | 11 mariadb-10.11.9/mysql-test/suite/versioning/t/alter.test | 76 mariadb-10.11.9/mysql-test/suite/versioning/t/delete_history.test | 4 mariadb-10.11.9/mysql-test/suite/versioning/t/partition.test | 38 mariadb-10.11.9/mysql-test/suite/versioning/t/select.test | 12 mariadb-10.11.9/mysql-test/suite/wsrep/disabled.def | 4 mariadb-10.11.9/mysql-test/suite/wsrep/r/MDEV-22443.result | 3 mariadb-10.11.9/mysql-test/suite/wsrep/r/MDEV-23092.result | 13 mariadb-10.11.9/mysql-test/suite/wsrep/r/mdev_6832.result | 11 mariadb-10.11.9/mysql-test/suite/wsrep/r/wsrep_variables_no_provider.result | 44 mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-22443.cnf | 8 mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-22443.test | 12 mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-23092.cnf | 8 mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-23092.test | 22 mariadb-10.11.9/mysql-test/suite/wsrep/t/mdev_6832.cnf | 7 mariadb-10.11.9/mysql-test/suite/wsrep/t/mdev_6832.test | 17 mariadb-10.11.9/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.cnf | 12 mariadb-10.11.9/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.test | 38 mariadb-10.11.9/mysql-test/valgrind.supp | 19 mariadb-10.11.9/mysys/CMakeLists.txt | 34 mariadb-10.11.9/mysys/crc32/crc32_arm64.c | 344 mariadb-10.11.9/mysys/crc32/crc32_x86.c | 16 mariadb-10.11.9/mysys/crc32/crc32c.cc | 263 mariadb-10.11.9/mysys/crc32/crc32c_amd64.cc | 12 mariadb-10.11.9/mysys/crc32/crc32c_ppc.h | 3 mariadb-10.11.9/mysys/crc32/crc32c_x86.cc | 470 mariadb-10.11.9/mysys/crc32/crc_ppc64.h | 7 mariadb-10.11.9/mysys/crc32ieee.cc | 19 mariadb-10.11.9/mysys/errors.c | 9 mariadb-10.11.9/mysys/lf_alloc-pin.c | 197 mariadb-10.11.9/mysys/ma_dyncol.c | 17 mariadb-10.11.9/mysys/mf_tempfile.c | 37 mariadb-10.11.9/mysys/my_alloc.c | 54 mariadb-10.11.9/mysys/my_bitmap.c | 657 mariadb-10.11.9/mysys/my_getopt.c | 84 mariadb-10.11.9/mysys/my_rdtsc.c | 15 mariadb-10.11.9/mysys/my_thr_init.c | 8 mariadb-10.11.9/mysys/safemalloc.c | 12 mariadb-10.11.9/mysys/thr_alarm.c | 1 mariadb-10.11.9/mysys/thr_lock.c | 3 mariadb-10.11.9/mysys/thr_mutex.c | 59 mariadb-10.11.9/mysys/thr_rwlock.c | 171 mariadb-10.11.9/mysys/thr_timer.c | 1 mariadb-10.11.9/mysys/waiting_threads.c | 4 mariadb-10.11.9/mysys_ssl/my_crypt.cc | 16 mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_mul.c | 21 mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_sq.c | 21 mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_sq2.c | 21 mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_tobytes.c | 37 mariadb-10.11.9/plugin/auth_ed25519/ref10/ge_scalarmult_base.c | 2 mariadb-10.11.9/plugin/auth_ed25519/ref10/sc_muladd.c | 46 mariadb-10.11.9/plugin/auth_ed25519/ref10/sc_reduce.c | 34 mariadb-10.11.9/plugin/auth_gssapi/README.md | 10 mariadb-10.11.9/plugin/auth_pam/auth_pam.c | 1 mariadb-10.11.9/plugin/auth_pam/auth_pam_base.c | 2 mariadb-10.11.9/plugin/auth_pam/testing/pam_mariadb_mtr.c | 2 mariadb-10.11.9/plugin/aws_key_management/aws_key_management_plugin.cc | 6 mariadb-10.11.9/plugin/cracklib_password_check/CMakeLists.txt | 3 mariadb-10.11.9/plugin/disks/CMakeLists.txt | 5 mariadb-10.11.9/plugin/disks/information_schema_disks.cc | 12 mariadb-10.11.9/plugin/disks/mysql-test/disks/disks.result | 4 mariadb-10.11.9/plugin/disks/mysql-test/disks/disks.test | 2 mariadb-10.11.9/plugin/disks/mysql-test/disks/disks_notembedded.result | 8 mariadb-10.11.9/plugin/disks/mysql-test/disks/disks_notembedded.test | 4 mariadb-10.11.9/plugin/feedback/CMakeLists.txt | 2 mariadb-10.11.9/plugin/feedback/feedback.cc | 15 mariadb-10.11.9/plugin/feedback/feedback.h | 4 mariadb-10.11.9/plugin/feedback/sender_thread.cc | 4 mariadb-10.11.9/plugin/feedback/url_http.cc | 24 mariadb-10.11.9/plugin/feedback/utils.cc | 27 mariadb-10.11.9/plugin/file_key_management/parser.cc | 2 mariadb-10.11.9/plugin/func_test/plugin.cc | 2 mariadb-10.11.9/plugin/handler_socket/handlersocket/database.cpp | 38 mariadb-10.11.9/plugin/handler_socket/handlersocket/hstcpsvr.cpp | 4 mariadb-10.11.9/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp | 20 mariadb-10.11.9/plugin/handler_socket/libhsclient/hstcpcli.cpp | 28 mariadb-10.11.9/plugin/hashicorp_key_management/CMakeLists.txt | 7 mariadb-10.11.9/plugin/hashicorp_key_management/hashicorp_key_management_plugin.cc | 108 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/suite.pm | 4 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_cache_after_recreate.test | 2 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_check_kv_version.test | 6 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_migration.test | 2 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_rotation_age.test | 2 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.opt | 1 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.test | 6 mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_url_prefix.test | 4 mariadb-10.11.9/plugin/metadata_lock_info/metadata_lock_info.cc | 49 mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/global_read_lock.result | 14 mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/table_metadata_lock.result | 14 mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/user_lock.result | 14 mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/global_read_lock.test | 6 mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/table_metadata_lock.test | 6 mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/user_lock.test | 6 mariadb-10.11.9/plugin/qc_info/CMakeLists.txt | 2 mariadb-10.11.9/plugin/sql_errlog/sql_errlog.c | 45 mariadb-10.11.9/plugin/test_sql_service/CMakeLists.txt | 2 mariadb-10.11.9/plugin/test_sql_service/test_sql_service.c | 3 mariadb-10.11.9/plugin/type_inet/item_inetfunc.h | 18 mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result | 2 mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6.result | 87 mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6.test | 37 mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.result | 2 mariadb-10.11.9/plugin/type_inet/plugin.cc | 16 mariadb-10.11.9/plugin/type_inet/sql_type_inet.cc | 2 mariadb-10.11.9/plugin/type_mysql_json/type.cc | 17 mariadb-10.11.9/plugin/type_mysql_timestamp/plugin.cc | 14 mariadb-10.11.9/plugin/type_test/mysql-test/type_test/type_test_double.result | 2 mariadb-10.11.9/plugin/type_test/mysql-test/type_test/type_test_int8.result | 2 mariadb-10.11.9/plugin/type_uuid/item_uuidfunc.h | 4 mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result | 2 mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.result | 422 mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.test | 110 mariadb-10.11.9/plugin/type_uuid/plugin.cc | 12 mariadb-10.11.9/plugin/type_uuid/sql_type_uuid.h | 3 mariadb-10.11.9/plugin/user_variables/user_variables.cc | 6 mariadb-10.11.9/plugin/versioning/versioning.cc | 16 mariadb-10.11.9/scripts/CMakeLists.txt | 1 mariadb-10.11.9/scripts/mysql_install_db.sh | 46 mariadb-10.11.9/scripts/mysql_secure_installation.sh | 4 mariadb-10.11.9/scripts/mysql_setpermission.sh | 8 mariadb-10.11.9/scripts/mysql_system_tables_fix.sql | 14 mariadb-10.11.9/scripts/mysqlhotcopy.sh | 41 mariadb-10.11.9/scripts/mytop.sh | 7 mariadb-10.11.9/scripts/sys_schema/before_setup.sql | 7 mariadb-10.11.9/scripts/wsrep_sst_common.sh | 253 mariadb-10.11.9/scripts/wsrep_sst_mariabackup.sh | 103 mariadb-10.11.9/scripts/wsrep_sst_mysqldump.sh | 6 mariadb-10.11.9/scripts/wsrep_sst_rsync.sh | 54 mariadb-10.11.9/sql-common/client.c | 14 mariadb-10.11.9/sql-common/my_time.c | 20 mariadb-10.11.9/sql/CMakeLists.txt | 5 mariadb-10.11.9/sql/backup.cc | 60 mariadb-10.11.9/sql/ddl_log.cc | 8 mariadb-10.11.9/sql/debug.cc | 3 mariadb-10.11.9/sql/debug_sync.cc | 2 mariadb-10.11.9/sql/des_key_file.cc | 4 mariadb-10.11.9/sql/des_key_file.h | 4 mariadb-10.11.9/sql/event_data_objects.cc | 4 mariadb-10.11.9/sql/event_data_objects.h | 6 mariadb-10.11.9/sql/event_queue.cc | 1 mariadb-10.11.9/sql/field.cc | 178 mariadb-10.11.9/sql/field.h | 78 mariadb-10.11.9/sql/filesort.h | 7 mariadb-10.11.9/sql/gcalc_slicescan.cc | 2 mariadb-10.11.9/sql/gcalc_tools.h | 20 mariadb-10.11.9/sql/ha_handler_stats.h | 18 mariadb-10.11.9/sql/ha_partition.cc | 156 mariadb-10.11.9/sql/ha_partition.h | 15 mariadb-10.11.9/sql/ha_sequence.cc | 27 mariadb-10.11.9/sql/ha_sequence.h | 66 mariadb-10.11.9/sql/handler.cc | 235 mariadb-10.11.9/sql/handler.h | 40 mariadb-10.11.9/sql/hostname.cc | 18 mariadb-10.11.9/sql/item.cc | 416 mariadb-10.11.9/sql/item.h | 474 mariadb-10.11.9/sql/item_cmpfunc.cc | 157 mariadb-10.11.9/sql/item_cmpfunc.h | 312 mariadb-10.11.9/sql/item_create.cc | 1236 mariadb-10.11.9/sql/item_create.h | 8 mariadb-10.11.9/sql/item_func.cc | 279 mariadb-10.11.9/sql/item_func.h | 435 mariadb-10.11.9/sql/item_geofunc.cc | 108 mariadb-10.11.9/sql/item_geofunc.h | 122 mariadb-10.11.9/sql/item_jsonfunc.cc | 217 mariadb-10.11.9/sql/item_jsonfunc.h | 80 mariadb-10.11.9/sql/item_row.cc | 2 mariadb-10.11.9/sql/item_row.h | 4 mariadb-10.11.9/sql/item_strfunc.cc | 164 mariadb-10.11.9/sql/item_strfunc.h | 410 mariadb-10.11.9/sql/item_subselect.cc | 84 mariadb-10.11.9/sql/item_subselect.h | 153 mariadb-10.11.9/sql/item_sum.cc | 39 mariadb-10.11.9/sql/item_sum.h | 109 mariadb-10.11.9/sql/item_timefunc.cc | 69 mariadb-10.11.9/sql/item_timefunc.h | 183 mariadb-10.11.9/sql/item_vers.h | 8 mariadb-10.11.9/sql/item_windowfunc.h | 28 mariadb-10.11.9/sql/item_xmlfunc.cc | 40 mariadb-10.11.9/sql/item_xmlfunc.h | 4 mariadb-10.11.9/sql/json_table.cc | 2 mariadb-10.11.9/sql/key.cc | 40 mariadb-10.11.9/sql/keycaches.cc | 2 mariadb-10.11.9/sql/lex.h | 7 mariadb-10.11.9/sql/lex_charset.h | 6 mariadb-10.11.9/sql/lex_ident.h | 85 mariadb-10.11.9/sql/log.cc | 193 mariadb-10.11.9/sql/log.h | 89 mariadb-10.11.9/sql/log_event.cc | 170 mariadb-10.11.9/sql/log_event.h | 615 mariadb-10.11.9/sql/log_event_client.cc | 55 mariadb-10.11.9/sql/log_event_data_type.h | 74 mariadb-10.11.9/sql/log_event_old.cc | 102 mariadb-10.11.9/sql/log_event_old.h | 100 mariadb-10.11.9/sql/log_event_server.cc | 305 mariadb-10.11.9/sql/mdl.cc | 67 mariadb-10.11.9/sql/mdl.h | 26 mariadb-10.11.9/sql/multi_range_read.h | 40 mariadb-10.11.9/sql/my_json_writer.cc | 14 mariadb-10.11.9/sql/mysql_install_db.cc | 5 mariadb-10.11.9/sql/mysqld.cc | 467 mariadb-10.11.9/sql/mysqld.h | 41 mariadb-10.11.9/sql/net_serv.cc | 85 mariadb-10.11.9/sql/opt_range.cc | 304 mariadb-10.11.9/sql/opt_range.h | 187 mariadb-10.11.9/sql/opt_split.cc | 5 mariadb-10.11.9/sql/opt_subselect.cc | 6 mariadb-10.11.9/sql/opt_table_elimination.cc | 24 mariadb-10.11.9/sql/opt_trace.cc | 3 mariadb-10.11.9/sql/parse_file.h | 4 mariadb-10.11.9/sql/partition_info.cc | 6 mariadb-10.11.9/sql/procedure.h | 6 mariadb-10.11.9/sql/protocol.cc | 1 mariadb-10.11.9/sql/protocol.h | 6 mariadb-10.11.9/sql/repl_failsafe.cc | 2 mariadb-10.11.9/sql/rowid_filter.h | 14 mariadb-10.11.9/sql/rpl_filter.cc | 7 mariadb-10.11.9/sql/rpl_filter.h | 1 mariadb-10.11.9/sql/rpl_gtid.cc | 17 mariadb-10.11.9/sql/rpl_gtid.h | 40 mariadb-10.11.9/sql/rpl_mi.cc | 5 mariadb-10.11.9/sql/rpl_mi.h | 16 mariadb-10.11.9/sql/rpl_parallel.cc | 334 mariadb-10.11.9/sql/rpl_parallel.h | 62 mariadb-10.11.9/sql/rpl_rli.cc | 9 mariadb-10.11.9/sql/rpl_rli.h | 15 mariadb-10.11.9/sql/semisync_master.cc | 455 mariadb-10.11.9/sql/semisync_master.h | 119 mariadb-10.11.9/sql/semisync_master_ack_receiver.cc | 143 mariadb-10.11.9/sql/semisync_master_ack_receiver.h | 187 mariadb-10.11.9/sql/semisync_slave.cc | 168 mariadb-10.11.9/sql/semisync_slave.h | 22 mariadb-10.11.9/sql/service_wsrep.cc | 70 mariadb-10.11.9/sql/session_tracker.h | 20 mariadb-10.11.9/sql/set_var.h | 32 mariadb-10.11.9/sql/share/errmsg-utf8.txt | 42 mariadb-10.11.9/sql/signal_handler.cc | 1 mariadb-10.11.9/sql/slave.cc | 181 mariadb-10.11.9/sql/socketpair.c | 156 mariadb-10.11.9/sql/socketpair.h | 21 mariadb-10.11.9/sql/sp.cc | 48 mariadb-10.11.9/sql/sp.h | 108 mariadb-10.11.9/sql/sp_cache.cc | 22 mariadb-10.11.9/sql/sp_head.cc | 9 mariadb-10.11.9/sql/sp_head.h | 204 mariadb-10.11.9/sql/spatial.h | 222 mariadb-10.11.9/sql/sql_acl.cc | 342 mariadb-10.11.9/sql/sql_acl.h | 8 mariadb-10.11.9/sql/sql_admin.cc | 14 mariadb-10.11.9/sql/sql_admin.h | 16 mariadb-10.11.9/sql/sql_alter.cc | 22 mariadb-10.11.9/sql/sql_alter.h | 12 mariadb-10.11.9/sql/sql_analyse.cc | 7 mariadb-10.11.9/sql/sql_analyse.h | 82 mariadb-10.11.9/sql/sql_array.h | 12 mariadb-10.11.9/sql/sql_base.cc | 227 mariadb-10.11.9/sql/sql_base.h | 59 mariadb-10.11.9/sql/sql_binlog.cc | 5 mariadb-10.11.9/sql/sql_bootstrap.cc | 31 mariadb-10.11.9/sql/sql_cache.cc | 9 mariadb-10.11.9/sql/sql_class.cc | 266 mariadb-10.11.9/sql/sql_class.h | 531 mariadb-10.11.9/sql/sql_cmd.h | 16 mariadb-10.11.9/sql/sql_connect.cc | 15 mariadb-10.11.9/sql/sql_cte.cc | 42 mariadb-10.11.9/sql/sql_cte.h | 6 mariadb-10.11.9/sql/sql_cursor.cc | 18 mariadb-10.11.9/sql/sql_db.cc | 3 mariadb-10.11.9/sql/sql_delete.cc | 13 mariadb-10.11.9/sql/sql_derived.cc | 22 mariadb-10.11.9/sql/sql_explain.cc | 62 mariadb-10.11.9/sql/sql_explain.h | 97 mariadb-10.11.9/sql/sql_expression_cache.cc | 3 mariadb-10.11.9/sql/sql_expression_cache.h | 12 mariadb-10.11.9/sql/sql_get_diagnostics.h | 8 mariadb-10.11.9/sql/sql_handler.cc | 7 mariadb-10.11.9/sql/sql_help.cc | 3 mariadb-10.11.9/sql/sql_insert.cc | 173 mariadb-10.11.9/sql/sql_join_cache.cc | 1 mariadb-10.11.9/sql/sql_join_cache.h | 92 mariadb-10.11.9/sql/sql_lex.cc | 466 mariadb-10.11.9/sql/sql_lex.h | 93 mariadb-10.11.9/sql/sql_lifo_buffer.h | 44 mariadb-10.11.9/sql/sql_list.h | 25 mariadb-10.11.9/sql/sql_load.cc | 43 mariadb-10.11.9/sql/sql_locale.cc | 4 mariadb-10.11.9/sql/sql_manager.cc | 33 mariadb-10.11.9/sql/sql_parse.cc | 392 mariadb-10.11.9/sql/sql_partition.cc | 21 mariadb-10.11.9/sql/sql_partition_admin.h | 26 mariadb-10.11.9/sql/sql_plugin.cc | 35 mariadb-10.11.9/sql/sql_plugin_services.inl | 25 mariadb-10.11.9/sql/sql_prepare.cc | 65 mariadb-10.11.9/sql/sql_priv.h | 13 mariadb-10.11.9/sql/sql_profile.cc | 7 mariadb-10.11.9/sql/sql_profile.h | 8 mariadb-10.11.9/sql/sql_reload.cc | 25 mariadb-10.11.9/sql/sql_repl.cc | 160 mariadb-10.11.9/sql/sql_repl.h | 2 mariadb-10.11.9/sql/sql_schema.cc | 37 mariadb-10.11.9/sql/sql_schema.h | 22 mariadb-10.11.9/sql/sql_select.cc | 557 mariadb-10.11.9/sql/sql_select.h | 38 mariadb-10.11.9/sql/sql_sequence.cc | 8 mariadb-10.11.9/sql/sql_servers.cc | 9 mariadb-10.11.9/sql/sql_show.cc | 58 mariadb-10.11.9/sql/sql_signal.h | 8 mariadb-10.11.9/sql/sql_statistics.cc | 14 mariadb-10.11.9/sql/sql_string.cc | 47 mariadb-10.11.9/sql/sql_string.h | 38 mariadb-10.11.9/sql/sql_table.cc | 379 mariadb-10.11.9/sql/sql_table.h | 4 mariadb-10.11.9/sql/sql_test.cc | 17 mariadb-10.11.9/sql/sql_time.cc | 16 mariadb-10.11.9/sql/sql_trigger.cc | 21 mariadb-10.11.9/sql/sql_truncate.h | 4 mariadb-10.11.9/sql/sql_tvc.cc | 9 mariadb-10.11.9/sql/sql_type.cc | 258 mariadb-10.11.9/sql/sql_type.h | 97 mariadb-10.11.9/sql/sql_type_fixedbin.h | 72 mariadb-10.11.9/sql/sql_type_geom.h | 7 mariadb-10.11.9/sql/sql_udf.h | 14 mariadb-10.11.9/sql/sql_union.cc | 37 mariadb-10.11.9/sql/sql_update.cc | 18 mariadb-10.11.9/sql/sql_view.cc | 8 mariadb-10.11.9/sql/sql_window.cc | 143 mariadb-10.11.9/sql/sql_window.h | 2 mariadb-10.11.9/sql/sql_yacc.yy | 340 mariadb-10.11.9/sql/structs.h | 7 mariadb-10.11.9/sql/sys_vars.cc | 102 mariadb-10.11.9/sql/sys_vars.inl | 469 mariadb-10.11.9/sql/sys_vars_shared.h | 12 mariadb-10.11.9/sql/table.cc | 162 mariadb-10.11.9/sql/table.h | 104 mariadb-10.11.9/sql/table_cache.cc | 28 mariadb-10.11.9/sql/table_cache.h | 4 mariadb-10.11.9/sql/temporary_tables.cc | 29 mariadb-10.11.9/sql/threadpool.h | 28 mariadb-10.11.9/sql/threadpool_generic.cc | 4 mariadb-10.11.9/sql/threadpool_win.cc | 9 mariadb-10.11.9/sql/transaction.cc | 35 mariadb-10.11.9/sql/tztime.cc | 38 mariadb-10.11.9/sql/unireg.cc | 10 mariadb-10.11.9/sql/unireg.h | 2 mariadb-10.11.9/sql/winmain.cc | 20 mariadb-10.11.9/sql/wsrep_applier.cc | 18 mariadb-10.11.9/sql/wsrep_client_service.cc | 10 mariadb-10.11.9/sql/wsrep_client_service.h | 46 mariadb-10.11.9/sql/wsrep_condition_variable.h | 6 mariadb-10.11.9/sql/wsrep_dummy.cc | 2 mariadb-10.11.9/sql/wsrep_high_priority_service.cc | 5 mariadb-10.11.9/sql/wsrep_high_priority_service.h | 52 mariadb-10.11.9/sql/wsrep_mutex.h | 6 mariadb-10.11.9/sql/wsrep_mysqld.cc | 217 mariadb-10.11.9/sql/wsrep_mysqld.h | 18 mariadb-10.11.9/sql/wsrep_notify.cc | 2 mariadb-10.11.9/sql/wsrep_plugin.cc | 16 mariadb-10.11.9/sql/wsrep_schema.cc | 342 mariadb-10.11.9/sql/wsrep_server_service.cc | 27 mariadb-10.11.9/sql/wsrep_server_service.h | 44 mariadb-10.11.9/sql/wsrep_sst.cc | 11 mariadb-10.11.9/sql/wsrep_storage_service.h | 18 mariadb-10.11.9/sql/wsrep_thd.cc | 4 mariadb-10.11.9/sql/wsrep_thd.h | 2 mariadb-10.11.9/sql/wsrep_trans_observer.h | 8 mariadb-10.11.9/sql/xa.cc | 66 mariadb-10.11.9/sql/xa.h | 1 mariadb-10.11.9/sql/yy_mariadb.cc |52203 ++++++++ mariadb-10.11.9/sql/yy_mariadb.hh | 981 mariadb-10.11.9/sql/yy_oracle.cc |52286 ++++++++ mariadb-10.11.9/sql/yy_oracle.hh | 981 mariadb-10.11.9/storage/archive/CMakeLists.txt | 2 mariadb-10.11.9/storage/archive/ha_archive.cc | 18 mariadb-10.11.9/storage/archive/ha_archive.h | 84 mariadb-10.11.9/storage/blackhole/ha_blackhole.h | 56 mariadb-10.11.9/storage/columnstore/CMakeLists.txt | 3 mariadb-10.11.9/storage/columnstore/columnstore/CMakeLists.txt | 1 mariadb-10.11.9/storage/columnstore/columnstore/VERSION | 2 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_double.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_float128.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int128.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int128.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int64.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_longdouble.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt | 2 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h | 5 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt | 2 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h | 5 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h | 5 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/elementtype.h | 17 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/fifo.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblist.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jobstep.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h | 41 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs.h | 17 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_impl_if.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h | 7 mariadb-10.11.9/storage/columnstore/columnstore/ddlproc/ddlproc.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlproc.cpp | 10 mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlprocessor.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/exemgr/activestatementcounter.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/exemgr/main.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp | 2 mariadb-10.11.9/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/filerequest.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/iomanager.h | 5 mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/column.cpp | 9 mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/index.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/columncommand.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/primproc.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/udf.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/MetadataFile.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/S3Storage.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/smcat.cpp | 2 mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp | 4 mariadb-10.11.9/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/clearShm/main.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/editem/editem.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/passwd/secrets.cpp | 17 mariadb-10.11.9/storage/columnstore/columnstore/tools/qfe/server.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/tools/setConfig/main.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/cloudio/SocketPool.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/common/hashfamily.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/common/mcs_basic_types.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/common/simd_sse.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/compress/idbcompress.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configcpp.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configstream.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configstream.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/xmlparser.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_between.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_case.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_char.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_day.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_div.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_if.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_in.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_least.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_left.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_length.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_math.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_month.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_right.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_round.cpp | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_second.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_space.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp | 5 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_week.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_year.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/functor.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp | 12 mariadb-10.11.9/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/multicast/multicast.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/regr/regrmysql.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h | 9 mariadb-10.11.9/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/rwlock/rwlock.h | 15 mariadb-10.11.9/storage/columnstore/columnstore/utils/startup/installdir.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/startup/installdir.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/testbc/iomanager.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/testbc/iomanager.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/framebound.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_count.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowframe.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp | 5 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/client/we_clients.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/client/we_clients.h | 5 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h | 2 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h | 4 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp | 1 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h | 3 mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp | 1 mariadb-10.11.9/storage/connect/CMakeLists.txt | 2 mariadb-10.11.9/storage/connect/array.h | 24 mariadb-10.11.9/storage/connect/blkfil.h | 36 mariadb-10.11.9/storage/connect/cmgfam.h | 6 mariadb-10.11.9/storage/connect/colblk.h | 59 mariadb-10.11.9/storage/connect/domdoc.h | 2 mariadb-10.11.9/storage/connect/filamap.h | 76 mariadb-10.11.9/storage/connect/filamdbf.h | 42 mariadb-10.11.9/storage/connect/filamfix.h | 50 mariadb-10.11.9/storage/connect/filamgz.h | 100 mariadb-10.11.9/storage/connect/filamtxt.h | 88 mariadb-10.11.9/storage/connect/filamvct.h | 124 mariadb-10.11.9/storage/connect/filamzip.h | 64 mariadb-10.11.9/storage/connect/filter.h | 40 mariadb-10.11.9/storage/connect/ha_connect.cc | 9 mariadb-10.11.9/storage/connect/ha_connect.h | 106 mariadb-10.11.9/storage/connect/ioapi.h | 2 mariadb-10.11.9/storage/connect/jdbconn.h | 8 mariadb-10.11.9/storage/connect/jmgfam.h | 48 mariadb-10.11.9/storage/connect/jmgoconn.h | 6 mariadb-10.11.9/storage/connect/json.h | 62 mariadb-10.11.9/storage/connect/libdoc.cpp | 113 mariadb-10.11.9/storage/connect/mongo.h | 6 mariadb-10.11.9/storage/connect/mycat.h | 6 mariadb-10.11.9/storage/connect/mysql-test/connect/r/drop-open-error.result | 2 mariadb-10.11.9/storage/connect/mysql-test/connect/r/mysql.result | 1 mariadb-10.11.9/storage/connect/mysql-test/connect/t/drop-open-error.test | 3 mariadb-10.11.9/storage/connect/reldef.h | 24 mariadb-10.11.9/storage/connect/tabbson.h | 84 mariadb-10.11.9/storage/connect/tabcmg.h | 46 mariadb-10.11.9/storage/connect/tabcol.h | 26 mariadb-10.11.9/storage/connect/tabdos.h | 92 mariadb-10.11.9/storage/connect/tabext.h | 22 mariadb-10.11.9/storage/connect/tabfix.h | 42 mariadb-10.11.9/storage/connect/tabfmt.h | 60 mariadb-10.11.9/storage/connect/tabjdbc.h | 68 mariadb-10.11.9/storage/connect/tabjmg.h | 46 mariadb-10.11.9/storage/connect/tabjson.h | 84 mariadb-10.11.9/storage/connect/tabmac.h | 28 mariadb-10.11.9/storage/connect/tabmul.cpp | 6 mariadb-10.11.9/storage/connect/tabmul.h | 84 mariadb-10.11.9/storage/connect/tabmysql.h | 76 mariadb-10.11.9/storage/connect/taboccur.h | 32 mariadb-10.11.9/storage/connect/tabodbc.h | 88 mariadb-10.11.9/storage/connect/tabpivot.h | 42 mariadb-10.11.9/storage/connect/tabrest.h | 6 mariadb-10.11.9/storage/connect/tabsys.h | 80 mariadb-10.11.9/storage/connect/tabtbl.h | 40 mariadb-10.11.9/storage/connect/tabutil.h | 50 mariadb-10.11.9/storage/connect/tabvct.cpp | 5 mariadb-10.11.9/storage/connect/tabvct.h | 32 mariadb-10.11.9/storage/connect/tabvir.h | 40 mariadb-10.11.9/storage/connect/tabwmi.h | 26 mariadb-10.11.9/storage/connect/tabxcl.h | 26 mariadb-10.11.9/storage/connect/tabxml.h | 68 mariadb-10.11.9/storage/connect/tabzip.h | 34 mariadb-10.11.9/storage/connect/unzip.c | 12 mariadb-10.11.9/storage/connect/unzip.h | 2 mariadb-10.11.9/storage/connect/valblk.h | 198 mariadb-10.11.9/storage/connect/value.h | 274 mariadb-10.11.9/storage/connect/xindex.h | 106 mariadb-10.11.9/storage/connect/xobject.h | 36 mariadb-10.11.9/storage/connect/xtable.h | 46 mariadb-10.11.9/storage/connect/zip.c | 440 mariadb-10.11.9/storage/connect/zip.h | 310 mariadb-10.11.9/storage/csv/ha_tina.cc | 3 mariadb-10.11.9/storage/csv/ha_tina.h | 56 mariadb-10.11.9/storage/example/ha_example.h | 66 mariadb-10.11.9/storage/federated/ha_federated.cc | 2 mariadb-10.11.9/storage/federated/ha_federated.h | 90 mariadb-10.11.9/storage/federatedx/federatedx_io_mysql.cc | 79 mariadb-10.11.9/storage/federatedx/federatedx_io_null.cc | 68 mariadb-10.11.9/storage/federatedx/federatedx_pushdown.h | 16 mariadb-10.11.9/storage/federatedx/ha_federatedx.cc | 2 mariadb-10.11.9/storage/federatedx/ha_federatedx.h | 90 mariadb-10.11.9/storage/heap/ha_heap.cc | 32 mariadb-10.11.9/storage/heap/ha_heap.h | 104 mariadb-10.11.9/storage/heap/hp_info.c | 6 mariadb-10.11.9/storage/innobase/CMakeLists.txt | 28 mariadb-10.11.9/storage/innobase/btr/btr0btr.cc | 221 mariadb-10.11.9/storage/innobase/btr/btr0bulk.cc | 26 mariadb-10.11.9/storage/innobase/btr/btr0cur.cc | 211 mariadb-10.11.9/storage/innobase/btr/btr0pcur.cc | 218 mariadb-10.11.9/storage/innobase/btr/btr0sea.cc | 1 mariadb-10.11.9/storage/innobase/buf/buf0block_hint.cc | 59 mariadb-10.11.9/storage/innobase/buf/buf0buf.cc | 663 mariadb-10.11.9/storage/innobase/buf/buf0dblwr.cc | 12 mariadb-10.11.9/storage/innobase/buf/buf0dump.cc | 26 mariadb-10.11.9/storage/innobase/buf/buf0flu.cc | 473 mariadb-10.11.9/storage/innobase/buf/buf0lru.cc | 203 mariadb-10.11.9/storage/innobase/buf/buf0rea.cc | 26 mariadb-10.11.9/storage/innobase/dict/dict0boot.cc | 5 mariadb-10.11.9/storage/innobase/dict/dict0crea.cc | 3 mariadb-10.11.9/storage/innobase/dict/dict0dict.cc | 158 mariadb-10.11.9/storage/innobase/dict/dict0load.cc | 84 mariadb-10.11.9/storage/innobase/dict/dict0stats.cc | 46 mariadb-10.11.9/storage/innobase/dict/dict0stats_bg.cc | 52 mariadb-10.11.9/storage/innobase/fil/fil0crypt.cc | 25 mariadb-10.11.9/storage/innobase/fil/fil0fil.cc | 152 mariadb-10.11.9/storage/innobase/fil/fil0pagecompress.cc | 5 mariadb-10.11.9/storage/innobase/fsp/fsp0file.cc | 27 mariadb-10.11.9/storage/innobase/fsp/fsp0fsp.cc | 357 mariadb-10.11.9/storage/innobase/fsp/fsp0sysspace.cc | 64 mariadb-10.11.9/storage/innobase/fts/fts0fts.cc | 227 mariadb-10.11.9/storage/innobase/fts/fts0opt.cc | 2 mariadb-10.11.9/storage/innobase/fts/fts0que.cc | 47 mariadb-10.11.9/storage/innobase/fut/fut0lst.cc | 135 mariadb-10.11.9/storage/innobase/gis/gis0sea.cc | 123 mariadb-10.11.9/storage/innobase/handler/ha_innodb.cc | 1118 mariadb-10.11.9/storage/innobase/handler/ha_innodb.h | 13 mariadb-10.11.9/storage/innobase/handler/handler0alter.cc | 170 mariadb-10.11.9/storage/innobase/handler/i_s.cc | 131 mariadb-10.11.9/storage/innobase/ibuf/ibuf0ibuf.cc | 78 mariadb-10.11.9/storage/innobase/include/btr0btr.h | 21 mariadb-10.11.9/storage/innobase/include/btr0pcur.h | 8 mariadb-10.11.9/storage/innobase/include/buf0block_hint.h | 76 mariadb-10.11.9/storage/innobase/include/buf0buf.h | 101 mariadb-10.11.9/storage/innobase/include/buf0buf.inl | 14 mariadb-10.11.9/storage/innobase/include/buf0dblwr.h | 3 mariadb-10.11.9/storage/innobase/include/buf0flu.h | 10 mariadb-10.11.9/storage/innobase/include/buf0lru.h | 10 mariadb-10.11.9/storage/innobase/include/cache.h | 33 mariadb-10.11.9/storage/innobase/include/data0data.h | 13 mariadb-10.11.9/storage/innobase/include/data0data.inl | 30 mariadb-10.11.9/storage/innobase/include/db0err.h | 12 mariadb-10.11.9/storage/innobase/include/dict0dict.h | 120 mariadb-10.11.9/storage/innobase/include/dict0dict.inl | 50 mariadb-10.11.9/storage/innobase/include/dict0load.h | 16 mariadb-10.11.9/storage/innobase/include/dict0mem.h | 78 mariadb-10.11.9/storage/innobase/include/dict0mem.inl | 1 mariadb-10.11.9/storage/innobase/include/dict0stats.h | 9 mariadb-10.11.9/storage/innobase/include/dyn0buf.h | 9 mariadb-10.11.9/storage/innobase/include/dyn0types.h | 3 mariadb-10.11.9/storage/innobase/include/fil0crypt.h | 5 mariadb-10.11.9/storage/innobase/include/fil0fil.h | 86 mariadb-10.11.9/storage/innobase/include/fsp0fsp.h | 20 mariadb-10.11.9/storage/innobase/include/fts0fts.h | 6 mariadb-10.11.9/storage/innobase/include/fts0priv.h | 21 mariadb-10.11.9/storage/innobase/include/fts0priv.inl | 67 mariadb-10.11.9/storage/innobase/include/fts0types.h | 38 mariadb-10.11.9/storage/innobase/include/fts0types.inl | 47 mariadb-10.11.9/storage/innobase/include/fut0lst.h | 50 mariadb-10.11.9/storage/innobase/include/gis0type.h | 6 mariadb-10.11.9/storage/innobase/include/lock0lock.h | 74 mariadb-10.11.9/storage/innobase/include/log0crypt.h | 3 mariadb-10.11.9/storage/innobase/include/log0log.h | 219 mariadb-10.11.9/storage/innobase/include/log0recv.h | 19 mariadb-10.11.9/storage/innobase/include/mach0data.inl | 5 mariadb-10.11.9/storage/innobase/include/mariadb_stats.h | 66 mariadb-10.11.9/storage/innobase/include/mtr0mtr.h | 35 mariadb-10.11.9/storage/innobase/include/os0file.h | 95 mariadb-10.11.9/storage/innobase/include/os0file.inl | 8 mariadb-10.11.9/storage/innobase/include/row0merge.h | 19 mariadb-10.11.9/storage/innobase/include/row0row.h | 6 mariadb-10.11.9/storage/innobase/include/row0sel.h | 4 mariadb-10.11.9/storage/innobase/include/srv0mon.h | 2 mariadb-10.11.9/storage/innobase/include/srv0srv.h | 16 mariadb-10.11.9/storage/innobase/include/srw_lock.h | 100 mariadb-10.11.9/storage/innobase/include/sux_lock.h | 2 mariadb-10.11.9/storage/innobase/include/trx0purge.h | 234 mariadb-10.11.9/storage/innobase/include/trx0rseg.h | 17 mariadb-10.11.9/storage/innobase/include/trx0sys.h | 64 mariadb-10.11.9/storage/innobase/include/trx0trx.h | 36 mariadb-10.11.9/storage/innobase/include/trx0undo.inl | 3 mariadb-10.11.9/storage/innobase/include/ut0counter.h | 26 mariadb-10.11.9/storage/innobase/include/ut0new.h | 3 mariadb-10.11.9/storage/innobase/include/ut0ut.h | 14 mariadb-10.11.9/storage/innobase/include/ut0vec.h | 9 mariadb-10.11.9/storage/innobase/include/ut0vec.inl | 13 mariadb-10.11.9/storage/innobase/lock/lock0lock.cc | 676 mariadb-10.11.9/storage/innobase/log/log0log.cc | 237 mariadb-10.11.9/storage/innobase/log/log0recv.cc | 294 mariadb-10.11.9/storage/innobase/log/log0sync.cc | 2 mariadb-10.11.9/storage/innobase/mtr/mtr0mtr.cc | 604 mariadb-10.11.9/storage/innobase/os/os0file.cc | 876 mariadb-10.11.9/storage/innobase/page/page0page.cc | 4 mariadb-10.11.9/storage/innobase/page/page0zip.cc | 3 mariadb-10.11.9/storage/innobase/pars/pars0pars.cc | 3 mariadb-10.11.9/storage/innobase/rem/rem0rec.cc | 2 mariadb-10.11.9/storage/innobase/row/row0ftsort.cc | 3 mariadb-10.11.9/storage/innobase/row/row0import.cc | 526 mariadb-10.11.9/storage/innobase/row/row0ins.cc | 105 mariadb-10.11.9/storage/innobase/row/row0merge.cc | 140 mariadb-10.11.9/storage/innobase/row/row0mysql.cc | 5 mariadb-10.11.9/storage/innobase/row/row0purge.cc | 1 mariadb-10.11.9/storage/innobase/row/row0quiesce.cc | 5 mariadb-10.11.9/storage/innobase/row/row0sel.cc | 43 mariadb-10.11.9/storage/innobase/row/row0umod.cc | 2 mariadb-10.11.9/storage/innobase/row/row0undo.cc | 2 mariadb-10.11.9/storage/innobase/row/row0upd.cc | 25 mariadb-10.11.9/storage/innobase/srv/srv0mon.cc | 10 mariadb-10.11.9/storage/innobase/srv/srv0srv.cc | 13 mariadb-10.11.9/storage/innobase/srv/srv0start.cc | 232 mariadb-10.11.9/storage/innobase/sync/cache.cc | 160 mariadb-10.11.9/storage/innobase/sync/srw_lock.cc | 255 mariadb-10.11.9/storage/innobase/trx/trx0purge.cc | 580 mariadb-10.11.9/storage/innobase/trx/trx0rec.cc | 5 mariadb-10.11.9/storage/innobase/trx/trx0roll.cc | 4 mariadb-10.11.9/storage/innobase/trx/trx0rseg.cc | 103 mariadb-10.11.9/storage/innobase/trx/trx0trx.cc | 47 mariadb-10.11.9/storage/innobase/trx/trx0undo.cc | 105 mariadb-10.11.9/storage/innobase/unittest/CMakeLists.txt | 4 mariadb-10.11.9/storage/innobase/unittest/innodb_rbt-t.cc | 83 mariadb-10.11.9/storage/innobase/ut/ut0ut.cc | 47 mariadb-10.11.9/storage/maria/CMakeLists.txt | 4 mariadb-10.11.9/storage/maria/aria_chk.c | 3 mariadb-10.11.9/storage/maria/aria_pack.c | 3 mariadb-10.11.9/storage/maria/aria_read_log.c | 2 mariadb-10.11.9/storage/maria/aria_s3_copy.cc | 21 mariadb-10.11.9/storage/maria/ha_maria.cc | 113 mariadb-10.11.9/storage/maria/ha_maria.h | 6 mariadb-10.11.9/storage/maria/ha_s3.cc | 35 mariadb-10.11.9/storage/maria/libmarias3/README.rst | 11 mariadb-10.11.9/storage/maria/libmarias3/docs/api/functions.rst | 10 mariadb-10.11.9/storage/maria/libmarias3/docs/api/types.rst | 2 mariadb-10.11.9/storage/maria/libmarias3/libmarias3/marias3.h | 11 mariadb-10.11.9/storage/maria/libmarias3/src/assume_role.c | 4 mariadb-10.11.9/storage/maria/libmarias3/src/error.c | 4 mariadb-10.11.9/storage/maria/libmarias3/src/include.am | 2 mariadb-10.11.9/storage/maria/libmarias3/src/marias3.c | 50 mariadb-10.11.9/storage/maria/libmarias3/src/request.c | 30 mariadb-10.11.9/storage/maria/libmarias3/src/request.h | 2 mariadb-10.11.9/storage/maria/libmarias3/src/response.c | 2 mariadb-10.11.9/storage/maria/libmarias3/src/structs.h | 2 mariadb-10.11.9/storage/maria/libmarias3/src/xml.c | 2 mariadb-10.11.9/storage/maria/libmarias3/tests/error.c | 2 mariadb-10.11.9/storage/maria/libmarias3/tests/include.am | 4 mariadb-10.11.9/storage/maria/libmarias3/tests/read_cb.c | 129 mariadb-10.11.9/storage/maria/ma_bitmap.c | 2 mariadb-10.11.9/storage/maria/ma_blockrec.c | 12 mariadb-10.11.9/storage/maria/ma_check.c | 42 mariadb-10.11.9/storage/maria/ma_control_file.c | 15 mariadb-10.11.9/storage/maria/ma_control_file.h | 5 mariadb-10.11.9/storage/maria/ma_create.c | 2 mariadb-10.11.9/storage/maria/ma_dynrec.c | 8 mariadb-10.11.9/storage/maria/ma_extra.c | 32 mariadb-10.11.9/storage/maria/ma_loghandler.c | 8 mariadb-10.11.9/storage/maria/ma_loghandler.h | 8 mariadb-10.11.9/storage/maria/ma_open.c | 20 mariadb-10.11.9/storage/maria/ma_packrec.c | 8 mariadb-10.11.9/storage/maria/ma_pagecache.c | 2 mariadb-10.11.9/storage/maria/ma_range.c | 15 mariadb-10.11.9/storage/maria/ma_recovery.c | 34 mariadb-10.11.9/storage/maria/ma_rt_test.c | 2 mariadb-10.11.9/storage/maria/ma_test1.c | 2 mariadb-10.11.9/storage/maria/ma_test2.c | 2 mariadb-10.11.9/storage/maria/maria_def.h | 6 mariadb-10.11.9/storage/maria/s3_func.c | 20 mariadb-10.11.9/storage/maria/test_ma_backup.c | 2 mariadb-10.11.9/storage/maria/unittest/CMakeLists.txt | 2 mariadb-10.11.9/storage/maria/unittest/ma_control_file-t.c | 2 mariadb-10.11.9/storage/maria/unittest/ma_pagecache_consist.c | 4 mariadb-10.11.9/storage/maria/unittest/ma_pagecache_rwconsist.c | 4 mariadb-10.11.9/storage/maria/unittest/ma_pagecache_rwconsist2.c | 4 mariadb-10.11.9/storage/maria/unittest/ma_pagecache_single.c | 4 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler-t.c | 5 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c | 2 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c | 2 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_multigroup-t.c | 4 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_multithread-t.c | 6 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_noflush-t.c | 2 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_nologs-t.c | 4 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_pagecache-t.c | 2 mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_purge-t.c | 2 mariadb-10.11.9/storage/mroonga/CMakeLists.txt | 5 mariadb-10.11.9/storage/mroonga/ha_mroonga.cpp | 362 mariadb-10.11.9/storage/mroonga/ha_mroonga.hpp | 33 mariadb-10.11.9/storage/mroonga/mrn.hpp | 29 mariadb-10.11.9/storage/mroonga/sources.am | 1 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_command.cpp | 10 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_escape.cpp | 10 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_highlight_html.cpp | 9 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp | 8 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_normalize.cpp | 10 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_query_expand.cpp | 10 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_snippet.cpp | 8 mariadb-10.11.9/storage/mroonga/udf/mrn_udf_snippet_html.cpp | 9 mariadb-10.11.9/storage/mroonga/vendor/groonga/CMakeLists.txt | 1 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/CMakeLists.txt | 12 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/dat.hpp | 4 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/id-cursor.hpp | 10 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/key-cursor.hpp | 10 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/predictive-cursor.hpp | 10 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/prefix-cursor.hpp | 10 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/db.c | 18 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/load.c | 5 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/operator.c | 5 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c | 4 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c | 9 mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_select.c | 20 mariadb-10.11.9/storage/myisam/ft_boolean_search.c | 2 mariadb-10.11.9/storage/myisam/ha_myisam.cc | 69 mariadb-10.11.9/storage/myisam/ha_myisam.h | 150 mariadb-10.11.9/storage/myisam/mi_extra.c | 13 mariadb-10.11.9/storage/myisam/sort.c | 5 mariadb-10.11.9/storage/myisammrg/ha_myisammrg.h | 96 mariadb-10.11.9/storage/oqgraph/graphcore.cc | 18 mariadb-10.11.9/storage/oqgraph/ha_oqgraph.h | 66 mariadb-10.11.9/storage/perfschema/CMakeLists.txt | 3 mariadb-10.11.9/storage/perfschema/cursor_by_account.h | 6 mariadb-10.11.9/storage/perfschema/cursor_by_host.h | 6 mariadb-10.11.9/storage/perfschema/cursor_by_thread.h | 6 mariadb-10.11.9/storage/perfschema/cursor_by_thread_connect_attr.h | 6 mariadb-10.11.9/storage/perfschema/cursor_by_user.h | 6 mariadb-10.11.9/storage/perfschema/ha_perfschema.cc | 4 mariadb-10.11.9/storage/perfschema/ha_perfschema.h | 62 mariadb-10.11.9/storage/perfschema/pfs_account.cc | 4 mariadb-10.11.9/storage/perfschema/pfs_account.h | 11 mariadb-10.11.9/storage/perfschema/pfs_atomic.h | 141 mariadb-10.11.9/storage/perfschema/pfs_buffer_container.h | 18 mariadb-10.11.9/storage/perfschema/pfs_digest.cc | 6 mariadb-10.11.9/storage/perfschema/pfs_engine_table.cc | 10 mariadb-10.11.9/storage/perfschema/pfs_engine_table.h | 22 mariadb-10.11.9/storage/perfschema/pfs_events_stages.cc | 7 mariadb-10.11.9/storage/perfschema/pfs_events_statements.cc | 7 mariadb-10.11.9/storage/perfschema/pfs_events_transactions.cc | 7 mariadb-10.11.9/storage/perfschema/pfs_events_waits.cc | 7 mariadb-10.11.9/storage/perfschema/pfs_global.h | 6 mariadb-10.11.9/storage/perfschema/pfs_host.cc | 2 mariadb-10.11.9/storage/perfschema/pfs_host.h | 12 mariadb-10.11.9/storage/perfschema/pfs_instr.cc | 2 mariadb-10.11.9/storage/perfschema/pfs_instr_class.cc | 80 mariadb-10.11.9/storage/perfschema/pfs_instr_class.h | 13 mariadb-10.11.9/storage/perfschema/pfs_lock.h | 34 mariadb-10.11.9/storage/perfschema/pfs_memory.cc | 1 mariadb-10.11.9/storage/perfschema/pfs_setup_actor.cc | 2 mariadb-10.11.9/storage/perfschema/pfs_setup_object.cc | 2 mariadb-10.11.9/storage/perfschema/pfs_status.cc | 1 mariadb-10.11.9/storage/perfschema/pfs_user.cc | 2 mariadb-10.11.9/storage/perfschema/pfs_user.h | 12 mariadb-10.11.9/storage/perfschema/pfs_variable.cc | 97 mariadb-10.11.9/storage/perfschema/pfs_variable.h | 34 mariadb-10.11.9/storage/perfschema/pfs_visitor.cc | 19 mariadb-10.11.9/storage/perfschema/pfs_visitor.h | 160 mariadb-10.11.9/storage/perfschema/table_accounts.h | 10 mariadb-10.11.9/storage/perfschema/table_all_instr.h | 6 mariadb-10.11.9/storage/perfschema/table_esgs_by_account_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esgs_by_host_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esgs_by_thread_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esgs_by_user_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esgs_global_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esms_by_account_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esms_by_digest.h | 14 mariadb-10.11.9/storage/perfschema/table_esms_by_host_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esms_by_program.h | 14 mariadb-10.11.9/storage/perfschema/table_esms_by_thread_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esms_by_user_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_esms_global_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_ets_by_account_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_ets_by_host_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_ets_by_thread_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_ets_by_user_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_ets_global_by_event_name.h | 16 mariadb-10.11.9/storage/perfschema/table_events_stages.h | 32 mariadb-10.11.9/storage/perfschema/table_events_statements.h | 32 mariadb-10.11.9/storage/perfschema/table_events_transactions.h | 32 mariadb-10.11.9/storage/perfschema/table_events_waits.h | 26 mariadb-10.11.9/storage/perfschema/table_events_waits_summary.h | 18 mariadb-10.11.9/storage/perfschema/table_ews_by_account_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_ews_by_host_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_ews_by_thread_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_ews_by_user_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_ews_global_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_file_instances.h | 14 mariadb-10.11.9/storage/perfschema/table_file_summary_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_file_summary_by_instance.h | 14 mariadb-10.11.9/storage/perfschema/table_global_status.h | 16 mariadb-10.11.9/storage/perfschema/table_global_variables.h | 16 mariadb-10.11.9/storage/perfschema/table_helper.h | 2 mariadb-10.11.9/storage/perfschema/table_host_cache.h | 14 mariadb-10.11.9/storage/perfschema/table_hosts.h | 12 mariadb-10.11.9/storage/perfschema/table_md_locks.h | 14 mariadb-10.11.9/storage/perfschema/table_mems_by_account_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_mems_by_host_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_mems_by_thread_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_mems_by_user_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_mems_global_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_os_global_by_type.h | 14 mariadb-10.11.9/storage/perfschema/table_performance_timers.h | 14 mariadb-10.11.9/storage/perfschema/table_prepared_stmt_instances.h | 14 mariadb-10.11.9/storage/perfschema/table_replication_applier_configuration.h | 14 mariadb-10.11.9/storage/perfschema/table_replication_applier_status.cc | 2 mariadb-10.11.9/storage/perfschema/table_replication_applier_status.h | 16 mariadb-10.11.9/storage/perfschema/table_replication_applier_status_by_coordinator.h | 14 mariadb-10.11.9/storage/perfschema/table_replication_applier_status_by_worker.h | 14 mariadb-10.11.9/storage/perfschema/table_replication_connection_configuration.h | 14 mariadb-10.11.9/storage/perfschema/table_replication_connection_status.h | 14 mariadb-10.11.9/storage/perfschema/table_replication_group_member_stats.h | 14 mariadb-10.11.9/storage/perfschema/table_replication_group_members.h | 14 mariadb-10.11.9/storage/perfschema/table_session_account_connect_attrs.h | 2 mariadb-10.11.9/storage/perfschema/table_session_connect.h | 6 mariadb-10.11.9/storage/perfschema/table_session_status.h | 16 mariadb-10.11.9/storage/perfschema/table_session_variables.h | 16 mariadb-10.11.9/storage/perfschema/table_setup_actors.h | 32 mariadb-10.11.9/storage/perfschema/table_setup_consumers.h | 22 mariadb-10.11.9/storage/perfschema/table_setup_instruments.h | 26 mariadb-10.11.9/storage/perfschema/table_setup_objects.h | 32 mariadb-10.11.9/storage/perfschema/table_setup_timers.h | 22 mariadb-10.11.9/storage/perfschema/table_socket_instances.h | 14 mariadb-10.11.9/storage/perfschema/table_socket_summary_by_event_name.h | 14 mariadb-10.11.9/storage/perfschema/table_socket_summary_by_instance.h | 14 mariadb-10.11.9/storage/perfschema/table_status_by_account.h | 16 mariadb-10.11.9/storage/perfschema/table_status_by_host.h | 16 mariadb-10.11.9/storage/perfschema/table_status_by_thread.h | 16 mariadb-10.11.9/storage/perfschema/table_status_by_user.h | 16 mariadb-10.11.9/storage/perfschema/table_sync_instances.h | 42 mariadb-10.11.9/storage/perfschema/table_table_handles.h | 16 mariadb-10.11.9/storage/perfschema/table_threads.h | 22 mariadb-10.11.9/storage/perfschema/table_tiws_by_index_usage.h | 16 mariadb-10.11.9/storage/perfschema/table_tiws_by_table.h | 16 mariadb-10.11.9/storage/perfschema/table_tlws_by_table.h | 16 mariadb-10.11.9/storage/perfschema/table_users.h | 10 mariadb-10.11.9/storage/perfschema/table_uvar_by_thread.cc | 2 mariadb-10.11.9/storage/perfschema/table_uvar_by_thread.h | 14 mariadb-10.11.9/storage/perfschema/table_variables_by_thread.h | 16 mariadb-10.11.9/storage/perfschema/unittest/CMakeLists.txt | 2 mariadb-10.11.9/storage/perfschema/unittest/pfs_instr-t.cc | 3 mariadb-10.11.9/storage/perfschema/unittest/pfs_instr_class-t.cc | 1 mariadb-10.11.9/storage/perfschema/unittest/pfs_noop-t.cc | 1 mariadb-10.11.9/storage/perfschema/unittest/stub_pfs_global.h | 2 mariadb-10.11.9/storage/rocksdb/CMakeLists.txt | 2 mariadb-10.11.9/storage/rocksdb/build_rocksdb.cmake | 2 mariadb-10.11.9/storage/rocksdb/ha_rocksdb.cc | 6 mariadb-10.11.9/storage/rocksdb/ha_rocksdb.h | 22 mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result | 2 mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result | 2 mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/partition.result | 1 mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/t/disabled.def | 4 mariadb-10.11.9/storage/rocksdb/properties_collector.h | 4 mariadb-10.11.9/storage/rocksdb/rdb_compact_filter.h | 4 mariadb-10.11.9/storage/rocksdb/rdb_datadic.h | 2 mariadb-10.11.9/storage/rocksdb/rdb_mutex_wrapper.h | 14 mariadb-10.11.9/storage/rocksdb/rdb_source_revision.h | 1 mariadb-10.11.9/storage/rocksdb/rdb_threads.h | 6 mariadb-10.11.9/storage/sequence/sequence.cc | 54 mariadb-10.11.9/storage/sphinx/ha_sphinx.cc | 19 mariadb-10.11.9/storage/sphinx/ha_sphinx.h | 90 mariadb-10.11.9/storage/spider/ha_spider.cc | 212 mariadb-10.11.9/storage/spider/ha_spider.h | 274 mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider_fixes.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/disabled.def | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc | 12 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc | 13 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result | 50 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result | 6 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result | 15 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result | 34 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result | 17 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27902.result | 49 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28105.result | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result | 22 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result | 34 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result | 21 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result | 34 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29027.result | 24 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29027_original.result | 15 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result | 19 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result | 42 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result | 40 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29962.result | 23 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result | 44 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result | 37 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result | 7 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30408.result | 30 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result | 24 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31475.result | 23 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result | 9 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32492.result | 67 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result | 14 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result | 17 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result | 24 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result | 25 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result | 14 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result | 12 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result | 7 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result | 12 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result | 25 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34002.result | 9 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result | 18 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34421.result | 13 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34541.result | 35 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34555.result | 32 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/perfschema.result | 11 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result | 4 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result | 8 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result | 24 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result | 38 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/subquery.result | 25 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test | 46 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test | 5 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test | 9 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test | 6 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test | 37 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test | 23 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27902.test | 56 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.opt | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.test | 8 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test | 29 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test | 41 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test | 31 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test | 5 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test | 32 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.cnf | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.test | 28 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027_original.test | 22 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test | 6 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test | 26 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test | 53 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test | 44 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29962.test | 30 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test | 56 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test | 46 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test | 8 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test | 5 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30408.test | 26 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test | 30 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test | 11 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31475.test | 32 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test | 12 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32492.test | 62 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test | 12 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test | 20 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test | 22 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test | 29 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test | 24 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test | 11 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test | 6 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test | 15 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test | 11 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test | 17 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test | 11 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test | 29 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test | 16 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34002.test | 7 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test | 20 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34421.test | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34541.test | 48 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test | 33 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/perfschema.test | 16 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test | 6 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test | 10 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test | 29 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test | 46 mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/subquery.test | 31 mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/pushdown_case.result | 57 mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result | 111 mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result | 3 mariadb-10.11.9/storage/spider/mysql-test/spider/feature/t/pushdown_case.test | 50 mariadb-10.11.9/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test | 93 mariadb-10.11.9/storage/spider/mysql-test/spider/include/clean_up_spider.inc | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/include/init_spider.inc | 21 mariadb-10.11.9/storage/spider/mysql-test/spider/my.cnf | 183 mariadb-10.11.9/storage/spider/mysql-test/spider/my_1_1.cnf | 44 mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_1.cnf | 56 mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_2.cnf | 38 mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_3.cnf | 9 mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_1.cnf | 11 mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_2.cnf | 9 mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_3.cnf | 9 mariadb-10.11.9/storage/spider/mysql-test/spider/my_4_1.cnf | 9 mariadb-10.11.9/storage/spider/mysql-test/spider/r/connection_override.result | 44 mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_join.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_join.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/slave_trx_isolation.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider3_fixes.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider3_fixes_part.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider_fixes.result | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider_fixes_part.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/r/variable_deprecation.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/t/connection_override.cnf | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/t/connection_override.test | 43 mariadb-10.11.9/storage/spider/mysql-test/spider/t/slave_test_init.inc | 2 mariadb-10.11.9/storage/spider/mysql-test/spider/t/spider_fixes_part.opt | 1 mariadb-10.11.9/storage/spider/mysql-test/spider/t/spider_fixes_part.test | 16 mariadb-10.11.9/storage/spider/mysql-test/spider/t/variable_deprecation.test | 3 mariadb-10.11.9/storage/spider/spd_conn.cc | 371 mariadb-10.11.9/storage/spider/spd_conn.h | 44 mariadb-10.11.9/storage/spider/spd_copy_tables.cc | 66 mariadb-10.11.9/storage/spider/spd_db_conn.cc | 102 mariadb-10.11.9/storage/spider/spd_db_include.cc | 32 mariadb-10.11.9/storage/spider/spd_db_include.h | 75 mariadb-10.11.9/storage/spider/spd_db_mysql.cc | 1217 mariadb-10.11.9/storage/spider/spd_db_mysql.h | 545 mariadb-10.11.9/storage/spider/spd_direct_sql.cc | 364 mariadb-10.11.9/storage/spider/spd_err.h | 8 mariadb-10.11.9/storage/spider/spd_group_by_handler.cc | 595 mariadb-10.11.9/storage/spider/spd_group_by_handler.h | 6 mariadb-10.11.9/storage/spider/spd_i_s.cc | 5 mariadb-10.11.9/storage/spider/spd_include.h | 339 mariadb-10.11.9/storage/spider/spd_init_query.h | 51 mariadb-10.11.9/storage/spider/spd_param.cc | 74 mariadb-10.11.9/storage/spider/spd_ping_table.cc | 146 mariadb-10.11.9/storage/spider/spd_sys_table.cc | 637 mariadb-10.11.9/storage/spider/spd_sys_table.h | 96 mariadb-10.11.9/storage/spider/spd_table.cc | 521 mariadb-10.11.9/storage/spider/spd_table.h | 2 mariadb-10.11.9/storage/spider/spd_trx.cc | 70 mariadb-10.11.9/storage/test_sql_discovery/test_sql_discovery.cc | 26 mariadb-10.11.9/strings/ctype-uca.c | 6 mariadb-10.11.9/strings/ctype-uca.inl | 14 mariadb-10.11.9/strings/ctype.c | 2 mariadb-10.11.9/strings/dtoa.c | 18 mariadb-10.11.9/strings/json_lib.c | 6 mariadb-10.11.9/strings/my_strtoll10.c | 2 mariadb-10.11.9/support-files/mariadb.service.in | 10 mariadb-10.11.9/support-files/mariadb@.service.in | 8 mariadb-10.11.9/support-files/mini-benchmark.sh | 123 mariadb-10.11.9/support-files/policy/apparmor/usr.sbin.mysqld | 1 mariadb-10.11.9/support-files/policy/selinux/mariadb-server.te | 4 mariadb-10.11.9/support-files/rpm/server-postin.sh | 2 mariadb-10.11.9/tests/async_queries.c | 2 mariadb-10.11.9/tests/code_quality/cppcheck_ignorelist.txt | 336 mariadb-10.11.9/tests/code_quality/flawfinder_ignorelist.json | 234 mariadb-10.11.9/tests/mysql_client_fw.c | 14 mariadb-10.11.9/tests/mysql_client_test.c | 150 mariadb-10.11.9/tpool/CMakeLists.txt | 2 mariadb-10.11.9/tpool/aio_simulated.cc | 6 mariadb-10.11.9/tpool/aio_win.cc | 6 mariadb-10.11.9/tpool/tpool_generic.cc | 36 mariadb-10.11.9/tpool/tpool_structs.h | 5 mariadb-10.11.9/tpool/tpool_win.cc | 8 mariadb-10.11.9/unittest/embedded/CMakeLists.txt | 2 mariadb-10.11.9/unittest/mysys/CMakeLists.txt | 2 mariadb-10.11.9/unittest/mysys/bitmap-t.c | 152 mariadb-10.11.9/unittest/mysys/crc32-t.c | 142 mariadb-10.11.9/unittest/mysys/my_getopt-t.c | 4 mariadb-10.11.9/unittest/sql/mf_iocache-t.cc | 3 mariadb-10.11.9/unittest/sql/my_apc-t.cc | 2 mariadb-10.11.9/unittest/strings/strings-t.c | 26 mariadb-10.11.9/vio/vio.c | 2 mariadb-10.11.9/vio/viosocket.c | 53 mariadb-10.11.9/win/packaging/CPackWixConfig.cmake | 2 mariadb-10.11.9/win/packaging/heidisql.cmake | 2 mariadb-10.11.9/win/packaging/heidisql.wxi.in | 8 mariadb-10.11.9/wsrep-lib/.github/workflows/build.yml | 20 mariadb-10.11.9/wsrep-lib/CMakeLists.txt | 56 mariadb-10.11.9/wsrep-lib/cmake/unittests.cmake | 87 mariadb-10.11.9/wsrep-lib/dbsim/db_client_service.hpp | 5 mariadb-10.11.9/wsrep-lib/dbsim/db_threads.cpp | 52 mariadb-10.11.9/wsrep-lib/include/wsrep/client_service.hpp | 10 mariadb-10.11.9/wsrep-lib/include/wsrep/logger.hpp | 6 mariadb-10.11.9/wsrep-lib/include/wsrep/provider.hpp | 25 mariadb-10.11.9/wsrep-lib/include/wsrep/reporter.hpp | 16 mariadb-10.11.9/wsrep-lib/src/client_state.cpp | 8 mariadb-10.11.9/wsrep-lib/src/reporter.cpp | 12 mariadb-10.11.9/wsrep-lib/src/service_helpers.hpp | 24 mariadb-10.11.9/wsrep-lib/src/transaction.cpp | 13 mariadb-10.11.9/wsrep-lib/src/wsrep_provider_v26.cpp | 44 mariadb-10.11.9/wsrep-lib/src/wsrep_provider_v26.hpp | 1 mariadb-10.11.9/wsrep-lib/test/mock_client_state.hpp | 5 mariadb-10.11.9/wsrep-lib/test/mock_provider.hpp | 3 mariadb-10.11.9/wsrep-lib/test/reporter_test.cpp | 4 mariadb-10.11.9/wsrep-lib/wsrep-API/v26/wsrep_node_isolation.h | 70 mariadb-10.11.9/zlib/ChangeLog | 10 mariadb-10.11.9/zlib/FAQ | 3 mariadb-10.11.9/zlib/README | 6 mariadb-10.11.9/zlib/contrib/nuget/nuget.csproj | 43 mariadb-10.11.9/zlib/contrib/nuget/nuget.sln | 22 mariadb-10.11.9/zlib/contrib/vstudio/vc17/miniunz.vcxproj | 409 mariadb-10.11.9/zlib/contrib/vstudio/vc17/minizip.vcxproj | 405 mariadb-10.11.9/zlib/contrib/vstudio/vc17/testzlib.vcxproj | 473 mariadb-10.11.9/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj | 409 mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlib.rc | 32 mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibstat.vcxproj | 602 mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.def | 158 mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.sln | 179 mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.vcxproj | 875 mariadb-10.11.9/zlib/deflate.c | 47 mariadb-10.11.9/zlib/deflate.h | 35 mariadb-10.11.9/zlib/gzguts.h | 8 mariadb-10.11.9/zlib/gzlib.c | 12 mariadb-10.11.9/zlib/inflate.c | 2 mariadb-10.11.9/zlib/inftrees.c | 6 mariadb-10.11.9/zlib/inftrees.h | 4 mariadb-10.11.9/zlib/qnx/package.qpg | 10 mariadb-10.11.9/zlib/treebuild.xml | 4 mariadb-10.11.9/zlib/trees.c | 20 mariadb-10.11.9/zlib/win32/DLL_FAQ.txt | 20 mariadb-10.11.9/zlib/win32/README-WIN32.txt | 8 mariadb-10.11.9/zlib/zconf.h.cmakein | 10 mariadb-10.11.9/zlib/zconf.h.in | 10 mariadb-10.11.9/zlib/zlib.3 | 6 mariadb-10.11.9/zlib/zlib.h | 22 mariadb-10.11.9/zlib/zutil.h | 27 4993 files changed, 687196 insertions(+), 236171 deletions(-) diff -Nru mariadb-10.11.6/.clang-format mariadb-10.11.9/.clang-format --- mariadb-10.11.6/.clang-format 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/.clang-format 2024-08-03 07:29:56.000000000 +0000 @@ -70,7 +70,6 @@ IndentWidth: 2 IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: true -Language: Cpp MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 diff -Nru mariadb-10.11.6/.gitlab-ci.yml mariadb-10.11.9/.gitlab-ci.yml --- mariadb-10.11.6/.gitlab-ci.yml 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/.gitlab-ci.yml 2024-08-03 07:29:56.000000000 +0000 @@ -44,7 +44,7 @@ # Major version dictates which branches share the same ccache. E.g. 10.6-abc # and 10.6-xyz will have the same cache. MARIADB_MAJOR_VERSION: "10.9" - # NOTE! Currently ccache is only used on the Centos8 build. As each job has + # NOTE! Currently ccache is only used on the Centos 9 build. As each job has # sufficiently different environments they are unable to benefit from each # other's ccaches. As each build generates about 1 GB of ccache, having # multiple caches would quickly consume all free storage on Gitlab-CI and @@ -53,7 +53,7 @@ # cache:policy are not flexible enough to have a system where the cache is # uploaded only once a week and not on every build. Having ccache on at least # one build still helps ensure that ccache compatibility is at least tested - # and if the Centos 8 build is always significantly faster than all other + # and if the Centos 9 build is always significantly faster than all other # builds (e.g. on self-hosted Gitlab instances) then users would at least be # able to discover it. # @@ -209,26 +209,20 @@ matrix: - SANITIZER: [-DWITH_ASAN=YES, -DWITH_TSAN=YES, -DWITH_UBSAN=YES] -centos8: +centos9: stage: build - image: quay.io/centos/centos:stream8 # CentOS 8 is deprecated, use this Stream8 instead + image: quay.io/centos/centos:stream9 # CentOS 9 is deprecated, use this Stream9 instead variables: GIT_STRATEGY: fetch GIT_SUBMODULE_STRATEGY: normal script: - - yum install -y yum-utils rpm-build openssl-devel pcre2-devel - - yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm - # dnf --enablerepo=powertools install Judy-devel #--> not found - - dnf config-manager --set-enabled powertools - # Error: - # Problem: conflicting requests - # - package Judy-devel-1.0.5-18.module_el8.3.0+757+d382997d.i686 is filtered out by modular filtering - # - package Judy-devel-1.0.5-18.module_el8.3.0+757+d382997d.x86_64 is filtered out by modular filtering - # Solution: install Judy-devel directly from downloaded rpm file: - - yum install -y http://vault.centos.org/centos/8/PowerTools/x86_64/os/Packages/Judy-devel-1.0.5-18.module_el8.3.0+757+d382997d.x86_64.rpm - # Use eatmydata to speed up build - - yum install -y https://github.com/stewartsmith/libeatmydata/releases/download/v129/libeatmydata-129-1.fc33.x86_64.rpm - - yum install -y ccache # From EPEL + - yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm + - yum install -y yum-utils rpm-build openssl-devel libeatmydata ccache + # Install missing dependencies + - yum install -y https://mirror.stream.centos.org/9-stream/CRB/x86_64/os/Packages/Judy-devel-1.0.5-28.el9.x86_64.rpm + - yum install -y https://mirror.stream.centos.org/9-stream/CRB/x86_64/os/Packages/bison-devel-3.7.4-5.el9.x86_64.rpm + - yum install -y https://mirror.stream.centos.org/9-stream/CRB/x86_64/os/Packages/multilib-rpm-config-1-19.el9.noarch.rpm + # Configure ccache - source /etc/profile.d/ccache.sh - export CCACHE_DIR="$(pwd)/.ccache"; ccache --zero-stats # This repository does not have any .spec files, so install dependencies based on CentOS spec file @@ -426,7 +420,8 @@ - installed-database.sql - upgraded-database.sql -cppcheck: +cppcheck: + allow_failure: true stage: sast needs: [] variables: @@ -434,33 +429,57 @@ GIT_SUBMODULE_STRATEGY: normal script: - yum install -y cppcheck diffutils - # --template: use a single-line template + # --template: output format # --force: check large directories without warning # -i: ignore this directory when scanning + # -I: include path, reduces false positives + # related to inability to resolve symbols # -j: run multiple cppcheck threads # Use newline to escape colon in yaml - > - cppcheck --template="{file}:{line}: {severity}: {message}" --force + cppcheck --template="{file}:{line}\n{code}\n{severity}: {message}" --force --check-level=exhaustive client dbug extra include libmariadb libmysqld libservices mysql-test mysys mysys_ssl pcre plugin strings tests unittest vio wsrep-lib sql sql-common storage -istorage/mroonga -istorage/tokudb -istorage/spider -istorage/rocksdb -iextra/ -ilibmariadb/ -istorage/columnstore - --output-file=cppcheck.txt -j $(nproc) - # Parallel jobs may output findings in an nondeterministic order. Sort to match ignorelist. - - cat cppcheck.txt | sort > cppcheck_sorted.txt - # Remove line numbers for diff - - sed 's/:[^:]*:/:/' cppcheck_sorted.txt > cppcheck_sorted_no_line_numbers.txt + -Iinclude -Istorage/innobase/include + --output-file=initial-cppcheck_output.txt -j $(nproc) + # when including {code} in the cppcheck template, some more pre-processing needs to be done + # + # sample cppcheck finding: : + # foo.bar() + # ^ + # : + # + # 1. remove all lines with "^" + # 2. merge every 3 lines into 1 so it can be sorted (example: foo.bar() : ) + # 3. sort to match ignorelist since parallel jobs may output findings in an nondeterministic order + # 4. remove findings likely to be false positives (i.e, "unknown macros") + # 5. remove line numbers for diffing against ignorelist + - | + cat initial-cppcheck_output.txt | grep -v '\^$' > preprocessed-cppcheck_circumflex_removed.txt + cat preprocessed-cppcheck_circumflex_removed.txt | awk 'NR%3==1 {printf "%s", (NR==1) ? "" : "\n"; printf "%s", $0} NR%3!=1 {printf " %s", $0}' > preprocessed-cppcheck_oneline.txt + cat preprocessed-cppcheck_oneline.txt | sort > preprocessed-cppcheck_sorted.txt + cat preprocessed-cppcheck_sorted.txt | grep -v "There is an unknown macro here somewhere" > results-cppcheck_all_findings.txt + sed 's/:[0-9]\+//' results-cppcheck_all_findings.txt > preprocessed_final-cppcheck_no_line_nums.txt # Only print new issues not found in ignore list - echo "Problems found in ignore list that were not discovered by cppcheck (may have been fixed)." - - diff --changed-group-format='%>' --unchanged-group-format='' cppcheck_sorted_no_line_numbers.txt tests/code_quality/cppcheck_ignorelist.txt || true + - diff --changed-group-format='%>' --unchanged-group-format='' preprocessed_final-cppcheck_no_line_nums.txt tests/code_quality/cppcheck_ignorelist.txt || true - echo "Problems found by cppcheck that were not in ignore list." - - diff --changed-group-format='%<' --unchanged-group-format='' cppcheck_sorted_no_line_numbers.txt tests/code_quality/cppcheck_ignorelist.txt > lines_not_ignored.txt || true - - cat lines_not_ignored.txt && test ! -s lines_not_ignored.txt + - diff --changed-group-format='%<' --unchanged-group-format='' preprocessed_final-cppcheck_no_line_nums.txt tests/code_quality/cppcheck_ignorelist.txt > results-cppcheck_new_findings.txt || true + - cat results-cppcheck_new_findings.txt && test ! -s results-cppcheck_new_findings.txt artifacts: when: always paths: - - cppcheck_sorted.txt + # save all steps of pre-processing in-case it ever breaks + - initial-cppcheck_output.txt + - preprocessed-cppcheck_circumflex_removed.txt + - preprocessed-cppcheck_sorted.txt + - preprocessed_final-cppcheck_no_line_nums.txt + - results-cppcheck_all_findings.txt + - results-cppcheck_new_findings.txt flawfinder: + allow_failure: true stage: sast needs: [] variables: @@ -482,11 +501,12 @@ - echo "Problems found in ignore list that were not discovered by flawfinder (may have been fixed)." - diff --changed-group-format='%>' --unchanged-group-format='' flawfinder-min-level5.json tests/code_quality/flawfinder_ignorelist.json || true - echo "Problems found by flawfinder that were not in ignore list." - - diff --changed-group-format='%<' --unchanged-group-format='' flawfinder-min-level5.json tests/code_quality/flawfinder_ignorelist.json > lines_not_ignored.txt || true - - cat lines_not_ignored.txt && test ! -s lines_not_ignored.txt + - diff --changed-group-format='%<' --unchanged-group-format='' flawfinder-min-level5.json tests/code_quality/flawfinder_ignorelist.json > flawfinder_new_findings.txt || true + - cat flawfinder_new_findings.txt && test ! -s flawfinder_new_findings.txt artifacts: when: always paths: + - flawfinder_new_findings.txt - flawfinder-all-vulnerabilities.html - flawfinder-min-level5.json @@ -510,9 +530,9 @@ - | mariadb --skip-column-names -e "SELECT @@version, @@version_comment" | tee /tmp/version grep $MARIADB_MAJOR_VERSION /tmp/version || echo "MariaDB didn't install properly" - - yum install -y sysbench procps-ng perf util-linux || yum install -y https://kojipkgs.fedoraproject.org//packages/luajit/2.0.4/3.el7/x86_64/luajit-2.0.4-3.el7.x86_64.rpm https://kojipkgs.fedoraproject.org//packages/sysbench/1.0.17/2.el7/x86_64/sysbench-1.0.17-2.el7.x86_64.rpm https://kojipkgs.fedoraproject.org//packages/ck/0.5.2/2.el7/x86_64/ck-0.5.2-2.el7.x86_64.rpm + - yum install -y sysbench procps-ng perf flamegraph flamegraph-stackcollapse-perf util-linux dnf-utils - /usr/share/mysql/mini-benchmark - - cp -av */sysbench-run-*.log */metrics.txt .. # Move files one level down so they can be saved as artifacts + - cp -av */sysbench-run-*.log */metrics.txt . # Move files one level down so they can be saved as artifacts artifacts: when: always paths: diff -Nru mariadb-10.11.6/BUILD/SETUP.sh mariadb-10.11.9/BUILD/SETUP.sh --- mariadb-10.11.6/BUILD/SETUP.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/BUILD/SETUP.sh 2024-08-03 07:29:56.000000000 +0000 @@ -267,6 +267,12 @@ fi fi +if test `$CC -v 2>&1 | head -1 | sed 's/ .*$//'` = 'clang' ; then + dbug_cflags="$dbug_cflags -Wframe-larger-than=16384 -fno-inline" + c_warnings="$c_warnings -Wframe-larger-than=16384" + cxx_warnings="$cxx_warnings -Wframe-larger-than=16384" +fi + # If ccache (a compiler cache which reduces build time) # (http://samba.org/ccache) is installed, use it. diff -Nru mariadb-10.11.6/CMakeLists.txt mariadb-10.11.9/CMakeLists.txt --- mariadb-10.11.6/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -31,7 +31,7 @@ # in RPM's: #set(CPACK_RPM_SPEC_MORE_DEFINE "%define __spec_install_post /bin/true") -FOREACH(p CMP0022 CMP0046 CMP0040 CMP0048 CMP0054 CMP0075 CMP0069 CMP0135) +FOREACH(p CMP0022 CMP0046 CMP0040 CMP0048 CMP0054 CMP0074 CMP0075 CMP0069 CMP0135) IF(POLICY ${p}) CMAKE_POLICY(SET ${p} NEW) ENDIF() @@ -187,20 +187,28 @@ OPTION (WITH_UNIT_TESTS "Compile MySQL with unit tests" ON) IF (WITHOUT_SERVER) - SET (SKIP_COMPONENTS "Server|IniFiles|SuportFiles|Readme") + SET (SKIP_COMPONENTS "Server|IniFiles|SupportFiles|Readme") ELSE() SET (SKIP_COMPONENTS "N-O-N-E") ENDIF() -OPTION(NOT_FOR_DISTRIBUTION "Allow linking with GPLv2-incompatible system libraries. Only set it you never plan to distribute the resulting binaries" OFF) + +IF("${MYSQL_NO_DASH_VERSION}" VERSION_LESS 11.2) + SET(MEMPROTECT_DEFAULT ON) +ELSE() + SET(MEMPROTECT_DEFAULT OFF) +ENDIF() + +OPTION(WITH_PROTECT_STATEMENT_MEMROOT "Enable protection of statement's memory root after first SP/PS execution. Turned into account only for debug build" +${MEMPROTECT_DEFAULT}) # # Enable protection of statement's memory root after first SP/PS execution. # Can be switched on only for debug build. # -OPTION(WITH_PROTECT_STATEMENT_MEMROOT "Enable protection of statement's memory root after first SP/PS execution. Turned into account only for debug build" OFF) -IF (CMAKE_BUILD_TYPE MATCHES "Debug" AND WITH_PROTECT_STATEMENT_MEMROOT) - ADD_DEFINITIONS(-DPROTECT_STATEMENT_MEMROOT) +IF (WITH_PROTECT_STATEMENT_MEMROOT) + SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DPROTECT_STATEMENT_MEMROOT") + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DPROTECT_STATEMENT_MEMROOT") ENDIF() INCLUDE(check_compiler_flag) @@ -264,8 +272,6 @@ MY_CHECK_AND_SET_COMPILER_FLAG("-D_FORTIFY_SOURCE=2" RELEASE RELWITHDEBINFO) ENDIF() -INCLUDE(wsrep) - OPTION(WITH_DBUG_TRACE "Enable DBUG_ENTER()/DBUG_RETURN()/DBUG_PRINT()" ON) IF(WITH_DBUG_TRACE) FOREACH(LANG C CXX) @@ -276,7 +282,12 @@ # Always enable debug sync for debug builds. SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") - + +IF(CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "10") + # Enable extra checks when using a recent enough version of GNU libstdc++ + SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG -D_GLIBCXX_ASSERTIONS") +ENDIF() + OPTION(ENABLE_GCOV "Enable gcov (debug, Linux builds only)" OFF) IF (ENABLE_GCOV) MY_CHECK_AND_SET_COMPILER_FLAG("-DHAVE_gcov -fprofile-arcs -ftest-coverage -lgcov" DEBUG) @@ -337,6 +348,8 @@ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DTRASH_FREED_MEMORY") ENDIF() +INCLUDE(wsrep) + # Set commonly used variables IF(WIN32) SET(DEFAULT_MYSQL_HOME "C:/Program Files/MariaDB ${MYSQL_BASE_VERSION}") diff -Nru mariadb-10.11.6/Docs/INFO_SRC mariadb-10.11.9/Docs/INFO_SRC --- mariadb-10.11.6/Docs/INFO_SRC 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/Docs/INFO_SRC 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1,8 @@ +commit: 0e8fb977b00983d98c4c35e39bc1f36463095938 +date: 2024-08-03 09:15:40 +0200 +build-date: 2024-08-03 07:30:02 +0000 +short: 0e8fb977b00 +branch: HEAD + + +MariaDB source 10.11.9 diff -Nru mariadb-10.11.6/README.md mariadb-10.11.9/README.md --- mariadb-10.11.6/README.md 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/README.md 2024-08-03 07:29:56.000000000 +0000 @@ -1,9 +1,8 @@ -Code status: ------------- +# Code status: * [![Appveyor CI status](https://ci.appveyor.com/api/projects/status/4u6pexmtpuf8jq66?svg=true)](https://ci.appveyor.com/project/rasmushoj/server) ci.appveyor.com -## MariaDB: The open source relational database +## MariaDB: The innovative open source database MariaDB was designed as a drop-in replacement of MySQL(R) with more features, new storage engines, fewer bugs, and better performance. @@ -33,28 +32,22 @@ https://mariadb.com/kb/en/new-and-old-releases/ -Help ------ +# Getting the code, building it and testing it -More help is available from the Maria Discuss mailing list -https://launchpad.net/~maria-discuss, MariaDB's Zulip -instance, https://mariadb.zulipchat.com/ +Refer to the following guide: https://mariadb.org/get-involved/getting-started-for-developers/get-code-build-test/ +which outlines how to build the source code correctly and run the MariaDB testing framework, +as well as which branch to target for your contributions. -Live QA for beginner contributors ----- -MariaDB has a dedicated time each week when we answer new contributor questions live on Zulip. -From 8:00 to 10:00 UTC on Mondays, and 10:00 to 12:00 UTC on Thursdays, -anyone can ask any questions they’d like, and a live developer will be available to assist. +# Help -New contributors can ask questions any time, but we will provide immediate feedback during that interval. +More help is available from the Maria Discuss mailing list +https://lists.mariadb.org/postorius/lists/discuss.lists.mariadb.org/ and MariaDB's Zulip +instance, https://mariadb.zulipchat.com/ -Licensing ---------- +# Licensing *************************************************************************** -NOTE: - MariaDB is specifically available only under version 2 of the GNU General Public License (GPLv2). (I.e. Without the "any later version" clause.) This is inherited from MySQL. Please see the README file in @@ -65,8 +58,7 @@ *************************************************************************** -Bug Reports ------------- +# Bug Reports Bug and/or error reports regarding MariaDB should be submitted at: https://jira.mariadb.org diff -Nru mariadb-10.11.6/THIRDPARTY mariadb-10.11.9/THIRDPARTY --- mariadb-10.11.6/THIRDPARTY 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/THIRDPARTY 2024-08-03 07:29:56.000000000 +0000 @@ -1712,3 +1712,32 @@ POSSIBILITY OF SUCH DAMAGE. *************************************************************************** + +%%The following software may be included in this product: +socketpair.c + +Copyright 2007, 2010 by Nathan C. Myers +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + The name of the author must not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + */ diff -Nru mariadb-10.11.6/VERSION mariadb-10.11.9/VERSION --- mariadb-10.11.6/VERSION 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/VERSION 2024-08-03 07:29:56.000000000 +0000 @@ -1,4 +1,4 @@ MYSQL_VERSION_MAJOR=10 MYSQL_VERSION_MINOR=11 -MYSQL_VERSION_PATCH=6 +MYSQL_VERSION_PATCH=9 SERVER_MATURITY=stable diff -Nru mariadb-10.11.6/appveyor.yml mariadb-10.11.9/appveyor.yml --- mariadb-10.11.6/appveyor.yml 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/appveyor.yml 2024-08-03 07:29:56.000000000 +0000 @@ -27,4 +27,14 @@ - set /A parallel=4*%NUMBER_OF_PROCESSORS% - perl mysql-test-run.pl --force --max-test-fail=10 --retry=2 --parallel=%parallel% --testcase-timeout=4 --suite=main --skip-test-list=%APPVEYOR_BUILD_FOLDER%\win\appveyor_skip_tests.txt --mysqld=--loose-innodb-flush-log-at-trx-commit=2 +skip_commits: + files: + - debian/ + - '**/*.sh' + +branches: + only: + - /bb-/ + - /\d+\.\d+$/ + image: Visual Studio 2022 diff -Nru mariadb-10.11.6/client/CMakeLists.txt mariadb-10.11.9/client/CMakeLists.txt --- mariadb-10.11.6/client/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -16,9 +16,9 @@ INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include - ${PCRE_INCLUDES} + ${PCRE_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/mysys_ssl - ${ZLIB_INCLUDE_DIR} + ${ZLIB_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/sql ${CMAKE_SOURCE_DIR}/strings diff -Nru mariadb-10.11.6/client/client_priv.h mariadb-10.11.9/client/client_priv.h --- mariadb-10.11.6/client/client_priv.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/client_priv.h 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2012, Oracle and/or its affiliates. - Copyright (c) 2009, 2022, MariaDB + Copyright (c) 2009, 2024, MariaDB 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 @@ -38,75 +38,34 @@ { OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET, OPT_PAGER, OPT_TEE, - OPT_LOW_PRIORITY, OPT_AUTO_REPAIR, OPT_COMPRESS, - OPT_DROP, OPT_LOCKS, OPT_KEYWORDS, OPT_DELAYED, OPT_OPTIMIZE, - OPT_FTB, OPT_LTB, OPT_ENC, OPT_O_ENC, OPT_ESC, OPT_TABLES, - OPT_MASTER_DATA, OPT_AUTOCOMMIT, OPT_AUTO_REHASH, - OPT_LINE_NUMBERS, OPT_COLUMN_NAMES, OPT_CONNECT_TIMEOUT, - OPT_MAX_ALLOWED_PACKET, OPT_NET_BUFFER_LENGTH, - OPT_SELECT_LIMIT, OPT_MAX_JOIN_SIZE, OPT_SSL_SSL, + OPT_OPTIMIZE, + OPT_TABLES, + OPT_MASTER_DATA, OPT_SSL_KEY, OPT_SSL_CERT, OPT_SSL_CA, OPT_SSL_CAPATH, - OPT_SSL_CIPHER, OPT_TLS_VERSION, OPT_SHUTDOWN_TIMEOUT, OPT_LOCAL_INFILE, - OPT_DELETE_MASTER_LOGS, OPT_COMPACT, - OPT_PROMPT, OPT_IGN_LINES,OPT_TRANSACTION,OPT_MYSQL_PROTOCOL, - OPT_FRM, OPT_SKIP_OPTIMIZATION, - OPT_COMPATIBLE, OPT_RECONNECT, OPT_DELIMITER, OPT_SECURE_AUTH, - OPT_OPEN_FILES_LIMIT, OPT_SET_CHARSET, OPT_SERVER_ARG, - OPT_STOP_POSITION, OPT_START_DATETIME, OPT_STOP_DATETIME, - OPT_SIGINT_IGNORE, OPT_HEXBLOB, OPT_ORDER_BY_PRIMARY, OPT_COUNT, - OPT_FLUSH_TABLES, - OPT_TRIGGERS, - OPT_MYSQL_ONLY_PRINT, - OPT_MYSQL_LOCK_DIRECTORY, - OPT_USE_THREADS, - OPT_IMPORT_USE_THREADS, - OPT_MYSQL_NUMBER_OF_QUERY, + OPT_SSL_CIPHER, OPT_LOCAL_INFILE, + OPT_COMPACT, + OPT_MYSQL_PROTOCOL, + OPT_SKIP_OPTIMIZATION, + OPT_COMPATIBLE, OPT_DELIMITER, + OPT_SERVER_ARG, + OPT_START_DATETIME, OPT_STOP_DATETIME, OPT_IGNORE_DATABASE, - OPT_IGNORE_TABLE,OPT_INSERT_IGNORE,OPT_SHOW_WARNINGS,OPT_DROP_DATABASE, - OPT_TZ_UTC, OPT_CREATE_SLAP_SCHEMA, - OPT_MYSQLDUMP_SLAVE_APPLY, + OPT_IGNORE_TABLE, OPT_MYSQLDUMP_SLAVE_DATA, - OPT_MYSQLDUMP_INCLUDE_MASTER_HOST_PORT, -#ifdef WHEN_FLASHBACK_REVIEW_READY - OPT_REVIEW, - OPT_REVIEW_DBNAME, OPT_REVIEW_TABLENAME, -#endif - OPT_SLAP_CSV, OPT_SLAP_CREATE_STRING, - OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE, OPT_SLAP_AUTO_GENERATE_WRITE_NUM, - OPT_SLAP_AUTO_GENERATE_ADD_AUTO, - OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY, - OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES, - OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES, - OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM, - OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM, - OPT_SLAP_PRE_QUERY, - OPT_SLAP_POST_QUERY, - OPT_SLAP_PRE_SYSTEM, - OPT_SLAP_POST_SYSTEM, - OPT_SLAP_COMMIT, - OPT_SLAP_DETACH, - OPT_SLAP_NO_DROP, - OPT_MYSQL_REPLACE_INTO, OPT_BASE64_OUTPUT_MODE, OPT_SERVER_ID, - OPT_FIX_TABLE_NAMES, OPT_FIX_DB_NAMES, OPT_SSL_VERIFY_SERVER_CERT, - OPT_AUTO_VERTICAL_OUTPUT, - OPT_DEBUG_INFO, OPT_DEBUG_CHECK, OPT_COLUMN_TYPES, OPT_ERROR_LOG_FILE, - OPT_WRITE_BINLOG, OPT_DUMP_DATE, - OPT_INIT_COMMAND, + OPT_SLAP_CSV, + OPT_BASE64_OUTPUT_MODE, + OPT_FIX_TABLE_NAMES, OPT_FIX_DB_NAMES, + OPT_WRITE_BINLOG, OPT_PLUGIN_DIR, OPT_DEFAULT_AUTH, - OPT_ABORT_SOURCE_ON_ERROR, OPT_REWRITE_DB, - OPT_REPORT_PROGRESS, - OPT_SKIP_ANNOTATE_ROWS_EVENTS, OPT_SSL_CRL, OPT_SSL_CRLPATH, OPT_IGNORE_DATA, OPT_PRINT_ROW_COUNT, OPT_PRINT_ROW_EVENT_POSITIONS, OPT_CHECK_IF_UPGRADE_NEEDED, OPT_COMPATIBILTY_CLEARTEXT_PLUGIN, - OPT_SHUTDOWN_WAIT_FOR_SLAVES, - OPT_COPY_S3_TABLES, - OPT_PRINT_TABLE_METADATA, - OPT_ASOF_TIMESTAMP, + OPT_STOP_POSITION, + OPT_SERVER_ID, OPT_IGNORE_DOMAIN_IDS, OPT_DO_DOMAIN_IDS, OPT_IGNORE_SERVER_IDS, diff -Nru mariadb-10.11.6/client/mysql.cc mariadb-10.11.9/client/mysql.cc --- mariadb-10.11.6/client/mysql.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysql.cc 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2018, Oracle and/or its affiliates. - Copyright (c) 2009, 2022, MariaDB Corporation. + Copyright (c) 2009, 2024, MariaDB Corporation. 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 @@ -226,7 +226,7 @@ ulong query_start_line; char *file_name; LINE_BUFFER *line_buff; - bool batch,add_to_history; + bool batch, add_to_history, sandbox; } STATUS; @@ -244,11 +244,12 @@ vertical=0, line_numbers=1, column_names=1,opt_html=0, opt_xml=0,opt_nopager=1, opt_outfile=0, named_cmds= 0, tty_password= 0, opt_nobeep=0, opt_reconnect=1, - opt_secure_auth= 0, + opt_secure_auth= 0, default_pager_set= 0, opt_sigint_ignore= 0, auto_vertical_output= 0, show_warnings= 0, executing_query= 0, - ignore_spaces= 0, opt_binhex= 0, opt_progress_reports; + ignore_spaces= 0, opt_binhex= 0, opt_progress_reports, + opt_print_query_on_error; static my_bool debug_info_flag, debug_check_flag, batch_abort_on_error; static my_bool column_types_flag; static my_bool preserve_comments= 0; @@ -261,6 +262,9 @@ static my_bool opt_binary_mode= FALSE; static my_bool opt_connect_expired_password= FALSE; static int interrupted_query= 0; +#ifdef USE_LIBEDIT_INTERFACE +static int sigint_received= 0; +#endif static char *current_host,*current_db,*current_user=0,*opt_password=0, *current_prompt=0, *delimiter_str= 0, *default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME, @@ -321,7 +325,9 @@ com_rehash(String *str, char*), com_tee(String *str, char*), com_notee(String *str, char*), com_charset(String *str,char*), com_prompt(String *str, char*), com_delimiter(String *str, char*), - com_warnings(String *str, char*), com_nowarnings(String *str, char*); + com_warnings(String *str, char*), com_nowarnings(String *str, char*), + com_sandbox(String *str, char*); +static void print_query_to_stderr(String *buffer); #ifdef USE_POPEN static int com_nopager(String *str, char*), com_pager(String *str, char*), @@ -369,11 +375,12 @@ static COMMANDS commands[] = { { "?", '?', com_help, 1, "Synonym for `help'." }, + { "charset", 'C', com_charset, 1, + "Switch to another charset. Might be needed for processing binlog with multi-byte charsets." }, { "clear", 'c', com_clear, 0, "Clear the current input statement."}, { "connect",'r', com_connect,1, "Reconnect to the server. Optional arguments are db and host." }, - { "delimiter", 'd', com_delimiter, 1, - "Set statement delimiter." }, + { "delimiter", 'd', com_delimiter, 1, "Set statement delimiter." }, #ifdef USE_POPEN { "edit", 'e', com_edit, 0, "Edit command with $EDITOR."}, #endif @@ -386,6 +393,8 @@ { "nopager",'n', com_nopager,0, "Disable pager, print to stdout." }, #endif { "notee", 't', com_notee, 0, "Don't write into outfile." }, + { "nowarning", 'w', com_nowarnings, 0, + "Don't show warnings after every statement." }, #ifdef USE_POPEN { "pager", 'P', com_pager, 1, "Set PAGER [to_pager]. Print the query results via PAGER." }, @@ -394,6 +403,8 @@ { "prompt", 'R', com_prompt, 1, "Change your mysql prompt."}, { "quit", 'q', com_quit, 0, "Quit mysql." }, { "rehash", '#', com_rehash, 0, "Rebuild completion hash." }, + { "sandbox", '-', com_sandbox, 0, + "Disallow commands that access the file system (except \\P without an argument and \\e)." }, { "source", '.', com_source, 1, "Execute an SQL script file. Takes a file name as an argument."}, { "status", 's', com_status, 0, "Get status information from the server."}, @@ -404,12 +415,8 @@ "Set outfile [to_outfile]. Append everything into given outfile." }, { "use", 'u', com_use, 1, "Use another database. Takes database name as argument." }, - { "charset", 'C', com_charset, 1, - "Switch to another charset. Might be needed for processing binlog with multi-byte charsets." }, { "warnings", 'W', com_warnings, 0, "Show warnings after every statement." }, - { "nowarning", 'w', com_nowarnings, 0, - "Don't show warnings after every statement." }, /* Get bash-like expansion for some commands */ { "create table", 0, 0, 0, ""}, { "create database", 0, 0, 0, ""}, @@ -1162,6 +1169,8 @@ static sig_handler window_resize(int sig); #endif +static void end_in_sig_handler(int sig); +static bool kill_query(const char *reason); const char DELIMITER_NAME[]= "delimiter"; const uint DELIMITER_NAME_LEN= sizeof(DELIMITER_NAME) - 1; @@ -1199,6 +1208,8 @@ static int delimiter_index= -1; static int charset_index= -1; +static int sandbox_index= -1; + static bool real_binary_mode= FALSE; @@ -1209,7 +1220,8 @@ MY_INIT(argv[0]); DBUG_ENTER("main"); DBUG_PROCESS(argv[0]); - + + sandbox_index= get_command_index('-'); charset_index= get_command_index('C'); delimiter_index= get_command_index('d'); delimiter_str= delimiter; @@ -1301,8 +1313,8 @@ if (opt_sigint_ignore) signal(SIGINT, SIG_IGN); else - signal(SIGINT, handle_sigint); // Catch SIGINT to clean up - signal(SIGQUIT, mysql_end); // Catch SIGQUIT to clean up + signal(SIGINT, handle_sigint); // Catch SIGINT to clean up + signal(SIGQUIT, mysql_end); // Catch SIGQUIT to clean up #if defined(HAVE_TERMIOS_H) && defined(GWINSZ_IN_SYS_IOCTL) /* Readline will call this if it installs a handler */ @@ -1512,30 +1524,35 @@ } -/* - This function handles sigint calls - If query is in process, kill query - If 'source' is executed, abort source command - no query in process, terminate like previous behavior - */ +void end_in_sig_handler(int sig) +{ +#ifdef _WIN32 + /* + When SIGINT is raised on Windows, the OS creates a new thread to handle the + interrupt. Once that thread completes, the main thread continues running + only to find that it's resources have already been free'd when the sigint + handler called mysql_end(). + */ + mysql_thread_end(); +#else + mysql_end(sig); +#endif +} -sig_handler handle_sigint(int sig) + +/* + Kill a running query. Returns true if we were unable to connect to the server. +*/ +bool kill_query(const char *reason) { char kill_buffer[40]; MYSQL *kill_mysql= NULL; - /* terminate if no query being executed, or we already tried interrupting */ - if (!executing_query || (interrupted_query == 2)) - { - tee_fprintf(stdout, "Ctrl-C -- exit!\n"); - goto err; - } - kill_mysql= mysql_init(kill_mysql); if (!do_connect(kill_mysql,current_host, current_user, opt_password, "", 0)) { - tee_fprintf(stdout, "Ctrl-C -- sorry, cannot connect to server to kill query, giving up ...\n"); - goto err; + tee_fprintf(stdout, "%s -- sorry, cannot connect to server to kill query, giving up ...\n", reason); + return true; } /* First time try to kill the query, second time the connection */ @@ -1550,27 +1567,62 @@ (interrupted_query == 1) ? "QUERY " : "", mysql_thread_id(&mysql)); if (verbose) - tee_fprintf(stdout, "Ctrl-C -- sending \"%s\" to server ...\n", + tee_fprintf(stdout, "%s -- sending \"%s\" to server ...\n", reason, kill_buffer); mysql_real_query(kill_mysql, kill_buffer, (uint) strlen(kill_buffer)); mysql_close(kill_mysql); - tee_fprintf(stdout, "Ctrl-C -- query killed. Continuing normally.\n"); + if (interrupted_query == 1) + tee_fprintf(stdout, "%s -- query killed.\n", reason); + else + tee_fprintf(stdout, "%s -- connection killed.\n", reason); + if (in_com_source) aborted= 1; // Abort source command - return; + return false; +} -err: -#ifdef _WIN32 +/* + This function handles sigint calls + If query is in process, kill query + If 'source' is executed, abort source command + no query in process, regenerate prompt. +*/ +sig_handler handle_sigint(int sig) +{ /* - When SIGINT is raised on Windows, the OS creates a new thread to handle the - interrupt. Once that thread completes, the main thread continues running - only to find that it's resources have already been free'd when the sigint - handler called mysql_end(). + On Unix only, if no query is being executed just clear the prompt, + don't exit. On Windows we exit. */ - mysql_thread_end(); + if (!executing_query) + { +#ifndef _WIN32 + tee_fprintf(stdout, "^C\n"); +#ifdef USE_LIBEDIT_INTERFACE + /* Libedit will regenerate it outside of the signal handler. */ + sigint_received= 1; #else - mysql_end(sig); -#endif + rl_on_new_line(); // Regenerate the prompt on a newline + rl_replace_line("", 0); // Clear the previous text + rl_redisplay(); +#endif +#else // WIN32 + tee_fprintf(stdout, "Ctrl-C -- exit!\n"); + end_in_sig_handler(sig); +#endif + return; + } + + /* + When executing a query, this newline makes the prompt look like so: + ^C + Ctrl-C -- query killed. + */ + tee_fprintf(stdout, "\n"); + if (kill_query("Ctrl-C")) + { + aborted= 1; + end_in_sig_handler(sig); + } } @@ -1591,35 +1643,47 @@ 0, 0, 0, 0, 0}, {"help", 'I', "Synonym for -?", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"abort-source-on-error", OPT_ABORT_SOURCE_ON_ERROR, + {"abort-source-on-error", 0, "Abort 'source filename' operations in case of errors", &batch_abort_on_error, &batch_abort_on_error, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-rehash", OPT_AUTO_REHASH, + {"auto-rehash", 0, "Enable automatic rehashing. One doesn't need to use 'rehash' to get table " - "and field completion, but startup and reconnecting may take a longer time. " - "Disable with --disable-auto-rehash.", - &opt_rehash, &opt_rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, - 0, 0}, + "and field completion, but startup and reconnecting may take a longer time.", + &opt_rehash, &opt_rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"no-auto-rehash", 'A', "No automatic rehashing. One has to use 'rehash' to get table and field " "completion. This gives a quicker start of mysql and disables rehashing " "on reconnect.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-vertical-output", OPT_AUTO_VERTICAL_OUTPUT, + {"auto-vertical-output", 0, "Automatically switch to vertical output mode if the result is wider " - "than the terminal width.", - &auto_vertical_output, &auto_vertical_output, 0, GET_BOOL, NO_ARG, 0, - 0, 0, 0, 0, 0}, + "than the terminal width.", &auto_vertical_output, &auto_vertical_output, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"batch", 'B', "Don't use history file. Disable interactive behavior. (Enables --silent.)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"binary-as-hex", 0, "Print binary data as hex", &opt_binhex, &opt_binhex, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"binary-mode", 0, + "Binary mode allows certain character sequences to be processed as data " + "that would otherwise be treated with a special meaning by the parser. " + "Specifically, this switch turns off parsing of all client commands except " + "\\C and DELIMITER in non-interactive mode (i.e., when binary mode is " + "combined with either 1) piped input, 2) the --batch mysql option, or 3) " + "the 'source' command). Also, in binary mode, occurrences of '\\r\\n' and " + "ASCII '\\0' are preserved within strings, whereas by default, '\\r\\n' is " + "translated to '\\n' and '\\0' is disallowed in user input.", + &opt_binary_mode, &opt_binary_mode, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"character-sets-dir", OPT_CHARSETS_DIR, "Directory for character set files.", &charsets_dir, &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"column-type-info", OPT_COLUMN_TYPES, "Display column type information.", + {"column-names", 0, "Write column names in results.", + &column_names, &column_names, 0, GET_BOOL, + NO_ARG, 1, 0, 0, 0, 0, 0}, + {"skip-column-names", 'N', "Don't write column names in results.", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"column-type-info", 0, "Display column type information.", &column_types_flag, &column_types_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"comments", 'c', "Preserve comments. Send comments to the server." @@ -1629,6 +1693,16 @@ {"compress", 'C', "Use compression in server/client protocol.", &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"connect-expired-password", 0, + "Notify the server that this client is prepared to handle expired " + "password sandbox mode even if --batch was specified.", + &opt_connect_expired_password, &opt_connect_expired_password, 0, GET_BOOL, + NO_ARG, 0, 0, 0, 0, 0, 0}, + {"connect_timeout", 0, "Number of seconds before connection timeout.", + &opt_connect_timeout, &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, + 0, 0, 3600*12, 0, 0, 0}, + {"database", 'D', "Database to use.", ¤t_db, + ¤t_db, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #ifdef DBUG_OFF {"debug", '#', "This is a non-debug version. Catch this and exit.", 0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0}, @@ -1636,70 +1710,64 @@ {"debug", '#', "Output debug log.", &default_dbug_option, &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"debug-info", 'T', "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"database", 'D', "Database to use.", ¤t_db, - ¤t_db, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-auth", 0, "Default authentication client-side plugin to use.", + &opt_default_auth, &opt_default_auth, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"delimiter", OPT_DELIMITER, "Delimiter to be used.", &delimiter_str, &delimiter_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"enable-cleartext-plugin", OPT_COMPATIBILTY_CLEARTEXT_PLUGIN, + "Obsolete option. Exists only for MySQL compatibility.", + 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"execute", 'e', "Execute command and quit. (Disables --force and history file.)", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"enable-cleartext-plugin", OPT_COMPATIBILTY_CLEARTEXT_PLUGIN, "Obsolete option. Exists only for MySQL compatibility.", - 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"vertical", 'E', "Print the output of a query (rows) vertically.", - &vertical, &vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, - 0}, - {"force", 'f', "Continue even if we get an SQL error. Sets abort-source-on-error to 0", - &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, + {"force", 'f', + "Continue even if we get an SQL error. Sets abort-source-on-error to 0", + &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"host", 'h', "Connect to host.", ¤t_host, + ¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"html", 'H', "Produce HTML output.", &opt_html, &opt_html, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"ignore-spaces", 'i', "Ignore space after function names.", + &ignore_spaces, &ignore_spaces, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"init-command", 0, + "SQL Command to execute when connecting to MariaDB server. Will " + "automatically be re-executed when reconnecting.", &opt_init_command, + &opt_init_command, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"line-numbers", 0, "Write line numbers for errors.", + &line_numbers, &line_numbers, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"skip-line-numbers", 'L', "Don't write line number for errors.", 0, 0, 0, + GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"local-infile", OPT_LOCAL_INFILE, "Enable LOAD DATA LOCAL INFILE.", + &opt_local_infile, &opt_local_infile, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, + {"max-allowed-packet", 0, + "The maximum packet length to send to or receive from server.", + &opt_max_allowed_packet, &opt_max_allowed_packet, 0, GET_ULONG, + REQUIRED_ARG, 16*1024LL*1024LL, 4096, 2*1024LL*1024LL*1024LL, 0, 1024, 0}, + {"max-join-size", 0, + "Automatic limit for rows in a join when using --safe-updates.", + &max_join_size, &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, + 1, ULONG_MAX, 0, 1, 0}, {"named-commands", 'G', "Enable named commands. Named commands mean this program's internal " "commands; see mysql> help . When enabled, the named commands can be " "used from any line of the query, otherwise only from the first line, " "before an enter. Disable with --disable-named-commands. This option " "is disabled by default.", - &named_cmds, &named_cmds, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"ignore-spaces", 'i', "Ignore space after function names.", - &ignore_spaces, &ignore_spaces, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, - {"init-command", OPT_INIT_COMMAND, - "SQL Command to execute when connecting to MariaDB server. Will " - "automatically be re-executed when reconnecting.", - &opt_init_command, &opt_init_command, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"local-infile", OPT_LOCAL_INFILE, "Enable/disable LOAD DATA LOCAL INFILE.", - &opt_local_infile, &opt_local_infile, 0, GET_BOOL, OPT_ARG, 0, 0, 0, 0, 0, 0}, + &named_cmds, &named_cmds, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"net-buffer-length", 0, + "The buffer size for TCP/IP and socket communication.", + &opt_net_buffer_length, &opt_net_buffer_length, 0, GET_ULONG, + REQUIRED_ARG, 16384, 1024, 512*1024ULL*1024ULL, MALLOC_OVERHEAD, 1024, 0}, {"no-beep", 'b', "Turn off beep on error.", &opt_nobeep, &opt_nobeep, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"host", 'h', "Connect to host.", ¤t_host, - ¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"html", 'H', "Produce HTML output.", &opt_html, &opt_html, - 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"xml", 'X', "Produce XML output.", &opt_xml, &opt_xml, 0, - GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"line-numbers", OPT_LINE_NUMBERS, "Write line numbers for errors.", - &line_numbers, &line_numbers, 0, GET_BOOL, - NO_ARG, 1, 0, 0, 0, 0, 0}, - {"skip-line-numbers", 'L', "Don't write line number for errors.", 0, 0, 0, GET_NO_ARG, - NO_ARG, 0, 0, 0, 0, 0, 0}, - {"unbuffered", 'n', "Flush buffer after each query.", &unbuffered, - &unbuffered, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"column-names", OPT_COLUMN_NAMES, "Write column names in results.", - &column_names, &column_names, 0, GET_BOOL, - NO_ARG, 1, 0, 0, 0, 0, 0}, - {"skip-column-names", 'N', - "Don't write column names in results.", - 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"sigint-ignore", OPT_SIGINT_IGNORE, "Ignore SIGINT (CTRL-C).", - &opt_sigint_ignore, &opt_sigint_ignore, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, {"one-database", 'o', "Ignore statements except those that occur while the default " "database is the one named at the command line.", @@ -1720,19 +1788,24 @@ {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif + {"plugin-dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, + &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " "order of preference, my.cnf, $MYSQL_TCP_PORT, " #if MYSQL_PORT_DEFAULT == 0 "/etc/services, " #endif - "built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").", - &opt_mysql_port, - &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"progress-reports", OPT_REPORT_PROGRESS, + "built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").", &opt_mysql_port, + &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"print-query-on-error", 0, + "Print the query if there was an error. Is only enabled in --batch mode if verbose is not set (as then the query would be printed anyway)", + &opt_print_query_on_error, &opt_print_query_on_error, 0, GET_BOOL, NO_ARG, + 1, 0, 0, 0, 0, 0}, + {"progress-reports", 0, "Get progress reports for long running commands (like ALTER TABLE)", &opt_progress_reports, &opt_progress_reports, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"prompt", OPT_PROMPT, "Set the command line prompt to this value.", + {"prompt", 0, "Set the command line prompt to this value.", ¤t_prompt, ¤t_prompt, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"protocol", OPT_MYSQL_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe).", @@ -1743,11 +1816,27 @@ "if the output is suspended. Doesn't use history file.", &quick, &quick, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"raw", 'r', "Write fields without conversion. Used with --batch.", - &opt_raw_data, &opt_raw_data, 0, GET_BOOL, NO_ARG, 0, 0, 0, - 0, 0, 0}, - {"reconnect", OPT_RECONNECT, "Reconnect if the connection is lost. Disable " - "with --disable-reconnect. This option is enabled by default.", + &opt_raw_data, &opt_raw_data, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"reconnect", 0, "Reconnect if the connection is lost.", &opt_reconnect, &opt_reconnect, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"safe-updates", 'U', "Only allow UPDATE and DELETE that uses keys.", + &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"i-am-a-dummy", 'U', "Synonym for option --safe-updates, -U.", + &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sandbox", 0, "Disallow commands that access the file system (except \\P without an argument and \\e).", + &status.sandbox, &status.sandbox, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"secure-auth", 0, "Refuse client connecting to server if it" + " uses old (pre-4.1.1) protocol.", &opt_secure_auth, + &opt_secure_auth, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"select-limit", 0, + "Automatic limit for SELECT when using --safe-updates.", &select_limit, + &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, 1, ULONG_MAX, 0, 1, 0}, + {"server-arg", OPT_SERVER_ARG, "Send embedded server this as a parameter.", + 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"show-warnings", 0, "Show warnings after every statement.", + &show_warnings, &show_warnings, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"sigint-ignore", 0, "Ignore SIGINT (CTRL-C).", &opt_sigint_ignore, + &opt_sigint_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"silent", 's', "Be more silent. Print results with a tab as separator, " "each row on new line.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"socket", 'S', "The socket file to use for connection.", @@ -1761,73 +1850,22 @@ "Does not work in batch mode. Disable with --disable-tee. " "This option is disabled by default.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"unbuffered", 'n', "Flush buffer after each query.", &unbuffered, + &unbuffered, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, #ifndef DONT_ALLOW_USER_CHANGE {"user", 'u', "User for login if not current user.", ¤t_user, ¤t_user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"safe-updates", 'U', "Only allow UPDATE and DELETE that uses keys.", - &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, - {"i-am-a-dummy", 'U', "Synonym for option --safe-updates, -U.", - &safe_updates, &safe_updates, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, {"verbose", 'v', "Write more. (-v -v -v gives the table output format).", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"vertical", 'E', "Print the output of a query (rows) vertically.", + &vertical, &vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"connect_timeout", OPT_CONNECT_TIMEOUT, - "Number of seconds before connection timeout.", - &opt_connect_timeout, &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, - 0, 0, 3600*12, 0, 0, 0}, - {"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, - "The maximum packet length to send to or receive from server.", - &opt_max_allowed_packet, &opt_max_allowed_packet, 0, - GET_ULONG, REQUIRED_ARG, 16 *1024L*1024L, 4096, - (longlong) 2*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0}, - {"net_buffer_length", OPT_NET_BUFFER_LENGTH, - "The buffer size for TCP/IP and socket communication.", - &opt_net_buffer_length, &opt_net_buffer_length, 0, GET_ULONG, - REQUIRED_ARG, 16384, 1024, 512*1024*1024L, MALLOC_OVERHEAD, 1024, 0}, - {"select_limit", OPT_SELECT_LIMIT, - "Automatic limit for SELECT when using --safe-updates.", - &select_limit, &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, - 1, ULONG_MAX, 0, 1, 0}, - {"max_join_size", OPT_MAX_JOIN_SIZE, - "Automatic limit for rows in a join when using --safe-updates.", - &max_join_size, &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, - 1, ULONG_MAX, 0, 1, 0}, - {"secure-auth", OPT_SECURE_AUTH, "Refuse client connecting to server if it" - " uses old (pre-4.1.1) protocol.", &opt_secure_auth, - &opt_secure_auth, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"server-arg", OPT_SERVER_ARG, "Send embedded server this as a parameter.", - 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"show-warnings", OPT_SHOW_WARNINGS, "Show warnings after every statement.", - &show_warnings, &show_warnings, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", - &opt_plugin_dir, &opt_plugin_dir, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, - "Default authentication client-side plugin to use.", - &opt_default_auth, &opt_default_auth, 0, - GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"binary-mode", 0, - "Binary mode allows certain character sequences to be processed as data " - "that would otherwise be treated with a special meaning by the parser. " - "Specifically, this switch turns off parsing of all client commands except " - "\\C and DELIMITER in non-interactive mode (i.e., when binary mode is " - "combined with either 1) piped input, 2) the --batch mysql option, or 3) " - "the 'source' command). Also, in binary mode, occurrences of '\\r\\n' and " - "ASCII '\\0' are preserved within strings, whereas by default, '\\r\\n' is " - "translated to '\\n' and '\\0' is disallowed in user input.", - &opt_binary_mode, &opt_binary_mode, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"connect-expired-password", 0, - "Notify the server that this client is prepared to handle expired " - "password sandbox mode even if --batch was specified.", - &opt_connect_expired_password, &opt_connect_expired_password, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, + {"xml", 'X', "Produce XML output.", &opt_xml, &opt_xml, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; @@ -2137,6 +2175,15 @@ return(0); } + +#if !defined(_WIN32) && defined(USE_LIBEDIT_INTERFACE) +static inline void reset_prompt(char *in_string, bool *ml_comment) { + glob_buffer.length(0); + *ml_comment = false; + *in_string = 0; +} +#endif + static int read_and_execute(bool interactive) { char *line= NULL; @@ -2228,7 +2275,30 @@ if (line) free(line); line= readline(prompt); -#endif /* defined(_WIN32) */ +#ifdef USE_LIBEDIT_INTERFACE + /* + libedit handles interrupts different than libreadline. + libreadline has its own signal handlers, thus a sigint during readline + doesn't force readline to return null string. + + However libedit returns null if the interrupt signal is raised. + We can also get an empty string when ctrl+d is pressed (EoF). + + We need this sigint_received flag, to differentiate between the two + cases. This flag is only set during our handle_sigint function when + LIBEDIT_INTERFACE is used. + */ + if (!line && sigint_received) + { + // User asked to clear the input. + sigint_received= 0; + reset_prompt(&in_string, &ml_comment); + continue; + } + // For safety, we always mark this as cleared. + sigint_received= 0; +#endif +#endif /* defined(__WIN__) */ /* When Ctrl+d or Ctrl+z is pressed, the line may be NULL on some OS @@ -2306,8 +2376,9 @@ /** It checks if the input is a short form command. It returns the command's - pointer if a command is found, else return NULL. Note that if binary-mode - is set, then only \C is searched for. + pointer if a command is found, else return NULL. + + Note that if binary-mode is set, then only \C and \- are searched for. @param cmd_char A character of one byte. @@ -2322,13 +2393,23 @@ int index= -1; /* - In binary-mode, we disallow all mysql commands except '\C' - and DELIMITER. + In binary-mode, we disallow all client commands except '\C', + DELIMITER (see long comand finding find_command(char *)) + and '\-' (sandbox, see following comment). */ if (real_binary_mode) { if (cmd_char == 'C') index= charset_index; + /* + binary-mode enforces stricter controls compared to sandbox mode. + Whether sandbox mode is enabled or not is irrelevant when + binary-mode is active. + The only purpose of processing sandbox mode here is to avoid error + messages on files made by mysqldump. + */ + else if (cmd_char == '-') + index= sandbox_index; } else index= get_command_index(cmd_char); @@ -2384,6 +2465,12 @@ len= (uint) strlen(name); int index= -1; + /* + In binary-mode, we disallow all client commands except DELIMITER + and short commands '\C' and '\-' (see short command finding + find_command(char)). + */ + if (real_binary_mode) { if (is_delimiter_command(name, len)) @@ -2847,9 +2934,7 @@ array of matches, or NULL if there aren't any. */ -static char **new_mysql_completion(const char *text, - int start __attribute__((unused)), - int end __attribute__((unused))) +static char **new_mysql_completion(const char *text, int, int) { if (!status.batch && !quick) #if defined(USE_NEW_READLINE_INTERFACE) @@ -3141,6 +3226,11 @@ int error; if (!mysql_real_query(&mysql,buf,(ulong)length)) return 0; + if (opt_print_query_on_error) + { + String query(buf, length, charset_info); + (void) print_query_to_stderr(&query); + } error= put_error(&mysql); if (mysql_errno(&mysql) != CR_SERVER_GONE_ERROR || retry > 1 || !opt_reconnect) @@ -3172,8 +3262,7 @@ } -static int com_server_help(String *buffer __attribute__((unused)), - char *line __attribute__((unused)), char *help_arg) +static int com_server_help(String *buffer, char *, char *help_arg) { MYSQL_ROW cur; const char *server_cmd; @@ -3275,18 +3364,16 @@ return error; } -static int -com_help(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_help(String *buffer, char *line) { int i, j; char * help_arg= strchr(line,' '), buff[32], *end; if (help_arg) { - while (my_isspace(charset_info,*help_arg)) + while (my_isspace(charset_info, *help_arg)) help_arg++; if (*help_arg) - return com_server_help(buffer,line,help_arg); + return com_server_help(buffer, line, help_arg); } put_info("\nGeneral information about MariaDB can be found at\n" @@ -3309,9 +3396,7 @@ } - /* ARGSUSED */ -static int -com_clear(String *buffer,char *line __attribute__((unused))) +static int com_clear(String *buffer,char *) { #ifdef HAVE_READLINE if (status.add_to_history) @@ -3336,9 +3421,7 @@ } - /* ARGSUSED */ -static int -com_charset(String *buffer __attribute__((unused)), char *line) +static int com_charset(String *, char *line) { char buff[256], *param; CHARSET_INFO * new_cs; @@ -3370,9 +3453,7 @@ 1 if fatal error */ - -static int -com_go(String *buffer,char *line __attribute__((unused))) +static int com_go(String *buffer, char *) { char buff[200]; /* about 110 chars used so far */ char time_buff[53+3+1]; /* time max + space & parens + NUL */ @@ -3444,6 +3525,8 @@ { if (!(result=mysql_use_result(&mysql)) && mysql_field_count(&mysql)) { + if (opt_print_query_on_error) + print_query_to_stderr(buffer); error= put_error(&mysql); goto end; } @@ -3497,7 +3580,11 @@ (long) mysql_num_rows(result) == 1 ? "row" : "rows"); end_pager(); if (mysql_errno(&mysql)) + { + if (opt_print_query_on_error) + print_query_to_stderr(buffer); error= put_error(&mysql); + } } } else if (mysql_affected_rows(&mysql) == ~(ulonglong) 0) @@ -3524,13 +3611,21 @@ put_info("",INFO_RESULT); // Empty row if (result && !mysql_eof(result)) /* Something wrong when using quick */ + { + if (opt_print_query_on_error) + print_query_to_stderr(buffer); error= put_error(&mysql); + } else if (unbuffered) fflush(stdout); mysql_free_result(result); } while (!(err= mysql_next_result(&mysql))); if (err >= 1) + { + if (opt_print_query_on_error) + print_query_to_stderr(buffer); error= put_error(&mysql); + } end: @@ -3955,9 +4050,7 @@ } - -static void -print_table_data_html(MYSQL_RES *result) +static void print_table_data_html(MYSQL_RES *result) { MYSQL_ROW cur; MYSQL_FIELD *field; @@ -4253,15 +4346,15 @@ } } -static int -com_tee(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_tee(String *, char *line) { char file_name[FN_REFLEN], *end, *param; + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); if (status.batch) return 0; - while (my_isspace(charset_info,*line)) + while (my_isspace(charset_info, *line)) line++; if (!(param = strchr(line, ' '))) // if outfile wasn't given, use the default { @@ -4298,9 +4391,7 @@ } -static int -com_notee(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_notee(String *, char *) { if (opt_outfile) end_tee(); @@ -4313,9 +4404,7 @@ */ #ifdef USE_POPEN -static int -com_pager(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_pager(String *, char *line) { char pager_name[FN_REFLEN], *end, *param; @@ -4343,6 +4432,8 @@ } else { + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); end= strmake_buf(pager_name, param); while (end > pager_name && (my_isspace(charset_info,end[-1]) || my_iscntrl(charset_info,end[-1]))) @@ -4357,9 +4448,7 @@ } -static int -com_nopager(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_nopager(String *, char *) { strmov(pager, "stdout"); opt_nopager=1; @@ -4371,7 +4460,7 @@ #ifdef USE_POPEN static int -com_edit(String *buffer,char *line __attribute__((unused))) +com_edit(String *buffer,char *) { char filename[FN_REFLEN],buff[160]; int fd,tmp,error; @@ -4418,17 +4507,15 @@ /* If arg is given, exit without errors. This happens on command 'quit' */ -static int -com_quit(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_quit(String *, char *) { status.exit_status=0; return 1; } static int -com_rehash(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +com_rehash(String *, + char *) { #ifdef HAVE_READLINE build_completion_hash(1, 0); @@ -4438,12 +4525,13 @@ #ifdef USE_POPEN -static int -com_shell(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_shell(String *, char *line) { char *shell_cmd; + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); + /* Skip space from line begin */ while (my_isspace(charset_info, *line)) line++; @@ -4466,20 +4554,39 @@ #endif -static int -com_print(String *buffer,char *line __attribute__((unused))) +static void print_query(String *buffer, FILE *file) { - tee_puts("--------------", stdout); - (void) tee_fputs(buffer->c_ptr(), stdout); + tee_puts("--------------", file); + (void) tee_fputs(buffer->c_ptr(), file); if (!buffer->length() || (*buffer)[buffer->length()-1] != '\n') - tee_putc('\n', stdout); - tee_puts("--------------\n", stdout); - return 0; /* If empty buffer */ + tee_putc('\n', file); + tee_puts("--------------\n", file); } - /* ARGSUSED */ -static int -com_connect(String *buffer, char *line) + +/* + Print query to stderr in batch mode if verbose is not set +*/ + +static void print_query_to_stderr(String *buffer) +{ + if ((status.batch || in_com_source) && !verbose) + { + fflush(stdout); + print_query(buffer, stderr); + fflush(stderr); + } +} + + +static int com_print(String *buffer,char *) +{ + print_query(buffer, stdout); + return 0; +} + + +static int com_connect(String *buffer, char *line) { char *tmp, buff[256]; my_bool save_rehash= opt_rehash; @@ -4532,8 +4639,7 @@ } -static int com_source(String *buffer __attribute__((unused)), - char *line) +static int com_source(String *, char *line) { char source_name[FN_REFLEN], *end, *param; LINE_BUFFER *line_buff; @@ -4542,6 +4648,9 @@ FILE *sql_file; my_bool save_ignore_errors; + if (status.sandbox) + return put_info("Not allowed in the sandbox mode", INFO_ERROR, 0); + /* Skip space from file name */ while (my_isspace(charset_info,*line)) line++; @@ -4576,6 +4685,7 @@ bfill((char*) &status,sizeof(status),(char) 0); status.batch=old_status.batch; // Run in batch mode + status.sandbox=old_status.sandbox; status.line_buff=line_buff; status.file_name=source_name; glob_buffer.length(0); // Empty command buffer @@ -4597,9 +4707,7 @@ } - /* ARGSUSED */ -static int -com_delimiter(String *buffer __attribute__((unused)), char *line) +static int com_delimiter(String *, char *line) { char buff[256], *tmp; @@ -4626,9 +4734,7 @@ return 0; } - /* ARGSUSED */ -static int -com_use(String *buffer __attribute__((unused)), char *line) +static int com_use(String *, char *line) { char *tmp, buff[FN_REFLEN + 1]; int select_db; @@ -4701,18 +4807,21 @@ return 0; } -static int -com_warnings(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_sandbox(String *, char *) +{ + status.sandbox= 1; + put_info("Sandbox mode.", INFO_INFO); + return 0; +} + +static int com_warnings(String *, char *) { show_warnings = 1; put_info("Show warnings enabled.",INFO_INFO); return 0; } -static int -com_nowarnings(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_nowarnings(String *, char *) { show_warnings = 0; put_info("Show warnings disabled.",INFO_INFO); @@ -4964,10 +5073,7 @@ } - -static int -com_status(String *buffer __attribute__((unused)), - char *line __attribute__((unused))) +static int com_status(String *, char *) { const char *status_str; char buff[40]; @@ -5092,8 +5198,7 @@ return 0; } -static const char * -server_version_string(MYSQL *con) +static const char * server_version_string(MYSQL *con) { /* Only one thread calls this, so no synchronization is needed */ if (server_version == NULL) @@ -5218,11 +5323,11 @@ } -static int -put_error(MYSQL *con) +static int put_error(MYSQL *con) { - return put_info(mysql_error(con), INFO_ERROR, mysql_errno(con), - mysql_sqlstate(con)); + DBUG_ENTER("put_error"); + DBUG_RETURN(put_info(mysql_error(con), INFO_ERROR, + mysql_errno(con), mysql_sqlstate(con))); } @@ -5285,7 +5390,7 @@ len("4294967296 days, 23 hours, 59 minutes, 60.000 seconds") -> 53 */ -static void nice_time(double sec,char *buff,bool part_second) +static void nice_time(double sec, char *buff, bool part_second) { ulong tmp; if (sec >= 3600.0*24) @@ -5566,8 +5671,7 @@ } } -static int com_prompt(String *buffer __attribute__((unused)), - char *line) +static int com_prompt(String *, char *line) { char *ptr=strchr(line, ' '); prompt_counter = 0; diff -Nru mariadb-10.11.6/client/mysql_plugin.c mariadb-10.11.9/client/mysql_plugin.c --- mariadb-10.11.6/client/mysql_plugin.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysql_plugin.c 2024-08-03 07:29:56.000000000 +0000 @@ -686,7 +686,7 @@ if (i == -1) /* if first pass, read this line as so_name */ { /* Add proper file extension for soname */ - if (safe_strcpy(line + line_len - 1, sizeof(line), FN_SOEXT)) + if (safe_strcpy_truncated(line + line_len - 1, sizeof line, FN_SOEXT)) { reason= "Plugin name too long."; fclose(file_ptr); @@ -749,7 +749,7 @@ const char *plugin_dir_prefix = "--plugin_dir="; size_t plugin_dir_len= strlen(plugin_dir_prefix); - strcpy(plugin_name, ""); + *plugin_name= '\0'; for (i = 0; i < argc && num_found < 5; i++) { @@ -787,8 +787,8 @@ /* read the plugin config file and check for match against argument */ else { - if (safe_strcpy(plugin_name, sizeof(plugin_name), argv[i]) || - safe_strcpy(config_file, sizeof(config_file), argv[i]) || + if (safe_strcpy_truncated(plugin_name, sizeof plugin_name, argv[i]) || + safe_strcpy_truncated(config_file, sizeof config_file, argv[i]) || safe_strcat(config_file, sizeof(config_file), ".ini")) { fprintf(stderr, "ERROR: argument is too long.\n"); diff -Nru mariadb-10.11.6/client/mysql_upgrade.c mariadb-10.11.9/client/mysql_upgrade.c --- mariadb-10.11.6/client/mysql_upgrade.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysql_upgrade.c 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2006, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2017, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -87,10 +87,10 @@ {"basedir", 'b', "Not used by mysql_upgrade. Only for backward compatibility.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Not used by mysql_upgrade. Only for backward compatibility.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, - {"compress", OPT_COMPRESS, + {"compress", 0, "Not used by mysql_upgrade. Only for backward compatibility.", ¬_used, ¬_used, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"datadir", 'd', @@ -103,12 +103,12 @@ {"debug", '#', "Output debug log.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"debug-info", 'T', "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Not used by mysql_upgrade. Only for backward compatibility.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"default_auth", OPT_DEFAULT_AUTH, @@ -628,7 +628,7 @@ { my_close(fd, MYF(MY_WME)); my_delete(query_file_path, MYF(0)); - die("Failed to write to '%s'", query_file_path); + die("Failed to write query to '%s'", query_file_path); } } @@ -637,7 +637,7 @@ { my_close(fd, MYF(MY_WME)); my_delete(query_file_path, MYF(0)); - die("Failed to write to '%s'", query_file_path); + die("Failed to write query to '%s'", query_file_path); } ret= run_tool(mysql_path, @@ -647,6 +647,7 @@ "--batch", /* Turns off pager etc. */ force ? "--force": "--skip-force", opt_verbose >= 5 ? "--verbose" : "", + "--print-query-on-error", ds_res || opt_silent ? "--silent": "", "<", query_file_path, @@ -1085,18 +1086,6 @@ return line; } - -/* Print the current line to stderr */ -static void print_line(char* line) -{ - while (*line && *line != '\n') - { - fputc(*line, stderr); - line++; - } - fputc('\n', stderr); -} - static my_bool from_before_10_1() { my_bool ret= TRUE; @@ -1159,6 +1148,8 @@ DYNAMIC_STRING ds_result; const char *query = "SELECT table_comment FROM information_schema.tables" " WHERE table_comment LIKE 'Unknown data type: %'"; + if (opt_systables_only) + return 0; if (init_dynamic_string(&ds_result, "", 512, 512)) die("Out of memory"); run_query(query, &ds_result, TRUE); @@ -1313,16 +1304,21 @@ static int run_sql_fix_privilege_tables(void) { - int found_real_errors= 0; + int found_real_errors= 0, query_started= 0; const char **query_ptr; + const char *end; DYNAMIC_STRING ds_script; DYNAMIC_STRING ds_result; + DYNAMIC_STRING ds_query; DBUG_ENTER("run_sql_fix_privilege_tables"); - if (init_dynamic_string(&ds_script, "", 65536, 1024)) + if (init_dynamic_string(&ds_script, "", 96*1024, 8196)) die("Out of memory"); - if (init_dynamic_string(&ds_result, "", 512, 512)) + if (init_dynamic_string(&ds_result, "", 1024, 1024)) + die("Out of memory"); + + if (init_dynamic_string(&ds_query, "", 1024, 1024)) die("Out of memory"); verbose("Phase %d/%d: Running 'mysql_fix_privilege_tables'", @@ -1351,22 +1347,46 @@ "Unknown column" and "Duplicate key name" since they just indicate the system tables are already up to date */ - char *line= ds_result.str; + const char *line= ds_result.str; do { + size_t length; + end= strchr(line, '\n'); + if (!end) + end= strend(line); + else + end++; /* Include end \n */ + length= (size_t) (end - line); + if (!is_expected_error(line)) { /* Something unexpected failed, dump error line to screen */ found_real_errors++; - print_line(line); + if (ds_query.length) + fwrite(ds_query.str, sizeof(char), ds_query.length, stderr); + fwrite(line, sizeof(char), length, stderr); + query_started= 0; } else if (strncmp(line, "WARNING", 7) == 0) { - print_line(line); + fwrite(line, sizeof(char), length, stderr); + query_started= 0; + } + else if (!strncmp(line, "--------------\n", 16)) + { + /* mariadb separates query from the error with a line of '-' */ + if (!query_started++) + ds_query.length= 0; /* Truncate */ + else + query_started= 0; /* End of query */ } - } while ((line= get_line(line)) && *line); + else if (query_started) + { + dynstr_append_mem(&ds_query, line, length); + } + } while (*(line= end)); } - + dynstr_free(&ds_query); dynstr_free(&ds_result); dynstr_free(&ds_script); DBUG_RETURN(found_real_errors); @@ -1475,7 +1495,12 @@ open_mysql_upgrade_file(); if (opt_check_upgrade) - exit(upgrade_already_done(0) == 0); + { + int upgrade_needed = upgrade_already_done(0); + free_used_memory(); + my_end(my_end_arg); + exit(upgrade_needed == 0); + } /* Find mysqlcheck */ find_tool(mysqlcheck_path, IF_WIN("mariadb-check.exe", "mariadb-check"), self_name); diff -Nru mariadb-10.11.6/client/mysqladmin.cc mariadb-10.11.9/client/mysqladmin.cc --- mariadb-10.11.6/client/mysqladmin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqladmin.cc 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2010, 2019, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -28,7 +28,7 @@ #include #include -#define ADMIN_VERSION "9.1" +#define ADMIN_VERSION "10.0" #define MAX_MYSQL_VAR 512 #define SHUTDOWN_DEF_TIMEOUT 3600 /* Wait for shutdown */ #define MAX_TRUNC_LENGTH 3 @@ -40,12 +40,12 @@ ulonglong last_values[MAX_MYSQL_VAR+100]; static int interval=0; static my_bool option_force=0,interrupted=0,new_line=0, - opt_compress= 0, opt_local= 0, opt_relative= 0, opt_verbose= 0, + opt_compress= 0, opt_local= 0, opt_relative= 0, opt_vertical= 0, tty_password= 0, opt_nobeep, - opt_shutdown_wait_for_slaves= 0; + opt_shutdown_wait_for_slaves= 0, opt_not_used; static my_bool debug_info_flag= 0, debug_check_flag= 0; static uint tcp_port = 0, option_wait = 0, option_silent=0, nr_iterations; -static uint opt_count_iterations= 0, my_end_arg; +static uint opt_count_iterations= 0, my_end_arg, opt_verbose= 0; static ulong opt_connect_timeout, opt_shutdown_timeout; static char * unix_port=0; static char *opt_plugin_dir= 0, *opt_default_auth= 0; @@ -141,10 +141,10 @@ {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"force", 'f', @@ -158,7 +158,7 @@ {"character-sets-dir", OPT_CHARSETS_DIR, "Directory for character set files.", &charsets_dir, &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, @@ -204,8 +204,10 @@ {"user", 'u', "User for login if not current user.", &user, &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"verbose", 'v', "Write more information.", &opt_verbose, - &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"verbose", 'v', "Write more information." + "Using it will print more information for 'processlist." + "Using it 2 times will print even more information for 'processlist'.", + &opt_not_used, &opt_not_used, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"vertical", 'E', @@ -214,21 +216,21 @@ 0, 0, 0}, {"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_UINT, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"connect_timeout", OPT_CONNECT_TIMEOUT, "", &opt_connect_timeout, + {"connect_timeout", 0, "", &opt_connect_timeout, &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 3600*12, 0, 3600*12, 0, 1, 0}, - {"shutdown_timeout", OPT_SHUTDOWN_TIMEOUT, "", &opt_shutdown_timeout, + {"shutdown_timeout", 0, "", &opt_shutdown_timeout, &opt_shutdown_timeout, 0, GET_ULONG, REQUIRED_ARG, SHUTDOWN_DEF_TIMEOUT, 0, 3600*12, 0, 1, 0}, - {"wait_for_all_slaves", OPT_SHUTDOWN_WAIT_FOR_SLAVES, + {"wait_for_all_slaves", 0, "Defers shutdown until after all binlogged events have been sent to " "all connected slaves", &opt_shutdown_wait_for_slaves, &opt_shutdown_wait_for_slaves, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -298,6 +300,11 @@ case 'I': /* Info */ usage(); exit(0); + case 'v': /* --verbose */ + opt_verbose++; + if (argument == disabled_my_option) + opt_verbose= 0; + break; case OPT_CHARSETS_DIR: #if MYSQL_VERSION_ID > 32300 charsets_dir = argument; @@ -444,7 +451,7 @@ is given a t!=0, we get an endless loop, or n iterations if --count=n was given an n!=0. If --sleep wasn't given, we get one iteration. - To wit, --wait loops the connection-attempts, while --sleep loops + To wait, --wait loops the connection-attempts, while --sleep loops the command execution (endlessly if no --count is given). */ @@ -828,10 +835,17 @@ { MYSQL_RES *result; MYSQL_ROW row; + const char *query; + + if (!opt_verbose) + query= "show processlist"; + else if (opt_verbose == 1) + query= "show full processlist"; + else + query= "select * from information_schema.processlist where id != connection_id()"; - if (mysql_query(mysql, (opt_verbose ? "show full processlist" : - "show processlist")) || - !(result = mysql_store_result(mysql))) + if (mysql_query(mysql, query) || + !(result = mysql_store_result(mysql))) { my_printf_error(0, "process list failed; error: '%s'", error_flags, mysql_error(mysql)); @@ -1391,7 +1405,9 @@ refresh Flush all tables and close and open logfiles\n\ shutdown Take server down\n\ status Gives a short status message from the server\n\ + start-all-slaves Start all slaves\n\ start-slave Start slave\n\ + stop-all-slaves Stop all slaves\n\ stop-slave Stop slave\n\ variables Prints variables available\n\ version Get version info from server"); diff -Nru mariadb-10.11.6/client/mysqlbinlog.cc mariadb-10.11.9/client/mysqlbinlog.cc --- mariadb-10.11.6/client/mysqlbinlog.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqlbinlog.cc 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2014, Oracle and/or its affiliates. - Copyright (c) 2009, 2020, MariaDB + Copyright (c) 2009, 2024, MariaDB 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 @@ -1220,7 +1220,7 @@ case QUERY_COMPRESSED_EVENT: { Query_log_event *qe= (Query_log_event*)ev; - if (!qe->is_trans_keyword()) + if (!qe->is_trans_keyword(print_event_info->is_xa_trans())) { if (shall_skip_database(qe->db)) goto end; @@ -1682,7 +1682,7 @@ like this: SET @`a`:=_cp850 0x4DFC6C6C6572 COLLATE `cp850_general_ci`; */ - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Directory for character set files.", &charsets_dir, &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"database", 'd', "List entries for just this database (local log only).", @@ -1692,13 +1692,13 @@ {"debug", '#', "Output debug log.", ¤t_dbug_option, ¤t_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit .", + {"debug-check", 0, "Check memory and open file usage at exit .", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1734,7 +1734,7 @@ 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"password", 'p', "Password to connect to remote server.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugindir, &opt_plugindir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " @@ -1760,14 +1760,14 @@ &result_file_name, &result_file_name, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #ifdef WHEN_FLASHBACK_REVIEW_READY - {"review", opt_flashback_review, "Print review sql in output file.", + {"review", 0, "Print review sql in output file.", &opt_flashback_review, &opt_flashback_review, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"review-dbname", opt_flashback_flashback_review_dbname, + {"review-dbname", 0, "Writing flashback original row data into this db", &flashback_review_dbname, &flashback_review_dbname, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"review-tablename", opt_flashback_flashback_review_tablename, + {"review-tablename", 0, "Writing flashback original row data into this table", &flashback_review_tablename, &flashback_review_tablename, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1817,7 +1817,7 @@ "Alias for --do-server-ids.", &server_id_str, &server_id_str, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"set-charset", OPT_SET_CHARSET, + {"set-charset", 0, "Add 'SET NAMES character_set' to the output.", &charset, &charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"short-form", 's', "Just show regular queries: no extra info, no " @@ -1900,7 +1900,7 @@ 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, {"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"open_files_limit", OPT_OPEN_FILES_LIMIT, + {"open_files_limit", 0, "Used to reserve file descriptors for use by this program.", &open_files_limit, &open_files_limit, 0, GET_ULONG, REQUIRED_ARG, MY_NFILE, 8, OS_FILE_LIMIT, 0, 1, 0}, @@ -1926,12 +1926,12 @@ "Updates to a database with a different name than the original. \ Example: rewrite-db='from->to'.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"skip-annotate-row-events", OPT_SKIP_ANNOTATE_ROWS_EVENTS, + {"skip-annotate-row-events", 0, "Don't print Annotate_rows events stored in the binary log.", (uchar**) &opt_skip_annotate_row_events, (uchar**) &opt_skip_annotate_row_events, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"print-table-metadata", OPT_PRINT_TABLE_METADATA, + {"print-table-metadata", 0, "Print metadata stored in Table_map_log_event", &opt_print_table_metadata, &opt_print_table_metadata, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -2362,11 +2362,6 @@ die(1); } break; -#ifdef WHEN_FLASHBACK_REVIEW_READY - case opt_flashback_review: - opt_flashback_review= 1; - break; -#endif case OPT_START_DATETIME: start_datetime= convert_str_to_timestamp(start_datetime_str); break; @@ -3546,7 +3541,8 @@ { if (!opt_version) { - usage(); + error("Please provide the log file(s). Run with '--help' for usage " + "instructions."); retval= ERROR_STOP; } goto err; diff -Nru mariadb-10.11.6/client/mysqlcheck.c mariadb-10.11.9/client/mysqlcheck.c --- mariadb-10.11.6/client/mysqlcheck.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqlcheck.c 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2012, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -82,11 +82,11 @@ "Instead of issuing one query for each table, use one query per database, naming all tables in the database in a comma-separated list.", &opt_all_in_1, &opt_all_in_1, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-repair", OPT_AUTO_REPAIR, + {"auto-repair", 0, "If a checked table is corrupted, automatically fix it. Repairing will be done after all tables have been checked, if corrupted ones were found.", &opt_auto_repair, &opt_auto_repair, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Directory for character set files.", (char**) &charsets_dir, (char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"check", 'c', "Check table for errors.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, @@ -97,7 +97,7 @@ {"check-upgrade", 'g', "Check tables for version-dependent changes. May be used with --auto-repair to correct tables requiring version-dependent updates.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"compress", OPT_COMPRESS, "Use compression in server/client protocol.", + {"compress", 0, "Use compression in server/client protocol.", &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"databases", 'B', @@ -111,16 +111,16 @@ {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -140,7 +140,7 @@ "If you are using this option with CHECK TABLE, it will ensure that the table is 100 percent consistent, but will take a long time. If you are using this option with REPAIR TABLE, it will force using old slow repair with keycache method, instead of much faster repair by sorting.", &opt_extended, &opt_extended, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"flush", OPT_FLUSH_TABLES, "Flush each table after check. This is useful if you don't want to have the checked tables take up space in the caches after the check", + {"flush", 0, "Flush each table after check. This is useful if you don't want to have the checked tables take up space in the caches after the check", &opt_flush_tables, &opt_flush_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, {"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG, @@ -150,7 +150,7 @@ {"medium-check", 'm', "Faster than extended-check, but only finds 99.99 percent of all errors. Should be good enough for most cases.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"write-binlog", OPT_WRITE_BINLOG, + {"write-binlog", 0, "Log ANALYZE, OPTIMIZE and REPAIR TABLE commands. Use --skip-write-binlog " "when commands should not be sent to replication slaves.", &opt_write_binlog, &opt_write_binlog, 0, GET_BOOL, NO_ARG, @@ -168,7 +168,7 @@ {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " @@ -199,7 +199,7 @@ #include {"tables", OPT_TABLES, "Overrides option --databases (-B).", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"use-frm", OPT_FRM, + {"use-frm", 0, "When used with REPAIR, get table structure from .frm file, so the table can be repaired even if .MYI header is corrupted.", &opt_frm, &opt_frm, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -897,6 +897,7 @@ return run_query("SET SQL_LOG_BIN=0", 0); } + static int handle_request_for_tables(char *tables, size_t length, my_bool view, my_bool dont_quote) { @@ -1028,7 +1029,10 @@ insert_dynamic(arr, (uchar*) buf); } -static void print_result() +/* Ok as mysqlcheck is not multi threaded */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + +static void __attribute__((noinline)) print_result() { MYSQL_RES *res; MYSQL_ROW row; @@ -1119,6 +1123,7 @@ mysql_free_result(res); DBUG_VOID_RETURN; } +PRAGMA_REENABLE_CHECK_STACK_FRAME static int dbConnect(char *host, char *user, char *passwd) diff -Nru mariadb-10.11.6/client/mysqldump.c mariadb-10.11.9/client/mysqldump.c --- mariadb-10.11.6/client/mysqldump.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqldump.c 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2013, Oracle and/or its affiliates. - Copyright (c) 2010, 2020, MariaDB Corporation. + Copyright (c) 2010, 2024, MariaDB Corporation. 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 @@ -166,7 +166,6 @@ static ulong opt_compatible_mode= 0; #define MYSQL_OPT_MASTER_DATA_EFFECTIVE_SQL 1 #define MYSQL_OPT_MASTER_DATA_COMMENTED_SQL 2 -#define MYSQL_OPT_MAX_STATEMENT_TIME 0 #define MYSQL_OPT_SLAVE_DATA_EFFECTIVE_SQL 1 #define MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL 2 static uint opt_mysql_port= 0, opt_master_data; @@ -250,41 +249,36 @@ { {"all-databases", 'A', "Dump all the databases. This will be same as --databases with all databases selected.", - &opt_alldbs, &opt_alldbs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, + &opt_alldbs, &opt_alldbs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"all-tablespaces", 'Y', "Dump all the tablespaces.", - &opt_alltspcs, &opt_alltspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, + &opt_alltspcs, &opt_alltspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"no-tablespaces", 'y', "Do not dump any tablespace information.", - &opt_notspcs, &opt_notspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"add-drop-database", OPT_DROP_DATABASE, "Add a DROP DATABASE before each create.", + &opt_notspcs, &opt_notspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"add-drop-database", 0, "Add a DROP DATABASE before each create.", &opt_drop_database, &opt_drop_database, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"add-drop-table", OPT_DROP, "Add a DROP TABLE before each create.", - &opt_drop, &opt_drop, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, - 0}, + {"add-drop-table", 0, "Add a DROP TABLE before each create.", + &opt_drop, &opt_drop, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"add-drop-trigger", 0, "Add a DROP TRIGGER before each create.", &opt_drop_trigger, &opt_drop_trigger, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"add-locks", OPT_LOCKS, "Add locks around INSERT statements.", - &opt_lock, &opt_lock, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, - 0}, - {"allow-keywords", OPT_KEYWORDS, + {"add-locks", 0, "Add locks around INSERT statements.", + &opt_lock, &opt_lock, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"allow-keywords", 0, "Allow creation of column names that are keywords.", &opt_keywords, &opt_keywords, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"apply-slave-statements", OPT_MYSQLDUMP_SLAVE_APPLY, + {"apply-slave-statements", 0, "Adds 'STOP SLAVE' prior to 'CHANGE MASTER' and 'START SLAVE' to bottom of dump.", - &opt_slave_apply, &opt_slave_apply, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, - {"as-of", OPT_ASOF_TIMESTAMP, + &opt_slave_apply, &opt_slave_apply, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"as-of", 0, "Dump system versioned table(s) as of specified timestamp. " "Argument is interpreted according to the --tz-utc setting. " "Table structures are always dumped as of current timestamp.", - &opt_asof_timestamp, &opt_asof_timestamp, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"character-sets-dir", OPT_CHARSETS_DIR, + &opt_asof_timestamp, &opt_asof_timestamp, 0, GET_STR, REQUIRED_ARG, + 0, 0, 0, 0, 0, 0}, + {"character-sets-dir", 0, "Directory for character set files.", (char **)&charsets_dir, (char **)&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"comments", 'i', "Write additional information.", @@ -309,21 +303,18 @@ &opt_complete_insert, &opt_complete_insert, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"compress", 'C', "Use compression in server/client protocol.", - &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, - 0, 0, 0}, - {"copy_s3_tables", OPT_COPY_S3_TABLES, + &opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"copy_s3_tables", 0, "If 'no' S3 tables will be ignored, otherwise S3 tables will be copied as " " Aria tables and then altered to S3", &opt_copy_s3_tables, &opt_copy_s3_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"create-options", 'a', "Include all MariaDB specific create options.", - &create_options, &create_options, 0, GET_BOOL, NO_ARG, 1, - 0, 0, 0, 0, 0}, + &create_options, &create_options, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"databases", 'B', "Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. 'USE db_name;' will be included in the output.", - &opt_databases, &opt_databases, 0, GET_BOOL, NO_ARG, 0, 0, - 0, 0, 0, 0}, + &opt_databases, &opt_databases, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, #ifdef DBUG_OFF {"debug", '#', "This is a non-debug version. Catch this and exit.", 0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0}, @@ -331,19 +322,17 @@ {"debug", '#', "Output debug log.", (char *)&default_dbug_option, (char *)&default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", - &debug_info_flag, &debug_info_flag, - 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, + &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"default-character-set", OPT_DEFAULT_CHARSET, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"delayed-insert", OPT_DELAYED, "Insert rows with INSERT DELAYED.", - &opt_delayed, &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"delete-master-logs", OPT_DELETE_MASTER_LOGS, + {"delayed-insert", 0, "Insert rows with INSERT DELAYED.", + &opt_delayed, &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"delete-master-logs", 0, "Delete logs on master after backup. This automatically enables --master-data.", &opt_delete_master_logs, &opt_delete_master_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -351,9 +340,8 @@ "'/*!40000 ALTER TABLE tb_name DISABLE KEYS */; and '/*!40000 ALTER " "TABLE tb_name ENABLE KEYS */; will be put in the output.", &opt_disable_keys, &opt_disable_keys, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"dump-date", OPT_DUMP_DATE, "Put a dump date to the end of the output.", - &opt_dump_date, &opt_dump_date, 0, - GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + {"dump-date", 0, "Put a dump date to the end of the output.", + &opt_dump_date, &opt_dump_date, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, {"dump-history", 'H', "Dump system-versioned tables with history (only for " "timestamp based versioning)", &opt_dump_history, &opt_dump_history, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -370,24 +358,23 @@ "Option automatically turns --lock-tables off.", &opt_slave_data, &opt_slave_data, 0, GET_UINT, OPT_ARG, 0, 0, MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL, 0, 0, 0}, - {"events", 'E', "Dump events.", - &opt_events, &opt_events, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, + {"events", 'E', "Dump events.", &opt_events, &opt_events, 0, GET_BOOL, + NO_ARG, 0, 0, 0, 0, 0, 0}, {"extended-insert", 'e', "Use multiple-row INSERT syntax that include several VALUES lists.", &extended_insert, &extended_insert, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"fields-terminated-by", OPT_FTB, + {"fields-terminated-by", 0, "Fields in the output file are terminated by the given string.", &fields_terminated, &fields_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-enclosed-by", OPT_ENC, + {"fields-enclosed-by", 0, "Fields in the output file are enclosed by the given character.", &enclosed, &enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0}, - {"fields-optionally-enclosed-by", OPT_O_ENC, + {"fields-optionally-enclosed-by", 0, "Fields in the output file are optionally enclosed by the given character.", &opt_enclosed, &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0}, - {"fields-escaped-by", OPT_ESC, + {"fields-escaped-by", 0, "Fields in the output file are escaped by the given character.", &escaped, &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"flush-logs", 'F', "Flush logs file in server before starting dump. " @@ -399,29 +386,26 @@ "to the moment all tables are locked. So if you want your dump and " "the log flush to happen at the same exact moment you should use " "--lock-all-tables or --master-data with --flush-logs.", - &flush_logs, &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"flush-privileges", OPT_ESC, "Emit a FLUSH PRIVILEGES statement " + &flush_logs, &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"flush-privileges", 0, "Emit a FLUSH PRIVILEGES statement " "after dumping the mysql database. This option should be used any " "time the dump contains the mysql database and any other database " "that depends on the data in the mysql database for proper restore. ", &flush_privileges, &flush_privileges, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"force", 'f', "Continue even if we get an SQL error.", - &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, + &ignore_errors, &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"gtid", 0, "Used together with --master-data=1 or --dump-slave=1." "When enabled, the output from those options will set the GTID position " "instead of the binlog file and offset; the file/offset will appear only as " "a comment. When disabled, the GTID position will still appear in the " "output, but only commented.", - &opt_use_gtid, &opt_use_gtid, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, + &opt_use_gtid, &opt_use_gtid, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"header", 0, "Used together with --tab. When enabled, adds header with column names to the top of output txt files.", &opt_header, &opt_header, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"hex-blob", OPT_HEXBLOB, "Dump binary strings (BINARY, " + {"hex-blob", 0, "Dump binary strings (BINARY, " "VARBINARY, BLOB) in hexadecimal format.", &opt_hex_blob, &opt_hex_blob, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"host", 'h', "Connect to host.", ¤t_host, @@ -443,15 +427,13 @@ "be specified with both database and table names, e.g., " "--ignore-table=database.table.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"include-master-host-port", OPT_MYSQLDUMP_INCLUDE_MASTER_HOST_PORT, + {"include-master-host-port", 0, "Adds 'MASTER_HOST=, MASTER_PORT=' to 'CHANGE MASTER TO..' " "in dump produced with --dump-slave.", &opt_include_master_host_port, - &opt_include_master_host_port, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, - {"insert-ignore", OPT_INSERT_IGNORE, "Insert rows with INSERT IGNORE.", - &opt_ignore, &opt_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, - {"lines-terminated-by", OPT_LTB, + &opt_include_master_host_port, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"insert-ignore", 0, "Insert rows with INSERT IGNORE.", + &opt_ignore, &opt_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"lines-terminated-by", 0, "Lines in the output file are terminated by the given string.", &lines_terminated, &lines_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -462,7 +444,7 @@ 0, 0, 0, 0, 0, 0}, {"lock-tables", 'l', "Lock all tables for read.", &lock_tables, &lock_tables, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"log-error", OPT_ERROR_LOG_FILE, "Append warnings and errors to given file.", + {"log-error", 0, "Append warnings and errors to given file.", &log_error_file, &log_error_file, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"log-queries", 0, "When restoring the dump, the server will, if logging turned on, log the queries to the general and slow query log.", @@ -479,30 +461,28 @@ "Option automatically turns --lock-tables off.", &opt_master_data, &opt_master_data, 0, GET_UINT, OPT_ARG, 0, 0, MYSQL_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0}, - {"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, + {"max_allowed_packet", 0, "The maximum packet length to send to or receive from server.", &opt_max_allowed_packet, &opt_max_allowed_packet, 0, GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096, (longlong) 2L*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0}, - {"max-statement-time", MYSQL_OPT_MAX_STATEMENT_TIME, + {"max-statement-time", 0, "Max statement execution time. If unset, overrides server default with 0.", &opt_max_statement_time, &opt_max_statement_time, 0, GET_DOUBLE, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"net_buffer_length", OPT_NET_BUFFER_LENGTH, + {"net_buffer_length", 0, "The buffer size for TCP/IP and socket communication.", &opt_net_buffer_length, &opt_net_buffer_length, 0, GET_ULONG, REQUIRED_ARG, 1024*1024L-1025, 4096, 16*1024L*1024L, MALLOC_OVERHEAD-1024, 1024, 0}, - {"no-autocommit", OPT_AUTOCOMMIT, + {"no-autocommit", 0, "Wrap tables with autocommit/commit statements.", - &opt_autocommit, &opt_autocommit, 0, GET_BOOL, NO_ARG, - 0, 0, 0, 0, 0, 0}, + &opt_autocommit, &opt_autocommit, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"no-create-db", 'n', "Suppress the CREATE DATABASE ... IF EXISTS statement that normally is " "output for each dumped database if --all-databases or --databases is " "given.", - &opt_create_db, &opt_create_db, 0, - GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + &opt_create_db, &opt_create_db, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"no-create-info", 't', "Don't write table creation info.", &opt_no_create_info, &opt_no_create_info, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -516,7 +496,7 @@ {"opt", OPT_OPTIMIZE, "Same as --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys. Enabled by default, disable with --skip-opt.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"order-by-primary", OPT_ORDER_BY_PRIMARY, + {"order-by-primary", 0, "Sorts each table's rows by primary key, or first unique key, if such a key exists. Useful when dumping a MyISAM table to be loaded into an InnoDB table, but will make the dump itself take considerably longer.", &opt_order_by_primary, &opt_order_by_primary, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"order-by-size", 0, @@ -541,27 +521,24 @@ {"quote-names",'Q', "Quote table and column names with backticks (`).", &opt_quoted, &opt_quoted, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"replace", OPT_MYSQL_REPLACE_INTO, "Use REPLACE INTO instead of INSERT INTO.", - &opt_replace_into, &opt_replace_into, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, - 0, 0}, + {"replace", 0, "Use REPLACE INTO instead of INSERT INTO.", &opt_replace_into, + &opt_replace_into, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"result-file", 'r', "Direct output to a given file. This option should be used in systems " "(e.g., DOS, Windows) that use carriage-return linefeed pairs (\\r\\n) " "to separate text lines. This option ensures that only a single newline " "is used.", 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"routines", 'R', "Dump stored routines (functions and procedures).", - &opt_routines, &opt_routines, 0, GET_BOOL, - NO_ARG, 0, 0, 0, 0, 0, 0}, - {"set-charset", OPT_SET_CHARSET, - "Add 'SET NAMES default_character_set' to the output.", - &opt_set_charset, &opt_set_charset, 0, GET_BOOL, NO_ARG, 1, - 0, 0, 0, 0, 0}, + &opt_routines, &opt_routines, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + {"set-charset", 0, + "Add 'SET NAMES default_character_set' to the output.", &opt_set_charset, + &opt_set_charset, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, /* Note that the combination --single-transaction --master-data will give bullet-proof binlog position only if server >=4.1.3. That's the old "FLUSH TABLES WITH READ LOCK does not block commit" fixed bug. */ - {"single-transaction", OPT_TRANSACTION, + {"single-transaction", 0, "Creates a consistent snapshot by dumping all tables in a single " "transaction. Works ONLY for tables stored in storage engines which " "support multiversioning (currently only InnoDB does); the dump is NOT " @@ -580,7 +557,7 @@ &opt_mysql_unix_port, &opt_mysql_unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #include - {"system", 256, "Dump system tables as portable SQL", + {"system", 0, "Dump system tables as portable SQL", &opt_system, &opt_system, &opt_system_types, GET_SET, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"tab",'T', "Create tab-separated textfile for each table to given path. (Create .sql " @@ -589,17 +566,16 @@ &path, &path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"tables", OPT_TABLES, "Overrides option --databases (-B).", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"triggers", OPT_TRIGGERS, "Dump triggers for each dumped table.", + {"triggers", 0, "Dump triggers for each dumped table.", &opt_dump_triggers, &opt_dump_triggers, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, - {"tz-utc", OPT_TZ_UTC, + {"tz-utc", 0, "Set connection time zone to UTC before commencing the dump and add " "SET TIME_ZONE=´+00:00´ to the top of the dump file.", &opt_tz_utc, &opt_tz_utc, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, #ifndef DONT_ALLOW_USER_CHANGE - {"user", 'u', "User for login if not current user.", - ¤t_user, ¤t_user, 0, GET_STR, REQUIRED_ARG, - 0, 0, 0, 0, 0, 0}, + {"user", 'u', "User for login if not current user.", ¤t_user, + ¤t_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #endif {"verbose", 'v', "Print info about the various stages.", &verbose, &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -609,11 +585,10 @@ &where, &where, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"xml", 'X', "Dump a database as well formed XML.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, - "Default authentication client-side plugin to use.", + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} @@ -770,56 +745,59 @@ fputs(">\n", sql_file); check_io(sql_file); } - else if (!opt_compact) + else { - print_comment(sql_file, 0, - "-- MariaDB dump %s Distrib %s, for %s (%s)\n--\n", - DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE, - MACHINE_TYPE); - print_comment(sql_file, 0, "-- Host: %s ", - fix_for_comment(current_host ? current_host : "localhost")); - print_comment(sql_file, 0, "Database: %s\n", - fix_for_comment(db_name ? db_name : "")); - print_comment(sql_file, 0, - "-- ------------------------------------------------------\n" - ); - print_comment(sql_file, 0, "-- Server version\t%s\n", - mysql_get_server_info(&mysql_connection)); + fprintf(sql_file, "/*M!999999\\- enable the sandbox mode */ \n"); + if (!opt_compact) + { + print_comment(sql_file, 0, + "-- MariaDB dump %s Distrib %s, for %s (%s)\n--\n", + DUMP_VERSION, MYSQL_SERVER_VERSION, SYSTEM_TYPE, + MACHINE_TYPE); + print_comment(sql_file, 0, "-- Host: %s ", + fix_for_comment(current_host ? current_host : "localhost")); + print_comment(sql_file, 0, "Database: %s\n", + fix_for_comment(db_name ? db_name : "")); + print_comment(sql_file, 0, + "-- ------------------------------------------------------\n" + ); + print_comment(sql_file, 0, "-- Server version\t%s\n", + mysql_get_server_info(&mysql_connection)); - if (!opt_logging) - fprintf(sql_file, -"\n/*M!100101 SET LOCAL SQL_LOG_OFF=0, LOCAL LOG_SLOW_QUERY=0 */;"); + if (!opt_logging) + fprintf(sql_file, + "\n/*M!100101 SET LOCAL SQL_LOG_OFF=0, LOCAL LOG_SLOW_QUERY=0 */;"); - if (opt_set_charset) - fprintf(sql_file, -"\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" -"\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" -"\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" -"\n/*!40101 SET NAMES %s */;\n",default_charset); + if (opt_set_charset) + fprintf(sql_file, + "\n/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;" + "\n/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;" + "\n/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;" + "\n/*!40101 SET NAMES %s */;\n",default_charset); - if (opt_tz_utc) - { - fprintf(sql_file, "/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n"); - fprintf(sql_file, "/*!40103 SET TIME_ZONE='+00:00' */;\n"); - } + if (opt_tz_utc) + { + fprintf(sql_file, "/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;\n"); + fprintf(sql_file, "/*!40103 SET TIME_ZONE='+00:00' */;\n"); + } - if (!path) - { - if (!opt_no_create_info) + if (!path) { - /* We don't need unique checks as the table is created just before */ - fprintf(md_result_file,"\ -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n"); + if (!opt_no_create_info) + { + /* We don't need unique checks as the table is created just before */ + fprintf(md_result_file, + "/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;\n"); + } + fprintf(md_result_file, + "/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n"); } - fprintf(md_result_file,"\ -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n\ -"); + fprintf(sql_file, + "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='%s%s%s' */;\n" + "/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n", + path?"":"NO_AUTO_VALUE_ON_ZERO",compatible_mode_normal_str[0]==0?"":",", + compatible_mode_normal_str); } - fprintf(sql_file, - "/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='%s%s%s' */;\n" - "/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n", - path?"":"NO_AUTO_VALUE_ON_ZERO",compatible_mode_normal_str[0]==0?"":",", - compatible_mode_normal_str); check_io(sql_file); } } /* write_header */ @@ -1273,8 +1251,9 @@ if (opt_slave_data) { opt_lock_all_tables= !opt_single_transaction; - opt_master_data= 0; opt_delete_master_logs= 0; + if (opt_slave_data != MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL) + opt_master_data= 0; } /* Ensure consistency of the set of binlog & locking options */ @@ -1287,10 +1266,7 @@ return(EX_USAGE); } if (opt_master_data) - { opt_lock_all_tables= !opt_single_transaction; - opt_slave_data= 0; - } if (opt_single_transaction || opt_lock_all_tables) lock_tables= 0; if (enclosed && opt_enclosed) @@ -3043,7 +3019,7 @@ row= mysql_fetch_row(result); if (row[0]) { - fprintf(sql_file, "SELECT SETVAL(%s, %s, 0);\n", result_seq, row[0]); + fprintf(sql_file, "DO SETVAL(%s, %s, 0);\n", result_seq, row[0]); } // Sequences will not use inserts, so no need for REPLACE and LOCKS mysql_free_result(result); @@ -3125,8 +3101,9 @@ if (opt_header) dynstr_set_checked(&select_field_names_for_header, ""); } - insert_option= ((delayed && opt_ignore) ? " DELAYED IGNORE " : - delayed ? " DELAYED " : opt_ignore ? " IGNORE " : ""); + + insert_option= ((delayed && opt_ignore) ? "DELAYED IGNORE " : + delayed ? "DELAYED " : opt_ignore ? "IGNORE " : ""); verbose_msg("-- Retrieving table structure for table %s...\n", table); @@ -6025,7 +6002,7 @@ free_root(&glob_root, MYF(0)); } maybe_die(EX_ILLEGAL_TABLE, "Couldn't find table: \"%s\"", *table_names); - /* We shall countinue here, if --force was given */ + /* We shall continue here, if --force was given */ } } end= pos; @@ -6046,7 +6023,7 @@ free_root(&glob_root, MYF(0)); } DB_error(mysql, "when doing LOCK TABLES"); - /* We shall countinue here, if --force was given */ + /* We shall continue here, if --force was given */ } } dynstr_free(&lock_tables_query); @@ -6058,7 +6035,7 @@ free_root(&glob_root, MYF(0)); DB_error(mysql, "when doing refresh"); } - /* We shall countinue here, if --force was given */ + /* We shall continue here, if --force was given */ else verbose_msg("-- dump_selected_tables : logs flushed successfully!\n"); } @@ -6168,8 +6145,11 @@ } /* dump_selected_tables */ +const char fmt_gtid_pos[]= "%sSET GLOBAL gtid_slave_pos='%s';\n"; + static int do_show_master_status(MYSQL *mysql_con, int consistent_binlog_pos, - int have_mariadb_gtid, int use_gtid) + int have_mariadb_gtid, int use_gtid, + char *set_gtid_pos) { MYSQL_ROW row; MYSQL_RES *UNINIT_VAR(master); @@ -6227,25 +6207,44 @@ } - /* SHOW MASTER STATUS reports file and position */ - print_comment(md_result_file, 0, - "\n--\n-- Position to start replication or point-in-time " - "recovery from\n--\n\n"); - fprintf(md_result_file, - "%sCHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;\n", - (use_gtid ? "-- " : comment_prefix), file, offset); + /* gtid */ if (have_mariadb_gtid) { - print_comment(md_result_file, 0, - "\n--\n-- GTID to start replication from\n--\n\n"); if (use_gtid) + { fprintf(md_result_file, "%sCHANGE MASTER TO MASTER_USE_GTID=slave_pos;\n", comment_prefix); - fprintf(md_result_file, - "%sSET GLOBAL gtid_slave_pos='%s';\n", + /* + When --gtid is specified defer print of SET gtid_slave_pos until + after its placeholder table is guaranteed to have been dumped. + */ + print_comment(md_result_file, 0, + "\n-- A corresponding to the above master-data " + "CHANGE-MASTER settings to the slave gtid state is printed " + "later in the file.\n"); + } + sprintf(set_gtid_pos, fmt_gtid_pos, (!use_gtid ? "-- " : comment_prefix), gtid_pos); } + + /* SHOW MASTER STATUS reports file and position */ + print_comment(md_result_file, 0, + "\n--\n-- Alternately, following is the position of the binary " + "logging from SHOW MASTER STATUS at point of backup." + "\n-- Use this when creating a replica of the primary server " + "where the backup was made." + "\n-- The new server will be connecting to the primary server " + "where the backup was taken." + "\n--\n\n"); + fprintf(md_result_file, + "%sCHANGE MASTER TO MASTER_LOG_FILE='%s', MASTER_LOG_POS=%s;\n", + (use_gtid ? "-- " : comment_prefix), file, offset); + if (have_mariadb_gtid && !use_gtid) + print_comment(md_result_file, 0, + "\n-- A corresponding to the above master-data CHANGE-MASTER " + "settings to the slave gtid state is printed as comments " + "later in the file.\n"); check_io(md_result_file); if (!consistent_binlog_pos) @@ -6315,8 +6314,8 @@ return(0); } -static int do_show_slave_status(MYSQL *mysql_con, int use_gtid, - int have_mariadb_gtid) +static int do_show_slave_status(MYSQL *mysql_con, int have_mariadb_gtid, + int use_gtid, char* set_gtid_pos) { MYSQL_RES *UNINIT_VAR(slave); MYSQL_ROW row; @@ -6324,7 +6323,6 @@ (opt_slave_data == MYSQL_OPT_SLAVE_DATA_COMMENTED_SQL) ? "-- " : ""; const char *gtid_comment_prefix= (use_gtid ? comment_prefix : "-- "); const char *nogtid_comment_prefix= (!use_gtid ? comment_prefix : "-- "); - int set_gtid_done= 0; if (mysql_query_with_error_report(mysql_con, &slave, multi_source ? @@ -6340,23 +6338,38 @@ return 1; } - while ((row= mysql_fetch_row(slave))) + print_comment(md_result_file, 0, + "\n--\n-- The following is the SQL position of the replication " + "taken from SHOW SLAVE STATUS at the time of backup.\n" + "-- Use this position when creating a clone of, or replacement " + "server, from where the backup was taken." + "\n-- This new server will connects to the same primary " + "server%s.\n--\n", + multi_source ? "(s)" : ""); + + if (multi_source) { - if (multi_source && !set_gtid_done) + char gtid_pos[MAX_GTID_LENGTH]; + if (have_mariadb_gtid && get_gtid_pos(gtid_pos, 0)) { - char gtid_pos[MAX_GTID_LENGTH]; - if (have_mariadb_gtid && get_gtid_pos(gtid_pos, 0)) - { - mysql_free_result(slave); - return 1; - } - if (opt_comments) - fprintf(md_result_file, "\n--\n-- Gtid position to start replication " - "from\n--\n\n"); - fprintf(md_result_file, "%sSET GLOBAL gtid_slave_pos='%s';\n", - gtid_comment_prefix, gtid_pos); - set_gtid_done= 1; + mysql_free_result(slave); + return 1; } + /* defer print similarly to do_show_master_status */ + print_comment(md_result_file, 0, + "\n-- A corresponding to the below dump-slave " + "CHANGE-MASTER settings to the slave gtid state is printed " + "later in the file.\n"); + sprintf(set_gtid_pos, fmt_gtid_pos, gtid_comment_prefix, gtid_pos); + } + if (use_gtid) + print_comment(md_result_file, 0, + "\n-- Use only the MASTER_USE_GTID=slave_pos or " + "MASTER_LOG_FILE/MASTER_LOG_POS in the statements below." + "\n\n"); + + while ((row= mysql_fetch_row(slave))) + { if (row[9 + multi_source] && row[21 + multi_source]) { if (use_gtid) @@ -6370,11 +6383,6 @@ } /* SHOW MASTER STATUS reports file and position */ - if (opt_comments) - fprintf(md_result_file, - "\n--\n-- Position to start replication or point-in-time " - "recovery from (the master of this slave)\n--\n\n"); - if (multi_source) fprintf(md_result_file, "%sCHANGE MASTER '%.80s' TO ", nogtid_comment_prefix, row[0]); @@ -6395,6 +6403,7 @@ check_io(md_result_file); } } + fprintf(md_result_file, "\n"); mysql_free_result(slave); return 0; } @@ -7072,6 +7081,34 @@ die(EX_MYSQLERR, DYNAMIC_STR_ERROR_MSG); } +/** + Print earlier prepared SET @@global.gtid_slave_pos. + + @param set_gtid_pos[in] formatted sql set statement +**/ +static void do_print_set_gtid_slave_pos(const char *set_gtid_pos, + my_bool is_master_data) +{ + DBUG_ASSERT(opt_master_data || opt_slave_data); + if (is_master_data) + { + print_comment(md_result_file, 0, + "\n-- The deferred gtid setting for slave corresponding to " + "the master-data CHANGE-MASTER follows\n"); + print_comment(md_result_file, 0, + "\n-- Preferably use GTID to start replication from GTID " + "position:\n\n"); + } + else + { + print_comment(md_result_file, 0, + "\n-- The deferred gtid setting for slave corresponding to " + "the dump-slave CHANGE-MASTER follows\n"); + print_comment(md_result_file, 0, + "-- GTID position to start replication:\n"); + } + fprintf(md_result_file, "%s", set_gtid_pos); +} int main(int argc, char **argv) { @@ -7080,6 +7117,12 @@ int exit_code; int consistent_binlog_pos= 0; int have_mariadb_gtid= 0; + /* + to hold SET @@global.gtid_slave_pos which is deferred to print + until the function epilogue. + */ + char master_set_gtid_pos[3 + sizeof(fmt_gtid_pos) + MAX_GTID_LENGTH]= {0}; + char slave_set_gtid_pos[3 + sizeof(fmt_gtid_pos) + MAX_GTID_LENGTH]= {0}; MY_INIT(argv[0]); sf_leaking_memory=1; /* don't report memory leaks on early exits */ @@ -7118,11 +7161,11 @@ write_header(md_result_file, *argv); /* Set MAX_STATEMENT_TIME to 0 unless set in client */ - my_snprintf(query, sizeof(query), "/*!100100 SET @@MAX_STATEMENT_TIME=%f */", opt_max_statement_time); + my_snprintf(query, sizeof(query), "/*M!100100 SET @@MAX_STATEMENT_TIME=%f */", opt_max_statement_time); mysql_query(mysql, query); /* Set server side timeout between client commands to server compiled-in default */ - mysql_query(mysql, "/*!100100 SET WAIT_TIMEOUT=DEFAULT */"); + mysql_query(mysql, "/*M!100100 SET WAIT_TIMEOUT=DEFAULT */"); /* Check if the server support multi source */ if (mysql_get_server_version(mysql) >= 100000) @@ -7183,10 +7226,12 @@ goto err; if (opt_master_data && do_show_master_status(mysql, consistent_binlog_pos, - have_mariadb_gtid, opt_use_gtid)) + have_mariadb_gtid, + opt_use_gtid, master_set_gtid_pos)) goto err; - if (opt_slave_data && do_show_slave_status(mysql, opt_use_gtid, - have_mariadb_gtid)) + if (opt_slave_data && do_show_slave_status(mysql, + have_mariadb_gtid, + opt_use_gtid, slave_set_gtid_pos)) goto err; if (opt_single_transaction && do_unlock_tables(mysql)) /* unlock but no commit! */ goto err; @@ -7254,6 +7299,11 @@ if (opt_system & OPT_SYSTEM_TIMEZONES) dump_all_timezones(); + if (opt_master_data && master_set_gtid_pos[0]) + do_print_set_gtid_slave_pos(master_set_gtid_pos, TRUE); + if (opt_slave_data && slave_set_gtid_pos[0]) + do_print_set_gtid_slave_pos(slave_set_gtid_pos, FALSE); + /* add 'START SLAVE' to end of dump */ if (opt_slave_apply && add_slave_statements()) goto err; diff -Nru mariadb-10.11.6/client/mysqlimport.c mariadb-10.11.9/client/mysqlimport.c --- mariadb-10.11.6/client/mysqlimport.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqlimport.c 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2011, 2022, MariaDB + Copyright (c) 2011, 2024, MariaDB 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 @@ -70,10 +70,10 @@ static struct my_option my_long_options[] = { - {"character-sets-dir", OPT_CHARSETS_DIR, + {"character-sets-dir", 0, "Directory for character set files.", (char**) &charsets_dir, (char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"columns", 'c', @@ -85,31 +85,31 @@ 0, 0, 0}, {"debug",'#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"delete", 'd', "First delete all rows from table.", &opt_delete, &opt_delete, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-terminated-by", OPT_FTB, + {"fields-terminated-by", 0, "Fields in the input file are terminated by the given string.", &fields_terminated, &fields_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-enclosed-by", OPT_ENC, + {"fields-enclosed-by", 0, "Fields in the import file are enclosed by the given character.", &enclosed, &enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-optionally-enclosed-by", OPT_O_ENC, + {"fields-optionally-enclosed-by", 0, "Fields in the input file are optionally enclosed by the given character.", &opt_enclosed, &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"fields-escaped-by", OPT_ESC, + {"fields-escaped-by", 0, "Fields in the input file are escaped by the given character.", &escaped, &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -126,10 +126,10 @@ "Disable foreign key checks while importing the data.", &ignore_foreign_keys, &ignore_foreign_keys, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"ignore-lines", OPT_IGN_LINES, "Ignore first n lines of data infile.", + {"ignore-lines", 0, "Ignore first n lines of data infile.", &opt_ignore_lines, &opt_ignore_lines, 0, GET_LL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"lines-terminated-by", OPT_LTB, + {"lines-terminated-by", 0, "Lines in the input file are terminated by the given string.", &lines_terminated, &lines_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -138,7 +138,7 @@ {"lock-tables", 'l', "Lock all tables for write (this disables threads).", &lock_tables, &lock_tables, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"low-priority", OPT_LOW_PRIORITY, + {"low-priority", 0, "Use LOW_PRIORITY when updating the table.", &opt_low_priority, &opt_low_priority, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"password", 'p', @@ -148,7 +148,7 @@ {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " @@ -170,7 +170,7 @@ &opt_mysql_unix_port, &opt_mysql_unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #include - {"use-threads", OPT_USE_THREADS, + {"use-threads", 0, "Load files in parallel. The argument is the number " "of threads to use for loading data.", &opt_use_threads, &opt_use_threads, 0, @@ -436,7 +436,7 @@ dynstr_append(&query, " WRITE,"); } if (mysql_real_query(mysql, query.str, (ulong)query.length-1)) - db_error(mysql); /* We shall countinue here, if --force was given */ + db_error(mysql); /* We shall continue here, if --force was given */ } @@ -638,7 +638,7 @@ if (mysql_query(mysql, "/*!40101 set @@character_set_database=binary */;")) { - db_error(mysql); /* We shall countinue here, if --force was given */ + db_error(mysql); /* We shall continue here, if --force was given */ goto error; } @@ -766,12 +766,12 @@ if (!(mysql= db_connect(current_host,current_db,current_user,opt_password))) { free_defaults(argv_to_free); - return(1); /* purecov: deadcode */ + return(1); /* purecov: dead code */ } if (mysql_query(mysql, "/*!40101 set @@character_set_database=binary */;")) { - db_error(mysql); /* We shall countinue here, if --force was given */ + db_error(mysql); /* We shall continue here, if --force was given */ return(1); } diff -Nru mariadb-10.11.6/client/mysqlshow.c mariadb-10.11.9/client/mysqlshow.c --- mariadb-10.11.6/client/mysqlshow.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqlshow.c 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2019, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -191,10 +191,10 @@ {"character-sets-dir", 'c', "Directory for character set files.", (char**) &charsets_dir, (char**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"default-character-set", OPT_DEFAULT_CHARSET, + {"default-character-set", 0, "Set the default character set.", &default_charset, &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"count", OPT_COUNT, + {"count", 0, "Show number of rows per table (may be slow for non-MyISAM tables).", &opt_count, &opt_count, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -203,13 +203,13 @@ 0, 0, 0}, {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.", + {"debug-info", 0, "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -226,7 +226,7 @@ "Password to use when connecting to server. If password is not given, it's " "solicited on the tty.", 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection or 0 for default to, in " diff -Nru mariadb-10.11.6/client/mysqlslap.c mariadb-10.11.9/client/mysqlslap.c --- mariadb-10.11.6/client/mysqlslap.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqlslap.c 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ /* Copyright (c) 2005, 2015, Oracle and/or its affiliates. - Copyright (c) 2010, 2022, MariaDB + Copyright (c) 2010, 2024, MariaDB 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 @@ -535,50 +535,45 @@ "Generate SQL where not supplied by file or command line.", &auto_generate_sql, &auto_generate_sql, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-add-autoincrement", OPT_SLAP_AUTO_GENERATE_ADD_AUTO, + {"auto-generate-sql-add-autoincrement", 0, "Add an AUTO_INCREMENT column to auto-generated tables.", - &auto_generate_sql_autoincrement, - &auto_generate_sql_autoincrement, + &auto_generate_sql_autoincrement, &auto_generate_sql_autoincrement, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-execute-number", OPT_SLAP_AUTO_GENERATE_EXECUTE_QUERIES, + {"auto-generate-sql-execute-number", 0, "Set this number to generate a set number of queries to run.", &auto_actual_queries, &auto_actual_queries, 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-guid-primary", OPT_SLAP_AUTO_GENERATE_GUID_PRIMARY, + {"auto-generate-sql-guid-primary", 0, "Add GUID based primary keys to auto-generated tables.", - &auto_generate_sql_guid_primary, - &auto_generate_sql_guid_primary, + &auto_generate_sql_guid_primary, &auto_generate_sql_guid_primary, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-load-type", OPT_SLAP_AUTO_GENERATE_SQL_LOAD_TYPE, + {"auto-generate-sql-load-type", 0, "Specify test load type: mixed, update, write, key, or read; default is mixed.", (char**) &auto_generate_sql_type, (char**) &auto_generate_sql_type, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-secondary-indexes", - OPT_SLAP_AUTO_GENERATE_SECONDARY_INDEXES, + {"auto-generate-sql-secondary-indexes", 0, "Number of secondary indexes to add to auto-generated tables.", &auto_generate_sql_secondary_indexes, &auto_generate_sql_secondary_indexes, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"auto-generate-sql-unique-query-number", - OPT_SLAP_AUTO_GENERATE_UNIQUE_QUERY_NUM, + {"auto-generate-sql-unique-query-number", 0, "Number of unique queries to generate for automatic tests.", &auto_generate_sql_unique_query_number, &auto_generate_sql_unique_query_number, 0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0}, - {"auto-generate-sql-unique-write-number", - OPT_SLAP_AUTO_GENERATE_UNIQUE_WRITE_NUM, + {"auto-generate-sql-unique-write-number", 0, "Number of unique queries to generate for auto-generate-sql-write-number.", &auto_generate_sql_unique_write_number, &auto_generate_sql_unique_write_number, 0, GET_ULL, REQUIRED_ARG, 10, 0, 0, 0, 0, 0}, - {"auto-generate-sql-write-number", OPT_SLAP_AUTO_GENERATE_WRITE_NUM, + {"auto-generate-sql-write-number", 0, "Number of row inserts to perform for each thread (default is 100).", &auto_generate_sql_number, &auto_generate_sql_number, 0, GET_ULL, REQUIRED_ARG, 100, 0, 0, 0, 0, 0}, {"character-sets-dir", OPT_CHARSETS_DIR, "Directory for character set files.", (char **)&charsets_dir, (char **)&charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"commit", OPT_SLAP_COMMIT, "Commit records every X number of statements.", + {"commit", 0, "Commit records every X number of statements.", &commit_rate, &commit_rate, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"compress", 'C', "Use compression in server/client protocol.", @@ -587,10 +582,10 @@ {"concurrency", 'c', "Number of clients to simulate for query to run.", (char**) &concurrency_str, (char**) &concurrency_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"create", OPT_SLAP_CREATE_STRING, "File or string to use create tables.", + {"create", 0, "File or string to use create tables.", &create_string, &create_string, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"create-schema", OPT_CREATE_SLAP_SCHEMA, "Schema to run tests in.", + {"create-schema", 0, "Schema to run tests in.", (char**) &create_schema_string, (char**) &create_schema_string, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"csv", OPT_SLAP_CSV, @@ -604,12 +599,12 @@ (char**) &default_dbug_option, (char**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.", + {"debug-check", 0, "Check memory and open file usage at exit.", &debug_check_flag, &debug_check_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"debug-info", 'T', "Print some debug info at exit.", &debug_info_flag, &debug_info_flag, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"default_auth", OPT_DEFAULT_AUTH, + {"default_auth", 0, "Default authentication client-side plugin to use.", &opt_default_auth, &opt_default_auth, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -617,7 +612,7 @@ "Delimiter to use in SQL statements supplied in file or command line.", (char**) &delimiter, (char**) &delimiter, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"detach", OPT_SLAP_DETACH, + {"detach", 0, "Detach (close and reopen) connections after X number of requests.", &detach_rate, &detach_rate, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -629,14 +624,14 @@ GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"host", 'h', "Connect to host.", &host, &host, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"init-command", OPT_INIT_COMMAND, + {"init-command", 0, "SQL Command to execute when connecting to MariaDB server. Will " "automatically be re-executed when reconnecting.", &opt_init_command, &opt_init_command, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"iterations", 'i', "Number of times to run the tests.", &iterations, &iterations, 0, GET_UINT, REQUIRED_ARG, 1, 0, 0, 0, 0, 0}, - {"no-drop", OPT_SLAP_NO_DROP, "Do not drop the schema after the test.", + {"no-drop", 0, "Do not drop the schema after the test.", &opt_no_drop, &opt_no_drop, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"number-char-cols", 'x', "Number of VARCHAR columns to create in table if specifying --auto-generate-sql.", @@ -646,11 +641,11 @@ "Number of INT columns to create in table if specifying --auto-generate-sql.", (char**) &num_int_cols_opt, (char**) &num_int_cols_opt, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"number-of-queries", OPT_MYSQL_NUMBER_OF_QUERY, + {"number-of-queries", 0, "Limit each client to this number of queries (this is not exact).", &num_of_query, &num_of_query, 0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"only-print", OPT_MYSQL_ONLY_PRINT, + {"only-print", 0, "Do not connect to the databases, but instead print out what would have " "been done.", &opt_only_print, &opt_only_print, 0, GET_BOOL, NO_ARG, @@ -662,25 +657,25 @@ {"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}, #endif - {"plugin_dir", OPT_PLUGIN_DIR, "Directory for client-side plugins.", + {"plugin_dir", 0, "Directory for client-side plugins.", &opt_plugin_dir, &opt_plugin_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"port", 'P', "Port number to use for connection.", &opt_mysql_port, &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0, 0}, - {"post-query", OPT_SLAP_POST_QUERY, + {"post-query", 0, "Query to run or file containing query to execute after tests have completed.", &user_supplied_post_statements, &user_supplied_post_statements, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"post-system", OPT_SLAP_POST_SYSTEM, + {"post-system", 0, "system() string to execute after tests have completed.", &post_system, &post_system, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"pre-query", OPT_SLAP_PRE_QUERY, + {"pre-query", 0, "Query to run or file containing query to execute before running tests.", &user_supplied_pre_statements, &user_supplied_pre_statements, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"pre-system", OPT_SLAP_PRE_SYSTEM, + {"pre-system", 0, "system() string to execute before running tests.", &pre_system, &pre_system, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, @@ -1649,6 +1644,9 @@ return 0; } + +PRAGMA_DISABLE_CHECK_STACK_FRAME + static int create_schema(MYSQL *mysql, const char *db, statement *stmt, option_string *engine_stmt) @@ -1744,6 +1742,7 @@ DBUG_RETURN(0); } +PRAGMA_REENABLE_CHECK_STACK_FRAME static int drop_schema(MYSQL *mysql, const char *db) diff -Nru mariadb-10.11.6/client/mysqltest.cc mariadb-10.11.9/client/mysqltest.cc --- mariadb-10.11.6/client/mysqltest.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/client/mysqltest.cc 2024-08-03 07:29:56.000000000 +0000 @@ -78,7 +78,10 @@ #define MAX_DELIMITER_LENGTH 16 #define DEFAULT_MAX_CONN 64 -#define DIE_BUFF_SIZE 256*1024 +#define DIE_BUFF_SIZE 15*1024 + +#define RESULT_STRING_INIT_MEM 2048 +#define RESULT_STRING_INCREMENT_MEM 2048 /* Flags controlling send and reap */ #define QUERY_SEND_FLAG 1 @@ -88,6 +91,8 @@ #define CLOSED_CONNECTION "-closed_connection-" +#define dynstr_append DO_NO_USE + #ifndef HAVE_SETENV static int setenv(const char *name, const char *value, int overwrite); #endif @@ -392,7 +397,7 @@ Q_IF, Q_DISABLE_PARSING, Q_ENABLE_PARSING, Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST, - Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP, + Q_WRITE_FILE, Q_WRITE_LINE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_SKIP, Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES, Q_SEND_QUIT, Q_CHANGE_USER, Q_MKDIR, Q_RMDIR, Q_LIST_FILES, Q_LIST_FILES_WRITE_FILE, Q_LIST_FILES_APPEND_FILE, @@ -495,6 +500,7 @@ "remove_file", "file_exists", "write_file", + "write_line", "copy_file", "perl", "die", @@ -610,7 +616,7 @@ const char *from); ATTRIBUTE_NORETURN -static void cleanup_and_exit(int exit_code); +static void cleanup_and_exit(int exit_code, bool called_from_die); ATTRIBUTE_NORETURN static void really_die(const char *msg); @@ -927,6 +933,7 @@ pthread_handler_t connection_thread(void *arg) { struct st_connection *cn= (struct st_connection*)arg; + DBUG_ENTER("connection_thread"); mysql_thread_init(); while (cn->command != EMB_END_CONNECTION) @@ -938,6 +945,7 @@ pthread_cond_wait(&cn->query_cond, &cn->query_mutex); pthread_mutex_unlock(&cn->query_mutex); } + DBUG_PRINT("info", ("executing command: %d", cn->command)); switch (cn->command) { case EMB_END_CONNECTION: @@ -958,24 +966,26 @@ break; case EMB_CLOSE_STMT: cn->result= mysql_stmt_close(cn->stmt); + cn->stmt= 0; break; default: DBUG_ASSERT(0); } - cn->command= 0; pthread_mutex_lock(&cn->result_mutex); cn->query_done= 1; + cn->command= 0; pthread_cond_signal(&cn->result_cond); pthread_mutex_unlock(&cn->result_mutex); } end_thread: - cn->query_done= 1; + DBUG_ASSERT(cn->stmt == 0); mysql_close(cn->mysql); cn->mysql= 0; + cn->query_done= 1; mysql_thread_end(); pthread_exit(0); - return 0; + DBUG_RETURN(0); } static void wait_query_thread_done(struct st_connection *con) @@ -993,12 +1003,16 @@ static void signal_connection_thd(struct st_connection *cn, int command) { + DBUG_ENTER("signal_connection_thd"); + DBUG_PRINT("enter", ("command: %d", command)); + DBUG_ASSERT(cn->has_thread); cn->query_done= 0; - cn->command= command; pthread_mutex_lock(&cn->query_mutex); + cn->command= command; pthread_cond_signal(&cn->query_cond); pthread_mutex_unlock(&cn->query_mutex); + DBUG_VOID_RETURN; } @@ -1063,27 +1077,37 @@ static int do_stmt_close(struct st_connection *cn) { DBUG_ENTER("do_stmt_close"); - /* The cn->stmt is already set. */ if (!cn->has_thread) - DBUG_RETURN(mysql_stmt_close(cn->stmt)); + { + /* The cn->stmt is already set. */ + int res= mysql_stmt_close(cn->stmt); + cn->stmt= 0; + DBUG_RETURN(res); + } + wait_query_thread_done(cn); signal_connection_thd(cn, EMB_CLOSE_STMT); wait_query_thread_done(cn); + DBUG_ASSERT(cn->stmt == 0); DBUG_RETURN(cn->result); } static void emb_close_connection(struct st_connection *cn) { + DBUG_ENTER("emb_close_connection"); if (!cn->has_thread) - return; + DBUG_VOID_RETURN; wait_query_thread_done(cn); signal_connection_thd(cn, EMB_END_CONNECTION); pthread_join(cn->tid, NULL); cn->has_thread= FALSE; + DBUG_ASSERT(cn->mysql == 0); + DBUG_ASSERT(cn->stmt == 0); pthread_mutex_destroy(&cn->query_mutex); pthread_cond_destroy(&cn->query_cond); pthread_mutex_destroy(&cn->result_mutex); pthread_cond_destroy(&cn->result_cond); + DBUG_VOID_RETURN; } @@ -1107,7 +1131,13 @@ #define do_read_query_result(cn) mysql_read_query_result(cn->mysql) #define do_stmt_prepare(cn, q, q_len) mysql_stmt_prepare(cn->stmt, q, (ulong)q_len) #define do_stmt_execute(cn) mysql_stmt_execute(cn->stmt) -#define do_stmt_close(cn) mysql_stmt_close(cn->stmt) + +static int do_stmt_close(struct st_connection *cn) +{ + int res= mysql_stmt_close(cn->stmt); + cn->stmt= 0; + return res; +} #endif /*EMBEDDED_LIBRARY*/ @@ -1435,7 +1465,6 @@ { if (con->stmt) do_stmt_close(con); - con->stmt= 0; } DBUG_VOID_RETURN; } @@ -1506,8 +1535,8 @@ void ha_pre_shutdown(); #endif - -ATTRIBUTE_NORETURN static void cleanup_and_exit(int exit_code) +ATTRIBUTE_NORETURN static void cleanup_and_exit(int exit_code, + bool called_from_die) { #ifdef EMBEDDED_LIBRARY if (server_initialized) @@ -1520,16 +1549,6 @@ if (server_initialized) mysql_server_end(); - /* - mysqltest is fundamentally written in a way that makes impossible - to free all memory before exit (consider memory allocated - for frame local DYNAMIC_STRING's and die() invoked down the stack. - - We close stderr here to stop unavoidable safemalloc reports - from polluting the output. - */ - fclose(stderr); - my_end(my_end_arg); if (!silent) { @@ -1549,6 +1568,11 @@ } } + /* + Report memory leaks, if not called from 'die()', as die() will not release + all memory. + */ + sf_leaking_memory= called_from_die; exit(exit_code); } @@ -1615,7 +1639,7 @@ second time, just exit */ if (dying) - cleanup_and_exit(1); + cleanup_and_exit(1, 1); dying= 1; log_file.show_tail(opt_tail_lines); @@ -1627,7 +1651,7 @@ if (cur_con && !cur_con->pending) show_warnings_before_error(cur_con->mysql); - cleanup_and_exit(1); + cleanup_and_exit(1, 1); } void report_or_die(const char *fmt, ...) @@ -1681,7 +1705,7 @@ } va_end(args); - cleanup_and_exit(62); + cleanup_and_exit(62, 0); } @@ -1729,7 +1753,7 @@ va_end(args); dynstr_append_mem(&ds_res, buff, len); - dynstr_append(&ds_res, "\n"); + dynstr_append_mem(&ds_res, STRING_WITH_LEN("\n")); DBUG_VOID_RETURN; } @@ -1865,7 +1889,7 @@ die("Out of memory"); dynstr_append_os_quoted(&ds_cmdline, tool_path, NullS); - dynstr_append(&ds_cmdline, " "); + dynstr_append_mem(&ds_cmdline, STRING_WITH_LEN(" ")); va_start(args, ds_res); @@ -1875,14 +1899,14 @@ if (strncmp(arg, "--", 2) == 0) dynstr_append_os_quoted(&ds_cmdline, arg, NullS); else - dynstr_append(&ds_cmdline, arg); - dynstr_append(&ds_cmdline, " "); + dynstr_append_mem(&ds_cmdline, arg, strlen(arg)); + dynstr_append_mem(&ds_cmdline, STRING_WITH_LEN(" ")); } va_end(args); #ifdef _WIN32 - dynstr_append(&ds_cmdline, "\""); + dynstr_append_mem(&ds_cmdline, STRING_WITH_LEN("\"")); #endif DBUG_PRINT("info", ("Running: %s", ds_cmdline.str)); @@ -2017,8 +2041,8 @@ Fallback to dump both files to result file and inform about installing "diff" */ - dynstr_append(&ds_tmp, "\n"); - dynstr_append(&ds_tmp, + char message[]= +"\n" "\n" "The two files differ but it was not possible to execute 'diff' in\n" "order to show only the difference. Instead the whole content of the\n" @@ -2028,17 +2052,18 @@ #ifdef _WIN32 "or http://gnuwin32.sourceforge.net/packages/diffutils.htm\n" #endif -"\n"); +"\n"; + dynstr_append_mem(&ds_tmp, message, sizeof(message)); - dynstr_append(&ds_tmp, " --- "); - dynstr_append(&ds_tmp, filename1); - dynstr_append(&ds_tmp, " >>>\n"); + dynstr_append_mem(&ds_tmp, STRING_WITH_LEN(" --- ")); + dynstr_append_mem(&ds_tmp, filename1, strlen(filename1)); + dynstr_append_mem(&ds_tmp, STRING_WITH_LEN(" >>>\n")); cat_file(&ds_tmp, filename1); - dynstr_append(&ds_tmp, "<<<\n --- "); - dynstr_append(&ds_tmp, filename1); - dynstr_append(&ds_tmp, " >>>\n"); + dynstr_append_mem(&ds_tmp, STRING_WITH_LEN("<<<\n --- ")); + dynstr_append_mem(&ds_tmp, filename1, strlen(filename1)); + dynstr_append_mem(&ds_tmp, STRING_WITH_LEN(" >>>\n")); cat_file(&ds_tmp, filename2); - dynstr_append(&ds_tmp, "<<<<\n"); + dynstr_append_mem(&ds_tmp, STRING_WITH_LEN("<<<<\n")); } if (ds) @@ -2227,14 +2252,14 @@ check_result RETURN VALUES - error - the function will not return - + 0 ok + 1 error */ -void check_result() +int check_result() { const char *mess= 0; - + int error= 1; DBUG_ENTER("check_result"); DBUG_ASSERT(result_file_name); DBUG_PRINT("enter", ("result_file_name: %s", result_file_name)); @@ -2242,7 +2267,10 @@ switch (compare_files(log_file.file_name(), result_file_name)) { case RESULT_OK: if (!error_count) + { + error= 0; break; /* ok */ + } mess= "Got errors while running test"; /* Fallthrough */ case RESULT_LENGTH_MISMATCH: @@ -2281,14 +2309,13 @@ log_file.file_name(), reject_file, errno); show_diff(NULL, result_file_name, reject_file); - die("%s", mess); + fprintf(stderr, "%s", mess); break; } default: /* impossible */ die("Unknown error code from dyn_string_cmp()"); } - - DBUG_VOID_RETURN; + DBUG_RETURN(error); } @@ -2818,9 +2845,9 @@ set_result_format_version(version); - dynstr_append(&ds_res, "result_format: "); + dynstr_append_mem(&ds_res, STRING_WITH_LEN("result_format: ")); dynstr_append_mem(&ds_res, ds_version.str, ds_version.length); - dynstr_append(&ds_res, "\n"); + dynstr_append_mem(&ds_res, STRING_WITH_LEN("\n")); dynstr_free(&ds_version); } @@ -3291,13 +3318,15 @@ { DYNAMIC_STRING ds_tmp; const char *start= strstr(ds_str->str, search_str); + size_t prefixlen= start - ds_str->str; if (!start) return 1; init_dynamic_string(&ds_tmp, "", ds_str->length + replace_len, 256); - dynstr_append_mem(&ds_tmp, ds_str->str, start - ds_str->str); + dynstr_append_mem(&ds_tmp, ds_str->str, prefixlen); dynstr_append_mem(&ds_tmp, replace_str, replace_len); - dynstr_append(&ds_tmp, start + search_len); + dynstr_append_mem(&ds_tmp, start + search_len, + ds_str->length - prefixlen - search_len); dynstr_set(ds_str, ds_tmp.str); dynstr_free(&ds_tmp); return 0; @@ -3412,7 +3441,7 @@ if (disable_result_log) { /* Collect stderr output as well, for the case app. crashes or returns error.*/ - dynstr_append(&ds_cmd, " 2>&1"); + dynstr_append_mem(&ds_cmd, STRING_WITH_LEN(" 2>&1")); } DBUG_PRINT("info", ("Executing '%s' as '%s'", @@ -3624,9 +3653,9 @@ else { /* If ! abort_on_error, log message and continue */ - dynstr_append(&ds_res, "system command '"); + dynstr_append_mem(&ds_res, STRING_WITH_LEN("system command '")); replace_dynstr_append(&ds_res, command->first_argument); - dynstr_append(&ds_res, "' failed\n"); + dynstr_append_mem(&ds_res, STRING_WITH_LEN("' failed\n")); } } @@ -3802,7 +3831,7 @@ wild_compare(file->name, ds_wild.str, 0)) continue; ds_file_to_remove.length= directory_length; - dynstr_append(&ds_file_to_remove, file->name); + dynstr_append_mem(&ds_file_to_remove, file->name, strlen(file->name)); DBUG_PRINT("info", ("removing file: %s", ds_file_to_remove.str)); if ((error= (my_delete(ds_file_to_remove.str, MYF(MY_WME)) != 0))) sys_errno= my_errno; @@ -4092,7 +4121,7 @@ wild_compare(file->name, ds_wild->str, 0)) continue; replace_dynstr_append(ds, file->name); - dynstr_append(ds, "\n"); + dynstr_append_mem(ds, STRING_WITH_LEN("\n")); } set_wild_chars(0); my_dirend(dir_info); @@ -4340,6 +4369,49 @@ do_write_file_command(command, FALSE); } +/** + Write a line to the start of the file. + Truncates existing file, creates new one if it doesn't exist. + + Usage + write_line ; + + Example + --write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + + @note Both the file and the line parameters are evaluated + (can be variables). + + @note This is a better alternative to + exec echo > file, as it doesn't depend on shell, + and can better handle sporadic file access errors caused + by antivirus or backup software on Windows. +*/ +void do_write_line(struct st_command *command) +{ + DYNAMIC_STRING ds_line; + DYNAMIC_STRING ds_filename; + + struct command_arg write_line_args[] = { + { "line", ARG_STRING, FALSE, &ds_line, "line to add" }, + { "filename", ARG_STRING, TRUE, &ds_filename, "File to write to" }, + }; + DBUG_ENTER("do_write_line"); + + check_command_args(command, + command->first_argument, + write_line_args, + sizeof(write_line_args)/sizeof(struct command_arg), + ' '); + + if (bad_path(ds_filename.str)) + DBUG_VOID_RETURN; + dynstr_append_mem(&ds_line, "\n", 1); + str_to_file2(ds_filename.str, ds_line.str, ds_line.length, FALSE); + dynstr_free(&ds_filename); + dynstr_free(&ds_line); + DBUG_VOID_RETURN; +} /* SYNOPSIS @@ -4690,15 +4762,11 @@ /* Check for error code that indicates perl could not be started */ int exstat= WEXITSTATUS(error); -#ifdef _WIN32 - if (exstat == 1) - /* Text must begin 'perl not found' as mtr looks for it */ - abort_not_supported_test("perl not found in path or did not start"); -#else +#ifndef _WIN32 if (exstat == 127) abort_not_supported_test("perl not found in path"); -#endif else +#endif handle_command_error(command, exstat, my_errno); } dynstr_free(&ds_delimiter); @@ -5261,7 +5329,11 @@ */ if (timeout && mysql_shutdown(mysql, SHUTDOWN_DEFAULT)) - die("mysql_shutdown failed"); + { + handle_error(command, mysql_errno(mysql), mysql_error(mysql), + mysql_sqlstate(mysql), &ds_res); + DBUG_VOID_RETURN; + } if (!timeout || wait_until_dead(pid, timeout)) { @@ -5689,7 +5761,6 @@ #endif /*!EMBEDDED_LIBRARY*/ if (con->stmt) do_stmt_close(con); - con->stmt= 0; #ifdef EMBEDDED_LIBRARY /* As query could be still executed in a separate thread @@ -5905,14 +5976,20 @@ stay clear of trying to work out which exact user-limit was exceeded. */ + auto my_err= mysql_errno(con); + if(my_err == 0) + { + /* Workaround client library bug, not indicating connection error. */ + my_err= CR_SERVER_LOST; + } - if (((mysql_errno(con) == ER_TOO_MANY_USER_CONNECTIONS) || - (mysql_errno(con) == ER_USER_LIMIT_REACHED)) && + if (((my_err == ER_TOO_MANY_USER_CONNECTIONS) || + (my_err == ER_USER_LIMIT_REACHED)) && (failed_attempts++ < opt_max_connect_retries)) { int i; - i= match_expected_error(command, mysql_errno(con), mysql_sqlstate(con)); + i= match_expected_error(command, my_err, mysql_sqlstate(con)); if (i >= 0) goto do_handle_error; /* expected error, handle */ @@ -5922,9 +5999,9 @@ } do_handle_error: - var_set_errno(mysql_errno(con)); - handle_error(command, mysql_errno(con), mysql_error(con), - mysql_sqlstate(con), ds); + var_set_errno(my_err); + handle_error(command, my_err, mysql_error(con), + mysql_sqlstate(con), ds); return 0; /* Not connected */ } @@ -6269,7 +6346,7 @@ if (*cur_block->delim) { /* Restore "old" delimiter after false if block */ - if (safe_strcpy(delimiter, sizeof(delimiter), cur_block->delim)) + if (safe_strcpy_truncated(delimiter, sizeof delimiter, cur_block->delim)) die("Delimiter too long, truncated"); delimiter_length= strlen(delimiter); @@ -6530,7 +6607,8 @@ else { /* Remember "old" delimiter if entering a false if block */ - if (safe_strcpy(cur_block->delim, sizeof(cur_block->delim), delimiter)) + if (safe_strcpy_truncated(cur_block->delim, sizeof cur_block->delim, + delimiter)) die("Delimiter too long, truncated"); } @@ -7377,17 +7455,17 @@ break; case 'V': print_version(); - exit(0); + cleanup_and_exit(0,0); case OPT_MYSQL_PROTOCOL: #ifndef EMBEDDED_LIBRARY if ((opt_protocol= find_type_with_warning(argument, &sql_protocol_typelib, opt->name)) <= 0) - exit(1); + cleanup_and_exit(1,0); #endif break; case '?': usage(); - exit(0); + cleanup_and_exit(0,0); } return 0; } @@ -7399,12 +7477,12 @@ default_argv= argv; if ((handle_options(&argc, &argv, my_long_options, get_one_option))) - exit(1); + cleanup_and_exit(1, 0); if (argc > 1) { usage(); - exit(1); + cleanup_and_exit(1, 0); } if (argc == 1) opt_db= *argv; @@ -7471,7 +7549,7 @@ die("Could not open '%s' for writing, errno: %d", buff, errno); if (append && my_seek(fd, 0, SEEK_END, MYF(0)) == MY_FILEPOS_ERROR) die("Could not find end of file '%s', errno: %d", buff, errno); - if (my_write(fd, (uchar*)str, size, MYF(MY_WME|MY_FNABP))) + if (size > 0 && my_write(fd, (uchar*)str, size, MYF(MY_WME|MY_FNABP))) die("write failed, errno: %d", errno); my_close(fd, MYF(0)); } @@ -7681,7 +7759,7 @@ } else { - dynstr_append(ds, field->name); + dynstr_append_mem(ds, field->name, strlen(field->name)); dynstr_append_mem(ds, "\t", 1); replace_dynstr_append_mem(ds, val, len); dynstr_append_mem(ds, "\n", 1); @@ -7792,9 +7870,10 @@ uint num_fields) { MYSQL_FIELD *field_end; - dynstr_append(ds,"Catalog\tDatabase\tTable\tTable_alias\tColumn\t" - "Column_alias\tType\tLength\tMax length\tIs_null\t" - "Flags\tDecimals\tCharsetnr\n"); + dynstr_append_mem(ds, STRING_WITH_LEN( + "Catalog\tDatabase\tTable\tTable_alias\tColumn\t" + "Column_alias\tType\tLength\tMax length\tIs_null\t" + "Flags\tDecimals\tCharsetnr\n")); for (field_end= field+num_fields ; field < field_end ; @@ -7853,13 +7932,13 @@ const char *info) { char buf[40], buff2[21]; - sprintf(buf,"affected rows: %s\n", llstr(affected_rows, buff2)); - dynstr_append(ds, buf); + size_t len= sprintf(buf,"affected rows: %s\n", llstr(affected_rows, buff2)); + dynstr_append_mem(ds, buf, len); if (info) { - dynstr_append(ds, "info: "); - dynstr_append(ds, info); - dynstr_append_mem(ds, "\n", 1); + dynstr_append_mem(ds, STRING_WITH_LEN("info: ")); + dynstr_append_mem(ds, info, strlen(info)); + dynstr_append_mem(ds, STRING_WITH_LEN("\n")); } } @@ -7905,18 +7984,19 @@ (enum_session_state_type) type, &data, &data_length)) { - dynstr_append(ds, "-- "); + dynstr_append_mem(ds, STRING_WITH_LEN("-- ")); if (type <= SESSION_TRACK_END) { - dynstr_append(ds, trking_info_desc[type]); + dynstr_append_mem(ds, trking_info_desc[type], + strlen(trking_info_desc[type])); } else { DBUG_ASSERT(0); - dynstr_append(ds, "Tracker???\n"); + dynstr_append_mem(ds, STRING_WITH_LEN("Tracker???\n")); } - dynstr_append(ds, "-- "); + dynstr_append_mem(ds, STRING_WITH_LEN("-- ")); dynstr_append_mem(ds, data, data_length); } else @@ -7925,16 +8005,16 @@ (enum_session_state_type) type, &data, &data_length)) { - dynstr_append(ds, "\n-- "); + dynstr_append_mem(ds, STRING_WITH_LEN("\n-- ")); if (data == NULL) { DBUG_ASSERT(data_length == 0); - dynstr_append_mem(ds, "", sizeof("") - 1); + dynstr_append_mem(ds, STRING_WITH_LEN("")); } else dynstr_append_mem(ds, data, data_length); } - dynstr_append(ds, "\n\n"); + dynstr_append_mem(ds, STRING_WITH_LEN("\n\n")); } #endif /* EMBEDDED_LIBRARY */ } @@ -8264,7 +8344,7 @@ SYNOPSIS handle_error() - q - query context + command - command err_errno - error number err_error - error message err_sqlstate - sql state @@ -8334,7 +8414,8 @@ else if (command->expected_errors.err[0].type == ERR_SQLSTATE || (command->expected_errors.err[0].type == ERR_ERRNO && command->expected_errors.err[0].code.errnum != 0)) - dynstr_append(ds,"Got one of the listed errors\n"); + dynstr_append_mem(ds, STRING_WITH_LEN("Got one of the listed " + "errors\n")); } /* OK */ revert_properties(); @@ -8414,6 +8495,85 @@ /* + Read result set after prepare statement execution + + SYNOPSIS + read_stmt_results + stmt - prepare statemet + mysql - mysql handle + command - current command pointer + ds - output buffer where to store result form query + + RETURN VALUE + 1 - if there is an error in result set +*/ + +int read_stmt_results(MYSQL_STMT* stmt, + DYNAMIC_STRING* ds, + struct st_command *command) +{ + MYSQL_RES *res= NULL; + + /* + We instruct that we want to update the "max_length" field in + mysql_stmt_store_result(), this is our only way to know how much + buffer to allocate for result data + */ + { + my_bool one= 1; + if (mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &one)) + die("mysql_stmt_attr_set(STMT_ATTR_UPDATE_MAX_LENGTH) failed': %d %s", + mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); + } + + /* + If we got here the statement succeeded and was expected to do so, + get data. Note that this can still give errors found during execution! + Store the result of the query if if will return any fields + */ + if (mysql_stmt_field_count(stmt) && mysql_stmt_store_result(stmt)) + { + handle_error(command, mysql_stmt_errno(stmt), + mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds); + return 1; + } + + if (!disable_result_log) + { + /* + Not all statements creates a result set. If there is one we can + now create another normal result set that contains the meta + data. This set can be handled almost like any other non prepared + statement result set. + */ + if ((res= mysql_stmt_result_metadata(stmt)) != NULL) + { + /* Take the column count from meta info */ + MYSQL_FIELD *fields= mysql_fetch_fields(res); + uint num_fields= mysql_num_fields(res); + + if (display_metadata) + append_metadata(ds, fields, num_fields); + + if (!display_result_vertically) + append_table_headings(ds, fields, num_fields); + + append_stmt_result(ds, stmt, fields, num_fields); + + mysql_free_result(res); /* Free normal result set with meta data */ + + } + else + { + /* + This is a query without resultset + */ + } + } + return 0; +} + +/* Run query using prepared statement C API SYNOPSIS @@ -8433,11 +8593,17 @@ DYNAMIC_STRING *ds_warnings) { my_bool ignore_second_execution= 0; - MYSQL_RES *res= NULL; /* Note that here 'res' is meta data result set */ MYSQL *mysql= cn->mysql; MYSQL_STMT *stmt; DYNAMIC_STRING ds_prepare_warnings; DYNAMIC_STRING ds_execute_warnings; + DYNAMIC_STRING ds_res_1st_execution; + DYNAMIC_STRING ds_res_2_execution_unsorted; + DYNAMIC_STRING *ds_res_2_output; + my_bool ds_res_1st_execution_init = FALSE; + my_bool compare_2nd_execution = TRUE; + int query_match_ps2_re; + MYSQL_RES *res; DBUG_ENTER("run_query_stmt"); DBUG_PRINT("query", ("'%-.60s'", query)); DBUG_PRINT("info", @@ -8453,7 +8619,7 @@ /* Init a new stmt if it's not already one created for this connection */ - if(!(stmt= cn->stmt)) + if (!(stmt= cn->stmt)) { if (!(stmt= mysql_stmt_init(mysql))) die("unable to init stmt structure"); @@ -8467,6 +8633,12 @@ init_dynamic_string(&ds_execute_warnings, NULL, 0, 256); } + /* Check and remove potential trash */ + if (strlen(ds->str) != 0) + { + dynstr_trunc(ds, 0); + } + /* Prepare the query */ @@ -8502,10 +8674,12 @@ } #endif + query_match_ps2_re = match_re(&ps2_re, query); + /* Execute the query first time if second execution enable */ - if(ps2_protocol_enabled && match_re(&ps2_re, query)) + if (ps2_protocol_enabled && query_match_ps2_re) { if (do_stmt_execute(cn)) { @@ -8513,12 +8687,32 @@ mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds); goto end; } + /* We cannot run query twice if we get prepare warnings as these will otherwise be disabled */ ignore_second_execution= (prepare_warnings_enabled && mysql_warning_count(mysql) != 0); + + if (ignore_second_execution) + compare_2nd_execution = 0; + else + { + init_dynamic_string(&ds_res_1st_execution, "", + RESULT_STRING_INIT_MEM, RESULT_STRING_INCREMENT_MEM); + ds_res_1st_execution_init = TRUE; + if (read_stmt_results(stmt, &ds_res_1st_execution, command)) + { + /* + There was an error during execution + and there is no result set to compare + */ + compare_2nd_execution = 0; + } + else + handle_no_error(command); + } } /* @@ -8531,6 +8725,8 @@ goto end; } + DBUG_ASSERT(ds->length == 0); + int err; do { @@ -8541,74 +8737,84 @@ if (cursor_protocol_enabled && !disable_warnings) append_warnings(&ds_execute_warnings, mysql); - /* - We instruct that we want to update the "max_length" field in - mysql_stmt_store_result(), this is our only way to know how much - buffer to allocate for result data - */ - { - my_bool one= 1; - if (mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &one)) - die("mysql_stmt_attr_set(STMT_ATTR_UPDATE_MAX_LENGTH) failed': %d %s", - mysql_stmt_errno(stmt), mysql_stmt_error(stmt)); + if (!disable_result_log && + compare_2nd_execution && + ps2_protocol_enabled && + query_match_ps2_re && + display_result_sorted) + { + init_dynamic_string(&ds_res_2_execution_unsorted, "", + RESULT_STRING_INIT_MEM, + RESULT_STRING_INCREMENT_MEM); + ds_res_2_output= &ds_res_2_execution_unsorted; } + else + ds_res_2_output= ds; - /* - If we got here the statement succeeded and was expected to do so, - get data. Note that this can still give errors found during execution! - Store the result of the query if if will return any fields - */ - if (mysql_stmt_field_count(stmt) && mysql_stmt_store_result(stmt)) + if (read_stmt_results(stmt, ds_res_2_output, command)) { - handle_error(command, mysql_stmt_errno(stmt), - mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds); - goto end; + if (ds_res_2_output != ds) + { + dynstr_append_mem(ds, ds_res_2_output->str, ds_res_2_output->length); + dynstr_free(ds_res_2_output); + } + goto end; } if (!disable_result_log) { /* - Not all statements creates a result set. If there is one we can - now create another normal result set that contains the meta - data. This set can be handled almost like any other non prepared - statement result set. + The results of the first and second execution are compared + only if result logging is enabled */ - if ((res= mysql_stmt_result_metadata(stmt)) != NULL) + if (compare_2nd_execution && ps2_protocol_enabled && query_match_ps2_re) { - /* Take the column count from meta info */ - MYSQL_FIELD *fields= mysql_fetch_fields(res); - uint num_fields= mysql_num_fields(res); - - if (display_metadata) - append_metadata(ds, fields, num_fields); - - if (!display_result_vertically) - append_table_headings(ds, fields, num_fields); - - append_stmt_result(ds, stmt, fields, num_fields); - - mysql_free_result(res); /* Free normal result set with meta data */ - - /* - Normally, if there is a result set, we do not show warnings from the - prepare phase. This is because some warnings are generated both during - prepare and execute; this would generate different warning output - between normal and ps-protocol test runs. - - The --enable_prepare_warnings command can be used to change this so - that warnings from both the prepare and execute phase are shown. - */ - if (!disable_warnings && !prepare_warnings_enabled) + DYNAMIC_STRING *ds_res_1_execution_compare; + DYNAMIC_STRING ds_res_1_execution_sorted; + if (display_result_sorted) { - DBUG_PRINT("info", ("warnings disabled")); - dynstr_set(&ds_prepare_warnings, NULL); + init_dynamic_string(&ds_res_1_execution_sorted, "", + RESULT_STRING_INIT_MEM, + RESULT_STRING_INCREMENT_MEM); + dynstr_append_sorted(&ds_res_1_execution_sorted, + &ds_res_1st_execution, 1); + dynstr_append_sorted(ds, &ds_res_2_execution_unsorted, 1); + ds_res_1_execution_compare= &ds_res_1_execution_sorted; + } + else + { + ds_res_1_execution_compare= &ds_res_1st_execution; + } + if (ds->length != ds_res_1_execution_compare->length || + !(memcmp(ds_res_1_execution_compare->str, ds->str, ds->length) == 0)) + { + die("The result of the 1st execution does not match with \n" + "the result of the 2nd execution of ps-protocol:\n 1st:\n" + "%s\n 2nd:\n %s", + ds_res_1_execution_compare->str, + ds->str); + } + if (display_result_sorted) + { + dynstr_free(&ds_res_1_execution_sorted); + dynstr_free(&ds_res_2_execution_unsorted); } } - else + + /* + Normally, if there is a result set, we do not show warnings from the + prepare phase. This is because some warnings are generated both during + prepare and execute; this would generate different warning output + between normal and ps-protocol test runs. + The --enable_prepare_warnings command can be used to change this so + that warnings from both the prepare and execute phase are shown. + */ + if ((res= mysql_stmt_result_metadata(stmt))) { - /* - This is a query without resultset - */ + if (!disable_warnings && + !prepare_warnings_enabled) + dynstr_set(&ds_prepare_warnings, NULL); + mysql_free_result(res); } /* @@ -8621,7 +8827,6 @@ if (display_session_track_info) append_session_track_info(ds, mysql); - if (!disable_warnings && !mysql_more_results(stmt->mysql)) { /* Get the warnings from execute */ @@ -8653,7 +8858,15 @@ mysql_sqlstate(mysql), ds); else handle_no_error(command); + end: + + if (ds_res_1st_execution_init) + { + dynstr_free(&ds_res_1st_execution); + ds_res_1st_execution_init= FALSE; + } + if (!disable_warnings) { dynstr_free(&ds_prepare_warnings); @@ -9164,11 +9377,14 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags) { MYSQL *mysql= cn->mysql; - DYNAMIC_STRING *ds; - DYNAMIC_STRING *save_ds= NULL; - DYNAMIC_STRING ds_result; - DYNAMIC_STRING ds_sorted; - DYNAMIC_STRING ds_warnings; + DYNAMIC_STRING *rs_output; /* where to put results */ + DYNAMIC_STRING rs_cmp_result; /* here we put results to compare with + pre-recrded file */ + DYNAMIC_STRING rs_unsorted; /* if we need sorted results, here we store + results before sorting them */ + DYNAMIC_STRING *rs_sorted_save= NULL; /* here we store where to put sorted + result if needed */ + DYNAMIC_STRING rs_warnings; char *query; size_t query_len; my_bool view_created= 0, sp_created= 0; @@ -9181,10 +9397,10 @@ if (!(flags & QUERY_SEND_FLAG) && !cn->pending) die("Cannot reap on a connection without pending send"); - - init_dynamic_string(&ds_warnings, NULL, 0, 256); - ds_warn= &ds_warnings; - + + init_dynamic_string(&rs_warnings, NULL, 0, 256); + ds_warn= &rs_warnings; + /* Evaluate query if this is an eval command */ @@ -9214,11 +9430,11 @@ */ if (command->require_file) { - init_dynamic_string(&ds_result, "", 1024, 1024); - ds= &ds_result; + init_dynamic_string(&rs_cmp_result, "", 1024, 1024); + rs_output= &rs_cmp_result; } else - ds= &ds_res; + rs_output= &ds_res; // will be shown to colsole /* Log the query into the output buffer @@ -9232,9 +9448,9 @@ print_query= command->query; print_len= (int)(command->end - command->query); } - replace_dynstr_append_mem(ds, print_query, print_len); - dynstr_append_mem(ds, delimiter, delimiter_length); - dynstr_append_mem(ds, "\n", 1); + replace_dynstr_append_mem(rs_output, print_query, print_len); + dynstr_append_mem(rs_output, delimiter, delimiter_length); + dynstr_append_mem(rs_output, "\n", 1); } /* We're done with this flag */ @@ -9289,7 +9505,7 @@ Collect warnings from create of the view that should otherwise have been produced when the SELECT was executed */ - append_warnings(&ds_warnings, + append_warnings(&rs_warnings, service_connection_enabled ? cur_con->util_mysql : mysql); @@ -9345,9 +9561,9 @@ that can be sorted before it's added to the global result string */ - init_dynamic_string(&ds_sorted, "", 1024, 1024); - save_ds= ds; /* Remember original ds */ - ds= &ds_sorted; + init_dynamic_string(&rs_unsorted, "", 1024, 1024); + rs_sorted_save= rs_output; /* Remember original ds */ + rs_output= &rs_unsorted; } /* @@ -9368,20 +9584,20 @@ All other statements can be run using prepared statement C API. */ !match_re(&ps_re, query)) - run_query_stmt(cn, command, query, query_len, ds, &ds_warnings); + run_query_stmt(cn, command, query, query_len, rs_output, &rs_warnings); else run_query_normal(cn, command, flags, query, query_len, - ds, &ds_warnings); + rs_output, &rs_warnings); - dynstr_free(&ds_warnings); + dynstr_free(&rs_warnings); ds_warn= 0; if (display_result_sorted) { /* Sort the result set and append it to result */ - dynstr_append_sorted(save_ds, &ds_sorted, 1); - ds= save_ds; - dynstr_free(&ds_sorted); + dynstr_append_sorted(rs_sorted_save, &rs_unsorted, 1); + rs_output= rs_sorted_save; + dynstr_free(&rs_unsorted); } if (sp_created) @@ -9404,11 +9620,11 @@ and the output should be checked against an already existing file which has been specified using --require or --result */ - check_require(ds, command->require_file); + check_require(rs_output, command->require_file); } - if (ds == &ds_result) - dynstr_free(&ds_result); + if (rs_output == &rs_cmp_result) + dynstr_free(&rs_cmp_result); DBUG_VOID_RETURN; } @@ -9667,7 +9883,7 @@ dynstr_append_mem(&ds_progress, "\t", 1); /* Filename */ - dynstr_append(&ds_progress, cur_file->file_name); + dynstr_append_mem(&ds_progress, cur_file->file_name, strlen(cur_file->file_name)); dynstr_append_mem(&ds_progress, ":", 1); /* Line in file */ @@ -9726,6 +9942,7 @@ fflush(stderr); my_write_core(sig); #ifndef _WIN32 + sf_leaking_memory= 1; exit(1); // Shouldn't get here but just in case #endif } @@ -9799,12 +10016,10 @@ uint command_executed= 0, last_command_executed= 0; char save_file[FN_REFLEN]; bool empty_result= FALSE; + int error= 0; MY_INIT(argv[0]); DBUG_ENTER("main"); - /* mysqltest has no way to free all its memory correctly */ - sf_leaking_memory= 1; - save_file[0]= 0; TMPDIR[0]= 0; @@ -9865,7 +10080,7 @@ read_command_buf= (char*)my_malloc(PSI_NOT_INSTRUMENTED, read_command_buflen= 65536, MYF(MY_FAE)); - init_dynamic_string(&ds_res, "", 2048, 2048); + init_dynamic_string(&ds_res, "", RESULT_STRING_INIT_MEM, RESULT_STRING_INCREMENT_MEM); init_alloc_root(PSI_NOT_INSTRUMENTED, &require_file_root, 1024, 1024, MYF(0)); parse_args(argc, argv); @@ -10130,6 +10345,7 @@ break; case Q_FILE_EXIST: do_file_exist(command); break; case Q_WRITE_FILE: do_write_file(command); break; + case Q_WRITE_LINE: do_write_line(command); break; case Q_APPEND_FILE: do_append_file(command); break; case Q_DIFF_FILES: do_diff_files(command); break; case Q_SEND_QUIT: do_send_quit(command); break; @@ -10292,7 +10508,7 @@ if (p && *p == '#' && *(p+1) == '#') { dynstr_append_mem(&ds_res, command->query, command->query_len); - dynstr_append(&ds_res, "\n"); + dynstr_append_mem(&ds_res, STRING_WITH_LEN("\n")); } break; } @@ -10305,7 +10521,7 @@ if (disable_query_log) break; - dynstr_append(&ds_res, "\n"); + dynstr_append_mem(&ds_res, STRING_WITH_LEN("\n")); break; case Q_PING: handle_command_error(command, mysql_ping(cur_con->mysql), -1); @@ -10497,7 +10713,7 @@ die("Test ended with parsing disabled"); /* - The whole test has been executed _successfully_. + The whole test has been executed successfully. Time to compare result or save it to record file. The entire output from test is in the log file */ @@ -10520,7 +10736,7 @@ else { /* Check that the output from test is equal to result file */ - check_result(); + error= check_result(); } } } @@ -10530,7 +10746,8 @@ if (! result_file_name || record || compare_files (log_file.file_name(), result_file_name)) { - die("The test didn't produce any output"); + fprintf(stderr, "mysqltest: The test didn't produce any output\n"); + error= 1; } else { @@ -10539,12 +10756,15 @@ } if (!command_executed && result_file_name && !empty_result) - die("No queries executed but non-empty result file found!"); + { + fprintf(stderr, "mysqltest: No queries executed but non-empty result file found!\n"); + error= 1; + } - verbose_msg("Test has succeeded!"); + if (!error) + verbose_msg("Test has succeeded!"); timer_output(); - /* Yes, if we got this far the test has succeeded! Sakila smiles */ - cleanup_and_exit(0); + cleanup_and_exit(error, 0); return 0; /* Keep compiler happy too */ } @@ -11967,8 +12187,8 @@ for (i= 0; i < lines.elements ; i++) { const char **line= dynamic_element(&lines, i, const char**); - dynstr_append(ds, *line); - dynstr_append(ds, "\n"); + dynstr_append_mem(ds, *line, strlen(*line)); + dynstr_append_mem(ds, STRING_WITH_LEN("\n")); } delete_dynamic(&lines); diff -Nru mariadb-10.11.6/cmake/FindPMEM.cmake mariadb-10.11.9/cmake/FindPMEM.cmake --- mariadb-10.11.6/cmake/FindPMEM.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/FindPMEM.cmake 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -if(PMEM_LIBRARIES) - set(PMEM_FOUND TRUE) - return() -endif() -if(DEFINED PMEM_LIBRARIES) - set(PMEM_FOUND FALSE) - return() -endif() - -find_path(PMEM_INCLUDE_DIRS NAMES libpmem.h) -find_library(PMEM_LIBRARIES NAMES pmem) - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS( - PMEM DEFAULT_MSG - PMEM_LIBRARIES PMEM_INCLUDE_DIRS) - -mark_as_advanced(PMEM_INCLUDE_DIRS PMEM_LIBRARIES) diff -Nru mariadb-10.11.6/cmake/libfmt.cmake mariadb-10.11.9/cmake/libfmt.cmake --- mariadb-10.11.6/cmake/libfmt.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/libfmt.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -1,4 +1,4 @@ -INCLUDE (CheckCXXSourceCompiles) +INCLUDE (CheckCXXSourceRuns) INCLUDE (ExternalProject) SET(WITH_LIBFMT "auto" CACHE STRING @@ -15,8 +15,8 @@ ExternalProject_Add( libfmt PREFIX "${dir}" - URL "https://github.com/fmtlib/fmt/archive/refs/tags/8.0.1.zip" - URL_MD5 e77873199e897ca9f780479ad68e25b1 + URL "https://github.com/fmtlib/fmt/releases/download/11.0.1/fmt-11.0.1.zip" + URL_MD5 5f3915e2eff60e7f70c558120592100d INSTALL_COMMAND "" CONFIGURE_COMMAND "" BUILD_COMMAND "" @@ -27,17 +27,15 @@ MACRO (CHECK_LIBFMT) IF(WITH_LIBFMT STREQUAL "system" OR WITH_LIBFMT STREQUAL "auto") SET(CMAKE_REQUIRED_INCLUDES ${LIBFMT_INCLUDE_DIR}) - CHECK_CXX_SOURCE_COMPILES( + CHECK_CXX_SOURCE_RUNS( "#define FMT_STATIC_THOUSANDS_SEPARATOR ',' #define FMT_HEADER_ONLY 1 #include - #include int main() { - int answer= 42; + int answer= 4321; fmt::format_args::format_arg arg= fmt::detail::make_arg(answer); - std::cout << fmt::vformat(\"The answer is {}.\", - fmt::format_args(&arg, 1)); + return fmt::vformat(\"{:L}\", fmt::format_args(&arg, 1)).compare(\"4,321\"); }" HAVE_SYSTEM_LIBFMT) SET(CMAKE_REQUIRED_INCLUDES) ENDIF() diff -Nru mariadb-10.11.6/cmake/libutils.cmake mariadb-10.11.9/cmake/libutils.cmake --- mariadb-10.11.6/cmake/libutils.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/libutils.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -379,5 +379,11 @@ INTERPROCEDURAL_OPTIMIZATION_RELEASE OFF INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO OFF INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL OFF) + IF(CMAKE_CONFIGURATION_TYPES) + FOREACH(cfg ${CMAKE_CONFIGURATION_TYPES}) + STRING(TOUPPER "${cfg}" cfg_upper) + SET_TARGET_PROPERTIES(${target} PROPERTIES INTERPROCEDURAL_OPTIMIZATION_${cfg_upper} OFF) + ENDFOREACH() + ENDIF() ENDIF() ENDFUNCTION() diff -Nru mariadb-10.11.6/cmake/maintainer.cmake mariadb-10.11.9/cmake/maintainer.cmake --- mariadb-10.11.6/cmake/maintainer.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/maintainer.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -27,6 +27,7 @@ -Wenum-conversion -Wextra -Wformat-security + -Winconsistent-missing-override -Wmissing-braces -Wno-format-truncation -Wno-init-self @@ -34,8 +35,9 @@ -Wno-null-conversion -Wno-unused-parameter -Wno-unused-private-field - -Woverloaded-virtual -Wnon-virtual-dtor + -Woverloaded-virtual + -Wsuggest-override -Wvla -Wwrite-strings ) @@ -44,7 +46,7 @@ MY_CHECK_AND_SET_COMPILER_FLAG(${F} DEBUG RELWITHDEBINFO) ENDFOREACH() -SET(MY_ERROR_FLAGS -Werror) +SET(MY_ERROR_FLAGS -Werror -fno-operator-names) IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0") SET(MY_ERROR_FLAGS ${MY_ERROR_FLAGS} -Wno-error=maybe-uninitialized) diff -Nru mariadb-10.11.6/cmake/mariadb_connector_c.cmake mariadb-10.11.9/cmake/mariadb_connector_c.cmake --- mariadb-10.11.6/cmake/mariadb_connector_c.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/mariadb_connector_c.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -40,6 +40,13 @@ MESSAGE("== Configuring MariaDB Connector/C") ADD_SUBDIRECTORY(libmariadb) +IF(MSVC AND TARGET mariadb_obj AND TARGET mariadbclient) + # With MSVC, do not produce LTCG-compiled static client libraries. + # They are not usable by end-users, being tied to exact compiler version + MAYBE_DISABLE_IPO(mariadb_obj) + MAYBE_DISABLE_IPO(mariadbclient) +ENDIF() + IF(UNIX) INSTALL(CODE "EXECUTE_PROCESS( COMMAND ${CMAKE_COMMAND} -E make_directory \$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}) diff -Nru mariadb-10.11.6/cmake/mysql_version.cmake mariadb-10.11.9/cmake/mysql_version.cmake --- mariadb-10.11.6/cmake/mysql_version.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/mysql_version.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -90,7 +90,7 @@ ENDIF() SET_IF_UNSET(CPACK_SOURCE_PACKAGE_FILE_NAME "mariadb-${VERSION}") -SET_IF_UNSET(CPACK_PACKAGE_CONTACT "MariaDB Developers ") +SET_IF_UNSET(CPACK_PACKAGE_CONTACT "MariaDB Developers ") SET_IF_UNSET(CPACK_PACKAGE_VENDOR "MariaDB Foundation") SET_IF_UNSET(CPACK_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION_SUMMARY} diff -Nru mariadb-10.11.6/cmake/os/Windows.cmake mariadb-10.11.9/cmake/os/Windows.cmake --- mariadb-10.11.6/cmake/os/Windows.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/os/Windows.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -273,6 +273,7 @@ STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " /d2OptimizeHugeFunctions") STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " /d2OptimizeHugeFunctions") ENDIF() + ADD_COMPILE_OPTIONS($<$:/utf-8>) ENDIF() # Always link with socket/synchronization libraries diff -Nru mariadb-10.11.6/cmake/os/WindowsCache.cmake mariadb-10.11.9/cmake/os/WindowsCache.cmake --- mariadb-10.11.6/cmake/os/WindowsCache.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/os/WindowsCache.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -242,7 +242,6 @@ SET(HAVE_TERMIOS_H CACHE INTERNAL "") SET(HAVE_TERMIO_H CACHE INTERNAL "") SET(HAVE_TERM_H CACHE INTERNAL "") -SET(HAVE_THR_SETCONCURRENCY CACHE INTERNAL "") SET(HAVE_THR_YIELD CACHE INTERNAL "") SET(HAVE_TIME 1 CACHE INTERNAL "") SET(HAVE_TIMES CACHE INTERNAL "") diff -Nru mariadb-10.11.6/cmake/package_name.cmake mariadb-10.11.9/cmake/package_name.cmake --- mariadb-10.11.6/cmake/package_name.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/package_name.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -102,11 +102,7 @@ SET(DEFAULT_MACHINE "${CMAKE_OSX_ARCHITECTURES}") ENDIF() ELSE() - IF(64BIT) - SET(DEFAULT_MACHINE "x86_64") - ELSE() - SET(DEFAULT_MACHINE "i386") - ENDIF() + SET(DEFAULT_MACHINE ${CMAKE_SYSTEM_PROCESSOR}) ENDIF() IF(DEFAULT_MACHINE MATCHES "i386") diff -Nru mariadb-10.11.6/cmake/pcre.cmake mariadb-10.11.9/cmake/pcre.cmake --- mariadb-10.11.6/cmake/pcre.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/pcre.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -1,12 +1,15 @@ -INCLUDE (CheckCSourceRuns) INCLUDE (ExternalProject) SET(WITH_PCRE "auto" CACHE STRING "Which pcre to use (possible values are 'bundled', 'system', or 'auto')") MACRO(BUNDLE_PCRE2) + SET(WITH_PCRE "bundled" CACHE STRING + "Which pcre to use (possible values are 'bundled', 'system', or 'auto')") + SET(dir "${CMAKE_BINARY_DIR}/extra/pcre2") - SET(PCRE_INCLUDES ${dir}/src/pcre2-build ${dir}/src/pcre2/src) + SET(PCRE_INCLUDE_DIRS ${dir}/src/pcre2-build ${dir}/src/pcre2/src) + MESSAGE(STATUS "Will download and bundle pcre2") SET(byproducts) FOREACH(lib pcre2-posix pcre2-8) ADD_LIBRARY(${lib} STATIC IMPORTED GLOBAL) @@ -41,21 +44,21 @@ SET(byproducts ${byproducts} BUILD_BYPRODUCTS ${file} ${file_d}) SET_TARGET_PROPERTIES(${lib} PROPERTIES IMPORTED_LOCATION ${file}) ENDFOREACH() + FOREACH(v "" "_DEBUG" "_RELWITHDEBINFO" "_RELEASE" "_MINSIZEREL") - STRING(REPLACE "/WX" "" pcre2_flags${v} "${CMAKE_C_FLAGS${v}}") - SET(pcre2_flags${v} "${pcre2_flags${v}} -std=c99 ") + SET(pcre2_flags${v} "${CMAKE_C_FLAGS${v}}") IF(MSVC) + STRING(REPLACE "/WX" "" pcre2_flags${v} "${pcre2_flags${v}}") # Suppress a warning - STRING(APPEND pcre2_flags${v} " /wd4244 " ) - # Disable asan support - STRING(REPLACE "-fsanitize=address" "" pcre2_flags${v} "${CMAKE_C_FLAGS${v}}") + STRING(APPEND pcre2_flags${v} " /wd4244 /wd4267 " ) ENDIF() ENDFOREACH() + ExternalProject_Add( pcre2 PREFIX "${dir}" - URL "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.42/pcre2-10.42.zip" - URL_MD5 fe90992fbfb03f854bd9f344074f49eb + URL "https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.zip" + URL_MD5 dfab8313154b3377a6959c3b6377841e INSTALL_COMMAND "" CMAKE_ARGS "-DCMAKE_WARN_DEPRECATED=FALSE" @@ -76,18 +79,23 @@ ENDMACRO() MACRO (CHECK_PCRE) - IF(WITH_PCRE STREQUAL "system" OR WITH_PCRE STREQUAL "auto") - CHECK_LIBRARY_EXISTS(pcre2-8 pcre2_match_8 "" HAVE_PCRE2) - ENDIF() - IF(NOT HAVE_PCRE2 OR WITH_PCRE STREQUAL "bundled") - IF (WITH_PCRE STREQUAL "system") - MESSAGE(FATAL_ERROR "system pcre2-8 library is not found or unusable") - ENDIF() - BUNDLE_PCRE2() - ELSE() - CHECK_LIBRARY_EXISTS(pcre2-posix PCRE2regcomp "" NEEDS_PCRE2_DEBIAN_HACK) - IF(NEEDS_PCRE2_DEBIAN_HACK) - SET(PCRE2_DEBIAN_HACK "-Dregcomp=PCRE2regcomp -Dregexec=PCRE2regexec -Dregerror=PCRE2regerror -Dregfree=PCRE2regfree") + IF (NOT TARGET pcre2 AND NOT PCRE_FOUND) + IF(WITH_PCRE STREQUAL "system" OR WITH_PCRE STREQUAL "auto") + FIND_PACKAGE(PkgConfig QUIET) + PKG_CHECK_MODULES(PCRE libpcre2-8) + # in case pkg-config or libpcre2-8.pc is not installed: + CHECK_LIBRARY_EXISTS(pcre2-8 pcre2_match_8 "${PCRE_LIBRARY_DIRS}" HAVE_PCRE2_MATCH_8) + ENDIF() + IF(NOT HAVE_PCRE2_MATCH_8 OR WITH_PCRE STREQUAL "bundled") + IF (WITH_PCRE STREQUAL "system") + MESSAGE(FATAL_ERROR "system pcre2-8 library is not found or unusable") + ENDIF() + BUNDLE_PCRE2() + ELSE() + CHECK_LIBRARY_EXISTS(pcre2-posix PCRE2regcomp "${PCRE_LIBRARY_DIRS}" NEEDS_PCRE2_DEBIAN_HACK) + IF(NEEDS_PCRE2_DEBIAN_HACK) + SET(PCRE2_DEBIAN_HACK "-Dregcomp=PCRE2regcomp -Dregexec=PCRE2regexec -Dregerror=PCRE2regerror -Dregfree=PCRE2regfree") + ENDIF() ENDIF() ENDIF() ENDMACRO() diff -Nru mariadb-10.11.6/cmake/plugin.cmake mariadb-10.11.9/cmake/plugin.cmake --- mariadb-10.11.6/cmake/plugin.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/plugin.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -44,9 +44,9 @@ # Add common include directories INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql - ${PCRE_INCLUDES} + ${PCRE_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS} - ${ZLIB_INCLUDE_DIR}) + ${ZLIB_INCLUDE_DIRS}) LIST(GET ARG_UNPARSED_ARGUMENTS 0 plugin) SET(SOURCES ${ARG_UNPARSED_ARGUMENTS}) diff -Nru mariadb-10.11.6/cmake/readline.cmake mariadb-10.11.9/cmake/readline.cmake --- mariadb-10.11.6/cmake/readline.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/readline.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -114,6 +114,9 @@ { rl_completion_func_t *func1= (rl_completion_func_t*)0; rl_compentry_func_t *func2= (rl_compentry_func_t*)0; + rl_on_new_line(); + rl_replace_line(\"\", 0); + rl_redisplay(); }" NEW_READLINE_INTERFACE) diff -Nru mariadb-10.11.6/cmake/ssl.cmake mariadb-10.11.9/cmake/ssl.cmake --- mariadb-10.11.6/cmake/ssl.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/ssl.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -53,13 +53,14 @@ ${CMAKE_SOURCE_DIR}/extra/wolfssl/wolfssl ${CMAKE_SOURCE_DIR}/extra/wolfssl/wolfssl/wolfssl ) - SET(SSL_LIBRARIES wolfssl wolfcrypt) + SET(SSL_LIBRARIES wolfssl) SET(SSL_INCLUDE_DIRS ${INC_DIRS}) SET(SSL_DEFINES "-DHAVE_OPENSSL -DHAVE_WOLFSSL -DWOLFSSL_USER_SETTINGS") SET(HAVE_ERR_remove_thread_state ON CACHE INTERNAL "wolfssl doesn't have ERR_remove_thread_state") SET(HAVE_EncryptAes128Ctr OFF CACHE INTERNAL "wolfssl does support AES-CTR, but differently from openssl") SET(HAVE_EncryptAes128Gcm OFF CACHE INTERNAL "wolfssl does not support AES-GCM") SET(HAVE_X509_check_host ON CACHE INTERNAL "wolfssl does support X509_check_host") + SET(HAVE_des ON CACHE INTERNAL "wolfssl does support DES API") CHANGE_SSL_SETTINGS("bundled") ADD_SUBDIRECTORY(extra/wolfssl) MESSAGE_ONCE(SSL_LIBRARIES "SSL_LIBRARIES = ${SSL_LIBRARIES}") @@ -158,6 +159,8 @@ HAVE_EncryptAes128Gcm) CHECK_SYMBOL_EXISTS(X509_check_host "openssl/x509v3.h" HAVE_X509_check_host) + CHECK_SYMBOL_EXISTS(DES_set_key_unchecked "openssl/des.h" + HAVE_des) SET(CMAKE_REQUIRED_INCLUDES) SET(CMAKE_REQUIRED_LIBRARIES) SET(CMAKE_REQUIRED_DEFINITIONS) diff -Nru mariadb-10.11.6/cmake/wsrep.cmake mariadb-10.11.9/cmake/wsrep.cmake --- mariadb-10.11.6/cmake/wsrep.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/wsrep.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -17,7 +17,9 @@ # # Galera library does not compile with windows # -IF (NOT WITHOUT_SERVER) +IF(WITHOUT_SERVER) + OPTION(WITH_WSREP "Galera server compatibility in build client utilities" ON) +ELSE() IF(UNIX) SET(with_wsrep_default ON) ELSE() @@ -67,4 +69,4 @@ IF (NOT WIN32) ADD_FEATURE_INFO(WSREP WITH_WSREP "WSREP replication API (to use, e.g. Galera Replication library)") ENDIF() -ENDIF(NOT WITHOUT_SERVER) +ENDIF(WITHOUT_SERVER) diff -Nru mariadb-10.11.6/cmake/zlib.cmake mariadb-10.11.9/cmake/zlib.cmake --- mariadb-10.11.6/cmake/zlib.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/cmake/zlib.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -14,9 +14,12 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA MACRO (MYSQL_USE_BUNDLED_ZLIB) - SET(ZLIB_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/zlib ${CMAKE_BINARY_DIR}/zlib) + SET(ZLIB_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/zlib ${CMAKE_BINARY_DIR}/zlib) SET(BUILD_BUNDLED_ZLIB 1) - SET(ZLIB_LIBRARY zlib CACHE INTERNAL "Bundled zlib library") + SET(ZLIB_LIBRARIES zlib CACHE INTERNAL "Bundled zlib library") + # temporarily define ZLIB_LIBRARY and ZLIB_INCLUDE_DIR for libmariadb + SET(ZLIB_LIBRARY ${ZLIB_LIBRARIES}) + SET(ZLIB_INCLUDE_DIR ${ZLIB_INCLUDE_DIRS}) SET(ZLIB_FOUND TRUE) SET(WITH_ZLIB "bundled" CACHE STRING "Use bundled zlib") ADD_SUBDIRECTORY(zlib) @@ -29,7 +32,7 @@ # If this is set,we use bundled zlib # If this is not set,search for system zlib. # if system zlib is not found, use bundled copy -# ZLIB_LIBRARIES, ZLIB_INCLUDE_DIR and ZLIB_SOURCES +# ZLIB_LIBRARIES, ZLIB_INCLUDE_DIRS # are set after this macro has run MACRO (MYSQL_CHECK_ZLIB_WITH_COMPRESS) @@ -37,10 +40,14 @@ IF(WITH_ZLIB STREQUAL "bundled") MYSQL_USE_BUNDLED_ZLIB() ELSE() - INCLUDE(FindZLIB) + FIND_PACKAGE(PkgConfig QUIET) + IF(PKG_CONFIG_FOUND AND (COMMAND PKG_GET_VARIABLE) AND (NOT WIN32)) + PKG_GET_VARIABLE(ZLIB_ROOT zlib prefix) + ENDIF() + FIND_PACKAGE(ZLIB) IF(ZLIB_FOUND) INCLUDE(CheckFunctionExists) - SET(CMAKE_REQUIRED_LIBRARIES z) + SET(CMAKE_REQUIRED_LIBRARIES ${ZLIB_LIBRARIES}) CHECK_FUNCTION_EXISTS(crc32 HAVE_CRC32) CHECK_FUNCTION_EXISTS(compressBound HAVE_COMPRESSBOUND) CHECK_FUNCTION_EXISTS(deflateBound HAVE_DEFLATEBOUND) @@ -48,7 +55,6 @@ IF(HAVE_CRC32 AND HAVE_COMPRESSBOUND AND HAVE_DEFLATEBOUND) SET(WITH_ZLIB "system" CACHE STRING "Which zlib to use (possible values are 'bundled' or 'system')") - SET(ZLIB_SOURCES "") ELSE() SET(ZLIB_FOUND FALSE CACHE INTERNAL "Zlib found but not usable") MESSAGE(STATUS "system zlib found but not usable") diff -Nru mariadb-10.11.6/config.h.cmake mariadb-10.11.9/config.h.cmake --- mariadb-10.11.6/config.h.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/config.h.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -72,6 +72,7 @@ #cmakedefine HAVE_SYS_IOCTL_H 1 #cmakedefine HAVE_SYS_MALLOC_H 1 #cmakedefine HAVE_SYS_MMAN_H 1 +#cmakedefine HAVE_SYS_MNTENT_H 1 #cmakedefine HAVE_SYS_NDIR_H 1 #cmakedefine HAVE_SYS_PTE_H 1 #cmakedefine HAVE_SYS_PTEM_H 1 @@ -232,7 +233,6 @@ #cmakedefine HAVE_STRTOUL 1 #cmakedefine HAVE_STRTOULL 1 #cmakedefine HAVE_TELL 1 -#cmakedefine HAVE_THR_SETCONCURRENCY 1 #cmakedefine HAVE_THR_YIELD 1 #cmakedefine HAVE_TIME 1 #cmakedefine HAVE_TIMES 1 @@ -499,6 +499,7 @@ #cmakedefine HAVE_COMPRESS 1 #cmakedefine HAVE_EncryptAes128Ctr 1 #cmakedefine HAVE_EncryptAes128Gcm 1 +#cmakedefine HAVE_des 1 /* Stuff that always need to be defined (compile breaks without it) diff -Nru mariadb-10.11.6/configure.cmake mariadb-10.11.9/configure.cmake --- mariadb-10.11.6/configure.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/configure.cmake 2024-08-03 07:29:56.000000000 +0000 @@ -60,15 +60,6 @@ ENDIF() ENDIF() -# workaround for old gcc on x86, gcc atomic ops only work under -march=i686 -IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND - CMAKE_C_COMPILER_VERSION VERSION_LESS "4.4.0") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=i686") - # query_response_time.cc causes "error: unable to find a register to spill" - SET(PLUGIN_QUERY_RESPONSE_TIME NO CACHE BOOL "Disabled, gcc is too old") -ENDIF() - # use runtime atomic-support detection in aarch64 IF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") MY_CHECK_AND_SET_COMPILER_FLAG("-moutline-atomics") @@ -418,12 +409,15 @@ CHECK_FUNCTION_EXISTS (strtoull HAVE_STRTOULL) CHECK_FUNCTION_EXISTS (strcasecmp HAVE_STRCASECMP) CHECK_FUNCTION_EXISTS (tell HAVE_TELL) -CHECK_FUNCTION_EXISTS (thr_setconcurrency HAVE_THR_SETCONCURRENCY) CHECK_FUNCTION_EXISTS (thr_yield HAVE_THR_YIELD) CHECK_FUNCTION_EXISTS (vasprintf HAVE_VASPRINTF) CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF) CHECK_FUNCTION_EXISTS (nl_langinfo HAVE_NL_LANGINFO) +IF(NOT HAVE_PTHREAD_RWLOCK_RDLOCK AND NOT HAVE_RWLOCK_INIT AND NOT WIN32) + MESSAGE(FATAL_ERROR "No usable rwlock implementation found") +ENDIF() + IF(HAVE_SYS_EVENT_H) CHECK_FUNCTION_EXISTS (kqueue HAVE_KQUEUE) ENDIF() @@ -985,3 +979,8 @@ ) SET(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS}) ENDIF() + +IF(CMAKE_C_COMPILER_ID MATCHES "Intel") + MY_CHECK_AND_SET_COMPILER_FLAG("-no-ansi-alias") + MY_CHECK_AND_SET_COMPILER_FLAG("-fp-model precise") +ENDIF() diff -Nru mariadb-10.11.6/debian/changelog mariadb-10.11.9/debian/changelog --- mariadb-10.11.6/debian/changelog 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/changelog 2024-09-02 23:55:56.000000000 +0000 @@ -1,3 +1,26 @@ +mariadb (1:10.11.9-0+deb12u1) bookworm; urgency=medium + + * New upstream version 10.11.9. Includes fixes for several severe regressions + as noted at https://mariadb.com/kb/en/mariadb-10-11-9-release-notes/ + * This release includes upstream version 10.11.8, with fixes for regressions + as noted at https://mariadb.com/kb/en/mariadb-10-11-8-release-notes/ as well + as security issue: + - CVE-2024-21096 + * Drop multiple patches dropped upstream, including PR#2541. + * Remove libmariadb file no longer present in MariaDB Connector C v3.3 + * Update client program 'mariadb' trace to match new libmariadb v3.3 + * Update server trace to include new parameters and values from 10.11.7 and .8 + * Note that upstream dropped support for pmem as Red Hat does not support it, + but we continue to use it in Debian Bookworm + * Also note upstream updated the MariaDB Connector C library (libmariadb) + from v3.2 to 3.3 in this stable maintenance release, but it does not cause + any issues as the soname and list of public symbols continues to be exactly + same as before + * Update gdb.conf to be aligned with other branches and easier to maintain + * Add NEWS item to explain new `mariadb-dump` option `--sandbox` + + -- Otto Kekäläinen Mon, 02 Sep 2024 16:55:56 -0700 + mariadb (1:10.11.6-0+deb12u1) bookworm; urgency=medium * New upstream version 10.11.6. Includes fixes for several severe regressions diff -Nru mariadb-10.11.6/debian/gbp.conf mariadb-10.11.9/debian/gbp.conf --- mariadb-10.11.6/debian/gbp.conf 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/gbp.conf 2024-09-02 23:55:56.000000000 +0000 @@ -3,14 +3,20 @@ # for contributors to work with feature and bugfix branches ignore-branch = True +# Always use pristine tar +pristine-tar = True + # Always sign everything sign-tags = True upstream-signatures = on # DEP-14 format debian-branch = debian/bookworm -upstream-branch = 10.11 -upstream-tag = mariadb-%(version)s +upstream-branch = upstream/10.11 +upstream-tag = upstream/%(version)s + +# Upstream tag format +upstream-vcs-tag = mariadb-%(version)s # MariaDB has submodules submodules = True diff -Nru mariadb-10.11.6/debian/libmariadb-dev.install mariadb-10.11.9/debian/libmariadb-dev.install --- mariadb-10.11.6/debian/libmariadb-dev.install 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/libmariadb-dev.install 2024-09-02 23:55:56.000000000 +0000 @@ -19,7 +19,6 @@ usr/include/mariadb/mysql/ usr/include/mariadb/mysql/client_plugin.h usr/include/mariadb/mysql/plugin_auth.h -usr/include/mariadb/mysql/plugin_auth_common.h usr/include/mariadb/mysql_com.h usr/include/mariadb/mysql_version.h usr/include/mariadb/mysqld_error.h diff -Nru mariadb-10.11.6/debian/mariadb-client.NEWS mariadb-10.11.9/debian/mariadb-client.NEWS --- mariadb-10.11.6/debian/mariadb-client.NEWS 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/debian/mariadb-client.NEWS 2024-09-02 23:55:56.000000000 +0000 @@ -0,0 +1,42 @@ +mariadb (1:10.11.9-0+deb12u1) bookworm; urgency=medium + + Fixes related to CVE-2024-21096 may break forwards and backwards + compatibility on in certain situations when doing logical backup and restore + with plain SQL files (e.g. when using `mariadb-dump` or `mysqldump`). + + The MariaDB client now has the command-line option `--sandbox` and the + MariaDB client database prompt command `\-`. This enables sandbox mode for + the rest of the session, until disconnected. Once in sandbox mode, any + command that could do something on the shell is disabled. + + Additionally `mariadb-dump` now adds the following command inside a comment + at the very top of the logical SQL file to trigger sandbox mode: + + /*M!999999\- enable the sandbox mode */ + + Newer version of MariaDB clients strip away the backslash and dash (\-), and + then tries to execute the internal command with a dash. + + Older versions of MariaDB client and all versions of MySQL client considers + this a comment, and will ignore it. There may however be situations where + importing logical SQL dump files may fail due to this, so users should be + advised. + + Users are best protected from both security issues and interoperability + issues by using the latest `mariadb-dump` shipped in MariaDB 11.4.3, 10.11.9, + 10.6.19 and 10.5.26. The CVE-2024-21096 was officially fixed already in + 11.4.2, but the latest batch of MariaDB minor maintenance releases include + further improvements on the sandbox mode. + + Note that the `mariadb-dump` can be used to make the logical backups from + both MariaDB and MySQL servers. Also the `mariadb` client program can connect + to both MariaDB and MySQL servers and import those SQL dump files. + + Further details about what kind of security issues injecting shell commands + into a logical SQL dump may pose and how to protect against them can be found + in: + + * https://jfg-mysql.blogspot.com/2024/06/trusting-mysqldump-and-insecure-client-lead-to-remote-code-execution.html + * https://mariadb.org/mariadb-dump-file-compatibility-change/ + + -- Otto Kekäläinen Tue, 06 Aug 2024 22:11:24 +0000 diff -Nru mariadb-10.11.6/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch mariadb-10.11.9/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch --- mariadb-10.11.6/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/patches/2129-new-script-wsrep-sst-backup-fixes.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -Forwarded: https://github.com/MariaDB/server/pull/2129 -Origin: https://patch-diff.githubusercontent.com/raw/MariaDB/server/pull/2129.patch -From: Otto Kekäläinen -Date: Sun, 22 May 2022 10:13:33 -0700 -Subject: [PATCH] Properly introduce wsrep_sst_backup script in project - packaging - -The script wsrep_sst_backup was introduced on MariaDB 10.3 in commit -9b2fa2a. The new script was automatically included in RPM packages but not -in Debian packages (which started to fail on waring about stray file). - -Include wsrep_sst_backup in the mariadb-server-10.{3..8} package, and -also include a stub man page so that packaging of a new script is complete. - ---- - debian/mariadb-server-10.6.install | 2 ++ - man/CMakeLists.txt | 2 +- - man/wsrep_sst_backup.1 | 16 ++++++++++++++++ - 3 files changed, 19 insertions(+), 1 deletion(-) - create mode 100644 man/wsrep_sst_backup.1 - ---- a/man/CMakeLists.txt -+++ b/man/CMakeLists.txt -@@ -13,7 +13,7 @@ - # along with this program; if not, write to the Free Software - # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA - --SET(MAN1_WSREP wsrep_sst_rsync.1 wsrep_sst_common.1 wsrep_sst_mariabackup.1 -+SET(MAN1_WSREP wsrep_sst_rsync.1 wsrep_sst_common.1 wsrep_sst_mariabackup.1 wsrep_sst_backup.1 - wsrep_sst_mysqldump.1 wsrep_sst_rsync_wan.1 galera_recovery.1 galera_new_cluster.1) - SET(MAN1_SERVER innochecksum.1 myisam_ftdump.1 myisamchk.1 - aria_chk.1 aria_dump_log.1 aria_ftdump.1 aria_pack.1 aria_read_log.1 ---- /dev/null -+++ b/man/wsrep_sst_backup.1 -@@ -0,0 +1,16 @@ -+'\" t -+.\" -+.TH "\FBWSREP_SST_BACKUP\FR" "1" "22 May 2022" "MariaDB 10\&.3" "MariaDB Database System" -+.\" ----------------------------------------------------------------- -+.\" * set default formatting -+.\" ----------------------------------------------------------------- -+.\" disable hyphenation -+.nh -+.\" disable justification (adjust text to left margin only) -+.ad l -+.SH NAME -+wsrep_sst_backup \- backup helper script for the MariaDB Galera Cluster -+.SH DESCRIPTION -+Use: See source code of script\. -+.PP -+For more information, please refer to the MariaDB Knowledge Base, available online at https://mariadb.com/kb/ diff -Nru mariadb-10.11.6/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch mariadb-10.11.9/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch --- mariadb-10.11.6/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/patches/2541-fix-stack-overflow-in-pinbox-allocator.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,283 +0,0 @@ -Forwarded: https://github.com/MariaDB/server/pull/2541 -Origin: https://patch-diff.githubusercontent.com/raw/MariaDB/server/pull/2541.patch -From: Hugo Wen -Date: Sat, 11 Mar 2023 00:27:42 +0000 -Subject: [PATCH] Fix a stack overflow in pinbox allocator - -MariaDB supports a "wait-free concurrent allocator based on pinning addresses". -In `lf_pinbox_real_free()` it tries to sort the pinned addresses for better -performance to use binary search during "real free". `alloca()` was used to -allocate stack memory and copy addresses. - -To prevent a stack overflow when allocating the stack memory the function checks -if there's enough stack space. However, the available stack size was calculated -inaccurately which eventually caused database crash due to stack overflow. - -The crash was seen on MariaDB 10.6.11 but the same code defect exists on all -MariaDB versions. - -A similar issue happened previously and the fix in fc2c1e43 was to add a -`ALLOCA_SAFETY_MARGIN` which is 8192 bytes. However, that safety margin is not -enough during high connection workloads. - -MySQL also had a similar issue and the fix -https://github.com/mysql/mysql-server/commit/b086fda was to remove the use of -`alloca` and replace qsort approach by a linear scan through all pointers (pins) -owned by each thread. - -This commit is mostly the same as it is the only way to solve this issue as: -1. Frame sizes in different architecture can be different. -2. Number of active (non-null) pinned addresses varies, so the frame - size for the recursive sorting function `msort_with_tmp` is also hard - to predict. -3. Allocating big memory blocks in stack doesn't seem to be a very good - practice. - -For further details see the mentioned commit in MySQL and the inline comments. - -All new code of the whole pull request, including one or several files -that are either new files or modified ones, are contributed under the -BSD-new license. I am contributing on behalf of my employer Amazon Web -Services, Inc. ---- - mysys/lf_alloc-pin.c | 180 ++++++++++++++----------------------------- - 1 file changed, 59 insertions(+), 121 deletions(-) - ---- a/mysys/lf_alloc-pin.c -+++ b/mysys/lf_alloc-pin.c -@@ -103,12 +103,6 @@ - #include - #include "my_cpu.h" - --/* -- when using alloca() leave at least that many bytes of the stack - -- for functions we might be calling from within this stack frame --*/ --#define ALLOCA_SAFETY_MARGIN 8192 -- - #define LF_PINBOX_MAX_PINS 65536 - - static void lf_pinbox_real_free(LF_PINS *pins); -@@ -239,24 +233,21 @@ void lf_pinbox_put_pins(LF_PINS *pins) - } while (!my_atomic_cas32((int32 volatile*) &pinbox->pinstack_top_ver, - (int32*) &top_ver, - top_ver-pins->link+nr+LF_PINBOX_MAX_PINS)); -- return; - } - --static int ptr_cmp(void **a, void **b) -+/* -+ Get the next pointer in the purgatory list. -+ Note that next_node is not used to avoid the extra volatile. -+*/ -+#define pnext_node(P, X) (*((void **)(((char *)(X)) + (P)->free_ptr_offset))) -+ -+static inline void add_to_purgatory(LF_PINS *pins, void *addr) - { -- return *a < *b ? -1 : *a == *b ? 0 : 1; -+ pnext_node(pins->pinbox, addr)= pins->purgatory; -+ pins->purgatory= addr; -+ pins->purgatory_count++; - } - --#define add_to_purgatory(PINS, ADDR) \ -- do \ -- { \ -- my_atomic_storeptr_explicit( \ -- (void **)((char *)(ADDR)+(PINS)->pinbox->free_ptr_offset), \ -- (PINS)->purgatory, MY_MEMORY_ORDER_RELEASE); \ -- (PINS)->purgatory= (ADDR); \ -- (PINS)->purgatory_count++; \ -- } while (0) -- - /* - Free an object allocated via pinbox allocator - -@@ -274,138 +265,85 @@ void lf_pinbox_free(LF_PINS *pins, void - lf_pinbox_real_free(pins);); - } - --struct st_harvester { -- void **granary; -- int npins; -+struct st_match_and_save_arg { -+ LF_PINS *pins; -+ LF_PINBOX *pinbox; -+ void *old_purgatory; - }; - - /* -- callback forlf_dynarray_iterate: -- scan all pins of all threads and accumulate all pins -+ Callback for lf_dynarray_iterate: -+ Scan all pins of all threads, for each active (non-null) pin, -+ scan the current thread's purgatory. If present there, move it -+ to a new purgatory. At the end, the old purgatory will contain -+ pointers not pinned by any thread. - */ --static int harvest_pins(LF_PINS *el, struct st_harvester *hv) -+static int match_and_save(LF_PINS *el, struct st_match_and_save_arg *arg) - { - int i; -- LF_PINS *el_end= el+MY_MIN(hv->npins, LF_DYNARRAY_LEVEL_LENGTH); -+ LF_PINS *el_end= el + LF_DYNARRAY_LEVEL_LENGTH; - for (; el < el_end; el++) - { - for (i= 0; i < LF_PINBOX_PINS; i++) - { - void *p= el->pin[i]; - if (p) -- *hv->granary++= p; -+ { -+ void *cur= arg->old_purgatory; -+ void **list_prev= &arg->old_purgatory; -+ while (cur) -+ { -+ void *next= pnext_node(arg->pinbox, cur); -+ -+ if (p == cur) -+ { -+ /* pinned - keeping */ -+ add_to_purgatory(arg->pins, cur); -+ /* unlink from old purgatory */ -+ *list_prev= next; -+ } -+ else -+ list_prev= (void **)((char *)cur+arg->pinbox->free_ptr_offset); -+ cur= next; -+ } -+ if (!arg->old_purgatory) -+ return 1; -+ } - } - } -- /* -- hv->npins may become negative below, but it means that -- we're on the last dynarray page and harvest_pins() won't be -- called again. We don't bother to make hv->npins() correct -- (that is 0) in this case. -- */ -- hv->npins-= LF_DYNARRAY_LEVEL_LENGTH; - return 0; - } - - /* -- callback forlf_dynarray_iterate: -- scan all pins of all threads and see if addr is present there --*/ --static int match_pins(LF_PINS *el, void *addr) --{ -- int i; -- LF_PINS *el_end= el+LF_DYNARRAY_LEVEL_LENGTH; -- for (; el < el_end; el++) -- for (i= 0; i < LF_PINBOX_PINS; i++) -- if (el->pin[i] == addr) -- return 1; -- return 0; --} -- --#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset))) --#define anext_node(X) next_node(&allocator->pinbox, (X)) -- --/* - Scan the purgatory and free everything that can be freed - */ - static void lf_pinbox_real_free(LF_PINS *pins) - { -- int npins; -- void *list; -- void **addr= NULL; -- void *first= NULL, *last= NULL; -- struct st_my_thread_var *var= my_thread_var; -- void *stack_ends_here= var ? var->stack_ends_here : NULL; - LF_PINBOX *pinbox= pins->pinbox; - -- npins= pinbox->pins_in_array+1; -+ /* Store info about current purgatory. */ -+ struct st_match_and_save_arg arg = {pins, pinbox, pins->purgatory}; -+ /* Reset purgatory. */ -+ pins->purgatory= NULL; -+ pins->purgatory_count= 0; - --#ifdef HAVE_ALLOCA -- if (stack_ends_here != NULL) -- { -- int alloca_size= sizeof(void *)*LF_PINBOX_PINS*npins; -- /* create a sorted list of pinned addresses, to speed up searches */ -- if (available_stack_size(&pinbox, stack_ends_here) > -- alloca_size + ALLOCA_SAFETY_MARGIN) -- { -- struct st_harvester hv; -- addr= (void **) alloca(alloca_size); -- hv.granary= addr; -- hv.npins= npins; -- /* scan the dynarray and accumulate all pinned addresses */ -- lf_dynarray_iterate(&pinbox->pinarray, -- (lf_dynarray_func)harvest_pins, &hv); -- -- npins= (int)(hv.granary-addr); -- /* and sort them */ -- if (npins) -- qsort(addr, npins, sizeof(void *), (qsort_cmp)ptr_cmp); -- } -- } --#endif - -- list= pins->purgatory; -- pins->purgatory= 0; -- pins->purgatory_count= 0; -- while (list) -+ lf_dynarray_iterate(&pinbox->pinarray, -+ (lf_dynarray_func)match_and_save, &arg); -+ -+ if (arg.old_purgatory) - { -- void *cur= list; -- list= *(void **)((char *)cur+pinbox->free_ptr_offset); -- if (npins) -- { -- if (addr) /* use binary search */ -- { -- void **a, **b, **c; -- for (a= addr, b= addr+npins-1, c= a+(b-a)/2; (b-a) > 1; c= a+(b-a)/2) -- if (cur == *c) -- a= b= c; -- else if (cur > *c) -- a= c; -- else -- b= c; -- if (cur == *a || cur == *b) -- goto found; -- } -- else /* no alloca - no cookie. linear search here */ -- { -- if (lf_dynarray_iterate(&pinbox->pinarray, -- (lf_dynarray_func)match_pins, cur)) -- goto found; -- } -- } -- /* not pinned - freeing */ -- if (last) -- last= next_node(pinbox, last)= (uchar *)cur; -- else -- first= last= (uchar *)cur; -- continue; --found: -- /* pinned - keeping */ -- add_to_purgatory(pins, cur); -+ /* Some objects in the old purgatory were not pinned, free them. */ -+ void *last= arg.old_purgatory; -+ while (pnext_node(pinbox, last)) -+ last= pnext_node(pinbox, last); -+ pinbox->free_func(arg.old_purgatory, last, pinbox->free_func_arg); - } -- if (last) -- pinbox->free_func(first, last, pinbox->free_func_arg); - } - -+#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset))) -+#define anext_node(X) next_node(&allocator->pinbox, (X)) -+ - /* lock-free memory allocator for fixed-size objects */ - - /* diff -Nru mariadb-10.11.6/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch mariadb-10.11.9/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch --- mariadb-10.11.6/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/patches/mroonga-mrn-lib-dirs-path-reproducible-build.patch 2024-09-02 23:55:56.000000000 +0000 @@ -9,7 +9,7 @@ We can use target without breaking reproducibility. --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt -@@ -209,7 +209,7 @@ set(MYSQL_INCLUDE_DIRS +@@ -214,7 +214,7 @@ set(MYSQL_INCLUDE_DIRS if(MRN_BUNDLED) set(MYSQL_PLUGIN_DIR "${INSTALL_PLUGINDIR}") @@ -18,7 +18,7 @@ set(MYSQL_CFLAGS "${CMAKE_C_FLAGS}") set(MYSQL_VERSION "${MYSQL_BASE_VERSION}") else() -@@ -248,15 +248,11 @@ endif() +@@ -253,15 +253,11 @@ endif() if(MRN_GROONGA_BUNDLED) set(GROONGA_INCLUDE_DIRS "${MRN_BUNDLED_GROONGA_DIR}/include") diff -Nru mariadb-10.11.6/debian/patches/series mariadb-10.11.9/debian/patches/series --- mariadb-10.11.6/debian/patches/series 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/patches/series 2024-09-02 23:55:56.000000000 +0000 @@ -4,5 +4,3 @@ fix-spelling-rocksdb.patch fix-reproducible-builds-rocksdb.patch mroonga-mrn-lib-dirs-path-reproducible-build.patch -2129-new-script-wsrep-sst-backup-fixes.patch -2541-fix-stack-overflow-in-pinbox-allocator.patch diff -Nru mariadb-10.11.6/debian/salsa-ci.yml mariadb-10.11.9/debian/salsa-ci.yml --- mariadb-10.11.6/debian/salsa-ci.yml 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/salsa-ci.yml 2024-09-02 23:55:56.000000000 +0000 @@ -127,14 +127,14 @@ # Readline was removed from Debian Sid (and Bullseye) in Feb 2021. To be able to install older # versions of MariaDB that depend on it, fetch and install it from Buster. .test-install-readline-in-sid-for-backwards-compat: &test-install-readline-in-sid-for-backwards-compat | - curl -sS -O https://snapshot.debian.org/archive/debian/20190316T031117Z/pool/main/r/readline5/libreadline5_5.2%2Bdfsg-3%2Bb13_amd64.deb + curl -sL -O https://snapshot.debian.org/archive/debian/20190316T031117Z/pool/main/r/readline5/libreadline5_5.2%2Bdfsg-3%2Bb13_amd64.deb apt-get -qq install --no-install-recommends --yes ./libreadline5_5.2%2Bdfsg-3%2Bb13_amd64.deb # OpenSSL 1.1 was Debian Sid in Dec 2022 (as Bookworm will ship with OpenSSL 3.0 # only). To be able to install versions of MariaDB that depend on OpenSSL 1.1, # fetch and install it manually. .test-install-openssl1-in-sid-for-backwards-compat: &test-install-openssl1-in-sid-for-backwards-compat | - curl -sS -O https://snapshot.debian.org/archive/debian/20220507T034236Z/pool/main/o/openssl/libssl1.1_1.1.1o-1_amd64.deb + curl -sL -O https://snapshot.debian.org/archive/debian/20220507T034236Z/pool/main/o/openssl/libssl1.1_1.1.1o-1_amd64.deb apt-get -qq install --no-install-recommends --yes ./libssl1.1_1.1.1o-1_amd64.deb .test-verify-initial: &test-verify-initial | @@ -664,7 +664,7 @@ script: - *test-prepare-container - apt-get install --no-install-recommends --yes ca-certificates curl systemctl - - curl -sS "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x859be8d7c586f538430b19c2467b942d3a79bd29" -o /etc/apt/trusted.gpg.d/mysql.asc + - curl -sS "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xbca43417c3b485dd128ec6d4b7b3b788a8d3785c" -o /etc/apt/trusted.gpg.d/mysql.asc - echo "deb https://repo.mysql.com/apt/debian/ bullseye mysql-cluster-8.0" > /etc/apt/sources.list.d/mysql.list - apt-get update -qq - apt-get install -y mysql-cluster-community-server @@ -868,7 +868,7 @@ - *test-prepare-container - | apt-get install --no-install-recommends --yes gpg gpg-agent dirmngr ca-certificates # Bare minimal (<4MB) for apt-key to work - apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 467B942D3A79BD29 + apt-key adv --recv-keys --keyserver hkps://keyserver.ubuntu.com:443 B7B3B788A8D3785C echo "deb https://repo.mysql.com/apt/debian/ buster mysql-5.7" > /etc/apt/sources.list.d/mysql.list apt-get update -qq apt-get install -y 'mysql*' 'libmysqlc*' diff -Nru mariadb-10.11.6/debian/source/lintian-overrides mariadb-10.11.9/debian/source/lintian-overrides --- mariadb-10.11.6/debian/source/lintian-overrides 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/source/lintian-overrides 2024-09-02 23:55:56.000000000 +0000 @@ -84,3 +84,5 @@ source-contains-autogenerated-visual-c++-file [storage/columnstore/columnstore/*.rc] source-contains-autogenerated-visual-c++-file [win/upgrade_wizard/resource.h] source-contains-autogenerated-visual-c++-file [win/upgrade_wizard/upgrade.rc] +# For unknown reason Lintian v2.116.3 in Bookworm errors on valid changelog entry +bad-distribution-in-changes-file bookworm diff -Nru mariadb-10.11.6/debian/tests/configuration-tracing mariadb-10.11.9/debian/tests/configuration-tracing --- mariadb-10.11.6/debian/tests/configuration-tracing 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/tests/configuration-tracing 2024-09-02 23:55:56.000000000 +0000 @@ -78,6 +78,9 @@ # ppc64el has larger default value: 393216 normalize_value log-tc-size 24576 + # feedback plugin submitter identified + normalize_value server-uid 1234567890abcdefghijklmnopq= + mv "$TEMPFILE" "$TRACE_NAME.actual" fi diff -Nru mariadb-10.11.6/debian/tests/traces/mariadb-verbose-help.expected mariadb-10.11.9/debian/tests/traces/mariadb-verbose-help.expected --- mariadb-10.11.6/debian/tests/traces/mariadb-verbose-help.expected 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/tests/traces/mariadb-verbose-help.expected 2024-09-02 23:55:56.000000000 +0000 @@ -19,8 +19,7 @@ Abort 'source filename' operations in case of errors --auto-rehash Enable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup - and reconnecting may take a longer time. Disable with - --disable-auto-rehash. + and reconnecting may take a longer time. (Defaults to on; use --skip-auto-rehash to disable.) -A, --no-auto-rehash No automatic rehashing. One has to use 'rehash' to get @@ -32,27 +31,61 @@ -B, --batch Don't use history file. Disable interactive behavior. (Enables --silent.) --binary-as-hex Print binary data as hex + --binary-mode Binary mode allows certain character sequences to be + processed as data that would otherwise be treated with a + special meaning by the parser. Specifically, this switch + turns off parsing of all client commands except \C and + DELIMITER in non-interactive mode (i.e., when binary mode + is combined with either 1) piped input, 2) the --batch + mysql option, or 3) the 'source' command). Also, in + binary mode, occurrences of '\r\n' and ASCII '\0' are + preserved within strings, whereas by default, '\r\n' is + translated to '\n' and '\0' is disallowed in user input. --character-sets-dir=name Directory for character set files. + --column-names Write column names in results. + (Defaults to on; use --skip-column-names to disable.) + -N, --skip-column-names + Don't write column names in results. --column-type-info Display column type information. -c, --comments Preserve comments. Send comments to the server. The default is --skip-comments (discard comments), enable with --comments. -C, --compress Use compression in server/client protocol. + --connect-expired-password + Notify the server that this client is prepared to handle + expired password sandbox mode even if --batch was + specified. + --connect-timeout=# Number of seconds before connection timeout. + -D, --database=name Database to use. -#, --debug[=#] This is a non-debug version. Catch this and exit. --debug-check Check memory and open file usage at exit. -T, --debug-info Print some debug info at exit. - -D, --database=name Database to use. + --default-auth=name Default authentication client-side plugin to use. --default-character-set=name Set the default character set. --delimiter=name Delimiter to be used. - -e, --execute=name Execute command and quit. (Disables --force and history - file.) --enable-cleartext-plugin Obsolete option. Exists only for MySQL compatibility. - -E, --vertical Print the output of a query (rows) vertically. + -e, --execute=name Execute command and quit. (Disables --force and history + file.) -f, --force Continue even if we get an SQL error. Sets abort-source-on-error to 0 + -h, --host=name Connect to host. + -H, --html Produce HTML output. + -i, --ignore-spaces Ignore space after function names. + --init-command=name SQL Command to execute when connecting to MariaDB server. + Will automatically be re-executed when reconnecting. + --line-numbers Write line numbers for errors. + (Defaults to on; use --skip-line-numbers to disable.) + -L, --skip-line-numbers + Don't write line number for errors. + --local-infile Enable LOAD DATA LOCAL INFILE. + --max-allowed-packet=# + The maximum packet length to send to or receive from + server. + --max-join-size=# Automatic limit for rows in a join when using + --safe-updates. -G, --named-commands Enable named commands. Named commands mean this program's internal commands; see mysql> help . When enabled, the @@ -60,24 +93,9 @@ otherwise only from the first line, before an enter. Disable with --disable-named-commands. This option is disabled by default. - -i, --ignore-spaces Ignore space after function names. - --init-command=name SQL Command to execute when connecting to MariaDB server. - Will automatically be re-executed when reconnecting. - --local-infile Enable/disable LOAD DATA LOCAL INFILE. + --net-buffer-length=# + The buffer size for TCP/IP and socket communication. -b, --no-beep Turn off beep on error. - -h, --host=name Connect to host. - -H, --html Produce HTML output. - -X, --xml Produce XML output. - --line-numbers Write line numbers for errors. - (Defaults to on; use --skip-line-numbers to disable.) - -L, --skip-line-numbers - Don't write line number for errors. - -n, --unbuffered Flush buffer after each query. - --column-names Write column names in results. - (Defaults to on; use --skip-column-names to disable.) - -N, --skip-column-names - Don't write column names in results. - --sigint-ignore Ignore SIGINT (CTRL-C). -o, --one-database Ignore statements except those that occur while the default database is the one named at the command line. --pager[=name] Pager to use to display results. If you don't supply an @@ -89,9 +107,15 @@ -p, --password[=name] Password to use when connecting to server. If password is not given it's asked from the tty. + --plugin-dir=name Directory for client-side plugins. -P, --port=# Port number to use for connection or 0 for default to, in order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default (3306). + --print-query-on-error + Print the query if there was an error. Is only enabled in + --batch mode if verbose is not set (as then the query + would be printed anyway) + (Defaults to on; use --skip-print-query-on-error to disable.) --progress-reports Get progress reports for long running commands (like ALTER TABLE) (Defaults to on; use --skip-progress-reports to disable.) @@ -101,9 +125,18 @@ down the server if the output is suspended. Doesn't use history file. -r, --raw Write fields without conversion. Used with --batch. - --reconnect Reconnect if the connection is lost. Disable with - --disable-reconnect. This option is enabled by default. + --reconnect Reconnect if the connection is lost. (Defaults to on; use --skip-reconnect to disable.) + -U, --safe-updates Only allow UPDATE and DELETE that uses keys. + -U, --i-am-a-dummy Synonym for option --safe-updates, -U. + --sandbox Disallow commands that access the file system (except \P + without an argument and \e). + --secure-auth Refuse client connecting to server if it uses old + (pre-4.1.1) protocol. + --select-limit=# Automatic limit for SELECT when using --safe-updates. + --server-arg=name Send embedded server this as a parameter. + --show-warnings Show warnings after every statement. + --sigint-ignore Ignore SIGINT (CTRL-C). -s, --silent Be more silent. Print results with a tab as separator, each row on new line. -S, --socket=name The socket file to use for connection. @@ -127,41 +160,13 @@ --tee=name Append everything into outfile. See interactive help (\h) also. Does not work in batch mode. Disable with --disable-tee. This option is disabled by default. + -n, --unbuffered Flush buffer after each query. -u, --user=name User for login if not current user. - -U, --safe-updates Only allow UPDATE and DELETE that uses keys. - -U, --i-am-a-dummy Synonym for option --safe-updates, -U. -v, --verbose Write more. (-v -v -v gives the table output format). -V, --version Output version information and exit. + -E, --vertical Print the output of a query (rows) vertically. -w, --wait Wait and retry if connection is down. - --connect-timeout=# Number of seconds before connection timeout. - --max-allowed-packet=# - The maximum packet length to send to or receive from - server. - --net-buffer-length=# - The buffer size for TCP/IP and socket communication. - --select-limit=# Automatic limit for SELECT when using --safe-updates. - --max-join-size=# Automatic limit for rows in a join when using - --safe-updates. - --secure-auth Refuse client connecting to server if it uses old - (pre-4.1.1) protocol. - --server-arg=name Send embedded server this as a parameter. - --show-warnings Show warnings after every statement. - --plugin-dir=name Directory for client-side plugins. - --default-auth=name Default authentication client-side plugin to use. - --binary-mode Binary mode allows certain character sequences to be - processed as data that would otherwise be treated with a - special meaning by the parser. Specifically, this switch - turns off parsing of all client commands except \C and - DELIMITER in non-interactive mode (i.e., when binary mode - is combined with either 1) piped input, 2) the --batch - mysql option, or 3) the 'source' command). Also, in - binary mode, occurrences of '\r\n' and ASCII '\0' are - preserved within strings, whereas by default, '\r\n' is - translated to '\n' and '\0' is disallowed in user input. - --connect-expired-password - Notify the server that this client is prepared to handle - expired password sandbox mode even if --batch was - specified. + -X, --xml Produce XML output. Variables (--variable-name=value) and boolean options {FALSE|TRUE} Value (after reading options) @@ -170,36 +175,48 @@ auto-rehash TRUE auto-vertical-output FALSE binary-as-hex FALSE +binary-mode FALSE character-sets-dir (No default value) +column-names TRUE column-type-info FALSE comments FALSE compress FALSE +connect-expired-password FALSE +connect-timeout 0 +database (No default value) debug-check FALSE debug-info FALSE -database (No default value) +default-auth (No default value) default-character-set auto delimiter ; -vertical FALSE force FALSE -named-commands FALSE +host (No default value) +html FALSE ignore-spaces FALSE init-command (No default value) +line-numbers TRUE local-infile FALSE +max-allowed-packet 16777216 +max-join-size 1000000 +named-commands FALSE +net-buffer-length 16384 no-beep FALSE -host (No default value) -html FALSE -xml FALSE -line-numbers TRUE -unbuffered FALSE -column-names TRUE -sigint-ignore FALSE +plugin-dir (No default value) port 0 +print-query-on-error TRUE progress-reports TRUE prompt \N [\d]> protocol quick FALSE raw FALSE reconnect TRUE +safe-updates FALSE +i-am-a-dummy FALSE +sandbox FALSE +secure-auth FALSE +select-limit 1000 +show-warnings FALSE +sigint-ignore FALSE socket /run/mysqld/mysqld.sock ssl TRUE ssl-ca (No default value) @@ -212,17 +229,7 @@ tls-version (No default value) ssl-verify-server-cert FALSE table FALSE +unbuffered FALSE user (No default value) -safe-updates FALSE -i-am-a-dummy FALSE -connect-timeout 0 -max-allowed-packet 16777216 -net-buffer-length 16384 -select-limit 1000 -max-join-size 1000000 -secure-auth FALSE -show-warnings FALSE -plugin-dir (No default value) -default-auth (No default value) -binary-mode FALSE -connect-expired-password FALSE +vertical FALSE +xml FALSE diff -Nru mariadb-10.11.6/debian/tests/traces/mariadbd-verbose-help.expected mariadb-10.11.9/debian/tests/traces/mariadbd-verbose-help.expected --- mariadb-10.11.6/debian/tests/traces/mariadbd-verbose-help.expected 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/tests/traces/mariadbd-verbose-help.expected 2024-09-02 23:55:56.000000000 +0000 @@ -548,6 +548,9 @@ --innodb-adaptive-hash-index-parts[=#] Number of InnoDB Adaptive Hash Index Partitions (default 8) + --innodb-alter-copy-bulk + Allow bulk insert operation for copy alter operation + (Defaults to on; use --skip-innodb-alter-copy-bulk to disable.) --innodb-autoextend-increment=# Data file autoextend increment in megabytes --innodb-autoinc-lock-mode=# @@ -886,6 +889,12 @@ Redo log size in bytes. --innodb-log-group-home-dir=name Path to ib_logfile0 + --innodb-log-spin-wait-delay[=#] + Delay between log buffer spin lock polls (0 to use a + blocking latch) + --innodb-log-write-ahead-size=# + Redo log write size to avoid read-on-write; must be a + power of two --innodb-lru-flush-size=# How many pages to flush on LRU eviction --innodb-lru-scan-depth=# @@ -964,6 +973,8 @@ --innodb-rollback-on-timeout Roll back the complete transaction on lock wait timeout, for 4.x compatibility (disabled by default) + --innodb-snapshot-isolation + Use snapshot isolation (write-write conflict detection). --innodb-sort-buffer-size=# Memory buffer size for index creation --innodb-spin-wait-delay[=#] @@ -1255,9 +1266,8 @@ when binary log is disabled). --log-tc-size=# Size of transaction coordinator log. -W, --log-warnings[=#] - Log some not critical warnings to the general log - file.Value can be between 0 and 11. Higher values mean - more verbosity + Log some non critical warnings to the error log.Value can + be between 0 and 11. Higher values mean more verbosity --long-query-time=# Alias for log_slow_query_time. Log all queries that have taken more than long_query_time seconds to execute to the slow query log file. The argument will be treated as a @@ -1411,7 +1421,8 @@ MySQL versions. Any combination of: NO_DUP_KEY_WARNINGS_WITH_IGNORE, NO_PROGRESS_INFO, ZERO_DATE_TIME_CAST, UTF8_IS_UTF8MB3, - IGNORE_INDEX_ONLY_FOR_JOIN, COMPAT_5_1_CHECKSUM + IGNORE_INDEX_ONLY_FOR_JOIN, COMPAT_5_1_CHECKSUM, + NO_NULL_COLLATION_IDS Use 'ALL' to set all combinations. --old-passwords Use old password encryption method (needed for 4.0 and older clients) @@ -1426,6 +1437,18 @@ max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors (Automatically configured unless set explicitly) + --optimizer-adjust-secondary-key-costs=name + A bit field with the following values: + adjust_secondary_key_cost = Update secondary key costs + for ranges to be at least 5x of clustered primary key + costs. disable_max_seek = Disable 'max_seek optimization' + for secondary keys and slight adjustment of filter cost. + disable_forced_index_in_group_by = Disable automatic + forced index in GROUP BY. fix_innodb_cardinality = + Disable doubling of the Cardinality for InnoDB secondary + keys. This variable will be deleted in MariaDB 11.0 as it + is not needed with the new 11.0 optimizer. + Use 'ALL' to set all combinations. --optimizer-extra-pruning-depth=# If the optimizer needs to enumerate join prefix of this size or larger, then it will try aggressively prune away @@ -1472,7 +1495,7 @@ extended_keys, exists_to_in, orderby_uses_equalities, condition_pushdown_for_derived, split_materialized, condition_pushdown_for_subquery, rowid_filter, - condition_pushdown_from_having, not_null_range_scan, + condition_pushdown_from_having, not_null_range_scan, hash_join_cardinality, cset_narrowing --optimizer-trace=name Controls tracing of the Optimizer: @@ -1861,7 +1884,7 @@ The tracing level for semi-sync replication. --rpl-semi-sync-master-wait-no-slave Wait until timeout when no semi-synchronous replication - slave available (enabled by default). + slave is available. (Defaults to on; use --skip-rpl-semi-sync-master-wait-no-slave to disable.) --rpl-semi-sync-master-wait-point=name Should transaction wait for semi-sync ack after having @@ -2560,6 +2583,7 @@ innodb-adaptive-flushing-lwm 10 innodb-adaptive-hash-index FALSE innodb-adaptive-hash-index-parts 8 +innodb-alter-copy-bulk TRUE innodb-autoextend-increment 64 innodb-autoinc-lock-mode 1 innodb-buf-dump-status-frequency 0 @@ -2651,6 +2675,8 @@ innodb-log-file-buffering FALSE innodb-log-file-size 100663296 innodb-log-group-home-dir (No default value) +innodb-log-spin-wait-delay 0 +innodb-log-write-ahead-size 512 innodb-lru-flush-size 32 innodb-lru-scan-depth 1536 innodb-max-dirty-pages-pct 90 @@ -2682,6 +2708,7 @@ innodb-read-only FALSE innodb-read-only-compressed FALSE innodb-rollback-on-timeout FALSE +innodb-snapshot-isolation FALSE innodb-sort-buffer-size 1048576 innodb-spin-wait-delay 4 innodb-stats-auto-recalc TRUE @@ -2822,6 +2849,7 @@ old-passwords FALSE old-style-user-limits FALSE open-files-limit 32000 +optimizer-adjust-secondary-key-costs optimizer-extra-pruning-depth 8 optimizer-max-sel-arg-weight 32000 optimizer-max-sel-args 16000 @@ -2944,6 +2972,7 @@ secure-timestamp NO sequence ON server-id 1 +server-uid 1234567890abcdefghijklmnopq= session-track-schema TRUE session-track-state-change FALSE session-track-system-variables autocommit,character_set_client,character_set_connection,character_set_results,time_zone @@ -2971,7 +3000,7 @@ slave-skip-errors OFF slave-sql-verify-checksum TRUE slave-transaction-retries 10 -slave-transaction-retry-errors 1158,1159,1160,1161,1205,1213,1429,2013,12701 +slave-transaction-retry-errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701 slave-transaction-retry-interval 0 slave-type-conversions slow-launch-time 2 diff -Nru mariadb-10.11.6/debian/watch mariadb-10.11.9/debian/watch --- mariadb-10.11.6/debian/watch 2023-11-30 04:42:37.000000000 +0000 +++ mariadb-10.11.9/debian/watch 2024-09-02 23:55:56.000000000 +0000 @@ -2,7 +2,7 @@ opts=\ pgpsigurlmangle=s/$/.asc/,\ uversionmangle=s/-(rc|beta)/$1/,pasv \ -https://archive.mariadb.org/mariadb-10.11.([\d\.]*(?:-beta|-rc)?)/source mariadb-([\d\.]*(?:-beta|-rc)?).tar.gz +https://archive.mariadb.org/mariadb-10.11.([\d\.]*(?:-beta|-rc)?)/source/ mariadb-([\d\.]*(?:-beta|-rc)?).tar.gz # String "-10.11." needs to be in path as MariaDB releases several series in # parallel (e.g 10.11, 10.4, 10.3 etc) and uscan should check for updates only diff -Nru mariadb-10.11.6/extra/CMakeLists.txt mariadb-10.11.9/extra/CMakeLists.txt --- mariadb-10.11.6/extra/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -13,7 +13,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA -INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${ZLIB_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${ZLIB_INCLUDE_DIRS}) # Default install component for the files is Server here SET(MYSQL_INSTALL_COMPONENT Server) diff -Nru mariadb-10.11.6/extra/mariabackup/CMakeLists.txt mariadb-10.11.9/extra/mariabackup/CMakeLists.txt --- mariadb-10.11.6/extra/mariabackup/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -31,12 +31,13 @@ INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql + ${CMAKE_SOURCE_DIR}/storage/maria ${CMAKE_CURRENT_SOURCE_DIR}/quicklz ${CMAKE_CURRENT_SOURCE_DIR} ) IF(NOT HAVE_SYSTEM_REGEX) - INCLUDE_DIRECTORIES(${PCRE_INCLUDES}) + INCLUDE_DIRECTORIES(${PCRE_INCLUDE_DIRS}) ADD_DEFINITIONS(${PCRE2_DEBIAN_HACK}) ENDIF() @@ -49,14 +50,9 @@ ADD_DEFINITIONS(-DPCRE_STATIC=1) ADD_DEFINITIONS(${SSL_DEFINES}) -IF(PMEM_FOUND) - ADD_COMPILE_FLAGS(xtrabackup.cc COMPILE_FLAGS "-DHAVE_PMEM") -ENDIF() - MYSQL_ADD_EXECUTABLE(mariadb-backup xtrabackup.cc innobackupex.cc - changed_page_bitmap.cc datasink.cc ds_buffer.cc ds_compress.cc @@ -72,8 +68,12 @@ xbstream_write.cc backup_mysql.cc backup_copy.cc - xb_plugin.cc + encryption_plugin.cc ${PROJECT_BINARY_DIR}/sql/sql_builtin.cc + aria_backup_client.cc + thread_pool.cc + ddl_log.cc + common_engine.cc ${PROJECT_SOURCE_DIR}/sql/net_serv.cc ${PROJECT_SOURCE_DIR}/libmysqld/libmysql.c COMPONENT backup @@ -82,7 +82,8 @@ # Export all symbols on Unix, for better crash callstacks SET_TARGET_PROPERTIES(mariadb-backup PROPERTIES ENABLE_EXPORTS TRUE) -TARGET_LINK_LIBRARIES(mariadb-backup sql sql_builtins) +TARGET_LINK_LIBRARIES(mariadb-backup sql sql_builtins aria) + IF(NOT HAVE_SYSTEM_REGEX) TARGET_LINK_LIBRARIES(mariadb-backup pcre2-posix) ENDIF() diff -Nru mariadb-10.11.6/extra/mariabackup/aria_backup_client.cc mariadb-10.11.9/extra/mariabackup/aria_backup_client.cc --- mariadb-10.11.6/extra/mariabackup/aria_backup_client.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/aria_backup_client.cc 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,1016 @@ +#include +#include +extern "C" { +#include "maria_def.h" +} +#undef LSN_MAX +#include "aria_backup_client.h" +#include "backup_copy.h" +#include "common.h" +#include "sql_table.h" +#include "ma_checkpoint.h" +#include "ma_recovery.h" +#include "backup_debug.h" +#include "aria_backup.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace aria { + +const char *log_preffix = "aria_log."; + + +static std::string log_file_name_only(size_t log_num) { + std::string log_file; + { + std::stringstream ss; + ss << std::setw(8) << std::setfill('0') << log_num; + log_file.append(log_preffix).append(ss.str()); + } + return log_file; +} + + +static std::string log_file_name(const char *datadir_path, size_t log_num) { + std::string log_file(datadir_path); + return log_file.append("/").append(log_file_name_only(log_num)); +} + + +class LogFileCollection +{ + uint32 m_first; + uint32 m_count; +public: + uint32 first() const { return m_first; } + uint32 count() const { return m_count; } + uint32 last() const + { + DBUG_ASSERT(m_count > 0); + return m_first + m_count - 1; + } + + // Initialize by checking existing log files on the disk + LogFileCollection(const char *datadir, uint32 max_log_no) + { + uint32 end= find_greatest_existing_log(datadir, max_log_no); + if (!end) + { + // No log files were found at all + m_first= 0; + m_count= 0; + } + else if (end == 1) + { + // Just the very first one log file (aria_log.00000001) was found. + m_first= 1; + m_count= 1; + } + else + { + // Multiple files were found + m_first= find_greatest_missing_log(datadir, end - 1) + 1; + m_count= 1 + end - m_first; + } + } + + /* + Skip all missing log files and find the greatest existing log file, or + Skip all existing log files and find the greatest missing log file. + + @param datadir - Search files in this directory + @param start - Start searching from this log number and go downto 1. + @param kind - true - search for an existing file + false - search for a missing file. + @returns - [1..start] - the greatest found log file + of the searched kind + - 0 - if no log files of this kind + were found in the range [1..start]. + */ + static uint32 find_greatest_existing_or_missing_log(const char *datadir, + uint32 start, + bool kind) + { + DBUG_ASSERT(start > 0); + for (uint32 i= start; i > 0; i--) + { + if (file_exists(log_file_name(datadir, i).c_str()) == kind) + return i; + } + return 0; // No log files of the searched kind were found + } + + static uint32 find_greatest_existing_log(const char *datadir, uint32 start) + { + return find_greatest_existing_or_missing_log(datadir, start, true); + } + + static uint32 find_greatest_missing_log(const char *datadir, uint32 start) + { + return find_greatest_existing_or_missing_log(datadir, start, false); + } + + /* + In some scenarios (e.g. log rotate) some new log files can appear + outside of the initially assumed [first,last] log number range. + This function adds all extra files behind "last". + */ + void find_logs_after_last(const char *datadir) + { + DBUG_ASSERT(m_count > 0); + for ( ; + file_exists(log_file_name(datadir, last() + 1).c_str()) ; + m_count++) + { } + } + + void report_found(unsigned thread_num) const + { + if (m_count) + msg(thread_num, + "Found %u aria log files, " + "minimum log number %u, " + "maximum log number %u", + m_count, m_first, last()); + } + + void die_if_missing(uint32 logno) const + { + DBUG_ASSERT(logno > 0); + if (!m_count || m_first > logno || last() < logno) + die("Aria log file %u does not exists.", logno); + } +}; + + +class Table { +public: + struct Partition { + std::string m_file_path; + File m_index_file = -1; + MY_STAT m_index_file_stat; + File m_data_file = -1; + MY_STAT m_data_file_stat; + }; + Table() = default; + Table (Table &&other) = delete; + Table & operator= (Table &&other) = delete; + Table(const Table &) = delete; + Table & operator= (const Table &) = delete; + ~Table(); + bool init(const char *data_file_path); + bool open(MYSQL *con, bool opt_no_lock, unsigned thread_num); + bool close(); + bool copy(ds_ctxt_t *ds, unsigned thread_num); + + bool is_online_backup_safe() const { + DBUG_ASSERT(is_opened()); + return m_cap.online_backup_safe; + } + bool is_stats() const { + return is_stats_table(m_db.c_str(), m_table.c_str()); + } + bool is_log() const { + return is_log_table(m_db.c_str(), m_table.c_str()); + } + bool is_opened() const { + return !m_partitions.empty() && + m_partitions[0].m_index_file >= 0 && m_partitions[0].m_data_file >= 0; + }; + std::string &get_full_name() { + return m_full_name; + } + std::string &get_db() { return m_db; } + std::string &get_table() { return m_table; } + std::string &get_version() { return m_table_version; } + bool is_partitioned() const { return m_partitioned; } + void add_partition(const Table &partition) { + DBUG_ASSERT(is_partitioned()); + m_partitions.push_back(partition.m_partitions[0]); + } +#ifndef DBUG_OFF + const std::string& get_sql_name() const { return m_sql_name; } +#endif //DBUG_OFF +private: + + bool copy(ds_ctxt_t *ds, bool is_index, unsigned thread_num); + // frm and par files will be copied under BLOCK_DDL stage in + // backup_copy_non_system() + bool copy_frm_and_par(ds_ctxt_t *ds, unsigned thread_num); + bool read_table_version_id(File file); + + std::string m_db; + std::string m_table; + std::string m_full_name; + std::string m_frm_par_path; + std::string m_table_version; +#ifndef DBUG_OFF + std::string m_sql_name; +#endif //DBUG_OFF + bool m_partitioned = false; + std::vector m_partitions; + ARIA_TABLE_CAPABILITIES m_cap; +}; + +Table::~Table() { + (void)close(); +} + +bool Table::init(const char *data_file_path) { + DBUG_ASSERT(data_file_path); + + const char *ext_pos = strrchr(data_file_path, '.'); + if (!ext_pos) + return false; + + char db_name_orig[FN_REFLEN]; + char table_name_orig[FN_REFLEN]; + parse_db_table_from_file_path( + data_file_path, db_name_orig, table_name_orig); + if (!db_name_orig[0] || !table_name_orig[0]) + return false; + char db_name_conv[FN_REFLEN]; + char table_name_conv[FN_REFLEN]; + filename_to_tablename(db_name_orig, db_name_conv, sizeof(db_name_conv)); + filename_to_tablename( + table_name_orig, table_name_conv, sizeof(table_name_conv)); + if (!db_name_conv[0] || !table_name_conv[0]) + return false; + + if (strstr(data_file_path, "#P#")) + m_partitioned = true; + + const char *table_name_begin = strrchr(data_file_path, FN_LIBCHAR); + if (!table_name_begin) + return false; + m_frm_par_path.assign(data_file_path, table_name_begin + 1). + append(table_name_orig); + + m_db.assign(db_name_conv); + m_table.assign(table_name_conv); + // TODO: find the correct way to represent quoted table/db names + m_full_name.assign("`").append(m_db).append("`.`"). + append(m_table).append("`"); +#ifndef DBUG_OFF + m_sql_name.assign(m_db).append("/").append(m_table); +#endif // DBUG_OFF + Partition partition; + partition.m_file_path.assign(data_file_path, ext_pos - data_file_path); + m_partitions.push_back(std::move(partition)); + return true; +} + +bool Table::read_table_version_id(File file) { + m_table_version = ::read_table_version_id(file); + return m_table_version.empty(); +} + +bool Table::open(MYSQL *con, bool opt_no_lock, unsigned thread_num) { + int error= 1; + bool have_capabilities = false; + File frm_file = -1; + + if (!opt_no_lock && !backup_lock(con, m_full_name.c_str())) { + msg(thread_num, "Error on BACKUP LOCK for aria table %s", + m_full_name.c_str()); + goto exit; + } + + for (Partition &partition : m_partitions) { + std::string file_path = partition.m_file_path + ".MAI"; + if ((partition.m_index_file= my_open(file_path.c_str(), + O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, + MYF(MY_WME))) < 0) { + msg(thread_num, "Error on aria table file open %s", file_path.c_str()); + goto exit; + } + if (!my_stat(file_path.c_str(), &partition.m_index_file_stat, MYF(0))) { + msg(thread_num, "Error on aria table file stat %s", file_path.c_str()); + goto exit; + } + if (!have_capabilities) { + if ((error= aria_get_capabilities(partition.m_index_file, &m_cap))) { + msg(thread_num, "aria_get_capabilities failed: %d", error); + goto exit; + } + have_capabilities = true; + } + + file_path = partition.m_file_path + ".MAD"; + if ((partition.m_data_file= my_open(file_path.c_str(), + O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, MYF(MY_WME))) < 0) { + msg(thread_num, "Error on aria table file open %s", file_path.c_str()); + goto exit; + } + if (!my_stat(file_path.c_str(), &partition.m_data_file_stat, MYF(0))) { + msg(thread_num, "Error on aria table file stat %s", file_path.c_str()); + goto exit; + } + } + + if ((frm_file = mysql_file_open( + key_file_frm, (m_frm_par_path + ".frm").c_str(), + O_RDONLY | O_SHARE, MYF(0))) < 0) { + msg(thread_num, "Error on aria table %s file open", + (m_frm_par_path + ".frm").c_str()); + goto exit; + } + + error = 0; + +exit: + if (!opt_no_lock && !backup_unlock(con)) { + msg(thread_num, "Error on BACKUP UNLOCK for aria table %s", + m_full_name.c_str()); + error = 1; + } + if (error) + (void)close(); + else { + (void)read_table_version_id(frm_file); + mysql_file_close(frm_file, MYF(MY_WME)); + } + return !error; +} + +bool Table::close() { + for (Partition &partition : m_partitions) { + if (partition.m_index_file >= 0) { + my_close(partition.m_index_file, MYF(MY_WME)); + partition.m_index_file = -1; + } + if (partition.m_data_file >= 0) { + my_close(partition.m_data_file, MYF(MY_WME)); + partition.m_data_file = -1; + } + } + return true; +} + +bool Table::copy(ds_ctxt_t *ds, unsigned thread_num) { + DBUG_ASSERT(is_opened()); + DBUG_MARIABACKUP_EVENT_LOCK("before_aria_table_copy", + fil_space_t::name_type(m_sql_name.data(), m_sql_name.size())); + bool result = +// copy_frm_and_par(ds, thread_num) && + copy(ds, true, thread_num) && copy(ds, false, thread_num); + return result; +} + +bool Table::copy(ds_ctxt_t *ds, bool is_index, unsigned thread_num) { + DBUG_ASSERT(ds); + const char *ext = is_index ? ".MAI" : ".MAD"; + int error= 1; + for (const Partition &partition : m_partitions) { + ds_file_t *dst_file = nullptr; + uchar *copy_buffer = nullptr; + std::string full_name = partition.m_file_path + ext; + const char *dst_path = + (xtrabackup_copy_back || xtrabackup_move_back) ? + full_name.c_str() : trim_dotslash(full_name.c_str()); + + dst_file = ds_open(ds, dst_path, + is_index ? &partition.m_index_file_stat : &partition.m_data_file_stat); + if (!dst_file) { + msg(thread_num, "error: cannot open the destination stream for %s", + dst_path); + goto err; + } + + copy_buffer = + reinterpret_cast(my_malloc(PSI_NOT_INSTRUMENTED, + m_cap.block_size, MYF(0))); + + DBUG_MARIABACKUP_EVENT_LOCK( + is_index ? + "before_aria_index_file_copy": + "before_aria_data_file_copy", + fil_space_t::name_type(m_sql_name.data(), + m_sql_name.size())); + + for (ulonglong block= 0 ; ; block++) { + size_t length = m_cap.block_size; + if (is_index) { + if ((error= aria_read_index( + partition.m_index_file, &m_cap, block, copy_buffer) == + HA_ERR_END_OF_FILE)) + break; + } else { + if ((error= aria_read_data( + partition.m_data_file, &m_cap, block, copy_buffer, &length) == + HA_ERR_END_OF_FILE)) + break; + } + if (error) { + msg(thread_num, "error: aria_read %s failed: %d", + is_index ? "index" : "data", error); + goto err; + } + xtrabackup_io_throttling(); + if ((error = ds_write(dst_file, copy_buffer, length))) { + msg(thread_num, "error: aria_write failed: %d", error); + goto err; + } + } + + DBUG_MARIABACKUP_EVENT_LOCK( + is_index ? + "after_aria_index_file_copy": + "after_aria_data_file_copy", + fil_space_t::name_type(m_sql_name.data(), + m_sql_name.size())); + + error = 0; + msg(thread_num, "aria table file %s is copied successfully.", + full_name.c_str()); + + err: + if (dst_file) + ds_close(dst_file); + if (copy_buffer) + my_free(copy_buffer); + if (error) + break; + } + return !error; +} + +class BackupImpl { +public: + BackupImpl( + const char *datadir_path, + const char *aria_log_path, + ds_ctxt_t *datasink, bool opt_no_lock, + std::vector &con_pool, ThreadPool &thread_pool) : + m_datadir_path(datadir_path), + m_aria_log_dir_path(aria_log_path), + m_ds(datasink), m_con_pool(con_pool), + m_tasks_group(thread_pool), m_thread_pool(thread_pool) { } + ~BackupImpl() { destroy(); } + bool init(); + bool start(bool no_lock); + bool wait_for_finish(); + bool copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats); + bool finalize(); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_table_post_copy_hook = hook; + } + bool copy_log_tail() { return copy_log_tail(0, false); } +private: + void destroy(); + void scan_job(bool no_lock, unsigned thread_num); + bool copy_log_tail(unsigned thread_num, bool finalize); + void copy_log_file_job(size_t log_num, unsigned thread_num); + void destroy_log_tail(); + void process_table_job(Table *table, bool online_only, bool copy_stats, + bool no_lock, unsigned thread_num); + + const char *m_datadir_path; + const char *m_aria_log_dir_path; + std::string aria_log_dir_path() const + { + if (!m_aria_log_dir_path || !m_aria_log_dir_path[0]) + return m_datadir_path; + if (is_absolute_path(m_aria_log_dir_path)) + return m_aria_log_dir_path; + return std::string(m_datadir_path).append("/") + .append(m_aria_log_dir_path); + } + ds_ctxt_t *m_ds; + std::vector &m_con_pool; + + TasksGroup m_tasks_group; + + std::mutex m_offline_tables_mutex; + std::vector> m_offline_tables; + post_copy_table_hook_t m_table_post_copy_hook; + + ThreadPool &m_thread_pool; + + size_t m_last_log_num = 0; + ds_file_t* m_last_log_dst = nullptr; + File m_last_log_src = -1; +}; + +bool BackupImpl::init() { + DBUG_ASSERT(m_tasks_group.is_finished()); + return true; +}; + +void BackupImpl::destroy() { + DBUG_ASSERT(m_tasks_group.is_finished()); + destroy_log_tail(); +} + +bool BackupImpl::start(bool no_lock) { + DBUG_ASSERT(m_tasks_group.is_finished()); + m_tasks_group.push_task( + std::bind(&BackupImpl::scan_job, this, no_lock, std::placeholders::_1)); + return true; +} + +void BackupImpl::process_table_job( + Table *table_ptr, bool online_only, bool copy_stats, bool no_lock, + unsigned thread_num) { + DBUG_ASSERT(table_ptr); + DBUG_ASSERT(thread_num < m_con_pool.size()); + std::unique_ptr table(table_ptr); + bool is_online; + bool is_stats; + bool need_copy; + int result = 1; + + if (!m_tasks_group.get_result()) + goto exit; + + if (!table->open(m_con_pool[thread_num], no_lock, thread_num)) { + // if table can't be opened, it might be removed or renamed, this is not + // error for transactional tables + table->close(); // Close opened table files + goto exit; + } + + is_online = table->is_online_backup_safe(); + is_stats = table->is_stats(); + + need_copy = (!online_only || is_online) && (copy_stats || !is_stats); + + if (need_copy && !table->copy(m_ds, thread_num)) { + table->close(); + DBUG_MARIABACKUP_EVENT_LOCK("after_aria_table_copy", + fil_space_t::name_type(table->get_sql_name().data(), + table->get_sql_name().size())); + // if table is opened, it must be copied, + // the corresponding diagnostic messages must be issued in Table::copy() + result = 0; + goto exit; + } + + if (!table->close()) { + msg(thread_num, "Can't close aria table %s.\n", + table->get_full_name().c_str()); + result = 0; + goto exit; + } + + if (!need_copy) { + std::lock_guard lock(m_offline_tables_mutex); + m_offline_tables.push_back(std::move(table)); + } + else { + DBUG_MARIABACKUP_EVENT_LOCK("after_aria_table_copy", + fil_space_t::name_type(table->get_sql_name().data(), + table->get_sql_name().size())); + if (m_table_post_copy_hook) + m_table_post_copy_hook( + std::move(table->get_db()), + std::move(table->get_table()), + std::move(table->get_version())); + } +exit: + m_tasks_group.finish_task(result); +} + + +void BackupImpl::scan_job(bool no_lock, unsigned thread_num) { + std::unordered_map> partitioned_tables; + + std::string aria_log_dir_path_cache(aria_log_dir_path()); + std::string log_control_file_path(aria_log_dir_path_cache); + log_control_file_path.append("/aria_log_control"); + if (!m_ds->copy_file( + log_control_file_path.c_str(), "aria_log_control", + 0, false)) { + msg("Aria log control file copying error."); + m_tasks_group.finish_task(0); + return; + } + + msg(thread_num, "Loading aria_log_control."); + aria_readonly= 1; + maria_data_root= aria_log_dir_path_cache.c_str(); + if (ma_control_file_open(FALSE, FALSE, FALSE, O_RDONLY)) + die("Can't open Aria control file (%d)", errno); + uint32 aria_log_control_last_log_number= last_logno; + msg(thread_num, "aria_log_control: last_log_number: %d", + aria_log_control_last_log_number); + ma_control_file_end(); + + msg(thread_num, "Start scanning aria tables."); + + foreach_file_in_db_dirs(m_datadir_path, [&](const char *file_path)->bool { + + if (check_if_skip_table(file_path)) { + msg(thread_num, "Skipping %s.", file_path); + return true; + } + + if (!ends_with(file_path, ".MAD")) + return true; + + std::unique_ptr
table(new Table()); + if (!table->init(file_path)) { + msg(thread_num, "Can't init aria table %s.\n", file_path); + return true; + } + + if (table->is_log()) + return true; + + if (table->is_partitioned()) { + auto table_it = partitioned_tables.find(table->get_full_name()); + if (table_it == partitioned_tables.end()) { + partitioned_tables[table->get_full_name()] = std::move(table); + } else { + table_it->second->add_partition(*table); + } + return true; + } + + m_tasks_group.push_task( + std::bind(&BackupImpl::process_table_job, this, table.release(), true, + false, no_lock, std::placeholders::_1)); + return true; + }); + + for (auto &table_it : partitioned_tables) { + m_tasks_group.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.release(), + true, false, no_lock, std::placeholders::_1)); + } + + msg(thread_num, "Start scanning aria log files."); + + LogFileCollection logs(aria_log_dir_path_cache.c_str(), + aria_log_control_last_log_number); + logs.report_found(thread_num); + logs.die_if_missing(aria_log_control_last_log_number); + + m_last_log_num= logs.last(); + + DBUG_MARIABACKUP_EVENT("after_scanning_log_files", {}); + + for (uint32 i= logs.first(); i <= logs.last(); ++i) + m_tasks_group.push_task( + std::bind(&BackupImpl::copy_log_file_job, this, + i, std::placeholders::_1)); + + msg(thread_num, "Stop scanning aria tables."); + + m_tasks_group.finish_task(1); +} + +template +T align_down(T n, ulint align_no) +{ + DBUG_ASSERT(align_no > 0); + DBUG_ASSERT(ut_is_2pow(align_no)); + return n & ~(static_cast(align_no) - 1); +} + +static ssize_t copy_file_chunk(File src, ds_file_t* dst, size_t size) { + size_t bytes_read; + static const size_t max_buf_size = 10 * 1024 * 1024; + size_t buf_size = size ? std::min(size, max_buf_size) : max_buf_size; + std::unique_ptr buf(new uchar[buf_size]); + ssize_t copied_size = 0; + bool unlim = !size; + while((unlim || size) && (bytes_read = my_read(src, buf.get(), + unlim ? buf_size : std::min(buf_size, size), MY_WME))) { + if (bytes_read == size_t(-1)) + return -1; + xtrabackup_io_throttling(); + if (ds_write(dst, buf.get(), bytes_read)) + return -1; + copied_size += bytes_read; + if (!unlim) + size -= bytes_read; + } + return copied_size; +} + +bool BackupImpl::copy_log_tail(unsigned thread_num, bool finalize) { + bool result = false; + std::string log_file = log_file_name(aria_log_dir_path().c_str(), m_last_log_num); + std::string prev_log_file; + ssize_t total_bytes_copied = 0; + MY_STAT stat_info; + my_off_t file_offset = 0; + size_t to_copy_size = 0; + +repeat: + memset(&stat_info, 0, sizeof(MY_STAT)); + if (!m_tasks_group.get_result()) { + msg(thread_num, "Skip copying aria lof file tail %s due to error.", + log_file.c_str()); + result = true; + goto exit; + } + + msg(thread_num, "Start copying aria log file tail: %s", log_file.c_str()); + + if (m_last_log_src < 0 && (m_last_log_src = + my_open(log_file.c_str(), O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, + MYF(MY_WME))) < 0) { + msg("Aria log file %s open failed: %d", log_file.c_str(), my_errno); + goto exit; + } + + if (!m_last_log_dst && + !(m_last_log_dst = ds_open(m_ds, + log_file_name_only(m_last_log_num).c_str(), + &stat_info, false))) { + msg(thread_num, "error: failed to open the target stream for " + "aria log file %s.", + log_file.c_str()); + goto exit; + } + +// If there is no need to finalize log file copying, calculate the size to copy +// without the last page, which can be rewritten by the server +// (see translog_force_current_buffer_to_finish()). + if (!finalize) { + if (my_fstat(m_last_log_src, &stat_info, MYF(0))) { + msg(thread_num, "error: failed to get file size for aria log file: %s.", + log_file.c_str()); + goto exit; + } + if ((file_offset = my_tell(m_last_log_src, MYF(0))) == (my_off_t)(-1)) { + msg(thread_num, "error: failed to get file offset for aria log file: %s.", + log_file.c_str()); + goto exit; + } + DBUG_ASSERT(file_offset <= static_cast(stat_info.st_size)); + to_copy_size = static_cast(stat_info.st_size - file_offset); + to_copy_size = to_copy_size >= TRANSLOG_PAGE_SIZE ? + (align_down(to_copy_size, TRANSLOG_PAGE_SIZE) - TRANSLOG_PAGE_SIZE) : 0; + } + +// Copy from the last position to the end of file, +// excluding the last page is there is no need to finalize the copy. + if ((to_copy_size || finalize) && + (total_bytes_copied = copy_file_chunk(m_last_log_src, + m_last_log_dst, to_copy_size)) < 0) { + msg(thread_num, "Aria log file %s chunk copy error", log_file.c_str()); + goto exit; + } + + msg(thread_num, "Stop copying aria log file tail: %s, copied %zu bytes", + log_file.c_str(), total_bytes_copied); + +// Check if there is new log file, if yes, then copy the last page of the old +// one, and fix it last LSN in the log header, as it is changed on new +// log file creating by the server (see translog_create_new_file() and +// translog_max_lsn_to_header()). Then close the old log file and repeat +// the copying for the new log file. + prev_log_file = std::move(log_file); + log_file = log_file_name(aria_log_dir_path().c_str(), m_last_log_num + 1); + if (file_exists(log_file.c_str())) { + uchar lsn_buff[LSN_STORE_SIZE]; + msg(thread_num, "Found new aria log tail file: %s, start copy %s tail", + log_file.c_str(), prev_log_file.c_str()); + if ((total_bytes_copied = copy_file_chunk(m_last_log_src, + m_last_log_dst, 0)) < 0) { + msg(thread_num, "Aria log file %s tail copy error", + prev_log_file.c_str()); + goto exit; + } + + if (my_pread(m_last_log_src, lsn_buff, LSN_STORE_SIZE, + (LOG_HEADER_DATA_SIZE - LSN_STORE_SIZE), MYF(0)) < LSN_STORE_SIZE) { + msg(thread_num, "Aria lsn store read error for log file %s", + prev_log_file.c_str()); + goto exit; + } + + if (ds_seek_set(m_last_log_dst, (LOG_HEADER_DATA_SIZE - LSN_STORE_SIZE))) { + msg(thread_num, "Set aria log pointer error for log file %s", + prev_log_file.c_str()); + goto exit; + } + + if (ds_write(m_last_log_dst, lsn_buff, LSN_STORE_SIZE)) { + msg(thread_num, "LSN write error for aria log file %s", + prev_log_file.c_str()); + goto exit; + } + + msg(thread_num, "The last %zu bytes were copied for %s.", + total_bytes_copied, prev_log_file.c_str()); + destroy_log_tail(); + ++m_last_log_num; + goto repeat; + } + + result = true; + +exit: + if (!result) + destroy_log_tail(); + return result; +} + +void BackupImpl::copy_log_file_job(size_t log_num, unsigned thread_num) { + DBUG_ASSERT(log_num <= m_last_log_num); + + if (!m_tasks_group.get_result()) { + msg(thread_num, "Skip copying %zu aria log file due to error", log_num); + m_tasks_group.finish_task(0); + return; + } + +// Copy log file if the file is not the last one. + if (log_num < m_last_log_num) { + std::string log_file = log_file_name(aria_log_dir_path().c_str(), log_num); + if (!m_ds->copy_file(log_file.c_str(), + log_file_name_only(log_num).c_str(), + thread_num, false)) { + msg(thread_num, "Error on copying %s aria log file.", log_file.c_str()); + m_tasks_group.finish_task(0); + } + else + m_tasks_group.finish_task(1); + return; + } +// Copy the last log file. + m_tasks_group.finish_task(copy_log_tail(thread_num, false) ? 1 : 0); +} + +void BackupImpl::destroy_log_tail() { + if (m_last_log_src >= 0) { + my_close(m_last_log_src, MYF(MY_WME)); + m_last_log_src = -1; + } + if (m_last_log_dst) { + ds_close(m_last_log_dst); + m_last_log_dst = nullptr; + } +} + +bool BackupImpl::wait_for_finish() { + return m_tasks_group.wait_for_finish(); +} + +bool BackupImpl::copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats) { + DBUG_ASSERT(m_tasks_group.is_finished()); + + std::vector> ignored_tables; + + while (true) { + std::unique_lock lock(m_offline_tables_mutex); + if (m_offline_tables.empty()) + break; + auto table = std::move(m_offline_tables.back()); + m_offline_tables.pop_back(); + lock.unlock(); + if ((exclude_tables && + exclude_tables->count(table_key(table->get_db(), table->get_table()))) || + (!copy_stats && table->is_stats())) { + ignored_tables.push_back(std::move(table)); + continue; + } + m_tasks_group.push_task( + std::bind(&BackupImpl::process_table_job, this, table.release(), false, + copy_stats, no_lock, std::placeholders::_1)); + } + + if (!ignored_tables.empty()) { + std::lock_guard lock(m_offline_tables_mutex); + m_offline_tables = std::move(ignored_tables); + } + + return true; +} + +bool BackupImpl::finalize() { + DBUG_ASSERT(m_tasks_group.is_finished()); + DBUG_ASSERT(!m_con_pool.empty()); + bool result = true; + msg("Start copying statistics aria tables."); + copy_offline_tables(nullptr, true, true); + while (!m_tasks_group.is_finished()) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + msg("Stop copying statistics aria tables."); + copy_log_tail(0, true); + destroy_log_tail(); + return result; +} + +Backup::Backup(const char *datadir_path, + const char *aria_log_path, + ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool) : + m_backup_impl( + new BackupImpl(datadir_path, aria_log_path, + datasink, opt_no_lock, con_pool, + thread_pool)) { } + +Backup::~Backup() { + delete m_backup_impl; +} + +bool Backup::init() { + return m_backup_impl->init(); +} + +bool Backup::start(bool no_lock) { + return m_backup_impl->start(no_lock); +} + +bool Backup::wait_for_finish() { + return m_backup_impl->wait_for_finish(); +} + +bool Backup::copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats) { + return m_backup_impl->copy_offline_tables(exclude_tables, no_lock, + copy_stats); +} + +bool Backup::finalize() { + return m_backup_impl->finalize(); +} + +bool Backup::copy_log_tail() { + return m_backup_impl->copy_log_tail(); +} + +void Backup::set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_backup_impl->set_post_copy_table_hook(hook); +} + +bool prepare(const char *target_dir) { + maria_data_root= (char *)target_dir; + + if (maria_init()) + die("Can't init Aria engine (%d)", errno); + + maria_block_size= 0; /* Use block size from file */ + /* we don't want to create a control file, it MUST exist */ + if (ma_control_file_open(FALSE, TRUE, TRUE, control_file_open_flags)) + die("Can't open Aria control file (%d)", errno); + + if (last_logno == FILENO_IMPOSSIBLE) + die("Can't find any Aria log"); + + LogFileCollection logs(target_dir, last_logno); + logs.die_if_missing(last_logno); // Fatal, a broken backup. + /* + "mariadb-backup --backup" can put extra log files, + with log number greater than last_logno. For example, + this combination of files is possible: + - aria_log_control (with last_logno==1) + - aria_log.00000001 (last_logno) + - aria_log.00000002 (last_logno+1, the extra log file) + This can happen if during the ealier run of + "mariadb-backup --backup" a log rotate happened. + The extra log file is copied to the backup directory, + but last_logno in aria_log_control does not get updated. + This mismatch is probably not good and should eventually be fixed. + But during "mariadb-backup --prepare" this mismatch goes away: + aria_log_control gets fixed to say last_logno==2. + See mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test, + it covers the scenario with one extra file created during --backup. + */ + logs.find_logs_after_last(target_dir); + last_logno= logs.last(); // Update last_logno if extra logs were found + + if (init_pagecache(maria_pagecache, 1024L*1024L, 0, 0, + static_cast(maria_block_size), 0, MY_WME) == 0) + die("Got error in Aria init_pagecache() (errno: %d)", errno); + + if (init_pagecache(maria_log_pagecache, 1024L*1024L, + 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0 || + translog_init(maria_data_root, TRANSLOG_FILE_SIZE, + 0, 0, maria_log_pagecache, TRANSLOG_DEFAULT_FLAGS, FALSE)) + die("Can't init Aria loghandler (%d)", errno); + + if (maria_recovery_from_log()) + die("Aria log apply FAILED"); + + if (maria_recovery_changed_data || recovery_failures) { + if (ma_control_file_write_and_force(last_checkpoint_lsn, last_logno, + max_trid_in_control_file, 0)) + die("Aria control file update error"); +// TODO: find out do we need checkpoint here + } + + maria_end(); + return true; +} + +} // namespace aria diff -Nru mariadb-10.11.6/extra/mariabackup/aria_backup_client.h mariadb-10.11.9/extra/mariabackup/aria_backup_client.h --- mariadb-10.11.6/extra/mariabackup/aria_backup_client.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/aria_backup_client.h 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,38 @@ +#pragma once +#include "my_global.h" +#include "datasink.h" +#include "backup_mysql.h" +#include "thread_pool.h" +#include "xtrabackup.h" + +namespace aria { + +bool prepare(const char *target_dir); + +class BackupImpl; + +class Backup { + public: + Backup(const char *datadir_path, + const char *aria_log_path, + ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool); + ~Backup(); + Backup (Backup &&other) = delete; + Backup & operator= (Backup &&other) = delete; + Backup(const Backup &) = delete; + Backup & operator= (const Backup &) = delete; + bool init(); + bool start(bool no_lock); + bool wait_for_finish(); + bool copy_offline_tables( + const std::unordered_set *exclude_tables, bool no_lock, + bool copy_stats); + bool finalize(); + bool copy_log_tail(); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook); + private: + BackupImpl *m_backup_impl; +}; + +} // namespace aria diff -Nru mariadb-10.11.6/extra/mariabackup/backup_copy.cc mariadb-10.11.9/extra/mariabackup/backup_copy.cc --- mariadb-10.11.6/extra/mariabackup/backup_copy.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/backup_copy.cc 2024-08-03 07:29:56.000000000 +0000 @@ -41,6 +41,9 @@ *******************************************************/ #include +#include +#include +#include #include #include #include @@ -66,19 +69,26 @@ #include #endif +#ifdef MYSQL_CLIENT +#define WAS_MYSQL_CLIENT 1 +#undef MYSQL_CLIENT +#endif + +#include "table.h" + +#ifdef WAS_MYSQL_CLIENT +#define MYSQL_CLIENT 1 +#undef WAS_MYSQL_CLIENT +#endif #define ROCKSDB_BACKUP_DIR "#rocksdb" -/* list of files to sync for --rsync mode */ -static std::set rsync_list; /* locations of tablespaces read from .isl files */ static std::map tablespace_locations; /* Whether LOCK BINLOG FOR BACKUP has been issued during backup */ bool binlog_locked; -static void rocksdb_create_checkpoint(); -static bool has_rocksdb_plugin(); static void rocksdb_backup_checkpoint(ds_ctxt *ds_data); static void rocksdb_copy_back(ds_ctxt *ds_data); @@ -135,10 +145,6 @@ bool ret; }; -static bool backup_files_from_datadir(ds_ctxt_t *ds_data, - const char *dir_path, - const char *prefix); - /************************************************************************ Retirn true if character if file separator */ bool @@ -585,7 +591,6 @@ Check to see if a file exists. Takes name of the file to check. @return true if file exists. */ -static bool file_exists(const char *filename) { @@ -601,7 +606,6 @@ /************************************************************************ Trim leading slashes from absolute path so it becomes relative */ -static const char * trim_dotslash(const char *path) { @@ -634,7 +638,7 @@ && strcmp(str + str_len - suffix_len, suffix) == 0); } -static bool starts_with(const char *str, const char *prefix) +bool starts_with(const char *str, const char *prefix) { return strncmp(str, prefix, strlen(prefix)) == 0; } @@ -785,7 +789,6 @@ /************************************************************************ Check if file name ends with given set of suffixes. @return true if it does. */ -static bool filename_matches(const char *filename, const char **ext_list) { @@ -800,52 +803,127 @@ return(false); } - -/************************************************************************ -Copy data file for backup. Also check if it is allowed to copy by -comparing its name to the list of known data file types and checking -if passes the rules for partial backup. -@return true if file backed up or skipped successfully. */ +// TODO: the code can be used to find storage engine of partitions +/* static -bool -datafile_copy_backup(ds_ctxt *ds_data, const char *filepath, uint thread_n) -{ - const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", - "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", - NULL}; +bool is_aria_frm_or_par(const char *path) { + if (!ends_with(path, ".frm") && !ends_with(path, ".par")) + return false; - /* Get the name and the path for the tablespace. node->name always - contains the path (which may be absolute for remote tablespaces in - 5.6+). space->name contains the tablespace name in the form - "./database/table.ibd" (in 5.5-) or "database/table" (in 5.6+). For a - multi-node shared tablespace, space->name contains the name of the first - node, but that's irrelevant, since we only need node_name to match them - against filters, and the shared tablespace is always copied regardless - of the filters value. */ + const char *frm_path = path; + if (ends_with(path, ".par")) { + size_t frm_path_len = strlen(path); + DBUG_ASSERT(frm_path_len > strlen("frm")); + frm_path = strdup(path); + strcpy(const_cast(frm_path) + frm_path_len - strlen("frm"), "frm"); + } - if (check_if_skip_table(filepath)) { - msg(thread_n,"Skipping %s.", filepath); - return(true); + bool result = false; + File file; + uchar header[40]; + legacy_db_type dbt; + + if ((file= mysql_file_open(key_file_frm, frm_path, O_RDONLY | O_SHARE, MYF(0))) + < 0) + goto err; + + if (mysql_file_read(file, (uchar*) header, sizeof(header), MYF(MY_NABP))) + goto err; + + if (!strncmp((char*) header, "TYPE=VIEW\n", 10)) + goto err; + + if (!is_binary_frm_header(header)) + goto err; + + dbt = (legacy_db_type)header[3]; + + if (dbt == DB_TYPE_ARIA) { + result = true; } + else if (dbt == DB_TYPE_PARTITION_DB) { + MY_STAT state; + uchar *frm_image= 0; +// uint n_length; - if (filename_matches(filepath, ext_list)) { - return ds_data->copy_file(filepath, filepath, thread_n); + if (mysql_file_fstat(file, &state, MYF(MY_WME))) + goto err; + + if (mysql_file_seek(file, 0, SEEK_SET, MYF(MY_WME))) + goto err; + + if (read_string(file, &frm_image, (size_t)state.st_size)) + goto err; + + dbt = (legacy_db_type)frm_image[61]; + if (dbt == DB_TYPE_ARIA) { + result = true; + } + my_free(frm_image); } - return(true); +err: + if (file >= 0) + mysql_file_close(file, MYF(MY_WME)); + if (frm_path != path) + free(const_cast(frm_path)); + return result; } +*/ + +void parse_db_table_from_file_path( + const char *filepath, char *dbname, char *tablename) { + dbname[0] = '\0'; + tablename[0] = '\0'; + const char *dbname_start = nullptr; + const char *tablename_start = filepath; + const char *const_ptr; + while ((const_ptr = strchr(tablename_start, FN_LIBCHAR)) != NULL) { + dbname_start = tablename_start; + tablename_start = const_ptr + 1; + } + if (!dbname_start) + return; + size_t dbname_len = tablename_start - dbname_start - 1; + if (dbname_len >= FN_REFLEN) + dbname_len = FN_REFLEN-1; + strmake(dbname, dbname_start, dbname_len); + strmake(tablename, tablename_start, FN_REFLEN-1); + char *ptr; + if ((ptr = strchr(tablename, '.'))) + *ptr = '\0'; + if ((ptr = strstr(tablename, "#P#"))) + *ptr = '\0'; +} + +bool is_system_table(const char *dbname, const char *tablename) +{ + DBUG_ASSERT(dbname); + DBUG_ASSERT(tablename); + + Lex_ident_db lex_dbname; + Lex_ident_table lex_tablename; + lex_dbname.str = dbname; + lex_dbname.length = strlen(dbname); + lex_tablename.str = tablename; + lex_tablename.length = strlen(tablename); + TABLE_CATEGORY tg = get_table_category(lex_dbname, lex_tablename); + + return (tg == TABLE_CATEGORY_LOG) || (tg == TABLE_CATEGORY_SYSTEM); +} /************************************************************************ -Same as datafile_copy_backup, but put file name into the list for -rsync command. */ +Copy data file for backup. Also check if it is allowed to copy by +comparing its name to the list of known data file types and checking +if passes the rules for partial backup. +@return true if file backed up or skipped successfully. */ static bool -datafile_rsync_backup(const char *filepath, bool save_to_list, FILE *f) +datafile_copy_backup(ds_ctxt *ds_data, const char *filepath, uint thread_n) { - const char *ext_list[] = {"frm", "isl", "MYD", "MYI", "MAD", "MAI", - "MRG", "TRG", "TRN", "ARM", "ARZ", "CSM", "CSV", "opt", "par", - NULL}; + const char *ext_list[] = {".frm", ".isl", ".TRG", ".TRN", ".opt", ".par", + NULL}; /* Get the name and the path for the tablespace. node->name always contains the path (which may be absolute for remote tablespaces in @@ -857,15 +935,13 @@ of the filters value. */ if (check_if_skip_table(filepath)) { + msg(thread_n,"Skipping %s.", filepath); return(true); } if (filename_matches(filepath, ext_list)) { - fprintf(f, "%s\n", filepath); - if (save_to_list) { - rsync_list.insert(filepath); - } - } + return ds_data->copy_file(filepath, filepath, thread_n); + } return(true); } @@ -1004,16 +1080,15 @@ bool ds_ctxt_t::copy_file(const char *src_file_path, const char *dst_file_path, - uint thread_n) + uint thread_n, + bool rewrite) { char dst_name[FN_REFLEN]; ds_file_t *dstfile = NULL; datafile_cur_t cursor; xb_fil_cur_result_t res; DBUG_ASSERT(datasink->remove); - const char *dst_path = - (xtrabackup_copy_back || xtrabackup_move_back)? - dst_file_path : trim_dotslash(dst_file_path); + const char *dst_path = convert_dst(dst_file_path); if (!datafile_open(src_file_path, &cursor, thread_n)) { goto error_close; @@ -1021,7 +1096,7 @@ strncpy(dst_name, cursor.rel_path, sizeof(dst_name)); - dstfile = ds_open(this, dst_path, &cursor.statinfo); + dstfile = ds_open(this, dst_path, &cursor.statinfo, rewrite); if (dstfile == NULL) { msg(thread_n,"error: " "cannot open the destination stream for %s", dst_name); @@ -1245,278 +1320,45 @@ } - - -static bool -backup_files(ds_ctxt *ds_data, const char *from, bool prep_mode) +backup_files(ds_ctxt *ds_data, const char *from) { - char rsync_tmpfile_name[FN_REFLEN]; - FILE *rsync_tmpfile = NULL; datadir_iter_t *it; datadir_node_t node; bool ret = true; - - if (prep_mode && !opt_rsync) { - return(true); - } - - if (opt_rsync) { - snprintf(rsync_tmpfile_name, sizeof(rsync_tmpfile_name), - "%s/%s%d", opt_mysql_tmpdir, - "xtrabackup_rsyncfiles_pass", - prep_mode ? 1 : 2); - rsync_tmpfile = fopen(rsync_tmpfile_name, "w"); - if (rsync_tmpfile == NULL) { - msg("Error: can't create file %s", - rsync_tmpfile_name); - return(false); - } - } - - msg("Starting %s non-InnoDB tables and files", - prep_mode ? "prep copy of" : "to backup"); - + msg("Starting to backup non-InnoDB tables and files"); datadir_node_init(&node); it = datadir_iter_new(from); - while (datadir_iter_next(it, &node)) { - if (!node.is_empty_dir) { - if (opt_rsync) { - ret = datafile_rsync_backup(node.filepath, - !prep_mode, rsync_tmpfile); - } else { - ret = datafile_copy_backup(ds_data, node.filepath, 1); - } + ret = datafile_copy_backup(ds_data, node.filepath, 1); if (!ret) { msg("Failed to copy file %s", node.filepath); goto out; } - } else if (!prep_mode) { + } else { /* backup fake file into empty directory */ char path[FN_REFLEN]; - snprintf(path, sizeof(path), - "%s/db.opt", node.filepath); - if (!(ret = ds_data->backup_file_printf( - trim_dotslash(path), "%s", ""))) { + snprintf(path, sizeof(path), "%s/db.opt", node.filepath); + if (!(ret = ds_data->backup_file_printf(trim_dotslash(path), "%s", ""))) { msg("Failed to create file %s", path); goto out; } } } - - if (opt_rsync) { - std::stringstream cmd; - int err; - - if (buffer_pool_filename && file_exists(buffer_pool_filename)) { - fprintf(rsync_tmpfile, "%s\n", buffer_pool_filename); - rsync_list.insert(buffer_pool_filename); - } - if (file_exists("ib_lru_dump")) { - fprintf(rsync_tmpfile, "%s\n", "ib_lru_dump"); - rsync_list.insert("ib_lru_dump"); - } - - fclose(rsync_tmpfile); - rsync_tmpfile = NULL; - - cmd << "rsync -t . --files-from=" << rsync_tmpfile_name - << " " << xtrabackup_target_dir; - - msg("Starting rsync as: %s", cmd.str().c_str()); - if ((err = system(cmd.str().c_str()) && !prep_mode) != 0) { - msg("Error: rsync failed with error code %d", err); - ret = false; - goto out; - } - msg("rsync finished successfully."); - - if (!prep_mode && !opt_no_lock) { - char path[FN_REFLEN]; - char dst_path[FN_REFLEN]; - char *newline; - - /* Remove files that have been removed between first and - second passes. Cannot use "rsync --delete" because it - does not work with --files-from. */ - snprintf(rsync_tmpfile_name, sizeof(rsync_tmpfile_name), - "%s/%s", opt_mysql_tmpdir, - "xtrabackup_rsyncfiles_pass1"); - - rsync_tmpfile = fopen(rsync_tmpfile_name, "r"); - if (rsync_tmpfile == NULL) { - msg("Error: can't open file %s", - rsync_tmpfile_name); - ret = false; - goto out; - } - - while (fgets(path, sizeof(path), rsync_tmpfile)) { - - newline = strchr(path, '\n'); - if (newline) { - *newline = 0; - } - if (rsync_list.count(path) < 1) { - snprintf(dst_path, sizeof(dst_path), - "%s/%s", xtrabackup_target_dir, - path); - msg("Removing %s", dst_path); - unlink(dst_path); - } - } - - fclose(rsync_tmpfile); - rsync_tmpfile = NULL; - } - } - - msg("Finished %s non-InnoDB tables and files", - prep_mode ? "a prep copy of" : "backing up"); - + msg("Finished backing up non-InnoDB tables and files"); out: datadir_iter_free(it); datadir_node_free(&node); - - if (rsync_tmpfile != NULL) { - fclose(rsync_tmpfile); - } - return(ret); } - -lsn_t get_current_lsn(MYSQL *connection) -{ - static const char lsn_prefix[] = "\nLog sequence number "; - lsn_t lsn = 0; - if (MYSQL_RES *res = xb_mysql_query(connection, - "SHOW ENGINE INNODB STATUS", - true, false)) { - if (MYSQL_ROW row = mysql_fetch_row(res)) { - const char *p= strstr(row[2], lsn_prefix); - DBUG_ASSERT(p); - if (p) { - p += sizeof lsn_prefix - 1; - lsn = lsn_t(strtoll(p, NULL, 10)); - } - } - mysql_free_result(res); - } - return lsn; -} - lsn_t server_lsn_after_lock; extern void backup_wait_for_lsn(lsn_t lsn); -/** Start --backup */ -bool backup_start(ds_ctxt *ds_data, ds_ctxt *ds_meta, - CorruptedPages &corrupted_pages) -{ - if (!opt_no_lock) { - if (opt_safe_slave_backup) { - if (!wait_for_safe_slave(mysql_connection)) { - return(false); - } - } - - if (!backup_files(ds_data, fil_path_to_mysql_datadir, true)) { - return(false); - } - history_lock_time = time(NULL); - - if (!lock_tables(mysql_connection)) { - return(false); - } - server_lsn_after_lock = get_current_lsn(mysql_connection); - } - - if (!backup_files(ds_data, fil_path_to_mysql_datadir, false)) { - return(false); - } - - if (!backup_files_from_datadir(ds_data, fil_path_to_mysql_datadir, - "aws-kms-key") || - !backup_files_from_datadir(ds_data, - aria_log_dir_path, - "aria_log")) { - return false; - } - - if (has_rocksdb_plugin()) { - rocksdb_create_checkpoint(); - } - - msg("Waiting for log copy thread to read lsn %llu", (ulonglong)server_lsn_after_lock); - backup_wait_for_lsn(server_lsn_after_lock); - DBUG_EXECUTE_FOR_KEY("sleep_after_waiting_for_lsn", {}, - { - ulong milliseconds = strtoul(dbug_val, NULL, 10); - msg("sleep_after_waiting_for_lsn"); - my_sleep(milliseconds*1000UL); - }); - - corrupted_pages.backup_fix_ddl(ds_data, ds_meta); - - // There is no need to stop slave thread before coping non-Innodb data when - // --no-lock option is used because --no-lock option requires that no DDL or - // DML to non-transaction tables can occur. - if (opt_no_lock) { - if (opt_safe_slave_backup) { - if (!wait_for_safe_slave(mysql_connection)) { - return(false); - } - } - } - - if (opt_slave_info) { - lock_binlog_maybe(mysql_connection); - - if (!write_slave_info(ds_data, mysql_connection)) { - return(false); - } - } - - /* The only reason why Galera/binlog info is written before - wait_for_ibbackup_log_copy_finish() is that after that call the xtrabackup - binary will start streamig a temporary copy of REDO log to stdout and - thus, any streaming from innobackupex would interfere. The only way to - avoid that is to have a single process, i.e. merge innobackupex and - xtrabackup. */ - if (opt_galera_info) { - if (!write_galera_info(ds_data, mysql_connection)) { - return(false); - } - } - - if (opt_binlog_info == BINLOG_INFO_ON) { - - lock_binlog_maybe(mysql_connection); - write_binlog_info(ds_data, mysql_connection); - } - - if (!opt_no_lock) { - msg("Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS..."); - xb_mysql_query(mysql_connection, - "FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS", false); - } - - return(true); -} - -/** Release resources after backup_start() */ +/** Release resources after backup_files() */ void backup_release() { - /* release all locks */ - if (!opt_no_lock) { - unlock_all(mysql_connection); - history_lock_time = 0; - } else { - history_lock_time = time(NULL) - history_lock_time; - } - if (opt_lock_ddl_per_table) { mdl_unlock_all(); } @@ -1530,11 +1372,11 @@ static const char *default_buffer_pool_file = "ib_buffer_pool"; -/** Finish after backup_start() and backup_release() */ +/** Finish after backup_files() and backup_release() */ bool backup_finish(ds_ctxt *ds_data) { /* Copy buffer pool dump or LRU dump */ - if (!opt_rsync && opt_galera_info) { + if (opt_galera_info) { if (buffer_pool_filename && file_exists(buffer_pool_filename)) { ds_data->copy_file(buffer_pool_filename, default_buffer_pool_file, 0); } @@ -1618,6 +1460,7 @@ NULL}; const char *sup_files[] = {"xtrabackup_binlog_info", "xtrabackup_galera_info", + "donor_galera_info", "xtrabackup_slave_info", "xtrabackup_info", "ib_lru_dump", @@ -1892,8 +1735,6 @@ return(false); } - srv_max_n_threads = 1000; - /* copy undo tablespaces */ Copy_back_dst_dir dst_dir_buf; @@ -1921,7 +1762,8 @@ dst_dir = dst_dir_buf.make(srv_log_group_home_dir); - /* --backup generates a single ib_logfile0, which we must copy. */ + /* --backup generates a single LOG_FILE_NAME, which we must copy + if it exists. */ ds_tmp = ds_create(dst_dir, DS_TYPE_LOCAL); if (!(ret = copy_or_move_file(ds_tmp, LOG_FILE_NAME, LOG_FILE_NAME, @@ -2154,8 +1996,6 @@ bool ret; datadir_iter_t *it = NULL; - srv_max_n_threads = 1000; - /* cd to backup directory */ if (my_setwd(xtrabackup_target_dir, MYF(MY_WME))) { @@ -2168,8 +2008,6 @@ it = datadir_iter_new(".", false); - ut_a(xtrabackup_parallel >= 0); - ret = run_data_threads(it, decrypt_decompress_thread_func, xtrabackup_parallel ? xtrabackup_parallel : 1); @@ -2191,9 +2029,9 @@ Do not copy the Innodb files (ibdata1, redo log files), as this is done in a separate step. */ -static bool backup_files_from_datadir(ds_ctxt_t *ds_data, - const char *dir_path, - const char *prefix) +bool backup_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path, + const char *prefix) { os_file_dir_t dir = os_file_opendir(dir_path); if (dir == IF_WIN(INVALID_HANDLE_VALUE, nullptr)) return false; @@ -2217,10 +2055,6 @@ pname = info.name; if (!starts_with(pname, prefix)) - /* For ES exchange the above line with the following code: - (!xtrabackup_prepare || !xtrabackup_incremental_dir || - !starts_with(pname, "aria_log"))) - */ continue; if (xtrabackup_prepare && xtrabackup_incremental_dir && @@ -2243,7 +2077,7 @@ return 0; } -static bool has_rocksdb_plugin() +bool has_rocksdb_plugin() { static bool first_time = true; static bool has_plugin= false; @@ -2290,7 +2124,7 @@ } else { - strncpy(to_path_full, to_path, sizeof(to_path_full)); + strncpy(to_path_full, to_path, sizeof(to_path_full)-1); } #ifdef _WIN32 return CreateHardLink(to_path_full, from_path, NULL); @@ -2389,7 +2223,7 @@ #define MARIADB_CHECKPOINT_DIR "mariabackup-checkpoint" static char rocksdb_checkpoint_dir[FN_REFLEN]; -static void rocksdb_create_checkpoint() +void rocksdb_create_checkpoint() { MYSQL_RES *result = xb_mysql_query(mysql_connection, "SELECT @@rocksdb_datadir,@@datadir", true, true); MYSQL_ROW row = mysql_fetch_row(result); @@ -2469,3 +2303,39 @@ mkdirp(rocksdb_home_dir, 0777, MYF(0)); ds_data->copy_or_move_dir(ROCKSDB_BACKUP_DIR, rocksdb_home_dir, xtrabackup_copy_back, xtrabackup_copy_back); } + +void foreach_file_in_db_dirs( + const char *dir_path, std::function func) { + DBUG_ASSERT(dir_path); + + datadir_iter_t *it; + datadir_node_t node; + + datadir_node_init(&node); + it = datadir_iter_new(dir_path); + + while (datadir_iter_next(it, &node)) + if (!node.is_empty_dir && !func(node.filepath)) + break; + + datadir_iter_free(it); + datadir_node_free(&node); +} + +void foreach_file_in_datadir( + const char *dir_path, std::function func) +{ + DBUG_ASSERT(dir_path); + os_file_dir_t dir = os_file_opendir(dir_path); + os_file_stat_t info; + while (os_file_readdir_next_file(dir_path, dir, &info) == 0) { + if (info.type != OS_FILE_TYPE_FILE) + continue; + const char *pname = strrchr(info.name, IF_WIN('\\', '/')); + if (!pname) + pname = info.name; + if (!func(pname)) + break; + } + os_file_closedir(dir); +} diff -Nru mariadb-10.11.6/extra/mariabackup/backup_copy.h mariadb-10.11.9/extra/mariabackup/backup_copy.h --- mariadb-10.11.6/extra/mariabackup/backup_copy.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/backup_copy.h 2024-08-03 07:29:56.000000000 +0000 @@ -2,6 +2,7 @@ #ifndef XTRABACKUP_BACKUP_COPY_H #define XTRABACKUP_BACKUP_COPY_H +#include #include #include #include "datasink.h" @@ -9,6 +10,7 @@ /* special files */ #define XTRABACKUP_SLAVE_INFO "xtrabackup_slave_info" #define XTRABACKUP_GALERA_INFO "xtrabackup_galera_info" +#define XTRABACKUP_DONOR_GALERA_INFO "donor_galera_info" #define XTRABACKUP_BINLOG_INFO "xtrabackup_binlog_info" #define XTRABACKUP_INFO "xtrabackup_info" @@ -20,11 +22,10 @@ equal_paths(const char *first, const char *second); /** Start --backup */ -bool backup_start(ds_ctxt *ds_data, ds_ctxt *ds_meta, - CorruptedPages &corrupted_pages); -/** Release resources after backup_start() */ +bool backup_files(ds_ctxt *ds_data, const char *from); +/** Release resources after backup_files() */ void backup_release(); -/** Finish after backup_start() and backup_release() */ +/** Finish after backup_files() and backup_release() */ bool backup_finish(ds_ctxt *ds_data); bool apply_log_finish(); @@ -37,7 +38,25 @@ bool directory_exists(const char *dir, bool create); -lsn_t -get_current_lsn(MYSQL *connection); - +bool has_rocksdb_plugin(); +void rocksdb_create_checkpoint(); +void foreach_file_in_db_dirs( + const char *dir_path, std::function func); +void foreach_file_in_datadir( + const char *dir_path, std::function func); +bool ends_with(const char *str, const char *suffix); +bool starts_with(const char *str, const char *prefix); +void parse_db_table_from_file_path( + const char *filepath, char *dbname, char *tablename); +const char *trim_dotslash(const char *path); +bool backup_files_from_datadir(ds_ctxt_t *ds_data, + const char *dir_path, + const char *prefix); + +bool is_system_table(const char *dbname, const char *tablename); +std::unique_ptr> + find_files(const char *dir_path, const char *prefix, const char *suffix); +bool file_exists(const char *filename); +bool +filename_matches(const char *filename, const char **ext_list); #endif diff -Nru mariadb-10.11.6/extra/mariabackup/backup_debug.h mariadb-10.11.9/extra/mariabackup/backup_debug.h --- mariadb-10.11.6/extra/mariabackup/backup_debug.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/backup_debug.h 2024-08-03 07:29:56.000000000 +0000 @@ -1,5 +1,6 @@ #pragma once #include "my_dbug.h" + #ifndef DBUG_OFF char *dbug_mariabackup_get_val(const char *event, fil_space_t::name_type key); /* @@ -14,11 +15,21 @@ for the variable) 3. start mariabackup with --dbug=+d,debug_mariabackup_events */ -#define DBUG_EXECUTE_FOR_KEY(EVENT, KEY, CODE) \ - DBUG_EXECUTE_IF("mariabackup_inject_code", \ - { char *dbug_val= dbug_mariabackup_get_val(EVENT, KEY); \ - if (dbug_val) CODE }) +extern void dbug_mariabackup_event( + const char *event, const fil_space_t::name_type key, bool need_lock); +#define DBUG_MARIABACKUP_EVENT(A, B) \ + DBUG_EXECUTE_IF("mariabackup_events", \ + dbug_mariabackup_event(A,B,false);); +#define DBUG_MARIABACKUP_EVENT_LOCK(A, B) \ + DBUG_EXECUTE_IF("mariabackup_events", \ + dbug_mariabackup_event(A,B, true);); +#define DBUG_EXECUTE_FOR_KEY(EVENT, KEY, CODE) \ + DBUG_EXECUTE_IF("mariabackup_inject_code", {\ + char *dbug_val = dbug_mariabackup_get_val(EVENT, KEY); \ + if (dbug_val && *dbug_val) CODE \ + }) #else +#define DBUG_MARIABACKUP_EVENT(A,B) +#define DBUG_MARIABACKUP_EVENT_LOCK(A,B) #define DBUG_EXECUTE_FOR_KEY(EVENT, KEY, CODE) #endif - diff -Nru mariadb-10.11.6/extra/mariabackup/backup_mysql.cc mariadb-10.11.9/extra/mariabackup/backup_mysql.cc --- mariadb-10.11.6/extra/mariabackup/backup_mysql.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/backup_mysql.cc 2024-08-03 07:29:56.000000000 +0000 @@ -47,6 +47,12 @@ #include #include #include +#ifdef HAVE_PWD_H +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#include +#endif #include "common.h" #include "xtrabackup.h" #include "srv0srv.h" @@ -54,19 +60,19 @@ #include "backup_copy.h" #include "backup_mysql.h" #include "mysqld.h" -#include "xb_plugin.h" +#include "encryption_plugin.h" #include #include #include "page0zip.h" +#include "backup_debug.h" char *tool_name; -char tool_args[2048]; +char tool_args[8192]; ulong mysql_server_version; /* server capabilities */ bool have_changed_page_bitmaps = false; -bool have_backup_locks = false; bool have_lock_wait_timeout = false; bool have_galera_enabled = false; bool have_multi_threaded_slave = false; @@ -92,11 +98,54 @@ extern my_bool opt_ssl_verify_server_cert, opt_use_ssl; + +/* + get_os_user() + Ressemles read_user_name() from libmariadb/libmariadb/mariadb_lib.c. +*/ + +#if !defined(_WIN32) + +#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL) +struct passwd *getpwuid(uid_t); +char* getlogin(void); +#endif + +static const char *get_os_user() // Posix +{ + if (!geteuid()) + return "root"; +#ifdef HAVE_GETPWUID + struct passwd *pw; + const char *str; + if ((pw= getpwuid(geteuid())) != NULL) + return pw->pw_name; + if ((str= getlogin()) != NULL) + return str; +#endif + if ((str= getenv("USER")) || + (str= getenv("LOGNAME")) || + (str= getenv("LOGIN"))) + return str; + return NULL; +} + +#else + +static const char *get_os_user() // Windows +{ + return getenv("USERNAME"); +} + +#endif // _WIN32 + + MYSQL * xb_mysql_connect() { MYSQL *connection = mysql_init(NULL); char mysql_port_str[std::numeric_limits::digits10 + 3]; + const char *user= opt_user ? opt_user : get_os_user(); sprintf(mysql_port_str, "%d", opt_port); @@ -126,7 +175,7 @@ msg("Connecting to MariaDB server host: %s, user: %s, password: %s, " "port: %s, socket: %s", opt_host ? opt_host : "localhost", - opt_user ? opt_user : "not set", + user ? user : "not set", opt_password ? "set" : "not set", opt_port != 0 ? mysql_port_str : "not set", opt_socket ? opt_socket : "not set"); @@ -147,7 +196,7 @@ if (!mysql_real_connect(connection, opt_host ? opt_host : "localhost", - opt_user, + user, opt_password, "" /*database*/, opt_port, opt_socket, 0)) { @@ -203,13 +252,14 @@ static -void +uint read_mysql_variables(MYSQL *connection, const char *query, mysql_variable *vars, bool vertical_result) { MYSQL_RES *mysql_result; MYSQL_ROW row; mysql_variable *var; + uint n_values=0; mysql_result = xb_mysql_query(connection, query, true); @@ -223,6 +273,7 @@ if (strcmp(var->name, name) == 0 && value != NULL) { *(var->value) = strdup(value); + n_values++; } } } @@ -239,6 +290,7 @@ if (strcmp(var->name, name) == 0 && value != NULL) { *(var->value) = strdup(value); + n_values++; } } ++i; @@ -247,6 +299,7 @@ } mysql_free_result(mysql_result); + return n_values; } @@ -311,7 +364,6 @@ { char *gtid_mode_var= NULL; char *version_var= NULL; - char *have_backup_locks_var= NULL; char *log_bin_var= NULL; char *lock_wait_timeout_var= NULL; char *wsrep_on_var= NULL; @@ -336,7 +388,6 @@ bool ret= true; mysql_variable mysql_vars[]= { - {"have_backup_locks", &have_backup_locks_var}, {"log_bin", &log_bin_var}, {"lock_wait_timeout", &lock_wait_timeout_var}, {"gtid_mode", >id_mode_var}, @@ -361,11 +412,6 @@ read_mysql_variables(connection, "SHOW VARIABLES", mysql_vars, true); - if (have_backup_locks_var != NULL && !opt_no_backup_locks) - { - have_backup_locks= true; - } - if (opt_binlog_info == BINLOG_INFO_AUTO) { if (log_bin_var != NULL && !strcmp(log_bin_var, "ON")) @@ -512,24 +558,6 @@ bool detect_mysql_capabilities_for_backup() { - const char *query = "SELECT 'INNODB_CHANGED_PAGES', COUNT(*) FROM " - "INFORMATION_SCHEMA.PLUGINS " - "WHERE PLUGIN_NAME LIKE 'INNODB_CHANGED_PAGES'"; - char *innodb_changed_pages = NULL; - mysql_variable vars[] = { - {"INNODB_CHANGED_PAGES", &innodb_changed_pages}, {NULL, NULL}}; - - if (xtrabackup_incremental) { - - read_mysql_variables(mysql_connection, query, vars, true); - - ut_ad(innodb_changed_pages != NULL); - - have_changed_page_bitmaps = (atoi(innodb_changed_pages) == 1); - - free_mysql_variables(vars); - } - /* do some sanity checks */ if (opt_galera_info && !have_galera_enabled) { msg("--galera-info is specified on the command " @@ -837,11 +865,11 @@ /*********************************************************************//** -Function acquires either a backup tables lock, if supported -by the server, or a global read lock (FLUSH TABLES WITH READ LOCK) -otherwise. +Function acquires backup locks @returns true if lock acquired */ -bool lock_tables(MYSQL *connection) + +bool +lock_for_backup_stage_start(MYSQL *connection) { if (have_lock_wait_timeout || opt_lock_wait_timeout) { @@ -854,12 +882,6 @@ xb_mysql_query(connection, buf, false); } - if (have_backup_locks) - { - msg("Executing LOCK TABLES FOR BACKUP..."); - xb_mysql_query(connection, "LOCK TABLES FOR BACKUP", false); - return (true); - } if (opt_lock_wait_timeout) { @@ -884,8 +906,6 @@ xb_mysql_query(connection, "BACKUP STAGE START", true); DBUG_MARIABACKUP_EVENT("after_backup_stage_start", {}); - xb_mysql_query(connection, "BACKUP STAGE BLOCK_COMMIT", true); - DBUG_MARIABACKUP_EVENT("after_backup_stage_block_commit", {}); /* Set the maximum supported session value for lock_wait_timeout to prevent unnecessary timeouts when the global value is changed from the default */ @@ -901,24 +921,68 @@ return (true); } -/*********************************************************************//** -If backup locks are used, execute LOCK BINLOG FOR BACKUP provided that we are -not in the --no-lock mode and the lock has not been acquired already. -@returns true if lock acquired */ bool -lock_binlog_maybe(MYSQL *connection) -{ - if (have_backup_locks && !opt_no_lock && !binlog_locked) { - msg("Executing LOCK BINLOG FOR BACKUP..."); - xb_mysql_query(connection, "LOCK BINLOG FOR BACKUP", false); - binlog_locked = true; +lock_for_backup_stage_flush(MYSQL *connection) { + if (opt_kill_long_queries_timeout) { + start_query_killer(); + } + xb_mysql_query(connection, "BACKUP STAGE FLUSH", true); + if (opt_kill_long_queries_timeout) { + stop_query_killer(); + } + return true; +} - return(true); +bool +lock_for_backup_stage_block_ddl(MYSQL *connection) { + if (opt_kill_long_queries_timeout) { + start_query_killer(); + } + xb_mysql_query(connection, "BACKUP STAGE BLOCK_DDL", true); + DBUG_MARIABACKUP_EVENT("after_backup_stage_block_ddl", {}); + if (opt_kill_long_queries_timeout) { + stop_query_killer(); } + return true; +} - return(false); +bool +lock_for_backup_stage_commit(MYSQL *connection) { + if (opt_kill_long_queries_timeout) { + start_query_killer(); + } + xb_mysql_query(connection, "BACKUP STAGE BLOCK_COMMIT", true); + DBUG_MARIABACKUP_EVENT("after_backup_stage_block_commit", {}); + if (opt_kill_long_queries_timeout) { + stop_query_killer(); + } + return true; +} + +bool backup_lock(MYSQL *con, const char *table_name) { + static const std::string backup_lock_prefix("BACKUP LOCK "); + std::string backup_lock_query = backup_lock_prefix + table_name; + xb_mysql_query(con, backup_lock_query.c_str(), true); + return true; +} + +bool backup_unlock(MYSQL *con) { + xb_mysql_query(con, "BACKUP UNLOCK", true); + return true; } +std::unordered_set +get_tables_in_use(MYSQL *con) { + std::unordered_set result; + MYSQL_RES *q_res = + xb_mysql_query(con, "SHOW OPEN TABLES WHERE In_use = 1", true); + while (MYSQL_ROW row = mysql_fetch_row(q_res)) { + auto tk = table_key(row[0], row[1]); + msg("Table %s is in use", tk.c_str()); + result.insert(std::move(tk)); + } + return result; +} /*********************************************************************//** Releases either global read lock acquired with FTWRL and the binlog @@ -1353,53 +1417,103 @@ /*********************************************************************//** -Retrieves MySQL Galera and -saves it in a file. It also prints it to stdout. */ +Retrieves MySQL Galera and saves it in a file. It also prints it to stdout. + +We should create xtrabackup_galelera_info file even when backup locks +are used because donor's wsrep_gtid_domain_id is needed later in joiner. +Note that at this stage wsrep_local_state_uuid and wsrep_last_committed +are inconsistent but they are not used in joiner. Joiner will rewrite this file +at mariabackup --prepare phase and thus there is extra file donor_galera_info. +Information is needed to maitain wsrep_gtid_domain_id and gtid_binlog_pos +same across the cluster. If joiner node have different wsrep_gtid_domain_id +we should still receive effective domain id from the donor node, +and use it. +*/ bool write_galera_info(ds_ctxt *datasink, MYSQL *connection) { - char *state_uuid = NULL, *state_uuid55 = NULL; - char *last_committed = NULL, *last_committed55 = NULL; - bool result; + char *state_uuid = NULL, *state_uuid55 = NULL; + char *last_committed = NULL, *last_committed55 = NULL; + char *domain_id = NULL, *domain_id55 = NULL; + bool result=true; + uint n_values=0; + char *wsrep_on = NULL, *wsrep_on55 = NULL; - mysql_variable status[] = { - {"Wsrep_local_state_uuid", &state_uuid}, - {"wsrep_local_state_uuid", &state_uuid55}, - {"Wsrep_last_committed", &last_committed}, - {"wsrep_last_committed", &last_committed55}, - {NULL, NULL} - }; + mysql_variable vars[] = { + {"Wsrep_on", &wsrep_on}, + {"wsrep_on", &wsrep_on55}, + {NULL, NULL} + }; - /* When backup locks are supported by the server, we should skip - creating xtrabackup_galera_info file on the backup stage, because - wsrep_local_state_uuid and wsrep_last_committed will be inconsistent - without blocking commits. The state file will be created on the prepare - stage using the WSREP recovery procedure. */ - if (have_backup_locks) { - return(true); - } + mysql_variable status[] = { + {"Wsrep_local_state_uuid", &state_uuid}, + {"wsrep_local_state_uuid", &state_uuid55}, + {"Wsrep_last_committed", &last_committed}, + {"wsrep_last_committed", &last_committed55}, + {NULL, NULL} + }; - read_mysql_variables(connection, "SHOW STATUS", status, true); - - if ((state_uuid == NULL && state_uuid55 == NULL) - || (last_committed == NULL && last_committed55 == NULL)) { - msg("Warning: failed to get master wsrep state from SHOW STATUS."); - result = true; - goto cleanup; - } + mysql_variable value[] = { + {"Wsrep_gtid_domain_id", &domain_id}, + {"wsrep_gtid_domain_id", &domain_id55}, + {NULL, NULL} + }; - result = datasink->backup_file_printf(XTRABACKUP_GALERA_INFO, - "%s:%s\n", state_uuid ? state_uuid : state_uuid55, - last_committed ? last_committed : last_committed55); - if (result) - { - write_current_binlog_file(datasink, connection); - } + n_values= read_mysql_variables(connection, "SHOW VARIABLES", vars, true); + + if (n_values == 0 || (wsrep_on == NULL && wsrep_on55 == NULL)) + { + msg("Server is not Galera node thus --galera-info does not " + "have any effect."); + result = true; + goto cleanup; + } + + read_mysql_variables(connection, "SHOW STATUS", status, true); + + if ((state_uuid == NULL && state_uuid55 == NULL) + || (last_committed == NULL && last_committed55 == NULL)) + { + msg("Warning: failed to get master wsrep state from SHOW STATUS."); + result = true; + goto cleanup; + } + + n_values= read_mysql_variables(connection, "SHOW VARIABLES LIKE 'wsrep%'", value, true); + + if (n_values == 0 || (domain_id == NULL && domain_id55 == NULL)) + { + msg("Warning: failed to get master wsrep state from SHOW VARIABLES."); + result = true; + goto cleanup; + } + + result= datasink->backup_file_printf(XTRABACKUP_GALERA_INFO, + "%s:%s %s\n", state_uuid ? state_uuid : state_uuid55, + last_committed ? last_committed : last_committed55, + domain_id ? domain_id : domain_id55); + + if (result) + { + result= datasink->backup_file_printf(XTRABACKUP_DONOR_GALERA_INFO, + "%s:%s %s\n", state_uuid ? state_uuid : state_uuid55, + last_committed ? last_committed : last_committed55, + domain_id ? domain_id : domain_id55); + } + + if (result) + write_current_binlog_file(datasink, connection); + + if (result) + msg("Writing Galera info succeeded with %s:%s %s", + state_uuid ? state_uuid : state_uuid55, + last_committed ? last_committed : last_committed55, + domain_id ? domain_id : domain_id55); cleanup: - free_mysql_variables(status); + free_mysql_variables(status); - return(result); + return(result); } @@ -1442,8 +1556,6 @@ if (gtid_exists) { size_t log_bin_dir_length; - lock_binlog_maybe(connection); - xb_mysql_query(connection, "FLUSH BINARY LOGS", false); read_mysql_variables(connection, "SHOW MASTER STATUS", @@ -1802,13 +1914,13 @@ srv_log_file_size, srv_page_size, srv_undo_dir, - srv_undo_tablespaces, + (uint) srv_undo_tablespaces, page_zip_level, innobase_buffer_pool_filename ? "innodb_buffer_pool_filename=" : "", innobase_buffer_pool_filename ? innobase_buffer_pool_filename : "", - xb_plugin_get_config()); + encryption_plugin_get_config()); return rc; } @@ -1824,12 +1936,22 @@ while (argc > 0 && left > 0) { arg = *argv; - if (strncmp(*argv, "--password", strlen("--password")) == 0) { + if (strncmp(*argv, STRING_WITH_LEN("--password=")) == 0) { arg = "--password=..."; + } else + if (strcmp(*argv, "--password") == 0) { + arg = "--password ..."; + ++argv; --argc; + } else + if (strncmp(*argv, STRING_WITH_LEN("-p")) == 0) { + arg = "-p..."; } - left-= snprintf(buf + len - left, left, + + uint l= snprintf(buf + len - left, left, "%s%c", arg, argc > 1 ? ' ' : 0); ++argv; --argc; + if (l < left) + left-= l; } return buf; @@ -1858,18 +1980,6 @@ return(true); } -bool -flush_changed_page_bitmaps() -{ - if (xtrabackup_incremental && have_changed_page_bitmaps && - !xtrabackup_incremental_force_scan) { - xb_mysql_query(mysql_connection, - "FLUSH NO_WRITE_TO_BINLOG CHANGED_PAGE_BITMAPS", false); - } - return(true); -} - - /*********************************************************************//** Deallocate memory, disconnect from server, etc. @return true on success. */ @@ -1945,3 +2055,23 @@ mysql_close(mdl_con); spaceid_to_tablename.clear(); } + +ulonglong get_current_lsn(MYSQL *connection) +{ + static const char lsn_prefix[] = "\nLog sequence number "; + ulonglong lsn = 0; + if (MYSQL_RES *res = xb_mysql_query(connection, + "SHOW ENGINE INNODB STATUS", + true, false)) { + if (MYSQL_ROW row = mysql_fetch_row(res)) { + const char *p= strstr(row[2], lsn_prefix); + DBUG_ASSERT(p); + if (p) { + p += sizeof lsn_prefix - 1; + lsn = lsn_t(strtoll(p, NULL, 10)); + } + } + mysql_free_result(res); + } + return lsn; +} diff -Nru mariadb-10.11.6/extra/mariabackup/backup_mysql.h mariadb-10.11.9/extra/mariabackup/backup_mysql.h --- mariadb-10.11.6/extra/mariabackup/backup_mysql.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/backup_mysql.h 2024-08-03 07:29:56.000000000 +0000 @@ -2,13 +2,15 @@ #define XTRABACKUP_BACKUP_MYSQL_H #include +#include +#include +#include "datasink.h" /* MariaDB version */ extern ulong mysql_server_version; /* server capabilities */ extern bool have_changed_page_bitmaps; -extern bool have_backup_locks; extern bool have_lock_wait_timeout; extern bool have_galera_enabled; extern bool have_multi_threaded_slave; @@ -35,9 +37,6 @@ bool select_history(); -bool -flush_changed_page_bitmaps(); - void backup_cleanup(); @@ -75,7 +74,21 @@ lock_binlog_maybe(MYSQL *connection); bool -lock_tables(MYSQL *connection); +lock_for_backup_stage_start(MYSQL *connection); + +bool +lock_for_backup_stage_flush(MYSQL *connection); + +bool +lock_for_backup_stage_block_ddl(MYSQL *connection); + +bool +lock_for_backup_stage_commit(MYSQL *connection); + +bool backup_lock(MYSQL *con, const char *table_name); +bool backup_unlock(MYSQL *con); + +std::unordered_set get_tables_in_use(MYSQL *con); bool wait_for_safe_slave(MYSQL *connection); @@ -86,5 +99,6 @@ bool write_slave_info(ds_ctxt *datasink, MYSQL *connection); +ulonglong get_current_lsn(MYSQL *connection); #endif diff -Nru mariadb-10.11.6/extra/mariabackup/changed_page_bitmap.cc mariadb-10.11.9/extra/mariabackup/changed_page_bitmap.cc --- mariadb-10.11.6/extra/mariabackup/changed_page_bitmap.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/changed_page_bitmap.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,1040 +0,0 @@ -/****************************************************** -XtraBackup: hot backup tool for InnoDB -(c) 2009-2012 Percona Inc. -Originally Created 3/3/2009 Yasufumi Kinoshita -Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, -Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. - -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; version 2 of the License. - -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, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*******************************************************/ - -/* Changed page bitmap implementation */ - -#include "changed_page_bitmap.h" - -#include "common.h" -#include "xtrabackup.h" -#include "srv0srv.h" - -/* TODO: copy-pasted shared definitions from the XtraDB bitmap write code. -Remove these on the first opportunity, i.e. single-binary XtraBackup. */ - -/* log0online.h */ - -/** Single bitmap file information */ -struct log_online_bitmap_file_t { - char name[FN_REFLEN]; /*!< Name with full path */ - pfs_os_file_t file; /*!< Handle to opened file */ - ib_uint64_t size; /*!< Size of the file */ - ib_uint64_t offset; /*!< Offset of the next read, - or count of already-read bytes - */ -}; - -/** A set of bitmap files containing some LSN range */ -struct log_online_bitmap_file_range_t { - size_t count; /*!< Number of files */ - /*!< Dynamically-allocated array of info about individual files */ - struct files_t { - char name[FN_REFLEN];/*!< Name of a file */ - lsn_t start_lsn; /*!< Starting LSN of data in this - file */ - ulong seq_num; /*!< Sequence number of this file */ - } *files; -}; - -/* log0online.c */ - -/** File name stem for bitmap files. */ -static const char* bmp_file_name_stem = "ib_modified_log_"; - -/** The bitmap file block size in bytes. All writes will be multiples of this. - */ -enum { - MODIFIED_PAGE_BLOCK_SIZE = 4096 -}; - -/** Offsets in a file bitmap block */ -enum { - MODIFIED_PAGE_IS_LAST_BLOCK = 0,/* 1 if last block in the current - write, 0 otherwise. */ - MODIFIED_PAGE_START_LSN = 4, /* The starting tracked LSN of this and - other blocks in the same write */ - MODIFIED_PAGE_END_LSN = 12, /* The ending tracked LSN of this and - other blocks in the same write */ - MODIFIED_PAGE_SPACE_ID = 20, /* The space ID of tracked pages in - this block */ - MODIFIED_PAGE_1ST_PAGE_ID = 24, /* The page ID of the first tracked - page in this block */ - MODIFIED_PAGE_BLOCK_UNUSED_1 = 28,/* Unused in order to align the start - of bitmap at 8 byte boundary */ - MODIFIED_PAGE_BLOCK_BITMAP = 32,/* Start of the bitmap itself */ - MODIFIED_PAGE_BLOCK_UNUSED_2 = MODIFIED_PAGE_BLOCK_SIZE - 8, - /* Unused in order to align the end of - bitmap at 8 byte boundary */ - MODIFIED_PAGE_BLOCK_CHECKSUM = MODIFIED_PAGE_BLOCK_SIZE - 4 - /* The checksum of the current block */ -}; - -/** Length of the bitmap data in a block */ -enum { MODIFIED_PAGE_BLOCK_BITMAP_LEN - = MODIFIED_PAGE_BLOCK_UNUSED_2 - MODIFIED_PAGE_BLOCK_BITMAP }; - -/** Length of the bitmap data in a block in page ids */ -enum { MODIFIED_PAGE_BLOCK_ID_COUNT = MODIFIED_PAGE_BLOCK_BITMAP_LEN * 8 }; - -typedef ib_uint64_t bitmap_word_t; - -/****************************************************************//** -Calculate a bitmap block checksum. Algorithm borrowed from -log_block_calc_checksum. -@return checksum */ -UNIV_INLINE -ulint -log_online_calc_checksum( -/*=====================*/ - const byte* block); /*! p2 -*/ -static -int -log_online_compare_bmp_keys( -/*========================*/ - const void* p1, /*! k2_start_page ? 1 : 0; - } - return k1_space < k2_space ? -1 : 1; -} - -/****************************************************************//** -Calculate a bitmap block checksum. Algorithm borrowed from -log_block_calc_checksum. -@return checksum */ -UNIV_INLINE -ulint -log_online_calc_checksum( -/*=====================*/ - const byte* block) /*! 24) { - - sh = 0; - } - } - - return sum; -} - -/****************************************************************//** -Read one bitmap data page and check it for corruption. - -@return TRUE if page read OK, FALSE if I/O error */ -static -ibool -log_online_read_bitmap_page( -/*========================*/ - log_online_bitmap_file_t *bitmap_file, /*!size >= MODIFIED_PAGE_BLOCK_SIZE); - ut_a(bitmap_file->offset - <= bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE); - ut_a(bitmap_file->offset % MODIFIED_PAGE_BLOCK_SIZE == 0); - if (DB_SUCCESS != - os_file_read(IORequestRead, bitmap_file->file, page, - bitmap_file->offset, MODIFIED_PAGE_BLOCK_SIZE, - nullptr)) { - /* The following call prints an error message */ - os_file_get_last_error(TRUE); - msg("InnoDB: Warning: failed reading changed page bitmap " - "file \'%s\'", bitmap_file->name); - return FALSE; - } - - bitmap_file->offset += MODIFIED_PAGE_BLOCK_SIZE; - ut_ad(bitmap_file->offset <= bitmap_file->size); - - checksum = mach_read_from_4(page + MODIFIED_PAGE_BLOCK_CHECKSUM); - actual_checksum = log_online_calc_checksum(page); - *checksum_ok = (checksum == actual_checksum); - - return TRUE; -} - -/*********************************************************************//** -Check the name of a given file if it's a changed page bitmap file and -return file sequence and start LSN name components if it is. If is not, -the values of output parameters are undefined. - -@return TRUE if a given file is a changed page bitmap file. */ -static -ibool -log_online_is_bitmap_file( -/*======================*/ - const os_file_stat_t* file_info, /*!name) < OS_FILE_MAX_PATH); - - return ((file_info->type == OS_FILE_TYPE_FILE - || file_info->type == OS_FILE_TYPE_LINK) - && (sscanf(file_info->name, "%[a-z_]%lu_" LSN_PF ".xdb", stem, - bitmap_file_seq_num, bitmap_file_start_lsn) == 3) - && (!strcmp(stem, bmp_file_name_stem))); -} - -/*********************************************************************//** -List the bitmap files in srv_data_home and setup their range that contains the -specified LSN interval. This range, if non-empty, will start with a file that -has the greatest LSN equal to or less than the start LSN and will include all -the files up to the one with the greatest LSN less than the end LSN. Caller -must free bitmap_files->files when done if bitmap_files set to non-NULL and -this function returned TRUE. Field bitmap_files->count might be set to a -larger value than the actual count of the files, and space for the unused array -slots will be allocated but cleared to zeroes. - -@return TRUE if succeeded -*/ -static -ibool -log_online_setup_bitmap_file_range( -/*===============================*/ - log_online_bitmap_file_range_t *bitmap_files, /*!= range_start); - - bitmap_files->count = 0; - bitmap_files->files = NULL; - - /* 1st pass: size the info array */ - - bitmap_dir = os_file_opendir(srv_data_home); - if (UNIV_UNLIKELY(bitmap_dir == IF_WIN(INVALID_HANDLE_VALUE, NULL))) { - msg("InnoDB: Error: failed to open bitmap directory \'%s\'", - srv_data_home); - return FALSE; - } - - while (!os_file_readdir_next_file(srv_data_home, bitmap_dir, - &bitmap_dir_file_info)) { - - ulong file_seq_num; - lsn_t file_start_lsn; - - if (!log_online_is_bitmap_file(&bitmap_dir_file_info, - &file_seq_num, - &file_start_lsn) - || file_start_lsn >= range_end) { - - continue; - } - - if (file_seq_num > last_file_seq_num) { - - last_file_seq_num = file_seq_num; - } - - if (file_start_lsn >= range_start - || file_start_lsn == first_file_start_lsn - || first_file_start_lsn > range_start) { - - /* A file that falls into the range */ - - if (file_start_lsn < first_file_start_lsn) { - - first_file_start_lsn = file_start_lsn; - } - if (file_seq_num < first_file_seq_num) { - - first_file_seq_num = file_seq_num; - } - } else if (file_start_lsn > first_file_start_lsn) { - - /* A file that has LSN closer to the range start - but smaller than it, replacing another such file */ - first_file_start_lsn = file_start_lsn; - first_file_seq_num = file_seq_num; - } - } - - if (UNIV_UNLIKELY(os_file_closedir_failed(bitmap_dir))) { - os_file_get_last_error(TRUE); - msg("InnoDB: Error: cannot close \'%s\'",srv_data_home); - return FALSE; - } - - if (first_file_seq_num == ULONG_MAX && last_file_seq_num == 0) { - - bitmap_files->count = 0; - return TRUE; - } - - bitmap_files->count = last_file_seq_num - first_file_seq_num + 1; - - /* 2nd pass: get the file names in the file_seq_num order */ - - bitmap_dir = os_file_opendir(srv_data_home); - if (UNIV_UNLIKELY(bitmap_dir == IF_WIN(INVALID_HANDLE_VALUE, NULL))) { - msg("InnoDB: Error: failed to open bitmap directory \'%s\'", - srv_data_home); - return FALSE; - } - - bitmap_files->files = - static_cast - (malloc(bitmap_files->count * sizeof(bitmap_files->files[0]))); - memset(bitmap_files->files, 0, - bitmap_files->count * sizeof(bitmap_files->files[0])); - - while (!os_file_readdir_next_file(srv_data_home, bitmap_dir, - &bitmap_dir_file_info)) { - - ulong file_seq_num; - lsn_t file_start_lsn; - size_t array_pos; - - if (!log_online_is_bitmap_file(&bitmap_dir_file_info, - &file_seq_num, - &file_start_lsn) - || file_start_lsn >= range_end - || file_start_lsn < first_file_start_lsn) { - - continue; - } - - array_pos = file_seq_num - first_file_seq_num; - if (UNIV_UNLIKELY(array_pos >= bitmap_files->count)) { - - msg("InnoDB: Error: inconsistent bitmap file " - "directory"); - os_file_closedir(bitmap_dir); - free(bitmap_files->files); - return FALSE; - } - - if (file_seq_num > bitmap_files->files[array_pos].seq_num) { - - bitmap_files->files[array_pos].seq_num = file_seq_num; - strncpy(bitmap_files->files[array_pos].name, - bitmap_dir_file_info.name, FN_REFLEN - 1); - bitmap_files->files[array_pos].name[FN_REFLEN - 1] - = '\0'; - bitmap_files->files[array_pos].start_lsn - = file_start_lsn; - } - } - - if (UNIV_UNLIKELY(os_file_closedir_failed(bitmap_dir))) { - os_file_get_last_error(TRUE); - msg("InnoDB: Error: cannot close \'%s\'", srv_data_home); - free(bitmap_files->files); - return FALSE; - } - -#ifdef UNIV_DEBUG - ut_ad(bitmap_files->files[0].seq_num == first_file_seq_num); - - for (size_t i = 1; i < bitmap_files->count; i++) { - if (!bitmap_files->files[i].seq_num) { - - break; - } - ut_ad(bitmap_files->files[i].seq_num - > bitmap_files->files[i - 1].seq_num); - ut_ad(bitmap_files->files[i].start_lsn - >= bitmap_files->files[i - 1].start_lsn); - } -#endif - - return TRUE; -} - -/****************************************************************//** -Open a bitmap file for reading. - -@return whether opened successfully */ -static -bool -log_online_open_bitmap_file_read_only( -/*==================================*/ - const char* name, /*!name, FN_REFLEN, "%s%s", srv_data_home, name); - bitmap_file->file = os_file_create_simple_no_error_handling( - 0, bitmap_file->name, - OS_FILE_OPEN, OS_FILE_READ_ONLY, true, &success); - if (UNIV_UNLIKELY(!success)) { - - /* Here and below assume that bitmap file names do not - contain apostrophes, thus no need for ut_print_filename(). */ - msg("InnoDB: Warning: error opening the changed page " - "bitmap \'%s\'", bitmap_file->name); - return success; - } - - bitmap_file->size = os_file_get_size(bitmap_file->file); - bitmap_file->offset = 0; - -#ifdef __linux__ - posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_SEQUENTIAL); - posix_fadvise(bitmap_file->file, 0, 0, POSIX_FADV_NOREUSE); -#endif - - return success; -} - -/****************************************************************//** -Diagnose one or both of the following situations if we read close to -the end of bitmap file: -1) Warn if the remainder of the file is less than one page. -2) Error if we cannot read any more full pages but the last read page -did not have the last-in-run flag set. - -@return FALSE for the error */ -static -ibool -log_online_diagnose_bitmap_eof( -/*===========================*/ - const log_online_bitmap_file_t* bitmap_file, /*!< in: bitmap file */ - ibool last_page_in_run)/*!< in: "last page in - run" flag value in the - last read page */ -{ - /* Check if we are too close to EOF to read a full page */ - if ((bitmap_file->size < MODIFIED_PAGE_BLOCK_SIZE) - || (bitmap_file->offset - > bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE)) { - - if (UNIV_UNLIKELY(bitmap_file->offset != bitmap_file->size)) { - - /* If we are not at EOF and we have less than one page - to read, it's junk. This error is not fatal in - itself. */ - - msg("InnoDB: Warning: junk at the end of changed " - "page bitmap file \'%s\'.", bitmap_file->name); - } - - if (UNIV_UNLIKELY(!last_page_in_run)) { - - /* We are at EOF but the last read page did not finish - a run */ - /* It's a "Warning" here because it's not a fatal error - for the whole server */ - msg("InnoDB: Warning: changed page bitmap " - "file \'%s\' does not contain a complete run " - "at the end.", bitmap_file->name); - return FALSE; - } - } - return TRUE; -} - -/* End of copy-pasted definitions */ - -/** Iterator structure over changed page bitmap */ -struct xb_page_bitmap_range_struct { - const xb_page_bitmap *bitmap; /* Bitmap with data */ - ulint space_id; /* Space id for this - iterator */ - ulint bit_i; /* Bit index of the iterator - position in the current page */ - const ib_rbt_node_t *bitmap_node; /* Current bitmap tree node */ - const byte *bitmap_page; /* Current bitmap page */ - ulint current_page_id;/* Current page id */ -}; - -/****************************************************************//** -Print a diagnostic message on missing bitmap data for an LSN range. */ -static -void -xb_msg_missing_lsn_data( -/*====================*/ - lsn_t missing_interval_start, /*!size >= MODIFIED_PAGE_BLOCK_SIZE); - - *page_end_lsn = 0; - - while ((*page_end_lsn <= lsn) - && (bitmap_file->offset - <= bitmap_file->size - MODIFIED_PAGE_BLOCK_SIZE)) { - - next_to_last_page_ok = last_page_ok; - if (!log_online_read_bitmap_page(bitmap_file, page, - &last_page_ok)) { - - return FALSE; - } - - *page_end_lsn = mach_read_from_8(page + MODIFIED_PAGE_END_LSN); - } - - /* We check two pages here because the last read page already contains - the required LSN data. If the next to the last one page is corrupted, - then we have no way of telling if that page contained the required LSN - range data too */ - return last_page_ok && next_to_last_page_ok; -} - -/****************************************************************//** -Read the disk bitmap and build the changed page bitmap tree for the -LSN interval incremental_lsn to log_sys.next_checkpoint_lsn. - -@return the built bitmap tree or NULL if unable to read the full interval for -any reason. */ -xb_page_bitmap* -xb_page_bitmap_init(void) -/*=====================*/ -{ - log_online_bitmap_file_t bitmap_file; - lsn_t bmp_start_lsn = incremental_lsn; - const lsn_t bmp_end_lsn{log_sys.next_checkpoint_lsn}; - byte page[MODIFIED_PAGE_BLOCK_SIZE]; - lsn_t current_page_end_lsn; - xb_page_bitmap *result; - ibool last_page_in_run= FALSE; - log_online_bitmap_file_range_t bitmap_files; - size_t bmp_i; - ibool last_page_ok = TRUE; - - if (UNIV_UNLIKELY(bmp_start_lsn > bmp_end_lsn)) { - - msg("mariabackup: incremental backup LSN " LSN_PF - " is larger than than the last checkpoint LSN " LSN_PF - , bmp_start_lsn, bmp_end_lsn); - return NULL; - } - - if (!log_online_setup_bitmap_file_range(&bitmap_files, bmp_start_lsn, - bmp_end_lsn)) { - - return NULL; - } - - /* Only accept no bitmap files returned if start LSN == end LSN */ - if (bitmap_files.count == 0 && bmp_end_lsn != bmp_start_lsn) { - - return NULL; - } - - result = rbt_create(MODIFIED_PAGE_BLOCK_SIZE, - log_online_compare_bmp_keys); - - if (bmp_start_lsn == bmp_end_lsn) { - - /* Empty range - empty bitmap */ - return result; - } - - bmp_i = 0; - - if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].start_lsn - > bmp_start_lsn)) { - - /* The 1st file does not have the starting LSN data */ - xb_msg_missing_lsn_data(bmp_start_lsn, - bitmap_files.files[bmp_i].start_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* Skip any zero-sized files at the start */ - while ((bmp_i < bitmap_files.count - 1) - && (bitmap_files.files[bmp_i].start_lsn - == bitmap_files.files[bmp_i + 1].start_lsn)) { - - bmp_i++; - } - - /* Is the 1st bitmap file missing? */ - if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].name[0] == '\0')) { - - /* TODO: this is not the exact missing range */ - xb_msg_missing_lsn_data(bmp_start_lsn, bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* Open the 1st bitmap file */ - if (UNIV_UNLIKELY(!log_online_open_bitmap_file_read_only( - bitmap_files.files[bmp_i].name, - &bitmap_file))) { - - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* If the 1st file is truncated, no data. Not merged with the case - below because zero-length file indicates not a corruption but missing - subsequent files instead. */ - if (UNIV_UNLIKELY(bitmap_file.size < MODIFIED_PAGE_BLOCK_SIZE)) { - - xb_msg_missing_lsn_data(bmp_start_lsn, bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - /* Find the start of the required LSN range in the file */ - if (UNIV_UNLIKELY(!xb_find_lsn_in_bitmap_file(&bitmap_file, page, - ¤t_page_end_lsn, - bmp_start_lsn))) { - - msg("mariabackup: Warning: changed page bitmap file " - "\'%s\' corrupted", bitmap_file.name); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - last_page_in_run - = mach_read_from_4(page + MODIFIED_PAGE_IS_LAST_BLOCK); - - if (UNIV_UNLIKELY(!log_online_diagnose_bitmap_eof(&bitmap_file, - last_page_in_run))) { - - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - if (UNIV_UNLIKELY(current_page_end_lsn < bmp_start_lsn)) { - - xb_msg_missing_lsn_data(current_page_end_lsn, bmp_start_lsn); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - /* 1st bitmap page found, add it to the tree. */ - rbt_insert(result, page, page); - - /* Read next pages/files until all required data is read */ - while (last_page_ok - && (current_page_end_lsn < bmp_end_lsn - || (current_page_end_lsn == bmp_end_lsn - && !last_page_in_run))) { - - ib_rbt_bound_t tree_search_pos; - - /* If EOF, advance the file skipping over any empty files */ - while (bitmap_file.size < MODIFIED_PAGE_BLOCK_SIZE - || (bitmap_file.offset - > bitmap_file.size - MODIFIED_PAGE_BLOCK_SIZE)) { - - os_file_close(bitmap_file.file); - - if (UNIV_UNLIKELY( - !log_online_diagnose_bitmap_eof( - &bitmap_file, last_page_in_run))) { - - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - bmp_i++; - - if (UNIV_UNLIKELY(bmp_i == bitmap_files.count - || (bitmap_files.files[bmp_i].seq_num - == 0))) { - - xb_msg_missing_lsn_data(current_page_end_lsn, - bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - /* Is the next file missing? */ - if (UNIV_UNLIKELY(bitmap_files.files[bmp_i].name[0] - == '\0')) { - - /* TODO: this is not the exact missing range */ - xb_msg_missing_lsn_data(bitmap_files.files - [bmp_i - 1].start_lsn, - bmp_end_lsn); - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - - if (UNIV_UNLIKELY( - !log_online_open_bitmap_file_read_only( - bitmap_files.files[bmp_i].name, - &bitmap_file))) { - - rbt_free(result); - free(bitmap_files.files); - return NULL; - } - } - - if (UNIV_UNLIKELY( - !log_online_read_bitmap_page(&bitmap_file, page, - &last_page_ok))) { - - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - if (UNIV_UNLIKELY(!last_page_ok)) { - - msg("mariabackup: warning: changed page bitmap file " - "\'%s\' corrupted.", bitmap_file.name); - rbt_free(result); - free(bitmap_files.files); - os_file_close(bitmap_file.file); - return NULL; - } - - /* Merge the current page with an existing page or insert a new - page into the tree */ - - if (!rbt_search(result, &tree_search_pos, page)) { - - /* Merge the bitmap pages */ - byte *existing_page - = rbt_value(byte, tree_search_pos.last); - bitmap_word_t *bmp_word_1 = (bitmap_word_t *) - (existing_page + MODIFIED_PAGE_BLOCK_BITMAP); - bitmap_word_t *bmp_end = (bitmap_word_t *) - (existing_page + MODIFIED_PAGE_BLOCK_UNUSED_2); - bitmap_word_t *bmp_word_2 = (bitmap_word_t *) - (page + MODIFIED_PAGE_BLOCK_BITMAP); - while (bmp_word_1 < bmp_end) { - - *bmp_word_1++ |= *bmp_word_2++; - } - xb_a (bmp_word_1 == bmp_end); - } else { - - /* Add a new page */ - rbt_add_node(result, &tree_search_pos, page); - } - - current_page_end_lsn - = mach_read_from_8(page + MODIFIED_PAGE_END_LSN); - last_page_in_run - = mach_read_from_4(page + MODIFIED_PAGE_IS_LAST_BLOCK); - } - - xb_a (current_page_end_lsn >= bmp_end_lsn); - - free(bitmap_files.files); - os_file_close(bitmap_file.file); - - return result; -} - -/****************************************************************//** -Free the bitmap tree. */ -void -xb_page_bitmap_deinit( -/*==================*/ - xb_page_bitmap* bitmap) /*!bitmap_page has been -already found/bumped by rbt_search()/rbt_next(). - -@return FALSE if no more bitmap data for the range space ID */ -static -ibool -xb_page_bitmap_setup_next_page( -/*===========================*/ - xb_page_bitmap_range* bitmap_range) /*!bitmap_node == NULL) { - - bitmap_range->current_page_id = ULINT_UNDEFINED; - return FALSE; - } - - bitmap_range->bitmap_page = rbt_value(byte, bitmap_range->bitmap_node); - - new_space_id = mach_read_from_4(bitmap_range->bitmap_page - + MODIFIED_PAGE_SPACE_ID); - if (new_space_id != bitmap_range->space_id) { - - /* No more data for the current page id. */ - xb_a(new_space_id > bitmap_range->space_id); - bitmap_range->current_page_id = ULINT_UNDEFINED; - return FALSE; - } - - new_1st_page_id = mach_read_from_4(bitmap_range->bitmap_page + - MODIFIED_PAGE_1ST_PAGE_ID); - xb_a (new_1st_page_id >= bitmap_range->current_page_id - || bitmap_range->current_page_id == ULINT_UNDEFINED); - - bitmap_range->current_page_id = new_1st_page_id; - bitmap_range->bit_i = 0; - - return TRUE; -} - -/** Find the node with the smallest key that greater than equal to search key. -@param[in] tree red-black tree -@param[in] key search key -@return node with the smallest greater-than-or-equal key -@retval NULL if none was found */ -static -const ib_rbt_node_t* -rbt_lower_bound(const ib_rbt_t* tree, const void* key) -{ - ut_ad(!tree->cmp_arg); - const ib_rbt_node_t* ge = NULL; - - for (const ib_rbt_node_t *node = tree->root->left; - node != tree->nil; ) { - int result = tree->compare(node->value, key); - - if (result < 0) { - node = node->right; - } else { - ge = node; - if (result == 0) { - break; - } - - node = node->left; - } - } - - return(ge); -} - -/****************************************************************//** -Set up a new bitmap range iterator over a given space id changed -pages in a given bitmap. - -@return bitmap range iterator */ -xb_page_bitmap_range* -xb_page_bitmap_range_init( -/*======================*/ - xb_page_bitmap* bitmap, /*!< in: bitmap to iterate over */ - ulint space_id) /*!< in: space id */ -{ - byte search_page[MODIFIED_PAGE_BLOCK_SIZE]; - xb_page_bitmap_range *result - = static_cast(malloc(sizeof(*result))); - - memset(result, 0, sizeof(*result)); - result->bitmap = bitmap; - result->space_id = space_id; - result->current_page_id = ULINT_UNDEFINED; - - /* Search for the 1st page for the given space id */ - /* This also sets MODIFIED_PAGE_1ST_PAGE_ID to 0, which is what we - want. */ - memset(search_page, 0, MODIFIED_PAGE_BLOCK_SIZE); - mach_write_to_4(search_page + MODIFIED_PAGE_SPACE_ID, space_id); - - result->bitmap_node = rbt_lower_bound(result->bitmap, search_page); - - xb_page_bitmap_setup_next_page(result); - - return result; -} - -/****************************************************************//** -Get the value of the bitmap->range->bit_i bitmap bit - -@return the current bit value */ -static inline -ibool -is_bit_set( -/*=======*/ - const xb_page_bitmap_range* bitmap_range) /*!< in: bitmap - range */ -{ - return ((*(((bitmap_word_t *)(bitmap_range->bitmap_page - + MODIFIED_PAGE_BLOCK_BITMAP)) - + (bitmap_range->bit_i >> 6))) - & (1ULL << (bitmap_range->bit_i & 0x3F))) ? TRUE : FALSE; -} - -/****************************************************************//** -Get the next page id that has its bit set or cleared, i.e. equal to -bit_value. - -@return page id */ -ulint -xb_page_bitmap_range_get_next_bit( -/*==============================*/ - xb_page_bitmap_range* bitmap_range, /*!< in/out: bitmap range */ - ibool bit_value) /*!< in: bit value */ -{ - if (UNIV_UNLIKELY(bitmap_range->current_page_id - == ULINT_UNDEFINED)) { - - return ULINT_UNDEFINED; - } - - do { - while (bitmap_range->bit_i < MODIFIED_PAGE_BLOCK_ID_COUNT) { - - while (is_bit_set(bitmap_range) != bit_value - && (bitmap_range->bit_i - < MODIFIED_PAGE_BLOCK_ID_COUNT)) { - - bitmap_range->current_page_id++; - bitmap_range->bit_i++; - } - - if (bitmap_range->bit_i - < MODIFIED_PAGE_BLOCK_ID_COUNT) { - - ulint result = bitmap_range->current_page_id; - bitmap_range->current_page_id++; - bitmap_range->bit_i++; - return result; - } - } - - bitmap_range->bitmap_node - = rbt_next(bitmap_range->bitmap, - bitmap_range->bitmap_node); - - } while (xb_page_bitmap_setup_next_page(bitmap_range)); - - return ULINT_UNDEFINED; -} - -/****************************************************************//** -Free the bitmap range iterator. */ -void -xb_page_bitmap_range_deinit( -/*========================*/ - xb_page_bitmap_range* bitmap_range) /*! in/out: bitmap range */ -{ - free(bitmap_range); -} diff -Nru mariadb-10.11.6/extra/mariabackup/changed_page_bitmap.h mariadb-10.11.9/extra/mariabackup/changed_page_bitmap.h --- mariadb-10.11.6/extra/mariabackup/changed_page_bitmap.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/changed_page_bitmap.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -/****************************************************** -XtraBackup: hot backup tool for InnoDB -(c) 2009-2012 Percona Inc. -Originally Created 3/3/2009 Yasufumi Kinoshita -Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, -Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. - -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; version 2 of the License. - -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, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*******************************************************/ - -/* Changed page bitmap interface */ - -#ifndef XB_CHANGED_PAGE_BITMAP_H -#define XB_CHANGED_PAGE_BITMAP_H - -#include -#include - -/* The changed page bitmap structure */ -typedef ib_rbt_t xb_page_bitmap; - -struct xb_page_bitmap_range_struct; - -/* The bitmap range iterator over one space id */ -typedef struct xb_page_bitmap_range_struct xb_page_bitmap_range; - -/****************************************************************//** -Read the disk bitmap and build the changed page bitmap tree for the -LSN interval incremental_lsn to log_sys.next_checkpoint_lsn. - -@return the built bitmap tree */ -xb_page_bitmap* -xb_page_bitmap_init(void); -/*=====================*/ - -/****************************************************************//** -Free the bitmap tree. */ -void -xb_page_bitmap_deinit( -/*==================*/ - xb_page_bitmap* bitmap); /*! #include -#include #include #include @@ -143,7 +142,7 @@ # define POSIX_FADV_NORMAL # define POSIX_FADV_SEQUENTIAL # define POSIX_FADV_DONTNEED -# define posix_fadvise(a,b,c,d) do {} while(0) +# define posix_fadvise(fd, offset, len, advice) do { (void)offset; } while(0) #endif /*********************************************************************** diff -Nru mariadb-10.11.6/extra/mariabackup/common_engine.cc mariadb-10.11.9/extra/mariabackup/common_engine.cc --- mariadb-10.11.6/extra/mariabackup/common_engine.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/common_engine.cc 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,512 @@ +#include "common_engine.h" +#include "backup_copy.h" +#include "xtrabackup.h" +#include "common.h" +#include "backup_debug.h" + +#include +#include +#include +#include + +namespace common_engine { + +class Table { +public: + Table(std::string &db, std::string &table, std::string &fs_name) : + m_db(std::move(db)), m_table(std::move(table)), + m_fs_name(std::move(fs_name)) {} + virtual ~Table() {} + void add_file_name(const char *file_name) { m_fnames.push_back(file_name); } + virtual bool copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, + bool finalize, unsigned thread_num); + std::string &get_db() { return m_db; } + std::string &get_table() { return m_table; } + std::string &get_version() { return m_version; } + +protected: + std::string m_db; + std::string m_table; + std::string m_fs_name; + std::string m_version; + std::vector m_fnames; +}; + +bool +Table::copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, bool, unsigned thread_num) { + static const size_t buf_size = 10 * 1024 * 1024; + std::unique_ptr buf; + bool result = false; + File frm_file = -1; + std::vector files; + bool locked = false; + std::string full_tname("`"); + full_tname.append(m_db).append("`.`").append(m_table).append("`"); + + if (!no_lock && !backup_lock(con, full_tname.c_str())) { + msg(thread_num, "Error on executing BACKUP LOCK for table %s", + full_tname.c_str()); + goto exit; + } + else + locked = !no_lock; + + if ((frm_file = mysql_file_open(key_file_frm, (m_fs_name + ".frm").c_str(), + O_RDONLY | O_SHARE, MYF(0))) < 0 && !m_fnames.empty() && + !ends_with(m_fnames[0].c_str(), ".ARZ") && + !ends_with(m_fnames[0].c_str(), ".ARM")) { + // Don't treat it as error, as the table can be dropped after it + // was added to queue for copying + result = true; + goto exit; + } + + for (const auto &fname : m_fnames) { + File file = mysql_file_open(0, fname.c_str(),O_RDONLY | O_SHARE, MYF(0)); + if (file < 0) { + msg(thread_num, "Error on file %s open during %s table copy", + fname.c_str(), full_tname.c_str()); + goto exit; + } + files.push_back(file); + } + + if (locked && !backup_unlock(con)) { + msg(thread_num, "Error on BACKUP UNLOCK for table %s", full_tname.c_str()); + locked = false; + goto exit; + } + + locked = false; + + buf.reset(new uchar[buf_size]); + + for (size_t i = 0; i < m_fnames.size(); ++i) { + ds_file_t *dst_file = nullptr; + size_t bytes_read; + size_t copied_size = 0; + MY_STAT stat_info; + + if (my_fstat(files[i], &stat_info, MYF(0))) { + msg(thread_num, "error: failed to get stat info for file %s of " + "table %s", m_fnames[i].c_str(), full_tname.c_str()); + goto exit; + } + + const char *dst_path = + (xtrabackup_copy_back || xtrabackup_move_back) ? + m_fnames[i].c_str() : trim_dotslash(m_fnames[i].c_str()); + + dst_file = ds_open(ds, dst_path, &stat_info, false); + if (!dst_file) { + msg(thread_num, "error: cannot open destination stream for %s, table %s", + dst_path, full_tname.c_str()); + goto exit; + } + + while ((bytes_read = my_read(files[i], buf.get(), buf_size, MY_WME))) { + if (bytes_read == size_t(-1)) { + msg(thread_num, "error: file %s read for table %s", + m_fnames[i].c_str(), full_tname.c_str()); + ds_close(dst_file); + goto exit; + } + xtrabackup_io_throttling(); + if (ds_write(dst_file, buf.get(), bytes_read)) { + msg(thread_num, "error: file %s write for table %s", + dst_path, full_tname.c_str()); + ds_close(dst_file); + goto exit; + } + copied_size += bytes_read; + } + mysql_file_close(files[i], MYF(MY_WME)); + files[i] = -1; + ds_close(dst_file); + msg(thread_num, "Copied file %s for table %s, %zu bytes", + m_fnames[i].c_str(), full_tname.c_str(), copied_size); + } + + result = true; + +#ifndef DBUG_OFF + { + std::string sql_name(m_db); + sql_name.append("/").append(m_table); + DBUG_MARIABACKUP_EVENT_LOCK("after_ce_table_copy", fil_space_t::name_type(sql_name.data(), sql_name.size())); + } +#endif // DBUG_OFF +exit: + if (frm_file >= 0) { + m_version = ::read_table_version_id(frm_file); + mysql_file_close(frm_file, MYF(MY_WME)); + } + if (locked && !backup_unlock(con)) { + msg(thread_num, "Error on BACKUP UNLOCK for table %s", full_tname.c_str()); + result = false; + } + for (auto file : files) + if (file >= 0) + mysql_file_close(file, MYF(MY_WME)); + return result; +} + +// Append-only tables +class LogTable : public Table { + public: + LogTable(std::string &db, std::string &table, std::string &fs_name) : + Table(db, table, fs_name) {} + + virtual ~LogTable() { (void)close(); } + bool + copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, bool finalize, + unsigned thread_num) override; + bool close(); + private: + bool open(ds_ctxt_t *ds, unsigned thread_num); + std::vector m_src; + std::vector m_dst; +}; + +bool +LogTable::open(ds_ctxt_t *ds, unsigned thread_num) { + DBUG_ASSERT(m_src.empty()); + DBUG_ASSERT(m_dst.empty()); + + std::string full_tname("`"); + full_tname.append(m_db).append("`.`").append(m_table).append("`"); + + for (const auto &fname : m_fnames) { + File file = mysql_file_open(0, fname.c_str(),O_RDONLY | O_SHARE, MYF(0)); + if (file < 0) { + msg(thread_num, "Error on file %s open during %s log table copy", + fname.c_str(), full_tname.c_str()); + return false; + } + m_src.push_back(file); + + MY_STAT stat_info; + if (my_fstat(file, &stat_info, MYF(0))) { + msg(thread_num, "error: failed to get stat info for file %s of " + "log table %s", fname.c_str(), full_tname.c_str()); + return false; + } + const char *dst_path = + (xtrabackup_copy_back || xtrabackup_move_back) ? + fname.c_str() : trim_dotslash(fname.c_str()); + ds_file_t *dst_file = ds_open(ds, dst_path, &stat_info, false); + if (!dst_file) { + msg(thread_num, "error: cannot open destination stream for %s, " + "log table %s", dst_path, full_tname.c_str()); + return false; + } + m_dst.push_back(dst_file); + } + + File frm_file; + if ((frm_file = mysql_file_open(key_file_frm, (m_fs_name + ".frm").c_str(), + O_RDONLY | O_SHARE, MYF(0))) < 0 && !m_fnames.empty() && + !ends_with(m_fnames[0].c_str(), ".ARZ") && + !ends_with(m_fnames[0].c_str(), ".ARM")) { + msg(thread_num, "Error on .frm file open for log table %s", + full_tname.c_str()); + return false; + } + + m_version = ::read_table_version_id(frm_file); + mysql_file_close(frm_file, MYF(MY_WME)); + + return true; +} + +bool LogTable::close() { + while (!m_src.empty()) { + auto f = m_src.back(); + m_src.pop_back(); + mysql_file_close(f, MYF(MY_WME)); + } + while (!m_dst.empty()) { + auto f = m_dst.back(); + m_dst.pop_back(); + ds_close(f); + } + return true; +} + +bool +LogTable::copy(ds_ctxt_t *ds, MYSQL *con, bool no_lock, bool finalize, + unsigned thread_num) { + static const size_t buf_size = 10 * 1024 * 1024; + DBUG_ASSERT(ds); + DBUG_ASSERT(con); + if (m_src.empty() && !open(ds, thread_num)) { + close(); + return false; + } + DBUG_ASSERT(m_src.size() == m_dst.size()); + + std::unique_ptr buf(new uchar[buf_size]); + for (size_t i = 0; i < m_src.size(); ++i) { + // .CSM can be rewritten (see write_meta_file() usage in ha_tina.cc) + if (!finalize && ends_with(m_fnames[i].c_str(), ".CSM")) + continue; + size_t bytes_read; + size_t copied_size = 0; + while ((bytes_read = my_read(m_src[i], buf.get(), buf_size, MY_WME))) { + if (bytes_read == size_t(-1)) { + msg(thread_num, "error: file %s read for log table %s", + m_fnames[i].c_str(), + std::string("`").append(m_db).append("`.`"). + append(m_table).append("`").c_str()); + close(); + return false; + } + xtrabackup_io_throttling(); + if (ds_write(m_dst[i], buf.get(), bytes_read)) { + msg(thread_num, "error: file %s write for log table %s", + m_fnames[i].c_str(), std::string("`").append(m_db).append("`.`"). + append(m_table).append("`").c_str()); + close(); + return false; + } + copied_size += bytes_read; + } + msg(thread_num, "Copied file %s for log table %s, %zu bytes", + m_fnames[i].c_str(), std::string("`").append(m_db).append("`.`"). + append(m_table).append("`").c_str(), copied_size); + } + + return true; +} + +class BackupImpl { + public: + BackupImpl( + const char *datadir_path, ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool) : + m_datadir_path(datadir_path), m_ds(datasink), m_con_pool(con_pool), + m_process_table_jobs(thread_pool) {} + ~BackupImpl() { } + bool scan( + const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, + bool no_lock, bool collect_log_and_stats); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_table_post_copy_hook = hook; + } + bool copy_log_tables(bool finalize); + bool copy_stats_tables(); + bool wait_for_finish(); + bool close_log_tables(); + private: + + void process_table_job(Table *table, bool no_lock, bool delete_table, + bool finalize, unsigned thread_num); + + const char *m_datadir_path; + ds_ctxt_t *m_ds; + std::vector &m_con_pool; + TasksGroup m_process_table_jobs; + + post_copy_table_hook_t m_table_post_copy_hook; + std::unordered_map> m_log_tables; + std::unordered_map> m_stats_tables; +}; + +void BackupImpl::process_table_job(Table *table, bool no_lock, + bool delete_table, bool finalize, unsigned thread_num) { + int result = 0; + + if (!m_process_table_jobs.get_result()) + goto exit; + + if (!table->copy(m_ds, m_con_pool[thread_num], no_lock, finalize, thread_num)) + goto exit; + + if (m_table_post_copy_hook) + m_table_post_copy_hook(table->get_db(), table->get_table(), + table->get_version()); + + result = 1; + +exit: + if (delete_table) + delete table; + m_process_table_jobs.finish_task(result); +} + +bool BackupImpl::scan(const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, bool no_lock, + bool collect_log_and_stats) { + + msg("Start scanning common engine tables, need backup locks: %d, " + "collect log and stat tables: %d", no_lock, collect_log_and_stats); + + std::unordered_map> found_tables; + + foreach_file_in_db_dirs(m_datadir_path, + [&](const char *file_path)->bool { + + static const char *ext_list[] = + {".MYD", ".MYI", ".MRG", ".ARM", ".ARZ", ".CSM", ".CSV", NULL}; + + bool is_aria = ends_with(file_path, ".MAD") || ends_with(file_path, ".MAI"); + + if (!collect_log_and_stats && is_aria) + return true; + + if (!is_aria && !filename_matches(file_path, ext_list)) + return true; + + if (check_if_skip_table(file_path)) { + msg("Skipping %s.", file_path); + return true; + } + + auto db_table_fs = convert_filepath_to_tablename(file_path); + auto tk = + table_key(std::get<0>(db_table_fs), std::get<1>(db_table_fs)); + + // log and stats tables are only collected in this function, + // so there is no need to filter out them with exclude_tables. + if (collect_log_and_stats) { + if (is_log_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str())) { + auto table_it = m_log_tables.find(tk); + if (table_it == m_log_tables.end()) { + msg("Log table found: %s", tk.c_str()); + table_it = m_log_tables.emplace(tk, + std::unique_ptr(new LogTable(std::get<0>(db_table_fs), + std::get<1>(db_table_fs), std::get<2>(db_table_fs)))).first; + } + msg("Collect log table file: %s", file_path); + table_it->second->add_file_name(file_path); + return true; + } + // Aria can handle statistics tables + else if (is_stats_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str()) && !is_aria) { + auto table_it = m_stats_tables.find(tk); + if (table_it == m_stats_tables.end()) { + msg("Stats table found: %s", tk.c_str()); + table_it = m_stats_tables.emplace(tk, + std::unique_ptr
(new Table(std::get<0>(db_table_fs), + std::get<1>(db_table_fs), std::get<2>(db_table_fs)))).first; + } + msg("Collect stats table file: %s", file_path); + table_it->second->add_file_name(file_path); + return true; + } + } else if (is_log_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str()) || + is_stats_table(std::get<0>(db_table_fs).c_str(), + std::get<1>(db_table_fs).c_str())) + return true; + + if (is_aria) + return true; + + if (exclude_tables.count(tk)) { + msg("Skip table %s at it is in exclude list", tk.c_str()); + return true; + } + + auto table_it = found_tables.find(tk); + if (table_it == found_tables.end()) { + table_it = found_tables.emplace(tk, + std::unique_ptr
(new Table(std::get<0>(db_table_fs), + std::get<1>(db_table_fs), std::get<2>(db_table_fs)))).first; + } + + table_it->second->add_file_name(file_path); + + return true; + }); + + for (auto &table_it : found_tables) { + m_process_table_jobs.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.release(), + no_lock, true, false, std::placeholders::_1)); + if (out_processed_tables) + out_processed_tables->insert(table_it.first); + } + + msg("Stop scanning common engine tables"); + return true; +} + +bool BackupImpl::copy_log_tables(bool finalize) { + for (auto &table_it : m_log_tables) { + // Do not execute BACKUP LOCK for log tables as it's supposed + // that they must be copied on BLOCK_DDL and BLOCK_COMMIT locks. + m_process_table_jobs.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.get(), + true, false, finalize, std::placeholders::_1)); + } + return true; +} + +bool BackupImpl::copy_stats_tables() { + for (auto &table_it : m_stats_tables) { + // Do not execute BACKUP LOCK for stats tables as it's supposed + // that they must be copied on BLOCK_DDL and BLOCK_COMMIT locks. + // Delete stats table object after copy (see process_table_job()) + m_process_table_jobs.push_task( + std::bind(&BackupImpl::process_table_job, this, table_it.second.release(), + true, true, false, std::placeholders::_1)); + } + m_stats_tables.clear(); + return true; +} + +bool BackupImpl::wait_for_finish() { + /* Wait for threads to exit */ + return m_process_table_jobs.wait_for_finish(); +} + +bool BackupImpl::close_log_tables() { + bool result = wait_for_finish(); + for (auto &table_it : m_log_tables) + table_it.second->close(); + return result; +} + +Backup::Backup(const char *datadir_path, ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool) : + m_backup_impl( + new BackupImpl(datadir_path, datasink, con_pool, + thread_pool)) { } + +Backup::~Backup() { + delete m_backup_impl; +} + +bool Backup::scan( + const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, + bool no_lock, bool collect_log_and_stats) { + return m_backup_impl->scan(exclude_tables, out_processed_tables, no_lock, + collect_log_and_stats); +} + +bool Backup::copy_log_tables(bool finalize) { + return m_backup_impl->copy_log_tables(finalize); +} + +bool Backup::copy_stats_tables() { + return m_backup_impl->copy_stats_tables(); +} + +bool Backup::wait_for_finish() { + return m_backup_impl->wait_for_finish(); +} + +bool Backup::close_log_tables() { + return m_backup_impl->close_log_tables(); +} + +void Backup::set_post_copy_table_hook(const post_copy_table_hook_t &hook) { + m_backup_impl->set_post_copy_table_hook(hook); +} + +} // namespace common_engine diff -Nru mariadb-10.11.6/extra/mariabackup/common_engine.h mariadb-10.11.9/extra/mariabackup/common_engine.h --- mariadb-10.11.6/extra/mariabackup/common_engine.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/common_engine.h 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,39 @@ +#pragma once +#include "my_global.h" +#include "backup_mysql.h" +#include "datasink.h" +#include "thread_pool.h" +#include "xtrabackup.h" + +#include +#include +#include + +namespace common_engine { + +class BackupImpl; + +class Backup { + public: + Backup(const char *datadir_path, ds_ctxt_t *datasink, + std::vector &con_pool, ThreadPool &thread_pool); + ~Backup(); + Backup (Backup &&other) = delete; + Backup & operator= (Backup &&other) = delete; + Backup(const Backup &) = delete; + Backup & operator= (const Backup &) = delete; + bool scan( + const std::unordered_set &exclude_tables, + std::unordered_set *out_processed_tables, + bool no_lock, bool collect_log_and_stats); + bool copy_log_tables(bool finalize); + bool copy_stats_tables(); + bool wait_for_finish(); + bool close_log_tables(); + void set_post_copy_table_hook(const post_copy_table_hook_t &hook); + private: + BackupImpl *m_backup_impl; +}; + +} // namespace common_engine + diff -Nru mariadb-10.11.6/extra/mariabackup/datasink.cc mariadb-10.11.9/extra/mariabackup/datasink.cc --- mariadb-10.11.6/extra/mariabackup/datasink.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/datasink.cc 2024-08-03 07:29:56.000000000 +0000 @@ -80,11 +80,11 @@ /************************************************************************ Open a datasink file */ ds_file_t * -ds_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat) +ds_open(ds_ctxt_t *ctxt, const char *path, const MY_STAT *stat, bool rewrite) { ds_file_t *file; - file = ctxt->datasink->open(ctxt, path, stat); + file = ctxt->datasink->open(ctxt, path, stat, rewrite); if (file != NULL) { file->datasink = ctxt->datasink; } @@ -104,6 +104,30 @@ return file->datasink->write(file, (const uchar *)buf, len); } +int ds_seek_set(ds_file_t *file, my_off_t offset) { + DBUG_ASSERT(file); + DBUG_ASSERT(file->datasink); + if (file->datasink->seek_set) + return file->datasink->seek_set(file, offset); + return 0; +} + +int ds_rename(ds_ctxt_t *ctxt, const char *old_path, const char *new_path) { + DBUG_ASSERT(ctxt); + DBUG_ASSERT(ctxt->datasink); + if (ctxt->datasink->rename) + return ctxt->datasink->rename(ctxt, old_path, new_path); + return 0; +} + +int ds_remove(ds_ctxt_t *ctxt, const char *path) { + DBUG_ASSERT(ctxt); + DBUG_ASSERT(ctxt->datasink); + if (ctxt->datasink->remove) + return ctxt->datasink->mremove(ctxt, path); + return 0; +} + /************************************************************************ Close a datasink file. @return 0 on success, 1, on error. */ diff -Nru mariadb-10.11.6/extra/mariabackup/datasink.h mariadb-10.11.9/extra/mariabackup/datasink.h --- mariadb-10.11.6/extra/mariabackup/datasink.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/datasink.h 2024-08-03 07:29:56.000000000 +0000 @@ -43,7 +43,8 @@ */ bool copy_file(const char *src_file_path, const char *dst_file_path, - uint thread_n); + uint thread_n, + bool rewrite = false); bool move_file(const char *src_file_path, const char *dst_file_path, @@ -76,10 +77,15 @@ struct datasink_struct { ds_ctxt_t *(*init)(const char *root); - ds_file_t *(*open)(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat); + ds_file_t *(*open)(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *stat, bool rewrite); int (*write)(ds_file_t *file, const unsigned char *buf, size_t len); + int (*seek_set)(ds_file_t *file, my_off_t offset); int (*close)(ds_file_t *file); int (*remove)(const char *path); + // TODO: consider to return bool from "rename" and "remove" + int (*rename)(ds_ctxt_t *ctxt, const char *old_path, const char *new_path); + int (*mremove)(ds_ctxt_t *ctxt, const char *path); void (*deinit)(ds_ctxt_t *ctxt); }; @@ -106,12 +112,17 @@ /************************************************************************ Open a datasink file */ -ds_file_t *ds_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *stat); +ds_file_t *ds_open( + ds_ctxt_t *ctxt, const char *path, const MY_STAT *stat, bool rewrite = false); /************************************************************************ Write to a datasink file. @return 0 on success, 1 on error. */ int ds_write(ds_file_t *file, const void *buf, size_t len); +int ds_seek_set(ds_file_t *file, my_off_t offset); + +int ds_rename(ds_ctxt_t *ctxt, const char *old_path, const char *new_path); +int ds_remove(ds_ctxt_t *ctxt, const char *path); /************************************************************************ Close a datasink file. diff -Nru mariadb-10.11.6/extra/mariabackup/ddl_log.cc mariadb-10.11.9/extra/mariabackup/ddl_log.cc --- mariadb-10.11.6/extra/mariabackup/ddl_log.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ddl_log.cc 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,553 @@ +#include "ddl_log.h" +#include "common.h" +#include "my_sys.h" +#include "sql_table.h" +#include "backup_copy.h" +#include "xtrabackup.h" +#include +#include +#include +#include + +namespace ddl_log { + +struct Entry { + enum Type { + CREATE, + ALTER, + RENAME, + REPAIR, + OPTIMIZE, + DROP, + TRUNCATE, + CHANGE_INDEX, + BULK_INSERT + }; + Type type; + std::string date; + std::string engine; + bool partitioned; + std::string db; + std::string table; + std::string id; + std::string new_engine; + bool new_partitioned; + std::string new_db; + std::string new_table; + std::string new_id; +}; + +typedef std::vector> entries_t; +typedef std::function)> store_entry_func_t; + +const char *aria_engine_name = "Aria"; +static const char *frm_ext = ".frm"; +static const char *database_keyword = "DATABASE"; + +const std::unordered_map> engine_exts = +{ + {"Aria", {".MAD", ".MAI"}}, + {"MyISAM", {".MYD", ".MYI"}}, + {"MRG_MyISAM", {".MRG"}}, + {"ARCHIVE", {".ARM", ".ARZ"}}, + {"CSV", {".CSM", ".CSV"}} +}; + +static inline bool known_engine(const std::string &engine) { + return engine_exts.count(engine); +} + +// TODO: add error messages +size_t parse(const uchar *buf, size_t buf_size, bool &error_flag, + store_entry_func_t &store_entry_func) { + DBUG_ASSERT(buf); + static constexpr char token_delimiter = '\t'; + static constexpr char line_delimiter = '\n'; + enum { + TOKEN_FIRST = 0, + TOKEN_DATE = TOKEN_FIRST, + TOKEN_TYPE, + TOKEN_ENGINE, + TOKEN_PARTITIONED, + TOKEN_DB, + TOKEN_TABLE, + TOKEN_ID, + TOKEN_MANDATORY = TOKEN_ID, + TOKEN_NEW_ENGINE, + TOKEN_NEW_PARTITIONED, + TOKEN_NEW_DB, + TOKEN_NEW_TABLE, + TOKEN_NEW_ID, + TOKEN_LAST = TOKEN_NEW_ID + }; + const size_t string_offsets[TOKEN_LAST + 1] = { + offsetof(Entry, date), + offsetof(Entry, type), // not a string, be careful + offsetof(Entry, engine), + offsetof(Entry, partitioned), // not a string, be careful + offsetof(Entry, db), + offsetof(Entry, table), + offsetof(Entry, id), + offsetof(Entry, new_engine), + offsetof(Entry, new_partitioned), // not a string, be careful + offsetof(Entry, new_db), + offsetof(Entry, new_table), + offsetof(Entry, new_id) + }; + const std::unordered_map str_to_type = { + {"CREATE", Entry::CREATE}, + {"ALTER", Entry::ALTER}, + {"RENAME", Entry::RENAME}, + // TODO: fix to use uppercase-only + {"repair", Entry::REPAIR}, + {"optimize", Entry::OPTIMIZE}, + {"DROP", Entry::DROP}, + {"TRUNCATE", Entry::TRUNCATE}, + {"CHANGE_INDEX", Entry::CHANGE_INDEX}, + {"BULK_INSERT", Entry::BULK_INSERT} + }; + + const uchar *new_line = buf; + const uchar *token_start = buf; + unsigned token_num = TOKEN_FIRST; + + error_flag = false; + + std::unique_ptr entry(new Entry()); + + for (const uchar *ptr = buf; ptr < buf + buf_size; ++ptr) { + + if (*ptr != token_delimiter && *ptr != line_delimiter) + continue; + + if (token_start != ptr) { + std::string token(token_start, ptr); + + if (token_num == TOKEN_TYPE) { + const auto type_it = str_to_type.find(token); + if (type_it == str_to_type.end()) { + error_flag = true; + goto exit; + } + entry->type = type_it->second; + } + else if (token_num == TOKEN_PARTITIONED) { + entry->partitioned = token[0] - '0'; + } + else if (token_num == TOKEN_NEW_PARTITIONED) { + entry->new_partitioned = token[0] - '0'; + } + else if (token_num <= TOKEN_LAST) { + DBUG_ASSERT(token_num != TOKEN_TYPE); + DBUG_ASSERT(token_num != TOKEN_PARTITIONED); + DBUG_ASSERT(token_num != TOKEN_NEW_PARTITIONED); + reinterpret_cast + (reinterpret_cast(entry.get()) + string_offsets[token_num])-> + assign(std::move(token)); + } + else { + error_flag = true; + goto exit; + } + } + token_start = ptr + 1; + + if (*ptr == line_delimiter) { + if (token_num < TOKEN_MANDATORY) { + error_flag = true; + goto exit; + } + if (!store_entry_func(std::move(entry))) { + error_flag = true; + goto exit; + } + entry.reset(new Entry()); + token_num = TOKEN_FIRST; + new_line = ptr + 1; + } else + ++token_num; + } + +exit: + return new_line - buf; +} + +bool parse(const char *file_path, store_entry_func_t store_entry_func) { + DBUG_ASSERT(file_path); + DBUG_ASSERT(store_entry_func); + File file= -1; + bool result = true; + uchar buf[1024]; + size_t bytes_read = 0; + size_t buf_read_offset = 0; + + if ((file= my_open(file_path, O_RDONLY | O_SHARE | O_NOFOLLOW | O_CLOEXEC, + MYF(MY_WME))) < 0) { + msg("DDL log file %s open failed: %d", file_path, my_errno); + result = false; + goto exit; + } + + while((bytes_read = my_read( + file, &buf[buf_read_offset], sizeof(buf) - buf_read_offset, MY_WME)) > 0) { + if (bytes_read == size_t(-1)) { + msg("DDL log file %s read error: %d", file_path, my_errno); + result = false; + break; + } + bytes_read += buf_read_offset; + bool parse_error_flag = false; + size_t bytes_parsed = parse( + buf, bytes_read, parse_error_flag, store_entry_func); + if (parse_error_flag) { + result = false; + break; + } + size_t rest_size = bytes_read - bytes_parsed; + if (rest_size) + memcpy(buf, buf + bytes_parsed, rest_size); + buf_read_offset = rest_size; + } + +exit: + if (file >= 0) + my_close(file, MYF(MY_WME)); + return result; +}; + + +static +bool process_database( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry, + std::unordered_set &dropped_databases) { + + if (entry.type == Entry::Type::CREATE || + entry.type == Entry::Type::ALTER) { + std::string opt_file(datadir_path); + opt_file.append("/").append(entry.db).append("/db.opt"); + if (!ds->copy_file(opt_file.c_str(), opt_file.c_str(), 0, true)) { + msg("Failed to re-copy %s.", opt_file.c_str()); + return false; + } + if (entry.type == Entry::Type::CREATE) + dropped_databases.erase(entry.db); + return true; + } + + DBUG_ASSERT(entry.type == Entry::Type::DROP); + + std::string db_path(datadir_path); + db_path.append("/").append(entry.db); + const char *dst_path = convert_dst(db_path.c_str()); + if (!ds_remove(ds, dst_path)) { + dropped_databases.insert(entry.db); + return true; + } + return false; +} + +static +std::unique_ptr> + find_table_files( + const char *dir_path, + const std::string &db, + const std::string &table) { + + std::unique_ptr> + result(new std::vector()); + + std::string prefix = convert_tablename_to_filepath(dir_path, db, table); + foreach_file_in_db_dirs(dir_path, [&](const char *file_name)->bool { + if (!strncmp(file_name, prefix.c_str(), prefix.size())) { + DBUG_ASSERT(strlen(file_name) >= prefix.size()); + if (file_name[prefix.size()] == '.' || + !strncmp(file_name + prefix.size(), "#P#", strlen("#P#"))) + result->push_back(std::string(file_name)); + } + return true; + }); + + return result; +} + +static +bool process_remove( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry, + bool remove_frm) { + + if (check_if_skip_table( + std::string(entry.db).append("/").append(entry.table).c_str())) + return true; + + auto ext_it = engine_exts.find(entry.engine); + if (ext_it == engine_exts.end()) + return true; + + std::string file_preffix = convert_tablename_to_filepath(datadir_path, + entry.db, entry.table); + const char *dst_preffix = convert_dst(file_preffix.c_str()); + + for (const char *ext : ext_it->second) { + std::string old_name(dst_preffix); + if (!entry.partitioned) + old_name.append(ext); + else + old_name.append("#P#*"); + if (ds_remove(ds, old_name.c_str())) { + msg("Failed to remove %s.", old_name.c_str()); + return false; + } + } + + if (remove_frm) { + std::string old_frm_name(dst_preffix); + old_frm_name.append(frm_ext); + if (ds_remove(ds, old_frm_name.c_str())) { + msg("Failed to remove %s.", old_frm_name.c_str()); + return false; + } + } + return true; + +} + +static +bool process_recopy( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry, + const tables_t &tables) { + + if (check_if_skip_table( + std::string(entry.db).append("/").append(entry.table).c_str())) + return true; + + const std::string &new_table_id = + entry.new_id.empty() ? entry.id : entry.new_id; + DBUG_ASSERT(!new_table_id.empty()); + const std::string &new_table = + entry.new_table.empty() ? entry.table : entry.new_table; + DBUG_ASSERT(!new_table.empty()); + const std::string &new_db = + entry.new_db.empty() ? entry.db : entry.new_db; + DBUG_ASSERT(!new_db.empty()); + const std::string &new_engine = + entry.new_engine.empty() ? entry.engine : entry.new_engine; + DBUG_ASSERT(!new_engine.empty()); + + if (entry.type != Entry::Type::BULK_INSERT) { + auto table_it = tables.find(table_key(new_db, new_table)); + if (table_it != tables.end() && + table_it->second == new_table_id) + return true; + } + + if (!entry.new_engine.empty() && + entry.engine != entry.new_engine && + !known_engine(entry.new_engine)) { + return process_remove(datadir_path, ds, entry, false); + } + + if ((entry.partitioned || entry.new_partitioned) && + !process_remove(datadir_path, ds, entry, false)) + return false; + + if (entry.partitioned || entry.new_partitioned) { + auto files = find_table_files(datadir_path, new_db, new_table); + if (!files.get()) + return true; + for (const auto &file : *files) { + const char *dst_path = convert_dst(file.c_str()); + if (!ds->copy_file(file.c_str(), dst_path, 0, true)) { + msg("Failed to re-copy %s.", file.c_str()); + return false; + } + } + return true; + } + + auto ext_it = engine_exts.find(new_engine); + if (ext_it == engine_exts.end()) + return false; + + for (const char *ext : ext_it->second) { + std::string file_name = + convert_tablename_to_filepath(datadir_path, new_db, new_table). + append(ext); + const char *dst_path = convert_dst(file_name.c_str()); + if (file_exists(file_name.c_str()) && + !ds->copy_file(file_name.c_str(), dst_path, 0, true)) { + msg("Failed to re-copy %s.", file_name.c_str()); + return false; + } + } + + std::string frm_file = + convert_tablename_to_filepath(datadir_path, new_db, new_table). + append(frm_ext); + const char *frm_dst_path = convert_dst(frm_file.c_str()); + if (file_exists(frm_file.c_str()) && + !ds->copy_file(frm_file.c_str(), frm_dst_path, 0, true)) { + msg("Failed to re-copy %s.", frm_file.c_str()); + return false; + } + + return true; +} + +static +bool process_rename( + const char *datadir_path, + ds_ctxt_t *ds, + const Entry &entry) { + + if (check_if_skip_table( + std::string(entry.db).append("/").append(entry.table).c_str())) + return true; + + DBUG_ASSERT(entry.db != "partition"); + + auto ext_it = engine_exts.find(entry.engine); + if (ext_it == engine_exts.end()) + return false; + + std::string new_preffix = convert_tablename_to_filepath(datadir_path, + entry.new_db, entry.new_table); + const char *dst_path = convert_dst(new_preffix.c_str()); + + std::string old_preffix = convert_tablename_to_filepath(datadir_path, + entry.db, entry.table); + const char *src_path = convert_dst(old_preffix.c_str()); + + for (const char *ext : ext_it->second) { + std::string old_name(src_path); + old_name.append(ext); + std::string new_name(dst_path); + new_name.append(ext); + if (ds_rename(ds, old_name.c_str(), new_name.c_str())) { + msg("Failed to rename %s to %s.", + old_name.c_str(), new_name.c_str()); + return false; + } + } + + std::string new_frm_file = new_preffix + frm_ext; + const char *new_frm_dst = convert_dst(new_frm_file.c_str()); + if (file_exists(new_frm_file.c_str()) && + !ds->copy_file(new_frm_file.c_str(), new_frm_dst, 0, true)) { + msg("Failed to re-copy %s.", new_frm_file.c_str()); + return false; + } + +// TODO: return this code if .frm is copied not under BLOCK_DDL +/* + std::string old_frm_name(src_path); + old_frm_name.append(frm_ext); + std::string new_frm_name(dst_path); + new_frm_name.append(frm_ext); + if (ds_rename(ds, old_frm_name.c_str(), new_frm_name.c_str())) { + msg("Failed to rename %s to %s.", + old_frm_name.c_str(), new_frm_name.c_str()); + return false; + } +*/ + return true; +} + +bool backup( + const char *datadir_path, + ds_ctxt_t *ds, + const tables_t &tables) { + DBUG_ASSERT(datadir_path); + DBUG_ASSERT(ds); + char ddl_log_path[FN_REFLEN]; + fn_format(ddl_log_path, "ddl", datadir_path, ".log", 0); + std::vector> entries; + + std::unordered_set processed_tables; + std::unordered_set dropped_databases; + + bool parsing_result = + parse(ddl_log_path, [&](std::unique_ptr entry)->bool { + + if (entry->engine == database_keyword) + return process_database(datadir_path, ds, *entry, dropped_databases); + + if (!known_engine(entry->engine) && !known_engine(entry->new_engine)) + return true; + + if (entry->type == Entry::Type::CREATE || + (entry->type == Entry::Type::ALTER && + !entry->new_engine.empty() && + entry->engine != entry->new_engine)) { + if (!process_recopy(datadir_path, ds, *entry, tables)) + return false; + processed_tables.insert(table_key(entry->db, entry->table)); + if (entry->type == Entry::Type::ALTER) + processed_tables.insert(table_key(entry->new_db, entry->new_table)); + return true; + } + + if (entry->type == Entry::Type::DROP) { + if (!process_remove(datadir_path, ds, *entry, true)) + return false; + processed_tables.insert(table_key(entry->db, entry->table)); + return true; + } + if (entry->type == Entry::Type::RENAME) { + if (entry->partitioned) { + if (!process_remove(datadir_path, ds, *entry, true)) + return false; + Entry recopy_entry { + entry->type, + {}, + entry->new_engine.empty() ? entry->engine : entry->new_engine, + true, + entry->new_db, + entry->new_table, + entry->new_id, + {}, true, {}, {}, {} + }; + if (!process_recopy(datadir_path, ds, recopy_entry, tables)) + return false; + } + else if (!process_rename(datadir_path, ds, *entry)) + return false; + processed_tables.insert(table_key(entry->db, entry->table)); + processed_tables.insert(table_key(entry->new_db, entry->new_table)); + return true; + } + + entries.push_back(std::move(entry)); + return true; + + }); + + if (!parsing_result) + return false; + + + while (!entries.empty()) { + auto entry = std::move(entries.back()); + entries.pop_back(); + auto tk = table_key( + entry->new_db.empty() ? entry->db : entry->new_db, + entry->new_table.empty() ? entry->table : entry->new_table); + if (dropped_databases.count(entry->db) || + dropped_databases.count(entry->new_db)) + continue; + if (processed_tables.count(tk)) + continue; + processed_tables.insert(std::move(tk)); + if (!process_recopy(datadir_path, ds, *entry, tables)) + return false; + } + + return true; +} + +} // namespace ddl_log diff -Nru mariadb-10.11.6/extra/mariabackup/ddl_log.h mariadb-10.11.9/extra/mariabackup/ddl_log.h --- mariadb-10.11.6/extra/mariabackup/ddl_log.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ddl_log.h 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,15 @@ +#pragma once +#include "my_global.h" +#include "datasink.h" +#include "aria_backup_client.h" +#include +#include +#include +#include + +namespace ddl_log { + +typedef std::unordered_map tables_t; +bool backup(const char *datadir_path, ds_ctxt_t *ds, const tables_t &tables); + +} // namespace ddl_log diff -Nru mariadb-10.11.6/extra/mariabackup/ds_buffer.cc mariadb-10.11.9/extra/mariabackup/ds_buffer.cc --- mariadb-10.11.6/extra/mariabackup/ds_buffer.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ds_buffer.cc 2024-08-03 07:29:56.000000000 +0000 @@ -44,7 +44,7 @@ static ds_ctxt_t *buffer_init(const char *root); static ds_file_t *buffer_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int buffer_write(ds_file_t *file, const uchar *buf, size_t len); static int buffer_close(ds_file_t *file); static void buffer_deinit(ds_ctxt_t *ctxt); @@ -53,8 +53,11 @@ &buffer_init, &buffer_open, &buffer_write, + nullptr, &buffer_close, &dummy_remove, + nullptr, + nullptr, &buffer_deinit }; @@ -84,8 +87,10 @@ } static ds_file_t * -buffer_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +buffer_open(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *mystat, bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_buffer_ctxt_t *buffer_ctxt; ds_ctxt_t *pipe_ctxt; ds_file_t *dst_file; diff -Nru mariadb-10.11.6/extra/mariabackup/ds_compress.cc mariadb-10.11.9/extra/mariabackup/ds_compress.cc --- mariadb-10.11.6/extra/mariabackup/ds_compress.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ds_compress.cc 2024-08-03 07:29:56.000000000 +0000 @@ -65,7 +65,7 @@ static ds_ctxt_t *compress_init(const char *root); static ds_file_t *compress_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int compress_write(ds_file_t *file, const uchar *buf, size_t len); static int compress_close(ds_file_t *file); static void compress_deinit(ds_ctxt_t *ctxt); @@ -74,8 +74,11 @@ &compress_init, &compress_open, &compress_write, + nullptr, &compress_close, &dummy_remove, + nullptr, + nullptr, &compress_deinit }; @@ -116,8 +119,10 @@ static ds_file_t * -compress_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +compress_open(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *mystat, bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_compress_ctxt_t *comp_ctxt; ds_ctxt_t *dest_ctxt; ds_file_t *dest_file; diff -Nru mariadb-10.11.6/extra/mariabackup/ds_local.cc mariadb-10.11.9/extra/mariabackup/ds_local.cc --- mariadb-10.11.6/extra/mariabackup/ds_local.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ds_local.cc 2024-08-03 07:29:56.000000000 +0000 @@ -42,8 +42,9 @@ static ds_ctxt_t *local_init(const char *root); static ds_file_t *local_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int local_write(ds_file_t *file, const uchar *buf, size_t len); +static int local_seek_set(ds_file_t *file, my_off_t offset); static int local_close(ds_file_t *file); static void local_deinit(ds_ctxt_t *ctxt); @@ -52,13 +53,20 @@ return unlink(path); } +static int local_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path); +static int local_mremove(ds_ctxt_t *ctxt, const char *path); + extern "C" { datasink_t datasink_local = { &local_init, &local_open, &local_write, + &local_seek_set, &local_close, &local_remove, + &local_rename, + &local_mremove, &local_deinit }; } @@ -89,7 +97,7 @@ static ds_file_t * local_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat __attribute__((unused))) + const MY_STAT *mystat __attribute__((unused)), bool rewrite) { char fullpath[FN_REFLEN]; char dirpath[FN_REFLEN]; @@ -111,8 +119,10 @@ return NULL; } - fd = my_create(fullpath, 0, O_WRONLY | O_BINARY | O_EXCL | O_NOFOLLOW, - MYF(MY_WME)); + // TODO: check in Windows and set the corresponding flags on fail + fd = my_create(fullpath, 0, + O_WRONLY | O_BINARY | (rewrite ? O_TRUNC : O_EXCL) | O_NOFOLLOW, + MYF(MY_WME)); if (fd < 0) { return NULL; } @@ -194,8 +204,8 @@ return; } - auto flags = mach_read_from_4(&buf[FIL_PAGE_DATA + FSP_SPACE_FLAGS]); - auto ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags); + uint32_t flags = mach_read_from_4(&buf[FIL_PAGE_DATA + FSP_SPACE_FLAGS]); + uint32_t ssize = FSP_FLAGS_GET_PAGE_SSIZE(flags); local_file->pagesize= ssize == 0 ? UNIV_PAGE_SIZE_ORIG : ((UNIV_ZIP_SIZE_MIN >> 1) << ssize); local_file->compressed = fil_space_t::full_crc32(flags) ? fil_space_t::is_compressed(flags) @@ -239,6 +249,15 @@ return 1; } +static +int +local_seek_set(ds_file_t *file, my_off_t offset) { + ds_local_file_t *local_file= (ds_local_file_t *)file->ptr; + if (my_seek(local_file->fd, offset, SEEK_SET, MYF(0)) == MY_FILEPOS_ERROR) + return 1; + return 0; +} + /* Set EOF at file's current position.*/ static int set_eof(File fd) { @@ -276,3 +295,77 @@ my_free(ctxt->root); my_free(ctxt); } + + +static int local_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path) { + char full_old_path[FN_REFLEN]; + char full_new_path[FN_REFLEN]; + fn_format(full_old_path, old_path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + fn_format(full_new_path, new_path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + // Ignore errors as .frm files can me copied separately. + // TODO: return error processing here after the corresponding changes in + // xtrabackup.cc + (void)my_rename(full_old_path, full_new_path, MYF(0)); +// if (my_rename(full_old_path, full_new_path, MYF(0))) { +// msg("Failed to rename file %s to %s", old_path, new_path); +// return 1; +// } + return 0; +} + +// It's ok if destination does not contain the file or folder +static int local_mremove(ds_ctxt_t *ctxt, const char *path) { + char full_path[FN_REFLEN]; + fn_format(full_path, path, ctxt->root, "", MYF(MY_RELATIVE_PATH)); + size_t full_path_len = strlen(full_path); + if (full_path[full_path_len - 1] == '*') { + full_path[full_path_len - 1] = '\0'; + char *preffix = strrchr(full_path, '/'); + const char *full_path_dir = full_path; + size_t preffix_len; + if (preffix) { + preffix_len = (full_path_len - 1) - (preffix - full_path); + *(preffix++) = '\0'; + } + else { + preffix = full_path; + preffix_len = full_path_len - 1; + full_path_dir= IF_WIN(".\\", "./"); + } + if (!preffix_len) + return 0; + MY_DIR *dir= my_dir(full_path_dir, 0); + if (!dir) + return 0; + for (size_t i = 0; i < dir->number_of_files; ++i) { + char full_fpath[FN_REFLEN]; + if (strncmp(dir->dir_entry[i].name, preffix, preffix_len)) + continue; + fn_format(full_fpath, dir->dir_entry[i].name, + full_path_dir, "", MYF(MY_RELATIVE_PATH)); + (void)my_delete(full_fpath, MYF(0)); + } + my_dirend(dir); + } + else { + MY_STAT stat; + if (!my_stat(full_path, &stat, MYF(0))) + return 0; + MY_DIR *dir= my_dir(full_path, 0); + if (!dir) { + // TODO: check for error here if necessary + (void)my_delete(full_path, MYF(0)); + return 0; + } + for (size_t i = 0; i < dir->number_of_files; ++i) { + char full_fpath[FN_REFLEN]; + fn_format(full_fpath, dir->dir_entry[i].name, + full_path, "", MYF(MY_RELATIVE_PATH)); + (void)my_delete(full_fpath, MYF(0)); + } + my_dirend(dir); + (void)my_rmtree(full_path, MYF(0)); + } + return 0; +} diff -Nru mariadb-10.11.6/extra/mariabackup/ds_stdout.cc mariadb-10.11.9/extra/mariabackup/ds_stdout.cc --- mariadb-10.11.6/extra/mariabackup/ds_stdout.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ds_stdout.cc 2024-08-03 07:29:56.000000000 +0000 @@ -30,7 +30,7 @@ static ds_ctxt_t *stdout_init(const char *root); static ds_file_t *stdout_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int stdout_write(ds_file_t *file, const uchar *buf, size_t len); static int stdout_close(ds_file_t *file); static void stdout_deinit(ds_ctxt_t *ctxt); @@ -39,8 +39,11 @@ &stdout_init, &stdout_open, &stdout_write, + nullptr, &stdout_close, &dummy_remove, + nullptr, + nullptr, &stdout_deinit }; @@ -61,8 +64,9 @@ ds_file_t * stdout_open(ds_ctxt_t *ctxt __attribute__((unused)), const char *path __attribute__((unused)), - MY_STAT *mystat __attribute__((unused))) + const MY_STAT *mystat __attribute__((unused)), bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_stdout_file_t *stdout_file; ds_file_t *file; size_t pathlen; diff -Nru mariadb-10.11.6/extra/mariabackup/ds_tmpfile.cc mariadb-10.11.9/extra/mariabackup/ds_tmpfile.cc --- mariadb-10.11.6/extra/mariabackup/ds_tmpfile.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ds_tmpfile.cc 2024-08-03 07:29:56.000000000 +0000 @@ -41,7 +41,7 @@ static ds_ctxt_t *tmpfile_init(const char *root); static ds_file_t *tmpfile_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int tmpfile_write(ds_file_t *file, const uchar *buf, size_t len); static int tmpfile_close(ds_file_t *file); static void tmpfile_deinit(ds_ctxt_t *ctxt); @@ -50,8 +50,11 @@ &tmpfile_init, &tmpfile_open, &tmpfile_write, + nullptr, &tmpfile_close, &dummy_remove, + nullptr, + nullptr, &tmpfile_deinit }; @@ -80,8 +83,9 @@ static ds_file_t * tmpfile_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat) + const MY_STAT *mystat, bool rewrite) { + DBUG_ASSERT(rewrite == false); ds_tmpfile_ctxt_t *tmpfile_ctxt; char tmp_path[FN_REFLEN]; ds_tmp_file_t *tmp_file; diff -Nru mariadb-10.11.6/extra/mariabackup/ds_xbstream.cc mariadb-10.11.9/extra/mariabackup/ds_xbstream.cc --- mariadb-10.11.6/extra/mariabackup/ds_xbstream.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/ds_xbstream.cc 2024-08-03 07:29:56.000000000 +0000 @@ -40,24 +40,31 @@ static ds_ctxt_t *xbstream_init(const char *root); static ds_file_t *xbstream_open(ds_ctxt_t *ctxt, const char *path, - MY_STAT *mystat); + const MY_STAT *mystat, bool rewrite); static int xbstream_write(ds_file_t *file, const uchar *buf, size_t len); +static int xbstream_seek_set(ds_file_t *file, my_off_t offset); static int xbstream_close(ds_file_t *file); static void xbstream_deinit(ds_ctxt_t *ctxt); +static int xbstream_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path); +static int xbstream_mremove(ds_ctxt_t *ctxt, const char *path); + datasink_t datasink_xbstream = { &xbstream_init, &xbstream_open, &xbstream_write, + &xbstream_seek_set, &xbstream_close, &dummy_remove, + &xbstream_rename, + &xbstream_mremove, &xbstream_deinit }; static ssize_t -my_xbstream_write_callback(xb_wstream_file_t *f __attribute__((unused)), - void *userdata, const void *buf, size_t len) +my_xbstream_write_callback(void *userdata, const void *buf, size_t len) { ds_stream_ctxt_t *stream_ctxt; @@ -89,7 +96,7 @@ goto err; } - xbstream = xb_stream_write_new(); + xbstream = xb_stream_write_new(my_xbstream_write_callback, stream_ctxt); if (xbstream == NULL) { msg("xb_stream_write_new() failed."); goto err; @@ -108,7 +115,8 @@ static ds_file_t * -xbstream_open(ds_ctxt_t *ctxt, const char *path, MY_STAT *mystat) +xbstream_open(ds_ctxt_t *ctxt, const char *path, + const MY_STAT *mystat, bool rewrite) { ds_file_t *file; ds_stream_file_t *stream_file; @@ -144,9 +152,7 @@ xbstream = stream_ctxt->xbstream; - xbstream_file = xb_stream_write_open(xbstream, path, mystat, - stream_ctxt, - my_xbstream_write_callback); + xbstream_file = xb_stream_write_open(xbstream, path, mystat, rewrite); if (xbstream_file == NULL) { msg("xb_stream_write_open() failed."); @@ -191,6 +197,45 @@ } static +int +xbstream_seek_set(ds_file_t *file, my_off_t offset) +{ + ds_stream_file_t *stream_file; + xb_wstream_file_t *xbstream_file; + + + stream_file = (ds_stream_file_t *) file->ptr; + + xbstream_file = stream_file->xbstream_file; + + if (xb_stream_write_seek_set(xbstream_file, offset)) { + msg("xb_stream_write_seek_set() failed."); + return 1; + } + + return 0; +} + +static +int +xbstream_mremove(ds_ctxt_t *ctxt, const char *path) { + ds_stream_ctxt_t *stream_ctxt = + reinterpret_cast(ctxt->ptr); + xb_wstream_t *xbstream = stream_ctxt->xbstream; + return xb_stream_write_remove(xbstream, path); +} + +static +int +xbstream_rename( + ds_ctxt_t *ctxt, const char *old_path, const char *new_path) { + ds_stream_ctxt_t *stream_ctxt = + reinterpret_cast(ctxt->ptr); + xb_wstream_t *xbstream = stream_ctxt->xbstream; + return xb_stream_write_rename(xbstream, old_path, new_path); +} + +static int xbstream_close(ds_file_t *file) { diff -Nru mariadb-10.11.6/extra/mariabackup/encryption_plugin.cc mariadb-10.11.9/extra/mariabackup/encryption_plugin.cc --- mariadb-10.11.6/extra/mariabackup/encryption_plugin.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/encryption_plugin.cc 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,249 @@ +/* Copyright (c) 2017, MariaDB Corporation. + + 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; version 2 of the License. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +extern struct st_maria_plugin *mysql_optional_plugins[]; +extern struct st_maria_plugin *mysql_mandatory_plugins[]; +static void encryption_plugin_init(int argc, char **argv); + +extern char *xb_plugin_load; +extern char *xb_plugin_dir; + +const int PLUGIN_MAX_ARGS = 1024; +std::vector backup_plugins_args; + +const char *QUERY_PLUGIN = +"SELECT plugin_name, plugin_library, @@plugin_dir" +" FROM information_schema.plugins WHERE plugin_type='ENCRYPTION'" +" OR (plugin_type = 'DAEMON' AND plugin_name LIKE 'provider\\_%')" +" AND plugin_status='ACTIVE'"; + +std::string encryption_plugin_config; + +static void add_to_plugin_load_list(const char *plugin_def) +{ + opt_plugin_load_list_ptr->push_back(new i_string(plugin_def)); +} + +static char XTRABACKUP_EXE[] = "xtrabackup"; + +/* + Read "plugin-load" value (encryption plugin) from backup-my.cnf during + prepare phase. + The value is stored during backup phase. +*/ +static std::string get_encryption_plugin_from_cnf() +{ + FILE *f = fopen("backup-my.cnf", "r"); + if (!f) + { + die("Can't open backup-my.cnf for reading"); + } + char line[512]; + std::string plugin_load; + while (fgets(line, sizeof(line), f)) + { + if (strncmp(line, "plugin_load=", 12) == 0) + { + plugin_load = line + 12; + // remote \n at the end of string + plugin_load.resize(plugin_load.size() - 1); + } + + if (strncmp(line, "innodb_encrypt_tables=", 22) == 0) + { + if (!strncmp(line + 22, "ON", 2) || + !strncmp(line + 22, "1", 1)) + srv_encrypt_tables= 1; + else if (!strncmp(line + 22, "FORCE", 5) || + !strncmp(line + 22, "2", 1)) + srv_encrypt_tables= 2; + } + } + fclose(f); + return plugin_load; +} + + +void encryption_plugin_backup_init(MYSQL *mysql) +{ + MYSQL_RES *result; + MYSQL_ROW row; + std::ostringstream oss; + char *argv[PLUGIN_MAX_ARGS]; + char show_query[1024] = ""; + std::string plugin_load; + int argc; + + result = xb_mysql_query(mysql, QUERY_PLUGIN, true, true); + while ((row = mysql_fetch_row(result))) + { + char *name= row[0]; + char *library= row[1]; + char *dir= row[2]; + + if (!plugin_load.length()) + { +#ifdef _WIN32 + for (char *p = dir; *p; p++) + if (*p == '\\') *p = '/'; +#endif + strncpy(opt_plugin_dir, dir, FN_REFLEN - 1); + opt_plugin_dir[FN_REFLEN - 1] = '\0'; + oss << "plugin_dir=" << '"' << dir << '"' << std::endl; + } + + plugin_load += std::string(";") + name; + + if (library) + { + /* Remove shared library suffixes, in case we'll prepare on different OS.*/ + const char *extensions[] = { ".dll", ".so", 0 }; + for (size_t i = 0; extensions[i]; i++) + { + const char *ext = extensions[i]; + if (ends_with(library, ext)) + library[strlen(library) - strlen(ext)] = 0; + } + plugin_load += std::string("=") + library; + } + + if (strncmp(name, "provider_", 9) == 0) + continue; + + /* Read plugin variables. */ + snprintf(show_query, sizeof(show_query), "SHOW variables like '%s_%%'", name); + } + mysql_free_result(result); + if (!plugin_load.length()) + return; + + oss << "plugin_load=" << plugin_load.c_str() + 1 << std::endl; + + /* Required to load the plugin later.*/ + add_to_plugin_load_list(plugin_load.c_str() + 1); + + + if (*show_query) + { + result = xb_mysql_query(mysql, show_query, true, true); + while ((row = mysql_fetch_row(result))) + { + std::string arg("--"); + arg += row[0]; + arg += "="; + arg += row[1]; + backup_plugins_args.push_back(arg); + oss << row[0] << "=" << row[1] << std::endl; + } + + mysql_free_result(result); + + /* Check whether to encrypt logs. */ + result = xb_mysql_query(mysql, "select @@innodb_encrypt_log", true, true); + row = mysql_fetch_row(result); + srv_encrypt_log = (row != 0 && row[0][0] == '1'); + oss << "innodb_encrypt_log=" << row[0] << std::endl; + + mysql_free_result(result); + } + + result = xb_mysql_query(mysql, "select @@innodb_encrypt_tables", true, true); + row = mysql_fetch_row(result); + if (!row); + else if (const char *r= row[0]) + { + if (!strcmp(r, "ON")) srv_encrypt_tables= 1; + else if (!strcmp(r, "FORCE")) srv_encrypt_tables= 2; + oss << "innodb_encrypt_tables=" << r << std::endl; + } + + mysql_free_result(result); + encryption_plugin_config = oss.str(); + + argc = 0; + argv[argc++] = XTRABACKUP_EXE; + for(size_t i = 0; i < backup_plugins_args.size(); i++) + { + argv[argc++] = (char *)backup_plugins_args[i].c_str(); + if (argc == PLUGIN_MAX_ARGS - 2) + break; + } + argv[argc] = 0; + + encryption_plugin_init(argc, argv); +} + +const char *encryption_plugin_get_config() +{ + return encryption_plugin_config.c_str(); +} + +extern int finalize_encryption_plugin(st_plugin_int *plugin); + + +void encryption_plugin_prepare_init(int argc, char **argv) +{ + std::string plugin_load= get_encryption_plugin_from_cnf(); + if (plugin_load.size()) + { + msg("Loading encryption plugin from %s", plugin_load.c_str()); + } + else + { + finalize_encryption_plugin(0); + return; + } + + add_to_plugin_load_list(plugin_load.c_str()); + + if (xb_plugin_dir) + { + strncpy(opt_plugin_dir, xb_plugin_dir, FN_REFLEN - 1); + opt_plugin_dir[FN_REFLEN - 1] = '\0'; + } + + char **new_argv = new char *[argc + 2]; + new_argv[0] = XTRABACKUP_EXE; + memcpy(&new_argv[1], argv, argc*sizeof(char *)); + + encryption_plugin_init(argc+1, new_argv); + + delete[] new_argv; +} + +static void encryption_plugin_init(int argc, char **argv) +{ + /* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */ + mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0; + plugin_maturity = MariaDB_PLUGIN_MATURITY_UNKNOWN; /* mariabackup accepts all plugins */ + msg("Loading encryption plugin"); + for (int i= 1; i < argc; i++) + msg("\t Encryption plugin parameter : '%s'", argv[i]); + plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE); +} + diff -Nru mariadb-10.11.6/extra/mariabackup/encryption_plugin.h mariadb-10.11.9/extra/mariabackup/encryption_plugin.h --- mariadb-10.11.6/extra/mariabackup/encryption_plugin.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/encryption_plugin.h 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,7 @@ +#include +#include +extern void encryption_plugin_backup_init(MYSQL *mysql); +extern const char* encryption_plugin_get_config(); +extern void encryption_plugin_prepare_init(int argc, char **argv); + +//extern void encryption_plugin_init(int argc, char **argv); diff -Nru mariadb-10.11.6/extra/mariabackup/fil_cur.cc mariadb-10.11.9/extra/mariabackup/fil_cur.cc --- mariadb-10.11.6/extra/mariabackup/fil_cur.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/fil_cur.cc 2024-08-03 07:29:56.000000000 +0000 @@ -199,12 +199,6 @@ return(XB_FIL_CUR_SKIP); } - if (srv_file_flush_method == SRV_O_DIRECT - || srv_file_flush_method == SRV_O_DIRECT_NO_FSYNC) { - - os_file_set_nocache(cursor->file, node->name, "OPEN"); - } - posix_fadvise(cursor->file, 0, 0, POSIX_FADV_SEQUENTIAL); cursor->page_size = node->space->physical_size(); @@ -237,12 +231,14 @@ / cursor->page_size); cursor->read_filter = read_filter; - cursor->read_filter->init(&cursor->read_filter_ctxt, cursor, - node->space->id); + cursor->read_filter->init(&cursor->read_filter_ctxt, cursor); return(XB_FIL_CUR_SUCCESS); } +/* Stack usage 131224 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static bool page_is_corrupted(const byte *page, ulint page_no, const xb_fil_cur_t *cursor, const fil_space_t *space) @@ -346,6 +342,7 @@ return buf_page_is_corrupted(true, page, space->flags); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** Reads and verifies the next block of pages from the source file. Positions the cursor after the last read non-corrupted page. @@ -508,10 +505,6 @@ /*=============*/ xb_fil_cur_t *cursor) /*!< in/out: source file cursor */ { - if (cursor->read_filter) { - cursor->read_filter->deinit(&cursor->read_filter_ctxt); - } - aligned_free(cursor->buf); cursor->buf = NULL; diff -Nru mariadb-10.11.6/extra/mariabackup/fil_cur.h mariadb-10.11.9/extra/mariabackup/fil_cur.h --- mariadb-10.11.6/extra/mariabackup/fil_cur.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/fil_cur.h 2024-08-03 07:29:56.000000000 +0000 @@ -27,6 +27,7 @@ #include #include "read_filt.h" +#include "mtr0types.h" #include "srv0start.h" #include "srv0srv.h" #include "xtrabackup.h" diff -Nru mariadb-10.11.6/extra/mariabackup/innobackupex.cc mariadb-10.11.9/extra/mariabackup/innobackupex.cc --- mariadb-10.11.6/extra/mariabackup/innobackupex.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/innobackupex.cc 2024-08-03 07:29:56.000000000 +0000 @@ -78,10 +78,8 @@ my_bool opt_ibx_slave_info = FALSE; my_bool opt_ibx_no_lock = FALSE; my_bool opt_ibx_safe_slave_backup = FALSE; -my_bool opt_ibx_rsync = FALSE; my_bool opt_ibx_force_non_empty_dirs = FALSE; my_bool opt_ibx_noversioncheck = FALSE; -my_bool opt_ibx_no_backup_locks = FALSE; my_bool opt_ibx_decompress = FALSE; char *opt_ibx_incremental_history_name = NULL; @@ -268,8 +266,10 @@ (uchar *) &opt_ibx_incremental, (uchar *) &opt_ibx_incremental, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"no-lock", OPT_NO_LOCK, "Use this option to disable table lock " - "with \"FLUSH TABLES WITH READ LOCK\". Use it only if ALL your " + {"no-lock", OPT_NO_LOCK, "This option should not be used as " + "mariadb-backup now is using BACKUP LOCKS, which minimizes the " + "lock time. ALTER TABLE can run in parallel with BACKUP LOCKS." + "Use the --no-lock option it only if ALL your " "tables are InnoDB and you DO NOT CARE about the binary log " "position of the backup. This option shouldn't be used if there " "are any DDL statements being executed or if any updates are " @@ -297,15 +297,6 @@ (uchar *) &opt_ibx_safe_slave_backup, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"rsync", OPT_RSYNC, "Uses the rsync utility to optimize local file " - "transfers. When this option is specified, innobackupex uses rsync " - "to copy all non-InnoDB files instead of spawning a separate cp for " - "each file, which can be much faster for servers with a large number " - "of databases or tables. This option cannot be used together with " - "--stream.", - (uchar *) &opt_ibx_rsync, (uchar *) &opt_ibx_rsync, - 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " "option, when specified, makes --copy-back or --move-back transfer " "files to non-empty directories. Note that no existing files will be " @@ -330,13 +321,9 @@ (uchar *) &opt_ibx_noversioncheck, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"no-backup-locks", OPT_NO_BACKUP_LOCKS, "This option controls if " - "backup locks should be used instead of FLUSH TABLES WITH READ LOCK " - "on the backup stage. The option has no effect when backup locks are " - "not supported by the server. This option is enabled by default, " - "disable with --no-backup-locks.", - (uchar *) &opt_ibx_no_backup_locks, - (uchar *) &opt_ibx_no_backup_locks, + {"no-backup-locks", OPT_NO_BACKUP_LOCKS, + "Old disabled option which has no effect anymore.", + (uchar *) 0, (uchar*) 0, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"decompress", OPT_DECOMPRESS, "Decompresses all files with the .qp " @@ -402,11 +389,10 @@ REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE, - "This option specifies which types of queries are allowed to complete " - "before innobackupex will issue the global lock. Default is all.", - (uchar*) &opt_ibx_lock_wait_query_type, - (uchar*) &opt_ibx_lock_wait_query_type, &query_type_typelib, - GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, &query_type_typelib, GET_ENUM, + REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, {"kill-long-query-type", OPT_KILL_LONG_QUERY_TYPE, "This option specifies which types of queries should be killed to " @@ -447,32 +433,32 @@ REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT, - "This option specifies the number of seconds innobackupex waits " - "between starting FLUSH TABLES WITH READ LOCK and killing those " - "queries that block it. Default is 0 seconds, which means " - "innobackupex will not attempt to kill any queries.", - (uchar*) &opt_ibx_kill_long_queries_timeout, - (uchar*) &opt_ibx_kill_long_queries_timeout, 0, GET_UINT, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, - "This option specifies time in seconds that innobackupex should wait " - "for queries that would block FTWRL before running it. If there are " - "still such queries when the timeout expires, innobackupex terminates " - "with an error. Default is 0, in which case innobackupex does not " - "wait for queries to complete and starts FTWRL immediately.", - (uchar*) &opt_ibx_lock_wait_timeout, - (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, + "Alias for startup-wait-timeout", + (uchar*) &opt_ibx_lock_wait_timeout, + (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, + REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"startup-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, + "This option specifies time in seconds that mariadb-backup should wait for " + "BACKUP STAGE START to complete. BACKUP STAGE START has to wait until all " + "currently running queries using explicite LOCK TABLES has ended. " + "If there are still such queries when the timeout expires, mariadb-backup " + "terminates with an error. Default is 0, in which case mariadb-backup waits " + "indefinitely for BACKUP STAGE START to finish", + (uchar*) &opt_ibx_lock_wait_timeout, + (uchar*) &opt_ibx_lock_wait_timeout, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD, - "This option specifies the query run time threshold which is used by " - "innobackupex to detect long-running queries with a non-zero value " - "of --ftwrl-wait-timeout. FTWRL is not started until such " - "long-running queries exist. This option has no effect if " - "--ftwrl-wait-timeout is 0. Default value is 60 seconds.", - (uchar*) &opt_ibx_lock_wait_threshold, - (uchar*) &opt_ibx_lock_wait_threshold, 0, GET_UINT, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, {"safe-slave-backup-timeout", OPT_SAFE_SLAVE_BACKUP_TIMEOUT, @@ -864,10 +850,8 @@ opt_slave_info = opt_ibx_slave_info; opt_no_lock = opt_ibx_no_lock; opt_safe_slave_backup = opt_ibx_safe_slave_backup; - opt_rsync = opt_ibx_rsync; opt_force_non_empty_dirs = opt_ibx_force_non_empty_dirs; opt_noversioncheck = opt_ibx_noversioncheck; - opt_no_backup_locks = opt_ibx_no_backup_locks; opt_decompress = opt_ibx_decompress; opt_incremental_history_name = opt_ibx_incremental_history_name; diff -Nru mariadb-10.11.6/extra/mariabackup/read_filt.cc mariadb-10.11.9/extra/mariabackup/read_filt.cc --- mariadb-10.11.6/extra/mariabackup/read_filt.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/read_filt.cc 2024-08-03 07:29:56.000000000 +0000 @@ -32,29 +32,13 @@ filters. */ static void -common_init( -/*========*/ +rf_pass_through_init( xb_read_filt_ctxt_t* ctxt, /*!offset = 0; ctxt->data_file_size = cursor->statinfo.st_size; ctxt->buffer_capacity = cursor->buf_size; - ctxt->page_size = cursor->page_size; -} - -/****************************************************************//** -Initialize the pass-through read filter. */ -static -void -rf_pass_through_init( -/*=================*/ - xb_read_filt_ctxt_t* ctxt, /*!offset; *read_batch_len = ctxt->data_file_size - ctxt->offset; - if (*read_batch_len > (ib_int64_t)ctxt->buffer_capacity) { - *read_batch_len = ctxt->buffer_capacity; - } - - ctxt->offset += *read_batch_len; -} - -/****************************************************************//** -Deinitialize the pass-through read filter. */ -static -void -rf_pass_through_deinit( -/*===================*/ - xb_read_filt_ctxt_t* ctxt __attribute__((unused))) - /*!bitmap_range = xb_page_bitmap_range_init(changed_page_bitmap, - space_id); - ctxt->filter_batch_end = 0; -} - -/****************************************************************//** -Get the next batch of pages for the bitmap read filter. */ -static -void -rf_bitmap_get_next_batch( -/*=====================*/ - xb_read_filt_ctxt_t* ctxt, /*!page_size; - - start_page_id = (ulint)(ctxt->offset / page_size); - - xb_a (ctxt->offset % page_size == 0); - - if (start_page_id == ctxt->filter_batch_end) { - - /* Used up all the previous bitmap range, get some more */ - ulint next_page_id; - - /* Find the next changed page using the bitmap */ - next_page_id = xb_page_bitmap_range_get_next_bit - (ctxt->bitmap_range, TRUE); - - if (next_page_id == ULINT_UNDEFINED) { - *read_batch_len = 0; - return; - } - - ctxt->offset = next_page_id * page_size; - - /* Find the end of the current changed page block by searching - for the next cleared bitmap bit */ - ctxt->filter_batch_end - = xb_page_bitmap_range_get_next_bit(ctxt->bitmap_range, - FALSE); - xb_a(next_page_id < ctxt->filter_batch_end); - } - - *read_batch_start = ctxt->offset; - if (ctxt->filter_batch_end == ULINT_UNDEFINED) { - /* No more cleared bits in the bitmap, need to copy all the - remaining pages. */ - *read_batch_len = ctxt->data_file_size - ctxt->offset; - } else { - *read_batch_len = ctxt->filter_batch_end * page_size - - ctxt->offset; - } - - /* If the page block is larger than the buffer capacity, limit it to - buffer capacity. The subsequent invocations will continue returning - the current block in buffer-sized pieces until ctxt->filter_batch_end - is reached, trigerring the next bitmap query. */ - if (*read_batch_len > (ib_int64_t)ctxt->buffer_capacity) { + if (*read_batch_len > (int64_t)ctxt->buffer_capacity) { *read_batch_len = ctxt->buffer_capacity; } ctxt->offset += *read_batch_len; - xb_a (ctxt->offset % page_size == 0); - xb_a (*read_batch_start % page_size == 0); - xb_a (*read_batch_len % page_size == 0); -} - -/****************************************************************//** -Deinitialize the changed page bitmap-based read filter. */ -static -void -rf_bitmap_deinit( -/*=============*/ - xb_read_filt_ctxt_t* ctxt) /*!bitmap_range); } /* The pass-through read filter */ xb_read_filt_t rf_pass_through = { &rf_pass_through_init, &rf_pass_through_get_next_batch, - &rf_pass_through_deinit -}; - -/* The changed page bitmap-based read filter */ -xb_read_filt_t rf_bitmap = { - &rf_bitmap_init, - &rf_bitmap_get_next_batch, - &rf_bitmap_deinit }; diff -Nru mariadb-10.11.6/extra/mariabackup/read_filt.h mariadb-10.11.9/extra/mariabackup/read_filt.h --- mariadb-10.11.6/extra/mariabackup/read_filt.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/read_filt.h 2024-08-03 07:29:56.000000000 +0000 @@ -25,42 +25,27 @@ #ifndef XB_READ_FILT_H #define XB_READ_FILT_H -#include "changed_page_bitmap.h" - -typedef uint32_t space_id_t; +#include +#include struct xb_fil_cur_t; /* The read filter context */ struct xb_read_filt_ctxt_t { - ib_int64_t offset; /*!< current file offset */ - ib_int64_t data_file_size; /*!< data file size */ + int64_t offset; /*!< current file offset */ + int64_t data_file_size; /*!< data file size */ size_t buffer_capacity;/*!< read buffer capacity */ - space_id_t space_id; /*!< space id */ - /* The following fields used only in bitmap filter */ - /* Move these to union if any other filters are added in future */ - xb_page_bitmap_range *bitmap_range; /*!< changed page bitmap range - iterator for space_id */ - ulint page_size; /*!< page size */ - ulint filter_batch_end;/*!< the ending page id of the - current changed page block in - the bitmap */ - /** TODO: remove this default constructor */ - xb_read_filt_ctxt_t() : page_size(0) {} }; /* The read filter */ struct xb_read_filt_t { void (*init)(xb_read_filt_ctxt_t* ctxt, - const xb_fil_cur_t* cursor, - ulint space_id); + const xb_fil_cur_t* cursor); void (*get_next_batch)(xb_read_filt_ctxt_t* ctxt, - ib_int64_t* read_batch_start, - ib_int64_t* read_batch_len); - void (*deinit)(xb_read_filt_ctxt_t* ctxt); + int64_t* read_batch_start, + int64_t* read_batch_len); }; extern xb_read_filt_t rf_pass_through; -extern xb_read_filt_t rf_bitmap; #endif diff -Nru mariadb-10.11.6/extra/mariabackup/thread_pool.cc mariadb-10.11.9/extra/mariabackup/thread_pool.cc --- mariadb-10.11.6/extra/mariabackup/thread_pool.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/thread_pool.cc 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,50 @@ +#include "thread_pool.h" +#include "common.h" + +bool ThreadPool::start(size_t threads_count) { + if (!m_stopped) + return false; + m_stopped = false; + for (unsigned i = 0; i < threads_count; ++i) + m_threads.emplace_back(&ThreadPool::thread_func, this, i); + return true; +} + +void ThreadPool::stop() { + if (m_stopped) + return; + m_stop = true; + m_cv.notify_all(); + for (auto &t : m_threads) + t.join(); + m_stopped = true; +}; + +void ThreadPool::push(ThreadPool::job_t &&j) { + std::unique_lock lock(m_mutex); + m_jobs.push(j); + lock.unlock(); + m_cv.notify_one(); +} + +void ThreadPool::thread_func(unsigned thread_num) { + if (my_thread_init()) + die("Can't init mysql thread"); + std::unique_lock lock(m_mutex); + while(true) { + if (m_stop) + goto exit; + while (!m_jobs.empty()) { + if (m_stop) + goto exit; + job_t j = std::move(m_jobs.front()); + m_jobs.pop(); + lock.unlock(); + j(thread_num); + lock.lock(); + } + m_cv.wait(lock, [&] { return m_stop || !m_jobs.empty(); }); + } +exit: + my_thread_end(); +} diff -Nru mariadb-10.11.6/extra/mariabackup/thread_pool.h mariadb-10.11.9/extra/mariabackup/thread_pool.h --- mariadb-10.11.6/extra/mariabackup/thread_pool.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/thread_pool.h 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,62 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include "trx0sys.h" + +class ThreadPool { +public: + typedef std::function job_t; + + ThreadPool() { m_stop = false; m_stopped = true; } + ThreadPool (ThreadPool &&other) = delete; + ThreadPool & operator= (ThreadPool &&other) = delete; + ThreadPool(const ThreadPool &) = delete; + ThreadPool & operator= (const ThreadPool &) = delete; + + bool start(size_t threads_count); + void stop(); + void push(job_t &&j); + size_t threads_count() const { return m_threads.size(); } +private: + void thread_func(unsigned thread_num); + std::mutex m_mutex; + std::condition_variable m_cv; + std::queue m_jobs; + std::atomic m_stop; + std::atomic m_stopped; + std::vector m_threads; +}; + +class TasksGroup { +public: + TasksGroup(ThreadPool &thread_pool) : m_thread_pool(thread_pool) { + m_tasks_count = 0; + m_tasks_result = 1; + } + void push_task(ThreadPool::job_t &&j) { + ++m_tasks_count; + m_thread_pool.push(std::forward(j)); + } + void finish_task(int res) { + --m_tasks_count; + m_tasks_result.fetch_and(res); + } + int get_result() const { return m_tasks_result; } + bool is_finished() const { + return !m_tasks_count; + } + bool wait_for_finish() { + while (!is_finished()) + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + return get_result(); + } +private: + ThreadPool &m_thread_pool; + std::atomic m_tasks_count; + std::atomic m_tasks_result; +}; diff -Nru mariadb-10.11.6/extra/mariabackup/write_filt.cc mariadb-10.11.9/extra/mariabackup/write_filt.cc --- mariadb-10.11.6/extra/mariabackup/write_filt.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/write_filt.cc 2024-08-03 07:29:56.000000000 +0000 @@ -144,6 +144,18 @@ return false; } + /* Check whether TRX_SYS page has been changed */ + if (mach_read_from_4(page + FIL_PAGE_SPACE_ID) + == TRX_SYS_SPACE + && mach_read_from_4(page + FIL_PAGE_OFFSET) + == TRX_SYS_PAGE_NO) { + msg(cursor->thread_n, + "--incremental backup is impossible if " + "the server had been restarted with " + "different innodb_undo_tablespaces."); + return false; + } + /* updated page */ if (cp->npages == page_size / 4) { /* flush buffer */ diff -Nru mariadb-10.11.6/extra/mariabackup/wsrep.cc mariadb-10.11.9/extra/mariabackup/wsrep.cc --- mariadb-10.11.6/extra/mariabackup/wsrep.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/wsrep.cc 2024-08-03 07:29:56.000000000 +0000 @@ -53,6 +53,10 @@ /*! Name of file where Galera info is stored on recovery */ #define XB_GALERA_INFO_FILENAME "xtrabackup_galera_info" +#define XB_GALERA_DONOR_INFO_FILENAME "donor_galera_info" + +/* backup copy of galera info file as sent by donor */ +#define XB_GALERA_INFO_FILENAME_SST "xtrabackup_galera_info_SST" /*********************************************************************** Store Galera checkpoint info in the 'xtrabackup_galera_info' file, if that @@ -67,21 +71,47 @@ long long seqno; MY_STAT statinfo; - /* Do not overwrite existing an existing file to be compatible with - servers with older server versions */ - if (!incremental_prepare && - my_stat(XB_GALERA_INFO_FILENAME, &statinfo, MYF(0)) != NULL) { - - return; - } - xid.null(); + /* try to read last wsrep XID from innodb rsegs, we will use it + instead of galera info file received from donor + */ if (!trx_rseg_read_wsrep_checkpoint(xid)) { - + /* no worries yet, SST may have brought in galera info file + from some old MariaDB version, which does not support + wsrep XID storing in innodb rsegs + */ return; } + /* if SST brought in galera info file, copy it as *_SST file + this will not be used, saved just for future reference + */ + if (my_stat(XB_GALERA_INFO_FILENAME, &statinfo, MYF(0)) != NULL) { + FILE* fp_in = fopen(XB_GALERA_INFO_FILENAME, "r"); + FILE* fp_out = fopen(XB_GALERA_INFO_FILENAME_SST, "w"); + + char buf[BUFSIZ] = {'\0'}; + size_t size; + while ((size = fread(buf, 1, BUFSIZ, fp_in))) { + if (fwrite(buf, 1, size, fp_out) != strlen(buf)) { + die( + "could not write to " + XB_GALERA_INFO_FILENAME_SST + ", errno = %d\n", + errno); + } + } + if (!feof(fp_in)) { + die( + XB_GALERA_INFO_FILENAME_SST + " not fully copied\n" + ); + } + fclose(fp_out); + fclose(fp_in); + } + wsrep_uuid_t uuid; memcpy(uuid.data, wsrep_xid_uuid(&xid), sizeof(uuid.data)); if (wsrep_uuid_print(&uuid, uuid_str, @@ -96,15 +126,15 @@ "could not create " XB_GALERA_INFO_FILENAME ", errno = %d\n", errno); - exit(EXIT_FAILURE); } seqno = wsrep_xid_seqno(&xid); - msg("mariabackup: Recovered WSREP position: %s:%lld\n", - uuid_str, (long long) seqno); + msg("mariabackup: Recovered WSREP position: %s:%lld domain_id: %lld\n", + uuid_str, (long long) seqno, (long long)wsrep_get_domain_id()); - if (fprintf(fp, "%s:%lld", uuid_str, (long long) seqno) < 0) { + if (fprintf(fp, "%s:%lld %lld", uuid_str, (long long) seqno, + (long long)wsrep_get_domain_id()) < 0) { die( "could not write to " XB_GALERA_INFO_FILENAME diff -Nru mariadb-10.11.6/extra/mariabackup/xb_plugin.cc mariadb-10.11.9/extra/mariabackup/xb_plugin.cc --- mariadb-10.11.6/extra/mariabackup/xb_plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xb_plugin.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,229 +0,0 @@ -/* Copyright (c) 2017, 2022, MariaDB Corporation. - - 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; version 2 of the License. - - 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, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -extern struct st_maria_plugin *mysql_optional_plugins[]; -extern struct st_maria_plugin *mysql_mandatory_plugins[]; -static void xb_plugin_init(int argc, char **argv); - -extern char *xb_plugin_load; -extern char *xb_plugin_dir; - -const int PLUGIN_MAX_ARGS = 1024; -std::vector backup_plugins_args; - -const char *QUERY_PLUGIN = -"SELECT plugin_name, plugin_library, @@plugin_dir" -" FROM information_schema.plugins WHERE plugin_type='ENCRYPTION'" -" OR (plugin_type = 'DAEMON' AND plugin_name LIKE 'provider\\_%')" -" AND plugin_status='ACTIVE'"; - -std::string xb_plugin_config; - -static void add_to_plugin_load_list(const char *plugin_def) -{ - opt_plugin_load_list_ptr->push_back(new i_string(plugin_def)); -} - -static char XTRABACKUP_EXE[] = "xtrabackup"; - -/* - Read "plugin-load" value from backup-my.cnf during prepare phase. - The value is stored during backup phase. -*/ -static std::string get_plugin_from_cnf(const char *dir) -{ - std::string path = dir + std::string("/backup-my.cnf"); - FILE *f = fopen(path.c_str(), "r"); - if (!f) - { - die("Can't open %s for reading", path.c_str()); - } - char line[512]; - std::string plugin_load; - while (fgets(line, sizeof(line), f)) - { - if (strncmp(line, "plugin_load=", 12) == 0) - { - plugin_load = line + 12; - // remote \n at the end of string - plugin_load.resize(plugin_load.size() - 1); - break; - } - } - fclose(f); - return plugin_load; -} - - -void xb_plugin_backup_init(MYSQL *mysql) -{ - MYSQL_RES *result; - MYSQL_ROW row; - std::ostringstream oss; - char *argv[PLUGIN_MAX_ARGS]; - char show_query[1024] = ""; - std::string plugin_load; - int argc; - - result = xb_mysql_query(mysql, QUERY_PLUGIN, true, true); - while ((row = mysql_fetch_row(result))) - { - char *name= row[0]; - char *library= row[1]; - char *dir= row[2]; - - if (!plugin_load.length()) - { -#ifdef _WIN32 - for (char *p = dir; *p; p++) - if (*p == '\\') *p = '/'; -#endif - strncpy(opt_plugin_dir, dir, FN_REFLEN - 1); - opt_plugin_dir[FN_REFLEN - 1] = '\0'; - oss << "plugin_dir=" << '"' << dir << '"' << std::endl; - } - - plugin_load += std::string(";") + name; - - if (library) - { - /* Remove shared library suffixes, in case we'll prepare on different OS.*/ - const char *extensions[] = { ".dll", ".so", 0 }; - for (size_t i = 0; extensions[i]; i++) - { - const char *ext = extensions[i]; - if (ends_with(library, ext)) - library[strlen(library) - strlen(ext)] = 0; - } - plugin_load += std::string("=") + library; - } - - if (strncmp(name, "provider_", 9) == 0) - continue; - - /* Read plugin variables. */ - snprintf(show_query, sizeof(show_query), "SHOW variables like '%s_%%'", name); - } - mysql_free_result(result); - if (!plugin_load.length()) - return; - - oss << "plugin_load=" << plugin_load.c_str() + 1 << std::endl; - - /* Required to load the plugin later.*/ - add_to_plugin_load_list(plugin_load.c_str() + 1); - - - if (*show_query) - { - result = xb_mysql_query(mysql, show_query, true, true); - while ((row = mysql_fetch_row(result))) - { - std::string arg("--"); - arg += row[0]; - arg += "="; - arg += row[1]; - backup_plugins_args.push_back(arg); - oss << row[0] << "=" << row[1] << std::endl; - } - - mysql_free_result(result); - - /* Check whether to encrypt logs. */ - result = xb_mysql_query(mysql, "select @@innodb_encrypt_log", true, true); - row = mysql_fetch_row(result); - srv_encrypt_log = (row != 0 && row[0][0] == '1'); - oss << "innodb_encrypt_log=" << row[0] << std::endl; - - mysql_free_result(result); - } - - xb_plugin_config = oss.str(); - - argc = 0; - argv[argc++] = XTRABACKUP_EXE; - for(size_t i = 0; i < backup_plugins_args.size(); i++) - { - argv[argc++] = (char *)backup_plugins_args[i].c_str(); - if (argc == PLUGIN_MAX_ARGS - 2) - break; - } - argv[argc] = 0; - - xb_plugin_init(argc, argv); -} - -const char *xb_plugin_get_config() -{ - return xb_plugin_config.c_str(); -} - -extern int finalize_encryption_plugin(st_plugin_int *plugin); - - -void xb_plugin_prepare_init(int argc, char **argv, const char *dir) -{ - std::string plugin_load= get_plugin_from_cnf(dir ? dir : "."); - if (plugin_load.size()) - { - msg("Loading plugins from %s", plugin_load.c_str()); - } - else - { - finalize_encryption_plugin(0); - return; - } - - add_to_plugin_load_list(plugin_load.c_str()); - - if (xb_plugin_dir) - { - strncpy(opt_plugin_dir, xb_plugin_dir, FN_REFLEN - 1); - opt_plugin_dir[FN_REFLEN - 1] = '\0'; - } - - char **new_argv = new char *[argc + 2]; - new_argv[0] = XTRABACKUP_EXE; - memcpy(&new_argv[1], argv, argc*sizeof(char *)); - - xb_plugin_init(argc+1, new_argv); - - delete[] new_argv; -} - -static void xb_plugin_init(int argc, char **argv) -{ - /* Patch optional and mandatory plugins, we only need to load the one in xb_plugin_load. */ - mysql_optional_plugins[0] = mysql_mandatory_plugins[0] = 0; - plugin_maturity = MariaDB_PLUGIN_MATURITY_UNKNOWN; /* mariabackup accepts all plugins */ - msg("Loading plugins"); - for (int i= 1; i < argc; i++) - msg("\t Plugin parameter : '%s'", argv[i]); - plugin_init(&argc, argv, PLUGIN_INIT_SKIP_PLUGIN_TABLE); -} - diff -Nru mariadb-10.11.6/extra/mariabackup/xb_plugin.h mariadb-10.11.9/extra/mariabackup/xb_plugin.h --- mariadb-10.11.6/extra/mariabackup/xb_plugin.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xb_plugin.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -#include -#include -extern void xb_plugin_backup_init(MYSQL *mysql); -extern const char* xb_plugin_get_config(); -extern void xb_plugin_prepare_init(int argc, char **argv, const char *dir); diff -Nru mariadb-10.11.6/extra/mariabackup/xbstream.cc mariadb-10.11.9/extra/mariabackup/xbstream.cc --- mariadb-10.11.6/extra/mariabackup/xbstream.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xbstream.cc 2024-08-03 07:29:56.000000000 +0000 @@ -262,7 +262,7 @@ return 1; } - stream = xb_stream_write_new(); + stream = xb_stream_write_new(nullptr, nullptr); if (stream == NULL) { msg("%s: xb_stream_write_new() failed.", my_progname); return 1; @@ -287,7 +287,7 @@ goto err; } - file = xb_stream_write_open(stream, filepath, &mystat, NULL, NULL); + file = xb_stream_write_open(stream, filepath, &mystat, false); if (file == NULL) { goto err; } @@ -314,7 +314,8 @@ static file_entry_t * -file_entry_new(extract_ctxt_t *ctxt, const char *path, uint pathlen) +file_entry_new(extract_ctxt_t *ctxt, const char *path, uint pathlen, + uchar chunk_flags) { file_entry_t *entry; ds_file_t *file; @@ -331,7 +332,8 @@ } entry->pathlen = pathlen; - file = ds_open(ctxt->ds_ctxt, path, NULL); + file = ds_open(ctxt->ds_ctxt, path, NULL, + chunk_flags == XB_STREAM_FLAG_REWRITE); if (file == NULL) { msg("%s: failed to create file.", my_progname); @@ -412,10 +414,50 @@ (uchar *) chunk.path, chunk.pathlen); + if (entry && (chunk.type == XB_CHUNK_TYPE_REMOVE || + chunk.type == XB_CHUNK_TYPE_RENAME)) { + msg("%s: rename and remove chunks can not be applied to opened file: %s", + my_progname, chunk.path); + pthread_mutex_unlock(ctxt->mutex); + break; + } + + if (chunk.type == XB_CHUNK_TYPE_REMOVE) { + if (ds_remove(ctxt->ds_ctxt, chunk.path)) { + msg("%s: error on file removing: %s", my_progname, chunk.path); + pthread_mutex_unlock(ctxt->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + pthread_mutex_unlock(ctxt->mutex); + continue; + } + + if (chunk.type == XB_CHUNK_TYPE_RENAME) { + if (my_hash_search(ctxt->filehash, + reinterpret_cast(chunk.data), chunk.length)) { + msg("%s: rename chunks can not be applied to opened file: %s", + my_progname, reinterpret_cast(chunk.data)); + pthread_mutex_unlock(ctxt->mutex); + break; + } + if (ds_rename(ctxt->ds_ctxt, chunk.path, + reinterpret_cast(chunk.data))) { + msg("%s: error on file renaming: %s to %s", my_progname, + reinterpret_cast(chunk.data), chunk.path); + pthread_mutex_unlock(ctxt->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + pthread_mutex_unlock(ctxt->mutex); + continue; + } + if (entry == NULL) { entry = file_entry_new(ctxt, chunk.path, - chunk.pathlen); + chunk.pathlen, + chunk.flags); if (entry == NULL) { pthread_mutex_unlock(ctxt->mutex); break; @@ -432,6 +474,18 @@ pthread_mutex_unlock(ctxt->mutex); + if (chunk.type == XB_CHUNK_TYPE_SEEK) { + if (ds_seek_set(entry->file, chunk.offset)) { + msg("%s: my_seek() failed.", my_progname); + pthread_mutex_unlock(&entry->mutex); + res = XB_STREAM_READ_ERROR; + break; + } + entry->offset = chunk.offset; + pthread_mutex_unlock(&entry->mutex); + continue; + } + res = xb_stream_validate_checksum(&chunk); if (res != XB_STREAM_READ_CHUNK) { diff -Nru mariadb-10.11.6/extra/mariabackup/xbstream.h mariadb-10.11.9/extra/mariabackup/xbstream.h --- mariadb-10.11.6/extra/mariabackup/xbstream.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xbstream.h 2024-08-03 07:29:56.000000000 +0000 @@ -29,6 +29,7 @@ /* Chunk flags */ /* Chunk can be ignored if unknown version/format */ #define XB_STREAM_FLAG_IGNORABLE 0x01 +#define XB_STREAM_FLAG_REWRITE 0x02 /* Magic + flags + type + path len */ #define CHUNK_HEADER_CONSTANT_LEN ((sizeof(XB_STREAM_CHUNK_MAGIC) - 1) + \ @@ -48,18 +49,21 @@ /************************************************************************ Write interface. */ -typedef ssize_t xb_stream_write_callback(xb_wstream_file_t *file, +typedef ssize_t xb_stream_write_callback( void *userdata, const void *buf, size_t len); -xb_wstream_t *xb_stream_write_new(void); - +xb_wstream_t *xb_stream_write_new( + xb_stream_write_callback *write_callback, void *user_data); xb_wstream_file_t *xb_stream_write_open(xb_wstream_t *stream, const char *path, - MY_STAT *mystat, void *userdata, - xb_stream_write_callback *onwrite); + const MY_STAT *mystat, bool rewrite); int xb_stream_write_data(xb_wstream_file_t *file, const void *buf, size_t len); - +int xb_stream_write_seek_set(xb_wstream_file_t *file, my_off_t offset); +int xb_stream_write_remove(xb_wstream_t *stream, const char *path); +int +xb_stream_write_rename( + xb_wstream_t *stream, const char *old_path, const char *new_path); int xb_stream_write_close(xb_wstream_file_t *file); int xb_stream_write_done(xb_wstream_t *stream); @@ -76,6 +80,9 @@ typedef enum { XB_CHUNK_TYPE_UNKNOWN = '\0', XB_CHUNK_TYPE_PAYLOAD = 'P', + XB_CHUNK_TYPE_RENAME = 'R', + XB_CHUNK_TYPE_REMOVE = 'D', + XB_CHUNK_TYPE_SEEK = 'S', XB_CHUNK_TYPE_EOF = 'E' } xb_chunk_type_t; diff -Nru mariadb-10.11.6/extra/mariabackup/xbstream_read.cc mariadb-10.11.9/extra/mariabackup/xbstream_read.cc --- mariadb-10.11.6/extra/mariabackup/xbstream_read.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xbstream_read.cc 2024-08-03 07:29:56.000000000 +0000 @@ -59,6 +59,9 @@ { switch ((xb_chunk_type_t) code) { case XB_CHUNK_TYPE_PAYLOAD: + case XB_CHUNK_TYPE_RENAME: + case XB_CHUNK_TYPE_REMOVE: + case XB_CHUNK_TYPE_SEEK: case XB_CHUNK_TYPE_EOF: return (xb_chunk_type_t) code; default: @@ -159,57 +162,91 @@ } chunk->path[pathlen] = '\0'; - if (chunk->type == XB_CHUNK_TYPE_EOF) { + if (chunk->type == XB_CHUNK_TYPE_EOF || + chunk->type == XB_CHUNK_TYPE_REMOVE) { return XB_STREAM_READ_CHUNK; } - /* Payload length */ - F_READ(tmpbuf, 16); - ullval = uint8korr(tmpbuf); - if (ullval > (ulonglong) SIZE_T_MAX) { - msg("xb_stream_read_chunk(): chunk length is too large at " - "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, - ullval); - goto err; + if (chunk->type == XB_CHUNK_TYPE_RENAME) { + F_READ(tmpbuf, 4); + size_t new_pathlen = uint4korr(tmpbuf); + if (new_pathlen >= FN_REFLEN) { + msg("xb_stream_read_chunk(): path length (%lu) for new name of 'rename'" + " chunk is too large", (ulong) new_pathlen); + goto err; + } + chunk->length = new_pathlen; + stream->offset +=4; } - chunk->length = (size_t) ullval; - stream->offset += 8; + else if (chunk->type == XB_CHUNK_TYPE_SEEK) { + F_READ(tmpbuf, 8); + chunk->offset = uint8korr(tmpbuf); + stream->offset += 8; + return XB_STREAM_READ_CHUNK; + } + else { + /* Payload length */ + F_READ(tmpbuf, 16); + ullval = uint8korr(tmpbuf); + if (ullval > (ulonglong) SIZE_T_MAX) { + msg("xb_stream_read_chunk(): chunk length is too large at " + "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, + ullval); + goto err; + } + chunk->length = (size_t) ullval; + stream->offset += 8; - /* Payload offset */ - ullval = uint8korr(tmpbuf + 8); - if (ullval > (ulonglong) MY_OFF_T_MAX) { - msg("xb_stream_read_chunk(): chunk offset is too large at " - "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, - ullval); - goto err; + /* Payload offset */ + ullval = uint8korr(tmpbuf + 8); + if (ullval > (ulonglong) MY_OFF_T_MAX) { + msg("xb_stream_read_chunk(): chunk offset is too large at " + "offset 0x%llx: 0x%llx.", (ulonglong) stream->offset, + ullval); + goto err; + } + chunk->offset = (my_off_t) ullval; + stream->offset += 8; } - chunk->offset = (my_off_t) ullval; - stream->offset += 8; - /* Reallocate the buffer if needed */ - if (chunk->length > chunk->buflen) { - chunk->data = my_realloc(PSI_NOT_INSTRUMENTED, chunk->data, chunk->length, - MYF(MY_WME | MY_ALLOW_ZERO_PTR)); + /* Reallocate the buffer if needed, take into account trailing '\0' for + new file name in the case of XB_CHUNK_TYPE_RENAME */ + if (chunk->length + 1 > chunk->buflen) { + chunk->data = my_realloc(PSI_NOT_INSTRUMENTED, chunk->data, + chunk->length + 1, MYF(MY_WME | MY_ALLOW_ZERO_PTR)); if (chunk->data == NULL) { msg("xb_stream_read_chunk(): failed to increase buffer " - "to %lu bytes.", (ulong) chunk->length); + "to %lu bytes.", (ulong) chunk->length + 1); goto err; } - chunk->buflen = chunk->length; + chunk->buflen = chunk->length + 1; } - /* Checksum */ - F_READ(tmpbuf, 4); - chunk->checksum = uint4korr(tmpbuf); - chunk->checksum_offset = stream->offset; - - /* Payload */ - if (chunk->length > 0) { + if (chunk->type == XB_CHUNK_TYPE_RENAME) { + if (chunk->length == 0) { + msg("xb_stream_read_chunk(): failed to read new name for file to rename " + ": %s", chunk->path); + goto err; + } F_READ(chunk->data, chunk->length); stream->offset += chunk->length; + reinterpret_cast(chunk->data)[chunk->length] = '\0'; + ++chunk->length; } + else { + /* Checksum */ + F_READ(tmpbuf, 4); + chunk->checksum = uint4korr(tmpbuf); + chunk->checksum_offset = stream->offset; + + /* Payload */ + if (chunk->length > 0) { + F_READ(chunk->data, chunk->length); + stream->offset += chunk->length; + } - stream->offset += 4; + stream->offset += 4; + } return XB_STREAM_READ_CHUNK; diff -Nru mariadb-10.11.6/extra/mariabackup/xbstream_write.cc mariadb-10.11.9/extra/mariabackup/xbstream_write.cc --- mariadb-10.11.6/extra/mariabackup/xbstream_write.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xbstream_write.cc 2024-08-03 07:29:56.000000000 +0000 @@ -21,6 +21,7 @@ #include #include #include +#include #include "common.h" #include "xbstream.h" @@ -29,6 +30,8 @@ struct xb_wstream_struct { pthread_mutex_t mutex; + xb_stream_write_callback *write; + void *user_data; }; struct xb_wstream_file_struct { @@ -39,8 +42,7 @@ char *chunk_ptr; size_t chunk_free; my_off_t offset; - void *userdata; - xb_stream_write_callback *write; + bool rewrite; }; static int xb_stream_flush(xb_wstream_file_t *file); @@ -50,7 +52,7 @@ static ssize_t -xb_stream_default_write_callback(xb_wstream_file_t *file __attribute__((unused)), +xb_stream_default_write_callback( void *userdata __attribute__((unused)), const void *buf, size_t len) { @@ -60,21 +62,31 @@ } xb_wstream_t * -xb_stream_write_new(void) +xb_stream_write_new( + xb_stream_write_callback *write_callback, void *user_data) { xb_wstream_t *stream; stream = (xb_wstream_t *) my_malloc(PSI_NOT_INSTRUMENTED, sizeof(xb_wstream_t), MYF(MY_FAE)); pthread_mutex_init(&stream->mutex, NULL); + if (write_callback) { +#ifdef _WIN32 + setmode(fileno(stdout), _O_BINARY); +#endif + stream->write = write_callback; + stream->user_data = user_data; + } + else { + stream->write = xb_stream_default_write_callback; + stream->user_data = user_data; + } return stream;; } xb_wstream_file_t * xb_stream_write_open(xb_wstream_t *stream, const char *path, - MY_STAT *mystat __attribute__((unused)), - void *userdata, - xb_stream_write_callback *onwrite) + const MY_STAT *mystat __attribute__((unused)), bool rewrite) { xb_wstream_file_t *file; size_t path_len; @@ -109,16 +121,7 @@ file->offset = 0; file->chunk_ptr = file->chunk; file->chunk_free = XB_STREAM_MIN_CHUNK_SIZE; - if (onwrite) { -#ifdef _WIN32 - setmode(fileno(stdout), _O_BINARY); -#endif - file->userdata = userdata; - file->write = onwrite; - } else { - file->userdata = NULL; - file->write = xb_stream_default_write_callback; - } + file->rewrite = rewrite; return file; } @@ -202,7 +205,8 @@ memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; - *ptr++ = 0; /* Chunk flags */ + *ptr++ = + file->rewrite ? XB_STREAM_FLAG_REWRITE : 0; /* Chunk flags */ *ptr++ = (uchar) XB_CHUNK_TYPE_PAYLOAD; /* Chunk type */ @@ -227,11 +231,11 @@ xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); - if (file->write(file, file->userdata, tmpbuf, ptr-tmpbuf) == -1) + if (stream->write(stream->user_data, tmpbuf, ptr-tmpbuf) == -1) goto err; - if (file->write(file, file->userdata, buf, len) == -1) /* Payload */ + if (stream->write(stream->user_data, buf, len) == -1) /* Payload */ goto err; file->offset+= len; @@ -247,6 +251,38 @@ return 1; } +int xb_stream_write_seek_set(xb_wstream_file_t *file, my_off_t offset) +{ + /* Chunk magic + flags + chunk type + path_len + path + offset */ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + 4 + + FN_REFLEN + 8]; + int error = 0; + xb_wstream_t *stream = file->stream; + uchar *ptr = tmpbuf; + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + *ptr++ = 0; /* Chunk flags */ + *ptr++ = (uchar) XB_CHUNK_TYPE_SEEK; /* Chunk type */ + int4store(ptr, file->path_len); /* Path length */ + ptr += 4; + memcpy(ptr, file->path, file->path_len); /* Path */ + ptr += file->path_len; + int8store(ptr, static_cast(offset)); /* Offset */ + ptr += 8; + if (xb_stream_flush(file)) + return 1; + pthread_mutex_lock(&stream->mutex); + if (stream->write(stream->user_data, tmpbuf, ptr-tmpbuf) == -1) + error = 1; + if (!error) + file->offset = offset; + pthread_mutex_unlock(&stream->mutex); + if (xb_stream_flush(file)) + return 1; + return error; +} + static int xb_stream_write_eof(xb_wstream_file_t *file) @@ -278,7 +314,7 @@ xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); - if (file->write(file, file->userdata, tmpbuf, + if (stream->write(stream->user_data, tmpbuf, (ulonglong) (ptr - tmpbuf)) == -1) goto err; @@ -291,3 +327,77 @@ return 1; } + + +int +xb_stream_write_remove(xb_wstream_t *stream, const char *path) { + /* Chunk magic + flags + chunk type + path_len + path */ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + 4 + FN_REFLEN]; + uchar *ptr = tmpbuf; + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + + *ptr++ = 0; /* Chunk flags */ + + *ptr++ = (uchar) XB_CHUNK_TYPE_REMOVE; /* Chunk type */ + size_t path_len = strlen(path); + int4store(ptr, path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, path, path_len); /* Path */ + ptr += path_len; + + xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); + + pthread_mutex_lock(&stream->mutex); + + ssize_t result = stream->write(stream->user_data, tmpbuf, + (ulonglong) (ptr - tmpbuf)); + + pthread_mutex_unlock(&stream->mutex); + + return result < 0; + +} + +int +xb_stream_write_rename( + xb_wstream_t *stream, const char *old_path, const char *new_path) { + /* Chunk magic + flags + chunk type + path_len + path + path_len + path*/ + uchar tmpbuf[sizeof(XB_STREAM_CHUNK_MAGIC) - 1 + 1 + 1 + + 4 + FN_REFLEN + 4 + FN_REFLEN]; + uchar *ptr = tmpbuf; + /* Chunk magic */ + memcpy(ptr, XB_STREAM_CHUNK_MAGIC, sizeof(XB_STREAM_CHUNK_MAGIC) - 1); + ptr += sizeof(XB_STREAM_CHUNK_MAGIC) - 1; + + *ptr++ = 0; /* Chunk flags */ + + *ptr++ = (uchar) XB_CHUNK_TYPE_RENAME; /* Chunk type */ + size_t path_len = strlen(old_path); + int4store(ptr, path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, old_path, path_len); /* Path */ + ptr += path_len; + + path_len = strlen(new_path); + int4store(ptr, path_len); /* Path length */ + ptr += 4; + + memcpy(ptr, new_path, path_len); /* Path */ + ptr += path_len; + + xb_ad(ptr <= tmpbuf + sizeof(tmpbuf)); + + pthread_mutex_lock(&stream->mutex); + + ssize_t result = stream->write(stream->user_data, tmpbuf, + (ulonglong) (ptr - tmpbuf)); + + pthread_mutex_unlock(&stream->mutex); + + return result < 0; +} + diff -Nru mariadb-10.11.6/extra/mariabackup/xtrabackup.cc mariadb-10.11.9/extra/mariabackup/xtrabackup.cc --- mariadb-10.11.6/extra/mariabackup/xtrabackup.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xtrabackup.cc 2024-08-03 07:29:56.000000000 +0000 @@ -4,7 +4,7 @@ Originally Created 3/3/2009 Yasufumi Kinoshita Written by Alexey Kopytov, Aleksandr Kuzminsky, Stewart Smith, Vadim Tkachenko, Yasufumi Kinoshita, Ignacio Nin and Baron Schwartz. -(c) 2017, 2022, MariaDB Corporation. +(c) 2017, 2024, MariaDB Corporation. Portions written by Marko Mäkelä. This program is free software; you can redistribute it and/or modify @@ -54,7 +54,6 @@ #include #include -#include #include #ifdef __linux__ @@ -70,6 +69,7 @@ # include #endif +#include "aria_backup_client.h" #include #include @@ -82,6 +82,7 @@ #include #include #include "ha_innodb.h" +#include "fts0types.h" #include #include @@ -97,23 +98,26 @@ #include "xb_regex.h" #include "fil_cur.h" #include "write_filt.h" -#include "xtrabackup.h" #include "ds_buffer.h" #include "ds_tmpfile.h" #include "xbstream.h" -#include "changed_page_bitmap.h" #include "read_filt.h" #include "backup_wsrep.h" #include "innobackupex.h" #include "backup_mysql.h" #include "backup_copy.h" #include "backup_mysql.h" -#include "xb_plugin.h" +#include "encryption_plugin.h" #include #include #include #include #include +#include +#include "ddl_log.h" +#include "common_engine.h" +#include "lex_string.h" +#include "sql_table.h" #include "backup_debug.h" #define MB_CORRUPTED_PAGES_FILE "innodb_corrupted_pages" @@ -126,8 +130,12 @@ int sys_var_init(); +extern const char* fts_common_tables[]; +extern const fts_index_selector_t fts_index_selector[]; + /* === xtrabackup specific options === */ -char xtrabackup_real_target_dir[FN_REFLEN] = "./xtrabackup_backupfiles/"; +#define DEFAULT_TARGET_DIR "./xtrabackup_backupfiles/" +char xtrabackup_real_target_dir[FN_REFLEN] = DEFAULT_TARGET_DIR; char *xtrabackup_target_dir= xtrabackup_real_target_dir; static my_bool xtrabackup_version; static my_bool verbose; @@ -139,8 +147,8 @@ my_bool xtrabackup_print_param; my_bool xtrabackup_mysqld_args; my_bool xtrabackup_help; - my_bool xtrabackup_export; +my_bool ignored_option; longlong xtrabackup_use_memory; @@ -154,7 +162,6 @@ lsn_t incremental_lsn; lsn_t incremental_to_lsn; lsn_t incremental_last_lsn; -xb_page_bitmap *changed_page_bitmap; char *xtrabackup_incremental_basedir; /* for --backup */ char *xtrabackup_extra_lsndir; /* for --backup with --extra-lsndir */ @@ -194,10 +201,12 @@ xb_filter_entry_t *name_hash; }; +lsn_t checkpoint_lsn_start; +lsn_t checkpoint_no_start; /** whether log_copying_thread() is active; protected by recv_sys.mutex */ static bool log_copying_running; -int xtrabackup_parallel; +uint xtrabackup_parallel; char *xtrabackup_stream_str = NULL; xb_stream_fmt_t xtrabackup_stream_fmt = XB_STREAM_FMT_NONE; @@ -254,7 +263,7 @@ static std::set fail_undo_ids; longlong innobase_page_size = (1LL << 14); /* 16KB */ -char* innobase_buffer_pool_filename = NULL; +char *innobase_buffer_pool_filename = NULL; /* The default values for the following char* start-up parameters are determined in innobase_init below: */ @@ -360,10 +369,8 @@ my_bool opt_slave_info = FALSE; my_bool opt_no_lock = FALSE; my_bool opt_safe_slave_backup = FALSE; -my_bool opt_rsync = FALSE; my_bool opt_force_non_empty_dirs = FALSE; my_bool opt_noversioncheck = FALSE; -my_bool opt_no_backup_locks = FALSE; my_bool opt_decompress = FALSE; my_bool opt_remove_original; my_bool opt_log_innodb_page_corruption; @@ -409,6 +416,9 @@ const char *opt_history = NULL; +/* Whether xtrabackup_binlog_info should be created on recovery */ +static bool recover_binlog_info; + char mariabackup_exe[FN_REFLEN]; char orig_argv1[FN_REFLEN]; @@ -418,6 +428,8 @@ /** Store the deferred tablespace name during --backup */ static std::set defer_space_names; +typedef decltype(fil_space_t::id) space_id_t; + typedef std::map space_id_to_name_t; struct ddl_tracker_t { @@ -692,8 +704,190 @@ uint32_t defer_space_id); static dberr_t enumerate_ibd_files(process_single_tablespace_func_t callback); +const char *convert_dst(const char *dst) { + return + (xtrabackup_copy_back || xtrabackup_move_back) ? + dst : trim_dotslash(dst); +} + +std::string convert_tablename_to_filepath( + const char *data_dir_path, const std::string &db, const std::string &table) { + char dbbuff[FN_REFLEN]; + char tbbuff[FN_REFLEN]; + (void)tablename_to_filename(db.c_str(), dbbuff, sizeof(dbbuff)); + (void)tablename_to_filename(table.c_str(), tbbuff, sizeof(tbbuff)); + std::string result(data_dir_path); + result.append(1, FN_LIBCHAR).append(dbbuff). + append(1, FN_LIBCHAR).append(tbbuff); + return result; +} + +std::tuple +convert_filepath_to_tablename(const char *filepath) { + char db_name_orig[FN_REFLEN]; + char table_name_orig[FN_REFLEN]; + parse_db_table_from_file_path(filepath, db_name_orig, table_name_orig); + if (!db_name_orig[0] || !table_name_orig[0]) + return std::make_tuple("", "", ""); + char db_name_conv[FN_REFLEN]; + char table_name_conv[FN_REFLEN]; + filename_to_tablename(db_name_orig, db_name_conv, sizeof(db_name_conv)); + filename_to_tablename( + table_name_orig, table_name_conv, sizeof(table_name_conv)); + if (!db_name_conv[0] || !table_name_conv[0]) + return std::make_tuple("", "", ""); + return std::make_tuple(db_name_conv, table_name_conv, + std::string(db_name_orig).append("/").append(table_name_orig)); +} + +std::string get_table_version_from_image(const std::vector &frm_image) { + DBUG_ASSERT(frm_image.size() >= 64); + + if (!strncmp((char*) frm_image.data(), "TYPE=VIEW\n", 10)) + return {}; + + if (!is_binary_frm_header(frm_image.data())) + return {}; + + /* Length of the MariaDB extra2 segment in the form file. */ + uint len = uint2korr(frm_image.data() + 4); + const uchar *extra2= frm_image.data() + 64; + + if (*extra2 == '/') // old frm had '/' there + return {}; + + const uchar *e2end= extra2 + len; + while (extra2 + 3 <= e2end) + { + uchar type= *extra2++; + size_t length= *extra2++; + if (!length) + { + if (extra2 + 2 >= e2end) + return {}; + length= uint2korr(extra2); + extra2+= 2; + if (length < 256) + return {}; + } + if (extra2 + length > e2end) + return {}; + if (type == EXTRA2_TABLEDEF_VERSION) { + char buff[MY_UUID_STRING_LENGTH]; + my_uuid2str(extra2, buff, 1); + return std::string(buff, buff + MY_UUID_STRING_LENGTH); + } + extra2+= length; + } + + return {}; +} + +std::pair + get_table_engine_from_image(const std::vector &frm_image) { + + DBUG_ASSERT(frm_image.size() >= 64); + + if (!strncmp((char*) frm_image.data(), "TYPE=VIEW\n", 10)) + return std::make_pair(false, DB_TYPE_UNKNOWN); + + if (!is_binary_frm_header(frm_image.data())) + return std::make_pair(false, DB_TYPE_UNKNOWN); + + legacy_db_type dbt = (legacy_db_type)frm_image[3]; + + if (dbt >= DB_TYPE_FIRST_DYNAMIC) + return std::make_pair(false, DB_TYPE_UNKNOWN); + + if (dbt != DB_TYPE_PARTITION_DB) + return std::make_pair(false, dbt); + + dbt = (legacy_db_type)frm_image[61]; + return std::make_pair(true, + dbt < DB_TYPE_FIRST_DYNAMIC ? dbt : DB_TYPE_UNKNOWN); +} + +std::vector read_frm_image(File file) { + std::vector frm_image; + MY_STAT state; + + if (mysql_file_fstat(file, &state, MYF(MY_WME))) + return frm_image; + + frm_image.resize((size_t)state.st_size, 0); + + if (mysql_file_read( + file, frm_image.data(), (size_t)state.st_size, MYF(MY_NABP))) + frm_image.clear(); + + return frm_image; +} + +std::string read_table_version_id(File file) { + auto frm_image = read_frm_image(file); + if (frm_image.empty()) + return {}; + return get_table_version_from_image(frm_image); +} + +bool is_log_table(const char *dbname, const char *tablename) { + DBUG_ASSERT(dbname); + DBUG_ASSERT(tablename); + + LEX_CSTRING lex_db; + LEX_CSTRING lex_table; + lex_db.str = dbname; + lex_db.length = strlen(dbname); + lex_table.str = tablename; + lex_table.length = strlen(tablename); + + if (!lex_string_eq(&MYSQL_SCHEMA_NAME, &lex_db)) + return false; + + if (lex_string_eq(&GENERAL_LOG_NAME, &lex_table)) + return true; + + if (lex_string_eq(&SLOW_LOG_NAME, &lex_table)) + return true; + + return false; +} + +bool is_stats_table(const char *dbname, const char *tablename) { + DBUG_ASSERT(dbname); + DBUG_ASSERT(tablename); + + LEX_CSTRING lex_db; + LEX_CSTRING lex_table; + lex_db.str = dbname; + lex_db.length = strlen(dbname); + lex_table.str = tablename; + lex_table.length = strlen(tablename); + + if (!lex_string_eq(&MYSQL_SCHEMA_NAME, &lex_db)) + return false; + + CHARSET_INFO *ci= system_charset_info; + + return (lex_table.length > 4 && + /* one of mysql.*_stat tables, but not mysql.innodb* tables*/ + ((my_tolower(ci, lex_table.str[lex_table.length-5]) == 's' && + my_tolower(ci, lex_table.str[lex_table.length-4]) == 't' && + my_tolower(ci, lex_table.str[lex_table.length-3]) == 'a' && + my_tolower(ci, lex_table.str[lex_table.length-2]) == 't' && + my_tolower(ci, lex_table.str[lex_table.length-1]) == 's') && + !(my_tolower(ci, lex_table.str[0]) == 'i' && + my_tolower(ci, lex_table.str[1]) == 'n' && + my_tolower(ci, lex_table.str[2]) == 'n' && + my_tolower(ci, lex_table.str[3]) == 'o'))); +} + /* ======== Datafiles iterator ======== */ struct datafiles_iter_t { + datafiles_iter_t() : space(fil_system.space_list.end()), node(nullptr), started(FALSE) { + } + ~datafiles_iter_t() { + } space_list_t::iterator space = fil_system.space_list.end(); fil_node_t *node = nullptr; bool started = false; @@ -773,8 +967,6 @@ return nullptr; } -static pthread_t dbug_alter_thread; - /* Execute query from a new connection, in own thread. @@ -785,8 +977,9 @@ otherwise query should return error. @param expected_errno - if not 0, and query finished with error, expected mysql_errno() +@return created thread id */ -static void dbug_start_query_thread( +static pthread_t dbug_start_query_thread( const char *query, const char *wait_state, int expected_err, @@ -798,12 +991,14 @@ par->expect_err = expected_err; par->expect_errno = expected_errno; par->con = xb_mysql_connect(); - - mysql_thread_create(0, &dbug_alter_thread, nullptr, + if (mysql_set_server_option(par->con, MYSQL_OPTION_MULTI_STATEMENTS_ON)) + die("Can't set multistatement option for query: %s", query); + pthread_t result_thread; + mysql_thread_create(0, &result_thread, nullptr, dbug_execute_in_new_connection, par); if (!wait_state) - return; + return result_thread; char q[256]; snprintf(q, sizeof(q), @@ -825,7 +1020,11 @@ end: msg("query '%s' on connection %lu reached state '%s'", query, mysql_thread_id(par->con), wait_state); + return result_thread; } + +static pthread_t dbug_alter_thread; +static pthread_t dbug_emulate_ddl_on_intermediate_table_thread; #endif void mdl_lock_all() @@ -948,6 +1147,31 @@ } } +static bool check_if_fts_table(const char *file_name) { + const char *table_name_start = strrchr(file_name, '/'); + if (table_name_start) + ++table_name_start; + else + table_name_start = file_name; + + if (!starts_with(table_name_start,"FTS_")) + return false; + + const char *table_name_end = strrchr(table_name_start, '.'); + if (!table_name_end) + table_name_end = table_name_start + strlen(table_name_start); + ptrdiff_t table_name_len = table_name_end - table_name_end; + + for (const char **suffix = fts_common_tables; *suffix; ++suffix) + if (!strncmp(table_name_start, *suffix, table_name_len)) + return true; + for (size_t i = 0; fts_index_selector[i].suffix; ++i) + if (!strncmp(table_name_start, fts_index_selector[i].suffix, + table_name_len)) + return true; + + return false; +} /* This callback is called if DDL operation is detected, @@ -981,8 +1205,9 @@ break; case FILE_DELETE: fail = !check_if_skip_table( - filename_to_spacename(name, len).c_str()); - msg("DDL tracking : delete %u \"%.*s\"", space_id, int(len), name); + filename_to_spacename(name, len).c_str()) + && !check_if_fts_table(reinterpret_cast(name)); + msg("DDL tracking : delete %u \"%.*s\"", space_id, int(len), name); break; default: ut_ad(0); @@ -1108,6 +1333,7 @@ OPT_INNODB_LOG_FILE_BUFFERING, #endif OPT_INNODB_LOG_FILE_SIZE, + OPT_INNODB_LOG_WRITE_AHEAD_SIZE, OPT_INNODB_OPEN_FILES, OPT_XTRA_DEBUG_SYNC, OPT_INNODB_CHECKSUM_ALGORITHM, @@ -1125,9 +1351,9 @@ OPT_NO_LOCK, OPT_SAFE_SLAVE_BACKUP, OPT_RSYNC, + OPT_NO_BACKUP_LOCKS, OPT_FORCE_NON_EMPTY_DIRS, OPT_NO_VERSION_CHECK, - OPT_NO_BACKUP_LOCKS, OPT_DECOMPRESS, OPT_INCREMENTAL_HISTORY_NAME, OPT_INCREMENTAL_HISTORY_UUID, @@ -1266,22 +1492,25 @@ {"compress", OPT_XTRA_COMPRESS, "Compress individual backup files using the " - "specified compression algorithm. Currently the only supported algorithm " - "is 'quicklz'. It is also the default algorithm, i.e. the one used when " - "--compress is used without an argument.", + "specified compression algorithm. It uses no longer maintained QuickLZ " + "library hence this option was deprecated with MariaDB 10.1.31 and 10.2.13.", (G_PTR *) &xtrabackup_compress_alg, (G_PTR *) &xtrabackup_compress_alg, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, {"compress-threads", OPT_XTRA_COMPRESS_THREADS, "Number of threads for parallel data compression. The default value is " - "1.", + "1. " + "This option was deprecated as it relies on the no longer " + "maintained QuickLZ library.", (G_PTR *) &xtrabackup_compress_threads, (G_PTR *) &xtrabackup_compress_threads, 0, GET_UINT, REQUIRED_ARG, 1, 1, UINT_MAX, 0, 0, 0}, {"compress-chunk-size", OPT_XTRA_COMPRESS_CHUNK_SIZE, "Size of working buffer(s) for compression threads in bytes. The default " - "value is 64K.", + "value is 64K. " + "This option was deprecated as it relies on the no longer " + "maintained QuickLZ library.", (G_PTR *) &xtrabackup_compress_chunk_size, (G_PTR *) &xtrabackup_compress_chunk_size, 0, GET_ULL, REQUIRED_ARG, (1 << 16), 1024, ULONGLONG_MAX, 0, 0, 0}, @@ -1336,8 +1565,10 @@ 0, 0, 0, 0, 0, 0}, {"no-lock", OPT_NO_LOCK, - "Use this option to disable table lock " - "with \"FLUSH TABLES WITH READ LOCK\". Use it only if ALL your " + "This option should not be used as " + "mariadb-backup now is using BACKUP LOCKS, which minimizes the " + "lock time. ALTER TABLE can run in parallel with BACKUP LOCKS." + "Use the --no-lock option it only if ALL your " "tables are InnoDB and you DO NOT CARE about the binary log " "position of the backup. This option shouldn't be used if there " "are any DDL statements being executed or if any updates are " @@ -1366,14 +1597,12 @@ GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"rsync", OPT_RSYNC, - "Uses the rsync utility to optimize local file " - "transfers. When this option is specified, " XB_TOOL_NAME " uses rsync " - "to copy all non-InnoDB files instead of spawning a separate cp for " - "each file, which can be much faster for servers with a large number " - "of databases or tables. This option cannot be used together with " - "--stream.", - (uchar *) &opt_rsync, (uchar *) &opt_rsync, 0, GET_BOOL, NO_ARG, 0, 0, 0, - 0, 0, 0}, + "Obsolete, deprecated option", + &ignored_option, &ignored_option, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + + {"no-backup-locks", OPT_NO_BACKUP_LOCKS, + "Obsolete, deprecated option", + &ignored_option, &ignored_option, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " @@ -1391,18 +1620,11 @@ (uchar *) &opt_noversioncheck, (uchar *) &opt_noversioncheck, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"no-backup-locks", OPT_NO_BACKUP_LOCKS, - "This option controls if " - "backup locks should be used instead of FLUSH TABLES WITH READ LOCK " - "on the backup stage. The option has no effect when backup locks are " - "not supported by the server. This option is enabled by default, " - "disable with --no-backup-locks.", - (uchar *) &opt_no_backup_locks, (uchar *) &opt_no_backup_locks, 0, - GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"decompress", OPT_DECOMPRESS, "Decompresses all files with the .qp " - "extension in a backup previously made with the --compress option.", + "extension in a backup previously made with the --compress option. " + "This option was deprecated as it relies on the no longer " + "maintained QuickLZ library.", (uchar *) &opt_decompress, (uchar *) &opt_decompress, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -1474,11 +1696,10 @@ (uchar *) &opt_remove_original, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-query-type", OPT_LOCK_WAIT_QUERY_TYPE, - "This option specifies which types of queries are allowed to complete " - "before " XB_TOOL_NAME " will issue the global lock. Default is all.", - (uchar *) &opt_lock_wait_query_type, (uchar *) &opt_lock_wait_query_type, - &query_type_typelib, GET_ENUM, REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, - 0}, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, &query_type_typelib, GET_ENUM, + REQUIRED_ARG, QUERY_TYPE_ALL, 0, 0, 0, 0, 0}, {"kill-long-query-type", OPT_KILL_LONG_QUERY_TYPE, "This option specifies which types of queries should be killed to " @@ -1495,32 +1716,31 @@ NULL, NULL, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, {"kill-long-queries-timeout", OPT_KILL_LONG_QUERIES_TIMEOUT, - "This option specifies the number of seconds " XB_TOOL_NAME " waits " - "between starting FLUSH TABLES WITH READ LOCK and killing those " - "queries that block it. Default is 0 seconds, which means " - XB_TOOL_NAME " will not attempt to kill any queries.", - (uchar *) &opt_kill_long_queries_timeout, - (uchar *) &opt_kill_long_queries_timeout, 0, GET_UINT, REQUIRED_ARG, 0, 0, + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, - "This option specifies time in seconds that " XB_TOOL_NAME " should wait " - "for queries that would block FTWRL before running it. If there are " - "still such queries when the timeout expires, " XB_TOOL_NAME " terminates " - "with an error. Default is 0, in which case " XB_TOOL_NAME " does not " - "wait for queries to complete and starts FTWRL immediately.", - (uchar *) &opt_lock_wait_timeout, (uchar *) &opt_lock_wait_timeout, 0, - GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + "Alias for startup-wait-timeout", + (uchar*) &opt_lock_wait_timeout, (uchar*) &opt_lock_wait_timeout, + 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + + {"startup-wait-timeout", OPT_LOCK_WAIT_TIMEOUT, + "This option specifies time in seconds that mariadb-backup should wait for " + "BACKUP STAGE START to complete. BACKUP STAGE START has to wait until all " + "currently running queries using explicite LOCK TABLES has ended. " + "If there are still such queries when the timeout expires, mariadb-backup " + "terminates with an error. Default is 0, in which case mariadb-backup waits " + "indefinitely for BACKUP STAGE START to finish", + (uchar*) &opt_lock_wait_timeout, (uchar*) &opt_lock_wait_timeout, + 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ftwrl-wait-threshold", OPT_LOCK_WAIT_THRESHOLD, - "This option specifies the query run time threshold which is used by " - XB_TOOL_NAME " to detect long-running queries with a non-zero value " - "of --ftwrl-wait-timeout. FTWRL is not started until such " - "long-running queries exist. This option has no effect if " - "--ftwrl-wait-timeout is 0. Default value is 60 seconds.", - (uchar *) &opt_lock_wait_threshold, (uchar *) &opt_lock_wait_threshold, 0, - GET_UINT, REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, - + "Old disabled option which has no effect anymore (not needed " + "with BACKUP LOCKS)", + (uchar*) 0, (uchar*) 0, 0, GET_UINT, + REQUIRED_ARG, 60, 0, 0, 0, 0, 0}, {"safe-slave-backup-timeout", OPT_SAFE_SLAVE_BACKUP_TIMEOUT, "How many seconds --safe-slave-backup should wait for " @@ -1586,7 +1806,7 @@ {"parallel", OPT_XTRA_PARALLEL, "Number of threads to use for parallel datafiles transfer. " "The default value is 1.", - (G_PTR*) &xtrabackup_parallel, (G_PTR*) &xtrabackup_parallel, 0, GET_INT, + (G_PTR*) &xtrabackup_parallel, (G_PTR*) &xtrabackup_parallel, 0, GET_UINT, REQUIRED_ARG, 1, 1, INT_MAX, 0, 0, 0}, {"extended_validation", OPT_XTRA_EXTENDED_VALIDATION, @@ -1668,8 +1888,8 @@ {"innodb_log_buffer_size", OPT_INNODB_LOG_BUFFER_SIZE, "Redo log buffer size in bytes.", (G_PTR*) &log_sys.buf_size, (G_PTR*) &log_sys.buf_size, 0, - IF_WIN(GET_ULL,GET_ULONG), REQUIRED_ARG, 2U << 20, - 2U << 20, SIZE_T_MAX, 0, 4096, 0}, + GET_UINT, REQUIRED_ARG, 2U << 20, + 2U << 20, log_sys.buf_size_max, 0, 4096, 0}, #if defined __linux__ || defined _WIN32 {"innodb_log_file_buffering", OPT_INNODB_LOG_FILE_BUFFERING, "Whether the file system cache for ib_logfile0 is enabled during --backup", @@ -1685,9 +1905,16 @@ {"innodb_log_group_home_dir", OPT_INNODB_LOG_GROUP_HOME_DIR, "Path to InnoDB log files.", &srv_log_group_home_dir, &srv_log_group_home_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + {"innodb_log_write_ahead_size", OPT_INNODB_LOG_WRITE_AHEAD_SIZE, + "ib_logfile0 write size", + (G_PTR*) &log_sys.write_size, (G_PTR*) &srv_log_file_size, 0, + GET_UINT, REQUIRED_ARG, 512, 512, 4096, 0, 1, 0}, {"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT, - "Percentage of dirty pages allowed in bufferpool.", (G_PTR*) &srv_max_buf_pool_modified_pct, - (G_PTR*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0}, + "Percentage of dirty pages allowed in bufferpool.", + (G_PTR*) &srv_max_buf_pool_modified_pct, + (G_PTR*) &srv_max_buf_pool_modified_pct, 0, GET_DOUBLE, REQUIRED_ARG, + (longlong)getopt_double2ulonglong(90), (longlong)getopt_double2ulonglong(0), + getopt_double2ulonglong(100), 0, 0, 0}, {"innodb_use_native_aio", OPT_INNODB_USE_NATIVE_AIO, "Use native AIO if supported on this platform.", (G_PTR*) &srv_use_native_aio, @@ -1742,17 +1969,17 @@ 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"plugin-dir", OPT_PLUGIN_DIR, - "Server plugin directory. Used to load plugins during 'prepare' phase." - "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)", - &xb_plugin_dir, &xb_plugin_dir, - 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + "Server plugin directory. Used to load plugins during 'prepare' phase." + "Has no effect in the 'backup' phase (plugin directory during backup is the same as server's)", + &xb_plugin_dir, &xb_plugin_dir, + 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, {"aria_log_dir_path", OPT_ARIA_LOG_DIR_PATH, "Path to individual files and their sizes.", &aria_log_dir_path, &aria_log_dir_path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"open_files_limit", OPT_OPEN_FILES_LIMIT, "the maximum number of file " + {"open_files_limit", 0, "the maximum number of file " "descriptors to reserve with setrlimit().", (G_PTR*) &xb_open_files_limit, (G_PTR*) &xb_open_files_limit, 0, GET_ULONG, REQUIRED_ARG, 0, 0, UINT_MAX, 0, 1, 0}, @@ -1873,7 +2100,7 @@ IF_WIN("\"","") "\"%s\" --mysqld \"%s\"" " --defaults-extra-file=./backup-my.cnf --defaults-group-suffix=%s --datadir=." " --innodb --innodb-fast-shutdown=0 --loose-partition" - " --innodb-buffer-pool-size=%llu" + " --innodb_purge_rseg_truncate_frequency=1 --innodb-buffer-pool-size=%llu" " --console --skip-log-error --skip-log-bin --bootstrap %s< " BOOTSTRAP_FILENAME IF_WIN("\"",""), mariabackup_exe, @@ -1887,7 +2114,7 @@ IF_WIN("\"","") "\"%s\" --mysqld" " --defaults-file=./backup-my.cnf --defaults-group-suffix=%s --datadir=." " --innodb --innodb-fast-shutdown=0 --loose-partition" - " --innodb-buffer-pool-size=%llu" + " --innodb_purge_rseg_truncate_frequency=1 --innodb-buffer-pool-size=%llu" " --console --log-error= --skip-log-bin --bootstrap %s< " BOOTSTRAP_FILENAME IF_WIN("\"",""), mariabackup_exe, @@ -1936,7 +2163,8 @@ puts("Open source backup tool for InnoDB and XtraDB\n\ \n\ Copyright (C) 2009-2015 Percona LLC and/or its affiliates.\n\ -Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy. All Rights Reserved.\n\ +Portions Copyright (C) 2000, 2011, MySQL AB & Innobase Oy.\n\ +Portions Copyright (C) 2017-2023 MariaDB Corporation / MariaDB Plc.\n\ \n\ This program is free software; you can redistribute it and/or\n\ modify it under the terms of the GNU General Public License\n\ @@ -2009,6 +2237,9 @@ ADD_PRINT_PARAM_OPT(srv_log_group_home_dir); break; + case OPT_INNODB_LOG_FILE_SIZE: + break; + case OPT_INNODB_FLUSH_METHOD: #ifdef _WIN32 /* From: storage/innobase/handler/ha_innodb.cc:innodb_init_params */ @@ -2121,6 +2352,11 @@ } } break; + case OPT_RSYNC: + case OPT_NO_BACKUP_LOCKS: + if (my_handle_options_init_variables) + fprintf(stderr, "Obsolete option: %s. Ignored\n", opt->name); + break; #define MYSQL_CLIENT #include "sslopt-case.h" #undef MYSQL_CLIENT @@ -2141,6 +2377,11 @@ static bool innodb_init_param() { + if (!ut_is_2pow(log_sys.write_size)) { + msg("InnoDB: innodb_log_write_ahead_size=%u" + " is not a power of two", log_sys.write_size); + return true; + } srv_is_being_started = TRUE; /* === some variables from mysqld === */ memset((G_PTR) &mysql_tmpdir_list, 0, sizeof(mysql_tmpdir_list)); @@ -2179,7 +2420,7 @@ /* Check that values don't overflow on 32-bit systems. */ if (sizeof(ulint) == 4) { - if (xtrabackup_use_memory > UINT_MAX32) { + if (xtrabackup_use_memory > (longlong) UINT_MAX32) { msg("mariabackup: use-memory can't be over 4GB" " on 32-bit systems"); } @@ -2416,7 +2657,12 @@ os_file_delete_if_exists_func(ib_logfile0.c_str(), nullptr); os_file_t file= os_file_create_func(ib_logfile0.c_str(), OS_FILE_CREATE, OS_FILE_NORMAL, - OS_DATA_FILE_NO_O_DIRECT, false, &ret); +#if defined _WIN32 || defined O_DIRECT + OS_DATA_FILE_NO_O_DIRECT, +#else + OS_DATA_FILE, +#endif + false, &ret); if (!ret) { invalid_log: @@ -2458,6 +2704,7 @@ { FILE *fp; my_bool r = TRUE; + int t; fp = fopen(filename,"r"); if(!fp) { @@ -2488,6 +2735,9 @@ } /* Optional fields */ + if (fscanf(fp, "recover_binlog_info = %d\n", &t) == 1) { + recover_binlog_info = (t == 1); + } end: fclose(fp); @@ -2506,11 +2756,13 @@ "backup_type = %s\n" "from_lsn = " UINT64PF "\n" "to_lsn = " UINT64PF "\n" - "last_lsn = " UINT64PF "\n", + "last_lsn = " UINT64PF "\n" + "recover_binlog_info = %d\n", metadata_type, metadata_from_lsn, metadata_to_lsn, - metadata_last_lsn); + metadata_last_lsn, + MY_TEST(opt_binlog_info == BINLOG_INFO_LOCKLESS)); } /*********************************************************************** @@ -3008,12 +3260,7 @@ goto skip; } - if (!changed_page_bitmap) { - read_filter = &rf_pass_through; - } - else { - read_filter = &rf_bitmap; - } + read_filter = &rf_pass_through; res = xb_fil_cur_open(&cursor, read_filter, node, thread_n, ULLONG_MAX); if (res == XB_FIL_CUR_SKIP) { @@ -3131,7 +3378,7 @@ ut_a(dst_log_file); ut_ad(recv_sys.is_initialised()); const size_t sequence_offset{log_sys.is_encrypted() ? 8U + 5U : 5U}; - const size_t block_size_1{log_sys.get_block_size() - 1}; + const size_t block_size_1{log_sys.write_size - 1}; ut_ad(!log_sys.is_pmem()); @@ -3206,7 +3453,7 @@ if (r == recv_sys_t::GOT_EOF) break; - if (recv_sys.offset < log_sys.get_block_size()) + if (recv_sys.offset < log_sys.write_size) break; if (xtrabackup_throttle && io_ticket-- < 0) @@ -3337,50 +3584,22 @@ 3. start mariabackup with --dbug=+d,debug_mariabackup_events */ void dbug_mariabackup_event(const char *event, - const fil_space_t::name_type key) + const fil_space_t::name_type key, + bool need_lock) { + static std::mutex dbug_mariabackup_event_mutex; char *sql = dbug_mariabackup_get_val(event, key); if (sql && *sql) { msg("dbug_mariabackup_event : executing '%s'", sql); - xb_mysql_query(mysql_connection, sql, false, true); - } + if (need_lock) { + std::lock_guard lock(dbug_mariabackup_event_mutex); + xb_mysql_query(mysql_connection, sql, false, true); + } else + xb_mysql_query(mysql_connection, sql, false, true); + } } #endif // DBUG_OFF -/** Datafiles copying thread.*/ -static void data_copy_thread_func(data_thread_ctxt_t *ctxt) /* thread context */ -{ - uint num = ctxt->num; - fil_node_t* node; - ut_ad(ctxt->corrupted_pages); - - /* - Initialize mysys thread-specific memory so we can - use mysys functions in this thread. - */ - my_thread_init(); - - while ((node = datafiles_iter_next(ctxt->it)) != NULL) { - DBUG_MARIABACKUP_EVENT("before_copy", node->space->name()); - DBUG_EXECUTE_FOR_KEY("wait_innodb_redo_before_copy", - node->space->name(), - backup_wait_for_lsn(get_current_lsn(mysql_connection));); - /* copy the datafile */ - if (xtrabackup_copy_datafile(ctxt->datasinks->m_data, - ctxt->datasinks->m_meta, node, num, NULL, - xtrabackup_incremental ? wf_incremental : wf_write_through, - *ctxt->corrupted_pages)) - die("failed to copy datafile."); - - DBUG_MARIABACKUP_EVENT("after_copy", node->space->name()); - } - - pthread_mutex_lock(ctxt->count_mutex); - (*ctxt->count)--; - pthread_mutex_unlock(ctxt->count_mutex); - - my_thread_end(); -} /************************************************************************ Initialize the appropriate datasink(s). Both local backups and streaming in the @@ -3535,6 +3754,11 @@ } if (file->open_read_only(true) != DB_SUCCESS) { + // Ignore FTS tables, as they can be removed for intermediate tables, + // this code must be executed under stronger or equal to BLOCK_DDL lock, + // so there must not be errors for non-intermediate FTS tables. + if (check_if_fts_table(filname)) + return; die("Can't open datafile %s", name); } @@ -4540,7 +4764,6 @@ if (failed_ids.size() > 0) { return false; } - if (!xtrabackup_incremental) { safe_strcpy(metadata_type, sizeof(metadata_type), "full-backuped"); @@ -4579,16 +4802,441 @@ return true; } +class InnodbDataCopier { +public: + InnodbDataCopier(Backup_datasinks &backup_datasinks, + CorruptedPages &corrupted_pages, + ThreadPool &thread_pool) : + m_backup_datasinks(backup_datasinks), + m_corrupted_pages(corrupted_pages), + m_tasks(thread_pool) {} + + ~InnodbDataCopier() { + DBUG_ASSERT(m_tasks.is_finished()); + } + + bool start() { + DBUG_ASSERT(m_tasks.is_finished()); + m_tasks.push_task( + std::bind(&InnodbDataCopier::scan_job, this, std::placeholders::_1)); + return true; + } + + bool wait_for_finish() { + return m_tasks.wait_for_finish(); + } + +private: + void scan_job(unsigned thread_num) { + datafiles_iter_t it; + fil_node_t* node; + while ((node = datafiles_iter_next(&it)) != nullptr) { + m_tasks.push_task( + std::bind(&InnodbDataCopier::copy_job, this, node, + std::placeholders::_1)); + } + m_tasks.finish_task(1); + } + + void copy_job(fil_node_t *node, unsigned thread_num) { + DBUG_ASSERT(node); + // TODO: this came from the old code, where it was not thread-safe + // too, use separate mysql connection per thread here + DBUG_MARIABACKUP_EVENT("before_copy", node->space->name()); + DBUG_EXECUTE_FOR_KEY("wait_innodb_redo_before_copy", + node->space->name(), + backup_wait_for_lsn( + get_current_lsn(mysql_connection));); + /* copy the datafile */ + if(xtrabackup_copy_datafile(m_backup_datasinks.m_data, + m_backup_datasinks.m_meta, + node, thread_num, NULL, + xtrabackup_incremental + ? wf_incremental : wf_write_through, + m_corrupted_pages)) + die("mariabackup: Error: failed to copy datafile."); + // TODO: this came from the old code, where it was not thread-safe + // too, use separate mysql connection per thread here + DBUG_MARIABACKUP_EVENT("after_copy", node->space->name()); + m_tasks.finish_task(1); + } + + Backup_datasinks &m_backup_datasinks; + CorruptedPages &m_corrupted_pages; + TasksGroup m_tasks; +}; + + +class BackupStages { + + public: + + BackupStages(ds_ctxt_t *ds_data) : + m_bs_con(nullptr), + m_aria_backup(fil_path_to_mysql_datadir, + aria_log_dir_path, + ds_data, m_con_pool, m_thread_pool), + m_common_backup(fil_path_to_mysql_datadir, ds_data, m_con_pool, + m_thread_pool) {} + + ~BackupStages() { destroy(); } + + bool init() { + if ((m_bs_con = xb_mysql_connect()) == nullptr) + return false; + + while(m_con_pool.size() < xtrabackup_parallel) { + MYSQL *con = xb_mysql_connect(); + if (con == nullptr) + return false; + m_con_pool.push_back(con); + } + + if (!m_thread_pool.start(xtrabackup_parallel)) + return false; + if (!m_aria_backup.init()) + return false; + m_aria_backup.set_post_copy_table_hook( + std::bind(&BackupStages::store_table_version, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + m_common_backup.set_post_copy_table_hook( + std::bind(&BackupStages::store_table_version, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + return true; + } + + void destroy() { + m_thread_pool.stop(); + while (!m_con_pool.empty()) { + MYSQL *con = m_con_pool.back(); + m_con_pool.pop_back(); + mysql_close(con); + } + if (m_bs_con) + mysql_close(m_bs_con); + m_bs_con = nullptr; + } + + bool stage_start(Backup_datasinks &backup_datasinks, + CorruptedPages &corrupted_pages) { + msg("BACKUP STAGE START"); + if (!opt_no_lock) { + if (opt_safe_slave_backup) { + if (!wait_for_safe_slave(mysql_connection)) { + return(false); + } + } + + history_lock_time = time(NULL); + + if (!lock_for_backup_stage_start(m_bs_con)) { + msg("Error on BACKUP STAGE START query execution"); + return(false); + } + } + + InnodbDataCopier innodb_data_copier(backup_datasinks, + corrupted_pages, + m_thread_pool); + // Start InnoDB data files copy in background + if (!innodb_data_copier.start()) { + msg("Error on starting InnoDB data files backup"); + return false; + } + // Start online non-stats-log Aria tables copying in background + if (!m_aria_backup.start(opt_no_lock)) { + msg("Error on starting Aria data files backup"); + innodb_data_copier.wait_for_finish(); + return false; + } + + // Wait for all innodb data files copy finish + if(!innodb_data_copier.wait_for_finish()) { + msg("InnoDB data files backup process is finished with error"); + return false; + } + // Wait for online non-stats-log Aria tables copy finish + if (!m_aria_backup.wait_for_finish()) { + msg("Aria data files backup process is finished with error"); + return false; + } + + DBUG_MARIABACKUP_EVENT_LOCK("after_aria_background", {}); + + return true; + } + + bool stage_flush() { + msg("BACKUP STAGE FLUSH"); + if (!opt_no_lock && !lock_for_backup_stage_flush(m_bs_con)) { + msg("Error on BACKUP STAGE FLUSH query execution"); + return false; + } + auto tables_in_use = get_tables_in_use(mysql_connection); + // Copy non-stats-log non-in-use tables of non-InnoDB-Aria-RocksDB engines + // in background + if (!m_common_backup.scan(tables_in_use, + &m_copied_common_tables, opt_no_lock, true)) { + msg("Error on scan data directory for common engines"); + return false; + } + // Copy Aria offline non-stats-log non-in-use tables in background + if (!m_aria_backup.copy_offline_tables(&tables_in_use, opt_no_lock, + false)) { + msg("Error on start Aria tables backup"); + return false; + } + + if (!m_aria_backup.copy_log_tail()) { + msg("Error on Aria log tail copy"); + return false; + }; + + // Wait for Aria tables copy finish + if (!m_aria_backup.wait_for_finish()) { + msg("Aria data files backup process is finished with error"); + return false; + } + // Wait for non-InnoDB-Aria-RocksDB engines copy finish + if (!m_common_backup.wait_for_finish()) { + msg("Data files backup process is finished with error"); + return false; + } + + DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table", + dbug_emulate_ddl_on_intermediate_table_thread = + dbug_start_query_thread( + "SET debug_sync='copy_data_between_tables_after_set_backup_lock " + "SIGNAL copy_started';" + "SET debug_sync='copy_data_between_tables_before_reset_backup_lock " + "SIGNAL before_backup_lock_reset WAIT_FOR backup_lock_reset';" + "SET debug_sync='alter_table_after_temp_table_drop " + "SIGNAL temp_table_dropped';" + "SET SESSION lock_wait_timeout = 1;" + "ALTER TABLE test.t1 ADD COLUMN col1_copy INT, ALGORITHM = COPY;", + NULL, 0, 0); + xb_mysql_query(mysql_connection, + "SET debug_sync='now WAIT_FOR copy_started'", false, true); + ); + + return true; + } + + bool stage_block_ddl(Backup_datasinks &backup_datasinks, + CorruptedPages &corrupted_pages) { + if (!opt_no_lock) { + if (!lock_for_backup_stage_block_ddl(m_bs_con)) { + msg("BACKUP STAGE BLOCK_DDL"); + return false; + } + if (have_galera_enabled) + { + xb_mysql_query(mysql_connection, "SET SESSION wsrep_sync_wait=0", false); + } + } + + ulonglong server_lsn_after_lock = get_current_lsn(mysql_connection); + + // Copy the rest of non-stats-lognon-InnoDB-Aria-RocksDB tables + // Do not execute BACKUP LOCK under BLOCK_DDL stage + if (!m_common_backup.scan(m_copied_common_tables, &m_copied_common_tables, + true, false)) { + msg("Error on scan data directory for common engines"); + return false; + } + // Copy log tables tail + if (!m_common_backup.copy_log_tables(false)) { + msg("Error on copy system tables"); + return false; + } + + // Copy the rest of non-stats Aria tables in background + if (!m_aria_backup.copy_offline_tables(nullptr, true, false)) { + msg("Error on start Aria tables backup"); + return false; + } + + // Copy .frm, .trn and other files + if (!backup_files(backup_datasinks.m_data, + fil_path_to_mysql_datadir)) { + msg("Backup files error"); + return false; + } + + msg("Waiting for log copy thread to read lsn %llu", + server_lsn_after_lock); + backup_wait_for_lsn(server_lsn_after_lock); + corrupted_pages.backup_fix_ddl(backup_datasinks.m_data, + backup_datasinks.m_meta); + + if (!m_aria_backup.copy_log_tail()) { + msg("Error on Aria log tail copy"); + return false; + } + + // Wait for Aria tables copy finish + if (!m_aria_backup.wait_for_finish()) { + msg("Aria data files backup process is finished with error"); + return false; + } + // Wait for non-InnoDB-Aria-RocksDB engines copy finish + if (!m_common_backup.wait_for_finish()) { + msg("Data files backup process is finished with error"); + return false; + } + + ddl_log::backup(fil_path_to_mysql_datadir, + backup_datasinks.m_data, m_tables); + + DBUG_MARIABACKUP_EVENT_LOCK("after_stage_block_ddl", {}); + + return true; + } + + bool stage_block_commit(Backup_datasinks &backup_datasinks) { + msg("BACKUP STAGE BLOCK_COMMIT"); + if (!opt_no_lock && !lock_for_backup_stage_commit(m_bs_con)) { + msg("Error on BACKUP STAGE BLOCK_COMMIT query execution"); + return false; + } + + // Copy log tables tail + if (!m_common_backup.copy_log_tables(true)) { + msg("Error on copy log tables"); + return false; + } + + // Copy stats tables + if (!m_common_backup.copy_stats_tables()) { + msg("Error on copy stats tables"); + return false; + } + + // Copy system Aria files + if (!m_aria_backup.finalize()) { + msg("Error on finalize Aria tables backup"); + return false; + } + + if (!m_common_backup.wait_for_finish()) { + msg("Error on finish common engines backup"); + return false; + } + + if (!m_common_backup.close_log_tables()) { + msg("Error on close log tables"); + return false; + } + + if (!backup_files_from_datadir(backup_datasinks.m_data, + fil_path_to_mysql_datadir, + "aws-kms-key")) { + msg("Error on root data dir files backup"); + return false; + } + + if (has_rocksdb_plugin()) { + rocksdb_create_checkpoint(); + } + + // There is no need to stop slave thread before coping non-Innodb data when + // --no-lock option is used because --no-lock option requires that no DDL or + // DML to non-transaction tables can occur. + if (opt_no_lock) { + if (opt_safe_slave_backup) { + if (!wait_for_safe_slave(mysql_connection)) { + return(false); + } + } + } + + if (opt_slave_info) { + if (!write_slave_info(backup_datasinks.m_data, + mysql_connection)) { + return(false); + } + } + + /* The only reason why Galera/binlog info is written before + wait_for_ibbackup_log_copy_finish() is that after that call the xtrabackup + binary will start streamig a temporary copy of REDO log to stdout and + thus, any streaming from innobackupex would interfere. The only way to + avoid that is to have a single process, i.e. merge innobackupex and + xtrabackup. */ + if (opt_galera_info) { + if (!write_galera_info(backup_datasinks.m_data, + mysql_connection)) { + return(false); + } + } + + bool with_binlogs = opt_binlog_info == BINLOG_INFO_ON; + + if (with_binlogs || opt_galera_info) { + if (!write_binlog_info(backup_datasinks.m_data, + mysql_connection)) { + return(false); + } + } + + if (!opt_no_lock) { + msg("Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS..."); + xb_mysql_query(mysql_connection, + "FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS", false); + } + + return backup_datasinks.backup_low(); + } + + bool stage_end(Backup_datasinks &backup_datasinks) { + msg("BACKUP STAGE END"); + /* release all locks */ + if (!opt_no_lock) { + unlock_all(m_bs_con); + history_lock_time = 0; + } else { + history_lock_time = time(NULL) - history_lock_time; + } + backup_release(); + DBUG_EXECUTE_IF("check_mdl_lock_works", + pthread_join(dbug_alter_thread, nullptr); + ); + + DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table", + pthread_join( + dbug_emulate_ddl_on_intermediate_table_thread, + nullptr); + ); + + backup_finish(backup_datasinks.m_data); + return true; + } + + void store_table_version( + std::string db, std::string table, std::string table_version) { + auto tk = table_key(db, table); + std::lock_guard lock(m_tables_mutex); + m_tables[std::move(tk)] = std::move(table_version); + } + + private: + Backup_datasinks *backup_datasinks; + MYSQL *m_bs_con; + ThreadPool m_thread_pool; + std::vector m_con_pool; + std::mutex m_tables_mutex; + ddl_log::tables_t m_tables; + aria::Backup m_aria_backup; + common_engine::Backup m_common_backup; + std::unordered_set m_copied_common_tables; +}; + /** Implement --backup @return whether the operation succeeded */ static bool xtrabackup_backup_func() { MY_STAT stat_info; - uint i; - uint count; - pthread_mutex_t count_mutex; CorruptedPages corrupted_pages; - data_thread_ctxt_t *data_threads; Backup_datasinks backup_datasinks; pthread_cond_init(&scanned_lsn_cond, NULL); @@ -4604,7 +5252,7 @@ return(false); } msg("cd to %s", mysql_real_data_home); - xb_plugin_backup_init(mysql_connection); + encryption_plugin_backup_init(mysql_connection); msg("open files limit requested %lu, set to %lu", xb_open_files_limit, xb_set_max_open_files(xb_open_files_limit)); @@ -4645,22 +5293,6 @@ return(false); } - if (srv_buf_pool_size >= 1000 * 1024 * 1024) { - /* Here we still have srv_pool_size counted - in kilobytes (in 4.0 this was in bytes) - srv_boot() converts the value to - pages; if buffer pool is less than 1000 MB, - assume fewer threads. */ - srv_max_n_threads = 50000; - - } else if (srv_buf_pool_size >= 8 * 1024 * 1024) { - - srv_max_n_threads = 10000; - } else { - srv_max_n_threads = 1000; /* saves several MB of memory, - especially in 64-bit - computers */ - } srv_thread_pool_init(); /* Reset the system variables in the recovery module. */ trx_pool_init(); @@ -4680,9 +5312,10 @@ } /* get current checkpoint_lsn */ { + log_sys.latch.wr_lock(SRW_LOCK_CALL); mysql_mutex_lock(&recv_sys.mutex); - dberr_t err = recv_sys.find_checkpoint(); + log_sys.latch.wr_unlock(); if (err != DB_SUCCESS) { msg("Error: cannot read redo log header"); @@ -4778,11 +5411,6 @@ std::thread(log_copying_thread).detach(); - /* FLUSH CHANGED_PAGE_BITMAPS call */ - if (!flush_changed_page_bitmaps()) { - goto fail; - } - ut_a(xtrabackup_parallel > 0); if (xtrabackup_parallel > 1) { @@ -4794,71 +5422,36 @@ mdl_lock_all(); DBUG_EXECUTE_IF("check_mdl_lock_works", - dbug_start_query_thread("ALTER TABLE test.t ADD COLUMN mdl_lock_column int", + dbug_alter_thread = + dbug_start_query_thread("ALTER TABLE test.t ADD COLUMN mdl_lock_column int", "Waiting for table metadata lock", 0, 0);); } - datafiles_iter_t it; - - /* Create data copying threads */ - data_threads = (data_thread_ctxt_t *) - malloc(sizeof(data_thread_ctxt_t) * xtrabackup_parallel); - count = xtrabackup_parallel; - pthread_mutex_init(&count_mutex, NULL); - - for (i = 0; i < (uint) xtrabackup_parallel; i++) { - data_threads[i].it = ⁢ - data_threads[i].num = i+1; - data_threads[i].count = &count; - data_threads[i].count_mutex = &count_mutex; - data_threads[i].corrupted_pages = &corrupted_pages; - data_threads[i].datasinks= &backup_datasinks; - std::thread(data_copy_thread_func, data_threads + i).detach(); - } - - /* Wait for threads to exit */ - while (1) { - std::this_thread::sleep_for(std::chrono::seconds(1)); - pthread_mutex_lock(&count_mutex); - bool stop = count == 0; - pthread_mutex_unlock(&count_mutex); - if (stop) { - break; - } - } - - pthread_mutex_destroy(&count_mutex); - free(data_threads); + BackupStages stages(backup_datasinks.m_data); - DBUG_ASSERT(backup_datasinks.m_data); - DBUG_ASSERT(backup_datasinks.m_meta); - bool ok = backup_start(backup_datasinks.m_data, - backup_datasinks.m_meta, corrupted_pages); + if (!stages.init()) + goto fail; - if (ok) { - ok = backup_datasinks.backup_low(); + if (!stages.stage_start(backup_datasinks, corrupted_pages)) + goto fail; - backup_release(); + if (!stages.stage_flush()) + goto fail; - DBUG_EXECUTE_IF("check_mdl_lock_works", - pthread_join(dbug_alter_thread, nullptr);); + if (!stages.stage_block_ddl(backup_datasinks, corrupted_pages)) + goto fail; - if (ok) { - backup_finish(backup_datasinks.m_data); - } - } + if (!stages.stage_block_commit(backup_datasinks)) + goto fail; - if (opt_log_innodb_page_corruption) - ok = corrupted_pages.print_to_file(backup_datasinks.m_data, - MB_CORRUPTED_PAGES_FILE); + if (!stages.stage_end(backup_datasinks)) + goto fail; - if (!ok) { + if (opt_log_innodb_page_corruption + && !corrupted_pages.print_to_file(backup_datasinks.m_data, + MB_CORRUPTED_PAGES_FILE)) goto fail; - } - if (changed_page_bitmap) { - xb_page_bitmap_deinit(changed_page_bitmap); - } backup_datasinks.destroy(); msg("Redo log (from LSN " LSN_PF " to " LSN_PF ") was copied.", @@ -4920,6 +5513,12 @@ DBUG_MARIABACKUP_EVENT("backup_fix_ddl", {}); + DBUG_EXECUTE_IF("emulate_ddl_on_intermediate_table", + xb_mysql_query(mysql_connection, + "SET debug_sync='now SIGNAL backup_lock_reset " + "WAIT_FOR temp_table_dropped'", false, true); + ); + for (space_id_to_name_t::iterator iter = ddl_tracker.tables_in_backup.begin(); iter != ddl_tracker.tables_in_backup.end(); iter++) { @@ -5064,6 +5663,7 @@ } } + /* ================= prepare ================= */ /*********************************************************************** @@ -5550,7 +6150,7 @@ } -static void rename_file(const char *from,const char *to) { +void rename_file(const char *from,const char *to) { msg("Renaming %s to %s\n", from, to); if (my_rename(from, to, MY_WME)) { die("Can't rename %s to %s errno %d", from, to, errno); @@ -5572,7 +6172,7 @@ void* arg); /*! /dev/null 2>&1") == 0)); - if (!have_rsync) - { - msg("Error: rsync executable not found, cannot run backup with --rsync\n"); - return false; - } - } - n_mixed_options = 0; if (opt_decompress) { @@ -6441,6 +7061,7 @@ if (opt_check_privileges && !check_all_privileges()) { return(false); } + history_start_time = time(NULL); } @@ -6568,9 +7189,10 @@ server_default_groups.push_back(NULL); snprintf(conf_file, sizeof(conf_file), "my"); - if (prepare && target_dir) { + if (prepare) { snprintf(conf_file, sizeof(conf_file), - "%s/backup-my.cnf", target_dir); + "%s/backup-my.cnf", target_dir ? target_dir: + DEFAULT_TARGET_DIR); if (!strncmp(argv[1], "--defaults-file=", 16)) { /* Remove defaults-file*/ for (int i = 2; ; i++) { diff -Nru mariadb-10.11.6/extra/mariabackup/xtrabackup.h mariadb-10.11.9/extra/mariabackup/xtrabackup.h --- mariadb-10.11.6/extra/mariabackup/xtrabackup.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/mariabackup/xtrabackup.h 2024-08-03 07:29:56.000000000 +0000 @@ -24,8 +24,15 @@ #include #include "datasink.h" #include "xbstream.h" -#include "changed_page_bitmap.h" +#include "fil0fil.h" #include +#include "handler.h" + +#include +#include +#include +#include + #define XB_TOOL_NAME "mariadb-backup" #define XB_HISTORY_TABLE "mysql.mariadb_backup_history" @@ -84,8 +91,6 @@ extern uint opt_protocol; -extern xb_page_bitmap *changed_page_bitmap; - extern char *xtrabackup_incremental; extern my_bool xtrabackup_incremental_force_scan; @@ -112,7 +117,7 @@ extern char *innobase_data_file_path; extern longlong innobase_page_size; -extern int xtrabackup_parallel; +extern uint xtrabackup_parallel; extern my_bool xb_close_files; extern const char *xtrabackup_compress_alg; @@ -131,7 +136,6 @@ extern my_bool opt_slave_info; extern my_bool opt_no_lock; extern my_bool opt_safe_slave_backup; -extern my_bool opt_rsync; extern my_bool opt_force_non_empty_dirs; extern my_bool opt_noversioncheck; extern my_bool opt_no_backup_locks; @@ -171,7 +175,7 @@ extern const char *opt_history; -enum binlog_info_enum { BINLOG_INFO_OFF, BINLOG_INFO_ON, +enum binlog_info_enum { BINLOG_INFO_OFF, BINLOG_INFO_LOCKLESS, BINLOG_INFO_ON, BINLOG_INFO_AUTO}; extern ulong opt_binlog_info; @@ -288,15 +292,40 @@ os_file_stat_t* info); /*!< in/out: buffer where the info is returned */ -#ifndef DBUG_OFF -#include -extern void dbug_mariabackup_event(const char *event, - const fil_space_t::name_type key); +const char *convert_dst(const char *dst); -#define DBUG_MARIABACKUP_EVENT(A, B) \ - DBUG_EXECUTE_IF("mariabackup_events", dbug_mariabackup_event(A, B);) -#else -#define DBUG_MARIABACKUP_EVENT(A, B) /* empty */ -#endif // DBUG_OFF +std::string get_table_version_from_image(const std::vector &frm_image); +std::pair + get_table_engine_from_image(const std::vector &frm_image); +std::string read_table_version_id(File file); + +std::string convert_tablename_to_filepath( + const char *data_dir_path, const std::string &db, const std::string &table); + +std::tuple +convert_filepath_to_tablename(const char *filepath); + +typedef std::string table_key_t; + +inline table_key_t table_key(const std::string &db, const std::string &table) { + return std::string(db).append(".").append(table); +}; + +inline table_key_t table_key(const char *db, const char *table) { + return std::string(db).append(".").append(table); +}; + +typedef std::function + post_copy_table_hook_t; + +my_bool +check_if_skip_table( +/******************/ + const char* name); /*!< in: path to the table */ + +bool is_log_table(const char *dbname, const char *tablename); +bool is_stats_table(const char *dbname, const char *tablename); +extern my_bool xtrabackup_copy_back; +extern my_bool xtrabackup_move_back; #endif /* XB_XTRABACKUP_H */ diff -Nru mariadb-10.11.6/extra/my_print_defaults.c mariadb-10.11.9/extra/my_print_defaults.c --- mariadb-10.11.6/extra/my_print_defaults.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/my_print_defaults.c 2024-08-03 07:29:56.000000000 +0000 @@ -175,6 +175,7 @@ if ((error= load_defaults(config_file, (const char **) load_default_groups, &count, &arguments))) { + my_free(load_default_groups); my_end(0); if (error == 4) return 0; diff -Nru mariadb-10.11.6/extra/perror.c mariadb-10.11.9/extra/perror.c --- mariadb-10.11.6/extra/perror.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/perror.c 2024-08-03 07:29:56.000000000 +0000 @@ -359,7 +359,8 @@ { found= 1; if (verbose) - printf("MariaDB error code %3d (%s): %s\n", code, name, msg); + printf("MariaDB error code %3d (%s): %s\n" + "Learn more: https://mariadb.com/kb/en/e%3d/\n", code, name, msg, code); else puts(msg); } diff -Nru mariadb-10.11.6/extra/wolfssl/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -1,86 +1,57 @@ IF(MSVC_INTEL) PROJECT(wolfssl C ASM_MASM) ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64") - PROJECT(wolfssl C ASM) + PROJECT(wolfssl C ASM) ELSE() PROJECT(wolfssl C) ENDIF() IF(CMAKE_SIZEOF_VOID_P MATCHES 8) -IF(MSVC_INTEL) +IF(MSVC_INTEL AND NOT (CMAKE_C_COMPILER_ID MATCHES Clang)) SET(WOLFSSL_INTELASM ON) - SET(WOLFSSL_X86_64_BUILD 1) SET(HAVE_INTEL_RDSEED 1) SET(HAVE_INTEL_RDRAND 1) -ELSEIF(CMAKE_ASM_COMPILER_ID MATCHES "Clang" AND CMAKE_VERSION VERSION_LESS 3.16) - - # WolfSSL 5.5.4 bug workaround below does not work, due to some CMake bug ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64") - SET(WOLFSSL_X86_64_BUILD 1) IF(CMAKE_C_COMPILER_ID MATCHES GNU AND CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9) MESSAGE_ONCE(NO_INTEL_ASSEMBLY "Disable Intel assembly for WolfSSL - compiler is too old") + ELSEIF(WITH_MSAN) + MESSAGE_ONCE(MSAN_CANT_HANDLE_IT "Disable Intel assembly for WolfSSL - MSAN can't handle it") ELSE() - IF(WITH_MSAN) - MESSAGE_ONCE(MSAN_CANT_HANDLE_IT - "Disable Intel assembly for WolfSSL - MSAN can't handle it") - ELSE() - MY_CHECK_C_COMPILER_FLAG(-maes) - MY_CHECK_C_COMPILER_FLAG(-msse4) - MY_CHECK_C_COMPILER_FLAG(-mpclmul) - IF(have_C__maes AND have_C__msse4 AND have_C__mpclmul) - SET(WOLFSSL_INTELASM ON) + MY_CHECK_C_COMPILER_FLAG(-maes) + MY_CHECK_C_COMPILER_FLAG(-msse4) + MY_CHECK_C_COMPILER_FLAG(-mpclmul) + IF(have_C__maes AND have_C__msse4 AND have_C__mpclmul) + SET(WOLFSSL_INTELASM ON) + MY_CHECK_C_COMPILER_FLAG(-mrdrnd) + MY_CHECK_C_COMPILER_FLAG(-mrdseed) + IF(have_C__mrdrnd) + SET(HAVE_INTEL_RDRAND ON) + ENDIF() + IF(have_C__mrdseed) + SET(HAVE_INTEL_RDSEED ON) ENDIF() - ENDIF() - MY_CHECK_C_COMPILER_FLAG(-mrdrnd) - MY_CHECK_C_COMPILER_FLAG(-mrdseed) - IF(have_C__mrdrnd) - SET(HAVE_INTEL_RDRAND ON) - ENDIF() - IF(have_C__mrdseed) - SET(HAVE_INTEL_RDSEED ON) ENDIF() ENDIF() ENDIF() ENDIF() SET(WOLFSSL_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/src) +SET(WOLFCRYPT_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/wolfcrypt/src) ADD_DEFINITIONS(${SSL_DEFINES}) - -SET(WOLFSSL_SOURCES - ${WOLFSSL_SRCDIR}/crl.c - ${WOLFSSL_SRCDIR}/internal.c - ${WOLFSSL_SRCDIR}/keys.c - ${WOLFSSL_SRCDIR}/tls.c - ${WOLFSSL_SRCDIR}/wolfio.c - ${WOLFSSL_SRCDIR}/ocsp.c - ${WOLFSSL_SRCDIR}/ssl.c - ${WOLFSSL_SRCDIR}/tls13.c) - ADD_DEFINITIONS(-DWOLFSSL_LIB -DBUILDING_WOLFSSL) - +ADD_DEFINITIONS(-DWOLFSSL_SP_4096) INCLUDE_DIRECTORIES(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl) -IF(MSVC) - # size_t to long truncation warning - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -wd4267 -wd4334 -wd4028 -wd4244") -ENDIF() - -ADD_CONVENIENCE_LIBRARY(wolfssl ${WOLFSSL_SOURCES}) - -# Workaround linker crash with older Ubuntu binutils -# e.g aborting at ../../bfd/merge.c line 873 in _bfd_merged_section_offset -IF(CMAKE_SYSTEM_NAME MATCHES "Linux") - STRING(REPLACE "-g " "-g1 " CMAKE_C_FLAGS_RELWITHDEBINFO - ${CMAKE_C_FLAGS_RELWITHDEBINFO}) - STRING(REPLACE "-g " "-g1 " CMAKE_C_FLAGS_DEBUG - ${CMAKE_C_FLAGS_DEBUG}) - STRING(REPLACE "-ggdb3 " " " CMAKE_C_FLAGS_RELWITHDEBINFO - ${CMAKE_C_FLAGS_RELWITHDEBINFO}) - STRING(REPLACE "-ggdb3 " " " CMAKE_C_FLAGS_DEBUG - ${CMAKE_C_FLAGS_DEBUG}) -ENDIF() +INCLUDE_DIRECTORIES(${SSL_INCLUDE_DIRS}) -SET(WOLFCRYPT_SRCDIR ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/wolfcrypt/src) -SET(WOLFCRYPT_SOURCES +add_library(wolfssl STATIC +${WOLFSSL_SRCDIR}/crl.c +${WOLFSSL_SRCDIR}/internal.c +${WOLFSSL_SRCDIR}/keys.c +${WOLFSSL_SRCDIR}/tls.c +${WOLFSSL_SRCDIR}/wolfio.c +${WOLFSSL_SRCDIR}/ocsp.c +${WOLFSSL_SRCDIR}/ssl.c +${WOLFSSL_SRCDIR}/tls13.c ${WOLFCRYPT_SRCDIR}/aes.c ${WOLFCRYPT_SRCDIR}/arc4.c ${WOLFCRYPT_SRCDIR}/asn.c @@ -110,69 +81,56 @@ ${WOLFCRYPT_SRCDIR}/hash.c ${WOLFCRYPT_SRCDIR}/wolfmath.c ${WOLFCRYPT_SRCDIR}/kdf.c +${WOLFCRYPT_SRCDIR}/sp_int.c +${WOLFCRYPT_SRCDIR}/sp_c32.c +${WOLFCRYPT_SRCDIR}/sp_c64.c ) -# Use fastmath large number math library. -IF(NOT (MSVC AND CMAKE_C_COMPILER_ID MATCHES Clang)) - # Can't use clang-cl with WOLFSSL_FASTMATH - # due to https://bugs.llvm.org/show_bug.cgi?id=25305 - SET(WOLFSSL_FASTMATH 1) -ENDIF() - -IF(WOLFSSL_FASTMATH) - SET(USE_FAST_MATH 1) - SET(TFM_TIMING_RESISTANT 1) - # FP_MAX_BITS is set high solely to satisfy ssl_8k_key.test - # WolfSSL will use more stack space with it - SET(FP_MAX_BITS 16384) - SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/tfm.c) - IF((CMAKE_SIZEOF_VOID_P MATCHES 4) AND (CMAKE_SYSTEM_PROCESSOR MATCHES "86") - AND (NOT MSVC)) - # Workaround https://github.com/wolfSSL/wolfssl/issues/4245 - # On 32bit Intel, to satisfy inline assembly's wish for free registers - # 1. use -fomit-frame-pointer - # 2. With GCC 4, additionally use -fno-PIC, which works on x86 - # (modern GCC has PIC optimizations, that make it unnecessary) - # The following assumes GCC or Clang - SET(TFM_COMPILE_FLAGS "-fomit-frame-pointer") - IF(CMAKE_C_COMPILER_VERSION VERSION_LESS "5") - SET(TFM_COMPILE_FLAGS "${TFM_COMPILE_FLAGS} -fno-PIC") - ENDIF() - SET_SOURCE_FILES_PROPERTIES(${WOLFCRYPT_SRCDIR}/tfm.c - PROPERTIES COMPILE_FLAGS ${TFM_COMPILE_FLAGS}) - ENDIF() -ELSE() - SET(WOLFSSL_SP_MATH_ALL 1) - SET(WOLFCRYPT_SOURCES ${WOLFCRYPT_SOURCES} ${WOLFCRYPT_SRCDIR}/sp_int.c) -ENDIF() - -IF(WOLFSSL_X86_64_BUILD) - LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/cpuid.c) - IF(MSVC) - SET(WOLFSSL_AESNI 1) - LIST(APPEND WOLFCRYPT_SOURCES - ${WOLFCRYPT_SRCDIR}/aes_asm.asm - ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.asm) - IF(CMAKE_C_COMPILER_ID MATCHES Clang) - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -msse4.2 -mpclmul -mrdrnd -mrdseed") - ENDIF() - ELSEIF(WOLFSSL_INTELASM) - SET(WOLFSSL_AESNI 1) - SET(USE_INTEL_SPEEDUP 1) - LIST(APPEND WOLFCRYPT_SOURCES +# Optimizations, assembly +if(WOLFSSL_INTELASM) + set(WOLFSSL_X86_64_BUILD 1) + set(WOLFSSL_SP_X86_64 1) + set(WOLFSSL_SP_X86_64_ASM 1) + set(WOLFSSL_AESNI 1) + target_sources(wolfssl PRIVATE + ${WOLFCRYPT_SRCDIR}/cpuid.c + ${WOLFCRYPT_SRCDIR}/sp_x86_64.c + ) + if(MSVC_INTEL) + target_sources(wolfssl PRIVATE + ${WOLFCRYPT_SRCDIR}/aes_asm.asm + ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.asm + ${WOLFCRYPT_SRCDIR}/sp_x86_64_asm.asm + ) + target_compile_options(wolfssl PRIVATE + $<$:-maes -msse4.2 -mpclmul -mrdrnd -mrdseed> + $<$:/Zi> + ) + else() + set(USE_INTEL_SPEEDUP 1) + target_sources(wolfssl PRIVATE ${WOLFCRYPT_SRCDIR}/aes_asm.S ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.S ${WOLFCRYPT_SRCDIR}/chacha_asm.S ${WOLFCRYPT_SRCDIR}/poly1305_asm.S ${WOLFCRYPT_SRCDIR}/sha512_asm.S - ${WOLFCRYPT_SRCDIR}/sha256_asm.S) - ADD_DEFINITIONS(-maes -msse4.2 -mpclmul) - # WolfSSL 5.5.4 bug - user_settings.h not included into aes_asm.S - SET_PROPERTY(SOURCE ${WOLFCRYPT_SRCDIR}/aes_asm.S APPEND PROPERTY COMPILE_OPTIONS "-DWOLFSSL_X86_64_BUILD") - ENDIF() -ENDIF() + ${WOLFCRYPT_SRCDIR}/sha256_asm.S + ${WOLFCRYPT_SRCDIR}/sp_x86_64_asm.S + ) + target_compile_options(wolfssl PRIVATE -maes -msse4.2 -mpclmul) + # Workaround 5.5.4 bug (user_settings.h not included into aes_asm.S) + set_property(SOURCE ${WOLFCRYPT_SRCDIR}/aes_asm.S APPEND PROPERTY COMPILE_OPTIONS "-DWOLFSSL_X86_64_BUILD") + endif() +endif() + +# Silence some warnings +if(MSVC) + # truncation warnings + target_compile_options(wolfssl PRIVATE $<$:/wd4244>) + if(CMAKE_C_COMPILER_ID MATCHES Clang) + target_compile_options(wolfssl PRIVATE $<$:-Wno-incompatible-function-pointer-types>) + endif() +endif() CONFIGURE_FILE(user_settings.h.in user_settings.h) -INCLUDE_DIRECTORIES(${SSL_INCLUDE_DIRS}) -ADD_CONVENIENCE_LIBRARY(wolfcrypt ${WOLFCRYPT_SOURCES}) diff -Nru mariadb-10.11.6/extra/wolfssl/user_settings.h.in mariadb-10.11.9/extra/wolfssl/user_settings.h.in --- mariadb-10.11.6/extra/wolfssl/user_settings.h.in 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/user_settings.h.in 2024-08-03 07:29:56.000000000 +0000 @@ -21,6 +21,7 @@ #define HAVE_AESGCM #define HAVE_CHACHA #define HAVE_POLY1305 +#define HAVE_THREAD_LS #define WOLFSSL_AES_COUNTER #define NO_WOLFSSL_STUB #define OPENSSL_ALL @@ -28,6 +29,11 @@ #define NO_OLD_TIMEVAL_NAME #define HAVE_SECURE_RENEGOTIATION #define HAVE_EXTENDED_MASTER +/* + Following is workaround about a WolfSSL 5.6.6 bug. + The bug is about undefined sessionCtxSz during compilation. +*/ +#define WOLFSSL_SESSION_ID_CTX /* TLSv1.3 definitions (all needed to build) */ #define WOLFSSL_TLS13 @@ -46,20 +52,19 @@ #define NO_RABBIT #define NO_RC4 -/* - FP_MAX_BITS is set high solely to satisfy ssl_8k_key.test - WolfSSL will use more stack space with it, with fastmath -*/ -#cmakedefine FP_MAX_BITS 16384 #define RSA_MAX_SIZE 8192 +#define WOLFSSL_SP_MATH_ALL +#define WOLFSSL_HAVE_SP_RSA +#ifndef WOLFSSL_SP_4096 +#define WOLFSSL_SP_4096 +#endif + #cmakedefine WOLFSSL_AESNI -#cmakedefine USE_FAST_MATH -#cmakedefine TFM_TIMING_RESISTANT #cmakedefine HAVE_INTEL_RDSEED #cmakedefine HAVE_INTEL_RDRAND #cmakedefine USE_INTEL_SPEEDUP -#cmakedefine USE_FAST_MATH #cmakedefine WOLFSSL_X86_64_BUILD -#cmakedefine WOLFSSL_SP_MATH_ALL +#cmakedefine WOLFSSL_SP_X86_64 +#cmakedefine WOLFSSL_SP_X86_64_ASM #endif /* WOLFSSL_USER_SETTINGS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.cyignore mariadb-10.11.9/extra/wolfssl/wolfssl/.cyignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/.cyignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.cyignore 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,40 @@ +# wolfSSL folders +$(SEARCH_wolfssl)/IDE +$(SEARCH_wolfssl)/examples +$(SEARCH_wolfssl)/linuxkm +$(SEARCH_wolfssl)/mcapi +$(SEARCH_wolfssl)/mplabx +$(SEARCH_wolfssl)/mqx +$(SEARCH_wolfssl)/tirtos +$(SEARCH_wolfssl)/tests +$(SEARCH_wolfssl)/testsuite +$(SEARCH_wolfssl)/wolfcrypt/src/port/autosar +$(SEARCH_wolfssl)/zephyr + +# wolfSSL files +$(SEARCH_wolfssl)/wolfcrypt/src/aes_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/aes_xts_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/aes_gcm_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/aes_gcm_x86_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/chacha_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/fe_x25519_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/poly1305_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/sha256_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/sha512_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/sha3_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/sm3_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/sp_x86_64_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/sp_sm2_x86_64_asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/wc_kyber_asm.S + +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/armv8-32-aes-asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/armv8-32-curve25519.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/armv8-curve25519.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/armv8-sha3-asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/armv8-sha512-asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/thumb2-aes-asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/thumb2-curve25519.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/thumb2-sha256-asm.S +$(SEARCH_wolfssl)/wolfcrypt/src/port/arm/thumb2-sha512-asm.S diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.editorconfig mariadb-10.11.9/extra/wolfssl/wolfssl/.editorconfig --- mariadb-10.11.6/extra/wolfssl/wolfssl/.editorconfig 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.editorconfig 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,10 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/async.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/async.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/async.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/async.yml 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,16 @@ name: Async Tests +# START OF COMMON SECTION on: - workflow_call: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION jobs: make_check: @@ -10,17 +19,20 @@ config: [ # Add new configs here '--enable-asynccrypt --enable-all --enable-dtls13', - '--enable-asynccrypt-sw', + '--enable-asynccrypt-sw --enable-ocspstapling --enable-ocspstapling2', + '--enable-ocsp CFLAGS="-DTEST_NONBLOCK_CERTS"', ] name: make check runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 6 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 name: Checkout wolfSSL - name: Test wolfSSL async run: | - ./async-check.sh setup + ./async-check.sh install ./configure ${{ matrix.config }} make check diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/curl.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/curl.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/curl.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/curl.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,70 @@ +name: curl Test + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-curl + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-curl + path: build-dir + retention-days: 5 + + test_curl: + name: ${{ matrix.curl_ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 15 + needs: build_wolfssl + strategy: + fail-fast: false + matrix: + curl_ref: [ 'master', 'curl-8_4_0' ] + steps: + - name: Install test dependencies + run: | + sudo apt-get update + sudo apt-get install nghttp2 libpsl5 libpsl-dev + sudo pip install impacket + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-curl + path: build-dir + + - name: Build curl + uses: wolfSSL/actions-build-autotools-project@v1 + with: + repository: curl/curl + path: curl + ref: ${{ matrix.curl_ref }} + configure: --with-wolfssl=$GITHUB_WORKSPACE/build-dir + check: false + + - name: Test curl + working-directory: curl + run: make -j test-ci diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/cyrus-sasl.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/cyrus-sasl.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/cyrus-sasl.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/cyrus-sasl.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,91 @@ +name: cyrus-sasl Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all + install: true + # Don't run tests as this config is tested in many other places + check: false + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-sasl + path: build-dir + retention-days: 5 + + sasl_check: + strategy: + fail-fast: false + matrix: + # List of releases to test + ref: [ 2.1.28 ] + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + needs: build_wolfssl + steps: + - name: Install dependencies + run: | + # Don't prompt for anything + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + sudo apt-get install krb5-kdc krb5-otp libkrb5-dev \ + libsocket-wrapper libnss-wrapper krb5-admin-server libdb5.3-dev + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-sasl + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Checkout sasl + uses: actions/checkout@v4 + with: + repository: cyrusimap/cyrus-sasl + ref: cyrus-sasl-${{ matrix.ref }} + path: sasl + + - name: Build cyrus-sasl + working-directory: sasl + run: | + patch -p1 < $GITHUB_WORKSPACE/osp/cyrus-sasl/${{ matrix.ref }}/${{ matrix.ref }}.patch + autoreconf -ivf + ./configure --with-openssl=no --with-wolfssl=$GITHUB_WORKSPACE/build-dir --with-dblib=berkeley --disable-shared + # Need to run 'make' twice with '--disable-shared' for some reason + make -j || make -j + + - name: Run testsuite + working-directory: sasl + run: | + make -j -C utils testsuite saslpasswd2 + $GITHUB_WORKSPACE/osp/cyrus-sasl/${{ matrix.ref }}/run-tests.sh diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/disabled/haproxy.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/disabled/haproxy.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/disabled/haproxy.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/disabled/haproxy.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,60 @@ +name: HaProxy Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + haproxy_check: + strategy: + fail-fast: false + matrix: + # List of refs to test + ref: [ master ] + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-quic --enable-haproxy + install: true + + - name: Checkout VTest + uses: actions/checkout@v4 + with: + repository: vtest/VTest + path: VTest + + - name: Build VTest + working-directory: VTest + # Special flags due to: https://github.com/vtest/VTest/issues/12 + run: make FLAGS='-O2 -s -Wall' + + - name: Checkout HaProxy + uses: actions/checkout@v4 + with: + repository: haproxy/haproxy + path: haproxy + ref: ${{ matrix.ref }} + + - name: Build HaProxy + working-directory: haproxy + run: >- + make -j TARGET=linux-glibc DEBUG='-DDEBUG_MEMORY_POOLS -DDEBUG_STRICT' + USE_OPENSSL_WOLFSSL=1 USE_QUIC=1 SSL_INC=$GITHUB_WORKSPACE/build-dir/include/ + SSL_LIB=$GITHUB_WORKSPACE/build-dir/lib/ ADDLIB=-Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + + - name: Test HaProxy + working-directory: haproxy + run: make reg-tests reg-tests/ssl VTEST_PROGRAM=$GITHUB_WORKSPACE/VTest/vtest + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/disabled/hostap.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/disabled/hostap.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/disabled/hostap.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/disabled/hostap.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,292 @@ +name: hostap and wpa-supplicant Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + strategy: + matrix: + include: + - build_id: hostap-build1 + wolf_extra_config: --disable-tls13 + - build_id: hostap-build2 + wolf_extra_config: --enable-brainpool --enable-wpas-dpp + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-20.04 + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + # No way to view the full strategy in the browser (really weird) + - name: Print strategy + run: | + cat <> $GITHUB_ENV + + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: >- + --enable-wpas CFLAGS=-DWOLFSSL_STATIC_RSA + ${{ env.wolf_debug_flags }} ${{ matrix.wolf_extra_config }} + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.build_id }} + path: build-dir + retention-days: 5 + + # Build wpa_supplicant with wolfSSL and hostapd with OpenSSL and interop. + hostap_test: + strategy: + fail-fast: false + matrix: + # should hostapd be compiled with wolfssl + hostapd: [true, false] + # should wpa_supplicant be compiled with wolfssl + wpa_supplicant: [true, false] + # Fix the versions of hostap and osp to not break testing when a new + # patch is added in to osp. hostap_cherry_pick is used to apply the + # commit that updates the certificates used for testing. Tests are read + # from the corresponding configs/hostap_ref/tests file. + config: [ + { + hostap_ref: hostap_2_10, + hostap_cherry_pick: 36fcbb1a4ee4aa604f15079eae2ffa4fe7f44680, + remove_teap: true, + # TLS 1.3 does not work for this version + build_id: hostap-build1, + }, + # Test the dpp patch + { + hostap_ref: b607d2723e927a3446d89aed813f1aa6068186bb, + hostap_cherry_pick: 36fcbb1a4ee4aa604f15079eae2ffa4fe7f44680, + osp_ref: ad5b52a49b3cc2a5bfb47ccc1d6a5137132e9446, + build_id: hostap-build2 + }, + ] + # parallelize the tests to be able to run all tests within 10 minutes + # Update the in the ./run-tests.py step when changing. + server: [1, 2, 3, 4, 5] + exclude: + # don't test openssl on both sides + - hostapd: false + wpa_supplicant: false + # no hostapd support for dpp yet + - hostapd: true + config: { + hostap_ref: b607d2723e927a3446d89aed813f1aa6068186bb, + osp_ref: ad5b52a49b3cc2a5bfb47ccc1d6a5137132e9446, + build_id: hostap-build2 + } + name: hwsim test + # For openssl 1.1 + runs-on: ubuntu-20.04 + # This should be a safe limit for the tests to run. + timeout-minutes: 12 + needs: build_wolfssl + steps: + # No way to view the full strategy in the browser (really weird) + - name: Print strategy + run: | + cat <> $GITHUB_ENV + echo Our job run ID is $SHA_SUM + + - name: Checkout wolfSSL + uses: actions/checkout@v4 + with: + path: wolfssl + + - name: Install dependencies + run: | + # Don't prompt for anything + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + # hostap dependencies + sudo apt-get install -y libpcap0.8 libpcap-dev curl libcurl4-openssl-dev \ + libnl-3-dev binutils-dev libssl-dev libiberty-dev libnl-genl-3-dev \ + libnl-route-3-dev libdbus-1-dev linux-modules-extra-`uname -r` \ + bridge-utils + sudo pip3 install pycryptodome + + - name: Enable mac80211 + run: | + sudo modprobe mac80211 + lsmod | grep mac80211 + + - if: ${{ runner.debug }} + name: Enable hostap debug logging + run: | + echo "hostap_debug_flags=-d" >> $GITHUB_ENV + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: ${{ matrix.config.build_id }} + path: build-dir + + - name: Setup d-bus + working-directory: wolfssl/.github/workflows/hostap-files + run: | + sudo cp dbus-wpa_supplicant.conf /usr/share/dbus-1/system.d/wpa_supplicant.conf + sudo service dbus reload + + # This is super hack-ish :P + # If you are trying to reproduce this on a more generic system, you can + # just run `sudo apt install linux-modules-extra-$(uname -r)` and + # this should have the module in the package. No need to compile it. + - name: Compile and install mac80211_hwsim + working-directory: wolfssl/.github/workflows/hostap-files + run: | + # The tag will be the first two numbers of from uname -r + LINUX_TAG=$(uname -r | grep -oP '^\d+\.\d+') + # Download the correct version of the driver + wget https://raw.githubusercontent.com/torvalds/linux/v$LINUX_TAG/drivers/net/wireless/mac80211_hwsim.c + wget https://raw.githubusercontent.com/torvalds/linux/v$LINUX_TAG/drivers/net/wireless/mac80211_hwsim.h + make + sudo make install + sudo modprobe mac80211_hwsim + lsmod | grep mac80211_hwsim + sudo rmmod mac80211_hwsim + + - name: Checkout hostap + uses: actions/checkout@v4 + with: + repository: julek-wolfssl/hostap-mirror + path: hostap + ref: ${{ matrix.config.hostap_ref }} + # necessary for cherry pick step + fetch-depth: 0 + + - if: ${{ matrix.config.hostap_cherry_pick }} + name: Cherry pick certificate update + working-directory: hostap + run: git cherry-pick -n -X theirs ${{ matrix.config.hostap_cherry_pick }} + + - if: ${{ matrix.config.osp_ref }} + name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + ref: ${{ matrix.config.osp_ref }} + + - if: ${{ matrix.config.osp_ref }} + name: Apply patch files + working-directory: hostap + run: | + for f in $GITHUB_WORKSPACE/osp/hostap-patches/pending/* + do + patch -p1 < $f + done + + - if: ${{ matrix.hostapd }} + name: Setup hostapd config file + run: | + cp wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/hostapd.config \ + hostap/hostapd/.config + cat <> hostap/hostapd/.config + CFLAGS += -I$GITHUB_WORKSPACE/build-dir/include -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + LIBS += -L$GITHUB_WORKSPACE/build-dir/lib -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + EOF + + - if: ${{ matrix.wpa_supplicant }} + name: Setup wpa_supplicant config file + run: | + cp wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/wpa_supplicant.config \ + hostap/wpa_supplicant/.config + cat <> hostap/wpa_supplicant/.config + CFLAGS += -I$GITHUB_WORKSPACE/build-dir/include -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + LIBS += -L$GITHUB_WORKSPACE/build-dir/lib -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + EOF + + - name: Build hostap + working-directory: hostap/tests/hwsim/ + run: ./build.sh + + - if: ${{ matrix.hostapd }} + name: Confirm hostapd linking with wolfSSL + run: ldd hostap/hostapd/hostapd | grep wolfssl + + - if: ${{ matrix.wpa_supplicant }} + name: Confirm wpa_supplicant linking with wolfSSL + run: ldd hostap/wpa_supplicant/wpa_supplicant | grep wolfssl + + - if: ${{ matrix.config.remove_teap }} + name: Remove EAP-TEAP from test configuration + working-directory: hostap/tests/hwsim/auth_serv + run: | + sed -e 's/"erp-teap@example.com"\tTEAP//' -i eap_user.conf + sed -e 's/"erp-teap@example.com"\tMSCHAPV2\t"password"\t\[2\]//' -i eap_user.conf + sed -e 's/"TEAP"\t\tTEAP//' -i eap_user.conf + sed -e 's/TEAP,//' -i eap_user.conf + + - name: Run tests + id: testing + working-directory: hostap/tests/hwsim/ + run: | + # Run tests in increments of 50 to cut down on the uploaded log size. + while mapfile -t -n 50 ary && ((${#ary[@]})); do + TESTS=$(printf '%s\n' "${ary[@]}" | tr '\n' ' ') + # Retry up to three times + for i in {1..3}; do + HWSIM_RES=0 # Not set when command succeeds + # Logs can grow quickly especially in debug mode + sudo rm -rf logs + sudo ./start.sh + sudo ./run-tests.py ${{ env.hostap_debug_flags }} --split ${{ matrix.server }}/5 $TESTS || HWSIM_RES=$? + sudo ./stop.sh + if [ "$HWSIM_RES" -eq "0" ]; then + break + fi + done + echo "test ran $i times" + if [ "$HWSIM_RES" -ne "0" ]; then + exit $HWSIM_RES + fi + done < $GITHUB_WORKSPACE/wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/tests + + - name: Change failure log permissions + if: ${{ failure() && steps.testing.outcome == 'failure' }} + working-directory: hostap/tests/hwsim/ + run: | + sudo chown -R $USER:$USER logs + zip -9 -r logs.zip logs/current + + - name: Upload failure logs + if: ${{ failure() && steps.testing.outcome == 'failure' }} + uses: actions/upload-artifact@v4 + with: + name: hostap-logs-${{ env.our_job_run_id }} + path: hostap/tests/hwsim/logs.zip + retention-days: 5 + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/docker-Espressif.yml 2024-08-03 07:30:00.000000000 +0000 @@ -1,15 +1,26 @@ name: Espressif examples tests +# START OF COMMON SECTION on: - workflow_call: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION jobs: espressif_latest: name: latest Docker container runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 12 container: image: espressif/idf:latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Initialize Espressif IDE and build examples run: . /opt/esp/idf/export.sh; IDE/Espressif/ESP-IDF/compileAllExamples.sh espressif_v4_4: @@ -18,7 +29,7 @@ container: image: espressif/idf:release-v4.4 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Initialize Espressif IDE and build examples run: . /opt/esp/idf/export.sh; IDE/Espressif/ESP-IDF/compileAllExamples.sh espressif_v5_0: @@ -27,6 +38,6 @@ container: image: espressif/idf:release-v5.0 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Initialize Espressif IDE and build examples run: . /opt/esp/idf/export.sh; IDE/Espressif/ESP-IDF/compileAllExamples.sh diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/docker-OpenWrt.yml 2024-08-03 07:30:00.000000000 +0000 @@ -2,44 +2,57 @@ # there aren't any compatibility issues. Take a look at Docker/OpenWrt/README.md name: OpenWrt test +# START OF COMMON SECTION on: - workflow_call: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION jobs: build_library: name: Compile libwolfssl.so runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 container: image: alpine:latest steps: - name: Install required tools run: apk add argp-standalone asciidoc bash bc binutils bzip2 cdrkit coreutils diffutils elfutils-dev findutils flex musl-fts-dev g++ gawk gcc gettext git grep intltool libxslt linux-headers make musl-libintl musl-obstack-dev ncurses-dev openssl-dev patch perl python3-dev rsync tar unzip util-linux wget zlib-dev autoconf automake libtool - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Compile libwolfssl.so run: ./autogen.sh && ./configure --enable-all && make - name: Upload libwolfssl.so - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: openwrt-libwolfssl.so path: src/.libs/libwolfssl.so - retention-days: 1 + retention-days: 5 compile_container: name: Compile container runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 2 needs: build_library strategy: fail-fast: false matrix: - release: [ "22.03-SNAPSHOT", "21.02-SNAPSHOT" ] # some other versions: 21.02.0 21.02.5 22.03.0 22.03.3 snapshot + release: [ "22.03.6", "21.02.7" ] # some other versions: 21.02.0 21.02.5 22.03.0 22.03.3 snapshot steps: - - uses: actions/checkout@v3 - - uses: docker/setup-buildx-action@v2 - - uses: actions/download-artifact@v3 + - uses: actions/checkout@v4 + - uses: docker/setup-buildx-action@v3 + - uses: actions/download-artifact@v4 with: name: openwrt-libwolfssl.so path: Docker/OpenWrt/. - name: Build but dont push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v5 with: context: Docker/OpenWrt platforms: linux/amd64 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/grpc.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/grpc.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/grpc.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/grpc.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,101 @@ +name: grpc Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 10 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all 'CPPFLAGS=-DWOLFSSL_RSA_KEY_CHECK -DHAVE_EX_DATA_CLEANUP_HOOKS' + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-grpc + path: build-dir + retention-days: 5 + + grpc_check: + strategy: + fail-fast: false + matrix: + include: + - ref: v1.60.0 + tests: >- + bad_ssl_alpn_test bad_ssl_cert_test client_ssl_test + crl_ssl_transport_security_test server_ssl_test + ssl_transport_security_test ssl_transport_security_utils_test + test_core_security_ssl_credentials_test test_cpp_end2end_ssl_credentials_test + h2_ssl_cert_test h2_ssl_session_reuse_test + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 30 + needs: build_wolfssl + steps: + - name: Confirm IPv4 and IPv6 support + run: | + ip addr list lo | grep 'inet ' + ip addr list lo | grep 'inet6 ' + + - name: Install prereqs + run: + sudo apt-get install build-essential autoconf libtool pkg-config cmake clang libc++-dev + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-grpc + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Checkout grpc + uses: actions/checkout@v4 + with: + repository: grpc/grpc + path: grpc + ref: ${{ matrix.ref }} + + - name: Build grpc + working-directory: ./grpc + run: | + patch -p1 < ../osp/grpc/grpc-${{ matrix.ref }}.patch + git submodule update --init + mkdir cmake/build + cd cmake/build + cmake -DgRPC_BUILD_TESTS=ON -DgRPC_SSL_PROVIDER=wolfssl \ + -DWOLFSSL_INSTALL_DIR=$GITHUB_WORKSPACE/build-dir ../.. + make -j $(nproc) ${{ matrix.tests }} + + - name: Run grpc tests + working-directory: ./grpc + run: | + export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/build-dir/lib:$LD_LIBRARY_PATH + ./tools/run_tests/start_port_server.py + for t in ${{ matrix.tests }} ; do + ./cmake/build/$t + done diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/haproxy.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,51 +0,0 @@ -name: HaProxy Tests - -on: - workflow_call: - -jobs: - haproxy_check: - strategy: - fail-fast: false - matrix: - # List of refs to test - ref: [ master ] - name: ${{ matrix.ref }} - runs-on: ubuntu-latest - steps: - - name: Build wolfSSL - uses: wolfSSL/actions-build-autotools-project@v1 - with: - path: wolfssl - configure: --enable-quic --enable-haproxy - install: true - - - name: Checkout VTest - uses: actions/checkout@v3 - with: - repository: vtest/VTest - path: VTest - - - name: Build VTest - working-directory: VTest - # Special flags due to: https://github.com/vtest/VTest/issues/12 - run: make FLAGS='-O2 -s -Wall' - - - name: Checkout HaProxy - uses: actions/checkout@v3 - with: - repository: haproxy/haproxy - path: haproxy - ref: ${{ matrix.ref }} - - - name: Build HaProxy - working-directory: haproxy - run: >- - make -j TARGET=linux-glibc DEBUG='-DDEBUG_MEMORY_POOLS -DDEBUG_STRICT' - USE_OPENSSL_WOLFSSL=1 USE_QUIC=1 SSL_INC=$GITHUB_WORKSPACE/build-dir/include/ - SSL_LIB=$GITHUB_WORKSPACE/build-dir/lib/ ADDLIB=-Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib - - - name: Test HaProxy - working-directory: haproxy - run: make reg-tests reg-tests/ssl VTEST_PROGRAM=$GITHUB_WORKSPACE/VTest/vtest - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hitch.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hitch.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hitch.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hitch.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,103 @@ +name: hitch Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-hitch + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-hitch + path: build-dir + retention-days: 5 + + hitch_check: + strategy: + fail-fast: false + matrix: + # List of releases to test + include: + - ref: 1.7.3 + ignore-tests: >- + test13-r82.sh test15-proxy-v2-npn.sh test39-client-cert-proxy.sh + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-hitch + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Install dependencies + run: | + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + sudo apt-get install -y libev-dev libssl-dev automake python3-docutils flex bison pkg-config make + + - name: Checkout hitch + uses: actions/checkout@v4 + with: + repository: varnish/hitch + ref: 1.7.3 + path: hitch + + # Do this before configuring so that it only detects the updated list of + # tests + - if: ${{ matrix.ignore-tests }} + name: Remove tests that we want to ignore + working-directory: ./hitch/src/tests + run: | + rm ${{ matrix.ignore-tests }} + + - name: Configure and build hitch + run: | + cd $GITHUB_WORKSPACE/hitch/ + patch -p1 < $GITHUB_WORKSPACE/osp/hitch/hitch_1.7.3.patch + autoreconf -ivf + SSL_CFLAGS="-I$GITHUB_WORKSPACE/build-dir/include/ -I$GITHUB_WORKSPACE/build-dir/include/wolfssl" SSL_LIBS="-L$GITHUB_WORKSPACE/build-dir/lib -lwolfssl" ./configure --with-wolfssl=$GITHUB_WORKSPACE/build-dir/ --enable-silent-rules --enable-documentation --enable-warnings --with-lex --with-yacc --prefix=$GITHUB_WORKSPACE/build-dir + make -j$(nproc) + + - name: Confirm hitch built with wolfSSL + working-directory: ./hitch + run: | + export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/build-dir/lib:$LD_LIBRARY_PATH + ldd src/hitch | grep wolfssl + + - name: Run hitch tests, skipping ignored tests + working-directory: ./hitch + run: | + export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/build-dir/lib:$LD_LIBRARY_PATH + make check \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/hostapd.config mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/hostapd.config --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/hostapd.config 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/hostapd.config 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,122 @@ +#CC=ccache gcc + +CONFIG_DRIVER_NONE=y +CONFIG_DRIVER_NL80211=y +CONFIG_RSN_PREAUTH=y + +#CONFIG_TLS=internal +#CONFIG_INTERNAL_LIBTOMMATH=y +#CONFIG_INTERNAL_LIBTOMMATH_FAST=y +#CONFIG_TLS=openssl +CONFIG_TLS=wolfssl + +CONFIG_EAP=y +CONFIG_ERP=y +CONFIG_EAP_MD5=y +CONFIG_EAP_TLS=y +CONFIG_EAP_MSCHAPV2=y +CONFIG_EAP_PEAP=y +CONFIG_EAP_GTC=y +CONFIG_EAP_TTLS=y +CONFIG_EAP_SIM=y +CONFIG_EAP_AKA=y +CONFIG_EAP_AKA_PRIME=y +CONFIG_EAP_GPSK=y +CONFIG_EAP_GPSK_SHA256=y +CONFIG_EAP_SAKE=y +CONFIG_EAP_PAX=y +CONFIG_EAP_PSK=y +CONFIG_EAP_VENDOR_TEST=y +CONFIG_EAP_FAST=y +CONFIG_EAP_TEAP=y +CONFIG_EAP_IKEV2=y +CONFIG_EAP_TNC=y +CFLAGS += -DTNC_CONFIG_FILE=\"tnc/tnc_config\" +LIBS += -rdynamic +CONFIG_EAP_UNAUTH_TLS=y +ifeq ($(CONFIG_TLS), openssl) +CONFIG_EAP_PWD=y +endif +ifeq ($(CONFIG_TLS), wolfssl) +CONFIG_EAP_PWD=y +endif +CONFIG_EAP_EKE=y +CONFIG_PKCS12=y +CONFIG_RADIUS_SERVER=y +CONFIG_IPV6=y +CONFIG_TLSV11=y +CONFIG_TLSV12=y + +CONFIG_FULL_DYNAMIC_VLAN=y +CONFIG_VLAN_NETLINK=y +CONFIG_LIBNL32=y +CONFIG_LIBNL3_ROUTE=y +CONFIG_IEEE80211R=y +CONFIG_IEEE80211AC=y +CONFIG_IEEE80211AX=y + +CONFIG_OCV=y + +CONFIG_WPS=y +CONFIG_WPS_UPNP=y +CONFIG_WPS_NFC=y +#CONFIG_WPS_STRICT=y +CONFIG_WPA_TRACE=y +CONFIG_WPA_TRACE_BFD=y + +CONFIG_P2P_MANAGER=y +CONFIG_DEBUG_FILE=y +CONFIG_DEBUG_LINUX_TRACING=y +CONFIG_WPA_CLI_EDIT=y +CONFIG_ACS=y +CONFIG_NO_RANDOM_POOL=y +CONFIG_WNM=y +CONFIG_INTERWORKING=y +CONFIG_HS20=y +CONFIG_SQLITE=y +CONFIG_SAE=y +CONFIG_SAE_PK=y +CFLAGS += -DALL_DH_GROUPS + +CONFIG_FST=y +CONFIG_FST_TEST=y + +CONFIG_TESTING_OPTIONS=y +CFLAGS += -DCONFIG_RADIUS_TEST +CONFIG_MODULE_TESTS=y + +CONFIG_SUITEB=y +CONFIG_SUITEB192=y + +# AddressSanitizer (ASan) can be enabled by uncommenting the following lines. +# This can be used as a more efficient memory error detector than valgrind +# (though, with still some CPU and memory cost, so VM cases will need more +# memory allocated for the guest). +#CFLAGS += -fsanitize=address -O1 -fno-omit-frame-pointer -g +#LIBS += -fsanitize=address -fno-omit-frame-pointer -g +#LIBS_h += -fsanitize=address -fno-omit-frame-pointer -g +#LIBS_n += -fsanitize=address -fno-omit-frame-pointer -g +#LIBS_c += -fsanitize=address -fno-omit-frame-pointer -g + +# Undefined Behavior Sanitizer (UBSan) can be enabled by uncommenting the +# following lines. +#CFLAGS += -Wno-format-nonliteral +#CFLAGS += -fsanitize=undefined +##CFLAGS += -fno-sanitize-recover +#LIBS += -fsanitize=undefined +##LIBS += -fno-sanitize-recover +#LIBS_h += -fsanitize=undefined +#LIBS_n += -fsanitize=undefined +#LIBS_c += -fsanitize=undefined +CONFIG_MBO=y + +CONFIG_TAXONOMY=y +CONFIG_FILS=y +CONFIG_FILS_SK_PFS=y +CONFIG_OWE=y +CONFIG_DPP=y +CONFIG_DPP2=y +CONFIG_WEP=y +CONFIG_PASN=y +CONFIG_AIRTIME_POLICY=y +CONFIG_IEEE80211BE=y diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/tests mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/tests --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/tests 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/tests 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1677 @@ +ap_cipher_bip +ap_cipher_bip_cmac_256 +ap_cipher_bip_cmac_256_req +ap_cipher_bip_gmac_128 +ap_cipher_bip_gmac_128_req +ap_cipher_bip_gmac_256 +ap_cipher_bip_gmac_256_req +ap_cipher_bip_req +ap_cipher_bip_req_mismatch +ap_cipher_gcmp +ap_cipher_gcmp_256_group_ccmp +ap_cipher_gcmp_256_group_ccmp_256 +ap_cipher_gcmp_256_group_gcmp_256 +ap_cipher_gcmp_ccmp +ap_cipher_mixed_wpa_wpa2 +ap_cipher_replay_protection_ap_ccmp +ap_cipher_replay_protection_ap_gcmp +ap_cipher_replay_protection_ap_tkip +ap_cipher_replay_protection_sta_bigtk +ap_cipher_replay_protection_sta_ccmp +ap_cipher_replay_protection_sta_gtk_ccmp +ap_cipher_replay_protection_sta_gtk_gcmp +ap_cipher_replay_protection_sta_gtk_tkip +ap_cipher_replay_protection_sta_tkip +ap_cipher_tkip +ap_cipher_tkip_countermeasures_ap +ap_cipher_tkip_countermeasures_ap_mixed_mode +ap_cipher_tkip_countermeasures_sta +ap_cipher_wpa_sae +ap_ft_eap +ap_ft_eap_ap_config_change +ap_ft_eap_cui +ap_ft_eap_dis +ap_ft_eap_dynamic_rxkhs +ap_ft_eap_over_ds +ap_ft_eap_ptk_rekey_ap +ap_ft_eap_sha384 +ap_ft_eap_sha384_over_ds +ap_ft_eap_sha384_reassoc +ap_ft_eap_vlan_multi +ap_ft_extra_ie +ap_ft_gcmp_256 +ap_ft_gtk_rekey +ap_ft_internal_rrb_check +ap_ft_invalid_resp +ap_ft_local_key_gen +ap_ft_many +ap_ft_many_vlan +ap_ft_mismatching_r0kh_id_pull +ap_ft_mismatching_r0kh_id_pull_eap +ap_ft_mismatching_rrb_key_pull +ap_ft_mismatching_rrb_key_pull_eap +ap_ft_mismatching_rrb_key_push +ap_ft_mismatching_rrb_r0kh_pull_eap +ap_ft_mismatching_rrb_r0kh_push_eap +ap_ft_mixed +ap_ft_no_full_ap_client_state +ap_ft_ocv +ap_ft_ocv_change +ap_ft_old_key +ap_ft_oom +ap_ft_oom2 +ap_ft_oom3 +ap_ft_oom4 +ap_ft_over_ds +ap_ft_over_ds_disabled +ap_ft_over_ds_many +ap_ft_over_ds_ocv +ap_ft_over_ds_proto +ap_ft_over_ds_proto_ap +ap_ft_over_ds_pull_old_key +ap_ft_over_ds_separate_hostapd +ap_ft_over_ds_unexpected +ap_ft_over_ds_unknown_target +ap_ft_pmf +ap_ft_pmf_bip_cmac_128 +ap_ft_pmf_bip_cmac_128_over_ds +ap_ft_pmf_bip_cmac_256 +ap_ft_pmf_bip_cmac_256_over_ds +ap_ft_pmf_bip_gmac_128_over_ds +ap_ft_pmf_bip_gmac_256 +ap_ft_pmf_bip_gmac_256_over_ds +ap_ft_pmf_bip_over_ds +ap_ft_pmf_required +ap_ft_pmf_required_mismatch +ap_ft_pmf_required_mismatch_over_ds +ap_ft_pmf_required_over_ds +ap_ft_pmksa_caching +ap_ft_pmksa_caching_sha384 +ap_ft_psk_file +ap_ft_ptk_rekey2 +ap_ft_ptk_rekey_ap +ap_ft_ptk_rekey_ap2 +ap_ft_r0_key_expiration +ap_ft_reassoc_local_fail +ap_ft_reassoc_proto +ap_ft_sae +ap_ft_sae_ext_key_19 +ap_ft_sae_ext_key_19_over_ds +ap_ft_sae_ext_key_20_over_ds +ap_ft_sae_ext_key_21 +ap_ft_sae_ext_key_21_over_ds +ap_ft_sae_h2e +ap_ft_sae_h2e_and_loop +ap_ft_sae_h2e_rsne_mismatch +ap_ft_sae_h2e_rsne_mismatch_pmkr1name +ap_ft_sae_h2e_rsne_override +ap_ft_sae_h2e_rsnxe_mismatch +ap_ft_sae_over_ds +ap_ft_sae_over_ds_ptk_rekey1 +ap_ft_sae_pmksa_caching +ap_ft_sae_pmksa_caching_h2e_prepend_pmkid +ap_ft_sae_pmksa_caching_pwe +ap_ft_sae_ptk_rekey_ap_ext_key_id +ap_ft_sae_rsnxe_used_mismatch +ap_ft_sae_rsnxe_used_mismatch2 +ap_ft_sae_skip_prune_assoc +ap_ft_sae_transition +ap_missing_psk +ap_mixed_security +ap_no_auth_ack +ap_no_probe_resp +ap_roam_wpa2_psk_pmf_mismatch +ap_roam_wpa2_psk_race +ap_sae_tdls +ap_vlan_file_open2 +ap_vlan_file_parsing +ap_vlan_iface_cleanup_multibss_per_sta_vif +ap_vlan_open +ap_vlan_sae +ap_vlan_tagged +ap_vlan_tagged_wpa2_radius_id_change +ap_vlan_wpa2_psk_radius_required +ap_vlan_wpa2_radius +ap_vlan_wpa2_radius_id_change +ap_vlan_wpa2_radius_mixed +ap_vlan_wpa2_radius_required +ap_wpa2_delayed_group_m1_retransmission +ap_wpa2_disable_eapol_retry +ap_wpa2_disable_eapol_retry_group +ap_wpa2_eap_aka_config +ap_wpa2_eap_aka_ext +ap_wpa2_eap_aka_ext_auth_fail +ap_wpa2_eap_aka_id_0 +ap_wpa2_eap_aka_id_1 +ap_wpa2_eap_aka_id_2 +ap_wpa2_eap_aka_id_3 +ap_wpa2_eap_aka_id_4 +ap_wpa2_eap_aka_id_5 +ap_wpa2_eap_aka_id_6 +ap_wpa2_eap_aka_id_7 +ap_wpa2_eap_aka_imsi_identity +ap_wpa2_eap_aka_imsi_identity_fallback +ap_wpa2_eap_aka_imsi_privacy_attr +ap_wpa2_eap_aka_imsi_privacy_key +ap_wpa2_eap_aka_imsi_privacy_key_expired +ap_wpa2_eap_aka_prime +ap_wpa2_eap_aka_prime_ext +ap_wpa2_eap_aka_prime_ext_auth_fail +ap_wpa2_eap_aka_prime_imsi_identity +ap_wpa2_eap_aka_prime_imsi_privacy_key +ap_wpa2_eap_aka_prime_sql +ap_wpa2_eap_aka_sql +ap_wpa2_eap_aka_sql_fallback_to_pseudonym +ap_wpa2_eap_aka_sql_fallback_to_pseudonym_id +ap_wpa2_eap_assoc_rsn +ap_wpa2_eap_eke +ap_wpa2_eap_eke_serverid_nai +ap_wpa2_eap_eke_server_oom +ap_wpa2_eap_expanded_nak +ap_wpa2_eap_fast_binary_pac +ap_wpa2_eap_fast_binary_pac_errors +ap_wpa2_eap_fast_cipher_suites +ap_wpa2_eap_fast_eap_aka +ap_wpa2_eap_fast_eap_sim +ap_wpa2_eap_fast_gtc_auth_prov +ap_wpa2_eap_fast_missing_pac_config +ap_wpa2_eap_fast_mschapv2_unauth_prov +ap_wpa2_eap_fast_pac_file +ap_wpa2_eap_fast_pac_lifetime +ap_wpa2_eap_fast_pac_refresh +ap_wpa2_eap_fast_pac_truncate +ap_wpa2_eap_fast_prf_oom +ap_wpa2_eap_fast_prov +ap_wpa2_eap_fast_text_pac_errors +ap_wpa2_eap_gpsk +ap_wpa2_eap_gpsk_ptk_rekey_ap +ap_wpa2_eap_ikev2 +ap_wpa2_eap_ikev2_as_frag +ap_wpa2_eap_ikev2_oom +ap_wpa2_eap_non_ascii_identity +ap_wpa2_eap_non_ascii_identity2 +ap_wpa2_eapol_retry_limit +ap_wpa2_eap_pax +ap_wpa2_eap_peap_eap_mschapv2_incorrect_password +ap_wpa2_eap_psk +ap_wpa2_eap_psk_mac_addr_change +ap_wpa2_eap_psk_oom +ap_wpa2_eap_pwd +ap_wpa2_eap_pwd_as_frag +ap_wpa2_eap_pwd_disabled_group +ap_wpa2_eap_pwd_groups +ap_wpa2_eap_pwd_invalid_group +ap_wpa2_eap_pwd_nthash +ap_wpa2_eap_pwd_salt_sha1 +ap_wpa2_eap_pwd_salt_sha256 +ap_wpa2_eap_pwd_salt_sha512 +ap_wpa2_eap_reauth +ap_wpa2_eap_reauth_ptk_rekey_blocked_ap +ap_wpa2_eap_reauth_ptk_rekey_blocked_sta +ap_wpa2_eap_request_identity_message +ap_wpa2_eap_sake +ap_wpa2_eap_sake_no_control_port +ap_wpa2_eap_sha384_psk +ap_wpa2_eap_sim +ap_wpa2_eap_sim_aka_result_ind +ap_wpa2_eap_sim_change_bssid +ap_wpa2_eap_sim_config +ap_wpa2_eap_sim_db +ap_wpa2_eap_sim_db_sqlite +ap_wpa2_eap_sim_ext +ap_wpa2_eap_sim_ext_anonymous +ap_wpa2_eap_sim_ext_anonymous_no_pseudonym +ap_wpa2_eap_sim_ext_auth_fail +ap_wpa2_eap_sim_ext_replace_sim +ap_wpa2_eap_sim_ext_replace_sim2 +ap_wpa2_eap_sim_ext_replace_sim3 +ap_wpa2_eap_sim_id_0 +ap_wpa2_eap_sim_id_1 +ap_wpa2_eap_sim_id_2 +ap_wpa2_eap_sim_id_3 +ap_wpa2_eap_sim_id_4 +ap_wpa2_eap_sim_id_5 +ap_wpa2_eap_sim_id_6 +ap_wpa2_eap_sim_id_7 +ap_wpa2_eap_sim_imsi_identity +ap_wpa2_eap_sim_imsi_privacy_attr +ap_wpa2_eap_sim_imsi_privacy_key +ap_wpa2_eap_sim_no_change_set +ap_wpa2_eap_sim_oom +ap_wpa2_eap_sim_sql +ap_wpa2_eap_sim_sql_fallback_to_pseudonym +ap_wpa2_eap_sim_zero_db_timeout +ap_wpa2_eap_tls_13_ec +ap_wpa2_eap_tls_13_missing_prot_success +ap_wpa2_eap_tls_blob_missing +ap_wpa2_eap_tls_check_cert_subject_neg +ap_wpa2_eap_tls_diff_ca_trust2 +ap_wpa2_eap_tls_domain_mismatch_cn +ap_wpa2_eap_tls_domain_suffix_mismatch_cn +ap_wpa2_eap_tls_intermediate_ca_ocsp_multi_missing_resp +ap_wpa2_eap_tls_intermediate_ca_ocsp_revoked_sha1 +ap_wpa2_eap_tls_intermediate_ca_ocsp_sha1 +ap_wpa2_eap_tls_neg_incorrect_trust_root +ap_wpa2_eap_tls_ocsp_multi +ap_wpa2_eap_tls_ocsp_multi_revoked +ap_wpa2_eap_tls_oom +ap_wpa2_eap_tls_versions +ap_wpa2_eap_tls_versions_server +ap_wpa2_eap_too_many_roundtrips_server +ap_wpa2_eap_too_many_roundtrips_server2 +ap_wpa2_eap_ttls_chap_incorrect_password +ap_wpa2_eap_ttls_dh_params_invalid +ap_wpa2_eap_ttls_dh_params_not_found +ap_wpa2_eap_ttls_eap_gtc_incorrect_password +ap_wpa2_eap_ttls_eap_gtc_no_password +ap_wpa2_eap_ttls_eap_md5_incorrect_password +ap_wpa2_eap_ttls_eap_md5_no_password +ap_wpa2_eap_ttls_eap_mschapv2_no_password +ap_wpa2_eap_ttls_expired_cert +ap_wpa2_eap_ttls_ignore_expired_cert +ap_wpa2_eap_ttls_invalid_phase2 +ap_wpa2_eap_ttls_long_duration +ap_wpa2_eap_ttls_mschap_incorrect_password +ap_wpa2_eap_ttls_mschapv2_incorrect_password +ap_wpa2_eap_ttls_ocsp_revoked +ap_wpa2_eap_ttls_ocsp_unknown +ap_wpa2_eap_ttls_pap_check_cert_subject_neg +ap_wpa2_eap_ttls_pap_incorrect_password +ap_wpa2_eap_ttls_server_cert_eku_client +ap_wpa2_eap_ttls_server_cert_hash +ap_wpa2_eap_ttls_server_cert_hash_invalid +ap_wpa2_eap_vendor_test +ap_wpa2_eap_vendor_test_oom +ap_wpa2_eap_wildcard_ssid +ap_wpa2_ext_add_to_bridge +ap_wpa2_gmk_rekey +ap_wpa2_gtk_initial_rsc_ccmp_256 +ap_wpa2_gtk_initial_rsc_tkip +ap_wpa2_gtk_rekey +ap_wpa2_gtk_rekey_fail_1_sta +ap_wpa2_gtk_rekey_failure +ap_wpa2_gtk_rekey_request +ap_wpa2_igtk_initial_rsc_aes_128_cmac +ap_wpa2_igtk_initial_rsc_bip_cmac_256 +ap_wpa2_igtk_initial_rsc_bip_gmac_128 +ap_wpa2_igtk_initial_rsc_bip_gmac_256 +ap_wpa2_plaintext_group_m1 +ap_wpa2_plaintext_group_m1_pmf +ap_wpa2_plaintext_m1_m3 +ap_wpa2_plaintext_m1_m3_pmf +ap_wpa2_plaintext_m3 +ap_wpa2_psk +ap_wpa2_psk_4addr +ap_wpa2_psk_ap_control_port +ap_wpa2_psk_assoc_rsn +ap_wpa2_psk_assoc_rsn_pmkid +ap_wpa2_psk_disable_enable +ap_wpa2_psk_drop_first_msg_4 +ap_wpa2_psk_ext +ap_wpa2_psk_ext_delayed_ptk_rekey +ap_wpa2_psk_ext_eapol +ap_wpa2_psk_ext_eapol_key_info +ap_wpa2_psk_ext_eapol_retry1 +ap_wpa2_psk_ext_eapol_retry1b +ap_wpa2_psk_ext_eapol_retry1c +ap_wpa2_psk_ext_eapol_retry1d +ap_wpa2_psk_ext_eapol_type_diff +ap_wpa2_psk_ext_key_id_ptk_rekey_ap0 +ap_wpa2_psk_ext_key_id_ptk_rekey_ap1 +ap_wpa2_psk_ext_key_id_ptk_rekey_ap2 +ap_wpa2_psk_ext_key_id_ptk_rekey_sta0 +ap_wpa2_psk_ext_key_id_ptk_rekey_sta1 +ap_wpa2_psk_ext_key_id_ptk_rekey_sta2 +ap_wpa2_psk_ext_retry_msg_3 +ap_wpa2_psk_ext_retry_msg_3b +ap_wpa2_psk_ext_retry_msg_3c +ap_wpa2_psk_ext_retry_msg_3d +ap_wpa2_psk_ext_retry_msg_3e +ap_wpa2_psk_file +ap_wpa2_psk_file_errors +ap_wpa2_psk_file_keyid +ap_wpa2_psk_ft_workaround +ap_wpa2_psk_incorrect_passphrase +ap_wpa2_psk_local_error +ap_wpa2_psk_mem +ap_wpa2_psk_mic_0 +ap_wpa2_psk_no_random +ap_wpa2_psk_rsne_mismatch_ap +ap_wpa2_psk_rsne_mismatch_ap2 +ap_wpa2_psk_rsne_mismatch_ap3 +ap_wpa2_psk_rsnxe_mismatch_ap +ap_wpa2_psk_supp_proto +ap_wpa2_psk_supp_proto_anonce_change +ap_wpa2_psk_supp_proto_gtk_keyidx_0_and_3 +ap_wpa2_psk_supp_proto_gtk_not_encrypted +ap_wpa2_psk_supp_proto_gtk_tx_bit_workaround +ap_wpa2_psk_supp_proto_ie_mismatch +ap_wpa2_psk_supp_proto_msg_1_invalid_kde +ap_wpa2_psk_supp_proto_no_gtk +ap_wpa2_psk_supp_proto_no_gtk_in_group_msg +ap_wpa2_psk_supp_proto_no_ie +ap_wpa2_psk_supp_proto_ok +ap_wpa2_psk_supp_proto_too_long_gtk_in_group_msg +ap_wpa2_psk_supp_proto_too_long_gtk_kde +ap_wpa2_psk_supp_proto_unexpected_group_msg +ap_wpa2_psk_supp_proto_wrong_group_key_len +ap_wpa2_psk_supp_proto_wrong_pairwise_key_len +ap_wpa2_psk_unexpected +ap_wpa2_psk_wep +ap_wpa2_psk_wildcard_ssid +ap_wpa2_ptk_rekey +ap_wpa2_ptk_rekey_anonce +ap_wpa2_ptk_rekey_ap +ap_wpa2_ptk_rekey_blocked_ap +ap_wpa2_ptk_rekey_blocked_sta +ap_wpa2_sha256_ptk_rekey +ap_wpa2_sha256_ptk_rekey_ap +ap_wpa2_strict_rekey +ap_wpa2_tdls +ap_wpa2_tdls_bssid_mismatch +ap_wpa2_tdls_concurrent_init +ap_wpa2_tdls_concurrent_init2 +ap_wpa2_tdls_decline_resp +ap_wpa2_tdls_diff_rsnie +ap_wpa2_tdls_double_tpk_m2 +ap_wpa2_tdls_long_frame +ap_wpa2_tdls_long_lifetime +ap_wpa2_tdls_reneg +ap_wpa2_tdls_responder_teardown +ap_wpa2_tdls_wrong_lifetime_resp +ap_wpa2_tdls_wrong_tpk_m2_mic +ap_wpa2_tdls_wrong_tpk_m3_mic +ap_wpa2_test_command_failures +ap_wpa3_eap_transition_disable +ap_wpa_gtk_rekey +ap_wpa_ie_parsing +ap_wpa_mixed_tdls +ap_wpa_psk_ext_eapol +ap_wpa_psk_rsn_pairwise +ap_wpa_ptk_rekey +ap_wpa_ptk_rekey_ap +ap_wpa_tdls +ap_wps_adv_oom +ap_wps_and_bss_limit +ap_wps_and_non_wps +ap_wps_and_sae +ap_wps_ap_pin_failure +ap_wps_appl_ext +ap_wps_ap_scan_2 +ap_wps_assoc_req_ie_oom +ap_wps_assoc_resp_ie_oom +ap_wps_authenticator_mismatch_m2 +ap_wps_authenticator_mismatch_m3 +ap_wps_authenticator_mismatch_m4 +ap_wps_authenticator_mismatch_m5 +ap_wps_authenticator_mismatch_m6 +ap_wps_authenticator_mismatch_m7 +ap_wps_authenticator_mismatch_m8 +ap_wps_authenticator_missing_m2 +ap_wps_check_pin +ap_wps_conf_and_sae +ap_wps_conf_and_sae_h2e +ap_wps_config_methods +ap_wps_config_without_wps +ap_wps_conf_pin +ap_wps_conf_pin_2sta +ap_wps_conf_pin_ccmp_256 +ap_wps_conf_pin_gcmp_128 +ap_wps_conf_pin_gcmp_256 +ap_wps_conf_pin_mixed_mode +ap_wps_conf_pin_timeout +ap_wps_conf_pin_v1 +ap_wps_conf_stub_cred +ap_wps_disabled +ap_wps_disable_enable +ap_wps_eapol_workaround +ap_wps_eap_wsc +ap_wps_eap_wsc_errors +ap_wps_e_hash_no_random_sta +ap_wps_encr_no_random_ap +ap_wps_encr_oom_ap +ap_wps_er_add_enrollee_uuid +ap_wps_er_cache_ap_settings +ap_wps_er_cache_ap_settings_oom +ap_wps_er_cache_ap_settings_oom2 +ap_wps_er_config_ap +ap_wps_er_enrollee_to_conf_ap +ap_wps_er_enrollee_to_conf_ap2 +ap_wps_er_http_client +ap_wps_er_http_client_timeout +ap_wps_er_http_proto +ap_wps_er_http_proto_control_url_dns +ap_wps_er_http_proto_event_sub_url_dns +ap_wps_er_http_proto_invalid_sid_no_uuid +ap_wps_er_http_proto_invalid_sid_uuid +ap_wps_er_http_proto_no_control_url +ap_wps_er_http_proto_no_event_sub_url +ap_wps_er_http_proto_no_sid +ap_wps_er_http_proto_subscribe_failing +ap_wps_er_http_proto_subscribe_invalid_response +ap_wps_er_http_proto_subscribe_oom +ap_wps_er_http_proto_upnp_info_invalid_udn_uuid +ap_wps_er_http_proto_upnp_info_no_device +ap_wps_er_http_proto_upnp_info_no_device_type +ap_wps_er_init_fail +ap_wps_er_init_oom +ap_wps_er_learn_oom +ap_wps_er_link_update +ap_wps_er_multi_add_enrollee +ap_wps_er_oom +ap_wps_er_pbc_overlap +ap_wps_er_set_sel_reg_oom +ap_wps_er_ssdp_proto +ap_wps_er_subscribe_oom +ap_wps_er_unsubscribe_errors +ap_wps_er_url_parse +ap_wps_er_v10_add_enrollee_pin +ap_wps_frag_ack_oom +ap_wps_fragmentation +ap_wps_from_event +ap_wps_ie_fragmentation +ap_wps_ie_invalid +ap_wps_ignore_broadcast_ssid +ap_wps_incorrect_pin +ap_wps_init +ap_wps_init_2ap_pbc +ap_wps_init_2ap_pin +ap_wps_init_oom +ap_wps_init_through_wps_config +ap_wps_init_through_wps_config_2 +ap_wps_invalid_assoc_req_elem +ap_wps_invalid_wps_config_passphrase +ap_wps_m1_no_random +ap_wps_m1_oom +ap_wps_m2_dev_passwd_id_change_pbc_to_pin +ap_wps_m2_dev_passwd_id_change_pin_to_pbc +ap_wps_m2_dev_passwd_id_p2p +ap_wps_m2_invalid +ap_wps_m2_missing_dev_passwd_id +ap_wps_m2_missing_enrollee_nonce +ap_wps_m2_missing_msg_type +ap_wps_m2_missing_registrar_nonce +ap_wps_m2_missing_uuid_r +ap_wps_m2_msg_type_m4 +ap_wps_m2_msg_type_m6 +ap_wps_m2_msg_type_m8 +ap_wps_m2_unknown_msg_type +ap_wps_m2_unknown_opcode +ap_wps_m2_unknown_opcode2 +ap_wps_m2_unknown_opcode3 +ap_wps_m3_oom +ap_wps_m4_msg_type_m2 +ap_wps_m4_msg_type_m2d +ap_wps_m5_no_random +ap_wps_m5_oom +ap_wps_m7_no_random +ap_wps_m7_oom +ap_wps_mixed_cred +ap_wps_new_version_ap +ap_wps_new_version_sta +ap_wps_passive_scan +ap_wps_pbc_2ap +ap_wps_pbc_in_m1 +ap_wps_pbc_mac_addr_change +ap_wps_pbc_overlap_2ap +ap_wps_pbc_overlap_2ap_specific_bssid +ap_wps_pbc_overlap_2sta +ap_wps_pbc_pin_mismatch +ap_wps_pbc_session_workaround +ap_wps_per_station_psk +ap_wps_per_station_psk_failure +ap_wps_per_station_psk_preset +ap_wps_pin_get_failure +ap_wps_pin_request_file +ap_wps_pin_start_failure +ap_wps_pk_oom +ap_wps_pk_oom_ap +ap_wps_priority +ap_wps_probe_req_ie_oom +ap_wps_random_ap_pin +ap_wps_random_psk_fail +ap_wps_random_uuid +ap_wps_reg_config +ap_wps_reg_config_and_sae +ap_wps_reg_config_ext_processing +ap_wps_reg_config_tkip +ap_wps_reg_connect +ap_wps_reg_connect_mixed_mode +ap_wps_reg_connect_zero_len_ap_pin +ap_wps_registrar_init_errors +ap_wps_reg_override_ap_settings +ap_wps_rf_bands +ap_wps_scan_prio_order +ap_wps_set_selected_registrar_proto +ap_wps_setup_locked +ap_wps_setup_locked_2 +ap_wps_ssdp_burst +ap_wps_ssdp_invalid_msearch +ap_wps_ssdp_msearch +ap_wps_tkip +ap_wps_twice +ap_wps_upnp +ap_wps_upnp_http_proto +ap_wps_upnp_http_proto_chunked +ap_wps_upnp_subscribe +ap_wps_upnp_subscribe_events +ap_wps_upnp_web_oom +ap_wps_wep +ap_wps_wep_config +ap_wps_wep_enroll +ap_wps_while_connected +ap_wps_while_connected_no_autoconnect +ap_wps_wpa_cli_action +ap_wps_wsc_done_oom +cert_check_basic +cert_check_dnsname +cert_check_dnsname_alt +cert_check_dnsname_cn +cert_check_dnsname_wildcard +cert_check_v3 +dpp_akm_sha256 +dpp_akm_sha384 +dpp_akm_sha512 +dpp_and_sae_akm +dpp_ap_config +dpp_ap_config_bp256_bp256 +dpp_ap_config_bp256_p256 +dpp_ap_config_bp384_bp384 +dpp_ap_config_bp512_bp512 +dpp_ap_config_bp512_p521 +dpp_ap_config_p256_bp256 +dpp_ap_config_p256_p256 +dpp_ap_config_p256_p384 +dpp_ap_config_p256_p521 +dpp_ap_config_p384_p256 +dpp_ap_config_p384_p384 +dpp_ap_config_p384_p521 +dpp_ap_config_p521_bp512 +dpp_ap_config_p521_p256 +dpp_ap_config_p521_p384 +dpp_ap_config_p521_p521 +dpp_ap_config_reconfig_configurator +dpp_ap_config_sae +dpp_auth_req_retries +dpp_auth_req_retries_multi_chan +dpp_auth_req_stop_after_ack +dpp_auth_resp_aes_siv_issue +dpp_auth_resp_retries +dpp_auth_resp_status_failure +dpp_auto_connect_2_connect_cmd +dpp_auto_connect_legacy +dpp_auto_connect_legacy_pmf_required +dpp_auto_connect_legacy_psk_sae_1 +dpp_auto_connect_legacy_psk_sae_2 +dpp_auto_connect_legacy_psk_sae_3 +dpp_auto_connect_legacy_sae_1 +dpp_auto_connect_legacy_sae_2 +dpp_auto_connect_legacy_ssid_charset +dpp_bootstrap_gen_failures +dpp_bootstrap_key_autogen_issues +dpp_chirp_ap +dpp_chirp_ap_as_configurator +dpp_chirp_ap_errors +dpp_chirp_configurator +dpp_chirp_configurator_inits +dpp_conf_file_update +dpp_config_connector_error_empty_groups +dpp_config_connector_error_expired_1 +dpp_config_connector_error_expired_2 +dpp_config_connector_error_expired_3 +dpp_config_connector_error_expired_4 +dpp_config_connector_error_expired_5 +dpp_config_connector_error_expired_6 +dpp_config_connector_error_ext_sign +dpp_config_connector_error_invalid_timestamp +dpp_config_connector_error_invalid_timestamp_date +dpp_config_connector_error_invalid_time_zone +dpp_config_connector_error_invalid_time_zone_2 +dpp_config_connector_error_missing_group_id +dpp_config_connector_error_missing_net_access_key +dpp_config_connector_error_missing_net_role +dpp_config_connector_error_net_access_key_mismatch +dpp_config_connector_error_no_groups +dpp_config_connector_error_too_short_timestamp +dpp_config_dpp_gen_3rd_party +dpp_config_dpp_gen_expired_key +dpp_config_dpp_gen_expiry +dpp_config_dpp_gen_prime256v1 +dpp_config_dpp_gen_prime256v1_prime256v1 +dpp_config_dpp_gen_prime256v1_secp384r1 +dpp_config_dpp_gen_prime256v1_secp384r1_secp384r1 +dpp_config_dpp_gen_prime256v1_secp521r1 +dpp_config_dpp_gen_secp384r1 +dpp_config_dpp_gen_secp384r1_prime256v1 +dpp_config_dpp_gen_secp384r1_secp384r1 +dpp_config_dpp_gen_secp384r1_secp521r1 +dpp_config_dpp_gen_secp521r1 +dpp_config_dpp_gen_secp521r1_prime256v1 +dpp_config_dpp_gen_secp521r1_secp384r1 +dpp_config_dpp_gen_secp521r1_secp521r1 +dpp_config_dpp_override_prime256v1 +dpp_config_dpp_override_secp384r1 +dpp_config_dpp_override_secp521r1 +dpp_config_error_legacy_invalid_psk +dpp_config_error_legacy_no_pass +dpp_config_error_legacy_no_pass_for_sae +dpp_config_error_legacy_psk_with_sae +dpp_config_error_legacy_too_long_pass +dpp_config_error_legacy_too_short_pass +dpp_config_error_legacy_too_short_psk +dpp_config_fragmentation +dpp_config_jwk_error_invalid_x +dpp_config_jwk_error_invalid_xy +dpp_config_jwk_error_invalid_y +dpp_config_jwk_error_no_crv +dpp_config_jwk_error_no_kid +dpp_config_jwk_error_no_kty +dpp_config_jwk_error_no_x +dpp_config_jwk_error_no_y +dpp_config_jwk_error_unexpected_kty +dpp_config_jwk_error_unsupported_crv +dpp_config_jws_error_prot_hdr_no_alg +dpp_config_jws_error_prot_hdr_no_kid +dpp_config_jws_error_prot_hdr_not_an_object +dpp_config_jws_error_prot_hdr_no_typ +dpp_config_jws_error_prot_hdr_unexpected_alg +dpp_config_jws_error_prot_hdr_unexpected_kid +dpp_config_jws_error_prot_hdr_unsupported_typ +dpp_config_legacy +dpp_config_legacy_gen +dpp_config_legacy_gen_psk +dpp_config_legacy_gen_sta_ap_conf +dpp_config_legacy_gen_two_conf +dpp_config_legacy_gen_two_conf_psk +dpp_config_legacy_psk_hex +dpp_config_no_cred +dpp_config_no_cred_akm +dpp_config_no_csign +dpp_config_no_discovery +dpp_config_no_discovery_ssid +dpp_config_no_signed_connector +dpp_config_no_wi_fi_tech +dpp_config_override_objects +dpp_config_root_not_an_object +dpp_config_save +dpp_config_save2 +dpp_config_save3 +dpp_config_signed_connector_error_invalid_signature_der +dpp_config_signed_connector_error_no_dot_1 +dpp_config_signed_connector_error_no_dot_2 +dpp_config_signed_connector_error_unexpected_signature_len +dpp_config_too_long_discovery_ssid +dpp_config_unexpected_signed_connector_char +dpp_config_unsupported_cred_akm +dpp_config_unsupported_wi_fi_tech +dpp_configurator_enroll_conf +dpp_configurator_enrollee +dpp_configurator_enrollee_brainpoolP256r1 +dpp_configurator_enrollee_brainpoolP384r1 +dpp_configurator_enrollee_brainpoolP512r1 +dpp_configurator_enrollee_prime256v1 +dpp_configurator_enrollee_secp384r1 +dpp_configurator_enrollee_secp521r1 +dpp_configurator_id_unknown +dpp_conn_status_assoc_reject +dpp_conn_status_connector_mismatch +dpp_conn_status_no_ap +dpp_conn_status_success +dpp_conn_status_wrong_passphrase +dpp_controller_init_through_relay +dpp_controller_init_through_relay_add +dpp_controller_init_through_relay_dynamic +dpp_controller_relay +dpp_controller_relay_chirp +dpp_controller_relay_chirp_duplicate +dpp_controller_relay_discover +dpp_controller_relay_pkex +dpp_controller_rx_errors +dpp_controller_rx_failure +dpp_discard_public_action +dpp_duplicated_auth_conf +dpp_duplicated_auth_resp +dpp_enrollee_ap_reject_config +dpp_enrollee_reject_config +dpp_enterprise +dpp_enterprise_reject +dpp_enterprise_tcp +dpp_enterprise_tcp2 +dpp_gas +dpp_gas_comeback_after_failure +dpp_gas_timeout +dpp_gas_timeout_handling +dpp_hostapd_auth_conf_timeout +dpp_hostapd_auth_resp_retries +dpp_hostapd_configurator +dpp_hostapd_configurator_enrollee_v1 +dpp_hostapd_configurator_fragmentation +dpp_hostapd_configurator_override_objects +dpp_hostapd_configurator_responder +dpp_hostapd_enrollee_fragmentation +dpp_hostapd_enrollee_gas_errors +dpp_hostapd_enrollee_gas_proto +dpp_hostapd_enrollee_gas_timeout +dpp_hostapd_enrollee_gas_timeout_comeback +dpp_hostapd_enrollee_gas_tx_status_errors +dpp_intro_mismatch +dpp_invalid_configurator_key +dpp_invalid_legacy_params +dpp_invalid_legacy_params2 +dpp_keygen_configurator_error +dpp_nfc_negotiated_handover_diff_curve +dpp_nfc_negotiated_handover_hostapd_req +dpp_nfc_negotiated_handover_hostapd_sel +dpp_own_config +dpp_own_config_ap +dpp_own_config_ap_group_id +dpp_own_config_ap_reconf +dpp_own_config_curve_mismatch +dpp_own_config_group_id +dpp_own_config_sign_fail +dpp_peer_intro_failures +dpp_peer_intro_local_failures +dpp_pfs_ap_0 +dpp_pfs_ap_0_sta_ver1 +dpp_pfs_ap_2 +dpp_pfs_connect_cmd_ap_2 +dpp_pfs_connect_cmd_ap_2_sae +dpp_pkex +dpp_pkex_after_retry +dpp_pkex_alloc_fail +dpp_pkex_bp256 +dpp_pkex_bp384 +dpp_pkex_bp512 +dpp_pkex_code_mismatch +dpp_pkex_code_mismatch_limit +dpp_pkex_commit_reveal_req_processing_failure +dpp_pkex_config +dpp_pkex_config2 +dpp_pkex_curve_mismatch +dpp_pkex_curve_mismatch_failure +dpp_pkex_curve_mismatch_failure2 +dpp_pkex_exchange_resp_processing_failure +dpp_pkex_hostapd_errors +dpp_pkex_identifier_mismatch +dpp_pkex_identifier_mismatch2 +dpp_pkex_identifier_mismatch3 +dpp_pkex_nak_curve_change +dpp_pkex_nak_curve_change2 +dpp_pkex_no_identifier +dpp_pkex_no_responder +dpp_pkex_p256 +dpp_pkex_p384 +dpp_pkex_p521 +dpp_pkex_test_fail +dpp_pkex_test_vector +dpp_pkex_v2 +dpp_pkex_v2_hostapd_initiator +dpp_pkex_v2_hostapd_responder +dpp_proto_after_wrapped_data_auth_conf +dpp_proto_after_wrapped_data_auth_req +dpp_proto_after_wrapped_data_auth_resp +dpp_proto_after_wrapped_data_conf_req +dpp_proto_after_wrapped_data_conf_resp +dpp_proto_after_wrapped_data_pkex_cr_req +dpp_proto_after_wrapped_data_pkex_cr_resp +dpp_proto_auth_conf_i_auth_mismatch +dpp_proto_auth_conf_invalid_i_bootstrap_key +dpp_proto_auth_conf_invalid_r_bootstrap_key +dpp_proto_auth_conf_invalid_status +dpp_proto_auth_conf_no_i_auth +dpp_proto_auth_conf_no_i_bootstrap_key +dpp_proto_auth_conf_no_r_bootstrap_key +dpp_proto_auth_conf_no_status +dpp_proto_auth_conf_no_wrapped_data +dpp_proto_auth_conf_replaced_by_resp +dpp_proto_auth_req_invalid_i_bootstrap_key +dpp_proto_auth_req_invalid_i_nonce +dpp_proto_auth_req_invalid_i_proto_key +dpp_proto_auth_req_invalid_r_bootstrap_key +dpp_proto_auth_req_no_i_bootstrap_key +dpp_proto_auth_req_no_i_capab +dpp_proto_auth_req_no_i_nonce +dpp_proto_auth_req_no_i_proto_key +dpp_proto_auth_req_no_r_bootstrap_key +dpp_proto_auth_req_no_wrapped_data +dpp_proto_auth_resp_incompatible_r_capab +dpp_proto_auth_resp_i_nonce_mismatch +dpp_proto_auth_resp_invalid_i_bootstrap_key +dpp_proto_auth_resp_invalid_r_bootstrap_key +dpp_proto_auth_resp_invalid_r_proto_key +dpp_proto_auth_resp_invalid_status +dpp_proto_auth_resp_no_i_bootstrap_key +dpp_proto_auth_resp_no_i_nonce +dpp_proto_auth_resp_no_r_auth +dpp_proto_auth_resp_no_r_bootstrap_key +dpp_proto_auth_resp_no_r_capab +dpp_proto_auth_resp_no_r_nonce +dpp_proto_auth_resp_no_r_proto_key +dpp_proto_auth_resp_no_status +dpp_proto_auth_resp_no_wrapped_data +dpp_proto_auth_resp_r_auth_mismatch +dpp_proto_auth_resp_r_auth_mismatch_failure +dpp_proto_auth_resp_r_auth_mismatch_failure2 +dpp_proto_auth_resp_status_invalid_i_bootstrap_key +dpp_proto_auth_resp_status_invalid_r_bootstrap_key +dpp_proto_auth_resp_status_no_i_bootstrap_key +dpp_proto_auth_resp_status_no_i_nonce +dpp_proto_auth_resp_status_no_r_bootstrap_key +dpp_proto_auth_resp_status_no_status +dpp_proto_conf_req_invalid_config_attr_obj +dpp_proto_conf_req_invalid_e_nonce +dpp_proto_conf_req_no_config_attr_obj +dpp_proto_conf_req_no_e_nonce +dpp_proto_conf_req_no_wrapped_data +dpp_proto_conf_resp_e_nonce_mismatch +dpp_proto_conf_resp_invalid_status +dpp_proto_conf_resp_no_config_obj +dpp_proto_conf_resp_no_e_nonce +dpp_proto_conf_resp_no_status +dpp_proto_conf_resp_no_wrapped_data +dpp_proto_network_introduction +dpp_proto_pkex_cr_req_i_auth_tag_mismatch +dpp_proto_pkex_cr_req_invalid_bootstrap_key +dpp_proto_pkex_cr_req_no_bootstrap_key +dpp_proto_pkex_cr_req_no_i_auth_tag +dpp_proto_pkex_cr_req_no_wrapped_data +dpp_proto_pkex_cr_resp_invalid_bootstrap_key +dpp_proto_pkex_cr_resp_no_bootstrap_key +dpp_proto_pkex_cr_resp_no_r_auth_tag +dpp_proto_pkex_cr_resp_no_wrapped_data +dpp_proto_pkex_cr_resp_r_auth_tag_mismatch +dpp_proto_pkex_exchange_req_invalid_encrypted_key +dpp_proto_pkex_exchange_req_no_encrypted_key +dpp_proto_pkex_exchange_req_no_finite_cyclic_group +dpp_proto_pkex_exchange_resp_invalid_encrypted_key +dpp_proto_pkex_exchange_resp_invalid_status +dpp_proto_pkex_exchange_resp_no_encrypted_key +dpp_proto_pkex_exchange_resp_no_status +dpp_proto_stop_at_auth_conf +dpp_proto_stop_at_auth_conf_tx +dpp_proto_stop_at_auth_conf_tx2 +dpp_proto_stop_at_auth_req +dpp_proto_stop_at_auth_resp +dpp_proto_stop_at_conf_req +dpp_proto_stop_at_pkex_cr_req +dpp_proto_stop_at_pkex_cr_resp +dpp_proto_stop_at_pkex_exchange_resp +dpp_proto_zero_i_capab +dpp_proto_zero_r_capab +dpp_qr_code_auth_broadcast +dpp_qr_code_auth_enrollee_init_netrole +dpp_qr_code_auth_hostapd_mutual2 +dpp_qr_code_auth_incompatible_roles +dpp_qr_code_auth_incompatible_roles2 +dpp_qr_code_auth_incompatible_roles_failure +dpp_qr_code_auth_incompatible_roles_failure2 +dpp_qr_code_auth_incompatible_roles_failure3 +dpp_qr_code_auth_initiator_either_1 +dpp_qr_code_auth_initiator_either_2 +dpp_qr_code_auth_initiator_either_3 +dpp_qr_code_auth_initiator_enrollee +dpp_qr_code_auth_mutual +dpp_qr_code_auth_mutual2 +dpp_qr_code_auth_mutual_bp_256 +dpp_qr_code_auth_mutual_bp_384 +dpp_qr_code_auth_mutual_bp_512 +dpp_qr_code_auth_mutual_curve_mismatch +dpp_qr_code_auth_mutual_not_used +dpp_qr_code_auth_mutual_p_256 +dpp_qr_code_auth_mutual_p_384 +dpp_qr_code_auth_mutual_p_521 +dpp_qr_code_auth_neg_chan +dpp_qr_code_auth_rand_mac_addr +dpp_qr_code_auth_responder_configurator +dpp_qr_code_auth_responder_configurator_group_id +dpp_qr_code_auth_unicast +dpp_qr_code_auth_unicast_ap_enrollee +dpp_qr_code_chan_list_no_match +dpp_qr_code_chan_list_no_peer_unicast +dpp_qr_code_chan_list_unicast +dpp_qr_code_chan_list_unicast2 +dpp_qr_code_config_event_initiator_both +dpp_qr_code_config_event_initiator_failure +dpp_qr_code_config_event_initiator_no_response +dpp_qr_code_config_event_initiator_slow +dpp_qr_code_curve_brainpoolP256r1 +dpp_qr_code_curve_brainpoolP384r1 +dpp_qr_code_curve_brainpoolP512r1 +dpp_qr_code_curve_prime256v1 +dpp_qr_code_curves +dpp_qr_code_curves_brainpool +dpp_qr_code_curve_secp384r1 +dpp_qr_code_curve_secp521r1 +dpp_qr_code_curve_select +dpp_qr_code_hostapd_ignore_mismatch +dpp_qr_code_hostapd_init +dpp_qr_code_hostapd_init_offchannel +dpp_qr_code_hostapd_init_offchannel_configurator +dpp_qr_code_hostapd_init_offchannel_neg_freq +dpp_qr_code_keygen_fail +dpp_qr_code_listen_continue +dpp_qr_code_no_chan_list_broadcast +dpp_qr_code_no_chan_list_unicast +dpp_qr_code_parsing +dpp_qr_code_parsing_fail +dpp_qr_code_set_key +dpp_qr_code_unsupported_curve +dpp_reconfig_connector +dpp_reconfig_connector_different_groups +dpp_reconfig_hostapd_configurator +dpp_relay_incomplete_connections +dpp_tcp +dpp_tcp_conf_init +dpp_tcp_conf_init_hostapd_enrollee +dpp_tcp_controller_management_hostapd +dpp_tcp_controller_management_hostapd2 +dpp_tcp_controller_start_failure +dpp_tcp_init_failure +dpp_tcp_mutual +dpp_tcp_mutual_hostapd_conf +dpp_tcp_pkex +dpp_tcp_pkex_auto_connect_2 +dpp_tcp_pkex_auto_connect_2_status +dpp_tcp_pkex_auto_connect_2_status_fail +dpp_tcp_pkex_while_associated +dpp_tcp_pkex_while_associated_conn_status +dpp_tcp_port +dpp_tcp_qr_code_config_event_initiator +dpp_test_vector_p_256 +dpp_test_vector_p_256_b +dpp_test_vector_p_521 +dpp_truncated_attr +dpp_two_initiators +dpp_uri_host +dpp_uri_supported_curves +dpp_uri_version +dpp_with_p2p_device +eap_canned_failure_before_method +eap_canned_success_after_identity +eap_canned_success_before_method +eap_fast_proto +eap_fast_proto_phase2 +eap_fast_tlv_nak_oom +eap_gpsk_errors +eap_mschapv2_errors +eap_nak_expanded +eap_nak_oom +eap_proto +eap_proto_aka +eap_proto_aka_errors +eap_proto_aka_prime +eap_proto_aka_prime_errors +eap_proto_eke +eap_proto_eke_errors +eap_proto_erp +eap_proto_expanded +eap_proto_fast_errors +eap_proto_gpsk +eap_proto_gpsk_errors_server +eap_proto_gpsk_server +eap_proto_ikev2 +eap_proto_ikev2_errors +eap_proto_ikev2_errors_server +eap_proto_ikev2_server +eap_proto_leap +eap_proto_leap_errors +eap_proto_md5 +eap_proto_md5_errors +eap_proto_md5_errors_server +eap_proto_md5_server +eap_proto_mschapv2 +eap_proto_mschapv2_errors +eap_proto_notification_errors +eap_proto_otp +eap_proto_otp_errors +eap_proto_pax +eap_proto_pax_errors +eap_proto_pax_errors_server +eap_proto_pax_server +eap_proto_psk +eap_proto_psk_errors +eap_proto_psk_errors_server +eap_proto_psk_server +eap_proto_pwd +eap_proto_pwd_errors +eap_proto_pwd_errors_server +eap_proto_pwd_invalid_element +eap_proto_pwd_invalid_element_peer +eap_proto_pwd_invalid_scalar +eap_proto_pwd_invalid_scalar_peer +eap_proto_pwd_reflection_attack +eap_proto_pwd_server +eap_proto_pwd_unexpected_fragment +eap_proto_sake +eap_proto_sake_errors +eap_proto_sake_errors2 +eap_proto_sake_errors_server +eap_proto_sake_server +eap_proto_sim +eap_proto_sim_errors +eap_proto_tls +eap_proto_tnc +eap_proto_wsc +eap_teap_basic_password_auth_failure +eap_teap_basic_password_auth_id2 +eap_teap_basic_password_auth_no_password +eap_teap_basic_password_auth_user_and_machine_fail_machine +eap_teap_basic_password_auth_user_and_machine_fail_user +eap_teap_basic_password_auth_user_and_machine_no_machine +eap_teap_eap_eke_unauth_server_prov +eap_teap_eap_mschapv2_id2 +eap_teap_eap_mschapv2_pac_no_ca_cert +eap_teap_eap_mschapv2_user_and_machine_fail_machine +eap_teap_eap_mschapv2_user_and_machine_fail_user +eap_teap_eap_mschapv2_user_and_machine_no_machine +eap_teap_tls_cs_sha1 +eap_teap_tls_cs_sha256 +eap_teap_tls_cs_sha384 +eap_tls_sha384 +eap_tls_sha512 +ext_password_file_psk +ext_password_interworking +ext_password_psk +ext_password_psk_not_found +ext_password_sae +ext_radio_work +ext_radio_work_disconnect_connect +fils_sk_pfs_25 +gas_anqp_address3_ap_non_compliant +gas_anqp_capab_list +gas_anqp_extra_elements +gas_anqp_get +gas_anqp_get_no_scan +gas_anqp_get_oom +gas_anqp_hs20_proto +gas_anqp_icon_binary_proto +gas_anqp_oom_hapd +gas_anqp_oom_wpas +gas_anqp_overrides +gas_anqp_venue_url +gas_anqp_venue_url2 +gas_anqp_venue_url_pmf +gas_comeback_delay +gas_comeback_delay_long +gas_comeback_delay_long2 +gas_comeback_resp_additional_delay +gas_concurrent_scan +gas_delete_at_deinit +gas_failures +gas_failure_status_code +gas_fragment +gas_fragment_mcc +gas_fragment_with_comeback_delay +gas_fragment_with_comeback_delay_mcc +gas_generic +gas_invalid_response_type +gas_malformed +gas_malformed_comeback_resp +gas_max_pending +gas_missing_payload +gas_no_dialog_token_match +gas_no_pending +gas_query_deinit +gas_rand_ta +gas_request_oom +gas_server_oom +hostapd_oom_open +hostapd_oom_wpa2_eap_radius +hostapd_oom_wpa2_psk +ieee8021x_auth_awhile +ieee8021x_eapol_key +ieee8021x_eapol_start +ieee8021x_force_unauth +ieee8021x_held +ieee8021x_open +ieee8021x_open_leap +ieee8021x_proto +ieee8021x_reauth +ieee8021x_set_conf +ieee8021x_wep104 +ieee8021x_wep_index_workaround +macsec_gcm_aes_256 +macsec_hostapd_eap +macsec_hostapd_eap_psk +macsec_hostapd_psk +macsec_psk +macsec_psk_256 +macsec_psk_br2 +macsec_psk_br2_same_prio +macsec_psk_br3 +macsec_psk_br3_same_prio +macsec_psk_cak_mismatch +macsec_psk_ckn_mismatch +macsec_psk_different_ports +macsec_psk_fail_cp +macsec_psk_fail_cp2 +macsec_psk_integ_only +macsec_psk_mka_life_time +macsec_psk_ns +macsec_psk_port +macsec_psk_shorter_ckn +macsec_psk_shorter_ckn2 +module_hostapd +module_wpa_supplicant +monitor_iface_wpa2_psk +multi_ap_backhaul_shared_bss +multi_ap_disabled_on_ap +multi_ap_fronthaul_on_ap +multi_ap_wps_fail_non_multi_ap +multi_ap_wps_shared_psk +multi_ap_wps_split_psk +nfc_p2p_both_go +nfc_p2p_go_neg_reverse +nfc_p2p_static_handover_invalid +nfc_p2p_tag_enable_disable +nfc_wps_handover_errors +nfc_wps_handover_failure +nfc_wps_handover_pk_hash_mismatch_ap +nfc_wps_handover_pk_hash_mismatch_sta +openssl_ecdh_curves +owe_assoc_reject +owe_double_assoc +owe_group_negotiation +owe_group_negotiation_connect_cmd +owe_invalid_assoc_resp +owe_local_errors +owe_only_sta +owe_only_sta_tm_ap +owe_ptk_hash +owe_ptk_workaround_ap +owe_sa_query +owe_transition_mode_disable +owe_transition_mode_ifname +owe_transition_mode_ifname_acs +owe_transition_mode_ifname_acs2 +owe_transition_mode_multi_assoc +owe_transition_mode_open_multiple_scans +owe_transition_mode_rsne_mismatch +owe_unsupported_group +owe_unsupported_group_connect_cmd +pasn_ap_mic_error +pasn_ccmp +pasn_ccmp_256 +pasn_channel_mismatch +pasn_comeback +pasn_comeback_after_0 +pasn_comeback_after_0_sae +pasn_comeback_multi +pasn_fils_sha256 +pasn_fils_sha384 +pasn_ft_psk +pasn_gcmp +pasn_gcmp_256 +pasn_group_mismatch +pasn_kdk_derivation +pasn_noauth_0 +pasn_owe_kdk_secure_ltf +pasn_owe_tm_kdk_secure_ltf +pasn_sae +pasn_sae_driver +pasn_sae_kdk +pasn_sae_kdk_ft +pasn_sae_kdk_secure_ltf +pasn_sae_while_connected_diff_channel +pasn_sae_while_connected_same_channel +pasn_sta_mic_error +pasn_while_connected_diff_channel +pasn_while_connected_same_ap +pasn_while_connected_same_channel +radius_acct +radius_acct_failure +radius_acct_failure_oom +radius_acct_failure_oom_rsn +radius_acct_failure_sta_data +radius_acct_ft_psk +radius_acct_ieee8021x +radius_acct_interim +radius_acct_interim_unreachable +radius_acct_interim_unreachable2 +radius_acct_ipaddr +radius_acct_non_ascii_ssid +radius_acct_pmksa_caching +radius_acct_psk +radius_acct_psk_sha256 +radius_acct_unreachable +radius_acct_unreachable2 +radius_acct_unreachable3 +radius_acct_unreachable4 +radius_auth_force_client_addr +radius_auth_force_client_dev +radius_auth_force_invalid_client_addr +radius_auth_unreachable +radius_auth_unreachable2 +radius_auth_unreachable3 +radius_das_coa +radius_das_disconnect +radius_das_disconnect_time_window +radius_ipv6 +radius_macacl +radius_macacl_acct +radius_macacl_oom +radius_macacl_unreachable +radius_protocol +radius_psk +radius_psk_default +radius_psk_during_4way_hs +radius_psk_hex_psk +radius_psk_invalid +radius_psk_invalid2 +radius_psk_oom +radius_psk_reject +radius_psk_reject_during_4way_hs +radius_psk_unknown_code +radius_req_attr +radius_sae_password +radius_server_failures +radius_tls_freeradius +sae +sae_akms +sae_and_psk +sae_and_psk2 +sae_and_psk_multiple_passwords +sae_and_psk_transition_disable +sae_auth_restart +sae_bignum_failure +sae_bignum_failure_unsafe_group +sae_commit_invalid_element_ap +sae_commit_invalid_element_sta +sae_commit_invalid_scalar_element_ap +sae_commit_invalid_scalar_element_sta +sae_commit_override +sae_commit_override2 +sae_confirm_immediate +sae_confirm_immediate2 +sae_connect_cmd +sae_ext_key_19 +sae_ext_key_19_gcmp256 +sae_ext_key_20 +sae_ext_key_20_gcmp256 +sae_ext_key_21 +sae_ext_key_21_gcmp256 +sae_ext_key_21_gcmp256_gcmp256 +sae_ext_key_h2e_rejected_group +sae_ext_key_h2e_rejected_group2 +sae_forced_anti_clogging +sae_forced_anti_clogging_h2e +sae_forced_anti_clogging_h2e_loop +sae_forced_anti_clogging_pw_id +sae_group_nego +sae_group_nego_no_match +sae_groups +sae_h2e_password_id +sae_h2e_rejected_groups +sae_h2e_rejected_groups_unexpected +sae_h2e_rsnxe_mismatch +sae_h2e_rsnxe_mismatch_ap +sae_h2e_rsnxe_mismatch_ap2 +sae_h2e_rsnxe_mismatch_ap3 +sae_h2e_rsnxe_mismatch_assoc +sae_h2e_rsnxe_mismatch_retries +sae_invalid_anti_clogging_token_req +sae_key_lifetime_in_memory +sae_mfp +sae_missing_password +sae_mixed +sae_mixed_check_mfp +sae_mixed_mfp +sae_no_ffc_by_default +sae_no_random +sae_ocv_pmk +sae_ocv_pmk_failure +sae_okc +sae_okc_pmk_lifetime +sae_okc_sta_only +sae_oom_wpas +sae_password +sae_password_ecc +sae_password_ffc +sae_password_file +sae_password_id +sae_password_id_ecc +sae_password_id_ffc +sae_password_id_only +sae_password_id_pwe_check_ap +sae_password_id_pwe_check_sta +sae_password_id_pwe_looping +sae_password_long +sae_password_short +sae_pk +sae_pk_and_psk +sae_pk_and_psk_invalid_password +sae_pk_confirm_immediate +sae_pk_group_19_sae_group_20 +sae_pk_group_20 +sae_pk_group_20_sae_group_19 +sae_pk_group_20_sae_group_21 +sae_pk_group_21 +sae_pk_group_negotiation +sae_pk_invalid_fingerprint +sae_pk_invalid_pw +sae_pk_invalid_signature +sae_pk_missing_ie +sae_pk_mixed +sae_pk_mixed_immediate_confirm +sae_pk_modes +sae_pk_not_on_ap +sae_pk_only +sae_pk_password_without_pk +sae_pk_sec_3 +sae_pk_sec_5 +sae_pk_transition_disable +sae_pk_unexpected_status +sae_pmf_roam +sae_pmk_lifetime +sae_pmksa_caching +sae_pmksa_caching_disabled +sae_pmksa_caching_pmkid +sae_pref_ap_wrong_password +sae_pref_ap_wrong_password2 +sae_proto_commit_delayed +sae_proto_commit_replay +sae_proto_confirm_replay +sae_proto_ecc +sae_proto_ffc +sae_proto_hostapd +sae_proto_hostapd_ecc +sae_proto_hostapd_ffc +sae_proto_hostapd_status_126 +sae_proto_hostapd_status_127 +sae_pwe_failure +sae_pwe_group_1 +sae_pwe_group_14 +sae_pwe_group_15 +sae_pwe_group_16 +sae_pwe_group_19 +sae_pwe_group_2 +sae_pwe_group_20 +sae_pwe_group_21 +sae_pwe_group_22 +sae_pwe_group_23 +sae_pwe_group_24 +sae_pwe_group_25 +sae_pwe_group_28 +sae_pwe_group_29 +sae_pwe_group_30 +sae_pwe_group_5 +sae_pwe_h2e_only_ap +sae_pwe_h2e_only_ap_sta_forcing_loop +sae_pwe_in_psk_ap +sae_pwe_loop_only_ap +sae_reauth +sae_reflection_attack_ecc +sae_reflection_attack_ecc_internal +sae_reflection_attack_ffc +sae_reflection_attack_ffc_internal +sae_reject +sae_rsne_mismatch +sae_sync +sae_wpa3_roam +sigma_dut_ap_beacon_prot +sigma_dut_ap_cipher_ccmp_128 +sigma_dut_ap_cipher_ccmp_256 +sigma_dut_ap_cipher_ccmp_gcmp_1 +sigma_dut_ap_cipher_ccmp_gcmp_2 +sigma_dut_ap_cipher_gcmp_128 +sigma_dut_ap_cipher_gcmp_256 +sigma_dut_ap_cipher_gcmp_256_group_ccmp +sigma_dut_ap_dpp_init_mud_url +sigma_dut_ap_dpp_offchannel +sigma_dut_ap_dpp_pkex_responder +sigma_dut_ap_dpp_pkex_responder_tcp +sigma_dut_ap_dpp_pkex_v1_responder +sigma_dut_ap_dpp_qr +sigma_dut_ap_dpp_qr_dpp_sae +sigma_dut_ap_dpp_qr_dpp_sae2 +sigma_dut_ap_dpp_qr_enrollee_chirp +sigma_dut_ap_dpp_qr_legacy +sigma_dut_ap_dpp_qr_legacy_psk +sigma_dut_ap_dpp_qr_mud_url +sigma_dut_ap_dpp_qr_sae +sigma_dut_ap_dpp_relay +sigma_dut_ap_dpp_self_config +sigma_dut_ap_dpp_self_config_connector_privacy +sigma_dut_ap_dpp_tcp_enrollee_init +sigma_dut_ap_eap +sigma_dut_ap_eap_sha256 +sigma_dut_ap_ent_ft_eap +sigma_dut_ap_ft_eap +sigma_dut_ap_ft_over_ds_psk +sigma_dut_ap_ft_psk +sigma_dut_ap_ft_rsnxe_used_mismatch +sigma_dut_ap_gtk_rekey +sigma_dut_ap_hs20 +sigma_dut_ap_ht40minus +sigma_dut_ap_ht40plus +sigma_dut_ap_ocv +sigma_dut_ap_override_rsne +sigma_dut_ap_owe +sigma_dut_ap_owe_ecgroupid +sigma_dut_ap_owe_ptk_workaround +sigma_dut_ap_owe_transition_mode +sigma_dut_ap_owe_transition_mode_2 +sigma_dut_ap_psk +sigma_dut_ap_psk_deauth +sigma_dut_ap_pskhex +sigma_dut_ap_psk_sae +sigma_dut_ap_psk_sae_ft +sigma_dut_ap_psk_sha256 +sigma_dut_ap_sae +sigma_dut_ap_sae_confirm_immediate +sigma_dut_ap_sae_group +sigma_dut_ap_sae_h2e +sigma_dut_ap_sae_h2e_anti_clogging +sigma_dut_ap_sae_h2e_group_rejection +sigma_dut_ap_sae_h2e_only +sigma_dut_ap_sae_h2e_rsnxe_mismatch +sigma_dut_ap_sae_loop_only +sigma_dut_ap_sae_password +sigma_dut_ap_sae_pk +sigma_dut_ap_sae_pk_misbehavior +sigma_dut_ap_sae_pk_mixed +sigma_dut_ap_sae_pw_id +sigma_dut_ap_sae_pw_id_ft +sigma_dut_ap_sae_pw_id_pwe_loop +sigma_dut_ap_suite_b +sigma_dut_ap_transition_disable +sigma_dut_ap_transition_disable_change +sigma_dut_ap_vht40 +sigma_dut_ap_vht80 +sigma_dut_basic +sigma_dut_beacon_prot +sigma_dut_dpp_curves_list +sigma_dut_dpp_enrollee_does_not_support_nak_curve +sigma_dut_dpp_enrollee_does_not_support_signing_curve +sigma_dut_dpp_incompatible_roles_init +sigma_dut_dpp_incompatible_roles_resp +sigma_dut_dpp_nfc_handover_requestor_enrollee +sigma_dut_dpp_nfc_handover_selector_enrollee +sigma_dut_dpp_nfc_static_read_enrollee +sigma_dut_dpp_nfc_static_write_enrollee +sigma_dut_dpp_pb_ap +sigma_dut_dpp_pb_ap2 +sigma_dut_dpp_pb_ap_misbehavior +sigma_dut_dpp_pb_configurator +sigma_dut_dpp_pb_configurator_session_overlap +sigma_dut_dpp_pb_sta +sigma_dut_dpp_pb_sta_first +sigma_dut_dpp_pb_sta_misbehavior +sigma_dut_dpp_pb_sta_session_overlap +sigma_dut_dpp_pkex_init_configurator +sigma_dut_dpp_pkex_init_configurator_tcp +sigma_dut_dpp_pkex_init_configurator_tcp_and_wifi +sigma_dut_dpp_pkex_init_configurator_tcp_through_relay +sigma_dut_dpp_pkex_responder_proto +sigma_dut_dpp_pkex_v1_only +sigma_dut_dpp_pkexv2_init_fallback_to_v1 +sigma_dut_dpp_proto_initiator +sigma_dut_dpp_proto_initiator_pkex +sigma_dut_dpp_proto_peer_disc_req +sigma_dut_dpp_proto_peer_disc_req2 +sigma_dut_dpp_proto_peer_disc_req3 +sigma_dut_dpp_proto_responder +sigma_dut_dpp_proto_responder_pkex +sigma_dut_dpp_proto_stop_at_initiator +sigma_dut_dpp_proto_stop_at_initiator_enrollee +sigma_dut_dpp_proto_stop_at_responder +sigma_dut_dpp_qr_configurator_chirp +sigma_dut_dpp_qr_enrollee_chirp +sigma_dut_dpp_qr_enrollee_chirp_3rd_party_info +sigma_dut_dpp_qr_init_configurator_1 +sigma_dut_dpp_qr_init_configurator_2 +sigma_dut_dpp_qr_init_configurator_3 +sigma_dut_dpp_qr_init_configurator_3rd_party +sigma_dut_dpp_qr_init_configurator_3rd_party_psk +sigma_dut_dpp_qr_init_configurator_4 +sigma_dut_dpp_qr_init_configurator_5 +sigma_dut_dpp_qr_init_configurator_6 +sigma_dut_dpp_qr_init_configurator_7 +sigma_dut_dpp_qr_init_configurator_both +sigma_dut_dpp_qr_init_configurator_mud_url +sigma_dut_dpp_qr_init_configurator_mud_url_nak_change +sigma_dut_dpp_qr_init_configurator_nak_from_uri +sigma_dut_dpp_qr_init_configurator_neg_freq +sigma_dut_dpp_qr_init_configurator_sign_curve_from_uri +sigma_dut_dpp_qr_init_enrollee +sigma_dut_dpp_qr_init_enrollee_configurator +sigma_dut_dpp_qr_init_enrollee_psk +sigma_dut_dpp_qr_init_enrollee_sae +sigma_dut_dpp_qr_mutual_init_enrollee +sigma_dut_dpp_qr_mutual_init_enrollee_check +sigma_dut_dpp_qr_mutual_init_enrollee_mud_url +sigma_dut_dpp_qr_mutual_init_enrollee_pending +sigma_dut_dpp_qr_mutual_resp_configurator +sigma_dut_dpp_qr_mutual_resp_enrollee +sigma_dut_dpp_qr_mutual_resp_enrollee_connector_privacy +sigma_dut_dpp_qr_mutual_resp_enrollee_pending +sigma_dut_dpp_qr_resp_1 +sigma_dut_dpp_qr_resp_10 +sigma_dut_dpp_qr_resp_11 +sigma_dut_dpp_qr_resp_2 +sigma_dut_dpp_qr_resp_3 +sigma_dut_dpp_qr_resp_4 +sigma_dut_dpp_qr_resp_5 +sigma_dut_dpp_qr_resp_6 +sigma_dut_dpp_qr_resp_7 +sigma_dut_dpp_qr_resp_8 +sigma_dut_dpp_qr_resp_9 +sigma_dut_dpp_qr_resp_chan_list +sigma_dut_dpp_qr_resp_configurator +sigma_dut_dpp_qr_resp_curve_change +sigma_dut_dpp_qr_resp_status_query +sigma_dut_dpp_reconfig_configurator +sigma_dut_dpp_reconfig_enrollee +sigma_dut_dpp_reconfig_enrollee_sae +sigma_dut_dpp_reconfig_invalid_proto_ver +sigma_dut_dpp_reconfig_no_proto_ver +sigma_dut_dpp_self_config +sigma_dut_dpp_tcp_configurator_init_from_uri +sigma_dut_dpp_tcp_configurator_init_mutual +sigma_dut_dpp_tcp_configurator_init_mutual_unsupported_curve +sigma_dut_dpp_tcp_conf_resp +sigma_dut_dpp_tcp_enrollee_init +sigma_dut_dpp_tcp_enrollee_init_mutual +sigma_dut_dpp_tcp_enrollee_resp +sigma_dut_eap_aka +sigma_dut_eap_ttls +sigma_dut_eap_ttls_uosc +sigma_dut_eap_ttls_uosc_ca_mistrust +sigma_dut_eap_ttls_uosc_initial_tod_strict +sigma_dut_eap_ttls_uosc_initial_tod_tofu +sigma_dut_eap_ttls_uosc_tod +sigma_dut_eap_ttls_uosc_tod_tofu +sigma_dut_ft_rsnxe_used_mismatch +sigma_dut_gtk_rekey +sigma_dut_ocv +sigma_dut_open +sigma_dut_owe +sigma_dut_owe_ptk_workaround +sigma_dut_preconfigured_profile +sigma_dut_psk_pmf +sigma_dut_psk_pmf_bip_cmac_128 +sigma_dut_psk_pmf_bip_cmac_256 +sigma_dut_psk_pmf_bip_gmac_128 +sigma_dut_psk_pmf_bip_gmac_256 +sigma_dut_psk_pmf_bip_gmac_256_mismatch +sigma_dut_sae +sigma_dut_sae_groups +sigma_dut_sae_h2e +sigma_dut_sae_h2e_ap_h2e +sigma_dut_sae_h2e_ap_loop +sigma_dut_sae_h2e_enabled_group_rejected +sigma_dut_sae_h2e_loop_forcing +sigma_dut_sae_h2e_rsnxe_mismatch +sigma_dut_sae_password +sigma_dut_sae_pk +sigma_dut_sae_pmkid_include +sigma_dut_sae_pw_id +sigma_dut_sae_pw_id_ft +sigma_dut_sae_pw_id_ft_over_ds +sigma_dut_sae_pw_id_pwe_loop +sigma_dut_sta_override_rsne +sigma_dut_sta_scan_bss +sigma_dut_sta_scan_short_ssid +sigma_dut_sta_scan_ssid_bssid +sigma_dut_sta_scan_wait_completion +sigma_dut_suite_b +sigma_dut_venue_url +sigma_dut_wpa3_inject_frame +sigma_dut_wps_pbc +suite_b +suite_b_192 +suite_b_192_mic_failure +suite_b_192_okc +suite_b_192_pmkid_failure +suite_b_192_pmksa_caching_roam +suite_b_192_radius +suite_b_192_rsa +suite_b_192_rsa_dhe +suite_b_192_rsa_dhe_radius_rsa2048_client +suite_b_192_rsa_ecdhe +suite_b_192_rsa_ecdhe_radius_rsa2048_client +suite_b_192_rsa_insufficient_dh +suite_b_192_rsa_insufficient_key +suite_b_192_rsa_no_cs_match +suite_b_192_rsa_radius +suite_b_192_rsa_tls_13 +suite_b_mic_failure +suite_b_pmkid_failure +suite_b_radius +wep_shared_key_auth_not_allowed +wext_wep_open_auth +wext_wep_shared_key_auth +wext_wpa2_psk +wext_wpa_psk +wpa2_psk_key_lifetime_in_memory +wpas_add_set_remove_support +wpas_ap_acs +wpas_ap_and_assoc_req_p2p_ie +wpas_ap_default_frequency +wpas_ap_disable +wpas_ap_failures +wpas_ap_global_sta +wpas_ap_invalid_frequency +wpas_ap_lifetime_in_memory +wpas_ap_lifetime_in_memory2 +wpas_ap_no_ht +wpas_ap_no_ssid +wpas_ap_params +wpas_ap_sae +wpas_ap_sae_and_psk_transition_disable +wpas_ap_sae_password +wpas_ap_sae_pmf1 +wpas_ap_sae_pmf2 +wpas_ap_sae_pwe_1 +wpas_ap_scan +wpas_ap_vendor_elems +wpas_ap_wps_disabled +wpas_ap_wps_frag +wpas_ap_wps_pbc_overlap +wpas_mesh_secure +wpas_mesh_secure_dropped_frame +wpas_mesh_secure_no_auto +wpas_mesh_secure_sae_group_mismatch +wpas_mesh_secure_sae_group_negotiation +wpas_mesh_secure_sae_missing_password +wpas_mesh_secure_sae_password diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/wpa_supplicant.config mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/wpa_supplicant.config --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/wpa_supplicant.config 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/07c9f183ea744ac04585fb6dd10220c75a5e2e74/wpa_supplicant.config 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,164 @@ +#CC=ccache gcc + +#CONFIG_TLS=openssl +CONFIG_TLS=wolfssl +#CONFIG_TLS=internal +#CONFIG_INTERNAL_LIBTOMMATH=y +#CONFIG_INTERNAL_LIBTOMMATH_FAST=y + +CONFIG_IEEE8021X_EAPOL=y + +CONFIG_ERP=y +CONFIG_EAP_MD5=y +CONFIG_MSCHAPV2=y +CONFIG_EAP_TLS=y +CONFIG_EAP_PEAP=y +CONFIG_EAP_TTLS=y +CONFIG_EAP_GTC=y +CONFIG_EAP_OTP=y +CONFIG_EAP_PSK=y +CONFIG_EAP_PAX=y +CONFIG_EAP_LEAP=y +CONFIG_EAP_SIM=y +CONFIG_EAP_AKA=y +CONFIG_EAP_AKA_PRIME=y +CONFIG_EAP_VENDOR_TEST=y +CONFIG_EAP_TLV=y +CONFIG_EAP_SAKE=y +CONFIG_EAP_GPSK=y +CONFIG_EAP_GPSK_SHA256=y +CONFIG_EAP_EKE=y +CONFIG_EAP_TNC=y +CFLAGS += -DTNC_CONFIG_FILE=\"tnc/tnc_config\" +LIBS += -rdynamic +CONFIG_EAP_FAST=y +CONFIG_EAP_TEAP=y +CONFIG_EAP_IKEV2=y + +ifeq ($(CONFIG_TLS), openssl) +CONFIG_EAP_PWD=y +endif +ifeq ($(CONFIG_TLS), wolfssl) +CONFIG_EAP_PWD=y +endif + +CONFIG_USIM_SIMULATOR=y +CONFIG_SIM_SIMULATOR=y + +#CONFIG_PCSC=y +CONFIG_IPV6=y +CONFIG_DRIVER_NONE=y +CONFIG_PKCS12=y +CONFIG_CTRL_IFACE=unix + +CONFIG_WPA_CLI_EDIT=y + +CONFIG_OCSP=y + +#CONFIG_ELOOP_POLL=y + +CONFIG_CTRL_IFACE_DBUS_NEW=y +CONFIG_CTRL_IFACE_DBUS_INTRO=y + +CONFIG_IEEE80211R=y +CONFIG_IEEE80211AC=y +CONFIG_IEEE80211AX=y + +CONFIG_OCV=y + +CONFIG_DEBUG_FILE=y + +CONFIG_WPS=y +#CONFIG_WPS_STRICT=y +CONFIG_WPS_UPNP=y +CONFIG_WPS_NFC=y +CONFIG_WPS_ER=y +#CONFIG_WPS_REG_DISABLE_OPEN=y + +CONFIG_DRIVER_WEXT=y + +CONFIG_DRIVER_NL80211=y +CFLAGS += -I/usr/include/libnl3 +CONFIG_LIBNL32=y + +CONFIG_IBSS_RSN=y + +CONFIG_AP=y +CONFIG_MESH=y +CONFIG_P2P=y +CONFIG_WIFI_DISPLAY=y + +CONFIG_ACS=y + +CONFIG_BGSCAN_SIMPLE=y +CONFIG_BGSCAN_LEARN=y + +CONFIG_WPA_TRACE=y +CONFIG_WPA_TRACE_BFD=y + +CONFIG_TDLS=y +CONFIG_TDLS_TESTING=y +CONFIG_NO_RANDOM_POOL=y + +CONFIG_TLSV11=y +CONFIG_TLSV12=y + +CONFIG_HT_OVERRIDES=y +CONFIG_VHT_OVERRIDES=y +CONFIG_HE_OVERRIDES=y + +CONFIG_DEBUG_LINUX_TRACING=y + +CONFIG_INTERWORKING=y +CONFIG_HS20=y + +CONFIG_AUTOSCAN_EXPONENTIAL=y +CONFIG_AUTOSCAN_PERIODIC=y + +CONFIG_EXT_PASSWORD_TEST=y +CONFIG_EXT_PASSWORD_FILE=y + +CONFIG_EAP_UNAUTH_TLS=y + +CONFIG_SAE=y +CONFIG_SAE_PK=y +CFLAGS += -DALL_DH_GROUPS + +CONFIG_WNM=y + +CONFIG_FST=y +CONFIG_FST_TEST=y + +CONFIG_TESTING_OPTIONS=y +CONFIG_MODULE_TESTS=y + +CONFIG_SUITEB=y +CONFIG_SUITEB192=y + +# AddressSanitizer (ASan) can be enabled by uncommenting the following lines. +# This can be used as a more efficient memory error detector than valgrind +# (though, with still some CPU and memory cost, so VM cases will need more +# memory allocated for the guest). +#CFLAGS += -fsanitize=address -O1 -fno-omit-frame-pointer -g +#LIBS += -fsanitize=address -fno-omit-frame-pointer -g +#LIBS_c += -fsanitize=address -fno-omit-frame-pointer -g +#LIBS_p += -fsanitize=address -fno-omit-frame-pointer -g + +# Undefined Behavior Sanitizer (UBSan) can be enabled by uncommenting the +# following lines. +#CFLAGS += -Wno-format-nonliteral +#CFLAGS += -fsanitize=undefined +##CFLAGS += -fno-sanitize-recover +#LIBS += -fsanitize=undefined +##LIBS += -fno-sanitize-recover +#LIBS_c += -fsanitize=undefined +#LIBS_p += -fsanitize=undefined +CONFIG_MBO=y +CONFIG_FILS=y +CONFIG_FILS_SK_PFS=y +CONFIG_PMKSA_CACHE_EXTERNAL=y +CONFIG_OWE=y +CONFIG_DPP=y +CONFIG_DPP2=y +CONFIG_WEP=y +CONFIG_PASN=y diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/b607d2723e927a3446d89aed813f1aa6068186bb/tests mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/b607d2723e927a3446d89aed813f1aa6068186bb/tests --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/b607d2723e927a3446d89aed813f1aa6068186bb/tests 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/b607d2723e927a3446d89aed813f1aa6068186bb/tests 2024-08-03 07:30:00.000000000 +0000 @@ -191,13 +191,7 @@ ap_wpa2_psk_supp_proto_too_long_gtk_in_group_msg ap_wpa2_psk_supp_proto_too_long_gtk_kde ap_wpa2_psk_supp_proto_gtk_not_encrypted -ap_wpa2_psk_supp_proto_no_igtk -ap_wpa2_psk_supp_proto_igtk_ok -ap_wpa2_psk_supp_proto_igtk_keyid_swap -ap_wpa2_psk_supp_proto_igtk_keyid_too_large -ap_wpa2_psk_supp_proto_igtk_keyid_unexpected ap_wpa2_psk_wep -ap_wpa2_psk_ifdown ap_wpa2_psk_drop_first_msg_4 ap_wpa2_psk_disable_enable ap_wpa2_psk_incorrect_passphrase @@ -210,10 +204,7 @@ ap_wpa2_disable_eapol_retry_group ap_wpa2_psk_mic_0 ap_wpa2_psk_local_error -ap_wpa2_psk_inject_assoc -ap_wpa2_psk_no_control_port ap_wpa2_psk_ap_control_port -ap_wpa2_psk_ap_control_port_disabled ap_wpa2_psk_rsne_mismatch_ap ap_wpa2_psk_rsne_mismatch_ap2 ap_wpa2_psk_rsne_mismatch_ap3 @@ -253,10 +244,8 @@ ap_wpa2_eap_aka_config ap_wpa2_eap_aka_ext ap_wpa2_eap_aka_ext_auth_fail -ap_wpa2_eap_aka_prime ap_wpa2_eap_aka_prime_imsi_identity ap_wpa2_eap_aka_prime_imsi_privacy_key -ap_wpa2_eap_aka_prime_sql ap_wpa2_eap_aka_prime_ext_auth_fail ap_wpa2_eap_aka_prime_ext ap_wpa2_eap_ttls_pap @@ -416,19 +405,6 @@ ap_wpa2_eap_tls_tod ap_wpa2_eap_tls_tod_tofu ap_wpa2_eap_sake_no_control_port -ap_wpa2_tdls -ap_wpa2_tdls_concurrent_init -ap_wpa2_tdls_concurrent_init2 -ap_wpa2_tdls_decline_resp -ap_wpa2_tdls_long_lifetime -ap_wpa2_tdls_long_frame -ap_wpa2_tdls_reneg -ap_wpa2_tdls_wrong_lifetime_resp -ap_wpa2_tdls_diff_rsnie -ap_wpa2_tdls_wrong_tpk_m2_mic -ap_wpa2_tdls_wrong_tpk_m3_mic -ap_wpa2_tdls_double_tpk_m2 -ap_wpa2_tdls_responder_teardown dpp_network_intro_version dpp_network_intro_version_change dpp_network_intro_version_missing_req @@ -459,12 +435,9 @@ dpp_qr_code_curves_brainpool dpp_qr_code_unsupported_curve dpp_qr_code_keygen_fail -dpp_qr_code_curve_select dpp_qr_code_auth_broadcast -dpp_configurator_enrollee dpp_configurator_enrollee_prime256v1 dpp_configurator_enrollee_secp384r1 -dpp_configurator_enrollee_secp521r1 dpp_configurator_enrollee_brainpoolP256r1 dpp_configurator_enrollee_brainpoolP384r1 dpp_configurator_enrollee_brainpoolP512r1 @@ -477,7 +450,6 @@ dpp_qr_code_curve_brainpoolP512r1 dpp_qr_code_set_key dpp_qr_code_auth_mutual -dpp_qr_code_auth_mutual2 dpp_qr_code_auth_mutual_p_256 dpp_qr_code_auth_mutual_p_384 dpp_qr_code_auth_mutual_p_521 @@ -514,13 +486,11 @@ dpp_config_unexpected_signed_connector_char dpp_config_root_not_an_object dpp_config_no_wi_fi_tech -dpp_config_unsupported_wi_fi_tech dpp_config_no_discovery dpp_config_no_discovery_ssid dpp_config_too_long_discovery_ssid dpp_config_no_cred dpp_config_no_cred_akm -dpp_config_unsupported_cred_akm dpp_config_error_legacy_no_pass dpp_config_error_legacy_too_long_pass dpp_config_error_legacy_psk_with_sae @@ -531,13 +501,10 @@ dpp_config_connector_error_too_short_timestamp dpp_config_connector_error_invalid_timestamp dpp_config_connector_error_invalid_timestamp_date -dpp_config_connector_error_invalid_time_zone -dpp_config_connector_error_invalid_time_zone_2 dpp_config_connector_error_expired_1 dpp_config_connector_error_expired_2 dpp_config_connector_error_expired_3 dpp_config_connector_error_expired_4 -dpp_config_connector_error_expired_5 dpp_config_connector_error_expired_6 dpp_config_connector_error_no_groups dpp_config_connector_error_empty_groups @@ -565,13 +532,6 @@ dpp_ap_config_bp256_p256 dpp_ap_config_p521_bp512 dpp_ap_config_reconfig_configurator -dpp_auto_connect_1 -dpp_auto_connect_2 -dpp_auto_connect_2_connect_cmd -dpp_auto_connect_2_sta_ver1 -dpp_auto_connect_2_ap_ver1 -dpp_auto_connect_2_ver1 -dpp_auto_connect_2_conf_ver1 dpp_auto_connect_legacy dpp_auto_connect_legacy_ssid_charset dpp_auto_connect_legacy_sae_1 @@ -580,13 +540,6 @@ dpp_auto_connect_legacy_psk_sae_2 dpp_auto_connect_legacy_psk_sae_3 dpp_auto_connect_legacy_pmf_required -dpp_qr_code_auth_responder_configurator -dpp_qr_code_auth_responder_configurator_group_id -dpp_qr_code_auth_enrollee_init_netrole -dpp_qr_code_hostapd_init -dpp_qr_code_hostapd_init_offchannel -dpp_qr_code_hostapd_init_offchannel_neg_freq -dpp_qr_code_hostapd_ignore_mismatch dpp_test_vector_p_256 dpp_test_vector_p_256_b dpp_test_vector_p_521 @@ -603,7 +556,6 @@ dpp_pkex_identifier_mismatch dpp_pkex_identifier_mismatch2 dpp_pkex_identifier_mismatch3 -dpp_pkex_5ghz dpp_pkex_test_vector dpp_pkex_code_mismatch dpp_pkex_code_mismatch_limit @@ -625,7 +577,6 @@ dpp_pkex_nak_curve_change dpp_pkex_nak_curve_change2 dpp_hostapd_configurator -dpp_hostapd_configurator_enrollee_v1 dpp_hostapd_configurator_responder dpp_hostapd_configurator_fragmentation dpp_hostapd_enrollee_fragmentation @@ -650,7 +601,6 @@ dpp_proto_stop_at_pkex_cr_resp dpp_proto_network_introduction dpp_hostapd_auth_conf_timeout -dpp_hostapd_auth_resp_retries dpp_tcp dpp_tcp_port dpp_tcp_mutual @@ -702,6 +652,5 @@ dpp_qr_code_config_event_initiator_no_response dpp_qr_code_config_event_initiator_both dpp_tcp_qr_code_config_event_initiator -dpp_qr_code_config_event_responder dpp_discard_public_action diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/extra.patch mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/extra.patch --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/extra.patch 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/extra.patch 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,47 @@ +From a53a6a67dc121b45d611318e2a37815cc209839c Mon Sep 17 00:00:00 2001 +From: Juliusz Sosinowicz +Date: Fri, 19 Apr 2024 16:41:38 +0200 +Subject: [PATCH] Fixes for running tests under UML + +- Apply commit ID fix from more recent commit +- priv_sz and pub_sz are checked and fail on UML. Probably because stack is zeroed out. +--- + src/crypto/crypto_wolfssl.c | 2 +- + tests/hwsim/run-all.sh | 8 +++++++- + 2 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/crypto/crypto_wolfssl.c b/src/crypto/crypto_wolfssl.c +index 00ecf61352..a57fa50697 100644 +--- a/src/crypto/crypto_wolfssl.c ++++ b/src/crypto/crypto_wolfssl.c +@@ -785,7 +785,7 @@ int crypto_dh_init(u8 generator, const u8 *prime, size_t prime_len, u8 *privkey, + int ret = -1; + WC_RNG rng; + DhKey *dh = NULL; +- word32 priv_sz, pub_sz; ++ word32 priv_sz = prime_len, pub_sz = prime_len; + + if (TEST_FAIL()) + return -1; +diff --git a/tests/hwsim/run-all.sh b/tests/hwsim/run-all.sh +index ee48cd0581..75c3a58b52 100755 +--- a/tests/hwsim/run-all.sh ++++ b/tests/hwsim/run-all.sh +@@ -15,7 +15,13 @@ export LOGDIR + if [ -z "$DBFILE" ]; then + DB="" + else +- DB="-S $DBFILE --commit $(git rev-parse HEAD)" ++ DB="-S $DBFILE" ++ if [ -z "$COMMITID" ]; then ++ COMMITID="$(git rev-parse HEAD)" ++ fi ++ if [ -n "$COMMITID" ]; then ++ DB="$DB --commit $COMMITID" ++ fi + if [ -n "$BUILD" ]; then + DB="$DB -b $BUILD" + fi +-- +2.34.1 + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/tests mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/tests --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/tests 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-files/configs/hostap_2_10/tests 2024-08-03 07:30:00.000000000 +0000 @@ -163,7 +163,6 @@ ap_wpa2_psk_mic_0 ap_wpa2_psk_local_error ap_wpa2_psk_inject_assoc -ap_wpa2_psk_no_control_port ap_wpa2_psk_ap_control_port ap_wpa2_psk_ap_control_port_disabled ap_wpa2_psk_rsne_mismatch_ap @@ -269,16 +268,3 @@ ap_wpa2_eap_server_get_id ap_wpa2_radius_server_get_id ap_wpa2_eap_sake_no_control_port -ap_wpa2_tdls -ap_wpa2_tdls_concurrent_init -ap_wpa2_tdls_concurrent_init2 -ap_wpa2_tdls_decline_resp -ap_wpa2_tdls_long_lifetime -ap_wpa2_tdls_long_frame -ap_wpa2_tdls_reneg -ap_wpa2_tdls_wrong_lifetime_resp -ap_wpa2_tdls_diff_rsnie -ap_wpa2_tdls_wrong_tpk_m2_mic -ap_wpa2_tdls_wrong_tpk_m3_mic -ap_wpa2_tdls_double_tpk_m2 -ap_wpa2_tdls_responder_teardown diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-vm.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-vm.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap-vm.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap-vm.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,313 @@ +name: hostap and wpa-supplicant Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +env: + LINUX_REF: v6.6 + +jobs: + build_wolfssl: + strategy: + matrix: + include: + - build_id: hostap-vm-build1 + wolf_extra_config: --disable-tls13 + - build_id: hostap-vm-build2 + wolf_extra_config: >- + --enable-wpas-dpp --enable-brainpool --with-eccminsz=192 + --enable-tlsv10 --enable-oldtls + name: Build wolfSSL + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 10 + steps: + # No way to view the full strategy in the browser (really weird) + - name: Print strategy + run: | + cat <> $GITHUB_ENV + + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: >- + --enable-wpas CPPFLAGS=-DWOLFSSL_STATIC_RSA + ${{ env.wolf_debug_flags }} ${{ matrix.wolf_extra_config }} + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.build_id }} + path: build-dir + retention-days: 5 + + build_uml_linux: + name: Build UML (UserMode Linux) + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 10 + steps: + - name: Checking if we have kernel in cache + uses: actions/cache@v4 + id: cache + with: + path: linux/linux + key: ${{ env.LINUX_REF }} + lookup-only: true + + - name: Checkout hostap + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/checkout@v4 + with: + repository: julek-wolfssl/hostap-mirror + path: hostap + + - name: Checkout linux + if: steps.cache.outputs.cache-hit != 'true' + uses: actions/checkout@v4 + with: + repository: torvalds/linux + path: linux + + - name: Compile linux + if: steps.cache.outputs.cache-hit != 'true' + run: | + cp hostap/tests/hwsim/vm/kernel-config.uml linux/.config + cd linux + yes "" | ARCH=um make -j $(nproc) + + hostap_test: + strategy: + fail-fast: false + matrix: + # should hostapd be compiled with wolfssl + hostapd: [true, false] + # should wpa_supplicant be compiled with wolfssl + wpa_supplicant: [true, false] + # Fix the versions of hostap and osp to not break testing when a new + # patch is added in to osp. Tests are read from the corresponding + # configs/hostap_ref/tests file. + config: [ + { + hostap_ref: hostap_2_10, + remove_teap: true, + # TLS 1.3 does not work for this version + build_id: hostap-vm-build1, + }, + # Test the dpp patch + { + hostap_ref: b607d2723e927a3446d89aed813f1aa6068186bb, + osp_ref: ad5b52a49b3cc2a5bfb47ccc1d6a5137132e9446, + build_id: hostap-vm-build2 + }, + { + hostap_ref: 07c9f183ea744ac04585fb6dd10220c75a5e2e74, + osp_ref: e1876fbbf298ee442bc7ab8561331ebc7de17528, + build_id: hostap-vm-build2 + }, + ] + exclude: + # don't test openssl on both sides + - hostapd: false + wpa_supplicant: false + # no hostapd support for dpp yet + - hostapd: true + config: { + hostap_ref: b607d2723e927a3446d89aed813f1aa6068186bb, + osp_ref: ad5b52a49b3cc2a5bfb47ccc1d6a5137132e9446, + build_id: hostap-vm-build2 + } + name: hwsim test + # For openssl 1.1 + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 45 + needs: [build_wolfssl, build_uml_linux] + steps: + - name: Checking if we have kernel in cache + uses: actions/cache/restore@v4 + id: cache + with: + path: linux/linux + key: ${{ env.LINUX_REF }} + fail-on-cache-miss: true + + - name: show file structure + run: tree + + # No way to view the full strategy in the browser (really weird) + - name: Print strategy + run: | + cat <> $GITHUB_ENV + echo Our job run ID is $SHA_SUM + + - name: Checkout wolfSSL + uses: actions/checkout@v4 + with: + path: wolfssl + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: ${{ matrix.config.build_id }} + path: build-dir + + - name: Install dependencies + run: | + # Don't prompt for anything + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + # hostap dependencies + sudo apt-get install -y libpcap0.8 libpcap-dev curl libcurl4-openssl-dev \ + libnl-3-dev binutils-dev libssl-dev libiberty-dev libnl-genl-3-dev \ + libnl-route-3-dev libdbus-1-dev bridge-utils tshark + sudo pip3 install pycryptodome + + - name: Checkout hostap + uses: actions/checkout@v4 + with: + repository: julek-wolfssl/hostap-mirror + path: hostap + ref: ${{ matrix.config.hostap_ref }} + + - name: Update certs + working-directory: hostap/tests/hwsim/auth_serv + run: ./update.sh + + - if: ${{ matrix.config.osp_ref }} + name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + ref: ${{ matrix.config.osp_ref }} + + - if: ${{ matrix.config.osp_ref }} + name: Apply patch files + working-directory: hostap + run: | + for f in $GITHUB_WORKSPACE/osp/hostap-patches/pending/* + do + patch -p1 < $f + done + + - name: Apply extra patches + working-directory: hostap + run: | + FILE=$GITHUB_WORKSPACE/wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/extra.patch + if [ -f "$FILE" ]; then + patch -p1 < $FILE + fi + + - if: ${{ matrix.hostapd }} + name: Setup hostapd config file + run: | + cp wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/hostapd.config \ + hostap/hostapd/.config + cat <> hostap/hostapd/.config + CFLAGS += -I$GITHUB_WORKSPACE/build-dir/include -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + LIBS += -L$GITHUB_WORKSPACE/build-dir/lib -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + EOF + + - if: ${{ matrix.wpa_supplicant }} + name: Setup wpa_supplicant config file + run: | + cp wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/wpa_supplicant.config \ + hostap/wpa_supplicant/.config + cat <> hostap/wpa_supplicant/.config + CFLAGS += -I$GITHUB_WORKSPACE/build-dir/include -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + LIBS += -L$GITHUB_WORKSPACE/build-dir/lib -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib + EOF + + - name: Build hostap and wpa_supplicant + working-directory: hostap/tests/hwsim/ + run: ./build.sh + + - if: ${{ matrix.hostapd }} + name: Confirm hostapd linking with wolfSSL + run: ldd hostap/hostapd/hostapd | grep wolfssl + + - if: ${{ matrix.wpa_supplicant }} + name: Confirm wpa_supplicant linking with wolfSSL + run: ldd hostap/wpa_supplicant/wpa_supplicant | grep wolfssl + + - if: ${{ matrix.config.remove_teap }} + name: Remove EAP-TEAP from test configuration + working-directory: hostap/tests/hwsim/auth_serv + run: | + sed -e 's/"erp-teap@example.com"\tTEAP//' -i eap_user.conf + sed -e 's/"erp-teap@example.com"\tMSCHAPV2\t"password"\t\[2\]//' -i eap_user.conf + sed -e 's/"TEAP"\t\tTEAP//' -i eap_user.conf + sed -e 's/TEAP,//' -i eap_user.conf + + - if: ${{ runner.debug }} + name: Enable hostap debug logging + run: | + echo "hostap_debug_flags=--debug" >> $GITHUB_ENV + + - name: Run tests + id: testing + working-directory: hostap/tests/hwsim/ + run: | + cat <> vm/vm-config + KERNELDIR=$GITHUB_WORKSPACE/linux + KVMARGS="-cpu host" + EOF + # Run tests in increments of 200 to not stall out the parallel-vm script + while mapfile -t -n 200 ary && ((${#ary[@]})); do + TESTS=$(printf '%s\n' "${ary[@]}" | tr '\n' ' ') + HWSIM_RES=0 # Not set when command succeeds + ./vm/parallel-vm.py ${{ env.hostap_debug_flags }} --nocurses $(nproc) $TESTS || HWSIM_RES=$? + if [ "$HWSIM_RES" -ne "0" ]; then + # Let's re-run the failing tests. We gather the failed tests from the log file. + FAILED_TESTS=$(grep 'failed tests' /tmp/hwsim-test-logs/*-parallel.log | sed 's/failed tests: //' | tr ' ' '\n' | sort | uniq | tr '\n' ' ') + printf 'failed tests: %s\n' "$FAILED_TESTS" + ./vm/parallel-vm.py ${{ env.hostap_debug_flags }} --nocurses $(nproc) $FAILED_TESTS + fi + rm -r /tmp/hwsim-test-logs + done < $GITHUB_WORKSPACE/wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/tests + + # The logs are quite big. It hasn't been useful so far so let's not waste + # precious gh space. + #- name: zip logs + # if: ${{ failure() && steps.testing.outcome == 'failure' }} + # working-directory: hostap/tests/hwsim/ + # run: | + # rm /tmp/hwsim-test-logs/latest + # zip -9 -r logs.zip /tmp/hwsim-test-logs + # + #- name: Upload failure logs + # if: ${{ failure() && steps.testing.outcome == 'failure' }} + # uses: actions/upload-artifact@v4 + # with: + # name: hostap-logs-${{ env.our_job_run_id }} + # path: hostap/tests/hwsim/logs.zip + # retention-days: 5 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/hostap.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/hostap.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,279 +0,0 @@ -name: hostap and wpa-supplicant Tests - -on: - workflow_call: - -jobs: - build_wolfssl: - strategy: - matrix: - include: - - build_id: hostap-build1 - wolf_extra_config: --disable-tls13 - - build_id: hostap-build2 - wolf_extra_config: --enable-brainpool --enable-wpas-dpp - name: Build wolfSSL - # Just to keep it the same as the testing target - runs-on: ubuntu-20.04 - steps: - # No way to view the full strategy in the browser (really weird) - - name: Print strategy - run: | - cat <> $GITHUB_ENV - - - name: Build wolfSSL - uses: wolfSSL/actions-build-autotools-project@v1 - with: - path: wolfssl - configure: >- - --enable-wpas CFLAGS=-DWOLFSSL_STATIC_RSA - ${{ env.wolf_debug_flags }} ${{ matrix.wolf_extra_config }} - install: true - - - name: Upload built lib - uses: actions/upload-artifact@v3 - with: - name: ${{ matrix.build_id }} - path: build-dir - retention-days: 1 - - # Build wpa_supplicant with wolfSSL and hostapd with OpenSSL and interop. - hostap_test: - strategy: - fail-fast: false - matrix: - # should hostapd be compiled with wolfssl - hostapd: [true, false] - # should wpa_supplicant be compiled with wolfssl - wpa_supplicant: [true, false] - # Fix the versions of hostap and osp to not break testing when a new - # patch is added in to osp. hostap_cherry_pick is used to apply the - # commit that updates the certificates used for testing. Tests are read - # from the corresponding configs/hostap_ref/tests file. - config: [ - { - hostap_ref: hostap_2_10, - hostap_cherry_pick: 5679ec5c3dda25a0547a5f66407fd9b0b55fd04a, - remove_teap: true, - # TLS 1.3 does not work for this version - build_id: hostap-build1, - }, - # Test the dpp patch - { - hostap_ref: b607d2723e927a3446d89aed813f1aa6068186bb, - hostap_cherry_pick: 5679ec5c3dda25a0547a5f66407fd9b0b55fd04a, - osp_ref: ad5b52a49b3cc2a5bfb47ccc1d6a5137132e9446, - build_id: hostap-build2 - }, - ] - # parallelize the tests to be able to run all tests within 10 minutes - # Update the in the ./run-tests.py step when changing. - server: [1, 2, 3, 4, 5] - exclude: - # don't test openssl on both sides - - hostapd: false - wpa_supplicant: false - # no hostapd support for dpp yet - - hostapd: true - config: { - hostap_ref: b607d2723e927a3446d89aed813f1aa6068186bb, - osp_ref: ad5b52a49b3cc2a5bfb47ccc1d6a5137132e9446, - build_id: hostap-build2 - } - name: hwsim test - # For openssl 1.1 - runs-on: ubuntu-20.04 - needs: build_wolfssl - steps: - # No way to view the full strategy in the browser (really weird) - - name: Print strategy - run: | - cat <> $GITHUB_ENV - echo Our job run ID is $SHA_SUM - - - name: Checkout wolfSSL - uses: actions/checkout@v3 - with: - path: wolfssl - - - name: Install dependencies - run: | - # Don't prompt for anything - export DEBIAN_FRONTEND=noninteractive - sudo apt-get update - # hostap dependencies - sudo apt-get install -y libpcap0.8 libpcap-dev curl libcurl4-openssl-dev \ - libnl-3-dev binutils-dev libssl-dev libiberty-dev libnl-genl-3-dev \ - libnl-route-3-dev libdbus-1-dev linux-modules-extra-`uname -r` \ - bridge-utils - sudo pip3 install pycryptodome - - - name: Enable mac80211 - run: | - sudo modprobe mac80211 - lsmod | grep mac80211 - - - if: ${{ runner.debug }} - name: Enable hostap debug logging - run: | - echo "hostap_debug_flags=-d" >> $GITHUB_ENV - - - name: Download lib - uses: actions/download-artifact@v3 - with: - name: ${{ matrix.config.build_id }} - path: build-dir - - - name: Setup d-bus - working-directory: wolfssl/.github/workflows/hostap-files - run: | - sudo cp dbus-wpa_supplicant.conf /usr/share/dbus-1/system.d/wpa_supplicant.conf - sudo service dbus reload - - # This is super hack-ish :P - # If you are trying to reproduce this on a more generic system, you can - # just run `sudo apt install linux-modules-extra-$(uname -r)` and - # this should have the module in the package. No need to compile it. - - name: Compile and install mac80211_hwsim - working-directory: wolfssl/.github/workflows/hostap-files - run: | - # The tag will be the first two numbers of from uname -r - LINUX_TAG=$(uname -r | grep -oP '^\d+\.\d+') - # Download the correct version of the driver - wget https://raw.githubusercontent.com/torvalds/linux/v$LINUX_TAG/drivers/net/wireless/mac80211_hwsim.c - wget https://raw.githubusercontent.com/torvalds/linux/v$LINUX_TAG/drivers/net/wireless/mac80211_hwsim.h - make - sudo make install - sudo modprobe mac80211_hwsim - lsmod | grep mac80211_hwsim - sudo rmmod mac80211_hwsim - - - name: Checkout hostap - uses: actions/checkout@v3 - with: - repository: julek-wolfssl/hostap-mirror - path: hostap - ref: ${{ matrix.config.hostap_ref }} - # necessary for cherry pick step - fetch-depth: 0 - - - if: ${{ matrix.config.hostap_cherry_pick }} - name: Cherry pick certificate update - working-directory: hostap - run: git cherry-pick -n -X theirs ${{ matrix.config.hostap_cherry_pick }} - - - if: ${{ matrix.config.osp_ref }} - name: Checkout OSP - uses: actions/checkout@v3 - with: - repository: wolfssl/osp - path: osp - ref: ${{ matrix.config.osp_ref }} - - - if: ${{ matrix.config.osp_ref }} - name: Apply patch files - working-directory: hostap - run: | - for f in $GITHUB_WORKSPACE/osp/hostap-patches/pending/* - do - patch -p1 < $f - done - - - if: ${{ matrix.hostapd }} - name: Setup hostapd config file - run: | - cp wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/hostapd.config \ - hostap/hostapd/.config - cat <> hostap/hostapd/.config - CFLAGS += -I$GITHUB_WORKSPACE/build-dir/include -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib - LIBS += -L$GITHUB_WORKSPACE/build-dir/lib -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib - EOF - - - if: ${{ matrix.wpa_supplicant }} - name: Setup wpa_supplicant config file - run: | - cp wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/wpa_supplicant.config \ - hostap/wpa_supplicant/.config - cat <> hostap/wpa_supplicant/.config - CFLAGS += -I$GITHUB_WORKSPACE/build-dir/include -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib - LIBS += -L$GITHUB_WORKSPACE/build-dir/lib -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib - EOF - - - name: Build hostap - working-directory: hostap/tests/hwsim/ - run: ./build.sh - - - if: ${{ matrix.hostapd }} - name: Confirm hostapd linking with wolfSSL - run: ldd hostap/hostapd/hostapd | grep wolfssl - - - if: ${{ matrix.wpa_supplicant }} - name: Confirm wpa_supplicant linking with wolfSSL - run: ldd hostap/wpa_supplicant/wpa_supplicant | grep wolfssl - - - if: ${{ matrix.config.remove_teap }} - name: Remove EAP-TEAP from test configuration - working-directory: hostap/tests/hwsim/auth_serv - run: | - sed -e 's/"erp-teap@example.com"\tTEAP//' -i eap_user.conf - sed -e 's/"erp-teap@example.com"\tMSCHAPV2\t"password"\t\[2\]//' -i eap_user.conf - sed -e 's/"TEAP"\t\tTEAP//' -i eap_user.conf - sed -e 's/TEAP,//' -i eap_user.conf - - - name: Run tests - id: testing - working-directory: hostap/tests/hwsim/ - run: | - # Run tests in increments of 50 to cut down on the uploaded log size. - while mapfile -t -n 50 ary && ((${#ary[@]})); do - TESTS=$(printf '%s\n' "${ary[@]}" | tr '\n' ' ') - # Retry up to three times - for i in {1..3}; do - HWSIM_RES=0 - # Logs can grow quickly especially in debug mode - sudo rm -rf logs - sudo ./start.sh - sudo ./run-tests.py ${{ env.hostap_debug_flags }} --split ${{ matrix.server }}/5 $TESTS || HWSIM_RES=$? - sudo ./stop.sh - if [ "$HWSIM_RES" -eq "0" ]; then - break - fi - done - echo "test ran $i times" - if [ "$HWSIM_RES" -ne "0" ]; then - exit $HWSIM_RES - fi - done < $GITHUB_WORKSPACE/wolfssl/.github/workflows/hostap-files/configs/${{ matrix.config.hostap_ref }}/tests - - - name: Change failure log permissions - if: ${{ failure() && steps.testing.outcome == 'failure' }} - working-directory: hostap/tests/hwsim/ - run: | - sudo chown -R $USER:$USER logs - zip -9 -r logs.zip logs/current - - - name: Upload failure logs - if: ${{ failure() && steps.testing.outcome == 'failure' }} - uses: actions/upload-artifact@v3 - with: - name: hostap-logs-${{ env.our_job_run_id }} - path: hostap/tests/hwsim/logs.zip - retention-days: 5 - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/ipmitool.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/ipmitool.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/ipmitool.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/ipmitool.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,77 @@ +name: ipmitool Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all + install: true + # Don't run tests as this config is tested in many other places + check: false + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-ipmitool + path: build-dir + retention-days: 5 + + build_ipmitool: + strategy: + fail-fast: false + matrix: + git_ref: [ c3939dac2c060651361fc71516806f9ab8c38901 ] + name: ${{ matrix.git_ref }} + runs-on: ubuntu-latest + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-ipmitool + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Build ipmitool + uses: wolfSSL/actions-build-autotools-project@v1 + with: + repository: ipmitool/ipmitool + ref: ${{ matrix.git_ref }} + path: ipmitool + patch-file: $GITHUB_WORKSPACE/osp/ipmitool/*-${{ matrix.git_ref }}.patch + configure: --with-wolfssl=$GITHUB_WORKSPACE/build-dir + # No checks included and not running since it depends on hardware + check: false + + - name: Confirm built with wolfSSL + working-directory: ipmitool + run: | + ldd src/ipmitool | grep wolfssl + ldd src/ipmievd | grep wolfssl + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/jwt-cpp.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/jwt-cpp.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/jwt-cpp.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/jwt-cpp.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,85 @@ +name: jwt-cpp Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all + install: true + # Don't run tests as this config is tested in many other places + check: false + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-jwt-cpp + path: build-dir + retention-days: 5 + + build_pam-ipmi: + strategy: + fail-fast: false + matrix: + ref: [ 0.6.0 ] + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + needs: build_wolfssl + steps: + - name: Install dependencies + run: | + # Don't prompt for anything + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + sudo apt-get install libgtest-dev + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-jwt-cpp + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Checkout jwt-cpp + uses: actions/checkout@v4 + with: + repository: Thalhammer/jwt-cpp + path: jwt-cpp + ref: v${{ matrix.ref }} + + - name: Build pam-ipmi + working-directory: jwt-cpp + run: | + patch -p1 < ../osp/jwt-cpp/${{ matrix.ref }}.patch + PKG_CONFIG_PATH=$GITHUB_WORKSPACE/build-dir/lib/pkgconfig \ + cmake -B build -DJWT_SSL_LIBRARY:STRING=wolfSSL -DJWT_BUILD_TESTS=ON . + make -j -C build + ldd ./build/tests/jwt-cpp-test | grep wolfssl + + - name: Run jwt-cpp tests + working-directory: jwt-cpp + run: ./build/tests/jwt-cpp-test diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/krb5.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/krb5.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/krb5.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/krb5.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,96 @@ +name: Kerberos 5 Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 5 + steps: + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-krb CC='gcc -fsanitize=address' + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-krb5 + path: build-dir + retention-days: 5 + + krb5_check: + strategy: + fail-fast: false + matrix: + # List of releases to test + ref: [ 1.21.1 ] + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 8 + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-krb5 + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Checkout krb5 + uses: actions/checkout@v4 + with: + repository: krb5/krb5 + ref: krb5-${{ matrix.ref }}-final + path: krb5 + + - name: Apply patch + working-directory: ./krb5 + run: | + patch -p1 < $GITHUB_WORKSPACE/osp/krb5/Patch-for-Kerberos-5-${{ matrix.ref }}.patch + + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + + - name: Build krb5 + working-directory: ./krb5/src + run: | + autoreconf -ivf + # Using rpath because LD_LIBRARY_PATH is overwritten during testing + export WOLFSSL_CFLAGS="-I$GITHUB_WORKSPACE/build-dir/include -I$GITHUB_WORKSPACE/build-dir/include/wolfssl -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib" + export WOLFSSL_LIBS="-lwolfssl -L$GITHUB_WORKSPACE/build-dir/lib -Wl,-rpath=$GITHUB_WORKSPACE/build-dir/lib" + ./configure --with-crypto-impl=wolfssl --with-tls-impl=wolfssl --disable-pkinit \ + CFLAGS='-fsanitize=address' LDFLAGS='-fsanitize=address' + CFLAGS='-fsanitize=address' LDFLAGS='-fsanitize=address' make -j + + - name: Run tests + working-directory: ./krb5/src + run: | + CFLAGS='-fsanitize=address' LDFLAGS='-fsanitize=address' make -j check + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/libssh2.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,67 @@ +name: libssh2 Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all + check: false # config is already tested in many other PRB's + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-libssh2 + path: build-dir + retention-days: 5 + + libssh2_check: + strategy: + fail-fast: false + matrix: + # List of releases to test + ref: [ 1.11.0 ] + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 8 + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-libssh2 + path: build-dir + + - name: Build and test libssh2 + uses: wolfSSL/actions-build-autotools-project@v1 + with: + repository: libssh2/libssh2 + ref: libssh2-${{ matrix.ref }} + path: libssh2 + configure: --with-crypto=wolfssl --with-libwolfssl-prefix=$GITHUB_WORKSPACE/build-dir + check: true + + - name: Confirm libssh2 built with wolfSSL + working-directory: ./libssh2 + run: ldd src/.libs/libssh2.so | grep wolfssl diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/libvncserver.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/libvncserver.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/libvncserver.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/libvncserver.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,79 @@ +name: libvncserver Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all + install: true + # Don't run tests as this config is tested in many other places + check: false + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-libvncserver + path: build-dir + retention-days: 5 + + build_libvncserver: + strategy: + fail-fast: false + matrix: + ref: [ 0.9.13 ] + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-libvncserver + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Checkout libvncserver + uses: actions/checkout@v4 + with: + repository: LibVNC/libvncserver + path: libvncserver + ref: LibVNCServer-${{ matrix.ref }} + + - name: Build libvncserver + working-directory: libvncserver + run: | + patch -p1 < ../osp/libvncserver/${{ matrix.ref }}.patch + PKG_CONFIG_PATH=$GITHUB_WORKSPACE/build-dir/lib/pkgconfig \ + cmake -B build -DWITH_GNUTLS=OFF -DWITH_OPENSSL=OFF -DWITH_GCRYPT=OFF -DWITH_WOLFSSL=ON . + make -j -C build VERBOSE=1 + ldd build/libvncclient.so | grep wolfssl + ldd build/libvncserver.so | grep wolfssl + + - name: Run libvncserver tests + working-directory: libvncserver + run: make -C build test diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/main.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/main.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/main.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/main.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -name: CI -concurrency: - group: ${{ github.ref }} - cancel-in-progress: true - -on: - push: - branches: [ 'master', 'main', 'release/**' ] - pull_request: - branches: [ '*' ] - -jobs: - espressif: - uses: ./.github/workflows/docker-Espressif.yml - multi-compiler: - uses: ./.github/workflows/multi-compiler.yml - openwrt: - uses: ./.github/workflows/docker-OpenWrt.yml - os-check: - uses: ./.github/workflows/os-check.yml - async: - uses: ./.github/workflows/async.yml - stunnel: - uses: ./.github/workflows/stunnel.yml - openvpn: - uses: ./.github/workflows/openvpn.yml - hostap: - uses: ./.github/workflows/hostap.yml -# TODO: Currently this test fails. Enable it once it becomes passing. -# haproxy: -# uses: ./.github/workflows/haproxy.yml diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/memcached.sh mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/memcached.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/memcached.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/memcached.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ -z "$GITHUB_WORKSPACE" ]; then + echo '$GITHUB_WORKSPACE is not set' + exit 1 +fi + +if [ -z "$HOST_ROOT" ]; then + echo '$HOST_ROOT is not set' + exit 1 +fi + +chroot $HOST_ROOT make -C $GITHUB_WORKSPACE/memcached \ + -j$(nproc) PARALLEL=$(nproc) test_tls diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/memcached.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/memcached.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/memcached.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/memcached.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,116 @@ +name: memcached Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-memcached + install: true + + - name: Bundle Docker entry point + run: cp wolfssl/.github/workflows/memcached.sh build-dir/bin + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-memcached + path: build-dir + retention-days: 5 + + memcached_check: + strategy: + fail-fast: false + matrix: + # List of releases to test + include: + - ref: 1.6.22 + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-memcached + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Install dependencies + run: | + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + sudo apt-get install -y libevent-dev libevent-2.1-7 automake pkg-config make libio-socket-ssl-perl + + - name: Checkout memcached + uses: actions/checkout@v4 + with: + repository: memcached/memcached + ref: 1.6.22 + path: memcached + + - name: Configure and build memcached + run: | + cd $GITHUB_WORKSPACE/memcached/ + patch -p1 < $GITHUB_WORKSPACE/osp/memcached/memcached_1.6.22.patch + ./autogen.sh + export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/build-dir/lib:$LD_LIBRARY_PATH + PKG_CONFIG_PATH=$GITHUB_WORKSPACE/build-dir/lib/pkgconfig ./configure --enable-wolfssl + make -j$(nproc) + + - name: Confirm memcached built with wolfSSL + working-directory: ./memcached + run: | + export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/build-dir/lib:$LD_LIBRARY_PATH + ldd memcached | grep wolfssl + + - name: Run memcached tests + working-directory: ./memcached + run: | + # Retry up to three times + # Using docker because interrupting the tests doesn't close running + # background servers. They can become daemonized and then all re-runs + # will always fail. + chmod +x $GITHUB_WORKSPACE/build-dir/bin/memcached.sh + for i in {1..3}; do + echo "-------- RUNNING TESTS --------" + MEMCACHED_RES=0 # Not set when command succeeds + # Tests should usually take less than 4 minutes. If already taking + # 5 minutes then they are probably stuck. Interrupt and re-run. + time timeout -s SIGKILL 5m docker run -v /:/host \ + -v $GITHUB_WORKSPACE/build-dir/bin/memcached.sh:/memcached.sh \ + -e GITHUB_WORKSPACE=$GITHUB_WORKSPACE \ + -e HOST_ROOT=/host \ + -e LD_LIBRARY_PATH=$GITHUB_WORKSPACE/build-dir/lib:$LD_LIBRARY_PATH \ + alpine:latest /memcached.sh || MEMCACHED_RES=$? + + if [ "$MEMCACHED_RES" -eq "0" ]; then + break + fi + done + echo "test ran $i times" + if [ "$MEMCACHED_RES" -ne "0" ]; then + exit $MEMCACHED_RES + fi diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/multi-arch.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,63 @@ +name: Multiple architectures + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + my_matrix: + name: Multi-arch test + strategy: + fail-fast: false + matrix: + include: + - HOST: aarch64-linux-gnu + CC: aarch64-linux-gnu-gcc + ARCH: arm64 + EXTRA_OPTS: --enable-sp-asm --enable-armasm + - HOST: arm-linux-gnueabihf + CC: arm-linux-gnueabihf-gcc + ARCH: armhf + EXTRA_OPTS: --enable-sp-asm + - HOST: riscv64-linux-gnu + CC: riscv64-linux-gnu-gcc + ARCH: riscv64 + # Config to ensure CPUs without Thumb instructions compiles + - HOST: arm-linux-gnueabi + CC: arm-linux-gnueabi-gcc + CFLAGS: -marm -DWOLFSSL_SP_ARM_ARCH=6 + ARCH: armel + EXTRA_OPTS: --enable-sp-asm + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 10 + steps: + - name: Install Compiler + run: | + sudo apt update + sudo apt install -y crossbuild-essential-${{ matrix.ARCH }} qemu-user + - uses: actions/checkout@v4 + - name: Build + env: + CC: ${{ matrix.CC }} + CFLAGS: ${{ matrix.CFLAGS }} + QEMU_LD_PREFIX: /usr/${{ matrix.HOST }} + run: ./autogen.sh && ./configure --host=${{ matrix.HOST }} --enable-all --disable-examples ${{ matrix.EXTRA_OPTS }} && make + - name: Print errors + if: ${{ failure() }} + run: | + if [ -f config.log ] ; then + cat config.log + fi + - name: Run WolfCrypt Tests + env: + QEMU_LD_PREFIX: /usr/${{ matrix.HOST }} + run: ./wolfcrypt/test/testwolfcrypt diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/multi-compiler.yml 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,16 @@ name: Multiple compilers and versions +# START OF COMMON SECTION on: - workflow_call: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION jobs: my_matrix: @@ -12,23 +21,42 @@ include: - CC: gcc-9 CXX: g++-9 + OS: ubuntu-latest - CC: gcc-10 CXX: g++-10 + OS: ubuntu-latest - CC: gcc-11 CXX: g++-11 + OS: ubuntu-latest - CC: gcc-12 CXX: g++-12 + OS: ubuntu-latest + - CC: clang-10 + CXX: clang++-10 + OS: ubuntu-20.04 + - CC: clang-11 + CXX: clang++-11 + OS: ubuntu-20.04 - CC: clang-12 CXX: clang++-12 + OS: ubuntu-20.04 - CC: clang-13 CXX: clang++-13 + OS: ubuntu-latest - CC: clang-14 CXX: clang++-14 - runs-on: ubuntu-latest + OS: ubuntu-latest + runs-on: ${{ matrix.OS }} + # This should be a safe limit for the tests to run. + timeout-minutes: 4 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build env: CC: ${{ matrix.CC }} CXX: ${{ matrix.CXX }} run: ./autogen.sh && ./configure && make && make dist + - name: Show log on errors + if: ${{ failure() }} + run: | + cat config.log diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/net-snmp.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/net-snmp.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/net-snmp.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/net-snmp.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,77 @@ +name: net-snmp Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-net-snmp + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-net-snmp + path: build-dir + retention-days: 5 + + net-snmp_check: + strategy: + fail-fast: false + matrix: + # List of releases to test + include: + - ref: 5.9.3 + test_opts: -e 'agentxperl' + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-net-snmp + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Build net-snmp + uses: wolfSSL/actions-build-autotools-project@v1 + with: + repository: net-snmp/net-snmp + ref: v${{ matrix.ref }} + path: net-snmp + patch-file: $GITHUB_WORKSPACE/osp/net-snmp/${{ matrix.ref }}.patch + configure: --disable-shared --with-wolfssl=$GITHUB_WORKSPACE/build-dir + check: false + + - name: Run net-snmp tests + working-directory: net-snmp + run: | + autoconf --version | grep -P '2\.\d\d' -o > dist/autoconf-version + make -j test TESTOPTS="${{ matrix.test_opts }}" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/nginx.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/nginx.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/nginx.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/nginx.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,219 @@ +name: nginx Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - if: ${{ runner.debug }} + name: Enable wolfSSL debug logging + run: | + # We don't use --enable-debug since it makes the logs too loud + echo "wolf_debug_flags= CFLAGS='-g3 -O0'" >> $GITHUB_ENV + + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-nginx ${{ env.wolf_debug_flags }} + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-nginx + path: build-dir + retention-days: 5 + + nginx_check: + strategy: + fail-fast: false + matrix: + include: + # in general we want to pass all tests that match *ssl* + - ref: 1.25.0 + test-ref: 5b2894ea1afd01a26c589ce11f310df118e42592 + # Following tests pass with sanitizer on + sanitize-ok: >- + h2_ssl_proxy_cache.t h2_ssl.t h2_ssl_variables.t h2_ssl_verify_client.t + mail_imap_ssl.t mail_ssl_conf_command.t mail_ssl_session_reuse.t + mail_ssl.t proxy_ssl_certificate_empty.t proxy_ssl_certificate.t + proxy_ssl_certificate_vars.t proxy_ssl_conf_command.t proxy_ssl_name.t + ssl_certificate_chain.t ssl_certificate_perl.t ssl_certificates.t + ssl_certificate.t ssl_client_escaped_cert.t ssl_conf_command.t + ssl_crl.t ssl_curve.t ssl_engine_keys.t ssl_ocsp.t ssl_password_file.t + ssl_proxy_protocol.t ssl_proxy_upgrade.t ssl_reject_handshake.t + ssl_session_reuse.t ssl_session_ticket_key.t ssl_sni_reneg.t + ssl_sni_sessions.t ssl_sni.t ssl_stapling.t ssl.t ssl_verify_client.t + ssl_verify_depth.t stream_proxy_ssl_certificate.t stream_proxy_ssl_certificate_vars.t + stream_proxy_ssl_conf_command.t stream_proxy_ssl_name_complex.t + stream_proxy_ssl_name.t stream_ssl_certificate.t stream_ssl_conf_command.t + stream_ssl_preread_alpn.t stream_ssl_preread_protocol.t stream_ssl_preread.t + stream_ssl_realip.t stream_ssl_session_reuse.t stream_ssl.t stream_ssl_variables.t + stream_ssl_verify_client.t stream_upstream_zone_ssl.t upstream_zone_ssl.t + uwsgi_ssl_certificate.t uwsgi_ssl_certificate_vars.t uwsgi_ssl.t + uwsgi_ssl_verify.t + # Following tests do not pass with sanitizer on (with OpenSSL too) + sanitize-not-ok: >- + grpc_ssl.t h2_proxy_request_buffering_ssl.t h2_proxy_ssl.t + proxy_request_buffering_ssl.t proxy_ssl_keepalive.t proxy_ssl.t + proxy_ssl_verify.t stream_proxy_protocol_ssl.t stream_proxy_ssl.t + stream_proxy_ssl_verify.t stream_ssl_alpn.t + - ref: 1.24.0 + test-ref: 212d9d003886e3a24542855fb60355a417f037de + # Following tests pass with sanitizer on + sanitize-ok: >- + h2_ssl_proxy_cache.t h2_ssl.t h2_ssl_variables.t h2_ssl_verify_client.t + mail_imap_ssl.t mail_ssl_conf_command.t mail_ssl_session_reuse.t mail_ssl.t + proxy_ssl_certificate_empty.t proxy_ssl_certificate.t proxy_ssl_certificate_vars.t + proxy_ssl_name.t ssl_certificate_chain.t ssl_certificate_perl.t ssl_certificates.t + ssl_certificate.t ssl_client_escaped_cert.t ssl_conf_command.t ssl_crl.t + ssl_engine_keys.t ssl_ocsp.t ssl_password_file.t ssl_proxy_protocol.t + ssl_proxy_upgrade.t ssl_reject_handshake.t ssl_session_reuse.t + ssl_session_ticket_key.t ssl_sni_reneg.t ssl_sni_sessions.t ssl_sni.t + ssl_stapling.t ssl.t ssl_verify_client.t stream_proxy_ssl_certificate.t + stream_proxy_ssl_certificate_vars.t stream_proxy_ssl_name_complex.t + stream_proxy_ssl_name.t stream_ssl_alpn.t stream_ssl_certificate.t + stream_ssl_conf_command.t stream_ssl_preread_alpn.t stream_ssl_preread_protocol.t + stream_ssl_preread.t stream_ssl_realip.t stream_ssl_session_reuse.t stream_ssl.t + stream_ssl_variables.t stream_ssl_verify_client.t stream_upstream_zone_ssl.t + upstream_zone_ssl.t uwsgi_ssl_certificate.t uwsgi_ssl_certificate_vars.t + uwsgi_ssl.t uwsgi_ssl_verify.t + # Following tests do not pass with sanitizer on (with OpenSSL too) + sanitize-not-ok: >- + grpc_ssl.t h2_proxy_request_buffering_ssl.t h2_proxy_ssl.t + proxy_request_buffering_ssl.t proxy_ssl_conf_command.t proxy_ssl_keepalive.t + proxy_ssl.t proxy_ssl_verify.t ssl_curve.t ssl_verify_depth.t + stream_proxy_protocol_ssl.t stream_proxy_ssl_conf_command.t stream_proxy_ssl.t + stream_proxy_ssl_verify.t + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 6 + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-nginx + path: build-dir + + - name: Install dependencies + run: | + sudo cpan -iT Proc::Find Net::SSLeay IO::Socket::SSL + + - name: Checkout wolfssl-nginx + uses: actions/checkout@v4 + with: + repository: wolfssl/wolfssl-nginx + path: wolfssl-nginx + + - name: Checkout nginx + uses: actions/checkout@v4 + with: + repository: nginx/nginx + path: nginx + ref: release-${{ matrix.ref }} + + - name: Apply nginx patch + working-directory: nginx + run: patch -p1 < ../wolfssl-nginx/nginx-${{ matrix.ref }}-wolfssl.patch + + - if: ${{ runner.debug }} + name: Apply nginx debug patch + working-directory: nginx + run: patch -p1 < ../wolfssl-nginx/nginx-${{ matrix.ref }}-wolfssl-debug.patch + + - name: Checkout nginx-tests + uses: actions/checkout@v4 + with: + repository: nginx/nginx-tests + path: nginx-tests + ref: ${{ matrix.test-ref }} + + - name: Apply nginx-tests patch + working-directory: nginx-tests + run: patch -p1 < ../wolfssl-nginx/nginx-tests-patches/*${{ matrix.test-ref }}.patch + + - name: Build nginx without sanitizer + working-directory: nginx + run: | + ./auto/configure --with-wolfssl=$GITHUB_WORKSPACE/build-dir --with-http_ssl_module \ + --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module \ + --with-http_v2_module --with-mail --with-mail_ssl_module + make -j + + - name: Confirm nginx built with wolfSSL + working-directory: nginx + run: ldd objs/nginx | grep wolfssl + + - if: ${{ runner.debug }} + name: Run nginx-tests without sanitizer (debug) + working-directory: nginx-tests + run: | + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib \ + TMPDIR=$GITHUB_WORKSPACE TEST_NGINX_VERBOSE=y TEST_NGINX_CATLOG=y \ + TEST_NGINX_BINARY=../nginx/objs/nginx prove -v ${{ matrix.sanitize-not-ok }} + + - if: ${{ !runner.debug }} + name: Run nginx-tests without sanitizer + working-directory: nginx-tests + run: | + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib \ + TMPDIR=$GITHUB_WORKSPACE TEST_NGINX_BINARY=../nginx/objs/nginx \ + prove ${{ matrix.sanitize-not-ok }} + + - if: ${{ runner.debug }} + name: Enable wolfSSL debug logging + run: | + echo "nginx_c_flags=-O0" >> $GITHUB_ENV + + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + + - name: Build nginx with sanitizer + working-directory: nginx + run: | + ./auto/configure --with-wolfssl=$GITHUB_WORKSPACE/build-dir --with-http_ssl_module \ + --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module \ + --with-http_v2_module --with-mail --with-mail_ssl_module \ + --with-cc-opt='-fsanitize=address -DNGX_DEBUG_PALLOC=1 -g3 ${{ env.nginx_c_flags }}' \ + --with-ld-opt='-fsanitize=address ${{ env.nginx_c_flags }}' + make -j + + - name: Confirm nginx built with wolfSSL + working-directory: nginx + run: ldd objs/nginx | grep wolfssl + + - if: ${{ runner.debug }} + name: Run nginx-tests with sanitizer (debug) + working-directory: nginx-tests + run: | + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib \ + TMPDIR=$GITHUB_WORKSPACE TEST_NGINX_VERBOSE=y TEST_NGINX_CATLOG=y \ + TEST_NGINX_BINARY=../nginx/objs/nginx prove -v ${{ matrix.sanitize-ok }} + + - if: ${{ !runner.debug }} + name: Run nginx-tests with sanitizer + working-directory: nginx-tests + run: | + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GITHUB_WORKSPACE/build-dir/lib \ + TMPDIR=$GITHUB_WORKSPACE TEST_NGINX_BINARY=../nginx/objs/nginx \ + prove ${{ matrix.sanitize-ok }} + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/no-malloc.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/no-malloc.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/no-malloc.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/no-malloc.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,43 @@ +name: No Malloc Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + make_check: + strategy: + matrix: + config: [ + # Add new configs here + '--enable-rsa --enable-keygen --disable-dh CFLAGS="-DWOLFSSL_NO_MALLOC"', + ] + name: make check + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 6 + steps: + - uses: actions/checkout@v4 + name: Checkout wolfSSL + + - name: Test wolfSSL + run: | + ./autogen.sh + ./configure ${{ matrix.config }} + make + ./wolfcrypt/test/testwolfcrypt + + - name: Print errors + if: ${{ failure() }} + run: | + if [ -f test-suite.log ] ; then + cat test-suite.log + fi diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/ocsp.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/ocsp.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/ocsp.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/ocsp.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,37 @@ +name: OCSP Test + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + ocsp_stapling: + name: ocsp stapling + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout wolfSSL + uses: actions/checkout@v4 + + - name: Build wolfSSL + run: autoreconf -ivf && ./configure --enable-ocsp --enable-ocspstapling && make + + - name: Start OCSP responder 1 + run: openssl ocsp -port 22221 -ndays 1000 -index certs/ocsp/index-intermediate1-ca-issued-certs.txt -rsigner certs/ocsp/ocsp-responder-cert.pem -rkey certs/ocsp/ocsp-responder-key.pem -CA certs/ocsp/intermediate1-ca-cert.pem & + + - name: Start OCSP responder 2 + run: openssl ocsp -port 22220 -ndays 1000 -index certs/ocsp/index-ca-and-intermediate-cas.txt -rsigner certs/ocsp/ocsp-responder-cert.pem -rkey certs/ocsp/ocsp-responder-key.pem -CA certs/ocsp/root-ca-cert.pem & + + - name: Start TLS server + run: ./examples/server/server -p 11111 -c ./certs/ocsp/server1-cert.pem -k ./certs/ocsp/server1-key.pem -d & + + - name: Test Look Up + run: ./examples/client/client -A ./certs/ocsp/root-ca-cert.pem -o diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/openssh.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/openssh.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/openssh.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/openssh.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,77 @@ +name: openssh Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: >- + --enable-openssh --enable-dsa --with-max-rsa-bits=8192 + --enable-intelasm --enable-sp-asm + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-openssh + path: build-dir + retention-days: 5 + + openssh_check: + strategy: + fail-fast: false + matrix: + include: + - git_ref: 'V_9_6_P1' + osp_ver: '9.6' + name: ${{ matrix.ref }} + runs-on: ubuntu-latest + needs: build_wolfssl + steps: + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-openssh + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Build and test openssh + uses: wolfSSL/actions-build-autotools-project@v1 + with: + repository: openssh/openssh-portable + ref: ${{ matrix.git_ref }} + path: openssh + patch-file: $GITHUB_WORKSPACE/osp/openssh-patches/openssh-${{ matrix.osp_ver }}.patch + configure: --with-wolfssl=$GITHUB_WORKSPACE/build-dir --with-rpath=-Wl,-rpath= + check: false + + # make tests take >20 minutes. Consider limiting? + - name: Run tests + working-directory: ./openssh + run: | + # Run all the tests except (t-exec) as it takes too long + make file-tests interop-tests extra-tests unit diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/openvpn.yml 2024-08-03 07:30:00.000000000 +0000 @@ -1,13 +1,24 @@ name: OpenVPN Tests +# START OF COMMON SECTION on: - workflow_call: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION jobs: build_wolfssl: name: Build wolfSSL # Just to keep it the same as the testing target runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 steps: - name: Build wolfSSL uses: wolfSSL/actions-build-autotools-project@v1 @@ -17,24 +28,26 @@ install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-openvpn path: build-dir - retention-days: 1 + retention-days: 5 openvpn_check: strategy: fail-fast: false matrix: # List of refs to test - ref: [ master, release/2.6, v2.6.0 ] + ref: [ release/2.6, v2.6.0, master ] name: ${{ matrix.ref }} runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 10 needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-openvpn path: build-dir @@ -46,10 +59,14 @@ linux-libc-dev man2html libcmocka-dev python3-docutils \ libtool automake autoconf libnl-genl-3-dev libnl-genl-3-200 + - name: workaround high-entropy ASLR + # not needed after either an update to llvm or runner is done + run: sudo sysctl vm.mmap_rnd_bits=28 + - if: ${{ matrix.ref != 'master' }} name: Build and test openvpn with fsanitize run: | - echo 'extra_c_flags=CFLAGS="-fsanitize=address -fno-omit-frame-pointer -O2"' >> $GITHUB_ENV + echo 'extra_c_flags=CC="gcc -fsanitize=address" CFLAGS="-fno-omit-frame-pointer -O2"' >> $GITHUB_ENV - name: Build and test openvpn uses: wolfSSL/actions-build-autotools-project@v1 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/os-check.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/os-check.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/os-check.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/os-check.yml 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,16 @@ name: Ubuntu-Macos-Windows Tests +# START OF COMMON SECTION on: - workflow_call: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION jobs: make_check: @@ -16,12 +25,19 @@ '--enable-all --enable-asn=original', '--enable-harden-tls', '--enable-tls13 --enable-session-ticket --enable-dtls --enable-dtls13 - --enable-opensslextra --enable-sessioncerts - CPPFLAGS=''-DWOLFSSL_DTLS_NO_HVR_ON_RESUME -DHAVE_EXT_CACHE - -DWOLFSSL_TICKET_HAVE_ID -DHAVE_EX_DATA -DSESSION_CACHE_DYNAMIC_MEM'' ', + --enable-opensslextra --enable-sessioncerts + CPPFLAGS=''-DWOLFSSL_DTLS_NO_HVR_ON_RESUME -DHAVE_EXT_CACHE + -DWOLFSSL_TICKET_HAVE_ID -DHAVE_EX_DATA -DSESSION_CACHE_DYNAMIC_MEM'' ', + '--enable-all --enable-secure-renegotiation', + '--enable-all --enable-haproxy --enable-quic', + '--enable-dtls --enable-dtls13 --enable-earlydata + --enable-session-ticket --enable-psk + CPPFLAGS=''-DWOLFSSL_DTLS13_NO_HRR_ON_RESUME'' ', ] name: make check runs-on: ${{ matrix.os }} + # This should be a safe limit for the tests to run. + timeout-minutes: 14 steps: - name: Build and test wolfSSL uses: wolfSSL/actions-build-autotools-project@v1 @@ -40,6 +56,8 @@ ] name: make user_setting.h runs-on: ${{ matrix.os }} + # This should be a safe limit for the tests to run. + timeout-minutes: 14 steps: - name: Build and test wolfSSL uses: wolfSSL/actions-build-autotools-project@v1 @@ -58,9 +76,13 @@ 'examples/configs/user_settings_min_ecc.h', 'examples/configs/user_settings_wolfboot_keytools.h', 'examples/configs/user_settings_wolftpm.h', + 'examples/configs/user_settings_wolfssh.h', + 'examples/configs/user_settings_tls12.h', ] name: make user_setting.h (testwolfcrypt only) runs-on: ${{ matrix.os }} + # This should be a safe limit for the tests to run. + timeout-minutes: 14 steps: - name: Build and test wolfSSL uses: wolfSSL/actions-build-autotools-project@v1 @@ -80,8 +102,10 @@ os: [ ubuntu-latest, macos-latest ] name: make user_setting.h (with sed) runs-on: ${{ matrix.os }} + # This should be a safe limit for the tests to run. + timeout-minutes: 14 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - if: ${{ matrix.os == 'macos-latest' }} run: brew install automake libtool - run: ./autogen.sh @@ -96,6 +120,8 @@ windows_build: name: Windows Build Test runs-on: windows-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 6 env: # Path to the solution file relative to the root of the project. SOLUTION_FILE_PATH: wolfssl64.sln @@ -106,10 +132,10 @@ BUILD_CONFIGURATION: Release BUILD_PLATFORM: x64 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1 + uses: microsoft/setup-msbuild@v2 - name: Restore NuGet packages working-directory: ${{env.GITHUB_WORKSPACE}} @@ -120,3 +146,7 @@ # Add additional options to the MSBuild command line here (like platform or verbosity level). # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference run: msbuild /m /p:PlatformToolset=v142 /p:Platform=${{env.BUILD_PLATFORM}} /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}} + + - name: Run Test + working-directory: ${{env.GITHUB_WORKSPACE}} + run: Release/x64/testsuite.exe diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/packaging.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/packaging.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/packaging.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/packaging.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,54 @@ +name: Packaging Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Package wolfSSL + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 10 + steps: + - name: Checkout wolfSSL + uses: actions/checkout@v4 + + - name: Configure wolfSSL + run: | + autoreconf -ivf + ./configure --enable-distro --enable-all \ + --disable-openssl-compatible-defaults --enable-intelasm \ + --enable-dtls13 --enable-dtls-mtu \ + --enable-sp-asm --disable-examples --disable-silent-rules + + - name: Make sure OPENSSL_COMPATIBLE_DEFAULTS is not present in options.h + run: | + ! grep OPENSSL_COMPATIBLE_DEFAULTS wolfssl/options.h + + - name: Build wolfSSL .deb + run: make deb-docker + + - name: Build wolfSSL .rpm + run: make rpm-docker + + - name: Confirm packages built + run: | + DEB_COUNT=$(find -name 'libwolfssl*.deb' | wc -l) + if [ "$DEB_COUNT" != "2" ]; then + echo Did not find exactly two deb packages!!! + exit 1 + fi + RPM_COUNT=$(find -name 'wolfssl*.rpm' | wc -l) + if [ "$RPM_COUNT" != "4" ]; then + echo Did not find exactly four rpm packages!!! + exit 1 + fi diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/pam-ipmi.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/pam-ipmi.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/pam-ipmi.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/pam-ipmi.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,86 @@ +name: pam-ipmi Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + + +jobs: + build_wolfssl: + name: Build wolfSSL + # Just to keep it the same as the testing target + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-all + install: true + # Don't run tests as this config is tested in many other places + check: false + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-pam-ipmi + path: build-dir + retention-days: 5 + + build_pam-ipmi: + strategy: + fail-fast: false + matrix: + git_ref: [ e4b13e6725abb178f62ee897fe1c0e81b06a9431 ] + name: ${{ matrix.git_ref }} + runs-on: ubuntu-latest + needs: build_wolfssl + steps: + - name: Install dependencies + run: | + # Don't prompt for anything + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + sudo apt-get install libpam-dev ninja-build + sudo pip3 install meson + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-pam-ipmi + path: build-dir + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Checkout pam-ipmi + uses: actions/checkout@v4 + with: + repository: openbmc/pam-ipmi + path: pam-ipmi + ref: ${{ matrix.git_ref }} + + - name: Build pam-ipmi + working-directory: pam-ipmi + run: | + patch -p1 < ../osp/pam-ipmi/*-${{ matrix.git_ref }}.patch + PKG_CONFIG_PATH=$GITHUB_WORKSPACE/build-dir/lib/pkgconfig meson setup build + ninja -C build + + - name: Confirm built with wolfSSL + working-directory: pam-ipmi + run: | + ldd ./build/src/pam_ipmisave/pam_ipmisave.so | grep wolfssl diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/socat.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/socat.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/socat.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/socat.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,76 @@ +name: socat Tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + build_wolfssl: + name: Build wolfSSL + runs-on: ubuntu-latest + timeout-minutes: 4 + steps: + - name: Build wolfSSL + uses: wolfSSL/actions-build-autotools-project@v1 + with: + path: wolfssl + configure: --enable-maxfragment --enable-opensslall --enable-opensslextra --enable-dtls --enable-oldtls --enable-tlsv10 --enable-ipv6 'CPPFLAGS=-DWOLFSSL_NO_DTLS_SIZE_CHECK -DOPENSSL_COMPATIBLE_DEFAULTS' + install: true + + - name: Upload built lib + uses: actions/upload-artifact@v4 + with: + name: wolf-install-socat + path: build-dir + retention-days: 3 + + + socat_check: + strategy: + fail-fast: false + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 30 + needs: build_wolfssl + steps: + - name: Install prereqs + run: + sudo apt-get install build-essential autoconf libtool pkg-config clang libc++-dev + + - name: Download lib + uses: actions/download-artifact@v4 + with: + name: wolf-install-socat + path: build-dir + + - name: Download socat + run: curl -O http://www.dest-unreach.org/socat/download/socat-1.8.0.0.tar.gz && tar xvf socat-1.8.0.0.tar.gz + + - name: Checkout OSP + uses: actions/checkout@v4 + with: + repository: wolfssl/osp + path: osp + + - name: Build socat + working-directory: ./socat-1.8.0.0 + run: | + patch -p1 < ../osp/socat/1.8.0.0/socat-1.8.0.0.patch + autoreconf -vfi + ./configure --with-wolfssl=$GITHUB_WORKSPACE/build-dir + make + + - name: Run socat tests + working-directory: ./socat-1.8.0.0 + run: | + export LD_LIBRARY_PATH=$GITHUB_WORKSPACE/build-dir/lib:$LD_LIBRARY_PATH + export SHELL=/bin/bash + SOCAT=$GITHUB_WORKSPACE/socat-1.8.0.0/socat ./test.sh -t 0.5 --expect-fail 146,216,309,310,386,399,402,459,460,467,468,478,492,528,530 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/stunnel.yml 2024-08-03 07:30:00.000000000 +0000 @@ -1,13 +1,24 @@ name: stunnel Tests +# START OF COMMON SECTION on: - workflow_call: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION jobs: build_wolfssl: name: Build wolfSSL # Just to keep it the same as the testing target runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 steps: - name: Build wolfSSL uses: wolfSSL/actions-build-autotools-project@v1 @@ -17,11 +28,11 @@ install: true - name: Upload built lib - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wolf-install-stunnel path: build-dir - retention-days: 1 + retention-days: 5 stunnel_check: strategy: @@ -31,16 +42,18 @@ ref: [ 5.67 ] name: ${{ matrix.ref }} runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 4 needs: build_wolfssl steps: - name: Download lib - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wolf-install-stunnel path: build-dir - name: Checkout OSP - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: repository: wolfssl/osp path: osp diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml --- mariadb-10.11.6/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.github/workflows/zephyr.yml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,128 @@ +name: Zephyr tests + +# START OF COMMON SECTION +on: + push: + branches: [ 'master', 'main', 'release/**' ] + pull_request: + branches: [ '*' ] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +# END OF COMMON SECTION + +jobs: + run_test: + name: Build and run + strategy: + fail-fast: false + matrix: + config: + - zephyr-ref: v3.4.0 + zephyr-sdk: 0.16.1 + - zephyr-ref: v3.5.0 + zephyr-sdk: 0.16.3 + - zephyr-ref: v2.7.4 + zephyr-sdk: 0.16.3 + runs-on: ubuntu-latest + # This should be a safe limit for the tests to run. + timeout-minutes: 25 + steps: + - name: Install dependencies + run: | + # Don't prompt for anything + export DEBIAN_FRONTEND=noninteractive + sudo apt-get update + # most of the ci-base zephyr docker image packages + sudo apt-get install -y zip bridge-utils uml-utilities \ + git cmake ninja-build gperf ccache dfu-util device-tree-compiler wget \ + python3-dev python3-pip python3-setuptools python3-tk python3-wheel xz-utils file \ + make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1 \ + autoconf automake bison build-essential ca-certificates cargo ccache chrpath cmake \ + cpio device-tree-compiler dfu-util diffstat dos2unix doxygen file flex g++ gawk gcc \ + gcovr git git-core gnupg gperf gtk-sharp2 help2man iproute2 lcov libcairo2-dev \ + libglib2.0-dev libgtk2.0-0 liblocale-gettext-perl libncurses5-dev libpcap-dev \ + libpopt0 libsdl1.2-dev libsdl2-dev libssl-dev libtool libtool-bin locales make \ + net-tools ninja-build openssh-client parallel pkg-config python3-dev python3-pip \ + python3-ply python3-setuptools python-is-python3 qemu rsync socat srecord sudo \ + texinfo unzip wget ovmf xz-utils + + - name: Install west + run: sudo pip install west + + - name: Init west workspace + run: west init --mr ${{ matrix.config.zephyr-ref }} zephyr + + - name: Update west.yml + working-directory: zephyr/zephyr + run: | + REF=$(echo '${{ github.ref }}' | sed -e 's/\//\\\//g') + sed -e 's/remotes:/remotes:\n \- name: wolfssl\n url\-base: https:\/\/github.com\/${{ github.repository_owner }}/' -i west.yml + sed -e "s/projects:/projects:\n \- name: wolfssl\n path: modules\/crypto\/wolfssl\n remote: wolfssl\n revision: $REF/" -i west.yml + + - name: Update west workspace + working-directory: zephyr + run: west update -n -o=--depth=1 + + - name: Export zephyr + working-directory: zephyr + run: west zephyr-export + + - name: Install pip dependencies + working-directory: zephyr + run: sudo pip install -r zephyr/scripts/requirements.txt + + - name: Install zephyr SDK + run: | + wget -q https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${{ matrix.config.zephyr-sdk }}/zephyr-sdk-${{ matrix.config.zephyr-sdk }}_linux-x86_64_minimal.tar.xz + tar xf zephyr-sdk-${{ matrix.config.zephyr-sdk }}_linux-x86_64_minimal.tar.xz + cd zephyr-sdk-${{ matrix.config.zephyr-sdk }} + ./setup.sh -h -c -t x86_64-zephyr-elf + + - name: Fix options for 2.7.4 + if: ${{ matrix.config.zephyr-ref == 'v2.7.4' }} + working-directory: zephyr/modules/crypto/wolfssl + run: | + sed -i -e 's/CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE/CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE/g' $(find -name prj.conf) + + - name: Run wolfssl test + id: wolfssl-test + working-directory: zephyr + run: | + ./zephyr/scripts/twister -T modules/crypto/wolfssl --test zephyr/samples/wolfssl_test/sample.crypto.wolfssl_test -vvv + rm -rf zephyr/twister-out + ./zephyr/scripts/twister -T modules/crypto/wolfssl --test zephyr/samples/wolfssl_test/sample.crypto.wolfssl_test_no_malloc -vvv + rm -rf zephyr/twister-out + + - name: Run wolfssl TLS sock test + # Results in a page fault that I can't trace + if: ${{ matrix.config.zephyr-ref != 'v2.7.4' }} + id: wolfssl-tls-sock + working-directory: zephyr + run: | + ./zephyr/scripts/twister -T modules/crypto/wolfssl --test zephyr/samples/wolfssl_tls_sock/sample.crypto.wolfssl_tls_sock -vvv + rm -rf zephyr/twister-out + ./zephyr/scripts/twister -T modules/crypto/wolfssl --test zephyr/samples/wolfssl_tls_sock/sample.crypto.wolfssl_tls_sock_no_malloc -vvv + rm -rf zephyr/twister-out + + - name: Run wolfssl TLS thread test + if: ${{ matrix.config.zephyr-ref != 'v2.7.4' }} + id: wolfssl-tls-thread + working-directory: zephyr + run: | + ./zephyr/scripts/twister -T modules/crypto/wolfssl --test zephyr/samples/wolfssl_tls_thread/sample.crypto.wolfssl_tls_thread -vvv + rm -rf zephyr/twister-out + + - name: Zip failure logs + if: ${{ failure() && (steps.wolfssl-test.outcome == 'failure' || steps.wolfssl-tls-sock.outcome == 'failure' || steps.wolfssl-tls-thread.outcome == 'failure') }} + run: | + zip -9 -r logs.zip zephyr/twister-out + + - name: Upload failure logs + if: ${{ failure() && (steps.wolfssl-test.outcome == 'failure' || steps.wolfssl-tls-sock.outcome == 'failure' || steps.wolfssl-tls-thread.outcome == 'failure') }} + uses: actions/upload-artifact@v4 + with: + name: zephyr-client-test-logs + path: logs.zip + retention-days: 5 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/.gitignore 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/.gitignore 2024-08-03 07:30:00.000000000 +0000 @@ -10,7 +10,7 @@ *.cache .dirstamp *.user -configure +configure config.* !cmake/config.in *Debug/ @@ -64,6 +64,8 @@ ctaocrypt/test/testctaocrypt wolfcrypt/benchmark/benchmark wolfcrypt/test/testwolfcrypt +examples/async/async_client +examples/async/async_server examples/benchmark/tls_bench examples/client/client examples/echoclient/echoclient @@ -74,20 +76,25 @@ examples/sctp/sctp-client examples/sctp/sctp-client-dtls examples/asn1/asn1 +examples/pem/pem server_ready snifftest output mcapi/test testsuite/testsuite -tests/unit testsuite/testsuite.test +testsuite/*.der +testsuite/*.pem +testsuite/*.raw +testsuite/*.obj +testsuite/*.pdb +testsuite/*.idb +tests/unit tests/unit.test tests/bio_write_test.txt tests/test-log-dump-to-file.txt +tests/cert_cache.tmp test-write-dhparams.pem -testsuite/*.der -testsuite/*.pem -testsuite/*.raw cert.der cert.pem certecc.der @@ -282,23 +289,6 @@ mqx/wolfcrypt_benchmark/.cwGeneratedFileSetLog mqx/wolfcrypt_benchmark/SaAnalysispointsManager.apconfig -# User Crypto example build -wolfcrypt/user-crypto/aclocal.m4 -wolfcrypt/user-crypto/config.guess -wolfcrypt/user-crypto/autom4te.cache -wolfcrypt/user-crypto/config.log -wolfcrypt/user-crypto/config.status -wolfcrypt/user-crypto/config.sub -wolfcrypt/user-crypto/depcomp -wolfcrypt/user-crypto/install-sh -wolfcrypt/user-crypto/libtool -wolfcrypt/user-crypto/ltmain.sh -wolfcrypt/user-crypto/m4 -wolfcrypt/user-crypto/missing -wolfcrypt/user-crypto/Makefile.in -wolfcrypt/user-crypto/lib/libusercrypto.* -*.hzs - # wolfSSL CSharp wrapper wrapper/CSharp/x64/ @@ -335,6 +325,10 @@ # Arduino Generated Files /IDE/ARDUINO/wolfSSL scripts/memtest.txt +/IDE/ARDUINO/Arduino_README_prepend.md.tmp +/IDE/ARDUINO/library.properties.tmp +/IDE/ARDUINO/library.properties.tmp.backup +/IDE/ARDUINO/PREPENDED_README.md # Doxygen generated files doc/doxygen_warnings @@ -343,6 +337,8 @@ # XCODE Index IDE/XCODE/Index +IDE/**/xcshareddata +IDE/**/DerivedData # ARM DS-5 && Eclipse \.settings/ @@ -403,17 +399,45 @@ XXX-fips-test # ASYNC -async +/wolfAsyncCrypt +/async # Generated user_settings_asm.h. user_settings_asm.h -# VisualGD +# VisualGDB **/.visualgdb # Espressif sdk config default should be saved in sdkconfig.defaults # we won't track the actual working sdkconfig files /IDE/Espressif/**/sdkconfig +/IDE/Espressif/**/sdkconfig.old + +# MPLAB +/IDE/MPLABX16/wolfssl.X/dist/default/ +/IDE/MPLABX16/wolfssl.X/.generated_files +/IDE/MPLABX16/wolfcrypt_test.X/dist/default/ +/IDE/MPLABX16/wolfcrypt_test.X/.generated_files # auto-created CMake backups **/CMakeLists.txt.old + +# MagicCrypto (ARIA Cipher) +MagicCrypto + +# CMake build directory +/out +/out_temp + +# debian packaging +debian/changelog +debian/control +*.deb + +# PlatformIO +/**/.pio +/**/.vscode/.browse.c_cpp.db* +/**/.vscode/c_cpp_properties.json +/**/.vscode/launch.json +/**/.vscode/ipch +/**/sdkconfig.esp32dev diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -# CMakeList.txt +# CMakeLists.txt # -# Copyright (C) 2006-2023 wolfSSL Inc. +# Copyright (C) 2006-2024 wolfSSL Inc. # # This file is part of wolfSSL. (formerly known as CyaSSL) # @@ -21,6 +21,12 @@ cmake_minimum_required(VERSION 3.16) +if(${CMAKE_VERSION} VERSION_LESS "3.22") + message(STATUS "This project recommends using CMake version 3.22 or higher. You are using ${CMAKE_VERSION}.") +else() + cmake_policy(SET CMP0128 NEW) +endif() + if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") message(FATAL_ERROR "In-source builds are not allowed.\ Run cmake from a separate directory from where CMakeLists.txt lives.\ @@ -28,19 +34,33 @@ You must delete them, or cmake will refuse to work.") endif() -project(wolfssl VERSION 5.6.3 LANGUAGES C ASM) +project(wolfssl VERSION 5.7.2 LANGUAGES C ASM) + +# Set WOLFSSL_ROOT if not already defined +if ("${WOLFSSL_ROOT}" STREQUAL "") + # we'll assume this CMakeLists.txt is in the root of wolfSSL + if (EXISTS "${CMAKE_SOURCE_DIR}/wolfcrypt/src/") + get_filename_component(WOLFSSL_ROOT "${CMAKE_SOURCE_DIR}" ABSOLUTE) + message(STATUS "Found WOLFSSL_ROOT = ${WOLFSSL_ROOT}") + endif() +else() + message(STATUS "Using predefined WOLFSSL_ROOT = ${WOLFSSL_ROOT}") +endif() # shared library versioning -# increment if interfaces have been added, removed or changed -set(LIBTOOL_CURRENT 40) -# increment if source code has changed set to zero if current is incremented -set(LIBTOOL_REVISION 1) -# increment if interfaces have been added set to zero if interfaces have been -# removed or changed -set(LIBTOOL_AGE 5) +# increment if interfaces have been removed or changed +set(WOLFSSL_LIBRARY_VERSION_FIRST 42) + +# increment if interfaces have been added +# set to zero if WOLFSSL_LIBRARY_VERSION_FIRST is incremented +set(WOLFSSL_LIBRARY_VERSION_SECOND 2) + +# increment if source code has changed +# set to zero if WOLFSSL_LIBRARY_VERSION_FIRST is incremented or +# WOLFSSL_LIBRARY_VERSION_SECOND is incremented +set(WOLFSSL_LIBRARY_VERSION_THIRD 0) -math(EXPR LIBTOOL_SO_VERSION "${LIBTOOL_CURRENT} - ${LIBTOOL_AGE}") -set(LIBTOOL_FULL_VERSION ${LIBTOOL_SO_VERSION}.${LIBTOOL_AGE}.${LIBTOOL_REVISION}) +set(LIBTOOL_FULL_VERSION ${WOLFSSL_LIBRARY_VERSION_FIRST}.${WOLFSSL_LIBRARY_VERSION_SECOND}.${WOLFSSL_LIBRARY_VERSION_THIRD}) set(WOLFSSL_DEFINITIONS) set(WOLFSSL_LINK_LIBS) @@ -116,11 +136,18 @@ # but we want it as 1. if(HAVE___UINT128_T) set(HAVE___UINT128_T "1" CACHE INTERNAL "Result of TRY_COMPILE" FORCE) + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE___UINT128_T") endif() -include(TestBigEndian) - -test_big_endian(WORDS_BIGENDIAN) +if(CMAKE_VERSION VERSION_LESS "3.20") + # TestBigEndian was deprecated in 3.20 + include(TestBigEndian) + test_big_endian(IS_BIG_ENDIAN) + set(CMAKE_C_BYTE_ORDER "LITTLE_ENDIAN") + if(IS_BIG_ENDIAN) + set(CMAKE_C_BYTE_ORDER "BIG_ENDIAN") + endif() +endif() # Thread local storage include(CheckCSourceCompiles) @@ -203,6 +230,8 @@ set(CMAKE_C_ARCHIVE_FINISH " -D ") endif() +add_option("WOLFSSL_INSTALL" "Create install target for WolfSSL project" "yes" "yes;no") + # Support for forcing 32-bit mode # TODO: detect platform from other options add_option("WOLFSSL_32BIT" @@ -255,6 +284,20 @@ "-DHAVE_PTHREAD" "-D_POSIX_THREADS") endif() +else() + list(APPEND WOLFSSL_DEFINITIONS "-DSINGLE_THREADED") +endif() + +# DTLS-SRTP +add_option("WOLFSSL_SRTP" + "Enables wolfSSL DTLS-SRTP (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_SRTP) + list(APPEND WOLFSSL_DEFINITIONS + "-DWOLFSSL_SRTP") + set(WOLFSSL_DTLS "yes") + set(WOLFSSL_KEYING_MATERIAL "yes") endif() @@ -353,6 +396,83 @@ list(APPEND WOLFSSL_DEFINITIONS "-DWC_NO_RNG") endif() +# QUIC +add_option(WOLFSSL_QUIC + "Enable QUIC support (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_QUIC) + set(WOLFSSL_ALPN "yes") + set(WOLFSSL_OPENSSLEXTRA "yes") + set(WOLFSSL_AESCTR "yes") + set(WOLFSSL_CURVE25519 "yes") + set(WOLFSSL_SNI "yes") + list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_QUIC" "-DHAVE_EX_DATA") +endif() + +# Curl +add_option(WOLFSSL_CURL + "Enable CURL support (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_CURL) + set(WOLFSSL_MD4 "yes") + set(WOLFSSL_DES3 "yes") + set(WOLFSSL_ALPN "yes") + set(WOLFSSL_OPENSSLEXTRA "yes") + set(WOLFSSL_CRL "yes") + set(WOLFSSL_OCSP "yes") + set(WOLFSSL_OCSPSTAPLING "yes") + set(WOLFSSL_OCSPSTAPLING_V2 "yes") + set(WOLFSSL_SNI "yes") + set(WOLFSSL_ALT_CERT_CHAINS "yes") + set(WOLFSSL_IP_ALT_NAME "yes") + set(WOLFSSL_SESSION_TICKET "yes") + set(WOLFSSL_WOLFSSH "yes") + list(APPEND WOLFSSL_DEFINITIONS + "-DNO_SESSION_CACHE_REF" "-DWOLFSSL_DES_ECB") +endif() + +# ALPN +add_option(WOLFSSL_ALPN + "Enable ALPN support (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_ALPN) + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ALPN" "-DHAVE_TLS_EXTENSIONS") +endif() + +# altcertchains +add_option(WOLFSSL_ALT_CERT_CHAINS + "Enable support for Alternate certification chains (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_ALT_CERT_CHAINS) + list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_ALT_CERT_CHAINS") +endif() + +# ip-alt-name +add_option(WOLFSSL_IP_ALT_NAME + "Enable support for IP alternative name (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_IP_ALT_NAME) + list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_IP_ALT_NAME") +endif() + +# wolfSSH +add_option(WOLFSSL_WOLFSSH + "Enable support for wolfSSH (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_WOLFSSH) + list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_WOLFSSH") +endif() + +if(WOLFSSL_WOLFSSH OR WOLFSSL_WPAS) + list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_PUBLIC_MP") +endif() + # TODO: - DTLS-SCTP # - DTLS multicast # - OpenSSH @@ -362,14 +482,11 @@ # - wpa_supplicant # - Fortress # - libwebsockets -# - IP alternative name # - Qt # - SSL bump # - sniffer # - Signal # - OpenSSL coexist -# - OpenSSL compatibility all -# - OpenSSL compatibility extra # - Max strength # Harden, enable Timing Resistance and Blinding by default @@ -411,12 +528,7 @@ if (WOLFSSL_OPENSSLEXTRA AND NOT WOLFSSL_OPENSSLCOEXIST) list(APPEND WOLFSSL_DEFINITIONS - "-DOPENSSL_EXTRA" - "-DWOLFSSL_ALWAYS_VERIFY_CB" - "-DWOLFSSL_VERIFY_CB_ALL_CERTS" - "-DWOLFSSL_EXTRA_ALERTS" - "-DHAVE_EXT_CACHE" - "-DWOLFSSL_FORCE_CACHE_ON_TICKET") + "-DOPENSSL_EXTRA") endif() if (WOLFSSL_OPENSSLALL) @@ -426,6 +538,14 @@ "-DWOLFSSL_ERROR_CODE_OPENSSL" "-DWOLFSSL_CERT_NAME_ALL") endif() +add_option(WOLFSSL_NO_STUB + "Removes OpenSSL compatibility stub functions (default: disabled)" + "no" "yes;no") + +if (WOLFSSL_NO_STUB) + list(APPEND WOLFSSL_DEFINITIONS + "-DNO_WOLFSSL_STUB") +endif() # TODO: - IPv6 test apps @@ -436,16 +556,89 @@ "Enable integration with the OQS (Open Quantum Safe) liboqs library (default: disabled)" "no" "yes;no") -if (WOLFSSL_OQS) - find_package(OQS) +# Kyber +add_option(WOLFSSL_KYBER + "Enable the wolfSSL PQ Kyber library (default: disabled)" + "no" "yes;no") + +# Experimental features +add_option(WOLFSSL_EXPERIMENTAL + "Enable experimental features (default: disabled)" + "no" "yes;no") + +message(STATUS "Looking for WOLFSSL_EXPERIMENTAL") +if (WOLFSSL_EXPERIMENTAL) + message(STATUS "Looking for WOLFSSL_EXPERIMENTAL - found") + + # We've enabled the experimental environment, but let's + # check if any experimental features are also enabled: + set(WOLFSSL_FOUND_EXPERIMENTAL_FEATURE 0) + + set_wolfssl_definitions("WOLFSSL_EXPERIMENTAL_SETTINGS" RESUlT) + + # Checking for experimental feature: OQS + message(STATUS "Looking for WOLFSSL_OQS") + if (WOLFSSL_OQS) + set(WOLFSSL_FOUND_EXPERIMENTAL_FEATURE 1) + message(STATUS "Looking for WOLFSSL_OQS - found") + + message(STATUS "Checking OQS") + find_package(OQS) + if (OQS_FOUND) + message(STATUS "Checking OQS - found") + list(APPEND WOLFSSL_LINK_LIBS ${OQS_LIBRARY}) + list(APPEND WOLFSSL_INCLUDE_DIRS ${OQS_INCLUDE_DIR}) + + set_wolfssl_definitions("HAVE_LIBOQS" RESUlT) + set_wolfssl_definitions("HAVE_TLS_EXTENSIONS" RESUlT) + set_wolfssl_definitions("OPENSSL_EXTRA" RESUlT) - if (OQS_FOUND) - list(APPEND WOLFSSL_LINK_LIBS ${OQS_LIBRARY}) - list(APPEND WOLFSSL_INCLUDE_DIRS ${OQS_INCLUDE_DIR}) - set(HAVE_LIBOQS 1) - list(APPEND WOLFSSL_DEFINITIONS - "-DHAVE_TLS_EXTENSIONS" - "-DHAVE_LIBOQS") + else() + message(STATUS "Checking OQS - not found") + message(STATUS "WARNING: WOLFSSL_OQS enabled but not found: OQS_LIBRARY=${OQS_LIBRARY}, OQS_INCLUDE_DIR=${OQS_INCLUDE_DIR} ") + endif() + else() + message(STATUS "Looking for WOLFSSL_OQS - not found") + endif() + + # Checking for experimental feature: Kyber + message(STATUS "Looking for WOLFSSL_KYBER") + if (WOLFSSL_KYBER) + set(WOLFSSL_FOUND_EXPERIMENTAL_FEATURE 1) + + message(STATUS "Automatically set related requirements for Kyber:") + set_wolfssl_definitions("WOLFSSL_HAVE_KYBER" RESUlT) + set_wolfssl_definitions("WOLFSSL_WC_KYBER" RESUlT) + set_wolfssl_definitions("WOLFSSL_SHA3" RESUlT) + set_wolfssl_definitions("WOLFSSL_SHAKE128" RESUlT) + set_wolfssl_definitions("WOLFSSL_SHAKE256" RESUlT) + message(STATUS "Looking for WOLFSSL_KYBER - found") + else() + message(STATUS "Looking for WOLFSSL_KYBER - not found") + endif() + + # Other experimental feature detection can be added here... + + # Were any experimental features found? Display a message. + if(WOLFSSL_FOUND_EXPERIMENTAL_FEATURE) + message(STATUS "WOLFSSL_EXPERIMENTAL enabled, experimental features enabled.") + else() + message(STATUS "Warning: WOLFSSL_EXPERIMENTAL enabled, but no experimental features enabled.") + endif() + + # Sanity checks + if(WOLFSSL_OQS AND WOLFSSL_KYBER) + message(FATAL_ERROR "Error: cannot enable both WOLFSSL_OQS and WOLFSSL_KYBER at the same time.") + endif() + +else() + # Experimental mode not enabled, but were any experimental features enabled? Error out if so: + message(STATUS "Looking for WOLFSSL_EXPERIMENTAL - not found") + if (WOLFSSL_OQS) + message(FATAL_ERROR "Error: WOLFSSL_OQS requires WOLFSSL_EXPERIMENTAL at this time.") + endif() + if(WOLFSSL_KYBER) + message(FATAL_ERROR "Error: WOLFSSL_KYBER requires WOLFSSL_EXPERIMENTAL at this time.") endif() endif() @@ -462,6 +655,9 @@ # - Atomic user record layer # - Public key callbacks # - Microchip/Atmel CryptoAuthLib +# - XMSS +# - LMS +# - dual-certs # AES-CBC add_option("WOLFSSL_AESCBC" @@ -482,7 +678,7 @@ override_cache(WOLFSSL_AESGCM "no") endif() -if(WOLFSSL_AESGCM AND NOT WORDS_BIGENDIAN) +if(WOLFSSL_AESGCM AND CMAKE_C_BYTE_ORDER STREQUAL "LITTLE_ENDIAN") override_cache(WOLFSSL_AESGCM "4bit") endif() @@ -510,6 +706,15 @@ list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_AESGCM") endif() +if(WOLFSSL_QUIC) + if(NOT WOLFSSL_TLS13) + message(FATAL_ERROR "TLS 1.3 is disabled - necessary for QUIC") + endif() + if(NOT WOLFSSL_AESGCM) + message(FATAL_ERROR "AES-GCM is disabled - necessary for QUIC") + endif() +endif() + # AES-SIV add_option("WOLFSSL_AESSIV" "Enable wolfSSL AES-SIV support (default: disabled)" @@ -536,6 +741,11 @@ "-DWOLFSSL_AES_DIRECT") endif() +# ARIA +add_option("WOLFSSL_ARIA" + "Enable wolfSSL ARIA support (default: disabled)" + "no" "yes;no") + # AES-CCM add_option("WOLFSSL_AESCCM" "Enable wolfSSL AES-CCM support (default: disabled)" @@ -1099,6 +1309,14 @@ override_cache(WOLFSSL_DES3 "yes") endif() +# DES3 TLS Suites +set(WOLFSSL_DES3_TLS_SUITES_STRING "Enable DES3 TLS cipher suites (default: disabled)") +add_option("WOLFSSL_DES3_TLS_SUITES" ${WOLFSSL_DES3_TLS_SUITES_STRING} "no" "yes;no") + +if(NOT WOLFSSL_DES3_TLS_SUITES) + list(APPEND WOLFSSL_DEFINITIONS "-DNO_DES3_TLS_SUITES") +endif() + # ARC4 set(WOLFSSL_ARC4_HELP_STRING "Enable ARC4 (default: disabled)") add_option("WOLFSSL_ARC4" ${WOLFSSL_ARC4_HELP_STRING} "no" "yes;no") @@ -1299,7 +1517,6 @@ # - CRL monitor # - User crypto # - Whitewood netRandom client library -# - SNI # - Max fragment length # - ALPN # - Trusted CA indication @@ -1315,12 +1532,27 @@ "Enable CRL (Use =io for inline CRL HTTP GET) (default: disabled)" "no" "yes;no;io") + +set(SNI_DEFAULT "no") +if(("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64|x86|AMD64|arm64") OR + ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")) + set(SNI_DEFAULT "yes") +endif() set(WOLFSSL_SNI_HELP_STRING "Enable SNI (default: disabled)") -add_option(WOLFSSL_SNI ${WOLFSSL_SNI_HELP_STRING} "no" "yes;no") +add_option(WOLFSSL_SNI ${WOLFSSL_SNI_HELP_STRING} ${SNI_DEFAULT} "yes;no") set(WOLFSSL_TLSX_HELP_STRING "Enable all TLS Extensions (default: disabled)") add_option(WOLFSSL_TLSX ${WOLFSSL_TLSX_HELP_STRING} "no" "yes;no") +add_option(WOLFSSL_EX_DATA + "Enable app data (default: disabled)" + "no" "yes;no") + +if (WOLFSSL_EX_DATA) + list(APPEND WOLFSSL_DEFINITIONS + "-DHAVE_EX_DATA") +endif() + # Supported elliptic curves extensions add_option("WOLFSSL_SUPPORTED_CURVES" "Enable Supported Elliptic Curves (default: enabled)" @@ -1406,7 +1638,6 @@ # TODO: - TLS extensions # - Early data handshake -# - wolfSSH options # - SCEP # - Secure remote password # - Indefinite length encoded messages @@ -1552,17 +1783,17 @@ list(APPEND WOLFSSL_DEFINITIONS "-DUSE_FAST_MATH") set(WOLFSSL_SLOWMATH "no") endif() - - if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64|AMD64") - # Have settings.h set FP_MAX_BITS higher if user didn't set directly - list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_X86_64_BUILD") - endif() endif() # TODO: - Fast huge math +# Set processor-specific build macros if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64|AMD64") + set(WOLFSSL_X86_64_BUILD ON) + add_option("WOLFSSL_X86_64_BUILD_ASM" "Build ASM files" "yes" "yes;no") list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_X86_64_BUILD") +elseif("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64|arm64") + list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_AARCH64_BUILD") endif() # SP math all @@ -1640,13 +1871,15 @@ list(APPEND WOLFSSL_DEFINITIONS "-DWC_NO_ASYNC_THREADING") endif() -# TODO: - cryptodev -# - Session export +# TODO: - Session export add_option("WOLFSSL_CRYPTOCB" "Enable crypto callbacks (default: disabled)" "no" "yes;no") +add_option("WOLFSSL_PKCALLBACKS" + "Enable public key callbacks (default: disabled)" + "no" "yes;no") add_option("WOLFSSL_OLD_NAMES" "Keep backwards compat with old names (default: enabled)" @@ -1704,22 +1937,38 @@ message("Can't enable system CA certs without a filesystem.") override_cache(WOLFSSL_SYS_CA_CERTS "no") elseif(APPLE) + # Headers used for MacOS default system CA certs behavior. Only MacOS SDK will have this header check_include_file("Security/SecTrustSettings.h" HAVE_SECURITY_SECTRUSTSETTINGS_H) - if(NOT HAVE_SECURITY_SECTRUSTSETTINGS_H) - message("Can't enable system CA certs without Security/SecTrustSettings.h.") - override_cache(WOLFSSL_SYS_CA_CERTS "no") - else() + # Headers used for Apple native cert validation. All device SDKs should have these headers + check_include_file("Security/SecCertificate.h" HAVE_SECURITY_SECCERTIFICATE_H) + check_include_file("Security/SecTrust.h" HAVE_SECURITY_SECTRUST_H) + check_include_file("Security/SecPolicy.h" HAVE_SECURITY_SECPOLICY_H) + # Either Security/SecTrustSettings (for MacOS cert loading), or the + # trio of Security/SecCertificate.h, Security/SecTrust.h, and + # Security/SecPolicy.h (for native trust APIs on other apple devices) + # must be present. Default to SecTrustSettings method on MacOS. + if(HAVE_SECURITY_SECTRUSTSETTINGS_H OR (HAVE_SECURITY_SECCERTIFICATE_H + AND HAVE_SECURITY_SECTRUST_H + AND HAVE_SECURITY_SECPOLICY_H)) find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation) if(NOT CORE_FOUNDATION_FRAMEWORK) - message("Can't enable system CA certs without CoreFoundation framework.") - override_cache(WOLFSSL_SYS_CA_CERTS "no") + message(FATAL_ERROR "Can't enable system CA certs without CoreFoundation framework.") else() find_library(SECURITY_FRAMEWORK Security) if(NOT SECURITY_FRAMEWORK) - message("Can't enable system CA certs without Security framework.") - override_cache(WOLFSSL_SYS_CA_CERTS "no") + message(FATAL_ERROR "Can't enable system CA certs without Security framework.") endif() endif() + + # MacOS should not use native cert validation by default, but other apple devices should. + if(NOT HAVE_SECURITY_SECTRUSTSETTINGS_H AND HAVE_SECURITY_SECCERTIFICATE_H + AND HAVE_SECURITY_SECTRUST_H + AND HAVE_SECURITY_SECPOLICY_H) + list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_APPLE_NATIVE_CERT_VALIDATION") + endif() + + else() + message(FATAL_ERROR "Can't enable system CA certs without Apple Security.framework headers.") endif() endif() @@ -1774,6 +2023,42 @@ ) endif() +# Hybrid Public Key Encryption (RFC9180) +add_option("WOLFSSL_HPKE" + "Enable wolfSSL hybrid public key encryption (default: disabled)" + "no" "yes;no") + +# Encrypted Client Hello (ECH) +add_option("WOLFSSL_ECH" + "Enable wolfSSL encrypted client hello (default: disabled)" + "no" "yes;no") + +# Keying Material Exporter / TLS Exporter +add_option("WOLFSSL_KEYING_MATERIAL" + "Enable wolfSSL keying material export (default: disabled)" + "no" "yes;no") + +if(WOLFSSL_HPKE) + if(NOT WOLFSSL_ECC) + message(FATAL_ERROR "HPKE supported only with ECC (WOLFSSL_ECC)") + endif() + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_HPKE") + override_cache(WOLFSSL_HKDF "yes") +endif() + +if(WOLFSSL_ECH) + if(NOT WOLFSSL_HPKE) + message(FATAL_ERROR "ECH supported only with HPKE (WOLFSSL_HPKE)") + endif() + if(NOT WOLFSSL_SNI) + message(FATAL_ERROR "ECH supported only with SNI (WOLFSSL_SNI)") + endif() + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ECH") +endif() + +if(WOLFSSL_KEYING_MATERIAL) + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_KEYING_MATERIAL") +endif() if(WOLFSSL_KEYGEN) list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_KEY_GEN") @@ -1795,6 +2080,11 @@ list(APPEND WOLFSSL_DEFINITIONS "-DWOLF_CRYPTO_CB") endif() +# Public Key Callbacks +if(WOLFSSL_PKCALLBACKS) + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_PK_CALLBACKS") +endif() + if(WOLFSSL_OCSPSTAPLING) list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_CERTIFICATE_STATUS_REQUEST" "-DHAVE_TLS_EXTENSIONS") override_cache(WOLFSSL_OCSP "yes") @@ -1841,6 +2131,9 @@ list(APPEND WOLFSSL_DEFINITIONS "-DWOLFSSL_CAAM") endif() +if (WOLFSSL_ARIA) + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ARIA") +endif() # Generates the BUILD_* flags. These control what source files are included in # the library. A series of AM_CONDITIONALs handle this in configure.ac. @@ -1907,7 +2200,7 @@ # Suppress some warnings about separate compilation, inlining add_definitions("-DWOLFSSL_IGNORE_FILE_WARN") # Generate user options header -message("Generating user options header...") +message(STATUS "Generating user options header...") if (${CMAKE_DISABLE_SOURCE_CHANGES}) set(WOLFSSL_BUILD_OUT_OF_TREE_DEFAULT "${CMAKE_DISABLE_SOURCE_CHANGES}") else() @@ -1922,43 +2215,46 @@ set(WOLFSSL_OUTPUT_BASE ${CMAKE_CURRENT_SOURCE_DIR}) endif() set(OPTION_FILE "${WOLFSSL_OUTPUT_BASE}/wolfssl/options.h") -set(CYASSL_OPTION_FILE "${WOLFSSL_OUTPUT_BASE}/cyassl/options.h") -file(REMOVE ${OPTION_FILE}) +# sccache +add_option("ENABLE_SCCACHE" + "Enable sccache (default: disabled)" + "no" "yes;no") + +if (ENABLE_SCCACHE AND (NOT WOLFSSL_SCCACHE_ALREADY_SET_FLAG)) + find_program(SCCACHE sccache REQUIRED) + if(SCCACHE) + message(STATUS "Enable sccache") -file(APPEND ${OPTION_FILE} "/* wolfssl options.h\n") -file(APPEND ${OPTION_FILE} " * generated from configure options\n") -file(APPEND ${OPTION_FILE} " *\n") -file(APPEND ${OPTION_FILE} " * Copyright (C) 2006-2023 wolfSSL Inc.\n") -file(APPEND ${OPTION_FILE} " *\n") -file(APPEND ${OPTION_FILE} " * This file is part of wolfSSL. (formerly known as CyaSSL)\n") -file(APPEND ${OPTION_FILE} " *\n") -file(APPEND ${OPTION_FILE} " */\n\n") -file(APPEND ${OPTION_FILE} "#ifndef WOLFSSL_OPTIONS_H\n") -file(APPEND ${OPTION_FILE} "#define WOLFSSL_OPTIONS_H\n\n\n") -file(APPEND ${OPTION_FILE} "#ifdef __cplusplus\n") -file(APPEND ${OPTION_FILE} "extern \"C\" {\n") -file(APPEND ${OPTION_FILE} "#endif\n\n") - -add_to_options_file("${WOLFSSL_DEFINITIONS}" "${OPTION_FILE}") -# CMAKE_C_FLAGS is just a string of space-separated flags to pass to the C -# compiler. We need to replace those spaces with semicolons in order to treat it -# as a CMake list. -string(REPLACE " " ";" CMAKE_C_FLAGS_LIST "${CMAKE_C_FLAGS}") -add_to_options_file("${CMAKE_C_FLAGS_LIST}" "${OPTION_FILE}") - -file(APPEND ${OPTION_FILE} "\n#ifdef __cplusplus\n") -file(APPEND ${OPTION_FILE} "}\n") -file(APPEND ${OPTION_FILE} "#endif\n\n\n") -file(APPEND ${OPTION_FILE} "#endif /* WOLFSSL_OPTIONS_H */\n\n") - -# backwards compatibility for those who have included options or version -file(REMOVE ${CYASSL_OPTION_FILE}) -file(APPEND ${CYASSL_OPTION_FILE} "/* cyassl options.h\n") -file(APPEND ${CYASSL_OPTION_FILE} " * generated from wolfssl/options.h\n") -file(APPEND ${CYASSL_OPTION_FILE} " */\n") -file(READ ${OPTION_FILE} OPTION_FILE_CONTENTS) -file(APPEND ${CYASSL_OPTION_FILE} ${OPTION_FILE_CONTENTS}) + if(CMAKE_C_COMPILER_LAUNCHER) + set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_C_COMPILER_LAUNCHER}" "${SCCACHE}") + else() + set(CMAKE_C_COMPILER_LAUNCHER "${SCCACHE}") + endif() + if(CMAKE_CXX_COMPILER_LAUNCHER) + set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_CXX_COMPILER_LAUNCHER}" "${SCCACHE}") + else() + set(CMAKE_CXX_COMPILER_LAUNCHER "${SCCACHE}") + endif() + + if (MSVC) + if(CMAKE_BUILD_TYPE STREQUAL "Debug") + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") + elseif(CMAKE_BUILD_TYPE STREQUAL "Release") + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") + string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") + elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") + endif() + endif() + set(WOLFSSL_SCCACHE_ALREADY_SET_FLAG ON) + endif() +endif() + + +file(REMOVE ${OPTION_FILE}) #################################################### # Library Target @@ -1974,16 +2270,86 @@ # in the *.am files. generate_lib_src_list("${LIB_SOURCES}") if(BUILD_SHARED_LIBS) + message(STATUS "BUILD_SHARED_LIBS enabled: ${LIB_SOURCES}") add_library(wolfssl SHARED ${LIB_SOURCES}) else() + message(STATUS "Static Libs: ${LIB_SOURCES}") add_library(wolfssl STATIC ${LIB_SOURCES}) endif() add_library(wolfssl::wolfssl ALIAS wolfssl) +if (NOT "$ENV{ARIA_DIR}" STREQUAL "") + message(STATUS "Found Environment variable ARIA_DIR=$ENV{ARIA_DIR}") + if(WOLFSSL_ARIA) + message(STATUS "wolfSSL WOLFSSL_ARIA is enabled") + else() + message(STATUS "wolfSSL WOLFSSL_ARIA is not enabled. To enable, specify a user_settings.h file or run: cmake .. -DWOLFSSL_ARIA=yes") + message(STATUS "Clear the ARIA_DIR environment variable to otherwise suppress this message when not using ARIA ciphers.") + endif() +endif() + +# ARIA Check +if(WOLFSSL_ARIA) + message(STATUS "WOLFSSL_ARIA is enabled") + + find_package(ARIA) + + if(ARIA_FOUND) + message(STATUS "ARIA find_package() success.") + else() + message(FATAL_ERROR "WOLFSSL_ARIA is enabled, but find_package() did not find ARIA MagicCrypto.\n" + "Check ARIA_DIR environment variable and/or copy MagicCrypto directory locally.") + endif() + + list(APPEND WOLFSSL_LINK_LIBS "${ARIA_LIB_FILE}") + + # The cmake target_include_directories() will complain about local directories, + # so we'll handle MagicCrypto differently when found in wolfssl. + # see below to use include_directories() instead. + if(ARIA_IS_LOCAL) + # there's also a wolfssl port API to include, plus local ARIA include + include_directories("wolfssl/wolfcrypt/port/aria" "MagicCrypto/include") + else() + # see below for target_include_directories() instead + include_directories("wolfssl/wolfcrypt/port/aria") + message(STATUS "ARIA_IS_LOCAL is false, appending ${ARIA_INCLUDE_DIR} to WOLFSSL_INCLUDE_DIRS") + list(APPEND WOLFSSL_INCLUDE_DIRS "${ARIA_INCLUDE_DIR}") + endif() + + add_library(MagicCrypto_lib + ${CMAKE_CURRENT_SOURCE_DIR}/wolfcrypt/src/port/aria/aria-crypt.c + ${CMAKE_CURRENT_SOURCE_DIR}/wolfcrypt/src/port/aria/aria-cryptocb.c + ) + + set_target_properties(MagicCrypto_lib PROPERTIES OUTPUT_NAME "MagicCrypto") + target_link_libraries(MagicCrypto_lib wolfssl) + target_compile_options(MagicCrypto_lib PRIVATE "-DHAVE_ARIA") + + # ARIA was enabled and we successfully found it. + set(HAVE_ARIA 1) + list(APPEND WOLFSSL_DEFINITIONS "-DHAVE_ARIA") + + message(STATUS "ARIA Check: WOLFSSL_LINK_LIBS = ${WOLFSSL_LINK_LIBS}") +endif() + +foreach(DEF IN LISTS WOLFSSL_DEFINITIONS) + string(REGEX MATCH "^(-D)?([^=]+)(=(.*))?$" DEF_MATCH ${DEF}) + if (DEFINED CMAKE_MATCH_4) + set(${CMAKE_MATCH_2} ${CMAKE_MATCH_4}) + # message("set(${CMAKE_MATCH_2} ${CMAKE_MATCH_4})") + else() + set(${CMAKE_MATCH_2} 1) + # message("set(${CMAKE_MATCH_2} 1)") + endif() +endforeach() + +# If new build options are added please update the cmake/options.h.in +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/options.h.in ${OPTION_FILE}) + set_target_properties(wolfssl PROPERTIES - SOVERSION ${LIBTOOL_SO_VERSION} + SOVERSION ${WOLFSSL_LIBRARY_VERSION_FIRST} VERSION ${LIBTOOL_FULL_VERSION} ) @@ -1997,6 +2363,12 @@ # Include Directories #################################################### +if("${WOLFSSL_INCLUDE_DIRS}" STREQUAL "") + message(STATUS "WOLFSSL_INCLUDE_DIRS is blank. No additional directories will be added.") +else() + message(STATUS "WOLFSSL_INCLUDE_DIRS = ${WOLFSSL_INCLUDE_DIRS}") +endif() + target_include_directories(wolfssl PUBLIC $ @@ -2034,7 +2406,9 @@ # Tests and Examples #################################################### +enable_testing() if(WOLFSSL_EXAMPLES) + # Build wolfSSL client example add_executable(client ${CMAKE_CURRENT_SOURCE_DIR}/examples/client/client.c) @@ -2071,7 +2445,7 @@ PROPERTY RUNTIME_OUTPUT_DIRECTORY ${WOLFSSL_OUTPUT_BASE}/examples/echoserver) - if(NOT WIN32) + if(NOT WIN32 AND NOT WOLFSSL_SINGLE_THREADED) # Build TLS benchmark example add_executable(tls_bench ${CMAKE_CURRENT_SOURCE_DIR}/examples/benchmark/tls_bench.c) @@ -2090,6 +2464,7 @@ tests/suites.c tests/w64wrapper.c tests/unit.c + tests/quic.c examples/server/server.c examples/client/client.c) target_include_directories(unit_test PRIVATE @@ -2103,6 +2478,9 @@ set_property(TARGET unit_test PROPERTY RUNTIME_OUTPUT_NAME unit.test) + add_test(NAME unit_test + COMMAND $ + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) endif() if(WOLFSSL_CRYPT_TESTS) @@ -2142,6 +2520,9 @@ if(WOLFSSL_CRYPT_TESTS_HELP) target_compile_options(wolfcrypttest PRIVATE "-DHAVE_WOLFCRYPT_TEST_OPTIONS") endif() + add_test(NAME wolfcrypttest + COMMAND $ + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) # Build wolfCrypt benchmark executable. add_executable(wolfcryptbench @@ -2165,7 +2546,6 @@ set(HEADER_EXCLUDE "internal.h" - "cyassl/ctaocrypt/port" "wolfssl/wolfcrypt/port/nrf51.h" "wolfssl/wolfcrypt/port/arm" "wolfssl/wolfcrypt/port/cypress" @@ -2287,91 +2667,96 @@ string(PREPEND EXCLUDED_HEADERS_REGEX "(") string(APPEND EXCLUDED_HEADERS_REGEX ")") -set(INSTALLED_EXAMPLES - ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoserver/echoserver.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client-dtls.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server-dtls.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoclient/echoclient.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/server/server.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/benchmark/tls_bench.c - ${CMAKE_CURRENT_SOURCE_DIR}/examples/client/client.c) - -# Install the library -install(TARGETS wolfssl - EXPORT wolfssl-targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - ) -# Install the headers -install(DIRECTORY ${WOLFSSL_OUTPUT_BASE}/wolfssl/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl - FILES_MATCHING PATTERN "*.h" - REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) -install(DIRECTORY ${WOLFSSL_OUTPUT_BASE}/cyassl/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cyassl - FILES_MATCHING PATTERN "*.h" - REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) -install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl - FILES_MATCHING PATTERN "*.h" - REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) -install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cyassl/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/cyassl - FILES_MATCHING PATTERN "*.h" - REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) - - -# Install the examples -install(FILES ${INSTALLED_EXAMPLES} - DESTINATION ${CMAKE_INSTALL_DOCDIR}/example) -# Install README.txt and taoCert.txt -install(FILES - ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.txt - ${CMAKE_CURRENT_SOURCE_DIR}/certs/taoCert.txt - DESTINATION ${CMAKE_INSTALL_DOCDIR}) -# Install the export set -install(EXPORT wolfssl-targets - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl - FILE wolfssl-targets.cmake - NAMESPACE wolfssl::) - -# TODO: Distro build + rules for what to include in the distro. -# See various include.am files. - -set(prefix ${CMAKE_INSTALL_PREFIX}) -set(exec_prefix "\${prefix}") -set(libdir "\${exec_prefix}/lib") -set(includedir "\${prefix}/include") -set(VERSION ${PROJECT_VERSION}) - -configure_file(support/wolfssl.pc.in ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc @ONLY) -install(FILES ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) - -include(CMakePackageConfigHelpers) -configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl" - NO_SET_AND_CHECK_MACRO - NO_CHECK_REQUIRED_COMPONENTS_MACRO -) +if(WOLFSSL_INSTALL) -export(EXPORT wolfssl-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-targets.cmake" - NAMESPACE wolfssl:: -) + set(INSTALLED_EXAMPLES + ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoserver/echoserver.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client-dtls.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-client.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/sctp/sctp-server-dtls.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/echoclient/echoclient.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/server/server.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/benchmark/tls_bench.c + ${CMAKE_CURRENT_SOURCE_DIR}/examples/client/client.c) -write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake" - VERSION "${wolfssl_VERSION_MAJOR}.${wolfssl_VERSION_MINOR}" - COMPATIBILITY AnyNewerVersion -) -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl -) + # Install the library + install(TARGETS wolfssl + EXPORT wolfssl-targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + ) + # Install the headers + install(DIRECTORY ${WOLFSSL_OUTPUT_BASE}/wolfssl/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl + FILES_MATCHING PATTERN "*.h" + REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) + install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/wolfssl/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/wolfssl + FILES_MATCHING PATTERN "*.h" + REGEX ${EXCLUDED_HEADERS_REGEX} EXCLUDE) + + # Install the examples + install(FILES ${INSTALLED_EXAMPLES} + DESTINATION ${CMAKE_INSTALL_DOCDIR}/example) + # Install README.txt and taoCert.txt + install(FILES + ${CMAKE_CURRENT_SOURCE_DIR}/doc/README.txt + ${CMAKE_CURRENT_SOURCE_DIR}/certs/taoCert.txt + DESTINATION ${CMAKE_INSTALL_DOCDIR}) + # Install the export set + install(EXPORT wolfssl-targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl + FILE wolfssl-targets.cmake + NAMESPACE wolfssl::) + + # TODO: Distro build + rules for what to include in the distro. + # See various include.am files. + + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix "\${prefix}") + set(libdir "\${exec_prefix}/lib") + set(includedir "\${prefix}/include") + set(VERSION ${PROJECT_VERSION}) + + # Setting libm in Libs.private of wolfssl.pc. + # See "Link Libraries" in above about `m` insertion to LINK_LIBRARIES + get_target_property(_wolfssl_dep_libs wolfssl LINK_LIBRARIES) + list(FIND _wolfssl_dep_libs m _dep_libm) + if ("${_dep_libm}" GREATER -1) + set(LIBM -lm) + else() + set(LIBM) + endif() + + configure_file(support/wolfssl.pc.in ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc @ONLY) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/support/wolfssl.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) + + include(CMakePackageConfigHelpers) + configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl" + NO_SET_AND_CHECK_MACRO + NO_CHECK_REQUIRED_COMPONENTS_MACRO + ) + + export(EXPORT wolfssl-targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-targets.cmake" + NAMESPACE wolfssl:: + ) + + write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake" + VERSION "${wolfssl_VERSION_MAJOR}.${wolfssl_VERSION_MINOR}" + COMPATIBILITY AnyNewerVersion + ) + + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/wolfssl-config-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/wolfssl + ) +endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ChangeLog.md mariadb-10.11.9/extra/wolfssl/wolfssl/ChangeLog.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/ChangeLog.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ChangeLog.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,3 +1,353 @@ +# wolfSSL Release 5.7.2 (July 08, 2024) + +Release 5.7.2 has been developed according to wolfSSL's development and QA +process (see link below) and successfully passed the quality criteria. +https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance + +NOTE: * --enable-heapmath is being deprecated and will be removed by end of 2024 + +## Vulnerabilities +* [Medium] CVE-2024-1544 +Potential ECDSA nonce side channel attack in versions of wolfSSL before 5.6.6 with wc_ecc_sign_hash calls. Generating the ECDSA nonce k samples a random number r and then truncates this randomness with a modular reduction mod n where n is the order of the elliptic curve. Analyzing the division through a control-flow revealing side-channel reveals a bias in the most significant bits of k. Depending on the curve this is either a negligible bias or a significant bias large enough to reconstruct k with lattice reduction methods. Thanks to Luca Wilke, Florian Sieck and Thomas Eisenbarth (University of Lübeck) for reporting the vulnerability. Details will appear in the proceedings of CCS 24. +Fixed https://github.com/wolfSSL/wolfssl/pull/7020 + + +* [Medium] CVE-2024-5288 +A private key blinding operation, enabled by defining the macro WOLFSSL_BLIND_PRIVATE_KEY, was added to mitigate a potential row hammer attack on ECC operations. If performing ECC private key operations in an environment where a malicious user could gain fine control over the device and perform row hammer style attacks it is recommended to update the version of wolfSSL used and to build with WOLFSSL_BLIND_PRIVATE_KEY defined. Thanks to Kemal Derya, M. Caner Tol, Berk Sunar for the report (Vernam Applied Cryptography and Cybersecurity Lab at Worcester Polytechnic Institute) +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7416 + + +* [Low] When parsing a provided maliciously crafted certificate directly using wolfSSL API, outside of a TLS connection, a certificate with an excessively large number of extensions could lead to a potential DoS. There are existing sanity checks during a TLS handshake with wolfSSL which mitigate this issue. Thanks to Bing Shi for the report. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7597 + +* [Low] CVE-2024-5991 +In the function MatchDomainName(), input param str is treated as a NULL terminated string despite being user provided and unchecked. Specifically, the Openssl compatibility function X509_check_host() takes in a pointer and length to check against, with no requirements that it be NULL terminated. While calling without a NULL terminated string is very uncommon, it is still technically allowed. If a caller was attempting to do a name check on a non*NULL terminated buffer, the code would read beyond the bounds of the input array until it found a NULL terminator. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7604 + +* [Medium] CVE-2024-5814 +A malicious TLS1.2 server can force a TLS1.3 client with downgrade capability to use a ciphersuite that it did not agree to and achieve a successful connection. This is because, aside from the extensions, the client was skipping fully parsing the server hello when downgrading from TLS 1.3. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7619 + +* [Medium] OCSP stapling version 2 response verification bypass issue when a crafted response of length 0 is received. Found with internal testing. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7702 + +* [Medium] OCSP stapling version 2 revocation bypass with a retry of a TLS connection attempt. A revoked CA certificate could incorrectly be loaded into the trusted signers list and used in a repeat connection attempt. Found with internal testing. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7702 + + +## New Feature Additions +* Added Dilithium/ML-DSA: Implementation of ML-DSA-44/65/87 (PR 7622) +* AES RISC-V 64-bit ASM: ECB/CBC/CTR/GCM/CCM (PR 7569) +* Added CUDA support for AES encryption (PR 7436) +* Added support for gRPC (PR 7445) +* Added function wc_RsaPrivateKeyDecodeRaw to import raw RSA private keys (PR 7608) +* Added crypto callback for SHA-3 (PR 7670) +* Support for Infineon Modus Toolbox with wolfSSL (PR 7369) +* Allow user to send a user_canceled alert by calling wolfSSL_SendUserCanceled (PR 7590) +* C# wrapper SNI support added (PR 7610) +* Quantum-safe algorithm support added to the Linux kernel module (PR 7574) +* Support for NIST 800-56C Option 1 KDF, using the macro WC_KDF_NIST_SP_800_56C added (PR 7589) +* AES-XTS streaming mode added, along with hardware acceleration and kernel module use (PR 7522, 7560, 7424) +* PlatformIO FreeRTOS with ESP build and addition of benchmark and test example applications (PR 7528, 7413, 7559, 7542) + + +## Enhancements and Optimizations +* Expanded STM32 AES hardware acceleration support for use with STM32H5 (PR 7578) +* Adjusted wc_xmss and wc_lms settings to support use with wolfBoot (PR 7393) +* Added the --enable-rpk option to autotools build for using raw public key support (PR 7379) +* SHA-3 Thumb2, ARM32 assembly implementation added (PR 7667) +* Improvements to RSA padding to expose Pad/Unpad APIs (PR 7612) +* Updates and API additions for supporting socat version 1.8.0.0 (PR 7594) +* cmake build improvements, expanding build options with SINGLE_THREADED and post-quantum algorithms, adjusting the generation of options.h file and using “yes;no†boolean instead of strings (PR 7611, 7546, 7479, 7480, 7380) +* Improvements for Renesas RZ support (PR 7474) +* Improvements to dual algorithm certificates for post-quantum keys (PR 7286) +* Added wolfSSL_SessionIsSetup so the user can check if a session ticket has been sent by the server (PR 7430) +* hostap updates: Implement PACs for EAP-FAST and filter cipher list on TLS version change (PR 7446) +* Changed subject name comparison to match different upper and lower cases (PR 7420) +* Support for DTLS 1.3 downgrade when using PSK (PR 7367) +* Update to static memory build for more generic memory pools used (PR 7418) +* Improved performance of Kyber C implementation (PR 7654) +* Support for ECC_CACHE_CURVE with no malloc (PR 7490) +* Added the configure option --enable-debug-trace-errcodes (macro WOLFSSL_DEBUG_TRACE_ERROR_CODES) which enables more debug tracking of error code values (PR 7634) +* Enhanced wc_MakeRsaKey and wc_RsaKeyToDer to work with WOLFSSL_NO_MALLOC (PR 7362) +* Improvements to assembly implementations of ChaCha20 and Poly1305 ASM for use with MSVC (PR 7319) +* Cortex-M inline assembly labels with unique number appended (PR 7649) +* Added secret logging callback to TLS <= 1.2, enabled with the macro HAVE_SECRET_CALLBACK (PR 7372) +* Made wc_RNG_DRBG_Reseed() a public wolfCrypt API (PR 7386) +* Enabled DES3 support without the DES3 ciphers. To re-enable DES3 cipher suites, use the configure flag --enable-des3-tls-suites (PR 7315) +* Added stubs required for latest nginx (1.25.5) (PR 7449) +* Added option for using a custom salt with the function wc_ecc_ctx_set_own_salt (PR 7552) +* Added PQ files for Windows (PR 7419) +* Enhancements to static memory feature, adding the option for a global heap hint (PR 7478) and build options for a lean or debug setting, enabled with --enable-staticmemory=small or --enable-staticmemory=debug (PR 7597) +* Updated --enable-jni to define SESSION_CERTS for wolfJSSE (PR 7557) +* Exposed DTLS in Ada wrapper and updated examples (PR 7397) +* Added additional minimum TLS extension size sanity checks (PR 7602) +* ESP improvements: updating the examples and libraries, updates for Apple HomeKit SHA/SRP, and fix for endianness with SHA512 software fallback (PR 7607, 7392, 7505, 7535) +* Made the wc_CheckCertSigPubKey API publicly available with the define of the macro WOLFSSL_SMALL_CERT_VERIFY (PR 7599) +* Added an alpha/preview of additional FIPS 140-3 full submission, bringing additional algorithms such as SRTP-KDF, AES-XTS, GCM streaming, AES-CFB, ED25519, and ED448 into the FIPS module boundary (PR 7295) +* XCODE support for v5.2.3 of the FIPS module (PR 7140) +* Expanded OpenSSL compatibility layer and added EC_POINT_hex2point (PR 7191) + +## Fixes +* Fixed the NXP MMCAU HW acceleration for SHA-256 (PR 7389) +* Fixed AES-CFB1 encrypt/decrypt on size (8*x-1) bits (PR 7431) +* Fixed use of %rip with SHA-256 x64 assembly (PR 7409) +* Fixed OCSP response message build for DTLS (PR 7671) +* Handled edge case in wc_ecc_mulmod() with zero (PR 7532) +* Fixed RPK (Raw Public Key) to follow certificate use correctly (PR 7375) +* Added sanity check on record header with QUIC use (PR 7638) +* Added sanity check for empty directory strings in X.509 when parsing (PR 7669) +* Added sanity check on non-conforming serial number of 0 in certificates being parsed (PR 7625) +* Fixed wolfSSL_CTX_set1_sigalgs_list() to make the TLS connection conform to the selected sig hash algorithm (PR 7693) +* Various fixes for dual algorithm certificates including small stack use and support for Certificate Signing Requests (PR 7577) +* Added sanity check for critical policy extension when wolfSSL is built without policy extension support enabled (PR 7388) +* Added sanity check that the ed25519 signature is smaller than the order (PR 7513) +* Fixed Segger emNet to handle non-blocking want read/want write (PR 7581) + + +# wolfSSL Release 5.7.0 (Mar 20, 2024) + +Release 5.7.0 has been developed according to wolfSSL's development and QA +process (see link below) and successfully passed the quality criteria. +https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance + +NOTE: * --enable-heapmath is being deprecated and will be removed by end of 2024 + +NOTE: In future releases, --enable-des3 (which is disabled by default) will be insufficient in itself to enable DES3 in TLS cipher suites. A new option, --enable-des3-tls-suites, will need to be supplied in addition. This option should only be used in backward compatibility scenarios, as it is inherently insecure. + +NOTE: This release switches the default ASN.1 parser to the new ASN template code. If the original ASN.1 code is preferred define `WOLFSSL_ASN_ORIGINAL` to use it. See PR #7199. + + +## Vulnerabilities +* [High] CVE-2024-0901 Potential denial of service and out of bounds read. Affects TLS 1.3 on the server side when accepting a connection from a malicious TLS 1.3 client. If using TLS 1.3 on the server side it is recommended to update the version of wolfSSL used. Fixed in this GitHub pull request https://github.com/wolfSSL/wolfssl/pull/7099 + + +* [Med] CVE-2024-1545 Fault Injection vulnerability in RsaPrivateDecryption function that potentially allows an attacker that has access to the same system with a victims process to perform a Rowhammer fault injection. Thanks to Junkai Liang, Zhi Zhang, Xin Zhang, Qingni Shen for the report (Peking University, The University of Western Australia)." +Fixed in this GitHub pull request https://github.com/wolfSSL/wolfssl/pull/7167 + + +* [Med] Fault injection attack with EdDSA signature operations. This affects ed25519 sign operations where the system could be susceptible to Rowhammer attacks. Thanks to Junkai Liang, Zhi Zhang, Xin Zhang, Qingni Shen for the report (Peking University, The University of Western Australia). +Fixed in this GitHub pull request https://github.com/wolfSSL/wolfssl/pull/7212 + + +## New Feature Additions + +* Added --enable-experimental configure flag to gate out features that are currently experimental. Now liboqs, kyber, lms, xmss, and dual-alg-certs require the --enable-experimental flag. + +### POST QUANTUM SUPPORT ADDITIONS +* Experimental framework for using wolfSSL’s XMSS implementation (PR 7161) +* Experimental framework for using wolfSSL’s LMS implementation (PR 7283) +* Experimental wolfSSL Kyber implementation and assembly optimizations, enabled with --enable-experimental --enable-kyber (PR 7318) +* Experimental support for post quantum dual key/signature certificates. A few known issues and sanitizer checks are in progress with this feature. Enabled with the configure flags --enable-experimental --enable-dual-alg-certs (PR 7112) +* CryptoCb support for PQC algorithms (PR 7110) + +### OTHER FEATURE ADDITIONS +* The Linux kernel module now supports registration of AES-GCM, AES-XTS, AES-CBC, and AES-CFB with the kernel cryptosystem through the new --enable-linuxkm-lkcapi-register option, enabling automatic use of wolfCrypt implementations by the dm-crypt/luks and ESP subsystems. In particular, wolfCrypt AES-XTS with –enable-aesni is faster than the native kernel implementation. +* CryptoCb hook to one-shot CMAC functions (PR 7059) +* BER content streaming support for PKCS7_VerifySignedData and sign/encrypt operations (PR 6961 & 7184) +* IoT-Safe SHA-384 and SHA-512 support (PR 7176) +* I/O callbacks for content and output with PKCS7 bundle sign/encrypt to reduce peak memory usage (PR 7272) +* Microchip PIC24 support and example project (PR 7151) +* AutoSAR shim layer for RNG, SHA256, and AES (PR 7296) +* wolfSSL_CertManagerUnloadIntermediateCerts API to clear intermediate certs added to certificate store (PR 7245) +* Implement SSL_get_peer_signature_nid and SSL_get_peer_signature_type_nid (PR 7236) + + +## Enhancements and Optimizations + +* Remove obsolete user-crypto functionality and Intel IPP support (PR 7097) +* Support for RSA-PSS signatures with CRL use (PR 7119) +* Enhancement for AES-GCM use with Xilsecure on Microblaze (PR 7051) +* Support for crypto cb only build with ECC and NXP CAAM (PR 7269) +* Improve liboqs integration adding locking and init/cleanup functions (PR 7026) +* Prevent memory access before clientSession->serverRow and clientSession->serverIdx are sanitized (PR 7096) +* Enhancements to reproducible build (PR 7267) +* Update Arduino example TLS Client/Server and improve support for ESP32 (PR 7304 & 7177) +* XC32 compiler version 4.x compatibility (PR 7128) +* Porting for build on PlayStation 3 and 4 (PR 7072) +* Improvements for Espressif use; SHA HW/SW selection and use on ESP32-C2/ESP8684, wolfSSL_NewThread() type, component cmake fix, and update TLS client example for ESP8266 (PR 7081, 7173, 7077, 7148, 7240) +* Allow crypto callbacks with SHA-1 HW (PR 7087) +* Update OpenSSH port to version 9.6p1(PR 7203) +* ARM Thumb2 enhancements, AES-GCM support for GCM_SMALL, alignment fix on key, fix for ASM clobber list (PR 7291,7301,7221) +* Expand heap hint support for static memory build with more x509 functions (PR 7136) +* Improving ARMv8 ChaCha20 ASM (alignment) (PR 7182) +* Unknown extension callback wolfSSL_CertManagerSetUnknownExtCallback added to CertManager (PR 7194) +* Implement wc_rng_new_ex for use with devID’s with crypto callback (PR 7271) +* Allow reading 0-RTT data after writing 0.5-RTT data (PR 7102) +* Send alert on bad PSK binder error (PR 7235) +* Enhancements to CMake build files for use with cross compiling (PR 7188) + + +## Fixes + +* Fix for checking result of MAC verify when no AAD is used with AES-GCM and Xilinx Xilsecure (PR 7051) +* Fix for Aria sign use (PR 7082) +* Fix for invalid `dh_ffdhe_test` test case using Intel QuickAssist (PR 7085) +* Fixes for TI AES and SHA on TM4C with HW acceleration and add full AES GCM and CCM support with TLS (PR 7018) +* Fixes for STM32 PKA use with ECC (PR 7098) +* Fixes for TLS 1.3 with crypto callbacks to offload KDF / HMAC operation (PR 7070) +* Fix include path for FSP 3.5 on Renesas RA6M4 (PR 7101) +* Siphash x64 asm fix for use with older compilers (PR 7299) +* Fix for SGX build with SP (PR 7308) +* Fix to Make it mandatory that the cookie is sent back in new ClientHello when seen in a HelloRetryRequest with (PR 7190) +* Fix for wrap around behavior with BIO pairs (PR 7169) +* OCSP fixes for parsing of response correctly when there was a revocation reason and returning correct error value with date checks (PR 7241 & 7255) +* Fix build with `NO_STDIO_FILESYSTEM` and improve checks for `XGETENV` (PR 7150) +* Fix for DTLS sequence number and cookie when downgrading DTLS version (PR 7214) +* Fix for write_dup use with chacha-poly cipher suites (PR 7206) +* Fix for multiple handshake messages in one record failing with OUT_OF_ORDER_E when downgrading from TLS 1.3 to TLS 1.2 (PR 7141) +* Fix for AES ECB build with Thumb and alignment (PR 7094) +* Fix for negotiate handshake until the end in wolfSSL_read/wolfSSL_write if hitting an edge case with want read/write (PR 7237) + +# wolfSSL Release 5.6.6 (Dec 19, 2023) + +Release 5.6.6 has been developed according to wolfSSL's development and QA +process (see link below) and successfully passed the quality criteria. +https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance + +NOTE: * --enable-heapmath is being deprecated and will be removed by 2024 + +REMINDER: When working with AES Block Cipher algorithms, `wc_AesInit()` should +always be called first to initialize the `Aes` structure, before calling other +Aes API functions. Recently we found several places in our documentation, +comments, and codebase where this pattern was not observed. We have since +fixed this omission in several PRs for this release. + +## Vulnerabilities + +* [Medium] CVE-2023-6935: After review of the previous RSA timing fix in wolfSSL 5.6.4, additional changes were found to be required. A complete resistant change is delivered in this release. This fix is for the Marvin attack, leading to being able to decrypt a saved TLS connection and potentially forge a signature after probing with a very large number of trial connections. This issue is around RSA decryption and affects the optional static RSA cipher suites on the server side, which are considered weak, not recommended to be used and are off by default in wolfSSL (even with `--enable-all`). Static RSA cipher suites were also removed from the TLS 1.3 protocol and are only present in TLS 1.2 and lower. All padding versions of RSA decrypt are affected since the code under review is outside of the padding processing. Information about the private keys is NOT compromised in affected code. It is recommended to disable static RSA cipher suites and update the version of wolfSSL used if using RSA private decryption alone outside of TLS. Thanks to Hubert Kario for the report. The fix for this issue is located in the following GitHub Pull Request: https://github.com/wolfSSL/wolfssl/pull/6955. + +* [Low] CVE-2023-6936: A potential heap overflow read is possible in servers connecting over TLS 1.3 when the optional `WOLFSSL_CALLBACKS` has been defined. The out of bounds read can occur when a server receives a malicious malformed ClientHello. Users should either discontinue use of `WOLFSSL_CALLBACKS` on the server side or update versions of wolfSSL to 5.6.6. Thanks to the tlspuffin fuzzer team for the report which was designed and developed by; Lucca Hirschi (Inria, LORIA), Steve Kremer (Inria, LORIA), and Max Ammann (Trail of Bits). The fix for this issue is located in the following GitHub Pull Request: https://github.com/wolfSSL/wolfssl/pull/6949. + +* [Low] A side channel vulnerability with AES T-Tables is possible in a very controlled environment where precision sub-cache-line inspection can happen, such as inside an Intel SGX enclave. This can lead to recovery of the AES key. To prevent this type of attack, wolfSSL added an AES bitsliced implementation which can be enabled with the “`--enable-aes-bitsliced`†configure option. Thanks to Florian Sieck, Zhiyuan Zhang, Sebastian Berndt, Chitchanok Chuengsatiansup, Thomas Eisenbarth, and Yuval Yarom for the report (Universities of Lübeck, Melbourne, Adelaide and Bochum). The fix for this issue is located in the following GitHub Pull Request: https://github.com/wolfSSL/wolfssl/pull/6854. + +* [Low] CVE-2023-6937: wolfSSL prior to 5.6.6 did not check that messages in a single (D)TLS record do not span key boundaries. As a result, it was possible to combine (D)TLS messages using different keys into one (D)TLS record. The most extreme edge case is that, in (D)TLS 1.3, it was possible that an unencrypted (D)TLS 1.3 record from the server containing first a ServerHello message and then the rest of the first server flight would be accepted by a wolfSSL client. In (D)TLS 1.3 the handshake is encrypted after the ServerHello but a wolfSSL client would accept an unencrypted flight from the server. This does not compromise key negotiation and authentication so it is assigned a low severity rating. Thanks to Johannes Wilson for the report (Sectra Communications and Linköping University). The fix for this issue is located in the following GitHub Pull Request: https://github.com/wolfSSL/wolfssl/pull/7029. + +## New Feature Additions + +* Build option for disabling CRL date checks (`WOLFSSL_NO_CRL_DATE_CHECK`) (PR 6927) +* Support for STM32WL55 and improvements to PKA ECC support (PR 6937) +* Add option to skip cookie exchange on DTLS 1.3 session resumption (PR 6929) +* Add implementation of SRTP KDF and SRTCP KDF (`--enable-srtp-kdf`) (PR 6888) +* Add `wolfSSL_EXTENDED_KEY_USAGE_free()` (PR 6916) +* Add AES bitsliced implementation that is cache attack safe (`--enable-aes-bitsliced`) (PR 6854) +* Add memcached support and automated testing (PR 6430, 7022) +* Add Hardware Encryption Acceleration for ESP32-C3, ESP32-C6, and ESP32-S2 (PR 6990) +* Add (D)TLS 1.3 support for 0.5-RTT data (PR 7010) + +## Enhancements and Optimizations + +* Better built in testing of “`--sys-ca-certs`†configure option (PR 6910) +* Updated CMakeLists.txt for Espressif wolfSSL component usage (PR 6877) +* Disable TLS 1.1 by default (unless SSL 3.0 or TLS 1.0 is enabled) (PR 6946) +* Add “`--enable-quic`†to “`--enable-all`†configure option (PR 6957) +* Add support to SP C implementation for RSA exponent up to 64-bits (PR 6959) +* Add result of “`HAVE___UINT128_T`†to options.h for CMake builds (PR 6965) +* Add optimized assembly for AES-GCM on ARM64 using hardware crypto instructions (PR 6967) +* Add built-in cipher suite tests for DTLS 1.3 PQC (PR 6952) +* Add wolfCrypt test and unit test to ctest (PR 6977) +* Move OpenSSL compatibility crypto APIs into `ssl_crypto.c` file (PR 6935) +* Validate time generated from XGMTIME() (PR 6958) +* Allow wolfCrypt benchmark to run with microsecond accuracy (PR 6868) +* Add GitHub Actions testing with nginx 1.24.0 (PR 6982) +* Allow encoding of CA:FALSE BasicConstraint during cert generation (PR 6953) +* Add CMake option to enable DTLS-SRTP (PR 6991) +* Add CMake options for enabling QUIC and cURL (PR 7049) +* Improve RSA blinding to make code more constant time (PR 6955) +* Refactor AES-NI implementation macros to allow dynamic fallback to C (PR 6981) +* Default to native Windows threading API on MinGW (PR 7015) +* Return better error codes from OCSP response check (PR 7028) +* Updated Espressif ESP32 TLS client and server examples (PR 6844) +* Add/clean up support for ESP-IDF v5.1 for a variety of ESP32 chips (PR 7035, 7037) +* Add API to choose dynamic certs based on client ciphers/sigalgs (PR 6963) +* Improve Arduino IDE 1.5 project file to match recursive style (PR 7007) +* Simplify and improve apple-universal build script (PR 7025) + +## Fixes + +* Fix for async edge case with Intel QuickAssist/Cavium Nitrox (PR 6931) +* Fix for building PKCS#7 with RSA disabled (PR 6902) +* Fix for advancing output pointer in `wolfSSL_i2d_X509()` (PR 6891) +* Fix for `EVP_EncodeBlock()` appending a newline (PR 6900) +* Fix for `wolfSSL_RSA_verify_PKCS1_PSS()` with `RSA_PSS_SALTLEN_AUTO` (PR 6938) +* Fixes for CODESonar reports around `isalpha()` and `isalnum()` calls (PR 6810) +* Fix for SP ARM64 integer math to avoid compiler optimization issues (PR 6942) +* Fix for SP Thumb2 inline assembly to add IAR build support (PR 6943, 6971) +* Fix for SP Thumb2 to make functions not inlined (PR 6993) +* Fix for SP Cortex-M assembly large build with IAR (PR 6954) +* Fix for SP ARM64 assembly montgomery reduction by 4 (PR 6947) +* Fix for SP ARM64 P-256 for not inlining functions for iOS compatibility (PR 6979) +* Fix for `WOLFSSL_CALLBACKS` and potential memory error (PR 6949) +* Fixes for wolfSSL’s Zephyr OS port (PR 6930) +* Fix for build errors when building for NXP mmCAU (`FREESCALE_MMCAU`) (PR 6970) +* Fix for TLS 1.3 `SendBuffered()` return code in non-blocking mode (PR 7001) +* Fix for TLS `Hmac_UpdateFinal()` when padding byte is invalid (PR 6998) +* Fix for ARMv8 AES-GCM streaming to check size of IV before storing (PR 6996) +* Add missing calls to `wc_AesInit()` before `wc_AesSetKey()` (PR 7011) +* Fix build errors with DTLS 1.3 enabled but TLS 1.2 disabled (PR 6976) +* Fixes for building wolfSSL in Visual Studio (PR 7040) + +# wolfSSL Release 5.6.4 (Oct 30, 2023) + +Release 5.6.4 has been developed according to wolfSSL's development and QA process (see link below) and successfully passed the quality criteria. +https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance + +NOTE: * --enable-heapmath is being deprecated and will be removed by 2024 + * Old CyaSSL/CtaoCrypt shim layer was removed in this release (5.6.4) + +## Vulnerabilities + +* [Medium] A fix was added, but still under review for completeness, for a Bleichenbacher style attack, leading to being able to decrypt a saved TLS connection and potentially forge a signature after probing with a large number of trial connections. This issue is around RSA decryption and affects static RSA cipher suites on the server side, which are not recommended to be used and are off by default. Static RSA cipher suites were also removed from the TLS 1.3 protocol and only present in TLS 1.2 and lower. All padding versions of RSA decrypt are affected since the code under review is outside of the padding processing. Information about the private keys is NOT compromised in affected code. It's recommended to disable static RSA cipher suites and update the version of wolfSSL used if using RSA private decryption alone outside of TLS. The fix is located in this pull request (https://github.com/wolfSSL/wolfssl/pull/6896) + +## New Feature Additions + +* DTLS 1.3 PQC: support fragmenting the second ClientHello message. This allows arbitrarily long keys to be used, opening up support for all PQC ciphersuites in DTLS 1.3. +* SM2/SM3/SM4: Chinese cipher support including TLS 1.3 and 1.2 cipher suites. SM2 SP implementation available. +* Ability to parse ASN1 only with SMIME_read_PKCS7 +* Added support for MemUse Entropy on Windows +* Added Ada Bindings for wolfSSL +* Added a PEM example that converts to and from DER/PEM. +* Added LMS/HSS and XMSS/XMSS^MT wolfcrypt hooks, both normal and verify-only options. +* Added support for the AES EAX mode of operation +* Port for use with Hitch (https://github.com/varnish/hitch) added +* Add XTS API's to handle multiple sectors in new port to VeraCrypt + +## Enhancements and Optimizations + +* Turned on SNI by default on hosts with resources +* Improved support for Silicon Labs Simplicity Studio and the ERF32 Gecko SDK +* Thumb-2 and ARM32 Curve25519 and Ed25519 assembly have significantly improved performance. +* Thumb-2 AES assembly code added. +* Thumb-2 and ARM32 SP implementations of RSA, DH and ECC have significantly improved performance. +* Minor performance improvements to SP ECC for Intel x64. +* AES-XTS assembly code added for Intel x64, Aarch64 and ARM32. +* Added support for X963 KDFs to ECIES. +* Added 32-bit type only implementation of AES GMULT using tables. +* Add support for nginx version 1.25.0 +* Add support for Kerberos version 5 1.21.1 +* Check all CRL entries in case a single issuer has multiple CRL's loaded +* CRL verify the entire chain including loaded CA's +* Added example for building wolfSSL as an Apple universal binary framework using configure +* Sniffer tool now supports decrypting TLS sessions using secrets obtained from a SSLKEYLOGFILE +* Updates made for EBSNET port +* Update "--enable-jni" to include additional defines for expanded JNI support. Also includes JCE and JSSE builds under the single enable option now. + +## Fixes + +* Fixed error handling when decrypted pre-master secret is too long when using static RSA. +* Added a fix for keymod use with i.MX RT1170 CAAM blobs +* Added a fix for AES-GCM use with Petalinux Xilinx +* Fixed `wc_SignatureGenerate_ex` to not call verify twice +* Fixed wolfCrypt FIPS DLL on Win32 +* Fixed TFM math library big-endian reading implementation when a zero length buffer is passed in. +* Fixed NO_CERT configurations to build correctly. +* Fixed ARM AES-GCM streaming assembly when –enable-opensslextra defined. +* Added modulus checks to heap math implementation of mp_exptmod(). +* Fixed Windows assembly code to handle that certain XMM registers are non-volatile. +* Aarch64 SP ECC implementation of sp_256_mont_dbl_4 has the register list for the assembly code fixed to include all used registers. +* mp_sqrt_mod_prime fixed to limit the number of iterations of a loop to handle malicious non-prime values being passed in. +* Ignore session ID's shorter than 32 bytes instead of erroring out + # wolfSSL Release 5.6.3 (Jun 16, 2023) Release 5.6.3 of wolfSSL embedded TLS has 4 bug fixes: @@ -7,7 +357,6 @@ * Improvements to Encrypted Memory support (WC_PROTECT_ENCRYPTED_MEM) implementations for modular exponentiation in SP math-all (sp_int.c) and TFM (tfm.c). * Improvements to SendAlert for getting output buffer. - # wolfSSL Release 5.6.2 (Jun 09, 2023) Release 5.6.2 has been developed according to wolfSSL's development and QA process (see link below) and successfully passed the quality criteria. @@ -3255,7 +3604,7 @@ a) If using wolfSSL for DTLS on the server side of a publicly accessible machine you MUST update. b) If using wolfSSL for TLS on the server side with private RSA keys allowing - ephemeral key exchange without low memory optimziations you MUST update and + ephemeral key exchange without low memory optimizations you MUST update and regenerate the private RSA keys. Please see https://www.wolfssl.com/wolfSSL/Blog/Blog.html for more details diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/Dockerfile mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/Dockerfile --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/Dockerfile 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/Dockerfile 2024-08-03 07:30:00.000000000 +0000 @@ -3,23 +3,54 @@ USER root +# Set timezone to UTC +RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone + ARG DEPS_WOLFSSL="build-essential autoconf libtool clang clang-tools zlib1g-dev libuv1-dev libpam0g-dev valgrind git linux-headers-generic gcc-multilib g++-multilib libpcap-dev bubblewrap gdb iputils-ping lldb bsdmainutils netcat binutils-arm-linux-gnueabi binutils-aarch64-linux-gnu" ARG DEPS_LIBOQS="astyle cmake gcc ninja-build libssl-dev python3-pytest python3-pytest-xdist unzip xsltproc doxygen graphviz python3-yaml valgrind git" -ARG DEPS_TESTS="abi-dumper libcurl4-openssl-dev tcpdump" +ARG DEPS_UDP_PROXY="wget libevent-dev" +ARG DEPS_TESTS="abi-dumper libcurl4-openssl-dev tcpdump libpsl-dev python3-pandas python3-tabulate libnl-genl-3-dev libcap-ng-dev" +ARG DEPS_TOOLS="ccache clang-tidy maven" RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y apt-utils \ - && apt install -y ${DEPS_WOLFSSL} ${DEPS_LIBOQS} ${DEPS_TESTS} \ + && apt install -y ${DEPS_WOLFSSL} ${DEPS_LIBOQS} ${DEPS_UDP_PROXY} ${DEPS_TESTS} ${DEPS_TOOLS} \ && apt clean -y && rm -rf /var/lib/apt/lists/* +# Add 'docker' user ARG USER=docker ARG UID=1000 ARG GID=1000 RUN groupadd -f -g ${GID} docker && ( getent passwd ${UID} || useradd -ms /bin/bash ${USER} -u ${UID} -g ${GID} ) +# Add github.com as an SSH known host +RUN ssh -o StrictHostKeyChecking=no -T git@github.com; cat ~/.ssh/known_hosts >> /etc/ssh/ssh_known_hosts + +# install ccache +RUN mkdir -p /opt/ccache/bin && for prog in gcc g++ cc c++ cpp arm-none-eabi-c++ arm-none-eabi-cpp arm-none-eabi-gcc arm-none-eabi-g++; do ln -s /usr/bin/ccache /opt/ccache/bin/$(basename $prog); done +ENV PATH /opt/ccache/bin:$PATH + # install liboqs -RUN git clone --single-branch https://github.com/open-quantum-safe/liboqs.git && cd liboqs && git checkout af76ca3b1f2fbc1f4f0967595f3bb07692fb3d82 \ +RUN git clone --single-branch https://github.com/open-quantum-safe/liboqs.git && cd liboqs && git checkout db08f12b5a96aa6582a82aac7f65cf8a4d8b231f \ && mkdir build && cd build && cmake -DOQS_DIST_BUILD=ON -DOQS_USE_CPUFEATURE_INSTRUCTIONS=OFF -DOQS_USE_OPENSSL=0 .. && make -j8 all && make install && cd ../.. && rm -rf liboqs +RUN mkdir /opt/sources + +# install liblms +RUN cd /opt/sources && git clone --single-branch https://github.com/cisco/hash-sigs.git && cd hash-sigs && git checkout b0631b8891295bf2929e68761205337b7c031726 \ + && sed -i 's/USE_OPENSSL 1/USE_OPENSSL 0/g' sha256.h && make -j4 hss_lib_thread.a + +# Install pkixssh to /opt/pkixssh for X509 interop testing with wolfSSH +RUN mkdir /var/empty +RUN cd /opt/sources && wget -q -O- https://roumenpetrov.info/secsh/src/pkixssh-14.1.1.tar.gz | tar xzf - && cd pkixssh-14.1.1 && ./configure --prefix=/opt/pkixssh/ --exec-prefix=/opt/pkixssh/ && make install + +# Install udp/tcp-proxy +RUN cd /opt/sources && git clone --depth=1 --single-branch --branch=main http://github.com/wolfssl/udp-proxy && cd udp-proxy && make && cp tcp_proxy udp_proxy /bin/. + # Allow non-root to use tcpdump (will need NET_RAW and NET_ADMIN capability when running the container) RUN setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/tcpdump +# Allow non-root to use gdb on processes (will need SYS_PTRACE capability when running the container) +RUN setcap 'CAP_SYS_PTRACE+eip' /usr/bin/gdb + +# Add in Jenkins userID +RUN for i in $(seq 1001 1010); do ( getent passwd ${i} || useradd -ms /bin/bash jenkins${i} -u ${i} -g ${GID} ); done -USER ${UID}:${GID} \ No newline at end of file +USER ${UID}:${GID} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/Dockerfile.cross-compiler 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,11 @@ +ARG DOCKER_BASE_IMAGE=wolfssl/wolfssl-builder +FROM $DOCKER_BASE_IMAGE + +USER root + +ARG DEPS_TESTING="gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu gcc-powerpc-linux-gnu gcc-powerpc64-linux-gnu gcc-arm-none-eabi" +RUN DEBIAN_FRONTEND=noninteractive apt update \ + && apt install -y ${DEPS_TESTING} \ + && apt clean -y && rm -rf /var/lib/apt/lists/* + +USER docker diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/OpenWrt/runTests.sh mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/OpenWrt/runTests.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/OpenWrt/runTests.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/OpenWrt/runTests.sh 2024-08-03 07:30:00.000000000 +0000 @@ -1,23 +1,27 @@ #!/bin/sh runCMD() { # usage: runCMD "" "" - eval $1 >/dev/null 2>&1 + TMP_FILE=$(mktemp) + eval $1 > $TMP_FILE 2>&1 RETVAL=$? if [ "$RETVAL" != "$2" ]; then - echo "Command ($1) returned ${RETVAL}, but expected $2. Rerunning with output to terminal:" - eval $1 + echo "Command ($1) returned ${RETVAL}, but expected $2. Error output:" + cat $TMP_FILE exit 1 fi } # Successful tests runCMD "ldd /lib/libustream-ssl.so" 0 +# Temporary workaround: comment out missing kmods repo line for 21.02 specifically. +# Remove after fixed upstream. +runCMD "sed '\/src\/gz openwrt_kmods https:\/\/downloads.openwrt.org\/releases\/21.02-SNAPSHOT\/targets\/x86\/64\/kmods\/5.4.238-1-5a722da41bc36de95a7195be6fce1b45/s//#&/' -i /etc/opkg/distfeeds.conf" 0 runCMD "opkg update" 0 -runCMD "uclient-fetch -O /dev/null 'https://letsencrypt.org'" 0 +runCMD "uclient-fetch 'https://letsencrypt.org'" 0 # Negative tests -runCMD "uclient-fetch --ca-certificate=/dev/null -O /dev/null 'https://letsencrypt.org'" 5 -runCMD "uclient-fetch -O /dev/null 'https://self-signed.badssl.com/'" 5 -runCMD "uclient-fetch -O /dev/null 'https://untrusted-root.badssl.com/'" 5 -runCMD "uclient-fetch -O /dev/null 'https://expired.badssl.com/'" 5 +runCMD "uclient-fetch --ca-certificate=/dev/null 'https://letsencrypt.org'" 5 +runCMD "uclient-fetch 'https://self-signed.badssl.com/'" 5 +runCMD "uclient-fetch 'https://untrusted-root.badssl.com/'" 5 +runCMD "uclient-fetch 'https://expired.badssl.com/'" 5 echo "All tests passed." diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,10 @@ # Overview -This is a simple Docker environment for compiling and running WolfSSL. Use `run.sh` to build everything (Docker container, WolfSSL, etc.). This script takes in arguments that can be passed to `./configure`. For example: `run.sh --enable-all` +This is a Docker environment for compiling, testing and running WolfSSL. Use `run.sh` to build everything (Docker container, WolfSSL, etc.). This script takes in arguments that can be passed to `./configure`. For example: `run.sh --enable-all` -When the compilation and tests succeed, you will be dropped in to a shell environment within the container. This can be useful to build other things within the environment. +When the compilation and tests succeed, you will be dropped in to a shell environment within the container. This can be useful to build other things within the environment. Additional tests can be run as well as debugging of code. + +# Docker Hub +These images are also uploaded to the wolfSSL's [Docker Hub page](https://hub.docker.com/orgs/wolfssl/repositories). There is a convenience script here `buildAndPush.sh` that will create the appropriate containers and push them to the repo. # FAQ ## permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock @@ -10,4 +13,4 @@ ## Unable to access symlinked files outside of WolfSSL The volume mounted in the Docker container needs to have all files that your compilation will need. To solve this, you have a couple options: 1. Change the `WOLFSSL_DIR` variable in the `run.sh` to one higher up (by adding `/..` to the path). Then update the `docker build` to include the correct path to the Dockerfile and the `docker run` argument to the working directory (`-w`) to the WolfSSL source directory -2. Move the external repository to within the WolfSSL directory. For example create an `external` folder which has your files. This route may have complications when stashing Git work. \ No newline at end of file +2. Move the external repository to within the WolfSSL directory. For example create an `external` folder which has your files. This route may have complications when stashing Git work. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/buildAndPush.sh mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/buildAndPush.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/buildAndPush.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/buildAndPush.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,37 @@ +#!/bin/bash + +# Assume we're in wolfssl/Docker +WOLFSSL_DIR=$(builtin cd ${BASH_SOURCE%/*}/..; pwd) + +DOCKER_BUILD_OPTIONS="$1" +if [ "${DOCKER_BASE_IMAGE}" != "" ]; then + DOCKER_BUILD_OPTIONS+=" --build-arg DOCKER_BASE_IMAGE=${DOCKER_BASE_IMAGE}" +fi + +NUM_FAILURES=0 + +CUR_DATE=$(date -u +%F) +echo "Building wolfssl/wolfssl-builder:${CUR_DATE} as ${DOCKER_BUILD_OPTIONS}" +docker build -t wolfssl/wolfssl-builder:${CUR_DATE} ${DOCKER_BUILD_OPTIONS} "${WOLFSSL_DIR}/Docker" && \ + docker tag wolfssl/wolfssl-builder:${CUR_DATE} wolfssl/wolfssl-builder:latest && \ + docker build --build-arg DOCKER_BASE_IMAGE=wolfssl/wolfssl-builder:${CUR_DATE} -t wolfssl/testing-cross-compiler:${CUR_DATE} "${WOLFSSL_DIR}/Docker" -f Dockerfile.cross-compiler && \ + docker tag wolfssl/testing-cross-compiler:${CUR_DATE} wolfssl/testing-cross-compiler:latest + +if [ $? -eq 0 ]; then + echo "Pushing containers to DockerHub" + docker push wolfssl/wolfssl-builder:${CUR_DATE} && docker push wolfssl/wolfssl-builder:latest && \ + docker push wolfssl/testing-cross-compiler:${CUR_DATE} && docker push wolfssl/testing-cross-compiler:latest +else + echo "Warning: Build wolfssl/wolfssl-builder failed. Continuing" + ((NUM_FAILURES++)) +fi + +echo "Building wolfssl/wolfCLU:${CUR_DATE}" +docker buildx build --pull --push --build-arg DUMMY=${CUR_DATE} -t wolfssl/wolfclu:${CUR_DATE} --platform=linux/amd64,linux/arm64,linux/arm/v7 "${WOLFSSL_DIR}/Docker/wolfCLU" && \ +docker buildx build --pull --push --build-arg DUMMY=${CUR_DATE} -t wolfssl/wolfclu:latest --platform=linux/amd64,linux/arm64,linux/arm/v7 "${WOLFSSL_DIR}/Docker/wolfCLU" +if [ $? -ne 0 ]; then + echo "Warning: Build wolfssl/wolfclu failed. Continuing" + ((NUM_FAILURES++)) +fi + +echo "Script completed in $SECONDS seconds. Had $NUM_FAILURES failures." diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -3,9 +3,11 @@ # All paths should be given relative to the root EXTRA_DIST+= Docker/Dockerfile +EXTRA_DIST+= Docker/Dockerfile.cross-compiler EXTRA_DIST+= Docker/run.sh EXTRA_DIST+= Docker/README.md +ignore_files+=Docker/buildAndPush.sh ignore_files+=Docker/OpenWRT/Dockerfile ignore_files+=Docker/OpenWRT/runTests.sh ignore_files+=Docker/OpenWRT/README.md diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/packaging/debian/Dockerfile mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/packaging/debian/Dockerfile --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/packaging/debian/Dockerfile 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/packaging/debian/Dockerfile 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,6 @@ +FROM debian:latest + +RUN apt-get -y update +RUN apt-get -y upgrade +RUN apt-get install -y build-essential autoconf gawk debhelper lintian + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/packaging/fedora/Dockerfile mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/packaging/fedora/Dockerfile --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/packaging/fedora/Dockerfile 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/packaging/fedora/Dockerfile 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3 @@ +FROM fedora:latest + +RUN dnf install -y make automake gcc rpmdevtools diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/run.sh mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/run.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/run.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/run.sh 2024-08-03 07:30:00.000000000 +0000 @@ -5,9 +5,9 @@ # Assume we're in wolfssl/Docker WOLFSSL_DIR=$(builtin cd ${BASH_SOURCE%/*}/..; pwd) -docker build -t wolfssl --build-arg UID=$(id -u) --build-arg GID=$(id -g) "${WOLFSSL_DIR}/Docker" && \ - docker run --rm -it -v ${HOME}/.gitconfig:/home/docker/.gitconfig:ro -v ${HOME}/.ssh:/home/docker/.ssh:ro -v "${WOLFSSL_DIR}:/tmp/wolfssl" -w /tmp/wolfssl wolfssl /bin/bash -c "./autogen.sh && ./configure ${*@Q} && make" && \ - docker run --rm -it -v ${HOME}/.gitconfig:/home/docker/.gitconfig:ro -v ${HOME}/.ssh:/home/docker/.ssh:ro -v "${WOLFSSL_DIR}:/tmp/wolfssl" -w /tmp/wolfssl wolfssl /bin/bash +docker build -t wolfssl/wolfssl-builder --build-arg UID=$(id -u) --build-arg GID=$(id -g) "${WOLFSSL_DIR}/Docker" && \ + docker run --rm -it -v ${HOME}/.gitconfig:/home/docker/.gitconfig:ro -v ${HOME}/.ssh:/home/docker/.ssh:ro -v "${WOLFSSL_DIR}:/tmp/wolfssl" -w /tmp/wolfssl wolfssl/wolfssl-builder /bin/bash -c "./autogen.sh && ./configure ${*@Q} && make" && \ + docker run --rm -it -v ${HOME}/.gitconfig:/home/docker/.gitconfig:ro -v ${HOME}/.ssh:/home/docker/.ssh:ro -v "${WOLFSSL_DIR}:/tmp/wolfssl" -w /tmp/wolfssl wolfssl/wolfssl-builder /bin/bash exitval=$? echo "Exited with error code $exitval" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/wolfCLU/Dockerfile mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/wolfCLU/Dockerfile --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/wolfCLU/Dockerfile 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/wolfCLU/Dockerfile 2024-08-03 07:30:00.000000000 +0000 @@ -21,6 +21,6 @@ COPY --from=BUILDER /usr/local/lib/libwolfssl.so /usr/local/lib/ COPY --from=BUILDER /usr/local/bin/wolfssl* /usr/local/bin/ RUN ldconfig -CMD ["/usr/local/bin/wolfssl"] +ENTRYPOINT ["/usr/local/bin/wolfssl"] LABEL org.opencontainers.image.source=https://github.com/wolfssl/wolfssl LABEL org.opencontainers.image.description="Simple wolfCLU in a container" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/yocto/Dockerfile 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,29 @@ +FROM ubuntu + +# Set timezone to UTC +RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone + +RUN DEBIAN_FRONTEND=noninteractive apt update && apt install -y gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev python3-subunit mesa-common-dev zstd liblz4-tool file locales libacl1 vim && apt clean -y && rm -rf /var/lib/apt/lists/* +RUN locale-gen en_US.UTF-8 + +# Add in non-root user +ENV UID_OF_DOCKERUSER 1000 +RUN useradd -m -s /bin/bash -g users -u ${UID_OF_DOCKERUSER} dockerUser +RUN chown -R dockerUser:users /home/dockerUser && chown dockerUser:users /opt + +USER dockerUser + +RUN cd /opt && git clone git://git.yoctoproject.org/poky +WORKDIR /opt/poky + +ARG YOCTO_VERSION=kirkstone +RUN git checkout -t origin/${YOCTO_VERSION} -b ${YOCTO_VERSION} && git pull + +# This arg is to be able to force a rebuild starting from this line +ARG DUMMY=date +RUN DUMMY=${DUMMY} git clone --single-branch --branch=master https://github.com/wolfssl/meta-wolfssl.git && \ + /bin/bash -c "source oe-init-build-env" && \ + echo 'IMAGE_INSTALL:append = " wolfssl wolfclu wolfssh wolfmqtt wolftpm wolfclu "' >> /opt/poky/build/conf/local.conf && \ + sed -i '/\/opt\/poky\/meta-poky \\/a \\t/opt/poky/meta-wolfssl \\' /opt/poky/build/conf/bblayers.conf + +RUN /bin/bash -c "source oe-init-build-env && bitbake core-image-minimal" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Docker/yocto/buildAndPush.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,27 @@ +#!/bin/bash + +# Assume we're in wolfssl/Docker/yocto +WOLFSSL_DIR=$(builtin cd ${BASH_SOURCE%/*}/../..; pwd) + +DOCKER_BUILD_OPTIONS="$1" +if [ "${DOCKER_BASE_IMAGE}" != "" ]; then + DOCKER_BUILD_OPTIONS+=" --build-arg DOCKER_BASE_IMAGE=${DOCKER_BASE_IMAGE}" +fi + +NUM_FAILURES=0 + +CUR_DATE=$(date -u +%F) +for ver in kirkstone langdale scarthgap; do + echo "Building wolfssl/yocto:${ver}-${CUR_DATE} as ${DOCKER_BUILD_OPTIONS}" + docker build -t wolfssl/yocto:${ver}-${CUR_DATE} --build-arg YOCTO_VERSION=${ver} --build-arg BUILD_DATE=${CUR_DATE} -f Dockerfile "${WOLFSSL_DIR}/Docker/yocto" && \ + docker tag wolfssl/yocto:${ver}-${CUR_DATE} wolfssl/yocto:${ver}-latest + if [ $? -eq 0 ]; then + echo "Pushing containers to DockerHub" + docker push wolfssl/yocto:${ver}-${CUR_DATE} && docker push wolfssl/yocto:${ver}-latest + else + echo "Warning: Build wolfssl/yocto:${ver} failed. Continuing" + ((NUM_FAILURES++)) + fi +done + +echo "Script completed in $SECONDS seconds. Had $NUM_FAILURES failures." diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/Arduino_README_prepend.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,13 @@ +# Arduino wolfSSL Library + +This library is restructured from [wolfSSL](https://github.com/wolfSSL/wolfssl/) Release ${WOLFSSL_VERSION} for the Arduino platform. + +The Official wolfSSL Arduino Library is found in [The Library Manager index](http://downloads.arduino.cc/libraries/library_index.json). + +See the [Arduino-wolfSSL logs](https://downloads.arduino.cc/libraries/logs/github.com/wolfSSL/Arduino-wolfSSL/). + +## Arduino Releases + +The first Official wolfSSL Arduino Library is `5.6.6-Arduino.1`: a slightly modified, post [release 5.6.6](https://github.com/wolfSSL/wolfssl/releases/tag/v5.6.6-stable) version update. + +See other [wolfSSL releases versions](https://github.com/wolfSSL/wolfssl/releases). The `./wolfssl-arduino.sh INSTALL` [script](https://github.com/wolfSSL/wolfssl/tree/master/IDE/ARDUINO) can be used to install specific GitHub versions as needed. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,29 +1,89 @@ -### wolfSSL with Arduino +# wolfSSL with Arduino -##### Reformatting wolfSSL as a compatible Arduino Library -This is a shell script that will re-organize the wolfSSL library to be -compatible with Arduino projects. The Arduino IDE requires a library's source -files to be in the library's root directory with a header file in the name of -the library. This script moves all src/ files to the `IDE/ARDUINO/wolfSSL` -directory and creates a stub header file called `wolfssl.h`. +See the [example sketches](./sketches/README.md): -Step 1: To configure wolfSSL with Arduino, enter the following from within the -wolfssl/IDE/ARDUINO directory: +- [sketches/wolfssl_server](./sketches/wolfssl_server/README.md) +- [sketches/wolfssl_client](./sketches/wolfssl_client/README.md) - `./wolfssl-arduino.sh` +When publishing a new version to the Arduino Registry, be sure to edit `WOLFSSL_VERSION_ARUINO_SUFFIX` in the `wolfssl-arduino.sh` script. -Step 2: Copy the directory wolfSSL that was just created to: -`~/Documents/Arduino/libraries/` directory so the Arduino IDE can find it. +## Boards -Step 3: Edit `/wolfSSL/user_settings.h` +Many of the supported boards are natively built-in to the [Arduino IDE Board Manager](https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-board-manager/) +and by adding [additional cores](https://docs.arduino.cc/learn/starting-guide/cores/) as needed. + +STM32 Support can be added by including this link in the "Additional Boards Managers URLs" field +from [stm32duino/Arduino_Core_STM32](https://github.com/stm32duino/Arduino_Core_STM32?tab=readme-ov-file#getting-started) . + +``` +https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json +``` + +## Using wolfSSL from the Arduino IDE + +The Official wolfSSL: https://github.com/wolfSSL/arduino-wolfSSL See [PR #1](https://github.com/wolfSSL/Arduino-wolfSSL/pull/1). + +This option will allow wolfSSL to be installed directly using the native Arduino tools. + +## Manually Reformatting wolfSSL as a Compatible Arduino Library + +Use [this](./wolfssl-arduino.sh) shell script that will re-organize the wolfSSL library to be +compatible with [Arduino Library Specification](https://arduino.github.io/arduino-cli/0.35/library-specification/) +for projects that use Arduino IDE 1.5.0 or newer. + +The Arduino IDE requires a library's source files to be in the library's root directory with a +header file in the name of the library. This script moves all `src/` files to the `IDE/ARDUINO/wolfSSL/src` +directory and creates a stub header file called `wolfssl.h` inside that directory. + +### Step 1: + +To configure wolfSSL with Arduino, enter ONE of the following 4 commands +from within the `wolfssl/IDE/ARDUINO` directory: + +1. `./wolfssl-arduino.sh` + - Creates an Arduino Library directory structure in the local `wolfSSL` directory of `IDE/ARDUINO`. + - You can add your own `user_settings.h`, or copy/rename the [default](../../examples/configs/user_settings_arduino.h). + +2. `./wolfssl-arduino.sh INSTALL` (The most common option) + - Creates an Arduino Library in the local `wolfSSL` directory + - Moves that directory to the Arduino library directory: + - `$HOME/Arduino/libraries` for most bash environments + - `/mnt/c/Users/$USER/Documents/Arduino/libraries` (for WSL) + - Adds the [default](../../examples/configs/user_settings_arduino.h) as `user_settings.h`. + - The wolfSSL library is now available from the Arduino IDE. + +3. `./wolfssl-arduino.sh INSTALL /path/to/repository` (Used to update [arduino-wolfSSL](https://github.com/wolfSSL/arduino-wolfSSL)) + - Creates an Arduino Library in `wolfSSL` directory + - Copies that directory contents to the specified `/path/to/repository` + - Adds the [default](../../examples/configs/user_settings_arduino.h) as `user_settings.h`. + +4. `./wolfssl-arduino.sh INSTALL /path/to/any/other/directory` + - Creates an Arduino Library in `wolfSSL` directory + - Copies that directory contents to the specified `/path/to/any/other/directory` + +### Step 2: + +Edit `/wolfSSL/src/user_settings.h` If building for Intel Galileo platform add: `#define INTEL_GALILEO`. -Add any other custom settings, for a good start see the examples in wolfssl root -"/examples/configs/user_settings_*.h" +Add any other custom settings. For a good start see the examples in wolfssl root +"[/examples/configs/user_settings_*.h](https://github.com/wolfssl/wolfssl/tree/master/examples/configs)" -Step 4: If you experience any issues with custom user_settings.h see the wolfssl +### Step 3: + +If you experience any issues with custom `user_settings.h` see the wolfssl porting guide here for more assistance: https://www.wolfssl.com/docs/porting-guide/ -Step 5: If you still have any issues contact support@wolfssl.com for more help. +If you have any issues contact support@wolfssl.com for help. + +# Including wolfSSL in Arduino Libraries (for Arduino version 2.0 or greater) + +1. In the Arduino IDE: + +The wolfSSL library should automatically be detected when found in the `libraries` +directory. + + - In `Sketch -> Include Library` choose wolfSSL for new sketches. + ##### Including wolfSSL in Arduino Libraries (for Arduino version 1.6.6) @@ -32,6 +92,90 @@ `IDE/ARDUNIO/wolfSSL` folder. - In `Sketch -> Include Library` choose wolfSSL. -2. Open an example Arduino sketch for wolfSSL: - - wolfSSL Client INO sketch: `sketches/wolfssl_client/wolfssl_client.ino` - - wolfSSL Server INO sketch: `sketches/wolfssl_server/wolfssl_server.ino` +##### wolfSSL Examples + +Open an example Arduino sketch for wolfSSL: + + - wolfSSL [Client INO sketch](./sketches/wolfssl_client/README.md): `sketches/wolfssl_client/wolfssl_client.ino` + + - wolfSSL [Server INO sketch](./sketches/wolfssl_server/README.md): `sketches/wolfssl_server/wolfssl_server.ino` + +#### Script Examples + +Refresh the local Windows Arduino wolfSSL library from GitHub repository directory using WSL: + +Don't forget to edit `WOLFSSL_VERSION_ARUINO_SUFFIX`! + +```bash +# Change to the wolfSSL Arduino IDE directory +cd /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO + +# remove current Arduino wolfSSL library +rm -rf /mnt/c/Users/$USER/Documents/Arduino/libraries/wolfssl + +# Install wolfSSL as an Arduino library +./wolfssl-arduino.sh INSTALL +``` + +Publish wolfSSL from WSL to a `Arduino-wolfSSL-$USER` repository. + +```bash +cd /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO +rm -rf /mnt/c/Users/$USER/Documents/Arduino/libraries/wolfSSL +rm -rf /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO/wolfSSL +./wolfssl-arduino.sh INSTALL /mnt/c/workspace/Arduino-wolfSSL-$USER/ +``` + +Publish wolfSSL from WSL to default Windows local library. + +```bash +cd /mnt/c/workspace/wolfssl-$USER/IDE/ARDUINO +rm -rf /mnt/c/Users/$USER/Documents/Arduino/libraries/wolfSSL +rm -rf /mnt/c/workspace/wolfssl-arduino/IDE/ARDUINO/wolfSSL +./wolfssl-arduino.sh INSTALL +``` + +Test the TLS server by running a local command-line client. + +```bash +cd /mnt/c/workspace/wolfssl-$USER +./examples/client/client -h 192.168.1.43 -p 11111 -v 3 +``` + +Build wolfSSL to include wolfSSH support to an alternate development directory. + +```bash +cd /mnt/c/workspace/wolfssl-$USER +./configure --prefix=/mnt/c/workspace/wolfssh-$USER/wolfssl_install --enable-ssh +make +make install + +``` + +Build wolfSSH with wolfSSL not installed to default directory. + +```bash +cd /mnt/c/workspace/wolfssh-$USER +./configure --with-wolfssl=/mnt/c/workspace/wolfssh-$USER/wolfssl_install +make +./examples/client/client -u jill -h 192.168.1.34 -p 22222 -P upthehill +``` + +Test the current wolfSSL. + +```bash +cd /mnt/c/workspace/wolfssl-arduino +git status +./autogen.sh +./configure --enable-all +make clean +make && make test +``` + +Build and run `testwolfcrypt`. + +```bash +./autogen.sh +./configure --enable-all +make clean && make && ./wolfcrypt/test/testwolfcrypt +``` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -3,6 +3,15 @@ # All paths should be given relative to the root EXTRA_DIST+= IDE/ARDUINO/README.md +EXTRA_DIST+= IDE/ARDUINO/Arduino_README_prepend.md +EXTRA_DIST+= IDE/ARDUINO/keywords.txt +EXTRA_DIST+= IDE/ARDUINO/library.properties.template +EXTRA_DIST+= IDE/ARDUINO/sketches/README.md +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_client/README.md EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_server/README.md EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_version/README.md +EXTRA_DIST+= IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino +EXTRA_DIST+= IDE/ARDUINO/wolfssl.h EXTRA_DIST+= IDE/ARDUINO/wolfssl-arduino.sh diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/keywords.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,21 @@ +# Syntax Coloring Map For wolfSSL +# See https://arduino.github.io/arduino-cli/0.35/library-specification/#keywords +# +# Be sure to use tabs, not spaces. This might help: +# tr ' ' '\t' < keywords1.txt > keywords.txt + +#============================================= +# Datatypes (KEYWORD1) +#============================================= + + +#============================================= +# Methods and Functions (KEYWORD2) +#============================================= +wolfSSL_SetIORecv KEYWORD1 + +#============================================= +# Instances (KEYWORD2) +#============================================= +ctx KEYWORD2 + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/library.properties.template 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9 @@ +name=wolfssl +version=${WOLFSSL_VERSION}${WOLFSSL_VERSION_ARUINO_SUFFIX} +author=wolfSSL Inc. +maintainer=wolfSSL inc +sentence=A lightweight SSL/TLS library written in ANSI C and targeted for embedded, RTOS, and resource-constrained environments. +paragraph=Manual: https://www.wolfssl.com/documentation/manuals/wolfssl/index.html. +category=Communication +url=https://www.wolfssl.com/ +architectures=* diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,12 @@ +# wolfSSL Arduino Examples + +There are currently two example Arduino sketches: + +* [wolfssl_client](./wolfssl_client/README.md): Basic TLS listening client. +* [wolfssl_server](./wolfssl_server/README.md): Basic TLS server. + +Examples have been most recently confirmed operational on the +[Arduino IDE](https://www.arduino.cc/en/software) 2.2.1. + +For examples on other platforms, see the [IDE directory](https://github.com/wolfssl/wolfssl/tree/master/IDE). +Additional examples can be found on [wolfSSL/wolfssl-examples](https://github.com/wolfSSL/wolfssl-examples/). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,22 @@ +# Arduino Basic TLS Listening Client + +Open the [wolfssl_client.ino](./wolfssl_client.ino) file in the Arduino IDE. + +Other IDE products are also supported, such as: + +- [PlatformIO in VS Code](https://docs.platformio.org/en/latest/frameworks/arduino.html) +- [VisualGDB](https://visualgdb.com/tutorials/arduino/) +- [VisualMicro](https://www.visualmicro.com/) + +For examples on other platforms, see the [IDE directory](https://github.com/wolfssl/wolfssl/tree/master/IDE). +Additional examples can be found on [wolfSSL/wolfssl-examples](https://github.com/wolfSSL/wolfssl-examples/). + + +### Troubleshooting + +When encountering odd errors such as `undefined reference to ``_impure_ptr'`, try cleaning the Arduino +cache directories. For Windows, that's typically in: + +```text +C:\Users\%USERNAME%\AppData\Local\Temp\arduino\sketches +``` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_client/wolfssl_client.ino 2024-08-03 07:30:00.000000000 +0000 @@ -19,141 +19,876 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +/* +Tested with: + +1) Intel Galileo acting as the Client, with a laptop acting as a server using + the server example provided in examples/server. + Legacy Arduino v1.86 was used to compile and program the Galileo + +2) Espressif ESP32 WiFi + +3) Arduino Due, Nano33 IoT, Nano RP-2040 +*/ + +/* + * Note to code editors: the Arduino client and server examples are edited in + * parallel for side-by-side comparison between examples. + */ + +/* If you have a private include, define it here, otherwise edit WiFi params */ +#define MY_PRIVATE_CONFIG "/workspace/my_private_config.h" + +/* set REPEAT_CONNECTION to a non-zero value to continually run the example. */ +#define REPEAT_CONNECTION 0 + +/* Edit this with your other TLS host server address to connect to: */ +#define WOLFSSL_TLS_SERVER_HOST "192.168.1.39" + +/* wolfssl TLS examples communicate on port 11111 */ +#define WOLFSSL_PORT 11111 + +/* Choose a monitor serial baud rate: 9600, 14400, 19200, 57600, 74880, etc. */ +#define SERIAL_BAUD 115200 + +/* We'll wait up to 2000 milliseconds to properly shut down connection */ +#define SHUTDOWN_DELAY_MS 2000 + +/* Number of times to retry connection. */ +#define RECONNECT_ATTEMPTS 20 + +/* Optional stress test. Define to consume memory until exhausted: */ +/* #define MEMORY_STRESS_TEST */ + +/* Choose client or server example, not both. */ +#define WOLFSSL_CLIENT_EXAMPLE +/* #define WOLFSSL_SERVER_EXAMPLE */ + +#if defined(MY_PRIVATE_CONFIG) + /* the /workspace directory may contain a private config + * excluded from GitHub with items such as WiFi passwords */ + #include MY_PRIVATE_CONFIG + static const char* ssid PROGMEM = MY_ARDUINO_WIFI_SSID; + static const char* password PROGMEM = MY_ARDUINO_WIFI_PASSWORD; +#else + /* when using WiFi capable boards: */ + static const char* ssid PROGMEM = "your_SSID"; + static const char* password PROGMEM = "your_PASSWORD"; +#endif + +#define BROADCAST_ADDRESS "255.255.255.255" + +/* There's an optional 3rd party NTPClient library by Fabrice Weinberg. + * If it is installed, uncomment define USE_NTP_LIB here: */ +/* #define USE_NTP_LIB */ +#ifdef USE_NTP_LIB + #include +#endif #include +/* Important: make sure settings.h appears before any other wolfSSL headers */ +#include +/* Reminder: settings.h includes user_settings.h + * For ALL project wolfSSL settings, see: + * [your path]/Arduino\libraries\wolfSSL\src\user_settings.h */ #include -#include +#include +#include -const char host[] = "192.168.1.148"; /* server to connect to */ -const int port = 11111; /* port on server to connect to */ +/* Define DEBUG_WOLFSSL in user_settings.h for more verbose logging. */ +#if defined(DEBUG_WOLFSSL) + #define PROGRESS_DOT F("") +#else + #define PROGRESS_DOT F(".") +#endif + +/* Convert a macro to a string */ +#define xstr(x) str(x) +#define str(x) #x + +/* optional board-specific networking includes */ +#if defined(ESP32) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + /* Ensure the F() flash macro is defined */ + #ifndef F + #define F + #endif + WiFiClient client; + +#elif defined(ESP8266) + #define USING_WIFI + #include + WiFiClient client; + +#elif defined(ARDUINO_SAM_DUE) + #include + /* There's no WiFi/Ethernet on the Due. Requires Ethernet Shield. + /* Needs "Ethernet by Various" library to be installed. Tested with V2.0.2 */ + #include + EthernetClient client; + +#elif defined(ARDUINO_SAMD_NANO_33_IOT) + #define USING_WIFI + #include + #include /* Needs Arduino WiFiNINA library installed manually */ + WiFiClient client; + +#elif defined(ARDUINO_ARCH_RP2040) + #define USING_WIFI + #include + #include + WiFiClient client; + +#elif defined(USING_WIFI) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + WiFiClient client; + +/* TODO +#elif defined(OTHER_BOARD) +*/ +#else + #define USING_WIFI + WiFiClient client; + +#endif + +/* Only for syntax highlighters to show interesting options enabled: */ +#if defined(HAVE_SNI) \ + || defined(HAVE_MAX_FRAGMENT) \ + || defined(HAVE_TRUSTED_CA) \ + || defined(HAVE_TRUNCATED_HMAC) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) \ + || defined(HAVE_SUPPORTED_CURVES) \ + || defined(HAVE_ALPN) \ + || defined(HAVE_SESSION_TICKET) \ + || defined(HAVE_SECURE_RENEGOTIATION) \ + || defined(HAVE_SERVER_RENEGOTIATION_INFO) +#endif + +static const char host[] PROGMEM = WOLFSSL_TLS_SERVER_HOST; /* server to connect to */ +static const int port PROGMEM = WOLFSSL_PORT; /* port on server to connect to */ + +static WOLFSSL_CTX* ctx = NULL; +static WOLFSSL* ssl = NULL; +static char* wc_error_message = (char*)malloc(80 + 1); +static char errBuf[80]; + +#if defined(MEMORY_STRESS_TEST) + #define MEMORY_STRESS_ITERATIONS 100 + #define MEMORY_STRESS_BLOCK_SIZE 1024 + #define MEMORY_STRESS_INITIAL (4*1024) + static char* memory_stress[MEMORY_STRESS_ITERATIONS]; /* typically 1K per item */ + static int mem_ctr = 0; +#endif + +static int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); +static int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); +static int reconnect = RECONNECT_ATTEMPTS; +static int lng_index PROGMEM = 0; /* 0 = English */ + +#if defined(__arm__) + #include + extern char _end; + extern "C" char *sbrk(int i); + static char *ramstart=(char *)0x20070000; + static char *ramend=(char *)0x20088000; +#endif + +/*****************************************************************************/ +/* fail_wait - in case of unrecoverable error */ +/*****************************************************************************/ +int fail_wait(void) { + show_memory(); + + Serial.println(F("Failed. Halt.")); + while (1) { + delay(1000); + } + return 0; +} -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); -int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); -int reconnect = 10; +/*****************************************************************************/ +/* show_memory() to optionally view during debugging. */ +/*****************************************************************************/ +int show_memory(void) +{ +#if defined(__arm__) + struct mallinfo mi = mallinfo(); + + char *heapend=sbrk(0); + register char * stack_ptr asm("sp"); + #if defined(DEBUG_WOLFSSL_VERBOSE) + Serial.print(" arena="); + Serial.println(mi.arena); + Serial.print(" ordblks="); + Serial.println(mi.ordblks); + Serial.print(" uordblks="); + Serial.println(mi.uordblks); + Serial.print(" fordblks="); + Serial.println(mi.fordblks); + Serial.print(" keepcost="); + Serial.println(mi.keepcost); + #endif + + #if defined(DEBUG_WOLFSSL) || defined(MEMORY_STRESS_TEST) + Serial.print("Estimated free memory: "); + Serial.print(stack_ptr - heapend + mi.fordblks); + Serial.println(F(" bytes")); + #endif + + #if (0) + /* Experimental: not supported on all devices: */ + Serial.print("RAM Start %lx\n", (unsigned long)ramstart); + Serial.print("Data/Bss end %lx\n", (unsigned long)&_end); + Serial.print("Heap End %lx\n", (unsigned long)heapend); + Serial.print("Stack Ptr %lx\n",(unsigned long)stack_ptr); + Serial.print("RAM End %lx\n", (unsigned long)ramend); + + Serial.print("Heap RAM Used: ",mi.uordblks); + Serial.print("Program RAM Used ",&_end - ramstart); + Serial.print("Stack RAM Used ",ramend - stack_ptr); + + Serial.print("Estimated Free RAM: %d\n\n",stack_ptr - heapend + mi.fordblks); + #endif +#else + Serial.println(F("show_memory() not implemented for this platform")); +#endif + return 0; +} -EthernetClient client; +/*****************************************************************************/ +/* EthernetSend() to send a message string. */ +/*****************************************************************************/ +int EthernetSend(WOLFSSL* ssl, char* message, int sz, void* ctx) { + int sent = 0; + (void)ssl; + (void)ctx; -WOLFSSL_CTX* ctx = NULL; -WOLFSSL* ssl = NULL; + sent = client.write((byte*)message, sz); + return sent; +} -void setup() { - WOLFSSL_METHOD* method; +/*****************************************************************************/ +/* EthernetReceive() to receive a reply string. */ +/*****************************************************************************/ +int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { + int ret = 0; + (void)ssl; + (void)ctx; - Serial.begin(9600); + while (client.available() > 0 && ret < sz) { + reply[ret++] = client.read(); + } + return ret; +} - method = wolfTLSv1_2_client_method(); - if (method == NULL) { - Serial.println("unable to get method"); - return; - } - ctx = wolfSSL_CTX_new(method); - if (ctx == NULL) { - Serial.println("unable to get ctx"); - return; - } - /* initialize wolfSSL using callback functions */ - wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); - wolfSSL_SetIOSend(ctx, EthernetSend); - wolfSSL_SetIORecv(ctx, EthernetReceive); - - return; +/*****************************************************************************/ +/* Arduino setup_hardware() */ +/*****************************************************************************/ +int setup_hardware(void) { + int ret = 0; + +#if defined(ARDUINO_SAMD_NANO_33_IOT) + Serial.println(F("Detected known tested and working Arduino Nano 33 IoT")); +#elif defined(ARDUINO_ARCH_RP2040) + Serial.println(F("Detected known tested and working Arduino RP-2040")); +#elif defined(__arm__) && defined(ID_TRNG) && defined(TRNG) + /* need to manually turn on random number generator on Arduino Due, etc. */ + pmc_enable_periph_clk(ID_TRNG); + trng_enable(TRNG); + Serial.println(F("Enabled ARM TRNG")); +#endif + + show_memory(); + randomSeed(analogRead(0)); + return ret; } -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx) { - int sent = 0; +/*****************************************************************************/ +/* Arduino setup_datetime() */ +/* The device needs to have a valid date within the valid range of certs. */ +/*****************************************************************************/ +int setup_datetime(void) { + int ret = 0; + int ntp_tries = 20; + + /* we need a date in the range of cert expiration */ +#ifdef USE_NTP_LIB + #if defined(ESP32) + NTPClient timeClient(ntpUDP, "pool.ntp.org"); + + timeClient.begin(); + timeClient.update(); + delay(1000); + while (!timeClient.isTimeSet() && (ntp_tries > 0)) { + timeClient.forceUpdate(); + Serial.println(F("Waiting for NTP update")); + delay(2000); + ntp_tries--; + } + if (ntp_tries <= 0) { + Serial.println(F("Warning: gave up waiting on NTP")); + } + Serial.println(timeClient.getFormattedTime()); + Serial.println(timeClient.getEpochTime()); + #endif +#endif + +#if defined(ESP32) + /* see esp32-hal-time.c */ + ntp_tries = 5; + /* Replace "pool.ntp.org" with your preferred NTP server */ + configTime(0, 0, "pool.ntp.org"); + + /* Wait for time to be set */ + while ((time(nullptr) <= 100000) && ntp_tries > 0) { + Serial.println(F("Waiting for time to be set...")); + delay(2000); + ntp_tries--; + } +#endif + + return ret; +} /* setup_datetime */ - sent = client.write((byte*)msg, sz); +/*****************************************************************************/ +/* Arduino setup_network() */ +/*****************************************************************************/ +int setup_network(void) { + int ret = 0; + +#if defined(USING_WIFI) + int status = WL_IDLE_STATUS; + + /* The ESP8266 & ESP32 support both AP and STA. We'll use STA: */ + #if defined(ESP8266) || defined(ESP32) + WiFi.mode(WIFI_STA); + #else + String fv; + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + /* don't continue if no network */ + while (true) ; + } + + fv = WiFi.firmwareVersion(); + if (fv < WIFI_FIRMWARE_LATEST_VERSION) { + Serial.println("Please upgrade the firmware"); + } + #endif + + Serial.print(F("Connecting to WiFi ")); + Serial.print(ssid); + status = WiFi.begin(ssid, password); + while (status != WL_CONNECTED) { + delay(1000); + Serial.print(F(".")); + Serial.print(status); + status = WiFi.status(); + } + + Serial.println(F(" Connected!")); +#else + /* Newer Ethernet shields have a + * MAC address printed on a sticker on the shield */ + byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + IPAddress ip(192, 168, 1, 42); + IPAddress myDns(192, 168, 1, 1); + Ethernet.init(10); /* Most Arduino shields */ + /* Ethernet.init(5); * MKR ETH Shield */ + /* Ethernet.init(0); * Teensy 2.0 */ + /* Ethernet.init(20); * Teensy++ 2.0 */ + /* Ethernet.init(15); * ESP8266 with Adafruit FeatherWing Ethernet */ + /* Ethernet.init(33); * ESP32 with Adafruit FeatherWing Ethernet */ + Serial.println(F("Initialize Ethernet with DHCP:")); + if (Ethernet.begin(mac) == 0) { + Serial.println(F("Failed to configure Ethernet using DHCP")); + /* Check for Ethernet hardware present */ + if (Ethernet.hardwareStatus() == EthernetNoHardware) { + Serial.println(F("Ethernet shield was not found.")); + while (true) { + delay(1); /* do nothing */ + } + } + if (Ethernet.linkStatus() == LinkOFF) { + Serial.println(F("Ethernet cable is not connected.")); + } + /* try to configure using IP address instead of DHCP : */ + Ethernet.begin(mac, ip, myDns); + } + else { + Serial.print(F(" DHCP assigned IP ")); + Serial.println(Ethernet.localIP()); + } + /* We'll assume the Ethernet connection is ready to go. */ +#endif - return sent; + Serial.println(F("********************************************************")); + Serial.print(F(" wolfSSL Example Client IP = ")); +#if defined(USING_WIFI) + Serial.println(WiFi.localIP()); +#else + Serial.println(Ethernet.localIP()); +#endif + Serial.print(F(" Configured Server Host to connect to: ")); + Serial.println(host); + Serial.println(F("********************************************************")); + Serial.println(F("Setup network complete.")); + + return ret; } -int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { - int ret = 0; +/*****************************************************************************/ +/* Arduino setup_wolfssl() */ +/*****************************************************************************/ +int setup_wolfssl(void) { + int ret = 0; + WOLFSSL_METHOD* method; + + /* Show a revision of wolfssl user_settings.h file in use when available: */ +#if defined(WOLFSSL_USER_SETTINGS_ID) + Serial.print(F("WOLFSSL_USER_SETTINGS_ID: ")); + Serial.println(F(WOLFSSL_USER_SETTINGS_ID)); +#else + Serial.println(F("No WOLFSSL_USER_SETTINGS_ID found.")); +#endif + +#if defined(NO_WOLFSSL_SERVER) + Serial.println(F("wolfSSL server code disabled to save space.")); +#endif +#if defined(NO_WOLFSSL_CLIENT) + Serial.println(F("wolfSSL client code disabled to save space.")); +#endif + +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); + Serial.println(F("wolfSSL Debugging is On!")); +#else + Serial.println(F("wolfSSL Debugging is Off! (enable with DEBUG_WOLFSSL)")); +#endif + + /* See ssl.c for TLS cache settings. Larger cache = use more RAM. */ +#if defined(NO_SESSION_CACHE) + Serial.println(F("wolfSSL TLS NO_SESSION_CACHE")); +#elif defined(MICRO_SESSION_CACHEx) + Serial.println(F("wolfSSL TLS MICRO_SESSION_CACHE")); +#elif defined(SMALL_SESSION_CACHE) + Serial.println(F("wolfSSL TLS SMALL_SESSION_CACHE")); +#elif defined(MEDIUM_SESSION_CACHE) + Serial.println(F("wolfSSL TLS MEDIUM_SESSION_CACHE")); +#elif defined(BIG_SESSION_CACHE) + Serial.println(F("wolfSSL TLS BIG_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#else + Serial.println(F("WARNING: Unknown or no TLS session cache setting.")); + /* See wolfssl/src/ssl.c for amount of memory used. + * It is best on embedded devices to choose a TLS session cache size. */ +#endif + + ret = wolfSSL_Init(); + if (ret == WOLFSSL_SUCCESS) { + Serial.println("Successfully called wolfSSL_Init"); + } + else { + Serial.println("ERROR: wolfSSL_Init failed"); + } + + /* See companion server example with wolfSSLv23_server_method here. + * method = wolfSSLv23_client_method()); SSL 3.0 - TLS 1.3. + * method = wolfTLSv1_2_client_method(); only TLS 1.2 + * method = wolfTLSv1_3_client_method(); only TLS 1.3 + * + * see Arduino\libraries\wolfssl\src\user_settings.h */ + + Serial.println("Here we go!"); + + method = wolfSSLv23_client_method(); + if (method == NULL) { + Serial.println(F("unable to get wolfssl client method")); + fail_wait(); + } + ctx = wolfSSL_CTX_new(method); + if (ctx == NULL) { + Serial.println(F("unable to get ctx")); + fail_wait(); + } - while (client.available() > 0 && ret < sz) { - reply[ret++] = client.read(); - } + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_certificates() */ +/*****************************************************************************/ +int setup_certificates(void) { + int ret = 0; + + Serial.println(F("Initializing certificates...")); + show_memory(); + + /* Use built-in validation, No verification callback function: */ + wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); + + /* Certificate */ + Serial.println("Initializing certificates..."); + ret = wolfSSL_CTX_use_certificate_buffer(ctx, + CTX_CLIENT_CERT, + CTX_CLIENT_CERT_SIZE, + CTX_CLIENT_CERT_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use certificate: "); + Serial.println(xstr(CTX_SERVER_CERT)); + } + else { + Serial.println(F("Error: wolfSSL_CTX_use_certificate_buffer failed: ")); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + /* Setup private client key */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + CTX_CLIENT_KEY, + CTX_CLIENT_KEY_SIZE, + CTX_CLIENT_KEY_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use private key buffer: "); + Serial.println(xstr(CTX_SERVER_KEY)); + } + else { + Serial.println(F("Error: wolfSSL_CTX_use_PrivateKey_buffer failed: ")); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + ret = wolfSSL_CTX_load_verify_buffer(ctx, + CTX_CA_CERT, + CTX_CA_CERT_SIZE, + CTX_CA_CERT_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.println(F("Success: load_verify CTX_CA_CERT")); + } + else { + Serial.println(F("Error: wolfSSL_CTX_load_verify_buffer failed: ")); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + + + return ret; +} /* Arduino setup */ + +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino setup() */ +/*****************************************************************************/ +/*****************************************************************************/ +void setup(void) { + int i = 0; + Serial.begin(SERIAL_BAUD); + while (!Serial && (i < 10)) { + /* wait for serial port to connect. Needed for native USB port only */ + delay(1000); + i++; + } + Serial.println(F("")); + Serial.println(F("")); + Serial.println(F("wolfSSL TLS Client Example Startup.")); + + /* define DEBUG_WOLFSSL in wolfSSL user_settings.h for diagnostics */ +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); +#endif + + /* Optionally pre-allocate a large block of memory for testing */ +#if defined(MEMORY_STRESS_TEST) + Serial.println(F("WARNING: Memory Stress Test Active!")); + Serial.print(F("Allocating extra memory: ")); + Serial.print(MEMORY_STRESS_INITIAL); + Serial.println(F(" bytes...")); + memory_stress[mem_ctr] = (char*)malloc(MEMORY_STRESS_INITIAL); + show_memory(); +#endif + + setup_hardware(); + + setup_network(); + + setup_datetime(); + + setup_wolfssl(); + + setup_certificates(); + + /* Initialize wolfSSL using callback functions. */ + wolfSSL_SetIOSend(ctx, EthernetSend); + wolfSSL_SetIORecv(ctx, EthernetReceive); + + Serial.println(F("Completed Arduino setup!")); + /* See companion wolfssl_server.ino code; server begins listening here + * https://github.com/wolfSSL/wolfssl/tree/master/IDE/ARDUINO/sketches/wolfssl_server + * Any other server will work. See also: + * https://github.com/wolfSSL/wolfssl/tree/master/examples/client + */ + /* See companion wolfssl_server.ino code */ + return; +} /* Arduino setup */ - return ret; +/*****************************************************************************/ +/* wolfSSL error_check() */ +/*****************************************************************************/ +int error_check(int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { + int ret = 0; + if (this_ret == WOLFSSL_SUCCESS) { + Serial.print(F("Success: ")); + Serial.println(message); + } + else { + Serial.print(F("ERROR: return = ")); + Serial.print(this_ret); + Serial.print(F(": ")); + Serial.println(message); + Serial.println(wc_GetErrorString(this_ret)); + if (halt_on_error) { + fail_wait(); + } + } + show_memory(); + + return ret; +} /* error_check */ + +/*****************************************************************************/ +/* wolfSSL error_check_ssl */ +/* Parameters: */ +/* ssl is the current WOLFSSL object pointer */ +/* halt_on_error set to true to suspend operations for critical error */ +/* message is expected to be a memory-efficient F("") macro string */ +/*****************************************************************************/ +int error_check_ssl(WOLFSSL* ssl, int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { + int err = 0; + + if (ssl == NULL) { + Serial.println(F("ssl is Null; Unable to allocate SSL object?")); +#ifndef DEBUG_WOLFSSL + Serial.println(F("Define DEBUG_WOLFSSL in user_settings.h for more.")); +#else + Serial.println(F("See wolfssl/wolfcrypt/error-crypt.h for codes.")); +#endif + Serial.print(F("ERROR: ")); + Serial.println(message); + show_memory(); + if (halt_on_error) { + fail_wait(); + } + } + else { + err = wolfSSL_get_error(ssl, this_ret); + if (err == WOLFSSL_SUCCESS) { + Serial.print(F("Success m: ")); + Serial.println(message); + } + else { + if (err < 0) { + wolfSSL_ERR_error_string(err, errBuf); + Serial.print(F("WOLFSSL Error: ")); + Serial.print(err); + Serial.print(F("; ")); + Serial.println(errBuf); + } + else { + Serial.println(F("Success: ssl object.")); + } + } + } + + return err; } +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino loop() */ +/*****************************************************************************/ +/*****************************************************************************/ void loop() { - int err = 0; - int input = 0; - int total_input = 0; - char msg[32] = "hello wolfssl!"; - int msgSz = (int)strlen(msg); - char errBuf[80]; - char reply[80]; - const char* cipherName; - - if (reconnect) { - reconnect--; - - if (client.connect(host, port)) { - - Serial.print("Connected to "); - Serial.println(host); - - ssl = wolfSSL_new(ctx); - if (ssl == NULL) { - Serial.println("Unable to allocate SSL object"); - return; - } - - err = wolfSSL_connect(ssl); - if (err != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Connect Error: "); - Serial.println(errBuf); - } - - Serial.print("SSL version is "); - Serial.println(wolfSSL_get_version(ssl)); - - cipherName = wolfSSL_get_cipher(ssl); - Serial.print("SSL cipher suite is "); - Serial.println(cipherName); - - if ((wolfSSL_write(ssl, msg, msgSz)) == msgSz) { - - Serial.print("Server response: "); - /* wait for data */ - while (!client.available()) {} - /* read data */ - while (wolfSSL_pending(ssl)) { - input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); - total_input += input; - if (input < 0) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Read Error: "); - Serial.println(errBuf); - break; - } else if (input > 0) { - reply[input] = '\0'; - Serial.print(reply); - } else { + char reply[80]; + char msg[32] = "hello wolfssl!"; + const char* cipherName; + int retry_shutdown = SHUTDOWN_DELAY_MS; /* max try, once per millisecond */ + int total_input = 0; + int msgSz = 0; + int input = 0; + int ret = 0; + int err = 0; + msgSz = (int)strlen(msg); + Serial.println(F("")); + Serial.println(F("Starting Arduino loop() ...")); + + if (reconnect) { + reconnect--; + /* WiFi client returns true if connection succeeds, false if not. */ + /* Wired client returns int (1,-1,-2,-3,-4) for connection status. */ + Serial.print(F("Connecting to ")); + Serial.print(host); + Serial.print(F(":")); + Serial.println(port); + /* can also use: IPAddress server(192,168,1,37); */ + Serial.println(F("Here we go...")); + ret = client.connect(host, port); + Serial.println(F("Ok, checking...")); + if (ret > 0) { + Serial.println(F("Connected!")); + + /* initialize wolfSSL */ + ret = wolfSSL_Init(); + error_check(ret, false, F("calling wolfSSL_Init") ); + + /* create secure connection object. see setup for ctx certs. */ + Serial.println(F("Calling ssl = wolfSSL_new(ctx)")); + ssl = wolfSSL_new(ctx); + error_check_ssl(ssl, 0, true, F("Create WOLFSSL object from ctx")); + + Serial.print(F("Connecting to wolfSSL TLS Secure Server...")); + do { + err = 0; /* reset error */ + Serial.println(F("wolfSSL_connect ...")); + ret = wolfSSL_connect(ssl); + Serial.print("wolfSSL_connect return result ="); + Serial.println(ret); + if ((ret != WOLFSSL_SUCCESS) && (ret != WC_PENDING_E)) { + Serial.println(F("Failed connection, checking error.")); + err = error_check_ssl(ssl, ret, true, + F("Create WOLFSSL object from ctx")); + Serial.print("err ="); + Serial.println(err); + } + else { + Serial.print(PROGRESS_DOT); + } + } while (err == WC_PENDING_E); + Serial.println(); - } - } - } else { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Write Error: "); - Serial.println(errBuf); - } - - wolfSSL_shutdown(ssl); - wolfSSL_free(ssl); - - client.stop(); - Serial.println("Connection complete."); - reconnect = 0; - } else { - Serial.println("Trying to reconnect..."); + Serial.println(F("Connected!")); + Serial.print(F("SSL version is ")); + Serial.println(wolfSSL_get_version(ssl)); + + cipherName = wolfSSL_get_cipher(ssl); + Serial.print(F("SSL cipher suite is ")); + Serial.println(cipherName); + + /* see test.h + * TODO: test.h needs a little bit of Arduino work for these: + showPeerEx(ssl, lng_index); + showPeerPEM(ssl); + */ + + Serial.print(F("Sending secure message to server: ")); + Serial.println(msg); + ret = wolfSSL_write(ssl, msg, msgSz); + if (ret == msgSz) { + Serial.print(F("Waiting for Server response...")); + + while (!client.available()) { + /* wait for data */ + delay(1); /* 1 ms delay */ + } + + Serial.print(F("Reading response..")); + /* read data */ + do { + ret = wolfSSL_read(ssl, reply, sizeof(reply) - 1); + if (ret < 0) { + error_check_ssl(ssl, ret, false, + F("during TLS Read")); + } + else { + Serial.print(PROGRESS_DOT); + } + } while (err == WC_PENDING_E); + Serial.println(); + + Serial.println(); + Serial.println(reply); /* typically: I hear you fa shizzle! */ + Serial.println(); + + } /* wolfSSL_write message size matched */ + else { + error_check_ssl(ssl, ret, false, + F("during TLS Write")); + } /* any wolfSSL_write message size mismatch is an error */ + + Serial.print(F("Shutting down..")); + do { + delay(1); + Serial.print(PROGRESS_DOT); + retry_shutdown--; + ret = wolfSSL_shutdown(ssl); + } while ( (ret == WOLFSSL_SHUTDOWN_NOT_DONE) + && (retry_shutdown > 0) + ); /* There may be pending data, so wait until done. */ + Serial.println(); + + if (retry_shutdown <= 0) { + /* if wolfSSL_free is called before properly shutting down the + * ssl object, undesired results may occur. */ + Serial.println(F("Warning! Shutdown did not properly complete.")); + } + + wolfSSL_free(ssl); + client.stop(); + Serial.println(F("Connection complete.")); + if (REPEAT_CONNECTION) { + reconnect = RECONNECT_ATTEMPTS; + } + else { + reconnect = 0; + } + } /* client.connect(host, port) */ + else { + Serial.println(F("Problem sending message. Trying to reconnect...")); + } } - } - delay(1000); -} + delay(1000); + if ((reconnect > 0) && (REPEAT_CONNECTION)) { + Serial.println(F("Arduino loop repeating...")); + Serial.println(); + } + else { + printf("wow"); + Serial.println(F("Done!")); + while(1) { + /* wait forever */ + } + } + +#if defined(MEMORY_STRESS_TEST) + if (mem_ctr < MEMORY_STRESS_ITERATIONS) { + /* reminder: mem_ctr == 0 is MEMORY_STRESS_INITIAL allocation */ + mem_ctr++; + Serial.print(F("Memory stress increment: ")); + Serial.print(mem_ctr); + Serial.print(F(". Allocating addition memory (bytes): ")); + Serial.println(MEMORY_STRESS_BLOCK_SIZE); + memory_stress[mem_ctr] = (char*)malloc(MEMORY_STRESS_BLOCK_SIZE); + show_memory(); + } +#endif +} /* Arduino loop repeats */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,134 @@ +# Arduino Basic TLS Server + +Open the [wolfssl_server.ino](./wolfssl_server.ino) file in the Arduino IDE. + +Other IDE products are also supported, such as: + +- [PlatformIO in VS Code](https://docs.platformio.org/en/latest/frameworks/arduino.html) +- [VisualGDB](https://visualgdb.com/tutorials/arduino/) +- [VisualMicro](https://www.visualmicro.com/) + +For examples on other platforms, see the [IDE directory](https://github.com/wolfssl/wolfssl/tree/master/IDE). +Additional examples can be found on [wolfSSL/wolfssl-examples](https://github.com/wolfSSL/wolfssl-examples/). + +## Connect with an Arduino Sketch + +See the companion [Arduino Sketch Client](../wolfssl_client/wolfssl_client.ino). + +## Connect with Linux Client + +See also the [wolfSSL Example TLS Client](https://github.com/wolfSSL/wolfssl/tree/master/examples/client) +and [wolfSSL Example TLS Server](https://github.com/wolfSSL/wolfssl/tree/master/examples/server). + +Assuming a listening [Arduino Sketch Server](./wolfssl_server.ino) at `192.168.1.38` on port `11111`, +connect with the `client` executable: + +``` +./examples/client/client -h 192.168.1.38 -p 11111 -v 3 +``` + +## wolfSSL Error -308 wolfSSL_connect error state on socket + +When using a wired Ethernet connection, and this error is encountered, simply +press the reset button or power cycle the Arduino before making a connection. + +Here's one possible script to test the server from a command-line client: + +```bash +#!/bin/bash +echo "client log " > client_log.txt +counter=1 +THIS_ERR=0 +while [ $THIS_ERR -eq 0 ]; do + ./examples/client/client -h 192.168.1.38 -p 11111 -v 3 >> client_log.txt + + THIS_ERR=$? + if [ $? -ne 0 ]; then + echo "Failed!" + exit 1 + fi + echo "Iteration $counter" + echo "Iteration $counter" >> client_log.txt + ((counter++)) +done +``` + +Output expected from the `client` command: + +``` +$ ./examples/client/client -h 192.168.1.38 -p 11111 -v 3 +Alternate cert chain used + issuer : /C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + subject: /C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Support/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + altname = example.com + altname = 127.0.0.1 + serial number:01 +SSL version is TLSv1.2 +SSL cipher suite is ECDHE-RSA-AES128-GCM-SHA256 +SSL curve name is SECP256R1 +--- +Server certificate +-----BEGIN CERTIFICATE----- +MIIE6DCCA9CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh +d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO +BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXGRa7yvCQwuJXOL07W9hyIvHyf+6hn +f/5cnFF194rKB+c1L4/hvXvAL3yrZKgX/Mpde7rgIeVyLm8uhtiVc9qsG1O5Xz/X +GQ0lT+FjY1GLC2Q/rUO4pRxcNLOuAKBjxfZ/C1loeHOmjBipAm2vwxkBLrgQ48bM +QLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEMvVSz4W1fHLwjc9EJA4kU0hC5ZMMq +0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ +6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaOCAUUwggFBMB0GA1UdDgQW +BBSzETLJkpiE4sn40DtuA0LKHw6OPDCB1AYDVR0jBIHMMIHJgBQnjmcRdMMmHT/t +M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh +bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL +DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG +9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFDNEGqhsAez2YPJwUQpM0RT6vOlEMAwG +A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0l +BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQBK/7nl +hZvaU2Z/ByK/thnqQuukEQdi/zlfMzc6hyZxPROyyrhkOHuKmUgOpaRrsZlu4EZR +vRlSrbymfip6fCOnzNteQ31rBMi33ZWt8JGAWcUZkSYnkbhIHOtVtqp9pDjxA7xs +i6qU1jwFepbFBvEmFC51+93lNbMBLLOtYlohmgi+Vvz5okKHhuWpxZnPrhS+4LkI +JA0dXNYU4UyfQLOp6S1Si0y/rEQxZ8GNBoXsD+SZ10t7IQZm1OT1nf+O8IY5WB2k +W+Jj73zJGIeoAiUQPoco+fXvR56lgAgRkGj+0aOoUbk3/9XKfId/a7wsEsjFhYv8 +DMa5hrjJBMNRN9JP +-----END CERTIFICATE----- +Session timeout set to 500 seconds +Client Random : 56A0BB9647B064D3F20947032B74B31FDB4C93DBAC9460BA8AEA213A2B2DD4A8 +SSL-Session: + Protocol : TLSv1.2 + Cipher : TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + Session-ID: 3255404E997FA9C27ECB4F1A20A70E722E4AA504B63A945FC175434D1907EC31 + Session-ID-ctx: + Master-Key: 67F22168BBADD678643BBA76B398277270C29788AC18FD05B57F6B715F49A7BCEEF75BEAF7FE266B0CC058534AF76C1F + TLS session ticket: NONE + Start Time: 1705533296 + Timeout : 500 (sec) + Extended master secret: no +I hear you fa shizzle! +``` + +### Troubleshooting + +When encountering odd errors such as `undefined reference to ``_impure_ptr'`, such as this: + +```text +c:/users/gojimmypi/appdata/local/arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/esp-2021r2-patch5-8.4.0/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\gojimmypi\AppData\Local\Temp\arduino\sketches\EAB8D79A02D1ECF107884802D893914E\libraries\wolfSSL\wolfcrypt\src\logging.c.o:(.literal.wolfssl_log+0x8): undefined reference to `_impure_ptr' +collect2.exe: error: ld returned 1 exit status + +exit status 1 + +Compilation error: exit status 1 +``` + +Try cleaning the Arduino cache directories. For Windows, that's typically in: + +```text +C:\Users\%USERNAME%\AppData\Local\Temp\arduino\sketches +``` + +Remove all other boards from other serial ports, leaving one the one being programmed. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_server/wolfssl_server.ino 2024-08-03 07:30:00.000000000 +0000 @@ -19,161 +19,820 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +/* +Tested with: + +1) Intel Galileo acting as the Client, with a laptop acting as a server using + the server example provided in examples/server. + Legacy Arduino v1.86 was used to compile and program the Galileo + +2) Espressif ESP32 WiFi + +3) Arduino Due, Nano33 IoT, Nano RP-2040 +*/ + +/* + * Note to code editors: the Arduino client and server examples are edited in + * parallel for side-by-side comparison between examples. + */ + +/* If you have a private include, define it here, otherwise edit WiFi params */ +#define MY_PRIVATE_CONFIG "/workspace/my_private_config.h" + +/* set REPEAT_CONNECTION to a non-zero value to continually run the example. */ +#define REPEAT_CONNECTION 1 + +/* Edit this with your other TLS host server address to connect to: */ +/* #define WOLFSSL_TLS_SERVER_HOST "192.168.1.34" */ + +/* wolfssl TLS examples communicate on port 11111 */ +#define WOLFSSL_PORT 11111 + +/* Choose a monitor serial baud rate: 9600, 14400, 19200, 57600, 74880, etc. */ +#define SERIAL_BAUD 115200 + +/* We'll wait up to 2000 milliseconds to properly shut down connection */ +#define SHUTDOWN_DELAY_MS 2000 + +/* Number of times to retry connection. */ +#define RECONNECT_ATTEMPTS 20 + +/* Optional stress test. Define to consume memory until exhausted: */ +/* #define MEMORY_STRESS_TEST */ + +/* Choose client or server example, not both. */ +/* #define WOLFSSL_CLIENT_EXAMPLE */ +#define WOLFSSL_SERVER_EXAMPLE + +#if defined(MY_PRIVATE_CONFIG) + /* the /workspace directory may contain a private config + * excluded from GitHub with items such as WiFi passwords */ + #include MY_PRIVATE_CONFIG + static const char* ssid PROGMEM = MY_ARDUINO_WIFI_SSID; + static const char* password PROGMEM = MY_ARDUINO_WIFI_PASSWORD; +#else + /* when using WiFi capable boards: */ + static const char* ssid PROGMEM = "your_SSID"; + static const char* password PROGMEM = "your_PASSWORD"; +#endif + +#define BROADCAST_ADDRESS "255.255.255.255" + +/* There's an optional 3rd party NTPClient library by Fabrice Weinberg. + * If it is installed, uncomment define USE_NTP_LIB here: */ +/* #define USE_NTP_LIB */ +#ifdef USE_NTP_LIB + #include +#endif #include +/* Important: make sure settings.h appears before any other wolfSSL headers */ +#include +/* Reminder: settings.h includes user_settings.h + * For ALL project wolfSSL settings, see: + * [your path]/Arduino\libraries\wolfSSL\src\user_settings.h */ #include -#include - -#define USE_CERT_BUFFERS_256 #include +#include -#ifdef NO_WOLFSSL_SERVER - #error Please undefine NO_WOLFSSL_SERVER for this example +/* Define DEBUG_WOLFSSL in user_settings.h for more verbose logging. */ +#if defined(DEBUG_WOLFSSL) + #define PROGRESS_DOT F("") +#else + #define PROGRESS_DOT F(".") #endif -const int port = 11111; /* port to listen on */ +/* Convert a macro to a string */ +#define xstr(x) str(x) +#define str(x) #x + +/* optional board-specific networking includes */ +#if defined(ESP32) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + /* Ensure the F() flash macro is defined */ + #ifndef F + #define F + #endif + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(ESP8266) + #define USING_WIFI + #include + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(ARDUINO_SAM_DUE) + #include + /* There's no WiFi/Ethernet on the Due. Requires Ethernet Shield. + /* Needs "Ethernet by Various" library to be installed. Tested with V2.0.2 */ + #include + EthernetClient client; + EthernetClient server(WOLFSSL_PORT); +#elif defined(ARDUINO_SAMD_NANO_33_IOT) + #define USING_WIFI + #include + #include /* Needs Arduino WiFiNINA library installed manually */ + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(ARDUINO_ARCH_RP2040) + #define USING_WIFI + #include + #include + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#elif defined(USING_WIFI) + #define USING_WIFI + #include + #include + #ifdef USE_NTP_LIB + WiFiUDP ntpUDP; + #endif + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +/* TODO +#elif defined(OTHER_BOARD) +*/ +#else + #define USING_WIFI + WiFiClient client; + WiFiServer server(WOLFSSL_PORT); +#endif -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); -int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); +/* Only for syntax highlighters to show interesting options enabled: */ +#if defined(HAVE_SNI) \ + || defined(HAVE_MAX_FRAGMENT) \ + || defined(HAVE_TRUSTED_CA) \ + || defined(HAVE_TRUNCATED_HMAC) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) \ + || defined(HAVE_SUPPORTED_CURVES) \ + || defined(HAVE_ALPN) \ + || defined(HAVE_SESSION_TICKET) \ + || defined(HAVE_SECURE_RENEGOTIATION) \ + || defined(HAVE_SERVER_RENEGOTIATION_INFO) +#endif -EthernetServer server(port); -EthernetClient client; -WOLFSSL_CTX* ctx = NULL; -WOLFSSL* ssl = NULL; +/* we expect our IP address from DHCP */ -void setup() { - int err; - WOLFSSL_METHOD* method; +static WOLFSSL_CTX* ctx = NULL; +static WOLFSSL* ssl = NULL; +static char* wc_error_message = (char*)malloc(80 + 1); +static char errBuf[80]; + +#if defined(MEMORY_STRESS_TEST) + #define MEMORY_STRESS_ITERATIONS 100 + #define MEMORY_STRESS_BLOCK_SIZE 1024 + #define MEMORY_STRESS_INITIAL (4*1024) + static char* memory_stress[MEMORY_STRESS_ITERATIONS]; /* typically 1K per item */ + static int mem_ctr = 0; +#endif - Serial.begin(9600); +static int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx); +static int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx); +static int reconnect = RECONNECT_ATTEMPTS; +static int lng_index PROGMEM = 0; /* 0 = English */ + +#if defined(__arm__) + #include + extern char _end; + extern "C" char *sbrk(int i); + static char *ramstart=(char *)0x20070000; + static char *ramend=(char *)0x20088000; +#endif - method = wolfTLSv1_2_server_method(); - if (method == NULL) { - Serial.println("unable to get method"); - return; - } - ctx = wolfSSL_CTX_new(method); - if (ctx == NULL) { - Serial.println("unable to get ctx"); - return; - } +/*****************************************************************************/ +/* fail_wait - in case of unrecoverable error */ +/*****************************************************************************/ +int fail_wait(void) { + show_memory(); + + Serial.println(F("Failed. Halt.")); + while (1) { + delay(1000); + } + return 0; +} - /* initialize wolfSSL using callback functions */ - wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); - wolfSSL_SetIOSend(ctx, EthernetSend); - wolfSSL_SetIORecv(ctx, EthernetReceive); - - /* setup the private key and certificate */ - err = wolfSSL_CTX_use_PrivateKey_buffer(ctx, ecc_key_der_256, - sizeof_ecc_key_der_256, WOLFSSL_FILETYPE_ASN1); - if (err != WOLFSSL_SUCCESS) { - Serial.println("error setting key"); - return; - } - err = wolfSSL_CTX_use_certificate_buffer(ctx, serv_ecc_der_256, - sizeof_serv_ecc_der_256, WOLFSSL_FILETYPE_ASN1); - if (err != WOLFSSL_SUCCESS) { - Serial.println("error setting certificate"); - return; - } +/*****************************************************************************/ +/* show_memory() to optionally view during debugging. */ +/*****************************************************************************/ +int show_memory(void) +{ +#if defined(__arm__) + struct mallinfo mi = mallinfo(); + + char *heapend=sbrk(0); + register char * stack_ptr asm("sp"); + #if defined(DEBUG_WOLFSSL_VERBOSE) + Serial.print(" arena="); + Serial.println(mi.arena); + Serial.print(" ordblks="); + Serial.println(mi.ordblks); + Serial.print(" uordblks="); + Serial.println(mi.uordblks); + Serial.print(" fordblks="); + Serial.println(mi.fordblks); + Serial.print(" keepcost="); + Serial.println(mi.keepcost); + #endif + + #if defined(DEBUG_WOLFSSL) || defined(MEMORY_STRESS_TEST) + Serial.print("Estimated free memory: "); + Serial.print(stack_ptr - heapend + mi.fordblks); + Serial.println(F(" bytes")); + #endif + + #if (0) + /* Experimental: not supported on all devices: */ + Serial.print("RAM Start %lx\n", (unsigned long)ramstart); + Serial.print("Data/Bss end %lx\n", (unsigned long)&_end); + Serial.print("Heap End %lx\n", (unsigned long)heapend); + Serial.print("Stack Ptr %lx\n",(unsigned long)stack_ptr); + Serial.print("RAM End %lx\n", (unsigned long)ramend); + + Serial.print("Heap RAM Used: ",mi.uordblks); + Serial.print("Program RAM Used ",&_end - ramstart); + Serial.print("Stack RAM Used ",ramend - stack_ptr); + + Serial.print("Estimated Free RAM: %d\n\n",stack_ptr - heapend + mi.fordblks); + #endif +#else + Serial.println(F("show_memory() not implemented for this platform")); +#endif + return 0; +} + +/*****************************************************************************/ +/* EthernetSend() to send a message string. */ +/*****************************************************************************/ +int EthernetSend(WOLFSSL* ssl, char* message, int sz, void* ctx) { + int sent = 0; + (void)ssl; + (void)ctx; - /* Start the server */ - server.begin(); - - return; + sent = client.write((byte*)message, sz); + return sent; } -int EthernetSend(WOLFSSL* ssl, char* msg, int sz, void* ctx) { - int sent = 0; +/*****************************************************************************/ +/* EthernetReceive() to receive a reply string. */ +/*****************************************************************************/ +int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { + int ret = 0; + (void)ssl; + (void)ctx; + + while (client.available() > 0 && ret < sz) { + reply[ret++] = client.read(); + } + return ret; +} - sent = client.write((byte*)msg, sz); +/*****************************************************************************/ +/* Arduino setup_hardware() */ +/*****************************************************************************/ +int setup_hardware(void) { + int ret = 0; + +#if defined(ARDUINO_SAMD_NANO_33_IOT) + Serial.println(F("Detected known tested and working Arduino Nano 33 IoT")); +#elif defined(ARDUINO_ARCH_RP2040) + Serial.println(F("Detected known tested and working Arduino RP-2040")); +#elif defined(__arm__) && defined(ID_TRNG) && defined(TRNG) + /* need to manually turn on random number generator on Arduino Due, etc. */ + pmc_enable_periph_clk(ID_TRNG); + trng_enable(TRNG); + Serial.println(F("Enabled ARM TRNG")); +#endif - return sent; + show_memory(); + randomSeed(analogRead(0)); + return ret; } -int EthernetReceive(WOLFSSL* ssl, char* reply, int sz, void* ctx) { - int ret = 0; +/*****************************************************************************/ +/* Arduino setup_datetime() */ +/* The device needs to have a valid date within the valid range of certs. */ +/*****************************************************************************/ +int setup_datetime(void) { + int ret = 0; + int ntp_tries = 20; + + /* we need a date in the range of cert expiration */ +#ifdef USE_NTP_LIB + #if defined(ESP32) + NTPClient timeClient(ntpUDP, "pool.ntp.org"); + + timeClient.begin(); + timeClient.update(); + delay(1000); + while (!timeClient.isTimeSet() && (ntp_tries > 0)) { + timeClient.forceUpdate(); + Serial.println(F("Waiting for NTP update")); + delay(2000); + ntp_tries--; + } + if (ntp_tries <= 0) { + Serial.println(F("Warning: gave up waiting on NTP")); + } + Serial.println(timeClient.getFormattedTime()); + Serial.println(timeClient.getEpochTime()); + #endif +#endif + +#if defined(ESP32) + /* see esp32-hal-time.c */ + ntp_tries = 5; + /* Replace "pool.ntp.org" with your preferred NTP server */ + configTime(0, 0, "pool.ntp.org"); + + /* Wait for time to be set */ + while ((time(nullptr) <= 100000) && ntp_tries > 0) { + Serial.println(F("Waiting for time to be set...")); + delay(2000); + ntp_tries--; + } +#endif - while (client.available() > 0 && ret < sz) { - reply[ret++] = client.read(); - } + return ret; +} /* setup_datetime */ - return ret; +/*****************************************************************************/ +/* Arduino setup_network() */ +/*****************************************************************************/ +int setup_network(void) { + int ret = 0; + +#if defined(USING_WIFI) + int status = WL_IDLE_STATUS; + + /* The ESP8266 & ESP32 support both AP and STA. We'll use STA: */ + #if defined(ESP8266) || defined(ESP32) + WiFi.mode(WIFI_STA); + #else + String fv; + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + /* don't continue if no network */ + while (true) ; + } + + fv = WiFi.firmwareVersion(); + if (fv < WIFI_FIRMWARE_LATEST_VERSION) { + Serial.println("Please upgrade the firmware"); + } + #endif + + Serial.print(F("Connecting to WiFi ")); + Serial.print(ssid); + status = WiFi.begin(ssid, password); + while (status != WL_CONNECTED) { + delay(1000); + Serial.print(F(".")); + Serial.print(status); + status = WiFi.status(); + } + + Serial.println(F(" Connected!")); +#else + /* Newer Ethernet shields have a + * MAC address printed on a sticker on the shield */ + byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + IPAddress ip(192, 168, 1, 42); + IPAddress myDns(192, 168, 1, 1); + Ethernet.init(10); /* Most Arduino shields */ + /* Ethernet.init(5); * MKR ETH Shield */ + /* Ethernet.init(0); * Teensy 2.0 */ + /* Ethernet.init(20); * Teensy++ 2.0 */ + /* Ethernet.init(15); * ESP8266 with Adafruit FeatherWing Ethernet */ + /* Ethernet.init(33); * ESP32 with Adafruit FeatherWing Ethernet */ + Serial.println(F("Initialize Ethernet with DHCP:")); + if (Ethernet.begin(mac) == 0) { + Serial.println(F("Failed to configure Ethernet using DHCP")); + /* Check for Ethernet hardware present */ + if (Ethernet.hardwareStatus() == EthernetNoHardware) { + Serial.println(F("Ethernet shield was not found.")); + while (true) { + delay(1); /* do nothing */ + } + } + if (Ethernet.linkStatus() == LinkOFF) { + Serial.println(F("Ethernet cable is not connected.")); + } + /* try to configure using IP address instead of DHCP : */ + Ethernet.begin(mac, ip, myDns); + } + else { + Serial.print(F(" DHCP assigned IP ")); + Serial.println(Ethernet.localIP()); + } + /* We'll assume the Ethernet connection is ready to go. */ +#endif + + Serial.println(F("********************************************************")); + Serial.print(F(" wolfSSL Example Server IP = ")); +#if defined(USING_WIFI) + Serial.println(WiFi.localIP()); +#else + Serial.println(Ethernet.localIP()); +#endif + /* In server mode, there's no host definition. */ + /* See companion example: wolfssl_client.ino */ + Serial.println(F("********************************************************")); + Serial.println(F("Setup network complete.")); + + return ret; } -void loop() { - int err = 0; - int input = 0; - char errBuf[80]; - char reply[80]; - int replySz = 0; - const char* cipherName; - - /* Listen for incoming client requests. */ - client = server.available(); - if (!client) { +/*****************************************************************************/ +/* Arduino setup_wolfssl() */ +/*****************************************************************************/ +int setup_wolfssl(void) { + int ret = 0; + WOLFSSL_METHOD* method; + + /* Show a revision of wolfssl user_settings.h file in use when available: */ +#if defined(WOLFSSL_USER_SETTINGS_ID) + Serial.print(F("WOLFSSL_USER_SETTINGS_ID: ")); + Serial.println(F(WOLFSSL_USER_SETTINGS_ID)); +#else + Serial.println(F("No WOLFSSL_USER_SETTINGS_ID found.")); +#endif + +#if defined(NO_WOLFSSL_SERVER) + Serial.println(F("wolfSSL server code disabled to save space.")); +#endif +#if defined(NO_WOLFSSL_CLIENT) + Serial.println(F("wolfSSL client code disabled to save space.")); +#endif + +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); + Serial.println(F("wolfSSL Debugging is On!")); +#else + Serial.println(F("wolfSSL Debugging is Off! (enable with DEBUG_WOLFSSL)")); +#endif + + /* See ssl.c for TLS cache settings. Larger cache = use more RAM. */ +#if defined(NO_SESSION_CACHE) + Serial.println(F("wolfSSL TLS NO_SESSION_CACHE")); +#elif defined(MICRO_SESSION_CACHEx) + Serial.println(F("wolfSSL TLS MICRO_SESSION_CACHE")); +#elif defined(SMALL_SESSION_CACHE) + Serial.println(F("wolfSSL TLS SMALL_SESSION_CACHE")); +#elif defined(MEDIUM_SESSION_CACHE) + Serial.println(F("wolfSSL TLS MEDIUM_SESSION_CACHE")); +#elif defined(BIG_SESSION_CACHE) + Serial.println(F("wolfSSL TLS BIG_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#elif defined(HUGE_SESSION_CACHE) + Serial.println(F("wolfSSL TLS HUGE_SESSION_CACHE")); +#else + Serial.println(F("WARNING: Unknown or no TLS session cache setting.")); + /* See wolfssl/src/ssl.c for amount of memory used. + * It is best on embedded devices to choose a TLS session cache size. */ +#endif + + ret = wolfSSL_Init(); + if (ret == WOLFSSL_SUCCESS) { + Serial.println("Successfully called wolfSSL_Init"); + } + else { + Serial.println("ERROR: wolfSSL_Init failed"); + } + + /* See companion server example with wolfSSLv23_server_method here. + * method = wolfSSLv23_client_method()); SSL 3.0 - TLS 1.3. + * method = wolfTLSv1_2_client_method(); only TLS 1.2 + * method = wolfTLSv1_3_client_method(); only TLS 1.3 + * + * see Arduino\libraries\wolfssl\src\user_settings.h */ + + Serial.println("Here we go!"); + + method = wolfSSLv23_server_method(); + if (method == NULL) { + Serial.println(F("unable to get wolfssl server method")); + fail_wait(); + } + ctx = wolfSSL_CTX_new(method); + if (ctx == NULL) { + Serial.println(F("unable to get ctx")); + fail_wait(); + } + + return ret; +} + +/*****************************************************************************/ +/* Arduino setup_certificates() */ +/*****************************************************************************/ +int setup_certificates(void) { + int ret = 0; + + Serial.println(F("Initializing certificates...")); + show_memory(); + + /* Use built-in validation, No verification callback function: */ + wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0); + + /* Certificate */ + Serial.println("Initializing certificates..."); + ret = wolfSSL_CTX_use_certificate_buffer(ctx, + CTX_SERVER_CERT, + CTX_SERVER_CERT_SIZE, + CTX_CA_CERT_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use certificate: "); + Serial.println(xstr(CTX_SERVER_CERT)); + } + else { + Serial.print("Error: wolfSSL_CTX_use_certificate_buffer failed: "); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + /* Setup private server key */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + CTX_SERVER_KEY, + CTX_SERVER_KEY_SIZE, + CTX_SERVER_KEY_TYPE); + if (ret == WOLFSSL_SUCCESS) { + Serial.print("Success: use private key buffer: "); + Serial.println(xstr(CTX_SERVER_KEY)); + } + else { + Serial.print("Error: wolfSSL_CTX_use_PrivateKey_buffer failed: "); + wc_ErrorString(ret, wc_error_message); + Serial.println(wc_error_message); + fail_wait(); + } + + return ret; +} /* Arduino setup */ + +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino setup() */ +/*****************************************************************************/ +/*****************************************************************************/ +void setup(void) { + int i = 0; + Serial.begin(SERIAL_BAUD); + while (!Serial && (i < 10)) { + /* wait for serial port to connect. Needed for native USB port only */ + delay(1000); + i++; + } + + Serial.println(F("")); + Serial.println(F("")); + Serial.println(F("wolfSSL TLS Server Example Startup.")); + + /* define DEBUG_WOLFSSL in wolfSSL user_settings.h for diagnostics */ +#if defined(DEBUG_WOLFSSL) + wolfSSL_Debugging_ON(); +#endif + + /* Optionally pre-allocate a large block of memory for testing */ +#if defined(MEMORY_STRESS_TEST) + Serial.println(F("WARNING: Memory Stress Test Active!")); + Serial.print(F("Allocating extra memory: ")); + Serial.print(MEMORY_STRESS_INITIAL); + Serial.println(F(" bytes...")); + memory_stress[mem_ctr] = (char*)malloc(MEMORY_STRESS_INITIAL); + show_memory(); +#endif + + setup_hardware(); + + setup_network(); + + setup_datetime(); + + setup_wolfssl(); + + setup_certificates(); + + /* Initialize wolfSSL using callback functions. */ + wolfSSL_SetIOSend(ctx, EthernetSend); + wolfSSL_SetIORecv(ctx, EthernetReceive); + +#if defined THIS_USER_SETTINGS_VERSION + Serial.print(F("This user_settings.h version:")) + Serial.println(THIS_USER_SETTINGS_VERSION) +#endif + + /* Start the server + * See https://www.arduino.cc/reference/en/libraries/ethernet/server.begin/ + */ + + Serial.println(F("Completed Arduino setup()")); + + server.begin(); + Serial.println("Begin Server... (waiting for remote client to connect)"); + + /* See companion wolfssl_client.ino code */ return; - } +} /* Arduino setup */ + +/*****************************************************************************/ +/* wolfSSL error_check() */ +/*****************************************************************************/ +int error_check(int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { + int ret = 0; + if (this_ret == WOLFSSL_SUCCESS) { + Serial.print(F("Success: ")); + Serial.println(message); + } + else { + Serial.print(F("ERROR: return = ")); + Serial.print(this_ret); + Serial.print(F(": ")); + Serial.println(message); + Serial.println(wc_GetErrorString(this_ret)); + if (halt_on_error) { + fail_wait(); + } + } + show_memory(); - if (client.connected()) { + return ret; +} /* error_check */ - Serial.println("Client connected"); +/*****************************************************************************/ +/* wolfSSL error_check_ssl */ +/* Parameters: */ +/* ssl is the current WOLFSSL object pointer */ +/* halt_on_error set to true to suspend operations for critical error */ +/* message is expected to be a memory-efficient F("") macro string */ +/*****************************************************************************/ +int error_check_ssl(WOLFSSL* ssl, int this_ret, bool halt_on_error, + const __FlashStringHelper* message) { + int err = 0; - ssl = wolfSSL_new(ctx); if (ssl == NULL) { - Serial.println("Unable to allocate SSL object"); - return; + Serial.println(F("ssl is Null; Unable to allocate SSL object?")); +#ifndef DEBUG_WOLFSSL + Serial.println(F("Define DEBUG_WOLFSSL in user_settings.h for more.")); +#else + Serial.println(F("See wolfssl/wolfcrypt/error-crypt.h for codes.")); +#endif + Serial.print(F("ERROR: ")); + Serial.println(message); + show_memory(); + if (halt_on_error) { + fail_wait(); + } + } + else { + err = wolfSSL_get_error(ssl, this_ret); + if (err == WOLFSSL_SUCCESS) { + Serial.print(F("Success m: ")); + Serial.println(message); + } + else { + if (err < 0) { + wolfSSL_ERR_error_string(err, errBuf); + Serial.print(F("WOLFSSL Error: ")); + Serial.print(err); + Serial.print(F("; ")); + Serial.println(errBuf); + } + else { + Serial.println(F("Success: ssl object.")); + } + } } - err = wolfSSL_accept(ssl); - if (err != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Accept Error: "); - Serial.println(errBuf); - } - - Serial.print("SSL version is "); - Serial.println(wolfSSL_get_version(ssl)); - - cipherName = wolfSSL_get_cipher(ssl); - Serial.print("SSL cipher suite is "); - Serial.println(cipherName); - - Serial.print("Server Read: "); - /* wait for data */ - while (!client.available()) {} - /* read data */ - while (wolfSSL_pending(ssl)) { - input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); - if (input < 0) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Read Error: "); - Serial.println(errBuf); - break; - } else if (input > 0) { - replySz = input; - reply[input] = '\0'; - Serial.print(reply); - } else { - Serial.println(); - } - } - - /* echo data */ - if ((wolfSSL_write(ssl, reply, replySz)) != replySz) { - err = wolfSSL_get_error(ssl, 0); - wolfSSL_ERR_error_string(err, errBuf); - Serial.print("TLS Write Error: "); - Serial.println(errBuf); - } - - wolfSSL_shutdown(ssl); - wolfSSL_free(ssl); - } - - client.stop(); - Serial.println("Connection complete"); + return err; } + +/*****************************************************************************/ +/*****************************************************************************/ +/* Arduino loop() */ +/*****************************************************************************/ +/*****************************************************************************/ +void loop() { + char errBuf[80] = "(no error"; + char reply[80] = "(no reply)"; + const char msg[] = "I hear you fa shizzle!"; + const char* cipherName; + int input = 0; + int replySz = 0; + int retry_shutdown = SHUTDOWN_DELAY_MS; /* max try, once per millisecond */ + int ret = 0; + IPAddress broadcast_address(255, 255, 255, 255); + + /* Listen for incoming client requests. */ + client = server.available(); + if (client) { + Serial.println("Have Client"); + while (!client.connected()) { + /* wait for the client to actually connect */ + delay(10); + } + Serial.print("Client connected from remote IP: "); + Serial.println(client.remoteIP()); + + ssl = wolfSSL_new(ctx); + if (ssl == NULL) { + Serial.println("Unable to allocate SSL object"); + fail_wait(); + } + + ret = wolfSSL_accept(ssl); + if (ret != WOLFSSL_SUCCESS) { + ret = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(ret, errBuf); + Serial.print("TLS Accept Error: "); + Serial.println(errBuf); + } + + cipherName = wolfSSL_get_cipher(ssl); + Serial.print("SSL cipher suite is "); + Serial.println(cipherName); + + Serial.print("Server Read: "); + while (!client.available()) { + /* wait for data */ + } + + /* read data */ + while (wolfSSL_pending(ssl)) { + input = wolfSSL_read(ssl, reply, sizeof(reply) - 1); + if (input < 0) { + ret = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(ret, errBuf); + Serial.print("TLS Read Error: "); + Serial.println(errBuf); + break; + } + else if (input > 0) { + replySz = input; + reply[input] = '\0'; + Serial.print(reply); + } + else { + Serial.println(""); + } + } + + /* Write our message into reply buffer to send */ + memset(reply, 0, sizeof(reply)); + memcpy(reply, msg, sizeof(msg)); + replySz = strnlen(reply, sizeof(reply)); + + Serial.println("Sending reply..."); + if ((wolfSSL_write(ssl, reply, replySz)) != replySz) { + ret = wolfSSL_get_error(ssl, 0); + wolfSSL_ERR_error_string(ret, errBuf); + Serial.print("TLS Write Error: "); + Serial.println(errBuf); + } + else { + Serial.println("Reply sent!"); + } + + Serial.println("Shutdown!"); + do { + delay(1); + retry_shutdown--; + ret = wolfSSL_shutdown(ssl); + } while ((ret == WOLFSSL_SHUTDOWN_NOT_DONE) && (retry_shutdown > 0)); + + if (retry_shutdown <= 0) { + /* if wolfSSL_free is called before properly shutting down the + * ssl object, undesired results may occur. */ + Serial.println("Warning! Shutdown did not properly complete."); + } + + wolfSSL_free(ssl); + Serial.println("Connection complete."); + if (REPEAT_CONNECTION) { + Serial.println(); + Serial.println("Waiting for next connection."); + } + else { + client.stop(); + Serial.println("Done!"); + while (1) { + /* wait forever if not repeating */ + delay(100); + } + } + } + else { + /* Serial.println("Client not connected. Trying again..."); */ + } + + delay(100); +} /* Arduino loop repeats */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3 @@ +# Arduino Basic Hello World + +This example simply compiles in wolfSSL and shows the current version number. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/sketches/wolfssl_version/wolfssl_version.ino 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +#include +#include +#include + +/* Choose a monitor serial baud rate: 9600, 14400, 19200, 57600, 74880, etc. */ +#define SERIAL_BAUD 115200 + +/* Arduino setup */ +void setup() { + Serial.begin(SERIAL_BAUD); + while (!Serial) { + /* wait for serial port to connect. Needed for native USB port only */ + } + Serial.println(F("")); + Serial.println(F("")); + Serial.println(F("wolfSSL setup complete!")); +} + +/* Arduino main application loop. */ +void loop() { + Serial.print("wolfSSL Version: "); + Serial.println(LIBWOLFSSL_VERSION_STRING); + delay(60000); +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl-arduino.sh 2024-08-03 07:30:00.000000000 +0000 @@ -2,89 +2,323 @@ # this script will reformat the wolfSSL source code to be compatible with # an Arduino project -# run as bash ./wolfssl-arduino.sh +# run as bash ./wolfssl-arduino.sh [INSTALL] [path] +# +# ./wolfssl-arduino.sh +# The default is to install to a local wolfSSL directory (`ROOT_DIR`). +# If successfully built, and the INSTALL option is used, tis directory +# is then moved to the target. +# +# ./wolfssl-arduino.sh INSTALL +# Creates a local wolfSSL directory and then moves it to the ARDUINO_ROOT +# +# ./wolfssl-arduino.sh INSTALL /mnt/c/workspace/Arduino-wolfSSL-$USER +# Updates the Arduino-wolfSSL fork for $USER to refresh versions. +# +# To ensure a pristine build, the directory must not exist. +# +# Reminder there's typically no $USER for GitHub actions, but: +# ROOT_DIR="/mnt/c/Users/$USER/Documents/Arduino/libraries" +# +# The company name is "wolfSSL Inc."; There’s a space, no comma, and a period after "Inc." +# The Arduino library name is "wolfssl" (all lower case) +# The Arduino library directory name is "wolfssl" (all lower case) +# The Arduino library include file is "wolfssl.h" (all lower case) +# The Published wolfSSL Arduino Registry is at https://github.com/wolfSSL/Arduino-wolfSSL.git +# See https://downloads.arduino.cc/libraries/logs/github.com/wolfSSL/Arduino-wolfSSL/ +ROOT_DIR="/wolfssl" + +# The Arduino Version will initially have a suffix appended during fine tuning stage. +WOLFSSL_VERSION_ARUINO_SUFFIX="-Arduino.3" + +# For verbose copy, set CP_CMD="-v", otherwise clear it: CP_CMD="cp" +# Do not set to empty string, as copy will fail with this: CP_CMD="" +# CP_CMD="cp -v " +CP_CMD="cp " + +# Specify the executable shell checker you want to use: +MY_SHELLCHECK="shellcheck" + +# There are special circumstances to publish to GitHub repository. +# Typically: https://github.com/wolfSSL/Arduino-wolfSSL +# +# Unlike a local Arduino library that requires a clean directory, +# we'll allow extra files, overwrites, etc. +# +# Note in all cases, the local IDE/ARDUINO/wolfssl must be empty. +THIS_INSTALL_IS_GITHUB="false" + +# Check if the executable is available in the PATH +if command -v "$MY_SHELLCHECK" >/dev/null 2>&1; then + # Run your command here + shellcheck "$0" || exit 1 +else + echo "$MY_SHELLCHECK is not installed. Please install it if changes to this script have been made." +fi + +if ! [ "$CP_CMD" = "cp " ]; then + if [ "$CP_CMD" = "cp -v" ]; then + echo "Copy verbose mode" + else + echo "ERROR: Copy mode not supported: $CP_CMD" + exit 1 + fi +fi + +# Check environment +if [ -n "$WSL_DISTRO_NAME" ]; then + # we found a non-blank WSL environment distro name + current_path="$(pwd)" + pattern="/mnt/?" + if echo "$current_path" | grep -Eq "^$pattern"; then + # if we are in WSL and shared Windows file system, 'ln' does not work. + ARDUINO_ROOT="/mnt/c/Users/$USER/Documents/Arduino/libraries" + else + ARDUINO_ROOT="$HOME/Arduino/libraries" + fi +fi +echo "The Arduino library root is: $ARDUINO_ROOT" + +if [ $# -gt 0 ]; then + THIS_OPERATION="$1" + if [ "$THIS_OPERATION" = "INSTALL" ]; then + THIS_INSTALL_DIR=$2 + + echo "Install is active." + + if [ "$THIS_INSTALL_DIR" = "" ]; then + if [ -d "$ARDUINO_ROOT$ROOT_DIR" ]; then + echo "Error: the installation directory already exists: $ARDUINO_ROOT$ROOT_DIR" + echo "A new directory needs to be created to ensure there are no stray files" + echo "Please delete or move the directory and try again." + exit 1 + fi + else + echo "Installing to $THIS_INSTALL_DIR" + if [ -d "$THIS_INSTALL_DIR/.git" ];then + echo "Target is a GitHub repository." + THIS_INSTALL_IS_GITHUB="true" + else + echo "Target is NOT a GitHub repository." + fi + fi + else + echo "Error: not a valid operation: $THIS_OPERATION" + exit 1 + fi +fi + -DIR=${PWD##*/} +ROOT_SRC_DIR="${ROOT_DIR}/src" +EXAMPLES_DIR="${ROOT_DIR}/examples" +WOLFSSL_SRC="${ROOT_SRC_DIR}/src" +WOLFSSL_HEADERS="${ROOT_SRC_DIR}/wolfssl" +WOLFCRYPT_ROOT="${ROOT_SRC_DIR}/wolfcrypt" +WOLFCRYPT_SRC="${WOLFCRYPT_ROOT}/src" +WOLFCRYPT_HEADERS="${WOLFSSL_HEADERS}/wolfcrypt" +OPENSSL_DIR="${WOLFSSL_HEADERS}/openssl" + + +# TOP indicates the file directory for top level of the wolfssl repository. +TOP_DIR="../.." +WOLFSSL_SRC_TOP="${TOP_DIR}/src" +WOLFSSL_HEADERS_TOP="${TOP_DIR}/wolfssl" +WOLFCRYPT_ROOT_TOP="${TOP_DIR}/wolfcrypt" +WOLFCRYPT_SRC_TOP="${WOLFCRYPT_ROOT_TOP}/src" +WOLFCRYPT_HEADERS_TOP="${WOLFSSL_HEADERS_TOP}/wolfcrypt" +OPENSSL_DIR_TOP="${WOLFSSL_HEADERS_TOP}/openssl" + + +WOLFSSL_VERSION=$(grep -i "LIBWOLFSSL_VERSION_STRING" ${TOP_DIR}/wolfssl/version.h | cut -d '"' -f 2) +if [ "$WOLFSSL_VERSION" = "" ]; then + echo "ERROR: Could not find wolfSSL Version in ${TOP_DIR}/wolfssl/version.h" + exit 1 +else + echo "Found wolfSSL version $WOLFSSL_VERSION" + echo "# WOLFSSL_VERSION_ARUINO_SUFFIX $WOLFSSL_VERSION_ARUINO_SUFFIX" +fi +echo "" -space(){ - echo "" >> "$1" -} +THIS_DIR=${PWD##*/} -if [ "$DIR" = "ARDUINO" ]; then - if [ ! -d "wolfSSL" ]; then - mkdir wolfSSL +if [ "$THIS_DIR" = "ARDUINO" ]; then + # mkdir ./wolfssl + if [ -d ".${ROOT_DIR}" ]; then + echo "ERROR: $(realpath ".${ROOT_DIR}") is not empty" + exit 1 + else + echo "Step 01: mkdir .${ROOT_DIR}" + mkdir ."${ROOT_DIR}" fi - cp ../../src/*.c ./wolfSSL - cp ../../wolfcrypt/src/*.c ./wolfSSL + # mkdir ./wolfssl/src + if [ ! -d ".${ROOT_SRC_DIR}" ]; then + echo "Step 02: mkdir .${ROOT_SRC_DIR}" + mkdir ."${ROOT_SRC_DIR}" + fi - if [ ! -d "wolfSSL/wolfssl" ]; then - mkdir wolfSSL/wolfssl + # mkdir ./wolfssl/src/wolfssl + if [ ! -d ".${WOLFSSL_HEADERS}" ]; then + echo "Step 03: mkdir .${WOLFSSL_HEADERS}" + mkdir ."${WOLFSSL_HEADERS}" fi - cp ../../wolfssl/*.h ./wolfSSL/wolfssl - if [ ! -d "wolfSSL/wolfssl/wolfcrypt" ]; then - mkdir wolfSSL/wolfssl/wolfcrypt + + # cp ../../wolfssl/*.h ./wolfssl/src/wolfssl + echo "Step 04: cp ${WOLFSSL_HEADERS_TOP}/*.h .${WOLFSSL_HEADERS}" + $CP_CMD "${WOLFSSL_HEADERS_TOP}"/*.h ."${WOLFSSL_HEADERS}" + if [ ! -d ".${WOLFCRYPT_HEADERS}" ]; then + # mkdir ./wolfssl/src/wolfssl/wolfcrypt + echo "Step 05: mkdir .${WOLFCRYPT_HEADERS}" + mkdir ."${WOLFCRYPT_HEADERS}" + mkdir ."${WOLFCRYPT_HEADERS}/port" + mkdir ."${WOLFCRYPT_HEADERS}/port/atmel" + mkdir ."${WOLFCRYPT_HEADERS}/port/Espressif" fi - cp ../../wolfssl/wolfcrypt/*.h ./wolfSSL/wolfssl/wolfcrypt - # support misc.c as include in wolfcrypt/src - if [ ! -d "./wolfSSL/wolfcrypt" ]; then - mkdir ./wolfSSL/wolfcrypt + # cp ../../wolfssl/wolfcrypt/*.h ./wolfssl/src/wolfssl/wolfcrypt + echo "Step 06: cp ${WOLFCRYPT_HEADERS_TOP}/*.h .${WOLFCRYPT_HEADERS}" + $CP_CMD "${WOLFCRYPT_HEADERS_TOP}"/*.h ."${WOLFCRYPT_HEADERS}" || exit 1 + $CP_CMD "${WOLFCRYPT_HEADERS_TOP}"/port/atmel/*.h ."${WOLFCRYPT_HEADERS}/port/atmel" || exit 1 + $CP_CMD "${WOLFCRYPT_HEADERS_TOP}"/port/Espressif/*.h ."${WOLFCRYPT_HEADERS}/port/Espressif" || exit 1 + + # Add in source files to wolfcrypt/src + if [ ! -d ".${WOLFCRYPT_ROOT}" ]; then + # mkdir ./wolfssl/src/wolfcrypt + echo "Step 07: mkdir .${WOLFCRYPT_ROOT}" + mkdir ."${WOLFCRYPT_ROOT}" fi - if [ ! -d "./wolfSSL/wolfcrypt/src" ]; then - mkdir ./wolfSSL/wolfcrypt/src + + # mkdir ./wolfssl/src/wolfcrypt/src + if [ ! -d ".${WOLFCRYPT_SRC}" ]; then + echo "Step 08: mkdir .${WOLFCRYPT_SRC}" + mkdir ."${WOLFCRYPT_SRC}" + mkdir ."${WOLFCRYPT_SRC}"/port + mkdir ."${WOLFCRYPT_SRC}"/port/atmel + mkdir ."${WOLFCRYPT_SRC}"/port/Espressif fi - cp ../../wolfcrypt/src/misc.c ./wolfSSL/wolfcrypt/src - cp ../../wolfcrypt/src/asm.c ./wolfSSL/wolfcrypt/src + # cp ../../wolfcrypt/src/*.c ./wolfssl/src/wolfcrypt/src + echo "Step 09: cp ${WOLFCRYPT_SRC_TOP}/*.c .${WOLFCRYPT_SRC}" + $CP_CMD -r "${WOLFCRYPT_SRC_TOP}"/*.c ."${WOLFCRYPT_SRC}" || exit 1 + $CP_CMD -r "${WOLFCRYPT_SRC_TOP}"/port/atmel/*.c ."${WOLFCRYPT_SRC}"/port/atmel || exit 1 + $CP_CMD -r "${WOLFCRYPT_SRC_TOP}"/port/Espressif/*.c ."${WOLFCRYPT_SRC}"/port/Espressif || exit 1 + + # Add in source files to top level src folders + if [ ! -d ".${WOLFSSL_SRC}" ]; then + # mkdir ./wolfssl/src/src + echo "Step 10: mkdir .${WOLFSSL_SRC}" + mkdir ."${WOLFSSL_SRC}" + fi + $CP_CMD "${WOLFSSL_SRC_TOP}"/*.c ."${WOLFSSL_SRC}" || exit 1 # put bio and evp as includes - mv ./wolfSSL/bio.c ./wolfSSL/wolfssl - mv ./wolfSSL/evp.c ./wolfSSL/wolfssl + $CP_CMD ."${WOLFSSL_SRC}"/bio.c ."${WOLFSSL_HEADERS}" || exit 1 + $CP_CMD ."${WOLFCRYPT_SRC}"/evp.c ."${WOLFSSL_HEADERS}" || exit 1 # make a copy of evp.c and bio.c for ssl.c to include inline - cp ./wolfSSL/wolfssl/evp.c ./wolfSSL/wolfcrypt/src/evp.c - cp ./wolfSSL/wolfssl/bio.c ./wolfSSL/wolfcrypt/src/bio.c - + $CP_CMD ."${WOLFSSL_HEADERS}"/evp.c ."${WOLFCRYPT_SRC}"/evp.c || exit 1 + $CP_CMD ."${WOLFSSL_HEADERS}"/bio.c ."${WOLFCRYPT_SRC}"/bio.c || exit 1 + # copy openssl compatibility headers to their appropriate location - if [ ! -d "./wolfSSL/wolfssl/openssl" ]; then - mkdir ./wolfSSL/wolfssl/openssl + if [ ! -d ".${OPENSSL_DIR}" ]; then + mkdir ."${OPENSSL_DIR}" fi - cp ../../wolfssl/openssl/* ./wolfSSL/wolfssl/openssl + $CP_CMD "${OPENSSL_DIR_TOP}"/* ."${OPENSSL_DIR}" || exit 1 - echo "/* Generated wolfSSL header file for Arduino */" > ./wolfSSL/wolfssl.h - echo "#include " >> ./wolfSSL/wolfssl.h - echo "#include " >> ./wolfSSL/wolfssl.h - echo "#include " >> ./wolfSSL/wolfssl.h - - if [ ! -f "./wolfSSL/user_settings.h" ]; then - echo "/* Generated wolfSSL user_settings.h file for Arduino */" > ./wolfSSL/user_settings.h - echo "#ifndef ARDUINO_USER_SETTINGS_H" >> ./wolfSSL/user_settings.h - echo "#define ARDUINO_USER_SETTINGS_H" >> ./wolfSSL/user_settings.h - space ./wolfSSL/user_settings.h - echo "/* Platform */" >> ./wolfSSL/user_settings.h - echo "#define WOLFSSL_ARDUINO" >> ./wolfSSL/user_settings.h - space ./wolfSSL/user_settings.h - echo "/* Math library (remove this to use normal math)*/" >> ./wolfSSL/user_settings.h - echo "#define USE_FAST_MATH" >> ./wolfSSL/user_settings.h - echo "#define TFM_NO_ASM" >> ./wolfSSL/user_settings.h - space ./wolfSSL/user_settings.h - echo "/* RNG DEFAULT !!FOR TESTING ONLY!! */" >> ./wolfSSL/user_settings.h - echo "/* comment out the error below to get started w/ bad entropy source" >> ./wolfSSL/user_settings.h - echo " * This will need fixed before distribution but is OK to test with */" >> ./wolfSSL/user_settings.h - echo "#error \"needs solved, see: https://www.wolfssl.com/docs/porting-guide/\"" >> ./wolfSSL/user_settings.h - echo "#define WOLFSSL_GENSEED_FORTEST" >> ./wolfSSL/user_settings.h - space ./wolfSSL/user_settings.h - echo "#endif /* ARDUINO_USER_SETTINGS_H */" >> ./wolfSSL/user_settings.h - fi - - cp wolfSSL/wolfssl/wolfcrypt/settings.h wolfSSL/wolfssl/wolfcrypt/settings.h.bak - echo " /* wolfSSL Generated ARDUINO settings */" > ./wolfSSL/wolfssl/wolfcrypt/settings.h - echo "#ifndef WOLFSSL_USER_SETTINGS" >> ./wolfSSL/wolfssl/wolfcrypt/settings.h - echo " #define WOLFSSL_USER_SETTINGS" >> ./wolfSSL/wolfssl/wolfcrypt/settings.h - echo "#endif /* WOLFSSL_USER_SETTINGS */" >> ./wolfSSL/wolfssl/wolfcrypt/settings.h - echo " /* wolfSSL Generated ARDUINO settings: END */" >> ./wolfSSL/wolfssl/wolfcrypt/settings.h - cat ./wolfSSL/wolfssl/wolfcrypt/settings.h.bak >> ./wolfSSL/wolfssl/wolfcrypt/settings.h + # Finally, copy the Arduino-specific wolfssl library files into place: [lib]/src + $CP_CMD ./wolfssl.h ".${ROOT_SRC_DIR}"/wolfssl.h + echo "Copy examples...." + # Copy examples + mkdir -p ".${ROOT_SRC_DIR}"/examples + + echo "Copy wolfssl_client example...." + mkdir -p ".${EXAMPLES_DIR}"/wolfssl_client + $CP_CMD ./sketches/wolfssl_client/wolfssl_client.ino ".${EXAMPLES_DIR}"/wolfssl_client/wolfssl_client.ino || exit 1 + $CP_CMD ./sketches/wolfssl_client/README.md ".${EXAMPLES_DIR}"/wolfssl_client/README.md || exit 1 + + echo "Copy wolfssl_server example...." + mkdir -p .${EXAMPLES_DIR}/wolfssl_server + $CP_CMD ./sketches/wolfssl_server/wolfssl_server.ino ".${EXAMPLES_DIR}"/wolfssl_server/wolfssl_server.ino || exit 1 + $CP_CMD ./sketches/wolfssl_server/README.md ".${EXAMPLES_DIR}"/wolfssl_server/README.md || exit 1 + + echo "Copy wolfssl_server example...." + mkdir -p .${EXAMPLES_DIR}/wolfssl_version + $CP_CMD ./sketches/wolfssl_version/wolfssl_version.ino ".${EXAMPLES_DIR}"/wolfssl_version/wolfssl_version.ino || exit 1 + $CP_CMD ./sketches/wolfssl_version/README.md ".${EXAMPLES_DIR}"/wolfssl_version/README.md || exit 1 else echo "ERROR: You must be in the IDE/ARDUINO directory to run this script" + exit 1 +fi + +# At this point, the library is complete, but we need some additional files. +# +# optional diagnostics: +# echo ".${ROOT_DIR}" +# echo "${TOP_DIR}" +# echo "cp ${TOP_DIR}/README.md .${ROOT_DIR}/" + +# Replace the `${WOLFSSL_VERSION}` text in Arduino_README_prepend.md, +# saving it to a .tmp file. Prepend that file to the wolfSSL README.md +# file as PREPENDED_README.md, then copy that to the publish directory +# as an Arduino-specific README.md file. +VERSION_PLACEHOLDER="\${WOLFSSL_VERSION}" +ARDUINO_VERSION_SUFFIX_PLACEHOLDER="\${WOLFSSL_VERSION_ARUINO_SUFFIX}" +PREPEND_FILE="Arduino_README_prepend.md" +PROPERTIES_FILE_TEMPLATE="library.properties.template" +sed s/"$VERSION_PLACEHOLDER"/"$WOLFSSL_VERSION"/ "$PREPEND_FILE" > "$PREPEND_FILE.tmp" +cat "$PREPEND_FILE.tmp" ${TOP_DIR}/README.md > PREPENDED_README.md + +# Here we'll insert the wolfSSL version into the `library.properties.tmp` file, along with an Arduino version suffix. +# The result should be something like version=5.6.6.Arduino.1 (for the 1st incremental version on top of 5.6.6) +sed s/"$VERSION_PLACEHOLDER"/"$WOLFSSL_VERSION"/ "$PROPERTIES_FILE_TEMPLATE" > "library.properties.tmp" +sed -i.backup s/"$ARDUINO_VERSION_SUFFIX_PLACEHOLDER"/"$WOLFSSL_VERSION_ARUINO_SUFFIX"/ "library.properties.tmp" + +# cat library.properties.tmp +# echo "${WOLFSSL_VERSION_ARUINO_SUFFIX}" + +echo "Step 11: Final root file copy" +$CP_CMD PREPENDED_README.md ."${ROOT_DIR}"/README.md || exit 1 +$CP_CMD library.properties.tmp ."${ROOT_DIR}"/library.properties || exit 1 +$CP_CMD "${TOP_DIR}"/"LICENSING" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/"README" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/"COPYING" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/"ChangeLog.md" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/".editorconfig" ."${ROOT_DIR}"/ || exit 1 +$CP_CMD "${TOP_DIR}"/".gitignore" ."${ROOT_DIR}"/ || exit 1 + +$CP_CMD "keywords.txt" ."${ROOT_DIR}"/ || exit 1 + + +echo "Step 12: Workspace to publish:" +echo "" +head -n 3 PREPENDED_README.md +echo "" +ls ./wolfssl -al +echo "" + +# Optionally install to a separate directory. +# Note we should have exited above if a problem was encountered, +# as we'll never want to install a bad library. +if [ "$THIS_OPERATION" = "INSTALL" ]; then + if [ "$THIS_INSTALL_IS_GITHUB" = "true" ]; then + echo "Installing to GitHub directory: $THIS_INSTALL_DIR" + cp -r ."$ROOT_DIR"/* "$THIS_INSTALL_DIR" || exit 1 + else + echo "Config:" + echo "cp ../../examples/configs/user_settings_arduino.h ".${ROOT_SRC_DIR}"/user_settings.h" + # Nearly an ordinary copy, but we remove any lines with ">>" (typically edit with caution warning in comments) + grep -v '>>' ../../examples/configs/user_settings_arduino.h > ".${ROOT_SRC_DIR}"/user_settings.h || exit 1 + + # Show the user_settings.h revision string: + grep "WOLFSSL_USER_SETTINGS_ID" ."${ROOT_SRC_DIR}/user_settings.h" + echo "" + + echo "Install:" + echo "mv .$ROOT_DIR $ARDUINO_ROOT" + mv ."$ROOT_DIR" "$ARDUINO_ROOT" || exit 1 + + echo "Arduino wolfSSL Version: $WOLFSSL_VERSION$WOLFSSL_VERSION_ARUINO_SUFFIX" + fi fi + +echo "Done!" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ARDUINO/wolfssl.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,39 @@ +/* wolfssl.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Edit with caution. This is an Arduino-library specific header for wolfSSL */ + +#ifndef WOLFSSL_USER_SETTINGS + #define WOLFSSL_USER_SETTINGS +#endif + +#include + +/* wolfSSL user_settings.h must be included from settings.h */ +#include +#include + +int wolfSSL_Arduino_Serial_Print(const char *const s) +{ + /* See wolfssl/wolfcrypt/logging.c */ + Serial.println(F(s)); + return 0; +}; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/AURIX/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/AURIX/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/AURIX/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/AURIX/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -98,7 +98,6 @@ #define WOLFSSL_SP_NO_MALLOC //#define WOLFSSL_SP_DIV_32 /* do not use 64-bit divides */ - //#define WOLFSSL_SP_CACHE_RESISTANT /* use smaller version of code */ #define WOLFSSL_SP_SMALL @@ -205,7 +204,7 @@ /* use heap allocation for ECC points */ #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#define FP_MAX_BITS_ECC (256 * 2) #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,7 @@ /* wolfCrypt_Init/wolfCrypt_Cleanup to turn CryptoCell hardware on/off */ #include -/* SEGGER_RTT_Init, you can potential replace it with other serial terminal */ +/* SEGGER_RTT_Init, you can potentially replace it with other serial terminal */ #include "SEGGER_RTT.h" int main(void) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/CRYPTOCELL/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -88,7 +88,6 @@ #define WOLFSSL_HAVE_SP_RSA #define WOLFSSL_HAVE_SP_DH #define WOLFSSL_HAVE_SP_ECC - #define WOLFSSL_SP_CACHE_RESISTANT //#define WOLFSSL_SP_MATH /* only SP math - eliminates fast math code */ /* Assembly */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/deos_wolfssl/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/deos_wolfssl/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/deos_wolfssl/.project 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/deos_wolfssl/.project 2024-08-03 07:30:00.000000000 +0000 @@ -240,9 +240,9 @@ WOLFSSL_ROOT/wolfcrypt/src/fe_operations.c - wolfcrypt/src/fe_x25519_128.i + wolfcrypt/src/fe_x25519_128.h 1 - WOLFSSL_ROOT/wolfcrypt/src/fe_x25519_128.i + WOLFSSL_ROOT/wolfcrypt/src/fe_x25519_128.h wolfcrypt/src/fp_mont_small.i diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/DEOS/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -85,7 +85,6 @@ #define WOLFSSL_SP_4096 /* Enable RSA/RH 4096-bit support */ #define WOLFSSL_SP_384 /* Enable ECC 384-bit SECP384R1 support */ - //#define WOLFSSL_SP_CACHE_RESISTANT #define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */ //#define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ECLIPSE/MICRIUM/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/MICRIUM/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ECLIPSE/MICRIUM/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ECLIPSE/MICRIUM/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -40,7 +40,7 @@ 4. Right click on each folders, add or link all the source code in the corresponding folder in wolfSSL. -5. Remove non-C platform dependent files from your build. At the moment, only aes_asm.asm, aes_gcm_asm.asm and aes_asm.s must be removed from your wolfssl/wolfcrypt/src folder. +5. Remove non-C platform dependent files from your build. At the moment, only aes_asm.asm, aes_gcm_asm.asm, aes_xts_asm.asm and aes_asm.s must be removed from your wolfssl/wolfcrypt/src folder. 6. In your C/C++ compiler preprocessor settings, add the wolfSSL directories to your include paths. Here's an example of the paths that must be added. @@ -118,41 +118,41 @@ wolfSSL version 3.15.5 ------------------------------------------------------------------------------ wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) -RNG 225 KB tooks 1.026 seconds, 219.313 KB/s -AES-128-CBC-enc 250 KB toks 1.105 seconds 226.210 KB/s -AES-128-CBC-dec 225 KB tooks 1.005 seconds, 223.922 KB/s -AES-192-CBC-enc 225 KB tooks 1.076 seconds, 209.104 KB/s -AES-192-CBC-dec 225 KB tooks 1.077 seconds, 208.981 K/s -AES-56-CBC-enc 200 KB tooks 1.029 seconds, 19.396 KB/s -AES-256-CBC-dec 200 KB toks 1.022 seconds, 195.785 KB/s -AES-128-GCM-enc 125 KB tooks 1.28 secnds, 101.70 KB/s -AES-128-GC-dec 125 KB tooks 1.228 seconds 101.756 KB/s -AES-192-GCM-enc 100 KB tooks 1.026 seconds, 97.493 KB/s -AES-192-GCM-dec 100 KB tooks 1.026 seconds, 97.480 KB/s -AES-256-GCM-enc 100 KB tooks 1.065 seconds, 93.909 KB/s -AES-256-GC-dec 100 KB tooks 1.065 seconds, 93.897 KB/s -RABBIT 2 MB tooks 1.011 seconds, 2.19 MB/s -3DES 100 KB tooks 1.007 sconds, 99.312 KB/s -MD5 3MB tooks 1.008 seonds, 2.907 MBs -SHA 1 MB tooks 1.09 secnds, 1.283 MB/s -SHA-256 575 KB tooks 1.037 seconds, 554.501 KB/s -SHA-512 200 KB tooks 1.003 seconds, 199.444 KB/s -HMAC-MD5 3 B tooks 1.002 seconds, 2.876 MB/s -HMAC-SHA26 550 KB tooks 1.000 seconds, 549.95 KB//s -HMAC-SHA512 200 KB toks 1.018 seconds, 196.452 KB/s -RSA 2048 public 8 ops took 1.025 sec, avg 128.135 ms, 7.804 op/sec -RSA 2048 private 2 ops took 4.972 ec, avg 2485.951 s, 0.402 ops/sec -DH 2048 key en 2 ops took 1.927 sec, avg 96.303 ms, 1.038 op/sec -DH 2048 agree 2ops took 1.937 sc, avg 968.578 ms, 1.032 ops/sec -ECC 256 key gen 3 ops took 1.185 sec, avg 394.944 ms, 2.53 ops/sec -ECDHE 256 agree 4 ops took 1.585 sec, avg 396.168 ms, 2.524 ops/sec -ECSA 256 sign 4 ops took 1.611 sec, avg 402.865 ms, 2.482 ops/sec -ECDSA 256verif 2 ops tok 1.586 sec, avg 793.153 ms, 1.261 opssec -CURVE 25519 key gen 2 ops took 1.262 sec, avg 630.907 ms, 1.585 ops/sec -CURE 25519 agree 2 ops took 1.261 sec, avg630.469 ms, 1.586 ops/sec -ED 2519 key gen 2 ops took 1.27 sec, avg 66.099ms, 1.572 ops/sec -ED 25519 sign 2 ops took 1.303 sec, ag 65.633 ms, 1.35 op/sec -ED 25519 verify 2 ops took 2.674 sec, avg1337.68 ms 0.748 ops/ec +RNG 225 KB took 1.026 seconds, 219.313 KB/s +AES-128-CBC-enc 250 KB took 1.105 seconds 226.210 KB/s +AES-128-CBC-dec 225 KB took 1.005 seconds, 223.922 KB/s +AES-192-CBC-enc 225 KB took 1.076 seconds, 209.104 KB/s +AES-192-CBC-dec 225 KB took 1.077 seconds, 208.981 K/s +AES-56-CBC-enc 200 KB took 1.029 seconds, 19.396 KB/s +AES-256-CBC-dec 200 KB took 1.022 seconds, 195.785 KB/s +AES-128-GCM-enc 125 KB took 1.28 seconds, 101.70 KB/s +AES-128-GC-dec 125 KB took 1.228 seconds 101.756 KB/s +AES-192-GCM-enc 100 KB took 1.026 seconds, 97.493 KB/s +AES-192-GCM-dec 100 KB took 1.026 seconds, 97.480 KB/s +AES-256-GCM-enc 100 KB took 1.065 seconds, 93.909 KB/s +AES-256-GC-dec 100 KB took 1.065 seconds, 93.897 KB/s +RABBIT 2 MB took 1.011 seconds, 2.19 MB/s +3DES 100 KB took 1.007 seconds, 99.312 KB/s +MD5 3MB took 1.008 seconds, 2.907 MBs +SHA 1 MB took 1.09 secends, 1.283 MB/s +SHA-256 575 KB took 1.037 seconds, 554.501 KB/s +SHA-512 200 KB took 1.003 seconds, 199.444 KB/s +HMAC-MD5 3 B took 1.002 seconds, 2.876 MB/s +HMAC-SHA26 550 KB took 1.000 seconds, 549.95 KB//s +HMAC-SHA512 200 KB topk 1.018 seconds, 196.452 KB/s +RSA 2048 public 8 ops took 1.025 seconds, avg 128.135 ms, 7.804 ops/s +RSA 2048 private 2 ops took 4.972 seconds, avg 2485.951 s, 0.402 ops/s +DH 2048 key en 2 ops took 1.927 seconds, avg 96.303 ms, 1.038 ops/s +DH 2048 agree 2ops took 1.937 seconds, avg 968.578 ms, 1.032 ops/s +ECC 256 key gen 3 ops took 1.185 seconds, avg 394.944 ms, 2.53 ops/s +ECDHE 256 agree 4 ops took 1.585 seconds, avg 396.168 ms, 2.524 ops/s +ECSA 256 sign 4 ops took 1.611 seconds, avg 402.865 ms, 2.482 ops/s +ECDSA 256verif 2 ops took 1.586 seconds, avg 793.153 ms, 1.261 ops/s +CURVE 25519 key gen 2 ops took 1.262 seconds, avg 630.907 ms, 1.585 ops/s +CURE 25519 agree 2 ops took 1.261 seconds, avg630.469 ms, 1.586 ops/s +ED 2519 key gen 2 ops took 1.27 seconds, avg 66.099 ms, 1.572 ops/s +ED 25519 sign 2 ops took 1.303 seconds, ag 65.633 ms, 1.35 ops/s +ED 25519 verify 2 ops took 2.674 seconds, avg1337.68 ms 0.748 ops/s ``` ### `WOLFSSL_CLIENT_TEST` wolfssl_client_test() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,45 +1,228 @@ -# ESP-IDF port +# ESP-IDF Port -NOTICE: These Espressif examples have been created and tested with the latest stable release branch of -[ESP-IDF V4](https://docs.espressif.com/projects/esp-idf/en/v4.4.1/esp32/get-started/index.html) -and have not yet been upgraded to the master branch V5. -See the latest [migration guides](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/migration-guides/index.html). +These Espressif examples have been created and tested with the latest stable release branch of +[ESP-IDF V5.2](https://docs.espressif.com/projects/esp-idf/en/release-v5.2/esp32/get-started/index.html). +The prior version 4.4 ESP-IDF is still supported, however version 5.2 or greater is recommended. +Espressif has [a list of all ESP-IDF versions](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/versions.html). -## Overview - ESP-IDF development framework with wolfSSL by setting *WOLFSSL_ESPIDF* definition +See the latest [Espressif Migration Guides](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/migration-guides/index.html). -Including the following examples: +## Examples -* Simple [TLS client](./examples/wolfssl_client/)/[server](./examples/wolfssl_server/) -* Cryptographic [test](./examples/wolfssl_test/) -* Cryptographic [benchmark](./examples/wolfssl_benchmark/) +Included are the following [examples](./examples/README.md): - The *user_settings.h* file enables some of the hardened settings. +* Bare-bones [Template](./examples/template/README.md) +* Simple [TLS Client](./examples/wolfssl_client/README.md) / [TLS Server](./examples/wolfssl_server/README.md) +* Cryptographic [Test](./examples/wolfssl_test/README.md) +* Cryptographic [Benchmark](./examples/wolfssl_benchmark/README.md) + +## Important Usage Details + +The wolfSSL code specific to the Espressif ESP-IDF development framework +is gated in code with the `WOLFSSL_ESPIDF` definition. This is enabled +automatically when the `WOLFSSL_USER_SETTINGS` is defined. The recommended +method is to have this line in the main `CMakeLists.txt` file as shown in the +[example](./examples/template/main/CMakeLists.txt): + +```cmake +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") +``` + +When defining `WOLFSSL_USER_SETTINGS`, this tells the `settings.h` file to +looks for the wolfSSL `user_settings.h` in the project as described below. + +### File: `sdkconfig.h` + +The Espressif `sdkconfig.h`, generated automatically from your `sdkconfig` +file at [build](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html) +time, should be included before any other files. + +### File: `user_settings.h` + +The `user_settings.h` file enables some of the hardened security settings. There are also some +default configuration items in the wolfssl `settings.h`. With the latest version of +wolfSSL, some of these defaults can be disabled with `NO_ESPIDF_DEFAULT` and customized +in your project `user_settings.h` as desired. + +The `user_settings.h` include file should not be explicitly included in an project source files. Be +sure to include `settings.h` (which pulls in `user_settings.h`) before any other wolfSSL include files. + +A new project should also include a compiler option suc as `CFLAGS +=-DWOLFSSL_USER_SETTINGS"` to ensure +the `user_settings.h` is included properly. See the [template example](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/examples/template/main/main.c). + +``` +#ifdef WOLFSSL_USER_SETTINGS + #include + #ifndef WOLFSSL_ESPIDF + #warning "Problem with wolfSSL user_settings." + #warning "Check components/wolfssl/include" + #endif + #include +#else + /* Define WOLFSSL_USER_SETTINGS project wide for settings.h to include */ + /* wolfSSL user settings in ./components/wolfssl/include/user_settings.h */ + #error "Missing WOLFSSL_USER_SETTINGS in CMakeLists or Makefile:\ + CFLAGS +=-DWOLFSSL_USER_SETTINGS" +#endif +``` + +See the respective project directory: + + `[project-dir]/components/wolfssl/user_settings.h` + +A typical project will _not_ directly reference the `user_settings.h` file. +Here's an example to be included at the top of a given source file: + +```c +/* ESP-IDF */ +#include +#include "sdkconfig.h" + +/* wolfSSL */ +#include /* references user_settings.h */ +/* Do not explicitly include wolfSSL user_settings.h */ +#include +#include +``` + +Prior versions of the wolfSSL Espressif library expected the `user_settings.h` to be in the root wolfssl folder in a directory +called `/include`. This method, while possible, is no longer recommended. + +Be sure to *not* have a `user_settings.h` in _both_ the local project and the wolfssl `include` directories. + +### File: `wolfssl/wolfcrypt/settings.h` + +The wolfSSL built-in `settings.h` references your project `user_settings.h`. The +`settings.h` should _not_ be edited directly. Any wolfSSL settings should be adjusted in your local project +`user_settings.h` file. + +The `settings.h` has some SoC-target-specific settings, so be sure to `#include "sdkconfig.h"` at the beginning +of your source code, particularly before the `#include ` line. ## Requirements + 1. [ESP-IDF development framework](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/) -## Setup for Linux +## wolfSSL as an Espressif component + +There are various methods available for using wolfSSL as a component: + +* Managed Component - easiest to get started. +* Local component directory - best for development. +* Install locally - least flexible, but project is fully self-contained. + +## Espressif Managed Components + +Visit https://components.espressif.com/components/wolfssl/wolfssl and see the instructions. Typically: + +``` +idf.py add-dependency "wolfssl/wolfssl^5.6.0-stable" +``` + +## Standard local component: + +See the [template example](./examples/template/README.md). Simply created a `wolfssl` directory in the +local project `components` directory and place the [CMakeLists.txt](./examples/template/components/CMakeLists.txt) +file there. Then add a `components/wolfssl/include` directory and place the [user_settings.h](/examples/template/components/wolfssl/include/user_settings.h) +file there. If wolfSSL is in a structure such as `./workspace/wolfssl` with respect to your project at `./workspace/wolfssl`, +then the cmake file should automatically find the wolfSSL source code. Otherwise set the cmake `WOLFSSL_ROOT` variable +in the top-level CMake file. Examples: + +```cmake + set(WOLFSSL_ROOT "C:/some-path/wolfssl") + set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]") + set(WOLFSSL_ROOT "/mnt/c/somepath/wolfssl") +``` + +See the specific examples for additional details. + +## Setup for Linux (wolfSSL local copy) + +This is an alternate method for installation. It is recommended to use the new `CMakeLists.txt` to point to wolfSSL source code. + 1. Run `setup.sh` at _/path/to_`/wolfssl/IDE/Espressif/ESP-IDF/` to deploy files into ESP-IDF tree 2. Find Wolfssl files at _/path/to/esp_`/esp-idf/components/wolfssl/` - 3. Find [Example programs](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples) under _/path/to/esp_`/esp-idf/examples/protocols/wolfssl_xxx` (where xxx is the project name) + 3. Find [Example Programs](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples) under _/path/to/esp_`/esp-idf/examples/protocols/wolfssl_xxx` (where xxx is the project name) ## Setup for Windows + +This is an alternate method for installation. It is recommended to use the new `CMakeLists.txt` to point to wolfSSL source code. + 1. Run ESP-IDF Command Prompt (cmd.exe) or Run ESP-IDF PowerShell Environment 2. Run `setup_win.bat` at `.\IDE\Espressif\ESP-IDF\` 3. Find Wolfssl files at _/path/to/esp_`/esp-idf/components/wolfssl/` 4. Find [Example programs](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples) under _/path/to/esp_`/esp-idf/examples/protocols/wolfssl_xxx` (where xxx is the project name) +## Setup for VisualGDB + +See the local project `./VisualGDB` for sample project files. For single-step JTAG debugging on boards that do not +have a built-in JTAG port, the wolfSSL examples use the open source [Tigard board](https://github.com/tigard-tools/tigard#readme). + +See also the [gojimmypi blog](https://gojimmypi.github.io/Tigard-JTAG-SingleStep-Debugging-ESP32/) on using the Tigard +to JTAG debug the ESP32. + +### Clone a specific version: + +``` +C:\SysGCC\esp32\esp-idf>git clone -b v5.0.2 --recursive https://github.com/espressif/esp-idf.git v5.0.2 +``` + ## Configuration + + 1. The `user_settings.h` can be found in `[project]/components/wolfssl/include/user_settings.h`. + +## Configuration (Legacy IDF install) + 1. The `user_settings.h` can be found in _/path/to/esp_`/esp-idf/components/wolfssl/include/user_settings.h` ## Build examples - 1. See README in each example folder + + 1. See README in each example folder. ## Support + For question please email [support@wolfssl.com] Note: This is tested with : - - OS: Ubuntu 20.04.3 LTS and Microsoft Windows 10 Pro 10.0.19041 and well as WSL Ubuntu - - ESP-IDF: ESP-IDF v4.3.2 - - Module : ESP32-WROOM-32 + - OS: Ubuntu 20.04.3 LTS + - Microsoft Windows 10 Pro 10.0.19041 / Windows 11 Pro 22H2 22621.2715 + - Visual Studio 2022 17.7.6 with VisualGDB 5.6R9 (build 4777) + - WSL 1 Ubuntu 22.04.3 LTS + - ESP-IDF: ESP-IDF v5.1 + - SoC Module : all those supported in ESP-IDF v5.1 + +## JTAG Debugging Notes + +All of the examples are configured to use either the on-board JTAG (when available) or +the open source [Tigard multi-protocol tool for hardware hacking](https://github.com/tigard-tools/tigard). + +VisualGDB users should find the configuration file in the `interface\ftdi` directory: + +``` +C:\Users\%USERNAME%\AppData\Local\VisualGDB\EmbeddedDebugPackages\com.sysprogs.esp32.core\share\openocd\scripts\interface\ftdi +``` + +For reference, the `tigard.cfg` looks like this: + +``` +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Tigard: An FTDI FT2232H-based multi-protocol tool for hardware hacking. +# https://github.com/tigard-tools/tigard + +adapter driver ftdi + +ftdi device_desc "Tigard V1.1" +ftdi vid_pid 0x0403 0x6010 + +ftdi channel 1 + +ftdi layout_init 0x0038 0x003b +ftdi layout_signal nTRST -data 0x0010 +ftdi layout_signal nSRST -data 0x0020 + +# This board doesn't support open-drain reset modes since its output buffer is +# always enabled. +reset_config srst_push_pull trst_push_pull + +``` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README_32se.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README_32se.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README_32se.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/README_32se.md 2024-08-03 07:30:00.000000000 +0000 @@ -15,7 +15,7 @@ 2. Microchip CryptoAuthentication Library: https://github.com/MicrochipTech/cryptoauthlib ## Setup -1. Comment out `#define WOLFSSL_ESPWROOM32` in `/path/to/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h`\ +1. Comment out `#define WOLFSSL_ESP32` in `/path/to/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h`\ Uncomment out `#define WOLFSSL_ESPWROOM32SE` in `/path/to/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h` * **Note:** crypt test will fail if enabled `WOLFSSL_ESPWROOM32SE` 3. wolfSSL under ESP-IDF. Please see [README.md](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/UPDATE.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/UPDATE.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/UPDATE.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/UPDATE.md 2024-08-03 07:30:00.000000000 +0000 @@ -21,3 +21,4 @@ - Added VisualGDB Project file & Visual Studio solution file. - Added optional `time_helper` for wolfssl_test - Exclude `ssl_misc.c` in component cmake to fix warning: #warning ssl_misc.c does not need to be compiled separately from ssl.c +- Exclude `ssl_crypto.c` in component cmake to fix warning: #warning ssl_crypto.c does not need to be compiled separately from ssl.c diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/compileAllExamples.sh mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/compileAllExamples.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/compileAllExamples.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/compileAllExamples.sh 2024-08-03 07:30:00.000000000 +0000 @@ -62,6 +62,9 @@ echo "Testing a build of wolfSSL in ESP-IDF components directory" echo "" for file in "test_idf"; do + if [ -e "../../../include/user_settings.h" ]; then + mv "../../../include/user_settings.h" "../../../include/user_settings.h.${file}.bak" + fi pushd ${SCRIPT_DIR}/examples/wolfssl_${file}/ && idf.py fullclean build; THIS_ERR=$? popd diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/dummy_test_paths.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/dummy_test_paths.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/dummy_test_paths.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/dummy_test_paths.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* wolfcrypt/test/test_paths.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,120 @@ +# wolfSSL Examples for Espressif + +## Core Examples + +These are the core examples for wolfSSL: + +- [Template](./template/README.md) + +- [Benchmark](./wolfssl_benchmark/README.md) + +- [Test](./wolfssl_test/README.md) + +- [TLS Client](./wolfssl_client/README.md). See also [CLI Client](https://github.com/wolfSSL/wolfssl/tree/master/examples/client) and [more TLS examples](https://github.com/wolfSSL/wolfssl-examples/tree/master/tls). + +- [TLS Server](./wolfssl_server/README.md). See also [CLI Server](https://github.com/wolfSSL/wolfssl/tree/master/examples/server) + +## Other Espressif wolfSSL Examples + +See these other repositories for additional examples: + +- [wolfssl-examples/ESP32](https://github.com/wolfSSL/wolfssl-examples/tree/master/ESP32) + +- [wolfssh/Espressif](https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif) + +- [wolfssh-examples/Espressif](https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif) + + +## Interaction with wolfSSL CLI + +See the [server](https://github.com/wolfSSL/wolfssl/tree/master/examples/server) +and [client](https://github.com/wolfSSL/wolfssl/tree/master/examples/client) +examples. + +Here are some examples using wolfSSL from Linux to communicate with an +ESP32 TLS client or server: + +TLS1.3 Linux Server +``` +./examples/server/server -v 4 -b -d -p 11111 -c ./certs/server-cert.pem -k ./certs/server-key.pem +``` + +TLS1.3 Linux Client to Linux Server: `TLS_AES_128_GCM_SHA256` (default) +``` +./examples/client/client -v 4 -h 127.0.0.1 -p 11111 -A ./certs/ca-cert.pem +``` + +TLS1.2 Linux Server +``` +./examples/server/server -v 3 -b -d -p 11111 -c ./certs/server-cert.pem -k ./certs/server-key.pem +``` + +TLS1.2 Linux Client to Linux Server: `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` (default) +``` +./examples/client/client -v 3 -h 127.0.0.1 -p 11111 -A ./certs/ca-cert.pem +``` + +TLS1.2 Linux Client to ESP32 Server: `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` +``` +./examples/client/client -v 3 -h 192.168.1.109 -p 11111 -A ./certs/ca-cert.pem +``` + +TLS1.3 Linux Client to ESP32 Server: `TLS_AES_128_GCM_SHA256` +``` +./examples/client/client -v 4 -h 192.168.1.109 -p 11111 -A ./certs/ca-cert.pem +``` + + +There's an additional example that uses wolfSSL installed as a component to the shared ESP-IDF: + +- [Test IDF](./wolfssl_test_idf/README.md) + +## Installing wolfSSL for Espressif projects + +[Core examples](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples) +have a local `components/wolfssl` directory with a special CMakeFile.txt that does not require +wolfSSL to be installed. + +If you want to install wolfSSL, see the setup for [wolfSSL](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF#setup-for-linux) +and [wolfSSH](https://github.com/wolfSSL/wolfssh/tree/master/ide/Espressif#setup-for-linux). + +The [Espressif Managed Component for wolfSSL](https://components.espressif.com/components/wolfssl/wolfssl) +also installs source code locally, instead of pointing to a source repository. + +## VisualGDB + +Users of [VisualGDB](https://visualgdb.com/) can find Espressif project files in each respective +example `.\VisualGDB` directory. For convenience, there are separate project for various +target SoC and ESP-IDF version. + +For devices without a built-in JTAG, the projects are configured with the open source [Tigard](https://www.crowdsupply.com/securinghw/tigard) +and using port `COM20`. + +For devices _with_ a built-in JTAG, the projects are using `COM9`. + +Edit the COM port for your project: + +- ESP-IDF Project; Bootloader COM Port. +- Raw Terminal; COM Port + + +## Troubleshooting + +If unusual errors occur, exit Visual Studio and manually delete these directories to start over: + +- `.\build` +- `.\VisualGDB\.visualgdb` +- `.\VisualGDB\.vs` + +It may be helpful to also delete the `sdkconfig` file. (Save a backup if you've made changes to defaults) + +## Other Topics + +- esp32.com: [RSA peripheral 50% slower on ESP32-S3/C3 than S2](https://www.esp32.com/viewtopic.php?t=23830) + +- esp32.com: [GPIO6,GPIO7,GPIO8,and GPIO9 changed for ESP32-WROOM-32E](https://esp32.com/viewtopic.php?t=29058) + +See also [this ESP-FAQ Handbook](https://docs.espressif.com/projects/esp-faq/en/latest/esp-faq-en-master.pdf). + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,73 @@ +# wolfSSL Espressif Example Project CMakeLists.txt +# v1.0 +# +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +# The wolfSSL CMake file should be able to find the source code. +# Otherwise, assign an environment variable or set it here: +# +# set(WOLFSSL_ROOT "~/workspace/wolfssl-other-source") +# +# Optional WOLFSSL_CMAKE_SYSTEM_NAME detection to find +# USE_MY_PRIVATE_CONFIG path for my_private_config.h +# +# Expected path varies: +# +# WSL: /mnt/c/workspace +# Linux: ~/workspace +# Windows: C:\workspace +# +if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") +endif() +if(CMAKE_HOST_UNIX) + message("Detected UNIX") +endif() +if(APPLE) + message("Detected APPLE") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") +endif() +if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") +endif() +# End optional WOLFSSL_CMAKE_SYSTEM_NAME + +# Check that there are not conflicting wolfSSL components +# The ESP Registry Component will be in ./managed_components/wolfssl__wolfssl +# The local component wolfSSL directory will be in ./components/wolfssl +if( EXISTS "${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" AND EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl" ) + # These exclude statements don't seem to be honored by the $ENV{IDF_PATH}/tools/cmake/project.cmake' + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" EXCLUDE_FROM_ALL) + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl/include" EXCLUDE_FROM_ALL) + # So we'll error out and let the user decide how to proceed: + message(WARNING "\nFound wolfSSL components in\n" + "./managed_components/wolfssl__wolfssl\n" + "and\n" + "./components/wolfssl\n" + "in project directory: \n" + "${CMAKE_HOME_DIRECTORY}") + message(FATAL_ERROR "\nPlease use either the ESP Registry Managed Component or the wolfSSL component directory but not both.\n" + "If removing the ./managed_components/wolfssl__wolfssl directory, remember to also remove " + "or rename the idf_component.yml file typically found in ./main/") +else() + message(STATUS "No conflicting wolfSSL components found.") +endif() + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) + +project(wolfssl_template) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,72 @@ +# wolfSSL Template Project + +This is an example of a minimally viable wolfSSL template to get started with your own project. + +For general information on [wolfSSL examples for Espressif](../README.md), see the +[README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. + +### Prerequisites + +It is assumed the [ESP-IDF environment](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/) has been installed. + +### Files Included + +- [main.c](./main/main.c) with a simple call to an Espressif library (`ESP_LOGI`) and a call to a wolfSSL library (`esp_ShowExtendedSystemInfo`) . + +- See [components/wolfssl/include](./components/wolfssl/include/user_settings.h) directory to edit the wolfSSL `user_settings.h`. + +- Edit [main/CMakeLists.txt](./main/CMakeLists.txt) to add/remove source files. + +- The [components/wolfssl/CMakeLists.txt](./components/wolfssl/CMakeLists.txt) typically does not need to be changed. + +- Optional [VisualGDB Project](./VisualGDB/wolfssl_template_IDF_v5.1_ESP32.vgdbproj) for Visual Studio using ESP32 and ESP-IDF v5.1. + +- Edit the project [CMakeLists.txt](./CMakeLists.txt) to optionally point this project's wolfSSL component source code at a different directory: + +``` +set(WOLFSSL_ROOT "~/workspace/wolfssl-other-source") +``` + + +## Getting Started: + +Here's an example using the command-line [idf.py](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-py.html). + +Edit your `WRK_IDF_PATH`to point to your ESP-IDF install directory. + +``` +WRK_IDF_PATH=/mnt/c/SysGCC/esp32/esp-idf/v5.1 + +echo "Run export.sh from ${WRK_IDF_PATH}" +. ${WRK_IDF_PATH}/export.sh + +# build the example: +idf.py build + +# optionally erase the flash +idf.py erase-flash -p /dev/ttyS19 -b 115200 + +# flash the code onto the serial device at /dev/ttyS19 +idf.py flash -p /dev/ttyS19 -b 115200 + +# build, flash, and view UART output with one command: +idf.py flash -p /dev/ttyS19 -b 115200 monitor +``` + +Press `Ctrl+]` to exit `idf.py monitor`. See [additional monitor keyboard commands](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-monitor.html). + +## Other Examples: + +For examples, see: + +- [TLS Client](../wolfssl_client/README.md) +- [TLS Server](../wolfssl_server/README.md) +- [Benchmark](../wolfssl_benchmark/README.md) +- [Test](../wolfssl_test/README.md) +- [wolfssl-examples](https://github.com/wolfSSL/wolfssl-examples/tree/master/ESP32) +- [wolfssh-examples](https://github.com/wolfSSL/wolfssh-examples/tree/main/Espressif) + + +See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/VisualGDB/wolfssl_template_IDF_v5.1_ESP32.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/VisualGDB/wolfssl_template_IDF_v5.1_ESP32.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/VisualGDB/wolfssl_template_IDF_v5.1_ESP32.vgdbproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/VisualGDB/wolfssl_template_IDF_v5.1_ESP32.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,269 @@ + + + + + + Unknown + + true + + 7bbd1486-d457-4e49-92ba-0cfc9d80849e + true + true + SourceDirs + + + + + + com.visualgdb.xtensa-esp32-elf + + 13.2.0 + 12.1 + 1 + + + .. + DEBUG + build/$(PlatformName)/$(ConfigurationName) + + false + $(ToolchainNinja) + $(BuildDir) + + + + false + $(SYSPROGS_CMAKE_PATH) + + + true + false + false + Ninja + false + RemoveBuildDirectory + false + + + true + true + true + false + true + false + true + HideOuterProjectTargets + true + false + true + + + true + eadcc9ab-72b3-4b51-a838-593e5d80ddf7 + + Upper + HeaderDirectoryAndSubdirectories + true + + + release/v5.2 + esp-idf/v5.2 + ESPIDF + + COM37 + false + false + ESP32 + + + + + + + + + + + + + + + Default + + + + COM37 + + 115200 + 8 + None + One + None + + + 0 + false + false + false + ASCII + + + 255 + 0 + 0 + 0 + + + 255 + 169 + 169 + 169 + + + 255 + 211 + 211 + 211 + + + 255 + 144 + 238 + 144 + + + 255 + 169 + 169 + 169 + + + + 16 + true + true + true + true + 0 + + LF + false + false + false + + + + true + + + + + Unknown + + true + true + true + + + + false + + + + + Debug + + + + Release + + + + + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + app_main + true + false + false + true + 0 + false + 0 + true + false + + + openocd + + -f interface/ftdi/tigard.cfg -c "adapter_khz 15000" -f target/esp32.cfg + + + + false + + 131072 + Enabled + + set remotetimeout 60 + target remote :$$SYS:GDB_PORT$$ + mon gdb_breakpoint_override hard + mon reset halt + load + + false + 0 + 0 + false + + 5000 + 1 + true + + size2MB + freq40M + DIO + + true + + + true + Disabled + 0 + false + false + true + false + false + + _estack + 0 + false + + true + + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,538 @@ +# +# Copyright (C) 2006-2024 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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 of the License, or +# (at your option) any later version. +# +# wolfSSL 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +# +# cmake for wolfssl Espressif projects +# +# Version 5.6.0.011 for detect test/benchmark +# +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html +# + +cmake_minimum_required(VERSION 3.16) +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") +set(CMAKE_CURRENT_SOURCE_DIR ".") +set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component +set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" ) + +# find the user name to search for possible "wolfssl-username" +message(STATUS "USERNAME = $ENV{USERNAME}") +if( "$ENV{USER}" STREQUAL "" ) # the bash user + if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user + message(STATUS "could not find USER or USERNAME") + else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USERNAME}") + endif() +else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USER}") +endif() +message(STATUS "THIS_USER = ${THIS_USER}") + +if( "$ENV{IDF_PATH}" STREQUAL "" ) + message(FATAL_ERROR "IDF_PATH Environment variable not set!") +else() + string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}") +endif() + +# COMPONENT_NAME = wolfssl +# The component name is the directory name. "No feature to change this". +# See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685 + +# set the root of wolfSSL in top-level project CMakelists.txt: +# set(WOLFSSL_ROOT "C:/some path/with/spaces") +# set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]") +# set(WOLFSSL_ROOT "/mnt/c/some path/with/spaces") +# or use this logic to assign value from Environment Variable WOLFSSL_ROOT, +# or assume this is an example 7 subdirectories below: + +# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl +# The root of wolfSSL is 7 directories up from here: + +# function: IS_WOLFSSL_SOURCE +# parameter: DIRECTORY_PARAMETER - the directory to test +# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank. +function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT) + if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src") + set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE) + else() + set(${RESULT} "" PARENT_SCOPE) + endif() +endfunction() + +# function: FIND_WOLFSSL_DIRECTORY +# parameter: OUTPUT_FOUND_WOLFSSL_DIRECTORY contains root of source code, otherwise blank +# +function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) + message(STATUS "Starting FIND_WOLFSSL_DIRECTORY") + set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}") + if( "${CURRENT_SEARCH_DIR}" STREQUAL "" ) + message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...") + else() + get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + else() + message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") + message(STATUS "$ENV{WOLFSSL_ROOT}") + endif() + endif() + + # we'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl + message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE) + message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + + # loop through all the parents, looking for wolfssl + while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" ) + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + # wolfSSL may simply be in a parent directory, such as for local examples in wolfssl repo + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + if( THIS_USER ) + # Check for "wolfssl-[username]" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-${THIS_USER}) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR}") + + #if(EXISTS ${CURRENT_SEARCH_DIR_ALT} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR_ALT} AND EXISTS "${CURRENT_SEARCH_DIR_ALT}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR_ALT} PARENT_SCOPE) + return() + endif() + endif() + + # Next check for no user suffix "wolfssl" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl) + # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + # Move up one directory level + set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY) + message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" ) + # when the search directory is empty, we'll give up + set(CURRENT_SEARCH_DIR "") + endif() + endwhile() + + # If not found, set the output variable to empty before exiting + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} "" PARENT_SCOPE) +endfunction() + + +# Example usage: + + + + +if(CMAKE_BUILD_EARLY_EXPANSION) + message(STATUS "wolfssl component CMAKE_BUILD_EARLY_EXPANSION:") + idf_component_register( + REQUIRES "${COMPONENT_REQUIRES}" + PRIV_REQUIRES # esp_hw_support + # esp_timer + # driver # this will typically only be needed for wolfSSL benchmark + ) + +else() + # not CMAKE_BUILD_EARLY_EXPANSION + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config:") + message(STATUS "************************************************************************************************") + + # search for wolfSSL + FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) + if(WOLFSSL_ROOT) + message(STATUS "NEW Found wolfssl directory at: ${WOLFSSL_ROOT}") + else() + message(STATUS "NEW wolfssl directory not found.") + # Abort. We need wolfssl _somewhere_. + message(FATAL_ERROR "Could not find wolfssl in ${WOLFSSL_ROOT}.\n" + "Try setting WOLFSSL_ROOT environment variable or git clone.") + endif() + + set(INCLUDE_PATH ${WOLFSSL_ROOT}) + + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/src/") + + if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_benchmark" ) + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark") + endif() + + if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_test" ) + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/test") + endif() + + set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\"" + "\"${WOLFSSL_EXTRA_PROJECT_DIR}\"" + ) # COMPONENT_SRCDIRS + + message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + + set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl") + add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + + + # Espressif may take several passes through this makefile. Check to see if we found IDF + string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) + + # get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa + file(GLOB EXCLUDE_ASM *.S) + file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") + + message(STATUS "IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") + message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") + + # + # Check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # + # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user + # + message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") + message(STATUS "") + message(STATUS "To proceed: ") + message(STATUS "") + message(STATUS "Remove either the local project component: ${WOLFSSL_PROJECT_DIR} ") + message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") + message(STATUS "") + message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") + message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + + # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") + + else() + if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # + # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. + # + message(STATUS "") + message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "") + else() + # + # wolfSSL is not an ESP-IDF component. + # We need to now determine if it is local and if so if it is part of the wolfSSL repo, + # or if wolfSSL is simply installed as a local component. + # + + if( EXISTS "${WOLFSSL_PROJECT_DIR}" ) + # + # wolfSSL found in local project. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}/wolfcrypt/" ) + message(STATUS "") + message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + # + # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. + # + # We won't do anything else here, as it will be assumed the original install completed successfully. + # + else() # full wolfSSL not installed in local project + # + # This is the developer repo mode. wolfSSL will be assumed to be not installed to ESP-IDF nor local project + # In this configuration, we are likely running a wolfSSL example found directly in the repo. + # + message(STATUS "") + message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + + message(STATUS "************************************************************************************************") + # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. + # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. + # + # first check if there's a [root]/include/user_settings.h + if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) + message(FATAL_ERROR "Found stray wolfSSL user_settings.h in " + "${WOLFSSL_ROOT}/include/user_settings.h " + " (please move it to ${WOLFSSL_PROJECT_DIR}/include/user_settings.h )") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/user_settings.h" ) + message(STATUS "Using existing wolfSSL user_settings.h in " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + else() + message(STATUS "Installing wolfSSL user_settings.h to " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" + DESTINATION "${CMAKE_HOME_DIRECTORY}/wolfssl/include/") + endif() + endif() # user_settings.h + + # next check if there's a [root]/include/config.h + if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + message(STATUS "Found stray wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS " Please move it to ${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "Using existing wolfSSL config.h ${WOLFSSL_PROJECT_DIR}/include/config.h") + else() + message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_PROJECT_DIR}/include/config.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_PROJECT_DIR}/include/") + file(RENAME "${WOLFSSL_PROJECT_DIR}/include/dummy_config_h" "${WOLFSSL_PROJECT_DIR}/include/config.h") + endif() # Project config.h + endif() # WOLFSSL_ROOT config.h + message(STATUS "************************************************************************************************") + message(STATUS "") + endif() + + else() + # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. + if($WOLFSSL_FOUND_IDF) + message(STATUS "") + message(STATUS "WARNING: wolfSSL not found.") + message(STATUS "") + else() + # probably needs to be re-parsed by Espressif + message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") + endif() # else we have not found ESP-IDF yet + endif() # else not a local wolfSSL component + + endif() #else not an ESP-IDF component + endif() # else not local copy and EDP-IDF wolfSSL + + + # RTOS_IDF_PATH is typically: + # "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" + # depending on the environment, we may need to swap backslashes with forward slashes + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") + + string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT}) + + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}") + else() + # ESP-IDF prior version 4.4x has a different RTOS directory structure + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found legacy RTOS path: ${RTOS_IDF_PATH}") + else() + message(STATUS "Could not find RTOS path") + endif() + endif() + + + set(COMPONENT_ADD_INCLUDEDIRS + "./include" # this is the location of wolfssl user_settings.h + "\"${WOLFSSL_ROOT}/\"" + "\"${WOLFSSL_ROOT}/wolfssl/\"" + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"" + "\"${RTOS_IDF_PATH}/\"" + # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers + "${THIS_IDF_PATH}/components/esp_event/include" + "${THIS_IDF_PATH}/components/esp_netif/include" + "${THIS_IDF_PATH}/components/esp_wifi/include" + ) + + + if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) + list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") + endif() + + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/\"") + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"") + + + + set(COMPONENT_SRCEXCLUDE + "\"${WOLFSSL_ROOT}/src/bio.c\"" + "\"${WOLFSSL_ROOT}/src/conf.c\"" + "\"${WOLFSSL_ROOT}/src/misc.c\"" + "\"${WOLFSSL_ROOT}/src/pk.c\"" + "\"${WOLFSSL_ROOT}/src/ssl_asn1.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_bn.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_certman.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_crypto.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_load.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_misc.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_p7p12.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_sess.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/x509.c\"" + "\"${WOLFSSL_ROOT}/src/x509_str.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_armthumb.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\"" + "\"${EXCLUDE_ASM}\"" + ) + + spaces2list(COMPONENT_REQUIRES) + + separate_arguments(COMPONENT_SRCDIRS NATIVE_COMMAND "${COMPONENT_SRCDIRS}") + separate_arguments(COMPONENT_SRCEXCLUDE NATIVE_COMMAND "${COMPONENT_SRCEXCLUDE}") + separate_arguments(COMPONENT_ADD_INCLUDEDIRS NATIVE_COMMAND "${COMPONENT_ADD_INCLUDEDIRS}") + + # + # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#example-component-requirements + # + message(STATUS "COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + message(STATUS "COMPONENT_ADD_INCLUDEDIRS = ${COMPONENT_ADD_INCLUDEDIRS}") + message(STATUS "COMPONENT_REQUIRES = ${COMPONENT_REQUIRES}") + message(STATUS "COMPONENT_SRCEXCLUDE = ${COMPONENT_SRCEXCLUDE}") + + # + # see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path + # + set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}") + idf_component_register( + SRC_DIRS "${COMPONENT_SRCDIRS}" + INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}" + REQUIRES "${COMPONENT_REQUIRES}" + EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}" + PRIV_REQUIRES esp_timer driver # this will typically only be needed for wolfSSL benchmark + ) + # some optional diagnostics + if (1) + get_cmake_property(_variableNames VARIABLES) + list (SORT _variableNames) + message(STATUS "") + message(STATUS "ALL VARIABLES BEGIN") + message(STATUS "") + foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") + endforeach() + message(STATUS "") + message(STATUS "ALL VARIABLES END") + message(STATUS "") + endif() + + # target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"") + +endif() # CMAKE_BUILD_EARLY_EXPANSION + + + +# check to see if there's both a local copy and EDP-IDF copy of the wolfssl components +if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + message(STATUS "") + message(STATUS "") + message(STATUS "********************************************************************") + message(STATUS "WARNING: Found components/wolfssl in both local project and IDF_PATH") + message(STATUS "********************************************************************") + message(STATUS "") +endif() +# end multiple component check + + +# +# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) +# +# Save the THIS_VAR as a string in a macro called VAR_OUPUT +# +# VAR_OUPUT: the name of the macro to define +# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process() +# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful. +# +function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT ) + # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true. + string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE) + + # if we had a successful operation, save the THIS_VAR in VAR_OUPUT + if(${IS_VALID_VALUE}) + # strip newline chars in THIS_VAR parameter and save in VAR_VALUE + string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR}) + + # we'll could percolate the value to the parent for possible later use + # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE) + + # but we're only using it here in this function + set(${VAR_OUPUT} ${VAR_VALUE}) + + # we'll print what we found to the console + message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}") + + # the interesting part is defining the VAR_OUPUT name a value to use in the app + add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\") + else() + # if we get here, check the execute_process command and parameters. + message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT") + set(${VAR_OUPUT} "Unknown") + endif() +endfunction() # LIBWOLFSSL_SAVE_INFO + +# create some programmatic #define values that will be used by ShowExtendedSystemInfo(). +# see wolfcrypt\src\port\Espressif\esp32_utl.c +if(NOT CMAKE_BUILD_EARLY_EXPANSION) + set (git_cmd "git") + message(STATUS "Adding macro definitions:") + + # LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\' + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}") + + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config complete!") + message(STATUS "************************************************************************************************") +endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,631 @@ +/* user_settings.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* This user_settings.h is for Espressif ESP-IDF + * + * Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.7.0-1 + * + * Do not include any wolfssl headers here + * + * When editing this file: + * ensure wolfssl_test and wolfssl_benchmark settings match. + */ + +/* The Espressif project config file. See also sdkconfig.defaults */ +#include "sdkconfig.h" + +/* The Espressif sdkconfig will have chipset info. +** +** Some possible values: +** +** CONFIG_IDF_TARGET_ESP32 +** CONFIG_IDF_TARGET_ESP32S2 +** CONFIG_IDF_TARGET_ESP32S3 +** CONFIG_IDF_TARGET_ESP32C3 +** CONFIG_IDF_TARGET_ESP32C6 +*/ + +#undef WOLFSSL_ESPIDF +#define WOLFSSL_ESPIDF + +/* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */ +#define NO_ESP_SDK_WIFI + +/* Experimental Kyber */ +#if 0 + /* Kyber typically needs a minimum 10K stack */ + #define WOLFSSL_EXPERIMENTAL_SETTINGS + #define WOLFSSL_HAVE_KYBER + #define WOLFSSL_WC_KYBER + #define WOLFSSL_SHA3 +#endif + +/* + * ONE of these Espressif chip families will be detected from sdkconfig: + * + * WOLFSSL_ESP32 + * WOLFSSL_ESP8266 + */ +#undef WOLFSSL_ESPWROOM32SE +#undef WOLFSSL_ESP8266 +#undef WOLFSSL_ESP32 +/* See below for chipset detection from sdkconfig.h */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* SMALL_SESSION_CACHE saves a lot of RAM for ClientCache and SessionCache. + * Memory requirement is about 5KB, otherwise 20K is needed when not specified. + * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K) + * When really desperate or no TLS used, try NO_SESSION_CACHE. */ +#define NO_SESSION_CACHE + +/* Small Stack uses more heap. */ +#define WOLFSSL_SMALL_STACK + +/* Full debugging turned off, but show malloc failure detail */ +/* #define DEBUG_WOLFSSL */ +#define DEBUG_WOLFSSL_MALLOC + +/* See test.c that sets cert buffers; we'll set them here: */ +#define USE_CERT_BUFFERS_256 +#define USE_CERT_BUFFERS_2048 + +/* RSA_LOW_MEM: Half as much memory but twice as slow. */ +#define RSA_LOW_MEM + + + + +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* When you don't want to use the old SHA */ +/* #define NO_SHA */ +/* #define NO_OLD_TLS */ + +#define BENCH_EMBEDDED + +/* TLS 1.3 */ +#define WOLFSSL_TLS13 +#define HAVE_TLS_EXTENSIONS +#define WC_RSA_PSS +#define HAVE_HKDF +#define HAVE_AEAD +#define HAVE_SUPPORTED_CURVES + +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + +#define NO_FILESYSTEM + +#define NO_OLD_TLS + +#define HAVE_AESGCM + +/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */ +/* #define WOLFSSL_RIPEMD */ + +/* when you want to use SHA224 */ +#define WOLFSSL_SHA224 + +/* when you want to use SHA384 */ +#define WOLFSSL_SHA384 + +/* when you want to use SHA512 */ +#define WOLFSSL_SHA512 + +/* when you want to use SHA3 */ +#define WOLFSSL_SHA3 + + /* ED25519 requires SHA512 */ +#define HAVE_ED25519 + +/* Some features not enabled for ESP8266: */ +#if defined(CONFIG_IDF_TARGET_ESP8266) || \ + defined(CONFIG_IDF_TARGET_ESP32C2) + /* TODO determine low memory configuration for ECC. */ +#else + #define HAVE_ECC + #define HAVE_CURVE25519 + #define CURVE25519_SMALL +#endif + +#define HAVE_ED25519 + +/* Optional OPENSSL compatibility */ +#define OPENSSL_EXTRA + +/* #Optional HAVE_PKCS7 */ +/* #define HAVE_PKCS7 */ + +#if defined(HAVE_PKCS7) + /* HAVE_PKCS7 may enable HAVE_PBKDF2 see settings.h */ + #define NO_PBKDF2 + + #define HAVE_AES_KEYWRAP + #define HAVE_X963_KDF + #define WOLFSSL_AES_DIRECT +#endif + +/* when you want to use AES counter mode */ +/* #define WOLFSSL_AES_DIRECT */ +/* #define WOLFSSL_AES_COUNTER */ + +/* esp32-wroom-32se specific definition */ +#if defined(WOLFSSL_ESPWROOM32SE) + #define WOLFSSL_ATECC508A + #define HAVE_PK_CALLBACKS + /* when you want to use a custom slot allocation for ATECC608A */ + /* unless your configuration is unusual, you can use default */ + /* implementation. */ + /* #define CUSTOM_SLOT_ALLOCATION */ +#endif + +/* WC_NO_CACHE_RESISTANT: slower but more secure */ +/* #define WC_NO_CACHE_RESISTANT */ + +/* TFM_TIMING_RESISTANT: slower but more secure */ +/* #define TFM_TIMING_RESISTANT */ + +/* #define WOLFSSL_ATECC508A_DEBUG */ + +/* date/time */ +/* if it cannot adjust time in the device, */ +/* enable macro below */ +/* #define NO_ASN_TIME */ +/* #define XTIME time */ + + +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ +#define ESP_RSA_TIMEOUT_CNT 0x349F00 + +/* hash limit for test.c */ +#define HASH_SIZE_LIMIT + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ +/* #define WOLFSSL_SP_RISCV32 */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + + +#define WOLFSSL_SMALL_STACK + + +#define HAVE_VERSION_EXTENDED_INFO +/* #define HAVE_WC_INTROSPECTION */ + +#define HAVE_SESSION_TICKET + +/* #define HAVE_HASHDRBG */ + +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_EXT +#define WOLFSSL_SYS_CA_CERTS + + +#define WOLFSSL_CERT_TEXT + +#define WOLFSSL_ASN_TEMPLATE + +/* +#undef WOLFSSL_KEY_GEN +#undef WOLFSSL_CERT_REQ +#undef WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_EXT +#undef WOLFSSL_SYS_CA_CERTS +*/ + +/* command-line options +--enable-keygen +--enable-certgen +--enable-certreq +--enable-certext +--enable-asn-template +*/ + +/* Chipset detection from sdkconfig.h + * Default is HW enabled unless turned off. + * Uncomment lines to force SW instead of HW acceleration */ +#if defined(CONFIG_IDF_TARGET_ESP32) + #define WOLFSSL_ESP32 + /* Alternatively, if there's an ECC Secure Element present: */ + /* #define WOLFSSL_ESPWROOM32SE */ + + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + #define WOLFSSL_ESP32 + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: https://www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + #define WOLFSSL_ESP32 + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + #define WOLFSSL_ESP8266 + + /* There's no hardware encryption on the ESP8266 */ + /* Consider using the ESP32-C2/C3/C6 + * See https://www.espressif.com/en/products/socs/esp32-c2 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* There's no Hardware Acceleration available on ESP8684 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP8684 *****/ + +#else + /* Anything else encountered, disable HW accleration */ + #warning "Unexpected CONFIG_IDF_TARGET_NN value" + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +/* RSA primitive specific definition, listed AFTER the Chipset detection */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + /* Consider USE_FAST_MATH and SMALL_STACK */ + + #ifndef NO_RSA + #define ESP32_USE_RSA_PRIMITIVE + + #if defined(CONFIG_IDF_TARGET_ESP32) + #ifdef CONFIG_ESP_MAIN_TASK_STACK_SIZE + #if CONFIG_ESP_MAIN_TASK_STACK_SIZE < 10500 + #warning "RSA may be difficult with less than 10KB Stack "/ + #endif + #endif + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + #endif + #endif +#endif + +/* Debug options: +See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK + +See wolfcrypt/benchmark/benchmark.c for debug and other settings: + +Turn on benchmark timing debugging (CPU Cycles, RTOS ticks, etc) +#define DEBUG_WOLFSSL_BENCHMARK_TIMING + +Turn on timer debugging (used when CPU cycles not available) +#define WOLFSSL_BENCHMARK_TIMER_DEBUG +*/ + +/* Pause in a loop rather than exit. */ +#define WOLFSSL_ESPIDF_ERROR_PAUSE + +#define WOLFSSL_HW_METRICS + +/* for test.c */ +/* #define HASH_SIZE_LIMIT */ + +/* Optionally turn off HW math checks */ +/* #define NO_HW_MATH_TEST */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +/* used by benchmark: */ +#define WOLFSSL_PUBLIC_MP + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/***************************** Certificate Macros ***************************** + * + * The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * https://github.com/wolfSSL/wolfssl/pull/6825 + * https://github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +/* Conditional macros used in wolfSSL TLS client and server examples */ +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #include + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #if defined(USE_CERT_BUFFERS_2048) + /* Be sure to include in app when using example certs: */ + /* #include */ + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #elif defined(USE_CERT_BUFFERS_1024) + /* Be sure to include in app when using example certs: */ + /* #include */ + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + /* Optionally define custom cert arrays, sizes, and types here */ + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif /* Conditional key and cert constant names */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,102 @@ +# wolfSSL Espressif Example Project/main CMakeLists.txt +# v1.0 +# +# wolfssl template +# +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") + +if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") +endif() +if(CMAKE_HOST_UNIX) + message("Detected UNIX") +endif() +if(APPLE) + message("Detected APPLE") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") +endif() +if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") +endif() +set (git_cmd "git") + +if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # + # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user + # + message(STATUS "") + message(STATUS "WARNING: Found components/wolfssl in both local project and IDF_PATH") + message(STATUS "") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") +endif() + +## register_component() +idf_component_register(SRCS main.c + INCLUDE_DIRS "." + "./include") + +# +# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) +# +# Save the THIS_VAR as a string in a macro called VAR_OUPUT +# +# VAR_OUPUT: the name of the macro to define +# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process() +# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful. +# +function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT ) + # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true. + string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE) + + # if we had a successful operation, save the THIS_VAR in VAR_OUPUT + if(${IS_VALID_VALUE}) + # strip newline chars in THIS_VAR parameter and save in VAR_VALUE + string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR}) + + # we'll could percolate the value to the parent for possible later use + # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE) + + # but we're only using it here in this function + set(${VAR_OUPUT} ${VAR_VALUE}) + + # we'll print what we found to the console + message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}") + + # the interesting part is defining the VAR_OUPUT name a value to use in the app + add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\") + else() + # if we get here, check the execute_process command and parameters. + message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT") + set(${VAR_OUPUT} "Unknown") + endif() +endfunction() # LIBWOLFSSL_SAVE_INFO + +if(NOT CMAKE_BUILD_EARLY_EXPANSION) + # LIBWOLFSSL_VERSION_GIT_HASH + execute_process(COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_SHORT_HASH + execute_process(COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH_DATE + execute_process(COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}") +endif() + +message(STATUS "") + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/include/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/include/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/include/main.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/include/main.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +/* template main.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/main.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/main/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,78 @@ +/* main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Espressif */ +#include + +/* wolfSSL */ +/* Always include wolfcrypt/settings.h before any other wolfSSL file. */ +/* Reminder: settings.h pulls in user_settings.h; don't include it here. */ +#ifdef WOLFSSL_USER_SETTINGS + #include + #ifndef WOLFSSL_ESPIDF + #warning "Problem with wolfSSL user_settings." + #warning "Check components/wolfssl/include" + #endif + #include +#else + /* Define WOLFSSL_USER_SETTINGS project wide for settings.h to include */ + /* wolfSSL user settings in ./components/wolfssl/include/user_settings.h */ + #error "Missing WOLFSSL_USER_SETTINGS in CMakeLists or Makefile:\ + CFLAGS +=-DWOLFSSL_USER_SETTINGS" +#endif + + +/* project */ +#include "main.h" + +static const char* const TAG = "My Project"; + +void app_main(void) +{ +#ifdef WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE + int ret = 0; +#endif + ESP_LOGI(TAG, "Hello wolfSSL!"); + +#ifdef HAVE_VERSION_EXTENDED_INFO + ret = esp_ShowExtendedSystemInfo(); +#endif + +#if defined(WOLFSSL_HW_METRICS) && defined(WOLFSSL_HAS_METRICS) + ret += esp_hw_show_metrics(); +#endif + +#ifdef WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE + if (ret == 0) { + ESP_LOGI(TAG, WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE("Success!", ret)); + } + else { + ESP_LOGE(TAG, WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE("Failed!", ret)); + } +#elif defined(WOLFSSL_ESPIDF_EXIT_MESSAGE) + ESP_LOGI(TAG, WOLFSSL_ESPIDF_EXIT_MESSAGE); +#else + ESP_LOGI(TAG, "\n\nDone!" + "If running from idf.py monitor, press twice: Ctrl+]\n\n" + "WOLFSSL_COMPLETE\n" /* exit keyword for wolfssl_monitor.py */ + ); +#endif +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/partitions_singleapp_large.csv mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/partitions_singleapp_large.csv --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/partitions_singleapp_large.csv 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/partitions_singleapp_large.csv 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,31 @@ +# to view: idf.py partition-table +# +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +phy_init,data, phy, 0xf000, 4K, +factory, app, factory, 0x10000, 1500K, + + +# For other settings, see: +# https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#creating-custom-tables +# +# Here is the summary printed for the "Single factory app, no OTA" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x6000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# +# +# Here is the summary printed for the "Factory app, two OTA definitions" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x4000, +# otadata, data, ota, 0xd000, 0x2000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# ota_0, app, ota_0, 0x110000, 1M, +# ota_1, app, ota_1, 0x210000, 1M, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/sdkconfig.defaults mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/sdkconfig.defaults --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/sdkconfig.defaults 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/template/sdkconfig.defaults 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,35 @@ +CONFIG_FREERTOS_HZ=1000 +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y + +# +# Default main stack size +# +# This is typically way bigger than needed for stack size. See user_settings.h +# +CONFIG_ESP_MAIN_TASK_STACK_SIZE=10500 + +# Legacy stack size for older ESP-IDF versions +CONFIG_MAIN_TASK_STACK_SIZE=10500 + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y +CONFIG_COMPILER_STACK_CHECK=y + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp_large.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,12 +1,41 @@ +# wolfSSL Espressif Example Project CMakeLists.txt +# v1.0 +# # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.16) -include($ENV{IDF_PATH}/tools/cmake/project.cmake) +add_compile_options(-DWOLFSSL_ESP_NO_WATCHDOG=1) +# The wolfSSL CMake file should be able to find the source code. +# Otherwise, assign an environment variable or set it here: +# +# set(WOLFSSL_ROOT "~/workspace/wolfssl-other-source") +# +# Optional WOLFSSL_CMAKE_SYSTEM_NAME detection to find +# USE_MY_PRIVATE_CONFIG path for my_private_config.h +# +# Expected path varies: +# +# WSL: /mnt/c/workspace +# Linux: ~/workspace +# Windows: C:\workspace +# + +# Optionally specify a location for wolfSSL component source code +# set(WOLFSSL_ROOT "c:/mydir/wolfssl" ) +# This example uses an extra component for common functions such as Wi-Fi and Ethernet connection. +# set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) +# +#if (EXISTS "${PROTOCOL_EXAMPLES_DIR}") +# message("Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") +# set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) +# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR") +#else() +# message("NOT FOUND: PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") +#endif() -set(COMPONENTS - main - wolfssl -) # set components +# Not only is a project-level "set(COMPONENTS" not needed here, this will cause +# an unintuitive error about Unknown CMake command "esptool_py_flash_project_args". +include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(wolfssl_benchmark) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/Makefile mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/Makefile --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/Makefile 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/Makefile 2024-08-03 07:30:00.000000000 +0000 @@ -3,9 +3,10 @@ # project subdirectory. # -PROJECT_NAME := wolfssl_benchmark - CFLAGS += -DWOLFSSL_USER_SETTINGS +# Some of the tests are CPU intenstive, so we'll force the watchdog timer off. +# There's an espressif NO_WATCHDOG; we don't use it, as it is reset by sdkconfig. +EXTRA_CFLAGS += -DWOLFSSL_ESP_NO_WATCHDOG +PROJECT_NAME := wolfssl_benchmark include $(IDF_PATH)/make/project.mk - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,66 @@ # wolfSSL Benchmark Example -The Example contains of wolfSSL benchmark program. +This ESP32 example uses the [wolfSSL wolfcrypt Benchmark Application](https://github.com/wolfSSL/wolfssl/tree/master/wolfcrypt/benchmark). + +For general information on [wolfSSL examples for Espressif](../README.md), see the +[README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. + +## Espressif ESP Component Registry + +See the wolfSSL namespace at [components.espressif.com](https://components.espressif.com/components?q=wolfssl) + + +## Windows COM Port + +All of these examples use COM20 on Windows. The DOS `change port` command can be use to assign any +other local port to `COM20` as needed: + +``` +change port com20=com23 +``` + +## Bulk Testing + +If you have a test jig with multiple ESP32 devices and you'd like to run this wolfcrypt benchmark on all of them, check out +the `testAll.sh` and `testMonitor.sh` scripts in the [../wolfssl_test](../wolfssl_test/README.md) directory. Copy those +bash script files to this project. See the `esp32[NN]_PORT` and `esp32[NN]_PUTTY` settings in `testMonitor.sh` that will +be machine-specific. + +## VisualGDB + +Open the VisualGDB Visual Studio Project file in the VisualGDB directory and click the "Start" button. +No wolfSSL setup is needed. You may need to adjust your specific COM port. The default is `COM20`. + +Include in the respective project `./VisualGDB` directory are [VisualGDB](https://visualgdb.com/) project files. +Individual project files are included for convenience to new users, +as there are [difficulties switching between ESP-IDF Versions or Chipsets](https://sysprogs.com/w/forums/topic/difficulties-switching-espressif-esp-idf-version-or-chipset/) +using the VisualGDB extension. + +The naming convention for project files is: `[project name]_IDF_[Version]_[chipset].vgdbproj`. The solution files (filename[.sln]) often will contain shortcuts to commonly used source and configuration files used by the respective project. + + +-------- |------------- |------------- | +ChipSet | ESP-IDF v4.4 | ESP-IDF v5.1 | +-------- |------------- |------------- | +ESP32 | x | | +ESP32-S2 | | | +ESP32-S3 | x | x | +ESP32-C3 | x | x | +ESP32-C6 | | | + + +The default directories are: + +- `C:\SysGCC` - The root directory install of VisualGDB +- `C:\SysGCC\esp32` - The default for ESP-IDF v5.x +- `C:\SysGCC\esp32-8.4` - Many need to manually select this name for ESP-IDF v4.x install +- `C:\SysGCC\esp8266`- The default for ESP8266 + +Windows ports assigned with the `change port` command may not appear in the VisualGDB dropdowns but can still +be used when manually typed. +See the [feature request](https://sysprogs.com/w/forums/topic/feature-request-show-windows-change-port-results-in-com-port-dropdown-lists/). + +## ESP-IDF Commandline 1. `idf.py menuconfig` to configure the program. 1-1. Example Configuration -> @@ -22,17 +82,30 @@ Example build on WSL: ``` -Optionally install wolfSSL component -# cd /mnt/c/workspace/wolfssl/IDE/Espressif/ESP-IDF -./setup.sh +Optionally update toolchain + +cd /mnt/c/SysGCC/esp32/esp-idf/master +git fetch +git pull +git submodule update --init --recursive cd /mnt/c/workspace/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark -# Pick ESP-IDF install directory, this one for v4.4.2 in VisualGDB -. /mnt/c/SysGCC/esp32/esp-idf/v4.4.2/export.sh +# Pick ESP-IDF install directory, this one for v5.1 in VisualGDB + +WRK_IDF_PATH=/mnt/c/SysGCC/esp32/esp-idf/v5.1 +WRK_IDF_PATH=/mnt/c/SysGCC/esp32-8.4/esp-idf/v4.4.1 +WRK_IDF_PATH=~/esp/esp-idf + +. $WRK_IDF_PATH/export.sh +# Set target SoC +idf.py set-target esp32c3 -idf.py build flash -p /dev/ttyS20 -b 921600 monitor +# Optionally erase + +# Build and flash +idf.py build flash -p /dev/ttyS20 -b 115200 monitor ``` ## Example Output @@ -42,7 +115,7 @@ for help in optimizing for your particular application, or see the [docs](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html). -Compiled and flashed with `idf.py build flash -p /dev/ttyS7 -b 921600 monitor`: +Compiled and flashed with `idf.py build flash -p /dev/ttyS7 -b 115200 monitor`: ``` --- idf_monitor on /dev/ttyS7 115200 --- @@ -186,5 +259,7 @@ A 'clean` may be needed after freshly installing a new component: ``` -idf.py clean build flash -p /dev/ttyS7 -b 921600 monitor -``` \ No newline at end of file +idf.py clean build flash -p /dev/ttyS7 -b 115200 monitor +``` + +See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v4.4_ESP32.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ - + @@ -220,7 +220,7 @@ openocd - -f interface/tigard.cfg -c "adapter_khz 15000" -f target/esp32.cfg + -f interface/ftdi/tigard.cfg -c "adapter_khz 15000" -f target/esp32.cfg diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v5_ESP32.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v5_ESP32.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v5_ESP32.vgdbproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v5_ESP32.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -18,9 +18,9 @@ com.visualgdb.xtensa-esp32-elf - 11.2.0 - 9.2.90 - 2 + 13.2.0 + 12.1 + 1 .. @@ -67,8 +67,8 @@ true - release/v5.0 - esp-idf/v5.0 + release/v5.2 + esp-idf/v5.2 ESPIDF COM20 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2023 wolfSSL Inc. +# Copyright (C) 2006-2024 wolfSSL Inc. # # This file is part of wolfSSL. # @@ -17,193 +17,275 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA # -# cmake for wolfssl +# cmake for wolfssl Espressif projects # -cmake_minimum_required(VERSION 3.5) +# Version 5.7.0 template update + THIS_IDF_PATH +# +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html +# + +cmake_minimum_required(VERSION 3.16) + +set(VERBOSE_COMPONENT_MESSAGES 1) + +# The scope of this CMAKE_C_FLAGS is just this component: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") -set(CMAKE_CURRENT_SOURCE_DIR ".") -# We are currently in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl -# The root of wolfSSL is 7 directories up from here: -get_filename_component(WOLFSSL_ROOT "../../../../../../../" ABSOLUTE) +set(CMAKE_CURRENT_SOURCE_DIR ".") +# set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component -# Espressif may take several passes through this makefile. Check to see if we found IDF -string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) +# Optionally set your source to wolfSSL in your project CMakeLists.txt like this: +# set(WOLFSSL_ROOT "c:/test/my_wolfssl" ) -if($WOLFSSL_FOUND_IDF) - message(STATUS "IDF_PATH = $ENV{IDF_PATH}") - message(STATUS "WOLFSSL_ROOT = ${WOLFSSL_ROOT}") - message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") +if ( "${WOLFSSL_ROOT}" STREQUAL "") + set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" ) endif() -# get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa -FILE(GLOB EXCLUDE_ASM *.S) -file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") +if( "$ENV{IDF_PATH}" STREQUAL "" ) + message(FATAL_ERROR "IDF_PATH Environment variable not set!") +else() + string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}") +endif() -if(NOT CMAKE_BUILD_EARLY_EXPANSION) - message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") +# Optional compiler definitions to help with system name detection (typically printed by app diagnostics) +if(VERBOSE_COMPONENT_MESSAGES) + if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") + endif() + if(CMAKE_HOST_UNIX) + message("Detected UNIX") + endif() + if(APPLE) + message("Detected APPLE") + endif() + if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") + endif() + if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") + endif() + if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") + endif() +endif() # End optional WOLFSSL_CMAKE_SYSTEM_NAME + +message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}") + +# Check that there are not conflicting wolfSSL components +# The ESP Registry Component will be in ./managed_components/wolfssl__wolfssl +# The local component wolfSSL directory will be in ./components/wolfssl +if( EXISTS "${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" AND EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl" ) + # These exclude statements don't seem to be honored by the $ENV{IDF_PATH}/tools/cmake/project.cmake' + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" EXCLUDE_FROM_ALL) + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl/include" EXCLUDE_FROM_ALL) + # So we'll error out and let the user decide how to proceed: + message(WARNING "\nFound wolfSSL components in\n" + "./managed_components/wolfssl__wolfssl\n" + "and\n" + "./components/wolfssl\n" + "in project directory: \n" + "${CMAKE_HOME_DIRECTORY}") + message(FATAL_ERROR "\nPlease use either the ESP Registry Managed Component or the wolfSSL component directory but not both.\n" + "If removing the ./managed_components/wolfssl__wolfssl directory, remember to also remove " + "or rename the idf_component.yml file typically found in ./main/") +else() + message(STATUS "No conflicting wolfSSL components found.") endif() -set(INCLUDE_PATH ${WOLFSSL_ROOT}) -set(COMPONENT_SRCDIRS "${WOLFSSL_ROOT}/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel/" - "${WOLFSSL_ROOT}/wolfcrypt/benchmark/" - "${WOLFSSL_ROOT}/wolfcrypt/test/" - ) +# Don't include lwip requirement for benchmark and test apps. +if( ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark") OR ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_test") ) + message(STATUS "Not including lwip for ${CMAKE_PROJECT_NAME}") +else() + # benchmark and test do not need wifi, everything else probably does: + set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component +endif() -set(COMPONENT_REQUIRES lwip) +# find the user name to search for possible "wolfssl-username" +message(STATUS "USERNAME = $ENV{USERNAME}") +if( "$ENV{USER}" STREQUAL "" ) # the bash user + if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user + message(STATUS "could not find USER or USERNAME") + else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USERNAME}") + endif() +else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USER}") +endif() +message(STATUS "THIS_USER = ${THIS_USER}") +if( "$ENV{IDF_PATH}" STREQUAL "" ) + message(FATAL_ERROR "IDF_PATH Environment variable not set!") +else() + string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}") +endif() -# check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) - # - # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user - # - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") - message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") - message(STATUS "") - message(STATUS "To proceed: ") - message(STATUS "") - message(STATUS "Remove either the local project component: ${CMAKE_HOME_DIRECTORY}/components/wolfssl/ ") - message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") - message(STATUS "") - message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") +# COMPONENT_NAME = wolfssl +# The component name is the directory name. "No feature to change this". +# See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685 + +# set the root of wolfSSL in top-level project CMakelists.txt: +# set(WOLFSSL_ROOT "C:/some path/with/spaces") +# set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]") +# set(WOLFSSL_ROOT "/mnt/c/some path/with/spaces") +# or use this logic to assign value from Environment Variable WOLFSSL_ROOT, +# or assume this is an example 7 subdirectories below: - # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") +# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl +# The root of wolfSSL is 7 directories up from here: -else() - if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) - # - # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. - # - message(STATUS "") - message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") - message(STATUS "") +# function: IS_WOLFSSL_SOURCE +# parameter: DIRECTORY_PARAMETER - the directory to test +# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank. +function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT) + if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src") + set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE) else() - # - # wolfSSL is not an ESP-IDF component. We need to now determine if it is local and if so if it is part of the wolfSSL repo - # or if wolfSSL is simply installed as a local component. - # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" ) - # - # wolfSSL found in local project. - # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/include/" ) - message(STATUS "") - message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - # - # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. - # - # We won't do anything else here, as it will be assumed the original install completed successfully. - # + set(${RESULT} "" PARENT_SCOPE) + endif() +endfunction() + +# ********************************************************************************************* +# function: FIND_WOLFSSL_DIRECTORY +# parameter: OUTPUT_FOUND_WOLFSSL_DIRECTORY contains root of source code, otherwise blank +# +# Example usage: +# FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) +# ********************************************************************************************* +function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) + message(STATUS "Starting FIND_WOLFSSL_DIRECTORY: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}") + + if ( "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" STREQUAL "" ) + set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}") + if( "${CURRENT_SEARCH_DIR}" STREQUAL "" ) + message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...") + else() + get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable:") else() - # - # This is the developer repo mode. wolfSSL will be assume to be not installed to ESP-IDF nor local project - # In this configuration, we are likely running a wolfSSL example found directly in the repo. - # - message(STATUS "") - message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - - message(STATUS "************************************************************************************************") - # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. - # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. - # - # first check if there's a [root]/include/user_settings.h - if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) - # we won't overwrite an existing user settings file, just note that we already have one: - message(STATUS "Found wolfSSL user_settings.h in ${WOLFSSL_ROOT}/include/user_settings.h") - else() - message(STATUS "Installing wolfSSL user_settings.h to ${WOLFSSL_ROOT}/include/user_settings.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" DESTINATION "${WOLFSSL_ROOT}/include/") - endif() # user_settings.h - - # next check if there's a [root]/include/config.h - if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) - message(STATUS "Found wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h") - else() - message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_ROOT}/include/config.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_ROOT}/include/") - file(RENAME "${WOLFSSL_ROOT}/include/dummy_config_h" "${WOLFSSL_ROOT}/include/config.h") - endif() # config.h - message(STATUS "************************************************************************************************") - message(STATUS "") + message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") + message(STATUS "$ENV{WOLFSSL_ROOT}") endif() + endif() + else() + get_filename_component(CURRENT_SEARCH_DIR "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" ABSOLUTE) + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via prior specification.") + else() + message(FATAL_ERROR "WOLFSSL_ROOT Variable defined, but path not found: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}") + endif() + endif() + + + # we'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl + message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE) + message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + + # loop through all the parents, looking for wolfssl + while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" ) + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + # wolfSSL may simply be in a parent directory, such as for local examples in wolfssl repo + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + # Maintain CURRENT_SEARCH_DIR, but check various suffixes with CURRENT_SEARCH_DIR_ALT + if( THIS_USER ) + # Check for "wolfssl-[username]" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-${THIS_USER}) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}") + + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + endif() + if ( FOUND_WOLFSSL ) + # if we already found the source, skip attempt of "wolfssl-master" else() - # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. - if($WOLFSSL_FOUND_IDF) - message(STATUS "") - message(STATUS "WARNING: wolfSSL not found.") - message(STATUS "") - else() - # probably needs to be re-parsed by Espressif - message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") - endif() # else we have not found ESP-IDF yet - endif() # else not a local wolfSSL component + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-master) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}") - endif() #else not an ESP-IDF component -endif() # else not local copy and EDP-IDF wolfSSL + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in master-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + endif() + if ( FOUND_WOLFSSL ) + # if we already found the source, skip attempt of "wolfssl" + else() + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}") -# RTOS_IDF_PATH is typically: -# "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" -# depending on the environment, we may need to swap backslashes with forward slashes -string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + endif() -# ESP-IDF after version 4.4x has a different RTOS directory structure -string(REPLACE "\\" "/" RTOS_IDF_PATH5 "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") + # Next check for no user suffix "wolfssl" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl) + # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + # Move up one directory level + set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY) + message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" ) + # When the parent is current directory, cannot go any further. We didn't find wolfssl. + # When the search directory is empty, we'll give up. + set(CURRENT_SEARCH_DIR "") + endif() + endwhile() + + # If not found, set the output variable to empty before exiting + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} "" PARENT_SCOPE) +endfunction() -if(IS_DIRECTORY ${IDF_PATH}/components/freertos/FreeRTOS-Kernel/) - set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH5}" - "${WOLFSSL_ROOT}" - ) -else() - - set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH}" - "${WOLFSSL_ROOT}" - ) -endif() - -if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) - list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") -endif() - -set(COMPONENT_SRCEXCLUDE - "${WOLFSSL_ROOT}/src/bio.c" - "${WOLFSSL_ROOT}/src/conf.c" - "${WOLFSSL_ROOT}/src/misc.c" - "${WOLFSSL_ROOT}/src/pk.c" - "${WOLFSSL_ROOT}/src/ssl_asn1.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/ssl_bn.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/ssl_misc.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/x509.c" - "${WOLFSSL_ROOT}/src/x509_str.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/evp.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/misc.c" - "${EXCLUDE_ASM}" - ) -set(COMPONENT_PRIV_INCLUDEDIRS ${IDF_PATH}/components/driver/include) -register_component() +# Example usage: +# +# Simply find the WOLFSSL_DIRECTORY by searching parent directories: +# FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) +# + +message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}") -# some optional diagnostics if (0) get_cmake_property(_variableNames VARIABLES) list (SORT _variableNames) @@ -218,8 +300,375 @@ message(STATUS "") endif() +if ( ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266") OR ("${IDF_TARGET}" STREQUAL "esp8266") ) + # There's no esp_timer, no driver components for the ESP8266 + message(STATUS "Early expansion EXCLUDES esp_timer: ${THIS_INCLUDE_TIMER}") + message(STATUS "Early expansion EXCLUDES driver: ${THIS_INCLUDE_DRIVER}") + set(THIS_INCLUDE_TIMER "") + set(THIS_INCLUDE_DRIVER "") +else() + message(STATUS "Early expansion includes esp_timer: ${THIS_INCLUDE_TIMER}") + message(STATUS "Early expansion includes driver: ${THIS_INCLUDE_DRIVER}") + set(THIS_INCLUDE_TIMER "esp_timer") + set(THIS_INCLUDE_DRIVER "driver") +endif() + +if(CMAKE_BUILD_EARLY_EXPANSION) + message(STATUS "wolfssl component CMAKE_BUILD_EARLY_EXPANSION:") + idf_component_register( + REQUIRES "${COMPONENT_REQUIRES}" + PRIV_REQUIRES # esp_hw_support + ${THIS_INCLUDE_TIMER} + ${THIS_INCLUDE_DRIVER} # this will typically only be needed for wolfSSL benchmark + ) + +else() + # not CMAKE_BUILD_EARLY_EXPANSION + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config:") + message(STATUS "************************************************************************************************") + + # search for wolfSSL + FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) + if(WOLFSSL_ROOT) + IS_WOLFSSL_SOURCE("${WOLFSSL_ROOT}" FOUND_WOLFSSL) + if(FOUND_WOLFSSL) + message(STATUS "Found WOLFSSL_ROOT via CMake specification.") + else() + # WOLFSSL_ROOT Path specified in CMakeLists.txt is not a valid path + message(FATAL_ERROR "WOLFSSL_ROOT CMake Variable defined, but path not found: ${WOLFSSL_ROOT}\n" + "Try correcting WOLFSSL_ROOT in your project CMakeFile.txt or setting environment variable.") + # Abort CMake after fatal error. + endif() + else() + message(STATUS "Searching for wolfSL source code...") + FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) + endif() + + + if(WOLFSSL_ROOT) + message(STATUS "Confirmed wolfssl directory at: ${WOLFSSL_ROOT}") + else() + message(STATUS "Failed: wolfssl directory not found.") + # Abort. We need wolfssl _somewhere_. + message(FATAL_ERROR "Could not find wolfssl in any parent directory named wolfssl-${THIS_USER}, wolfssl-master, or wolfssl.\n" + "Try setting WOLFSSL_ROOT environment variable, cmake variable in project, copy source, or use managed components.") + # Abort CMake after fatal error. + endif() + + set(INCLUDE_PATH ${WOLFSSL_ROOT}) + + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/src/") + + # During regression tests, optionally copy source locally and use: set(USE_LOCAL_TEST_BENCH 1) + set(USE_LOCAL_TEST_BENCH 0) + if(NOT USE_LOCAL_TEST_BENCH) + if( "${CMAKE_PROJECT_NAME}" STREQUAL "hello-world" ) + message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/benchmark") + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark") + endif() + + if( "${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark" ) + message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/benchmark") + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark") + endif() + + if( "${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_test" ) + message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/test") + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/test") + endif() + endif() + + set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\"" + "\"${WOLFSSL_EXTRA_PROJECT_DIR}\"" + ) # COMPONENT_SRCDIRS + + message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + + # wolfSSL user_settings.h is in the local project. + set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl") + # add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + + string(REPLACE "/" "//" STR_WOLFSSL_PROJECT_DIR "${WOLFSSL_PROJECT_DIR}") + add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${STR_WOLFSSL_PROJECT_DIR}//include//user_settings.h") + + # Espressif may take several passes through this makefile. Check to see if we found IDF + string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) + + # get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa + file(GLOB EXCLUDE_ASM *.S) + file(GLOB EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") + + message(STATUS "IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") + message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") + + # + # Check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # + # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user + # + message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") + message(STATUS "") + message(STATUS "To proceed: ") + message(STATUS "") + message(STATUS "Remove either the local project component: ${WOLFSSL_PROJECT_DIR} ") + message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") + message(STATUS "") + message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + + message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") + # Abort CMake after fatal error. + + # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") + + else() + if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # + # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. + # + message(STATUS "") + message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "") + else() + # + # wolfSSL is not an ESP-IDF component. + # We need to now determine if it is local and if so if it is part of the wolfSSL repo, + # or if wolfSSL is simply installed as a local component. + # + + if( EXISTS "${WOLFSSL_PROJECT_DIR}" ) + # + # wolfSSL found in local project. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}/wolfcrypt/" ) + message(STATUS "") + message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + # + # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. + # + # We won't do anything else here, as it will be assumed the original install completed successfully. + # + else() # full wolfSSL not installed in local project + # + # This is the developer repo mode. wolfSSL will be assumed to be not installed to ESP-IDF nor local project + # In this configuration, we are likely running a wolfSSL example found directly in the repo. + # + message(STATUS "") + message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + + message(STATUS "************************************************************************************************") + # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. + # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. + # + # first check if there's a [root]/include/user_settings.h + if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) + message(FATAL_ERROR "Found stray wolfSSL user_settings.h in " + "${WOLFSSL_ROOT}/include/user_settings.h " + " (please move it to ${WOLFSSL_PROJECT_DIR}/include/user_settings.h )") + # Abort CMake after fatal error. + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/user_settings.h" ) + message(STATUS "Using existing wolfSSL user_settings.h in " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + else() + message(STATUS "Installing wolfSSL user_settings.h to " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" + DESTINATION "${CMAKE_HOME_DIRECTORY}/wolfssl/include/") + endif() + endif() # user_settings.h + + # next check if there's a [root]/include/config.h + if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + message(STATUS "Found stray wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS " Please move it to ${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "Using existing wolfSSL config.h ${WOLFSSL_PROJECT_DIR}/include/config.h") + else() + message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_PROJECT_DIR}/include/config.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_PROJECT_DIR}/include/") + file(RENAME "${WOLFSSL_PROJECT_DIR}/include/dummy_config_h" "${WOLFSSL_PROJECT_DIR}/include/config.h") + endif() # Project config.h + endif() # WOLFSSL_ROOT config.h + message(STATUS "************************************************************************************************") + message(STATUS "") + endif() + + else() + # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. + if($WOLFSSL_FOUND_IDF) + message(STATUS "") + message(STATUS "WARNING: wolfSSL not found.") + message(STATUS "") + else() + # probably needs to be re-parsed by Espressif + message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") + endif() # else we have not found ESP-IDF yet + endif() # else not a local wolfSSL component + + endif() #else not an ESP-IDF component + endif() # else not local copy and EDP-IDF wolfSSL + + + # RTOS_IDF_PATH is typically: + # "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" + # depending on the environment, we may need to swap backslashes with forward slashes + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") + + string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT}) + + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}") + else() + # ESP-IDF prior version 4.4x has a different RTOS directory structure + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found legacy RTOS path: ${RTOS_IDF_PATH}") + else() + message(STATUS "Could not find RTOS path") + endif() + endif() + message(STATUS "THIS_IDF_PATH = $THIS_IDF_PATH") + # wolfSSL-specific include directories + set(COMPONENT_ADD_INCLUDEDIRS + "./include" # this is the location of wolfssl user_settings.h + "\"${WOLFSSL_ROOT}/\"" + "\"${WOLFSSL_ROOT}/wolfssl/\"" + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"" + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/port/Espressif\"" + "\"${RTOS_IDF_PATH}/\"" + # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers + "${THIS_IDF_PATH}/components/esp_event/include" + "${THIS_IDF_PATH}/components/esp_netif/include" + "${THIS_IDF_PATH}/components/esp_wifi/include" + ) + + # Optionally include cryptoauthlib if present + if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) + list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") + endif() + + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/\"") + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"") + + + # Some files are known to be included elsewhere, or not used for Espressif + set(COMPONENT_SRCEXCLUDE + "\"${WOLFSSL_ROOT}/src/bio.c\"" + "\"${WOLFSSL_ROOT}/src/conf.c\"" + "\"${WOLFSSL_ROOT}/src/misc.c\"" + "\"${WOLFSSL_ROOT}/src/pk.c\"" + "\"${WOLFSSL_ROOT}/src/ssl_asn1.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_bn.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_certman.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_crypto.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_load.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_misc.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_p7p12.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_sess.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/x509.c\"" + "\"${WOLFSSL_ROOT}/src/x509_str.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external non-wolfssl Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external non-wolfssl Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_armthumb.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\"" + "\"${EXCLUDE_ASM}\"" + ) + + spaces2list(COMPONENT_REQUIRES) + + separate_arguments(COMPONENT_SRCDIRS NATIVE_COMMAND "${COMPONENT_SRCDIRS}") + separate_arguments(COMPONENT_SRCEXCLUDE NATIVE_COMMAND "${COMPONENT_SRCEXCLUDE}") + separate_arguments(COMPONENT_ADD_INCLUDEDIRS NATIVE_COMMAND "${COMPONENT_ADD_INCLUDEDIRS}") + + # + # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#example-component-requirements + # + message(STATUS "COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + message(STATUS "COMPONENT_ADD_INCLUDEDIRS = ${COMPONENT_ADD_INCLUDEDIRS}") + message(STATUS "COMPONENT_REQUIRES = ${COMPONENT_REQUIRES}") + message(STATUS "COMPONENT_SRCEXCLUDE = ${COMPONENT_SRCEXCLUDE}") + + # + # see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path + # + set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}") + idf_component_register( + SRC_DIRS "${COMPONENT_SRCDIRS}" + INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}" + REQUIRES "${COMPONENT_REQUIRES}" + EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}" + PRIV_REQUIRES + "${THIS_INCLUDE_TIMER}" + "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark + ) + + # Some optional diagnostics. Verbose ones are truncated. + if (VERBOSE_COMPONENT_MESSAGES) + get_cmake_property(_variableNames VARIABLES) + list (SORT _variableNames) + message(STATUS "") + message(STATUS "ALL VARIABLES BEGIN") + message(STATUS "") + foreach (_variableName ${_variableNames}) + if ( ("${_variableName}" STREQUAL "bootloader_binary_files") + OR ("${_variableName}" STREQUAL "Component paths") + OR ("${_variableName}" STREQUAL "component_targets") + OR ("${_variableName}" STREQUAL "__COMPONENT_TARGETS") + OR ("${_variableName}" STREQUAL "CONFIGS_LIST") + OR ("${_variableName}" STREQUAL "__CONFIG_VARIABLES") + OR ("${_variableName}" STREQUAL "val") + OR ("${_variableName}" MATCHES "^__idf_") + ) + # Truncate the displayed value: + string(SUBSTRING "${${_variableName}}" 0 70 truncatedValue) + message(STATUS "${_variableName} = ${truncatedValue} ... (truncated)") + else() + message(STATUS "${_variableName}=${${_variableName}}") + endif() + endforeach() + message(STATUS "") + message(STATUS "ALL VARIABLES END") + message(STATUS "") + endif() + + # target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"") + +endif() # CMAKE_BUILD_EARLY_EXPANSION + + + # check to see if there's both a local copy and EDP-IDF copy of the wolfssl components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) +if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) message(STATUS "") message(STATUS "") message(STATUS "********************************************************************") @@ -230,3 +679,71 @@ # end multiple component check +# +# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) +# +# Save the THIS_VAR as a string in a macro called VAR_OUPUT +# +# VAR_OUPUT: the name of the macro to define +# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process() +# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful. +# +function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT ) + # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true. + string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE) + + # if we had a successful operation, save the THIS_VAR in VAR_OUPUT + if(${IS_VALID_VALUE}) + # strip newline chars in THIS_VAR parameter and save in VAR_VALUE + string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR}) + + # we'll could percolate the value to the parent for possible later use + # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE) + + # but we're only using it here in this function + set(${VAR_OUPUT} ${VAR_VALUE}) + + # we'll print what we found to the console + message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}") + + # the interesting part is defining the VAR_OUPUT name a value to use in the app + add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\") + else() + # if we get here, check the execute_process command and parameters. + message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT") + set(${VAR_OUPUT} "Unknown") + endif() +endfunction() # LIBWOLFSSL_SAVE_INFO + +# create some programmatic #define values that will be used by ShowExtendedSystemInfo(). +# see wolfcrypt\src\port\Espressif\esp32_utl.c +if(NOT CMAKE_BUILD_EARLY_EXPANSION) + set (git_cmd "git") + message(STATUS "Adding macro definitions:") + + # LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\' + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}") + + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_WOLFSSL_ROOT "${WOLFSSL_ROOT}" "${TMP_RES}") + + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config complete!") + message(STATUS "************************************************************************************************") +endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,40 +1,240 @@ -# -# Copyright (C) 2006-2023 wolfSSL Inc. -# -# This file is part of wolfSSL. -# -# wolfSSL 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 of the License, or -# (at your option) any later version. -# -# wolfSSL 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA -# -# -# Component Makefile -# - -COMPONENT_ADD_INCLUDEDIRS := . ./include - -COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/components/freertos/include/freertos" -# COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/soc/esp32s3/include/soc" - -COMPONENT_SRCDIRS := src wolfcrypt/src -COMPONENT_SRCDIRS += wolfcrypt/src/port/Espressif -COMPONENT_SRCDIRS += wolfcrypt/src/port/atmel -COMPONENT_SRCDIRS += wolfcrypt/benchmark -COMPONENT_SRCDIRS += wolfcrypt/test - -CFLAGS +=-DWOLFSSL_USER_SETTINGS - -COMPONENT_OBJEXCLUDE := wolfcrypt/src/aes_asm.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/evp.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/misc.o -COMPONENT_OBJEXCLUDE += src/bio.o +# +# Copyright (C) 2006-2024 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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 of the License, or +# (at your option) any later version. +# +# wolfSSL 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +# + +# +# Component Makefile +# +# +# The Espressif Managed Components are only for newer versions of the ESP-IDF +# Typically only for ESP32[-x] targets and only for ESP-IDF v4.3 or later: +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html +# https://components.espressif.com/ +# +# Usage: +# +# make flash +# +# make flash ESPPORT=/dev/ttyS55 +# +# make flash ESPBAUD=9600 +# +# make monitor ESPPORT=COM1 +# +# make monitor ESPPORT=/dev/ttyS55 MONITORBAUD=115200 +# +# export ESPPORT=/dev/ttyS55 +# +# https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html +# + +# Although the project should define WOLFSSL_USER_SETTINGS, we'll also +# define it here: +CFLAGS +=-DWOLFSSL_USER_SETTINGS + +# In the wolfSSL GitHub examples for Espressif, +# the root is 7 directories up from here: +WOLFSSL_ROOT := ../../../../../../../ + +# NOTE: The wolfSSL include diretory (e.g. user_settings.h) is +# located HERE in THIS project, and *not* in the wolfSSL root. +COMPONENT_ADD_INCLUDEDIRS := . +COMPONENT_ADD_INCLUDEDIRS += include +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT). +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfssl +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfssl/wolfcrypt +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfssl/wolfcrypt/port/Espressif +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfcrypt/benchmark +# COMPONENT_ADD_INCLUDEDIRS += $ENV(IDF_PATH)/components/freertos/include/freertos +# COMPONENT_ADD_INCLUDEDIRS += "$ENV(IDF_PATH)/soc/esp32s3/include/soc" + + +# WOLFSSL_ROOT := "" +COMPONENT_SRCDIRS := $(WOLFSSL_ROOT)src +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src/port/atmel +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/benchmark +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/test +COMPONENT_SRCDIRS += include + +COMPONENT_OBJEXCLUDE := $(WOLFSSL_ROOT)wolfcrypt/src/aes_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/evp.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/misc.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/sha512_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/fe_x25519_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/aes_gcm_x86_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)src/bio.o + + +## +## wolfSSL +## +COMPONENT_OBJS := $(WOLFSSL_ROOT)src/bio.o +# COMPONENT_OBJS += src/conf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/crl.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/dtls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/dtls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/internal.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/keys.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/ocsp.o +# COMPONENT_OBJS += src/pk.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/quic.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/sniffer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/ssl.o +# COMPONENT_OBJS += src/ssl_asn1.o +# COMPONENT_OBJS += src/ssl_bn.o +# COMPONENT_OBJS += src/ssl_certman.o +# COMPONENT_OBJS += src/ssl_crypto.o +# COMPONENT_OBJS += src/ssl_misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/tls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/tls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/wolfio.o +# COMPONENT_OBJS += src/x509.o +# COMPONENT_OBJS += src/x509_str.o + +## +## wolfcrypt +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/arc4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/asm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/asn.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/async.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/blake2b.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/blake2s.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/camellia.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/chacha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/chacha20_poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/cmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/coding.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/compress.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/cpuid.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/cryptocb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/curve25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/curve448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/des3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/dh.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/dilithium.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/dsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ecc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/eccsi.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ecc_fp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ed25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ed448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/error.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/evp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/falcon.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fe_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fe_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fe_operations.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fips.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fips_test.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ge_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ge_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ge_operations.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/hash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/hmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/hpke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/integer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/kdf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/logging.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/md2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/md4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/md5.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/memory.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/pkcs12.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/pkcs7.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/pwdbased.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/random.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/rc2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ripemd.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/rsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sakke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/selftest.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha256.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha512.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/signature.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/siphash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sm2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sm3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sm4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sphincs.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_armthumb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_c32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_c64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_cortexm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_dsp32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_int.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_armthumb.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_c32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_c64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_cortexm.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_x86_64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_x86_64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/srp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/tfm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_dsp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_encrypt.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_kyber_poly.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_pkcs11.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_port.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfcrypt_first.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfcrypt_last.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfevent.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfmath.o + +## +## Espressif +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_mp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_util.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp_sdk_time_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.o + +## +## wolfcrypt benchmark (optional) +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/benchmark/benchmark.o + +## +## wolfcrypt test (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/test/test.o + +## +## wolfcrypt +## +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,752 @@ +/* user_settings.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* This user_settings.h is for Espressif ESP-IDF + * + * Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.7.0-1 + * + * Do not include any wolfssl headers here + * + * When editing this file: + * ensure wolfssl_test and wolfssl_benchmark settings match. + */ + +/* The Espressif project config file. See also sdkconfig.defaults */ +#include "sdkconfig.h" + +/* The Espressif sdkconfig will have chipset info. +** +** Some possible values: +** +** CONFIG_IDF_TARGET_ESP32 +** CONFIG_IDF_TARGET_ESP32S2 +** CONFIG_IDF_TARGET_ESP32S3 +** CONFIG_IDF_TARGET_ESP32C3 +** CONFIG_IDF_TARGET_ESP32C6 +*/ + +#undef WOLFSSL_ESPIDF +#define WOLFSSL_ESPIDF + +/* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */ +#define NO_ESP_SDK_WIFI + +/* Experimental Kyber */ +#if 0 + /* Kyber typically needs a minimum 10K stack */ + #define WOLFSSL_EXPERIMENTAL_SETTINGS + #define WOLFSSL_HAVE_KYBER + #define WOLFSSL_WC_KYBER + #define WOLFSSL_SHA3 +#endif + +/* + * ONE of these Espressif chip families will be detected from sdkconfig: + * + * WOLFSSL_ESP32 + * WOLFSSL_ESP8266 + */ +#undef WOLFSSL_ESPWROOM32SE +#undef WOLFSSL_ESP8266 +#undef WOLFSSL_ESP32 +/* See below for chipset detection from sdkconfig.h */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* SMALL_SESSION_CACHE saves a lot of RAM for ClientCache and SessionCache. + * Memory requirement is about 5KB, otherwise 20K is needed when not specified. + * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K) + * When really desperate or no TLS used, try NO_SESSION_CACHE. */ +#define NO_SESSION_CACHE + +/* Small Stack uses more heap. */ +#define WOLFSSL_SMALL_STACK + +/* Full debugging turned off, but show malloc failure detail */ +/* #define DEBUG_WOLFSSL */ +#define DEBUG_WOLFSSL_MALLOC + +/* See test.c that sets cert buffers; we'll set them here: */ +#define USE_CERT_BUFFERS_256 +#define USE_CERT_BUFFERS_2048 + +/* RSA_LOW_MEM: Half as much memory but twice as slow. */ +#define RSA_LOW_MEM + +/* Uncommon settings for testing only */ +#define TEST_ESPIDF_ALL_WOLFSSL +#ifdef TEST_ESPIDF_ALL_WOLFSSL + #define WOLFSSL_MD2 + #define HAVE_BLAKE2 + #define HAVE_BLAKE2B + #define HAVE_BLAKE2S + + #define WC_RC2 + #define WOLFSSL_ALLOW_RC4 + + #define HAVE_POLY1305 + + #define WOLFSSL_AES_128 + #define WOLFSSL_AES_OFB + #define WOLFSSL_AES_CFB + #define WOLFSSL_AES_XTS + + /* #define WC_SRTP_KDF */ + /* TODO Causes failure with Espressif AES HW Enabled */ + /* #define HAVE_AES_ECB */ + /* #define HAVE_AESCCM */ + /* TODO sanity check when missing HAVE_AES_ECB */ + #define WOLFSSL_WOLFSSH + + #define HAVE_AESGCM + #define WOLFSSL_AES_COUNTER + + #define HAVE_FFDHE + #define HAVE_FFDHE_2048 + #if defined(CONFIG_IDF_TARGET_ESP8266) + /* TODO Full size SRP is disabled on the ESP8266 at this time. + * Low memory issue? */ + #define WOLFCRYPT_HAVE_SRP + /* MIN_FFDHE_FP_MAX_BITS = (MIN_FFDHE_BITS * 2); see settings.h */ + #define FP_MAX_BITS MIN_FFDHE_FP_MAX_BITS + #elif defined(CONFIG_IDF_TARGET_ESP32) || \ + defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + /* TODO: SRP Not enabled, known to fail on this target + * See https://github.com/wolfSSL/wolfssl/issues/7210 */ + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) + /* SRP Known to be working on this target::*/ + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #else + /* For everything else, give a try and see if SRP working: */ + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #endif + + #define HAVE_DH + + /* TODO: there may be a problem with HAVE_CAMELLIA with HW AES disabled. + * Do not define NO_WOLFSSL_ESP32_CRYPT_AES when enabled: */ + /* #define HAVE_CAMELLIA */ + + /* DSA requires old SHA */ + #define HAVE_DSA + + /* Needs SHA512 ? */ + #define HAVE_HPKE + + /* Not for Espressif? */ + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) || \ + defined(CONFIG_IDF_TARGET_ESP8266) + + #if defined(CONFIG_IDF_TARGET_ESP8266) + #undef HAVE_ECC + #undef HAVE_ECC_CDH + #undef HAVE_CURVE25519 + + /* TODO does CHACHA also need alignment? Failing on ESP8266 + * See SHA256 __attribute__((aligned(4))); and WC_SHA256_ALIGN */ + #ifdef HAVE_CHACHA + #error "HAVE_CHACHA not supported on ESP8266" + #endif + #ifdef HAVE_XCHACHA + #error "HAVE_XCHACHA not supported on ESP8266" + #endif + #else + #define HAVE_XCHACHA + #define HAVE_CHACHA + /* TODO Not enabled at this time, needs further testing: + * #define WC_SRTP_KDF + * #define HAVE_COMP_KEY + * #define WOLFSSL_HAVE_XMSS + */ + #endif + /* TODO AES-EAX not working on this platform */ + + /* Optionally disable DH + * #undef HAVE_DH + * #undef HAVE_FFDHE + */ + + /* ECC_SHAMIR out of memory on ESP32-C2 during ECC */ + #ifndef HAVE_ECC + #define ECC_SHAMIR + #endif + #else + #define WOLFSSL_AES_EAX + + #define ECC_SHAMIR + #endif + + /* Only for WOLFSSL_IMX6_CAAM / WOLFSSL_QNX_CAAM ? */ + /* #define WOLFSSL_CAAM */ + /* #define WOLFSSL_CAAM_BLOB */ + + #define WOLFSSL_AES_SIV + #define WOLFSSL_CMAC + + #define WOLFSSL_CERT_PIV + + /* HAVE_SCRYPT may turn on HAVE_PBKDF2 see settings.h */ + /* #define HAVE_SCRYPT */ + #define SCRYPT_TEST_ALL + #define HAVE_X963_KDF +#endif + +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* When you don't want to use the old SHA */ +/* #define NO_SHA */ +/* #define NO_OLD_TLS */ + +#define BENCH_EMBEDDED + +/* TLS 1.3 */ +#define WOLFSSL_TLS13 +#define HAVE_TLS_EXTENSIONS +#define WC_RSA_PSS +#define HAVE_HKDF +#define HAVE_AEAD +#define HAVE_SUPPORTED_CURVES + +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + +#define NO_FILESYSTEM + +#define NO_OLD_TLS + +#define HAVE_AESGCM + +/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */ +/* #define WOLFSSL_RIPEMD */ + +/* when you want to use SHA224 */ +#define WOLFSSL_SHA224 + +/* when you want to use SHA384 */ +#define WOLFSSL_SHA384 + +/* when you want to use SHA512 */ +#define WOLFSSL_SHA512 + +/* when you want to use SHA3 */ +#define WOLFSSL_SHA3 + + /* ED25519 requires SHA512 */ +#define HAVE_ED25519 + +/* Some features not enabled for ESP8266: */ +#if defined(CONFIG_IDF_TARGET_ESP8266) || \ + defined(CONFIG_IDF_TARGET_ESP32C2) + /* TODO determine low memory configuration for ECC. */ +#else + #define HAVE_ECC + #define HAVE_CURVE25519 + #define CURVE25519_SMALL +#endif + +#define HAVE_ED25519 + +/* Optional OPENSSL compatibility */ +#define OPENSSL_EXTRA + +/* #Optional HAVE_PKCS7 */ +#define HAVE_PKCS7 + +#if defined(HAVE_PKCS7) + /* HAVE_PKCS7 may enable HAVE_PBKDF2 see settings.h */ + #define NO_PBKDF2 + + #define HAVE_AES_KEYWRAP + #define HAVE_X963_KDF + #define WOLFSSL_AES_DIRECT +#endif + +/* when you want to use AES counter mode */ +/* #define WOLFSSL_AES_DIRECT */ +/* #define WOLFSSL_AES_COUNTER */ + +/* esp32-wroom-32se specific definition */ +#if defined(WOLFSSL_ESPWROOM32SE) + #define WOLFSSL_ATECC508A + #define HAVE_PK_CALLBACKS + /* when you want to use a custom slot allocation for ATECC608A */ + /* unless your configuration is unusual, you can use default */ + /* implementation. */ + /* #define CUSTOM_SLOT_ALLOCATION */ +#endif + +/* WC_NO_CACHE_RESISTANT: slower but more secure */ +/* #define WC_NO_CACHE_RESISTANT */ + +/* TFM_TIMING_RESISTANT: slower but more secure */ +/* #define TFM_TIMING_RESISTANT */ + +/* #define WOLFSSL_ATECC508A_DEBUG */ + +/* date/time */ +/* if it cannot adjust time in the device, */ +/* enable macro below */ +/* #define NO_ASN_TIME */ +/* #define XTIME time */ + + +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ +#define ESP_RSA_TIMEOUT_CNT 0x349F00 + +/* hash limit for test.c */ +#define HASH_SIZE_LIMIT + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ +/* #define WOLFSSL_SP_RISCV32 */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + + +#define WOLFSSL_SMALL_STACK + + +#define HAVE_VERSION_EXTENDED_INFO +/* #define HAVE_WC_INTROSPECTION */ + +#define HAVE_SESSION_TICKET + +/* #define HAVE_HASHDRBG */ + +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_EXT +#define WOLFSSL_SYS_CA_CERTS + + +#define WOLFSSL_CERT_TEXT + +#define WOLFSSL_ASN_TEMPLATE + +/* +#undef WOLFSSL_KEY_GEN +#undef WOLFSSL_CERT_REQ +#undef WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_EXT +#undef WOLFSSL_SYS_CA_CERTS +*/ + +/* command-line options +--enable-keygen +--enable-certgen +--enable-certreq +--enable-certext +--enable-asn-template +*/ + +/* Chipset detection from sdkconfig.h + * Default is HW enabled unless turned off. + * Uncomment lines to force SW instead of HW acceleration */ +#if defined(CONFIG_IDF_TARGET_ESP32) + #define WOLFSSL_ESP32 + /* Alternatively, if there's an ECC Secure Element present: */ + /* #define WOLFSSL_ESPWROOM32SE */ + + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + #define WOLFSSL_ESP32 + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: https://www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + #define WOLFSSL_ESP32 + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + #define WOLFSSL_ESP8266 + + /* There's no hardware encryption on the ESP8266 */ + /* Consider using the ESP32-C2/C3/C6 + * See https://www.espressif.com/en/products/socs/esp32-c2 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* There's no Hardware Acceleration available on ESP8684 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP8684 *****/ + +#else + /* Anything else encountered, disable HW accleration */ + #warning "Unexpected CONFIG_IDF_TARGET_NN value" + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +/* RSA primitive specific definition, listed AFTER the Chipset detection */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + /* Consider USE_FAST_MATH and SMALL_STACK */ + + #ifndef NO_RSA + #define ESP32_USE_RSA_PRIMITIVE + + #if defined(CONFIG_IDF_TARGET_ESP32) + #ifdef CONFIG_ESP_MAIN_TASK_STACK_SIZE + #if CONFIG_ESP_MAIN_TASK_STACK_SIZE < 10500 + #warning "RSA may be difficult with less than 10KB Stack "/ + #endif + #endif + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + #endif + #endif +#endif + +/* Debug options: +See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK + +See wolfcrypt/benchmark/benchmark.c for debug and other settings: + +Turn on benchmark timing debugging (CPU Cycles, RTOS ticks, etc) +#define DEBUG_WOLFSSL_BENCHMARK_TIMING + +Turn on timer debugging (used when CPU cycles not available) +#define WOLFSSL_BENCHMARK_TIMER_DEBUG +*/ + +/* Pause in a loop rather than exit. */ +#define WOLFSSL_ESPIDF_ERROR_PAUSE + +#define WOLFSSL_HW_METRICS + +/* for test.c */ +/* #define HASH_SIZE_LIMIT */ + +/* Optionally turn off HW math checks */ +/* #define NO_HW_MATH_TEST */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +/* used by benchmark: */ +#define WOLFSSL_PUBLIC_MP + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/***************************** Certificate Macros ***************************** + * + * The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * https://github.com/wolfSSL/wolfssl/pull/6825 + * https://github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +/* Conditional macros used in wolfSSL TLS client and server examples */ +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #include + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #if defined(USE_CERT_BUFFERS_2048) + /* Be sure to include in app when using example certs: */ + /* #include */ + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #elif defined(USE_CERT_BUFFERS_1024) + /* Be sure to include in app when using example certs: */ + /* #include */ + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + /* Optionally define custom cert arrays, sizes, and types here */ + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif /* Conditional key and cert constant names */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,9 @@ - # # wolfssl benchmark test # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") -set(COMPONENT_SRCS main.c) +set(COMPONENT_SRCS "main.c") set(COMPONENT_ADD_INCLUDEDIRS ".") set (git_cmd "git") @@ -19,7 +18,9 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") endif() -register_component() +idf_component_register(SRCS main.c + INCLUDE_DIRS "." + "./include") # # LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,8 +1,9 @@ # # Main component makefile. # -# This Makefile can be left empty. By default, it will take the sources in the -# src/ directory, compile them and link them into lib(subdirectory_name).a -# in the build directory. This behaviour is entirely configurable, +# This Makefile can be left empty. By default, it will take the sources in the +# src/ directory, compile them and link them into lib(subdirectory_name).a +# in the build directory. This behavior is entirely configurable, # please read the ESP-IDF documents if you need to do this. -# \ No newline at end of file +# +# (Uses default behavior of compiling all source files in directory, adding 'include' to include path.) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/include/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/include/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/include/main.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/include/main.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,30 @@ +/* benchmark main.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef _MAIN_ +#define _MAIN_ + +void app_main(void); + +/* see wolfssl/wolfcrypt/benchmark/benchmark.h */ +extern void wolf_benchmark_task(); + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* benchmark main.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,25 +18,51 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ + /* ESP-IDF */ -#include #include "sdkconfig.h" +#include /* wolfSSL */ +/* The wolfSSL user_settings.h file is automatically included by the settings.h + * file and should never be explicitly included in any other source files. + * The settings.h should also be listed above wolfssl library include files. */ #include -#include #include +#include +#include #ifndef WOLFSSL_ESPIDF - #warning "problem with wolfSSL user_settings. Check components/wolfssl/include" + #error "Problem with wolfSSL user_settings. " \ + "Check components/wolfssl/include " \ + "and confirm WOLFSSL_USER_SETTINGS is defined, " \ + "typically in the component CMakeLists.txt" #endif #include #include +/* Hardware; include after other libraries, + * particularly after freeRTOS from settings.h */ +#include + +/* set to 0 for one benchmark, +** set to 1 for continuous benchmark loop */ +#define BENCHMARK_LOOP 0 + +#define THIS_MONITOR_UART_RX_BUFFER_SIZE 200 + +#ifdef CONFIG_ESP8266_XTAL_FREQ_26 + /* 26MHz crystal: 74880 bps */ + #define THIS_MONITOR_UART_BAUD_DATE 74880 +#else + /* 40MHz crystal: 115200 bps */ + #define THIS_MONITOR_UART_BAUD_DATE 115200 +#endif + /* check BENCH_ARGV in sdkconfig to determine need to set WOLFSSL_BENCH_ARGV */ #ifdef CONFIG_BENCH_ARGV -#define WOLFSSL_BENCH_ARGV CONFIG_BENCH_ARGV -#define WOLFSSL_BENCH_ARGV_MAX_ARGUMENTS 22 /* arbitrary number of max args */ + #define WOLFSSL_BENCH_ARGV CONFIG_BENCH_ARGV + #define WOLFSSL_BENCH_ARGV_MAX_ARGUMENTS 22 /* arbitrary number of max args */ #endif /* @@ -67,6 +93,8 @@ static byte mSlotList[ATECC_MAX_SLOT]; +int atmel_set_slot_allocator(atmel_slot_alloc_cb alloc, atmel_slot_dealloc_cb dealloc); + /* initialize slot array */ void my_atmel_slotInit() { @@ -120,6 +148,7 @@ /* the following are needed by benchmark.c with args */ #ifdef WOLFSSL_BENCH_ARGV char* __argv[WOLFSSL_BENCH_ARGV_MAX_ARGUMENTS]; +#define ARG_BUFF_SIZE 16 int construct_argv() { @@ -128,7 +157,7 @@ int len = 0; char *_argv; /* buffer for copying the string */ char *ch; /* char pointer to trace the string */ - char buff[16] = { 0 }; /* buffer for a argument copy */ + char buff[ARG_BUFF_SIZE] = { 0 }; /* buffer for a argument copy */ ESP_LOGI(TAG, "construct_argv arg:%s\n", CONFIG_BENCH_ARGV); len = strlen(CONFIG_BENCH_ARGV); @@ -161,7 +190,7 @@ memset(buff, 0, sizeof(buff)); /* copy each args into buffer */ i = 0; - while ((*ch != ' ') && (*ch != '\0') && (i < 16)) { + while ((*ch != ' ') && (*ch != '\0') && (i <= ARG_BUFF_SIZE)) { buff[i] = *ch; ++i; ++ch; @@ -183,51 +212,44 @@ /* entry point */ void app_main(void) { + int stack_start = 0; + + uart_config_t uart_config = { + .baud_rate = THIS_MONITOR_UART_BAUD_DATE, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + }; + esp_err_t ret = 0; + stack_start = esp_sdk_stack_pointer(); + + /* uart_set_pin(UART_NUM_0, TX_PIN, RX_PIN, + * UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); */ + + /* Some targets may need to have UART speed set, such as ESP8266 */ + ESP_LOGI(TAG, "UART init"); + uart_param_config(UART_NUM_0, &uart_config); + uart_driver_install(UART_NUM_0, + THIS_MONITOR_UART_RX_BUFFER_SIZE, 0, 0, NULL, 0); + + ESP_LOGI(TAG, "---------------- wolfSSL Benchmark Example -------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "CONFIG_IDF_TARGET = %s", CONFIG_IDF_TARGET); - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_STRING = %s", LIBWOLFSSL_VERSION_STRING); + ESP_LOGI(TAG, "Stack Start: 0x%x", stack_start); -#if defined(WOLFSSL_MULTI_INSTALL_WARNING) - ESP_LOGI(TAG, ""); - ESP_LOGI(TAG, "WARNING: Multiple wolfSSL installs found."); - ESP_LOGI(TAG, "Check ESP-IDF and local project [components] directory."); - ESP_LOGI(TAG, ""); +#ifdef WOLFSSL_ESP_NO_WATCHDOG + ESP_LOGW(TAG, "Found WOLFSSL_ESP_NO_WATCHDOG, disabling..."); + esp_DisableWatchdog(); #endif -#if defined(LIBWOLFSSL_VERSION_GIT_HASH) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH = %s", LIBWOLFSSL_VERSION_GIT_HASH); -#endif - -#if defined(LIBWOLFSSL_VERSION_GIT_SHORT_HASH ) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_SHORT_HASH = %s", LIBWOLFSSL_VERSION_GIT_SHORT_HASH); -#endif - -#if defined(LIBWOLFSSL_VERSION_GIT_HASH_DATE) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH_DATE = %s", LIBWOLFSSL_VERSION_GIT_HASH_DATE); -#endif - - - /* some interesting settings are target specific (ESP32, -C3, -S3, etc */ -#if defined(CONFIG_IDF_TARGET_ESP32C3) - /* not available for C3 at this time */ -#elif defined(CONFIG_IDF_TARGET_ESP32S3) - ESP_LOGI(TAG, "CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); -#else - ESP_LOGI(TAG, "CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); +#if defined(HAVE_VERSION_EXTENDED_INFO) && defined(WOLFSSL_HAS_METRICS) + esp_ShowExtendedSystemInfo(); #endif /* all platforms: stack high water mark check */ - ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); ESP_LOGI(TAG, "app_main CONFIG_BENCH_ARGV = %s", WOLFSSL_BENCH_ARGV); /* when using atecc608a on esp32-wroom-32se */ @@ -251,15 +273,63 @@ /* although wolfCrypt_Init() may be explicitly called above, ** note it is still always called in wolf_benchmark_task. */ - wolf_benchmark_task(); - /* wolfCrypt_Cleanup should always be called at completion, - ** and is called in wolf_benchmark_task(). - */ + stack_start = uxTaskGetStackHighWaterMark(NULL); + + do { + ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); + + wolf_benchmark_task(); /* TODO capture return value! */ + ESP_LOGI(TAG, "Stack used: %d\n", + stack_start - uxTaskGetStackHighWaterMark(NULL)); + + #if defined(WOLFSSL_HW_METRICS) && defined(WOLFSSL_HAS_METRICS) + esp_hw_show_metrics(); + #endif + } while (BENCHMARK_LOOP); + /* Reminder: wolfCrypt_Cleanup should always be called at completion, + ** and is called in wolf_benchmark_task(). */ + +#if defined(SINGLE_THREADED) + /* need stack monitor for single thread */ +#else ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); +#endif + + /* note wolfCrypt_Cleanup() should always be called when finished. + ** This is called at the end of wolf_test_task(); + */ + +#if defined(DEBUG_WOLFSSL) && defined(WOLFSSL_ESP32_CRYPT_RSA_PRI) + esp_hw_show_mp_metrics(); +#endif + +#ifdef INCLUDE_uxTaskGetStackHighWaterMark + ESP_LOGI(TAG, "Stack HWM: %d", uxTaskGetStackHighWaterMark(NULL)); + + ESP_LOGI(TAG, "Stack used: %d", CONFIG_ESP_MAIN_TASK_STACK_SIZE + - (uxTaskGetStackHighWaterMark(NULL))); +#endif + +#ifdef WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE + if (ret == 0) { + ESP_LOGI(TAG, WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE("Success!", ret)); + } + else { + ESP_LOGE(TAG, WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE("Failed!", ret)); + } +#elif defined(WOLFSSL_ESPIDF_EXIT_MESSAGE) + ESP_LOGI(TAG, WOLFSSL_ESPIDF_EXIT_MESSAGE); +#else + ESP_LOGI(TAG, "\n\nDone!\n\n" + "If running from idf.py monitor, press twice: Ctrl+]"); +#endif /* after the test, we'll just wait */ while (1) { - /* nothing */ + /* do something other than nothing to help next program/debug session*/ +#ifndef SINGLE_THREADED + vTaskDelay(1000); +#endif } #endif /* NO_CRYPT_BENCHMARK */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -#pragma once -/* benchmark main.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -void app_main(void); - -/* see wolfssl/wolfcrypt/benchmark/benchmark.h */ -extern void wolf_benchmark_task(); - - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/partitions_singleapp_large.csv mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/partitions_singleapp_large.csv --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/partitions_singleapp_large.csv 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/partitions_singleapp_large.csv 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,31 @@ +# to view: idf.py partition-table +# +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +phy_init,data, phy, 0xf000, 4K, +factory, app, factory, 0x10000, 1500K, + + +# For other settings, see: +# https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#creating-custom-tables +# +# Here is the summary printed for the "Single factory app, no OTA" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x6000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# +# +# Here is the summary printed for the "Factory app, two OTA definitions" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x4000, +# otadata, data, ota, 0xd000, 0x2000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# ota_0, app, ota_0, 0x110000, 1M, +# ota_1, app, ota_1, 0x210000, 1M, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/sdkconfig.defaults mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/sdkconfig.defaults --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/sdkconfig.defaults 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/sdkconfig.defaults 2024-08-03 07:30:00.000000000 +0000 @@ -1,34 +1,87 @@ +# Note that during the build process, settings from sdkconfig.defaults will not override those already in sdkconfig. +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#custom-sdkconfig-defaults CONFIG_BENCH_ARGV="-lng 0" CONFIG_FREERTOS_HZ=1000 CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y # -# Default main stack size +# Default main stack size. See user_settings.h # -# This is typically way bigger than needed for stack size. See user_settings.h -# -CONFIG_ESP_MAIN_TASK_STACK_SIZE=55500 +# For wolfSSL SMALL_STACK, 3072 bytes should be sufficient for benchmark app. +# When using RSA, assign at least 10500 bytes, otherwise 5500 usually works for others +CONFIG_ESP_MAIN_TASK_STACK_SIZE=10500 # Legacy stack size for older ESP-IDF versions -CONFIG_MAIN_TASK_STACK_SIZE=55500 +CONFIG_MAIN_TASK_STACK_SIZE=10500 # +# Benchmark must not have CONFIG_NEWLIB_NANO_FORMAT enabled +CONFIG_NEWLIB_NANO_FORMAT=n +# # Watchdog Timers # -# We don't want to have the watchdog timeout during tests +# We don't want to have the watchdog timeout during tests & benchmarks # CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n +# Panic & Watchdog +CONFIG_ESP_INT_WDT_TIMEOUT_MS=10000 +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +CONFIG_ESP_INT_WDT=n + +# ESP8266 WDT +# CONFIG_ESP_PANIC_PRINT_REBOOT is not set +CONFIG_ESP_PANIC_PRINT_REBOOT=n +CONFIG_ESP_PANIC_PRINT_HALT=y + +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=n + +# ESP8266 Memory +CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y +CONFIG_HEAP_DISABLE_IRAM=y + +# Performance +# CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# Set max COU frequency (falls back as needed for lower maximum) +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y + +# FreeRTOS ticks at 1ms interval +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=1000 # # Compiler options # CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set CONFIG_COMPILER_STACK_CHECK=y +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +# end of Compiler options + +# We don't know that the min is actually v2, +# but this is the earliest tested. +CONFIG_ESP32C3_REV_MIN_2=y # # Partition Table diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,11 +1,96 @@ +# wolfSSL Espressif Example Project CMakeLists.txt +# v1.0 +# # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.16) + +# The wolfSSL CMake file should be able to find the source code. +# Otherwise, assign an environment variable or set it here: +# +# set(WOLFSSL_ROOT "~/workspace/wolfssl-other-source") +# +# Optional WOLFSSL_CMAKE_SYSTEM_NAME detection to find +# USE_MY_PRIVATE_CONFIG path for my_private_config.h +# +# Expected path varies: +# +# WSL: /mnt/c/workspace +# Linux: ~/workspace +# Windows: C:\workspace +# +if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") +endif() +if(CMAKE_HOST_UNIX) + message("Detected UNIX") +endif() +if(APPLE) + message("Detected APPLE") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") +endif() +if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") +endif() +# End optional WOLFSSL_CMAKE_SYSTEM_NAME + +# This example uses an extra component for common functions such as Wi-Fi and Ethernet connection. +set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + +if (EXISTS "${PROTOCOL_EXAMPLES_DIR}") + message("Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") + set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR") +else() + message("NOT FOUND: PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") +endif() + +# Check that there are not conflicting wolfSSL components +# The ESP Registry Component will be in ./managed_components/wolfssl__wolfssl +# The local component wolfSSL directory will be in ./components/wolfssl +if( EXISTS "${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" AND EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl" ) + # These exclude statements don't seem to be honored by the $ENV{IDF_PATH}/tools/cmake/project.cmake' + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" EXCLUDE_FROM_ALL) + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl/include" EXCLUDE_FROM_ALL) + # So we'll error out and let the user decide how to proceed: + message(WARNING "\nFound wolfSSL components in\n" + "./managed_components/wolfssl__wolfssl\n" + "and\n" + "./components/wolfssl\n" + "in project directory: \n" + "${CMAKE_HOME_DIRECTORY}") + message(FATAL_ERROR "\nPlease use either the ESP Registry Managed Component or the wolfSSL component directory but not both.\n" + "If removing the ./managed_components/wolfssl__wolfssl directory, remember to also remove " + "or rename the idf_component.yml file typically found in ./main/") +else() + message(STATUS "No conflicting wolfSSL components found.") +endif() + -# (Not part of the boilerplate) # This example uses an extra component for common functions such as Wi-Fi and Ethernet connection. -# disable the following line if there isn't the directory -set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) +set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + +if (EXISTS "${PROTOCOL_EXAMPLES_DIR}") + message("Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") + set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR") +else() + message("NOT FOUND: PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") +endif() include($ENV{IDF_PATH}/tools/cmake/project.cmake) + project(wolfssl_client) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile 2024-08-03 07:30:00.000000000 +0000 @@ -1,12 +1,134 @@ +# ESP8266 Project Makefile for wolfssl_client # -# This is a project Makefile. It is assumed the directory this Makefile resides in is a -# project subdirectory. +# Copyright (C) 2006-2024 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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 of the License, or +# (at your option) any later version. +# +# wolfSSL 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA # +# +# This is a project Makefile. +# It is assumed the directory this Makefile resides in is a +# project subdirectory containing an entire project. +# +# Optional private config headers. Define environment variables +# to include various default header files that are typically +# not in a git path, and thus excluded from being checked in. +# +# Environment Variable Name | Header file name included +# ---------------------------------- | --------------------------------------- +# MY_PRIVATE_CONFIG (files detected / selected in header) +# USE_MY_PRIVATE_WSL_CONFIG /mnt/c/workspace/my_private_config.h +# USE_MY_PRIVATE_MAC_CONFIG ~/Documents/my_private_config.h +# USE_MY_PRIVATE_LINUX_CONFIG ~/workspace/my_private_config.h +# USE_MY_PRIVATE_WINDOWS_CONFIG /workspace/my_private_config.h +# +# PROJECT_NAME := wolfssl_client +MY_PRIVATE_CONFIG ?= n +USE_MY_PRIVATE_WSL_CONFIG ?= n +USE_MY_PRIVATE_MAC_CONFIG ?= n +USE_MY_PRIVATE_LINUX_CONFIG ?= n +USE_MY_PRIVATE_WINDOWS_CONFIG ?= n + +# Calling shell causes unintuitive error in Windows: +# OS := $(shell uname -s) +# +# But OS, or MY_PRIVATE_CONFIG should already be defined: +$(info ************* wolfssl_client *************) + +ifeq ($(MY_PRIVATE_CONFIG),y) + CFLAGS += -DMY_PRIVATE_CONFIG + $(info Enabled MY_PRIVATE_CONFIG") +endif + +# Check for Windows environment variable: USE_MY_PRIVATE_WINDOWS_CONFIG +ifeq ($(USE_MY_PRIVATE_WINDOWS_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := /workspace/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_WINDOWS_CONFIG + $(info Using private config file for: Windows) + endif +endif + +# Check for WSL environment variable: USE_MY_PRIVATE_WSL_CONFIG +ifeq ($(USE_MY_PRIVATE_WSL_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := /mnt/c/workspace/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_WSL_CONFIG + $(info Using private config file for: WSL) + endif +endif + +# Check for Linux environment variable: USE_MY_PRIVATE_LINUX_CONFIG +ifeq ($(USE_MY_PRIVATE_LINUX_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := ~/workspace/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_LINUX_CONFIG + $(info Using private config file for: Linux) + endif +endif + +# Check for Mac environment variable: USE_MY_PRIVATE_MAC_CONFIG +ifeq ($(USE_MY_PRIVATE_MAC_CONFIG),y) + # This hard coded MY_CONFIG_FILE value must match that in the header file. + MY_CONFIG_FILE := ~/Documents/my_private_config.h + ifeq ($(wildcard $(MY_CONFIG_FILE)),) + $(info File does not exist: $(MY_CONFIG_FILE)) + else + CFLAGS += -DUSE_MY_PRIVATE_MAC_CONFIG + $(info Using private config file for: Mac) + endif +endif + +ifneq ($(OS),MY_PRIVATE_CONFIG) + CFLAGS += -DMY_PRIVATE_CONFIG="$(MY_PRIVATE_CONFIG)" +else + ifeq ($(OS),Linux) + CFLAGS += -DOS_LINUX + endif + ifeq ($(OS),Windows_NT) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_WINDOWS + endif + ifeq ($(OS),Darwin) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_APPLE + endif + ifneq (,$(findstring MINGW,$(OS))) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_MINGW + endif + ifneq (,$(findstring CYGWIN,$(OS))) + CFLAGS += -DWOLFSSL_MAKE_SYSTEM_NAME_CYGWIN + endif +endif + +# It is essential that the build process sees the WOLFSSL_USER_SETTINGS CFLAGS += -DWOLFSSL_USER_SETTINGS -# if there isn't the directory, please disable the line below. + +# if directory not available, please disable the line below. EXTRA_COMPONENT_DIRS = $(IDF_PATH)/examples/common_components/protocol_examples_common +# The Standard Espressif IDF include: include $(IDF_PATH)/make/project.mk diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,58 @@ -#wolfSSL Example +# wolfSSL TLS Client Example + +This is the wolfSSL TLS Client demo, typically used with the [Espressif TLS Server](../wolfssl_server/README.md) +or the CLI [Server](https://github.com/wolfSSL/wolfssl/tree/master/examples/server). + +When using the CLI, see the [example parameters](/IDE/Espressif/ESP-IDF/examples#interaction-with-wolfssl-cli). + +For general information on [wolfSSL examples for Espressif](../README.md), see the +[README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. + +## Quick Start + +Use the [ESP-IDF](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html) +for ESP32 or [RTOS SDK](https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html) +for the ESP8266. + +Run `menuconfig` utility (`idf.py menuconfig` for ESP32 or `make menuconfig` for the ESP8266) +and set the various parameters for the target device, along with local WiFi settings: + +* Target Host: `CONFIG_WOLFSSL_TARGET_HOST` (The IP address of a listening server) +* Target Port: `CONFIG_WOLFSSL_TARGET_PORT` (Typically `11111`) +* Example WiFi SSID: `CONFIG_EXAMPLE_WIFI_SSID` (The WiFi that you want to connect to) +* Example WiFi Password: `CONFIG_EXAMPLE_WIFI_PASSWORD` (The WiFi password) + +The latest examples use makefiles that do not require local file copy installation of wolfSSL. + +Build and flash the software to see the example in action. + +## Quick Start with VisualGDB + +There are optional [VisualGDB](https://visualgdb.com/tutorials/esp8266/) project files in the +[VisualGDB](./VisualGDB) project subdirectory, and an ESP8266 project file in the project directory, +called `wolfssl_client_ESP8266.vgdbproj`. + +Open the VisualGDB Visual Studio Project file in the VisualGDB directory and click the "Start" button. +No wolfSSL setup is needed. You may need to adjust your specific COM port. The default is `COM19`. + +## Troubleshooting + +Weird results, odd messages, unexpected compiler errors? Manually delete the build directory and +any locally generated files (`sdkconfig`, `sdkconfig-debug`, etc.) and start over. + +The `build` directory is typically located in the root of the project directory: `[project]/build`. + + +Difficulty flashing: + +* Ensure the target device has a robust, stable, clean power supply. +* Check that quality USB cables are being used. +* Try lowering the flash baud rate in the `menuconfig`. The 115200 is typically reliable. +* Review board specifications: some require manual boot mode via on-board buttons. +* See [Espressif ESP Frequently Asked Questions](https://docs.espressif.com/projects/esp-faq/en/latest/esp-faq-en-master.pdf) + +## ESP-IDF Commandline v5.x -The Example contains of wolfSSL tls client demo. 1. `idf.py menuconfig` to config the project @@ -24,4 +76,142 @@ e.g. Launch ./examples/server/server -v 4 -b -i -d -See the README.md file in the upper level 'examples' directory for more information about examples. + +## VisualGDB for ESP8266 + +Reminder that we build with `make` and not `cmake` in VisualGDB. + +Build files will be created in `[project directory]\build` + +## ESP-IDF make Commandline (version 3.5 or earlier for the ESP8266) + +``` +export IDF_PATH=~/esp/ESP8266_RTOS_SDK + +``` + + +## ESP-IDF CMake Commandline (version 3.5 or earlier for the ESP8266) + +Build files will be created in `[project directory]\build\debug` + +``` +# Set your path to RTOS SDK, shown here for default from WSL with VisualGDB +WRK_IDF_PATH=/mnt/c/SysGCC/esp8266/rtos-sdk/v3.4 +# or +WRK_IDF_PATH=~/esp/ESP8266_RTOS_SDK + +# Setup the environment +. $WRK_IDF_PATH/export.sh + +# install as needed / prompted +/mnt/c/SysGCC/esp8266/rtos-sdk/v3.4/install.sh + +# Fetch wolfssl from GitHub if needed: +cd /workspace +git clone https://github.com/wolfSSL/wolfssl.git + +# change directory to wolfssl client example. +cd wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client + +# or for example, WSL with C:\workspace as home for git clones: +# cd /mnt/c/workspace/wolfssl-$USER/IDE/Espressif/ESP-IDF/examples/wolfssl_client + +# adjust settings as desired +idf.py menuconfig + + +idf.py build flash -p /dev/ttyS70 -b 115200 +idf.py monitor -p /dev/ttyS70 -b 74880 +``` + +## SM Ciphers + +(TODO coming soon) +See https://github.com/wolfSSL/wolfsm + +#### Working Linux Client to ESP32 Server Example: + +``` +./examples/client/client -h 192.168.1.37 -p 11111 -v 3 +``` + +```text +-c Certificate file, default ./certs/client-cert.pem +-k Key file, default ./certs/client-key.pem +-A Certificate Authority file, default ./certs/ca-cert.pem +``` + +Example client, with default certs explicitly given: + +```bash +./examples/client/client -h 192.168.1.37 -p 11111 -v 3 -c ./certs/client-cert.pem -k ./certs/client-key.pem -A ./certs/ca-cert.pem +``` + +Example client, with RSA 1024 certs explicitly given: + +``` +./examples/client/client -h 192.168.1.37 -p 11111 -v 3 -c ./certs/1024/client-cert.pem -k ./certs/1024/client-key.pem -A ./certs/1024/ca-cert.pem +``` + +Command: + +``` +cd /mnt/c/workspace/wolfssl-$USER/IDE/Espressif/ESP-IDF/examples/wolfssl_server +. /mnt/c/SysGCC/esp32/esp-idf/v5.1/export.sh +idf.py flash -p /dev/ttyS19 -b 115200 monitor +``` + +``` +cd /mnt/c/workspace/wolfssl-$USER + +./examples/client/client -h 192.168.1.108 -v 4 -l TLS_SM4_GCM_SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +``` + +Output: + +```text +SSL version is TLSv1.3 +SSL cipher suite is TLS_SM4_GCM_SM3 +SSL curve name is SM2P256V1 +I hear you fa shizzle! +``` + +#### Linux client to Linux server: + +``` +./examples/client/client -h 127.0.0.1 -v 4 -l ECDHE-ECDSA-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +./examples/server/server -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 -c ./certs/sm2/server-sm2.pem -k ./certs/sm2/server-sm2-priv.pem -A ./certs/sm2/client-sm2.pem -V +``` + + +#### Linux Client using Kyber to ESP32 Server + +``` +# Ensure build with Kyber enabled: +# ./configure --enable-kyber=all --enable-experimental && make + +./examples/client/client -h 192.168.1.38 -v 4 -l TLS_AES_128_GCM_SHA256 --pqc KYBER_LEVEL5 +``` + +#### ESP32 Client to WSL Linux Server + +In Windows Powershell, (elevated permissions) forward the port _after_ starting the listening server: + +```bash +netsh interface portproxy add v4tov4 listenport=11111 listenaddress=0.0.0.0 connectport=11111 connectaddress=127.0.0.1 +``` + +After the server exits, remove the port proxy forward: + +```bash +netsh interface portproxy delete v4tov4 listenport=11111 listenaddress=0.0.0.0 +``` + +For additional information, see [Accessing network applications with WSL](https://learn.microsoft.com/en-us/windows/wsl/networking). + + +## Additional Information + +See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README_server_sm.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README_server_sm.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README_server_sm.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/README_server_sm.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,512 @@ +# SM Cipher Notes + + +### Install SM +``` +cd /mnt/c/workspace/wolfsm-$USER +./install.sh ../wolfssl-$USER +``` + + +### Build Linux SM Examples +``` +./autogen.sh +./configure --enable-sm3 --enable-sm4-gcm --enable-sm2 \ + --enable-sm4-ecb --enable-sm4-cbc --enable-sm4-ctr \ + --enable-sm4-gcm --enable-sm4-ccm +make clean && make +``` + +### TLS 1.3 Server + +``` +./examples/server/server -v 4 -b -d -p 11111 -c ./certs/sm2/server-sm2.pem -k ./certs/sm2/server-sm2-priv.pem -A ./certs/sm2/client-sm2.pem -V +``` + +### TLS 1.3 Client + +``` +./examples/client/client -h 127.0.0.1 -v 4 -l TLS13-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +``` + +### TLS 1.2 Client to Local Linux Server + +``` +./examples/client/client -h 192.168.25.186 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 \ + -c ./certs/sm2/client-sm2.pem \ + -k ./certs/sm2/client-sm2-priv.pem \ + -A ./certs/sm2/root-sm2.pem -C +``` + +### TLS 1.2 Client to ESP32 Server + +``` +./examples/client/client -h 192.168.25.186 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 \ + -c ./certs/sm2/client-sm2.pem \ + -k ./certs/sm2/client-sm2-priv.pem \ + -A ./certs/sm2/root-sm2.pem -C +``` +### Others... + +``` +# Success: Linux Client to ESP32 Server TLS1.2 +./examples/client/client -h 192.168.1.113 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +./examples/client/client -h 192.168.1.113 -v 3 -l ECDHE-ECDSA-SM4-GCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +./examples/client/client -h 192.168.1.113 -v 3 -l ECDHE-ECDSA-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +# Success: Linux Client to ESP32 Server TLS1.3 + +# Reported as TLS_SM4_GCM_SM3, but parameter is TLS13-SM4-GCM-SM3 +./examples/client/client -h 192.168.1.113 -v 4 -l TLS13-SM4-GCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +# Reported as TLS-SM4-CCM-SM3, but parameter is TLS13-SM4-CCM-SM3 +./examples/client/client -h 192.168.1.113 -v 4 -l TLS13-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +./examples/client/client -h 192.168.1.113 -v 4 -l TLS13-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +``` + +``` +ESP32-to-ESP32 +TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 +TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 +TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 +``` + +Tried both PEM and DER format. + +The latest server is PEM format, triple-checked to have the embedded server +be the same as the Linux server files. + + +| Usage | Certificate | Key | Certificate Authority file, default ./certs/client-cert.pem | +| ----- | ---------------------------------- | ----------------------------------- | --------------------------------- | +| server | -c ./certs/sm2/server-sm2.pem | -k ./certs/sm2/server-sm2-priv.pem | -A ./certs/sm2/client-sm2.pem -V | +| client | -c ./certs/sm2/client-sm2.pem | -k ./certs/sm2/client-sm2-priv.pem | -A ./certs/sm2/root-sm2.pem -C | +| emdedded: +| server | wolfSSL_CTX_use_certificate_buffer
server_sm2 | wolfSSL_CTX_use_PrivateKey_buffer
server_sm2_priv | wolfSSL_CTX_load_verify_buffer
client-sm2 | + +### Code + +See [source code](https://github.com/gojimmypi/wolfssl/blob/2c4f443aec7b151f945cb9dfe2dad6ee30449cf0/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c#L187): + +![code](./code.png) + + +### Linux client talking to embedded server: + +``` +/examples/client/client -h 192.168.1.108 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +wolfSSL_connect error -188, ASN no signer error to confirm failure +wolfSSL error: wolfSSL_connect failed +``` + +Output: +``` +ets Jul 29 2019 12:21:46 + +rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) +configsip: 0, SPIWP:0xee +clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 +mode:DIO, clock div:2 +load:0x3fff0030,len:7000 +load:0x40078000,len:15452 +ho 0 tail 12 room 4 +load:0x40080400,len:3840 +entry 0x4008064c +I (29) boot: ESP-IDF v5.0-dirty 2nd stage bootloader +I (29) boot: compile time 13:40:31 +I (29) boot: chip revision: v3.0 +I (32) boot_comm: chip revision: 3, min. bootloader chip revision: 0 +I (39) boot.esp32: SPI Speed : 40MHz +I (44) boot.esp32: SPI Mode : DIO +I (48) boot.esp32: SPI Flash Size : 2MB +I (53) boot: Enabling RNG early entropy source... +I (58) boot: Partition Table: +I (62) boot: ## Label Usage Type ST Offset Length +I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000 +I (77) boot: 1 phy_init RF data 01 01 0000f000 00001000 +I (84) boot: 2 factory factory app 00 00 00010000 00177000 +I (92) boot: End of partition table +I (96) boot_comm: chip revision: 3, min. application chip revision: 0 +I (103) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=338d8h (211160) map +I (188) esp_image: segment 1: paddr=00043900 vaddr=3ffb0000 size=03b78h ( 15224) load +I (194) esp_image: segment 2: paddr=00047480 vaddr=40080000 size=08b98h ( 35736) load +I (209) esp_image: segment 3: paddr=00050020 vaddr=400d0020 size=c591ch (809244) map +I (501) esp_image: segment 4: paddr=00115944 vaddr=40088b98 size=0c230h ( 49712) load +I (522) esp_image: segment 5: paddr=00121b7c vaddr=50000000 size=00010h ( 16) load +I (533) boot: Loaded app from partition at offset 0x10000 +I (533) boot: Disabling RNG early entropy source... +I (545) cpu_start: Pro cpu up. +I (545) cpu_start: Starting app cpu, entry point is 0x400812f4 +I (532) cpu_start: App cpu up. +I (561) cpu_start: Pro cpu start user code +I (561) cpu_start: cpu freq: 160000000 Hz +I (561) cpu_start: Application information: +I (566) cpu_start: Project name: wolfssl_server +I (571) cpu_start: App version: v5.6.3-stable-1088-g560c84b2b-d +I (578) cpu_start: Compile time: Jul 19 2023 22:20:09 +I (585) cpu_start: ELF file SHA256: 3e6e571c9e87bf44... +I (591) cpu_start: ESP-IDF: v5.0-dirty +I (596) heap_init: Initializing. RAM available for dynamic allocation: +I (603) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM +I (609) heap_init: At 3FFBDA68 len 00022598 (137 KiB): DRAM +I (615) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM +I (622) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM +I (628) heap_init: At 40094DC8 len 0000B238 (44 KiB): IRAM +I (636) spi_flash: detected chip: generic +I (639) spi_flash: flash io: dio +W (643) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the +size in the binary image header. +I (657) cpu_start: Starting scheduler on PRO CPU. +I (0) cpu_start: Starting scheduler on APP CPU. +I (725) tls_server: ESP_WIFI_MODE_STA +I (735) wifi:wifi driver task: 3ffcb738, prio:23, stack:6656, core=0 +I (735) system_api: Base MAC address is not set +I (735) system_api: read default base MAC address from EFUSE +I (755) wifi:wifi firmware version: 0d470ef +I (755) wifi:wifi certification version: v7.0 +I (755) wifi:config NVS flash: enabled +I (755) wifi:config nano formating: disabled +I (755) wifi:Init data frame dynamic rx buffer num: 32 +I (765) wifi:Init management frame dynamic rx buffer num: 32 +I (765) wifi:Init management short buffer num: 32 +I (775) wifi:Init dynamic tx buffer num: 32 +I (775) wifi:Init static rx buffer size: 1600 +I (775) wifi:Init static rx buffer num: 10 +I (785) wifi:Init dynamic rx buffer num: 32 +I (785) wifi_init: rx ba win: 6 +I (795) wifi_init: tcpip mbox: 32 +I (795) wifi_init: udp mbox: 6 +I (795) wifi_init: tcp mbox: 6 +I (805) wifi_init: tcp tx win: 5744 +I (805) wifi_init: tcp rx win: 5744 +I (815) wifi_init: tcp mss: 1440 +I (815) wifi_init: WiFi IRAM OP enabled +I (815) wifi_init: WiFi RX IRAM OP enabled +I (825) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07 +I (925) wifi:mode : sta (24:d7:eb:41:7b:68) +I (935) wifi:enable tsf +I (935) tls_server: wifi_init_sta finished. +I (945) wifi:new:<4,0>, old:<1,0>, ap:<255,255>, sta:<4,0>, prof:1 +I (945) wifi:state: init -> auth (b0) +I (945) wifi:state: auth -> assoc (0) +I (955) wifi:state: assoc -> run (10) +W (955) wifi:idx:0 (ifx:0, c8:d7:19:cd:00:17), tid:0, ssn:0, winSize:64 +I (985) wifi:connected with testbench, aid = 1, channel 4, BW20, bssid = c8:d7:19:cd:00:17 +I (985) wifi:security: WPA2-PSK, phy: bgn, rssi: -45 +I (995) wifi:pm start, type: 1 + +I (1065) wifi:AP's beacon interval = 102400 us, DTIM period = 1 +I (3225) esp_netif_handlers: sta ip: 192.168.1.108, mask: 255.255.255.0, gw: 192.168.1.10 +I (3225) tls_server: got ip:192.168.1.108 +I (3235) Time Helper: sntp_setservername: +I (3235) Time Helper: pool.ntp.org +I (3245) Time Helper: time.nist.gov +I (3245) Time Helper: utcnist.colorado.edu +I (3255) Time Helper: sntp_init done. +TLS13-AES128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:TLS13-SM4-GCM-SM3:TLS13-SM4-CCM-SM3:ECDHE-RSA-AES12 +8-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDS +A-DES-CBC3-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECD +SA-AES128-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-OLD +:ECDHE-ECDSA-CHACHA20-POLY1305-OLD:ECDHE-ECDSA-SM4-CBC-SM3:ECDHE-ECDSA-SM4-GCM-SM3:ECDHE-ECDSA-SM4-CCM-SM3 +:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-GCM-SHA256:PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305 +I (3315) wolfssl: Start wolfSSL_Init() +I (3315) wolfssl: wolfSSL Entering wolfSSL_Init +I (3325) wolfssl: wolfSSL Entering wolfCrypt_Init +I (3325) wolfssl: start socket()) +I (3335) wolfssl: Create and initialize WOLFSSL_CTX +I (3335) wolfssl: wolfSSL Entering wolfSSLv23_server_method_ex +I (3345) wolfssl: wolfSSL Entering wolfSSL_CTX_new_ex +I (3345) wolfssl: wolfSSL Entering wolfSSL_CertManagerNew +I (3355) wolfssl: wolfSSL Leaving wolfSSL_CTX_new_ex, return 0 +I (3365) tls_server: Start SM2 + +I (3365) wolfssl: wolfSSL Entering wolfSSL_CTX_set_cipher_list +I (3375) tls_server: Set cipher list: ECDHE-ECDSA-SM4-CBC-SM3 + +TLS13-AES128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:TLS13-SM4-GCM-SM3:TLS13-SM4-CCM-SM3:ECDHE-RSA-AES12 +8-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDS +A-DES-CBC3-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECD +SA-AES128-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-OLD +:ECDHE-ECDSA-CHACHA20-POLY1305-OLD:ECDHE-ECDSA-SM4-CBC-SM3:ECDHE-ECDSA-SM4-GCM-SM3:ECDHE-ECDSA-SM4-CCM-SM3 +:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-GCM-SHA256:PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305 +I (3435) wolfssl: Loading certificate... +I (3435) wolfssl: wolfSSL Entering wolfSSL_CTX_use_certificate_buffer +I (3445) wolfssl: wolfSSL Entering PemToDer +I (3455) wolfssl: Checking cert signature type +I (3455) wolfssl: wolfSSL Entering GetExplicitVersion +I (3465) wolfssl: wolfSSL Entering wc_GetSerialNumber +I (3465) wolfssl: Got Cert Header +I (3475) wolfssl: wolfSSL Entering GetObjectId +I (3475) wolfssl: Got Algo ID +I (3475) wolfssl: Getting Name +I (3485) wolfssl: Getting Cert Name +I (3485) wolfssl: Getting Name +I (3495) wolfssl: Getting Cert Name +I (3495) wolfssl: Got Subject Name +I (3495) wolfssl: wolfSSL Entering GetAlgoId +I (3505) wolfssl: wolfSSL Entering GetObjectId +I (3505) wolfssl: wolfSSL Entering GetObjectId +I (3515) wolfssl: Got Key +I (3515) wolfssl: ECDSA/ED25519/ED448 cert signature +I (3525) wolfssl: wolfSSL Leaving wolfSSL_CTX_use_certificate_buffer, return 1 +I (3535) tls_server: Loaded server_sm2 + +I (3535) wolfssl: Loading key info... +I (3535) wolfssl: wolfSSL Entering wolfSSL_CTX_use_PrivateKey_buffer +I (3545) wolfssl: wolfSSL Entering PemToDer +I (3555) wolfssl: wolfSSL Entering GetAlgoId +I (3555) wolfssl: wolfSSL Entering GetObjectId +I (3565) wolfssl: wolfSSL Entering GetAlgoId +I (3565) wolfssl: wolfSSL Entering GetObjectId +I (3575) wolfssl: wolfSSL Leaving wolfSSL_CTX_use_PrivateKey_buffer, return 1 +I (3575) tls_server: Loaded PrivateKey_buffer server_sm2_priv + +I (3585) wolfssl: wolfSSL Entering wolfSSL_CTX_load_verify_buffer_ex +I (3595) wolfssl: Processing CA PEM file +I (3595) wolfssl: wolfSSL Entering PemToDer +I (3605) wolfssl: Adding a CA +I (3605) wolfssl: wolfSSL Entering GetExplicitVersion +I (3615) wolfssl: wolfSSL Entering wc_GetSerialNumber +I (3615) wolfssl: Got Cert Header +I (3625) wolfssl: wolfSSL Entering GetObjectId +I (3625) wolfssl: Got Algo ID +I (3635) wolfssl: Getting Name +I (3635) wolfssl: Getting Cert Name +I (3635) wolfssl: Getting Name +I (3645) wolfssl: Getting Cert Name +I (3645) wolfssl: Got Subject Name +I (3655) wolfssl: wolfSSL Entering GetAlgoId +I (3655) wolfssl: wolfSSL Entering GetObjectId +I (3665) wolfssl: wolfSSL Entering GetObjectId +I (3665) wolfssl: Got Key +I (3665) wolfssl: Parsed Past Key +I (3675) wolfssl: wolfSSL Entering DecodeCertExtensions +I (3675) wolfssl: wolfSSL Entering GetObjectId +I (3685) wolfssl: wolfSSL Entering DecodeSubjKeyId +I (3685) wolfssl: wolfSSL Entering GetObjectId +I (3695) wolfssl: wolfSSL Entering DecodeAuthKeyId +I (3705) wolfssl: wolfSSL Entering GetObjectId +I (3705) wolfssl: wolfSSL Entering DecodeBasicCaConstraint +I (3715) wolfssl: wolfSSL Entering GetObjectId +I (3715) wolfssl: wolfSSL Entering DecodeAltNames +I (3725) wolfssl: Unsupported name type, skipping +I (3725) wolfssl: wolfSSL Entering GetObjectId +I (3735) wolfssl: wolfSSL Entering DecodeExtKeyUsage +I (3735) wolfssl: wolfSSL Entering GetObjectId +I (3745) wolfssl: wolfSSL Entering GetObjectId +I (3745) wolfssl: wolfSSL Entering GetObjectId +I (3755) wolfssl: Parsed new CA +I (3755) wolfssl: No key size check done on CA +I (3765) wolfssl: Freeing Parsed CA +I (3765) wolfssl: Freeing der CA +I (3775) wolfssl: OK Freeing der CA +I (3775) wolfssl: wolfSSL Leaving AddCA, return 0 +I (3785) wolfssl: Processed a CA +I (3785) wolfssl: Processed at least one valid CA. Other stuff OK +I (3795) wolfssl: wolfSSL Leaving wolfSSL_CTX_load_verify_buffer_ex, return 1 +I (3795) tls_server: Success: load verify buffer + +I (3805) tls_server: Finish SM2 + +I (3805) tls_server: accept clients... +I (3815) wolfssl: Waiting for a connection... +I (14485) wolfssl: wolfSSL Entering wolfSSL_new +I (14495) wolfssl: wolfSSL Entering ReinitSSL +I (14495) wolfssl: wolfSSL Entering SetSSL_CTX +I (14495) wolfssl: wolfSSL Entering wolfSSL_NewSession +I (14505) wolfssl: wolfSSL Leaving wolfSSL_new, return 0 +I (14505) wolfssl: wolfSSL Entering wolfSSL_set_fd +I (14515) wolfssl: wolfSSL Entering wolfSSL_set_read_fd +I (14515) wolfssl: wolfSSL Leaving wolfSSL_set_read_fd, return 1 +I (14525) wolfssl: wolfSSL Entering wolfSSL_set_write_fd +I (14535) wolfssl: wolfSSL Leaving wolfSSL_set_write_fd, return 1 +I (14535) wolfssl: wolfSSL Entering wolfSSL_accept +I (14545) wolfssl: wolfSSL Entering ReinitSSL +I (14545) wolfssl: growing input buffer +I (14555) wolfssl: received record layer msg +I (14555) wolfssl: got HANDSHAKE +I (14565) wolfssl: wolfSSL Entering wolfSSL_get_options +I (14565) wolfssl: wolfSSL Entering DoTls13HandShakeMsg +I (14575) wolfssl: wolfSSL Entering DoTls13HandShakeMsgType +I (14575) wolfssl: processing client hello +I (14585) wolfssl: wolfSSL Entering DoTls13ClientHello +I (14595) wolfssl: wolfSSL Entering DoClientHello +I (14595) wolfssl: downgrading to TLSv1.2 +I (14605) wolfssl: Matched No Compression +I (14605) wolfssl: Adding signature algorithms extension +I (14615) wolfssl: Signature Algorithms extension received +I (14615) wolfssl: Point Formats extension received +I (14625) wolfssl: Supported Groups extension received +I (14625) wolfssl: Unknown TLS extension type +I (14635) wolfssl: Unknown TLS extension type +I (14635) wolfssl: wolfSSL Entering MatchSuite +I (14645) wolfssl: wolfSSL Entering VerifyServerSuite +I (14645) wolfssl: Requires ECC +I (14655) wolfssl: Verified suite validity +I (14655) wolfssl: wolfSSL Leaving DoClientHello, return 0 +I (14665) wolfssl: wolfSSL Leaving DoTls13ClientHello, return 0 +I (14675) wolfssl: wolfSSL Leaving DoTls13HandShakeMsgType(), return 0 +I (14675) wolfssl: wolfSSL Leaving DoTls13HandShakeMsg, return 0 +I (14685) wolfssl: Shrinking input buffer +I (14685) wolfssl: accept state ACCEPT_CLIENT_HELLO_DONE +I (14695) wolfssl: accept state ACCEPT_FIRST_REPLY_DONE +I (14705) wolfssl: wolfSSL Entering SendServerHello +I (14705) wolfssl: growing output buffer +I (14715) internal.c: GrowOutputBuffer ok +I (14715) wolfssl: wolfSSL Entering wolfSSL_get_options +I (14725) wolfssl: Point Formats extension to write +W (14735) wolfio: ssl->wflags = 0 +I (14735) wolfio: 16 03 03 00 52 02 00 00 4e 03 03 af 87 e2 58 57 +I (14735) wolfio: 73 c3 c1 35 1a 59 39 b2 03 9d 14 03 e0 b8 fb e8 +I (14745) wolfio: 9d 5b 9c 44 4f 57 4e 47 52 44 01 20 85 77 75 20 +I (14755) wolfio: 95 dd 00 e2 91 f8 42 33 f8 61 3f 1f de 81 15 58 +I (14755) wolfio: 23 0c e7 1e 71 e6 10 e5 67 23 e0 40 e0 11 00 00 +I (14765) wolfio: 06 00 0b 00 02 01 00 +W (14775) wolfio: sz = 87 +I (14775) wolfssl: Shrinking output buffer +I (14775) wolfssl: wolfSSL Leaving SendServerHello, return 0 +I (14785) wolfssl: accept state SERVER_HELLO_SENT +I (14795) wolfssl: wolfSSL Entering SendCertificate +I (14795) wolfssl: growing output buffer +I (14805) internal.c: GrowOutputBuffer ok +W (14815) wolfio: ssl->wflags = 0 +I (14815) wolfio: 16 03 03 02 e6 0b 00 02 e2 00 02 df 00 02 dc 30 +I (14815) wolfio: 82 02 d8 30 82 02 7e a0 03 02 01 02 02 01 01 30 +I (14825) wolfio: 0a 06 08 2a 81 1c cf 55 01 83 75 30 81 ac 31 0b +I (14835) wolfio: 30 09 06 03 55 04 06 13 02 55 53 31 10 30 0e 06 +I (14835) wolfio: 03 55 04 08 0c 07 4d 6f 6e 74 61 6e 61 31 10 30 +I (14845) wolfio: 0e 06 03 55 04 07 0c 07 42 6f 7a 65 6d 61 6e 31 +I (14855) wolfio: 14 30 12 06 03 55 04 0a 0c 0b 77 6f 6c 66 53 53 +I (14855) wolfio: 4c 5f 73 6d 32 31 0f 30 0d 06 03 55 04 0b 0c 06 +I (14865) wolfio: 43 41 2d 73 6d 32 31 18 30 16 06 03 55 04 03 0c +I (14875) wolfio: 0f 77 77 77 2e 77 6f 6c 66 73 73 6c 2e 63 6f 6d +I (14875) wolfio: 31 1f 30 1d 06 09 2a 86 48 86 f7 0d 01 09 01 16 +I (14885) wolfio: 10 69 6e 66 6f 40 77 6f 6c 66 73 73 6c 2e 63 6f +I (14895) wolfio: 6d 31 17 30 15 06 0a 09 92 26 89 93 f2 2c 64 01 +I (14895) wolfio: 01 0c 07 77 6f 6c 66 53 53 4c 30 1e 17 0d 32 33 +I (14905) wolfio: 30 32 31 35 30 36 32 33 30 37 5a 17 0d 32 35 31 +I (14915) wolfio: 31 31 31 30 36 32 33 30 37 5a 30 81 b0 31 0b 30 +I (14915) wolfio: 09 06 03 55 04 06 13 02 55 53 31 10 30 0e 06 03 +I (14925) wolfio: 55 04 08 0c 07 4d 6f 6e 74 61 6e 61 31 10 30 0e +I (14935) wolfio: 06 03 55 04 07 0c 07 42 6f 7a 65 6d 61 6e 31 14 +I (14945) wolfio: 30 12 06 03 55 04 0a 0c 0b 77 6f 6c 66 53 53 4c +I (14945) wolfio: 5f 73 6d 32 31 13 30 11 06 03 55 04 0b 0c 0a 53 +I (14955) wolfio: 65 72 76 65 72 2d 73 6d 32 31 18 30 16 06 03 55 +I (14965) wolfio: 04 03 0c 0f 77 77 77 2e 77 6f 6c 66 73 73 6c 2e +I (14965) wolfio: 63 6f 6d 31 1f 30 1d 06 09 2a 86 48 86 f7 0d 01 +I (14975) wolfio: 09 01 16 10 69 6e 66 6f 40 77 6f 6c 66 73 73 6c +I (14985) wolfio: 2e 63 6f 6d 31 17 30 15 06 0a 09 92 26 89 93 f2 +I (14985) wolfio: 2c 64 01 01 0c 07 77 6f 6c 66 53 53 4c 30 5a 30 +I (14995) wolfio: 14 06 08 2a 81 1c cf 55 01 82 2d 06 08 2a 81 1c +I (15005) wolfio: cf 55 01 82 2d 03 42 00 04 94 70 2b 46 e4 5e 0f +I (15005) wolfio: 41 fb 8f 2d 34 0a 41 40 19 5e fb d4 1d 11 ac fa +I (15015) wolfio: f5 93 37 c6 fa 87 08 f7 16 1f 2c ce 30 40 9d 4f +I (15025) wolfio: a6 2a 0a a1 d6 95 33 c3 a6 03 98 e6 8d 05 34 b0 +I (15025) wolfio: 97 0c de a4 c7 cf 53 8f d1 a3 81 89 30 81 86 30 +I (15035) wolfio: 1d 06 03 55 1d 0e 04 16 04 14 67 ae 60 ff 7e 1b +I (15045) wolfio: 0f 95 ae 1f 82 59 f2 6c 56 2d 93 ef 17 32 30 1f +I (15045) wolfio: 06 03 55 1d 23 04 18 30 16 80 14 47 0a 48 7e bb +I (15055) wolfio: 02 a8 5a 26 57 2b 19 a9 7b 61 8b 7f 5d 99 6e 30 +I (15065) wolfio: 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 0e 06 +I (15075) wolfio: 03 55 1d 0f 01 01 ff 04 04 03 02 03 a8 30 13 06 +I (15075) wolfio: 03 55 1d 25 04 0c 30 0a 06 08 2b 06 01 05 05 07 +I (15085) wolfio: 03 01 30 11 06 09 60 86 48 01 86 f8 42 01 01 04 +I (15095) wolfio: 04 03 02 06 40 30 0a 06 08 2a 81 1c cf 55 01 83 +I (15095) wolfio: 75 03 48 00 30 45 02 20 1b ca 94 28 7f f6 b2 0d +I (15105) wolfio: 31 43 50 e1 d5 34 17 dd af 3a de 81 06 67 9a b3 +I (15115) wolfio: 06 22 7e 64 ec fd 0e b9 02 21 00 a1 48 a8 32 d1 +I (15115) wolfio: 05 09 6b 1c eb 89 12 66 d8 38 a1 c4 5c 89 09 0f +I (15125) wolfio: fd e9 c0 3b 1d fb cd b5 4c 31 68 +W (15135) wolfio: sz = 747 +I (15135) wolfssl: Shrinking output buffer +I (15135) wolfssl: wolfSSL Leaving SendCertificate, return 0 +I (15145) wolfssl: accept state CERT_SENT +I (15155) wolfssl: wolfSSL Entering SendCertificateStatus +I (15155) wolfssl: wolfSSL Leaving SendCertificateStatus, return 0 +I (15165) wolfssl: accept state CERT_STATUS_SENT +I (15165) wolfssl: wolfSSL Entering SendServerKeyExchange +I (15175) wolfssl: Using ephemeral ECDH +I (15175) wolfssl: wolfSSL Entering EccMakeKey +I (15535) wolfssl: wolfSSL Leaving EccMakeKey, return 0 +I (15535) wolfssl: Trying ECC private key, RSA didn't work +I (15535) wolfssl: wolfSSL Entering GetAlgoId +I (15545) wolfssl: wolfSSL Entering GetObjectId +I (15555) wolfssl: Using ECC private key +I (15555) wolfssl: wolfSSL Entering Sm2wSm3Sign +I (15915) wolfssl: wolfSSL Leaving Sm2wSm3Sign, return 0 +I (15915) wolfssl: wolfSSL Entering SendHandshakeMsg +I (15925) wolfssl: growing output buffer +I (15925) internal.c: GrowOutputBuffer ok +W (15925) wolfio: ssl->wflags = 0 +I (15935) wolfio: 16 03 03 00 95 0c 00 00 91 03 00 29 41 04 fd f5 +I (15935) wolfio: 5e 74 15 30 1d f3 84 ae a5 69 96 a9 5b dd 27 b3 +I (15945) wolfio: 00 7d 40 3a 59 93 93 6f 4d 1f 62 dc 60 48 34 1f +I (15955) wolfio: a8 1d 34 b8 76 8f 8b 27 4a 1b 77 64 8e 2e d5 27 +I (15955) wolfio: 03 95 8b 9d a5 ed a4 a6 b9 40 1b ea aa 10 07 08 +I (15965) wolfio: 00 48 30 46 02 21 00 cb 89 61 e9 21 f9 c6 4d ad +I (15975) wolfio: aa e7 f1 3f 6f 27 46 f0 35 ec 45 4e 8a ae f3 ac +I (15985) wolfio: 7c c0 cf 68 11 44 e2 02 21 00 f6 40 5c bc 66 5a +I (15985) wolfio: 74 1e 92 5d 9a 03 75 e7 7f 16 c2 b3 c8 fe 8d 5c +I (15995) wolfio: 63 35 36 da 61 38 76 dc 4e d6 +W (15995) wolfio: sz = 154 +I (16005) wolfssl: Shrinking output buffer +I (16005) wolfssl: wolfSSL Leaving SendServerKeyExchange, return 0 +I (16015) wolfssl: accept state KEY_EXCHANGE_SENT +I (16025) wolfssl: accept state CERT_REQ_SENT +I (16025) wolfssl: wolfSSL Entering SendServerHelloDone +I (16035) wolfssl: growing output buffer +I (16035) internal.c: GrowOutputBuffer ok +W (16045) wolfio: ssl->wflags = 0 +I (16045) wolfio: 16 03 03 00 04 0e 00 00 00 +W (16045) wolfio: sz = 9 +I (16055) wolfssl: Embed Send error +I (16055) wolfssl: Connection reset +I (16065) int: Sent = -3 +W (16065) int: WOLFSSL_CBIO_ERR_CONN_RST +E (16075) int: SOCKET_ERROR_E 2 +I (16075) wolfssl: wolfSSL Leaving SendServerHelloDone, return -308 +I (16085) wolfssl: wolfSSL error occurred, error = -308 +I (16085) wolfssl: wolfSSL Entering wolfSSL_get_error +I (16095) wolfssl: wolfSSL Leaving wolfSSL_get_error, return -308 +E (16085) tls_server: wolfSSL_accept error -308 +I (16105) wolfssl: Client connected successfully +I (16105) wolfssl: wolfSSL Entering wolfSSL_read +I (16115) wolfssl: wolfSSL Entering wolfSSL_read_internal +I (16125) wolfssl: wolfSSL Entering ReceiveData +I (16125) wolfssl: User calling wolfSSL_read in error state, not allowed +I (16135) wolfssl: wolfSSL Leaving wolfSSL_read_internal, return -308 +E (16145) tls_server: ERROR: failed to read +I (16145) wolfssl: Client sends: +I (16145) wolfssl: +I (16155) wolfssl: wolfSSL Entering wolfSSL_write +I (16155) wolfssl: handshake not complete, trying to finish +I (16165) wolfssl: wolfSSL Entering wolfSSL_negotiate +I (16165) wolfssl: wolfSSL Entering wolfSSL_accept +I (16175) wolfssl: wolfSSL Entering ReinitSSL +W (16185) wolfio: ssl->wflags = 0 +I (16185) wolfio: 16 03 03 00 04 0e 00 00 00 +W (16185) wolfio: sz = 9 +I (16195) wolfssl: Embed Send error +I (16195) wolfssl: General error +I (16205) int: Sent = -1 +E (16205) int: SOCKET_ERROR_E +I (16205) wolfssl: wolfSSL error occurred, error = -308 +I (16215) wolfssl: wolfSSL Leaving wolfSSL_negotiate, return -1 +I (16225) wolfssl: wolfSSL Leaving wolfSSL_write, return -1 +E (16225) tls_server: ERROR: failed to write +I (16235) wolfssl: wolfSSL Entering wolfSSL_free +I (16235) wolfssl: Free'ing server ssl +I (16245) wolfssl: Shrinking output buffer +I (16245) wolfssl: wolfSSL Entering ClientSessionToSession +I (16255) wolfssl: wolfSSL Entering wolfSSL_FreeSession +I (16255) wolfssl: wolfSSL_FreeSession full free +I (16265) wolfssl: CTX ref count not 0 yet, no free +I (16265) wolfssl: wolfSSL Leaving wolfSSL_free, return 0 +I (16275) wolfssl: Waiting for a connection... +``` + +### Wireshark: + +![wireshark](./wireshark.png) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,52 @@ +# wolfSSL Project Files for Visual Studio 2022 with VisualGDB Extension + +Include in the respective project `./VisualGDB` directory are [VisualGDB](https://visualgdb.com/) project files. +Individual project files are included for convenience to new users, as there are [difficulties switching between ESP-IDF Versions or Chipsets](https://sysprogs.com/w/forums/topic/difficulties-switching-espressif-esp-idf-version-or-chipset/) using the VisualGDB extension. + +The naming convention for project files is: `[project name]_IDF_[Version]_[chipset].vgdbproj`. The solution files (filename[.sln]) often will contain shortcuts to commonly used source and configuration files used by the respective project. + + +-------- |------------- |------------- | +ChipSet | ESP-IDF v4.4 | ESP-IDF v5.0 | +-------- |------------- |------------- | +ESP32 | x | | +ESP32-S2 | | | +ESP32-S3 | x | x | +ESP32-C3 | x | x | +ESP32-C6 | | | + + +The default directories are: + +- `C:\SysGCC` - The root directory install of VisualGDB +- `C:\SysGCC\esp32` - The default for ESP-IDF v5.x +- `C:\SysGCC\esp32-8.4` - Many need to manually select this name for ESP-IDF v4.x install +- `C:\SysGCC\esp8266`- The default for ESP8266 + +## Resources + +- [wolfSSL Website](https://www.wolfssl.com/) + +- [wolfSSL Wiki](https://github.com/wolfSSL/wolfssl/wiki) + +- [FIPS 140-2/140-3 FAQ](https://wolfssl.com/license/fips) + +- [wolfSSL Documentation](https://wolfssl.com/wolfSSL/Docs.html) + +- [wolfSSL Manual](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-toc.html) + +- [wolfSSL API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-17-wolfssl-api-reference.html) + +- [wolfCrypt API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-18-wolfcrypt-api-reference.html) + +- [TLS 1.3](https://www.wolfssl.com/docs/tls13/) + +- [wolfSSL Vulnerabilities](https://www.wolfssl.com/docs/security-vulnerabilities/) + +- [Additional wolfSSL Examples](https://github.com/wolfssl/wolfssl-examples) + +## Support + +For questions please email [support@wolfssl.com](mailto:support@wolfssl.com) + +<-- edit 5.6.0001 see https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB --> diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.sln mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.sln --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.sln 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.33027.164 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{803FD0C6-D64E-4E16-9DC3-1DAEC859A3D2}") = "VisualGDB_wolfssl_client", "VisualGDB_wolfssl_client.vgdbproj", "{E903E9CC-1A23-4B00-8914-7E45EC21E351}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|VisualGDB = Debug|VisualGDB - Release|VisualGDB = Release|VisualGDB - Tests (Debug)|VisualGDB = Tests (Debug)|VisualGDB - Tests (Release)|VisualGDB = Tests (Release)|VisualGDB - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Debug|VisualGDB.ActiveCfg = Debug|VisualGDB - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Debug|VisualGDB.Build.0 = Debug|VisualGDB - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Release|VisualGDB.ActiveCfg = Release|VisualGDB - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Release|VisualGDB.Build.0 = Release|VisualGDB - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Debug)|VisualGDB.ActiveCfg = Tests (Debug)|VisualGDB - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Debug)|VisualGDB.Build.0 = Tests (Debug)|VisualGDB - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Release)|VisualGDB.ActiveCfg = Tests (Release)|VisualGDB - {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Release)|VisualGDB.Build.0 = Tests (Release)|VisualGDB - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D510376F-F313-4EF6-8EF5-248D1949DFEB} - EndGlobalSection -EndGlobal diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.vgdbproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.vgdbproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,269 +0,0 @@ - - - - - - Unknown - - true - - bdbba681-1213-45f8-a44e-4652fe489fe3 - true - true - SourceDirs - - - - - - com.visualgdb.xtensa-esp32-elf - - 11.2.0 - 9.2.90 - 2 - - - .. - DEBUG - build/$(PlatformName)/$(ConfigurationName) - - false - $(ToolchainNinja) - $(BuildDir) - - - - false - $(SYSPROGS_CMAKE_PATH) - - - true - false - false - Ninja - false - RemoveBuildDirectory - false - - - true - true - true - false - true - false - true - HideOuterProjectTargets - true - false - true - - - true - e903e9cc-1a23-4b00-8914-7e45ec21e351 - - Upper - HeaderDirectoryAndSubdirectories - true - - - release/v5.0 - esp-idf/v5.0 - ESPIDF - - COM20 - false - false - ESP32 - - - - - - - - - - - - - - - Default - - - - COM20 - - 115200 - 8 - None - One - None - - - 0 - false - false - false - ASCII - - - 255 - 0 - 0 - 0 - - - 255 - 169 - 169 - 169 - - - 255 - 211 - 211 - 211 - - - 255 - 144 - 238 - 144 - - - 255 - 169 - 169 - 169 - - - - 16 - true - true - true - true - 0 - - LF - false - false - false - - - - true - - - - - Unknown - - true - true - true - - - - false - - - - - Debug - - - - Release - - - - - - - - - false - false - false - false - false - false - false - false - false - - false - false - false - false - false - false - true - false - None - false - false - app_main - true - false - false - true - 0 - false - 0 - true - false - - - openocd - - -f interface/tigard.cfg -c "adapter_khz 3000" -f target/esp32.cfg - - - - false - - 131072 - Enabled - - set remotetimeout 60 - target remote :$$SYS:GDB_PORT$$ - mon gdb_breakpoint_override hard - mon reset halt - load - - false - 0 - 0 - false - - 5000 - 1 - true - - size2MB - freq40M - DIO - - true - - - true - Auto - 0 - false - false - true - false - false - - _estack - 0 - false - - true - - \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33829.357 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{803FD0C6-D64E-4E16-9DC3-1DAEC859A3D2}") = "wolfssl_client_IDF_v5_ESP32", "wolfssl_client_IDF_v5_ESP32.vgdbproj", "{E903E9CC-1A23-4B00-8914-7E45EC21E351}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wolfssl", "wolfssl", "{5D78034B-FAE6-4B8D-8003-EC2B0993F286}" + ProjectSection(SolutionItems) = preProject + ..\..\..\..\..\..\wolfssl\error-ssl.h = ..\..\..\..\..\..\wolfssl\error-ssl.h + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "include", "include", "{53267705-B3FE-418C-975D-CD898BAF1F46}" + ProjectSection(SolutionItems) = preProject + ..\components\wolfssl\include\config.h = ..\components\wolfssl\include\config.h + ..\components\wolfssl\include\user_settings.h = ..\components\wolfssl\include\user_settings.h + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A51226B3-88A7-4463-B443-0E321C4A3D53}" + ProjectSection(SolutionItems) = preProject + ..\..\..\..\..\..\wolfssl\wolfcrypt\error-crypt.h = ..\..\..\..\..\..\wolfssl\wolfcrypt\error-crypt.h + ..\..\..\..\..\..\wolfssl\error-ssl.h = ..\..\..\..\..\..\wolfssl\error-ssl.h + ..\main\Kconfig.projbuild = ..\main\Kconfig.projbuild + ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\memory.ld = ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\memory.ld + ..\..\..\..\..\..\..\my_private_config.h = ..\..\..\..\..\..\..\my_private_config.h + ..\partitions_singleapp_large.csv = ..\partitions_singleapp_large.csv + ..\README.md = ..\README.md + ..\sdkconfig = ..\sdkconfig + ..\build\VisualGDB\Debug\config\sdkconfig.cmake = ..\build\VisualGDB\Debug\config\sdkconfig.cmake + ..\sdkconfig.defaults = ..\sdkconfig.defaults + ..\build\VisualGDB\Debug\config\sdkconfig.h = ..\build\VisualGDB\Debug\config\sdkconfig.h + ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\sections.ld = ..\build\VisualGDB\Debug\esp-idf\esp_system\ld\sections.ld + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|VisualGDB = Debug|VisualGDB + Release|VisualGDB = Release|VisualGDB + Tests (Debug)|VisualGDB = Tests (Debug)|VisualGDB + Tests (Release)|VisualGDB = Tests (Release)|VisualGDB + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Debug|VisualGDB.ActiveCfg = Debug|VisualGDB + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Debug|VisualGDB.Build.0 = Debug|VisualGDB + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Release|VisualGDB.ActiveCfg = Release|VisualGDB + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Release|VisualGDB.Build.0 = Release|VisualGDB + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Debug)|VisualGDB.ActiveCfg = Tests (Debug)|VisualGDB + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Debug)|VisualGDB.Build.0 = Tests (Debug)|VisualGDB + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Release)|VisualGDB.ActiveCfg = Tests (Release)|VisualGDB + {E903E9CC-1A23-4B00-8914-7E45EC21E351}.Tests (Release)|VisualGDB.Build.0 = Tests (Release)|VisualGDB + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {53267705-B3FE-418C-975D-CD898BAF1F46} = {5D78034B-FAE6-4B8D-8003-EC2B0993F286} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BA06FD8D-BEFD-429B-9F82-B6F34B43272E} + EndGlobalSection +EndGlobal diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.vgdbproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,269 @@ + + + + + + Unknown + + true + + bdbba681-1213-45f8-a44e-4652fe489fe3 + true + true + SourceDirs + + + + + + com.visualgdb.xtensa-esp32-elf + + 13.2.0 + 12.1 + 1 + + + .. + DEBUG + build/$(PlatformName)/$(ConfigurationName) + + false + $(ToolchainNinja) + $(BuildDir) + + + + false + $(SYSPROGS_CMAKE_PATH) + + + true + false + false + Ninja + false + RemoveBuildDirectory + false + + + true + true + true + false + true + false + true + HideOuterProjectTargets + true + false + true + + + true + e903e9cc-1a23-4b00-8914-7e45ec21e351 + + Upper + HeaderDirectoryAndSubdirectories + true + + + release/v5.2 + esp-idf/v5.2 + ESPIDF + + COM19 + false + false + ESP32 + + + + + + + + + + + + + + + Default + + + + COM19 + + 115200 + 8 + None + One + None + + + 0 + false + true + false + ASCII + + + 255 + 0 + 0 + 0 + + + 255 + 169 + 169 + 169 + + + 255 + 211 + 211 + 211 + + + 255 + 144 + 238 + 144 + + + 255 + 169 + 169 + 169 + + + + 16 + true + true + true + true + 0 + + LF + false + false + false + + + + true + + + + + Unknown + + true + true + true + + + + false + + + + + Debug + + + + Release + + + + + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + app_main + true + false + false + true + 0 + false + 0 + true + false + + + openocd + + -f interface/ftdi/tigard.cfg -c "adapter_khz 15000" -f interface/ftdi/tigard.cfg -f target/esp32.cfg + + + + false + + 131072 + Enabled + + set remotetimeout 60 + target remote :$$SYS:GDB_PORT$$ + mon gdb_breakpoint_override hard + mon reset halt + load + + false + 0 + 0 + false + + 5000 + 1 + true + + size2MB + freq40M + DIO + + true + + + true + Auto + 0 + false + false + true + false + false + + _estack + 0 + false + + true + + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2023 wolfSSL Inc. +# Copyright (C) 2006-2024 wolfSSL Inc. # # This file is part of wolfSSL. # @@ -17,206 +17,451 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA # -# cmake for wolfssl +# cmake for wolfssl Espressif projects # -cmake_minimum_required(VERSION 3.5) +# Version 5.6.0.011 for detect test/benchmark +# +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html +# + +cmake_minimum_required(VERSION 3.16) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") set(CMAKE_CURRENT_SOURCE_DIR ".") +set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component +set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" ) -# We are currently in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl -# The root of wolfSSL is 7 directories up from here: -get_filename_component(WOLFSSL_ROOT "../../../../../../../" ABSOLUTE) - -# Espressif may take several passes through this makefile. Check to see if we found IDF -string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) +# find the user name to search for possible "wolfssl-username" +message(STATUS "USERNAME = $ENV{USERNAME}") +if( "$ENV{USER}" STREQUAL "" ) # the bash user + if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user + message(STATUS "could not find USER or USERNAME") + else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USERNAME}") + endif() +else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USER}") +endif() +message(STATUS "THIS_USER = ${THIS_USER}") -if($WOLFSSL_FOUND_IDF) - message(STATUS "IDF_PATH = $ENV{IDF_PATH}") - message(STATUS "WOLFSSL_ROOT = ${WOLFSSL_ROOT}") - message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") +if( "$ENV{IDF_PATH}" STREQUAL "" ) + message(FATAL_ERROR "IDF_PATH Environment variable not set!") +else() + string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}") endif() -# get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa -FILE(GLOB EXCLUDE_ASM *.S) -file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") +# COMPONENT_NAME = wolfssl +# The component name is the directory name. "No feature to change this". +# See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685 + +# set the root of wolfSSL in top-level project CMakelists.txt: +# set(WOLFSSL_ROOT "C:/some path/with/spaces") +# set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]") +# set(WOLFSSL_ROOT "/mnt/c/some path/with/spaces") +# or use this logic to assign value from Environment Variable WOLFSSL_ROOT, +# or assume this is an example 7 subdirectories below: -if(NOT CMAKE_BUILD_EARLY_EXPANSION) - message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") -endif() +# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl +# The root of wolfSSL is 7 directories up from here: -set(INCLUDE_PATH ${WOLFSSL_ROOT}) +# function: IS_WOLFSSL_SOURCE +# parameter: DIRECTORY_PARAMETER - the directory to test +# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank. +function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT) + if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src") + set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE) + else() + set(${RESULT} "" PARENT_SCOPE) + endif() +endfunction() -set(COMPONENT_SRCDIRS "${WOLFSSL_ROOT}/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel/" - "${WOLFSSL_ROOT}/wolfcrypt/benchmark/" - "${WOLFSSL_ROOT}/wolfcrypt/test/" - ) +# function: FIND_WOLFSSL_DIRECTORY +# parameter: OUTPUT_FOUND_WOLFSSL_DIRECTORY contains root of source code, otherwise blank +# +function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) + message(STATUS "Starting FIND_WOLFSSL_DIRECTORY") + set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}") + if( "${CURRENT_SEARCH_DIR}" STREQUAL "" ) + message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...") + else() + get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + else() + message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") + message(STATUS "$ENV{WOLFSSL_ROOT}") + endif() + endif() + + # we'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl + message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE) + message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + + # loop through all the parents, looking for wolfssl + while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" ) + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + # wolfSSL may simply be in a parent directory, such as for local examples in wolfssl repo + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + if( THIS_USER ) + # Check for "wolfssl-[username]" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-${THIS_USER}) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR}") + + #if(EXISTS ${CURRENT_SEARCH_DIR_ALT} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR_ALT} AND EXISTS "${CURRENT_SEARCH_DIR_ALT}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR_ALT} PARENT_SCOPE) + return() + endif() + endif() + + # Next check for no user suffix "wolfssl" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl) + # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + # Move up one directory level + set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY) + message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" ) + # when the search directory is empty, we'll give up + set(CURRENT_SEARCH_DIR "") + endif() + endwhile() + + # If not found, set the output variable to empty before exiting + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} "" PARENT_SCOPE) +endfunction() + + +# Example usage: -set(COMPONENT_REQUIRES lwip) -# check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) - # - # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user - # - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") - message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") - message(STATUS "") - message(STATUS "To proceed: ") - message(STATUS "") - message(STATUS "Remove either the local project component: ${CMAKE_HOME_DIRECTORY}/components/wolfssl/ ") - message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") - message(STATUS "") - message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") - # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") +if(CMAKE_BUILD_EARLY_EXPANSION) + message(STATUS "wolfssl component CMAKE_BUILD_EARLY_EXPANSION:") + idf_component_register( + REQUIRES "${COMPONENT_REQUIRES}" + PRIV_REQUIRES # esp_hw_support + # esp_timer + # driver # this will typically only be needed for wolfSSL benchmark + ) else() - if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # not CMAKE_BUILD_EARLY_EXPANSION + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config:") + message(STATUS "************************************************************************************************") + + # search for wolfSSL + FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) + if(WOLFSSL_ROOT) + message(STATUS "NEW Found wolfssl directory at: ${WOLFSSL_ROOT}") + else() + message(STATUS "NEW wolfssl directory not found.") + # Abort. We need wolfssl _somewhere_. + message(FATAL_ERROR "Could not find wolfssl in ${WOLFSSL_ROOT}.\n" + "Try setting WOLFSSL_ROOT environment variable or git clone.") + endif() + + set(INCLUDE_PATH ${WOLFSSL_ROOT}) + + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/src/") + + if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_benchmark" ) + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark") + endif() + + if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_test" ) + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/test") + endif() + + set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\"" + "\"${WOLFSSL_EXTRA_PROJECT_DIR}\"" + ) # COMPONENT_SRCDIRS + + message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + + set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl") + add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + + + # Espressif may take several passes through this makefile. Check to see if we found IDF + string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) + + # get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa + file(GLOB EXCLUDE_ASM *.S) + file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") + + message(STATUS "IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") + message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") + + # + # Check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) # - # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. + # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user # message(STATUS "") - message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "**************************************************************************************") + message(STATUS "") + message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") + message(STATUS "") + message(STATUS "To proceed: ") + message(STATUS "") + message(STATUS "Remove either the local project component: ${WOLFSSL_PROJECT_DIR} ") + message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") + message(STATUS "") + message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + + # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") + else() - # - # wolfSSL is not an ESP-IDF component. We need to now determine if it is local and if so if it is part of the wolfSSL repo - # or if wolfSSL is simply installed as a local component. - # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" ) + if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) # - # wolfSSL found in local project. + # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/include/" ) - message(STATUS "") - message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - # - # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. + message(STATUS "") + message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "") + else() + # + # wolfSSL is not an ESP-IDF component. + # We need to now determine if it is local and if so if it is part of the wolfSSL repo, + # or if wolfSSL is simply installed as a local component. + # + + if( EXISTS "${WOLFSSL_PROJECT_DIR}" ) # - # We won't do anything else here, as it will be assumed the original install completed successfully. + # wolfSSL found in local project. # + if( EXISTS "${WOLFSSL_PROJECT_DIR}/wolfcrypt/" ) + message(STATUS "") + message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + # + # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. + # + # We won't do anything else here, as it will be assumed the original install completed successfully. + # + else() # full wolfSSL not installed in local project + # + # This is the developer repo mode. wolfSSL will be assumed to be not installed to ESP-IDF nor local project + # In this configuration, we are likely running a wolfSSL example found directly in the repo. + # + message(STATUS "") + message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + + message(STATUS "************************************************************************************************") + # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. + # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. + # + # first check if there's a [root]/include/user_settings.h + if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) + message(FATAL_ERROR "Found stray wolfSSL user_settings.h in " + "${WOLFSSL_ROOT}/include/user_settings.h " + " (please move it to ${WOLFSSL_PROJECT_DIR}/include/user_settings.h )") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/user_settings.h" ) + message(STATUS "Using existing wolfSSL user_settings.h in " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + else() + message(STATUS "Installing wolfSSL user_settings.h to " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" + DESTINATION "${CMAKE_HOME_DIRECTORY}/wolfssl/include/") + endif() + endif() # user_settings.h + + # next check if there's a [root]/include/config.h + if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + message(STATUS "Found stray wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS " Please move it to ${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "Using existing wolfSSL config.h ${WOLFSSL_PROJECT_DIR}/include/config.h") + else() + message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_PROJECT_DIR}/include/config.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_PROJECT_DIR}/include/") + file(RENAME "${WOLFSSL_PROJECT_DIR}/include/dummy_config_h" "${WOLFSSL_PROJECT_DIR}/include/config.h") + endif() # Project config.h + endif() # WOLFSSL_ROOT config.h + message(STATUS "************************************************************************************************") + message(STATUS "") + endif() + else() - # - # This is the developer repo mode. wolfSSL will be assume to be not installed to ESP-IDF nor local project - # In this configuration, we are likely running a wolfSSL example found directly in the repo. - # - message(STATUS "") - message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - - message(STATUS "************************************************************************************************") - # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. - # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. - # - # first check if there's a [root]/include/user_settings.h - if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) - # we won't overwrite an existing user settings file, just note that we already have one: - message(STATUS "Found wolfSSL user_settings.h in ${WOLFSSL_ROOT}/include/user_settings.h") - else() - message(STATUS "Installing wolfSSL user_settings.h to ${WOLFSSL_ROOT}/include/user_settings.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" DESTINATION "${WOLFSSL_ROOT}/include/") - endif() # user_settings.h - - # next check if there's a [root]/include/config.h - if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) - message(STATUS "Found wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h") + # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. + if($WOLFSSL_FOUND_IDF) + message(STATUS "") + message(STATUS "WARNING: wolfSSL not found.") + message(STATUS "") else() - message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_ROOT}/include/config.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_ROOT}/include/") - file(RENAME "${WOLFSSL_ROOT}/include/dummy_config_h" "${WOLFSSL_ROOT}/include/config.h") - endif() # config.h - message(STATUS "************************************************************************************************") - message(STATUS "") - endif() + # probably needs to be re-parsed by Espressif + message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") + endif() # else we have not found ESP-IDF yet + endif() # else not a local wolfSSL component - else() - # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. - if($WOLFSSL_FOUND_IDF) - message(STATUS "") - message(STATUS "WARNING: wolfSSL not found.") - message(STATUS "") - else() - # probably needs to be re-parsed by Espressif - message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") - endif() # else we have not found ESP-IDF yet - endif() # else not a local wolfSSL component + endif() #else not an ESP-IDF component + endif() # else not local copy and EDP-IDF wolfSSL - endif() #else not an ESP-IDF component -endif() # else not local copy and EDP-IDF wolfSSL + # RTOS_IDF_PATH is typically: + # "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" + # depending on the environment, we may need to swap backslashes with forward slashes + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") -# RTOS_IDF_PATH is typically: -# "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" -# depending on the environment, we may need to swap backslashes with forward slashes -string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT}) + + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}") + else() + # ESP-IDF prior version 4.4x has a different RTOS directory structure + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found legacy RTOS path: ${RTOS_IDF_PATH}") + else() + message(STATUS "Could not find RTOS path") + endif() + endif() -# ESP-IDF after version 4.4x has a different RTOS directory structure -string(REPLACE "\\" "/" RTOS_IDF_PATH5 "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") -if(IS_DIRECTORY ${IDF_PATH}/components/freertos/FreeRTOS-Kernel/) set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH5}" - "${WOLFSSL_ROOT}" - ) -else() + "./include" # this is the location of wolfssl user_settings.h + "\"${WOLFSSL_ROOT}/\"" + "\"${WOLFSSL_ROOT}/wolfssl/\"" + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"" + "\"${RTOS_IDF_PATH}/\"" + # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers + ${THIS_IDF_PATH}/components/esp_event/include + ${THIS_IDF_PATH}/components/esp_netif/include + ${THIS_IDF_PATH}/components/esp_wifi/include + ) + + + if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) + list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") + endif() + + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/\"") + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"") + + + # Some files are known to be included elsewhere, or not used for Espressif + set(COMPONENT_SRCEXCLUDE + "\"${WOLFSSL_ROOT}/src/bio.c\"" + "\"${WOLFSSL_ROOT}/src/conf.c\"" + "\"${WOLFSSL_ROOT}/src/misc.c\"" + "\"${WOLFSSL_ROOT}/src/pk.c\"" + "\"${WOLFSSL_ROOT}/src/ssl_asn1.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_bn.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_certman.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_crypto.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_load.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_misc.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_p7p12.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_sess.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/x509.c\"" + "\"${WOLFSSL_ROOT}/src/x509_str.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_armthumb.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\"" + "\"${EXCLUDE_ASM}\"" + ) + + spaces2list(COMPONENT_REQUIRES) + + separate_arguments(COMPONENT_SRCDIRS NATIVE_COMMAND "${COMPONENT_SRCDIRS}") + separate_arguments(COMPONENT_SRCEXCLUDE NATIVE_COMMAND "${COMPONENT_SRCEXCLUDE}") + separate_arguments(COMPONENT_ADD_INCLUDEDIRS NATIVE_COMMAND "${COMPONENT_ADD_INCLUDEDIRS}") - set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH}" - "${WOLFSSL_ROOT}" - ) -endif() + # + # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#example-component-requirements + # + message(STATUS "COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + message(STATUS "COMPONENT_ADD_INCLUDEDIRS = ${COMPONENT_ADD_INCLUDEDIRS}") + message(STATUS "COMPONENT_REQUIRES = ${COMPONENT_REQUIRES}") + message(STATUS "COMPONENT_SRCEXCLUDE = ${COMPONENT_SRCEXCLUDE}") + + # + # see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path + # + set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}") + idf_component_register( + SRC_DIRS "${COMPONENT_SRCDIRS}" + INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}" + REQUIRES "${COMPONENT_REQUIRES}" + EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}" + PRIV_REQUIRES esp_timer driver # this will typically only be needed for wolfSSL benchmark + ) + # some optional diagnostics + if (1) + get_cmake_property(_variableNames VARIABLES) + list (SORT _variableNames) + message(STATUS "") + message(STATUS "ALL VARIABLES BEGIN") + message(STATUS "") + foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") + endforeach() + message(STATUS "") + message(STATUS "ALL VARIABLES END") + message(STATUS "") + endif() + + # target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"") + +endif() # CMAKE_BUILD_EARLY_EXPANSION -if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) - list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") -endif() -set(COMPONENT_SRCEXCLUDE - "${WOLFSSL_ROOT}/src/bio.c" - "${WOLFSSL_ROOT}/src/conf.c" - "${WOLFSSL_ROOT}/src/misc.c" - "${WOLFSSL_ROOT}/src/pk.c" - "${WOLFSSL_ROOT}/src/ssl_misc.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/x509.c" - "${WOLFSSL_ROOT}/src/x509_str.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/evp.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/misc.c" - "${EXCLUDE_ASM}" - ) - -register_component() - -# some optional diagnostics -if (0) - get_cmake_property(_variableNames VARIABLES) - list (SORT _variableNames) - message(STATUS "") - message(STATUS "ALL VARIABLES BEGIN") - message(STATUS "") - foreach (_variableName ${_variableNames}) - message(STATUS "${_variableName}=${${_variableName}}") - endforeach() - message(STATUS "") - message(STATUS "ALL VARIABLES END") - message(STATUS "") -endif() # check to see if there's both a local copy and EDP-IDF copy of the wolfssl components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) +if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) message(STATUS "") message(STATUS "") message(STATUS "********************************************************************") @@ -227,3 +472,69 @@ # end multiple component check +# +# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) +# +# Save the THIS_VAR as a string in a macro called VAR_OUPUT +# +# VAR_OUPUT: the name of the macro to define +# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process() +# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful. +# +function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT ) + # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true. + string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE) + + # if we had a successful operation, save the THIS_VAR in VAR_OUPUT + if(${IS_VALID_VALUE}) + # strip newline chars in THIS_VAR parameter and save in VAR_VALUE + string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR}) + + # we'll could percolate the value to the parent for possible later use + # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE) + + # but we're only using it here in this function + set(${VAR_OUPUT} ${VAR_VALUE}) + + # we'll print what we found to the console + message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}") + + # the interesting part is defining the VAR_OUPUT name a value to use in the app + add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\") + else() + # if we get here, check the execute_process command and parameters. + message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT") + set(${VAR_OUPUT} "Unknown") + endif() +endfunction() # LIBWOLFSSL_SAVE_INFO + +# create some programmatic #define values that will be used by ShowExtendedSystemInfo(). +# see wolfcrypt\src\port\Espressif\esp32_utl.c +if(NOT CMAKE_BUILD_EARLY_EXPANSION) + set (git_cmd "git") + message(STATUS "Adding macro definitions:") + + # LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\' + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}") + + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config complete!") + message(STATUS "************************************************************************************************") +endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,40 +1,250 @@ -# -# Copyright (C) 2006-2023 wolfSSL Inc. -# -# This file is part of wolfSSL. -# -# wolfSSL 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 of the License, or -# (at your option) any later version. -# -# wolfSSL 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA -# -# -# Component Makefile -# - -COMPONENT_ADD_INCLUDEDIRS := . ./include - -COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/components/freertos/include/freertos" -# COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/soc/esp32s3/include/soc" - -COMPONENT_SRCDIRS := src wolfcrypt/src -COMPONENT_SRCDIRS += wolfcrypt/src/port/Espressif -COMPONENT_SRCDIRS += wolfcrypt/src/port/atmel -COMPONENT_SRCDIRS += wolfcrypt/benchmark -COMPONENT_SRCDIRS += wolfcrypt/test - -CFLAGS +=-DWOLFSSL_USER_SETTINGS - -COMPONENT_OBJEXCLUDE := wolfcrypt/src/aes_asm.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/evp.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/misc.o -COMPONENT_OBJEXCLUDE += src/bio.o +# +# Copyright (C) 2006-2024 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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 of the License, or +# (at your option) any later version. +# +# wolfSSL 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +# + +# +# Component Makefile +# +# +# The Espressif Managed Components are only for newer versions of the ESP-IDF +# Typically only for ESP32[-x] targets and only for ESP-IDF v4.3 or later: +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html +# https://components.espressif.com/ +# +# Usage: +# +# make flash +# +# make flash ESPPORT=/dev/ttyS55 +# +# make flash ESPBAUD=9600 +# +# make monitor ESPPORT=COM1 +# +# make monitor ESPPORT=/dev/ttyS55 MONITORBAUD=115200 +# +# export ESPPORT=/dev/ttyS55 +# +# https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html +# + +# Although the project should define WOLFSSL_USER_SETTINGS, we'll also +# define it here: +CFLAGS +=-DWOLFSSL_USER_SETTINGS + +# NOTICE: the WOLFSSL_ROOT setting MUST be relative! +# See https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-guides/build-system.html?highlight=must+relative#optional-component-specific-variables +# In the wolfSSL GitHub examples for Espressif: +# https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples +# When this wolfssl component.mk makefile is in [project]/components/wolfssl +# The root is 7 directories up from here: +WOLFSSL_ROOT := ../../../../../../.. + +# NOTE: The wolfSSL include directory (e.g. user_settings.h) is +# located HERE in THIS project, and *not* in the wolfSSL root. +COMPONENT_ADD_INCLUDEDIRS := . +COMPONENT_ADD_INCLUDEDIRS += include +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/. +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt/port/Espressif +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfssl/wolfcrypt/port/Espressif +# COMPONENT_ADD_INCLUDEDIRS += $ENV(IDF_PATH)/components/freertos/include/freertos +# COMPONENT_ADD_INCLUDEDIRS += "$ENV(IDF_PATH)/soc/esp32s3/include/soc" + +# wolfSSL +COMPONENT_SRCDIRS := $(WOLFSSL_ROOT)/src + +# wolfcrypt +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src + +# Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/atmel + +COMPONENT_OBJEXCLUDE := $(WOLFSSL_ROOT)/wolfcrypt/src/aes_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_x25519_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/aes_gcm_x86_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/src/bio.o + + +## +## wolfSSL +## +COMPONENT_OBJS := $(WOLFSSL_ROOT)/src/bio.o +# COMPONENT_OBJS += src/conf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/crl.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/internal.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/keys.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ocsp.o +# COMPONENT_OBJS += src/pk.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/quic.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/sniffer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ssl.o +# COMPONENT_OBJS += src/ssl_asn1.o +# COMPONENT_OBJS += src/ssl_bn.o +# COMPONENT_OBJS += src/ssl_certman.o +# COMPONENT_OBJS += src/ssl_crypto.o +# COMPONENT_OBJS += src/ssl_misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/wolfio.o +# COMPONENT_OBJS += src/x509.o +# COMPONENT_OBJS += src/x509_str.o + +## +## wolfcrypt +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/arc4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asn.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/async.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2b.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2s.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/camellia.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha20_poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/coding.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/compress.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cpuid.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cryptocb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/des3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dh.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dilithium.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/eccsi.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc_fp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_operations.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips_test.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_operations.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hpke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/integer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/kdf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/logging.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md5.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/memory.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs12.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs7.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pwdbased.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/random.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rc2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ripemd.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sakke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/selftest.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha256.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/signature.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_cortexm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_dsp32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_int.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_armthumb.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_cortexm.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_x86_64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_x86_64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/srp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/tfm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_dsp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_encrypt.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_kyber_poly.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfevent.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfmath.o + +## +## Espressif +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_mp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_util.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.o + +## +## wolfcrypt benchmark (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark/benchmark.o +## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark +## COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark + + +## +## wolfcrypt test (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/test/test.o +## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/test + +## +## wolfcrypt +## +# COMPONENT_PRIV_INCLUDEDIRS += $(PROJECT_PATH)/components/wolfssl/include +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,586 @@ +/* user_settings.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.6.6-01 */ + +/* This user_settings.h is for Espressif ESP-IDF */ + +#include "sdkconfig.h" + +/* #define DEBUG_WOLFSSL */ +/* #define DEBUG_WOLFSSL_VERBOSE */ + +/* Experimental Kyber */ +#if 0 + #define WOLFSSL_EXPERIMENTAL_SETTINGS + #define WOLFSSL_HAVE_KYBER + #define WOLFSSL_WC_KYBER + #define WOLFSSL_SHA3 + #if defined(CONFIG_IDF_TARGET_ESP8266) + /* With limited RAM, we'll disable some of the Kyber sizes: */ + #define WOLFSSL_NO_KYBER1024 + #define WOLFSSL_NO_KYBER768 + #define NO_SESSION_CACHE + #endif +#endif + +/* Pick a cert buffer size: */ +/* #define USE_CERT_BUFFERS_2048 */ +/* #define USE_CERT_BUFFERS_1024 */ +#define USE_CERT_BUFFERS_2048 + +/* The Espressif sdkconfig will have chipset info. +** +** Some possible values: +** +** CONFIG_IDF_TARGET_ESP32 +** CONFIG_IDF_TARGET_ESP32S2 +** CONFIG_IDF_TARGET_ESP32S3 +** CONFIG_IDF_TARGET_ESP32C3 +** CONFIG_IDF_TARGET_ESP32C6 +*/ + +#undef WOLFSSL_ESPIDF +#define WOLFSSL_ESPIDF + +/* We don't use WiFi helpers yet, so don't compile in the esp-sdk-lib WiFi */ +#define NO_ESP_SDK_WIFI + +/* + * ONE of these Espressif chipsets should be defined: + * + * WOLFSSL_ESP32 + * WOLFSSL_ESPWROOM32SE + * WOLFSSL_ESP8266 + * + * following ifdef detection only for syntax highlighting: + */ +#ifdef WOLFSSL_ESPWROOM32SE + #undef WOLFSSL_ESPWROOM32SE +#endif +#ifdef WOLFSSL_ESP8266 + #undef WOLFSSL_ESP8266 +#endif +#ifdef WOLFSSL_ESP32 + #undef WOLFSSL_ESP32 +#endif +/* See below for chipset detection from sdkconfig.h */ + +/* Small session cache saves a lot of RAM for ClientCache and SessionCache. + * Memory requirement is about 5KB, otherwise 20K is needed when not specified. + * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K) + * When really desperate, try NO_SESSION_CACHE. */ +#define MICRO_SESSION_CACHE + +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* When you don't want to use the old SHA */ +/* #define NO_SHA */ +/* #define NO_OLD_TLS */ + +#define BENCH_EMBEDDED + +#define WOLFSSL_SMALL_STACK +#define HAVE_ECC +#define RSA_LOW_MEM + +/* TLS 1.3 */ +#define WOLFSSL_TLS13 +#define HAVE_TLS_EXTENSIONS +#define WC_RSA_PSS +#define HAVE_HKDF +#define HAVE_AEAD +#define HAVE_SUPPORTED_CURVES + +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + +#define NO_FILESYSTEM + +#define NO_OLD_TLS + +#define HAVE_AESGCM + +/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */ +/* #define WOLFSSL_RIPEMD */ + +/* when you want to use SHA224 */ +#define WOLFSSL_SHA224 + +/* when you want to use SHA384 */ +#define WOLFSSL_SHA384 + +#if defined(CONFIG_IDF_TARGET_ESP8266) + /* Some known low-memory devices have features not enabled by default. */ +#else + /* when you want to use SHA512 */ + #define WOLFSSL_SHA512 + + /* when you want to use SHA3 */ + #define WOLFSSL_SHA3 + + /* ED25519 requires SHA512 */ + #define HAVE_ED25519 + + #define HAVE_ECC + #define HAVE_CURVE25519 + #define CURVE25519_SMALL + #define HAVE_ED25519 +#endif + +/* Optional OpenSSL compatibility */ +/* #define OPENSSL_EXTRA */ + +/* when you want to use pkcs7 */ +/* #define HAVE_PKCS7 */ +#if defined(HAVE_PKCS7) + #define HAVE_AES_KEYWRAP + #define HAVE_X963_KDF + #define WOLFSSL_AES_DIRECT +#endif + +/* when you want to use AES counter mode */ +/* #define WOLFSSL_AES_DIRECT */ +/* #define WOLFSSL_AES_COUNTER */ + +/* esp32-wroom-32se specific definition */ +#if defined(WOLFSSL_ESPWROOM32SE) + #define WOLFSSL_ATECC508A + #define HAVE_PK_CALLBACKS + /* when you want to use a custom slot allocation for ATECC608A */ + /* unless your configuration is unusual, you can use default */ + /* implementation. */ + /* #define CUSTOM_SLOT_ALLOCATION */ +#endif + +/* RSA primitive specific definition */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + /* Define USE_FAST_MATH and SMALL_STACK */ + #define ESP32_USE_RSA_PRIMITIVE + + #if defined(CONFIG_IDF_TARGET_ESP32) + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + + #endif +#endif + +/* #define WOLFSSL_ATECC508A_DEBUG */ + +/* date/time */ +/* if it cannot adjust time in the device, */ +/* enable macro below */ +/* #define NO_ASN_TIME */ +/* #define XTIME time */ + + +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ +#define ESP_RSA_TIMEOUT_CNT 0x249F00 + +#define HASH_SIZE_LIMIT /* for test.c */ + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + +#define HAVE_VERSION_EXTENDED_INFO +/* #define HAVE_WC_INTROSPECTION */ + +#ifndef NO_SESSION_CACHE + #define HAVE_SESSION_TICKET +#endif + +/* #define HAVE_HASHDRBG */ + +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_EXT +#define WOLFSSL_SYS_CA_CERTS + +#define WOLFSSL_CERT_TEXT + +#define WOLFSSL_ASN_TEMPLATE + +/* +#undef WOLFSSL_KEY_GEN +#undef WOLFSSL_CERT_REQ +#undef WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_EXT +#undef WOLFSSL_SYS_CA_CERTS +*/ + +/* command-line options +--enable-keygen +--enable-certgen +--enable-certreq +--enable-certext +--enable-asn-template +*/ + +/* Chipset detection from sdkconfig.h + * Default is HW enabled unless turned off. + * Uncomment lines to force SW instead of HW acceleration */ +#if defined(CONFIG_IDF_TARGET_ESP32) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + #define WOLFSSL_ESP32 + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: https://www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + #define WOLFSSL_ESP32 + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + #define WOLFSSL_ESP8266 + + /* There's no hardware encryption on the ESP8266 */ + /* Consider using the ESP32-C2/C3/C6 + * See https://www.espressif.com/en/products/socs/esp32-c2 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* There's no Hardware Acceleration available on ESP8684 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP8684 *****/ + +#else + /* Anything else encountered, disable HW accleration */ + #warning "Unexpected CONFIG_IDF_TARGET_NN value" + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +/* Debug options: +See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK +*/ + +#define WOLFSSL_ESPIDF_ERROR_PAUSE /* Pause in a loop rather than exit. */ +#define WOLFSSL_HW_METRICS + +/* #define HASH_SIZE_LIMIT */ /* for test.c */ + +/* #define NO_HW_MATH_TEST */ /* Optionally turn off HW math checks */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +/* used by benchmark: */ +#define WOLFSSL_PUBLIC_MP + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/***************************** Certificate Macros ***************************** + * + * The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * https://github.com/wolfSSL/wolfssl/pull/6825 + * https://github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +/* Conditional macros used in wolfSSL TLS client and server examples */ +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #include + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #if defined(USE_CERT_BUFFERS_2048) + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #elif defined(USE_CERT_BUFFERS_1024) + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + /* Optionally define custom cert arrays, sizes, and types here */ + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif /* Conditional key and cert constant names */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,12 +1,36 @@ - +# wolfSSL Espressif Example Project/main CMakeLists.txt +# v1.0 # # wolfssl client test # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") -set(COMPONENT_SRCS "client-tls.c" "wifi_connect.c") -set(COMPONENT_ADD_INCLUDEDIRS "." "./include") - +if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") +endif() +if(CMAKE_HOST_UNIX) + message("Detected UNIX") +endif() +if(APPLE) + message("Detected APPLE") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") +endif() +if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") +endif() set (git_cmd "git") if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) @@ -19,7 +43,14 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") endif() -register_component() +## register_component() +idf_component_register(SRCS main.c + wifi_connect.c + time_helper.c + client-tls.c + INCLUDE_DIRS "." + "./include") +# # # LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/Kconfig.projbuild mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/Kconfig.projbuild --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/Kconfig.projbuild 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/Kconfig.projbuild 2024-08-03 07:30:00.000000000 +0000 @@ -1,9 +1,15 @@ menu "Example Configuration" -config TARGET_HOST +config WOLFSSL_TARGET_HOST string "Target host" - default "127.0.01.1" + default "127.0.0.1" help host address for the example to connect - + +config WOLFSSL_TARGET_PORT + int "Target port" + default 11111 + help + host port for the example to connect + endmenu diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* client-tls-callback.c +/* client-tls.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,40 +18,92 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -/* the usual suspects */ -#include -#include -#include -#include +#include "client-tls.h" -/* ESP specific */ -#include "wifi_connect.h" +/* Espressif FreeRTOS */ +#ifndef SINGLE_THREADED + #include + #include + #include +#endif + +/* Espressif */ +#include /* socket includes */ -#include "lwip/netdb.h" -#include "lwip/sockets.h" +#include +#include /* wolfSSL */ #include #include -#include +#if defined(WOLFSSL_WC_KYBER) + #include + #include +#endif +#if defined(USE_CERT_BUFFERS_2048) || defined(USE_CERT_BUFFERS_1024) + #include +#endif #ifdef WOLFSSL_TRACK_MEMORY #include #endif -static const char* const TAG = "tls_client"; +#ifndef NO_DH + /* see also wolfssl/test.h */ + #undef DEFAULT_MIN_DHKEY_BITS + #define DEFAULT_MIN_DHKEY_BITS 1024 + + #undef DEFAULT_MAX_DHKEY_BITS + #define DEFAULT_MAX_DHKEY_BITS 2048 +#endif + +/* Project */ +#include "wifi_connect.h" +#include "time_helper.h" + +/* working TLS 1.2 VS client app commandline param: + * + * -h 192.168.1.128 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + * + * working Linux, non-working VS c app + * + * -h 192.168.1.128 -v 4 -l TLS13-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + * + **/ +#define TAG "client-tls" #if defined(DEBUG_WOLFSSL) +int stack_start = -1; -static void ShowCiphers(void) +int ShowCiphers(WOLFSSL* ssl) { - char ciphers[4096]; - - int ret = wolfSSL_get_ciphers(ciphers, (int)sizeof(ciphers)); + #define CLIENT_TLS_MAX_CIPHER_LENGTH 4096 + char ciphers[CLIENT_TLS_MAX_CIPHER_LENGTH]; + const char* cipher_used; + int ret = 0; + + if (ssl == NULL) { + ESP_LOGI(TAG, "WOLFSSL* ssl is NULL, so no cipher in use"); + ret = wolfSSL_get_ciphers(ciphers, (int)sizeof(ciphers)); + if (ret == WOLFSSL_SUCCESS) { + for (int i = 0; i < CLIENT_TLS_MAX_CIPHER_LENGTH; i++) { + if (ciphers[i] == ':') { + ciphers[i] = '\n'; + } + } + ESP_LOGI(TAG, "Available Ciphers:\n%s\n", ciphers); + } + else { + ESP_LOGE(TAG, "Failed to call wolfSSL_get_ciphers. Error %d", ret); + } + } + else { + cipher_used = wolfSSL_get_cipher_name(ssl); + ESP_LOGI(TAG, "WOLFSSL* ssl using %s", cipher_used); + } - if (ret == WOLFSSL_SUCCESS) - printf("%s\n", ciphers); + return ret; } #endif @@ -69,13 +121,13 @@ static byte mSlotList[ATECC_MAX_SLOT]; int atmel_set_slot_allocator(atmel_slot_alloc_cb alloc, - atmel_slot_dealloc_cb dealloc); + atmel_slot_dealloc_cb dealloc); /* initialize slot array */ void my_atmel_slotInit() { int i; - for(i=0;i= 0 && slotId < ATECC_MAX_SLOT){ + if (slotId >= 0 && slotId < ATECC_MAX_SLOT) { mSlotList[slotId] = ATECC_INVALID_SLOT; } } -#endif /* CUSTOM_SLOT_ALLOCATION */ +#endif /* CUSTOM_SLOT_ALLOCATION */ #endif /* WOLFSSL_ESPWROOM32SE && HAVE_PK_CALLBACK && WOLFSSL_ATECC508A */ /* client task */ -void tls_smp_client_task() +WOLFSSL_ESP_TASK tls_smp_client_task(void* args) { - int ret; - int sockfd; - int doPeerCheck; - int sendGet; - struct sockaddr_in servAddr; +#if defined(SINGLE_THREADED) + int ret = ESP_OK; + #define TLS_SMP_CLIENT_TASK_RET ret +#else + #define TLS_SMP_CLIENT_TASK_RET +#endif char buff[256]; - const char* ch = TLS_SMP_TARGET_HOST; - size_t len; + const char sndMsg[] = "GET /index.html HTTP/1.0\r\n\r\n"; + const char* ch = TLS_SMP_TARGET_HOST; /* see wifi_connect.h */ + struct sockaddr_in servAddr; + struct hostent *hp; struct ip4_addr *ip4_addr; - const char sndMsg[] = "GET /index.html HTTP/1.0\r\n\r\n"; + int ret_i; /* interim return values */ + int err; /* interim return values */ + int sockfd; + int doPeerCheck; + int sendGet; +#ifdef DEBUG_WOLFSSL + int this_heap = 0; +#endif +#ifndef NO_DH + int minDhKeyBits = DEFAULT_MIN_DHKEY_BITS; +#endif /* declare wolfSSL objects */ - WOLFSSL_CTX *ctx; - WOLFSSL *ssl; + WOLFSSL_CTX* ctx; + WOLFSSL* ssl; - WOLFSSL_ENTER("tls_smp_client_task"); + size_t len; + + wolfSSL_Debugging_ON(); + WOLFSSL_ENTER(TLS_SMP_CLIENT_TASK_NAME); - doPeerCheck = 0; + doPeerCheck = 1; sendGet = 0; #ifdef DEBUG_WOLFSSL WOLFSSL_MSG("Debug ON"); - wolfSSL_Debugging_ON(); - ShowCiphers(); + ShowCiphers(NULL); #endif /* Initialize wolfSSL */ wolfSSL_Init(); - /* Create a socket that uses an internet IPv4 address, + /* Create a socket that uses an Internet IPv4 address, * Sets the socket to be stream based (TCP), * 0 means choose the default protocol. */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { - ESP_LOGE(TAG,"ERROR: failed to create the socket\n"); + ESP_LOGE(TAG, "ERROR: failed to create the socket\n"); } ESP_LOGI(TAG, "get target IP address"); hp = gethostbyname(TLS_SMP_TARGET_HOST); if (!hp) { - ESP_LOGE(TAG, "Failed to get host name."); - ip4_addr = NULL; - } else { - - ip4_addr = (struct ip4_addr *)hp->h_addr; - ESP_LOGI(TAG, IPSTR, IP2STR(ip4_addr)); + ESP_LOGE(TAG, "Failed to get host name."); + ip4_addr = NULL; + } + else { + ip4_addr = (struct ip4_addr *)hp->h_addr; } + /* Create and initialize WOLFSSL_CTX */ - if ((ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())) == NULL) { - ESP_LOGE(TAG,"ERROR: failed to create WOLFSSL_CTX\n"); + ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); /* SSL 3.0 - TLS 1.3. */ + /* options: */ + /* ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method()); only TLS 1.2 */ + /* ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method()); only TLS 1.3 */ + /* wolfSSL_CTX_NoTicketTLSv12(); */ + /* wolfSSL_NoTicketTLSv12(); */ + if (ctx == NULL) { + ESP_LOGE(TAG, "ERROR: failed to create WOLFSSL_CTX\n"); } - WOLFSSL_MSG("Loading...cert"); - /* Load client certificates into WOLFSSL_CTX */ - if ((ret = wolfSSL_CTX_load_verify_buffer(ctx, ca_cert_der_2048, - sizeof_ca_cert_der_2048, WOLFSSL_FILETYPE_ASN1)) != SSL_SUCCESS) { - ESP_LOGE(TAG,"ERROR: failed to load %d, please check the file.\n",ret); + +#if defined(WOLFSSL_ESP32_CIPHER_SUITE) + ESP_LOGI(TAG, "Start SM2\n"); + +/* + * + * reference code for SM Ciphers: + * + #if defined(HAVE_AESGCM) && !defined(NO_DH) + #ifdef WOLFSSL_TLS13 + defaultCipherList = "TLS13-AES128-GCM-SHA256" + #ifndef WOLFSSL_NO_TLS12 + ":DHE-PSK-AES128-GCM-SHA256" + #endif + ; + #else + defaultCipherList = "DHE-PSK-AES128-GCM-SHA256"; + #endif + #elif defined(HAVE_AESGCM) && defined(WOLFSSL_TLS13) + defaultCipherList = "TLS13-AES128-GCM-SHA256:PSK-AES128-GCM-SHA256" + #ifndef WOLFSSL_NO_TLS12 + ":PSK-AES128-GCM-SHA256" + #endif + ; + #elif defined(HAVE_NULL_CIPHER) + defaultCipherList = "PSK-NULL-SHA256"; + #elif !defined(NO_AES_CBC) + defaultCipherList = "PSK-AES128-CBC-SHA256"; + #else + defaultCipherList = "PSK-AES128-GCM-SHA256"; + #endif +*/ + + ret = wolfSSL_CTX_set_cipher_list(ctx, WOLFSSL_ESP32_CIPHER_SUITE); + if (ret == WOLFSSL_SUCCESS) { + ESP_LOGI(TAG, "Set cipher list: %s\n", WOLFSSL_ESP32_CIPHER_SUITE); + } + else { + ESP_LOGE(TAG, "ERROR: failed to set cipher list: %s\n", + WOLFSSL_ESP32_CIPHER_SUITE); + } +#endif + +#ifdef DEBUG_WOLFSSL + ShowCiphers(NULL); + ESP_LOGI(TAG, "Stack used: %d\n", + CONFIG_ESP_MAIN_TASK_STACK_SIZE + - uxTaskGetStackHighWaterMark(NULL)); +#endif + +/* see user_settings PROJECT_DH for HAVE_DH and HAVE_FFDHE_2048 */ +#ifndef NO_DH + ret = wolfSSL_CTX_SetMinDhKey_Sz(ctx, (word16)minDhKeyBits); + if (ret != WOLFSSL_SUCCESS) { + ESP_LOGE(TAG, "Error setting minimum DH key size"); } - /* not peer check */ - if( doPeerCheck == 0 ){ +#endif + + /* no peer check */ + if (doPeerCheck == 0) { + ESP_LOGW(TAG, "doPeerCheck == 0"); wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, 0); - } else { + } + else { + ESP_LOGW(TAG, "doPeerCheck != 0"); WOLFSSL_MSG("Loading... our cert"); /* load our certificate */ - if ((ret = wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, client_cert_der_2048, - sizeof_client_cert_der_2048, WOLFSSL_FILETYPE_ASN1)) != SSL_SUCCESS) { - ESP_LOGE(TAG,"ERROR: failed to load chain %d, please check the file.\n",ret); + ret_i = wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, + CTX_CLIENT_CERT, + CTX_CLIENT_CERT_SIZE, + CTX_CLIENT_CERT_TYPE); + if (ret_i != WOLFSSL_SUCCESS) { + ESP_LOGE(TAG, "ERROR: failed to load our cert chain %d, " + "please check the file.", ret_i); + } + + /* Load client certificates into WOLFSSL_CTX */ + WOLFSSL_MSG("Loading... CA cert"); + ret_i = wolfSSL_CTX_load_verify_buffer(ctx, + CTX_CA_CERT, + CTX_CA_CERT_SIZE, + CTX_CA_CERT_TYPE); + if (ret_i != WOLFSSL_SUCCESS) { + ESP_LOGE(TAG, "ERROR: failed to load CA cert %d, " + "please check the file.\n", ret_i) ; } - if ((ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, client_key_der_2048, - sizeof_client_key_der_2048, WOLFSSL_FILETYPE_ASN1)) != SSL_SUCCESS) { - wolfSSL_CTX_free(ctx); ctx = NULL; - ESP_LOGE(TAG,"ERROR: failed to load key %d, please check the file.\n", ret); + WOLFSSL_MSG("Loading... our key"); + ret_i = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + CTX_CLIENT_KEY, + CTX_CLIENT_KEY_SIZE, + CTX_CLIENT_KEY_TYPE); + if (ret_i != WOLFSSL_SUCCESS) { + ESP_LOGE(TAG, "ERROR: failed to load key %d, " + "please check the file.\n", ret_i) ; } wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, 0); @@ -202,37 +349,93 @@ memset(&servAddr, 0, sizeof(servAddr)); /* Fill in the server address */ - servAddr.sin_family = AF_INET; /* using IPv4 */ - servAddr.sin_port = htons(DEFAULT_PORT); /* on DEFAULT_PORT */ + servAddr.sin_family = AF_INET; /* using IPv4 */ + servAddr.sin_port = htons(TLS_SMP_DEFAULT_PORT); /* on DEFAULT_PORT */ - if(*ch >= '1' && *ch <= '9') { + if (*ch >= '1' && *ch <= '9') { /* Get the server IPv4 address from the command line call */ WOLFSSL_MSG("inet_pton"); - if ((ret = inet_pton(AF_INET, TLS_SMP_TARGET_HOST, - &servAddr.sin_addr)) != 1) { - ESP_LOGE(TAG,"ERROR: invalid address ret=%d\n", ret); + if ((ret_i = inet_pton(AF_INET, + TLS_SMP_TARGET_HOST, + &servAddr.sin_addr)) != 1) { + ESP_LOGE(TAG, "ERROR: invalid address ret=%d\n", ret_i); } - } else { + } + else { servAddr.sin_addr.s_addr = ip4_addr->addr; } /* Connect to the server */ - sprintf(buff, "Connecting to server....%s(port:%d)", TLS_SMP_TARGET_HOST - , DEFAULT_PORT); - WOLFSSL_MSG(buff); - printf("%s\n",buff); - if ((ret = connect(sockfd, (struct sockaddr *)&servAddr, - sizeof(servAddr))) == -1){ - ESP_LOGE(TAG,"ERROR: failed to connect ret=%d\n", ret); + sprintf(buff, + "Connecting to server....%s (port:%d)", + TLS_SMP_TARGET_HOST, + TLS_SMP_DEFAULT_PORT); + ESP_LOGI(TAG, "%s\n", buff); + + if ((ret_i = connect(sockfd, + (struct sockaddr *)&servAddr, + sizeof(servAddr))) == -1) { + ESP_LOGE(TAG, "ERROR: failed to connect ret=%d\n", ret_i); } +#if defined(WOLFSSL_EXPERIMENTAL_SETTINGS) + ESP_LOGW(TAG, "WOLFSSL_EXPERIMENTAL_SETTINGS is enabled"); +#endif + WOLFSSL_MSG("Create a WOLFSSL object"); /* Create a WOLFSSL object */ if ((ssl = wolfSSL_new(ctx)) == NULL) { - ESP_LOGE(TAG,"ERROR: failed to create WOLFSSL object\n"); + ESP_LOGE(TAG, "ERROR: failed to create WOLFSSL object\n"); + } + else { +#ifdef DEBUG_WOLFSSL + ESP_LOGI(TAG, "\nCreated WOLFSSL object:"); + ShowCiphers(ssl); + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "tls_smp_client_task heap @ %p = %d", + &this_heap, this_heap); +#endif +#if defined(WOLFSSL_HAVE_KYBER) + #if defined(WOLFSSL_KYBER1024) + ESP_LOGI(TAG, "WOLFSSL_HAVE_KYBER is enabled, setting key share: " + "WOLFSSL_P256_KYBER_LEVEL5"); + ret_i = wolfSSL_UseKeyShare(ssl, WOLFSSL_P521_KYBER_LEVEL5); + #elif defined(WOLFSSL_KYBER768) + ESP_LOGI(TAG, "WOLFSSL_HAVE_KYBER is enabled, setting key share: " + "WOLFSSL_P256_KYBER_LEVEL3"); + ret_i = wolfSSL_UseKeyShare(ssl, WOLFSSL_P256_KYBER_LEVEL3); + #elif defined(WOLFSSL_KYBER512) + /* This will typically be a low memory situation, such as ESP8266 */ + ESP_LOGI(TAG, "WOLFSSL_HAVE_KYBER is enabled, setting key share: " + "WOLFSSL_P256_KYBER_LEVEL1"); + ret_i = wolfSSL_UseKeyShare(ssl, WOLFSSL_P256_KYBER_LEVEL1); + #else + ESP_LOGW(TAG, "WOLFSSL_HAVE_KYBER enabled but no key size available."); + ret_i = ESP_FAIL; + #endif + if (ret_i == WOLFSSL_SUCCESS) { + ESP_LOGI(TAG, "UseKeyShare Kyber success"); + } + else { + ESP_LOGE(TAG, "UseKeyShare Kyber failed"); + } +#else + ESP_LOGI(TAG, "WOLFSSL_HAVE_KYBER is not enabled"); +#endif + } + +#if defined(WOLFSSL_SM2) + /* SM TLS1.3 Cipher needs to have key share explicitly set. */ + ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_SM2P256V1); + if (ret == WOLFSSL_SUCCESS) { + ESP_LOGI(TAG, "Successfully set WOLFSSL_ECC_SM2P256V1"); } + else { + ESP_LOGE(TAG, "FAILED to set WOLFSSL_ECC_SM2P256V1"); + } +#endif + /* when using atecc608a on esp32-wroom-32se */ - /* when using atecc608a on esp32-wroom-32se */ #if defined(WOLFSSL_ESPWROOM32SE) && defined(HAVE_PK_CALLBACKS) \ && defined(WOLFSSL_ATECC508A) atcatls_set_callbacks(ctx); @@ -242,50 +445,155 @@ atmel_set_slot_allocator(my_atmel_alloc, my_atmel_free); #endif #endif - +#ifdef DEBUG_WOLFSSL + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "tls_smp_client_task heap(2) @ %p = %d", + &this_heap, this_heap); +#endif /* Attach wolfSSL to the socket */ - wolfSSL_set_fd(ssl, sockfd); + ret_i = wolfSSL_set_fd(ssl, sockfd); + if (ret_i == WOLFSSL_SUCCESS) { + ESP_LOGI(TAG, "wolfSSL_set_fd success"); + } + else { + ESP_LOGE(TAG, "ERROR: failed wolfSSL_set_fd. Error: %d\n", ret_i); + } - WOLFSSL_MSG("Connect to wolfSSL on the server side"); - /* Connect to wolfSSL on the server side */ - if (wolfSSL_connect(ssl) != SSL_SUCCESS) { - ESP_LOGE(TAG,"ERROR: failed to connect to wolfSSL\n"); - } - - /* Get a message for the server from stdin */ - WOLFSSL_MSG("Message for server: "); - memset(buff, 0, sizeof(buff)); - - if(sendGet){ - printf("SSL connect ok, sending GET...\n"); - len = XSTRLEN(sndMsg); - strncpy(buff, sndMsg, len); + ESP_LOGI(TAG, "Connect to wolfSSL server..."); + ret_i = wolfSSL_connect(ssl); +#ifdef DEBUG_WOLFSSL + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "tls_smp_client_task heap(3) @ %p = %d", + &this_heap, this_heap); +#endif + if (ret_i == WOLFSSL_SUCCESS) { +#ifdef DEBUG_WOLFSSL + ShowCiphers(ssl); +#endif + ESP_LOGI(TAG, "Connect success! Sending message..."); + /* Get a message for the server from stdin */ + WOLFSSL_MSG("Message for server: "); + memset(buff, 0, sizeof(buff)); + + if (sendGet) { + len = XSTRLEN(sndMsg); + strncpy(buff, sndMsg, len); + } + else { + sprintf(buff, "Hello from Espressif wolfSSL TLS client!\n"); + len = strnlen(buff, sizeof(buff)); + } buff[len] = '\0'; - } else { - sprintf(buff, "message from esp32 tls client\n"); - len = strnlen(buff, sizeof(buff)); - } - /* Send the message to the server */ - if (wolfSSL_write(ssl, buff, len) != len) { - ESP_LOGE(TAG,"ERROR: failed to write\n"); - } - - /* Read the server data into our buff array */ - memset(buff, 0, sizeof(buff)); - if (wolfSSL_read(ssl, buff, sizeof(buff) - 1) == -1) { - ESP_LOGE(TAG,"ERROR: failed to read\n"); - } - - /* Print to stdout any data the server sends */ - printf("Server:"); - printf("%s", buff); - /* Cleanup and return */ - wolfSSL_free(ssl); /* Free the wolfSSL object */ + ESP_LOGI(TAG, "SSL connect ok, sending message:\n\n%s\n", buff); + + /* Send the message to the server */ + do { + err = 0; /* reset error */ + ret_i = wolfSSL_write(ssl, buff, len); + if (ret_i <= 0) { + err = wolfSSL_get_error(ssl, 0); + } + } while (err == WOLFSSL_ERROR_WANT_WRITE || + err == WOLFSSL_ERROR_WANT_READ); + + if (ret_i != len) { + ESP_LOGE(TAG, "ERROR: failed to write\n"); + } + else { + ESP_LOGI(TAG, "Message sent! Awaiting response..."); + } + + /* Read the server data into our buff array */ + memset(buff, 0, sizeof(buff)); + + do { + err = 0; /* reset error */ + ret_i =wolfSSL_read(ssl, buff, sizeof(buff)); + if (ret_i <= 0) { + err = wolfSSL_get_error(ssl, 0); + } + } while ((err == WOLFSSL_ERROR_WANT_READ) || + (err == WOLFSSL_ERROR_WANT_WRITE) ); + + if (ret_i < 0) { + ESP_LOGE(TAG, "ERROR: failed to read\n"); + } + + /* Show any data the server sends */ + ESP_LOGI(TAG, "Server response: \n\n%s\n", buff); + + ret_i = wolfSSL_shutdown(ssl); + while (ret_i == WOLFSSL_SHUTDOWN_NOT_DONE) { + ret_i = wolfSSL_shutdown(ssl); /* bidirectional shutdown */ + if (ret_i == WOLFSSL_SUCCESS) { + ESP_LOGI(TAG, "Bidirectional shutdown complete\n"); + break; + } + else if (ret_i != WOLFSSL_SHUTDOWN_NOT_DONE) { + ESP_LOGE(TAG, "Bidirectional shutdown failed\n"); + break; + } + } + if (ret_i != WOLFSSL_SUCCESS) { + ESP_LOGE(TAG, "Bidirectional shutdown failed\n"); + } + + } /* wolfSSL_connect(ssl) == WOLFSSL_SUCCESS) */ + else { + ESP_LOGE(TAG, "ERROR: failed to connect to wolfSSL. " + "Error: %d\n", ret_i); + } +#ifdef DEBUG_WOLFSSL + ShowCiphers(ssl); +#endif + + ESP_LOGI(TAG, "Cleanup and exit"); + wolfSSL_free(ssl); /* Release the wolfSSL object memory */ wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ close(sockfd); /* Close the connection to the server */ vTaskDelete(NULL); - return; /* Return reporting a success */ + return TLS_SMP_CLIENT_TASK_RET; +} + +#if defined(SINGLE_THREADED) + /* we don't initialize a single thread, so no init function here */ +#else +/* create task */ +WOLFSSL_ESP_TASK tls_smp_client_init(void* args) +{ + int ret; +#if ESP_IDF_VERSION_MAJOR >= 4 + TaskHandle_t _handle; +#else + xTaskHandle _handle; +#endif + /* See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html#functions */ + if (TLS_SMP_CLIENT_TASK_BYTES < (6 * 1024)) { + /* Observed approximately 6KB limit for the RTOS task stack size. + * Reminder parameter is bytes, not words as with generic FreeRTOS. */ + ESP_LOGW(TAG, "Warning: TLS_SMP_CLIENT_TASK_BYTES < 6KB"); + } +#ifndef WOLFSSL_SMALL_STACK + ESP_LOGW(TAG, "WARNING: WOLFSSL_SMALL_STACK is not defined. Consider " + "defining that to reduce embedded memory usage."); +#endif + + /* Note that despite vanilla FreeRTOS using WORDS for a parameter, + * Espressif uses BYTES for the task stack size here. + * See https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32/api-reference/system/freertos.html */ + ret = xTaskCreate(tls_smp_client_task, + TLS_SMP_CLIENT_TASK_NAME, + TLS_SMP_CLIENT_TASK_BYTES, + NULL, + TLS_SMP_CLIENT_TASK_PRIORITY, + &_handle); + + if (ret != pdPASS) { + ESP_LOGI(TAG, "Create thread %s failed.", TLS_SMP_CLIENT_TASK_NAME); + } + return TLS_SMP_CLIENT_TASK_RET; } +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,8 +1,8 @@ # # Main component makefile. # -# This Makefile can be left empty. By default, it will take the sources in the -# src/ directory, compile them and link them into lib(subdirectory_name).a -# in the build directory. This behaviour is entirely configurable, +# This Makefile can be left empty. By default, it will take the sources in the +# src/ directory, compile them and link them into lib(subdirectory_name).a +# in the build directory. This behavior is entirely configurable, # please read the ESP-IDF documents if you need to do this. # diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,95 @@ +/* client-tls.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _CLIENT_TLS_H_ +#define _CLIENT_TLS_H_ + +/* Local project, auto-generated configuration */ +#include "sdkconfig.h" + +#include +#include + +/* See main/Kconfig.projbuild for default configuration settings */ +#ifdef CONFIG_WOLFSSL_TARGET_HOST + #define TLS_SMP_TARGET_HOST "192.168.1.36" +#else + #define TLS_SMP_TARGET_HOST "192.168.1.41" +#endif + +#ifdef CONFIG_WOLFSSL_TARGET_PORT + #define TLS_SMP_DEFAULT_PORT CONFIG_WOLFSSL_TARGET_PORT +#else + #define TLS_SMP_DEFAULT_PORT 11111 +#endif + +#define TLS_SMP_CLIENT_TASK_NAME "tls_client_example" + +/* Reminder: Vanilla FreeRTOS is words, Espressif is bytes. */ +#if defined(WOLFSSL_ESP8266) + #if defined(WOLFSSL_HAVE_KYBER) + /* Minimum ESP8266 stack size = 10K with Kyber. + * Note there's a maximum not far away as Kyber needs heap + * and the total DRAM is typically only 80KB total. */ + #define TLS_SMP_CLIENT_TASK_BYTES (11 * 1024) + #else + /* Minimum ESP8266 stack size = 6K without Kyber */ + #define TLS_SMP_CLIENT_TASK_BYTES (6 * 1024) + #endif +#else + #if defined(WOLFSSL_HAVE_KYBER) + /* Minimum ESP32 stack size = 12K with Kyber enabled. */ + #define TLS_SMP_CLIENT_TASK_BYTES (12 * 1024) + #else + /* Minimum ESP32 stack size = 8K without Kyber */ + #define TLS_SMP_CLIENT_TASK_BYTES (8 * 1024) + #endif +#endif + +#define TLS_SMP_CLIENT_TASK_PRIORITY 8 + +#if defined(SINGLE_THREADED) + #define WOLFSSL_ESP_TASK int +#else + #include + #define WOLFSSL_ESP_TASK void +#endif + +typedef struct { + int port; + int loops; +} tls_args; + +/* Function to show the ciphers available / in use. */ +#if defined(DEBUG_WOLFSSL) + int ShowCiphers(WOLFSSL* ssl); +#endif + +/* This is the TLS Client function, possibly in an RTOS thread. */ +WOLFSSL_ESP_TASK tls_smp_client_task(void* args); + +/* init will create an RTOS task, otherwise server is simply function call. */ +#if defined(SINGLE_THREADED) + /* no init neded */ +#else + WOLFSSL_ESP_TASK tls_smp_client_init(void* args); +#endif + +#endif /* _SERVER_TLS_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +/* wolfssl_client main.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,55 @@ +/* time_helper.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* common Espressif time_helper v5.6.3.001 */ + +#ifndef _TIME_HELPER_H_ +#define _TIME_HELPER_H_ + +/* ESP-IDF uses a 64-bit signed integer to represent time_t starting from release v5.0 + * See: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#year-2036-and-2038-overflow-issues + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* a function to show the current data and time */ +int esp_show_current_datetime(void); + +/* worst case, if GitHub time not available, used fixed time */ +int set_fixed_default_time(void); + +/* set time from string (e.g. GitHub commit time) */ +int set_time_from_string(const char* time_buffer); + +/* set time from NTP servers, + * also initially calls set_fixed_default_time or set_time_from_string */ +int set_time(void); + +/* wait NTP_RETRY_COUNT seconds before giving up on NTP time */ +int set_time_wait_for_ntp(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* #ifndef _TIME_HELPER_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* user_settings.h +/* wifi_connect.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,26 +18,116 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -#ifndef _TLS_WIFI_H_ -#define _TLS_WIFI_H_ +#ifndef _WIFI_CONNECT_H_ +#define _WIFI_CONNECT_H_ -#include "esp_idf_version.h" -#include "esp_log.h" -#include "esp_wifi.h" -#if ESP_IDF_VERSION_MAJOR >= 4 - #include "esp_event.h" -#else - #include "esp_event_loop.h" +/* ESP lwip */ +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY + +#define TLS_SMP_WIFI_SSID CONFIG_WIFI_SSID +#define TLS_SMP_WIFI_PASS CONFIG_WIFI_PASSWORD + +#define USE_WIFI_EXAMPLE +#ifdef USE_WIFI_EXAMPLE + #include "esp_netif.h" + #include "protocol_examples_common.h" /* see project CMakeLists.txt */ #endif -#define DEFAULT_PORT 11111 +/** + ****************************************************************************** + ****************************************************************************** + ** USER APPLICATION SETTINGS BEGIN + ****************************************************************************** + ****************************************************************************** + **/ -#define TLS_SMP_CLIENT_TASK_NAME "tls_client_example" -#define TLS_SMP_CLIENT_TASK_WORDS 10240 -#define TLS_SMP_CLIENT_TASK_PRIORITY 8 +/* when using a private config with plain text passwords, + * file my_private_config.h should be excluded from git updates */ +/* #define USE_MY_PRIVATE_CONFIG */ -#define TLS_SMP_WIFI_SSID CONFIG_WIFI_SSID -#define TLS_SMP_WIFI_PASS CONFIG_WIFI_PASSWORD -#define TLS_SMP_TARGET_HOST CONFIG_TARGET_HOST +/* Note that IntelliSense may not work properly in the next section for the + * Espressif SDK 3.4 on the ESP8266. Macros should still be defined. + * See the project-level Makefile. Example found in: + * https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/template + * + * The USE_MY_PRIVATE_[OS]_CONFIG is typically an environment variable that + * triggers the make (not cmake) to add compiler defines. + */ +#if defined(USE_MY_PRIVATE_WINDOWS_CONFIG) + #include "/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_WSL_CONFIG) + #include "/mnt/c/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_LINUX_CONFIG) + #include "~/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_MAC_CONFIG) + #include "~/Documents/my_private_config.h" +#elif defined(USE_MY_PRIVATE_CONFIG) + /* This section works best with cmake & non-environment variable setting */ + #if defined(WOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS) + #define WOLFSSL_CMAKE + #include "/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_WINDOWS) + #define WOLFSSL_MAKE + #include "/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_WSL) + #define WOLFSSL_CMAKE + #include "/mnt/c/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_WSL) + #define WOLFSSL_MAKE + #include "/mnt/c/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_LINUX) + #define WOLFSSL_CMAKE + #include "~/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_LINUX) + #define WOLFSSL_MAKE + #include "~/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_APPLE) + #include "~/Documents/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_APPLE) + #define WOLFSSL_MAKE + #include "~/Documents/my_private_config.h" + #elif defined(OS_WINDOWS) + #include "/workspace/my_private_config.h" + #else + /* Edit as needed for your private config: */ + #warning "default private config using /workspace/my_private_config.h" + #include "/workspace/my_private_config.h" + #endif +#else + /* + ** The examples use WiFi configuration that you can set via project + ** configuration menu + ** + ** If you'd rather not, just change the below entries to strings with + ** the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" + */ + #if defined(CONFIG_ESP_WIFI_SSID) + /* tyically from ESP32 with ESP-IDF v4 ot v5 */ + #define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID + #elif defined(CONFIG_EXAMPLE_WIFI_SSID) + /* tyically from ESP8266 rtos-sdk/v3.4 */ + #define EXAMPLE_ESP_WIFI_SSID CONFIG_EXAMPLE_WIFI_SSID + #else + #define EXAMPLE_ESP_WIFI_SSID "MYSSID_WIFI_CONNECT" + #endif + + #if defined(CONFIG_ESP_WIFI_PASSWORD) + /* tyically from ESP32 with ESP-IDF v4 or v5 */ + #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD + #elif defined(CONFIG_EXAMPLE_WIFI_SSID) + /* tyically from ESP8266 rtos-sdk/v3.4 */ + #define EXAMPLE_ESP_WIFI_PASS CONFIG_EXAMPLE_WIFI_PASSWORD + #else + #define EXAMPLE_ESP_WIFI_PASS "MYPASSWORD_WIFI_CONNECT" + #endif #endif + +/* ESP lwip */ +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY + +int wifi_init_sta(void); + +int wifi_show_ip(void); + +#endif /* _WIFI_CONNECT_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,305 @@ +/* main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include "sdkconfig.h" +#include "main.h" + +/* ESP specific */ +#include +#include +#include + +/* wolfSSL */ +/* Always include wolfcrypt/settings.h before any other wolfSSL file. */ +/* Reminder: settings.h pulls in user_settings.h; don't include it here */ +#include +#include +#ifndef WOLFSSL_ESPIDF + #warning "Problem with wolfSSL user_settings." + #warning "Check components/wolfssl/include" +#endif + +/* this project */ +#include "client-tls.h" +#include "time_helper.h" + +#ifndef CONFIG_IDF_TARGET_ESP32H2 + /* There's no WiFi on ESP32-H2. + * For wired ethernet, see: + * https://github.com/wolfSSL/wolfssl-examples/tree/master/ESP32/TLS13-ENC28J60-client */ + #include "wifi_connect.h" + /* + * Note ModBus TCP cannot be disabled on ESP8266 tos-sdk/v3.4 + * See https://github.com/espressif/esp-modbus/issues/2 + */ +#endif + +#ifdef WOLFSSL_TRACK_MEMORY + #include +#endif + +static const char* TAG = "main"; + +#if defined(WOLFSSL_ESPWROOM32SE) && defined(HAVE_PK_CALLBACKS) \ + && defined(WOLFSSL_ATECC508A) + +#include "wolfssl/wolfcrypt/port/atmel/atmel.h" + +/* when you want to use a custom slot allocation */ +/* enable the definition CUSTOM_SLOT_ALLOCATION. */ + +#if defined(CUSTOM_SLOT_ALLOCATION) + +static byte mSlotList[ATECC_MAX_SLOT]; + +int atmel_set_slot_allocator(atmel_slot_alloc_cb alloc, atmel_slot_dealloc_cb dealloc); + +/* initialize slot array */ +void my_atmel_slotInit() +{ + int i; + for(i = 0;i < ATECC_MAX_SLOT;i++) { + mSlotList[i] = ATECC_INVALID_SLOT; + } +} + +/* allocate slot depending on slotType */ +int my_atmel_alloc(int slotType) +{ + int i, slot = -1; + + switch(slotType){ + case ATMEL_SLOT_ENCKEY: + slot = 4; + break; + case ATMEL_SLOT_DEVICE: + slot = 0; + break; + case ATMEL_SLOT_ECDHE: + slot = 0; + break; + case ATMEL_SLOT_ECDHE_ENC: + slot = 4; + break; + case ATMEL_SLOT_ANY: + for(i = 0;i < ATECC_MAX_SLOT;i++){ + if(mSlotList[i] == ATECC_INVALID_SLOT){ + slot = i; + break; + } + } + } + + return slot; +} + +/* free slot array */ +void my_atmel_free(int slotId) +{ + if(slotId >= 0 && slotId < ATECC_MAX_SLOT){ + mSlotList[slotId] = ATECC_INVALID_SLOT; + } +} +#endif /* CUSTOM_SLOT_ALLOCATION */ +#endif /* WOLFSSL_ESPWROOM32SE && HAVE_PK_CALLBACK && WOLFSSL_ATECC508A */ + +/* Entry for FreeRTOS */ +void app_main(void) +{ + int stack_start = 0; + int this_heap = 0; + esp_err_t ret = 0; + ESP_LOGI(TAG, "---------------- wolfSSL TLS Client Example ------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); +#ifdef ESP_SDK_MEM_LIB_VERSION + sdk_init_meminfo(); +#endif +#ifdef ESP_TASK_MAIN_STACK + ESP_LOGI(TAG, "ESP_TASK_MAIN_STACK: %d", ESP_TASK_MAIN_STACK); +#endif +#ifdef TASK_EXTRA_STACK_SIZE + ESP_LOGI(TAG, "TASK_EXTRA_STACK_SIZE: %d", TASK_EXTRA_STACK_SIZE); +#endif + +#ifdef SINGLE_THREADED + ESP_LOGI(TAG, "Single threaded"); +#else + ESP_LOGI(TAG, "CONFIG_ESP_MAIN_TASK_STACK_SIZE = %d bytes (%d words)", + CONFIG_ESP_MAIN_TASK_STACK_SIZE, + (int)(CONFIG_ESP_MAIN_TASK_STACK_SIZE / sizeof(void*))); + + #ifdef INCLUDE_uxTaskGetStackHighWaterMark + { + /* Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in bytes not words, unlike + * vanilla FreeRTOS) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html + */ + stack_start = uxTaskGetStackHighWaterMark(NULL); + #ifdef ESP_SDK_MEM_LIB_VERSION + { + sdk_var_whereis("stack_start", &stack_start); + } + #endif + + ESP_LOGI(TAG, "Stack Start HWM: %d bytes", stack_start); + } + #endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +#endif /* SINGLE_THREADED */ + +#ifdef HAVE_VERSION_EXTENDED_INFO + esp_ShowExtendedSystemInfo(); +#endif + + /* Set time for cert validation. + * Some lwIP APIs, including SNTP functions, are not thread safe. */ + ret = set_time(); /* need to setup NTP before WiFi */ + + /* Optionally erase flash */ + /* ESP_ERROR_CHECK(nvs_flash_erase()); */ + +#ifdef FOUND_PROTOCOL_EXAMPLES_DIR + ESP_LOGI(TAG, "FOUND_PROTOCOL_EXAMPLES_DIR active, using example code."); + ESP_ERROR_CHECK(nvs_flash_init()); + + #if defined(CONFIG_IDF_TARGET_ESP32H2) + ESP_LOGE(TAG, "There's no WiFi on ESP32-H2."); + #else + #ifdef CONFIG_EXAMPLE_WIFI_SSID + if (XSTRCMP(CONFIG_EXAMPLE_WIFI_SSID, "myssid") == 0) { + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID is myssid."); + ESP_LOGW(TAG, " Do you have a WiFi AP called myssid, or "); + ESP_LOGW(TAG, " did you forget the ESP-IDF configuration?"); + } + #else + #define CONFIG_EXAMPLE_WIFI_SSID "myssid" + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID not defined."); + #endif + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + ESP_ERROR_CHECK(example_connect()); + #endif +#else + ESP_ERROR_CHECK(nvs_flash_init()); + + /* Initialize NVS */ + ret = nvs_flash_init(); + #if defined(CONFIG_IDF_TARGET_ESP8266) + { + if (ret == ESP_ERR_NVS_NO_FREE_PAGES) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + } + #else + { + /* Non-ESP8266 initialization is slightly different */ + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || + ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + } + #endif /* else not CONFIG_IDF_TARGET_ESP8266 */ + ESP_ERROR_CHECK(ret); + + #if defined(CONFIG_IDF_TARGET_ESP32H2) + ESP_LOGE(TAG, "There's no WiFi on ESP32-H2. "); + #else + /* Initialize WiFi */ + ESP_LOGI(TAG, "ESP_WIFI_MODE_STA"); + ret = wifi_init_sta(); + while (ret != 0) { + ESP_LOGI(TAG, "Waiting..."); + vTaskDelay(60000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Trying WiFi again..."); + ret = wifi_init_sta(); + } + #endif /* else not CONFIG_IDF_TARGET_ESP32H2 */ +#endif /* else FOUND_PROTOCOL_EXAMPLES_DIR not found */ + + /* Once we are connected to the network, start & wait for NTP time */ + ret = set_time_wait_for_ntp(); + + if (ret < -1) { + /* a value of -1 means there was no NTP server, so no need to wait */ + ESP_LOGI(TAG, "Waiting 10 more seconds for NTP to complete." ); + vTaskDelay(10000 / portTICK_PERIOD_MS); /* brute-force solution */ + esp_show_current_datetime(); + } + +#if defined(SINGLE_THREADED) + /* just call the task */ + tls_smp_client_task((void*)NULL); +#else + tls_args args[1] = {0}; + /* start a thread with the task */ + args[0].loops = 10; + args[0].port = 11111; + + /* HWM is maximum amount of stack space that has been unused, in bytes + * not words (unlike vanilla freeRTOS). */ + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "Initial Stack Used (before wolfSSL Server): %d bytes", + CONFIG_ESP_MAIN_TASK_STACK_SIZE + - (uxTaskGetStackHighWaterMark(NULL)) + ); + ESP_LOGI(TAG, "Starting TLS Client task ...\n"); + + ESP_LOGI(TAG, "main tls_smp_client_init heap @ %p = %d", + &this_heap, this_heap); + tls_smp_client_init(args); +/* optional additional client threads + tls_smp_client_init(args); + tls_smp_client_init(args); + tls_smp_client_init(args); + tls_smp_client_init(args); + tls_smp_client_init(args); + tls_smp_client_init(args); + tls_smp_client_init(args); +*/ +#endif + + /* Done */ +#ifdef SINGLE_THREADED + ESP_LOGV(TAG, "\n\nDone!\n\n"); + while (1); +#else + ESP_LOGV(TAG, "\n\nvTaskDelete...\n\n"); + vTaskDelete(NULL); + /* done */ + while (1) { + ESP_LOGV(TAG, "\n\nLoop...\n\n"); + #ifdef INCLUDE_uxTaskGetStackHighWaterMark + ESP_LOGI(TAG, "Stack HWM: %d", uxTaskGetStackHighWaterMark(NULL)); + + ESP_LOGI(TAG, "Stack used: %d", CONFIG_ESP_MAIN_TASK_STACK_SIZE + - (uxTaskGetStackHighWaterMark(NULL) )); + #endif + vTaskDelay(60000); + } /* done while */ +#endif /* else not SINGLE_THREADED */ + +} /* app_main */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,382 @@ +/* time_helper.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* See https://tf.nist.gov/tf-cgi/servers.cgi */ + +/* common Espressif time_helper v5.6.6.001 */ +#include "sdkconfig.h" +#include "time_helper.h" + +#include +#include + +#if defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) + #if (ESP_IDF_VERSION_MAJOR == 5) && (ESP_IDF_VERSION_MINOR >= 1) + #define HAS_ESP_NETIF_SNTP 1 + #include + #include + #else + #include + #include + #endif +#else + /* TODO Consider non ESP-IDF environments */ +#endif + +/* ESP-IDF uses a 64-bit signed integer to represent time_t starting from release v5.0 + * See: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#year-2036-and-2038-overflow-issues + */ + +/* see https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html */ +#ifndef TIME_ZONE + /* + * PST represents Pacific Standard Time. + * +8 specifies the offset from UTC (Coordinated Universal Time), indicating + * that Pacific Time is UTC-8 during standard time. + * PDT represents Pacific Daylight Time. + * M3.2.0 indicates that Daylight Saving Time (DST) starts on the + * second (2) Sunday (0) of March (3). + * M11.1.0 indicates that DST ends on the first (1) Sunday (0) of November (11) + */ + #define TIME_ZONE "PST+8PDT,M3.2.0,M11.1.0" +#endif /* not defined: TIME_ZONE, so we are setting our own */ + +#define NTP_RETRY_COUNT 10 + +/* NELEMS(x) number of elements + * To determine the number of elements in the array, we can divide the total + * size of the array by the size of the array element. + * See https://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my-array-in-c + **/ +#define NELEMS(x) ( (int)(sizeof(x) / sizeof((x)[0])) ) + +/* See also CONFIG_LWIP_SNTP_MAX_SERVERS in sdkconfig */ +#define NTP_SERVER_LIST ( (char*[]) { \ + "pool.ntp.org", \ + "time.nist.gov", \ + "utcnist.colorado.edu" \ + } \ + ) +/* #define NTP_SERVER_COUNT using NELEMS: + * + * (int)(sizeof(NTP_SERVER_LIST) / sizeof(NTP_SERVER_LIST[0])) + */ +#define NTP_SERVER_COUNT NELEMS(NTP_SERVER_LIST) + +#ifndef CONFIG_LWIP_SNTP_MAX_SERVERS + /* We should find max value in sdkconfig, if not set it to our count:*/ + #define CONFIG_LWIP_SNTP_MAX_SERVERS NTP_SERVER_COUNT +#endif + +char* ntpServerList[NTP_SERVER_COUNT] = NTP_SERVER_LIST; + +const static char* TAG = "time_helper"; + +/* our NTP server list is global info */ +extern char* ntpServerList[NTP_SERVER_COUNT]; + +/* Show the current date and time */ +int esp_show_current_datetime(void) +{ + time_t now; + char strftime_buf[64]; + struct tm timeinfo; + + time(&now); + setenv("TZ", TIME_ZONE, 1); + tzset(); + + localtime_r(&now, &timeinfo); + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + ESP_LOGI(TAG, "The current date/time is: %s", strftime_buf); + return ESP_OK; +} + +/* the worst-case scenario is a hard-coded date/time */ +int set_fixed_default_time(void) +{ + /* ideally, we'd like to set time from network, + * but let's set a default time, just in case */ + struct tm timeinfo = { + .tm_year = 2024 - 1900, + .tm_mon = 3, + .tm_mday = 01, + .tm_hour = 13, + .tm_min = 01, + .tm_sec = 05 + }; + struct timeval now; + time_t interim_time; + int ret = -1; + + /* set interim static time */ + interim_time = mktime(&timeinfo); + + ESP_LOGI(TAG, "Adjusting time from fixed value"); + now = (struct timeval){ .tv_sec = interim_time }; + ret = settimeofday(&now, NULL); + ESP_LOGI(TAG, "settimeofday result = %d", ret); + return ret; +} + +/* probably_valid_time_string(s) + * + * some sanity checks on time string before calling sscanf() + * + * returns 0 == ESP_OK == Success if str is likely a valid time. + * -1 == ESP_FAIL otherwise + */ +int probably_valid_time_string(const char* str) +{ + int ret = ESP_OK; + size_t length = 0; + size_t spaces = 0; + size_t colons = 0; + + while (str[length] != '\0') { + if (str[length] == ' ') { + spaces++; + } + if (str[length] == ':') { + colons++; + } + length++; + } + + if ((length > 32) || (spaces < 4) || (spaces > 5) || (colons > 2)) { + ret = ESP_FAIL; + ESP_LOGE(TAG, "ERROR, failed time sanity check: %s", str); + } + return ret; +} + +/* set_time_from_string(s) + * + * returns 0 = success if able to set the time from the provided string + * error for any other value, typically -1 */ +int set_time_from_string(const char* time_buffer) +{ + /* expecting github default formatting: 'Thu Aug 31 12:41:45 2023 -0700' */ + char offset[28]; /* large arrays, just in case there's still bad data */ + char day_str[28]; + char month_str[28]; + const char *format = "%3s %3s %d %d:%d:%d %d %s"; + struct tm this_timeinfo; + struct timeval now; + time_t interim_time; + int day, year, hour, minute, second; + int quote_offset = 0; + int ret = 0; + + /* perform some basic sanity checkes */ + ret = probably_valid_time_string(time_buffer); + if (ret == ESP_OK) { + /* we are expecting the string to be encapsulated in single quotes */ + if (*time_buffer == 0x27) { + quote_offset = 1; + } + + ret = sscanf(time_buffer + quote_offset, + format, + day_str, month_str, + &day, &hour, &minute, &second, &year, &offset); + + if (ret == 8) { + /* we found a match for all componets */ + + const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; + + for (int i = 0; i < 12; i++) { + if (strcmp(month_str, months[i]) == 0) { + this_timeinfo.tm_mon = i; + break; + } + } + + this_timeinfo.tm_mday = day; + this_timeinfo.tm_hour = hour; + this_timeinfo.tm_min = minute; + this_timeinfo.tm_sec = second; + this_timeinfo.tm_year = year - 1900; /* Years since 1900 */ + + interim_time = mktime(&this_timeinfo); + now = (struct timeval){ .tv_sec = interim_time }; + ret = settimeofday(&now, NULL); + ESP_LOGI(TAG, "Time updated to %s", time_buffer); + } + else { + ESP_LOGE(TAG, "Failed to convert \"%s\" to a tm date.", + time_buffer); + ESP_LOGI(TAG, "Trying fixed date that was hard-coded...."); + set_fixed_default_time(); + ret = ESP_FAIL; + } + } + + return ret; +} + +/* set time; returns 0 if succecssfully configured with NTP */ +int set_time(void) +{ +#ifndef NTP_SERVER_COUNT + ESP_LOGW(TAG, "Warning: no sntp server names defined. " + "Setting to empty list"); + #define NTP_SERVER_COUNT 0 + #warning "NTP not properly configured" +#endif /* not defined: NTP_SERVER_COUNT */ + +#ifdef HAS_ESP_NETIF_SNTP + #if CONFIG_LWIP_SNTP_MAX_SERVERS > 1 + esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG_MULTIPLE( + NTP_SERVER_COUNT, + ESP_SNTP_SERVER_LIST(ntpServerList[0]) + ); + #else + esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG(ntpServerList[0]); + #endif /* CONFIG_LWIP_SNTP_MAX_SERVERS > 1 */ +#endif /* HAS_ESP_NETIF_SNTP */ + + int ret = 0; + int i = 0; /* counter for time servers */ + + ESP_LOGI(TAG, "Setting the time. Startup time:"); + esp_show_current_datetime(); + +#ifdef LIBWOLFSSL_VERSION_GIT_HASH_DATE + /* initialy set a default approximate time from recent git commit */ + ESP_LOGI(TAG, "Found git hash date, attempting to set system date: %s", + LIBWOLFSSL_VERSION_GIT_HASH_DATE); + set_time_from_string(LIBWOLFSSL_VERSION_GIT_HASH_DATE"\0"); + esp_show_current_datetime(); + + ret = -4; +#else + /* otherwise set a fixed time that was hard coded */ + set_fixed_default_time(); + esp_show_current_datetime(); + ret = -3; +#endif + +#ifdef CONFIG_SNTP_TIME_SYNC_METHOD_SMOOTH + config.smooth_sync = true; +#endif + + if (NTP_SERVER_COUNT) { + /* next, let's setup NTP time servers + * + * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#sntp-time-synchronization + * + * WARNING: do not set operating mode while SNTP client is running! + */ + /* TODO Consider esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); */ + sntp_setoperatingmode(SNTP_OPMODE_POLL); + if (NTP_SERVER_COUNT > CONFIG_LWIP_SNTP_MAX_SERVERS) { + ESP_LOGW(TAG, "WARNING: %d NTP Servers defined, but " + "CONFIG_LWIP_SNTP_MAX_SERVERS = %d", + NTP_SERVER_COUNT,CONFIG_LWIP_SNTP_MAX_SERVERS); + } + ESP_LOGI(TAG, "sntp_setservername:"); + for (i = 0; i < CONFIG_LWIP_SNTP_MAX_SERVERS; i++) { + const char* thisServer = ntpServerList[i]; + if (strncmp(thisServer, "\x00", 1) == 0) { + /* just in case we run out of NTP servers */ + break; + } + ESP_LOGI(TAG, "%s", thisServer); + sntp_setservername(i, thisServer); + ret = ESP_OK; + } + #ifdef HAS_ESP_NETIF_SNTP + ret = esp_netif_sntp_init(&config); + #else + ESP_LOGW(TAG,"Warning: Consider upgrading ESP-IDF to take advantage " + "of updated SNTP libraries"); + #endif + if (ret == ESP_OK) { + ESP_LOGV(TAG, "Successfully called esp_netif_sntp_init"); + } + else { + ESP_LOGE(TAG, "ERROR: esp_netif_sntp_init return = %d", ret); + } + + sntp_init(); + switch (ret) { + case ESP_ERR_INVALID_STATE: + break; + default: + break; + } + ESP_LOGI(TAG, "sntp_init done."); + } + else { + ESP_LOGW(TAG, "No sntp time servers found."); + ret = -1; + } + + esp_show_current_datetime(); + ESP_LOGI(TAG, "time helper existing with result = %d", ret); + return ret; +} + +/* wait for NTP to actually set the time */ +int set_time_wait_for_ntp(void) +{ + int ret = 0; +#ifdef HAS_ESP_NETIF_SNTP + int ntp_retry = 0; + const int ntp_retry_count = NTP_RETRY_COUNT; + + ret = esp_netif_sntp_start(); + + ret = esp_netif_sntp_sync_wait(500 / portTICK_PERIOD_MS); +#else + ESP_LOGW(TAG, "HAS_ESP_NETIF_SNTP not defined"); +#endif /* HAS_ESP_NETIF_SNTP */ + esp_show_current_datetime(); + +#ifdef HAS_ESP_NETIF_SNTP + while (ret == ESP_ERR_TIMEOUT && (ntp_retry++ < ntp_retry_count)) { + ret = esp_netif_sntp_sync_wait(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Waiting for NTP to sync time... (%d/%d)", + ntp_retry, + ntp_retry_count); + esp_show_current_datetime(); + } +#endif /* HAS_ESP_NETIF_SNTP */ + +#ifdef TIME_ZONE + setenv("TZ", TIME_ZONE, 1); + tzset(); +#endif + + if (ret == ESP_OK) { + ESP_LOGI(TAG, "Successfully set time via NTP servers."); + } + else { + ESP_LOGW(TAG, "Warning: Failed to set time with NTP: " + "result = 0x%0x: %s", + ret, esp_err_to_name(ret)); + } + return ret; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* wifi_connect.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,93 +18,170 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -/*ESP specific */ -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/event_groups.h" #include "wifi_connect.h" -#include "lwip/sockets.h" -#include "lwip/netdb.h" -#include "lwip/apps/sntp.h" -#include "nvs_flash.h" + +/* FreeRTOS */ +#include +#include +#include + +/* Espressif */ +#include +#include +#include /* wolfSSL */ #include -#include #include +#include #ifndef WOLFSSL_ESPIDF - #warning "problem with wolfSSL user_settings. Check components/wolfssl/include" + #warning "Problem with wolfSSL user_settings." + #warning "Check components/wolfssl/include" #endif -#if ESP_IDF_VERSION_MAJOR >= 4 +/* When there's too little heap, WiFi quietly refuses to connect */ +#define WIFI_LOW_HEAP_WARNING 21132 + +#if defined(CONFIG_IDF_TARGET_ESP8266) +#elif ESP_IDF_VERSION_MAJOR >= 5 + /* example path set in cmake file */ +#elif ESP_IDF_VERSION_MAJOR >= 4 #include "protocol_examples_common.h" #else const static int CONNECTED_BIT = BIT0; static EventGroupHandle_t wifi_event_group; #endif -/* proto-type */ -extern void tls_smp_client_task(); -static void tls_smp_client_init(); - -const static char *TAG = "tls_client"; +#if defined(CONFIG_IDF_TARGET_ESP8266) -static void set_time() -{ - /* set dummy wallclock time. */ - struct timeval utctime; - struct timezone tz; - struct strftime_buf; - time_t now; - struct tm timeinfo; - char strftime_buf[64]; - /* please update the time if seeing unknown failure when loading cert. */ - /* this could cause TLS communication failure due to time expiration */ - /* incleasing 31536000 seconds is close to spend 356 days. */ - utctime.tv_sec = 1645797600; /* dummy time: Fri 25 Feb 2022 02:00:00 2022 */ - utctime.tv_usec = 0; - tz.tz_minuteswest = 0; - tz.tz_dsttime = 0; - - settimeofday(&utctime, &tz); +#elif defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) + #if ESP_IDF_VERSION_MAJOR >= 4 + /* likely using examples, see wifi_connect.h */ + #else + /* TODO - still supporting pre V4 ? */ + const static int CONNECTED_BIT = BIT0; + static EventGroupHandle_t wifi_event_group; + #endif + #if (ESP_IDF_VERSION_MAJOR == 5) + #define HAS_WPA3_FEATURES + #else + #undef HAS_WPA3_FEATURES + #endif +#else + /* TODO Consider pre IDF v5? */ +#endif - time(&now); - localtime_r(&now, &timeinfo); +/* breadcrumb prefix for logging */ +const static char *TAG = "wifi_connect"; - strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); - ESP_LOGI(TAG, "The current date/time is: %s", strftime_buf); +#if defined(CONFIG_IDF_TARGET_ESP8266) +#ifndef CONFIG_ESP_MAX_STA_CONN + #define CONFIG_ESP_MAX_STA_CONN 4 +#endif +#define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN -#if ESP_IDF_VERSION_MAJOR < 4 - /* wait until wifi connect */ - xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, - false, true, portMAX_DELAY); +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 +#ifndef CONFIG_ESP_MAXIMUM_RETRY + #define CONFIG_ESP_MAXIMUM_RETRY 5 #endif - /* now we start client tasks. */ - tls_smp_client_init(); +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; +static int s_retry_num = 0; + +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY +static void event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); + } else { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG,"connect to the AP fail"); + } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI(TAG, "got ip:%s", + ip4addr_ntoa(&event->ip_info.ip)); + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } } -/* create task */ -static void tls_smp_client_init(void) +int wifi_init_sta(void) { - int ret; -#if ESP_IDF_VERSION_MAJOR >= 4 - TaskHandle_t _handle; -#else - xTaskHandle _handle; -#endif - /* http://esp32.info/docs/esp_idf/html/dd/d3c/group__xTaskCreate.html */ - ret = xTaskCreate(tls_smp_client_task, - TLS_SMP_CLIENT_TASK_NAME, - TLS_SMP_CLIENT_TASK_WORDS, - NULL, - TLS_SMP_CLIENT_TASK_PRIORITY, - &_handle); + word32 this_heap; + + s_wifi_event_group = xEventGroupCreate(); + + tcpip_adapter_init(); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL)); + ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL)); + + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_ESP_WIFI_SSID, + .password = EXAMPLE_ESP_WIFI_PASS + }, + }; - if (ret != pdPASS) { - ESP_LOGI(TAG, "create thread %s failed", TLS_SMP_CLIENT_TASK_NAME); + /* Setting a password implies station will connect to all security modes including WEP/WPA. + * However these modes are deprecated and not advisable to be used. Incase your Access point + * doesn't support WPA2, these mode can be enabled by commenting below line */ + + if (strlen((char *)wifi_config.sta.password)) { + wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; } + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); + ESP_ERROR_CHECK(esp_wifi_start() ); + + ESP_LOGI(TAG, "wifi_init_sta finished. Connecting..."); + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "this heap = %d", this_heap); + if (this_heap < WIFI_LOW_HEAP_WARNING) { + ESP_LOGW(TAG, "Warning: WiFi low heap: %d", WIFI_LOW_HEAP_WARNING); + } + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum + * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + ESP_LOGI(TAG, "xEventGroupWaitBits finished."); + /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually + * happened. */ + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "connected to ap SSID:%s", + EXAMPLE_ESP_WIFI_SSID); + } else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", + EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); + } else { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } + + ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler)); + ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler)); + vEventGroupDelete(s_wifi_event_group); + return ESP_OK; } -#if ESP_IDF_VERSION_MAJOR < 4 + +#elif ESP_IDF_VERSION_MAJOR < 4 /* event handler for wifi events */ static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) { @@ -121,7 +198,7 @@ ESP_LOGI(TAG, "got ip:%s", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip)); #endif - /* http://esp32.info/docs/esp_idf/html/dd/d08/group__xEventGroupSetBits.html */ + /* see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html */ xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); break; case SYSTEM_EVENT_STA_DISCONNECTED: @@ -133,99 +210,185 @@ } return ESP_OK; } -#endif -/* entry point */ -void app_main(void) -{ - ESP_LOGI(TAG, "Start app_main..."); - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "CONFIG_IDF_TARGET = %s", CONFIG_IDF_TARGET); - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_STRING = %s", LIBWOLFSSL_VERSION_STRING); - -#if defined(WOLFSSL_MULTI_INSTALL_WARNING) - ESP_LOGI(TAG, ""); - ESP_LOGI(TAG, "WARNING: Multiple wolfSSL installs found."); - ESP_LOGI(TAG, "Check ESP-IDF and local project [components] directory."); - ESP_LOGI(TAG, ""); -#endif - -#if defined(LIBWOLFSSL_VERSION_GIT_HASH) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH = %s", LIBWOLFSSL_VERSION_GIT_HASH); -#endif - -#if defined(LIBWOLFSSL_VERSION_GIT_SHORT_HASH ) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_SHORT_HASH = %s", LIBWOLFSSL_VERSION_GIT_SHORT_HASH); -#endif - -#if defined(LIBWOLFSSL_VERSION_GIT_HASH_DATE) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH_DATE = %s", LIBWOLFSSL_VERSION_GIT_HASH_DATE); -#endif - +#else - /* some interesting settings are target specific (ESP32, -C3, -S3, etc */ -#if defined(CONFIG_IDF_TARGET_ESP32C3) - /* not available for C3 at this time */ -#elif defined(CONFIG_IDF_TARGET_ESP32S3) - ESP_LOGI(TAG, "CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); +#ifdef CONFIG_ESP_MAXIMUM_RETRY + #define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY #else - ESP_LOGI(TAG, "CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); + #define CONFIG_ESP_MAXIMUM_RETRY 5 #endif - /* all platforms: stack high water mark check */ - ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); +#if CONFIG_ESP_WIFI_AUTH_OPEN +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN +#elif CONFIG_ESP_WIFI_AUTH_WEP +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP +#elif CONFIG_ESP_WIFI_AUTH_WPA_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA2_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA_WPA2_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA3_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA2_WPA3_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK +#elif CONFIG_ESP_WIFI_AUTH_WAPI_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK +#endif + +#ifndef ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD + #define CONFIG_ESP_WIFI_AUTH_WPA2_PSK 1 + #define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD CONFIG_ESP_WIFI_AUTH_WPA2_PSK +#endif + +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; + +/* The event group allows multiple bits for each event, but we only care about two events: + * - we are connected to the AP with an IP + * - we failed to connect after the maximum amount of retries */ +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 + + +static int s_retry_num = 0; +ip_event_got_ip_t* event; + + +static void event_handler(void* arg, + esp_event_base_t event_base, + int32_t event_id, + void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } + else if (event_base == WIFI_EVENT && + event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); + } + else { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG, "connect to the AP fail"); + } + else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + event = (ip_event_got_ip_t*) event_data; + wifi_show_ip(); + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} +int wifi_init_sta(void) +{ + int ret = ESP_OK; - ESP_ERROR_CHECK(nvs_flash_init()); + s_wifi_event_group = xEventGroupCreate(); - ESP_LOGI(TAG, "Initialize wifi"); -#if (ESP_IDF_VERSION_MAJOR == 4 && ESP_IDF_VERSION_MINOR >= 1) || \ - (ESP_IDF_VERSION_MAJOR >= 5) - esp_netif_init(); -#else - tcpip_adapter_init(); -#endif + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_create_default_wifi_sta(); - /* */ -#if ESP_IDF_VERSION_MAJOR >= 4 - ESP_ERROR_CHECK(esp_event_loop_create_default()); - /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. - * Read "Establishing Wi-Fi or Ethernet Connection" section in - * examples/protocols/README.md for more information about this function. - */ - ESP_ERROR_CHECK(example_connect()); -#else - wifi_event_group = xEventGroupCreate(); - ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL)); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + esp_event_handler_instance_t instance_any_id; + esp_event_handler_instance_t instance_got_ip; + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, + ESP_EVENT_ANY_ID, + &event_handler, + NULL, + &instance_any_id)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, + IP_EVENT_STA_GOT_IP, + &event_handler, + NULL, + &instance_got_ip)); + wifi_config_t wifi_config = { .sta = { - .ssid = TLS_SMP_WIFI_SSID, - .password = TLS_SMP_WIFI_PASS, + .ssid = EXAMPLE_ESP_WIFI_SSID, + .password = EXAMPLE_ESP_WIFI_PASS, + /* Authmode threshold resets to WPA2 as default if password matches + * WPA2 standards (pasword len => 8). If you want to connect the + * device to deprecated WEP/WPA networks, Please set the threshold + * value WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with + * length and format matching to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK + * standards. */ + .threshold.authmode = ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD, + #ifdef HAS_WPA3_FEATURES + .sae_pwe_h2e = WPA3_SAE_PWE_BOTH, + #endif }, }; - /* WiFi station mode */ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); - /* Wifi Set the configuration of the ESP32 STA or AP */ - ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); - /* Start Wifi */ + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); + +#ifdef CONFIG_EXAMPLE_WIFI_SSID + if (XSTRCMP(CONFIG_EXAMPLE_WIFI_SSID, "myssid") == 0) { + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID is \"myssid\"."); + ESP_LOGW(TAG, " Do you have a WiFi AP called \"myssid\", "); + ESP_LOGW(TAG, " or did you forget the ESP-IDF configuration?"); + } +#else + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID not defined."); +#endif + ESP_ERROR_CHECK(esp_wifi_start() ); ESP_LOGI(TAG, "wifi_init_sta finished."); - ESP_LOGI(TAG, "connect to ap SSID:%s password:%s", - TLS_SMP_WIFI_SSID, TLS_SMP_WIFI_PASS); + + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) + * or connection failed for the maximum number of re-tries (WIFI_FAIL_BIT). + * The bits are set by event_handler() (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + /* xEventGroupWaitBits() returns the bits before the call returned, + * hence we can test which event actually happened. */ +#if defined(SHOW_SSID_AND_PASSWORD) + ESP_LOGW(TAG, "Undefine SHOW_SSID_AND_PASSWORD to not show SSID/password"); + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "connected to ap SSID:%s password:%s", + EXAMPLE_ESP_WIFI_SSID, + EXAMPLE_ESP_WIFI_PASS); + } + else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", + EXAMPLE_ESP_WIFI_SSID, + EXAMPLE_ESP_WIFI_PASS); + } + else { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } +#else + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "Connected to AP"); + } + else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to AP"); + ret = -1; + } + else { + ESP_LOGE(TAG, "AP UNEXPECTED EVENT"); + ret = -2; + } #endif - ESP_LOGI(TAG, "Set dummy time..."); - set_time(); + return ret; } + +int wifi_show_ip(void) +{ + /* TODO Causes panic: ESP_LOGI(TAG, "got ip:" IPSTR, + * IP2STR(&event->ip_info.ip)); */ + return ESP_OK; +} +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/partitions_singleapp_large.csv mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/partitions_singleapp_large.csv --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/partitions_singleapp_large.csv 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/partitions_singleapp_large.csv 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,31 @@ +# to view: idf.py partition-table +# +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +phy_init,data, phy, 0xf000, 4K, +factory, app, factory, 0x10000, 1500K, + + +# For other settings, see: +# https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#creating-custom-tables +# +# Here is the summary printed for the "Single factory app, no OTA" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x6000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# +# +# Here is the summary printed for the "Factory app, two OTA definitions" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x4000, +# otadata, data, ota, 0xd000, 0x2000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# ota_0, app, ota_0, 0x110000, 1M, +# ota_1, app, ota_1, 0x210000, 1M, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults 2024-08-03 07:30:00.000000000 +0000 @@ -1,25 +1,92 @@ +# sdkconfig.defaults for ESP8266 + ESP32 +# Note that during the build process, settings from sdkconfig.defaults will not override those already in sdkconfig. +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#custom-sdkconfig-defaults +CONFIG_BENCH_ARGV="-lng 0" CONFIG_FREERTOS_HZ=1000 CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y # -# Default main stack size +# Default main stack size. See user_settings.h # -# This is typically way bigger than needed for stack size. See user_settings.h -# -CONFIG_ESP_MAIN_TASK_STACK_SIZE=55500 +# For wolfSSL SMALL_STACK, 3072 bytes should be sufficient for benchmark app. +# When using RSA, assign at least 10500 bytes, otherwise 5500 usually works for others +CONFIG_ESP_MAIN_TASK_STACK_SIZE=10500 # Legacy stack size for older ESP-IDF versions -CONFIG_MAIN_TASK_STACK_SIZE=55500 +CONFIG_MAIN_TASK_STACK_SIZE=10500 + +# +# Benchmark must not have CONFIG_NEWLIB_NANO_FORMAT enabled +CONFIG_NEWLIB_NANO_FORMAT=n +# +# Watchdog Timers +# +# We don't want to have the watchdog timeout during tests & benchmarks +# +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n +# Panic & Watchdog +CONFIG_ESP_INT_WDT_TIMEOUT_MS=10000 +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +CONFIG_ESP_INT_WDT=n + +# ESP8266 Watchdog: +CONFIG_TASK_WDT=n +CONFIG_TASK_WDT_PANIC=n + +# ESP8266 WDT +# CONFIG_ESP_PANIC_PRINT_REBOOT is not set +CONFIG_ESP_PANIC_PRINT_REBOOT=n +CONFIG_ESP_PANIC_PRINT_HALT=y + +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=n + +# ESP8266 Memory +CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y +CONFIG_HEAP_DISABLE_IRAM=y + +# Performance +# CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# Set max COU frequency (falls back as needed for lower maximum) +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y + +# FreeRTOS ticks at 1ms interval +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=1000 # # Compiler options # CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set CONFIG_COMPILER_STACK_CHECK=y +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +# end of Compiler options + +# We don't know that the min is actually v2, +# but this is the earliest tested. +CONFIG_ESP32C3_REV_MIN_2=y # # Partition Table diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,292 @@ + + + + + + Unknown + + true + + c9687472-a434-43a7-9026-7914f425b9b4 + true + true + SourceDirs + + + + + + com.visualgdb.xtensa-lx106-elf + + 8.4.0 + 8.1 + 1 + + + + release/v3.4 + rtos-sdk/v3.4 + RTOS_SDK + + 0 + + + + + + + + + + + + + Default + + false + + BuildMachine + BuiltinShortcut + + + + + + + COM80 + + 74880 + 8 + None + One + None + + + 0 + false + true + false + ASCII + + + 255 + 0 + 0 + 0 + + + 255 + 169 + 169 + 169 + + + 255 + 211 + 211 + 211 + + + 255 + 144 + 238 + 144 + + + 255 + 169 + 169 + 169 + + + + 16 + true + true + true + true + 0 + + LF + false + false + false + + + + true + + + + + True + + true + true + + Enabled + true + true + true + + true + + + + false + + apiModeling.google.GTest + core.builtin.BuiltinFunctions + core.builtin.NoReturnFunctions + core.CallAndMessage + core.DivideZero + core.DynamicTypePropagation + core.NonnilStringConstants + core.NonNullParamChecker + core.NullDereference + core.StackAddressEscape + core.UndefinedBinaryOperatorResult + core.uninitialized.ArraySubscript + core.uninitialized.Assign + core.uninitialized.Branch + core.uninitialized.CapturedBlockVariable + core.uninitialized.UndefReturn + core.VLASize + cplusplus.NewDelete + cplusplus.NewDeleteLeaks + cplusplus.SelfAssignment + deadcode.DeadStores + nullability.NullPassedToNonnull + nullability.NullReturnedFromNonnull + security.insecureAPI.getpw + security.insecureAPI.gets + security.insecureAPI.mkstemp + security.insecureAPI.mktemp + security.insecureAPI.UncheckedReturn + security.insecureAPI.vfork + unix.API + unix.cstring.BadSizeArg + unix.cstring.NullArg + unix.Malloc + unix.MallocSizeof + unix.MismatchedDeallocator + unix.StdCLibraryFunctions + unix.Vfork + + + -analyzer-store=region + -analyzer-opt-analyze-nested-blocks + -analyzer-eagerly-assume + + + + + + Debug + + build/Debug + sdkconfig-debug + false + + + + Release + + build/Release + sdkconfig-release + false + + + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + + true + false + false + true + 0 + false + 0 + true + false + + + openocd + + -f interface/ftdi/tigard.cfg -f target/esp8266.cfg + + + + false + + 131072 + Enabled + + set remotetimeout 60 + target remote :$$SYS:GDB_PORT$$ + mon reset halt + load + mon xtensa_no_interrupts_during_steps on + mon esp8266_autofeed_watchdog on + + false + 0 + 0 + false + + 0 + Soft + 4096 + 4096 + + size4M + freq40M + QIO + + + + true + Disabled + 0 + false + false + true + false + false + + _estack + 0 + false + + true + + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,11 +1,96 @@ +# wolfSSL Espressif Example Project CMakeLists.txt +# v1.0 +# # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.16) + +# The wolfSSL CMake file should be able to find the source code. +# Otherwise, assign an environment variable or set it here: +# +# set(WOLFSSL_ROOT "~/workspace/wolfssl-other-source") +# +# Optional WOLFSSL_CMAKE_SYSTEM_NAME detection to find +# USE_MY_PRIVATE_CONFIG path for my_private_config.h +# +# Expected path varies: +# +# WSL: /mnt/c/workspace +# Linux: ~/workspace +# Windows: C:\workspace +# +if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") +endif() +if(CMAKE_HOST_UNIX) + message("Detected UNIX") +endif() +if(APPLE) + message("Detected APPLE") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") +endif() +if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") +endif() +# End optional WOLFSSL_CMAKE_SYSTEM_NAME + +# This example uses an extra component for common functions such as Wi-Fi and Ethernet connection. +set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + +if (EXISTS "${PROTOCOL_EXAMPLES_DIR}") + message("Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") + set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR") +else() + message("NOT FOUND: PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") +endif() + +# Check that there are not conflicting wolfSSL components +# The ESP Registry Component will be in ./managed_components/wolfssl__wolfssl +# The local component wolfSSL directory will be in ./components/wolfssl +if( EXISTS "${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" AND EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl" ) + # These exclude statements don't seem to be honored by the $ENV{IDF_PATH}/tools/cmake/project.cmake' + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" EXCLUDE_FROM_ALL) + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl/include" EXCLUDE_FROM_ALL) + # So we'll error out and let the user decide how to proceed: + message(WARNING "\nFound wolfSSL components in\n" + "./managed_components/wolfssl__wolfssl\n" + "and\n" + "./components/wolfssl\n" + "in project directory: \n" + "${CMAKE_HOME_DIRECTORY}") + message(FATAL_ERROR "\nPlease use either the ESP Registry Managed Component or the wolfSSL component directory but not both.\n" + "If removing the ./managed_components/wolfssl__wolfssl directory, remember to also remove " + "or rename the idf_component.yml file typically found in ./main/") +else() + message(STATUS "No conflicting wolfSSL components found.") +endif() + -# (Not part of the boilerplate) # This example uses an extra component for common functions such as Wi-Fi and Ethernet connection. -# disable the following line if there isn't the directory -set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) +set (PROTOCOL_EXAMPLES_DIR $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + +if (EXISTS "${PROTOCOL_EXAMPLES_DIR}") + message("Found PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") + set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/common_components/protocol_examples_common) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DFOUND_PROTOCOL_EXAMPLES_DIR") +else() + message("NOT FOUND: PROTOCOL_EXAMPLES_DIR=${PROTOCOL_EXAMPLES_DIR}") +endif() include($ENV{IDF_PATH}/tools/cmake/project.cmake) + project(wolfssl_server) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,8 +1,23 @@ -# wolfSSL Server Example +# wolfSSL TLS Server Example + +This is the wolfSSL TLS Server demo, typically used with the [Espressif TLS Client](../wolfssl_client/README.md) +or the CLI [Client](https://github.com/wolfSSL/wolfssl/tree/master/examples/client). + +When using the CLI, see the [example parameters](/IDE/Espressif/ESP-IDF/examples#interaction-with-wolfssl-cli). + +For general information on [wolfSSL examples for Espressif](../README.md), see the +[README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. + +## VisualGDB + +Open the VisualGDB Visual Studio Project file in the VisualGDB directory and click the "Start" button. +No wolfSSL setup is needed. You may need to adjust your specific COM port. The default is `COM20`. + +## ESP-IDF Commandline The Example contains a wolfSSL simple server. -1. `idf.py menuconfigure` to configure the project +1. `idf.py menuconfig` to configure the project 1-1. Example Connection Configuration -> @@ -20,3 +35,90 @@ e.g ./example/client/client -h xx.xx.xx See the README.md file in the upper level 'examples' directory for more information about examples. + + +``` +# . /mnt/c/SysGCC/esp32/esp-idf/master/export.sh +. /mnt/c/SysGCC/esp32/esp-idf/v5.1/export.sh +cd /mnt/c/workspace/wolfssl-$USER/IDE/Espressif/ESP-IDF/examples/wolfssl_server + +# optionally erase +idf.py erase-flash -p /dev/ttyS19 -b 115200 + +# Program flash +idf.py flash -p /dev/ttyS19 -b 115200 monitor +``` + + +Linux Client to x108 SM server + +``` +cd /mnt/c/workspace/wolfssl-$USER + +# show the ciphers +./examples/client/client -e + +./examples/client/client -h 192.168.1.108 -v 4 -l TLS_SM4_GCM_SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +``` + + +Linux Server + +``` +./examples/server/server -v 4 -l TLS13-SM4-CCM-SM3 -c ./certs/sm2/server-sm2.pem -k ./certs/sm2/server-sm2-priv.pem -A ./certs/sm2/client-sm2.pem -V +``` + +#### ESP32 Client to WSL Linux Server + +In Windows Powershell, (elevated permissions) forward the port _after_ starting the listening server: + +```bash +netsh interface portproxy add v4tov4 listenport=11111 listenaddress=0.0.0.0 connectport=11111 connectaddress=127.0.0.1 +``` + +After the server exits, remove the port proxy forward: + +```bash +netsh interface portproxy delete v4tov4 listenport=11111 listenaddress=0.0.0.0 +``` + +Cipers to consider + +``` +TLS13-AES128-GCM-SHA256: +TLS13-AES256-GCM-SHA384: +TLS13-CHACHA20-POLY1305-SHA256: + +TLS13-SM4-GCM-SM3: +TLS13-SM4-CCM-SM3: +ECDHE-ECDSA-SM4-CBC-SM3: +ECDHE-ECDSA-SM4-GCM-SM3: +ECDHE-ECDSA-SM4-CCM-SM3 + +DHE-RSA-AES128-SHA: +DHE-RSA-AES256-SHA: +ECDHE-RSA-AES128-SHA: +ECDHE-RSA-AES256-SHA: +ECDHE-ECDSA-AES128-SHA: +ECDHE-ECDSA-AES256-SHA: +DHE-RSA-AES128-SHA256: +DHE-RSA-AES256-SHA256: +DHE-RSA-AES128-GCM-SHA256: +DHE-RSA-AES256-GCM-SHA384: +ECDHE-RSA-AES128-GCM-SHA256: +ECDHE-RSA-AES256-GCM-SHA384: +ECDHE-ECDSA-AES128-GCM-SHA256: +ECDHE-ECDSA-AES256-GCM-SHA384: +ECDHE-RSA-AES128-SHA256: +ECDHE-ECDSA-AES128-SHA256: +ECDHE-RSA-AES256-SHA384: +ECDHE-ECDSA-AES256-SHA384: +ECDHE-RSA-CHACHA20-POLY1305: +ECDHE-ECDSA-CHACHA20-POLY1305: +DHE-RSA-CHACHA20-POLY1305: +ECDHE-RSA-CHACHA20-POLY1305-OLD: +ECDHE-ECDSA-CHACHA20-POLY1305-OLD: +DHE-RSA-CHACHA20-POLY1305-OLD: +``` + +See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README_server_sm.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README_server_sm.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README_server_sm.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/README_server_sm.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,512 @@ +# SM Cipher Notes + + +### Install SM +``` +cd /mnt/c/workspace/wolfsm-$USER +./install.sh ../wolfssl-$USER +``` + + +### Build Linux SM Examples +``` +./autogen.sh +./configure --enable-sm3 --enable-sm4-gcm --enable-sm2 \ + --enable-sm4-ecb --enable-sm4-cbc --enable-sm4-ctr \ + --enable-sm4-gcm --enable-sm4-ccm +make clean && make +``` + +### TLS 1.3 Server + +``` +./examples/server/server -v 4 -b -d -p 11111 -c ./certs/sm2/server-sm2.pem -k ./certs/sm2/server-sm2-priv.pem -A ./certs/sm2/client-sm2.pem -V +``` + +### TLS 1.3 Client + +``` +./examples/client/client -h 127.0.0.1 -v 4 -l TLS13-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +``` + +### TLS 1.2 Client to Local Linux Server + +``` +./examples/client/client -h 192.168.25.186 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 \ + -c ./certs/sm2/client-sm2.pem \ + -k ./certs/sm2/client-sm2-priv.pem \ + -A ./certs/sm2/root-sm2.pem -C +``` + +### TLS 1.2 Client to ESP32 Server + +``` +./examples/client/client -h 192.168.25.186 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 \ + -c ./certs/sm2/client-sm2.pem \ + -k ./certs/sm2/client-sm2-priv.pem \ + -A ./certs/sm2/root-sm2.pem -C +``` +### Others... + +``` +# Success: Linux Client to ESP32 Server TLS1.2 +./examples/client/client -h 192.168.1.113 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +./examples/client/client -h 192.168.1.113 -v 3 -l ECDHE-ECDSA-SM4-GCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +./examples/client/client -h 192.168.1.113 -v 3 -l ECDHE-ECDSA-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +# Success: Linux Client to ESP32 Server TLS1.3 + +# Reported as TLS_SM4_GCM_SM3, but parameter is TLS13-SM4-GCM-SM3 +./examples/client/client -h 192.168.1.113 -v 4 -l TLS13-SM4-GCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +# Reported as TLS-SM4-CCM-SM3, but parameter is TLS13-SM4-CCM-SM3 +./examples/client/client -h 192.168.1.113 -v 4 -l TLS13-SM4-CCM-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +./examples/client/client -h 192.168.1.113 -v 4 -l TLS13-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C + +``` + +``` +ESP32-to-ESP32 +TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 +TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 +TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 +``` + +Tried both PEM and DER format. + +The latest server is PEM format, triple-checked to have the embedded server +be the same as the Linux server files. + + +| Usage | Certificate | Key | Certificate Authority file, default ./certs/client-cert.pem | +| ----- | ---------------------------------- | ----------------------------------- | --------------------------------- | +| server | -c ./certs/sm2/server-sm2.pem | -k ./certs/sm2/server-sm2-priv.pem | -A ./certs/sm2/client-sm2.pem -V | +| client | -c ./certs/sm2/client-sm2.pem | -k ./certs/sm2/client-sm2-priv.pem | -A ./certs/sm2/root-sm2.pem -C | +| emdedded: +| server | wolfSSL_CTX_use_certificate_buffer
server_sm2 | wolfSSL_CTX_use_PrivateKey_buffer
server_sm2_priv | wolfSSL_CTX_load_verify_buffer
client-sm2 | + +### Code + +See [source code](https://github.com/gojimmypi/wolfssl/blob/2c4f443aec7b151f945cb9dfe2dad6ee30449cf0/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c#L187): + +![code](./code.png) + + +### Linux client talking to embedded server: + +``` +/examples/client/client -h 192.168.1.108 -v 3 -l ECDHE-ECDSA-SM4-CBC-SM3 -c ./certs/sm2/client-sm2.pem -k ./certs/sm2/client-sm2-priv.pem -A ./certs/sm2/root-sm2.pem -C +wolfSSL_connect error -188, ASN no signer error to confirm failure +wolfSSL error: wolfSSL_connect failed +``` + +Output: +``` +ets Jul 29 2019 12:21:46 + +rst:0x3 (SW_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) +configsip: 0, SPIWP:0xee +clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 +mode:DIO, clock div:2 +load:0x3fff0030,len:7000 +load:0x40078000,len:15452 +ho 0 tail 12 room 4 +load:0x40080400,len:3840 +entry 0x4008064c +I (29) boot: ESP-IDF v5.0-dirty 2nd stage bootloader +I (29) boot: compile time 13:40:31 +I (29) boot: chip revision: v3.0 +I (32) boot_comm: chip revision: 3, min. bootloader chip revision: 0 +I (39) boot.esp32: SPI Speed : 40MHz +I (44) boot.esp32: SPI Mode : DIO +I (48) boot.esp32: SPI Flash Size : 2MB +I (53) boot: Enabling RNG early entropy source... +I (58) boot: Partition Table: +I (62) boot: ## Label Usage Type ST Offset Length +I (69) boot: 0 nvs WiFi data 01 02 00009000 00006000 +I (77) boot: 1 phy_init RF data 01 01 0000f000 00001000 +I (84) boot: 2 factory factory app 00 00 00010000 00177000 +I (92) boot: End of partition table +I (96) boot_comm: chip revision: 3, min. application chip revision: 0 +I (103) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=338d8h (211160) map +I (188) esp_image: segment 1: paddr=00043900 vaddr=3ffb0000 size=03b78h ( 15224) load +I (194) esp_image: segment 2: paddr=00047480 vaddr=40080000 size=08b98h ( 35736) load +I (209) esp_image: segment 3: paddr=00050020 vaddr=400d0020 size=c591ch (809244) map +I (501) esp_image: segment 4: paddr=00115944 vaddr=40088b98 size=0c230h ( 49712) load +I (522) esp_image: segment 5: paddr=00121b7c vaddr=50000000 size=00010h ( 16) load +I (533) boot: Loaded app from partition at offset 0x10000 +I (533) boot: Disabling RNG early entropy source... +I (545) cpu_start: Pro cpu up. +I (545) cpu_start: Starting app cpu, entry point is 0x400812f4 +I (532) cpu_start: App cpu up. +I (561) cpu_start: Pro cpu start user code +I (561) cpu_start: cpu freq: 160000000 Hz +I (561) cpu_start: Application information: +I (566) cpu_start: Project name: wolfssl_server +I (571) cpu_start: App version: v5.6.3-stable-1088-g560c84b2b-d +I (578) cpu_start: Compile time: Jul 19 2023 22:20:09 +I (585) cpu_start: ELF file SHA256: 3e6e571c9e87bf44... +I (591) cpu_start: ESP-IDF: v5.0-dirty +I (596) heap_init: Initializing. RAM available for dynamic allocation: +I (603) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM +I (609) heap_init: At 3FFBDA68 len 00022598 (137 KiB): DRAM +I (615) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM +I (622) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM +I (628) heap_init: At 40094DC8 len 0000B238 (44 KiB): IRAM +I (636) spi_flash: detected chip: generic +I (639) spi_flash: flash io: dio +W (643) spi_flash: Detected size(4096k) larger than the size in the binary image header(2048k). Using the +size in the binary image header. +I (657) cpu_start: Starting scheduler on PRO CPU. +I (0) cpu_start: Starting scheduler on APP CPU. +I (725) tls_server: ESP_WIFI_MODE_STA +I (735) wifi:wifi driver task: 3ffcb738, prio:23, stack:6656, core=0 +I (735) system_api: Base MAC address is not set +I (735) system_api: read default base MAC address from EFUSE +I (755) wifi:wifi firmware version: 0d470ef +I (755) wifi:wifi certification version: v7.0 +I (755) wifi:config NVS flash: enabled +I (755) wifi:config nano formating: disabled +I (755) wifi:Init data frame dynamic rx buffer num: 32 +I (765) wifi:Init management frame dynamic rx buffer num: 32 +I (765) wifi:Init management short buffer num: 32 +I (775) wifi:Init dynamic tx buffer num: 32 +I (775) wifi:Init static rx buffer size: 1600 +I (775) wifi:Init static rx buffer num: 10 +I (785) wifi:Init dynamic rx buffer num: 32 +I (785) wifi_init: rx ba win: 6 +I (795) wifi_init: tcpip mbox: 32 +I (795) wifi_init: udp mbox: 6 +I (795) wifi_init: tcp mbox: 6 +I (805) wifi_init: tcp tx win: 5744 +I (805) wifi_init: tcp rx win: 5744 +I (815) wifi_init: tcp mss: 1440 +I (815) wifi_init: WiFi IRAM OP enabled +I (815) wifi_init: WiFi RX IRAM OP enabled +I (825) phy_init: phy_version 4670,719f9f6,Feb 18 2021,17:07:07 +I (925) wifi:mode : sta (24:d7:eb:41:7b:68) +I (935) wifi:enable tsf +I (935) tls_server: wifi_init_sta finished. +I (945) wifi:new:<4,0>, old:<1,0>, ap:<255,255>, sta:<4,0>, prof:1 +I (945) wifi:state: init -> auth (b0) +I (945) wifi:state: auth -> assoc (0) +I (955) wifi:state: assoc -> run (10) +W (955) wifi:idx:0 (ifx:0, c8:d7:19:cd:00:17), tid:0, ssn:0, winSize:64 +I (985) wifi:connected with testbench, aid = 1, channel 4, BW20, bssid = c8:d7:19:cd:00:17 +I (985) wifi:security: WPA2-PSK, phy: bgn, rssi: -45 +I (995) wifi:pm start, type: 1 + +I (1065) wifi:AP's beacon interval = 102400 us, DTIM period = 1 +I (3225) esp_netif_handlers: sta ip: 192.168.1.108, mask: 255.255.255.0, gw: 192.168.1.10 +I (3225) tls_server: got ip:192.168.1.108 +I (3235) Time Helper: sntp_setservername: +I (3235) Time Helper: pool.ntp.org +I (3245) Time Helper: time.nist.gov +I (3245) Time Helper: utcnist.colorado.edu +I (3255) Time Helper: sntp_init done. +TLS13-AES128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:TLS13-SM4-GCM-SM3:TLS13-SM4-CCM-SM3:ECDHE-RSA-AES12 +8-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDS +A-DES-CBC3-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECD +SA-AES128-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-OLD +:ECDHE-ECDSA-CHACHA20-POLY1305-OLD:ECDHE-ECDSA-SM4-CBC-SM3:ECDHE-ECDSA-SM4-GCM-SM3:ECDHE-ECDSA-SM4-CCM-SM3 +:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-GCM-SHA256:PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305 +I (3315) wolfssl: Start wolfSSL_Init() +I (3315) wolfssl: wolfSSL Entering wolfSSL_Init +I (3325) wolfssl: wolfSSL Entering wolfCrypt_Init +I (3325) wolfssl: start socket()) +I (3335) wolfssl: Create and initialize WOLFSSL_CTX +I (3335) wolfssl: wolfSSL Entering wolfSSLv23_server_method_ex +I (3345) wolfssl: wolfSSL Entering wolfSSL_CTX_new_ex +I (3345) wolfssl: wolfSSL Entering wolfSSL_CertManagerNew +I (3355) wolfssl: wolfSSL Leaving wolfSSL_CTX_new_ex, return 0 +I (3365) tls_server: Start SM2 + +I (3365) wolfssl: wolfSSL Entering wolfSSL_CTX_set_cipher_list +I (3375) tls_server: Set cipher list: ECDHE-ECDSA-SM4-CBC-SM3 + +TLS13-AES128-GCM-SHA256:TLS13-CHACHA20-POLY1305-SHA256:TLS13-SM4-GCM-SM3:TLS13-SM4-CCM-SM3:ECDHE-RSA-AES12 +8-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDS +A-DES-CBC3-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECD +SA-AES128-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-OLD +:ECDHE-ECDSA-CHACHA20-POLY1305-OLD:ECDHE-ECDSA-SM4-CBC-SM3:ECDHE-ECDSA-SM4-GCM-SM3:ECDHE-ECDSA-SM4-CCM-SM3 +:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-GCM-SHA256:PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305 +I (3435) wolfssl: Loading certificate... +I (3435) wolfssl: wolfSSL Entering wolfSSL_CTX_use_certificate_buffer +I (3445) wolfssl: wolfSSL Entering PemToDer +I (3455) wolfssl: Checking cert signature type +I (3455) wolfssl: wolfSSL Entering GetExplicitVersion +I (3465) wolfssl: wolfSSL Entering wc_GetSerialNumber +I (3465) wolfssl: Got Cert Header +I (3475) wolfssl: wolfSSL Entering GetObjectId +I (3475) wolfssl: Got Algo ID +I (3475) wolfssl: Getting Name +I (3485) wolfssl: Getting Cert Name +I (3485) wolfssl: Getting Name +I (3495) wolfssl: Getting Cert Name +I (3495) wolfssl: Got Subject Name +I (3495) wolfssl: wolfSSL Entering GetAlgoId +I (3505) wolfssl: wolfSSL Entering GetObjectId +I (3505) wolfssl: wolfSSL Entering GetObjectId +I (3515) wolfssl: Got Key +I (3515) wolfssl: ECDSA/ED25519/ED448 cert signature +I (3525) wolfssl: wolfSSL Leaving wolfSSL_CTX_use_certificate_buffer, return 1 +I (3535) tls_server: Loaded server_sm2 + +I (3535) wolfssl: Loading key info... +I (3535) wolfssl: wolfSSL Entering wolfSSL_CTX_use_PrivateKey_buffer +I (3545) wolfssl: wolfSSL Entering PemToDer +I (3555) wolfssl: wolfSSL Entering GetAlgoId +I (3555) wolfssl: wolfSSL Entering GetObjectId +I (3565) wolfssl: wolfSSL Entering GetAlgoId +I (3565) wolfssl: wolfSSL Entering GetObjectId +I (3575) wolfssl: wolfSSL Leaving wolfSSL_CTX_use_PrivateKey_buffer, return 1 +I (3575) tls_server: Loaded PrivateKey_buffer server_sm2_priv + +I (3585) wolfssl: wolfSSL Entering wolfSSL_CTX_load_verify_buffer_ex +I (3595) wolfssl: Processing CA PEM file +I (3595) wolfssl: wolfSSL Entering PemToDer +I (3605) wolfssl: Adding a CA +I (3605) wolfssl: wolfSSL Entering GetExplicitVersion +I (3615) wolfssl: wolfSSL Entering wc_GetSerialNumber +I (3615) wolfssl: Got Cert Header +I (3625) wolfssl: wolfSSL Entering GetObjectId +I (3625) wolfssl: Got Algo ID +I (3635) wolfssl: Getting Name +I (3635) wolfssl: Getting Cert Name +I (3635) wolfssl: Getting Name +I (3645) wolfssl: Getting Cert Name +I (3645) wolfssl: Got Subject Name +I (3655) wolfssl: wolfSSL Entering GetAlgoId +I (3655) wolfssl: wolfSSL Entering GetObjectId +I (3665) wolfssl: wolfSSL Entering GetObjectId +I (3665) wolfssl: Got Key +I (3665) wolfssl: Parsed Past Key +I (3675) wolfssl: wolfSSL Entering DecodeCertExtensions +I (3675) wolfssl: wolfSSL Entering GetObjectId +I (3685) wolfssl: wolfSSL Entering DecodeSubjKeyId +I (3685) wolfssl: wolfSSL Entering GetObjectId +I (3695) wolfssl: wolfSSL Entering DecodeAuthKeyId +I (3705) wolfssl: wolfSSL Entering GetObjectId +I (3705) wolfssl: wolfSSL Entering DecodeBasicCaConstraint +I (3715) wolfssl: wolfSSL Entering GetObjectId +I (3715) wolfssl: wolfSSL Entering DecodeAltNames +I (3725) wolfssl: Unsupported name type, skipping +I (3725) wolfssl: wolfSSL Entering GetObjectId +I (3735) wolfssl: wolfSSL Entering DecodeExtKeyUsage +I (3735) wolfssl: wolfSSL Entering GetObjectId +I (3745) wolfssl: wolfSSL Entering GetObjectId +I (3745) wolfssl: wolfSSL Entering GetObjectId +I (3755) wolfssl: Parsed new CA +I (3755) wolfssl: No key size check done on CA +I (3765) wolfssl: Freeing Parsed CA +I (3765) wolfssl: Freeing der CA +I (3775) wolfssl: OK Freeing der CA +I (3775) wolfssl: wolfSSL Leaving AddCA, return 0 +I (3785) wolfssl: Processed a CA +I (3785) wolfssl: Processed at least one valid CA. Other stuff OK +I (3795) wolfssl: wolfSSL Leaving wolfSSL_CTX_load_verify_buffer_ex, return 1 +I (3795) tls_server: Success: load verify buffer + +I (3805) tls_server: Finish SM2 + +I (3805) tls_server: accept clients... +I (3815) wolfssl: Waiting for a connection... +I (14485) wolfssl: wolfSSL Entering wolfSSL_new +I (14495) wolfssl: wolfSSL Entering ReinitSSL +I (14495) wolfssl: wolfSSL Entering SetSSL_CTX +I (14495) wolfssl: wolfSSL Entering wolfSSL_NewSession +I (14505) wolfssl: wolfSSL Leaving wolfSSL_new, return 0 +I (14505) wolfssl: wolfSSL Entering wolfSSL_set_fd +I (14515) wolfssl: wolfSSL Entering wolfSSL_set_read_fd +I (14515) wolfssl: wolfSSL Leaving wolfSSL_set_read_fd, return 1 +I (14525) wolfssl: wolfSSL Entering wolfSSL_set_write_fd +I (14535) wolfssl: wolfSSL Leaving wolfSSL_set_write_fd, return 1 +I (14535) wolfssl: wolfSSL Entering wolfSSL_accept +I (14545) wolfssl: wolfSSL Entering ReinitSSL +I (14545) wolfssl: growing input buffer +I (14555) wolfssl: received record layer msg +I (14555) wolfssl: got HANDSHAKE +I (14565) wolfssl: wolfSSL Entering wolfSSL_get_options +I (14565) wolfssl: wolfSSL Entering DoTls13HandShakeMsg +I (14575) wolfssl: wolfSSL Entering DoTls13HandShakeMsgType +I (14575) wolfssl: processing client hello +I (14585) wolfssl: wolfSSL Entering DoTls13ClientHello +I (14595) wolfssl: wolfSSL Entering DoClientHello +I (14595) wolfssl: downgrading to TLSv1.2 +I (14605) wolfssl: Matched No Compression +I (14605) wolfssl: Adding signature algorithms extension +I (14615) wolfssl: Signature Algorithms extension received +I (14615) wolfssl: Point Formats extension received +I (14625) wolfssl: Supported Groups extension received +I (14625) wolfssl: Unknown TLS extension type +I (14635) wolfssl: Unknown TLS extension type +I (14635) wolfssl: wolfSSL Entering MatchSuite +I (14645) wolfssl: wolfSSL Entering VerifyServerSuite +I (14645) wolfssl: Requires ECC +I (14655) wolfssl: Verified suite validity +I (14655) wolfssl: wolfSSL Leaving DoClientHello, return 0 +I (14665) wolfssl: wolfSSL Leaving DoTls13ClientHello, return 0 +I (14675) wolfssl: wolfSSL Leaving DoTls13HandShakeMsgType(), return 0 +I (14675) wolfssl: wolfSSL Leaving DoTls13HandShakeMsg, return 0 +I (14685) wolfssl: Shrinking input buffer +I (14685) wolfssl: accept state ACCEPT_CLIENT_HELLO_DONE +I (14695) wolfssl: accept state ACCEPT_FIRST_REPLY_DONE +I (14705) wolfssl: wolfSSL Entering SendServerHello +I (14705) wolfssl: growing output buffer +I (14715) internal.c: GrowOutputBuffer ok +I (14715) wolfssl: wolfSSL Entering wolfSSL_get_options +I (14725) wolfssl: Point Formats extension to write +W (14735) wolfio: ssl->wflags = 0 +I (14735) wolfio: 16 03 03 00 52 02 00 00 4e 03 03 af 87 e2 58 57 +I (14735) wolfio: 73 c3 c1 35 1a 59 39 b2 03 9d 14 03 e0 b8 fb e8 +I (14745) wolfio: 9d 5b 9c 44 4f 57 4e 47 52 44 01 20 85 77 75 20 +I (14755) wolfio: 95 dd 00 e2 91 f8 42 33 f8 61 3f 1f de 81 15 58 +I (14755) wolfio: 23 0c e7 1e 71 e6 10 e5 67 23 e0 40 e0 11 00 00 +I (14765) wolfio: 06 00 0b 00 02 01 00 +W (14775) wolfio: sz = 87 +I (14775) wolfssl: Shrinking output buffer +I (14775) wolfssl: wolfSSL Leaving SendServerHello, return 0 +I (14785) wolfssl: accept state SERVER_HELLO_SENT +I (14795) wolfssl: wolfSSL Entering SendCertificate +I (14795) wolfssl: growing output buffer +I (14805) internal.c: GrowOutputBuffer ok +W (14815) wolfio: ssl->wflags = 0 +I (14815) wolfio: 16 03 03 02 e6 0b 00 02 e2 00 02 df 00 02 dc 30 +I (14815) wolfio: 82 02 d8 30 82 02 7e a0 03 02 01 02 02 01 01 30 +I (14825) wolfio: 0a 06 08 2a 81 1c cf 55 01 83 75 30 81 ac 31 0b +I (14835) wolfio: 30 09 06 03 55 04 06 13 02 55 53 31 10 30 0e 06 +I (14835) wolfio: 03 55 04 08 0c 07 4d 6f 6e 74 61 6e 61 31 10 30 +I (14845) wolfio: 0e 06 03 55 04 07 0c 07 42 6f 7a 65 6d 61 6e 31 +I (14855) wolfio: 14 30 12 06 03 55 04 0a 0c 0b 77 6f 6c 66 53 53 +I (14855) wolfio: 4c 5f 73 6d 32 31 0f 30 0d 06 03 55 04 0b 0c 06 +I (14865) wolfio: 43 41 2d 73 6d 32 31 18 30 16 06 03 55 04 03 0c +I (14875) wolfio: 0f 77 77 77 2e 77 6f 6c 66 73 73 6c 2e 63 6f 6d +I (14875) wolfio: 31 1f 30 1d 06 09 2a 86 48 86 f7 0d 01 09 01 16 +I (14885) wolfio: 10 69 6e 66 6f 40 77 6f 6c 66 73 73 6c 2e 63 6f +I (14895) wolfio: 6d 31 17 30 15 06 0a 09 92 26 89 93 f2 2c 64 01 +I (14895) wolfio: 01 0c 07 77 6f 6c 66 53 53 4c 30 1e 17 0d 32 33 +I (14905) wolfio: 30 32 31 35 30 36 32 33 30 37 5a 17 0d 32 35 31 +I (14915) wolfio: 31 31 31 30 36 32 33 30 37 5a 30 81 b0 31 0b 30 +I (14915) wolfio: 09 06 03 55 04 06 13 02 55 53 31 10 30 0e 06 03 +I (14925) wolfio: 55 04 08 0c 07 4d 6f 6e 74 61 6e 61 31 10 30 0e +I (14935) wolfio: 06 03 55 04 07 0c 07 42 6f 7a 65 6d 61 6e 31 14 +I (14945) wolfio: 30 12 06 03 55 04 0a 0c 0b 77 6f 6c 66 53 53 4c +I (14945) wolfio: 5f 73 6d 32 31 13 30 11 06 03 55 04 0b 0c 0a 53 +I (14955) wolfio: 65 72 76 65 72 2d 73 6d 32 31 18 30 16 06 03 55 +I (14965) wolfio: 04 03 0c 0f 77 77 77 2e 77 6f 6c 66 73 73 6c 2e +I (14965) wolfio: 63 6f 6d 31 1f 30 1d 06 09 2a 86 48 86 f7 0d 01 +I (14975) wolfio: 09 01 16 10 69 6e 66 6f 40 77 6f 6c 66 73 73 6c +I (14985) wolfio: 2e 63 6f 6d 31 17 30 15 06 0a 09 92 26 89 93 f2 +I (14985) wolfio: 2c 64 01 01 0c 07 77 6f 6c 66 53 53 4c 30 5a 30 +I (14995) wolfio: 14 06 08 2a 81 1c cf 55 01 82 2d 06 08 2a 81 1c +I (15005) wolfio: cf 55 01 82 2d 03 42 00 04 94 70 2b 46 e4 5e 0f +I (15005) wolfio: 41 fb 8f 2d 34 0a 41 40 19 5e fb d4 1d 11 ac fa +I (15015) wolfio: f5 93 37 c6 fa 87 08 f7 16 1f 2c ce 30 40 9d 4f +I (15025) wolfio: a6 2a 0a a1 d6 95 33 c3 a6 03 98 e6 8d 05 34 b0 +I (15025) wolfio: 97 0c de a4 c7 cf 53 8f d1 a3 81 89 30 81 86 30 +I (15035) wolfio: 1d 06 03 55 1d 0e 04 16 04 14 67 ae 60 ff 7e 1b +I (15045) wolfio: 0f 95 ae 1f 82 59 f2 6c 56 2d 93 ef 17 32 30 1f +I (15045) wolfio: 06 03 55 1d 23 04 18 30 16 80 14 47 0a 48 7e bb +I (15055) wolfio: 02 a8 5a 26 57 2b 19 a9 7b 61 8b 7f 5d 99 6e 30 +I (15065) wolfio: 0c 06 03 55 1d 13 01 01 ff 04 02 30 00 30 0e 06 +I (15075) wolfio: 03 55 1d 0f 01 01 ff 04 04 03 02 03 a8 30 13 06 +I (15075) wolfio: 03 55 1d 25 04 0c 30 0a 06 08 2b 06 01 05 05 07 +I (15085) wolfio: 03 01 30 11 06 09 60 86 48 01 86 f8 42 01 01 04 +I (15095) wolfio: 04 03 02 06 40 30 0a 06 08 2a 81 1c cf 55 01 83 +I (15095) wolfio: 75 03 48 00 30 45 02 20 1b ca 94 28 7f f6 b2 0d +I (15105) wolfio: 31 43 50 e1 d5 34 17 dd af 3a de 81 06 67 9a b3 +I (15115) wolfio: 06 22 7e 64 ec fd 0e b9 02 21 00 a1 48 a8 32 d1 +I (15115) wolfio: 05 09 6b 1c eb 89 12 66 d8 38 a1 c4 5c 89 09 0f +I (15125) wolfio: fd e9 c0 3b 1d fb cd b5 4c 31 68 +W (15135) wolfio: sz = 747 +I (15135) wolfssl: Shrinking output buffer +I (15135) wolfssl: wolfSSL Leaving SendCertificate, return 0 +I (15145) wolfssl: accept state CERT_SENT +I (15155) wolfssl: wolfSSL Entering SendCertificateStatus +I (15155) wolfssl: wolfSSL Leaving SendCertificateStatus, return 0 +I (15165) wolfssl: accept state CERT_STATUS_SENT +I (15165) wolfssl: wolfSSL Entering SendServerKeyExchange +I (15175) wolfssl: Using ephemeral ECDH +I (15175) wolfssl: wolfSSL Entering EccMakeKey +I (15535) wolfssl: wolfSSL Leaving EccMakeKey, return 0 +I (15535) wolfssl: Trying ECC private key, RSA didn't work +I (15535) wolfssl: wolfSSL Entering GetAlgoId +I (15545) wolfssl: wolfSSL Entering GetObjectId +I (15555) wolfssl: Using ECC private key +I (15555) wolfssl: wolfSSL Entering Sm2wSm3Sign +I (15915) wolfssl: wolfSSL Leaving Sm2wSm3Sign, return 0 +I (15915) wolfssl: wolfSSL Entering SendHandshakeMsg +I (15925) wolfssl: growing output buffer +I (15925) internal.c: GrowOutputBuffer ok +W (15925) wolfio: ssl->wflags = 0 +I (15935) wolfio: 16 03 03 00 95 0c 00 00 91 03 00 29 41 04 fd f5 +I (15935) wolfio: 5e 74 15 30 1d f3 84 ae a5 69 96 a9 5b dd 27 b3 +I (15945) wolfio: 00 7d 40 3a 59 93 93 6f 4d 1f 62 dc 60 48 34 1f +I (15955) wolfio: a8 1d 34 b8 76 8f 8b 27 4a 1b 77 64 8e 2e d5 27 +I (15955) wolfio: 03 95 8b 9d a5 ed a4 a6 b9 40 1b ea aa 10 07 08 +I (15965) wolfio: 00 48 30 46 02 21 00 cb 89 61 e9 21 f9 c6 4d ad +I (15975) wolfio: aa e7 f1 3f 6f 27 46 f0 35 ec 45 4e 8a ae f3 ac +I (15985) wolfio: 7c c0 cf 68 11 44 e2 02 21 00 f6 40 5c bc 66 5a +I (15985) wolfio: 74 1e 92 5d 9a 03 75 e7 7f 16 c2 b3 c8 fe 8d 5c +I (15995) wolfio: 63 35 36 da 61 38 76 dc 4e d6 +W (15995) wolfio: sz = 154 +I (16005) wolfssl: Shrinking output buffer +I (16005) wolfssl: wolfSSL Leaving SendServerKeyExchange, return 0 +I (16015) wolfssl: accept state KEY_EXCHANGE_SENT +I (16025) wolfssl: accept state CERT_REQ_SENT +I (16025) wolfssl: wolfSSL Entering SendServerHelloDone +I (16035) wolfssl: growing output buffer +I (16035) internal.c: GrowOutputBuffer ok +W (16045) wolfio: ssl->wflags = 0 +I (16045) wolfio: 16 03 03 00 04 0e 00 00 00 +W (16045) wolfio: sz = 9 +I (16055) wolfssl: Embed Send error +I (16055) wolfssl: Connection reset +I (16065) int: Sent = -3 +W (16065) int: WOLFSSL_CBIO_ERR_CONN_RST +E (16075) int: SOCKET_ERROR_E 2 +I (16075) wolfssl: wolfSSL Leaving SendServerHelloDone, return -308 +I (16085) wolfssl: wolfSSL error occurred, error = -308 +I (16085) wolfssl: wolfSSL Entering wolfSSL_get_error +I (16095) wolfssl: wolfSSL Leaving wolfSSL_get_error, return -308 +E (16085) tls_server: wolfSSL_accept error -308 +I (16105) wolfssl: Client connected successfully +I (16105) wolfssl: wolfSSL Entering wolfSSL_read +I (16115) wolfssl: wolfSSL Entering wolfSSL_read_internal +I (16125) wolfssl: wolfSSL Entering ReceiveData +I (16125) wolfssl: User calling wolfSSL_read in error state, not allowed +I (16135) wolfssl: wolfSSL Leaving wolfSSL_read_internal, return -308 +E (16145) tls_server: ERROR: failed to read +I (16145) wolfssl: Client sends: +I (16145) wolfssl: +I (16155) wolfssl: wolfSSL Entering wolfSSL_write +I (16155) wolfssl: handshake not complete, trying to finish +I (16165) wolfssl: wolfSSL Entering wolfSSL_negotiate +I (16165) wolfssl: wolfSSL Entering wolfSSL_accept +I (16175) wolfssl: wolfSSL Entering ReinitSSL +W (16185) wolfio: ssl->wflags = 0 +I (16185) wolfio: 16 03 03 00 04 0e 00 00 00 +W (16185) wolfio: sz = 9 +I (16195) wolfssl: Embed Send error +I (16195) wolfssl: General error +I (16205) int: Sent = -1 +E (16205) int: SOCKET_ERROR_E +I (16205) wolfssl: wolfSSL error occurred, error = -308 +I (16215) wolfssl: wolfSSL Leaving wolfSSL_negotiate, return -1 +I (16225) wolfssl: wolfSSL Leaving wolfSSL_write, return -1 +E (16225) tls_server: ERROR: failed to write +I (16235) wolfssl: wolfSSL Entering wolfSSL_free +I (16235) wolfssl: Free'ing server ssl +I (16245) wolfssl: Shrinking output buffer +I (16245) wolfssl: wolfSSL Entering ClientSessionToSession +I (16255) wolfssl: wolfSSL Entering wolfSSL_FreeSession +I (16255) wolfssl: wolfSSL_FreeSession full free +I (16265) wolfssl: CTX ref count not 0 yet, no free +I (16265) wolfssl: wolfSSL Leaving wolfSSL_free, return 0 +I (16275) wolfssl: Waiting for a connection... +``` + +### Wireshark: + +![wireshark](./wireshark.png) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,52 @@ +# wolfSSL Project Files for Visual Studio 2022 with VisualGDB Extension + +Include in the respective project `./VisualGDB` directory are [VisualGDB](https://visualgdb.com/) project files. +Individual project files are included for convenience to new users, as there are [difficulties switching between ESP-IDF Versions or Chipsets](https://sysprogs.com/w/forums/topic/difficulties-switching-espressif-esp-idf-version-or-chipset/) using the VisualGDB extension. + +The naming convention for project files is: `[project name]_IDF_[Version]_[chipset].vgdbproj`. The solution files (filename[.sln]) often will contain shortcuts to commonly used source and configuration files used by the respective project. + + +-------- |------------- |------------- | +ChipSet | ESP-IDF v4.4 | ESP-IDF v5.0 | +-------- |------------- |------------- | +ESP32 | x | | +ESP32-S2 | | | +ESP32-S3 | x | x | +ESP32-C3 | x | x | +ESP32-C6 | | | + + +The default directories are: + +- `C:\SysGCC` - The root directory install of VisualGDB +- `C:\SysGCC\esp32` - The default for ESP-IDF v5.x +- `C:\SysGCC\esp32-8.4` - Many need to manually select this name for ESP-IDF v4.x install +- `C:\SysGCC\esp8266`- The default for ESP8266 + +## Resources + +- [wolfSSL Website](https://www.wolfssl.com/) + +- [wolfSSL Wiki](https://github.com/wolfSSL/wolfssl/wiki) + +- [FIPS 140-2/140-3 FAQ](https://wolfssl.com/license/fips) + +- [wolfSSL Documentation](https://wolfssl.com/wolfSSL/Docs.html) + +- [wolfSSL Manual](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-toc.html) + +- [wolfSSL API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-17-wolfssl-api-reference.html) + +- [wolfCrypt API Reference](https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-18-wolfcrypt-api-reference.html) + +- [TLS 1.3](https://www.wolfssl.com/docs/tls13/) + +- [wolfSSL Vulnerabilities](https://www.wolfssl.com/docs/security-vulnerabilities/) + +- [Additional wolfSSL Examples](https://github.com/wolfssl/wolfssl-examples) + +## Support + +For questions please email [support@wolfssl.com](mailto:support@wolfssl.com) + +<-- edit 5.6.0001 see https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB --> diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.sln mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.sln --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.sln 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.33027.164 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{803FD0C6-D64E-4E16-9DC3-1DAEC859A3D2}") = "VisualGDB_wolfssl_server", "VisualGDB_wolfssl_server.vgdbproj", "{CD5A90CA-2D40-461A-A0C3-27654371BB00}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|VisualGDB = Debug|VisualGDB - Release|VisualGDB = Release|VisualGDB - Tests (Debug)|VisualGDB = Tests (Debug)|VisualGDB - Tests (Release)|VisualGDB = Tests (Release)|VisualGDB - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Debug|VisualGDB.ActiveCfg = Debug|VisualGDB - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Debug|VisualGDB.Build.0 = Debug|VisualGDB - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Release|VisualGDB.ActiveCfg = Release|VisualGDB - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Release|VisualGDB.Build.0 = Release|VisualGDB - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Debug)|VisualGDB.ActiveCfg = Tests (Debug)|VisualGDB - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Debug)|VisualGDB.Build.0 = Tests (Debug)|VisualGDB - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Release)|VisualGDB.ActiveCfg = Tests (Release)|VisualGDB - {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Release)|VisualGDB.Build.0 = Tests (Release)|VisualGDB - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {719A8CBE-E881-4B20-89F3-9910520E1067} - EndGlobalSection -EndGlobal diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.vgdbproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.vgdbproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,269 +0,0 @@ - - - - - - Unknown - - true - - 63883b8e-8fa2-4e2f-807c-31c07f619c51 - true - true - SourceDirs - - - - - - com.visualgdb.xtensa-esp32-elf - - 8.4.0 - 8.1.0 - 9 - - - .. - DEBUG - build/$(PlatformName)/$(ConfigurationName) - - false - $(ToolchainNinja) - $(BuildDir) - - - - false - $(SYSPROGS_CMAKE_PATH) - - - true - false - false - Ninja - false - RemoveBuildDirectory - false - - - true - true - true - false - true - false - true - HideOuterProjectTargets - true - false - true - - - true - cd5a90ca-2d40-461a-a0c3-27654371bb00 - - Upper - HeaderDirectoryAndSubdirectories - true - - - v4.4.1 - esp-idf/v4.4.1 - ESPIDF - - COM20 - false - false - ESP32 - - - - - - - - - - - - - - - Default - - - - COM20 - - 115200 - 8 - None - One - None - - - 0 - false - false - false - ASCII - - - 255 - 0 - 0 - 0 - - - 255 - 169 - 169 - 169 - - - 255 - 211 - 211 - 211 - - - 255 - 144 - 238 - 144 - - - 255 - 169 - 169 - 169 - - - - 16 - true - true - true - true - 0 - - LF - false - false - false - - - - true - - - - - Unknown - - true - true - true - - - - false - - - - - Debug - - - - Release - - - - - - - - - false - false - false - false - false - false - false - false - false - - false - false - false - false - false - false - true - false - None - false - false - app_main - true - false - false - true - 0 - false - 0 - true - false - - - openocd - - -f interface/tigard.cfg -c "adapter_khz 3000" -f target/esp32.cfg - - - - false - - 131072 - Enabled - - set remotetimeout 60 - target remote :$$SYS:GDB_PORT$$ - mon gdb_breakpoint_override hard - mon reset halt - load - - false - 0 - 0 - false - - 5000 - 1 - true - - size2MB - freq40M - DIO - - true - - - true - Auto - 0 - false - false - true - false - false - - _estack - 0 - false - - true - - \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.sln mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.sln --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.sln 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.sln 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34031.279 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{803FD0C6-D64E-4E16-9DC3-1DAEC859A3D2}") = "wolfssl_server_IDF_v5_ESP32", "wolfssl_server_IDF_v5_ESP32.vgdbproj", "{CD5A90CA-2D40-461A-A0C3-27654371BB00}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|VisualGDB = Debug|VisualGDB + Release|VisualGDB = Release|VisualGDB + Tests (Debug)|VisualGDB = Tests (Debug)|VisualGDB + Tests (Release)|VisualGDB = Tests (Release)|VisualGDB + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Debug|VisualGDB.ActiveCfg = Debug|VisualGDB + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Debug|VisualGDB.Build.0 = Debug|VisualGDB + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Release|VisualGDB.ActiveCfg = Release|VisualGDB + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Release|VisualGDB.Build.0 = Release|VisualGDB + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Debug)|VisualGDB.ActiveCfg = Tests (Debug)|VisualGDB + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Debug)|VisualGDB.Build.0 = Tests (Debug)|VisualGDB + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Release)|VisualGDB.ActiveCfg = Tests (Release)|VisualGDB + {CD5A90CA-2D40-461A-A0C3-27654371BB00}.Tests (Release)|VisualGDB.Build.0 = Tests (Release)|VisualGDB + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8024AC13-8021-400B-976F-30C392D5BBD3} + EndGlobalSection +EndGlobal diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.vgdbproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,269 @@ + + + + + + Unknown + + true + + 63883b8e-8fa2-4e2f-807c-31c07f619c51 + true + true + SourceDirs + + + + + + com.visualgdb.xtensa-esp32-elf + + 13.2.0 + 12.1 + 1 + + + .. + DEBUG + build/$(PlatformName)/$(ConfigurationName) + + false + $(ToolchainNinja) + $(BuildDir) + + + + false + $(SYSPROGS_CMAKE_PATH) + + + true + false + false + Ninja + false + RemoveBuildDirectory + false + + + true + true + true + false + true + false + true + HideOuterProjectTargets + true + false + true + + + true + cd5a90ca-2d40-461a-a0c3-27654371bb00 + + Upper + HeaderDirectoryAndSubdirectories + true + + + release/v5.2 + esp-idf/v5.2 + ESPIDF + + COM19 + false + false + ESP32 + + + + + + + + + + + + + + + Default + + + + COM19 + + 115200 + 8 + None + One + None + + + 0 + false + true + false + ASCII + + + 255 + 0 + 0 + 0 + + + 255 + 169 + 169 + 169 + + + 255 + 211 + 211 + 211 + + + 255 + 144 + 238 + 144 + + + 255 + 169 + 169 + 169 + + + + 16 + true + true + true + true + 0 + + LF + false + false + false + + + + true + + + + + Unknown + + true + true + true + + + + false + + + + + Debug + + + + Release + + + + + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + app_main + true + false + false + true + 0 + false + 0 + true + false + + + openocd + + -f interface/ftdi/tigard.cfg -c "adapter_khz 15000" -f interface/ftdi/tigard.cfg -f target/esp32.cfg + + + + false + + 131072 + Enabled + + set remotetimeout 60 + target remote :$$SYS:GDB_PORT$$ + mon gdb_breakpoint_override hard + mon reset halt + load + + false + 0 + 0 + false + + 5000 + 1 + true + + size2MB + freq40M + DIO + + true + + + true + Disabled + 0 + false + false + true + false + false + + _estack + 0 + false + + true + + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2023 wolfSSL Inc. +# Copyright (C) 2006-2024 wolfSSL Inc. # # This file is part of wolfSSL. # @@ -17,206 +17,451 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA # -# cmake for wolfssl +# cmake for wolfssl Espressif projects # -cmake_minimum_required(VERSION 3.5) +# Version 5.6.0.011 for detect test/benchmark +# +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html +# + +cmake_minimum_required(VERSION 3.16) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") set(CMAKE_CURRENT_SOURCE_DIR ".") +set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component +set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" ) -# We are currently in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl -# The root of wolfSSL is 7 directories up from here: -get_filename_component(WOLFSSL_ROOT "../../../../../../../" ABSOLUTE) - -# Espressif may take several passes through this makefile. Check to see if we found IDF -string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) +# find the user name to search for possible "wolfssl-username" +message(STATUS "USERNAME = $ENV{USERNAME}") +if( "$ENV{USER}" STREQUAL "" ) # the bash user + if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user + message(STATUS "could not find USER or USERNAME") + else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USERNAME}") + endif() +else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USER}") +endif() +message(STATUS "THIS_USER = ${THIS_USER}") -if($WOLFSSL_FOUND_IDF) - message(STATUS "IDF_PATH = $ENV{IDF_PATH}") - message(STATUS "WOLFSSL_ROOT = ${WOLFSSL_ROOT}") - message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") +if( "$ENV{IDF_PATH}" STREQUAL "" ) + message(FATAL_ERROR "IDF_PATH Environment variable not set!") +else() + string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}") endif() -# get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa -FILE(GLOB EXCLUDE_ASM *.S) -file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") +# COMPONENT_NAME = wolfssl +# The component name is the directory name. "No feature to change this". +# See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685 + +# set the root of wolfSSL in top-level project CMakelists.txt: +# set(WOLFSSL_ROOT "C:/some path/with/spaces") +# set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]") +# set(WOLFSSL_ROOT "/mnt/c/some path/with/spaces") +# or use this logic to assign value from Environment Variable WOLFSSL_ROOT, +# or assume this is an example 7 subdirectories below: -if(NOT CMAKE_BUILD_EARLY_EXPANSION) - message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") -endif() +# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl +# The root of wolfSSL is 7 directories up from here: -set(INCLUDE_PATH ${WOLFSSL_ROOT}) +# function: IS_WOLFSSL_SOURCE +# parameter: DIRECTORY_PARAMETER - the directory to test +# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank. +function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT) + if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src") + set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE) + else() + set(${RESULT} "" PARENT_SCOPE) + endif() +endfunction() -set(COMPONENT_SRCDIRS "${WOLFSSL_ROOT}/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel/" - "${WOLFSSL_ROOT}/wolfcrypt/benchmark/" - "${WOLFSSL_ROOT}/wolfcrypt/test/" - ) +# function: FIND_WOLFSSL_DIRECTORY +# parameter: OUTPUT_FOUND_WOLFSSL_DIRECTORY contains root of source code, otherwise blank +# +function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) + message(STATUS "Starting FIND_WOLFSSL_DIRECTORY") + set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}") + if( "${CURRENT_SEARCH_DIR}" STREQUAL "" ) + message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...") + else() + get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + else() + message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") + message(STATUS "$ENV{WOLFSSL_ROOT}") + endif() + endif() + + # we'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl + message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE) + message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + + # loop through all the parents, looking for wolfssl + while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" ) + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + # wolfSSL may simply be in a parent directory, such as for local examples in wolfssl repo + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + if( THIS_USER ) + # Check for "wolfssl-[username]" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-${THIS_USER}) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR}") + + #if(EXISTS ${CURRENT_SEARCH_DIR_ALT} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR_ALT} AND EXISTS "${CURRENT_SEARCH_DIR_ALT}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR_ALT} PARENT_SCOPE) + return() + endif() + endif() -set(COMPONENT_REQUIRES lwip) + # Next check for no user suffix "wolfssl" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl) + # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + # Move up one directory level + set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY) + message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" ) + # when the search directory is empty, we'll give up + set(CURRENT_SEARCH_DIR "") + endif() + endwhile() + + # If not found, set the output variable to empty before exiting + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} "" PARENT_SCOPE) +endfunction() + + +# Example usage: -# check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) - # - # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user - # - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") - message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") - message(STATUS "") - message(STATUS "To proceed: ") - message(STATUS "") - message(STATUS "Remove either the local project component: ${CMAKE_HOME_DIRECTORY}/components/wolfssl/ ") - message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") - message(STATUS "") - message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") - # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") + +if(CMAKE_BUILD_EARLY_EXPANSION) + message(STATUS "wolfssl component CMAKE_BUILD_EARLY_EXPANSION:") + idf_component_register( + REQUIRES "${COMPONENT_REQUIRES}" + PRIV_REQUIRES # esp_hw_support + # esp_timer + # driver # this will typically only be needed for wolfSSL benchmark + ) else() - if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # not CMAKE_BUILD_EARLY_EXPANSION + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config:") + message(STATUS "************************************************************************************************") + + # search for wolfSSL + FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) + if(WOLFSSL_ROOT) + message(STATUS "NEW Found wolfssl directory at: ${WOLFSSL_ROOT}") + else() + message(STATUS "NEW wolfssl directory not found.") + # Abort. We need wolfssl _somewhere_. + message(FATAL_ERROR "Could not find wolfssl in ${WOLFSSL_ROOT}.\n" + "Try setting WOLFSSL_ROOT environment variable or git clone.") + endif() + + set(INCLUDE_PATH ${WOLFSSL_ROOT}) + + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/src/") + + if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_benchmark" ) + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark") + endif() + + if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_test" ) + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/test") + endif() + + set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\"" + "\"${WOLFSSL_EXTRA_PROJECT_DIR}\"" + ) # COMPONENT_SRCDIRS + + message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + + set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl") + add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + + + # Espressif may take several passes through this makefile. Check to see if we found IDF + string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) + + # get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa + file(GLOB EXCLUDE_ASM *.S) + file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") + + message(STATUS "IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") + message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") + + # + # Check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) # - # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. + # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user # message(STATUS "") - message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "**************************************************************************************") message(STATUS "") + message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") + message(STATUS "") + message(STATUS "To proceed: ") + message(STATUS "") + message(STATUS "Remove either the local project component: ${WOLFSSL_PROJECT_DIR} ") + message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") + message(STATUS "") + message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") + message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + + # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") + else() - # - # wolfSSL is not an ESP-IDF component. We need to now determine if it is local and if so if it is part of the wolfSSL repo - # or if wolfSSL is simply installed as a local component. - # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" ) + if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) # - # wolfSSL found in local project. + # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/include/" ) - message(STATUS "") - message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - # - # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. + message(STATUS "") + message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "") + else() + # + # wolfSSL is not an ESP-IDF component. + # We need to now determine if it is local and if so if it is part of the wolfSSL repo, + # or if wolfSSL is simply installed as a local component. + # + + if( EXISTS "${WOLFSSL_PROJECT_DIR}" ) # - # We won't do anything else here, as it will be assumed the original install completed successfully. + # wolfSSL found in local project. # + if( EXISTS "${WOLFSSL_PROJECT_DIR}/wolfcrypt/" ) + message(STATUS "") + message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + # + # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. + # + # We won't do anything else here, as it will be assumed the original install completed successfully. + # + else() # full wolfSSL not installed in local project + # + # This is the developer repo mode. wolfSSL will be assumed to be not installed to ESP-IDF nor local project + # In this configuration, we are likely running a wolfSSL example found directly in the repo. + # + message(STATUS "") + message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + + message(STATUS "************************************************************************************************") + # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. + # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. + # + # first check if there's a [root]/include/user_settings.h + if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) + message(FATAL_ERROR "Found stray wolfSSL user_settings.h in " + "${WOLFSSL_ROOT}/include/user_settings.h " + " (please move it to ${WOLFSSL_PROJECT_DIR}/include/user_settings.h )") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/user_settings.h" ) + message(STATUS "Using existing wolfSSL user_settings.h in " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + else() + message(STATUS "Installing wolfSSL user_settings.h to " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" + DESTINATION "${CMAKE_HOME_DIRECTORY}/wolfssl/include/") + endif() + endif() # user_settings.h + + # next check if there's a [root]/include/config.h + if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + message(STATUS "Found stray wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS " Please move it to ${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "Using existing wolfSSL config.h ${WOLFSSL_PROJECT_DIR}/include/config.h") + else() + message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_PROJECT_DIR}/include/config.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_PROJECT_DIR}/include/") + file(RENAME "${WOLFSSL_PROJECT_DIR}/include/dummy_config_h" "${WOLFSSL_PROJECT_DIR}/include/config.h") + endif() # Project config.h + endif() # WOLFSSL_ROOT config.h + message(STATUS "************************************************************************************************") + message(STATUS "") + endif() + else() - # - # This is the developer repo mode. wolfSSL will be assume to be not installed to ESP-IDF nor local project - # In this configuration, we are likely running a wolfSSL example found directly in the repo. - # - message(STATUS "") - message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - - message(STATUS "************************************************************************************************") - # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. - # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. - # - # first check if there's a [root]/include/user_settings.h - if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) - # we won't overwrite an existing user settings file, just note that we already have one: - message(STATUS "Found wolfSSL user_settings.h in ${WOLFSSL_ROOT}/include/user_settings.h") - else() - message(STATUS "Installing wolfSSL user_settings.h to ${WOLFSSL_ROOT}/include/user_settings.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" DESTINATION "${WOLFSSL_ROOT}/include/") - endif() # user_settings.h - - # next check if there's a [root]/include/config.h - if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) - message(STATUS "Found wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h") + # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. + if($WOLFSSL_FOUND_IDF) + message(STATUS "") + message(STATUS "WARNING: wolfSSL not found.") + message(STATUS "") else() - message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_ROOT}/include/config.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_ROOT}/include/") - file(RENAME "${WOLFSSL_ROOT}/include/dummy_config_h" "${WOLFSSL_ROOT}/include/config.h") - endif() # config.h - message(STATUS "************************************************************************************************") - message(STATUS "") - endif() + # probably needs to be re-parsed by Espressif + message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") + endif() # else we have not found ESP-IDF yet + endif() # else not a local wolfSSL component - else() - # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. - if($WOLFSSL_FOUND_IDF) - message(STATUS "") - message(STATUS "WARNING: wolfSSL not found.") - message(STATUS "") - else() - # probably needs to be re-parsed by Espressif - message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") - endif() # else we have not found ESP-IDF yet - endif() # else not a local wolfSSL component + endif() #else not an ESP-IDF component + endif() # else not local copy and EDP-IDF wolfSSL - endif() #else not an ESP-IDF component -endif() # else not local copy and EDP-IDF wolfSSL + # RTOS_IDF_PATH is typically: + # "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" + # depending on the environment, we may need to swap backslashes with forward slashes + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") -# RTOS_IDF_PATH is typically: -# "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" -# depending on the environment, we may need to swap backslashes with forward slashes -string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT}) + + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}") + else() + # ESP-IDF prior version 4.4x has a different RTOS directory structure + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found legacy RTOS path: ${RTOS_IDF_PATH}") + else() + message(STATUS "Could not find RTOS path") + endif() + endif() -# ESP-IDF after version 4.4x has a different RTOS directory structure -string(REPLACE "\\" "/" RTOS_IDF_PATH5 "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") -if(IS_DIRECTORY ${IDF_PATH}/components/freertos/FreeRTOS-Kernel/) set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH5}" - "${WOLFSSL_ROOT}" - ) -else() + "./include" # this is the location of wolfssl user_settings.h + "\"${WOLFSSL_ROOT}/\"" + "\"${WOLFSSL_ROOT}/wolfssl/\"" + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"" + "\"${RTOS_IDF_PATH}/\"" + # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers + ${THIS_IDF_PATH}/components/esp_event/include + ${THIS_IDF_PATH}/components/esp_netif/include + ${THIS_IDF_PATH}/components/esp_wifi/include + ) + + + if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) + list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") + endif() + + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/\"") + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"") - set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH}" - "${WOLFSSL_ROOT}" - ) -endif() -if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) - list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") -endif() -set(COMPONENT_SRCEXCLUDE - "${WOLFSSL_ROOT}/src/bio.c" - "${WOLFSSL_ROOT}/src/conf.c" - "${WOLFSSL_ROOT}/src/misc.c" - "${WOLFSSL_ROOT}/src/pk.c" - "${WOLFSSL_ROOT}/src/ssl_misc.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/x509.c" - "${WOLFSSL_ROOT}/src/x509_str.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/evp.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/misc.c" - "${EXCLUDE_ASM}" - ) - -register_component() - -# some optional diagnostics -if (0) - get_cmake_property(_variableNames VARIABLES) - list (SORT _variableNames) - message(STATUS "") - message(STATUS "ALL VARIABLES BEGIN") - message(STATUS "") - foreach (_variableName ${_variableNames}) - message(STATUS "${_variableName}=${${_variableName}}") - endforeach() - message(STATUS "") - message(STATUS "ALL VARIABLES END") - message(STATUS "") -endif() + set(COMPONENT_SRCEXCLUDE + "\"${WOLFSSL_ROOT}/src/bio.c\"" + "\"${WOLFSSL_ROOT}/src/conf.c\"" + "\"${WOLFSSL_ROOT}/src/misc.c\"" + "\"${WOLFSSL_ROOT}/src/pk.c\"" + "\"${WOLFSSL_ROOT}/src/ssl_asn1.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_bn.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_certman.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_crypto.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_load.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_misc.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_p7p12.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_sess.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/x509.c\"" + "\"${WOLFSSL_ROOT}/src/x509_str.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_armthumb.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\"" + "\"${EXCLUDE_ASM}\"" + ) + + spaces2list(COMPONENT_REQUIRES) + + separate_arguments(COMPONENT_SRCDIRS NATIVE_COMMAND "${COMPONENT_SRCDIRS}") + separate_arguments(COMPONENT_SRCEXCLUDE NATIVE_COMMAND "${COMPONENT_SRCEXCLUDE}") + separate_arguments(COMPONENT_ADD_INCLUDEDIRS NATIVE_COMMAND "${COMPONENT_ADD_INCLUDEDIRS}") + + # + # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#example-component-requirements + # + message(STATUS "COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + message(STATUS "COMPONENT_ADD_INCLUDEDIRS = ${COMPONENT_ADD_INCLUDEDIRS}") + message(STATUS "COMPONENT_REQUIRES = ${COMPONENT_REQUIRES}") + message(STATUS "COMPONENT_SRCEXCLUDE = ${COMPONENT_SRCEXCLUDE}") + + # + # see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path + # + set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}") + idf_component_register( + SRC_DIRS "${COMPONENT_SRCDIRS}" + INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}" + REQUIRES "${COMPONENT_REQUIRES}" + EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}" + PRIV_REQUIRES esp_timer driver # this will typically only be needed for wolfSSL benchmark + ) + # some optional diagnostics + if (1) + get_cmake_property(_variableNames VARIABLES) + list (SORT _variableNames) + message(STATUS "") + message(STATUS "ALL VARIABLES BEGIN") + message(STATUS "") + foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") + endforeach() + message(STATUS "") + message(STATUS "ALL VARIABLES END") + message(STATUS "") + endif() + + # target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"") + +endif() # CMAKE_BUILD_EARLY_EXPANSION + + # check to see if there's both a local copy and EDP-IDF copy of the wolfssl components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) +if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) message(STATUS "") message(STATUS "") message(STATUS "********************************************************************") @@ -227,3 +472,69 @@ # end multiple component check +# +# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) +# +# Save the THIS_VAR as a string in a macro called VAR_OUPUT +# +# VAR_OUPUT: the name of the macro to define +# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process() +# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful. +# +function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT ) + # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true. + string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE) + + # if we had a successful operation, save the THIS_VAR in VAR_OUPUT + if(${IS_VALID_VALUE}) + # strip newline chars in THIS_VAR parameter and save in VAR_VALUE + string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR}) + + # we'll could percolate the value to the parent for possible later use + # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE) + + # but we're only using it here in this function + set(${VAR_OUPUT} ${VAR_VALUE}) + + # we'll print what we found to the console + message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}") + + # the interesting part is defining the VAR_OUPUT name a value to use in the app + add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\") + else() + # if we get here, check the execute_process command and parameters. + message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT") + set(${VAR_OUPUT} "Unknown") + endif() +endfunction() # LIBWOLFSSL_SAVE_INFO + +# create some programmatic #define values that will be used by ShowExtendedSystemInfo(). +# see wolfcrypt\src\port\Espressif\esp32_utl.c +if(NOT CMAKE_BUILD_EARLY_EXPANSION) + set (git_cmd "git") + message(STATUS "Adding macro definitions:") + + # LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\' + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}") + + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config complete!") + message(STATUS "************************************************************************************************") +endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,40 +1,248 @@ -# -# Copyright (C) 2006-2023 wolfSSL Inc. -# -# This file is part of wolfSSL. -# -# wolfSSL 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 of the License, or -# (at your option) any later version. -# -# wolfSSL 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA -# -# -# Component Makefile -# - -COMPONENT_ADD_INCLUDEDIRS := . ./include - -COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/components/freertos/include/freertos" -# COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/soc/esp32s3/include/soc" - -COMPONENT_SRCDIRS := src wolfcrypt/src -COMPONENT_SRCDIRS += wolfcrypt/src/port/Espressif -COMPONENT_SRCDIRS += wolfcrypt/src/port/atmel -COMPONENT_SRCDIRS += wolfcrypt/benchmark -COMPONENT_SRCDIRS += wolfcrypt/test - -CFLAGS +=-DWOLFSSL_USER_SETTINGS - -COMPONENT_OBJEXCLUDE := wolfcrypt/src/aes_asm.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/evp.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/misc.o -COMPONENT_OBJEXCLUDE += src/bio.o +# +# Copyright (C) 2006-2024 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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 of the License, or +# (at your option) any later version. +# +# wolfSSL 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +# + +# +# Component Makefile +# +# +# The Espressif Managed Components are only for newer versions of the ESP-IDF +# Typically only for ESP32[-x] targets and only for ESP-IDF v4.3 or later: +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html +# https://components.espressif.com/ +# +# Usage: +# +# make flash +# +# make flash ESPPORT=/dev/ttyS55 +# +# make flash ESPBAUD=9600 +# +# make monitor ESPPORT=COM1 +# +# make monitor ESPPORT=/dev/ttyS55 MONITORBAUD=115200 +# +# export ESPPORT=/dev/ttyS55 +# +# https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html +# + +# Although the project should define WOLFSSL_USER_SETTINGS, we'll also +# define it here: +CFLAGS +=-DWOLFSSL_USER_SETTINGS + +# NOTICE: the WOLFSSL_ROOT setting MUST be relative! +# See https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-guides/build-system.html?highlight=must+relative#optional-component-specific-variables +# In the wolfSSL GitHub examples for Espressif: +# https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples +# When this wolfssl component.mk makefile is in [project]/components/wolfssl +# The root is 7 directories up from here: +WOLFSSL_ROOT := ../../../../../../.. + +# NOTE: The wolfSSL include diretory (e.g. user_settings.h) is +# located HERE in THIS project, and *not* in the wolfSSL root. +COMPONENT_ADD_INCLUDEDIRS := ./include +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/. +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfssl/wolfcrypt/port/Espressif +# COMPONENT_ADD_INCLUDEDIRS += $ENV(IDF_PATH)/components/freertos/include/freertos +# COMPONENT_ADD_INCLUDEDIRS += "$ENV(IDF_PATH)/soc/esp32s3/include/soc" + +# wolfSSL +COMPONENT_SRCDIRS := $(WOLFSSL_ROOT)/src + +# wolfcrypt +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src + +# Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/atmel + +COMPONENT_OBJEXCLUDE := $(WOLFSSL_ROOT)/wolfcrypt/src/aes_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_x25519_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/wolfcrypt/src/aes_gcm_x86_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)/src/bio.o + + +## +## wolfSSL +## +COMPONENT_OBJS := $(WOLFSSL_ROOT)/src/bio.o +# COMPONENT_OBJS += src/conf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/crl.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/dtls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/internal.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/keys.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ocsp.o +# COMPONENT_OBJS += src/pk.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/quic.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/sniffer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/ssl.o +# COMPONENT_OBJS += src/ssl_asn1.o +# COMPONENT_OBJS += src/ssl_bn.o +# COMPONENT_OBJS += src/ssl_certman.o +# COMPONENT_OBJS += src/ssl_crypto.o +# COMPONENT_OBJS += src/ssl_misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/tls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/src/wolfio.o +# COMPONENT_OBJS += src/x509.o +# COMPONENT_OBJS += src/x509_str.o + +## +## wolfcrypt +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/arc4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/asn.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/async.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2b.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/blake2s.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/camellia.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/chacha20_poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/coding.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/compress.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cpuid.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/cryptocb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/curve448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/des3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dh.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dilithium.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/dsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/eccsi.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ecc_fp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ed448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/error.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/evp.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ext_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/falcon.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fe_operations.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/fips_test.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ge_operations.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/hpke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/integer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/kdf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/logging.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/md5.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/memory.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs12.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pkcs7.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/pwdbased.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/random.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rc2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/ripemd.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/rsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sakke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/selftest.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha256.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sha512.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/signature.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/siphash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sm4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sphincs.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_armthumb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_cortexm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_dsp32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_int.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_armthumb.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_c64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_cortexm.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_sm2_x86_64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/sp_x86_64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/srp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/tfm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_dsp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_encrypt.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_kyber_poly.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_pkcs11.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_port.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wc_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_first.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfcrypt_last.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfevent.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/wolfmath.o + +## +## Espressif +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_mp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp32_util.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.o + +## +## wolfcrypt benchmark (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark/benchmark.o +## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark +## COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)/wolfcrypt/benchmark + + +## +## wolfcrypt test (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)/wolfcrypt/test/test.o +## COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)/wolfcrypt/test + +## +## wolfcrypt +## +# COMPONENT_PRIV_INCLUDEDIRS += $(PROJECT_PATH)/components/wolfssl/include +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,583 @@ +/* user_settings.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.6.6-01 */ + +/* This user_settings.h is for Espressif ESP-IDF */ + +#include "sdkconfig.h" + +#define DEBUG_WOLFSSL +/* #define DEBUG_WOLFSSL_VERBOSE */ + +/* Experimental Kyber */ +#if 0 + #define WOLFSSL_EXPERIMENTAL_SETTINGS + #define WOLFSSL_HAVE_KYBER + #define WOLFSSL_WC_KYBER + #define WOLFSSL_SHA3 + #if defined(CONFIG_IDF_TARGET_ESP8266) + /* With limited RAM, we'll disable some of the Kyber sizes: */ + #define WOLFSSL_NO_KYBER1024 + #define WOLFSSL_NO_KYBER768 + #endif +#endif + +/* Pick a cert buffer size: */ +/* #define USE_CERT_BUFFERS_2048 */ +/* #define USE_CERT_BUFFERS_1024 */ +#define USE_CERT_BUFFERS_2048 + +/* The Espressif sdkconfig will have chipset info. +** +** Some possible values: +** +** CONFIG_IDF_TARGET_ESP32 +** CONFIG_IDF_TARGET_ESP32S2 +** CONFIG_IDF_TARGET_ESP32S3 +** CONFIG_IDF_TARGET_ESP32C3 +** CONFIG_IDF_TARGET_ESP32C6 +*/ + +#undef WOLFSSL_ESPIDF +#define WOLFSSL_ESPIDF + +/* We don't use WiFi helpers yet, so don't compile in the esp-sdk-lib WiFi */ +#define NO_ESP_SDK_WIFI + +/* + * ONE of these Espressif chipsets should be defined: + * + * WOLFSSL_ESP32 + * WOLFSSL_ESPWROOM32SE + * WOLFSSL_ESP8266 + * + * following ifdef detection only for syntax highlighting: + */ +#ifdef WOLFSSL_ESPWROOM32SE + #undef WOLFSSL_ESPWROOM32SE +#endif +#ifdef WOLFSSL_ESP8266 + #undef WOLFSSL_ESP8266 +#endif +#ifdef WOLFSSL_ESP32 + #undef WOLFSSL_ESP32 +#endif +/* See below for chipset detection from sdkconfig.h */ + +/* Small session cache saves a lot of RAM for ClientCache and SessionCache. + * Memory requirement is about 5KB, otherwise 20K is needed when not specified. + * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K) + * When really desperate, try NO_SESSION_CACHE. */ +#define MICRO_SESSION_CACHE + +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* When you don't want to use the old SHA */ +/* #define NO_SHA */ +/* #define NO_OLD_TLS */ + +#define BENCH_EMBEDDED + +#define WOLFSSL_SMALL_STACK +#define HAVE_ECC +#define RSA_LOW_MEM + +/* TLS 1.3 */ +#define WOLFSSL_TLS13 +#define HAVE_TLS_EXTENSIONS +#define WC_RSA_PSS +#define HAVE_HKDF +#define HAVE_AEAD +#define HAVE_SUPPORTED_CURVES + +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + +#define NO_FILESYSTEM + +#define NO_OLD_TLS + +#define HAVE_AESGCM + +/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */ +/* #define WOLFSSL_RIPEMD */ + +/* when you want to use SHA224 */ +#define WOLFSSL_SHA224 + +/* when you want to use SHA384 */ +#define WOLFSSL_SHA384 + +#if defined(CONFIG_IDF_TARGET_ESP8266) + /* Some known low-memory devices have features not enabled by default. */ +#else + /* when you want to use SHA512 */ + #define WOLFSSL_SHA512 + + /* when you want to use SHA3 */ + #define WOLFSSL_SHA3 + + /* ED25519 requires SHA512 */ + #define HAVE_ED25519 + + #define HAVE_ECC + #define HAVE_CURVE25519 + #define CURVE25519_SMALL + #define HAVE_ED25519 +#endif + +/* Optional OpenSSL compatibility */ +/* #define OPENSSL_EXTRA */ + +/* when you want to use pkcs7 */ +/* #define HAVE_PKCS7 */ +#if defined(HAVE_PKCS7) + #define HAVE_AES_KEYWRAP + #define HAVE_X963_KDF + #define WOLFSSL_AES_DIRECT +#endif + +/* when you want to use AES counter mode */ +/* #define WOLFSSL_AES_DIRECT */ +/* #define WOLFSSL_AES_COUNTER */ + +/* esp32-wroom-32se specific definition */ +#if defined(WOLFSSL_ESPWROOM32SE) + #define WOLFSSL_ATECC508A + #define HAVE_PK_CALLBACKS + /* when you want to use a custom slot allocation for ATECC608A */ + /* unless your configuration is unusual, you can use default */ + /* implementation. */ + /* #define CUSTOM_SLOT_ALLOCATION */ +#endif + +/* RSA primitive specific definition */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + /* Define USE_FAST_MATH and SMALL_STACK */ + #define ESP32_USE_RSA_PRIMITIVE + + #if defined(CONFIG_IDF_TARGET_ESP32) + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + + #endif +#endif + +/* #define WOLFSSL_ATECC508A_DEBUG */ + +/* date/time */ +/* if it cannot adjust time in the device, */ +/* enable macro below */ +/* #define NO_ASN_TIME */ +/* #define XTIME time */ + + +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ +#define ESP_RSA_TIMEOUT_CNT 0x249F00 + +#define HASH_SIZE_LIMIT /* for test.c */ + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + +#define HAVE_VERSION_EXTENDED_INFO +/* #define HAVE_WC_INTROSPECTION */ + +#define HAVE_SESSION_TICKET + +/* #define HAVE_HASHDRBG */ + +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_EXT +#define WOLFSSL_SYS_CA_CERTS + +#define WOLFSSL_CERT_TEXT + +#define WOLFSSL_ASN_TEMPLATE + +/* +#undef WOLFSSL_KEY_GEN +#undef WOLFSSL_CERT_REQ +#undef WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_EXT +#undef WOLFSSL_SYS_CA_CERTS +*/ + +/* command-line options +--enable-keygen +--enable-certgen +--enable-certreq +--enable-certext +--enable-asn-template +*/ + +/* Chipset detection from sdkconfig.h + * Default is HW enabled unless turned off. + * Uncomment lines to force SW instead of HW acceleration */ +#if defined(CONFIG_IDF_TARGET_ESP32) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + #define WOLFSSL_ESP32 + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: https://www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + #define WOLFSSL_ESP32 + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + #define WOLFSSL_ESP8266 + + /* There's no hardware encryption on the ESP8266 */ + /* Consider using the ESP32-C2/C3/C6 + * See https://www.espressif.com/en/products/socs/esp32-c2 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* There's no Hardware Acceleration available on ESP8684 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP8684 *****/ + +#else + /* Anything else encountered, disable HW accleration */ + #warning "Unexpected CONFIG_IDF_TARGET_NN value" + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +/* Debug options: +See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK +*/ + +#define WOLFSSL_ESPIDF_ERROR_PAUSE /* Pause in a loop rather than exit. */ +#define WOLFSSL_HW_METRICS + +/* #define HASH_SIZE_LIMIT */ /* for test.c */ + +/* #define NO_HW_MATH_TEST */ /* Optionally turn off HW math checks */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +/* used by benchmark: */ +#define WOLFSSL_PUBLIC_MP + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/***************************** Certificate Macros ***************************** + * + * The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * https://github.com/wolfSSL/wolfssl/pull/6825 + * https://github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +/* Conditional macros used in wolfSSL TLS client and server examples */ +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #include + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #if defined(USE_CERT_BUFFERS_2048) + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #elif defined(USE_CERT_BUFFERS_1024) + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + /* Optionally define custom cert arrays, sizes, and types here */ + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif /* Conditional key and cert constant names */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,12 +1,36 @@ - +# wolfSSL Espressif Example Project/main CMakeLists.txt +# v1.0 # # wolfssl server test # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") -set(COMPONENT_SRCS "server-tls.c" "wifi_connect.c") -set(COMPONENT_ADD_INCLUDEDIRS "." "./include") - +if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") +endif() +if(CMAKE_HOST_UNIX) + message("Detected UNIX") +endif() +if(APPLE) + message("Detected APPLE") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") +endif() +if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") +endif() +if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") +endif() set (git_cmd "git") if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) @@ -19,8 +43,14 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") endif() - -register_component() +## register_component() +idf_component_register(SRCS main.c + wifi_connect.c + time_helper.c + server-tls.c + INCLUDE_DIRS "." + "./include") +# # # LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) @@ -73,3 +103,4 @@ endif() message(STATUS "") + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/Kconfig.projbuild mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/Kconfig.projbuild --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/Kconfig.projbuild 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/Kconfig.projbuild 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9 @@ +menu "Example Configuration" + +config WOLFSSL_TARGET_PORT + int "Target port" + default 11111 + help + Host listening port for the example to connect. + +endmenu diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/main.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/main.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +/* template main.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/server-tls.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/server-tls.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/server-tls.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/server-tls.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,60 @@ +/* server-tls.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _SERVER_TLS_ +#define _SERVER_TLS_ + +#include /* includes wolfSSL user-settings.h */ +#include +#include "sdkconfig.h" + +#if defined(SINGLE_THREADED) + #define WOLFSSL_ESP_TASK int +#else + #include "freertos/FreeRTOS.h" + #define WOLFSSL_ESP_TASK void +#endif + +#ifdef CONFIG_WOLFSSL_TARGET_PORT + #define TLS_SMP_DEFAULT_PORT CONFIG_WOLFSSL_TARGET_PORT +#else + #define TLS_SMP_DEFAULT_PORT 11111 +#endif + +typedef struct { + int port; + int loops; +} tls_args; + +/* Function to show the ciphers available / in use. */ +#if defined(DEBUG_WOLFSSL) + int ShowCiphers(WOLFSSL* ssl); +#endif + +/* This is the TLS Server function, possibly in an RTOS thread. */ +WOLFSSL_ESP_TASK tls_smp_server_task(void *args); + +/* init will create an RTOS task, otherwise server is simply function call. */ +#if defined(SINGLE_THREADED) + /* no init neded */ +#else + WOLFSSL_ESP_TASK tls_smp_server_init(void* args); +#endif +#endif /* _SERVER_TLS_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/time_helper.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/time_helper.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/time_helper.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/time_helper.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* common Espressif time_helper v5.6.3.001 */ + +#ifndef _TIME_HELPER_H +#define _TIME_HELPER_H + +/* ESP-IDF uses a 64-bit signed integer to represent time_t starting from release v5.0 + * See: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#year-2036-and-2038-overflow-issues + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* a function to show the current data and time */ +int esp_show_current_datetime(); + +/* worst case, if GitHub time not available, used fixed time */ +int set_fixed_default_time(void); + +/* set time from string (e.g. GitHub commit time) */ +/* When not using the new esp-sdk-lib.h helpers: */ +/* int set_time_from_string(char* time_buffer); */ + +/* set time from NTP servers, + * also initially calls set_fixed_default_time or set_time_from_string */ +int set_time(void); + +/* wait NTP_RETRY_COUNT seconds before giving up on NTP time */ +int set_time_wait_for_ntp(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* #ifndef _TIME_HELPER_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/wifi_connect.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/wifi_connect.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/wifi_connect.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/wifi_connect.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* wifi_connect.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,25 +18,86 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -#ifndef _TLS_WIFI_H_ -#define _TLS_WIFI_H_ +#ifndef _WIFI_CONNECT_H_ +#define _WIFI_CONNECT_H_ -#include "esp_idf_version.h" -#include "esp_log.h" -#include "esp_wifi.h" -#if ESP_IDF_VERSION_MAJOR >= 4 -#include "esp_event.h" -#else -#include "esp_event_loop.h" -#endif +#include +#include -#define DEFAULT_PORT 11111 +/* ESP lwip */ +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY #define TLS_SMP_SERVER_TASK_NAME "tls_sever_example" -#define TLS_SMP_SERVER_TASK_WORDS 10240 +#define TLS_SMP_SERVER_TASK_BYTES 22240 #define TLS_SMP_SERVER_TASK_PRIORITY 8 #define TLS_SMP_WIFI_SSID CONFIG_WIFI_SSID #define TLS_SMP_WIFI_PASS CONFIG_WIFI_PASSWORD +#define USE_WIFI_EXAMPLE +#ifdef USE_WIFI_EXAMPLE + #include "esp_netif.h" + #include "protocol_examples_common.h" /* see project CMakeLists.txt */ #endif + +/** + ****************************************************************************** + ****************************************************************************** + ** USER APPLICATION SETTINGS BEGIN + ****************************************************************************** + ****************************************************************************** + **/ + +/* when using a private config with plain text passwords, + * file my_private_config.h should be excluded from git updates */ +/* #define USE_MY_PRIVATE_CONFIG */ + +#ifdef USE_MY_PRIVATE_CONFIG + #if defined(WOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS) + #include "/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_WSL) + #include "/mnt/c/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_LINUX) + #include "~/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_APPLE) + #include "~/Documents/my_private_config.h" + #else + #warning "did not detect environment. using ~/my_private_config.h" + #include "~/my_private_config.h" + #endif +#else + + /* + ** The examples use WiFi configuration that you can set via project + ** configuration menu + ** + ** If you'd rather not, just change the below entries to strings with + ** the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" + */ + #ifdef CONFIG_ESP_WIFI_SSID + #define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID + #else + /* See new esp-sdk-lib.h helpers: */ + #ifndef EXAMPLE_ESP_WIFI_SSID + #define EXAMPLE_ESP_WIFI_SSID "MYSSID_WIFI_CONNECT" + #endif + #endif + + #ifdef CONFIG_ESP_WIFI_PASSWORD + #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD + #else + /* See new esp-sdk-lib.h helpers: */ + #ifndef EXAMPLE_ESP_WIFI_PASS + #define EXAMPLE_ESP_WIFI_PASS "MYPASSWORD_WIFI_CONNECT" + #endif + #endif +#endif + +/* ESP lwip */ +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY + +int wifi_init_sta(void); + +int wifi_show_ip(void); + +#endif /* _WIFI_CONNECT_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/main.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,248 @@ +/* main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include "sdkconfig.h" +#include "main.h" + +/* ESP specific */ +#include +#include +#include + +/* wolfSSL */ +#include /* includes wolfSSL user-settings.h */ +#include +#ifndef WOLFSSL_ESPIDF + #warning "Problem with wolfSSL user_settings." + #warning "Check components/wolfssl/include" +#endif + +/* this project */ +#include "server-tls.h" +#include "time_helper.h" + +#ifndef CONFIG_IDF_TARGET_ESP32H2 + /* There's no WiFi on ESP32-H2. + * For wired ethernet, see: + * https://github.com/wolfSSL/wolfssl-examples/tree/master/ESP32/TLS13-ENC28J60-client */ + #include "wifi_connect.h" +#endif + +#ifdef WOLFSSL_TRACK_MEMORY + #include +#endif + +static const char* const TAG = "TLS Client"; + +#if defined(WOLFSSL_ESPWROOM32SE) && defined(HAVE_PK_CALLBACKS) \ + && defined(WOLFSSL_ATECC508A) + +#include "wolfssl/wolfcrypt/port/atmel/atmel.h" + +/* when you want to use a custom slot allocation */ +/* enable the definition CUSTOM_SLOT_ALLOCATION. */ + +#if defined(CUSTOM_SLOT_ALLOCATION) + +static byte mSlotList[ATECC_MAX_SLOT]; + +int atmel_set_slot_allocator(atmel_slot_alloc_cb alloc, atmel_slot_dealloc_cb dealloc); + +/* initialize slot array */ +void my_atmel_slotInit() +{ + int i; + for(i = 0;i < ATECC_MAX_SLOT;i++) { + mSlotList[i] = ATECC_INVALID_SLOT; + } +} + +/* allocate slot depending on slotType */ +int my_atmel_alloc(int slotType) +{ + int i, slot = -1; + + switch(slotType){ + case ATMEL_SLOT_ENCKEY: + slot = 4; + break; + case ATMEL_SLOT_DEVICE: + slot = 0; + break; + case ATMEL_SLOT_ECDHE: + slot = 0; + break; + case ATMEL_SLOT_ECDHE_ENC: + slot = 4; + break; + case ATMEL_SLOT_ANY: + for(i = 0;i < ATECC_MAX_SLOT;i++){ + if(mSlotList[i] == ATECC_INVALID_SLOT){ + slot = i; + break; + } + } + } + + return slot; +} + +/* free slot array */ +void my_atmel_free(int slotId) +{ + if(slotId >= 0 && slotId < ATECC_MAX_SLOT){ + mSlotList[slotId] = ATECC_INVALID_SLOT; + } +} +#endif /* CUSTOM_SLOT_ALLOCATION */ +#endif /* WOLFSSL_ESPWROOM32SE && HAVE_PK_CALLBACK && WOLFSSL_ATECC508A */ + +/* for FreeRTOS */ +void app_main(void) +{ + int stack_start = 0; + esp_err_t ret = 0; + ESP_LOGI(TAG, "---------------- wolfSSL TLS Server Example ------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); +#ifdef ESP_TASK_MAIN_STACK + ESP_LOGI(TAG, "ESP_TASK_MAIN_STACK: %d", ESP_TASK_MAIN_STACK); +#endif +#ifdef TASK_EXTRA_STACK_SIZE + ESP_LOGI(TAG, "TASK_EXTRA_STACK_SIZE: %d", TASK_EXTRA_STACK_SIZE); +#endif +#ifdef INCLUDE_uxTaskGetStackHighWaterMark + ESP_LOGI(TAG, "CONFIG_ESP_MAIN_TASK_STACK_SIZE = %d bytes (%d words)", + CONFIG_ESP_MAIN_TASK_STACK_SIZE, + (int)(CONFIG_ESP_MAIN_TASK_STACK_SIZE / sizeof(void*))); + + /* Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in bytes not words, unlike + * vanilla FreeRTOS) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html + */ + stack_start = uxTaskGetStackHighWaterMark(NULL); + ESP_LOGI(TAG, "Stack Start HWM: %d bytes", stack_start); +#endif + +#ifdef HAVE_VERSION_EXTENDED_INFO + esp_ShowExtendedSystemInfo(); +#endif + + /* Set time for cert validation. + * Some lwIP APIs, including SNTP functions, are not thread safe. */ + ret = set_time(); /* need to setup NTP before WiFi */ + + /* Optionally erase flash */ + /* ESP_ERROR_CHECK(nvs_flash_erase()); */ + +#ifdef FOUND_PROTOCOL_EXAMPLES_DIR + ESP_LOGI(TAG, "FOUND_PROTOCOL_EXAMPLES_DIR active, using example code."); + ESP_ERROR_CHECK(nvs_flash_init()); + + #if defined(CONFIG_IDF_TARGET_ESP32H2) + ESP_LOGE(TAG, "There's no WiFi on ESP32-H2."); + #else + #ifdef CONFIG_EXAMPLE_WIFI_SSID + if (XSTRCMP(CONFIG_EXAMPLE_WIFI_SSID, "myssid") == 0) { + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID is myssid."); + ESP_LOGW(TAG, " Do you have a WiFi AP called myssid, or "); + ESP_LOGW(TAG, " did you forget the ESP-IDF configuration?"); + } + #else + #define CONFIG_EXAMPLE_WIFI_SSID "myssid" + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID not defined."); + #endif + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + ESP_ERROR_CHECK(example_connect()); + #endif +#else + ESP_ERROR_CHECK(nvs_flash_init()); + + /* Initialize NVS */ + ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || + ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + #if defined(CONFIG_IDF_TARGET_ESP32H2) + ESP_LOGE(TAG, "There's no WiFi on ESP32-H2. "); + #else + /* Initialize WiFi */ + ESP_LOGI(TAG, "ESP_WIFI_MODE_STA"); + ret = wifi_init_sta(); + while (ret != 0) { + ESP_LOGI(TAG, "Waiting..."); + vTaskDelay(60000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Trying WiFi again..."); + ret = wifi_init_sta(); + } + #endif +#endif + + /* Once we are connected to the network, start & wait for NTP time */ + ret = set_time_wait_for_ntp(); + + if (ret < -1) { + /* a value of -1 means there was no NTP server, so no need to wait */ + ESP_LOGI(TAG, "Waiting 10 more seconds for NTP to complete." ); + vTaskDelay(10000 / portTICK_PERIOD_MS); /* brute-force solution */ + esp_show_current_datetime(); + } + + /* HWM is maximum amount of stack space that has been unused, in bytes + * not words (unlike vanilla freeRTOS). */ + ESP_LOGI(TAG, "Initial Stack Used (before wolfSSL Server): %d bytes", + CONFIG_ESP_MAIN_TASK_STACK_SIZE + - (uxTaskGetStackHighWaterMark(NULL)) + ); + ESP_LOGI(TAG, "Starting TLS Server...\n"); + +#if defined(SINGLE_THREADED) + /* just call the task */ + tls_smp_server_task((void*)NULL); +#else + tls_args args[1] = {0}; + /* start a thread with the task */ + tls_smp_server_init(args); /* NULL will use the DEFAULT_PORT value */ +#endif + + /* done */ + while (1) { + +#if defined(SINGLE_THREADED) + ESP_LOGV(TAG, "\n\nDone!\n\n"); + while (1); +#else + /* Delete this main task to free up memory */ + ESP_LOGV(TAG, "\n\nvTaskDelete...\n\n"); + vTaskDelete(NULL); +#endif + } /* done while */ + +} /* app_main */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* server-tls-callback.c +/* server-tls.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,123 +18,106 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -/* the usual suspects */ -#include -#include -#include -#include + +#include "server-tls.h" + +/* Espressif FreeRTOS */ +#ifndef SINGLE_THREADED + #include + #include + #include +#endif /* socket includes */ +#include +#include +#include /* For TCP options */ #include -#include -#include -#include + +#ifndef TCP_RTO_MIN + #define TCP_RTO_MIN 1500 +#endif /* wolfSSL */ #include -#include #include - -/* ESP specific */ -#include "wifi_connect.h" +#include #ifdef WOLFSSL_TRACK_MEMORY #include #endif -static const char* const TAG = "tls_server"; - -#if defined(DEBUG_WOLFSSL) - -static void ShowCiphers(void) -{ - char ciphers[4096]; - - int ret = wolfSSL_get_ciphers(ciphers, (int)sizeof(ciphers)); - - if (ret == WOLFSSL_SUCCESS) - printf("%s\n", ciphers); -} +#ifndef NO_DH + /* see also wolfssl/test.h */ + #undef DEFAULT_MIN_DHKEY_BITS + #define DEFAULT_MIN_DHKEY_BITS 1024 + #undef DEFAULT_MAX_DHKEY_BITS + #define DEFAULT_MAX_DHKEY_BITS 2048 #endif -#if defined(WOLFSSL_ESPWROOM32SE) && defined(HAVE_PK_CALLBACKS) \ - && defined(WOLFSSL_ATECC508A) - -#include "wolfssl/wolfcrypt/port/atmel/atmel.h" - -/* when you want to use a custom slot allocation */ -/* enable the definition CUSTOM_SLOT_ALLOCATION. */ - -#if defined(CUSTOM_SLOT_ALLOCATION) - -static byte mSlotList[ATECC_MAX_SLOT]; - -int atmel_set_slot_allocator(atmel_slot_alloc_cb alloc, atmel_slot_dealloc_cb dealloc); +/* Project */ +#include "wifi_connect.h" +#include "time_helper.h" -/* initialize slot array */ -void my_atmel_slotInit() -{ - int i; - for(i=0;i= 0 && slotId < ATECC_MAX_SLOT){ - mSlotList[slotId] = ATECC_INVALID_SLOT; - } -} -#endif /* CUSTOM_SLOT_ALLOCATION */ -#endif /* WOLFSSL_ESPWROOM32SE && HAVE_PK_CALLBACK && WOLFSSL_ATECC508A */ +#if defined(SINGLE_THREADED) + #define TLS_SMP_SERVER_TASK_RET ret +#else + #define TLS_SMP_SERVER_TASK_RET +#endif + char buff[256]; + const char msg[] = "I hear you fa shizzle!"; -void tls_smp_server_task() -{ - int sockfd; - int connd; struct sockaddr_in servAddr; struct sockaddr_in clientAddr; - socklen_t size = sizeof(clientAddr); - char buff[256]; - size_t len; + int sockfd; + int connd; int shutdown = 0; int ret; - const char msg[] = "I hear you fa shizzle!"; - + socklen_t size = sizeof(clientAddr); + size_t len; +#if 0 + /* optionally set TCP RTO. See also below. */ + int rto_min = 200; /* Minimum TCP RTO in milliseconds */ +#endif /* declare wolfSSL objects */ WOLFSSL_CTX* ctx; WOLFSSL* ssl; @@ -142,9 +125,8 @@ WOLFSSL_ENTER("tls_smp_server_task"); #ifdef DEBUG_WOLFSSL - WOLFSSL_MSG("Debug ON"); wolfSSL_Debugging_ON(); - ShowCiphers(); + ShowCiphers(NULL); #endif /* Initialize wolfSSL */ @@ -159,11 +141,103 @@ ESP_LOGE(TAG, "ERROR: failed to create the socket"); } + /* Optionally set TCP RTO + setsockopt(sockfd, IPPROTO_TCP, TCP_RTO_MIN, &rto_min, sizeof(rto_min)); */ + /* Create and initialize WOLFSSL_CTX */ WOLFSSL_MSG("Create and initialize WOLFSSL_CTX"); +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + /* ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method()); for only TLS 1.3 */ + if (ctx == NULL) { + ESP_LOGE(TAG, "ERROR: failed to create WOLFSSL_CTX"); + } +#else if ((ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())) == NULL) { ESP_LOGE(TAG, "ERROR: failed to create WOLFSSL_CTX"); } +#endif + +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + ESP_LOGI(TAG, "Start SM3\n"); + + /* Optional set explicit ciphers + ret = wolfSSL_CTX_set_cipher_list(ctx, WOLFSSL_ESP32_CIPHER_SUITE); + if (ret == SSL_SUCCESS) { + ESP_LOGI(TAG, "Set cipher list: "WOLFSSL_ESP32_CIPHER_SUITE"\n"); + } + else { + ESP_LOGE(TAG, "ERROR: failed to set cipher list: "WOLFSSL_ESP32_CIPHER_SUITE"\n"); + } + */ + ShowCiphers(NULL); + ESP_LOGI(TAG, "Stack used: %d\n", CONFIG_ESP_MAIN_TASK_STACK_SIZE + - uxTaskGetStackHighWaterMark(NULL)); + + WOLFSSL_MSG("Loading certificate..."); + /* -c Load server certificates into WOLFSSL_CTX */ + ret = wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, + CTX_SERVER_CERT, + CTX_SERVER_CERT_SIZE, + CTX_SERVER_CERT_TYPE + ); + +/* optional wolfSSL_CTX_use_certificate_buffer + ret = wolfSSL_CTX_use_certificate_buffer(ctx, + server_sm2, + sizeof_server_sm2, + WOLFSSL_FILETYPE_PEM); +*/ + if (ret == SSL_SUCCESS) { + ESP_LOGI(TAG, "Loaded server_sm2\n"); + } + else { + ESP_LOGE(TAG, "ERROR: failed to load cert\n"); + } + ESP_LOGI(TAG, "Stack used: %d\n", CONFIG_ESP_MAIN_TASK_STACK_SIZE + - uxTaskGetStackHighWaterMark(NULL)); + +#ifndef NO_DH + #define DEFAULT_MIN_DHKEY_BITS 1024 + #define DEFAULT_MAX_DHKEY_BITS 2048 + int minDhKeyBits = DEFAULT_MIN_DHKEY_BITS; + ret = wolfSSL_CTX_SetMinDhKey_Sz(ctx, (word16)minDhKeyBits); +#endif +#ifndef NO_RSA + #define DEFAULT_MIN_RSAKEY_BITS 1024 + short minRsaKeyBits = DEFAULT_MIN_RSAKEY_BITS; + ret = wolfSSL_CTX_SetMinRsaKey_Sz(ctx, minRsaKeyBits); +#endif + + WOLFSSL_MSG("Loading key info..."); + /* -k Load server key into WOLFSSL_CTX */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + CTX_SERVER_KEY, + CTX_SERVER_KEY_SIZE, + CTX_SERVER_KEY_TYPE); + + if (ret == SSL_SUCCESS) { + ESP_LOGI(TAG, "Loaded PrivateKey_buffer server_sm2_priv\n"); + } + else { + ESP_LOGE(TAG, "ERROR: failed to load " + "PrivateKey_buffer server_sm2_priv\n"); + } + ESP_LOGI(TAG, "Stack used: %d\n", CONFIG_ESP_MAIN_TASK_STACK_SIZE + - uxTaskGetStackHighWaterMark(NULL)); + /* -A load authority */ + ret = wolfSSL_CTX_load_verify_buffer(ctx, + client_sm2, + sizeof_client_sm2, + WOLFSSL_FILETYPE_PEM); + if (ret == SSL_SUCCESS) { + ESP_LOGI(TAG, "Success: load verify buffer\n"); + } + else { + ESP_LOGE(TAG, "ERROR: failed to load verify buffer\n"); + } + ESP_LOGI(TAG, "Finish SM2\n"); +#else WOLFSSL_MSG("Loading certificate..."); /* Load server certificates into WOLFSSL_CTX */ @@ -181,14 +255,17 @@ ESP_LOGE(TAG, "ERROR: failed to load privatekey"); } - /* TO DO when using ECDSA, it loads the provisioned certificate and present it.*/ - /* TO DO when using ECDSA, it uses the generated key instead of loading key */ +#endif + + + /* TODO when using ECDSA,it loads the provisioned certificate and present it. + TODO when using ECDSA,it uses the generated key instead of loading key */ /* Initialize the server address struct with zeros */ memset(&servAddr, 0, sizeof(servAddr)); /* Fill in the server address */ servAddr.sin_family = AF_INET; /* using IPv4 */ - servAddr.sin_port = htons(DEFAULT_PORT); /* on DEFAULT_PORT */ + servAddr.sin_port = htons(TLS_SMP_DEFAULT_PORT); /* on port */ servAddr.sin_addr.s_addr = INADDR_ANY; /* from anywhere */ /* Bind the server socket to our port */ @@ -210,38 +287,67 @@ atmel_set_slot_allocator(my_atmel_alloc, my_atmel_free); #endif #endif - + ESP_LOGI(TAG, "accept clients..."); /* Continue to accept clients until shutdown is issued */ while (!shutdown) { - WOLFSSL_MSG("Waiting for a connection..."); - /* Accept client connections */ + ESP_LOGI(TAG, "Stack used: %d\n", TLS_SMP_SERVER_TASK_BYTES + - uxTaskGetStackHighWaterMark(NULL) ); + WOLFSSL_MSG("Waiting for a connection..."); + wifi_show_ip(); + + /* Accept client socket connections */ if ((connd = accept(sockfd, (struct sockaddr*)&clientAddr, &size)) == -1) { ESP_LOGE(TAG, "ERROR: failed to accept the connection"); } +#if defined(WOLFSSL_EXPERIMENTAL_SETTINGS) + ESP_LOGW(TAG, "WOLFSSL_EXPERIMENTAL_SETTINGS is enabled"); +#endif /* Create a WOLFSSL object */ if ((ssl = wolfSSL_new(ctx)) == NULL) { - ESP_LOGE(TAG, "ERROR: failed to create WOLFSSL object"); + ESP_LOGE(TAG, "ERROR: failed to create WOLFSSL object"); + } +#if defined(WOLFSSL_HAVE_KYBER) + else { + /* If success creating CTX and Kyber enabled, set key share: */ + ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_P521_KYBER_LEVEL5); + if (ret == SSL_SUCCESS) { + ESP_LOGI(TAG, "UseKeyShare WOLFSSL_P521_KYBER_LEVEL5 success"); + } + else { + ESP_LOGE(TAG, "UseKeyShare WOLFSSL_P521_KYBER_LEVEL5 failed"); + } } +#else + ESP_LOGI(TAG, "WOLFSSL_HAVE_KYBER is not enabled"); +#endif + /* show what cipher connected for this WOLFSSL* object */ + ShowCiphers(ssl); + /* Attach wolfSSL to the socket */ wolfSSL_set_fd(ssl, connd); + /* Establish TLS connection */ ret = wolfSSL_accept(ssl); - if (ret != SSL_SUCCESS) { - ESP_LOGE(TAG, "wolfSSL_accept error %d", wolfSSL_get_error(ssl, ret)); + if (ret == SSL_SUCCESS) { + ShowCiphers(ssl); + } + else { + ESP_LOGE(TAG, "wolfSSL_accept error %d", + wolfSSL_get_error(ssl, ret)); } - WOLFSSL_MSG("Client connected successfully"); + ESP_LOGI(TAG, "Client connected successfully"); + /* Read the client data into our buff array */ memset(buff, 0, sizeof(buff)); if (wolfSSL_read(ssl, buff, sizeof(buff)-1) == -1) { ESP_LOGE(TAG, "ERROR: failed to read"); } - /* Print to stdout any data the client sends */ - WOLFSSL_MSG("Client sends:"); - WOLFSSL_MSG(buff); + + ESP_LOGI(TAG, "Client sends: %s", buff); /* Check for server shutdown command */ if (strncmp(buff, "shutdown", 8) == 0) { - WOLFSSL_MSG("Shutdown command issued!"); + ESP_LOGI(TAG, "Shutdown command issued!"); shutdown = 1; } /* Write our reply into buff */ @@ -252,16 +358,63 @@ if (wolfSSL_write(ssl, buff, len) != len) { ESP_LOGE(TAG, "ERROR: failed to write"); } + + ESP_LOGI(TAG, "Done! Cleanup..."); /* Cleanup after this connection */ wolfSSL_free(ssl); /* Free the wolfSSL object */ close(connd); /* Close the connection to the client */ - } + } /* !shutdown */ /* Cleanup and return */ + wolfSSL_free(ssl); /* Free the wolfSSL object */ wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ close(sockfd); /* Close the socket listening for clients */ vTaskDelete(NULL); - return; /* Return reporting a success */ + return TLS_SMP_SERVER_TASK_RET; } + +#if defined(SINGLE_THREADED) + /* we don't initialize a thread */ +#else +/* create task */ +WOLFSSL_ESP_TASK tls_smp_server_init(void* args) +{ +#if defined(SINGLE_THREADED) + #define TLS_SMP_CLIENT_TASK_RET ret +#else + #define TLS_SMP_CLIENT_TASK_RET +#endif + int thisPort = 0; + int ret_i = 0; /* interim return result */ + if (thisPort == 0) { + thisPort = TLS_SMP_DEFAULT_PORT; + } + +#if ESP_IDF_VERSION_MAJOR >= 4 + TaskHandle_t _handle; +#else + xTaskHandle _handle; +#endif + /* Note that despite vanilla FreeRTOS using WORDS for a parameter, + * Espressif uses BYTES for the task stack size here. + * See https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32/api-reference/system/freertos.html */ + ESP_LOGI(TAG, "Creating tls_smp_server_task with stack size = %d", + TLS_SMP_SERVER_TASK_BYTES); + ret_i = xTaskCreate(tls_smp_server_task, + TLS_SMP_SERVER_TASK_NAME, + TLS_SMP_SERVER_TASK_BYTES, + (void*)&thisPort, + TLS_SMP_SERVER_TASK_PRIORITY, + &_handle); + + if (ret_i != pdPASS) { + ESP_LOGI(TAG, "create thread %s failed", TLS_SMP_SERVER_TASK_NAME); + } + + /* vTaskStartScheduler(); called automatically in ESP-IDF */ + return TLS_SMP_CLIENT_TASK_RET; +} +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/time_helper.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/time_helper.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/time_helper.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/time_helper.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,333 @@ +/* time_helper.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* common Espressif time_helper v5.6.3.002 */ +#include "sdkconfig.h" +#include "time_helper.h" + +#include +#include + +#if defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) + #if (ESP_IDF_VERSION_MAJOR == 5) && (ESP_IDF_VERSION_MINOR >= 1) + #define HAS_ESP_NETIF_SNTP 1 + #include + #include + #else + #include + #include + #endif +#else + /* TODO Consider pre IDF v5? */ +#endif + +/* ESP-IDF uses a 64-bit signed integer to represent time_t starting from release v5.0 + * See: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#year-2036-and-2038-overflow-issues + */ +const static char* TAG = "time_helper"; + +/* see https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html */ +#ifndef TIME_ZONE +/* + * PST represents Pacific Standard Time. + * +8 specifies the offset from UTC (Coordinated Universal Time), indicating + * that Pacific Time is UTC-8 during standard time. + * PDT represents Pacific Daylight Time. + * M3.2.0 indicates that Daylight Saving Time (DST) starts on the + * second (2) Sunday (0) of March (3). + * M11.1.0 indicates that DST ends on the first (1) Sunday (0) of November (11) + */ + #define TIME_ZONE "PST+8PDT,M3.2.0,M11.1.0" +#endif /* not defined: TIME_ZONE, so we are setting our own */ + +#define NTP_RETRY_COUNT 10 + +/* NELEMS(x) number of elements + * To determine the number of elements in the array, we can divide the total + * size of the array by the size of the array element. + * See https://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my-array-in-c + **/ +#define NELEMS(x) ( (int)(sizeof(x) / sizeof((x)[0])) ) + +/* See also CONFIG_LWIP_SNTP_MAX_SERVERS in sdkconfig */ +#define NTP_SERVER_LIST ( (char*[]) { \ + "pool.ntp.org", \ + "time.nist.gov", \ + "utcnist.colorado.edu" \ + } \ + ) +/* #define NTP_SERVER_COUNT using NELEMS: + * + * (int)(sizeof(NTP_SERVER_LIST) / sizeof(NTP_SERVER_LIST[0])) + */ +#define NTP_SERVER_COUNT NELEMS(NTP_SERVER_LIST) + +#ifndef CONFIG_LWIP_SNTP_MAX_SERVERS + /* We should find max value in sdkconfig, if not set it to our count:*/ + #define CONFIG_LWIP_SNTP_MAX_SERVERS NTP_SERVER_COUNT +#endif + +char* ntpServerList[NTP_SERVER_COUNT] = NTP_SERVER_LIST; + +/* our NTP server list is global info */ +extern char* ntpServerList[NTP_SERVER_COUNT]; + +/* Show the current date and time */ +int esp_show_current_datetime() +{ + time_t now; + char strftime_buf[64]; + struct tm timeinfo; + + time(&now); + setenv("TZ", TIME_ZONE, 1); + tzset(); + + localtime_r(&now, &timeinfo); + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + ESP_LOGI(TAG, "The current date/time is: %s", strftime_buf); + return 0; +} + +/* the worst-case scenario is a hard-coded date/time */ +int set_fixed_default_time(void) +{ + /* ideally, we'd like to set time from network, + * but let's set a default time, just in case */ + struct tm timeinfo = { + .tm_year = 2023 - 1900, + .tm_mon = 10, + .tm_mday = 02, + .tm_hour = 13, + .tm_min = 01, + .tm_sec = 05 + }; + struct timeval now; + time_t interim_time; + int ret = -1; + + /* set interim static time */ + interim_time = mktime(&timeinfo); + + ESP_LOGI(TAG, "Adjusting time from fixed value"); + now = (struct timeval){ .tv_sec = interim_time }; + ret = settimeofday(&now, NULL); + + return ret; +} + +/* set_time_from_string(s) + * + * returns 0 = success if able to set the time from the provided string + * error for any other value, typically -1 */ +int set_time_from_string(char* time_buffer) +{ + /* expecting github default formatting: 'Thu Aug 31 12:41:45 2023 -0700' */ + const char *format = "%3s %3s %d %d:%d:%d %d %s"; + struct tm this_timeinfo; + struct timeval now; + time_t interim_time; + char offset[6]; /* expecting trailing single quote, not used */ + char day_str[4]; + char month_str[4]; + int day, year, hour, minute, second; + int quote_offset = 0; + int ret = 0; + + /* we are expecting the string to be encapsulated in single quotes */ + if (*time_buffer == 0x27) { + quote_offset = 1; + } + + ret = sscanf(time_buffer + quote_offset, + format, + day_str, month_str, + &day, &hour, &minute, &second, &year, &offset); + + if (ret == 8) { + /* we found a match for all componets */ + + const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + + for (int i = 0; i < 12; i++) { + if (strcmp(month_str, months[i]) == 0) { + this_timeinfo.tm_mon = i; + break; + } + } + + this_timeinfo.tm_mday = day; + this_timeinfo.tm_hour = hour; + this_timeinfo.tm_min = minute; + this_timeinfo.tm_sec = second; + this_timeinfo.tm_year = year - 1900; /* Number of years since 1900 */ + + interim_time = mktime(&this_timeinfo); + now = (struct timeval){ .tv_sec = interim_time }; + ret = settimeofday(&now, NULL); + ESP_LOGI(TAG, "Time updated to %s", time_buffer); + } + else { + ESP_LOGE(TAG, "Failed to convert \"%s\" to a tm date.", time_buffer); + ESP_LOGI(TAG, "Trying fixed date that was hard-coded."); + set_fixed_default_time(); + ret = -1; + } + return ret; +} + +/* set time; returns 0 if succecssfully configured with NTP */ +int set_time(void) +{ +#ifndef NTP_SERVER_COUNT + ESP_LOGW(TAG, "Warning: no sntp server names defined. " + "Setting to empty list"); + #define NTP_SERVER_COUNT 0 + #warning "NTP not properly configured" +#endif /* not defined: NTP_SERVER_COUNT */ + +#ifdef HAS_ESP_NETIF_SNTP + #if CONFIG_LWIP_SNTP_MAX_SERVERS > 1 + esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG_MULTIPLE( + NTP_SERVER_COUNT, + ESP_SNTP_SERVER_LIST(ntpServerList[0]) + ); + #else + esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG(ntpServerList[0]); + #endif /* CONFIG_LWIP_SNTP_MAX_SERVERS > 1 */ +#endif /* HAS_ESP_NETIF_SNTP */ + + int ret = 0; + int i = 0; /* counter for time servers */ + + ESP_LOGI(TAG, "Setting the time. Startup time:"); + esp_show_current_datetime(); + +#ifdef LIBWOLFSSL_VERSION_GIT_HASH_DATE + /* initialy set a default approximate time from recent git commit */ + ESP_LOGI(TAG, "Found git hash date, attempting to set system date."); + set_time_from_string(LIBWOLFSSL_VERSION_GIT_HASH_DATE); + esp_show_current_datetime(); + + ret = -4; +#else + /* otherwise set a fixed time that was hard coded */ + set_fixed_default_time(); + ret = -3; +#endif + +#ifdef CONFIG_SNTP_TIME_SYNC_METHOD_SMOOTH + config.smooth_sync = true; +#endif + + if (NTP_SERVER_COUNT) { + /* next, let's setup NTP time servers + * + * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#sntp-time-synchronization + * + * WARNING: do not set operating mode while SNTP client is running! + */ + /* TODO Consider esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); */ + sntp_setoperatingmode(SNTP_OPMODE_POLL); + if (NTP_SERVER_COUNT > CONFIG_LWIP_SNTP_MAX_SERVERS) { + ESP_LOGW(TAG, "WARNING: %d NTP Servers defined, but " + "CONFIG_LWIP_SNTP_MAX_SERVERS = %d", + NTP_SERVER_COUNT,CONFIG_LWIP_SNTP_MAX_SERVERS); + } + ESP_LOGI(TAG, "sntp_setservername:"); + for (i = 0; i < CONFIG_LWIP_SNTP_MAX_SERVERS; i++) { + const char* thisServer = ntpServerList[i]; + if (strncmp(thisServer, "\x00", 1) == 0) { + /* just in case we run out of NTP servers */ + break; + } + ESP_LOGI(TAG, "%s", thisServer); + sntp_setservername(i, thisServer); + } + #ifdef HAS_ESP_NETIF_SNTP + ret = esp_netif_sntp_init(&config); + #else + ESP_LOGW(TAG,"Warning: Consider upgrading ESP-IDF to take advantage " + "of updated SNTP libraries"); + #endif + if (ret == ESP_OK) { + ESP_LOGV(TAG, "Successfully called esp_netif_sntp_init"); + } + else { + ESP_LOGE(TAG, "ERROR: esp_netif_sntp_init return = %d", ret); + } + + sntp_init(); + switch (ret) { + case ESP_ERR_INVALID_STATE: + break; + default: + break; + } + ESP_LOGI(TAG, "sntp_init done."); + } + else { + ESP_LOGW(TAG, "No sntp time servers found."); + ret = -1; + } + return ret; +} + +/* wait for NTP to actually set the time */ +int set_time_wait_for_ntp(void) +{ + int ret = 0; +#ifdef HAS_ESP_NETIF_SNTP + int ntp_retry = 0; + const int ntp_retry_count = NTP_RETRY_COUNT; + + ret = esp_netif_sntp_start(); + + ret = esp_netif_sntp_sync_wait(500 / portTICK_PERIOD_MS); +#endif /* HAS_ESP_NETIF_SNTP */ + esp_show_current_datetime(); + +#ifdef HAS_ESP_NETIF_SNTP + while (ret == ESP_ERR_TIMEOUT && (ntp_retry++ < ntp_retry_count)) { + ret = esp_netif_sntp_sync_wait(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Waiting for NTP to sync time... (%d/%d)", + ntp_retry, + ntp_retry_count); + esp_show_current_datetime(); + } +#endif /* HAS_ESP_NETIF_SNTP */ + +#ifdef TIME_ZONE + setenv("TZ", TIME_ZONE, 1); + tzset(); +#endif + + if (ret == ESP_OK) { + ESP_LOGI(TAG, "Successfuly set time via NTP servers."); + } + else { + ESP_LOGW(TAG, "Warning: Failed to set time with NTP: " + "result = 0x%0x: %s", + ret, esp_err_to_name(ret)); + } + return ret; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/wifi_connect.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/wifi_connect.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/wifi_connect.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/wifi_connect.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* wifi_connect.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,92 +18,51 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -/*ESP specific */ -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "freertos/event_groups.h" -#include "wifi_connect.h" -#include "lwip/sockets.h" -#include "lwip/netdb.h" -#include "lwip/apps/sntp.h" -#include "nvs_flash.h" + #include "wifi_connect.h" + +#include +#include +#include +#include +#include /* wolfSSL */ #include -#include #include +#include #ifndef WOLFSSL_ESPIDF - #warning "problem with wolfSSL user_settings. Check components/wolfssl/include" + #warning "Problem with wolfSSL user_settings." + #warning "Check components/wolfssl/include" #endif -#if ESP_IDF_VERSION_MAJOR >= 4 +#if ESP_IDF_VERSION_MAJOR >= 5 +#elif ESP_IDF_VERSION_MAJOR >= 4 #include "protocol_examples_common.h" #else const static int CONNECTED_BIT = BIT0; static EventGroupHandle_t wifi_event_group; #endif -/* prefix for logging */ -const static char *TAG = "tls_server"; -/* proto-type definition */ -extern void tls_smp_server_task(); -static void tls_smp_server_init(); - -static void set_time() -{ - /* set dummy wallclock time. */ - struct timeval utctime; - struct timezone tz; - struct strftime_buf; - time_t now; - struct tm timeinfo; - char strftime_buf[64]; - /* please update the time if seeing unknown failure when loading cert. */ - /* this could cause TLS communication failure due to time expiration */ - /* incleasing 31536000 seconds is close to spend 356 days. */ - utctime.tv_sec = 1645797600; /* dummy time: Fri 25 Feb 2022 02:00:00 2022 */ - utctime.tv_usec = 0; - tz.tz_minuteswest = 0; - tz.tz_dsttime = 0; - - settimeofday(&utctime, &tz); - - time(&now); - localtime_r(&now, &timeinfo); - - strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); - ESP_LOGI(TAG, "The current date/time is: %s", strftime_buf); - -#if ESP_IDF_VERSION_MAJOR < 4 - /* wait until wifi connect */ - xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, - false, true, portMAX_DELAY); +#if defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) + #if ESP_IDF_VERSION_MAJOR >= 4 + /* likely using examples, see wifi_connect.h */ + #else + /* TODO - still supporting pre V4 ? */ + const static int CONNECTED_BIT = BIT0; + static EventGroupHandle_t wifi_event_group; + #endif + #if (ESP_IDF_VERSION_MAJOR == 5) + #define HAS_WPA3_FEATURES + #else + #undef HAS_WPA3_FEATURES + #endif +#else + /* TODO Consider pre IDF v5? */ #endif - /* now we start client tasks. */ - tls_smp_server_init(); -} -/* create task */ -static void tls_smp_server_init(void) -{ - int ret; -#if ESP_IDF_VERSION_MAJOR >= 4 - TaskHandle_t _handle; -#else - xTaskHandle _handle; -#endif - /* http://esp32.info/docs/esp_idf/html/dd/d3c/group__xTaskCreate.html */ - ret = xTaskCreate(tls_smp_server_task, - TLS_SMP_SERVER_TASK_NAME, - TLS_SMP_SERVER_TASK_WORDS, - NULL, - TLS_SMP_SERVER_TASK_PRIORITY, - &_handle); +/* breadcrumb prefix for logging */ +const static char *TAG = "wifi_connect"; - if (ret != pdPASS) { - ESP_LOGI(TAG, "create thread %s failed", TLS_SMP_SERVER_TASK_NAME); - } -} #if ESP_IDF_VERSION_MAJOR < 4 /* event handler for wifi events */ static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) @@ -114,14 +73,14 @@ esp_wifi_connect(); break; case SYSTEM_EVENT_STA_GOT_IP: -#if ESP_IDF_VERSION_MAJOR >= 4 + #if ESP_IDF_VERSION_MAJOR >= 4 ESP_LOGI(TAG, "got ip:" IPSTR "\n", IP2STR(&event->event_info.got_ip.ip_info.ip)); -#else + #else ESP_LOGI(TAG, "got ip:%s", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip)); -#endif - /* http://esp32.info/docs/esp_idf/html/dd/d08/group__xEventGroupSetBits.html */ + #endif + /* see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html */ xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); break; case SYSTEM_EVENT_STA_DISCONNECTED: @@ -133,97 +92,184 @@ } return ESP_OK; } -#endif -/* entry point */ -void app_main(void) -{ - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "--------------------------------------------------------"); - ESP_LOGI(TAG, "CONFIG_IDF_TARGET = %s", CONFIG_IDF_TARGET); - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_STRING = %s", LIBWOLFSSL_VERSION_STRING); - -#if defined(WOLFSSL_MULTI_INSTALL_WARNING) - ESP_LOGI(TAG, ""); - ESP_LOGI(TAG, "WARNING: Multiple wolfSSL installs found."); - ESP_LOGI(TAG, "Check ESP-IDF and local project [components] directory."); - ESP_LOGI(TAG, ""); -#endif - -#if defined(LIBWOLFSSL_VERSION_GIT_HASH) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH = %s", LIBWOLFSSL_VERSION_GIT_HASH); -#endif +#else -#if defined(LIBWOLFSSL_VERSION_GIT_SHORT_HASH ) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_SHORT_HASH = %s", LIBWOLFSSL_VERSION_GIT_SHORT_HASH); +#ifdef CONFIG_ESP_MAXIMUM_RETRY + #define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY +#else + #define CONFIG_ESP_MAXIMUM_RETRY 5 #endif -#if defined(LIBWOLFSSL_VERSION_GIT_HASH_DATE) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH_DATE = %s", LIBWOLFSSL_VERSION_GIT_HASH_DATE); -#endif +#if CONFIG_ESP_WIFI_AUTH_OPEN +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN +#elif CONFIG_ESP_WIFI_AUTH_WEP +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP +#elif CONFIG_ESP_WIFI_AUTH_WPA_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA2_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA_WPA2_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA3_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA2_WPA3_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK +#elif CONFIG_ESP_WIFI_AUTH_WAPI_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK +#endif + +#ifndef ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD + #define CONFIG_ESP_WIFI_AUTH_WPA2_PSK 1 + #define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD CONFIG_ESP_WIFI_AUTH_WPA2_PSK +#endif + +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; + +/* The event group allows multiple bits for each event, but we only care about two events: + * - we are connected to the AP with an IP + * - we failed to connect after the maximum amount of retries */ +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 + + +static int s_retry_num = 0; +ip_event_got_ip_t* event; + + +static void event_handler(void* arg, + esp_event_base_t event_base, + int32_t event_id, + void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } + else if (event_base == WIFI_EVENT && + event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); + } + else { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG, "connect to the AP fail"); + } + else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + event = (ip_event_got_ip_t*) event_data; + wifi_show_ip(); + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} +int wifi_init_sta(void) +{ + int ret = ESP_OK; - /* some interesting settings are target specific (ESP32, -C3, -S3, etc */ -#if defined(CONFIG_IDF_TARGET_ESP32C3) - /* not available for C3 at this time */ -#elif defined(CONFIG_IDF_TARGET_ESP32S3) - ESP_LOGI(TAG, "CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); -#else - ESP_LOGI(TAG, "CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); -#endif + s_wifi_event_group = xEventGroupCreate(); - /* all platforms: stack high water mark check */ - ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); + ESP_ERROR_CHECK(esp_netif_init()); - ESP_ERROR_CHECK(nvs_flash_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_create_default_wifi_sta(); - ESP_LOGI(TAG, "Initialize wifi"); - /* TCP/IP adapter initialization */ -#if (ESP_IDF_VERSION_MAJOR == 4 && ESP_IDF_VERSION_MINOR >= 1) || \ - (ESP_IDF_VERSION_MAJOR >= 5) - esp_netif_init(); -#else - tcpip_adapter_init(); -#endif - /* */ -#if ESP_IDF_VERSION_MAJOR >= 4 - ESP_ERROR_CHECK(esp_event_loop_create_default()); - /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. - * Read "Establishing Wi-Fi or Ethernet Connection" section in - * examples/protocols/README.md for more information about this function. - */ - ESP_ERROR_CHECK(example_connect()); -#else - wifi_event_group = xEventGroupCreate(); - ESP_ERROR_CHECK(esp_event_loop_init(wifi_event_handler, NULL)); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + esp_event_handler_instance_t instance_any_id; + esp_event_handler_instance_t instance_got_ip; + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, + ESP_EVENT_ANY_ID, + &event_handler, + NULL, + &instance_any_id)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, + IP_EVENT_STA_GOT_IP, + &event_handler, + NULL, + &instance_got_ip)); + wifi_config_t wifi_config = { .sta = { - .ssid = TLS_SMP_WIFI_SSID, - .password = TLS_SMP_WIFI_PASS, + .ssid = EXAMPLE_ESP_WIFI_SSID, + .password = EXAMPLE_ESP_WIFI_PASS, + /* Authmode threshold resets to WPA2 as default if password matches + * WPA2 standards (pasword len => 8). If you want to connect the + * device to deprecated WEP/WPA networks, Please set the threshold + * value WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with + * length and format matching to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK + * standards. */ + .threshold.authmode = ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD, + #ifdef HAS_WPA3_FEATURES + .sae_pwe_h2e = WPA3_SAE_PWE_BOTH, + #endif }, }; - /* WiFi station mode */ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); - /* Wifi Set the configuration of the ESP32 STA or AP */ - ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); - /* Start Wifi */ + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); + +#ifdef CONFIG_EXAMPLE_WIFI_SSID + if (XSTRCMP(CONFIG_EXAMPLE_WIFI_SSID, "myssid") == 0) { + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID is \"myssid\"."); + ESP_LOGW(TAG, " Do you have a WiFi AP called \"myssid\", "); + ESP_LOGW(TAG, " or did you forget the ESP-IDF configuration?"); + } +#else + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID not defined."); +#endif + ESP_ERROR_CHECK(esp_wifi_start() ); ESP_LOGI(TAG, "wifi_init_sta finished."); - ESP_LOGI(TAG, "connect to ap SSID:%s password:%s", - TLS_SMP_WIFI_SSID, TLS_SMP_WIFI_PASS); + + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) + * or connection failed for the maximum number of re-tries (WIFI_FAIL_BIT). + * The bits are set by event_handler() (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + /* xEventGroupWaitBits() returns the bits before the call returned, + * hence we can test which event actually happened. */ +#if defined(SHOW_SSID_AND_PASSWORD) + ESP_LOGW(TAG, "Undefine SHOW_SSID_AND_PASSWORD to not show SSID/password"); + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "connected to ap SSID:%s password:%s", + EXAMPLE_ESP_WIFI_SSID, + EXAMPLE_ESP_WIFI_PASS); + } + else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", + EXAMPLE_ESP_WIFI_SSID, + EXAMPLE_ESP_WIFI_PASS); + } + else { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } +#else + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "Connected to AP"); + } + else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to AP"); + ret = -1; + } + else { + ESP_LOGE(TAG, "AP UNEXPECTED EVENT"); + ret = -2; + } #endif - ESP_LOGI(TAG, "Set dummy time..."); - set_time(); + return ret; +} + +int wifi_show_ip(void) +{ + /* ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip)); */ + return 0; } +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/partitions_singleapp_large.csv mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/partitions_singleapp_large.csv --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/partitions_singleapp_large.csv 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_server/partitions_singleapp_large.csv 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,31 @@ +# to view: idf.py partition-table +# +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +phy_init,data, phy, 0xf000, 4K, +factory, app, factory, 0x10000, 1500K, + + +# For other settings, see: +# https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#creating-custom-tables +# +# Here is the summary printed for the "Single factory app, no OTA" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x6000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# +# +# Here is the summary printed for the "Factory app, two OTA definitions" configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x4000, +# otadata, data, ota, 0xd000, 0x2000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# ota_0, app, ota_0, 0x110000, 1M, +# ota_1, app, ota_1, 0x210000, 1M, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,12 +1,15 @@ +# wolfSSL Espressif Example Project CMakeLists.txt +# v1.1 +# # The following lines of boilerplate have to be in your project's # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.5) +add_compile_options(-DWOLFSSL_ESP_NO_WATCHDOG=1) + include($ENV{IDF_PATH}/tools/cmake/project.cmake) -set(COMPONENTS - main - wolfssl -) # set components +# Not only is a project-level "set(COMPONENTS" not needed here, this will cause +# an unintuitive error about Unknown CMake command "esptool_py_flash_project_args". project(wolfssl_test) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/Makefile mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/Makefile --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/Makefile 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/Makefile 2024-08-03 07:30:00.000000000 +0000 @@ -3,9 +3,12 @@ # project subdirectory. # -PROJECT_NAME := wolfssl_test - CFLAGS += -DWOLFSSL_USER_SETTINGS -include $(IDF_PATH)/make/project.mk +# Some of the tests are CPU intenstive, so we'll force the watchdog timer off. +# There's an espressif NO_WATCHDOG; we don't use it, as it is reset by sdkconfig. +EXTRA_CFLAGS += -DWOLFSSL_ESP_NO_WATCHDOG +PROJECT_NAME := wolfssl_test + +include $(IDF_PATH)/make/project.mk diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,28 @@ # wolfSSL Crypt Test Example -The Example contains of wolfSSL test program. +This is the ESP32 Version of the [wolfSSL wolfcrypt test application](https://github.com/wolfSSL/wolfssl/tree/master/wolfcrypt/test). + +For general information on [wolfSSL examples for Espressif](../README.md), see the +[README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. + +## ESP Registry + +The easiest way to get started with wolfSSL is by using the +[ESP Registry](https://components.espressif.com/components/wolfssl/wolfssl/) examples. + +``` +. ~/esp/esp-idf/export.sh +idf.py create-project-from-example "wolfssl/wolfssl^5.6.0-stable:wolfssl_test" +cd wolfssl_benchmark +idf.py -b 115200 flash monitor +``` + +## VisualGDB + +Open the VisualGDB Visual Studio Project file in the [VisualGDB directory](./VisualGDB/README.md) and click the "Start" button. +No wolfSSL setup is needed. You may need to adjust your specific COM port. The default is `COM20`. + +## ESP-IDF Commandline 1. `idf.py menuconfig` to configure the program. 1-1. Example Configuration -> @@ -20,18 +42,27 @@ Example build on WSL, assuming `git clone` from `c:\workspace`: ``` -# Optionally install wolfSSL component -# cd /mnt/c/workspace/wolfssl/IDE/Espressif/ESP-IDF -./setup.sh +WRK_IDF_PATH=/mnt/c/SysGCC/esp32/esp-idf/v5.1 + +echo "Run export.sh from ${WRK_IDF_PATH}" +. ${WRK_IDF_PATH}/export.sh # switch to test example cd /mnt/c/workspace/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test -# Pick ESP-IDF install directory, this one for v4.4.2 in VisualGDB -. /mnt/c/SysGCC/esp32/esp-idf/v4.4.2/export.sh +# Pick ESP-IDF install directory, this one for v5.1 in VisualGDB +. /mnt/c/SysGCC/esp32/esp-idf/v5.1/export.sh -# build and flash, in this example to COM20 -idf.py build flash -p /dev/ttyS20 -b 921600 monitor +# set target chipset +idf.py set-target esp32s3 + +# erase +idf.py erase-flash -p /dev/ttyS24 -b 115200 + +# start with a low upload speed, then increase as found operational +idf.py +# build and flash, in this example to COM24 +idf.py build flash -p /dev/ttyS24 -b 115200 monitor ``` ## Example Output @@ -41,7 +72,7 @@ for help in optimizing for your particular application, or see the [docs](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html). -Compiled and flashed with `idf.py build flash -p /dev/ttyS7 -b 921600 monitor`: +Compiled and flashed with `idf.py build flash -p /dev/ttyS7 -b 115200 monitor`: ``` ets Jun 8 2016 00:22:57 @@ -140,3 +171,5 @@ I (136548) wolfssl_test: wolf_test_task complete success result code = 0 ``` + +See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32.vgdbproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -71,7 +71,7 @@ esp-idf/v5.0 ESPIDF - COM9 + COM19 false false ESP32 @@ -93,7 +93,7 @@ - COM20 + COM19 115200 8 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2023 wolfSSL Inc. +# Copyright (C) 2006-2024 wolfSSL Inc. # # This file is part of wolfSSL. # @@ -17,192 +17,275 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA # -# cmake for wolfssl +# cmake for wolfssl Espressif projects # -cmake_minimum_required(VERSION 3.5) +# Version 5.7.0 template update + THIS_IDF_PATH +# +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html +# + +cmake_minimum_required(VERSION 3.16) + +set(VERBOSE_COMPONENT_MESSAGES 1) + +# The scope of this CMAKE_C_FLAGS is just this component: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") -set(CMAKE_CURRENT_SOURCE_DIR ".") -# We are currently in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl -# The root of wolfSSL is 7 directories up from here: -get_filename_component(WOLFSSL_ROOT "../../../../../../../" ABSOLUTE) +set(CMAKE_CURRENT_SOURCE_DIR ".") +# set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component -# Espressif may take several passes through this makefile. Check to see if we found IDF -string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) +# Optionally set your source to wolfSSL in your project CMakeLists.txt like this: +# set(WOLFSSL_ROOT "c:/test/my_wolfssl" ) -if($WOLFSSL_FOUND_IDF) - message(STATUS "IDF_PATH = $ENV{IDF_PATH}") - message(STATUS "WOLFSSL_ROOT = ${WOLFSSL_ROOT}") - message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") +if ( "${WOLFSSL_ROOT}" STREQUAL "") + set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" ) endif() -# get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa -FILE(GLOB EXCLUDE_ASM *.S) -file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") +if( "$ENV{IDF_PATH}" STREQUAL "" ) + message(FATAL_ERROR "IDF_PATH Environment variable not set!") +else() + string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}") +endif() -if(NOT CMAKE_BUILD_EARLY_EXPANSION) - message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") +# Optional compiler definitions to help with system name detection (typically printed by app diagnostics) +if(VERBOSE_COMPONENT_MESSAGES) + if(WIN32) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS") + message("Detected Windows") + endif() + if(CMAKE_HOST_UNIX) + message("Detected UNIX") + endif() + if(APPLE) + message("Detected APPLE") + endif() + if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop") + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL") + message("Detected WSL") + endif() + if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32)) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX") + message("Detected Linux") + endif() + if(APPLE) + # Windows-specific configuration here + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE") + message("Detected Apple") + endif() +endif() # End optional WOLFSSL_CMAKE_SYSTEM_NAME + +message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}") + +# Check that there are not conflicting wolfSSL components +# The ESP Registry Component will be in ./managed_components/wolfssl__wolfssl +# The local component wolfSSL directory will be in ./components/wolfssl +if( EXISTS "${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" AND EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl" ) + # These exclude statements don't seem to be honored by the $ENV{IDF_PATH}/tools/cmake/project.cmake' + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" EXCLUDE_FROM_ALL) + # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl/include" EXCLUDE_FROM_ALL) + # So we'll error out and let the user decide how to proceed: + message(WARNING "\nFound wolfSSL components in\n" + "./managed_components/wolfssl__wolfssl\n" + "and\n" + "./components/wolfssl\n" + "in project directory: \n" + "${CMAKE_HOME_DIRECTORY}") + message(FATAL_ERROR "\nPlease use either the ESP Registry Managed Component or the wolfSSL component directory but not both.\n" + "If removing the ./managed_components/wolfssl__wolfssl directory, remember to also remove " + "or rename the idf_component.yml file typically found in ./main/") +else() + message(STATUS "No conflicting wolfSSL components found.") endif() -set(INCLUDE_PATH ${WOLFSSL_ROOT}) -set(COMPONENT_SRCDIRS "${WOLFSSL_ROOT}/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif/" - "${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel/" - "${WOLFSSL_ROOT}/wolfcrypt/benchmark/" - "${WOLFSSL_ROOT}/wolfcrypt/test/" - ) +# Don't include lwip requirement for benchmark and test apps. +if( ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark") OR ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_test") ) + message(STATUS "Not including lwip for ${CMAKE_PROJECT_NAME}") +else() + # benchmark and test do not need wifi, everything else probably does: + set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component +endif() -set(COMPONENT_REQUIRES lwip) +# find the user name to search for possible "wolfssl-username" +message(STATUS "USERNAME = $ENV{USERNAME}") +if( "$ENV{USER}" STREQUAL "" ) # the bash user + if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user + message(STATUS "could not find USER or USERNAME") + else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USERNAME}") + endif() +else() + # the bash user is not blank, so we'll use it. + set(THIS_USER "$ENV{USER}") +endif() +message(STATUS "THIS_USER = ${THIS_USER}") +if( "$ENV{IDF_PATH}" STREQUAL "" ) + message(FATAL_ERROR "IDF_PATH Environment variable not set!") +else() + string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}") +endif() -# check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) - # - # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user - # - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") - message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") - message(STATUS "") - message(STATUS "To proceed: ") - message(STATUS "") - message(STATUS "Remove either the local project component: ${CMAKE_HOME_DIRECTORY}/components/wolfssl/ ") - message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") - message(STATUS "") - message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") - message(STATUS "") - message(STATUS "**************************************************************************************") - message(STATUS "") +# COMPONENT_NAME = wolfssl +# The component name is the directory name. "No feature to change this". +# See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685 + +# set the root of wolfSSL in top-level project CMakelists.txt: +# set(WOLFSSL_ROOT "C:/some path/with/spaces") +# set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]") +# set(WOLFSSL_ROOT "/mnt/c/some path/with/spaces") +# or use this logic to assign value from Environment Variable WOLFSSL_ROOT, +# or assume this is an example 7 subdirectories below: - # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") +# We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl +# The root of wolfSSL is 7 directories up from here: -else() - if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) - # - # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. - # - message(STATUS "") - message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") - message(STATUS "") +# function: IS_WOLFSSL_SOURCE +# parameter: DIRECTORY_PARAMETER - the directory to test +# output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank. +function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT) + if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src") + set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE) else() - # - # wolfSSL is not an ESP-IDF component. We need to now determine if it is local and if so if it is part of the wolfSSL repo - # or if wolfSSL is simply installed as a local component. - # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" ) - # - # wolfSSL found in local project. - # - if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/include/" ) - message(STATUS "") - message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - # - # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. - # - # We won't do anything else here, as it will be assumed the original install completed successfully. - # + set(${RESULT} "" PARENT_SCOPE) + endif() +endfunction() + +# ********************************************************************************************* +# function: FIND_WOLFSSL_DIRECTORY +# parameter: OUTPUT_FOUND_WOLFSSL_DIRECTORY contains root of source code, otherwise blank +# +# Example usage: +# FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) +# ********************************************************************************************* +function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY) + message(STATUS "Starting FIND_WOLFSSL_DIRECTORY: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}") + + if ( "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" STREQUAL "" ) + set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}") + if( "${CURRENT_SEARCH_DIR}" STREQUAL "" ) + message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...") + else() + get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE) + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via Environment Variable:") else() - # - # This is the developer repo mode. wolfSSL will be assume to be not installed to ESP-IDF nor local project - # In this configuration, we are likely running a wolfSSL example found directly in the repo. - # - message(STATUS "") - message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = $ENV{CMAKE_HOME_DIRECTORY}") - message(STATUS "") - - message(STATUS "************************************************************************************************") - # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. - # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. - # - # first check if there's a [root]/include/user_settings.h - if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) - # we won't overwrite an existing user settings file, just note that we already have one: - message(STATUS "Found wolfSSL user_settings.h in ${WOLFSSL_ROOT}/include/user_settings.h") - else() - message(STATUS "Installing wolfSSL user_settings.h to ${WOLFSSL_ROOT}/include/user_settings.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" DESTINATION "${WOLFSSL_ROOT}/include/") - endif() # user_settings.h - - # next check if there's a [root]/include/config.h - if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) - message(STATUS "Found wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h") - else() - message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_ROOT}/include/config.h") - file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_ROOT}/include/") - file(RENAME "${WOLFSSL_ROOT}/include/dummy_config_h" "${WOLFSSL_ROOT}/include/config.h") - endif() # config.h - message(STATUS "************************************************************************************************") - message(STATUS "") + message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:") + message(STATUS "$ENV{WOLFSSL_ROOT}") endif() + endif() + else() + get_filename_component(CURRENT_SEARCH_DIR "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" ABSOLUTE) + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found WOLFSSL_ROOT via prior specification.") + else() + message(FATAL_ERROR "WOLFSSL_ROOT Variable defined, but path not found: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}") + endif() + endif() + + + # we'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl + message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE) + message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + + # loop through all the parents, looking for wolfssl + while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" ) + string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH) + # wolfSSL may simply be in a parent directory, such as for local examples in wolfssl repo + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL) + if( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + # Maintain CURRENT_SEARCH_DIR, but check various suffixes with CURRENT_SEARCH_DIR_ALT + if( THIS_USER ) + # Check for "wolfssl-[username]" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-${THIS_USER}) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}") + + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + endif() + if ( FOUND_WOLFSSL ) + # if we already found the source, skip attempt of "wolfssl-master" else() - # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. - if($WOLFSSL_FOUND_IDF) - message(STATUS "") - message(STATUS "WARNING: wolfSSL not found.") - message(STATUS "") - else() - # probably needs to be re-parsed by Espressif - message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") - endif() # else we have not found ESP-IDF yet - endif() # else not a local wolfSSL component + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-master) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}") - endif() #else not an ESP-IDF component -endif() # else not local copy and EDP-IDF wolfSSL + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in master-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + endif() + if ( FOUND_WOLFSSL ) + # if we already found the source, skip attempt of "wolfssl" + else() + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl) + message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}") -# RTOS_IDF_PATH is typically: -# "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" -# depending on the environment, we may need to swap backslashes with forward slashes -string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}") + set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + endif() -# ESP-IDF after version 4.4x has a different RTOS directory structure -string(REPLACE "\\" "/" RTOS_IDF_PATH5 "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") + # Next check for no user suffix "wolfssl" subdirectory as we recurse up the directory tree + set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl) + # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src") + IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL ) + if ( FOUND_WOLFSSL ) + message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE) + return() + endif() + + # Move up one directory level + set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}") + get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY) + message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}") + if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" ) + # When the parent is current directory, cannot go any further. We didn't find wolfssl. + # When the search directory is empty, we'll give up. + set(CURRENT_SEARCH_DIR "") + endif() + endwhile() + + # If not found, set the output variable to empty before exiting + set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} "" PARENT_SCOPE) +endfunction() -if(IS_DIRECTORY ${IDF_PATH}/components/freertos/FreeRTOS-Kernel/) - set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH5}" - "${WOLFSSL_ROOT}" - ) -else() - - set(COMPONENT_ADD_INCLUDEDIRS - "." - "${WOLFSSL_ROOT}/include" - "${RTOS_IDF_PATH}" - "${WOLFSSL_ROOT}" - ) -endif() - -if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) - list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") -endif() - -set(COMPONENT_SRCEXCLUDE - "${WOLFSSL_ROOT}/src/bio.c" - "${WOLFSSL_ROOT}/src/conf.c" - "${WOLFSSL_ROOT}/src/misc.c" - "${WOLFSSL_ROOT}/src/pk.c" - "${WOLFSSL_ROOT}/src/ssl_asn1.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/ssl_bn.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/ssl_misc.c" # included by ssl.c - "${WOLFSSL_ROOT}/src/x509.c" - "${WOLFSSL_ROOT}/src/x509_str.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/evp.c" - "${WOLFSSL_ROOT}/wolfcrypt/src/misc.c" - "${EXCLUDE_ASM}" - ) -register_component() +# Example usage: +# +# Simply find the WOLFSSL_DIRECTORY by searching parent directories: +# FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) +# + +message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}") -# some optional diagnostics if (0) get_cmake_property(_variableNames VARIABLES) list (SORT _variableNames) @@ -217,8 +300,375 @@ message(STATUS "") endif() +if ( ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266") OR ("${IDF_TARGET}" STREQUAL "esp8266") ) + # There's no esp_timer, no driver components for the ESP8266 + message(STATUS "Early expansion EXCLUDES esp_timer: ${THIS_INCLUDE_TIMER}") + message(STATUS "Early expansion EXCLUDES driver: ${THIS_INCLUDE_DRIVER}") + set(THIS_INCLUDE_TIMER "") + set(THIS_INCLUDE_DRIVER "") +else() + message(STATUS "Early expansion includes esp_timer: ${THIS_INCLUDE_TIMER}") + message(STATUS "Early expansion includes driver: ${THIS_INCLUDE_DRIVER}") + set(THIS_INCLUDE_TIMER "esp_timer") + set(THIS_INCLUDE_DRIVER "driver") +endif() + +if(CMAKE_BUILD_EARLY_EXPANSION) + message(STATUS "wolfssl component CMAKE_BUILD_EARLY_EXPANSION:") + idf_component_register( + REQUIRES "${COMPONENT_REQUIRES}" + PRIV_REQUIRES # esp_hw_support + ${THIS_INCLUDE_TIMER} + ${THIS_INCLUDE_DRIVER} # this will typically only be needed for wolfSSL benchmark + ) + +else() + # not CMAKE_BUILD_EARLY_EXPANSION + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config:") + message(STATUS "************************************************************************************************") + + # search for wolfSSL + FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) + if(WOLFSSL_ROOT) + IS_WOLFSSL_SOURCE("${WOLFSSL_ROOT}" FOUND_WOLFSSL) + if(FOUND_WOLFSSL) + message(STATUS "Found WOLFSSL_ROOT via CMake specification.") + else() + # WOLFSSL_ROOT Path specified in CMakeLists.txt is not a valid path + message(FATAL_ERROR "WOLFSSL_ROOT CMake Variable defined, but path not found: ${WOLFSSL_ROOT}\n" + "Try correcting WOLFSSL_ROOT in your project CMakeFile.txt or setting environment variable.") + # Abort CMake after fatal error. + endif() + else() + message(STATUS "Searching for wolfSL source code...") + FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT) + endif() + + + if(WOLFSSL_ROOT) + message(STATUS "Confirmed wolfssl directory at: ${WOLFSSL_ROOT}") + else() + message(STATUS "Failed: wolfssl directory not found.") + # Abort. We need wolfssl _somewhere_. + message(FATAL_ERROR "Could not find wolfssl in any parent directory named wolfssl-${THIS_USER}, wolfssl-master, or wolfssl.\n" + "Try setting WOLFSSL_ROOT environment variable, cmake variable in project, copy source, or use managed components.") + # Abort CMake after fatal error. + endif() + + set(INCLUDE_PATH ${WOLFSSL_ROOT}) + + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/src/") + + # During regression tests, optionally copy source locally and use: set(USE_LOCAL_TEST_BENCH 1) + set(USE_LOCAL_TEST_BENCH 0) + if(NOT USE_LOCAL_TEST_BENCH) + if( "${CMAKE_PROJECT_NAME}" STREQUAL "hello-world" ) + message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/benchmark") + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark") + endif() + + if( "${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark" ) + message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/benchmark") + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark") + endif() + + if( "${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_test" ) + message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/test") + set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/test") + endif() + endif() + + set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\"" + "\"${WOLFSSL_EXTRA_PROJECT_DIR}\"" + ) # COMPONENT_SRCDIRS + + message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + + # wolfSSL user_settings.h is in the local project. + set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl") + # add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + + string(REPLACE "/" "//" STR_WOLFSSL_PROJECT_DIR "${WOLFSSL_PROJECT_DIR}") + add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${STR_WOLFSSL_PROJECT_DIR}//include//user_settings.h") + + # Espressif may take several passes through this makefile. Check to see if we found IDF + string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF) + + # get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa + file(GLOB EXCLUDE_ASM *.S) + file(GLOB EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S") + + message(STATUS "IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}") + message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}") + + # + # Check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # + # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user + # + message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH") + message(STATUS "") + message(STATUS "To proceed: ") + message(STATUS "") + message(STATUS "Remove either the local project component: ${WOLFSSL_PROJECT_DIR} ") + message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ") + message(STATUS "") + message(STATUS "") + message(STATUS "**************************************************************************************") + message(STATUS "") + + message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.") + # Abort CMake after fatal error. + + # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition: + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") + + else() + if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) + # + # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup. + # + message(STATUS "") + message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}") + message(STATUS "") + else() + # + # wolfSSL is not an ESP-IDF component. + # We need to now determine if it is local and if so if it is part of the wolfSSL repo, + # or if wolfSSL is simply installed as a local component. + # + + if( EXISTS "${WOLFSSL_PROJECT_DIR}" ) + # + # wolfSSL found in local project. + # + if( EXISTS "${WOLFSSL_PROJECT_DIR}/wolfcrypt/" ) + message(STATUS "") + message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + # + # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components. + # + # We won't do anything else here, as it will be assumed the original install completed successfully. + # + else() # full wolfSSL not installed in local project + # + # This is the developer repo mode. wolfSSL will be assumed to be not installed to ESP-IDF nor local project + # In this configuration, we are likely running a wolfSSL example found directly in the repo. + # + message(STATUS "") + message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}") + message(STATUS "") + + message(STATUS "************************************************************************************************") + # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories. + # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed. + # + # first check if there's a [root]/include/user_settings.h + if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" ) + message(FATAL_ERROR "Found stray wolfSSL user_settings.h in " + "${WOLFSSL_ROOT}/include/user_settings.h " + " (please move it to ${WOLFSSL_PROJECT_DIR}/include/user_settings.h )") + # Abort CMake after fatal error. + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/user_settings.h" ) + message(STATUS "Using existing wolfSSL user_settings.h in " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + else() + message(STATUS "Installing wolfSSL user_settings.h to " + "${WOLFSSL_PROJECT_DIR}/include/user_settings.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h" + DESTINATION "${CMAKE_HOME_DIRECTORY}/wolfssl/include/") + endif() + endif() # user_settings.h + + # next check if there's a [root]/include/config.h + if( EXISTS "${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + message(STATUS "Found stray wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h" ) + message(STATUS " Please move it to ${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "******************************************************************************") + message(STATUS "******************************************************************************") + else() + # we won't overwrite an existing user settings file, just note that we already have one: + if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/config.h" ) + message(STATUS "Using existing wolfSSL config.h ${WOLFSSL_PROJECT_DIR}/include/config.h") + else() + message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_PROJECT_DIR}/include/config.h") + file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_PROJECT_DIR}/include/") + file(RENAME "${WOLFSSL_PROJECT_DIR}/include/dummy_config_h" "${WOLFSSL_PROJECT_DIR}/include/config.h") + endif() # Project config.h + endif() # WOLFSSL_ROOT config.h + message(STATUS "************************************************************************************************") + message(STATUS "") + endif() + + else() + # we did not find a ./components/wolfssl/include/ directory from this pass of cmake. + if($WOLFSSL_FOUND_IDF) + message(STATUS "") + message(STATUS "WARNING: wolfSSL not found.") + message(STATUS "") + else() + # probably needs to be re-parsed by Espressif + message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}") + endif() # else we have not found ESP-IDF yet + endif() # else not a local wolfSSL component + + endif() #else not an ESP-IDF component + endif() # else not local copy and EDP-IDF wolfSSL + + + # RTOS_IDF_PATH is typically: + # "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos" + # depending on the environment, we may need to swap backslashes with forward slashes + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos") + + string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT}) + + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}") + else() + # ESP-IDF prior version 4.4x has a different RTOS directory structure + string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos") + if(IS_DIRECTORY "${RTOS_IDF_PATH}") + message(STATUS "Found legacy RTOS path: ${RTOS_IDF_PATH}") + else() + message(STATUS "Could not find RTOS path") + endif() + endif() + message(STATUS "THIS_IDF_PATH = $THIS_IDF_PATH") + # wolfSSL-specific include directories + set(COMPONENT_ADD_INCLUDEDIRS + "./include" # this is the location of wolfssl user_settings.h + "\"${WOLFSSL_ROOT}/\"" + "\"${WOLFSSL_ROOT}/wolfssl/\"" + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"" + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/port/Espressif\"" + "\"${RTOS_IDF_PATH}/\"" + # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers + "${THIS_IDF_PATH}/components/esp_event/include" + "${THIS_IDF_PATH}/components/esp_netif/include" + "${THIS_IDF_PATH}/components/esp_wifi/include" + ) + + # Optionally include cryptoauthlib if present + if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib) + list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib") + endif() + + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/\"") + list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"") + + + # Some files are known to be included elsewhere, or not used for Espressif + set(COMPONENT_SRCEXCLUDE + "\"${WOLFSSL_ROOT}/src/bio.c\"" + "\"${WOLFSSL_ROOT}/src/conf.c\"" + "\"${WOLFSSL_ROOT}/src/misc.c\"" + "\"${WOLFSSL_ROOT}/src/pk.c\"" + "\"${WOLFSSL_ROOT}/src/ssl_asn1.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_bn.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_certman.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_crypto.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_load.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_misc.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_p7p12.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/ssl_sess.c\"" # included by ssl.c + "\"${WOLFSSL_ROOT}/src/x509.c\"" + "\"${WOLFSSL_ROOT}/src/x509_str.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external Kyber disabled by default + "\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_armthumb.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c32.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\"" + "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\"" + "\"${EXCLUDE_ASM}\"" + ) + + spaces2list(COMPONENT_REQUIRES) + + separate_arguments(COMPONENT_SRCDIRS NATIVE_COMMAND "${COMPONENT_SRCDIRS}") + separate_arguments(COMPONENT_SRCEXCLUDE NATIVE_COMMAND "${COMPONENT_SRCEXCLUDE}") + separate_arguments(COMPONENT_ADD_INCLUDEDIRS NATIVE_COMMAND "${COMPONENT_ADD_INCLUDEDIRS}") + + # + # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#example-component-requirements + # + message(STATUS "COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}") + message(STATUS "COMPONENT_ADD_INCLUDEDIRS = ${COMPONENT_ADD_INCLUDEDIRS}") + message(STATUS "COMPONENT_REQUIRES = ${COMPONENT_REQUIRES}") + message(STATUS "COMPONENT_SRCEXCLUDE = ${COMPONENT_SRCEXCLUDE}") + + # + # see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path + # + set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}") + idf_component_register( + SRC_DIRS "${COMPONENT_SRCDIRS}" + INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}" + REQUIRES "${COMPONENT_REQUIRES}" + EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}" + PRIV_REQUIRES + "${THIS_INCLUDE_TIMER}" + "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark + ) + + # Some optional diagnostics. Verbose ones are truncated. + if (VERBOSE_COMPONENT_MESSAGES) + get_cmake_property(_variableNames VARIABLES) + list (SORT _variableNames) + message(STATUS "") + message(STATUS "ALL VARIABLES BEGIN") + message(STATUS "") + foreach (_variableName ${_variableNames}) + if ( ("${_variableName}" STREQUAL "bootloader_binary_files") + OR ("${_variableName}" STREQUAL "Component paths") + OR ("${_variableName}" STREQUAL "component_targets") + OR ("${_variableName}" STREQUAL "__COMPONENT_TARGETS") + OR ("${_variableName}" STREQUAL "CONFIGS_LIST") + OR ("${_variableName}" STREQUAL "__CONFIG_VARIABLES") + OR ("${_variableName}" STREQUAL "val") + OR ("${_variableName}" MATCHES "^__idf_") + ) + # Truncate the displayed value: + string(SUBSTRING "${${_variableName}}" 0 70 truncatedValue) + message(STATUS "${_variableName} = ${truncatedValue} ... (truncated)") + else() + message(STATUS "${_variableName}=${${_variableName}}") + endif() + endforeach() + message(STATUS "") + message(STATUS "ALL VARIABLES END") + message(STATUS "") + endif() + + # target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"") + +endif() # CMAKE_BUILD_EARLY_EXPANSION + + + # check to see if there's both a local copy and EDP-IDF copy of the wolfssl components -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) +if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) message(STATUS "") message(STATUS "") message(STATUS "********************************************************************") @@ -229,3 +679,71 @@ # end multiple component check +# +# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) +# +# Save the THIS_VAR as a string in a macro called VAR_OUPUT +# +# VAR_OUPUT: the name of the macro to define +# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process() +# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful. +# +function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT ) + # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true. + string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE) + + # if we had a successful operation, save the THIS_VAR in VAR_OUPUT + if(${IS_VALID_VALUE}) + # strip newline chars in THIS_VAR parameter and save in VAR_VALUE + string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR}) + + # we'll could percolate the value to the parent for possible later use + # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE) + + # but we're only using it here in this function + set(${VAR_OUPUT} ${VAR_VALUE}) + + # we'll print what we found to the console + message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}") + + # the interesting part is defining the VAR_OUPUT name a value to use in the app + add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\") + else() + # if we get here, check the execute_process command and parameters. + message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT") + set(${VAR_OUPUT} "Unknown") + endif() +endfunction() # LIBWOLFSSL_SAVE_INFO + +# create some programmatic #define values that will be used by ShowExtendedSystemInfo(). +# see wolfcrypt\src\port\Espressif\esp32_utl.c +if(NOT CMAKE_BUILD_EARLY_EXPANSION) + set (git_cmd "git") + message(STATUS "Adding macro definitions:") + + # LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}") + + # LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\' + execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ) + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}") + + LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_WOLFSSL_ROOT "${WOLFSSL_ROOT}" "${TMP_RES}") + + message(STATUS "************************************************************************************************") + message(STATUS "wolfssl component config complete!") + message(STATUS "************************************************************************************************") +endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,40 +1,240 @@ -# -# Copyright (C) 2006-2023 wolfSSL Inc. -# -# This file is part of wolfSSL. -# -# wolfSSL 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 of the License, or -# (at your option) any later version. -# -# wolfSSL 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA -# -# -# Component Makefile -# - -COMPONENT_ADD_INCLUDEDIRS := . ./include - -COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/components/freertos/include/freertos" -# COMPONENT_ADD_INCLUDEDIRS += "$ENV{IDF_PATH}/soc/esp32s3/include/soc" - -COMPONENT_SRCDIRS := src wolfcrypt/src -COMPONENT_SRCDIRS += wolfcrypt/src/port/Espressif -COMPONENT_SRCDIRS += wolfcrypt/src/port/atmel -COMPONENT_SRCDIRS += wolfcrypt/benchmark -COMPONENT_SRCDIRS += wolfcrypt/test - -CFLAGS +=-DWOLFSSL_USER_SETTINGS - -COMPONENT_OBJEXCLUDE := wolfcrypt/src/aes_asm.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/evp.o -COMPONENT_OBJEXCLUDE += wolfcrypt/src/misc.o -COMPONENT_OBJEXCLUDE += src/bio.o +# +# Copyright (C) 2006-2024 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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 of the License, or +# (at your option) any later version. +# +# wolfSSL 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +# + +# +# Component Makefile +# +# +# The Espressif Managed Components are only for newer versions of the ESP-IDF +# Typically only for ESP32[-x] targets and only for ESP-IDF v4.3 or later: +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html +# https://components.espressif.com/ +# +# Usage: +# +# make flash +# +# make flash ESPPORT=/dev/ttyS55 +# +# make flash ESPBAUD=9600 +# +# make monitor ESPPORT=COM1 +# +# make monitor ESPPORT=/dev/ttyS55 MONITORBAUD=115200 +# +# export ESPPORT=/dev/ttyS55 +# +# https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/index.html +# + +# Although the project should define WOLFSSL_USER_SETTINGS, we'll also +# define it here: +CFLAGS +=-DWOLFSSL_USER_SETTINGS + +# In the wolfSSL GitHub examples for Espressif, +# the root is 7 directories up from here: +WOLFSSL_ROOT := ../../../../../../../ + +# NOTE: The wolfSSL include directory (e.g. user_settings.h) is +# located HERE in THIS project, and *not* in the wolfSSL root. +COMPONENT_ADD_INCLUDEDIRS := . +COMPONENT_ADD_INCLUDEDIRS += include +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT). +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfssl +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfssl/wolfcrypt +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfssl/wolfcrypt/port/Espressif +COMPONENT_ADD_INCLUDEDIRS += $(WOLFSSL_ROOT)wolfcrypt/benchmark +# COMPONENT_ADD_INCLUDEDIRS += $ENV(IDF_PATH)/components/freertos/include/freertos +# COMPONENT_ADD_INCLUDEDIRS += "$ENV(IDF_PATH)/soc/esp32s3/include/soc" + + +# WOLFSSL_ROOT := "" +COMPONENT_SRCDIRS := $(WOLFSSL_ROOT)src +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src/port/atmel +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/benchmark +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/test +COMPONENT_SRCDIRS += include + +COMPONENT_OBJEXCLUDE := $(WOLFSSL_ROOT)wolfcrypt/src/aes_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/evp.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/misc.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/sha512_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/fe_x25519_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)wolfcrypt/src/aes_gcm_x86_asm.o +COMPONENT_OBJEXCLUDE += $(WOLFSSL_ROOT)src/bio.o + + +## +## wolfSSL +## +COMPONENT_OBJS := $(WOLFSSL_ROOT)src/bio.o +# COMPONENT_OBJS += src/conf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/crl.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/dtls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/dtls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/internal.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/keys.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/ocsp.o +# COMPONENT_OBJS += src/pk.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/quic.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/sniffer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/ssl.o +# COMPONENT_OBJS += src/ssl_asn1.o +# COMPONENT_OBJS += src/ssl_bn.o +# COMPONENT_OBJS += src/ssl_certman.o +# COMPONENT_OBJS += src/ssl_crypto.o +# COMPONENT_OBJS += src/ssl_misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/tls.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/tls13.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)src/wolfio.o +# COMPONENT_OBJS += src/x509.o +# COMPONENT_OBJS += src/x509_str.o + +## +## wolfcrypt +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/arc4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/asm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/asn.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/async.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/blake2b.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/blake2s.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/camellia.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/chacha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/chacha20_poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/cmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/coding.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/compress.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/cpuid.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/cryptocb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/curve25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/curve448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/des3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/dh.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/dilithium.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/dsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ecc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/eccsi.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ecc_fp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ed25519.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ed448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/error.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/evp.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ext_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/falcon.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fe_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fe_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fe_operations.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fips.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/fips_test.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ge_448.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ge_low_mem.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ge_operations.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/hash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/hmac.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/hpke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/integer.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/kdf.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/logging.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/md2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/md4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/md5.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/memory.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/misc.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/pkcs12.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/pkcs7.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/poly1305.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/pwdbased.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/random.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/rc2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/ripemd.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/rsa.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sakke.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/selftest.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha256.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sha512.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/signature.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/siphash.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sm2.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sm3.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sm4.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sphincs.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_armthumb.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_c32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_c64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_cortexm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_dsp32.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_int.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_arm32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_arm64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_armthumb.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_c32.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_c64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_cortexm.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_sm2_x86_64.o +# COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/sp_x86_64.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/srp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/tfm.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_dsp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_encrypt.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_kyber.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_kyber_poly.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_lms.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_pkcs11.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_port.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wc_xmss.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfcrypt_first.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfcrypt_last.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfevent.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/wolfmath.o + +## +## Espressif +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_aes.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_mp.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_sha.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp32_util.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp_sdk_time_lib.o +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.o + +## +## wolfcrypt benchmark (optional) +## +## COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/benchmark/benchmark.o + +## +## wolfcrypt test (optional) +## +COMPONENT_OBJS += $(WOLFSSL_ROOT)wolfcrypt/test/test.o + +## +## wolfcrypt +## +COMPONENT_SRCDIRS += $(WOLFSSL_ROOT)wolfcrypt/src diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,775 @@ +/* user_settings.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* This user_settings.h is for Espressif ESP-IDF + * + * Standardized wolfSSL Espressif ESP32 + ESP8266 user_settings.h V5.7.0-1 + * + * Do not include any wolfssl headers here + * + * When editing this file: + * ensure wolfssl_test and wolfssl_benchmark settings match. + */ + +/* The Espressif project config file. See also sdkconfig.defaults */ +#include "sdkconfig.h" + +/* The Espressif sdkconfig will have chipset info. +** +** Some possible values: +** +** CONFIG_IDF_TARGET_ESP32 +** CONFIG_IDF_TARGET_ESP32S2 +** CONFIG_IDF_TARGET_ESP32S3 +** CONFIG_IDF_TARGET_ESP32C3 +** CONFIG_IDF_TARGET_ESP32C6 +*/ + +#undef WOLFSSL_ESPIDF +#define WOLFSSL_ESPIDF + +/* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */ +#define NO_ESP_SDK_WIFI + +/* Experimental Kyber */ +#if 0 + /* Kyber typically needs a minimum 10K stack */ + #define WOLFSSL_EXPERIMENTAL_SETTINGS + #define WOLFSSL_HAVE_KYBER + #define WOLFSSL_WC_KYBER + #define WOLFSSL_SHA3 +#endif + +/* + * ONE of these Espressif chip families will be detected from sdkconfig: + * + * WOLFSSL_ESP32 + * WOLFSSL_ESP8266 + */ +#undef WOLFSSL_ESPWROOM32SE +#undef WOLFSSL_ESP8266 +#undef WOLFSSL_ESP32 +/* See below for chipset detection from sdkconfig.h */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* SMALL_SESSION_CACHE saves a lot of RAM for ClientCache and SessionCache. + * Memory requirement is about 5KB, otherwise 20K is needed when not specified. + * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K) + * When really desperate or no TLS used, try NO_SESSION_CACHE. */ +#define NO_SESSION_CACHE + +/* Small Stack uses more heap. */ +#define WOLFSSL_SMALL_STACK + +/* Full debugging turned off, but show malloc failure detail */ +/* #define DEBUG_WOLFSSL */ +#define DEBUG_WOLFSSL_MALLOC + +/* See test.c that sets cert buffers; we'll set them here: */ +#define USE_CERT_BUFFERS_256 +#define USE_CERT_BUFFERS_2048 + +/* RSA_LOW_MEM: Half as much memory but twice as slow. */ +#define RSA_LOW_MEM + +/* Uncommon settings for testing only */ +#define TEST_ESPIDF_ALL_WOLFSSL +#ifdef TEST_ESPIDF_ALL_WOLFSSL + #define WOLFSSL_MD2 + #define HAVE_BLAKE2 + #define HAVE_BLAKE2B + #define HAVE_BLAKE2S + + #define WC_RC2 + #define WOLFSSL_ALLOW_RC4 + + #define HAVE_POLY1305 + + #define WOLFSSL_AES_128 + #define WOLFSSL_AES_OFB + #define WOLFSSL_AES_CFB + #define WOLFSSL_AES_XTS + + /* #define WC_SRTP_KDF */ + /* TODO Causes failure with Espressif AES HW Enabled */ + /* #define HAVE_AES_ECB */ + /* #define HAVE_AESCCM */ + /* TODO sanity check when missing HAVE_AES_ECB */ + #define WOLFSSL_WOLFSSH + + #define HAVE_AESGCM + #define WOLFSSL_AES_COUNTER + + #define HAVE_FFDHE + #define HAVE_FFDHE_2048 + #if defined(CONFIG_IDF_TARGET_ESP8266) + /* TODO Full size SRP is disabled on the ESP8266 at this time. + * Low memory issue? */ + #define WOLFCRYPT_HAVE_SRP + /* MIN_FFDHE_FP_MAX_BITS = (MIN_FFDHE_BITS * 2); see settings.h */ + #define FP_MAX_BITS MIN_FFDHE_FP_MAX_BITS + #elif defined(CONFIG_IDF_TARGET_ESP32) || \ + defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) + /* SRP Known to be working on this target::*/ + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #else + /* For everything else, give a try and see if SRP working: */ + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #endif + + #define HAVE_DH + + /* TODO: there may be a problem with HAVE_CAMELLIA with HW AES disabled. + * Do not define NO_WOLFSSL_ESP32_CRYPT_AES when enabled: */ + /* #define HAVE_CAMELLIA */ + + /* DSA requires old SHA */ + #define HAVE_DSA + + /* Needs SHA512 ? */ + #define HAVE_HPKE + + /* Not for Espressif? */ + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) || \ + defined(CONFIG_IDF_TARGET_ESP8266) + + #if defined(CONFIG_IDF_TARGET_ESP8266) + #undef HAVE_ECC + #undef HAVE_ECC_CDH + #undef HAVE_CURVE25519 + + /* TODO does CHACHA also need alignment? Failing on ESP8266 + * See SHA256 __attribute__((aligned(4))); and WC_SHA256_ALIGN */ + #ifdef HAVE_CHACHA + #error "HAVE_CHACHA not supported on ESP8266" + #endif + #ifdef HAVE_XCHACHA + #error "HAVE_XCHACHA not supported on ESP8266" + #endif + #else + #define HAVE_XCHACHA + #define HAVE_CHACHA + /* TODO Not enabled at this time, needs further testing: + * #define WC_SRTP_KDF + * #define HAVE_COMP_KEY + * #define WOLFSSL_HAVE_XMSS + */ + #endif + /* TODO AES-EAX not working on this platform */ + + /* Optionally disable DH + * #undef HAVE_DH + * #undef HAVE_FFDHE + */ + + /* ECC_SHAMIR out of memory on ESP32-C2 during ECC */ + #ifndef HAVE_ECC + #define ECC_SHAMIR + #endif + #else + #define WOLFSSL_AES_EAX + + #define ECC_SHAMIR + #endif + + /* Only for WOLFSSL_IMX6_CAAM / WOLFSSL_QNX_CAAM ? */ + /* #define WOLFSSL_CAAM */ + /* #define WOLFSSL_CAAM_BLOB */ + + #define WOLFSSL_AES_SIV + #define WOLFSSL_CMAC + + #define WOLFSSL_CERT_PIV + + /* HAVE_SCRYPT may turn on HAVE_PBKDF2 see settings.h */ + /* #define HAVE_SCRYPT */ + #define SCRYPT_TEST_ALL + #define HAVE_X963_KDF +#endif + +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* When you don't want to use the old SHA */ +/* #define NO_SHA */ +/* #define NO_OLD_TLS */ + +#define BENCH_EMBEDDED + +/* TLS 1.3 */ +#define WOLFSSL_TLS13 +#define HAVE_TLS_EXTENSIONS +#define WC_RSA_PSS +#define HAVE_HKDF +#define HAVE_AEAD +#define HAVE_SUPPORTED_CURVES + +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + +#define NO_FILESYSTEM + +#define NO_OLD_TLS + +#define HAVE_AESGCM + +/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */ +/* #define WOLFSSL_RIPEMD */ + +/* when you want to use SHA224 */ +#define WOLFSSL_SHA224 + +/* when you want to use SHA384 */ +#define WOLFSSL_SHA384 + +/* when you want to use SHA512 */ +#define WOLFSSL_SHA512 + +/* when you want to use SHA3 */ +#define WOLFSSL_SHA3 + + /* ED25519 requires SHA512 */ +#define HAVE_ED25519 + +/* Some features not enabled for ESP8266: */ +#if defined(CONFIG_IDF_TARGET_ESP8266) || \ + defined(CONFIG_IDF_TARGET_ESP32C2) + /* TODO determine low memory configuration for ECC. */ +#else + #define HAVE_ECC + #define HAVE_CURVE25519 + #define CURVE25519_SMALL +#endif + +#define HAVE_ED25519 + +/* Optional OPENSSL compatibility */ +#define OPENSSL_EXTRA + +/* #Optional HAVE_PKCS7 */ +#define HAVE_PKCS7 + +#if defined(HAVE_PKCS7) + /* HAVE_PKCS7 may enable HAVE_PBKDF2 see settings.h */ + #define NO_PBKDF2 + + #define HAVE_AES_KEYWRAP + #define HAVE_X963_KDF + #define WOLFSSL_AES_DIRECT +#endif + +/* when you want to use AES counter mode */ +/* #define WOLFSSL_AES_DIRECT */ +/* #define WOLFSSL_AES_COUNTER */ + +/* esp32-wroom-32se specific definition */ +#if defined(WOLFSSL_ESPWROOM32SE) + #define WOLFSSL_ATECC508A + #define HAVE_PK_CALLBACKS + /* when you want to use a custom slot allocation for ATECC608A */ + /* unless your configuration is unusual, you can use default */ + /* implementation. */ + /* #define CUSTOM_SLOT_ALLOCATION */ +#endif + +/* WC_NO_CACHE_RESISTANT: slower but more secure */ +/* #define WC_NO_CACHE_RESISTANT */ + +/* TFM_TIMING_RESISTANT: slower but more secure */ +/* #define TFM_TIMING_RESISTANT */ + +/* #define WOLFSSL_ATECC508A_DEBUG */ + +/* date/time */ +/* if it cannot adjust time in the device, */ +/* enable macro below */ +/* #define NO_ASN_TIME */ +/* #define XTIME time */ + + +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ +#define ESP_RSA_TIMEOUT_CNT 0x349F00 + +/* hash limit for test.c */ +#define HASH_SIZE_LIMIT + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ +/* #define WOLFSSL_SP_RISCV32 */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + + +#define WOLFSSL_SMALL_STACK + + +#define HAVE_VERSION_EXTENDED_INFO +/* #define HAVE_WC_INTROSPECTION */ + +#define HAVE_SESSION_TICKET + +/* #define HAVE_HASHDRBG */ + +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_EXT +#define WOLFSSL_SYS_CA_CERTS + + +#define WOLFSSL_CERT_TEXT + +#define WOLFSSL_ASN_TEMPLATE + +/* +#undef WOLFSSL_KEY_GEN +#undef WOLFSSL_CERT_REQ +#undef WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_EXT +#undef WOLFSSL_SYS_CA_CERTS +*/ + +/* command-line options +--enable-keygen +--enable-certgen +--enable-certreq +--enable-certext +--enable-asn-template +*/ + +/* Chipset detection from sdkconfig.h + * Default is HW enabled unless turned off. + * Uncomment lines to force SW instead of HW acceleration */ +#if defined(CONFIG_IDF_TARGET_ESP32) + #define WOLFSSL_ESP32 + /* Alternatively, if there's an ECC Secure Element present: */ + /* #define WOLFSSL_ESPWROOM32SE */ + + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + #define WOLFSSL_ESP32 + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: https://www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #define WOLFSSL_ESP32 + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + #define WOLFSSL_ESP32 + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + #define WOLFSSL_ESP8266 + + /* There's no hardware encryption on the ESP8266 */ + /* Consider using the ESP32-C2/C3/C6 + * See https://www.espressif.com/en/products/socs/esp32-c2 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* There's no Hardware Acceleration available on ESP8684 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP8684 *****/ + +#else + /* Anything else encountered, disable HW accleration */ + #warning "Unexpected CONFIG_IDF_TARGET_NN value" + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +/* RSA primitive specific definition, listed AFTER the Chipset detection */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + /* Consider USE_FAST_MATH and SMALL_STACK */ + + #ifndef NO_RSA + #define ESP32_USE_RSA_PRIMITIVE + + #if defined(CONFIG_IDF_TARGET_ESP32) + #ifdef CONFIG_ESP_MAIN_TASK_STACK_SIZE + #if CONFIG_ESP_MAIN_TASK_STACK_SIZE < 10500 + #warning "RSA may be difficult with less than 10KB Stack "/ + #endif + #endif + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + #endif + #endif +#endif + +/* Debug options: +See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK + +See wolfcrypt/benchmark/benchmark.c for debug and other settings: + +Turn on benchmark timing debugging (CPU Cycles, RTOS ticks, etc) +#define DEBUG_WOLFSSL_BENCHMARK_TIMING + +Turn on timer debugging (used when CPU cycles not available) +#define WOLFSSL_BENCHMARK_TIMER_DEBUG +*/ + +/* Pause in a loop rather than exit. */ +#define WOLFSSL_ESPIDF_ERROR_PAUSE + +#define WOLFSSL_HW_METRICS + +/* for test.c */ +/* #define HASH_SIZE_LIMIT */ + +/* Optionally turn off HW math checks */ +/* #define NO_HW_MATH_TEST */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +/* used by benchmark: */ +#define WOLFSSL_PUBLIC_MP + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/***************************** Certificate Macros ***************************** + * + * The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * https://github.com/wolfSSL/wolfssl/pull/6825 + * https://github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +/* Conditional macros used in wolfSSL TLS client and server examples */ +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #include + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #if defined(USE_CERT_BUFFERS_2048) + /* Be sure to include in app when using example certs: */ + /* #include */ + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #elif defined(USE_CERT_BUFFERS_1024) + /* Be sure to include in app when using example certs: */ + /* #include */ + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + /* Optionally define custom cert arrays, sizes, and types here */ + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif /* Conditional key and cert constant names */ + +/****************************************************************************** +** Sanity Checks +******************************************************************************/ +#if defined(CONFIG_ESP_MAIN_TASK_STACK_SIZE) + #if defined(WOLFCRYPT_HAVE_SRP) + #if defined(FP_MAX_BITS) + #if FP_MAX_BITS < (8192 * 2) + #define ESP_SRP_MINIMUM_STACK_8K (24 * 1024) + #else + #define ESP_SRP_MINIMUM_STACK_8K (28 * 1024) + #endif + #else + #error "Please define FP_MAX_BITS when using WOLFCRYPT_HAVE_SRP." + #endif + + #if (CONFIG_ESP_MAIN_TASK_STACK_SIZE < ESP_SRP_MINIMUM_STACK) + #warning "WOLFCRYPT_HAVE_SRP enabled with small stack size" + #endif + #endif +#else + #warning "CONFIG_ESP_MAIN_TASK_STACK_SIZE not defined!" +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,79 +1,9 @@ - # # wolfssl crypt test # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") -set(COMPONENT_SRCS "main.c") - -# when using time helper: -# set(COMPONENT_SRCS "main.c" "time_helper.c") - -set(COMPONENT_ADD_INCLUDEDIRS ".") - -set (git_cmd "git") - -if( EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl/" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" ) - # - # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user - # - message(STATUS "") - message(STATUS "WARNING: Found components/wolfssl in both local project and IDF_PATH") - message(STATUS "") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING") -endif() - -register_component() - -# -# LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT) -# -# Save the THIS_VAR as a string in a macro called VAR_OUPUT -# -# VAR_OUPUT: the name of the macro to define -# THIS_VAR: the OUTPUT_VARIABLE result from a execute_process() -# VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful. -# -function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT ) - # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true. - string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE) - - # if we had a successful operation, save the THIS_VAR in VAR_OUPUT - if(${IS_VALID_VALUE}) - # strip newline chars in THIS_VAR parameter and save in VAR_VALUE - string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR}) - - # we'll could percolate the value to the parent for possible later use - # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE) - - # but we're only using it here in this function - set(${VAR_OUPUT} ${VAR_VALUE}) - - # we'll print what we found to the console - message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}") - - # the interesting part is defining the VAR_OUPUT name a value to use in the app - add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\") - else() - # if we get here, check the execute_process command and parameters. - message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT") - set(${VAR_OUPUT} "Unknown") - endif() -endfunction() # LIBWOLFSSL_SAVE_INFO - -if(NOT CMAKE_BUILD_EARLY_EXPANSION) - # LIBWOLFSSL_VERSION_GIT_HASH - execute_process(COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) - LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}") - - # LIBWOLFSSL_VERSION_GIT_SHORT_HASH - execute_process(COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET ) - LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}") - - # LIBWOLFSSL_VERSION_GIT_HASH_DATE - execute_process(COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ) - LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}") -endif() - -message(STATUS "") - +idf_component_register(SRCS + "main.c" + INCLUDE_DIRS + ".") diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,3 +1,9 @@ # -# Main Makefile. This is basically the same as a component makefile. -# \ No newline at end of file +# Main component makefile. +# +# This Makefile can be left empty. By default, it will take the sources in the +# src/ directory, compile them and link them into lib(subdirectory_name).a +# in the build directory. This behavior is entirely configurable, +# please read the ESP-IDF documents if you need to do this. +# +# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/include/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/include/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/include/main.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/include/main.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +/* template main.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* main.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -24,14 +24,42 @@ #include "sdkconfig.h" /* wolfSSL */ -#include -#include -#include -#ifndef WOLFSSL_ESPIDF -#warning "problem with wolfSSL user settings. Check components/wolfssl/include" +/* Always include wolfcrypt/settings.h before any other wolfSSL file. */ +/* Reminder: settings.h pulls in user_settings.h; don't include it here. */ +#ifdef WOLFSSL_USER_SETTINGS + #include + #ifndef WOLFSSL_ESPIDF + #warning "Problem with wolfSSL user_settings." + #warning "Check components/wolfssl/include" + #endif + #include + #include + #include + #include + #include +#else + /* Define WOLFSSL_USER_SETTINGS project wide for settings.h to include */ + /* wolfSSL user settings in ./components/wolfssl/include/user_settings.h */ + #error "Missing WOLFSSL_USER_SETTINGS in CMakeLists or Makefile:\ + CFLAGS +=-DWOLFSSL_USER_SETTINGS" #endif -#include +#include "driver/uart.h" + + +/* set to 0 for one test, +** set to 1 for continuous test loop */ +#define TEST_LOOP 0 + +#define THIS_MONITOR_UART_RX_BUFFER_SIZE 200 + +#ifdef CONFIG_ESP8266_XTAL_FREQ_26 + /* 26MHz crystal: 74880 bps */ + #define THIS_MONITOR_UART_BAUD_DATE 74880 +#else + /* 40MHz crystal: 115200 bps */ + #define THIS_MONITOR_UART_BAUD_DATE 115200 +#endif /* ** the wolfssl component can be installed in either: @@ -48,18 +76,13 @@ /* ** although the wolfcrypt/test includes a default time setting, -** see the enclosed optional time helper for adding NNTP. -** be sure to add "time_helper.c" in main/CMakeLists.txt -*/ +** see wolfssl/wolfcrypt/port/Espressif/esp-sdk-lib.h */ + #undef WOLFSSL_USE_TIME_HELPER -#if defined(WOLFSSL_USE_TIME_HELPER) - #include "time_helper.h" */ -#endif /* see wolfssl/wolfcrypt/test/test.h */ extern void wolf_crypt_task(); - static const char* const TAG = "wolfssl_test"; #if defined(WOLFSSL_ESPWROOM32SE) && defined(HAVE_PK_CALLBACKS) \ @@ -123,75 +146,73 @@ #endif /* CUSTOM_SLOT_ALLOCATION */ #endif /* WOLFSSL_ESPWROOM32SE && HAVE_PK_CALLBACK && WOLFSSL_ATECC508A */ - /* entry point */ void app_main(void) { - int rc = 0; + uart_config_t uart_config = { + .baud_rate = THIS_MONITOR_UART_BAUD_DATE, + .data_bits = UART_DATA_8_BITS, + .parity = UART_PARITY_DISABLE, + .stop_bits = UART_STOP_BITS_1, + }; + esp_err_t ret = 0; + wc_ptr_t stack_start = esp_sdk_stack_pointer(); + + /* uart_set_pin(UART_NUM_0, TX_PIN, RX_PIN, + * UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); */ + + /* Some targets may need to have UART speed set. TODO: which? */ + ESP_LOGI(TAG, "UART init"); + uart_param_config(UART_NUM_0, &uart_config); + uart_driver_install(UART_NUM_0, + THIS_MONITOR_UART_RX_BUFFER_SIZE, 0, 0, NULL, 0); + + ESP_LOGI(TAG, "------------------ wolfSSL Test Example ----------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "---------------------- BEGIN MAIN ----------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "Stack Start: 0x%x", stack_start); - - ESP_LOGI(TAG, "CONFIG_IDF_TARGET = %s", CONFIG_IDF_TARGET); - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_STRING = %s", LIBWOLFSSL_VERSION_STRING); - -#if defined(LIBWOLFSSL_VERSION_GIT_HASH) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH = %s", LIBWOLFSSL_VERSION_GIT_HASH); +#ifdef WOLFSSL_ESP_NO_WATCHDOG + ESP_LOGW(TAG, "Found WOLFSSL_ESP_NO_WATCHDOG, disabling..."); + esp_DisableWatchdog(); #endif -#if defined(LIBWOLFSSL_VERSION_GIT_SHORT_HASH ) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_SHORT_HASH = %s", LIBWOLFSSL_VERSION_GIT_SHORT_HASH); +#ifdef ESP_TASK_MAIN_STACK + ESP_LOGI(TAG, "ESP_TASK_MAIN_STACK: %d", ESP_TASK_MAIN_STACK); #endif - -#if defined(LIBWOLFSSL_VERSION_GIT_HASH_DATE) - ESP_LOGI(TAG, "LIBWOLFSSL_VERSION_GIT_HASH_DATE = %s", LIBWOLFSSL_VERSION_GIT_HASH_DATE); +#ifdef TASK_EXTRA_STACK_SIZE + ESP_LOGI(TAG, "TASK_EXTRA_STACK_SIZE: %d", TASK_EXTRA_STACK_SIZE); +#endif +#ifdef INCLUDE_uxTaskGetStackHighWaterMark + ESP_LOGI(TAG, "CONFIG_ESP_MAIN_TASK_STACK_SIZE = %d bytes (%d words)", + CONFIG_ESP_MAIN_TASK_STACK_SIZE, + (int)(CONFIG_ESP_MAIN_TASK_STACK_SIZE / sizeof(void*))); + + /* Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in bytes not words, unlike + * vanilla FreeRTOS) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html + */ + stack_start = uxTaskGetStackHighWaterMark(NULL); + ESP_LOGI(TAG, "Stack Start HWM: %d bytes", stack_start); #endif - - /* some interesting settings are target specific (ESP32, -C3, -S3, etc */ -#if defined(CONFIG_IDF_TARGET_ESP32C3) - /* not available for C3 at this time */ -#elif defined(CONFIG_IDF_TARGET_ESP32S3) - ESP_LOGI(TAG, "CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); -#else - ESP_LOGI(TAG, "CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ = %u MHz", - CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ - ); - ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); +#ifdef HAVE_VERSION_EXTENDED_INFO + esp_ShowExtendedSystemInfo(); #endif /* all platforms: stack high water mark check */ ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); - /* check to see if we are using hardware encryption */ -#if defined(NO_ESP32WROOM32_CRYPT) - ESP_LOGI(TAG, "NO_ESP32WROOM32_CRYPT defined! HW acceleration DISABLED."); -#else - #if defined(CONFIG_IDF_TARGET_ESP32C3) - #error "ESP32WROOM32_CRYPT not yet supported on ESP32-C3" - #elif defined(CONFIG_IDF_TARGET_ESP32S2) - #error "ESP32WROOM32_CRYPT not yet supported on ESP32-S2" - #elif defined(CONFIG_IDF_TARGET_ESP32S3) - /* #error "ESP32WROOM32_CRYPT not yet supported on ESP32-S3" */ - ESP_LOGI(TAG, "ESP32WROOM32_CRYPT is enabled for ESP32-S3."); - #else - ESP_LOGI(TAG, "ESP32WROOM32_CRYPT is enabled."); - #endif -#endif - - - #if defined (WOLFSSL_USE_TIME_HELPER) set_time(); #endif -/* when using atecc608a on esp32-wroom-32se */ +/* when using atecc608a on esp32-WROOM-32se */ #if defined(WOLFSSL_ESPWROOM32SE) && defined(HAVE_PK_CALLBACKS) \ && defined(WOLFSSL_ATECC508A) #if defined(CUSTOM_SLOT_ALLOCATION) @@ -211,22 +232,59 @@ /* Although wolfCrypt_Init() may be explicitly called above, ** Note it is still always called in wolf_test_task. */ - rc = wolf_test_task(); + int loops = 0; + do { + #if defined(WOLFSSL_HW_METRICS) && defined(WOLFSSL_HAS_METRICS) + esp_hw_show_metrics(); + #endif + ret = wolf_test_task(); + ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); + ESP_LOGI(TAG, "loops = %d", loops); + + loops++; + } + while (TEST_LOOP && (ret == 0)); + +#if defined TEST_LOOP && (TEST_LOOP == 1) + ESP_LOGI(TAG, "Test loops completed: %d", loops); +#endif + /* note wolfCrypt_Cleanup() should always be called when finished. ** This is called at the end of wolf_test_task(); */ - if (rc == 0) { - ESP_LOGI(TAG, "wolf_test_task complete success result code = %d", rc); +#if defined(DEBUG_WOLFSSL) && defined(WOLFSSL_ESP32_CRYPT_RSA_PRI) + esp_hw_show_mp_metrics(); +#endif + +#ifdef INCLUDE_uxTaskGetStackHighWaterMark + ESP_LOGI(TAG, "Stack HWM: %d", uxTaskGetStackHighWaterMark(NULL)); + + ESP_LOGI(TAG, "Stack used: %d", CONFIG_ESP_MAIN_TASK_STACK_SIZE + - (uxTaskGetStackHighWaterMark(NULL))); +#endif + +#ifdef WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE + if (ret == 0) { + ESP_LOGI(TAG, WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE("Success!", ret)); } else { - ESP_LOGE(TAG, "wolf_test_task FAIL result code = %d", rc); - /* see wolfssl/wolfcrypt/error-crypt.h */ + ESP_LOGE(TAG, WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE("Failed!", ret)); } +#elif defined(WOLFSSL_ESPIDF_EXIT_MESSAGE) + ESP_LOGI(TAG, WOLFSSL_ESPIDF_EXIT_MESSAGE); +#else + ESP_LOGI(TAG, "\n\nDone!\n\n" + "If running from idf.py monitor, press twice: Ctrl+]"); +#endif - /* after the test, we'll just wait */ + /* done */ while (1) { - /* nothing */ - } +#if defined(SINGLE_THREADED) + while (1); +#else + vTaskDelay(60000); +#endif + } /* done while */ #endif } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,119 +0,0 @@ -/* time_helper.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ -#include -#include - -#include "sdkconfig.h" -#include "esp_log.h" - -#include "time_helper.h" - -const static char* TAG = "Time Helper"; - -#define TIME_ZONE "PST-8" -/* NELEMS(x) number of elements - * To determine the number of elements in the array, we can divide the total size of - * the array by the size of the array element - * See https://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my-array-in-c - **/ -#define NELEMS(x) ( (int)(sizeof(x) / sizeof((x)[0])) ) -#define NTP_SERVER_LIST ( (char*[]) { \ - "pool.ntp.org", \ - "time.nist.gov", \ - "utcnist.colorado.edu" \ - } \ - ) -/* #define NTP_SERVER_COUNT using NELEMS: - * - * (int)(sizeof(NTP_SERVER_LIST) / sizeof(NTP_SERVER_LIST[0])) - */ -#define NTP_SERVER_COUNT NELEMS(NTP_SERVER_LIST) -char* ntpServerList[NTP_SERVER_COUNT] = NTP_SERVER_LIST; - -/* our NTP server list is global info */ -extern char* ntpServerList[NTP_SERVER_COUNT]; - - -int set_time(void) -{ - /* we'll also return a result code of zero */ - int res = 0; - int i = 0; /* counter for time servers */ - time_t interim_time; - - /* ideally, we'd like to set time from network, - * but let's set a default time, just in case */ - struct tm timeinfo = { - .tm_year = 2022 - 1900, - .tm_mon = 11, - .tm_mday = 15, - .tm_hour = 3, - .tm_min = 25, - .tm_sec = 0 - }; - struct timeval now; - -#ifndef NTP_SERVER_COUNT - #define NTP_SERVER_COUNT 0 - char* ntpServerList[NTP_SERVER_COUNT]; -#endif /* not defined: NTP_SERVER_COUNT */ - -#ifndef TIME_ZONE - #define TIME_ZONE "PST-8" -#endif /* not defined: TIME_ZONE */ - - - /* set interim static time */ - interim_time = mktime(&timeinfo); - now = (struct timeval){ .tv_sec = interim_time }; - settimeofday(&now, NULL); - - - /* set timezone */ - setenv("TZ", TIME_ZONE, 1); - tzset(); - - if (NTP_SERVER_COUNT) { - /* next, let's setup NTP time servers - * - * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#sntp-time-synchronization - */ - sntp_setoperatingmode(SNTP_OPMODE_POLL); - - ESP_LOGI(TAG, "sntp_setservername:"); - for (i = 0; i < NTP_SERVER_COUNT; i++) { - const char* thisServer = ntpServerList[i]; - if (strncmp(thisServer, "\x00", 1) == 0) { - /* just in case we run out of NTP servers */ - break; - } - ESP_LOGI(TAG, "%s", thisServer); - sntp_setservername(i, thisServer); - } - sntp_init(); - ESP_LOGI(TAG, "sntp_init done."); - } - else { - ESP_LOGI(TAG, "No sntp time servers found."); - } - return res; -} - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -#ifndef _TIME_HELPER_H -/* - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#ifdef __cplusplus -extern "C" { -#endif - -int set_time(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* #ifndef _TIME_HELPER_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/partitions_singleapp_large.csv mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/partitions_singleapp_large.csv --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/partitions_singleapp_large.csv 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/partitions_singleapp_large.csv 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,34 @@ +# This tag is used to include this file in the ESP Component Registry: +# __ESP_COMPONENT_SOURCE__ + +# to view: idf.py partition-table +# +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +phy_init,data, phy, 0xf000, 4K, +factory, app, factory, 0x10000, 1500K, + + +# For other settings, see: +# https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#creating-custom-tables +# +# Here is the summary printed for the “Single factory app, no OTA” configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x6000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# +# +# Here is the summary printed for the “Factory app, two OTA definitions” configuration: +# +# # ESP-IDF Partition Table +# # Name, Type, SubType, Offset, Size, Flags +# nvs, data, nvs, 0x9000, 0x4000, +# otadata, data, ota, 0xd000, 0x2000, +# phy_init, data, phy, 0xf000, 0x1000, +# factory, app, factory, 0x10000, 1M, +# ota_0, app, ota_0, 0x110000, 1M, +# ota_1, app, ota_1, 0x210000, 1M, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/sdkconfig.defaults mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/sdkconfig.defaults --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/sdkconfig.defaults 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/sdkconfig.defaults 2024-08-03 07:30:00.000000000 +0000 @@ -1,39 +1,88 @@ +# sdkconfig.defaults for ESP8266 + ESP32 +# Note that during the build process, settings from sdkconfig.defaults will not override those already in sdkconfig. +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#custom-sdkconfig-defaults +CONFIG_BENCH_ARGV="-lng 0" +CONFIG_FREERTOS_HZ=1000 +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y + # -# Default main stack size -# -# This is typically way bigger than needed for stack size. See user_settings.h -# -CONFIG_ESP_MAIN_TASK_STACK_SIZE=55000 +# Default main stack size. See user_settings.h +# +# For wolfSSL SMALL_STACK, 3072 bytes should be sufficient for benchmark app. +# When using RSA, assign at least 10500 bytes, otherwise 5500 usually works for others +CONFIG_ESP_MAIN_TASK_STACK_SIZE=10500 # Legacy stack size for older ESP-IDF versions -CONFIG_MAIN_TASK_STACK_SIZE=55000 +CONFIG_MAIN_TASK_STACK_SIZE=10500 # +# Benchmark must not have CONFIG_NEWLIB_NANO_FORMAT enabled +CONFIG_NEWLIB_NANO_FORMAT=n +# # Watchdog Timers # -# We don't want to have the watchdog timeout during tests +# We don't want to have the watchdog timeout during tests & benchmarks # CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n +# Panic & Watchdog +CONFIG_ESP_INT_WDT_TIMEOUT_MS=10000 +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +CONFIG_ESP_INT_WDT=n + +# ESP8266 WDT +# CONFIG_ESP_PANIC_PRINT_REBOOT is not set +CONFIG_ESP_PANIC_PRINT_REBOOT=n +CONFIG_ESP_PANIC_PRINT_HALT=y + +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=n + +# ESP8266 Memory +CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y +CONFIG_HEAP_DISABLE_IRAM=y + +# Performance +# CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# Set max COU frequency (falls back as needed for lower maximum) +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y + +# FreeRTOS ticks at 1ms interval +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=1000 # # Compiler options # CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set CONFIG_COMPILER_STACK_CHECK=y +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +# end of Compiler options -# minimum C3 chip revision known to work is 2. -# rev 0 and 1 not available for testing. -# all revisions expected to work. -CONFIG_ESP32C3_REV_MIN_0= -CONFIG_ESP32C3_REV_MIN_1= +# We don't know that the min is actually v2, +# but this is the earliest tested. CONFIG_ESP32C3_REV_MIN_2=y -CONFIG_ESP32C3_REV_MIN_3= - # # Partition Table diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testAll.sh mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testAll.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testAll.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testAll.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,102 @@ +#!/bin/bash +# +# testAll.sh [keyword suffix] +# +# Build and compile the wolfssl_test for all platforms. +# +# Supply optional keyword suffix value for log file names. +# +# See testMonitor.sh for USB port settings. +# +# Define ESPIDF_PUTTY_MONITOR to a non-blank value to call putty. +# instead of using `idf.py monitor` +#============================================================================== + +# Run shell check to ensure this a good script. +shellcheck "$0" + +if [[ "$PATH" == *"rtos-sdk"* ]]; then + echo "Error. Detected rtos-sdk in path." + echo "Need to start with clean path (no prior idf.py setup) " + exit 1 +fi + +# Save the current PATH to a temporary variable +ORIGINAL_PATH="$PATH" +echo "ORIGINAL_PATH=$PATH" + +export ESPIDF_PUTTY_MONITOR="TRUE" + +THIS_SUFFIX="$1" + + +#****************************************************************************** +# ESP8266 uses rtos-sdk/v3.4 toolchain. Test this first, as it is slowest. +WRK_IDF_PATH=/mnt/c/SysGCC/esp8266/rtos-sdk/v3.4 +#****************************************************************************** + +# Clear ESP-IDF environment variables to ensure clean start for export.sh +unset ESP_IDF_VERSION +unset ESP_ROM_ELF_DIR +unset IDF_DEACTIVATE_FILE_PATH +unset IDF_PATH +unset IDF_PYTHON_ENV_PATH +unset IDF_TOOLS_EXPORT_CMD +unset IDF_TOOLS_INSTALL_CMD +unset OPENOCD_SCRIPTS + +echo "Run ESP8266 export.sh from ${WRK_IDF_PATH}" + +# shell check should not follow into the ESP-IDF export.sh +# shellcheck disable=SC1091 +. "$WRK_IDF_PATH"/export.sh + +# Tensilica +./testMonitor.sh wolfssl_test esp8266 "$THIS_SUFFIX" || exit 1 # 2715073 + + +#****************************************************************************** +# ESP32[-N] uses esp-idf/v5.2 toolchain +WRK_IDF_PATH=/mnt/c/SysGCC/esp32/esp-idf/v5.2 +#****************************************************************************** +# Restore the original PATH +export PATH="$ORIGINAL_PATH" + +# Clear ESP-IDF environment variables to ensure clean start +unset ESP_IDF_VERSION +unset ESP_ROM_ELF_DIR +unset IDF_DEACTIVATE_FILE_PATH +unset IDF_PATH +unset IDF_PYTHON_ENV_PATH +unset IDF_TOOLS_EXPORT_CMD +unset IDF_TOOLS_INSTALL_CMD +unset OPENOCD_SCRIPTS + +echo "Run ESP32 export.sh from ${WRK_IDF_PATH}" + +# shell check should not follow into the ESP-IDF export.sh +# shellcheck disable=SC1091 +. "$WRK_IDF_PATH"/export.sh + +# Comment numeric values are recently observed runtime durations. +# Different tests may be enabled for each device. +# This list is not indicative of relative performance. + +# Limited hardware acceleration, test slowest first: +./testMonitor.sh wolfssl_test esp32h2 "$THIS_SUFFIX" || exit 1 # 1424084 esp32h2 COM31" ok +./testMonitor.sh wolfssl_test esp8684 "$THIS_SUFFIX" || exit 1 # 1065290 esp8684 COM49" ok + +# RISC-V +./testMonitor.sh wolfssl_test esp32c2 "$THIS_SUFFIX" || exit 1 # 1133856 esp32c2 COM79" ok +./testMonitor.sh wolfssl_test esp32c3 "$THIS_SUFFIX" || exit 1 # 344677 esp32c3 COM35" NT +./testMonitor.sh wolfssl_test esp32c6 "$THIS_SUFFIX" || exit 1 # 346393 esp32c6 COM36" ok + +# Xtensa +./testMonitor.sh wolfssl_test esp32 "$THIS_SUFFIX" || exit 1 # 259093 esp32 COM9" NT +./testMonitor.sh wolfssl_test esp32s2 "$THIS_SUFFIX" || exit 1 # 305004 esp32s2 COM30" NT +./testMonitor.sh wolfssl_test esp32s3 "$THIS_SUFFIX" || exit 1 # 267518 esp32s3 COM24" NT + +# Restore the original PATH +export PATH="$ORIGINAL_PATH" + +echo "Done!" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testMonitor.sh mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testMonitor.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testMonitor.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/testMonitor.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,230 @@ +#!/bin/bash +# +# Syntax: +# ./testMonitor.sh +# +# Example: +# +# ./testMonitor.sh wolfssl_test esp32c6 WIP +# +# Define ESPIDF_PUTTY_MONITOR to a non-blank value to call putty +# instead of using `idf.py monitor` +#======================================================================================== + +# Run shell check to ensure this a good script. +shellcheck "$0" + +PUTTY_EXE="/mnt/c/tools/putty.exe" + +THIS_HOME_DIR="$(pwd)" +# export WOLFSSL_ESPIDF="/mnt/c/workspace/wolfssl-master/IDE/Espressif/ESP-IDF/examples" + +# the first parameter is expected to be a project name in the WOLFSSL_ESPIDF directory. +if [ $# -lt 3 ]; then + echo "Usage: $0 " + exit 1 +else + THIS_EXAMPLE="$1" +# pushd "${WOLFSSL_ESPIDF}" || exit 1 +# pushd "./${THIS_EXAMPLE}" || exit 1 + + THIS_TARGET="$2" + THIS_KEYWORD="$3" +fi + +echo "testMonitor current path:" +pwd + +#ESP32c2 monitor is 78800 +# These are the WSL Serial Ports for each respective ESP32 SoC Device. +# Unfortunately they are currently hard coded and computer-specific. +esp32_PORT="/dev/ttyS9" +esp32c2_PORT="/dev/ttyS79" +esp32c3_PORT="/dev/ttyS35" +esp32c6_PORT="/dev/ttyS36" +esp32h2_PORT="/dev/ttyS31" +esp32s2_PORT="/dev/ttyS30" +esp32s3_PORT="/dev/ttyS24" +esp8266_PORT="/dev/ttyS70" + +esp8684_PORT="/dev/ttyS49" +# esp32c2_PORT="/dev/ttyS49" #8684 + +# Load putty profiles. Note profiles names need to have been previously +# defined and saved in putty! These are the saved sessions in putty: +esp32_PUTTY="COM9" +esp32c2_PUTTY="COM79 - ESP32-C2 74880" +esp32c3_PUTTY="COM35" +esp32c6_PUTTY="COM36" +esp32h2_PUTTY="COM31" +esp32s2_PUTTY="COM30" +esp32s3_PUTTY="COM24" +esp8684_PUTTY="COM49" +esp8266_PUTTY="COM70 - 74880" + +echo "esp32_PORT: $esp32_PORT" +echo "esp32c2_PORT: $esp32c2_PORT" +echo "esp32c3_PORT: $esp32c3_PORT" +echo "esp32c6_PORT: $esp32c6_PORT" +echo "esp32s2_PORT: $esp32s2_PORT" +echo "esp32s3_PORT: $esp32s3_PORT" +echo "esp32h2_PORT: $esp32h2_PORT" +echo "esp8266_PORT: $esp8266_PORT" +echo "esp8684_PORT: $esp8684_PORT" + +# given a THIS_TARGET, assign THIS_TARGET_PORT to the respective port. +THIS_TARGET_PORT="${THIS_TARGET}_PORT" + +# Check that THIS_TARGET_PORT is defined. +if [ -z "$THIS_TARGET_PORT" ]; then + echo "Error: No port defined for ${THIS_TARGET}" + exit 1 +else + echo "THIS_TARGET_PORT=${THIS_TARGET_PORT}" +fi + +THIS_TARGET_PORT="${!THIS_TARGET_PORT}" +echo THIS_TARGET_PORT="${THIS_TARGET_PORT}" + + +# The use of putty is optional +THIS_TARGET_PUTTY="${THIS_TARGET}_PUTTY" + +if [ -z "$ESPIDF_PUTTY_MONITOR" ]; then + echo "Using ESP-IDF monitor" +else + # Check that THIS_TARGET_PUTTY is defined. + echo "" + echo "Using saved putty profile session names:" + echo "esp32_PUTTY: $esp32_PUTTY" + echo "esp32c2_PUTTY: $esp32c2_PUTTY" + echo "esp32c3_PUTTY: $esp32c3_PUTTY" + echo "esp32c6_PUTTY: $esp32c6_PUTTY" + echo "esp32s2_PUTTY: $esp32s2_PUTTY" + echo "esp32s3_PUTTY: $esp32s3_PUTTY" + echo "esp32h2_PUTTY: $esp32h2_PUTTY" + echo "esp8684_PUTTY: $esp8684_PUTTY" + echo "esp8266_PUTTY: $esp8266_PUTTY" + echo "" + + if [ -z "$THIS_TARGET_PUTTY" ]; then + echo "Error: No putty profile defined for ${THIS_TARGET}" + exit 1 + else + echo "THIS_TARGET_PUTTY=${THIS_TARGET_PUTTY}" + fi + + THIS_TARGET_PUTTY="${!THIS_TARGET_PUTTY}" + echo THIS_TARGET_PUTTY="${THIS_TARGET_PUTTY}" +fi + +if [[ "$THIS_TARGET" == "esp8684" ]]; then + echo "Treating esp8684 like an esp32c2" + THIS_TARGET=esp32c2 +fi + + +# Assemble some log file names. +echo "" +BUILD_LOG="${THIS_HOME_DIR}/logs/${THIS_EXAMPLE}_build_IDF_v5.1_${THIS_TARGET}_${THIS_KEYWORD}.txt" +FLASH_LOG="${THIS_HOME_DIR}/logs/${THIS_EXAMPLE}_flash_IDF_v5.1_${THIS_TARGET}_${THIS_KEYWORD}.txt" +THIS_LOG="${THIS_HOME_DIR}/logs/${THIS_EXAMPLE}_output_IDF_v5.1_${THIS_TARGET}_${THIS_KEYWORD}.txt" +THIS_CFG="${THIS_HOME_DIR}/logs/${THIS_EXAMPLE}_user_settings_IDF_v5.1_${THIS_TARGET}_${THIS_KEYWORD}.txt" +THIS_WLOG="logs\\${THIS_TARGET}_output.log" +# cp ./components/wolfssl/include/user_settings.h "${THIS_CFG}" + +echo "BUILD_LOG = ${BUILD_LOG}" +echo "FLASH_LOG = ${FLASH_LOG}" +echo "THIS_LOG = ${THIS_LOG}" +echo "THIS_CFG = ${THIS_CFG}" + + +if [[ "$THIS_TARGET" == "esp8266" ]]; then + # idf.py for the ESP8266 does not support --version + echo "ESP8266 using $IDF_PATH" +else + idf.py --version > "${BUILD_LOG}" 2>&1 +fi + +echo "Full clean for $THIS_TARGET..." +#--------------------------------------------------------------------- +idf.py fullclean >> "${BUILD_LOG}" 2>&1 +THIS_ERROR_CODE=$? +if [ $THIS_ERROR_CODE -ne 0 ]; then + echo "" + echo "Error during fullclean. Deleting build directory." + rm -rf ./build +fi + +#--------------------------------------------------------------------- +if [[ "$THIS_TARGET" == "esp8266" ]]; then + #always start with a fresh sdkconfig-debug (or sdkconfig-release) from defaults + rm -f ./sdkconfig-debug + rm -f ./sdkconfig-release + + # idf.py for the ESP8266 does not support --set-target + echo "Target is $THIS_TARGET" + + # Since we don't "set-target" for the ESP8266, ensure the sdkconfig is not present + rm -f ./sdkconfig +else + # Start with fresh sdkconfig + rm -f ./sdkconfig + + # ESP8266 debug and release files not used for non-ESP8266 targets here,delete anyhow: + rm -f ./sdkconfig-debug + rm -f ./sdkconfig-release + + echo "idf.py set-target $THIS_TARGET" + idf.py "set-target" "$THIS_TARGET" >> "${BUILD_LOG}" 2>&1 + THIS_ERROR_CODE=$? + if [ $THIS_ERROR_CODE -ne 0 ]; then + echo "" + tail -n 5 "${BUILD_LOG}" + echo "Error during set-target" + exit 1 + fi +fi + +#--------------------------------------------------------------------- +echo "" +echo "Build $THIS_TARGET..." +echo "idf.py build" +idf.py build >> "${BUILD_LOG}" 2>&1 +THIS_ERROR_CODE=$? +if [ $THIS_ERROR_CODE -ne 0 ]; then + echo "" + tail -n 5 "${BUILD_LOG}" + echo "Error during build for $THIS_TARGET" + echo "" + echo "" + exit 1 +fi + +#--------------------------------------------------------------------- +echo "" +echo "Flash $THIS_TARGET..." +echo "idf.py flash -p ${THIS_TARGET_PORT} -b 115200" +idf.py flash -p "${THIS_TARGET_PORT}" -b 115200 2>&1 | tee -a "${FLASH_LOG}" +THIS_ERROR_CODE=$? +if [ $THIS_ERROR_CODE -ne 0 ]; then + echo "" + tail -n 5 "${FLASH_LOG}" + echo "Error during flash" + exit 1 +fi + +# popd || exit 1 +# popd || exit 1 + +# Note both of the options spawn a separate process: +if [ -z "$ESPIDF_PUTTY_MONITOR" ]; then + echo "Monitor..." + echo ./wolfssl_monitor.py --port "${THIS_TARGET_PORT}" --baudrate 115200 --logfile "${THIS_LOG}" + + ./wolfssl_monitor.py --port "${THIS_TARGET_PORT}" --baudrate 115200 --logfile "${THIS_LOG}" & +else + echo "Calling putty..." + echo "$PUTTY_EXE -load \"$THIS_TARGET_PUTTY\"" + $PUTTY_EXE -load "$THIS_TARGET_PUTTY" -logoverwrite -sessionlog "${THIS_WLOG}" & +fi diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/wolfssl_test_ESP8266.vgdbproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/wolfssl_test_ESP8266.vgdbproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/wolfssl_test_ESP8266.vgdbproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test/wolfssl_test_ESP8266.vgdbproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,292 @@ + + + + + + Unknown + + true + + c9687472-a434-43a7-9026-7914f425b9b4 + true + true + SourceDirs + + + + + + com.visualgdb.xtensa-lx106-elf + + 8.4.0 + 8.1 + 1 + + + + release/v3.4 + rtos-sdk/v3.4 + RTOS_SDK + + 0 + + + + + + + + + + + + + Default + + false + + BuildMachine + BuiltinShortcut + + + + + + + COM80 + + 74880 + 8 + None + One + None + + + 0 + false + true + false + ASCII + + + 255 + 0 + 0 + 0 + + + 255 + 169 + 169 + 169 + + + 255 + 211 + 211 + 211 + + + 255 + 144 + 238 + 144 + + + 255 + 169 + 169 + 169 + + + + 16 + true + true + true + true + 0 + + LF + false + false + true + + + + true + + + + + True + + true + true + + Enabled + true + true + true + + true + + + + false + + apiModeling.google.GTest + core.builtin.BuiltinFunctions + core.builtin.NoReturnFunctions + core.CallAndMessage + core.DivideZero + core.DynamicTypePropagation + core.NonnilStringConstants + core.NonNullParamChecker + core.NullDereference + core.StackAddressEscape + core.UndefinedBinaryOperatorResult + core.uninitialized.ArraySubscript + core.uninitialized.Assign + core.uninitialized.Branch + core.uninitialized.CapturedBlockVariable + core.uninitialized.UndefReturn + core.VLASize + cplusplus.NewDelete + cplusplus.NewDeleteLeaks + cplusplus.SelfAssignment + deadcode.DeadStores + nullability.NullPassedToNonnull + nullability.NullReturnedFromNonnull + security.insecureAPI.getpw + security.insecureAPI.gets + security.insecureAPI.mkstemp + security.insecureAPI.mktemp + security.insecureAPI.UncheckedReturn + security.insecureAPI.vfork + unix.API + unix.cstring.BadSizeArg + unix.cstring.NullArg + unix.Malloc + unix.MallocSizeof + unix.MismatchedDeallocator + unix.StdCLibraryFunctions + unix.Vfork + + + -analyzer-store=region + -analyzer-opt-analyze-nested-blocks + -analyzer-eagerly-assume + + + + + + Debug + + build/Debug + sdkconfig-debug + false + + + + Release + + build/Release + sdkconfig-release + false + + + + + + + + + + + + + false + false + false + false + false + false + false + false + false + + false + false + false + false + false + false + true + false + None + false + false + + true + false + false + true + 0 + false + 0 + true + false + + + openocd + + -f interface/ftdi/tigard.cfg -f target/esp8266.cfg + + + + false + + 131072 + Enabled + + set remotetimeout 60 + target remote :$$SYS:GDB_PORT$$ + mon reset halt + load + mon xtensa_no_interrupts_during_steps on + mon esp8266_autofeed_watchdog on + + false + 0 + 0 + false + + 0 + Soft + 4096 + 4096 + + size4M + freq40M + QIO + + + + true + Disabled + 0 + false + false + true + false + false + + _estack + 0 + false + + true + + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -6,6 +6,12 @@ The recommended configuration is to have only the CMakeLists.txt in the local project components\wolfssl directory. See the [wolfssl_test](../wolfssl_test/README.md) example. +## VisualGDB + +Open the VisualGDB Visual Studio Project file in the VisualGDB directory and click the "Start" button. + +## ESP-IDF Commandline + 1. `idf.py menuconfig` to configure the program. 1-1. Example Configuration -> @@ -35,7 +41,7 @@ . /mnt/c/SysGCC/esp32/esp-idf/v4.4.2/export.sh # build and flash, in this example to COM20 -idf.py build flash -p /dev/ttyS20 -b 921600 monitor +idf.py build flash -p /dev/ttyS20 -b 115200 monitor ``` ## Example Output @@ -45,7 +51,7 @@ for help in optimizing for your particular application, or see the [docs](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html). -Compiled and flashed with `idf.py build flash -p /dev/ttyS7 -b 921600 monitor`: +Compiled and flashed with `idf.py build flash -p /dev/ttyS7 -b 115200 monitor`: ``` ets Jun 8 2016 00:22:57 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* main.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -170,17 +170,17 @@ ESP_LOGI(TAG, "Stack HWM: %d\n", uxTaskGetStackHighWaterMark(NULL)); /* check to see if we are using hardware encryption */ -#if defined(NO_ESP32WROOM32_CRYPT) - ESP_LOGI(TAG, "NO_ESP32WROOM32_CRYPT defined! HW acceleration DISABLED."); +#if defined(NO_ESP32_CRYPT) + ESP_LOGI(TAG, "NO_ESP32_CRYPT defined! HW acceleration DISABLED."); #else #if defined(CONFIG_IDF_TARGET_ESP32C3) - #error "ESP32WROOM32_CRYPT not yet supported on ESP32-C3" + #error "ESP32_CRYPT not yet supported on ESP32-C3" #elif defined(CONFIG_IDF_TARGET_ESP32S2) - #error "ESP32WROOM32_CRYPT not yet supported on ESP32-S2" + #error "ESP32_CRYPT not yet supported on ESP32-S2" #elif defined(CONFIG_IDF_TARGET_ESP32S3) - #error "ESP32WROOM32_CRYPT not yet supported on ESP32-S3" + #error "ESP32_CRYPT not yet supported on ESP32-S3" #else - ESP_LOGI(TAG, "ESP32WROOM32_CRYPT is enabled."); + ESP_LOGI(TAG, "ESP32_CRYPT is enabled."); #endif #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* time_helper.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/examples/wolfssl_test_idf/main/time_helper.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ #ifndef _TIME_HELPER_H /* - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -71,7 +71,14 @@ "./src/conf.c" "./src/misc.c" "./src/pk.c" - "./src/ssl_misc.c" # included by ssl.c + "./src/ssl_asn1.c" # included by ssl.c + "./src/ssl_bn.c" # included by ssl.c + "./src/ssl_certman.c" # included by ssl.c + "./src/ssl_crypto.c" # included by ssl.c + "./src/ssl_load.c" # included by ssl.c + "./src/ssl_misc.c" # included by ssl.c + "./src/ssl_p7p12.c" # included by ssl.c + "./src/ssl_sess.c" # included by ssl.c "./src/x509.c" "./src/x509_str.c" "./wolfcrypt/src/evp.c" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/component.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/component.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/component.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/libs/component.mk 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ # -# Copyright (C) 2006-2023 wolfSSL Inc. +# Copyright (C) 2006-2024 wolfSSL Inc. # # This file is part of wolfSSL. # diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/setup_win.bat mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/setup_win.bat --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/setup_win.bat 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/setup_win.bat 2024-08-03 07:30:00.000000000 +0000 @@ -73,7 +73,7 @@ echo; echo Equivalalent source directory paths: -:: show the path of the equivalent %VALUE% (search for files that don't exist, supress error, and look for string with "\") +:: show the path of the equivalent %VALUE% (search for files that don't exist, suppress error, and look for string with "\") dir %BASEDIR%\*.xyzzy 2> nul | findstr \ dir %WOLFSSLLIB_TRG_DIR%\*.xyzzy 2> nul | findstr \ dir %WOLFSSLEXP_TRG_DIR%\*.xyzzy 2> nul | findstr \ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/ESP-IDF/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* user_settings.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,25 +18,47 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -#undef WOLFSSL_ESPIDF -#undef WOLFSSL_ESPWROOM32 -#undef WOLFSSL_ESPWROOM32SE -#undef WOLFSSL_ESPWROOM32 -#undef WOLFSSL_ESP8266 +/* This user_settings.h is for Espressif ESP-IDF */ +#include + +/* The Espressif sdkconfig will have chipset info. +** +** Possible values: +** +** CONFIG_IDF_TARGET_ESP32 +** CONFIG_IDF_TARGET_ESP32S2 +** CONFIG_IDF_TARGET_ESP32S3 +** CONFIG_IDF_TARGET_ESP32C3 +** CONFIG_IDF_TARGET_ESP32C6 +*/ + +#undef WOLFSSL_ESPIDF #define WOLFSSL_ESPIDF /* * choose ONE of these Espressif chips to define: * - * WOLFSSL_ESPWROOM32 + * WOLFSSL_ESP32 * WOLFSSL_ESPWROOM32SE * WOLFSSL_ESP8266 */ +#undef WOLFSSL_ESPWROOM32SE +#undef WOLFSSL_ESP8266 +#undef WOLFSSL_ESP32 -#define WOLFSSL_ESPWROOM32 +#define WOLFSSL_ESP32 -/* #define DEBUG_WOLFSSL_VERBOSE */ +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* When you don't want to use the old SHA */ +/* #define NO_SHA */ +/* #define NO_OLD_TLS */ #define BENCH_EMBEDDED #define USE_CERT_BUFFERS_2048 @@ -49,29 +71,48 @@ #define HAVE_AEAD #define HAVE_SUPPORTED_CURVES -/* when you want to use SINGLE THREAD */ -/* #define SINGLE_THREADED */ +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + #define NO_FILESYSTEM +#define NO_OLD_TLS + #define HAVE_AESGCM + +#define WOLFSSL_RIPEMD +/* when you want to use SHA224 */ +#define WOLFSSL_SHA224 + /* when you want to use SHA384 */ -/* #define WOLFSSL_SHA384 */ +#define WOLFSSL_SHA384 + +/* when you want to use SHA512 */ #define WOLFSSL_SHA512 + +/* when you want to use SHA3 */ +#define WOLFSSL_SHA3 + +#define HAVE_ED25519 /* ED25519 requires SHA512 */ + #define HAVE_ECC #define HAVE_CURVE25519 #define CURVE25519_SMALL #define HAVE_ED25519 +/* Optional OPENSSL compatibility */ +#define OPENSSL_EXTRA /* when you want to use pkcs7 */ /* #define HAVE_PKCS7 */ +#define HAVE_PKCS7 + #if defined(HAVE_PKCS7) #define HAVE_AES_KEYWRAP #define HAVE_X963_KDF #define WOLFSSL_AES_DIRECT #endif -/* when you want to use aes counter mode */ +/* when you want to use AES counter mode */ /* #define WOLFSSL_AES_DIRECT */ /* #define WOLFSSL_AES_COUNTER */ @@ -85,21 +126,29 @@ /* #define CUSTOM_SLOT_ALLOCATION */ #endif -/* rsa primitive specific definition */ -#if defined(WOLFSSL_ESPWROOM32) || defined(WOLFSSL_ESPWROOM32SE) +/* RSA primitive specific definition */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) /* Define USE_FAST_MATH and SMALL_STACK */ #define ESP32_USE_RSA_PRIMITIVE - /* threshold for performance adjustment for hw primitive use */ - /* X bits of G^X mod P greater than */ - #define EPS_RSA_EXPT_XBTIS 36 - /* X and Y of X * Y mod P greater than */ - #define ESP_RSA_MULM_BITS 2000 + + #if defined(CONFIG_IDF_TARGET_ESP32) + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + + #endif #endif -/* debug options */ -/* #define DEBUG_WOLFSSL */ -/* #define WOLFSSL_ESP32WROOM32_CRYPT_DEBUG */ -/* #define WOLFSSL_ATECC508A_DEBUG */ +#define RSA_LOW_MEM + +/* #define WOLFSSL_ATECC508A_DEBUG */ /* date/time */ /* if it cannot adjust time in the device, */ @@ -107,11 +156,272 @@ /* #define NO_ASN_TIME */ /* #define XTIME time */ -/* when you want not to use HW acceleration */ -/* #define NO_ESP32WROOM32_CRYPT */ -/* #define NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH*/ -/* #define NO_WOLFSSL_ESP32WROOM32_CRYPT_AES */ -/* #define NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI */ -/* adjust wait-timeout count if you see timeout in rsa hw acceleration */ +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ #define ESP_RSA_TIMEOUT_CNT 0x249F00 + +#define HASH_SIZE_LIMIT /* for test.c */ + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + + +#define WOLFSSL_SMALL_STACK + + +#define HAVE_VERSION_EXTENDED_INFO +/* #define HAVE_WC_INTROSPECTION */ + +#define HAVE_SESSION_TICKET + +/* #define HAVE_HASHDRBG */ + +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_EXT +#define WOLFSSL_SYS_CA_CERTS + + +#define WOLFSSL_CERT_TEXT + +#define WOLFSSL_ASN_TEMPLATE + +/* +#undef WOLFSSL_KEY_GEN +#undef WOLFSSL_CERT_REQ +#undef WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_EXT +#undef WOLFSSL_SYS_CA_CERTS +*/ + +/* +--enable-keygen +--enable-certgen +--enable-certreq +--enable-certext +--enable-asn-template +*/ + +/* Default is HW enabled unless turned off. +** Uncomment these lines to force SW instead of HW acceleration */ + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: https://www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + /* TODO: Revisit ESP8266 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ +#else + /* Anything else encountered, disable HW accleration */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +/* Debug options: + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK +*/ + +#define WOLFSSL_ESPIDF_ERROR_PAUSE /* Pause in a loop rather than exit. */ +#define WOLFSSL_HW_METRICS + +/* #define HASH_SIZE_LIMIT */ /* for test.c */ + +/* #define NO_HW_MATH_TEST */ /* Optionall turn off HW math checks */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +#define WOLFSSL_PUBLIC_MP /* used by benchmark */ +#define USE_CERT_BUFFERS_2048 + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/* optional SM4 Ciphers. See https://github.com/wolfSSL/wolfsm +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #include + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #define USE_CERT_BUFFERS_2048 + #define USE_CERT_BUFFERS_256 + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,202 @@ + + +# wolfSSL Espressif IDE + +This directory contains documentation and examples for the Espressif SoC devices. + +Although wolfSSL _should_ work on any Espressif device, there's explicit support for these: + +- esp32 +- esp32c2 +- esp32c3 +- esp32c6 +- esp32s2 +- esp32s3 +- esp32h2 + + +## Getting Started + +If you are new to wolfSSL on the Espressif ESP32, [this video](https://www.youtube.com/watch?v=CzwA3ZBZBZ8) +can help to get started: + +[![Video Preview](https://img.youtube.com/vi/CzwA3ZBZBZ8/0.jpg)](https://www.youtube.com/watch?v=CzwA3ZBZBZ8) + +Additional ESP-IDF specifics can be found in [Espressif/ESP-IDF](./ESP-IDF/README.md). The [wolfSSL Manual](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html) is also a useful +resource. + +## Requirements + +The wolfSSL Espressif code requires the ESP-IDF to be installed for +[Windows](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html) +or [Linux / MacOS](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/linux-macos-setup.html). + +See the [Espressif Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/). + +Any editor can be used. See also the [Espressif Third-Party Tools](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/resources.html) +for a list of feature-rich Integrated Development Environments. +The [wolfSSL examples](./ESP-IDF/examples/README.md) all include a `./VisualGDB` directory with SoC-specific configurations +to help get started quickly. + +Although not required, a [JTAG Adapter](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/jtag-debugging/index.html) +can be helpful for development. When not using a built-in JTAG from Espressif, the examples typically +use the open source [Tigard board](https://github.com/tigard-tools/tigard#readme). + +## Examples: + +There are a variety of examples to help get started: + +* [ESP-IDF Examples](./ESP-IDF/README.md) + +## Managed Component + +The wolfSSL library can be installed as a managed component: + +* [Espressif Managed Component Registry](https://components.espressif.com/components/wolfssl/wolfssl) + +## Notes: + +WSL environment: + +Contents of `/etc/wsl.conf`: +```text +[automount] +options = "metadata" +``` + +To ignore changes in file attributes, see https://github.com/microsoft/WSL/issues/936#issuecomment-1751469229 + +``` +git config core.filemode false +``` + + +Quick start +``` + +WORKSPACE=/mnt/c/workspace +WRK_IDF_PATH=/mnt/c/SysGCC/esp32/esp-idf/v5.1 +WRK_WOLFSSL_PATH=${WORKSPACE}/wolfssl-$USER +WRK_PROJECT_DIR=${WRK_WOLFSSL_PATH}/IDE/Espressif/ESP-IDF/examples/wolfssl_test + +echo "Run export.sh from ${WRK_IDF_PATH}" +. ${WRK_IDF_PATH}/export.sh + +echo "Build and flash project in ${WRK_PROJECT_DIR}" +cd ${WRK_PROJECT_DIR} +idf.py build flash -p /dev/ttyS9 -b 115200 monitor +``` + +Bad chip version: + +``` +ESP-ROM:esp32c3-20200918 +Build:Sep 18 2020 +rst:0x3 (RTC_SW_SYS_RST),boot:0xc (SPI_FAST_FLASH_BOOT) +Saved PC:0x403d151e +SPIWP:0xee +mode:DIO, clock div:2 +load:0x3fcd6100,len:0x16c8 +load:0x403ce000,len:0x930 +load:0x403d0000,len:0x2d28 +entry 0x403ce000 +I (34) boot: ESP-IDF v4.4.2-1-g0aba20e63d-dirty 2nd stage bootloader +I (35) boot: compile time 08:29:06 +I (35) boot: chip revision: 2 +E (38) boot_comm: This chip is revision 2 but the application is configured for minimum revision 3. Can't run. +``` + +If you've encountered a chip version earlier than that confirmed to be working +at wolfSSL, try adjusting the settings in `menuconfig`. + +#### A fatal error occurred: This chip is esp[X] not esp[Y] + +``` +A fatal error occurred: This chip is ESP32-S3 not ESP32-C3. Wrong --chip argument? +CMake Error at run_serial_tool.cmake:56 (message): + /home/gojimmypi/.espressif/python_env/idf4.4_py3.8_env/bin/python + /mnt/c/SysGCC/esp32/esp-idf/v4.4.2/components/esptool_py/esptool/esptool.py + --chip esp32c3 failed +``` + +Delete the `./build` and rename/delete your `sdkconfig` file, then run +`idf.py set-target`, in this example setting to `esp32c3`: + +```bash +idf.py set-target esp32c3 +``` + +#### Cmake Cache Warning + +``` +Executing action: clean +Project sdkconfig was generated for target 'esp32s3', but CMakeCache.txt contains 'esp32c3'. To keep the setting in sdkconfig (esp32s3) and re-generate CMakeCache.txt, run 'idf.py fullclean'. To re-generate sdkconfig for 'esp32c3' target, run 'idf.py set-target esp32c3'. +``` + +As indicated, run `idf.py set-target` and/or delete the `./build` directory. + +#### Connecting, but fails to connect. + +Some devices, particularly 3rd party, non-Espressif dev boards may not have implemented +the reset-program hardware properly, causing devices to not be programmed with the +`idf.py flash` command: + +``` +Connecting...................................... + +A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)! The chip needs to be in download mode. +For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html +CMake Error at run_serial_tool.cmake:56 (message): + /home/gojimmypi/.espressif/python_env/idf4.4_py3.8_env/bin/python + /mnt/c/SysGCC/esp32/esp-idf/v4.4.2/components/esptool_py/esptool/esptool.py + --chip esp32 failed +``` + +Solution: + +Press and hold `EN` button, press and release `IO0` button, then release `EN` button. + +### Unknown CMake command "esptool_py_flash_project_args". + +This unintuitive error was observed when including an unneeded `set(COMPONENTS` in the project-level CMakeLists.txt +and attempting to build with an older toolchain, such as the RTOS SDK 3.4 for the ESP8266. + +### PermissionError: [Errno 13] Permission denied could not open port {} + +This error, other than the obvious permissions, also occurs when the port is in use by another application: + +```text +Traceback (most recent call last): + File "/home/gojimmypi/.espressif/python_env/rtos3.4_py3.10_env/lib/python3.10/site-packages/serial/serialposix.py", line 322, in open + self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK) +PermissionError: [Errno 13] Permission denied: '/dev/ttyS55' + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + [... snip ...] +raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg)) +serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyS55: [Errno 13] Permission denied: '/dev/ttyS55' +``` +### Panic Task watchdog got triggered. + +Long-running code may trip the watchdog timer. + +``` +Task watchdog got triggered. + +Guru Meditation Error: Core 0 panic'ed (unknown). Exception was unhandled. +``` + +The watchdog needs to be [fed](https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/api-reference/system/wdts.html?highlight=watchdog#_CPPv418esp_task_wdt_resetv) on a regular basis +with `void esp_task_wdt_reset(void)` from `esp8266/include/esp_task_wdt.h`. + +Try turning off the WDT in menuconfig, or for Makefiles: + +``` +EXTRA_CFLAGS += -DNO_WATCHDOG +``` + +#### Other Solutions + +See also [this ESP-FAQ Handbook](https://docs.espressif.com/projects/esp-faq/en/latest/esp-faq-en-master.pdf) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Espressif/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Espressif/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -6,6 +6,8 @@ # distribution file set will not contain GitHub info # # see: https://github.com/wolfSSL/wolfssl/pull/5955 +# +# Don't list any config.h files here EXTRA_DIST+= IDE/Espressif/ESP-IDF/compileAllExamples.sh EXTRA_DIST+= IDE/Espressif/ESP-IDF/dummy_config_h @@ -17,20 +19,45 @@ EXTRA_DIST+= IDE/Espressif/ESP-IDF/UPDATE.md EXTRA_DIST+= IDE/Espressif/ESP-IDF/user_settings.h +# Template +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/components +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/main +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/partitions_singleapp_large.csv +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/README.md +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/sdkconfig.defaults +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/VisualGDB +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/components/wolfssl +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/main/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/main/include +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/main/main.c +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/main/include/main.h + +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/template/VisualGDB/wolfssl_template_IDF_v5.1_ESP32.vgdbproj + # Benchmark EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/Makefile +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/partitions_singleapp_large.csv EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/README.md EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/sdkconfig.defaults +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/include/user_settings.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/CMakeLists.txt EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/include EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/Kconfig.projbuild EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.c -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/main.h -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/CMakeLists.txt -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/components/wolfssl/component.mk - +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/main/include/main.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v4.4_ESP32.sln EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v5_ESP32.sln EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_benchmark/VisualGDB/wolfssl_benchmark_IDF_v5_ESP32C3.sln @@ -42,48 +69,94 @@ # TLS Client EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/Makefile +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/partitions_singleapp_large.csv EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/README.md +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/README_server_sm.md EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/sdkconfig.defaults -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/VisualGDB_wolfssl_client.vgdbproj +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/include/user_settings.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/client-tls.c EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/CMakeLists.txt EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/Kconfig.projbuild +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/main.c +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/time_helper.c EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/wifi_connect.c +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/client-tls.h +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/main.h +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/time_helper.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/main/include/wifi_connect.h -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/CMakeLists.txt -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/components/wolfssl/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/README.md + +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/wolfssl_client_ESP8266.vgdbproj +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.sln +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_client/VisualGDB/wolfssl_client_IDF_v5_ESP32.vgdbproj # TLS Server + EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/Makefile +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/partitions_singleapp_large.csv EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/README.md +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/README_server_sm.md EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/sdkconfig.defaults -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/VisualGDB_wolfssl_server.vgdbproj +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/include/user_settings.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/CMakeLists.txt EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/Kconfig.projbuild +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/main.c EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/server-tls.c +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/time_helper.c EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/wifi_connect.c +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/main.h +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/server-tls.h +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/time_helper.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/main/include/wifi_connect.h -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/CMakeLists.txt -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/components/wolfssl/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/README.md + +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.sln +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_server/VisualGDB/wolfssl_server_IDF_v5_ESP32.vgdbproj # wolfSSL Test +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/testAll.sh +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/testMonitor.sh + EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/Makefile +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/partitions_singleapp_large.csv EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/README.md EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/sdkconfig.defaults +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/include/user_settings.h EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/CMakeLists.txt EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/include EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/Kconfig.projbuild EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/main.c -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.c -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/time_helper.h -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/CMakeLists.txt -EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl/component.mk +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/main/include/main.h +EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/wolfssl_test_ESP8266.vgdbproj EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32.sln EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32C3.sln EXTRA_DIST+= IDE/Espressif/ESP-IDF/examples/wolfssl_test/VisualGDB/wolfssl_test-IDF_v5_ESP32C6.sln diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/GCC-ARM/Header/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/Header/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/GCC-ARM/Header/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/Header/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -70,7 +70,6 @@ #define WOLFSSL_HAVE_SP_RSA #define WOLFSSL_HAVE_SP_DH #define WOLFSSL_HAVE_SP_ECC - //#define WOLFSSL_SP_CACHE_RESISTANT #define WOLFSSL_SP_MATH /* only SP math - eliminates fast math code */ /* SP Assembly Speedups */ @@ -85,11 +84,24 @@ /* FIPS - Requires eval or license from wolfSSL */ /* ------------------------------------------------------------------------- */ #undef HAVE_FIPS +#undef HAVE_FIPS_VERSION +#undef HAVE_FIPS_VERSION_MINOR #if 0 #define HAVE_FIPS - #undef HAVE_FIPS_VERSION - #define HAVE_FIPS_VERSION 2 + /* Choose a FIPS version */ + #if 0 + /* FIPS 140-2 */ + #define HAVE_FIPS_VERSION 2 + #elif 0 + /* FIPS 140-3 */ + #define HAVE_FIPS_VERSION 5 + #define HAVE_FIPS_VERSION_MINOR 2 + #elif 0 + /* FIPS Ready */ + #define HAVE_FIPS_VERSION 5 + #define HAVE_FIPS_VERSION_MINOR 3 + #endif #ifdef SINGLE_THREADED #undef NO_THREAD_LS @@ -182,6 +194,9 @@ #undef WOLFSSL_VALIDATE_ECC_IMPORT #define WOLFSSL_VALIDATE_ECC_IMPORT /* Validate import */ + + #undef WOLFSSL_ECDSA_SET_K + #define WOLFSSL_ECDSA_SET_K #endif /* Compressed Key Support */ @@ -198,7 +213,7 @@ #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#undef FP_MAX_BITS_ECC //#define FP_MAX_BITS_ECC (256 * 2) #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/GCC-ARM/Makefile.common mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/Makefile.common --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/GCC-ARM/Makefile.common 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/Makefile.common 2024-08-03 07:30:00.000000000 +0000 @@ -1,11 +1,11 @@ # Set to @ if you want to suppress command echo -CMD_ECHO = +CMD_ECHO = # Important directories BUILD_DIR = ./Build # Toolchain location and prefix -#TOOLCHAIN = +#TOOLCHAIN = TOOLCHAIN ?= /opt/gcc-arm-none-eabi/bin/arm-none-eabi- # Tools selection @@ -101,6 +101,7 @@ SRC_C += ../../wolfcrypt/src/dh.c SRC_C += ../../wolfcrypt/src/ecc.c SRC_C += ../../wolfcrypt/src/hmac.c +SRC_C += ../../wolfcrypt/src/kdf.c SRC_C += ../../wolfcrypt/src/random.c SRC_C += ../../wolfcrypt/src/rsa.c SRC_C += ../../wolfcrypt/src/sha.c @@ -138,7 +139,6 @@ SRC_C += ../../wolfcrypt/src/ge_low_mem.c SRC_C += ../../wolfcrypt/src/ge_operations.c SRC_C += ../../wolfcrypt/src/hash.c -SRC_C += ../../wolfcrypt/src/kdf.c SRC_C += ../../wolfcrypt/src/integer.c SRC_C += ../../wolfcrypt/src/logging.c SRC_C += ../../wolfcrypt/src/md5.c diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/GCC-ARM/linker_fips.ld mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/linker_fips.ld --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/GCC-ARM/linker_fips.ld 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/GCC-ARM/linker_fips.ld 2024-08-03 07:30:00.000000000 +0000 @@ -54,23 +54,23 @@ . = ALIGN(4); } > FLASH - /* Custom section for wolfCrypt and LibC to prevent FIPS hash from changing + /* Custom section for wolfCrypt and LibC to prevent FIPS hash from changing when application code changes are made */ .wolfCryptNonFIPS_text : { . = ALIGN(4); - KEEP(*wolf*src*.o(.text .text*)) lib_a* ( .text .text*) + *wolf*src*.o(.text .text*) . = ALIGN(4); } > FLASH .wolfCryptNonFIPS_rodata : { . = ALIGN(4); - KEEP(*wolf*src*.o(.rodata .rodata*)) lib_a* (.rodata .rodata*) + *wolf*src*.o(.rodata .rodata*) . = ALIGN(4); } > FLASH - + .sys : { *(.sys*) } > FLASH .text : { *(.text*) } > FLASH .rodata : { *(.text*) } > FLASH diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/HEXAGON/ecc-verify-benchmark.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/HEXAGON/ecc-verify-benchmark.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/HEXAGON/ecc-verify-benchmark.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/HEXAGON/ecc-verify-benchmark.c 2024-08-03 07:30:00.000000000 +0000 @@ -133,7 +133,7 @@ ret = wolfSSL_open(sp_URI_value, &(handle[i])); if (ret != 0) { printf("unable to open CDSP? retVal = %d\n", ret); - return -1; + return -1; } wc_ecc_set_handle(&(eccKey[i]), handle[i]); } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/.gitignore 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9 @@ +# Unused project setting files +*.ewt +# Build products +ewarm/ +Debug/ +Release/ +# Auto generated files +settings/ +*.dep diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/Projects/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,3 @@ - #define NO_MAIN_DRIVER #define BENCH_EMBEDDED #define NO_WRITEV @@ -17,10 +16,59 @@ #define WOLFSSL_GENSEED_FORTEST /* Warning: define your own seed gen */ -#define TFM_TIMING_RESISTANT +/* A few examples of different math options below. + * + * See examples/configs/user_settings_template.h for a more + * detailed template. */ +#if 1 + /* Use only single precision (SP) math and algorithms. + * SP math is written to accelerate specific/common key + * sizes and curves. This adds code from sp_c32.c, or one of the specific + * assembly implementations like sp_cortexm.c. This code is faster than the + * multi-precision support because it's optimized for the key/curve. + * The SP math can be used together with any multi-precision math library + * if WOLFSSL_SP_MATH is removed. If only standard keys/curves are being + * used the multi-precision math is not required. + */ + #define WOLFSSL_SP_MATH + /* Enable SP ECC support */ + #define WOLFSSL_HAVE_SP_ECC + /* Enable SP RSA support */ + #define WOLFSSL_HAVE_SP_RSA + /* Enable SP DH support */ + #define WOLFSSL_HAVE_SP_DH + /* Reduce stack use specifically in SP implementation. */ + #define WOLFSSL_SP_SMALL_STACK + /* use smaller version of code */ + #define WOLFSSL_SP_SMALL + /* Assembly optimized version - sp_cortexm.c */ + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM +#elif 1 + /* Use SP math for all key sizes and curves. This will use + * the multi-precision (MP) math implementation in sp_int.c */ + #define WOLFSSL_SP_MATH_ALL + /* Disable use of dynamic stack items */ + #define WOLFSSL_SP_NO_DYN_STACK + /* use smaller version of code */ + #define WOLFSSL_SP_SMALL +#elif 1 + /* Fast Math (tfm.c) (stack based and timing resistant) */ + #define USE_FAST_MATH + /* Enable Fast Math Timing Resistance */ + #define TFM_TIMING_RESISTANT +#else + /* Normal (integer.c) (heap based, not timing resistant) - not recommended*/ + #define USE_INTEGER_HEAP_MATH +#endif + +/* Enable ECC Timing Resistance */ #define ECC_TIMING_RESISTANT +/* Enables blinding mode, to prevent timing attacks */ #define WC_RSA_BLINDING +/* reduce stack use. For variables over 100 bytes allocate from heap */ +#define WOLFSSL_SMALL_STACK +/* disable mutex locking */ #define SINGLE_THREADED /* or define RTOS option */ /* #define WOLFSSL_CMSIS_RTOS */ #define NO_FILESYSTEM diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/.gitignore 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/.gitignore 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -*.bat -*.xcl -*.crun -*.dbgdt -*.dni - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_SAMV71_XULT_user_settings/user_settings_verbose_example.h 2024-08-03 07:30:00.000000000 +0000 @@ -87,7 +87,7 @@ #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ /* MAX ECC BITS = ROUND8(MAX ECC) * 2 */ //#undef FP_MAX_BITS_ECC //#define FP_MAX_BITS_ECC (528 * 2) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/settings/wolfcrypt_benchmark_Debug.jlink 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -[BREAKPOINTS] -ForceImpTypeAny = 0 -ShowInfoWin = 1 -EnableFlashBP = 2 -BPDuringExecution = 0 -[CFI] -CFISize = 0x00 -CFIAddr = 0x00 -[CPU] -MonModeVTableAddr = 0xFFFFFFFF -MonModeDebug = 0 -MaxNumAPs = 0 -LowPowerHandlingMode = 0 -OverrideMemMap = 0 -AllowSimulation = 1 -ScriptFile="" -[FLASH] -CacheExcludeSize = 0x00 -CacheExcludeAddr = 0x00 -MinNumBytesFlashDL = 0 -SkipProgOnCRCMatch = 1 -VerifyDownload = 1 -AllowCaching = 1 -EnableFlashDL = 2 -Override = 1 -Device="ATSAMV71Q21" -[GENERAL] -WorkRAMSize = 0x00 -WorkRAMAddr = 0x00 -RAMUsageLimit = 0x00 -[SWO] -SWOLogFile="" -[MEM] -RdOverrideOrMask = 0x00 -RdOverrideAndMask = 0xFFFFFFFF -RdOverrideAddr = 0xFFFFFFFF -WrOverrideOrMask = 0x00 -WrOverrideAndMask = 0xFFFFFFFF -WrOverrideAddr = 0xFFFFFFFF diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_benchmark_SAMV71_XULT/wolfcrypt_benchmark.ewt 1970-01-01 00:00:00.000000000 +0000 @@ -1,2382 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - Application - - $PROJ_DIR$\Application\runBenchmarks.c - - - - benchmark - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\benchmark\benchmark.c - - - - Device_Support - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\startup_sam.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\system_sam.c - - - - Setup - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\BSP.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\HardFaultHandler.S - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\JLINKMEM_Process.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\OS_Error.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\RTOSInit_SAMV71_CMSIS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_HardFaultHandler.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT_printf.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_Config_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx2.c - - - - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_lib_SAMV71_XULT/wolfcrypt_lib.ewt 1970-01-01 00:00:00.000000000 +0000 @@ -1,2400 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - wolfcrypt_sources - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\aes.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\asn.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\chacha.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\chacha20_poly1305.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\coding.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\des3.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\dh.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\dsa.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\ecc.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\hash.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\kdf.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\hmac.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\md4.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\md5.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\memory.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\misc.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\poly1305.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\pwdbased.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\random.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\rsa.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\sha.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\sha256.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\sha512.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\tfm.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\wc_encrypt.c - - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\src\wc_port.c - - - - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/settings/wolfcrypt_test_Debug.jlink 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -[BREAKPOINTS] -ForceImpTypeAny = 0 -ShowInfoWin = 1 -EnableFlashBP = 2 -BPDuringExecution = 0 -[CFI] -CFISize = 0x00 -CFIAddr = 0x00 -[CPU] -MonModeVTableAddr = 0xFFFFFFFF -MonModeDebug = 0 -MaxNumAPs = 0 -LowPowerHandlingMode = 0 -OverrideMemMap = 0 -AllowSimulation = 1 -ScriptFile="" -[FLASH] -CacheExcludeSize = 0x00 -CacheExcludeAddr = 0x00 -MinNumBytesFlashDL = 0 -SkipProgOnCRCMatch = 1 -VerifyDownload = 1 -AllowCaching = 1 -EnableFlashDL = 2 -Override = 1 -Device="ATSAMV71Q21" -[GENERAL] -WorkRAMSize = 0x00 -WorkRAMAddr = 0x00 -RAMUsageLimit = 0x00 -[SWO] -SWOLogFile="" -[MEM] -RdOverrideOrMask = 0x00 -RdOverrideAndMask = 0xFFFFFFFF -RdOverrideAddr = 0xFFFFFFFF -WrOverrideOrMask = 0x00 -WrOverrideAndMask = 0xFFFFFFFF -WrOverrideAddr = 0xFFFFFFFF diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-EWARM/embOS/SAMV71_XULT/embOS_wolfcrypt_test_SAMV71_XULT/wolfcrypt_test.ewt 1970-01-01 00:00:00.000000000 +0000 @@ -1,2382 +0,0 @@ - - - - 2 - - Debug - - ARM - - 1 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - Release - - ARM - - 0 - - C-STAT - 259 - - 259 - - 0 - - 1 - 600 - 0 - 2 - 0 - 1 - 100 - - - 1.3.2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RuntimeChecking - 0 - - 2 - 1 - 0 - - - - - - - - - - - - - - - - - - - - - - Application - - $PROJ_DIR$\Application\runWolfcryptTests.c - - - - Device_Support - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\startup_sam.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\DeviceSupport\system_sam.c - - - - Setup - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\BSP.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\HardFaultHandler.S - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\JLINKMEM_Process.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\OS_Error.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\RTOSInit_SAMV71_CMSIS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_HardFaultHandler.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_RTT_printf.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_Config_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\SEGGER_SYSVIEW_embOS.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx.c - - - $PROJ_DIR$\..\..\extract_trial_here\Start\BoardSupport\Atmel\SAMV71_XPlainedUltra\Setup\xmtx2.c - - - - wolfcrypt_test - - $PROJ_DIR$\..\..\..\..\..\wolfcrypt\test\test.c - - - - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-MSP430/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-MSP430/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-MSP430/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-MSP430/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -78,10 +78,10 @@ Successfully generated a common secret Alices' Secret: 85f3c7f599620c768e6dbb77dc2f8f764254cc1821aeb0a30503632dbc9bdb54 Bobs' Secret: 85f3c7f599620c768e6dbb77dc2f8f764254cc1821aeb0a30503632dbc9bdb54 -ChaCha20/Poly1305 Encryption Start, 1000 itterations, 1024 bytes +ChaCha20/Poly1305 Encryption Start, 1000 iterations, 1024 bytes ............................................ End 44 seconds -ChaCha20/Poly1305 Decryption Start, 1000 itterations +ChaCha20/Poly1305 Decryption Start, 1000 iterations ............................................ End 44 seconds end diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-MSP430/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-MSP430/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/IAR-MSP430/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/IAR-MSP430/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -36,7 +36,7 @@ #include /* Without __root on some of the functions, IAR's "Discard Unused Publics" - will optimze out some of the functions + will optimize out some of the functions */ #if defined(__IAR_SYSTEMS_ICC__) #define IAR_KEEP __root @@ -304,7 +304,7 @@ wc_FreeRng(&rng); printf( - "ChaCha20/Poly1305 Encryption Start, 1000 itterations, %d bytes\r\n", + "ChaCha20/Poly1305 Encryption Start, 1000 iterations, %d bytes\r\n", (int)strlen((const char*)plaintext)); start = seconds; for (int i=0; i <= 1000; i++) { @@ -319,7 +319,7 @@ printf("\r\nEnd %d seconds\r\n", seconds - start); start = seconds; - printf("ChaCha20/Poly1305 Decryption Start, 1000 itterations\r\n"); + printf("ChaCha20/Poly1305 Decryption Start, 1000 iterations\r\n"); start = seconds; for (int i=0; i <= 1000; i++) { ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Infineon/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Infineon/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +# Infineon Modus Toolbox + +Steps for building wolfSSL/wolfTPM with the Infineon Modus Toolbox examples: + +1) Add Dependency: + +In "deps" folder add wolfssl.mtb containing: + +``` +https://github.com/wolfssl/wolfssl#v5.7.0-stable#$$ASSET_REPO$$/wolfssl/wolfssl-stable +``` + +For wolfTPM add wolftpm.mtb containing: + +``` +https://github.com/wolfssl/wolftpm#master#$$ASSET_REPO$$/wolftpm/wolftpm-stable +``` + +2) Add components: +In `Makefile` under `COMPONENTS` add `WOLFSSL` and `WOLFTPM`. + +3) Add defines: + +Add `DEFINES+=WOLFSSL_USER_SETTINGS WOLFTPM_USER_SETTINGS` in Makefile. + +4) Build settings: + +Add a `user_settings.h` file for wolfSSL/wolfTPM build settings into `config` directory. +A template is provided here in `IDE/Infineon/user_settings.h`. + +5) Ignores: + +The required library ignores are found in the `.cyignore` file in the wolfSSL and wolfTPM root. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Infineon/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Infineon/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,7 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST += \ + IDE/Infineon/README.md \ + IDE/Infineon/user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Infineon/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Infineon/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Infineon/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,168 @@ +/* user_settings.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Example build settings for Infineon Modus Toolbox */ +/* Enables wolfSSL TLS v1.2-v1.3 and TPM support */ +/* SHA-1, SHA-2, AES CBC/GCM, ECDHE, ECDSA, RSA, HMAC, HKDF */ + +#ifndef WOLF_USER_SETTINGS_TPM_H +#define WOLF_USER_SETTINGS_TPM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Platform / Porting */ +#define NO_FILESYSTEM /* File system disable */ +#define SINGLE_THREADED /* No threading */ +#define WOLFSSL_USER_IO /* user recv/send callbacks for network IO */ +#define NO_WRITEV +#define NO_MAIN_DRIVER +#define WOLFSSL_IGNORE_FILE_WARN /* ignore file include warnings */ +#define WOLFSSL_SMALL_STACK /* limit stack usage */ +#define BENCH_EMBEDDED + +/* TLS (allow TLS v1.3 or v1.2) */ +#define WOLFSSL_TLS13 +//#define WOLFSSL_NO_TLS12 +#define NO_OLD_TLS +#define WOLFSSL_EITHER_SIDE /* allow context to be created for either server or client */ + +#define HAVE_TLS_EXTENSIONS +#define HAVE_SUPPORTED_CURVES +#define HAVE_SERVER_RENEGOTIATION_INFO +#define HAVE_ENCRYPT_THEN_MAC + +#ifdef WOLFSSL_TLS13 + #define HAVE_HKDF + #define WC_RSA_PSS + #define WOLFSSL_PSS_LONG_SALT +#endif + +/* Enable crypto callbacks - for TPM offloading */ +#define WOLF_CRYPTO_CB + +/* Enable SP math all (sp_int.c) with multi-precision support */ +#define WOLFSSL_SP_MATH_ALL + +#if 1 + /* Single Precision math for ECC 256 and RSA 2048 */ + #define WOLFSSL_HAVE_SP_RSA + #define WOLFSSL_HAVE_SP_ECC + #define WOLFSSL_SP_SMALL +#endif + +#if 0 + /* only single precision math */ + #define WOLFSSL_SP_MATH +#endif + +/* Enable hardening (timing resistance) */ +#define TFM_TIMING_RESISTANT +#define ECC_TIMING_RESISTANT +#define WC_RSA_BLINDING + +/* Enable PRNG (SHA2-256) */ +#define HAVE_HASHDRBG + +/* Asymmetric */ +#if 1 /* RSA - needed to encrypt salt */ + #undef NO_RSA + #ifdef USE_LOW_RESOURCE + #define WOLFSSL_RSA_PUBLIC_ONLY + #define WOLFSSL_RSA_VERIFY_INLINE + #define NO_CHECK_PRIVATE_KEY + #endif +#else + #define NO_RSA +#endif + +#if 1 /* ECC - needed for encrypt ECC salt */ + #define HAVE_ECC + #define ECC_USER_CURVES /* default to only SECP256R1 */ +#endif + +#if 0 /* DH - TPM doesn't support it */ + #undef NO_DH + #define HAVE_FFDHE_2048 + #define HAVE_DH_DEFAULT_PARAMS +#else + #define NO_DH +#endif + +/* Symmetric Hash */ +#undef NO_SHA /* allow SHA-1 */ +#undef NO_SHA256 /* allow SHA2-256 */ +#define WOLFSSL_SHA384 +#define WOLFSSL_SHA512 + +/* Symmetric Cipher */ +#define WOLFSSL_AES_CFB +#define HAVE_AES_DECRYPT + +#define HAVE_AES_KEYWRAP +#define WOLFSSL_AES_DIRECT +#define HAVE_AESGCM +#define GCM_TABLE_4BIT + +/* Features */ +#define WOLFSSL_ASN_TEMPLATE + +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_EXT + +#define HAVE_PKCS7 +#define HAVE_X963_KDF +#define WOLFSSL_BASE64_ENCODE + +#if 1 + #define HAVE_SESSION_TICKETS + #define SMALL_SESSION_CACHE +#else + #define NO_SESSION_CACHE +#endif + +/* Disables */ +#define NO_PKCS8 +#define NO_PKCS12 +#define NO_PWDBASED +#define NO_DSA +#define NO_DES3 +#define NO_RC4 +#define NO_PSK +#define NO_MD4 +#define NO_MD5 +#define WOLFSSL_NO_SHAKE128 +#define WOLFSSL_NO_SHAKE256 + +/* Logging */ +#ifdef ENABLE_SECURE_SOCKETS_LOGS + #define DEBUG_WOLFSSL +#else + #define NO_ERROR_STRINGS +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* WOLF_USER_SETTINGS_TPM_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/LINUX-SGX/sgx_t_static.mk 2024-08-03 07:30:00.000000000 +0000 @@ -88,6 +88,7 @@ $(WOLFSSL_ROOT)/wolfcrypt/src/signature.c\ $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c32.c\ $(WOLFSSL_ROOT)/wolfcrypt/src/sp_c64.c\ + $(WOLFSSL_ROOT)/wolfcrypt/src/sp_int.c\ $(WOLFSSL_ROOT)/src/ssl.c\ $(WOLFSSL_ROOT)/src/tls.c\ $(WOLFSSL_ROOT)/wolfcrypt/src/wc_encrypt.c\ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/M68K/Makefile mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/M68K/Makefile --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/M68K/Makefile 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/M68K/Makefile 2024-08-03 07:30:00.000000000 +0000 @@ -84,7 +84,7 @@ rm -f $(OUTPUT)/$(NAME).a help: - @echo "all : exectue compile, link, rmo" + @echo "all : execute compile, link, rmo" @echo "compile : create .o files" @echo "link : create .a library from .o files" @echo "rmo : remove all .o files" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_c.patch mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_c.patch --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_c.patch 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_c.patch 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ ---- fsl_caam-orig.c 2022-10-21 15:50:35.709951000 -0700 -+++ fsl_caam.c 2022-12-28 06:30:34.788316189 -0800 -@@ -7872,3 +7872,462 @@ +--- fsl_caam.c 2023-01-12 23:39:04.000000000 -0800 ++++ fsl_caam-expanded.c 2023-06-23 00:18:14.395128903 -0700 +@@ -7872,3 +7872,476 @@ } return status; } @@ -117,7 +117,7 @@ + /* initialize descriptor from template */ + (void)caam_memcpy(descriptor, templateKeyPairECC, sizeof(templateKeyPairECC)); + -+ /* add descriptor lenght in bytes to HEADER descriptor command */ ++ /* add descriptor length in bytes to HEADER descriptor command */ + DESC_HEADER_ADD_DESCLEN(descriptor[0], descriptorSize); + + DESC_SET_ADDR(descriptor[1], (CAAM_ECDSA_KEYGEN_PD | keyType)); @@ -128,7 +128,9 @@ + descriptor[4] |= enc; + + /* schedule the job */ -+ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ do { ++ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ } while (status == kStatus_CAAM_Again); + if (status == kStatus_Success) { + status = CAAM_Wait(base, handle, descriptor, kCAAM_Blocking); + } @@ -198,7 +200,7 @@ + /* initialize descriptor from template */ + (void)caam_memcpy(descriptor, templateSignECC, sizeof(templateSignECC)); + -+ /* add descriptor lenght in bytes to HEADER descriptor command */ ++ /* add descriptor length in bytes to HEADER descriptor command */ + DESC_HEADER_ADD_DESCLEN(descriptor[0], descriptorSize); + + DESC_SET_ADDR(descriptor[1], (CAAM_ECDSA_PD | keyType)); @@ -212,7 +214,9 @@ + descriptor[7] |= enc; + + /* schedule the job */ -+ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ do { ++ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ } while (status == kStatus_CAAM_Again); + if (status == kStatus_Success) { + status = CAAM_Wait(base, handle, descriptor, kCAAM_Blocking); + } @@ -271,7 +275,7 @@ + /* initialize descriptor from template */ + (void)caam_memcpy(descriptor, templateVerifyECC, sizeof(templateVerifyECC)); + -+ /* add descriptor lenght in bytes to HEADER descriptor command */ ++ /* add descriptor length in bytes to HEADER descriptor command */ + DESC_HEADER_ADD_DESCLEN(descriptor[0], descriptorSize); + + DESC_SET_ADDR(descriptor[1], (CAAM_ECDSA_PD | keyType)); @@ -283,7 +287,9 @@ + DESC_ADD_LEN(descriptor[7], sizeHash); + + /* schedule the job */ -+ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ do { ++ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ } while (status == kStatus_CAAM_Again); + if (status == kStatus_Success) { + status = CAAM_Wait(base, handle, descriptor, kCAAM_Blocking); + } @@ -338,7 +344,7 @@ + /* initialize descriptor from template */ + (void)caam_memcpy(descriptor, templateAgreeECC, sizeof(templateAgreeECC)); + -+ /* add descriptor lenght in bytes to HEADER descriptor command */ ++ /* add descriptor length in bytes to HEADER descriptor command */ + DESC_HEADER_ADD_DESCLEN(descriptor[0], descriptorSize); + + DESC_SET_ADDR(descriptor[1], (CAAM_ECDSA_KEYGEN_PD | keyType)); @@ -350,7 +356,9 @@ + descriptor[5] |= enc; + + /* schedule the job */ -+ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ do { ++ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ } while (status == kStatus_CAAM_Again); + if (status == kStatus_Success) { + status = CAAM_Wait(base, handle, descriptor, kCAAM_Blocking); + } @@ -367,7 +375,7 @@ +/* Handle BLOB create and open */ +static const uint32_t templateBlob[] = { + /* 00 */ 0xB0800000u, /* HEADER */ -+ /* 01 */ 0x14400000u, /* class */ ++ /* 01 */ 0x04000000u, /* class */ + /* 02 */ 0x00000000u, /* key mod */ + /* 03 */ 0xF0000000u, /* SEQ input size */ + /* 04 */ 0x00000000u, /* input */ @@ -425,6 +433,10 @@ + return status; + } + ++ if (keyModSz != CAAM_SM_KEYMODSZ && keyModSz != CAAM_KEYMODSZ) { ++ return status; ++ } ++ + if (dir == CAAM_DECAP_BLOB && + (sizeOut > sizeIn - CAAM_PADDING_SIZE_BLOB)) { + return status; @@ -433,9 +445,9 @@ + /* initialize descriptor from template */ + (void)caam_memcpy(descriptor, templateBlob, sizeof(templateBlob)); + -+ /* add descriptor lenght in bytes to HEADER descriptor command */ ++ /* add descriptor length in bytes to HEADER descriptor command */ + DESC_HEADER_ADD_DESCLEN(descriptor[0], descriptorSize); -+ descriptor[1] |= color; /* add color of blob */ ++ descriptor[1] |= keyModSz; + DESC_SET_ADDR(descriptor[2], keyMod); + DESC_ADD_LEN(descriptor[3], sizeIn); + DESC_SET_ADDR(descriptor[4], in); @@ -450,7 +462,9 @@ + } + + /* schedule the job */ -+ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ do { ++ status = caam_in_job_ring_add(base, handle->jobRing, &descriptor[0]); ++ } while (status == kStatus_CAAM_Again); + if (status == kStatus_Success) { + status = CAAM_Wait(base, handle, descriptor, kCAAM_Blocking); + } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_h.patch mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_h.patch --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_h.patch 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/RT1170/fsl_caam_h.patch 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ ---- fsl_caam-orig.h 2022-10-21 15:50:35.745560000 -0700 -+++ fsl_caam.h 2022-12-28 08:10:29.413415216 -0800 -@@ -3038,6 +3038,162 @@ +--- fsl_caam.h 2023-06-23 00:08:46.491699533 -0700 ++++ fsl_caam-expanded.h 2023-06-23 00:10:22.702730462 -0700 +@@ -3038,6 +3038,164 @@ *@} */ /* end of caam_driver_pkha */ @@ -127,10 +127,12 @@ + +/* define for application to check for ECC CAAM additions */ +#define CAAM_BLOB_EXPANSION -+#define CAAM_RED_BLOB 0x00000C08 -+#define CAAM_BLACK_BLOB 0x00000010 ++#define CAAM_RED_BLOB 1 ++#define CAAM_BLACK_BLOB 2 +#define CAAM_ENCAP_BLOB 0x07000000 +#define CAAM_DECAP_BLOB 0x06000000 ++#define CAAM_SM_KEYMODSZ 8 ++#define CAAM_KEYMODSZ 16 +#define CAAM_PADDING_SIZE_BLOB 48 + +/*! diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/benchmark/source/run_benchmark.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/benchmark/source/run_benchmark.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/benchmark/source/run_benchmark.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/benchmark/source/run_benchmark.c 2024-08-03 07:30:00.000000000 +0000 @@ -78,7 +78,7 @@ wolfCrypt_Cleanup(); } else { - PRINTF("Failied to initialize wolfCrypt\r\n"); + PRINTF("Failed to initialize wolfCrypt\r\n"); } } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/wolfcrypt_test.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/wolfcrypt_test.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/wolfcrypt_test.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MCUEXPRESSO/wolfcrypt_test.c 2024-08-03 07:30:00.000000000 +0000 @@ -136,7 +136,7 @@ wolfCrypt_Cleanup(); } else { - PRINTF("Failied to initialize wolfCrypt\r\n"); + PRINTF("Failed to initialize wolfCrypt\r\n"); } #if defined(FREESCALE_KSDK_2_0_TRNG) && defined(FREESCALE_RTC) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/LPC43xx/time-LCP43xx.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/LPC43xx/time-LCP43xx.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/LPC43xx/time-LCP43xx.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/LPC43xx/time-LCP43xx.c 2024-08-03 07:30:00.000000000 +0000 @@ -34,9 +34,9 @@ static void init_RTC() { - /* Enable GPIO register interface clock */ - LPC_CCU1->CLK_M4_GPIO_CFG |= 1; - while (!(LPC_CCU1->CLK_M4_GPIO_STAT & 1)) ; + /* Enable GPIO register interface clock */ + LPC_CCU1->CLK_M4_GPIO_CFG |= 1; + while (!(LPC_CCU1->CLK_M4_GPIO_STAT & 1)) ; /* RTC Block section ------------------------------------------------------ */ /* Init RTC module */ @@ -82,7 +82,7 @@ void init_time(void) { - init_RTC() ; + init_RTC() ; init_TIM() ; } @@ -93,7 +93,7 @@ static struct tm date ; RTC_TIME_Type RTCFullTime; - RTC_GetFullTime (LPC_RTC, &RTCFullTime); + RTC_GetFullTime (LPC_RTC, &RTCFullTime); date.tm_year = RTCFullTime.YEAR + 100 ; date.tm_mon = RTCFullTime.MONTH - 1 ; @@ -104,7 +104,7 @@ #if defined(DEBUG_CYASSL) { - extern void CYASSL_MSG(char *msg) ; + extern void CYASSL_MSG(char *msg) ; char msg[100] ; sprintf(msg, "Debug::Cyassl_KEIL_gmtime(DATE=/%4d/%02d/%02d TIME=%02d:%02d:%02d)\n", RTCFullTime.YEAR+2000, RTCFullTime.MONTH, RTCFullTime.DOM, @@ -127,14 +127,14 @@ void time_main(void *args) { char * datetime ; - int year ; + int year ; RTC_TIME_Type RTCFullTime; if( args == NULL || ((func_args *)args)->argc == 1) { - RTC_GetFullTime (LPC_RTC, &RTCFullTime); + RTC_GetFullTime (LPC_RTC, &RTCFullTime); printf("Date: %d/%d/%d, Time: %02d:%02d:%02d\n", - RTCFullTime.MONTH, RTCFullTime.DOM, RTCFullTime.YEAR+2000, - RTCFullTime.HOUR, RTCFullTime.MIN, RTCFullTime.SEC) ; + RTCFullTime.MONTH, RTCFullTime.DOM, RTCFullTime.YEAR+2000, + RTCFullTime.HOUR, RTCFullTime.MIN, RTCFullTime.SEC) ; } else if(((func_args *)args)->argc == 3 && ((func_args *)args)->argv[1][0] == '-' && ((func_args *)args)->argv[1][1] == 'd' ) { @@ -143,13 +143,13 @@ sscanf(datetime, "%d/%d/%d", (int *)&RTCFullTime.MONTH, (int *)&RTCFullTime.DOM, &year) ; RTCFullTime.YEAR = year - 2000 ; - RTC_SetTime (LPC_RTC, RTC_TIMETYPE_MONTH, RTCFullTime.MONTH); + RTC_SetTime (LPC_RTC, RTC_TIMETYPE_MONTH, RTCFullTime.MONTH); RTC_SetTime (LPC_RTC, RTC_TIMETYPE_YEAR, RTCFullTime.YEAR); RTC_SetTime (LPC_RTC, RTC_TIMETYPE_DAYOFMONTH, RTCFullTime.DOM); } else if(((func_args *)args)->argc == 3 && ((func_args *)args)->argv[1][0] == '-' && ((func_args *)args)->argv[1][1] == 't' ) { - RTC_GetFullTime (LPC_RTC, &RTCFullTime); + RTC_GetFullTime (LPC_RTC, &RTCFullTime); datetime = ((func_args *)args)->argv[2]; sscanf(datetime, "%d:%d:%d", (int *)&RTCFullTime.HOUR, @@ -161,7 +161,3 @@ RTC_SetTime (LPC_RTC, RTC_TIMETYPE_HOUR, RTCFullTime.HOUR); } else printf("Invalid argument\n") ; } - - - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-BARE-METAL.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-BARE-METAL.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-BARE-METAL.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-BARE-METAL.h 2024-08-03 07:30:00.000000000 +0000 @@ -165,7 +165,7 @@ #endif // // DSA -#define MDK_CONF_DSA 1 +#define MDK_CONF_DSA 0 #if MDK_CONF_DSA == 0 #define NO_DSA #endif @@ -204,6 +204,59 @@ // // +// Math / Memory +// Math Library +// <0=>SP Math All (sp_int.c) +// <1=>Fast Math (tfm.c) +// <2=>Heap Math (integer.c) +// <3=>SP Math (RSA/DH 2048/3072/4096 and ECC 256/384/521 only) +// <4=>SP Math +ASM (faster) +#define MDK_CONF_MATH 0 +#if MDK_CONF_MATH == 0 + #define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */ +#elif MDK_CONF_MATH == 1 + #define USE_FAST_MATH +#elif MDK_CONF_MATH == 2 + #define USE_INTEGER_HEAP_MATH +#elif MDK_CONF_MATH == 3 || MDK_CONF_MATH == 4 + #define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */ + #define WOLFSSL_HAVE_SP_RSA + #define WOLFSSL_HAVE_SP_DH + #define WOLFSSL_HAVE_SP_ECC + + //#define WOLFSSL_SP_NO_2048 + //#define WOLFSSL_SP_NO_3072 + #define WOLFSSL_SP_4096 + //#define WOLFSSL_SP_NO_256 + //#define WOLFSSL_SP_384 + //#define WOLFSSL_SP_521 + + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + //#define WOLFSSL_SP_NO_MALLOC /* do not use heap */ + //#define WOLFSSL_SP_DIV_32 /* do not use 64-bit divides */ + + #if MDK_CONF_MATH == 4 + /* SP Assembly Speedups - specific to chip type */ + #define WOLFSSL_SP_ASM + + //#define WOLFSSL_SP_ARM32_ASM + //#define WOLFSSL_SP_ARM64_ASM + //#define WOLFSSL_SP_ARM_THUMB_ASM + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM + #endif +#endif + +// Small Stack +#define MDK_CONF_SmallStack 1 +#if MDK_CONF_SmallStack == 0 + #define NO_WOLFSSL_SMALL_STACK + //#define WOLFSSL_SP_NO_MALLOC +#else + #define WOLFSSL_SMALL_STACK +#endif +// +// + // Others // Inline @@ -253,22 +306,9 @@ #define NO_ERROR_STRINGS #endif // - -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// -// Use Fast Math -#define MDK_CONF_FASTMATH 0 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#endif -// +// -// // // <<< end of configuration section >>> diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-FS.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-FS.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-FS.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-FS.h 2024-08-03 07:30:00.000000000 +0000 @@ -202,7 +202,7 @@ #endif // // DSA -#define MDK_CONF_DSA 1 +#define MDK_CONF_DSA 0 #if MDK_CONF_DSA == 0 #define NO_DSA #endif @@ -241,6 +241,59 @@ // // +// Math / Memory +// Math Library +// <0=>SP Math All (sp_int.c) +// <1=>Fast Math (tfm.c) +// <2=>Heap Math (integer.c) +// <3=>SP Math (RSA/DH 2048/3072/4096 and ECC 256/384/521 only) +// <4=>SP Math +ASM (faster) +#define MDK_CONF_MATH 0 +#if MDK_CONF_MATH == 0 + #define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */ +#elif MDK_CONF_MATH == 1 + #define USE_FAST_MATH +#elif MDK_CONF_MATH == 2 + #define USE_INTEGER_HEAP_MATH +#elif MDK_CONF_MATH == 3 || MDK_CONF_MATH == 4 + #define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */ + #define WOLFSSL_HAVE_SP_RSA + #define WOLFSSL_HAVE_SP_DH + #define WOLFSSL_HAVE_SP_ECC + + //#define WOLFSSL_SP_NO_2048 + //#define WOLFSSL_SP_NO_3072 + #define WOLFSSL_SP_4096 + //#define WOLFSSL_SP_NO_256 + //#define WOLFSSL_SP_384 + //#define WOLFSSL_SP_521 + + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + //#define WOLFSSL_SP_NO_MALLOC /* do not use heap */ + //#define WOLFSSL_SP_DIV_32 /* do not use 64-bit divides */ + + #if MDK_CONF_MATH == 4 + /* SP Assembly Speedups - specific to chip type */ + #define WOLFSSL_SP_ASM + + //#define WOLFSSL_SP_ARM32_ASM + //#define WOLFSSL_SP_ARM64_ASM + //#define WOLFSSL_SP_ARM_THUMB_ASM + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM + #endif +#endif + +// Small Stack +#define MDK_CONF_SmallStack 1 +#if MDK_CONF_SmallStack == 0 + #define NO_WOLFSSL_SMALL_STACK + //#define WOLFSSL_SP_NO_MALLOC +#else + #define WOLFSSL_SMALL_STACK +#endif +// +// + // Others // Inline @@ -291,20 +344,6 @@ #endif // -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// -// Use Fast Math -#define MDK_CONF_FASTMATH 0 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#endif -// - - // // diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-RTX-TCP-FS.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-RTX-TCP-FS.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-RTX-TCP-FS.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/config-RTX-TCP-FS.h 2024-08-03 07:30:00.000000000 +0000 @@ -224,7 +224,7 @@ #endif // // DSA -#define MDK_CONF_DSA 1 +#define MDK_CONF_DSA 0 #if MDK_CONF_DSA == 0 #define NO_DSA #endif @@ -263,6 +263,59 @@ // // +// Math / Memory +// Math Library +// <0=>SP Math All (sp_int.c) +// <1=>Fast Math (tfm.c) +// <2=>Heap Math (integer.c) +// <3=>SP Math (RSA/DH 2048/3072/4096 and ECC 256/384/521 only) +// <4=>SP Math +ASM (faster) +#define MDK_CONF_MATH 0 +#if MDK_CONF_MATH == 0 + #define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */ +#elif MDK_CONF_MATH == 1 + #define USE_FAST_MATH +#elif MDK_CONF_MATH == 2 + #define USE_INTEGER_HEAP_MATH +#elif MDK_CONF_MATH == 3 || MDK_CONF_MATH == 4 + #define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */ + #define WOLFSSL_HAVE_SP_RSA + #define WOLFSSL_HAVE_SP_DH + #define WOLFSSL_HAVE_SP_ECC + + //#define WOLFSSL_SP_NO_2048 + //#define WOLFSSL_SP_NO_3072 + #define WOLFSSL_SP_4096 + //#define WOLFSSL_SP_NO_256 + //#define WOLFSSL_SP_384 + //#define WOLFSSL_SP_521 + + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + //#define WOLFSSL_SP_NO_MALLOC /* do not use heap */ + //#define WOLFSSL_SP_DIV_32 /* do not use 64-bit divides */ + + #if MDK_CONF_MATH == 4 + /* SP Assembly Speedups - specific to chip type */ + #define WOLFSSL_SP_ASM + + //#define WOLFSSL_SP_ARM32_ASM + //#define WOLFSSL_SP_ARM64_ASM + //#define WOLFSSL_SP_ARM_THUMB_ASM + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM + #endif +#endif + +// Small Stack +#define MDK_CONF_SmallStack 1 +#if MDK_CONF_SmallStack == 0 + #define NO_WOLFSSL_SMALL_STACK + //#define WOLFSSL_SP_NO_MALLOC +#else + #define WOLFSSL_SMALL_STACK +#endif +// +// + // Others // Inline @@ -312,22 +365,6 @@ #define NO_ERROR_STRINGS #endif // - -// Small Stack -#define MDK_CONF_SMALL_STACK 1 -#if MDK_CONF_SMALL_STACK == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// - - // // diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -99,7 +99,7 @@ extern void SER_Init(void) ; /*----------------------------------------------------------------------------- - * mian entry + * main entry *----------------------------------------------------------------------------*/ /*** This is the parent task entry ***/ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/shell.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/shell.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/shell.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK-ARM/MDK-ARM/wolfSSL/shell.c 2024-08-03 07:30:00.000000000 +0000 @@ -301,7 +301,7 @@ "", NULL } ; -enum jobtype { FORGROUND, BACKGROUND } ; +enum jobtype { FOREGROUND, BACKGROUND } ; #define IF_DELIMITER(ch) ((ch) == ' ' || (ch) == '\n') @@ -326,7 +326,7 @@ (*bf_flg) = BACKGROUND ; line[strlen(line)-2] = '\n' ; } else { - (*bf_flg) = FORGROUND ; + (*bf_flg) = FOREGROUND ; } args->argc = 0 ; for(i=0; i>> @@ -99,7 +98,7 @@ // File System -#define MDK_CONF_FILESYSTEM 1 +#define MDK_CONF_FILESYSTEM 0 #if MDK_CONF_FILESYSTEM == 0 #define NO_FILESYSTEM #else @@ -109,7 +108,9 @@ // // Network<0=>None <1=>RLnet <2=>User I/O +#ifndef MDK_CONF_NETWORK #define MDK_CONF_NETWORK 1 +#endif #if MDK_CONF_NETWORK == 0 #elif MDK_CONF_NETWORK == 1 #define WOLFSSL_KEIL_TCP_NET @@ -150,7 +151,7 @@ // wolfCrypt Configuration -// Hash/Crypt Algrithm +// Hash/Crypt Algorithm // MD2 #define MDK_CONF_MD2 0 @@ -201,7 +202,7 @@ #endif // // RIPEMD -#define MDK_CONF_RIPEMD 1 +#define MDK_CONF_RIPEMD 0 #if MDK_CONF_RIPEMD == 1 #define WOLFSSL_RIPEMD #endif @@ -275,7 +276,7 @@ // // CAMELLIA -#define MDK_CONF_CAMELLIA 1 +#define MDK_CONF_CAMELLIA 0 #if MDK_CONF_CAMELLIA == 1 #define HAVE_CAMELLIA #endif @@ -287,8 +288,19 @@ #define NO_DH #endif // + +// RSA +#define MDK_CONF_RSA 1 +#if MDK_CONF_RSA == 1 +/* #define RSA_LOW_MEM */ +#else +#define NO_RSA +#endif +// + + // DSA -#define MDK_CONF_DSA 1 +#define MDK_CONF_DSA 0 #if MDK_CONF_DSA == 0 #define NO_DSA #endif @@ -297,7 +309,7 @@ // SRP #define MDK_CONF_SRP 1 #if MDK_CONF_SRP == 1 -#define HAVE_SRP +#define WOLFCRYPT_HAVE_SRP #endif // @@ -412,7 +424,7 @@ // // -// Cert/Key Strage +// Cert/Key Storage // Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) #define MDK_CONF_CERT_BUFF 0 #if MDK_CONF_CERT_BUFF== 1 @@ -432,25 +444,63 @@ #define MDK_CONF_KEY_GEN 0 #if MDK_CONF_KEY_GEN == 1 #define WOLFSSL_KEY_GEN +#define WOLFSSL_OLD_PRIME_CHECK /* use older prime check (faster) */ #endif // // -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT + +// Math / Memory +// Math Library +// <0=>SP Math All (sp_int.c) +// <1=>Fast Math (tfm.c) +// <2=>Heap Math (integer.c) +// <3=>SP Math (RSA/DH 2048/3072/4096 and ECC 256/384/521 only) +// <4=>SP Math +ASM (faster) +#define MDK_CONF_MATH 0 +#if MDK_CONF_MATH == 0 + #define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */ +#elif MDK_CONF_MATH == 1 + #define USE_FAST_MATH +#elif MDK_CONF_MATH == 2 + #define USE_INTEGER_HEAP_MATH +#elif MDK_CONF_MATH == 3 || MDK_CONF_MATH == 4 + #define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */ + #define WOLFSSL_HAVE_SP_RSA + #define WOLFSSL_HAVE_SP_DH + #define WOLFSSL_HAVE_SP_ECC + + //#define WOLFSSL_SP_NO_2048 + //#define WOLFSSL_SP_NO_3072 + #define WOLFSSL_SP_4096 + //#define WOLFSSL_SP_NO_256 + //#define WOLFSSL_SP_384 + //#define WOLFSSL_SP_521 + + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + //#define WOLFSSL_SP_NO_MALLOC /* do not use heap */ + //#define WOLFSSL_SP_DIV_32 /* do not use 64-bit divides */ + + #if MDK_CONF_MATH == 4 + /* SP Assembly Speedups - specific to chip type */ + #define WOLFSSL_SP_ASM + + //#define WOLFSSL_SP_ARM32_ASM + //#define WOLFSSL_SP_ARM64_ASM + //#define WOLFSSL_SP_ARM_THUMB_ASM + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM + #endif #endif -// + // Small Stack #define MDK_CONF_SmallStack 1 #if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK + #define NO_WOLFSSL_SMALL_STACK +#else + #define WOLFSSL_SMALL_STACK #endif -// - +// +// // - /**** wolfSSL Configuration ****/ @@ -465,6 +515,7 @@ #define WC_RSA_PSS #define HAVE_HKDF #define HAVE_FFDHE_2048 +//#define HAVE_FFDHE_3072 #endif // diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Inc/wolfssl_MDK_ARM.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Inc/wolfssl_MDK_ARM.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Inc/wolfssl_MDK_ARM.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Inc/wolfssl_MDK_ARM.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,4 @@ -/* wolfssl_KEIL_ARM.h +/* wolfssl_MDK_ARM.h * * Copyright (C) 2006-2023 wolfSSL Inc. * @@ -70,7 +70,7 @@ #define tcp_listen wolfssl_tcp_listen #define connect(a,b,c) connect(a, (SOCKADDR *)(b), c) #define SOCKADDR struct sockaddr - + /** KEIL-RL TCPnet ****/ /* TCPnet BSD socket does not have following functions. */ extern char *inet_ntoa(struct in_addr in); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvoptx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvoptx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvoptx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvoptx 2024-08-03 07:30:00.000000000 +0000 @@ -233,7 +233,7 @@ 0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/CryptBenchmark.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -334,7 +334,7 @@ 0 - USE_STM32756G_EVAL USE_IOEXPANDER WOLFSSL_USER_SETTINGS + USE_STM32756G_EVAL USE_IOEXPANDER WOLFSSL_USER_SETTINGS MDK_CONF_NETWORK=0 @@ -383,7 +383,7 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h @@ -791,7 +791,7 @@
- RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/RTE/wolfSSL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/RTE/wolfSSL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/RTE/wolfSSL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/RTE/wolfSSL/user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,497 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#define WOLFSSL_MDK5_COMPLv5 -#define NO_MAIN_DRIVER -#define BENCH_EMBEDDED -#define NO_DEV_RANDOM -#define WOLFSSL_USER_CURRTIME -#define SIZEOF_LONG_LONG 8 -#define NO_WRITEV -#define NO_DEV_RANDOM - -#define TFM_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#define WC_RSA_BLINDING - -#define WOLFSSL_USER_CURRTIME /* for benchmark */ -#define WOLFSSL_CURRTIME_OSTICK /* use OS tich for current_time */ -#define WOLFSSL_GMTIME -#define NO_MULTIBYTE_PRINT - -// <<< Use Configuration Wizard in Context Menu >>> - -// Common options -// MPU<0=>Undefined<1=>STM32F2xx<2=>STM32F4xx<3=>STM32F7xx -#define MDK_CONF_MPU 3 -#if MDK_CONF_MPU == 0 - -#elif MDK_CONF_MPU == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32F2xx -#elif MDK_CONF_MPU == 2 -#define WOLFSSL_STM32_CUBEMX -#define STM32F4xx -#elif MDK_CONF_MPU == 3 -#define WOLFSSL_STM32_CUBEMX -#define STM32F7xx -#endif - -// Thread/RTOS<0=>Single Threaded <1=>FreeRTOS <3=>SafeRTOS<4=>Windows -// <5=>PThread <6=>ThreadX -// <7=>Micrium <8=>EBSnet<9=>MQX -// <10=>T-RTOS <11=>uITRON4<12=>uTKERNEL2 -// <13=>Frosted <14=>CMSIS RTOS<15=>CMSIS RTOSv2<16=>Others -#define MDK_CONF_THREAD 15 -#if MDK_CONF_THREAD== 0 -#define SINGLE_THREADED -#elif MDK_CONF_THREAD == 1 -#define FREERTOS -#elif MDK_CONF_THREAD == 3 -#define WOLFSSL_SAFERTOS -#elif MDK_CONF_THREAD == 4 -#define USE_WINDOWS_API -#elif MDK_CONF_THREAD == 5 -#define WOLFSSL_PTHREADS -#elif MDK_CONF_THREAD == 6 -#define THREADX -#define NETX -#elif MDK_CONF_THREAD == 7 -#define MICRIUM -#elif MDK_CONF_THREAD == 8 -#define EBSNET -#elif MDK_CONF_THREAD == 9 -#define FREESCALE_MQX -#define FREESCALE_KSDK_MQX -#elif MDK_CONF_THREAD == 10 -#define WOLFSSL_TIRTOS -#elif MDK_CONF_THREAD == 11 -#define WOLFSSL_uITRON4 -#elif MDK_CONF_THREAD == 12 -#define WOLFSSL_uTKERNEL2 -#elif MDK_CONF_THREAD == 13 -#define WOLFSSL_FROSTED -#elif MDK_CONF_THREAD == 14 -#define WOLFSSL_CMSIS_RTOS -#elif MDK_CONF_THREAD == 15 -#define WOLFSSL_CMSIS_RTOSv2 -#elif MDK_CONF_THREAD == 16 -#define SINGLE_THREADED -#endif - - -// File System -#define MDK_CONF_FILESYSTEM 1 -#if MDK_CONF_FILESYSTEM == 0 -#define NO_FILESYSTEM -#else -#define WOLFSSL_KEIL_FS -#define NO_WOLFSSL_DIR -#endif -// - -// Network<0=>None <1=>RLnet <2=>User I/O -#define MDK_CONF_NETWORK 0 -#if MDK_CONF_NETWORK == 0 -#elif MDK_CONF_NETWORK == 1 -#define WOLFSSL_KEIL_TCP_NET -#elif MDK_CONF_NETWORK == 2 -#define WOLFSSL_USER_IO -#endif - -// Debug options - -// Debug Message -#define MDK_CONF_DebugMessage 0 -#if MDK_CONF_DebugMessage == 1 -#define DEBUG_WOLFSSL -#endif -// -// Check malloc -#define MDK_CONF_CheckMalloc 1 -#if MDK_CONF_CheckMalloc == 1 -#define WOLFSSL_MALLOC_CHECK -#define USE_WOLFSSL_MEMORY -#endif -// -// ErrNo.h -#define MDK_CONF_ErrNo 1 -#if MDK_CONF_ErrNo == 1 -#define HAVE_ERRNO -#endif -// -// Error Strings -#define MDK_CONF_ErrorStrings 1 -#if MDK_CONF_ErrorStrings == 0 -#define NO_ERROR_STRINGS -#endif -// - -// -// - -// wolfCrypt Configuration - -// Hash/Crypt Algrithm - -// MD2 -#define MDK_CONF_MD2 0 -#if MDK_CONF_MD2 == 1 -#define WOLFSSL_MD2 -#endif -// -// MD4 -#define MDK_CONF_MD4 0 -#if MDK_CONF_MD4 == 0 -#define NO_MD4 -#endif -// -// MD5 -#define MDK_CONF_MD5 1 -#if MDK_CONF_MD5 == 0 -#define NO_MD5 -#endif -// -// SHA -#define MDK_CONF_SHA 1 -#if MDK_CONF_SHA == 0 -#define NO_SHA -#endif -// -// SHA-256 -#define MDK_CONF_SHA256 1 -#if MDK_CONF_SHA256 == 0 -#define NO_SHA256 -#endif -// -// SHA-384 -#define MDK_CONF_SHA384 1 -#if MDK_CONF_SHA384 == 1 -#define WOLFSSL_SHA384 -#endif -// -// SHA-512 -#define MDK_CONF_SHA512 1 -#if MDK_CONF_SHA512 == 1 -#define WOLFSSL_SHA512 -#endif -// -// Hash DRBG -#define MDK_CONF_HASHDRBG 1 -#if MDK_CONF_HASHDRBG == 1 -#define HAVE_HASHDRBG -#endif -// -// RIPEMD -#define MDK_CONF_RIPEMD 1 -#if MDK_CONF_RIPEMD == 1 -#define WOLFSSL_RIPEMD -#endif -// -// BLAKE2 -#define MDK_CONF_BLAKE2 0 -#if MDK_CONF_BLAKE2 == 1 -#define HAVE_BLAKE2 -#endif -// -// HMAC -#define MDK_CONF_HMAC 1 -#if MDK_CONF_HMAC == 0 -#define NO_HMAC -#endif -// -// HMAC KDF -#define MDK_CONF_HKDF 1 -#if MDK_CONF_HKDF == 1 -#define HAVE_HKDF -#endif -// - -// AES CCM -#define MDK_CONF_AESCCM 1 -#if MDK_CONF_AESCCM == 1 -#define HAVE_AESCCM -#endif -// -// AES GCM -#define MDK_CONF_AESGCM 1 -#if MDK_CONF_AESGCM == 1 -#define HAVE_AESGCM -#endif -// - -// RC4 -#define MDK_CONF_RC4 0 -#if MDK_CONF_RC4 == 0 -#define NO_RC4 -#endif -// - -// CHACHA -#define MDK_CONF_CHACHA 1 -#if MDK_CONF_CHACHA == 1 -#define HAVE_CHACHA -#endif -// - -// POLY1305 -#define MDK_CONF_POLY1305 1 -#if MDK_CONF_POLY1305 == 1 -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH -#endif -// - -// DES3 -#define MDK_CONF_DES3 1 -#if MDK_CONF_DES3 == 0 -#define NO_DES3 -#endif -// - -// AES -#define MDK_CONF_AES 1 -#if MDK_CONF_AES == 0 -#define NO_AES -#endif -// - -// CAMELLIA -#define MDK_CONF_CAMELLIA 1 -#if MDK_CONF_CAMELLIA == 1 -#define HAVE_CAMELLIA -#endif -// - -// DH -#define MDK_CONF_DH 1 -#if MDK_CONF_DH == 0 -#define NO_DH -#endif -// -// DSA -#define MDK_CONF_DSA 1 -#if MDK_CONF_DSA == 0 -#define NO_DSA -#endif -// - -// SRP -#define MDK_CONF_SRP 1 -#if MDK_CONF_SRP == 1 -#define HAVE_SRP -#endif -// - -// PWDBASED -#define MDK_CONF_PWDBASED 1 -#if MDK_CONF_PWDBASED == 0 -#define NO_PWDBASED -#endif -// - -// ECC -#define MDK_CONF_ECC 1 -#if MDK_CONF_ECC == 1 -#define HAVE_ECC -#endif -// - -// CURVE25519 -#define MDK_CONF_CURVE25519 1 -#if MDK_CONF_CURVE25519 == 1 -#define HAVE_CURVE25519 -#define CURVED25519_SMALL -#endif -// -// CURVE25519 SMALL -#define MDK_CONF_CURVE25519_SMALL 0 -#if MDK_CONF_CURVE25519_SMALL == 1 -#define CURVED25519_SMALL -#endif -// -// ED25519 -#define MDK_CONF_ED25519 1 -#if MDK_CONF_ED25519 == 1 -#define HAVE_ED25519 -#endif -// -// ED25519 SMALL -#define MDK_CONF_ED25519_SMALL 0 -#if MDK_CONF_ED25519_SMALL == 1 -#define ED25519_SMALL -#endif -// -// PKCS7 -#define MDK_CONF_PKCS7 0 -#if MDK_CONF_PKCS7 == 1 -#define HAVE_PKCS7 -#endif -// -// - -// Random Seed, for TEST Only -#define MDK_CONF_RNDSEED 1 -#if MDK_CONF_RNDSEED == 1 -#define WOLFSSL_GENSEED_FORTEST -#endif -// - -// Hardware Crypt (See document for usage) -// Hardware RNG -#define MDK_CONF_STM32F2_RNG 0 -#if MDK_CONF_STM32F2_RNG == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_RNG -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Crypt -#define MDK_CONF_STM32F2_CRYPTO 0 -#if MDK_CONF_STM32F2_CRYPTO == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_CRYPTO -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Hash -#define MDK_CONF_STM32F2_HASH 0 -#if MDK_CONF_STM32F2_HASH == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_HASH -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// - -// Cert/Key Strage -// Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) -#define MDK_CONF_CERT_BUFF 0 -#if MDK_CONF_CERT_BUFF== 1 -#define USE_CERT_BUFFERS_1024 -#elif MDK_CONF_CERT_BUFF == 2 -#define USE_CERT_BUFFERS_2048 -#endif -// -// Cert/Key Generation -// CertGen -#define MDK_CONF_CERT_GEN 0 -#if MDK_CONF_CERT_GEN == 1 -#define WOLFSSL_CERT_GEN -#endif -// -// KeyGen -#define MDK_CONF_KEY_GEN 0 -#if MDK_CONF_KEY_GEN == 1 -#define WOLFSSL_KEY_GEN -#endif -// -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// - -// - - -/**** wolfSSL Configuration ****/ - -// wolfSSL Configuration - -// TLS 1.3 -#define MDK_CONF_TLS 1 -#if MDK_CONF_TLS == 1 -#define WOLFSSL_TLS13 -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define WC_RSA_PSS -#define HAVE_HKDF -#define HAVE_FFDHE_2048 -#endif -// - -// Include Old TLS -#define MDK_CONF_NO_OLDTLS 0 -#if MDK_CONF_NO_OLDTLS == 0 -#define NO_OLD_TLS -#endif -// -// CRL -#define MDK_CONF_CRL 0 -#if MDK_CONF_CRL == 1 -#define HAVE_CRL -#define WOLFSSL_DER_LOAD -#endif -// -// OCSP -#define MDK_CONF_OCSP 0 -#if MDK_CONF_OCSP == 1 -#define HAVE_OCSP -#endif -// -// OpenSSL Extra -#define MDK_CONF_OPENSSL_EXTRA 0 -#if MDK_CONF_OPENSSL_EXTRA == 1 -#define OPENSSL_EXTRA -#endif -// - -// diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptBenchmark/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -37,11 +37,11 @@ #endif /* Dummy definition for test RTC */ -#define RTC_YEAR 2019 +#define RTC_YEAR 2023 #define RTC_MONTH 1 -#define RTC_DAY 1 +#define RTC_DAY 1 #define RTC_MONTH 1 -#define RTC_DAY 1 +#define RTC_DAY 1 #if defined(STM32F7xx) #include "stm32f7xx_hal.h" @@ -72,22 +72,22 @@ uint32_t HAL_GetTick(void) { - #if defined(WOLFSSL_CMSIS_RTOS) - return os_time; - #elif defined(WOLFSSL_CMSIS_RTOSv2) - return osKernelGetTickCount(); - #endif + #if defined(WOLFSSL_CMSIS_RTOS) + return os_time; + #elif defined(WOLFSSL_CMSIS_RTOSv2) + return osKernelGetTickCount(); + #endif } double current_time(int reset) { if (reset) return 0; - #if defined(WOLFSSL_CMSIS_RTOS) - return (double)os_time / 1000.0; - #elif defined(WOLFSSL_CMSIS_RTOSv2) - return (double)osKernelGetTickCount() / 1000.0; - #endif +#if defined(WOLFSSL_CMSIS_RTOS) + return (double)os_time / 1000.0; +#elif defined(WOLFSSL_CMSIS_RTOSv2) + return (double)osKernelGetTickCount() / 1000.0; +#endif } #else @@ -96,28 +96,28 @@ #define DWT ((DWT_Type *) (0xE0001000UL) ) typedef struct { - uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ } DWT_Type; -extern uint32_t SystemCoreClock ; +extern uint32_t SystemCoreClock; double current_time(int reset) { - if(reset) DWT->CYCCNT = 0 ; - return ((double)DWT->CYCCNT/SystemCoreClock) ; + if (reset) DWT->CYCCNT = 0; + return ((double)DWT->CYCCNT/SystemCoreClock); } #endif static time_t epochTime; time_t time(time_t *t) { - return epochTime; + return epochTime; } void setTime(time_t t) { - epochTime = t; + epochTime = t; } /*----------------------------------------------------------------------------- @@ -126,48 +126,51 @@ #if !defined(NO_FILESYSTEM) #include "rl_fs.h" /* FileSystem definitions */ -static void init_filesystem (void) { - int32_t retv; +static void init_filesystem(void) +{ + int32_t retv; - retv = finit ("M0:"); - if (retv == fsOK) { - retv = fmount ("M0:"); + retv = finit ("M0:"); if (retv == fsOK) { - printf ("Drive M0 ready!\n"); + retv = fmount ("M0:"); + if (retv == fsOK) { + printf ("Drive M0 ready!\n"); + } + else { + printf ("Drive M0 mount failed(%d)!\n", retv); + } } else { - printf ("Drive M0 mount failed(%d)!\n", retv); + printf ("Drive M0 initialization failed!\n"); } - } - else { - printf ("Drive M0 initialization failed!\n"); - } } #endif /*----------------------------------------------------------------------------- - * mian entry + * main entry *----------------------------------------------------------------------------*/ -void benchmark_test(void *arg) ; +void benchmark_test(void *arg); int main() { - void * arg = NULL ; - - MPU_Config(); + void * arg = NULL; + + MPU_Config(); CPU_CACHE_Enable(); HAL_Init(); /* Initialize the HAL Library */ SystemClock_Config(); /* Configure the System Clock */ - #if !defined(NO_FILESYSTEM) +#if !defined(NO_FILESYSTEM) init_filesystem (); - #endif - - setTime((RTC_YEAR-1970)*365*24*60*60 + RTC_MONTH*30*24*60*60 + RTC_DAY*24*60*60); - - printf("=== Start: Crypt Benchmark ===\n") ; - benchmark_test(arg) ; - printf("=== End: Crypt Benchmark ===\n") ; +#endif -} + setTime((RTC_YEAR-1970)*365*24*60*60 + + RTC_MONTH*30*24*60*60 + + RTC_DAY*24*60*60); + + printf("=== Start: Crypt Benchmark ===\n"); + benchmark_test(arg); + printf("=== End: Crypt Benchmark ===\n"); + return 0; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvoptx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvoptx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvoptx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvoptx 2024-08-03 07:30:00.000000000 +0000 @@ -298,7 +298,7 @@ 0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/CryptTest.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -334,7 +334,7 @@ 0 - USE_STM32756G_EVAL USE_IOEXPANDER WOLFSSL_USER_SETTINGS + USE_STM32756G_EVAL USE_IOEXPANDER WOLFSSL_USER_SETTINGS MDK_CONF_NETWORK=0 @@ -413,7 +413,7 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h @@ -760,14 +760,8 @@ - - RTE\wolfSSL\config-Crypt.h - - - - - RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/RTE/wolfSSL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/RTE/wolfSSL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/RTE/wolfSSL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/RTE/wolfSSL/user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,497 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#define NO_MAIN_DRIVER -#define BENCH_EMBEDDED -#define NO_DEV_RANDOM -#define WOLFSSL_USER_CURRTIME -#define SIZEOF_LONG_LONG 8 -#define NO_WRITEV -#define NO_DEV_RANDOM - -#define TFM_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#define WC_RSA_BLINDING - -#define WOLFSSL_USER_CURRTIME /* for benchmark */ -#define WOLFSSL_CURRTIME_OSTICK /* use OS tich for current_time */ -#define WOLFSSL_GMTIME -#define NO_MULTIBYTE_PRINT - -// <<< Use Configuration Wizard in Context Menu >>> - - -// Common options -// MPU<0=>Undefined<1=>STM32F2xx<2=>STM32F4xx<3=>STM32F7xx -#define MDK_CONF_MPU 3 -#if MDK_CONF_MPU == 0 - -#elif MDK_CONF_MPU == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32F2xx -#elif MDK_CONF_MPU == 2 -#define WOLFSSL_STM32_CUBEMX -#define STM32F4xx -#elif MDK_CONF_MPU == 3 -#define WOLFSSL_STM32_CUBEMX -#define STM32F7xx -#endif - -// Thread/RTOS<0=>Single Threaded <1=>FreeRTOS <3=>SafeRTOS <4=>Windows -// <5=>PThread <6=>ThreadX -// <7=>Micrium <8=>EBSnet <9=>MQX -// <10=>T-RTOS <11=>uITRON4 <12=>uTKERNEL2 -// <13=>Frosted <14=>CMSIS RTOS <15=>CMSIS RTOSv2 <16=>Others -#define MDK_CONF_THREAD 15 -#if MDK_CONF_THREAD== 0 -#define SINGLE_THREADED -#elif MDK_CONF_THREAD == 1 -#define FREERTOS -#elif MDK_CONF_THREAD == 3 -#define WOLFSSL_SAFERTOS -#elif MDK_CONF_THREAD == 4 -#define USE_WINDOWS_API -#elif MDK_CONF_THREAD == 5 -#define WOLFSSL_PTHREADS -#elif MDK_CONF_THREAD == 6 -#define THREADX -#define NETX -#elif MDK_CONF_THREAD == 7 -#define MICRIUM -#elif MDK_CONF_THREAD == 8 -#define EBSNET -#elif MDK_CONF_THREAD == 9 -#define FREESCALE_MQX -#define FREESCALE_KSDK_MQX -#elif MDK_CONF_THREAD == 10 -#define WOLFSSL_TIRTOS -#elif MDK_CONF_THREAD == 11 -#define WOLFSSL_uITRON4 -#elif MDK_CONF_THREAD == 12 -#define WOLFSSL_uTKERNEL2 -#elif MDK_CONF_THREAD == 13 -#define WOLFSSL_FROSTED -#elif MDK_CONF_THREAD == 14 -#define WOLFSSL_CMSIS_RTOS -#elif MDK_CONF_THREAD == 15 -#define WOLFSSL_CMSIS_RTOSv2 -#elif MDK_CONF_THREAD == 16 -#define SINGLE_THREADED -#endif - - -// File System -#define MDK_CONF_FILESYSTEM 1 -#if MDK_CONF_FILESYSTEM == 0 -#define NO_FILESYSTEM -#else -#define WOLFSSL_KEIL_FS -#define NO_WOLFSSL_DIR -#endif -// - -// Network<0=>None <1=>RLnet <2=>User I/O -#define MDK_CONF_NETWORK 0 -#if MDK_CONF_NETWORK == 0 -#elif MDK_CONF_NETWORK == 1 -#define WOLFSSL_KEIL_TCP_NET -#elif MDK_CONF_NETWORK == 2 -#define WOLFSSL_USER_IO -#endif - -// Debug options - -// Debug Message -#define MDK_CONF_DebugMessage 0 -#if MDK_CONF_DebugMessage == 1 -#define DEBUG_WOLFSSL -#endif -// -// Check malloc -#define MDK_CONF_CheckMalloc 1 -#if MDK_CONF_CheckMalloc == 1 -#define WOLFSSL_MALLOC_CHECK -#define USE_WOLFSSL_MEMORY -#endif -// -// ErrNo.h -#define MDK_CONF_ErrNo 1 -#if MDK_CONF_ErrNo == 1 -#define HAVE_ERRNO -#endif -// -// Error Strings -#define MDK_CONF_ErrorStrings 1 -#if MDK_CONF_ErrorStrings == 0 -#define NO_ERROR_STRINGS -#endif -// - -// -// - -// wolfCrypt Configuration - -// Hash/Crypt Algrithm - -// MD2 -#define MDK_CONF_MD2 0 -#if MDK_CONF_MD2 == 1 -#define WOLFSSL_MD2 -#endif -// -// MD4 -#define MDK_CONF_MD4 0 -#if MDK_CONF_MD4 == 0 -#define NO_MD4 -#endif -// -// MD5 -#define MDK_CONF_MD5 1 -#if MDK_CONF_MD5 == 0 -#define NO_MD5 -#endif -// -// SHA -#define MDK_CONF_SHA 1 -#if MDK_CONF_SHA == 0 -#define NO_SHA -#endif -// -// SHA-256 -#define MDK_CONF_SHA256 1 -#if MDK_CONF_SHA256 == 0 -#define NO_SHA256 -#endif -// -// SHA-384 -#define MDK_CONF_SHA384 1 -#if MDK_CONF_SHA384 == 1 -#define WOLFSSL_SHA384 -#endif -// -// SHA-512 -#define MDK_CONF_SHA512 1 -#if MDK_CONF_SHA512 == 1 -#define WOLFSSL_SHA512 -#endif -// -// Hash DRBG -#define MDK_CONF_HASHDRBG 1 -#if MDK_CONF_HASHDRBG == 1 -#define HAVE_HASHDRBG -#endif -// -// RIPEMD -#define MDK_CONF_RIPEMD 1 -#if MDK_CONF_RIPEMD == 1 -#define WOLFSSL_RIPEMD -#endif -// -// BLAKE2 -#define MDK_CONF_BLAKE2 0 -#if MDK_CONF_BLAKE2 == 1 -#define HAVE_BLAKE2 -#endif -// -// HMAC -#define MDK_CONF_HMAC 1 -#if MDK_CONF_HMAC == 0 -#define NO_HMAC -#endif -// -// HMAC KDF -#define MDK_CONF_HKDF 1 -#if MDK_CONF_HKDF == 1 -#define HAVE_HKDF -#endif -// - -// AES CCM -#define MDK_CONF_AESCCM 1 -#if MDK_CONF_AESCCM == 1 -#define HAVE_AESCCM -#endif -// -// AES GCM -#define MDK_CONF_AESGCM 1 -#if MDK_CONF_AESGCM == 1 -#define HAVE_AESGCM -#endif -// - -// RC4 -#define MDK_CONF_RC4 0 -#if MDK_CONF_RC4 == 0 -#define NO_RC4 -#endif -// - -// CHACHA -#define MDK_CONF_CHACHA 1 -#if MDK_CONF_CHACHA == 1 -#define HAVE_CHACHA -#endif -// - -// POLY1305 -#define MDK_CONF_POLY1305 1 -#if MDK_CONF_POLY1305 == 1 -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH -#endif -// - -// DES3 -#define MDK_CONF_DES3 1 -#if MDK_CONF_DES3 == 0 -#define NO_DES3 -#endif -// - -// AES -#define MDK_CONF_AES 1 -#if MDK_CONF_AES == 0 -#define NO_AES -#endif -// - -// CAMELLIA -#define MDK_CONF_CAMELLIA 1 -#if MDK_CONF_CAMELLIA == 1 -#define HAVE_CAMELLIA -#endif -// - -// DH -#define MDK_CONF_DH 1 -#if MDK_CONF_DH == 0 -#define NO_DH -#endif -// -// DSA -#define MDK_CONF_DSA 1 -#if MDK_CONF_DSA == 0 -#define NO_DSA -#endif -// - -// SRP -#define MDK_CONF_SRP 1 -#if MDK_CONF_SRP == 1 -#define HAVE_SRP -#endif -// - -// PWDBASED -#define MDK_CONF_PWDBASED 1 -#if MDK_CONF_PWDBASED == 0 -#define NO_PWDBASED -#endif -// - -// ECC -#define MDK_CONF_ECC 1 -#if MDK_CONF_ECC == 1 -#define HAVE_ECC -#endif -// - -// CURVE25519 -#define MDK_CONF_CURVE25519 1 -#if MDK_CONF_CURVE25519 == 1 -#define HAVE_CURVE25519 -#define CURVED25519_SMALL -#endif -// -// CURVE25519 SMALL -#define MDK_CONF_CURVE25519_SMALL 0 -#if MDK_CONF_CURVE25519_SMALL == 1 -#define CURVED25519_SMALL -#endif -// -// ED25519 -#define MDK_CONF_ED25519 1 -#if MDK_CONF_ED25519 == 1 -#define HAVE_ED25519 -#endif -// -// ED25519 SMALL -#define MDK_CONF_ED25519_SMALL 0 -#if MDK_CONF_ED25519_SMALL == 1 -#define ED25519_SMALL -#endif -// -// PKCS7 -#define MDK_CONF_PKCS7 0 -#if MDK_CONF_PKCS7 == 1 -#define HAVE_PKCS7 -#endif -// -// - -// Random Seed, for TEST Only -#define MDK_CONF_RNDSEED 1 -#if MDK_CONF_RNDSEED == 1 -#define WOLFSSL_GENSEED_FORTEST -#endif -// - -// Hardware Crypt (See document for usage) -// Hardware RNG -#define MDK_CONF_STM32F2_RNG 0 -#if MDK_CONF_STM32F2_RNG == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_RNG -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Crypt -#define MDK_CONF_STM32F2_CRYPTO 0 -#if MDK_CONF_STM32F2_CRYPTO == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_CRYPTO -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Hash -#define MDK_CONF_STM32F2_HASH 0 -#if MDK_CONF_STM32F2_HASH == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_HASH -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// - -// Cert/Key Strage -// Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) -#define MDK_CONF_CERT_BUFF 0 -#if MDK_CONF_CERT_BUFF== 1 -#define USE_CERT_BUFFERS_1024 -#elif MDK_CONF_CERT_BUFF == 2 -#define USE_CERT_BUFFERS_2048 -#endif -// -// Cert/Key Generation -// CertGen -#define MDK_CONF_CERT_GEN 0 -#if MDK_CONF_CERT_GEN == 1 -#define WOLFSSL_CERT_GEN -#endif -// -// KeyGen -#define MDK_CONF_KEY_GEN 0 -#if MDK_CONF_KEY_GEN == 1 -#define WOLFSSL_KEY_GEN -#endif -// -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// - -// - - -/**** wolfSSL Configuration ****/ - -// wolfSSL Configuration - -// TLS 1.3 -#define MDK_CONF_TLS 1 -#if MDK_CONF_TLS == 1 -#define WOLFSSL_TLS13 -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define WC_RSA_PSS -#define HAVE_HKDF -#define HAVE_FFDHE_2048 -#endif -// - -// Include Old TLS -#define MDK_CONF_NO_OLDTLS 0 -#if MDK_CONF_NO_OLDTLS == 0 -#define NO_OLD_TLS -#endif -// -// CRL -#define MDK_CONF_CRL 0 -#if MDK_CONF_CRL == 1 -#define HAVE_CRL -#define WOLFSSL_DER_LOAD -#endif -// -// OCSP -#define MDK_CONF_OCSP 0 -#if MDK_CONF_OCSP == 1 -#define HAVE_OCSP -#endif -// -// OpenSSL Extra -#define MDK_CONF_OPENSSL_EXTRA 0 -#if MDK_CONF_OPENSSL_EXTRA == 1 -#define OPENSSL_EXTRA -#endif -// - -// diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/CryptTest/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -34,9 +34,9 @@ #include "cmsis_os2.h" #endif /* Dummy definition for test RTC */ -#define RTC_YEAR 2019 +#define RTC_YEAR 2023 #define RTC_MONTH 1 -#define RTC_DAY 1 +#define RTC_DAY 1 #if defined(STM32F7xx) #include "stm32f7xx_hal.h" @@ -65,19 +65,19 @@ #endif uint32_t HAL_GetTick(void) { - #if defined(WOLFSSL_CMSIS_RTOS) - return os_time; - #elif defined(WOLFSSL_CMSIS_RTOSv2) - return osKernelGetTickCount(); - #endif +#if defined(WOLFSSL_CMSIS_RTOS) + return os_time; +#elif defined(WOLFSSL_CMSIS_RTOSv2) + return osKernelGetTickCount(); +#endif } static time_t epochTime; -time_t time(time_t *t){ - return epochTime ; +time_t time(time_t *t) { + return epochTime; } -void setTime(time_t t){ +void setTime(time_t t) { epochTime = t; } @@ -87,48 +87,52 @@ #if !defined(NO_FILESYSTEM) #include "rl_fs.h" /* FileSystem definitions */ -static void init_filesystem (void) { - int32_t retv; +static void init_filesystem(void) +{ + int32_t retv; - retv = finit ("M0:"); - if (retv == fsOK) { - retv = fmount ("M0:"); + retv = finit ("M0:"); if (retv == fsOK) { - printf ("Drive M0 ready!\n"); + retv = fmount ("M0:"); + if (retv == fsOK) { + printf ("Drive M0 ready!\n"); + } + else { + printf ("Drive M0 mount failed(%d)!\n", retv); + } } else { - printf ("Drive M0 mount failed(%d)!\n", retv); + printf ("Drive M0 initialization failed!\n"); } - } - else { - printf ("Drive M0 initialization failed!\n"); - } } #endif /*----------------------------------------------------------------------------- - * mian entry + * main entry *----------------------------------------------------------------------------*/ -void wolfcrypt_test(void *arg) ; +void wolfcrypt_test(void *arg); int main() { - void * arg = NULL ; + void * arg = NULL; - MPU_Config(); + MPU_Config(); CPU_CACHE_Enable(); HAL_Init(); /* Initialize the HAL Library */ SystemClock_Config(); /* Configure the System Clock */ - #if !defined(NO_FILESYSTEM) +#if !defined(NO_FILESYSTEM) init_filesystem (); - #endif - - setTime((RTC_YEAR-1970)*365*24*60*60 + RTC_MONTH*30*24*60*60 + RTC_DAY*24*60*60); +#endif - printf("=== Start: Crypt test === \n") ; - wolfcrypt_test(arg) ; - printf("=== End: Crypt test ===\n") ; + setTime((RTC_YEAR-1970)*365*24*60*60 + + RTC_MONTH*30*24*60*60 + + RTC_DAY*24*60*60); + + printf("=== Start: Crypt test === \n"); + wolfcrypt_test(arg); + printf("=== End: Crypt test ===\n"); + return 0; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvoptx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvoptx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvoptx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvoptx 2024-08-03 07:30:00.000000000 +0000 @@ -328,7 +328,7 @@ 0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/EchoClient.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -413,7 +413,7 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h @@ -880,7 +880,7 @@ - RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/RTE/wolfSSL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/RTE/wolfSSL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/RTE/wolfSSL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/RTE/wolfSSL/user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,495 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#define NO_MAIN_DRIVER -#define BENCH_EMBEDDED -#define NO_DEV_RANDOM -#define WOLFSSL_USER_CURRTIME -#define SIZEOF_LONG_LONG 8 -#define NO_WRITEV -#define NO_DEV_RANDOM - -#define TFM_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#define WC_RSA_BLINDING - -#define WOLFSSL_USER_CURRTIME /* for benchmark */ -#define WOLFSSL_CURRTIME_OSTICK /* use OS tich for current_time */ -#define WOLFSSL_GMTIME -#define NO_MULTIBYTE_PRINT - -// <<< Use Configuration Wizard in Context Menu >>> - - -// Common options -// MPU<0=>Undefined<1=>STM32F2xx<2=>STM32F4xx<3=>STM32F7xx -#define MDK_CONF_MPU 3 -#if MDK_CONF_MPU == 0 - -#elif MDK_CONF_MPU == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32F2xx -#elif MDK_CONF_MPU == 2 -#define WOLFSSL_STM32_CUBEMX -#define STM32F4xx -#elif MDK_CONF_MPU == 3 -#define WOLFSSL_STM32_CUBEMX -#define STM32F7xx -#endif - -// Thread/RTOS<0=>Single Threaded <1=>FreeRTOS <3=>SafeRTOS <4=>Windows -// <5=>PThread <6=>ThreadX -// <7=>Micrium <8=>EBSnet <9=>MQX -// <10=>T-RTOS <11=>uITRON4 <12=>uTKERNEL2 -// <13=>Frosted <14=>CMSIS RTOS <15=>CMSIS RTOSv2 <16=>Others -#define MDK_CONF_THREAD 14 -#if MDK_CONF_THREAD== 0 -#define SINGLE_THREADED -#elif MDK_CONF_THREAD == 1 -#define FREERTOS -#elif MDK_CONF_THREAD == 3 -#define WOLFSSL_SAFERTOS -#elif MDK_CONF_THREAD == 4 -#define USE_WINDOWS_API -#elif MDK_CONF_THREAD == 5 -#define WOLFSSL_PTHREADS -#elif MDK_CONF_THREAD == 6 -#define THREADX -#define NETX -#elif MDK_CONF_THREAD == 7 -#define MICRIUM -#elif MDK_CONF_THREAD == 8 -#define EBSNET -#elif MDK_CONF_THREAD == 9 -#define FREESCALE_MQX -#define FREESCALE_KSDK_MQX -#elif MDK_CONF_THREAD == 10 -#define WOLFSSL_TIRTOS -#elif MDK_CONF_THREAD == 11 -#define WOLFSSL_uITRON4 -#elif MDK_CONF_THREAD == 12 -#define WOLFSSL_uTKERNEL2 -#elif MDK_CONF_THREAD == 13 -#define WOLFSSL_FROSTED -#elif MDK_CONF_THREAD == 14 -#define WOLFSSL_CMSIS_RTOS -#elif MDK_CONF_THREAD == 15 -#define SINGLE_THREADED -#endif - - -// File System -#define MDK_CONF_FILESYSTEM 1 -#if MDK_CONF_FILESYSTEM == 0 -#define NO_FILESYSTEM -#else -#define WOLFSSL_KEIL_FS -#define NO_WOLFSSL_DIR -#endif -// - -// Network<0=>None <1=>RLnet <2=>User I/O -#define MDK_CONF_NETWORK 1 -#if MDK_CONF_NETWORK == 0 -#elif MDK_CONF_NETWORK == 1 -#define WOLFSSL_KEIL_TCP_NET -#elif MDK_CONF_NETWORK == 2 -#define WOLFSSL_USER_IO -#endif - -// Debug options - -// Debug Message -#define MDK_CONF_DebugMessage 0 -#if MDK_CONF_DebugMessage == 1 -#define DEBUG_WOLFSSL -#endif -// -// Check malloc -#define MDK_CONF_CheckMalloc 1 -#if MDK_CONF_CheckMalloc == 1 -#define WOLFSSL_MALLOC_CHECK -#define USE_WOLFSSL_MEMORY -#endif -// -// ErrNo.h -#define MDK_CONF_ErrNo 1 -#if MDK_CONF_ErrNo == 1 -#define HAVE_ERRNO -#endif -// -// Error Strings -#define MDK_CONF_ErrorStrings 1 -#if MDK_CONF_ErrorStrings == 0 -#define NO_ERROR_STRINGS -#endif -// - -// -// - -// wolfCrypt Configuration - -// Hash/Crypt Algrithm - -// MD2 -#define MDK_CONF_MD2 0 -#if MDK_CONF_MD2 == 1 -#define WOLFSSL_MD2 -#endif -// -// MD4 -#define MDK_CONF_MD4 0 -#if MDK_CONF_MD4 == 0 -#define NO_MD4 -#endif -// -// MD5 -#define MDK_CONF_MD5 1 -#if MDK_CONF_MD5 == 0 -#define NO_MD5 -#endif -// -// SHA -#define MDK_CONF_SHA 1 -#if MDK_CONF_SHA == 0 -#define NO_SHA -#endif -// -// SHA-256 -#define MDK_CONF_SHA256 1 -#if MDK_CONF_SHA256 == 0 -#define NO_SHA256 -#endif -// -// SHA-384 -#define MDK_CONF_SHA384 1 -#if MDK_CONF_SHA384 == 1 -#define WOLFSSL_SHA384 -#endif -// -// SHA-512 -#define MDK_CONF_SHA512 1 -#if MDK_CONF_SHA512 == 1 -#define WOLFSSL_SHA512 -#endif -// -// Hash DRBG -#define MDK_CONF_HASHDRBG 1 -#if MDK_CONF_HASHDRBG == 1 -#define HAVE_HASHDRBG -#endif -// -// RIPEMD -#define MDK_CONF_RIPEMD 1 -#if MDK_CONF_RIPEMD == 1 -#define WOLFSSL_RIPEMD -#endif -// -// BLAKE2 -#define MDK_CONF_BLAKE2 0 -#if MDK_CONF_BLAKE2 == 1 -#define HAVE_BLAKE2 -#endif -// -// HMAC -#define MDK_CONF_HMAC 1 -#if MDK_CONF_HMAC == 0 -#define NO_HMAC -#endif -// -// HMAC KDF -#define MDK_CONF_HKDF 1 -#if MDK_CONF_HKDF == 1 -#define HAVE_HKDF -#endif -// - -// AES CCM -#define MDK_CONF_AESCCM 1 -#if MDK_CONF_AESCCM == 1 -#define HAVE_AESCCM -#endif -// -// AES GCM -#define MDK_CONF_AESGCM 1 -#if MDK_CONF_AESGCM == 1 -#define HAVE_AESGCM -#endif -// - -// RC4 -#define MDK_CONF_RC4 0 -#if MDK_CONF_RC4 == 0 -#define NO_RC4 -#endif -// - -// CHACHA -#define MDK_CONF_CHACHA 1 -#if MDK_CONF_CHACHA == 1 -#define HAVE_CHACHA -#endif -// - -// POLY1305 -#define MDK_CONF_POLY1305 1 -#if MDK_CONF_POLY1305 == 1 -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH -#endif -// - -// DES3 -#define MDK_CONF_DES3 1 -#if MDK_CONF_DES3 == 0 -#define NO_DES3 -#endif -// - -// AES -#define MDK_CONF_AES 1 -#if MDK_CONF_AES == 0 -#define NO_AES -#endif -// - -// CAMELLIA -#define MDK_CONF_CAMELLIA 1 -#if MDK_CONF_CAMELLIA == 1 -#define HAVE_CAMELLIA -#endif -// - -// DH -#define MDK_CONF_DH 1 -#if MDK_CONF_DH == 0 -#define NO_DH -#endif -// -// DSA -#define MDK_CONF_DSA 1 -#if MDK_CONF_DSA == 0 -#define NO_DSA -#endif -// - -// SRP -#define MDK_CONF_SRP 1 -#if MDK_CONF_SRP == 1 -#define HAVE_SRP -#endif -// - -// PWDBASED -#define MDK_CONF_PWDBASED 1 -#if MDK_CONF_PWDBASED == 0 -#define NO_PWDBASED -#endif -// - -// ECC -#define MDK_CONF_ECC 1 -#if MDK_CONF_ECC == 1 -#define HAVE_ECC -#endif -// - -// CURVE25519 -#define MDK_CONF_CURVE25519 1 -#if MDK_CONF_CURVE25519 == 1 -#define HAVE_CURVE25519 -#define CURVED25519_SMALL -#endif -// -// CURVE25519 SMALL -#define MDK_CONF_CURVE25519_SMALL 0 -#if MDK_CONF_CURVE25519_SMALL == 1 -#define CURVED25519_SMALL -#endif -// -// ED25519 -#define MDK_CONF_ED25519 1 -#if MDK_CONF_ED25519 == 1 -#define HAVE_ED25519 -#endif -// -// ED25519 SMALL -#define MDK_CONF_ED25519_SMALL 0 -#if MDK_CONF_ED25519_SMALL == 1 -#define ED25519_SMALL -#endif -// -// PKCS7 -#define MDK_CONF_PKCS7 0 -#if MDK_CONF_PKCS7 == 1 -#define HAVE_PKCS7 -#endif -// -// - -// Random Seed, for TEST Only -#define MDK_CONF_RNDSEED 1 -#if MDK_CONF_RNDSEED == 1 -#define WOLFSSL_GENSEED_FORTEST -#endif -// - -// Hardware Crypt (See document for usage) -// Hardware RNG -#define MDK_CONF_STM32F2_RNG 0 -#if MDK_CONF_STM32F2_RNG == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_RNG -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Crypt -#define MDK_CONF_STM32F2_CRYPTO 0 -#if MDK_CONF_STM32F2_CRYPTO == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_CRYPTO -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Hash -#define MDK_CONF_STM32F2_HASH 0 -#if MDK_CONF_STM32F2_HASH == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_HASH -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// - -// Cert/Key Strage -// Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) -#define MDK_CONF_CERT_BUFF 0 -#if MDK_CONF_CERT_BUFF== 1 -#define USE_CERT_BUFFERS_1024 -#elif MDK_CONF_CERT_BUFF == 2 -#define USE_CERT_BUFFERS_2048 -#endif -// -// Cert/Key Generation -// CertGen -#define MDK_CONF_CERT_GEN 0 -#if MDK_CONF_CERT_GEN == 1 -#define WOLFSSL_CERT_GEN -#endif -// -// KeyGen -#define MDK_CONF_KEY_GEN 0 -#if MDK_CONF_KEY_GEN == 1 -#define WOLFSSL_KEY_GEN -#endif -// -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// - -// - - -/**** wolfSSL Configuration ****/ - -// wolfSSL Configuration - -// TLS 1.3 -#define MDK_CONF_TLS 1 -#if MDK_CONF_TLS == 1 -#define WOLFSSL_TLS13 -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define WC_RSA_PSS -#define HAVE_HKDF -#define HAVE_FFDHE_2048 -#endif -// - -// Include Old TLS -#define MDK_CONF_NO_OLDTLS 0 -#if MDK_CONF_NO_OLDTLS == 0 -#define NO_OLD_TLS -#endif -// -// CRL -#define MDK_CONF_CRL 0 -#if MDK_CONF_CRL == 1 -#define HAVE_CRL -#define WOLFSSL_DER_LOAD -#endif -// -// OCSP -#define MDK_CONF_OCSP 0 -#if MDK_CONF_OCSP == 1 -#define HAVE_OCSP -#endif -// -// OpenSSL Extra -#define MDK_CONF_OPENSSL_EXTRA 0 -#if MDK_CONF_OPENSSL_EXTRA == 1 -#define OPENSSL_EXTRA -#endif -// - -// diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoClient/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -26,7 +26,7 @@ #include "wolfssl/wolfcrypt/settings.h" #include "cmsis_os.h" /* CMSIS RTOS definitions */ -#include "rl_net.h" /* Network definitions */ +#include "rl_net.h" /* Network definitions */ #include #if defined(STM32F7xx) @@ -40,12 +40,9 @@ //-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- // RTC: for validate certificate date -// Year <1970-2099> -#define RTC_YEAR 2018 -// Month <1=>Jan<2=>Feb<3=>Mar<4=>Apr<5=>May<6=>Jun<7=>Jul<8=>Aut<9=>Sep<10=>Oct<11=>Nov<12=>Dec +#define RTC_YEAR 2023 #define RTC_MONTH 1 -// Day <1-31> -#define RTC_DAY 1 +#define RTC_DAY 1 // //------------- <<< end of configuration section >>> ----------------------- @@ -69,29 +66,30 @@ #if !defined(NO_FILESYSTEM) #include "rl_fs.h" /* FileSystem definitions */ -static void init_filesystem (void) { - int32_t retv; +static void init_filesystem(void) +{ + int32_t retv; - retv = finit ("M0:"); - if (retv == fsOK) { - retv = fmount ("M0:"); + retv = finit ("M0:"); if (retv == fsOK) { - printf ("Drive M0 ready!\n"); + retv = fmount ("M0:"); + if (retv == fsOK) { + printf ("Drive M0 ready!\n"); + } + else { + printf ("Drive M0 mount failed(%d)!\n", retv); + } } else { - printf ("Drive M0 mount failed(%d)!\n", retv); + printf ("Drive M0 initialization failed!\n"); } - } - else { - printf ("Drive M0 initialization failed!\n"); - } } #endif void net_loop(void const *arg) { - while(1) { + while (1) { net_main (); osThreadYield (); } @@ -103,8 +101,8 @@ extern uint32_t os_time; static time_t epochTime; -uint32_t HAL_GetTick(void) { - return os_time; +uint32_t HAL_GetTick(void) { + return os_time; } time_t time(time_t *t){ @@ -133,15 +131,15 @@ #define DWT ((DWT_Type *) (0xE0001000UL) ) typedef struct { - uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ } DWT_Type; extern uint32_t SystemCoreClock ; double current_time(int reset) { - if(reset) DWT->CYCCNT = 0 ; + if (reset) DWT->CYCCNT = 0 ; return ((double)DWT->CYCCNT/SystemCoreClock) ; } #endif @@ -160,20 +158,21 @@ int myoptind = 0; char* myoptarg = NULL; -int main (void) { +int main (void) +{ static char *argv[] = { "client" } ; static func_args args = { 1, argv } ; - MPU_Config(); /* Configure the MPU */ - CPU_CACHE_Enable(); /* Enable the CPU Cache */ - HAL_Init(); /* Initialize the HAL Library */ - SystemClock_Config(); /* Configure the System Clock */ + MPU_Config(); /* Configure the MPU */ + CPU_CACHE_Enable(); /* Enable the CPU Cache */ + HAL_Init(); /* Initialize the HAL Library */ + SystemClock_Config(); /* Configure the System Clock */ - #if !defined(NO_FILESYSTEM) +#if !defined(NO_FILESYSTEM) init_filesystem (); - #endif +#endif net_initialize (); #if defined(DEBUG_WOLFSSL) @@ -181,14 +180,15 @@ wolfSSL_Debugging_ON() ; #endif - setTime((RTC_YEAR-1970)*365*24*60*60 + RTC_MONTH*30*24*60*60 + RTC_DAY*24*60*60); + setTime((RTC_YEAR-1970)*365*24*60*60 + + RTC_MONTH*30*24*60*60 + + RTC_DAY*24*60*60); osThreadCreate (osThread(net_loop), NULL); echoclient_test(&args) ; - while(1) + while (1) { osDelay(1000); - + } } - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvoptx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvoptx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvoptx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvoptx 2024-08-03 07:30:00.000000000 +0000 @@ -279,7 +279,7 @@ 0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/EchoServer.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -413,7 +413,7 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h @@ -886,7 +886,7 @@ - RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/RTE/wolfSSL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/RTE/wolfSSL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/RTE/wolfSSL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/RTE/wolfSSL/user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,497 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#define NO_MAIN_DRIVER -#define BENCH_EMBEDDED -#define NO_DEV_RANDOM -#define WOLFSSL_USER_CURRTIME -#define SIZEOF_LONG_LONG 8 -#define NO_WRITEV -#define NO_DEV_RANDOM - -#define TFM_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#define WC_RSA_BLINDING - -#define WOLFSSL_USER_CURRTIME /* for benchmark */ -#define WOLFSSL_CURRTIME_OSTICK /* use OS tich for current_time */ -#define WOLFSSL_GMTIME -#define NO_MULTIBYTE_PRINT - -// <<< Use Configuration Wizard in Context Menu >>> - - -// Common options -// MPU<0=>Undefined<1=>STM32F2xx<2=>STM32F4xx<3=>STM32F7xx -#define MDK_CONF_MPU 3 -#if MDK_CONF_MPU == 0 - -#elif MDK_CONF_MPU == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32F2xx -#elif MDK_CONF_MPU == 2 -#define WOLFSSL_STM32_CUBEMX -#define STM32F4xx -#elif MDK_CONF_MPU == 3 -#define WOLFSSL_STM32_CUBEMX -#define STM32F7xx -#endif - -// Thread/RTOS<0=>Single Threaded <1=>FreeRTOS <3=>SafeRTOS <4=>Windows -// <5=>PThread <6=>ThreadX -// <7=>Micrium <8=>EBSnet <9=>MQX -// <10=>T-RTOS <11=>uITRON4 <12=>uTKERNEL2 -// <13=>Frosted <14=>CMSIS RTOS <15=>CMSIS RTOSv2 <16=>Others -#define MDK_CONF_THREAD 14 -#if MDK_CONF_THREAD== 0 -#define SINGLE_THREADED -#elif MDK_CONF_THREAD == 1 -#define FREERTOS -#elif MDK_CONF_THREAD == 3 -#define WOLFSSL_SAFERTOS -#elif MDK_CONF_THREAD == 4 -#define USE_WINDOWS_API -#elif MDK_CONF_THREAD == 5 -#define WOLFSSL_PTHREADS -#elif MDK_CONF_THREAD == 6 -#define THREADX -#define NETX -#elif MDK_CONF_THREAD == 7 -#define MICRIUM -#elif MDK_CONF_THREAD == 8 -#define EBSNET -#elif MDK_CONF_THREAD == 9 -#define FREESCALE_MQX -#define FREESCALE_KSDK_MQX -#elif MDK_CONF_THREAD == 10 -#define WOLFSSL_TIRTOS -#elif MDK_CONF_THREAD == 11 -#define WOLFSSL_uITRON4 -#elif MDK_CONF_THREAD == 12 -#define WOLFSSL_uTKERNEL2 -#elif MDK_CONF_THREAD == 13 -#define WOLFSSL_FROSTED -#elif MDK_CONF_THREAD == 14 -#define WOLFSSL_CMSIS_RTOS -#elif MDK_CONF_THREAD == 15 -#define WOLFSSL_CMSIS_RTOSv2 -#elif MDK_CONF_THREAD == 16 -#define SINGLE_THREADED -#endif - - -// File System -#define MDK_CONF_FILESYSTEM 1 -#if MDK_CONF_FILESYSTEM == 0 -#define NO_FILESYSTEM -#else -#define WOLFSSL_KEIL_FS -#define NO_WOLFSSL_DIR -#endif -// - -// Network<0=>None <1=>RLnet <2=>User I/O -#define MDK_CONF_NETWORK 1 -#if MDK_CONF_NETWORK == 0 -#elif MDK_CONF_NETWORK == 1 -#define WOLFSSL_KEIL_TCP_NET -#elif MDK_CONF_NETWORK == 2 -#define WOLFSSL_USER_IO -#endif - -// Debug options - -// Debug Message -#define MDK_CONF_DebugMessage 0 -#if MDK_CONF_DebugMessage == 1 -#define DEBUG_WOLFSSL -#endif -// -// Check malloc -#define MDK_CONF_CheckMalloc 1 -#if MDK_CONF_CheckMalloc == 1 -#define WOLFSSL_MALLOC_CHECK -#define USE_WOLFSSL_MEMORY -#endif -// -// ErrNo.h -#define MDK_CONF_ErrNo 1 -#if MDK_CONF_ErrNo == 1 -#define HAVE_ERRNO -#endif -// -// Error Strings -#define MDK_CONF_ErrorStrings 1 -#if MDK_CONF_ErrorStrings == 0 -#define NO_ERROR_STRINGS -#endif -// - -// -// - -// wolfCrypt Configuration - -// Hash/Crypt Algrithm - -// MD2 -#define MDK_CONF_MD2 0 -#if MDK_CONF_MD2 == 1 -#define WOLFSSL_MD2 -#endif -// -// MD4 -#define MDK_CONF_MD4 0 -#if MDK_CONF_MD4 == 0 -#define NO_MD4 -#endif -// -// MD5 -#define MDK_CONF_MD5 1 -#if MDK_CONF_MD5 == 0 -#define NO_MD5 -#endif -// -// SHA -#define MDK_CONF_SHA 1 -#if MDK_CONF_SHA == 0 -#define NO_SHA -#endif -// -// SHA-256 -#define MDK_CONF_SHA256 1 -#if MDK_CONF_SHA256 == 0 -#define NO_SHA256 -#endif -// -// SHA-384 -#define MDK_CONF_SHA384 1 -#if MDK_CONF_SHA384 == 1 -#define WOLFSSL_SHA384 -#endif -// -// SHA-512 -#define MDK_CONF_SHA512 1 -#if MDK_CONF_SHA512 == 1 -#define WOLFSSL_SHA512 -#endif -// -// Hash DRBG -#define MDK_CONF_HASHDRBG 1 -#if MDK_CONF_HASHDRBG == 1 -#define HAVE_HASHDRBG -#endif -// -// RIPEMD -#define MDK_CONF_RIPEMD 1 -#if MDK_CONF_RIPEMD == 1 -#define WOLFSSL_RIPEMD -#endif -// -// BLAKE2 -#define MDK_CONF_BLAKE2 0 -#if MDK_CONF_BLAKE2 == 1 -#define HAVE_BLAKE2 -#endif -// -// HMAC -#define MDK_CONF_HMAC 1 -#if MDK_CONF_HMAC == 0 -#define NO_HMAC -#endif -// -// HMAC KDF -#define MDK_CONF_HKDF 1 -#if MDK_CONF_HKDF == 1 -#define HAVE_HKDF -#endif -// - -// AES CCM -#define MDK_CONF_AESCCM 1 -#if MDK_CONF_AESCCM == 1 -#define HAVE_AESCCM -#endif -// -// AES GCM -#define MDK_CONF_AESGCM 1 -#if MDK_CONF_AESGCM == 1 -#define HAVE_AESGCM -#endif -// - -// RC4 -#define MDK_CONF_RC4 0 -#if MDK_CONF_RC4 == 0 -#define NO_RC4 -#endif -// - -// CHACHA -#define MDK_CONF_CHACHA 1 -#if MDK_CONF_CHACHA == 1 -#define HAVE_CHACHA -#endif -// - -// POLY1305 -#define MDK_CONF_POLY1305 1 -#if MDK_CONF_POLY1305 == 1 -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH -#endif -// - -// DES3 -#define MDK_CONF_DES3 1 -#if MDK_CONF_DES3 == 0 -#define NO_DES3 -#endif -// - -// AES -#define MDK_CONF_AES 1 -#if MDK_CONF_AES == 0 -#define NO_AES -#endif -// - -// CAMELLIA -#define MDK_CONF_CAMELLIA 1 -#if MDK_CONF_CAMELLIA == 1 -#define HAVE_CAMELLIA -#endif -// - -// DH -#define MDK_CONF_DH 1 -#if MDK_CONF_DH == 0 -#define NO_DH -#endif -// -// DSA -#define MDK_CONF_DSA 1 -#if MDK_CONF_DSA == 0 -#define NO_DSA -#endif -// - -// SRP -#define MDK_CONF_SRP 1 -#if MDK_CONF_SRP == 1 -#define HAVE_SRP -#endif -// - -// PWDBASED -#define MDK_CONF_PWDBASED 1 -#if MDK_CONF_PWDBASED == 0 -#define NO_PWDBASED -#endif -// - -// ECC -#define MDK_CONF_ECC 1 -#if MDK_CONF_ECC == 1 -#define HAVE_ECC -#endif -// - -// CURVE25519 -#define MDK_CONF_CURVE25519 1 -#if MDK_CONF_CURVE25519 == 1 -#define HAVE_CURVE25519 -#define CURVED25519_SMALL -#endif -// -// CURVE25519 SMALL -#define MDK_CONF_CURVE25519_SMALL 0 -#if MDK_CONF_CURVE25519_SMALL == 1 -#define CURVED25519_SMALL -#endif -// -// ED25519 -#define MDK_CONF_ED25519 1 -#if MDK_CONF_ED25519 == 1 -#define HAVE_ED25519 -#endif -// -// ED25519 SMALL -#define MDK_CONF_ED25519_SMALL 0 -#if MDK_CONF_ED25519_SMALL == 1 -#define ED25519_SMALL -#endif -// -// PKCS7 -#define MDK_CONF_PKCS7 0 -#if MDK_CONF_PKCS7 == 1 -#define HAVE_PKCS7 -#endif -// -// - -// Random Seed, for TEST Only -#define MDK_CONF_RNDSEED 1 -#if MDK_CONF_RNDSEED == 1 -#define WOLFSSL_GENSEED_FORTEST -#endif -// - -// Hardware Crypt (See document for usage) -// Hardware RNG -#define MDK_CONF_STM32F2_RNG 0 -#if MDK_CONF_STM32F2_RNG == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_RNG -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Crypt -#define MDK_CONF_STM32F2_CRYPTO 0 -#if MDK_CONF_STM32F2_CRYPTO == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_CRYPTO -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Hash -#define MDK_CONF_STM32F2_HASH 0 -#if MDK_CONF_STM32F2_HASH == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_HASH -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// - -// Cert/Key Strage -// Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) -#define MDK_CONF_CERT_BUFF 0 -#if MDK_CONF_CERT_BUFF== 1 -#define USE_CERT_BUFFERS_1024 -#elif MDK_CONF_CERT_BUFF == 2 -#define USE_CERT_BUFFERS_2048 -#endif -// -// Cert/Key Generation -// CertGen -#define MDK_CONF_CERT_GEN 0 -#if MDK_CONF_CERT_GEN == 1 -#define WOLFSSL_CERT_GEN -#endif -// -// KeyGen -#define MDK_CONF_KEY_GEN 0 -#if MDK_CONF_KEY_GEN == 1 -#define WOLFSSL_KEY_GEN -#endif -// -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// - -// - - -/**** wolfSSL Configuration ****/ - -// wolfSSL Configuration - -// TLS 1.3 -#define MDK_CONF_TLS 1 -#if MDK_CONF_TLS == 1 -#define WOLFSSL_TLS13 -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define WC_RSA_PSS -#define HAVE_HKDF -#define HAVE_FFDHE_2048 -#endif -// - -// Include Old TLS -#define MDK_CONF_NO_OLDTLS 0 -#if MDK_CONF_NO_OLDTLS == 0 -#define NO_OLD_TLS -#endif -// -// CRL -#define MDK_CONF_CRL 0 -#if MDK_CONF_CRL == 1 -#define HAVE_CRL -#define WOLFSSL_DER_LOAD -#endif -// -// OCSP -#define MDK_CONF_OCSP 0 -#if MDK_CONF_OCSP == 1 -#define HAVE_OCSP -#endif -// -// OpenSSL Extra -#define MDK_CONF_OPENSSL_EXTRA 0 -#if MDK_CONF_OPENSSL_EXTRA == 1 -#define OPENSSL_EXTRA -#endif -// - -// diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/EchoServer/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -26,7 +26,7 @@ #include "wolfssl/wolfcrypt/settings.h" #include "cmsis_os.h" /* CMSIS RTOS definitions */ -#include "rl_net.h" /* Network definitions */ +#include "rl_net.h" /* Network definitions */ #include #if defined(STM32F7xx) @@ -58,12 +58,9 @@ // // RTC: for validate certificate date -// Year <1970-2099> -#define RTC_YEAR 2018 -// Month <1=>Jan<2=>Feb<3=>Mar<4=>Apr<5=>May<6=>Jun<7=>Jul<8=>Aut<9=>Sep<10=>Oct<11=>Nov<12=>Dec +#define RTC_YEAR 2023 #define RTC_MONTH 1 -// Day <1-31> -#define RTC_DAY 1 +#define RTC_DAY 1 // //------------- <<< end of configuration section >>> ----------------------- @@ -88,22 +85,23 @@ #if !defined(NO_FILESYSTEM) #include "rl_fs.h" /* FileSystem definitions */ -static void init_filesystem (void) { - int32_t retv; +static void init_filesystem(void) +{ + int32_t retv; - retv = finit ("M0:"); - if (retv == fsOK) { - retv = fmount ("M0:"); + retv = finit ("M0:"); if (retv == fsOK) { - printf ("Drive M0 ready!\n"); + retv = fmount ("M0:"); + if (retv == fsOK) { + printf ("Drive M0 ready!\n"); + } + else { + printf ("Drive M0 mount failed(%d)!\n", retv); + } } else { - printf ("Drive M0 mount failed(%d)!\n", retv); + printf ("Drive M0 initialization failed!\n"); } - } - else { - printf ("Drive M0 initialization failed!\n"); - } } #endif @@ -120,20 +118,20 @@ #ifdef RTE_CMSIS_RTOS_RTX extern uint32_t os_time; -static time_t epochTime; +static time_t epochTime; -uint32_t HAL_GetTick(void) { - return os_time; +uint32_t HAL_GetTick(void) { + return os_time; } -time_t time(time_t *t){ - return epochTime ; +time_t time(time_t *t) { + return epochTime; } -void setTime(time_t t){ +void setTime(time_t t) { epochTime = t; } -#endif +#endif /* RTE_CMSIS_RTOS_RTX */ #ifdef WOLFSSL_CURRTIME_OSTICK @@ -143,28 +141,27 @@ double current_time(int reset) { - if(reset) os_time = 0 ; - return (double)os_time /1000.0; + if (reset) os_time = 0; + return (double)os_time /1000.0; } #else #include #define DWT ((DWT_Type *) (0xE0001000UL) ) -typedef struct -{ - uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ +typedef struct { + uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ } DWT_Type; -extern uint32_t SystemCoreClock ; +extern uint32_t SystemCoreClock; double current_time(int reset) { - if(reset) DWT->CYCCNT = 0 ; - return ((double)DWT->CYCCNT/SystemCoreClock) ; + if (reset) DWT->CYCCNT = 0; + return ((double)DWT->CYCCNT/SystemCoreClock); } -#endif +#endif /* WOLFSSL_CURRTIME_OSTICK */ /*---------------------------------------------------------------------------- Main Thread 'main': Run Network @@ -175,39 +172,42 @@ char** argv; } func_args; -extern void echoserver_test(func_args * args) ; +extern void echoserver_test(func_args * args); int myoptind = 0; char* myoptarg = NULL; -int main (void) { +int main (void) +{ static char *argv[] = - { "server" } ; - static func_args args = { 1, argv } ; + { "server" }; + static func_args args = { 1, argv }; - MPU_Config(); /* Configure the MPU */ - CPU_CACHE_Enable(); /* Enable the CPU Cache */ - HAL_Init(); /* Initialize the HAL Library */ - SystemClock_Config(); /* Configure the System Clock */ + MPU_Config(); /* Configure the MPU */ + CPU_CACHE_Enable(); /* Enable the CPU Cache */ + HAL_Init(); /* Initialize the HAL Library */ + SystemClock_Config(); /* Configure the System Clock */ - #if !defined(NO_FILESYSTEM) +#if !defined(NO_FILESYSTEM) init_filesystem (); - #endif +#endif net_initialize (); - #if defined(DEBUG_WOLFSSL) - printf("Turning ON Debug message\n") ; - wolfSSL_Debugging_ON() ; - #endif +#if defined(DEBUG_WOLFSSL) + printf("Turning ON Debug message\n"); + wolfSSL_Debugging_ON(); +#endif - setTime((RTC_YEAR-1970)*365*24*60*60 + RTC_MONTH*30*24*60*60 + RTC_DAY*24*60*60); + setTime((RTC_YEAR-1970)*365*24*60*60 + + RTC_MONTH*30*24*60*60 + + RTC_DAY*24*60*60); osThreadCreate (osThread(net_loop), NULL); - echoserver_test(&args) ; - printf("echoserver: Terminated\n") ; - while(1) - osDelay(1000); + echoserver_test(&args); + printf("echoserver: Terminated\n"); + while (1) { + osDelay(1000); + } } - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/RTE/wolfSSL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/RTE/wolfSSL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/RTE/wolfSSL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/RTE/wolfSSL/user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,497 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#define NO_MAIN_DRIVER -#define BENCH_EMBEDDED -#define NO_DEV_RANDOM -#define WOLFSSL_USER_CURRTIME -#define SIZEOF_LONG_LONG 8 -#define NO_WRITEV -#define NO_DEV_RANDOM - -#define TFM_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#define WC_RSA_BLINDING - -#define WOLFSSL_USER_CURRTIME /* for benchmark */ -#define WOLFSSL_CURRTIME_OSTICK /* use OS tich for current_time */ -#define WOLFSSL_GMTIME -#define NO_MULTIBYTE_PRINT - -// <<< Use Configuration Wizard in Context Menu >>> - - -// Common options -// MPU<0=>Undefined<1=>STM32F2xx<2=>STM32F4xx<3=>STM32F7xx -#define MDK_CONF_MPU 3 -#if MDK_CONF_MPU == 0 - -#elif MDK_CONF_MPU == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32F2xx -#elif MDK_CONF_MPU == 2 -#define WOLFSSL_STM32_CUBEMX -#define STM32F4xx -#elif MDK_CONF_MPU == 3 -#define WOLFSSL_STM32_CUBEMX -#define STM32F7xx -#endif - -// Thread/RTOS<0=>Single Threaded <1=>FreeRTOS <3=>SafeRTOS <4=>Windows -// <5=>PThread <6=>ThreadX -// <7=>Micrium <8=>EBSnet <9=>MQX -// <10=>T-RTOS <11=>uITRON4 <12=>uTKERNEL2 -// <13=>Frosted <14=>CMSIS RTOS <15=>CMSIS RTOSv2 <16=>Others -#define MDK_CONF_THREAD 15 -#if MDK_CONF_THREAD== 0 -#define SINGLE_THREADED -#elif MDK_CONF_THREAD == 1 -#define FREERTOS -#elif MDK_CONF_THREAD == 3 -#define WOLFSSL_SAFERTOS -#elif MDK_CONF_THREAD == 4 -#define USE_WINDOWS_API -#elif MDK_CONF_THREAD == 5 -#define WOLFSSL_PTHREADS -#elif MDK_CONF_THREAD == 6 -#define THREADX -#define NETX -#elif MDK_CONF_THREAD == 7 -#define MICRIUM -#elif MDK_CONF_THREAD == 8 -#define EBSNET -#elif MDK_CONF_THREAD == 9 -#define FREESCALE_MQX -#define FREESCALE_KSDK_MQX -#elif MDK_CONF_THREAD == 10 -#define WOLFSSL_TIRTOS -#elif MDK_CONF_THREAD == 11 -#define WOLFSSL_uITRON4 -#elif MDK_CONF_THREAD == 12 -#define WOLFSSL_uTKERNEL2 -#elif MDK_CONF_THREAD == 13 -#define WOLFSSL_FROSTED -#elif MDK_CONF_THREAD == 14 -#define WOLFSSL_CMSIS_RTOS -#elif MDK_CONF_THREAD == 15 -#define WOLFSSL_CMSIS_RTOSv2 -#elif MDK_CONF_THREAD == 16 -#define SINGLE_THREADED -#endif - - -// File System -#define MDK_CONF_FILESYSTEM 1 -#if MDK_CONF_FILESYSTEM == 0 -#define NO_FILESYSTEM -#else -#define WOLFSSL_KEIL_FS -#define NO_WOLFSSL_DIR -#endif -// - -// Network<0=>None <1=>RLnet <2=>User I/O -#define MDK_CONF_NETWORK 1 -#if MDK_CONF_NETWORK == 0 -#elif MDK_CONF_NETWORK == 1 -#define WOLFSSL_KEIL_TCP_NET -#elif MDK_CONF_NETWORK == 2 -#define WOLFSSL_USER_IO -#endif - -// Debug options - -// Debug Message -#define MDK_CONF_DebugMessage 0 -#if MDK_CONF_DebugMessage == 1 -#define DEBUG_WOLFSSL -#endif -// -// Check malloc -#define MDK_CONF_CheckMalloc 1 -#if MDK_CONF_CheckMalloc == 1 -#define WOLFSSL_MALLOC_CHECK -#define USE_WOLFSSL_MEMORY -#endif -// -// ErrNo.h -#define MDK_CONF_ErrNo 1 -#if MDK_CONF_ErrNo == 1 -#define HAVE_ERRNO -#endif -// -// Error Strings -#define MDK_CONF_ErrorStrings 1 -#if MDK_CONF_ErrorStrings == 0 -#define NO_ERROR_STRINGS -#endif -// - -// -// - -// wolfCrypt Configuration - -// Hash/Crypt Algrithm - -// MD2 -#define MDK_CONF_MD2 0 -#if MDK_CONF_MD2 == 1 -#define WOLFSSL_MD2 -#endif -// -// MD4 -#define MDK_CONF_MD4 0 -#if MDK_CONF_MD4 == 0 -#define NO_MD4 -#endif -// -// MD5 -#define MDK_CONF_MD5 1 -#if MDK_CONF_MD5 == 0 -#define NO_MD5 -#endif -// -// SHA -#define MDK_CONF_SHA 1 -#if MDK_CONF_SHA == 0 -#define NO_SHA -#endif -// -// SHA-256 -#define MDK_CONF_SHA256 1 -#if MDK_CONF_SHA256 == 0 -#define NO_SHA256 -#endif -// -// SHA-384 -#define MDK_CONF_SHA384 1 -#if MDK_CONF_SHA384 == 1 -#define WOLFSSL_SHA384 -#endif -// -// SHA-512 -#define MDK_CONF_SHA512 1 -#if MDK_CONF_SHA512 == 1 -#define WOLFSSL_SHA512 -#endif -// -// Hash DRBG -#define MDK_CONF_HASHDRBG 1 -#if MDK_CONF_HASHDRBG == 1 -#define HAVE_HASHDRBG -#endif -// -// RIPEMD -#define MDK_CONF_RIPEMD 1 -#if MDK_CONF_RIPEMD == 1 -#define WOLFSSL_RIPEMD -#endif -// -// BLAKE2 -#define MDK_CONF_BLAKE2 0 -#if MDK_CONF_BLAKE2 == 1 -#define HAVE_BLAKE2 -#endif -// -// HMAC -#define MDK_CONF_HMAC 1 -#if MDK_CONF_HMAC == 0 -#define NO_HMAC -#endif -// -// HMAC KDF -#define MDK_CONF_HKDF 1 -#if MDK_CONF_HKDF == 1 -#define HAVE_HKDF -#endif -// - -// AES CCM -#define MDK_CONF_AESCCM 1 -#if MDK_CONF_AESCCM == 1 -#define HAVE_AESCCM -#endif -// -// AES GCM -#define MDK_CONF_AESGCM 1 -#if MDK_CONF_AESGCM == 1 -#define HAVE_AESGCM -#endif -// - -// RC4 -#define MDK_CONF_RC4 0 -#if MDK_CONF_RC4 == 0 -#define NO_RC4 -#endif -// - -// CHACHA -#define MDK_CONF_CHACHA 1 -#if MDK_CONF_CHACHA == 1 -#define HAVE_CHACHA -#endif -// - -// POLY1305 -#define MDK_CONF_POLY1305 1 -#if MDK_CONF_POLY1305 == 1 -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH -#endif -// - -// DES3 -#define MDK_CONF_DES3 1 -#if MDK_CONF_DES3 == 0 -#define NO_DES3 -#endif -// - -// AES -#define MDK_CONF_AES 1 -#if MDK_CONF_AES == 0 -#define NO_AES -#endif -// - -// CAMELLIA -#define MDK_CONF_CAMELLIA 1 -#if MDK_CONF_CAMELLIA == 1 -#define HAVE_CAMELLIA -#endif -// - -// DH -#define MDK_CONF_DH 1 -#if MDK_CONF_DH == 0 -#define NO_DH -#endif -// -// DSA -#define MDK_CONF_DSA 1 -#if MDK_CONF_DSA == 0 -#define NO_DSA -#endif -// - -// SRP -#define MDK_CONF_SRP 1 -#if MDK_CONF_SRP == 1 -#define HAVE_SRP -#endif -// - -// PWDBASED -#define MDK_CONF_PWDBASED 1 -#if MDK_CONF_PWDBASED == 0 -#define NO_PWDBASED -#endif -// - -// ECC -#define MDK_CONF_ECC 1 -#if MDK_CONF_ECC == 1 -#define HAVE_ECC -#endif -// - -// CURVE25519 -#define MDK_CONF_CURVE25519 1 -#if MDK_CONF_CURVE25519 == 1 -#define HAVE_CURVE25519 -#define CURVED25519_SMALL -#endif -// -// CURVE25519 SMALL -#define MDK_CONF_CURVE25519_SMALL 0 -#if MDK_CONF_CURVE25519_SMALL == 1 -#define CURVED25519_SMALL -#endif -// -// ED25519 -#define MDK_CONF_ED25519 1 -#if MDK_CONF_ED25519 == 1 -#define HAVE_ED25519 -#endif -// -// ED25519 SMALL -#define MDK_CONF_ED25519_SMALL 0 -#if MDK_CONF_ED25519_SMALL == 1 -#define ED25519_SMALL -#endif -// -// PKCS7 -#define MDK_CONF_PKCS7 0 -#if MDK_CONF_PKCS7 == 1 -#define HAVE_PKCS7 -#endif -// -// - -// Random Seed, for TEST Only -#define MDK_CONF_RNDSEED 1 -#if MDK_CONF_RNDSEED == 1 -#define WOLFSSL_GENSEED_FORTEST -#endif -// - -// Hardware Crypt (See document for usage) -// Hardware RNG -#define MDK_CONF_STM32F2_RNG 0 -#if MDK_CONF_STM32F2_RNG == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_RNG -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Crypt -#define MDK_CONF_STM32F2_CRYPTO 0 -#if MDK_CONF_STM32F2_CRYPTO == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_CRYPTO -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Hash -#define MDK_CONF_STM32F2_HASH 0 -#if MDK_CONF_STM32F2_HASH == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_HASH -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// - -// Cert/Key Strage -// Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) -#define MDK_CONF_CERT_BUFF 0 -#if MDK_CONF_CERT_BUFF== 1 -#define USE_CERT_BUFFERS_1024 -#elif MDK_CONF_CERT_BUFF == 2 -#define USE_CERT_BUFFERS_2048 -#endif -// -// Cert/Key Generation -// CertGen -#define MDK_CONF_CERT_GEN 0 -#if MDK_CONF_CERT_GEN == 1 -#define WOLFSSL_CERT_GEN -#endif -// -// KeyGen -#define MDK_CONF_KEY_GEN 0 -#if MDK_CONF_KEY_GEN == 1 -#define WOLFSSL_KEY_GEN -#endif -// -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// - -// - - -/**** wolfSSL Configuration ****/ - -// wolfSSL Configuration - -// TLS 1.3 -#define MDK_CONF_TLS 1 -#if MDK_CONF_TLS == 1 -#define WOLFSSL_TLS13 -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define WC_RSA_PSS -#define HAVE_HKDF -#define HAVE_FFDHE_2048 -#endif -// - -// Include Old TLS -#define MDK_CONF_NO_OLDTLS 0 -#if MDK_CONF_NO_OLDTLS == 0 -#define NO_OLD_TLS -#endif -// -// CRL -#define MDK_CONF_CRL 0 -#if MDK_CONF_CRL == 1 -#define HAVE_CRL -#define WOLFSSL_DER_LOAD -#endif -// -// OCSP -#define MDK_CONF_OCSP 0 -#if MDK_CONF_OCSP == 1 -#define HAVE_OCSP -#endif -// -// OpenSSL Extra -#define MDK_CONF_OPENSSL_EXTRA 0 -#if MDK_CONF_OPENSSL_EXTRA == 1 -#define OPENSSL_EXTRA -#endif -// - -// diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvoptx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvoptx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvoptx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvoptx 2024-08-03 07:30:00.000000000 +0000 @@ -298,7 +298,7 @@ 0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/SimpleClient.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -413,7 +413,7 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h @@ -912,7 +912,7 @@ - RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleClient/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -68,12 +68,9 @@ // // RTC: for validate certificate date -// Year <1970-2099> -#define RTC_YEAR 2019 -// Month <1=>Jan<2=>Feb<3=>Mar<4=>Apr<5=>May<6=>Jun<7=>Jul<8=>Aug<9=>Sep<10=>Oct<11=>Nov<12=>Dec +#define RTC_YEAR 2023 #define RTC_MONTH 1 -// Day <1-31> -#define RTC_DAY 1 +#define RTC_DAY 1 // //------------- <<< end of configuration section >>> ----------------------- @@ -96,19 +93,19 @@ #endif uint32_t HAL_GetTick(void) { - #if defined(WOLFSSL_CMSIS_RTOS) - return os_time; - #elif defined(WOLFSSL_CMSIS_RTOSv2) - return osKernelGetTickCount(); - #endif +#if defined(WOLFSSL_CMSIS_RTOS) + return os_time; +#elif defined(WOLFSSL_CMSIS_RTOSv2) + return osKernelGetTickCount(); +#endif } static time_t epochTime; -time_t time(time_t *t){ - return epochTime ; +time_t time(time_t *t) { + return epochTime; } -void setTime(time_t t){ +void setTime(time_t t) { epochTime = t; } @@ -129,22 +126,23 @@ #if !defined(NO_FILESYSTEM) #include "rl_fs.h" /* FileSystem definitions */ -static void init_filesystem (void) { - int32_t retv; +static void init_filesystem(void) +{ + int32_t retv; - retv = finit ("M0:"); - if (retv == fsOK) { - retv = fmount ("M0:"); + retv = finit ("M0:"); if (retv == fsOK) { - printf ("Drive M0 ready!\n"); + retv = fmount ("M0:"); + if (retv == fsOK) { + printf ("Drive M0 ready!\n"); + } + else { + printf ("Drive M0 mount failed(%d)!\n", retv); + } } else { - printf ("Drive M0 mount failed(%d)!\n", retv); + printf ("Drive M0 initialization failed!\n"); } - } - else { - printf ("Drive M0 initialization failed!\n"); - } } #endif @@ -156,9 +154,10 @@ void app_main(void const*arg) #endif { - if(netInitialize () == netOK) - client_test(arg); - else printf("ERROR: netInitialize\n"); + if (netInitialize () == netOK) + client_test(arg); + else + printf("ERROR: netInitialize\n"); } #if defined(WOLFSSL_CMSIS_RTOS) @@ -178,48 +177,51 @@ int myoptind = 0; char* myoptarg = NULL; -int main (void) { +int main (void) +{ static char *argv[] = { "client", "-h", REMOTE_IP, "-p", REMOTE_PORT, - "-v", " ", OTHER_OPTIONS } ; + "-v", " ", OTHER_OPTIONS }; static func_args args = - { sizeof(argv)/sizeof(*argv[0]), argv } ; + { sizeof(argv)/sizeof(*argv[0]), argv }; char *verStr[] = { "SSL3", "TLS1.0", "TLS1.1", "TLS1.2", "TLS1.3"}; #define VERSIZE 2 static char ver[VERSIZE]; - - MPU_Config(); /* Configure the MPU */ - CPU_CACHE_Enable(); /* Enable the CPU Cache */ - HAL_Init(); /* Initialize the HAL Library */ - SystemClock_Config(); /* Configure the System Clock */ - #if defined(WOLFSSL_CMSIS_RTOSv2) + + MPU_Config(); /* Configure the MPU */ + CPU_CACHE_Enable(); /* Enable the CPU Cache */ + HAL_Init(); /* Initialize the HAL Library */ + SystemClock_Config(); /* Configure the System Clock */ +#if defined(WOLFSSL_CMSIS_RTOSv2) osKernelInitialize(); - #endif - - #if !defined(NO_FILESYSTEM) +#endif + +#if !defined(NO_FILESYSTEM) init_filesystem (); - #endif +#endif - #if defined(DEBUG_WOLFSSL) - printf("Turning ON Debug message\n") ; - wolfSSL_Debugging_ON() ; - #endif +#if defined(DEBUG_WOLFSSL) + printf("Turning ON Debug message\n"); + wolfSSL_Debugging_ON(); +#endif snprintf(ver, VERSIZE, "%d", TLS_VER); argv[6] = ver; - printf("SSL/TLS Client(%d)\n ", (int)(sizeof(argv)/sizeof(argv[0]))) ; - printf(" Remote IP: %s, Port: %s\n Version: %s\n", argv[2], argv[4], verStr[TLS_VER]) ; - printf(" Other options: %s\n", OTHER_OPTIONS); - setTime((time_t)((RTC_YEAR-1970)*365*24*60*60) + RTC_MONTH*30*24*60*60 + RTC_DAY*24*60*60); - - #if defined(WOLFSSL_CMSIS_RTOS) - osThreadCreate (osThread(app_main), (void *)&args); - #elif defined(WOLFSSL_CMSIS_RTOSv2) - osThreadNew(app_main, (void *)&args, NULL); - #endif - osKernelStart(); + printf("SSL/TLS Client(%d)\n ", (int)(sizeof(argv)/sizeof(argv[0]))); + printf(" Remote IP: %s, Port: %s\n Version: %s\n", + argv[2], argv[4], verStr[TLS_VER]); + printf(" Other options: %s\n", OTHER_OPTIONS); + setTime((time_t)((RTC_YEAR-1970)*365*24*60*60) + + RTC_MONTH*30*24*60*60 + + RTC_DAY*24*60*60); +#if defined(WOLFSSL_CMSIS_RTOS) + osThreadCreate (osThread(app_main), (void *)&args); +#elif defined(WOLFSSL_CMSIS_RTOSv2) + osThreadNew(app_main, (void *)&args, NULL); +#endif + osKernelStart(); } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/RTE/wolfSSL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/RTE/wolfSSL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/RTE/wolfSSL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/RTE/wolfSSL/user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,497 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#define NO_MAIN_DRIVER -#define BENCH_EMBEDDED -#define NO_DEV_RANDOM -#define WOLFSSL_USER_CURRTIME -#define SIZEOF_LONG_LONG 8 -#define NO_WRITEV -#define NO_DEV_RANDOM - -#define TFM_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#define WC_RSA_BLINDING - -#define WOLFSSL_USER_CURRTIME /* for benchmark */ -#define WOLFSSL_CURRTIME_OSTICK /* use OS tich for current_time */ -#define WOLFSSL_GMTIME -#define NO_MULTIBYTE_PRINT - -// <<< Use Configuration Wizard in Context Menu >>> - - -// Common options -// MPU<0=>Undefined<1=>STM32F2xx<2=>STM32F4xx<3=>STM32F7xx -#define MDK_CONF_MPU 3 -#if MDK_CONF_MPU == 0 - -#elif MDK_CONF_MPU == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32F2xx -#elif MDK_CONF_MPU == 2 -#define WOLFSSL_STM32_CUBEMX -#define STM32F4xx -#elif MDK_CONF_MPU == 3 -#define WOLFSSL_STM32_CUBEMX -#define STM32F7xx -#endif - -// Thread/RTOS<0=>Single Threaded <1=>FreeRTOS <3=>SafeRTOS <4=>Windows -// <5=>PThread <6=>ThreadX -// <7=>Micrium <8=>EBSnet <9=>MQX -// <10=>T-RTOS <11=>uITRON4 <12=>uTKERNEL2 -// <13=>Frosted <14=>CMSIS RTOS <15=>CMSIS RTOSv2 <16=>Others -#define MDK_CONF_THREAD 15 -#if MDK_CONF_THREAD== 0 -#define SINGLE_THREADED -#elif MDK_CONF_THREAD == 1 -#define FREERTOS -#elif MDK_CONF_THREAD == 3 -#define WOLFSSL_SAFERTOS -#elif MDK_CONF_THREAD == 4 -#define USE_WINDOWS_API -#elif MDK_CONF_THREAD == 5 -#define WOLFSSL_PTHREADS -#elif MDK_CONF_THREAD == 6 -#define THREADX -#define NETX -#elif MDK_CONF_THREAD == 7 -#define MICRIUM -#elif MDK_CONF_THREAD == 8 -#define EBSNET -#elif MDK_CONF_THREAD == 9 -#define FREESCALE_MQX -#define FREESCALE_KSDK_MQX -#elif MDK_CONF_THREAD == 10 -#define WOLFSSL_TIRTOS -#elif MDK_CONF_THREAD == 11 -#define WOLFSSL_uITRON4 -#elif MDK_CONF_THREAD == 12 -#define WOLFSSL_uTKERNEL2 -#elif MDK_CONF_THREAD == 13 -#define WOLFSSL_FROSTED -#elif MDK_CONF_THREAD == 14 -#define WOLFSSL_CMSIS_RTOS -#elif MDK_CONF_THREAD == 15 -#define WOLFSSL_CMSIS_RTOSv2 -#elif MDK_CONF_THREAD == 16 -#define SINGLE_THREADED -#endif - - -// File System -#define MDK_CONF_FILESYSTEM 1 -#if MDK_CONF_FILESYSTEM == 0 -#define NO_FILESYSTEM -#else -#define WOLFSSL_KEIL_FS -#define NO_WOLFSSL_DIR -#endif -// - -// Network<0=>None <1=>RLnet <2=>User I/O -#define MDK_CONF_NETWORK 1 -#if MDK_CONF_NETWORK == 0 -#elif MDK_CONF_NETWORK == 1 -#define WOLFSSL_KEIL_TCP_NET -#elif MDK_CONF_NETWORK == 2 -#define WOLFSSL_USER_IO -#endif - -// Debug options - -// Debug Message -#define MDK_CONF_DebugMessage 0 -#if MDK_CONF_DebugMessage == 1 -#define DEBUG_WOLFSSL -#endif -// -// Check malloc -#define MDK_CONF_CheckMalloc 1 -#if MDK_CONF_CheckMalloc == 1 -#define WOLFSSL_MALLOC_CHECK -#define USE_WOLFSSL_MEMORY -#endif -// -// ErrNo.h -#define MDK_CONF_ErrNo 1 -#if MDK_CONF_ErrNo == 1 -#define HAVE_ERRNO -#endif -// -// Error Strings -#define MDK_CONF_ErrorStrings 1 -#if MDK_CONF_ErrorStrings == 0 -#define NO_ERROR_STRINGS -#endif -// - -// -// - -// wolfCrypt Configuration - -// Hash/Crypt Algrithm - -// MD2 -#define MDK_CONF_MD2 0 -#if MDK_CONF_MD2 == 1 -#define WOLFSSL_MD2 -#endif -// -// MD4 -#define MDK_CONF_MD4 0 -#if MDK_CONF_MD4 == 0 -#define NO_MD4 -#endif -// -// MD5 -#define MDK_CONF_MD5 1 -#if MDK_CONF_MD5 == 0 -#define NO_MD5 -#endif -// -// SHA -#define MDK_CONF_SHA 1 -#if MDK_CONF_SHA == 0 -#define NO_SHA -#endif -// -// SHA-256 -#define MDK_CONF_SHA256 1 -#if MDK_CONF_SHA256 == 0 -#define NO_SHA256 -#endif -// -// SHA-384 -#define MDK_CONF_SHA384 1 -#if MDK_CONF_SHA384 == 1 -#define WOLFSSL_SHA384 -#endif -// -// SHA-512 -#define MDK_CONF_SHA512 1 -#if MDK_CONF_SHA512 == 1 -#define WOLFSSL_SHA512 -#endif -// -// Hash DRBG -#define MDK_CONF_HASHDRBG 1 -#if MDK_CONF_HASHDRBG == 1 -#define HAVE_HASHDRBG -#endif -// -// RIPEMD -#define MDK_CONF_RIPEMD 1 -#if MDK_CONF_RIPEMD == 1 -#define WOLFSSL_RIPEMD -#endif -// -// BLAKE2 -#define MDK_CONF_BLAKE2 0 -#if MDK_CONF_BLAKE2 == 1 -#define HAVE_BLAKE2 -#endif -// -// HMAC -#define MDK_CONF_HMAC 1 -#if MDK_CONF_HMAC == 0 -#define NO_HMAC -#endif -// -// HMAC KDF -#define MDK_CONF_HKDF 1 -#if MDK_CONF_HKDF == 1 -#define HAVE_HKDF -#endif -// - -// AES CCM -#define MDK_CONF_AESCCM 1 -#if MDK_CONF_AESCCM == 1 -#define HAVE_AESCCM -#endif -// -// AES GCM -#define MDK_CONF_AESGCM 1 -#if MDK_CONF_AESGCM == 1 -#define HAVE_AESGCM -#endif -// - -// RC4 -#define MDK_CONF_RC4 0 -#if MDK_CONF_RC4 == 0 -#define NO_RC4 -#endif -// - -// CHACHA -#define MDK_CONF_CHACHA 1 -#if MDK_CONF_CHACHA == 1 -#define HAVE_CHACHA -#endif -// - -// POLY1305 -#define MDK_CONF_POLY1305 1 -#if MDK_CONF_POLY1305 == 1 -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH -#endif -// - -// DES3 -#define MDK_CONF_DES3 1 -#if MDK_CONF_DES3 == 0 -#define NO_DES3 -#endif -// - -// AES -#define MDK_CONF_AES 1 -#if MDK_CONF_AES == 0 -#define NO_AES -#endif -// - -// CAMELLIA -#define MDK_CONF_CAMELLIA 1 -#if MDK_CONF_CAMELLIA == 1 -#define HAVE_CAMELLIA -#endif -// - -// DH -#define MDK_CONF_DH 1 -#if MDK_CONF_DH == 0 -#define NO_DH -#endif -// -// DSA -#define MDK_CONF_DSA 1 -#if MDK_CONF_DSA == 0 -#define NO_DSA -#endif -// - -// SRP -#define MDK_CONF_SRP 1 -#if MDK_CONF_SRP == 1 -#define HAVE_SRP -#endif -// - -// PWDBASED -#define MDK_CONF_PWDBASED 1 -#if MDK_CONF_PWDBASED == 0 -#define NO_PWDBASED -#endif -// - -// ECC -#define MDK_CONF_ECC 1 -#if MDK_CONF_ECC == 1 -#define HAVE_ECC -#endif -// - -// CURVE25519 -#define MDK_CONF_CURVE25519 1 -#if MDK_CONF_CURVE25519 == 1 -#define HAVE_CURVE25519 -#define CURVED25519_SMALL -#endif -// -// CURVE25519 SMALL -#define MDK_CONF_CURVE25519_SMALL 0 -#if MDK_CONF_CURVE25519_SMALL == 1 -#define CURVED25519_SMALL -#endif -// -// ED25519 -#define MDK_CONF_ED25519 1 -#if MDK_CONF_ED25519 == 1 -#define HAVE_ED25519 -#endif -// -// ED25519 SMALL -#define MDK_CONF_ED25519_SMALL 0 -#if MDK_CONF_ED25519_SMALL == 1 -#define ED25519_SMALL -#endif -// -// PKCS7 -#define MDK_CONF_PKCS7 0 -#if MDK_CONF_PKCS7 == 1 -#define HAVE_PKCS7 -#endif -// -// - -// Random Seed, for TEST Only -#define MDK_CONF_RNDSEED 1 -#if MDK_CONF_RNDSEED == 1 -#define WOLFSSL_GENSEED_FORTEST -#endif -// - -// Hardware Crypt (See document for usage) -// Hardware RNG -#define MDK_CONF_STM32F2_RNG 0 -#if MDK_CONF_STM32F2_RNG == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_RNG -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Crypt -#define MDK_CONF_STM32F2_CRYPTO 0 -#if MDK_CONF_STM32F2_CRYPTO == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_CRYPTO -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Hash -#define MDK_CONF_STM32F2_HASH 0 -#if MDK_CONF_STM32F2_HASH == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_HASH -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// - -// Cert/Key Strage -// Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) -#define MDK_CONF_CERT_BUFF 0 -#if MDK_CONF_CERT_BUFF== 1 -#define USE_CERT_BUFFERS_1024 -#elif MDK_CONF_CERT_BUFF == 2 -#define USE_CERT_BUFFERS_2048 -#endif -// -// Cert/Key Generation -// CertGen -#define MDK_CONF_CERT_GEN 0 -#if MDK_CONF_CERT_GEN == 1 -#define WOLFSSL_CERT_GEN -#endif -// -// KeyGen -#define MDK_CONF_KEY_GEN 0 -#if MDK_CONF_KEY_GEN == 1 -#define WOLFSSL_KEY_GEN -#endif -// -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// - -// - - -/**** wolfSSL Configuration ****/ - -// wolfSSL Configuration - -// TLS 1.3 -#define MDK_CONF_TLS 1 -#if MDK_CONF_TLS == 1 -#define WOLFSSL_TLS13 -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define WC_RSA_PSS -#define HAVE_HKDF -#define HAVE_FFDHE_2048 -#endif -// - -// Include Old TLS -#define MDK_CONF_NO_OLDTLS 0 -#if MDK_CONF_NO_OLDTLS == 0 -#define NO_OLD_TLS -#endif -// -// CRL -#define MDK_CONF_CRL 0 -#if MDK_CONF_CRL == 1 -#define HAVE_CRL -#define WOLFSSL_DER_LOAD -#endif -// -// OCSP -#define MDK_CONF_OCSP 0 -#if MDK_CONF_OCSP == 1 -#define HAVE_OCSP -#endif -// -// OpenSSL Extra -#define MDK_CONF_OPENSSL_EXTRA 0 -#if MDK_CONF_OPENSSL_EXTRA == 1 -#define OPENSSL_EXTRA -#endif -// - -// diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvoptx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvoptx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvoptx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvoptx 2024-08-03 07:30:00.000000000 +0000 @@ -298,7 +298,7 @@ 0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/SimpleServer.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -413,7 +413,7 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h @@ -912,7 +912,7 @@ - RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/SimpleServer/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -66,11 +66,9 @@ // RTC: for validate certificate date // Year <1970-2099> -#define RTC_YEAR 2019 -// Month <1=>Jan<2=>Feb<3=>Mar<4=>Apr<5=>May<6=>Jun<7=>Jul<8=>Aut<9=>Sep<10=>Oct<11=>Nov<12=>Dec +#define RTC_YEAR 2023 #define RTC_MONTH 1 -// Day <1-31> -#define RTC_DAY 1 +#define RTC_DAY 1 // //------------- <<< end of configuration section >>> ----------------------- @@ -94,22 +92,23 @@ #if !defined(NO_FILESYSTEM) #include "rl_fs.h" /* FileSystem definitions */ -static void init_filesystem (void) { - int32_t retv; +static void init_filesystem(void) +{ + int32_t retv; - retv = finit ("M0:"); - if (retv == fsOK) { - retv = fmount ("M0:"); + retv = finit ("M0:"); if (retv == fsOK) { - printf ("Drive M0 ready!\n"); + retv = fmount ("M0:"); + if (retv == fsOK) { + printf ("Drive M0 ready!\n"); + } + else { + printf ("Drive M0 mount failed(%d)!\n", retv); + } } else { - printf ("Drive M0 mount failed(%d)!\n", retv); + printf ("Drive M0 initialization failed!\n"); } - } - else { - printf ("Drive M0 initialization failed!\n"); - } } #endif @@ -121,20 +120,20 @@ uint32_t HAL_GetTick(void) { - #if defined(WOLFSSL_CMSIS_RTOS) - return os_time; - #elif defined(WOLFSSL_CMSIS_RTOSv2) - return osKernelGetTickCount(); - #endif +#if defined(WOLFSSL_CMSIS_RTOS) + return os_time; +#elif defined(WOLFSSL_CMSIS_RTOSv2) + return osKernelGetTickCount(); +#endif } double current_time(int reset) { - #if defined(WOLFSSL_CMSIS_RTOS) - return (double)os_time / 1000.0; - #elif defined(WOLFSSL_CMSIS_RTOSv2) - return (double)osKernelGetTickCount() / 1000.0; - #endif +#if defined(WOLFSSL_CMSIS_RTOS) + return (double)os_time / 1000.0; +#elif defined(WOLFSSL_CMSIS_RTOSv2) + return (double)osKernelGetTickCount() / 1000.0; +#endif } #else @@ -143,8 +142,8 @@ #define DWT ((DWT_Type *) (0xE0001000UL) ) typedef struct { - uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ } DWT_Type; extern uint32_t SystemCoreClock; @@ -203,22 +202,22 @@ { static char *argv[] = { "server", "-p", SERVER_PORT, - "-v", " ", OTHER_OPTIONS } ; + "-v", " ", OTHER_OPTIONS }; static func_args args = - { sizeof(argv)/sizeof(*argv[0]), argv } ; + { sizeof(argv)/sizeof(*argv[0]), argv }; char *verStr[] = { "SSL3", "TLS1.0", "TLS1.1", "TLS1.2", "TLS1.3"}; #define VERSIZE 2 char ver[VERSIZE]; - + MPU_Config(); /* Configure the MPU */ CPU_CACHE_Enable(); /* Enable the CPU Cache */ HAL_Init(); /* Initialize the HAL Library */ SystemClock_Config(); /* Configure the System Clock */ - #if !defined(NO_FILESYSTEM) +#if !defined(NO_FILESYSTEM) init_filesystem (); - #endif +#endif #if defined(WOLFSSL_CMSIS_RTOSv2) osKernelInitialize(); @@ -232,10 +231,12 @@ snprintf(ver, VERSIZE, "%d", TLS_VER); argv[4] = ver; - printf("SSL/TLS Server\n ") ; - printf(" Server Port: %s\n Version: %s\n", argv[2], verStr[TLS_VER]) ; - printf(" Other options: %s\n", OTHER_OPTIONS); - setTime((RTC_YEAR-1970)*365*24*60*60 + RTC_MONTH*30*24*60*60 + RTC_DAY*24*60*60); + printf("SSL/TLS Server\n "); + printf(" Server Port: %s\n Version: %s\n", argv[2], verStr[TLS_VER]); + printf(" Other options: %s\n", OTHER_OPTIONS); + setTime((RTC_YEAR-1970)*365*24*60*60 + + RTC_MONTH*30*24*60*60 + + RTC_DAY*24*60*60); #if defined(WOLFSSL_CMSIS_RTOS) osThreadCreate(osThread(app_main), (void *)&args); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -51,22 +51,24 @@ *----------------------------------------------------------------------------*/ #if !defined(NO_FILESYSTEM) #include "rl_fs.h" -static void init_filesystem (void) { - int32_t retv; - retv = finit ("M0:"); - if (retv == 0) { - retv = fmount ("M0:"); - if (retv == 0) { - printf ("Drive M0 ready!\n"); +static void init_filesystem(void) +{ + int32_t retv; + + retv = finit ("M0:"); + if (retv == fsOK) { + retv = fmount ("M0:"); + if (retv == fsOK) { + printf ("Drive M0 ready!\n"); + } + else { + printf ("Drive M0 mount failed(%d)!\n", retv); + } } else { - printf ("Drive M0 mount failed!\n"); + printf ("Drive M0 initialization failed!\n"); } - } - else { - printf ("Drive M0 initialization failed!\n"); - } } #endif @@ -76,31 +78,31 @@ } func_args; -extern void shell_main(func_args * args) ; +extern void shell_main(func_args * args); /*----------------------------------------------------------------------------- - * mian entry + * main entry *----------------------------------------------------------------------------*/ int myoptind = 0; char* myoptarg = NULL; int main() { - void *arg = NULL ; + void *arg = NULL; - SystemClock_Config() ; - #if !defined(NO_FILESYSTEM) + SystemClock_Config(); + #if !defined(NO_FILESYSTEM) init_filesystem (); - #endif + #endif - netInitialize() ; - osDelay(300) ; + netInitialize(); + osDelay(300); - #if defined(DEBUG_WOLFSSL) - printf("Turning ON Debug message\n") ; - wolfSSL_Debugging_ON() ; - #endif +#if defined(DEBUG_WOLFSSL) + printf("Turning ON Debug message\n"); + wolfSSL_Debugging_ON(); +#endif - shell_main(arg) ; + shell_main(arg); } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/shell.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/shell.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/shell.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/shell.c 2024-08-03 07:30:00.000000000 +0000 @@ -308,7 +308,7 @@ "", NULL } ; -enum jobtype { FORGROUND, BACKGROUND } ; +enum jobtype { FOREGROUND, BACKGROUND } ; #define IF_DELIMITER(ch) ((ch) == ' ' || (ch) == '\n') @@ -368,7 +368,7 @@ (*bf_flg) = BACKGROUND ; line[strlen(line)-2] = '\n' ; } else { - (*bf_flg) = FORGROUND ; + (*bf_flg) = FOREGROUND ; } args->argc = 0 ; for(i=0; i0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 @@ -308,7 +308,7 @@ - Dcumentation + Documentation 1 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/wolfsslFull.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/wolfsslFull.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/wolfsslFull.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Full/wolfsslFull.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -441,12 +441,12 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h - Dcumentation + Documentation Abstract.txt @@ -972,7 +972,7 @@ - RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/RTE/wolfSSL/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/RTE/wolfSSL/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/RTE/wolfSSL/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/RTE/wolfSSL/user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,497 +0,0 @@ -/* user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#define NO_MAIN_DRIVER -#define BENCH_EMBEDDED -#define NO_DEV_RANDOM -#define WOLFSSL_USER_CURRTIME -#define SIZEOF_LONG_LONG 8 -#define NO_WRITEV -#define NO_DEV_RANDOM - -#define TFM_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#define WC_RSA_BLINDING - -#define WOLFSSL_USER_CURRTIME /* for benchmark */ -#define WOLFSSL_CURRTIME_OSTICK /* use OS tich for current_time */ -#define WOLFSSL_GMTIME -#define NO_MULTIBYTE_PRINT - -// <<< Use Configuration Wizard in Context Menu >>> - - -// Common options -// MPU<0=>Undefined<1=>STM32F2xx<2=>STM32F4xx<3=>STM32F7xx -#define MDK_CONF_MPU 3 -#if MDK_CONF_MPU == 0 - -#elif MDK_CONF_MPU == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32F2xx -#elif MDK_CONF_MPU == 2 -#define WOLFSSL_STM32_CUBEMX -#define STM32F4xx -#elif MDK_CONF_MPU == 3 -#define WOLFSSL_STM32_CUBEMX -#define STM32F7xx -#endif - -// Thread/RTOS<0=>Single Threaded <1=>FreeRTOS <3=>SafeRTOS <4=>Windows -// <5=>PThread <6=>ThreadX -// <7=>Micrium <8=>EBSnet <9=>MQX -// <10=>T-RTOS <11=>uITRON4 <12=>uTKERNEL2 -// <13=>Frosted <14=>CMSIS RTOS <15=>CMSIS RTOSv2 <16=>Others -#define MDK_CONF_THREAD 15 -#if MDK_CONF_THREAD== 0 -#define SINGLE_THREADED -#elif MDK_CONF_THREAD == 1 -#define FREERTOS -#elif MDK_CONF_THREAD == 3 -#define WOLFSSL_SAFERTOS -#elif MDK_CONF_THREAD == 4 -#define USE_WINDOWS_API -#elif MDK_CONF_THREAD == 5 -#define WOLFSSL_PTHREADS -#elif MDK_CONF_THREAD == 6 -#define THREADX -#define NETX -#elif MDK_CONF_THREAD == 7 -#define MICRIUM -#elif MDK_CONF_THREAD == 8 -#define EBSNET -#elif MDK_CONF_THREAD == 9 -#define FREESCALE_MQX -#define FREESCALE_KSDK_MQX -#elif MDK_CONF_THREAD == 10 -#define WOLFSSL_TIRTOS -#elif MDK_CONF_THREAD == 11 -#define WOLFSSL_uITRON4 -#elif MDK_CONF_THREAD == 12 -#define WOLFSSL_uTKERNEL2 -#elif MDK_CONF_THREAD == 13 -#define WOLFSSL_FROSTED -#elif MDK_CONF_THREAD == 14 -#define WOLFSSL_CMSIS_RTOS -#elif MDK_CONF_THREAD == 15 -#define WOLFSSL_CMSIS_RTOSv2 -#elif MDK_CONF_THREAD == 16 -#define SINGLE_THREADED -#endif - - -// File System -#define MDK_CONF_FILESYSTEM 1 -#if MDK_CONF_FILESYSTEM == 0 -#define NO_FILESYSTEM -#else -#define WOLFSSL_KEIL_FS -#define NO_WOLFSSL_DIR -#endif -// - -// Network<0=>None <1=>RLnet <2=>User I/O -#define MDK_CONF_NETWORK 1 -#if MDK_CONF_NETWORK == 0 -#elif MDK_CONF_NETWORK == 1 -#define WOLFSSL_KEIL_TCP_NET -#elif MDK_CONF_NETWORK == 2 -#define WOLFSSL_USER_IO -#endif - -// Debug options - -// Debug Message -#define MDK_CONF_DebugMessage 0 -#if MDK_CONF_DebugMessage == 1 -#define DEBUG_WOLFSSL -#endif -// -// Check malloc -#define MDK_CONF_CheckMalloc 1 -#if MDK_CONF_CheckMalloc == 1 -#define WOLFSSL_MALLOC_CHECK -#define USE_WOLFSSL_MEMORY -#endif -// -// ErrNo.h -#define MDK_CONF_ErrNo 1 -#if MDK_CONF_ErrNo == 1 -#define HAVE_ERRNO -#endif -// -// Error Strings -#define MDK_CONF_ErrorStrings 1 -#if MDK_CONF_ErrorStrings == 0 -#define NO_ERROR_STRINGS -#endif -// - -// -// - -// wolfCrypt Configuration - -// Hash/Crypt Algrithm - -// MD2 -#define MDK_CONF_MD2 0 -#if MDK_CONF_MD2 == 1 -#define WOLFSSL_MD2 -#endif -// -// MD4 -#define MDK_CONF_MD4 0 -#if MDK_CONF_MD4 == 0 -#define NO_MD4 -#endif -// -// MD5 -#define MDK_CONF_MD5 1 -#if MDK_CONF_MD5 == 0 -#define NO_MD5 -#endif -// -// SHA -#define MDK_CONF_SHA 1 -#if MDK_CONF_SHA == 0 -#define NO_SHA -#endif -// -// SHA-256 -#define MDK_CONF_SHA256 1 -#if MDK_CONF_SHA256 == 0 -#define NO_SHA256 -#endif -// -// SHA-384 -#define MDK_CONF_SHA384 1 -#if MDK_CONF_SHA384 == 1 -#define WOLFSSL_SHA384 -#endif -// -// SHA-512 -#define MDK_CONF_SHA512 1 -#if MDK_CONF_SHA512 == 1 -#define WOLFSSL_SHA512 -#endif -// -// Hash DRBG -#define MDK_CONF_HASHDRBG 1 -#if MDK_CONF_HASHDRBG == 1 -#define HAVE_HASHDRBG -#endif -// -// RIPEMD -#define MDK_CONF_RIPEMD 1 -#if MDK_CONF_RIPEMD == 1 -#define WOLFSSL_RIPEMD -#endif -// -// BLAKE2 -#define MDK_CONF_BLAKE2 0 -#if MDK_CONF_BLAKE2 == 1 -#define HAVE_BLAKE2 -#endif -// -// HMAC -#define MDK_CONF_HMAC 1 -#if MDK_CONF_HMAC == 0 -#define NO_HMAC -#endif -// -// HMAC KDF -#define MDK_CONF_HKDF 1 -#if MDK_CONF_HKDF == 1 -#define HAVE_HKDF -#endif -// - -// AES CCM -#define MDK_CONF_AESCCM 1 -#if MDK_CONF_AESCCM == 1 -#define HAVE_AESCCM -#endif -// -// AES GCM -#define MDK_CONF_AESGCM 1 -#if MDK_CONF_AESGCM == 1 -#define HAVE_AESGCM -#endif -// - -// RC4 -#define MDK_CONF_RC4 0 -#if MDK_CONF_RC4 == 0 -#define NO_RC4 -#endif -// - -// CHACHA -#define MDK_CONF_CHACHA 1 -#if MDK_CONF_CHACHA == 1 -#define HAVE_CHACHA -#endif -// - -// POLY1305 -#define MDK_CONF_POLY1305 1 -#if MDK_CONF_POLY1305 == 1 -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH -#endif -// - -// DES3 -#define MDK_CONF_DES3 1 -#if MDK_CONF_DES3 == 0 -#define NO_DES3 -#endif -// - -// AES -#define MDK_CONF_AES 1 -#if MDK_CONF_AES == 0 -#define NO_AES -#endif -// - -// CAMELLIA -#define MDK_CONF_CAMELLIA 1 -#if MDK_CONF_CAMELLIA == 1 -#define HAVE_CAMELLIA -#endif -// - -// DH -#define MDK_CONF_DH 1 -#if MDK_CONF_DH == 0 -#define NO_DH -#endif -// -// DSA -#define MDK_CONF_DSA 1 -#if MDK_CONF_DSA == 0 -#define NO_DSA -#endif -// - -// SRP -#define MDK_CONF_SRP 1 -#if MDK_CONF_SRP == 1 -#define HAVE_SRP -#endif -// - -// PWDBASED -#define MDK_CONF_PWDBASED 1 -#if MDK_CONF_PWDBASED == 0 -#define NO_PWDBASED -#endif -// - -// ECC -#define MDK_CONF_ECC 1 -#if MDK_CONF_ECC == 1 -#define HAVE_ECC -#endif -// - -// CURVE25519 -#define MDK_CONF_CURVE25519 1 -#if MDK_CONF_CURVE25519 == 1 -#define HAVE_CURVE25519 -#define CURVED25519_SMALL -#endif -// -// CURVE25519 SMALL -#define MDK_CONF_CURVE25519_SMALL 0 -#if MDK_CONF_CURVE25519_SMALL == 1 -#define CURVED25519_SMALL -#endif -// -// ED25519 -#define MDK_CONF_ED25519 1 -#if MDK_CONF_ED25519 == 1 -#define HAVE_ED25519 -#endif -// -// ED25519 SMALL -#define MDK_CONF_ED25519_SMALL 0 -#if MDK_CONF_ED25519_SMALL == 1 -#define ED25519_SMALL -#endif -// -// PKCS7 -#define MDK_CONF_PKCS7 0 -#if MDK_CONF_PKCS7 == 1 -#define HAVE_PKCS7 -#endif -// -// - -// Random Seed, for TEST Only -#define MDK_CONF_RNDSEED 1 -#if MDK_CONF_RNDSEED == 1 -#define WOLFSSL_GENSEED_FORTEST -#endif -// - -// Hardware Crypt (See document for usage) -// Hardware RNG -#define MDK_CONF_STM32F2_RNG 0 -#if MDK_CONF_STM32F2_RNG == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_RNG -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Crypt -#define MDK_CONF_STM32F2_CRYPTO 0 -#if MDK_CONF_STM32F2_CRYPTO == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_CRYPTO -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// Hardware Hash -#define MDK_CONF_STM32F2_HASH 0 -#if MDK_CONF_STM32F2_HASH == 1 -#define WOLFSSL_STM32_CUBEMX -#define STM32_HASH -#define WC_ASYNC_DEV_SIZE 320+24 -#define STM32_HAL_TIMEOUT 0xFF - -#if defined(STM32F2xx) -#define WOLFSSL_STM32F2 -#elif defined(STM32F4xx) -#define WOLFSSL_STM32F4 -#elif defined(STM32F7xx) -#define WOLFSSL_STM32F7 -#endif - -#endif -// -// - -// Cert/Key Strage -// Cert Storage <0=> SD Card <1=> Mem Buff (1024bytes) <2=> Mem Buff (2048bytes) -#define MDK_CONF_CERT_BUFF 0 -#if MDK_CONF_CERT_BUFF== 1 -#define USE_CERT_BUFFERS_1024 -#elif MDK_CONF_CERT_BUFF == 2 -#define USE_CERT_BUFFERS_2048 -#endif -// -// Cert/Key Generation -// CertGen -#define MDK_CONF_CERT_GEN 0 -#if MDK_CONF_CERT_GEN == 1 -#define WOLFSSL_CERT_GEN -#endif -// -// KeyGen -#define MDK_CONF_KEY_GEN 0 -#if MDK_CONF_KEY_GEN == 1 -#define WOLFSSL_KEY_GEN -#endif -// -// -// Use Fast Math -#define MDK_CONF_FASTMATH 1 -#if MDK_CONF_FASTMATH == 1 -#define USE_FAST_MATH -#define TFM_TIMING_RESISTANT -#endif -// -// Small Stack -#define MDK_CONF_SmallStack 1 -#if MDK_CONF_SmallStack == 0 -#define NO_WOLFSSL_SMALL_STACK -#endif -// - -// - - -/**** wolfSSL Configuration ****/ - -// wolfSSL Configuration - -// TLS 1.3 -#define MDK_CONF_TLS 1 -#if MDK_CONF_TLS == 1 -#define WOLFSSL_TLS13 -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define WC_RSA_PSS -#define HAVE_HKDF -#define HAVE_FFDHE_2048 -#endif -// - -// Include Old TLS -#define MDK_CONF_NO_OLDTLS 0 -#if MDK_CONF_NO_OLDTLS == 0 -#define NO_OLD_TLS -#endif -// -// CRL -#define MDK_CONF_CRL 0 -#if MDK_CONF_CRL == 1 -#define HAVE_CRL -#define WOLFSSL_DER_LOAD -#endif -// -// OCSP -#define MDK_CONF_OCSP 0 -#if MDK_CONF_OCSP == 1 -#define HAVE_OCSP -#endif -// -// OpenSSL Extra -#define MDK_CONF_OPENSSL_EXTRA 0 -#if MDK_CONF_OPENSSL_EXTRA == 1 -#define OPENSSL_EXTRA -#endif -// - -// diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvoptx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvoptx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvoptx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvoptx 2024-08-03 07:30:00.000000000 +0000 @@ -226,7 +226,7 @@ 0 0 0 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h user_settings.h 0 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvprojx mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvprojx --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvprojx 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Projects/wolfSSL-Lib/wolfSSL-Lib.uvprojx 2024-08-03 07:30:00.000000000 +0000 @@ -383,7 +383,7 @@ user_settings.h 5 - .\RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h @@ -832,7 +832,7 @@ - RTE\wolfSSL\user_settings.h + ..\..\Conf\user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,60 @@ +# ARM Keil MDK 5 wolfSSL Support + +wolfSSL has a Keil CMSIS pack available that is updated for each release. + +This CMSIS pack contains the wolfCrypt and wolfSSL (TLS) libraries including test, benchmark and example applications. + +## To install the wolfSSL pack + +1) Open the Keil "Pack Installer" +2) Under Generic locate "wolfSSL::wolfSSL" +3) Click "Install" + +## To add the pack to your project + +1) Project -> Manage -> "Runtime Environment" +2) Expand "wolfSSL" and check the boxes for wolfCrypt CORE and wolfSSL CORE. +3) If running the wolfCrypt test or any of the TLS examples check those as well. + +Note: By default the pack's user_settings.h assumes the CMSIS RTOS v2 and Keil TCP packs are also installed. See below for how to change these settings (`MDK_CONF_THREAD` and `MDK_CONF_NETWORK`). + +If the wolfSSL::wolfSSL pack isn't showing: +1) Project -> Manage -> "Select Software Packs" +2) Make sure wolfSSL:wolfSSL is selected to "latest" +3) Hit "OK" + +## To configure wolfSSL + +1) Add a pre-processor macro `WOLFSSL_USER_SETTINGS` + - Project -> Options for Target... -> C/C++ -> Preprocessor Symbols -> Define. + - Add `WOLFSSL_USER_SETTINGS` +2) Open the `user_settings.h` file. In wolfSSL -> user_settings.h +3) Configure math library (`MDK_CONF_MATH`). Default 0=SP Math all (sp_int.c) +4) Configure MPU (`MDK_CONF_MPU`): If not STM32, use 0 for none. +5) Configure the RTOS (`MDK_CONF_THREAD`): By default 15 = "CMSIS RTOSv2". For bare-metal use 0. For FreeRTOS use 1. +6) Configure the TCP stack (`MDK_CONF_NETWORK`). By default uses Keil TCP `WOLFSSL_KEIL_TCP_NET`. Use 0 for none or 2 for user io callbacks. +6) For wolfCrypt only (no TLS) add `#define WOLFCRYPT_ONLY` (resolves GetCA errors) +7) Increase stack/heap (if needed). This is typically in the startup.s, but for RTX is in the `RTX_Config.h`. For CMSIS RTOSv2 stack is set in `osThreadAttr_t` on call to `osThreadNew`. + +## Building + +If getting an error for an unknown type `inline`, change your project C standard to c99 in the C/C++ options. Alternatively, +add `#define WC_INLINE __inline` to `user_settings.h` to stick to c89 or the default c90. + +If getting error for missing GetCA or GetCAByName then include `Src/ssl-dummy.c` or define `WOLFCRYPT_ONLY`. + +If getting an error with missing `current_time` then please implement a function to return elapsed seconds (used by benchmark) like this: + +```c +extern uint32_t os_time; +double current_time(int reset) +{ + if (reset) os_time = 0 ; + return (double)os_time /1000.0; +} +``` + + +## For Support + +For question email support@wolfssl.com diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Src/ssl-dummy.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Src/ssl-dummy.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Src/ssl-dummy.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/Src/ssl-dummy.c 2024-08-03 07:30:00.000000000 +0000 @@ -29,11 +29,11 @@ Signer* GetCA(void* vp, byte* hash) { - return NULL ; + return NULL; } Signer* GetCAByName(void* vp, byte* hash) { - return NULL ; + return NULL; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MDK5-ARM/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MDK5-ARM/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= IDE/MDK5-ARM/README.md +EXTRA_DIST+= IDE/MDK5-ARM/Conf/user_settings.h +EXTRA_DIST+= IDE/MDK5-ARM/Inc/wolfssl_MDK_ARM.h +EXTRA_DIST+= IDE/MDK5-ARM/Projects +EXTRA_DIST+= IDE/MDK5-ARM/Src/ssl-dummy.c diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,62 @@ +# wolfSSL MPLAB X Project Files for XC16 + +This directory contains project files for the Microchip MPLAB X IDE. These +projects have been set up to use the Microchip PIC24 Starter Kit +and the Microchip XC16 compiler. + +In order to generate the necessary auto-generated MPLAB X files, make sure +to import the wolfssl.X project into your MPLAB X workspace before trying to +build the wolfCrypt test. This will correctly set up the respective project's +Makefiles. + +## Included Project Files + +### wolfSSL library (wolfssl.X) + +This project builds a static wolfSSL library. The settings for this project are in `user_settings.h`: +``` +/IDE/MPLABX16/user_settings.h +``` + +After this project has been built, the compiled library will be located at: +``` +/IDE/MPLABX16/wolfssl.X/dist/default/production/wolfssl.X.a +``` + +### wolfCrypt Test App (wolfcrypt_test.X) + +This project tests the wolfCrypt cryptography modules. It is generally a good +idea to run this first on an embedded system after compiling wolfSSL in order +to verify all underlying crypto is working correctly. This project depends on +files generated by Microchip's MCC tool to view the UART output. Follow the +steps below to generate that code. + +## Generating MCC UART code + +1. Open the MPLAB Code Configurator application. + +2. Set the Project path to the wolfSSL/IDE/MPLABX16 and enter your PIC device +into the interface. + +3. Select MCC Clasic as the content type and click `Finish`. + +4. Under the Device Resources section, find the UART entry and add the UART1 +peripheral. + +5. Note the UART settings and check the `Enable UART Interrupts` and +`Redirect Printf to UART` boxes. + +6. Click the `Generate` button. + + +**Note** : If using an older version of `xc16`, you may have to add the +following to `user_settings.h`. +``` +#define WOLFSSL_HAVE_MIN +#define WOLFSSL_HAVE_MAX +``` + +## Support + +Please send questions or comments to support@wolfssl.com + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,8 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + IDE/MPLABX16/README.md \ + IDE/MPLABX16/main.c \ + IDE/MPLABX16/user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,39 @@ +/* main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include + +#include +#include + +#include + +#include "xc.h" +#include "mcc_generated_files/mcc.h" + +int main(void) { + SYSTEM_Initialize(); + + wolfcrypt_test(NULL); + + return 0; +} + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,414 @@ +/* Example custom user settings for wolfSSL */ + +#ifndef WOLFSSL_USER_SETTINGS_H +#define WOLFSSL_USER_SETTINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +#undef WOLFSSL_GENERAL_ALIGNMENT +#define WOLFSSL_GENERAL_ALIGNMENT 4 + +#undef SINGLE_THREADED +#define SINGLE_THREADED + +#undef WOLFSSL_SMALL_STACK +#define WOLFSSL_SMALL_STACK + +#define MICROCHIP_PIC24 + +/* Define for older versions of xc16 */ +#if 0 + #define WOLFSSL_HAVE_MIN + #define WOLFSSL_HAVE_MAX +#endif + +#ifdef MICROCHIP_PIC24 + #define SIZEOF_LONG_LONG 8 + #define SIZEOF_LONG 4 + #define SINGLE_THREADED + #define WOLFSSL_USER_IO + #define NO_WRITEV + #define NO_DEV_RANDOM + #define NO_FILESYSTEM + #define BENCH_EMBEDDED + #define WC_16BIT_CPU + #define WORD64_AVAILABLE + #define WOLFSSL_GENSEED_FORTEST +#endif + +/* ------------------------------------------------------------------------- */ +/* Math Configuration */ +/* ------------------------------------------------------------------------- */ +#if 1 + #undef USE_FAST_MATH + #define USE_FAST_MATH + + #undef FP_MAX_BITS + #define FP_MAX_BITS 2048 +#else + #define WOLFSSL_SP_MATH + #define WOLFSSL_SP_SMALL + #define WOLFSSL_SP_MATH_ALL + #define SP_INT_BITS 256 +#endif + + +#ifdef USE_FAST_MATH + #undef TFM_TIMING_RESISTANT + #define TFM_TIMING_RESISTANT + + /* Optimizations */ + //#define TFM_MIPS +#endif + +/* ------------------------------------------------------------------------- */ +/* Crypto */ +/* ------------------------------------------------------------------------- */ +/* ECC */ +#if 1 + #undef HAVE_ECC + #define HAVE_ECC + + /* Manually define enabled curves */ + #undef ECC_USER_CURVES + #define ECC_USER_CURVES + + /* Reduces heap usage, but slower */ + #undef ECC_TIMING_RESISTANT + #define ECC_TIMING_RESISTANT + + //#define HAVE_ECC192 + //#define HAVE_ECC224 + //#define HAVE_ECC384 + /* Fixed point cache (speeds repeated operations against same private key) */ +#if 1 + #undef FP_ECC + #define FP_ECC + #ifdef FP_ECC + /* Bits / Entries */ + #undef FP_ENTRIES + #define FP_ENTRIES 2 + #undef FP_LUT + #define FP_LUT 4 + #endif + /* Optional ECC calculation method */ + /* Note: doubles heap usage, but slightly faster */ + #undef ECC_SHAMIR + #define ECC_SHAMIR + + + #ifdef USE_FAST_MATH + /* use reduced size math buffers for ecc points */ + #undef ALT_ECC_SIZE + #define ALT_ECC_SIZE + + /* Enable TFM optimizations for ECC */ + #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) + #define TFM_ECC192 + #endif + #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) + #define TFM_ECC224 + #endif + #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #define TFM_ECC256 + #endif + #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #define TFM_ECC384 + #endif + #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #define TFM_ECC521 + #endif + #endif +#endif +#endif + +/* RSA */ +#undef NO_RSA +#if 0 + /* half as much memory but twice as slow */ + #undef RSA_LOW_MEM +#define RSA_LOW_MEM + + #undef WC_RSA_PSS + #define WC_RSA_PSS + + /* timing resistance */ + #undef WC_RSA_BLINDING + #define WC_RSA_BLINDING +#else + #define NO_RSA +#endif + +/* AES */ +#undef NO_AES +#if 1 + #undef HAVE_AES_DECRYPT + #define HAVE_AES_DECRYPT + + #undef HAVE_AESGCM + #define HAVE_AESGCM + + /* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */ + #undef GCM_SMALL + #define GCM_SMALL + + /* #undef HAVE_AESCCM + #define HAVE_AESCCM */ + + /* #undef WOLFSSL_AES_DIRECT + #define WOLFSSL_AES_DIRECT */ + + #undef NO_AES_CBC + #define NO_AES_CBC +#else + #define NO_AES +#endif + +/* DES3 */ +#undef NO_DES3 +#if 0 + #undef WOLFSSL_DES_ECB + #define WOLFSSL_DES_ECB +#else + #define NO_DES3 +#endif + + +/* ChaCha20 / Poly1305 */ +#undef HAVE_CHACHA +#undef HAVE_POLY1305 +#if 0 + #define HAVE_CHACHA + #define HAVE_POLY1305 + + /* Needed for Poly1305 */ + #undef HAVE_ONE_TIME_AUTH + #define HAVE_ONE_TIME_AUTH +#endif + +/* Ed25519 / Curve25519 */ +#undef HAVE_CURVE25519 +#undef HAVE_ED25519 +#if 0 + #define HAVE_CURVE25519 + #define HAVE_ED25519 + + /* Optionally use small math (less flash usage, but much slower) */ + #if 0 + #define CURVED25519_SMALL + #endif +#endif + + +/* ------------------------------------------------------------------------- */ +/* Hashing */ +/* ------------------------------------------------------------------------- */ +/* Sha */ +#undef NO_SHA +#if 0 + /* 1k smaller, but 25% slower */ + #define USE_SLOW_SHA +#else + #define NO_SHA +#endif + +/* Sha256 */ +#undef NO_SHA256 +#if 1 +#else + #define NO_SHA256 +#endif + +/* Sha512 */ +#undef WOLFSSL_SHA512 +#if 0 + #define WOLFSSL_SHA512 + + /* Sha384 */ + #undef WOLFSSL_SHA384 + #if 0 + #define WOLFSSL_SHA384 + #endif + + /* over twice as small, but 50% slower */ + #define USE_SLOW_SHA2 +#endif + + +/* ------------------------------------------------------------------------- */ +/* Benchmark / Test */ +/* ------------------------------------------------------------------------- */ +/* Use reduced benchmark / test sizes */ +#undef BENCH_EMBEDDED +#define BENCH_EMBEDDED + +//#undef USE_CERT_BUFFERS_2048 +//#define USE_CERT_BUFFERS_2048 + +#undef USE_CERT_BUFFERS_1024 +#define USE_CERT_BUFFERS_1024 + +#undef USE_CERT_BUFFERS_256 +#define USE_CERT_BUFFERS_256 + + +/* ------------------------------------------------------------------------- */ +/* Time */ +/* ------------------------------------------------------------------------- */ +#if 0 + /* Override Current Time */ + /* Allows custom "custom_time()" function to be used for benchmark */ + #define WOLFSSL_USER_CURRTIME + #define USER_TICKS + extern unsigned long custom_time(unsigned long* timer); + #define XTIME custom_time +#else + //#warning Time/RTC disabled + #undef NO_ASN_TIME + #define NO_ASN_TIME +#endif + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ +#undef DEBUG_WOLFSSL + +#if 0 + #define DEBUG_WOLFSSL + #define WOLFSSL_DEBUG_TLS + /* Use this to measure / print heap usage */ + #undef USE_WOLFSSL_MEMORY + #define USE_WOLFSSL_MEMORY + #undef WOLFSSL_TRACK_MEMORY + #define WOLFSSL_TRACK_MEMORY +#else + #undef NO_WOLFSSL_MEMORY + #define NO_WOLFSSL_MEMORY +#endif + +/* ------------------------------------------------------------------------- */ +/* Misc */ +/* ------------------------------------------------------------------------- */ +#define WOLFSSL_ASN_TEMPLATE +#define NO_ERROR_STRINGS +#define NO_LARGE_HASH_TEST +#define NO_PKCS12 +#define NO_PKCS8 +#define WOLFSSL_NO_PEM + + +/* ------------------------------------------------------------------------- */ +/* Enable Features */ +/* ------------------------------------------------------------------------- */ +#undef KEEP_PEER_CERT +#define KEEP_PEER_CERT + +#undef HAVE_COMP_KEY +#define HAVE_COMP_KEY + +#undef WOLFSSL_TLS13 +#define WOLFSSL_TLS13 + +#undef HAVE_HKDF +#define HAVE_HKDF + +#undef HAVE_TLS_EXTENSIONS +#define HAVE_TLS_EXTENSIONS + +#ifdef HAVE_ECC +#undef HAVE_SUPPORTED_CURVES +#define HAVE_SUPPORTED_CURVES +#endif + +#undef WOLFSSL_BASE64_ENCODE +#define WOLFSSL_BASE64_ENCODE + +/* TLS Session Cache */ +#if 0 + #define SMALL_SESSION_CACHE +#else + #define NO_SESSION_CACHE +#endif + + +/* ------------------------------------------------------------------------- */ +/* Disable Features */ +/* ------------------------------------------------------------------------- */ +#undef NO_WOLFSSL_SERVER +//#define NO_WOLFSSL_SERVER + +#undef NO_WOLFSSL_CLIENT +#define NO_WOLFSSL_CLIENT + +#undef NO_CRYPT_TEST +//#define NO_CRYPT_TEST + +#undef NO_CRYPT_BENCHMARK +//#define NO_CRYPT_BENCHMARK + +/* In-lining of misc.c functions */ +/* If defined, must include wolfcrypt/src/misc.c in build */ +/* Slower, but about 1k smaller */ +#undef NO_INLINE +#define NO_INLINE + +#undef NO_FILESYSTEM +#define NO_FILESYSTEM + +#undef NO_WRITEV +#define NO_WRITEV + +#undef NO_MAIN_DRIVER +#define NO_MAIN_DRIVER + +#undef NO_DEV_RANDOM +#define NO_DEV_RANDOM + +#undef NO_PSK +#define NO_PSK + +#undef NO_DSA +#define NO_DSA + +#undef NO_DH +#define NO_DH + +#undef NO_RC4 +#define NO_RC4 + +#undef NO_OLD_TLS +#define NO_OLD_TLS + +#undef WOLFSSL_NO_TLS12 +#define WOLFSSL_NO_TLS12 + +#undef NO_PSK +//#define NO_PSK +#define WOLFSSL_STATIC_PSK + +#undef NO_MD4 +#define NO_MD4 + +#undef NO_PWDBASED +#define NO_PWDBASED + +#undef NO_MD5 +#define NO_MD5 + +#undef NO_DES3 +#define NO_DES3 + +#undef NO_CODING +//#define NO_CODING + + +#ifdef __cplusplus +} +#endif + +#endif /* WOLFSSL_USER_SETTINGS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/Makefile 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,285 @@ + + + + + ../user_settings.h + + + + + + ../mcc_generated_files/clock.c + ../mcc_generated_files/interrupt_manager.c + ../mcc_generated_files/mcc.c + ../mcc_generated_files/pin_manager.c + ../mcc_generated_files/system.c + ../mcc_generated_files/traps.c + ../mcc_generated_files/uart1.c + + ../../../wolfcrypt/test/test.c + ../main.c + + + Makefile + + + + .. + ../../wolfcrypt/test + ../../../wolfcrypt/test + + Makefile + + + + localhost + PIC24FJ1024GB610 + + + PKOBSKDEPlatformTool + XC16 + 2.10 + 4 + + + + + + + + + + + + + + + + + + + false + true + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,8 @@ +j vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + IDE/MPLABX16/wolfcrypt_test.X/nbproject/configurations.xml \ + IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/configurations.xml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,25 @@ + + + Makefile + 0 + + + + /Applications/microchip/xc16/v2.10/bin + + place holder 1 + place holder 2 + + + + + true + 0 + 0 + 0 + + + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/private/private.xml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,7 @@ + + + + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfcrypt_test.X/nbproject/project.xml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + wolfcrypt_test + b34c4937-7042-4352-88b1-7717bcdf8aeb + 0 + c + + h + ISO-8859-1 + + + ../wolfssl.X + + + .. + ../../wolfcrypt/test + ../../../wolfcrypt/test + + + + default + 2 + + + + false + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/Makefile 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,113 @@ +# +# There exist several targets which are by default empty and which can be +# used for execution of your targets. These targets are usually executed +# before and after some main targets. They are: +# +# .build-pre: called before 'build' target +# .build-post: called after 'build' target +# .clean-pre: called before 'clean' target +# .clean-post: called after 'clean' target +# .clobber-pre: called before 'clobber' target +# .clobber-post: called after 'clobber' target +# .all-pre: called before 'all' target +# .all-post: called after 'all' target +# .help-pre: called before 'help' target +# .help-post: called after 'help' target +# +# Targets beginning with '.' are not intended to be called on their own. +# +# Main targets can be executed directly, and they are: +# +# build build a specific configuration +# clean remove built files from a configuration +# clobber remove all built files +# all build all configurations +# help print help mesage +# +# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and +# .help-impl are implemented in nbproject/makefile-impl.mk. +# +# Available make variables: +# +# CND_BASEDIR base directory for relative paths +# CND_DISTDIR default top distribution directory (build artifacts) +# CND_BUILDDIR default top build directory (object files, ...) +# CONF name of current configuration +# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration) +# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration) +# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration) +# CND_PACKAGE_DIR_${CONF} directory of package (current configuration) +# CND_PACKAGE_NAME_${CONF} name of package (current configuration) +# CND_PACKAGE_PATH_${CONF} path to package (current configuration) +# +# NOCDDL + + +# Environment +MKDIR=mkdir +CP=cp +CCADMIN=CCadmin +RANLIB=ranlib + + +# build +build: .build-post + +.build-pre: +# Add your pre 'build' code here... + +.build-post: .build-impl +# Add your post 'build' code here... + + +# clean +clean: .clean-post + +.clean-pre: +# Add your pre 'clean' code here... +# WARNING: the IDE does not call this target since it takes a long time to +# simply run make. Instead, the IDE removes the configuration directories +# under build and dist directly without calling make. +# This target is left here so people can do a clean when running a clean +# outside the IDE. + +.clean-post: .clean-impl +# Add your post 'clean' code here... + + +# clobber +clobber: .clobber-post + +.clobber-pre: +# Add your pre 'clobber' code here... + +.clobber-post: .clobber-impl +# Add your post 'clobber' code here... + + +# all +all: .all-post + +.all-pre: +# Add your pre 'all' code here... + +.all-post: .all-impl +# Add your post 'all' code here... + + +# help +help: .help-post + +.help-pre: +# Add your pre 'help' code here... + +.help-post: .help-impl +# Add your post 'help' code here... + + + +# include project implementation makefile +include nbproject/Makefile-impl.mk + +# include project make variables +include nbproject/Makefile-variables.mk diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,290 @@ + + + + + ../user_settings.h + + + + + + ../../../wolfcrypt/src/aes.c + ../../../wolfcrypt/src/arc4.c + ../../../wolfcrypt/src/asm.c + ../../../wolfcrypt/src/asn.c + ../../../wolfcrypt/src/blake2b.c + ../../../wolfcrypt/src/blake2s.c + ../../../wolfcrypt/src/camellia.c + ../../../wolfcrypt/src/chacha.c + ../../../wolfcrypt/src/chacha20_poly1305.c + ../../../wolfcrypt/src/cmac.c + ../../../wolfcrypt/src/coding.c + ../../../wolfcrypt/src/compress.c + ../../../wolfcrypt/src/cpuid.c + ../../../wolfcrypt/src/cryptocb.c + ../../../wolfcrypt/src/curve25519.c + ../../../wolfcrypt/src/curve448.c + ../../../wolfcrypt/src/des3.c + ../../../wolfcrypt/src/dh.c + ../../../wolfcrypt/src/dilithium.c + ../../../wolfcrypt/src/dsa.c + ../../../wolfcrypt/src/ecc.c + ../../../wolfcrypt/src/ecc_fp.c + ../../../wolfcrypt/src/eccsi.c + ../../../wolfcrypt/src/ed25519.c + ../../../wolfcrypt/src/ed448.c + ../../../wolfcrypt/src/error.c + ../../../wolfcrypt/src/evp.c + ../../../wolfcrypt/src/ext_kyber.c + ../../../wolfcrypt/src/falcon.c + ../../../wolfcrypt/src/fe_448.c + ../../../wolfcrypt/src/fe_low_mem.c + ../../../wolfcrypt/src/fe_operations.c + ../../../wolfcrypt/src/ge_448.c + ../../../wolfcrypt/src/ge_low_mem.c + ../../../wolfcrypt/src/ge_operations.c + ../../../wolfcrypt/src/hash.c + ../../../wolfcrypt/src/hmac.c + ../../../wolfcrypt/src/hpke.c + ../../../wolfcrypt/src/integer.c + ../../../wolfcrypt/src/kdf.c + ../../../wolfcrypt/src/logging.c + ../../../wolfcrypt/src/md2.c + ../../../wolfcrypt/src/md4.c + ../../../wolfcrypt/src/md5.c + ../../../wolfcrypt/src/memory.c + ../../../wolfcrypt/src/misc.c + ../../../wolfcrypt/src/pkcs12.c + ../../../wolfcrypt/src/pkcs7.c + ../../../wolfcrypt/src/poly1305.c + ../../../wolfcrypt/src/pwdbased.c + ../../../wolfcrypt/src/random.c + ../../../wolfcrypt/src/rc2.c + ../../../wolfcrypt/src/ripemd.c + ../../../wolfcrypt/src/rsa.c + ../../../wolfcrypt/src/sakke.c + ../../../wolfcrypt/src/sha.c + ../../../wolfcrypt/src/sha256.c + ../../../wolfcrypt/src/sha3.c + ../../../wolfcrypt/src/sha512.c + ../../../wolfcrypt/src/signature.c + ../../../wolfcrypt/src/siphash.c + ../../../wolfcrypt/src/sp_arm32.c + ../../../wolfcrypt/src/sp_arm64.c + ../../../wolfcrypt/src/sp_armthumb.c + ../../../wolfcrypt/src/sp_c32.c + ../../../wolfcrypt/src/sp_c64.c + ../../../wolfcrypt/src/sp_int.c + ../../../wolfcrypt/src/sphincs.c + ../../../wolfcrypt/src/srp.c + ../../../wolfcrypt/src/tfm.c + ../../../wolfcrypt/src/wc_encrypt.c + ../../../wolfcrypt/src/wc_pkcs11.c + ../../../wolfcrypt/src/wc_port.c + ../../../wolfcrypt/src/wolfevent.c + ../../../wolfcrypt/src/wolfmath.c + + + ../../../src/crl.c + ../../../src/internal.c + ../../../src/keys.c + ../../../src/ssl.c + ../../../src/tls.c + ../../../src/tls13.c + ../../../src/wolfio.c + + + + Makefile + + + + .. + ../../src + ../../wolfcrypt/src + ../../wolfcrypt/test + ../../../src + ../../../wolfcrypt/src + + Makefile + + + + localhost + PIC24FJ1024GB610 + + + noID + XC16 + 2.10 + 4 + + + + + + + + + + + + + + + false + false + + + + + + + false + false + + false + + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,7 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + IDE/MPLABX16/wolfssl.X/nbproject/configurations.xml \ + IDE/MPLABX16/wolfssl.X/nbproject/project.xml diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MPLABX16/wolfssl.X/nbproject/project.xml 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,34 @@ + + + com.microchip.mplab.nbide.embedded.makeproject + + + wolfssl + 93bbfc3a-a0fa-4d48-bbc8-6cd47a2bd05b + 0 + c + + h + ISO-8859-1 + + + + .. + ../../src + ../../wolfcrypt/src + ../../wolfcrypt/test + ../../../src + ../../../wolfcrypt/src + + + + default + 3 + + + + false + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/shared/util.h 2024-08-03 07:30:00.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include #define _GNU_SOURCE /* defines NI_NUMERICHOST */ #ifndef NI_MAXHOST diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -85,6 +85,7 @@ /* Filesystem */ #define NO_FILESYSTEM +#define HAVE_NETDB_H /* Debug */ #include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/wolfssl_new_azsphere/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/wolfssl_new_azsphere/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/wolfssl_new_azsphere/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/MSVS-2019-AZSPHERE/wolfssl_new_azsphere/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -37,7 +37,14 @@ list( REMOVE_ITEM SSL_SOURCES ../../../src/x509.c ) list( REMOVE_ITEM SSL_SOURCES ../../../src/x509_str.c ) list( REMOVE_ITEM SSL_SOURCES ../../../src/pk.c ) +list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_asn1.c ) +list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_bn.c ) +list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_certman.c ) +list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_crypto.c ) +list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_load.c ) list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_misc.c ) +list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_p7p12.c ) +list( REMOVE_ITEM SSL_SOURCES ../../../src/ssl_sess.c ) aux_source_directory( ${CRYPTO_SRC_DIR} CRYPTO_SOURCES ) list( REMOVE_ITEM CRYPTO_SOURCES ../../../wolfcrypt/src/evp.c ) list( REMOVE_ITEM CRYPTO_SOURCES ../../../wolfcrypt/src/misc.c ) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/NETOS/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/NETOS/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/NETOS/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/NETOS/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -198,7 +198,7 @@ #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#undef FP_MAX_BITS_ECC //#define FP_MAX_BITS_ECC (256 * 2) #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,26 @@ +# PlatformIO + +Follow the [instructions](https://docs.platformio.org/en/latest/core/installation/methods/index.html) to install PlatformIO. + +Note there are two options for using PlatformIO: + +- [Core CLI](https://docs.platformio.org/en/latest/core/index.html) +- [VSCode IDE](https://docs.platformio.org/en/latest/integration/ide/vscode.html#ide-vscode) + +There are two types wolfSSL libraries for PlatformIO: + +- Regular (release): https://registry.platformio.org/libraries/wolfssl/wolfssl +- Arduino (release): https://registry.platformio.org/libraries/wolfssl/Arduino-wolfSSL + +There are staging / preview libraries for each of the two types wolfSSL libraries for PlatformIO: + +- Regular (staging / preview): https://registry.platformio.org/libraries/wolfssl-staging/wolfSSL +- Arduino (staging / preview): https://registry.platformio.org/libraries/wolfssl-staging/Arduino-wolfSSL + +# Examples + +See the [examples directory](./examples/) + +## Publishing + +The wolfSSL publishing is performed from the `scripts`. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,13 @@ +# PlatformIO + +Follow the [instructions](https://docs.platformio.org/en/latest/core/installation/methods/index.html) to install PlatformIO. + +Note there are two options: + +- [Core CLI](https://docs.platformio.org/en/latest/core/index.html) +- [VSCode IDE](https://docs.platformio.org/en/latest/integration/ide/vscode.html#ide-vscode) + +# Examples + +- [wolfssl_benchmark](./wolfssl_benchmark/README.md) +- [wolfssl_test](./wolfssl_test/README.md) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.16.0) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(ESP_IDF_Hello_World) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,214 @@ +# wolfSSL Benchmark Example + +This ESP32 example uses the [wolfSSL wolfcrypt Benchmark Application](https://github.com/wolfSSL/wolfssl/tree/master/wolfcrypt/benchmark). + +Other target boards _should_ work, but have not yet been tested. + +For general information on [wolfSSL examples for Espressif](../README.md), see the +[README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. + +## Example Output + +Note the default wolfSSL `user_settings.h` is configured by default to be the most +compatible across the widest ranges of targets. Contact wolfSSL at support@wolfssl.com +for help in optimizing for your particular application, or see the +[docs](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html). + +``` +ets Jun 8 2016 00:22:57 + +rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) +configsip: 0, SPIWP:0xee +clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 +mode:DIO, clock div:2 +load:0x3fff0030,len:7168 +load:0x40078000,len:15612 +load:0x40080400,len:4 +load:0x40080404,len:3736 +entry 0x40080624 +I (28) boot: ESP-IDF 5.2.1 2nd stage bootloader +I (29) boot: compile time May 17 2024 19:42:46 +W (29) boot: Unicore bootloader +I (32) boot: chip revision: v1.0 +I (36) boot.esp32: SPI Speed : 40MHz +I (41) boot.esp32: SPI Mode : DIO +I (45) boot.esp32: SPI Flash Size : 4MB +I (50) boot: Enabling RNG early entropy source... +I (55) boot: Partition Table: +I (59) boot: ## Label Usage Type ST Offset Length +I (66) boot: 0 nvs WiFi data 01 02 00009000 00006000 +I (74) boot: 1 phy_init RF data 01 01 0000f000 00001000 +I (81) boot: 2 factory factory app 00 00 00010000 00100000 +I (89) boot: End of partition table +I (93) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=1900ch (102412) map +I (138) esp_image: segment 1: paddr=00029034 vaddr=3ffb0000 size=01794h ( 6036) load +I (141) esp_image: segment 2: paddr=0002a7d0 vaddr=40080000 size=05848h ( 22600) load +I (154) esp_image: segment 3: paddr=00030020 vaddr=400d0020 size=4bc50h (310352) map +I (266) esp_image: segment 4: paddr=0007bc78 vaddr=40085848 size=05b64h ( 23396) load +I (276) esp_image: segment 5: paddr=000817e4 vaddr=50000000 size=00004h ( 4) load +I (282) boot: Loaded app from partition at offset 0x10000 +I (282) boot: Disabling RNG early entropy source... +I (297) cpu_start: Unicore app +I (297) cpu_start: Single core mode +I (305) cpu_start: Pro cpu start user code +I (305) cpu_start: cpu freq: 240000000 Hz +I (305) cpu_start: Application information: +I (310) cpu_start: Project name: ESP_IDF_Hello_World +I (316) cpu_start: App version: v5.7.0-stable-512-g15af87af8-di +I (323) cpu_start: Compile time: May 17 2024 19:42:07 +I (329) cpu_start: ELF file SHA256: eebe816ce... +I (334) cpu_start: ESP-IDF: 5.2.1 +I (339) cpu_start: Min chip rev: v0.0 +I (344) cpu_start: Max chip rev: v3.99 +I (349) cpu_start: Chip rev: v1.0 +I (354) heap_init: Initializing. RAM available for dynamic allocation: +I (361) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM +I (367) heap_init: At 3FFB2018 len 0002DFE8 (183 KiB): DRAM +I (373) heap_init: At 3FFE0440 len 0001FBC0 (126 KiB): D/IRAM +I (379) heap_init: At 40078000 len 00008000 (32 KiB): IRAM +I (386) heap_init: At 4008B3AC len 00014C54 (83 KiB): IRAM +I (392) heap_init: At 3FF80000 len 00002000 (8 KiB): RTCRAM +I (399) spi_flash: detected chip: generic +I (403) spi_flash: flash io: dio +I (407) main_task: Started on CPU0 +I (410) main_task: Calling app_main() +I (415) wolfSSL demo: Found WOLFSSL_ESPIDF! + +Hello World wolfSSL Version 5.7.0 +I (423) esp32_util: Extended Version and Platform Information. +I (429) esp32_util: Chip revision: v1.0 +I (434) esp32_util: SSID and plain text WiFi password not displayed in startup logs. +I (442) esp32_util: Define SHOW_SSID_AND_PASSWORD to enable display. +W (449) esp32_util: Warning: old cmake, user_settings.h location unknown. +I (457) esp32_util: LIBWOLFSSL_VERSION_STRING = 5.7.0 +I (463) esp32_util: LIBWOLFSSL_VERSION_HEX = 5007000 +I (468) esp32_util: Stack HWM: 9204 +I (472) esp32_util: +I (475) esp32_util: Macro Name Defined Not Defined +I (482) esp32_util: ------------------------- --------- ------------- +I (489) esp32_util: NO_ESPIDF_DEFAULT........ X +I (496) esp32_util: HW_MATH_ENABLED.......... X +I (502) esp32_util: WOLFSSL_SHA224........... X +I (507) esp32_util: WOLFSSL_SHA384........... X +I (513) esp32_util: WOLFSSL_SHA512........... X +I (518) esp32_util: WOLFSSL_SHA3............. X +I (524) esp32_util: HAVE_ED25519............. X +I (529) esp32_util: HAVE_AES_ECB............. X +I (536) esp32_util: HAVE_AES_DIRECT.......... X +I (543) esp32_util: USE_FAST_MATH............ X +I (548) esp32_util: WOLFSSL_SP_MATH_ALL...... X +I (555) esp32_util: SP_MATH.................. X +I (561) esp32_util: WOLFSSL_HW_METRICS....... X +I (567) esp32_util: RSA_LOW_MEM.............. X +I (572) esp32_util: SMALL_SESSION_CACHE...... X +I (579) esp32_util: WC_NO_HARDEN............. X +I (586) esp32_util: TFM_TIMING_RESISTANT..... X +I (591) esp32_util: ECC_TIMING_RESISTANT..... X +I (597) esp32_util: WC_NO_CACHE_RESISTANT.... X +I (602) esp32_util: WC_AES_BITSLICED......... X +I (609) esp32_util: WOLFSSL_AES_NO_UNROLL.... X +I (615) esp32_util: TFM_TIMING_RESISTANT..... X +I (621) esp32_util: ECC_TIMING_RESISTANT..... X +I (627) esp32_util: WC_RSA_BLINDING.......... X +I (632) esp32_util: NO_WRITEV................ X +I (638) esp32_util: FREERTOS................. X +I (643) esp32_util: NO_WOLFSSL_DIR........... X +I (649) esp32_util: WOLFSSL_NO_CURRDIR....... X +I (654) esp32_util: WOLFSSL_LWIP............. X +I (660) esp32_util: +I (663) esp32_util: Compiler Optimization: Default +I (668) esp32_util: +I (671) esp32_util: CONFIG_IDF_TARGET = esp32 +W (676) esp32_util: Watchdog active; missing WOLFSSL_ESP_NO_WATCHDOG definition. +I (684) esp32_util: CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ: 240 MHz +I (691) esp32_util: Xthal_have_ccount: 1 +I (695) esp32_util: CONFIG_MAIN_TASK_STACK_SIZE: 10500 +I (701) esp32_util: CONFIG_ESP_MAIN_TASK_STACK_SIZE: 10500 +I (707) esp32_util: CONFIG_TIMER_TASK_STACK_SIZE: 3584 +I (713) esp32_util: CONFIG_TIMER_TASK_STACK_DEPTH: 2048 +I (719) esp32_util: Stack HWM: 3ffb4ebf +I (724) esp32_util: ESP32_CRYPT is enabled for ESP32. +I (729) esp32_util: SINGLE_THREADED +I (733) esp32_util: Boot count: 1 +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 1625 KiB took 1.016 seconds, 1599.409 KiB/s Cycles per byte = 251.56 +AES-128-CBC-enc 7600 KiB took 1.003 seconds, 7577.268 KiB/s Cycles per byte = 30.93 +AES-128-CBC-dec 7350 KiB took 1.001 seconds, 7342.657 KiB/s Cycles per byte = 31.94 +AES-192-CBC-enc 7575 KiB took 1.001 seconds, 7567.433 KiB/s Cycles per byte = 30.97 +AES-192-CBC-dec 7325 KiB took 1.000 seconds, 7325.000 KiB/s Cycles per byte = 31.98 +AES-256-CBC-enc 7375 KiB took 1.000 seconds, 7375.000 KiB/s Cycles per byte = 31.77 +AES-256-CBC-dec 7325 KiB took 1.001 seconds, 7317.682 KiB/s Cycles per byte = 32.02 +AES-128-GCM-enc 350 KiB took 1.008 seconds, 347.222 KiB/s Cycles per byte = 675.33 +AES-128-GCM-dec 350 KiB took 1.009 seconds, 346.878 KiB/s Cycles per byte = 675.81 +AES-192-GCM-enc 350 KiB took 1.013 seconds, 345.508 KiB/s Cycles per byte = 678.52 +AES-192-GCM-dec 350 KiB took 1.014 seconds, 345.168 KiB/s Cycles per byte = 679.06 +AES-256-GCM-enc 350 KiB took 1.018 seconds, 343.811 KiB/s Cycles per byte = 681.98 +AES-256-GCM-dec 350 KiB took 1.020 seconds, 343.137 KiB/s Cycles per byte = 682.55 +GMAC Default 415 KiB took 1.001 seconds, 414.585 KiB/s Cycles per byte = 565.02 +AES-XTS-enc 1950 KiB took 1.000 seconds, 1950.000 KiB/s Cycles per byte = 120.17 +AES-XTS-dec 1950 KiB took 1.002 seconds, 1946.108 KiB/s Cycles per byte = 120.49 +AES-128-CFB 2425 KiB took 1.009 seconds, 2403.370 KiB/s Cycles per byte = 97.53 +AES-192-CFB 2350 KiB took 1.010 seconds, 2326.733 KiB/s Cycles per byte = 100.67 +AES-256-CFB 2250 KiB took 1.000 seconds, 2250.000 KiB/s Cycles per byte = 104.12 +AES-128-OFB 2425 KiB took 1.009 seconds, 2403.370 KiB/s Cycles per byte = 97.47 +AES-192-OFB 2350 KiB took 1.009 seconds, 2329.039 KiB/s Cycles per byte = 100.62 +AES-256-OFB 2275 KiB took 1.010 seconds, 2252.475 KiB/s Cycles per byte = 104.07 +AES-128-CTR 2450 KiB took 1.007 seconds, 2432.969 KiB/s Cycles per byte = 96.33 +AES-192-CTR 2375 KiB took 1.009 seconds, 2353.816 KiB/s Cycles per byte = 99.50 +AES-256-CTR 2275 KiB took 1.000 seconds, 2275.000 KiB/s Cycles per byte = 102.92 +AES-256-SIV-enc 900 KiB took 1.019 seconds, 883.219 KiB/s Cycles per byte = 265.22 +AES-256-SIV-dec 900 KiB took 1.019 seconds, 883.219 KiB/s Cycles per byte = 265.40 +AES-384-SIV-enc 875 KiB took 1.015 seconds, 862.069 KiB/s Cycles per byte = 271.82 +AES-384-SIV-dec 875 KiB took 1.016 seconds, 861.220 KiB/s Cycles per byte = 272.09 +AES-512-SIV-enc 850 KiB took 1.012 seconds, 839.921 KiB/s Cycles per byte = 279.14 +AES-512-SIV-dec 850 KiB took 1.014 seconds, 838.264 KiB/s Cycles per byte = 279.36 +ARC4 4100 KiB took 1.003 seconds, 4087.737 KiB/s Cycles per byte = 57.30 +3DES 450 KiB took 1.001 seconds, 449.550 KiB/s Cycles per byte = 521.21 +MD5 13775 KiB took 1.000 seconds, 13775.000 KiB/s Cycles per byte = 17.01 +POLY1305 7350 KiB took 1.000 seconds, 7350.000 KiB/s Cycles per byte = 31.89 +SHA 16175 KiB took 1.000 seconds, 16175.000 KiB/s Cycles per byte = 14.49 +SHA-224 1325 KiB took 1.004 seconds, 1319.721 KiB/s Cycles per byte = 177.55 +SHA-256 15975 KiB took 1.001 seconds, 15959.041 KiB/s Cycles per byte = 14.69 +SHA-384 17400 KiB took 1.000 seconds, 17400.000 KiB/s Cycles per byte = 13.48 +SHA-512 17200 KiB took 1.000 seconds, 17200.000 KiB/s Cycles per byte = 13.63 +SHA-512/224 1150 KiB took 1.012 seconds, 1136.364 KiB/s Cycles per byte = 206.14 +SHA-512/256 1150 KiB took 1.010 seconds, 1138.614 KiB/s Cycles per byte = 205.91 +SHA3-224 1125 KiB took 1.001 seconds, 1123.876 KiB/s Cycles per byte = 208.50 +SHA3-256 1075 KiB took 1.013 seconds, 1061.204 KiB/s Cycles per byte = 220.77 +SHA3-384 825 KiB took 1.007 seconds, 819.265 KiB/s Cycles per byte = 285.94 +SHA3-512 575 KiB took 1.002 seconds, 573.852 KiB/s Cycles per byte = 408.48 +SHAKE128 1300 KiB took 1.000 seconds, 1300.000 KiB/s Cycles per byte = 180.29 +SHAKE256 1075 KiB took 1.012 seconds, 1062.253 KiB/s Cycles per byte = 220.72 +BLAKE2b 1650 KiB took 1.007 seconds, 1638.530 KiB/s Cycles per byte = 143.04 +BLAKE2s 3475 KiB took 1.003 seconds, 3464.606 KiB/s Cycles per byte = 67.59 +AES-128-CMAC 2350 KiB took 1.009 seconds, 2329.039 KiB/s Cycles per byte = 100.65 +AES-256-CMAC 2200 KiB took 1.006 seconds, 2186.879 KiB/s Cycles per byte = 107.22 +HMAC-MD5 13625 KiB took 1.000 seconds, 13625.000 KiB/s Cycles per byte = 17.21 +HMAC-SHA 15800 KiB took 1.000 seconds, 15800.000 KiB/s Cycles per byte = 14.84 +HMAC-SHA224 1325 KiB took 1.012 seconds, 1309.289 KiB/s Cycles per byte = 179.02 +HMAC-SHA256 15575 KiB took 1.000 seconds, 15575.000 KiB/s Cycles per byte = 15.05 +HMAC-SHA384 16375 KiB took 1.000 seconds, 16375.000 KiB/s Cycles per byte = 14.32 +HMAC-SHA512 15850 KiB took 1.000 seconds, 15850.000 KiB/s Cycles per byte = 14.80 +PBKDF2 1 KiB took 1.024 seconds, 0.549 KiB/s Cycles per byte = 426593.36 +RSA 1024 key gen 1 ops took 1.142 sec, avg 1142.000 ms, 0.876 ops/sec +RSA 2048 key gen 1 ops took 2.817 sec, avg 2817.000 ms, 0.355 ops/sec +RSA 2048 public 14 ops took 1.115 sec, avg 79.643 ms, 12.556 ops/sec +RSA 2048 private 6 ops took 1.272 sec, avg 212.000 ms, 4.717 ops/sec +DH 2048 key gen 5 ops took 1.206 sec, avg 241.200 ms, 4.146 ops/sec +DH 2048 agree 14 ops took 1.106 sec, avg 79.000 ms, 12.658 ops/sec +ECC [ SECP256R1] 256 key gen 4 ops took 1.525 sec, avg 381.250 ms, 2.623 ops/sec +ECDHE [ SECP256R1] 256 agree 4 ops took 1.522 sec, avg 380.500 ms, 2.628 ops/sec +ECDSA [ SECP256R1] 256 sign 4 ops took 1.541 sec, avg 385.250 ms, 2.596 ops/sec +ECDSA [ SECP256R1] 256 verify 4 ops took 1.014 sec, avg 253.500 ms, 3.945 ops/sec +CURVE 25519 key gen 3 ops took 1.186 sec, avg 395.333 ms, 2.530 ops/sec +CURVE 25519 agree 4 ops took 1.577 sec, avg 394.250 ms, 2.536 ops/sec +ED 25519 key gen 45 ops took 1.006 sec, avg 22.356 ms, 44.732 ops/sec +ED 25519 sign 40 ops took 1.036 sec, avg 25.900 ms, 38.610 ops/sec +ED 25519 verify 26 ops took 1.014 sec, avg 39.000 ms, 25.641 ops/sec +Benchmark complete + +benchmark_test complete! result code: 0 +I (82083) main_task: Returned from app_main() +``` + +See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/README mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/README --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/README 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/README 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/main.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/include/main.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +/* PlatformIO wolfssl_benchmark main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/lib/README mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/lib/README --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/lib/README 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/lib/README 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/platformio.ini mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/platformio.ini --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/platformio.ini 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/platformio.ini 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,20 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:esp32dev] +platform = espressif32 +board = esp32dev +framework = espidf +upload_port = COM19 +monitor_port = COM19 +monitor_speed = 115200 +build_flags = -DWOLFSSL_USER_SETTINGS, -DWOLFSSL_ESP32 +monitor_filters = direct +lib_deps = wolfssl/wolfSSL@^5.7.0-rev.3b diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/sdkconfig.defaults mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/sdkconfig.defaults --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/sdkconfig.defaults 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/sdkconfig.defaults 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,98 @@ +# sdkconfig.defaults for ESP8266 + ESP32 +# Note that during the build process, settings from sdkconfig.defaults will not override those already in sdkconfig. +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#custom-sdkconfig-defaults +CONFIG_BENCH_ARGV="-lng 0" +CONFIG_FREERTOS_HZ=1000 +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y + +# +# Default main stack size. See user_settings.h +# +# For wolfSSL SMALL_STACK, 3072 bytes should be sufficient for benchmark app. +# When using RSA, assign at least 10500 bytes, otherwise 5500 usually works for others +CONFIG_ESP_MAIN_TASK_STACK_SIZE=10500 + +# Legacy stack size for older ESP-IDF versions +CONFIG_MAIN_TASK_STACK_SIZE=10500 + +# +# Benchmark must not have CONFIG_NEWLIB_NANO_FORMAT enabled +CONFIG_NEWLIB_NANO_FORMAT=n +# +# Watchdog Timers +# +# We don't want to have the watchdog timeout during tests & benchmarks +# +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n +# Panic & Watchdog +CONFIG_ESP_INT_WDT_TIMEOUT_MS=10000 +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +CONFIG_ESP_INT_WDT=n + +# ESP8266 WDT +# CONFIG_ESP_PANIC_PRINT_REBOOT is not set +CONFIG_ESP_PANIC_PRINT_REBOOT=n +CONFIG_ESP_PANIC_PRINT_HALT=y + +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=n + +# ESP8266 Memory +CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y +CONFIG_HEAP_DISABLE_IRAM=y + +# Performance +# CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# Set max COU frequency (falls back as needed for lower maximum) +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y + +# FreeRTOS ticks at 1ms interval +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=1000 + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +CONFIG_COMPILER_STACK_CHECK=y +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +# end of Compiler options + +# We don't know that the min is actually v2, +# but this is the earliest tested. +CONFIG_ESP32C3_REV_MIN_2=y + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp_large.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,6 @@ +# This file was automatically generated for projects +# without default 'CMakeLists.txt' file. + +FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*) + +idf_component_register(SRCS ${app_sources}) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/main.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/src/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,48 @@ +/* PlatformIO wolfssl_benchmark main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include "main.h" + +#include +#ifdef WOLFSSL_ESPIDF + #include + #include + #include +#endif + +#include +#include +#include + +#define TAG "wolfSSL demo" + +void app_main() { + int ret = 0; +#ifdef WOLFSSL_ESPIDF + ESP_LOGI(TAG, "Found WOLFSSL_ESPIDF!"); +#endif + printf("\nHello World wolfSSL Version %s\n", LIBWOLFSSL_VERSION_STRING); + +#if defined(HAVE_VERSION_EXTENDED_INFO) && defined(WOLFSSL_ESPIDF) + esp_ShowExtendedSystemInfo(); +#endif + ret = benchmark_test(NULL); + printf("\nbenchmark_test complete! result code: %d\n", ret); +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/test/README mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/test/README --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/test/README 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/test/README 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/wolfssl_benchmark.code-workspace mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/wolfssl_benchmark.code-workspace --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/wolfssl_benchmark.code-workspace 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_benchmark/wolfssl_benchmark.code-workspace 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,13 @@ +{ + "folders": [ + { + "name": "wolfssl_benchmark", + "path": "." + } + ], + "settings": { + "files.associations": { + "settings.h": "c" + } + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_platformio.code-workspace mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_platformio.code-workspace --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_platformio.code-workspace 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_platformio.code-workspace 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,22 @@ +{ + "folders": [ + { + "name": "wolfsl_test", + "path": "wolfsl_test" + }, + { + "name": "wolfsl_benchmark", + "path": "wolfsl_benchmark" + } + ], + "settings": { + "files.associations": { + "version.h": "c", + "types.h": "c", + "settings.h": "c", + "freertos.h": "c", + "esp32-crypt.h": "c", + "esp_log.h": "c" + } + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.16.0) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(ESP_IDF_Hello_World) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,241 @@ +# wolfSSL Crypt Test Example + +This ESP32 example uses the [wolfSSL wolfcrypt Test Application](https://github.com/wolfSSL/wolfssl/tree/master/wolfcrypt/test). + +Other target boards _should_ work, but have not yet been tested. + +For general information on [wolfSSL examples for Espressif](../README.md), see the +[README](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/README.md) file. + + +## Example Output + +Note the default wolfSSL `user_settings.h` is configured by default to be the most +compatible across the widest ranges of targets. Contact wolfSSL at support@wolfssl.com +for help in optimizing for your particular application, or see the +[docs](https://www.wolfssl.com/documentation/manuals/wolfssl/index.html). + + +``` +ets Jun 8 2016 00:22:57 + +rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) +configsip: 0, SPIWP:0xee +clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 +mode:DIO, clock div:2 +load:0x3fff0030,len:7168 +load:0x40078000,len:15612 +load:0x40080400,len:4 +load:0x40080404,len:3736 +entry 0x40080624 +I (28) boot: ESP-IDF 5.2.1 2nd stage bootloader +I (29) boot: compile time May 17 2024 19:32:25 +W (29) boot: Unicore bootloader +I (32) boot: chip revision: v1.0 +I (36) boot.esp32: SPI Speed : 40MHz +I (41) boot.esp32: SPI Mode : DIO +I (45) boot.esp32: SPI Flash Size : 4MB +I (50) boot: Enabling RNG early entropy source... +I (55) boot: Partition Table: +I (59) boot: ## Label Usage Type ST Offset Length +I (66) boot: 0 nvs WiFi data 01 02 00009000 00006000 +I (74) boot: 1 phy_init RF data 01 01 0000f000 00001000 +I (81) boot: 2 factory factory app 00 00 00010000 00100000 +I (89) boot: End of partition table +I (93) esp_image: segment 0: paddr=00010020 vaddr=3f400020 size=31e24h (204324) map +I (175) esp_image: segment 1: paddr=00041e4c vaddr=3ffb0000 size=01c54h ( 7252) load +I (178) esp_image: segment 2: paddr=00043aa8 vaddr=40080000 size=0b3c0h ( 46016) load +I (200) esp_image: segment 3: paddr=0004ee70 vaddr=50000000 size=00004h ( 4) load +I (200) esp_image: segment 4: paddr=0004ee7c vaddr=00000000 size=0119ch ( 4508) +I (207) esp_image: segment 5: paddr=00050020 vaddr=400d0020 size=abb7ch (703356) map +I (473) boot: Loaded app from partition at offset 0x10000 +I (474) boot: Disabling RNG early entropy source... +I (485) cpu_start: Unicore app +I (485) cpu_start: Single core mode +I (493) cpu_start: Pro cpu start user code +I (493) cpu_start: cpu freq: 240000000 Hz +I (493) cpu_start: Application information: +I (498) cpu_start: Project name: ESP_IDF_Hello_World +I (504) cpu_start: App version: v5.7.0-stable-512-g15af87af8-di +I (511) cpu_start: Compile time: May 17 2024 19:31:47 +I (517) cpu_start: ELF file SHA256: 40b2541a0... +I (523) cpu_start: ESP-IDF: 5.2.1 +I (528) cpu_start: Min chip rev: v0.0 +I (532) cpu_start: Max chip rev: v3.99 +I (537) cpu_start: Chip rev: v1.0 +I (542) heap_init: Initializing. RAM available for dynamic allocation: +I (549) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM +I (555) heap_init: At 3FFB38C0 len 0002C740 (177 KiB): DRAM +I (561) heap_init: At 3FFE0440 len 0001FBC0 (126 KiB): D/IRAM +I (568) heap_init: At 40078000 len 00008000 (32 KiB): IRAM +I (574) heap_init: At 4008B3C0 len 00014C40 (83 KiB): IRAM +I (580) heap_init: At 3FF80000 len 00002000 (8 KiB): RTCRAM +I (588) spi_flash: detected chip: generic +I (591) spi_flash: flash io: dio +I (595) main_task: Started on CPU0 +I (598) main_task: Calling app_main() +I (603) wolfSSL demo: Found WOLFSSL_ESPIDF! +Hello World wolfSSL Version 5.7.0 +I (611) esp32_util: Extended Version and Platform Information. +I (617) esp32_util: Chip revision: v1.0 +I (622) esp32_util: SSID and plain text WiFi password not displayed in startup logs. +I (630) esp32_util: Define SHOW_SSID_AND_PASSWORD to enable display. +W (637) esp32_util: Warning: old cmake, user_settings.h location unknown. +I (645) esp32_util: LIBWOLFSSL_VERSION_STRING = 5.7.0 +I (650) esp32_util: LIBWOLFSSL_VERSION_HEX = 5007000 +I (656) esp32_util: Stack HWM: 9212 +I (660) esp32_util: +I (663) esp32_util: Macro Name Defined Not Defined +I (670) esp32_util: ------------------------- --------- ------------- +I (677) esp32_util: NO_ESPIDF_DEFAULT........ X +I (684) esp32_util: HW_MATH_ENABLED.......... X +I (689) esp32_util: WOLFSSL_SHA224........... X +I (695) esp32_util: WOLFSSL_SHA384........... X +I (700) esp32_util: WOLFSSL_SHA512........... X +I (706) esp32_util: WOLFSSL_SHA3............. X +I (712) esp32_util: HAVE_ED25519............. X +I (717) esp32_util: HAVE_AES_ECB............. X +I (724) esp32_util: HAVE_AES_DIRECT.......... X +I (730) esp32_util: USE_FAST_MATH............ X +I (736) esp32_util: WOLFSSL_SP_MATH_ALL...... X +I (743) esp32_util: SP_MATH.................. X +I (749) esp32_util: WOLFSSL_HW_METRICS....... X +I (755) esp32_util: RSA_LOW_MEM.............. X +I (760) esp32_util: SMALL_SESSION_CACHE...... X +I (767) esp32_util: WC_NO_HARDEN............. X +I (773) esp32_util: TFM_TIMING_RESISTANT..... X +I (779) esp32_util: ECC_TIMING_RESISTANT..... X +I (785) esp32_util: WC_NO_CACHE_RESISTANT.... X +I (790) esp32_util: WC_AES_BITSLICED......... X +I (797) esp32_util: WOLFSSL_AES_NO_UNROLL.... X +I (803) esp32_util: TFM_TIMING_RESISTANT..... X +I (809) esp32_util: ECC_TIMING_RESISTANT..... X +I (814) esp32_util: WC_RSA_BLINDING.......... X +I (820) esp32_util: NO_WRITEV................ X +I (825) esp32_util: FREERTOS................. X +I (831) esp32_util: NO_WOLFSSL_DIR........... X +I (837) esp32_util: WOLFSSL_NO_CURRDIR....... X +I (842) esp32_util: WOLFSSL_LWIP............. X +I (848) esp32_util: +I (851) esp32_util: Compiler Optimization: Default +I (856) esp32_util: +I (859) esp32_util: CONFIG_IDF_TARGET = esp32 +W (864) esp32_util: Watchdog active; missing WOLFSSL_ESP_NO_WATCHDOG definition. +I (872) esp32_util: CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ: 240 MHz +I (879) esp32_util: Xthal_have_ccount: 1 +I (883) esp32_util: CONFIG_MAIN_TASK_STACK_SIZE: 10500 +I (889) esp32_util: CONFIG_ESP_MAIN_TASK_STACK_SIZE: 10500 +I (895) esp32_util: CONFIG_TIMER_TASK_STACK_SIZE: 3584 +I (901) esp32_util: CONFIG_TIMER_TASK_STACK_DEPTH: 2048 +I (907) esp32_util: Stack HWM: 8988 +I (911) esp32_util: ESP32_CRYPT is enabled for ESP32. +I (917) esp32_util: NOT SINGLE_THREADED +I (921) esp32_util: Boot count: 1 +------------------------------------------------------------------------------ + wolfSSL version 5.7.0 +------------------------------------------------------------------------------ +error test passed! +MEMORY test passed! +base64 test passed! +base16 test passed! +asn test passed! +RANDOM test passed! +MD5 test passed! +MD2 test passed! +MD4 test passed! +SHA test passed! +SHA-224 test passed! +SHA-256 test passed! +SHA-384 test passed! +SHA-512 test passed! +SHA-512/224 test passed! +SHA-512/256 test passed! +SHA-3 test passed! +SHAKE128 test passed! +SHAKE256 test passed! +Hash test passed! +BLAKE2b test passed! +BLAKE2s test passed! +HMAC-MD5 test passed! +HMAC-SHA test passed! +HMAC-SHA224 test passed! +HMAC-SHA256 test passed! +HMAC-SHA384 test passed! +HMAC-SHA512 test passed! +HMAC-SHA3 test passed! +HMAC-KDF test passed! +SSH-KDF test passed! +PRF test passed! +TLSv1.2 KDF test passed! +TLSv1.3 KDF test passed! +X963-KDF test passed! +HPKE test passed! +GMAC test passed! +RC2 test passed! +ARC4 test passed! +POLY1305 test passed! +DES test passed! +DES3 test passed! +AES test passed! +AES192 test passed! +AES256 test passed! +AES-OFB test passed! +AES-GCM test passed! +AES-CFB test passed! +AES-XTS test passed! +AES Key Wrap test passed! +AES-SIV test passed! +AES-EAX test passed! +RSA test passed! +DH test passed! +DSA test passed! +SRP test passed! +PWDBASED test passed! +PKCS12 test passed! +openSSL extra test +OPENSSL test passed! +OPENSSL (EVP MD) passed! +OPENSSL (PKEY0) passed! +OPENSSL (PKEY1) passed! +OPENSSL (EVP Sign/Verify) passed! +ECC test passed! +ECC buffer test passed! +CURVE25519 test passed! +ED25519 test passed! +CMAC test passed! +PKCS7encrypted test passed! +PKCS7signed test passed! +PKCS7enveloped test passed! +PKCS7authenveloped test passed! +mp test passed! +prime test passed! +logging test passed! +time test passed! +mutex test passed! +cert piv test passed! +I (261247) wolfssl_esp32_mp: +I (261248) wolfssl_esp32_mp: esp_mp_mul HW acceleration enabled. +I (261255) wolfssl_esp32_mp: Number of calls to esp_mp_mul: 3413 +I (261262) wolfssl_esp32_mp: Success: no esp_mp_mul() errors. +I (261268) wolfssl_esp32_mp: +I (261272) wolfssl_esp32_mp: esp_mp_mulmod HW acceleration enabled. +I (261279) wolfssl_esp32_mp: Number of calls to esp_mp_mulmod: 2170 +I (261286) wolfssl_esp32_mp: Number of fallback to SW mp_mulmod: 331 +I (261293) wolfssl_esp32_mp: Success: no esp_mp_mulmod errors. +I (261299) wolfssl_esp32_mp: Success: no esp_mp_mulmod even mod. +I (261306) wolfssl_esp32_mp: Success: no esp_mp_mulmod small x or y. +I (261313) wolfssl_esp32_mp: +I (261317) wolfssl_esp32_mp: Number of calls to esp_mp_exptmod: 659 +I (261324) wolfssl_esp32_mp: Number of fallback to SW mp_exptmod: 105 +I (261331) wolfssl_esp32_mp: Success: no esp_mp_exptmod errors. +I (261337) wolfssl_esp32_mp: Max N->used: esp_mp_max_used = 64 +I (261344) wolfssl_esp32_mp: Max timeout: esp_mp_max_timeout = 1 +Test complete +I (261352) wc_test: Exiting main with return code: 0 + + +wolf_test_task complete! result code: 0 +I (261361) main_task: Returned from app_main() +``` + +See the README.md file in the upper level 'examples' directory for [more information about examples](../README.md). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/README mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/README --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/README 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/README 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/main.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/main.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/main.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/include/main.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +/* PlatformIO wolfssl_test main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/lib/README mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/lib/README --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/lib/README 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/lib/README 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/platformio.ini mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/platformio.ini --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/platformio.ini 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/platformio.ini 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,42 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +; +; To ensure that you are always using the newest version of a library: +; lib_deps = wolfssl/wolfSSL@* +; +; If you want to stay within a certain range of versions while still +; getting updates, you can use semantic versioning to specify an acceptable +; range. For example, to get any version in the 5.x.x series: +; lib_deps = wolfssl/wolfSSL@^5.0.0 +; +; If you specifically want to ensure that you always get the latest version +; that matches 5.7.0 or newer, you could use: +; lib_deps = wolfssl/wolfSSL@>=5.7.0 +; +; If you want to test drive previews, see the staging versions: +; https://registry.platformio.org/search?q=owner%3Awolfssl-staging +; +; lib_deps = wolfssl-staging/wolfSSL@^5.7.0-test.rev03 +; +; The regular release of wolfssl (yes there's a case difference from staging') +; +; lib_deps = wolfssl/wolfssl@^5.7.0-rev.3c + +[env:esp32dev] +platform = espressif32 +board = esp32dev +framework = espidf +upload_port = COM19 +monitor_port = COM19 +monitor_speed = 115200 +build_flags = -DWOLFSSL_USER_SETTINGS, -DWOLFSSL_ESP32 +monitor_filters = direct +lib_deps = wolfssl/wolfssl@^5.7.0-rev.3d diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/sdkconfig.defaults mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/sdkconfig.defaults --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/sdkconfig.defaults 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/sdkconfig.defaults 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,98 @@ +# sdkconfig.defaults for ESP8266 + ESP32 +# Note that during the build process, settings from sdkconfig.defaults will not override those already in sdkconfig. +# See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#custom-sdkconfig-defaults +CONFIG_BENCH_ARGV="-lng 0" +CONFIG_FREERTOS_HZ=1000 +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y + +# +# Default main stack size. See user_settings.h +# +# For wolfSSL SMALL_STACK, 3072 bytes should be sufficient for benchmark app. +# When using RSA, assign at least 10500 bytes, otherwise 5500 usually works for others +CONFIG_ESP_MAIN_TASK_STACK_SIZE=10500 + +# Legacy stack size for older ESP-IDF versions +CONFIG_MAIN_TASK_STACK_SIZE=10500 + +# +# Benchmark must not have CONFIG_NEWLIB_NANO_FORMAT enabled +CONFIG_NEWLIB_NANO_FORMAT=n +# +# Watchdog Timers +# +# We don't want to have the watchdog timeout during tests & benchmarks +# +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=n +CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=n +# Panic & Watchdog +CONFIG_ESP_INT_WDT_TIMEOUT_MS=10000 +CONFIG_ESP_TASK_WDT_EN=n +CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y +CONFIG_ESP_INT_WDT=n + +# ESP8266 WDT +# CONFIG_ESP_PANIC_PRINT_REBOOT is not set +CONFIG_ESP_PANIC_PRINT_REBOOT=n +CONFIG_ESP_PANIC_PRINT_HALT=y + +# CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS is not set +CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=n + +# ESP8266 Memory +CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y +CONFIG_HEAP_DISABLE_IRAM=y + +# Performance +# CONFIG_COMPILER_OPTIMIZATION_PERF=y + +# Set max COU frequency (falls back as needed for lower maximum) +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y + +# FreeRTOS ticks at 1ms interval +CONFIG_FREERTOS_UNICORE=y +CONFIG_FREERTOS_HZ=1000 + +# +# Compiler options +# +CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y +# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set +# CONFIG_COMPILER_OPTIMIZATION_PERF is not set +# CONFIG_COMPILER_OPTIMIZATION_NONE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y +CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 +# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set +CONFIG_COMPILER_HIDE_PATHS_MACROS=y +# CONFIG_COMPILER_CXX_EXCEPTIONS is not set +# CONFIG_COMPILER_CXX_RTTI is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_NONE is not set +CONFIG_COMPILER_STACK_CHECK_MODE_NORM=y +# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set +# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set +CONFIG_COMPILER_STACK_CHECK=y +# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set +# CONFIG_COMPILER_SAVE_RESTORE_LIBCALLS is not set +# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set +# CONFIG_COMPILER_DUMP_RTL_FILES is not set +# end of Compiler options + +# We don't know that the min is actually v2, +# but this is the earliest tested. +CONFIG_ESP32C3_REV_MIN_2=y + +# +# Partition Table +# +# CONFIG_PARTITION_TABLE_SINGLE_APP is not set +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y +# CONFIG_PARTITION_TABLE_TWO_OTA is not set +# CONFIG_PARTITION_TABLE_CUSTOM is not set +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_singleapp_large.csv" +CONFIG_PARTITION_TABLE_OFFSET=0x8000 +CONFIG_PARTITION_TABLE_MD5=y +# end of Partition Table diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,6 @@ +# This file was automatically generated for projects +# without default 'CMakeLists.txt' file. + +FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*) + +idf_component_register(SRCS ${app_sources}) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/main.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/src/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,48 @@ +/* PlatformIO wolfssl_test main.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include "main.h" + +#include +#ifdef WOLFSSL_ESPIDF + #include + #include + #include +#endif + +#include +#include +#include + +#define TAG "wolfSSL demo" + +void app_main() { + int ret = 0; +#ifdef WOLFSSL_ESPIDF + ESP_LOGI(TAG, "Found WOLFSSL_ESPIDF!"); +#endif + printf("Hello World wolfSSL Version %s\n", LIBWOLFSSL_VERSION_STRING); + +#if defined(HAVE_VERSION_EXTENDED_INFO) && defined(WOLFSSL_ESPIDF) + esp_ShowExtendedSystemInfo(); +#endif + ret = wolf_test_task(); + printf("\nwolf_test_task complete! result code: %d\n", ret); +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/test/README mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/test/README --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/test/README 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/test/README 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Test Runner and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/wolfssl_test.code-workspace mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/wolfssl_test.code-workspace --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/wolfssl_test.code-workspace 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/examples/wolfssl_test/wolfssl_test.code-workspace 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,14 @@ +{ + "folders": [ + { + "name": "wolfssl_test", + "path": "." + } + ], + "settings": { + "files.associations": { + "settings.h": "c", + "sdkconfig.h": "c" + } + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/PlatformIO/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/PlatformIO/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,41 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root +# +# NOTE: append_wolfssl_git_version.sh is not included as the +# distribution file set will not contain GitHub info +# +# see: https://github.com/wolfSSL/wolfssl/pull/5955 +# +# Don't list any config.h files here + +EXTRA_DIST+= IDE/PlatformIO/README.md + +EXTRA_DIST+= IDE/PlatformIO/examples/README.md +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_platformio.code-workspace + +# wolfssl_benchmark example +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/CMakeLists.txt +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/platformio.ini +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/README.md +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/sdkconfig.defaults +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/wolfssl_benchmark.code-workspace +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/include/main.h +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/include/README +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/lib/README +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/src/CMakeLists.txt +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/src/main.c +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_benchmark/test/README + +# wolfssl_test example +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/CMakeLists.txt +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/platformio.ini +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/README.md +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/sdkconfig.defaults +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/wolfssl_test.code-workspace +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/include/main.h +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/include/README +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/lib/README +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/src/CMakeLists.txt +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/src/main.c +EXTRA_DIST+= IDE/PlatformIO/examples/wolfssl_test/test/README diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/QNX/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/QNX/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/QNX/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/QNX/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -17,7 +17,7 @@ make ``` -Once the wolfSSL library has been built cd to IDE/QNX/CAAM-DRIVER and run "make". This will produce the wolfCrypt resource manager. It should be started on the device with root permisions. Once wolfCrypt is running on the device with root permisions then any user with access to open a connection to /dev/wolfCrypt can make use of the driver. +Once the wolfSSL library has been built cd to IDE/QNX/CAAM-DRIVER and run "make". This will produce the wolfCrypt resource manager. It should be started on the device with root permissions. Once wolfCrypt is running on the device with root permissions then any user with access to open a connection to /dev/wolfCrypt can make use of the driver. ### Momentics To build in momentics IDE: diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/arm_startup.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/arm_startup.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/arm_startup.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/arm_startup.c 2024-08-03 07:30:00.000000000 +0000 @@ -51,7 +51,7 @@ void meminit32(uint32_t* start, uint32_t* end) { while (start < end) { - *start++ = 0; + *start++ = 0; } } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/ROWLEY-CROSSWORKS-ARM/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -53,7 +53,6 @@ #define WOLFSSL_HAVE_SP_RSA #define WOLFSSL_HAVE_SP_DH #define WOLFSSL_HAVE_SP_ECC - //#define WOLFSSL_SP_CACHE_RESISTANT #define WOLFSSL_SP_MATH /* only SP math - eliminates fast math code */ /* SP Assembly Speedups */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/README_en.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/README_en.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/README_en.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/README_en.txt 2024-08-03 07:30:00.000000000 +0000 @@ -12,7 +12,7 @@ - Unzip wolfssl under the same directory 2. Set up wolfSSL - - open wolfssl\IDE\Renesas\cs+\Projec/wolfssl\lib.mtpj with CS+ and build + - open wolfssl\IDE\Renesas\cs+\Projects\wolfssl\lib.mtpj with CS+ and build - open t4_demo.mtpj and build. This create demo program library. 3. Set up AlphaProject diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/wolf_client.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/wolf_client.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/wolf_client.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/cs+/Projects/t4_demo/wolf_client.c 2024-08-03 07:30:00.000000000 +0000 @@ -104,12 +104,12 @@ } #if !defined(NO_FILESYSTEM) - if (wolfSSL_CTX_load_verify_locations(ctx, cert, 0) != SSL_SUCCESS) { + if (wolfSSL_CTX_load_verify_locations(ctx, cert, 0) != WOLFSSL_SUCCESS) { printf("ERROR: can't load \"%s\"\n", cert); return NULL; } #else - if (wolfSSL_CTX_load_verify_buffer(ctx, cert, SIZEOF_CERT, SSL_FILETYPE_ASN1) != SSL_SUCCESS){ + if (wolfSSL_CTX_load_verify_buffer(ctx, cert, SIZEOF_CERT, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS){ printf("ERROR: can't load certificate data\n"); return NULL; } @@ -138,14 +138,14 @@ T_IPV4EP dst_addr; if(args->argc >= 2){ - if((dst_addr.ipaddr = getIPaddr(args->argv[1])) == 0){ - printf("ERROR: IP address\n"); - return; - } - if((dst_addr.portno = getPort(args->argv[2])) == 0){ - printf("ERROR: IP address\n"); - return; - } + if((dst_addr.ipaddr = getIPaddr(args->argv[1])) == 0){ + printf("ERROR: IP address\n"); + return; + } + if((dst_addr.portno = getPort(args->argv[2])) == 0){ + printf("ERROR: Port number\n"); + return; + } } if((ercd = tcp_con_cep(cepid, &my_addr, &dst_addr, TMO_FEVR)) != E_OK) { @@ -162,7 +162,7 @@ wolfSSL_SetIOReadCtx(ssl, (void *)&cepid); wolfSSL_SetIOWriteCtx(ssl, (void *)&cepid); - if(wolfSSL_connect(ssl) != SSL_SUCCESS) { + if(wolfSSL_connect(ssl) != WOLFSSL_SUCCESS) { printf("ERROR SSL connect: %d\n", wolfSSL_get_error(ssl, 0)); return; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -18,7 +18,7 @@ - Generate the changes by clicking on "Generate Project Content" - Exclude src/wolfcrypt/port and all src/wolfcrypt/*.S and src/wolfcrypt/*.asm files from the build - Exclude src/wolfcrypt/evp.c, src/wolfcrypt/misc.c and src/wolfssl/bio.c -- Set the Preprocessor define in wolfssl proejct to have WOLFSSL_USER_SETTINGS. Right click on wolfssl project "Properties -> C/C++ Build -> GNU ARM Cross C Compiler -> Preprocessor" add WOLFSSL_USER_SETTINGS under "Defined symbols" +- Set the Preprocessor define in wolfssl project to have WOLFSSL_USER_SETTINGS. Right click on wolfssl project "Properties -> C/C++ Build -> GNU ARM Cross C Compiler -> Preprocessor" add WOLFSSL_USER_SETTINGS under "Defined symbols" - Set include to wolfssl directory. Right click on project "Properties -> C/C++Build -> GNU ARM Cross Compiler -> Includes". Add "${ProjDirPath}/../../../../.." and "${ProjDirPath}/../" - Build wolfssl by right clicking on wolfssl project and selecting "Build Project" @@ -29,7 +29,7 @@ - Copy in the .cproject, .project and source file from the template desired i.e. wolfssl-X.X.X/IDE/Renesas/e2studio/DK-S7G2/wolfcrypttest-template/ - Right click on the created project and select "Build Project" -The example_server loops looking to accept connections and closes immediatly after a successful connection was made. +The example_server loops looking to accept connections and closes immediately after a successful connection was made. The benchmark example tries to do a TCP connection to SERVER_IP on port 11112 and a TLS connection to SERVER_IP on port 11111 then does wolfCrypt benchmark collection. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/benchmark-template/src/app_entry.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/benchmark-template/src/app_entry.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/benchmark-template/src/app_entry.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/DK-S7G2/benchmark-template/src/app_entry.c 2024-08-03 07:30:00.000000000 +0000 @@ -41,10 +41,10 @@ #define TLS_PORT 11111 #define TCP_PORT 11112 -static double miliseconds = 0; +static double milliseconds = 0; void timer_callback(timer_callback_args_t * args) { - miliseconds++; + milliseconds++; (void)args; } @@ -127,7 +127,7 @@ printf("Trying to connect to 0x%lX on port %d\n", TEST_IP, TEST_PORT); - miliseconds = 0; + milliseconds = 0; g_timer0.p_api->open(g_timer0.p_ctrl, g_timer0.p_cfg); g_timer0.p_api->start(g_timer0.p_ctrl); @@ -195,7 +195,7 @@ g_timer0.p_api->close(g_timer0.p_ctrl); printf("%d TLS connections took %f seconds and %f tx_time ticks\n", - CONNECTION_TIMES, (miliseconds / 10), start); + CONNECTION_TIMES, (milliseconds / 10), start); wolfSSL_CTX_free(ctx); } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/test/src/wolf_client.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/test/src/wolf_client.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/test/src/wolf_client.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/test/src/wolf_client.c 2024-08-03 07:30:00.000000000 +0000 @@ -117,12 +117,12 @@ } #if !defined(NO_FILESYSTEM) - if (wolfSSL_CTX_load_verify_locations(client_ctx, cert, 0) != SSL_SUCCESS) { + if (wolfSSL_CTX_load_verify_locations(client_ctx, cert, 0) != WOLFSSL_SUCCESS) { printf("ERROR: can't load \"%s\"\n", cert); return NULL; } #else - if (wolfSSL_CTX_load_verify_buffer(client_ctx, cert, SIZEOF_CERT, SSL_FILETYPE_ASN1) != SSL_SUCCESS){ + if (wolfSSL_CTX_load_verify_buffer(client_ctx, cert, SIZEOF_CERT, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS){ printf("ERROR: can't load certificate data\n"); return; } @@ -157,7 +157,7 @@ return; } if((dst_addr.portno = getPort(SIMPLE_TLSSERVER_PORT)) == 0){ - printf("ERROR: IP address\n"); + printf("ERROR: Port number\n"); return; } @@ -175,7 +175,7 @@ wolfSSL_SetIOReadCtx(ssl, (void *)&cepid); wolfSSL_SetIOWriteCtx(ssl, (void *)&cepid); - if(wolfSSL_connect(ssl) != SSL_SUCCESS) { + if(wolfSSL_connect(ssl) != WOLFSSL_SUCCESS) { printf("ERROR SSL connect: %d\n", wolfSSL_get_error(ssl, 0)); return; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/tools/rsa_pss_sign.sh mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/tools/rsa_pss_sign.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/tools/rsa_pss_sign.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/Projects/tools/rsa_pss_sign.sh 2024-08-03 07:30:00.000000000 +0000 @@ -29,6 +29,6 @@ echo verify by private key openssl dgst -sha256 -prverify $1 -sigopt $SIGOPT -sigopt $SIGOPT2 -signature $3.sign $3 -echo verifiy by public key +echo verify by public key openssl dgst -sha256 -verify $2 -sigopt $SIGOPT -sigopt $SIGOPT2 -signature $3.sign $3 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -122,7 +122,7 @@ + Build wolfSSL_RA6M3. 5.) Copy files from `dummy_app` into each executable projects\ -+ Select and Copy the followng folder inside dummy_app\ ++ Select and Copy the following folder inside dummy_app\ `script/` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README_APRA6M_en.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README_APRA6M_en.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README_APRA6M_en.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/README_APRA6M_en.md 2024-08-03 07:30:00.000000000 +0000 @@ -106,7 +106,7 @@ 6.) Copy files from `dummy_app` into `./IDE/Renesas/e2studio/RA6M3/common/ra6m3g/` **NOTE:** This may need to be done outside of the e2studio environment (e.g. File Explorer). -+ Select and Copy the followng folder inside dummy_app ++ Select and Copy the following folder inside dummy_app `src/` `script/` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/client-wolfssl/src/wolfssl_thread_entry.c 2024-08-03 07:30:00.000000000 +0000 @@ -52,7 +52,6 @@ /* FreeRTOS+TCP Objects */ BaseType_t fr_status; - socklen_t xSize = sizeof(struct freertos_sockaddr); xSocket_t xClientSocket = NULL; struct freertos_sockaddr xRemoteAddress; @@ -93,7 +92,7 @@ FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP); configASSERT(xClientSocket != FREERTOS_INVALID_SOCKET); - FreeRTOS_bind(xClientSocket, &xRemoteAddress, sizeof(xSize)); + FreeRTOS_bind(xClientSocket, &xRemoteAddress, sizeof(xRemoteAddress)); /* Client Socket Connect */ ret = FreeRTOS_connect(xClientSocket, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M3/server-wolfssl/src/wolfssl_thread_entry.c 2024-08-03 07:30:00.000000000 +0000 @@ -151,7 +151,7 @@ /* Read the client data into our buff array */ if (ret != WOLFSSL_SUCCESS) { - printf("Error [%d]: wolfSSL_set_fd.\n",ret); + printf("Error [%d]: wolfSSL_accept.\n",ret); break; } memset(buff, 0, sizeof(buff)); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -102,7 +102,7 @@ + Enter `dummy_application` as the project name. Click Next. + Under `RA library project`, select `wolfSSL_RA6M4`. + Click Finish. -+ Copy the followng folder and file at `dummy_application` to `test_RA6M4`\ ++ Copy the following folder and file at `dummy_application` to `test_RA6M4`\ script/\ src/sce_tst_thread_entry.c @@ -136,7 +136,7 @@ you can specify "RTT control block" to 0x20020000 0x10000 by Search Range ## Run Client -1.) Enable TLS_CLIENT definition in wolfssl_demo.h of test_RA6M4 projet +1.) Enable TLS_CLIENT definition in wolfssl_demo.h of test_RA6M4 project 2.) Client IP address and Server IP address @@ -233,7 +233,7 @@ ### Run Multi Client Session example -1.) Enable TLS_CLIENT and TLS_MULTITHREAD_TEST definition in wolfssl_demo.h of test_RA6M4 projet +1.) Enable TLS_CLIENT and TLS_MULTITHREAD_TEST definition in wolfssl_demo.h of test_RA6M4 project 2.) Follow [Run Client](#run-client) instruction diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -18,6 +18,32 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + /* FSP SM stands for Flexible Software Package Security Module + * WOLFSSL_RENESAS_FSPSM enables fundamental code when it uses. + * e.g. Open/Close/Random generator + * WOLFSSL_RENESAS_FSPSPM_TLS enables TLS related code for FSP SM + * e.g. Certificate verification, Master Secret Generation + * WOLFSSL_RENESAS_SCEPROTECT enables specific code for SCE if needed + */ + #define WOLFSSL_RENESAS_FSPSM + #define WOLFSSL_RENESAS_FSPSM_TLS +#endif + + /* XXX_CRYPTONLY definition enables FSP SM module for Crypto only use. + * Therefore, it disables TLS related API use + */ +/* #define WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY */ + +#if defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) + #undef WOLFSSL_RENESAS_FSPSM_TLS + #define WOLFSSL_RENESAS_FSPSM_CRYPTONLY + + #if !defined(WOLFSSL_RENESAS_SCEPROTECT) + #define WOLFSSL_RENESAS_SCEPROTECT + #endif +#endif + /* Operating Environment and Threading */ #define FREERTOS #define FREERTOS_TCP @@ -25,6 +51,7 @@ #define NO_MAIN_DRIVER #define BENCH_EMBEDDED #define NO_WRITEV +#define WOLFSSL_NO_FLOAT_FMT #define NO_DEV_RANDOM #define SIZEOF_LONG_LONG 8 @@ -61,6 +88,9 @@ #define printf myprintf #endif +/* Enable the following definition to use TLS 1.3 + * For TLS1.3 use "extended-master" needs to turn on + */ /* #define WOLFSSL_TLS13 */ #if defined(WOLFSSL_TLS13) @@ -73,12 +103,17 @@ #endif #define WOLF_CRYPTO_CB -/* Enable SCEKEY_INSTALLED if keys are installed */ -#define SCEKEY_INSTALLED -#if defined(WOLFSSL_RENESAS_SCEPROTECT) && defined(SCEKEY_INSTALLED) +#if defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) #define HAVE_RENESAS_SYNC + #define WC_USE_DEVID 7890 + #define NO_AES_192 + #define NO_SW_BENCH #endif #if defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) #define WOLFSSL_KEY_GEN #endif + +#define CUSTOM_RAND_GENERATE_BLOCK wc_fspsm_GenerateRandBlock +/* use original asn parsing */ +#define WOLFSSL_ASN_ORIGINAL diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/wolfssl_demo.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/wolfssl_demo.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/wolfssl_demo.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/common/wolfssl_demo.h 2024-08-03 07:30:00.000000000 +0000 @@ -36,7 +36,7 @@ #define DIRECT_KEY_ADDRESS_128 FLASH_HP_DF_BLOCK_2 /* Client connects to the server with these details. */ -#define SERVER_IP "192.168.11.49" +#define SERVER_IP "192.168.11.4" #define DEFAULT_PORT 11111 /* Enable wolfcrypt test */ @@ -45,7 +45,7 @@ /* Enable benchmark */ /* can be enabled with cyrpt test */ -/*#define BENCHMARK*/ +/* #define BENCHMARK */ /* Enable TLS client */ /* cannot enable with CRYPT_TEST or BENCHMARK */ @@ -82,7 +82,7 @@ void sce_test(); void TCPInit(); void wolfSSL_TLS_client_init(); -void wolfSSL_TLS_client_do(void *pvParam); +int wolfSSL_TLS_client_do(void *pvParam); void wolfSSL_TLS_cleanup(); extern WOLFSSL_CTX *client_ctx; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RA6M4/test/.cproject 2024-08-03 07:30:00.000000000 +0000 @@ -40,7 +40,7 @@ @@ -267,11 +267,7 @@ - - - - @@ -279,6 +275,10 @@ + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/.project 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/.project 2024-08-03 07:30:00.000000000 +0000 @@ -40,6 +40,11 @@ PARENT-2-PROJECT_LOC/wolfssl_demo/user_settings.h + src/wolfssl_tsip_unit_test.c + 1 + PARENT-2-PROJECT_LOC/wolfssl_demo/wolfssl_tsip_unit_test.c + + src/key_data/key_data.c 1 PARENT-2-PROJECT_LOC/wolfssl_demo/key_data.c diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/client/simple_tls_tsip_client.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/client/simple_tls_tsip_client.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/client/simple_tls_tsip_client.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/client/simple_tls_tsip_client.c 2024-08-03 07:30:00.000000000 +0000 @@ -31,7 +31,7 @@ #include #endif -#define SIMPLE_TLSSEVER_IP "192.168.10.10" +#define SIMPLE_TLSSEVER_IP "192.168.11.9" #define SIMPLE_TLSSERVER_PORT "11111" ER t4_tcp_callback(ID cepid, FN fncd , VP p_parblk); @@ -103,7 +103,7 @@ char *cert = "./certs/ca-cert.pem"; #endif #else - #if defined(USE_ECC_CERT) && defined(USE_CERT_BUFFERS_256) + #if defined(USE_ECC_CERT) && defined(USE_CERT_BUFFERS_256) const unsigned char *cert = ca_ecc_cert_der_256; #define SIZEOF_CERT sizeof_ca_ecc_cert_der_256 #else @@ -118,7 +118,7 @@ #endif /* Create and initialize WOLFSSL_CTX */ - if ((client_ctx = + if ((client_ctx = wolfSSL_CTX_new(wolfSSLv23_client_method_ex((void *)NULL))) == NULL) { printf("ERROR: failed to create WOLFSSL_CTX\n"); return; @@ -134,7 +134,7 @@ return; } #else - if (wolfSSL_CTX_load_verify_buffer(client_ctx, cert, SIZEOF_CERT, + if (wolfSSL_CTX_load_verify_buffer(client_ctx, cert, SIZEOF_CERT, SSL_FILETYPE_ASN1) != SSL_SUCCESS){ printf("ERROR: can't load certificate data\n"); return; @@ -151,24 +151,6 @@ return; } - /* set client private key data */ - #if defined(WOLFSSL_TLS13) && defined(SIMPLE_TLS_TSIP_CLIENT) - if (tsip_set_clientPrivateKeyEnc( - g_key_block_data.encrypted_user_ecc256_private_key, - TSIP_ECCP256) != 0) { - printf("ERROR: can't load client-private key\n"); - return; - } - #else - if (wolfSSL_CTX_use_PrivateKey_buffer(client_ctx, - ecc_clikey_der_256, - sizeof_ecc_clikey_der_256, - SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) { - printf("ERROR: can't load private-key data.\n"); - return; - } - #endif /* WOLFSSL_TLS13 */ - #else if (wolfSSL_CTX_use_certificate_chain_buffer_format(client_ctx, client_cert_der_2048, @@ -195,15 +177,15 @@ wolfSSL_SetIOSend(client_ctx, my_IOSend); /* use specific cipher */ - if (cipherlist != NULL && + if (cipherlist != NULL && wolfSSL_CTX_set_cipher_list(client_ctx, cipherlist) != WOLFSSL_SUCCESS) { wolfSSL_CTX_free(client_ctx); client_ctx = NULL; printf("client can't set cipher list"); return; } - + #if defined(WOLFSSL_TLS13) - if (wolfSSL_CTX_UseSupportedCurve(client_ctx, WOLFSSL_ECC_SECP256R1) + if (wolfSSL_CTX_UseSupportedCurve(client_ctx, WOLFSSL_ECC_SECP256R1) != WOLFSSL_SUCCESS) { wolfSSL_CTX_free(client_ctx); client_ctx = NULL; printf("client can't set use supported curves\n"); @@ -222,11 +204,11 @@ #define BUFF_SIZE 256 static const char sendBuff[]= "Hello Server\n" ; - + char rcvBuff[BUFF_SIZE] = {0}; - + static T_IPV4EP my_addr = { 0, 0 }; - + T_IPV4EP dst_addr; if((dst_addr.ipaddr = getIPaddr(SIMPLE_TLSSEVER_IP)) == 0){ @@ -234,7 +216,7 @@ goto out; } if((dst_addr.portno = getPort(SIMPLE_TLSSERVER_PORT)) == 0){ - printf("ERROR: IP address\n"); + printf("ERROR: Port number\n"); goto out; } @@ -248,9 +230,45 @@ goto out; } - #ifdef SIMPLE_TLS_TSIP_CLIENT +#ifdef SIMPLE_TLS_TSIP_CLIENT tsip_set_callback_ctx(ssl, &userContext); +#endif + + /* set client private key data */ +#if defined(WOLFSSL_TLS13) && defined(SIMPLE_TLS_TSIP_CLIENT) + #if defined(USE_ECC_CERT) + if (tsip_use_PrivateKey_buffer_TLS(ssl, + (const char*)g_key_block_data.encrypted_user_ecc256_private_key, + sizeof(g_key_block_data.encrypted_user_ecc256_private_key), + TSIP_ECCP256) != 0) { + printf("ERROR: can't load client-private key\n"); + return; + } + #else + if (tsip_use_PrivateKey_buffer_TLS(ssl, + (const char*)g_key_block_data.encrypted_user_rsa2048_private_key, + sizeof(g_key_block_data.encrypted_user_rsa2048_private_key), + TSIP_RSA2048) != 0) { + printf("ERROR: can't load client-private key\n"); + return; + } + ret = tsip_use_PublicKey_buffer_TLS(ssl, + (const char*)g_key_block_data.encrypted_user_rsa2048_public_key, + sizeof(g_key_block_data.encrypted_user_rsa2048_public_key), TSIP_RSA2048); + if (ret != 0) { + printf("ERROR tsip_use_PublicKey_buffer: %d\n", ret); + return; + } #endif +#else + if (wolfSSL_use_PrivateKey_buffer(ssl, + ecc_clikey_der_256, + sizeof_ecc_clikey_der_256, + SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) { + printf("ERROR: can't load private-key data.\n"); + return; + } +#endif /* WOLFSSL_TLS13 */ /* set callback context */ wolfSSL_SetIOReadCtx(ssl, (void *)&cepid); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/test_main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/test_main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/test_main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/test_main.c 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,7 @@ #include "wolfssl/wolfcrypt/types.h" #if defined(SIMPLE_TCP_CLIENT) || defined(SIMPLE_TLS_CLIENT) || \ - defined(SIMPLE_TLS_TSIP_CLIENT) + defined(SIMPLE_TLS_TSIP_CLIENT) #define SIMPLE_CLIENT #endif @@ -251,7 +251,7 @@ printf("End wolfCrypt Benchmark\n"); #endif #elif defined(SIMPLE_TCP_CLIENT) || defined(SIMPLE_TLS_CLIENT) || \ - defined(SIMPLE_TLS_TSIP_CLIENT) + defined(SIMPLE_TLS_TSIP_CLIENT) #include "r_cmt_rx_if.h" Open_tcp(); @@ -265,7 +265,7 @@ #if defined(SIMPLE_TCP_CLIENT) simple_tcp_client(); #elif defined(SIMPLE_TLS_CLIENT) || defined(SIMPLE_TLS_TSIP_CLIENT) - if(cipherlist_sz > 0 ) printf("cipher : %s\n", cipherlist[i]); + if(cipherlist_sz > 0 ) printf("cipher : %s\n", cipherlist[i]); wolfSSL_TLS_client_init(cipherlist[i]); wolfSSL_TLS_client(); @@ -287,6 +287,23 @@ wolfSSL_TLS_server(); #endif Close_tcp(); +#elif defined(TSIP_CRYPT_UNIT_TEST) + if ((ret = wolfCrypt_Init()) != 0) { + printf("wolfCrypt_Init failed %d\n", ret); + } + + printf("Start wolf tsip crypt Test\n"); + + printf(" \n"); + printf(" simple crypt test by using TSIP\n"); + tsip_crypt_test(); + + printf(" \n"); + printf("End wolf tsip crypt Test\n"); + + if ((ret = wolfCrypt_Cleanup()) != 0) { + printf("wolfCrypt_Cleanup failed %d\n", ret); + } #endif } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/wolfssl_simple_demo.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/wolfssl_simple_demo.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/wolfssl_simple_demo.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/src/wolfssl_simple_demo.h 2024-08-03 07:30:00.000000000 +0000 @@ -54,7 +54,7 @@ void simple_tcp_server(); #if defined(SIMPLE_TCP_CLIENT) || defined(SIMPLE_TLS_CLIENT) || \ - defined(SIMPLE_TCP_SERVER) || defined(SIMPLE_TLS_SERVER) + defined(SIMPLE_TCP_SERVER) || defined(SIMPLE_TLS_SERVER) #define min(x,y) ((x)<(y)?(x):(y)) int isascii(const char *s); #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/test.scfg mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/test.scfg --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/test.scfg 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/test/test.scfg 2024-08-03 07:30:00.000000000 +0000 @@ -950,11 +950,6 @@
- - - - - @@ -1136,6 +1131,11 @@ + + + + +
diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/.project 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/.project 2024-08-03 07:30:00.000000000 +0000 @@ -80,6 +80,11 @@ PARENT-7-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c + wolfcrypt/port/renesas_tsip_rsa.c + 1 + PARENT-7-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c + + wolfcrypt/port/renesas_tsip_sha.c 1 PARENT-7-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/wolfssl.rcpc mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/wolfssl.rcpc --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/wolfssl.rcpc 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/Simple/wolfssl/wolfssl.rcpc 2024-08-03 07:30:00.000000000 +0000 @@ -22,6 +22,7 @@ ..\..\..\..\..\..\..\wolfcrypt\src\port\Renesas\renesas_common.c ..\..\..\..\..\..\..\wolfcrypt\src\port\Renesas\renesas_tsip_aes.c + ..\..\..\..\..\..\..\wolfcrypt\src\port\Renesas\renesas_tsip_rsa.c ..\..\..\..\..\..\..\wolfcrypt\src\port\Renesas\renesas_tsip_sha.c ..\..\..\..\..\..\..\wolfcrypt\src\port\Renesas\renesas_tsip_util.c @@ -145,6 +146,7 @@ Debug\wolfio.obj Debug\renesas_common.obj Debug\renesas_tsip_aes.obj + Debug\renesas_tsip_rsa.obj Debug\renesas_tsip_sha.obj Debug\renesas_tsip_util.obj Debug\aes.obj diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl/.project 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl/.project 2024-08-03 07:30:00.000000000 +0000 @@ -80,6 +80,11 @@ PARENT-6-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c + wolfcrypt/port/renesas_tsip_rsa.c + 1 + PARENT-6-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c + + wolfcrypt/port/renesas_tsip_sha.c 1 PARENT-6-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -28,11 +28,10 @@ *----------------------------------------------------------------------------*/ #define WOLFSSL_RENESAS_RX72N - /*-- Renesas TSIP usage and its version --------------------------------------- * * "WOLFSSL_RENESAS_TSIP" definition makes wolfSSL to use H/W acceleration - * for cipher operations. + * for cipher operations. * TSIP definition asks to have its version number. * "WOLFSSL_RENESAS_TSIP_VER" takes following value: * 106: TSIPv1.06 @@ -45,6 +44,7 @@ #define WOLFSSL_RENESAS_TSIP #define WOLFSSL_RENESAS_TSIP_VER 117 + #if defined(SIMPLE_TLS_CLIENT) || defined(SIMPLE_TLS_SERVER) #undef WOLFSSL_RENESAS_TSIP #undef WOLFSSL_RENESAS_TSIP_VER @@ -54,16 +54,16 @@ * * wolfSSL supports TLSv1.2 by default. In case you want your system to support * TLSv1.3, uncomment line below. - * + * *----------------------------------------------------------------------------*/ #define WOLFSSL_TLS13 /*-- Operating System related definitions -------------------------------------- - * + * * In case any real-time OS is used, define its name(e.g. FREERTOS). * Otherwise, define "SINGLE_THREADED". They are exclusive each other. - * + * *----------------------------------------------------------------------------*/ #if !defined(RENESAS_T4_USE) #define FREERTOS @@ -114,23 +114,23 @@ /* USE_ECC_CERT * This macro is for selecting root CA certificate to load, it is valid only - * in example applications. wolfSSL does not refer this macro. - * If you want to use cipher suites including ECDSA authentication in + * in example applications. wolfSSL does not refer this macro. + * If you want to use cipher suites including ECDSA authentication in * the example applications with TSIP, enable this macro. - * In TSIP 1.13 or later version, following cipher suites are + * In TSIP 1.13 or later version, following cipher suites are * available: * - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 * - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SAH256 - * + * * Note that, this macro disables cipher suites including RSA * authentication such as: * - TLS_RSA_WITH_AES_128_CBC_SHA - * - TLS_RSA_WITH_AES_256_CBC_SHA + * - TLS_RSA_WITH_AES_256_CBC_SHA * - TLS_RSA_WITH_AES_128_CBC_SHA256 * - TLS_RSA_WITH_AES_256_CBC_SHA256 * - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 * - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA256 - * + * */ #define USE_ECC_CERT @@ -139,14 +139,14 @@ */ /*#define WOLFSSL_CHECK_SIG_FAULTS*/ - /* In this example application, Root CA cert buffer named - * "ca_ecc_cert_der_256" is used under the following macro definition + /* In this example application, Root CA cert buffer named + * "ca_ecc_cert_der_256" is used under the following macro definition * for ECDSA. */ #define USE_CERT_BUFFERS_256 - /* In this example application, Root CA cert buffer named - * "ca_cert_der_2048" is used under the following macro definition + /* In this example application, Root CA cert buffer named + * "ca_cert_der_2048" is used under the following macro definition * for RSA authentication. */ #define USE_CERT_BUFFERS_2048 @@ -157,26 +157,27 @@ *----------------------------------------------------------------------------*/ #define SIZEOF_LONG_LONG 8 + #define WOLFSSL_SMALL_STACK - /* + /* * -- "NO_ASN_TIME" macro is to avoid certificate expiration validation -- - * - * Note. In your actual products, do not forget to comment-out - * "NO_ASN_TIME" macro. And prepare time function to get calender time, - * otherwise, certificate expiration validation will not work. + * + * Note. In your actual products, do not forget to comment-out + * "NO_ASN_TIME" macro. And prepare time function to get calendar time, + * otherwise, certificate expiration validation will not work. */ /*#define NO_ASN_TIME*/ - + #define NO_MAIN_DRIVER #define BENCH_EMBEDDED - #define NO_WOLFSSL_DIR + #define NO_WOLFSSL_DIR #define WOLFSSL_NO_CURRDIR #define NO_FILESYSTEM #define WOLFSSL_LOG_PRINTF #define WOLFSSL_HAVE_MIN #define WOLFSSL_HAVE_MAX #define NO_WRITEV - + #define WOLFSSL_USER_CURRTIME /* for benchmark */ #define TIME_OVERRIDES @@ -209,7 +210,7 @@ /*-- Definitions for functionality negation ----------------------------------- * - * + * *----------------------------------------------------------------------------*/ /*#define NO_RENESAS_TSIP_CRYPT*/ @@ -220,7 +221,7 @@ #endif /*-- Consistency checking between definitions --------------------------------- * - * + * *----------------------------------------------------------------------------*/ /*-- TSIP TLS specific definitions --*/ @@ -236,14 +237,28 @@ *----------------------------------------------------------------------------*/ #if defined(WOLFSSL_RENESAS_TSIP) + /*-- TSIP TLS and/or CRYPTONLY Definition --------------------------------*/ + /* Enable TSIP TLS (default) + * TSIP CRYPTONLY is also enabled. + * Disable TSIP TLS + * TSIP CRYPTONLY is only enabled. + */ + #define WOLFSSL_RENESAS_TSIP_TLS #if !defined(NO_RENESAS_TSIP_CRYPT) - #define WOLFSSL_RENESAS_TSIP_CRYPT - #define WOLFSSL_RENESAS_TSIP_TLS - #define WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT + #define WOLFSSL_RENESAS_TSIP_CRYPTONLY #define HAVE_PK_CALLBACKS #define WOLF_CRYPTO_CB - #define WOLF_PRIVATE_KEY_ID + #if defined(WOLFSSL_RENESAS_TSIP_TLS) + #define WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT + #define WOLF_PRIVATE_KEY_ID + #endif + #endif + + #if !defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + # undef WOLFSSL_RENESAS_TSIP_TLS + # undef WOLFSSL_RENESAS_TSIP_CRYPT #endif #else @@ -261,3 +276,7 @@ /*-- strcasecmp */ #define XSTRCASECMP(s1,s2) strcmp((s1),(s2)) + +#define CUSTOM_RAND_GENERATE_BLOCK wc_tsip_GenerateRandBlock +/* use original ASN parsing */ +#define WOLFSSL_ASN_ORIGINAL diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.c 2024-08-03 07:30:00.000000000 +0000 @@ -382,15 +382,15 @@ #if defined(USE_ECC_CERT) /* Client authentication using ECDSA certificate can be handled by TSIP. * Therefore, the client private key should be TSIP-specific format - * and be set by tsip_use_PrivateKey_buffer. + * and be set by tsip_use_PrivateKey_buffer_TLS. */ if (ret == 0){ - ret = tsip_use_PrivateKey_buffer(ssl, + ret = tsip_use_PrivateKey_buffer_TLS(ssl, (const char*)g_key_block_data.encrypted_user_ecc256_private_key, sizeof(g_key_block_data.encrypted_user_ecc256_private_key), TSIP_ECCP256); if (ret != 0) { - printf("ERROR tsip_use_PrivateKey_buffer\n"); + printf("ERROR tsip_use_PrivateKey_buffer_TLS\n"); } } # if defined(WOLFSSL_CHECK_SIG_FAULTS) @@ -409,16 +409,16 @@ /* Client authentication using RSA certificate can be handled by TSIP. * Note that the internal verification of the signature process requires * not only the client's private key but also its public key, so pass them - * using tsip_use_PrivateKey_buffer and tsip_use_PublicKey_buffer + * using tsip_use_PrivateKey_buffer_TLS and tsip_use_PublicKey_buffer_TLS * respectively. */ if (ret == 0) { - ret = tsip_use_PrivateKey_buffer(ssl, + ret = tsip_use_PrivateKey_buffer_TLS(ssl, (const char*)g_key_block_data.encrypted_user_rsa2048_private_key, sizeof(g_key_block_data.encrypted_user_rsa2048_private_key), TSIP_RSA2048); if (ret != 0) { - printf("ERROR tsip_use_PrivateKey_buffer :%d\n", ret); + printf("ERROR tsip_use_PrivateKey_buffer_TLS :%d\n", ret); } } if (ret == 0) { @@ -536,7 +536,7 @@ "TLS13-AES128-GCM-SHA256", "TLS13-AES128-CCM-SHA256", #endif - "ECDHE-ECDSA-AES128-SHA256", + "ECDHE-ECDSA-AES128-SHA256", "ECDHE-ECDSA-AES128-GCM-SHA256", }; #if defined(WOLFSSL_TLS13) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_demo.h 2024-08-03 07:30:00.000000000 +0000 @@ -45,7 +45,7 @@ #define LIBRARY_LOG_LEVEL LOG_INFO #endif #include "logging_stack.h" - +#include "wolfssl/ssl.h" /* Enable wolfcrypt test demo */ /*#define CRYPT_TEST */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_tsip_unit_test.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_tsip_unit_test.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_tsip_unit_test.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RX72N/EnvisionKit/wolfssl_demo/wolfssl_tsip_unit_test.c 2024-08-03 07:30:00.000000000 +0000 @@ -19,6 +19,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#include + +#ifdef TSIP_CRYPT_UNIT_TEST + +#include "r_bsp_config.h" +#if BSP_CFG_USTACK_BYTES < 0x4000 +# error "more than 0x4000 stack needed to run the unit tests." +#endif #include #include @@ -28,6 +36,7 @@ #include #include #include +#include #ifdef NO_INLINE #include #else @@ -36,12 +45,14 @@ #endif #include +#ifdef FREERTOS #include "FreeRTOS.h" -#if defined(FREERTOS_TCP) +# if defined(FREERTOS_TCP) #include "FreeRTOS_IP.h" #include "FreeRTOS_Sockets.h" #include "platform/iot_network.h" #include "platform.h" +# endif #endif #ifndef NO_SHA @@ -59,7 +70,7 @@ printf(" passed \n");\ else \ printf(" failed \n"); - +#ifdef FREERTOS static xSemaphoreHandle exit_semaph; static byte exit_loop = 0; static byte sha_multTst_rslt = 0; @@ -68,26 +79,55 @@ static byte Aes256_Cbc_multTst_rslt = 0; static byte Aes128_Gcm_multTst_rslt = 0; static byte Aes256_Gcm_multTst_rslt = 0; +#endif /* FREERTOS */ #if defined(HAVE_AES_CBC) -#if defined(WOLFSSL_AES_128) -static tsip_aes_key_index_t g_user_aes128_key_index1; -static tsip_aes_key_index_t g_user_aes128_key_index2; -#endif +# if defined(WOLFSSL_AES_128) + static tsip_aes_key_index_t g_user_aes128_key_index1; + static tsip_aes_key_index_t g_user_aes128_key_index2; +# endif + +# if defined(WOLFSSL_AES_256) + static tsip_aes_key_index_t g_user_aes256_key_index1; + static tsip_aes_key_index_t g_user_aes256_key_index2; +# endif -#if defined(WOLFSSL_AES_256) -static tsip_aes_key_index_t g_user_aes256_key_index1; -static tsip_aes_key_index_t g_user_aes256_key_index2; #endif -#endif + typedef struct tagInfo { tsip_aes_key_index_t aes_key; } Info; +#ifdef WOLFSSL_RENESAS_TSIP_CRYPTONLY + static TsipUserCtx userContext; + + void Clr_CallbackCtx(TsipUserCtx *g) + { + + if (g->rsa1024pri_keyIdx != NULL) + XFREE(g->rsa1024pri_keyIdx, + NULL, DYNAMIC_TYPE_TMP_BUFFER); + + if (g->rsa1024pub_keyIdx != NULL) + XFREE(g->rsa1024pub_keyIdx, + NULL, DYNAMIC_TYPE_TMP_BUFFER); + + if (g->rsa2048pri_keyIdx != NULL) + XFREE(g->rsa2048pri_keyIdx, + NULL, DYNAMIC_TYPE_TMP_BUFFER); + + if (g->rsa2048pub_keyIdx != NULL) + XFREE(g->rsa2048pub_keyIdx, + NULL, DYNAMIC_TYPE_TMP_BUFFER); + XMEMSET(g, 0, sizeof(TsipUserCtx)); + } + +#endif + #if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) static int tsip_aes_cbc_test(int prnt, tsip_aes_key_index_t* aes_key) @@ -160,6 +200,7 @@ return ret; } +#ifdef FREERTOS static void tskAes128_Cbc_Test(void *pvParam) { int ret = 0; @@ -177,7 +218,7 @@ xSemaphoreGive(exit_semaph); vTaskDelete(NULL); } - +#endif /* FREERTOS */ #endif #ifdef WOLFSSL_AES_256 @@ -212,6 +253,7 @@ 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; + (void)verify; if (prnt) printf(" tsip_aes256_test() "); @@ -276,7 +318,7 @@ return ret; } - +#ifdef FREERTOS static void tskAes256_Cbc_Test(void *pvParam) { int ret = 0; @@ -294,7 +336,7 @@ xSemaphoreGive(exit_semaph); vTaskDelete(NULL); } - +#endif /* FREERTOS */ #endif /* WOLFSSL_AES_256 */ #if defined(WOLFSSL_AES_256) @@ -368,6 +410,8 @@ int ret; (void) result; + (void) c1; + (void) t1; if (prnt) { printf(" tsip_aes256_gcm_test() "); @@ -467,7 +511,7 @@ return ret; } - +#ifdef FREERTOS static void tskAes256_Gcm_Test(void *pvParam) { int ret = 0; @@ -485,6 +529,7 @@ xSemaphoreGive(exit_semaph); vTaskDelete(NULL); } +#endif /* FREERTOS */ #endif #if defined(WOLFSSL_AES_128) @@ -539,7 +584,8 @@ int ret; (void) result; - + (void) c3; + (void) t3; if (prnt) { printf(" tsip_aes128_gcm_test() "); } @@ -602,7 +648,7 @@ return ret; } - +#ifdef FREERTOS static void tskAes128_Gcm_Test(void *pvParam) { int ret = 0; @@ -620,69 +666,11 @@ xSemaphoreGive(exit_semaph); vTaskDelete(NULL); } - +#endif /* FREERTOS */ #endif -int tsip_crypt_test() -{ - int ret = 0; - e_tsip_err_t tsip_error_code; - - /* Generate AES tsip Key */ - tsip_error_code = R_TSIP_GenerateAes128RandomKeyIndex( - &g_user_aes128_key_index1); - - if (tsip_error_code == TSIP_SUCCESS) - tsip_error_code = R_TSIP_GenerateAes128RandomKeyIndex( - &g_user_aes128_key_index2); - - if (tsip_error_code == TSIP_SUCCESS) - tsip_error_code = R_TSIP_GenerateAes256RandomKeyIndex( - &g_user_aes256_key_index1); - - if (tsip_error_code == TSIP_SUCCESS) - tsip_error_code = R_TSIP_GenerateAes256RandomKeyIndex( - &g_user_aes256_key_index2); - - if (tsip_error_code == TSIP_SUCCESS) { - - #ifndef NO_SHA - printf(" sha_test()"); - ret = sha_test(); - RESULT_STR(ret) - #endif - - #ifndef NO_SHA256 - printf(" sha256_test()"); - ret = sha256_test(); - RESULT_STR(ret) - #endif - - ret = tsip_aes_cbc_test(1, &g_user_aes128_key_index1); - - if (ret == 0) { - - ret = tsip_aes256_test(1, &g_user_aes256_key_index1); - - } - - if (ret == 0) { - - ret = tsip_aesgcm128_test(1, &g_user_aes128_key_index1); - - } - - if (ret == 0) { - ret = tsip_aesgcm256_test(1, &g_user_aes256_key_index1); - - } - } - else - ret = -1; - - return ret; -} +#ifdef FREERTOS #ifndef NO_SHA @@ -722,7 +710,102 @@ vTaskDelete(NULL); } #endif +#endif /* FREERTOS */ + +#if !defined(NO_RSA) + +/* testing rsa sign/verify w/ rsa 2048 bit key */ +#define TEST_STRING "Everyone gets Friday off." +#define TEST_STRING2 "Everyone gets Friday ofv." +#define TEST_STRING_SZ 25 +#define RSA_TEST_BYTES 256 /* up to 2048-bit key */ + +static int tsip_rsa_SignVerify_test(int prnt, int keySize) +{ + int ret = 0; + + RsaKey *key = (RsaKey *)XMALLOC(sizeof *key, NULL, DYNAMIC_TYPE_TMP_BUFFER); + WC_RNG rng; + const char inStr [] = TEST_STRING; + const char inStr2[] = TEST_STRING2; + const word32 inLen = (word32)TEST_STRING_SZ; + const word32 outSz = RSA_TEST_BYTES; + + byte *in = NULL; + byte *in2 = NULL; + byte *out= NULL; + + in = (byte*)XMALLOC(inLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + in2 = (byte*)XMALLOC(inLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + out= (byte*)XMALLOC(outSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + (void) prnt; + + if (key == NULL || in == NULL || out == NULL) { + ret = -1; + goto out; + } + + XMEMSET(&rng, 0, sizeof(rng)); + XMEMSET(key, 0, sizeof *key); + XMEMCPY(in, inStr, inLen); + XMEMCPY(in2, inStr2, inLen); + + ret = wc_InitRsaKey_ex(key, NULL, 7890/* fixed devid for TSIP/SCE*/); + if (ret != 0) { + goto out; + } + + if ((ret = wc_InitRng(&rng)) != 0) + goto out; + + if ((ret = wc_RsaSetRNG(key, &rng)) != 0) + goto out; + + /* make rsa key by SCE */ + if ((ret = wc_MakeRsaKey(key, keySize, 65537, &rng)) != 0) { + goto out; + } + + ret = wc_RsaSSL_Sign(in, inLen, out, outSz, key, &rng); + if (ret < 0) { + goto out; + } + + /* this should fail */ + ret = wc_RsaSSL_Verify(in2, inLen, out, keySize/8, key); + if (ret != SIG_VERIFY_E) { + ret = -1; + goto out; + } + /* this should succeed */ + ret = wc_RsaSSL_Verify(in, inLen, out, keySize/8, key); + if (ret < 0) { + ret = -1; + goto out; + } + ret = 0; + out: + if (key != NULL) { + wc_FreeRsaKey(key); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (in != NULL) { + XFREE(in, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (in2 != NULL) { + XFREE(in2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (out != NULL) { + XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + + return ret; +} +#endif /* NO_RSA */ + +#ifdef TSIP_MULTIUNIT_TEST int tsip_crypt_sha_multitest() { int ret = 0; @@ -1018,4 +1101,109 @@ return ret; } +#endif + + +int tsip_crypt_test() +{ + int ret = 0; + e_tsip_err_t tsip_error_code; + + /* Generate AES tsip Key */ + tsip_error_code = R_TSIP_GenerateAes128RandomKeyIndex( + &g_user_aes128_key_index1); + + if (tsip_error_code == TSIP_SUCCESS) + tsip_error_code = R_TSIP_GenerateAes128RandomKeyIndex( + &g_user_aes128_key_index2); + + if (tsip_error_code == TSIP_SUCCESS) + tsip_error_code = R_TSIP_GenerateAes256RandomKeyIndex( + &g_user_aes256_key_index1); + + if (tsip_error_code == TSIP_SUCCESS) + tsip_error_code = R_TSIP_GenerateAes256RandomKeyIndex( + &g_user_aes256_key_index2); + + if (tsip_error_code == TSIP_SUCCESS) { + + #ifndef NO_SHA + printf(" sha_test()"); + ret = sha_test(); + RESULT_STR(ret) + #endif + + #ifndef NO_SHA256 + printf(" sha256_test()"); + ret = sha256_test(); + RESULT_STR(ret) + #endif + + ret = tsip_aes_cbc_test(1, &g_user_aes128_key_index1); + + if (ret == 0) { + + ret = tsip_aes256_test(1, &g_user_aes256_key_index1); + + } + + if (ret == 0) { + + ret = tsip_aesgcm128_test(1, &g_user_aes128_key_index1); + + } + + if (ret == 0) { + + ret = tsip_aesgcm256_test(1, &g_user_aes256_key_index1); + + } + #if defined(WOLFSSL_KEY_GEN)&& \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + + if (ret == 0) { + + Clr_CallbackCtx(&userContext); + + ret = wc_CryptoCb_CryptInitRenesasCmn(NULL, &userContext); + + if (ret > 0) + ret = 0; + } + + if (ret == 0) { + + printf(" tsip_rsa_SignVerify_test(1024)"); + + userContext.wrappedKeyType = TSIP_KEY_TYPE_RSA1024; + userContext.sing_hash_type = sha256_mac; + userContext.keyflgs_crypt.bits.message_type = 0; + + ret = tsip_rsa_SignVerify_test(1, 1024); + RESULT_STR(ret) + } + + Clr_CallbackCtx(&userContext); + + if (ret == 0) { + printf(" tsip_rsa_SignVerify_test(2048)"); + + userContext.wrappedKeyType = TSIP_KEY_TYPE_RSA2048; + userContext.sing_hash_type = sha256_mac; + userContext.keyflgs_crypt.bits.message_type = 0; + + ret = tsip_rsa_SignVerify_test(1, 2048); + RESULT_STR(ret) + } + + Clr_CallbackCtx(&userContext); + #endif + } + else + ret = -1; + + + return ret; +} +#endif /* TSIP_CRYPT_UNIT_TEST */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,543 @@ +wolfSSL for Renesas RZN2L Board +================================================= + +## Description + +This directory contains e2studio projects targeted at the Renesas RZ MCUs. +The example projects include a wolfSSL TLS client and server. +They also include benchmark and cryptography tests for the wolfCrypt library. + +The example project contains both the wolfSSL and wolfCrypt libraries. +It is built as a `Renesas RZ/N C/C++ FSP Project` and contains the Renesas RZ +configuration. The wolfssl project uses `Renesas Secure IP on RZ` +as hardware acceleration for cryptography. + +**Limitation** + +Due to lacking of TLS related feature on RSIP driver version, TLS connection examples below use `SHA` and `Random generation` of RSIP driver. + +The example project summary is listed below and is relevant for every project. + +### Project Summary +|Item|Name/Version| +|:--|:--| +|Board|RZN2L| +|Device|R9A07G084M08GBG| +|Toolchain|GCC for Renesas RZ| +|Toolchain Version|10.3.1.20210824| +|FSP Version|1.2.0| + +#### Selected software components + +|Components|Version|Note| +|:--|:--|:--| +|Board Support Package Common Files|v1.20|| +|I/O Port|v1.2.0|| +|Arm CMSIS Version 5 - Core (M)|v5.7.0+renesas.1|| +|Board support package for R9A07G084M04GBG|v1.2.0|Note1| +|Board support package for RZN2L|v1.2.0|| +|Board support package for RZN2L - FSP Data|v1.2.0|| +|RSK+RZN2L Board Support Files (RAM execution without flash memory)|v1.2.0|| +|FreeRTOS - Buffer Allocation 2|v1.2.0|| +|FreeRTOS - Memory Management - Heap 4|v1.2.0|| +|FreeRTOS+TCP|v1.2.0|| +|Ethernet PHY |v1.2.0|| +|Ethernet Selector|v1.2.0|| +|Ethernet|v1.2.0|| +|Ethernet Switch|v1.2.0|| +|SCI UART|v1.2.0|| +|r_ether to FreeRTOS+TCP Wrapper|v1.2.0|| +|Renesas Secure IP Driver|v1.3.0+fsp.1.2.0|Need to contact Renesas to get RSIP module| +|RSIP Engine for RZ/N2L|v1.3.0+fsp.1.2.0|Need to contact Renesas to get RSIP module| + +Note1:\ + To use RSIP driver, a device type should be `R9A07G084M04GBG`. However, choosing `R9A07G084M04GBG` won't allow to select `RSK+RZN2L` board. This example uses LED and external flash memory on `RSK + RZN2L` board. Therefore, the example temporary `R9A07G084M04GBG` for the device type. Updating e2studio or fsp could resolve the issue. + +## Setup Steps and Build wolfSSL Library + +1.) Import projects from [File]->[Open projects from File System] + ++ Select folder at /path/to/wolfssl/IDE/Renesas/e2studio/RZN2L/test + +2.) Create a `dummy_application` Renesas RZ/N C/C++ FSP Project. + ++ Click File->New->`RZ/N C/C++ FSP Project`. ++ Enter project name `dummy_application`. ++ Select Board: to `RSK+RZN2L (RAM execution without flash memory)`. ++ Select Device: to `R9A07G084M04GBG`. Click Next. ++ Check to `Executable` ++ Select FreeRTOS from RTOS selection. Click Finish. ++ Check `FreeRTOS minimal - Static Allocation`. Click Finish. ++ Open FSP Configurator by clicking configuration.xml in the project --> ++ Go to `Stacks` tab ++ Add new thread by clicking `New Thread`, and set properties below + +|Property|Value| +|:--|:--| +|Thread Symbol|rzn2l_tst_thread| +|Thread Name|rzn2l_tst_thread| +|Thread Stack size|increase depending on your environment
e.g. 0xA000| +|Thread MemoryAllocation|Dynamic| +|Common General Use Mutexes|Enabled| +|Common General Enable Backward Compatibility|Enabled| +|Common Memory Allocation Support Dynamic Allocation|Enabled| +|Common Memory Allocation Total Heap Size|increase depending on your environment
e.g. 0x20000| + ++ Add `Heap 4` stack to rzn2l_tst_thread from `New Stack` -> `FreeRTOS` -> `FreeRTOS Heap 4` ++ Add `UART Driver` stack to rzn2l_tst_thread from `New Stack` -> `Connectivity` -> `UART Driver` ++ Add `FreeRTOS + TCP` stack to rzn2l_tst_thread from `New Stack` -> -> `FreeRTOS` -> `Libraries` -> `FreeRTOS+TCP` and set properties + ++ Save `dummy_application` FSP configuration ++ Copy configuration.xml under `dummy_application` to `test_RZN2L` ++ Open FSP configuration by clicking copied configuration.xml at `test_RZN2L` ++ Click `Generate Project Content` on FSP configuration GUI + +3.) Prepare UART to logging + ++ Download Sample package from [BACnet Start-Up](https://www.renesas.com/us/en/products/microcontrollers-microprocessors/rz-mpus/bacnet-start-rzn2l-rsk) ++ Copy the following C source files from the project to src/serial_io folder of `test_RZN2L`\ +um_serial_io_uart.c\ +um_serial_io_task_writer.c\ +um_serial_io_cfg.h\ +um_common_api.h\ +um_common_cfg.h\ +um_serial_io.c\ +um_serial_io.h\ +um_serial_io_api.h\ +um_serial_io_internal.h + + ++ Open um_serial_io_task_writer.c and re-name printf to uart_printf + +3.) Build `test_RZN2L` project + +## Run `test_RZN2L` + +1). Right click the project and Select menu `Debug` -> `Renesas GDB Hardware debugging` + +2). Select J-Link ARM and R9A07G084M04 + +3). Break at Entry point. Change `cpsr` register value from 0xXXXXX1yy to 0xXXXXX1da + +## Run TLS 1.3 Client +1.) Enable `WOLFSSL_TLS13` macro in `user_settings.h` + +2.) Enable `TLS_CLIENT` macro in `wolfssl_demo.h` of test_RZN2L project + +3.) Client IP address and Server IP address + ++ Client IP address can be changed by the following line in `rzn2l_tst_thread_entry.c`. +``` +static const byte ucIPAddress[4] = { 192, 168, 11, 241 }; +``` ++ Server IP address can be changed by the following line in wolf_client.c. +``` +#define SERVER_IP "192.168.11.65" +``` + +3.) Build test_RZN2L project + +4.) Prepare peer wolfssl server + ++ On Linux ++ Clone wolfssl from [github repository](https://github.com/wolfssl/wolfssl.git) +``` +$ ./autogen.sh +$ ./configure +$ make +``` + ++ Run peer wolfSSL server + ++ RSA sign and verify use, launch server with the following option +``` +$./examples/server/server -b -d -i -v 4 +``` + ++ For ECDSA sign and verify use, +Enable the `USE_CERT_BUFFER_256` macro in `wolfssl_demo.h` +Disable the `USE_CERT_BUFFER_2048` macro in `wolfssl_demo.h` + ++ launch server with the following option. +``` +$./examples/server/server -b -d -i -v 4 -c ./certs/server-ecc.pem -k ./certs/ecc-key.pem +``` + +5.) Run the example Client + +You will see the following message on a UART terminal when using RSA sign and verify or ECDSA sign and verify. +``` + Started Serial I/O interface. + Start TLS Connection to 192.168.11.65 port(11111) + Error [-116]: FreeRTOS_connect. <-- A number of messages will be showed by depending on number of connection failures. + Start to connect to the server. + Cipher : TLS13-AES128-GCM-SHA256 + Received: I hear you fa shizzle! + + Start to connect to the server. + Cipher : TLS13-AES256-GCM-SHA384 + Received: I hear you fa shizzle! + + End of Client Example +``` + +## Run TLS 1.2 Client +1.) Disable `WOLFSSL_TLS13` macro in `user_settings.h` + +2.) Enable `TLS_CLIENT` macro in `wolfssl_demo.h` of test_RZN2L project + +3.) Client IP address and Server IP address + ++ Client IP address can be changed by the following line in `rzn2l_tst_thread_entry.c`. +``` +static const byte ucIPAddress[4] = { 192, 168, 11, 241 }; +``` ++ Server IP address can be changed by the following line in wolf_client.c. +``` +#define SERVER_IP "192.168.11.65" +``` + +3.) Build test_RZN2L project + +4.) Prepare peer wolfssl server + ++ On Linux ++ Clone wolfssl from [github repository](https://github.com/wolfssl/wolfssl.git) +``` +$ ./autogen.sh +$ ./configure +$ make +``` + ++ Run peer wolfSSL server + ++ RSA sign and verify use, launch server with the following option +``` +$./examples/server/server -b -d -i -v 3 +``` + ++ For ECDSA sign and verify use, +Enable the `USE_CERT_BUFFER_256` macro in `wolfssl_demo.h` +Disable the `USE_CERT_BUFFER_2048` macro in `wolfssl_demo.h` + ++ launch server with the following option. +``` +$./examples/server/server -b -d -i -v 3 -c ./certs/server-ecc.pem -k ./certs/ecc-key.pem +``` + +5.) Run the example Client + +You will see the following message on a UART terminal when using RSA sign and verify. +``` +Started Serial I/O interface. + Start TLS Connection to 192.168.11.65 port(11111) + Error [-116]: FreeRTOS_connect. + Start to connect to the server. + Cipher : ECDHE-RSA-AES128-GCM-SHA256 + Received: I hear you fa shizzle! + + Start to connect to the server. + Cipher : ECDHE-RSA-AES256-SHA + Received: I hear you fa shizzle! + + Start to connect to the server. + Cipher : ECDHE-RSA-AES128-SHA256 + Received: I hear you fa shizzle! + + + End of Client Example +``` + +You will see the following message on a UART terminal when using ECDSA sign and verify. +``` +Started Serial I/O interface. + Start TLS Connection to 192.168.11.65 port(11111) + Error [-116]: FreeRTOS_connect. + Start to connect to the server. + Cipher : ECDHE-ECDSA-AES128-GCM-SHA256 + Received: I hear you fa shizzle! + + Start to connect to the server. + Cipher : ECDHE-ECDSA-AES256-SHA + Received: I hear you fa shizzle! + + Start to connect to the server. + Cipher : ECDHE-ECDSA-AES128-SHA256 + Received: I hear you fa shizzle! + + + End of Client Example +``` + +## Run TLS 1.3 Server +1.) Enable `WOLFSSL_TLS13` macro in `user_settings.h` + +2.) Enable `TLS_SERVER` macro in `wolfssl_demo.h` of test_RZN2L project + +3.) Client IP address and Server IP address + ++ Server IP address can be changed by the following line in `rzn2l_tst_thread_entry.c`. +``` +static const byte ucIPAddress[4] = { 192, 168, 11, 241 }; +``` + +3.) Build test_RZN2L project + ++ For ECDSA sign and verify use, +Enable the `USE_CERT_BUFFER_256` macro in `wolfssl_demo.h` +Disable the `USE_CERT_BUFFER_2048` macro in `wolfssl_demo.h` + ++ launch server from e2studio + +4.) Prepare peer wolfssl client + ++ On Linux ++ Clone wolfssl from [github repository](https://github.com/wolfssl/wolfssl.git) +``` +$ ./autogen.sh +$ ./configure +$ make +``` + +5.) Run peer wolfSSL client + ++ RSA sign and verify use, run peer client with the following option +``` +$./examples/client/client -h 192.168.11.241 -p 11111 -v 4 +``` + +You will see the following message on a UART terminal when using RSA sign and verify. +``` +Started Serial I/O interface. + Start TLS Accept at 192.168.011.241 port(11111) +Received: hello wolfssl! +Cleaning up socket and wolfSSL objects. +Waiting connection.... +``` + +You will see the following message on Linux terminal. +``` +$ ./examples/client/client -h 192.168.11.241 -p 11111 -v 4 +SSL version is TLSv1.3 +SSL cipher suite is TLS_AES_128_GCM_SHA256 +SSL curve name is SECP256R1 +I hear ya fa s +``` + ++ ECDSA sign and verify use, run peer client with the following option +``` +$./examples/client/client -h 192.168.11.241 -p 11111 -v 3 -A ./certs/ca-ecc-cert.pem -c ./certs/client-ecc-cert.pem -k ./certs/ecc-client-key.pem +``` + +You will see the following message on a UART terminal when using ECDSA sign and verify. +``` +Started Serial I/O interface. + Start TLS Accept at 192.168.011.241 port(11111) +Received: hello wolfssl! +Cleaning up socket and wolfSSL objects. +Waiting connection.... +``` +You will see the following message on Linux terminal. +``` +$ ./examples/client/client -h 192.168.11.241 -p 11111 -v 4 -A ./certs/ca-ecc-cert.pem -c ./certs/client-ecc-cert.pem -k ./cert +s/ecc-client-key.pem +SSL version is TLSv1.3 +SSL cipher suite is TLS_AES_128_GCM_SHA256 +SSL curve name is SECP256R1 +I hear ya fa s +``` + +## Run TLS 1.2 Server +1.) Disable `WOLFSSL_TLS13` macro in `user_settings.h` + +2.) Enable `TLS_SERVER` macro in `wolfssl_demo.h` of test_RZN2L project + +3.) Client IP address and Server IP address + ++ Server IP address can be changed by the following line in `rzn2l_tst_thread_entry.c`. +``` +static const byte ucIPAddress[4] = { 192, 168, 11, 241 }; +``` + +3.) Build test_RZN2L project + ++ For ECDSA sign and verify use, +Enable the `USE_CERT_BUFFER_256` macro in `wolfssl_demo.h` +Disable the `USE_CERT_BUFFER_2048` macro in `wolfssl_demo.h` + ++ launch server from e2studio + +4.) Prepare peer wolfssl client + ++ On Linux ++ Clone wolfssl from [github repository](https://github.com/wolfssl/wolfssl.git) +``` +$ ./autogen.sh +$ ./configure +$ make +``` + +5.) Run peer wolfSSL client + ++ RSA sign and verify use, run peer client with the following option +``` +$./examples/client/client -h 192.168.11.241 -p 11111 -v 4 +``` + +You will see the following message on a UART terminal when using RSA sign and verify. +``` +Started Serial I/O interface. + Start TLS Accept at 192.168.011.241 port(11111) +Received: hello wolfssl! +Cleaning up socket and wolfSSL objects. +Waiting connection.... +``` + +You will see the following message on Linux terminal. +``` +$ ./examples/client/client -h 192.168.11.241 -p 11111 -v 3 +SSL version is TLSv1.2 +SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 +SSL curve name is SECP256R1 +I hear ya fa s +``` + ++ ECDSA sign and verify use, run peer client with the following option +``` +$./examples/client/client -h 192.168.11.241 -p 11111 -v 3 -A ./certs/ca-ecc-cert.pem -c ./certs/client-ecc-cert.pem -k ./certs/ecc-client-key.pem +``` + +You will see the following message on a UART terminal when using ECDSA sign and verify. +``` +Started Serial I/O interface. + Start TLS Accept at 192.168.011.241 port(11111) +Received: hello wolfssl! +Cleaning up socket and wolfSSL objects. +Waiting connection.... +``` +You will see the following message on Linux terminal. +``` +$ ./examples/client/client -h 192.168.11.241 -p 11111 -v 3 -A ./certs/ca-ecc-cert.pem -c ./certs/client-ecc-cert.pem -k ./certs/ecc-client-key.pem +SSL version is TLSv1.2 +SSL cipher suite is TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 +SSL curve name is SECP256R1 +I hear ya fa s +``` +## Run Crypt test +1.) Enable `CRYPT_TEST` macro in `wolfssl_demo.h` + +2.) Run `test_RZN2L` from e2studio + +Sample Output + +``` +------------------------------------------------------------------------------ + wolfSSL version 5.6.3 +------------------------------------------------------------------------------ +error test passed! +MEMORY test passed! +base64 test passed! +asn test passed! +RANDOM test passed! +MD5 test passed! +MD4 test passed! +SHA test passed! +SHA-224 test passed! +SHA-256 test passed! +SHA-384 test passed! +SHA-512 test passed! +SHA-512/224 test passed! +SHA-512/256 test passed! +Hash test passed! +HMAC-MD5 test passed! +HMAC-SHA test passed! +HMAC-SHA224 test passed! +HMAC-SHA256 test passed! +HMAC-SHA384 test passed! +HMAC-SHA512 test passed! +HMAC-KDF test passed! +TLSv1.3 KDF test passed! +DES test passed! +DES3 test passed! +AES test passed! +AES256 test passed! +AES-GCM test passed! +RSA test passed! +PWDBASED test passed! +ECC test passed! +ECC buffer test passed! +CURVE25519 test passed! +logging test passed! +time test passed! +mutex test passed! +crypto callback test passed! +Test complete + End wolfCrypt Test +``` + +**Note** +`SHA1/224/256/384/512` and `Random generation` of RSIP driver are enabled at the sample output above while running wolfCrypt test. + +## Run Benchmark + +1.) Enable `BENCHMARK` macro in `wolfssl_demo.h` + +2.) Run `test_RZN2L` from e2studio + +Sample Output +``` +Started Serial I/O interface. Start wolfCrypt Benchmark +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 2.0 MiB took 1.000 seconds, 2.393 MiB/s +AES-128-CBC-enc 2.0 MiB took 1.009 seconds, 2.032 MiB/s +AES-128-CBC-dec 2.0 MiB took 1.002 seconds, 2.022 MiB/s +AES-192-CBC-enc 1.1 MiB took 1.001 seconds, 1.732 MiB/s +AES-192-CBC-dec 1.1 MiB took 1.008 seconds, 1.720 MiB/s +AES-256-CBC-enc 1.1 MiB took 1.014 seconds, 1.517 MiB/s +AES-256-CBC-dec 1.1 MiB took 1.008 seconds, 1.502 MiB/s +AES-128-GCM-enc 675.0 KiB took 1.023 seconds, 659.824 KiB/s +AES-128-GCM-dec 675.0 KiB took 1.022 seconds, 660.470 KiB/s +AES-192-GCM-enc 625.0 KiB took 1.000 seconds, 625.000 KiB/s +AES-192-GCM-dec 650.0 KiB took 1.039 seconds, 625.602 KiB/s +AES-256-GCM-enc 600.0 KiB took 1.008 seconds, 595.238 KiB/s +AES-256-GCM-dec 600.0 KiB took 1.007 seconds, 595.829 KiB/s +AES-128-GCM-enc-no_AAD 675.0 KiB took 1.012 seconds, 666.996 KiB/s +AES-128-GCM-dec-no_AAD 675.0 KiB took 1.011 seconds, 667.656 KiB/s +AES-192-GCM-enc-no_AAD 650.0 KiB took 1.029 seconds, 631.681 KiB/s +AES-192-GCM-dec-no_AAD 650.0 KiB took 1.028 seconds, 632.296 KiB/s +AES-256-GCM-enc-no_AAD 625.0 KiB took 1.040 seconds, 600.962 KiB/s +AES-256-GCM-dec-no_AAD 625.0 KiB took 1.039 seconds, 601.540 KiB/s +GMAC Default 977.0 KiB took 1.000 seconds, 977.000 KiB/s +3DES 450.0 KiB took 1.022 seconds, 440.313 KiB/s +MD5 12.1 MiB took 1.001 seconds, 12.756 MiB/s +SHA 21.0 MiB took 1.000 seconds, 21.240 MiB/s +SHA-224 21.0 MiB took 1.000 seconds, 21.069 MiB/s +SHA-256 20.1 MiB took 1.000 seconds, 20.923 MiB/s +SHA-384 19.1 MiB took 1.000 seconds, 19.604 MiB/s +SHA-512 19.1 MiB took 1.001 seconds, 19.561 MiB/s +SHA-512/224 19.1 MiB took 1.000 seconds, 19.873 MiB/s +SHA-512/256 19.1 MiB took 1.000 seconds, 19.751 MiB/s +HMAC-MD5 12.0 MiB took 1.000 seconds, 12.451 MiB/s +HMAC-SHA 19.1 MiB took 1.001 seconds, 19.512 MiB/s +HMAC-SHA224 19.0 MiB took 1.000 seconds, 19.385 MiB/s +HMAC-SHA256 19.0 MiB took 1.001 seconds, 19.219 MiB/s +HMAC-SHA384 18.0 MiB took 1.000 seconds, 18.018 MiB/s +HMAC-SHA512 17.1 MiB took 1.000 seconds, 17.944 MiB/s +PBKDF2 224.0 bytes took 1.044 seconds, 214.559 bytes/s +RSA 2048 public 40 ops took 1.020 sec, avg 25.500 ms, 39.216 ops/sec +RSA 2048 private 2 ops took 3.196 sec, avg 1598.000 ms, 0.626 ops/sec +ECC [ SECP256R1] 256 key gen 2 ops took 2.196 sec, avg 1097.1000 ms, 0.911 ops/sec +ECDHE [ SECP256R1] 256 agree 2 ops took 2.186 sec, avg 1093.000 ms, 0.915 ops/sec +ECDSA [ SECP256R1] 256 sign 2 ops took 2.215 sec, avg 1107.500 ms, 0.903 ops/sec +ECDSA [ SECP256R1] 256 verify 2 ops took 4.210 sec, avg 2105.000 ms, 0.475 ops/sec +CURVE 25519 key gen 3 ops took 1.255 sec, avg 418.333 ms, 2.390 ops/sec +CURVE 25519 agree 4 ops took 1.672 sec, avg 418.000 ms, 2.392 ops/sec +Benchmark complete + End wolfCrypt Benchmark +``` +**Note** +`SHA1/224/256/384/512` and `Random generation` of RSIP driver are enabled at the sample output above. + +## Support + +For support inquiries and questions, please email support@wolfssl.com. Feel free to reach out to info@wolfssl.jp as well. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,115 @@ +/* user_settings.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +/* Operating Environment and Threading */ +#if defined(WOLFSSL_RENESAS_RSIP) + /* FSP SM stands for Flexible Software Package Security Module + * WOLFSSL_RENESAS_FSPSM enables fundamental code when it uses. + * e.g. Open/Close/Random generator + * WOLFSSL_RENESAS_FSPSPM_TLS enables TLS related code for FSP SM + * e.g. Certificate verification, Master Secret Generation + * WOLFSSL_RENESAS_SCEPROTECT enables specific code for SCE if needed + */ + #define WOLFSSL_RENESAS_FSPSM + /* Not yet supported TLS related capabilities */ + /* # define WOLFSSL_RENESAS_FSPSM_TLS */ + +#endif + + /* XXX_CRYPTONLY definition enables FSP SM module for Crypto only use. + * Therefore, it disables TLS related API use + */ +/* #define WOLFSSL_RENESAS_RSIP_CRYPTONLY */ + +#if defined(WOLFSSL_RENESAS_RSIP_CRYPTONLY) + #undef WOLFSSL_RENESAS_FSPSM_TLS + #define WOLFSSL_RENESAS_FSPSM_CRYPTONLY + + #if !defined(WOLFSSL_RENESAS_RSPI) + #define WOLFSSL_RENESAS_RSPI + #endif +#endif + +#define FREERTOS +#define FREERTOS_TCP + +#define NO_MAIN_DRIVER +#define BENCH_EMBEDDED +#define NO_WRITEV +#define WOLFSSL_NO_FLOAT_FMT + +#define NO_DEV_RANDOM +#define SIZEOF_LONG_LONG 8 +#define NO_WOLFSSL_DIR +#define WOLFSSL_NO_CURRDIR +#define NO_WOLF_C99 +#define NO_MULTIBYTE_PRINT +#define NO_FILESYSTEM + +#define XVALIDATEDATE(d, f,t) (0) + +#define TFM_TIMING_RESISTANT +#define ECC_TIMING_RESISTANT +#define WC_RSA_BLINDING + +#define HAVE_AESGCM +#define WOLFSSL_SHA224 +#define WOLFSSL_SHA384 +#define WOLFSSL_SHA512 +#define HAVE_ECC +#define HAVE_CURVE25519 +#define CURVE25519_SMALL + +#define WOLFSSL_SMALL_STACK +#define USE_FAST_MATH + +/* static RSA */ +#define WOLFSSL_STATIC_RSA + +/* Enable to use TLS1.3 */ +#define WOLFSSL_TLS13 + +#if defined(WOLFSSL_TLS13) + #include + #define HAVE_FFDHE_2048 + #define HAVE_HKDF + #define WC_RSA_PSS + #define HAVE_TLS_EXTENSIONS + #define HAVE_SUPPORTED_CURVES +#endif + +#define WOLF_CRYPTO_CB +#if defined(WOLFSSL_RENESAS_RSIP_CRYPTONLY) + #define HAVE_RENESAS_SYNC + #define WC_USE_DEVID 7890 + #define NO_AES_192 + #define NO_SW_BENCH +#endif + +#if defined(WOLFSSL_RENESAS_RSIP_CRYPTONLY) + #define WOLFSSL_KEY_GEN +#endif + +int uart_printf (const char *__restrict format, ...); +#undef printf +#define printf uart_printf + +#define TEST_SLEEP() vTaskDelay(50) +#define CUSTOM_RAND_GENERATE_BLOCK wc_fspsm_GenerateRandBlock diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/wolfssl_demo.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/wolfssl_demo.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/wolfssl_demo.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/common/wolfssl_demo.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,108 @@ +/* wolfssl_demo.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef WOLFSSL_DEMO_H_ +#define WOLFSSL_DEMO_H_ + +#include +#include "FreeRTOS_IP.h" +#include "FreeRTOS_Sockets.h" + +#define FREQ 10000 /* Hz */ + +/* Client connects to the server with these details. */ +#define SERVER_IP "192.168.11.65" +#define DEFAULT_PORT 11111 + +typedef struct tagTestInfo +{ + int id; + int port; + char name[32]; + const char* cipher; + WOLFSSL_CTX* ctx; +} TestInfo; + +/* Enable Crypt Unit Test */ +/* #define UNIT_TEST */ + +/* Enable wolfcrypt test */ +/* can be enabled with benchmark test */ +#define CRYPT_TEST + +/* Enable benchmark */ +/* can be enabled with cyrpt test */ +/* #define BENCHMARK */ + +/* Enable TLS client */ +/* #define TLS_CLIENT */ + +/* Enable TLS Server */ +/* #define TLS_SERVER */ + +#if defined(TLS_CLIENT) + extern WOLFSSL_CTX *client_ctx; + + /* Use RSA certificates */ + #define USE_CERT_BUFFERS_2048 + /* Use ECC certificates */ + /*#define USE_CERT_BUFFERS_256*/ +#endif + +#if defined(TLS_SERVER) + extern WOLFSSL_CTX *server_ctx; + + /* Use RSA certificates */ + #define USE_CERT_BUFFERS_2048 + /* Use ECC certificates */ + /*#define USE_CERT_BUFFERS_256*/ +#endif + +#if defined(USE_CERT_BUFFERS_2048) && defined(USE_CERT_BUFFERS_256) + #error please set either macro USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_256 +#endif + +#define FR_SOCKET_SUCCESS 0 + +static void util_Cleanup(WOLFSSL_CTX *ctx, WOLFSSL *ssl) { + printf("Cleaning up socket and wolfSSL objects.\n"); + if (ssl != NULL) + wolfSSL_free(ssl); + if (ctx != NULL) + wolfSSL_CTX_free(ctx); + wolfSSL_Cleanup(); +} + +static inline void util_inf_loop(WOLFSSL_CTX *ctx, WOLFSSL *ssl) { + util_Cleanup(ctx, ssl); + printf("Reached infinite loop.\n"); + while (1) + ; +} + +void TCPInit(); +void wolfSSL_TLS_client_init(); +int wolfSSL_TLS_client_do(void *pvParam); +void wolfSSL_TLS_server_init(); +int wolfSSL_TLS_server_do(void *pvParam); +void wolfSSL_TLS_cleanup(); + +#endif /* WOLFSSL_DEMO_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,17 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/README.md +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/.cproject +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/.project +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/rzn2l_tst_thread_entry.c +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/wolfssl_dummy.c +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_client.c +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_server.c +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/test/wolfssl_rsip_unit_test.c +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/serial_io/.gitignore +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/wolfCrypt/.gitignore +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/test/src/wolfSSL/.gitignore +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/common/wolfssl_demo.h +EXTRA_DIST+= IDE/Renesas/e2studio/RZN2L/common/user_settings.h \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.cproject mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.cproject --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.cproject 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.cproject 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.project 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/.project 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,440 @@ + + + test_RZN2L + + + + + + com.renesas.cdt.ddsc.contentgen.ddscBuilder + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + com.renesas.cdt.ddsc.contentgen.ddscInterlockBundleBuilder + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + com.renesas.cdt.ddsc.contentgen.ddscNature + com.renesas.cdt.rz.ddsc.contentgen.rznNature + + + + common/user_settings.h + 1 + PARENT-1-PROJECT_LOC/common/user_settings.h + + + common/wolfssl_demo.h + 1 + PARENT-1-PROJECT_LOC/common/wolfssl_demo.h + + + src/test/benchmark.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/benchmark/benchmark.c + + + src/test/test.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/test/test.c + + + src/wolfCrypt/aes.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/aes.c + + + src/wolfCrypt/arc4.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/arc4.c + + + src/wolfCrypt/asm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/asm.c + + + src/wolfCrypt/asn.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/asn.c + + + src/wolfCrypt/blake2b.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/blake2b.c + + + src/wolfCrypt/camellia.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/camellia.c + + + src/wolfCrypt/chacha.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/chacha.c + + + src/wolfCrypt/chacha20_poly1305.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/chacha20_poly1305.c + + + src/wolfCrypt/cmac.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/cmac.c + + + src/wolfCrypt/coding.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/coding.c + + + src/wolfCrypt/compress.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/compress.c + + + src/wolfCrypt/cpuid.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/cpuid.c + + + src/wolfCrypt/cryptocb.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/cryptocb.c + + + src/wolfCrypt/curve25519.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/curve25519.c + + + src/wolfCrypt/des3.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/des3.c + + + src/wolfCrypt/dh.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/dh.c + + + src/wolfCrypt/dsa.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/dsa.c + + + src/wolfCrypt/ecc.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ecc.c + + + src/wolfCrypt/ecc_fp.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ecc_fp.c + + + src/wolfCrypt/ed25519.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ed25519.c + + + src/wolfCrypt/error.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/error.c + + + src/wolfCrypt/fe_low_mem.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/fe_low_mem.c + + + src/wolfCrypt/fe_operations.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/fe_operations.c + + + src/wolfCrypt/ge_low_mem.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ge_low_mem.c + + + src/wolfCrypt/ge_operations.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/ge_operations.c + + + src/wolfCrypt/hash.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/hash.c + + + src/wolfCrypt/hmac.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/hmac.c + + + src/wolfCrypt/integer.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/integer.c + + + src/wolfCrypt/kdf.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/kdf.c + + + src/wolfCrypt/logging.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/logging.c + + + src/wolfCrypt/md2.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/md2.c + + + src/wolfCrypt/md4.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/md4.c + + + src/wolfCrypt/md5.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/md5.c + + + src/wolfCrypt/memory.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/memory.c + + + src/wolfCrypt/pkcs12.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/pkcs12.c + + + src/wolfCrypt/pkcs7.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/pkcs7.c + + + src/wolfCrypt/poly1305.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/poly1305.c + + + src/wolfCrypt/pwdbased.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/pwdbased.c + + + src/wolfCrypt/random.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/random.c + + + src/wolfCrypt/rsa.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/rsa.c + + + src/wolfCrypt/sha.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha.c + + + src/wolfCrypt/sha256.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha256.c + + + src/wolfCrypt/sha3.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha3.c + + + src/wolfCrypt/sha512.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sha512.c + + + src/wolfCrypt/signature.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/signature.c + + + src/wolfCrypt/sp_arm32.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_arm32.c + + + src/wolfCrypt/sp_arm64.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_arm64.c + + + src/wolfCrypt/sp_armthumb.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_armthumb.c + + + src/wolfCrypt/sp_c32.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_c32.c + + + src/wolfCrypt/sp_c64.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_c64.c + + + src/wolfCrypt/sp_cortexm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_cortexm.c + + + src/wolfCrypt/sp_dsp32.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_dsp32.c + + + src/wolfCrypt/sp_int.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_int.c + + + src/wolfCrypt/sp_x86_64.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/sp_x86_64.c + + + src/wolfCrypt/srp.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/srp.c + + + src/wolfCrypt/tfm.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/tfm.c + + + src/wolfCrypt/wc_dsp.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_dsp.c + + + src/wolfCrypt/wc_encrypt.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_encrypt.c + + + src/wolfCrypt/wc_pkcs11.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_pkcs11.c + + + src/wolfCrypt/wc_port.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wc_port.c + + + src/wolfCrypt/wolfevent.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wolfevent.c + + + src/wolfCrypt/wolfmath.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/wolfmath.c + + + src/wolfSSL/crl.c + 1 + PARENT-5-PROJECT_LOC/src/crl.c + + + src/wolfSSL/internal.c + 1 + PARENT-5-PROJECT_LOC/src/internal.c + + + src/wolfSSL/keys.c + 1 + PARENT-5-PROJECT_LOC/src/keys.c + + + src/wolfSSL/ocsp.c + 1 + PARENT-5-PROJECT_LOC/src/ocsp.c + + + src/wolfSSL/sniffer.c + 1 + PARENT-5-PROJECT_LOC/src/sniffer.c + + + src/wolfSSL/ssl.c + 1 + PARENT-5-PROJECT_LOC/src/ssl.c + + + src/wolfSSL/tls.c + 1 + PARENT-5-PROJECT_LOC/src/tls.c + + + src/wolfSSL/tls13.c + 1 + PARENT-5-PROJECT_LOC/src/tls13.c + + + src/wolfSSL/wolfio.c + 1 + PARENT-5-PROJECT_LOC/src/wolfio.c + + + src/wolfCrypt/port/renesas_common.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_common.c + + + src/wolfCrypt/port/renesas_fspsm_aes.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_fspsm_aes.c + + + src/wolfCrypt/port/renesas_fspsm_rsa.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_fspsm_rsa.c + + + src/wolfCrypt/port/renesas_fspsm_sha.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c + + + src/wolfCrypt/port/renesas_fspsm_util.c + 1 + PARENT-5-PROJECT_LOC/wolfcrypt/src/port/Renesas/renesas_fspsm_util.c + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/script/fsp_ram_execution.ld mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/script/fsp_ram_execution.ld --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/script/fsp_ram_execution.ld 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/script/fsp_ram_execution.ld 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,243 @@ +/* + Linker File for Renesas RZ/N2L FSP +*/ + +MEMORY +{ + ATCM : ORIGIN = 0x00000000, LENGTH = 0x00020000 + BTCM : ORIGIN = 0x00100000, LENGTH = 0x00020000 + SYSTEM_RAM : ORIGIN = 0x10000000, LENGTH = 0x00180000 + SYSTEM_RAM_MIRROR : ORIGIN = 0x30000000, LENGTH = 0x00180000 + xSPI0_CS0_SPACE_MIRROR : ORIGIN = 0x40000000, LENGTH = 0x04000000 + xSPI0_CS1_SPACE_MIRROR : ORIGIN = 0x44000000, LENGTH = 0x04000000 + xSPI1_CS0_SPACE_MIRROR : ORIGIN = 0x48000000, LENGTH = 0x04000000 + xSPI1_CS1_SPACE_MIRROR : ORIGIN = 0x4C000000, LENGTH = 0x04000000 + CS0_SPACE_MIRROR : ORIGIN = 0x50000000, LENGTH = 0x04000000 + CS2_SPACE_MIRROR : ORIGIN = 0x54000000, LENGTH = 0x04000000 + CS3_SPACE_MIRROR : ORIGIN = 0x58000000, LENGTH = 0x04000000 + CS5_SPACE_MIRROR : ORIGIN = 0x5C000000, LENGTH = 0x04000000 + xSPI0_CS0_SPACE : ORIGIN = 0x60000000, LENGTH = 0x04000000 + xSPI0_CS1_SPACE : ORIGIN = 0x64000000, LENGTH = 0x04000000 + xSPI1_CS0_SPACE : ORIGIN = 0x68000000, LENGTH = 0x04000000 + xSPI1_CS1_SPACE : ORIGIN = 0x6C000000, LENGTH = 0x04000000 + CS0_SPACE : ORIGIN = 0x70000000, LENGTH = 0x04000000 + CS2_SPACE : ORIGIN = 0x74000000, LENGTH = 0x04000000 + CS3_SPACE : ORIGIN = 0x78000000, LENGTH = 0x04000000 + CS5_SPACE : ORIGIN = 0x7C000000, LENGTH = 0x04000000 +} + +SECTIONS +{ + .loader_text 0x00102000 : AT (0x00102000) + { + *(.loader_text) + */fsp/src/bsp/cmsis/Device/RENESAS/Source/*.o(.text*) + */fsp/src/bsp/mcu/all/bsp_clocks.o(.text*) + */fsp/src/bsp/mcu/all/bsp_irq.o(.text*) + */fsp/src/bsp/mcu/all/bsp_register_protection.o(.text*) + */fsp/src/r_ioport/r_ioport.o(.text*) + KEEP(*(.warm_start)) + } > BTCM + .loader_data : + { + */fsp/src/bsp/cmsis/Device/RENESAS/Source/*.o(.data*) + */fsp/src/bsp/mcu/all/bsp_clocks.o(.data*) + */fsp/src/bsp/mcu/all/bsp_irq.o(.data*) + */fsp/src/bsp/mcu/all/bsp_register_protection.o(.data*) + */fsp/src/r_ioport/r_ioport.o(.data*) + __loader_bss_start = .; + */fsp/src/bsp/cmsis/Device/RENESAS/Source/*.o(.bss*) + */fsp/src/bsp/mcu/all/bsp_clocks.o(.bss*) + */fsp/src/bsp/mcu/all/bsp_irq.o(.bss*) + */fsp/src/bsp/mcu/all/bsp_register_protection.o(.bss*) + */fsp/src/r_ioport/r_ioport.o(.bss*) + */fsp/src/bsp/cmsis/Device/RENESAS/Source/*.o(COMMON) + */fsp/src/bsp/mcu/all/bsp_clocks.o(COMMON) + */fsp/src/bsp/mcu/all/bsp_irq.o(COMMON) + */fsp/src/bsp/mcu/all/bsp_register_protection.o(.COMMON) + */fsp/src/r_ioport/r_ioport.o(.COMMON) + __loader_bss_end = . ; + } > BTCM + .intvec 0x00000000 : AT (0x00000000) + { + _fvector_start = .; + KEEP(*(.intvec)) + _fvector_end = .; + } > ATCM + .text 0x30000000 : AT (0x30000000) + { + _text_start = .; + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + _ctor_end = .; + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + _dtor_end = .; + + *(.rodata*) + _erodata = .; + KEEP(*(.eh_frame*)) + } > SYSTEM_RAM_MIRROR + .rvectors : + { + _rvectors_start = .; + KEEP(*(.rvectors)) + _rvectors_end = .; + } > SYSTEM_RAM_MIRROR + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > SYSTEM_RAM_MIRROR + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > SYSTEM_RAM_MIRROR + __exidx_end = .; + .got : + { + *(.got) + *(.got.plt) + _text_end = .; + } > SYSTEM_RAM_MIRROR + .data : + { + _data_start = .; + + *(vtable) + *(.data.*) + *(.data) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + + . = ALIGN(4); + + /* All data end */ + _data_end = .; + } > SYSTEM_RAM_MIRROR + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + _bss = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + _ebss = .; + _end = .; + } > SYSTEM_RAM_MIRROR + .heap (NOLOAD) : + { + . = ALIGN(8); + __HeapBase = .; + /* Place the STD heap here. */ + KEEP(*(.heap)) + __HeapLimit = .; + } > SYSTEM_RAM_MIRROR + .thread_stack (NOLOAD): + { + . = ALIGN(8); + __ThreadStackBase = .; + /* Place the Thread stacks here. */ + KEEP(*(.stack*)) + __ThreadStackLimit = .; + } > SYSTEM_RAM_MIRROR + .sys_stack (NOLOAD) : + { + . = ALIGN(8); + __SysStackBase = .; + /* Place the sys_stack here. */ + KEEP(*(.sys_stack)) + __SysStackLimit = .; + } > BTCM + .svc_stack (NOLOAD) : + { + . = ALIGN(8); + __SvcStackBase = .; + /* Place the svc_stack here. */ + KEEP(*(.svc_stack)) + __SvcStackLimit = .; + } > BTCM + .irq_stack (NOLOAD) : + { + . = ALIGN(8); + __IrqStackBase = .; + /* Place the irq_stack here. */ + KEEP(*(.irq_stack)) + __IrqStackLimit = .; + } > BTCM + .fiq_stack (NOLOAD) : + { + . = ALIGN(8); + __FiqStackBase = .; + /* Place the fiq_stack here. */ + KEEP(*(.fiq_stack)) + __FiqStackLimit = .; + } > BTCM + .und_stack (NOLOAD) : + { + . = ALIGN(8); + __UndStackBase = .; + /* Place the und_stack here. */ + KEEP(*(.und_stack)) + __UndStackLimit = .; + } > BTCM + .abt_stack (NOLOAD) : + { + . = ALIGN(8); + __AbtStackBase = .; + /* Place the abt_stack here. */ + KEEP(*(.abt_stack)) + __AbtStackLimit = .; + } > BTCM + .shared_noncache_buffer 0x300C0000 : AT (0x300C0000) + { + . = ALIGN(32); + _sncbuffer_start = .; + KEEP(*(.shared_noncache_buffer*)) + _sncbuffer_end = .; + } > SYSTEM_RAM_MIRROR + .noncache_buffer 0x30100000 : AT (0x30100000) + { + . = ALIGN(32); + _ncbuffer_start = .; + KEEP(*(.noncache_buffer*)) + _ncbuffer_end = .; + } > SYSTEM_RAM_MIRROR +} + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/rzn2l_tst_thread_entry.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/rzn2l_tst_thread_entry.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/rzn2l_tst_thread_entry.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/rzn2l_tst_thread_entry.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,438 @@ +/* rzn2l_tst_thread_entry.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include "rzn2l_tst_thread.h" + +#include "um_common_cfg.h" +#include "um_common_api.h" +#include "um_serial_io_api.h" +#include "um_serial_io.h" + +#include "wolfssl_demo.h" +#include "user_settings.h" + +typedef struct func_args { + int argc; + char** argv; + int return_code; +} func_args; + +static serial_io_instance_ctrl_t g_serial_io0_ctrl; +static serial_io_cfg_t const g_serial_io0_cfg = +{ + .p_uart_instance = &g_uart0, +}; +serial_io_instance_t const g_serial_io0 = +{ + .p_ctrl = &g_serial_io0_ctrl, + .p_cfg = &g_serial_io0_cfg, + .p_api = &g_serial_io_on_serial_io, +}; + +FSP_CPP_HEADER +void R_BSP_WarmStart(bsp_warm_start_event_t event) +BSP_PLACE_IN_SECTION(".warm_start"); +FSP_CPP_FOOTER + +void R_BSP_WarmStart(bsp_warm_start_event_t event) +{ + if (BSP_WARM_START_RESET == event) { + } + + if (BSP_WARM_START_POST_C == event){ + R_IOPORT_Open (&g_ioport_ctrl, &g_bsp_pin_cfg); + } +} + +#if defined(TLS_CLIENT) || \ + defined(TLS_SERVER) + extern uint8_t g_ether0_mac_address[6]; + const byte ucIPAddress[4] = { 192, 168, 11, 241 }; + const byte ucNetMask[4] = { 255, 255, 255, 0 }; + const byte ucGatewayAddress[4] = { 192, 168, 11, 1 }; + const byte ucDNSServerAddress[4] = { 192, 168, 11, 1 }; +#endif + +#if defined(WOLFSSL_RENESAS_FSPSM) && \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + +#if defined(UNIT_TEST) + int rsip_crypt_test(); +#endif + +#if (defined(BENCHMARK) || defined(CRYPT_TEST)) \ + && defined(HAVE_RENESAS_SYNC) && defined(HAVE_AES_CBC) + FSPSM_ST guser_PKCbInfo; +#endif + +void Clr_CallbackCtx(FSPSM_ST *g); +void RSIP_KeyGeneration(FSPSM_ST *g); + +void RSIP_KeyGeneration(FSPSM_ST *g) +{ + fsp_err_t rsip_error_code = FSP_SUCCESS; + + if (g->wrapped_key_aes128 != NULL) { + rsip_error_code = R_RSIP_KeyGenerate(&gFSPSM_ctrl, + RSIP_KEY_TYPE_AES_128, + g->wrapped_key_aes128); + if (rsip_error_code == FSP_SUCCESS) + g->keyflgs_crypt.bits.aes128_installedkey_set = 1; + } + + if (g->wrapped_key_aes256 != NULL) { + rsip_error_code = R_RSIP_KeyGenerate(&gFSPSM_ctrl, + RSIP_KEY_TYPE_AES_256, + g->wrapped_key_aes256); + if (rsip_error_code == FSP_SUCCESS) + g->keyflgs_crypt.bits.aes256_installedkey_set = 1; + } + + if (g->wrapped_key_rsapri1024 != NULL && + g->wrapped_key_rsapub1024 != NULL) { + rsip_error_code = R_RSIP_KeyPairGenerate(&gFSPSM_ctrl, + RSIP_KEY_PAIR_TYPE_RSA_1024, + g->wrapped_key_rsapub1024, + g->wrapped_key_rsapri1024); + if (rsip_error_code == FSP_SUCCESS) { + g->keyflgs_crypt.bits.rsapri1024_installedkey_set = 1; + g->keyflgs_crypt.bits.rsapub1024_installedkey_set = 1; + } + } + + if (g->wrapped_key_rsapri2048 != NULL && + g->wrapped_key_rsapub2048 != NULL) { + rsip_error_code = R_RSIP_KeyPairGenerate(&gFSPSM_ctrl, + RSIP_KEY_PAIR_TYPE_RSA_2048, + g->wrapped_key_rsapub2048, + g->wrapped_key_rsapri2048); + if (rsip_error_code == FSP_SUCCESS) { + g->keyflgs_crypt.bits.rsapri2048_installedkey_set = 1; + g->keyflgs_crypt.bits.rsapub2048_installedkey_set = 1; + } + } +} + +/* only pointer sets to NULL */ +/* owner of keys should be freed */ +void Clr_CallbackCtx(FSPSM_ST *g) +{ + (void) g; + + if (g->wrapped_key_aes256 != NULL) + g->wrapped_key_aes256 = NULL; + + if (g->wrapped_key_aes128 != NULL) + g->wrapped_key_aes128 = NULL; + + #if defined(WOLFSSL_RENESAS_RSIP_CRYPTONLY) + if (g->wrapped_key_rsapri2048 != NULL) + g->wrapped_key_rsapri2048 = NULL; + + if (g->wrapped_key_rsapub2048 != NULL) + g->wrapped_key_rsapub2048 = NULL; + + if (g->wrapped_key_rsapri1024 != NULL) + g->wrapped_key_rsapri1024 = NULL; + + if (g->wrapped_key_rsapub2048 != NULL) + g->wrapped_key_rsapub2048 = NULL; + #endif + + XMEMSET(g, 0, sizeof(FSPSM_ST)); +} +#endif + + +#if defined(TLS_CLIENT) || \ + defined(TLS_SERVER) + +extern WOLFSSL_CTX *client_ctx; +extern WOLFSSL_CTX *server_ctx; + +void TCPInit( ) +{ + BaseType_t fr_status; + + /* FreeRTOS+TCP Ethernet and IP Setup */ + fr_status = FreeRTOS_IPInit(ucIPAddress, + ucNetMask, + ucGatewayAddress, + ucDNSServerAddress, + g_ether0_mac_address); + + if (pdPASS != fr_status) { + printf("Error [%ld]: FreeRTOS_IPInit.\n",fr_status); + } +} + + +void wolfSSL_TLS_cleanup() +{ +#if defined(TLS_CLIENT) + if (client_ctx) { + wolfSSL_CTX_free(client_ctx); + } +#endif +#if defined(TLS_SERVER) + if (server_ctx) { + wolfSSL_CTX_free(server_ctx); + } +#endif + wolfSSL_Cleanup(); +} + +#endif + +serial_io_instance_t const * gp_serial_io0 = &g_serial_io0; +static void serial_init() +{ + usr_err_t usr_err; + + /** Open Serial I/O module. */ + usr_err = gp_serial_io0->p_api->open + (gp_serial_io0->p_ctrl, gp_serial_io0->p_cfg ); + if( USR_SUCCESS != usr_err ) + { + USR_DEBUG_BLOCK_CPU(); + } + + /** Start Serial I/O module. */ + usr_err = gp_serial_io0->p_api->start( gp_serial_io0->p_ctrl ); + if( USR_SUCCESS != usr_err ) + { + USR_DEBUG_BLOCK_CPU(); + } + printf( " Started Serial I/O interface." ); +} + +/* rzn2l_tst_thread entry function */ +/* pvParameters contains TaskHandle_t */ +void rzn2l_tst_thread_entry(void *pvParameters) +{ + FSP_PARAMETER_NOT_USED (pvParameters); + + + serial_init(); + +#if defined(UNIT_TEST) + + int ret; + + printf("\n"); + printf("\n Start wolf RSIP Crypt Test\n"); + + if ((ret = wolfCrypt_Init()) != 0) { + printf(" wolfCrypt_Init failed %d\n", ret); + } +#if defined(WOLFSSL_RENESAS_FSPSM) && \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + printf(" \n"); + printf(" RSIP Unit Test\n"); + rsip_crypt_test(); +#else + printf(" \n"); + printf(" RSIP Unit Test Not Run\n"); +#endif + printf(" \n"); + printf(" End wolf RSIP crypt Test\n"); + + if ((ret = wolfCrypt_Cleanup()) != 0) { + printf("wolfCrypt_Cleanup failed %d\n", ret); + } + +#elif defined(CRYPT_TEST) + #include "wolfcrypt/test/test.h" +#if defined(HAVE_RENESAS_SYNC) && \ + defined(HAVE_AES_CBC) + + Clr_CallbackCtx(&guser_PKCbInfo); + + #if defined(WOLFSSL_AES_128) + uint8_t wrapped_key1[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_128]; + FSPSM_AES_PWKEY user_aes128_key_index = + (FSPSM_AES_PWKEY)wrapped_key1; + guser_PKCbInfo.wrapped_key_aes128 = user_aes128_key_index; + #endif + + #if defined(WOLFSSL_AES_256) + uint8_t wrapped_key2[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_256]; + FSPSM_AES_PWKEY user_aes256_key_index = + (FSPSM_AES_PWKEY)wrapped_key2; + guser_PKCbInfo.wrapped_key_aes256 = user_aes256_key_index; + #endif + /* Generate Wrapped aes key */ + RSIP_KeyGeneration(&guser_PKCbInfo); +#endif + + int ret; + + func_args args = { 0 }; + + if ((ret = wolfCrypt_Init()) != 0) { + printf("wolfCrypt_Init failed %d\n", ret); + } + + printf("\n"); + printf("\n Start wolfCrypt Test\n"); + wolfcrypt_test((void*)&args); + printf(" End wolfCrypt Test\n"); + + if ((ret = wolfCrypt_Cleanup()) != 0) { + printf("wolfCrypt_Cleanup failed %d\n", ret); + } +#if defined(HAVE_RENESAS_SYNC) && \ + defined(HAVE_AES_CBC) + Clr_CallbackCtx(&guser_PKCbInfo); +#endif + +#elif defined(BENCHMARK) +#if defined(HAVE_RENESAS_SYNC) && \ + defined(HAVE_AES_CBC) + + Clr_CallbackCtx(&guser_PKCbInfo); + + #if defined(WOLFSSL_AES_128) + uint8_t wrapped_key1[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_128]; + FSPSM_AES_PWKEY user_aes128_key_index = + (FSPSM_AES_PWKEY)wrapped_key1; + guser_PKCbInfo.wrapped_key_aes128 = user_aes128_key_index; + #endif + + #if defined(WOLFSSL_AES_256) + uint8_t wrapped_key2[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_256]; + FSPSM_AES_PWKEY user_aes256_key_index = + (FSPSM_AES_PWKEY)wrapped_key2; + guser_PKCbInfo.wrapped_key_aes256 = user_aes256_key_index; + #endif + /* Generate Wrapped aes key */ + RSIP_KeyGeneration(&guser_PKCbInfo); +#endif + printf(" Start wolfCrypt Benchmark\n"); + + benchmark_test(NULL); + + printf(" End wolfCrypt Benchmark\n"); +#if defined(HAVE_RENESAS_SYNC) && \ + defined(HAVE_AES_CBC) + Clr_CallbackCtx(&guser_PKCbInfo); +#endif + +#elif defined(TLS_CLIENT) + + int i = 0; + const int Max_Retry = 10; + + #if defined(WOLFSSL_TLS13) + const char* cipherlist[] = { + "TLS13-AES128-GCM-SHA256", + "TLS13-AES256-GCM-SHA384", + }; + const int cipherlist_sz = 2; + TestInfo info[cipherlist_sz]; + #elif defined(USE_CERT_BUFFERS_2048) + const char* cipherlist[] = { + "ECDHE-RSA-AES128-GCM-SHA256", + "ECDHE-RSA-AES256-SHA", + "ECDHE-RSA-AES128-SHA256" + }; + const int cipherlist_sz = 3; + TestInfo info[cipherlist_sz]; + #elif defined(USE_CERT_BUFFERS_256) + const char* cipherlist[] = { + "ECDHE-ECDSA-AES128-GCM-SHA256", + "ECDHE-ECDSA-AES256-SHA", + "ECDHE-ECDSA-AES128-SHA256" + }; + const int cipherlist_sz = 3; + TestInfo info[cipherlist_sz]; + #endif + + TCPInit(); + + int TCP_connect_retry = 0; + + printf("\n Start TLS Connection to %s port(%d)\n", SERVER_IP, DEFAULT_PORT); + wolfSSL_TLS_client_init(); + + do { + + info[i].port = DEFAULT_PORT; + info[i].cipher = cipherlist[i]; + info[i].ctx = client_ctx; + info[i].id = i; + + XMEMSET(info[i].name, 0, sizeof(info[i].name)); + XSPRINTF(info[i].name, "wolfSSL_TLS_client_do(%02d)", i); + + if(wolfSSL_TLS_client_do(&info[i]) == -116) { + TCP_connect_retry++; + continue; + } + TCP_connect_retry = 0; + i++; + } while (i < cipherlist_sz && TCP_connect_retry < Max_Retry); + + printf("\n End of Client Example"); + + wolfSSL_TLS_cleanup(); +#elif defined(TLS_SERVER) + + int i = 0; + const int Max_Retry = 10; + TestInfo info; + + TCPInit(); + + int TCP_connect_retry = 0; + + printf("\n Start TLS Accept at %03d.%03d.%03d.%03d port(%d)\n", + ucIPAddress[0], + ucIPAddress[1], + ucIPAddress[2], + ucIPAddress[3],DEFAULT_PORT); + wolfSSL_TLS_server_init(); + + do { + + info.port = DEFAULT_PORT; + info.cipher = NULL; + info.ctx = server_ctx; + info.id = i; + + XMEMSET(info.name, 0, sizeof(info.name)); + XSPRINTF(info.name, "wolfSSL_TLS_server_do(%02d)", + TCP_connect_retry); + if(wolfSSL_TLS_server_do(&info) == -116) { + TCP_connect_retry++; + continue; + } + TCP_connect_retry = 0; + } while (TCP_connect_retry < Max_Retry); + + printf("\n End of Client Example"); + +#endif + /* TODO: add your own code here */ + while (1) + { + vTaskDelay (1); + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/serial_io/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/serial_io/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/serial_io/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/serial_io/.gitignore 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_client.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_client.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_client.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_client.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,184 @@ +/* wolf_client.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include "wolfssl_demo.h" + +#if defined(TLS_CLIENT) + +#include +#include +#include +#include "wolfssl/wolfcrypt/settings.h" +#include "wolfssl/ssl.h" +#include "wolfssl/certs_test.h" + +WOLFSSL_CTX *client_ctx = NULL; + +void wolfSSL_TLS_client_init() +{ + #ifndef NO_FILESYSTEM + #ifdef USE_ECC_CERT + char *cert = "./certs/ca-ecc-cert.pem"; + #else + char *cert = "./certs/ca-cert.pem"; + #endif + #else + #ifdef USE_CERT_BUFFERS_256 + const unsigned char *cert = ca_ecc_cert_der_256; + #define SIZEOF_CERT sizeof_ca_ecc_cert_der_256 + #else + const unsigned char *cert = ca_cert_der_2048; + #define SIZEOF_CERT sizeof_ca_cert_der_2048 + #endif + #endif + + wolfSSL_Init(); + + /* Create and initialize WOLFSSL_CTX */ + if ((client_ctx = wolfSSL_CTX_new( + wolfSSLv23_client_method_ex((void *)NULL))) == NULL) { + printf("ERROR: failed to create WOLFSSL_CTX\n"); + return; + } + + #if !defined(NO_FILESYSTEM) + if (wolfSSL_CTX_load_verify_locations(client_ctx, cert, 0) != SSL_SUCCESS) { + printf("ERROR: can't load \"%s\"\n", cert); + return NULL; + } + #else + if (wolfSSL_CTX_load_verify_buffer(client_ctx, cert, SIZEOF_CERT, + SSL_FILETYPE_ASN1) != SSL_SUCCESS){ + printf("ERROR: can't load certificate data\n"); + return; + } + #endif +} + +int wolfSSL_TLS_client_do(void *pvParam) +{ + + int ret; + + TestInfo* p = (TestInfo*)pvParam; + /* FreeRTOS+TCP Objects */ + socklen_t xSize = sizeof(struct freertos_sockaddr); + xSocket_t xClientSocket = NULL; + struct freertos_sockaddr xRemoteAddress; + + WOLFSSL_CTX *ctx = (WOLFSSL_CTX *)p->ctx; + WOLFSSL *ssl = NULL; + + #define BUFF_SIZE 256 + static const char sendBuff[]= "Hello Server\n" ; + + char rcvBuff[BUFF_SIZE] = {0}; + + /* Client Socket Setup */ + xRemoteAddress.sin_port = FreeRTOS_htons(p->port); + xRemoteAddress.sin_addr = FreeRTOS_inet_addr(SERVER_IP); + + /* Create a FreeRTOS TCP Socket and connect */ + xClientSocket = FreeRTOS_socket(FREERTOS_AF_INET, + FREERTOS_SOCK_STREAM, + FREERTOS_IPPROTO_TCP); + + configASSERT(xClientSocket != FREERTOS_INVALID_SOCKET); + + FreeRTOS_bind(xClientSocket, NULL, sizeof(xSize)); + + /* Client Socket Connect */ + ret = FreeRTOS_connect(xClientSocket, + &xRemoteAddress, + sizeof(xRemoteAddress)); + + if (ret != FR_SOCKET_SUCCESS) { + printf(" Error [%d]: FreeRTOS_connect.\n", ret); + goto out; + } + + printf(" Start to connect to the server.\n"); + + if((ssl = wolfSSL_new(ctx)) == NULL) { + printf(" ERROR wolfSSL_new: %d\n", wolfSSL_get_error(ssl, 0)); + goto out; + } + + /* Attach wolfSSL to the socket */ + ret = wolfSSL_set_fd(ssl, (int) xClientSocket); + if (ret != WOLFSSL_SUCCESS) { + printf(" Error [%d]: wolfSSL_set_fd.\n",ret); + } + + printf(" Cipher : %s\n", + (p->cipher == NULL) ? "NULL" : p->cipher); + /* use specific cipher */ + if (p->cipher != NULL && wolfSSL_set_cipher_list(ssl, p->cipher) + != WOLFSSL_SUCCESS) { + printf(" client can't set cipher list 1"); + goto out; + } + + #ifdef DEBUG_WOLFSSL + wolfSSL_Debugging_ON(); + #endif + + if(wolfSSL_connect(ssl) != SSL_SUCCESS) { + printf(" ERROR SSL connect: %d\n", wolfSSL_get_error(ssl, 0)); + goto out; + } + + #ifdef DEBUG_WOLFSSL + wolfSSL_Debugging_OFF(); + #endif + + if (wolfSSL_write(ssl, sendBuff, (int)strlen(sendBuff)) + != (int)strlen(sendBuff)) { + printf(" ERROR SSL write: %d\n", wolfSSL_get_error(ssl, 0)); + goto out; + } + + if ((ret=wolfSSL_read(ssl, rcvBuff, BUFF_SIZE)) < 0) { + printf(" ERROR SSL read: %d\n", wolfSSL_get_error(ssl, 0)); + goto out; + } + + rcvBuff[ret] = '\0' ; + printf(" Received: %s\n\n", rcvBuff); + + out: + if (ssl) { + wolfSSL_shutdown(ssl); + wolfSSL_free(ssl); + ssl = NULL; + /* need to reset callback */ + } + /* clean up socket */ + if (xClientSocket) { + FreeRTOS_shutdown(xClientSocket, FREERTOS_SHUT_RDWR); + FreeRTOS_closesocket(xClientSocket); + xClientSocket = NULL; + } + + return ret; +} + +#endif /* TLS_CLIENT */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_server.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_server.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_server.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolf_server.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,210 @@ +/* wolf_server.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include "wolfssl_demo.h" + +#if defined(TLS_SERVER) + +#include +#include + +#include "wolfssl/wolfcrypt/settings.h" +#include "wolfssl/ssl.h" +#include "wolfssl/certs_test.h" +#include "wolfssl_demo.h" + +WOLFSSL_CTX *server_ctx = NULL; + +void wolfSSL_TLS_server_init() +{ + + int ret; + + #if defined(USE_CERT_BUFFERS_256) + const unsigned char *cert = serv_ecc_der_256; + #define sizeof_cert sizeof_serv_ecc_der_256 + const unsigned char *key = ecc_key_der_256; + #define sizeof_key sizeof_serv_ecc_der_256 + const unsigned char *clientCert = cliecc_cert_der_256; + #define sizeof_clicert sizeof_cliecc_cert_der_256 + #else + const unsigned char *cert = server_cert_der_2048; + #define sizeof_cert sizeof_server_cert_der_2048 + const unsigned char *key = server_key_der_2048; + #define sizeof_key sizeof_server_key_der_2048 + const unsigned char *clientCert = client_cert_der_2048; + #define sizeof_clicert sizeof_client_cert_der_2048 + #endif + + wolfSSL_Init(); + + #ifdef DEBUG_WOLFSSL + wolfSSL_Debugging_ON(); + #endif + + /* Create and initialize WOLFSSL_CTX */ + if ((server_ctx = wolfSSL_CTX_new( + wolfSSLv23_server_method_ex((void *)NULL))) == NULL) { + printf("ERROR: failed to create WOLFSSL_CTX\n"); + return; + } + + ret = wolfSSL_CTX_use_certificate_buffer(server_ctx, cert, + sizeof_cert, SSL_FILETYPE_ASN1); + if (ret != SSL_SUCCESS) { + printf("Error %d loading server-cert!\n", ret); + return; + } + + /* Load server key into WOLFSSL_CTX */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(server_ctx, key, sizeof_key, + SSL_FILETYPE_ASN1); + if (ret != SSL_SUCCESS) { + printf("Error %d loading server-key!\n", ret); + return; + } + + if (1) { + wolfSSL_CTX_set_verify(server_ctx, WOLFSSL_VERIFY_PEER | + WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); + if (wolfSSL_CTX_load_verify_buffer(server_ctx, clientCert, + sizeof_clicert, + SSL_FILETYPE_ASN1) != SSL_SUCCESS) + printf("can't load ca file, Please run from wolfSSL home dir\n"); + } +} + +int wolfSSL_TLS_server_do(void *pvParam) +{ + int ret; + WOLFSSL *ssl = NULL; + word32 len; + #define BUFF_SIZE 256 + char buff[BUFF_SIZE]; + + TestInfo* p = (TestInfo*)pvParam; + WOLFSSL_CTX *ctx = (WOLFSSL_CTX *)p->ctx;; + + /* FreeRTOS+TCP parameters and objects */ + struct freertos_sockaddr xClient, xBindAddress; + Socket_t xListeningSocket, xConnectedSocket; + socklen_t xSize = sizeof(xClient); + const BaseType_t xBacklog = 1; /* Max number of connections */ + static const TickType_t xReceiveTimeOut = portMAX_DELAY; + + /* Send/Receive Message */ + const char *reply = "I hear ya fa shizzle!\n"; + len = (word32)XSTRLEN(*reply); + + /* Attempt to open the socket. */ + xListeningSocket = FreeRTOS_socket(FREERTOS_AF_INET, + FREERTOS_SOCK_STREAM, + FREERTOS_IPPROTO_TCP); + configASSERT(xListeningSocket != FREERTOS_INVALID_SOCKET); + + /* Set a time out so accept() will just wait for a connection. */ + FreeRTOS_setsockopt(xListeningSocket, 0, + FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof(xReceiveTimeOut)); + + xBindAddress.sin_port = (uint16_t) DEFAULT_PORT; + xBindAddress.sin_port = FreeRTOS_htons(xBindAddress.sin_port); + + configASSERT(xListeningSocket != FREERTOS_INVALID_SOCKET); + + ret = FreeRTOS_bind(xListeningSocket, &xBindAddress, sizeof(xBindAddress)); + if (ret == FR_SOCKET_SUCCESS) + ret = FreeRTOS_listen(xListeningSocket, xBacklog); + + if (ret != FR_SOCKET_SUCCESS) { + printf("Error [%d]: FreeRTOS_bind.\n",ret); + goto out; + } + + while (1) { + ret = WOLFSSL_FAILURE; + xConnectedSocket = FreeRTOS_accept(xListeningSocket, &xClient, &xSize); + configASSERT(xConnectedSocket != FREERTOS_INVALID_SOCKET); + + if((ssl = wolfSSL_new(ctx)) == NULL) { + printf("ERROR: failed wolfSSL_new\n"); + goto out; + } + /* Attach wolfSSL to the socket */ + ret = wolfSSL_set_fd(ssl, (int) xConnectedSocket); + /* Establish TLS connection */ + if (ret != WOLFSSL_SUCCESS) { + printf("Error [%d]: wolfSSL_set_fd.\n",ret); + goto out; + } + + if (wolfSSL_accept(ssl) < 0) { + printf("ERROR: SSL Accept(%d)\n", wolfSSL_get_error(ssl, 0)); + goto out; + } + + + if ((len = wolfSSL_read(ssl, buff, sizeof(buff) - 1)) < 0) { + printf("ERROR: SSL Read(%d)\n", wolfSSL_get_error(ssl, 0)); + goto out; + } + + buff[len] = '\0'; + printf("Received: %s\n", buff); + + /* Write our reply into buff */ + memset(buff, 0, sizeof(buff)); + memcpy(buff, reply, len); + + /* Reply back to the client */ + if (wolfSSL_write(ssl, buff, len) != len) { + printf("ERROR: SSL Write(%d)\n", wolfSSL_get_error(ssl, 0)); + } + + /* Cleanup after this connection */ + printf("Cleaning up socket and wolfSSL objects.\n"); + if (xConnectedSocket != NULL) + FreeRTOS_closesocket(xConnectedSocket); + if (ssl != NULL) + wolfSSL_free(ssl); + + printf("Waiting connection...."); + } + +out: + if (ssl) { + wolfSSL_shutdown(ssl); + wolfSSL_free(ssl); + } + + /* clean up socket */ + if (xConnectedSocket) { + FreeRTOS_shutdown(xConnectedSocket, FREERTOS_SHUT_RDWR); + FreeRTOS_closesocket(xConnectedSocket); + xConnectedSocket = NULL; + } + if (xListeningSocket) { + FreeRTOS_shutdown(xListeningSocket, FREERTOS_SHUT_RDWR); + FreeRTOS_closesocket(xListeningSocket); + xListeningSocket = NULL; + } + + return ret; +} +#endif /* TLS_SERVER */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolfssl_rsip_unit_test.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolfssl_rsip_unit_test.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolfssl_rsip_unit_test.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/test/wolfssl_rsip_unit_test.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1325 @@ +/* wolfssl_sce_unit_test.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include +#include +#include + +#include + +#if defined(WOLFSSL_RENESAS_FSPSM) && \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + +#include +#include +#include +#include +#include +#include + +#include "FreeRTOS.h" + +extern FSPSM_INSTANCE gFSPSM_ctrl; +int devId1 = INVALID_DEVID; + +#ifndef NO_SHA + int sha_test(); +#endif + +#ifndef NO_SHA256 + int sha256_test(); + void tskSha256_Test1(void *pvParam); + int rsip_crypt_sha256_multitest(); +#endif +#ifdef WOLFSSL_SHA224 + int sha224_test(); +#endif +#ifdef WOLFSSL_SHA384 + int sha384_test(); +#endif +#ifdef WOLFSSL_SHA512 + int sha512_test(); +#endif + +#define STACK_SIZE (1 * 1024) + +#define RESULT_STR(ret) if (ret == 0)\ + printf(" \tPassed \n");\ + else \ + printf(" \tFailed \n"); + +static xSemaphoreHandle exit_semaph; +static byte exit_loop = 0; +static byte sha256_multTst_rslt1 = 0; +static byte sha256_multTst_rslt2 = 0; +static byte Aes128_Cbc_multTst_rslt = 0; +static byte Aes256_Cbc_multTst_rslt = 0; +static byte Aes128_Gcm_multTst_rslt = 0; +static byte Aes256_Gcm_multTst_rslt = 0; + +int rsip_crypt_AesCbc_multitest(); +int rsip_crypt_AesGcm_multitest(); +int rsip_crypt_Sha_AesCbcGcm_multitest(); +int rsip_crypt_sha_multitest(); +int rsip_crypt_test(); + +void Clr_CallbackCtx(FSPSM_ST *g); + +FSPSM_ST gCbInfo; +FSPSM_ST gCbInfo_a; /* for multi testing */ + +#if defined(HAVE_AES_CBC) + +#if defined(WOLFSSL_AES_128) + uint8_t wrapped_key1[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_128]; + uint8_t wrapped_key2[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_128]; + FSPSM_AES_PWKEY g_user_aes128_key_index1 = + (FSPSM_AES_PWKEY)wrapped_key1; + FSPSM_AES_PWKEY g_user_aes128_key_index2 = + (FSPSM_AES_PWKEY)wrapped_key2; +#endif + +#if defined(WOLFSSL_AES_256) + uint8_t wrapped_key3[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_256]; + uint8_t wrapped_key4[RSIP_BYTE_SIZE_WRAPPED_KEY_AES_256]; + FSPSM_AES_PWKEY g_user_aes256_key_index1 = + (FSPSM_AES_PWKEY)wrapped_key3; + FSPSM_AES_PWKEY g_user_aes256_key_index2 = + (FSPSM_AES_PWKEY)wrapped_key4; +#endif + +#endif + +#if !defined(NO_RSA) + uint8_t rsa1024_wrapped_key1[RSIP_BYTE_SIZE_WRAPPED_KEY_RSA_1024_PUBLIC]; + uint8_t rsa1024_wrapped_key2[RSIP_BYTE_SIZE_WRAPPED_KEY_RSA_1024_PRIVATE ]; + uint8_t rsa2048_wrapped_key1[RSIP_BYTE_SIZE_WRAPPED_KEY_RSA_2048_PUBLIC]; + uint8_t rsa2048_wrapped_key2[RSIP_BYTE_SIZE_WRAPPED_KEY_RSA_2048_PRIVATE ]; + + FSPSM_RSA1024_WPB_KEY* g_user_rsa1024_public_key = + (FSPSM_RSA1024_WPB_KEY*)rsa1024_wrapped_key1; + FSPSM_RSA1024_WPI_KEY* g_user_rsa1024_private_key = + (FSPSM_RSA1024_WPI_KEY*)rsa1024_wrapped_key2; + FSPSM_RSA2048_WPB_KEY* g_user_rsa2048_public_key = + (FSPSM_RSA2048_WPB_KEY*)rsa2048_wrapped_key1; + FSPSM_RSA2048_WPI_KEY* g_user_rsa2048_private_key = + (FSPSM_RSA2048_WPI_KEY*)rsa2048_wrapped_key2; +#endif +typedef struct tagInfo +{ + FSPSM_AES_PWKEY aes_key; +} Info; + +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) + +static int rsip_aes128_cbc_test(int prnt, FSPSM_AES_PWKEY aes_key) +{ + + Aes aes[1]; + + byte cipher[AES_BLOCK_SIZE]; + byte plain[AES_BLOCK_SIZE]; + word32 keySz = (word32)(128/8); + int ret = 0; + + WOLFSSL_SMALL_STACK_STATIC const byte msg[] = { + /* "Now is the time for all " w/o trailing 0 */ + 0x6e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, + 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 + }; + byte iv[] = "1234567890abcdef "; /* align */ + + XMEMSET(cipher, 0, AES_BLOCK_SIZE); + XMEMSET(plain, 0, AES_BLOCK_SIZE); + + if (prnt) { + printf(" rsip_aes_cbc_test() "); + } + + ret = wc_AesInit(aes, NULL, devId1); + if (ret == 0) { + ret = wc_AesSetKey(aes, (byte*)aes_key, keySz, + iv, AES_ENCRYPTION); + if (ret == 0) { + ret = wc_AesCbcEncrypt(aes, cipher, msg, AES_BLOCK_SIZE); + } + + wc_AesFree(aes); + } + + if (ret != 0) + ret = -1; + +#ifdef HAVE_AES_DECRYPT + ret = wc_AesInit(aes, NULL, devId1); + if (ret == 0) { + ret = wc_AesSetKey(aes, (byte*)aes_key, keySz, + iv, AES_DECRYPTION); + if (ret == 0) + ret = wc_AesCbcDecrypt(aes, plain, cipher, AES_BLOCK_SIZE); + + wc_AesFree(aes); + } + if (ret != 0) + ret = -2; + if (XMEMCMP(plain, msg, AES_BLOCK_SIZE) != 0) + ret = -3; +#endif /* HAVE_AES_DECRYPT */ + + (void)plain; + + if (prnt) { + RESULT_STR(ret) + } + + return ret; +} + +static void tskAes128_Cbc_Test(void *pvParam) +{ + int ret = 0; + Info *p = (Info*)pvParam; + + while (exit_loop == 0) { + ret = rsip_aes128_cbc_test(0, p->aes_key); + vTaskDelay(10/portTICK_PERIOD_MS); + if (ret != 0) { + printf(" result was not good(%d). rsip_aes_cbc_test\n", ret); + Aes128_Cbc_multTst_rslt = 1; + } + } + + xSemaphoreGive(exit_semaph); + vTaskDelete(NULL); +} + +#endif + +#ifdef WOLFSSL_AES_256 +static int rsip_aes256_cbc_test(int prnt, FSPSM_AES_PWKEY aes_key) +{ + Aes enc[1]; + byte cipher[AES_BLOCK_SIZE]; + byte plain[AES_BLOCK_SIZE]; + Aes dec[1]; + const word32 keySz = (word32)(256/8); + int ret = 0; + + /* Test vectors from NIST Special Publication 800-38A, 2001 Edition, + * Appendix F.2.5 */ + WOLFSSL_SMALL_STACK_STATIC const byte msg[] = { + 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96, + 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a + }; + WOLFSSL_SMALL_STACK_STATIC byte iv[] = { + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F + }; + + if (prnt) + printf(" rsip_aes256_test() "); + + if (wc_AesInit(enc, NULL, devId1) != 0) { + ret = -1; + goto out; + } + + if (wc_AesInit(dec, NULL, devId1) != 0){ + ret = -2; + goto out; + } + + ret = wc_AesSetKey(enc, (uint8_t*)aes_key, + keySz, iv, AES_ENCRYPTION); + if (ret != 0){ + ret = -3; + goto out; + } + + ret = wc_AesSetKey(dec, (uint8_t*)aes_key, + keySz, iv, AES_DECRYPTION); + if (ret != 0) { + ret = -4; + goto out; + } + + XMEMSET(cipher, 0, AES_BLOCK_SIZE); + ret = wc_AesCbcEncrypt(enc, cipher, msg, (int) sizeof(msg)); + + if (ret != 0) { + ret = -5; + goto out; + } + + XMEMSET(plain, 0, AES_BLOCK_SIZE); + ret = wc_AesCbcDecrypt(dec, plain, cipher, (int) sizeof(cipher)); + + if (ret != 0){ + ret = -6; + goto out; + } + if (XMEMCMP(plain, msg, (int) sizeof(plain))) { + ret = -7; + goto out; + } + +out: + wc_AesFree(enc); + wc_AesFree(dec); + + if (prnt) { + RESULT_STR(ret) + } + + return ret; +} + +static void tskAes256_Cbc_Test(void *pvParam) +{ + int ret = 0; + Info *p = (Info*)pvParam; + + while (exit_loop == 0) { + ret = rsip_aes256_cbc_test(0, p->aes_key); + vTaskDelay(10/portTICK_PERIOD_MS); + if (ret != 0) { + printf(" result was not good(%d). rsip_aes256_test\n", ret); + Aes256_Cbc_multTst_rslt = 1; + } + } + + xSemaphoreGive(exit_semaph); + vTaskDelete(NULL); +} + +#endif /* WOLFSSL_AES_256 */ + +#if defined(WOLFSSL_AES_256) +static int rsip_aesgcm256_test(int prnt, FSPSM_AES_PWKEY aes256_key) +{ + Aes enc[1]; + Aes dec[1]; + FSPSM_ST userContext; + word32 keySz = (word32)(256/8); + /* + * This is Test Case 16 from the document Galois/ + * Counter Mode of Operation (GCM) by McGrew and + * Viega. + */ + WOLFSSL_SMALL_STACK_STATIC const byte p[] = + { + 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, + 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, + 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, + 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, + 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, + 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, + 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, + 0xba, 0x63, 0x7b, 0x39 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte a[] = + { + 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xab, 0xad, 0xda, 0xd2 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte iv1[] = + { + 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, + 0xde, 0xca, 0xf8, 0x88 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte c1[] = + { + 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07, + 0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d, + 0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9, + 0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa, + 0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d, + 0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38, + 0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a, + 0xbc, 0xc9, 0xf6, 0x62 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte t1[] = + { + 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, + 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b + }; + + byte resultT[sizeof(t1)]; + byte resultP[sizeof(p) + AES_BLOCK_SIZE]; + byte resultC[sizeof(p) + AES_BLOCK_SIZE]; + int result = 0; + int ret; + + (void) result; + + if (prnt) { + printf(" rsip_aes256_gcm_test() "); + } + + XMEMSET(resultT, 0, sizeof(resultT)); + XMEMSET(resultC, 0, sizeof(resultC)); + XMEMSET(resultP, 0, sizeof(resultP)); + XMEMSET(&userContext, 0, sizeof(FSPSM_ST)); + + if (wc_AesInit(enc, NULL, devId1) != 0) { + ret = -1; + goto out; + } + if (wc_AesInit(dec, NULL, devId1) != 0) { + ret = -2; + goto out; + } + + result = wc_AesGcmSetKey(enc, (byte*)aes256_key, + keySz); + if (result != 0) { + ret = -3; + goto out; + } + + /* AES-GCM encrypt and decrypt both use AES encrypt internally */ + result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), + (byte*)iv1, sizeof(iv1), + resultT, sizeof(resultT), + a, sizeof(a)); + + if (result != 0) { + ret = -4; + goto out; + } + + result = wc_AesGcmSetKey(dec, (byte*)aes256_key, + keySz); + if (result != 0) { + ret = -7; + goto out; + } + + result = wc_AesGcmDecrypt(dec, resultP, resultC, sizeof(c1), + iv1, sizeof(iv1), resultT, sizeof(resultT), + a, sizeof(a)); + if (result != 0){ + ret = -8; + goto out; + } + if (XMEMCMP(p, resultP, sizeof(p))) { + ret = -9; + goto out; + } + + XMEMSET(resultT, 0, sizeof(resultT)); + XMEMSET(resultC, 0, sizeof(resultC)); + XMEMSET(resultP, 0, sizeof(resultP)); + + wc_AesGcmSetKey(enc, (byte*)aes256_key, + RSIP_BYTE_SIZE_WRAPPED_KEY_AES_256); + /* AES-GCM encrypt and decrypt both use AES encrypt internally */ + result = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), + (byte*)iv1, sizeof(iv1), + resultT + 1, sizeof(resultT) - 1, + a, sizeof(a)); + if (result != 0) { + ret = -10; + goto out; + } + + result = wc_AesGcmDecrypt(enc, resultP, resultC, sizeof(p), + iv1, sizeof(iv1), resultT + 1, sizeof(resultT) - 1, + a, sizeof(a)); + + if (result != 0) { + ret = -11; + goto out; + } + if (XMEMCMP(p, resultP, sizeof(p))) { + ret = -12; + goto out; + } + + ret = 0; + + out: + wc_AesFree(enc); + wc_AesFree(dec); + + if (prnt) { + RESULT_STR(ret) + } + + return ret; +} + +static void tskAes256_Gcm_Test(void *pvParam) +{ + int ret = 0; + Info *p = (Info*)pvParam; + + while (exit_loop == 0) { + ret = rsip_aesgcm256_test(0, p->aes_key); + vTaskDelay(10/portTICK_PERIOD_MS); + if (ret != 0) { + printf(" result was not good(%d). rsip_aesgcm256_test\n", ret); + Aes256_Gcm_multTst_rslt = 1; + } + } + + xSemaphoreGive(exit_semaph); + vTaskDelete(NULL); +} +#endif + +#if defined(WOLFSSL_AES_128) + +static int rsip_aesgcm128_test(int prnt, FSPSM_AES_PWKEY aes128_key) +{ + Aes enc[1]; + Aes dec[1]; + FSPSM_ST userContext; + word32 keySz = (word32)(128/8); + /* + * This is Test Case 16 from the document Galois/ + * Counter Mode of Operation (GCM) by McGrew and + * Viega. + */ + WOLFSSL_SMALL_STACK_STATIC const byte p[] = + { + 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5, + 0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a, + 0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda, + 0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72, + 0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53, + 0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25, + 0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57, + 0xba, 0x63, 0x7b, 0x39 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte t1[] = + { + 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68, + 0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b + }; + + /* The following is an interesting test case from the example + * FIPS test vectors for AES-GCM. IVlen = 1 byte */ + WOLFSSL_SMALL_STACK_STATIC const byte p3[] = + { + 0x57, 0xce, 0x45, 0x1f, 0xa5, 0xe2, 0x35, 0xa5, + 0x8e, 0x1a, 0xa2, 0x3b, 0x77, 0xcb, 0xaf, 0xe2 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte iv3[] = + { + 0xca + }; + + WOLFSSL_SMALL_STACK_STATIC const byte c3[] = + { + 0x6b, 0x5f, 0xb3, 0x9d, 0xc1, 0xc5, 0x7a, 0x4f, + 0xf3, 0x51, 0x4d, 0xc2, 0xd5, 0xf0, 0xd0, 0x07 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte a3[] = + { + 0x40, 0xfc, 0xdc, 0xd7, 0x4a, 0xd7, 0x8b, 0xf1, + 0x3e, 0x7c, 0x60, 0x55, 0x50, 0x51, 0xdd, 0x54 + }; + + WOLFSSL_SMALL_STACK_STATIC const byte t3[] = + { + 0x06, 0x90, 0xed, 0x01, 0x34, 0xdd, 0xc6, 0x95, + 0x31, 0x2e, 0x2a, 0xf9, 0x57, 0x7a, 0x1e, 0xa6 + }; + + byte resultT[sizeof(t1)]; + byte resultP[sizeof(p) + AES_BLOCK_SIZE]; + byte resultC[sizeof(p) + AES_BLOCK_SIZE]; + int result = 0; + int ret; + + (void) result; + + if (prnt) { + printf(" rsip_aes128_gcm_test() "); + } + + XMEMSET(resultT, 0, sizeof(resultT)); + XMEMSET(resultC, 0, sizeof(resultC)); + XMEMSET(resultP, 0, sizeof(resultP)); + XMEMSET(&userContext, 0, sizeof(FSPSM_ST)); + + if (wc_AesInit(enc, NULL, devId1) != 0) { + ret = -1; + goto out; + } + + if (wc_AesInit(dec, NULL, devId1) != 0) { + ret = -2; + goto out; + } + + wc_AesGcmSetKey(enc, (byte*)aes128_key, keySz); + if (result != 0) { + ret = -3; + goto out; + } + /* AES-GCM encrypt and decrypt both use AES encrypt internally */ + result = wc_AesGcmEncrypt(enc, resultC, p3, sizeof(p3), iv3, sizeof(iv3), + resultT, sizeof(t3), a3, sizeof(a3)); + if (result != 0) { + ret = -4; + goto out; + } + + + result = wc_AesGcmDecrypt(enc, resultP, resultC, sizeof(c3), + iv3, sizeof(iv3), resultT, sizeof(t3), a3, sizeof(a3)); + if (result != 0) { + ret = -5; + goto out; + } + if (XMEMCMP(p3, resultP, sizeof(p3))) { + ret = -6; + goto out; + } + + ret = 0; + + out: + wc_AesFree(enc); + wc_AesFree(dec); + + if (prnt) { + RESULT_STR(ret) + } + + return ret; +} + +static void tskAes128_Gcm_Test(void *pvParam) +{ + int ret = 0; + Info *p = (Info*)pvParam; + + while (exit_loop == 0) { + ret = rsip_aesgcm128_test(0, p->aes_key); + vTaskDelay(10/portTICK_PERIOD_MS); + if (ret != 0) { + printf(" result was not good(%d). rsip_aesgcm128_test\n", ret); + Aes128_Gcm_multTst_rslt = 1; + } + } + + xSemaphoreGive(exit_semaph); + vTaskDelete(NULL); +} + +#endif + +#if !defined(NO_RSA) + +/* testing rsa sign/verify w/ rsa 2048 bit key */ +#define TEST_STRING "Everyone gets Friday off." +#define TEST_STRING2 "Everyone gets Friday ofv." +#define TEST_STRING_SZ 25 +#define RSA_TEST_BYTES 256 /* up to 2048-bit key */ + +static int rsip_rsa_test(int prnt, int keySize) +{ + int ret = 0; + + RsaKey *key = (RsaKey *)XMALLOC(sizeof *key, NULL, DYNAMIC_TYPE_TMP_BUFFER); + WC_RNG rng; + const char inStr [] = TEST_STRING; + const char inStr2[] = TEST_STRING2; + const word32 inLen = (word32)TEST_STRING_SZ; + const word32 outSz = RSA_TEST_BYTES; + word32 out_actual_len = 0; + byte *in = NULL; + byte *in2 = NULL; + byte *out= NULL; + byte *out2 = NULL; + + in = (byte*)XMALLOC(inLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + in2 = (byte*)XMALLOC(inLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + out= (byte*)XMALLOC(outSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + out2 = (byte*)XMALLOC(outSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + if (key == NULL || in == NULL || out == NULL || + in2 == NULL || out2 == NULL) { + ret = -1; + goto out; + } + + XMEMSET(&rng, 0, sizeof(rng)); + XMEMSET(key, 0, sizeof *key); + XMEMCPY(in, inStr, inLen); + XMEMCPY(in2, inStr2, inLen); + XMEMSET(out, 0, outSz); + XMEMSET(out2, 0, outSz); + + ret = wc_InitRsaKey_ex(key, NULL, 7890/* fixed devid for TSIP/SCE*/); + if (ret != 0) { + goto out; + } + + if ((ret = wc_InitRng(&rng)) != 0) + goto out; + + if ((ret = wc_RsaSetRNG(key, &rng)) != 0) + goto out; + + /* Set Rsa Key created by RSIP in Advance */ + if ((ret = wc_MakeRsaKey(key, keySize, 65537, &rng)) != 0) { + goto out; + } + + ret = wc_RsaPublicEncrypt(in, inLen, out, outSz, key, &rng); + if (ret < 0) { + goto out; + } + + ret = wc_RsaPrivateDecrypt(out, (word32)(keySize/8), out2, outSz, key); + if (ret < 0) { + ret = -1; + goto out; + } + + if (XMEMCMP(in, out2, inLen) != 0) { + ret = -2; + goto out; + } + + ret = 0; +out: + if (key != NULL) { + wc_FreeRsaKey(key); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (in != NULL) { + XFREE(in, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (in2 != NULL) { + XFREE(in2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (out != NULL) { + XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (out2 != NULL) { + XFREE(out2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + + (void) prnt; + return ret; +} + +static int rsip_rsa_SignVerify_test(int prnt, int keySize) +{ + int ret = 0; + + RsaKey *key = (RsaKey *)XMALLOC(sizeof *key, NULL, DYNAMIC_TYPE_TMP_BUFFER); + WC_RNG rng; + word32 sigSz; + const char inStr [] = TEST_STRING; + const char inStr2[] = TEST_STRING2; + const word32 inLen = (word32)TEST_STRING_SZ; + const word32 outSz = RSA_TEST_BYTES; + + byte *in = NULL; + byte *in2 = NULL; + byte *out= NULL; + byte *plain = NULL; + + in = (byte*)XMALLOC(inLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + in2 = (byte*)XMALLOC(inLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + out= (byte*)XMALLOC(outSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + plain= (byte*)XMALLOC(outSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + (void) prnt; + + if (key == NULL || in == NULL || out == NULL || plain == NULL) { + ret = -1; + goto out; + } + + XMEMSET(&rng, 0, sizeof(rng)); + XMEMSET(key, 0, sizeof *key); + XMEMCPY(in, inStr, inLen); + XMEMCPY(in2, inStr2, inLen); + + ret = wc_InitRsaKey_ex(key, NULL, 7890/* fixed devid for TSIP/SCE*/); + if (ret != 0) { + goto out; + } + + if ((ret = wc_InitRng(&rng)) != 0) + goto out; + + if ((ret = wc_RsaSetRNG(key, &rng)) != 0) + goto out; + + /* make rsa key by SCE */ + if ((ret = wc_MakeRsaKey(key, keySize, 65537, &rng)) != 0) { + goto out; + } + + gCbInfo.keyflgs_crypt.bits.message_type = 0; + ret = wc_RsaSSL_Sign(in, inLen, out, outSz, key, &rng); + if (ret < 0) { + goto out; + } + sigSz = (word32)ret; + //* this should fail */ + ret = wc_RsaSSL_Verify(in2, inLen, out, (word32)(keySize/8), key); + if (ret != FSP_ERR_CRYPTO_RSIP_FAIL) { + ret = -1; + goto out; + } + /* this should succeed */ + ret = wc_RsaSSL_Verify(in, inLen, out, (word32)(keySize/8), key); + if (ret < 0) { + ret = -1; + goto out; + } + ret = 0; + out: + if (key != NULL) { + wc_FreeRsaKey(key); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (in != NULL) { + XFREE(in, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (in2 != NULL) { + XFREE(in2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (out != NULL) { + XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + + return ret; +} +#endif + + + +#ifndef NO_SHA256 + +void tskSha256_Test1(void *pvParam) +{ + int ret = 0; + (void)pvParam; + + while (exit_loop == 0) { + ret = sha256_test(); + vTaskDelay(10/portTICK_PERIOD_MS); + if (ret != 0) { + printf(" result was not good(%d). sha_test\n", ret); + sha256_multTst_rslt1 = 1; + } + } + + xSemaphoreGive(exit_semaph); + vTaskDelete(NULL); +} + +static void tskSha256_Test2(void *pvParam) +{ + int ret = 0; + (void)pvParam; + + while (exit_loop == 0) { + ret = sha256_test(); + vTaskDelay(10/portTICK_PERIOD_MS); + if (ret != 0) { + printf(" result was not good(%d). sha256_test\n", ret); + sha256_multTst_rslt2 = 1; + } + } + + xSemaphoreGive(exit_semaph); + vTaskDelete(NULL); +} +#endif + +int rsip_crypt_sha256_multitest() +{ + int ret = 0; + int num = 0; + int i; + BaseType_t xRet; + +#ifndef NO_SHA256 + num+=2; +#endif + exit_loop = 0; + sha256_multTst_rslt1 = 0; + sha256_multTst_rslt2 = 0; + + exit_semaph = xSemaphoreCreateCounting((UBaseType_t)num, 0); + xRet = pdPASS; + +#ifndef NO_SHA256 + xRet = xTaskCreate(tskSha256_Test1, "sha256_test1", + STACK_SIZE, NULL, 2, NULL); + if (xRet == pdPASS) + xRet = xTaskCreate(tskSha256_Test2, "sha256_test2", + STACK_SIZE, NULL, 3, NULL); +#endif + + if (xRet == pdPASS) { + printf(" Waiting for completing tasks ..."); + vTaskDelay(10000/portTICK_PERIOD_MS); + exit_loop = true; + + for (i = 0; i < num; i++) { + if(!xSemaphoreTake(exit_semaph, 2000/portTICK_PERIOD_MS)) { + printf("exit semaphore not released by test task"); + ret = -1; + xRet = pdFAIL; + } + } + } + + vSemaphoreDelete(exit_semaph); + + if ((xRet == pdPASS) && + (sha256_multTst_rslt1 == 0 && sha256_multTst_rslt2 == 0)) + ret = 0; + else + ret = -1; + + RESULT_STR(ret) + + return ret; +} + + +int rsip_crypt_AesCbc_multitest() +{ + int ret = 0; + int num = 0; + int i; + Info info_aes1; + Info info_aes2; + Info info_aes256_1; + Info info_aes256_2; + BaseType_t xRet; + +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) + num+=2; +#endif +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_256) + num+=2; +#endif + exit_loop = 0; + Aes128_Cbc_multTst_rslt = 0; + Aes256_Cbc_multTst_rslt = 0; + + exit_semaph = xSemaphoreCreateCounting((UBaseType_t)num, 0); + xRet = pdPASS; + +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) + XMEMCPY(&info_aes1.aes_key, &g_user_aes128_key_index1, + sizeof(FSPSM_AES_PWKEY)); + xRet = xTaskCreate(tskAes128_Cbc_Test, "aes_cbc_tes1t", + STACK_SIZE, &info_aes1, 3, NULL); +#endif +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) + XMEMCPY(&info_aes2.aes_key, &g_user_aes128_key_index2, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes128_Cbc_Test, "aes_cbc_test2", + STACK_SIZE, &info_aes2, 3, NULL); +#endif + +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_256) + XMEMCPY(&info_aes256_1.aes_key, &g_user_aes256_key_index1, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes256_Cbc_Test, "aes256_cbc_test1", + STACK_SIZE, &info_aes256_1, 3, NULL); +#endif +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_256) + XMEMCPY(&info_aes256_2.aes_key, &g_user_aes256_key_index2, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes256_Cbc_Test, "aes256_cbc_test2", + STACK_SIZE, &info_aes256_2, 3, NULL); +#endif + + if (xRet == pdPASS) { + printf(" Waiting for completing tasks ... "); + vTaskDelay(10000/portTICK_PERIOD_MS); + exit_loop = 1; + + for (i = 0; i < num; i++) { + if(!xSemaphoreTake(exit_semaph, 2000/portTICK_PERIOD_MS)) { + printf("exit semaphore not released by test task"); + ret = -1; + xRet = pdFAIL; + } + } + } + + vSemaphoreDelete(exit_semaph); + + if ((xRet == pdPASS) && + (Aes128_Cbc_multTst_rslt == 0 && Aes256_Cbc_multTst_rslt == 0)) + ret = 0; + else + ret = -1; + + RESULT_STR(ret) + + return ret; +} + + +int rsip_crypt_AesGcm_multitest() +{ + int ret = 0; + int num = 0; + int i; + Info info_aes1; + Info info_aes2; + Info info_aes256_1; + Info info_aes256_2; + BaseType_t xRet; + +#if defined(WOLFSSL_AES_128) + num+=2; +#endif +#if defined(WOLFSSL_AES_256) + num+=2; +#endif + + exit_loop = 0; + Aes128_Gcm_multTst_rslt = 0; + Aes256_Gcm_multTst_rslt = 0; + + exit_semaph = xSemaphoreCreateCounting((UBaseType_t)num, 0); + xRet = pdPASS; + +#if defined(WOLFSSL_AES_128) + XMEMCPY(&info_aes1.aes_key, &g_user_aes128_key_index1, + sizeof(FSPSM_AES_PWKEY)); + xTaskCreate(tskAes128_Gcm_Test, "aes128_gcm_test1", + STACK_SIZE, &info_aes1, 3, NULL); +#endif + +#if defined(WOLFSSL_AES_128) + XMEMCPY(&info_aes2.aes_key, &g_user_aes128_key_index2, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes128_Gcm_Test, "aes128_gcm_test2", + STACK_SIZE, &info_aes2, 3, NULL); +#endif + +#if defined(WOLFSSL_AES_256) + XMEMCPY(&info_aes256_1.aes_key, &g_user_aes256_key_index1, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes256_Gcm_Test, "aes256_gcm_test1", + STACK_SIZE, &info_aes256_1, 3, NULL); +#endif + +#if defined(WOLFSSL_AES_256) + XMEMCPY(&info_aes256_2.aes_key, &g_user_aes256_key_index2, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes256_Gcm_Test, "aes256_gcm_test2", + STACK_SIZE, &info_aes256_2, 3, NULL); +#endif + + if (xRet == pdPASS) { + printf(" Waiting for completing tasks ... "); + vTaskDelay(10000/portTICK_PERIOD_MS); + exit_loop = 1; + + for (i = 0; i < num; i++) { + if(!xSemaphoreTake(exit_semaph, 2000/portTICK_PERIOD_MS)) { + printf("exit semaphore not released by test task"); + ret = -1; + xRet = pdFAIL; + } + } + } + + vSemaphoreDelete(exit_semaph); + + if ((xRet == pdPASS) && + (Aes128_Gcm_multTst_rslt == 0 && Aes256_Gcm_multTst_rslt == 0)) + ret = 0; + else + ret = -1; + + RESULT_STR(ret) + + return ret; +} + +int rsip_crypt_Sha_AesCbcGcm_multitest() +{ + int ret = 0; + int num = 0; + int i; + Info info_aes128cbc; + Info info_aes128gcm; + Info info_aes256cbc; + Info info_aes256gcm; + BaseType_t xRet; + +#ifndef NO_SHA256 + num+=2; +#endif + +#if defined(WOLFSSL_AES_128) + num+=2; +#endif +#if defined(WOLFSSL_AES_256) + num+=2; +#endif + + exit_loop = 0; + sha256_multTst_rslt1 = 0; + sha256_multTst_rslt2 = 0; + Aes128_Cbc_multTst_rslt = 0; + Aes256_Cbc_multTst_rslt = 0; + Aes128_Gcm_multTst_rslt = 0; + Aes256_Gcm_multTst_rslt = 0; + + exit_semaph = xSemaphoreCreateCounting((UBaseType_t)num, 0); + xRet = pdPASS; + +#ifndef NO_SHA256 + xRet = xTaskCreate(tskSha256_Test1, "sha256_test1", + STACK_SIZE, NULL, 3, NULL); + + if (xRet == pdPASS) + xRet = xTaskCreate(tskSha256_Test2, "sha256_test2", + STACK_SIZE, NULL, 3, NULL); +#endif + +#if defined(WOLFSSL_AES_128) + XMEMCPY(&info_aes128cbc.aes_key, &g_user_aes128_key_index1, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes128_Cbc_Test, "aes128_cbc_test1", + STACK_SIZE, &info_aes128cbc, 3, NULL); +#endif + +#if defined(WOLFSSL_AES_128) + XMEMCPY(&info_aes128gcm.aes_key, &g_user_aes128_key_index2, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes128_Gcm_Test, "aes128_gcm_test2", + STACK_SIZE, &info_aes128gcm, 3, NULL); +#endif + +#if defined(WOLFSSL_AES_256) + XMEMCPY(&info_aes256cbc.aes_key, &g_user_aes256_key_index1, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes256_Cbc_Test, "aes256_cbc_test1", + STACK_SIZE, &info_aes256cbc, 3, NULL); +#endif + +#if defined(WOLFSSL_AES_256) + XMEMCPY(&info_aes256gcm.aes_key, &g_user_aes256_key_index2, + sizeof(FSPSM_AES_PWKEY)); + if (xRet == pdPASS) + xRet = xTaskCreate(tskAes256_Gcm_Test, "aes256_gcm_test2", + STACK_SIZE, &info_aes256gcm, 3, NULL); +#endif + + if (xRet == pdPASS) { + printf(" Waiting for completing tasks ... "); + vTaskDelay(10000/portTICK_PERIOD_MS); + exit_loop = 1; + + for (i = 0; i < num; i++) { + if(!xSemaphoreTake(exit_semaph, 2000/portTICK_PERIOD_MS)) { + printf("exit semaphore not released by test task"); + ret = -1; + xRet = pdFAIL; + } + } + } + + vSemaphoreDelete(exit_semaph); + + if ((xRet == pdPASS) && + (Aes128_Gcm_multTst_rslt == 0 && Aes256_Gcm_multTst_rslt == 0) && + (sha256_multTst_rslt1 == 0 && sha256_multTst_rslt2 == 0)) { + + ret = 0; + } + else { + ret = -1; + } + + RESULT_STR(ret) + + return ret; +} + +int rsip_crypt_test() +{ + int ret = 0; + fsp_err_t rsip_error_code = FSP_SUCCESS; + + /* Generate AES sce Key */ + + if (rsip_error_code == FSP_SUCCESS) { + #if defined(WOLFSSL_RENESAS_RSIP_CRYPTONLY) + /* set up Crypt Call back */ + Clr_CallbackCtx(&gCbInfo); + Clr_CallbackCtx(&gCbInfo_a); + + /* sets wrapped aes key */ + gCbInfo.wrapped_key_aes128 = g_user_aes128_key_index1; + gCbInfo.wrapped_key_aes256 = g_user_aes256_key_index1; + /* sets wrapped rsa key */ + gCbInfo.wrapped_key_rsapri1024 = g_user_rsa1024_private_key; + gCbInfo.wrapped_key_rsapub1024 = g_user_rsa1024_public_key; + gCbInfo.wrapped_key_rsapri2048 = g_user_rsa2048_private_key; + gCbInfo.wrapped_key_rsapub2048 = g_user_rsa2048_public_key; + + RSIP_KeyGeneration(&gCbInfo); + + /* Key generation for multi testing */ + gCbInfo_a.wrapped_key_aes128 = g_user_aes128_key_index2; + gCbInfo_a.wrapped_key_aes256 = g_user_aes256_key_index2; + RSIP_KeyGeneration(&gCbInfo_a); + + /* set callback ctx */ + ret = wc_CryptoCb_CryptInitRenesasCmn(NULL, &gCbInfo); + + if ( ret > 0) { + devId1 = ret; + ret = 0; + } + + if (ret == 0) { + printf(" rsip_rsa_test(512)(this will be done" + " by SW because RSIP doesn't support 512 bits key size.)"); + ret = rsip_rsa_test(1, 512); + RESULT_STR(ret) + } + + if (ret == 0) { + printf(" rsip_rsa_test(1024)"); + ret = rsip_rsa_test(1, 1024); + RESULT_STR(ret) + } + + if (ret == 0) { + printf(" rsip_rsa_test(2048)"); + ret = rsip_rsa_test(1, 2048); + RESULT_STR(ret) + } + + if (ret == 0) { + gCbInfo.hash_type = RSIP_HASH_TYPE_SHA256 ; + printf(" rsip_rsa_SignVerify_test(1024)"); + ret = rsip_rsa_SignVerify_test(1, 1024); + RESULT_STR(ret) + } + + if (ret == 0 && rsip_error_code == FSP_SUCCESS) { + printf(" rsip_rsa_SignVerify_test(2048)"); + ret = rsip_rsa_SignVerify_test(1, 2048); + RESULT_STR(ret) + } + + #endif /* WOLFSSL_RENESAS_RSIP_CRYPTONLY */ + + #ifndef NO_SHA256 + printf(" sha256_test()"); + ret = sha256_test(); + RESULT_STR(ret) + #endif + #ifdef WOLFSSL_SHA224 + printf(" sha224_test()"); + ret = sha224_test(); + RESULT_STR(ret) + #endif + #ifdef WOLFSSL_SHA384 + printf(" sha384_test()"); + ret = sha384_test(); + RESULT_STR(ret) + #endif + #ifdef WOLFSSL_SHA512 + printf(" sha512_test()"); + ret = sha512_test(); + RESULT_STR(ret) + #endif + + ret = rsip_aes128_cbc_test(1, g_user_aes128_key_index1); + + if (ret == 0) { + ret = rsip_aes256_cbc_test(1, g_user_aes256_key_index1); + } + + if (ret == 0) { + ret = rsip_aesgcm128_test(1, g_user_aes128_key_index1); + } + + if (ret == 0) { + ret = rsip_aesgcm256_test(1, g_user_aes256_key_index1); + } + + if (ret == 0) { + printf(" multi sha thread test\n"); + ret = rsip_crypt_sha256_multitest(); + } + + if (ret == 0) { + printf(" multi Aes cbc thread test\n"); + ret = rsip_crypt_AesCbc_multitest(); + } + + if (ret == 0) { + printf(" multi Aes Gcm thread test\n"); + ret = rsip_crypt_AesGcm_multitest(); + } + + if (ret == 0) { + printf("rsip_crypt_Sha_AesCbcGcm_multitest\n"); + ret = rsip_crypt_Sha_AesCbcGcm_multitest(); + } + + #if defined(WOLFSSL_RENESAS_RSIP_CRYPTONLY) + Clr_CallbackCtx(&gCbInfo); + Clr_CallbackCtx(&gCbInfo_a); + #endif + } + else + ret = -1; + + return ret; +} + +#endif /* WOLFSSL_RENESAS_RSIP */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfCrypt/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfCrypt/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfCrypt/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfCrypt/.gitignore 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfSSL/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfSSL/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfSSL/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfSSL/.gitignore 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfssl_dummy.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfssl_dummy.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfssl_dummy.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/Renesas/e2studio/RZN2L/test/src/wolfssl_dummy.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* wolfssl_dummy.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include + +#define YEAR 2023 +#define MON 9 + +static int tick = 0; + +time_t time(time_t *t) +{ + (void)t; + return ((YEAR-1970)*365+30*MON)*24*60*60 + tick++; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STARCORE/starcore_test.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STARCORE/starcore_test.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STARCORE/starcore_test.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STARCORE/starcore_test.c 2024-08-03 07:30:00.000000000 +0000 @@ -293,7 +293,7 @@ process_a_file(strcat(path, "AES_CBC_47242.json")); // Failed to allocate buffer large enough for file, fixed by chopping into smaller sections process_a_file(strcat(path, "AES_CCM_47247.json")); // Failed, increase stack/heap process_a_file(strcat(path, "AES_CCM_47247-part1.json")); // Failed to write out the entire response (got 104 of 370 tgId's in the response) - process_a_file(strcat(path, "AES_CCM_47247-part2.json")); // Failed ot write out the entire response (started at 371 and got to 429 of 741 tgId's in the response) looks like alloc failures, increase HEAP + process_a_file(strcat(path, "AES_CCM_47247-part2.json")); // Failed to write out the entire response (started at 371 and got to 429 of 741 tgId's in the response) looks like alloc failures, increase HEAP process_a_file(strcat(path, "DSA_keyGen_47253.json")); // Success process_a_file(strcat(path, "RSA_DecPrim_47306.json")); // Success process_a_file(strcat(path, "ECDSA_sigVer_47258.json")); // Success diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STARCORE/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STARCORE/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STARCORE/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STARCORE/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -39,7 +39,7 @@ #undef WOLFSSL_STARCORE #define WOLFSSL_STARCORE -/* Endianess */ +/* Endianness */ #undef BIG_ENDIAN_ORDER #define BIG_ENDIAN_ORDER @@ -204,7 +204,7 @@ #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ /* #undef FP_MAX_BITS_ECC */ /* #define FP_MAX_BITS_ECC (256 * 2) */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -31,7 +31,7 @@ 2. Under “Software Packs†choose “Select Componentsâ€. 3. Find and check all components for the wolfSSL.wolfSSL packs (wolfSSL / Core, wolfCrypt / Core and wolfCrypt / Test). Close 4. Under the “Software Packs†section click on “wolfSSL.wolfSSL†and configure the parameters. -5. For Cortex-M recommend “Math Configuration†-> “Single Precision Cortex-M Math†for the fastest option. +5. For Cortex-M recommend “Math Configuration†-> “Single Precision Cortex-M Math†for the fastest option. If seeing `error: r7 cannot be used in 'asm` add `-fomit-frame-pointer` to the CFLAGS. This only happens in debug builds, because r7 is used for debug. 6. Hit the "Generate Code" button 7. Open the project in STM32CubeIDE 8. The Benchmark example uses float. To enable go to "Project Properties" -> "C/C++ Build" -> "Settings" -> "Tool Settings" -> "MCU Settings" -> Check "Use float with printf". @@ -87,6 +87,7 @@ * To enable STM32L5 support define `WOLFSSL_STM32L5`. * To enable STM32H7 support define `WOLFSSL_STM32H7`. * To enable STM32WB support define `WOLFSSL_STM32WB`. +* To enable STM32WL support define `WOLFSSL_STM32WL`. * To enable STM32U5 support define `WOLFSSL_STM32U5`. * To enable STM32H5 support define `WOLFSSL_STM32H5`. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/STM32_Benchmarks.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/STM32_Benchmarks.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/STM32_Benchmarks.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/STM32_Benchmarks.md 2024-08-03 07:30:00.000000000 +0000 @@ -2,6 +2,7 @@ * [STM32H753ZI](#stm32h753zi) * [STM32WB55](#stm32wb55) +* [STM32WL55](#stm32wl55) * [STM32F437](#stm32f437) * [STM32L4A6Z](#stm32l4a6z) * [STM32L562E](#stm32l562e) @@ -10,6 +11,7 @@ * [STM32H563ZI](#stm32h563zi) * [STM32G071RB](#stm32g071rb) + ## STM32H753ZI Supports RNG, AES CBC/GCM and SHA-2 acceleration. @@ -57,6 +59,81 @@ Benchmark Test: Return code 0 ``` +### STM32H753ZI (-O2, Thumb2 ARM ASM, SP-ASM Cortex M small) + +Enable CPU I-Cache and D-Cache by calling: + +```c +SCB_EnableICache(); +SCB_EnableDCache(); +``` + +Build options for ARM ASM: + +```c +#define WOLFSSL_ARMASM +#define WOLFSSL_ARMASM_INLINE +#define WOLFSSL_ARMASM_NO_HW_CRYPTO +#define WOLFSSL_ARMASM_NO_NEON +#define WOLFSSL_ARM_ARCH 7 +``` + +``` +------------------------------------------------------------------------------ + wolfSSL version 5.6.6 +------------------------------------------------------------------------------ +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 6 MiB took 1.000 seconds, 6.079 MiB/s +AES-128-CBC-enc 17 MiB took 1.000 seconds, 17.261 MiB/s +AES-128-CBC-dec 17 MiB took 1.000 seconds, 16.748 MiB/s +AES-192-CBC-enc 15 MiB took 1.000 seconds, 14.575 MiB/s +AES-192-CBC-dec 14 MiB took 1.000 seconds, 14.209 MiB/s +AES-256-CBC-enc 13 MiB took 1.000 seconds, 12.622 MiB/s +AES-256-CBC-dec 12 MiB took 1.000 seconds, 12.378 MiB/s +AES-128-GCM-enc 8 MiB took 1.000 seconds, 8.374 MiB/s +AES-128-GCM-dec 8 MiB took 1.000 seconds, 8.374 MiB/s +AES-192-GCM-enc 8 MiB took 1.000 seconds, 7.690 MiB/s +AES-192-GCM-dec 8 MiB took 1.000 seconds, 7.690 MiB/s +AES-256-GCM-enc 7 MiB took 1.000 seconds, 7.129 MiB/s +AES-256-GCM-dec 7 MiB took 1.000 seconds, 7.104 MiB/s +AES-128-GCM-enc-no_AAD 8 MiB took 1.000 seconds, 8.472 MiB/s +AES-128-GCM-dec-no_AAD 8 MiB took 1.000 seconds, 8.472 MiB/s +AES-192-GCM-enc-no_AAD 8 MiB took 1.000 seconds, 7.764 MiB/s +AES-192-GCM-dec-no_AAD 8 MiB took 1.000 seconds, 7.715 MiB/s +AES-256-GCM-enc-no_AAD 7 MiB took 1.000 seconds, 7.153 MiB/s +AES-256-GCM-dec-no_AAD 7 MiB took 1.000 seconds, 7.153 MiB/s +GMAC Table 4-bit 17 MiB took 1.000 seconds, 16.617 MiB/s +CHACHA 29 MiB took 1.000 seconds, 28.662 MiB/s +CHA-POLY 19 MiB took 1.000 seconds, 18.848 MiB/s +POLY1305 90 MiB took 1.000 seconds, 89.771 MiB/s +SHA-224 18 MiB took 1.000 seconds, 18.042 MiB/s +SHA-256 18 MiB took 1.000 seconds, 18.042 MiB/s +SHA-384 8 MiB took 1.000 seconds, 7.544 MiB/s +SHA-512 8 MiB took 1.000 seconds, 7.568 MiB/s +SHA-512/224 8 MiB took 1.000 seconds, 7.544 MiB/s +SHA-512/256 8 MiB took 1.000 seconds, 7.520 MiB/s +HMAC-SHA224 18 MiB took 1.000 seconds, 17.896 MiB/s +HMAC-SHA256 18 MiB took 1.000 seconds, 17.896 MiB/s +HMAC-SHA384 7 MiB took 1.000 seconds, 7.373 MiB/s +HMAC-SHA512 7 MiB took 1.000 seconds, 7.397 MiB/s +RSA 2048 public 508 ops took 1.000 sec, avg 1.969 ms, 508.000 ops/sec +RSA 2048 private 14 ops took 1.020 sec, avg 72.857 ms, 13.725 ops/sec +DH 2048 key gen 30 ops took 1.012 sec, avg 33.733 ms, 29.644 ops/sec +DH 2048 agree 30 ops took 1.012 sec, avg 33.733 ms, 29.644 ops/sec +ECC [ SECP256R1] 256 key gen 982 ops took 1.000 sec, avg 1.018 ms, 982.000 ops/sec +ECDHE [ SECP256R1] 256 agree 456 ops took 1.000 sec, avg 2.193 ms, 456.000 ops/sec +ECDSA [ SECP256R1] 256 sign 520 ops took 1.000 sec, avg 1.923 ms, 520.000 ops/sec +ECDSA [ SECP256R1] 256 verify 288 ops took 1.004 sec, avg 3.486 ms, 286.853 ops/sec +CURVE 25519 key gen 1112 ops took 1.000 sec, avg 0.899 ms, 1112.000 ops/sec +CURVE 25519 agree 1144 ops took 1.000 sec, avg 0.874 ms, 1144.000 ops/sec +ED 25519 key gen 2358 ops took 1.000 sec, avg 0.424 ms, 2358.000 ops/sec +ED 25519 sign 1716 ops took 1.000 sec, avg 0.583 ms, 1716.000 ops/sec +ED 25519 verify 862 ops took 1.000 sec, avg 1.160 ms, 862.000 ops/sec +Benchmark complete +Benchmark Test: Return code 0 +``` + + ### STM32H753ZI (No HW Crypto, -Os, FastMath) ``` @@ -94,6 +171,7 @@ Benchmark Test: Return code 0 ``` + ## STM32WB55 Supports RNG, ECC P-256, AES-CBC and SHA-256 acceleration. @@ -211,6 +289,86 @@ Benchmark Test: Return code 0 ``` + +## STM32WL55 + +Supports RNG, ECC P-256 and AES-CBC acceleration. +Note: SP math beats PKA HW. HW RNG on for all tests + +Board: NUCLEO-WL55JC1 (MB1389-HIGHBAND-E02) +CPU: Cortex-M4 at 64 MHz +IDE: STM32CubeIDE +RTOS: Bare-Metal + +### STM32WL55 (STM AES-CBC Acceleration, -Os, SP-ASM Cortex-M WOLF_CONF_MATH=4) + +``` +------------------------------------------------------------------------------ + wolfSSL version 5.6.4 +------------------------------------------------------------------------------ +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 200 KiB took 1.012 seconds, 197.628 KiB/s +AES-128-CBC-enc 2 MiB took 1.000 seconds, 2.246 MiB/s +AES-128-CBC-dec 2 MiB took 1.004 seconds, 2.213 MiB/s +AES-256-CBC-enc 2 MiB took 1.008 seconds, 2.228 MiB/s +AES-256-CBC-dec 2 MiB took 1.000 seconds, 2.197 MiB/s +SHA-256 600 KiB took 1.000 seconds, 600.000 KiB/s +HMAC-SHA256 600 KiB took 1.012 seconds, 592.885 KiB/s +ECC [ SECP256R1] 256 key gen 56 ops took 1.023 sec, avg 18.268 ms, 54.741 ops/sec +ECDHE [ SECP256R1] 256 agree 26 ops took 1.024 sec, avg 39.385 ms, 25.391 ops/sec +ECDSA [ SECP256R1] 256 sign 30 ops took 1.019 sec, avg 33.967 ms, 29.441 ops/sec +ECDSA [ SECP256R1] 256 verify 18 ops took 1.098 sec, avg 61.000 ms, 16.393 ops/sec +Benchmark complete +Benchmark Test: Return code 0 +``` + +### STM32WL55 (STM AES-CBC Acceleration and PKA ECC, -Os) + +``` +------------------------------------------------------------------------------ + wolfSSL version 5.6.4 +------------------------------------------------------------------------------ +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 200 KiB took 1.000 seconds, 200.000 KiB/s +AES-128-CBC-enc 2 MiB took 1.000 seconds, 2.295 MiB/s +AES-128-CBC-dec 2 MiB took 1.007 seconds, 2.279 MiB/s +AES-256-CBC-enc 2 MiB took 1.000 seconds, 2.295 MiB/s +AES-256-CBC-dec 2 MiB took 1.008 seconds, 2.252 MiB/s +SHA-256 575 KiB took 1.043 seconds, 551.294 KiB/s +HMAC-SHA256 550 KiB took 1.000 seconds, 550.000 KiB/s +ECC [ SECP256R1] 256 key gen 4 ops took 1.172 sec, avg 293.000 ms, 3.413 ops/sec +ECDHE [ SECP256R1] 256 agree 4 ops took 1.165 sec, avg 291.250 ms, 3.433 ops/sec +ECDSA [ SECP256R1] 256 sign 10 ops took 1.070 sec, avg 107.000 ms, 9.346 ops/sec +ECDSA [ SECP256R1] 256 verify 6 ops took 1.275 sec, avg 212.500 ms, 4.706 ops/sec +Benchmark complete +Benchmark Test: Return code 0 +``` + +### STM32WL55 (No HW Crypto, -Os, SP Math All (WOLF_CONF_MATH=6)) + +``` +------------------------------------------------------------------------------ + wolfSSL version 5.6.4 +------------------------------------------------------------------------------ +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 200 KiB took 1.015 seconds, 197.044 KiB/s +AES-128-CBC-enc 400 KiB took 1.004 seconds, 398.406 KiB/s +AES-128-CBC-dec 400 KiB took 1.000 seconds, 400.000 KiB/s +AES-192-CBC-enc 350 KiB took 1.031 seconds, 339.476 KiB/s +AES-192-CBC-dec 350 KiB took 1.028 seconds, 340.467 KiB/s +AES-256-CBC-enc 300 KiB took 1.007 seconds, 297.915 KiB/s +AES-256-CBC-dec 300 KiB took 1.004 seconds, 298.805 KiB/s +SHA-256 550 KiB took 1.016 seconds, 541.339 KiB/s +HMAC-SHA256 550 KiB took 1.024 seconds, 537.109 KiB/s +ECC [ SECP256R1] 256 key gen 4 ops took 1.180 sec, avg 295.000 ms, 3.390 ops/sec +ECDHE [ SECP256R1] 256 agree 4 ops took 1.181 sec, avg 295.250 ms, 3.387 ops/sec +ECDSA [ SECP256R1] 256 sign 4 ops took 1.306 sec, avg 326.500 ms, 3.063 ops/sec +ECDSA [ SECP256R1] 256 verify 2 ops took 1.188 sec, avg 594.000 ms, 1.684 ops/sec +Benchmark complete +Benchmark Test: Return code 0 +``` + + ## STM32F437 Supports RNG, AES-CBC/GCM and SHA-256 acceleration. @@ -295,6 +453,7 @@ Benchmark Test: Return code 0 ``` + ## STM32L4A6Z Supports RNG, AES-CBC/GCM and SHA-256 acceleration. @@ -304,77 +463,136 @@ CPU: Cortex-M4 at 80 MHz IDE: STM32CubeIDE RTOS: FreeRTOS +Compiler: GCC with -Os -### STM32L4A6Z (STM Crypto/Hash Acceleration, -Os, SP-ASM Cortex-M) +### STM32L4A6Z (STM Crypto/Hash Acceleration, SP-ASM Cortex-M Small and ARM ASM Thumb speedups) +Build options used: -``` ------------------------------------------------------------------------------- - wolfSSL version 4.4.1 ------------------------------------------------------------------------------- -wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) -RNG 250 KB took 1.083 seconds, 230.840 KB/s -AES-128-CBC-enc 4 MB took 1.000 seconds, 4.175 MB/s -AES-128-CBC-dec 3 MB took 1.000 seconds, 3.442 MB/s -AES-256-CBC-enc 3 MB took 1.000 seconds, 3.247 MB/s -AES-256-CBC-dec 3 MB took 1.008 seconds, 2.664 MB/s -AES-128-GCM-enc 4 MB took 1.000 seconds, 3.589 MB/s -AES-128-GCM-dec 4 MB took 1.004 seconds, 3.575 MB/s -AES-256-GCM-enc 3 MB took 1.004 seconds, 2.869 MB/s -AES-256-GCM-dec 3 MB took 1.000 seconds, 2.856 MB/s -CHACHA 2 MB took 1.008 seconds, 2.010 MB/s -CHA-POLY 1 MB took 1.004 seconds, 1.337 MB/s -POLY1305 6 MB took 1.000 seconds, 6.030 MB/s -SHA-256 4 MB took 1.004 seconds, 3.623 MB/s -HMAC-SHA256 4 MB took 1.000 seconds, 3.540 MB/s -RSA 2048 public 36 ops took 1.020 sec, avg 28.333 ms, 35.294 ops/sec -RSA 2048 private 2 ops took 2.031 sec, avg 1015.500 ms, 0.985 ops/sec -DH 2048 key gen 3 ops took 1.353 sec, avg 451.000 ms, 2.217 ops/sec -DH 2048 agree 4 ops took 1.804 sec, avg 451.000 ms, 2.217 ops/sec -ECC 256 key gen 33 ops took 1.011 sec, avg 30.636 ms, 32.641 ops/sec -ECDHE 256 agree 16 ops took 1.078 sec, avg 67.375 ms, 14.842 ops/sec -ECDSA 256 sign 24 ops took 1.012 sec, avg 42.167 ms, 23.715 ops/sec -ECDSA 256 verify 12 ops took 1.165 sec, avg 97.083 ms, 10.300 ops/sec +```c +#define WOLFSSL_HAVE_SP_ECC +#define WOLFSSL_SP_ARM_CORTEX_M_ASM +#define WOLFSSL_SP_384 +#define WOLFSSL_SP_SMALL +#define WOLFSSL_SP_NO_MALLOC + +#define WOLFSSL_ARMASM +#define WOLFSSL_ARMASM_INLINE +#define WOLFSSL_ARMASM_NO_HW_CRYPTO +#define WOLFSSL_ARMASM_NO_NEON +#define WOLFSSL_ARM_ARCH 7 +``` + +``` +------------------------------------------------------------------------------ + wolfSSL version 5.6.4 +------------------------------------------------------------------------------ +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 225 KiB took 1.078 seconds, 208.720 KiB/s +AES-128-CBC-enc 4 MiB took 1.000 seconds, 4.150 MiB/s +AES-128-CBC-dec 3 MiB took 1.004 seconds, 3.234 MiB/s +AES-256-CBC-enc 3 MiB took 1.000 seconds, 3.247 MiB/s +AES-256-CBC-dec 3 MiB took 1.008 seconds, 2.543 MiB/s +AES-128-GCM-enc 4 MiB took 1.000 seconds, 3.687 MiB/s +AES-128-GCM-dec 4 MiB took 1.000 seconds, 3.638 MiB/s +AES-256-GCM-enc 3 MiB took 1.000 seconds, 2.930 MiB/s +AES-256-GCM-dec 3 MiB took 1.004 seconds, 2.894 MiB/s +AES-128-GCM-enc-no_AAD 4 MiB took 1.000 seconds, 3.687 MiB/s +AES-128-GCM-dec-no_AAD 4 MiB took 1.000 seconds, 3.662 MiB/s +AES-256-GCM-enc-no_AAD 3 MiB took 1.003 seconds, 2.945 MiB/s +AES-256-GCM-dec-no_AAD 3 MiB took 1.004 seconds, 2.918 MiB/s +GMAC Table 4-bit 952 KiB took 1.000 seconds, 952.000 KiB/s +CHACHA 3 MiB took 1.004 seconds, 2.894 MiB/s +CHA-POLY 2 MiB took 1.004 seconds, 1.775 MiB/s +POLY1305 7 MiB took 1.000 seconds, 7.227 MiB/s +SHA-256 7 MiB took 1.000 seconds, 7.104 MiB/s +SHA-512 350 KiB took 1.036 seconds, 337.838 KiB/s +SHA-512/224 350 KiB took 1.035 seconds, 338.164 KiB/s +SHA-512/256 350 KiB took 1.035 seconds, 338.164 KiB/s +HMAC-SHA256 7 MiB took 1.000 seconds, 6.763 MiB/s +HMAC-SHA512 350 KiB took 1.047 seconds, 334.288 KiB/s +RSA 2048 public 36 ops took 1.008 sec, avg 28.000 ms, 35.714 ops/sec +RSA 2048 private 2 ops took 2.016 sec, avg 1008.000 ms, 0.992 ops/sec +DH 2048 key gen 3 ops took 1.416 sec, avg 472.000 ms, 2.119 ops/sec +DH 2048 agree 4 ops took 1.890 sec, avg 472.500 ms, 2.116 ops/sec +ECC [ SECP256R1] 256 key gen 32 ops took 1.000 sec, avg 31.250 ms, 32.000 ops/sec +ECDHE [ SECP256R1] 256 agree 16 ops took 1.101 sec, avg 68.812 ms, 14.532 ops/sec +ECDSA [ SECP256R1] 256 sign 24 ops took 1.020 sec, avg 42.500 ms, 23.529 ops/sec +ECDSA [ SECP256R1] 256 verify 12 ops took 1.133 sec, avg 94.417 ms, 10.591 ops/sec +ECC [ SECP384R1] 384 key gen 10 ops took 1.232 sec, avg 123.200 ms, 8.117 ops/sec +ECDHE [ SECP384R1] 384 agree 4 ops took 1.063 sec, avg 265.750 ms, 3.763 ops/sec +ECDSA [ SECP384R1] 384 sign 8 ops took 1.223 sec, avg 152.875 ms, 6.541 ops/sec +ECDSA [ SECP384R1] 384 verify 4 ops took 1.388 sec, avg 347.000 ms, 2.882 ops/sec +CURVE 25519 key gen 32 ops took 1.023 sec, avg 31.969 ms, 31.281 ops/sec +CURVE 25519 agree 32 ops took 1.012 sec, avg 31.625 ms, 31.621 ops/sec +ED 25519 key gen 80 ops took 1.008 sec, avg 12.600 ms, 79.365 ops/sec +ED 25519 sign 64 ops took 1.027 sec, avg 16.047 ms, 62.317 ops/sec +ED 25519 verify 28 ops took 1.024 sec, avg 36.571 ms, 27.344 ops/sec +Benchmark complete +Benchmark Test: Return code 0 +``` + +### STM32L4A6Z (No HW Crypto, SP Math All (sp_int.c) NO ASM) + +``` +#define WOLFSSL_SP_MATH_ALL +#define WOLFSSL_SP_SMALL +#define WOLFSSL_NO_ASM +#define WOLFSSL_SP_NO_MALLOC +#define CURVED25519_SMALL +``` + +``` +------------------------------------------------------------------------------ + wolfSSL version 5.6.4 +------------------------------------------------------------------------------ +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 325 KiB took 1.059 seconds, 306.893 KiB/s +AES-128-CBC-enc 425 KiB took 1.000 seconds, 425.000 KiB/s +AES-128-CBC-dec 450 KiB took 1.028 seconds, 437.743 KiB/s +AES-192-CBC-enc 375 KiB took 1.035 seconds, 362.319 KiB/s +AES-192-CBC-dec 375 KiB took 1.015 seconds, 369.458 KiB/s +AES-256-CBC-enc 325 KiB took 1.032 seconds, 314.922 KiB/s +AES-256-CBC-dec 325 KiB took 1.004 seconds, 323.705 KiB/s +AES-128-GCM-enc 325 KiB took 1.063 seconds, 305.738 KiB/s +AES-128-GCM-dec 325 KiB took 1.066 seconds, 304.878 KiB/s +AES-192-GCM-enc 275 KiB took 1.020 seconds, 269.608 KiB/s +AES-192-GCM-dec 275 KiB took 1.015 seconds, 270.936 KiB/s +AES-256-GCM-enc 250 KiB took 1.028 seconds, 243.191 KiB/s +AES-256-GCM-dec 250 KiB took 1.027 seconds, 243.427 KiB/s +AES-128-GCM-enc-no_AAD 325 KiB took 1.059 seconds, 306.893 KiB/s +AES-128-GCM-dec-no_AAD 325 KiB took 1.062 seconds, 306.026 KiB/s +AES-192-GCM-enc-no_AAD 275 KiB took 1.012 seconds, 271.739 KiB/s +AES-192-GCM-dec-no_AAD 275 KiB took 1.015 seconds, 270.936 KiB/s +AES-256-GCM-enc-no_AAD 250 KiB took 1.020 seconds, 245.098 KiB/s +AES-256-GCM-dec-no_AAD 250 KiB took 1.023 seconds, 244.379 KiB/s +GMAC Table 4-bit 1 MiB took 1.000 seconds, 1.064 MiB/s +CHACHA 3 MiB took 1.000 seconds, 2.832 MiB/s +CHA-POLY 2 MiB took 1.004 seconds, 1.751 MiB/s +POLY1305 7 MiB took 1.000 seconds, 7.104 MiB/s +SHA-256 850 KiB took 1.003 seconds, 847.458 KiB/s +SHA-512 350 KiB took 1.036 seconds, 337.838 KiB/s +SHA-512/224 350 KiB took 1.035 seconds, 338.164 KiB/s +SHA-512/256 350 KiB took 1.035 seconds, 338.164 KiB/s +HMAC-SHA256 850 KiB took 1.012 seconds, 839.921 KiB/s +HMAC-SHA512 350 KiB took 1.051 seconds, 333.016 KiB/s +RSA 2048 public 24 ops took 1.067 sec, avg 44.458 ms, 22.493 ops/sec +RSA 2048 private 2 ops took 5.643 sec, avg 2821.500 ms, 0.354 ops/sec +DH 2048 key gen 2 ops took 1.078 sec, avg 539.000 ms, 1.855 ops/sec +DH 2048 agree 2 ops took 2.455 sec, avg 1227.500 ms, 0.815 ops/sec +ECC [ SECP256R1] 256 key gen 4 ops took 1.808 sec, avg 452.000 ms, 2.212 ops/sec +ECDHE [ SECP256R1] 256 agree 4 ops took 1.807 sec, avg 451.750 ms, 2.214 ops/sec +ECDSA [ SECP256R1] 256 sign 4 ops took 1.828 sec, avg 457.000 ms, 2.188 ops/sec +ECDSA [ SECP256R1] 256 verify 4 ops took 1.224 sec, avg 306.000 ms, 3.268 ops/sec +CURVE 25519 key gen 2 ops took 1.392 sec, avg 696.000 ms, 1.437 ops/sec +CURVE 25519 agree 2 ops took 1.384 sec, avg 692.000 ms, 1.445 ops/sec +ED 25519 key gen 2 ops took 1.412 sec, avg 706.000 ms, 1.416 ops/sec +ED 25519 sign 2 ops took 1.435 sec, avg 717.500 ms, 1.394 ops/sec +ED 25519 verify 2 ops took 2.949 sec, avg 1474.500 ms, 0.678 ops/sec Benchmark complete Benchmark Test: Return code 0 ``` -### STM32L4A6Z (No HW Crypto, -Os, FastMath) - -``` ------------------------------------------------------------------------------- - wolfSSL version 4.4.1 ------------------------------------------------------------------------------- -wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) -RNG 450 KB took 1.048 seconds, 429.389 KB/s -AES-128-CBC-enc 625 KB took 1.008 seconds, 620.040 KB/s -AES-128-CBC-dec 675 KB took 1.008 seconds, 669.643 KB/s -AES-192-CBC-enc 550 KB took 1.023 seconds, 537.634 KB/s -AES-192-CBC-dec 575 KB took 1.012 seconds, 568.182 KB/s -AES-256-CBC-enc 475 KB took 1.004 seconds, 473.108 KB/s -AES-256-CBC-dec 500 KB took 1.008 seconds, 496.032 KB/s -AES-128-GCM-enc 50 KB took 1.440 seconds, 34.722 KB/s -AES-128-GCM-dec 50 KB took 1.435 seconds, 34.843 KB/s -AES-192-GCM-enc 50 KB took 1.466 seconds, 34.106 KB/s -AES-192-GCM-dec 50 KB took 1.463 seconds, 34.176 KB/s -AES-256-GCM-enc 50 KB took 1.482 seconds, 33.738 KB/s -AES-256-GCM-dec 50 KB took 1.478 seconds, 33.829 KB/s -CHACHA 2 MB took 1.008 seconds, 2.010 MB/s -CHA-POLY 1 MB took 1.008 seconds, 1.332 MB/s -POLY1305 6 MB took 1.000 seconds, 6.006 MB/s -SHA-256 1 MB took 1.000 seconds, 1.123 MB/s -HMAC-SHA256 1 MB took 1.008 seconds, 1.114 MB/s -RSA 2048 public 16 ops took 1.028 sec, avg 64.250 ms, 15.564 ops/sec -RSA 2048 private 2 ops took 7.491 sec, avg 3745.500 ms, 0.267 ops/sec -DH 2048 key gen 2 ops took 1.440 sec, avg 720.000 ms, 1.389 ops/sec -DH 2048 agree 2 ops took 2.882 sec, avg 1441.000 ms, 0.694 ops/sec -ECC 256 key gen 2 ops took 1.918 sec, avg 959.000 ms, 1.043 ops/sec -ECDHE 256 agree 2 ops took 1.914 sec, avg 957.000 ms, 1.045 ops/sec -ECDSA 256 sign 2 ops took 1.941 sec, avg 970.500 ms, 1.030 ops/sec -ECDSA 256 verify 2 ops took 1.294 sec, avg 647.000 ms, 1.546 ops/sec -Benchmark complete -Benchmark Test: Return code 0 -``` ## STM32L562E @@ -489,6 +707,7 @@ Benchmark Test: Return code 0 ``` + ## STM32F777 Supports RNG, AES-CBC/GCM and SHA-256 acceleration. @@ -573,6 +792,7 @@ Benchmark Test: Return code 0 ``` + ## STM32U585 Supports RNG, AES CBC/GCM and SHA-1,SHA-2 acceleration. @@ -711,6 +931,7 @@ Benchmark Test: Return code 0 ``` + ## STM32H563ZI Cortex-M33 at 150MHz diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/default_conf.ftl mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/default_conf.ftl --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/default_conf.ftl 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/default_conf.ftl 2024-08-03 07:30:00.000000000 +0000 @@ -33,9 +33,9 @@ [#list SWIPdatas as SWIP] [#-- Global variables --] [#if SWIP.variables??] - [#list SWIP.variables as variable] + [#list SWIP.variables as variable] extern ${variable.value} ${variable.name}; - [/#list] + [/#list] [/#if] [#-- Global variables --] @@ -45,16 +45,16 @@ [#assign version = SWIP.version] /** - MiddleWare name : ${instName} - MiddleWare fileName : ${fileName} - MiddleWare version : ${version} + MiddleWare name : ${instName} + MiddleWare fileName : ${fileName} + MiddleWare version : ${version} */ [#if SWIP.defines??] - [#list SWIP.defines as definition] + [#list SWIP.defines as definition] /*---------- [#if definition.comments??]${definition.comments}[/#if] -----------*/ #define ${definition.name} #t#t ${definition.value} [#if definition.description??]${definition.description} [/#if] - [/#list] + [/#list] [/#if] @@ -76,6 +76,11 @@ #define WOLFSSL_STM32_PKA #undef NO_STM32_CRYPTO #define HAL_CONSOLE_UART huart1 +#elif defined(STM32WL55xx) + #define WOLFSSL_STM32WL + #define WOLFSSL_STM32_PKA + #undef NO_STM32_CRYPTO + #define HAL_CONSOLE_UART huart2 #elif defined(STM32F407xx) #define WOLFSSL_STM32F4 #define HAL_CONSOLE_UART huart2 @@ -102,7 +107,7 @@ #undef NO_STM32_HASH #undef NO_STM32_CRYPTO #define HAL_CONSOLE_UART huart3 -#elif defined(STM32H723xx) +#elif defined(STM32H723xx) || defined(STM32H725xx) #define WOLFSSL_STM32H7 #define HAL_CONSOLE_UART huart3 #elif defined(STM32L4A6xx) @@ -177,7 +182,8 @@ //#define NO_STM32_RNG //#undef NO_STM32_HASH //#undef NO_STM32_CRYPTO - //#define WOLFSSL_GENSEED_FORTEST /* if no HW RNG is available use test seed */ + /* if no HW RNG is available use test seed */ + //#define WOLFSSL_GENSEED_FORTEST //#define STM32_HAL_V2 #endif @@ -207,19 +213,28 @@ /* ------------------------------------------------------------------------- */ /* Math Configuration */ /* ------------------------------------------------------------------------- */ -/* 1=Fast (stack) - * 2=Normal (heap) - * 3=Single Precision C (only common curves/key sizes) - * 4=Single Precision ASM Cortex-M3+ - * 5=Single Precision ASM Cortex-M0 (Generic Thumb) - * 6=Single Precision C all small - * 7=Single Precision C all big +/* 1=Fast (stack) (tfm.c) + * 2=Normal (heap) (integer.c) + * 3-5=Single Precision: only common curves/key sizes: + * (ECC 256/384/521 and RSA/DH 2048/3072/4096) + * 3=Single Precision C (sp_c32.c) + * 4=Single Precision ASM Cortex-M3+ (sp_cortexm.c) + * 5=Single Precision ASM Cortex-M0 (sp_armthumb.c) + * 6=Wolf multi-precision C small (sp_int.c) + * 7=Wolf multi-precision C big (sp_int.c) */ + #if defined(WOLF_CONF_MATH) && WOLF_CONF_MATH == 1 /* fast (stack) math - tfm.c */ #define USE_FAST_MATH #define TFM_TIMING_RESISTANT + #if !defined(NO_RSA) || !defined(NO_DH) + /* Maximum math bits (Max DH/RSA key bits * 2) */ + #undef FP_MAX_BITS + #define FP_MAX_BITS 4096 + #endif + /* Optimizations (TFM_ARM, TFM_ASM or none) */ //#define TFM_NO_ASM //#define TFM_ASM @@ -234,22 +249,29 @@ #endif #if defined(WOLF_CONF_RSA) && WOLF_CONF_RSA == 1 #define WOLFSSL_HAVE_SP_RSA + //#define WOLFSSL_SP_NO_2048 + //#define WOLFSSL_SP_NO_3072 + //#define WOLFSSL_SP_4096 #endif #if defined(WOLF_CONF_DH) && WOLF_CONF_DH == 1 #define WOLFSSL_HAVE_SP_DH #endif #if defined(WOLF_CONF_ECC) && WOLF_CONF_ECC == 1 #define WOLFSSL_HAVE_SP_ECC + //#define WOLFSSL_SP_NO_256 + //#define WOLFSSL_SP_384 + //#define WOLFSSL_SP_521 #endif #if WOLF_CONF_MATH == 6 || WOLF_CONF_MATH == 7 + #define WOLFSSL_SP_MATH_ALL /* use sp_int.c multi precision math */ + //#define WOLFSSL_SP_ARM_THUMB /* enable ARM Thumb ASM speedups */ + #else #define WOLFSSL_SP_MATH /* disable non-standard curves / key sizes */ #endif - #define SP_WORD_SIZE 32 + #define SP_WORD_SIZE 32 /* force 32-bit mode */ /* Enable to put all math on stack (no heap) */ //#define WOLFSSL_SP_NO_MALLOC - /* Enable for SP cache resistance (not usually enabled for embedded micros) */ - //#define WOLFSSL_SP_CACHE_RESISTANT #if WOLF_CONF_MATH == 4 || WOLF_CONF_MATH == 5 #define WOLFSSL_SP_ASM /* required if using the ASM versions */ @@ -273,6 +295,8 @@ #define HAVE_SUPPORTED_CURVES #define HAVE_ENCRYPT_THEN_MAC #define HAVE_EXTENDED_MASTER +#define WOLFSSL_ASN_TEMPLATE +#define HAVE_SNI #if defined(WOLF_CONF_TLS13) && WOLF_CONF_TLS13 == 1 #define WOLFSSL_TLS13 @@ -325,12 +349,6 @@ /* RSA */ #undef NO_RSA #if defined(WOLF_CONF_RSA) && WOLF_CONF_RSA == 1 - #ifdef USE_FAST_MATH - /* Maximum math bits (Max RSA key bits * 2) */ - #undef FP_MAX_BITS - #define FP_MAX_BITS 4096 - #endif - /* half as much memory but twice as slow */ #undef RSA_LOW_MEM //#define RSA_LOW_MEM @@ -384,8 +402,8 @@ //#define HAVE_COMP_KEY #ifdef USE_FAST_MATH - #ifdef NO_RSA - /* Custom fastmath size if not using RSA */ + #if defined(NO_RSA) && defined(NO_DH) + /* Custom fastmath size if not using RSA/DH */ /* MAX = ROUND32(ECC BITS) * 2 */ #define FP_MAX_BITS (256 * 2) #else @@ -426,6 +444,7 @@ #endif /* Other possible AES modes */ +//#define WOLFSSL_AES_CFB /* Used by TPM parameter encryption */ //#define WOLFSSL_AES_COUNTER //#define HAVE_AESCCM //#define WOLFSSL_AES_XTS @@ -505,12 +524,12 @@ /* Sha3 */ #undef WOLFSSL_SHA3 #if defined(WOLF_CONF_SHA3) && WOLF_CONF_SHA3 == 1 - #define WOLFSSL_SHA3 + #define WOLFSSL_SHA3 #endif /* MD5 */ #if defined(WOLF_CONF_MD5) && WOLF_CONF_MD5 == 1 - /* enabled */ + /* enabled */ #else #define NO_MD5 #endif @@ -535,8 +554,8 @@ #if 0 #define USE_WOLFSSL_MEMORY #define WOLFSSL_TRACK_MEMORY - #define WOLFSSL_DEBUG_MEMORY - #define WOLFSSL_DEBUG_MEMORY_PRINT + #define WOLFSSL_DEBUG_MEMORY + #define WOLFSSL_DEBUG_MEMORY_PRINT #endif #else //#define NO_WOLFSSL_MEMORY @@ -594,6 +613,8 @@ #define NO_RC4 #define NO_MD4 #define NO_DES3 +#define WOLFSSL_NO_SHAKE128 +#define WOLFSSL_NO_SHAKE256 /* In-lining of misc.c functions */ /* If defined, must include wolfcrypt/src/misc.c in build */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/main.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/main.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/STM32Cube/main.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/STM32Cube/main.c 2024-08-03 07:30:00.000000000 +0000 @@ -142,7 +142,7 @@ */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - /** Initializes the CPU, AHB and APB busses clocks + /** Initializes the CPU, AHB and APB buses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; @@ -157,7 +157,7 @@ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } - /** Initializes the CPU, AHB and APB busses clocks + /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/SimplicityStudio/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/SimplicityStudio/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,92 @@ +# Silicon Labs Simplicity Studio + +Tested with ERF32xG21 Starter Kit and Gecko SDK v3.2.2 and v4.2.3. + +## Simplicity Studio Example + +Based on `cli_kernel_freertos`. +* Create a new example project for your board based on the CLI FreeRTOS example. +* Create a new `wolfssl` and put wolfSSL into it. Tip: Use `./scripts/makedistsmall.sh` to produce a reduced bundle. +* Exclude (or delete) all .S and asm.c files. +* Exclude (or delete) directory not used (only the `src`, `wolfcrypt` and `wolfssl` directory are used). +* Add the `IDE/SimplicityStudio/user_settings.h` into `wolfssl/user_settings.h`. +* Add the `IDE/SimplicityStudio/test_wolf.c` to the project root. +* Add C preprocessor `WOLFSSL_USER_SETTINGS`. +* Add C include path `wolfssl`. +* Disable UART flow control: `config/sl_iostream_usart_vcom_config.h` -> `#define SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE usartHwFlowControlNone` +* Adjust stack and heap to larger size 12KB: + - Adjust the CLI stack. Edit `config/sl_cli_config_inst.h` to `#define SL_CLI_INST_TASK_STACK_SIZE (12*1024)` + - Adjust the FreeRTOS heap. Edit `config/FreeRTOSConfig.h` to `#define configTOTAL_HEAP_SIZE (12*1024)` +* Add the following code to `cli.c`: + +```c +extern void wolf_test(sl_cli_command_arg_t *arguments); +extern void wolf_bench(sl_cli_command_arg_t *arguments); + +static const sl_cli_command_info_t cmd_wolf_test = + SL_CLI_COMMAND(wolf_test, "Run wolfCrypt tests", "", + { SL_CLI_ARG_WILDCARD, SL_CLI_ARG_END, }); + +static const sl_cli_command_info_t cmd_wolf_bench = + SL_CLI_COMMAND(wolf_bench, "Run wolfCrypt benchmarks", "", + { SL_CLI_ARG_WILDCARD, SL_CLI_ARG_END, }); + +static sl_cli_command_entry_t a_table[] = { + { "wolf_test", &cmd_wolf_test, false }, + { "wolf_bench", &cmd_wolf_bench, false }, + { NULL, NULL, false }, +}; +``` + +* If running wolfCrypt benchmark enable printf float + - `C/C++ Build Settings` -> `Settings` -> `Tool Settings` -> `GNU ARM C Linker` -> `General` -> `C Library "Printf float"`. + +## SE Manager + +For SE Manager cryptography hardware acceleration see [/wolfcrypt/src/port/silabs/README.md](/wolfcrypt/src/port/silabs/README.md). + +Enabled with `WOLFSSL_SILABS_SE_ACCEL`. Requires the "SE Manager" component to be installed. + +## Benchmarks with SE Accel + +Tested on ERF32xG21 Starter Kit (Cortex M33 at 80 MHz) and Gecko SDK v3.2.2 (-Os). + +``` +Benchmark Test +wolfCrypt Benchmark (block bytes 1024, min 1.0 sec each) +RNG 200 KiB took 1.057 seconds, 189.215 KiB/s +AES-128-CBC-enc 6 MiB took 1.000 seconds, 5.542 MiB/s +AES-128-CBC-dec 6 MiB took 1.000 seconds, 5.518 MiB/s +AES-192-CBC-enc 5 MiB took 1.001 seconds, 5.415 MiB/s +AES-192-CBC-dec 5 MiB took 1.001 seconds, 5.390 MiB/s +AES-256-CBC-enc 5 MiB took 1.004 seconds, 5.301 MiB/s +AES-256-CBC-dec 5 MiB took 1.001 seconds, 5.268 MiB/s +AES-128-GCM-enc 5 MiB took 1.003 seconds, 4.844 MiB/s +AES-128-GCM-dec 5 MiB took 1.003 seconds, 4.625 MiB/s +AES-192-GCM-enc 5 MiB took 1.002 seconds, 4.751 MiB/s +AES-192-GCM-dec 5 MiB took 1.002 seconds, 4.532 MiB/s +AES-256-GCM-enc 5 MiB took 1.002 seconds, 4.654 MiB/s +AES-256-GCM-dec 4 MiB took 1.000 seconds, 4.443 MiB/s +AES-128-GCM-enc-no_AAD 5 MiB took 1.004 seconds, 4.888 MiB/s +AES-128-GCM-dec-no_AAD 5 MiB took 1.001 seconds, 4.658 MiB/s +AES-192-GCM-enc-no_AAD 5 MiB took 1.000 seconds, 4.785 MiB/s +AES-192-GCM-dec-no_AAD 5 MiB took 1.000 seconds, 4.565 MiB/s +AES-256-GCM-enc-no_AAD 5 MiB took 1.004 seconds, 4.693 MiB/s +AES-256-GCM-dec-no_AAD 4 MiB took 1.003 seconds, 4.479 MiB/s +GMAC Small 5 MiB took 1.000 seconds, 4.653 MiB/s +CHACHA 2 MiB took 1.012 seconds, 1.809 MiB/s +CHA-POLY 1 MiB took 1.006 seconds, 1.189 MiB/s +POLY1305 5 MiB took 1.004 seconds, 5.082 MiB/s +SHA 8 MiB took 1.000 seconds, 7.812 MiB/s +SHA-256 8 MiB took 1.000 seconds, 8.032 MiB/s +HMAC-SHA 7 MiB took 1.000 seconds, 7.056 MiB/s +HMAC-SHA256 7 MiB took 1.002 seconds, 7.237 MiB/s +RSA 2048 public 30 ops took 1.022 sec, avg 34.067 ms, 29.354 ops/sec +RSA 2048 private 2 ops took 2.398 sec, avg 1199.000 ms, 0.834 ops/sec +ECC [ SECP256R1] 256 key gen 172 ops took 1.004 sec, avg 5.837 ms, 171.315 ops/sec +ECDHE [ SECP256R1] 256 agree 186 ops took 1.005 sec, avg 5.403 ms, 185.075 ops/sec +ECDSA [ SECP256R1] 256 sign 174 ops took 1.007 sec, avg 5.787 ms, 172.790 ops/sec +ECDSA [ SECP256R1] 256 verify 160 ops took 1.003 sec, avg 6.269 ms, 159.521 ops/sec +Benchmark complete +Benchmark Test: Return code 0 +``` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/SimplicityStudio/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/SimplicityStudio/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,7 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= IDE/SimplicityStudio/README.md +EXTRA_DIST+= IDE/SimplicityStudio/test_wolf.c +EXTRA_DIST+= IDE/SimplicityStudio/user_settings.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/SimplicityStudio/test_wolf.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/test_wolf.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/SimplicityStudio/test_wolf.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/SimplicityStudio/test_wolf.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,244 @@ +/* test_wolf.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Example for running wolfCrypt test and benchmark from + * SiLabs Simplicity Studio's CLI example */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "sl_cli.h" +#include "sl_cli_instances.h" +#include "sl_cli_arguments.h" +#include "sl_cli_handles.h" + +#ifndef NO_CRYPT_TEST +typedef struct func_args { + int argc; + char** argv; + int return_code; +} func_args; + +static func_args args = { 0 }; +#endif + +void wolf_test(sl_cli_command_arg_t *arguments) +{ + int ret; +#ifndef NO_CRYPT_TEST + wolfCrypt_Init(); + + printf("\nCrypt Test\n"); + wolfcrypt_test(&args); + ret = args.return_code; + printf("Crypt Test: Return code %d\n", ret); + + wolfCrypt_Cleanup(); +#else + ret = NOT_COMPILED_IN; +#endif + (void)arguments; + (void)ret; +} + +void wolf_bench(sl_cli_command_arg_t *arguments) +{ + int ret; +#ifndef NO_CRYPT_BENCHMARK + wolfCrypt_Init(); + + printf("\nBenchmark Test\n"); + benchmark_test(&args); + ret = args.return_code; + printf("Benchmark Test: Return code %d\n", ret); + + wolfCrypt_Cleanup(); +#else + ret = NOT_COMPILED_IN; +#endif + (void)arguments; + (void)ret; +} + +/* ecc key gen, sign and verify examples */ +#define TEST_ECC_KEYSZ 32 +#define TEST_DATA_SIZE 128 +#define TEST_KEYGEN_TRIES 100 +#define TEST_ECDSA_TRIES 100 +/* #define TEST_VERIFY_ONLY */ +/* #define TEST_PRIVATE_IMPORT */ + +void wolf_ecc_test(sl_cli_command_arg_t *arguments) +{ + int ret = 0, i, j; + byte data[TEST_DATA_SIZE]; + word32 dataLen = (word32)sizeof(data); + WC_RNG rng; + ecc_key eccKey; + word32 inOutIdx; +#ifdef TEST_PRIVATE_IMPORT + /* ./certs/ecc-client-key.der, ECC */ + const unsigned char ecc_clikey_der_256[] = { + 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0xF8, 0xCF, 0x92, + 0x6B, 0xBD, 0x1E, 0x28, 0xF1, 0xA8, 0xAB, 0xA1, 0x23, 0x4F, + 0x32, 0x74, 0x18, 0x88, 0x50, 0xAD, 0x7E, 0xC7, 0xEC, 0x92, + 0xF8, 0x8F, 0x97, 0x4D, 0xAF, 0x56, 0x89, 0x65, 0xC7, 0xA0, + 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, + 0x07, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0x55, 0xBF, 0xF4, + 0x0F, 0x44, 0x50, 0x9A, 0x3D, 0xCE, 0x9B, 0xB7, 0xF0, 0xC5, + 0x4D, 0xF5, 0x70, 0x7B, 0xD4, 0xEC, 0x24, 0x8E, 0x19, 0x80, + 0xEC, 0x5A, 0x4C, 0xA2, 0x24, 0x03, 0x62, 0x2C, 0x9B, 0xDA, + 0xEF, 0xA2, 0x35, 0x12, 0x43, 0x84, 0x76, 0x16, 0xC6, 0x56, + 0x95, 0x06, 0xCC, 0x01, 0xA9, 0xBD, 0xF6, 0x75, 0x1A, 0x42, + 0xF7, 0xBD, 0xA9, 0xB2, 0x36, 0x22, 0x5F, 0xC7, 0x5D, 0x7F, + 0xB4 + }; + const int sizeof_ecc_clikey_der_256 = sizeof(ecc_clikey_der_256); +#endif +#ifdef TEST_VERIFY_ONLY + /* ./certs/ecc-client-keyPub.der, ECC */ + const unsigned char ecc_clikeypub_der_256[] = { + 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, + 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, + 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0x55, 0xBF, 0xF4, + 0x0F, 0x44, 0x50, 0x9A, 0x3D, 0xCE, 0x9B, 0xB7, 0xF0, 0xC5, + 0x4D, 0xF5, 0x70, 0x7B, 0xD4, 0xEC, 0x24, 0x8E, 0x19, 0x80, + 0xEC, 0x5A, 0x4C, 0xA2, 0x24, 0x03, 0x62, 0x2C, 0x9B, 0xDA, + 0xEF, 0xA2, 0x35, 0x12, 0x43, 0x84, 0x76, 0x16, 0xC6, 0x56, + 0x95, 0x06, 0xCC, 0x01, 0xA9, 0xBD, 0xF6, 0x75, 0x1A, 0x42, + 0xF7, 0xBD, 0xA9, 0xB2, 0x36, 0x22, 0x5F, 0xC7, 0x5D, 0x7F, + 0xB4 + }; + const int sizeof_ecc_clikeypub_der_256 = sizeof(ecc_clikeypub_der_256); + + /* Signature for hash of 128-bytes data 0,1,2.... */ + const byte sig[] = { + 0x30, 0x45, + 0x02, 0x20, + 0x5e, 0x01, 0x3d, 0xfb, 0x18, 0x61, 0xe3, 0xe3, + 0xa0, 0xff, 0x9b, 0x99, 0xb5, 0x2f, 0x89, 0xba, + 0xb3, 0xbb, 0x62, 0x08, 0x9b, 0x94, 0x0e, 0x61, + 0x9c, 0x00, 0x7b, 0x43, 0x9c, 0x28, 0xcb, 0xf6, + 0x02, 0x21, + 0x00, + 0xb4, 0x72, 0x2f, 0x22, 0x92, 0xa2, 0x8d, 0x01, + 0x6b, 0x01, 0x35, 0x5c, 0xcb, 0x34, 0xa2, 0x21, + 0x32, 0xe2, 0xe6, 0x66, 0xd0, 0x9e, 0x3e, 0x8e, + 0x84, 0x5d, 0xa4, 0x69, 0x54, 0x52, 0xfc, 0xef + }; + word32 sigLen = (word32)sizeof(sig); +#else + byte sig[ECC_MAX_SIG_SIZE]; + word32 sigLen; +#endif + + memset(&rng, 0, sizeof(rng)); + memset(&eccKey, 0, sizeof(eccKey)); + + wolfSSL_Debugging_ON(); + + wolfCrypt_Init(); + + /* test data */ + for (i=0; i<(int)dataLen; i++) { + data[i] = (byte)i; + } + + ret = wc_InitRng(&rng); + if (ret != 0) { + goto exit; + } + + for (i=0; i /* for size_t */ + extern void *myMalloc(size_t n, void* heap, int type); + extern void myFree(void *p, void* heap, int type); + extern void *myRealloc(void *p, size_t n, void* heap, int type); + + #define XMALLOC(n, h, t) myMalloc(n, h, t) + #define XFREE(p, h, t) myFree(p, h, t) + #define XREALLOC(p, n, h, t) myRealloc(p, n, h, t) +#endif + +#if 0 + /* Static memory requires fast math */ + #define WOLFSSL_STATIC_MEMORY + + /* Disable fallback malloc/free */ + #define WOLFSSL_NO_MALLOC + #if 1 + #define WOLFSSL_MALLOC_CHECK /* trap malloc failure */ + #endif +#endif + +/* Memory callbacks */ +#if 0 + #undef USE_WOLFSSL_MEMORY + #define USE_WOLFSSL_MEMORY + + /* Use this to measure / print heap usage */ + #if 0 + #define WOLFSSL_TRACK_MEMORY + #define WOLFSSL_DEBUG_MEMORY + #endif +#else + #ifndef WOLFSSL_STATIC_MEMORY + #define NO_WOLFSSL_MEMORY + /* Otherwise we will use stdlib malloc, free and realloc */ + #endif +#endif + + +/* ------------------------------------------------------------------------- */ +/* Port */ +/* ------------------------------------------------------------------------- */ + +/* Override Current Time */ +#if 0 + /* Allows custom "custom_time()" function to be used for benchmark */ + #define WOLFSSL_USER_CURRTIME + #define WOLFSSL_GMTIME + #define USER_TICKS + extern unsigned long my_time(unsigned long* timer); + #define XTIME my_time +#endif + + +/* ------------------------------------------------------------------------- */ +/* RNG */ +/* ------------------------------------------------------------------------- */ + +/* Choose RNG method */ +#if 1 + /* Custom Seed Source */ + #if 0 + /* Size of returned HW RNG value */ + #define CUSTOM_RAND_TYPE unsigned int + extern unsigned int my_rng_seed_gen(void); + #undef CUSTOM_RAND_GENERATE + #define CUSTOM_RAND_GENERATE my_rng_seed_gen + #endif + + /* Use built-in P-RNG (SHA256 based) with HW RNG */ + /* P-RNG + HW RNG (P-RNG is ~8K) */ + #undef HAVE_HASHDRBG + #define HAVE_HASHDRBG +#else + #undef WC_NO_HASHDRBG + #define WC_NO_HASHDRBG + + /* Bypass P-RNG and use only HW RNG */ + extern int my_rng_gen_block(unsigned char* output, unsigned int sz); + #undef CUSTOM_RAND_GENERATE_BLOCK + #define CUSTOM_RAND_GENERATE_BLOCK my_rng_gen_block +#endif + + +/* ------------------------------------------------------------------------- */ +/* Custom Standard Lib */ +/* ------------------------------------------------------------------------- */ +/* Allows override of all standard library functions */ +#undef STRING_USER +#if 0 + #define STRING_USER + + #include + + #define USE_WOLF_STRSEP + #define XSTRSEP(s1,d) wc_strsep((s1),(d)) + + #define USE_WOLF_STRTOK + #define XSTRTOK(s1,d,ptr) wc_strtok((s1),(d),(ptr)) + + #define XSTRNSTR(s1,s2,n) mystrnstr((s1),(s2),(n)) + + #define XMEMCPY(d,s,l) memcpy((d),(s),(l)) + #define XMEMSET(b,c,l) memset((b),(c),(l)) + #define XMEMCMP(s1,s2,n) memcmp((s1),(s2),(n)) + #define XMEMMOVE(d,s,l) memmove((d),(s),(l)) + + #define XSTRLEN(s1) strlen((s1)) + #define XSTRNCPY(s1,s2,n) strncpy((s1),(s2),(n)) + #define XSTRSTR(s1,s2) strstr((s1),(s2)) + + #define XSTRNCMP(s1,s2,n) strncmp((s1),(s2),(n)) + #define XSTRNCAT(s1,s2,n) strncat((s1),(s2),(n)) + #define XSTRNCASECMP(s1,s2,n) strncasecmp((s1),(s2),(n)) + + #define XSNPRINTF snprintf +#endif + + + +/* ------------------------------------------------------------------------- */ +/* Enable Features */ +/* ------------------------------------------------------------------------- */ + +#define WOLFSSL_TLS13 +#define WOLFSSL_OLD_PRIME_CHECK /* Use faster DH prime checking */ +#define HAVE_TLS_EXTENSIONS +#define HAVE_SUPPORTED_CURVES +#define WOLFSSL_BASE64_ENCODE +#define WOLFSSL_PUB_PEM_TO_DER + +//#define WOLFSSL_KEY_GEN /* For RSA Key gen only */ +//#define KEEP_PEER_CERT +//#define HAVE_COMP_KEY + +/* TLS Session Cache */ +#if 0 + #define SMALL_SESSION_CACHE +#else + #define NO_SESSION_CACHE +#endif + + +/* ------------------------------------------------------------------------- */ +/* Disable Features */ +/* ------------------------------------------------------------------------- */ +//#define NO_WOLFSSL_SERVER +//#define NO_WOLFSSL_CLIENT +//#define NO_CRYPT_TEST +//#define NO_CRYPT_BENCHMARK +//#define WOLFCRYPT_ONLY + +/* do not warm when file is included to be built and not required to be */ +#define WOLFSSL_IGNORE_FILE_WARN + +/* In-lining of misc.c functions */ +/* If defined, must include wolfcrypt/src/misc.c in build */ +/* Slower, but about 1k smaller */ +//#define NO_INLINE + +#define NO_FILESYSTEM +#define NO_WRITEV +#define NO_MAIN_DRIVER +#define NO_DEV_RANDOM + +#define NO_OLD_TLS +#define NO_PSK + +#define NO_DSA +#define NO_RC4 +#define NO_MD4 +#define NO_PWDBASED +//#define NO_CODING +//#define NO_ASN_TIME +//#define NO_CERTS +//#define NO_SIG_WRAPPER + +#ifdef __cplusplus +} +#endif + +#endif /* WOLFSSL_USER_SETTINGS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/VisualDSP/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/VisualDSP/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/VisualDSP/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/VisualDSP/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -77,7 +77,6 @@ #define WOLFSSL_HAVE_SP_RSA #define WOLFSSL_HAVE_SP_DH #define WOLFSSL_HAVE_SP_ECC - #define WOLFSSL_SP_CACHE_RESISTANT //#define WOLFSSL_SP_MATH /* only SP math - eliminates fast math code */ /* 64 or 32 bit version */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WICED-STUDIO/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WICED-STUDIO/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WICED-STUDIO/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WICED-STUDIO/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -75,7 +75,6 @@ #define WOLFSSL_HAVE_SP_RSA #define WOLFSSL_HAVE_SP_DH #define WOLFSSL_HAVE_SP_ECC - #define WOLFSSL_SP_CACHE_RESISTANT //#define WOLFSSL_SP_MATH /* 64 or 32 bit version */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/README.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/README.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/README.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/README.txt 2024-08-03 07:30:00.000000000 +0000 @@ -3,7 +3,7 @@ First, if you did not get the FIPS files with your archive, you must contact wolfSSL to obtain them. -The IDE/WIN/wolfssl-fips.sln solution is for the original FIPS #2425 certificate. +The IDE/WIN/wolfssl-fips.sln solution is for the original FIPS #2425 certificate. See IDE/WIN10/wolfssl-fips.sln for the FIPS v2 #3389 or later Visual Studio solution. # Building the wolfssl-fips project @@ -30,11 +30,13 @@ FIPS library code and constant data and compares it with a known value in the code. -The Randomized Base Address setting needs to be disabled on the 32-bit builds -but can be enabled on the 64-bit builds. In the 32-bit mode the addresses -being different throws off the in-core memory calculation. It looks like in -64-bit mode the library uses all offsets, so the core hash calculation -is the same every time. +The following wolfCrypt FIPS project linker settings are required for the DLL Win32 configuration: +1) The [Randomized Base Address setting (ASLR)](https://learn.microsoft.com/en-us/cpp/build/reference/dynamicbase-use-address-space-layout-randomization?view=msvc-170) +needs to be disabled on all builds as the feature throws off the in-core memory calculation causing the test to fail. +2) The [Incremental Link](https://learn.microsoft.com/en-us/cpp/build/reference/incremental-link-incrementally?view=msvc-170) +option need turned off so function pointers go to actual code, not a jump instruction. +3) The [FixedBaseAddress](https://learn.microsoft.com/en-us/cpp/build/reference/fixed-fixed-base-address?view=msvc-170) +option to YES, which disables the support for ASLR. The "verifyCore" check value in the source fips_test.c needs to be updated when building the code. The POS performs this check and the default failure callback @@ -71,13 +73,13 @@ # Notes on enabling DTLS including DTLS version 1.3 -The file IDE/WIN/user_settings_dtls.h contains the needed build options for +The file IDE/WIN/user_settings_dtls.h contains the needed build options for enabling DTLS and DTLS version 1.3. To incorporate the build options: * Rename IDE/WIN/user_settings.h to IDE/WIN/user_settings.h.bak * Rename IDE/WIN/user_settings_dtls.h to IDE/WIN/user_settings.h - + Alternatively, copy the DTLS labeled section from IDE/WIN/user_settings_dtls.h in to IDE/WIN/user_settings.h. \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/test.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/test.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/test.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/test.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -111,7 +111,7 @@ Disabled .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -130,7 +130,7 @@ Disabled .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -147,7 +147,7 @@ .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 @@ -168,7 +168,7 @@ .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL Level3 @@ -188,7 +188,7 @@ Disabled .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -208,7 +208,7 @@ Disabled .\;..\..\;%(AdditionalIncludeDirectories) - _DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -226,7 +226,7 @@ .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) MultiThreadedDLL Level3 @@ -246,7 +246,7 @@ .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;USE_CERT_BUFFERS_2048;WOLFSSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) MultiThreadedDLL Level3 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -37,6 +37,9 @@ #define WC_RSA_BLINDING #define NO_MULTIBYTE_PRINT + #define HAVE_CRL + #define HAVE_CRL_MONITOR + #if defined(WOLFSSL_LIB) /* The lib */ #define OPENSSL_EXTRA @@ -71,6 +74,9 @@ #if 0 #define HAVE_INTEL_AVX2 #endif + + #define USE_INTEL_CHACHA_SPEEDUP + #define USE_INTEL_POLY1305_SPEEDUP #endif /* Single Precision Support for RSA/DH 1024/2048/3072 and diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/wolfssl-fips.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/wolfssl-fips.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN/wolfssl-fips.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN/wolfssl-fips.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -117,11 +117,23 @@ $(SolutionDir)$(Configuration)\$(Platform)\ $(Configuration)\$(Platform)\obj\ + + false + + + false + + + false + + + false + Disabled ./;../../;%(AdditionalIncludeDirectories) - HAVE_FIPS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + HAVE_FIPS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 @@ -133,7 +145,7 @@ Disabled ./;../../;%(AdditionalIncludeDirectories) - HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -146,13 +158,14 @@ 0x5A000000 false false + true Disabled ./;../../;%(AdditionalIncludeDirectories) - HAVE_FIPS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + HAVE_FIPS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level4 @@ -164,7 +177,7 @@ Disabled ./;../../;%(AdditionalIncludeDirectories) - HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -174,7 +187,7 @@ ws2_32.lib;%(AdditionalDependencies) - true + false false @@ -183,7 +196,7 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - WIN32;HAVE_FIPS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;HAVE_FIPS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -196,7 +209,7 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -206,6 +219,7 @@ ws2_32.lib;%(AdditionalDependencies) false 0x5A000000 + true @@ -213,7 +227,7 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - HAVE_FIPS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + HAVE_FIPS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -226,7 +240,7 @@ MaxSpeed true ./;../../;%(AdditionalIncludeDirectories) - HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + HAVE_FIPS;BUILDING_WOLFSSL;CYASSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true Level3 @@ -234,7 +248,7 @@ ws2_32.lib;%(AdditionalDependencies) - true + false diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/README.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/README.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/README.txt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/README.txt 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,118 @@ +# Notes on the wolfssl-fips project + +First, if you did not get the FIPS files with your archive, you must contact +wolfSSL to obtain them. + +The IDE/WIN10/wolfssl-fips.sln solution is for the FIPS 140-3 certificate or later. + +# Building the wolfssl-fips project + +The wolfCrypt FIPS library for Windows is a part of the wolfSSL library. It +must be built as a static library, for the moment. + +The library project is built with Whole Program Optimization disabled. This is +required so that necessary components of the library are not optimized away. +There are two functions added to the library that are used as markers in +memory for the in-core memory check of the code. WPO consolidates them into a +single function. WPO also optimizes away the automatic FIPS entry function. + +Each of the source files inside the FIPS boundary defines their own code and +constant section. The code section names start with ".fipsA$" and the constant +section names start with ".fipsB$". Each subsection has a letter to organize +them in a specific order. This specific ordering puts marker functions and +constants on either end of the boundary so it can be hashed. + + +# In Core Memory Test + +The In Core Memory test calculates a checksum (HMAC-SHA256) of the wolfCrypt +FIPS library code and constant data and compares it with a known value in +the code. + +The following wolfCrypt FIPS project linker settings are required for the DLL Win32 configuration: +1) The [Randomized Base Address setting (ASLR)](https://learn.microsoft.com/en-us/cpp/build/reference/dynamicbase-use-address-space-layout-randomization?view=msvc-170) +needs to be disabled on all builds as the feature throws off the in-core memory calculation causing the test to fail. +2) The [Incremental Link](https://learn.microsoft.com/en-us/cpp/build/reference/incremental-link-incrementally?view=msvc-170) +option need turned off so function pointers go to actual code, not a jump instruction. +3) The [FixedBaseAddress](https://learn.microsoft.com/en-us/cpp/build/reference/fixed-fixed-base-address?view=msvc-170) +option to YES, which disables the support for ASLR. + +The "verifyCore" check value in the source fips_test.c needs to be updated when +building the code. The POS performs this check and the default failure callback +will print out the calculated checksum. When developing your code, copy this +value and paste it back into your code in the verifyCore initializer then +rebuild the code. When statically linking, you may have to recalculate your +check value when changing your application. + +# Build Options + +The default build options should be the proper default set of options: + + * HAVE_FIPS + * HAVE_FIPS_VERSION=5 + * HAVE_FIPS_VERSION_MINOR=1 (Also for FIPS Ready) + * HAVE_THREAD_LS + * WOLFSSL_KEY_GEN + * HAVE_AESGCM + * HAVE_HASHDRBG + * WOLFSSL_SHA384 + * WOLFSSL_SHA512 + * NO_PSK + * NO_RC4 + * NO_DSA + * NO_MD4 + * WOLFSSL_SHA224 + * WOLFSSL_SHA3 + * WC_RSA_PSS + * WC_RSA_NO_PADDING + * HAVE_ECC + * ECC_SHAMIR + * HAVE_ECC_CDH + * ECC_TIMING_RESISTANT + * TFM_TIMING_RESISTANT + * WOLFSSL_AES_COUNTER + * WOLFSSL_AES_DIRECT + * HAVE_AES_ECB + * HAVE_AESCCM + * WOLFSSL_CMAC + * HAVE_HKDF + * WOLFSSL_VALIDATE_ECC_IMPORT + * WOLFSSL_VALIDATE_FFC_IMPORT + * HAVE_FFDHE_Q + * NO_DES + * NO_DES3 + * NO_MD5 + * NO_OLD_TLS + * WOLFSSL_TLS13 + * HAVE_TLS_EXTENSIONS + * HAVE_SUPPORTED_CURVES + * GCM_TABLE_4BIT + * WOLFSSL_NO_SHAKE256 + * WOLFSSL_VALIDATE_ECC_KEYGEN + * WOLFSSL_ECDSA_SET_K + * WOLFSSL_WOLFSSH + * WOLFSSL_PUBLIC_MP + * WC_RNG_SEED_CB + * TFM_ECC256 + * ECC_USER_CURVES + * HAVE_ECC192 + * HAVE_ECC224 + * HAVE_ECC256 + * HAVE_ECC384 + * HAVE_ECC521 + * HAVE_FFDHE_2048 + * HAVE_FFDHE_3072 + * HAVE_FFDHE_4096 + * HAVE_FFDHE_6144 + * HAVE_FFDHE_8192 + * FP_MAX_BITS 16384 + +The "NO" options explicitly disable algorithms that are not allowed in +FIPS mode. + +Additionally one may enable: + + * WOLFSSL_AESNI + * OPENSSL_EXTRA + +These settings are defined in IDE/WIN10/user_settings.h. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,11 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= IDE/WIN-SRTP-KDF-140-3/README.txt +EXTRA_DIST+= IDE/WIN-SRTP-KDF-140-3/test.vcxproj +EXTRA_DIST+= IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.sln +EXTRA_DIST+= IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.vcxproj +EXTRA_DIST+= IDE/WIN-SRTP-KDF-140-3/user_settings.h +EXTRA_DIST+= IDE/WIN-SRTP-KDF-140-3/resource.h +EXTRA_DIST+= IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.rc diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/resource.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/resource.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/resource.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/resource.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,14 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by wolfssl-fips.rc + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/test.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/test.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/test.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/test.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,277 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + Release + Win32 + + + Release + x64 + + + + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21} + Win32Proj + + + + Application + v142 + + + Application + v142 + + + Application + v142 + + + Application + v142 + + + Application + v142 + + + Application + v142 + + + Application + v142 + + + Application + v142 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>11.0.61030.0 + + + $(SolutionDir)$(Configuration)\$(Platform)\ + $(Configuration)\$(Platform)\$(ProjectName)_obj\ + false + + + + Disabled + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + ProgramDatabase + + + true + Console + MachineX86 + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + + + + + Disabled + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + ProgramDatabase + + + true + Console + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + + + + + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + + Level3 + ProgramDatabase + true + + + true + Console + MachineX86 + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + true + UseLinkTimeCodeGeneration + false + + + + + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + + Level3 + ProgramDatabase + true + + + true + Console + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + true + UseLinkTimeCodeGeneration + + + + + Disabled + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + ProgramDatabase + false + + + true + Console + MachineX86 + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + + + + + Disabled + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + + Level3 + ProgramDatabase + false + + + true + Console + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + false + + + + + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + + Level3 + ProgramDatabase + + + true + Console + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + true + MachineX86 + UseLinkTimeCodeGeneration + true + + + + + .\;..\..\;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) + MultiThreadedDLL + + Level3 + ProgramDatabase + + + true + Console + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + true + true + UseLinkTimeCodeGeneration + true + + + + + + + + {73973223-5ee8-41ca-8e88-1d60e89a237b} + false + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,177 @@ +#ifndef _WIN_USER_SETTINGS_H_ +#define _WIN_USER_SETTINGS_H_ + +/* For FIPS 140-2 3389 build set to "#if 1" */ +#if 0 +#undef HAVE_FIPS +#define HAVE_FIPS +#undef HAVE_FIPS_VERSION +#define HAVE_FIPS_VERSION 2 +#undef HAVE_FIPS_VERSION_MINOR +#define HAVE_FIPS_VERSION_MINOR 0 +#endif + +/* Set the following to 1 for WCv5.0-RC12 build. */ +#if 1 +#undef HAVE_FIPS +#define HAVE_FIPS +#undef HAVE_FIPS_VERSION +#define HAVE_FIPS_VERSION 6 +#undef HAVE_FIPS_VERSION_MAJOR +#define HAVE_FIPS_VERSION_MAJOR 6 +#undef HAVE_FIPS_VERSION_MINOR +#define HAVE_FIPS_VERSION_MINOR 0 +#undef HAVE_FIPS_VERSION_PATCH +#define HAVE_FIPS_VERSION_PATCH 0 +#endif + +/* For FIPS Ready, uncomment the following: */ +/* #define WOLFSSL_FIPS_READY */ +#ifdef WOLFSSL_FIPS_READY + #undef HAVE_FIPS + #define HAVE_FIPS + #undef HAVE_FIPS_VERSION + #define HAVE_FIPS_VERSION 5 + #undef HAVE_FIPS_VERSION_MINOR + #define HAVE_FIPS_VERSION_MINOR 3 +#endif + + +/* Verify this is Windows */ +#ifndef _WIN32 +#error This user_settings.h header is only designed for Windows +#endif + +/* Configurations */ +#if defined(HAVE_FIPS) + /* FIPS */ + #define OPENSSL_EXTRA + #define HAVE_THREAD_LS + #define WOLFSSL_KEY_GEN + #define HAVE_AESGCM + #define HAVE_HASHDRBG + #define WOLFSSL_SHA384 + #define WOLFSSL_SHA512 + #define NO_PSK + #define NO_RC4 + #define NO_DSA + #define NO_MD4 + + #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) + #define WOLFSSL_SHA224 + #define WOLFSSL_SHA3 + #define WC_RSA_PSS + #define WC_RSA_NO_PADDING + #define HAVE_ECC + #define HAVE_ECC384 + #define HAVE_ECC521 + #define HAVE_SUPPORTED_CURVES + #define HAVE_TLS_EXTENSIONS + #define ECC_SHAMIR + #define HAVE_ECC_CDH + #define ECC_TIMING_RESISTANT + #define TFM_TIMING_RESISTANT + #define WOLFSSL_AES_COUNTER + #define WOLFSSL_AES_DIRECT + #define HAVE_AES_ECB + #define HAVE_AESCCM + #define WOLFSSL_CMAC + #define HAVE_HKDF + #define WOLFSSL_VALIDATE_ECC_IMPORT + #define WOLFSSL_VALIDATE_FFC_IMPORT + #define HAVE_FFDHE_Q + #define HAVE_PUBLIC_FFDHE + #ifdef _WIN64 + #define WOLFSSL_AESNI + #define HAVE_INTEL_RDSEED + #endif + #define FORCE_FAILURE_RDSEED + #endif /* FIPS v2 */ + #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 5) + #undef WOLFSSL_AESNI /* Comment out if using PAA */ + #undef HAVE_INTEL_RDSEED + #undef FORCE_FAILURE_RDSEED + #undef HAVE_PUBLIC_FFDHE + + #define NO_DES + #define NO_DES3 + #define NO_MD5 + #define NO_OLD_TLS + + #define WOLFSSL_TLS13 + #define HAVE_TLS_EXTENSIONS + #define HAVE_SUPPORTED_CURVES + #define GCM_TABLE_4BIT + #define WOLFSSL_NO_SHAKE256 + #define WOLFSSL_VALIDATE_ECC_KEYGEN + #define WOLFSSL_ECDSA_SET_K + #define WOLFSSL_WOLFSSH + #define WOLFSSL_PUBLIC_MP + #define WC_RNG_SEED_CB + #define TFM_ECC256 + #define ECC_USER_CURVES + #define HAVE_ECC192 + #define HAVE_ECC224 + #define HAVE_ECC256 + #define HAVE_ECC384 + #define HAVE_ECC521 + #define HAVE_FFDHE_2048 + #define HAVE_FFDHE_3072 + #define HAVE_FFDHE_4096 + #define HAVE_FFDHE_6144 + #define HAVE_FFDHE_8192 + #define WOLFSSL_AES_OFB + #define FP_MAX_BITS 16384 + #endif /* FIPS v5 */ + #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 6) + #define HAVE_ED25519 + #define HAVE_ED448 + #define WOLFSSL_SHAKE256 + #define WOLFSSL_SHAKE128 + #define WOLFSSL_AES_CFB + #define WOLFSSL_AES_XTS + #define HAVE_AES_KEYWRAP + #define WC_SRTP_KDF + #define HAVE_PBKDF2 + #define WOLFCRYPT_FIPS_CORE_HASH_VALUE \ + AA9F70F147FAB898A76F587873AC4E9C7050D6E1F5828046BE871C54EDF2BF1C + #define WOLFSSL_NOSHA512_224 + #define WOLFSSL_NOSHA512_256 + + /* uncomment for FIPS debugging */ + /* #define DEBUG_FIPS_VERBOSE */ + + /* uncomment for whole library debugging */ + /* #define DEBUG_WOLFSSL */ + #endif /* FIPS v6 */ +#else + /* Enables blinding mode, to prevent timing attacks */ + #define WC_RSA_BLINDING + + #if defined(WOLFSSL_LIB) + /* The lib */ + #define OPENSSL_EXTRA + #define WOLFSSL_RIPEMD + #define NO_PSK + #define HAVE_EXTENDED_MASTER + #define WOLFSSL_SNIFFER + #define HAVE_SECURE_RENEGOTIATION + + #define HAVE_AESGCM + #define WOLFSSL_SHA384 + #define WOLFSSL_SHA512 + + #define HAVE_SUPPORTED_CURVES + #define HAVE_TLS_EXTENSIONS + + #define HAVE_ECC + #define ECC_SHAMIR + #define ECC_TIMING_RESISTANT + #else + /* The servers and clients */ + #define OPENSSL_EXTRA + #define NO_PSK + #endif +#endif /* HAVE_FIPS */ + +#endif /* _WIN_USER_SETTINGS_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.rc mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.rc --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.rc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.rc 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,100 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 5,7,0,0 + PRODUCTVERSION 5,7,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x7L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "wolfSSL Inc." + VALUE "FileDescription", "The wolfSSL FIPS embedded SSL library is a lightweight, portable, C-language-based SSL/TLS library targeted at IoT, embedded, and RTOS environments primarily because of its size, speed, and feature set." + VALUE "FileVersion", "5.7.0.0" + VALUE "InternalName", "wolfssl-fips" + VALUE "LegalCopyright", "Copyright (C) 2023" + VALUE "OriginalFilename", "wolfssl-fips.dll" + VALUE "ProductName", "wolfSSL FIPS" + VALUE "ProductVersion", "5.7.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.sln mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.sln --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.sln 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.sln 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,61 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.32510.428 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wolfssl-fips", "wolfssl-fips.vcxproj", "{73973223-5EE8-41CA-8E88-1D60E89A237B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcxproj", "{D04BDF66-664A-4D59-BEAC-8AB2D5809C21}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + DLL Debug|Win32 = DLL Debug|Win32 + DLL Debug|x64 = DLL Debug|x64 + DLL Release|Win32 = DLL Release|Win32 + DLL Release|x64 = DLL Release|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|Win32.ActiveCfg = Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|Win32.Build.0 = Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.ActiveCfg = Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Debug|x64.Build.0 = Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.DLL Release|x64.Build.0 = DLL Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.ActiveCfg = Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|Win32.Build.0 = Release|Win32 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.ActiveCfg = Release|x64 + {73973223-5EE8-41CA-8E88-1D60E89A237B}.Release|x64.Build.0 = Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|Win32.ActiveCfg = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|Win32.Build.0 = Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|x64.ActiveCfg = Debug|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|x64.Build.0 = Debug|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|Win32.ActiveCfg = DLL Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|Win32.Build.0 = DLL Debug|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|x64.ActiveCfg = DLL Debug|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Debug|x64.Build.0 = DLL Debug|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|Win32.ActiveCfg = DLL Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|Win32.Build.0 = DLL Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|x64.ActiveCfg = DLL Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.DLL Release|x64.Build.0 = DLL Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.ActiveCfg = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.Build.0 = Release|Win32 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|x64.ActiveCfg = Release|x64 + {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0CFCC869-45D3-42AD-BA73-29938093A38F} + EndGlobalSection +EndGlobal diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN-SRTP-KDF-140-3/wolfssl-fips.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,391 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + DLL Debug + Win32 + + + DLL Debug + x64 + + + DLL Release + Win32 + + + DLL Release + x64 + + + Release + Win32 + + + Release + x64 + + + + {73973223-5EE8-41CA-8E88-1D60E89A237B} + wolfssl-fips + Win32Proj + + + + StaticLibrary + v142 + Unicode + true + + + DynamicLibrary + v142 + Unicode + true + + + StaticLibrary + v142 + Unicode + true + + + DynamicLibrary + v142 + Unicode + true + + + StaticLibrary + v142 + Unicode + + + DynamicLibrary + v142 + Unicode + + + StaticLibrary + v142 + Unicode + + + DynamicLibrary + v142 + Unicode + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)$(Configuration)\$(Platform)\ + $(Configuration)\$(Platform)\$(ProjectName)_obj\ + + + false + + + false + + + false + + + false + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + 0x5A000000 + false + false + true + + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + + + Disabled + ./;../../;%(AdditionalIncludeDirectories) + BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level4 + ProgramDatabase + 4206;4214;4706;%(DisableSpecificWarnings) + + + ws2_32.lib;%(AdditionalDependencies) + 0x5A000000 + false + false + true + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + Level3 + ProgramDatabase + false + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + false + 0x5A000000 + true + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + Level3 + ProgramDatabase + false + + + + + MaxSpeed + true + ./;../../;%(AdditionalIncludeDirectories) + BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) + MultiThreadedDLL + true + Level3 + ProgramDatabase + + + ws2_32.lib;%(AdditionalDependencies) + false + + + + + + + + + + + + + + + + + + + + + false + false + false + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + + + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + + + + + + + + + + false + false + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/README.txt mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/README.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/README.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/README.txt 2024-08-03 07:30:00.000000000 +0000 @@ -29,8 +29,13 @@ FIPS library code and constant data and compares it with a known value in the code. -The Randomized Base Address setting needs to be disabled on all builds as the -feature throws off the in-core memory calculation causing the test to fail. +The following wolfCrypt FIPS project linker settings are required for the DLL Win32 configuration: +1) The [Randomized Base Address setting (ASLR)](https://learn.microsoft.com/en-us/cpp/build/reference/dynamicbase-use-address-space-layout-randomization?view=msvc-170) +needs to be disabled on all builds as the feature throws off the in-core memory calculation causing the test to fail. +2) The [Incremental Link](https://learn.microsoft.com/en-us/cpp/build/reference/incremental-link-incrementally?view=msvc-170) +option need turned off so function pointers go to actual code, not a jump instruction. +3) The [FixedBaseAddress](https://learn.microsoft.com/en-us/cpp/build/reference/fixed-fixed-base-address?view=msvc-170) +option to YES, which disables the support for ASLR. The "verifyCore" check value in the source fips_test.c needs to be updated when building the code. The POS performs this check and the default failure callback @@ -39,7 +44,6 @@ rebuild the code. When statically linking, you may have to recalculate your check value when changing your application. - # Build Options The default build options should be the proper default set of options: diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/test.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/test.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/test.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/test.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -208,7 +208,7 @@ Disabled .\;..\..\;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;HAVE_FIPS;HAVE_FIPS_VERSION=5;HAVE_FIPS_VERSION_MINOR=1;USE_CERT_BUFFERS_2048;USE_CERT_BUFFERS_256;WOLFSSL_USER_SETTINGS;CYASSL_DLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,16 @@ #ifndef _WIN_USER_SETTINGS_H_ #define _WIN_USER_SETTINGS_H_ +/* For FIPS 140-2 3389 build set to "#if 1" */ +#if 0 +#undef HAVE_FIPS +#define HAVE_FIPS +#undef HAVE_FIPS_VERSION +#define HAVE_FIPS_VERSION 2 +#undef HAVE_FIPS_VERSION_MINOR +#define HAVE_FIPS_VERSION_MINOR 0 +#endif + /* Set the following to 1 for WCv5.0-RC12 build. */ #if 0 #undef HAVE_FIPS @@ -67,8 +77,10 @@ #define WOLFSSL_VALIDATE_FFC_IMPORT #define HAVE_FFDHE_Q #define HAVE_PUBLIC_FFDHE + #ifdef _WIN64 #define WOLFSSL_AESNI #define HAVE_INTEL_RDSEED + #endif #define FORCE_FAILURE_RDSEED #endif /* FIPS v2 */ #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 5) @@ -107,6 +119,9 @@ #define WOLFSSL_AES_OFB #define FP_MAX_BITS 16384 #endif /* FIPS v5 */ + #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 6) + #define WOLFSSL_AES_XTS + #endif #else /* Enables blinding mode, to prevent timing attacks */ #define WC_RSA_BLINDING @@ -121,6 +136,7 @@ #define HAVE_SECURE_RENEGOTIATION #define HAVE_AESGCM + #define WOLFSSL_AES_XTS #define WOLFSSL_SHA384 #define WOLFSSL_SHA512 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.rc mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.rc --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.rc 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.rc 2024-08-03 07:30:00.000000000 +0000 @@ -51,8 +51,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 5,6,3,0 - PRODUCTVERSION 5,6,3,0 + FILEVERSION 5,7,2,0 + PRODUCTVERSION 5,7,2,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN VALUE "CompanyName", "wolfSSL Inc." VALUE "FileDescription", "The wolfSSL FIPS embedded SSL library is a lightweight, portable, C-language-based SSL/TLS library targeted at IoT, embedded, and RTOS environments primarily because of its size, speed, and feature set." - VALUE "FileVersion", "5.6.3.0" + VALUE "FileVersion", "5.7.2.0" VALUE "InternalName", "wolfssl-fips" - VALUE "LegalCopyright", "Copyright (C) 2022" + VALUE "LegalCopyright", "Copyright (C) 2024" VALUE "OriginalFilename", "wolfssl-fips.dll" VALUE "ProductName", "wolfSSL FIPS" - VALUE "ProductVersion", "5.6.3.0" + VALUE "ProductVersion", "5.7.2.0" END END BLOCK "VarFileInfo" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WIN10/wolfssl-fips.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -117,6 +117,18 @@ $(SolutionDir)$(Configuration)\$(Platform)\ $(Configuration)\$(Platform)\$(ProjectName)_obj\ + + false + + + false + + + false + + + false + Disabled @@ -146,6 +158,7 @@ 0x5A000000 false false + true @@ -206,6 +219,7 @@ ws2_32.lib;%(AdditionalDependencies) false 0x5A000000 + true @@ -244,10 +258,17 @@ + + + + + + + false false @@ -255,9 +276,13 @@ false + + + + @@ -312,6 +337,20 @@ false false ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(IntDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + false + false + ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) ml64.exe /DHAVE_FIPS /DHAVE_FIPS_VERSION=5 /DHAVE_FIPS_VERSION_MINOR=1 /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(IntDir)%(Filename).obj $(IntDir)%(Filename).obj diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WINCE/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WINCE/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WINCE/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WINCE/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,21 +1,93 @@ -#ifndef _WIN_USER_SETTINGS_H_ -#define _WIN_USER_SETTINGS_H_ +/* user_settings.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Custom wolfSSL user settings for GCC ARM */ + +#ifndef WOLFSSL_USER_SETTINGS_H +#define WOLFSSL_USER_SETTINGS_H +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +#undef WOLFSSL_GENERAL_ALIGNMENT +#define WOLFSSL_GENERAL_ALIGNMENT 4 -/* For FIPS Ready, uncomment the following: */ -/* #define WOLFSSL_FIPS_READY */ -#ifdef WOLFSSL_FIPS_READY - #undef HAVE_FIPS_VERSION - #define HAVE_FIPS_VERSION 3 +/* Multi-threaded support */ +#undef SINGLE_THREADED +#if 0 + #define SINGLE_THREADED +#else + #define ERROR_QUEUE_PER_THREAD /* if applicable otherwise comment out */ +#endif + +#ifdef SINGLE_THREADED + #undef NO_THREAD_LS + #define NO_THREAD_LS #endif +#undef WOLFSSL_USER_IO +//#define WOLFSSL_USER_IO + +#undef NO_WRITE_TEMP_FILES +#define NO_WRITE_TEMP_FILES -/* Verify this is Windows */ -#ifndef _WIN32 -#error This user_settings.h header is only designed for Windows +/* FIPS 140-3 OE specific section(s) */ + +/* Uncomment for Android devices */ +#undef ANDROID_V454 +/* #define ANDROID_V454 */ +#ifdef ANDROID_V454 + #if 1 + /* To have all printouts go to the app view on the device use: */ + extern int appendToTextView(const char* fmt, ...); + #undef printf + #define printf(format, ...) appendToTextView(format, ## __VA_ARGS__) + #else + #include + #define WOLFLOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "wolfCrypt_android", __VA_ARGS__) + #undef printf + #define printf WOLFLOGV + #endif #endif -/* Configurations */ -#define WOLFCRYPT_ONLY +/* Uncomment for WINCE 6.0 devices. NOTE: _WIN32_WCE defined by system */ +#if 1 + #define NO_WOLFSSL_DIR + #define WOLFSSL_NO_ATOMICS + #define WC_NO_ASYNC_THREADING + #define USE_WINDOWS_API + #define WOLFSSL_SMALL_STACK + #define MAX_SUPPORTED_THREADS 1024 + #define MAX_SUPPORTED_PRIV_KEYS 1024 + #define MAX_CONFIGURED_THREAD 512 +#endif + +/* ------------------------------------------------------------------------- */ +/* Math Configuration */ +/* ------------------------------------------------------------------------- */ +#undef SIZEOF_LONG_LONG +#define SIZEOF_LONG_LONG 8 #undef USE_FAST_MATH #if 1 @@ -24,27 +96,39 @@ #undef TFM_TIMING_RESISTANT #define TFM_TIMING_RESISTANT + #undef TFM_NO_ASM + #define TFM_NO_ASM + /* Optimizations */ //#define TFM_ARM + + /* Maximum math bits (Max RSA key bits * 2) */ + #undef FP_MAX_BITS + #define FP_MAX_BITS 16384 +#else + #define WOLFSSL_SP_MATH_ALL + #define WOLFSSL_SP_INT_NEGATIVE + /* Maximum math bits (largest supported key bits) */ + #undef SP_INT_BITS + #define SP_INT_BITS 8192 #endif /* Wolf Single Precision Math */ #undef WOLFSSL_SP -#if 0 - #define WOLFSSL_SP +#if 0 /* SP Assembly Speedups (wPAA) */ + //#define WOLFSSL_SP //#define WOLFSSL_SP_SMALL /* use smaller version of code */ - #define WOLFSSL_HAVE_SP_RSA - #define WOLFSSL_HAVE_SP_DH - #define WOLFSSL_HAVE_SP_ECC - //#define WOLFSSL_SP_CACHE_RESISTANT - //#define WOLFSSL_SP_MATH /* only SP math - eliminates fast math code */ - - /* SP Assembly Speedups */ - //#define WOLFSSL_SP_ASM /* required if using the ASM versions */ - //#define WOLFSSL_SP_ARM32_ASM + //#define WOLFSSL_SP_1024 + //#define WOLFCRYPT_HAVE_SAKKE /* Note: Sakke can be enabled with 1024-bit support */ + //#define WOLFSSL_SP_4096 /* Explicitly enable 4096-bit support (2048/3072 on by default) */ + //#define WOLFSSL_SP_384 /* Explicitly enable 384-bit support (others on by default) */ + //#define WOLFSSL_SP_521 /* Explicitly enable 521-bit support (others on by default) */ + //#define WOLFSSL_HAVE_SP_RSA + //#define WOLFSSL_HAVE_SP_DH + //#define WOLFSSL_HAVE_SP_ECC + /* If no PAA, leave out */ + //#define WOLFSSL_ARMASM //#define WOLFSSL_SP_ARM64_ASM - //#define WOLFSSL_SP_ARM_THUMB_ASM - //#define WOLFSSL_SP_ARM_CORTEX_M_ASM #endif /* ------------------------------------------------------------------------- */ @@ -52,288 +136,697 @@ /* ------------------------------------------------------------------------- */ #undef HAVE_FIPS #if 1 + + #define WOLFCRYPT_FIPS_CORE_HASH_VALUE C82E8BD05125ED82DE72A521EEB369E026526D089ADCB6FB2B943479A9D5DB63 #define HAVE_FIPS #undef HAVE_FIPS_VERSION - #define HAVE_FIPS_VERSION 2 + #define HAVE_FIPS_VERSION 5 - #ifdef SINGLE_THREADED - #undef NO_THREAD_LS - #define NO_THREAD_LS - #else - #ifndef USE_WINDOWS_API - #define USE_WINDOWS_API - #endif - #endif + #undef HAVE_FIPS_VERSION_MINOR + #define HAVE_FIPS_VERSION_MINOR 2 - #undef NO_ATTRIBUTE_CONSTRUCTOR - //#define NO_ATTRIBUTE_CONSTRUCTOR + #undef WOLFSSL_WOLFSSH + #define WOLFSSL_WOLFSSH + + #undef WC_RNG_SEED_CB + #define WC_RNG_SEED_CB + + #if 0 + #undef NO_ATTRIBUTE_CONSTRUCTOR + #define NO_ATTRIBUTE_CONSTRUCTOR + #endif #endif -/* FIPS */ -//#define OPENSSL_EXTRA -//#define HAVE_THREAD_LS -#define WOLFSSL_KEY_GEN -#define HAVE_AESGCM -#define HAVE_HASHDRBG -#define WOLFSSL_SHA384 -#define WOLFSSL_SHA512 -#define NO_PSK -#define NO_RC4 -//#define NO_DSA -#define NO_MD4 +/* ------------------------------------------------------------------------- */ +/* Crypto */ +/* ------------------------------------------------------------------------- */ +/* RSA */ +#undef NO_RSA +#if 1 -#if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) - /* ------------------------------------------------------------------------- */ - /* Crypto */ - /* ------------------------------------------------------------------------- */ - #define USE_CERT_BUFFERS_2048 - #define USE_CERT_BUFFERS_256 - /* RSA */ - #undef NO_RSA + /* half as much memory but twice as slow */ + #undef RSA_LOW_MEM + //#define RSA_LOW_MEM + + /* Enables blinding mode, to prevent timing attacks */ #if 1 - #ifdef USE_FAST_MATH - /* Maximum math bits (Max RSA key bits * 2) */ - #undef FP_MAX_BITS - #define FP_MAX_BITS 8192 - #endif + #undef WC_RSA_BLINDING + #define WC_RSA_BLINDING + #else + #undef WC_NO_HARDEN + #define WC_NO_HARDEN + #endif - /* half as much memory but twice as slow */ - #undef RSA_LOW_MEM - //#define RSA_LOW_MEM - - /* Enables blinding mode, to prevent timing attacks */ - #if 0 - #undef WC_RSA_BLINDING - #define WC_RSA_BLINDING - #else - #undef WC_NO_HARDEN - #define WC_NO_HARDEN - #endif + /* RSA PSS Support */ + #if 1 + #undef WC_RSA_PSS + #define WC_RSA_PSS - /* RSA PSS Support */ - #if 1 - #define WC_RSA_PSS - #endif + #undef WOLFSSL_PSS_LONG_SALT + #define WOLFSSL_PSS_LONG_SALT - #if 1 - #define WC_RSA_NO_PADDING - #endif - #else - #define NO_RSA + #undef WOLFSSL_PSS_SALT_LEN_DISCOVER + #define WOLFSSL_PSS_SALT_LEN_DISCOVER #endif - /* ECC */ - #undef HAVE_ECC + #if 1 - #define HAVE_ECC + #define WC_RSA_NO_PADDING + #endif +#else + #define NO_RSA +#endif - /* Manually define enabled curves */ - #undef ECC_USER_CURVES - //#define ECC_USER_CURVES - - #ifdef ECC_USER_CURVES - /* Manual Curve Selection */ - //#define HAVE_ECC192 - //#define HAVE_ECC224 - #undef NO_ECC256 - //#define HAVE_ECC384 - //#define HAVE_ECC521 - #endif +/* ECC */ +#undef HAVE_ECC +#if 1 + #define HAVE_ECC - /* Fixed point cache (speeds repeated operations against same private key) */ - #undef FP_ECC - //#define FP_ECC - #ifdef FP_ECC - /* Bits / Entries */ - #undef FP_ENTRIES - #define FP_ENTRIES 2 - #undef FP_LUT - #define FP_LUT 4 - #endif + /* Manually define enabled curves */ + #undef ECC_USER_CURVES + //#define ECC_USER_CURVES + + #ifdef ECC_USER_CURVES + /* Manual Curve Selection */ + #define HAVE_ECC192 + #define HAVE_ECC224 + #undef NO_ECC256 + #define HAVE_ECC256 + #define HAVE_ECC384 + #define HAVE_ECC521 + #endif - /* Optional ECC calculation method */ - /* Note: doubles heap usage, but slightly faster */ - #undef ECC_SHAMIR - #define ECC_SHAMIR - - /* Reduces heap usage, but slower */ - #undef ECC_TIMING_RESISTANT - #define ECC_TIMING_RESISTANT - - #ifdef HAVE_FIPS - #undef HAVE_ECC_CDH - #define HAVE_ECC_CDH /* Enable cofactor support */ + /* Fixed point cache (speeds repeated operations against same private key) */ + #undef FP_ECC + //#define FP_ECC + #ifdef FP_ECC + /* Bits / Entries */ + #undef FP_ENTRIES + #define FP_ENTRIES 2 + #undef FP_LUT + #define FP_LUT 4 + #endif - #undef NO_STRICT_ECDSA_LEN - #define NO_STRICT_ECDSA_LEN /* Do not force fixed len w/ FIPS */ + /* Optional ECC calculation method */ + /* Note: doubles heap usage, but slightly faster */ + #undef ECC_SHAMIR + #define ECC_SHAMIR - #undef WOLFSSL_VALIDATE_ECC_IMPORT - #define WOLFSSL_VALIDATE_ECC_IMPORT /* Validate import */ + /* Reduces heap usage, but slower */ + #undef ECC_TIMING_RESISTANT + #define ECC_TIMING_RESISTANT + + #ifdef HAVE_FIPS + #undef HAVE_ECC_CDH + #define HAVE_ECC_CDH /* Enable cofactor support */ + + #undef NO_STRICT_ECDSA_LEN + #define NO_STRICT_ECDSA_LEN /* Do not force fixed len w/ FIPS */ + + #undef WOLFSSL_VALIDATE_ECC_IMPORT + #define WOLFSSL_VALIDATE_ECC_IMPORT /* Validate import */ + + #undef WOLFSSL_VALIDATE_ECC_KEYGEN + #define WOLFSSL_VALIDATE_ECC_KEYGEN /* Validate generated keys */ + + #undef WOLFSSL_ECDSA_SET_K + #define WOLFSSL_ECDSA_SET_K + + #endif + + /* Compressed Key Support */ + #undef HAVE_COMP_KEY + //#define HAVE_COMP_KEY + + /* Use alternate ECC size for ECC math */ + #ifdef USE_FAST_MATH + /* MAX ECC BITS = ROUND8(MAX ECC) * 2 */ + #ifdef NO_RSA + /* Custom fastmath size if not using RSA */ + #undef FP_MAX_BITS + #define FP_MAX_BITS (256 * 2) + #else + #undef ALT_ECC_SIZE + #define ALT_ECC_SIZE + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ + //#undef FP_MAX_BITS_ECC + //#define FP_MAX_BITS_ECC (256 * 2) #endif - /* Compressed Key Support */ - #undef HAVE_COMP_KEY - //#define HAVE_COMP_KEY - - /* Use alternate ECC size for ECC math */ - #ifdef USE_FAST_MATH - /* MAX ECC BITS = ROUND8(MAX ECC) * 2 */ - #ifdef NO_RSA - /* Custom fastmath size if not using RSA */ - #undef FP_MAX_BITS - #define FP_MAX_BITS (256 * 2) - #else - #undef ALT_ECC_SIZE - #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ - //#undef FP_MAX_BITS_ECC - //#define FP_MAX_BITS_ECC (256 * 2) - #endif - - /* Speedups specific to curve */ - #ifndef NO_ECC256 - #undef TFM_ECC256 - #define TFM_ECC256 - #endif + /* Speedups specific to curve */ + #ifndef NO_ECC256 + #undef TFM_ECC256 + #define TFM_ECC256 #endif #endif +#endif - /* AES */ - #undef NO_AES +/* DH */ +#undef NO_DH +#if 1 + /* Use table for DH instead of -lm (math) lib dependency */ #if 1 - #undef HAVE_AES_CBC - #define HAVE_AES_CBC + #define HAVE_DH_DEFAULT_PARAMS + #define WOLFSSL_DH_CONST + #define HAVE_FFDHE_2048 + #define HAVE_FFDHE_3072 + #define HAVE_FFDHE_4096 + #define HAVE_FFDHE_6144 + #define HAVE_FFDHE_8192 + #endif + + #ifdef HAVE_FIPS + #define WOLFSSL_VALIDATE_FFC_IMPORT + #define HAVE_FFDHE_Q + #endif +#else + #define NO_DH +#endif - #undef HAVE_AESGCM - #define HAVE_AESGCM - /* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */ - //#define GCM_SMALL - //#define GCM_WORD32 - #define GCM_TABLE +/* AES */ +#undef NO_AES +#if 1 + #undef HAVE_AES_CBC + #define HAVE_AES_CBC - #undef WOLFSSL_AES_DIRECT - #define WOLFSSL_AES_DIRECT + #undef HAVE_AESGCM + #define HAVE_AESGCM - #undef HAVE_AES_ECB - #define HAVE_AES_ECB + /* GCM Method (slowest to fastest): GCM_SMALL, GCM_WORD32, GCM_TABLE or + * GCM_TABLE_4BIT */ + #define GCM_TABLE_4BIT - #undef WOLFSSL_AES_COUNTER - #define WOLFSSL_AES_COUNTER + #undef WOLFSSL_AES_DIRECT + #define WOLFSSL_AES_DIRECT - #undef HAVE_AESCCM - #define HAVE_AESCCM + #undef HAVE_AES_ECB + #define HAVE_AES_ECB - #else - #define NO_AES - #endif + #undef WOLFSSL_AES_COUNTER + #define WOLFSSL_AES_COUNTER + + #undef HAVE_AESCCM + #define HAVE_AESCCM + + #undef WOLFSSL_AES_OFB + #define WOLFSSL_AES_OFB +#else + #define NO_AES +#endif - /* DES3 */ - #undef NO_DES3 +/* DES3 */ +#undef NO_DES3 +#if 0 #if 1 - #else - #define NO_DES3 + #undef WOLFSSL_DES_ECB + #define WOLFSSL_DES_ECB #endif +#else + #define NO_DES3 +#endif + +/* ChaCha20 / Poly1305 */ +#undef HAVE_CHACHA +#undef HAVE_POLY1305 +#if 0 + #define HAVE_CHACHA + #define HAVE_POLY1305 + + /* Needed for Poly1305 */ + #undef HAVE_ONE_TIME_AUTH + #define HAVE_ONE_TIME_AUTH +#endif + +/* Ed25519 / Curve25519 */ +#undef HAVE_CURVE25519 +#undef HAVE_ED25519 +#if 0 + #define HAVE_CURVE25519 + #define HAVE_ED25519 /* ED25519 Requires SHA512 */ - /* ------------------------------------------------------------------------- */ - /* Hashing */ - /* ------------------------------------------------------------------------- */ - /* Sha */ - #undef NO_SHA + /* Optionally use small math (less flash usage, but much slower) */ #if 1 - /* 1k smaller, but 25% slower */ - //#define USE_SLOW_SHA - #else - #define NO_SHA + #define CURVED25519_SMALL #endif +#endif - /* Sha256 */ - #undef NO_SHA256 - #if 1 - /* not unrolled - ~2k smaller and ~25% slower */ - //#define USE_SLOW_SHA256 - /* Sha224 */ - #if 1 - #define WOLFSSL_SHA224 - #endif - #else - #define NO_SHA256 - #endif +/* ------------------------------------------------------------------------- */ +/* Hashing */ +/* ------------------------------------------------------------------------- */ +/* Sha */ +#undef NO_SHA +#if 1 + /* 1k smaller, but 25% slower */ + //#define USE_SLOW_SHA +#else + #define NO_SHA +#endif + +/* Sha256 */ +#undef NO_SHA256 +#if 1 + /* not unrolled - ~2k smaller and ~25% slower */ + //#define USE_SLOW_SHA256 - /* Sha512 */ - #undef WOLFSSL_SHA512 + /* Sha224 */ #if 1 - #define WOLFSSL_SHA512 + #define WOLFSSL_SHA224 + #endif +#else + #define NO_SHA256 +#endif - /* Sha384 */ - #undef WOLFSSL_SHA384 - #if 1 - #define WOLFSSL_SHA384 - #endif +/* Sha512 */ +#undef WOLFSSL_SHA512 +#if 1 + #define WOLFSSL_SHA512 - /* over twice as small, but 50% slower */ - //#define USE_SLOW_SHA512 - #endif + #undef WOLFSSL_NOSHA512_224 /* Not in FIPS mode */ + #undef WOLFSSL_NOSHA512_256 /* Not in FIPS mode */ - /* Sha3 */ - #undef WOLFSSL_SHA3 + /* Sha384 */ + #undef WOLFSSL_SHA384 #if 1 - #define WOLFSSL_SHA3 + #define WOLFSSL_SHA384 #endif - /* MD5 */ - #undef NO_MD5 - #if 0 + /* over twice as small, but 50% slower */ + //#define USE_SLOW_SHA512 +#endif - #else - #define NO_MD5 - #endif +/* Sha3 */ +#undef WOLFSSL_SHA3 +#if 1 + #define WOLFSSL_SHA3 + #define Sha3 wc_Sha3 +#endif - /* HKDF */ - #undef HAVE_HKDF - #if 1 - #define HAVE_HKDF +/* MD5 */ +#undef NO_MD5 +#if 0 + +#else + #define NO_MD5 +#endif + +/* HKDF / PRF */ +#undef HAVE_HKDF +#if 1 + #define HAVE_HKDF + #define WOLFSSL_HAVE_PRF +#endif + +/* CMAC */ +#undef WOLFSSL_CMAC +#if 1 + #define WOLFSSL_CMAC +#endif + + +/* ------------------------------------------------------------------------- */ +/* Benchmark / Test */ +/* ------------------------------------------------------------------------- */ +/* Use reduced benchmark / test sizes */ +#undef BENCH_EMBEDDED +#define BENCH_EMBEDDED + +#undef USE_CERT_BUFFERS_2048 +#define USE_CERT_BUFFERS_2048 + +#undef USE_CERT_BUFFERS_1024 +//#define USE_CERT_BUFFERS_1024 + +#undef USE_CERT_BUFFERS_256 +#define USE_CERT_BUFFERS_256 + + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ + +#undef DEBUG_WOLFSSL +#undef NO_ERROR_STRINGS +#if 1 + #define DEBUG_WOLFSSL +#else + #if 0 + #define NO_ERROR_STRINGS #endif +#endif + + +/* ------------------------------------------------------------------------- */ +/* Memory */ +/* ------------------------------------------------------------------------- */ + +/* Override Memory API's */ +#if 0 + #undef XMALLOC_OVERRIDE + #define XMALLOC_OVERRIDE - /* CMAC */ - #undef WOLFSSL_CMAC + /* prototypes for user heap override functions */ + /* Note: Realloc only required for normal math */ + #include /* for size_t */ + extern void *myMalloc(size_t n, void* heap, int type); + extern void myFree(void *p, void* heap, int type); + extern void *myRealloc(void *p, size_t n, void* heap, int type); + + #define XMALLOC(n, h, t) myMalloc(n, h, t) + #define XFREE(p, h, t) myFree(p, h, t) + #define XREALLOC(p, n, h, t) myRealloc(p, n, h, t) +#endif + +#if 0 + /* Static memory requires fast math */ + #define WOLFSSL_STATIC_MEMORY + + /* Disable fallback malloc/free */ + #define WOLFSSL_NO_MALLOC #if 1 - #define WOLFSSL_CMAC + #define WOLFSSL_MALLOC_CHECK /* trap malloc failure */ #endif +#endif - /* DH */ - #undef NO_DH - #if 1 - /* Use table for DH instead of -lm (math) lib dependency */ - #if 0 - #define WOLFSSL_DH_CONST - #define HAVE_FFDHE_2048 - #define HAVE_FFDHE_4096 - //#define HAVE_FFDHE_6144 - //#define HAVE_FFDHE_8192 - #endif +/* Memory callbacks */ +#if 1 + #undef USE_WOLFSSL_MEMORY + #define USE_WOLFSSL_MEMORY - #ifdef HAVE_FIPS - #define WOLFSSL_VALIDATE_FFC_IMPORT - #define HAVE_FFDHE_Q - #endif - #else - #define NO_DH + /* Use this to measure / print heap usage */ + #if 0 + #undef WOLFSSL_TRACK_MEMORY +// #define WOLFSSL_TRACK_MEMORY + + #undef WOLFSSL_DEBUG_MEMORY + //#define WOLFSSL_DEBUG_MEMORY + + #undef WOLFSSL_DEBUG_MEMORY_PRINT + //#define WOLFSSL_DEBUG_MEMORY_PRINT + #endif +#else + #ifndef WOLFSSL_STATIC_MEMORY + #define NO_WOLFSSL_MEMORY + /* Otherwise we will use stdlib malloc, free and realloc */ #endif -#endif /* FIPS v2 */ +#endif -//#define DEBUG_WOLFSSL + +/* ------------------------------------------------------------------------- */ +/* Port */ +/* ------------------------------------------------------------------------- */ + +/* Override Current Time */ +/* Allows custom "custom_time()" function to be used for benchmark */ +//#define WOLFSSL_USER_CURRTIME +//#define WOLFSSL_GMTIME +//#define USER_TICKS +//extern unsigned long my_time(unsigned long* timer); +//#define XTIME my_time + + +/* ------------------------------------------------------------------------- */ +/* RNG */ +/* ------------------------------------------------------------------------- */ + +/* Seed Source */ + /* Seed Source */ +// extern int my_rng_generate_seed(unsigned char* output, int sz); +// #undef CUSTOM_RAND_GENERATE_SEED +// #define CUSTOM_RAND_GENERATE_SEED my_rng_generate_seed + +/* Choose RNG method */ +#if 1 + /* Use built-in P-RNG (SHA256 based) with HW RNG */ + /* P-RNG + HW RNG (P-RNG is ~8K) */ + //#define WOLFSSL_GENSEED_FORTEST + #undef HAVE_HASHDRBG + #define HAVE_HASHDRBG +#else + #undef WC_NO_HASHDRBG + #define WC_NO_HASHDRBG + + /* Bypass P-RNG and use only HW RNG */ + extern int my_rng_gen_block(unsigned char* output, unsigned int sz); + #undef CUSTOM_RAND_GENERATE_BLOCK + #define CUSTOM_RAND_GENERATE_BLOCK my_rng_gen_block +#endif + + +/* ------------------------------------------------------------------------- */ +/* Custom Standard Lib */ +/* ------------------------------------------------------------------------- */ +/* Allows override of all standard library functions */ +#undef STRING_USER +#if 0 + #define STRING_USER + + #include + + #undef USE_WOLF_STRSEP + #define USE_WOLF_STRSEP + #define XSTRSEP(s1,d) wc_strsep((s1),(d)) + + #undef USE_WOLF_STRTOK + #define USE_WOLF_STRTOK + #define XSTRTOK(s1,d,ptr) wc_strtok((s1),(d),(ptr)) + + #define XSTRNSTR(s1,s2,n) mystrnstr((s1),(s2),(n)) + + #define XMEMCPY(d,s,l) memcpy((d),(s),(l)) + #define XMEMSET(b,c,l) memset((b),(c),(l)) + #define XMEMCMP(s1,s2,n) memcmp((s1),(s2),(n)) + #define XMEMMOVE(d,s,l) memmove((d),(s),(l)) + + #define XSTRLEN(s1) strlen((s1)) + #define XSTRNCPY(s1,s2,n) strncpy((s1),(s2),(n)) + #define XSTRSTR(s1,s2) strstr((s1),(s2)) + + #define XSTRNCMP(s1,s2,n) strncmp((s1),(s2),(n)) + #define XSTRNCAT(s1,s2,n) strncat((s1),(s2),(n)) + #define XSTRNCASECMP(s1,s2,n) strncasecmp((s1),(s2),(n)) + + #define XSNPRINTF snprintf +#endif + + + +/* ------------------------------------------------------------------------- */ +/* Enable Features */ +/* ------------------------------------------------------------------------- */ +#undef WOLFSSL_ASN_TEMPLATE +#define WOLFSSL_ASN_TEMPLATE + +#undef WOLFSSL_ASN_PRINT +#define WOLFSSL_ASN_PRINT + +#undef WOLFSSL_TLS13 +#if 1 + #define WOLFSSL_TLS13 +#endif + +#undef WOLFSSL_KEY_GEN +#if 1 + #define WOLFSSL_KEY_GEN +#endif + +#undef KEEP_PEER_CERT +//#define KEEP_PEER_CERT + +#undef HAVE_TLS_EXTENSIONS +#define HAVE_TLS_EXTENSIONS + +#undef HAVE_EXTENDED_MASTER +#define HAVE_EXTENDED_MASTER + +#undef HAVE_SUPPORTED_CURVES +#define HAVE_SUPPORTED_CURVES + +#undef WOLFSSL_BASE64_ENCODE +#define WOLFSSL_BASE64_ENCODE + +#undef WOLFSSL_NO_HASH_RAW +#define WOLFSSL_NO_HASH_RAW + +/* TLS Session Cache */ +#if 0 + #define SMALL_SESSION_CACHE +#else + #define NO_SESSION_CACHE +#endif + +#undef OPENSSL_EXTRA +//#define OPENSSL_EXTRA + +#undef WOLFSSL_DER_LOAD +#define WOLFSSL_DER_LOAD + +#undef HAVE_SESSION_TICKET +#define HAVE_SESSION_TICKET + +#undef HAVE_EX_DATA +#define HAVE_EX_DATA + +#undef HAVE_ENCRYPT_THEN_MAC +#define HAVE_ENCRYPT_THEN_MAC + +#undef WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_GEN + +#undef ATOMIC_USER +#define ATOMIC_USER + +#undef HAVE_SECRET_CALLBACK +#define HAVE_SECRET_CALLBACK + +/* wolfEngine */ +#if 1 + #define OPENSSL_COEXIST + + /* HKDF for engine */ + #undef HAVE_HKDF + #if 1 + #define HAVE_HKDF + #define HAVE_X963_KDF + #endif + + #undef WOLFSSL_PUBLIC_MP + #define WOLFSSL_PUBLIC_MP + + #undef NO_OLD_RNGNAME + #define NO_OLD_RNGNAME + + #undef NO_OLD_WC_NAMES + #define NO_OLD_WC_NAMES + + #undef NO_OLD_SSL_NAMES + #define NO_OLD_SSL_NAMES + + #undef NO_OLD_SHA_NAMES + #define NO_OLD_SHA_NAMES + + #undef NO_OLD_MD5_NAME + #define NO_OLD_MD5_NAME + + #undef NO_OLD_SHA256_NAMES + #define NO_OLD_SHA256_NAMES +#endif + +#undef WOLFSSL_SYS_CA_CERTS +#define WOLFSSL_SYS_CA_CERTS + +#undef LIBWOLFSSL_GLOBAL_EXTRA_CFLAGS +#define LIBWOLFSSL_GLOBAL_EXTRA_CFLAGS + +#undef HAVE_SERVER_RENEGOTIATION_INFO +#define HAVE_SERVER_RENEGOTIATION_INFO + +/* ------------------------------------------------------------------------- */ +/* Disable Features */ +/* ------------------------------------------------------------------------- */ +#undef NO_WOLFSSL_SERVER +//#define NO_WOLFSSL_SERVER + +#undef NO_WOLFSSL_CLIENT +//#define NO_WOLFSSL_CLIENT + +#undef NO_CRYPT_TEST +//#define NO_CRYPT_TEST + +#undef NO_CRYPT_BENCHMARK +//#define NO_CRYPT_BENCHMARK + +#undef WOLFCRYPT_ONLY +#define WOLFCRYPT_ONLY + +/* In-lining of misc.c functions */ +/* If defined, must include wolfcrypt/src/misc.c in build */ +/* Slower, but about 1k smaller */ +#undef NO_INLINE +//#define NO_INLINE + +#undef NO_FILESYSTEM +//#define NO_FILESYSTEM + +#undef NO_WRITEV +//#define NO_WRITEV + +#undef NO_MAIN_DRIVER #define NO_MAIN_DRIVER -/* wolfEngine settings */ -#define WOLFSSL_PUBLIC_MP -#define NO_WOLFSSL_DIR +#undef NO_DEV_RANDOM +//#define NO_DEV_RANDOM + +#undef NO_DSA +#define NO_DSA + +#undef NO_RC4 +#define NO_RC4 + +#undef NO_OLD_TLS +#define NO_OLD_TLS + +#undef NO_PSK +#define NO_PSK + +#undef NO_MD4 +#define NO_MD4 + +#undef NO_PWDBASED +//#define NO_PWDBASED + +#undef NO_CODING +//#define NO_CODING + +#undef NO_ASN_TIME +//#define NO_ASN_TIME + +#undef NO_CERTS +//#define NO_CERTS + +#undef NO_SIG_WRAPPER +//#define NO_SIG_WRAPPER + +#undef NO_DO178 +#define NO_DO178 + +#undef WOLFSSL_NO_SHAKE128 +#define WOLFSSL_NO_SHAKE128 + +#undef WOLFSSL_NO_SHAKE256 +#define WOLFSSL_NO_SHAKE256 + +/* wolfSSL engineering ACVP algo and operational testing only (Default: Off) */ +#if 1 + #undef WOLFSSL_PUBLIC_MP + #define WOLFSSL_PUBLIC_MP + + #undef OPTEST_LOGGING_ENABLED + //#define OPTEST_LOGGING_ENABLED + + #undef OPTEST_INVALID_LOGGING_ENABLED + //#define OPTEST_INVALID_LOGGING_ENABLED + + #undef NO_MAIN_OPTEST_DRIVER + #define NO_MAIN_OPTEST_DRIVER + + #undef DEBUG_FIPS_VERBOSE + #define DEBUG_FIPS_VERBOSE + + #undef HAVE_FORCE_FIPS_FAILURE + #define HAVE_FORCE_FIPS_FAILURE + + #undef NO_WRITE_TEMP_FILES + #define NO_WRITE_TEMPT_FILES +#endif + +#ifdef __cplusplus +} +#endif -//#define WOLFENGINE_DEBUG -/* TODO: Add WE_HAVE_* settings here */ -#endif /* _WIN_USER_SETTINGS_H_ */ +#endif /* WOLFSSL_USER_SETTINGS_H */ \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WORKBENCH/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WORKBENCH/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/WORKBENCH/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/WORKBENCH/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -10,6 +10,7 @@ ``` wolfcrypt/src/aes_asm.asm wolfcrypt/src/aes_gcm_asm.asm + wolfcrypt/src/aes_xts_asm.asm wolfcrypt/src/aes_asm.s examples/echoclient/ examples/echoserver/ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl-FIPS.xcodeproj/project.pbxproj 2024-08-03 07:30:00.000000000 +0000 @@ -96,57 +96,6 @@ 521646F51A8A7FF30062516A /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646871A8993770062516A /* types.h */; }; 521646F61A8A7FF30062516A /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646881A8993770062516A /* visibility.h */; }; 521646F71A8A7FF30062516A /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646891A8993770062516A /* wc_port.h */; }; - 521646F81A8A80030062516A /* callbacks.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 5216468A1A8993BB0062516A /* callbacks.h */; }; - 521646F91A8A80030062516A /* certs_test.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 5216468B1A8993BB0062516A /* certs_test.h */; }; - 521646FA1A8A80030062516A /* crl.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 5216468C1A8993BB0062516A /* crl.h */; }; - 521646FB1A8A80030062516A /* error-ssl.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 5216468D1A8993BB0062516A /* error-ssl.h */; }; - 521646FC1A8A80030062516A /* internal.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 5216468E1A8993BB0062516A /* internal.h */; }; - 521646FD1A8A80030062516A /* ocsp.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 5216468F1A8993BB0062516A /* ocsp.h */; }; - 521646FE1A8A80030062516A /* ssl.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 521646921A8993BB0062516A /* ssl.h */; }; - 521646FF1A8A80030062516A /* test.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 521646931A8993BB0062516A /* test.h */; }; - 521647001A8A80030062516A /* version.h in Copy Files */ = {isa = PBXBuildFile; fileRef = 521646941A8993BB0062516A /* version.h */; }; - 521647011A8A80100062516A /* aes.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646951A8993F50062516A /* aes.h */; }; - 521647021A8A80100062516A /* arc4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646961A8993F50062516A /* arc4.h */; }; - 521647031A8A80100062516A /* asn_public.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646971A8993F50062516A /* asn_public.h */; }; - 521647041A8A80100062516A /* asn.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646981A8993F50062516A /* asn.h */; }; - 521647051A8A80100062516A /* blake2-impl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646991A8993F50062516A /* blake2-impl.h */; }; - 521647061A8A80100062516A /* blake2-int.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469A1A8993F50062516A /* blake2-int.h */; }; - 521647071A8A80100062516A /* blake2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469B1A8993F50062516A /* blake2.h */; }; - 521647081A8A80100062516A /* camellia.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469C1A8993F50062516A /* camellia.h */; }; - 521647091A8A80100062516A /* chacha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469D1A8993F50062516A /* chacha.h */; }; - 5216470A1A8A80100062516A /* coding.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469E1A8993F50062516A /* coding.h */; }; - 5216470B1A8A80100062516A /* compress.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469F1A8993F50062516A /* compress.h */; }; - 5216470C1A8A80100062516A /* des3.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A01A8993F50062516A /* des3.h */; }; - 5216470D1A8A80100062516A /* dh.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A11A8993F50062516A /* dh.h */; }; - 5216470E1A8A80100062516A /* dsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A21A8993F50062516A /* dsa.h */; }; - 5216470F1A8A80100062516A /* ecc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A31A8993F50062516A /* ecc.h */; }; - 521647101A8A80100062516A /* error-crypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A41A8993F50062516A /* error-crypt.h */; }; - 521647111A8A80100062516A /* fips_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A51A8993F50062516A /* fips_test.h */; }; - 521647131A8A80100062516A /* hmac.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A71A8993F50062516A /* hmac.h */; }; - 521647141A8A80100062516A /* integer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A81A8993F50062516A /* integer.h */; }; - 521647151A8A80100062516A /* logging.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A91A8993F50062516A /* logging.h */; }; - 521647161A8A80100062516A /* md2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AA1A8993F50062516A /* md2.h */; }; - 521647171A8A80100062516A /* md4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AB1A8993F50062516A /* md4.h */; }; - 521647181A8A80100062516A /* md5.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AC1A8993F50062516A /* md5.h */; }; - 521647191A8A80100062516A /* memory.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AD1A8993F50062516A /* memory.h */; }; - 5216471A1A8A80100062516A /* misc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AE1A8993F50062516A /* misc.h */; }; - 5216471B1A8A80100062516A /* mpi_class.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AF1A8993F50062516A /* mpi_class.h */; }; - 5216471C1A8A80100062516A /* mpi_superclass.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B01A8993F50062516A /* mpi_superclass.h */; }; - 5216471D1A8A80100062516A /* pkcs7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B11A8993F50062516A /* pkcs7.h */; }; - 5216471E1A8A80100062516A /* poly1305.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B21A8993F50062516A /* poly1305.h */; }; - 5216471F1A8A80100062516A /* pwdbased.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B31A8993F50062516A /* pwdbased.h */; }; - 521647211A8A80100062516A /* random.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B51A8993F50062516A /* random.h */; }; - 521647221A8A80100062516A /* ripemd.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B61A8993F50062516A /* ripemd.h */; }; - 521647231A8A80100062516A /* rsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B71A8993F50062516A /* rsa.h */; }; - 521647241A8A80100062516A /* settings_comp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B81A8993F50062516A /* settings_comp.h */; }; - 521647251A8A80100062516A /* settings.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B91A8993F50062516A /* settings.h */; }; - 521647261A8A80100062516A /* sha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BA1A8993F50062516A /* sha.h */; }; - 521647271A8A80100062516A /* sha256.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BB1A8993F50062516A /* sha256.h */; }; - 521647281A8A80100062516A /* sha512.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BC1A8993F50062516A /* sha512.h */; }; - 521647291A8A80100062516A /* tfm.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BD1A8993F50062516A /* tfm.h */; }; - 5216472A1A8A80100062516A /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BE1A8993F50062516A /* types.h */; }; - 5216472B1A8A80100062516A /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BF1A8993F50062516A /* visibility.h */; }; - 5216472C1A8A80100062516A /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646C01A8993F50062516A /* wc_port.h */; }; 5216481D1A8AC2990062516A /* aes.c in Sources */ = {isa = PBXBuildFile; fileRef = 521648101A8AC2990062516A /* aes.c */; }; 5216481E1A8AC2990062516A /* des3.c in Sources */ = {isa = PBXBuildFile; fileRef = 521648111A8AC2990062516A /* des3.c */; }; 5216481F1A8AC2990062516A /* fips_test.c in Sources */ = {isa = PBXBuildFile; fileRef = 521648121A8AC2990062516A /* fips_test.c */; }; @@ -316,57 +265,6 @@ A4A54E641BC5C3E0002866CD /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646871A8993770062516A /* types.h */; }; A4A54E651BC5C3E0002866CD /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646881A8993770062516A /* visibility.h */; }; A4A54E661BC5C3E0002866CD /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646891A8993770062516A /* wc_port.h */; }; - A4A54E681BC5C3E0002866CD /* callbacks.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468A1A8993BB0062516A /* callbacks.h */; }; - A4A54E691BC5C3E0002866CD /* certs_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468B1A8993BB0062516A /* certs_test.h */; }; - A4A54E6A1BC5C3E0002866CD /* crl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468C1A8993BB0062516A /* crl.h */; }; - A4A54E6B1BC5C3E0002866CD /* error-ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468D1A8993BB0062516A /* error-ssl.h */; }; - A4A54E6C1BC5C3E0002866CD /* internal.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468E1A8993BB0062516A /* internal.h */; }; - A4A54E6D1BC5C3E0002866CD /* ocsp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468F1A8993BB0062516A /* ocsp.h */; }; - A4A54E6E1BC5C3E0002866CD /* ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646921A8993BB0062516A /* ssl.h */; }; - A4A54E6F1BC5C3E0002866CD /* test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646931A8993BB0062516A /* test.h */; }; - A4A54E701BC5C3E0002866CD /* version.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646941A8993BB0062516A /* version.h */; }; - A4A54E721BC5C3E0002866CD /* aes.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646951A8993F50062516A /* aes.h */; }; - A4A54E731BC5C3E0002866CD /* arc4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646961A8993F50062516A /* arc4.h */; }; - A4A54E741BC5C3E0002866CD /* asn_public.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646971A8993F50062516A /* asn_public.h */; }; - A4A54E751BC5C3E0002866CD /* asn.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646981A8993F50062516A /* asn.h */; }; - A4A54E761BC5C3E0002866CD /* blake2-impl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646991A8993F50062516A /* blake2-impl.h */; }; - A4A54E771BC5C3E0002866CD /* blake2-int.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469A1A8993F50062516A /* blake2-int.h */; }; - A4A54E781BC5C3E0002866CD /* blake2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469B1A8993F50062516A /* blake2.h */; }; - A4A54E791BC5C3E0002866CD /* camellia.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469C1A8993F50062516A /* camellia.h */; }; - A4A54E7A1BC5C3E0002866CD /* chacha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469D1A8993F50062516A /* chacha.h */; }; - A4A54E7B1BC5C3E0002866CD /* coding.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469E1A8993F50062516A /* coding.h */; }; - A4A54E7C1BC5C3E0002866CD /* compress.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469F1A8993F50062516A /* compress.h */; }; - A4A54E7D1BC5C3E0002866CD /* des3.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A01A8993F50062516A /* des3.h */; }; - A4A54E7E1BC5C3E0002866CD /* dh.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A11A8993F50062516A /* dh.h */; }; - A4A54E7F1BC5C3E0002866CD /* dsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A21A8993F50062516A /* dsa.h */; }; - A4A54E801BC5C3E0002866CD /* ecc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A31A8993F50062516A /* ecc.h */; }; - A4A54E811BC5C3E0002866CD /* error-crypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A41A8993F50062516A /* error-crypt.h */; }; - A4A54E821BC5C3E0002866CD /* fips_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A51A8993F50062516A /* fips_test.h */; }; - A4A54E841BC5C3E0002866CD /* hmac.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A71A8993F50062516A /* hmac.h */; }; - A4A54E851BC5C3E0002866CD /* integer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A81A8993F50062516A /* integer.h */; }; - A4A54E861BC5C3E0002866CD /* logging.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A91A8993F50062516A /* logging.h */; }; - A4A54E871BC5C3E0002866CD /* md2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AA1A8993F50062516A /* md2.h */; }; - A4A54E881BC5C3E0002866CD /* md4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AB1A8993F50062516A /* md4.h */; }; - A4A54E891BC5C3E0002866CD /* md5.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AC1A8993F50062516A /* md5.h */; }; - A4A54E8A1BC5C3E0002866CD /* memory.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AD1A8993F50062516A /* memory.h */; }; - A4A54E8B1BC5C3E0002866CD /* misc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AE1A8993F50062516A /* misc.h */; }; - A4A54E8C1BC5C3E0002866CD /* mpi_class.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AF1A8993F50062516A /* mpi_class.h */; }; - A4A54E8D1BC5C3E0002866CD /* mpi_superclass.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B01A8993F50062516A /* mpi_superclass.h */; }; - A4A54E8E1BC5C3E0002866CD /* pkcs7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B11A8993F50062516A /* pkcs7.h */; }; - A4A54E8F1BC5C3E0002866CD /* poly1305.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B21A8993F50062516A /* poly1305.h */; }; - A4A54E901BC5C3E0002866CD /* pwdbased.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B31A8993F50062516A /* pwdbased.h */; }; - A4A54E921BC5C3E0002866CD /* random.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B51A8993F50062516A /* random.h */; }; - A4A54E931BC5C3E0002866CD /* ripemd.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B61A8993F50062516A /* ripemd.h */; }; - A4A54E941BC5C3E0002866CD /* rsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B71A8993F50062516A /* rsa.h */; }; - A4A54E951BC5C3E0002866CD /* settings_comp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B81A8993F50062516A /* settings_comp.h */; }; - A4A54E961BC5C3E0002866CD /* settings.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B91A8993F50062516A /* settings.h */; }; - A4A54E971BC5C3E0002866CD /* sha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BA1A8993F50062516A /* sha.h */; }; - A4A54E981BC5C3E0002866CD /* sha256.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BB1A8993F50062516A /* sha256.h */; }; - A4A54E991BC5C3E0002866CD /* sha512.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BC1A8993F50062516A /* sha512.h */; }; - A4A54E9A1BC5C3E0002866CD /* tfm.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BD1A8993F50062516A /* tfm.h */; }; - A4A54E9B1BC5C3E0002866CD /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BE1A8993F50062516A /* types.h */; }; - A4A54E9C1BC5C3E0002866CD /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BF1A8993F50062516A /* visibility.h */; }; - A4A54E9D1BC5C3E0002866CD /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646C01A8993F50062516A /* wc_port.h */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -460,76 +358,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 521646C21A8A7B3B0062516A /* Copy Files */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl; - dstSubfolderSpec = 7; - files = ( - 521646F81A8A80030062516A /* callbacks.h in Copy Files */, - 521646F91A8A80030062516A /* certs_test.h in Copy Files */, - 521646FA1A8A80030062516A /* crl.h in Copy Files */, - 521646FB1A8A80030062516A /* error-ssl.h in Copy Files */, - 521646FC1A8A80030062516A /* internal.h in Copy Files */, - 521646FD1A8A80030062516A /* ocsp.h in Copy Files */, - 521646FE1A8A80030062516A /* ssl.h in Copy Files */, - 521646FF1A8A80030062516A /* test.h in Copy Files */, - 521647001A8A80030062516A /* version.h in Copy Files */, - ); - name = "Copy Files"; - runOnlyForDeploymentPostprocessing = 0; - }; - 521646C31A8A7B3D0062516A /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl/ctaocrypt; - dstSubfolderSpec = 7; - files = ( - 521647011A8A80100062516A /* aes.h in CopyFiles */, - 521647021A8A80100062516A /* arc4.h in CopyFiles */, - 521647031A8A80100062516A /* asn_public.h in CopyFiles */, - 521647041A8A80100062516A /* asn.h in CopyFiles */, - 521647051A8A80100062516A /* blake2-impl.h in CopyFiles */, - 521647061A8A80100062516A /* blake2-int.h in CopyFiles */, - 521647071A8A80100062516A /* blake2.h in CopyFiles */, - 521647081A8A80100062516A /* camellia.h in CopyFiles */, - 521647091A8A80100062516A /* chacha.h in CopyFiles */, - 5216470A1A8A80100062516A /* coding.h in CopyFiles */, - 5216470B1A8A80100062516A /* compress.h in CopyFiles */, - 5216470C1A8A80100062516A /* des3.h in CopyFiles */, - 5216470D1A8A80100062516A /* dh.h in CopyFiles */, - 5216470E1A8A80100062516A /* dsa.h in CopyFiles */, - 5216470F1A8A80100062516A /* ecc.h in CopyFiles */, - 521647101A8A80100062516A /* error-crypt.h in CopyFiles */, - 521647111A8A80100062516A /* fips_test.h in CopyFiles */, - 521647131A8A80100062516A /* hmac.h in CopyFiles */, - 521647141A8A80100062516A /* integer.h in CopyFiles */, - 521647151A8A80100062516A /* logging.h in CopyFiles */, - 521647161A8A80100062516A /* md2.h in CopyFiles */, - 521647171A8A80100062516A /* md4.h in CopyFiles */, - 521647181A8A80100062516A /* md5.h in CopyFiles */, - 521647191A8A80100062516A /* memory.h in CopyFiles */, - 5216471A1A8A80100062516A /* misc.h in CopyFiles */, - 5216471B1A8A80100062516A /* mpi_class.h in CopyFiles */, - 5216471C1A8A80100062516A /* mpi_superclass.h in CopyFiles */, - 5216471D1A8A80100062516A /* pkcs7.h in CopyFiles */, - 5216471E1A8A80100062516A /* poly1305.h in CopyFiles */, - 5216471F1A8A80100062516A /* pwdbased.h in CopyFiles */, - 521647211A8A80100062516A /* random.h in CopyFiles */, - 521647221A8A80100062516A /* ripemd.h in CopyFiles */, - 521647231A8A80100062516A /* rsa.h in CopyFiles */, - 521647241A8A80100062516A /* settings_comp.h in CopyFiles */, - 521647251A8A80100062516A /* settings.h in CopyFiles */, - 521647261A8A80100062516A /* sha.h in CopyFiles */, - 521647271A8A80100062516A /* sha256.h in CopyFiles */, - 521647281A8A80100062516A /* sha512.h in CopyFiles */, - 521647291A8A80100062516A /* tfm.h in CopyFiles */, - 5216472A1A8A80100062516A /* types.h in CopyFiles */, - 5216472B1A8A80100062516A /* visibility.h in CopyFiles */, - 5216472C1A8A80100062516A /* wc_port.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 52B1344B16F3C9E800C07B32 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -618,75 +446,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A4A54E671BC5C3E0002866CD /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl; - dstSubfolderSpec = 7; - files = ( - A4A54E681BC5C3E0002866CD /* callbacks.h in CopyFiles */, - A4A54E691BC5C3E0002866CD /* certs_test.h in CopyFiles */, - A4A54E6A1BC5C3E0002866CD /* crl.h in CopyFiles */, - A4A54E6B1BC5C3E0002866CD /* error-ssl.h in CopyFiles */, - A4A54E6C1BC5C3E0002866CD /* internal.h in CopyFiles */, - A4A54E6D1BC5C3E0002866CD /* ocsp.h in CopyFiles */, - A4A54E6E1BC5C3E0002866CD /* ssl.h in CopyFiles */, - A4A54E6F1BC5C3E0002866CD /* test.h in CopyFiles */, - A4A54E701BC5C3E0002866CD /* version.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A4A54E711BC5C3E0002866CD /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl/ctaocrypt; - dstSubfolderSpec = 7; - files = ( - A4A54E721BC5C3E0002866CD /* aes.h in CopyFiles */, - A4A54E731BC5C3E0002866CD /* arc4.h in CopyFiles */, - A4A54E741BC5C3E0002866CD /* asn_public.h in CopyFiles */, - A4A54E751BC5C3E0002866CD /* asn.h in CopyFiles */, - A4A54E761BC5C3E0002866CD /* blake2-impl.h in CopyFiles */, - A4A54E771BC5C3E0002866CD /* blake2-int.h in CopyFiles */, - A4A54E781BC5C3E0002866CD /* blake2.h in CopyFiles */, - A4A54E791BC5C3E0002866CD /* camellia.h in CopyFiles */, - A4A54E7A1BC5C3E0002866CD /* chacha.h in CopyFiles */, - A4A54E7B1BC5C3E0002866CD /* coding.h in CopyFiles */, - A4A54E7C1BC5C3E0002866CD /* compress.h in CopyFiles */, - A4A54E7D1BC5C3E0002866CD /* des3.h in CopyFiles */, - A4A54E7E1BC5C3E0002866CD /* dh.h in CopyFiles */, - A4A54E7F1BC5C3E0002866CD /* dsa.h in CopyFiles */, - A4A54E801BC5C3E0002866CD /* ecc.h in CopyFiles */, - A4A54E811BC5C3E0002866CD /* error-crypt.h in CopyFiles */, - A4A54E821BC5C3E0002866CD /* fips_test.h in CopyFiles */, - A4A54E841BC5C3E0002866CD /* hmac.h in CopyFiles */, - A4A54E851BC5C3E0002866CD /* integer.h in CopyFiles */, - A4A54E861BC5C3E0002866CD /* logging.h in CopyFiles */, - A4A54E871BC5C3E0002866CD /* md2.h in CopyFiles */, - A4A54E881BC5C3E0002866CD /* md4.h in CopyFiles */, - A4A54E891BC5C3E0002866CD /* md5.h in CopyFiles */, - A4A54E8A1BC5C3E0002866CD /* memory.h in CopyFiles */, - A4A54E8B1BC5C3E0002866CD /* misc.h in CopyFiles */, - A4A54E8C1BC5C3E0002866CD /* mpi_class.h in CopyFiles */, - A4A54E8D1BC5C3E0002866CD /* mpi_superclass.h in CopyFiles */, - A4A54E8E1BC5C3E0002866CD /* pkcs7.h in CopyFiles */, - A4A54E8F1BC5C3E0002866CD /* poly1305.h in CopyFiles */, - A4A54E901BC5C3E0002866CD /* pwdbased.h in CopyFiles */, - A4A54E921BC5C3E0002866CD /* random.h in CopyFiles */, - A4A54E931BC5C3E0002866CD /* ripemd.h in CopyFiles */, - A4A54E941BC5C3E0002866CD /* rsa.h in CopyFiles */, - A4A54E951BC5C3E0002866CD /* settings_comp.h in CopyFiles */, - A4A54E961BC5C3E0002866CD /* settings.h in CopyFiles */, - A4A54E971BC5C3E0002866CD /* sha.h in CopyFiles */, - A4A54E981BC5C3E0002866CD /* sha256.h in CopyFiles */, - A4A54E991BC5C3E0002866CD /* sha512.h in CopyFiles */, - A4A54E9A1BC5C3E0002866CD /* tfm.h in CopyFiles */, - A4A54E9B1BC5C3E0002866CD /* types.h in CopyFiles */, - A4A54E9C1BC5C3E0002866CD /* visibility.h in CopyFiles */, - A4A54E9D1BC5C3E0002866CD /* wc_port.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -779,57 +538,6 @@ 521646871A8993770062516A /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../../wolfssl/wolfcrypt/types.h; sourceTree = ""; }; 521646881A8993770062516A /* visibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../wolfssl/wolfcrypt/visibility.h; sourceTree = ""; }; 521646891A8993770062516A /* wc_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wc_port.h; path = ../../wolfssl/wolfcrypt/wc_port.h; sourceTree = ""; }; - 5216468A1A8993BB0062516A /* callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = callbacks.h; path = ../../cyassl/callbacks.h; sourceTree = ""; }; - 5216468B1A8993BB0062516A /* certs_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = certs_test.h; path = ../../cyassl/certs_test.h; sourceTree = ""; }; - 5216468C1A8993BB0062516A /* crl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crl.h; path = ../../cyassl/crl.h; sourceTree = ""; }; - 5216468D1A8993BB0062516A /* error-ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "error-ssl.h"; path = "../../cyassl/error-ssl.h"; sourceTree = ""; }; - 5216468E1A8993BB0062516A /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = internal.h; path = ../../cyassl/internal.h; sourceTree = ""; }; - 5216468F1A8993BB0062516A /* ocsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ocsp.h; path = ../../cyassl/ocsp.h; sourceTree = ""; }; - 521646921A8993BB0062516A /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ssl.h; path = ../../cyassl/ssl.h; sourceTree = ""; }; - 521646931A8993BB0062516A /* test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test.h; path = ../../cyassl/test.h; sourceTree = ""; }; - 521646941A8993BB0062516A /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../../cyassl/version.h; sourceTree = ""; }; - 521646951A8993F50062516A /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aes.h; path = ../../cyassl/ctaocrypt/aes.h; sourceTree = ""; }; - 521646961A8993F50062516A /* arc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arc4.h; path = ../../cyassl/ctaocrypt/arc4.h; sourceTree = ""; }; - 521646971A8993F50062516A /* asn_public.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = asn_public.h; path = ../../cyassl/ctaocrypt/asn_public.h; sourceTree = ""; }; - 521646981A8993F50062516A /* asn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = asn.h; path = ../../cyassl/ctaocrypt/asn.h; sourceTree = ""; }; - 521646991A8993F50062516A /* blake2-impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "blake2-impl.h"; path = "../../cyassl/ctaocrypt/blake2-impl.h"; sourceTree = ""; }; - 5216469A1A8993F50062516A /* blake2-int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "blake2-int.h"; path = "../../cyassl/ctaocrypt/blake2-int.h"; sourceTree = ""; }; - 5216469B1A8993F50062516A /* blake2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = blake2.h; path = ../../cyassl/ctaocrypt/blake2.h; sourceTree = ""; }; - 5216469C1A8993F50062516A /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = camellia.h; path = ../../cyassl/ctaocrypt/camellia.h; sourceTree = ""; }; - 5216469D1A8993F50062516A /* chacha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = chacha.h; path = ../../cyassl/ctaocrypt/chacha.h; sourceTree = ""; }; - 5216469E1A8993F50062516A /* coding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = coding.h; path = ../../cyassl/ctaocrypt/coding.h; sourceTree = ""; }; - 5216469F1A8993F50062516A /* compress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compress.h; path = ../../cyassl/ctaocrypt/compress.h; sourceTree = ""; }; - 521646A01A8993F50062516A /* des3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = des3.h; path = ../../cyassl/ctaocrypt/des3.h; sourceTree = ""; }; - 521646A11A8993F50062516A /* dh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dh.h; path = ../../cyassl/ctaocrypt/dh.h; sourceTree = ""; }; - 521646A21A8993F50062516A /* dsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dsa.h; path = ../../cyassl/ctaocrypt/dsa.h; sourceTree = ""; }; - 521646A31A8993F50062516A /* ecc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ecc.h; path = ../../cyassl/ctaocrypt/ecc.h; sourceTree = ""; }; - 521646A41A8993F50062516A /* error-crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "error-crypt.h"; path = "../../cyassl/ctaocrypt/error-crypt.h"; sourceTree = ""; }; - 521646A51A8993F50062516A /* fips_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fips_test.h; path = ../../cyassl/ctaocrypt/fips_test.h; sourceTree = ""; }; - 521646A71A8993F50062516A /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hmac.h; path = ../../cyassl/ctaocrypt/hmac.h; sourceTree = ""; }; - 521646A81A8993F50062516A /* integer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = integer.h; path = ../../cyassl/ctaocrypt/integer.h; sourceTree = ""; }; - 521646A91A8993F50062516A /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = logging.h; path = ../../cyassl/ctaocrypt/logging.h; sourceTree = ""; }; - 521646AA1A8993F50062516A /* md2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = md2.h; path = ../../cyassl/ctaocrypt/md2.h; sourceTree = ""; }; - 521646AB1A8993F50062516A /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = md4.h; path = ../../cyassl/ctaocrypt/md4.h; sourceTree = ""; }; - 521646AC1A8993F50062516A /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = md5.h; path = ../../cyassl/ctaocrypt/md5.h; sourceTree = ""; }; - 521646AD1A8993F50062516A /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = memory.h; path = ../../cyassl/ctaocrypt/memory.h; sourceTree = ""; }; - 521646AE1A8993F50062516A /* misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = misc.h; path = ../../cyassl/ctaocrypt/misc.h; sourceTree = ""; }; - 521646AF1A8993F50062516A /* mpi_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mpi_class.h; path = ../../cyassl/ctaocrypt/mpi_class.h; sourceTree = ""; }; - 521646B01A8993F50062516A /* mpi_superclass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mpi_superclass.h; path = ../../cyassl/ctaocrypt/mpi_superclass.h; sourceTree = ""; }; - 521646B11A8993F50062516A /* pkcs7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pkcs7.h; path = ../../cyassl/ctaocrypt/pkcs7.h; sourceTree = ""; }; - 521646B21A8993F50062516A /* poly1305.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = poly1305.h; path = ../../cyassl/ctaocrypt/poly1305.h; sourceTree = ""; }; - 521646B31A8993F50062516A /* pwdbased.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pwdbased.h; path = ../../cyassl/ctaocrypt/pwdbased.h; sourceTree = ""; }; - 521646B51A8993F50062516A /* random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = random.h; path = ../../cyassl/ctaocrypt/random.h; sourceTree = ""; }; - 521646B61A8993F50062516A /* ripemd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ripemd.h; path = ../../cyassl/ctaocrypt/ripemd.h; sourceTree = ""; }; - 521646B71A8993F50062516A /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rsa.h; path = ../../cyassl/ctaocrypt/rsa.h; sourceTree = ""; }; - 521646B81A8993F50062516A /* settings_comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = settings_comp.h; path = ../../cyassl/ctaocrypt/settings_comp.h; sourceTree = ""; }; - 521646B91A8993F50062516A /* settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = settings.h; path = ../../cyassl/ctaocrypt/settings.h; sourceTree = ""; }; - 521646BA1A8993F50062516A /* sha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha.h; path = ../../cyassl/ctaocrypt/sha.h; sourceTree = ""; }; - 521646BB1A8993F50062516A /* sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha256.h; path = ../../cyassl/ctaocrypt/sha256.h; sourceTree = ""; }; - 521646BC1A8993F50062516A /* sha512.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha512.h; path = ../../cyassl/ctaocrypt/sha512.h; sourceTree = ""; }; - 521646BD1A8993F50062516A /* tfm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tfm.h; path = ../../cyassl/ctaocrypt/tfm.h; sourceTree = ""; }; - 521646BE1A8993F50062516A /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../../cyassl/ctaocrypt/types.h; sourceTree = ""; }; - 521646BF1A8993F50062516A /* visibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../cyassl/ctaocrypt/visibility.h; sourceTree = ""; }; - 521646C01A8993F50062516A /* wc_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wc_port.h; path = ../../cyassl/ctaocrypt/wc_port.h; sourceTree = ""; }; 521648101A8AC2990062516A /* aes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = aes.c; path = ../../ctaocrypt/src/aes.c; sourceTree = ""; }; 521648111A8AC2990062516A /* des3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = des3.c; path = ../../ctaocrypt/src/des3.c; sourceTree = ""; }; 521648121A8AC2990062516A /* fips_test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = fips_test.c; path = ../../ctaocrypt/src/fips_test.c; sourceTree = ""; }; @@ -917,77 +625,10 @@ children = ( 521645F91A89916E0062516A /* wolfSSL */, 521645F81A89916A0062516A /* wolfCrypt */, - 521645F71A8991680062516A /* CyaSSL */, - 521645F61A8991640062516A /* CtaoCrypt */, ); name = Headers; sourceTree = SOURCE_ROOT; }; - 521645F61A8991640062516A /* CtaoCrypt */ = { - isa = PBXGroup; - children = ( - 521646951A8993F50062516A /* aes.h */, - 521646961A8993F50062516A /* arc4.h */, - 521646971A8993F50062516A /* asn_public.h */, - 521646981A8993F50062516A /* asn.h */, - 521646991A8993F50062516A /* blake2-impl.h */, - 5216469A1A8993F50062516A /* blake2-int.h */, - 5216469B1A8993F50062516A /* blake2.h */, - 5216469C1A8993F50062516A /* camellia.h */, - 5216469D1A8993F50062516A /* chacha.h */, - 5216469E1A8993F50062516A /* coding.h */, - 5216469F1A8993F50062516A /* compress.h */, - 521646A01A8993F50062516A /* des3.h */, - 521646A11A8993F50062516A /* dh.h */, - 521646A21A8993F50062516A /* dsa.h */, - 521646A31A8993F50062516A /* ecc.h */, - 521646A41A8993F50062516A /* error-crypt.h */, - 521646A51A8993F50062516A /* fips_test.h */, - 521646A71A8993F50062516A /* hmac.h */, - 521646A81A8993F50062516A /* integer.h */, - 521646A91A8993F50062516A /* logging.h */, - 521646AA1A8993F50062516A /* md2.h */, - 521646AB1A8993F50062516A /* md4.h */, - 521646AC1A8993F50062516A /* md5.h */, - 521646AD1A8993F50062516A /* memory.h */, - 521646AE1A8993F50062516A /* misc.h */, - 521646AF1A8993F50062516A /* mpi_class.h */, - 521646B01A8993F50062516A /* mpi_superclass.h */, - 521646B11A8993F50062516A /* pkcs7.h */, - 521646B21A8993F50062516A /* poly1305.h */, - 521646B31A8993F50062516A /* pwdbased.h */, - 521646B51A8993F50062516A /* random.h */, - 521646B61A8993F50062516A /* ripemd.h */, - 521646B71A8993F50062516A /* rsa.h */, - 521646B81A8993F50062516A /* settings_comp.h */, - 521646B91A8993F50062516A /* settings.h */, - 521646BA1A8993F50062516A /* sha.h */, - 521646BB1A8993F50062516A /* sha256.h */, - 521646BC1A8993F50062516A /* sha512.h */, - 521646BD1A8993F50062516A /* tfm.h */, - 521646BE1A8993F50062516A /* types.h */, - 521646BF1A8993F50062516A /* visibility.h */, - 521646C01A8993F50062516A /* wc_port.h */, - ); - name = CtaoCrypt; - sourceTree = SOURCE_ROOT; - }; - 521645F71A8991680062516A /* CyaSSL */ = { - isa = PBXGroup; - children = ( - 5216468A1A8993BB0062516A /* callbacks.h */, - 5216468B1A8993BB0062516A /* certs_test.h */, - 5216468C1A8993BB0062516A /* crl.h */, - 5216468D1A8993BB0062516A /* error-ssl.h */, - 5216468E1A8993BB0062516A /* internal.h */, - 5216468F1A8993BB0062516A /* ocsp.h */, - 521646921A8993BB0062516A /* ssl.h */, - 521646931A8993BB0062516A /* test.h */, - 521646941A8993BB0062516A /* version.h */, - ); - name = CyaSSL; - sourceTree = SOURCE_ROOT; - }; 521645F81A89916A0062516A /* wolfCrypt */ = { isa = PBXGroup; children = ( @@ -1210,8 +851,6 @@ 52B1344A16F3C9E800C07B32 /* Frameworks */, 52B1344B16F3C9E800C07B32 /* CopyFiles */, 521646C11A8A7B380062516A /* CopyFiles */, - 521646C21A8A7B3B0062516A /* Copy Files */, - 521646C31A8A7B3D0062516A /* CopyFiles */, 52B1344916F3C9E800C07B32 /* Sources */, ); buildRules = ( @@ -1231,8 +870,6 @@ A4A54E2E1BC5C3E0002866CD /* Frameworks */, A4A54E2F1BC5C3E0002866CD /* CopyFiles */, A4A54E391BC5C3E0002866CD /* CopyFiles */, - A4A54E671BC5C3E0002866CD /* CopyFiles */, - A4A54E711BC5C3E0002866CD /* CopyFiles */, ); buildRules = ( ); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE/wolfssl.xcodeproj/project.pbxproj 2024-08-03 07:30:00.000000000 +0000 @@ -114,57 +114,6 @@ 30B060B51C6DDB6200D46008 /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646881A8993770062516A /* visibility.h */; }; 30B060B61C6DDB6200D46008 /* wc_encrypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 522DBE0E1B7927290031F454 /* wc_encrypt.h */; }; 30B060B71C6DDB6200D46008 /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646891A8993770062516A /* wc_port.h */; }; - 30B060B81C6DDB7D00D46008 /* callbacks.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468A1A8993BB0062516A /* callbacks.h */; }; - 30B060B91C6DDB7D00D46008 /* certs_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468B1A8993BB0062516A /* certs_test.h */; }; - 30B060BA1C6DDB7D00D46008 /* crl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468C1A8993BB0062516A /* crl.h */; }; - 30B060BB1C6DDB7D00D46008 /* error-ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468D1A8993BB0062516A /* error-ssl.h */; }; - 30B060BC1C6DDB7D00D46008 /* internal.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468E1A8993BB0062516A /* internal.h */; }; - 30B060BD1C6DDB7D00D46008 /* ocsp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468F1A8993BB0062516A /* ocsp.h */; }; - 30B060BE1C6DDB7D00D46008 /* ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646921A8993BB0062516A /* ssl.h */; }; - 30B060BF1C6DDB7D00D46008 /* test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646931A8993BB0062516A /* test.h */; }; - 30B060C01C6DDB7D00D46008 /* version.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646941A8993BB0062516A /* version.h */; }; - 30B060C11C6DDB9800D46008 /* aes.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646951A8993F50062516A /* aes.h */; }; - 30B060C21C6DDB9800D46008 /* arc4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646961A8993F50062516A /* arc4.h */; }; - 30B060C31C6DDB9800D46008 /* asn_public.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646971A8993F50062516A /* asn_public.h */; }; - 30B060C41C6DDB9800D46008 /* asn.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646981A8993F50062516A /* asn.h */; }; - 30B060C51C6DDB9800D46008 /* blake2-impl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646991A8993F50062516A /* blake2-impl.h */; }; - 30B060C61C6DDB9800D46008 /* blake2-int.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469A1A8993F50062516A /* blake2-int.h */; }; - 30B060C71C6DDB9800D46008 /* blake2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469B1A8993F50062516A /* blake2.h */; }; - 30B060C81C6DDB9800D46008 /* camellia.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469C1A8993F50062516A /* camellia.h */; }; - 30B060C91C6DDB9800D46008 /* chacha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469D1A8993F50062516A /* chacha.h */; }; - 30B060CA1C6DDB9800D46008 /* coding.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469E1A8993F50062516A /* coding.h */; }; - 30B060CB1C6DDB9800D46008 /* compress.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469F1A8993F50062516A /* compress.h */; }; - 30B060CC1C6DDB9800D46008 /* des3.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A01A8993F50062516A /* des3.h */; }; - 30B060CD1C6DDB9800D46008 /* dh.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A11A8993F50062516A /* dh.h */; }; - 30B060CE1C6DDB9800D46008 /* dsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A21A8993F50062516A /* dsa.h */; }; - 30B060CF1C6DDB9800D46008 /* ecc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A31A8993F50062516A /* ecc.h */; }; - 30B060D01C6DDB9800D46008 /* error-crypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A41A8993F50062516A /* error-crypt.h */; }; - 30B060D11C6DDB9800D46008 /* fips_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A51A8993F50062516A /* fips_test.h */; }; - 30B060D31C6DDB9800D46008 /* hmac.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A71A8993F50062516A /* hmac.h */; }; - 30B060D41C6DDB9800D46008 /* integer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A81A8993F50062516A /* integer.h */; }; - 30B060D51C6DDB9800D46008 /* logging.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A91A8993F50062516A /* logging.h */; }; - 30B060D61C6DDB9800D46008 /* md2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AA1A8993F50062516A /* md2.h */; }; - 30B060D71C6DDB9800D46008 /* md4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AB1A8993F50062516A /* md4.h */; }; - 30B060D81C6DDB9800D46008 /* md5.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AC1A8993F50062516A /* md5.h */; }; - 30B060D91C6DDB9800D46008 /* memory.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AD1A8993F50062516A /* memory.h */; }; - 30B060DA1C6DDB9800D46008 /* misc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AE1A8993F50062516A /* misc.h */; }; - 30B060DB1C6DDB9800D46008 /* mpi_class.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AF1A8993F50062516A /* mpi_class.h */; }; - 30B060DC1C6DDB9800D46008 /* mpi_superclass.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B01A8993F50062516A /* mpi_superclass.h */; }; - 30B060DD1C6DDB9800D46008 /* pkcs7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B11A8993F50062516A /* pkcs7.h */; }; - 30B060DE1C6DDB9800D46008 /* poly1305.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B21A8993F50062516A /* poly1305.h */; }; - 30B060DF1C6DDB9800D46008 /* pwdbased.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B31A8993F50062516A /* pwdbased.h */; }; - 30B060E11C6DDB9800D46008 /* random.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B51A8993F50062516A /* random.h */; }; - 30B060E21C6DDB9800D46008 /* ripemd.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B61A8993F50062516A /* ripemd.h */; }; - 30B060E31C6DDB9800D46008 /* rsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B71A8993F50062516A /* rsa.h */; }; - 30B060E41C6DDB9800D46008 /* settings_comp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B81A8993F50062516A /* settings_comp.h */; }; - 30B060E51C6DDB9800D46008 /* settings.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B91A8993F50062516A /* settings.h */; }; - 30B060E61C6DDB9800D46008 /* sha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BA1A8993F50062516A /* sha.h */; }; - 30B060E71C6DDB9800D46008 /* sha256.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BB1A8993F50062516A /* sha256.h */; }; - 30B060E81C6DDB9800D46008 /* sha512.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BC1A8993F50062516A /* sha512.h */; }; - 30B060E91C6DDB9800D46008 /* tfm.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BD1A8993F50062516A /* tfm.h */; }; - 30B060EA1C6DDB9800D46008 /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BE1A8993F50062516A /* types.h */; }; - 30B060EB1C6DDB9800D46008 /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BF1A8993F50062516A /* visibility.h */; }; - 30B060EC1C6DDB9800D46008 /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646C01A8993F50062516A /* wc_port.h */; }; 520775A32239ABBE00087711 /* sp_c32.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E8BEB70212F4C340063DCC1 /* sp_c32.c */; }; 520775A42239ABBE00087711 /* sp_c32.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E8BEB70212F4C340063DCC1 /* sp_c32.c */; }; 520775A52239ABBE00087711 /* sp_c32.c in Sources */ = {isa = PBXBuildFile; fileRef = 1E8BEB70212F4C340063DCC1 /* sp_c32.c */; }; @@ -289,57 +238,6 @@ 521646F51A8A7FF30062516A /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646871A8993770062516A /* types.h */; }; 521646F61A8A7FF30062516A /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646881A8993770062516A /* visibility.h */; }; 521646F71A8A7FF30062516A /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646891A8993770062516A /* wc_port.h */; }; - 521646F81A8A80030062516A /* callbacks.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468A1A8993BB0062516A /* callbacks.h */; }; - 521646F91A8A80030062516A /* certs_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468B1A8993BB0062516A /* certs_test.h */; }; - 521646FA1A8A80030062516A /* crl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468C1A8993BB0062516A /* crl.h */; }; - 521646FB1A8A80030062516A /* error-ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468D1A8993BB0062516A /* error-ssl.h */; }; - 521646FC1A8A80030062516A /* internal.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468E1A8993BB0062516A /* internal.h */; }; - 521646FD1A8A80030062516A /* ocsp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468F1A8993BB0062516A /* ocsp.h */; }; - 521646FE1A8A80030062516A /* ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646921A8993BB0062516A /* ssl.h */; }; - 521646FF1A8A80030062516A /* test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646931A8993BB0062516A /* test.h */; }; - 521647001A8A80030062516A /* version.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646941A8993BB0062516A /* version.h */; }; - 521647011A8A80100062516A /* aes.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646951A8993F50062516A /* aes.h */; }; - 521647021A8A80100062516A /* arc4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646961A8993F50062516A /* arc4.h */; }; - 521647031A8A80100062516A /* asn_public.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646971A8993F50062516A /* asn_public.h */; }; - 521647041A8A80100062516A /* asn.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646981A8993F50062516A /* asn.h */; }; - 521647051A8A80100062516A /* blake2-impl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646991A8993F50062516A /* blake2-impl.h */; }; - 521647061A8A80100062516A /* blake2-int.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469A1A8993F50062516A /* blake2-int.h */; }; - 521647071A8A80100062516A /* blake2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469B1A8993F50062516A /* blake2.h */; }; - 521647081A8A80100062516A /* camellia.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469C1A8993F50062516A /* camellia.h */; }; - 521647091A8A80100062516A /* chacha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469D1A8993F50062516A /* chacha.h */; }; - 5216470A1A8A80100062516A /* coding.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469E1A8993F50062516A /* coding.h */; }; - 5216470B1A8A80100062516A /* compress.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469F1A8993F50062516A /* compress.h */; }; - 5216470C1A8A80100062516A /* des3.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A01A8993F50062516A /* des3.h */; }; - 5216470D1A8A80100062516A /* dh.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A11A8993F50062516A /* dh.h */; }; - 5216470E1A8A80100062516A /* dsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A21A8993F50062516A /* dsa.h */; }; - 5216470F1A8A80100062516A /* ecc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A31A8993F50062516A /* ecc.h */; }; - 521647101A8A80100062516A /* error-crypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A41A8993F50062516A /* error-crypt.h */; }; - 521647111A8A80100062516A /* fips_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A51A8993F50062516A /* fips_test.h */; }; - 521647131A8A80100062516A /* hmac.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A71A8993F50062516A /* hmac.h */; }; - 521647141A8A80100062516A /* integer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A81A8993F50062516A /* integer.h */; }; - 521647151A8A80100062516A /* logging.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A91A8993F50062516A /* logging.h */; }; - 521647161A8A80100062516A /* md2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AA1A8993F50062516A /* md2.h */; }; - 521647171A8A80100062516A /* md4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AB1A8993F50062516A /* md4.h */; }; - 521647181A8A80100062516A /* md5.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AC1A8993F50062516A /* md5.h */; }; - 521647191A8A80100062516A /* memory.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AD1A8993F50062516A /* memory.h */; }; - 5216471A1A8A80100062516A /* misc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AE1A8993F50062516A /* misc.h */; }; - 5216471B1A8A80100062516A /* mpi_class.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AF1A8993F50062516A /* mpi_class.h */; }; - 5216471C1A8A80100062516A /* mpi_superclass.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B01A8993F50062516A /* mpi_superclass.h */; }; - 5216471D1A8A80100062516A /* pkcs7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B11A8993F50062516A /* pkcs7.h */; }; - 5216471E1A8A80100062516A /* poly1305.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B21A8993F50062516A /* poly1305.h */; }; - 5216471F1A8A80100062516A /* pwdbased.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B31A8993F50062516A /* pwdbased.h */; }; - 521647211A8A80100062516A /* random.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B51A8993F50062516A /* random.h */; }; - 521647221A8A80100062516A /* ripemd.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B61A8993F50062516A /* ripemd.h */; }; - 521647231A8A80100062516A /* rsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B71A8993F50062516A /* rsa.h */; }; - 521647241A8A80100062516A /* settings_comp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B81A8993F50062516A /* settings_comp.h */; }; - 521647251A8A80100062516A /* settings.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B91A8993F50062516A /* settings.h */; }; - 521647261A8A80100062516A /* sha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BA1A8993F50062516A /* sha.h */; }; - 521647271A8A80100062516A /* sha256.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BB1A8993F50062516A /* sha256.h */; }; - 521647281A8A80100062516A /* sha512.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BC1A8993F50062516A /* sha512.h */; }; - 521647291A8A80100062516A /* tfm.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BD1A8993F50062516A /* tfm.h */; }; - 5216472A1A8A80100062516A /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BE1A8993F50062516A /* types.h */; }; - 5216472B1A8A80100062516A /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BF1A8993F50062516A /* visibility.h */; }; - 5216472C1A8A80100062516A /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646C01A8993F50062516A /* wc_port.h */; }; 522DBE0D1B7926FB0031F454 /* wc_encrypt.c in Sources */ = {isa = PBXBuildFile; fileRef = 522DBE0C1B7926FB0031F454 /* wc_encrypt.c */; }; 522DBE0F1B7927A50031F454 /* wc_encrypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 522DBE0E1B7927290031F454 /* wc_encrypt.h */; }; 525BE5341B3869110054BBCD /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 525BE5331B3869110054BBCD /* hash.c */; }; @@ -634,57 +532,6 @@ A4F318B11BC58B1700FDF2BB /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646871A8993770062516A /* types.h */; }; A4F318B21BC58B1700FDF2BB /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646881A8993770062516A /* visibility.h */; }; A4F318B31BC58B1700FDF2BB /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646891A8993770062516A /* wc_port.h */; }; - A4F318B51BC58B1700FDF2BB /* callbacks.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468A1A8993BB0062516A /* callbacks.h */; }; - A4F318B61BC58B1700FDF2BB /* certs_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468B1A8993BB0062516A /* certs_test.h */; }; - A4F318B71BC58B1700FDF2BB /* crl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468C1A8993BB0062516A /* crl.h */; }; - A4F318B81BC58B1700FDF2BB /* error-ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468D1A8993BB0062516A /* error-ssl.h */; }; - A4F318B91BC58B1700FDF2BB /* internal.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468E1A8993BB0062516A /* internal.h */; }; - A4F318BA1BC58B1700FDF2BB /* ocsp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216468F1A8993BB0062516A /* ocsp.h */; }; - A4F318BB1BC58B1700FDF2BB /* ssl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646921A8993BB0062516A /* ssl.h */; }; - A4F318BC1BC58B1700FDF2BB /* test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646931A8993BB0062516A /* test.h */; }; - A4F318BD1BC58B1700FDF2BB /* version.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646941A8993BB0062516A /* version.h */; }; - A4F318BF1BC58B1700FDF2BB /* aes.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646951A8993F50062516A /* aes.h */; }; - A4F318C01BC58B1700FDF2BB /* arc4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646961A8993F50062516A /* arc4.h */; }; - A4F318C11BC58B1700FDF2BB /* asn_public.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646971A8993F50062516A /* asn_public.h */; }; - A4F318C21BC58B1700FDF2BB /* asn.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646981A8993F50062516A /* asn.h */; }; - A4F318C31BC58B1700FDF2BB /* blake2-impl.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646991A8993F50062516A /* blake2-impl.h */; }; - A4F318C41BC58B1700FDF2BB /* blake2-int.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469A1A8993F50062516A /* blake2-int.h */; }; - A4F318C51BC58B1700FDF2BB /* blake2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469B1A8993F50062516A /* blake2.h */; }; - A4F318C61BC58B1700FDF2BB /* camellia.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469C1A8993F50062516A /* camellia.h */; }; - A4F318C71BC58B1700FDF2BB /* chacha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469D1A8993F50062516A /* chacha.h */; }; - A4F318C81BC58B1700FDF2BB /* coding.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469E1A8993F50062516A /* coding.h */; }; - A4F318C91BC58B1700FDF2BB /* compress.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5216469F1A8993F50062516A /* compress.h */; }; - A4F318CA1BC58B1700FDF2BB /* des3.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A01A8993F50062516A /* des3.h */; }; - A4F318CB1BC58B1700FDF2BB /* dh.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A11A8993F50062516A /* dh.h */; }; - A4F318CC1BC58B1700FDF2BB /* dsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A21A8993F50062516A /* dsa.h */; }; - A4F318CD1BC58B1700FDF2BB /* ecc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A31A8993F50062516A /* ecc.h */; }; - A4F318CE1BC58B1700FDF2BB /* error-crypt.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A41A8993F50062516A /* error-crypt.h */; }; - A4F318CF1BC58B1700FDF2BB /* fips_test.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A51A8993F50062516A /* fips_test.h */; }; - A4F318D11BC58B1700FDF2BB /* hmac.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A71A8993F50062516A /* hmac.h */; }; - A4F318D21BC58B1700FDF2BB /* integer.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A81A8993F50062516A /* integer.h */; }; - A4F318D31BC58B1700FDF2BB /* logging.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646A91A8993F50062516A /* logging.h */; }; - A4F318D41BC58B1700FDF2BB /* md2.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AA1A8993F50062516A /* md2.h */; }; - A4F318D51BC58B1700FDF2BB /* md4.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AB1A8993F50062516A /* md4.h */; }; - A4F318D61BC58B1700FDF2BB /* md5.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AC1A8993F50062516A /* md5.h */; }; - A4F318D71BC58B1700FDF2BB /* memory.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AD1A8993F50062516A /* memory.h */; }; - A4F318D81BC58B1700FDF2BB /* misc.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AE1A8993F50062516A /* misc.h */; }; - A4F318D91BC58B1700FDF2BB /* mpi_class.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646AF1A8993F50062516A /* mpi_class.h */; }; - A4F318DA1BC58B1700FDF2BB /* mpi_superclass.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B01A8993F50062516A /* mpi_superclass.h */; }; - A4F318DB1BC58B1700FDF2BB /* pkcs7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B11A8993F50062516A /* pkcs7.h */; }; - A4F318DC1BC58B1700FDF2BB /* poly1305.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B21A8993F50062516A /* poly1305.h */; }; - A4F318DD1BC58B1700FDF2BB /* pwdbased.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B31A8993F50062516A /* pwdbased.h */; }; - A4F318DF1BC58B1700FDF2BB /* random.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B51A8993F50062516A /* random.h */; }; - A4F318E01BC58B1700FDF2BB /* ripemd.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B61A8993F50062516A /* ripemd.h */; }; - A4F318E11BC58B1700FDF2BB /* rsa.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B71A8993F50062516A /* rsa.h */; }; - A4F318E21BC58B1700FDF2BB /* settings_comp.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B81A8993F50062516A /* settings_comp.h */; }; - A4F318E31BC58B1700FDF2BB /* settings.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646B91A8993F50062516A /* settings.h */; }; - A4F318E41BC58B1700FDF2BB /* sha.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BA1A8993F50062516A /* sha.h */; }; - A4F318E51BC58B1700FDF2BB /* sha256.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BB1A8993F50062516A /* sha256.h */; }; - A4F318E61BC58B1700FDF2BB /* sha512.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BC1A8993F50062516A /* sha512.h */; }; - A4F318E71BC58B1700FDF2BB /* tfm.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BD1A8993F50062516A /* tfm.h */; }; - A4F318E81BC58B1700FDF2BB /* types.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BE1A8993F50062516A /* types.h */; }; - A4F318E91BC58B1700FDF2BB /* visibility.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646BF1A8993F50062516A /* visibility.h */; }; - A4F318EA1BC58B1700FDF2BB /* wc_port.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 521646C01A8993F50062516A /* wc_port.h */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -761,75 +608,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 30B060891C6DDB5400D46008 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl; - dstSubfolderSpec = 7; - files = ( - 30B060B81C6DDB7D00D46008 /* callbacks.h in CopyFiles */, - 30B060B91C6DDB7D00D46008 /* certs_test.h in CopyFiles */, - 30B060BA1C6DDB7D00D46008 /* crl.h in CopyFiles */, - 30B060BB1C6DDB7D00D46008 /* error-ssl.h in CopyFiles */, - 30B060BC1C6DDB7D00D46008 /* internal.h in CopyFiles */, - 30B060BD1C6DDB7D00D46008 /* ocsp.h in CopyFiles */, - 30B060BE1C6DDB7D00D46008 /* ssl.h in CopyFiles */, - 30B060BF1C6DDB7D00D46008 /* test.h in CopyFiles */, - 30B060C01C6DDB7D00D46008 /* version.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 30B0608A1C6DDB5500D46008 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl/ctaocrypt; - dstSubfolderSpec = 7; - files = ( - 30B060C11C6DDB9800D46008 /* aes.h in CopyFiles */, - 30B060C21C6DDB9800D46008 /* arc4.h in CopyFiles */, - 30B060C31C6DDB9800D46008 /* asn_public.h in CopyFiles */, - 30B060C41C6DDB9800D46008 /* asn.h in CopyFiles */, - 30B060C51C6DDB9800D46008 /* blake2-impl.h in CopyFiles */, - 30B060C61C6DDB9800D46008 /* blake2-int.h in CopyFiles */, - 30B060C71C6DDB9800D46008 /* blake2.h in CopyFiles */, - 30B060C81C6DDB9800D46008 /* camellia.h in CopyFiles */, - 30B060C91C6DDB9800D46008 /* chacha.h in CopyFiles */, - 30B060CA1C6DDB9800D46008 /* coding.h in CopyFiles */, - 30B060CB1C6DDB9800D46008 /* compress.h in CopyFiles */, - 30B060CC1C6DDB9800D46008 /* des3.h in CopyFiles */, - 30B060CD1C6DDB9800D46008 /* dh.h in CopyFiles */, - 30B060CE1C6DDB9800D46008 /* dsa.h in CopyFiles */, - 30B060CF1C6DDB9800D46008 /* ecc.h in CopyFiles */, - 30B060D01C6DDB9800D46008 /* error-crypt.h in CopyFiles */, - 30B060D11C6DDB9800D46008 /* fips_test.h in CopyFiles */, - 30B060D31C6DDB9800D46008 /* hmac.h in CopyFiles */, - 30B060D41C6DDB9800D46008 /* integer.h in CopyFiles */, - 30B060D51C6DDB9800D46008 /* logging.h in CopyFiles */, - 30B060D61C6DDB9800D46008 /* md2.h in CopyFiles */, - 30B060D71C6DDB9800D46008 /* md4.h in CopyFiles */, - 30B060D81C6DDB9800D46008 /* md5.h in CopyFiles */, - 30B060D91C6DDB9800D46008 /* memory.h in CopyFiles */, - 30B060DA1C6DDB9800D46008 /* misc.h in CopyFiles */, - 30B060DB1C6DDB9800D46008 /* mpi_class.h in CopyFiles */, - 30B060DC1C6DDB9800D46008 /* mpi_superclass.h in CopyFiles */, - 30B060DD1C6DDB9800D46008 /* pkcs7.h in CopyFiles */, - 30B060DE1C6DDB9800D46008 /* poly1305.h in CopyFiles */, - 30B060DF1C6DDB9800D46008 /* pwdbased.h in CopyFiles */, - 30B060E11C6DDB9800D46008 /* random.h in CopyFiles */, - 30B060E21C6DDB9800D46008 /* ripemd.h in CopyFiles */, - 30B060E31C6DDB9800D46008 /* rsa.h in CopyFiles */, - 30B060E41C6DDB9800D46008 /* settings_comp.h in CopyFiles */, - 30B060E51C6DDB9800D46008 /* settings.h in CopyFiles */, - 30B060E61C6DDB9800D46008 /* sha.h in CopyFiles */, - 30B060E71C6DDB9800D46008 /* sha256.h in CopyFiles */, - 30B060E81C6DDB9800D46008 /* sha512.h in CopyFiles */, - 30B060E91C6DDB9800D46008 /* tfm.h in CopyFiles */, - 30B060EA1C6DDB9800D46008 /* types.h in CopyFiles */, - 30B060EB1C6DDB9800D46008 /* visibility.h in CopyFiles */, - 30B060EC1C6DDB9800D46008 /* wc_port.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 521646C11A8A7B380062516A /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -920,75 +698,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 521646C21A8A7B3B0062516A /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl; - dstSubfolderSpec = 7; - files = ( - 521646F81A8A80030062516A /* callbacks.h in CopyFiles */, - 521646F91A8A80030062516A /* certs_test.h in CopyFiles */, - 521646FA1A8A80030062516A /* crl.h in CopyFiles */, - 521646FB1A8A80030062516A /* error-ssl.h in CopyFiles */, - 521646FC1A8A80030062516A /* internal.h in CopyFiles */, - 521646FD1A8A80030062516A /* ocsp.h in CopyFiles */, - 521646FE1A8A80030062516A /* ssl.h in CopyFiles */, - 521646FF1A8A80030062516A /* test.h in CopyFiles */, - 521647001A8A80030062516A /* version.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 521646C31A8A7B3D0062516A /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl/ctaocrypt; - dstSubfolderSpec = 7; - files = ( - 521647011A8A80100062516A /* aes.h in CopyFiles */, - 521647021A8A80100062516A /* arc4.h in CopyFiles */, - 521647031A8A80100062516A /* asn_public.h in CopyFiles */, - 521647041A8A80100062516A /* asn.h in CopyFiles */, - 521647051A8A80100062516A /* blake2-impl.h in CopyFiles */, - 521647061A8A80100062516A /* blake2-int.h in CopyFiles */, - 521647071A8A80100062516A /* blake2.h in CopyFiles */, - 521647081A8A80100062516A /* camellia.h in CopyFiles */, - 521647091A8A80100062516A /* chacha.h in CopyFiles */, - 5216470A1A8A80100062516A /* coding.h in CopyFiles */, - 5216470B1A8A80100062516A /* compress.h in CopyFiles */, - 5216470C1A8A80100062516A /* des3.h in CopyFiles */, - 5216470D1A8A80100062516A /* dh.h in CopyFiles */, - 5216470E1A8A80100062516A /* dsa.h in CopyFiles */, - 5216470F1A8A80100062516A /* ecc.h in CopyFiles */, - 521647101A8A80100062516A /* error-crypt.h in CopyFiles */, - 521647111A8A80100062516A /* fips_test.h in CopyFiles */, - 521647131A8A80100062516A /* hmac.h in CopyFiles */, - 521647141A8A80100062516A /* integer.h in CopyFiles */, - 521647151A8A80100062516A /* logging.h in CopyFiles */, - 521647161A8A80100062516A /* md2.h in CopyFiles */, - 521647171A8A80100062516A /* md4.h in CopyFiles */, - 521647181A8A80100062516A /* md5.h in CopyFiles */, - 521647191A8A80100062516A /* memory.h in CopyFiles */, - 5216471A1A8A80100062516A /* misc.h in CopyFiles */, - 5216471B1A8A80100062516A /* mpi_class.h in CopyFiles */, - 5216471C1A8A80100062516A /* mpi_superclass.h in CopyFiles */, - 5216471D1A8A80100062516A /* pkcs7.h in CopyFiles */, - 5216471E1A8A80100062516A /* poly1305.h in CopyFiles */, - 5216471F1A8A80100062516A /* pwdbased.h in CopyFiles */, - 521647211A8A80100062516A /* random.h in CopyFiles */, - 521647221A8A80100062516A /* ripemd.h in CopyFiles */, - 521647231A8A80100062516A /* rsa.h in CopyFiles */, - 521647241A8A80100062516A /* settings_comp.h in CopyFiles */, - 521647251A8A80100062516A /* settings.h in CopyFiles */, - 521647261A8A80100062516A /* sha.h in CopyFiles */, - 521647271A8A80100062516A /* sha256.h in CopyFiles */, - 521647281A8A80100062516A /* sha512.h in CopyFiles */, - 521647291A8A80100062516A /* tfm.h in CopyFiles */, - 5216472A1A8A80100062516A /* types.h in CopyFiles */, - 5216472B1A8A80100062516A /* visibility.h in CopyFiles */, - 5216472C1A8A80100062516A /* wc_port.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 52B1344B16F3C9E800C07B32 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -1150,75 +859,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - A4F318B41BC58B1700FDF2BB /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl; - dstSubfolderSpec = 7; - files = ( - A4F318B51BC58B1700FDF2BB /* callbacks.h in CopyFiles */, - A4F318B61BC58B1700FDF2BB /* certs_test.h in CopyFiles */, - A4F318B71BC58B1700FDF2BB /* crl.h in CopyFiles */, - A4F318B81BC58B1700FDF2BB /* error-ssl.h in CopyFiles */, - A4F318B91BC58B1700FDF2BB /* internal.h in CopyFiles */, - A4F318BA1BC58B1700FDF2BB /* ocsp.h in CopyFiles */, - A4F318BB1BC58B1700FDF2BB /* ssl.h in CopyFiles */, - A4F318BC1BC58B1700FDF2BB /* test.h in CopyFiles */, - A4F318BD1BC58B1700FDF2BB /* version.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A4F318BE1BC58B1700FDF2BB /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/cyassl/ctaocrypt; - dstSubfolderSpec = 7; - files = ( - A4F318BF1BC58B1700FDF2BB /* aes.h in CopyFiles */, - A4F318C01BC58B1700FDF2BB /* arc4.h in CopyFiles */, - A4F318C11BC58B1700FDF2BB /* asn_public.h in CopyFiles */, - A4F318C21BC58B1700FDF2BB /* asn.h in CopyFiles */, - A4F318C31BC58B1700FDF2BB /* blake2-impl.h in CopyFiles */, - A4F318C41BC58B1700FDF2BB /* blake2-int.h in CopyFiles */, - A4F318C51BC58B1700FDF2BB /* blake2.h in CopyFiles */, - A4F318C61BC58B1700FDF2BB /* camellia.h in CopyFiles */, - A4F318C71BC58B1700FDF2BB /* chacha.h in CopyFiles */, - A4F318C81BC58B1700FDF2BB /* coding.h in CopyFiles */, - A4F318C91BC58B1700FDF2BB /* compress.h in CopyFiles */, - A4F318CA1BC58B1700FDF2BB /* des3.h in CopyFiles */, - A4F318CB1BC58B1700FDF2BB /* dh.h in CopyFiles */, - A4F318CC1BC58B1700FDF2BB /* dsa.h in CopyFiles */, - A4F318CD1BC58B1700FDF2BB /* ecc.h in CopyFiles */, - A4F318CE1BC58B1700FDF2BB /* error-crypt.h in CopyFiles */, - A4F318CF1BC58B1700FDF2BB /* fips_test.h in CopyFiles */, - A4F318D11BC58B1700FDF2BB /* hmac.h in CopyFiles */, - A4F318D21BC58B1700FDF2BB /* integer.h in CopyFiles */, - A4F318D31BC58B1700FDF2BB /* logging.h in CopyFiles */, - A4F318D41BC58B1700FDF2BB /* md2.h in CopyFiles */, - A4F318D51BC58B1700FDF2BB /* md4.h in CopyFiles */, - A4F318D61BC58B1700FDF2BB /* md5.h in CopyFiles */, - A4F318D71BC58B1700FDF2BB /* memory.h in CopyFiles */, - A4F318D81BC58B1700FDF2BB /* misc.h in CopyFiles */, - A4F318D91BC58B1700FDF2BB /* mpi_class.h in CopyFiles */, - A4F318DA1BC58B1700FDF2BB /* mpi_superclass.h in CopyFiles */, - A4F318DB1BC58B1700FDF2BB /* pkcs7.h in CopyFiles */, - A4F318DC1BC58B1700FDF2BB /* poly1305.h in CopyFiles */, - A4F318DD1BC58B1700FDF2BB /* pwdbased.h in CopyFiles */, - A4F318DF1BC58B1700FDF2BB /* random.h in CopyFiles */, - A4F318E01BC58B1700FDF2BB /* ripemd.h in CopyFiles */, - A4F318E11BC58B1700FDF2BB /* rsa.h in CopyFiles */, - A4F318E21BC58B1700FDF2BB /* settings_comp.h in CopyFiles */, - A4F318E31BC58B1700FDF2BB /* settings.h in CopyFiles */, - A4F318E41BC58B1700FDF2BB /* sha.h in CopyFiles */, - A4F318E51BC58B1700FDF2BB /* sha256.h in CopyFiles */, - A4F318E61BC58B1700FDF2BB /* sha512.h in CopyFiles */, - A4F318E71BC58B1700FDF2BB /* tfm.h in CopyFiles */, - A4F318E81BC58B1700FDF2BB /* types.h in CopyFiles */, - A4F318E91BC58B1700FDF2BB /* visibility.h in CopyFiles */, - A4F318EA1BC58B1700FDF2BB /* wc_port.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -1329,57 +969,6 @@ 521646871A8993770062516A /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../../wolfssl/wolfcrypt/types.h; sourceTree = ""; }; 521646881A8993770062516A /* visibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../wolfssl/wolfcrypt/visibility.h; sourceTree = ""; }; 521646891A8993770062516A /* wc_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wc_port.h; path = ../../wolfssl/wolfcrypt/wc_port.h; sourceTree = ""; }; - 5216468A1A8993BB0062516A /* callbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = callbacks.h; path = ../../cyassl/callbacks.h; sourceTree = ""; }; - 5216468B1A8993BB0062516A /* certs_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = certs_test.h; path = ../../cyassl/certs_test.h; sourceTree = ""; }; - 5216468C1A8993BB0062516A /* crl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crl.h; path = ../../cyassl/crl.h; sourceTree = ""; }; - 5216468D1A8993BB0062516A /* error-ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "error-ssl.h"; path = "../../cyassl/error-ssl.h"; sourceTree = ""; }; - 5216468E1A8993BB0062516A /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = internal.h; path = ../../cyassl/internal.h; sourceTree = ""; }; - 5216468F1A8993BB0062516A /* ocsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ocsp.h; path = ../../cyassl/ocsp.h; sourceTree = ""; }; - 521646921A8993BB0062516A /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ssl.h; path = ../../cyassl/ssl.h; sourceTree = ""; }; - 521646931A8993BB0062516A /* test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test.h; path = ../../cyassl/test.h; sourceTree = ""; }; - 521646941A8993BB0062516A /* version.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = version.h; path = ../../cyassl/version.h; sourceTree = ""; }; - 521646951A8993F50062516A /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = aes.h; path = ../../cyassl/ctaocrypt/aes.h; sourceTree = ""; }; - 521646961A8993F50062516A /* arc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = arc4.h; path = ../../cyassl/ctaocrypt/arc4.h; sourceTree = ""; }; - 521646971A8993F50062516A /* asn_public.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = asn_public.h; path = ../../cyassl/ctaocrypt/asn_public.h; sourceTree = ""; }; - 521646981A8993F50062516A /* asn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = asn.h; path = ../../cyassl/ctaocrypt/asn.h; sourceTree = ""; }; - 521646991A8993F50062516A /* blake2-impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "blake2-impl.h"; path = "../../cyassl/ctaocrypt/blake2-impl.h"; sourceTree = ""; }; - 5216469A1A8993F50062516A /* blake2-int.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "blake2-int.h"; path = "../../cyassl/ctaocrypt/blake2-int.h"; sourceTree = ""; }; - 5216469B1A8993F50062516A /* blake2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = blake2.h; path = ../../cyassl/ctaocrypt/blake2.h; sourceTree = ""; }; - 5216469C1A8993F50062516A /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = camellia.h; path = ../../cyassl/ctaocrypt/camellia.h; sourceTree = ""; }; - 5216469D1A8993F50062516A /* chacha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = chacha.h; path = ../../cyassl/ctaocrypt/chacha.h; sourceTree = ""; }; - 5216469E1A8993F50062516A /* coding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = coding.h; path = ../../cyassl/ctaocrypt/coding.h; sourceTree = ""; }; - 5216469F1A8993F50062516A /* compress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = compress.h; path = ../../cyassl/ctaocrypt/compress.h; sourceTree = ""; }; - 521646A01A8993F50062516A /* des3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = des3.h; path = ../../cyassl/ctaocrypt/des3.h; sourceTree = ""; }; - 521646A11A8993F50062516A /* dh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dh.h; path = ../../cyassl/ctaocrypt/dh.h; sourceTree = ""; }; - 521646A21A8993F50062516A /* dsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dsa.h; path = ../../cyassl/ctaocrypt/dsa.h; sourceTree = ""; }; - 521646A31A8993F50062516A /* ecc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ecc.h; path = ../../cyassl/ctaocrypt/ecc.h; sourceTree = ""; }; - 521646A41A8993F50062516A /* error-crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "error-crypt.h"; path = "../../cyassl/ctaocrypt/error-crypt.h"; sourceTree = ""; }; - 521646A51A8993F50062516A /* fips_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = fips_test.h; path = ../../cyassl/ctaocrypt/fips_test.h; sourceTree = ""; }; - 521646A71A8993F50062516A /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hmac.h; path = ../../cyassl/ctaocrypt/hmac.h; sourceTree = ""; }; - 521646A81A8993F50062516A /* integer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = integer.h; path = ../../cyassl/ctaocrypt/integer.h; sourceTree = ""; }; - 521646A91A8993F50062516A /* logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = logging.h; path = ../../cyassl/ctaocrypt/logging.h; sourceTree = ""; }; - 521646AA1A8993F50062516A /* md2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = md2.h; path = ../../cyassl/ctaocrypt/md2.h; sourceTree = ""; }; - 521646AB1A8993F50062516A /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = md4.h; path = ../../cyassl/ctaocrypt/md4.h; sourceTree = ""; }; - 521646AC1A8993F50062516A /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = md5.h; path = ../../cyassl/ctaocrypt/md5.h; sourceTree = ""; }; - 521646AD1A8993F50062516A /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = memory.h; path = ../../cyassl/ctaocrypt/memory.h; sourceTree = ""; }; - 521646AE1A8993F50062516A /* misc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = misc.h; path = ../../cyassl/ctaocrypt/misc.h; sourceTree = ""; }; - 521646AF1A8993F50062516A /* mpi_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mpi_class.h; path = ../../cyassl/ctaocrypt/mpi_class.h; sourceTree = ""; }; - 521646B01A8993F50062516A /* mpi_superclass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mpi_superclass.h; path = ../../cyassl/ctaocrypt/mpi_superclass.h; sourceTree = ""; }; - 521646B11A8993F50062516A /* pkcs7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pkcs7.h; path = ../../cyassl/ctaocrypt/pkcs7.h; sourceTree = ""; }; - 521646B21A8993F50062516A /* poly1305.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = poly1305.h; path = ../../cyassl/ctaocrypt/poly1305.h; sourceTree = ""; }; - 521646B31A8993F50062516A /* pwdbased.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pwdbased.h; path = ../../cyassl/ctaocrypt/pwdbased.h; sourceTree = ""; }; - 521646B51A8993F50062516A /* random.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = random.h; path = ../../cyassl/ctaocrypt/random.h; sourceTree = ""; }; - 521646B61A8993F50062516A /* ripemd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ripemd.h; path = ../../cyassl/ctaocrypt/ripemd.h; sourceTree = ""; }; - 521646B71A8993F50062516A /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rsa.h; path = ../../cyassl/ctaocrypt/rsa.h; sourceTree = ""; }; - 521646B81A8993F50062516A /* settings_comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = settings_comp.h; path = ../../cyassl/ctaocrypt/settings_comp.h; sourceTree = ""; }; - 521646B91A8993F50062516A /* settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = settings.h; path = ../../cyassl/ctaocrypt/settings.h; sourceTree = ""; }; - 521646BA1A8993F50062516A /* sha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha.h; path = ../../cyassl/ctaocrypt/sha.h; sourceTree = ""; }; - 521646BB1A8993F50062516A /* sha256.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha256.h; path = ../../cyassl/ctaocrypt/sha256.h; sourceTree = ""; }; - 521646BC1A8993F50062516A /* sha512.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha512.h; path = ../../cyassl/ctaocrypt/sha512.h; sourceTree = ""; }; - 521646BD1A8993F50062516A /* tfm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tfm.h; path = ../../cyassl/ctaocrypt/tfm.h; sourceTree = ""; }; - 521646BE1A8993F50062516A /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../../cyassl/ctaocrypt/types.h; sourceTree = ""; }; - 521646BF1A8993F50062516A /* visibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = visibility.h; path = ../../cyassl/ctaocrypt/visibility.h; sourceTree = ""; }; - 521646C01A8993F50062516A /* wc_port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wc_port.h; path = ../../cyassl/ctaocrypt/wc_port.h; sourceTree = ""; }; 522DBE0C1B7926FB0031F454 /* wc_encrypt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = wc_encrypt.c; path = ../../wolfcrypt/src/wc_encrypt.c; sourceTree = SOURCE_ROOT; }; 522DBE0E1B7927290031F454 /* wc_encrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wc_encrypt.h; path = ../../wolfssl/wolfcrypt/wc_encrypt.h; sourceTree = ""; }; 525BE5331B3869110054BBCD /* hash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hash.c; path = ../../wolfcrypt/src/hash.c; sourceTree = ""; }; @@ -1549,78 +1138,11 @@ children = ( 521645F91A89916E0062516A /* wolfSSL */, 521645F81A89916A0062516A /* wolfCrypt */, - 521645F71A8991680062516A /* CyaSSL */, - 521645F61A8991640062516A /* CtaoCrypt */, 700F0C502A2FBE3600755BA7 /* OpenSSL */, ); name = Headers; sourceTree = SOURCE_ROOT; }; - 521645F61A8991640062516A /* CtaoCrypt */ = { - isa = PBXGroup; - children = ( - 521646951A8993F50062516A /* aes.h */, - 521646961A8993F50062516A /* arc4.h */, - 521646971A8993F50062516A /* asn_public.h */, - 521646981A8993F50062516A /* asn.h */, - 521646991A8993F50062516A /* blake2-impl.h */, - 5216469A1A8993F50062516A /* blake2-int.h */, - 5216469B1A8993F50062516A /* blake2.h */, - 5216469C1A8993F50062516A /* camellia.h */, - 5216469D1A8993F50062516A /* chacha.h */, - 5216469E1A8993F50062516A /* coding.h */, - 5216469F1A8993F50062516A /* compress.h */, - 521646A01A8993F50062516A /* des3.h */, - 521646A11A8993F50062516A /* dh.h */, - 521646A21A8993F50062516A /* dsa.h */, - 521646A31A8993F50062516A /* ecc.h */, - 521646A41A8993F50062516A /* error-crypt.h */, - 521646A51A8993F50062516A /* fips_test.h */, - 521646A71A8993F50062516A /* hmac.h */, - 521646A81A8993F50062516A /* integer.h */, - 521646A91A8993F50062516A /* logging.h */, - 521646AA1A8993F50062516A /* md2.h */, - 521646AB1A8993F50062516A /* md4.h */, - 521646AC1A8993F50062516A /* md5.h */, - 521646AD1A8993F50062516A /* memory.h */, - 521646AE1A8993F50062516A /* misc.h */, - 521646AF1A8993F50062516A /* mpi_class.h */, - 521646B01A8993F50062516A /* mpi_superclass.h */, - 521646B11A8993F50062516A /* pkcs7.h */, - 521646B21A8993F50062516A /* poly1305.h */, - 521646B31A8993F50062516A /* pwdbased.h */, - 521646B51A8993F50062516A /* random.h */, - 521646B61A8993F50062516A /* ripemd.h */, - 521646B71A8993F50062516A /* rsa.h */, - 521646B81A8993F50062516A /* settings_comp.h */, - 521646B91A8993F50062516A /* settings.h */, - 521646BA1A8993F50062516A /* sha.h */, - 521646BB1A8993F50062516A /* sha256.h */, - 521646BC1A8993F50062516A /* sha512.h */, - 521646BD1A8993F50062516A /* tfm.h */, - 521646BE1A8993F50062516A /* types.h */, - 521646BF1A8993F50062516A /* visibility.h */, - 521646C01A8993F50062516A /* wc_port.h */, - ); - name = CtaoCrypt; - sourceTree = SOURCE_ROOT; - }; - 521645F71A8991680062516A /* CyaSSL */ = { - isa = PBXGroup; - children = ( - 5216468A1A8993BB0062516A /* callbacks.h */, - 5216468B1A8993BB0062516A /* certs_test.h */, - 5216468C1A8993BB0062516A /* crl.h */, - 5216468D1A8993BB0062516A /* error-ssl.h */, - 5216468E1A8993BB0062516A /* internal.h */, - 5216468F1A8993BB0062516A /* ocsp.h */, - 521646921A8993BB0062516A /* ssl.h */, - 521646931A8993BB0062516A /* test.h */, - 521646941A8993BB0062516A /* version.h */, - ); - name = CyaSSL; - sourceTree = SOURCE_ROOT; - }; 521645F81A89916A0062516A /* wolfCrypt */ = { isa = PBXGroup; children = ( @@ -1935,8 +1457,6 @@ 30B060481C6DDAEA00D46008 /* Frameworks */, 30B060491C6DDAEA00D46008 /* CopyFiles */, 30B060881C6DDB5200D46008 /* CopyFiles */, - 30B060891C6DDB5400D46008 /* CopyFiles */, - 30B0608A1C6DDB5500D46008 /* CopyFiles */, 30B060471C6DDAEA00D46008 /* Sources */, ); buildRules = ( @@ -1955,8 +1475,6 @@ 52B1344A16F3C9E800C07B32 /* Frameworks */, 52B1344B16F3C9E800C07B32 /* CopyFiles */, 521646C11A8A7B380062516A /* CopyFiles */, - 521646C21A8A7B3B0062516A /* CopyFiles */, - 521646C31A8A7B3D0062516A /* CopyFiles */, 700F0C8B2A2FBEB400755BA7 /* CopyFiles */, 52B1344916F3C9E800C07B32 /* Sources */, ); @@ -1976,8 +1494,6 @@ A4F3187B1BC58B1700FDF2BB /* Frameworks */, A4F3187C1BC58B1700FDF2BB /* CopyFiles */, A4F318861BC58B1700FDF2BB /* CopyFiles */, - A4F318B41BC58B1700FDF2BB /* CopyFiles */, - A4F318BE1BC58B1700FDF2BB /* CopyFiles */, A4F3184F1BC58B1700FDF2BB /* Sources */, ); buildRules = ( diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/Intel/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/Intel/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/Intel/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/Intel/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -194,7 +194,7 @@ #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#undef FP_MAX_BITS_ECC //#define FP_MAX_BITS_ECC (256 * 2) #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/M1/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/M1/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/M1/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/macOS-C++/M1/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -205,7 +205,7 @@ #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#undef FP_MAX_BITS_ECC //#define FP_MAX_BITS_ECC (256 * 2) #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv2/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -205,7 +205,7 @@ #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#undef FP_MAX_BITS_ECC //#define FP_MAX_BITS_ECC (256 * 2) #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv5/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv5/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv5/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XCODE-FIPSv5/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* user_settings.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -33,21 +33,61 @@ #undef WOLFSSL_GENERAL_ALIGNMENT #define WOLFSSL_GENERAL_ALIGNMENT 4 +/* Multi-threaded support */ #undef SINGLE_THREADED -//#define SINGLE_THREADED +#if 0 + #define SINGLE_THREADED +#else + #define ERROR_QUEUE_PER_THREAD /* if applicable otherwise comment out */ +#endif -#undef WOLFSSL_SMALL_STACK -//#define WOLFSSL_SMALL_STACK +#ifdef SINGLE_THREADED + #undef NO_THREAD_LS + #define NO_THREAD_LS +#endif #undef WOLFSSL_USER_IO //#define WOLFSSL_USER_IO -#undef IPHONE -#define IPHONE - #undef NO_WRITE_TEMP_FILES #define NO_WRITE_TEMP_FILES +/* FIPS 140-3 OE specific section(s) */ + +/* Uncomment for Android devices */ +#undef ANDROID_V454 +/* #define ANDROID_V454 */ +#ifdef ANDROID_V454 + #if 1 + /* To have all printouts go to the app view on the device use: */ + extern int appendToTextView(const char* fmt, ...); + #undef printf + #define printf(format, ...) appendToTextView(format, ## __VA_ARGS__) + #else + #include + #define WOLFLOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "wolfCrypt_android", __VA_ARGS__) + #undef printf + #define printf WOLFLOGV + #endif +#endif + +/* Uncomment for WINCE 6.0 devices. NOTE: _WIN32_WCE defined by system */ +#if 0 + #define NO_WOLFSSL_DIR + #define WOLFSSL_NO_ATOMICS + #define WC_NO_ASYNC_THREADING + #define USE_WINDOWS_API + #define WOLFSSL_SMALL_STACK +#endif + +/* Uncomment for iOS devices with PAA */ +#undef IPHONE +/* #define IPHONE */ + +#ifdef IPHONE + #define YES_WPAA +#endif + /* ------------------------------------------------------------------------- */ /* Math Configuration */ /* ------------------------------------------------------------------------- */ @@ -55,31 +95,48 @@ #define SIZEOF_LONG_LONG 8 #undef USE_FAST_MATH -#if 1 +#if 0 #define USE_FAST_MATH #undef TFM_TIMING_RESISTANT #define TFM_TIMING_RESISTANT #undef TFM_NO_ASM - #define TFM_NO_ASM + //#define TFM_NO_ASM /* Optimizations */ //#define TFM_ARM + + /* Maximum math bits (Max RSA key bits * 2) */ + #undef FP_MAX_BITS + #define FP_MAX_BITS 16384 +#else + #define WOLFSSL_SP_MATH_ALL + #define WOLFSSL_SP_INT_NEGATIVE + /* Maximum math bits (largest supported key bits) */ + #undef SP_INT_BITS + #define SP_INT_BITS 8192 #endif /* Wolf Single Precision Math */ #undef WOLFSSL_SP #if 1 /* SP Assembly Speedups (wPAA) */ - #define SP_INT_BITS 8192 #define WOLFSSL_SP - #define WOLFSSL_SP_SMALL /* use smaller version of code */ + //#define WOLFSSL_SP_SMALL /* use smaller version of code */ + #define WOLFSSL_SP_1024 + #define WOLFSSL_SP_4096 /* Explicitly enable 4096-bit support (2048/3072 on by default) */ + #define WOLFSSL_SP_384 /* Explicitly enable 384-bit support (others on by default) */ + #define WOLFSSL_SP_521 /* Explicitly enable 521-bit support (others on by default) */ #define WOLFSSL_HAVE_SP_RSA #define WOLFSSL_HAVE_SP_DH #define WOLFSSL_HAVE_SP_ECC - /* Customer indicated no desire for PAA, leave out */ - //#define WOLFSSL_ARMASM - //#define WOLFSSL_SP_ARM64_ASM + /* If no PAA, leave out */ + #if defined(IPHONE) && defined(YES_WPAA) + #define WOLFSSL_SP_ASM + #define WOLFSSL_ARMASM + #define WOLFSSL_SP_ARM64 + #define WOLFSSL_SP_ARM64_ASM + #endif #endif /* ------------------------------------------------------------------------- */ @@ -87,7 +144,8 @@ /* ------------------------------------------------------------------------- */ #undef HAVE_FIPS #if 1 - #define WOLFCRYPT_FIPS_CORE_HASH_VALUE 7E1F475996F8BBAB1903D108A9B0AD8D679C5DF6C1598D05924BCAF42A673040 + + #define WOLFCRYPT_FIPS_CORE_HASH_VALUE E10668763A70618419DF0D90190AE23B47D07BBF613F4CD73A54339B0F672203 #define HAVE_FIPS #undef HAVE_FIPS_VERSION @@ -99,17 +157,9 @@ #undef WOLFSSL_WOLFSSH #define WOLFSSL_WOLFSSH - #undef WOLFSSL_ECDSA_SET_K - #define WOLFSSL_ECDSA_SET_K - #undef WC_RNG_SEED_CB #define WC_RNG_SEED_CB - #ifdef SINGLE_THREADED - #undef NO_THREAD_LS - #define NO_THREAD_LS - #endif - #if 0 #undef NO_ATTRIBUTE_CONSTRUCTOR #define NO_ATTRIBUTE_CONSTRUCTOR @@ -124,18 +174,13 @@ /* RSA */ #undef NO_RSA #if 1 - #ifdef USE_FAST_MATH - /* Maximum math bits (Max RSA key bits * 2) */ - #undef FP_MAX_BITS - #define FP_MAX_BITS 16384 - #endif /* half as much memory but twice as slow */ #undef RSA_LOW_MEM //#define RSA_LOW_MEM /* Enables blinding mode, to prevent timing attacks */ - #if 0 + #if 1 #undef WC_RSA_BLINDING #define WC_RSA_BLINDING #else @@ -147,6 +192,12 @@ #if 1 #undef WC_RSA_PSS #define WC_RSA_PSS + + #undef WOLFSSL_PSS_LONG_SALT + #define WOLFSSL_PSS_LONG_SALT + + #undef WOLFSSL_PSS_SALT_LEN_DISCOVER + #define WOLFSSL_PSS_SALT_LEN_DISCOVER #endif #if 1 @@ -163,15 +214,16 @@ /* Manually define enabled curves */ #undef ECC_USER_CURVES - //#define ECC_USER_CURVES + #define ECC_USER_CURVES #ifdef ECC_USER_CURVES /* Manual Curve Selection */ - //#define HAVE_ECC192 - //#define HAVE_ECC224 + #define HAVE_ECC192 + #define HAVE_ECC224 #undef NO_ECC256 - //#define HAVE_ECC384 - //#define HAVE_ECC521 + #define HAVE_ECC256 + #define HAVE_ECC384 + #define HAVE_ECC521 #endif /* Fixed point cache (speeds repeated operations against same private key) */ @@ -205,13 +257,16 @@ #define WOLFSSL_VALIDATE_ECC_IMPORT /* Validate import */ #undef WOLFSSL_VALIDATE_ECC_KEYGEN - #define WOLFSSL_VALIDATE_ECC_KEYGEN + #define WOLFSSL_VALIDATE_ECC_KEYGEN /* Validate generated keys */ + + #undef WOLFSSL_ECDSA_SET_K + #define WOLFSSL_ECDSA_SET_K #endif /* Compressed Key Support */ #undef HAVE_COMP_KEY - //#define HAVE_COMP_KEY + #define HAVE_COMP_KEY /* Use alternate ECC size for ECC math */ #ifdef USE_FAST_MATH @@ -223,7 +278,7 @@ #else #undef ALT_ECC_SIZE #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#undef FP_MAX_BITS_ECC //#define FP_MAX_BITS_ECC (256 * 2) #endif @@ -241,6 +296,7 @@ #if 1 /* Use table for DH instead of -lm (math) lib dependency */ #if 1 + #define HAVE_DH_DEFAULT_PARAMS #define WOLFSSL_DH_CONST #define HAVE_FFDHE_2048 #define HAVE_FFDHE_3072 @@ -267,8 +323,9 @@ #undef HAVE_AESGCM #define HAVE_AESGCM - /* GCM Method: GCM_SMALL, GCM_WORD32 or GCM_TABLE */ - #define GCM_TABLE + /* GCM Method (slowest to fastest): GCM_SMALL, GCM_WORD32, GCM_TABLE or + * GCM_TABLE_4BIT */ + #define GCM_TABLE_4BIT #undef WOLFSSL_AES_DIRECT #define WOLFSSL_AES_DIRECT @@ -282,8 +339,9 @@ #undef HAVE_AESCCM #define HAVE_AESCCM - #undef HAVE_AES_KEYWRAP - #define HAVE_AES_KEYWRAP + #undef WOLFSSL_AES_OFB + #define WOLFSSL_AES_OFB + #else #define NO_AES #endif @@ -374,6 +432,7 @@ #undef WOLFSSL_SHA3 #if 1 #define WOLFSSL_SHA3 + #define NO_OLD_WC_NAMES #endif /* MD5 */ @@ -384,10 +443,11 @@ #define NO_MD5 #endif -/* HKDF */ +/* HKDF / PRF */ #undef HAVE_HKDF #if 1 #define HAVE_HKDF + #define WOLFSSL_HAVE_PRF #endif /* CMAC */ @@ -567,8 +627,14 @@ /* ------------------------------------------------------------------------- */ /* Enable Features */ /* ------------------------------------------------------------------------- */ +#undef WOLFSSL_ASN_TEMPLATE +#define WOLFSSL_ASN_TEMPLATE + +#undef WOLFSSL_ASN_PRINT +#define WOLFSSL_ASN_PRINT + #undef WOLFSSL_TLS13 -#if 0 +#if 1 #define WOLFSSL_TLS13 #endif @@ -577,35 +643,31 @@ #define WOLFSSL_KEY_GEN #endif -#if defined(HAVE_FIPS) && !defined(WOLFSSL_KEY_GEN) - #define WOLFSSL_OLD_PRIME_CHECK -#endif - #undef KEEP_PEER_CERT //#define KEEP_PEER_CERT -#undef HAVE_COMP_KEY -//#define HAVE_COMP_KEY - #undef HAVE_TLS_EXTENSIONS #define HAVE_TLS_EXTENSIONS +#undef HAVE_EXTENDED_MASTER +#define HAVE_EXTENDED_MASTER + #undef HAVE_SUPPORTED_CURVES #define HAVE_SUPPORTED_CURVES #undef WOLFSSL_BASE64_ENCODE #define WOLFSSL_BASE64_ENCODE +#undef WOLFSSL_NO_HASH_RAW +#define WOLFSSL_NO_HASH_RAW + /* TLS Session Cache */ -#if 0 +#if 1 #define SMALL_SESSION_CACHE #else #define NO_SESSION_CACHE #endif -#undef OPENSSL_EXTRA -#define OPENSSL_EXTRA - #undef WOLFSSL_DER_LOAD #define WOLFSSL_DER_LOAD @@ -626,6 +688,55 @@ #undef HAVE_SECRET_CALLBACK #define HAVE_SECRET_CALLBACK + +/* wolfEngine */ +#if 0 + #define OPENSSL_COEXIST + + /* HKDF for engine */ + #undef HAVE_HKDF + #if 1 + #define HAVE_HKDF + #define HAVE_X963_KDF + #endif + + #undef WOLFSSL_PUBLIC_MP + #define WOLFSSL_PUBLIC_MP + + #undef NO_OLD_RNGNAME + #define NO_OLD_RNGNAME + + #undef NO_OLD_WC_NAMES + #define NO_OLD_WC_NAMES + + #undef NO_OLD_SSL_NAMES + #define NO_OLD_SSL_NAMES + + #undef NO_OLD_SHA_NAMES + #define NO_OLD_SHA_NAMES + + #undef NO_OLD_MD5_NAME + #define NO_OLD_MD5_NAME + + #undef NO_OLD_SHA256_NAMES + #define NO_OLD_SHA256_NAMES +#endif + +#undef WOLFSSL_SYS_CA_CERTS +//#define WOLFSSL_SYS_CA_CERTS + +#undef LIBWOLFSSL_GLOBAL_EXTRA_CFLAGS +#define LIBWOLFSSL_GLOBAL_EXTRA_CFLAGS + +#undef HAVE_SERVER_RENEGOTIATION_INFO +#define HAVE_SERVER_RENEGOTIATION_INFO + +#undef WOLFSSL_PEM_TO_DER +#define WOLFSSL_PEM_TO_DER + +#undef WOLFSSL_PUB_PEM_TO_DER +#define WOLFSSL_PUB_PEM_TO_DER + /* ------------------------------------------------------------------------- */ /* Disable Features */ /* ------------------------------------------------------------------------- */ @@ -642,7 +753,7 @@ //#define NO_CRYPT_BENCHMARK #undef WOLFCRYPT_ONLY -#define WOLFCRYPT_ONLY +//#define WOLFCRYPT_ONLY /* In-lining of misc.c functions */ /* If defined, must include wolfcrypt/src/misc.c in build */ @@ -692,21 +803,98 @@ #undef NO_SIG_WRAPPER //#define NO_SIG_WRAPPER +#undef NO_DO178 +#define NO_DO178 + +#undef WOLFSSL_NO_SHAKE128 +#define WOLFSSL_NO_SHAKE128 + +#undef WOLFSSL_NO_SHAKE256 +#define WOLFSSL_NO_SHAKE256 + /* wolfSSL engineering ACVP algo and operational testing only (Default: Off) */ -#if 1 +#if 0 + #undef NO_EARLY_BAIL + #define NO_EARLY_BAIL + #undef WOLFSSL_PUBLIC_MP #define WOLFSSL_PUBLIC_MP + #undef OPTEST_LOGGING_ENABLED + //#define OPTEST_LOGGING_ENABLED + + #undef OPTEST_INVALID_LOGGING_ENABLED + //#define OPTEST_INVALID_LOGGING_ENABLED + + #undef NO_MAIN_OPTEST_DRIVER + #define NO_MAIN_OPTEST_DRIVER + + #undef DEBUG_FIPS_VERBOSE + #define DEBUG_FIPS_VERBOSE + #undef HAVE_FORCE_FIPS_FAILURE #define HAVE_FORCE_FIPS_FAILURE + + #undef NO_WRITE_TEMP_FILES + #define NO_WRITE_TEMPT_FILES #endif #ifdef __cplusplus } #endif +/* Customer Specific Section */ +/* #define CUSTOMER_1_IOS */ +#ifdef CUSTOMER_1_IOS -#endif /* WOLFSSL_USER_SETTINGS_H */ + /* not certified, disable for full FIPS compliance, will attempt to include + * in UPDT submission and/or next FS submission */ + #undef HAVE_AES_KEYWRAP + #define HAVE_AES_KEYWRAP + + #undef HAVE_PKCS7 + #define HAVE_PKCS7 + + #undef HAVE_SNI + #define HAVE_SNI + #undef HAVE_THREAD_LS + #define HAVE_THREAD_LS + + /* Not certifiable but external to module boundary and out of scope */ + #undef WOLFCRYPT_HAVE_ECCSI + #define WOLFCRYPT_HAVE_ECCSI + + /* Not certifiable but external to module boundary and out of scope */ + #undef WOLFCRYPT_HAVE_SAKKE + #define WOLFCRYPT_HAVE_SAKKE + + #undef WOLFSSL_DTLS + #define WOLFSSL_DTLS + + #undef WOLFSSL_DTLS_MTU + #define WOLFSSL_DTLS_MTU + + /* OpenSSL Compatibility (NOTE: Incompatible with wolfEngine and + OPENSSL_COEXIST) */ + #ifndef OPENSSL_COEXIST + #undef OPENSSL_EXTRA + #if 1 + #define OPENSSL_EXTRA + /* Larger footprint but enable ALL compatibility not just a subset */ + #if 1 + #define OPENSSL_ALL + #endif + #endif + #endif +#endif /* CUSTOMER_1_IOS */ +#define CUSTOMER_1_ANDROID +#ifdef CUSTOMER_1_ANDROID +/* TODO */ +#endif + + + +#endif /* WOLFSSL_USER_SETTINGS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2019_2/wolfCrypt_example/.project 2024-08-03 07:30:00.000000000 +0000 @@ -326,9 +326,9 @@ PARENT-4-PROJECT_LOC/wolfcrypt/src/fe_operations.c - src/wolfcrypt/src/fe_x25519_128.i + src/wolfcrypt/src/fe_x25519_128.h 1 - PARENT-4-PROJECT_LOC/wolfcrypt/src/fe_x25519_128.i + PARENT-4-PROJECT_LOC/wolfcrypt/src/fe_x25519_128.h src/wolfcrypt/src/fp_mont_small.i diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_FreeRTOS_example/.project 2024-08-03 07:30:00.000000000 +0000 @@ -1016,9 +1016,9 @@ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_operations.c - src/wolfcrypt/src/fe_x25519_128.i + src/wolfcrypt/src/fe_x25519_128.h 1 - PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_x25519_128.i + PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_x25519_128.h src/wolfcrypt/src/fp_mont_small.i diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/2022_1/wolfCrypt_example/.project 2024-08-03 07:30:00.000000000 +0000 @@ -1016,9 +1016,9 @@ PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_operations.c - src/wolfcrypt/src/fe_x25519_128.i + src/wolfcrypt/src/fe_x25519_128.h 1 - PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_x25519_128.i + PARENT-3-WORKSPACE_LOC/wolfcrypt/src/fe_x25519_128.h src/wolfcrypt/src/fp_mont_small.i diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -70,7 +70,7 @@ 2. Repeat the same steps of the previous step 3 for the newly created domain. - In the tree-view select "freertos10_xilinx" and then open the "kernel_behavior" sub-entry. - Change `minimal_stack_size` to `8000`, `tick_rate` to `1000` and `total_heap_size` to `8388608`. "Big chunk sizes" have not been tested under FreeRTOS. -3. Repeat the same steps of the preivous steps 4 to 6, but with the `wolfCrypt_FreeRTOS_example` resp. `wolfCrypt_FreeRTOS_example_system`. +3. Repeat the same steps of the previous steps 4 to 6, but with the `wolfCrypt_FreeRTOS_example` resp. `wolfCrypt_FreeRTOS_example_system`. ## Troubleshooting diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/graph.sh mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/graph.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/XilinxSDK/graph.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/XilinxSDK/graph.sh 2024-08-03 07:30:00.000000000 +0000 @@ -66,7 +66,7 @@ # not pretty but works for me :) # CBC&GCM encryption is in software a lot faster than decryption, -# therefor use the same Range on the Y-Axis to also have a visual indication. +# therefore use the same Range on the Y-Axis to also have a visual indication. # This will break if something changes, so let the user override the value cbc_yrange="${cbc_yrange:=1400}" gcm_yrange="${gcm_yrange:=500}" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/.gitignore 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1 @@ +artifacts diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,92 @@ +# Overview +This example shows how to build a wolfSSL static library for Apple targets on all architectures using GNU autotools/`configure` and demonstrates how to create a [universal binary framework]() suitable for use in an Xcode project. It also provides a demo Xcode project using the wolfSSL framework in a simple multiplatform app. + +The example was created using Xcode version 14.3.1. + +# Why? +Configuring and building wolfSSL through the `configure` interface can be simpler and more user friendly than manually adding the wolfSSL source files to your project and customizing through `user_settings.h`. Building via `configure` also streamlines integration with other open-source projects that expect an installation directory, such as `cURL`'s `--with-wolfssl` option. Finally, some developer teams might prefer to build wolfSSL once with the desired settings and then distribute it as a library framework for app developers to use. Packaging wolfSSL as a framework makes it highly portable and allows for drag-and-drop integration into Xcode projects without needing to worry about compiling the library every time they build their app. + +However, if you do want to compile wolfSSL from source manually in your Xcode project using `user_settings.h`, see the example in [IDE/XCODE](https://github.com/wolfSSL/wolfssl/tree/master/IDE/XCODE). + +# Example overview +This example consists of a build script and an Xcode example project. The build script generates a static library framework for all Apple targets. The Example project shows how to incorporate the framework into an Xcode project and wolfSSL framework in a simple application. + +## The build script +`build-wolfssl-framework.sh` compiles wolfSSL as static library for all modern Apple platforms and simulators. This includes MacOS (`arm64`,`x86_64`), iPhone (`arm64`), iPhoneSimulator (`arm64`,`x86_64`), appleTV (`arm64`), appleTVSimulator (`arm64`,`x86_64`), appleWatch (`arm64`), and appleWatchSimulator (`arm64`,`x86_64`). The script compiles wolfSSL for each platform, creates universal binaries for platforms that support multiple architectures (macOS and simulators) using [lipo](https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary), then combines all the static libraries together into an `xcframework` that can be imported into Xcode. It is meant to be used as an example rather than a build tool, and chooses simplicity and readability over flexibility (no command line options). For an explanation of how the script cross compiles wolfSSL, see the [Technical Details](technical-details) section. + +To use the build script, you can run it without arguments to build a default configuration, or you can use the `-c` option to pass in a quoted string containing any additional flags to `configure` that you need. Note that `--enable-static --disable-shared` is always passed to `configure` by default. Consider the following usage example, with descriptions in the comments: + +``` +# default configuration +./build-wolfssl-framework.sh + +# hardened configuration with curl support and FIPS-ready crypto +./build-wolfssl-framework.sh -c "--enable-harden --enable-curl --enable-fips=ready" + +``` + +## Example project +`wolfssl-multiplatform` is an xcode project containing a simple swiftUI "hello world" app that has been modified to run the wolfCrypt tests and establish a TLS connection to `www.wolfssl.com` on startup. It also provides an example for basic Swift/C interoperability using a "bridging header". When the app launches, the swiftUI initialization handler calls a C test driver function, which is responsible for running the wolfSSL examples. An overview of the additional files is as follows: + +``` +. +└── wolfssl-multiplatform + ├── wolfssl-multiplatform + │   ├── ContentView.swift # <-- boilerplate swiftUI modified to call wolfSSL test driver on UI init + │   ├── wolfssl_multiplatformApp.swift # <-- basic swift hello world + + │   ├── simple_client_example.c # <-- Simple TLS example that connects to wolfssl.com + │   ├── simple_client_example.h + + │   ├── wolfssl-multiplatform-Bridging-Header.h # <-- "bridging header" that exposes wolfssl_test_driver app to swift + │   ├── wolfssl_test_driver.c # <-- test driver function that runs wolfCrypt tests then calls simple_client_example + │   └── wolfssl_test_driver.h +``` + +For a basic overview on how to call C code from Swift in an Xcode project, see this excellent blog post tutorial: +- [https://rlaguilar.com/posts/integrate-c-library-ios-project-swift](https://rlaguilar.com/posts/integrate-c-library-ios-project-swift) + +More detailed information on swift/C interoperability can be found in the Apple swift language guide, as well as in the official swift documentation: +- [https://developer.apple.com/documentation/swift/c-interoperability](https://developer.apple.com/documentation/swift/c-interoperability) +- [https://www.swift.org/documentation/cxx-interop](https://www.swift.org/documentation/cxx-interop) + +## Adding the framework to an Xcode project +In order to add the framework to any Xcode project, you can simply drag-and-drop the `artifacts/xcframework/libwolfssl.xcframework` directory into Xcode's project source navigator pane. This should automatically add it to the linked libraries for your application. + +# Technical Details + +## Cross compilation +If you are developing on a macOS machine and want to compile wolfSSL to run on macOS, then you can simply use `configure` without further customisation. However, if you wish to build wolfSSL to run on a different Apple device, then you need to cross-compile wolfSSL. Thankfully, `configure` makes cross compilation relatively straightforward by using the `--host` argument to pass the "[target triple](https://wiki.osdev.org/Target_Triplet)" describing the platform of the system on which you wish the binary to run, as well as a few other options which will are described below. For more details on cross-compilation, please see the [GNU cross-compilation documentation](https://www.gnu.org/software/automake/manual/html_node/Cross_002dCompilation.html) and the [wolfSSL manual page on cross-compiling with configure](https://www.wolfssl.com/documentation/manuals/wolfssl/chapter02.html#building-with-configure-with-cross-compile). Note that `clang` is the default compiler on macOS (symlinked to `/usr/bin/gcc`) and natively supports cross compilation for all Apple devices without requiring you to download a separate compiler. This means you do not need to override the system `CC`/`AR`/`RANLIB` etc. when using configure. + +The generic `configure` invocation required to cross compile a static library for an Apple device is as follows: + +``` +./configure --disable-shared --enable-static \ + --prefix=${INSTALL_DIR} \ + --host=${HOST} \ + CFLAGS="-arch ${ARCH} -isysroot ${SDK_ROOT}" + +``` +where the +- `${INSTALL_DIR}` holds the path to the output directory for the wolfSSL install (which we will later include in the framework) +- `--host=${HOST}` is the triple describing the platform. It should be set to `${ARCH}-apple-darwin` for all targets +- `-arch ${ARCH}` is the CPU architecture of the platform. It should be `x86_64` for intel Macs and `arm64` for iPhone, appleTV, appleWatch, and Apple silicon Macs. +- `-isysroot ${SDK_ROOT}` is the path to the new sysroot for the target platform of cross compilation, which is where the compiler should look for system headers and libraries (which are usually different for the target system than for the host system when cross compiling). You can use the Xcode command line tools to query the SDK root path for a given target by running `xcrun --sdk --show-sdk-path`. To get a list of installed targets, run `xcodebuild -showsdks`. + + +## Universal binaries +Apple intoduced two technologies to facilitate packaging portable libraries: "universal binaries" and "frameworks". + +Universal binaries (a.k.a "fat" binaries) allow `elf` files targeting multiple CPU architectures to be combined into a single file (e.g. `x86_64` and `arm64`). These binaries are created using a tool called `lipo`. For more information on lipo and universal binaries, see [Creating Universal Binaries](https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary). + +## Frameworks +In order to facilitate distribution binaries and dependencies, Apple introduced the concept of an `xcframework` bundle, which is a distribution format that allows developers to bundle binaries targeting multiple architectures together with their headers and other metadata. All builds of a library under all target platforms and architectures complete with their dependencies now can be packed ino one single bundle under the `.xcframework` extension. + +## Issues with the process +Low-level programming in the Apple ecosystem is sparsely documented, and certain things that you think "should just work" don't. Here are a few issues we had with the process that need to be documented. + +1. Apps meant to run on a simulator require building for/linking against universal binaries containing architecture slices for both `x86_64` and `arm64`. Even if you have the correct architecture (e.g. compiling on `arm64` and targeting an `arm64` simulator host) Xcode will complain that you have compiled the binary for the wrong host if the elf file does not include an `x86_64` architecture slice. Therefore, `build-wolfssl-framework.sh` builds all libraries for simulator targets for both `x86_64` and `arm64` architectures and links them as universal binaries with `lipo`. Again, it DOES NOT MATTER if you are targeting the correct architecture with your cross-compilation, Xcode will not recognize the binary as targeting the correct architecture unless it contains both. + +2. Cross compiling for the **iOS simulator** with a min version specifier present (`-miphoneos-version-min`) requires the `-target ${ARCH}-apple-ios-simulator` compiler flag in order to build . It is unclear why this is required, as The GNU documentation claims that the `target` option is only required if cross-compiling a compiler to run on architecture X but emit code for architecture Y (known as a canadian cross-compilation scenario). Regardless, if you do not include a `-target` option, the build will generate a large number of warnings when linking against system libraries with messages like: `ld: warning: building for iOS, but linking in .tbd file (/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator16.4.sdk/usr/lib/libnetwork.tbd) built for iOS Simulator`. It was thought that perhaps the host option should instead be `--host=${ARCH}-apple-ios-simulator` but this is not a valid option, and `configure` will fail with a different error: `checking host system type... Invalid configuration 'arm64-apple-ios-simulator': Kernel 'ios' not known to work with OS 'simulator`. If you do not specify a min iOS version, this is not required. Mysteriously, the other simulators (tvOS, watchOS) do not have this issue.... + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/build-wolfssl-framework.sh mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/build-wolfssl-framework.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/build-wolfssl-framework.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/build-wolfssl-framework.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,110 @@ +#!/bin/bash + +# build-wolfssl-framework.sh +# +# Copyright (C) 2006-2023 wolfSSL Inc. +# +# This file is part of wolfSSL. +# +# wolfSSL 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 of the License, or +# (at your option) any later version. +# +# wolfSSL 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + +set -euo pipefail + +WOLFSSL_DIR=$(pwd)/../../ +OUTDIR=$(pwd)/artifacts +LIPODIR=${OUTDIR}/lib +SDK_OUTPUT_DIR=${OUTDIR}/xcframework + +CFLAGS_COMMON="" +# Base configure flags +CONF_OPTS="--disable-shared --enable-static" + +helpFunction() +{ + echo "" + echo "Usage: $0 [-c ]" + echo -e "\t-c Extra flags to be passed to ./configure" + exit 1 # Exit script after printing help +} + +# Parse command line arguments +while getopts ":c:" opt; do + case $opt in + c) + CONF_OPTS+=" $OPTARG" + ;; + \?) + echo "Invalid option: -$OPTARG" >&2; helpFunction + ;; + esac +done + +rm -rf $OUTDIR +mkdir -p $LIPODIR +mkdir -p $SDK_OUTPUT_DIR + +build() { # + set -x + pushd . + cd $WOLFSSL_DIR + + ARCH=$1 + HOST="${ARCH}-apple-darwin" + TYPE=$2 + SDK_ROOT=$(xcrun --sdk ${TYPE} --show-sdk-path) + + ./configure -prefix=${OUTDIR}/wolfssl-${TYPE}-${ARCH} ${CONF_OPTS} --host=${HOST} \ + CFLAGS="${CFLAGS_COMMON} -arch ${ARCH} -isysroot ${SDK_ROOT}" + make -j src/libwolfssl.la + make install + + popd + set +x +} + +XCFRAMEWORKS= +for type in iphonesimulator macosx appletvsimulator watchsimulator ; do + build arm64 ${type} + build x86_64 ${type} + + # Create universal binaries from architecture-specific static libraries + lipo \ + "$OUTDIR/wolfssl-${type}-x86_64/lib/libwolfssl.a" \ + "$OUTDIR/wolfssl-${type}-arm64/lib/libwolfssl.a" \ + -create -output $LIPODIR/libwolfssl-${type}.a + + echo "Checking libraries" + xcrun -sdk ${type} lipo -info $LIPODIR/libwolfssl-${type}.a + XCFRAMEWORKS+=" -library ${LIPODIR}/libwolfssl-${type}.a -headers ${OUTDIR}/wolfssl-${type}-arm64/include" +done + +for type in iphoneos appletvos ; do + build arm64 ${type} + + # Create universal binaries from architecture-specific static libraries + lipo \ + "$OUTDIR/wolfssl-${type}-arm64/lib/libwolfssl.a" \ + -create -output $LIPODIR/libwolfssl-${type}.a + + echo "Checking libraries" + xcrun -sdk ${type} lipo -info $LIPODIR/libwolfssl-${type}.a + XCFRAMEWORKS+=" -library ${LIPODIR}/libwolfssl-${type}.a -headers ${OUTDIR}/wolfssl-${type}-arm64/include" +done + +############################################################################################################################################ +# ********** BUILD FRAMEWORK +############################################################################################################################################ + +xcodebuild -create-xcframework ${XCFRAMEWORKS} -output ${SDK_OUTPUT_DIR}/libwolfssl.xcframework diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root +# + +EXTRA_DIST+= IDE/apple-universal/README.md +EXTRA_DIST+= IDE/apple-universal/build-wolfssl-framework.sh +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform.xcodeproj/project.pbxproj +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.c +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.h +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.c +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.h +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatformApp.swift +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/ContentView.swift +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AppIcon.appiconset/Contents.json +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AccentColor.colorset/Contents.json +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/Contents.json +EXTRA_DIST+= IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatform.entitlements + + + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AccentColor.colorset/Contents.json mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AccentColor.colorset/Contents.json --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AccentColor.colorset/Contents.json 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AccentColor.colorset/Contents.json 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AppIcon.appiconset/Contents.json mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AppIcon.appiconset/Contents.json --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AppIcon.appiconset/Contents.json 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/AppIcon.appiconset/Contents.json 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/Contents.json mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/Contents.json --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/Contents.json 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/Assets.xcassets/Contents.json 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/ContentView.swift mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/ContentView.swift --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/ContentView.swift 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/ContentView.swift 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,47 @@ +/* ContentView.swift + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +import SwiftUI + +struct ContentView: View { + + /* Call our test function in the initialization of the view */ + init() { + wolfssl_test(); + } + + + var body: some View { + VStack { + Image(systemName: "globe") + .imageScale(.large) + .foregroundColor(.accentColor) + Text("Hello, world!") + } + .padding() + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,149 @@ +/* simple_client_example.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include "simple_client_example.h" + +#include +#include +#include +#include +#include + +#ifndef WOLFSSL_USER_SETTINGS +#include +#endif +#include + +#define SERVER_HOST "www.wolfssl.com" +#define SERVER_PORT "443" + +int simple_client_example(void) +{ + WOLFSSL_CTX* ctx; + WOLFSSL* ssl; + int sockfd, ret; + + /* Resolve the server address */ + struct addrinfo hints, *server_addr; + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + ret = getaddrinfo(SERVER_HOST, SERVER_PORT, &hints, &server_addr); + if (ret != 0) { + printf("Failed to resolve server address: %s\n", gai_strerror(ret)); + return 1; + } + + /* Create a TCP socket */ + sockfd = socket(server_addr->ai_family, + server_addr->ai_socktype, + server_addr->ai_protocol); + if (sockfd == -1) { + perror("Failed to create socket"); + freeaddrinfo(server_addr); + return 1; + } + + /* Connect to the server */ + ret = connect(sockfd, server_addr->ai_addr, server_addr->ai_addrlen); + if (ret == -1) { + perror("Failed to connect to server"); + freeaddrinfo(server_addr); + close(sockfd); + return 1; + } + + freeaddrinfo(server_addr); + + /* Initialize wolfSSL library */ + wolfSSL_Init(); + + /* Create a new SSL context */ + ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method()); + if (ctx == NULL) { + printf("Unable to create SSL context.\n"); + close(sockfd); + return 1; + } + + /* Load CA certificate into WOLFSSL_CTX + * NOTE: CERT_PATH macro is set relative to Xcode $(PROJECT_DIR) environment + * variable in the preprocessor macros section of the project build settings + * to avoid hardcoding a path in the source code. The CA cert is located at + * wolfssl/certs/wolfssl-website-ca.pem. */ + ret = wolfSSL_CTX_load_verify_locations(ctx, CERT_PATH, NULL); + if (ret != WOLFSSL_SUCCESS) { + printf("ERROR: failed to load %s, please check the file.\n", CERT_PATH); + wolfSSL_CTX_free(ctx); + close(sockfd); + return 1; + } + + /* Create a new SSL object */ + ssl = wolfSSL_new(ctx); + if (ssl == NULL) { + printf("Unable to create SSL object.\n"); + wolfSSL_CTX_free(ctx); + close(sockfd); + return 1; + } + + /* Attach the SSL object to the socket file descriptor */ + wolfSSL_set_fd(ssl, sockfd); + + /* Perform the SSL handshake */ + ret = wolfSSL_connect(ssl); + if (ret != SSL_SUCCESS) { + printf("SSL connection failed: %d\n", wolfSSL_get_error(ssl, ret)); + wolfSSL_free(ssl); + wolfSSL_CTX_free(ctx); + close(sockfd); + return 1; + } + + /* Send an HTTP request */ + const char* request = "GET / HTTP/1.1\r\nHost: www.wolfssl.com\r\n\r\n"; + ret = wolfSSL_write(ssl, request, (int)strlen(request)); + if (ret < 0) { + printf("Failed to send HTTP request.\n"); + } + + /* Receive and print the server's response */ + char buffer[1024]; + ret = wolfSSL_read(ssl, buffer, sizeof(buffer) - 1); + if (ret > 0) { + buffer[ret] = '\0'; + printf("Received %d bytes:\n%s\n", ret, buffer); + } else { + printf("Failed to receive server response.\n"); + } + + /* Clean up and close the connection */ + wolfSSL_shutdown(ssl); + wolfSSL_free(ssl); + wolfSSL_CTX_free(ctx); + wolfSSL_Cleanup(); + close(sockfd); + + return 0; +} + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/simple_client_example.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,27 @@ +/* simple_client_example.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef simple_client_example_h +#define simple_client_example_h + +int simple_client_example(void); + +#endif /* simple_client_example_h */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,26 @@ +/* wolfssl-multiplatform-Bridging-Header.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* + * Use this file to import your target's public headers that you would like to + * expose to Swift. + */ +#import "wolfssl_test_driver.h" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatform.entitlements mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatform.entitlements --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatform.entitlements 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatform.entitlements 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,14 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + com.apple.security.network.server + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatformApp.swift mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatformApp.swift --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatformApp.swift 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_multiplatformApp.swift 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,32 @@ +/* wolfssl_multiplatformApp.swift + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +import SwiftUI + +@main +struct wolfssl_multiplatformApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,62 @@ +/* wolfssl_test_driver.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include "wolfssl_test_driver.h" + +#ifndef WOLFSSL_USER_SETTINGS +#include +#endif +#include + +#include "test.h" +#include "benchmark.h" +#include "simple_client_example.h" + +typedef struct test_func_args { + int argc; + char** argv; + int return_code; +} test_func_args; + + + +void wolfssl_test(void) +{ + int ret; + test_func_args args = {0}; + +#ifdef WC_RNG_SEED_CB + wc_SetSeed_Cb(wc_GenerateSeed); +#endif + + printf("Run wolfCrypt Test:\n"); + ret = wolfcrypt_test(&args); + printf("\nResult of wolfcrypt_test() = %d\n\n", ret); + + printf("Run wolfCrypt Benchmark:\n"); + ret = benchmark_test(&args); + printf("\nResult of benchmark_test() = %d\n\n", ret); + + printf("Run simple client test:\n"); + ret = simple_client_example(); + printf("\nResult of simple_client_test() = %d\n\n", ret); + +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform/wolfssl_test_driver.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,27 @@ +/* wolfssl_test_driver.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef wolfssl_test_driver_h +#define wolfssl_test_driver_h + +void wolfssl_test(void); + +#endif /* wolfssl_test_driver_h */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform.xcodeproj/project.pbxproj mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform.xcodeproj/project.pbxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform.xcodeproj/project.pbxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/apple-universal/wolfssl-multiplatform/wolfssl-multiplatform.xcodeproj/project.pbxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,403 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 8BC456822A5DCC3D008A4AF7 /* wolfssl_multiplatformApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC456812A5DCC3D008A4AF7 /* wolfssl_multiplatformApp.swift */; }; + 8BC456842A5DCC3D008A4AF7 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BC456832A5DCC3D008A4AF7 /* ContentView.swift */; }; + 8BC456862A5DCC3F008A4AF7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8BC456852A5DCC3F008A4AF7 /* Assets.xcassets */; }; + 8BC456922A5DD04E008A4AF7 /* libwolfssl.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8BC456912A5DD04E008A4AF7 /* libwolfssl.xcframework */; }; + 8BC456972A5DD1F2008A4AF7 /* wolfssl_test_driver.c in Sources */ = {isa = PBXBuildFile; fileRef = 8BC456962A5DD1F2008A4AF7 /* wolfssl_test_driver.c */; }; + 8BC456AB2A5DF7A6008A4AF7 /* test.c in Sources */ = {isa = PBXBuildFile; fileRef = 8BC456AA2A5DF7A6008A4AF7 /* test.c */; settings = {COMPILER_FLAGS = "-DUSE_FLAT_TEST_H -DNO_MAIN_DRIVER -DNO_FILESYSTEM -DSINGLE_THREADED"; }; }; + 8BC456AE2A5DF7BA008A4AF7 /* benchmark.c in Sources */ = {isa = PBXBuildFile; fileRef = 8BC456AC2A5DF7BA008A4AF7 /* benchmark.c */; settings = {COMPILER_FLAGS = "-DUSE_FLAT_BENCHMARK_H -DNO_MAIN_DRIVER -DSINGLE_THREADED"; }; }; + 8BC456F32A5F20C8008A4AF7 /* simple_client_example.c in Sources */ = {isa = PBXBuildFile; fileRef = 8BC456F12A5F20C8008A4AF7 /* simple_client_example.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 8BC4567E2A5DCC3D008A4AF7 /* wolfssl-multiplatform.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "wolfssl-multiplatform.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 8BC456812A5DCC3D008A4AF7 /* wolfssl_multiplatformApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = wolfssl_multiplatformApp.swift; sourceTree = ""; }; + 8BC456832A5DCC3D008A4AF7 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 8BC456852A5DCC3F008A4AF7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8BC456872A5DCC3F008A4AF7 /* wolfssl_multiplatform.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = wolfssl_multiplatform.entitlements; sourceTree = ""; }; + 8BC456912A5DD04E008A4AF7 /* libwolfssl.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libwolfssl.xcframework; path = ../artifacts/xcframework/libwolfssl.xcframework; sourceTree = ""; }; + 8BC456942A5DD1F2008A4AF7 /* wolfssl-multiplatform-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "wolfssl-multiplatform-Bridging-Header.h"; sourceTree = ""; }; + 8BC456952A5DD1F2008A4AF7 /* wolfssl_test_driver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wolfssl_test_driver.h; sourceTree = ""; }; + 8BC456962A5DD1F2008A4AF7 /* wolfssl_test_driver.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = wolfssl_test_driver.c; sourceTree = ""; }; + 8BC456A92A5DF7A6008A4AF7 /* test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test.h; path = ../../../../wolfcrypt/test/test.h; sourceTree = ""; }; + 8BC456AA2A5DF7A6008A4AF7 /* test.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = test.c; path = ../../../../wolfcrypt/test/test.c; sourceTree = ""; }; + 8BC456AC2A5DF7BA008A4AF7 /* benchmark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = benchmark.c; path = ../../../../wolfcrypt/benchmark/benchmark.c; sourceTree = ""; }; + 8BC456AD2A5DF7BA008A4AF7 /* benchmark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = benchmark.h; path = ../../../../wolfcrypt/benchmark/benchmark.h; sourceTree = ""; }; + 8BC456F12A5F20C8008A4AF7 /* simple_client_example.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = simple_client_example.c; sourceTree = ""; }; + 8BC456F22A5F20C8008A4AF7 /* simple_client_example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_client_example.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8BC4567B2A5DCC3D008A4AF7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BC456922A5DD04E008A4AF7 /* libwolfssl.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8BC456752A5DCC3D008A4AF7 = { + isa = PBXGroup; + children = ( + 8BC456802A5DCC3D008A4AF7 /* wolfssl-multiplatform */, + 8BC4567F2A5DCC3D008A4AF7 /* Products */, + 8BC456902A5DD04E008A4AF7 /* Frameworks */, + ); + sourceTree = ""; + }; + 8BC4567F2A5DCC3D008A4AF7 /* Products */ = { + isa = PBXGroup; + children = ( + 8BC4567E2A5DCC3D008A4AF7 /* wolfssl-multiplatform.app */, + ); + name = Products; + sourceTree = ""; + }; + 8BC456802A5DCC3D008A4AF7 /* wolfssl-multiplatform */ = { + isa = PBXGroup; + children = ( + 8BC456A82A5DF787008A4AF7 /* wolfssl-test-apps */, + 8BC456812A5DCC3D008A4AF7 /* wolfssl_multiplatformApp.swift */, + 8BC456832A5DCC3D008A4AF7 /* ContentView.swift */, + 8BC456852A5DCC3F008A4AF7 /* Assets.xcassets */, + 8BC456872A5DCC3F008A4AF7 /* wolfssl_multiplatform.entitlements */, + 8BC456952A5DD1F2008A4AF7 /* wolfssl_test_driver.h */, + 8BC456962A5DD1F2008A4AF7 /* wolfssl_test_driver.c */, + 8BC456942A5DD1F2008A4AF7 /* wolfssl-multiplatform-Bridging-Header.h */, + ); + path = "wolfssl-multiplatform"; + sourceTree = ""; + }; + 8BC456902A5DD04E008A4AF7 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8BC456912A5DD04E008A4AF7 /* libwolfssl.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 8BC456A82A5DF787008A4AF7 /* wolfssl-test-apps */ = { + isa = PBXGroup; + children = ( + 8BC456F12A5F20C8008A4AF7 /* simple_client_example.c */, + 8BC456F22A5F20C8008A4AF7 /* simple_client_example.h */, + 8BC456AC2A5DF7BA008A4AF7 /* benchmark.c */, + 8BC456AD2A5DF7BA008A4AF7 /* benchmark.h */, + 8BC456AA2A5DF7A6008A4AF7 /* test.c */, + 8BC456A92A5DF7A6008A4AF7 /* test.h */, + ); + name = "wolfssl-test-apps"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8BC4567D2A5DCC3D008A4AF7 /* wolfssl-multiplatform */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8BC4568D2A5DCC3F008A4AF7 /* Build configuration list for PBXNativeTarget "wolfssl-multiplatform" */; + buildPhases = ( + 8BC4567A2A5DCC3D008A4AF7 /* Sources */, + 8BC4567B2A5DCC3D008A4AF7 /* Frameworks */, + 8BC4567C2A5DCC3D008A4AF7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "wolfssl-multiplatform"; + productName = "wolfssl-multiplatform"; + productReference = 8BC4567E2A5DCC3D008A4AF7 /* wolfssl-multiplatform.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8BC456762A5DCC3D008A4AF7 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; + TargetAttributes = { + 8BC4567D2A5DCC3D008A4AF7 = { + CreatedOnToolsVersion = 14.3.1; + LastSwiftMigration = 1430; + }; + }; + }; + buildConfigurationList = 8BC456792A5DCC3D008A4AF7 /* Build configuration list for PBXProject "wolfssl-multiplatform" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8BC456752A5DCC3D008A4AF7; + productRefGroup = 8BC4567F2A5DCC3D008A4AF7 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8BC4567D2A5DCC3D008A4AF7 /* wolfssl-multiplatform */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8BC4567C2A5DCC3D008A4AF7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BC456862A5DCC3F008A4AF7 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8BC4567A2A5DCC3D008A4AF7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8BC456972A5DD1F2008A4AF7 /* wolfssl_test_driver.c in Sources */, + 8BC456842A5DCC3D008A4AF7 /* ContentView.swift in Sources */, + 8BC456F32A5F20C8008A4AF7 /* simple_client_example.c in Sources */, + 8BC456822A5DCC3D008A4AF7 /* wolfssl_multiplatformApp.swift in Sources */, + 8BC456AB2A5DF7A6008A4AF7 /* test.c in Sources */, + 8BC456AE2A5DF7BA008A4AF7 /* benchmark.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 8BC4568B2A5DCC3F008A4AF7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 8BC4568C2A5DCC3F008A4AF7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 8BC4568E2A5DCC3F008A4AF7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = "wolfssl-multiplatform/wolfssl_multiplatform.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + ENABLE_PREVIEWS = NO; + GCC_PREPROCESSOR_DEFINITIONS = "CERT_PATH=\\\"$PROJECT_DIR/../../../certs/wolfssl-website-ca.pem\\\""; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MARKETING_VERSION = 1.0; + OTHER_CFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = "wolfSSL.wolfssl-multiplatform"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3"; + }; + name = Debug; + }; + 8BC4568F2A5DCC3F008A4AF7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = "wolfssl-multiplatform/wolfssl_multiplatform.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + ENABLE_PREVIEWS = NO; + GCC_PREPROCESSOR_DEFINITIONS = "CERT_PATH=\\\"$PROJECT_DIR/../../../certs/wolfssl-website-ca.pem\\\""; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MARKETING_VERSION = 1.0; + OTHER_CFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = "wolfSSL.wolfssl-multiplatform"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "wolfssl-multiplatform/wolfssl-multiplatform-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,3"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8BC456792A5DCC3D008A4AF7 /* Build configuration list for PBXProject "wolfssl-multiplatform" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8BC4568B2A5DCC3F008A4AF7 /* Debug */, + 8BC4568C2A5DCC3F008A4AF7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8BC4568D2A5DCC3F008A4AF7 /* Build configuration list for PBXNativeTarget "wolfssl-multiplatform" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8BC4568E2A5DCC3F008A4AF7 /* Debug */, + 8BC4568F2A5DCC3F008A4AF7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8BC456762A5DCC3D008A4AF7 /* Project object */; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -2,57 +2,73 @@ # included from Top Level Makefile.am # All paths should be given relative to the root -include IDE/XCODE/include.am -include IDE/XCODE-FIPSv2/include.am -include IDE/XCODE-FIPSv5/include.am -include IDE/WIN/include.am -include IDE/WIN10/include.am -include IDE/WIN-SGX/include.am -include IDE/LINUX-SGX/include.am -include IDE/WORKBENCH/include.am -include IDE/ROWLEY-CROSSWORKS-ARM/include.am -include IDE/TRUESTUDIO/include.am +include IDE/Android/include.am +include IDE/apple-universal/include.am include IDE/ARDUINO/include.am -include IDE/INTIME-RTOS/include.am -include IDE/KDS/include.am -include IDE/STM32Cube/include.am -include IDE/VS-ARM/include.am -include IDE/MSVS-2019-AZSPHERE/include.am -include IDE/VS-AZURE-SPHERE/include.am -include IDE/GCC-ARM/include.am +include IDE/AURIX/include.am +include IDE/CRYPTOCELL/include.am include IDE/CSBENCH/include.am include IDE/ECLIPSE/DEOS/include.am include IDE/ECLIPSE/MICRIUM/include.am +include IDE/ECLIPSE/RTTHREAD/include.am include IDE/ECLIPSE/SIFIVE/include.am +include IDE/Espressif/include.am +include IDE/GCC-ARM/include.am +include IDE/HEXAGON/include.am +include IDE/IAR-MSP430/include.am +include IDE/Infineon/include.am +include IDE/INTIME-RTOS/include.am +include IDE/iotsafe/include.am +include IDE/KDS/include.am +include IDE/LINUX-SGX/include.am +include IDE/M68K/include.am +include IDE/MCUEXPRESSO/include.am +include IDE/MDK5-ARM/include.am +include IDE/MPLABX16/include.am +include IDE/MPLABX16/wolfcrypt_test.X/nbproject/include.am +include IDE/MPLABX16/wolfssl.X/nbproject/include.am include IDE/MQX/include.am -include IDE/ECLIPSE/RTTHREAD/include.am +include IDE/MSVS-2019-AZSPHERE/include.am include IDE/mynewt/include.am -include IDE/Renesas/e2studio/DK-S7G2/include.am +include IDE/NETOS/include.am +include IDE/PlatformIO/include.am +include IDE/QNX/include.am include IDE/Renesas/cs+/Projects/include.am +include IDE/Renesas/e2studio/DK-S7G2/include.am include IDE/Renesas/e2studio/Projects/include.am include IDE/Renesas/e2studio/RA6M3/include.am +include IDE/Renesas/e2studio/RA6M4/include.am include IDE/Renesas/e2studio/RX65N/GR-ROSE/include.am -include IDE/Renesas/e2studio/RX72N/EnvisionKit/include.am include IDE/Renesas/e2studio/RX65N/RSK/include.am -include IDE/Renesas/e2studio/RA6M4/include.am -include IDE/WICED-STUDIO/include.am -include IDE/CRYPTOCELL/include.am -include IDE/M68K/include.am -include IDE/HEXAGON/include.am +include IDE/Renesas/e2studio/RX72N/EnvisionKit/include.am +include IDE/Renesas/e2studio/RZN2L/include.am include IDE/RISCV/include.am -include IDE/XilinxSDK/include.am +include IDE/ROWLEY-CROSSWORKS-ARM/include.am +include IDE/SimplicityStudio/include.am +include IDE/STARCORE/include.am +include IDE/STM32Cube/include.am +include IDE/TRUESTUDIO/include.am include IDE/VisualDSP/include.am -include IDE/QNX/include.am +include IDE/VS-ARM/include.am +include IDE/VS-AZURE-SPHERE/include.am +include IDE/WICED-STUDIO/include.am +include IDE/WIN-SGX/include.am +include IDE/WIN-SRTP-KDF-140-3/include.am +include IDE/WIN/include.am +include IDE/WIN10/include.am include IDE/WINCE/include.am -include IDE/iotsafe/include.am -include IDE/Android/include.am -include IDE/NETOS/include.am -include IDE/IAR-MSP430/include.am +include IDE/WORKBENCH/include.am +include IDE/XCODE-FIPSv2/include.am +include IDE/XCODE-FIPSv5/include.am +include IDE/XCODE/include.am +include IDE/XilinxSDK/include.am include IDE/zephyr/include.am -include IDE/AURIX/include.am -include IDE/MCUEXPRESSO/include.am -include IDE/Espressif/include.am -include IDE/STARCORE/include.am -EXTRA_DIST+= IDE/IAR-EWARM IDE/MDK-ARM IDE/MDK5-ARM IDE/MYSQL IDE/LPCXPRESSO IDE/HEXIWEAR IDE/Espressif +EXTRA_DIST+= IDE/Espressif +EXTRA_DIST+= IDE/HEXIWEAR +EXTRA_DIST+= IDE/IAR-EWARM +EXTRA_DIST+= IDE/LPCXPRESSO +EXTRA_DIST+= IDE/MDK-ARM +EXTRA_DIST+= IDE/MYSQL EXTRA_DIST+= IDE/OPENSTM32/README.md +EXTRA_DIST+= IDE/PlatformIO diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/iotsafe/memory-tls.c mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/iotsafe/memory-tls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/iotsafe/memory-tls.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/iotsafe/memory-tls.c 2024-08-03 07:30:00.000000000 +0000 @@ -146,9 +146,12 @@ #if (IOTSAFE_ID_SIZE == 1) byte cert_file_id, privkey_id, keypair_id, peer_pubkey_id, peer_cert_id, serv_cert_id; byte ca_cert_id; - #else + #elif (IOTSAFE_ID_SIZE == 2) word16 cert_file_id, privkey_id, keypair_id, peer_pubkey_id, peer_cert_id, serv_cert_id; word16 ca_cert_id; + #else + word32 cert_file_id, privkey_id, keypair_id, peer_pubkey_id, peer_cert_id, serv_cert_id; + word32 ca_cert_id; #endif cert_file_id = CRT_CLIENT_FILE_ID; privkey_id = PRIVKEY_ID; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/iotsafe/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/iotsafe/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/IDE/iotsafe/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/IDE/iotsafe/user_settings.h 2024-08-03 07:30:00.000000000 +0000 @@ -34,7 +34,21 @@ * - Default: one-byte ID sim, with hardcoded server certificate */ -#ifdef TWO_BYTES_ID_DEMO +#if defined(FOUR_BYTES_ID_DEMO) + #define IOTSAFE_ID_SIZE 2 + #define CRT_CLIENT_FILE_ID 0xABCD3430 /* pre-provisioned */ + #define CRT_SERVER_FILE_ID 0xABCD3330 + #define PRIVKEY_ID 0xABCD3230 /* pre-provisioned */ + #define ECDH_KEYPAIR_ID 0xABCD3330 + #define PEER_PUBKEY_ID 0xABCD3730 + #define PEER_CERT_ID 0xABCD3430 + + /* In this version of the demo, the server certificate is + * stored in a buffer, while the CA is read from a file slot in IoT-SAFE + */ + #define SOFT_SERVER_CERT + +#elif defined(TWO_BYTES_ID_DEMO) #define IOTSAFE_ID_SIZE 2 #define CRT_CLIENT_FILE_ID 0x3430 /* pre-provisioned */ #define CRT_SERVER_FILE_ID 0x3330 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/INSTALL mariadb-10.11.9/extra/wolfssl/wolfssl/INSTALL --- mariadb-10.11.6/extra/wolfssl/wolfssl/INSTALL 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/INSTALL 2024-08-03 07:30:00.000000000 +0000 @@ -110,6 +110,53 @@ To build with debugging use: `cmake .. -DCMAKE_BUILD_TYPE=Debug`. + In the simplest form: + + # create a root directory for wolfssl repo + git clone https://github.com/wolfSSL/wolfssl.git + cd wolfssl + + + # From the root of the wolfSSL repo: + + mkdir -p out + pushd out + cmake .. + cmake --build . + + # View the available ciphers with: + ./examples/client/client -e + popd + + + ARIA Cipher Suite. + + The ARIA cipher needs a 3rd party source binary, typically called + `MagicCrypto.tar.gz`. + + The MagicCrypto files can be either copied to the local `wolfssl` directory, + or an environment variable `ARIA_DIR` can be set to point to the location. + + Simply having the environment variable or local `MagicCrypto` directory + will not automatically enable the ARIA Ciphers. + + To enable ARIA Ciphers in wolfSSL for `CMake`: + + # From the root of the wolfSSL repo: + + # set to your path + export ARIA_DIR=~/workspace/MagicCrypto + + mkdir -p out + pushd out + cmake .. -DWOLFSSL_ARIA=yes + cmake --build . + + # View the available ciphers with: + ./examples/client/client -e + popd + + Windows (Visual Studio) --- 1) Go to this page, download the appropriate Windows installer, and install @@ -132,7 +179,7 @@ Windows (command line) --- 1) Open Command Prompt - 2) Run the Visual Studio batch to setup command line variables, e.g. C:\Program Files (x86)\Microsoft Visual + 2) Run the Visual Studio batch to setup command line variables, e.g. C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat 3) Follow steps in "Unix-based Platforms" above. @@ -150,7 +197,7 @@ $ cd ~/oqs $ git clone --single-branch https://github.com/open-quantum-safe/liboqs.git $ cd liboqs/ - $ git checkout af76ca3b1f2fbc1f4f0967595f3bb07692fb3d82 + $ git checkout 0.8.0 $ mkdir build $ cd build $ cmake -DOQS_USE_OPENSSL=0 .. @@ -254,3 +301,130 @@ The wolfssl port in vcpkg is kept up to date by wolfSSL. We also have vcpkg ports for wolftpm, wolfmqtt and curl. + +17. Building with hash-sigs lib for LMS/HSS support [EXPERIMENTAL] + + Using LMS/HSS requires that the hash-sigs lib has been built on + your system. We support hash-sigs lib at this git commit: + b0631b8891295bf2929e68761205337b7c031726 + At the time of writing this, this is the HEAD of the master + branch of the hash-sigs project. + + Currently the hash-sigs project only builds static libraries: + - hss_verify.a: a single-threaded verify-only static lib. + - hss_lib.a: a single-threaded static lib. + - hss_lib_thread.a: a multi-threaded static lib. + + The multi-threaded version will mainly have speedups for key + generation and signing. + + The default LMS build (--enable-lms) will look for + hss_lib.a first, and hss_lib_thread.a second, in a specified + hash-sigs dir. + + The LMS verify-only build (--enable-lms=verify-only) will look + for hss_verify.a only, which is a slimmer library that includes + only the minimal functions necessary for signature verification. + + How to get and build the hash-sigs library: + $ mkdir ~/hash_sigs + $ cd ~/hash_sigs + $ git clone https://github.com/cisco/hash-sigs.git src + $ cd src + $ git checkout b0631b8891295bf2929e68761205337b7c031726 + + In sha256.h, set USE_OPENSSL to 0: + #define USE_OPENSSL 0 + + To build the single-threaded version: + $ make hss_lib.a + $ ls *.a + hss_lib.a + + To build multi-threaded: + $ make hss_lib_thread.a + $ ls *.a + hss_lib_thread.a + + To build verify-only: + $ make hss_verify.a + $ ls *.a + hss_verify.a + + Build wolfSSL with + $ ./configure \ + --enable-static \ + --disable-shared \ + --enable-lms \ + --with-liblms= + $ make + + Run the benchmark against LMS/HSS with: + $ ./wolfcrypt/benchmark/benchmark -lms_hss + +18. Building for Debian, Ubuntu, Linux Mint, and derivatives + + To generate a .deb package, configure wolfSSL with the desired + configuration. Then run `make deb` to generate a Debian package + with the current configuration. To build the package inside a + Docker container, use `make deb-docker`. In both cases the + resulting packages are placed in the root directory of the + project. + +19. Building for RHEL, Fedora, CentOS, SUSE, and openSUSE + + To generate a .rpm package, configure wolfSSL with the desired + configuration. Then run `make rpm` to generate a .rpm package + with the current configuration. To build the package inside a + Docker container, use `make rpm-docker`. In both cases the + resulting packages are placed in the root directory of the + project. + +20. Building with xmss-reference lib for XMSS/XMSS^MT support [EXPERIMENTAL] + + Experimental support for XMSS/XMSS^MT has been achieved by integration + with the xmss-reference implementation from RFC 8391 (XMSS: eXtended + Merkle Signature Scheme). We support a patched version of xmss-reference + based on this git commit: + 171ccbd26f098542a67eb5d2b128281c80bd71a6 + At the time of writing this, this is the HEAD of the master branch of + the xmss-reference project. + + How to get the xmss-reference library: + $ mkdir ~/xmss + $ cd ~/xmss + $ git clone https://github.com/XMSS/xmss-reference.git src + $ cd src + $ git checkout 171ccbd26f098542a67eb5d2b128281c80bd71a6 + $ git apply + + The patch may be found in the wolfssl-examples repo here: + pq/stateful_hash_sig/0001-Patch-to-support-wolfSSL-xmss-reference-integration.patch + + To build patched xmss-reference: + $ make xmss_lib.a + + To build verify-only patched xmss-reference: + $ make xmss_verify_lib.a + + Note that this patch changes xmss-reference to use wolfCrypt SHA256 hashing, + by registering a SHA callback function in xmss-reference. It + thus benefits from all the same asm speedups as wolfCrypt SHA hashing. + Depending on architecture you may build with --enable-intelasm, or + --enable-armasm, and see 30-40% speedups in XMSS/XMSS^MT. + + For full keygen, signing, verifying, and benchmarking support, build + wolfSSL with: + $ ./configure \ + --enable-xmss \ + --with-libxmss= + $ make + + Run the benchmark against XMSS/XMSS^MT with: + $ ./wolfcrypt/benchmark/benchmark -xmss_xmssmt + + For a leaner xmss verify-only build, build with + $ ./configure \ + --enable-xmss=verify-only \ + --with-libxmss= + $ make diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/Makefile.am mariadb-10.11.9/extra/wolfssl/wolfssl/Makefile.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/Makefile.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/Makefile.am 2024-08-03 07:30:00.000000000 +0000 @@ -138,8 +138,7 @@ ACLOCAL_AMFLAGS= -I m4 -EXTRA_DIST+= lib/dummy - +EXTRA_DIST+= .cyignore EXTRA_DIST+= wolfssl.vcproj EXTRA_DIST+= wolfssl.vcxproj EXTRA_DIST+= wolfssl64.sln @@ -152,7 +151,6 @@ EXTRA_DIST+= ChangeLog.md EXTRA_DIST+= LICENSING EXTRA_DIST+= INSTALL -EXTRA_DIST+= IPP EXTRA_DIST+= LPCExpresso.cproject EXTRA_DIST+= LPCExpresso.project EXTRA_DIST+= resource.h wolfssl.rc @@ -161,7 +159,6 @@ include cmake/include.am include wrapper/include.am -include cyassl/include.am include wolfssl/include.am include certs/include.am include doc/include.am @@ -169,7 +166,6 @@ include src/include.am include support/include.am -include wolfcrypt/user-crypto/include.am include wolfcrypt/benchmark/include.am include wolfcrypt/src/include.am include wolfcrypt/test/include.am @@ -177,6 +173,7 @@ include testsuite/include.am include tests/include.am include sslSniffer/sslSnifferTest/include.am +include debian/include.am include rpm/include.am include linuxkm/include.am include zephyr/include.am @@ -245,7 +242,6 @@ tests/unit.log: testsuite/testsuite.log scripts/unit.log: testsuite/testsuite.log -DISTCLEANFILES+= cyassl-config DISTCLEANFILES+= wolfssl-config MAINTAINERCLEANFILES+= wolfssl/wolfcrypt/async.h @@ -267,7 +263,6 @@ -rm build-aux/install-sh -rm build-aux/ltmain.sh -rm build-aux/missing - -rm cyassl-config -rmdir build-aux -rm configure -rm config.log @@ -315,3 +310,8 @@ @find ./ | $(GREP) \.BASE | xargs rm -f @find ./ | $(GREP) \~$$ | xargs rm -f +%.o: %.cu + $(NVCC) -dc $(CUDAFLAGS) -o $@ $< + +.cu.lo: + $(LIBTOOL) --tag=CC --mode=compile $(COMPILE) --compile -o $@ $< -static diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/README mariadb-10.11.9/extra/wolfssl/wolfssl/README --- mariadb-10.11.6/extra/wolfssl/wolfssl/README 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/README 2024-08-03 07:30:00.000000000 +0000 @@ -5,7 +5,7 @@ resource-constrained environments - primarily because of its small size, speed, and feature set. It is commonly used in standard operating environments as well because of its royalty-free pricing and excellent cross platform support. -wolfSSL supports industry standards up to the current TLS 1.3 and DTLS 1.2 +wolfSSL supports industry standards up to the current TLS 1.3 and DTLS 1.3 levels, is up to 20 times smaller than OpenSSL, and offers progressive ciphers such as ChaCha20, Curve25519, and Blake2b. User benchmarking and feedback reports dramatically better performance when using wolfSSL over OpenSSL. @@ -20,11 +20,11 @@ There are many reasons to choose wolfSSL as your embedded SSL solution. Some of the top reasons include size (typical footprint sizes range from 20-100 kB), support for the newest standards (SSL 3.0, TLS 1.0, TLS 1.1, TLS 1.2, TLS 1.3, -DTLS 1.0, and DTLS 1.2), current and progressive cipher support (including -stream ciphers), multi-platform, royalty free, and an OpenSSL compatibility API -to ease porting into existing applications which have previously used the -OpenSSL package. For a complete feature list, see chapter 4 of the wolfSSL -manual. (https://www.wolfssl.com/docs/wolfssl-manual/ch4/) +DTLS 1.0, DTLS 1.2, and DTLS 1.3), current and progressive cipher support +(including stream ciphers), multi-platform, royalty free, and an OpenSSL +compatibility API to ease porting into existing applications which have +previously used the OpenSSL package. For a complete feature list, see chapter 4 +of the wolfSSL manual. (https://www.wolfssl.com/docs/wolfssl-manual/ch4/) *** Notes, Please read *** @@ -70,150 +70,113 @@ *** end Notes *** -# wolfSSL Release 5.6.3 (Jun 20, 2023) +# wolfSSL Release 5.7.2 (July 08, 2024) -Release 5.6.3 has been developed according to wolfSSL's development and QA process (see link below) and successfully passed the quality criteria. +Release 5.7.2 has been developed according to wolfSSL's development and QA +process (see link below) and successfully passed the quality criteria. +https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance -Release 5.6.3 of wolfSSL embedded TLS has 4 bug fixes: +NOTE: * --enable-heapmath is being deprecated and will be removed by end of 2024 -* Fix for setting the atomic macro options introduced in release 5.6.2. This issue affects GNU gcc autoconf builds. The fix resolves a potential mismatch of the generated macros defined in options.h file and the macros used when the wolfSSL library is compiled. In version 5.6.2 this mismatch could result in unstable runtime behavior. -* Fix for invalid suffix error with Windows build using the macro GCM_TABLE_4BIT. -* Improvements to Encrypted Memory support (WC_PROTECT_ENCRYPTED_MEM) implementations for modular exponentiation in SP math-all (sp_int.c) and TFM (tfm.c). -* Improvements to SendAlert for getting output buffer. +## Vulnerabilities +* [Medium] CVE-2024-1544 +Potential ECDSA nonce side channel attack in versions of wolfSSL before 5.6.6 with wc_ecc_sign_hash calls. Generating the ECDSA nonce k samples a random number r and then truncates this randomness with a modular reduction mod n where n is the order of the elliptic curve. Analyzing the division through a control-flow revealing side-channel reveals a bias in the most significant bits of k. Depending on the curve this is either a negligible bias or a significant bias large enough to reconstruct k with lattice reduction methods. Thanks to Luca Wilke, Florian Sieck and Thomas Eisenbarth (University of Lübeck) for reporting the vulnerability. Details will appear in the proceedings of CCS 24. +Fixed https://github.com/wolfSSL/wolfssl/pull/7020 -# wolfSSL Release 5.6.2 (Jun 09, 2023) +* [Medium] CVE-2024-5288 +A private key blinding operation, enabled by defining the macro WOLFSSL_BLIND_PRIVATE_KEY, was added to mitigate a potential row hammer attack on ECC operations. If performing ECC private key operations in an environment where a malicious user could gain fine control over the device and perform row hammer style attacks it is recommended to update the version of wolfSSL used and to build with WOLFSSL_BLIND_PRIVATE_KEY defined. Thanks to Kemal Derya, M. Caner Tol, Berk Sunar for the report (Vernam Applied Cryptography and Cybersecurity Lab at Worcester Polytechnic Institute) +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7416 -Release 5.6.2 has been developed according to wolfSSL's development and QA process (see link below) and successfully passed the quality criteria. -https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance -NOTE: * --enable-heapmath is being deprecated and will be removed by 2024 +* [Low] When parsing a provided maliciously crafted certificate directly using wolfSSL API, outside of a TLS connection, a certificate with an excessively large number of extensions could lead to a potential DoS. There are existing sanity checks during a TLS handshake with wolfSSL which mitigate this issue. Thanks to Bing Shi for the report. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7597 -Release 5.6.2 of wolfSSL embedded TLS has bug fixes and new features including: +* [Low] CVE-2024-5991 +In the function MatchDomainName(), input param str is treated as a NULL terminated string despite being user provided and unchecked. Specifically, the Openssl compatibility function X509_check_host() takes in a pointer and length to check against, with no requirements that it be NULL terminated. While calling without a NULL terminated string is very uncommon, it is still technically allowed. If a caller was attempting to do a name check on a non*NULL terminated buffer, the code would read beyond the bounds of the input array until it found a NULL terminator. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7604 + +* [Medium] CVE-2024-5814 +A malicious TLS1.2 server can force a TLS1.3 client with downgrade capability to use a ciphersuite that it did not agree to and achieve a successful connection. This is because, aside from the extensions, the client was skipping fully parsing the server hello when downgrading from TLS 1.3. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7619 + +* [Medium] OCSP stapling version 2 response verification bypass issue when a crafted response of length 0 is received. Found with internal testing. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7702 + +* [Medium] OCSP stapling version 2 revocation bypass with a retry of a TLS connection attempt. A revoked CA certificate could incorrectly be loaded into the trusted signers list and used in a repeat connection attempt. Found with internal testing. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7702 -## Vulnerabilities -* [Low] In cases where a malicious agent could analyze cache timing at a very detailed level, information about the AES key used could be leaked during T/S Box lookups. One such case was shown on RISC-V hardware using the MicroWalk tool (https://github.com/microwalk-project/Microwalk). A hardened version of T/S Box lookups was added in wolfSSL to help mitigate this potential attack and is now on by default with RISC-V builds and can be enabled on other builds if desired by compiling wolfSSL with the macro WOLFSSL_AES_TOUCH_LINES. Thanks to Jan Wichelmann, Christopher Peredy, Florian Sieck, Anna Pätschke, Thomas Eisenbarth (University of Lübeck): MAMBO-V: Dynamic Side-Channel Leakage Analysis on RISC-V. Fixed in the following GitHub pull request https://github.com/wolfSSL/wolfssl/pull/6309 -* [High] In previous versions of wolfSSL if a TLS 1.3 client gets neither a PSK (pre shared key) extension nor a KSE (key share extension) when connecting to a malicious server, a default predictable buffer gets used for the IKM value when generating the session master secret. Using a potentially known IKM value when generating the session master secret key compromises the key generated, allowing an eavesdropper to reconstruct it and potentially allowing surreptitious access to or meddling with message contents in the session. This issue does not affect client validation of connected servers, nor expose private key information, but could result in an insecure TLS 1.3 session when not controlling both sides of the connection. We recommend that TLS 1.3 client side users update the version of wolfSSL used. Thanks to Johannes from Sectra Communications and Linköping University for the report. Fixed in the following GitHub pull request https://github.com/wolfSSL/wolfssl/pull/6412 ## New Feature Additions +* Added Dilithium/ML-DSA: Implementation of ML-DSA-44/65/87 (PR 7622) +* AES RISC-V 64-bit ASM: ECB/CBC/CTR/GCM/CCM (PR 7569) +* Added CUDA support for AES encryption (PR 7436) +* Added support for gRPC (PR 7445) +* Added function wc_RsaPrivateKeyDecodeRaw to import raw RSA private keys (PR 7608) +* Added crypto callback for SHA-3 (PR 7670) +* Support for Infineon Modus Toolbox with wolfSSL (PR 7369) +* Allow user to send a user_canceled alert by calling wolfSSL_SendUserCanceled (PR 7590) +* C# wrapper SNI support added (PR 7610) +* Quantum-safe algorithm support added to the Linux kernel module (PR 7574) +* Support for NIST 800-56C Option 1 KDF, using the macro WC_KDF_NIST_SP_800_56C added (PR 7589) +* AES-XTS streaming mode added, along with hardware acceleration and kernel module use (PR 7522, 7560, 7424) +* PlatformIO FreeRTOS with ESP build and addition of benchmark and test example applications (PR 7528, 7413, 7559, 7542) -### New Ports and Expansions -* Add support for STM32H5 -* Add support for Renesas TSIP v1.17 -* Add Renesas SCE RSA crypto-only support -* STARCORE DSP port and example builds added -* Add the function wc_PKCS7_SetDefaultSignedAttribs for setting PKCS7 signed attributes to use with PKCS7 bundle creation -* NXP IMX6Q CAAM port with QNX and performance optimizations for AES-CTR - -### New Build Options -* ASN.1 print utility to decode ASN.1 syntax and print out human readable text --enable-asn-print. Utility app is located in the directory ./examples/asn1/ -* Add introspection for math build, wc_GetMathInfo() to get information about the math library compiled into the linked wolfSSL library -* Implement TLS recommendations from RFC 9325 for hardening TLS/DTLS security. Enabled with the autoconf flag --enable-harden-tls. -* Add option to support disabling thread local storage, --disable-threadlocal -* Added wc_DsaSign_ex() and wc_DsaVerify_ex() for handling alternative digest algorithms with DSA Sign/Verify -* Implement atomic operations interface. Macros auto-detect if atomic operations are expected to be available, can be turned off with the macro WOLFSSL_NO_ATOMICS -* Added support for DTLS 1.3 Authentication and Integrity-Only Cipher Suites -* Expand crypto callback to have a device ID find callback function with wc_CryptoCb_SetDeviceFindCb. Enabled with the macro WOLF_CRYPTO_CB_FIND ## Enhancements and Optimizations - -### Optimizations -* Increased performance with ChaCha20 C implementation and general XOR operations -* Added integer type to the ASN.1 sequencing with ASN.1 Integer sequence -* With wolfSSL_get_x509_next_altname reset alt name list to head once cycled through if compiling with the macro WOLFSSL_MULTICIRCULATE_ALTNAMELIST -* Additional key validity sanity checks on input to wolfSSL_EC_KEY_set_private_key -* adds support for TLSv1.3 stateful session tickets when using SSL_OP_NO_TICKET - -### Memory Optimizations -* Improvements to stack usage and management with SP int math library -* Optimization to TLS 1.3 server to remove caching messages for Ed25519/Ed448 -* Added a HAVE_CURL macro build for building a subset of the wolfSSL library when linking with cURL -* Memory usage improvement with reducing the size of alignment needed with AES -* Reduce run time memory used with ECC operations and ALT_ECC_SIZE -* Fixes and improvements for building edge cases such as crypto callback without hash-drbg with low footprint options -* Support HAVE_SESSION_TICKET build option without depending on realloc - -### Documentation -* Instructions for GPDMA on STM32 configuration added -* Add in instructions for compiling with zephyr on STM32 -* Documentation fixup for wolfSSL_get_chain_cert() -* Fix the file pointed to in the TI RTOS documentation that we maintain -* Documentation for wolfSSL_CertManagerFreeCRL -* Updates made to AES and Chacha documentation -* Update Japanese comments for Ed25519, AES, and other miscellaneous items - -### Tests -* Add in an option for easily testing malloc failures when building with WOLFSSL_MEM_FAIL_COUNT macro -* Updated in process for using Expect vs Assert to facilitate more malloc failure tests -* Enhance wolfCrypt test for builds that do not have ECC SECP curves enabled -* ESP32 platform-specific VisualGDB test & benchmark projects -* Update to dependencies in docker container file used for tests -* Fix up for base 10 output with bundled benchmark application - -### Port Updates -* Zephyr port update, compile time warning fixes, misc. fixes when used with TLS and update of includes -* Update RIOT-OS to not compile out use of writev by default -* Update Micrium port to enable use of STM32_RNG -* Micrium updates for XMEMOVE and XSTRTOK use -* Various Espressif HW crypto, SHA2, AES, MP updates -* Added in ASIO build option with CMake builds - -### General Enhancements -* Global codebase cleanup for C89 compliance and wolfCrypt -Wconversion hygiene -* PKCS#11 enhancement adding a callback for RSA key size when using a hardware key, by default 2048 bit key is used -* Allow for unknown OIDs in extensions in wolfSSL_X509_set_ext() -* Allow user to override XSTAT by defining the macro XSTAT when compiling -* Support UPN and SID with x509 certificate extensions and custom OID build -* Write next IV in wolfSSL_DES_ede3_cbc_encrypt for better handling of inline encryption -* Adding NO_ASN_TIME_CHECK build option for compiling out certificate before/after checks -* Improve different peer recvfrom handling and error reporting with ipv4 vs ipv6 +* Expanded STM32 AES hardware acceleration support for use with STM32H5 (PR 7578) +* Adjusted wc_xmss and wc_lms settings to support use with wolfBoot (PR 7393) +* Added the --enable-rpk option to autotools build for using raw public key support (PR 7379) +* SHA-3 Thumb2, ARM32 assembly implementation added (PR 7667) +* Improvements to RSA padding to expose Pad/Unpad APIs (PR 7612) +* Updates and API additions for supporting socat version 1.8.0.0 (PR 7594) +* cmake build improvements, expanding build options with SINGLE_THREADED and post-quantum algorithms, adjusting the generation of options.h file and using “yes;no†boolean instead of strings (PR 7611, 7546, 7479, 7480, 7380) +* Improvements for Renesas RZ support (PR 7474) +* Improvements to dual algorithm certificates for post-quantum keys (PR 7286) +* Added wolfSSL_SessionIsSetup so the user can check if a session ticket has been sent by the server (PR 7430) +* hostap updates: Implement PACs for EAP-FAST and filter cipher list on TLS version change (PR 7446) +* Changed subject name comparison to match different upper and lower cases (PR 7420) +* Support for DTLS 1.3 downgrade when using PSK (PR 7367) +* Update to static memory build for more generic memory pools used (PR 7418) +* Improved performance of Kyber C implementation (PR 7654) +* Support for ECC_CACHE_CURVE with no malloc (PR 7490) +* Added the configure option --enable-debug-trace-errcodes (macro WOLFSSL_DEBUG_TRACE_ERROR_CODES) which enables more debug tracking of error code values (PR 7634) +* Enhanced wc_MakeRsaKey and wc_RsaKeyToDer to work with WOLFSSL_NO_MALLOC (PR 7362) +* Improvements to assembly implementations of ChaCha20 and Poly1305 ASM for use with MSVC (PR 7319) +* Cortex-M inline assembly labels with unique number appended (PR 7649) +* Added secret logging callback to TLS <= 1.2, enabled with the macro HAVE_SECRET_CALLBACK (PR 7372) +* Made wc_RNG_DRBG_Reseed() a public wolfCrypt API (PR 7386) +* Enabled DES3 support without the DES3 ciphers. To re-enable DES3 cipher suites, use the configure flag --enable-des3-tls-suites (PR 7315) +* Added stubs required for latest nginx (1.25.5) (PR 7449) +* Added option for using a custom salt with the function wc_ecc_ctx_set_own_salt (PR 7552) +* Added PQ files for Windows (PR 7419) +* Enhancements to static memory feature, adding the option for a global heap hint (PR 7478) and build options for a lean or debug setting, enabled with --enable-staticmemory=small or --enable-staticmemory=debug (PR 7597) +* Updated --enable-jni to define SESSION_CERTS for wolfJSSE (PR 7557) +* Exposed DTLS in Ada wrapper and updated examples (PR 7397) +* Added additional minimum TLS extension size sanity checks (PR 7602) +* ESP improvements: updating the examples and libraries, updates for Apple HomeKit SHA/SRP, and fix for endianness with SHA512 software fallback (PR 7607, 7392, 7505, 7535) +* Made the wc_CheckCertSigPubKey API publicly available with the define of the macro WOLFSSL_SMALL_CERT_VERIFY (PR 7599) +* Added an alpha/preview of additional FIPS 140-3 full submission, bringing additional algorithms such as SRTP-KDF, AES-XTS, GCM streaming, AES-CFB, ED25519, and ED448 into the FIPS module boundary (PR 7295) +* XCODE support for v5.2.3 of the FIPS module (PR 7140) +* Expanded OpenSSL compatibility layer and added EC_POINT_hex2point (PR 7191) ## Fixes -* Fix for STM32 ECC sign and verify out of bounds buffer write when the hash length passed in is larger than the key size. Thanks to Maximilian for the report. -* Fix to skip Async_DevCtxInit when using init rsa/ecc label/id api's -* Revert WOLFSSL_NO_ASN_STRICT macro guard around alternate names directory list -* In async mode, don't retry decrypting if a valid error is encountered on a packet parse attempt -* Add additional sanity check on PKCS7 index value in wc_PKCS7_DecryptKekri -* Fix for padding when using an AuthEnvelope PKCS7 type with GCM/CCM stream ciphers -* Fix siphash assembly so that no register is left behind -* Fix to not send a TLS 1.3 session ID resume response when resuming and downgrading to a protocol less than TLS 1.3 -* Fix overwriting serialNumber by favouriteDrink when generating a certificate using Cert struct -* Fix for the default realloc used with EspressIf builds -* Track SetDigest usage to avoid invalid free under error conditions -* DTLS v1.3 fix for epoch 0 check on plaintext message -* Fix for session ticket memory leak in wolfSSL_Cleanup -* Fixes for propagating SendAlert errors when the peer disconnects -* Replace XMEMCPY with XMEMMOVE to fix valgrind-3.15.0 reports "Source and destination overlap in memcpy" when using --enable-aesgcm-stream -* Fix for potential out-of-bounds write edge case in fp_mod_2d with --enable-fastmath math library -* Fix getting ECC key size in stm32_ecc_sign_hash_ex -* Fix for case where wc_PeekErrorNodeLineData was not unlocking error queue on error -* Fix for async ECC shared secret state -* Fix for better error checking with sp_gcd with SP int math library -* Fix memory leak in TLSX_KeyShare_Setup when handling an error case -* Fix for double free edge case in InitOCSPRequest when handling a memory allocation failure -* X509 NAME Entry fix for leaking memory on error case -* Fix wolfssl_asn1_time_to_tm setting unexpected fields in tm struct -* Fix for FIPS ECC integrity check with crypto callback set -* BN_to_ASN1_INTEGER fix for handling leading zero byte padding when needed -* Fix a typo in PP macro and add a ceiling to guard against implementation bugs -* DTLS 1.3 fix for using the correct label when deriving the resumption key -* OCSP fix for GetDateInfo edge case with non ASN template builds -* Allow a user set certificate callback function to override the skipAddCA flag when parsing a certificate -* SP int: sp_radix_size when radix 10 fix temp size for handling edge case -* Fixes and improvements for handling failures with memory allocations -* Fix for DecodeECC_DSA_Sig to handle r and s being initialized -* Fix for wc_ecc_is_point to ensure that the x and y are in range [0, p-1] and z is one (affine ordinates) - -### Build Fixes -* Fix for building on Windows with CMake and using USER_SETTINGS and fix for options.h creation with CMake when using USER_SETTINGS -* CMake fixes and improvements for use with mingw32 -* Fix for building with wpas and x509 small options -* Check if colrm is available for options.h creation when using autoconf -* Clean up NO_BIG_INT build, removing WOLFSSL_SP_MATH macro and heapmath compile -* Fix PKCS#7 build with NO_PKCS7_STREAM -* Fix compilation error in CC-RX and remove unnecessary public key import -* SP Build fixes for ARM assembly with ARMv6 clz and ARM thumb debug build -* For to not advertise support for RSA in TLS extensions when compiled with NO_RSA +* Fixed the NXP MMCAU HW acceleration for SHA-256 (PR 7389) +* Fixed AES-CFB1 encrypt/decrypt on size (8*x-1) bits (PR 7431) +* Fixed use of %rip with SHA-256 x64 assembly (PR 7409) +* Fixed OCSP response message build for DTLS (PR 7671) +* Handled edge case in wc_ecc_mulmod() with zero (PR 7532) +* Fixed RPK (Raw Public Key) to follow certificate use correctly (PR 7375) +* Added sanity check on record header with QUIC use (PR 7638) +* Added sanity check for empty directory strings in X.509 when parsing (PR 7669) +* Added sanity check on non-conforming serial number of 0 in certificates being parsed (PR 7625) +* Fixed wolfSSL_CTX_set1_sigalgs_list() to make the TLS connection conform to the selected sig hash algorithm (PR 7693) +* Various fixes for dual algorithm certificates including small stack use and support for Certificate Signing Requests (PR 7577) +* Added sanity check for critical policy extension when wolfSSL is built without policy extension support enabled (PR 7388) +* Added sanity check that the ed25519 signature is smaller than the order (PR 7513) +* Fixed Segger emNet to handle non-blocking want read/want write (PR 7581) + + For additional vulnerability information visit the vulnerability page at: https://www.wolfssl.com/docs/security-vulnerabilities/ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,3 @@ - - Packaging status - - # wolfSSL Embedded SSL/TLS Library The [wolfSSL embedded SSL library](https://www.wolfssl.com/products/wolfssl/) @@ -10,7 +6,7 @@ because of its small size, speed, and feature set. It is commonly used in standard operating environments as well because of its royalty-free pricing and excellent cross platform support. wolfSSL supports industry standards up -to the current [TLS 1.3](https://www.wolfssl.com/tls13) and DTLS 1.2, is up to +to the current [TLS 1.3](https://www.wolfssl.com/tls13) and DTLS 1.3, is up to 20 times smaller than OpenSSL, and offers progressive ciphers such as ChaCha20, Curve25519, Blake2b and Post-Quantum TLS 1.3 groups. User benchmarking and feedback reports dramatically better performance when using wolfSSL over @@ -27,8 +23,8 @@ There are many reasons to choose wolfSSL as your embedded, desktop, mobile, or enterprise SSL/TLS solution. Some of the top reasons include size (typical footprint sizes range from 20-100 kB), support for the newest standards -(SSL 3.0, TLS 1.0, TLS 1.1, TLS 1.2, TLS 1.3, DTLS 1.0, and DTLS 1.2), current -and progressive cipher support (including stream ciphers), multi-platform, +(SSL 3.0, TLS 1.0, TLS 1.1, TLS 1.2, TLS 1.3, DTLS 1.0, DTLS 1.2, and DTLS 1.3), +current and progressive cipher support (including stream ciphers), multi-platform, royalty free, and an OpenSSL compatibility API to ease porting into existing applications which have previously used the OpenSSL package. For a complete feature list, see [Chapter 4](https://www.wolfssl.com/docs/wolfssl-manual/ch4/) @@ -79,150 +75,111 @@ `WC_SHA512` should be used for the enum name. -# wolfSSL Release 5.6.3 (Jun 20, 2023) +# wolfSSL Release 5.7.2 (July 08, 2024) -Release 5.6.3 has been developed according to wolfSSL's development and QA process (see link below) and successfully passed the quality criteria. +Release 5.7.2 has been developed according to wolfSSL's development and QA +process (see link below) and successfully passed the quality criteria. +https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance -Release 5.6.3 of wolfSSL embedded TLS has 4 bug fixes: +NOTE: * --enable-heapmath is being deprecated and will be removed by end of 2024 -* Fix for setting the atomic macro options introduced in release 5.6.2. This issue affects GNU gcc autoconf builds. The fix resolves a potential mismatch of the generated macros defined in options.h file and the macros used when the wolfSSL library is compiled. In version 5.6.2 this mismatch could result in unstable runtime behavior. -* Fix for invalid suffix error with Windows build using the macro GCM_TABLE_4BIT. -* Improvements to Encrypted Memory support (WC_PROTECT_ENCRYPTED_MEM) implementations for modular exponentiation in SP math-all (sp_int.c) and TFM (tfm.c). -* Improvements to SendAlert for getting output buffer. +## Vulnerabilities +* [Medium] CVE-2024-1544 +Potential ECDSA nonce side channel attack in versions of wolfSSL before 5.6.6 with wc_ecc_sign_hash calls. Generating the ECDSA nonce k samples a random number r and then truncates this randomness with a modular reduction mod n where n is the order of the elliptic curve. Analyzing the division through a control-flow revealing side-channel reveals a bias in the most significant bits of k. Depending on the curve this is either a negligible bias or a significant bias large enough to reconstruct k with lattice reduction methods. Thanks to Luca Wilke, Florian Sieck and Thomas Eisenbarth (University of Lübeck) for reporting the vulnerability. Details will appear in the proceedings of CCS 24. +Fixed https://github.com/wolfSSL/wolfssl/pull/7020 -# wolfSSL Release 5.6.2 (Jun 09, 2023) +* [Medium] CVE-2024-5288 +A private key blinding operation, enabled by defining the macro WOLFSSL_BLIND_PRIVATE_KEY, was added to mitigate a potential row hammer attack on ECC operations. If performing ECC private key operations in an environment where a malicious user could gain fine control over the device and perform row hammer style attacks it is recommended to update the version of wolfSSL used and to build with WOLFSSL_BLIND_PRIVATE_KEY defined. Thanks to Kemal Derya, M. Caner Tol, Berk Sunar for the report (Vernam Applied Cryptography and Cybersecurity Lab at Worcester Polytechnic Institute) +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7416 -Release 5.6.2 has been developed according to wolfSSL's development and QA process (see link below) and successfully passed the quality criteria. -https://www.wolfssl.com/about/wolfssl-software-development-process-quality-assurance -NOTE: * --enable-heapmath is being deprecated and will be removed by 2024 +* [Low] When parsing a provided maliciously crafted certificate directly using wolfSSL API, outside of a TLS connection, a certificate with an excessively large number of extensions could lead to a potential DoS. There are existing sanity checks during a TLS handshake with wolfSSL which mitigate this issue. Thanks to Bing Shi for the report. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7597 -Release 5.6.2 of wolfSSL embedded TLS has bug fixes and new features including: +* [Low] CVE-2024-5991 +In the function MatchDomainName(), input param str is treated as a NULL terminated string despite being user provided and unchecked. Specifically, the Openssl compatibility function X509_check_host() takes in a pointer and length to check against, with no requirements that it be NULL terminated. While calling without a NULL terminated string is very uncommon, it is still technically allowed. If a caller was attempting to do a name check on a non*NULL terminated buffer, the code would read beyond the bounds of the input array until it found a NULL terminator. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7604 + +* [Medium] CVE-2024-5814 +A malicious TLS1.2 server can force a TLS1.3 client with downgrade capability to use a ciphersuite that it did not agree to and achieve a successful connection. This is because, aside from the extensions, the client was skipping fully parsing the server hello when downgrading from TLS 1.3. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7619 + +* [Medium] OCSP stapling version 2 response verification bypass issue when a crafted response of length 0 is received. Found with internal testing. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7702 + +* [Medium] OCSP stapling version 2 revocation bypass with a retry of a TLS connection attempt. A revoked CA certificate could incorrectly be loaded into the trusted signers list and used in a repeat connection attempt. Found with internal testing. +Fixed in github pull request https://github.com/wolfSSL/wolfssl/pull/7702 -## Vulnerabilities -* [Low] In cases where a malicious agent could analyze cache timing at a very detailed level, information about the AES key used could be leaked during T/S Box lookups. One such case was shown on RISC-V hardware using the MicroWalk tool (https://github.com/microwalk-project/Microwalk). A hardened version of T/S Box lookups was added in wolfSSL to help mitigate this potential attack and is now on by default with RISC-V builds and can be enabled on other builds if desired by compiling wolfSSL with the macro WOLFSSL_AES_TOUCH_LINES. Thanks to Jan Wichelmann, Christopher Peredy, Florian Sieck, Anna Pätschke, Thomas Eisenbarth (University of Lübeck): MAMBO-V: Dynamic Side-Channel Leakage Analysis on RISC-V. Fixed in the following GitHub pull request https://github.com/wolfSSL/wolfssl/pull/6309 -* [High] In previous versions of wolfSSL if a TLS 1.3 client gets neither a PSK (pre shared key) extension nor a KSE (key share extension) when connecting to a malicious server, a default predictable buffer gets used for the IKM value when generating the session master secret. Using a potentially known IKM value when generating the session master secret key compromises the key generated, allowing an eavesdropper to reconstruct it and potentially allowing surreptitious access to or meddling with message contents in the session. This issue does not affect client validation of connected servers, nor expose private key information, but could result in an insecure TLS 1.3 session when not controlling both sides of the connection. We recommend that TLS 1.3 client side users update the version of wolfSSL used. Thanks to Johannes from Sectra Communications and Linköping University for the report. Fixed in the following GitHub pull request https://github.com/wolfSSL/wolfssl/pull/6412 ## New Feature Additions +* Added Dilithium/ML-DSA: Implementation of ML-DSA-44/65/87 (PR 7622) +* AES RISC-V 64-bit ASM: ECB/CBC/CTR/GCM/CCM (PR 7569) +* Added CUDA support for AES encryption (PR 7436) +* Added support for gRPC (PR 7445) +* Added function wc_RsaPrivateKeyDecodeRaw to import raw RSA private keys (PR 7608) +* Added crypto callback for SHA-3 (PR 7670) +* Support for Infineon Modus Toolbox with wolfSSL (PR 7369) +* Allow user to send a user_canceled alert by calling wolfSSL_SendUserCanceled (PR 7590) +* C# wrapper SNI support added (PR 7610) +* Quantum-safe algorithm support added to the Linux kernel module (PR 7574) +* Support for NIST 800-56C Option 1 KDF, using the macro WC_KDF_NIST_SP_800_56C added (PR 7589) +* AES-XTS streaming mode added, along with hardware acceleration and kernel module use (PR 7522, 7560, 7424) +* PlatformIO FreeRTOS with ESP build and addition of benchmark and test example applications (PR 7528, 7413, 7559, 7542) -### New Ports and Expansions -* Add support for STM32H5 -* Add support for Renesas TSIP v1.17 -* Add Renesas SCE RSA crypto-only support -* STARCORE DSP port and example builds added -* Add the function wc_PKCS7_SetDefaultSignedAttribs for setting PKCS7 signed attributes to use with PKCS7 bundle creation -* NXP IMX6Q CAAM port with QNX and performance optimizations for AES-CTR - -### New Build Options -* ASN.1 print utility to decode ASN.1 syntax and print out human readable text --enable-asn-print. Utility app is located in the directory ./examples/asn1/ -* Add introspection for math build, wc_GetMathInfo() to get information about the math library compiled into the linked wolfSSL library -* Implement TLS recommendations from RFC 9325 for hardening TLS/DTLS security. Enabled with the autoconf flag --enable-harden-tls. -* Add option to support disabling thread local storage, --disable-threadlocal -* Added wc_DsaSign_ex() and wc_DsaVerify_ex() for handling alternative digest algorithms with DSA Sign/Verify -* Implement atomic operations interface. Macros auto-detect if atomic operations are expected to be available, can be turned off with the macro WOLFSSL_NO_ATOMICS -* Added support for DTLS 1.3 Authentication and Integrity-Only Cipher Suites -* Expand crypto callback to have a device ID find callback function with wc_CryptoCb_SetDeviceFindCb. Enabled with the macro WOLF_CRYPTO_CB_FIND ## Enhancements and Optimizations - -### Optimizations -* Increased performance with ChaCha20 C implementation and general XOR operations -* Added integer type to the ASN.1 sequencing with ASN.1 Integer sequence -* With wolfSSL_get_x509_next_altname reset alt name list to head once cycled through if compiling with the macro WOLFSSL_MULTICIRCULATE_ALTNAMELIST -* Additional key validity sanity checks on input to wolfSSL_EC_KEY_set_private_key -* adds support for TLSv1.3 stateful session tickets when using SSL_OP_NO_TICKET - -### Memory Optimizations -* Improvements to stack usage and management with SP int math library -* Optimization to TLS 1.3 server to remove caching messages for Ed25519/Ed448 -* Added a HAVE_CURL macro build for building a subset of the wolfSSL library when linking with cURL -* Memory usage improvement with reducing the size of alignment needed with AES -* Reduce run time memory used with ECC operations and ALT_ECC_SIZE -* Fixes and improvements for building edge cases such as crypto callback without hash-drbg with low footprint options -* Support HAVE_SESSION_TICKET build option without depending on realloc - -### Documentation -* Instructions for GPDMA on STM32 configuration added -* Add in instructions for compiling with zephyr on STM32 -* Documentation fixup for wolfSSL_get_chain_cert() -* Fix the file pointed to in the TI RTOS documentation that we maintain -* Documentation for wolfSSL_CertManagerFreeCRL -* Updates made to AES and Chacha documentation -* Update Japanese comments for Ed25519, AES, and other miscellaneous items - -### Tests -* Add in an option for easily testing malloc failures when building with WOLFSSL_MEM_FAIL_COUNT macro -* Updated in process for using Expect vs Assert to facilitate more malloc failure tests -* Enhance wolfCrypt test for builds that do not have ECC SECP curves enabled -* ESP32 platform-specific VisualGDB test & benchmark projects -* Update to dependencies in docker container file used for tests -* Fix up for base 10 output with bundled benchmark application - -### Port Updates -* Zephyr port update, compile time warning fixes, misc. fixes when used with TLS and update of includes -* Update RIOT-OS to not compile out use of writev by default -* Update Micrium port to enable use of STM32_RNG -* Micrium updates for XMEMOVE and XSTRTOK use -* Various Espressif HW crypto, SHA2, AES, MP updates -* Added in ASIO build option with CMake builds - -### General Enhancements -* Global codebase cleanup for C89 compliance and wolfCrypt -Wconversion hygiene -* PKCS#11 enhancement adding a callback for RSA key size when using a hardware key, by default 2048 bit key is used -* Allow for unknown OIDs in extensions in wolfSSL_X509_set_ext() -* Allow user to override XSTAT by defining the macro XSTAT when compiling -* Support UPN and SID with x509 certificate extensions and custom OID build -* Write next IV in wolfSSL_DES_ede3_cbc_encrypt for better handling of inline encryption -* Adding NO_ASN_TIME_CHECK build option for compiling out certificate before/after checks -* Improve different peer recvfrom handling and error reporting with ipv4 vs ipv6 +* Expanded STM32 AES hardware acceleration support for use with STM32H5 (PR 7578) +* Adjusted wc_xmss and wc_lms settings to support use with wolfBoot (PR 7393) +* Added the --enable-rpk option to autotools build for using raw public key support (PR 7379) +* SHA-3 Thumb2, ARM32 assembly implementation added (PR 7667) +* Improvements to RSA padding to expose Pad/Unpad APIs (PR 7612) +* Updates and API additions for supporting socat version 1.8.0.0 (PR 7594) +* cmake build improvements, expanding build options with SINGLE_THREADED and post-quantum algorithms, adjusting the generation of options.h file and using “yes;no†boolean instead of strings (PR 7611, 7546, 7479, 7480, 7380) +* Improvements for Renesas RZ support (PR 7474) +* Improvements to dual algorithm certificates for post-quantum keys (PR 7286) +* Added wolfSSL_SessionIsSetup so the user can check if a session ticket has been sent by the server (PR 7430) +* hostap updates: Implement PACs for EAP-FAST and filter cipher list on TLS version change (PR 7446) +* Changed subject name comparison to match different upper and lower cases (PR 7420) +* Support for DTLS 1.3 downgrade when using PSK (PR 7367) +* Update to static memory build for more generic memory pools used (PR 7418) +* Improved performance of Kyber C implementation (PR 7654) +* Support for ECC_CACHE_CURVE with no malloc (PR 7490) +* Added the configure option --enable-debug-trace-errcodes (macro WOLFSSL_DEBUG_TRACE_ERROR_CODES) which enables more debug tracking of error code values (PR 7634) +* Enhanced wc_MakeRsaKey and wc_RsaKeyToDer to work with WOLFSSL_NO_MALLOC (PR 7362) +* Improvements to assembly implementations of ChaCha20 and Poly1305 ASM for use with MSVC (PR 7319) +* Cortex-M inline assembly labels with unique number appended (PR 7649) +* Added secret logging callback to TLS <= 1.2, enabled with the macro HAVE_SECRET_CALLBACK (PR 7372) +* Made wc_RNG_DRBG_Reseed() a public wolfCrypt API (PR 7386) +* Enabled DES3 support without the DES3 ciphers. To re-enable DES3 cipher suites, use the configure flag --enable-des3-tls-suites (PR 7315) +* Added stubs required for latest nginx (1.25.5) (PR 7449) +* Added option for using a custom salt with the function wc_ecc_ctx_set_own_salt (PR 7552) +* Added PQ files for Windows (PR 7419) +* Enhancements to static memory feature, adding the option for a global heap hint (PR 7478) and build options for a lean or debug setting, enabled with --enable-staticmemory=small or --enable-staticmemory=debug (PR 7597) +* Updated --enable-jni to define SESSION_CERTS for wolfJSSE (PR 7557) +* Exposed DTLS in Ada wrapper and updated examples (PR 7397) +* Added additional minimum TLS extension size sanity checks (PR 7602) +* ESP improvements: updating the examples and libraries, updates for Apple HomeKit SHA/SRP, and fix for endianness with SHA512 software fallback (PR 7607, 7392, 7505, 7535) +* Made the wc_CheckCertSigPubKey API publicly available with the define of the macro WOLFSSL_SMALL_CERT_VERIFY (PR 7599) +* Added an alpha/preview of additional FIPS 140-3 full submission, bringing additional algorithms such as SRTP-KDF, AES-XTS, GCM streaming, AES-CFB, ED25519, and ED448 into the FIPS module boundary (PR 7295) +* XCODE support for v5.2.3 of the FIPS module (PR 7140) +* Expanded OpenSSL compatibility layer and added EC_POINT_hex2point (PR 7191) ## Fixes -* Fix for STM32 ECC sign and verify out of bounds buffer write when the hash length passed in is larger than the key size. Thanks to Maximilian for the report. -* Fix to skip Async_DevCtxInit when using init rsa/ecc label/id api's -* Revert WOLFSSL_NO_ASN_STRICT macro guard around alternate names directory list -* In async mode, don't retry decrypting if a valid error is encountered on a packet parse attempt -* Add additional sanity check on PKCS7 index value in wc_PKCS7_DecryptKekri -* Fix for padding when using an AuthEnvelope PKCS7 type with GCM/CCM stream ciphers -* Fix siphash assembly so that no register is left behind -* Fix to not send a TLS 1.3 session ID resume response when resuming and downgrading to a protocol less than TLS 1.3 -* Fix overwriting serialNumber by favouriteDrink when generating a certificate using Cert struct -* Fix for the default realloc used with EspressIf builds -* Track SetDigest usage to avoid invalid free under error conditions -* DTLS v1.3 fix for epoch 0 check on plaintext message -* Fix for session ticket memory leak in wolfSSL_Cleanup -* Fixes for propagating SendAlert errors when the peer disconnects -* Replace XMEMCPY with XMEMMOVE to fix valgrind-3.15.0 reports "Source and destination overlap in memcpy" when using --enable-aesgcm-stream -* Fix for potential out-of-bounds write edge case in fp_mod_2d with --enable-fastmath math library -* Fix getting ECC key size in stm32_ecc_sign_hash_ex -* Fix for case where wc_PeekErrorNodeLineData was not unlocking error queue on error -* Fix for async ECC shared secret state -* Fix for better error checking with sp_gcd with SP int math library -* Fix memory leak in TLSX_KeyShare_Setup when handling an error case -* Fix for double free edge case in InitOCSPRequest when handling a memory allocation failure -* X509 NAME Entry fix for leaking memory on error case -* Fix wolfssl_asn1_time_to_tm setting unexpected fields in tm struct -* Fix for FIPS ECC integrity check with crypto callback set -* BN_to_ASN1_INTEGER fix for handling leading zero byte padding when needed -* Fix a typo in PP macro and add a ceiling to guard against implementation bugs -* DTLS 1.3 fix for using the correct label when deriving the resumption key -* OCSP fix for GetDateInfo edge case with non ASN template builds -* Allow a user set certificate callback function to override the skipAddCA flag when parsing a certificate -* SP int: sp_radix_size when radix 10 fix temp size for handling edge case -* Fixes and improvements for handling failures with memory allocations -* Fix for DecodeECC_DSA_Sig to handle r and s being initialized -* Fix for wc_ecc_is_point to ensure that the x and y are in range [0, p-1] and z is one (affine ordinates) - -### Build Fixes -* Fix for building on Windows with CMake and using USER_SETTINGS and fix for options.h creation with CMake when using USER_SETTINGS -* CMake fixes and improvements for use with mingw32 -* Fix for building with wpas and x509 small options -* Check if colrm is available for options.h creation when using autoconf -* Clean up NO_BIG_INT build, removing WOLFSSL_SP_MATH macro and heapmath compile -* Fix PKCS#7 build with NO_PKCS7_STREAM -* Fix compilation error in CC-RX and remove unnecessary public key import -* SP Build fixes for ARM assembly with ARMv6 clz and ARM thumb debug build -* For to not advertise support for RSA in TLS extensions when compiled with NO_RSA +* Fixed the NXP MMCAU HW acceleration for SHA-256 (PR 7389) +* Fixed AES-CFB1 encrypt/decrypt on size (8*x-1) bits (PR 7431) +* Fixed use of %rip with SHA-256 x64 assembly (PR 7409) +* Fixed OCSP response message build for DTLS (PR 7671) +* Handled edge case in wc_ecc_mulmod() with zero (PR 7532) +* Fixed RPK (Raw Public Key) to follow certificate use correctly (PR 7375) +* Added sanity check on record header with QUIC use (PR 7638) +* Added sanity check for empty directory strings in X.509 when parsing (PR 7669) +* Added sanity check on non-conforming serial number of 0 in certificates being parsed (PR 7625) +* Fixed wolfSSL_CTX_set1_sigalgs_list() to make the TLS connection conform to the selected sig hash algorithm (PR 7693) +* Various fixes for dual algorithm certificates including small stack use and support for Certificate Signing Requests (PR 7577) +* Added sanity check for critical policy extension when wolfSSL is built without policy extension support enabled (PR 7388) +* Added sanity check that the ed25519 signature is smaller than the order (PR 7513) +* Fixed Segger emNet to handle non-blocking want read/want write (PR 7581) For additional vulnerability information visit the vulnerability page at: https://www.wolfssl.com/docs/security-vulnerabilities/ @@ -230,7 +187,6 @@ See INSTALL file for build instructions. More info can be found on-line at: https://wolfssl.com/wolfSSL/Docs.html - # Resources [wolfSSL Website](https://www.wolfssl.com/) @@ -252,3 +208,51 @@ [wolfSSL Vulnerabilities](https://www.wolfssl.com/docs/security-vulnerabilities/) [Additional wolfSSL Examples](https://github.com/wolfssl/wolfssl-examples) + +# Directory structure + +``` + +├── certs [Certificates used in tests and examples] +├── cmake [Cmake build utilities] +├── debian [Debian packaging files] +├── doc [Documentation for wolfSSL (Doxygen)] +├── Docker [Prebuilt Docker environments] +├── examples [wolfSSL examples] +│   ├── asn1 [ASN.1 printing example] +│   ├── async [Asynchronous Cryptography example] +│   ├── benchmark [TLS benchmark example] +│   ├── client [Client example] +│   ├── configs [Example build configurations] +│   ├── echoclient [Echoclient example] +│   ├── echoserver [Echoserver example] +│   ├── pem [Example for convert between PEM and DER] +│   ├── sctp [Servers and clients that demonstrate wolfSSL's DTLS-SCTP support] +│   └── server [Server example] +├── IDE [Contains example projects for various development environments] +├── linuxkm [Linux Kernel Module implementation] +├── m4 [Autotools utilities] +├── mcapi [wolfSSL MPLAB X Project Files] +├── mplabx [wolfSSL MPLAB X Project Files] +├── mqx [wolfSSL Freescale CodeWarrior Project Files] +├── rpm [RPM packaging metadata] +├── RTOS +│   └── nuttx [Port of wolfSSL for NuttX] +├── scripts [Testing scripts] +├── src [wolfSSL source code] +├── sslSniffer [wolfSSL sniffer can be used to passively sniff SSL traffic] +├── support [Contains the pkg-config file] +├── tests [Unit and configuration testing] +├── testsuite [Test application that orchestrates tests] +├── tirtos [Port of wolfSSL for TI RTOS] +├── wolfcrypt [The wolfCrypt component] +│   ├── benchmark [Cryptography benchmarking application] +│   ├── src [wolfCrypt source code] +│   │   └── port [Supported hardware acceleration ports] +│   └── test [Cryptography testing application] +├── wolfssl [Header files] +│   ├── openssl [Compatibility layer headers] +│   └── wolfcrypt [Header files] +├── wrapper [wolfSSL language wrappers] +└── zephyr [Port of wolfSSL for Zephyr RTOS] +``` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/SCRIPTS-LIST mariadb-10.11.9/extra/wolfssl/wolfssl/SCRIPTS-LIST --- mariadb-10.11.6/extra/wolfssl/wolfssl/SCRIPTS-LIST 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/SCRIPTS-LIST 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,7 @@ autogen.sh - creates ./configure from source checkout, sets up git hooks pre-commit.sh - our pre commit hook, saves current state before running commit - tests to allow a resotre back to current state + tests to allow a restore back to current state commit-tests.sh - our commit tests, must pass before a commit is accepted, use -n (--no-verify) to disable diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/async-check.sh mariadb-10.11.9/extra/wolfssl/wolfssl/async-check.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/async-check.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/async-check.sh 2024-08-03 07:30:00.000000000 +0000 @@ -1,34 +1,23 @@ #!/bin/bash -# async-check.sh - # This script creates symbolic links to the required asynchronous # file for using the asynchronous simulator and make check -# -# $ ./async-check [keep|clean|setup] -# -# - keep: (default off) ./async and links kept around for inspection -# - clean: (default off) only cleanup existing ./async and links -# - setup: (default off) only setup ./async and links but don't run config -# or make -# + +# Fail on any error in script +set -e ASYNC_REPO=https://github.com/wolfSSL/wolfAsyncCrypt.git +ASYNC_DIR=${ASYNC_DIR:-wolfAsyncCrypt} function Usage() { - printf '\n%s\n\n' "Usage: $0 [keep|clean|setup]" - printf '%s\n' "Where \"keep\" means keep (default off) async files around for inspection" - printf '%s\n' "Where \"clean\" means only clean (default off) the async files" - printf '%s\n\n' "Where \"setup\" means only setup (default off) the async files" - printf '%s\n' "EXAMPLE:" - printf '%s\n' "---------------------------------" - printf '%s\n' "./async-check.sh keep" - printf '%s\n' "./async-check.sh clean" - printf '%s\n' "./async-check.sh setup" - printf '%s\n\n' "---------------------------------" + printf "Usage: $0 [install|uninstall|test|remove]\n" + printf "\tinstall - get and set up links to wolfAsyncCrypt files\n" + printf "\tuninstall - remove the links to wolfAsyncCrypt\n" + printf "\ttest - install and run 'make check'\n" + printf "\tremove - uninstall and remove wolfAsyncCrypt\n" } -function CleanUp() { +function UnlinkFiles() { unlink ./wolfcrypt/src/async.c unlink ./wolfssl/wolfcrypt/async.h unlink ./wolfcrypt/src/port/intel/quickassist.c @@ -40,8 +29,6 @@ unlink ./wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h unlink ./wolfcrypt/src/port/cavium/README.md - rm -rf ./async - # restore original README.md files git checkout -- wolfcrypt/src/port/cavium/README.md git checkout -- wolfcrypt/src/port/intel/README.md @@ -49,16 +36,46 @@ function LinkFiles() { # link files - ln -s -f ../../async/wolfcrypt/src/async.c ./wolfcrypt/src/async.c - ln -s -f ../../async/wolfssl/wolfcrypt/async.h ./wolfssl/wolfcrypt/async.h - ln -s -f ../../../../async/wolfcrypt/src/port/intel/quickassist.c ./wolfcrypt/src/port/intel/quickassist.c - ln -s -f ../../../../async/wolfcrypt/src/port/intel/quickassist_mem.c ./wolfcrypt/src/port/intel/quickassist_mem.c - ln -s -f ../../../../async/wolfcrypt/src/port/intel/README.md ./wolfcrypt/src/port/intel/README.md - ln -s -f ../../../../async/wolfssl/wolfcrypt/port/intel/quickassist.h ./wolfssl/wolfcrypt/port/intel/quickassist.h - ln -s -f ../../../../async/wolfssl/wolfcrypt/port/intel/quickassist_mem.h ./wolfssl/wolfcrypt/port/intel/quickassist_mem.h - ln -s -f ../../../../async/wolfcrypt/src/port/cavium/cavium_nitrox.c ./wolfcrypt/src/port/cavium/cavium_nitrox.c - ln -s -f ../../../../async/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h ./wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h - ln -s -f ../../../../async/wolfcrypt/src/port/cavium/README.md ./wolfcrypt/src/port/cavium/README.md + ln -s -f ../../${ASYNC_DIR}/wolfcrypt/src/async.c ./wolfcrypt/src/async.c + ln -s -f ../../${ASYNC_DIR}/wolfssl/wolfcrypt/async.h ./wolfssl/wolfcrypt/async.h + ln -s -f ../../../../${ASYNC_DIR}/wolfcrypt/src/port/intel/quickassist.c ./wolfcrypt/src/port/intel/quickassist.c + ln -s -f ../../../../${ASYNC_DIR}/wolfcrypt/src/port/intel/quickassist_mem.c ./wolfcrypt/src/port/intel/quickassist_mem.c + ln -s -f ../../../../${ASYNC_DIR}/wolfcrypt/src/port/intel/README.md ./wolfcrypt/src/port/intel/README.md + ln -s -f ../../../../${ASYNC_DIR}/wolfssl/wolfcrypt/port/intel/quickassist.h ./wolfssl/wolfcrypt/port/intel/quickassist.h + ln -s -f ../../../../${ASYNC_DIR}/wolfssl/wolfcrypt/port/intel/quickassist_mem.h ./wolfssl/wolfcrypt/port/intel/quickassist_mem.h + ln -s -f ../../../../${ASYNC_DIR}/wolfcrypt/src/port/cavium/cavium_nitrox.c ./wolfcrypt/src/port/cavium/cavium_nitrox.c + ln -s -f ../../../../${ASYNC_DIR}/wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h ./wolfssl/wolfcrypt/port/cavium/cavium_nitrox.h + ln -s -f ../../../../${ASYNC_DIR}/wolfcrypt/src/port/cavium/README.md ./wolfcrypt/src/port/cavium/README.md +} + +function Install() { + if [ -d $ASYNC_DIR ]; + then + echo "Using existing async repo" + else + # make a clone of the wolfAsyncCrypt repository + git clone --depth 1 $ASYNC_REPO $ASYNC_DIR + fi + +# setup auto-conf + ./autogen.sh + LinkFiles +} + +function Uninstall() { + UnlinkFiles +} + +function Test() { + Install + ./configure --enable-asynccrypt --enable-all + make check +} + +function Remove() { + UnlinkFiles + + rm -rf ${ASYNC_DIR} } if [ "$#" -gt 1 ]; then @@ -66,19 +83,18 @@ exit 1 fi -KEEP=no -ONLY_SETUP=no - case "x$1" in - "xkeep") - KEEP=yes + "xinstall") + Install ;; - "xclean") - CleanUp - exit 0 + "xuninstall") + Uninstall ;; - "xsetup") - ONLY_SETUP=yes + "xremove") + Remove + ;; + "xtest") + Test ;; *) Usage @@ -86,28 +102,3 @@ ;; esac -# Fail on any error in script from now on -set -e - -if [ -d ./async ]; -then - echo "\n\nUsing existing async repo\n\n" -else - # make a clone of the wolfAsyncCrypt repository - git clone --depth 1 $ASYNC_REPO async -fi - -# setup auto-conf -./autogen.sh -LinkFiles -if [ "x$ONLY_SETUP" == "xno" ]; -then - ./configure --enable-asynccrypt --enable-all - make check - # Clean up - if [ "x$KEEP" == "xno" ]; - then - CleanUp - fi -fi - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/autogen.sh mariadb-10.11.9/extra/wolfssl/wolfssl/autogen.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/autogen.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/autogen.sh 2024-08-03 07:30:00.000000000 +0000 @@ -3,16 +3,16 @@ # Create configure and makefile stuff... # -# Git hooks should come before autoreconf. -if [ -d .git ]; then - if [ ! -d .git/hooks ]; then - mkdir .git/hooks || exit $? - fi - if [ ! -e .git/hooks/pre-commit ]; then - ln -s ../../pre-commit.sh .git/hooks/pre-commit || exit $? - fi - if [ ! -e .git/hooks/pre-push ]; then - ln -s ../../pre-push.sh .git/hooks/pre-push || exit $? +# Check environment +if [ -n "$WSL_DISTRO_NAME" ]; then + # we found a non-blank WSL environment distro name + current_path="$(pwd)" + pattern="/mnt/?" + if [ "$(echo "$current_path" | grep -E "^$pattern")" ]; then + # if we are in WSL and shared Windows file system, 'ln' does not work. + no_links=true + else + no_links= fi fi @@ -30,8 +30,6 @@ for file in \ ./wolfssl/options.h \ - ./ctaocrypt/src/fips.c \ - ./ctaocrypt/src/fips_test.c \ ./wolfcrypt/src/fips.c \ ./wolfcrypt/src/fips_test.c \ ./wolfcrypt/src/wolfcrypt_first.c \ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/ca-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/ca-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/ca-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/ca-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/ca-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/ca-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 0e:75:3b:39:ad:1f:53:d1:85:3b:05:3b:11:62:4f:dc:7b:11:72:11 + 5c:44:2b:bf:d3:a8:2a:d8:fd:54:c9:cd:aa:7f:f7:d4:59:07:aa:dd Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -29,7 +29,7 @@ X509v3 Authority Key Identifier: keyid:D3:22:8F:28:2C:E0:05:EE:D3:ED:C3:71:3D:C9:B2:36:3A:1D:BF:A8 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting_1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:0E:75:3B:39:AD:1F:53:D1:85:3B:05:3B:11:62:4F:DC:7B:11:72:11 + serial:5C:44:2B:BF:D3:A8:2A:D8:FD:54:C9:CD:AA:7F:F7:D4:59:07:AA:DD X509v3 Basic Constraints: CA:TRUE @@ -38,20 +38,20 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - b8:80:bf:b2:f5:83:95:51:81:6a:7e:41:87:29:d7:c3:c9:c6: - 9b:60:e4:65:a1:04:97:1d:1b:3b:e9:27:fa:43:d6:89:6a:3c: - 9e:bf:28:d1:75:37:21:f3:0d:64:17:b2:a3:2d:83:52:ff:57: - f0:42:a9:48:aa:d8:84:ea:0d:80:05:71:0a:aa:23:b4:6c:c6: - d6:7f:13:4a:f4:82:b9:e2:81:ae:46:8c:59:fb:c3:8c:6d:5b: - f3:32:ec:86:f0:6e:da:2a:78:ab:f2:36:fb:48:fa:74:09:0e: - 19:c2:bf:eb:cc:fb:a9:05:c1:c9:e1:ab:8b:79:f6:f1:ad:4a: - 9f:aa + 70:7d:83:94:d0:ee:e1:19:8b:17:ca:79:87:12:5b:7f:70:a3: + 51:20:4f:21:99:71:69:21:28:55:61:70:85:54:21:a9:70:a2: + a9:12:db:44:11:44:e7:41:00:70:80:b5:37:0c:7e:78:8f:88: + 64:bc:e5:c0:44:a7:a5:3d:db:62:c4:d6:cd:aa:4b:ac:fb:01: + 46:bb:ec:cb:6f:01:67:b4:65:f3:5e:53:39:64:99:9b:68:80: + 14:91:a4:a4:eb:04:f3:76:9a:7d:b4:38:05:9c:a5:e0:bc:7e: + d9:d2:d3:d4:e8:c3:9f:38:4b:6c:29:94:be:35:bd:30:1f:b5: + b7:3d -----BEGIN CERTIFICATE----- -MIIECTCCA3KgAwIBAgIUDnU7Oa0fU9GFOwU7EWJP3HsRchEwDQYJKoZIhvcNAQEL +MIIECTCCA3KgAwIBAgIUXEQrv9OoKtj9VMnNqn/31FkHqt0wDQYJKoZIhvcNAQEL BQAwgZkxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18x MDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGlu -Zm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCB +Zm9Ad29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCB mTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEwMjQx GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 @@ -63,10 +63,10 @@ ybI2Oh2/qKGBn6SBnDCBmTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmEx EDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9D b25zdWx0aW5nXzEwMjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG -SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUDnU7Oa0fU9GFOwU7EWJP3HsRchEw +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUXEQrv9OoKtj9VMnNqn/31FkHqt0w DAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAdBgNV -HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADgYEAuIC/ -svWDlVGBan5BhynXw8nGm2DkZaEElx0bO+kn+kPWiWo8nr8o0XU3IfMNZBeyoy2D -Uv9X8EKpSKrYhOoNgAVxCqojtGzG1n8TSvSCueKBrkaMWfvDjG1b8zLshvBu2ip4 -q/I2+0j6dAkOGcK/68z7qQXByeGri3n28a1Kn6o= +HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADgYEAcH2D +lNDu4RmLF8p5hxJbf3CjUSBPIZlxaSEoVWFwhVQhqXCiqRLbRBFE50EAcIC1Nwx+ +eI+IZLzlwESnpT3bYsTWzapLrPsBRrvsy28BZ7Rl815TOWSZm2iAFJGkpOsE83aa +fbQ4BZyl4Lx+2dLT1OjDnzhLbCmUvjW9MB+1tz0= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/client-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/client-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/client-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/client-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/client-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/client-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 41:1f:ec:cf:49:20:14:81:dc:ab:32:02:01:6a:cd:18:bd:f5:e3:53 + 59:f2:ea:44:08:b5:12:30:a0:96:93:d1:d1:7f:e1:ec:49:75:9b:a2 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_1024, OU = Programming-1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_1024, OU = Programming-1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -29,7 +29,7 @@ X509v3 Authority Key Identifier: keyid:81:69:0F:F8:DF:DD:CF:34:29:D5:67:75:71:85:C7:75:10:69:59:EC DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_1024/OU=Programming-1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:41:1F:EC:CF:49:20:14:81:DC:AB:32:02:01:6A:CD:18:BD:F5:E3:53 + serial:59:F2:EA:44:08:B5:12:30:A0:96:93:D1:D1:7F:E1:EC:49:75:9B:A2 X509v3 Basic Constraints: CA:TRUE @@ -38,21 +38,21 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - 64:0e:1b:a2:b2:39:cc:df:9c:63:48:4b:58:2c:e5:af:e2:ba: - d2:74:37:f8:a0:c8:2f:62:36:84:49:55:d6:8d:2b:4d:96:4f: - b4:2e:83:f9:00:e8:cb:7e:04:f1:19:f2:00:24:0d:2b:ba:30: - 89:7f:8a:e3:64:e2:d5:1b:5a:0a:9d:26:db:e8:6a:60:c2:79: - aa:ad:8d:f1:1c:2a:33:d4:66:42:98:7a:94:d4:b7:2d:0b:cb: - f5:b5:62:ae:e1:88:47:ad:ee:8d:32:b5:60:1a:5b:a1:d3:a1: - 58:cc:0c:40:30:0d:05:cb:4b:d2:e1:d7:ca:63:de:a8:78:56: - 96:e7 + 45:63:6f:f9:ed:f4:12:3c:3c:c5:2c:51:08:94:61:7e:08:e8: + 32:46:2b:22:02:d0:e8:2b:a4:23:15:48:47:87:5d:72:ab:38: + d5:34:b9:fc:f4:86:93:49:95:d8:81:32:1c:21:e3:ef:b8:40: + c5:87:02:e8:28:aa:54:93:2d:8a:e9:1e:dd:5d:11:f8:bf:ca: + 4e:33:20:56:4e:6f:53:bb:79:b0:da:65:a1:4b:9f:c8:55:fa: + 53:26:84:c6:1e:0a:5e:7a:6e:f2:2d:2a:81:a5:d0:2b:ec:d5: + 8e:b9:f0:c7:57:d7:d6:14:1a:3b:dc:09:41:b4:9d:0d:72:20: + 44:79 -----BEGIN CERTIFICATE----- -MIIEGDCCA4GgAwIBAgIUQR/sz0kgFIHcqzICAWrNGL3141MwDQYJKoZIhvcNAQEL +MIIEGDCCA4GgAwIBAgIUWfLqRAi1EjCglpPR0X/h7El1m6IwDQYJKoZIhvcNAQEL BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzEwMjQxGTAXBgNVBAsMEFByb2dyYW1t aW5nLTEwMjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3 -NDlaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5 +MjhaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8xMDI0MRkwFwYDVQQLDBBQcm9ncmFt bWluZy0xMDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB @@ -63,10 +63,10 @@ +N/dzzQp1Wd1cYXHdRBpWeyhgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzEw MjQxGTAXBgNVBAsMEFByb2dyYW1taW5nLTEwMjQxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUQR/sz0kg -FIHcqzICAWrNGL3141MwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxl +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUWfLqRAi1 +EjCglpPR0X/h7El1m6IwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxl LmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZI -hvcNAQELBQADgYEAZA4borI5zN+cY0hLWCzlr+K60nQ3+KDIL2I2hElV1o0rTZZP -tC6D+QDoy34E8RnyACQNK7owiX+K42Ti1RtaCp0m2+hqYMJ5qq2N8RwqM9RmQph6 -lNS3LQvL9bViruGIR63ujTK1YBpbodOhWMwMQDANBctL0uHXymPeqHhWluc= +hvcNAQELBQADgYEARWNv+e30Ejw8xSxRCJRhfgjoMkYrIgLQ6CukIxVIR4ddcqs4 +1TS5/PSGk0mV2IEyHCHj77hAxYcC6CiqVJMtiuke3V0R+L/KTjMgVk5vU7t5sNpl +oUufyFX6UyaExh4KXnpu8i0qgaXQK+zVjrnwx1fX1hQaO9wJQbSdDXIgRHk= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/server-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/server-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/server-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/server-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/1024/server-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/1024/server-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = Support_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -28,7 +28,7 @@ X509v3 Authority Key Identifier: keyid:D3:22:8F:28:2C:E0:05:EE:D3:ED:C3:71:3D:C9:B2:36:3A:1D:BF:A8 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting_1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:0E:75:3B:39:AD:1F:53:D1:85:3B:05:3B:11:62:4F:DC:7B:11:72:11 + serial:5C:44:2B:BF:D3:A8:2A:D8:FD:54:C9:CD:AA:7F:F7:D4:59:07:AA:DD X509v3 Basic Constraints: CA:TRUE @@ -37,20 +37,20 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - c0:94:34:0d:41:a3:03:17:05:08:d9:54:d9:a2:f0:e9:22:58: - 25:50:10:6d:da:09:2d:7d:fc:0d:c0:13:35:0e:96:7f:1e:38: - a1:11:97:42:df:83:07:05:ce:d6:de:90:22:ab:0f:6d:56:90: - 02:9a:a5:cf:5a:9b:96:66:0f:71:ed:b2:72:7a:e4:9d:61:9f: - 2a:45:b8:51:b9:a6:ee:d6:73:2a:03:f4:03:32:6e:19:6e:70: - 48:6b:72:29:30:19:87:06:30:d6:2f:19:f5:39:78:2f:2f:c2: - 49:38:5a:d8:38:06:f9:fe:bf:45:ea:7b:e6:7b:a6:0b:b5:ba: - 06:80 + 35:2e:7b:57:7b:64:70:53:e0:81:ed:f4:ac:b3:3a:3b:ba:82: + 8d:a2:31:d9:d4:ac:d1:8a:6d:35:41:15:b3:e8:06:91:ca:2a: + f7:ff:28:0e:3d:cd:e7:28:f0:07:c0:78:62:9e:88:3d:dc:98: + f0:8c:89:a7:1c:5b:77:37:b2:55:38:b2:60:42:e8:02:81:bf: + 7c:c3:54:86:7e:e4:2f:7d:74:74:27:f7:9a:e2:8d:a9:2f:7c: + 82:31:41:f1:cb:48:a0:05:00:26:3d:a4:6b:27:43:4c:3f:6f: + 2f:41:2e:ee:ba:0d:8f:39:42:0d:2d:76:00:12:4c:f9:49:2d: + 7f:ed -----BEGIN CERTIFICATE----- MIID8jCCA1ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBmTELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEwMjQxGDAWBgNVBAMMD3d3dy53 b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0y -MjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3NDlaMIGVMQswCQYDVQQGEwJVUzEQMA4G +MzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5MjhaMIGVMQswCQYDVQQGEwJVUzEQMA4G A1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEQMA4GA1UECgwHd29sZlNT TDEVMBMGA1UECwwMU3VwcG9ydF8xMDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5j b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wgZ8wDQYJKoZIhvcN @@ -62,23 +62,23 @@ BAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYD VQQKDAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18xMDI0MRgwFgYDVQQD DA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b22CFA51OzmtH1PRhTsFOxFiT9x7EXIRMAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUw +b22CFFxEK7/TqCrY/VTJzap/99RZB6rdMAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUw E4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF -BwMCMA0GCSqGSIb3DQEBCwUAA4GBAMCUNA1BowMXBQjZVNmi8OkiWCVQEG3aCS19 -/A3AEzUOln8eOKERl0LfgwcFztbekCKrD21WkAKapc9am5ZmD3HtsnJ65J1hnypF -uFG5pu7WcyoD9AMybhlucEhrcikwGYcGMNYvGfU5eC8vwkk4Wtg4Bvn+v0Xqe+Z7 -pgu1ugaA +BwMCMA0GCSqGSIb3DQEBCwUAA4GBADUue1d7ZHBT4IHt9KyzOju6go2iMdnUrNGK +bTVBFbPoBpHKKvf/KA49zeco8AfAeGKeiD3cmPCMiaccW3c3slU4smBC6AKBv3zD +VIZ+5C99dHQn95rijakvfIIxQfHLSKAFACY9pGsnQ0w/by9BLu66DY85Qg0tdgAS +TPlJLX/t -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: - 0e:75:3b:39:ad:1f:53:d1:85:3b:05:3b:11:62:4f:dc:7b:11:72:11 + 5c:44:2b:bf:d3:a8:2a:d8:fd:54:c9:cd:aa:7f:f7:d4:59:07:aa:dd Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting_1024, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -100,7 +100,7 @@ X509v3 Authority Key Identifier: keyid:D3:22:8F:28:2C:E0:05:EE:D3:ED:C3:71:3D:C9:B2:36:3A:1D:BF:A8 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting_1024/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:0E:75:3B:39:AD:1F:53:D1:85:3B:05:3B:11:62:4F:DC:7B:11:72:11 + serial:5C:44:2B:BF:D3:A8:2A:D8:FD:54:C9:CD:AA:7F:F7:D4:59:07:AA:DD X509v3 Basic Constraints: CA:TRUE @@ -109,20 +109,20 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - b8:80:bf:b2:f5:83:95:51:81:6a:7e:41:87:29:d7:c3:c9:c6: - 9b:60:e4:65:a1:04:97:1d:1b:3b:e9:27:fa:43:d6:89:6a:3c: - 9e:bf:28:d1:75:37:21:f3:0d:64:17:b2:a3:2d:83:52:ff:57: - f0:42:a9:48:aa:d8:84:ea:0d:80:05:71:0a:aa:23:b4:6c:c6: - d6:7f:13:4a:f4:82:b9:e2:81:ae:46:8c:59:fb:c3:8c:6d:5b: - f3:32:ec:86:f0:6e:da:2a:78:ab:f2:36:fb:48:fa:74:09:0e: - 19:c2:bf:eb:cc:fb:a9:05:c1:c9:e1:ab:8b:79:f6:f1:ad:4a: - 9f:aa + 70:7d:83:94:d0:ee:e1:19:8b:17:ca:79:87:12:5b:7f:70:a3: + 51:20:4f:21:99:71:69:21:28:55:61:70:85:54:21:a9:70:a2: + a9:12:db:44:11:44:e7:41:00:70:80:b5:37:0c:7e:78:8f:88: + 64:bc:e5:c0:44:a7:a5:3d:db:62:c4:d6:cd:aa:4b:ac:fb:01: + 46:bb:ec:cb:6f:01:67:b4:65:f3:5e:53:39:64:99:9b:68:80: + 14:91:a4:a4:eb:04:f3:76:9a:7d:b4:38:05:9c:a5:e0:bc:7e: + d9:d2:d3:d4:e8:c3:9f:38:4b:6c:29:94:be:35:bd:30:1f:b5: + b7:3d -----BEGIN CERTIFICATE----- -MIIECTCCA3KgAwIBAgIUDnU7Oa0fU9GFOwU7EWJP3HsRchEwDQYJKoZIhvcNAQEL +MIIECTCCA3KgAwIBAgIUXEQrv9OoKtj9VMnNqn/31FkHqt0wDQYJKoZIhvcNAQEL BQAwgZkxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDEYMBYGA1UECwwPQ29uc3VsdGluZ18x MDI0MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGlu -Zm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCB +Zm9Ad29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCB mTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9Db25zdWx0aW5nXzEwMjQx GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 @@ -134,10 +134,10 @@ ybI2Oh2/qKGBn6SBnDCBmTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmEx EDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRgwFgYDVQQLDA9D b25zdWx0aW5nXzEwMjQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG -SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUDnU7Oa0fU9GFOwU7EWJP3HsRchEw +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUXEQrv9OoKtj9VMnNqn/31FkHqt0w DAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAdBgNV -HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADgYEAuIC/ -svWDlVGBan5BhynXw8nGm2DkZaEElx0bO+kn+kPWiWo8nr8o0XU3IfMNZBeyoy2D -Uv9X8EKpSKrYhOoNgAVxCqojtGzG1n8TSvSCueKBrkaMWfvDjG1b8zLshvBu2ip4 -q/I2+0j6dAkOGcK/68z7qQXByeGri3n28a1Kn6o= +HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADgYEAcH2D +lNDu4RmLF8p5hxJbf3CjUSBPIZlxaSEoVWFwhVQhqXCiqRLbRBFE50EAcIC1Nwx+ +eI+IZLzlwESnpT3bYsTWzapLrPsBRrvsy28BZ7Rl815TOWSZm2iAFJGkpOsE83aa +fbQ4BZyl4Lx+2dLT1OjDnzhLbCmUvjW9MB+1tz0= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/3072/client-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/3072/client-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/3072/client-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/3072/client-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/3072/client-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/3072/client-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 03:33:56:6e:5f:e0:69:69:99:6b:eb:d0:eb:47:cf:f2:05:3f:98:15 + 0b:5c:9f:12:25:90:aa:52:c0:df:e1:e1:1f:ed:a9:31:01:0a:09:8b Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_3072, OU = Programming-3072, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_3072, OU = Programming-3072, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -46,7 +46,7 @@ X509v3 Authority Key Identifier: keyid:3D:D1:84:C2:AF:B0:20:49:BC:74:87:41:38:AB:BA:D2:D4:0C:A3:A8 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_3072/OU=Programming-3072/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:03:33:56:6E:5F:E0:69:69:99:6B:EB:D0:EB:47:CF:F2:05:3F:98:15 + serial:0B:5C:9F:12:25:90:AA:52:C0:DF:E1:E1:1F:ED:A9:31:01:0A:09:8B X509v3 Basic Constraints: CA:TRUE @@ -55,35 +55,35 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - 90:e4:43:8e:be:9d:de:45:4e:df:df:8d:e7:7c:2d:1b:a9:1a: - ef:90:15:fb:d3:a9:99:a8:5b:d7:f9:b8:95:19:fe:e0:00:09: - c1:e3:e8:27:82:11:7c:39:23:92:38:45:86:6d:77:c2:83:8c: - 1a:0f:4b:c5:94:0d:e9:17:28:8c:cf:8f:6d:e9:43:82:0f:31: - 67:bb:d5:d7:3f:0b:ce:ce:22:f4:a8:5b:84:8d:fd:d2:cb:d6: - dc:ee:31:f3:e7:26:b7:58:6a:c5:9e:ff:89:5f:f6:70:fb:6b: - 02:ba:79:6a:9a:12:1b:82:94:1b:02:22:30:7d:74:44:46:25: - 85:a1:a8:7d:a0:ab:c3:a7:9e:08:a3:d7:5c:42:a2:af:96:42: - 9c:76:9b:8d:ec:08:68:71:95:92:a5:b9:aa:12:f9:c5:62:ac: - 8e:4f:df:cc:b7:53:e3:c4:70:74:9b:38:d2:e9:da:3f:ef:c4: - 55:01:9a:b9:3e:c4:33:e7:33:db:0f:ba:55:84:0f:3c:4c:a5: - 85:ec:5a:f2:98:75:e0:eb:47:b8:4b:d3:85:63:dc:b0:29:85: - 51:62:bf:6a:61:9b:40:01:66:0d:72:42:bd:4f:e0:c6:31:a6: - 06:df:c1:e9:8a:a0:57:c7:4d:4f:e7:c0:45:7f:7f:a7:53:ca: - 90:1d:70:a8:46:95:99:ef:19:ee:e2:45:35:1a:dc:0d:cb:c3: - b0:d5:88:8b:b9:9f:b5:ea:c1:fe:5e:7a:c1:83:c8:74:f5:1a: - 29:52:38:5d:14:ea:17:2d:39:f6:19:16:c4:91:b0:e7:18:36: - 56:a0:64:75:8d:66:57:48:1b:38:f2:a0:01:b1:44:32:34:a5: - 0e:bc:28:46:77:ed:65:c1:75:34:f8:06:12:45:1a:70:78:81: - d1:55:27:cf:ad:b3:d4:5a:97:43:88:02:bb:93:ba:17:42:51: - 59:52:13:ec:fc:ef:6b:53:f7:f2:41:8a:42:06:56:e2:f4:97: - d2:22:31:02:2a:47 + 14:27:57:47:12:a4:78:a2:c9:dc:93:f8:47:ee:f4:fd:66:80: + 13:43:9e:de:23:8c:f7:3f:fe:46:9c:85:58:2a:6f:8d:22:92: + 8c:d6:36:ca:90:4f:45:c3:ab:78:ca:3c:fe:d0:f5:0f:6d:00: + fe:3b:42:b0:86:0b:75:f2:7c:d3:c7:db:0b:70:e8:ec:b7:bf: + 26:30:a8:19:67:bd:74:03:cf:d1:08:8e:9c:d5:1b:45:28:b2: + 67:8e:3a:a5:27:c9:1b:6a:e9:93:ce:94:c0:00:0c:e8:f1:76: + 02:a4:30:72:a8:fd:55:1c:d1:b8:25:f1:62:f6:ba:28:fd:30: + b1:11:63:f7:b3:78:54:09:04:c1:66:12:c7:01:ae:99:e3:55: + c4:29:bd:1b:1a:da:b9:77:fd:04:db:b1:68:56:35:65:e1:aa: + 67:c8:ac:be:e5:f8:27:fb:b4:51:4f:38:e5:de:09:a6:81:a9: + ef:dc:d6:4a:96:47:b8:38:14:f8:25:5d:ac:f3:e5:3b:f2:1b: + 70:32:3b:2d:fa:20:ca:2e:a5:ca:13:9d:84:d2:d4:35:16:58: + 6e:52:5e:09:61:83:c2:e2:56:2c:ab:52:bf:54:dc:bd:f3:bf: + a7:16:6e:0e:ca:68:54:d1:5c:4d:06:7a:93:47:1c:cc:a9:66: + da:69:0f:f9:1f:25:64:29:40:97:50:3b:cf:0c:50:9b:4d:ff: + 60:bc:d3:e4:a0:b7:64:c6:66:2a:f6:02:e2:3f:92:31:3b:d7: + ea:1a:c3:1a:0c:19:88:ab:5f:74:b7:9d:7b:8d:4d:3a:84:43: + f2:67:b1:be:a0:9e:fd:3d:aa:c1:38:1a:df:ac:30:fe:63:69: + af:d6:f2:21:63:11:63:29:ac:63:9e:9f:9f:c4:53:b3:db:78: + c0:2d:79:68:1f:d2:d1:36:d1:fb:e3:c0:a7:31:eb:15:63:99: + 0b:93:9d:87:c7:fe:56:5d:fc:e7:29:2a:9e:15:be:ef:54:e7: + 0f:6d:9b:36:b6:17 -----BEGIN CERTIFICATE----- -MIIGHTCCBIWgAwIBAgIUAzNWbl/gaWmZa+vQ60fP8gU/mBUwDQYJKoZIhvcNAQEL +MIIGHTCCBIWgAwIBAgIUC1yfEiWQqlLA3+HhH+2pMQEKCYswDQYJKoZIhvcNAQEL BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzMwNzIxGTAXBgNVBAsMEFByb2dyYW1t aW5nLTMwNzIxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3 -NDlaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5 +MjhaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8zMDcyMRkwFwYDVQQLDBBQcm9ncmFt bWluZy0zMDcyMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGK @@ -100,15 +100,15 @@ MAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4x FTATBgNVBAoMDHdvbGZTU0xfMzA3MjEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMzA3 MjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv -QHdvbGZzc2wuY29tghQDM1ZuX+BpaZlr69DrR8/yBT+YFTAMBgNVHRMEBTADAQH/ +QHdvbGZzc2wuY29tghQLXJ8SJZCqUsDf4eEf7akxAQoJizAMBgNVHRMEBTADAQH/ MBwGA1UdEQQVMBOCC2V4YW1wbGUuY29thwR/AAABMB0GA1UdJQQWMBQGCCsGAQUF -BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAYEAkORDjr6d3kVO39+N53wt -G6ka75AV+9Opmahb1/m4lRn+4AAJwePoJ4IRfDkjkjhFhm13woOMGg9LxZQN6Rco -jM+PbelDgg8xZ7vV1z8Lzs4i9KhbhI390svW3O4x8+cmt1hqxZ7/iV/2cPtrArp5 -apoSG4KUGwIiMH10REYlhaGofaCrw6eeCKPXXEKir5ZCnHabjewIaHGVkqW5qhL5 -xWKsjk/fzLdT48RwdJs40unaP+/EVQGauT7EM+cz2w+6VYQPPEylhexa8ph14OtH -uEvThWPcsCmFUWK/amGbQAFmDXJCvU/gxjGmBt/B6YqgV8dNT+fARX9/p1PKkB1w -qEaVme8Z7uJFNRrcDcvDsNWIi7mfterB/l56wYPIdPUaKVI4XRTqFy059hkWxJGw -5xg2VqBkdY1mV0gbOPKgAbFEMjSlDrwoRnftZcF1NPgGEkUacHiB0VUnz62z1FqX -Q4gCu5O6F0JRWVIT7Pzva1P38kGKQgZW4vSX0iIxAipH +BwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAYEAFCdXRxKkeKLJ3JP4R+70 +/WaAE0Oe3iOM9z/+RpyFWCpvjSKSjNY2ypBPRcOreMo8/tD1D20A/jtCsIYLdfJ8 +08fbC3Do7Le/JjCoGWe9dAPP0QiOnNUbRSiyZ446pSfJG2rpk86UwAAM6PF2AqQw +cqj9VRzRuCXxYva6KP0wsRFj97N4VAkEwWYSxwGumeNVxCm9GxrauXf9BNuxaFY1 +ZeGqZ8isvuX4J/u0UU845d4JpoGp79zWSpZHuDgU+CVdrPPlO/IbcDI7Lfogyi6l +yhOdhNLUNRZYblJeCWGDwuJWLKtSv1TcvfO/pxZuDspoVNFcTQZ6k0cczKlm2mkP ++R8lZClAl1A7zwxQm03/YLzT5KC3ZMZmKvYC4j+SMTvX6hrDGgwZiKtfdLede41N +OoRD8mexvqCe/T2qwTga36ww/mNpr9byIWMRYymsY56fn8RTs9t4wC15aB/S0TbR +++PApzHrFWOZC5Odh8f+Vl385ykqnhW+71TnD22bNrYX -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/4096/client-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/4096/client-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/4096/client-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/4096/client-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/4096/client-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/4096/client-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 31:fe:22:af:75:2f:dc:63:bd:e4:94:f2:94:38:c3:0d:7d:9a:d1 + 2f:36:54:05:64:52:dd:0e:75:75:33:7c:b2:ce:9f:5c:48:9b:ab:0e Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_4096, OU = Programming-4096, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_4096, OU = Programming-4096, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -55,7 +55,7 @@ X509v3 Authority Key Identifier: keyid:FA:54:89:67:E5:5F:B7:31:40:EA:FD:E7:F6:A3:C6:5A:56:16:A5:6E DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_4096/OU=Programming-4096/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:31:FE:22:AF:75:2F:DC:63:BD:E4:94:F2:94:38:C3:0D:7D:9A:D1 + serial:2F:36:54:05:64:52:DD:0E:75:75:33:7C:B2:CE:9F:5C:48:9B:AB:0E X509v3 Basic Constraints: CA:TRUE @@ -64,72 +64,73 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - dd:6b:7f:ca:dc:80:e0:6d:e2:5f:6c:32:01:2f:8f:3a:e9:41: - 5f:35:c6:bb:a9:a5:84:57:ee:a4:21:4f:b3:b9:ae:24:dc:d1: - 80:30:7a:2a:7f:7e:fc:6c:be:50:d3:5a:51:2d:e6:fd:15:db: - 9d:ff:fa:ca:c0:cf:be:97:59:d0:83:20:ce:3a:d8:10:fe:41: - d5:a9:6b:19:e2:9f:28:fe:c0:21:75:47:46:94:31:6a:c4:c4: - 52:3b:02:73:c4:47:2a:b5:ce:65:6d:58:c7:fa:3e:0a:6f:e1: - a8:a1:3b:33:8a:6f:ca:4a:ef:52:88:09:ca:b2:f2:1d:3d:69: - f5:5b:80:4f:29:66:b1:25:c7:eb:d1:bb:df:cf:91:c8:ce:58: - 3b:9d:10:5b:8e:55:93:5a:32:ed:0b:c7:7f:c8:f5:f2:7f:0a: - ce:ad:bb:db:43:2a:92:f6:f2:a0:34:8e:7c:22:4a:5a:f9:84: - b0:88:e3:a4:2a:bf:23:3a:ec:aa:32:77:c9:ab:bc:4b:bb:82: - bc:c0:07:e6:fc:cf:33:72:8f:b2:4e:da:2b:7e:08:44:72:2b: - a0:c7:3a:7e:6f:b4:31:b1:3a:34:c3:5c:be:9c:85:d8:82:99: - 35:92:b4:b4:31:24:31:df:fb:17:db:1d:3b:a7:d1:e2:a4:44: - c7:3f:6b:17:1c:32:cc:f9:48:f0:c0:38:45:e8:f5:84:6c:59: - 29:5a:ec:38:43:10:97:67:76:b5:60:b7:8c:42:11:44:9a:62: - 87:db:02:aa:e7:1e:ec:9f:6b:7f:c5:fa:9e:03:80:73:74:20: - e9:7a:e1:3f:49:41:bb:c4:9a:70:14:a1:13:2a:90:ef:06:cc: - 9d:ba:32:94:8c:a9:95:45:a4:89:04:d2:68:b9:13:fd:73:43: - ea:c5:ee:7f:00:75:f0:ca:4d:91:d3:04:72:e6:af:c8:ad:43: - 11:70:36:45:aa:b5:46:a6:bf:ac:6c:20:86:3e:5e:66:a5:15: - 6a:a2:58:e6:6f:e8:ae:b4:1d:67:da:18:d6:ad:de:11:9c:f3: - d1:a4:06:3f:d5:01:fd:3d:b8:fd:14:0f:1a:e8:7e:b4:a3:2b: - 8b:52:4c:71:72:5e:7c:9e:23:ff:50:83:7d:5b:ec:60:d5:ad: - a5:44:0b:dd:66:cc:a5:f8:0c:65:db:b2:76:1e:1c:01:87:cb: - 1c:76:17:5d:12:cd:28:dc:20:e0:3a:c8:65:fe:dd:e3:bc:6a: - 8b:24:6b:86:a7:2d:bc:4f:26:3f:d7:3f:04:bf:a4:5d:06:52: - b5:e4:fd:85:b0:2c:52:ac:99:49:ef:56:76:2a:7c:e3:d8:8e: - e4:eb:b2:db:c1:54:20:64 + c2:72:38:27:f0:5c:45:04:4b:09:0e:5d:98:6e:38:6a:bc:fb: + a8:85:4f:f2:04:38:63:4f:86:4f:3c:f5:fd:f8:cd:89:09:76: + 72:47:97:df:f8:17:6a:81:3a:b2:b4:fc:ac:e9:fc:e2:47:9b: + 07:6d:9c:53:ed:d8:64:bc:6c:4d:a9:bd:3e:5e:cd:61:bc:8e: + 82:20:b2:50:bc:9e:72:e6:9f:40:ff:6c:4b:38:f8:4b:82:0f: + 7e:49:cd:45:5c:cd:44:de:47:25:b3:57:d0:1a:0d:8d:4d:c7: + ea:23:fa:03:e8:86:d8:37:89:84:2e:e8:53:7a:77:be:94:ec: + 70:e7:c4:7b:8f:6f:28:67:33:89:ec:c9:df:98:6d:4a:d9:c6: + 7b:d3:b5:82:d0:8a:ce:8f:06:bf:a2:f7:de:4a:45:22:6f:ff: + 41:6f:08:f5:c3:65:25:27:fb:43:3e:cc:25:0a:d3:3d:d2:34: + 9f:89:6b:e2:97:9c:42:d9:3e:64:03:45:5f:07:95:ed:1a:70: + 6a:be:3e:7f:7f:16:be:47:a6:6d:3b:0d:27:b3:89:b1:f1:f6: + ce:99:71:18:b6:c0:c5:9e:76:7a:8e:fb:4a:be:4f:cd:bc:21: + a9:4e:9c:fc:48:86:ff:e4:63:14:96:3a:eb:c8:48:ae:27:bd: + 43:0c:27:85:e1:25:1a:69:48:6c:e7:11:f8:f3:68:9d:ee:15: + 1a:be:ad:46:33:24:3d:be:b8:0e:6e:4d:ef:12:b6:ae:1b:88: + bd:0e:a6:ff:91:08:dc:ed:af:fa:13:2b:f2:b4:2c:ea:72:c2: + 85:d6:ee:64:09:e1:4e:1a:5a:bd:c2:44:c2:95:82:59:0a:d8: + 27:bc:48:4a:8a:a3:c3:77:ac:92:b6:8b:0b:13:e2:87:ec:21: + 7e:7e:52:29:51:5c:59:e1:c8:db:05:ce:9e:f4:36:d8:63:42: + 45:71:9a:ee:0e:24:b0:ba:a5:a5:aa:c9:ee:9e:a3:e3:e9:7f: + c6:64:6c:9e:65:78:88:f2:61:6f:d3:3b:9e:0d:16:fa:ad:c2: + 58:ac:bc:14:b1:f7:6f:db:b9:7e:79:81:f1:f8:e9:41:5b:fe: + d9:e2:89:86:5c:01:03:5d:0c:d9:a9:d6:df:4b:26:5c:ae:e6: + df:b5:c9:f0:86:ca:7b:80:db:6a:86:fd:a9:00:46:32:39:5a: + 72:c4:67:20:db:d8:7a:5d:2d:78:b9:a7:de:7f:f4:7a:5b:0f: + 38:b0:9e:1a:ae:c5:cc:ff:61:5e:ec:f1:0d:f7:0a:22:bb:cb: + 08:2b:91:58:77:1f:90:2b:a3:78:be:ef:4d:d8:8d:e8:f7:31: + f8:92:84:e5:b2:2a:e8:3a -----BEGIN CERTIFICATE----- -MIIHGzCCBQOgAwIBAgITMf4ir3Uv3GO95JTylDjDDX2a0TANBgkqhkiG9w0BAQsF -ADCBnjELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv -emVtYW4xFTATBgNVBAoMDHdvbGZTU0xfNDA5NjEZMBcGA1UECwwQUHJvZ3JhbW1p -bmctNDA5NjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkB -FhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0 -OVowgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +MIIHHTCCBQWgAwIBAgIULzZUBWRS3Q51dTN8ss6fXEibqw4wDQYJKoZIhvcNAQEL +BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzQwOTYxGTAXBgNVBAsMEFByb2dyYW1t aW5nLTQwOTYxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC -ggIBAPXQMeRxWVizB1DdFnn8xpVQ/EYOVxKGcY3jm0oz6k/ZFxNtSGnfWREIAp2v -K8cwvgzch9RaEgkjXeF2WmI3RnTvAwW7Hm0pdWwunYcNj4fLFJWbvhdrUdFM2teR -ZsU26+AHGnZNsPvB9V4F27rLJdmZExzANdxA6TbNxNV6QXAPNuulThcF1XUbZGJ6 -Pw0oSGrjrJyoj+nt980koLGgA6zjA/U/0Zb/Kn4IsdPgGBTsZTdQQ8JqjPRb/sTL -jT+BAvfC3eTBjoAMBCUtgFouDyI1SvSF7VHYq22PojskAG6B4h521qwxEtvzjgeh -3olKOWB3xarxUeYG8ZVWKuGOkjCf/lhErEby/Zr8qB2h01U3Sov8nDP4p2FIQXyc -dz/1gCN9Q7TViArJdddEGU13bAsKSaocL9ZaRKZHTeU2lkCZLFYmsfKSMVnXLNS0 -IdZlEws++/8E67mFudjYKE9cF5ajUb7+fQsbSEAldpTcQfu/c3ba67Ni58HIVGqT -4Y0x6D4+37yHAjAiV8TgGHrTruQCm6q9TklHcumNEy1UmwCnkWFxycxIT+7fXhsa -32fTIOZERZh+5w5jFoPJJl2QweUqXEVUE7KBGAYgLi5mWrV7btYMTokBVnC7rt7p -mV7RuTq3bBe2A6kI3Zz0FMnJWTly1H4CNzHNDqc9+PLPaxWrAgMBAAGjggFOMIIB -SjAdBgNVHQ4EFgQU+lSJZ+VftzFA6v3n9qPGWlYWpW4wgd0GA1UdIwSB1TCB0oAU -+lSJZ+VftzFA6v3n9qPGWlYWpW6hgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYD -VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NM -XzQwOTYxGTAXBgNVBAsMEFByb2dyYW1taW5nLTQwOTYxGDAWBgNVBAMMD3d3dy53 -b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYITMf4i -r3Uv3GO95JTylDjDDX2a0TAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1w -bGUuY29thwR/AAABMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkq -hkiG9w0BAQsFAAOCAgEA3Wt/ytyA4G3iX2wyAS+POulBXzXGu6mlhFfupCFPs7mu -JNzRgDB6Kn9+/Gy+UNNaUS3m/RXbnf/6ysDPvpdZ0IMgzjrYEP5B1alrGeKfKP7A -IXVHRpQxasTEUjsCc8RHKrXOZW1Yx/o+Cm/hqKE7M4pvykrvUogJyrLyHT1p9VuA -TylmsSXH69G738+RyM5YO50QW45Vk1oy7QvHf8j18n8Kzq2720MqkvbyoDSOfCJK -WvmEsIjjpCq/IzrsqjJ3yau8S7uCvMAH5vzPM3KPsk7aK34IRHIroMc6fm+0MbE6 -NMNcvpyF2IKZNZK0tDEkMd/7F9sdO6fR4qRExz9rFxwyzPlI8MA4Rej1hGxZKVrs -OEMQl2d2tWC3jEIRRJpih9sCquce7J9rf8X6ngOAc3Qg6XrhP0lBu8SacBShEyqQ -7wbMnboylIyplUWkiQTSaLkT/XND6sXufwB18MpNkdMEcuavyK1DEXA2Raq1Rqa/ -rGwghj5eZqUVaqJY5m/orrQdZ9oY1q3eEZzz0aQGP9UB/T24/RQPGuh+tKMri1JM -cXJefJ4j/1CDfVvsYNWtpUQL3WbMpfgMZduydh4cAYfLHHYXXRLNKNwg4DrIZf7d -47xqiyRrhqctvE8mP9c/BL+kXQZSteT9hbAsUqyZSe9Wdip849iO5Ouy28FUIGQ= +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5 +MjhaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF80MDk2MRkwFwYDVQQLDBBQcm9ncmFt +bWluZy00MDk2MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B +CQEWEGluZm9Ad29sZnNzbC5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD10DHkcVlYswdQ3RZ5/MaVUPxGDlcShnGN45tKM+pP2RcTbUhp31kRCAKd +ryvHML4M3IfUWhIJI13hdlpiN0Z07wMFux5tKXVsLp2HDY+HyxSVm74Xa1HRTNrX +kWbFNuvgBxp2TbD7wfVeBdu6yyXZmRMcwDXcQOk2zcTVekFwDzbrpU4XBdV1G2Ri +ej8NKEhq46ycqI/p7ffNJKCxoAOs4wP1P9GW/yp+CLHT4BgU7GU3UEPCaoz0W/7E +y40/gQL3wt3kwY6ADAQlLYBaLg8iNUr0he1R2Kttj6I7JABugeIedtasMRLb844H +od6JSjlgd8Wq8VHmBvGVVirhjpIwn/5YRKxG8v2a/KgdodNVN0qL/Jwz+KdhSEF8 +nHc/9YAjfUO01YgKyXXXRBlNd2wLCkmqHC/WWkSmR03lNpZAmSxWJrHykjFZ1yzU +tCHWZRMLPvv/BOu5hbnY2ChPXBeWo1G+/n0LG0hAJXaU3EH7v3N22uuzYufByFRq +k+GNMeg+Pt+8hwIwIlfE4Bh6067kApuqvU5JR3LpjRMtVJsAp5FhccnMSE/u314b +Gt9n0yDmREWYfucOYxaDySZdkMHlKlxFVBOygRgGIC4uZlq1e27WDE6JAVZwu67e +6Zle0bk6t2wXtgOpCN2c9BTJyVk5ctR+AjcxzQ6nPfjyz2sVqwIDAQABo4IBTzCC +AUswHQYDVR0OBBYEFPpUiWflX7cxQOr95/ajxlpWFqVuMIHeBgNVHSMEgdYwgdOA +FPpUiWflX7cxQOr95/ajxlpWFqVuoYGkpIGhMIGeMQswCQYDVQQGEwJVUzEQMA4G +A1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwMd29sZlNT +TF80MDk2MRkwFwYDVQQLDBBQcm9ncmFtbWluZy00MDk2MRgwFgYDVQQDDA93d3cu +d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFC82 +VAVkUt0OdXUzfLLOn1xIm6sOMAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhh +bXBsZS5jb22HBH8AAAEwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0G +CSqGSIb3DQEBCwUAA4ICAQDCcjgn8FxFBEsJDl2YbjhqvPuohU/yBDhjT4ZPPPX9 ++M2JCXZyR5ff+BdqgTqytPys6fziR5sHbZxT7dhkvGxNqb0+Xs1hvI6CILJQvJ5y +5p9A/2xLOPhLgg9+Sc1FXM1E3kcls1fQGg2NTcfqI/oD6IbYN4mELuhTene+lOxw +58R7j28oZzOJ7MnfmG1K2cZ707WC0IrOjwa/ovfeSkUib/9Bbwj1w2UlJ/tDPswl +CtM90jSfiWvil5xC2T5kA0VfB5XtGnBqvj5/fxa+R6ZtOw0ns4mx8fbOmXEYtsDF +nnZ6jvtKvk/NvCGpTpz8SIb/5GMUljrryEiuJ71DDCeF4SUaaUhs5xH482id7hUa +vq1GMyQ9vrgObk3vErauG4i9Dqb/kQjc7a/6EyvytCzqcsKF1u5kCeFOGlq9wkTC +lYJZCtgnvEhKiqPDd6yStosLE+KH7CF+flIpUVxZ4cjbBc6e9DbYY0JFcZruDiSw +uqWlqsnunqPj6X/GZGyeZXiI8mFv0zueDRb6rcJYrLwUsfdv27l+eYHx+OlBW/7Z +4omGXAEDXQzZqdbfSyZcrubftcnwhsp7gNtqhv2pAEYyOVpyxGcg29h6XS14uafe +f/R6Ww84sJ4arsXM/2Fe7PEN9woiu8sIK5FYdx+QK6N4vu9N2I3o9zH4koTlsiro +Og== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-cert-chain.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-cert-chain.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 2c:80:ce:db:47:9d:07:66:92:3d:68:d7:ca:ac:90:4f:ca:69:41:4b + 33:44:1a:a8:6c:01:ec:f6:60:f2:70:51:0a:4c:d1:14:fa:bc:e9:44 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -38,7 +38,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -47,27 +47,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - ae:b0:a4:35:8e:8a:1b:a6:eb:b3:a2:57:cf:3a:1f:dc:6e:bc: - d2:d0:a6:4a:8f:88:0a:6e:74:d5:d1:7c:d1:44:b1:d4:3b:17: - 03:09:5a:46:ed:08:08:cf:f1:fd:20:07:67:c0:97:ec:35:f3: - 75:ca:20:61:98:3e:f5:4d:be:e6:9d:75:1e:e4:03:ad:8c:a6: - 1e:3d:ec:e4:1a:92:5b:f9:a3:ad:83:ca:4f:cd:aa:38:bb:6e: - ae:ad:fa:a7:46:f1:8b:73:ec:09:23:bc:f2:18:e5:b7:92:86: - 3e:a4:75:60:c7:3d:0f:3f:83:00:c3:06:08:9c:d1:54:d6:ba: - 6d:95:3d:34:a1:be:24:91:cc:20:03:11:5b:72:1c:d4:65:d0: - 11:88:75:26:04:26:ef:66:70:e6:3b:38:87:9c:53:71:1b:09: - 51:70:50:99:4c:31:0c:62:44:57:30:60:04:fc:12:2c:a3:24: - b4:f7:11:d5:0e:b5:21:0b:ed:86:11:67:4d:36:fa:57:a0:59: - 55:21:b3:6d:e4:77:5e:ec:7e:f0:09:13:8e:99:98:b2:e1:82: - b6:4b:3e:0f:41:a6:0c:cd:49:99:7e:e4:8a:cb:37:ed:53:cf: - 86:5d:a9:26:a8:e5:01:25:5a:b4:bc:25:35:f1:fa:5a:5c:ce: - d4:b8:9a:2c + 2d:fc:f9:32:5a:be:d6:9d:42:8b:86:4e:67:22:c3:50:2d:cb: + 14:27:1d:94:f3:cd:88:42:da:41:1c:39:24:67:a7:92:4d:27: + ea:56:82:19:bf:11:b2:43:a4:8d:5d:87:b2:27:64:66:82:81: + df:c4:fd:5b:62:b0:c2:4d:9d:29:f2:41:32:cc:2e:b5:da:38: + 06:1b:e8:7f:8c:6e:3d:80:1e:00:56:49:bf:39:e0:da:68:2f: + c4:fd:00:e6:d1:81:1a:d1:4a:bb:76:52:ce:4d:24:9d:c4:a3: + a7:f1:65:14:2f:1f:a8:2d:c6:cb:ce:b1:a7:89:74:26:27:c3: + f3:a3:84:4c:34:01:14:03:7d:16:3a:c8:8b:25:2e:7b:90:cc: + 46:b1:52:34:ba:93:6e:ef:fe:43:a3:ad:c6:6f:51:fb:ba:ea: + 38:e3:6f:d6:ee:63:62:36:ea:5e:08:b4:e2:2a:46:89:e3:ae: + b3:b4:06:ef:63:7a:6e:5d:dd:c9:ec:02:4f:f7:64:c0:27:07: + b4:6f:4a:18:72:5b:34:74:7c:d0:a9:04:8f:40:8b:6a:39:d2: + 6b:1a:01:f2:01:a8:81:34:3a:e5:b0:55:d1:3c:95:ca:b0:82: + d6:ed:98:28:15:59:7e:95:a7:69:c7:b5:7b:ec:01:a7:4d:e6: + b9:a2:fe:35 -----BEGIN CERTIFICATE----- -MIIE/zCCA+egAwIBAgIULIDO20edB2aSPWjXyqyQT8ppQUswDQYJKoZIhvcNAQEL +MIIE/zCCA+egAwIBAgIUM0QaqGwB7PZg8nBRCkzRFPq86UQwDQYJKoZIhvcNAQEL BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZQxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZQxCzAJ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -82,12 +82,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU -LIDO20edB2aSPWjXyqyQT8ppQUswDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +M0QaqGwB7PZg8nBRCkzRFPq86UQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DQYJKoZIhvcNAQELBQADggEBAK6wpDWOihum67OiV886H9xuvNLQpkqPiApudNXR -fNFEsdQ7FwMJWkbtCAjP8f0gB2fAl+w183XKIGGYPvVNvuaddR7kA62Mph497OQa -klv5o62Dyk/Nqji7bq6t+qdG8Ytz7AkjvPIY5beShj6kdWDHPQ8/gwDDBgic0VTW -um2VPTShviSRzCADEVtyHNRl0BGIdSYEJu9mcOY7OIecU3EbCVFwUJlMMQxiRFcw -YAT8EiyjJLT3EdUOtSEL7YYRZ002+legWVUhs23kd17sfvAJE46ZmLLhgrZLPg9B -pgzNSZl+5IrLN+1Tz4ZdqSao5QElWrS8JTXx+lpcztS4miw= +DQYJKoZIhvcNAQELBQADggEBAC38+TJavtadQouGTmciw1AtyxQnHZTzzYhC2kEc +OSRnp5JNJ+pWghm/EbJDpI1dh7InZGaCgd/E/VtisMJNnSnyQTLMLrXaOAYb6H+M +bj2AHgBWSb854NpoL8T9AObRgRrRSrt2Us5NJJ3Eo6fxZRQvH6gtxsvOsaeJdCYn +w/OjhEw0ARQDfRY6yIslLnuQzEaxUjS6k27v/kOjrcZvUfu66jjjb9buY2I26l4I +tOIqRonjrrO0Bu9jem5d3cnsAk/3ZMAnB7RvShhyWzR0fNCpBI9Ai2o50msaAfIB +qIE0OuWwVdE8lcqwgtbtmCgVWX6Vp2nHtXvsAadN5rmi/jU= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-ecc-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-ecc-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-ecc-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 65:67:42:4c:06:e7:e4:c3:68:01:a9:94:a9:07:e6:fe:bd:2c:d6:3d + 0f:17:46:70:fd:c2:70:d1:f9:42:49:9c:1a:c3:5d:dd:30:c8:5f:85 Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -31,16 +31,16 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:b0:12:16:03:26:79:d4:6b:94:d9:7e:ca:e1: - 2d:24:64:ef:11:6e:f2:12:81:e4:ce:1d:77:7d:ca:5c:47:50: - 62:02:21:00:80:bf:46:3c:5d:d8:e5:ab:47:ce:a2:19:bd:21: - de:85:6f:ab:c9:8f:01:f3:ab:1b:b9:e1:53:d6:24:77:a6:4d + 30:45:02:21:00:c8:64:7f:ee:4b:be:83:48:13:ea:92:f8:1a: + 82:1e:85:b1:5a:a4:1c:e3:e8:ea:25:44:6f:e7:70:fd:eb:f3: + 76:02:20:44:02:a2:ec:c5:a1:ae:e2:a4:8a:d9:13:95:2b:a6: + 5b:09:57:86:61:42:96:97:f0:95:62:0c:03:e6:53:04:25 -----BEGIN CERTIFICATE----- -MIICljCCAjugAwIBAgIUZWdCTAbn5MNoAamUqQfm/r0s1j0wCgYIKoZIzj0EAwIw +MIIClTCCAjugAwIBAgIUDxdGcP3CcNH5QkmcGsNd3TDIX4UwCgYIKoZIzj0EAwIw gZcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZcxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZcxCzAJ BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UE AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu @@ -48,6 +48,6 @@ KTiYuhDW6QkqgKkuFyq5ir8zg0bjlQvkd0C1O0NFMw9hU3w3RMHL/IDK6EPqp6Nj MGEwHQYDVR0OBBYEFFaOmsPwQt4YuUVVbvmTz+rD86UhMB8GA1UdIwQYMBaAFFaO msPwQt4YuUVVbvmTz+rD86UhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMCA0kAMEYCIQCwEhYDJnnUa5TZfsrhLSRk7xFu8hKB5M4d -d33KXEdQYgIhAIC/Rjxd2OWrR86iGb0h3oVvq8mPAfOrG7nhU9Ykd6ZN +AgGGMAoGCCqGSM49BAMCA0gAMEUCIQDIZH/uS76DSBPqkvgagh6FsVqkHOPo6iVE +b+dw/evzdgIgRAKi7MWhruKkitkTlSumWwlXhmFClpfwlWIMA+ZTBCU= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ca-ecc384-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 0a:f8:c7:ee:86:55:2f:18:21:bf:88:49:50:03:5a:fc:2d:93:31:0a + 2e:ea:f0:11:40:1e:ad:fa:a7:85:68:65:7a:25:2b:13:b7:61:d7:80 Signature Algorithm: ecdsa-with-SHA384 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -33,18 +33,18 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA384 - 30:64:02:30:03:31:8c:d3:04:f5:b2:bf:bd:a2:27:6a:ff:dd: - 7f:bd:88:d5:3e:09:9a:cf:da:79:95:6b:32:6f:fa:98:d8:48: - 8b:99:91:fe:39:9e:7b:35:2c:78:32:ba:a3:0b:65:1c:02:30: - 3e:6a:10:8c:57:47:85:73:3c:eb:2a:02:b2:27:62:1f:44:52: - 2b:b1:34:3f:9c:78:70:0a:59:01:3e:ad:c0:08:bc:d5:d1:a6: - c0:dd:2c:8b:2a:8b:f4:04:ad:d3:01:e6 + 30:65:02:31:00:bd:2e:67:71:54:be:b8:5e:29:19:d3:18:f7: + e1:ae:79:f0:cc:09:c3:91:c0:81:ab:d7:b7:21:f8:4f:da:bc: + ad:0e:fc:3d:54:32:21:3a:67:c5:26:35:e9:33:b2:58:d2:02: + 30:64:2f:fb:10:d0:65:b5:ac:bb:b3:41:64:24:eb:0a:6b:ae: + a4:ed:3e:c8:62:81:45:97:92:ad:61:eb:69:54:ce:42:83:bb: + 68:23:20:f7:b2:5a:55:0c:d4:e6:13:42:61 -----BEGIN CERTIFICATE----- -MIIC0TCCAligAwIBAgIUCvjH7oZVLxghv4hJUANa/C2TMQowCgYIKoZIzj0EAwMw +MIIC0jCCAligAwIBAgIULurwEUAerfqnhWhleiUrE7dh14AwCgYIKoZIzj0EAwMw gZcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT ZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZcxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZcxCzAJ BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UE AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu @@ -52,8 +52,8 @@ fr3YWqW58I6ipdrOhztaq0QWnPWfYt32IM2cdjxAsT+XF99Z9s3ezUY1wO1eLki2 ZpFxdLcMP7mat4O9kz9fUC1wP941JeGQO4bgo2MwYTAdBgNVHQ4EFgQUq+DDJkwY 1HK70oSMnAoFkoASU1IwHwYDVR0jBBgwFoAUq+DDJkwY1HK70oSMnAoFkoASU1Iw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDZwAw -ZAIwAzGM0wT1sr+9oidq/91/vYjVPgmaz9p5lWsyb/qY2EiLmZH+OZ57NSx4Mrqj -C2UcAjA+ahCMV0eFczzrKgKyJ2IfRFIrsTQ/nHhwClkBPq3ACLzV0abA3SyLKov0 -BK3TAeY= +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAw +ZQIxAL0uZ3FUvrheKRnTGPfhrnnwzAnDkcCBq9e3IfhP2rytDvw9VDIhOmfFJjXp +M7JY0gIwZC/7ENBltay7s0FkJOsKa66k7T7IYoFFl5KtYetpVM5Cg7toIyD3slpV +DNTmE0Jh -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-absolute-urn.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-absolute-urn.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-absolute-urn.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-absolute-urn.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,16 +2,16 @@ Data: Version: 3 (0x2) Serial Number: - 69:47:62:4d:e0:35:e0:a0:bb:c5:b4:2d:33:e4:05:d1:02:16:bc:81 + 5a:3e:54:33:b4:88:fe:ad:22:40:07:62:9b:28:b1:56:7b:af:a6:eb Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = ABSOLUTE_URN, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Mar 16 21:46:10 2023 GMT - Not After : Dec 10 21:46:10 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = ABSOLUTE_URN, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) + RSA Public-Key: (2048 bit) Modulus: 00:c3:03:d1:2b:fe:39:a4:32:45:3b:53:c8:84:2b: 2a:7c:74:9a:bd:aa:2a:52:07:47:d6:a6:36:b2:07: @@ -38,34 +38,34 @@ X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=ABSOLUTE_URN/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:69:47:62:4D:E0:35:E0:A0:BB:C5:B4:2D:33:E4:05:D1:02:16:BC:81 + serial:5A:3E:54:33:B4:88:FE:AD:22:40:07:62:9B:28:B1:56:7B:AF:A6:EB + X509v3 Basic Constraints: CA:FALSE X509v3 Subject Alternative Name: URI:urn:example:test Signature Algorithm: sha256WithRSAEncryption - Signature Value: - 79:d1:97:51:a7:36:84:1b:35:b0:e0:e9:00:b4:af:8c:d1:1f: - 8e:d0:db:37:9f:fe:7e:93:d0:0a:55:34:a3:70:8d:f0:de:84: - 3a:94:f0:e1:a8:6c:4b:9c:fc:19:84:aa:d9:80:81:71:10:a6: - 73:80:60:7b:9b:0a:4b:df:e9:85:c2:f5:03:1a:54:99:4d:21: - 88:aa:f7:8f:fc:39:6e:a6:2e:70:39:57:0c:f2:8d:04:ec:54: - f7:18:f7:4c:86:e8:34:a6:63:7c:c0:d3:d5:99:44:38:64:30: - 0c:c6:cc:0a:a4:8e:4c:dd:9b:c4:12:11:f9:04:c5:a9:f5:db: - 9a:bb:39:29:cf:cd:b0:ab:1e:9a:5b:90:56:30:6f:01:75:87: - c8:ce:df:2a:43:db:5d:6c:1c:52:3b:69:23:d4:2d:8a:c5:90: - 9f:f9:06:c1:df:d0:7e:28:52:2d:2b:ec:5d:d2:a0:5c:e3:7f: - 18:cc:65:8a:8a:c2:1e:8b:c7:8e:2c:05:19:49:72:f4:3e:43: - d8:43:9f:b5:fa:53:8b:b1:f7:9c:c5:a4:8e:db:7c:da:05:0c: - cc:e2:7f:42:4b:8f:90:49:98:73:b0:96:1a:98:33:d4:18:7e: - 0d:89:55:70:9f:51:6b:8e:91:27:32:55:38:e7:5b:99:71:15: - 5e:a1:10:38 + 28:ec:66:1b:7e:f7:62:fe:44:8e:b3:65:0a:9c:10:d3:c3:72: + a1:97:85:1d:5a:1c:de:74:1f:28:63:18:f6:28:d0:d1:8e:55: + c3:98:7d:c2:21:a8:a2:6f:7e:9a:98:dd:2f:2c:ab:51:69:9b: + 27:1f:04:9e:01:22:ce:fb:3a:a6:c6:37:27:c7:0f:11:93:f8: + 74:9c:18:88:2a:f7:d4:50:da:fc:54:00:f8:5e:57:08:52:fb: + 47:48:d0:a3:7d:9f:3e:87:09:b4:4f:07:c7:46:89:e3:52:a5: + d9:a8:e9:04:51:58:99:ef:61:9c:51:f4:98:fe:89:fa:d0:1a: + bd:9f:63:81:e2:9a:f3:67:17:6d:df:8c:be:34:e8:c2:96:a2: + fc:28:e7:5a:23:fe:c1:02:c8:af:bd:db:4a:d0:8c:28:fd:c9: + a3:1c:1e:ab:ca:e6:d3:90:b7:25:c5:29:04:b9:76:08:f2:f1: + 14:e5:e7:8a:30:06:0b:bc:5d:30:4f:b0:12:3b:93:d7:99:a2: + de:57:0f:85:b8:c8:47:ee:dc:5b:6a:71:b7:7e:85:a1:fd:9d: + 3a:d2:fa:2b:0f:7c:51:8c:d9:ef:9e:37:c9:3a:4a:75:85:b1: + 16:ef:f9:cc:48:b4:15:8e:08:5f:ea:82:5b:32:07:a9:56:d4: + 76:5e:bc:a4 -----BEGIN CERTIFICATE----- -MIIE7jCCA9agAwIBAgIUaUdiTeA14KC7xbQtM+QF0QIWvIEwDQYJKoZIhvcNAQEL +MIIE7jCCA9agAwIBAgIUWj5UM7SI/q0iQAdimyixVnuvpuswDQYJKoZIhvcNAQEL BQAwgZoxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxFTATBgNVBAsMDEFCU09MVVRF X1VSTjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBp -bmZvQHdvbGZzc2wuY29tMB4XDTIzMDMxNjIxNDYxMFoXDTI1MTIxMDIxNDYxMFow +bmZvQHdvbGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFow gZoxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxFTATBgNVBAsMDEFCU09MVVRFX1VS TjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv @@ -80,12 +80,12 @@ pIGdMIGaMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRUwEwYDVQQLDAxBQlNPTFVU RV9VUk4xGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQ -aW5mb0B3b2xmc3NsLmNvbYIUaUdiTeA14KC7xbQtM+QF0QIWvIEwCQYDVR0TBAIw +aW5mb0B3b2xmc3NsLmNvbYIUWj5UM7SI/q0iQAdimyixVnuvpuswCQYDVR0TBAIw ADAbBgNVHREEFDAShhB1cm46ZXhhbXBsZTp0ZXN0MA0GCSqGSIb3DQEBCwUAA4IB -AQB50ZdRpzaEGzWw4OkAtK+M0R+O0Ns3n/5+k9AKVTSjcI3w3oQ6lPDhqGxLnPwZ -hKrZgIFxEKZzgGB7mwpL3+mFwvUDGlSZTSGIqveP/Dlupi5wOVcM8o0E7FT3GPdM -hug0pmN8wNPVmUQ4ZDAMxswKpI5M3ZvEEhH5BMWp9duauzkpz82wqx6aW5BWMG8B -dYfIzt8qQ9tdbBxSO2kj1C2KxZCf+QbB39B+KFItK+xd0qBc438YzGWKisIei8eO -LAUZSXL0PkPYQ5+1+lOLsfecxaSO23zaBQzM4n9CS4+QSZhzsJYamDPUGH4NiVVw -n1FrjpEnMlU451uZcRVeoRA4 +AQAo7GYbfvdi/kSOs2UKnBDTw3Khl4UdWhzedB8oYxj2KNDRjlXDmH3CIaiib36a +mN0vLKtRaZsnHwSeASLO+zqmxjcnxw8Rk/h0nBiIKvfUUNr8VAD4XlcIUvtHSNCj +fZ8+hwm0TwfHRonjUqXZqOkEUViZ72GcUfSY/on60Bq9n2OB4przZxdt34y+NOjC +lqL8KOdaI/7BAsivvdtK0Iwo/cmjHB6ryubTkLclxSkEuXYI8vEU5eeKMAYLvF0w +T7ASO5PXmaLeVw+FuMhH7txbanG3foWh/Z060vorD3xRjNnvnjfJOkp1hbEW7/nM +SLQVjghf6oJbMgepVtR2Xryk -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ca.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ca.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ca.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ca.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 73:fb:54:d6:03:7d:4c:07:84:e2:00:11:8c:dd:90:dc:48:8d:ea:53 + 08:b0:54:7a:03:5a:ec:55:8a:12:e8:f9:8e:34:b6:13:d9:59:b8:e8 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -38,7 +38,7 @@ X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:73:FB:54:D6:03:7D:4C:07:84:E2:00:11:8C:DD:90:DC:48:8D:EA:53 + serial:08:B0:54:7A:03:5A:EC:55:8A:12:E8:F9:8E:34:B6:13:D9:59:B8:E8 X509v3 Basic Constraints: CA:TRUE @@ -47,28 +47,28 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - 36:cb:bc:c5:52:9a:66:cd:91:4d:8f:27:9f:b3:64:80:0e:64: - b4:cb:1a:cd:75:9e:82:7c:55:67:d8:9f:90:a3:34:96:99:43: - f7:49:53:a2:58:85:a0:b3:83:4f:af:b8:15:8a:88:1e:f3:60: - f4:7c:94:b5:58:68:f1:2a:13:80:34:c2:6f:a5:f8:7e:76:16: - 81:4f:36:8b:c3:59:bd:51:dd:60:87:d7:1d:96:44:69:07:3c: - 8f:28:56:b1:11:5c:4e:81:3f:57:25:fd:65:dd:07:cf:17:0a: - 01:7e:4e:3f:8e:73:db:fe:f4:f2:c5:ff:a3:76:a8:74:46:2e: - 47:0d:b0:ed:0a:c0:c5:0a:65:d3:dc:62:b2:e0:1e:8e:bd:f3: - bd:af:af:66:84:36:92:e2:3b:80:d0:57:a6:41:a3:62:d1:a6: - 6d:14:6c:cd:82:b1:c1:c1:35:55:ae:59:49:a8:26:52:bd:ef: - 1b:2c:1f:9d:39:04:d2:82:a0:6b:39:71:59:33:82:ba:55:6c: - 97:f2:1b:5b:e0:4d:e2:cf:89:e7:26:b8:2c:6c:9f:83:d6:ed: - 4e:2f:75:a9:30:4e:01:95:0d:4f:83:5e:c8:af:7f:67:ea:53: - bf:ca:9b:1f:d4:ff:36:97:02:71:8e:33:de:e2:58:27:aa:70: - 0c:5b:de:0e + 89:84:eb:6a:70:3b:2a:6e:a8:8b:f2:92:79:97:5c:bd:98:8b: + 71:db:db:7c:df:db:a4:2c:59:d3:a6:75:41:c2:06:b6:17:1e: + 0c:1f:7d:0b:7f:58:3e:c1:e7:0c:f0:62:92:77:ab:99:79:7b: + 85:f4:d9:6c:d0:0e:e5:8b:13:35:65:9e:d7:9a:51:98:e4:49: + 44:51:c8:e3:e0:9a:ff:c2:cb:3d:81:eb:ee:f4:1a:d1:96:4b: + e9:7d:de:5b:f2:64:40:ad:e1:d9:d6:b7:e1:eb:a9:3a:52:29: + 89:aa:07:37:96:44:e3:23:49:f3:be:f3:0d:70:d1:a2:ce:78: + 86:22:fc:76:00:84:1d:fa:8b:8a:d2:43:93:88:fa:ee:22:cc: + a6:86:f5:3f:24:f1:d4:70:05:4f:3b:18:32:50:67:c1:80:77: + 0d:3c:78:75:35:d0:fd:60:f3:ed:a1:30:d0:62:25:99:6b:80: + 56:17:3d:b4:af:1d:df:ab:48:21:c1:d2:0b:6b:94:a7:33:d1: + d0:82:b7:3b:92:eb:9d:d6:6c:32:81:5e:07:3c:46:34:32:7b: + ea:22:db:a6:a3:18:69:7c:ad:17:e4:c8:a9:8f:a8:ba:67:af: + 99:39:ef:6e:0c:f8:a9:b3:bd:ab:71:94:e0:41:aa:a4:2d:72: + 60:51:d1:5c -----BEGIN CERTIFICATE----- -MIIFHTCCBAWgAwIBAgIUc/tU1gN9TAeE4gARjN2Q3EiN6lMwDQYJKoZIhvcNAQEL +MIIFHTCCBAWgAwIBAgIUCLBUegNa7FWKEuj5jjS2E9lZuOgwDQYJKoZIhvcNAQEL BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsMEFByb2dyYW1t aW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3 -NDlaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5 +MjhaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFt bWluZy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK @@ -82,26 +82,26 @@ JteFZcChgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAw DgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsM EFByb2dyYW1taW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G -CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUc/tU1gN9TAeE4gARjN2Q3EiN -6lMwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAd +CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUCLBUegNa7FWKEuj5jjS2E9lZ +uOgwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAd BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEB -ADbLvMVSmmbNkU2PJ5+zZIAOZLTLGs11noJ8VWfYn5CjNJaZQ/dJU6JYhaCzg0+v -uBWKiB7zYPR8lLVYaPEqE4A0wm+l+H52FoFPNovDWb1R3WCH1x2WRGkHPI8oVrER -XE6BP1cl/WXdB88XCgF+Tj+Oc9v+9PLF/6N2qHRGLkcNsO0KwMUKZdPcYrLgHo69 -872vr2aENpLiO4DQV6ZBo2LRpm0UbM2CscHBNVWuWUmoJlK97xssH505BNKCoGs5 -cVkzgrpVbJfyG1vgTeLPiecmuCxsn4PW7U4vdakwTgGVDU+DXsivf2fqU7/Kmx/U -/zaXAnGOM97iWCeqcAxb3g4= +AImE62pwOypuqIvyknmXXL2Yi3Hb23zf26QsWdOmdUHCBrYXHgwffQt/WD7B5wzw +YpJ3q5l5e4X02WzQDuWLEzVlnteaUZjkSURRyOPgmv/Cyz2B6+70GtGWS+l93lvy +ZECt4dnWt+HrqTpSKYmqBzeWROMjSfO+8w1w0aLOeIYi/HYAhB36i4rSQ5OI+u4i +zKaG9T8k8dRwBU87GDJQZ8GAdw08eHU10P1g8+2hMNBiJZlrgFYXPbSvHd+rSCHB +0gtrlKcz0dCCtzuS653WbDKBXgc8RjQye+oi26ajGGl8rRfkyKmPqLpnr5k5724M ++KmzvatxlOBBqqQtcmBR0Vw= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: - 59:e6:5a:21:e0:c4:3f:67:06:9b:21:43:3e:76:ca:f0:3f:68:5b:53 + 37:67:2a:05:24:b5:2b:b6:ae:40:6b:e1:75:e0:97:cc:1d:12:8b:2a Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -120,7 +120,7 @@ X509v3 Authority Key Identifier: keyid:EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2 DirName:/C=US/ST=Oregon/L=Salem/O=Client ECC/OU=Fast/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:59:E6:5A:21:E0:C4:3F:67:06:9B:21:43:3E:76:CA:F0:3F:68:5B:53 + serial:37:67:2A:05:24:B5:2B:B6:AE:40:6B:E1:75:E0:97:CC:1D:12:8B:2A X509v3 Basic Constraints: CA:TRUE @@ -129,16 +129,16 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:20:70:f8:0e:6e:91:c9:09:77:25:8c:ba:99:6d:54: - 2d:a8:52:87:17:51:24:8b:13:92:89:7d:c9:ba:b4:43:2e:48: - 02:21:00:ab:41:13:3a:d5:eb:68:66:36:56:7c:75:5d:37:e3: - f6:27:7f:54:d5:42:80:29:db:e5:9b:16:8a:d3:c2:ad:d6 + 30:44:02:20:7a:6d:c5:bd:6f:9d:54:4f:c5:4c:d0:12:8c:31: + 3b:b6:17:80:9e:c7:34:f8:c5:da:fb:61:23:35:e6:93:35:b4: + 02:20:1b:6a:86:c4:11:be:7c:15:a7:5e:ab:85:ee:b7:8c:20: + dc:eb:17:a3:f2:66:63:aa:6b:67:e0:62:1f:17:3e:ac -----BEGIN CERTIFICATE----- -MIIDXjCCAwSgAwIBAgIUWeZaIeDEP2cGmyFDPnbK8D9oW1MwCgYIKoZIzj0EAwIw +MIIDXTCCAwSgAwIBAgIUN2cqBSS1K7auQGvhdeCXzB0SiyowCgYIKoZIzj0EAwIw gY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAMBgNVBAcMBVNhbGVt MRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0MRgwFgYDVQQDDA93 d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w -HhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBjTELMAkGA1UEBhMCVVMx +HhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBjTELMAkGA1UEBhMCVVMx DzANBgNVBAgMBk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0xEzARBgNVBAoMCkNsaWVu dCBFQ0MxDTALBgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqG @@ -148,9 +148,9 @@ iERcq/KhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAM BgNVBAcMBVNhbGVtMRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0 MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A -d29sZnNzbC5jb22CFFnmWiHgxD9nBpshQz52yvA/aFtTMAwGA1UdEwQFMAMBAf8w +d29sZnNzbC5jb22CFDdnKgUktSu2rkBr4XXgl8wdEosqMAwGA1UdEwQFMAMBAf8w HAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0lBBYwFAYIKwYBBQUH -AwEGCCsGAQUFBwMCMAoGCCqGSM49BAMCA0gAMEUCIHD4Dm6RyQl3JYy6mW1ULahS -hxdRJIsTkol9ybq0Qy5IAiEAq0ETOtXraGY2Vnx1XTfj9id/VNVCgCnb5ZsWitPC -rdY= +AwEGCCsGAQUFBwMCMAoGCCqGSM49BAMCA0cAMEQCIHptxb1vnVRPxUzQEowxO7YX +gJ7HNPjF2vthIzXmkzW0AiAbaobEEb58Fadeq4Xut4wg3OsXo/JmY6prZ+BiHxc+ +rA== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-cert-ext.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert-ext.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-cert-ext.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert-ext.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-cert-ext.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert-ext.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 45:9c:f1:fd:f9:b8:de:31:65:89:f7:e4:d9:e4:24:25:6a:41:8e:81 + 12:37:de:bf:76:06:c4:e6:74:0c:38:84:53:e2:19:d4:b9:d3:68:d3 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -38,7 +38,7 @@ X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:45:9C:F1:FD:F9:B8:DE:31:65:89:F7:E4:D9:E4:24:25:6A:41:8E:81 + serial:12:37:DE:BF:76:06:C4:E6:74:0C:38:84:53:E2:19:D4:B9:D3:68:D3 X509v3 Basic Constraints: CA:TRUE @@ -47,28 +47,28 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - a9:d7:de:27:5e:35:fb:a2:0d:f1:c5:9e:d7:d4:d7:d3:11:c7: - 78:39:1c:e6:b9:af:44:34:ed:c8:b6:b8:b3:e0:31:75:1b:3a: - f8:f0:1e:58:f5:02:44:4e:39:f6:39:52:0a:a2:a1:d9:ad:98: - 46:65:ec:f1:c4:c3:26:91:d0:98:51:45:55:91:49:52:11:27: - e8:c5:82:ca:b9:a1:09:75:1d:b2:8f:33:76:3d:d6:8e:7c:37: - 03:ec:95:6a:43:95:5c:96:84:f1:c5:d0:b2:47:0a:78:53:c4: - 3b:04:a8:1a:73:7c:da:b6:0f:4d:80:7f:77:0a:0c:6c:8a:6b: - 78:98:c3:cc:19:90:e6:c7:9e:31:f5:f9:90:2c:72:8e:bd:7c: - 9d:3d:68:50:9d:30:32:c7:26:27:e4:52:cc:bd:c3:c6:e5:8a: - 3f:44:70:63:f1:da:ae:a0:fd:18:6a:d6:e5:12:e5:04:55:89: - 20:a9:47:67:4a:4e:4f:dc:3b:eb:06:83:81:98:7c:a4:33:61: - e0:f4:03:33:1c:1d:65:e3:43:e2:f2:08:ca:59:ee:13:4f:32: - 5e:48:7e:62:48:2c:c9:95:7b:00:ea:a2:c1:2a:50:b5:a4:91: - 40:3f:6a:df:84:e3:66:0e:2f:a1:c8:02:c7:13:88:15:77:2a: - d3:38:6e:0f + ac:be:4c:63:00:b5:d9:d5:9e:b1:83:61:a3:7a:1f:a8:b7:ad: + e0:0a:c8:c4:42:b2:ff:96:18:99:3d:16:b9:58:05:94:7b:1b: + da:66:27:e3:48:5b:e6:4d:7b:0f:51:c5:8e:e4:b5:c3:0b:48: + 96:56:95:bb:3c:4d:91:c9:2c:51:61:24:37:d2:ef:ec:6c:97: + 92:cc:b4:fc:4f:fc:db:f7:7d:71:a9:3c:3a:a1:fb:e1:14:1a: + c2:a3:51:e8:fc:c5:fb:57:44:73:97:93:bd:79:9a:10:9e:27: + e1:f2:cd:43:94:8f:6a:01:ce:40:51:e4:fa:06:d2:de:0a:10: + 93:ff:0f:10:44:85:8a:00:60:2b:bf:86:40:5b:2e:28:11:e9: + 8e:8a:ad:00:e9:0e:c6:67:ee:fc:53:8d:19:6a:33:91:0e:42: + 16:83:5e:67:3b:24:05:85:b8:2a:bf:16:5b:d4:b0:a7:02:de: + 29:6b:7b:fc:45:c1:1e:9f:d9:91:3c:92:9d:2e:c6:a7:a0:ea: + d7:b0:97:d6:58:14:03:4c:12:d5:f1:81:e3:a9:07:94:3f:53: + 78:d1:61:e9:44:87:59:8b:b8:e7:c1:cc:3f:11:eb:00:e9:b5: + b7:6a:05:49:f7:5c:e0:e8:b4:6c:7c:f0:fc:67:5a:67:35:7e: + 85:43:cb:b6 -----BEGIN CERTIFICATE----- -MIIFCDCCA/CgAwIBAgIURZzx/fm43jFliffk2eQkJWpBjoEwDQYJKoZIhvcNAQEL +MIIFCDCCA/CgAwIBAgIUEjfev3YGxOZ0DDiEU+IZ1LnTaNMwDQYJKoZIhvcNAQEL BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsMEFByb2dyYW1t aW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3 -NDlaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5 +MjhaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFt bWluZy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK @@ -82,12 +82,12 @@ JteFZcChgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAw DgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsM EFByb2dyYW1taW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G -CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIURZzx/fm43jFliffk2eQkJWpB -joEwDAYDVR0TBAUwAwEB/zAWBgNVHREEDzANggtleGFtcGxlLmNvbTAOBgNVHQ8B -Af8EBAMCAYYwDQYJKoZIhvcNAQELBQADggEBAKnX3ideNfuiDfHFntfU19MRx3g5 -HOa5r0Q07ci2uLPgMXUbOvjwHlj1AkROOfY5UgqiodmtmEZl7PHEwyaR0JhRRVWR -SVIRJ+jFgsq5oQl1HbKPM3Y91o58NwPslWpDlVyWhPHF0LJHCnhTxDsEqBpzfNq2 -D02Af3cKDGyKa3iYw8wZkObHnjH1+ZAsco69fJ09aFCdMDLHJifkUsy9w8blij9E -cGPx2q6g/Rhq1uUS5QRViSCpR2dKTk/cO+sGg4GYfKQzYeD0AzMcHWXjQ+LyCMpZ -7hNPMl5IfmJILMmVewDqosEqULWkkUA/at+E42YOL6HIAscTiBV3KtM4bg8= +CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUEjfev3YGxOZ0DDiEU+IZ1LnT +aNMwDAYDVR0TBAUwAwEB/zAWBgNVHREEDzANggtleGFtcGxlLmNvbTAOBgNVHQ8B +Af8EBAMCAYYwDQYJKoZIhvcNAQELBQADggEBAKy+TGMAtdnVnrGDYaN6H6i3reAK +yMRCsv+WGJk9FrlYBZR7G9pmJ+NIW+ZNew9RxY7ktcMLSJZWlbs8TZHJLFFhJDfS +7+xsl5LMtPxP/Nv3fXGpPDqh++EUGsKjUej8xftXRHOXk715mhCeJ+HyzUOUj2oB +zkBR5PoG0t4KEJP/DxBEhYoAYCu/hkBbLigR6Y6KrQDpDsZn7vxTjRlqM5EOQhaD +Xmc7JAWFuCq/FlvUsKcC3ilre/xFwR6f2ZE8kp0uxqeg6tewl9ZYFANMEtXxgeOp +B5Q/U3jRYelEh1mLuOfBzD8R6wDptbdqBUn3XODotGx88PxnWmc1foVDy7Y= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 73:fb:54:d6:03:7d:4c:07:84:e2:00:11:8c:dd:90:dc:48:8d:ea:53 + 08:b0:54:7a:03:5a:ec:55:8a:12:e8:f9:8e:34:b6:13:d9:59:b8:e8 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -38,7 +38,7 @@ X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=Programming-2048/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:73:FB:54:D6:03:7D:4C:07:84:E2:00:11:8C:DD:90:DC:48:8D:EA:53 + serial:08:B0:54:7A:03:5A:EC:55:8A:12:E8:F9:8E:34:B6:13:D9:59:B8:E8 X509v3 Basic Constraints: CA:TRUE @@ -47,28 +47,28 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - 36:cb:bc:c5:52:9a:66:cd:91:4d:8f:27:9f:b3:64:80:0e:64: - b4:cb:1a:cd:75:9e:82:7c:55:67:d8:9f:90:a3:34:96:99:43: - f7:49:53:a2:58:85:a0:b3:83:4f:af:b8:15:8a:88:1e:f3:60: - f4:7c:94:b5:58:68:f1:2a:13:80:34:c2:6f:a5:f8:7e:76:16: - 81:4f:36:8b:c3:59:bd:51:dd:60:87:d7:1d:96:44:69:07:3c: - 8f:28:56:b1:11:5c:4e:81:3f:57:25:fd:65:dd:07:cf:17:0a: - 01:7e:4e:3f:8e:73:db:fe:f4:f2:c5:ff:a3:76:a8:74:46:2e: - 47:0d:b0:ed:0a:c0:c5:0a:65:d3:dc:62:b2:e0:1e:8e:bd:f3: - bd:af:af:66:84:36:92:e2:3b:80:d0:57:a6:41:a3:62:d1:a6: - 6d:14:6c:cd:82:b1:c1:c1:35:55:ae:59:49:a8:26:52:bd:ef: - 1b:2c:1f:9d:39:04:d2:82:a0:6b:39:71:59:33:82:ba:55:6c: - 97:f2:1b:5b:e0:4d:e2:cf:89:e7:26:b8:2c:6c:9f:83:d6:ed: - 4e:2f:75:a9:30:4e:01:95:0d:4f:83:5e:c8:af:7f:67:ea:53: - bf:ca:9b:1f:d4:ff:36:97:02:71:8e:33:de:e2:58:27:aa:70: - 0c:5b:de:0e + 89:84:eb:6a:70:3b:2a:6e:a8:8b:f2:92:79:97:5c:bd:98:8b: + 71:db:db:7c:df:db:a4:2c:59:d3:a6:75:41:c2:06:b6:17:1e: + 0c:1f:7d:0b:7f:58:3e:c1:e7:0c:f0:62:92:77:ab:99:79:7b: + 85:f4:d9:6c:d0:0e:e5:8b:13:35:65:9e:d7:9a:51:98:e4:49: + 44:51:c8:e3:e0:9a:ff:c2:cb:3d:81:eb:ee:f4:1a:d1:96:4b: + e9:7d:de:5b:f2:64:40:ad:e1:d9:d6:b7:e1:eb:a9:3a:52:29: + 89:aa:07:37:96:44:e3:23:49:f3:be:f3:0d:70:d1:a2:ce:78: + 86:22:fc:76:00:84:1d:fa:8b:8a:d2:43:93:88:fa:ee:22:cc: + a6:86:f5:3f:24:f1:d4:70:05:4f:3b:18:32:50:67:c1:80:77: + 0d:3c:78:75:35:d0:fd:60:f3:ed:a1:30:d0:62:25:99:6b:80: + 56:17:3d:b4:af:1d:df:ab:48:21:c1:d2:0b:6b:94:a7:33:d1: + d0:82:b7:3b:92:eb:9d:d6:6c:32:81:5e:07:3c:46:34:32:7b: + ea:22:db:a6:a3:18:69:7c:ad:17:e4:c8:a9:8f:a8:ba:67:af: + 99:39:ef:6e:0c:f8:a9:b3:bd:ab:71:94:e0:41:aa:a4:2d:72: + 60:51:d1:5c -----BEGIN CERTIFICATE----- -MIIFHTCCBAWgAwIBAgIUc/tU1gN9TAeE4gARjN2Q3EiN6lMwDQYJKoZIhvcNAQEL +MIIFHTCCBAWgAwIBAgIUCLBUegNa7FWKEuj5jjS2E9lZuOgwDQYJKoZIhvcNAQEL BQAwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsMEFByb2dyYW1t aW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3 -NDlaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5 +MjhaMIGeMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRkwFwYDVQQLDBBQcm9ncmFt bWluZy0yMDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK @@ -82,13 +82,13 @@ JteFZcChgaSkgaEwgZ4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAw DgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxGTAXBgNVBAsM EFByb2dyYW1taW5nLTIwNDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G -CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUc/tU1gN9TAeE4gARjN2Q3EiN -6lMwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAd +CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUCLBUegNa7FWKEuj5jjS2E9lZ +uOgwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAd BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEB -ADbLvMVSmmbNkU2PJ5+zZIAOZLTLGs11noJ8VWfYn5CjNJaZQ/dJU6JYhaCzg0+v -uBWKiB7zYPR8lLVYaPEqE4A0wm+l+H52FoFPNovDWb1R3WCH1x2WRGkHPI8oVrER -XE6BP1cl/WXdB88XCgF+Tj+Oc9v+9PLF/6N2qHRGLkcNsO0KwMUKZdPcYrLgHo69 -872vr2aENpLiO4DQV6ZBo2LRpm0UbM2CscHBNVWuWUmoJlK97xssH505BNKCoGs5 -cVkzgrpVbJfyG1vgTeLPiecmuCxsn4PW7U4vdakwTgGVDU+DXsivf2fqU7/Kmx/U -/zaXAnGOM97iWCeqcAxb3g4= +AImE62pwOypuqIvyknmXXL2Yi3Hb23zf26QsWdOmdUHCBrYXHgwffQt/WD7B5wzw +YpJ3q5l5e4X02WzQDuWLEzVlnteaUZjkSURRyOPgmv/Cyz2B6+70GtGWS+l93lvy +ZECt4dnWt+HrqTpSKYmqBzeWROMjSfO+8w1w0aLOeIYi/HYAhB36i4rSQ5OI+u4i +zKaG9T8k8dRwBU87GDJQZ8GAdw08eHU10P1g8+2hMNBiJZlrgFYXPbSvHd+rSCHB +0gtrlKcz0dCCtzuS653WbDKBXgc8RjQye+oi26ajGGl8rRfkyKmPqLpnr5k5724M ++KmzvatxlOBBqqQtcmBR0Vw= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-crl-dist.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-crl-dist.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-crl-dist.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-crl-dist.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-crl-dist.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-crl-dist.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 74:65:e7:ce:97:a7:4c:9e:ec:b7:35:9a:21:93:6d:b1:f8:a1:53:95 + 4b:fb:e6:7a:af:6c:19:2e:6a:b9:4c:cc:af:a9:1e:8e:7c:de:ea:09 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = CRL_DIST, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = CRL_DIST, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -39,27 +39,27 @@ URI:http://www.wolfssl.com/crl.pem Signature Algorithm: sha256WithRSAEncryption - 83:23:c3:dc:8e:65:2d:00:a3:09:24:f0:c5:6a:68:a6:b7:53: - 9a:4d:7c:bb:3c:e6:c5:a0:e5:0e:2e:47:33:70:a5:41:a5:3b: - be:62:61:9f:a9:58:f2:6a:d3:e7:8b:38:57:34:65:b1:5f:64: - 37:6b:81:46:f7:f5:ba:28:3a:c8:76:7b:b2:74:6c:45:de:7e: - 1c:57:8e:17:f1:b1:98:99:5e:21:6a:bd:c1:cd:3a:43:33:2f: - aa:a9:a8:37:63:0e:ee:8c:83:3d:60:0f:79:45:20:5d:78:08: - d8:c2:7d:6d:95:31:1e:ca:88:bc:9f:d3:c5:e9:e6:76:9e:72: - c2:93:75:61:63:e2:c6:2e:0a:56:1f:1e:e0:ea:31:05:30:da: - 68:11:85:3c:c2:4c:68:98:0a:ed:11:6f:a8:f5:25:d1:81:bd: - 98:d1:b5:53:e0:09:dc:f4:e8:49:f0:56:ce:f7:f2:a4:f6:56: - e4:18:4b:99:04:9b:2c:48:62:19:6c:8c:38:17:95:8e:98:7d: - b8:12:05:fb:6c:a2:d3:b5:b2:f8:34:b9:ba:c2:76:47:75:1a: - 73:cc:61:0c:b1:f2:12:52:41:fc:3f:aa:85:b6:24:b6:bd:c8: - 7b:0c:11:bd:03:89:eb:38:45:db:18:6d:e3:56:30:41:f3:14: - 2e:f9:ea:b1 + 2d:cc:22:e7:1f:88:8f:59:86:50:9d:98:17:64:1b:7f:20:5d: + 5d:41:11:c1:b4:17:1f:93:64:b6:55:ae:a2:48:b9:60:ff:6f: + e4:1e:5f:70:31:50:95:b5:b0:85:9b:48:13:e7:ea:18:1a:04: + 33:cd:bc:ae:32:83:eb:e6:78:77:73:25:a2:eb:c2:fc:6f:09: + 0e:5e:85:9d:93:98:9d:19:b9:48:3c:8c:29:c6:83:b2:8c:3c: + dd:47:8b:89:f1:da:ab:0e:73:64:43:61:45:74:bf:b7:8c:72: + 79:b5:6e:29:7b:5d:df:36:9f:92:57:eb:23:ba:96:93:ba:e6: + 53:75:ec:77:0f:9b:7d:fa:9f:2a:37:6d:fd:ce:9e:59:31:bb: + 19:b0:72:ce:e8:34:9e:73:ae:4a:d3:47:36:b7:1c:52:a7:4a: + f0:86:fe:4c:51:6e:f4:d1:51:f3:5c:6f:83:c7:d1:15:07:d8: + c3:47:2a:80:23:fd:65:eb:38:14:5c:32:77:ff:3c:35:02:d4: + 95:99:31:40:43:42:5b:b1:8b:30:f2:dc:6a:fe:81:08:d1:c8: + 8e:58:9a:e5:42:91:eb:8b:4a:ae:cd:85:c6:62:f5:05:ff:5a: + 6c:d3:27:47:32:94:60:16:96:94:25:be:82:08:fd:0c:ae:71: + 5c:cd:aa:18 -----BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIUdGXnzpenTJ7stzWaIZNtsfihU5UwDQYJKoZIhvcNAQEL +MIID7zCCAtegAwIBAgIUS/vmeq9sGS5quUzMr6kejnze6gkwDQYJKoZIhvcNAQEL BQAwgZYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxETAPBgNVBAsMCENSTF9ESVNU MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A -d29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBljEL +d29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBljEL MAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4x FTATBgNVBAoMDHdvbGZTU0xfMjA0ODERMA8GA1UECwwIQ1JMX0RJU1QxGDAWBgNV BAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns @@ -70,11 +70,11 @@ b42GwohAmTaDuh5AciIX11JlJHOwzu8Zza7/eGx7wBID1E5yDVBtO6M7o5lencjZ DIWz2YrZVCbbbfqsu/8lTMTRefRx04ZAGBOwY7VyTjDEl4SGLVYv1xX3f8Cu9fxb 5fuhutMCAwEAAaMzMDEwLwYDVR0fBCgwJjAkoCKgIIYeaHR0cDovL3d3dy53b2xm -c3NsLmNvbS9jcmwucGVtMA0GCSqGSIb3DQEBCwUAA4IBAQCDI8PcjmUtAKMJJPDF -amimt1OaTXy7PObFoOUOLkczcKVBpTu+YmGfqVjyatPnizhXNGWxX2Q3a4FG9/W6 -KDrIdnuydGxF3n4cV44X8bGYmV4har3BzTpDMy+qqag3Yw7ujIM9YA95RSBdeAjY -wn1tlTEeyoi8n9PF6eZ2nnLCk3VhY+LGLgpWHx7g6jEFMNpoEYU8wkxomArtEW+o -9SXRgb2Y0bVT4Anc9OhJ8FbO9/Kk9lbkGEuZBJssSGIZbIw4F5WOmH24EgX7bKLT -tbL4NLm6wnZHdRpzzGEMsfISUkH8P6qFtiS2vch7DBG9A4nrOEXbGG3jVjBB8xQu -+eqx +c3NsLmNvbS9jcmwucGVtMA0GCSqGSIb3DQEBCwUAA4IBAQAtzCLnH4iPWYZQnZgX +ZBt/IF1dQRHBtBcfk2S2Va6iSLlg/2/kHl9wMVCVtbCFm0gT5+oYGgQzzbyuMoPr +5nh3cyWi68L8bwkOXoWdk5idGblIPIwpxoOyjDzdR4uJ8dqrDnNkQ2FFdL+3jHJ5 +tW4pe13fNp+SV+sjupaTuuZTdex3D5t9+p8qN239zp5ZMbsZsHLO6DSec65K00c2 +txxSp0rwhv5MUW700VHzXG+Dx9EVB9jDRyqAI/1l6zgUXDJ3/zw1AtSVmTFAQ0Jb +sYsw8txq/oEI0ciOWJrlQpHri0quzYXGYvUF/1ps0ydHMpRgFpaUJb6CCP0MrnFc +zaoY -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ecc-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ecc-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ecc-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 59:e6:5a:21:e0:c4:3f:67:06:9b:21:43:3e:76:ca:f0:3f:68:5b:53 + 37:67:2a:05:24:b5:2b:b6:ae:40:6b:e1:75:e0:97:cc:1d:12:8b:2a Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -26,7 +26,7 @@ X509v3 Authority Key Identifier: keyid:EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2 DirName:/C=US/ST=Oregon/L=Salem/O=Client ECC/OU=Fast/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:59:E6:5A:21:E0:C4:3F:67:06:9B:21:43:3E:76:CA:F0:3F:68:5B:53 + serial:37:67:2A:05:24:B5:2B:B6:AE:40:6B:E1:75:E0:97:CC:1D:12:8B:2A X509v3 Basic Constraints: CA:TRUE @@ -35,16 +35,16 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:20:70:f8:0e:6e:91:c9:09:77:25:8c:ba:99:6d:54: - 2d:a8:52:87:17:51:24:8b:13:92:89:7d:c9:ba:b4:43:2e:48: - 02:21:00:ab:41:13:3a:d5:eb:68:66:36:56:7c:75:5d:37:e3: - f6:27:7f:54:d5:42:80:29:db:e5:9b:16:8a:d3:c2:ad:d6 + 30:44:02:20:7a:6d:c5:bd:6f:9d:54:4f:c5:4c:d0:12:8c:31: + 3b:b6:17:80:9e:c7:34:f8:c5:da:fb:61:23:35:e6:93:35:b4: + 02:20:1b:6a:86:c4:11:be:7c:15:a7:5e:ab:85:ee:b7:8c:20: + dc:eb:17:a3:f2:66:63:aa:6b:67:e0:62:1f:17:3e:ac -----BEGIN CERTIFICATE----- -MIIDXjCCAwSgAwIBAgIUWeZaIeDEP2cGmyFDPnbK8D9oW1MwCgYIKoZIzj0EAwIw +MIIDXTCCAwSgAwIBAgIUN2cqBSS1K7auQGvhdeCXzB0SiyowCgYIKoZIzj0EAwIw gY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAMBgNVBAcMBVNhbGVt MRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0MRgwFgYDVQQDDA93 d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w -HhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBjTELMAkGA1UEBhMCVVMx +HhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBjTELMAkGA1UEBhMCVVMx DzANBgNVBAgMBk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0xEzARBgNVBAoMCkNsaWVu dCBFQ0MxDTALBgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqG @@ -54,9 +54,9 @@ iERcq/KhgZOkgZAwgY0xCzAJBgNVBAYTAlVTMQ8wDQYDVQQIDAZPcmVnb24xDjAM BgNVBAcMBVNhbGVtMRMwEQYDVQQKDApDbGllbnQgRUNDMQ0wCwYDVQQLDARGYXN0 MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A -d29sZnNzbC5jb22CFFnmWiHgxD9nBpshQz52yvA/aFtTMAwGA1UdEwQFMAMBAf8w +d29sZnNzbC5jb22CFDdnKgUktSu2rkBr4XXgl8wdEosqMAwGA1UdEwQFMAMBAf8w HAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0lBBYwFAYIKwYBBQUH -AwEGCCsGAQUFBwMCMAoGCCqGSM49BAMCA0gAMEUCIHD4Dm6RyQl3JYy6mW1ULahS -hxdRJIsTkol9ybq0Qy5IAiEAq0ETOtXraGY2Vnx1XTfj9id/VNVCgCnb5ZsWitPC -rdY= +AwEGCCsGAQUFBwMCMAoGCCqGSM49BAMCA0cAMEQCIHptxb1vnVRPxUzQEowxO7YX +gJ7HNPjF2vthIzXmkzW0AiAbaobEEb58Fadeq4Xut4wg3OsXo/JmY6prZ+BiHxc+ +rA== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ecc384-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc384-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ecc384-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc384-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-ecc384-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-ecc384-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIC7jCCAnWgAwIBAgICEAIwCgYIKoZIzj0EAwMwgZcxCzAJBgNVBAYTAlVTMRMw +MIIC8TCCAnagAwIBAgICEAIwCgYIKoZIzj0EAwMwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMCAXDTIyMTIx -NjIxMTc0OVoYDzIwNTIxMjA4MjExNzQ5WjCBljELMAkGA1UEBhMCVVMxEzARBgNV -BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0 -aWMxEzARBgNVBAsMCkVDQzM4NENsaXQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNv -bTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTB2MBAGByqGSM49AgEG -BSuBBAAiA2IABGbECD1mp6EV1FMKI7OtC86PyPSYHabYsm4iEfq575nA+ik+SAD5 -/sKmShunEqhrkEwcu6xdbg5iznAg90N32JfHdNNo/onsd8sZL4lKHXf5l0tmAmil -Yq+VgcvjJDbrhaOBkDCBjTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAd -BgNVHQ4EFgQUHvLQG/j8pcs/3Ir1lypCU7BC+dQwHwYDVR0jBBgwFoAUq+DDJkwY -1HK70oSMnAoFkoASU1IwDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUF -BwMCBggrBgEFBQcDBDAKBggqhkjOPQQDAwNnADBkAjAPQMgZxsqXF0GGM9ENosCY -W1DkocrsibpBK8OR3ATI+FYZPshPUW5CeyczH+NkZaYCMDzZ+hqoQhVY0VL93fa2 -IwAeR5QzHT3Vm802Zbormsdhso44wEqmByPbZrseWKK9ig== +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMCAXDTIzMTIx +MzIyMTkyN1oYDzIwNTMxMjA1MjIxOTI3WjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlw +dGljMRMwEQYDVQQLDApFQ0MzODRDbGl0MRgwFgYDVQQDDA93d3cud29sZnNzbC5j +b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wdjAQBgcqhkjOPQIB +BgUrgQQAIgNiAARmxAg9ZqehFdRTCiOzrQvOj8j0mB2m2LJuIhH6ue+ZwPopPkgA ++f7CpkobpxKoa5BMHLusXW4OYs5wIPdDd9iXx3TTaP6J7HfLGS+JSh13+ZdLZgJo +pWKvlYHL4yQ264WjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAw +HQYDVR0OBBYEFB7y0Bv4/KXLP9yK9ZcqQlOwQvnUMB8GA1UdIwQYMBaAFKvgwyZM +GNRyu9KEjJwKBZKAElNSMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEF +BQcDAgYIKwYBBQUHAwQwCgYIKoZIzj0EAwMDaQAwZgIxANNvyNaU668jcKTlo9iz +ZiaHuFxJmE0DGHTBYJClnOiXXWOYXzFbwurGYGTX3YzmtgIxALtl1Hctz2t+kLwY +K+PYqHKH5fPWpnf8hMb9hdF/AeZqXSlutQpXG2Wppj6T6zSjLg== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-relative-uri.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-relative-uri.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-relative-uri.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-relative-uri.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 24:30:a2:59:c1:a0:67:cb:4c:58:f7:69:e0:0b:15:23:ff:a3:8e:19 + 28:2c:d3:e8:22:39:f9:1d:be:90:1c:5e:99:59:bb:59:d7:0e:25:de Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = RELATIVE_URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = RELATIVE_URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -38,34 +38,34 @@ X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=RELATIVE_URI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:24:30:A2:59:C1:A0:67:CB:4C:58:F7:69:E0:0B:15:23:FF:A3:8E:19 + serial:28:2C:D3:E8:22:39:F9:1D:BE:90:1C:5E:99:59:BB:59:D7:0E:25:DE X509v3 Basic Constraints: CA:FALSE X509v3 Subject Alternative Name: URI:../relative/page.html Signature Algorithm: sha256WithRSAEncryption - 2d:b8:d7:52:e5:73:42:36:8a:a9:97:ed:5f:da:4b:28:40:92: - fa:b3:05:13:67:e1:d8:9d:93:7e:d3:03:d0:21:6d:50:db:5a: - 6f:40:de:06:f6:ff:6f:67:89:61:6d:e8:3d:3e:7f:47:a9:10: - f4:40:cf:74:1b:e7:5d:1c:2e:e3:5f:a1:d6:7a:c4:1c:98:2e: - 55:8a:b5:99:2a:2f:de:82:33:1f:e0:35:b0:e6:e9:89:47:9a: - 77:03:bb:96:a3:6c:21:02:ea:2c:6a:a8:bc:3a:f7:b9:66:53: - 55:36:98:a6:20:28:c0:f8:ef:91:7b:2b:dc:a9:5c:6e:b1:83: - be:27:a5:7c:9a:d2:a7:a8:31:a3:f3:0d:8d:21:cf:d3:28:40: - 7c:83:18:a1:97:fa:b2:7e:54:cb:fd:33:d6:28:17:47:c1:6c: - 8a:c3:4d:f3:9c:33:df:ed:5f:ba:4b:6c:82:dc:7b:17:94:cc: - 12:a8:ed:92:64:5d:6a:37:9e:12:65:76:5a:22:76:61:00:59: - 22:4c:2a:e2:7b:a8:48:45:70:13:7d:f5:45:90:70:9b:3a:4e: - df:d5:a7:a4:72:74:9f:e3:ca:32:4f:cb:f8:e2:8b:eb:ce:35: - 75:dc:de:a1:4d:d2:3e:6a:a9:96:77:26:00:d4:a5:19:e4:44: - 41:d4:0e:1a + 9a:6f:69:6c:4a:a8:1a:c7:42:04:ae:d8:d3:d0:b0:ce:ae:d6: + 68:5c:e6:91:37:39:d8:6c:64:43:11:fd:a9:ea:4a:47:e8:bc: + 6c:dc:12:b9:70:94:12:a8:5e:21:1a:e9:a2:fa:cf:c2:19:47: + 22:5d:6c:9e:4e:a3:6a:1d:7f:75:8f:a7:06:56:2f:c2:ac:d6: + 2e:56:90:ef:53:01:70:5f:a2:e0:6d:28:79:ab:bb:24:40:cd: + 62:6e:18:b5:5d:33:6a:d0:1c:84:c6:8f:82:77:1d:7b:85:c9: + 60:db:41:b2:6e:d2:4a:3e:ed:eb:76:62:59:82:93:21:1c:b5: + 8f:d6:9e:c2:5c:d8:a3:ca:cf:2f:16:a0:03:2d:7c:d9:3c:ec: + 1b:55:57:da:22:49:67:c6:9d:da:9a:1a:27:d8:1f:ea:e5:74: + 53:14:a2:9d:ba:a3:fa:0a:c9:52:fc:50:33:2a:d5:b5:25:39: + 5a:b4:e4:8a:2e:b8:c5:5f:f7:ac:2b:b0:ec:fe:cf:a5:23:58: + 6c:18:2c:68:2d:56:c5:16:2d:8a:0a:c1:2d:aa:cd:33:15:1c: + 80:e3:af:91:30:f6:f4:ce:28:57:4c:32:b8:09:ac:29:b7:07: + 47:1d:7d:bd:4a:5a:5d:97:0b:4b:c8:22:bc:f9:35:29:72:58: + 0f:f6:34:a3 -----BEGIN CERTIFICATE----- -MIIE8zCCA9ugAwIBAgIUJDCiWcGgZ8tMWPdp4AsVI/+jjhkwDQYJKoZIhvcNAQEL +MIIE8zCCA9ugAwIBAgIUKCzT6CI5+R2+kBxemVm7WdcOJd4wDQYJKoZIhvcNAQEL BQAwgZoxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxFTATBgNVBAsMDFJFTEFUSVZF X1VSSTEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBp -bmZvQHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVow +bmZvQHdvbGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFow gZoxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxFTATBgNVBAsMDFJFTEFUSVZFX1VS STEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv @@ -80,12 +80,12 @@ pIGdMIGaMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEVMBMGA1UECgwMd29sZlNTTF8yMDQ4MRUwEwYDVQQLDAxSRUxBVElW RV9VUkkxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQ -aW5mb0B3b2xmc3NsLmNvbYIUJDCiWcGgZ8tMWPdp4AsVI/+jjhkwCQYDVR0TBAIw +aW5mb0B3b2xmc3NsLmNvbYIUKCzT6CI5+R2+kBxemVm7WdcOJd4wCQYDVR0TBAIw ADAgBgNVHREEGTAXhhUuLi9yZWxhdGl2ZS9wYWdlLmh0bWwwDQYJKoZIhvcNAQEL -BQADggEBAC2411Llc0I2iqmX7V/aSyhAkvqzBRNn4didk37TA9AhbVDbWm9A3gb2 -/29niWFt6D0+f0epEPRAz3Qb510cLuNfodZ6xByYLlWKtZkqL96CMx/gNbDm6YlH -mncDu5ajbCEC6ixqqLw697lmU1U2mKYgKMD475F7K9ypXG6xg74npXya0qeoMaPz -DY0hz9MoQHyDGKGX+rJ+VMv9M9YoF0fBbIrDTfOcM9/tX7pLbILcexeUzBKo7ZJk -XWo3nhJldloidmEAWSJMKuJ7qEhFcBN99UWQcJs6Tt/Vp6RydJ/jyjJPy/jii+vO -NXXc3qFN0j5qqZZ3JgDUpRnkREHUDho= +BQADggEBAJpvaWxKqBrHQgSu2NPQsM6u1mhc5pE3OdhsZEMR/anqSkfovGzcErlw +lBKoXiEa6aL6z8IZRyJdbJ5Oo2odf3WPpwZWL8Ks1i5WkO9TAXBfouBtKHmruyRA +zWJuGLVdM2rQHITGj4J3HXuFyWDbQbJu0ko+7et2YlmCkyEctY/WnsJc2KPKzy8W +oAMtfNk87BtVV9oiSWfGndqaGifYH+rldFMUop26o/oKyVL8UDMq1bUlOVq05Iou +uMVf96wrsOz+z6UjWGwYLGgtVsUWLYoKwS2qzTMVHIDjr5Ew9vTOKFdMMrgJrCm3 +B0cdfb1KWl2XC0vIIrz5NSlyWA/2NKM= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-uri-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-uri-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/client-uri-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/client-uri-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 31:01:44:60:7d:f5:1c:e0:55:a6:4f:c9:fd:9a:11:8b:31:40:77:3b + 7a:65:40:12:3e:1c:49:57:0a:f7:c6:7d:63:b7:25:6a:d7:cb:83:38 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = URI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -38,34 +38,34 @@ X509v3 Authority Key Identifier: keyid:33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_2048/OU=URI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:31:01:44:60:7D:F5:1C:E0:55:A6:4F:C9:FD:9A:11:8B:31:40:77:3B + serial:7A:65:40:12:3E:1C:49:57:0A:F7:C6:7D:63:B7:25:6A:D7:CB:83:38 X509v3 Basic Constraints: CA:FALSE X509v3 Subject Alternative Name: URI:https://www.wolfssl.com Signature Algorithm: sha256WithRSAEncryption - 1c:c6:a7:c5:f4:80:8b:30:5e:17:44:27:82:4b:bb:6a:37:ba: - e2:89:6a:f6:b2:30:b3:9b:4a:77:b0:c7:4c:a6:7d:e3:51:48: - 00:88:60:f0:50:8a:a0:48:ac:0d:14:05:e9:c3:98:d2:84:a9: - de:39:4e:dc:48:85:32:96:99:52:75:9e:5c:d9:c8:6a:b7:da: - f0:e9:a3:86:95:1c:17:70:23:40:88:e8:1e:79:96:92:98:5c: - d6:b0:83:6e:61:9c:5a:c1:72:f9:2a:12:a2:8c:b1:f8:39:dd: - 56:9a:1b:c9:57:4f:83:8f:48:77:c5:f9:31:5f:7c:05:b0:f3: - a9:08:e1:de:c9:8c:bb:e8:3b:12:ee:29:a9:21:97:0b:d0:d9: - 75:d4:b5:5b:9f:1a:c6:44:de:e4:64:d0:de:9b:c6:08:08:33: - ab:c1:a5:3d:7d:fd:b9:f2:0f:6e:96:e1:7f:d3:c0:c6:47:67: - 71:b2:00:87:eb:e3:6b:a6:2f:95:5d:5d:3e:3f:0f:fc:ad:68: - a9:19:43:6b:45:dc:e3:d1:53:53:3b:25:aa:af:af:c2:95:c4: - 4a:19:29:56:bc:20:51:92:bd:93:d4:f9:bc:14:07:42:a7:9f: - 9d:fa:68:ae:a9:76:f3:64:98:5f:04:ef:2b:b1:fe:d0:cb:e4: - 2f:04:f0:62 + 5d:a4:3a:35:ae:40:5b:fb:1e:7b:09:41:32:4b:0b:0e:88:6e: + 77:04:87:6c:dd:f6:bb:48:f0:38:25:d1:62:e8:fc:b8:b9:32: + ad:bf:2d:66:92:8e:fb:62:2b:f2:f9:64:8f:c0:48:93:1b:d5: + a5:34:10:da:09:27:a3:c0:67:80:4e:b6:69:0a:56:8d:63:12: + 90:21:8b:a1:74:a0:5e:60:a3:3e:b5:4b:bf:12:a4:9f:37:ad: + 4e:1f:08:fa:3c:b0:ab:64:ba:78:70:da:4a:b8:5a:0b:8f:ca: + 19:3d:7d:0e:c6:20:d7:7d:99:19:26:26:d5:fd:dd:df:30:69: + 89:ff:4d:0c:94:6c:11:2e:ff:6d:71:42:b3:76:5a:c3:f4:a4: + 17:83:d0:1a:85:58:12:04:9b:77:39:f3:34:0b:75:bd:1f:98: + 96:6c:b9:6a:9f:e7:49:ed:ca:5d:09:f9:3a:62:82:57:f3:ba: + 5d:73:b6:da:c3:bd:7c:31:9e:e4:92:41:6c:8b:64:4f:cd:bd: + 9d:02:73:29:53:2d:e0:2b:83:36:3d:c5:a2:34:43:c0:7a:03: + 1b:74:e3:75:02:84:ef:92:bf:e8:a5:43:53:04:0c:ea:bb:ba: + 3a:e1:28:b6:c8:15:dd:5a:bb:ae:b0:47:81:5b:09:c2:47:5b: + f8:7a:87:bc -----BEGIN CERTIFICATE----- -MIIE2jCCA8KgAwIBAgIUMQFEYH31HOBVpk/J/ZoRizFAdzswDQYJKoZIhvcNAQEL +MIIE2jCCA8KgAwIBAgIUemVAEj4cSVcK98Z9Y7clatfLgzgwDQYJKoZIhvcNAQEL BQAwgZExCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMXzIwNDgxDDAKBgNVBAsMA1VSSTEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz -c2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZExCzAJBgNV +c2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZExCzAJBgNV BAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRUwEwYD VQQKDAx3b2xmU1NMXzIwNDgxDDAKBgNVBAsMA1VSSTEYMBYGA1UEAwwPd3d3Lndv bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -79,12 +79,12 @@ gckwgcaAFDPYRWbXaIcYflQNcCeRxybXhWXAoYGXpIGUMIGRMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEVMBMGA1UECgwM d29sZlNTTF8yMDQ4MQwwCgYDVQQLDANVUkkxGDAWBgNVBAMMD3d3dy53b2xmc3Ns -LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUMQFEYH31HOBV -pk/J/ZoRizFAdzswCQYDVR0TBAIwADAiBgNVHREEGzAZhhdodHRwczovL3d3dy53 -b2xmc3NsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHManxfSAizBeF0Qngku7aje6 -4olq9rIws5tKd7DHTKZ941FIAIhg8FCKoEisDRQF6cOY0oSp3jlO3EiFMpaZUnWe -XNnIarfa8OmjhpUcF3AjQIjoHnmWkphc1rCDbmGcWsFy+SoSooyx+DndVpobyVdP -g49Id8X5MV98BbDzqQjh3smMu+g7Eu4pqSGXC9DZddS1W58axkTe5GTQ3pvGCAgz -q8GlPX39ufIPbpbhf9PAxkdncbIAh+vja6YvlV1dPj8P/K1oqRlDa0Xc49FTUzsl -qq+vwpXEShkpVrwgUZK9k9T5vBQHQqefnfporql282SYXwTvK7H+0MvkLwTwYg== +LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUemVAEj4cSVcK +98Z9Y7clatfLgzgwCQYDVR0TBAIwADAiBgNVHREEGzAZhhdodHRwczovL3d3dy53 +b2xmc3NsLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAXaQ6Na5AW/seewlBMksLDohu +dwSHbN32u0jwOCXRYuj8uLkyrb8tZpKO+2Ir8vlkj8BIkxvVpTQQ2gkno8BngE62 +aQpWjWMSkCGLoXSgXmCjPrVLvxKknzetTh8I+jywq2S6eHDaSrhaC4/KGT19DsYg +132ZGSYm1f3d3zBpif9NDJRsES7/bXFCs3Zaw/SkF4PQGoVYEgSbdznzNAt1vR+Y +lmy5ap/nSe3KXQn5OmKCV/O6XXO22sO9fDGe5JJBbItkT829nQJzKVMt4CuDNj3F +ojRDwHoDG3TjdQKE75K/6KVDUwQM6ru6OuEotsgV3Vq7rrBHgVsJwkdb+HqHvA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN X509 CRL----- -MIIBYDCCAQUCAQEwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +MIIBXjCCAQUCAQEwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0y -MDA2MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBQTtXlZ -MrO7tEezNA6AwIMeqoLIWzALBgNVHRQEBAICIAQwCgYIKoZIzj0EAwIDSQAwRgIh -AI0Fl7b1oh6x96i14akYhMMcVHPi7VdLh7fXSf9bMoeqAiEAzxqdobdrD2e53V5b -0o4HUOCgRB1dzH1m+LcRe+LPUnI= +MzA5MjcxMjEwMDlaFw0yNjA2MjMxMjEwMDlaoDAwLjAfBgNVHSMEGDAWgBSXHWDD +hyJZm2AfhLSZHIhNv9oebjALBgNVHRQEBAICIAQwCgYIKoZIzj0EAwIDRwAwRAIg +C6Wlwom5faQm2pTYRBI2DVTdy7DYv1QYsi/y6ZDhPAQCIEfioB8LqiTO0gjSzUVN +KPkEXx3y4Ih3HHcrTwWOVuGv -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,13 +2,13 @@ MIICHDCCAQQCAQEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVTMRMwEQYD VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRl -cm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIw -MDYxNjE5MTc1OFoXDTIzMDMxMzE5MTc1OFqgMDAuMB8GA1UdIwQYMBaAFIMc8ZiF -7G4GRTTeUcC6tytnMmZNMAsGA1UdFAQEAgIgADANBgkqhkiG9w0BAQsFAAOCAQEA -VQ6Am+DuDpBbUs2yEIe0MDwgVZacmOwEB6wZM/c62qW+tGitjUnj1UD6wNQZwYpP -OGNYOdbiIskilSC97WJgXW4dJVrRHiV8nAzzi/8tZO96oUbLx1hmfx1/hCxqtm50 -bbYUuS25qoiVFKYkx1tocY+ESLfam09T8ZP3m5m38h5YTe+s6dmHdonEM+JlNEdT -itvZtSfUU29xCQIXVSWFJHsRGjqdvCpndtY1Kmb8aYdB60zpk2JgOGljg2uF7Iq0 -lquWWfhDl77r0qdlRYHTQ+0FetU4gCZ+ZVGH07+FD/p+GxPh4P0D3i2gFq2Z/0en -396xKNy+NiBbFw/CUFbLDw== +cm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIz +MDkyNzEyMTAwOVoXDTI2MDYyMzEyMTAwOVqgMDAuMB8GA1UdIwQYMBaAFO9p4PfV +HeaZ7Nxt0PfiuVxkcYM1MAsGA1UdFAQEAgIgADANBgkqhkiG9w0BAQsFAAOCAQEA +S39FIBb1dxg1cLXT/tg/G5AO96rcOYWz31KoZee1ATTDmgG/Wfl5eZyzqIrj6yNB +r0itqwEK4rcJRz5CGRPCa81M3VRcQncj908boEuVsaiWzobWYz1TYTFUvnlQpRO3 +Z124+mBucZ+VxiClZqcCfR/0I8tJFMYDltwWtap8VYeIV6qhqKw7EWTPhwG+me18 +jyhclPaq6sHiUBanecQODzrlXsLGgC64E9h0zbFc7xQXrnLWRurfuLA4vY2xoyyj +xwTcdSLDL4rlqA2dVEx/FrbA1SBjgUrJy4XJthsFIu4M2fiY81cWKQmEC/2q7qPK +NrGG8b24EkPvFXepUtleJQ== -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int2-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int2-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int2-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int2-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,8 +3,8 @@ DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJbnRlcm1l ZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcN -MjAwNjE2MTkxNzU4WhcNMjMwMzEzMTkxNzU4WqAwMC4wHwYDVR0jBBgwFoAUG/S9 -kCh0ZOMzXotkp/yvuvK5VeUwCwYDVR0UBAQCAiAFMAoGCCqGSM49BAMCA0kAMEYC -IQDBYNHurBS8JV1DkJLVaVXD5lrvjdCA13poIGJxVvx0NwIhALJQRBbMvQCLZ4ci -sE1dD+cpe4NdK/x2iH4QJ8XJX8uc +MjMwOTI3MTIxMDA5WhcNMjYwNjIzMTIxMDA5WqAwMC4wHwYDVR0jBBgwFoAUn657 +enCABFUrxrcMW3nkEkFlMSkwCwYDVR0UBAQCAiAFMAoGCCqGSM49BAMCA0kAMEYC +IQCIZv1TFoij0ezl8/TaA4wq4cNRnYZaKf+W4ROnAfghZwIhALog+BqrxkhP0C3C +LEWWD4Q7rOIZdNfK8ABwrg+vWneJ -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/ca-int2.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/ca-int2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,12 +3,12 @@ VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNTTCBJbnRl cm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0y -MDA2MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBR6ix1O -o0DIzlhfjfz/Rix1QdkDXjALBgNVHRQEBAICIAEwDQYJKoZIhvcNAQELBQADggEB -AJeG0+IjjS5Rf2gAJu/ldHzCwMJccTKt17mHjyQhQnzOQN8Df+zAUDWIVF99d0vO -cQFx5SYWpFYkT6kSRYHdYmZp8s6Yl0oQJ+isQ1wsFnkF2z+I/g1f/uDX9LWnKxnj -UE2UttU6fKGQl2F8SDnloDsQjjGnxssyGVeNCTBGjkCHHH9QSpZv5xjTN7INYCso -3GkWnXwGkghwleXGtgMwW2IMsNVMIFJlHQQzk9P6gqTtvhkCNp6rjAHieU8GqBkh -1zCMDTgk2LjFaRF/OnbOk1/j+LZZxox9KUIhUF4d33+PhoUd9YegvJJfdVXAKnVc -HwoO9FjX3jBcnfvs6qPBKLc= +MzA5MjcxMjEwMDlaFw0yNjA2MjMxMjEwMDlaoDAwLjAfBgNVHSMEGDAWgBQNyWAg +Q1iB4Joh72YW3G4hJd8rRTALBgNVHRQEBAICIAEwDQYJKoZIhvcNAQELBQADggEB +AFZgStFKb9hSbaI7ysWXXDNBNPvb97aHd8A3T4HgYVf6MqlnyI2gJbe5VUYtoJTF +VTIrfM7tJQf68pGCpCbo6N8ai9xAvfU+AeWk2SHgBFRj2LRprx7tDwt0/Y6YlZ2a +PHhTqyOLEhrW0Qh6NLOJ3e0zS/GQ7Oy8muPUcBbeq+XkLK2JH6gKVrzjn7QptNDr +7zEdntQArofx1+twNrn800pdltNjV0etC1Ags5ocg10Xp1dD9NPFdLsY5cASHitP +xpek4sZiBvEB0YKOs+eY8tYtFAPRzEfz5JeZNwUL3jhLH8/4d0mioVSH1+k0xkBz +MRdmZc1yQaIQe6U0tgzw9SM= -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/caEcc384Crl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEcc384Crl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/caEcc384Crl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEcc384Crl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,9 +2,9 @@ MIIBcTCB+AIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZTU0wx FDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIyMTIxNjIxMTc1MFoX -DTI1MDkxMTIxMTc1MFqgLzAtMB8GA1UdIwQYMBaAFKvgwyZMGNRyu9KEjJwKBZKA -ElNSMAoGA1UdFAQDAgEKMAoGCCqGSM49BAMCA2gAMGUCMCbmiewu7ikmrUaNHKUE -6oqf9mULJeeG7FfVnGXZll7gTCM3R4nThSrxLle4e8IIMgIxAIccPNJG5N7KK4lQ -DjHWMuKNQUJ2B5w+S5OCX99KhhoBBH+SzQgd+3XcQTpVZ2kKNw== +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTI0MDEwOTAwMzQzMFoX +DTI2MTAwNTAwMzQzMFqgLzAtMB8GA1UdIwQYMBaAFKvgwyZMGNRyu9KEjJwKBZKA +ElNSMAoGA1UdFAQDAgEMMAoGCCqGSM49BAMCA2gAMGUCMQCjqo2bmsEzvBpsVBfA +7CXvvAoldG0sFKW75EvAUOFZYWC92/GDULxTxzOGqg81B5ICMEeFr+vl+RMQZfju +ZY3eOC5PKW4z1LwneOUyoKu2joHBENLhsD+tSixSHumx+kmh2g== -----END X509 CRL----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/caEccCrl.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEccCrl.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/caEccCrl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEccCrl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/caEccCrl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/caEccCrl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN X509 CRL----- -MIIBUTCB+AIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +MIIBUDCB+AIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZTU0wx FDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIyMTIxNjIxMTc1MFoX -DTI1MDkxMTIxMTc1MFqgLzAtMB8GA1UdIwQYMBaAFFaOmsPwQt4YuUVVbvmTz+rD -86UhMAoGA1UdFAQDAgEJMAoGCCqGSM49BAMCA0gAMEUCIGhDySSru33cJYxzkQsE -TRiRigzyNzpor3a3t5VzqmY8AiEA8WCuamxgE0S+Pas7uuUJPzXlq7JAwmCVwP+h -nH1nWYM= +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTI0MDEwOTAwMzQzMFoX +DTI2MTAwNTAwMzQzMFqgLzAtMB8GA1UdIwQYMBaAFFaOmsPwQt4YuUVVbvmTz+rD +86UhMAoGA1UdFAQDAgELMAoGCCqGSM49BAMCA0cAMEQCIFuy1ACI/xzHowxHb4+6 +Ey9EPuLVgbvwLmVVSnDiwEkAAiB8BrOHHUMxK0ZFMZoAdRBgE/p32q9FdJJfAO0n +VnFcxg== -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/cliCrl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/cliCrl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/cliCrl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/cliCrl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,41 +2,41 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT CRL extensions: X509v3 CRL Number: - 6 + 8 Revoked Certificates: Serial Number: 02 - Revocation Date: Dec 16 21:17:50 2022 GMT + Revocation Date: Jan 9 00:34:30 2024 GMT Signature Algorithm: sha256WithRSAEncryption - bf:d3:f7:5b:70:94:5a:11:50:b2:7d:7b:f9:c8:0f:aa:1b:82: - f9:24:5f:79:a6:ab:9d:71:53:83:a2:29:93:a4:91:9d:70:0e: - b7:b7:e2:67:b8:ee:1c:fb:81:be:f7:e6:a7:d7:c0:df:5d:d3: - 4b:df:50:1c:08:c3:95:20:bd:6c:0e:f8:c9:70:66:cd:42:19: - d8:a5:75:bf:cc:b4:fb:f4:fc:85:58:06:95:07:fd:a5:c2:a8: - ac:a3:e9:eb:0c:99:98:f8:62:a8:59:22:d5:72:71:05:8a:ca: - 6a:5a:96:c1:a3:29:b2:ea:78:30:1d:8c:c5:17:26:b5:d4:87: - 79:c9:f6:51:2e:c9:e9:b5:f4:17:2a:8e:ba:3d:e9:8d:e0:66: - 87:7b:8f:36:8c:62:45:7a:07:2b:b2:da:02:ba:27:b9:e6:18: - d8:84:5f:4d:8f:cd:03:91:e8:53:c8:10:c8:d9:51:af:3d:e3: - 35:25:cd:3e:44:7e:fd:8f:74:46:4a:b9:03:da:41:2b:b1:4d: - 4c:39:af:14:fa:9c:4f:54:4c:4b:9f:a8:4a:b6:99:24:95:54: - 37:05:ab:45:7b:7b:25:20:d1:99:b1:5e:aa:98:a0:1e:b9:b1: - a3:fe:e5:2c:f8:49:d8:94:07:05:79:b5:9b:19:0e:53:c8:b3: - ce:60:d0:bc + 52:11:97:57:04:d7:e2:14:1f:c4:7f:a2:d8:cf:4c:b7:5b:0c: + d3:ac:ca:29:10:74:09:2f:3d:fb:4d:75:3e:32:21:5a:0f:41: + 5f:cc:e7:98:f8:ea:8e:e2:c9:57:60:b6:a3:b0:70:10:18:b9: + 86:a3:65:1e:3a:88:13:df:44:18:15:51:00:f6:33:d6:ab:90: + 18:93:df:ac:7d:15:5c:6a:63:55:d1:4d:41:37:03:89:86:65: + fa:fb:d7:b1:73:db:c3:43:08:ff:89:94:89:b1:b4:ad:96:78: + 52:92:50:8c:0a:5d:ca:29:8b:e0:bc:ca:88:c0:7a:52:48:d3: + cf:09:03:08:5f:a1:b9:16:b0:55:5e:11:60:7f:73:9a:98:05: + 54:97:bf:eb:0e:04:61:4f:b4:40:23:61:9a:07:69:78:fc:16: + de:f4:54:04:cf:f0:2b:07:8d:51:9e:6b:b5:77:c4:13:2c:a3: + 40:99:ed:fa:f4:00:4a:45:36:da:52:9d:dc:88:66:3e:03:f0: + 20:ce:54:a4:56:58:a8:9e:30:78:e8:42:2d:a8:0f:9b:c4:a9: + ab:13:c2:4e:ec:be:2e:99:16:56:2f:22:86:96:27:1d:30:80: + 7d:a5:f8:45:ef:93:b4:63:13:96:4f:6a:df:a0:11:3b:52:be: + 93:03:7a:81 -----BEGIN X509 CRL----- MIICDjCB9wIBATANBgkqhkiG9w0BAQsFADCBnjELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xf MjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMjEy -MTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMBQwEgIBAhcNMjIxMjE2MjExNzUwWqAO -MAwwCgYDVR0UBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAL/T91twlFoRULJ9e/nI -D6obgvkkX3mmq51xU4OiKZOkkZ1wDre34me47hz7gb735qfXwN9d00vfUBwIw5Ug -vWwO+MlwZs1CGdildb/MtPv0/IVYBpUH/aXCqKyj6esMmZj4YqhZItVycQWKympa -lsGjKbLqeDAdjMUXJrXUh3nJ9lEuyem19Bcqjro96Y3gZod7jzaMYkV6Byuy2gK6 -J7nmGNiEX02PzQOR6FPIEMjZUa894zUlzT5Efv2PdEZKuQPaQSuxTUw5rxT6nE9U -TEufqEq2mSSVVDcFq0V7eyUg0ZmxXqqYoB65saP+5Sz4SdiUBwV5tZsZDlPIs85g -0Lw= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yNDAx +MDkwMDM0MzBaFw0yNjEwMDUwMDM0MzBaMBQwEgIBAhcNMjQwMTA5MDAzNDMwWqAO +MAwwCgYDVR0UBAMCAQgwDQYJKoZIhvcNAQELBQADggEBAFIRl1cE1+IUH8R/otjP +TLdbDNOsyikQdAkvPftNdT4yIVoPQV/M55j46o7iyVdgtqOwcBAYuYajZR46iBPf +RBgVUQD2M9arkBiT36x9FVxqY1XRTUE3A4mGZfr717Fz28NDCP+JlImxtK2WeFKS +UIwKXcopi+C8yojAelJI088JAwhfobkWsFVeEWB/c5qYBVSXv+sOBGFPtEAjYZoH +aXj8Ft70VATP8CsHjVGea7V3xBMso0CZ7fr0AEpFNtpSndyIZj4D8CDOVKRWWKie +MHjoQi2oD5vEqasTwk7svi6ZFlYvIoaWJx0wgH2l+EXvk7RjE5ZPat+gETtSvpMD +eoE= -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/client-int-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/client-int-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/client-int-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/client-int-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN X509 CRL----- -MIIBXDCCAQICAQEwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +MIIBWzCCAQICAQEwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNTTCBDbGllbnQg -Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA2 -MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBTr1EtZa5Vh -P1FXtgRNiUGIRFyr8jALBgNVHRQEBAICIAcwCgYIKoZIzj0EAwIDSAAwRQIhAJiz -His7baFwO9NAwNTMMpNJbYd1XClf1q9lOdO9S/sqAiBfh8Qy7Lri1brEaafDCxe3 -3PgVHR+m9QkJssAuOEIK2A== +Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMzA5 +MjcxMjEwMTBaFw0yNjA2MjMxMjEwMTBaoDAwLjAfBgNVHSMEGDAWgBTr1EtZa5Vh +P1FXtgRNiUGIRFyr8jALBgNVHRQEBAICIAcwCgYIKoZIzj0EAwIDRwAwRAIgN4x2 +Lb57tlFYEhVyiNJ+7vmlTSn5IgDY2aMbw5bSi+wCIA7KlbvpkAzSA+lKwUD8wmfW +r4AwiWgQOz5RfhRx1rXC -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/client-int.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/client-int.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/client-int.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/client-int.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,13 +2,13 @@ MIICGTCCAQECAQEwDQYJKoZIhvcNAQELBQAwgZwxCzAJBgNVBAYTAlVTMRMwEQYD VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29sZlNTTCBDbGll -bnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDYx -NjE5MTc1OFoXDTIzMDMxMzE5MTc1OFqgMDAuMB8GA1UdIwQYMBaAFDPYRWbXaIcY -flQNcCeRxybXhWXAMAsGA1UdFAQEAgIgAzANBgkqhkiG9w0BAQsFAAOCAQEARom6 -mppTxCF+GWAEHFbn9EJee2uCCrQ9dd4JLA1Hc4XYGHOoN54jPKZEvTTYB5XKImCg -NvbOb98l88Gpr0fUDTuAdBQZrM7Vs3IBPoOJdjMNuwQzxvQ+WdY2Jft/4CaR4/mq -oMJrmhlz1PmWNTqqfFS/GQv/NYDdCXhP4bNuWRMZoSYROyby+bqr2SgNbZ+0GA3/ -jeSCXmdngwEB7z5SoqqRscVOS7Sw1S3e6X/QNQ6rNNR6MWKH95Ra8ke9A12r+3zu -ZqbIYtbaF49tvOJsvzKQeC8J2oTzpEbRvNudJ4mXLpNEw5I/RL1sum0bJIn0wL+/ -7q1EaGe14zTsPsx06g== +bnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIzMDky +NzEyMTAwOVoXDTI2MDYyMzEyMTAwOVqgMDAuMB8GA1UdIwQYMBaAFDPYRWbXaIcY +flQNcCeRxybXhWXAMAsGA1UdFAQEAgIgAzANBgkqhkiG9w0BAQsFAAOCAQEAquOQ +8p0OUhEcAy2RKuXz9mJ+/NpBf4O3f4DmIlNjKC+Vm6dkV/wYFI63/trUZ7zOsL2A +GCDuFtXqcmWJcl6A3Fi2sUqSrwaz+J7n0fRARlvAHNIiSZX02pPYt+zzBxUUdvmp +VcFyAPs5VTbCGXQEgqPsH2bpeVtDvEqEhS4fv6GtOQ59nOiDMJqHl6iUKAD/Jw4x +M/eemrpnGS4K2JG/IBmQN8bZ/3pX+4bAymNqaj+Wz0PQxkOvr7Kv+U9M/Jr8QXPz +zPAZQfPU5caUA+DhGwPK9NNJu07seuUTi7D0qRP28p0k4rOR7AtRmi47KhP1Rxm1 +7aYL9GnvRcuHob7NtQ== -----END X509 CRL----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,40 +2,40 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT CRL extensions: X509v3 CRL Number: 2 Revoked Certificates: Serial Number: 02 - Revocation Date: Dec 16 21:17:50 2022 GMT + Revocation Date: Jan 9 00:34:30 2024 GMT Signature Algorithm: sha256WithRSAEncryption - 39:44:ff:39:f4:04:45:79:7e:73:e2:42:48:db:85:66:fd:99: - 76:94:7c:b5:79:5d:15:71:36:a9:87:f0:73:05:50:08:6b:1c: - 6e:de:96:45:31:c3:c0:ba:ba:f5:08:1d:05:4a:52:39:e9:03: - ef:59:c8:1d:4a:f2:86:05:99:7b:4b:74:f6:d3:75:8d:b2:57: - ba:ac:a7:11:14:d6:6c:71:c4:4c:1c:68:bc:49:78:f0:c9:52: - 8a:e7:8b:54:e6:20:58:20:60:66:f5:14:d8:cb:ff:e0:a0:45: - bc:b4:81:ad:1d:bc:cf:f8:8e:a8:87:24:55:99:d9:ce:47:f7: - 5b:4a:33:6d:db:bf:93:64:1a:a6:46:5f:27:dc:d8:d4:f9:c2: - 42:2a:7e:b2:7c:dd:98:77:f5:88:7d:15:25:08:bc:e0:d0:8d: - f4:c3:c3:04:41:a4:d1:b1:39:4a:6b:2c:b5:2e:9a:65:43:0d: - 0e:73:f4:06:e1:b3:49:34:94:b0:b7:ff:c0:27:c1:b5:ea:06: - f7:71:71:97:bb:bc:c7:1a:9f:eb:f6:3d:a5:7b:55:a7:bf:dd: - d7:ee:97:b8:9d:dc:cd:e3:06:db:9a:2c:60:bf:70:84:fa:6b: - 8d:70:7d:de:e8:b7:ab:b0:38:68:6c:c0:b1:e1:ba:45:e0:d7: - 12:3d:71:5b + b3:6f:ed:72:d2:73:6a:77:bf:3a:55:bc:54:18:6a:71:bc:6a: + cc:cd:5d:90:f5:64:8d:1b:f0:e0:48:7b:f2:7b:06:86:53:63: + 9b:d8:24:15:10:b1:19:96:9b:d2:75:a8:25:a2:35:a9:14:d6: + d5:5e:53:e3:34:9d:f2:8b:07:19:9b:1f:f1:02:0f:04:46:e8: + b8:b6:f2:8d:c7:c0:15:3e:3e:8e:96:73:15:1e:62:f6:4e:2a: + f7:aa:a0:91:80:12:7f:81:0c:65:cc:38:be:58:6c:14:a5:21: + a1:8d:f7:8a:b9:24:f4:2d:ca:c0:67:43:0b:c8:1c:b4:7d:12: + 7f:a2:1b:19:0e:94:cf:7b:9f:75:a0:08:9a:67:3f:87:89:3e: + f8:58:a5:8a:1b:2d:da:9b:d0:1b:18:92:c3:d2:6a:d7:1c:fc: + 45:69:77:c3:57:65:75:99:9e:47:2a:20:25:ef:90:f2:5f:3b: + 7d:9c:7d:00:ea:92:54:eb:0b:e7:17:af:24:1a:f9:7c:83:50: + 68:1d:dc:5b:60:12:a7:52:78:d9:a9:b0:1f:59:48:36:c7:a6: + 97:34:c7:87:3f:ae:fd:a9:56:5d:48:cc:89:7a:79:60:8f:9b: + 2b:63:3c:b3:04:1d:5f:f7:20:d2:fd:f2:51:b1:96:93:13:5b: + ab:74:82:8b -----BEGIN X509 CRL----- MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIyMTIxNjIxMTc1MFoX -DTI1MDkxMTIxMTc1MFowFDASAgECFw0yMjEyMTYyMTE3NTBaoA4wDDAKBgNVHRQE -AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAOUT/OfQERXl+c+JCSNuFZv2ZdpR8tXld -FXE2qYfwcwVQCGscbt6WRTHDwLq69QgdBUpSOekD71nIHUryhgWZe0t09tN1jbJX -uqynERTWbHHETBxovEl48MlSiueLVOYgWCBgZvUU2Mv/4KBFvLSBrR28z/iOqIck -VZnZzkf3W0ozbdu/k2QapkZfJ9zY1PnCQip+snzdmHf1iH0VJQi84NCN9MPDBEGk -0bE5SmsstS6aZUMNDnP0BuGzSTSUsLf/wCfBteoG93Fxl7u8xxqf6/Y9pXtVp7/d -1+6XuJ3czeMG25osYL9whPprjXB93ui3q7A4aGzAseG6ReDXEj1xWw== +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTI0MDEwOTAwMzQzMFoX +DTI2MTAwNTAwMzQzMFowFDASAgECFw0yNDAxMDkwMDM0MzBaoA4wDDAKBgNVHRQE +AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAs2/tctJzane/OlW8VBhqcbxqzM1dkPVk +jRvw4Eh78nsGhlNjm9gkFRCxGZab0nWoJaI1qRTW1V5T4zSd8osHGZsf8QIPBEbo +uLbyjcfAFT4+jpZzFR5i9k4q96qgkYASf4EMZcw4vlhsFKUhoY33irkk9C3KwGdD +C8gctH0Sf6IbGQ6Uz3ufdaAImmc/h4k++Filihst2pvQGxiSw9Jq1xz8RWl3w1dl +dZmeRyogJe+Q8l87fZx9AOqSVOsL5xevJBr5fINQaB3cW2ASp1J42amwH1lINsem +lzTHhz+u/alWXUjMiXp5YI+bK2M8swQdX/cg0v3yUbGWkxNbq3SCiw== -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl.revoked mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.revoked --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl.revoked 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl.revoked 2024-08-03 07:30:00.000000000 +0000 @@ -2,43 +2,43 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT CRL extensions: X509v3 CRL Number: 3 Revoked Certificates: Serial Number: 01 - Revocation Date: Dec 16 21:17:50 2022 GMT + Revocation Date: Jan 9 00:34:30 2024 GMT Serial Number: 02 - Revocation Date: Dec 16 21:17:50 2022 GMT + Revocation Date: Jan 9 00:34:30 2024 GMT Signature Algorithm: sha256WithRSAEncryption - 1f:6c:1c:50:42:8a:55:bc:41:f6:a9:15:b6:ad:90:53:0a:b8: - 73:71:8b:dd:0e:8f:95:0f:97:6d:82:24:09:6d:d5:9f:57:47: - ab:c2:10:ad:df:27:0b:6c:d4:1f:c2:d5:4b:56:4b:44:01:3e: - 5f:d3:08:6c:da:5b:94:40:00:47:e2:c9:f5:93:3d:c6:b0:28: - b6:48:ff:32:9e:7b:d9:2d:71:5c:c4:53:13:50:8d:c7:e8:d0: - 6f:28:ee:71:a0:8a:3e:da:9a:c4:e1:ad:a7:36:ce:87:ff:1f: - 32:f1:32:ca:ff:81:d9:b8:d1:ca:39:7f:08:90:77:da:45:23: - 56:49:ad:08:99:ef:75:23:5f:92:9a:b4:34:ef:5c:b1:68:71: - 0d:06:31:28:5e:b1:34:56:a3:d6:47:8a:ba:2b:e2:be:28:29: - d0:6a:12:60:5e:5c:93:7d:0d:54:bf:ee:72:7f:31:e6:9a:ab: - 56:fc:34:45:06:e9:bd:fc:39:1d:37:91:77:d2:da:96:01:a0: - 0d:9f:cf:b6:26:98:6b:fb:d9:ef:51:1d:df:41:6c:3c:61:5c: - 38:83:e4:71:51:1d:62:57:53:8b:0b:0a:b1:ac:df:5c:22:26: - b6:67:51:62:06:5b:97:ed:94:f4:40:7e:48:4e:3b:fd:b7:75: - 40:17:ec:48 + 35:50:96:da:71:71:90:d5:b7:37:5a:a6:b9:09:07:2f:af:c9: + e0:02:32:6a:43:6e:20:ec:20:a4:ac:d0:39:a9:19:35:d0:d2: + 6f:bb:d1:cd:46:10:a7:cb:8a:be:0a:02:a2:91:f5:29:74:ee: + 34:83:a3:8c:a0:ca:39:af:94:4a:23:d7:56:57:6b:cc:c6:eb: + b0:ce:9f:0a:e1:b0:a8:12:6b:6a:8b:21:73:22:6f:49:41:cd: + fd:85:44:d1:fa:52:6b:2f:b2:2b:02:e7:43:0e:f1:92:bc:15: + 8f:22:28:49:25:69:93:d8:50:10:2f:93:e2:f5:b0:31:5c:eb: + 1a:35:e2:40:83:25:87:55:4d:c0:85:06:37:9e:23:44:80:a1: + f9:e2:eb:9c:90:28:7a:71:d8:55:a2:8b:70:32:31:33:26:70: + fe:1d:11:d5:4b:c1:04:47:19:59:44:8f:0b:0a:ec:d6:62:40: + 8a:6f:67:2e:6a:50:38:54:35:c9:f8:d5:ec:e8:ae:93:88:3d: + a0:40:81:2c:e0:fe:f7:c8:68:24:8e:41:04:88:af:94:82:97: + 75:e5:69:4c:22:1d:f9:67:53:a3:4c:a3:db:bf:55:08:e7:3a: + 07:67:a2:28:25:63:af:f8:0e:c7:d3:c1:77:ef:20:20:20:63: + 9e:5c:22:81 -----BEGIN X509 CRL----- MIICGTCCAQECAQEwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYD VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290 aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMjEyMTYyMTE3NTBa -Fw0yNTA5MTEyMTE3NTBaMCgwEgIBARcNMjIxMjE2MjExNzUwWjASAgECFw0yMjEy -MTYyMTE3NTBaoA4wDDAKBgNVHRQEAwIBAzANBgkqhkiG9w0BAQsFAAOCAQEAH2wc -UEKKVbxB9qkVtq2QUwq4c3GL3Q6PlQ+XbYIkCW3Vn1dHq8IQrd8nC2zUH8LVS1ZL -RAE+X9MIbNpblEAAR+LJ9ZM9xrAotkj/Mp572S1xXMRTE1CNx+jQbyjucaCKPtqa -xOGtpzbOh/8fMvEyyv+B2bjRyjl/CJB32kUjVkmtCJnvdSNfkpq0NO9csWhxDQYx -KF6xNFaj1keKuivivigp0GoSYF5ck30NVL/ucn8x5pqrVvw0RQbpvfw5HTeRd9La -lgGgDZ/PtiaYa/vZ71Ed30FsPGFcOIPkcVEdYldTiwsKsazfXCImtmdRYgZbl+2U -9EB+SE47/bd1QBfsSA== +MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yNDAxMDkwMDM0MzBa +Fw0yNjEwMDUwMDM0MzBaMCgwEgIBARcNMjQwMTA5MDAzNDMwWjASAgECFw0yNDAx +MDkwMDM0MzBaoA4wDDAKBgNVHRQEAwIBAzANBgkqhkiG9w0BAQsFAAOCAQEANVCW +2nFxkNW3N1qmuQkHL6/J4AIyakNuIOwgpKzQOakZNdDSb7vRzUYQp8uKvgoCopH1 +KXTuNIOjjKDKOa+USiPXVldrzMbrsM6fCuGwqBJraoshcyJvSUHN/YVE0fpSay+y +KwLnQw7xkrwVjyIoSSVpk9hQEC+T4vWwMVzrGjXiQIMlh1VNwIUGN54jRICh+eLr +nJAoenHYVaKLcDIxMyZw/h0R1UvBBEcZWUSPCwrs1mJAim9nLmpQOFQ1yfjV7Oiu +k4g9oECBLOD+98hoJI5BBIivlIKXdeVpTCId+WdTo0yj279VCOc6B2eiKCVjr/gO +x9PBd+8gICBjnlwigQ== -----END X509 CRL----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl2.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl2.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl2.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,79 +2,79 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT CRL extensions: X509v3 CRL Number: 2 Revoked Certificates: Serial Number: 02 - Revocation Date: Dec 16 21:17:50 2022 GMT + Revocation Date: Jan 9 00:34:30 2024 GMT Signature Algorithm: sha256WithRSAEncryption - 39:44:ff:39:f4:04:45:79:7e:73:e2:42:48:db:85:66:fd:99: - 76:94:7c:b5:79:5d:15:71:36:a9:87:f0:73:05:50:08:6b:1c: - 6e:de:96:45:31:c3:c0:ba:ba:f5:08:1d:05:4a:52:39:e9:03: - ef:59:c8:1d:4a:f2:86:05:99:7b:4b:74:f6:d3:75:8d:b2:57: - ba:ac:a7:11:14:d6:6c:71:c4:4c:1c:68:bc:49:78:f0:c9:52: - 8a:e7:8b:54:e6:20:58:20:60:66:f5:14:d8:cb:ff:e0:a0:45: - bc:b4:81:ad:1d:bc:cf:f8:8e:a8:87:24:55:99:d9:ce:47:f7: - 5b:4a:33:6d:db:bf:93:64:1a:a6:46:5f:27:dc:d8:d4:f9:c2: - 42:2a:7e:b2:7c:dd:98:77:f5:88:7d:15:25:08:bc:e0:d0:8d: - f4:c3:c3:04:41:a4:d1:b1:39:4a:6b:2c:b5:2e:9a:65:43:0d: - 0e:73:f4:06:e1:b3:49:34:94:b0:b7:ff:c0:27:c1:b5:ea:06: - f7:71:71:97:bb:bc:c7:1a:9f:eb:f6:3d:a5:7b:55:a7:bf:dd: - d7:ee:97:b8:9d:dc:cd:e3:06:db:9a:2c:60:bf:70:84:fa:6b: - 8d:70:7d:de:e8:b7:ab:b0:38:68:6c:c0:b1:e1:ba:45:e0:d7: - 12:3d:71:5b + b3:6f:ed:72:d2:73:6a:77:bf:3a:55:bc:54:18:6a:71:bc:6a: + cc:cd:5d:90:f5:64:8d:1b:f0:e0:48:7b:f2:7b:06:86:53:63: + 9b:d8:24:15:10:b1:19:96:9b:d2:75:a8:25:a2:35:a9:14:d6: + d5:5e:53:e3:34:9d:f2:8b:07:19:9b:1f:f1:02:0f:04:46:e8: + b8:b6:f2:8d:c7:c0:15:3e:3e:8e:96:73:15:1e:62:f6:4e:2a: + f7:aa:a0:91:80:12:7f:81:0c:65:cc:38:be:58:6c:14:a5:21: + a1:8d:f7:8a:b9:24:f4:2d:ca:c0:67:43:0b:c8:1c:b4:7d:12: + 7f:a2:1b:19:0e:94:cf:7b:9f:75:a0:08:9a:67:3f:87:89:3e: + f8:58:a5:8a:1b:2d:da:9b:d0:1b:18:92:c3:d2:6a:d7:1c:fc: + 45:69:77:c3:57:65:75:99:9e:47:2a:20:25:ef:90:f2:5f:3b: + 7d:9c:7d:00:ea:92:54:eb:0b:e7:17:af:24:1a:f9:7c:83:50: + 68:1d:dc:5b:60:12:a7:52:78:d9:a9:b0:1f:59:48:36:c7:a6: + 97:34:c7:87:3f:ae:fd:a9:56:5d:48:cc:89:7a:79:60:8f:9b: + 2b:63:3c:b3:04:1d:5f:f7:20:d2:fd:f2:51:b1:96:93:13:5b: + ab:74:82:8b -----BEGIN X509 CRL----- MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIyMTIxNjIxMTc1MFoX -DTI1MDkxMTIxMTc1MFowFDASAgECFw0yMjEyMTYyMTE3NTBaoA4wDDAKBgNVHRQE -AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAOUT/OfQERXl+c+JCSNuFZv2ZdpR8tXld -FXE2qYfwcwVQCGscbt6WRTHDwLq69QgdBUpSOekD71nIHUryhgWZe0t09tN1jbJX -uqynERTWbHHETBxovEl48MlSiueLVOYgWCBgZvUU2Mv/4KBFvLSBrR28z/iOqIck -VZnZzkf3W0ozbdu/k2QapkZfJ9zY1PnCQip+snzdmHf1iH0VJQi84NCN9MPDBEGk -0bE5SmsstS6aZUMNDnP0BuGzSTSUsLf/wCfBteoG93Fxl7u8xxqf6/Y9pXtVp7/d -1+6XuJ3czeMG25osYL9whPprjXB93ui3q7A4aGzAseG6ReDXEj1xWw== +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTI0MDEwOTAwMzQzMFoX +DTI2MTAwNTAwMzQzMFowFDASAgECFw0yNDAxMDkwMDM0MzBaoA4wDDAKBgNVHRQE +AwIBAjANBgkqhkiG9w0BAQsFAAOCAQEAs2/tctJzane/OlW8VBhqcbxqzM1dkPVk +jRvw4Eh78nsGhlNjm9gkFRCxGZab0nWoJaI1qRTW1V5T4zSd8osHGZsf8QIPBEbo +uLbyjcfAFT4+jpZzFR5i9k4q96qgkYASf4EMZcw4vlhsFKUhoY33irkk9C3KwGdD +C8gctH0Sf6IbGQ6Uz3ufdaAImmc/h4k++Filihst2pvQGxiSw9Jq1xz8RWl3w1dl +dZmeRyogJe+Q8l87fZx9AOqSVOsL5xevJBr5fINQaB3cW2ASp1J42amwH1lINsem +lzTHhz+u/alWXUjMiXp5YI+bK2M8swQdX/cg0v3yUbGWkxNbq3SCiw== -----END X509 CRL----- Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_2048, OU = Programming-2048, CN = www.wolfssl.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT CRL extensions: X509v3 CRL Number: 1 No Revoked Certificates. Signature Algorithm: sha256WithRSAEncryption - 31:07:d5:eb:5e:d7:89:0e:c1:29:ab:4b:49:0e:58:9d:f8:7e: - 27:59:48:2d:68:a5:06:e1:c9:46:f8:b8:97:bc:6d:71:f2:d9: - cd:f2:2d:2c:7b:86:6d:8e:7d:75:c8:94:33:fd:5f:67:57:74: - fe:48:3a:4a:4e:73:7b:55:b9:85:46:9a:1d:69:e6:7a:1e:d3: - 73:aa:76:34:d1:5f:be:b3:47:28:b6:e5:80:c2:c3:f0:b9:c0: - 79:58:32:0e:0a:45:9b:d7:4b:2a:e4:ea:53:ff:7d:a7:34:35: - 5e:ae:bb:6b:16:3b:cd:b3:ae:8c:d0:10:22:ae:c1:04:c6:0c: - 2c:f1:4b:d0:de:20:47:33:74:88:61:db:e4:c2:e9:cd:59:65: - ce:a0:e3:07:0d:25:df:b3:b6:ab:c6:0f:0d:07:7b:e2:c7:a5: - 9e:7c:80:6b:c4:86:0b:d8:4d:ea:f6:a8:14:b4:41:84:5d:ea: - 58:92:12:a7:6a:e2:2d:8e:35:d7:39:4c:b9:00:c5:46:0d:02: - 4d:17:0a:fb:5c:0b:80:27:e5:01:af:5f:a5:70:ab:26:13:b7: - a0:76:2e:e7:fa:c5:dc:5a:7d:50:22:0c:e6:44:1a:a6:5a:64: - e7:84:13:af:ef:2d:47:1a:db:88:9c:62:b9:23:3f:7d:3f:17: - 19:0c:bc:97 + 48:97:27:ce:47:2d:c9:e5:a9:7d:ac:6a:36:29:92:0d:bf:b7: + 17:04:cb:7b:1c:a1:ce:e8:45:6d:c8:b9:a2:81:16:74:9d:b1: + b5:06:5f:46:64:06:74:e4:6a:79:13:27:a2:ed:f4:7e:73:0b: + c4:6e:99:9a:35:a7:8b:02:69:92:6d:80:da:dd:5c:fd:05:e0: + 0e:4b:ee:5b:55:5c:a7:d0:c2:83:f3:41:62:86:f1:b3:f2:67: + 48:6b:b2:3e:3f:b2:1d:aa:63:54:3a:43:62:9a:9e:87:ef:49: + 36:dc:29:36:74:8b:7d:d7:04:b8:38:6d:55:5a:56:db:a1:72: + cf:bd:9f:cc:b4:59:f4:65:06:fb:a4:80:48:98:1c:1f:c9:b8: + c6:b2:3e:47:c5:2f:f3:f4:ca:45:97:4c:20:08:72:90:5f:c3: + e9:b8:4d:04:4b:1c:43:7d:b0:e3:34:59:9c:5f:db:ad:c3:87: + 11:3f:eb:8c:75:5f:2f:b8:84:12:c1:73:f1:ec:f8:2e:36:b9: + 5d:3e:a9:9d:70:dd:24:84:77:de:29:b8:73:39:70:6b:44:91: + cb:bf:b5:fc:b8:6f:93:75:8c:58:f4:aa:79:8f:70:24:5d:75: + 19:e7:9a:08:6a:8e:cd:8d:cc:17:d2:6f:76:d5:40:99:1c:e8: + 53:99:4e:f0 -----BEGIN X509 CRL----- MIIB+DCB4QIBATANBgkqhkiG9w0BAQsFADCBnjELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xf MjA0ODEZMBcGA1UECwwQUHJvZ3JhbW1pbmctMjA0ODEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMjEy -MTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaoA4wDDAKBgNVHRQEAwIBATANBgkqhkiG -9w0BAQsFAAOCAQEAMQfV617XiQ7BKatLSQ5Ynfh+J1lILWilBuHJRvi4l7xtcfLZ -zfItLHuGbY59dciUM/1fZ1d0/kg6Sk5ze1W5hUaaHWnmeh7Tc6p2NNFfvrNHKLbl -gMLD8LnAeVgyDgpFm9dLKuTqU/99pzQ1Xq67axY7zbOujNAQIq7BBMYMLPFL0N4g -RzN0iGHb5MLpzVllzqDjBw0l37O2q8YPDQd74selnnyAa8SGC9hN6vaoFLRBhF3q -WJISp2riLY411zlMuQDFRg0CTRcK+1wLgCflAa9fpXCrJhO3oHYu5/rF3Fp9UCIM -5kQaplpk54QTr+8tRxrbiJxiuSM/fT8XGQy8lw== +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yNDAx +MDkwMDM0MzBaFw0yNjEwMDUwMDM0MzBaoA4wDDAKBgNVHRQEAwIBATANBgkqhkiG +9w0BAQsFAAOCAQEASJcnzkctyeWpfaxqNimSDb+3FwTLexyhzuhFbci5ooEWdJ2x +tQZfRmQGdORqeRMnou30fnMLxG6ZmjWniwJpkm2A2t1c/QXgDkvuW1Vcp9DCg/NB +Yobxs/JnSGuyPj+yHapjVDpDYpqeh+9JNtwpNnSLfdcEuDhtVVpW26Fyz72fzLRZ +9GUG+6SASJgcH8m4xrI+R8Uv8/TKRZdMIAhykF/D6bhNBEscQ32w4zRZnF/brcOH +ET/rjHVfL7iEEsFz8ez4Lja5XT6pnXDdJIR33im4czlwa0SRy7+1/Lhvk3WMWPSq +eY9wJF11GeeaCGqOzY3MF9JvdtVAmRzoU5lO8A== -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl_rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl_rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/crl_rsapss.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/crl_rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,53 @@ +Certificate Revocation List (CRL): + Version 2 (0x1) + Signature Algorithm: rsassaPss + Hash Algorithm: sha256 + Mask Algorithm: mgf1 with sha256 + Salt Length: 0x20 + Trailer Field: 0xBC (default) + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT + CRL extensions: + X509v3 CRL Number: + 13 +Revoked Certificates: + Serial Number: 01 + Revocation Date: Jan 9 00:34:30 2024 GMT + Signature Algorithm: rsassaPss + Hash Algorithm: sha256 + Mask Algorithm: mgf1 with sha256 + Salt Length: 0x20 + Trailer Field: 0xBC (default) + + 68:74:81:f0:7e:55:bb:ea:38:4e:ae:d5:b2:b6:c2:6a:53:fa: + 2a:23:07:d0:b8:76:66:74:cb:ba:e7:b2:66:ac:19:1d:b5:ba: + ab:e7:de:f2:84:10:e5:df:57:ea:19:f4:2c:af:d8:61:b3:09: + 31:e4:b3:94:08:65:52:03:b4:5c:7b:d0:44:37:59:df:d3:13: + 09:f7:da:34:a1:d0:8d:e8:c7:73:05:60:15:a2:ef:a1:94:31: + 0b:a7:ee:3d:25:12:19:6a:e5:29:30:3c:97:82:ed:a5:db:f3: + 54:7f:2a:73:c2:be:0d:25:30:9b:d4:c0:77:99:db:55:dd:d2: + f7:88:d0:8b:74:66:00:65:14:d6:c6:4c:a8:de:cf:54:19:bf: + 3a:d9:6a:80:4a:85:87:f6:ec:3d:3d:01:67:54:ea:82:7f:d5: + c3:37:3b:c3:d0:82:ce:01:30:bf:30:a0:c2:04:70:ab:5b:02: + 05:2f:ca:f1:e2:49:d3:50:04:e4:f2:77:08:16:5a:45:95:6c: + c9:80:72:a7:e6:b6:97:d4:22:5d:b7:f9:3a:5e:d0:be:6a:53: + 44:35:fc:e9:45:3b:56:4a:1d:06:38:8e:5b:1b:fe:a2:0b:5b: + c2:5d:5e:99:84:7e:ba:c4:5c:b5:43:1d:a2:9b:b3:05:bd:33: + 38:8e:2c:e8 +-----BEGIN X509 CRL----- +MIICgzCCATsCAQEwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgGhGjAYBgkq +hkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASAwgbIxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRcwFQYDVQQKDA53b2xmU1NM +X1JTQVBTUzESMBAGA1UECwwJQ0EtUlNBUFNTMRgwFgYDVQQDDA93d3cud29sZnNz +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJ +k/IsZAEBDAd3b2xmU1NMFw0yNDAxMDkwMDM0MzBaFw0yNjEwMDUwMDM0MzBaMBQw +EgIBARcNMjQwMTA5MDAzNDMwWqAOMAwwCgYDVR0UBAMCAQ0wPQYJKoZIhvcNAQEK +MDCgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMC +ASADggEBAGh0gfB+VbvqOE6u1bK2wmpT+iojB9C4dmZ0y7rnsmasGR21uqvn3vKE +EOXfV+oZ9Cyv2GGzCTHks5QIZVIDtFx70EQ3Wd/TEwn32jSh0I3ox3MFYBWi76GU +MQun7j0lEhlq5SkwPJeC7aXb81R/KnPCvg0lMJvUwHeZ21Xd0veI0It0ZgBlFNbG +TKjez1QZvzrZaoBKhYf27D09AWdU6oJ/1cM3O8PQgs4BML8woMIEcKtbAgUvyvHi +SdNQBOTydwgWWkWVbMmAcqfmtpfUIl23+Tpe0L5qU0Q1/OlFO1ZKHQY4jlsb/qIL +W8JdXpmEfrrEXLVDHaKbswW9MziOLOg= +-----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/eccCliCRL.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/eccCliCRL.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/eccCliCRL.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/eccCliCRL.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,25 +2,25 @@ Version 2 (0x1) Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Oregon, L = Salem, O = Client ECC, OU = Fast, CN = www.wolfssl.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT CRL extensions: X509v3 CRL Number: - 7 + 9 Revoked Certificates: Serial Number: 02 - Revocation Date: Dec 16 21:17:50 2022 GMT + Revocation Date: Jan 9 00:34:30 2024 GMT Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:de:52:96:3d:ab:bf:56:6f:1b:a5:61:f2:43: - 38:09:61:35:be:c3:8a:7b:17:77:2c:6a:a2:94:be:db:eb:c9: - 54:02:21:00:8f:38:ad:28:29:42:e6:5c:65:73:d8:2e:2c:b1: - ba:ec:15:d9:c6:fe:48:07:bd:d9:46:1a:24:0c:0a:da:e7:8c + 30:45:02:20:3b:07:f1:6c:fb:19:62:f2:56:2a:5c:21:a3:7d: + bf:06:33:3e:b4:53:01:f3:f5:0e:e6:ca:f5:b9:26:7e:4d:ca: + 02:21:00:dd:04:d6:b1:18:01:b7:d6:ca:d9:7b:29:53:cf:9e: + ad:38:ef:fa:70:2c:41:74:ba:ce:e6:77:1f:22:86:f0:e3 -----BEGIN X509 CRL----- -MIIBPTCB4wIBATAKBggqhkjOPQQDAjCBjTELMAkGA1UEBhMCVVMxDzANBgNVBAgM +MIIBPDCB4wIBATAKBggqhkjOPQQDAjCBjTELMAkGA1UEBhMCVVMxDzANBgNVBAgM Bk9yZWdvbjEOMAwGA1UEBwwFU2FsZW0xEzARBgNVBAoMCkNsaWVudCBFQ0MxDTAL BgNVBAsMBEZhc3QxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3 -DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjEx -NzUwWjAUMBICAQIXDTIyMTIxNjIxMTc1MFqgDjAMMAoGA1UdFAQDAgEHMAoGCCqG -SM49BAMCA0kAMEYCIQDeUpY9q79WbxulYfJDOAlhNb7DinsXdyxqopS+2+vJVAIh -AI84rSgpQuZcZXPYLiyxuuwV2cb+SAe92UYaJAwK2ueM +DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMjQwMTA5MDAzNDMwWhcNMjYxMDA1MDAz +NDMwWjAUMBICAQIXDTI0MDEwOTAwMzQzMFqgDjAMMAoGA1UdFAQDAgEJMAoGCCqG +SM49BAMCA0gAMEUCIDsH8Wz7GWLyVipcIaN9vwYzPrRTAfP1DubK9bkmfk3KAiEA +3QTWsRgBt9bK2XspU8+erTjv+nAsQXS6zuZ3HyKG8OM= -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/eccSrvCRL.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/eccSrvCRL.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/eccSrvCRL.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/eccSrvCRL.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,26 +1,26 @@ Certificate Revocation List (CRL): Version 2 (0x1) Signature Algorithm: ecdsa-with-SHA256 - Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Issuer: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Last Update: Jan 9 00:34:30 2024 GMT + Next Update: Oct 5 00:34:30 2026 GMT CRL extensions: X509v3 CRL Number: - 8 + 10 Revoked Certificates: Serial Number: 02 - Revocation Date: Dec 16 21:17:50 2022 GMT + Revocation Date: Jan 9 00:34:30 2024 GMT Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:df:3b:2d:3e:14:df:73:4d:43:71:47:aa:5b: - a3:2f:19:8f:26:8c:e7:20:60:20:75:d7:4b:68:9e:d6:a9:f4: - 44:02:21:00:ec:32:6d:22:c4:bd:98:85:1b:66:9c:00:2b:5e: - c3:0f:cd:cc:54:a4:0a:2c:e9:bb:32:18:8f:27:d3:a3:d4:84 + 30:45:02:20:4e:83:3e:21:ee:69:a6:f2:7e:87:45:10:5c:60: + ad:24:49:1e:0f:9e:1f:81:03:00:43:a9:e6:1b:63:27:3f:6b: + 02:21:00:b2:7f:bd:3d:af:c4:f5:ff:82:3f:b7:6a:56:25:7c: + 07:85:54:d9:19:44:42:60:b4:8a:e3:55:f4:a4:96:c7:d1 -----BEGIN X509 CRL----- -MIIBPzCB5QIBATAKBggqhkjOPQQDAjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM -Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0aWMx -DDAKBgNVBAsMA0VDQzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI -hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEy -MTE3NTBaMBQwEgIBAhcNMjIxMjE2MjExNzUwWqAOMAwwCgYDVR0UBAMCAQgwCgYI -KoZIzj0EAwIDSQAwRgIhAN87LT4U33NNQ3FHqlujLxmPJoznIGAgdddLaJ7WqfRE -AiEA7DJtIsS9mIUbZpwAK17DD83MVKQKLOm7MhiPJ9Oj1IQ= +MIIBPzCB5gIBATAKBggqhkjOPQQDAjCBkDELMAkGA1UEBhMCVVMxEzARBgNVBAgM +Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlwdGlj +MQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbRcNMjQwMTA5MDAzNDMwWhcNMjYxMDA1 +MDAzNDMwWjAUMBICAQIXDTI0MDEwOTAwMzQzMFqgDjAMMAoGA1UdFAQDAgEKMAoG +CCqGSM49BAMCA0gAMEUCIE6DPiHuaabyfodFEFxgrSRJHg+eH4EDAEOp5htjJz9r +AiEAsn+9Pa/E9f+CP7dqViV8B4VU2RlEQmC0iuNV9KSWx9E= -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/extra-crls/ca-int-cert-revoked.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/extra-crls/ca-int-cert-revoked.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/extra-crls/ca-int-cert-revoked.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/extra-crls/ca-int-cert-revoked.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,13 @@ +-----BEGIN X509 CRL----- +MIICBTCB7gIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV +BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro +MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTI0MDEwOTAwMzQzMFoX +DTI2MTAwNTAwMzQzMFowFTATAgIQABcNMjQwMTA5MDAzNDMwWqAOMAwwCgYDVR0U +BAMCAQUwDQYJKoZIhvcNAQELBQADggEBAHeXXNQirv4s301n52RKjlA2GgYMtqKU +pNmZhFVY91LH4JUb93+iHfeBACD7ELUF0lHY6WEk26cL9JU3+2PKE/CqhmLtmtLE +hksE55zfOep+WzeQrngJTEJrsS5ptkCI38NX7uzOn1PC5bX70LdzC4v8wZpZuxCf +VVgORds34s8Hdwq5Scx2qdgip3XTPoxJYIG+iBRp1zg9DM/RIOgCtSISkB9AU2wJ +obFgLNAuhJue6swyo4rj++V6g38ojrZoknwmgZ3qIo4AwZt5o1UhVBkJbXYpbyi6 +bDlDuvJ2SNoaAcGsNjT8Opy61ti729wI/hOqUDn0WqsinFhljpRqW04= +-----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/extra-crls/general-server-crl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/extra-crls/general-server-crl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/extra-crls/general-server-crl.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/extra-crls/general-server-crl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,13 @@ +-----BEGIN X509 CRL----- +MIICBDCB7QIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMxEDAOBgNV +BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3Ro +MRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTI0MDEwOTAwMzQzMFoX +DTI2MTAwNTAwMzQzMFowFDASAgEBFw0yNDAxMDkwMDM0MzBaoA4wDDAKBgNVHRQE +AwIBBDANBgkqhkiG9w0BAQsFAAOCAQEAWFcHDGDzEVttKWzvWv88rkJhBQihzcbm +I5qlXrccNXrC+7fqHcXp2crCE0o75tnrXkcAL7YWeKcO1SkfIuyd84N73JrEECmf +MaJEVgQrGmuqyLk8p3cq+Rqomyc1KxpxIzUkX7BL6ZCMZGWvvybcA51F+zX+9cMa +jAFR7Ta9byN+TyrDDxecqhGgs/hjfTdXg2NABZjLjFZ3Eo4JO7aio6DgCygIncZX +46xDMqYnl0fOl6+GNBmRdt16O3LXNRFJyvFx/sXBmAVa3/Sfq7UoF+zyT/k0zInu +qfwBkM/hdrpfH2ZyzyDHC4/NXOv/tLZWfbakXAUWZpRx04Wyi8WKyw== +-----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/gencrls.sh mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/gencrls.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/gencrls.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/gencrls.sh 2024-08-03 07:30:00.000000000 +0000 @@ -95,17 +95,37 @@ # remove revoked so next time through the normal CA won't have server revoked cp blank.index.txt demoCA/index.txt -# caEccCrl +# revoke the general server cert echo "Step 10" -openssl ca -config ../renewcerts/wolfssl.cnf -revoke ../server-revoked-cert.pem -keyfile ../ca-ecc-key.pem -cert ../ca-ecc-cert.pem +openssl ca -config ../renewcerts/wolfssl.cnf -revoke ../server-cert.pem -keyfile ../ca-key.pem -cert ../ca-cert.pem check_result $? echo "Step 11" +openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out extra-crls/general-server-crl.pem -keyfile ../ca-key.pem -cert ../ca-cert.pem +check_result $? + +# remove revoked so next time through the normal CA won't have server revoked +cp blank.index.txt demoCA/index.txt + +echo "Step 12" +# revoke an intermediate cert +openssl ca -config ../renewcerts/wolfssl.cnf -revoke ../intermediate/ca-int-cert.pem -keyfile ../ca-key.pem -cert ../ca-cert.pem +openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out extra-crls/ca-int-cert-revoked.pem -keyfile ../ca-key.pem -cert ../ca-cert.pem + +# remove revoked so next time through the normal CA won't have server revoked +cp blank.index.txt demoCA/index.txt + +# caEccCrl +echo "Step 13" +openssl ca -config ../renewcerts/wolfssl.cnf -revoke ../server-revoked-cert.pem -keyfile ../ca-ecc-key.pem -cert ../ca-ecc-cert.pem +check_result $? + +echo "Step 14" openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out caEccCrl.pem -keyfile ../ca-ecc-key.pem -cert ../ca-ecc-cert.pem check_result $? # metadata -echo "Step 12" +echo "Step 15" openssl crl -in caEccCrl.pem -text > tmp check_result $? mv tmp caEccCrl.pem @@ -116,12 +136,12 @@ # server-revoked-cert.pem is already revoked in Step 10 #openssl ca -config ../renewcerts/wolfssl.cnf -revoke ../server-revoked-cert.pem -keyfile ../ca-ecc384-key.pem -cert ../ca-ecc384-cert.pem -echo "Step 13" +echo "Step 16" openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out caEcc384Crl.pem -keyfile ../ca-ecc384-key.pem -cert ../ca-ecc384-cert.pem check_result $? # metadata -echo "Step 14" +echo "Step 17" openssl crl -in caEcc384Crl.pem -text > tmp check_result $? mv tmp caEcc384Crl.pem @@ -129,12 +149,12 @@ #cp caEcc384Crl.pem ~/wolfssl/certs/crl/caEcc384Crl.pem # cliCrl -echo "Step 15" +echo "Step 18" openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out cliCrl.pem -keyfile ../client-key.pem -cert ../client-cert.pem check_result $? # metadata -echo "Step 16" +echo "Step 19" openssl crl -in cliCrl.pem -text > tmp check_result $? mv tmp cliCrl.pem @@ -142,12 +162,12 @@ #cp cliCrl.pem ~/wolfssl/certs/crl/cliCrl.pem # eccCliCRL -echo "Step 17" +echo "Step 20" openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out eccCliCRL.pem -keyfile ../ecc-client-key.pem -cert ../client-ecc-cert.pem check_result $? # metadata -echo "Step 18" +echo "Step 21" openssl crl -in eccCliCRL.pem -text > tmp check_result $? mv tmp eccCliCRL.pem @@ -155,12 +175,12 @@ #cp eccCliCRL.pem ~/wolfssl/certs/crl/eccCliCRL.pem # eccSrvCRL -echo "Step 19" +echo "Step 22" openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out eccSrvCRL.pem -keyfile ../ecc-key.pem -cert ../server-ecc.pem check_result $? # metadata -echo "Step 20" +echo "Step 23" openssl crl -in eccSrvCRL.pem -text > tmp check_result $? mv tmp eccSrvCRL.pem @@ -168,18 +188,35 @@ #cp eccSrvCRL.pem ~/wolfssl/certs/crl/eccSrvCRL.pem # caEccCrl -echo "Step 21" +echo "Step 24" openssl ca -config ./wolfssl.cnf -gencrl -crldays 1000 -out caEccCrl.pem -keyfile ../ca-ecc-key.pem -cert ../ca-ecc-cert.pem check_result $? # ca-ecc384-cert -echo "Step 22" +echo "Step 25" openssl ca -config ./wolfssl.cnf -gencrl -crldays 1000 -out caEcc384Crl.pem -keyfile ../ca-ecc384-key.pem -cert ../ca-ecc384-cert.pem check_result $? # create crl and crl2 der files for unit test -echo "Step 23" +echo "Step 26" openssl crl -in crl.pem -inform PEM -out crl.der -outform DER openssl crl -in crl2.pem -inform PEM -out crl2.der -outform DER +# clear state for RSA-PSS revoke +cp blank.index.txt demoCA/index.txt + +echo "Step 27 RSA-PSS revoke" +openssl ca -config ../renewcerts/wolfssl.cnf -revoke ../rsapss/server-rsapss.pem -keyfile ../rsapss/ca-rsapss-priv.pem -cert ../rsapss/ca-rsapss.pem +check_result $? + +echo "Step 28 RSA-PSS" +openssl ca -config ../renewcerts/wolfssl.cnf -gencrl -crldays 1000 -out crl_rsapss.pem -keyfile ../rsapss/ca-rsapss-priv.pem -cert ../rsapss/ca-rsapss.pem +check_result $? + +# metadata +echo "Step 29" +openssl crl -in crl_rsapss.pem -text > tmp +check_result $? +mv tmp crl_rsapss.pem + exit 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -3,29 +3,33 @@ # EXTRA_DIST += \ - certs/crl/hash_pem/0fdb2da4.r0 \ - certs/crl/hash_der/0fdb2da4.r0 \ - certs/crl/crl.pem \ - certs/crl/cliCrl.pem \ - certs/crl/eccSrvCRL.pem \ - certs/crl/eccCliCRL.pem \ - certs/crl/crl2.pem \ - certs/crl/caEccCrl.pem \ - certs/crl/caEcc384Crl.pem \ - certs/crl/wolfssl.cnf \ - certs/crl/crl.der \ - certs/crl/crl2.der + certs/crl/hash_pem/0fdb2da4.r0 \ + certs/crl/hash_der/0fdb2da4.r0 \ + certs/crl/crl.pem \ + certs/crl/cliCrl.pem \ + certs/crl/eccSrvCRL.pem \ + certs/crl/eccCliCRL.pem \ + certs/crl/crl2.pem \ + certs/crl/caEccCrl.der \ + certs/crl/caEccCrl.pem \ + certs/crl/caEcc384Crl.pem \ + certs/crl/wolfssl.cnf \ + certs/crl/crl.der \ + certs/crl/crl2.der \ + certs/crl/crl_rsapss.pem EXTRA_DIST += \ - certs/crl/crl.revoked + certs/crl/crl.revoked \ + certs/crl/extra-crls/ca-int-cert-revoked.pem \ + certs/crl/extra-crls/general-server-crl.pem # Intermediate cert CRL's EXTRA_DIST += \ - certs/crl/ca-int.pem \ - certs/crl/ca-int2.pem \ - certs/crl/client-int.pem \ - certs/crl/server-int.pem \ - certs/crl/ca-int-ecc.pem \ - certs/crl/ca-int2-ecc.pem \ - certs/crl/client-int-ecc.pem \ - certs/crl/server-int-ecc.pem + certs/crl/ca-int.pem \ + certs/crl/ca-int2.pem \ + certs/crl/client-int.pem \ + certs/crl/server-int.pem \ + certs/crl/ca-int-ecc.pem \ + certs/crl/ca-int2-ecc.pem \ + certs/crl/client-int-ecc.pem \ + certs/crl/server-int-ecc.pem diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodaltCrl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodaltCrl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodaltCrl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodaltCrl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,37 +2,37 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Dec 13 22:19:29 2023 GMT + Next Update: Sep 8 22:19:29 2026 GMT CRL extensions: X509v3 CRL Number: 1 No Revoked Certificates. Signature Algorithm: sha256WithRSAEncryption - 22:05:56:57:ea:16:40:fa:18:c2:cd:2d:b8:64:8f:3a:e5:39: - a4:43:d2:14:39:78:b7:c7:c3:81:78:4c:b5:b1:c2:b0:e7:b3: - 6c:5a:e3:f7:e3:a1:78:0e:e9:3d:02:18:96:e3:f0:99:74:17: - d7:c6:b9:76:fb:08:31:90:1c:13:f2:51:aa:6d:3e:f6:ac:05: - 68:72:b9:b6:7b:3a:c5:51:0a:81:95:4a:b3:1c:3b:1e:75:c5: - 46:29:14:36:91:14:50:00:65:17:ae:c0:10:37:cf:27:5b:95: - ae:8e:b7:21:1f:b1:66:f1:e9:6d:a1:32:ea:14:86:df:74:3b: - 99:97:17:a9:f8:65:fb:e5:15:9b:a3:05:17:44:06:aa:15:10: - 83:47:78:0d:fd:ec:76:d4:af:2a:5f:b2:17:01:13:ca:c8:7f: - ce:4d:ba:6c:ef:e8:4a:b7:ce:4a:d1:e4:35:6e:3e:d8:0f:2a: - d0:94:b4:a7:cb:e5:50:bc:2a:9c:1b:39:a8:6e:8a:99:b6:b8: - 1e:4e:59:ad:fe:2e:db:22:79:8a:37:ed:b0:c5:6b:ce:e6:55: - 6a:eb:11:e6:34:ad:c0:ca:7b:1c:b0:15:ef:1c:fa:6c:36:2b: - 3f:b6:f1:e2:04:90:48:36:a4:ef:26:2e:83:3e:00:4b:c7:78: - c7:72:98:d1 + 30:f4:19:0d:3b:23:d8:e3:b9:55:f5:aa:91:6d:20:a3:71:7d: + a2:c8:2e:92:18:17:fb:73:5c:52:f0:44:32:67:87:43:82:93: + 94:53:62:c3:32:c6:6e:4a:93:a6:99:44:f7:95:b0:24:98:95: + 8a:e9:62:6b:30:18:46:b4:00:1c:f1:75:e5:87:dc:5c:c3:b3: + 35:2b:3a:8a:2a:a6:99:73:88:e5:07:d8:cb:ec:d9:ba:06:69: + 1c:2f:38:37:44:e2:b4:d5:e1:f6:38:56:b3:45:ff:66:7a:da: + 00:0c:d4:4c:d3:2f:90:e8:4a:c2:0a:1f:4a:6b:1a:87:57:a9: + 31:f9:78:2b:1f:8c:9c:ed:ef:08:d1:15:49:8d:fa:8d:57:80: + 36:b4:42:1f:58:62:80:9f:2f:66:cc:b3:4c:64:18:9e:8e:9d: + b7:cb:a3:7c:47:67:bf:ec:68:a7:10:f6:68:b0:a8:7a:d4:a5: + eb:77:6a:0c:de:3a:16:6b:9c:87:6c:aa:5b:e1:e2:03:d9:ac: + 33:3a:51:56:de:b1:61:c2:01:70:2b:96:e1:b4:0f:08:a2:f4: + 49:79:51:eb:1c:56:a9:9e:a4:f7:f9:6a:69:2a:d7:d7:77:45: + 7a:97:12:bb:d6:6b:6e:07:aa:05:87:b5:6f:b7:b2:1f:e6:84: + 33:87:16:14 -----BEGIN X509 CRL----- MIIB3DCBxQIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMRgwFgYDVQQDDA93d3cubm9tYXRjaC5jb20xHzAdBgkqhkiG9w0BCQEWEGlu -Zm9Ad29sZnNzbC5jb20XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFqgDjAM -MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAiBVZX6hZA+hjCzS24ZI86 -5TmkQ9IUOXi3x8OBeEy1scKw57NsWuP346F4Duk9AhiW4/CZdBfXxrl2+wgxkBwT -8lGqbT72rAVocrm2ezrFUQqBlUqzHDsedcVGKRQ2kRRQAGUXrsAQN88nW5Wujrch -H7Fm8eltoTLqFIbfdDuZlxep+GX75RWbowUXRAaqFRCDR3gN/ex21K8qX7IXARPK -yH/OTbps7+hKt85K0eQ1bj7YDyrQlLSny+VQvCqcGzmoboqZtrgeTlmt/i7bInmK -N+2wxWvO5lVq6xHmNK3AynscsBXvHPpsNis/tvHiBJBINqTvJi6DPgBLx3jHcpjR +Zm9Ad29sZnNzbC5jb20XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVqgDjAM +MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAw9BkNOyPY47lV9aqRbSCj +cX2iyC6SGBf7c1xS8EQyZ4dDgpOUU2LDMsZuSpOmmUT3lbAkmJWK6WJrMBhGtAAc +8XXlh9xcw7M1KzqKKqaZc4jlB9jL7Nm6BmkcLzg3ROK01eH2OFazRf9metoADNRM +0y+Q6ErCCh9KaxqHV6kx+XgrH4yc7e8I0RVJjfqNV4A2tEIfWGKAny9mzLNMZBie +jp23y6N8R2e/7GinEPZosKh61KXrd2oM3joWa5yHbKpb4eID2awzOlFW3rFhwgFw +K5bhtA8IovRJeVHrHFapnqT3+WppKtfXd0V6lxK71mtuB6oFh7Vvt7If5oQzhxYU -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodaltwildCrl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodaltwildCrl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodaltwildCrl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodaltwildCrl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,37 +2,37 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Dec 13 22:19:29 2023 GMT + Next Update: Sep 8 22:19:29 2026 GMT CRL extensions: X509v3 CRL Number: 1 No Revoked Certificates. Signature Algorithm: sha256WithRSAEncryption - 22:05:56:57:ea:16:40:fa:18:c2:cd:2d:b8:64:8f:3a:e5:39: - a4:43:d2:14:39:78:b7:c7:c3:81:78:4c:b5:b1:c2:b0:e7:b3: - 6c:5a:e3:f7:e3:a1:78:0e:e9:3d:02:18:96:e3:f0:99:74:17: - d7:c6:b9:76:fb:08:31:90:1c:13:f2:51:aa:6d:3e:f6:ac:05: - 68:72:b9:b6:7b:3a:c5:51:0a:81:95:4a:b3:1c:3b:1e:75:c5: - 46:29:14:36:91:14:50:00:65:17:ae:c0:10:37:cf:27:5b:95: - ae:8e:b7:21:1f:b1:66:f1:e9:6d:a1:32:ea:14:86:df:74:3b: - 99:97:17:a9:f8:65:fb:e5:15:9b:a3:05:17:44:06:aa:15:10: - 83:47:78:0d:fd:ec:76:d4:af:2a:5f:b2:17:01:13:ca:c8:7f: - ce:4d:ba:6c:ef:e8:4a:b7:ce:4a:d1:e4:35:6e:3e:d8:0f:2a: - d0:94:b4:a7:cb:e5:50:bc:2a:9c:1b:39:a8:6e:8a:99:b6:b8: - 1e:4e:59:ad:fe:2e:db:22:79:8a:37:ed:b0:c5:6b:ce:e6:55: - 6a:eb:11:e6:34:ad:c0:ca:7b:1c:b0:15:ef:1c:fa:6c:36:2b: - 3f:b6:f1:e2:04:90:48:36:a4:ef:26:2e:83:3e:00:4b:c7:78: - c7:72:98:d1 + 30:f4:19:0d:3b:23:d8:e3:b9:55:f5:aa:91:6d:20:a3:71:7d: + a2:c8:2e:92:18:17:fb:73:5c:52:f0:44:32:67:87:43:82:93: + 94:53:62:c3:32:c6:6e:4a:93:a6:99:44:f7:95:b0:24:98:95: + 8a:e9:62:6b:30:18:46:b4:00:1c:f1:75:e5:87:dc:5c:c3:b3: + 35:2b:3a:8a:2a:a6:99:73:88:e5:07:d8:cb:ec:d9:ba:06:69: + 1c:2f:38:37:44:e2:b4:d5:e1:f6:38:56:b3:45:ff:66:7a:da: + 00:0c:d4:4c:d3:2f:90:e8:4a:c2:0a:1f:4a:6b:1a:87:57:a9: + 31:f9:78:2b:1f:8c:9c:ed:ef:08:d1:15:49:8d:fa:8d:57:80: + 36:b4:42:1f:58:62:80:9f:2f:66:cc:b3:4c:64:18:9e:8e:9d: + b7:cb:a3:7c:47:67:bf:ec:68:a7:10:f6:68:b0:a8:7a:d4:a5: + eb:77:6a:0c:de:3a:16:6b:9c:87:6c:aa:5b:e1:e2:03:d9:ac: + 33:3a:51:56:de:b1:61:c2:01:70:2b:96:e1:b4:0f:08:a2:f4: + 49:79:51:eb:1c:56:a9:9e:a4:f7:f9:6a:69:2a:d7:d7:77:45: + 7a:97:12:bb:d6:6b:6e:07:aa:05:87:b5:6f:b7:b2:1f:e6:84: + 33:87:16:14 -----BEGIN X509 CRL----- MIIB3DCBxQIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCVVMxEDAOBgNV BAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMRgwFgYDVQQDDA93d3cubm9tYXRjaC5jb20xHzAdBgkqhkiG9w0BCQEWEGlu -Zm9Ad29sZnNzbC5jb20XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFqgDjAM -MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAiBVZX6hZA+hjCzS24ZI86 -5TmkQ9IUOXi3x8OBeEy1scKw57NsWuP346F4Duk9AhiW4/CZdBfXxrl2+wgxkBwT -8lGqbT72rAVocrm2ezrFUQqBlUqzHDsedcVGKRQ2kRRQAGUXrsAQN88nW5Wujrch -H7Fm8eltoTLqFIbfdDuZlxep+GX75RWbowUXRAaqFRCDR3gN/ex21K8qX7IXARPK -yH/OTbps7+hKt85K0eQ1bj7YDyrQlLSny+VQvCqcGzmoboqZtrgeTlmt/i7bInmK -N+2wxWvO5lVq6xHmNK3AynscsBXvHPpsNis/tvHiBJBINqTvJi6DPgBLx3jHcpjR +Zm9Ad29sZnNzbC5jb20XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVqgDjAM +MAoGA1UdFAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAw9BkNOyPY47lV9aqRbSCj +cX2iyC6SGBf7c1xS8EQyZ4dDgpOUU2LDMsZuSpOmmUT3lbAkmJWK6WJrMBhGtAAc +8XXlh9xcw7M1KzqKKqaZc4jlB9jL7Nm6BmkcLzg3ROK01eH2OFazRf9metoADNRM +0y+Q6ErCCh9KaxqHV6kx+XgrH4yc7e8I0RVJjfqNV4A2tEIfWGKAny9mzLNMZBie +jp23y6N8R2e/7GinEPZosKh61KXrd2oM3joWa5yHbKpb4eID2awzOlFW3rFhwgFw +K5bhtA8IovRJeVHrHFapnqT3+WppKtfXd0V6lxK71mtuB6oFh7Vvt7If5oQzhxYU -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodcnCrl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodcnCrl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodcnCrl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodcnCrl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,37 +2,37 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = localhost, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Dec 13 22:19:29 2023 GMT + Next Update: Sep 8 22:19:29 2026 GMT CRL extensions: X509v3 CRL Number: 1 No Revoked Certificates. Signature Algorithm: sha256WithRSAEncryption - 31:51:b7:05:e8:10:b7:de:06:b6:be:93:22:ee:13:bb:f5:e6: - 8a:18:8b:34:b3:dd:e2:fd:e0:99:ff:d5:af:31:7f:42:a6:94: - 44:49:6e:57:41:45:34:46:23:5b:c6:09:a4:8a:e2:90:64:2c: - ee:e3:4b:fa:3c:a0:5b:1d:b5:b8:4f:fc:fc:41:4c:c1:bf:9a: - b9:bb:45:b4:9d:8b:4e:66:dd:16:c9:d4:4c:65:53:b3:71:df: - 9f:f6:a6:d6:50:4f:20:fa:92:d2:1b:6b:fb:7b:a1:1c:7c:d8: - f4:ee:5c:66:9a:b4:99:3b:ca:aa:84:b6:10:8a:96:cf:34:17: - 54:1f:49:d1:25:74:34:ad:1d:05:89:62:48:2f:37:b0:38:72: - 2e:5e:d7:b5:ae:d9:b5:d3:06:71:da:b7:f3:97:c2:d6:25:b2: - 86:c3:3d:da:ff:98:06:76:68:a9:34:44:53:85:3e:c1:f8:d1: - d3:f0:c8:5d:53:ec:47:7b:df:e1:bc:f1:f4:af:74:81:e4:87: - d3:94:94:5e:15:13:25:33:76:00:78:f2:95:65:fd:7c:23:1f: - 94:ae:15:1d:fd:48:c8:43:55:db:ea:31:bd:52:e4:b7:90:ab: - 5c:c3:93:c7:d0:23:52:eb:46:90:b3:a0:48:a7:90:16:93:6f: - cc:a0:fa:a3 + b7:22:47:45:ee:bb:63:91:42:29:23:33:af:eb:d7:46:41:be: + 66:89:0e:62:ff:b7:c0:9a:09:46:95:98:33:36:63:ec:2a:10: + 01:2c:a9:9d:6c:1a:45:b9:95:e8:62:3d:10:ee:65:a0:6c:8d: + aa:d0:41:6f:b1:d9:a9:59:dd:e9:40:c1:36:73:89:3a:59:02: + 42:c3:77:33:59:a0:52:18:4b:0c:64:bd:f6:10:cc:50:3f:ad: + bb:95:02:13:73:5a:95:a0:15:08:ec:dc:0f:53:3a:29:de:1b: + 3e:b4:4a:8c:3a:14:0d:48:f6:88:05:b7:55:ff:c0:e9:aa:e2: + 49:26:8e:ba:b5:88:3a:c1:5a:48:68:ed:bb:b9:ae:1e:ad:18: + 44:60:08:15:4f:ef:8e:7f:db:63:60:aa:36:9a:7b:1a:92:34: + 43:65:b8:d2:6c:85:4d:62:75:c8:5b:45:60:c2:b2:72:c6:79: + 9d:19:24:2e:bf:8f:75:24:7c:60:83:bf:98:e0:dc:98:b4:18: + ef:41:c7:10:46:89:2b:88:73:40:f4:f1:7b:17:5e:2b:fa:bd: + 28:9e:8e:b9:9a:d5:ba:a0:29:65:b8:df:27:b0:c5:51:b6:61: + 7b:69:0f:be:17:4b:14:48:73:60:14:ea:96:fd:9c:4c:62:bd: + ea:cf:b0:b1 -----BEGIN X509 CRL----- MIIB1TCBvgIBATANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzEQMA4GA1UE CAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECwwLRW5naW5lZXJp bmcxEjAQBgNVBAMMCWxvY2FsaG9zdDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm -c3NsLmNvbRcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWqAOMAwwCgYDVR0U -BAMCAQEwDQYJKoZIhvcNAQELBQADggEBADFRtwXoELfeBra+kyLuE7v15ooYizSz -3eL94Jn/1a8xf0KmlERJbldBRTRGI1vGCaSK4pBkLO7jS/o8oFsdtbhP/PxBTMG/ -mrm7RbSdi05m3RbJ1ExlU7Nx35/2ptZQTyD6ktIba/t7oRx82PTuXGaatJk7yqqE -thCKls80F1QfSdEldDStHQWJYkgvN7A4ci5e17Wu2bXTBnHat/OXwtYlsobDPdr/ -mAZ2aKk0RFOFPsH40dPwyF1T7Ed73+G88fSvdIHkh9OUlF4VEyUzdgB48pVl/Xwj -H5SuFR39SMhDVdvqMb1S5LeQq1zDk8fQI1LrRpCzoEinkBaTb8yg+qM= +c3NsLmNvbRcNMjMxMjEzMjIxOTI5WhcNMjYwOTA4MjIxOTI5WqAOMAwwCgYDVR0U +BAMCAQEwDQYJKoZIhvcNAQELBQADggEBALciR0Xuu2ORQikjM6/r10ZBvmaJDmL/ +t8CaCUaVmDM2Y+wqEAEsqZ1sGkW5lehiPRDuZaBsjarQQW+x2alZ3elAwTZziTpZ +AkLDdzNZoFIYSwxkvfYQzFA/rbuVAhNzWpWgFQjs3A9TOineGz60Sow6FA1I9ogF +t1X/wOmq4kkmjrq1iDrBWkho7bu5rh6tGERgCBVP745/22NgqjaaexqSNENluNJs +hU1idchbRWDCsnLGeZ0ZJC6/j3UkfGCDv5jg3Ji0GO9BxxBGiSuIc0D08XsXXiv6 +vSiejrma1bqgKWW43yewxVG2YXtpD74XSxRIc2AU6pb9nExiverPsLE= -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodcnwildCrl.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodcnwildCrl.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-goodcnwildCrl.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-goodcnwildCrl.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,37 +2,37 @@ Version 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = *localhost, emailAddress = info@wolfssl.com - Last Update: Dec 16 21:17:50 2022 GMT - Next Update: Sep 11 21:17:50 2025 GMT + Last Update: Dec 13 22:19:29 2023 GMT + Next Update: Sep 8 22:19:29 2026 GMT CRL extensions: X509v3 CRL Number: 1 No Revoked Certificates. Signature Algorithm: sha256WithRSAEncryption - 2e:cf:37:c3:7c:d1:e7:3a:6d:c1:46:1e:5a:0f:35:b2:74:40: - 56:a5:0a:c3:1e:a5:40:77:b6:93:91:c5:6e:44:31:26:5a:b4: - 60:2f:66:ce:65:dc:90:60:b3:cd:1c:e5:b4:0c:79:18:79:38: - f2:6c:b4:9e:98:62:f0:35:3b:f9:59:ec:0d:06:07:08:42:82: - ae:4b:e7:f2:9f:7c:71:87:02:eb:ac:ea:1e:93:22:c5:7b:80: - 1f:fe:76:ac:e1:bc:4b:b9:e8:31:28:48:3b:fe:23:1e:5b:41: - 63:1e:ba:48:13:78:80:d2:b0:30:57:9b:73:ae:4a:53:4f:2d: - 25:c8:66:cc:8d:26:64:b1:04:3f:be:31:f5:83:1d:c5:ea:cf: - ef:56:0c:62:ad:85:3b:65:9c:1b:80:ee:3f:3e:c9:5b:58:3e: - 63:98:16:c2:f4:68:62:08:a3:41:3d:4e:0e:26:2a:b2:d9:77: - e7:9f:0e:f3:af:1f:34:13:10:ec:69:f1:fb:12:ec:9a:fc:0d: - fe:58:a7:d8:1b:a0:23:70:f1:6f:71:a2:a4:8f:e2:21:f3:14: - 55:db:8d:86:92:5a:cf:56:c2:6b:48:bd:94:5d:07:0b:c1:5b: - fc:fc:c0:c5:4b:bd:74:43:f3:07:ed:0c:44:69:d1:01:79:a2: - e8:4b:a1:ed + 36:0f:c7:e0:9c:1d:71:f6:09:24:51:e8:49:5e:db:38:d5:6b: + 90:68:62:c7:5f:a0:eb:c5:c9:63:69:ca:56:30:d7:92:3d:0e: + 38:d3:34:97:35:df:16:4f:de:2f:ba:1f:38:00:9d:99:28:ea: + 11:bb:dd:ec:42:03:ec:03:d1:05:84:9e:35:d5:ad:d1:36:91: + d0:49:4d:c5:e7:50:84:77:f6:8c:c5:47:1c:f4:9c:88:87:ac: + af:81:70:3e:05:d1:33:5a:07:0c:ac:39:e2:ca:c7:3d:ea:80: + 41:4e:9c:37:dd:ac:76:b3:14:58:f9:88:20:2b:b2:f4:0f:01: + 18:73:31:88:c4:c6:66:59:d7:fc:61:44:98:c3:33:ee:74:10: + 8f:58:78:91:06:53:a3:eb:99:2e:f8:91:e7:32:e0:17:f5:ea: + b6:56:27:68:a2:2b:30:05:a8:0c:02:e8:0f:84:20:37:0e:2c: + a5:34:af:09:85:e3:85:d9:8e:78:e4:9e:75:be:27:3b:81:72: + c5:87:2c:f9:1f:73:60:ce:2c:3b:d3:95:df:a8:16:6a:da:45: + ea:ab:5c:7a:bb:8a:7a:b3:f3:34:ec:e4:7c:62:36:4f:dd:1f: + 89:86:05:ac:1e:42:11:b7:29:b3:97:f9:ad:cb:73:1f:02:8d: + 4c:80:ef:f8 -----BEGIN X509 CRL----- MIIB1jCBvwIBATANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJVUzEQMA4GA1UE CAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECwwLRW5naW5lZXJp bmcxEzARBgNVBAMMCipsb2NhbGhvc3QxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s -ZnNzbC5jb20XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFqgDjAMMAoGA1Ud -FAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IBAQAuzzfDfNHnOm3BRh5aDzWydEBWpQrD -HqVAd7aTkcVuRDEmWrRgL2bOZdyQYLPNHOW0DHkYeTjybLSemGLwNTv5WewNBgcI -QoKuS+fyn3xxhwLrrOoekyLFe4Af/nas4bxLuegxKEg7/iMeW0FjHrpIE3iA0rAw -V5tzrkpTTy0lyGbMjSZksQQ/vjH1gx3F6s/vVgxirYU7ZZwbgO4/PslbWD5jmBbC -9GhiCKNBPU4OJiqy2Xfnnw7zrx80ExDsafH7Euya/A3+WKfYG6AjcPFvcaKkj+Ih -8xRV242GklrPVsJrSL2UXQcLwVv8/MDFS710Q/MH7QxEadEBeaLoS6Ht +ZnNzbC5jb20XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVqgDjAMMAoGA1Ud +FAQDAgEBMA0GCSqGSIb3DQEBCwUAA4IBAQA2D8fgnB1x9gkkUehJXts41WuQaGLH +X6DrxcljacpWMNeSPQ440zSXNd8WT94vuh84AJ2ZKOoRu93sQgPsA9EFhJ411a3R +NpHQSU3F51CEd/aMxUcc9JyIh6yvgXA+BdEzWgcMrDniysc96oBBTpw33ax2sxRY ++YggK7L0DwEYczGIxMZmWdf8YUSYwzPudBCPWHiRBlOj65ku+JHnMuAX9eq2Vido +oiswBagMAugPhCA3DiylNK8JheOF2Y545J51vic7gXLFhyz5H3Ngziw705XfqBZq +2kXqq1x6u4p6s/M07OR8YjZP3R+JhgWsHkIRtymzl/mty3MfAo1MgO/4 -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-int-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-int-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-int-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-int-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN X509 CRL----- -MIIBXDCCAQICAQEwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +MIIBXTCCAQICAQEwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNTTCBTZXJ2ZXIg -Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMDA2 -MTYxOTE3NThaFw0yMzAzMTMxOTE3NThaoDAwLjAfBgNVHSMEGDAWgBRdXSbvrH42 -+Zt2FStKJQIj77KJMDALBgNVHRQEBAICIAYwCgYIKoZIzj0EAwIDSAAwRQIgeQwr -cMQD2CE83QHYP6QoAqN3FlxOmPC9f4QQVlpOozUCIQDTDxH4UsFLCy8QgtjtfkFC -TmVI1ubZPFDiRHGDWI2LaA== +Q2hhaW4gRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tFw0yMzA5 +MjcxMjEwMDlaFw0yNjA2MjMxMjEwMDlaoDAwLjAfBgNVHSMEGDAWgBRdXSbvrH42 ++Zt2FStKJQIj77KJMDALBgNVHRQEBAICIAYwCgYIKoZIzj0EAwIDSQAwRgIhAMfw +Zdxg+ZHfkUB2CGl10FTK07QsadcvaWfPTm9DR+HKAiEA05BIg3SELG8Y3y5cpZ7o +MoDq1dISrrjXFSoDE94DUeM= -----END X509 CRL----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-int.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-int.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/crl/server-int.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/crl/server-int.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,13 +2,13 @@ MIICGTCCAQECAQEwDQYJKoZIhvcNAQELBQAwgZwxCzAJBgNVBAYTAlVTMRMwEQYD VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xm U1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29sZlNTTCBTZXJ2 -ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIwMDYx -NjE5MTc1OFoXDTIzMDMxMzE5MTc1OFqgMDAuMB8GA1UdIwQYMBaAFLMRMsmSmITi -yfjQO24DQsofDo48MAsGA1UdFAQEAgIgAjANBgkqhkiG9w0BAQsFAAOCAQEAtEEG -Z05j/ygGi+DNPkjevKDcZlkPYRcYMQpM1RTkVyzbO6YG1i0ZoCH1MKBxB0MPS3xa -qb96jYIfpDZOUb/o2ZXOefXcirm53eJTSoa72dFoxawH74J1f/HgRT8UYISvJ+1a -L4NtAcn3lNxZWtg0gvT0pdy1zCpEsxonz4mJEaN5796qIUj1z47r/D0P9w8TFshC -9Kow+FNEjZT7A8E9EAdfePTlws8FXNcJEUbyxEJUOe6QTssXr4Ib20opQKREvhfY -5S6MsQibpO/EEv+Tg5JYeqjWOpqfO/gKBo4Xa9ImbC8N1OdCkd0ZHqvcC8IC6S00 -V0/Td56mV5BZJXG0pw== +ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20XDTIzMDky +NzEyMTAwOVoXDTI2MDYyMzEyMTAwOVqgMDAuMB8GA1UdIwQYMBaAFLMRMsmSmITi +yfjQO24DQsofDo48MAsGA1UdFAQEAgIgAjANBgkqhkiG9w0BAQsFAAOCAQEACBCr +TAzAlmfF6tnhf/P5l+tg9Jd/J3SB0vNw8Pw5yQcb0/mCkYNfdjCGGp9KqiToeS1G +uhKW5oENKY/n3CsXXBnRfhAHtwUyxrzjuc4iPF8ymgwlHGjlr/74a2CYu2iXTIIM +2P37m1p+u5FhcyH+qncgR6I6n4FeIZFSz4aXHeruTVEDliUshWC4PVpkqokk1u5/ +V2RUYTiPGyxrlpRIFtTPbnRcwItmmtPrq6YO20soDPvjtjFOgGzlP31QzVSpP7wU +O/z9Thzw0CBckJN3DZIQqGJd5GkmOw63KD0auf1FrtjuFY64OEU4+LsZwwQO6aVD +nSKMhOpc5T6VumKS8w== -----END X509 CRL----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/csr.dsa.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/csr.dsa.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dh-priv-2048.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-priv-2048.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dh-priv-2048.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-priv-2048.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dh-priv-2048.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-priv-2048.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,14 @@ +-----BEGIN PRIVATE KEY----- +MIICJgIBADCCARcGCSqGSIb3DQEDATCCAQgCggEBALChCAacCBO6WQY8vDDV9QDB +T0Sn1u9KxiUnHOjSllMKXJHdosKUhL99skSfm9LBisW+clyn55Hm1J9zB4VbZkjH +cPq07gLJPZpK2j3BRj4ZadEXRgejTZ8rlhc5bTCNKvOU03XPoHXm8pIfGnAFqgSD +VzD72naTOFDoJ/1j7jzlt8gJrm9QNY6EzkoA6RJ+WjHXM/whE3bMFjDbDPzFYqc1 +uO+3sKzANvbZyUZI+UCQACsbqmzjGsMLA54bwkbkSE4ic2/DX9Sa1jAHSNaMkKvU +9vHjSNNYS6a5zSm/aB8IS2OGL1xr1rYGZfem3ABna7vDqUGD+8f6yOIefq8AP5MC +AQIEggEEAoIBAGgTxi13nL+WV5P+7N5Pog7yPpAD+2VCLWQh7akd6hZQ2DMlHsUe +ptoAexAcst8vQOI1/Q1CX9ItJmUmLzUFNJSeYBp9kxNmNtSmgu2JUmQDF1GBsUlK +ERt4h2PuXGAaRH39V13QP7KfYnb+7k5vo6z90XaDubLq1OQIaTpM4TbLVZBKoCmx +ozuZjUQdC97adAKHQKBmpyI2AbfWM+Af43vV5uyfq4k4X+Y7k5habXFPRXcNKklk +n6OA/isuvSN6S4i2fVmAG0hguT0utQJq6oScMZmav8izdbfOdOavXILLjRf/2Qv+ ++IMa9qlwxfqcj4oZahATC2Vd9242JWUdOpQ= +-----END PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dh-pub-2048.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-pub-2048.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dh-pub-2048.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-pub-2048.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dh-pub-2048.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dh-pub-2048.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,14 @@ +-----BEGIN PUBLIC KEY----- +MIICJTCCARcGCSqGSIb3DQEDATCCAQgCggEBALChCAacCBO6WQY8vDDV9QDBT0Sn +1u9KxiUnHOjSllMKXJHdosKUhL99skSfm9LBisW+clyn55Hm1J9zB4VbZkjHcPq0 +7gLJPZpK2j3BRj4ZadEXRgejTZ8rlhc5bTCNKvOU03XPoHXm8pIfGnAFqgSDVzD7 +2naTOFDoJ/1j7jzlt8gJrm9QNY6EzkoA6RJ+WjHXM/whE3bMFjDbDPzFYqc1uO+3 +sKzANvbZyUZI+UCQACsbqmzjGsMLA54bwkbkSE4ic2/DX9Sa1jAHSNaMkKvU9vHj +SNNYS6a5zSm/aB8IS2OGL1xr1rYGZfem3ABna7vDqUGD+8f6yOIefq8AP5MCAQID +ggEGAAKCAQEAgZ77PUjCE1nV8MPEk9zpTR6k1wYrpQKy3fjMK+kbuHUEw5AaMTK9 +Gi3vpfwpg5ZaZTgTkPgakEcMwEagNDXEjzYOwxK5Ui6FVQ3VaDydVkhZppxpULu4 +H1H2WwWUFTZTZlpCmhVsDWZwzy1RoxEfBnhC78hpLYKLzyASWC1EnCC9oP/U4aI/ +D6i0bK1pXxPGFrML5jRkVpQReCkLI/aOgeTNUAcJC+USxIPSXpdPYl81zsWRgawP +bd2saVqE9DqJVSpoRY9yh1JoFqAagANNQL1x3sohEmMZq3EBbzReyawVW6Cbe5mb +LMtSN/UWqN/NwbYNcVj/GxFuoutVnS5jmw== +-----END PUBLIC KEY----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dsa2048.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dsa2048.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/dsa2048.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/dsa2048.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,20 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIDPwIBAAKCAQEAzI7JoNWaJxzaUt/HwOYGpD6KZknQWTNRacScXmSFx/Gr1dli +rP2h4BtX/5bvDJ/IRIfrXJHQRkIJUGojy4lvVelqEamoMqszDVG1eVG0q6IlEY3l +JL7Y8Z1OEm+sRFSAqbSBaE5EDrg5876DCHSixnrXan0KiFeDSNzPXm/uaAz3/wME +kKr3B5j4Z1qDI2ZHYMNDbgORrChmy/DTBcgJl7WuAV6AO51P3j6U/suCsLH8kYsd +iu7GBh83kUjS+GxdYBODp4Gsyo3QagQK6j4iThPxDbtga828XIejZytCoZ/NOVi+ +VbGThM6yEE7kw5+yU2EBKaqWyyBgQh26dUtjwQIVAOelOdRqN16VBjkHdwrroAPr +eIKbAoIBAQCa1ExxL+z6MrKAfmFKa18YdkPDabpBx6cdeQHsrzSHZ08pgKg7h/bo +oejNGxyGOPbRDEYuyODJMCbVLH/BCL/MWoKO1NRJqqL65sGd8NmWsP8MWzOOBt2d +KKnpgEE72HqUIY9W8aK0K4kcdP9+kdwfkROYr8cG0kyQor3aFrplsC1ohzxuJY2Q +x7wNqUMDyb7PhW/bB3uM+LHCSRBpY1Y3xTDS+3Ga6IIHLj6VUPNzzzRb1asCFfLM +11LFKNhBGVVvuF/xmbPH2bNx9C3fIlk1hts5yhtNNZAZazHjyMYJv3ztAbSy9W7a +Y0E85jpyLWVI9gfNkoSLHacxa9bw+9n0AoIBAGZLu7fJSJUNWqYtoX/fH2dt7VJL +FmwXxq74asRX7S+z8CpVq7rK6hfoNXzlMQ1KlfxDb5c8XGesvmd/6U6qSLOSoXZ1 +6gQ0f4czLSS2KZfjBHeTiRPbG5O4LJAaCTsm2VnzKglY3KwltKlFO6I6bGGEv2jU +6pvFKUhgFRA1LEQdtZrurMFo6Ee3QTQ5mvilIOkkxCxYP0xBMDoUbo3qrbqbQ9OY +L4PYFGfo+NVPrOA7v6dUFl5JZCZUpGtpfLqKg9kuZQqiJ++ZmQjXtZ+gAe9+F7+D +ay7dwDk4I2i0dmvlyvd87sBS4t2tWTpCBkWwx8F3BbIMMkBGqtp5dwRx33oCFQCY +7rlRNz51ExMGj5TT5ukAy2Jtmg== +-----END DSA PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/bp256r1-key.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ -----BEGIN EC PRIVATE KEY----- -MHgCAQEEIHeA8CA7RibN9lOnDIlFqqkiDdDljIJONZlivNNdarxhoAsGCSskAwMC -CAEBB6FEA0IABKdz5H0fO5rsmAqwNIjhcMk8/BhRGm80QIdyZNgT08rbM5GU2/NK -3zamlt3tjZQ5cdiROFhZjcg3vaqvBa8tTcM= +MHgCAQEEIJRV3i5+OVZxT5077AjYis31KM4viZoaS4QSxLxZB0VUoAsGCSskAwMC +CAEBB6FEA0IABFHw7OBcOIJ6V8HLTzKj0N2ifNki/neXBTeF+0FX3/uWFBl/eUhw +8Hjodp814a10sYCM+upii2nHK7tpMxca80g= -----END EC PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-bp256r1-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,22 +2,22 @@ Data: Version: 3 (0x2) Serial Number: - 57:c6:cf:ae:b4:f6:93:af:70:b4:35:16:c8:9b:c9:d8:40:6a:04:a6 + 74:41:b9:37:a8:bf:42:e7:b6:16:1c:4f:7e:8c:24:06:81:78:1a:02 Signature Algorithm: ecdsa-with-SHA256 - Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Issuer: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256BPR1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Dec 13 21:17:49 2032 GMT - Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Dec 10 22:19:28 2033 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256BPR1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: - 04:a7:73:e4:7d:1f:3b:9a:ec:98:0a:b0:34:88:e1: - 70:c9:3c:fc:18:51:1a:6f:34:40:87:72:64:d8:13: - d3:ca:db:33:91:94:db:f3:4a:df:36:a6:96:dd:ed: - 8d:94:39:71:d8:91:38:58:59:8d:c8:37:bd:aa:af: - 05:af:2d:4d:c3 + 04:51:f0:ec:e0:5c:38:82:7a:57:c1:cb:4f:32:a3: + d0:dd:a2:7c:d9:22:fe:77:97:05:37:85:fb:41:57: + df:fb:96:14:19:7f:79:48:70:f0:78:e8:76:9f:35: + e1:ad:74:b1:80:8c:fa:ea:62:8b:69:c7:2b:bb:69: + 33:17:1a:f3:48 ASN1 OID: brainpoolP256r1 X509v3 extensions: X509v3 Basic Constraints: @@ -25,33 +25,33 @@ Netscape Cert Type: SSL Client, S/MIME X509v3 Subject Key Identifier: - 44:4D:6B:E2:24:7D:33:1A:B6:CE:AB:E6:60:C8:9F:96:E6:DA:1A:67 + 77:B6:46:96:B9:B7:0D:54:A3:03:E8:21:F5:8D:37:69:3D:89:AD:FA X509v3 Authority Key Identifier: - keyid:44:4D:6B:E2:24:7D:33:1A:B6:CE:AB:E6:60:C8:9F:96:E6:DA:1A:67 + keyid:77:B6:46:96:B9:B7:0D:54:A3:03:E8:21:F5:8D:37:69:3D:89:AD:FA X509v3 Key Usage: critical Digital Signature, Non Repudiation, Key Encipherment X509v3 Extended Key Usage: TLS Web Client Authentication, E-mail Protection Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:32:85:b0:73:61:43:4c:33:24:fe:08:c3:54:73: - d9:37:33:ec:39:67:2c:ee:c7:c0:ea:99:63:45:a2:a7:65:e4: - 02:20:36:e3:0a:3b:74:ce:94:6b:8e:c0:02:a0:6e:da:27:fa: - 13:a0:bb:21:00:f1:4b:ce:3e:86:11:93:da:95:10:8c + 30:44:02:20:20:e0:c6:8e:4d:c2:50:c4:7a:a1:6c:02:63:d2: + cd:2b:30:23:01:1d:51:cd:4b:14:07:45:39:1f:16:1e:0a:3a: + 02:20:6b:a8:42:ac:90:9a:d9:8d:2c:dd:1c:bd:f1:90:d8:4d: + 7b:aa:40:f0:f3:7f:45:83:dc:b9:1c:b5:de:2e:75:a7 -----BEGIN CERTIFICATE----- -MIICyTCCAnCgAwIBAgIUV8bPrrT2k69wtDUWyJvJ2EBqBKYwCgYIKoZIzj0EAwIw -gZoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT -ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLUNM -STEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv -QHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTMyMTIxMzIxMTc0OVowgZox -CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0 -dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLUNMSTEY -MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKdz5H0fO5rsmAqw -NIjhcMk8/BhRGm80QIdyZNgT08rbM5GU2/NK3zamlt3tjZQ5cdiROFhZjcg3vaqv -Ba8tTcOjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0O -BBYEFERNa+IkfTMats6r5mDIn5bm2hpnMB8GA1UdIwQYMBaAFERNa+IkfTMats6r -5mDIn5bm2hpnMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYI -KwYBBQUHAwQwCgYIKoZIzj0EAwIDRwAwRAIgMoWwc2FDTDMk/gjDVHPZNzPsOWcs -7sfA6pljRaKnZeQCIDbjCjt0zpRrjsACoG7aJ/oToLshAPFLzj6GEZPalRCM +MIICyzCCAnKgAwIBAgIUdEG5N6i/Que2FhxPfowkBoF4GgIwCgYIKoZIzj0EAwIw +gZsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMREwDwYDVQQKDAhFbGxpcHRpYzEXMBUGA1UECwwORUNDMjU2QlBSMS1D +TEkxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5m +b0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0zMzEyMTAyMjE5MjhaMIGb +MQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2Vh +dHRsZTERMA8GA1UECgwIRWxsaXB0aWMxFzAVBgNVBAsMDkVDQzI1NkJQUjEtQ0xJ +MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A +d29sZnNzbC5jb20wWjAUBgcqhkjOPQIBBgkrJAMDAggBAQcDQgAEUfDs4Fw4gnpX +wctPMqPQ3aJ82SL+d5cFN4X7QVff+5YUGX95SHDweOh2nzXhrXSxgIz66mKLaccr +u2kzFxrzSKOBkDCBjTAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIFoDAdBgNV +HQ4EFgQUd7ZGlrm3DVSjA+gh9Y03aT2JrfowHwYDVR0jBBgwFoAUd7ZGlrm3DVSj +A+gh9Y03aT2JrfowDgYDVR0PAQH/BAQDAgXgMB0GA1UdJQQWMBQGCCsGAQUFBwMC +BggrBgEFBQcDBDAKBggqhkjOPQQDAgNHADBEAiAg4MaOTcJQxHqhbAJj0s0rMCMB +HVHNSxQHRTkfFh4KOgIga6hCrJCa2Y0s3Ry98ZDYTXuqQPDzf0WD3Lkctd4udac= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/client-secp256k1-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,22 +2,22 @@ Data: Version: 3 (0x2) Serial Number: - 02:9c:30:ec:ee:53:da:f2:24:a6:2c:bb:81:07:09:cb:30:e5:8e:94 + 0a:24:55:a0:81:ab:0b:92:b7:e5:59:50:3e:7f:8d:0b:d0:15:0a:75 Signature Algorithm: ecdsa-with-SHA256 - Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Issuer: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256K1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Dec 13 21:17:49 2032 GMT - Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Dec 10 22:19:28 2033 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256K1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: - 04:b1:4d:01:8b:58:19:36:3b:ed:bb:89:5e:d1:86: - 05:c6:6a:d4:88:44:fc:59:80:f6:16:32:9d:54:5d: - b8:af:c0:5c:24:0e:cc:ee:e8:65:45:44:7a:ee:43: - 89:49:7c:eb:db:11:ac:23:ea:e5:17:6b:59:6d:78: - 19:61:98:5f:47 + 04:be:d0:47:66:a6:6a:6c:21:b6:72:71:ce:20:67: + 61:05:b3:ef:b9:07:2c:31:6a:bb:6f:53:12:50:e9: + 06:06:64:4b:14:bb:56:61:b3:0c:3f:72:f2:45:f7: + 3b:96:39:76:57:52:93:e9:12:83:f1:d8:c5:87:11: + aa:5e:8e:a5:c9 ASN1 OID: secp256k1 X509v3 extensions: X509v3 Basic Constraints: @@ -25,33 +25,33 @@ Netscape Cert Type: SSL Client, S/MIME X509v3 Subject Key Identifier: - 55:43:F0:D0:D3:04:98:0C:EB:7C:EA:83:D3:BD:F4:81:46:31:D1:0F + 6D:9A:0A:D6:4C:C9:43:6B:12:29:C4:B0:B5:49:8A:7F:BD:42:4B:87 X509v3 Authority Key Identifier: - keyid:55:43:F0:D0:D3:04:98:0C:EB:7C:EA:83:D3:BD:F4:81:46:31:D1:0F + keyid:6D:9A:0A:D6:4C:C9:43:6B:12:29:C4:B0:B5:49:8A:7F:BD:42:4B:87 X509v3 Key Usage: critical Digital Signature, Non Repudiation, Key Encipherment X509v3 Extended Key Usage: TLS Web Client Authentication, E-mail Protection Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:20:23:dc:b7:ce:8d:09:31:e4:52:0e:89:fb:3e:59: - 92:8b:57:d7:7b:3f:6c:b8:61:fb:d7:eb:fc:87:cb:4f:b9:19: - 02:21:00:ec:67:9b:5f:41:e1:47:af:3d:ac:d0:a6:b1:d0:24: - b0:a6:a0:b7:d6:2d:5b:a2:e3:c2:6e:c1:76:08:d3:69:87 + 30:45:02:21:00:89:22:af:09:dd:58:96:9b:a2:e3:fa:2e:13: + 2c:af:69:55:b3:83:f3:4b:85:14:1a:df:28:74:5f:d9:ed:b3: + 75:02:20:18:13:45:af:82:e7:65:f8:8c:8f:b3:6d:01:25:73: + 6c:8c:c9:ff:e9:43:b8:eb:ef:df:25:9a:62:f8:d7:ac:04 -----BEGIN CERTIFICATE----- -MIICwjCCAmigAwIBAgIUApww7O5T2vIkpiy7gQcJyzDljpQwCgYIKoZIzj0EAwIw -gZgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT -ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRUwEwYDVQQLDAxFQ0MyNTZLMS1DTEkx -GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0zMjEyMTMyMTE3NDlaMIGYMQsw -CQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRs -ZTEQMA4GA1UECgwHRWxpcHRpYzEVMBMGA1UECwwMRUNDMjU2SzEtQ0xJMRgwFgYD -VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wVjAQBgcqhkjOPQIBBgUrgQQACgNCAASxTQGLWBk2O+27iV7RhgXGatSI -RPxZgPYWMp1UXbivwFwkDszu6GVFRHruQ4lJfOvbEawj6uUXa1lteBlhmF9Ho4GQ -MIGNMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgWgMB0GA1UdDgQWBBRVQ/DQ -0wSYDOt86oPTvfSBRjHRDzAfBgNVHSMEGDAWgBRVQ/DQ0wSYDOt86oPTvfSBRjHR -DzAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwME -MAoGCCqGSM49BAMCA0gAMEUCICPct86NCTHkUg6J+z5ZkotX13s/bLhh+9fr/IfL -T7kZAiEA7GebX0HhR689rNCmsdAksKagt9YtW6Ljwm7BdgjTaYc= +MIICxDCCAmqgAwIBAgIUCiRVoIGrC5K35VlQPn+NC9AVCnUwCgYIKoZIzj0EAwIw +gZkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMREwDwYDVQQKDAhFbGxpcHRpYzEVMBMGA1UECwwMRUNDMjU2SzEtQ0xJ +MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A +d29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI4WhcNMzMxMjEwMjIxOTI4WjCBmTEL +MAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0 +bGUxETAPBgNVBAoMCEVsbGlwdGljMRUwEwYDVQQLDAxFQ0MyNTZLMS1DTEkxGDAW +BgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm +c3NsLmNvbTBWMBAGByqGSM49AgEGBSuBBAAKA0IABL7QR2amamwhtnJxziBnYQWz +77kHLDFqu29TElDpBgZkSxS7VmGzDD9y8kX3O5Y5dldSk+kSg/HYxYcRql6Opcmj +gZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0OBBYEFG2a +CtZMyUNrEinEsLVJin+9QkuHMB8GA1UdIwQYMBaAFG2aCtZMyUNrEinEsLVJin+9 +QkuHMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH +AwQwCgYIKoZIzj0EAwIDSAAwRQIhAIkirwndWJabouP6LhMsr2lVs4PzS4UUGt8o +dF/Z7bN1AiAYE0Wvgudl+IyPs20BJXNsjMn/6UO46+/fJZpi+NesBA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/genecc.sh mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/genecc.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/genecc.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/genecc.sh 2024-08-03 07:30:00.000000000 +0000 @@ -32,7 +32,7 @@ # Generate ECC 256-bit server cert -openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc-key.pem -out ./certs/server-ecc-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc-key.pem -out ./certs/server-ecc-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" openssl x509 -req -in ./certs/server-ecc-req.pem -CA ./certs/ca-ecc-cert.pem -CAkey ./certs/ca-ecc-key.pem -CAcreateserial -out ./certs/server-ecc.pem -sha256 # Sign server certificate @@ -70,14 +70,14 @@ # Generate ECC 384-bit server cert if [ -f ./certs/server-ecc384-key.pem ]; then openssl req -config ./certs/ecc/wolfssl_384.cnf -sha384 -x509 -nodes -key ./certs/server-ecc384-key.pem -out ./certs/server-ecc384-req.pem \ - -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC384Srv/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" + -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC384Srv/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" else openssl ecparam -out ./certs/server-ecc384-key.par -name secp384r1 openssl req -config ./certs/ecc/wolfssl_384.cnf -sha384 -x509 -nodes -newkey ec:./certs/server-ecc384-key.par -keyout ./certs/server-ecc384-key.pem -out ./certs/server-ecc384-req.pem \ - -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC384Srv/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" + -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC384Srv/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" fi openssl req -config ./certs/ecc/wolfssl_384.cnf -sha384 -new -key ./certs/server-ecc384-key.pem -out ./certs/server-ecc384-req.pem \ - -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC384Srv/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" + -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC384Srv/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" openssl ec -in ./certs/server-ecc384-key.pem -inform PEM -out ./certs/server-ecc384-key.der -outform DER # Sign server certificate @@ -90,14 +90,14 @@ # Generate ECC 384-bit client cert if [ -f ./certs/client-ecc384-key.pem ]; then openssl req -config ./certs/ecc/wolfssl_384.cnf -sha384 -x509 -nodes -key ./certs/client-ecc384-key.pem -out ./certs/client-ecc384-req.pem \ - -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC384Cli/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" + -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC384Cli/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" else openssl ecparam -out ./certs/client-ecc384-key.par -name secp384r1 openssl req -config ./certs/ecc/wolfssl_384.cnf -sha384 -x509 -nodes -newkey ec:./certs/client-ecc384-key.par -keyout ./certs/client-ecc384-key.pem -out ./certs/client-ecc384-req.pem \ - -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC384Cli/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" + -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC384Cli/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" fi openssl req -config ./certs/ecc/wolfssl_384.cnf -sha384 -new -key ./certs/client-ecc384-key.pem -out ./certs/client-ecc384-req.pem \ - -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC384Clit/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" + -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC384Clit/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" openssl ec -in ./certs/client-ecc384-key.pem -inform PEM -out ./certs/client-ecc384-key.der -outform DER # Sign client certificate @@ -114,12 +114,12 @@ openssl ec -in ./certs/ecc/secp256k1-key.pem -inform PEM -out ./certs/ecc/secp256k1-key.der -outform DER fi # Create self-signed ECC Kerberos certificates -openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/secp256k1-key.pem -out ./certs/ecc/server-secp256k1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256K1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/secp256k1-key.pem -out ./certs/ecc/server-secp256k1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC256K1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" openssl x509 -req -in ./certs/ecc/server-secp256k1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions server_cert -signkey ./certs/ecc/secp256k1-key.pem -text -out ./certs/ecc/server-secp256k1-cert.pem openssl x509 -inform pem -in ./certs/ecc/server-secp256k1-cert.pem -outform der -out ./certs/ecc/server-secp256k1-cert.der rm ./certs/ecc/server-secp256k1-req.pem -openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/secp256k1-key.pem -out ./certs/ecc/client-secp256k1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256K1-CLI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/secp256k1-key.pem -out ./certs/ecc/client-secp256k1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC256K1-CLI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" openssl x509 -req -in ./certs/ecc/client-secp256k1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions usr_cert -signkey ./certs/ecc/secp256k1-key.pem -text -out ./certs/ecc/client-secp256k1-cert.pem openssl x509 -inform pem -in ./certs/ecc/client-secp256k1-cert.pem -outform der -out ./certs/ecc/client-secp256k1-cert.der rm ./certs/ecc/client-secp256k1-req.pem @@ -130,12 +130,12 @@ openssl ec -in ./certs/ecc/bp256r1-key.pem -inform PEM -out ./certs/ecc/bp256r1-key.der -outform DER fi # Create self-signed ECC Brainpool certificates -openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/bp256r1-key.pem -out ./certs/ecc/server-bp256r1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256BPR1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/bp256r1-key.pem -out ./certs/ecc/server-bp256r1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC256BPR1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" openssl x509 -req -in ./certs/ecc/server-bp256r1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions server_cert -signkey ./certs/ecc/bp256r1-key.pem -text -out ./certs/ecc/server-bp256r1-cert.pem openssl x509 -inform pem -in ./certs/ecc/server-bp256r1-cert.pem -outform der -out ./certs/ecc/server-bp256r1-cert.der rm ./certs/ecc/server-bp256r1-req.pem -openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/bp256r1-key.pem -out ./certs/ecc/client-bp256r1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256BPR1-CLI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/bp256r1-key.pem -out ./certs/ecc/client-bp256r1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC256BPR1-CLI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" openssl x509 -req -in ./certs/ecc/client-bp256r1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions usr_cert -signkey ./certs/ecc/bp256r1-key.pem -text -out ./certs/ecc/client-bp256r1-cert.pem openssl x509 -inform pem -in ./certs/ecc/client-bp256r1-cert.pem -outform der -out ./certs/ecc/client-bp256r1-cert.der rm ./certs/ecc/client-bp256r1-req.pem Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/secp256k1-key.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ -----BEGIN EC PRIVATE KEY----- -MHQCAQEEICTreBjyv+lbvmHMdmlhGIgC8YFT2d8aDeFXJY8gm6K0oAcGBSuBBAAK -oUQDQgAEsU0Bi1gZNjvtu4le0YYFxmrUiET8WYD2FjKdVF24r8BcJA7M7uhlRUR6 -7kOJSXzr2xGsI+rlF2tZbXgZYZhfRw== +MHQCAQEEIE+dRTV5HyFrkYXxlCq98Ojh6m+szQbktzQwSBUEs4s3oAcGBSuBBAAK +oUQDQgAEvtBHZqZqbCG2cnHOIGdhBbPvuQcsMWq7b1MSUOkGBmRLFLtWYbMMP3Ly +Rfc7ljl2V1KT6RKD8djFhxGqXo6lyQ== -----END EC PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-bp256r1-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,22 +2,22 @@ Data: Version: 3 (0x2) Serial Number: - 27:2c:3b:52:7f:63:95:4f:23:ff:51:44:ec:ae:27:ae:e5:e7:02:85 + 08:c3:a6:c3:3e:ba:4d:27:34:46:64:c6:e7:79:6c:68:25:e2:e8:d2 Signature Algorithm: ecdsa-with-SHA256 - Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Issuer: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256BPR1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Dec 13 21:17:49 2032 GMT - Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Dec 10 22:19:28 2033 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256BPR1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: - 04:a7:73:e4:7d:1f:3b:9a:ec:98:0a:b0:34:88:e1: - 70:c9:3c:fc:18:51:1a:6f:34:40:87:72:64:d8:13: - d3:ca:db:33:91:94:db:f3:4a:df:36:a6:96:dd:ed: - 8d:94:39:71:d8:91:38:58:59:8d:c8:37:bd:aa:af: - 05:af:2d:4d:c3 + 04:51:f0:ec:e0:5c:38:82:7a:57:c1:cb:4f:32:a3: + d0:dd:a2:7c:d9:22:fe:77:97:05:37:85:fb:41:57: + df:fb:96:14:19:7f:79:48:70:f0:78:e8:76:9f:35: + e1:ad:74:b1:80:8c:fa:ea:62:8b:69:c7:2b:bb:69: + 33:17:1a:f3:48 ASN1 OID: brainpoolP256r1 X509v3 extensions: X509v3 Basic Constraints: @@ -25,39 +25,39 @@ Netscape Cert Type: SSL Server X509v3 Subject Key Identifier: - 44:4D:6B:E2:24:7D:33:1A:B6:CE:AB:E6:60:C8:9F:96:E6:DA:1A:67 + 77:B6:46:96:B9:B7:0D:54:A3:03:E8:21:F5:8D:37:69:3D:89:AD:FA X509v3 Authority Key Identifier: - keyid:44:4D:6B:E2:24:7D:33:1A:B6:CE:AB:E6:60:C8:9F:96:E6:DA:1A:67 - DirName:/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256BPR1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:27:2C:3B:52:7F:63:95:4F:23:FF:51:44:EC:AE:27:AE:E5:E7:02:85 + keyid:77:B6:46:96:B9:B7:0D:54:A3:03:E8:21:F5:8D:37:69:3D:89:AD:FA + DirName:/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC256BPR1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:08:C3:A6:C3:3E:BA:4D:27:34:46:64:C6:E7:79:6C:68:25:E2:E8:D2 X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:21:00:a1:4c:75:71:fd:dc:f1:ff:9d:45:32:50:c2: - 04:84:c5:a8:af:55:a0:4c:b8:54:31:04:fb:ce:e3:00:07:28: - 81:02:20:05:10:20:8e:17:94:78:05:f8:48:27:df:26:79:c2: - 6e:18:b0:60:74:39:5c:1d:da:11:0b:62:54:f6:bf:e6:fa + 30:44:02:20:69:b5:0e:9a:17:cc:4d:5e:3b:b7:9d:ee:e8:76: + a6:c0:94:c1:1f:e3:34:3a:cb:6a:9b:09:b1:55:0d:db:3a:c0: + 02:20:5b:8d:09:46:fd:7c:73:ca:c8:18:3c:ed:1a:84:9c:c9: + 02:f4:50:3a:26:8a:eb:76:6b:82:a7:7f:95:18:ba:10 -----BEGIN CERTIFICATE----- -MIIDfjCCAySgAwIBAgIUJyw7Un9jlU8j/1FE7K4nruXnAoUwCgYIKoZIzj0EAwIw -gZoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT -ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLVNS -VjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv -QHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTMyMTIxMzIxMTc0OVowgZox -CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0 -dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLVNSVjEY -MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABKdz5H0fO5rsmAqw -NIjhcMk8/BhRGm80QIdyZNgT08rbM5GU2/NK3zamlt3tjZQ5cdiROFhZjcg3vaqv -Ba8tTcOjggFDMIIBPzAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNV -HQ4EFgQURE1r4iR9Mxq2zqvmYMiflubaGmcwgdoGA1UdIwSB0jCBz4AURE1r4iR9 -Mxq2zqvmYMiflubaGmehgaCkgZ0wgZoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApX -YXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcw -FQYDVQQLDA5FQ0MyNTZCUFIxLVNSVjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQnLDtSf2OVTyP/UUTs -rieu5ecChTAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYI -KoZIzj0EAwIDSAAwRQIhAKFMdXH93PH/nUUyUMIEhMWor1WgTLhUMQT7zuMAByiB -AiAFECCOF5R4BfhIJ98mecJuGLBgdDlcHdoRC2JU9r/m+g== +MIIDgDCCAyegAwIBAgIUCMOmwz66TSc0RmTG53lsaCXi6NIwCgYIKoZIzj0EAwIw +gZsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMREwDwYDVQQKDAhFbGxpcHRpYzEXMBUGA1UECwwORUNDMjU2QlBSMS1T +UlYxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5m +b0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0zMzEyMTAyMjE5MjhaMIGb +MQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2Vh +dHRsZTERMA8GA1UECgwIRWxsaXB0aWMxFzAVBgNVBAsMDkVDQzI1NkJQUjEtU1JW +MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A +d29sZnNzbC5jb20wWjAUBgcqhkjOPQIBBgkrJAMDAggBAQcDQgAEUfDs4Fw4gnpX +wctPMqPQ3aJ82SL+d5cFN4X7QVff+5YUGX95SHDweOh2nzXhrXSxgIz66mKLaccr +u2kzFxrzSKOCAUQwggFAMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZAMB0G +A1UdDgQWBBR3tkaWubcNVKMD6CH1jTdpPYmt+jCB2wYDVR0jBIHTMIHQgBR3tkaW +ubcNVKMD6CH1jTdpPYmt+qGBoaSBnjCBmzELMAkGA1UEBhMCVVMxEzARBgNVBAgM +Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlwdGlj +MRcwFQYDVQQLDA5FQ0MyNTZCUFIxLVNSVjEYMBYGA1UEAwwPd3d3LndvbGZzc2wu +Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQIw6bDPrpNJzRG +ZMbneWxoJeLo0jAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEw +CgYIKoZIzj0EAwIDRwAwRAIgabUOmhfMTV47t53u6HamwJTBH+M0OstqmwmxVQ3b +OsACIFuNCUb9fHPKyBg87RqEnMkC9FA6JorrdmuCp3+VGLoQ -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc/server-secp256k1-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,22 +2,22 @@ Data: Version: 3 (0x2) Serial Number: - 6f:5e:bd:82:85:40:71:f7:15:53:aa:04:43:b0:ae:7d:e7:5e:70:f3 + 2e:df:46:12:94:ee:71:51:00:dc:bb:41:41:80:ae:1a:f1:11:68:26 Signature Algorithm: ecdsa-with-SHA256 - Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Issuer: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256K1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Dec 13 21:17:49 2032 GMT - Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Dec 10 22:19:28 2033 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC256K1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: - 04:b1:4d:01:8b:58:19:36:3b:ed:bb:89:5e:d1:86: - 05:c6:6a:d4:88:44:fc:59:80:f6:16:32:9d:54:5d: - b8:af:c0:5c:24:0e:cc:ee:e8:65:45:44:7a:ee:43: - 89:49:7c:eb:db:11:ac:23:ea:e5:17:6b:59:6d:78: - 19:61:98:5f:47 + 04:be:d0:47:66:a6:6a:6c:21:b6:72:71:ce:20:67: + 61:05:b3:ef:b9:07:2c:31:6a:bb:6f:53:12:50:e9: + 06:06:64:4b:14:bb:56:61:b3:0c:3f:72:f2:45:f7: + 3b:96:39:76:57:52:93:e9:12:83:f1:d8:c5:87:11: + aa:5e:8e:a5:c9 ASN1 OID: secp256k1 X509v3 extensions: X509v3 Basic Constraints: @@ -25,39 +25,39 @@ Netscape Cert Type: SSL Server X509v3 Subject Key Identifier: - 55:43:F0:D0:D3:04:98:0C:EB:7C:EA:83:D3:BD:F4:81:46:31:D1:0F + 6D:9A:0A:D6:4C:C9:43:6B:12:29:C4:B0:B5:49:8A:7F:BD:42:4B:87 X509v3 Authority Key Identifier: - keyid:55:43:F0:D0:D3:04:98:0C:EB:7C:EA:83:D3:BD:F4:81:46:31:D1:0F - DirName:/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256K1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:6F:5E:BD:82:85:40:71:F7:15:53:AA:04:43:B0:AE:7D:E7:5E:70:F3 + keyid:6D:9A:0A:D6:4C:C9:43:6B:12:29:C4:B0:B5:49:8A:7F:BD:42:4B:87 + DirName:/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC256K1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:2E:DF:46:12:94:EE:71:51:00:DC:BB:41:41:80:AE:1A:F1:11:68:26 X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:21:00:e2:fb:1e:0b:92:fd:b1:10:4e:bd:dc:2c:5c: - d1:23:59:12:4c:b0:f3:5d:4a:fc:69:ad:b9:3b:c8:06:17:11: - 63:02:20:5c:63:ab:3a:67:dc:2b:08:ca:39:9f:88:43:e7:82: - d0:9c:e7:05:4e:f2:b6:f2:ce:e0:8c:3d:b6:c6:8f:81:8a + 30:44:02:20:58:e1:97:fe:81:7a:54:8d:d1:46:41:fd:1a:cf: + 1d:c1:d8:f5:cb:00:21:df:66:21:09:eb:ce:a2:cb:db:d0:63: + 02:20:3a:2b:e8:46:e3:1c:c3:23:e8:ee:8c:f9:22:57:30:d5: + 8a:9b:6d:f3:a7:fb:e5:09:aa:38:ba:9a:84:e6:37:7b -----BEGIN CERTIFICATE----- -MIIDdDCCAxqgAwIBAgIUb169goVAcfcVU6oEQ7CufedecPMwCgYIKoZIzj0EAwIw -gZgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT -ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRUwEwYDVQQLDAxFQ0MyNTZLMS1TUlYx -GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0zMjEyMTMyMTE3NDlaMIGYMQsw -CQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRs -ZTEQMA4GA1UECgwHRWxpcHRpYzEVMBMGA1UECwwMRUNDMjU2SzEtU1JWMRgwFgYD -VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wVjAQBgcqhkjOPQIBBgUrgQQACgNCAASxTQGLWBk2O+27iV7RhgXGatSI -RPxZgPYWMp1UXbivwFwkDszu6GVFRHruQ4lJfOvbEawj6uUXa1lteBlhmF9Ho4IB -QTCCAT0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBkAwHQYDVR0OBBYEFFVD -8NDTBJgM63zqg9O99IFGMdEPMIHYBgNVHSMEgdAwgc2AFFVD8NDTBJgM63zqg9O9 -9IFGMdEPoYGepIGbMIGYMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv -bjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4GA1UECgwHRWxpcHRpYzEVMBMGA1UECwwM -RUNDMjU2SzEtU1JWMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG -9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFG9evYKFQHH3FVOqBEOwrn3nXnDzMA4G -A1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgNI -ADBFAiEA4vseC5L9sRBOvdwsXNEjWRJMsPNdSvxprbk7yAYXEWMCIFxjqzpn3CsI -yjmfiEPngtCc5wVO8rbyzuCMPbbGj4GK +MIIDdjCCAx2gAwIBAgIULt9GEpTucVEA3LtBQYCuGvERaCYwCgYIKoZIzj0EAwIw +gZkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMREwDwYDVQQKDAhFbGxpcHRpYzEVMBMGA1UECwwMRUNDMjU2SzEtU1JW +MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A +d29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI4WhcNMzMxMjEwMjIxOTI4WjCBmTEL +MAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0 +bGUxETAPBgNVBAoMCEVsbGlwdGljMRUwEwYDVQQLDAxFQ0MyNTZLMS1TUlYxGDAW +BgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm +c3NsLmNvbTBWMBAGByqGSM49AgEGBSuBBAAKA0IABL7QR2amamwhtnJxziBnYQWz +77kHLDFqu29TElDpBgZkSxS7VmGzDD9y8kX3O5Y5dldSk+kSg/HYxYcRql6Opcmj +ggFCMIIBPjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNVHQ4EFgQU +bZoK1kzJQ2sSKcSwtUmKf71CS4cwgdkGA1UdIwSB0TCBzoAUbZoK1kzJQ2sSKcSw +tUmKf71CS4ehgZ+kgZwwgZkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5n +dG9uMRAwDgYDVQQHDAdTZWF0dGxlMREwDwYDVQQKDAhFbGxpcHRpYzEVMBMGA1UE +CwwMRUNDMjU2SzEtU1JWMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq +hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFC7fRhKU7nFRANy7QUGArhrxEWgm +MA4GA1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATAKBggqhkjOPQQD +AgNHADBEAiBY4Zf+gXpUjdFGQf0azx3B2PXLACHfZiEJ686iy9vQYwIgOivoRuMc +wyPo7oz5Ilcw1YqbbfOn++UJqji6moTmN3s= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-params.der mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-params.der --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-params.der 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-params.der 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1 @@ +*†HÎ= \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-params.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-params.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-params.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-params.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3 @@ +-----BEGIN EC PARAMETERS----- +BggqhkjOPQMBBw== +-----END EC PARAMETERS----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-privOnlyCert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-privOnlyCert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-privOnlyCert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-privOnlyCert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIBLTCB1QIUBD5OPBXcBmt9lxsyc/06XPLiMnAwCgYIKoZIzj0EAwIwGjELMAkG -A1UECgwCV1IxCzAJBgNVBAMMAkRFMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIx -MTc0OVowGjELMAkGA1UECgwCV1IxCzAJBgNVBAMMAkRFMFkwEwYHKoZIzj0CAQYI +MIIBLTCB1QIUFZUiOVDYKhAz2ksNPuWt6EFKbLMwCgYIKoZIzj0EAwIwGjELMAkG +A1UECgwCV1IxCzAJBgNVBAMMAkRFMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIy +MTkyOFowGjELMAkGA1UECgwCV1IxCzAJBgNVBAMMAkRFMFkwEwYHKoZIzj0CAQYI KoZIzj0DAQcDQgAEJcD9Frgr8rgKHt2szmJSfFgKYH1Xddq9EcHVKupUa3bmPTb3 -3VGXa6gm/numvZZVhVCdmn5pAdhDRYnZ/korJjAKBggqhkjOPQQDAgNHADBEAiAn -jkZMFWEfhkjAX6t3n86gyxStNjBXdbLCvI+HujxOUQIgEDyGlWqlsXYk/2sU4R// -M9Ryl55mWFC6ALg6ho5N56E= +3VGXa6gm/numvZZVhVCdmn5pAdhDRYnZ/korJjAKBggqhkjOPQQDAgNHADBEAiAA +wvW2qa2RaryuYXg0+1jbMhaBHaDK3c0f+iFkfi2GdAIgGYqXzpGf+AGtTuxKM01+ +jbJnp9B4e2sXK8Ez3tKDFKw= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-privkey.der mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-privkey.der --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-privkey.der 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-privkey.der 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2 @@ +01 E¶isœl…¡8[rèèǬÄS5úl(Ü4ᨠŒ  +*†HÎ= \ No newline at end of file Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ecc-rsa-server.p12 and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ecc-rsa-server.p12 differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/ca-ed25519.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ED25519 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed25519, OU = Root-Ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = CA-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED25519 @@ -26,22 +26,22 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED25519 - 40:01:0f:0b:8d:d6:aa:dc:2c:b3:40:22:e7:78:ef:1c:8b:08: - 27:ee:d9:d7:b6:91:b3:2d:3d:ac:b9:50:fb:2f:b5:25:63:5a: - 1a:3d:3e:cd:81:a1:a9:e7:d5:a1:4a:19:b8:4c:b0:1d:3c:8a: - e3:47:c0:f6:41:95:e6:59:23:08 + e6:71:a0:59:63:b4:31:31:1f:75:06:ce:f1:89:f0:e7:a2:db: + a8:c1:e4:c8:61:38:0c:e6:e9:e7:b9:9f:ce:e2:f5:49:a3:f5: + 04:1e:85:f7:7d:10:fb:1d:ee:b6:dc:5e:51:f1:82:33:a4:ed: + e0:0a:65:09:2b:0e:1e:b2:af:0b -----BEGIN CERTIFICATE----- MIICZTCCAhegAwIBAgIBATAFBgMrZXAwgZ0xCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX0Vk MjU1MTkxFTATBgNVBAsMDFJvb3QtRWQyNTUxOTEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX2Vk MjU1MTkxEzARBgNVBAsMCkNBLWVkMjU1MTkxGDAWBgNVBAMMD3d3dy53b2xmc3Ns LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT 8ixkAQEMB3dvbGZTU0wwKjAFBgMrZXADIQBCO3r5gs/53xnd8/AyKW36/XZPaMLC 4GxHrsJVaKwNTaNjMGEwHQYDVR0OBBYEFHTVOBleg7kD+AGKNTW7iUxJtCPpMB8G A1UdIwQYMBaAFPq6W3Yd8R0dTXRI2Jg7Vu+zFPPeMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMAUGAytlcANBAEABDwuN1qrcLLNAIud47xyLCCfu2de2 -kbMtPay5UPsvtSVjWho9Ps2Boann1aFKGbhMsB08iuNHwPZBleZZIwg= +DgYDVR0PAQH/BAQDAgGGMAUGAytlcANBAOZxoFljtDExH3UGzvGJ8Oei26jB5Mhh +OAzm6ee5n87i9Umj9QQehfd9EPsd7rbcXlHxgjOk7eAKZQkrDh6yrws= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/client-ed25519.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 69:ac:b8:b4:f7:e4:11:cb:c5:63:b2:cc:2a:a8:e2:0f:55:ee:86:86 + 31:e6:4a:b1:6b:4e:2e:77:7b:d6:e3:94:8a:cf:02:b7:58:5a:fb:ab Signature Algorithm: ED25519 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = Client-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = Client-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED25519 @@ -22,7 +22,7 @@ X509v3 Authority Key Identifier: keyid:FE:41:5E:3E:81:E2:2E:46:B3:3E:47:89:90:D4:C2:B4:8E:11:D6:8A DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_ed25519/OU=Client-ed25519/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/UID=wolfSSL - serial:69:AC:B8:B4:F7:E4:11:CB:C5:63:B2:CC:2A:A8:E2:0F:55:EE:86:86 + serial:31:E6:4A:B1:6B:4E:2E:77:7B:D6:E3:94:8A:CF:02:B7:58:5A:FB:AB X509v3 Basic Constraints: CA:TRUE @@ -31,17 +31,17 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: ED25519 - 2e:4a:b8:2a:f0:75:ee:31:6a:51:0a:6a:54:5b:45:6e:ac:03: - a8:a9:9a:d4:d6:38:02:eb:76:b6:a7:66:86:ea:e9:f3:6f:31: - 4e:e4:50:d1:75:fe:88:3f:23:9d:76:d9:9c:07:14:13:16:30: - c3:40:51:06:da:a5:39:5f:0a:09 + 92:ac:52:cf:34:c2:76:8a:78:f7:ef:da:3f:79:e9:66:d1:de: + e1:d7:56:b5:4b:cf:a7:c2:03:af:cc:23:11:4b:44:0c:33:ce: + 45:e0:33:eb:cc:c9:f8:38:5b:19:6f:86:4d:97:30:d1:55:6e: + cb:5f:39:c9:a3:22:16:66:5f:07 -----BEGIN CERTIFICATE----- -MIIDnzCCA1GgAwIBAgIUaay4tPfkEcvFY7LMKqjiD1XuhoYwBQYDK2VwMIG4MQsw +MIIDnzCCA1GgAwIBAgIUMeZKsWtOLnd71uOUis8Ct1ha+6swBQYDK2VwMIG4MQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEY MBYGA1UECgwPd29sZlNTTF9lZDI1NTE5MRcwFQYDVQQLDA5DbGllbnQtZWQyNTUx OTEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv -QHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDAeFw0yMjEyMTYy -MTE3NTBaFw0yNTA5MTEyMTE3NTBaMIG4MQswCQYDVQQGEwJVUzEQMA4GA1UECAwH +QHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDAeFw0yMzEyMTMy +MjE5MjlaFw0yNjA5MDgyMjE5MjlaMIG4MQswCQYDVQQGEwJVUzEQMA4GA1UECAwH TW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEYMBYGA1UECgwPd29sZlNTTF9lZDI1 NTE5MRcwFQYDVQQLDA5DbGllbnQtZWQyNTUxOTEYMBYGA1UEAwwPd3d3LndvbGZz c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZIm @@ -51,9 +51,9 @@ MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1h bjEYMBYGA1UECgwPd29sZlNTTF9lZDI1NTE5MRcwFQYDVQQLDA5DbGllbnQtZWQy NTUxOTEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBp -bmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTIIUaay4tPfk -EcvFY7LMKqjiD1XuhoYwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxl +bmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTIIUMeZKsWtO +Lnd71uOUis8Ct1ha+6swDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxl LmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwBQYDK2Vw -A0EALkq4KvB17jFqUQpqVFtFbqwDqKma1NY4Aut2tqdmhurp828xTuRQ0XX+iD8j -nXbZnAcUExYww0BRBtqlOV8KCQ== +A0EAkqxSzzTCdop49+/aP3npZtHe4ddWtUvPp8IDr8wjEUtEDDPOReAz68zJ+Dhb +GW+GTZcw0VVuy185yaMiFmZfBw== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.der mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.der --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.der 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.der 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2 @@ +0% + ÔîrÛùXJÕ¶Øñ÷iø­:þ|(ËñÔûà—¨DuXB \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/eddsa-ed25519.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3 @@ +-----BEGIN EDDSA PRIVATE KEY----- +MCUKAQEEINTuctv5E1hK1bbY8fdp+K06/nwoy/HU++CXqI9EdVhC +-----END EDDSA PRIVATE KEY----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,9 @@ certs/ed25519/server-ed25519-key.der \ certs/ed25519/server-ed25519-key.pem \ certs/ed25519/server-ed25519-priv.der \ - certs/ed25519/server-ed25519-priv.pem + certs/ed25519/server-ed25519-priv.pem \ + certs/ed25519/eddsa-ed25519.der \ + certs/ed25519/eddsa-ed25519.pem EXTRA_DIST += \ certs/ed25519/gen-ed25519.sh \ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/root-ed25519.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 4b:b3:7e:42:e1:d1:6c:16:28:33:87:4f:4f:b8:fb:44:1f:cf:7a:18 + 46:46:59:7b:c4:b5:a1:60:04:ac:02:eb:e1:90:18:64:d9:1c:dc:bd Signature Algorithm: ED25519 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed25519, OU = Root-Ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed25519, OU = Root-Ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: ED25519 @@ -27,22 +27,22 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED25519 - 3d:94:fc:b8:6a:4a:d4:34:91:8b:84:c2:c6:ac:7b:93:60:44: - 24:e0:0e:19:79:a5:73:49:72:af:85:82:5b:1a:05:2a:69:6a: - 13:01:69:26:b6:64:99:22:b4:8e:13:ec:91:13:44:b4:14:eb: - 51:21:b1:5b:78:85:c8:c6:db:0f + ac:a3:8f:0c:8a:5d:96:a3:87:54:2f:0e:f3:9b:ce:e4:6e:33: + 84:ff:e6:79:ff:9a:3d:c6:86:12:c8:47:4e:64:ba:c1:8b:55: + 0e:cd:61:33:d3:0a:54:ce:d4:51:3e:cd:7f:6f:00:f8:5c:26: + 6d:a8:25:dc:f7:39:73:a9:92:05 -----BEGIN CERTIFICATE----- -MIICYTCCAhOgAwIBAgIUS7N+QuHRbBYoM4dPT7j7RB/PehgwBQYDK2VwMIGdMQsw +MIICYTCCAhOgAwIBAgIURkZZe8S1oWAErALr4ZAYZNkc3L0wBQYDK2VwMIGdMQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEY MBYGA1UECgwPd29sZlNTTF9FZDI1NTE5MRUwEwYDVQQLDAxSb290LUVkMjU1MTkx GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3NDlaMIGdMQsw +b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIGdMQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEY MBYGA1UECgwPd29sZlNTTF9FZDI1NTE5MRUwEwYDVQQLDAxSb290LUVkMjU1MTkx GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbTAqMAUGAytlcAMhAOmzb3xwiqvKVCBOZHY8Gk/3+l5K//PbuWQt EKUMWj/ao2MwYTAdBgNVHQ4EFgQU+rpbdh3xHR1NdEjYmDtW77MU894wHwYDVR0j BBgwFoAU+rpbdh3xHR1NdEjYmDtW77MU894wDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAYYwBQYDK2VwA0EAPZT8uGpK1DSRi4TCxqx7k2BEJOAOGXmlc0ly -r4WCWxoFKmlqEwFpJrZkmSK0jhPskRNEtBTrUSGxW3iFyMbbDw== +HQ8BAf8EBAMCAYYwBQYDK2VwA0EArKOPDIpdlqOHVC8O85vO5G4zhP/mef+aPcaG +EshHTmS6wYtVDs1hM9MKVM7UUT7Nf28A+Fwmbagl3Pc5c6mSBQ== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ED25519 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = CA-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = Server-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED25519 @@ -30,16 +30,16 @@ Netscape Cert Type: SSL Server Signature Algorithm: ED25519 - 36:3f:8d:2f:28:bd:51:83:b8:d8:9c:09:64:c4:77:fd:cd:c6: - c3:86:b0:8d:81:e3:e9:ce:7a:2a:32:15:e9:f9:6a:75:1a:a0: - 5e:71:62:72:de:46:11:a8:9d:db:80:6b:73:38:61:0c:f3:24: - 11:45:c9:a1:d3:d2:3b:05:d5:05 + 22:d7:34:ac:33:65:8b:18:a4:34:f9:3a:e6:ce:c1:77:a6:3d: + 2a:2a:ee:22:ad:6e:fc:36:fc:98:8d:8a:fd:3f:cb:a9:74:01: + 25:96:05:e1:39:13:8b:d9:05:6d:c9:ba:0e:5d:36:bf:39:03: + 57:2a:55:fc:e3:53:c3:1b:e1:0b -----BEGIN CERTIFICATE----- MIICpzCCAlmgAwIBAgIBATAFBgMrZXAwgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX2Vk MjU1MTkxEzARBgNVBAsMCkNBLWVkMjU1MTkxGDAWBgNVBAMMD3d3dy53b2xmc3Ns LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT -8ixkAQEMB3dvbGZTU0wwHhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCB +8ixkAQEMB3dvbGZTU0wwHhcNMjMxMjEzMjIxOTI5WhcNMjYwOTA4MjIxOTI5WjCB uDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xGDAWBgNVBAoMD3dvbGZTU0xfZWQyNTUxOTEXMBUGA1UECwwOU2VydmVyLWVk MjU1MTkxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQ @@ -47,7 +47,7 @@ ZXADIQAjqk1gUOAT0zrtq/apzEr+100v0lsaEAXvWkElzhtTeKOBiTCBhjAdBgNV HQ4EFgQUoymB55BvuWD4r8wVeq7XofS0hrowHwYDVR0jBBgwFoAUdNU4GV6DuQP4 AYo1NbuJTEm0I+kwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0l -BAwwCgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZAMAUGAytlcANBADY/jS8o -vVGDuNicCWTEd/3NxsOGsI2B4+nOeioyFen5anUaoF5xYnLeRhGonduAa3M4YQzz -JBFFyaHT0jsF1QU= +BAwwCgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZAMAUGAytlcANBACLXNKwz +ZYsYpDT5OubOwXemPSoq7iKtbvw2/JiNiv0/y6l0ASWWBeE5E4vZBW3Jug5dNr85 +A1cqVfzjU8Mb4Qs= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed25519/server-ed25519.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ED25519 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = CA-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = Server-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED25519 @@ -30,16 +30,16 @@ Netscape Cert Type: SSL Server Signature Algorithm: ED25519 - 36:3f:8d:2f:28:bd:51:83:b8:d8:9c:09:64:c4:77:fd:cd:c6: - c3:86:b0:8d:81:e3:e9:ce:7a:2a:32:15:e9:f9:6a:75:1a:a0: - 5e:71:62:72:de:46:11:a8:9d:db:80:6b:73:38:61:0c:f3:24: - 11:45:c9:a1:d3:d2:3b:05:d5:05 + 22:d7:34:ac:33:65:8b:18:a4:34:f9:3a:e6:ce:c1:77:a6:3d: + 2a:2a:ee:22:ad:6e:fc:36:fc:98:8d:8a:fd:3f:cb:a9:74:01: + 25:96:05:e1:39:13:8b:d9:05:6d:c9:ba:0e:5d:36:bf:39:03: + 57:2a:55:fc:e3:53:c3:1b:e1:0b -----BEGIN CERTIFICATE----- MIICpzCCAlmgAwIBAgIBATAFBgMrZXAwgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX2Vk MjU1MTkxEzARBgNVBAsMCkNBLWVkMjU1MTkxGDAWBgNVBAMMD3d3dy53b2xmc3Ns LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT -8ixkAQEMB3dvbGZTU0wwHhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCB +8ixkAQEMB3dvbGZTU0wwHhcNMjMxMjEzMjIxOTI5WhcNMjYwOTA4MjIxOTI5WjCB uDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVt YW4xGDAWBgNVBAoMD3dvbGZTU0xfZWQyNTUxOTEXMBUGA1UECwwOU2VydmVyLWVk MjU1MTkxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQ @@ -47,9 +47,9 @@ ZXADIQAjqk1gUOAT0zrtq/apzEr+100v0lsaEAXvWkElzhtTeKOBiTCBhjAdBgNV HQ4EFgQUoymB55BvuWD4r8wVeq7XofS0hrowHwYDVR0jBBgwFoAUdNU4GV6DuQP4 AYo1NbuJTEm0I+kwDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0l -BAwwCgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZAMAUGAytlcANBADY/jS8o -vVGDuNicCWTEd/3NxsOGsI2B4+nOeioyFen5anUaoF5xYnLeRhGonduAa3M4YQzz -JBFFyaHT0jsF1QU= +BAwwCgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZAMAUGAytlcANBACLXNKwz +ZYsYpDT5OubOwXemPSoq7iKtbvw2/JiNiv0/y6l0ASWWBeE5E4vZBW3Jug5dNr85 +A1cqVfzjU8Mb4Qs= -----END CERTIFICATE----- Certificate: Data: @@ -58,8 +58,8 @@ Signature Algorithm: ED25519 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed25519, OU = Root-Ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed25519, OU = CA-ed25519, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED25519 @@ -79,22 +79,22 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED25519 - 40:01:0f:0b:8d:d6:aa:dc:2c:b3:40:22:e7:78:ef:1c:8b:08: - 27:ee:d9:d7:b6:91:b3:2d:3d:ac:b9:50:fb:2f:b5:25:63:5a: - 1a:3d:3e:cd:81:a1:a9:e7:d5:a1:4a:19:b8:4c:b0:1d:3c:8a: - e3:47:c0:f6:41:95:e6:59:23:08 + e6:71:a0:59:63:b4:31:31:1f:75:06:ce:f1:89:f0:e7:a2:db: + a8:c1:e4:c8:61:38:0c:e6:e9:e7:b9:9f:ce:e2:f5:49:a3:f5: + 04:1e:85:f7:7d:10:fb:1d:ee:b6:dc:5e:51:f1:82:33:a4:ed: + e0:0a:65:09:2b:0e:1e:b2:af:0b -----BEGIN CERTIFICATE----- MIICZTCCAhegAwIBAgIBATAFBgMrZXAwgZ0xCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX0Vk MjU1MTkxFTATBgNVBAsMDFJvb3QtRWQyNTUxOTEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX2Vk MjU1MTkxEzARBgNVBAsMCkNBLWVkMjU1MTkxGDAWBgNVBAMMD3d3dy53b2xmc3Ns LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT 8ixkAQEMB3dvbGZTU0wwKjAFBgMrZXADIQBCO3r5gs/53xnd8/AyKW36/XZPaMLC 4GxHrsJVaKwNTaNjMGEwHQYDVR0OBBYEFHTVOBleg7kD+AGKNTW7iUxJtCPpMB8G A1UdIwQYMBaAFPq6W3Yd8R0dTXRI2Jg7Vu+zFPPeMA8GA1UdEwEB/wQFMAMBAf8w -DgYDVR0PAQH/BAQDAgGGMAUGAytlcANBAEABDwuN1qrcLLNAIud47xyLCCfu2de2 -kbMtPay5UPsvtSVjWho9Ps2Boann1aFKGbhMsB08iuNHwPZBleZZIwg= +DgYDVR0PAQH/BAQDAgGGMAUGAytlcANBAOZxoFljtDExH3UGzvGJ8Oei26jB5Mhh +OAzm6ee5n87i9Umj9QQehfd9EPsd7rbcXlHxgjOk7eAKZQkrDh6yrws= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/ca-ed448.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed448, OU = Root-Ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = CA-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED448 @@ -27,27 +27,27 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED448 - 44:dc:1a:ae:76:a6:28:68:81:e9:27:c5:53:ea:96:92:04:0f: - a0:a9:cc:97:7c:9f:05:62:d7:bb:a2:df:5e:3d:52:87:ab:15: - 35:cd:c5:e1:e7:c2:9a:c6:d8:20:46:6b:62:4b:0d:28:41:d2: - 5e:11:80:4f:41:c2:23:bd:2b:b0:e1:e0:66:58:c1:aa:24:f8: - 7b:98:99:79:31:2b:33:5e:95:3a:87:cc:cf:49:a5:87:3b:38: - 9e:c2:be:de:45:34:55:25:78:3c:19:03:f3:62:14:a7:2a:9a: - 2e:78:8b:6a:3a:00 + 24:d8:26:28:60:11:09:c1:a5:f9:a9:7f:a7:40:ed:a5:07:cb: + cb:3e:a1:6a:d3:45:6d:4c:e1:66:36:37:57:6a:34:5d:33:45: + b3:17:e1:18:76:57:df:fe:44:b4:ec:04:16:74:52:82:24:52: + 1f:99:00:2d:42:a9:5c:45:1b:8d:b8:95:ce:0d:82:cb:52:8f: + e2:bd:20:19:6a:8a:79:29:f6:20:d3:e6:35:8c:27:1a:a4:64: + b7:ff:91:09:21:57:c6:11:c5:01:9a:98:54:31:37:7a:7b:ed: + 35:a9:4d:13:19:00 -----BEGIN CERTIFICATE----- MIICqDCCAiigAwIBAgIBATAFBgMrZXEwgZkxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX0Vk NDQ4MRMwEQYDVQQLDApSb290LUVkNDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5j -b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2MjEx -NzUwWhcNMjUwOTExMjExNzUwWjCBsDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01v +b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEzMjIx +OTI5WhcNMjYwOTA4MjIxOTI5WjCBsDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01v bnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFjAUBgNVBAoMDXdvbGZTU0xfZWQ0NDgx ETAPBgNVBAsMCENBLWVkNDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAd BgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3 b2xmU1NMMEMwBQYDK2VxAzoADuK0duXSzMJLe7ApvpL7w69ppZS6cCToo+/IY5rd pq9YQzgEJPAQkb6nAZFU889phUy5l4ykN6oAo2MwYTAdBgNVHQ4EFgQUOFlF6N1E LLV9pSXWC8w58HLAlGMwHwYDVR0jBBgwFoAU2mmYySZKdftZXlOaY0sMuIgLDx4w -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwBQYDK2VxA3MARNwarnam -KGiB6SfFU+qWkgQPoKnMl3yfBWLXu6LfXj1Sh6sVNc3F4efCmsbYIEZrYksNKEHS -XhGAT0HCI70rsOHgZljBqiT4e5iZeTErM16VOofMz0mlhzs4nsK+3kU0VSV4PBkD -82IUpyqaLniLajoA +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwBQYDK2VxA3MAJNgmKGAR +CcGl+al/p0DtpQfLyz6hatNFbUzhZjY3V2o0XTNFsxfhGHZX3/5EtOwEFnRSgiRS +H5kALUKpXEUbjbiVzg2Cy1KP4r0gGWqKeSn2INPmNYwnGqRkt/+RCSFXxhHFAZqY +VDE3envtNalNExkA -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/client-ed448.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/client-ed448.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/client-ed448.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/client-ed448.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/client-ed448.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/client-ed448.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 41:cb:cd:b4:41:06:a7:13:d4:27:66:bf:c9:a7:44:64:18:84:d5:eb + 1e:73:eb:26:79:34:8f:f6:ba:9b:e5:8d:b4:e1:1a:73:6b:91:a6:6b Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = Client-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = Client-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED448 @@ -23,7 +23,7 @@ X509v3 Authority Key Identifier: keyid:F3:C7:66:93:0D:CB:0E:1B:80:08:00:CF:E3:4E:11:4D:58:2B:4B:D4 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_ed448/OU=Client-ed448/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/UID=wolfSSL - serial:41:CB:CD:B4:41:06:A7:13:D4:27:66:BF:C9:A7:44:64:18:84:D5:EB + serial:1E:73:EB:26:79:34:8F:F6:BA:9B:E5:8D:B4:E1:1A:73:6B:91:A6:6B X509v3 Basic Constraints: CA:TRUE @@ -32,20 +32,20 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: ED448 - 00:99:ac:61:ff:f7:f9:cd:d9:75:74:6f:16:8d:65:12:60:77: - 6d:1a:ee:42:bb:aa:31:cc:c9:57:c7:2e:78:a3:a5:48:73:ac: - b2:d9:2b:ca:f5:35:14:a3:e9:64:40:de:b7:2a:24:d3:73:f9: - 17:fe:80:32:dd:7b:7f:39:29:87:a3:de:d3:48:27:84:b2:50: - 0b:c4:02:36:cd:10:62:88:61:a4:74:c9:b6:5d:c7:94:f0:83: - 28:36:73:5c:a0:66:62:06:63:c1:41:2d:c3:23:24:e6:4f:f9: - 19:85:2f:8d:30:00 + c8:1a:84:b3:0f:6c:53:1b:21:49:44:ce:5d:46:30:1a:9a:eb: + 9e:cb:22:40:89:09:a8:4a:23:69:27:05:f3:cf:5d:7a:d0:9b: + a7:fd:b9:52:d2:4e:b1:e4:ed:8f:de:7f:75:49:07:f5:df:ec: + ac:34:00:d4:12:b1:b4:1e:49:1c:da:ae:34:db:4c:d6:2b:40: + 00:2a:ed:3f:37:09:26:62:ab:32:34:f4:81:19:d4:6b:ef:07: + 19:0c:6c:d9:e9:69:24:c7:e5:b2:73:b0:6d:14:ba:3e:8a:86: + 5d:24:dc:80:3c:00 -----BEGIN CERTIFICATE----- -MIID3jCCA16gAwIBAgIUQcvNtEEGpxPUJ2a/yadEZBiE1eswBQYDK2VxMIG0MQsw +MIID3jCCA16gAwIBAgIUHnPrJnk0j/a6m+WNtOEac2uRpmswBQYDK2VxMIG0MQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEW MBQGA1UECgwNd29sZlNTTF9lZDQ0ODEVMBMGA1UECwwMQ2xpZW50LWVkNDQ4MRgw FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s -ZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIyMTIxNjIxMTc1 -MFoXDTI1MDkxMTIxMTc1MFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 +ZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIzMTIxMzIyMTky +OVoXDTI2MDkwODIyMTkyOVowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2VkNDQ4MRUw EwYDVQQLDAxDbGllbnQtZWQ0NDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEf MB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEM @@ -56,9 +56,9 @@ MRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2VkNDQ4MRUwEwYD VQQLDAxDbGllbnQtZWQ0NDgxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEMB3dv -bGZTU0yCFEHLzbRBBqcT1Cdmv8mnRGQYhNXrMAwGA1UdEwQFMAMBAf8wHAYDVR0R +bGZTU0yCFB5z6yZ5NI/2upvljbThGnNrkaZrMAwGA1UdEwQFMAMBAf8wHAYDVR0R BBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG -AQUFBwMCMAUGAytlcQNzAACZrGH/9/nN2XV0bxaNZRJgd20a7kK7qjHMyVfHLnij -pUhzrLLZK8r1NRSj6WRA3rcqJNNz+Rf+gDLde385KYej3tNIJ4SyUAvEAjbNEGKI -YaR0ybZdx5Twgyg2c1ygZmIGY8FBLcMjJOZP+RmFL40wAA== +AQUFBwMCMAUGAytlcQNzAMgahLMPbFMbIUlEzl1GMBqa657LIkCJCahKI2knBfPP +XXrQm6f9uVLSTrHk7Y/ef3VJB/Xf7Kw0ANQSsbQeSRzarjTbTNYrQAAq7T83CSZi +qzI09IEZ1GvvBxkMbNnpaSTH5bJzsG0Uuj6Khl0k3IA8AA== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/root-ed448.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/root-ed448.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/root-ed448.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/root-ed448.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/root-ed448.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/root-ed448.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 15:10:83:9c:88:f8:38:05:d2:56:c9:ff:8d:c8:a7:bb:c3:ee:a1:d5 + 13:86:16:ce:8f:3e:19:34:76:2d:dd:88:13:01:34:86:73:7b:5a:9a Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed448, OU = Root-Ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed448, OU = Root-Ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: ED448 @@ -28,27 +28,27 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED448 - e0:a1:1b:d8:b9:fe:48:22:0c:ec:a4:8d:7b:b1:dd:b7:a2:b7: - 8c:48:49:0d:d7:39:5f:13:97:16:0c:2a:d1:3d:c8:f6:fb:f6: - 81:55:f0:5f:ff:cb:94:eb:29:6a:9d:2d:16:4c:2b:bd:13:9f: - 22:87:80:42:17:c3:de:2b:fb:87:a1:1d:79:29:bf:59:12:c7: - 71:68:ca:78:33:ae:bf:1a:8d:8c:f1:68:e1:92:7e:6b:65:5a: - 49:ef:a6:47:4d:e6:70:93:61:58:fa:63:23:63:d4:09:c3:49: - e5:b1:f9:27:1c:00 + 58:fd:39:b5:c2:38:86:da:aa:72:ec:35:44:d1:8a:b6:7c:28: + 9f:c4:75:c9:bf:09:d8:49:c0:18:34:9d:10:c3:e9:f3:54:9b: + 3d:8a:c7:9c:bd:a1:9d:33:88:17:f2:55:9c:bb:00:63:d8:40: + a2:ed:80:7d:e9:95:1d:f0:fb:9f:7c:43:ba:b1:63:4e:48:7e: + 87:ea:82:21:bb:3f:a5:2f:6e:43:77:90:4b:e3:e4:29:a8:a1: + c0:c4:22:a5:6c:49:ef:c7:e9:36:1c:39:3f:71:3d:6d:51:27: + 89:99:fa:c6:1c:00 -----BEGIN CERTIFICATE----- -MIICpDCCAiSgAwIBAgIUFRCDnIj4OAXSVsn/jcinu8PuodUwBQYDK2VxMIGZMQsw +MIICpDCCAiSgAwIBAgIUE4YWzo8+GTR2Ld2IEwE0hnN7WpowBQYDK2VxMIGZMQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEW MBQGA1UECgwNd29sZlNTTF9FZDQ0ODETMBEGA1UECwwKUm9vdC1FZDQ0ODEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz -c2wuY29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZkxCzAJBgNV +c2wuY29tMB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgZkxCzAJBgNV BAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYD VQQKDA13b2xmU1NMX0VkNDQ4MRMwEQYDVQQLDApSb290LUVkNDQ4MRgwFgYDVQQD DA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b20wQzAFBgMrZXEDOgALZCYoz7VGm+4/6jv1Znoy1P59+IBfWFds13nuZqI9VI+N CK/LuEOUUF3lU2JpyHWCpl5EyktbCwCjYzBhMB0GA1UdDgQWBBTaaZjJJkp1+1le U5pjSwy4iAsPHjAfBgNVHSMEGDAWgBTaaZjJJkp1+1leU5pjSwy4iAsPHjAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAFBgMrZXEDcwDgoRvYuf5IIgzs -pI17sd23oreMSEkN1zlfE5cWDCrRPcj2+/aBVfBf/8uU6ylqnS0WTCu9E58ih4BC -F8PeK/uHoR15Kb9ZEsdxaMp4M66/Go2M8Wjhkn5rZVpJ76ZHTeZwk2FY+mMjY9QJ -w0nlsfknHAA= +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAFBgMrZXEDcwBY/Tm1wjiG2qpy +7DVE0Yq2fCifxHXJvwnYScAYNJ0Qw+nzVJs9isecvaGdM4gX8lWcuwBj2ECi7YB9 +6ZUd8PuffEO6sWNOSH6H6oIhuz+lL25Dd5BL4+QpqKHAxCKlbEnvx+k2HDk/cT1t +USeJmfrGHAA= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/server-ed448-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/server-ed448-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = CA-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = Server-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED448 @@ -31,19 +31,19 @@ Netscape Cert Type: SSL Server Signature Algorithm: ED448 - 85:87:37:04:21:3e:2a:09:c2:e3:ca:28:12:28:f5:a4:98:e8: - 14:54:ea:13:1e:fc:bc:ca:eb:1c:7f:e0:c1:53:ac:be:0d:ff: - d3:49:00:30:4f:74:10:da:6e:0a:a9:01:4a:b6:10:a5:77:8d: - 63:a7:80:a7:7b:7c:73:d4:e5:87:b6:64:32:96:2c:0b:b9:84: - b7:a5:3b:f2:55:b7:6a:fe:7b:dc:8a:20:75:77:0d:37:14:25: - b4:88:d2:da:7c:2e:6a:67:c9:a6:cd:19:80:49:53:90:d7:21: - 29:c7:97:b3:1e:00 + f9:2a:92:55:05:3d:74:24:8f:57:f4:91:e5:66:85:7c:53:11: + 88:22:82:ea:a3:50:0f:c2:a6:8e:39:85:85:14:a3:d4:ac:4f: + 66:fc:7e:b4:b3:f4:d7:5d:7c:9b:7f:c4:8e:3b:bc:d9:3a:cc: + 91:91:00:5d:da:26:04:2c:ba:f9:c4:45:3a:d3:4f:80:1e:46: + 9b:86:b8:56:ee:b2:e8:ba:26:47:28:2a:3d:cc:6a:51:33:c3: + 8e:8b:c4:01:8c:cc:25:fd:b4:cb:c2:a3:46:ad:b7:9d:14:e6: + a6:02:39:07:34:00 -----BEGIN CERTIFICATE----- MIIC6jCCAmqgAwIBAgIBATAFBgMrZXEwgbAxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2Vk NDQ4MREwDwYDVQQLDAhDQS1lZDQ0ODEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQB -AQwHd29sZlNTTDAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIG0MQsw +AQwHd29sZlNTTDAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIG0MQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEW MBQGA1UECgwNd29sZlNTTF9lZDQ0ODEVMBMGA1UECwwMU2VydmVyLWVkNDQ4MRgw FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -52,7 +52,7 @@ OgWVqO8Ao4GJMIGGMB0GA1UdDgQWBBR8q1wSqWjYGBAofZLFSrhMTHYO2zAfBgNV HSMEGDAWgBQ4WUXo3UQstX2lJdYLzDnwcsCUYzAMBgNVHRMBAf8EAjAAMA4GA1Ud DwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATARBglghkgBhvhCAQEEBAMC -BkAwBQYDK2VxA3MAhYc3BCE+KgnC48ooEij1pJjoFFTqEx78vMrrHH/gwVOsvg3/ -00kAME90ENpuCqkBSrYQpXeNY6eAp3t8c9Tlh7ZkMpYsC7mEt6U78lW3av573Iog -dXcNNxQltIjS2nwuamfJps0ZgElTkNchKceXsx4A +BkAwBQYDK2VxA3MA+SqSVQU9dCSPV/SR5WaFfFMRiCKC6qNQD8KmjjmFhRSj1KxP +Zvx+tLP01118m3/Ejju82TrMkZEAXdomBCy6+cRFOtNPgB5Gm4a4Vu6y6LomRygq +PcxqUTPDjovEAYzMJf20y8KjRq23nRTmpgI5BzQA -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/server-ed448.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/server-ed448.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ed448/server-ed448.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ed448/server-ed448.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = CA-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = Server-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED448 @@ -31,19 +31,19 @@ Netscape Cert Type: SSL Server Signature Algorithm: ED448 - 85:87:37:04:21:3e:2a:09:c2:e3:ca:28:12:28:f5:a4:98:e8: - 14:54:ea:13:1e:fc:bc:ca:eb:1c:7f:e0:c1:53:ac:be:0d:ff: - d3:49:00:30:4f:74:10:da:6e:0a:a9:01:4a:b6:10:a5:77:8d: - 63:a7:80:a7:7b:7c:73:d4:e5:87:b6:64:32:96:2c:0b:b9:84: - b7:a5:3b:f2:55:b7:6a:fe:7b:dc:8a:20:75:77:0d:37:14:25: - b4:88:d2:da:7c:2e:6a:67:c9:a6:cd:19:80:49:53:90:d7:21: - 29:c7:97:b3:1e:00 + f9:2a:92:55:05:3d:74:24:8f:57:f4:91:e5:66:85:7c:53:11: + 88:22:82:ea:a3:50:0f:c2:a6:8e:39:85:85:14:a3:d4:ac:4f: + 66:fc:7e:b4:b3:f4:d7:5d:7c:9b:7f:c4:8e:3b:bc:d9:3a:cc: + 91:91:00:5d:da:26:04:2c:ba:f9:c4:45:3a:d3:4f:80:1e:46: + 9b:86:b8:56:ee:b2:e8:ba:26:47:28:2a:3d:cc:6a:51:33:c3: + 8e:8b:c4:01:8c:cc:25:fd:b4:cb:c2:a3:46:ad:b7:9d:14:e6: + a6:02:39:07:34:00 -----BEGIN CERTIFICATE----- MIIC6jCCAmqgAwIBAgIBATAFBgMrZXEwgbAxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX2Vk NDQ4MREwDwYDVQQLDAhDQS1lZDQ0ODEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQB -AQwHd29sZlNTTDAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIG0MQsw +AQwHd29sZlNTTDAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIG0MQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEW MBQGA1UECgwNd29sZlNTTF9lZDQ0ODEVMBMGA1UECwwMU2VydmVyLWVkNDQ4MRgw FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -52,9 +52,9 @@ OgWVqO8Ao4GJMIGGMB0GA1UdDgQWBBR8q1wSqWjYGBAofZLFSrhMTHYO2zAfBgNV HSMEGDAWgBQ4WUXo3UQstX2lJdYLzDnwcsCUYzAMBgNVHRMBAf8EAjAAMA4GA1Ud DwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATARBglghkgBhvhCAQEEBAMC -BkAwBQYDK2VxA3MAhYc3BCE+KgnC48ooEij1pJjoFFTqEx78vMrrHH/gwVOsvg3/ -00kAME90ENpuCqkBSrYQpXeNY6eAp3t8c9Tlh7ZkMpYsC7mEt6U78lW3av573Iog -dXcNNxQltIjS2nwuamfJps0ZgElTkNchKceXsx4A +BkAwBQYDK2VxA3MA+SqSVQU9dCSPV/SR5WaFfFMRiCKC6qNQD8KmjjmFhRSj1KxP +Zvx+tLP01118m3/Ejju82TrMkZEAXdomBCy6+cRFOtNPgB5Gm4a4Vu6y6LomRygq +PcxqUTPDjovEAYzMJf20y8KjRq23nRTmpgI5BzQA -----END CERTIFICATE----- Certificate: Data: @@ -63,8 +63,8 @@ Signature Algorithm: ED448 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_Ed448, OU = Root-Ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_ed448, OU = CA-ed448, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: ED448 @@ -85,27 +85,27 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ED448 - 44:dc:1a:ae:76:a6:28:68:81:e9:27:c5:53:ea:96:92:04:0f: - a0:a9:cc:97:7c:9f:05:62:d7:bb:a2:df:5e:3d:52:87:ab:15: - 35:cd:c5:e1:e7:c2:9a:c6:d8:20:46:6b:62:4b:0d:28:41:d2: - 5e:11:80:4f:41:c2:23:bd:2b:b0:e1:e0:66:58:c1:aa:24:f8: - 7b:98:99:79:31:2b:33:5e:95:3a:87:cc:cf:49:a5:87:3b:38: - 9e:c2:be:de:45:34:55:25:78:3c:19:03:f3:62:14:a7:2a:9a: - 2e:78:8b:6a:3a:00 + 24:d8:26:28:60:11:09:c1:a5:f9:a9:7f:a7:40:ed:a5:07:cb: + cb:3e:a1:6a:d3:45:6d:4c:e1:66:36:37:57:6a:34:5d:33:45: + b3:17:e1:18:76:57:df:fe:44:b4:ec:04:16:74:52:82:24:52: + 1f:99:00:2d:42:a9:5c:45:1b:8d:b8:95:ce:0d:82:cb:52:8f: + e2:bd:20:19:6a:8a:79:29:f6:20:d3:e6:35:8c:27:1a:a4:64: + b7:ff:91:09:21:57:c6:11:c5:01:9a:98:54:31:37:7a:7b:ed: + 35:a9:4d:13:19:00 -----BEGIN CERTIFICATE----- MIICqDCCAiigAwIBAgIBATAFBgMrZXEwgZkxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRYwFAYDVQQKDA13b2xmU1NMX0Vk NDQ4MRMwEQYDVQQLDApSb290LUVkNDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5j -b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2MjEx -NzUwWhcNMjUwOTExMjExNzUwWjCBsDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01v +b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEzMjIx +OTI5WhcNMjYwOTA4MjIxOTI5WjCBsDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01v bnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFjAUBgNVBAoMDXdvbGZTU0xfZWQ0NDgx ETAPBgNVBAsMCENBLWVkNDQ4MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAd BgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3 b2xmU1NMMEMwBQYDK2VxAzoADuK0duXSzMJLe7ApvpL7w69ppZS6cCToo+/IY5rd pq9YQzgEJPAQkb6nAZFU889phUy5l4ykN6oAo2MwYTAdBgNVHQ4EFgQUOFlF6N1E LLV9pSXWC8w58HLAlGMwHwYDVR0jBBgwFoAU2mmYySZKdftZXlOaY0sMuIgLDx4w -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwBQYDK2VxA3MARNwarnam -KGiB6SfFU+qWkgQPoKnMl3yfBWLXu6LfXj1Sh6sVNc3F4efCmsbYIEZrYksNKEHS -XhGAT0HCI70rsOHgZljBqiT4e5iZeTErM16VOofMz0mlhzs4nsK+3kU0VSV4PBkD -82IUpyqaLniLajoA +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwBQYDK2VxA3MAJNgmKGAR +CcGl+al/p0DtpQfLyz6hatNFbUzhZjY3V2o0XTNFsxfhGHZX3/5EtOwEFnRSgiRS +H5kALUKpXEUbjbiVzg2Cy1KP4r0gGWqKeSn2INPmNYwnGqRkt/+RCSFXxhHFAZqY +VDE3envtNalNExkA -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/entity-no-ca-bool-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/entity-no-ca-bool-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/entity-no-ca-bool-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/entity-no-ca-bool-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = NoCaBool, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,7 +37,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:FALSE, pathlen:0 @@ -46,27 +46,27 @@ X509v3 Extended Key Usage: TLS Web Client Authentication, TLS Web Server Authentication Signature Algorithm: sha256WithRSAEncryption - 22:6e:8b:b8:04:1b:db:85:37:85:51:80:3a:7f:68:19:e4:08: - d5:dc:e3:a3:2a:a0:20:d4:bd:fa:d5:78:58:10:40:92:e1:ea: - 17:36:d7:9c:71:6c:df:e3:ed:71:78:e3:8c:82:b5:dc:cb:82: - 7d:26:65:b5:31:98:b4:8b:76:19:c5:72:18:9d:b5:fc:de:2d: - eb:8e:07:db:5a:d9:13:34:ed:73:89:74:22:d2:b4:f9:bd:75: - 4f:5a:ab:6d:fc:e8:8d:cd:32:22:f8:b2:a7:60:dd:3e:6e:a4: - 1d:7f:02:53:c8:50:36:0e:90:55:43:73:6a:a3:ec:82:50:af: - 56:0a:93:39:a9:43:48:55:fe:e8:94:84:d8:41:81:b8:3b:3e: - 01:95:d7:69:b8:ec:a6:b4:73:73:2d:a4:30:d0:09:ad:6d:2c: - 20:da:cd:30:ce:00:9f:81:cc:52:71:0e:32:1c:10:a4:f4:c4: - 55:c5:b2:b2:66:97:bf:3b:d0:ae:1b:9b:1d:6c:4c:3f:2d:1a: - 76:9c:31:96:dc:53:45:22:b1:e8:52:c6:54:25:85:d5:89:1f: - db:3a:e7:97:b4:1e:0d:17:94:21:1e:f9:be:d6:b7:c1:92:a7: - e2:d6:51:f4:c0:40:2f:17:6a:ab:85:5e:c4:0c:6e:cb:75:df: - f7:ba:0d:f0 + 44:6a:a0:11:85:71:72:c5:7c:84:36:aa:31:c4:4a:c0:99:0e: + fd:b9:78:69:0b:8c:58:b4:4c:01:04:65:f3:dd:ea:db:a2:1f: + d7:9d:cd:b4:6f:18:da:79:b8:35:c4:25:5e:61:a4:02:26:29: + 33:be:72:e5:35:8f:2b:68:0a:87:03:97:3e:9e:00:e2:37:7f: + 7a:c9:29:d8:fc:61:6b:3f:36:47:e2:66:e0:93:77:b7:75:46: + bb:0c:57:5c:af:7d:62:07:d9:0c:93:b7:5f:81:a6:9e:49:7b: + f8:0a:82:2a:2a:80:39:d8:91:c5:01:cb:aa:f4:d7:15:64:78: + 5c:1e:b4:57:35:6c:19:f6:36:b8:35:96:ce:c6:a7:cb:12:56: + c1:58:0b:10:54:b0:d7:b0:1f:48:50:b2:16:96:c8:88:32:88: + 25:bb:40:c3:c5:df:a2:74:04:84:21:c4:fe:fe:d3:08:50:4f: + 85:f7:b2:6e:5e:b5:3e:47:19:c9:1a:81:0a:24:33:a5:04:90: + 3f:c1:4d:f7:94:86:8f:78:82:4c:51:4e:37:84:1f:98:f2:91: + 07:58:c0:f9:dc:4f:b6:a8:54:a0:b9:0b:43:3b:bd:b2:3c:d6: + ad:52:05:6d:95:6b:c5:9c:5f:f5:87:f9:3b:e2:b8:3a:3a:3f: + 3f:06:df:10 -----BEGIN CERTIFICATE----- MIIE2DCCA8CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBkTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBkTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxETAP BgNVBAsMCE5vQ2FCb29sMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB @@ -80,25 +80,25 @@ 7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UE CwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI -hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7bR50HZpI9aNfKrJBPymlBSzAM +hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqobAHs9mDycFEKTNEU+rzpRDAM BgNVHRMEBTADAgEAMAsGA1UdDwQEAwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAgYI -KwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBACJui7gEG9uFN4VRgDp/aBnkCNXc -46MqoCDUvfrVeFgQQJLh6hc215xxbN/j7XF444yCtdzLgn0mZbUxmLSLdhnFchid -tfzeLeuOB9ta2RM07XOJdCLStPm9dU9aq2386I3NMiL4sqdg3T5upB1/AlPIUDYO -kFVDc2qj7IJQr1YKkzmpQ0hV/uiUhNhBgbg7PgGV12m47Ka0c3MtpDDQCa1tLCDa -zTDOAJ+BzFJxDjIcEKT0xFXFsrJml7870K4bmx1sTD8tGnacMZbcU0UisehSxlQl -hdWJH9s655e0Hg0XlCEe+b7Wt8GSp+LWUfTAQC8XaquFXsQMbst13/e6DfA= +KwYBBQUHAwEwDQYJKoZIhvcNAQELBQADggEBAERqoBGFcXLFfIQ2qjHESsCZDv25 +eGkLjFi0TAEEZfPd6tuiH9edzbRvGNp5uDXEJV5hpAImKTO+cuU1jytoCocDlz6e +AOI3f3rJKdj8YWs/NkfiZuCTd7d1RrsMV1yvfWIH2QyTt1+Bpp5Je/gKgioqgDnY +kcUBy6r01xVkeFwetFc1bBn2Nrg1ls7Gp8sSVsFYCxBUsNewH0hQshaWyIgyiCW7 +QMPF36J0BIQhxP7+0whQT4X3sm5etT5HGckagQokM6UEkD/BTfeUho94gkxRTjeE +H5jykQdYwPncT7aoVKC5C0M7vbI81q1SBW2Va8WcX/WH+TviuDo6Pz8G3xA= -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: - 2c:80:ce:db:47:9d:07:66:92:3d:68:d7:ca:ac:90:4f:ca:69:41:4b + 33:44:1a:a8:6c:01:ec:f6:60:f2:70:51:0a:4c:d1:14:fa:bc:e9:44 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -129,7 +129,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -138,27 +138,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - ae:b0:a4:35:8e:8a:1b:a6:eb:b3:a2:57:cf:3a:1f:dc:6e:bc: - d2:d0:a6:4a:8f:88:0a:6e:74:d5:d1:7c:d1:44:b1:d4:3b:17: - 03:09:5a:46:ed:08:08:cf:f1:fd:20:07:67:c0:97:ec:35:f3: - 75:ca:20:61:98:3e:f5:4d:be:e6:9d:75:1e:e4:03:ad:8c:a6: - 1e:3d:ec:e4:1a:92:5b:f9:a3:ad:83:ca:4f:cd:aa:38:bb:6e: - ae:ad:fa:a7:46:f1:8b:73:ec:09:23:bc:f2:18:e5:b7:92:86: - 3e:a4:75:60:c7:3d:0f:3f:83:00:c3:06:08:9c:d1:54:d6:ba: - 6d:95:3d:34:a1:be:24:91:cc:20:03:11:5b:72:1c:d4:65:d0: - 11:88:75:26:04:26:ef:66:70:e6:3b:38:87:9c:53:71:1b:09: - 51:70:50:99:4c:31:0c:62:44:57:30:60:04:fc:12:2c:a3:24: - b4:f7:11:d5:0e:b5:21:0b:ed:86:11:67:4d:36:fa:57:a0:59: - 55:21:b3:6d:e4:77:5e:ec:7e:f0:09:13:8e:99:98:b2:e1:82: - b6:4b:3e:0f:41:a6:0c:cd:49:99:7e:e4:8a:cb:37:ed:53:cf: - 86:5d:a9:26:a8:e5:01:25:5a:b4:bc:25:35:f1:fa:5a:5c:ce: - d4:b8:9a:2c + 2d:fc:f9:32:5a:be:d6:9d:42:8b:86:4e:67:22:c3:50:2d:cb: + 14:27:1d:94:f3:cd:88:42:da:41:1c:39:24:67:a7:92:4d:27: + ea:56:82:19:bf:11:b2:43:a4:8d:5d:87:b2:27:64:66:82:81: + df:c4:fd:5b:62:b0:c2:4d:9d:29:f2:41:32:cc:2e:b5:da:38: + 06:1b:e8:7f:8c:6e:3d:80:1e:00:56:49:bf:39:e0:da:68:2f: + c4:fd:00:e6:d1:81:1a:d1:4a:bb:76:52:ce:4d:24:9d:c4:a3: + a7:f1:65:14:2f:1f:a8:2d:c6:cb:ce:b1:a7:89:74:26:27:c3: + f3:a3:84:4c:34:01:14:03:7d:16:3a:c8:8b:25:2e:7b:90:cc: + 46:b1:52:34:ba:93:6e:ef:fe:43:a3:ad:c6:6f:51:fb:ba:ea: + 38:e3:6f:d6:ee:63:62:36:ea:5e:08:b4:e2:2a:46:89:e3:ae: + b3:b4:06:ef:63:7a:6e:5d:dd:c9:ec:02:4f:f7:64:c0:27:07: + b4:6f:4a:18:72:5b:34:74:7c:d0:a9:04:8f:40:8b:6a:39:d2: + 6b:1a:01:f2:01:a8:81:34:3a:e5:b0:55:d1:3c:95:ca:b0:82: + d6:ed:98:28:15:59:7e:95:a7:69:c7:b5:7b:ec:01:a7:4d:e6: + b9:a2:fe:35 -----BEGIN CERTIFICATE----- -MIIE/zCCA+egAwIBAgIULIDO20edB2aSPWjXyqyQT8ppQUswDQYJKoZIhvcNAQEL +MIIE/zCCA+egAwIBAgIUM0QaqGwB7PZg8nBRCkzRFPq86UQwDQYJKoZIhvcNAQEL BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZQxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZQxCzAJ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -173,12 +173,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU -LIDO20edB2aSPWjXyqyQT8ppQUswDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +M0QaqGwB7PZg8nBRCkzRFPq86UQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DQYJKoZIhvcNAQELBQADggEBAK6wpDWOihum67OiV886H9xuvNLQpkqPiApudNXR -fNFEsdQ7FwMJWkbtCAjP8f0gB2fAl+w183XKIGGYPvVNvuaddR7kA62Mph497OQa -klv5o62Dyk/Nqji7bq6t+qdG8Ytz7AkjvPIY5beShj6kdWDHPQ8/gwDDBgic0VTW -um2VPTShviSRzCADEVtyHNRl0BGIdSYEJu9mcOY7OIecU3EbCVFwUJlMMQxiRFcw -YAT8EiyjJLT3EdUOtSEL7YYRZ002+legWVUhs23kd17sfvAJE46ZmLLhgrZLPg9B -pgzNSZl+5IrLN+1Tz4ZdqSao5QElWrS8JTXx+lpcztS4miw= +DQYJKoZIhvcNAQELBQADggEBAC38+TJavtadQouGTmciw1AtyxQnHZTzzYhC2kEc +OSRnp5JNJ+pWghm/EbJDpI1dh7InZGaCgd/E/VtisMJNnSnyQTLMLrXaOAYb6H+M +bj2AHgBWSb854NpoL8T9AObRgRrRSrt2Us5NJJ3Eo6fxZRQvH6gtxsvOsaeJdCYn +w/OjhEw0ARQDfRY6yIslLnuQzEaxUjS6k27v/kOjrcZvUfu66jjjb9buY2I26l4I +tOIqRonjrrO0Bu9jem5d3cnsAk/3ZMAnB7RvShhyWzR0fNCpBI9Ai2o50msaAfIB +qIE0OuWwVdE8lcqwgtbtmCgVWX6Vp2nHtXvsAadN5rmi/jU= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/fpki-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/fpki-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/certs/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -3,115 +3,127 @@ # EXTRA_DIST += \ - certs/ca-cert-chain.der \ - certs/ca-cert.pem \ - certs/ca-key.pem \ - certs/client-cert.pem \ - certs/client-keyEnc.pem \ - certs/client-key.pem \ - certs/client-uri-cert.pem \ - certs/client-absolute-urn.pem \ - certs/client-relative-uri.pem \ - certs/client-crl-dist.pem \ - certs/client-crl-dist.der \ - certs/ecc-key.pem \ - certs/ecc-keyPub.pem \ - certs/ecc-privkey.pem \ - certs/ecc-privkeyPkcs8.der \ - certs/ecc-privkeyPkcs8.pem \ - certs/ecc-keyPkcs8Enc.pem \ - certs/ecc-keyPkcs8Enc.der \ - certs/ecc-key-comp.pem \ - certs/ecc-keyPkcs8.pem \ - certs/ecc-keyPkcs8.der \ - certs/ecc-client-key.pem \ - certs/ecc-client-keyPub.pem \ - certs/client-ecc-cert.pem \ - certs/client-ca.pem \ - certs/dh2048.pem \ - certs/server-cert.pem \ - certs/server-ecc.pem \ - certs/server-ecc-self.pem \ - certs/server-ecc-comp.pem \ - certs/server-ecc-rsa.pem \ - certs/server-keyEnc.pem \ - certs/server-key.pem \ - certs/server-keyPub.pem \ - certs/server-keyPkcs8.der \ - certs/server-keyPkcs8Enc12.pem \ - certs/server-keyPkcs8Enc2.pem \ - certs/server-keyPkcs8Enc.pem \ - certs/server-keyPkcs8Enc.der \ - certs/server-keyPkcs8.pem \ - certs/server-revoked-cert.pem \ - certs/server-revoked-key.pem \ - certs/wolfssl-website-ca.pem \ - certs/test-degenerate.p7b \ - certs/test-ber-exp02-05-2022.p7b \ - certs/test-servercert.p12 \ - certs/test-servercert-rc2.p12 \ - certs/ecc-rsa-server.p12 \ - certs/dsaparams.der \ - certs/dsaparams.pem \ - certs/ecc-privOnlyKey.pem \ - certs/ecc-privOnlyCert.pem \ - certs/dh3072.pem \ - certs/dh4096.pem \ - certs/client-cert-ext.pem \ - certs/csr.attr.der \ - certs/csr.dsa.pem \ - certs/csr.signed.der \ - certs/csr.ext.der \ - certs/entity-no-ca-bool-cert.pem \ - certs/entity-no-ca-bool-key.pem \ - certs/x942dh2048.pem \ - certs/fpki-cert.der \ - certs/rid-cert.der + certs/ca-cert-chain.der \ + certs/ca-cert.pem \ + certs/ca-key.pem \ + certs/client-cert.pem \ + certs/client-keyEnc.pem \ + certs/client-key.pem \ + certs/client-uri-cert.pem \ + certs/client-absolute-urn.pem \ + certs/client-relative-uri.pem \ + certs/client-crl-dist.pem \ + certs/client-crl-dist.der \ + certs/ecc-key.pem \ + certs/ecc-keyPub.pem \ + certs/ecc-params.der \ + certs/ecc-params.pem \ + certs/ecc-privkey.der \ + certs/ecc-privkey.pem \ + certs/ecc-privkeyPkcs8.der \ + certs/ecc-privkeyPkcs8.pem \ + certs/ecc-keyPkcs8Enc.pem \ + certs/ecc-keyPkcs8Enc.der \ + certs/ecc-key-comp.pem \ + certs/ecc-keyPkcs8.pem \ + certs/ecc-keyPkcs8.der \ + certs/ecc-client-key.pem \ + certs/ecc-client-keyPub.pem \ + certs/client-ecc-cert.pem \ + certs/client-ca.pem \ + certs/dh2048.pem \ + certs/server-cert.pem \ + certs/server-ecc.pem \ + certs/server-ecc-self.pem \ + certs/server-ecc-comp.pem \ + certs/server-ecc-rsa.pem \ + certs/server-keyEnc.pem \ + certs/server-key.pem \ + certs/server-keyPub.der \ + certs/server-keyPub.pem \ + certs/server-keyPkcs8.der \ + certs/server-keyPkcs8Enc12.pem \ + certs/server-keyPkcs8Enc2.pem \ + certs/server-keyPkcs8Enc.pem \ + certs/server-keyPkcs8Enc.der \ + certs/server-keyPkcs8.pem \ + certs/server-revoked-cert.pem \ + certs/server-revoked-key.pem \ + certs/wolfssl-website-ca.pem \ + certs/test-degenerate.p7b \ + certs/test-stream-sign.p7b \ + certs/test-ber-exp02-05-2022.p7b \ + certs/test-servercert.p12 \ + certs/test-servercert-rc2.p12 \ + certs/ecc-rsa-server.p12 \ + certs/dsaparams.der \ + certs/dsaparams.pem \ + certs/ecc-privOnlyKey.pem \ + certs/ecc-privOnlyCert.pem \ + certs/dh3072.pem \ + certs/dh4096.pem \ + certs/client-cert-ext.pem \ + certs/csr.attr.der \ + certs/csr.dsa.der \ + certs/csr.dsa.pem \ + certs/csr.signed.der \ + certs/csr.ext.der \ + certs/entity-no-ca-bool-cert.pem \ + certs/entity-no-ca-bool-key.pem \ + certs/x942dh2048.der \ + certs/x942dh2048.pem \ + certs/fpki-cert.der \ + certs/rid-cert.der \ + certs/dh-priv-2048.der \ + certs/dh-priv-2048.pem \ + certs/dh-pub-2048.der \ + certs/dh-pub-2048.pem \ + certs/dsa2048.pem EXTRA_DIST += \ - certs/ca-key.der \ - certs/ca-cert.der \ - certs/client-cert.der \ - certs/client-key.der \ - certs/client-ecc-cert.der \ - certs/client-keyPub.der \ - certs/client-keyPub.pem \ - certs/dh2048.der \ - certs/dh3072.der \ - certs/dh4096.der \ - certs/dh-pubkey-2048.der \ - certs/rsa2048.der \ - certs/rsa-pub-2048.pem \ - certs/rsa3072.der \ - certs/dsa2048.der \ - certs/dsa3072.der \ - certs/dsa-pubkey-2048.der \ - certs/ecc-client-key.der \ - certs/ecc-client-keyPub.der \ - certs/ecc-key.der \ - certs/ecc-keyPub.der \ - certs/server-key.der \ - certs/server-cert.der \ - certs/server-ecc-comp.der \ - certs/server-ecc.der \ - certs/server-ecc-self.der \ - certs/server-ecc-rsa.der \ - certs/server-cert-chain.der \ - certs/client-cert-ext.der + certs/ca-key.der \ + certs/ca-cert.der \ + certs/client-cert.der \ + certs/client-key.der \ + certs/client-ecc-cert.der \ + certs/client-keyPub.der \ + certs/client-keyPub.pem \ + certs/dh2048.der \ + certs/dh3072.der \ + certs/dh4096.der \ + certs/dh-pubkey-2048.der \ + certs/rsa2048.der \ + certs/rsa-pub-2048.pem \ + certs/rsa3072.der \ + certs/dsa2048.der \ + certs/dsa3072.der \ + certs/dsa-pubkey-2048.der \ + certs/ecc-client-key.der \ + certs/ecc-client-keyPub.der \ + certs/ecc-key.der \ + certs/ecc-keyPub.der \ + certs/server-key.der \ + certs/server-cert.der \ + certs/server-ecc-comp.der \ + certs/server-ecc.der \ + certs/server-ecc-self.der \ + certs/server-ecc-rsa.der \ + certs/server-cert-chain.der \ + certs/client-cert-ext.der # ECC CA prime256v1 EXTRA_DIST += \ - certs/ca-ecc-cert.der \ - certs/ca-ecc-cert.pem \ - certs/ca-ecc-key.der \ - certs/ca-ecc-key.pem + certs/ca-ecc-cert.der \ + certs/ca-ecc-cert.pem \ + certs/ca-ecc-key.der \ + certs/ca-ecc-key.pem # ECC CA SECP384R1 EXTRA_DIST += \ - certs/ca-ecc384-cert.der \ - certs/ca-ecc384-cert.pem \ - certs/ca-ecc384-key.der \ - certs/ca-ecc384-key.pem + certs/ca-ecc384-cert.der \ + certs/ca-ecc384-cert.pem \ + certs/ca-ecc384-key.der \ + certs/ca-ecc384-key.pem dist_doc_DATA+= certs/taoCert.txt @@ -123,6 +135,7 @@ include certs/ed25519/include.am include certs/ed448/include.am include certs/p521/include.am +include certs/sm2/include.am include certs/external/include.am include certs/ocsp/include.am include certs/statickeys/include.am @@ -133,4 +146,5 @@ include certs/rsapss/include.am include certs/dilithium/include.am include certs/sphincs/include.am +include certs/rpk/include.am Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,79 +5,79 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:57 2020 GMT - Not After : Jun 11 19:17:57 2040 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 22 12:10:09 2043 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) + Public-Key: (2048 bit) Modulus: - 00:f2:23:28:f7:81:43:f0:63:b9:f2:77:7e:30:1a: - 40:6b:e1:dd:6b:41:36:ee:7d:58:23:dc:56:e9:bb: - e8:3b:11:58:c3:c3:b7:eb:98:5a:e9:76:12:cd:ef: - 77:09:25:d3:6c:e6:3a:49:68:50:90:d7:32:e0:18: - d6:05:df:f7:9e:d2:8f:7b:b5:91:5c:bf:3e:09:81: - dd:79:ed:44:c2:93:f5:9d:a4:cb:0a:6b:63:b4:f0: - ee:d1:dd:6c:e7:c6:b7:f1:30:d4:b7:54:28:18:11: - fc:25:ac:5b:f1:b3:19:13:47:7d:7e:d9:45:97:3c: - bb:b9:42:70:06:94:55:23:15:0b:84:ca:0c:15:c1: - 6e:1a:1c:f9:54:c9:e6:e3:b8:c1:45:e5:5a:89:e1: - f1:1b:1d:81:b7:34:07:17:28:5b:10:c7:a6:21:eb: - 5d:89:11:a3:d0:39:60:34:ea:e1:75:fa:b8:7c:ee: - c5:3f:64:6a:1d:b8:d8:a4:b2:82:98:31:11:e8:b5: - 20:2d:03:e5:d1:61:35:a4:4b:b5:ad:a6:b7:72:71: - 3e:86:38:0e:38:b6:5d:b5:ab:bf:3a:ba:1e:32:76: - ba:54:4d:05:ca:4e:e2:83:df:30:64:11:9e:99:93: - 3b:a6:fb:3b:df:7d:90:02:f4:b4:f1:e8:41:31:78: - 02:3f + 00:c3:a2:73:5d:21:62:20:ce:3a:71:38:a7:94:bb: + db:87:04:1c:5a:1b:9e:4b:0d:3e:ca:f8:a5:f7:0d: + 6a:dc:23:90:22:6a:2b:58:63:4a:28:6a:48:a8:e7: + 73:1f:a2:55:d8:4d:02:3b:e2:cb:6b:e2:83:c9:51: + 8f:77:fd:dc:2d:5d:23:b7:23:9a:7e:b6:29:68:e8: + 2a:4e:a9:fe:32:70:31:9e:f0:ef:ee:f8:8d:e3:fc: + f3:d7:28:dd:7a:1d:9e:ad:23:2b:f1:a6:7f:34:52: + 29:66:d2:e5:64:55:64:d6:dd:4b:41:3b:55:83:6e: + c0:11:0e:6e:20:c2:16:73:eb:30:ff:09:46:bb:e7: + cc:c6:03:44:41:11:c6:c1:6c:36:2f:4a:f9:91:55: + ca:58:5e:37:b8:28:10:30:89:40:96:77:cf:70:66: + a4:55:fb:69:0b:e7:d9:b2:33:65:db:72:3a:77:b7: + 2b:49:fc:b6:cd:58:10:8d:ab:aa:cb:40:45:77:02: + 39:18:b3:8f:33:01:48:77:50:be:8e:73:a7:de:36: + a0:49:8e:2c:16:af:b9:fb:42:2d:35:6a:db:34:37: + d5:14:59:7d:65:72:e5:8b:65:55:4b:20:5e:47:f9: + f8:3a:d3:6c:d9:3a:f5:c7:01:46:31:c3:79:9a:18: + be:49 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: - 83:1C:F1:98:85:EC:6E:06:45:34:DE:51:C0:BA:B7:2B:67:32:66:4D + EF:69:E0:F7:D5:1D:E6:99:EC:DC:6D:D0:F7:E2:B9:5C:64:71:83:35 X509v3 Authority Key Identifier: - keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 - + 27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 X509v3 Basic Constraints: critical CA:TRUE, pathlen:1 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 7d:0d:5c:2a:19:e7:ee:5f:ca:2d:d4:59:54:b9:ca:33:18:3a: - e3:22:2c:18:70:bb:c5:58:45:d9:82:bc:80:5d:90:d9:02:34: - 6c:1a:4f:f1:6b:59:4e:cd:e1:ea:27:80:e6:e2:d8:7e:af:2b: - ac:c1:62:e0:4d:e9:e6:74:99:fe:c0:50:cb:d3:7d:e5:2b:82: - 0d:67:0d:14:b5:2c:6a:a2:7a:c2:dd:08:a7:40:2a:8f:a1:bf: - 4d:53:75:5d:dd:c3:82:e5:e4:1f:04:b0:b6:a7:cc:55:6c:b4: - d4:74:9e:9a:36:37:f0:32:69:97:44:fb:d2:22:1a:8b:95:34: - 44:32:cc:2a:a9:76:f7:12:c7:b9:9b:f1:e5:a7:c7:d5:6d:12: - ec:00:1d:21:b2:13:f2:33:e0:ea:e0:c8:63:7c:dd:06:c7:3c: - ba:a4:bd:a0:9b:8d:a1:1a:7d:3a:d7:c9:f3:35:4e:c5:76:6b: - 6d:50:d1:95:23:e8:c0:7f:3d:3f:45:08:10:77:6b:29:68:cc: - dd:b6:20:f8:c1:15:4c:6f:e2:ab:9d:61:13:dd:bc:c5:e7:98: - cc:23:29:ba:1c:b6:21:c0:b0:b6:e9:de:2b:43:d7:ca:7b:28: - 6a:fa:4c:c9:39:4d:e1:40:ed:e6:c0:16:9d:69:b2:f9:bf:db: - 50:27:3c:b3 + Signature Value: + 83:d7:44:cb:2d:2e:1e:83:47:9b:e0:24:24:89:90:12:96:a8: + f4:c7:ac:ea:8c:dc:ff:93:40:bb:a2:3a:57:60:fd:94:b1:e2: + c9:56:be:a5:12:b5:b9:2a:50:57:48:fd:5b:90:96:7b:52:d3: + a4:3f:a2:3c:cb:2e:2d:a9:19:17:9a:30:b0:49:cd:78:25:98: + 1e:f5:3b:37:fa:ec:cb:4d:45:46:b8:45:7f:97:b6:f3:79:e6: + 2d:31:75:2c:80:f9:db:3b:af:94:31:6b:63:e4:5b:78:7f:6d: + 52:84:22:60:56:3b:37:0f:8b:7b:5f:5c:f6:f3:f0:1f:d9:00: + 8b:2a:ca:df:0e:03:94:90:d0:f4:ef:a5:47:8a:b6:7c:db:cf: + 05:47:70:73:5d:b2:41:44:a0:a0:0e:62:39:7f:cc:06:87:13: + 35:74:8c:9e:2c:46:2e:e5:0a:d3:92:7a:83:8d:22:8c:06:b3: + 2f:0d:5c:26:9a:e4:19:cb:61:45:5a:2a:cb:8e:91:e6:63:58: + 38:c3:14:db:07:8d:1a:9e:dd:f1:07:58:71:de:3d:0b:6c:c1: + 98:8b:66:33:26:d9:61:db:01:c7:30:b8:e8:0a:bf:7a:58:6b: + 98:6c:a7:3c:2c:f8:60:b7:05:7b:73:8b:d6:c5:c8:d5:5a:25: + 03:df:e7:fc -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu -fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc -vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX -PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J -EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 -tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj -ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L +DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ +tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD +bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV ++2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW +r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj +ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs -GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 -5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp -l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 -oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 -xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAg9dEyy0uHoNHm+AkJImQEpao9Mes +6ozc/5NAu6I6V2D9lLHiyVa+pRK1uSpQV0j9W5CWe1LTpD+iPMsuLakZF5owsEnN +eCWYHvU7N/rsy01FRrhFf5e283nmLTF1LID52zuvlDFrY+RbeH9tUoQiYFY7Nw+L +e19c9vPwH9kAiyrK3w4DlJDQ9O+lR4q2fNvPBUdwc12yQUSgoA5iOX/MBocTNXSM +nixGLuUK05J6g40ijAazLw1cJprkGcthRVoqy46R5mNYOMMU2weNGp7d8QdYcd49 +C2zBmItmMybZYdsBxzC46Aq/elhrmGynPCz4YLcFe3OL1sXI1VolA9/n/A== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int-ecc-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,48 +5,48 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:58 2020 GMT - Not After : Jun 11 19:17:58 2040 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 22 12:10:09 2043 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA ECC, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: - 04:c6:9c:cd:8f:e5:ec:5b:d8:b0:fc:91:20:e2:0b: - 3b:51:53:54:4b:89:43:8e:00:de:91:ae:d3:90:f3: - 85:dc:cc:3d:11:08:15:76:82:e2:92:35:4a:d4:45: - 8e:83:36:82:62:b8:4d:07:85:0b:a5:54:e0:14:e8: - 93:de:7f:92:e8 + 04:95:df:1c:b2:9e:20:a9:1d:a2:5b:ab:5c:9b:a8: + 66:06:29:e6:b2:d8:e3:14:a6:c3:c1:b4:ad:4d:44: + 18:20:1e:5d:67:fd:15:1d:6d:25:e1:17:b1:71:ca: + 85:03:f0:d2:af:41:66:46:36:6d:ea:41:cb:4f:c8: + 4a:d0:a0:61:8c ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Subject Key Identifier: - 13:B5:79:59:32:B3:BB:B4:47:B3:34:0E:80:C0:83:1E:AA:82:C8:5B + 97:1D:60:C3:87:22:59:9B:60:1F:84:B4:99:1C:88:4D:BF:DA:1E:6E X509v3 Authority Key Identifier: - keyid:56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21 - + 56:8E:9A:C3:F0:42:DE:18:B9:45:55:6E:F9:93:CF:EA:C3:F3:A5:21 X509v3 Basic Constraints: critical CA:TRUE, pathlen:1 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:8a:51:91:f6:92:c5:4a:69:65:db:5b:90:c3: - 90:6a:c0:96:e7:26:7a:af:18:91:2c:6b:67:55:40:18:6c:c1: - a6:02:21:00:96:cc:9d:37:ad:ea:79:52:6e:4d:41:93:db:64: - 7f:e7:42:b9:f1:12:90:f4:84:5c:73:b1:21:d8:fb:55:fe:6f + Signature Value: + 30:46:02:21:00:e1:e7:6f:05:9e:1d:62:41:4e:9d:1e:38:67: + e9:9e:3b:65:dc:15:fc:eb:32:85:84:5e:02:f3:8e:7b:12:f7: + 99:02:21:00:92:77:65:b1:bd:fb:b2:a4:41:87:c9:9e:3d:e0: + 39:02:f3:db:42:31:bf:fb:6d:fd:74:be:a3:e3:74:fc:f5:64 -----BEGIN CERTIFICATE----- MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe -ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD -VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD +wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD +VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA -GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v +MAoGCCqGSM49BAMCA0kAMEYCIQDh528Fnh1iQU6dHjhn6Z47ZdwV/OsyhYReAvOO +exL3mQIhAJJ3ZbG9+7KkQYfJnj3gOQLz20Ixv/tt/XS+o+N0/PVk -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,80 +5,80 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:57 2020 GMT - Not After : Jun 11 19:17:57 2040 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 22 12:10:09 2043 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) + Public-Key: (2048 bit) Modulus: - 00:a0:2f:a1:02:30:5d:19:a1:8e:44:86:d4:93:f7: - f1:53:ba:3f:d2:24:df:ff:cb:af:8f:a6:e7:f9:87: - 9a:1f:00:cc:8f:40:86:78:3a:1b:9a:78:0e:e3:6e: - da:f3:e7:6c:57:76:31:cf:03:21:9a:c8:79:29:60: - db:ee:d8:a9:15:b4:67:5b:77:9a:86:f9:db:43:cc: - a2:0f:91:e6:70:4f:1e:6e:14:b1:8d:f0:a1:e5:39: - 77:a1:92:97:88:4a:26:f1:88:98:24:6c:fd:46:e2: - 71:07:5d:af:d4:bc:a8:8c:5d:ee:43:08:da:a7:ec: - 09:51:ed:ad:cd:75:8b:58:c7:a1:98:56:e7:19:78: - 93:4b:53:77:b7:da:79:7d:70:84:bb:1d:e9:a0:3c: - 02:bc:a7:96:fa:bb:98:90:ae:35:19:d0:e7:64:1e: - 9d:09:a1:06:f2:c2:fd:cb:a3:29:2c:c0:79:f8:e9: - e9:93:67:8c:35:2e:a1:49:a0:34:6c:38:1d:6b:4c: - a5:ba:c7:84:80:95:17:12:cb:dd:a7:f6:2e:2c:c7: - 0f:c1:54:1f:97:6c:01:3b:da:2e:c7:dc:53:c9:26: - e6:9a:66:a8:7f:55:fa:cd:72:18:69:87:4e:8c:e4: - 02:dd:f7:31:1a:a3:6e:cd:88:43:70:b4:34:6d:a6: - 86:75 + 00:cf:c9:3d:59:01:9f:1d:77:91:56:cb:ab:06:82: + c1:81:31:9a:e2:f9:c6:f9:a3:40:2d:86:42:d7:5f: + 41:a5:05:42:0f:5f:2b:6b:bd:29:92:e5:52:c6:5c: + f9:7e:9d:fb:8e:d6:69:8c:03:91:87:1c:1f:bf:24: + 59:44:cc:ef:af:92:2a:06:e1:a1:01:5b:04:57:8a: + 1a:b6:04:e2:c2:3c:10:3c:42:31:01:aa:c3:f2:32: + 1e:01:95:d0:91:a7:66:c1:22:68:36:53:2a:52:03: + eb:b5:9b:82:01:24:f9:d1:ae:fb:53:4c:5a:06:e5: + 6e:5a:d6:ac:5b:28:1a:53:e8:d7:a5:ce:6e:9c:34: + c3:08:0b:cb:2f:8e:df:ef:8c:35:f5:b0:bc:5d:0f: + ae:0a:4a:cf:54:01:d2:3c:b4:78:ee:48:10:56:80: + 4f:83:87:4e:67:1f:4f:17:2e:3e:2d:f5:6d:c9:07: + a2:3e:32:92:0f:1e:a4:0b:55:a6:1f:84:ef:9d:75: + ef:66:7c:75:f7:e7:40:3a:9c:c1:33:42:3d:2f:7f: + 99:5d:7b:04:d5:a9:6c:41:e8:89:16:58:fd:3a:a0: + 04:bd:77:d6:63:5e:6a:13:59:37:5f:f1:59:01:45: + 48:9c:8b:f7:16:f4:50:f7:5a:b4:5a:33:f6:f5:41: + c1:3d Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: - 7A:8B:1D:4E:A3:40:C8:CE:58:5F:8D:FC:FF:46:2C:75:41:D9:03:5E + 0D:C9:60:20:43:58:81:E0:9A:21:EF:66:16:DC:6E:21:25:DF:2B:45 X509v3 Authority Key Identifier: - keyid:83:1C:F1:98:85:EC:6E:06:45:34:DE:51:C0:BA:B7:2B:67:32:66:4D - + EF:69:E0:F7:D5:1D:E6:99:EC:DC:6D:D0:F7:E2:B9:5C:64:71:83:35 X509v3 Basic Constraints: critical CA:TRUE, pathlen:1 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0c:72:99:ed:e7:03:58:c2:2b:88:d2:aa:43:31:84:18:2f:de: - c5:5d:e0:20:d8:54:3c:5e:2b:87:2a:9f:96:b1:ef:be:d7:c7: - 27:71:68:ac:71:61:b8:6e:d1:aa:4b:2f:ef:d4:37:e7:bb:87: - 90:63:48:38:9b:20:15:bd:bc:af:8a:b4:af:53:91:8e:84:11: - 14:ea:6f:85:f4:4e:ba:0a:49:91:b3:19:99:2a:d1:f9:a7:a7: - 6b:fd:7f:78:88:7b:d3:7d:2c:b1:9f:70:15:1a:db:86:9b:ce: - b7:07:25:ec:39:8c:59:a3:d2:d1:cc:18:15:14:a0:85:4d:4f: - fb:9a:47:2f:dc:66:c7:7d:7c:12:89:48:58:d4:cb:1a:1b:12: - ba:9c:ed:5c:8c:bf:72:0e:5f:8e:42:34:4b:6c:3e:04:6f:d9: - 50:e3:28:93:6b:13:fd:6b:d6:2d:1b:cd:fb:fe:0b:a3:8c:df: - c8:e6:ad:9e:69:8a:93:96:d7:84:31:bb:ca:f2:db:e2:18:c9: - f1:91:8a:c7:06:9f:c2:0a:e9:b4:5f:e3:7b:20:fc:1a:16:1c: - 02:53:12:cd:66:45:55:6e:b1:c0:95:2d:2b:d6:19:b8:99:4e: - 1f:1b:9c:fb:b9:fe:8c:7e:32:57:f3:80:e9:f8:be:25:2f:03: - 46:3c:b3:0a + Signature Value: + 86:c3:f8:62:d2:10:a0:b4:da:78:e9:85:c5:99:04:24:9e:77: + 1a:58:a4:9f:26:c7:58:5b:b8:76:80:57:ce:20:a4:e5:de:21: + 21:3d:70:01:4d:0f:6d:5a:f6:3d:48:68:d2:38:c5:ea:d4:9f: + a4:00:b2:e4:de:70:6b:58:b9:a2:a9:9b:dd:a6:a6:8e:6c:c4: + f9:5f:d7:17:45:85:be:e8:2f:fb:d2:82:d2:ab:2c:e2:ff:35: + 20:b4:6c:06:7e:08:51:7a:af:19:73:58:f3:a8:48:65:0a:4f: + 67:44:7e:c0:fd:4b:94:94:b1:4c:56:85:7a:31:af:09:03:fa: + cc:5d:85:55:0b:ac:1b:6a:c9:aa:c4:bb:e4:e0:ad:42:38:f1: + 6f:74:d7:db:0c:ca:01:e0:f3:4a:c7:eb:f2:6e:30:c6:8e:a3: + cf:5a:45:0f:7f:98:92:31:20:fc:26:21:34:15:06:4f:29:a3: + 5c:15:11:5b:04:94:d5:2c:9b:1e:5b:61:65:dc:6e:6c:00:05: + 01:ce:2b:48:54:f9:91:2b:4c:8c:bb:db:94:b5:08:53:11:97: + 15:01:bc:65:28:b6:a2:83:5f:f0:d8:79:84:17:27:75:2a:54: + c8:07:31:d7:50:05:51:07:4f:57:c8:bf:49:75:35:a1:39:af: + 66:ec:26:e1 -----BEGIN CERTIFICATE----- MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC +b20wHhcNMjMwOTI3MTIxMDA5WhcNNDMwOTIyMTIxMDA5WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E -htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp -YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH -Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 -u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS -y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw -tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf -BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ -AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr -iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI -OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb -hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f -jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK -xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ -JS8DRjyzCg== +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPyT1ZAZ8dd5FW +y6sGgsGBMZri+cb5o0AthkLXX0GlBUIPXytrvSmS5VLGXPl+nfuO1mmMA5GHHB+/ +JFlEzO+vkioG4aEBWwRXihq2BOLCPBA8QjEBqsPyMh4BldCRp2bBImg2UypSA+u1 +m4IBJPnRrvtTTFoG5W5a1qxbKBpT6Nelzm6cNMMIC8svjt/vjDX1sLxdD64KSs9U +AdI8tHjuSBBWgE+Dh05nH08XLj4t9W3JB6I+MpIPHqQLVaYfhO+dde9mfHX350A6 +nMEzQj0vf5ldewTVqWxB6IkWWP06oAS9d9ZjXmoTWTdf8VkBRUici/cW9FD3WrRa +M/b1QcE9AgMBAAGjZjBkMB0GA1UdDgQWBBQNyWAgQ1iB4Joh72YW3G4hJd8rRTAf +BgNVHSMEGDAWgBTvaeD31R3mmezcbdD34rlcZHGDNTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAhsP4YtIQoLTa +eOmFxZkEJJ53GliknybHWFu4doBXziCk5d4hIT1wAU0PbVr2PUho0jjF6tSfpACy +5N5wa1i5oqmb3aamjmzE+V/XF0WFvugv+9KC0qss4v81ILRsBn4IUXqvGXNY86hI +ZQpPZ0R+wP1LlJSxTFaFejGvCQP6zF2FVQusG2rJqsS75OCtQjjxb3TX2wzKAeDz +Ssfr8m4wxo6jz1pFD3+YkjEg/CYhNBUGTymjXBURWwSU1SybHlthZdxubAAFAc4r +SFT5kStMjLvblLUIUxGXFQG8ZSi2ooNf8Nh5hBcndSpUyAcx11AFUQdPV8i/SXU1 +oTmvZuwm4Q== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/ca-int2-ecc-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,49 +5,49 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate CA ECC, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:58 2020 GMT - Not After : Jun 11 19:17:58 2040 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 22 12:10:09 2043 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA ECC, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: - 04:ea:16:28:2c:27:5e:41:99:05:28:8b:99:fa:c5: - a2:74:3c:15:4d:52:f4:4b:2d:83:34:82:8e:d5:b6: - 3f:61:d0:87:eb:f8:4c:06:5e:ed:66:1e:8c:ca:a4: - f6:2a:76:4f:d7:26:09:4c:1e:89:b9:18:8e:d2:a3: - 66:3c:1b:3d:cb + 04:c7:b4:a9:9f:32:fb:a2:8f:6a:f3:2e:c1:5d:ca: + 08:ec:c6:9f:13:ad:f5:3e:9d:75:f7:e4:f2:16:99: + 37:f7:89:73:cf:54:81:5f:16:0c:04:78:85:33:ef: + 92:a2:f7:86:3f:c7:a1:ba:0a:74:17:c2:45:7a:77: + 13:a9:13:fd:d3 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Subject Key Identifier: - 1B:F4:BD:90:28:74:64:E3:33:5E:8B:64:A7:FC:AF:BA:F2:B9:55:E5 + 9F:AE:7B:7A:70:80:04:55:2B:C6:B7:0C:5B:79:E4:12:41:65:31:29 X509v3 Authority Key Identifier: - keyid:13:B5:79:59:32:B3:BB:B4:47:B3:34:0E:80:C0:83:1E:AA:82:C8:5B - + 97:1D:60:C3:87:22:59:9B:60:1F:84:B4:99:1C:88:4D:BF:DA:1E:6E X509v3 Basic Constraints: critical CA:TRUE, pathlen:1 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:20:4f:1b:d1:e1:d7:8e:73:b5:8b:f7:4d:0b:3d:fc: - 12:bc:6f:7c:ad:b9:12:70:30:37:41:27:ec:6b:35:06:8e:47: - 02:21:00:a1:55:91:b7:68:1e:32:66:37:68:10:0a:9f:36:ee: - c3:97:2b:85:b8:3c:47:3c:4a:ed:13:c5:5b:59:bc:b5:29 + Signature Value: + 30:46:02:21:00:85:d2:26:f9:75:6a:4b:e9:76:88:bb:37:d0: + 96:e6:bc:24:d0:8f:67:51:18:cf:69:58:b7:da:7b:c1:a3:da: + 41:02:21:00:fd:b7:36:be:ac:7c:43:6c:88:a8:b2:9b:2a:36: + 21:2e:64:20:dc:b5:9d:09:95:5b:33:29:93:88:9b:67:cb:0d -----BEGIN CERTIFICATE----- -MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIICoDCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL -mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj -ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME -GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G -A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 -b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ -vLUp +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMe0qZ8y+6KPavMu +wV3KCOzGnxOt9T6ddffk8haZN/eJc89UgV8WDAR4hTPvkqL3hj/HoboKdBfCRXp3 +E6kT/dOjZjBkMB0GA1UdDgQWBBSfrnt6cIAEVSvGtwxbeeQSQWUxKTAfBgNVHSME +GDAWgBSXHWDDhyJZm2AfhLSZHIhNv9oebjASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNJADBGAiEAhdIm+XVqS+l2iLs30Jbm +vCTQj2dRGM9pWLfae8Gj2kECIQD9tza+rHxDbIiospsqNiEuZCDctZ0JlVszKZOI +m2fLDQ== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,70 +3,70 @@ EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +LmNvbTAeFw0yMzA5MjcxMjEwMDlaFw0zMzA5MjQxMjEwMDlaMIGgMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv bGZTU0wgQ2xpZW50IENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFW/9A9EUJo9zpu38MVN 9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJDhHYWxlaVBswBqb32dRpC972psjYiX8dd f7SjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0OBBYE -FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFBv0vZAodGTjM16LZKf8 -r7ryuVXlMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB -BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAK6CPTUWc9Ue5ac0zydwQpncWVqKNiU3 -gYnFhKaVgJ2tAiEA2Y4dfm0koH4xgiUJ6OHYtrpOmV+5TeNmPhFhuuIqeuM= +FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFJ+ue3pwgARVK8a3DFt5 +5BJBZTEpMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB +BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAOD7alvrubi1X6XcihvnRLWc+kSktUr/ +ijQ9hxJst+ILAiEA8J5CctyYX1GIKkTeUthW0yMfRBIEyuBsPkOeRcZE3Gg= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIICoDCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL -mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj -ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME -GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G -A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 -b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ -vLUp +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMe0qZ8y+6KPavMu +wV3KCOzGnxOt9T6ddffk8haZN/eJc89UgV8WDAR4hTPvkqL3hj/HoboKdBfCRXp3 +E6kT/dOjZjBkMB0GA1UdDgQWBBSfrnt6cIAEVSvGtwxbeeQSQWUxKTAfBgNVHSME +GDAWgBSXHWDDhyJZm2AfhLSZHIhNv9oebjASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNJADBGAiEAhdIm+XVqS+l2iLs30Jbm +vCTQj2dRGM9pWLfae8Gj2kECIQD9tza+rHxDbIiospsqNiEuZCDctZ0JlVszKZOI +m2fLDQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe -ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD -VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD +wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD +VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA -GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v +MAoGCCqGSM49BAMCA0kAMEYCIQDh528Fnh1iQU6dHjhn6Z47ZdwV/OsyhYReAvOO +exL3mQIhAJJ3ZbG9+7KkQYfJnj3gOQLz20Ixv/tt/XS+o+N0/PVk -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-alt.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,7 +3,7 @@ MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTMzMDkyNDEyMTAwOVowgZwxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s ZlNTTCBDbGllbnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -14,83 +14,83 @@ hsKIQJk2g7oeQHIiF9dSZSRzsM7vGc2u/3hse8ASA9ROcg1QbTujO6OZXp3I2QyF s9mK2VQm2236rLv/JUzE0Xn0cdOGQBgTsGO1ck4wxJeEhi1WL9cV93/ArvX8W+X7 obrTAgMBAAGjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYD -VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFHqLHU6jQMjO -WF+N/P9GLHVB2QNeMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD -AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAD37nA7EM00jkoUtSldJc0AV -Kv/Ce+VmdWoG3r0Ji/3yQeW4r5Zc1Z5voFL6EBKwcY0gQ5kWKjlG7fU6swM1nYUe -5+75YUudIKIWdmlndwaD9cCXDNmxtdZ9d8CTJ6kn8DG0rI1zPPFzGXSv92cHaL3F -KJOI3ZCxEp9kprrEwEZ84wrbrsc5bJwBCrpk23TlAnI4zY6yLu8YwqbnbT+PxJLK -reAMivJIyuEcySCm3tPFI1R9EMfb9Yw5snlRP/PXFfIiR5t7ANhU48BzIWh81vLM -+rMnhagqZcdthdF3YnnPZD0kbMzSW7z++qmj6YWFH4eNbW/b8KS2WajxN6WNP50= +VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFA3JYCBDWIHg +miHvZhbcbiEl3ytFMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD +AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAMVo04Y2fc78PfvmRBzmYJuK +Q+zpya5skGuORdHkG44IQoksOYHD2kfNWwvZW9KXK2sSACTr5AodtXxQ4YzH8/+B +x4yF5VALgx3gqhxyjjhjsfeQWNKd46XDAyfL88ntKE9hm+oJZdUJ/PZXfm9wVRNm ++gZmchzaTRM0YAuHnyuyVqxigG7nWjCj6yw4LKmoegixFomZVEyOizD5QmZPX3Yr +oYWZ3Nai1TVYfqvgi59ba8HivCDfesspp9xen2KKY/Mh5hlcmqp1JvTxqKlXOeWD +ZuRW0xH9O/oER/Pf5KC0COxPKf/shBdi9215zVIYYJXboR8agBEmc9ve60de5Ks= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC +b20wHhcNMjMwOTI3MTIxMDA5WhcNNDMwOTIyMTIxMDA5WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E -htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp -YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH -Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 -u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS -y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw -tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf -BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ -AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr -iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI -OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb -hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f -jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK -xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ -JS8DRjyzCg== +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPyT1ZAZ8dd5FW +y6sGgsGBMZri+cb5o0AthkLXX0GlBUIPXytrvSmS5VLGXPl+nfuO1mmMA5GHHB+/ +JFlEzO+vkioG4aEBWwRXihq2BOLCPBA8QjEBqsPyMh4BldCRp2bBImg2UypSA+u1 +m4IBJPnRrvtTTFoG5W5a1qxbKBpT6Nelzm6cNMMIC8svjt/vjDX1sLxdD64KSs9U +AdI8tHjuSBBWgE+Dh05nH08XLj4t9W3JB6I+MpIPHqQLVaYfhO+dde9mfHX350A6 +nMEzQj0vf5ldewTVqWxB6IkWWP06oAS9d9ZjXmoTWTdf8VkBRUici/cW9FD3WrRa +M/b1QcE9AgMBAAGjZjBkMB0GA1UdDgQWBBQNyWAgQ1iB4Joh72YW3G4hJd8rRTAf +BgNVHSMEGDAWgBTvaeD31R3mmezcbdD34rlcZHGDNTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAhsP4YtIQoLTa +eOmFxZkEJJ53GliknybHWFu4doBXziCk5d4hIT1wAU0PbVr2PUho0jjF6tSfpACy +5N5wa1i5oqmb3aamjmzE+V/XF0WFvugv+9KC0qss4v81ILRsBn4IUXqvGXNY86hI +ZQpPZ0R+wP1LlJSxTFaFejGvCQP6zF2FVQusG2rJqsS75OCtQjjxb3TX2wzKAeDz +Ssfr8m4wxo6jz1pFD3+YkjEg/CYhNBUGTymjXBURWwSU1SybHlthZdxubAAFAc4r +SFT5kStMjLvblLUIUxGXFQG8ZSi2ooNf8Nh5hBcndSpUyAcx11AFUQdPV8i/SXU1 +oTmvZuwm4Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu -fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc -vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX -PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J -EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 -tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj -ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L +DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ +tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD +bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV ++2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW +r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj +ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs -GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 -5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp -l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 -oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 -xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAg9dEyy0uHoNHm+AkJImQEpao9Mes +6ozc/5NAu6I6V2D9lLHiyVa+pRK1uSpQV0j9W5CWe1LTpD+iPMsuLakZF5owsEnN +eCWYHvU7N/rsy01FRrhFf5e283nmLTF1LID52zuvlDFrY+RbeH9tUoQiYFY7Nw+L +e19c9vPwH9kAiyrK3w4DlJDQ9O+lR4q2fNvPBUdwc12yQUSgoA5iOX/MBocTNXSM +nixGLuUK05J6g40ijAazLw1cJprkGcthRVoqy46R5mNYOMMU2weNGp7d8QdYcd49 +C2zBmItmMybZYdsBxzC46Aq/elhrmGynPCz4YLcFe3OL1sXI1VolA9/n/A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,48 +3,48 @@ EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +LmNvbTAeFw0yMzA5MjcxMjEwMDlaFw0zMzA5MjQxMjEwMDlaMIGgMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv bGZTU0wgQ2xpZW50IENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFW/9A9EUJo9zpu38MVN 9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJDhHYWxlaVBswBqb32dRpC972psjYiX8dd f7SjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0OBBYE -FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFBv0vZAodGTjM16LZKf8 -r7ryuVXlMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB -BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAK6CPTUWc9Ue5ac0zydwQpncWVqKNiU3 -gYnFhKaVgJ2tAiEA2Y4dfm0koH4xgiUJ6OHYtrpOmV+5TeNmPhFhuuIqeuM= +FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFJ+ue3pwgARVK8a3DFt5 +5BJBZTEpMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB +BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAOD7alvrubi1X6XcihvnRLWc+kSktUr/ +ijQ9hxJst+ILAiEA8J5CctyYX1GIKkTeUthW0yMfRBIEyuBsPkOeRcZE3Gg= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIICoDCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL -mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj -ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME -GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G -A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 -b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ -vLUp +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMe0qZ8y+6KPavMu +wV3KCOzGnxOt9T6ddffk8haZN/eJc89UgV8WDAR4hTPvkqL3hj/HoboKdBfCRXp3 +E6kT/dOjZjBkMB0GA1UdDgQWBBSfrnt6cIAEVSvGtwxbeeQSQWUxKTAfBgNVHSME +GDAWgBSXHWDDhyJZm2AfhLSZHIhNv9oebjASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNJADBGAiEAhdIm+XVqS+l2iLs30Jbm +vCTQj2dRGM9pWLfae8Gj2kECIQD9tza+rHxDbIiospsqNiEuZCDctZ0JlVszKZOI +m2fLDQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe -ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD -VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD +wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD +VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA -GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v +MAoGCCqGSM49BAMCA0kAMEYCIQDh528Fnh1iQU6dHjhn6Z47ZdwV/OsyhYReAvOO +exL3mQIhAJJ3ZbG9+7KkQYfJnj3gOQLz20Ixv/tt/XS+o+N0/PVk -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-chain.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-chain.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,7 +3,7 @@ MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTMzMDkyNDEyMTAwOVowgZwxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s ZlNTTCBDbGllbnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -14,61 +14,61 @@ hsKIQJk2g7oeQHIiF9dSZSRzsM7vGc2u/3hse8ASA9ROcg1QbTujO6OZXp3I2QyF s9mK2VQm2236rLv/JUzE0Xn0cdOGQBgTsGO1ck4wxJeEhi1WL9cV93/ArvX8W+X7 obrTAgMBAAGjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYD -VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFHqLHU6jQMjO -WF+N/P9GLHVB2QNeMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD -AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAD37nA7EM00jkoUtSldJc0AV -Kv/Ce+VmdWoG3r0Ji/3yQeW4r5Zc1Z5voFL6EBKwcY0gQ5kWKjlG7fU6swM1nYUe -5+75YUudIKIWdmlndwaD9cCXDNmxtdZ9d8CTJ6kn8DG0rI1zPPFzGXSv92cHaL3F -KJOI3ZCxEp9kprrEwEZ84wrbrsc5bJwBCrpk23TlAnI4zY6yLu8YwqbnbT+PxJLK -reAMivJIyuEcySCm3tPFI1R9EMfb9Yw5snlRP/PXFfIiR5t7ANhU48BzIWh81vLM -+rMnhagqZcdthdF3YnnPZD0kbMzSW7z++qmj6YWFH4eNbW/b8KS2WajxN6WNP50= +VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFA3JYCBDWIHg +miHvZhbcbiEl3ytFMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD +AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAMVo04Y2fc78PfvmRBzmYJuK +Q+zpya5skGuORdHkG44IQoksOYHD2kfNWwvZW9KXK2sSACTr5AodtXxQ4YzH8/+B +x4yF5VALgx3gqhxyjjhjsfeQWNKd46XDAyfL88ntKE9hm+oJZdUJ/PZXfm9wVRNm ++gZmchzaTRM0YAuHnyuyVqxigG7nWjCj6yw4LKmoegixFomZVEyOizD5QmZPX3Yr +oYWZ3Nai1TVYfqvgi59ba8HivCDfesspp9xen2KKY/Mh5hlcmqp1JvTxqKlXOeWD +ZuRW0xH9O/oER/Pf5KC0COxPKf/shBdi9215zVIYYJXboR8agBEmc9ve60de5Ks= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC +b20wHhcNMjMwOTI3MTIxMDA5WhcNNDMwOTIyMTIxMDA5WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E -htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp -YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH -Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 -u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS -y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw -tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf -BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ -AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr -iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI -OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb -hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f -jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK -xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ -JS8DRjyzCg== +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPyT1ZAZ8dd5FW +y6sGgsGBMZri+cb5o0AthkLXX0GlBUIPXytrvSmS5VLGXPl+nfuO1mmMA5GHHB+/ +JFlEzO+vkioG4aEBWwRXihq2BOLCPBA8QjEBqsPyMh4BldCRp2bBImg2UypSA+u1 +m4IBJPnRrvtTTFoG5W5a1qxbKBpT6Nelzm6cNMMIC8svjt/vjDX1sLxdD64KSs9U +AdI8tHjuSBBWgE+Dh05nH08XLj4t9W3JB6I+MpIPHqQLVaYfhO+dde9mfHX350A6 +nMEzQj0vf5ldewTVqWxB6IkWWP06oAS9d9ZjXmoTWTdf8VkBRUici/cW9FD3WrRa +M/b1QcE9AgMBAAGjZjBkMB0GA1UdDgQWBBQNyWAgQ1iB4Joh72YW3G4hJd8rRTAf +BgNVHSMEGDAWgBTvaeD31R3mmezcbdD34rlcZHGDNTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAhsP4YtIQoLTa +eOmFxZkEJJ53GliknybHWFu4doBXziCk5d4hIT1wAU0PbVr2PUho0jjF6tSfpACy +5N5wa1i5oqmb3aamjmzE+V/XF0WFvugv+9KC0qss4v81ILRsBn4IUXqvGXNY86hI +ZQpPZ0R+wP1LlJSxTFaFejGvCQP6zF2FVQusG2rJqsS75OCtQjjxb3TX2wzKAeDz +Ssfr8m4wxo6jz1pFD3+YkjEg/CYhNBUGTymjXBURWwSU1SybHlthZdxubAAFAc4r +SFT5kStMjLvblLUIUxGXFQG8ZSi2ooNf8Nh5hBcndSpUyAcx11AFUQdPV8i/SXU1 +oTmvZuwm4Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu -fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc -vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX -PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J -EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 -tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj -ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L +DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ +tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD +bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV ++2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW +r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj +ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs -GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 -5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp -l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 -oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 -xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAg9dEyy0uHoNHm+AkJImQEpao9Mes +6ozc/5NAu6I6V2D9lLHiyVa+pRK1uSpQV0j9W5CWe1LTpD+iPMsuLakZF5owsEnN +eCWYHvU7N/rsy01FRrhFf5e283nmLTF1LID52zuvlDFrY+RbeH9tUoQiYFY7Nw+L +e19c9vPwH9kAiyrK3w4DlJDQ9O+lR4q2fNvPBUdwc12yQUSgoA5iOX/MBocTNXSM +nixGLuUK05J6g40ijAazLw1cJprkGcthRVoqy46R5mNYOMMU2weNGp7d8QdYcd49 +C2zBmItmMybZYdsBxzC46Aq/elhrmGynPCz4YLcFe3OL1sXI1VolA9/n/A== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,12 +5,12 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:58 2020 GMT - Not After : Jun 14 19:17:58 2030 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 24 12:10:09 2033 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Client Chain, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) + Public-Key: (2048 bit) Modulus: 00:c3:03:d1:2b:fe:39:a4:32:45:3b:53:c8:84:2b: 2a:7c:74:9a:bd:aa:2a:52:07:47:d6:a6:36:b2:07: @@ -39,34 +39,34 @@ X509v3 Subject Key Identifier: 33:D8:45:66:D7:68:87:18:7E:54:0D:70:27:91:C7:26:D7:85:65:C0 X509v3 Authority Key Identifier: - keyid:7A:8B:1D:4E:A3:40:C8:CE:58:5F:8D:FC:FF:46:2C:75:41:D9:03:5E - + 0D:C9:60:20:43:58:81:E0:9A:21:EF:66:16:DC:6E:21:25:DF:2B:45 X509v3 Key Usage: critical Digital Signature, Non Repudiation, Key Encipherment X509v3 Extended Key Usage: TLS Web Client Authentication, E-mail Protection Signature Algorithm: sha256WithRSAEncryption - 3d:fb:9c:0e:c4:33:4d:23:92:85:2d:4a:57:49:73:40:15:2a: - ff:c2:7b:e5:66:75:6a:06:de:bd:09:8b:fd:f2:41:e5:b8:af: - 96:5c:d5:9e:6f:a0:52:fa:10:12:b0:71:8d:20:43:99:16:2a: - 39:46:ed:f5:3a:b3:03:35:9d:85:1e:e7:ee:f9:61:4b:9d:20: - a2:16:76:69:67:77:06:83:f5:c0:97:0c:d9:b1:b5:d6:7d:77: - c0:93:27:a9:27:f0:31:b4:ac:8d:73:3c:f1:73:19:74:af:f7: - 67:07:68:bd:c5:28:93:88:dd:90:b1:12:9f:64:a6:ba:c4:c0: - 46:7c:e3:0a:db:ae:c7:39:6c:9c:01:0a:ba:64:db:74:e5:02: - 72:38:cd:8e:b2:2e:ef:18:c2:a6:e7:6d:3f:8f:c4:92:ca:ad: - e0:0c:8a:f2:48:ca:e1:1c:c9:20:a6:de:d3:c5:23:54:7d:10: - c7:db:f5:8c:39:b2:79:51:3f:f3:d7:15:f2:22:47:9b:7b:00: - d8:54:e3:c0:73:21:68:7c:d6:f2:cc:fa:b3:27:85:a8:2a:65: - c7:6d:85:d1:77:62:79:cf:64:3d:24:6c:cc:d2:5b:bc:fe:fa: - a9:a3:e9:85:85:1f:87:8d:6d:6f:db:f0:a4:b6:59:a8:f1:37: - a5:8d:3f:9d + Signature Value: + c5:68:d3:86:36:7d:ce:fc:3d:fb:e6:44:1c:e6:60:9b:8a:43: + ec:e9:c9:ae:6c:90:6b:8e:45:d1:e4:1b:8e:08:42:89:2c:39: + 81:c3:da:47:cd:5b:0b:d9:5b:d2:97:2b:6b:12:00:24:eb:e4: + 0a:1d:b5:7c:50:e1:8c:c7:f3:ff:81:c7:8c:85:e5:50:0b:83: + 1d:e0:aa:1c:72:8e:38:63:b1:f7:90:58:d2:9d:e3:a5:c3:03: + 27:cb:f3:c9:ed:28:4f:61:9b:ea:09:65:d5:09:fc:f6:57:7e: + 6f:70:55:13:66:fa:06:66:72:1c:da:4d:13:34:60:0b:87:9f: + 2b:b2:56:ac:62:80:6e:e7:5a:30:a3:eb:2c:38:2c:a9:a8:7a: + 08:b1:16:89:99:54:4c:8e:8b:30:f9:42:66:4f:5f:76:2b:a1: + 85:99:dc:d6:a2:d5:35:58:7e:ab:e0:8b:9f:5b:6b:c1:e2:bc: + 20:df:7a:cb:29:a7:dc:5e:9f:62:8a:63:f3:21:e6:19:5c:9a: + aa:75:26:f4:f1:a8:a9:57:39:e5:83:66:e4:56:d3:11:fd:3b: + fa:04:47:f3:df:e4:a0:b4:08:ec:4f:29:ff:ec:84:17:62:f7: + 6d:79:cd:52:18:60:95:db:a1:1f:1a:80:11:26:73:db:de:eb: + 47:5e:e4:ab -----BEGIN CERTIFICATE----- MIIESzCCAzOgAwIBAgICEAMwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTMzMDkyNDEyMTAwOVowgZwxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s ZlNTTCBDbGllbnQgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,12 +77,12 @@ hsKIQJk2g7oeQHIiF9dSZSRzsM7vGc2u/3hse8ASA9ROcg1QbTujO6OZXp3I2QyF s9mK2VQm2236rLv/JUzE0Xn0cdOGQBgTsGO1ck4wxJeEhi1WL9cV93/ArvX8W+X7 obrTAgMBAAGjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYD -VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFHqLHU6jQMjO -WF+N/P9GLHVB2QNeMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD -AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAD37nA7EM00jkoUtSldJc0AV -Kv/Ce+VmdWoG3r0Ji/3yQeW4r5Zc1Z5voFL6EBKwcY0gQ5kWKjlG7fU6swM1nYUe -5+75YUudIKIWdmlndwaD9cCXDNmxtdZ9d8CTJ6kn8DG0rI1zPPFzGXSv92cHaL3F -KJOI3ZCxEp9kprrEwEZ84wrbrsc5bJwBCrpk23TlAnI4zY6yLu8YwqbnbT+PxJLK -reAMivJIyuEcySCm3tPFI1R9EMfb9Yw5snlRP/PXFfIiR5t7ANhU48BzIWh81vLM -+rMnhagqZcdthdF3YnnPZD0kbMzSW7z++qmj6YWFH4eNbW/b8KS2WajxN6WNP50= +VR0OBBYEFDPYRWbXaIcYflQNcCeRxybXhWXAMB8GA1UdIwQYMBaAFA3JYCBDWIHg +miHvZhbcbiEl3ytFMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcD +AgYIKwYBBQUHAwQwDQYJKoZIhvcNAQELBQADggEBAMVo04Y2fc78PfvmRBzmYJuK +Q+zpya5skGuORdHkG44IQoksOYHD2kfNWwvZW9KXK2sSACTr5AodtXxQ4YzH8/+B +x4yF5VALgx3gqhxyjjhjsfeQWNKd46XDAyfL88ntKE9hm+oJZdUJ/PZXfm9wVRNm ++gZmchzaTRM0YAuHnyuyVqxigG7nWjCj6yw4LKmoegixFomZVEyOizD5QmZPX3Yr +oYWZ3Nai1TVYfqvgi59ba8HivCDfesspp9xen2KKY/Mh5hlcmqp1JvTxqKlXOeWD +ZuRW0xH9O/oER/Pf5KC0COxPKf/shBdi9215zVIYYJXboR8agBEmc9ve60de5Ks= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/client-int-ecc-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA ECC, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:58 2020 GMT - Not After : Jun 14 19:17:58 2030 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 24 12:10:09 2033 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Client Chain ECC, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -27,31 +27,31 @@ X509v3 Subject Key Identifier: EB:D4:4B:59:6B:95:61:3F:51:57:B6:04:4D:89:41:88:44:5C:AB:F2 X509v3 Authority Key Identifier: - keyid:1B:F4:BD:90:28:74:64:E3:33:5E:8B:64:A7:FC:AF:BA:F2:B9:55:E5 - + 9F:AE:7B:7A:70:80:04:55:2B:C6:B7:0C:5B:79:E4:12:41:65:31:29 X509v3 Key Usage: critical Digital Signature, Non Repudiation, Key Encipherment X509v3 Extended Key Usage: TLS Web Client Authentication, E-mail Protection Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:ae:82:3d:35:16:73:d5:1e:e5:a7:34:cf:27: - 70:42:99:dc:59:5a:8a:36:25:37:81:89:c5:84:a6:95:80:9d: - ad:02:21:00:d9:8e:1d:7e:6d:24:a0:7e:31:82:25:09:e8:e1: - d8:b6:ba:4e:99:5f:b9:4d:e3:66:3e:11:61:ba:e2:2a:7a:e3 + Signature Value: + 30:46:02:21:00:e0:fb:6a:5b:eb:b9:b8:b5:5f:a5:dc:8a:1b: + e7:44:b5:9c:fa:44:a4:b5:4a:ff:8a:34:3d:87:12:6c:b7:e2: + 0b:02:21:00:f0:9e:42:72:dc:98:5f:51:88:2a:44:de:52:d8: + 56:d3:23:1f:44:12:04:ca:e0:6c:3e:43:9e:45:c6:44:dc:68 -----BEGIN CERTIFICATE----- MIICyDCCAm2gAwIBAgICEAcwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +LmNvbTAeFw0yMzA5MjcxMjEwMDlaFw0zMzA5MjQxMjEwMDlaMIGgMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv bGZTU0wgQ2xpZW50IENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABFW/9A9EUJo9zpu38MVN 9XB71OwkjhmA7FpMoiQDYiyb2u+iNRJDhHYWxlaVBswBqb32dRpC972psjYiX8dd f7SjgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0OBBYE -FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFBv0vZAodGTjM16LZKf8 -r7ryuVXlMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB -BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAK6CPTUWc9Ue5ac0zydwQpncWVqKNiU3 -gYnFhKaVgJ2tAiEA2Y4dfm0koH4xgiUJ6OHYtrpOmV+5TeNmPhFhuuIqeuM= +FOvUS1lrlWE/UVe2BE2JQYhEXKvyMB8GA1UdIwQYMBaAFJ+ue3pwgARVK8a3DFt5 +5BJBZTEpMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB +BQUHAwQwCgYIKoZIzj0EAwIDSQAwRgIhAOD7alvrubi1X6XcihvnRLWc+kSktUr/ +ijQ9hxJst+ILAiEA8J5CctyYX1GIKkTeUthW0yMfRBIEyuBsPkOeRcZE3Gg= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/genintcerts.sh mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/genintcerts.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/genintcerts.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/genintcerts.sh 2024-08-03 07:30:00.000000000 +0000 @@ -262,6 +262,10 @@ openssl x509 -in ./certs/intermediate/server-int-cert.pem > ./certs/intermediate/server-chain.pem openssl x509 -in ./certs/intermediate/ca-int2-cert.pem >> ./certs/intermediate/server-chain.pem openssl x509 -in ./certs/intermediate/ca-int-cert.pem >> ./certs/intermediate/server-chain.pem + +openssl x509 -in ./certs/intermediate/server-int-cert.pem > ./certs/intermediate/server-chain-short.pem +openssl x509 -in ./certs/intermediate/ca-int2-cert.pem >> ./certs/intermediate/server-chain-short.pem + cat ./certs/intermediate/server-int-cert.der ./certs/intermediate/ca-int2-cert.der ./certs/intermediate/ca-int-cert.der > ./certs/intermediate/server-chain.der openssl x509 -in ./certs/intermediate/client-int-cert.pem > ./certs/intermediate/client-chain.pem diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -34,6 +34,7 @@ certs/intermediate/server-chain-alt.pem \ certs/intermediate/server-chain-ecc.der \ certs/intermediate/server-chain-ecc.pem \ + certs/intermediate/server-chain-short.pem \ certs/intermediate/server-chain.der \ certs/intermediate/server-chain.pem \ certs/intermediate/server-int-cert.der \ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,76 +1,76 @@ -----BEGIN CERTIFICATE----- -MIIDczCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw +MIIDcjCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +LmNvbTAeFw0yMzA5MjcxMjEwMDlaFw0zMzA5MjQxMjEwMDlaMIGgMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv bGZTU0wgU2VydmVyIENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLszrEwnUErGSqUEwzze nzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eSIX/wzxjakRECNIboIFgzC4A0 idijggE6MIIBNjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNVHQ4E -FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUG/S9kCh0ZOMz -Xotkp/yvuvK5VeWhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo +FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUn657enCABFUr +xrcMW3nkEkFlMSmhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo aW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYD VQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1lZGlhdGUg Q0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggIQBTAOBgNV -HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAw -RgIhAJjQ4vmJyrJ0NqczC/4UkBBFei1tQETbCOxFeYtOkeDVAiEA6hEbwbWVvL/Z -9Zk30dLmuKoZvZdCCbsKUWxOomFy6EQ= +HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSAAw +RQIhAM2Jz84maR/vYDetyePIYQb6+rhvPGsSVaD/4vqf+EeTAiBpSi4/DcbnTtEp +5TcCA6ktiL74CL4eyw0GoyGPqGCjtQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIICoDCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL -mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj -ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME -GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G -A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 -b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ -vLUp +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMe0qZ8y+6KPavMu +wV3KCOzGnxOt9T6ddffk8haZN/eJc89UgV8WDAR4hTPvkqL3hj/HoboKdBfCRXp3 +E6kT/dOjZjBkMB0GA1UdDgQWBBSfrnt6cIAEVSvGtwxbeeQSQWUxKTAfBgNVHSME +GDAWgBSXHWDDhyJZm2AfhLSZHIhNv9oebjASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNJADBGAiEAhdIm+XVqS+l2iLs30Jbm +vCTQj2dRGM9pWLfae8Gj2kECIQD9tza+rHxDbIiospsqNiEuZCDctZ0JlVszKZOI +m2fLDQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe -ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD -VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD +wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD +VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA -GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v +MAoGCCqGSM49BAMCA0kAMEYCIQDh528Fnh1iQU6dHjhn6Z47ZdwV/OsyhYReAvOO +exL3mQIhAJJ3ZbG9+7KkQYfJnj3gOQLz20Ixv/tt/XS+o+N0/PVk -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-alt.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,7 +3,7 @@ MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTMzMDkyNDEyMTAwOVowgZwxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s ZlNTTCBTZXJ2ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -14,87 +14,87 @@ /WZRDL1Us+FtXxy8I3PRCQOJFNIQuWTDKtChlkq84dQaW8egwMFjeA9ENzAyloAy I5Whd7oT0pdz4l0lyWoNwzlgpLSwaUJCCenYCLwzILNYIqeq68Th5mGDxdKW39nQ T63XAgMBAAGjggE2MIIBMjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAd -BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUeosd -TqNAyM5YX438/0YsdUHZA16hgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUDclg +IENYgeCaIe9mFtxuISXfK0WhgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhABMA4G A1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsF -AAOCAQEAkpC/Vl2YIc7WCo18r7qbWdgzwSEPbzEcE8Wf3qh97+XFC4t+GMud2N7J -PTLu/9CJmDszaNvNZl6d7tpTNGUh40P2p7J5tXksLiM/PmFZgIj9w8UE6a1SqVh9 -78WnhRpVYOENfhHIulnYxh02BGOOfa8o/RN6MvUp1wrvBjyFkLbGTzmxGO6+F6VE -F4ezlKE0Ykx3yAaTyAP18qpb/9CarfOyyluBVO8bOfjGd/GAUA8MbpQUYqP8mY7S -4za4JRttVdIbIZfThOaW7p+zAERwOp/8YuJCGpMe/J7sjRx6GrETRk7rDSi5TQjm -CTHAuy4H4MupWgaHxI66ay91VIU29Q== +AAOCAQEASSfw2AHc6qbwlL8ibcem+R8IfnWxlqxWUeByi2UsObd0eJfaIVLRQ0zX +CQ4TgIroRZAPOeRy30AIIfS1aaXCBCFX2GuRF9RV3HNu18zH2MFm7pRvGEeNI8/C +pD2kRdIafLgjeeK0rHEmpBrjopfayIUA5x97sgXb7ZXYFlkLeyMB6+ZPcMKut35b +LFpzbtKopj4bnni1O30fX6lLyoNBf0gYtpm5j1ZsMwpwym6m8JNdOpIxLcd8GlBA +SV3Uso2a0Bg3TiWhmDz/XzsTXkq8+RzJKp/y9nDy9uziIyYnyIroCoFwX2pn/Fds +b9r+Mz8hlmW2T/iJWpIO4S79Dhb1bg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC +b20wHhcNMjMwOTI3MTIxMDA5WhcNNDMwOTIyMTIxMDA5WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E -htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp -YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH -Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 -u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS -y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw -tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf -BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ -AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr -iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI -OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb -hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f -jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK -xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ -JS8DRjyzCg== +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPyT1ZAZ8dd5FW +y6sGgsGBMZri+cb5o0AthkLXX0GlBUIPXytrvSmS5VLGXPl+nfuO1mmMA5GHHB+/ +JFlEzO+vkioG4aEBWwRXihq2BOLCPBA8QjEBqsPyMh4BldCRp2bBImg2UypSA+u1 +m4IBJPnRrvtTTFoG5W5a1qxbKBpT6Nelzm6cNMMIC8svjt/vjDX1sLxdD64KSs9U +AdI8tHjuSBBWgE+Dh05nH08XLj4t9W3JB6I+MpIPHqQLVaYfhO+dde9mfHX350A6 +nMEzQj0vf5ldewTVqWxB6IkWWP06oAS9d9ZjXmoTWTdf8VkBRUici/cW9FD3WrRa +M/b1QcE9AgMBAAGjZjBkMB0GA1UdDgQWBBQNyWAgQ1iB4Joh72YW3G4hJd8rRTAf +BgNVHSMEGDAWgBTvaeD31R3mmezcbdD34rlcZHGDNTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAhsP4YtIQoLTa +eOmFxZkEJJ53GliknybHWFu4doBXziCk5d4hIT1wAU0PbVr2PUho0jjF6tSfpACy +5N5wa1i5oqmb3aamjmzE+V/XF0WFvugv+9KC0qss4v81ILRsBn4IUXqvGXNY86hI +ZQpPZ0R+wP1LlJSxTFaFejGvCQP6zF2FVQusG2rJqsS75OCtQjjxb3TX2wzKAeDz +Ssfr8m4wxo6jz1pFD3+YkjEg/CYhNBUGTymjXBURWwSU1SybHlthZdxubAAFAc4r +SFT5kStMjLvblLUIUxGXFQG8ZSi2ooNf8Nh5hBcndSpUyAcx11AFUQdPV8i/SXU1 +oTmvZuwm4Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu -fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc -vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX -PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J -EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 -tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj -ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L +DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ +tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD +bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV ++2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW +r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj +ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs -GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 -5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp -l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 -oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 -xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAg9dEyy0uHoNHm+AkJImQEpao9Mes +6ozc/5NAu6I6V2D9lLHiyVa+pRK1uSpQV0j9W5CWe1LTpD+iPMsuLakZF5owsEnN +eCWYHvU7N/rsy01FRrhFf5e283nmLTF1LID52zuvlDFrY+RbeH9tUoQiYFY7Nw+L +e19c9vPwH9kAiyrK3w4DlJDQ9O+lR4q2fNvPBUdwc12yQUSgoA5iOX/MBocTNXSM +nixGLuUK05J6g40ijAazLw1cJprkGcthRVoqy46R5mNYOMMU2weNGp7d8QdYcd49 +C2zBmItmMybZYdsBxzC46Aq/elhrmGynPCz4YLcFe3OL1sXI1VolA9/n/A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,54 +1,54 @@ -----BEGIN CERTIFICATE----- -MIIDczCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw +MIIDcjCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +LmNvbTAeFw0yMzA5MjcxMjEwMDlaFw0zMzA5MjQxMjEwMDlaMIGgMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv bGZTU0wgU2VydmVyIENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLszrEwnUErGSqUEwzze nzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eSIX/wzxjakRECNIboIFgzC4A0 idijggE6MIIBNjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNVHQ4E -FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUG/S9kCh0ZOMz -Xotkp/yvuvK5VeWhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo +FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUn657enCABFUr +xrcMW3nkEkFlMSmhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo aW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYD VQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1lZGlhdGUg Q0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggIQBTAOBgNV -HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAw -RgIhAJjQ4vmJyrJ0NqczC/4UkBBFei1tQETbCOxFeYtOkeDVAiEA6hEbwbWVvL/Z -9Zk30dLmuKoZvZdCCbsKUWxOomFy6EQ= +HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSAAw +RQIhAM2Jz84maR/vYDetyePIYQb6+rhvPGsSVaD/4vqf+EeTAiBpSi4/DcbnTtEp +5TcCA6ktiL74CL4eyw0GoyGPqGCjtQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIICnzCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw +MIICoDCCAkWgAwIBAgICEAUwCgYIKoZIzj0EAwIwgaMxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJ bnRlcm1lZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaQxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaQxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29s ZlNTTCBJbnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOoWKCwnXkGZBSiL -mfrFonQ8FU1S9EstgzSCjtW2P2HQh+v4TAZe7WYejMqk9ip2T9cmCUweibkYjtKj -ZjwbPcujZjBkMB0GA1UdDgQWBBQb9L2QKHRk4zNei2Sn/K+68rlV5TAfBgNVHSME -GDAWgBQTtXlZMrO7tEezNA6AwIMeqoLIWzASBgNVHRMBAf8ECDAGAQH/AgEBMA4G -A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNIADBFAiBPG9Hh145ztYv3TQs9/BK8 -b3ytuRJwMDdBJ+xrNQaORwIhAKFVkbdoHjJmN2gQCp827sOXK4W4PEc8Su0TxVtZ -vLUp +b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMe0qZ8y+6KPavMu +wV3KCOzGnxOt9T6ddffk8haZN/eJc89UgV8WDAR4hTPvkqL3hj/HoboKdBfCRXp3 +E6kT/dOjZjBkMB0GA1UdDgQWBBSfrnt6cIAEVSvGtwxbeeQSQWUxKTAfBgNVHSME +GDAWgBSXHWDDhyJZm2AfhLSZHIhNv9oebjASBgNVHRMBAf8ECDAGAQH/AgEBMA4G +A1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgNJADBGAiEAhdIm+XVqS+l2iLs30Jbm +vCTQj2dRGM9pWLfae8Gj2kECIQD9tza+rHxDbIiospsqNiEuZCDctZ0JlVszKZOI +m2fLDQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICkzCCAjigAwIBAgICEAQwCgYIKoZIzj0EAwIwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1OFoXDTQwMDYxMTE5MTc1OFowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkw -EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExpzNj+XsW9iw/JEg4gs7UVNUS4lDjgDe -ka7TkPOF3Mw9EQgVdoLikjVK1EWOgzaCYrhNB4ULpVTgFOiT3n+S6KNmMGQwHQYD -VR0OBBYEFBO1eVkys7u0R7M0DoDAgx6qgshbMB8GA1UdIwQYMBaAFFaOmsPwQt4Y +EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEld8csp4gqR2iW6tcm6hmBinmstjjFKbD +wbStTUQYIB5dZ/0VHW0l4RexccqFA/DSr0FmRjZt6kHLT8hK0KBhjKNmMGQwHQYD +VR0OBBYEFJcdYMOHIlmbYB+EtJkciE2/2h5uMB8GA1UdIwQYMBaAFFaOmsPwQt4Y uUVVbvmTz+rD86UhMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgGG -MAoGCCqGSM49BAMCA0kAMEYCIQCKUZH2ksVKaWXbW5DDkGrAlucmeq8YkSxrZ1VA -GGzBpgIhAJbMnTet6nlSbk1Bk9tkf+dCufESkPSEXHOxIdj7Vf5v +MAoGCCqGSM49BAMCA0kAMEYCIQDh528Fnh1iQU6dHjhn6Z47ZdwV/OsyhYReAvOO +exL3mQIhAJJ3ZbG9+7KkQYfJnj3gOQLz20Ixv/tt/XS+o+N0/PVk -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-short.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-short.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain-short.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain-short.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,54 @@ +-----BEGIN CERTIFICATE----- +MIIE8jCCA9qgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT +MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK +DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT +TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTMzMDkyNDEyMTAwOVowgZwxCzAJBgNVBAYT +AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD +VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s +ZlNTTCBTZXJ2ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j +b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAlQjhV0HycW230kVB +JwFlxkWu8rwkMLiVzi9O1vYciLx8n/uoZ3/+XJxRdfeKygfnNS+P4b17wC98q2So +F/zKXXu64CHlci5vLobYlXParBtTuV8/1xkNJU/hY2NRiwtkP61DuKUcXDSzrgCg +Y8X2fwtZaHhzpowYqQJtr8MZAS64EOPGzEC0aaNGM2mHbsS7F6bz6N2tc7x7LyG1 +/WZRDL1Us+FtXxy8I3PRCQOJFNIQuWTDKtChlkq84dQaW8egwMFjeA9ENzAyloAy +I5Whd7oT0pdz4l0lyWoNwzlgpLSwaUJCCenYCLwzILNYIqeq68Th5mGDxdKW39nQ +T63XAgMBAAGjggE2MIIBMjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAd +BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUDclg +IENYgeCaIe9mFtxuISXfK0WhgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM +MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l +ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhABMA4G +A1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsF +AAOCAQEASSfw2AHc6qbwlL8ibcem+R8IfnWxlqxWUeByi2UsObd0eJfaIVLRQ0zX +CQ4TgIroRZAPOeRy30AIIfS1aaXCBCFX2GuRF9RV3HNu18zH2MFm7pRvGEeNI8/C +pD2kRdIafLgjeeK0rHEmpBrjopfayIUA5x97sgXb7ZXYFlkLeyMB6+ZPcMKut35b +LFpzbtKopj4bnni1O30fX6lLyoNBf0gYtpm5j1ZsMwpwym6m8JNdOpIxLcd8GlBA +SV3Uso2a0Bg3TiWhmDz/XzsTXkq8+RzJKp/y9nDy9uziIyYnyIroCoFwX2pn/Fds +b9r+Mz8hlmW2T/iJWpIO4S79Dhb1bg== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT +MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK +DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT +TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j +b20wHhcNMjMwOTI3MTIxMDA5WhcNNDMwOTIyMTIxMDA5WjCBoDELMAkGA1UEBhMC +VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV +BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm +U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPyT1ZAZ8dd5FW +y6sGgsGBMZri+cb5o0AthkLXX0GlBUIPXytrvSmS5VLGXPl+nfuO1mmMA5GHHB+/ +JFlEzO+vkioG4aEBWwRXihq2BOLCPBA8QjEBqsPyMh4BldCRp2bBImg2UypSA+u1 +m4IBJPnRrvtTTFoG5W5a1qxbKBpT6Nelzm6cNMMIC8svjt/vjDX1sLxdD64KSs9U +AdI8tHjuSBBWgE+Dh05nH08XLj4t9W3JB6I+MpIPHqQLVaYfhO+dde9mfHX350A6 +nMEzQj0vf5ldewTVqWxB6IkWWP06oAS9d9ZjXmoTWTdf8VkBRUici/cW9FD3WrRa +M/b1QcE9AgMBAAGjZjBkMB0GA1UdDgQWBBQNyWAgQ1iB4Joh72YW3G4hJd8rRTAf +BgNVHSMEGDAWgBTvaeD31R3mmezcbdD34rlcZHGDNTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAhsP4YtIQoLTa +eOmFxZkEJJ53GliknybHWFu4doBXziCk5d4hIT1wAU0PbVr2PUho0jjF6tSfpACy +5N5wa1i5oqmb3aamjmzE+V/XF0WFvugv+9KC0qss4v81ILRsBn4IUXqvGXNY86hI +ZQpPZ0R+wP1LlJSxTFaFejGvCQP6zF2FVQusG2rJqsS75OCtQjjxb3TX2wzKAeDz +Ssfr8m4wxo6jz1pFD3+YkjEg/CYhNBUGTymjXBURWwSU1SybHlthZdxubAAFAc4r +SFT5kStMjLvblLUIUxGXFQG8ZSi2ooNf8Nh5hBcndSpUyAcx11AFUQdPV8i/SXU1 +oTmvZuwm4Q== +-----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-chain.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-chain.pem 2024-08-03 07:30:00.000000000 +0000 @@ -3,7 +3,7 @@ MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTMzMDkyNDEyMTAwOVowgZwxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s ZlNTTCBTZXJ2ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -14,65 +14,65 @@ /WZRDL1Us+FtXxy8I3PRCQOJFNIQuWTDKtChlkq84dQaW8egwMFjeA9ENzAyloAy I5Whd7oT0pdz4l0lyWoNwzlgpLSwaUJCCenYCLwzILNYIqeq68Th5mGDxdKW39nQ T63XAgMBAAGjggE2MIIBMjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAd -BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUeosd -TqNAyM5YX438/0YsdUHZA16hgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUDclg +IENYgeCaIe9mFtxuISXfK0WhgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhABMA4G A1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsF -AAOCAQEAkpC/Vl2YIc7WCo18r7qbWdgzwSEPbzEcE8Wf3qh97+XFC4t+GMud2N7J -PTLu/9CJmDszaNvNZl6d7tpTNGUh40P2p7J5tXksLiM/PmFZgIj9w8UE6a1SqVh9 -78WnhRpVYOENfhHIulnYxh02BGOOfa8o/RN6MvUp1wrvBjyFkLbGTzmxGO6+F6VE -F4ezlKE0Ykx3yAaTyAP18qpb/9CarfOyyluBVO8bOfjGd/GAUA8MbpQUYqP8mY7S -4za4JRttVdIbIZfThOaW7p+zAERwOp/8YuJCGpMe/J7sjRx6GrETRk7rDSi5TQjm -CTHAuy4H4MupWgaHxI66ay91VIU29Q== +AAOCAQEASSfw2AHc6qbwlL8ibcem+R8IfnWxlqxWUeByi2UsObd0eJfaIVLRQ0zX +CQ4TgIroRZAPOeRy30AIIfS1aaXCBCFX2GuRF9RV3HNu18zH2MFm7pRvGEeNI8/C +pD2kRdIafLgjeeK0rHEmpBrjopfayIUA5x97sgXb7ZXYFlkLeyMB6+ZPcMKut35b +LFpzbtKopj4bnni1O30fX6lLyoNBf0gYtpm5j1ZsMwpwym6m8JNdOpIxLcd8GlBA +SV3Uso2a0Bg3TiWhmDz/XzsTXkq8+RzJKp/y9nDy9uziIyYnyIroCoFwX2pn/Fds +b9r+Mz8hlmW2T/iJWpIO4S79Dhb1bg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEIzCCAwugAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwgZ8xCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNT TCBJbnRlcm1lZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j -b20wHhcNMjAwNjE2MTkxNzU3WhcNNDAwNjExMTkxNzU3WjCBoDELMAkGA1UEBhMC +b20wHhcNMjMwOTI3MTIxMDA5WhcNNDMwOTIyMTIxMDA5WjCBoDELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNV BAoMB3dvbGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MSEwHwYDVQQDDBh3b2xm U1NMIEludGVybWVkaWF0ZTIgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCgL6ECMF0ZoY5E -htST9/FTuj/SJN//y6+Ppuf5h5ofAMyPQIZ4OhuaeA7jbtrz52xXdjHPAyGayHkp -YNvu2KkVtGdbd5qG+dtDzKIPkeZwTx5uFLGN8KHlOXehkpeISibxiJgkbP1G4nEH -Xa/UvKiMXe5DCNqn7AlR7a3NdYtYx6GYVucZeJNLU3e32nl9cIS7HemgPAK8p5b6 -u5iQrjUZ0OdkHp0JoQbywv3LoykswHn46emTZ4w1LqFJoDRsOB1rTKW6x4SAlRcS -y92n9i4sxw/BVB+XbAE72i7H3FPJJuaaZqh/VfrNchhph06M5ALd9zEao27NiENw -tDRtpoZ1AgMBAAGjZjBkMB0GA1UdDgQWBBR6ix1Oo0DIzlhfjfz/Rix1QdkDXjAf -BgNVHSMEGDAWgBSDHPGYhexuBkU03lHAurcrZzJmTTASBgNVHRMBAf8ECDAGAQH/ -AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEADHKZ7ecDWMIr -iNKqQzGEGC/exV3gINhUPF4rhyqflrHvvtfHJ3ForHFhuG7Rqksv79Q357uHkGNI -OJsgFb28r4q0r1ORjoQRFOpvhfROugpJkbMZmSrR+aena/1/eIh7030ssZ9wFRrb -hpvOtwcl7DmMWaPS0cwYFRSghU1P+5pHL9xmx318EolIWNTLGhsSupztXIy/cg5f -jkI0S2w+BG/ZUOMok2sT/WvWLRvN+/4Lo4zfyOatnmmKk5bXhDG7yvLb4hjJ8ZGK -xwafwgrptF/jeyD8GhYcAlMSzWZFVW6xwJUtK9YZuJlOHxuc+7n+jH4yV/OA6fi+ -JS8DRjyzCg== +bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPyT1ZAZ8dd5FW +y6sGgsGBMZri+cb5o0AthkLXX0GlBUIPXytrvSmS5VLGXPl+nfuO1mmMA5GHHB+/ +JFlEzO+vkioG4aEBWwRXihq2BOLCPBA8QjEBqsPyMh4BldCRp2bBImg2UypSA+u1 +m4IBJPnRrvtTTFoG5W5a1qxbKBpT6Nelzm6cNMMIC8svjt/vjDX1sLxdD64KSs9U +AdI8tHjuSBBWgE+Dh05nH08XLj4t9W3JB6I+MpIPHqQLVaYfhO+dde9mfHX350A6 +nMEzQj0vf5ldewTVqWxB6IkWWP06oAS9d9ZjXmoTWTdf8VkBRUici/cW9FD3WrRa +M/b1QcE9AgMBAAGjZjBkMB0GA1UdDgQWBBQNyWAgQ1iB4Joh72YW3G4hJd8rRTAf +BgNVHSMEGDAWgBTvaeD31R3mmezcbdD34rlcZHGDNTASBgNVHRMBAf8ECDAGAQH/ +AgEBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAhsP4YtIQoLTa +eOmFxZkEJJ53GliknybHWFu4doBXziCk5d4hIT1wAU0PbVr2PUho0jjF6tSfpACy +5N5wa1i5oqmb3aamjmzE+V/XF0WFvugv+9KC0qss4v81ILRsBn4IUXqvGXNY86hI +ZQpPZ0R+wP1LlJSxTFaFejGvCQP6zF2FVQusG2rJqsS75OCtQjjxb3TX2wzKAeDz +Ssfr8m4wxo6jz1pFD3+YkjEg/CYhNBUGTymjXBURWwSU1SybHlthZdxubAAFAc4r +SFT5kStMjLvblLUIUxGXFQG8ZSi2ooNf8Nh5hBcndSpUyAcx11AFUQdPV8i/SXU1 +oTmvZuwm4Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFzCCAv+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIwMDYx -NjE5MTc1N1oXDTQwMDYxMTE5MTc1N1owgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDky +NzEyMTAwOVoXDTQzMDkyMjEyMTAwOVowgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyIyj3gUPwY7nyd34wGkBr4d1rQTbu -fVgj3Fbpu+g7EVjDw7frmFrpdhLN73cJJdNs5jpJaFCQ1zLgGNYF3/ee0o97tZFc -vz4Jgd157UTCk/WdpMsKa2O08O7R3WznxrfxMNS3VCgYEfwlrFvxsxkTR31+2UWX -PLu5QnAGlFUjFQuEygwVwW4aHPlUyebjuMFF5VqJ4fEbHYG3NAcXKFsQx6Yh612J -EaPQOWA06uF1+rh87sU/ZGoduNiksoKYMRHotSAtA+XRYTWkS7WtprdycT6GOA44 -tl21q786uh4ydrpUTQXKTuKD3zBkEZ6Zkzum+zvffZAC9LTx6EExeAI/AgMBAAGj -ZjBkMB0GA1UdDgQWBBSDHPGYhexuBkU03lHAurcrZzJmTTAfBgNVHSMEGDAWgBQn +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDDonNdIWIgzjpxOKeUu9uHBBxaG55L +DT7K+KX3DWrcI5AiaitYY0ooakio53MfolXYTQI74str4oPJUY93/dwtXSO3I5p+ +tilo6CpOqf4ycDGe8O/u+I3j/PPXKN16HZ6tIyvxpn80Uilm0uVkVWTW3UtBO1WD +bsARDm4gwhZz6zD/CUa758zGA0RBEcbBbDYvSvmRVcpYXje4KBAwiUCWd89wZqRV ++2kL59myM2Xbcjp3tytJ/LbNWBCNq6rLQEV3AjkYs48zAUh3UL6Oc6feNqBJjiwW +r7n7Qi01ats0N9UUWX1lcuWLZVVLIF5H+fg602zZOvXHAUYxw3maGL5JAgMBAAGj +ZjBkMB0GA1UdDgQWBBTvaeD31R3mmezcbdD34rlcZHGDNTAfBgNVHSMEGDAWgBQn jmcRdMMmHT/tM2OzpNgdMOXo1TASBgNVHRMBAf8ECDAGAQH/AgEBMA4GA1UdDwEB -/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAfQ1cKhnn7l/KLdRZVLnKMxg64yIs -GHC7xVhF2YK8gF2Q2QI0bBpP8WtZTs3h6ieA5uLYfq8rrMFi4E3p5nSZ/sBQy9N9 -5SuCDWcNFLUsaqJ6wt0Ip0Aqj6G/TVN1Xd3DguXkHwSwtqfMVWy01HSemjY38DJp -l0T70iIai5U0RDLMKql29xLHuZvx5afH1W0S7AAdIbIT8jPg6uDIY3zdBsc8uqS9 -oJuNoRp9OtfJ8zVOxXZrbVDRlSPowH89P0UIEHdrKWjM3bYg+MEVTG/iq51hE928 -xeeYzCMpuhy2IcCwtuneK0PXynsoavpMyTlN4UDt5sAWnWmy+b/bUCc8sw== +/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEAg9dEyy0uHoNHm+AkJImQEpao9Mes +6ozc/5NAu6I6V2D9lLHiyVa+pRK1uSpQV0j9W5CWe1LTpD+iPMsuLakZF5owsEnN +eCWYHvU7N/rsy01FRrhFf5e283nmLTF1LID52zuvlDFrY+RbeH9tUoQiYFY7Nw+L +e19c9vPwH9kAiyrK3w4DlJDQ9O+lR4q2fNvPBUdwc12yQUSgoA5iOX/MBocTNXSM +nixGLuUK05J6g40ijAazLw1cJprkGcthRVoqy46R5mNYOMMU2weNGp7d8QdYcd49 +C2zBmItmMybZYdsBxzC46Aq/elhrmGynPCz4YLcFe3OL1sXI1VolA9/n/A== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,12 +5,12 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:58 2020 GMT - Not After : Jun 14 19:17:58 2030 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 24 12:10:09 2033 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Server Chain, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption - RSA Public-Key: (2048 bit) + Public-Key: (2048 bit) Modulus: 00:c0:95:08:e1:57:41:f2:71:6d:b7:d2:45:41:27: 01:65:c6:45:ae:f2:bc:24:30:b8:95:ce:2f:4e:d6: @@ -39,36 +39,36 @@ X509v3 Subject Key Identifier: B3:11:32:C9:92:98:84:E2:C9:F8:D0:3B:6E:03:42:CA:1F:0E:8E:3C X509v3 Authority Key Identifier: - keyid:7A:8B:1D:4E:A3:40:C8:CE:58:5F:8D:FC:FF:46:2C:75:41:D9:03:5E + keyid:0D:C9:60:20:43:58:81:E0:9A:21:EF:66:16:DC:6E:21:25:DF:2B:45 DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com serial:10:01 - X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication Signature Algorithm: sha256WithRSAEncryption - 92:90:bf:56:5d:98:21:ce:d6:0a:8d:7c:af:ba:9b:59:d8:33: - c1:21:0f:6f:31:1c:13:c5:9f:de:a8:7d:ef:e5:c5:0b:8b:7e: - 18:cb:9d:d8:de:c9:3d:32:ee:ff:d0:89:98:3b:33:68:db:cd: - 66:5e:9d:ee:da:53:34:65:21:e3:43:f6:a7:b2:79:b5:79:2c: - 2e:23:3f:3e:61:59:80:88:fd:c3:c5:04:e9:ad:52:a9:58:7d: - ef:c5:a7:85:1a:55:60:e1:0d:7e:11:c8:ba:59:d8:c6:1d:36: - 04:63:8e:7d:af:28:fd:13:7a:32:f5:29:d7:0a:ef:06:3c:85: - 90:b6:c6:4f:39:b1:18:ee:be:17:a5:44:17:87:b3:94:a1:34: - 62:4c:77:c8:06:93:c8:03:f5:f2:aa:5b:ff:d0:9a:ad:f3:b2: - ca:5b:81:54:ef:1b:39:f8:c6:77:f1:80:50:0f:0c:6e:94:14: - 62:a3:fc:99:8e:d2:e3:36:b8:25:1b:6d:55:d2:1b:21:97:d3: - 84:e6:96:ee:9f:b3:00:44:70:3a:9f:fc:62:e2:42:1a:93:1e: - fc:9e:ec:8d:1c:7a:1a:b1:13:46:4e:eb:0d:28:b9:4d:08:e6: - 09:31:c0:bb:2e:07:e0:cb:a9:5a:06:87:c4:8e:ba:6b:2f:75: - 54:85:36:f5 + Signature Value: + 49:27:f0:d8:01:dc:ea:a6:f0:94:bf:22:6d:c7:a6:f9:1f:08: + 7e:75:b1:96:ac:56:51:e0:72:8b:65:2c:39:b7:74:78:97:da: + 21:52:d1:43:4c:d7:09:0e:13:80:8a:e8:45:90:0f:39:e4:72: + df:40:08:21:f4:b5:69:a5:c2:04:21:57:d8:6b:91:17:d4:55: + dc:73:6e:d7:cc:c7:d8:c1:66:ee:94:6f:18:47:8d:23:cf:c2: + a4:3d:a4:45:d2:1a:7c:b8:23:79:e2:b4:ac:71:26:a4:1a:e3: + a2:97:da:c8:85:00:e7:1f:7b:b2:05:db:ed:95:d8:16:59:0b: + 7b:23:01:eb:e6:4f:70:c2:ae:b7:7e:5b:2c:5a:73:6e:d2:a8: + a6:3e:1b:9e:78:b5:3b:7d:1f:5f:a9:4b:ca:83:41:7f:48:18: + b6:99:b9:8f:56:6c:33:0a:70:ca:6e:a6:f0:93:5d:3a:92:31: + 2d:c7:7c:1a:50:40:49:5d:d4:b2:8d:9a:d0:18:37:4e:25:a1: + 98:3c:ff:5f:3b:13:5e:4a:bc:f9:1c:c9:2a:9f:f2:f6:70:f2: + f6:ec:e2:23:26:27:c8:8a:e8:0a:81:70:5f:6a:67:fc:57:6c: + 6f:da:fe:33:3f:21:96:65:b6:4f:f8:89:5a:92:0e:e1:2e:fd: + 0e:16:f5:6e -----BEGIN CERTIFICATE----- MIIE8jCCA9qgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNVBAYTAlVT MRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQK DAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEhMB8GA1UEAwwYd29sZlNT TCBJbnRlcm1lZGlhdGUyIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIwMDYxNjE5MTc1OFoXDTMwMDYxNDE5MTc1OFowgZwxCzAJBgNVBAYT +Y29tMB4XDTIzMDkyNzEyMTAwOVoXDTMzMDkyNDEyMTAwOVowgZwxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEdMBsGA1UEAwwUd29s ZlNTTCBTZXJ2ZXIgQ2hhaW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -79,16 +79,16 @@ /WZRDL1Us+FtXxy8I3PRCQOJFNIQuWTDKtChlkq84dQaW8egwMFjeA9ENzAyloAy I5Whd7oT0pdz4l0lyWoNwzlgpLSwaUJCCenYCLwzILNYIqeq68Th5mGDxdKW39nQ T63XAgMBAAGjggE2MIIBMjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAd -BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUeosd -TqNAyM5YX438/0YsdUHZA16hgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI +BgNVHQ4EFgQUsxEyyZKYhOLJ+NA7bgNCyh8Ojjwwgc0GA1UdIwSBxTCBwoAUDclg +IENYgeCaIe9mFtxuISXfK0WhgaWkgaIwgZ8xCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NM MRQwEgYDVQQLDAtEZXZlbG9wbWVudDEgMB4GA1UEAwwXd29sZlNTTCBJbnRlcm1l ZGlhdGUgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAhABMA4G A1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsF -AAOCAQEAkpC/Vl2YIc7WCo18r7qbWdgzwSEPbzEcE8Wf3qh97+XFC4t+GMud2N7J -PTLu/9CJmDszaNvNZl6d7tpTNGUh40P2p7J5tXksLiM/PmFZgIj9w8UE6a1SqVh9 -78WnhRpVYOENfhHIulnYxh02BGOOfa8o/RN6MvUp1wrvBjyFkLbGTzmxGO6+F6VE -F4ezlKE0Ykx3yAaTyAP18qpb/9CarfOyyluBVO8bOfjGd/GAUA8MbpQUYqP8mY7S -4za4JRttVdIbIZfThOaW7p+zAERwOp/8YuJCGpMe/J7sjRx6GrETRk7rDSi5TQjm -CTHAuy4H4MupWgaHxI66ay91VIU29Q== +AAOCAQEASSfw2AHc6qbwlL8ibcem+R8IfnWxlqxWUeByi2UsObd0eJfaIVLRQ0zX +CQ4TgIroRZAPOeRy30AIIfS1aaXCBCFX2GuRF9RV3HNu18zH2MFm7pRvGEeNI8/C +pD2kRdIafLgjeeK0rHEmpBrjopfayIUA5x97sgXb7ZXYFlkLeyMB6+ZPcMKut35b +LFpzbtKopj4bnni1O30fX6lLyoNBf0gYtpm5j1ZsMwpwym6m8JNdOpIxLcd8GlBA +SV3Uso2a0Bg3TiWhmDz/XzsTXkq8+RzJKp/y9nDy9uziIyYnyIroCoFwX2pn/Fds +b9r+Mz8hlmW2T/iJWpIO4S79Dhb1bg== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/intermediate/server-int-ecc-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Intermediate2 CA ECC, emailAddress = info@wolfssl.com Validity - Not Before: Jun 16 19:17:58 2020 GMT - Not After : Jun 14 19:17:58 2030 GMT + Not Before: Sep 27 12:10:09 2023 GMT + Not After : Sep 24 12:10:09 2033 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = wolfSSL Server Chain ECC, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -27,37 +27,37 @@ X509v3 Subject Key Identifier: 5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30 X509v3 Authority Key Identifier: - keyid:1B:F4:BD:90:28:74:64:E3:33:5E:8B:64:A7:FC:AF:BA:F2:B9:55:E5 + keyid:9F:AE:7B:7A:70:80:04:55:2B:C6:B7:0C:5B:79:E4:12:41:65:31:29 DirName:/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com serial:10:05 - X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:46:02:21:00:98:d0:e2:f9:89:ca:b2:74:36:a7:33:0b:fe: - 14:90:10:45:7a:2d:6d:40:44:db:08:ec:45:79:8b:4e:91:e0: - d5:02:21:00:ea:11:1b:c1:b5:95:bc:bf:d9:f5:99:37:d1:d2: - e6:b8:aa:19:bd:97:42:09:bb:0a:51:6c:4e:a2:61:72:e8:44 + Signature Value: + 30:45:02:21:00:cd:89:cf:ce:26:69:1f:ef:60:37:ad:c9:e3: + c8:61:06:fa:fa:b8:6f:3c:6b:12:55:a0:ff:e2:fa:9f:f8:47: + 93:02:20:69:4a:2e:3f:0d:c6:e7:4e:d1:29:e5:37:02:03:a9: + 2d:88:be:f8:08:be:1e:cb:0d:06:a3:21:8f:a8:60:a3:b5 -----BEGIN CERTIFICATE----- -MIIDczCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw +MIIDcjCCAxigAwIBAgICEAYwCgYIKoZIzj0EAwIwgaQxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDElMCMGA1UEAwwcd29sZlNTTCBJ bnRlcm1lZGlhdGUyIENBIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMDA2MTYxOTE3NThaFw0zMDA2MTQxOTE3NThaMIGgMQswCQYDVQQG +LmNvbTAeFw0yMzA5MjcxMjEwMDlaFw0zMzA5MjQxMjEwMDlaMIGgMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4G A1UECgwHd29sZlNTTDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxITAfBgNVBAMMGHdv bGZTU0wgU2VydmVyIENoYWluIEVDQzEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm c3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLszrEwnUErGSqUEwzze nzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eSIX/wzxjakRECNIboIFgzC4A0 idijggE6MIIBNjAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNVHQ4E -FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUG/S9kCh0ZOMz -Xotkp/yvuvK5VeWhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo +FgQUXV0m76x+NvmbdhUrSiUCI++yiTAwgdEGA1UdIwSByTCBxoAUn657enCABFUr +xrcMW3nkEkFlMSmhgamkgaYwgaMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNo aW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYD VQQLDAtEZXZlbG9wbWVudDEkMCIGA1UEAwwbd29sZlNTTCBJbnRlcm1lZGlhdGUg Q0EgRUNDMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggIQBTAOBgNV -HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAw -RgIhAJjQ4vmJyrJ0NqczC/4UkBBFei1tQETbCOxFeYtOkeDVAiEA6hEbwbWVvL/Z -9Zk30dLmuKoZvZdCCbsKUWxOomFy6EQ= +HQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSAAw +RQIhAM2Jz84maR/vYDetyePIYQb6+rhvPGsSVaD/4vqf+EeTAiBpSi4/DcbnTtEp +5TcCA6ktiL74CL4eyw0GoyGPqGCjtQ== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/intermediate1-ca-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate1-ca-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/intermediate1-ca-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate1-ca-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 5e:61:82:66:fd:b6:45:75:94:55:50:b9:ee:97:1a:48:73:ad: - 24:ba:19:ee:ce:e9:f3:07:ac:51:32:10:56:6a:c8:94:d0:ff: - 8b:37:e9:a9:de:29:e3:99:39:9f:84:f5:2b:de:57:de:d2:d9: - 44:b1:2b:03:9a:88:d2:d5:a8:48:f9:29:04:3d:f6:c0:60:06: - 13:c3:2e:4c:73:c2:c9:6a:07:0a:70:4f:4c:2e:8c:02:63:97: - 9e:70:2c:9c:fa:fb:cf:a9:2e:9c:e5:2f:14:43:3f:fb:61:6d: - fd:17:b9:94:f2:cd:c7:24:7e:e2:ba:3e:b9:76:df:52:d0:f7: - 2b:64:c1:31:e2:80:0f:ff:b1:7c:d2:af:14:4b:ec:dd:79:a7: - 23:c9:68:6a:e7:c6:2d:67:27:e7:37:d1:f8:93:37:58:e2:f3: - 9c:4d:38:5d:58:03:d1:30:f7:a6:ff:45:fe:69:11:d6:39:1e: - 11:d6:5b:42:75:c7:6c:cd:27:1f:59:98:88:03:a0:0f:fa:ad: - 28:2d:50:7b:b4:dc:7c:d4:5b:92:03:d0:55:dc:62:26:8f:50: - d0:6b:f8:c4:89:2b:8b:d1:77:5b:e9:68:b6:0a:15:1f:de:97: - f2:4d:a5:ad:d0:3c:d6:68:e8:4c:f8:a1:ac:44:a8:82:55:76: - 61:18:af:2d + 1c:06:f6:58:ee:a2:4d:11:dd:ce:51:2a:ea:3c:1e:13:62:2b: + e2:04:6d:ca:67:2b:14:1b:de:3e:72:7b:d2:12:29:59:e9:bd: + 3f:37:1f:9b:9c:15:84:40:10:c2:7b:1c:1f:16:2c:4e:f5:b7: + bb:7e:24:79:7a:e6:6b:6e:66:cf:4f:04:e5:31:b9:63:12:80: + 89:61:fc:ae:47:b3:bd:b0:63:d8:aa:77:ba:25:53:e5:f7:ca: + 63:d5:7f:6e:80:ed:75:c9:47:59:df:7a:82:87:2e:b8:cf:87: + c4:9a:0c:2f:ee:a9:a8:5a:7e:2b:55:30:e9:8b:05:f3:ab:60: + 7f:49:bd:16:de:73:8d:8f:72:48:35:23:a1:88:88:a8:9a:01: + 19:6c:6e:06:cf:c3:47:d9:68:0e:42:c3:84:d9:23:71:36:73: + c4:9d:bc:ed:f7:9b:e3:a0:8d:89:ac:ec:e7:75:22:1f:99:74: + 5b:4c:5b:b5:25:e1:7f:02:f3:07:ae:4f:b1:0b:21:f9:17:78: + 1a:b4:c6:8f:03:91:fb:b2:95:ff:6d:de:37:39:4a:57:c1:8c: + da:91:3a:4c:cc:fa:27:9a:4f:42:cb:4c:15:c7:08:34:8f:03: + a8:f1:2e:df:64:c5:ec:57:e1:90:77:2f:49:90:c1:23:4d:7b: + 9e:44:fb:08 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -84,12 +84,12 @@ ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAF5hgmb9tkV1lFVQue6XGkhzrSS6Ge7O6fMHrFEyEFZqyJTQ/4s36aneKeOZ -OZ+E9SveV97S2USxKwOaiNLVqEj5KQQ99sBgBhPDLkxzwslqBwpwT0wujAJjl55w -LJz6+8+pLpzlLxRDP/thbf0XuZTyzcckfuK6Prl231LQ9ytkwTHigA//sXzSrxRL -7N15pyPJaGrnxi1nJ+c30fiTN1ji85xNOF1YA9Ew96b/Rf5pEdY5HhHWW0J1x2zN -Jx9ZmIgDoA/6rSgtUHu03HzUW5ID0FXcYiaPUNBr+MSJK4vRd1vpaLYKFR/el/JN -pa3QPNZo6Ez4oaxEqIJVdmEYry0= +ggEBABwG9ljuok0R3c5RKuo8HhNiK+IEbcpnKxQb3j5ye9ISKVnpvT83H5ucFYRA +EMJ7HB8WLE71t7t+JHl65mtuZs9PBOUxuWMSgIlh/K5Hs72wY9iqd7olU+X3ymPV +f26A7XXJR1nfeoKHLrjPh8SaDC/uqahafitVMOmLBfOrYH9JvRbec42Pckg1I6GI +iKiaARlsbgbPw0fZaA5Cw4TZI3E2c8SdvO33m+OgjYms7Od1Ih+ZdFtMW7Ul4X8C +8weuT7ELIfkXeBq0xo8Dkfuylf9t3jc5SlfBjNqROkzM+ieaT0LLTBXHCDSPA6jx +Lt9kxexX4ZB3L0mQwSNNe55E+wg= -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -176,11 +176,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/intermediate2-ca-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate2-ca-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/intermediate2-ca-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate2-ca-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 07:cd:8a:f3:e6:37:76:a8:e8:3b:2a:0f:20:f9:3c:3b:65:f4: - fc:0a:c2:83:cd:f9:d8:19:82:6c:42:01:65:ad:a8:80:6a:20: - a2:00:d4:e2:bd:61:8c:b1:1d:1f:39:5a:40:3d:9a:5b:47:1c: - 20:a0:b9:1a:d0:b1:8d:9f:50:d1:04:b8:bd:a4:9c:75:86:e8: - 1a:c6:da:d8:08:ee:ae:da:0d:12:cb:9e:42:f2:16:5c:c0:bc: - 0f:f5:e4:1f:59:13:ff:21:4f:3a:66:0f:5d:e0:5c:32:1e:5c: - f7:23:4c:ef:6e:5f:e7:97:f1:91:88:36:89:1d:71:19:83:96: - 9d:92:36:2b:c3:e5:2d:9f:e2:82:e6:53:7c:4a:40:62:67:20: - 58:c5:d2:f3:b8:21:10:65:a9:6f:cb:2f:20:6f:96:b4:19:ce: - 94:af:9c:8f:39:0d:18:41:14:0c:87:1d:c0:83:6a:ee:d4:f7: - 5b:cf:03:a9:9e:65:26:91:2a:c1:f5:dd:03:f3:81:5a:5e:a5: - b8:79:2a:9c:16:81:de:d8:19:41:7c:9e:eb:3b:0c:6e:90:be: - a0:35:18:ee:4e:05:ae:10:96:38:23:12:8b:68:02:a4:e0:40: - 48:4b:e0:d0:2f:28:5c:3b:85:4c:39:fa:3b:d5:25:4e:7f:12: - 71:c0:56:12 + 3b:38:b5:57:a7:f6:d6:b1:19:55:b8:da:47:74:cf:9a:6b:6e: + ff:0a:5d:06:17:33:db:db:38:e5:d1:9c:dd:c7:3e:c2:2e:87: + 20:52:48:d0:ad:0c:12:3e:f7:66:41:64:d2:ca:b3:4c:a1:0a: + 6c:4b:4b:33:94:74:83:2e:2d:44:5a:13:ae:da:9a:18:87:64: + 30:cf:69:70:e8:38:47:de:55:27:06:86:9b:24:d5:b0:8f:17: + 3b:95:87:7e:4a:45:45:2e:6d:70:27:90:32:62:a8:36:3e:47: + 47:0f:0e:1b:93:cf:3d:3e:9b:2c:9a:ff:0c:ee:a7:1b:40:c4: + dc:f2:66:74:eb:d9:11:9d:60:b8:24:b4:89:c1:e4:61:20:3d: + 38:af:45:ad:e8:ee:69:c3:96:8a:a5:c1:cd:dd:14:87:97:dc: + f8:32:84:a8:3b:0a:eb:61:0e:7c:4c:65:69:3d:02:92:db:c4: + bf:21:6f:89:fe:cc:76:df:c5:84:fb:c4:ea:1a:60:da:d0:c8: + 27:7c:65:1b:cb:23:20:5a:e2:23:90:bd:f5:5c:0a:85:51:37: + 84:47:a7:80:f4:e0:a0:72:8d:7a:b8:71:03:44:59:c6:cf:2c: + ae:df:91:a9:74:72:eb:a7:31:b2:81:65:19:e6:df:c3:4b:b7: + fc:9c:2c:f0 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -84,12 +84,12 @@ ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAAfNivPmN3ao6DsqDyD5PDtl9PwKwoPN+dgZgmxCAWWtqIBqIKIA1OK9YYyx -HR85WkA9mltHHCCguRrQsY2fUNEEuL2knHWG6BrG2tgI7q7aDRLLnkLyFlzAvA/1 -5B9ZE/8hTzpmD13gXDIeXPcjTO9uX+eX8ZGINokdcRmDlp2SNivD5S2f4oLmU3xK -QGJnIFjF0vO4IRBlqW/LLyBvlrQZzpSvnI85DRhBFAyHHcCDau7U91vPA6meZSaR -KsH13QPzgVpepbh5KpwWgd7YGUF8nus7DG6QvqA1GO5OBa4QljgjEotoAqTgQEhL -4NAvKFw7hUw5+jvVJU5/EnHAVhI= +ggEBADs4tVen9taxGVW42kd0z5prbv8KXQYXM9vbOOXRnN3HPsIuhyBSSNCtDBI+ +92ZBZNLKs0yhCmxLSzOUdIMuLURaE67amhiHZDDPaXDoOEfeVScGhpsk1bCPFzuV +h35KRUUubXAnkDJiqDY+R0cPDhuTzz0+myya/wzupxtAxNzyZnTr2RGdYLgktInB +5GEgPTivRa3o7mnDloqlwc3dFIeX3PgyhKg7CuthDnxMZWk9ApLbxL8hb4n+zHbf +xYT7xOoaYNrQyCd8ZRvLIyBa4iOQvfVcCoVRN4RHp4D04KByjXq4cQNEWcbPLK7f +kal0cuunMbKBZRnm38NLt/ycLPA= -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -176,11 +176,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/intermediate3-ca-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate3-ca-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/intermediate3-ca-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/intermediate3-ca-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL REVOKED intermediate CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - a4:9b:e4:ec:56:45:77:92:36:91:66:cc:25:11:1a:1d:48:d5: - f8:4a:32:04:6f:ea:76:c7:0c:27:8a:8c:f1:ef:08:d4:47:60: - 66:5e:3f:61:76:fc:a2:84:c1:42:01:89:b6:17:d9:eb:14:e6: - 61:7e:8e:18:2e:64:be:14:ef:2d:ce:63:10:d6:b3:00:ec:f3: - fc:4f:a0:1b:6f:e7:75:18:fe:ca:ef:47:12:dc:c8:ae:f9:05: - 2b:84:14:d5:ad:df:58:84:81:33:51:90:5d:29:b8:ff:48:6b: - f5:bb:e9:c7:be:6f:e1:6a:ca:71:47:1f:97:7f:1d:00:56:9a: - 59:f6:78:4e:95:6c:e8:51:73:8e:9d:f3:62:00:f7:65:bd:09: - d7:e4:ae:7e:04:ee:1e:eb:f3:83:3f:2a:44:f4:98:f8:ef:31: - ed:06:77:60:e3:f2:6b:b6:dd:3e:ed:45:aa:07:a9:7f:99:f5: - 2d:9b:ce:10:16:3a:cd:96:fb:40:1b:18:f4:eb:6f:f0:dc:ee: - e8:aa:30:13:3c:d6:1e:46:7d:55:1f:0b:86:5c:13:f9:2f:83: - b8:65:55:8d:3e:56:8b:d9:b7:e1:1b:2d:ab:f2:e7:3a:c4:6f: - 2a:c9:f0:f9:96:82:93:ac:a7:06:1c:0e:bb:2a:ff:6a:be:eb: - 91:b0:8c:dc + 2f:e1:b0:99:a9:71:0e:41:f8:b1:9d:38:c8:f4:3d:7c:79:ce: + d2:94:01:2a:b6:71:1b:4c:64:19:27:02:71:b4:43:64:42:f9: + 2b:71:39:6e:64:4e:e8:32:b1:1e:1b:fd:7d:22:cb:8a:9c:34: + ce:ef:bb:dd:f2:4f:83:58:33:34:01:cb:b4:35:e2:ba:c6:cc: + aa:2f:ed:2e:e9:04:ec:cd:7f:06:50:b3:4e:37:cd:fe:96:69: + da:a3:fe:63:78:83:c5:86:7e:03:b2:11:e5:94:f8:56:e9:d1: + dd:5d:b4:05:4d:26:0e:09:c2:50:32:ce:6d:da:6b:b7:ee:e1: + 1b:a9:b0:0f:59:d6:03:16:ee:47:16:2f:1f:58:f9:f8:48:d9: + 59:ed:61:a1:af:7e:92:38:2e:40:0c:9b:e7:21:90:3b:10:6f: + 61:ad:e0:95:57:e2:d5:39:dc:83:54:88:99:4a:5e:21:94:ce: + f9:0f:5e:e9:22:10:55:bb:97:f4:51:3f:50:83:ed:63:fb:ab: + d2:02:b3:aa:26:f7:fc:72:1c:84:e9:a0:a3:fa:b2:22:90:c8: + ac:61:84:2a:bd:3f:75:1f:1b:bf:83:a8:90:ce:4c:de:ee:eb: + 65:b4:ff:f0:7a:b2:11:7a:78:60:c4:6e:da:e3:c8:a3:57:5b: + 8f:58:e4:49 -----BEGIN CERTIFICATE----- MIIE9jCCA96gAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBpzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBpzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSgwJgYDVQQDDB93b2xmU1NMIFJFVk9L RUQgaW50ZXJtZWRpYXRlIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu @@ -84,12 +84,12 @@ bmVlcmluZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQm MCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcN -AQELBQADggEBAKSb5OxWRXeSNpFmzCURGh1I1fhKMgRv6nbHDCeKjPHvCNRHYGZe -P2F2/KKEwUIBibYX2esU5mF+jhguZL4U7y3OYxDWswDs8/xPoBtv53UY/srvRxLc -yK75BSuEFNWt31iEgTNRkF0puP9Ia/W76ce+b+FqynFHH5d/HQBWmln2eE6VbOhR -c46d82IA92W9Cdfkrn4E7h7r84M/KkT0mPjvMe0Gd2Dj8mu23T7tRaoHqX+Z9S2b -zhAWOs2W+0AbGPTrb/Dc7uiqMBM81h5GfVUfC4ZcE/kvg7hlVY0+VovZt+EbLavy -5zrEbyrJ8PmWgpOspwYcDrsq/2q+65GwjNw= +AQELBQADggEBAC/hsJmpcQ5B+LGdOMj0PXx5ztKUASq2cRtMZBknAnG0Q2RC+Stx +OW5kTugysR4b/X0iy4qcNM7vu93yT4NYMzQBy7Q14rrGzKov7S7pBOzNfwZQs043 +zf6Wadqj/mN4g8WGfgOyEeWU+Fbp0d1dtAVNJg4JwlAyzm3aa7fu4RupsA9Z1gMW +7kcWLx9Y+fhI2VntYaGvfpI4LkAMm+chkDsQb2Gt4JVX4tU53INUiJlKXiGUzvkP +XukiEFW7l/RRP1CD7WP7q9ICs6om9/xyHITpoKP6siKQyKxhhCq9P3UfG7+DqJDO +TN7u62W0//B6shF6eGDEbtrjyKNXW49Y5Ek= -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -176,11 +176,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/ocsp-responder-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/ocsp-responder-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/ocsp-responder-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/ocsp-responder-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL OCSP Responder, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Extended Key Usage: OCSP Signing Signature Algorithm: sha256WithRSAEncryption - 2f:b7:6b:ec:b7:12:63:b9:57:dc:04:4d:9c:67:74:98:06:28: - 68:37:34:c2:50:e9:2a:d4:1a:b2:32:1a:9d:2b:4f:23:50:ea: - b4:95:86:c3:b9:5f:34:3e:99:91:a7:80:5f:6e:1b:6e:db:e9: - 02:38:6f:df:c5:9b:0d:a3:1c:a9:15:76:16:66:a8:4e:fb:d3: - 43:76:f1:72:b7:d1:fa:ee:39:a6:96:c1:a2:93:a4:9b:1e:9f: - ba:71:8f:ba:bd:67:6a:f2:15:5f:f1:64:e7:cf:26:b8:4c:c0: - eb:85:04:58:d9:4a:6b:d9:86:f5:80:21:bf:91:c8:4b:9f:04: - ed:57:7a:d2:58:ac:5b:47:af:4d:7f:5b:1d:6d:68:9b:84:98: - 2a:31:02:2c:e9:1b:af:11:0b:78:49:be:68:68:cb:9c:41:56: - e8:b5:59:da:ff:ca:59:99:17:3e:11:0a:8f:49:24:0b:81:42: - 63:cd:4f:f6:2b:9d:d1:79:75:d7:4a:cc:4c:b7:2b:d7:e8:e7: - d4:48:3c:14:3b:1c:28:e8:46:7a:dc:11:9d:7f:1c:ab:10:95: - 17:b2:c7:7a:bb:17:44:59:69:8e:16:05:94:8c:88:d9:dc:9a: - fd:f2:93:be:68:ba:3c:d6:2b:61:3a:8b:f7:66:cb:54:e8:e4: - db:9f:cc:9e + 0a:a4:ec:1a:eb:2e:bc:d0:62:b6:84:72:92:8a:1a:e4:04:31: + 1c:68:17:ae:6c:18:44:ad:23:73:0d:63:73:9b:47:97:ae:21: + aa:ac:ab:f4:9e:64:78:62:bb:b5:70:29:31:eb:53:b2:f6:20: + 35:ff:43:06:f0:3f:84:d8:aa:be:6d:a9:59:ef:f5:6b:8e:da: + 78:77:22:70:43:c8:e5:b5:55:2f:c8:31:5e:87:d2:2d:a5:0f: + 0a:aa:01:00:76:22:17:73:72:9a:59:fb:c8:1f:a3:b9:d6:99: + 7f:16:90:03:ec:20:bf:f5:8a:c5:e2:a7:1c:4b:bf:c5:7c:45: + 18:de:e3:93:a1:41:b0:33:ed:d2:6e:4f:14:58:6e:af:12:be: + 3b:ed:6e:20:4b:6d:11:89:9d:c6:2a:ab:1e:24:3f:d2:56:98: + 5c:8f:d1:fe:d2:92:6b:7b:ed:15:84:3a:b3:aa:5c:c6:b4:6d: + 5d:cb:ce:81:37:e5:ef:96:25:92:ef:04:3c:38:0c:f0:6d:64: + ef:33:51:4f:98:6f:55:3d:0e:cc:07:ea:2c:0b:3e:09:a0:23: + 0b:45:2c:02:a0:49:70:d8:a8:a7:36:07:68:c6:82:5e:d4:78: + be:cf:5b:11:79:6b:bf:e2:5d:56:79:19:a5:64:b2:e8:86:a4: + 27:74:cf:55 -----BEGIN CERTIFICATE----- MIIEvjCCA6agAwIBAgIBBDANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBnjELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBnjELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQDDBZ3b2xmU1NMIE9DU1Ag UmVzcG9uZGVyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -80,12 +80,12 @@ dGxlMRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYG A1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFjMBMGA1UdJQQMMAoGCCsGAQUFBwMJMA0GCSqGSIb3DQEBCwUAA4IB -AQAvt2vstxJjuVfcBE2cZ3SYBihoNzTCUOkq1BqyMhqdK08jUOq0lYbDuV80PpmR -p4Bfbhtu2+kCOG/fxZsNoxypFXYWZqhO+9NDdvFyt9H67jmmlsGik6SbHp+6cY+6 -vWdq8hVf8WTnzya4TMDrhQRY2Upr2Yb1gCG/kchLnwTtV3rSWKxbR69Nf1sdbWib -hJgqMQIs6RuvEQt4Sb5oaMucQVbotVna/8pZmRc+EQqPSSQLgUJjzU/2K53ReXXX -SsxMtyvX6OfUSDwUOxwo6EZ63BGdfxyrEJUXssd6uxdEWWmOFgWUjIjZ3Jr98pO+ -aLo81ithOov3ZstU6OTbn8ye +AQAKpOwa6y680GK2hHKSihrkBDEcaBeubBhErSNzDWNzm0eXriGqrKv0nmR4Yru1 +cCkx61Oy9iA1/0MG8D+E2Kq+balZ7/Vrjtp4dyJwQ8jltVUvyDFeh9ItpQ8KqgEA +diIXc3KaWfvIH6O51pl/FpAD7CC/9YrF4qccS7/FfEUY3uOToUGwM+3Sbk8UWG6v +Er477W4gS20RiZ3GKqseJD/SVphcj9H+0pJre+0VhDqzqlzGtG1dy86BN+XvliWS +7wQ8OAzwbWTvM1FPmG9VPQ7MB+osCz4JoCMLRSwCoElw2KinNgdoxoJe1Hi+z1sR +eWu/4l1WeRmlZLLohqQndM9V -----END CERTIFICATE----- Certificate: Data: @@ -94,8 +94,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -136,27 +136,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -172,11 +172,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/renewcerts.sh mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/renewcerts.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/renewcerts.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/renewcerts.sh 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,14 @@ #!/bin/sh +# bwrap execution environment to avoid port conflicts +if [ "${AM_BWRAPPED-}" != "yes" ]; then + bwrap_path="$(command -v bwrap)" + if [ -n "$bwrap_path" ]; then + export AM_BWRAPPED=yes + exec "$bwrap_path" --cap-add ALL --unshare-net --dev-bind / / "$0" "$@" + fi +fi + check_result(){ if [ $1 -ne 0 ]; then if [ -n "$2" ]; then @@ -80,10 +89,10 @@ update_cert server4 "www4.wolfssl.com" intermediate2-ca v3_req2 08 # REVOKED update_cert server5 "www5.wolfssl.com" intermediate3-ca v3_req3 09 - # Create response DER buffer for test openssl ocsp -port 22221 -ndays 1000 -index index-ca-and-intermediate-cas.txt -rsigner ocsp-responder-cert.pem -rkey ocsp-responder-key.pem -CA root-ca-cert.pem -partial_chain & PID=$! +sleep 1 # Make sure server is ready openssl ocsp -issuer ./root-ca-cert.pem -cert ./intermediate1-ca-cert.pem -url http://localhost:22221/ -respout test-response.der -noverify openssl ocsp -issuer ./root-ca-cert.pem -cert ./intermediate1-ca-cert.pem -url http://localhost:22221/ -respout test-response-nointern.der -no_intern -noverify @@ -95,6 +104,7 @@ # now start up a responder that signs using rsa-pss openssl ocsp -port 22221 -ndays 1000 -index index-ca-and-intermediate-cas.txt -rsigner ocsp-responder-cert.pem -rkey ocsp-responder-key.pem -CA root-ca-cert.pem -rsigopt rsa_padding_mode:pss & PID=$! +sleep 1 # Make sure server is ready openssl ocsp -issuer ./root-ca-cert.pem -cert ./intermediate1-ca-cert.pem -url http://localhost:22221/ -respout test-response-rsapss.der -noverify # can verify with the following command diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/root-ca-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/root-ca-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/root-ca-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/root-ca-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -83,11 +83,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server1-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server1-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server1-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server1-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www1.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22221 Signature Algorithm: sha256WithRSAEncryption - 1a:d1:4a:17:b8:a4:ad:57:8a:6d:91:eb:ee:1f:25:5b:83:4c: - f2:64:9e:f3:c9:1c:c9:02:f3:b8:c8:8d:43:f0:7b:9a:12:0c: - d0:35:8c:22:c3:46:3b:ec:da:ae:4a:e2:70:16:57:10:35:57: - f0:7d:74:c8:37:19:69:ba:a6:f6:dc:3a:1d:82:d8:ea:21:c1: - 35:a7:2c:fa:07:ee:20:01:5c:de:c3:ff:60:c1:af:df:9f:db: - 5b:e5:e6:2c:56:78:7c:5c:49:d8:d3:67:62:ba:d7:59:ee:83: - 6b:b6:bb:60:17:1b:c3:ac:f4:b3:5a:95:b6:cb:1c:1b:42:86: - a0:2c:d5:35:85:0d:22:6a:f4:94:cc:f6:bd:43:bc:ae:9c:d5: - 2f:be:f5:1d:85:6a:21:44:06:1c:f8:aa:d8:21:0a:66:2f:26: - a2:06:c3:9d:ec:61:18:d9:f4:af:48:b9:a1:45:f3:f2:66:12: - 3b:46:76:bd:3d:a5:ec:a8:8a:4c:d1:e3:6d:c5:cb:73:d2:66: - 7e:5e:db:f9:9a:ab:f3:c2:6f:cc:6d:c9:de:76:2f:a3:d1:3a: - 2c:40:c2:01:2d:d2:15:a7:4e:f1:43:6a:88:cf:f8:00:16:48: - 3d:85:f5:d5:c5:17:3e:ef:7a:8f:35:47:3b:21:92:8e:1d:f2: - 29:76:e4:5c + 2c:4a:52:45:c2:c6:40:fe:e1:c0:38:89:63:a1:24:44:f8:8c: + 1b:28:dc:55:69:19:b1:d0:53:46:01:36:f6:ee:b0:ac:71:3a: + a9:43:cb:43:99:73:f0:a7:c2:cb:73:d2:9a:02:6c:5b:12:c8: + ea:d7:87:18:cc:5a:a3:15:53:0f:94:b2:97:eb:78:e8:6e:8d: + 4d:3b:d4:23:88:98:7d:35:09:74:95:a8:05:49:57:d0:2a:3c: + 1b:96:1f:d0:5d:37:0a:a3:01:55:36:bb:17:6e:d9:9f:81:ee: + 7d:12:bc:ff:e0:22:ca:49:1e:f5:c4:06:8c:29:28:20:3a:b0: + a4:6e:82:6c:74:3b:56:37:e0:bb:42:9e:65:3f:19:b8:d2:2a: + 15:9e:92:39:8b:17:f2:ef:7f:d2:b8:79:a5:12:20:50:a2:31: + 55:52:a4:74:91:02:bc:0e:d0:43:01:c5:7c:4d:4e:b0:00:88: + a4:10:c5:9c:93:38:cb:05:48:c8:87:6a:54:f6:9c:38:77:2a: + 6f:ad:ab:b4:a2:23:bc:23:af:41:57:d3:f4:d6:27:b0:a6:f9: + 58:9c:76:76:4d:83:d2:27:ac:0e:af:95:2d:3a:9d:6c:1c:55: + 98:5a:a8:e0:1f:dd:13:a5:fc:72:e4:be:95:aa:57:99:3c:2e: + 16:70:e9:d1 -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBBTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMFoXDTI2MDkwODIyMTkzMFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 MS53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,12 +84,12 @@ GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBATALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIxMA0GCSqGSIb3DQEBCwUAA4IB -AQAa0UoXuKStV4ptkevuHyVbg0zyZJ7zyRzJAvO4yI1D8HuaEgzQNYwiw0Y77Nqu -SuJwFlcQNVfwfXTINxlpuqb23DodgtjqIcE1pyz6B+4gAVzew/9gwa/fn9tb5eYs -Vnh8XEnY02diutdZ7oNrtrtgFxvDrPSzWpW2yxwbQoagLNU1hQ0iavSUzPa9Q7yu -nNUvvvUdhWohRAYc+KrYIQpmLyaiBsOd7GEY2fSvSLmhRfPyZhI7Rna9PaXsqIpM -0eNtxctz0mZ+Xtv5mqvzwm/Mbcnedi+j0TosQMIBLdIVp07xQ2qIz/gAFkg9hfXV -xRc+73qPNUc7IZKOHfIpduRc +AQAsSlJFwsZA/uHAOIljoSRE+IwbKNxVaRmx0FNGATb27rCscTqpQ8tDmXPwp8LL +c9KaAmxbEsjq14cYzFqjFVMPlLKX63jobo1NO9QjiJh9NQl0lagFSVfQKjwblh/Q +XTcKowFVNrsXbtmfge59Erz/4CLKSR71xAaMKSggOrCkboJsdDtWN+C7Qp5lPxm4 +0ioVnpI5ixfy73/SuHmlEiBQojFVUqR0kQK8DtBDAcV8TU6wAIikEMWckzjLBUjI +h2pU9pw4dypvrau0oiO8I69BV9P01iewpvlYnHZ2TYPSJ6wOr5UtOp1sHFWYWqjg +H90Tpfxy5L6VqleZPC4WcOnR -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 5e:61:82:66:fd:b6:45:75:94:55:50:b9:ee:97:1a:48:73:ad: - 24:ba:19:ee:ce:e9:f3:07:ac:51:32:10:56:6a:c8:94:d0:ff: - 8b:37:e9:a9:de:29:e3:99:39:9f:84:f5:2b:de:57:de:d2:d9: - 44:b1:2b:03:9a:88:d2:d5:a8:48:f9:29:04:3d:f6:c0:60:06: - 13:c3:2e:4c:73:c2:c9:6a:07:0a:70:4f:4c:2e:8c:02:63:97: - 9e:70:2c:9c:fa:fb:cf:a9:2e:9c:e5:2f:14:43:3f:fb:61:6d: - fd:17:b9:94:f2:cd:c7:24:7e:e2:ba:3e:b9:76:df:52:d0:f7: - 2b:64:c1:31:e2:80:0f:ff:b1:7c:d2:af:14:4b:ec:dd:79:a7: - 23:c9:68:6a:e7:c6:2d:67:27:e7:37:d1:f8:93:37:58:e2:f3: - 9c:4d:38:5d:58:03:d1:30:f7:a6:ff:45:fe:69:11:d6:39:1e: - 11:d6:5b:42:75:c7:6c:cd:27:1f:59:98:88:03:a0:0f:fa:ad: - 28:2d:50:7b:b4:dc:7c:d4:5b:92:03:d0:55:dc:62:26:8f:50: - d0:6b:f8:c4:89:2b:8b:d1:77:5b:e9:68:b6:0a:15:1f:de:97: - f2:4d:a5:ad:d0:3c:d6:68:e8:4c:f8:a1:ac:44:a8:82:55:76: - 61:18:af:2d + 1c:06:f6:58:ee:a2:4d:11:dd:ce:51:2a:ea:3c:1e:13:62:2b: + e2:04:6d:ca:67:2b:14:1b:de:3e:72:7b:d2:12:29:59:e9:bd: + 3f:37:1f:9b:9c:15:84:40:10:c2:7b:1c:1f:16:2c:4e:f5:b7: + bb:7e:24:79:7a:e6:6b:6e:66:cf:4f:04:e5:31:b9:63:12:80: + 89:61:fc:ae:47:b3:bd:b0:63:d8:aa:77:ba:25:53:e5:f7:ca: + 63:d5:7f:6e:80:ed:75:c9:47:59:df:7a:82:87:2e:b8:cf:87: + c4:9a:0c:2f:ee:a9:a8:5a:7e:2b:55:30:e9:8b:05:f3:ab:60: + 7f:49:bd:16:de:73:8d:8f:72:48:35:23:a1:88:88:a8:9a:01: + 19:6c:6e:06:cf:c3:47:d9:68:0e:42:c3:84:d9:23:71:36:73: + c4:9d:bc:ed:f7:9b:e3:a0:8d:89:ac:ec:e7:75:22:1f:99:74: + 5b:4c:5b:b5:25:e1:7f:02:f3:07:ae:4f:b1:0b:21:f9:17:78: + 1a:b4:c6:8f:03:91:fb:b2:95:ff:6d:de:37:39:4a:57:c1:8c: + da:91:3a:4c:cc:fa:27:9a:4f:42:cb:4c:15:c7:08:34:8f:03: + a8:f1:2e:df:64:c5:ec:57:e1:90:77:2f:49:90:c1:23:4d:7b: + 9e:44:fb:08 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,12 +177,12 @@ ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAF5hgmb9tkV1lFVQue6XGkhzrSS6Ge7O6fMHrFEyEFZqyJTQ/4s36aneKeOZ -OZ+E9SveV97S2USxKwOaiNLVqEj5KQQ99sBgBhPDLkxzwslqBwpwT0wujAJjl55w -LJz6+8+pLpzlLxRDP/thbf0XuZTyzcckfuK6Prl231LQ9ytkwTHigA//sXzSrxRL -7N15pyPJaGrnxi1nJ+c30fiTN1ji85xNOF1YA9Ew96b/Rf5pEdY5HhHWW0J1x2zN -Jx9ZmIgDoA/6rSgtUHu03HzUW5ID0FXcYiaPUNBr+MSJK4vRd1vpaLYKFR/el/JN -pa3QPNZo6Ez4oaxEqIJVdmEYry0= +ggEBABwG9ljuok0R3c5RKuo8HhNiK+IEbcpnKxQb3j5ye9ISKVnpvT83H5ucFYRA +EMJ7HB8WLE71t7t+JHl65mtuZs9PBOUxuWMSgIlh/K5Hs72wY9iqd7olU+X3ymPV +f26A7XXJR1nfeoKHLrjPh8SaDC/uqahafitVMOmLBfOrYH9JvRbec42Pckg1I6GI +iKiaARlsbgbPw0fZaA5Cw4TZI3E2c8SdvO33m+OgjYms7Od1Ih+ZdFtMW7Ul4X8C +8weuT7ELIfkXeBq0xo8Dkfuylf9t3jc5SlfBjNqROkzM+ieaT0LLTBXHCDSPA6jx +Lt9kxexX4ZB3L0mQwSNNe55E+wg= -----END CERTIFICATE----- Certificate: Data: @@ -191,8 +191,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -233,27 +233,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server2-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server2-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server2-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server2-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www2.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22221 Signature Algorithm: sha256WithRSAEncryption - 3f:9f:3d:c8:e3:a8:70:32:c1:81:67:64:b8:df:3b:e4:73:8f: - 99:84:9c:d5:d5:70:a2:6e:de:5d:a0:42:52:80:a0:01:09:49: - 6b:c3:fd:79:12:7c:9e:42:44:a5:74:d7:bc:ad:2a:3a:6b:a9: - e4:1d:b8:cc:16:25:2f:4b:47:67:b5:a2:94:ce:e0:a4:20:95: - 94:29:e2:66:01:4c:86:62:79:37:dd:58:de:f1:32:fe:d8:f8: - a0:ee:7c:e3:1f:e5:cd:dc:be:fd:30:10:3b:e1:8c:35:fa:89: - 85:83:57:45:80:b1:7c:36:7c:87:0a:89:80:8f:15:6b:33:f1: - c8:93:cf:fe:ac:18:d0:cf:4f:e0:7e:eb:b4:b1:b9:63:30:5c: - f3:7f:e2:29:81:09:18:7a:d7:70:a0:81:15:2e:82:33:89:d2: - 1d:70:73:9c:3d:d9:0c:6a:03:09:6c:b2:11:fd:d2:a8:9b:d8: - 67:17:80:66:c3:7a:eb:28:26:ac:12:8f:87:64:07:a2:e6:e4: - 00:01:94:db:8c:82:6e:4f:41:1d:bd:3f:2b:e7:de:8d:84:dd: - 8c:66:88:f4:af:8d:ae:ef:7e:6c:a1:1d:be:61:74:6e:61:24: - de:5a:6f:d8:56:66:45:24:5c:4f:f5:0b:b0:d4:92:78:2c:d8: - 2a:02:0e:12 + ba:b8:a9:5b:b2:3b:55:29:f6:8e:08:d9:48:7b:12:4e:45:65: + bb:4a:d0:23:82:c8:2b:f1:2e:fd:34:d1:e8:d0:b9:89:35:f3: + 49:e4:67:6b:bf:72:ae:26:48:20:1e:0d:22:11:11:d1:b3:b2: + 9f:d2:47:b5:b0:64:37:03:0b:aa:62:9b:26:b1:c5:52:72:80: + 12:d8:67:20:3b:f4:59:72:06:99:f6:ff:92:f7:50:05:46:30: + 11:d3:b4:e2:5b:03:cc:f8:01:d2:8e:de:2b:0a:52:6a:76:66: + a8:e3:80:06:a3:60:e2:c5:6b:62:4d:12:0d:9a:43:a6:c7:e5: + 87:1d:02:65:f2:35:66:e2:07:05:66:32:df:5f:14:7f:9b:89: + 60:61:41:8c:bb:ad:1c:9e:92:7d:19:4c:8a:3c:d9:9f:6c:d7: + c3:a9:13:b3:13:2c:38:e0:e6:e1:0c:4c:55:f0:25:42:73:6a: + c1:79:82:0a:a5:95:ef:2a:0e:29:cd:76:88:af:e4:da:e6:95: + 22:55:dc:8f:67:3e:eb:c8:6b:4a:86:1f:2a:13:40:ee:a2:5e: + 59:61:77:3b:c7:81:d2:6e:ed:ea:08:55:ea:c4:1f:11:d8:50: + c5:a1:c7:46:57:c7:02:4c:ce:3b:e5:1b:9d:cf:59:73:24:7c: + 07:cf:8f:f6 -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBBjANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMFoXDTI2MDkwODIyMTkzMFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 Mi53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,12 +84,12 @@ GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBATALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIxMA0GCSqGSIb3DQEBCwUAA4IB -AQA/nz3I46hwMsGBZ2S43zvkc4+ZhJzV1XCibt5doEJSgKABCUlrw/15EnyeQkSl -dNe8rSo6a6nkHbjMFiUvS0dntaKUzuCkIJWUKeJmAUyGYnk33Vje8TL+2Pig7nzj -H+XN3L79MBA74Yw1+omFg1dFgLF8NnyHComAjxVrM/HIk8/+rBjQz0/gfuu0sblj -MFzzf+IpgQkYetdwoIEVLoIzidIdcHOcPdkMagMJbLIR/dKom9hnF4Bmw3rrKCas -Eo+HZAei5uQAAZTbjIJuT0EdvT8r596NhN2MZoj0r42u735soR2+YXRuYSTeWm/Y -VmZFJFxP9Quw1JJ4LNgqAg4S +AQC6uKlbsjtVKfaOCNlIexJORWW7StAjgsgr8S79NNHo0LmJNfNJ5Gdrv3KuJkgg +Hg0iERHRs7Kf0ke1sGQ3AwuqYpsmscVScoAS2GcgO/RZcgaZ9v+S91AFRjAR07Ti +WwPM+AHSjt4rClJqdmao44AGo2DixWtiTRINmkOmx+WHHQJl8jVm4gcFZjLfXxR/ +m4lgYUGMu60cnpJ9GUyKPNmfbNfDqROzEyw44ObhDExV8CVCc2rBeYIKpZXvKg4p +zXaIr+Ta5pUiVdyPZz7ryGtKhh8qE0Duol5ZYXc7x4HSbu3qCFXqxB8R2FDFocdG +V8cCTM475Rudz1lzJHwHz4/2 -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 5e:61:82:66:fd:b6:45:75:94:55:50:b9:ee:97:1a:48:73:ad: - 24:ba:19:ee:ce:e9:f3:07:ac:51:32:10:56:6a:c8:94:d0:ff: - 8b:37:e9:a9:de:29:e3:99:39:9f:84:f5:2b:de:57:de:d2:d9: - 44:b1:2b:03:9a:88:d2:d5:a8:48:f9:29:04:3d:f6:c0:60:06: - 13:c3:2e:4c:73:c2:c9:6a:07:0a:70:4f:4c:2e:8c:02:63:97: - 9e:70:2c:9c:fa:fb:cf:a9:2e:9c:e5:2f:14:43:3f:fb:61:6d: - fd:17:b9:94:f2:cd:c7:24:7e:e2:ba:3e:b9:76:df:52:d0:f7: - 2b:64:c1:31:e2:80:0f:ff:b1:7c:d2:af:14:4b:ec:dd:79:a7: - 23:c9:68:6a:e7:c6:2d:67:27:e7:37:d1:f8:93:37:58:e2:f3: - 9c:4d:38:5d:58:03:d1:30:f7:a6:ff:45:fe:69:11:d6:39:1e: - 11:d6:5b:42:75:c7:6c:cd:27:1f:59:98:88:03:a0:0f:fa:ad: - 28:2d:50:7b:b4:dc:7c:d4:5b:92:03:d0:55:dc:62:26:8f:50: - d0:6b:f8:c4:89:2b:8b:d1:77:5b:e9:68:b6:0a:15:1f:de:97: - f2:4d:a5:ad:d0:3c:d6:68:e8:4c:f8:a1:ac:44:a8:82:55:76: - 61:18:af:2d + 1c:06:f6:58:ee:a2:4d:11:dd:ce:51:2a:ea:3c:1e:13:62:2b: + e2:04:6d:ca:67:2b:14:1b:de:3e:72:7b:d2:12:29:59:e9:bd: + 3f:37:1f:9b:9c:15:84:40:10:c2:7b:1c:1f:16:2c:4e:f5:b7: + bb:7e:24:79:7a:e6:6b:6e:66:cf:4f:04:e5:31:b9:63:12:80: + 89:61:fc:ae:47:b3:bd:b0:63:d8:aa:77:ba:25:53:e5:f7:ca: + 63:d5:7f:6e:80:ed:75:c9:47:59:df:7a:82:87:2e:b8:cf:87: + c4:9a:0c:2f:ee:a9:a8:5a:7e:2b:55:30:e9:8b:05:f3:ab:60: + 7f:49:bd:16:de:73:8d:8f:72:48:35:23:a1:88:88:a8:9a:01: + 19:6c:6e:06:cf:c3:47:d9:68:0e:42:c3:84:d9:23:71:36:73: + c4:9d:bc:ed:f7:9b:e3:a0:8d:89:ac:ec:e7:75:22:1f:99:74: + 5b:4c:5b:b5:25:e1:7f:02:f3:07:ae:4f:b1:0b:21:f9:17:78: + 1a:b4:c6:8f:03:91:fb:b2:95:ff:6d:de:37:39:4a:57:c1:8c: + da:91:3a:4c:cc:fa:27:9a:4f:42:cb:4c:15:c7:08:34:8f:03: + a8:f1:2e:df:64:c5:ec:57:e1:90:77:2f:49:90:c1:23:4d:7b: + 9e:44:fb:08 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAxMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,12 +177,12 @@ ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAF5hgmb9tkV1lFVQue6XGkhzrSS6Ge7O6fMHrFEyEFZqyJTQ/4s36aneKeOZ -OZ+E9SveV97S2USxKwOaiNLVqEj5KQQ99sBgBhPDLkxzwslqBwpwT0wujAJjl55w -LJz6+8+pLpzlLxRDP/thbf0XuZTyzcckfuK6Prl231LQ9ytkwTHigA//sXzSrxRL -7N15pyPJaGrnxi1nJ+c30fiTN1ji85xNOF1YA9Ew96b/Rf5pEdY5HhHWW0J1x2zN -Jx9ZmIgDoA/6rSgtUHu03HzUW5ID0FXcYiaPUNBr+MSJK4vRd1vpaLYKFR/el/JN -pa3QPNZo6Ez4oaxEqIJVdmEYry0= +ggEBABwG9ljuok0R3c5RKuo8HhNiK+IEbcpnKxQb3j5ye9ISKVnpvT83H5ucFYRA +EMJ7HB8WLE71t7t+JHl65mtuZs9PBOUxuWMSgIlh/K5Hs72wY9iqd7olU+X3ymPV +f26A7XXJR1nfeoKHLrjPh8SaDC/uqahafitVMOmLBfOrYH9JvRbec42Pckg1I6GI +iKiaARlsbgbPw0fZaA5Cw4TZI3E2c8SdvO33m+OgjYms7Od1Ih+ZdFtMW7Ul4X8C +8weuT7ELIfkXeBq0xo8Dkfuylf9t3jc5SlfBjNqROkzM+ieaT0LLTBXHCDSPA6jx +Lt9kxexX4ZB3L0mQwSNNe55E+wg= -----END CERTIFICATE----- Certificate: Data: @@ -191,8 +191,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -233,27 +233,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server3-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server3-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server3-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server3-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www3.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22222 Signature Algorithm: sha256WithRSAEncryption - 53:1b:11:4b:be:f0:22:0d:83:25:ba:b6:6e:c9:52:0f:3e:57: - 1c:6a:05:8e:2f:9e:04:be:6a:30:8c:cb:49:18:d8:49:cd:5f: - f1:05:c4:ea:80:18:bf:ac:7c:4b:a6:b0:a7:88:4d:92:9a:5e: - 86:77:2d:8b:4e:c8:96:2d:69:c9:9a:9f:ce:02:be:c2:72:ad: - d1:a3:ba:b1:9d:90:c6:4c:7b:bb:4f:62:37:96:51:c1:36:e3: - 23:1d:58:47:4a:d3:e9:66:39:db:81:3d:24:4a:ba:52:37:47: - 3a:5c:b3:86:74:5d:18:11:6c:4b:d5:ff:ff:22:08:39:2f:f6: - 60:ba:df:0a:c9:0f:d8:f0:ac:91:42:94:90:6e:04:cc:2d:25: - 36:cd:39:0c:a4:fb:04:93:19:c6:d7:af:21:00:cf:d2:ce:ff: - bb:ea:42:e9:09:1e:2e:94:bb:d3:05:0c:06:2f:ac:52:9f:9d: - 37:0e:40:a1:67:c6:d3:dc:5d:a8:38:1b:42:90:94:8b:72:4f: - b1:c6:2f:06:59:9e:22:de:d9:3e:82:02:b9:5a:db:e4:c6:76: - ae:01:70:72:0e:80:a6:eb:1d:a5:95:92:16:23:a5:7f:4a:68: - 5c:3b:57:7c:44:16:d0:30:fa:0a:a7:23:6d:be:c9:3f:87:86: - 62:b9:5c:8c + 64:30:09:ad:e2:e1:ee:8d:00:a6:54:80:95:3c:89:fe:cf:40: + 2f:28:4a:e0:54:e5:51:79:88:90:95:27:61:9a:3f:3c:a0:b3: + a1:9f:01:44:ad:45:a2:cf:cc:2a:10:cc:31:28:48:f4:1a:c7: + 01:f0:e4:3f:5d:89:39:20:b0:ad:52:0c:f9:f1:d7:82:a6:fa: + b2:61:53:1e:97:35:63:15:58:52:fa:1d:88:09:b2:74:6e:5b: + 76:ab:e9:07:05:e9:97:57:df:f5:73:ec:e2:07:46:f6:5f:fe: + 03:25:0b:0b:c0:9d:6e:7a:a6:c2:b3:18:79:2f:93:a4:8c:25: + 71:d1:d8:fe:6d:d1:4a:af:4e:8d:a4:fc:33:f0:78:18:38:3a: + dd:e6:1b:7c:94:68:d3:13:9f:a3:56:2c:02:d1:5d:1a:2d:ad: + c6:28:4e:58:5d:5f:d6:d6:7c:2c:68:c4:74:71:ab:64:92:75: + a7:ba:1f:77:b1:96:fa:0c:e2:81:1f:9e:17:4e:b9:da:1a:33: + 40:33:12:74:cb:6d:28:e3:cc:0b:c1:30:58:c5:ba:65:66:a8: + a1:71:82:76:e7:03:43:8f:7f:03:0f:56:bb:1c:24:93:fb:34: + 97:1f:09:71:f9:f0:1f:46:42:fb:fe:9d:68:be:25:ea:17:a8: + 6d:4c:a1:05 -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMFoXDTI2MDkwODIyMTkzMFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 My53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,12 +84,12 @@ GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBAjALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIyMA0GCSqGSIb3DQEBCwUAA4IB -AQBTGxFLvvAiDYMlurZuyVIPPlccagWOL54EvmowjMtJGNhJzV/xBcTqgBi/rHxL -prCniE2Sml6Gdy2LTsiWLWnJmp/OAr7Ccq3Ro7qxnZDGTHu7T2I3llHBNuMjHVhH -StPpZjnbgT0kSrpSN0c6XLOGdF0YEWxL1f//Igg5L/Zgut8KyQ/Y8KyRQpSQbgTM -LSU2zTkMpPsEkxnG168hAM/Szv+76kLpCR4ulLvTBQwGL6xSn503DkChZ8bT3F2o -OBtCkJSLck+xxi8GWZ4i3tk+ggK5WtvkxnauAXByDoCm6x2llZIWI6V/SmhcO1d8 -RBbQMPoKpyNtvsk/h4ZiuVyM +AQBkMAmt4uHujQCmVICVPIn+z0AvKErgVOVReYiQlSdhmj88oLOhnwFErUWiz8wq +EMwxKEj0GscB8OQ/XYk5ILCtUgz58deCpvqyYVMelzVjFVhS+h2ICbJ0blt2q+kH +BemXV9/1c+ziB0b2X/4DJQsLwJ1ueqbCsxh5L5OkjCVx0dj+bdFKr06NpPwz8HgY +ODrd5ht8lGjTE5+jViwC0V0aLa3GKE5YXV/W1nwsaMR0catkknWnuh93sZb6DOKB +H54XTrnaGjNAMxJ0y20o48wLwTBYxbplZqihcYJ25wNDj38DD1a7HCST+zSXHwlx ++fAfRkL7/p1oviXqF6htTKEF -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 07:cd:8a:f3:e6:37:76:a8:e8:3b:2a:0f:20:f9:3c:3b:65:f4: - fc:0a:c2:83:cd:f9:d8:19:82:6c:42:01:65:ad:a8:80:6a:20: - a2:00:d4:e2:bd:61:8c:b1:1d:1f:39:5a:40:3d:9a:5b:47:1c: - 20:a0:b9:1a:d0:b1:8d:9f:50:d1:04:b8:bd:a4:9c:75:86:e8: - 1a:c6:da:d8:08:ee:ae:da:0d:12:cb:9e:42:f2:16:5c:c0:bc: - 0f:f5:e4:1f:59:13:ff:21:4f:3a:66:0f:5d:e0:5c:32:1e:5c: - f7:23:4c:ef:6e:5f:e7:97:f1:91:88:36:89:1d:71:19:83:96: - 9d:92:36:2b:c3:e5:2d:9f:e2:82:e6:53:7c:4a:40:62:67:20: - 58:c5:d2:f3:b8:21:10:65:a9:6f:cb:2f:20:6f:96:b4:19:ce: - 94:af:9c:8f:39:0d:18:41:14:0c:87:1d:c0:83:6a:ee:d4:f7: - 5b:cf:03:a9:9e:65:26:91:2a:c1:f5:dd:03:f3:81:5a:5e:a5: - b8:79:2a:9c:16:81:de:d8:19:41:7c:9e:eb:3b:0c:6e:90:be: - a0:35:18:ee:4e:05:ae:10:96:38:23:12:8b:68:02:a4:e0:40: - 48:4b:e0:d0:2f:28:5c:3b:85:4c:39:fa:3b:d5:25:4e:7f:12: - 71:c0:56:12 + 3b:38:b5:57:a7:f6:d6:b1:19:55:b8:da:47:74:cf:9a:6b:6e: + ff:0a:5d:06:17:33:db:db:38:e5:d1:9c:dd:c7:3e:c2:2e:87: + 20:52:48:d0:ad:0c:12:3e:f7:66:41:64:d2:ca:b3:4c:a1:0a: + 6c:4b:4b:33:94:74:83:2e:2d:44:5a:13:ae:da:9a:18:87:64: + 30:cf:69:70:e8:38:47:de:55:27:06:86:9b:24:d5:b0:8f:17: + 3b:95:87:7e:4a:45:45:2e:6d:70:27:90:32:62:a8:36:3e:47: + 47:0f:0e:1b:93:cf:3d:3e:9b:2c:9a:ff:0c:ee:a7:1b:40:c4: + dc:f2:66:74:eb:d9:11:9d:60:b8:24:b4:89:c1:e4:61:20:3d: + 38:af:45:ad:e8:ee:69:c3:96:8a:a5:c1:cd:dd:14:87:97:dc: + f8:32:84:a8:3b:0a:eb:61:0e:7c:4c:65:69:3d:02:92:db:c4: + bf:21:6f:89:fe:cc:76:df:c5:84:fb:c4:ea:1a:60:da:d0:c8: + 27:7c:65:1b:cb:23:20:5a:e2:23:90:bd:f5:5c:0a:85:51:37: + 84:47:a7:80:f4:e0:a0:72:8d:7a:b8:71:03:44:59:c6:cf:2c: + ae:df:91:a9:74:72:eb:a7:31:b2:81:65:19:e6:df:c3:4b:b7: + fc:9c:2c:f0 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,12 +177,12 @@ ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAAfNivPmN3ao6DsqDyD5PDtl9PwKwoPN+dgZgmxCAWWtqIBqIKIA1OK9YYyx -HR85WkA9mltHHCCguRrQsY2fUNEEuL2knHWG6BrG2tgI7q7aDRLLnkLyFlzAvA/1 -5B9ZE/8hTzpmD13gXDIeXPcjTO9uX+eX8ZGINokdcRmDlp2SNivD5S2f4oLmU3xK -QGJnIFjF0vO4IRBlqW/LLyBvlrQZzpSvnI85DRhBFAyHHcCDau7U91vPA6meZSaR -KsH13QPzgVpepbh5KpwWgd7YGUF8nus7DG6QvqA1GO5OBa4QljgjEotoAqTgQEhL -4NAvKFw7hUw5+jvVJU5/EnHAVhI= +ggEBADs4tVen9taxGVW42kd0z5prbv8KXQYXM9vbOOXRnN3HPsIuhyBSSNCtDBI+ +92ZBZNLKs0yhCmxLSzOUdIMuLURaE67amhiHZDDPaXDoOEfeVScGhpsk1bCPFzuV +h35KRUUubXAnkDJiqDY+R0cPDhuTzz0+myya/wzupxtAxNzyZnTr2RGdYLgktInB +5GEgPTivRa3o7mnDloqlwc3dFIeX3PgyhKg7CuthDnxMZWk9ApLbxL8hb4n+zHbf +xYT7xOoaYNrQyCd8ZRvLIyBa4iOQvfVcCoVRN4RHp4D04KByjXq4cQNEWcbPLK7f +kal0cuunMbKBZRnm38NLt/ycLPA= -----END CERTIFICATE----- Certificate: Data: @@ -191,8 +191,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -233,27 +233,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server4-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server4-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server4-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server4-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www4.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22222 Signature Algorithm: sha256WithRSAEncryption - 9c:41:a8:e6:45:2a:be:8c:8a:57:16:8f:b8:5a:b8:b9:e8:13: - 6e:72:68:50:de:c3:7b:8f:39:37:be:01:ed:17:fb:6b:eb:44: - 9d:e0:c0:81:37:93:18:88:12:7a:08:b0:7e:69:e9:2d:35:6b: - 67:6d:22:ff:5c:f0:1f:2e:cd:96:99:ba:c5:42:0d:b1:22:3c: - 86:ed:88:dc:2e:a4:71:81:22:4d:b8:c5:0c:cb:d6:31:86:34: - cb:5d:f3:7e:f2:fb:49:ed:6a:c6:0b:73:39:de:93:cd:15:41: - 80:b9:c2:94:8b:71:57:09:dd:1e:84:30:e5:a1:77:79:18:26: - b6:06:d7:75:5b:ef:2e:cb:be:be:a3:8e:69:69:12:60:fa:46: - 35:cb:2a:c3:31:65:64:af:da:a9:a1:e9:31:78:39:fa:01:f2: - 41:c5:5f:3d:db:19:14:6f:10:38:fb:c5:fe:e5:c6:6d:38:c3: - bd:f3:73:38:42:93:46:e4:3e:76:f1:eb:98:32:d2:dd:0a:2a: - a0:2a:7b:67:e8:cd:ea:52:f7:eb:7c:51:65:e8:25:28:3f:71: - c0:2b:fd:7f:b3:ad:e2:a9:3a:f8:0f:72:08:0f:2a:ab:e7:61: - 2a:b0:45:5c:a0:40:dd:db:1b:13:c3:c2:63:a3:14:42:bb:00: - c7:1e:6c:0d + 78:ac:f7:40:1e:05:a5:e6:46:e0:d9:f7:e6:1b:c8:d2:76:7a: + e3:e6:b9:5d:0a:73:47:78:4b:e0:58:e1:d7:86:8d:b0:cc:e1: + 17:f5:88:c1:84:5a:0f:de:ab:d1:b6:ed:ce:c3:d2:e3:cd:ef: + 50:6c:90:67:fd:c6:5c:1e:25:28:d6:1f:4e:75:67:b2:9b:16: + e7:74:f5:a2:a5:f6:a8:8f:da:de:20:51:c8:60:35:48:f9:0d: + 5f:b1:45:62:a7:2d:ff:12:f9:29:6c:66:1b:80:33:30:6c:f0: + be:f7:22:47:a5:f9:75:e5:fb:1b:0c:fe:f5:09:31:a9:d8:7c: + 0a:90:7e:92:48:b7:0d:11:a3:eb:39:d1:a8:fe:bd:8b:a6:81: + 1e:38:7b:73:c7:cd:2e:c6:52:1b:68:60:2f:7d:ca:5e:32:4a: + ec:89:8a:50:fd:bc:81:d3:ea:8e:47:3b:8b:77:e7:d8:69:27: + 86:25:da:24:0f:26:cc:a2:16:04:53:29:4a:55:26:3b:f5:13: + f2:5d:01:08:5f:9e:b9:81:48:28:3c:e7:36:6f:f9:76:07:16: + b9:79:b7:31:75:35:7e:c3:f0:0b:e2:0f:58:1a:3d:64:70:13: + 2e:e1:3c:0b:70:08:69:15:bf:58:5c:ca:f3:fa:65:72:77:f7: + 05:61:d4:d7 -----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIBCDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NM IGludGVybWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZgxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMFoXDTI2MDkwODIyMTkzMFowgZgxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYD VQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UEAwwQd3d3 NC53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC @@ -84,12 +84,12 @@ GDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 b2xmc3NsLmNvbYIBAjALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAkMCIGCCsG AQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIyMA0GCSqGSIb3DQEBCwUAA4IB -AQCcQajmRSq+jIpXFo+4Wri56BNucmhQ3sN7jzk3vgHtF/tr60Sd4MCBN5MYiBJ6 -CLB+aektNWtnbSL/XPAfLs2WmbrFQg2xIjyG7YjcLqRxgSJNuMUMy9YxhjTLXfN+ -8vtJ7WrGC3M53pPNFUGAucKUi3FXCd0ehDDloXd5GCa2Btd1W+8uy76+o45paRJg -+kY1yyrDMWVkr9qpoekxeDn6AfJBxV892xkUbxA4+8X+5cZtOMO983M4QpNG5D52 -8euYMtLdCiqgKntn6M3qUvfrfFFl6CUoP3HAK/1/s63iqTr4D3IIDyqr52EqsEVc -oEDd2xsTw8JjoxRCuwDHHmwN +AQB4rPdAHgWl5kbg2ffmG8jSdnrj5rldCnNHeEvgWOHXho2wzOEX9YjBhFoP3qvR +tu3Ow9Ljze9QbJBn/cZcHiUo1h9OdWeymxbndPWipfaoj9reIFHIYDVI+Q1fsUVi +py3/EvkpbGYbgDMwbPC+9yJHpfl15fsbDP71CTGp2HwKkH6SSLcNEaPrOdGo/r2L +poEeOHtzx80uxlIbaGAvfcpeMkrsiYpQ/byB0+qORzuLd+fYaSeGJdokDybMohYE +UylKVSY79RPyXQEIX565gUgoPOc2b/l2Bxa5ebcxdTV+w/AL4g9YGj1kcBMu4TwL +cAhpFb9YXMrz+mVyd/cFYdTX -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL intermediate CA 2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 07:cd:8a:f3:e6:37:76:a8:e8:3b:2a:0f:20:f9:3c:3b:65:f4: - fc:0a:c2:83:cd:f9:d8:19:82:6c:42:01:65:ad:a8:80:6a:20: - a2:00:d4:e2:bd:61:8c:b1:1d:1f:39:5a:40:3d:9a:5b:47:1c: - 20:a0:b9:1a:d0:b1:8d:9f:50:d1:04:b8:bd:a4:9c:75:86:e8: - 1a:c6:da:d8:08:ee:ae:da:0d:12:cb:9e:42:f2:16:5c:c0:bc: - 0f:f5:e4:1f:59:13:ff:21:4f:3a:66:0f:5d:e0:5c:32:1e:5c: - f7:23:4c:ef:6e:5f:e7:97:f1:91:88:36:89:1d:71:19:83:96: - 9d:92:36:2b:c3:e5:2d:9f:e2:82:e6:53:7c:4a:40:62:67:20: - 58:c5:d2:f3:b8:21:10:65:a9:6f:cb:2f:20:6f:96:b4:19:ce: - 94:af:9c:8f:39:0d:18:41:14:0c:87:1d:c0:83:6a:ee:d4:f7: - 5b:cf:03:a9:9e:65:26:91:2a:c1:f5:dd:03:f3:81:5a:5e:a5: - b8:79:2a:9c:16:81:de:d8:19:41:7c:9e:eb:3b:0c:6e:90:be: - a0:35:18:ee:4e:05:ae:10:96:38:23:12:8b:68:02:a4:e0:40: - 48:4b:e0:d0:2f:28:5c:3b:85:4c:39:fa:3b:d5:25:4e:7f:12: - 71:c0:56:12 + 3b:38:b5:57:a7:f6:d6:b1:19:55:b8:da:47:74:cf:9a:6b:6e: + ff:0a:5d:06:17:33:db:db:38:e5:d1:9c:dd:c7:3e:c2:2e:87: + 20:52:48:d0:ad:0c:12:3e:f7:66:41:64:d2:ca:b3:4c:a1:0a: + 6c:4b:4b:33:94:74:83:2e:2d:44:5a:13:ae:da:9a:18:87:64: + 30:cf:69:70:e8:38:47:de:55:27:06:86:9b:24:d5:b0:8f:17: + 3b:95:87:7e:4a:45:45:2e:6d:70:27:90:32:62:a8:36:3e:47: + 47:0f:0e:1b:93:cf:3d:3e:9b:2c:9a:ff:0c:ee:a7:1b:40:c4: + dc:f2:66:74:eb:d9:11:9d:60:b8:24:b4:89:c1:e4:61:20:3d: + 38:af:45:ad:e8:ee:69:c3:96:8a:a5:c1:cd:dd:14:87:97:dc: + f8:32:84:a8:3b:0a:eb:61:0e:7c:4c:65:69:3d:02:92:db:c4: + bf:21:6f:89:fe:cc:76:df:c5:84:fb:c4:ea:1a:60:da:d0:c8: + 27:7c:65:1b:cb:23:20:5a:e2:23:90:bd:f5:5c:0a:85:51:37: + 84:47:a7:80:f4:e0:a0:72:8d:7a:b8:71:03:44:59:c6:cf:2c: + ae:df:91:a9:74:72:eb:a7:31:b2:81:65:19:e6:df:c3:4b:b7: + fc:9c:2c:f0 -----BEGIN CERTIFICATE----- MIIE8DCCA9igAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSIwIAYDVQQDDBl3b2xmU1NMIGludGVy bWVkaWF0ZSBDQSAyMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIB @@ -177,12 +177,12 @@ ZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQmMCQwIgYI KwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcNAQELBQAD -ggEBAAfNivPmN3ao6DsqDyD5PDtl9PwKwoPN+dgZgmxCAWWtqIBqIKIA1OK9YYyx -HR85WkA9mltHHCCguRrQsY2fUNEEuL2knHWG6BrG2tgI7q7aDRLLnkLyFlzAvA/1 -5B9ZE/8hTzpmD13gXDIeXPcjTO9uX+eX8ZGINokdcRmDlp2SNivD5S2f4oLmU3xK -QGJnIFjF0vO4IRBlqW/LLyBvlrQZzpSvnI85DRhBFAyHHcCDau7U91vPA6meZSaR -KsH13QPzgVpepbh5KpwWgd7YGUF8nus7DG6QvqA1GO5OBa4QljgjEotoAqTgQEhL -4NAvKFw7hUw5+jvVJU5/EnHAVhI= +ggEBADs4tVen9taxGVW42kd0z5prbv8KXQYXM9vbOOXRnN3HPsIuhyBSSNCtDBI+ +92ZBZNLKs0yhCmxLSzOUdIMuLURaE67amhiHZDDPaXDoOEfeVScGhpsk1bCPFzuV +h35KRUUubXAnkDJiqDY+R0cPDhuTzz0+myya/wzupxtAxNzyZnTr2RGdYLgktInB +5GEgPTivRa3o7mnDloqlwc3dFIeX3PgyhKg7CuthDnxMZWk9ApLbxL8hb4n+zHbf +xYT7xOoaYNrQyCd8ZRvLIyBa4iOQvfVcCoVRN4RHp4D04KByjXq4cQNEWcbPLK7f +kal0cuunMbKBZRnm38NLt/ycLPA= -----END CERTIFICATE----- Certificate: Data: @@ -191,8 +191,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -233,27 +233,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server5-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server5-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/server5-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/server5-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL REVOKED intermediate CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = www5.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -47,27 +47,27 @@ OCSP - URI:http://127.0.0.1:22223 Signature Algorithm: sha256WithRSAEncryption - 0f:48:1f:2c:44:58:6e:56:07:19:c2:7e:5e:80:60:c6:b8:df: - fb:71:6e:ae:e9:a4:1d:2a:4c:6a:ef:41:78:20:df:15:3b:82: - 7c:5c:c3:00:51:f5:27:41:58:50:dc:bb:a8:71:0a:d6:3e:d8: - 9b:27:03:70:39:01:08:7a:06:59:e2:51:1d:b4:74:c4:e3:ae: - 1b:0e:1f:9c:d2:95:df:79:51:4c:a5:d2:48:8d:9a:ed:1e:21: - fd:59:e4:45:b4:bd:ac:d7:1a:1a:e7:9f:c6:ac:17:4f:2c:0d: - e6:39:fd:c3:68:37:c7:c8:42:ca:da:83:42:73:76:ae:64:20: - f7:99:46:7c:d8:a4:1c:f6:27:3b:06:e2:25:7b:e7:98:83:8c: - d0:8a:0c:69:ce:7a:c7:19:a7:5b:25:52:bd:4e:d6:2d:2e:1b: - 02:29:17:c9:d9:5a:d2:f8:4c:ff:98:1a:50:d5:08:78:45:af: - ad:6b:a6:92:b5:fc:d4:5f:34:48:b7:9d:6a:f9:22:bd:b0:23: - 99:6b:f1:63:00:ac:68:59:63:88:01:ba:1b:00:81:1c:cd:3a: - b2:77:95:e6:65:d4:06:a8:95:22:a4:81:9b:8c:0f:44:94:73: - 1c:ee:2a:89:38:f1:c9:bd:9f:24:b4:f8:b8:71:cc:1a:f4:d0: - d6:f4:d5:2a + 84:bf:97:d9:fd:33:9a:1b:36:a4:48:58:45:f6:97:3b:58:4d: + 40:ba:46:d0:7a:e3:53:40:d3:45:7f:1e:87:fd:66:bb:c0:43: + 93:34:76:0b:68:31:e5:fb:89:15:d5:b3:59:c5:a3:f5:e7:79: + 65:b3:1d:38:d2:cd:af:4d:7d:ea:9e:3e:ce:7e:51:90:83:b6: + 19:2e:30:d5:0e:94:03:d2:5c:a0:d9:25:3f:8d:c2:97:67:ea: + 4a:a6:f0:32:b3:e7:b6:bf:dc:a6:7a:5c:23:b8:46:05:52:80: + b1:9e:1e:53:05:a7:93:ce:2a:43:ae:f5:58:61:2d:d8:2d:77: + c9:50:7e:4a:47:36:04:0b:4c:23:b3:c8:f5:99:97:5c:5d:f1: + d9:f2:9a:5e:78:72:02:61:4f:eb:55:53:f1:bd:1c:45:75:fd: + 7c:2e:db:41:ef:54:47:9b:9a:b9:60:fd:77:f9:9b:36:76:93: + ee:73:12:49:3e:bb:62:8a:3f:02:58:ba:73:16:e7:53:81:c2: + 5c:f3:21:32:fe:60:42:dc:d5:8a:6a:9f:60:cc:1c:76:5a:e4: + 9c:30:da:9e:32:d0:ca:d6:a5:d6:3e:28:9d:09:68:dc:6e:d9: + fd:54:92:5e:0d:20:4c:96:ff:f2:01:b5:72:22:cb:f1:fc:ed: + c7:cf:b1:54 -----BEGIN CERTIFICATE----- MIIE9DCCA9ygAwIBAgIBCTANBgkqhkiG9w0BAQsFADCBpzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSgwJgYDVQQDDB93b2xmU1NM IFJFVk9LRUQgaW50ZXJtZWRpYXRlIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZgxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkzMFoXDTI2MDkwODIyMTkzMFowgZgxCzAJ BgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxl MRAwDgYDVQQKDAd3b2xmU1NMMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEZMBcGA1UE AwwQd3d3NS53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns @@ -84,12 +84,12 @@ ZXJpbmcxGDAWBgNVBAMMD3dvbGZTU0wgcm9vdCBDQTEfMB0GCSqGSIb3DQEJARYQ aW5mb0B3b2xmc3NsLmNvbYIBAzALBgNVHQ8EBAMCBeAwMgYIKwYBBQUHAQEEJjAk MCIGCCsGAQUFBzABhhZodHRwOi8vMTI3LjAuMC4xOjIyMjIzMA0GCSqGSIb3DQEB -CwUAA4IBAQAPSB8sRFhuVgcZwn5egGDGuN/7cW6u6aQdKkxq70F4IN8VO4J8XMMA -UfUnQVhQ3LuocQrWPtibJwNwOQEIegZZ4lEdtHTE464bDh+c0pXfeVFMpdJIjZrt -HiH9WeRFtL2s1xoa55/GrBdPLA3mOf3DaDfHyELK2oNCc3auZCD3mUZ82KQc9ic7 -BuIle+eYg4zQigxpznrHGadbJVK9TtYtLhsCKRfJ2VrS+Ez/mBpQ1Qh4Ra+ta6aS -tfzUXzRIt51q+SK9sCOZa/FjAKxoWWOIAbobAIEczTqyd5XmZdQGqJUipIGbjA9E -lHMc7iqJOPHJvZ8ktPi4ccwa9NDW9NUq +CwUAA4IBAQCEv5fZ/TOaGzakSFhF9pc7WE1AukbQeuNTQNNFfx6H/Wa7wEOTNHYL +aDHl+4kV1bNZxaP153llsx040s2vTX3qnj7OflGQg7YZLjDVDpQD0lyg2SU/jcKX +Z+pKpvAys+e2v9ymelwjuEYFUoCxnh5TBaeTzipDrvVYYS3YLXfJUH5KRzYEC0wj +s8j1mZdcXfHZ8ppeeHICYU/rVVPxvRxFdf18LttB71RHm5q5YP13+Zs2dpPucxJJ +Prtiij8CWLpzFudTgcJc8yEy/mBC3NWKap9gzBx2WuScMNqeMtDK1qXWPiidCWjc +btn9VJJeDSBMlv/yAbVyIsvx/O3Hz7FU -----END CERTIFICATE----- Certificate: Data: @@ -98,8 +98,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL REVOKED intermediate CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -140,27 +140,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - a4:9b:e4:ec:56:45:77:92:36:91:66:cc:25:11:1a:1d:48:d5: - f8:4a:32:04:6f:ea:76:c7:0c:27:8a:8c:f1:ef:08:d4:47:60: - 66:5e:3f:61:76:fc:a2:84:c1:42:01:89:b6:17:d9:eb:14:e6: - 61:7e:8e:18:2e:64:be:14:ef:2d:ce:63:10:d6:b3:00:ec:f3: - fc:4f:a0:1b:6f:e7:75:18:fe:ca:ef:47:12:dc:c8:ae:f9:05: - 2b:84:14:d5:ad:df:58:84:81:33:51:90:5d:29:b8:ff:48:6b: - f5:bb:e9:c7:be:6f:e1:6a:ca:71:47:1f:97:7f:1d:00:56:9a: - 59:f6:78:4e:95:6c:e8:51:73:8e:9d:f3:62:00:f7:65:bd:09: - d7:e4:ae:7e:04:ee:1e:eb:f3:83:3f:2a:44:f4:98:f8:ef:31: - ed:06:77:60:e3:f2:6b:b6:dd:3e:ed:45:aa:07:a9:7f:99:f5: - 2d:9b:ce:10:16:3a:cd:96:fb:40:1b:18:f4:eb:6f:f0:dc:ee: - e8:aa:30:13:3c:d6:1e:46:7d:55:1f:0b:86:5c:13:f9:2f:83: - b8:65:55:8d:3e:56:8b:d9:b7:e1:1b:2d:ab:f2:e7:3a:c4:6f: - 2a:c9:f0:f9:96:82:93:ac:a7:06:1c:0e:bb:2a:ff:6a:be:eb: - 91:b0:8c:dc + 2f:e1:b0:99:a9:71:0e:41:f8:b1:9d:38:c8:f4:3d:7c:79:ce: + d2:94:01:2a:b6:71:1b:4c:64:19:27:02:71:b4:43:64:42:f9: + 2b:71:39:6e:64:4e:e8:32:b1:1e:1b:fd:7d:22:cb:8a:9c:34: + ce:ef:bb:dd:f2:4f:83:58:33:34:01:cb:b4:35:e2:ba:c6:cc: + aa:2f:ed:2e:e9:04:ec:cd:7f:06:50:b3:4e:37:cd:fe:96:69: + da:a3:fe:63:78:83:c5:86:7e:03:b2:11:e5:94:f8:56:e9:d1: + dd:5d:b4:05:4d:26:0e:09:c2:50:32:ce:6d:da:6b:b7:ee:e1: + 1b:a9:b0:0f:59:d6:03:16:ee:47:16:2f:1f:58:f9:f8:48:d9: + 59:ed:61:a1:af:7e:92:38:2e:40:0c:9b:e7:21:90:3b:10:6f: + 61:ad:e0:95:57:e2:d5:39:dc:83:54:88:99:4a:5e:21:94:ce: + f9:0f:5e:e9:22:10:55:bb:97:f4:51:3f:50:83:ed:63:fb:ab: + d2:02:b3:aa:26:f7:fc:72:1c:84:e9:a0:a3:fa:b2:22:90:c8: + ac:61:84:2a:bd:3f:75:1f:1b:bf:83:a8:90:ce:4c:de:ee:eb: + 65:b4:ff:f0:7a:b2:11:7a:78:60:c4:6e:da:e3:c8:a3:57:5b: + 8f:58:e4:49 -----BEGIN CERTIFICATE----- MIIE9jCCA96gAwIBAgIBAzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBpzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBpzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMSgwJgYDVQQDDB93b2xmU1NMIFJFVk9L RUQgaW50ZXJtZWRpYXRlIENBMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu @@ -177,12 +177,12 @@ bmVlcmluZzEYMBYGA1UEAwwPd29sZlNTTCByb290IENBMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFjMAsGA1UdDwQEAwIBBjAyBggrBgEFBQcBAQQm MCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly8xMjcuMC4wLjE6MjIyMjAwDQYJKoZIhvcN -AQELBQADggEBAKSb5OxWRXeSNpFmzCURGh1I1fhKMgRv6nbHDCeKjPHvCNRHYGZe -P2F2/KKEwUIBibYX2esU5mF+jhguZL4U7y3OYxDWswDs8/xPoBtv53UY/srvRxLc -yK75BSuEFNWt31iEgTNRkF0puP9Ia/W76ce+b+FqynFHH5d/HQBWmln2eE6VbOhR -c46d82IA92W9Cdfkrn4E7h7r84M/KkT0mPjvMe0Gd2Dj8mu23T7tRaoHqX+Z9S2b -zhAWOs2W+0AbGPTrb/Dc7uiqMBM81h5GfVUfC4ZcE/kvg7hlVY0+VovZt+EbLavy -5zrEbyrJ8PmWgpOspwYcDrsq/2q+65GwjNw= +AQELBQADggEBAC/hsJmpcQ5B+LGdOMj0PXx5ztKUASq2cRtMZBknAnG0Q2RC+Stx +OW5kTugysR4b/X0iy4qcNM7vu93yT4NYMzQBy7Q14rrGzKov7S7pBOzNfwZQs043 +zf6Wadqj/mN4g8WGfgOyEeWU+Fbp0d1dtAVNJg4JwlAyzm3aa7fu4RupsA9Z1gMW +7kcWLx9Y+fhI2VntYaGvfpI4LkAMm+chkDsQb2Gt4JVX4tU53INUiJlKXiGUzvkP +XukiEFW7l/RRP1CD7WP7q9ICs6om9/xyHITpoKP6siKQyKxhhCq9P3UfG7+DqJDO +TN7u62W0//B6shF6eGDEbtrjyKNXW49Y5Ek= -----END CERTIFICATE----- Certificate: Data: @@ -191,8 +191,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Engineering, CN = wolfSSL root CA, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -233,27 +233,27 @@ OCSP - URI:http://127.0.0.1:22220 Signature Algorithm: sha256WithRSAEncryption - 61:fc:6f:3d:f5:07:35:f4:3c:55:de:78:74:83:96:b8:3d:11: - 05:a4:d6:9a:c1:24:89:6f:9d:d5:0c:04:37:b5:97:06:b8:4f: - 87:d1:01:9c:17:2b:20:c7:5a:7e:55:1b:5a:aa:e7:d2:2a:c7: - ad:6d:de:17:cb:4c:4b:b0:64:3e:71:9f:03:18:c8:b4:79:62: - 95:63:67:23:ee:68:5b:68:48:3f:44:75:a2:ae:ee:90:df:fb: - 0d:c1:96:0b:e3:4f:4a:16:b4:1c:26:9b:66:a0:32:35:e3:68: - 81:e6:a3:1e:0a:7b:6c:8e:4e:3f:73:bf:96:6c:f0:ca:89:d1: - d2:f8:6b:cb:5a:2f:73:ed:e9:25:2f:2d:24:24:82:b4:0f:b9: - 84:f5:98:ce:8e:87:da:cc:2a:ae:61:d8:fb:3e:c0:b7:6d:30: - f3:7a:9b:d5:65:81:e8:3e:07:a5:e0:14:cd:32:1f:d1:68:43: - 81:92:e3:94:0f:55:34:04:5a:c4:6d:e8:c1:7b:d3:27:32:52: - 90:3b:10:6b:83:9d:9f:87:6f:49:f4:85:eb:d7:da:9a:2b:a4: - 85:f1:48:ba:9d:84:ea:7c:4c:d5:e4:ec:c2:9f:da:e7:a9:82: - e3:3f:7a:2d:48:37:dd:ef:61:9e:f7:d2:8b:3d:9e:e8:b1:5c: - 25:f7:16:61 + 63:f7:e7:80:e2:73:b0:7f:c2:32:c0:20:45:01:1e:40:bc:85: + 8e:7f:04:3b:c6:fe:3f:d1:b9:14:ce:06:d9:e8:fc:cd:b9:1d: + 0f:cb:89:71:a9:34:67:e8:be:b8:27:d1:1f:c4:ff:9b:9d:b9: + bd:f8:23:c7:e5:7f:04:20:de:b1:30:b2:5d:c2:99:a5:f8:34: + 9d:d7:0a:bc:b5:3a:84:64:2e:5b:24:34:01:da:03:a9:bb:cf: + f2:0d:0e:06:68:de:34:90:cb:42:3a:62:31:d0:d6:7d:26:ca: + 14:e5:87:70:51:a2:71:85:cf:4e:af:7c:6c:45:69:d1:3c:6c: + 9c:47:35:be:13:bc:12:a9:ea:c4:2f:71:d3:a5:6b:10:4b:85: + 68:93:68:81:1c:9f:e6:6a:e7:c0:e1:a6:09:28:f9:d4:a4:55: + e8:dc:e3:e2:14:86:0c:ef:3d:7a:7f:8d:d2:a3:e6:c8:0b:e7: + 1c:45:6d:0d:e9:9a:d6:38:4f:52:73:a7:5c:04:e9:ce:77:af: + 94:97:7b:56:a8:eb:bc:b6:f6:7a:ed:6a:8f:68:04:b4:ea:ce: + 05:d8:f7:bc:99:ae:6f:38:9a:ee:23:4d:c5:53:e6:70:fe:5c: + 60:68:c4:0c:79:c3:eb:49:d5:df:a6:98:5b:ba:6e:f6:c6:30: + e0:5e:3e:c3 -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIBYzANBgkqhkiG9w0BAQsFADCBlzELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoM B3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NM -IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIx -MjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +IHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMx +MjEzMjIxOTMwWhcNMjYwOTA4MjIxOTMwWjCBlzELMAkGA1UEBhMCVVMxEzARBgNV BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT U0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93b2xmU1NMIHJvb3Qg Q0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0GCSqGSIb3 @@ -269,11 +269,11 @@ EDAOBgNVBAoMB3dvbGZTU0wxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQD DA93b2xmU1NMIHJvb3QgQ0ExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j b22CAWMwCwYDVR0PBAQDAgEGMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcwAYYW -aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAYfxvPfUH -NfQ8Vd54dIOWuD0RBaTWmsEkiW+d1QwEN7WXBrhPh9EBnBcrIMdaflUbWqrn0irH -rW3eF8tMS7BkPnGfAxjItHlilWNnI+5oW2hIP0R1oq7ukN/7DcGWC+NPSha0HCab -ZqAyNeNogeajHgp7bI5OP3O/lmzwyonR0vhry1ovc+3pJS8tJCSCtA+5hPWYzo6H -2swqrmHY+z7At20w83qb1WWB6D4HpeAUzTIf0WhDgZLjlA9VNARaxG3owXvTJzJS -kDsQa4Odn4dvSfSF69famiukhfFIup2E6nxM1eTswp/a56mC4z96LUg33e9hnvfS -iz2e6LFcJfcWYQ== +aHR0cDovLzEyNy4wLjAuMToyMjIyMDANBgkqhkiG9w0BAQsFAAOCAQEAY/fngOJz +sH/CMsAgRQEeQLyFjn8EO8b+P9G5FM4G2ej8zbkdD8uJcak0Z+i+uCfRH8T/m525 +vfgjx+V/BCDesTCyXcKZpfg0ndcKvLU6hGQuWyQ0AdoDqbvP8g0OBmjeNJDLQjpi +MdDWfSbKFOWHcFGicYXPTq98bEVp0TxsnEc1vhO8EqnqxC9x06VrEEuFaJNogRyf +5mrnwOGmCSj51KRV6Nzj4hSGDO89en+N0qPmyAvnHEVtDema1jhPUnOnXATpznev +lJd7VqjrvLb2eu1qj2gEtOrOBdj3vJmubzia7iNNxVPmcP5cYGjEDHnD60nV36aY +W7pu9sYw4F4+ww== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/test-multi-response.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-multi-response.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/test-response-nointern.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-response-nointern.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/test-response-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-response-rsapss.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/ocsp/test-response.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/ocsp/test-response.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/ca-p521.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/ca-p521.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/ca-p521.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/ca-p521.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/ca-p521.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/ca-p521.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_P521, OU = Root-P521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = CA-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -34,20 +34,20 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:81:88:02:42:01:ac:ed:31:5e:dc:f2:66:a1:d4:26:4a:82: - 31:b2:24:46:93:db:4c:62:bc:77:30:97:96:ef:a2:2d:21:45: - 0a:18:0c:bc:a6:1c:6c:68:69:63:a0:60:66:18:63:e9:ee:4c: - cc:6c:8f:c8:45:b9:32:d2:3c:9b:6e:f7:6b:8c:bd:08:5f:02: - 42:01:53:85:38:dc:06:3a:75:be:c7:9c:7d:02:77:e5:8b:ba: - a6:f8:9f:e1:80:79:cb:e1:4a:44:e3:f8:8b:00:46:2c:66:b0: - 95:1c:d7:2f:59:70:6a:c9:47:d6:c9:74:16:1f:8a:90:ad:f8: - bd:5f:df:97:ad:c9:f8:0b:bc:3c:ca:c7:cc + 30:81:88:02:42:01:7a:a6:21:f5:b6:c2:fa:e1:44:c6:03:f5: + 54:2d:35:ef:d9:55:f6:61:45:90:48:8c:c2:3e:81:76:30:06: + 05:c2:db:32:19:b5:df:37:44:a6:3f:33:fa:3a:c7:91:ae:0f: + fb:10:8b:b8:4d:41:b3:ed:c2:d2:5c:37:28:eb:d7:b7:6c:02: + 42:01:47:23:40:e8:e2:ca:61:74:29:e0:a6:71:5b:0a:c9:45: + 17:04:7d:5d:11:02:d7:f0:af:60:e0:4c:0a:97:96:09:2e:e0: + 25:f8:50:d8:9c:f9:bd:17:3d:d3:50:cc:49:06:81:7e:af:fa: + 85:b8:1f:80:c4:64:08:56:53:39:8d:2f:40 -----BEGIN CERTIFICATE----- MIIDITCCAoKgAwIBAgIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEDAO BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZT U0xfUDUyMTESMBAGA1UECwwJUm9vdC1QNTIxMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBrjELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI5WhcNMjYwOTA4MjIxOTI5WjCBrjELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xfcDUy MTEQMA4GA1UECwwHQ0EtcDUyMTEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8w HQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwH @@ -57,7 +57,7 @@ dTRTKQPtSFQh5Y+VtZtBjV/dctJao2MwYTAdBgNVHQ4EFgQUQIkdMF4MbtU9xtUl kNq2Qmft6YIwHwYDVR0jBBgwFoAUZKdolVMzGKIgkrxkVaarynZom8gwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwIDgYwAMIGIAkIB -rO0xXtzyZqHUJkqCMbIkRpPbTGK8dzCXlu+iLSFFChgMvKYcbGhpY6BgZhhj6e5M -zGyPyEW5MtI8m273a4y9CF8CQgFThTjcBjp1vsecfQJ35Yu6pvif4YB5y+FKROP4 -iwBGLGawlRzXL1lwaslH1sl0Fh+KkK34vV/fl63J+Au8PMrHzA== +eqYh9bbC+uFExgP1VC0179lV9mFFkEiMwj6BdjAGBcLbMhm13zdEpj8z+jrHka4P ++xCLuE1Bs+3C0lw3KOvXt2wCQgFHI0Do4sphdCngpnFbCslFFwR9XREC1/CvYOBM +CpeWCS7gJfhQ2Jz5vRc901DMSQaBfq/6hbgfgMRkCFZTOY0vQA== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/client-p521.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/client-p521.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/client-p521.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/client-p521.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/client-p521.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/client-p521.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 1b:e7:ad:f2:5f:af:5f:50:fd:42:84:2e:ea:1b:dc:6f:c5:1a:8b:4c + 55:89:bc:f6:2c:af:36:2b:2f:5f:8c:ec:da:ed:37:60:89:d1:7f:81 Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = Client-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = Client-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -30,7 +30,7 @@ X509v3 Authority Key Identifier: keyid:20:E1:BF:57:E5:F3:C3:0C:72:84:6A:C6:DF:BC:22:D0:B7:25:E5:A4 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_p521/OU=Client-p521/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/UID=wolfSSL - serial:1B:E7:AD:F2:5F:AF:5F:50:FD:42:84:2E:EA:1B:DC:6F:C5:1A:8B:4C + serial:55:89:BC:F6:2C:AF:36:2B:2F:5F:8C:EC:DA:ED:37:60:89:D1:7F:81 X509v3 Basic Constraints: CA:TRUE @@ -39,21 +39,21 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:81:88:02:42:01:cc:61:be:73:0b:51:f7:60:c9:52:97:d8: - 69:4f:ce:33:17:36:0e:04:a6:aa:28:c5:2d:78:95:6a:85:7e: - 40:c7:04:ab:62:70:1c:3d:8c:94:99:57:ce:27:6b:39:8d:47: - ef:d2:cc:b7:57:1c:f4:0a:d0:ea:30:5f:2b:37:9c:c1:80:02: - 42:01:02:71:1e:00:5e:8f:d1:b0:e4:fd:7b:eb:be:13:8d:84: - 6e:6c:7b:23:60:d5:33:3a:38:2d:5d:82:1c:b1:cd:ba:be:e2: - 2c:32:67:95:e9:c6:c3:07:a0:7c:ba:14:f3:1e:b5:aa:63:1e: - 69:5e:a0:21:b7:8f:7b:af:38:6a:4e:ae:25 + 30:81:88:02:42:01:3f:4e:19:e3:8b:f6:83:21:55:cb:49:cf: + bf:35:16:9c:cd:fb:5d:d8:d3:34:a2:35:ff:67:40:b6:3e:3d: + 6e:2f:1d:01:78:7a:87:b1:ae:ad:cb:b3:8a:9a:4a:5b:a4:e2: + c9:6e:42:10:39:20:64:98:64:9b:2f:da:15:94:c8:51:ea:02: + 42:00:bf:77:aa:d8:22:6b:b8:a0:9b:bf:5e:89:5d:f0:54:8e: + 3c:08:a7:cb:28:11:c5:e1:45:17:d1:bf:d5:dc:bb:65:37:f1: + 90:12:6c:62:d5:b5:b2:8f:73:e8:1b:ac:a8:80:03:a7:22:5d: + dc:1b:7d:c2:62:c4:f7:e4:ec:73:65:21:9f -----BEGIN CERTIFICATE----- -MIIEVTCCA7agAwIBAgIUG+et8l+vX1D9QoQu6hvcb8Uai0wwCgYIKoZIzj0EAwIw +MIIEVTCCA7agAwIBAgIUVYm89iyvNisvX4zs2u03YInRf4EwCgYIKoZIzj0EAwIw gbIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMRUwEwYDVQQKDAx3b2xmU1NMX3A1MjExFDASBgNVBAsMC0NsaWVudC1wNTIx MRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9A -d29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIyMTIxNjIx -MTc1MFoXDTI1MDkxMTIxMTc1MFowgbIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdN +d29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIzMTIxMzIy +MTkyOVoXDTI2MDkwODIyMTkyOVowgbIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdN b250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMX3A1MjEx FDASBgNVBAsMC0NsaWVudC1wNTIxMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20x HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEB @@ -65,11 +65,11 @@ 5aShgbikgbUwgbIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYD VQQHDAdCb3plbWFuMRUwEwYDVQQKDAx3b2xmU1NMX3A1MjExFDASBgNVBAsMC0Ns aWVudC1wNTIxMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B -CQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMghQb -563yX69fUP1ChC7qG9xvxRqLTDAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4 +CQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMghRV +ibz2LK82Ky9fjOza7TdgidF/gTAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4 YW1wbGUuY29thwR/AAABMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAK -BggqhkjOPQQDAgOBjAAwgYgCQgHMYb5zC1H3YMlSl9hpT84zFzYOBKaqKMUteJVq -hX5AxwSrYnAcPYyUmVfOJ2s5jUfv0sy3Vxz0CtDqMF8rN5zBgAJCAQJxHgBej9Gw -5P17674TjYRubHsjYNUzOjgtXYIcsc26vuIsMmeV6cbDB6B8uhTzHrWqYx5pXqAh -t497rzhqTq4l +BggqhkjOPQQDAgOBjAAwgYgCQgE/Thnji/aDIVXLSc+/NRaczftd2NM0ojX/Z0C2 +Pj1uLx0BeHqHsa6ty7OKmkpbpOLJbkIQOSBkmGSbL9oVlMhR6gJCAL93qtgia7ig +m79eiV3wVI48CKfLKBHF4UUX0b/V3LtlN/GQEmxi1bWyj3PoG6yogAOnIl3cG33C +YsT35OxzZSGf -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/root-p521.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/root-p521.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/root-p521.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/root-p521.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/root-p521.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/root-p521.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 5e:2d:39:08:4a:69:db:18:5b:e0:10:c7:3a:14:36:d2:7b:09:55:60 + 5a:b0:33:c0:79:0a:75:aa:a7:98:c9:77:e2:a0:3b:25:21:9c:19:85 Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_P521, OU = Root-P521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_P521, OU = Root-P521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -35,20 +35,20 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:81:86:02:41:23:19:29:57:83:27:13:0e:21:b2:35:d2:a9: - 32:56:86:88:78:9f:54:a2:f2:17:b1:d1:44:ee:53:2a:90:b2: - 5e:0e:00:c9:9f:7e:94:59:47:28:13:a0:3b:8d:8e:b2:b5:25: - 61:37:d1:94:b8:3b:d1:6f:5f:91:e1:3b:69:f2:8d:04:02:41: - 10:e8:8d:c1:25:2e:64:1d:93:50:eb:b1:77:f1:93:83:48:d6: - 6b:b0:d2:ae:8f:4f:14:1e:f2:93:df:2b:4d:53:df:8f:a6:ea: - 0a:48:67:08:c2:a4:29:f3:b4:7f:63:0b:2f:46:63:7b:6b:4f: - e4:b6:f0:df:24:82:e4:a4:e3:78:80 + 30:81:87:02:42:00:f8:22:58:d1:cc:73:6f:28:15:7f:86:18: + d9:af:ed:44:51:bb:0a:6b:43:99:9d:97:b3:6e:ae:ac:61:09: + f5:55:6a:3c:35:fd:b5:2f:7f:d5:e2:93:10:93:99:ae:d7:75: + 05:be:68:ca:13:b1:e5:d1:05:24:f9:5f:6a:f9:c2:7b:4a:02: + 41:60:8b:76:dd:e0:02:de:2e:e7:ff:3b:33:f8:ef:6d:ca:31: + 45:cb:cd:9e:73:f4:f1:26:eb:2a:6c:6c:ea:3f:81:f3:78:55: + 5e:25:74:27:cb:57:8c:60:be:39:80:f6:e3:43:d8:80:b5:f9: + c5:8d:6d:c2:a8:6e:3e:67:50:5a:97:8e -----BEGIN CERTIFICATE----- -MIIDGzCCAn6gAwIBAgIUXi05CEpp2xhb4BDHOhQ20nsJVWAwCgYIKoZIzj0EAwIw +MIIDHDCCAn6gAwIBAgIUWrAzwHkKdaqnmMl34qA7JSGcGYUwCgYIKoZIzj0EAwIw gZcxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMRUwEwYDVQQKDAx3b2xmU1NMX1A1MjExEjAQBgNVBAsMCVJvb3QtUDUyMTEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZcxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgZcxCzAJ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRUw EwYDVQQKDAx3b2xmU1NMX1A1MjExEjAQBgNVBAsMCVJvb3QtUDUyMTEYMBYGA1UE AwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu @@ -57,8 +57,8 @@ RElznC9QP4OgHovRqvsIDJAFDQwXMVE+1oU7CRKC0aYIzchPalrIjI5dv9rMW5Wh 6FopeCKyukmhhcZIinFTjYmjYzBhMB0GA1UdDgQWBBRkp2iVUzMYoiCSvGRVpqvK dmibyDAfBgNVHSMEGDAWgBRkp2iVUzMYoiCSvGRVpqvKdmibyDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgOBigAwgYYCQSMZKVeD -JxMOIbI10qkyVoaIeJ9UovIXsdFE7lMqkLJeDgDJn36UWUcoE6A7jY6ytSVhN9GU -uDvRb1+R4Ttp8o0EAkEQ6I3BJS5kHZNQ67F38ZODSNZrsNKuj08UHvKT3ytNU9+P -puoKSGcIwqQp87R/YwsvRmN7a0/ktvDfJILkpON4gA== +BTADAQH/MA4GA1UdDwEB/wQEAwIBhjAKBggqhkjOPQQDAgOBiwAwgYcCQgD4IljR +zHNvKBV/hhjZr+1EUbsKa0OZnZezbq6sYQn1VWo8Nf21L3/V4pMQk5mu13UFvmjK +E7Hl0QUk+V9q+cJ7SgJBYIt23eAC3i7n/zsz+O9tyjFFy82ec/TxJusqbGzqP4Hz +eFVeJXQny1eMYL45gPbjQ9iAtfnFjW3CqG4+Z1Bal44= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/server-p521-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/server-p521-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = CA-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = Server-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -38,20 +38,20 @@ Netscape Cert Type: SSL Server Signature Algorithm: ecdsa-with-SHA256 - 30:81:88:02:42:01:ab:16:c5:5c:76:07:6c:fd:5f:ca:01:bd: - a4:22:7a:ab:be:9a:9c:3b:c7:6b:bb:5a:c1:60:9b:21:4d:c8: - c6:1c:bd:22:e3:20:ff:69:16:2a:12:2d:62:ea:36:57:fa:30: - 9b:d0:bf:fe:84:68:6b:6c:0c:e2:e7:bc:0d:dd:78:06:ab:02: - 42:00:cc:ec:88:c4:e2:45:9e:97:df:a7:e9:9c:02:be:8e:7f: - a7:70:11:40:7b:5b:b9:8c:04:94:82:5a:8a:41:9f:77:ac:90: - dc:f6:0a:d8:79:b2:ca:5a:c7:26:23:f8:3e:01:e4:db:0a:17: - 84:44:5d:34:69:1f:b6:88:55:a3:86:8a:0f + 30:81:87:02:41:51:c1:26:8c:3f:53:fe:7c:28:f5:3f:81:e6: + de:7b:ae:ad:f3:6e:be:c2:3a:88:91:f7:31:e8:24:5c:67:08: + 7d:34:f5:54:2e:0a:50:f4:f7:9d:d5:96:19:ec:49:2c:da:a8: + a0:2a:08:71:cd:b7:17:1a:e3:10:b2:bf:41:8d:aa:b2:02:42: + 01:00:b1:0d:96:19:a0:b1:76:d6:e1:a5:44:41:d4:c8:53:5a: + 57:4a:b9:4a:a4:6a:ef:cd:97:e9:e4:4d:7c:c8:ea:37:37:61: + 1a:ec:c7:1e:20:cd:2c:05:64:dd:54:e2:06:7b:74:af:05:0d: + 59:5c:e9:cd:e8:a8:61:92:cb:8c:d9:f0 -----BEGIN CERTIFICATE----- -MIIDYzCCAsSgAwIBAgIBATAKBggqhkjOPQQDAjCBrjELMAkGA1UEBhMCVVMxEDAO +MIIDYjCCAsSgAwIBAgIBATAKBggqhkjOPQQDAjCBrjELMAkGA1UEBhMCVVMxEDAO BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZT U0xfcDUyMTEQMA4GA1UECwwHQ0EtcDUyMTEYMBYGA1UEAwwPd3d3LndvbGZzc2wu Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPy -LGQBAQwHd29sZlNTTDAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGy +LGQBAQwHd29sZlNTTDAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIGy MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1h bjEVMBMGA1UECgwMd29sZlNTTF9wNTIxMRQwEgYDVQQLDAtTZXJ2ZXItcDUyMTEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -62,8 +62,8 @@ o4GJMIGGMB0GA1UdDgQWBBSFhp+uc1+Udyc7FRXGeQeoQkse8zAfBgNVHSMEGDAW gBRAiR0wXgxu1T3G1SWQ2rZCZ+3pgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQE AwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATARBglghkgBhvhCAQEEBAMCBkAwCgYI -KoZIzj0EAwIDgYwAMIGIAkIBqxbFXHYHbP1fygG9pCJ6q76anDvHa7tawWCbIU3I -xhy9IuMg/2kWKhItYuo2V/owm9C//oRoa2wM4ue8Dd14BqsCQgDM7IjE4kWel9+n -6ZwCvo5/p3ARQHtbuYwElIJaikGfd6yQ3PYK2HmyylrHJiP4PgHk2woXhERdNGkf -tohVo4aKDw== +KoZIzj0EAwIDgYsAMIGHAkFRwSaMP1P+fCj1P4Hm3nuurfNuvsI6iJH3MegkXGcI +fTT1VC4KUPT3ndWWGexJLNqooCoIcc23FxrjELK/QY2qsgJCAQCxDZYZoLF21uGl +REHUyFNaV0q5SqRq782X6eRNfMjqNzdhGuzHHiDNLAVk3VTiBnt0rwUNWVzpzeio +YZLLjNnw -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/server-p521.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/server-p521.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/p521/server-p521.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/p521/server-p521.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = CA-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = Server-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -38,20 +38,20 @@ Netscape Cert Type: SSL Server Signature Algorithm: ecdsa-with-SHA256 - 30:81:88:02:42:01:ab:16:c5:5c:76:07:6c:fd:5f:ca:01:bd: - a4:22:7a:ab:be:9a:9c:3b:c7:6b:bb:5a:c1:60:9b:21:4d:c8: - c6:1c:bd:22:e3:20:ff:69:16:2a:12:2d:62:ea:36:57:fa:30: - 9b:d0:bf:fe:84:68:6b:6c:0c:e2:e7:bc:0d:dd:78:06:ab:02: - 42:00:cc:ec:88:c4:e2:45:9e:97:df:a7:e9:9c:02:be:8e:7f: - a7:70:11:40:7b:5b:b9:8c:04:94:82:5a:8a:41:9f:77:ac:90: - dc:f6:0a:d8:79:b2:ca:5a:c7:26:23:f8:3e:01:e4:db:0a:17: - 84:44:5d:34:69:1f:b6:88:55:a3:86:8a:0f + 30:81:87:02:41:51:c1:26:8c:3f:53:fe:7c:28:f5:3f:81:e6: + de:7b:ae:ad:f3:6e:be:c2:3a:88:91:f7:31:e8:24:5c:67:08: + 7d:34:f5:54:2e:0a:50:f4:f7:9d:d5:96:19:ec:49:2c:da:a8: + a0:2a:08:71:cd:b7:17:1a:e3:10:b2:bf:41:8d:aa:b2:02:42: + 01:00:b1:0d:96:19:a0:b1:76:d6:e1:a5:44:41:d4:c8:53:5a: + 57:4a:b9:4a:a4:6a:ef:cd:97:e9:e4:4d:7c:c8:ea:37:37:61: + 1a:ec:c7:1e:20:cd:2c:05:64:dd:54:e2:06:7b:74:af:05:0d: + 59:5c:e9:cd:e8:a8:61:92:cb:8c:d9:f0 -----BEGIN CERTIFICATE----- -MIIDYzCCAsSgAwIBAgIBATAKBggqhkjOPQQDAjCBrjELMAkGA1UEBhMCVVMxEDAO +MIIDYjCCAsSgAwIBAgIBATAKBggqhkjOPQQDAjCBrjELMAkGA1UEBhMCVVMxEDAO BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZT U0xfcDUyMTEQMA4GA1UECwwHQ0EtcDUyMTEYMBYGA1UEAwwPd3d3LndvbGZzc2wu Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPy -LGQBAQwHd29sZlNTTDAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGy +LGQBAQwHd29sZlNTTDAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIGy MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1h bjEVMBMGA1UECgwMd29sZlNTTF9wNTIxMRQwEgYDVQQLDAtTZXJ2ZXItcDUyMTEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -62,10 +62,10 @@ o4GJMIGGMB0GA1UdDgQWBBSFhp+uc1+Udyc7FRXGeQeoQkse8zAfBgNVHSMEGDAW gBRAiR0wXgxu1T3G1SWQ2rZCZ+3pgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQE AwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATARBglghkgBhvhCAQEEBAMCBkAwCgYI -KoZIzj0EAwIDgYwAMIGIAkIBqxbFXHYHbP1fygG9pCJ6q76anDvHa7tawWCbIU3I -xhy9IuMg/2kWKhItYuo2V/owm9C//oRoa2wM4ue8Dd14BqsCQgDM7IjE4kWel9+n -6ZwCvo5/p3ARQHtbuYwElIJaikGfd6yQ3PYK2HmyylrHJiP4PgHk2woXhERdNGkf -tohVo4aKDw== +KoZIzj0EAwIDgYsAMIGHAkFRwSaMP1P+fCj1P4Hm3nuurfNuvsI6iJH3MegkXGcI +fTT1VC4KUPT3ndWWGexJLNqooCoIcc23FxrjELK/QY2qsgJCAQCxDZYZoLF21uGl +REHUyFNaV0q5SqRq782X6eRNfMjqNzdhGuzHHiDNLAVk3VTiBnt0rwUNWVzpzeio +YZLLjNnw -----END CERTIFICATE----- Certificate: Data: @@ -74,8 +74,8 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_P521, OU = Root-P521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_p521, OU = CA-p521, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -103,20 +103,20 @@ X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign Signature Algorithm: ecdsa-with-SHA256 - 30:81:88:02:42:01:ac:ed:31:5e:dc:f2:66:a1:d4:26:4a:82: - 31:b2:24:46:93:db:4c:62:bc:77:30:97:96:ef:a2:2d:21:45: - 0a:18:0c:bc:a6:1c:6c:68:69:63:a0:60:66:18:63:e9:ee:4c: - cc:6c:8f:c8:45:b9:32:d2:3c:9b:6e:f7:6b:8c:bd:08:5f:02: - 42:01:53:85:38:dc:06:3a:75:be:c7:9c:7d:02:77:e5:8b:ba: - a6:f8:9f:e1:80:79:cb:e1:4a:44:e3:f8:8b:00:46:2c:66:b0: - 95:1c:d7:2f:59:70:6a:c9:47:d6:c9:74:16:1f:8a:90:ad:f8: - bd:5f:df:97:ad:c9:f8:0b:bc:3c:ca:c7:cc + 30:81:88:02:42:01:7a:a6:21:f5:b6:c2:fa:e1:44:c6:03:f5: + 54:2d:35:ef:d9:55:f6:61:45:90:48:8c:c2:3e:81:76:30:06: + 05:c2:db:32:19:b5:df:37:44:a6:3f:33:fa:3a:c7:91:ae:0f: + fb:10:8b:b8:4d:41:b3:ed:c2:d2:5c:37:28:eb:d7:b7:6c:02: + 42:01:47:23:40:e8:e2:ca:61:74:29:e0:a6:71:5b:0a:c9:45: + 17:04:7d:5d:11:02:d7:f0:af:60:e0:4c:0a:97:96:09:2e:e0: + 25:f8:50:d8:9c:f9:bd:17:3d:d3:50:cc:49:06:81:7e:af:fa: + 85:b8:1f:80:c4:64:08:56:53:39:8d:2f:40 -----BEGIN CERTIFICATE----- MIIDITCCAoKgAwIBAgIBATAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEDAO BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZT U0xfUDUyMTESMBAGA1UECwwJUm9vdC1QNTIxMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBrjELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI5WhcNMjYwOTA4MjIxOTI5WjCBrjELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFTATBgNVBAoMDHdvbGZTU0xfcDUy MTEQMA4GA1UECwwHQ0EtcDUyMTEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8w HQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwH @@ -126,7 +126,7 @@ dTRTKQPtSFQh5Y+VtZtBjV/dctJao2MwYTAdBgNVHQ4EFgQUQIkdMF4MbtU9xtUl kNq2Qmft6YIwHwYDVR0jBBgwFoAUZKdolVMzGKIgkrxkVaarynZom8gwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwIDgYwAMIGIAkIB -rO0xXtzyZqHUJkqCMbIkRpPbTGK8dzCXlu+iLSFFChgMvKYcbGhpY6BgZhhj6e5M -zGyPyEW5MtI8m273a4y9CF8CQgFThTjcBjp1vsecfQJ35Yu6pvif4YB5y+FKROP4 -iwBGLGawlRzXL1lwaslH1sl0Fh+KkK34vV/fl63J+Au8PMrHzA== +eqYh9bbC+uFExgP1VC0179lV9mFFkEiMwj6BdjAGBcLbMhm13zdEpj8z+jrHka4P ++xCLuE1Bs+3C0lw3KOvXt2wCQgFHI0Do4sphdCngpnFbCslFFwR9XREC1/CvYOBM +CpeWCS7gJfhQ2Jz5vRc901DMSQaBfq/6hbgfgMRkCFZTOY0vQA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/renewcerts.sh mariadb-10.11.9/extra/wolfssl/wolfssl/certs/renewcerts.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/renewcerts.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/renewcerts.sh 2024-08-03 07:30:00.000000000 +0000 @@ -516,7 +516,7 @@ echo "Updating server-ecc.pem" echo "" #pipe the following arguments to openssl req... - echo -e "US\\nWashington\\nSeattle\\nEliptic\\nECC\\nwww.wolfssl.com\\ninfo@wolfssl.com\\n.\\n.\\n" | openssl req -new -key ecc-key.pem -config ./wolfssl.cnf -nodes -out server-ecc.csr + echo -e "US\\nWashington\\nSeattle\\nElliptic\\nECC\\nwww.wolfssl.com\\ninfo@wolfssl.com\\n.\\n.\\n" | openssl req -new -key ecc-key.pem -config ./wolfssl.cnf -nodes -out server-ecc.csr check_result $? "Step 1" openssl x509 -req -in server-ecc.csr -days 1000 -extfile wolfssl.cnf -extensions server_ecc -CA ca-ecc-cert.pem -CAkey ca-ecc-key.pem -set_serial 03 -out server-ecc.pem @@ -688,6 +688,28 @@ echo "---------------------------------------------------------------------" ############################################################ + ########## update Raw Public Key certificates ############## + ############################################################ + echo "Updating certificates" + echo "Updating client-cert-rpk.der" + cp client-keyPub.der ./rpk/client-cert-rpk.der + check_result $? "Step 1" + + echo "Updating client-ecc-cert-rpk.der" + cp ecc-client-keyPub.der ./rpk/ecc-client-cert-rpk.der + check_result $? "Step 2" + + echo "Updating server-cert-rpk.der" + openssl rsa -inform pem -in server-key.pem -outform der -out ./rpk/server-cert-rpk.der -pubout + check_result $? "Step 3" + + echo "Updating server-ecc-cert-rpk.der" + openssl ec -inform pem -in ecc-key.pem -outform der -out ./rpk/server-ecc-cert-rpk.der -pubout + check_result $? "Step 4" + + echo "End of section" + echo "---------------------------------------------------------------------" + ############################################################ ###### update the ecc-rsa-server.p12 file ################## ############################################################ echo "Updating ecc-rsa-server.p12 (password is \"\")" @@ -816,6 +838,7 @@ cd ./crl || { echo "Failed to switch to dir ./crl"; exit 1; } echo "changed directory: cd/crl" echo "" + # has dependency on rsapss generation (rsapss should be ran first) ./gencrls.sh check_result $? "gencrls.sh" echo "ran ./gencrls.sh" @@ -831,6 +854,10 @@ echo "" openssl crl2pkcs7 -nocrl -certfile ./client-cert.pem -out test-degenerate.p7b -outform DER check_result $? "" + + openssl smime -sign -in ./ca-cert.pem -out test-stream-sign.p7b -signer ./ca-cert.pem -nodetach -nocerts -binary -outform DER -stream -inkey ./ca-key.pem + check_result $? "" + echo "End of section" echo "---------------------------------------------------------------------" Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rid-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rid-cert.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rpk/client-cert-rpk.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/client-cert-rpk.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rpk/client-ecc-cert-rpk.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/client-ecc-cert-rpk.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rpk/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rpk/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + certs/rpk/client-cert-rpk.der \ + certs/rpk/client-ecc-cert-rpk.der \ + certs/rpk/server-cert-rpk.der \ + certs/rpk/server-ecc-cert-rpk.der Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rpk/server-cert-rpk.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/server-cert-rpk.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rpk/server-ecc-cert-rpk.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rpk/server-ecc-cert-rpk.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-3072-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -9,8 +9,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -60,35 +60,35 @@ Salt Length: 0x014E Trailer Field: 0xBC (default) - 39:46:e9:1d:16:25:a1:15:6d:65:88:54:ef:7e:33:b3:0e:44: - f2:11:cd:23:ad:73:2f:80:3c:aa:10:bd:7e:3c:45:1b:c9:8c: - d7:2c:71:99:87:b4:e3:81:57:a8:c2:86:6c:80:ec:7c:4a:fb: - da:01:ed:e1:f6:b2:15:16:e1:3f:cd:de:85:d2:25:3b:11:31: - f6:a1:54:52:57:25:6c:41:99:d3:dd:92:af:ca:ed:c6:28:d4: - e5:6d:88:a5:c5:37:3f:6f:50:43:54:21:c9:cd:77:71:5c:81: - 6e:ec:96:b4:ea:04:41:d7:db:ec:43:d2:65:a3:2d:a8:33:1d: - 27:01:1e:28:16:2a:93:61:a6:af:8f:9d:31:e2:34:89:f8:9a: - cf:a0:c9:12:95:1b:9f:93:e6:10:90:e0:bc:d9:a3:72:40:30: - cb:c4:b4:ac:3f:17:42:3b:a1:ab:ff:3a:d4:c3:2b:22:56:fb: - 77:93:c9:32:7f:bd:18:ff:c0:60:bc:dd:ce:09:d1:e9:22:44: - f2:9b:85:8b:20:fa:77:b0:95:aa:b5:9c:de:83:2b:58:7c:ec: - fb:aa:9c:b9:57:5d:32:32:a3:81:66:a4:1f:0f:2b:08:1b:65: - 1c:d4:e1:4f:7f:d9:ee:39:a9:ae:99:6e:0a:3b:e4:ef:11:d6: - c9:e9:6f:89:27:c4:25:28:be:5a:e5:17:87:e7:56:0a:f4:32: - 38:f2:86:84:d7:b6:66:47:f3:46:46:55:80:08:d6:8e:c0:08: - a0:3f:04:62:77:1c:6e:dd:80:7e:57:82:0e:60:81:6e:59:ff: - ad:39:6e:a0:fe:66:1a:1b:d1:4c:bf:14:c9:82:83:0a:95:57: - 53:3b:79:be:74:01:d7:a7:62:64:6f:5a:8a:a6:7d:ab:9f:90: - fb:95:89:24:d3:55:02:ef:f1:5f:d4:de:46:0c:5b:9a:60:d6: - 6e:64:cb:11:ae:fa:7f:4f:54:44:c0:ff:af:32:45:92:32:6e: - 5b:cb:9d:2c:03:6e + 1f:c0:ae:b2:47:af:ec:86:67:3a:b6:8f:44:65:4a:af:29:fc: + 17:92:a4:8f:03:6a:76:63:8d:65:4a:f6:52:23:a2:08:46:17: + c6:2c:87:76:2b:05:21:c1:70:2d:4d:65:ef:de:af:87:21:7e: + 88:98:45:8b:06:8f:f8:56:4f:6a:29:f3:f4:72:5d:c3:f4:5a: + ee:6c:52:dc:40:72:4a:1a:4c:3b:84:b0:5a:64:cc:3a:62:c3: + d3:56:a9:e3:fd:4e:a2:3b:57:22:b7:f9:71:f7:5c:80:aa:4c: + 26:ef:d5:10:e5:d9:ae:89:ff:90:82:2e:0a:ad:1c:da:a6:9c: + 99:44:d5:fc:a0:3c:42:ad:e7:dd:8a:d0:c7:b8:d0:83:bb:4b: + 00:e2:50:e5:81:6f:03:b8:bc:4d:d2:86:4d:8a:33:79:ca:e8: + a0:df:70:c1:3a:c3:55:05:f0:ac:d8:ab:55:0b:cf:44:60:b4: + af:03:f4:88:d9:49:81:7c:78:6a:af:5f:cd:28:e2:e1:37:f3: + 28:b8:0e:05:5d:72:b3:b5:5b:f4:72:52:a3:7e:99:99:23:95: + 26:17:cb:9c:66:83:21:d6:ac:f8:c8:b2:49:22:dc:32:9b:f2: + fc:5d:f7:fe:c0:a6:81:62:1c:43:25:2a:d3:66:37:76:db:15: + 31:c4:6b:df:e8:70:a9:f9:96:8c:ec:94:d1:b2:fb:73:03:1b: + 5d:7f:2b:1b:ab:47:72:ea:1b:9d:2d:43:d4:90:df:ca:c5:98: + 9a:a2:01:6a:d3:55:1c:ad:d1:37:46:93:fe:e8:56:8c:6a:1c: + 45:bf:cb:12:d1:aa:1c:98:08:af:f7:67:ed:41:65:3b:98:d0: + 42:29:b0:68:ab:94:52:6e:72:e2:f4:df:8a:68:b5:1b:6d:3f: + 35:d5:01:b8:60:eb:fe:f2:e9:33:90:db:59:5a:c4:d6:52:c6: + c7:1b:a8:a1:ef:64:db:96:ac:ce:fc:8d:e2:ac:75:f4:0d:bc: + 49:36:8a:12:36:83 -----BEGIN CERTIFICATE----- MIIFjzCCA8agAwIBAgIBATA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAqEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiBAICAU4wgZ0xCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93 b2xmU1NMX1JTQS1QU1MxFTATBgNVBAsMDFJvb3QtUlNBLVBTUzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t -MB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgbIxCzAJBgNVBAYTAlVT +MB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgbIxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRcwFQYDVQQKDA53 b2xmU1NMX1JTQVBTUzESMBAGA1UECwwJQ0EtUlNBUFNTMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAV @@ -104,13 +104,13 @@ LwkOZwIDAQABo2MwYTAdBgNVHQ4EFgQU+ELMiMnIGPnTsCRlBkz/Vau/Dn8wHwYD VR0jBBgwFoAUqnHTsYpLu0cVR1+b0Ctp0W+FXvYwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgKhGjAY -BgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogQCAgFOA4IBgQA5RukdFiWhFW1liFTv -fjOzDkTyEc0jrXMvgDyqEL1+PEUbyYzXLHGZh7TjgVeowoZsgOx8SvvaAe3h9rIV -FuE/zd6F0iU7ETH2oVRSVyVsQZnT3ZKvyu3GKNTlbYilxTc/b1BDVCHJzXdxXIFu -7Ja06gRB19vsQ9Jloy2oMx0nAR4oFiqTYaavj50x4jSJ+JrPoMkSlRufk+YQkOC8 -2aNyQDDLxLSsPxdCO6Gr/zrUwysiVvt3k8kyf70Y/8BgvN3OCdHpIkTym4WLIPp3 -sJWqtZzegytYfOz7qpy5V10yMqOBZqQfDysIG2Uc1OFPf9nuOamumW4KO+TvEdbJ -6W+JJ8QlKL5a5ReH51YK9DI48oaE17ZmR/NGRlWACNaOwAigPwRidxxu3YB+V4IO -YIFuWf+tOW6g/mYaG9FMvxTJgoMKlVdTO3m+dAHXp2Jkb1qKpn2rn5D7lYkk01UC -7/Ff1N5GDFuaYNZuZMsRrvp/T1REwP+vMkWSMm5by50sA24= +BgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogQCAgFOA4IBgQAfwK6yR6/shmc6to9E +ZUqvKfwXkqSPA2p2Y41lSvZSI6IIRhfGLId2KwUhwXAtTWXv3q+HIX6ImEWLBo/4 +Vk9qKfP0cl3D9FrubFLcQHJKGkw7hLBaZMw6YsPTVqnj/U6iO1cit/lx91yAqkwm +79UQ5dmuif+Qgi4KrRzappyZRNX8oDxCrefditDHuNCDu0sA4lDlgW8DuLxN0oZN +ijN5yuig33DBOsNVBfCs2KtVC89EYLSvA/SI2UmBfHhqr1/NKOLhN/MouA4FXXKz +tVv0clKjfpmZI5UmF8ucZoMh1qz4yLJJItwym/L8Xff+wKaBYhxDJSrTZjd22xUx +xGvf6HCp+ZaM7JTRsvtzAxtdfysbq0dy6hudLUPUkN/KxZiaogFq01UcrdE3RpP+ +6FaMahxFv8sS0aocmAiv92ftQWU7mNBCKbBoq5RSbnLi9N+KaLUbbT811QG4YOv+ +8ukzkNtZWsTWUsbHG6ih72TblqzO/I3irHX0DbxJNooSNoM= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/ca-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -9,8 +9,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -56,28 +56,28 @@ Salt Length: 0x20 Trailer Field: 0xBC (default) - 49:a5:ef:22:47:73:30:e6:41:67:79:c9:8c:ac:58:a2:d0:bf: - ed:50:c9:e8:26:44:16:d0:64:c7:f9:f0:50:1f:8b:25:f7:ba: - 32:f0:1d:14:9f:d7:ad:2b:81:14:7d:60:ec:b3:f6:ad:0a:99: - b6:1d:eb:f2:8e:d5:bf:1b:a9:1e:3e:8b:6c:c8:c0:ee:dd:1b: - 2e:34:dd:bd:cd:14:60:2e:14:60:b8:f1:f3:bc:af:87:5a:75: - 55:72:18:2d:a3:9d:01:73:aa:52:a6:44:4e:5c:a2:b5:57:8f: - 4b:36:5e:2a:f2:c1:e2:de:88:29:24:8d:62:81:d4:6d:42:e3: - 50:e3:a9:46:fe:78:be:95:83:bd:cc:2c:9a:ad:da:4f:c1:de: - 34:01:53:21:5b:c6:ec:6f:6b:2e:fd:d4:71:c7:15:4e:26:30: - 6a:de:c7:21:22:14:ae:80:c0:00:89:72:83:89:3c:30:15:3b: - 68:67:97:b0:93:7b:7a:95:54:1d:45:8e:ae:d2:97:0c:f9:32: - 3b:61:2d:9e:b2:b0:2e:4f:d5:cc:ab:05:5d:ce:14:8a:fe:7b: - e4:59:33:fe:e0:42:d9:a6:99:f8:f2:7f:98:fa:09:dc:d5:ab: - 2b:7b:08:c2:24:4c:59:49:e0:9e:23:85:d8:32:c7:5b:d4:01: - d2:20:c5:9c + 6c:79:0e:40:30:74:f6:02:08:61:df:c0:89:25:10:30:ea:e4: + e9:14:c8:c6:47:01:55:a4:f2:ed:ee:3f:55:da:62:39:04:cb: + 3d:a1:78:56:76:30:fd:14:ea:b3:d8:21:99:c6:ca:ed:9f:18: + 7d:15:4d:d2:cf:db:c3:a1:b4:56:0d:04:b1:72:9c:68:81:1f: + 01:02:b8:8f:d6:d8:ed:47:3a:72:f2:e0:a5:9b:7b:50:75:00: + a4:ab:23:62:48:1f:bc:f4:50:86:ef:06:b3:f8:8b:6e:e0:39: + d1:8c:3b:8f:1f:ef:c5:ff:8c:2d:b2:1b:5d:82:32:b1:81:92: + 02:7c:c9:ad:16:86:63:6c:95:41:ed:80:70:96:41:13:11:03: + 9a:c1:41:d4:ca:e0:fd:7f:2d:d9:5b:60:d6:42:fe:aa:ac:73: + 4e:6d:26:67:03:ec:53:e9:97:2f:73:3a:f5:c4:ba:cf:dc:db: + 6c:f0:79:80:b1:52:f4:bf:12:c9:a7:ce:b1:2f:8d:6a:6a:a8: + 9e:27:e9:d1:55:26:6b:20:8c:1f:90:57:6d:5e:dc:9e:ca:4c: + 76:fc:35:76:dc:5a:06:90:50:88:7e:ad:9f:58:e3:39:10:e3: + 64:19:9f:ea:fb:86:04:84:79:d6:20:ac:c8:45:8b:03:8c:eb: + b6:d4:e7:e4 -----BEGIN CERTIFICATE----- MIIEvzCCA3egAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBnTELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xGDAWBgNVBAoMD3dv bGZTU0xfUlNBLVBTUzEVMBMGA1UECwwMUm9vdC1SU0EtUFNTMRgwFgYDVQQDDA93 d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w -HhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBsjELMAkGA1UEBhMCVVMx +HhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBsjELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFzAVBgNVBAoMDndv bGZTU0xfUlNBUFNTMRIwEAYDVQQLDAlDQS1SU0FQU1MxGDAWBgNVBAMMD3d3dy53 b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUG @@ -92,10 +92,10 @@ 8xljXMpsk4aiFFORMTAfBgNVHSMEGDAWgBRk1eyCh4DeWu1JmNgMVH1GnqU81jAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjA9BgkqhkiG9w0BAQowMKAN MAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIAOC -AQEASaXvIkdzMOZBZ3nJjKxYotC/7VDJ6CZEFtBkx/nwUB+LJfe6MvAdFJ/XrSuB -FH1g7LP2rQqZth3r8o7VvxupHj6LbMjA7t0bLjTdvc0UYC4UYLjx87yvh1p1VXIY -LaOdAXOqUqZETlyitVePSzZeKvLB4t6IKSSNYoHUbULjUOOpRv54vpWDvcwsmq3a -T8HeNAFTIVvG7G9rLv3UcccVTiYwat7HISIUroDAAIlyg4k8MBU7aGeXsJN7epVU -HUWOrtKXDPkyO2EtnrKwLk/VzKsFXc4Uiv575Fkz/uBC2aaZ+PJ/mPoJ3NWrK3sI -wiRMWUngniOF2DLHW9QB0iDFnA== +AQEAbHkOQDB09gIIYd/AiSUQMOrk6RTIxkcBVaTy7e4/VdpiOQTLPaF4VnYw/RTq +s9ghmcbK7Z8YfRVN0s/bw6G0Vg0EsXKcaIEfAQK4j9bY7Uc6cvLgpZt7UHUApKsj +YkgfvPRQhu8Gs/iLbuA50Yw7jx/vxf+MLbIbXYIysYGSAnzJrRaGY2yVQe2AcJZB +ExEDmsFB1Mrg/X8t2Vtg1kL+qqxzTm0mZwPsU+mXL3M69cS6z9zbbPB5gLFS9L8S +yafOsS+Namqonifp0VUmayCMH5BXbV7cnspMdvw1dtxaBpBQiH6tn1jjORDjZBmf +6vuGBIR51iCsyEWLA4zrttTn5A== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-3072-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,7 +2,7 @@ Data: Version: 3 (0x2) Serial Number: - 04:fb:6a:d0:0a:86:db:19:b8:c7:f8:dc:8b:70:ed:b4:4e:e0:e2:02 + 06:54:4f:66:0b:e2:32:6e:09:ab:a6:90:84:b3:1a:59:79:89:1a:9a Signature Algorithm: rsassaPss Hash Algorithm: sha384 Mask Algorithm: mgf1 with sha384 @@ -10,8 +10,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Client-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Client-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -51,7 +51,7 @@ X509v3 Authority Key Identifier: keyid:8C:01:9F:4E:11:24:28:BF:3E:EA:82:EA:54:2A:C9:0F:F5:E4:C5:47 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_RSAPSS/OU=Client-RSAPSS/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/UID=wolfSSL - serial:04:FB:6A:D0:0A:86:DB:19:B8:C7:F8:DC:8B:70:ED:B4:4E:E0:E2:02 + serial:06:54:4F:66:0B:E2:32:6E:09:AB:A6:90:84:B3:1A:59:79:89:1A:9A X509v3 Basic Constraints: CA:TRUE @@ -65,36 +65,36 @@ Salt Length: 0x014E Trailer Field: 0xBC (default) - 32:f2:6a:d2:c9:02:8e:eb:45:8f:13:02:4d:2c:0f:c1:3a:ea: - be:e3:f9:92:a2:2d:1b:fb:e8:b9:2f:d2:d0:e0:16:cd:b7:67: - e2:e3:61:a2:8d:c2:c9:64:f2:6a:8a:d2:62:9b:25:25:3d:72: - b1:07:1f:2c:a3:03:64:32:d4:23:84:08:03:60:ed:90:98:7a: - 50:1b:19:b4:c1:a8:3b:d1:00:57:82:fc:e9:ef:15:c7:c1:ed: - b5:af:6c:60:84:48:d3:d4:8b:09:3f:2e:cc:f7:dd:62:ff:ad: - fe:8a:fe:7c:2a:12:fa:ca:24:6a:15:5b:56:46:06:6d:d4:08: - 17:d9:94:78:8a:88:b3:92:6b:39:9e:79:6d:fe:9e:c3:d4:cb: - dd:be:06:b0:b8:5e:4e:dc:26:64:8d:25:ed:b7:1f:16:d1:64: - 71:bf:e2:ed:f3:a2:2b:38:fb:e7:75:c6:65:62:72:65:ce:1b: - 77:d7:9e:31:01:1b:07:fc:e7:8c:50:5a:9c:74:2b:a5:38:e1: - b0:ca:dd:e1:2d:27:c0:91:f2:bc:33:a0:1a:d4:06:21:af:c2: - cf:93:96:9d:aa:9b:49:f5:1e:9a:21:76:97:fe:63:4b:9f:ba: - b1:e7:d4:04:d5:d5:65:28:6a:8b:6c:74:4b:55:52:0e:ef:ba: - 48:57:02:48:22:79:88:1c:cc:bb:22:4b:82:ac:5b:7d:d8:de: - 6d:0d:4d:37:f4:69:b3:97:28:0e:fd:5c:29:9f:26:a3:cc:59: - 91:97:36:54:2f:f9:4b:24:fc:a9:d8:bc:02:ae:21:5a:38:8b: - a4:8c:f1:8c:31:ef:5d:60:1b:f2:47:39:ea:e7:1b:b1:38:48: - dc:47:82:e1:b8:79:97:87:b6:ad:4b:d3:3b:24:c1:0f:19:4e: - 41:b0:bc:7e:d4:d0:d8:dc:95:75:8d:e6:b3:63:21:02:f9:16: - f6:23:56:86:61:6c:17:74:8a:83:f5:b1:5f:6c:59:a0:03:1e: - b5:69:44:26:ff:0d + 0b:90:18:ff:19:9d:5e:bc:34:de:1f:90:e8:27:89:1e:61:84: + 79:84:e1:e7:b5:df:dc:b8:68:6b:59:02:33:b0:c8:0c:a7:31: + e3:95:b6:09:41:6b:e0:63:93:f5:9f:53:17:04:6d:08:e7:fe: + 38:9e:27:82:29:55:46:f7:7a:65:61:7d:1e:8f:8c:35:70:8a: + 2a:94:dc:62:c5:db:16:b8:bf:67:9c:f7:e1:09:fc:08:d7:95: + ae:9d:9c:27:f4:7c:71:37:62:c8:09:0b:b6:06:56:37:ff:fa: + fc:ba:c2:25:65:e5:c2:01:b4:37:8a:f5:1e:d6:d7:56:f6:df: + 77:fa:99:26:16:61:8b:b2:f6:5f:de:cc:46:97:80:e8:55:36: + 79:9a:c7:01:36:7b:73:3a:cc:ae:05:00:a1:91:2d:fb:57:0a: + 72:e8:70:ab:4d:82:df:8d:5a:c5:67:fb:17:06:d9:a1:c4:66: + 29:c6:58:d4:81:b9:89:d3:d1:8e:97:61:59:3a:be:4d:18:3a: + 21:cf:94:0e:c7:20:30:35:a6:ed:a9:a1:de:bd:b7:ee:02:5f: + af:b0:8c:2e:57:15:7b:87:fd:d9:77:18:63:cc:d1:95:98:e2: + bd:d2:f4:15:38:98:13:dc:f1:ae:37:35:9e:1b:74:23:a3:20: + 2a:3e:6a:d0:67:67:79:65:c0:6b:e3:08:66:8f:79:c6:1c:68: + 68:b5:c4:f5:ec:8e:bc:c3:0b:73:6d:8b:61:33:17:90:f0:cb: + 69:1c:2e:42:f1:c3:a0:4a:0d:8b:79:94:8e:40:97:c6:c0:4e: + f1:95:42:12:d9:ad:84:d5:9c:7b:52:4a:a9:e5:82:8f:5c:9f: + d4:c8:0e:14:0a:c2:27:33:57:1e:d9:60:5a:e6:2a:83:bb:91: + 01:85:a0:14:b8:e4:bf:4a:43:7d:4f:40:36:d9:24:8b:a7:f3: + 7c:a9:b1:cf:f0:ba:6b:d0:73:0a:aa:47:13:06:8f:ad:df:26: + 0d:47:07:27:27:8f -----BEGIN CERTIFICATE----- -MIIGxTCCBPygAwIBAgIUBPtq0AqG2xm4x/jci3DttE7g4gIwPgYJKoZIhvcNAQEK +MIIGxTCCBPygAwIBAgIUBlRPZgviMm4Jq6aQhLMaWXmJGpowPgYJKoZIhvcNAQEK MDGgDTALBglghkgBZQMEAgKhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogQC AgFOMIG2MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEXMBUGA1UECgwOd29sZlNTTF9SU0FQU1MxFjAUBgNVBAsMDUNsaWVu dC1SU0FQU1MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEMB3dvbGZTU0wwHhcN -MjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBtjELMAkGA1UEBhMCVVMxEDAO +MjMxMjEzMjIxOTI5WhcNMjYwOTA4MjIxOTI5WjCBtjELMAkGA1UEBhMCVVMxEDAO BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFzAVBgNVBAoMDndvbGZT U0xfUlNBUFNTMRYwFAYDVQQLDA1DbGllbnQtUlNBUFNTMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAV @@ -112,17 +112,17 @@ CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEX MBUGA1UECgwOd29sZlNTTF9SU0FQU1MxFjAUBgNVBAsMDUNsaWVudC1SU0FQU1Mx GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 -b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEMB3dvbGZTU0yCFAT7atAKhtsZuMf4 -3Itw7bRO4OICMAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22H +b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEMB3dvbGZTU0yCFAZUT2YL4jJuCaum +kISzGll5iRqaMAwGA1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22H BH8AAAEwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMD4GCSqGSIb3DQEB CjAxoA0wCwYJYIZIAWUDBAICoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAqIE -AgIBTgOCAYEAMvJq0skCjutFjxMCTSwPwTrqvuP5kqItG/vouS/S0OAWzbdn4uNh -oo3CyWTyaorSYpslJT1ysQcfLKMDZDLUI4QIA2DtkJh6UBsZtMGoO9EAV4L86e8V -x8Htta9sYIRI09SLCT8uzPfdYv+t/or+fCoS+sokahVbVkYGbdQIF9mUeIqIs5Jr -OZ55bf6ew9TL3b4GsLheTtwmZI0l7bcfFtFkcb/i7fOiKzj753XGZWJyZc4bd9ee -MQEbB/znjFBanHQrpTjhsMrd4S0nwJHyvDOgGtQGIa/Cz5OWnaqbSfUemiF2l/5j -S5+6sefUBNXVZShqi2x0S1VSDu+6SFcCSCJ5iBzMuyJLgqxbfdjebQ1NN/Rps5co -Dv1cKZ8mo8xZkZc2VC/5SyT8qdi8Aq4hWjiLpIzxjDHvXWAb8kc56ucbsThI3EeC -4bh5l4e2rUvTOyTBDxlOQbC8ftTQ2NyVdY3ms2MhAvkW9iNWhmFsF3SKg/WxX2xZ -oAMetWlEJv8N +AgIBTgOCAYEAC5AY/xmdXrw03h+Q6CeJHmGEeYTh57Xf3Lhoa1kCM7DIDKcx45W2 +CUFr4GOT9Z9TFwRtCOf+OJ4ngilVRvd6ZWF9Ho+MNXCKKpTcYsXbFri/Z5z34Qn8 +CNeVrp2cJ/R8cTdiyAkLtgZWN//6/LrCJWXlwgG0N4r1HtbXVvbfd/qZJhZhi7L2 +X97MRpeA6FU2eZrHATZ7czrMrgUAoZEt+1cKcuhwq02C341axWf7FwbZocRmKcZY +1IG5idPRjpdhWTq+TRg6Ic+UDscgMDWm7amh3r237gJfr7CMLlcVe4f92XcYY8zR +lZjivdL0FTiYE9zxrjc1nht0I6MgKj5q0GdneWXAa+MIZo95xhxoaLXE9eyOvMML +c22LYTMXkPDLaRwuQvHDoEoNi3mUjkCXxsBO8ZVCEtmthNWce1JKqeWCj1yf1MgO +FArCJzNXHtlgWuYqg7uRAYWgFLjkv0pDfU9ANtkki6fzfKmxz/C6a9BzCqpHEwaP +rd8mDUcHJyeP -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/client-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,7 +2,7 @@ Data: Version: 3 (0x2) Serial Number: - 08:97:d5:a9:82:55:09:02:75:62:2e:dc:dc:38:a5:be:b7:fc:34:4b + 66:c1:2c:85:1b:16:4c:37:fa:23:50:5c:f1:4b:99:11:2f:2c:ea:e0 Signature Algorithm: rsassaPss Hash Algorithm: sha256 Mask Algorithm: mgf1 with sha256 @@ -10,8 +10,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Client-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Client-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -47,7 +47,7 @@ X509v3 Authority Key Identifier: keyid:59:71:87:88:D0:3E:C7:EE:08:4D:80:F2:C9:FC:CF:3D:76:E6:A5:62 DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_RSAPSS/OU=Client-RSAPSS/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/UID=wolfSSL - serial:08:97:D5:A9:82:55:09:02:75:62:2E:DC:DC:38:A5:BE:B7:FC:34:4B + serial:66:C1:2C:85:1B:16:4C:37:FA:23:50:5C:F1:4B:99:11:2F:2C:EA:E0 X509v3 Basic Constraints: CA:TRUE @@ -61,29 +61,29 @@ Salt Length: 0x20 Trailer Field: 0xBC (default) - 53:ab:77:45:54:4f:cd:f0:28:9c:97:52:09:1c:77:4f:b5:9e: - c6:97:e3:f1:fd:be:a3:8e:75:f4:d5:af:00:ae:5f:fe:5c:e6: - 01:ac:6f:d1:3c:d5:1b:85:23:cc:2e:25:41:05:2f:8e:e3:b8: - a4:c2:28:66:7c:4f:e3:72:bc:4a:71:8d:05:73:a5:98:67:6d: - ea:ae:ed:e5:97:63:46:57:83:24:15:1d:83:93:27:e6:cb:0f: - ea:bf:d2:39:a1:8b:38:68:1a:95:5e:48:9d:ea:86:76:5a:8d: - 61:4f:55:fd:05:d6:05:4b:e7:de:d3:b0:35:d0:b0:ef:52:06: - c3:53:c8:a9:d5:be:97:6b:12:eb:9d:01:5b:ac:7f:b6:00:d5: - 4f:c2:90:ce:4f:49:59:ea:76:68:b2:73:81:28:17:2c:44:99: - f3:67:0e:3d:78:71:5d:52:96:9f:0c:8d:73:ef:8c:ea:9a:6e: - 5e:9c:09:fc:2f:15:75:fb:f9:0c:14:96:86:19:90:ba:ba:ed: - 9f:61:ff:4c:49:2e:3c:c6:f5:63:fe:b4:ce:1c:3d:27:37:31: - ac:69:c3:96:e5:ca:db:05:99:f7:9c:32:8a:b0:2b:f0:3e:0a: - 6c:23:99:03:60:df:b9:34:b1:8f:85:fa:42:a2:d8:de:ff:d4: - 78:1e:ba:64 + b0:79:5c:92:53:67:6c:04:98:74:61:9e:10:7d:17:59:0e:a6: + 41:0b:84:df:a7:8a:2e:5e:c5:5b:2a:f9:1f:bc:34:36:94:d5: + d4:cf:fd:91:b6:7c:ee:db:07:21:12:ef:d1:06:ba:99:d1:4c: + e7:c5:db:96:00:dc:87:a7:40:54:0d:6a:a1:2e:31:34:59:bd: + 02:78:40:85:cb:ea:fc:8c:bc:d6:1a:89:c9:3a:5c:06:c0:b2: + e6:cc:d2:ba:99:8a:62:81:f0:54:b6:18:56:91:2e:62:e4:16: + 83:30:68:70:1b:bd:18:49:a0:14:a1:8d:10:b5:67:22:09:7d: + c1:f5:52:cd:9e:7b:bb:9d:64:78:fe:e9:f4:b7:9c:91:23:d5: + eb:73:f6:64:f8:b2:ec:be:90:da:e1:f0:6e:71:e4:ec:19:91: + 3d:c4:e2:d9:f8:24:0c:93:47:16:57:03:67:1f:81:ac:d3:fb: + 0c:04:d8:20:e1:74:0d:7c:20:99:dd:c5:dc:fd:eb:1e:49:5d: + 1a:e6:7b:fc:77:b0:66:08:7c:c3:9b:9a:77:b6:b9:f7:8c:65: + 21:0c:e8:12:f7:93:a1:c7:2d:03:0e:91:e4:f9:98:68:47:d2: + 5d:c4:53:e7:96:02:76:75:63:f0:d0:67:ca:77:75:bc:1a:87: + d3:94:99:b1 -----BEGIN CERTIFICATE----- -MIIF9TCCBK2gAwIBAgIUCJfVqYJVCQJ1Yi7c3Dilvrf8NEswPQYJKoZIhvcNAQEK +MIIF9TCCBK2gAwIBAgIUZsEshRsWTDf6I1Bc8UuZES8s6uAwPQYJKoZIhvcNAQEK MDCgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMC ASAwgbYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRcwFQYDVQQKDA53b2xmU1NMX1JTQVBTUzEWMBQGA1UECwwNQ2xpZW50 LVJTQVBTUzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDAeFw0y -MjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3NDlaMIG2MQswCQYDVQQGEwJVUzEQMA4G +MzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5MjhaMIG2MQswCQYDVQQGEwJVUzEQMA4G A1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEXMBUGA1UECgwOd29sZlNT TF9SU0FQU1MxFjAUBgNVBAsMDUNsaWVudC1SU0FQU1MxGDAWBgNVBAMMD3d3dy53 b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUG @@ -100,13 +100,13 @@ DgYDVQQHDAdCb3plbWFuMRcwFQYDVQQKDA53b2xmU1NMX1JTQVBTUzEWMBQGA1UE CwwNQ2xpZW50LVJTQVBTUzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJ KoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29s -ZlNTTIIUCJfVqYJVCQJ1Yi7c3Dilvrf8NEswDAYDVR0TBAUwAwEB/zAcBgNVHREE +ZlNTTIIUZsEshRsWTDf6I1Bc8UuZES8s6uAwDAYDVR0TBAUwAwEB/zAcBgNVHREE FTATggtleGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB BQUHAwIwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0B -AQgwCwYJYIZIAWUDBAIBogMCASADggEBAFOrd0VUT83wKJyXUgkcd0+1nsaX4/H9 -vqOOdfTVrwCuX/5c5gGsb9E81RuFI8wuJUEFL47juKTCKGZ8T+NyvEpxjQVzpZhn -bequ7eWXY0ZXgyQVHYOTJ+bLD+q/0jmhizhoGpVeSJ3qhnZajWFPVf0F1gVL597T -sDXQsO9SBsNTyKnVvpdrEuudAVusf7YA1U/CkM5PSVnqdmiyc4EoFyxEmfNnDj14 -cV1Slp8MjXPvjOqabl6cCfwvFXX7+QwUloYZkLq67Z9h/0xJLjzG9WP+tM4cPSc3 -Maxpw5blytsFmfecMoqwK/A+CmwjmQNg37k0sY+F+kKi2N7/1HgeumQ= +AQgwCwYJYIZIAWUDBAIBogMCASADggEBALB5XJJTZ2wEmHRhnhB9F1kOpkELhN+n +ii5exVsq+R+8NDaU1dTP/ZG2fO7bByES79EGupnRTOfF25YA3IenQFQNaqEuMTRZ +vQJ4QIXL6vyMvNYaick6XAbAsubM0rqZimKB8FS2GFaRLmLkFoMwaHAbvRhJoBSh +jRC1ZyIJfcH1Us2ee7udZHj+6fS3nJEj1etz9mT4suy+kNrh8G5x5OwZkT3E4tn4 +JAyTRxZXA2cfgazT+wwE2CDhdA18IJndxdz96x5JXRrme/x3sGYIfMObmne2ufeM +ZSEM6BL3k6HHLQMOkeT5mGhH0l3EU+eWAnZ1Y/DQZ8p3dbwah9OUmbE= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-3072-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,7 +2,7 @@ Data: Version: 3 (0x2) Serial Number: - 16:f5:d9:4e:98:03:1d:e8:9e:1a:04:6e:b9:8a:bf:14:4d:1f:79:b1 + 25:af:7b:c5:57:c8:31:42:fc:85:76:76:7a:01:a9:ca:68:a3:6a:d7 Signature Algorithm: rsassaPss Hash Algorithm: sha384 Mask Algorithm: mgf1 with sha384 @@ -10,8 +10,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -61,36 +61,36 @@ Salt Length: 0x014E Trailer Field: 0xBC (default) - 14:4c:66:28:6a:b0:97:a1:1e:2b:45:bc:43:47:2b:42:f5:47: - 4b:07:02:51:d0:6d:8e:8e:01:72:2f:10:72:6c:ff:fb:59:46: - a2:7d:ce:a1:11:fa:9e:54:40:54:77:d0:15:c9:ce:36:15:08: - c6:24:d2:9c:45:ef:26:bf:f6:1e:ad:e3:de:cd:d5:87:bb:e7: - 6c:9b:61:24:5a:ec:5c:57:dc:b2:f1:74:3d:1d:b6:0f:97:b3: - 65:9b:c2:e0:b0:06:c7:00:11:c0:b8:e8:4b:c4:d4:ff:0c:54: - bb:7b:72:f7:b6:52:2c:19:1e:de:21:92:57:f2:14:75:ba:e2: - f9:4b:d7:db:be:cf:f6:9e:2d:65:77:f8:fc:5d:68:6e:1a:65: - 81:a1:e2:a2:3f:5e:a2:f6:c1:42:4b:2d:84:b3:c2:68:9d:ae: - ef:48:f7:ce:f0:c0:18:6b:b9:27:ba:1f:a1:b5:a7:cb:f2:96: - 99:b8:07:3e:1a:0a:d5:dd:ee:95:4e:98:a0:3e:b8:33:88:b9: - f8:1c:5b:9b:76:fa:2b:90:8e:a9:95:47:b1:cc:e2:67:5e:dd: - 9d:41:f9:50:43:f7:95:fb:8a:45:8a:cf:9b:63:ea:aa:ef:38: - 03:56:4d:b1:73:07:39:a8:01:a7:78:83:5a:43:09:08:7d:ac: - 7e:63:74:01:bb:16:4f:0d:32:6b:3f:b2:93:c8:21:d2:0b:45: - 0b:02:78:50:5f:f2:39:67:49:1a:ab:f8:e9:04:c0:8f:5f:21: - 92:08:b0:a8:5e:5d:26:70:43:92:21:3c:42:02:b6:80:a2:45: - a5:6a:f0:fe:bb:76:60:7b:b2:0a:9b:25:a4:ed:fd:9e:15:79: - e5:5a:b7:6e:11:09:d3:68:73:b1:ec:d6:30:87:66:3f:dd:0e: - 92:0b:01:05:1e:0e:b3:56:93:96:1f:4b:0a:2e:a9:5c:cd:54: - 5d:71:54:22:28:db:8b:28:b0:b8:a8:1e:f1:da:60:25:81:53: - 85:9f:d0:86:4e:3a + 8f:d2:c7:8f:7f:7d:4e:ca:13:59:51:bb:2d:51:c7:bc:70:3c: + 2d:a7:44:e2:b7:14:f2:1f:6f:9e:81:92:8d:f4:65:45:7d:72: + 91:37:8f:21:b2:cf:aa:94:a2:cc:fe:63:a5:96:a3:a4:9c:f4: + ae:da:bd:b0:33:61:0b:54:05:da:7b:5a:7b:cc:5d:1a:59:a7: + 59:ad:29:73:e2:ec:e8:ac:f4:89:f4:3b:4d:17:a8:72:ae:d0: + 78:a1:f2:57:2a:15:e1:07:6c:c1:69:92:6a:a4:ea:24:30:bc: + fb:d4:95:6f:b9:dc:0e:4f:3e:a3:1f:e5:2e:2e:b0:5a:0a:1a: + 39:e3:a8:7a:2c:03:32:c2:f7:b5:55:a6:2b:dc:6c:de:13:fc: + fa:bd:5f:ee:fe:af:a8:4b:c1:2e:2b:da:c1:29:d3:92:a6:3a: + dc:04:84:67:84:63:f8:b0:f0:4b:8f:5e:16:cd:97:22:32:28: + 2d:bb:2d:07:74:49:1b:78:ce:4e:4b:ac:57:f8:21:f2:f6:2a: + 0d:ad:ea:2a:3f:ed:c1:fc:9e:dc:62:b3:f3:43:bd:1d:14:e3: + 97:51:1b:ef:df:0d:b4:04:b4:7a:8b:7a:16:be:d5:40:77:07: + cf:87:e3:2e:5e:df:ee:a2:bd:3c:50:af:a7:d1:34:84:50:9f: + 73:2d:89:12:4b:8f:34:d6:6b:80:94:36:16:16:b0:5c:bc:36: + 36:12:44:8b:f4:20:ef:08:3d:8c:d6:81:66:61:0e:57:85:54: + 82:b3:f8:e3:98:21:44:ea:4a:a6:ff:ec:aa:b5:58:23:6a:03: + ed:c2:8c:22:f5:3d:14:7e:ff:f6:16:76:2e:20:2e:1a:1b:9c: + 4c:6c:8d:f5:de:1c:09:59:67:ce:73:47:11:c7:ed:43:df:05: + 07:75:e0:8e:15:96:61:4a:e9:32:0d:35:86:cc:1b:a1:7a:3a: + a3:8f:58:e2:21:fd:4b:d9:62:82:83:56:ed:dc:61:c2:13:79: + 80:1c:89:f7:fc:02 -----BEGIN CERTIFICATE----- -MIIFjTCCA8SgAwIBAgIUFvXZTpgDHeieGgRuuYq/FE0febEwPgYJKoZIhvcNAQEK +MIIFjTCCA8SgAwIBAgIUJa97xVfIMUL8hXZ2egGpymijatcwPgYJKoZIhvcNAQEK MDGgDTALBglghkgBZQMEAgKhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogQC AgFOMIGdMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEYMBYGA1UECgwPd29sZlNTTF9SU0EtUFNTMRUwEwYDVQQLDAxSb290 LVJTQS1QU1MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ -ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NDlaFw0yNTA5MTEyMTE3 -NDlaMIGdMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH +ARYQaW5mb0B3b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjhaFw0yNjA5MDgyMjE5 +MjhaMIGdMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwH Qm96ZW1hbjEYMBYGA1UECgwPd29sZlNTTF9SU0EtUFNTMRUwEwYDVQQLDAxSb290 LVJTQS1QU1MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbTCCAaAwCwYJKoZIhvcNAQEKA4IBjwAwggGKAoIB @@ -105,13 +105,13 @@ lX8CAwEAAaNjMGEwHQYDVR0OBBYEFKpx07GKS7tHFUdfm9AradFvhV72MB8GA1Ud IwQYMBaAFKpx07GKS7tHFUdfm9AradFvhV72MA8GA1UdEwEB/wQFMAMBAf8wDgYD VR0PAQH/BAQDAgGGMD4GCSqGSIb3DQEBCjAxoA0wCwYJYIZIAWUDBAICoRowGAYJ -KoZIhvcNAQEIMAsGCWCGSAFlAwQCAqIEAgIBTgOCAYEAFExmKGqwl6EeK0W8Q0cr -QvVHSwcCUdBtjo4Bci8Qcmz/+1lGon3OoRH6nlRAVHfQFcnONhUIxiTSnEXvJr/2 -Hq3j3s3Vh7vnbJthJFrsXFfcsvF0PR22D5ezZZvC4LAGxwARwLjoS8TU/wxUu3ty -97ZSLBke3iGSV/IUdbri+UvX277P9p4tZXf4/F1obhplgaHioj9eovbBQksthLPC -aJ2u70j3zvDAGGu5J7ofobWny/KWmbgHPhoK1d3ulU6YoD64M4i5+Bxbm3b6K5CO -qZVHscziZ17dnUH5UEP3lfuKRYrPm2Pqqu84A1ZNsXMHOagBp3iDWkMJCH2sfmN0 -AbsWTw0yaz+yk8gh0gtFCwJ4UF/yOWdJGqv46QTAj18hkgiwqF5dJnBDkiE8QgK2 -gKJFpWrw/rt2YHuyCpslpO39nhV55Vq3bhEJ02hzsezWMIdmP90OkgsBBR4Os1aT -lh9LCi6pXM1UXXFUIijbiyiwuKge8dpgJYFThZ/Qhk46 +KoZIhvcNAQEIMAsGCWCGSAFlAwQCAqIEAgIBTgOCAYEAj9LHj399TsoTWVG7LVHH +vHA8LadE4rcU8h9vnoGSjfRlRX1ykTePIbLPqpSizP5jpZajpJz0rtq9sDNhC1QF +2ntae8xdGlmnWa0pc+Ls6Kz0ifQ7TReocq7QeKHyVyoV4QdswWmSaqTqJDC8+9SV +b7ncDk8+ox/lLi6wWgoaOeOoeiwDMsL3tVWmK9xs3hP8+r1f7v6vqEvBLivawSnT +kqY63ASEZ4Rj+LDwS49eFs2XIjIoLbstB3RJG3jOTkusV/gh8vYqDa3qKj/twfye +3GKz80O9HRTjl1Eb798NtAS0eot6Fr7VQHcHz4fjLl7f7qK9PFCvp9E0hFCfcy2J +EkuPNNZrgJQ2FhawXLw2NhJEi/Qg7wg9jNaBZmEOV4VUgrP445ghROpKpv/sqrVY +I2oD7cKMIvU9FH7/9hZ2LiAuGhucTGyN9d4cCVlnznNHEcftQ98FB3XgjhWWYUrp +Mg01hswboXo6o49Y4iH9S9ligoNW7dxhwhN5gByJ9/wC -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/root-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,7 +2,7 @@ Data: Version: 3 (0x2) Serial Number: - 59:97:7c:29:94:e1:4d:a1:1e:91:68:90:e6:67:3e:26:13:f9:6c:ac + 73:13:23:bb:43:e9:76:b0:ce:25:f7:d5:65:b4:8f:7a:e5:7f:be:4f Signature Algorithm: rsassaPss Hash Algorithm: sha256 Mask Algorithm: mgf1 with sha256 @@ -10,8 +10,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -57,29 +57,29 @@ Salt Length: 0x20 Trailer Field: 0xBC (default) - 08:08:92:4e:3c:fb:9e:5d:3e:b3:5d:31:d0:4d:00:7d:1c:dd: - 28:e1:dd:e9:2c:24:35:43:8b:e4:8d:48:fd:63:9f:ef:a7:c7: - a7:df:ea:2b:e2:17:7a:b8:2f:79:e3:15:00:68:63:d7:64:82: - 00:67:e1:d6:4b:d7:b3:e6:f7:dd:48:3e:64:9e:74:51:0f:d0: - 83:df:91:5c:6e:99:e8:4c:d1:61:0e:83:84:01:78:85:45:b3: - d3:f2:b9:d5:39:02:38:ed:ac:1a:fa:b1:60:08:a5:9b:ea:c9: - 39:f7:fa:23:3c:34:4b:36:e1:99:cf:1b:ce:36:ea:30:9b:df: - b4:9a:8e:65:d2:62:ba:28:e0:24:db:28:2c:d5:76:28:e0:3f: - eb:e3:0c:32:c3:75:e0:4c:30:83:9b:49:b5:0a:c3:68:8f:5e: - ea:1e:14:a9:92:5b:e9:24:7b:da:47:94:b2:a1:98:6d:b0:e3: - 35:fb:ae:c3:d8:24:b4:24:6b:64:8d:38:7b:0b:0e:aa:59:ee: - 68:05:4b:af:33:45:6d:7e:c3:27:8b:99:8e:56:ed:35:d2:a7: - 6a:67:db:c0:f7:03:00:a4:5c:ca:5f:ea:fb:20:15:01:43:9f: - 5d:4e:7e:30:08:37:fd:6e:12:7e:d6:37:2e:58:2f:9c:3e:c3: - bd:e8:bb:e1 + 0f:1c:2d:bd:46:35:3b:80:d7:d1:45:74:d4:54:8d:ff:b0:29: + 06:be:e4:c7:cc:93:06:9d:2c:0f:7d:82:2a:76:ed:36:4a:71: + cd:6b:47:94:e9:c9:29:c7:17:4e:c4:0a:0d:4a:53:92:fb:72: + b8:a7:a1:bb:87:fc:e1:7e:51:1b:b5:d7:34:63:7e:9f:ff:70: + 2a:45:3c:db:fc:0a:d6:59:3a:76:30:09:81:40:94:28:4b:ca: + 36:62:1f:d9:8a:58:3d:b1:3e:8e:9e:c2:01:2c:f9:aa:71:61: + 0c:6f:46:99:c8:cb:a6:c5:9e:4a:40:3d:84:af:2f:0c:45:59: + f5:a9:c5:44:b6:4d:b7:d5:fd:5d:f3:5b:8d:0b:6a:69:e7:30: + 76:76:ef:ee:ad:80:e3:45:92:a9:fa:32:43:bc:2c:c5:51:f4: + 6e:3a:42:8e:fc:a1:eb:03:ca:3c:c5:fc:d7:62:cb:d5:34:92: + 59:2d:f7:d0:fc:f2:e1:2c:5c:c2:94:f4:9d:3b:8f:d8:46:ed: + 29:21:5c:1b:c6:da:30:71:8d:9f:00:03:82:34:33:1d:d7:20: + e8:4f:9f:9e:bd:91:25:fa:f7:0b:6a:64:99:ad:f3:f7:66:a4: + cd:b3:6d:e7:ec:06:9b:88:ce:a7:ef:59:e3:d0:6c:22:af:b8: + ce:7a:3b:60 -----BEGIN CERTIFICATE----- -MIIEvTCCA3WgAwIBAgIUWZd8KZThTaEekWiQ5mc+JhP5bKwwPQYJKoZIhvcNAQEK +MIIEvTCCA3WgAwIBAgIUcxMju0PpdrDOJffVZbSPeuV/vk8wPQYJKoZIhvcNAQEK MDCgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMC ASAwgZ0xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX1JTQS1QU1MxFTATBgNVBAsMDFJvb3Qt UlNBLVBTUzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkB -FhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0 -OVowgZ0xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +FhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTky +OFowgZ0xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRgwFgYDVQQKDA93b2xmU1NMX1JTQS1QU1MxFTATBgNVBAsMDFJvb3Qt UlNBLVBTUzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tMIIBUjA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFl @@ -93,10 +93,10 @@ SZjYDFR9Rp6lPNYwHwYDVR0jBBgwFoAUZNXsgoeA3lrtSZjYDFR9Rp6lPNYwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwPQYJKoZIhvcNAQEKMDCgDTAL BglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggEB -AAgIkk48+55dPrNdMdBNAH0c3Sjh3eksJDVDi+SNSP1jn++nx6ff6iviF3q4L3nj -FQBoY9dkggBn4dZL17Pm991IPmSedFEP0IPfkVxumehM0WEOg4QBeIVFs9PyudU5 -AjjtrBr6sWAIpZvqyTn3+iM8NEs24ZnPG8426jCb37SajmXSYroo4CTbKCzVdijg -P+vjDDLDdeBMMIObSbUKw2iPXuoeFKmSW+kke9pHlLKhmG2w4zX7rsPYJLQka2SN -OHsLDqpZ7mgFS68zRW1+wyeLmY5W7TXSp2pn28D3AwCkXMpf6vsgFQFDn11OfjAI -N/1uEn7WNy5YL5w+w73ou+E= +AA8cLb1GNTuA19FFdNRUjf+wKQa+5MfMkwadLA99gip27TZKcc1rR5TpySnHF07E +Cg1KU5L7crinobuH/OF+URu11zRjfp//cCpFPNv8CtZZOnYwCYFAlChLyjZiH9mK +WD2xPo6ewgEs+apxYQxvRpnIy6bFnkpAPYSvLwxFWfWpxUS2TbfV/V3zW40Lamnn +MHZ27+6tgONFkqn6MkO8LMVR9G46Qo78oesDyjzF/Ndiy9U0klkt99D88uEsXMKU +9J07j9hG7SkhXBvG2jBxjZ8AA4I0Mx3XIOhPn569kSX69wtqZJmt8/dmpM2zbefs +BpuIzqfvWePQbCKvuM56O2A= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -9,8 +9,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Server-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -64,36 +64,36 @@ Salt Length: 0x014E Trailer Field: 0xBC (default) - a3:6f:52:58:b0:d4:8f:e5:95:ec:7d:25:a7:67:a2:a1:2a:5f: - 11:aa:8c:cb:62:fc:75:e2:78:7d:ee:3b:ec:ac:30:80:3b:c5: - b7:7b:ce:6e:e3:91:ea:54:d4:cd:e5:07:55:f2:10:e8:e8:86: - 68:e8:01:c0:53:ca:b3:7f:7b:79:e6:31:82:aa:e9:02:c5:ca: - e4:f2:df:a6:5a:99:f1:bc:59:3d:4c:b2:bc:92:e6:15:4a:49: - 0b:b6:10:ca:12:48:03:d9:b7:87:d0:f8:ba:c9:c3:c2:fc:29: - 8a:a7:c1:4c:26:42:9f:1a:ce:f3:31:a2:4a:f7:25:8c:ed:40: - 71:77:7b:06:cc:4c:6f:bb:4e:34:c4:b5:e2:24:06:56:f3:ef: - 9b:05:78:5a:e3:f3:c2:42:f4:eb:3e:28:f6:88:29:68:65:61: - 60:d2:61:ac:a1:4e:ec:6a:c1:15:87:1a:8c:06:2d:34:e7:66: - bf:4f:5d:4d:23:46:33:67:2b:1d:97:f2:9a:e6:2e:90:1b:87: - 93:03:2d:51:d8:7d:3d:0e:59:8a:30:34:8b:b2:09:92:99:03: - b7:ad:a4:c5:ad:6d:bb:e6:5e:c2:e4:86:d2:63:3b:c8:8e:0a: - a3:39:bd:9c:e9:a5:cf:65:65:85:8e:08:8e:d9:85:36:3e:1d: - c6:66:3a:6d:a6:9d:be:e0:d8:e9:dd:17:1c:df:75:04:3e:24: - a9:c0:19:17:a1:ef:6e:db:a6:bd:fc:1d:99:8d:11:0c:3c:5b: - 44:b0:da:f4:0a:e2:c6:39:13:5f:f1:6a:20:ae:07:07:41:95: - d4:10:92:b4:32:01:27:74:ef:aa:97:0e:9f:73:67:29:5c:40: - d2:5b:31:bb:c5:70:c0:c3:b6:7b:39:c4:76:b8:ec:67:c9:0a: - bd:d3:dc:c8:4f:41:62:5e:46:3a:d4:e6:65:12:4d:c0:7e:68: - 6c:9d:6a:ec:4f:da:e3:b3:94:58:be:ad:b6:85:01:e3:94:a4: - 4b:7d:28:00:0e:f3 + a1:de:92:ed:d2:4f:c8:85:21:4f:96:af:a2:74:a9:e7:3d:c7: + f5:84:8e:4c:6c:29:2b:ed:24:5e:60:ea:bb:43:c0:7f:b3:5d: + e5:d9:44:34:b3:d0:e1:d2:04:c1:f4:88:e3:7a:c8:a5:cb:85: + 3e:27:52:d9:f4:c2:9e:45:35:e8:2b:ca:2d:c3:d4:30:53:c5: + c1:f4:9c:d1:98:bf:80:c2:91:88:da:37:f5:ed:6f:5f:73:83: + e7:3c:94:c9:b8:fe:e5:aa:0b:18:f4:69:92:a9:38:58:42:6a: + 8b:2e:c0:37:aa:3e:50:8e:e9:93:26:ba:cd:28:da:79:fb:cf: + 4d:8f:03:b8:e3:bd:5f:d2:c6:ad:42:66:9f:4d:51:fc:16:1a: + e9:80:45:45:c5:fe:e2:1e:15:08:5f:e8:dc:2d:03:e9:08:03: + ae:1a:dd:a0:3b:b9:65:98:c3:01:4a:4b:4f:ad:3d:20:cd:d0: + 60:b8:7a:7b:26:4d:cb:ff:b4:f0:d2:9b:cf:ce:8e:d3:32:14: + 23:a2:52:c8:20:fc:9c:23:21:13:e9:eb:2e:c0:1b:18:e8:09: + ac:e9:c9:2e:5e:63:6f:c4:60:b5:2c:61:12:25:a0:72:fe:ed: + 7d:74:62:b5:2e:7a:91:83:96:64:ff:c2:ef:6f:8c:a8:7e:22: + d8:79:d1:16:d9:96:87:9e:9e:c4:34:71:cd:0c:ec:ac:e1:60: + 44:29:b3:72:94:46:ea:08:82:c2:fa:05:55:c7:e5:16:5f:3b: + 16:02:34:3c:ca:44:f8:a4:ba:c8:ae:7b:83:79:d7:20:45:14: + 6a:5a:b7:85:80:ce:aa:cb:dc:46:41:70:01:54:dd:f4:58:20: + da:1d:df:2f:61:53:d4:57:de:53:4c:56:d0:70:60:59:1f:f8: + 84:25:11:74:b1:12:1c:90:ef:11:07:65:ec:a3:64:df:0b:51: + d0:65:70:9c:a1:2f:9b:dd:10:dc:33:b3:1a:8e:5a:8a:68:43: + 7f:9e:6b:b8:a4:33 -----BEGIN CERTIFICATE----- MIIFzzCCBAagAwIBAgIBATA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAqEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiBAICAU4wgbIxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRcwFQYDVQQKDA53 b2xmU1NMX1JTQVBTUzESMBAGA1UECwwJQ0EtUlNBUFNTMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAV -BgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIx -MTc0OVowgbYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQH +BgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIy +MTkyOVowgbYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQH DAdCb3plbWFuMRcwFQYDVQQKDA53b2xmU1NMX1JTQVBTUzEWMBQGA1UECwwNU2Vy dmVyLVJTQVBTUzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcN AQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDCC @@ -110,13 +110,13 @@ Bkz/Vau/Dn8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAww CgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZAMD4GCSqGSIb3DQEBCjAxoA0w CwYJYIZIAWUDBAICoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAqIEAgIBTgOC -AYEAo29SWLDUj+WV7H0lp2eioSpfEaqMy2L8deJ4fe477KwwgDvFt3vObuOR6lTU -zeUHVfIQ6OiGaOgBwFPKs397eeYxgqrpAsXK5PLfplqZ8bxZPUyyvJLmFUpJC7YQ -yhJIA9m3h9D4usnDwvwpiqfBTCZCnxrO8zGiSvcljO1AcXd7BsxMb7tONMS14iQG -VvPvmwV4WuPzwkL06z4o9ogpaGVhYNJhrKFO7GrBFYcajAYtNOdmv09dTSNGM2cr -HZfymuYukBuHkwMtUdh9PQ5ZijA0i7IJkpkDt62kxa1tu+ZewuSG0mM7yI4Kozm9 -nOmlz2VlhY4IjtmFNj4dxmY6baadvuDY6d0XHN91BD4kqcAZF6HvbtumvfwdmY0R -DDxbRLDa9ArixjkTX/FqIK4HB0GV1BCStDIBJ3TvqpcOn3NnKVxA0lsxu8VwwMO2 -eznEdrjsZ8kKvdPcyE9BYl5GOtTmZRJNwH5obJ1q7E/a47OUWL6ttoUB45SkS30o -AA7z +AYEAod6S7dJPyIUhT5avonSp5z3H9YSOTGwpK+0kXmDqu0PAf7Nd5dlENLPQ4dIE +wfSI43rIpcuFPidS2fTCnkU16CvKLcPUMFPFwfSc0Zi/gMKRiNo39e1vX3OD5zyU +ybj+5aoLGPRpkqk4WEJqiy7AN6o+UI7pkya6zSjaefvPTY8DuOO9X9LGrUJmn01R +/BYa6YBFRcX+4h4VCF/o3C0D6QgDrhrdoDu5ZZjDAUpLT609IM3QYLh6eyZNy/+0 +8NKbz86O0zIUI6JSyCD8nCMhE+nrLsAbGOgJrOnJLl5jb8RgtSxhEiWgcv7tfXRi +tS56kYOWZP/C72+MqH4i2HnRFtmWh56exDRxzQzsrOFgRCmzcpRG6giCwvoFVcfl +Fl87FgI0PMpE+KS6yK57g3nXIEUUalq3hYDOqsvcRkFwAVTd9Fgg2h3fL2FT1Ffe +U0xW0HBgWR/4hCURdLESHJDvEQdl7KNk3wtR0GVwnKEvm90Q3DOzGo5aimhDf55r +uKQz -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-3072-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -9,8 +9,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Server-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -64,36 +64,36 @@ Salt Length: 0x014E Trailer Field: 0xBC (default) - a3:6f:52:58:b0:d4:8f:e5:95:ec:7d:25:a7:67:a2:a1:2a:5f: - 11:aa:8c:cb:62:fc:75:e2:78:7d:ee:3b:ec:ac:30:80:3b:c5: - b7:7b:ce:6e:e3:91:ea:54:d4:cd:e5:07:55:f2:10:e8:e8:86: - 68:e8:01:c0:53:ca:b3:7f:7b:79:e6:31:82:aa:e9:02:c5:ca: - e4:f2:df:a6:5a:99:f1:bc:59:3d:4c:b2:bc:92:e6:15:4a:49: - 0b:b6:10:ca:12:48:03:d9:b7:87:d0:f8:ba:c9:c3:c2:fc:29: - 8a:a7:c1:4c:26:42:9f:1a:ce:f3:31:a2:4a:f7:25:8c:ed:40: - 71:77:7b:06:cc:4c:6f:bb:4e:34:c4:b5:e2:24:06:56:f3:ef: - 9b:05:78:5a:e3:f3:c2:42:f4:eb:3e:28:f6:88:29:68:65:61: - 60:d2:61:ac:a1:4e:ec:6a:c1:15:87:1a:8c:06:2d:34:e7:66: - bf:4f:5d:4d:23:46:33:67:2b:1d:97:f2:9a:e6:2e:90:1b:87: - 93:03:2d:51:d8:7d:3d:0e:59:8a:30:34:8b:b2:09:92:99:03: - b7:ad:a4:c5:ad:6d:bb:e6:5e:c2:e4:86:d2:63:3b:c8:8e:0a: - a3:39:bd:9c:e9:a5:cf:65:65:85:8e:08:8e:d9:85:36:3e:1d: - c6:66:3a:6d:a6:9d:be:e0:d8:e9:dd:17:1c:df:75:04:3e:24: - a9:c0:19:17:a1:ef:6e:db:a6:bd:fc:1d:99:8d:11:0c:3c:5b: - 44:b0:da:f4:0a:e2:c6:39:13:5f:f1:6a:20:ae:07:07:41:95: - d4:10:92:b4:32:01:27:74:ef:aa:97:0e:9f:73:67:29:5c:40: - d2:5b:31:bb:c5:70:c0:c3:b6:7b:39:c4:76:b8:ec:67:c9:0a: - bd:d3:dc:c8:4f:41:62:5e:46:3a:d4:e6:65:12:4d:c0:7e:68: - 6c:9d:6a:ec:4f:da:e3:b3:94:58:be:ad:b6:85:01:e3:94:a4: - 4b:7d:28:00:0e:f3 + a1:de:92:ed:d2:4f:c8:85:21:4f:96:af:a2:74:a9:e7:3d:c7: + f5:84:8e:4c:6c:29:2b:ed:24:5e:60:ea:bb:43:c0:7f:b3:5d: + e5:d9:44:34:b3:d0:e1:d2:04:c1:f4:88:e3:7a:c8:a5:cb:85: + 3e:27:52:d9:f4:c2:9e:45:35:e8:2b:ca:2d:c3:d4:30:53:c5: + c1:f4:9c:d1:98:bf:80:c2:91:88:da:37:f5:ed:6f:5f:73:83: + e7:3c:94:c9:b8:fe:e5:aa:0b:18:f4:69:92:a9:38:58:42:6a: + 8b:2e:c0:37:aa:3e:50:8e:e9:93:26:ba:cd:28:da:79:fb:cf: + 4d:8f:03:b8:e3:bd:5f:d2:c6:ad:42:66:9f:4d:51:fc:16:1a: + e9:80:45:45:c5:fe:e2:1e:15:08:5f:e8:dc:2d:03:e9:08:03: + ae:1a:dd:a0:3b:b9:65:98:c3:01:4a:4b:4f:ad:3d:20:cd:d0: + 60:b8:7a:7b:26:4d:cb:ff:b4:f0:d2:9b:cf:ce:8e:d3:32:14: + 23:a2:52:c8:20:fc:9c:23:21:13:e9:eb:2e:c0:1b:18:e8:09: + ac:e9:c9:2e:5e:63:6f:c4:60:b5:2c:61:12:25:a0:72:fe:ed: + 7d:74:62:b5:2e:7a:91:83:96:64:ff:c2:ef:6f:8c:a8:7e:22: + d8:79:d1:16:d9:96:87:9e:9e:c4:34:71:cd:0c:ec:ac:e1:60: + 44:29:b3:72:94:46:ea:08:82:c2:fa:05:55:c7:e5:16:5f:3b: + 16:02:34:3c:ca:44:f8:a4:ba:c8:ae:7b:83:79:d7:20:45:14: + 6a:5a:b7:85:80:ce:aa:cb:dc:46:41:70:01:54:dd:f4:58:20: + da:1d:df:2f:61:53:d4:57:de:53:4c:56:d0:70:60:59:1f:f8: + 84:25:11:74:b1:12:1c:90:ef:11:07:65:ec:a3:64:df:0b:51: + d0:65:70:9c:a1:2f:9b:dd:10:dc:33:b3:1a:8e:5a:8a:68:43: + 7f:9e:6b:b8:a4:33 -----BEGIN CERTIFICATE----- MIIFzzCCBAagAwIBAgIBATA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAqEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiBAICAU4wgbIxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRcwFQYDVQQKDA53 b2xmU1NMX1JTQVBTUzESMBAGA1UECwwJQ0EtUlNBUFNTMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAV -BgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIx -MTc0OVowgbYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQH +BgoJkiaJk/IsZAEBDAd3b2xmU1NMMB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIy +MTkyOVowgbYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQH DAdCb3plbWFuMRcwFQYDVQQKDA53b2xmU1NMX1JTQVBTUzEWMBQGA1UECwwNU2Vy dmVyLVJTQVBTUzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcN AQkBFhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDCC @@ -110,15 +110,15 @@ Bkz/Vau/Dn8wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAww CgYIKwYBBQUHAwEwEQYJYIZIAYb4QgEBBAQDAgZAMD4GCSqGSIb3DQEBCjAxoA0w CwYJYIZIAWUDBAICoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAqIEAgIBTgOC -AYEAo29SWLDUj+WV7H0lp2eioSpfEaqMy2L8deJ4fe477KwwgDvFt3vObuOR6lTU -zeUHVfIQ6OiGaOgBwFPKs397eeYxgqrpAsXK5PLfplqZ8bxZPUyyvJLmFUpJC7YQ -yhJIA9m3h9D4usnDwvwpiqfBTCZCnxrO8zGiSvcljO1AcXd7BsxMb7tONMS14iQG -VvPvmwV4WuPzwkL06z4o9ogpaGVhYNJhrKFO7GrBFYcajAYtNOdmv09dTSNGM2cr -HZfymuYukBuHkwMtUdh9PQ5ZijA0i7IJkpkDt62kxa1tu+ZewuSG0mM7yI4Kozm9 -nOmlz2VlhY4IjtmFNj4dxmY6baadvuDY6d0XHN91BD4kqcAZF6HvbtumvfwdmY0R -DDxbRLDa9ArixjkTX/FqIK4HB0GV1BCStDIBJ3TvqpcOn3NnKVxA0lsxu8VwwMO2 -eznEdrjsZ8kKvdPcyE9BYl5GOtTmZRJNwH5obJ1q7E/a47OUWL6ttoUB45SkS30o -AA7z +AYEAod6S7dJPyIUhT5avonSp5z3H9YSOTGwpK+0kXmDqu0PAf7Nd5dlENLPQ4dIE +wfSI43rIpcuFPidS2fTCnkU16CvKLcPUMFPFwfSc0Zi/gMKRiNo39e1vX3OD5zyU +ybj+5aoLGPRpkqk4WEJqiy7AN6o+UI7pkya6zSjaefvPTY8DuOO9X9LGrUJmn01R +/BYa6YBFRcX+4h4VCF/o3C0D6QgDrhrdoDu5ZZjDAUpLT609IM3QYLh6eyZNy/+0 +8NKbz86O0zIUI6JSyCD8nCMhE+nrLsAbGOgJrOnJLl5jb8RgtSxhEiWgcv7tfXRi +tS56kYOWZP/C72+MqH4i2HnRFtmWh56exDRxzQzsrOFgRCmzcpRG6giCwvoFVcfl +Fl87FgI0PMpE+KS6yK57g3nXIEUUalq3hYDOqsvcRkFwAVTd9Fgg2h3fL2FT1Ffe +U0xW0HBgWR/4hCURdLESHJDvEQdl7KNk3wtR0GVwnKEvm90Q3DOzGo5aimhDf55r +uKQz -----END CERTIFICATE----- Certificate: Data: @@ -131,8 +131,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -182,35 +182,35 @@ Salt Length: 0x014E Trailer Field: 0xBC (default) - 39:46:e9:1d:16:25:a1:15:6d:65:88:54:ef:7e:33:b3:0e:44: - f2:11:cd:23:ad:73:2f:80:3c:aa:10:bd:7e:3c:45:1b:c9:8c: - d7:2c:71:99:87:b4:e3:81:57:a8:c2:86:6c:80:ec:7c:4a:fb: - da:01:ed:e1:f6:b2:15:16:e1:3f:cd:de:85:d2:25:3b:11:31: - f6:a1:54:52:57:25:6c:41:99:d3:dd:92:af:ca:ed:c6:28:d4: - e5:6d:88:a5:c5:37:3f:6f:50:43:54:21:c9:cd:77:71:5c:81: - 6e:ec:96:b4:ea:04:41:d7:db:ec:43:d2:65:a3:2d:a8:33:1d: - 27:01:1e:28:16:2a:93:61:a6:af:8f:9d:31:e2:34:89:f8:9a: - cf:a0:c9:12:95:1b:9f:93:e6:10:90:e0:bc:d9:a3:72:40:30: - cb:c4:b4:ac:3f:17:42:3b:a1:ab:ff:3a:d4:c3:2b:22:56:fb: - 77:93:c9:32:7f:bd:18:ff:c0:60:bc:dd:ce:09:d1:e9:22:44: - f2:9b:85:8b:20:fa:77:b0:95:aa:b5:9c:de:83:2b:58:7c:ec: - fb:aa:9c:b9:57:5d:32:32:a3:81:66:a4:1f:0f:2b:08:1b:65: - 1c:d4:e1:4f:7f:d9:ee:39:a9:ae:99:6e:0a:3b:e4:ef:11:d6: - c9:e9:6f:89:27:c4:25:28:be:5a:e5:17:87:e7:56:0a:f4:32: - 38:f2:86:84:d7:b6:66:47:f3:46:46:55:80:08:d6:8e:c0:08: - a0:3f:04:62:77:1c:6e:dd:80:7e:57:82:0e:60:81:6e:59:ff: - ad:39:6e:a0:fe:66:1a:1b:d1:4c:bf:14:c9:82:83:0a:95:57: - 53:3b:79:be:74:01:d7:a7:62:64:6f:5a:8a:a6:7d:ab:9f:90: - fb:95:89:24:d3:55:02:ef:f1:5f:d4:de:46:0c:5b:9a:60:d6: - 6e:64:cb:11:ae:fa:7f:4f:54:44:c0:ff:af:32:45:92:32:6e: - 5b:cb:9d:2c:03:6e + 1f:c0:ae:b2:47:af:ec:86:67:3a:b6:8f:44:65:4a:af:29:fc: + 17:92:a4:8f:03:6a:76:63:8d:65:4a:f6:52:23:a2:08:46:17: + c6:2c:87:76:2b:05:21:c1:70:2d:4d:65:ef:de:af:87:21:7e: + 88:98:45:8b:06:8f:f8:56:4f:6a:29:f3:f4:72:5d:c3:f4:5a: + ee:6c:52:dc:40:72:4a:1a:4c:3b:84:b0:5a:64:cc:3a:62:c3: + d3:56:a9:e3:fd:4e:a2:3b:57:22:b7:f9:71:f7:5c:80:aa:4c: + 26:ef:d5:10:e5:d9:ae:89:ff:90:82:2e:0a:ad:1c:da:a6:9c: + 99:44:d5:fc:a0:3c:42:ad:e7:dd:8a:d0:c7:b8:d0:83:bb:4b: + 00:e2:50:e5:81:6f:03:b8:bc:4d:d2:86:4d:8a:33:79:ca:e8: + a0:df:70:c1:3a:c3:55:05:f0:ac:d8:ab:55:0b:cf:44:60:b4: + af:03:f4:88:d9:49:81:7c:78:6a:af:5f:cd:28:e2:e1:37:f3: + 28:b8:0e:05:5d:72:b3:b5:5b:f4:72:52:a3:7e:99:99:23:95: + 26:17:cb:9c:66:83:21:d6:ac:f8:c8:b2:49:22:dc:32:9b:f2: + fc:5d:f7:fe:c0:a6:81:62:1c:43:25:2a:d3:66:37:76:db:15: + 31:c4:6b:df:e8:70:a9:f9:96:8c:ec:94:d1:b2:fb:73:03:1b: + 5d:7f:2b:1b:ab:47:72:ea:1b:9d:2d:43:d4:90:df:ca:c5:98: + 9a:a2:01:6a:d3:55:1c:ad:d1:37:46:93:fe:e8:56:8c:6a:1c: + 45:bf:cb:12:d1:aa:1c:98:08:af:f7:67:ed:41:65:3b:98:d0: + 42:29:b0:68:ab:94:52:6e:72:e2:f4:df:8a:68:b5:1b:6d:3f: + 35:d5:01:b8:60:eb:fe:f2:e9:33:90:db:59:5a:c4:d6:52:c6: + c7:1b:a8:a1:ef:64:db:96:ac:ce:fc:8d:e2:ac:75:f4:0d:bc: + 49:36:8a:12:36:83 -----BEGIN CERTIFICATE----- MIIFjzCCA8agAwIBAgIBATA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAqEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiBAICAU4wgZ0xCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA93 b2xmU1NMX1JTQS1QU1MxFTATBgNVBAsMDFJvb3QtUlNBLVBTUzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t -MB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgbIxCzAJBgNVBAYTAlVT +MB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgbIxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRcwFQYDVQQKDA53 b2xmU1NMX1JTQVBTUzESMBAGA1UECwwJQ0EtUlNBUFNTMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAV @@ -226,13 +226,13 @@ LwkOZwIDAQABo2MwYTAdBgNVHQ4EFgQU+ELMiMnIGPnTsCRlBkz/Vau/Dn8wHwYD VR0jBBgwFoAUqnHTsYpLu0cVR1+b0Ctp0W+FXvYwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgKhGjAY -BgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogQCAgFOA4IBgQA5RukdFiWhFW1liFTv -fjOzDkTyEc0jrXMvgDyqEL1+PEUbyYzXLHGZh7TjgVeowoZsgOx8SvvaAe3h9rIV -FuE/zd6F0iU7ETH2oVRSVyVsQZnT3ZKvyu3GKNTlbYilxTc/b1BDVCHJzXdxXIFu -7Ja06gRB19vsQ9Jloy2oMx0nAR4oFiqTYaavj50x4jSJ+JrPoMkSlRufk+YQkOC8 -2aNyQDDLxLSsPxdCO6Gr/zrUwysiVvt3k8kyf70Y/8BgvN3OCdHpIkTym4WLIPp3 -sJWqtZzegytYfOz7qpy5V10yMqOBZqQfDysIG2Uc1OFPf9nuOamumW4KO+TvEdbJ -6W+JJ8QlKL5a5ReH51YK9DI48oaE17ZmR/NGRlWACNaOwAigPwRidxxu3YB+V4IO -YIFuWf+tOW6g/mYaG9FMvxTJgoMKlVdTO3m+dAHXp2Jkb1qKpn2rn5D7lYkk01UC -7/Ff1N5GDFuaYNZuZMsRrvp/T1REwP+vMkWSMm5by50sA24= +BgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogQCAgFOA4IBgQAfwK6yR6/shmc6to9E +ZUqvKfwXkqSPA2p2Y41lSvZSI6IIRhfGLId2KwUhwXAtTWXv3q+HIX6ImEWLBo/4 +Vk9qKfP0cl3D9FrubFLcQHJKGkw7hLBaZMw6YsPTVqnj/U6iO1cit/lx91yAqkwm +79UQ5dmuif+Qgi4KrRzappyZRNX8oDxCrefditDHuNCDu0sA4lDlgW8DuLxN0oZN +ijN5yuig33DBOsNVBfCs2KtVC89EYLSvA/SI2UmBfHhqr1/NKOLhN/MouA4FXXKz +tVv0clKjfpmZI5UmF8ucZoMh1qz4yLJJItwym/L8Xff+wKaBYhxDJSrTZjd22xUx +xGvf6HCp+ZaM7JTRsvtzAxtdfysbq0dy6hudLUPUkN/KxZiaogFq01UcrdE3RpP+ +6FaMahxFv8sS0aocmAiv92ftQWU7mNBCKbBoq5RSbnLi9N+KaLUbbT811QG4YOv+ +8ukzkNtZWsTWUsbHG6ih72TblqzO/I3irHX0DbxJNooSNoM= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-mix-rsapss-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-mix-rsapss-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-mix-rsapss-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-mix-rsapss-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -9,8 +9,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Server-MIX-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -55,28 +55,28 @@ Salt Length: 0xDE Trailer Field: 0xBC (default) - 3c:41:e4:e3:a2:f2:8d:f7:ba:f3:c3:51:c6:b2:71:2d:d4:4d: - c3:10:b1:0c:1b:c2:e5:cd:48:13:a9:2f:cc:13:f3:db:25:85: - c3:83:0a:77:00:ff:16:58:c0:2a:12:20:11:5a:86:87:db:1e: - 47:ac:9d:c5:7c:87:c3:13:79:c8:ea:35:33:a0:a3:bf:d5:64: - 09:5b:60:45:e9:b1:a4:3c:9a:31:14:fb:76:ae:ef:3c:56:cc: - 9b:3d:de:74:16:ac:5f:9b:f2:1b:28:8f:fe:d6:0a:4f:bc:72: - c2:23:c6:c5:da:c2:aa:80:ac:90:c4:31:93:99:f5:c7:c1:cc: - ec:09:45:02:90:4e:b3:47:59:f6:80:6c:c0:bb:66:f7:fb:e1: - 16:56:7b:6e:ef:e6:b6:93:e5:95:d4:e3:76:c0:de:64:6b:1c: - 72:0d:0d:7b:85:2f:b4:e2:9e:01:44:6f:85:53:30:78:bf:c3: - 4e:33:21:0b:f9:a6:66:85:a0:ef:60:8d:07:7d:ac:fb:3c:11: - aa:f9:7f:5b:f9:0e:af:27:d4:a9:fb:b2:b3:fe:8d:4c:d0:9f: - 83:9a:79:32:7f:b2:11:af:b5:35:a3:62:4a:4a:03:c8:cd:f0: - f7:5e:98:9d:5e:d0:7f:e9:cf:8a:1f:bd:28:c7:25:8e:7b:63: - 30:83:6c:00 + 14:99:93:0c:53:6c:7e:43:6d:28:73:f0:11:fa:80:13:79:af: + 2d:c2:64:71:1d:90:5d:b2:2e:1f:4c:bf:30:21:12:16:82:a4: + 8d:90:e7:e3:3c:ee:3a:d1:50:ba:18:e0:d5:e7:cb:6b:87:ae: + 24:e1:0b:7c:c7:83:28:98:56:dc:63:d7:6e:d1:f6:a9:92:3e: + d5:aa:83:f3:c4:fe:53:26:d0:b3:e8:f2:0b:34:bb:cb:5d:53: + 28:36:b9:ab:b8:13:a2:b3:53:ac:ab:c7:41:92:f5:e4:c7:66: + c6:af:15:f9:c2:a5:9c:c3:07:81:c9:c0:41:2c:40:11:5b:86: + 63:c0:6e:1d:c7:e4:3f:41:a4:8d:18:2c:da:1a:fa:d7:39:d3: + b6:8f:be:87:0f:2b:a1:90:6a:d7:ba:df:cf:97:20:05:7e:8c: + a7:f8:90:bf:ec:b6:a6:44:08:81:57:19:15:a9:a9:0f:1c:5c: + 78:ab:b8:35:5b:b0:8c:7d:48:f5:21:38:e7:a2:51:27:fc:24: + ea:2f:9f:f7:19:62:e6:1f:cf:1c:5d:9c:e2:b5:e7:b2:4c:ac: + fc:64:fd:0e:bd:5d:3b:02:44:94:ec:5e:1c:24:d1:3d:37:3b: + eb:23:2f:7a:46:c6:45:4d:55:1e:50:d2:6f:c2:16:5b:78:a7: + 06:e1:ee:36 -----BEGIN CERTIFICATE----- MIIEtzCCA26gAwIBAgIBATA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgboxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgboxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRcwFQYDVQQKDA53b2xmU1NMX1JT QVBTUzEaMBgGA1UECwwRU2VydmVyLU1JWC1SU0FQU1MxGDAWBgNVBAMMD3d3dy53 b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUG @@ -90,11 +90,11 @@ mITiyfjQO24DQsofDo48MB8GA1UdIwQYMBaAFCeOZxF0wyYdP+0zY7Ok2B0w5ejV MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUF BwMBMBEGCWCGSAGG+EIBAQQEAwIGQDA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFl -AwQCAaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBADxB5OOi -8o33uvPDUcaycS3UTcMQsQwbwuXNSBOpL8wT89slhcODCncA/xZYwCoSIBFahofb -HkesncV8h8MTecjqNTOgo7/VZAlbYEXpsaQ8mjEU+3au7zxWzJs93nQWrF+b8hso -j/7WCk+8csIjxsXawqqArJDEMZOZ9cfBzOwJRQKQTrNHWfaAbMC7Zvf74RZWe27v -5raT5ZXU43bA3mRrHHINDXuFL7TingFEb4VTMHi/w04zIQv5pmaFoO9gjQd9rPs8 -Ear5f1v5Dq8n1Kn7srP+jUzQn4OaeTJ/shGvtTWjYkpKA8jN8PdemJ1e0H/pz4of -vSjHJY57YzCDbAA= +AwQCAaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBABSZkwxT +bH5DbShz8BH6gBN5ry3CZHEdkF2yLh9MvzAhEhaCpI2Q5+M87jrRULoY4NXny2uH +riThC3zHgyiYVtxj127R9qmSPtWqg/PE/lMm0LPo8gs0u8tdUyg2uau4E6KzU6yr +x0GS9eTHZsavFfnCpZzDB4HJwEEsQBFbhmPAbh3H5D9BpI0YLNoa+tc507aPvocP +K6GQate638+XIAV+jKf4kL/stqZECIFXGRWpqQ8cXHiruDVbsIx9SPUhOOeiUSf8 +JOovn/cZYuYfzxxdnOK157JMrPxk/Q69XTsCRJTsXhwk0T03O+sjL3pGxkVNVR5Q +0m/CFlt4pwbh7jY= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -9,8 +9,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Server-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -60,29 +60,29 @@ Salt Length: 0x20 Trailer Field: 0xBC (default) - a3:9a:85:01:f5:22:c0:a3:8e:80:da:04:5e:a3:51:71:97:ba: - 77:9f:96:19:33:6d:52:9e:ff:ce:05:a3:a6:87:05:d4:24:13: - 91:1e:75:0b:af:d7:6c:0c:75:d9:63:27:a1:9b:1b:fd:f9:16: - 70:fc:a1:f7:03:ad:e4:5f:f0:52:66:f8:b2:b6:4e:39:85:c6: - d3:8f:90:7f:de:21:a2:ef:9b:64:a2:77:a7:f2:82:02:4e:da: - 93:4d:53:de:0c:26:fb:b9:87:05:8c:32:d2:96:b3:ab:58:ef: - ba:7c:f8:f6:0d:a5:82:ca:18:4e:21:77:ec:bc:9a:e6:68:e9: - bc:7d:65:27:ad:cd:4b:e1:09:8c:aa:10:76:d1:98:31:89:67: - 8f:c9:ed:78:cd:a5:33:0a:8a:b4:86:48:fe:e9:47:7a:59:fa: - 91:56:5f:9c:72:35:a8:3a:63:7b:3f:7b:9b:a0:1b:e1:c5:69: - b3:0d:90:8b:4d:eb:3f:26:63:4c:bd:10:0d:c4:63:4c:45:4e: - f7:80:f8:e7:8a:24:4b:ee:7c:88:1b:b9:6c:33:57:de:14:7a: - 48:ee:85:58:5a:94:6e:64:68:3c:b8:9f:76:da:15:0e:96:41: - 0b:e7:54:04:f6:49:ed:94:8d:fc:0d:08:e2:28:5d:e2:1a:13: - 3d:73:f6:eb + 44:ba:5d:7a:83:e4:65:ff:23:b8:4b:7c:9f:ab:2e:f7:dc:59: + 7e:6b:40:67:54:09:42:9f:41:1d:a1:7e:a8:f9:47:48:c1:00: + 63:cc:92:06:2c:3c:eb:f4:83:32:c2:2e:d1:78:f3:1e:52:60: + 32:26:8e:b3:b3:62:3d:ba:2b:8d:74:ef:01:5c:cc:1b:7c:ac: + 40:64:07:79:eb:f9:36:26:0e:e9:a8:55:5d:e5:10:87:17:0d: + 69:63:34:4b:5b:09:c8:54:dd:43:1c:1a:62:bb:ac:00:eb:3f: + a8:fe:b3:b6:e0:8b:9e:1c:a5:f4:09:8a:f0:7b:2f:da:13:92: + af:ad:c0:f0:c5:16:18:30:53:a6:5d:b9:1f:97:4b:a6:ac:4c: + 80:dc:01:28:d9:9f:45:73:bd:6c:30:d1:c7:73:33:c5:cc:df: + 56:f4:72:04:00:78:dd:5f:d8:92:bb:87:e9:15:01:e3:f0:6e: + bb:aa:3e:85:f9:68:22:7a:1e:d3:4c:43:bf:01:ee:0a:aa:9c: + 73:0b:38:d4:77:cf:b7:11:ca:5c:aa:e6:e6:25:9d:bf:41:8d: + 79:37:0c:fa:53:41:c5:86:cf:10:29:9d:7a:7c:96:c5:e5:6c: + 57:7b:89:e6:14:84:5b:54:22:c4:5c:81:a0:bf:a4:fc:76:71: + 97:34:62:7d -----BEGIN CERTIFICATE----- MIIE/zCCA7egAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBsjELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFzAVBgNVBAoMDndv bGZTU0xfUlNBUFNTMRIwEAYDVQQLDAlDQS1SU0FQU1MxGDAWBgNVBAMMD3d3dy53 b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUG -CgmSJomT8ixkAQEMB3dvbGZTU0wwHhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjEx -NzQ5WjCBtjELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcM +CgmSJomT8ixkAQEMB3dvbGZTU0wwHhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIx +OTI4WjCBtjELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcM B0JvemVtYW4xFzAVBgNVBAoMDndvbGZTU0xfUlNBUFNTMRYwFAYDVQQLDA1TZXJ2 ZXItUlNBUFNTMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMIIB @@ -97,10 +97,10 @@ GDAWgBSeDODT37ZL8xljXMpsk4aiFFORMTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB /wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATARBglghkgBhvhCAQEEBAMCBkAw PQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJ -YIZIAWUDBAIBogMCASADggEBAKOahQH1IsCjjoDaBF6jUXGXuneflhkzbVKe/84F -o6aHBdQkE5EedQuv12wMddljJ6GbG/35FnD8ofcDreRf8FJm+LK2TjmFxtOPkH/e -IaLvm2Sid6fyggJO2pNNU94MJvu5hwWMMtKWs6tY77p8+PYNpYLKGE4hd+y8muZo -6bx9ZSetzUvhCYyqEHbRmDGJZ4/J7XjNpTMKirSGSP7pR3pZ+pFWX5xyNag6Y3s/ -e5ugG+HFabMNkItN6z8mY0y9EA3EY0xFTveA+OeKJEvufIgbuWwzV94UekjuhVha -lG5kaDy4n3baFQ6WQQvnVAT2Se2UjfwNCOIoXeIaEz1z9us= +YIZIAWUDBAIBogMCASADggEBAES6XXqD5GX/I7hLfJ+rLvfcWX5rQGdUCUKfQR2h +fqj5R0jBAGPMkgYsPOv0gzLCLtF48x5SYDImjrOzYj26K4107wFczBt8rEBkB3nr ++TYmDumoVV3lEIcXDWljNEtbCchU3UMcGmK7rADrP6j+s7bgi54cpfQJivB7L9oT +kq+twPDFFhgwU6ZduR+XS6asTIDcASjZn0VzvWww0cdzM8XM31b0cgQAeN1f2JK7 +h+kVAePwbruqPoX5aCJ6HtNMQ78B7gqqnHMLONR3z7cRylyq5uYlnb9BjXk3DPpT +QcWGzxApnXp8lsXlbFd7ieYUhFtUIsRcgaC/pPx2cZc0Yn0= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/rsapss/server-rsapss.pem 2024-08-03 07:30:00.000000000 +0000 @@ -9,8 +9,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = Server-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -60,29 +60,29 @@ Salt Length: 0x20 Trailer Field: 0xBC (default) - a3:9a:85:01:f5:22:c0:a3:8e:80:da:04:5e:a3:51:71:97:ba: - 77:9f:96:19:33:6d:52:9e:ff:ce:05:a3:a6:87:05:d4:24:13: - 91:1e:75:0b:af:d7:6c:0c:75:d9:63:27:a1:9b:1b:fd:f9:16: - 70:fc:a1:f7:03:ad:e4:5f:f0:52:66:f8:b2:b6:4e:39:85:c6: - d3:8f:90:7f:de:21:a2:ef:9b:64:a2:77:a7:f2:82:02:4e:da: - 93:4d:53:de:0c:26:fb:b9:87:05:8c:32:d2:96:b3:ab:58:ef: - ba:7c:f8:f6:0d:a5:82:ca:18:4e:21:77:ec:bc:9a:e6:68:e9: - bc:7d:65:27:ad:cd:4b:e1:09:8c:aa:10:76:d1:98:31:89:67: - 8f:c9:ed:78:cd:a5:33:0a:8a:b4:86:48:fe:e9:47:7a:59:fa: - 91:56:5f:9c:72:35:a8:3a:63:7b:3f:7b:9b:a0:1b:e1:c5:69: - b3:0d:90:8b:4d:eb:3f:26:63:4c:bd:10:0d:c4:63:4c:45:4e: - f7:80:f8:e7:8a:24:4b:ee:7c:88:1b:b9:6c:33:57:de:14:7a: - 48:ee:85:58:5a:94:6e:64:68:3c:b8:9f:76:da:15:0e:96:41: - 0b:e7:54:04:f6:49:ed:94:8d:fc:0d:08:e2:28:5d:e2:1a:13: - 3d:73:f6:eb + 44:ba:5d:7a:83:e4:65:ff:23:b8:4b:7c:9f:ab:2e:f7:dc:59: + 7e:6b:40:67:54:09:42:9f:41:1d:a1:7e:a8:f9:47:48:c1:00: + 63:cc:92:06:2c:3c:eb:f4:83:32:c2:2e:d1:78:f3:1e:52:60: + 32:26:8e:b3:b3:62:3d:ba:2b:8d:74:ef:01:5c:cc:1b:7c:ac: + 40:64:07:79:eb:f9:36:26:0e:e9:a8:55:5d:e5:10:87:17:0d: + 69:63:34:4b:5b:09:c8:54:dd:43:1c:1a:62:bb:ac:00:eb:3f: + a8:fe:b3:b6:e0:8b:9e:1c:a5:f4:09:8a:f0:7b:2f:da:13:92: + af:ad:c0:f0:c5:16:18:30:53:a6:5d:b9:1f:97:4b:a6:ac:4c: + 80:dc:01:28:d9:9f:45:73:bd:6c:30:d1:c7:73:33:c5:cc:df: + 56:f4:72:04:00:78:dd:5f:d8:92:bb:87:e9:15:01:e3:f0:6e: + bb:aa:3e:85:f9:68:22:7a:1e:d3:4c:43:bf:01:ee:0a:aa:9c: + 73:0b:38:d4:77:cf:b7:11:ca:5c:aa:e6:e6:25:9d:bf:41:8d: + 79:37:0c:fa:53:41:c5:86:cf:10:29:9d:7a:7c:96:c5:e5:6c: + 57:7b:89:e6:14:84:5b:54:22:c4:5c:81:a0:bf:a4:fc:76:71: + 97:34:62:7d -----BEGIN CERTIFICATE----- MIIE/zCCA7egAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBsjELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFzAVBgNVBAoMDndv bGZTU0xfUlNBUFNTMRIwEAYDVQQLDAlDQS1SU0FQU1MxGDAWBgNVBAMMD3d3dy53 b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUG -CgmSJomT8ixkAQEMB3dvbGZTU0wwHhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjEx -NzQ5WjCBtjELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcM +CgmSJomT8ixkAQEMB3dvbGZTU0wwHhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIx +OTI4WjCBtjELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcM B0JvemVtYW4xFzAVBgNVBAoMDndvbGZTU0xfUlNBUFNTMRYwFAYDVQQLDA1TZXJ2 ZXItUlNBUFNTMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMIIB @@ -97,12 +97,12 @@ GDAWgBSeDODT37ZL8xljXMpsk4aiFFORMTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB /wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATARBglghkgBhvhCAQEEBAMCBkAw PQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJ -YIZIAWUDBAIBogMCASADggEBAKOahQH1IsCjjoDaBF6jUXGXuneflhkzbVKe/84F -o6aHBdQkE5EedQuv12wMddljJ6GbG/35FnD8ofcDreRf8FJm+LK2TjmFxtOPkH/e -IaLvm2Sid6fyggJO2pNNU94MJvu5hwWMMtKWs6tY77p8+PYNpYLKGE4hd+y8muZo -6bx9ZSetzUvhCYyqEHbRmDGJZ4/J7XjNpTMKirSGSP7pR3pZ+pFWX5xyNag6Y3s/ -e5ugG+HFabMNkItN6z8mY0y9EA3EY0xFTveA+OeKJEvufIgbuWwzV94UekjuhVha -lG5kaDy4n3baFQ6WQQvnVAT2Se2UjfwNCOIoXeIaEz1z9us= +YIZIAWUDBAIBogMCASADggEBAES6XXqD5GX/I7hLfJ+rLvfcWX5rQGdUCUKfQR2h +fqj5R0jBAGPMkgYsPOv0gzLCLtF48x5SYDImjrOzYj26K4107wFczBt8rEBkB3nr ++TYmDumoVV3lEIcXDWljNEtbCchU3UMcGmK7rADrP6j+s7bgi54cpfQJivB7L9oT +kq+twPDFFhgwU6ZduR+XS6asTIDcASjZn0VzvWww0cdzM8XM31b0cgQAeN1f2JK7 +h+kVAePwbruqPoX5aCJ6HtNMQ78B7gqqnHMLONR3z7cRylyq5uYlnb9BjXk3DPpT +QcWGzxApnXp8lsXlbFd7ieYUhFtUIsRcgaC/pPx2cZc0Yn0= -----END CERTIFICATE----- Certificate: Data: @@ -115,8 +115,8 @@ Trailer Field: 0xBC (default) Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSA-PSS, OU = Root-RSA-PSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_RSAPSS, OU = CA-RSAPSS, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL Subject Public Key Info: Public Key Algorithm: rsassaPss @@ -162,28 +162,28 @@ Salt Length: 0x20 Trailer Field: 0xBC (default) - 49:a5:ef:22:47:73:30:e6:41:67:79:c9:8c:ac:58:a2:d0:bf: - ed:50:c9:e8:26:44:16:d0:64:c7:f9:f0:50:1f:8b:25:f7:ba: - 32:f0:1d:14:9f:d7:ad:2b:81:14:7d:60:ec:b3:f6:ad:0a:99: - b6:1d:eb:f2:8e:d5:bf:1b:a9:1e:3e:8b:6c:c8:c0:ee:dd:1b: - 2e:34:dd:bd:cd:14:60:2e:14:60:b8:f1:f3:bc:af:87:5a:75: - 55:72:18:2d:a3:9d:01:73:aa:52:a6:44:4e:5c:a2:b5:57:8f: - 4b:36:5e:2a:f2:c1:e2:de:88:29:24:8d:62:81:d4:6d:42:e3: - 50:e3:a9:46:fe:78:be:95:83:bd:cc:2c:9a:ad:da:4f:c1:de: - 34:01:53:21:5b:c6:ec:6f:6b:2e:fd:d4:71:c7:15:4e:26:30: - 6a:de:c7:21:22:14:ae:80:c0:00:89:72:83:89:3c:30:15:3b: - 68:67:97:b0:93:7b:7a:95:54:1d:45:8e:ae:d2:97:0c:f9:32: - 3b:61:2d:9e:b2:b0:2e:4f:d5:cc:ab:05:5d:ce:14:8a:fe:7b: - e4:59:33:fe:e0:42:d9:a6:99:f8:f2:7f:98:fa:09:dc:d5:ab: - 2b:7b:08:c2:24:4c:59:49:e0:9e:23:85:d8:32:c7:5b:d4:01: - d2:20:c5:9c + 6c:79:0e:40:30:74:f6:02:08:61:df:c0:89:25:10:30:ea:e4: + e9:14:c8:c6:47:01:55:a4:f2:ed:ee:3f:55:da:62:39:04:cb: + 3d:a1:78:56:76:30:fd:14:ea:b3:d8:21:99:c6:ca:ed:9f:18: + 7d:15:4d:d2:cf:db:c3:a1:b4:56:0d:04:b1:72:9c:68:81:1f: + 01:02:b8:8f:d6:d8:ed:47:3a:72:f2:e0:a5:9b:7b:50:75:00: + a4:ab:23:62:48:1f:bc:f4:50:86:ef:06:b3:f8:8b:6e:e0:39: + d1:8c:3b:8f:1f:ef:c5:ff:8c:2d:b2:1b:5d:82:32:b1:81:92: + 02:7c:c9:ad:16:86:63:6c:95:41:ed:80:70:96:41:13:11:03: + 9a:c1:41:d4:ca:e0:fd:7f:2d:d9:5b:60:d6:42:fe:aa:ac:73: + 4e:6d:26:67:03:ec:53:e9:97:2f:73:3a:f5:c4:ba:cf:dc:db: + 6c:f0:79:80:b1:52:f4:bf:12:c9:a7:ce:b1:2f:8d:6a:6a:a8: + 9e:27:e9:d1:55:26:6b:20:8c:1f:90:57:6d:5e:dc:9e:ca:4c: + 76:fc:35:76:dc:5a:06:90:50:88:7e:ad:9f:58:e3:39:10:e3: + 64:19:9f:ea:fb:86:04:84:79:d6:20:ac:c8:45:8b:03:8c:eb: + b6:d4:e7:e4 -----BEGIN CERTIFICATE----- MIIEvzCCA3egAwIBAgIBATA9BgkqhkiG9w0BAQowMKANMAsGCWCGSAFlAwQCAaEa MBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIDCBnTELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xGDAWBgNVBAoMD3dv bGZTU0xfUlNBLVBTUzEVMBMGA1UECwwMUm9vdC1SU0EtUFNTMRgwFgYDVQQDDA93 d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w -HhcNMjIxMjE2MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBsjELMAkGA1UEBhMCVVMx +HhcNMjMxMjEzMjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBsjELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFzAVBgNVBAoMDndv bGZTU0xfUlNBUFNTMRIwEAYDVQQLDAlDQS1SU0FQU1MxGDAWBgNVBAMMD3d3dy53 b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUG @@ -198,10 +198,10 @@ 8xljXMpsk4aiFFORMTAfBgNVHSMEGDAWgBRk1eyCh4DeWu1JmNgMVH1GnqU81jAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjA9BgkqhkiG9w0BAQowMKAN MAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIAOC -AQEASaXvIkdzMOZBZ3nJjKxYotC/7VDJ6CZEFtBkx/nwUB+LJfe6MvAdFJ/XrSuB -FH1g7LP2rQqZth3r8o7VvxupHj6LbMjA7t0bLjTdvc0UYC4UYLjx87yvh1p1VXIY -LaOdAXOqUqZETlyitVePSzZeKvLB4t6IKSSNYoHUbULjUOOpRv54vpWDvcwsmq3a -T8HeNAFTIVvG7G9rLv3UcccVTiYwat7HISIUroDAAIlyg4k8MBU7aGeXsJN7epVU -HUWOrtKXDPkyO2EtnrKwLk/VzKsFXc4Uiv575Fkz/uBC2aaZ+PJ/mPoJ3NWrK3sI -wiRMWUngniOF2DLHW9QB0iDFnA== +AQEAbHkOQDB09gIIYd/AiSUQMOrk6RTIxkcBVaTy7e4/VdpiOQTLPaF4VnYw/RTq +s9ghmcbK7Z8YfRVN0s/bw6G0Vg0EsXKcaIEfAQK4j9bY7Uc6cvLgpZt7UHUApKsj +YkgfvPRQhu8Gs/iLbuA50Yw7jx/vxf+MLbIbXYIysYGSAnzJrRaGY2yVQe2AcJZB +ExEDmsFB1Mrg/X8t2Vtg1kL+qqxzTm0mZwPsU+mXL3M69cS6z9zbbPB5gLFS9L8S +yafOsS+Namqonifp0VUmayCMH5BXbV7cnspMdvw1dtxaBpBQiH6tn1jjORDjZBmf +6vuGBIR51iCsyEWLA4zrttTn5A== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-cert-chain.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-cert-chain.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = Support, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,7 +37,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -46,27 +46,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - b9:10:f0:be:fe:c8:67:5e:7d:0f:36:33:c7:17:2a:01:c4:bb: - 74:83:4c:bc:bb:e2:ba:92:82:3a:d9:2d:8c:0e:e3:75:1b:c0: - 14:aa:40:1e:a8:11:7d:94:9c:3d:74:7a:3b:16:7b:d8:9d:f0: - e8:7d:1d:fa:3b:14:42:20:e3:05:a3:fd:b1:0c:f1:2a:c4:00: - 50:8d:1e:97:93:6a:de:82:13:24:9e:2b:fa:08:85:e3:4f:40: - fd:63:c7:3d:e9:bd:6f:7c:03:98:85:fe:b4:51:5d:7f:8c:83: - b3:ad:4a:88:e9:f3:4c:33:84:77:d3:02:35:59:e3:4e:64:a1: - b7:bb:fb:f8:fb:14:2a:ae:36:bf:d9:82:e7:cb:98:48:16:c8: - 81:d6:a0:f1:74:14:e3:74:4a:72:4a:f1:6f:dd:be:86:1e:20: - f3:05:16:83:1f:aa:7c:59:35:97:24:b8:27:b7:56:9f:30:2e: - 90:e0:19:e0:21:ca:9d:3f:da:99:07:94:79:49:53:14:5c:a2: - 2c:56:5b:b2:55:68:5c:1f:91:58:9a:cd:53:b5:ea:63:5a:72: - 49:41:cc:76:9f:88:35:86:0d:60:5d:e5:91:bd:ac:6f:cf:d5: - 92:27:72:4a:21:f4:58:98:8e:3b:d2:29:e6:ee:fa:e6:b0:6c: - 8b:1e:e0:54 + 4a:ff:b9:e5:85:9b:da:53:66:7f:07:22:bf:b6:19:ea:42:eb: + a4:11:07:62:ff:39:5f:33:37:3a:87:26:71:3d:13:b2:ca:b8: + 64:38:7b:8a:99:48:0e:a5:a4:6b:b1:99:6e:e0:46:51:bd:19: + 52:ad:bc:a6:7e:2a:7a:7c:23:a7:cc:db:5e:43:7d:6b:04:c8: + b7:dd:95:ad:f0:91:80:59:c5:19:91:26:27:91:b8:48:1c:eb: + 55:b6:aa:7d:a4:38:f1:03:bc:6c:8b:aa:94:d6:3c:05:7a:96: + c5:06:f1:26:14:2e:75:fb:dd:e5:35:b3:01:2c:b3:ad:62:5a: + 21:9a:08:be:56:fc:f9:a2:42:87:86:e5:a9:c5:99:cf:ae:14: + be:e0:b9:08:24:0d:1d:5c:d6:14:e1:4c:9f:40:b3:a9:e9:2d: + 52:8b:4c:bf:ac:44:31:67:c1:8d:06:85:ec:0f:e4:99:d7:4b: + 7b:21:06:66:d4:e4:f5:9d:ff:8e:f0:86:39:58:1d:a4:5b:e2: + 63:ef:7c:c9:18:87:a8:02:25:10:3e:87:28:f9:f5:ef:47:9e: + a5:80:08:11:90:68:fe:d1:a3:a8:51:b9:37:ff:d5:ca:7c:87: + 7f:6b:bc:2c:12:c8:c5:85:8b:fc:0c:c6:b9:86:b8:c9:04:c3: + 51:37:d2:4f -----BEGIN CERTIFICATE----- MIIE6DCCA9CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP @@ -80,26 +80,26 @@ M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG -9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFCyAzttHnQdmkj1o18qskE/KaUFLMAwG +9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFDNEGqhsAez2YPJwUQpM0RT6vOlEMAwG A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0l -BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQC5EPC+ -/shnXn0PNjPHFyoBxLt0g0y8u+K6koI62S2MDuN1G8AUqkAeqBF9lJw9dHo7FnvY -nfDofR36OxRCIOMFo/2xDPEqxABQjR6Xk2reghMkniv6CIXjT0D9Y8c96b1vfAOY -hf60UV1/jIOzrUqI6fNMM4R30wI1WeNOZKG3u/v4+xQqrja/2YLny5hIFsiB1qDx -dBTjdEpySvFv3b6GHiDzBRaDH6p8WTWXJLgnt1afMC6Q4BngIcqdP9qZB5R5SVMU -XKIsVluyVWhcH5FYms1TtepjWnJJQcx2n4g1hg1gXeWRvaxvz9WSJ3JKIfRYmI47 -0inm7vrmsGyLHuBU +BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQBK/7nl +hZvaU2Z/ByK/thnqQuukEQdi/zlfMzc6hyZxPROyyrhkOHuKmUgOpaRrsZlu4EZR +vRlSrbymfip6fCOnzNteQ31rBMi33ZWt8JGAWcUZkSYnkbhIHOtVtqp9pDjxA7xs +i6qU1jwFepbFBvEmFC51+93lNbMBLLOtYlohmgi+Vvz5okKHhuWpxZnPrhS+4LkI +JA0dXNYU4UyfQLOp6S1Si0y/rEQxZ8GNBoXsD+SZ10t7IQZm1OT1nf+O8IY5WB2k +W+Jj73zJGIeoAiUQPoco+fXvR56lgAgRkGj+0aOoUbk3/9XKfId/a7wsEsjFhYv8 +DMa5hrjJBMNRN9JP -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: - 2c:80:ce:db:47:9d:07:66:92:3d:68:d7:ca:ac:90:4f:ca:69:41:4b + 33:44:1a:a8:6c:01:ec:f6:60:f2:70:51:0a:4c:d1:14:fa:bc:e9:44 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -130,7 +130,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -139,27 +139,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - ae:b0:a4:35:8e:8a:1b:a6:eb:b3:a2:57:cf:3a:1f:dc:6e:bc: - d2:d0:a6:4a:8f:88:0a:6e:74:d5:d1:7c:d1:44:b1:d4:3b:17: - 03:09:5a:46:ed:08:08:cf:f1:fd:20:07:67:c0:97:ec:35:f3: - 75:ca:20:61:98:3e:f5:4d:be:e6:9d:75:1e:e4:03:ad:8c:a6: - 1e:3d:ec:e4:1a:92:5b:f9:a3:ad:83:ca:4f:cd:aa:38:bb:6e: - ae:ad:fa:a7:46:f1:8b:73:ec:09:23:bc:f2:18:e5:b7:92:86: - 3e:a4:75:60:c7:3d:0f:3f:83:00:c3:06:08:9c:d1:54:d6:ba: - 6d:95:3d:34:a1:be:24:91:cc:20:03:11:5b:72:1c:d4:65:d0: - 11:88:75:26:04:26:ef:66:70:e6:3b:38:87:9c:53:71:1b:09: - 51:70:50:99:4c:31:0c:62:44:57:30:60:04:fc:12:2c:a3:24: - b4:f7:11:d5:0e:b5:21:0b:ed:86:11:67:4d:36:fa:57:a0:59: - 55:21:b3:6d:e4:77:5e:ec:7e:f0:09:13:8e:99:98:b2:e1:82: - b6:4b:3e:0f:41:a6:0c:cd:49:99:7e:e4:8a:cb:37:ed:53:cf: - 86:5d:a9:26:a8:e5:01:25:5a:b4:bc:25:35:f1:fa:5a:5c:ce: - d4:b8:9a:2c + 2d:fc:f9:32:5a:be:d6:9d:42:8b:86:4e:67:22:c3:50:2d:cb: + 14:27:1d:94:f3:cd:88:42:da:41:1c:39:24:67:a7:92:4d:27: + ea:56:82:19:bf:11:b2:43:a4:8d:5d:87:b2:27:64:66:82:81: + df:c4:fd:5b:62:b0:c2:4d:9d:29:f2:41:32:cc:2e:b5:da:38: + 06:1b:e8:7f:8c:6e:3d:80:1e:00:56:49:bf:39:e0:da:68:2f: + c4:fd:00:e6:d1:81:1a:d1:4a:bb:76:52:ce:4d:24:9d:c4:a3: + a7:f1:65:14:2f:1f:a8:2d:c6:cb:ce:b1:a7:89:74:26:27:c3: + f3:a3:84:4c:34:01:14:03:7d:16:3a:c8:8b:25:2e:7b:90:cc: + 46:b1:52:34:ba:93:6e:ef:fe:43:a3:ad:c6:6f:51:fb:ba:ea: + 38:e3:6f:d6:ee:63:62:36:ea:5e:08:b4:e2:2a:46:89:e3:ae: + b3:b4:06:ef:63:7a:6e:5d:dd:c9:ec:02:4f:f7:64:c0:27:07: + b4:6f:4a:18:72:5b:34:74:7c:d0:a9:04:8f:40:8b:6a:39:d2: + 6b:1a:01:f2:01:a8:81:34:3a:e5:b0:55:d1:3c:95:ca:b0:82: + d6:ed:98:28:15:59:7e:95:a7:69:c7:b5:7b:ec:01:a7:4d:e6: + b9:a2:fe:35 -----BEGIN CERTIFICATE----- -MIIE/zCCA+egAwIBAgIULIDO20edB2aSPWjXyqyQT8ppQUswDQYJKoZIhvcNAQEL +MIIE/zCCA+egAwIBAgIUM0QaqGwB7PZg8nBRCkzRFPq86UQwDQYJKoZIhvcNAQEL BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZQxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZQxCzAJ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -174,12 +174,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU -LIDO20edB2aSPWjXyqyQT8ppQUswDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +M0QaqGwB7PZg8nBRCkzRFPq86UQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DQYJKoZIhvcNAQELBQADggEBAK6wpDWOihum67OiV886H9xuvNLQpkqPiApudNXR -fNFEsdQ7FwMJWkbtCAjP8f0gB2fAl+w183XKIGGYPvVNvuaddR7kA62Mph497OQa -klv5o62Dyk/Nqji7bq6t+qdG8Ytz7AkjvPIY5beShj6kdWDHPQ8/gwDDBgic0VTW -um2VPTShviSRzCADEVtyHNRl0BGIdSYEJu9mcOY7OIecU3EbCVFwUJlMMQxiRFcw -YAT8EiyjJLT3EdUOtSEL7YYRZ002+legWVUhs23kd17sfvAJE46ZmLLhgrZLPg9B -pgzNSZl+5IrLN+1Tz4ZdqSao5QElWrS8JTXx+lpcztS4miw= +DQYJKoZIhvcNAQELBQADggEBAC38+TJavtadQouGTmciw1AtyxQnHZTzzYhC2kEc +OSRnp5JNJ+pWghm/EbJDpI1dh7InZGaCgd/E/VtisMJNnSnyQTLMLrXaOAYb6H+M +bj2AHgBWSb854NpoL8T9AObRgRrRSrt2Us5NJJ3Eo6fxZRQvH6gtxsvOsaeJdCYn +w/OjhEw0ARQDfRY6yIslLnuQzEaxUjS6k27v/kOjrcZvUfu66jjjb9buY2I26l4I +tOIqRonjrrO0Bu9jem5d3cnsAk/3ZMAnB7RvShhyWzR0fNCpBI9Ai2o50msaAfIB +qIE0OuWwVdE8lcqwgtbtmCgVWX6Vp2nHtXvsAadN5rmi/jU= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-comp.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-comp.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-comp.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-comp.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-comp.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-comp.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 04:d0:ee:f8:6f:67:42:a9:6f:3f:d2:7d:6e:7b:ce:29:ce:14:d2:1b + 21:d7:53:80:24:5c:eb:bf:c0:a4:40:f4:42:19:3b:83:fd:58:c5:a6 Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Montana, L = Bozeman, O = Elliptic - comp, OU = Server ECC-comp, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Elliptic - comp, OU = Server ECC-comp, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -24,7 +24,7 @@ X509v3 Authority Key Identifier: keyid:8C:38:3A:6B:B8:24:B7:DF:6E:F4:59:AC:56:4E:AA:E2:58:A6:5A:18 DirName:/C=US/ST=Montana/L=Bozeman/O=Elliptic - comp/OU=Server ECC-comp/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:04:D0:EE:F8:6F:67:42:A9:6F:3F:D2:7D:6E:7B:CE:29:CE:14:D2:1B + serial:21:D7:53:80:24:5C:EB:BF:C0:A4:40:F4:42:19:3B:83:FD:58:C5:A6 X509v3 Basic Constraints: CA:TRUE @@ -33,17 +33,17 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:21:00:8d:97:8f:d4:70:bf:10:7a:3f:f4:35:bb:8e: - 6d:39:5b:a1:02:ee:32:da:02:91:57:02:0b:43:08:3e:61:da: - f1:02:20:73:55:17:84:06:34:0e:9b:cd:55:c4:6d:3b:26:a3: - ed:3a:8b:ba:22:e3:dc:35:fb:8c:0f:b7:ba:6c:63:9d:e1 + 30:45:02:20:57:1a:59:bc:c9:45:0a:46:e6:16:da:17:ce:c3: + 0a:57:57:f2:3d:15:cd:ca:1b:a7:a8:39:2e:9d:09:f3:3e:a0: + 02:21:00:de:a3:3a:4d:88:38:2b:3a:84:de:2f:0a:81:14:57: + 7f:7f:2e:d6:a5:4d:61:10:69:b9:a2:c6:51:cd:80:4a:63 -----BEGIN CERTIFICATE----- -MIIDdzCCAx2gAwIBAgIUBNDu+G9nQqlvP9J9bnvOKc4U0hswCgYIKoZIzj0EAwIw +MIIDdzCCAx2gAwIBAgIUIddTgCRc67/ApED0Qhk7g/1YxaYwCgYIKoZIzj0EAwIw gaAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl bWFuMRgwFgYDVQQKDA9FbGxpcHRpYyAtIGNvbXAxGDAWBgNVBAsMD1NlcnZlciBF Q0MtY29tcDEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkB -FhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0 -OVowgaAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC +FhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTky +OFowgaAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRgwFgYDVQQKDA9FbGxpcHRpYyAtIGNvbXAxGDAWBgNVBAsMD1NlcnZl ciBFQ0MtY29tcDEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcN AQkBFhBpbmZvQHdvbGZzc2wuY29tMDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgAC @@ -52,9 +52,9 @@ 9FmsVk6q4limWhihgaakgaMwgaAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250 YW5hMRAwDgYDVQQHDAdCb3plbWFuMRgwFgYDVQQKDA9FbGxpcHRpYyAtIGNvbXAx GDAWBgNVBAsMD1NlcnZlciBFQ0MtY29tcDEYMBYGA1UEAwwPd3d3LndvbGZzc2wu -Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQE0O74b2dCqW8/ -0n1ue84pzhTSGzAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUuY29t +Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQh11OAJFzrv8Ck +QPRCGTuD/VjFpjAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUuY29t hwR/AAABMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAKBggqhkjOPQQD -AgNIADBFAiEAjZeP1HC/EHo/9DW7jm05W6EC7jLaApFXAgtDCD5h2vECIHNVF4QG -NA6bzVXEbTsmo+06i7oi49w1+4wPt7psY53h +AgNIADBFAiBXGlm8yUUKRuYW2hfOwwpXV/I9Fc3KG6eoOS6dCfM+oAIhAN6jOk2I +OCs6hN4vCoEUV39/LtalTWEQabmixlHNgEpj -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-rsa.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-rsa.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-rsa.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-rsa.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-rsa.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-rsa.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Elliptic - RSAsig, OU = ECC-RSAsig, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -25,7 +25,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -34,27 +34,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - 44:da:4d:a2:d3:96:51:31:35:74:21:d5:27:0d:ab:72:eb:d8: - 24:11:3c:52:07:01:51:e8:26:11:39:da:ac:57:ca:e3:8d:8c: - 91:16:28:e3:7b:fe:58:76:0a:3e:9d:ac:f3:ce:9f:5a:ff:07: - c9:a1:27:9a:9a:5c:db:82:ba:0e:d0:80:bc:cf:b1:34:6a:26: - af:15:7a:21:f6:a9:48:3c:c6:02:d0:4e:32:ac:75:17:60:19: - 45:12:37:5d:75:65:84:ca:e8:40:73:f5:1c:71:82:ae:e2:3a: - 1c:d7:4c:59:f2:83:16:1f:77:02:91:cc:9c:aa:c9:e7:72:6b: - ff:40:7e:da:35:65:47:bd:55:90:c8:c8:21:b2:fb:89:d4:d4: - cc:39:02:54:20:83:17:46:eb:5f:60:58:35:4e:ca:24:8d:0b: - 77:10:b0:4a:2a:51:a9:d0:74:27:35:61:76:0f:94:2c:0b:10: - 1d:b8:4a:3e:38:95:17:0a:0a:7e:c6:35:c3:68:89:c0:82:8b: - 61:b8:e6:2f:f9:c8:58:96:c7:1f:eb:1d:2f:09:34:5f:bf:76: - af:00:6c:33:80:10:5b:a0:d2:76:6f:e2:4c:96:b6:2d:dc:c0: - 21:43:6e:f3:58:2a:4b:a6:ef:15:b5:ca:00:28:1a:c6:e0:31: - f0:5d:99:70 + 16:b7:d3:9c:7c:6e:d2:b7:79:aa:5a:16:0b:1e:da:d0:f7:df: + 64:c9:3c:b8:41:24:4b:1b:c2:83:5e:df:de:a8:8a:7c:eb:07: + 75:20:f6:f3:4c:bd:3f:2e:f0:f0:da:4b:c5:d2:c4:f8:db:34: + 75:e2:32:b4:34:92:8a:7f:d7:84:ea:df:99:ca:64:e6:7c:68: + 05:1c:75:de:3f:06:65:5d:fc:29:c9:73:0f:4a:ad:fd:bc:0d: + 91:37:67:63:55:65:93:99:56:84:25:1b:f1:50:03:31:2d:48: + ad:a3:38:91:29:88:b8:72:08:4c:11:36:35:20:13:78:98:d8: + 84:30:c5:7b:70:24:45:8c:e1:55:80:06:5f:19:57:89:58:1c: + 2a:40:fb:f3:a6:bf:ea:41:7a:79:2c:ab:fe:b6:16:5d:d5:fa: + 32:50:9d:89:f2:cc:87:7a:57:cf:4d:38:c4:d5:33:9a:4d:83: + c9:00:b8:36:66:14:76:20:c1:7a:c7:f7:0a:94:69:ce:0a:0f: + 81:04:12:5f:71:d0:d1:ff:08:d0:89:6f:ac:45:d3:06:23:a0: + 76:88:ad:5d:9a:7a:8c:1f:61:d4:d8:21:1d:8e:05:89:d1:d4: + d6:86:5b:4b:43:e6:03:4a:10:48:f4:1b:9d:3b:76:d8:2c:ad: + fa:33:a5:70 -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBnTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBnTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xGjAYBgNVBAoMEUVsbGlwdGljIC0g UlNBc2lnMRMwEQYDVQQLDApFQ0MtUlNBc2lnMRgwFgYDVQQDDA93d3cud29sZnNz bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wWTATBgcqhkjO @@ -64,13 +64,13 @@ P+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9u dGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwIU2F3dG9vdGgxEzARBgNV BAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG -SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20edB2aSPWjXyqyQT8ppQUsw +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB7PZg8nBRCkzRFPq86UQw DAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtleGFtcGxlLmNvbYcEfwAAATAdBgNV -HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAETa -TaLTllExNXQh1ScNq3Lr2CQRPFIHAVHoJhE52qxXyuONjJEWKON7/lh2Cj6drPPO -n1r/B8mhJ5qaXNuCug7QgLzPsTRqJq8VeiH2qUg8xgLQTjKsdRdgGUUSN111ZYTK -6EBz9Rxxgq7iOhzXTFnygxYfdwKRzJyqyedya/9Afto1ZUe9VZDIyCGy+4nU1Mw5 -AlQggxdG619gWDVOyiSNC3cQsEoqUanQdCc1YXYPlCwLEB24Sj44lRcKCn7GNcNo -icCCi2G45i/5yFiWxx/rHS8JNF+/dq8AbDOAEFug0nZv4kyWti3cwCFDbvNYKkum -7xW1ygAoGsbgMfBdmXA= +HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBABa3 +05x8btK3eapaFgse2tD332TJPLhBJEsbwoNe396oinzrB3Ug9vNMvT8u8PDaS8XS +xPjbNHXiMrQ0kop/14Tq35nKZOZ8aAUcdd4/BmVd/CnJcw9Krf28DZE3Z2NVZZOZ +VoQlG/FQAzEtSK2jOJEpiLhyCEwRNjUgE3iY2IQwxXtwJEWM4VWABl8ZV4lYHCpA ++/Omv+pBenksq/62Fl3V+jJQnYnyzId6V89NOMTVM5pNg8kAuDZmFHYgwXrH9wqU +ac4KD4EEEl9x0NH/CNCJb6xF0wYjoHaIrV2aeowfYdTYIR2OBYnR1NaGW0tD5gNK +EEj0G507dtgsrfozpXA= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-self.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-self.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-self.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-self.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc-self.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc-self.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,13 +2,13 @@ Data: Version: 3 (0x2) Serial Number: - 2d:70:a6:06:58:4b:2c:a4:38:f2:94:39:94:46:70:99:ca:bf:25:89 + 7e:ce:94:a4:69:82:50:e3:fe:e1:ca:d8:ff:0e:5f:8f:c9:b5:2b:5c Signature Algorithm: ecdsa-with-SHA256 - Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Issuer: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Dec 13 21:17:49 2032 GMT - Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Not Before: Dec 13 22:19:27 2023 GMT + Not After : Dec 10 22:19:27 2033 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) @@ -29,35 +29,36 @@ 5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30 X509v3 Authority Key Identifier: keyid:5D:5D:26:EF:AC:7E:36:F9:9B:76:15:2B:4A:25:02:23:EF:B2:89:30 - DirName:/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2D:70:A6:06:58:4B:2C:A4:38:F2:94:39:94:46:70:99:CA:BF:25:89 + DirName:/C=US/ST=Washington/L=Seattle/O=Elliptic/OU=ECC/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:7E:CE:94:A4:69:82:50:E3:FE:E1:CA:D8:FF:0E:5F:8F:C9:B5:2B:5C X509v3 Key Usage: critical Digital Signature, Key Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication Signature Algorithm: ecdsa-with-SHA256 - 30:44:02:20:3f:7e:67:7c:2a:52:f3:12:eb:3c:f3:3d:cb:d0: - 08:e0:9f:21:10:b7:1c:e6:c9:53:a9:04:65:38:76:cb:8d:ff: - 02:20:09:ac:bd:98:ac:8f:58:ad:2c:51:8d:cd:bf:56:77:23: - ac:b0:37:90:fb:8e:84:5a:a2:06:21:9d:4c:50:39:c3 + 30:46:02:21:00:b1:ef:00:eb:7b:d1:e0:a8:95:1c:80:c8:11: + e3:66:46:fb:ff:f8:55:2f:45:20:98:72:b1:5b:e4:b6:3b:ce: + 35:02:21:00:d7:b3:b6:bb:fd:41:86:04:a1:61:bd:2b:1c:5f: + a0:3d:52:51:97:e3:90:d0:5e:a6:c8:09:23:ae:3d:5c:2a:3c -----BEGIN CERTIFICATE----- -MIIDWzCCAwKgAwIBAgIULXCmBlhLLKQ48pQ5lEZwmcq/JYkwCgYIKoZIzj0EAwIw -gY8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT -ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMM -D3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNv -bTAeFw0yMjEyMTYyMTE3NDlaFw0zMjEyMTMyMTE3NDlaMIGPMQswCQYDVQQGEwJV -UzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4GA1UE -CgwHRWxpcHRpYzEMMAoGA1UECwwDRUNDMRgwFgYDVQQDDA93d3cud29sZnNzbC5j -b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wWTATBgcqhkjOPQIB -BggqhkjOPQMBBwNCAAS7M6xMJ1BKxkqlBMM83p8223ItzpTqK/rLIAk5LBboYQLp -r03TApOaMVuXkiF/8M8Y2pERAjSG6CBYMwuANInYo4IBODCCATQwCQYDVR0TBAIw -ADARBglghkgBhvhCAQEEBAMCBkAwHQYDVR0OBBYEFF1dJu+sfjb5m3YVK0olAiPv -sokwMIHPBgNVHSMEgccwgcSAFF1dJu+sfjb5m3YVK0olAiPvsokwoYGVpIGSMIGP -MQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2Vh -dHRsZTEQMA4GA1UECgwHRWxpcHRpYzEMMAoGA1UECwwDRUNDMRgwFgYDVQQDDA93 -d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22C -FC1wpgZYSyykOPKUOZRGcJnKvyWJMA4GA1UdDwEB/wQEAwIDqDATBgNVHSUEDDAK -BggrBgEFBQcDATAKBggqhkjOPQQDAgNHADBEAiA/fmd8KlLzEus88z3L0AjgnyEQ -txzmyVOpBGU4dsuN/wIgCay9mKyPWK0sUY3Nv1Z3I6ywN5D7joRaogYhnUxQOcM= +MIIDYDCCAwWgAwIBAgIUfs6UpGmCUOP+4crY/w5fj8m1K1wwCgYIKoZIzj0EAwIw +gZAxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMREwDwYDVQQKDAhFbGxpcHRpYzEMMAoGA1UECwwDRUNDMRgwFgYDVQQD +DA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j +b20wHhcNMjMxMjEzMjIxOTI3WhcNMzMxMjEwMjIxOTI3WjCBkDELMAkGA1UEBhMC +VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNV +BAoMCEVsbGlwdGljMQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3Ns +LmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49 +AgEGCCqGSM49AwEHA0IABLszrEwnUErGSqUEwzzenzbbci3OlOor+ssgCTksFuhh +AumvTdMCk5oxW5eSIX/wzxjakRECNIboIFgzC4A0idijggE5MIIBNTAJBgNVHRME +AjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNVHQ4EFgQUXV0m76x+NvmbdhUrSiUC +I++yiTAwgdAGA1UdIwSByDCBxYAUXV0m76x+NvmbdhUrSiUCI++yiTChgZakgZMw +gZAxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMREwDwYDVQQKDAhFbGxpcHRpYzEMMAoGA1UECwwDRUNDMRgwFgYDVQQD +DA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j +b22CFH7OlKRpglDj/uHK2P8OX4/JtStcMA4GA1UdDwEB/wQEAwIDqDATBgNVHSUE +DDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgNJADBGAiEAse8A63vR4KiVHIDIEeNm +Rvv/+FUvRSCYcrFb5LY7zjUCIQDXs7a7/UGGBKFhvSscX6A9UlGX45DQXqbICSOu +PVwqPA== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,9 +5,9 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT - Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) @@ -34,24 +34,24 @@ Netscape Cert Type: SSL Server Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:21:00:cf:3a:17:97:d4:be:7c:50:e1:be:1b:53:95: - 7b:a3:b8:c6:73:c4:34:e0:73:5a:db:3e:cb:3a:b6:a8:f1:cd: - bf:02:20:2b:e6:f9:65:b2:ab:0f:bb:2b:36:5c:cc:2e:19:a9: - 59:1c:6f:6f:ce:9b:7a:e6:5b:65:31:33:80:05:cb:7c:96 + 30:45:02:21:00:86:bd:87:16:d2:9c:66:e7:5e:5c:28:0e:5f: + ef:94:61:2f:d4:21:6d:8e:c3:94:0a:1e:b5:6a:1d:c6:04:87: + c6:02:20:66:46:c4:29:d9:8e:eb:0b:f7:5b:32:13:eb:0a:ea: + 47:99:4b:74:56:ba:21:97:b1:67:75:5c:f3:f3:c0:88:aa -----BEGIN CERTIFICATE----- -MIICoTCCAkegAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR +MIICojCCAkigAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM -Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0aWMx -DDAKBgNVBAsMA0VDQzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI -hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD -QgAEuzOsTCdQSsZKpQTDPN6fNttyLc6U6iv6yyAJOSwW6GEC6a9N0wKTmjFbl5Ih -f/DPGNqREQI0huggWDMLgDSJ2KOBiTCBhjAdBgNVHQ4EFgQUXV0m76x+NvmbdhUr -SiUCI++yiTAwHwYDVR0jBBgwFoAUVo6aw/BC3hi5RVVu+ZPP6sPzpSEwDAYDVR0T -AQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwEQYJ -YIZIAYb4QgEBBAQDAgZAMAoGCCqGSM49BAMCA0gAMEUCIQDPOheX1L58UOG+G1OV -e6O4xnPENOBzWts+yzq2qPHNvwIgK+b5ZbKrD7srNlzMLhmpWRxvb86beuZbZTEz -gAXLfJY= +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBkDELMAkGA1UEBhMCVVMxEzARBgNVBAgM +Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlwdGlj +MQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH +A0IABLszrEwnUErGSqUEwzzenzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eS +IX/wzxjakRECNIboIFgzC4A0idijgYkwgYYwHQYDVR0OBBYEFF1dJu+sfjb5m3YV +K0olAiPvsokwMB8GA1UdIwQYMBaAFFaOmsPwQt4YuUVVbvmTz+rD86UhMAwGA1Ud +EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUFBwMBMBEG +CWCGSAGG+EIBAQQEAwIGQDAKBggqhkjOPQQDAgNIADBFAiEAhr2HFtKcZudeXCgO +X++UYS/UIW2Ow5QKHrVqHcYEh8YCIGZGxCnZjusL91syE+sK6keZS3RWuiGXsWd1 +XPPzwIiq -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc384-cert.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc384-cert.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc384-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc384-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-ecc384-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-ecc384-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,22 +1,22 @@ -----BEGIN CERTIFICATE----- -MIIDnzCCAyWgAwIBAgICEAEwCgYIKoZIzj0EAwMwgZcxCzAJBgNVBAYTAlVTMRMw +MIIDnzCCAyagAwIBAgICEAEwCgYIKoZIzj0EAwMwgZcxCzAJBgNVBAYTAlVTMRMw EQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAd3 b2xmU1NMMRQwEgYDVQQLDAtEZXZlbG9wbWVudDEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMCAXDTIyMTIx -NjIxMTc0OVoYDzIwNTIxMjA4MjExNzQ5WjCBlTELMAkGA1UEBhMCVVMxEzARBgNV -BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0 -aWMxEjAQBgNVBAsMCUVDQzM4NFNydjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE6s+TTywJuzkUD1Zkw0C03w5jruVxSwDMBJf/4ek4lrtfkbJqzLU5 -X49wWfEB9lorAWxoC89VJa9tmEgKqHTJqRegDMP70yNo/gQ8Y1CIO7lPfGc09zup -c+cbw1FeIhjso4IBQDCCATwwCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBkAw -HQYDVR0OBBYEFII78mUv87QAxrwG/XlCdUtl0c68MIHXBgNVHSMEgc8wgcyAFKvg -wyZMGNRyu9KEjJwKBZKAElNSoYGdpIGaMIGXMQswCQYDVQQGEwJVUzETMBEGA1UE -CAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4GA1UECgwHd29sZlNT -TDEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNv -bTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUYnDODA5oOu/2nBqW -Ozpy/5ngviUwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUFBwMBMAoG -CCqGSM49BAMDA2gAMGUCMQCypGLmlyMf62PmMwlYdqMWVEcPdKsHkKBh7uNpXZCC -Ww3dN8jZXeLRqv5hxWHrLKYCMDQ45DuZ+uBhyv3fK+Dsk7Hshp7DN07yHZ4+9rQA -jnHz/v78cK/NDpYULc0ilNGYJg== +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMCAXDTIzMTIx +MzIyMTkyN1oYDzIwNTMxMjA1MjIxOTI3WjCBljELMAkGA1UEBhMCVVMxEzARBgNV +BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlw +dGljMRIwEAYDVQQLDAlFQ0MzODRTcnYxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNv +bTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTB2MBAGByqGSM49AgEG +BSuBBAAiA2IABOrPk08sCbs5FA9WZMNAtN8OY67lcUsAzASX/+HpOJa7X5Gyasy1 +OV+PcFnxAfZaKwFsaAvPVSWvbZhICqh0yakXoAzD+9MjaP4EPGNQiDu5T3xnNPc7 +qXPnG8NRXiIY7KOCAUAwggE8MAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgZA +MB0GA1UdDgQWBBSCO/JlL/O0AMa8Bv15QnVLZdHOvDCB1wYDVR0jBIHPMIHMgBSr +4MMmTBjUcrvShIycCgWSgBJTUqGBnaSBmjCBlzELMAkGA1UEBhMCVVMxEzARBgNV +BAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dvbGZT +U0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNzbC5j +b20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFEXB9YZPVPLQmp3y +n1IKRmavozXTMA4GA1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATAK +BggqhkjOPQQDAwNnADBkAjA4AvK6JvDpyPBqda/IkyzM90qQIHKbomr7ayhuAG0k +VENqh4nn4BED4EjmgEZ8FjoCMF4UuUIDJtYCMA8lqknSfpfxmWdSfbKw7eaM/ivj +z5PuNjtIU2GSWQ1njRNDyi+keg== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-keyPub.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-keyPub.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-keyPub.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-keyPub.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-keyPub.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-keyPub.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,4 @@ ------BEGIN RSA PUBLIC KEY----- +-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI4VdB8nFtt9JFQScB ZcZFrvK8JDC4lc4vTtb2HIi8fJ/7qGd//lycUXX3isoH5zUvj+G9e8AvfKtkqBf8 yl17uuAh5XIuby6G2JVz2qwbU7lfP9cZDSVP4WNjUYsLZD+tQ7ilHFw0s64AoGPF @@ -6,4 +6,4 @@ UQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDBY3gPRDcwMpaAMiOV oXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE4eZhg8XSlt/Z0E+t 1wIDAQAB ------END RSA PUBLIC KEY----- +-----END PUBLIC KEY----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-revoked-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-revoked-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/server-revoked-cert.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/server-revoked-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_revoked, OU = Support_revoked, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,7 +37,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -46,27 +46,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - ae:2e:5e:19:0f:49:37:fe:ce:10:c1:c9:55:8a:cb:c9:04:ee: - 88:57:98:f2:ba:a0:50:61:55:12:03:cd:01:6a:8a:74:8c:ff: - e4:10:25:14:41:73:10:99:2f:77:27:21:e9:db:9d:b4:5b:d4: - df:bc:b2:29:8d:41:35:c4:65:82:18:8f:a2:03:10:65:cc:82: - 7d:e0:59:fc:55:82:96:02:32:aa:c1:c6:6a:c4:1b:3c:04:e7: - 35:72:67:1b:ba:29:c1:3d:ac:82:7c:23:66:eb:ae:7c:1b:a7: - 8c:05:4e:f3:c4:8e:58:58:f6:9c:3e:68:9b:80:da:45:8c:0b: - db:85:da:de:fb:cb:78:20:3e:e5:99:a0:ac:09:1e:9d:13:67: - 3d:51:77:d3:47:38:6a:00:d3:d5:b3:20:bc:a5:61:fb:79:20: - 13:f5:a6:16:a4:08:60:4e:c5:28:59:fe:fa:4c:52:a5:db:da: - b9:a5:5e:3a:60:25:2b:e8:a5:cf:d3:5a:29:d4:52:8f:99:f3: - 6b:4b:ad:42:b8:02:af:ab:56:57:36:c3:69:18:1b:88:9f:a4: - f2:58:dc:53:bb:55:70:11:ae:af:f3:e5:64:c4:40:58:53:19: - f6:96:ef:d0:f1:7c:e2:10:0d:f7:ed:c6:24:4e:a8:9f:db:72: - 7a:9e:e7:0d + 5c:ae:98:a1:97:b7:b7:57:1b:47:32:9d:86:df:aa:5a:95:03: + 8f:de:04:9f:27:1f:b3:bc:6d:50:63:53:6a:02:83:3d:5b:f6: + 16:04:4a:04:84:65:d4:68:7c:f3:1d:8f:dc:ff:76:e1:b0:ce: + 88:b1:31:57:c9:5c:14:bf:ae:b9:ee:82:a0:b0:c3:25:bb:5f: + 0f:a7:00:fc:dd:73:27:8b:b8:dd:72:63:00:47:38:cb:09:66: + 7a:0e:fb:8f:c3:6e:de:23:23:47:cd:7f:f0:4c:fa:31:fa:f5: + 28:cb:2e:1c:3e:0a:92:8a:b2:c7:bd:37:21:39:d2:f6:ee:c4: + 9c:28:7a:0a:88:8c:ca:ce:7d:e8:c3:a7:3f:bc:44:52:fb:e0: + 68:95:f2:46:30:0f:1b:fa:ea:92:4c:86:c2:fe:62:48:91:5a: + ea:5a:9a:76:8a:23:dd:56:37:27:d8:91:2f:eb:77:eb:b8:30: + 8e:5a:46:71:96:a2:24:f0:fa:1a:eb:39:cd:70:dc:ea:4e:bd: + 49:88:4c:57:95:ff:f8:9e:b0:b7:13:10:26:51:3c:4b:bc:70: + 3a:fc:1d:a2:6f:13:bf:ab:d4:3c:9e:06:ae:3b:6d:03:09:41: + e0:07:b0:85:22:09:c1:5d:39:d2:59:04:90:9d:46:20:0b:24: + 82:82:c3:36 -----BEGIN CERTIFICATE----- MIIE+DCCA+CgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBoDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBoDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xGDAWBgNVBAoMD3dvbGZTU0xfcmV2 b2tlZDEYMBYGA1UECwwPU3VwcG9ydF9yZXZva2VkMRgwFgYDVQQDDA93d3cud29s ZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEiMA0G @@ -80,26 +80,26 @@ zDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYTAlVT MRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQKDAhT YXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3LndvbGZz -c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7bR50H -ZpI9aNfKrJBPymlBSzAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUu +c2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqobAHs +9mDycFEKTNEU+rzpRDAMBgNVHRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUu Y29thwR/AAABMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG -9w0BAQsFAAOCAQEAri5eGQ9JN/7OEMHJVYrLyQTuiFeY8rqgUGFVEgPNAWqKdIz/ -5BAlFEFzEJkvdych6dudtFvU37yyKY1BNcRlghiPogMQZcyCfeBZ/FWClgIyqsHG -asQbPATnNXJnG7opwT2sgnwjZuuufBunjAVO88SOWFj2nD5om4DaRYwL24Xa3vvL -eCA+5ZmgrAkenRNnPVF300c4agDT1bMgvKVh+3kgE/WmFqQIYE7FKFn++kxSpdva -uaVeOmAlK+ilz9NaKdRSj5nza0utQrgCr6tWVzbDaRgbiJ+k8ljcU7tVcBGur/Pl -ZMRAWFMZ9pbv0PF84hAN9+3GJE6on9tyep7nDQ== +9w0BAQsFAAOCAQEAXK6YoZe3t1cbRzKdht+qWpUDj94Enycfs7xtUGNTagKDPVv2 +FgRKBIRl1Gh88x2P3P924bDOiLExV8lcFL+uue6CoLDDJbtfD6cA/N1zJ4u43XJj +AEc4ywlmeg77j8Nu3iMjR81/8Ez6Mfr1KMsuHD4Kkoqyx703ITnS9u7EnCh6CoiM +ys596MOnP7xEUvvgaJXyRjAPG/rqkkyGwv5iSJFa6lqadooj3VY3J9iRL+t367gw +jlpGcZaiJPD6Gus5zXDc6k69SYhMV5X/+J6wtxMQJlE8S7xwOvwdom8Tv6vUPJ4G +rjttAwlB4AewhSIJwV050lkEkJ1GIAskgoLDNg== -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: - 2c:80:ce:db:47:9d:07:66:92:3d:68:d7:ca:ac:90:4f:ca:69:41:4b + 33:44:1a:a8:6c:01:ec:f6:60:f2:70:51:0a:4c:d1:14:fa:bc:e9:44 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -130,7 +130,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -139,27 +139,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - ae:b0:a4:35:8e:8a:1b:a6:eb:b3:a2:57:cf:3a:1f:dc:6e:bc: - d2:d0:a6:4a:8f:88:0a:6e:74:d5:d1:7c:d1:44:b1:d4:3b:17: - 03:09:5a:46:ed:08:08:cf:f1:fd:20:07:67:c0:97:ec:35:f3: - 75:ca:20:61:98:3e:f5:4d:be:e6:9d:75:1e:e4:03:ad:8c:a6: - 1e:3d:ec:e4:1a:92:5b:f9:a3:ad:83:ca:4f:cd:aa:38:bb:6e: - ae:ad:fa:a7:46:f1:8b:73:ec:09:23:bc:f2:18:e5:b7:92:86: - 3e:a4:75:60:c7:3d:0f:3f:83:00:c3:06:08:9c:d1:54:d6:ba: - 6d:95:3d:34:a1:be:24:91:cc:20:03:11:5b:72:1c:d4:65:d0: - 11:88:75:26:04:26:ef:66:70:e6:3b:38:87:9c:53:71:1b:09: - 51:70:50:99:4c:31:0c:62:44:57:30:60:04:fc:12:2c:a3:24: - b4:f7:11:d5:0e:b5:21:0b:ed:86:11:67:4d:36:fa:57:a0:59: - 55:21:b3:6d:e4:77:5e:ec:7e:f0:09:13:8e:99:98:b2:e1:82: - b6:4b:3e:0f:41:a6:0c:cd:49:99:7e:e4:8a:cb:37:ed:53:cf: - 86:5d:a9:26:a8:e5:01:25:5a:b4:bc:25:35:f1:fa:5a:5c:ce: - d4:b8:9a:2c + 2d:fc:f9:32:5a:be:d6:9d:42:8b:86:4e:67:22:c3:50:2d:cb: + 14:27:1d:94:f3:cd:88:42:da:41:1c:39:24:67:a7:92:4d:27: + ea:56:82:19:bf:11:b2:43:a4:8d:5d:87:b2:27:64:66:82:81: + df:c4:fd:5b:62:b0:c2:4d:9d:29:f2:41:32:cc:2e:b5:da:38: + 06:1b:e8:7f:8c:6e:3d:80:1e:00:56:49:bf:39:e0:da:68:2f: + c4:fd:00:e6:d1:81:1a:d1:4a:bb:76:52:ce:4d:24:9d:c4:a3: + a7:f1:65:14:2f:1f:a8:2d:c6:cb:ce:b1:a7:89:74:26:27:c3: + f3:a3:84:4c:34:01:14:03:7d:16:3a:c8:8b:25:2e:7b:90:cc: + 46:b1:52:34:ba:93:6e:ef:fe:43:a3:ad:c6:6f:51:fb:ba:ea: + 38:e3:6f:d6:ee:63:62:36:ea:5e:08:b4:e2:2a:46:89:e3:ae: + b3:b4:06:ef:63:7a:6e:5d:dd:c9:ec:02:4f:f7:64:c0:27:07: + b4:6f:4a:18:72:5b:34:74:7c:d0:a9:04:8f:40:8b:6a:39:d2: + 6b:1a:01:f2:01:a8:81:34:3a:e5:b0:55:d1:3c:95:ca:b0:82: + d6:ed:98:28:15:59:7e:95:a7:69:c7:b5:7b:ec:01:a7:4d:e6: + b9:a2:fe:35 -----BEGIN CERTIFICATE----- -MIIE/zCCA+egAwIBAgIULIDO20edB2aSPWjXyqyQT8ppQUswDQYJKoZIhvcNAQEL +MIIE/zCCA+egAwIBAgIUM0QaqGwB7PZg8nBRCkzRFPq86UQwDQYJKoZIhvcNAQEL BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZQxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZQxCzAJ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -174,12 +174,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU -LIDO20edB2aSPWjXyqyQT8ppQUswDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +M0QaqGwB7PZg8nBRCkzRFPq86UQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DQYJKoZIhvcNAQELBQADggEBAK6wpDWOihum67OiV886H9xuvNLQpkqPiApudNXR -fNFEsdQ7FwMJWkbtCAjP8f0gB2fAl+w183XKIGGYPvVNvuaddR7kA62Mph497OQa -klv5o62Dyk/Nqji7bq6t+qdG8Ytz7AkjvPIY5beShj6kdWDHPQ8/gwDDBgic0VTW -um2VPTShviSRzCADEVtyHNRl0BGIdSYEJu9mcOY7OIecU3EbCVFwUJlMMQxiRFcw -YAT8EiyjJLT3EdUOtSEL7YYRZ002+legWVUhs23kd17sfvAJE46ZmLLhgrZLPg9B -pgzNSZl+5IrLN+1Tz4ZdqSao5QElWrS8JTXx+lpcztS4miw= +DQYJKoZIhvcNAQELBQADggEBAC38+TJavtadQouGTmciw1AtyxQnHZTzzYhC2kEc +OSRnp5JNJ+pWghm/EbJDpI1dh7InZGaCgd/E/VtisMJNnSnyQTLMLrXaOAYb6H+M +bj2AHgBWSb854NpoL8T9AObRgRrRSrt2Us5NJJ3Eo6fxZRQvH6gtxsvOsaeJdCYn +w/OjhEw0ARQDfRY6yIslLnuQzEaxUjS6k27v/kOjrcZvUfu66jjjb9buY2I26l4I +tOIqRonjrrO0Bu9jem5d3cnsAk/3ZMAnB7RvShhyWzR0fNCpBI9Ai2o50msaAfIB +qIE0OuWwVdE8lcqwgtbtmCgVWX6Vp2nHtXvsAadN5rmi/jU= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-key.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABCGS98sk32RNuqtme4N1qSnn/2Rj +ttVCgCC94uICEjuOtACVCYDLVu1Lyo1X5q4F03YnY3E5ibdp5kiArtGpSBI= +-----END PUBLIC KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2-priv.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGIAgEAMBQGCCqBHM9VAYItBggqgRzPVQGCLQRtMGsCAQEEII+5uEAZDiE56+gI +fP3YoQWTpDUs0YDjv35IR+QFDQlBoUQDQgAEIZL3yyTfZE26q2Z7g3WpKef/ZGO2 +1UKAIL3i4gISO460AJUJgMtW7UvKjVfmrgXTdidjcTmJt2nmSICu0alIEg== +-----END PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/ca-sm2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,51 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: SM2-with-SM3 + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_SM2, OU = Root-SM2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Validity + Not Before: Feb 15 06:23:07 2023 GMT + Not After : Nov 11 06:23:07 2025 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = CA-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Subject Public Key Info: + Public Key Algorithm: sm2 + Public-Key: (256 bit) + pub: + 04:21:92:f7:cb:24:df:64:4d:ba:ab:66:7b:83:75: + a9:29:e7:ff:64:63:b6:d5:42:80:20:bd:e2:e2:02: + 12:3b:8e:b4:00:95:09:80:cb:56:ed:4b:ca:8d:57: + e6:ae:05:d3:76:27:63:71:39:89:b7:69:e6:48:80: + ae:d1:a9:48:12 + ASN1 OID: SM2 + X509v3 extensions: + X509v3 Subject Key Identifier: + 47:0A:48:7E:BB:02:A8:5A:26:57:2B:19:A9:7B:61:8B:7F:5D:99:6E + X509v3 Authority Key Identifier: + 34:1D:79:44:15:79:A1:B1:63:99:E3:ED:65:7C:64:89:80:FF:B8:EC + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + Signature Algorithm: SM2-with-SM3 + Signature Value: + 30:45:02:20:47:4e:00:03:ab:34:a1:af:59:39:8f:60:36:bf: + 89:88:42:41:27:c1:dd:57:c9:79:cb:1f:56:5c:16:b5:28:bd: + 02:21:00:8b:2e:25:eb:21:9b:a9:2b:a6:6a:5b:db:a7:c7:2b: + 11:df:73:15:ad:e4:c5:c3:c2:f3:b4:b4:67:af:d7:51:1c +-----BEGIN CERTIFICATE----- +MIICljCCAjygAwIBAgIBATAKBggqgRzPVQGDdTCBlTELMAkGA1UEBhMCVVMxEDAO +BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAoMC3dvbGZT +U0xfU00yMREwDwYDVQQLDAhSb290LVNNMjEYMBYGA1UEAwwPd3d3LndvbGZzc2wu +Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDIxNTA2 +MjMwN1oXDTI1MTExMTA2MjMwN1owgawxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdN +b250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQKDAt3b2xmU1NMX3NtMjEP +MA0GA1UECwwGQ0Etc20yMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq +hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xm +U1NMMFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABCGS98sk32RNuqtme4N1qSnn +/2RjttVCgCC94uICEjuOtACVCYDLVu1Lyo1X5q4F03YnY3E5ibdp5kiArtGpSBKj +YzBhMB0GA1UdDgQWBBRHCkh+uwKoWiZXKxmpe2GLf12ZbjAfBgNVHSMEGDAWgBQ0 +HXlEFXmhsWOZ4+1lfGSJgP+47DAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBhjAKBggqgRzPVQGDdQNIADBFAiBHTgADqzShr1k5j2A2v4mIQkEnwd1XyXnL +H1ZcFrUovQIhAIsuJeshm6krpmpb26fHKxHfcxWt5MXDwvO0tGev11Ec +-----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-key.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABDod6MtL0y4/Swc/sCH+xZ7ZyjqT +k5V2HTDZC/VW7Rlg7QFM9mcd8ayodA2yd8hJOOT/TO+NbYf2Tsf4OXRwcLU= +-----END PUBLIC KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2-priv.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGIAgEAMBQGCCqBHM9VAYItBggqgRzPVQGCLQRtMGsCAQEEINCi30l6Ld8Cyc63 +8jcCDd38CLjeFJN6UyZJ1f4C2fNxoUQDQgAEOh3oy0vTLj9LBz+wIf7FntnKOpOT +lXYdMNkL9VbtGWDtAUz2Zx3xrKh0DbJ3yEk45P9M741th/ZOx/g5dHBwtQ== +-----END PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/client-sm2.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/client-sm2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,63 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 60:a0:4a:0b:36:eb:7d:e1:3f:74:29:a9:29:b4:05:6c:17:f7:a6:d4 + Signature Algorithm: SM2-with-SM3 + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = Client-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Validity + Not Before: Feb 15 06:23:07 2023 GMT + Not After : Nov 11 06:23:07 2025 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = Client-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Subject Public Key Info: + Public Key Algorithm: sm2 + Public-Key: (256 bit) + pub: + 04:3a:1d:e8:cb:4b:d3:2e:3f:4b:07:3f:b0:21:fe: + c5:9e:d9:ca:3a:93:93:95:76:1d:30:d9:0b:f5:56: + ed:19:60:ed:01:4c:f6:67:1d:f1:ac:a8:74:0d:b2: + 77:c8:49:38:e4:ff:4c:ef:8d:6d:87:f6:4e:c7:f8: + 39:74:70:70:b5 + ASN1 OID: SM2 + X509v3 extensions: + X509v3 Subject Key Identifier: + E4:21:B2:C5:E5:D4:9E:82:CA:F8:67:F2:28:99:F6:85:E8:F1:55:EF + X509v3 Authority Key Identifier: + keyid:E4:21:B2:C5:E5:D4:9E:82:CA:F8:67:F2:28:99:F6:85:E8:F1:55:EF + DirName:/C=US/ST=Montana/L=Bozeman/O=wolfSSL_sm2/OU=Client-sm2/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/UID=wolfSSL + serial:60:A0:4A:0B:36:EB:7D:E1:3F:74:29:A9:29:B4:05:6C:17:F7:A6:D4 + X509v3 Basic Constraints: + CA:TRUE + X509v3 Subject Alternative Name: + DNS:example.com, IP Address:127.0.0.1 + X509v3 Extended Key Usage: + TLS Web Server Authentication, TLS Web Client Authentication + Signature Algorithm: SM2-with-SM3 + Signature Value: + 30:46:02:21:00:8f:b2:b5:95:8f:79:f6:5e:75:e5:c5:e9:9a: + 12:d2:0f:78:9f:c0:1d:8d:1c:be:6b:0c:f1:f5:57:60:db:91: + 4f:02:21:00:87:5e:7d:e4:d6:3a:bb:7b:98:27:85:de:7a:f0: + 21:e2:66:a1:9f:26:e0:dd:86:23:b4:c8:c0:46:5a:f2:49:8d +-----BEGIN CERTIFICATE----- +MIIDyTCCA26gAwIBAgIUYKBKCzbrfeE/dCmpKbQFbBf3ptQwCgYIKoEcz1UBg3Uw +gbAxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl +bWFuMRQwEgYDVQQKDAt3b2xmU1NMX3NtMjETMBEGA1UECwwKQ2xpZW50LXNtMjEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDAeFw0yMzAyMTUwNjIz +MDdaFw0yNTExMTEwNjIzMDdaMIGwMQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9u +dGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECgwLd29sZlNTTF9zbTIxEzAR +BgNVBAsMCkNsaWVudC1zbTIxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0G +CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEMB3dv +bGZTU0wwWjAUBggqgRzPVQGCLQYIKoEcz1UBgi0DQgAEOh3oy0vTLj9LBz+wIf7F +ntnKOpOTlXYdMNkL9VbtGWDtAUz2Zx3xrKh0DbJ3yEk45P9M741th/ZOx/g5dHBw +taOCAWEwggFdMB0GA1UdDgQWBBTkIbLF5dSegsr4Z/IomfaF6PFV7zCB8AYDVR0j +BIHoMIHlgBTkIbLF5dSegsr4Z/IomfaF6PFV76GBtqSBszCBsDELMAkGA1UEBhMC +VVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAoM +C3dvbGZTU0xfc20yMRMwEQYDVQQLDApDbGllbnQtc20yMRgwFgYDVQQDDA93d3cu +d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAV +BgoJkiaJk/IsZAEBDAd3b2xmU1NMghRgoEoLNut94T90KakptAVsF/em1DAMBgNV +HRMEBTADAQH/MBwGA1UdEQQVMBOCC2V4YW1wbGUuY29thwR/AAABMB0GA1UdJQQW +MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAKBggqgRzPVQGDdQNJADBGAiEAj7K1lY95 +9l515cXpmhLSD3ifwB2NHL5rDPH1V2DbkU8CIQCHXn3k1jq7e5gnhd568CHiZqGf +JuDdhiO0yMBGWvJJjQ== +-----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-certs.sh mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-certs.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-certs.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-certs.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,124 @@ +#!/bin/bash + +check_result(){ + if [ $1 -ne 0 ]; then + echo "Failed at \"$2\", Abort" + exit 1 + else + echo "Step Succeeded!" + fi +} + +openssl pkey -in root-sm2-priv.pem -noout >/dev/null 2>&1 +if [ $? -ne 0 ]; then + echo "OpenSSL does not support SM2" + echo "Skipping SM2 certificate renewal" + exit 0 +fi + +############################################################ +###### update the self-signed root-sm2.pem ############# +############################################################ +echo "Updating root-sm2.pem" +echo "" +#pipe the following arguments to openssl req... +echo -e "US\\nMontana\\nBozeman\\nwolfSSL_SM2\\nRoot-SM2\\nwww.wolfssl.com\\ninfo@wolfssl.com\\n.\\n.\\n" | \ +openssl req -new -key root-sm2-priv.pem -config ../renewcerts/wolfssl.cnf -nodes -out root-sm2.csr +check_result $? "Generate request" + +openssl x509 -req -in root-sm2.csr -days 1000 -extfile ../renewcerts/wolfssl.cnf -extensions ca_ecc_cert -signkey root-sm2-priv.pem -out root-sm2.pem +check_result $? "Generate certificate" +rm root-sm2.csr + +openssl x509 -in root-sm2.pem -outform DER > root-sm2.der +check_result $? "Convert to DER" +openssl x509 -in root-sm2.pem -text > tmp.pem +check_result $? "Add text" +mv tmp.pem root-sm2.pem +echo "End of section" +echo "---------------------------------------------------------------------" + +############################################################ +###### update ca-sm2.pem signed by root ################ +############################################################ +echo "Updating ca-sm2.pem" +echo "" +#pipe the following arguments to openssl req... +echo -e "US\\nMontana\\nBozeman\\nwolfSSL_sm2\\nCA-sm2\\nwww.wolfssl.com\\ninfo@wolfssl.com\\n\\n\\n\\n" | openssl req -new -key ca-sm2-priv.pem -config ../renewcerts/wolfssl.cnf -nodes -out ca-sm2.csr +check_result $? "Generate request" + +openssl x509 -req -in ca-sm2.csr -days 1000 -extfile ../renewcerts/wolfssl.cnf -extensions ca_ecc_cert -CA root-sm2.pem -CAkey root-sm2-priv.pem -set_serial 01 -out ca-sm2.pem +check_result $? "Generate certificate" +rm ca-sm2.csr + +openssl x509 -in ca-sm2.pem -outform DER > ca-sm2.der +check_result $? "Convert to DER" +openssl x509 -in ca-sm2.pem -text > tmp.pem +check_result $? "Add text" +mv tmp.pem ca-sm2.pem +echo "End of section" +echo "---------------------------------------------------------------------" + +############################################################ +###### update self-sm2-cert.pem ############## +############################################################ +echo "Updating self-sm2-cert.pem" +echo "" +#pipe the following arguments to openssl req... +echo -e "AU\\nQLD\\n.\\nwolfSSL\\nTesting\\nwolfssl-dev-sm2\\n\\n\\n\\n\\n" | openssl req -new -key self-sm2-priv.pem -config ../renewcerts/wolfssl.cnf -nodes -out self-sm2.csr +check_result $? "Generate request" + +openssl x509 -req -in self-sm2.csr -days 1000 -extfile ../renewcerts/wolfssl.cnf -extensions ca_ecc_cert -signkey self-sm2-priv.pem -out self-sm2-cert.pem +check_result $? "Generate certificate" +rm self-sm2.csr + +openssl x509 -in self-sm2-cert.pem -text > tmp.pem +check_result $? "Add text" +mv tmp.pem self-sm2-cert.pem +echo "End of section" +echo "---------------------------------------------------------------------" + +############################################################ +###### update server-sm2.pem signed by ca ############## +############################################################ +echo "Updating server-sm2.pem" +echo "" +#pipe the following arguments to openssl req... +echo -e "US\\nMontana\\nBozeman\\nwolfSSL_sm2\\nServer-sm2\\nwww.wolfssl.com\\ninfo@wolfssl.com\\n\\n\\n\\n" | openssl req -new -key server-sm2-priv.pem -config ../renewcerts/wolfssl.cnf -nodes -out server-sm2.csr +check_result $? "Generate request" + +openssl x509 -req -in server-sm2.csr -days 1000 -extfile ../renewcerts/wolfssl.cnf -extensions server_ecc -CA ca-sm2.pem -CAkey ca-sm2-priv.pem -set_serial 01 -out server-sm2-cert.pem +check_result $? "Generate certificate" +rm server-sm2.csr + +openssl x509 -in server-sm2-cert.pem -outform DER > server-sm2.der +check_result $? "Convert to DER" +openssl x509 -in server-sm2-cert.pem -text > tmp.pem +check_result $? "Add text" +mv tmp.pem server-sm2-cert.pem +cat server-sm2-cert.pem ca-sm2.pem > server-sm2.pem +check_result $? "Add CA into server cert" +echo "End of section" +echo "---------------------------------------------------------------------" + +############################################################ +###### update the self-signed client-sm2.pem ########### +############################################################ +echo "Updating client-sm2.pem" +echo "" +#pipe the following arguments to openssl req... +echo -e "US\\nMontana\\nBozeman\\nwolfSSL_sm2\\nClient-sm2\\nwww.wolfssl.com\\ninfo@wolfssl.com\\n\\n\\n\\n" | openssl req -new -key client-sm2-priv.pem -config ../renewcerts/wolfssl.cnf -nodes -out client-sm2.csr +check_result $? "Generate request" + +openssl x509 -req -in client-sm2.csr -days 1000 -extfile ../renewcerts/wolfssl.cnf -extensions wolfssl_opts -signkey client-sm2-priv.pem -out client-sm2.pem +check_result $? "Generate certificate" +rm client-sm2.csr + +openssl x509 -in client-sm2.pem -outform DER > client-sm2.der +check_result $? "Convert to DER" +openssl x509 -in client-sm2.pem -text > tmp.pem +check_result $? "Add text" +mv tmp.pem client-sm2.pem +echo "End of section" +echo "---------------------------------------------------------------------" + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-keys.sh mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-keys.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-keys.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/gen-sm2-keys.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,16 @@ +#!/bin/sh + +for key in root ca server client +do + + openssl genpkey -algorithm sm2 > ${key}-sm2-priv.pem + + openssl pkey -in ${key}-sm2-priv.pem -outform DER -out ${key}-sm2-priv.der + + openssl pkey -in ${key}-sm2-priv.pem -outform PEM -pubout -out ${key}-sm2-key.pem + + openssl pkey -in ${key}-sm2-priv.pem -outform DER -pubout -out ${key}-sm2-key.der + +done + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,37 @@ +# vim:ft=automake +# All paths should be given relative to the root +# + +EXTRA_DIST += \ + certs/sm2/ca-sm2.der \ + certs/sm2/ca-sm2.pem \ + certs/sm2/ca-sm2-key.der \ + certs/sm2/ca-sm2-key.pem \ + certs/sm2/ca-sm2-priv.der \ + certs/sm2/ca-sm2-priv.pem \ + certs/sm2/client-sm2.der \ + certs/sm2/client-sm2.pem \ + certs/sm2/client-sm2-key.der \ + certs/sm2/client-sm2-key.pem \ + certs/sm2/client-sm2-priv.der \ + certs/sm2/client-sm2-priv.pem \ + certs/sm2/root-sm2.der \ + certs/sm2/root-sm2.pem \ + certs/sm2/root-sm2-key.der \ + certs/sm2/root-sm2-key.pem \ + certs/sm2/root-sm2-priv.der \ + certs/sm2/root-sm2-priv.pem \ + certs/sm2/server-sm2.der \ + certs/sm2/server-sm2.pem \ + certs/sm2/server-sm2-cert.pem \ + certs/sm2/server-sm2-key.der \ + certs/sm2/server-sm2-key.pem \ + certs/sm2/server-sm2-priv.der \ + certs/sm2/server-sm2-priv.pem \ + certs/sm2/self-sm2-cert.pem \ + certs/sm2/self-sm2-key.pem \ + certs/sm2/self-sm2-priv.pem + +EXTRA_DIST += \ + certs/sm2/gen-sm2-certs.sh \ + certs/sm2/gen-sm2-keys.sh Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-key.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABLucdYz3F/hIq/f22w2ajZ/C0UeX +lQtO5lfsxfhXVHE5PHnhQD+2Uel8x9ot79LoeYF7q6NfaypslxpejtnQzAQ= +-----END PUBLIC KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2-priv.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGIAgEAMBQGCCqBHM9VAYItBggqgRzPVQGCLQRtMGsCAQEEIMZrNEwzN1tkFlp/ +BPn8hzDRFbpYeO4HmCAm4QaNUYoooUQDQgAEu5x1jPcX+Eir9/bbDZqNn8LRR5eV +C07mV+zF+FdUcTk8eeFAP7ZR6XzH2i3v0uh5gXuro19rKmyXGl6O2dDMBA== +-----END PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/root-sm2.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/root-sm2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,52 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 74:9c:dd:a4:b2:67:26:57:29:fb:e9:13:54:e0:34:08:03:2b:70:a9 + Signature Algorithm: SM2-with-SM3 + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_SM2, OU = Root-SM2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Validity + Not Before: Feb 15 06:23:07 2023 GMT + Not After : Nov 11 06:23:07 2025 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_SM2, OU = Root-SM2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Subject Public Key Info: + Public Key Algorithm: sm2 + Public-Key: (256 bit) + pub: + 04:bb:9c:75:8c:f7:17:f8:48:ab:f7:f6:db:0d:9a: + 8d:9f:c2:d1:47:97:95:0b:4e:e6:57:ec:c5:f8:57: + 54:71:39:3c:79:e1:40:3f:b6:51:e9:7c:c7:da:2d: + ef:d2:e8:79:81:7b:ab:a3:5f:6b:2a:6c:97:1a:5e: + 8e:d9:d0:cc:04 + ASN1 OID: SM2 + X509v3 extensions: + X509v3 Subject Key Identifier: + 34:1D:79:44:15:79:A1:B1:63:99:E3:ED:65:7C:64:89:80:FF:B8:EC + X509v3 Authority Key Identifier: + 34:1D:79:44:15:79:A1:B1:63:99:E3:ED:65:7C:64:89:80:FF:B8:EC + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + Signature Algorithm: SM2-with-SM3 + Signature Value: + 30:44:02:20:03:27:29:f0:ef:78:26:a1:1a:6a:1e:88:81:e7: + 83:72:5f:3e:e6:08:e8:14:68:bf:4b:0f:68:52:92:aa:8f:a1: + 02:20:0b:fe:1b:14:ba:51:82:65:06:bb:22:d8:1a:a7:9f:54: + 62:eb:8d:b2:d5:13:b3:b8:a2:f3:14:44:b2:a0:21:d0 +-----BEGIN CERTIFICATE----- +MIICkTCCAjigAwIBAgIUdJzdpLJnJlcp++kTVOA0CAMrcKkwCgYIKoEcz1UBg3Uw +gZUxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3pl +bWFuMRQwEgYDVQQKDAt3b2xmU1NMX1NNMjERMA8GA1UECwwIUm9vdC1TTTIxGDAW +BgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm +c3NsLmNvbTAeFw0yMzAyMTUwNjIzMDdaFw0yNTExMTEwNjIzMDdaMIGVMQswCQYD +VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIG +A1UECgwLd29sZlNTTF9TTTIxETAPBgNVBAsMCFJvb3QtU00yMRgwFgYDVQQDDA93 +d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20w +WjAUBggqgRzPVQGCLQYIKoEcz1UBgi0DQgAEu5x1jPcX+Eir9/bbDZqNn8LRR5eV +C07mV+zF+FdUcTk8eeFAP7ZR6XzH2i3v0uh5gXuro19rKmyXGl6O2dDMBKNjMGEw +HQYDVR0OBBYEFDQdeUQVeaGxY5nj7WV8ZImA/7jsMB8GA1UdIwQYMBaAFDQdeUQV +eaGxY5nj7WV8ZImA/7jsMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGG +MAoGCCqBHM9VAYN1A0cAMEQCIAMnKfDveCahGmoeiIHng3JfPuYI6BRov0sPaFKS +qo+hAiAL/hsUulGCZQa7Itgap59UYuuNstUTs7ii8xREsqAh0A== +-----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/self-sm2-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/self-sm2-cert.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,52 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 06:7b:3a:5d:cf:22:a9:6d:6d:78:2b:10:01:51:b6:4c:d4:82:a2:a1 + Signature Algorithm: SM2-with-SM3 + Issuer: C = AU, ST = QLD, O = wolfSSL, OU = Testing, CN = wolfssl-dev-sm2, emailAddress = info@wolfssl.com, UID = wolfSSL + Validity + Not Before: Nov 22 21:28:37 2023 GMT + Not After : Aug 18 21:28:37 2026 GMT + Subject: C = AU, ST = QLD, O = wolfSSL, OU = Testing, CN = wolfssl-dev-sm2, emailAddress = info@wolfssl.com, UID = wolfSSL + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:d8:c4:a1:f1:0b:8b:8d:c4:7d:dc:d4:65:b9:a5: + 55:4e:fb:ac:33:ab:9b:43:94:4c:48:40:1b:33:d9: + 1b:cc:31:c1:82:56:3f:b0:c0:6b:95:40:51:fd:88: + 02:01:b1:b0:94:6c:06:eb:a7:da:8e:ee:70:b6:e5: + bb:b4:1e:e7:b4 + ASN1 OID: SM2 + X509v3 extensions: + X509v3 Subject Key Identifier: + 6E:97:E8:98:B6:5B:B6:AE:87:04:DB:14:56:66:16:F4:B8:2D:8C:F2 + X509v3 Authority Key Identifier: + 6E:97:E8:98:B6:5B:B6:AE:87:04:DB:14:56:66:16:F4:B8:2D:8C:F2 + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + Signature Algorithm: SM2-with-SM3 + Signature Value: + 30:44:02:20:0f:c3:2c:36:e3:9f:1c:e9:68:1c:3b:43:18:5b: + c9:8f:e4:fa:dd:33:c1:b8:1c:d3:d4:61:33:f8:37:9d:5a:f4: + 02:20:3a:b9:a8:43:80:cf:38:25:e9:64:d8:26:47:9d:50:04: + 0c:8a:e8:a2:42:e8:63:dd:53:94:7d:38:6d:52:70:fd +-----BEGIN CERTIFICATE----- +MIICjDCCAjOgAwIBAgIUBns6Xc8iqW1teCsQAVG2TNSCoqEwCgYIKoEcz1UBg3Uw +gZMxCzAJBgNVBAYTAkFVMQwwCgYDVQQIDANRTEQxEDAOBgNVBAoMB3dvbGZTU0wx +EDAOBgNVBAsMB1Rlc3RpbmcxGDAWBgNVBAMMD3dvbGZzc2wtZGV2LXNtMjEfMB0G +CSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixkAQEMB3dv +bGZTU0wwHhcNMjMxMTIyMjEyODM3WhcNMjYwODE4MjEyODM3WjCBkzELMAkGA1UE +BhMCQVUxDDAKBgNVBAgMA1FMRDEQMA4GA1UECgwHd29sZlNTTDEQMA4GA1UECwwH +VGVzdGluZzEYMBYGA1UEAwwPd29sZnNzbC1kZXYtc20yMR8wHQYJKoZIhvcNAQkB +FhBpbmZvQHdvbGZzc2wuY29tMRcwFQYKCZImiZPyLGQBAQwHd29sZlNTTDBZMBMG +ByqGSM49AgEGCCqBHM9VAYItA0IABNjEofELi43EfdzUZbmlVU77rDOrm0OUTEhA +GzPZG8wxwYJWP7DAa5VAUf2IAgGxsJRsBuun2o7ucLblu7Qe57SjYzBhMB0GA1Ud +DgQWBBRul+iYtlu2rocE2xRWZhb0uC2M8jAfBgNVHSMEGDAWgBRul+iYtlu2rocE +2xRWZhb0uC2M8jAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAKBggq +gRzPVQGDdQNHADBEAiAPwyw2458c6WgcO0MYW8mP5PrdM8G4HNPUYTP4N51a9AIg +OrmoQ4DPOCXpZNgmR51QBAyK6KJC6GPdU5R9OG1ScP0= +-----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/self-sm2-key.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-key.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/self-sm2-key.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-key.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE2MSh8QuLjcR93NRluaVVTvusM6ub +Q5RMSEAbM9kbzDHBglY/sMBrlUBR/YgCAbGwlGwG66faju5wtuW7tB7ntA== +-----END PUBLIC KEY----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/self-sm2-priv.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-priv.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/self-sm2-priv.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/self-sm2-priv.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,6 @@ +-----BEGIN PRIVATE KEY----- +MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg0JwoWhXWJQ22X9Gh +AW60DtA2+hX8qQTlF6HQLynW/mqgCgYIKoEcz1UBgi2hRANCAATYxKHxC4uNxH3c +1GW5pVVO+6wzq5tDlExIQBsz2RvMMcGCVj+wwGuVQFH9iAIBsbCUbAbrp9qO7nC2 +5bu0Hue0 +-----END PRIVATE KEY----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-cert.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-cert.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-cert.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-cert.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,57 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: SM2-with-SM3 + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = CA-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Validity + Not Before: Feb 15 06:23:07 2023 GMT + Not After : Nov 11 06:23:07 2025 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = Server-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Subject Public Key Info: + Public Key Algorithm: sm2 + Public-Key: (256 bit) + pub: + 04:94:70:2b:46:e4:5e:0f:41:fb:8f:2d:34:0a:41: + 40:19:5e:fb:d4:1d:11:ac:fa:f5:93:37:c6:fa:87: + 08:f7:16:1f:2c:ce:30:40:9d:4f:a6:2a:0a:a1:d6: + 95:33:c3:a6:03:98:e6:8d:05:34:b0:97:0c:de:a4: + c7:cf:53:8f:d1 + ASN1 OID: SM2 + X509v3 extensions: + X509v3 Subject Key Identifier: + 67:AE:60:FF:7E:1B:0F:95:AE:1F:82:59:F2:6C:56:2D:93:EF:17:32 + X509v3 Authority Key Identifier: + 47:0A:48:7E:BB:02:A8:5A:26:57:2B:19:A9:7B:61:8B:7F:5D:99:6E + X509v3 Basic Constraints: critical + CA:FALSE + X509v3 Key Usage: critical + Digital Signature, Key Encipherment, Key Agreement + X509v3 Extended Key Usage: + TLS Web Server Authentication + Netscape Cert Type: + SSL Server + Signature Algorithm: SM2-with-SM3 + Signature Value: + 30:45:02:20:1b:ca:94:28:7f:f6:b2:0d:31:43:50:e1:d5:34: + 17:dd:af:3a:de:81:06:67:9a:b3:06:22:7e:64:ec:fd:0e:b9: + 02:21:00:a1:48:a8:32:d1:05:09:6b:1c:eb:89:12:66:d8:38: + a1:c4:5c:89:09:0f:fd:e9:c0:3b:1d:fb:cd:b5:4c:31:68 +-----BEGIN CERTIFICATE----- +MIIC2DCCAn6gAwIBAgIBATAKBggqgRzPVQGDdTCBrDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAoMC3dvbGZT +U0xfc20yMQ8wDQYDVQQLDAZDQS1zbTIxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNv +bTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixk +AQEMB3dvbGZTU0wwHhcNMjMwMjE1MDYyMzA3WhcNMjUxMTExMDYyMzA3WjCBsDEL +MAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4x +FDASBgNVBAoMC3dvbGZTU0xfc20yMRMwEQYDVQQLDApTZXJ2ZXItc20yMRgwFgYD +VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMFowFAYIKoEcz1UBgi0GCCqB +HM9VAYItA0IABJRwK0bkXg9B+48tNApBQBle+9QdEaz69ZM3xvqHCPcWHyzOMECd +T6YqCqHWlTPDpgOY5o0FNLCXDN6kx89Tj9GjgYkwgYYwHQYDVR0OBBYEFGeuYP9+ +Gw+Vrh+CWfJsVi2T7xcyMB8GA1UdIwQYMBaAFEcKSH67AqhaJlcrGal7YYt/XZlu +MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUF +BwMBMBEGCWCGSAGG+EIBAQQEAwIGQDAKBggqgRzPVQGDdQNIADBFAiAbypQof/ay +DTFDUOHVNBfdrzregQZnmrMGIn5k7P0OuQIhAKFIqDLRBQlrHOuJEmbYOKHEXIkJ +D/3pwDsd+821TDFo +-----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-key.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABJRwK0bkXg9B+48tNApBQBle+9Qd +Eaz69ZM3xvqHCPcWHyzOMECdT6YqCqHWlTPDpgOY5o0FNLCXDN6kx89Tj9E= +-----END PUBLIC KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2-priv.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGIAgEAMBQGCCqBHM9VAYItBggqgRzPVQGCLQRtMGsCAQEEINczwaFxmNpDgQ1w +Qohj0Ex+D4qbLdoVqg5a+u13OkOooUQDQgAElHArRuReD0H7jy00CkFAGV771B0R +rPr1kzfG+ocI9xYfLM4wQJ1PpioKodaVM8OmA5jmjQU0sJcM3qTHz1OP0Q== +-----END PRIVATE KEY----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sm2/server-sm2.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sm2/server-sm2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,108 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: SM2-with-SM3 + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = CA-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Validity + Not Before: Feb 15 06:23:07 2023 GMT + Not After : Nov 11 06:23:07 2025 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = Server-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Subject Public Key Info: + Public Key Algorithm: sm2 + Public-Key: (256 bit) + pub: + 04:94:70:2b:46:e4:5e:0f:41:fb:8f:2d:34:0a:41: + 40:19:5e:fb:d4:1d:11:ac:fa:f5:93:37:c6:fa:87: + 08:f7:16:1f:2c:ce:30:40:9d:4f:a6:2a:0a:a1:d6: + 95:33:c3:a6:03:98:e6:8d:05:34:b0:97:0c:de:a4: + c7:cf:53:8f:d1 + ASN1 OID: SM2 + X509v3 extensions: + X509v3 Subject Key Identifier: + 67:AE:60:FF:7E:1B:0F:95:AE:1F:82:59:F2:6C:56:2D:93:EF:17:32 + X509v3 Authority Key Identifier: + 47:0A:48:7E:BB:02:A8:5A:26:57:2B:19:A9:7B:61:8B:7F:5D:99:6E + X509v3 Basic Constraints: critical + CA:FALSE + X509v3 Key Usage: critical + Digital Signature, Key Encipherment, Key Agreement + X509v3 Extended Key Usage: + TLS Web Server Authentication + Netscape Cert Type: + SSL Server + Signature Algorithm: SM2-with-SM3 + Signature Value: + 30:45:02:20:1b:ca:94:28:7f:f6:b2:0d:31:43:50:e1:d5:34: + 17:dd:af:3a:de:81:06:67:9a:b3:06:22:7e:64:ec:fd:0e:b9: + 02:21:00:a1:48:a8:32:d1:05:09:6b:1c:eb:89:12:66:d8:38: + a1:c4:5c:89:09:0f:fd:e9:c0:3b:1d:fb:cd:b5:4c:31:68 +-----BEGIN CERTIFICATE----- +MIIC2DCCAn6gAwIBAgIBATAKBggqgRzPVQGDdTCBrDELMAkGA1UEBhMCVVMxEDAO +BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAoMC3dvbGZT +U0xfc20yMQ8wDQYDVQQLDAZDQS1zbTIxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNv +bTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTEXMBUGCgmSJomT8ixk +AQEMB3dvbGZTU0wwHhcNMjMwMjE1MDYyMzA3WhcNMjUxMTExMDYyMzA3WjCBsDEL +MAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4x +FDASBgNVBAoMC3dvbGZTU0xfc20yMRMwEQYDVQQLDApTZXJ2ZXItc20yMRgwFgYD +VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xmU1NMMFowFAYIKoEcz1UBgi0GCCqB +HM9VAYItA0IABJRwK0bkXg9B+48tNApBQBle+9QdEaz69ZM3xvqHCPcWHyzOMECd +T6YqCqHWlTPDpgOY5o0FNLCXDN6kx89Tj9GjgYkwgYYwHQYDVR0OBBYEFGeuYP9+ +Gw+Vrh+CWfJsVi2T7xcyMB8GA1UdIwQYMBaAFEcKSH67AqhaJlcrGal7YYt/XZlu +MAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUF +BwMBMBEGCWCGSAGG+EIBAQQEAwIGQDAKBggqgRzPVQGDdQNIADBFAiAbypQof/ay +DTFDUOHVNBfdrzregQZnmrMGIn5k7P0OuQIhAKFIqDLRBQlrHOuJEmbYOKHEXIkJ +D/3pwDsd+821TDFo +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: SM2-with-SM3 + Issuer: C = US, ST = Montana, L = Bozeman, O = wolfSSL_SM2, OU = Root-SM2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Validity + Not Before: Feb 15 06:23:07 2023 GMT + Not After : Nov 11 06:23:07 2025 GMT + Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL_sm2, OU = CA-sm2, CN = www.wolfssl.com, emailAddress = info@wolfssl.com, UID = wolfSSL + Subject Public Key Info: + Public Key Algorithm: sm2 + Public-Key: (256 bit) + pub: + 04:21:92:f7:cb:24:df:64:4d:ba:ab:66:7b:83:75: + a9:29:e7:ff:64:63:b6:d5:42:80:20:bd:e2:e2:02: + 12:3b:8e:b4:00:95:09:80:cb:56:ed:4b:ca:8d:57: + e6:ae:05:d3:76:27:63:71:39:89:b7:69:e6:48:80: + ae:d1:a9:48:12 + ASN1 OID: SM2 + X509v3 extensions: + X509v3 Subject Key Identifier: + 47:0A:48:7E:BB:02:A8:5A:26:57:2B:19:A9:7B:61:8B:7F:5D:99:6E + X509v3 Authority Key Identifier: + 34:1D:79:44:15:79:A1:B1:63:99:E3:ED:65:7C:64:89:80:FF:B8:EC + X509v3 Basic Constraints: critical + CA:TRUE + X509v3 Key Usage: critical + Digital Signature, Certificate Sign, CRL Sign + Signature Algorithm: SM2-with-SM3 + Signature Value: + 30:45:02:20:47:4e:00:03:ab:34:a1:af:59:39:8f:60:36:bf: + 89:88:42:41:27:c1:dd:57:c9:79:cb:1f:56:5c:16:b5:28:bd: + 02:21:00:8b:2e:25:eb:21:9b:a9:2b:a6:6a:5b:db:a7:c7:2b: + 11:df:73:15:ad:e4:c5:c3:c2:f3:b4:b4:67:af:d7:51:1c +-----BEGIN CERTIFICATE----- +MIICljCCAjygAwIBAgIBATAKBggqgRzPVQGDdTCBlTELMAkGA1UEBhMCVVMxEDAO +BgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAoMC3dvbGZT +U0xfU00yMREwDwYDVQQLDAhSb290LVNNMjEYMBYGA1UEAwwPd3d3LndvbGZzc2wu +Y29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMDIxNTA2 +MjMwN1oXDTI1MTExMTA2MjMwN1owgawxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdN +b250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQKDAt3b2xmU1NMX3NtMjEP +MA0GA1UECwwGQ0Etc20yMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkq +hkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20xFzAVBgoJkiaJk/IsZAEBDAd3b2xm +U1NMMFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABCGS98sk32RNuqtme4N1qSnn +/2RjttVCgCC94uICEjuOtACVCYDLVu1Lyo1X5q4F03YnY3E5ibdp5kiArtGpSBKj +YzBhMB0GA1UdDgQWBBRHCkh+uwKoWiZXKxmpe2GLf12ZbjAfBgNVHSMEGDAWgBQ0 +HXlEFXmhsWOZ4+1lfGSJgP+47DAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE +AwIBhjAKBggqgRzPVQGDdQNIADBFAiBHTgADqzShr1k5j2A2v4mIQkEnwd1XyXnL +H1ZcFrUovQIhAIsuJeshm6krpmpb26fHKxHfcxWt5MXDwvO0tGev11Ec +-----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level1_key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level1_key.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level3_key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level3_key.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level5_key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_fast_level5_key.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level1_key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level1_key.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level3_key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level3_key.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level5_key.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/sphincs/bench_sphincs_small_level5_key.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-bad-neg-int.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-bad-neg-int.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-bad-oid.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-bad-oid.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-bad-utf8.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-bad-utf8.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ia.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIUAeB5+1yDaz1AecN7cuvF7gAWKJowDQYJKoZIhvcNAQEL +MIIEAzCCAuugAwIBAgIUEEaaRNPZiiXZqFxu6gwfzxyXYkYwDQYJKoZIhvcNAQEL BQAwgZ8xCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApRdWVlbnNsYW5kMREwDwYDVQQH DAhCcmlzYmFuZTEUMBIGA1UECgwLd29sZlNTTCBJbmMxFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xIjAgBgkqhkiG9w0BCQEW -E3N1cHBvcnRAd29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjEx -NzUwWjCBnzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClF1ZWVuc2xhbmQxETAPBgNV +E3N1cHBvcnRAd29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI5WhcNMjYwOTA4MjIx +OTI5WjCBnzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClF1ZWVuc2xhbmQxETAPBgNV BAcMCEJyaXNiYW5lMRQwEgYDVQQKDAt3b2xmU1NMIEluYzEUMBIGA1UECwwLRW5n aW5lZXJpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEiMCAGCSqGSIb3DQEJ ARYTc3VwcG9ydEB3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC @@ -15,10 +15,10 @@ Srzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgI vDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaM1MDMwDQYDVR02AQH/BAMCAQEw IgYJYIZIAYb4QgENBBUWE1Rlc3RpbmcgaW5oaWJpdCBhbnkwDQYJKoZIhvcNAQEL -BQADggEBALE59GIo5D+Z4Y554KkRiG3XAH/SVrdJDkH1f+mc4QLK2wd7DBVb84Dt -IifPslP9kT+56ngUR0SAmag3ERIsPDAzdU+ZPKwBFEmnxBKU0+5KqP90SpO1gWUt -QxIpGiHQkRSb+B5F/Ao3pn0XHSlIYpUkAsCAKP/pvuFp9j4JdCTHeYmBnXPoSvYJ -GYidJB7FYpnxSfnMM7MxIOmNXdama+cRmHX5GIlhw66vumAOEOGRULpf1kMQZE1b -th6tenhNcqdXZHWM7swvCjaOEZi2p0OWips0BFoK35fqNT9GR1UTflimmqEocLIN -N5ahRfOrioEbb3qPC3endm/58s3vbT4= +BQADggEBAHOBELBVkuhE2xGCnFEBk7Gvsphqe4GcsKYRp/JiyOMp+Fa01A+F7aiU +vVi9JOdOlEFsbd32YoTdPCSqtSpzXXLJ/BdaREWvVLg3OshiwhNPPA2Q09gQI8ES +I9yq7kWLesDGVLcXpdM+QHovNT8wrru8wi/LoWpKNHP4TYy1Tvuxr2ngC2UygsSX +RGymPImVO8EPNBNh8zgP3p6zjyRDWs7tttct2u28mSR+ouRJ/8pQDp0ZVNbvedxI +nj02OpIijuSj/CEwV3AuPJWaUbCxyL1bvnPcG1HKqvvt5/Ljo8h0pLRUpjwJDvFk +8JWbuQSQThwRAsWtRO7RarZN7+P1AmI= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-joi.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIFXDCCBESgAwIBAgIUaQWOPwyn4CGSb0DgOh1jzF+V5k8wDQYJKoZIhvcNAQEL +MIIFXDCCBESgAwIBAgIUWY9gYq+bg6hpLLlEPeuSQjQPvW8wDQYJKoZIhvcNAQEL BQAwgccxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHdv bGZzc3NsLmNvbTETMBEGCysGAQQBgjc8AgEDEwJVUzEbMBkGCysGAQQBgjc8AgEC -DApDYWxpZm9ybmlhMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgccx +DApDYWxpZm9ybmlhMB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgccx CzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFu MREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UE AwwPd3d3LndvbGZzc2wuY29tMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHdvbGZzc3Ns @@ -21,11 +21,11 @@ YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xIDAeBgkqhkiG9w0BCQEWEWluZm9Ad29sZnNz c2wuY29tMRMwEQYLKwYBBAGCNzwCAQMTAlVTMRswGQYLKwYBBAGCNzwCAQIMCkNh -bGlmb3JuaWGCFGkFjj8Mp+Ahkm9A4DodY8xfleZPMAwGA1UdEwQFMAMBAf8wDQYJ -KoZIhvcNAQELBQADggEBAHmIYCAILfDm0V41rvanugB+jjHSIf5zwM7hMAOuiQla -WywZuMtYCI0R/iQCipH0gvBrTuNIlEqIm8Wh/32+qmomAmMz7iUMg5DWqZKXyk3x -IQ93qRSF7EX9piHdQ++IjVkWzl4bXR2cW2A+nQW2EMFiJunpfu1oC07PvgigJ+n3 -uLMxNqN2p04PYcgEOQG1Jm4FasBrng55ff7XHe4msErQGlQF1D0B3xhzjh6Msaki -DS0M3n1U9Pzc+2WP1FW/mMBu22+R6yY0yCHzCY0zZWdmihL8HWlZuxcYHcjK4ABU -CQHTu3UCCfgVDsiCo+BQ9T9sFReD8r2azMLvmKFOhxw= +bGlmb3JuaWGCFFmPYGKvm4OoaSy5RD3rkkI0D71vMAwGA1UdEwQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBALY9RCPRvuHf04Mxqv6UJZv7MslCwQwbavD3ZYigNrlS +f+qhS7SqFcUyXGbOfpiFCgobnwxK/Xg2K20xuauA8tIaJ3egeu0KFZUAaz4EOMvQ +IWSUwp5maDKjQw7PX+W5GYY73uUxjDMlIFD0lVDTByeRp+YNfTZEBbjZlKDFohEf +BEIyONlZdOvAIR+9dAZRjfF94WZuiUluq90yCTnDT2UIor1IzS964LuropYSH3oV +QAdPOa87r5nY4tLScPU8hxfOP1i8aCuELiHgo6XuZZXt1qlBb7kIXz/rITd9ZvRm +WVysY/2A38K7CBiv0biKfS83PVai8HuFKR+yZ1wxtk0= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-mnc.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-mnc.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-multiple.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIFmDCCBICgAwIBAgIUNNF2CUskXxBvm3qki4B40Wb5k28wDQYJKoZIhvcNAQEL +MIIFmDCCBICgAwIBAgIUOjAPanhO0Ayey1xIEr6HkMHASLcwDQYJKoZIhvcNAQEL BQAwgcIxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApRdWVlbnNsYW5kMREwDwYDVQQH DAhCcmlzYmFuZTEUMBIGA1UECgwLd29sZlNTTCBJbmMxFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xIjAgBgkqhkiG9w0BCQEW E3N1cHBvcnRAd29sZnNzbC5jb20xDzANBgNVBBEMBjU2LTEzMTEQMA4GA1UECQwH -TWFpbiBTdDAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIHCMQswCQYD +TWFpbiBTdDAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIHCMQswCQYD VQQGEwJBVTETMBEGA1UECAwKUXVlZW5zbGFuZDERMA8GA1UEBwwIQnJpc2JhbmUx FDASBgNVBAoMC3dvbGZTU0wgSW5jMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMSIwIAYJKoZIhvcNAQkBFhNzdXBwb3J0QHdv @@ -22,11 +22,11 @@ EQYDVQQIDApRdWVlbnNsYW5kMREwDwYDVQQHDAhCcmlzYmFuZTEUMBIGA1UECgwL d29sZlNTTCBJbmMxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xIjAgBgkqhkiG9w0BCQEWE3N1cHBvcnRAd29sZnNzbC5jb20x -DzANBgNVBBEMBjU2LTEzMTEQMA4GA1UECQwHTWFpbiBTdIIUNNF2CUskXxBvm3qk -i4B40Wb5k28wDQYJKoZIhvcNAQELBQADggEBAKnvKWxqivq29pOtbRmx34PRSqLQ -7fDDwO0UpBlDNEX7ek4aX1HAekzdppo08/8kGgCV/Bg/oOxbiZoFHpsH6U3YMTAZ -kRKxeLzzdEfEHrxcX577PG15RAUKT+7TET0LO9CWN54UKU37q5QLL0MXsd/tYuQX -U1m56Vs+FoYBPNn7qZKsApBpm4S50aVbz/jweNyfIv1yuZSegGA/qkVG4+7yKmRP -056FDMHBuNStUoVDWl+9IV9+kJ5x1xhn5gE6EpI7wkBXOEm2VOFrYBBv4AyYrQaI -x7SIdXZZg6UGXbDvpMRh8PtScPmY/YM0NF+Igkisv4Avc+VD/6tKX48bqjs= +DzANBgNVBBEMBjU2LTEzMTEQMA4GA1UECQwHTWFpbiBTdIIUOjAPanhO0Ayey1xI +Er6HkMHASLcwDQYJKoZIhvcNAQELBQADggEBACLwxkk4RY5cD1/a47cHuRaDPn22 +XgpK5tZBMtU5PmkakKNWkW2xGTAwTmycus5iXOAxforA7PrGzFKlAnS+TmIhCFwv +B0IwNZzCCwtQs3ilouOJyf30GxpV5BSJspBdjLflC9Vt+7OrjnRM84a4VaMNttps +PlcGoZL1lLI2xtkhWXLeC1UdhXG8gsNXT/TpPOJ1+T4ElNr/RVTG60sp446f0kXd +kX/dCrUD8+FTX5WZQmaawRHPRfV1d597dNuj539Za8e+XXJ5iOs0M+6YTqI9tvdA +z23hUIs1BawnRcRYGS0rEYERBwcepvyEkQZoFfGKLoSuziRMIqnrQe3IzZ8= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIENTCCAx2gAwIBAgIUeKrw9V6cyfDM2XE9+OuZfrvdTzQwDQYJKoZIhvcNAQEL +MIIENTCCAx2gAwIBAgIUZubV8ronA4VrOHLZUH2CnIIiunUwDQYJKoZIhvcNAQEL BQAwezELMAkGA1UEBhMCQVUxEzARBgNVBAgMClF1ZWVuc2xhbmQxETAPBgNVBAcM CEJyaXNiYW5lMRQwEgYDVQQKDAt3b2xmU1NMIEluYzEUMBIGA1UECwwLRW5naW5l -ZXJpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTAeFw0yMjEyMTYyMTE3NTBa -Fw0yNTA5MTEyMTE3NTBaMHsxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApRdWVlbnNs +ZXJpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTAeFw0yMzEyMTMyMjE5Mjla +Fw0yNjA5MDgyMjE5MjlaMHsxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApRdWVlbnNs YW5kMREwDwYDVQQHDAhCcmlzYmFuZTEUMBIGA1UECgwLd29sZlNTTCBJbmMxFDAS BgNVBAsMC0VuZ2luZWVyaW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAlQjhV0HycW230kVBJwFlxkWu @@ -16,10 +16,10 @@ MBaAFLMRMsmSmITiyfjQO24DQsofDo48MBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD VR0PAQH/BAQDAgGGMB4GA1UdHgEB/wQUMBKgEDAOgQwud29sZnNzbC5jb20wJwYJ YIZIAYb4QgENBBoWGFRlc3RpbmcgbmFtZSBjb25zdHJhaW50czANBgkqhkiG9w0B -AQsFAAOCAQEANaCy9LmxJKx2mDhMldRcjDORnU13FqC7DIlTlzSwWPXsXk7lI2xQ -p7Tpu3nRo4YFecTray5xSBIyjslh4GxB8n2k8z9wwJfBLAWS3MCR43Wj/oQfaT9+ -Jau60zRZFv3BZ5ltHnBHFssx3oBp/VxH02k8DV3o1w9ZCtOLDFWxFFBAwzw2Q461 -ktz2Gholyq77cbiwGrtZRPWWyA0+pPAQHpoltIU9GM8LpQhdJ67VECMhd/Qo88LQ -A8/SVALY9zmsXd6rovl1kyTx0diktgUgzEilBePbG2JPn/gULdzBQHrkw+G/M9bC -QI75PNPRqyI3aJ+xVvwF5JXuRgoxp2YRNA== +AQsFAAOCAQEALtoSqDAnQmXFMjZk6XRf+uvBu6/fH+1tCmL828q03s2Mee+sRF1m +C9mFRT1Q+M7pvqEb9t+hgQ9jry68EFBqC2VY6WWl95chrP+uojdZO6sDbMWsBxDi +oD/ZWa8jjDtT+JJNTY0TVKfg83mSRC+1nQxHsV4zAlXsRHinG+pmzQgkYUrNCpjG +d12z2bRqYBignVENubQEAZT945sioMuwO8jD8CtWd7Ie5qc7WFxBVO/wo7j2Slbt +/dy+sVc+IHN7fe6MVD9cGivYpKmSJvw/VtiZbpgCvIX93fwZj7ltEiZBaGv2mNRx +jdUVGWzyjnQTgIRuBX7Oa7Q8r89+s3B9oA== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ncdns.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ncdns.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ncmixed.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ncmixed.der differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-nct.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,10 +1,10 @@ -----BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIUHEEyl9X7Xhzn1Nu84C963yec+nUwDQYJKoZIhvcNAQEL +MIIEGDCCAwCgAwIBAgIUQhQ9kNUYipe8daCTUP2VaziSi08wDQYJKoZIhvcNAQEL BQAwgZ8xCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApRdWVlbnNsYW5kMREwDwYDVQQH DAhCcmlzYmFuZTEUMBIGA1UECgwLd29sZlNTTCBJbmMxFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xIjAgBgkqhkiG9w0BCQEW -E3N1cHBvcnRAd29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjEx -NzUwWjCBnzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClF1ZWVuc2xhbmQxETAPBgNV +E3N1cHBvcnRAd29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI5WhcNMjYwOTA4MjIx +OTI5WjCBnzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClF1ZWVuc2xhbmQxETAPBgNV BAcMCEJyaXNiYW5lMRQwEgYDVQQKDAt3b2xmU1NMIEluYzEUMBIGA1UECwwLRW5n aW5lZXJpbmcxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEiMCAGCSqGSIb3DQEJ ARYTc3VwcG9ydEB3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC @@ -15,10 +15,10 @@ Srzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgI vDMgs1gip6rrxOHmYYPF0pbf2dBPrdcCAwEAAaNKMEgwFAYJYIZIAYb4QgEBAQH/ BAQDAgZAMDAGCWCGSAGG+EIBDQQjFiFUZXN0aW5nIE5ldHNjYXBlIENlcnRpZmlj -YXRlIFR5cGUwDQYJKoZIhvcNAQELBQADggEBABlN0/+RfrXW2zU9KrYjxTtHeTrS -dDSs1da5SXQ3cWRjxdh+JdxjOQv+sdDiRL/FrVtv5g286rXaOYSqo5BcVs5k+8kE -S4tWg7CAu8BdQ3tACJTUVxEzmPWD0JGPDTsZ3XhrVL0+fcv0iGFR55+aGHp2fTY4 -+Dax6uaJciaQfy9G0r64z0fMhE5sJfPcK+mQjxQE+NYM1lxY1oCN1i5jA5kz8dYg -/t6RJb0DAbcsLOrv3dcA12A4bIPK2lR2qCly47wmzmq8iIVdGtsyAa5jgjkXn23G -k+5t/eL+zHd4V3isuhS1vq3t2qMYLdO0IEMP3mHbu8Z5HIkUuu54VXG4sK8= +YXRlIFR5cGUwDQYJKoZIhvcNAQELBQADggEBABmExniLoyrtx7sbbQS8nubTyoYv +KfAreqCd5+2c2Vmq5o0wkA2HZLVlFi7ENewT0YaEqiP3HyPsu62P0N48GB43jPBg +N58V+d/P8LERKx2/wjCfq15VX4Iave38K+/CzG+WKbaWc93ADUpOFvaZIejjiErx +vQr3L2LyrEB0o6CDi+BPpKSQqW2O91HeIE+3P/trM2DF7RJApt0vVczxkepWxfa1 +piamsWT9rdE+7yeG9/I7RNY51dXQBnElJSULhrhBhqtRaCUcDe+KOocFq2NgEhku +7IegJ888gZ5oZlYqOj9TUzS0ayXw8H8/6ZboH/AsvxBdQN7xOqmsDbpe3TA= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir-exc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIE/TCCA+WgAwIBAgIUJu3gfaMkZ5AlwkydLDUcSY3VJDUwDQYJKoZIhvcNAQEL +MIIE/TCCA+WgAwIBAgIUA9ASAQLXcBK7u66dI1+5Cvh9DMowDQYJKoZIhvcNAQEL BQAwgZUxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHdv -bGZzc3NsLmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGVMQsw +bGZzc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIGVMQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjER MA8GA1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMM D3d3dy53b2xmc3NsLmNvbTEgMB4GCSqGSIb3DQEJARYRaW5mb0B3b2xmc3NzbC5j @@ -18,12 +18,12 @@ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHdvbGZzc3NsLmNv -bYIUJu3gfaMkZ5AlwkydLDUcSY3VJDUwDAYDVR0TBAUwAwEB/zA2BgNVHR4BAf8E +bYIUA9ASAQLXcBK7u66dI1+5Cvh9DMowDAYDVR0TBAUwAwEB/zA2BgNVHR4BAf8E LDAqoSgwJqQkMCIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMA0G -CSqGSIb3DQEBCwUAA4IBAQAqjVk0N3Cg5QSomQu99y0WFn6Gk1Qymh8O5tBK/ftG -XS0HJk8R7vNPzDGFH07sSyJyQtRiZV8zMLSc8LZL7blA7Lwf1kanuOUMywLyg9S2 -qakgfuU+Q1/NeSJp+rCexv1xvTTGIYC36kchc6YArUVQAFrT3DFlQoZZ35Ohwzy8 -BKB9w5c3jHFjjp03EftmeMGIBpUSxKRnCaofLIUvdtaIKoUcuYezC9fXsFuHrL62 -BS5CPg97JCVyfoKcUYh9Ml7K8JPBJJt8xEWkBY6JUn3DgC8W4TYVjTB4N2Vh2yLF -XrwPGRhGyKDZnoGagfeR5OyM47dXSpxMqsfafLq3WfrL +CSqGSIb3DQEBCwUAA4IBAQCAF2rfhuz15dhfIlAaTKZ5caj09r9vdvsPKED2LsN1 +ufvD/DHJsFLLlL/a9Rk5HzaAC2/V7D1nytGdo+cDJAbbZP4jX7xKvTSPiXGwM85b +xoZiCjApK6BBzBAEvPVO2g7XTPDAUtzSFUcibS9OXOBMQ8Kqua4oSAy02bpWTTj2 +1wZWr3okbRVuFNmX969wqJ2TA10QjySgMC7NoaW5sKG5Be65f0e8ClQ1UdDBq+7C +TUkI1+eSjpPtRH38T89pK+zqKMwCq/Ugp/yDvmTn9tWjtdAE9bS92+3HBo/smJH7 +pTpRGG18pD7Su5B9QlSSbNZ0Sv5BJieCk9yQo81fcGtE -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-ext-ndir.pem 2024-08-03 07:30:00.000000000 +0000 @@ -1,9 +1,9 @@ -----BEGIN CERTIFICATE----- -MIIE6DCCA9CgAwIBAgIUNsxBAdWJBQlYCzTDYiIo8S74HgwwDQYJKoZIhvcNAQEL +MIIE6DCCA9CgAwIBAgIUGsYHXq1zN8MtgL5Bg4sW7+8Uj+gwDQYJKoZIhvcNAQEL BQAwgZUxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHdv -bGZzc3NsLmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGVMQsw +bGZzc3NsLmNvbTAeFw0yMzEyMTMyMjE5MjlaFw0yNjA5MDgyMjE5MjlaMIGVMQsw CQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjER MA8GA1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMM D3d3dy53b2xmc3NsLmNvbTEgMB4GCSqGSIb3DQEJARYRaW5mb0B3b2xmc3NzbC5j @@ -18,12 +18,12 @@ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHdvbGZzc3NsLmNv -bYIUNsxBAdWJBQlYCzTDYiIo8S74HgwwDAYDVR0TBAUwAwEB/zAhBgNVHR4BAf8E -FzAVoBMwEaQPMA0xCzAJBgNVBAYTAlVTMA0GCSqGSIb3DQEBCwUAA4IBAQCdTZp3 -BHmo6y6oSskfcgc1WDoh1XIfNe0oIMc/uUSfaM+fSyiTuo7fPZIafUDsNjaH4DNZ -NQil/PalzlJviA0dZPyoYP2RM6olkWrlmtLjcHQ9HvQnMPPmzEM6zbuB2wbMym6O -H6012H+xj4jO1cgrrCcfUPOIquTPOuQY7VmJq4cPgp+hs6rBBAtqU9QeGrvgASpV -1M3dl6vg8lioBqsymflrPWYjgz/bKFmZZixT+SJ7Sd8dznKccBao/XMqP04iu1Hm -UFIrS6JUqr1lmJltK0XbKo0kjd6A9QqTNjkt/Fp2kZAt6kXhhiwINXNCl/1rtjTd -yUEQQYTLVwl4opQH +bYIUGsYHXq1zN8MtgL5Bg4sW7+8Uj+gwDAYDVR0TBAUwAwEB/zAhBgNVHR4BAf8E +FzAVoBMwEaQPMA0xCzAJBgNVBAYTAlVTMA0GCSqGSIb3DQEBCwUAA4IBAQA/NW29 +VNYpDOtANk/T8s2F9pYMWNR2uCV+9uCCGHHI2gCjZKq1megHkN90dlBiDCcyjLpO +Waj62FeNppBoYaeTO77clNDyloJl/EXRqPUgc7IK4J2KNq0emrc2Xce08I8pXuEs +dh5H6W/9m5Y0N0SBB3xdPGzg6RPB3nZNiyoeDRwzUhIDLwl/i0qA9ZtEjhFIb3+u +w7LbDNAXgz5T8ZfRGHgoOutrqra2lh9LEoALWLJ+ZxY35vr0ZLf4mVAyj/cr67EA +uTM/xeJbtj1y5/ADmenbW0nUcSeS/Eyp1s9eFC4hOQDnAQALzi2zrvK2LlxON6Rx +3OyA5WbvJJbFdxxH -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.cfg mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.cfg --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.cfg 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.cfg 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,150 @@ +[ req ] +default_bits = 2048 +prompt = no +distinguished_name = dn +x509_extensions = extensions + +[ dn ] +C = US +ST = Montana +L = Bozeman +O = wolfSSL Inc +OU = Engineering +CN = www.wolfssl.com + +[ extensions ] +subjectAltName = @alt_names + +[ alt_names ] +DNS.1 = example1.com +DNS.2 = example2.com +DNS.3 = example3.com +DNS.4 = example4.com +DNS.5 = example5.com +DNS.6 = example6.com +DNS.7 = example7.com +DNS.8 = example8.com +DNS.9 = example9.com +DNS.10 = example10.com +DNS.11 = example11.com +DNS.12 = example12.com +DNS.13 = example13.com +DNS.14 = example14.com +DNS.15 = example15.com +DNS.16 = example16.com +DNS.17 = example17.com +DNS.18 = example18.com +DNS.19 = example19.com +DNS.20 = example20.com +DNS.21 = example21.com +DNS.22 = example22.com +DNS.23 = example23.com +DNS.24 = example24.com +DNS.25 = example25.com +DNS.26 = example26.com +DNS.27 = example27.com +DNS.28 = example28.com +DNS.29 = example29.com +DNS.30 = example30.com +DNS.31 = example31.com +DNS.32 = example32.com +DNS.33 = example33.com +DNS.34 = example34.com +DNS.35 = example35.com +DNS.36 = example36.com +DNS.37 = example37.com +DNS.38 = example38.com +DNS.39 = example39.com +DNS.40 = example40.com +DNS.41 = example41.com +DNS.42 = example42.com +DNS.43 = example43.com +DNS.44 = example44.com +DNS.45 = example45.com +DNS.46 = example46.com +DNS.47 = example47.com +DNS.48 = example48.com +DNS.49 = example49.com +DNS.50 = example50.com +DNS.51 = example51.com +DNS.52 = example52.com +DNS.53 = example53.com +DNS.54 = example54.com +DNS.55 = example55.com +DNS.56 = example56.com +DNS.57 = example57.com +DNS.58 = example58.com +DNS.59 = example59.com +DNS.60 = example60.com +DNS.61 = example61.com +DNS.62 = example62.com +DNS.63 = example63.com +DNS.64 = example64.com +DNS.65 = example65.com +DNS.66 = example66.com +DNS.67 = example67.com +DNS.68 = example68.com +DNS.69 = example69.com +DNS.70 = example70.com +DNS.71 = example71.com +DNS.72 = example72.com +DNS.73 = example73.com +DNS.74 = example74.com +DNS.75 = example75.com +DNS.76 = example76.com +DNS.77 = example77.com +DNS.78 = example78.com +DNS.79 = example79.com +DNS.80 = example80.com +DNS.81 = example81.com +DNS.82 = example82.com +DNS.83 = example83.com +DNS.84 = example84.com +DNS.85 = example85.com +DNS.86 = example86.com +DNS.87 = example87.com +DNS.88 = example88.com +DNS.89 = example89.com +DNS.90 = example90.com +DNS.91 = example91.com +DNS.92 = example92.com +DNS.93 = example93.com +DNS.94 = example94.com +DNS.95 = example95.com +DNS.96 = example96.com +DNS.97 = example97.com +DNS.98 = example98.com +DNS.99 = example99.com +DNS.100 = example100.com +DNS.101 = example101.com +DNS.102 = example102.com +DNS.103 = example103.com +DNS.104 = example104.com +DNS.105 = example105.com +DNS.106 = example106.com +DNS.107 = example107.com +DNS.108 = example108.com +DNS.109 = example109.com +DNS.110 = example110.com +DNS.111 = example111.com +DNS.112 = example112.com +DNS.113 = example113.com +DNS.114 = example114.com +DNS.115 = example115.com +DNS.116 = example116.com +DNS.117 = example117.com +DNS.118 = example118.com +DNS.119 = example119.com +DNS.120 = example120.com +DNS.121 = example121.com +DNS.122 = example122.com +DNS.123 = example123.com +DNS.124 = example124.com +DNS.125 = example125.com +DNS.126 = example126.com +DNS.127 = example127.com +DNS.128 = example128.com +DNS.129 = example129.com +DNS.130 = example130.com + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-altnames.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,63 @@ +-----BEGIN CERTIFICATE----- +MIILZjCCCk6gAwIBAgIURc0vEAYKqmZm+uhVYVYcdTDD5jIwDQYJKoZIhvcNAQEL +BQAwdzELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv +emVtYW4xFDASBgNVBAoMC3dvbGZTU0wgSW5jMRQwEgYDVQQLDAtFbmdpbmVlcmlu +ZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMB4XDTI0MDUzMDAxMzQ1NloXDTI0 +MDYyOTAxMzQ1NlowdzELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAO +BgNVBAcMB0JvemVtYW4xFDASBgNVBAoMC3dvbGZTU0wgSW5jMRQwEgYDVQQLDAtF +bmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4MxlWlPvDK577o82h5LrZDs/1eFX/xEI2ICZ +xvQ3rMm5cdUxsnYeExXMP8Fzlx4RsyYeNCJo8wdKFtTbrkyTGE1tlrQ6jZ20aYA0 +V38GkQhVNzG5EIOBm9x7Zl7L4kgJEAG0a36jOrCuP9JOxo6EtyezF+KyN9TEzxxZ +udlaV3JoxghmvaBzRO07vmomtxwtm/5K4gM3XCcYyDhxf7J357s6Ra8nhefOT/PV +rB/mSHUcH0nvt2mNZdJyDOUBNx0IAVL1CaJh3pT14Ql03igSbeRr7pVtiioixZTD +xB1npmn0kgTa4zNR11EWHX0nBwEJST3QofkJA+odSFQBG1tCTQIDAQABo4IH6DCC +B+QwggfBBgNVHREEgge4MIIHtIIMZXhhbXBsZTEuY29tggxleGFtcGxlMi5jb22C +DGV4YW1wbGUzLmNvbYIMZXhhbXBsZTQuY29tggxleGFtcGxlNS5jb22CDGV4YW1w +bGU2LmNvbYIMZXhhbXBsZTcuY29tggxleGFtcGxlOC5jb22CDGV4YW1wbGU5LmNv +bYINZXhhbXBsZTEwLmNvbYINZXhhbXBsZTExLmNvbYINZXhhbXBsZTEyLmNvbYIN +ZXhhbXBsZTEzLmNvbYINZXhhbXBsZTE0LmNvbYINZXhhbXBsZTE1LmNvbYINZXhh +bXBsZTE2LmNvbYINZXhhbXBsZTE3LmNvbYINZXhhbXBsZTE4LmNvbYINZXhhbXBs +ZTE5LmNvbYINZXhhbXBsZTIwLmNvbYINZXhhbXBsZTIxLmNvbYINZXhhbXBsZTIy +LmNvbYINZXhhbXBsZTIzLmNvbYINZXhhbXBsZTI0LmNvbYINZXhhbXBsZTI1LmNv +bYINZXhhbXBsZTI2LmNvbYINZXhhbXBsZTI3LmNvbYINZXhhbXBsZTI4LmNvbYIN +ZXhhbXBsZTI5LmNvbYINZXhhbXBsZTMwLmNvbYINZXhhbXBsZTMxLmNvbYINZXhh +bXBsZTMyLmNvbYINZXhhbXBsZTMzLmNvbYINZXhhbXBsZTM0LmNvbYINZXhhbXBs +ZTM1LmNvbYINZXhhbXBsZTM2LmNvbYINZXhhbXBsZTM3LmNvbYINZXhhbXBsZTM4 +LmNvbYINZXhhbXBsZTM5LmNvbYINZXhhbXBsZTQwLmNvbYINZXhhbXBsZTQxLmNv +bYINZXhhbXBsZTQyLmNvbYINZXhhbXBsZTQzLmNvbYINZXhhbXBsZTQ0LmNvbYIN +ZXhhbXBsZTQ1LmNvbYINZXhhbXBsZTQ2LmNvbYINZXhhbXBsZTQ3LmNvbYINZXhh +bXBsZTQ4LmNvbYINZXhhbXBsZTQ5LmNvbYINZXhhbXBsZTUwLmNvbYINZXhhbXBs +ZTUxLmNvbYINZXhhbXBsZTUyLmNvbYINZXhhbXBsZTUzLmNvbYINZXhhbXBsZTU0 +LmNvbYINZXhhbXBsZTU1LmNvbYINZXhhbXBsZTU2LmNvbYINZXhhbXBsZTU3LmNv +bYINZXhhbXBsZTU4LmNvbYINZXhhbXBsZTU5LmNvbYINZXhhbXBsZTYwLmNvbYIN +ZXhhbXBsZTYxLmNvbYINZXhhbXBsZTYyLmNvbYINZXhhbXBsZTYzLmNvbYINZXhh +bXBsZTY0LmNvbYINZXhhbXBsZTY1LmNvbYINZXhhbXBsZTY2LmNvbYINZXhhbXBs +ZTY3LmNvbYINZXhhbXBsZTY4LmNvbYINZXhhbXBsZTY5LmNvbYINZXhhbXBsZTcw +LmNvbYINZXhhbXBsZTcxLmNvbYINZXhhbXBsZTcyLmNvbYINZXhhbXBsZTczLmNv +bYINZXhhbXBsZTc0LmNvbYINZXhhbXBsZTc1LmNvbYINZXhhbXBsZTc2LmNvbYIN +ZXhhbXBsZTc3LmNvbYINZXhhbXBsZTc4LmNvbYINZXhhbXBsZTc5LmNvbYINZXhh +bXBsZTgwLmNvbYINZXhhbXBsZTgxLmNvbYINZXhhbXBsZTgyLmNvbYINZXhhbXBs +ZTgzLmNvbYINZXhhbXBsZTg0LmNvbYINZXhhbXBsZTg1LmNvbYINZXhhbXBsZTg2 +LmNvbYINZXhhbXBsZTg3LmNvbYINZXhhbXBsZTg4LmNvbYINZXhhbXBsZTg5LmNv +bYINZXhhbXBsZTkwLmNvbYINZXhhbXBsZTkxLmNvbYINZXhhbXBsZTkyLmNvbYIN +ZXhhbXBsZTkzLmNvbYINZXhhbXBsZTk0LmNvbYINZXhhbXBsZTk1LmNvbYINZXhh +bXBsZTk2LmNvbYINZXhhbXBsZTk3LmNvbYINZXhhbXBsZTk4LmNvbYINZXhhbXBs +ZTk5LmNvbYIOZXhhbXBsZTEwMC5jb22CDmV4YW1wbGUxMDEuY29tgg5leGFtcGxl +MTAyLmNvbYIOZXhhbXBsZTEwMy5jb22CDmV4YW1wbGUxMDQuY29tgg5leGFtcGxl +MTA1LmNvbYIOZXhhbXBsZTEwNi5jb22CDmV4YW1wbGUxMDcuY29tgg5leGFtcGxl +MTA4LmNvbYIOZXhhbXBsZTEwOS5jb22CDmV4YW1wbGUxMTAuY29tgg5leGFtcGxl +MTExLmNvbYIOZXhhbXBsZTExMi5jb22CDmV4YW1wbGUxMTMuY29tgg5leGFtcGxl +MTE0LmNvbYIOZXhhbXBsZTExNS5jb22CDmV4YW1wbGUxMTYuY29tgg5leGFtcGxl +MTE3LmNvbYIOZXhhbXBsZTExOC5jb22CDmV4YW1wbGUxMTkuY29tgg5leGFtcGxl +MTIwLmNvbYIOZXhhbXBsZTEyMS5jb22CDmV4YW1wbGUxMjIuY29tgg5leGFtcGxl +MTIzLmNvbYIOZXhhbXBsZTEyNC5jb22CDmV4YW1wbGUxMjUuY29tgg5leGFtcGxl +MTI2LmNvbYIOZXhhbXBsZTEyNy5jb22CDmV4YW1wbGUxMjguY29tgg5leGFtcGxl +MTI5LmNvbYIOZXhhbXBsZTEzMC5jb20wHQYDVR0OBBYEFLbtWbf+CESA0Xfsii18 +98iIet9AMA0GCSqGSIb3DQEBCwUAA4IBAQBCY+SvA+JFFZ1NwwEBcl5BDbTjTAgt +w+xlEK71C+KUdvFuMMftDjaESOTJXEsimz5TuYhCMmQwQJMTlaEuZnzyCetuyBwJ +eRAFopo4xRhJKQ6okJlOANPlmXehuPS+niiMMGxqBOjVyvPFZpdnj0oa6Mz/ewuP +gNlsLUUrA6YQZNGYq9rDb4r2CCtD+10xkUg1Pu+2eRHBkYP9VSJOvWTVLMj/mPwN +mh/pAxg50fl/t+m181AOu8KpIen3++54ljgo0v/O3SyO0d5zq8+vSTpjkfX3LPjH +DFyofMjOQ7lFnr7uwY9jmj//GUUg3nULmItMhcEJ3XE9ySoEwfP35OWC +-----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.cfg mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.cfg --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.cfg 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.cfg 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,61 @@ +[ req ] +default_bits = 2048 +prompt = no +distinguished_name = dn +x509_extensions = extensions + +[ dn ] +C = US +ST = Montana +L = Bozeman +O = wolfSSL Inc +OU = Engineering +CN = www.wolfssl.com + +[ extensions ] +basicConstraints=critical,CA:true +nameConstraints = permitted;DNS:.ex1.com,permitted;DNS:.ex2.com,permitted;\ +DNS:.ex3.com,permitted;DNS:.ex4.com,permitted;DNS:.ex5.com,permitted;\ +DNS:.ex6.com,permitted;DNS:.ex7.com,permitted;DNS:.ex8.com,permitted;\ +DNS:.ex9.com,permitted;DNS:.ex10.com,permitted;DNS:.ex11.com,permitted;\ +DNS:.ex12.com,permitted;DNS:.ex13.com,permitted;DNS:.ex14.com,permitted;\ +DNS:.ex15.com,permitted;DNS:.ex16.com,permitted;DNS:.ex17.com,permitted;\ +DNS:.ex18.com,permitted;DNS:.ex19.com,permitted;DNS:.ex20.com,permitted;\ +DNS:.ex21.com,permitted;DNS:.ex22.com,permitted;DNS:.ex23.com,permitted;\ +DNS:.ex24.com,permitted;DNS:.ex25.com,permitted;DNS:.ex26.com,permitted;\ +DNS:.ex27.com,permitted;DNS:.ex28.com,permitted;DNS:.ex29.com,permitted;\ +DNS:.ex30.com,permitted;DNS:.ex31.com,permitted;DNS:.ex32.com,permitted;\ +DNS:.ex33.com,permitted;DNS:.ex34.com,permitted;DNS:.ex35.com,permitted;\ +DNS:.ex36.com,permitted;DNS:.ex37.com,permitted;DNS:.ex38.com,permitted;\ +DNS:.ex39.com,permitted;DNS:.ex40.com,permitted;DNS:.ex41.com,permitted;\ +DNS:.ex42.com,permitted;DNS:.ex43.com,permitted;DNS:.ex44.com,permitted;\ +DNS:.ex45.com,permitted;DNS:.ex46.com,permitted;DNS:.ex47.com,permitted;\ +DNS:.ex48.com,permitted;DNS:.ex49.com,permitted;DNS:.ex50.com,permitted;\ +DNS:.ex51.com,permitted;DNS:.ex52.com,permitted;DNS:.ex53.com,permitted;\ +DNS:.ex54.com,permitted;DNS:.ex55.com,permitted;DNS:.ex56.com,permitted;\ +DNS:.ex57.com,permitted;DNS:.ex58.com,permitted;DNS:.ex59.com,permitted;\ +DNS:.ex60.com,permitted;DNS:.ex61.com,permitted;DNS:.ex62.com,permitted;\ +DNS:.ex63.com,permitted;DNS:.ex64.com,permitted;DNS:.ex65.com,permitted;\ +DNS:.ex66.com,permitted;DNS:.ex67.com,permitted;DNS:.ex68.com,permitted;\ +DNS:.ex69.com,permitted;DNS:.ex70.com,permitted;DNS:.ex71.com,permitted;\ +DNS:.ex72.com,permitted;DNS:.ex73.com,permitted;DNS:.ex74.com,permitted;\ +DNS:.ex75.com,permitted;DNS:.ex76.com,permitted;DNS:.ex77.com,permitted;\ +DNS:.ex78.com,permitted;DNS:.ex79.com,permitted;DNS:.ex80.com,permitted;\ +DNS:.ex81.com,permitted;DNS:.ex82.com,permitted;DNS:.ex83.com,permitted;\ +DNS:.ex84.com,permitted;DNS:.ex85.com,permitted;DNS:.ex86.com,permitted;\ +DNS:.ex87.com,permitted;DNS:.ex88.com,permitted;DNS:.ex89.com,permitted;\ +DNS:.ex90.com,permitted;DNS:.ex91.com,permitted;DNS:.ex92.com,permitted;\ +DNS:.ex93.com,permitted;DNS:.ex94.com,permitted;DNS:.ex95.com,permitted;\ +DNS:.ex96.com,permitted;DNS:.ex97.com,permitted;DNS:.ex98.com,permitted;\ +DNS:.ex99.com,permitted;DNS:.ex100.com,permitted;DNS:.ex101.com,permitted;\ +DNS:.ex102.com,permitted;DNS:.ex103.com,permitted;DNS:.ex104.com,permitted;\ +DNS:.ex105.com,permitted;DNS:.ex106.com,permitted;DNS:.ex107.com,permitted;\ +DNS:.ex108.com,permitted;DNS:.ex109.com,permitted;DNS:.ex110.com,permitted;\ +DNS:.ex111.com,permitted;DNS:.ex112.com,permitted;DNS:.ex113.com,permitted;\ +DNS:.ex114.com,permitted;DNS:.ex115.com,permitted;DNS:.ex116.com,permitted;\ +DNS:.ex117.com,permitted;DNS:.ex118.com,permitted;DNS:.ex119.com,permitted;\ +DNS:.ex120.com,permitted;DNS:.ex121.com,permitted;DNS:.ex122.com,permitted;\ +DNS:.ex123.com,permitted;DNS:.ex124.com,permitted;DNS:.ex125.com,permitted;\ +DNS:.ex126.com,permitted;DNS:.ex127.com,permitted;DNS:.ex128.com,permitted;\ +DNS:.ex129.com,permitted;DNS:.ex130.com + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.pem 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/cert-over-max-nc.pem 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,58 @@ +-----BEGIN CERTIFICATE----- +MIIKdzCCCV+gAwIBAgIUP2BNrIrxeGGYtoPzcrEMcF8RDbEwDQYJKoZIhvcNAQEL +BQAwdzELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv +emVtYW4xFDASBgNVBAoMC3dvbGZTU0wgSW5jMRQwEgYDVQQLDAtFbmdpbmVlcmlu +ZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMB4XDTI0MDUzMDAxNTE0M1oXDTI0 +MDYyOTAxNTE0M1owdzELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAO +BgNVBAcMB0JvemVtYW4xFDASBgNVBAoMC3dvbGZTU0wgSW5jMRQwEgYDVQQLDAtF +bmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr7XMOFVWne2YJvHK9odaZiLSFJ5l9FJqKLnc +VDPPjM++SdO/dU8/hO/e1B5r88NtXFJHztMbekIIQd7f0T3Lwru/FRkmqI3Q2Z5V +SYLJbrI3EiVg4eG07MI2DhHWg9cMnfENzYk4Q/Zhd2cGCsJUW4S37ye+M+VXDtlb +ZkQVN19uqrxmZESqVpa05AjsJcbVMwb4++ZkhXLrs0eUcLQpZxWehTvKO/FgcFbD +6kNkTBBNf3c/5AQCLugSLUGn1RgbNt9sBZ6zZPM3UOgeREfEcb5+B61RGQD/SMCR +o+VEMCkGmWw8b3B7tyRXweuHBZ5I+AOw9QHb7F5tkT8ih5FUrwIDAQABo4IG+TCC +BvUwDwYDVR0TAQH/BAUwAwEB/zCCBsEGA1UdHgSCBrgwgga0oIIGsDAKggguZXgx +LmNvbTAKggguZXgyLmNvbTAKggguZXgzLmNvbTAKggguZXg0LmNvbTAKggguZXg1 +LmNvbTAKggguZXg2LmNvbTAKggguZXg3LmNvbTAKggguZXg4LmNvbTAKggguZXg5 +LmNvbTALggkuZXgxMC5jb20wC4IJLmV4MTEuY29tMAuCCS5leDEyLmNvbTALggku +ZXgxMy5jb20wC4IJLmV4MTQuY29tMAuCCS5leDE1LmNvbTALggkuZXgxNi5jb20w +C4IJLmV4MTcuY29tMAuCCS5leDE4LmNvbTALggkuZXgxOS5jb20wC4IJLmV4MjAu +Y29tMAuCCS5leDIxLmNvbTALggkuZXgyMi5jb20wC4IJLmV4MjMuY29tMAuCCS5l +eDI0LmNvbTALggkuZXgyNS5jb20wC4IJLmV4MjYuY29tMAuCCS5leDI3LmNvbTAL +ggkuZXgyOC5jb20wC4IJLmV4MjkuY29tMAuCCS5leDMwLmNvbTALggkuZXgzMS5j +b20wC4IJLmV4MzIuY29tMAuCCS5leDMzLmNvbTALggkuZXgzNC5jb20wC4IJLmV4 +MzUuY29tMAuCCS5leDM2LmNvbTALggkuZXgzNy5jb20wC4IJLmV4MzguY29tMAuC +CS5leDM5LmNvbTALggkuZXg0MC5jb20wC4IJLmV4NDEuY29tMAuCCS5leDQyLmNv +bTALggkuZXg0My5jb20wC4IJLmV4NDQuY29tMAuCCS5leDQ1LmNvbTALggkuZXg0 +Ni5jb20wC4IJLmV4NDcuY29tMAuCCS5leDQ4LmNvbTALggkuZXg0OS5jb20wC4IJ +LmV4NTAuY29tMAuCCS5leDUxLmNvbTALggkuZXg1Mi5jb20wC4IJLmV4NTMuY29t +MAuCCS5leDU0LmNvbTALggkuZXg1NS5jb20wC4IJLmV4NTYuY29tMAuCCS5leDU3 +LmNvbTALggkuZXg1OC5jb20wC4IJLmV4NTkuY29tMAuCCS5leDYwLmNvbTALggku +ZXg2MS5jb20wC4IJLmV4NjIuY29tMAuCCS5leDYzLmNvbTALggkuZXg2NC5jb20w +C4IJLmV4NjUuY29tMAuCCS5leDY2LmNvbTALggkuZXg2Ny5jb20wC4IJLmV4Njgu +Y29tMAuCCS5leDY5LmNvbTALggkuZXg3MC5jb20wC4IJLmV4NzEuY29tMAuCCS5l +eDcyLmNvbTALggkuZXg3My5jb20wC4IJLmV4NzQuY29tMAuCCS5leDc1LmNvbTAL +ggkuZXg3Ni5jb20wC4IJLmV4NzcuY29tMAuCCS5leDc4LmNvbTALggkuZXg3OS5j +b20wC4IJLmV4ODAuY29tMAuCCS5leDgxLmNvbTALggkuZXg4Mi5jb20wC4IJLmV4 +ODMuY29tMAuCCS5leDg0LmNvbTALggkuZXg4NS5jb20wC4IJLmV4ODYuY29tMAuC +CS5leDg3LmNvbTALggkuZXg4OC5jb20wC4IJLmV4ODkuY29tMAuCCS5leDkwLmNv +bTALggkuZXg5MS5jb20wC4IJLmV4OTIuY29tMAuCCS5leDkzLmNvbTALggkuZXg5 +NC5jb20wC4IJLmV4OTUuY29tMAuCCS5leDk2LmNvbTALggkuZXg5Ny5jb20wC4IJ +LmV4OTguY29tMAuCCS5leDk5LmNvbTAMggouZXgxMDAuY29tMAyCCi5leDEwMS5j +b20wDIIKLmV4MTAyLmNvbTAMggouZXgxMDMuY29tMAyCCi5leDEwNC5jb20wDIIK +LmV4MTA1LmNvbTAMggouZXgxMDYuY29tMAyCCi5leDEwNy5jb20wDIIKLmV4MTA4 +LmNvbTAMggouZXgxMDkuY29tMAyCCi5leDExMC5jb20wDIIKLmV4MTExLmNvbTAM +ggouZXgxMTIuY29tMAyCCi5leDExMy5jb20wDIIKLmV4MTE0LmNvbTAMggouZXgx +MTUuY29tMAyCCi5leDExNi5jb20wDIIKLmV4MTE3LmNvbTAMggouZXgxMTguY29t +MAyCCi5leDExOS5jb20wDIIKLmV4MTIwLmNvbTAMggouZXgxMjEuY29tMAyCCi5l +eDEyMi5jb20wDIIKLmV4MTIzLmNvbTAMggouZXgxMjQuY29tMAyCCi5leDEyNS5j +b20wDIIKLmV4MTI2LmNvbTAMggouZXgxMjcuY29tMAyCCi5leDEyOC5jb20wDIIK +LmV4MTI5LmNvbTAMggouZXgxMzAuY29tMB0GA1UdDgQWBBRZqhZL7IEF/o83ZyxK +Djw6be/2ozANBgkqhkiG9w0BAQsFAAOCAQEAPObXW1f+7VAT0SUE6fLpqmP1y1PY +z5oePRsiRPrM8tbgu2DESGwcHeapCtIPXLPbf1pW3yYqTGtgIrO2IqBZmVWIk3YT +OSp4RrZDH55soOr2g6KP5RpjE6kWU5XkVxbQNLHlwRgnpQcDgVoOgIDtxpVgpXs1 +OCdNe1sdQbPbI8ciIayJJl7bEv52BjrmjYhCWCPXDBspwLhafwFzorHDj8QiYbWo +6QH1TQakxjo3Nbceax7D2LT2Aev/cMw8GqR/wykLj1EEYzdB644OYwEfdRf5RwJg +CkaQE7FWVpdVcoJnXIa8/iATpTLYuYeolpDLXJe2Eqb3SegTp6wL4x1Bzg== +-----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/digsigku.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/digsigku.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/digsigku.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/digsigku.pem 2024-08-03 07:30:00.000000000 +0000 @@ -6,8 +6,8 @@ Signature Algorithm: ecdsa-with-SHA1 Issuer: C = US, ST = Washington, L = Seattle, O = Foofarah, OU = Arglebargle, CN = foobarbaz, emailAddress = info@worlss.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = Foofarah, OU = Arglebargle, CN = foobarbaz, emailAddress = info@worlss.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey @@ -33,16 +33,16 @@ X509v3 Key Usage: critical Non Repudiation, Key Encipherment Signature Algorithm: ecdsa-with-SHA1 - 30:45:02:21:00:f7:23:e6:81:bf:37:d5:81:fb:78:c5:90:dd: - 23:c4:54:5c:b3:71:c7:25:79:19:d5:46:b7:a5:bf:04:b7:4d: - b6:02:20:1f:ad:51:3d:b9:49:82:71:ad:f6:a9:de:17:f4:c3: - d5:c9:4c:7e:16:58:cb:92:42:21:61:bb:f4:96:b2:78:9f + 30:45:02:20:21:e7:44:3e:5a:98:1a:49:25:db:d1:db:d3:fb: + 2f:ec:4d:c6:2c:2f:92:f6:cd:7d:a3:b9:5c:25:93:9f:4d:83: + 02:21:00:82:da:52:9f:37:0c:81:9e:26:9c:fb:da:6f:4f:84: + b8:5d:19:69:94:a2:08:68:ed:99:4e:51:9e:45:28:74:0c -----BEGIN CERTIFICATE----- MIIDKDCCAs+gAwIBAgIJAOOBS0ilcGFwMAkGByqGSM49BAEwgZExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMREwDwYD VQQKDAhGb29mYXJhaDEUMBIGA1UECwwLQXJnbGViYXJnbGUxEjAQBgNVBAMMCWZv -b2JhcmJhejEeMBwGCSqGSIb3DQEJARYPaW5mb0B3b3Jsc3MuY29tMB4XDTIyMTIx -NjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZExCzAJBgNVBAYTAlVTMRMwEQYDVQQI +b2JhcmJhejEeMBwGCSqGSIb3DQEJARYPaW5mb0B3b3Jsc3MuY29tMB4XDTIzMTIx +MzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZExCzAJBgNVBAYTAlVTMRMwEQYDVQQI DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMREwDwYDVQQKDAhGb29mYXJh aDEUMBIGA1UECwwLQXJnbGViYXJnbGUxEjAQBgNVBAMMCWZvb2JhcmJhejEeMBwG CSqGSIb3DQEJARYPaW5mb0B3b3Jsc3MuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D @@ -53,6 +53,6 @@ BgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEZvb2ZhcmFoMRQwEgYDVQQLDAtBcmds ZWJhcmdsZTESMBAGA1UEAwwJZm9vYmFyYmF6MR4wHAYJKoZIhvcNAQkBFg9pbmZv QHdvcmxzcy5jb22CCQDjgUtIpXBhcDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIFYDAJBgcqhkjOPQQBA0gAMEUCIQD3I+aBvzfVgft4xZDdI8RUXLNxxyV5 -GdVGt6W/BLdNtgIgH61RPblJgnGt9qneF/TD1clMfhZYy5JCIWG79JayeJ8= +/wQEAwIFYDAJBgcqhkjOPQQBA0gAMEUCICHnRD5amBpJJdvR29P7L+xNxiwvkvbN +faO5XCWTn02DAiEAgtpSnzcMgZ4mnPvab0+EuF0ZaZSiCGjtmU5RnkUodAw= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -29,7 +29,14 @@ certs/test/cert-ext-joi.cfg \ certs/test/cert-ext-multiple.cfg \ certs/test/cert-ext-multiple.der \ - certs/test/cert-ext-multiple.pem + certs/test/cert-ext-multiple.pem \ + certs/test/cert-bad-neg-int.der \ + certs/test/cert-bad-oid.der \ + certs/test/cert-bad-utf8.der \ + certs/test/cert-over-max-altnames.cfg \ + certs/test/cert-over-max-altnames.pem \ + certs/test/cert-over-max-nc.cfg \ + certs/test/cert-over-max-nc.pem # The certs/server-cert with the last byte (signature byte) changed EXTRA_DIST += \ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/ktri-keyid-cms.msg and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/ktri-keyid-cms.msg differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badaltname.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltname.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badaltname.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltname.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badaltname.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltname.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 3a:e3:92:48:82:fb:ed:f5:cb:d2:93:c5:5a:df:71:c2:ef:6b:43:50 + 76:31:fe:b4:f4:ed:14:f1:b8:24:69:74:77:72:59:ce:c1:61:05:a0 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -36,27 +36,27 @@ X509v3 Subject Alternative Name: DNS:www.nomatch.com Signature Algorithm: sha256WithRSAEncryption - 6d:17:67:be:f8:34:a2:62:0f:87:97:df:7b:62:cc:f9:7c:62: - dd:01:ca:a6:a9:9d:02:7d:d2:fb:db:01:37:a8:cc:0e:01:a4: - e9:a2:cb:29:00:cd:cb:f3:ab:99:db:bc:0d:c1:2d:78:99:15: - b8:55:f0:08:f4:2d:3d:4c:38:47:a7:72:1d:96:77:7f:1b:55: - 8f:37:d3:9e:55:cc:fe:09:56:6b:38:65:3b:c7:ca:0a:d8:06: - 1b:ae:ad:03:4c:e8:67:59:ff:42:5a:45:00:f8:1c:51:6e:c6: - 64:af:16:94:13:eb:5b:33:5e:9e:7c:60:ac:4b:8d:c3:3c:6c: - a8:1e:8d:e2:0a:23:4e:fa:e7:df:a3:a0:03:c0:29:1f:2e:ff: - 2f:fc:d5:37:28:a0:55:58:60:9c:1f:ec:b5:b5:9b:51:44:a3: - f0:05:39:66:9d:29:13:49:6e:e8:76:c4:69:ce:69:85:20:1d: - 3c:51:eb:26:ab:02:8d:e2:99:1b:9e:83:ec:23:27:87:8b:f2: - f1:96:28:bc:6b:2c:f1:19:6e:c3:0c:a9:4e:02:7b:c1:37:3e: - 7c:6a:bf:9e:ff:76:7f:39:0f:64:f4:25:db:24:d4:0c:0a:0d: - e8:b4:6a:81:02:0d:71:b6:36:89:15:c4:6c:fb:18:0e:4d:92: - 1e:53:d0:d8 + 3c:65:49:0e:32:4f:66:4b:ab:7d:a1:10:d4:ac:1f:8f:ed:70: + a5:62:eb:83:90:26:30:9a:2b:3e:fd:6c:d0:5d:ae:ac:3f:96: + 89:76:31:8a:72:ab:c7:f7:25:a4:f5:d5:87:47:ec:71:d8:04: + a1:32:56:a0:b1:60:11:e8:11:3e:97:87:1f:d8:39:03:e1:22: + 91:01:bd:ec:38:f3:26:d9:d0:0a:67:99:c2:c4:06:89:5a:45: + d9:cb:49:ba:df:ee:f3:a9:11:0b:7b:89:7d:e4:e1:78:c7:60: + ed:d6:66:4e:54:9a:9b:07:f8:f8:cb:86:bd:1a:5a:56:ae:9e: + 89:74:01:d0:a8:47:c5:be:22:b1:a1:0c:d1:5e:cb:0a:df:46: + 8f:f6:ed:2c:a0:fa:24:41:92:f5:eb:28:e6:5e:a1:04:c2:b2: + 51:f0:55:78:fc:e0:52:e7:ac:dd:ff:59:f0:36:d7:d0:c3:b7: + 0e:b4:d9:8d:cb:df:23:28:aa:df:bd:07:e9:65:24:76:10:28: + 09:43:7a:be:20:2d:e3:3c:0d:4a:18:e0:b4:15:c9:be:d7:bf: + b5:46:ae:92:94:c2:b6:c1:b4:26:9d:0a:ef:17:0e:dd:c4:25: + 44:78:a8:e2:08:b9:65:3d:05:de:54:17:c9:74:71:f9:c8:bb: + 66:4e:c9:85 -----BEGIN CERTIFICATE----- -MIIDsjCCApqgAwIBAgIUOuOSSIL77fXL0pPFWt9xwu9rQ1AwDQYJKoZIhvcNAQEL +MIIDsjCCApqgAwIBAgIUdjH+tPTtFPG4JGl0d3JZzsFhBaAwDQYJKoZIhvcNAQEL BQAwgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3Lm5vbWF0 -Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd3d3Lm5vbWF0Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI @@ -66,10 +66,10 @@ 8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDB Y3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE 4eZhg8XSlt/Z0E+t1wIDAQABox4wHDAaBgNVHREEEzARgg93d3cubm9tYXRjaC5j -b20wDQYJKoZIhvcNAQELBQADggEBAG0XZ774NKJiD4eX33tizPl8Yt0ByqapnQJ9 -0vvbATeozA4BpOmiyykAzcvzq5nbvA3BLXiZFbhV8Aj0LT1MOEench2Wd38bVY83 -055VzP4JVms4ZTvHygrYBhuurQNM6GdZ/0JaRQD4HFFuxmSvFpQT61szXp58YKxL -jcM8bKgejeIKI07659+joAPAKR8u/y/81TcooFVYYJwf7LW1m1FEo/AFOWadKRNJ -buh2xGnOaYUgHTxR6yarAo3imRueg+wjJ4eL8vGWKLxrLPEZbsMMqU4Ce8E3Pnxq -v57/dn85D2T0Jdsk1AwKDei0aoECDXG2NokVxGz7GA5Nkh5T0Ng= +b20wDQYJKoZIhvcNAQELBQADggEBADxlSQ4yT2ZLq32hENSsH4/tcKVi64OQJjCa +Kz79bNBdrqw/lol2MYpyq8f3JaT11YdH7HHYBKEyVqCxYBHoET6Xhx/YOQPhIpEB +vew48ybZ0ApnmcLEBolaRdnLSbrf7vOpEQt7iX3k4XjHYO3WZk5UmpsH+PjLhr0a +Wlaunol0AdCoR8W+IrGhDNFeywrfRo/27Syg+iRBkvXrKOZeoQTCslHwVXj84FLn +rN3/WfA219DDtw602Y3L3yMoqt+9B+llJHYQKAlDer4gLeM8DUoY4LQVyb7Xv7VG +rpKUwrbBtCadCu8XDt3EJUR4qOIIuWU9Bd5UF8l0cfnIu2ZOyYU= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badaltnull.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltnull.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badaltnull.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltnull.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badaltnull.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badaltnull.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 50:b6:0d:5a:9f:1e:16:84:1e:31:d8:93:dd:83:41:12:95:f2:be:2c + 75:94:fd:49:d7:c1:2b:ca:02:75:4d:37:61:ca:48:1b:60:40:bc:e2 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -34,30 +34,29 @@ Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Alternative Name: - - + 0 ..localhost.h Signature Algorithm: sha256WithRSAEncryption - 32:3e:75:3d:36:97:04:5c:38:de:c1:e3:6d:c9:5e:84:89:eb: - 0a:74:0d:60:a5:77:a8:6a:d7:a3:38:2e:2c:20:9b:79:8d:c1: - 0d:c3:3e:f9:e2:49:52:d5:78:cb:93:38:dd:00:d9:e0:90:05: - 78:cc:ab:25:37:be:c4:e9:11:dd:9a:f2:a4:03:4f:50:3f:58: - 90:73:75:7e:00:40:dd:9e:b6:0a:09:cd:46:e8:16:f1:a4:4d: - ff:a3:fb:ce:b2:ad:67:9d:98:38:66:4b:7d:5e:6b:28:32:35: - 29:5f:fc:cc:4b:ed:14:e0:3f:a9:d0:62:4a:96:00:f9:ae:6b: - af:ee:59:d5:d5:47:15:65:aa:8b:b7:15:4b:0d:8f:f6:87:fd: - 42:74:0a:c4:e7:84:ce:8b:a5:ef:85:62:b6:f1:cd:41:ca:d7: - d0:ef:6c:ff:60:66:33:cc:05:6a:46:8c:23:d3:37:66:1e:21: - fb:b1:67:9f:35:9d:b1:c1:80:f9:bb:a5:96:c7:56:2c:f0:d4: - d2:6d:ac:13:bb:33:64:23:72:a3:82:77:89:f3:fd:36:88:52: - e0:cd:0f:2c:a0:0d:7c:d8:4f:f3:b4:4e:a7:b4:30:59:8c:d1: - 36:f2:75:0a:3e:db:8d:51:e8:ba:8c:9c:87:1e:c5:c7:e2:d2: - 63:63:6f:22 + 9c:a2:c0:49:d7:4b:a2:cf:6d:83:b7:06:a0:b2:60:4e:a3:ca: + 57:8e:0f:8f:65:0a:e5:3b:12:8f:06:5e:f7:7c:4c:22:09:8e: + 88:a9:34:c4:ed:5a:01:45:8e:c6:06:bc:f9:41:96:6f:dc:7c: + 3e:5b:b9:19:ff:77:f1:49:a1:84:e9:11:8a:d2:d7:6c:13:53: + cd:48:61:7d:a4:0b:30:e9:62:32:f5:01:a4:27:5c:3b:d1:cf: + cb:cb:c6:8d:2d:9d:3f:89:46:13:4f:2c:5b:4c:a8:ab:7d:23: + a5:98:9f:ad:ba:fc:2c:4b:44:17:3d:99:8d:7a:53:21:f7:8f: + 25:d8:84:ba:41:c2:c9:0f:24:d7:06:6e:cc:93:f7:13:f3:21: + 64:05:b0:82:96:44:d0:1d:dd:e0:5c:d1:32:f2:55:08:25:05: + 2a:23:d6:ae:bc:e5:29:8d:13:06:1d:d0:cc:9e:b0:04:c2:1c: + 3e:c5:6d:60:6b:d8:25:d8:23:0a:8c:f9:74:7a:e5:5b:21:b6: + b5:74:de:c9:34:2d:75:c5:01:41:47:c6:76:08:8c:21:59:4f: + 4d:9b:16:05:c1:43:15:a2:17:b2:ab:70:6a:51:18:3f:c9:ac: + 48:16:a1:23:38:e2:90:ea:ac:df:5a:b5:7f:ed:be:9b:42:a5: + e2:2b:5c:c7 -----BEGIN CERTIFICATE----- -MIIDrjCCApagAwIBAgIUULYNWp8eFoQeMdiT3YNBEpXyviwwDQYJKoZIhvcNAQEL +MIIDrjCCApagAwIBAgIUdZT9SdfBK8oCdU03YcpIG2BAvOIwDQYJKoZIhvcNAQEL BQAwgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3Lm5vbWF0 -Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd3d3Lm5vbWF0Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI @@ -67,10 +66,10 @@ 8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDB Y3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE 4eZhg8XSlt/Z0E+t1wIDAQABoxowGDAWBgNVHREEDzANggtsb2NhbGhvc3QAaDAN -BgkqhkiG9w0BAQsFAAOCAQEAMj51PTaXBFw43sHjbclehInrCnQNYKV3qGrXozgu -LCCbeY3BDcM++eJJUtV4y5M43QDZ4JAFeMyrJTe+xOkR3ZrypANPUD9YkHN1fgBA -3Z62CgnNRugW8aRN/6P7zrKtZ52YOGZLfV5rKDI1KV/8zEvtFOA/qdBiSpYA+a5r -r+5Z1dVHFWWqi7cVSw2P9of9QnQKxOeEzoul74VitvHNQcrX0O9s/2BmM8wFakaM -I9M3Zh4h+7FnnzWdscGA+bullsdWLPDU0m2sE7szZCNyo4J3ifP9NohS4M0PLKAN -fNhP87ROp7QwWYzRNvJ1Cj7bjVHouoychx7Fx+LSY2NvIg== +BgkqhkiG9w0BAQsFAAOCAQEAnKLASddLos9tg7cGoLJgTqPKV44Pj2UK5TsSjwZe +93xMIgmOiKk0xO1aAUWOxga8+UGWb9x8Plu5Gf938UmhhOkRitLXbBNTzUhhfaQL +MOliMvUBpCdcO9HPy8vGjS2dP4lGE08sW0yoq30jpZifrbr8LEtEFz2ZjXpTIfeP +JdiEukHCyQ8k1wZuzJP3E/MhZAWwgpZE0B3d4FzRMvJVCCUFKiPWrrzlKY0TBh3Q +zJ6wBMIcPsVtYGvYJdgjCoz5dHrlWyG2tXTeyTQtdcUBQUfGdgiMIVlPTZsWBcFD +FaIXsqtwalEYP8msSBahIzjikOqs31q1f+2+m0Kl4itcxw== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badcn.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcn.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badcn.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcn.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badcn.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcn.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 79:e6:1d:85:f5:44:69:d4:f4:7c:4a:eb:62:26:d2:ac:1c:be:8a:b2 + 33:9d:a3:77:36:7a:b9:40:c0:3f:62:ae:d7:80:c0:a4:88:f9:82:5f Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -33,27 +33,27 @@ ad:d7 Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption - b4:5d:5d:51:69:22:95:b3:61:d5:91:84:32:88:eb:6c:5a:43: - e7:8c:94:58:69:07:ea:c1:f2:4e:c4:23:be:c4:8b:13:ed:07: - 5e:e9:a1:6f:a7:f8:13:d6:8b:c9:87:01:38:74:5b:47:d1:96: - 35:a7:0a:c6:c7:4f:2a:44:a1:6d:c9:58:30:a5:9b:df:cc:55: - e0:a6:50:1f:36:89:58:57:6d:eb:b9:94:4f:0b:eb:c4:ed:2c: - 21:26:b5:c3:eb:f7:07:c6:59:5f:51:2b:14:77:a6:22:17:cd: - 25:55:d6:e6:d4:a1:47:44:98:86:c5:86:f8:8a:ae:67:ae:12: - 89:36:16:fd:a0:66:f9:25:45:eb:08:b3:e7:6c:b9:d1:46:d0: - 8f:41:bf:96:37:cb:24:16:fb:2f:2e:79:1d:f3:b5:d3:da:85: - da:7c:e3:ea:d3:a9:7e:b3:6a:ad:c8:3a:65:54:b2:77:55:5a: - 65:d4:40:cf:30:07:28:7a:3b:2c:f9:10:99:a3:5e:d8:70:f9: - ae:87:a7:ae:1a:cd:1f:cc:10:2e:44:6f:6a:f7:60:c4:e7:a0: - 53:16:47:42:ca:fc:1e:fc:be:d0:60:07:52:87:89:a8:b5:7a: - 17:81:3a:8f:81:78:36:a9:f3:9e:4b:00:1a:48:62:27:6c:65: - db:a1:10:10 + 2f:03:d9:42:ae:10:f3:4b:42:c1:9d:6a:aa:09:da:f1:55:8a: + 0b:76:ce:51:d5:16:95:24:49:ac:14:1b:f6:b4:81:bd:c4:2b: + 9c:f2:34:8b:a5:18:a6:00:82:70:00:c1:8f:26:90:da:70:70: + 60:bf:c8:98:d2:d1:c7:86:fd:68:60:f2:54:46:e5:e0:d9:58: + c4:85:01:32:b1:02:43:06:61:f5:61:3f:fd:80:b0:75:2c:3a: + 50:d8:c9:11:6e:36:17:8e:e0:a6:3f:b1:bd:17:96:31:c9:04: + e9:53:84:6a:e6:bc:c3:82:1a:fc:8f:63:e9:68:c9:b3:ed:61: + 8d:08:a2:9d:c8:4e:57:09:50:2c:16:6f:9a:c7:31:cc:6c:fd: + 3c:37:01:06:f1:c7:98:e6:c5:ee:cb:3e:6f:6b:20:bc:dc:64: + 17:2e:d7:5b:95:2a:18:e5:ab:4c:5e:97:1c:e5:7d:e5:72:cd: + fe:b6:6d:9b:36:c6:4b:70:dc:97:5f:49:31:93:1b:2b:ca:d1: + c8:12:24:31:c2:78:50:bf:aa:28:e6:42:78:ae:e1:08:7a:64: + da:46:89:d6:07:4a:cb:51:36:69:11:6c:a9:61:fc:b1:03:21: + c2:82:6a:15:d7:98:58:1c:40:55:08:e0:32:9e:05:78:c6:a0: + b8:d9:11:2f -----BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIUeeYdhfVEadT0fErrYibSrBy+irIwDQYJKoZIhvcNAQEL +MIIDkjCCAnqgAwIBAgIUM52jdzZ6uUDAP2Ku14DApIj5gl8wDQYJKoZIhvcNAQEL BQAwgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3Lm5vbWF0 -Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd3d3Lm5vbWF0Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI @@ -62,11 +62,11 @@ Q7ilHFw0s64AoGPF9n8LWWh4c6aMGKkCba/DGQEuuBDjxsxAtGmjRjNph27Euxem 8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDB Y3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE -4eZhg8XSlt/Z0E+t1wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQC0XV1RaSKVs2HV -kYQyiOtsWkPnjJRYaQfqwfJOxCO+xIsT7Qde6aFvp/gT1ovJhwE4dFtH0ZY1pwrG -x08qRKFtyVgwpZvfzFXgplAfNolYV23ruZRPC+vE7SwhJrXD6/cHxllfUSsUd6Yi -F80lVdbm1KFHRJiGxYb4iq5nrhKJNhb9oGb5JUXrCLPnbLnRRtCPQb+WN8skFvsv -Lnkd87XT2oXafOPq06l+s2qtyDplVLJ3VVpl1EDPMAcoejss+RCZo17YcPmuh6eu -Gs0fzBAuRG9q92DE56BTFkdCyvwe/L7QYAdSh4motXoXgTqPgXg2qfOeSwAaSGIn -bGXboRAQ +4eZhg8XSlt/Z0E+t1wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAvA9lCrhDzS0LB +nWqqCdrxVYoLds5R1RaVJEmsFBv2tIG9xCuc8jSLpRimAIJwAMGPJpDacHBgv8iY +0tHHhv1oYPJURuXg2VjEhQEysQJDBmH1YT/9gLB1LDpQ2MkRbjYXjuCmP7G9F5Yx +yQTpU4Rq5rzDghr8j2PpaMmz7WGNCKKdyE5XCVAsFm+axzHMbP08NwEG8ceY5sXu +yz5vayC83GQXLtdblSoY5atMXpcc5X3lcs3+tm2bNsZLcNyXX0kxkxsrytHIEiQx +wnhQv6oo5kJ4ruEIemTaRonWB0rLUTZpEWypYfyxAyHCgmoV15hYHEBVCOAyngV4 +xqC42REv -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badcnnull.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcnnull.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badcnnull.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcnnull.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-badcnnull.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-badcnnull.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 08:b1:99:a7:bd:5f:a6:05:3e:d4:fd:d3:1d:2a:6c:5d:d3:38:cc:a2 + 29:9c:4e:32:2d:67:08:52:16:03:ba:4f:eb:47:e3:a2:ef:55:06:15 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = DER:30:0d:82:0b:6c:6f:63:61:6c:68:6f:73:74:00:68, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = DER:30:0d:82:0b:6c:6f:63:61:6c:68:6f:73:74:00:68, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -33,28 +33,28 @@ ad:d7 Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption - 85:40:69:33:07:7a:aa:3c:86:ff:5f:c5:29:d7:16:38:95:22: - 2a:5e:bd:c8:0c:aa:29:48:04:87:5b:18:0e:39:b0:bf:b9:01: - 48:01:45:81:03:52:81:b1:13:b1:81:af:d7:99:3e:5e:ed:0a: - ac:22:77:3d:0f:22:e4:f6:08:9a:91:c3:ba:41:e2:d1:22:74: - 4c:04:d3:51:de:35:a5:f6:10:40:e6:50:2e:a6:bd:06:20:2c: - 27:90:1d:a5:b2:e5:87:b7:77:2c:0a:e2:08:f8:93:60:dc:a7: - 41:7f:dd:b7:d4:ed:0b:58:ea:ec:ad:c3:76:ab:12:30:41:6e: - 55:97:cb:fc:3a:15:f8:c8:79:f6:85:8d:47:28:e7:dd:a7:d6: - 64:b0:e5:f8:97:25:7c:37:f6:46:c4:bb:d6:fb:01:59:93:7c: - 7f:2d:e9:f4:16:79:2d:d3:25:51:11:88:4c:e4:fa:83:b7:20: - 48:dd:03:fb:e2:6e:4e:af:9d:b7:55:55:16:2c:15:76:c4:00: - 09:f0:58:c7:db:9d:66:b6:20:00:50:29:45:14:8b:d4:a4:63: - c8:91:0d:0c:72:04:f6:fe:d4:37:87:3b:94:4e:89:c2:22:58: - 45:6e:fa:58:0e:e5:dc:89:6c:e9:8e:b0:09:c7:07:db:77:0c: - b4:31:51:77 + b7:a0:3f:bf:60:6d:0e:49:aa:e4:a8:00:b6:7d:d5:15:58:60: + 5d:cb:40:70:46:04:6c:e3:6d:04:b0:2a:eb:e2:64:b3:4f:a6: + 47:ae:22:c8:41:a1:cc:01:0c:1a:b2:6f:d2:e5:cf:b8:ac:c7: + 3c:a8:04:0d:7e:53:c5:9f:ec:f6:26:1e:d7:ed:6d:44:a5:8f: + 64:7b:bd:f4:19:fd:70:d5:39:7a:d9:22:72:2d:ec:09:0d:61: + e9:1f:3d:61:70:13:1c:d6:34:44:1d:04:a7:2c:96:08:0b:e6: + 63:e5:02:e6:95:d3:49:75:a9:e2:d0:e4:6e:9c:87:17:3a:30: + d4:dd:16:58:f8:cc:39:ff:a4:2d:3f:26:bf:40:92:6e:b2:b6: + 6d:03:d8:68:a2:4a:3d:cf:b9:00:93:58:54:5a:ef:ea:6d:28: + c3:8c:c1:0e:60:5a:8c:df:5d:d5:0b:cb:b5:e5:6c:57:7a:b6: + ac:8c:64:67:f4:68:8d:73:50:41:11:6c:14:b6:65:7d:57:ff: + 27:b5:f3:5e:7e:d4:07:29:49:6b:0c:aa:ed:b2:aa:32:a3:b4: + 78:bc:2d:18:6f:a6:fa:ea:b2:c8:a4:a3:f2:cc:da:43:9c:eb: + 92:ea:7a:1a:8f:4b:ed:87:eb:f6:80:ea:6a:de:d7:ac:0e:9e: + 47:2d:37:30 -----BEGIN CERTIFICATE----- -MIID1DCCArygAwIBAgIUCLGZp71fpgU+1P3THSpsXdM4zKIwDQYJKoZIhvcNAQEL +MIID1DCCArygAwIBAgIUKZxOMi1nCFIWA7pP60fjou9VBhUwDQYJKoZIhvcNAQEL BQAwgaMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzE5MDcGA1UEAwwwREVSOjMwOjBk OjgyOjBiOjZjOjZmOjYzOjYxOjZjOjY4OjZmOjczOjc0OjAwOjY4MR8wHQYJKoZI -hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkx -MTIxMTc1MFowgaMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYD +hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOVoXDTI2MDkw +ODIyMTkyOVowgaMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYD VQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzE5MDcGA1UEAwwwREVS OjMwOjBkOjgyOjBiOjZjOjZmOjYzOjYxOjZjOjY4OjZmOjczOjc0OjAwOjY4MR8w HQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEF @@ -64,10 +64,10 @@ uBDjxsxAtGmjRjNph27Euxem8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTS ELlkwyrQoZZKvOHUGlvHoMDBY3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0 sGlCQgnp2Ai8MyCzWCKnquvE4eZhg8XSlt/Z0E+t1wIDAQABMA0GCSqGSIb3DQEB -CwUAA4IBAQCFQGkzB3qqPIb/X8Up1xY4lSIqXr3IDKopSASHWxgOObC/uQFIAUWB -A1KBsROxga/XmT5e7QqsInc9DyLk9giakcO6QeLRInRMBNNR3jWl9hBA5lAupr0G -ICwnkB2lsuWHt3csCuII+JNg3KdBf9231O0LWOrsrcN2qxIwQW5Vl8v8OhX4yHn2 -hY1HKOfdp9ZksOX4lyV8N/ZGxLvW+wFZk3x/Len0Fnkt0yVREYhM5PqDtyBI3QP7 -4m5Or523VVUWLBV2xAAJ8FjH251mtiAAUClFFIvUpGPIkQ0McgT2/tQ3hzuUTonC -IlhFbvpYDuXciWzpjrAJxwfbdwy0MVF3 +CwUAA4IBAQC3oD+/YG0OSarkqAC2fdUVWGBdy0BwRgRs420EsCrr4mSzT6ZHriLI +QaHMAQwasm/S5c+4rMc8qAQNflPFn+z2Jh7X7W1EpY9ke730Gf1w1Tl62SJyLewJ +DWHpHz1hcBMc1jREHQSnLJYIC+Zj5QLmldNJdani0ORunIcXOjDU3RZY+Mw5/6Qt +Pya/QJJusrZtA9hooko9z7kAk1hUWu/qbSjDjMEOYFqM313VC8u15WxXerasjGRn +9GiNc1BBEWwUtmV9V/8ntfNeftQHKUlrDKrtsqoyo7R4vC0Yb6b66rLIpKPyzNpD +nOuS6noaj0vth+v2gOpq3tesDp5HLTcw -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-ecc-badsig.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,9 +5,9 @@ Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL, OU = Development, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT - Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Elliptic, OU = ECC, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) @@ -34,24 +34,24 @@ Netscape Cert Type: SSL Server Signature Algorithm: ecdsa-with-SHA256 - 30:45:02:21:00:cf:3a:17:97:d4:be:7c:50:e1:be:1b:53:95: - 7b:a3:b8:c6:73:c4:34:e0:73:5a:db:3e:cb:3a:b6:a8:f1:cd: - bf:02:20:2b:e6:f9:65:b2:ab:0f:bb:2b:36:5c:cc:2e:19:a9: - 59:1c:6f:6f:ce:9b:7a:e6:5b:65:31:33:80:05:cb:7c:96 + 30:45:02:21:00:86:bd:87:16:d2:9c:66:e7:5e:5c:28:0e:5f: + ef:94:61:2f:d4:21:6d:8e:c3:94:0a:1e:b5:6a:1d:c6:04:87: + c6:02:20:66:46:c4:29:d9:8e:eb:0b:f7:5b:32:13:eb:0a:ea: + 47:99:4b:74:56:ba:21:97:b1:67:75:5c:f3:f3:c0:88:aa -----BEGIN CERTIFICATE----- -MIICoTCCAkegAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR +MIICojCCAkigAwIBAgIBAzAKBggqhkjOPQQDAjCBlzELMAkGA1UEBhMCVVMxEzAR BgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB3dv bGZTU0wxFDASBgNVBAsMC0RldmVsb3BtZW50MRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBjzELMAkGA1UEBhMCVVMxEzARBgNVBAgM -Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAoMB0VsaXB0aWMx -DDAKBgNVBAsMA0VDQzEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZI -hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD -QgAEuzOsTCdQSsZKpQTDPN6fNttyLc6U6iv6yyAJOSwW6GEC6a9N0wKTmjFbl5Ih -f/DPGNqREQI0huggWDMLgDSJ2KOBiTCBhjAdBgNVHQ4EFgQUXV0m76x+NvmbdhUr -SiUCI++yiTAwHwYDVR0jBBgwFoAUVo6aw/BC3hi5RVVu+ZPP6sPzpSEwDAYDVR0T -AQH/BAIwADAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwEQYJ -YIZIAYb4QgEBBAQDAgZAMAoGCCqGSM49BAMCA0gAMEUCIQDPOheX1L58UOG+G1OV -e6O4xnPENOBzWts+yzq2qPHNvwIgK+b5ZbKrD7srNlzMLhmpWRxvb86beuZbZTEz -gAXLxJY= +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBkDELMAkGA1UEBhMCVVMxEzARBgNVBAgM +Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxETAPBgNVBAoMCEVsbGlwdGlj +MQwwCgYDVQQLDANFQ0MxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG +SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH +A0IABLszrEwnUErGSqUEwzzenzbbci3OlOor+ssgCTksFuhhAumvTdMCk5oxW5eS +IX/wzxjakRECNIboIFgzC4A0idijgYkwgYYwHQYDVR0OBBYEFF1dJu+sfjb5m3YV +K0olAiPvsokwMB8GA1UdIwQYMBaAFFaOmsPwQt4YuUVVbvmTz+rD86UhMAwGA1Ud +EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgOoMBMGA1UdJQQMMAoGCCsGAQUFBwMBMBEG +CWCGSAGG+EIBAQQEAwIGQDAKBggqhkjOPQQDAgNIADBFAiEAhr2HFtKcZudeXCgO +X++UYS/UIW2Ow5QKHrVqHcYEh8YCIGZGxCnZjusL91syE+sK6keZS3RWuiGXsWd1 +XPPzxIiq -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-cert-rsa-badsig.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = Support, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,7 +37,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -46,27 +46,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - b9:10:f0:be:fe:c8:67:5e:7d:0f:36:33:c7:17:2a:01:c4:bb: - 74:83:4c:bc:bb:e2:ba:92:82:3a:d9:2d:8c:0e:e3:75:1b:c0: - 14:aa:40:1e:a8:11:7d:94:9c:3d:74:7a:3b:16:7b:d8:9d:f0: - e8:7d:1d:fa:3b:14:42:20:e3:05:a3:fd:b1:0c:f1:2a:c4:00: - 50:8d:1e:97:93:6a:de:82:13:24:9e:2b:fa:08:85:e3:4f:40: - fd:63:c7:3d:e9:bd:6f:7c:03:98:85:fe:b4:51:5d:7f:8c:83: - b3:ad:4a:88:e9:f3:4c:33:84:77:d3:02:35:59:e3:4e:64:a1: - b7:bb:fb:f8:fb:14:2a:ae:36:bf:d9:82:e7:cb:98:48:16:c8: - 81:d6:a0:f1:74:14:e3:74:4a:72:4a:f1:6f:dd:be:86:1e:20: - f3:05:16:83:1f:aa:7c:59:35:97:24:b8:27:b7:56:9f:30:2e: - 90:e0:19:e0:21:ca:9d:3f:da:99:07:94:79:49:53:14:5c:a2: - 2c:56:5b:b2:55:68:5c:1f:91:58:9a:cd:53:b5:ea:63:5a:72: - 49:41:cc:76:9f:88:35:86:0d:60:5d:e5:91:bd:ac:6f:cf:d5: - 92:27:72:4a:21:f4:58:98:8e:3b:d2:29:e6:ee:fa:e6:b0:6c: - 8b:1e:e0:54 + 4a:ff:b9:e5:85:9b:da:53:66:7f:07:22:bf:b6:19:ea:42:eb: + a4:11:07:62:ff:39:5f:33:37:3a:87:26:71:3d:13:b2:ca:b8: + 64:38:7b:8a:99:48:0e:a5:a4:6b:b1:99:6e:e0:46:51:bd:19: + 52:ad:bc:a6:7e:2a:7a:7c:23:a7:cc:db:5e:43:7d:6b:04:c8: + b7:dd:95:ad:f0:91:80:59:c5:19:91:26:27:91:b8:48:1c:eb: + 55:b6:aa:7d:a4:38:f1:03:bc:6c:8b:aa:94:d6:3c:05:7a:96: + c5:06:f1:26:14:2e:75:fb:dd:e5:35:b3:01:2c:b3:ad:62:5a: + 21:9a:08:be:56:fc:f9:a2:42:87:86:e5:a9:c5:99:cf:ae:14: + be:e0:b9:08:24:0d:1d:5c:d6:14:e1:4c:9f:40:b3:a9:e9:2d: + 52:8b:4c:bf:ac:44:31:67:c1:8d:06:85:ec:0f:e4:99:d7:4b: + 7b:21:06:66:d4:e4:f5:9d:ff:8e:f0:86:39:58:1d:a4:5b:e2: + 63:ef:7c:c9:18:87:a8:02:25:10:3e:87:28:f9:f5:ef:47:9e: + a5:80:08:11:90:68:fe:d1:a3:a8:51:b9:37:ff:d5:ca:7c:87: + 7f:6b:bc:2c:12:c8:c5:85:8b:fc:0c:c6:b9:86:b8:c9:04:c3: + 51:37:d2:4f -----BEGIN CERTIFICATE----- MIIE6DCCA9CgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBkDELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxEDAO BgNVBAsMB1N1cHBvcnQxGDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqG SIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP @@ -80,26 +80,26 @@ M2OzpNgdMOXo1aGBmqSBlzCBlDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh bmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQL DApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG -9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFCyAzttHnQdmkj1o18qskE/KaUFLMAwG +9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFDNEGqhsAez2YPJwUQpM0RT6vOlEMAwG A1UdEwQFMAMBAf8wHAYDVR0RBBUwE4ILZXhhbXBsZS5jb22HBH8AAAEwHQYDVR0l -BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQC5EPC+ -/shnXn0PNjPHFyoBxLt0g0y8u+K6koI62S2MDuN1G8AUqkAeqBF9lJw9dHo7FnvY -nfDofR36OxRCIOMFo/2xDPEqxABQjR6Xk2reghMkniv6CIXjT0D9Y8c96b1vfAOY -hf60UV1/jIOzrUqI6fNMM4R30wI1WeNOZKG3u/v4+xQqrja/2YLny5hIFsiB1qDx -dBTjdEpySvFv3b6GHiDzBRaDH6p8WTWXJLgnt1afMC6Q4BngIcqdP9qZB5R5SVMU -XKIsVluyVWhcH5FYms1TtepjWnJJQcx2n4g1hg1gXeWRvaxvz9WSJ3JKIfRYmI47 -0inm7vrmsGyLHuBU +BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQBK/7nl +hZvaU2Z/ByK/thnqQuukEQdi/zlfMzc6hyZxPROyyrhkOHuKmUgOpaRrsZlu4EZR +vRlSrbymfip6fCOnzNteQ31rBMi33ZWt8JGAWcUZkSYnkbhIHOtVtqp9pDjxA7xs +i6qU1jwFepbFBvEmFC51+93lNbMBLLOtYlohmgi+Vvz5okKHhuWpxZnPrhS+4LkI +JA0dXNYU4UyfQLOp6S1Si0y/rEQxZ8GNBoXsD+SZ10t7IQZm1OT1nf+O8IY5WB2k +W+Jj73zJGIeoAiUQPoco+fXvR56lgAgRkGj+0aOoUbk3/9XKfId/a7wsEsjFhYv8 +DMa5hrjJBMNRN9JP -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: - 2c:80:ce:db:47:9d:07:66:92:3d:68:d7:ca:ac:90:4f:ca:69:41:4b + 33:44:1a:a8:6c:01:ec:f6:60:f2:70:51:0a:4c:d1:14:fa:bc:e9:44 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -130,7 +130,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -139,27 +139,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - ae:b0:a4:35:8e:8a:1b:a6:eb:b3:a2:57:cf:3a:1f:dc:6e:bc: - d2:d0:a6:4a:8f:88:0a:6e:74:d5:d1:7c:d1:44:b1:d4:3b:17: - 03:09:5a:46:ed:08:08:cf:f1:fd:20:07:67:c0:97:ec:35:f3: - 75:ca:20:61:98:3e:f5:4d:be:e6:9d:75:1e:e4:03:ad:8c:a6: - 1e:3d:ec:e4:1a:92:5b:f9:a3:ad:83:ca:4f:cd:aa:38:bb:6e: - ae:ad:fa:a7:46:f1:8b:73:ec:09:23:bc:f2:18:e5:b7:92:86: - 3e:a4:75:60:c7:3d:0f:3f:83:00:c3:06:08:9c:d1:54:d6:ba: - 6d:95:3d:34:a1:be:24:91:cc:20:03:11:5b:72:1c:d4:65:d0: - 11:88:75:26:04:26:ef:66:70:e6:3b:38:87:9c:53:71:1b:09: - 51:70:50:99:4c:31:0c:62:44:57:30:60:04:fc:12:2c:a3:24: - b4:f7:11:d5:0e:b5:21:0b:ed:86:11:67:4d:36:fa:57:a0:59: - 55:21:b3:6d:e4:77:5e:ec:7e:f0:09:13:8e:99:98:b2:e1:82: - b6:4b:3e:0f:41:a6:0c:cd:49:99:7e:e4:8a:cb:37:ed:53:cf: - 86:5d:a9:26:a8:e5:01:25:5a:b4:bc:25:35:f1:fa:5a:5c:ce: - d4:b8:9a:2c + 2d:fc:f9:32:5a:be:d6:9d:42:8b:86:4e:67:22:c3:50:2d:cb: + 14:27:1d:94:f3:cd:88:42:da:41:1c:39:24:67:a7:92:4d:27: + ea:56:82:19:bf:11:b2:43:a4:8d:5d:87:b2:27:64:66:82:81: + df:c4:fd:5b:62:b0:c2:4d:9d:29:f2:41:32:cc:2e:b5:da:38: + 06:1b:e8:7f:8c:6e:3d:80:1e:00:56:49:bf:39:e0:da:68:2f: + c4:fd:00:e6:d1:81:1a:d1:4a:bb:76:52:ce:4d:24:9d:c4:a3: + a7:f1:65:14:2f:1f:a8:2d:c6:cb:ce:b1:a7:89:74:26:27:c3: + f3:a3:84:4c:34:01:14:03:7d:16:3a:c8:8b:25:2e:7b:90:cc: + 46:b1:52:34:ba:93:6e:ef:fe:43:a3:ad:c6:6f:51:fb:ba:ea: + 38:e3:6f:d6:ee:63:62:36:ea:5e:08:b4:e2:2a:46:89:e3:ae: + b3:b4:06:ef:63:7a:6e:5d:dd:c9:ec:02:4f:f7:64:c0:27:07: + b4:6f:4a:18:72:5b:34:74:7c:d0:a9:04:8f:40:8b:6a:39:d2: + 6b:1a:01:f2:01:a8:81:34:3a:e5:b0:55:d1:3c:95:ca:b0:82: + d6:ed:98:28:15:59:7e:95:a7:69:c7:b5:7b:ec:01:a7:4d:e6: + b9:a2:fe:35 -----BEGIN CERTIFICATE----- -MIIE/zCCA+egAwIBAgIULIDO20edB2aSPWjXyqyQT8ppQUswDQYJKoZIhvcNAQEL +MIIE/zCCA+egAwIBAgIUM0QaqGwB7PZg8nBRCkzRFPq86UQwDQYJKoZIhvcNAQEL BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZQxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZQxCzAJ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -174,12 +174,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU -LIDO20edB2aSPWjXyqyQT8ppQUswDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +M0QaqGwB7PZg8nBRCkzRFPq86UQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DQYJKoZIhvcNAQELBQADggEBAK6wpDWOihum67OiV886H9xuvNLQpkqPiApudNXR -fNFEsdQ7FwMJWkbtCAjP8f0gB2fAl+w183XKIGGYPvVNvuaddR7kA62Mph497OQa -klv5o62Dyk/Nqji7bq6t+qdG8Ytz7AkjvPIY5beShj6kdWDHPQ8/gwDDBgic0VTW -um2VPTShviSRzCADEVtyHNRl0BGIdSYEJu9mcOY7OIecU3EbCVFwUJlMMQxiRFcw -YAT8EiyjJLT3EdUOtSEL7YYRZ002+legWVUhs23kd17sfvAJE46ZmLLhgrZLPg9B -pgzNSZl+5IrLN+1Tz4ZdqSao5QElWrS8JTXx+lpcztS4xiw= +DQYJKoZIhvcNAQELBQADggEBAC38+TJavtadQouGTmciw1AtyxQnHZTzzYhC2kEc +OSRnp5JNJ+pWghm/EbJDpI1dh7InZGaCgd/E/VtisMJNnSnyQTLMLrXaOAYb6H+M +bj2AHgBWSb854NpoL8T9AObRgRrRSrt2Us5NJJ3Eo6fxZRQvH6gtxsvOsaeJdCYn +w/OjhEw0ARQDfRY6yIslLnuQzEaxUjS6k27v/kOjrcZvUfu66jjjb9buY2I26l4I +tOIqRonjrrO0Bu9jem5d3cnsAk/3ZMAnB7RvShhyWzR0fNCpBI9Ai2o50msaAfIB +qIE0OuWwVdE8lcqwgtbtmCgVWX6Vp2nHtXvsAadN5rmixjU= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-duplicate-policy.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-duplicate-policy.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-duplicate-policy.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-duplicate-policy.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = wolfSSL, OU = testing duplicate policy, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,7 +37,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:FALSE @@ -49,27 +49,27 @@ Explicit Text: Test of duplicate OIDs with different qualifiers Signature Algorithm: sha256WithRSAEncryption - 06:e6:e5:15:9e:9a:39:07:0a:9e:cd:fc:0f:4b:77:46:1a:fe: - 54:ee:8a:3b:43:41:f4:b3:9e:52:2d:92:2a:d3:c2:0d:de:9f: - 85:bc:fd:df:70:57:b4:9b:7c:38:aa:0f:88:2a:97:1b:ac:73: - 80:f6:f4:60:f1:7f:29:9c:61:12:48:25:ca:97:1d:e0:d6:96: - 80:89:97:4f:36:1d:38:28:a8:98:6c:c8:c2:a1:17:45:3d:e1: - 5b:56:c9:d7:91:2f:91:a1:53:87:9a:1a:d9:4c:9a:e4:e5:10: - 10:33:10:fa:1d:5c:8c:f0:f2:27:56:47:b9:45:96:e0:5d:ee: - 17:7a:7a:cd:38:80:ed:fa:c6:a3:c1:8d:c9:57:05:58:cb:ea: - 21:08:40:3a:18:df:4f:de:68:d4:95:27:9d:cd:2b:96:55:68: - fe:3d:48:82:27:36:61:32:e2:70:7d:5b:09:aa:16:1c:80:57: - ae:04:cd:60:ba:38:34:44:cb:5d:f8:86:10:fd:3a:2a:f5:fd: - 9b:b0:b6:79:66:e5:51:a1:d4:e1:59:41:bd:5e:96:12:a1:51: - b7:4b:b7:8b:e2:8b:9f:a4:b4:83:a4:d9:1c:22:b8:ef:aa:57: - 9a:93:4c:89:91:57:9d:15:d9:c3:0a:9a:5d:5e:a9:5a:40:3c: - 84:18:33:6b + ae:92:7f:94:c1:59:de:ec:62:89:79:b5:70:75:22:54:90:c1: + 42:6a:dd:79:50:7b:f5:eb:23:9e:99:84:6c:ba:ca:d8:2e:15: + ed:f2:cb:ee:2a:b7:50:ca:82:fe:52:87:93:cf:22:5a:db:23: + 3f:c2:22:a4:5a:02:f9:73:ac:0e:fe:2e:62:fb:6a:5d:1d:71: + 13:ae:b8:c3:af:e9:6a:4c:a9:73:ca:fb:a9:69:b3:a2:62:ec: + e8:20:44:63:bf:49:ea:aa:90:e4:00:9c:fe:69:8c:99:4a:32: + e6:1a:2b:ae:1b:b9:82:53:8c:b0:06:ac:10:40:42:aa:68:da: + 40:b7:92:f0:78:f6:5a:b6:ae:a2:a6:45:58:05:58:58:ca:bc: + 85:92:92:52:e2:a4:c0:aa:9e:9a:03:f1:d4:a9:1f:46:ed:49: + 76:71:76:3a:bb:47:ee:12:24:60:db:a4:2c:0d:9c:62:bf:1d: + a3:b4:80:68:18:32:32:51:9f:0a:49:3e:5c:20:f4:45:c8:11: + 4d:b3:43:b1:a1:33:8b:07:b5:b4:86:66:0c:f7:b9:62:0a:2f: + 53:29:dd:d0:9a:1a:64:86:7e:f6:72:fd:f9:ee:75:a1:20:d5: + dc:9d:03:60:32:f6:11:a9:9b:56:d7:5d:b0:65:fd:5f:c8:0e: + 08:a4:f0:e6 -----BEGIN CERTIFICATE----- MIIFMTCCBBmgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzQ5WhcNMjUwOTExMjExNzQ5WjCBoTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTI4WhcNMjYwOTA4MjIxOTI4WjCBoTELMAkGA1UEBhMCVVMxEDAOBgNVBAgM B01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xEDAOBgNVBAoMB3dvbGZTU0wxITAf BgNVBAsMGHRlc3RpbmcgZHVwbGljYXRlIHBvbGljeTEYMBYGA1UEAwwPd3d3Lndv bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -83,27 +83,27 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswCQYDVR0TBAIwADB2BgNVHSAEbzBtMAUGAyoDBDBkBgMq +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwCQYDVR0TBAIwADB2BgNVHSAEbzBtMAUGAyoDBDBkBgMq AwQwXTAbBggrBgEFBQcCARYPd3d3LndvbGZzc2wuY29tMD4GCCsGAQUFBwICMDIa MFRlc3Qgb2YgZHVwbGljYXRlIE9JRHMgd2l0aCBkaWZmZXJlbnQgcXVhbGlmaWVy -czANBgkqhkiG9w0BAQsFAAOCAQEABublFZ6aOQcKns38D0t3Rhr+VO6KO0NB9LOe -Ui2SKtPCDd6fhbz933BXtJt8OKoPiCqXG6xzgPb0YPF/KZxhEkglypcd4NaWgImX -TzYdOCiomGzIwqEXRT3hW1bJ15EvkaFTh5oa2Uya5OUQEDMQ+h1cjPDyJ1ZHuUWW -4F3uF3p6zTiA7frGo8GNyVcFWMvqIQhAOhjfT95o1JUnnc0rllVo/j1Igic2YTLi -cH1bCaoWHIBXrgTNYLo4NETLXfiGEP06KvX9m7C2eWblUaHU4VlBvV6WEqFRt0u3 -i+KLn6S0g6TZHCK476pXmpNMiZFXnRXZwwqaXV6pWkA8hBgzaw== +czANBgkqhkiG9w0BAQsFAAOCAQEArpJ/lMFZ3uxiiXm1cHUiVJDBQmrdeVB79esj +npmEbLrK2C4V7fLL7iq3UMqC/lKHk88iWtsjP8IipFoC+XOsDv4uYvtqXR1xE664 +w6/pakypc8r7qWmzomLs6CBEY79J6qqQ5ACc/mmMmUoy5horrhu5glOMsAasEEBC +qmjaQLeS8Hj2WrauoqZFWAVYWMq8hZKSUuKkwKqemgPx1KkfRu1JdnF2OrtH7hIk +YNukLA2cYr8do7SAaBgyMlGfCkk+XCD0RcgRTbNDsaEziwe1tIZmDPe5YgovUynd +0JoaZIZ+9nL9+e51oSDV3J0DYDL2EambVtddsGX9X8gOCKTw5g== -----END CERTIFICATE----- Certificate: Data: Version: 3 (0x2) Serial Number: - 2c:80:ce:db:47:9d:07:66:92:3d:68:d7:ca:ac:90:4f:ca:69:41:4b + 33:44:1a:a8:6c:01:ec:f6:60:f2:70:51:0a:4c:d1:14:fa:bc:e9:44 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:49 2022 GMT - Not After : Sep 11 21:17:49 2025 GMT + Not Before: Dec 13 22:19:28 2023 GMT + Not After : Sep 8 22:19:28 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -134,7 +134,7 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE @@ -143,27 +143,27 @@ X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption - ae:b0:a4:35:8e:8a:1b:a6:eb:b3:a2:57:cf:3a:1f:dc:6e:bc: - d2:d0:a6:4a:8f:88:0a:6e:74:d5:d1:7c:d1:44:b1:d4:3b:17: - 03:09:5a:46:ed:08:08:cf:f1:fd:20:07:67:c0:97:ec:35:f3: - 75:ca:20:61:98:3e:f5:4d:be:e6:9d:75:1e:e4:03:ad:8c:a6: - 1e:3d:ec:e4:1a:92:5b:f9:a3:ad:83:ca:4f:cd:aa:38:bb:6e: - ae:ad:fa:a7:46:f1:8b:73:ec:09:23:bc:f2:18:e5:b7:92:86: - 3e:a4:75:60:c7:3d:0f:3f:83:00:c3:06:08:9c:d1:54:d6:ba: - 6d:95:3d:34:a1:be:24:91:cc:20:03:11:5b:72:1c:d4:65:d0: - 11:88:75:26:04:26:ef:66:70:e6:3b:38:87:9c:53:71:1b:09: - 51:70:50:99:4c:31:0c:62:44:57:30:60:04:fc:12:2c:a3:24: - b4:f7:11:d5:0e:b5:21:0b:ed:86:11:67:4d:36:fa:57:a0:59: - 55:21:b3:6d:e4:77:5e:ec:7e:f0:09:13:8e:99:98:b2:e1:82: - b6:4b:3e:0f:41:a6:0c:cd:49:99:7e:e4:8a:cb:37:ed:53:cf: - 86:5d:a9:26:a8:e5:01:25:5a:b4:bc:25:35:f1:fa:5a:5c:ce: - d4:b8:9a:2c + 2d:fc:f9:32:5a:be:d6:9d:42:8b:86:4e:67:22:c3:50:2d:cb: + 14:27:1d:94:f3:cd:88:42:da:41:1c:39:24:67:a7:92:4d:27: + ea:56:82:19:bf:11:b2:43:a4:8d:5d:87:b2:27:64:66:82:81: + df:c4:fd:5b:62:b0:c2:4d:9d:29:f2:41:32:cc:2e:b5:da:38: + 06:1b:e8:7f:8c:6e:3d:80:1e:00:56:49:bf:39:e0:da:68:2f: + c4:fd:00:e6:d1:81:1a:d1:4a:bb:76:52:ce:4d:24:9d:c4:a3: + a7:f1:65:14:2f:1f:a8:2d:c6:cb:ce:b1:a7:89:74:26:27:c3: + f3:a3:84:4c:34:01:14:03:7d:16:3a:c8:8b:25:2e:7b:90:cc: + 46:b1:52:34:ba:93:6e:ef:fe:43:a3:ad:c6:6f:51:fb:ba:ea: + 38:e3:6f:d6:ee:63:62:36:ea:5e:08:b4:e2:2a:46:89:e3:ae: + b3:b4:06:ef:63:7a:6e:5d:dd:c9:ec:02:4f:f7:64:c0:27:07: + b4:6f:4a:18:72:5b:34:74:7c:d0:a9:04:8f:40:8b:6a:39:d2: + 6b:1a:01:f2:01:a8:81:34:3a:e5:b0:55:d1:3c:95:ca:b0:82: + d6:ed:98:28:15:59:7e:95:a7:69:c7:b5:7b:ec:01:a7:4d:e6: + b9:a2:fe:35 -----BEGIN CERTIFICATE----- -MIIE/zCCA+egAwIBAgIULIDO20edB2aSPWjXyqyQT8ppQUswDQYJKoZIhvcNAQEL +MIIE/zCCA+egAwIBAgIUM0QaqGwB7PZg8nBRCkzRFPq86UQwDQYJKoZIhvcNAQEL BQAwgZQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEY MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tMB4XDTIyMTIxNjIxMTc0OVoXDTI1MDkxMTIxMTc0OVowgZQxCzAJ +bGZzc2wuY29tMB4XDTIzMTIxMzIyMTkyOFoXDTI2MDkwODIyMTkyOFowgZQxCzAJ BgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREw DwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwP d3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -178,12 +178,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIU -LIDO20edB2aSPWjXyqyQT8ppQUswDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl +M0QaqGwB7PZg8nBRCkzRFPq86UQwDAYDVR0TBAUwAwEB/zAcBgNVHREEFTATggtl eGFtcGxlLmNvbYcEfwAAATAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw -DQYJKoZIhvcNAQELBQADggEBAK6wpDWOihum67OiV886H9xuvNLQpkqPiApudNXR -fNFEsdQ7FwMJWkbtCAjP8f0gB2fAl+w183XKIGGYPvVNvuaddR7kA62Mph497OQa -klv5o62Dyk/Nqji7bq6t+qdG8Ytz7AkjvPIY5beShj6kdWDHPQ8/gwDDBgic0VTW -um2VPTShviSRzCADEVtyHNRl0BGIdSYEJu9mcOY7OIecU3EbCVFwUJlMMQxiRFcw -YAT8EiyjJLT3EdUOtSEL7YYRZ002+legWVUhs23kd17sfvAJE46ZmLLhgrZLPg9B -pgzNSZl+5IrLN+1Tz4ZdqSao5QElWrS8JTXx+lpcztS4miw= +DQYJKoZIhvcNAQELBQADggEBAC38+TJavtadQouGTmciw1AtyxQnHZTzzYhC2kEc +OSRnp5JNJ+pWghm/EbJDpI1dh7InZGaCgd/E/VtisMJNnSnyQTLMLrXaOAYb6H+M +bj2AHgBWSb854NpoL8T9AObRgRrRSrt2Us5NJJ3Eo6fxZRQvH6gtxsvOsaeJdCYn +w/OjhEw0ARQDfRY6yIslLnuQzEaxUjS6k27v/kOjrcZvUfu66jjjb9buY2I26l4I +tOIqRonjrrO0Bu9jem5d3cnsAk/3ZMAnB7RvShhyWzR0fNCpBI9Ai2o50msaAfIB +qIE0OuWwVdE8lcqwgtbtmCgVWX6Vp2nHtXvsAadN5rmi/jU= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-garbage.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-garbage.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-garbage.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-garbage.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-garbage.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-garbage.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 56:d8:ee:2d:0e:b3:67:82:6b:9b:76:c3:6c:c0:4d:3e:de:a4:82:4c + 29:92:30:0a:e4:14:e1:59:32:49:a9:66:fd:11:f5:b2:16:d6:7a:d0 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = localhost, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:30 2023 GMT + Not After : Sep 8 22:19:30 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = localhost, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -36,27 +36,27 @@ X509v3 Subject Alternative Name: DNS:garbage Signature Algorithm: sha256WithRSAEncryption - 81:bc:29:f9:85:0f:21:3e:c1:bf:a5:90:25:d0:34:ed:82:0f: - d0:dc:c0:4c:2e:b7:09:bd:61:0e:5f:e7:35:b0:30:ca:4b:62: - 04:e8:ea:9e:0d:70:7a:d2:7b:d8:f7:69:bc:f0:4a:7b:fc:84: - 2e:1f:ef:27:c6:22:f7:ea:6a:03:7f:0b:e9:23:44:41:23:53: - e8:db:8f:1c:c6:03:d8:0c:95:71:a5:56:a5:14:0d:0c:d2:9e: - 4f:51:81:60:89:f8:d2:88:1e:d8:08:27:64:a3:25:b8:38:eb: - 5a:8c:9f:7c:00:d5:84:26:f8:3d:4a:f1:be:b8:74:9b:8d:63: - f5:59:48:15:aa:b7:aa:c2:5c:ac:f0:f1:98:1f:7d:63:23:52: - 14:fd:03:c2:0d:17:4d:c0:73:e4:a8:2d:cc:0a:cd:17:2d:72: - 8c:c1:f0:ff:2e:b3:8e:95:38:3e:06:be:dd:10:77:8b:70:5d: - 0f:c5:80:72:ff:a5:f7:2d:9c:e8:06:b3:9c:19:37:3f:ef:11: - ed:30:5c:13:0d:49:14:fe:3e:40:e7:b0:49:ac:39:f6:19:3f: - c5:b7:77:02:3e:2f:0c:d2:40:8f:1a:0f:95:63:0e:34:af:20: - c8:32:e2:76:b4:a8:ef:f0:8d:bf:99:97:6a:e4:d8:f8:96:0a: - cf:7a:07:8f + 34:5e:01:46:29:63:4f:93:cf:48:77:45:39:48:68:cf:c6:54: + 94:56:14:6f:17:2d:e1:83:48:8b:91:70:6d:5f:d8:14:fc:a4: + a9:bc:fa:58:63:ce:57:2f:c5:b6:61:8b:c3:6d:dc:39:83:2e: + f3:78:d9:2b:b9:ed:f0:ef:c2:82:17:1b:ac:97:2a:c0:3a:9f: + f9:b7:6b:a6:0e:1c:af:17:be:74:d0:ff:11:ea:48:6d:f6:b8: + e8:11:db:c9:ca:49:e5:18:d9:51:3d:eb:76:56:b6:ce:da:cd: + a6:cb:ac:a3:06:5e:b7:b0:f6:2b:ba:dc:0f:c4:12:01:7e:8b: + c7:e4:ad:59:72:4a:a5:25:7a:bd:ec:1d:f4:89:f8:aa:c7:c8: + ad:8c:1c:d5:19:55:f9:32:75:f6:04:2c:67:86:d5:e8:f5:be: + bd:76:0b:bb:bb:8f:7d:1a:70:a2:9c:16:88:ca:de:14:9d:a2: + 0a:23:36:fd:02:bc:6d:ee:f4:7a:41:e2:2d:21:d0:5f:eb:ec: + 4e:4b:71:aa:80:57:63:da:39:2b:ce:37:5a:26:64:ad:6b:bc: + a6:24:90:b6:e8:b2:4a:19:98:e8:06:17:12:f8:57:74:44:f7: + b9:16:67:2d:be:66:fb:4d:a6:66:e7:b5:58:f8:9c:51:1d:56: + fd:ef:bf:6e -----BEGIN CERTIFICATE----- -MIIDnDCCAoSgAwIBAgIUVtjuLQ6zZ4Jrm3bDbMBNPt6kgkwwDQYJKoZIhvcNAQEL +MIIDnDCCAoSgAwIBAgIUKZIwCuQU4VkySalm/RH1shbWetAwDQYJKoZIhvcNAQEL BQAwfDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv emVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRIwEAYDVQQDDAlsb2NhbGhvc3Qx -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzUw -WhcNMjUwOTExMjExNzUwWjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTMw +WhcNMjYwOTA4MjIxOTMwWjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu YTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNV BAMMCWxvY2FsaG9zdDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXG @@ -66,10 +66,10 @@ vVSz4W1fHLwjc9EJA4kU0hC5ZMMq0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3 uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcC AwEAAaMWMBQwEgYDVR0RBAswCYIHZ2FyYmFnZTANBgkqhkiG9w0BAQsFAAOCAQEA -gbwp+YUPIT7Bv6WQJdA07YIP0NzATC63Cb1hDl/nNbAwyktiBOjqng1wetJ72Pdp -vPBKe/yELh/vJ8Yi9+pqA38L6SNEQSNT6NuPHMYD2AyVcaVWpRQNDNKeT1GBYIn4 -0oge2AgnZKMluDjrWoyffADVhCb4PUrxvrh0m41j9VlIFaq3qsJcrPDxmB99YyNS -FP0Dwg0XTcBz5KgtzArNFy1yjMHw/y6zjpU4Pga+3RB3i3BdD8WAcv+l9y2c6Aaz -nBk3P+8R7TBcEw1JFP4+QOewSaw59hk/xbd3Aj4vDNJAjxoPlWMONK8gyDLidrSo -7/CNv5mXauTY+JYKz3oHjw== +NF4BRiljT5PPSHdFOUhoz8ZUlFYUbxct4YNIi5FwbV/YFPykqbz6WGPOVy/FtmGL +w23cOYMu83jZK7nt8O/CghcbrJcqwDqf+bdrpg4crxe+dND/EepIbfa46BHbycpJ +5RjZUT3rdla2ztrNpsusowZet7D2K7rcD8QSAX6Lx+StWXJKpSV6vewd9In4qsfI +rYwc1RlV+TJ19gQsZ4bV6PW+vXYLu7uPfRpwopwWiMreFJ2iCiM2/QK8be70ekHi +LSHQX+vsTktxqoBXY9o5K843WiZkrWu8piSQtuiyShmY6AYXEvhXdET3uRZnLb5m ++02mZue1WPicUR1W/e+/bg== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodalt.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodalt.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodalt.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodalt.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodalt.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodalt.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 5f:49:44:09:72:71:cb:23:ae:86:03:8e:8c:8f:7f:54:4f:e8:ec:4e + 32:70:6e:5f:3a:4b:a4:f1:68:7f:40:58:7b:f4:de:25:f8:da:7a:cf Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -36,27 +36,27 @@ X509v3 Subject Alternative Name: DNS:localhost Signature Algorithm: sha256WithRSAEncryption - 6d:c3:9c:73:21:47:6d:5f:da:84:1b:78:7b:47:9d:62:de:89: - d0:95:4b:52:9a:ba:cf:a4:64:d5:cf:49:fd:a3:3a:32:df:c6: - 15:cc:9a:cc:7e:7d:2f:bb:6b:9e:d4:15:ad:95:ec:ee:c4:ca: - a3:72:c3:e5:21:49:c7:40:56:dd:0e:76:65:9a:fe:a9:00:c2: - 5f:b7:91:04:90:17:05:b6:79:e1:b0:07:bc:25:4b:8d:c0:b8: - 65:08:75:c4:c2:e3:48:54:a9:1b:0d:fd:17:6e:f7:b1:f0:ec: - 4e:fe:43:01:9c:28:34:8c:d2:dd:b1:7f:f3:47:24:fd:13:ee: - 87:05:96:4f:11:7c:3c:af:a0:72:02:73:04:8e:e4:6e:f6:da: - 0c:41:c7:b8:6c:15:4c:53:b1:6c:a9:79:9c:e5:5f:c2:0d:08: - 50:e8:17:a7:dd:ab:10:a7:c5:88:78:dc:a1:ee:f0:ed:13:68: - ab:53:56:7c:2f:b5:e5:b4:0f:65:ce:d6:2c:f8:44:bf:88:f5: - c8:4a:c9:7f:fb:9b:73:ca:cf:da:f8:e0:1c:01:7c:c4:b7:3e: - 8b:2e:7a:fa:50:ef:01:eb:9a:0f:11:f9:18:94:e2:f8:28:f2: - 50:2e:f3:14:ab:3a:3a:1f:24:ef:d2:bc:2d:42:84:42:38:3b: - 33:d8:8b:1f + 1a:fb:18:e0:cc:2f:fe:92:34:87:01:35:a1:e3:9f:8b:c5:5a: + 22:f6:9a:2f:19:08:99:1d:0d:e7:23:84:23:28:dd:ff:13:39: + ca:73:1e:e0:c5:22:21:ab:b3:0e:74:a3:e6:c9:7b:a2:50:6c: + 35:c1:2f:30:eb:90:c5:36:4a:95:3c:43:c5:e4:fc:80:08:ce: + 69:2a:3f:50:66:8f:81:71:24:61:68:d3:34:69:b8:d7:11:27: + b8:53:21:5f:19:6f:cc:66:e4:fd:07:95:7f:e1:d3:d4:91:2b: + 6f:d0:01:dc:5c:0c:72:10:2b:da:a7:2c:9d:eb:e3:e2:86:84: + ab:b5:73:01:00:02:84:29:90:10:c0:13:70:d7:d8:da:da:ac: + dc:75:8e:a8:ef:a3:c4:cf:aa:c2:83:66:8f:f9:0d:23:0d:9a: + 1b:b2:d3:04:3d:91:1e:f1:9a:5f:15:85:94:af:89:8b:d7:6d: + cf:f8:06:e1:e8:30:b6:ef:6d:fc:33:19:a1:91:af:fc:f3:bf: + 0d:ae:97:ec:c3:ea:1e:17:76:3b:e4:57:c1:bd:27:16:58:03: + 95:02:6f:c8:fa:7e:0b:7b:a8:d4:e7:38:11:b3:a8:6f:ce:6e: + 6f:9f:68:c2:c6:93:06:00:49:0a:76:43:2c:8d:b0:49:9f:02: + fb:e2:6a:39 -----BEGIN CERTIFICATE----- -MIIDrDCCApSgAwIBAgIUX0lECXJxyyOuhgOOjI9/VE/o7E4wDQYJKoZIhvcNAQEL +MIIDrDCCApSgAwIBAgIUMnBuXzpLpPFof0BYe/TeJfjaes8wDQYJKoZIhvcNAQEL BQAwgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3Lm5vbWF0 -Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd3d3Lm5vbWF0Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI @@ -66,10 +66,10 @@ 8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDB Y3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE 4eZhg8XSlt/Z0E+t1wIDAQABoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwDQYJ -KoZIhvcNAQELBQADggEBAG3DnHMhR21f2oQbeHtHnWLeidCVS1Kaus+kZNXPSf2j -OjLfxhXMmsx+fS+7a57UFa2V7O7EyqNyw+UhScdAVt0OdmWa/qkAwl+3kQSQFwW2 -eeGwB7wlS43AuGUIdcTC40hUqRsN/Rdu97Hw7E7+QwGcKDSM0t2xf/NHJP0T7ocF -lk8RfDyvoHICcwSO5G722gxBx7hsFUxTsWypeZzlX8INCFDoF6fdqxCnxYh43KHu -8O0TaKtTVnwvteW0D2XO1iz4RL+I9chKyX/7m3PKz9r44BwBfMS3PosuevpQ7wHr -mg8R+RiU4vgo8lAu8xSrOjofJO/SvC1ChEI4OzPYix8= +KoZIhvcNAQELBQADggEBABr7GODML/6SNIcBNaHjn4vFWiL2mi8ZCJkdDecjhCMo +3f8TOcpzHuDFIiGrsw50o+bJe6JQbDXBLzDrkMU2SpU8Q8Xk/IAIzmkqP1Bmj4Fx +JGFo0zRpuNcRJ7hTIV8Zb8xm5P0HlX/h09SRK2/QAdxcDHIQK9qnLJ3r4+KGhKu1 +cwEAAoQpkBDAE3DX2NrarNx1jqjvo8TPqsKDZo/5DSMNmhuy0wQ9kR7xml8VhZSv +iYvXbc/4BuHoMLbvbfwzGaGRr/zzvw2ul+zD6h4XdjvkV8G9JxZYA5UCb8j6fgt7 +qNTnOBGzqG/Obm+faMLGkwYASQp2QyyNsEmfAvviajk= -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodaltwild.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 2c:88:b2:20:85:90:6b:03:49:f6:35:7a:27:4b:12:1d:6a:67:b9:42 + 4c:d4:49:58:80:7d:50:06:e0:9e:5c:a6:4a:e1:90:26:53:59:90:89 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = www.nomatch.com, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -36,27 +36,27 @@ X509v3 Subject Alternative Name: DNS:*localhost Signature Algorithm: sha256WithRSAEncryption - 4c:41:a3:9e:76:d0:37:53:ae:2a:7c:f5:d7:f2:f0:fa:f8:78: - 23:b5:5b:44:cc:d8:9a:25:f1:cc:c5:30:e5:ae:3c:ed:a4:77: - b5:5d:64:35:ea:fe:82:a5:1d:6b:5c:d2:73:0a:06:c1:80:b5: - 25:7d:38:f9:08:c1:59:78:81:e5:88:06:6a:28:7b:9c:3b:fa: - 33:df:8b:50:f5:9a:b7:fe:3d:59:62:ad:57:a4:34:e2:ea:6b: - 40:7b:09:1c:13:94:fe:ce:88:bb:1f:dd:c2:8e:09:f8:a5:94: - 57:e5:61:6a:da:b2:be:ec:06:44:66:08:7d:1d:a8:8a:42:19: - 0e:aa:ca:36:c2:bc:62:1a:91:62:9d:d0:59:fd:53:9e:24:8c: - 67:77:e6:df:4f:58:9d:f0:81:9e:fd:59:b4:e4:37:67:50:c0: - 1e:d5:ac:2b:4b:27:32:7d:71:10:89:e7:b7:a3:5d:a2:0a:26: - 81:bb:85:e2:73:a0:b4:c6:1a:7d:93:dc:b1:71:f5:e6:ec:1e: - 34:c0:21:0d:4e:2f:e6:dd:89:2c:9f:e9:39:86:8e:b2:ed:f0: - a8:94:00:a9:cb:24:65:94:35:51:df:a7:3e:79:bb:82:e8:4b: - 7d:4b:17:1f:3a:11:07:d3:cf:bb:51:fb:27:85:10:65:b6:60: - 09:3c:f3:7d + 4d:31:3b:e4:6f:26:b4:33:2f:1a:10:12:34:f8:97:47:79:05: + 74:51:97:1c:22:96:89:b9:b3:63:af:e4:d4:eb:9f:97:e7:b3: + 8f:eb:52:0a:94:39:de:2f:df:4c:9c:15:0b:c0:91:b9:68:95: + 58:a1:78:82:82:4d:e7:81:c4:45:1a:94:d9:16:40:46:27:f3: + 33:08:8c:dd:c0:93:f4:2c:0e:1b:26:d5:fd:2f:8d:39:6f:63: + 63:be:3d:96:c4:3d:d7:25:1b:56:11:53:4e:c2:3c:fb:cb:ed: + 73:ab:87:c5:5f:5b:a6:47:4b:da:7e:84:30:ff:90:0b:b1:d0: + 15:e8:39:3d:0f:4f:de:a9:60:15:e3:44:c4:46:ee:c7:52:ff: + ee:23:1d:8c:73:53:87:e9:94:82:60:9b:ca:b8:b4:41:5f:3b: + bd:36:03:54:b2:bf:42:69:bd:49:b7:0f:26:16:ec:03:2c:b9: + 0c:38:15:20:c5:b6:9a:18:f1:30:7e:4a:11:7f:da:44:54:de: + 1e:0d:d1:e5:c9:46:0c:1b:50:6a:4d:61:89:58:61:46:40:2a: + fe:18:9d:64:90:ea:32:61:85:92:5a:3e:41:43:83:4d:ec:f4: + 98:15:95:f0:79:55:7f:81:59:31:2b:80:a8:ea:60:5c:78:04: + 3d:42:d0:51 -----BEGIN CERTIFICATE----- -MIIDrTCCApWgAwIBAgIULIiyIIWQawNJ9jV6J0sSHWpnuUIwDQYJKoZIhvcNAQEL +MIIDrTCCApWgAwIBAgIUTNRJWIB9UAbgnlymSuGQJlNZkIkwDQYJKoZIhvcNAQEL BQAwgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdC b3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEYMBYGA1UEAwwPd3d3Lm5vbWF0 -Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIx -NjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI +Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIx +MzIyMTkyOVoXDTI2MDkwODIyMTkyOVowgYIxCzAJBgNVBAYTAlVTMRAwDgYDVQQI DAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMRQwEgYDVQQLDAtFbmdpbmVlcmlu ZzEYMBYGA1UEAwwPd3d3Lm5vbWF0Y2guY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv QHdvbGZzc2wuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI @@ -66,10 +66,10 @@ 8+jdrXO8ey8htf1mUQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDB Y3gPRDcwMpaAMiOVoXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE 4eZhg8XSlt/Z0E+t1wIDAQABoxkwFzAVBgNVHREEDjAMggoqbG9jYWxob3N0MA0G -CSqGSIb3DQEBCwUAA4IBAQBMQaOedtA3U64qfPXX8vD6+HgjtVtEzNiaJfHMxTDl -rjztpHe1XWQ16v6CpR1rXNJzCgbBgLUlfTj5CMFZeIHliAZqKHucO/oz34tQ9Zq3 -/j1ZYq1XpDTi6mtAewkcE5T+zoi7H93Cjgn4pZRX5WFq2rK+7AZEZgh9HaiKQhkO -qso2wrxiGpFindBZ/VOeJIxnd+bfT1id8IGe/Vm05DdnUMAe1awrSycyfXEQiee3 -o12iCiaBu4Xic6C0xhp9k9yxcfXm7B40wCENTi/m3Yksn+k5ho6y7fColACpyyRl -lDVR36c+ebuC6Et9SxcfOhEH08+7UfsnhRBltmAJPPN9 +CSqGSIb3DQEBCwUAA4IBAQBNMTvkbya0My8aEBI0+JdHeQV0UZccIpaJubNjr+TU +65+X57OP61IKlDneL99MnBULwJG5aJVYoXiCgk3ngcRFGpTZFkBGJ/MzCIzdwJP0 +LA4bJtX9L405b2Njvj2WxD3XJRtWEVNOwjz7y+1zq4fFX1umR0vafoQw/5ALsdAV +6Dk9D0/eqWAV40TERu7HUv/uIx2Mc1OH6ZSCYJvKuLRBXzu9NgNUsr9Cab1Jtw8m +FuwDLLkMOBUgxbaaGPEwfkoRf9pEVN4eDdHlyUYMG1BqTWGJWGFGQCr+GJ1kkOoy +YYWSWj5BQ4NN7PSYFZXweVV/gVkxK4Co6mBceAQ9QtBR -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodcn.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcn.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodcn.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcn.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodcn.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcn.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 66:fe:3c:b9:70:bf:2e:6a:7d:8d:9f:94:e5:06:e5:26:ae:c0:51:ba + 7c:c0:69:44:bd:22:dd:2c:29:c1:55:88:f4:14:63:f5:ac:07:6d:c5 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = localhost, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = localhost, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -33,27 +33,27 @@ ad:d7 Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption - 45:91:94:ae:af:8c:15:13:c7:65:03:3d:d3:18:9b:68:aa:11: - 0c:d5:b9:e1:7c:a2:24:39:ee:d8:79:d5:be:5f:f4:b2:bf:2b: - c1:fe:9d:e9:8f:e2:cb:89:1d:8b:56:71:a6:1e:16:a9:e7:f9: - f8:e5:2e:36:fc:af:07:1f:63:89:b1:75:6e:b0:4a:91:5a:f2: - fa:e9:81:c5:c2:9b:50:cd:97:a0:4d:57:79:53:e4:17:03:dd: - bf:f0:e1:57:46:16:19:71:2f:c7:ab:d2:1e:d1:f1:7d:44:32: - 88:49:e5:a5:ac:5c:80:de:96:aa:cc:05:6f:0a:6c:98:cc:0f: - 8e:c8:50:f3:13:a8:9f:e2:16:98:e1:33:60:bf:7d:5a:18:8f: - 6e:d8:19:cb:3c:ea:d0:3c:65:a5:1a:4a:ee:9b:b9:46:59:78: - c9:18:55:a4:4e:74:65:fe:de:97:e9:6e:7f:8c:e0:6e:4b:8c: - b8:b8:37:cb:ed:f4:25:a8:1d:90:28:86:6e:1a:be:70:3a:cd: - 56:d9:74:27:d3:5d:9d:94:65:0f:a3:79:64:0c:b9:49:b3:eb: - f3:f5:26:f2:54:ba:ed:b2:5f:6a:21:77:53:08:30:10:47:bb: - 58:e7:60:33:cb:3a:45:a9:98:ab:e2:84:5b:4e:d4:ba:60:01: - 7d:cc:40:88 + 49:ff:59:9d:20:42:36:a3:d1:3d:5d:c1:37:24:42:22:9d:8a: + f9:61:98:45:0b:0d:9d:f7:1a:30:0b:54:9a:65:e7:e4:68:84: + 59:c1:28:43:8f:59:08:43:83:4e:95:9c:0d:91:43:53:6a:19: + cc:f1:d0:af:74:5a:12:34:8e:0c:18:21:83:ad:4f:a9:a5:fe: + df:af:9d:96:22:1b:21:0d:fd:99:6f:58:0c:cb:4a:e6:7f:32: + df:d5:10:b2:70:f0:4d:49:6e:1f:64:82:58:27:a8:58:c9:9b: + f1:de:30:b6:bd:8b:a6:23:3c:58:a5:d9:f5:74:b2:c1:96:b3: + 6b:56:d5:45:47:3d:ba:f9:0e:ba:59:73:43:31:cc:2a:2c:bd: + 87:01:f9:f0:bc:6e:f2:6e:20:a3:07:ca:f7:43:e7:1b:35:85: + bc:f7:84:1e:ff:33:21:74:19:45:85:b4:81:77:64:41:1b:02: + c9:e3:a4:39:48:62:8d:fd:1b:96:6f:64:dc:e9:75:a5:74:c3: + a5:3c:55:87:0d:cd:4c:ec:f5:9a:e9:9f:a3:0b:a4:80:ef:c7: + 58:4b:f4:60:b7:5a:4c:dc:93:10:79:43:c3:ac:1b:b1:6d:d8: + 8f:b6:f5:db:82:0d:6e:58:38:9d:23:97:41:7d:39:cd:9c:89: + 7d:64:bc:4f -----BEGIN CERTIFICATE----- -MIIDhDCCAmygAwIBAgIUZv48uXC/Lmp9jZ+U5QblJq7AUbowDQYJKoZIhvcNAQEL +MIIDhDCCAmygAwIBAgIUfMBpRL0i3SwpwVWI9BRj9awHbcUwDQYJKoZIhvcNAQEL BQAwfDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv emVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRIwEAYDVQQDDAlsb2NhbGhvc3Qx -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzUw -WhcNMjUwOTExMjExNzUwWjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI5 +WhcNMjYwOTA4MjIxOTI5WjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu YTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNV BAMMCWxvY2FsaG9zdDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXG @@ -62,10 +62,10 @@ C1loeHOmjBipAm2vwxkBLrgQ48bMQLRpo0YzaYduxLsXpvPo3a1zvHsvIbX9ZlEM vVSz4W1fHLwjc9EJA4kU0hC5ZMMq0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3 uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcC -AwEAATANBgkqhkiG9w0BAQsFAAOCAQEARZGUrq+MFRPHZQM90xibaKoRDNW54Xyi -JDnu2HnVvl/0sr8rwf6d6Y/iy4kdi1Zxph4Wqef5+OUuNvyvBx9jibF1brBKkVry -+umBxcKbUM2XoE1XeVPkFwPdv/DhV0YWGXEvx6vSHtHxfUQyiEnlpaxcgN6WqswF -bwpsmMwPjshQ8xOon+IWmOEzYL99WhiPbtgZyzzq0DxlpRpK7pu5Rll4yRhVpE50 -Zf7el+luf4zgbkuMuLg3y+30JagdkCiGbhq+cDrNVtl0J9NdnZRlD6N5ZAy5SbPr -8/Um8lS67bJfaiF3UwgwEEe7WOdgM8s6RamYq+KEW07UumABfcxAiA== +AwEAATANBgkqhkiG9w0BAQsFAAOCAQEASf9ZnSBCNqPRPV3BNyRCIp2K+WGYRQsN +nfcaMAtUmmXn5GiEWcEoQ49ZCEODTpWcDZFDU2oZzPHQr3RaEjSODBghg61PqaX+ +36+dliIbIQ39mW9YDMtK5n8y39UQsnDwTUluH2SCWCeoWMmb8d4wtr2LpiM8WKXZ +9XSywZaza1bVRUc9uvkOullzQzHMKiy9hwH58Lxu8m4gowfK90PnGzWFvPeEHv8z +IXQZRYW0gXdkQRsCyeOkOUhijf0blm9k3Ol1pXTDpTxVhw3NTOz1mumfowukgO/H +WEv0YLdaTNyTEHlDw6wbsW3Yj7b124INblg4nSOXQX05zZyJfWS8Tw== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-goodcnwild.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 78:39:82:cc:18:26:21:f2:cf:fb:d3:8a:07:ff:c4:eb:ea:82:c6:26 + 2e:f2:01:15:bc:ba:a6:74:6e:b4:49:8e:f3:09:8c:9c:ca:3e:fe:32 Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = *localhost, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = *localhost, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -33,27 +33,27 @@ ad:d7 Exponent: 65537 (0x10001) Signature Algorithm: sha256WithRSAEncryption - 99:97:4e:83:6a:1e:c6:54:31:bb:b1:83:36:14:1c:00:25:59: - c9:e9:c0:51:c0:70:d8:3a:de:79:5e:af:04:48:61:8b:ea:7c: - 75:e4:a3:c5:62:26:a3:70:9d:26:3d:47:60:ca:a0:96:e8:82: - a6:81:c7:77:48:aa:20:b0:be:cc:ef:5a:80:29:6a:2e:37:6e: - 37:b5:d2:f6:fd:f6:c2:fb:87:9f:4a:2f:16:1b:01:f1:33:0c: - b3:75:30:09:98:fc:1f:73:01:83:02:22:b4:0a:3d:07:e4:55: - c6:17:f6:98:c3:9b:38:9e:41:a1:cc:26:51:a8:07:4d:37:b8: - 93:41:ac:45:ae:ff:77:39:dc:48:1e:56:56:59:98:6e:93:fb: - 76:38:02:bf:24:2f:03:08:a4:92:21:15:df:23:d4:c4:14:1b: - 20:46:f7:04:eb:dc:1a:02:aa:b1:11:ea:29:3b:ca:5e:27:c1: - 28:0a:bf:7c:b6:dc:16:8b:5e:30:8d:72:5b:c6:d2:71:b6:c4: - 5e:e0:7a:a6:fc:06:2d:6a:78:56:b8:49:35:7b:14:e9:d1:3d: - c3:06:be:3f:1c:dc:67:e9:11:5f:46:71:06:66:09:fa:df:c1: - 05:60:73:a8:27:f2:cd:48:48:dc:bf:92:02:82:90:d9:d1:51: - 49:44:01:67 + 96:b2:8f:e5:31:57:57:6a:f2:48:1e:97:9a:71:75:10:22:a1: + 38:2c:9e:4f:d7:2f:7c:5d:e7:9f:19:8f:9c:00:b3:74:7e:10: + 69:7b:a5:71:2f:36:a2:79:02:51:4d:bb:e1:78:01:77:f6:13: + 85:84:46:ac:96:88:5b:47:4d:dd:d2:fd:5e:e4:49:3a:64:0b: + 67:af:95:3e:bf:40:4d:0f:a0:28:61:37:6b:41:b9:ad:dc:8c: + f4:0c:8b:b5:49:20:19:e2:7f:0b:63:e5:fc:06:6d:16:4f:ba: + b6:1a:3c:d4:4f:b3:a4:bd:c0:96:f5:a8:7f:01:85:a3:4a:ab: + c3:73:77:68:55:1b:26:84:60:2f:72:af:d1:c4:55:4a:a8:3d: + ce:fc:3e:b3:55:37:aa:df:0f:07:6c:5f:2b:0f:05:7f:bc:df: + 62:b3:68:f5:c2:0c:48:f8:b6:41:c5:e0:ac:7d:a4:50:f2:bc: + 61:0a:1c:5b:c5:b8:31:b1:ea:95:3f:6a:23:88:b3:74:7b:9f: + 1d:7c:11:23:f3:89:8b:71:a5:fa:e6:39:2c:10:af:8e:e9:8e: + c6:25:ca:76:db:d9:95:40:e5:15:f3:67:d6:67:3b:9e:42:9e: + ec:c2:cb:3a:c1:f8:bc:eb:b5:24:6d:ef:f6:00:ba:70:75:a4: + 32:7d:d0:33 -----BEGIN CERTIFICATE----- -MIIDhjCCAm6gAwIBAgIUeDmCzBgmIfLP+9OKB//E6+qCxiYwDQYJKoZIhvcNAQEL +MIIDhjCCAm6gAwIBAgIULvIBFby6pnRutEmO8wmMnMo+/jIwDQYJKoZIhvcNAQEL BQAwfTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv emVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRMwEQYDVQQDDAoqbG9jYWxob3N0 -MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIyMTIxNjIxMTc1 -MFoXDTI1MDkxMTIxMTc1MFowfTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh +MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMB4XDTIzMTIxMzIyMTky +OVoXDTI2MDkwODIyMTkyOVowfTELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRh bmExEDAOBgNVBAcMB0JvemVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRMwEQYD VQQDDAoqbG9jYWxob3N0MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwJUI4VdB8nFtt9JFQScB @@ -62,10 +62,10 @@ 9n8LWWh4c6aMGKkCba/DGQEuuBDjxsxAtGmjRjNph27Euxem8+jdrXO8ey8htf1m UQy9VLPhbV8cvCNz0QkDiRTSELlkwyrQoZZKvOHUGlvHoMDBY3gPRDcwMpaAMiOV oXe6E9KXc+JdJclqDcM5YKS0sGlCQgnp2Ai8MyCzWCKnquvE4eZhg8XSlt/Z0E+t -1wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCZl06Dah7GVDG7sYM2FBwAJVnJ6cBR -wHDYOt55Xq8ESGGL6nx15KPFYiajcJ0mPUdgyqCW6IKmgcd3SKogsL7M71qAKWou -N243tdL2/fbC+4efSi8WGwHxMwyzdTAJmPwfcwGDAiK0Cj0H5FXGF/aYw5s4nkGh -zCZRqAdNN7iTQaxFrv93OdxIHlZWWZhuk/t2OAK/JC8DCKSSIRXfI9TEFBsgRvcE -69waAqqxEeopO8peJ8EoCr98ttwWi14wjXJbxtJxtsRe4Hqm/AYtanhWuEk1exTp -0T3DBr4/HNxn6RFfRnEGZgn638EFYHOoJ/LNSEjcv5ICgpDZ0VFJRAFn +1wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCWso/lMVdXavJIHpeacXUQIqE4LJ5P +1y98XeefGY+cALN0fhBpe6VxLzaieQJRTbvheAF39hOFhEaslohbR03d0v1e5Ek6 +ZAtnr5U+v0BND6AoYTdrQbmt3Iz0DIu1SSAZ4n8LY+X8Bm0WT7q2GjzUT7OkvcCW +9ah/AYWjSqvDc3doVRsmhGAvcq/RxFVKqD3O/D6zVTeq3w8HbF8rDwV/vN9is2j1 +wgxI+LZBxeCsfaRQ8rxhChxbxbgxseqVP2ojiLN0e58dfBEj84mLcaX65jksEK+O +6Y7GJcp229mVQOUV82fWZzueQp7swss6wfi867Ukbe/2ALpwdaQyfdAz -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-localhost.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-localhost.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-localhost.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-localhost.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test/server-localhost.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test/server-localhost.pem 2024-08-03 07:30:00.000000000 +0000 @@ -2,12 +2,12 @@ Data: Version: 3 (0x2) Serial Number: - 56:aa:0b:f0:d8:fd:0f:4a:4c:e0:99:85:fe:c1:9b:75:24:fb:01:b6 + 32:31:fc:d6:4a:77:2b:3b:c9:07:02:ae:b4:e7:b7:d3:a4:61:56:2b Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = localhost, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:29 2023 GMT + Not After : Sep 8 22:19:29 2026 GMT Subject: C = US, ST = Montana, L = Bozeman, OU = Engineering, CN = localhost, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -36,27 +36,27 @@ X509v3 Subject Alternative Name: DNS:localhost Signature Algorithm: sha256WithRSAEncryption - 10:6d:76:f3:8e:93:63:0d:44:08:e2:29:23:cb:76:38:cd:29: - 0d:5f:48:1d:0f:a2:42:84:12:13:c2:00:a9:d9:e6:ec:4e:80: - cb:4d:e0:fb:7e:b8:c0:2a:92:e9:11:01:72:25:3f:9f:7d:81: - 76:5e:94:e3:47:2b:39:c3:a0:ba:ba:97:74:4c:a5:49:fa:bf: - 85:29:36:32:d5:4b:fc:60:1c:73:70:7f:49:e2:5b:74:a4:ec: - 7f:b5:e9:3e:1f:db:b8:b0:80:f4:c7:cf:cf:5f:18:b4:66:9e: - 02:3b:88:40:9b:b1:e4:10:2d:77:f2:b0:02:07:5b:bc:e7:38: - 7b:98:55:16:d8:8e:c4:b1:49:0a:eb:99:f8:fb:c4:e9:b5:75: - 2e:9c:ec:f5:ad:ec:e4:41:f3:7c:b5:fc:51:6e:6d:46:61:6d: - 09:d8:a9:08:dd:84:e5:ef:c5:a5:b8:65:60:71:d6:b4:c0:eb: - f0:e4:60:bf:9b:d9:80:bb:52:c3:1b:d8:27:6e:d5:eb:ab:9c: - a2:71:d9:af:dc:71:55:d7:be:93:6c:c6:5f:79:5d:72:1b:68: - b2:15:67:bb:41:28:07:41:12:7c:b1:74:30:1d:60:b0:5a:25: - 47:4e:0c:5a:14:49:99:9c:0d:92:74:a3:c8:b9:0c:8b:e0:0a: - d7:a1:0d:35 + af:7a:bb:f0:b6:1e:12:8a:60:ec:c8:91:34:a3:d3:80:92:f3: + bc:c7:37:e9:96:75:a8:67:a0:94:b9:2a:df:81:02:23:28:6a: + 72:de:81:03:33:88:1b:60:75:16:77:dc:72:40:3e:d9:d8:ab: + 6f:3e:99:7a:7c:db:37:13:40:b6:4d:82:47:7c:75:7a:6f:9d: + ca:89:54:8c:17:15:9a:80:9a:7c:b5:e3:4b:7e:74:fd:2f:28: + 98:79:f5:56:96:d6:5c:9c:b4:94:62:32:d2:31:1b:53:5c:71: + be:45:37:69:9f:e4:07:87:fa:d7:a7:63:bc:5c:8a:5c:71:9c: + 31:25:d8:93:ae:cf:db:98:50:e5:52:58:de:44:f7:4f:7e:4a: + a9:9c:ac:0a:84:03:ba:c4:46:e4:83:00:e6:dd:a5:33:43:e9: + 5d:ea:fc:89:85:10:57:d0:0e:5e:43:13:72:60:ec:bb:5c:e9: + c3:ca:52:2d:06:e6:5b:d5:fd:e9:30:e0:da:80:78:b2:a1:a7: + 84:ed:c0:e4:f9:f7:6d:94:a5:aa:6b:84:b1:7e:85:45:12:4c: + 8d:52:91:5d:d1:e6:d7:32:0a:97:22:59:80:db:9d:de:68:90: + bd:a7:d0:9c:11:60:86:8c:89:8a:e1:19:75:09:e8:78:bb:23: + 47:68:23:3c -----BEGIN CERTIFICATE----- -MIIDnjCCAoagAwIBAgIUVqoL8Nj9D0pM4JmF/sGbdST7AbYwDQYJKoZIhvcNAQEL +MIIDnjCCAoagAwIBAgIUMjH81kp3KzvJBwKutOe306RhViswDQYJKoZIhvcNAQEL BQAwfDELMAkGA1UEBhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0Jv emVtYW4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRIwEAYDVQQDDAlsb2NhbGhvc3Qx -HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2MjExNzUw -WhcNMjUwOTExMjExNzUwWjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu +HzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEzMjIxOTI5 +WhcNMjYwOTA4MjIxOTI5WjB8MQswCQYDVQQGEwJVUzEQMA4GA1UECAwHTW9udGFu YTEQMA4GA1UEBwwHQm96ZW1hbjEUMBIGA1UECwwLRW5naW5lZXJpbmcxEjAQBgNV BAMMCWxvY2FsaG9zdDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMCVCOFXQfJxbbfSRUEnAWXG @@ -66,10 +66,10 @@ vVSz4W1fHLwjc9EJA4kU0hC5ZMMq0KGWSrzh1Bpbx6DAwWN4D0Q3MDKWgDIjlaF3 uhPSl3PiXSXJag3DOWCktLBpQkIJ6dgIvDMgs1gip6rrxOHmYYPF0pbf2dBPrdcC AwEAAaMYMBYwFAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4IB -AQAQbXbzjpNjDUQI4ikjy3Y4zSkNX0gdD6JChBITwgCp2ebsToDLTeD7frjAKpLp -EQFyJT+ffYF2XpTjRys5w6C6upd0TKVJ+r+FKTYy1Uv8YBxzcH9J4lt0pOx/tek+ -H9u4sID0x8/PXxi0Zp4CO4hAm7HkEC138rACB1u85zh7mFUW2I7EsUkK65n4+8Tp -tXUunOz1rezkQfN8tfxRbm1GYW0J2KkI3YTl78WluGVgcda0wOvw5GC/m9mAu1LD -G9gnbtXrq5yicdmv3HFV176TbMZfeV1yG2iyFWe7QSgHQRJ8sXQwHWCwWiVHTgxa -FEmZnA2SdKPIuQyL4ArXoQ01 +AQCvervwth4SimDsyJE0o9OAkvO8xzfplnWoZ6CUuSrfgQIjKGpy3oEDM4gbYHUW +d9xyQD7Z2KtvPpl6fNs3E0C2TYJHfHV6b53KiVSMFxWagJp8teNLfnT9LyiYefVW +ltZcnLSUYjLSMRtTXHG+RTdpn+QHh/rXp2O8XIpccZwxJdiTrs/bmFDlUljeRPdP +fkqpnKwKhAO6xEbkgwDm3aUzQ+ld6vyJhRBX0A5eQxNyYOy7XOnDylItBuZb1f3p +MODagHiyoaeE7cDk+fdtlKWqa4SxfoVFEkyNUpFd0ebXMgqXIlmA253eaJC9p9Cc +EWCGjImK4Rl1Ceh4uyNHaCM8 -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-degenerate.p7b and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-degenerate.p7b differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-ICA1-pathlen0.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-ICA1-pathlen0.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-ICA1-pathlen0.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-ICA1-pathlen0.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 24:f8:97:5a:ff:43:de:e4:fe:0c:a4:8e:e4:b3:fb:97:22:81: - f0:1c:83:37:56:d8:7e:ea:d5:a9:74:3f:df:49:01:6a:4d:dc: - ec:9a:08:a7:30:ec:5b:86:bf:bd:74:c4:b7:1e:ba:e5:f0:b0: - 58:75:8a:22:49:0e:c2:6c:bd:2f:25:e1:a5:a2:61:77:7a:19: - 8f:d6:87:ef:3d:2b:32:d1:6f:21:59:04:00:76:60:c9:ae:7b: - 57:41:d7:31:97:da:4c:3e:e3:c2:49:a8:18:80:97:dd:31:97: - f3:e6:72:ee:29:83:93:f6:19:03:84:c8:e5:47:1d:da:cf:2c: - d5:95:cb:23:83:34:4b:ea:06:dd:46:60:fb:0f:da:0d:75:63: - 0c:53:36:3e:3e:03:79:d8:71:c9:ee:97:d6:31:8a:52:98:de: - dd:35:58:64:a9:7c:50:84:c3:42:63:ec:71:44:f6:b1:e2:07: - 90:c5:4e:58:17:5d:51:ab:aa:a4:ef:aa:b3:42:90:5e:fc:aa: - db:1f:5e:0e:91:e7:16:5a:11:ce:98:b8:84:3f:f0:61:76:73: - 76:09:cf:63:01:ba:79:53:35:c5:e9:76:6e:19:70:f9:46:85: - 81:8e:81:14:84:c4:bf:f8:1b:cd:cc:d9:ef:1b:d2:4e:fb:1a: - 36:de:70:35 + 2d:e4:7d:d6:d2:cc:93:aa:93:86:cd:e7:da:bb:02:f6:82:e3: + 09:29:f5:54:0f:e1:d5:51:c1:98:1f:b8:ca:96:9e:1e:f6:5b: + e3:67:bb:42:b1:48:2f:61:c6:1f:c4:a6:f4:05:0f:de:65:7f: + d5:cc:35:09:fb:48:16:e8:cd:47:1f:63:e2:0f:f9:de:97:6e: + 76:a2:29:ba:27:cc:0e:f1:b7:31:02:0f:50:ee:c6:80:8a:af: + 0f:ae:76:51:91:2e:f5:a4:a9:e4:33:cc:9b:07:3c:36:b8:ff: + 2a:62:86:09:90:b0:ac:f2:8e:7e:59:d0:11:2b:74:53:1a:9b: + a6:26:f6:d9:aa:01:81:32:0a:18:be:96:21:be:e7:a2:c9:40: + 6c:fd:24:8b:6d:28:e5:e9:27:48:ae:8d:d0:5e:6f:c1:de:ef: + e3:3d:b6:11:07:42:0e:11:86:6b:03:86:fd:06:69:c5:ac:1d: + 92:03:be:26:d1:db:78:4c:f0:93:89:32:60:ba:be:83:99:ac: + 26:c5:aa:35:34:a1:9e:b5:e1:6a:15:83:4b:50:1e:62:3d:5b: + 65:77:28:0c:24:23:e4:29:0b:90:7c:d4:2f:14:39:01:42:cc: + 0b:19:a3:bd:46:db:a1:bd:67:5e:0e:41:db:a4:63:8d:22:ed: + 64:75:d3:99 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQS1JQ0Ex LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -78,12 +78,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBACT4l1r/Q97k/gykjuSz+5cigfAcgzdW2H7q1al0P99J -AWpN3OyaCKcw7FuGv710xLceuuXwsFh1iiJJDsJsvS8l4aWiYXd6GY/Wh+89KzLR -byFZBAB2YMmue1dB1zGX2kw+48JJqBiAl90xl/Pmcu4pg5P2GQOEyOVHHdrPLNWV -yyODNEvqBt1GYPsP2g11YwxTNj4+A3nYccnul9YxilKY3t01WGSpfFCEw0Jj7HFE -9rHiB5DFTlgXXVGrqqTvqrNCkF78qtsfXg6R5xZaEc6YuIQ/8GF2c3YJz2MBunlT -NcXpdm4ZcPlGhYGOgRSExL/4G83M2e8b0k77GjbecDU= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAC3kfdbSzJOqk4bN59q7AvaC4wkp9VQP4dVRwZgfuMqW +nh72W+Nnu0KxSC9hxh/EpvQFD95lf9XMNQn7SBbozUcfY+IP+d6XbnaiKbonzA7x +tzECD1DuxoCKrw+udlGRLvWkqeQzzJsHPDa4/ypihgmQsKzyjn5Z0BErdFMam6Ym +9tmqAYEyChi+liG+56LJQGz9JIttKOXpJ0iujdBeb8He7+M9thEHQg4RhmsDhv0G +acWsHZIDvibR23hM8JOJMmC6voOZrCbFqjU0oZ614WoVg0tQHmI9W2V3KAwkI+Qp +C5B81C8UOQFCzAsZo71G26G9Z14OQdukY40i7WR105k= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - ae:9c:2c:ae:2d:09:58:73:d6:3d:20:d4:42:f0:26:98:b8:67: - 3e:60:5c:95:f2:5d:b9:b2:11:52:3b:fd:f6:94:a3:32:1c:36: - 0b:6f:b9:ac:44:6a:e1:fa:ae:8f:92:e9:c5:c0:32:2b:8e:e1: - 21:84:72:c2:35:fd:00:bd:a5:58:4e:bc:e5:fc:5a:71:89:33: - f8:fd:99:62:11:42:57:80:74:56:25:fe:48:be:3b:6c:45:cb: - f9:d2:4f:8c:23:0a:f8:0a:5d:ef:85:f2:98:71:a7:0a:36:91: - 20:af:8e:64:51:63:72:12:5b:4e:23:9f:ae:93:c3:9a:ec:c7: - eb:3f:21:50:83:8a:a3:c9:a7:a9:f2:40:2d:91:b8:24:be:f1: - 63:77:8b:4f:f5:b8:f2:a6:b7:a1:4c:07:ce:96:cc:12:af:da: - c3:db:af:99:7a:fb:40:38:6c:4e:b3:3a:76:db:24:e4:1f:c5: - ea:79:fd:a0:19:20:87:fb:e9:f3:91:16:e0:82:56:9e:f9:cf: - 09:75:a6:1b:38:e7:eb:3f:3f:bc:e3:7d:b7:42:85:4a:de:42: - f6:e6:b8:f2:cb:5c:44:95:ba:b6:45:1f:fe:39:19:e7:a9:cd: - 75:52:81:d3:b5:df:bd:bd:d9:e6:e8:36:a2:28:62:5a:89:ee: - 8a:0b:21:85 + 22:20:83:3b:37:08:72:c7:c8:e1:69:f6:01:df:ec:70:8b:60: + c4:94:81:37:1d:f4:2a:d3:92:3e:1c:6c:b9:bd:a9:ba:61:b2: + 1b:1f:b9:71:de:07:b0:5a:50:33:7b:83:22:44:e1:a5:4d:7e: + 75:5a:09:ee:f2:c4:9a:8a:5d:7d:ad:69:81:bb:a9:86:cf:65: + e8:f6:50:2c:1e:e5:15:2b:0b:85:6a:02:26:c0:38:51:04:0f: + 0a:6f:d1:b8:b4:e4:a4:b5:ae:a2:e6:ce:2c:41:b6:a2:6b:47: + 82:0d:8a:2b:dd:91:d0:67:09:15:57:03:1e:95:4f:57:06:1a: + 2a:e8:b6:fd:a7:1f:80:a0:f7:20:39:8b:3f:08:cd:7a:05:c4: + 7c:72:92:d7:ff:40:a4:6c:10:64:2d:a8:a5:cc:ef:34:ea:49: + b0:d9:28:69:5c:c7:d4:41:f5:21:3d:60:74:c7:35:3d:5f:80: + 78:34:09:60:06:f0:c8:3b:9c:b8:76:64:8e:ea:78:c1:e8:fc: + 2c:a0:9a:9e:d7:2c:5f:1b:90:05:73:5f:58:c8:ad:2a:ef:b6: + a0:f2:f1:9e:f2:7c:48:d8:11:77:e3:0a:d4:26:7d:ad:0f:c1: + 29:4b:9e:51:bc:a2:4d:98:ad:27:51:f3:1d:b3:2b:6e:00:95: + 16:ae:3c:11 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQS1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkEtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,12 +77,12 @@ BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEArpwsri0JWHPWPSDUQvAmmLhn -PmBclfJdubIRUjv99pSjMhw2C2+5rERq4fquj5LpxcAyK47hIYRywjX9AL2lWE68 -5fxacYkz+P2ZYhFCV4B0ViX+SL47bEXL+dJPjCMK+Apd74XymHGnCjaRIK+OZFFj -chJbTiOfrpPDmuzH6z8hUIOKo8mnqfJALZG4JL7xY3eLT/W48qa3oUwHzpbMEq/a -w9uvmXr7QDhsTrM6dtsk5B/F6nn9oBkgh/vp85EW4IJWnvnPCXWmGzjn6z8/vON9 -t0KFSt5C9ua48stcRJW6tkUf/jkZ56nNdVKB07Xfvb3Z5ug2oihiWonuigshhQ== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAIiCDOzcIcsfI4Wn2Ad/scItg +xJSBNx30KtOSPhxsub2pumGyGx+5cd4HsFpQM3uDIkThpU1+dVoJ7vLEmopdfa1p +gbuphs9l6PZQLB7lFSsLhWoCJsA4UQQPCm/RuLTkpLWuoubOLEG2omtHgg2KK92R +0GcJFVcDHpVPVwYaKui2/acfgKD3IDmLPwjNegXEfHKS1/9ApGwQZC2opczvNOpJ +sNkoaVzH1EH1IT1gdMc1PV+AeDQJYAbwyDucuHZkjup4wej8LKCantcsXxuQBXNf +WMitKu+2oPLxnvJ8SNgRd+MK1CZ9rQ/BKUueUbyiTZitJ1HzHbMrbgCVFq48EQ== -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 24:f8:97:5a:ff:43:de:e4:fe:0c:a4:8e:e4:b3:fb:97:22:81: - f0:1c:83:37:56:d8:7e:ea:d5:a9:74:3f:df:49:01:6a:4d:dc: - ec:9a:08:a7:30:ec:5b:86:bf:bd:74:c4:b7:1e:ba:e5:f0:b0: - 58:75:8a:22:49:0e:c2:6c:bd:2f:25:e1:a5:a2:61:77:7a:19: - 8f:d6:87:ef:3d:2b:32:d1:6f:21:59:04:00:76:60:c9:ae:7b: - 57:41:d7:31:97:da:4c:3e:e3:c2:49:a8:18:80:97:dd:31:97: - f3:e6:72:ee:29:83:93:f6:19:03:84:c8:e5:47:1d:da:cf:2c: - d5:95:cb:23:83:34:4b:ea:06:dd:46:60:fb:0f:da:0d:75:63: - 0c:53:36:3e:3e:03:79:d8:71:c9:ee:97:d6:31:8a:52:98:de: - dd:35:58:64:a9:7c:50:84:c3:42:63:ec:71:44:f6:b1:e2:07: - 90:c5:4e:58:17:5d:51:ab:aa:a4:ef:aa:b3:42:90:5e:fc:aa: - db:1f:5e:0e:91:e7:16:5a:11:ce:98:b8:84:3f:f0:61:76:73: - 76:09:cf:63:01:ba:79:53:35:c5:e9:76:6e:19:70:f9:46:85: - 81:8e:81:14:84:c4:bf:f8:1b:cd:cc:d9:ef:1b:d2:4e:fb:1a: - 36:de:70:35 + 2d:e4:7d:d6:d2:cc:93:aa:93:86:cd:e7:da:bb:02:f6:82:e3: + 09:29:f5:54:0f:e1:d5:51:c1:98:1f:b8:ca:96:9e:1e:f6:5b: + e3:67:bb:42:b1:48:2f:61:c6:1f:c4:a6:f4:05:0f:de:65:7f: + d5:cc:35:09:fb:48:16:e8:cd:47:1f:63:e2:0f:f9:de:97:6e: + 76:a2:29:ba:27:cc:0e:f1:b7:31:02:0f:50:ee:c6:80:8a:af: + 0f:ae:76:51:91:2e:f5:a4:a9:e4:33:cc:9b:07:3c:36:b8:ff: + 2a:62:86:09:90:b0:ac:f2:8e:7e:59:d0:11:2b:74:53:1a:9b: + a6:26:f6:d9:aa:01:81:32:0a:18:be:96:21:be:e7:a2:c9:40: + 6c:fd:24:8b:6d:28:e5:e9:27:48:ae:8d:d0:5e:6f:c1:de:ef: + e3:3d:b6:11:07:42:0e:11:86:6b:03:86:fd:06:69:c5:ac:1d: + 92:03:be:26:d1:db:78:4c:f0:93:89:32:60:ba:be:83:99:ac: + 26:c5:aa:35:34:a1:9e:b5:e1:6a:15:83:4b:50:1e:62:3d:5b: + 65:77:28:0c:24:23:e4:29:0b:90:7c:d4:2f:14:39:01:42:cc: + 0b:19:a3:bd:46:db:a1:bd:67:5e:0e:41:db:a4:63:8d:22:ed: + 64:75:d3:99 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQS1JQ0Ex LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -164,12 +164,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBACT4l1r/Q97k/gykjuSz+5cigfAcgzdW2H7q1al0P99J -AWpN3OyaCKcw7FuGv710xLceuuXwsFh1iiJJDsJsvS8l4aWiYXd6GY/Wh+89KzLR -byFZBAB2YMmue1dB1zGX2kw+48JJqBiAl90xl/Pmcu4pg5P2GQOEyOVHHdrPLNWV -yyODNEvqBt1GYPsP2g11YwxTNj4+A3nYccnul9YxilKY3t01WGSpfFCEw0Jj7HFE -9rHiB5DFTlgXXVGrqqTvqrNCkF78qtsfXg6R5xZaEc6YuIQ/8GF2c3YJz2MBunlT -NcXpdm4ZcPlGhYGOgRSExL/4G83M2e8b0k77GjbecDU= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAC3kfdbSzJOqk4bN59q7AvaC4wkp9VQP4dVRwZgfuMqW +nh72W+Nnu0KxSC9hxh/EpvQFD95lf9XMNQn7SBbozUcfY+IP+d6XbnaiKbonzA7x +tzECD1DuxoCKrw+udlGRLvWkqeQzzJsHPDa4/ypihgmQsKzyjn5Z0BErdFMam6Ym +9tmqAYEyChi+liG+56LJQGz9JIttKOXpJ0iujdBeb8He7+M9thEHQg4RhmsDhv0G +acWsHZIDvibR23hM8JOJMmC6voOZrCbFqjU0oZ614WoVg0tQHmI9W2V3KAwkI+Qp +C5B81C8UOQFCzAsZo71G26G9Z14OQdukY40i7WR105k= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainA-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainA-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - ae:9c:2c:ae:2d:09:58:73:d6:3d:20:d4:42:f0:26:98:b8:67: - 3e:60:5c:95:f2:5d:b9:b2:11:52:3b:fd:f6:94:a3:32:1c:36: - 0b:6f:b9:ac:44:6a:e1:fa:ae:8f:92:e9:c5:c0:32:2b:8e:e1: - 21:84:72:c2:35:fd:00:bd:a5:58:4e:bc:e5:fc:5a:71:89:33: - f8:fd:99:62:11:42:57:80:74:56:25:fe:48:be:3b:6c:45:cb: - f9:d2:4f:8c:23:0a:f8:0a:5d:ef:85:f2:98:71:a7:0a:36:91: - 20:af:8e:64:51:63:72:12:5b:4e:23:9f:ae:93:c3:9a:ec:c7: - eb:3f:21:50:83:8a:a3:c9:a7:a9:f2:40:2d:91:b8:24:be:f1: - 63:77:8b:4f:f5:b8:f2:a6:b7:a1:4c:07:ce:96:cc:12:af:da: - c3:db:af:99:7a:fb:40:38:6c:4e:b3:3a:76:db:24:e4:1f:c5: - ea:79:fd:a0:19:20:87:fb:e9:f3:91:16:e0:82:56:9e:f9:cf: - 09:75:a6:1b:38:e7:eb:3f:3f:bc:e3:7d:b7:42:85:4a:de:42: - f6:e6:b8:f2:cb:5c:44:95:ba:b6:45:1f:fe:39:19:e7:a9:cd: - 75:52:81:d3:b5:df:bd:bd:d9:e6:e8:36:a2:28:62:5a:89:ee: - 8a:0b:21:85 + 22:20:83:3b:37:08:72:c7:c8:e1:69:f6:01:df:ec:70:8b:60: + c4:94:81:37:1d:f4:2a:d3:92:3e:1c:6c:b9:bd:a9:ba:61:b2: + 1b:1f:b9:71:de:07:b0:5a:50:33:7b:83:22:44:e1:a5:4d:7e: + 75:5a:09:ee:f2:c4:9a:8a:5d:7d:ad:69:81:bb:a9:86:cf:65: + e8:f6:50:2c:1e:e5:15:2b:0b:85:6a:02:26:c0:38:51:04:0f: + 0a:6f:d1:b8:b4:e4:a4:b5:ae:a2:e6:ce:2c:41:b6:a2:6b:47: + 82:0d:8a:2b:dd:91:d0:67:09:15:57:03:1e:95:4f:57:06:1a: + 2a:e8:b6:fd:a7:1f:80:a0:f7:20:39:8b:3f:08:cd:7a:05:c4: + 7c:72:92:d7:ff:40:a4:6c:10:64:2d:a8:a5:cc:ef:34:ea:49: + b0:d9:28:69:5c:c7:d4:41:f5:21:3d:60:74:c7:35:3d:5f:80: + 78:34:09:60:06:f0:c8:3b:9c:b8:76:64:8e:ea:78:c1:e8:fc: + 2c:a0:9a:9e:d7:2c:5f:1b:90:05:73:5f:58:c8:ad:2a:ef:b6: + a0:f2:f1:9e:f2:7c:48:d8:11:77:e3:0a:d4:26:7d:ad:0f:c1: + 29:4b:9e:51:bc:a2:4d:98:ad:27:51:f3:1d:b3:2b:6e:00:95: + 16:ae:3c:11 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQS1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkEtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,10 +77,10 @@ BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEArpwsri0JWHPWPSDUQvAmmLhn -PmBclfJdubIRUjv99pSjMhw2C2+5rERq4fquj5LpxcAyK47hIYRywjX9AL2lWE68 -5fxacYkz+P2ZYhFCV4B0ViX+SL47bEXL+dJPjCMK+Apd74XymHGnCjaRIK+OZFFj -chJbTiOfrpPDmuzH6z8hUIOKo8mnqfJALZG4JL7xY3eLT/W48qa3oUwHzpbMEq/a -w9uvmXr7QDhsTrM6dtsk5B/F6nn9oBkgh/vp85EW4IJWnvnPCXWmGzjn6z8/vON9 -t0KFSt5C9ua48stcRJW6tkUf/jkZ56nNdVKB07Xfvb3Z5ug2oihiWonuigshhQ== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAIiCDOzcIcsfI4Wn2Ad/scItg +xJSBNx30KtOSPhxsub2pumGyGx+5cd4HsFpQM3uDIkThpU1+dVoJ7vLEmopdfa1p +gbuphs9l6PZQLB7lFSsLhWoCJsA4UQQPCm/RuLTkpLWuoubOLEG2omtHgg2KK92R +0GcJFVcDHpVPVwYaKui2/acfgKD3IDmLPwjNegXEfHKS1/9ApGwQZC2opczvNOpJ +sNkoaVzH1EH1IT1gdMc1PV+AeDQJYAbwyDucuHZkjup4wej8LKCantcsXxuQBXNf +WMitKu+2oPLxnvJ8SNgRd+MK1CZ9rQ/BKUueUbyiTZitJ1HzHbMrbgCVFq48EQ== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA1-pathlen0.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA1-pathlen0.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA1-pathlen0.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA1-pathlen0.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 63:ae:90:26:72:85:db:01:cb:b9:f2:51:f2:43:8d:b5:4f:95: - ab:e0:5d:9d:67:65:1c:24:ba:b0:0c:82:4e:ed:5f:9b:89:5d: - 7d:7f:b3:67:a2:09:8d:39:b5:af:9c:f5:c2:40:b3:ba:4e:73: - 72:cf:13:dd:3c:e8:3e:92:6f:46:8c:76:f9:47:71:5e:e4:81: - 68:cb:97:b3:73:35:ae:34:10:2a:ab:e7:cc:3a:0d:a7:a2:97: - 97:49:54:b2:a0:05:1c:18:5a:af:76:f0:23:b5:ff:c6:cc:1a: - 67:1a:5a:7c:57:50:cb:f8:53:78:b8:53:6a:8c:3d:dc:b2:f1: - b7:aa:f8:f2:73:a1:22:97:04:bc:d5:6e:29:5b:86:ac:63:f1: - 62:b2:2d:a5:c0:ff:2d:3f:79:e4:d0:81:fd:01:30:91:53:94: - 43:35:c8:c7:4c:b9:27:23:54:54:69:76:86:f0:c3:a0:86:c2: - 32:1b:6b:22:6c:8e:5f:9b:b1:20:73:ac:8d:da:c8:0f:ec:63: - 61:5d:e3:1f:7f:cc:b5:30:4a:1c:9b:c5:53:cb:5e:8f:b0:cc: - 52:01:75:d0:a8:d1:85:20:ef:4d:d9:2d:c7:0f:1e:ed:82:8a: - 1e:f6:ab:ed:9f:65:57:a9:3b:08:de:66:ad:a2:2e:51:37:0a: - 10:5d:04:a0 + 6c:32:8c:c0:5a:4b:18:32:75:8d:04:83:3a:7d:0a:53:81:31: + ef:7e:47:8b:f3:69:c4:c5:16:82:70:fb:26:9f:f7:c9:d9:07: + 80:45:40:e5:fd:22:f4:a9:90:b4:53:89:20:7d:8c:71:77:35: + 50:79:39:8d:1c:a4:e5:0a:cb:d4:07:34:fd:76:3b:e7:4e:b5: + ca:6b:97:4b:e4:48:3c:28:5c:7b:6f:34:fc:f8:34:65:5a:d4: + 33:a8:4f:6c:a7:c5:c9:2b:95:48:1a:d2:da:50:45:50:2a:b9: + 16:dc:6a:6a:64:f1:52:55:7c:25:f8:35:4e:8e:86:f1:01:78: + 56:11:10:6e:92:d0:45:6a:9d:03:a0:a3:b8:3b:97:fb:2d:a8: + 1f:83:9d:d0:d9:af:8b:77:08:a2:0d:8e:15:18:97:7e:4b:d9: + 6f:48:cd:a5:6e:04:29:e4:ba:c4:63:e7:a1:b1:bf:22:71:75: + 24:da:6f:73:0f:d3:fc:84:af:68:3c:3d:c5:e0:72:f3:b8:2e: + 8b:5f:d9:00:c6:7e:59:4e:b9:f4:12:a7:df:88:d0:67:f9:40: + 17:4f:25:af:72:b7:a5:ee:b2:69:3b:b2:fe:a7:1b:6b:39:e6: + be:89:0e:ed:74:87:7e:25:bd:3d:c7:f6:f1:d9:10:47:1c:54: + 47:0c:77:31 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkItSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAGOukCZyhdsBy7nyUfJDjbVPlavgXZ1nZRwkurAMgk7tX5uJXX1/ -s2eiCY05ta+c9cJAs7pOc3LPE9086D6Sb0aMdvlHcV7kgWjLl7NzNa40ECqr58w6 -Daeil5dJVLKgBRwYWq928CO1/8bMGmcaWnxXUMv4U3i4U2qMPdyy8beq+PJzoSKX -BLzVbilbhqxj8WKyLaXA/y0/eeTQgf0BMJFTlEM1yMdMuScjVFRpdobww6CGwjIb -ayJsjl+bsSBzrI3ayA/sY2Fd4x9/zLUwShybxVPLXo+wzFIBddCo0YUg703ZLccP -Hu2Cih72q+2fZVepOwjeZq2iLlE3ChBdBKA= +AQELBQADggEBAGwyjMBaSxgydY0Egzp9ClOBMe9+R4vzacTFFoJw+yaf98nZB4BF +QOX9IvSpkLRTiSB9jHF3NVB5OY0cpOUKy9QHNP12O+dOtcprl0vkSDwoXHtvNPz4 +NGVa1DOoT2ynxckrlUga0tpQRVAquRbcampk8VJVfCX4NU6OhvEBeFYREG6S0EVq +nQOgo7g7l/stqB+DndDZr4t3CKINjhUYl35L2W9IzaVuBCnkusRj56GxvyJxdSTa +b3MP0/yEr2g8PcXgcvO4Lotf2QDGfllOufQSp9+I0Gf5QBdPJa9yt6Xusmk7sv6n +G2s55r6JDu10h34lvT3H9vHZEEccVEcMdzE= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA2-pathlen1.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA2-pathlen1.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA2-pathlen1.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-ICA2-pathlen1.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - a0:92:d4:03:7b:b4:f5:cb:d8:7f:ca:e9:ff:0e:17:62:e9:72: - 82:ca:c0:84:2c:26:d3:ff:35:aa:aa:e6:1d:0d:5f:86:40:94: - 12:01:30:dc:7c:c9:84:02:9f:d5:de:a8:47:38:e9:74:c1:73: - 63:a3:37:88:3f:c5:d6:24:03:d1:9c:8b:7e:c1:62:ae:5c:ad: - c1:bc:28:b6:c7:ad:0b:ef:89:eb:87:0d:25:74:a0:f3:fa:e9: - 03:68:7a:9f:88:42:72:b8:56:e5:f7:98:d3:da:79:1e:a2:ad: - 16:0b:31:ae:52:bb:12:1d:1a:cd:a6:d2:04:e8:94:cb:37:a9: - 6c:07:3a:74:e3:90:44:56:76:36:31:7e:23:69:be:dd:b2:79: - bf:8f:72:ab:19:09:b5:5b:a8:52:db:d6:a7:63:cb:30:75:50: - 41:28:92:86:c2:46:17:00:1a:22:3c:fa:13:ea:bc:01:e8:62: - 4d:bf:8a:41:81:a2:06:0f:bb:f3:73:36:fa:1c:39:3b:db:50: - ee:83:70:96:3f:67:ab:35:cf:a5:07:f9:35:50:54:58:12:60: - 4d:ec:a9:25:97:39:b7:14:83:03:d5:8e:d9:75:7f:d8:cc:ce: - 4d:d6:43:a3:ae:19:3d:75:61:0e:fa:fe:31:e5:5e:ee:56:5a: - c8:c9:68:b0 + 10:af:3a:e5:49:81:7e:0f:ef:ad:b4:62:02:de:5b:2f:d7:bd: + 9c:59:b4:d3:ae:6c:60:12:ba:23:86:ee:34:4e:d5:29:00:1b: + 6e:1e:6b:05:96:0d:2c:4e:5c:91:74:83:ad:ba:8b:fe:cd:a6: + 9b:86:94:f7:7f:b4:5e:c9:cb:e6:6e:90:30:53:cb:44:27:f5: + 0b:37:b9:f0:bc:37:cd:b9:fc:fb:77:03:54:82:b5:d2:97:12: + 01:36:48:1f:a7:ae:7d:a3:c6:55:9e:c4:0e:0b:76:dc:e8:3c: + b0:cc:06:88:be:74:2e:03:82:72:38:80:ca:14:dc:63:82:6e: + 73:3b:77:e8:c0:4d:e7:0e:8f:7e:9c:65:36:1c:d6:47:40:74: + ef:ce:fe:6d:60:83:77:18:c9:3c:9f:f6:06:a5:16:e6:07:53: + 66:f0:49:42:dd:04:49:59:a9:b9:12:1f:a4:e9:c7:15:fb:34: + df:a5:19:62:93:65:6c:ef:66:90:61:fe:0e:19:56:0d:b2:5d: + b1:ee:55:40:32:7c:36:ff:54:6e:e4:55:16:7e:57:bd:82:f8: + b1:38:de:86:a8:e8:4d:7e:b2:b8:59:ef:79:89:a3:0e:63:39: + 61:3f:f2:ab:b4:50:eb:74:7c:79:e7:f9:66:91:ff:ea:61:27: + df:be:c2:89 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQi1JQ0Ey LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -78,12 +78,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAKCS1AN7tPXL2H/K6f8OF2LpcoLKwIQsJtP/Naqq5h0N -X4ZAlBIBMNx8yYQCn9XeqEc46XTBc2OjN4g/xdYkA9Gci37BYq5crcG8KLbHrQvv -ieuHDSV0oPP66QNoep+IQnK4VuX3mNPaeR6irRYLMa5SuxIdGs2m0gTolMs3qWwH -OnTjkERWdjYxfiNpvt2yeb+PcqsZCbVbqFLb1qdjyzB1UEEokobCRhcAGiI8+hPq -vAHoYk2/ikGBogYPu/NzNvocOTvbUO6DcJY/Z6s1z6UH+TVQVFgSYE3sqSWXObcU -gwPVjtl1f9jMzk3WQ6OuGT11YQ76/jHlXu5WWsjJaLA= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBABCvOuVJgX4P7620YgLeWy/XvZxZtNOubGASuiOG7jRO +1SkAG24eawWWDSxOXJF0g626i/7NppuGlPd/tF7Jy+ZukDBTy0Qn9Qs3ufC8N825 +/Pt3A1SCtdKXEgE2SB+nrn2jxlWexA4LdtzoPLDMBoi+dC4DgnI4gMoU3GOCbnM7 +d+jATecOj36cZTYc1kdAdO/O/m1gg3cYyTyf9galFuYHU2bwSULdBElZqbkSH6Tp +xxX7NN+lGWKTZWzvZpBh/g4ZVg2yXbHuVUAyfDb/VG7kVRZ+V72C+LE43oao6E1+ +srhZ73mJow5jOWE/8qu0UOt0fHnn+WaR/+phJ9++wok= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 4c:f5:67:b4:d0:b3:0d:bf:83:54:88:1b:f4:db:73:e2:11:2e: - 39:2f:60:86:6c:4a:f1:41:3e:18:6b:c9:df:28:0d:3c:4c:d3: - c2:52:83:07:14:84:30:4c:05:1c:23:b2:7d:45:c3:ed:ee:cb: - b0:33:e7:ff:5a:62:78:7a:db:f2:61:d7:d4:40:3a:f7:ba:3f: - 91:de:bb:7c:f9:14:0f:6e:39:82:c1:73:c7:ab:d3:72:f4:09: - 83:92:c4:fd:7b:8b:a4:f9:08:f7:c7:60:0f:d5:7a:d0:49:44: - 64:e7:13:da:8f:90:f7:ec:d5:17:7b:bc:a1:f8:04:f9:81:5a: - 57:a0:2c:e1:d0:16:96:ae:52:fb:af:6d:23:54:78:fd:97:1a: - c5:c5:6c:19:11:78:54:0e:ec:b7:d8:48:93:89:29:77:68:a7: - 2a:fa:08:82:b3:51:e9:87:b0:d1:02:c1:10:75:55:41:51:3d: - 30:e9:40:c6:a8:c2:e6:ee:09:26:e4:98:79:9e:ca:45:55:e8: - fb:f3:51:09:1c:21:22:d9:5f:33:61:7b:63:f2:c9:c2:c3:71: - 2b:70:56:5a:8a:66:1b:f6:d5:53:88:59:19:61:4e:ec:e7:72: - a9:56:04:9c:26:c9:e7:20:be:dd:52:55:1c:cb:d9:79:c5:d3: - ff:36:a2:e4 + 58:2b:2e:33:ed:42:7d:ce:8a:9f:2e:25:2f:7a:66:6f:d0:8a: + 32:ee:70:b6:a0:ee:6f:ec:0c:52:af:d8:8c:2a:11:9f:f0:f3: + 6a:41:bd:da:43:ad:82:5d:52:95:e2:6b:95:42:d1:24:09:ba: + 7d:b5:6b:73:a2:96:3d:72:ba:65:cd:9c:c6:65:52:fb:68:65: + cb:55:5d:f5:44:fa:66:72:8c:1c:33:92:a6:37:77:44:16:86: + ed:f2:d3:a9:49:ff:aa:05:96:c8:e0:1c:b7:0a:60:e7:46:5e: + 94:9d:c8:7a:31:41:98:96:38:17:a0:79:e3:1d:a3:13:06:17: + 2d:b8:fd:6f:34:ed:e3:6d:36:e7:d4:5d:cf:00:4a:ce:a6:ff: + 1c:87:d8:48:1b:65:b0:d0:72:70:48:15:bd:f1:3c:a9:06:f9: + 7e:11:c1:43:6c:0b:60:d9:d9:5c:d3:3b:c2:18:eb:3f:82:eb: + fd:a5:1a:b2:a2:23:10:c3:30:af:4a:e9:d9:05:f1:e2:4e:e9: + 41:bd:d7:dd:98:db:91:f2:15:54:4c:82:3d:22:aa:18:e5:e6: + df:9b:85:21:63:74:3d:08:a9:2e:35:e2:5e:61:32:78:04:49: + 91:0d:8c:05:12:90:ec:f5:c5:d2:71:8a:2a:65:5c:b1:d4:14: + 53:de:9b:98 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkItZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAEz1Z7TQ -sw2/g1SIG/Tbc+IRLjkvYIZsSvFBPhhryd8oDTxM08JSgwcUhDBMBRwjsn1Fw+3u -y7Az5/9aYnh62/Jh19RAOve6P5Heu3z5FA9uOYLBc8er03L0CYOSxP17i6T5CPfH -YA/VetBJRGTnE9qPkPfs1Rd7vKH4BPmBWlegLOHQFpauUvuvbSNUeP2XGsXFbBkR -eFQO7LfYSJOJKXdopyr6CIKzUemHsNECwRB1VUFRPTDpQMaowubuCSbkmHmeykVV -6PvzUQkcISLZXzNhe2PyycLDcStwVlqKZhv21VOIWRlhTuzncqlWBJwmyecgvt1S -VRzL2XnF0/82ouQ= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFgrLjPt +Qn3Oip8uJS96Zm/QijLucLag7m/sDFKv2IwqEZ/w82pBvdpDrYJdUpXia5VC0SQJ +un21a3Oilj1yumXNnMZlUvtoZctVXfVE+mZyjBwzkqY3d0QWhu3y06lJ/6oFlsjg +HLcKYOdGXpSdyHoxQZiWOBegeeMdoxMGFy24/W807eNtNufUXc8ASs6m/xyH2Egb +ZbDQcnBIFb3xPKkG+X4RwUNsC2DZ2VzTO8IY6z+C6/2lGrKiIxDDMK9K6dkF8eJO +6UG9192Y25HyFVRMgj0iqhjl5t+bhSFjdD0IqS414l5hMngESZENjAUSkOz1xdJx +iiplXLHUFFPem5g= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 63:ae:90:26:72:85:db:01:cb:b9:f2:51:f2:43:8d:b5:4f:95: - ab:e0:5d:9d:67:65:1c:24:ba:b0:0c:82:4e:ed:5f:9b:89:5d: - 7d:7f:b3:67:a2:09:8d:39:b5:af:9c:f5:c2:40:b3:ba:4e:73: - 72:cf:13:dd:3c:e8:3e:92:6f:46:8c:76:f9:47:71:5e:e4:81: - 68:cb:97:b3:73:35:ae:34:10:2a:ab:e7:cc:3a:0d:a7:a2:97: - 97:49:54:b2:a0:05:1c:18:5a:af:76:f0:23:b5:ff:c6:cc:1a: - 67:1a:5a:7c:57:50:cb:f8:53:78:b8:53:6a:8c:3d:dc:b2:f1: - b7:aa:f8:f2:73:a1:22:97:04:bc:d5:6e:29:5b:86:ac:63:f1: - 62:b2:2d:a5:c0:ff:2d:3f:79:e4:d0:81:fd:01:30:91:53:94: - 43:35:c8:c7:4c:b9:27:23:54:54:69:76:86:f0:c3:a0:86:c2: - 32:1b:6b:22:6c:8e:5f:9b:b1:20:73:ac:8d:da:c8:0f:ec:63: - 61:5d:e3:1f:7f:cc:b5:30:4a:1c:9b:c5:53:cb:5e:8f:b0:cc: - 52:01:75:d0:a8:d1:85:20:ef:4d:d9:2d:c7:0f:1e:ed:82:8a: - 1e:f6:ab:ed:9f:65:57:a9:3b:08:de:66:ad:a2:2e:51:37:0a: - 10:5d:04:a0 + 6c:32:8c:c0:5a:4b:18:32:75:8d:04:83:3a:7d:0a:53:81:31: + ef:7e:47:8b:f3:69:c4:c5:16:82:70:fb:26:9f:f7:c9:d9:07: + 80:45:40:e5:fd:22:f4:a9:90:b4:53:89:20:7d:8c:71:77:35: + 50:79:39:8d:1c:a4:e5:0a:cb:d4:07:34:fd:76:3b:e7:4e:b5: + ca:6b:97:4b:e4:48:3c:28:5c:7b:6f:34:fc:f8:34:65:5a:d4: + 33:a8:4f:6c:a7:c5:c9:2b:95:48:1a:d2:da:50:45:50:2a:b9: + 16:dc:6a:6a:64:f1:52:55:7c:25:f8:35:4e:8e:86:f1:01:78: + 56:11:10:6e:92:d0:45:6a:9d:03:a0:a3:b8:3b:97:fb:2d:a8: + 1f:83:9d:d0:d9:af:8b:77:08:a2:0d:8e:15:18:97:7e:4b:d9: + 6f:48:cd:a5:6e:04:29:e4:ba:c4:63:e7:a1:b1:bf:22:71:75: + 24:da:6f:73:0f:d3:fc:84:af:68:3c:3d:c5:e0:72:f3:b8:2e: + 8b:5f:d9:00:c6:7e:59:4e:b9:f4:12:a7:df:88:d0:67:f9:40: + 17:4f:25:af:72:b7:a5:ee:b2:69:3b:b2:fe:a7:1b:6b:39:e6: + be:89:0e:ed:74:87:7e:25:bd:3d:c7:f6:f1:d9:10:47:1c:54: + 47:0c:77:31 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkItSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAGOukCZyhdsBy7nyUfJDjbVPlavgXZ1nZRwkurAMgk7tX5uJXX1/ -s2eiCY05ta+c9cJAs7pOc3LPE9086D6Sb0aMdvlHcV7kgWjLl7NzNa40ECqr58w6 -Daeil5dJVLKgBRwYWq928CO1/8bMGmcaWnxXUMv4U3i4U2qMPdyy8beq+PJzoSKX -BLzVbilbhqxj8WKyLaXA/y0/eeTQgf0BMJFTlEM1yMdMuScjVFRpdobww6CGwjIb -ayJsjl+bsSBzrI3ayA/sY2Fd4x9/zLUwShybxVPLXo+wzFIBddCo0YUg703ZLccP -Hu2Cih72q+2fZVepOwjeZq2iLlE3ChBdBKA= +AQELBQADggEBAGwyjMBaSxgydY0Egzp9ClOBMe9+R4vzacTFFoJw+yaf98nZB4BF +QOX9IvSpkLRTiSB9jHF3NVB5OY0cpOUKy9QHNP12O+dOtcprl0vkSDwoXHtvNPz4 +NGVa1DOoT2ynxckrlUga0tpQRVAquRbcampk8VJVfCX4NU6OhvEBeFYREG6S0EVq +nQOgo7g7l/stqB+DndDZr4t3CKINjhUYl35L2W9IzaVuBCnkusRj56GxvyJxdSTa +b3MP0/yEr2g8PcXgcvO4Lotf2QDGfllOufQSp9+I0Gf5QBdPJa9yt6Xusmk7sv6n +G2s55r6JDu10h34lvT3H9vHZEEccVEcMdzE= -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -213,34 +213,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - a0:92:d4:03:7b:b4:f5:cb:d8:7f:ca:e9:ff:0e:17:62:e9:72: - 82:ca:c0:84:2c:26:d3:ff:35:aa:aa:e6:1d:0d:5f:86:40:94: - 12:01:30:dc:7c:c9:84:02:9f:d5:de:a8:47:38:e9:74:c1:73: - 63:a3:37:88:3f:c5:d6:24:03:d1:9c:8b:7e:c1:62:ae:5c:ad: - c1:bc:28:b6:c7:ad:0b:ef:89:eb:87:0d:25:74:a0:f3:fa:e9: - 03:68:7a:9f:88:42:72:b8:56:e5:f7:98:d3:da:79:1e:a2:ad: - 16:0b:31:ae:52:bb:12:1d:1a:cd:a6:d2:04:e8:94:cb:37:a9: - 6c:07:3a:74:e3:90:44:56:76:36:31:7e:23:69:be:dd:b2:79: - bf:8f:72:ab:19:09:b5:5b:a8:52:db:d6:a7:63:cb:30:75:50: - 41:28:92:86:c2:46:17:00:1a:22:3c:fa:13:ea:bc:01:e8:62: - 4d:bf:8a:41:81:a2:06:0f:bb:f3:73:36:fa:1c:39:3b:db:50: - ee:83:70:96:3f:67:ab:35:cf:a5:07:f9:35:50:54:58:12:60: - 4d:ec:a9:25:97:39:b7:14:83:03:d5:8e:d9:75:7f:d8:cc:ce: - 4d:d6:43:a3:ae:19:3d:75:61:0e:fa:fe:31:e5:5e:ee:56:5a: - c8:c9:68:b0 + 10:af:3a:e5:49:81:7e:0f:ef:ad:b4:62:02:de:5b:2f:d7:bd: + 9c:59:b4:d3:ae:6c:60:12:ba:23:86:ee:34:4e:d5:29:00:1b: + 6e:1e:6b:05:96:0d:2c:4e:5c:91:74:83:ad:ba:8b:fe:cd:a6: + 9b:86:94:f7:7f:b4:5e:c9:cb:e6:6e:90:30:53:cb:44:27:f5: + 0b:37:b9:f0:bc:37:cd:b9:fc:fb:77:03:54:82:b5:d2:97:12: + 01:36:48:1f:a7:ae:7d:a3:c6:55:9e:c4:0e:0b:76:dc:e8:3c: + b0:cc:06:88:be:74:2e:03:82:72:38:80:ca:14:dc:63:82:6e: + 73:3b:77:e8:c0:4d:e7:0e:8f:7e:9c:65:36:1c:d6:47:40:74: + ef:ce:fe:6d:60:83:77:18:c9:3c:9f:f6:06:a5:16:e6:07:53: + 66:f0:49:42:dd:04:49:59:a9:b9:12:1f:a4:e9:c7:15:fb:34: + df:a5:19:62:93:65:6c:ef:66:90:61:fe:0e:19:56:0d:b2:5d: + b1:ee:55:40:32:7c:36:ff:54:6e:e4:55:16:7e:57:bd:82:f8: + b1:38:de:86:a8:e8:4d:7e:b2:b8:59:ef:79:89:a3:0e:63:39: + 61:3f:f2:ab:b4:50:eb:74:7c:79:e7:f9:66:91:ff:ea:61:27: + df:be:c2:89 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQi1JQ0Ey LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -254,12 +254,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAKCS1AN7tPXL2H/K6f8OF2LpcoLKwIQsJtP/Naqq5h0N -X4ZAlBIBMNx8yYQCn9XeqEc46XTBc2OjN4g/xdYkA9Gci37BYq5crcG8KLbHrQvv -ieuHDSV0oPP66QNoep+IQnK4VuX3mNPaeR6irRYLMa5SuxIdGs2m0gTolMs3qWwH -OnTjkERWdjYxfiNpvt2yeb+PcqsZCbVbqFLb1qdjyzB1UEEokobCRhcAGiI8+hPq -vAHoYk2/ikGBogYPu/NzNvocOTvbUO6DcJY/Z6s1z6UH+TVQVFgSYE3sqSWXObcU -gwPVjtl1f9jMzk3WQ6OuGT11YQ76/jHlXu5WWsjJaLA= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBABCvOuVJgX4P7620YgLeWy/XvZxZtNOubGASuiOG7jRO +1SkAG24eawWWDSxOXJF0g626i/7NppuGlPd/tF7Jy+ZukDBTy0Qn9Qs3ufC8N825 +/Pt3A1SCtdKXEgE2SB+nrn2jxlWexA4LdtzoPLDMBoi+dC4DgnI4gMoU3GOCbnM7 +d+jATecOj36cZTYc1kdAdO/O/m1gg3cYyTyf9galFuYHU2bwSULdBElZqbkSH6Tp +xxX7NN+lGWKTZWzvZpBh/g4ZVg2yXbHuVUAyfDb/VG7kVRZ+V72C+LE43oao6E1+ +srhZ73mJow5jOWE/8qu0UOt0fHnn+WaR/+phJ9++wok= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainB-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainB-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 4c:f5:67:b4:d0:b3:0d:bf:83:54:88:1b:f4:db:73:e2:11:2e: - 39:2f:60:86:6c:4a:f1:41:3e:18:6b:c9:df:28:0d:3c:4c:d3: - c2:52:83:07:14:84:30:4c:05:1c:23:b2:7d:45:c3:ed:ee:cb: - b0:33:e7:ff:5a:62:78:7a:db:f2:61:d7:d4:40:3a:f7:ba:3f: - 91:de:bb:7c:f9:14:0f:6e:39:82:c1:73:c7:ab:d3:72:f4:09: - 83:92:c4:fd:7b:8b:a4:f9:08:f7:c7:60:0f:d5:7a:d0:49:44: - 64:e7:13:da:8f:90:f7:ec:d5:17:7b:bc:a1:f8:04:f9:81:5a: - 57:a0:2c:e1:d0:16:96:ae:52:fb:af:6d:23:54:78:fd:97:1a: - c5:c5:6c:19:11:78:54:0e:ec:b7:d8:48:93:89:29:77:68:a7: - 2a:fa:08:82:b3:51:e9:87:b0:d1:02:c1:10:75:55:41:51:3d: - 30:e9:40:c6:a8:c2:e6:ee:09:26:e4:98:79:9e:ca:45:55:e8: - fb:f3:51:09:1c:21:22:d9:5f:33:61:7b:63:f2:c9:c2:c3:71: - 2b:70:56:5a:8a:66:1b:f6:d5:53:88:59:19:61:4e:ec:e7:72: - a9:56:04:9c:26:c9:e7:20:be:dd:52:55:1c:cb:d9:79:c5:d3: - ff:36:a2:e4 + 58:2b:2e:33:ed:42:7d:ce:8a:9f:2e:25:2f:7a:66:6f:d0:8a: + 32:ee:70:b6:a0:ee:6f:ec:0c:52:af:d8:8c:2a:11:9f:f0:f3: + 6a:41:bd:da:43:ad:82:5d:52:95:e2:6b:95:42:d1:24:09:ba: + 7d:b5:6b:73:a2:96:3d:72:ba:65:cd:9c:c6:65:52:fb:68:65: + cb:55:5d:f5:44:fa:66:72:8c:1c:33:92:a6:37:77:44:16:86: + ed:f2:d3:a9:49:ff:aa:05:96:c8:e0:1c:b7:0a:60:e7:46:5e: + 94:9d:c8:7a:31:41:98:96:38:17:a0:79:e3:1d:a3:13:06:17: + 2d:b8:fd:6f:34:ed:e3:6d:36:e7:d4:5d:cf:00:4a:ce:a6:ff: + 1c:87:d8:48:1b:65:b0:d0:72:70:48:15:bd:f1:3c:a9:06:f9: + 7e:11:c1:43:6c:0b:60:d9:d9:5c:d3:3b:c2:18:eb:3f:82:eb: + fd:a5:1a:b2:a2:23:10:c3:30:af:4a:e9:d9:05:f1:e2:4e:e9: + 41:bd:d7:dd:98:db:91:f2:15:54:4c:82:3d:22:aa:18:e5:e6: + df:9b:85:21:63:74:3d:08:a9:2e:35:e2:5e:61:32:78:04:49: + 91:0d:8c:05:12:90:ec:f5:c5:d2:71:8a:2a:65:5c:b1:d4:14: + 53:de:9b:98 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQi1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkItZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluQi1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAEz1Z7TQ -sw2/g1SIG/Tbc+IRLjkvYIZsSvFBPhhryd8oDTxM08JSgwcUhDBMBRwjsn1Fw+3u -y7Az5/9aYnh62/Jh19RAOve6P5Heu3z5FA9uOYLBc8er03L0CYOSxP17i6T5CPfH -YA/VetBJRGTnE9qPkPfs1Rd7vKH4BPmBWlegLOHQFpauUvuvbSNUeP2XGsXFbBkR -eFQO7LfYSJOJKXdopyr6CIKzUemHsNECwRB1VUFRPTDpQMaowubuCSbkmHmeykVV -6PvzUQkcISLZXzNhe2PyycLDcStwVlqKZhv21VOIWRlhTuzncqlWBJwmyecgvt1S -VRzL2XnF0/82ouQ= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAFgrLjPt +Qn3Oip8uJS96Zm/QijLucLag7m/sDFKv2IwqEZ/w82pBvdpDrYJdUpXia5VC0SQJ +un21a3Oilj1yumXNnMZlUvtoZctVXfVE+mZyjBwzkqY3d0QWhu3y06lJ/6oFlsjg +HLcKYOdGXpSdyHoxQZiWOBegeeMdoxMGFy24/W807eNtNufUXc8ASs6m/xyH2Egb +ZbDQcnBIFb3xPKkG+X4RwUNsC2DZ2VzTO8IY6z+C6/2lGrKiIxDDMK9K6dkF8eJO +6UG9192Y25HyFVRMgj0iqhjl5t+bhSFjdD0IqS414l5hMngESZENjAUSkOz1xdJx +iiplXLHUFFPem5g= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-ICA1-pathlen1.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-ICA1-pathlen1.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-ICA1-pathlen1.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-ICA1-pathlen1.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 85:07:b7:5d:63:bb:41:42:b4:d4:b7:26:cc:c8:70:90:38:aa: - 08:58:77:21:dc:34:06:63:43:47:22:4f:9d:3d:bc:6a:da:9a: - b7:0c:7a:1a:bf:76:8b:32:34:b5:42:ad:60:d6:38:6a:91:df: - d7:49:e3:a2:1e:53:0b:0e:dc:56:44:dd:bf:7a:c4:72:82:c9: - 77:76:b4:52:84:2f:1e:5b:a6:58:b1:58:d9:67:9c:43:cf:28: - 3e:f4:cd:2d:9c:af:bc:e9:ec:82:2c:42:da:40:06:55:a8:1f: - f3:e4:dd:8a:a4:ba:9f:45:71:f1:b9:35:a0:fa:77:4b:67:f2: - 0d:78:7e:bf:db:f7:32:41:a3:0d:e4:38:ce:ec:fb:a4:5e:19: - 8a:7c:d6:ff:ee:cd:a7:de:d8:6a:e7:b5:30:6c:2b:a1:d9:9c: - 04:28:ee:5a:d6:83:84:15:f3:39:25:1e:9d:bc:12:09:1e:99: - 69:ae:0e:9e:92:92:69:2e:12:a3:d4:40:0a:0a:66:5a:0a:ec: - e3:7c:2a:55:b5:30:60:a7:fa:ed:26:f4:b3:b8:c7:70:01:ed: - ed:dd:cc:1d:d1:43:c1:a2:72:b1:cd:20:89:a7:95:ea:e8:ca: - 01:17:73:ab:99:67:35:f6:d5:e9:1a:06:c9:15:b2:47:2d:8c: - 35:5b:57:12 + 52:84:69:eb:36:71:76:74:41:ab:d8:70:ae:18:64:3f:b1:8d: + ef:ad:2f:6b:6b:e5:c3:5e:41:ca:6c:30:23:b5:6b:26:c2:18: + fa:b4:97:95:9f:50:16:29:94:5e:91:1b:90:22:db:1e:a8:7f: + eb:db:b9:38:d8:7d:8d:f9:1b:b2:c4:ab:0e:10:d4:ae:8e:a3: + 56:c5:e0:ed:f9:37:eb:ce:1f:93:70:32:2a:aa:30:90:38:02: + 58:e4:e7:e7:bb:80:64:a0:ef:8d:2f:15:2d:8b:d0:d8:b0:72: + 0c:63:76:ba:cb:c8:1c:79:34:d9:d3:23:15:c2:b2:da:89:1a: + c6:24:16:60:2f:8a:80:fd:ac:cf:3d:0d:eb:1b:e1:ca:aa:37: + e5:a1:80:8d:14:e1:ca:94:f2:c4:7c:22:4a:54:f6:e4:e5:db: + 57:13:a3:fb:9a:63:13:2c:6e:4b:33:cc:1e:de:73:7e:00:b9: + 8f:3d:bf:ff:af:81:83:31:2e:42:b2:c9:df:23:ae:9a:35:cf: + 3d:f4:98:fd:dc:58:15:01:41:a7:c0:6c:09:cd:88:39:24:71: + 10:97:f3:e5:0e:ad:59:77:83:00:a0:03:9e:c8:cb:26:18:d1: + a1:60:bd:8a:53:a8:4e:08:0e:57:1e:5b:1d:df:a5:bd:04:01: + 66:dd:30:2d -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQy1JQ0Ex LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -78,12 +78,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAIUHt11ju0FCtNS3JszIcJA4qghYdyHcNAZjQ0ciT509 -vGramrcMehq/dosyNLVCrWDWOGqR39dJ46IeUwsO3FZE3b96xHKCyXd2tFKELx5b -plixWNlnnEPPKD70zS2cr7zp7IIsQtpABlWoH/Pk3Yqkup9FcfG5NaD6d0tn8g14 -fr/b9zJBow3kOM7s+6ReGYp81v/uzafe2GrntTBsK6HZnAQo7lrWg4QV8zklHp28 -EgkemWmuDp6SkmkuEqPUQAoKZloK7ON8KlW1MGCn+u0m9LO4x3AB7e3dzB3RQ8Gi -crHNIImnleroygEXc6uZZzX21ekaBskVskctjDVbVxI= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFKEaes2cXZ0QavYcK4YZD+xje+tL2tr5cNeQcpsMCO1 +aybCGPq0l5WfUBYplF6RG5Ai2x6of+vbuTjYfY35G7LEqw4Q1K6Oo1bF4O35N+vO +H5NwMiqqMJA4Aljk5+e7gGSg740vFS2L0NiwcgxjdrrLyBx5NNnTIxXCstqJGsYk +FmAvioD9rM89Desb4cqqN+WhgI0U4cqU8sR8IkpU9uTl21cTo/uaYxMsbkszzB7e +c34AuY89v/+vgYMxLkKyyd8jrpo1zz30mP3cWBUBQafAbAnNiDkkcRCX8+UOrVl3 +gwCgA57IyyYY0aFgvYpTqE4IDlceWx3fpb0EAWbdMC0= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 93:2b:f0:ef:0b:81:7e:80:7e:46:ba:e4:21:85:d6:aa:ac:b3: - 22:9f:0e:99:48:5c:bb:68:30:c3:98:24:14:fc:9c:63:4d:2f: - 9d:82:03:61:cf:d5:9d:82:91:58:ba:45:6a:e1:aa:81:d4:e8: - 0c:a8:06:0a:a5:5e:56:84:0a:25:81:43:1c:db:e3:8d:b6:1c: - 16:a8:79:bf:9e:ac:61:a2:39:41:16:0f:e6:49:3c:26:34:a7: - 95:e6:20:41:2e:d5:e9:3e:fa:8c:fe:6e:2e:25:d8:a8:08:18: - 92:a6:e5:9a:91:b2:40:94:64:ef:8d:55:7a:b3:71:f8:0f:af: - 2c:40:73:f2:74:1b:c0:9e:f2:1c:98:7d:37:e1:04:07:8c:b9: - 8d:bf:5f:1a:0a:24:ac:26:b3:5f:0c:31:78:a0:ab:9d:88:51: - aa:b6:0c:7c:6f:3d:d6:d1:93:81:5e:38:32:a3:95:8c:04:be: - 24:d0:32:8b:94:d5:f9:71:c8:04:f1:c5:85:59:c2:d4:20:0d: - ef:bc:f2:3d:4a:86:05:92:14:bb:42:95:c3:45:e5:97:e1:33: - 74:52:93:c8:38:30:b5:b8:97:e2:ba:bb:73:2a:3d:25:d0:c6: - 09:19:3b:f6:02:f9:9c:0b:4f:8b:10:03:83:36:59:7d:b8:a1: - 12:60:e5:67 + b0:8e:f5:a6:d7:df:13:fb:72:58:82:1e:b8:e8:34:aa:12:cc: + 39:4e:ad:b7:ff:b7:1b:d4:91:25:12:4f:af:f4:f0:9a:bf:e4: + 0f:f1:3d:bb:46:e9:c1:61:a5:b1:42:f3:13:75:b1:60:df:ba: + 36:62:f4:4d:e1:2c:23:ff:92:db:81:dc:72:71:74:00:6b:a2: + 29:cd:6f:ff:3c:db:35:6c:8c:bf:d5:d4:af:20:78:65:6c:f3: + 5c:e5:84:22:b6:1c:06:6e:fa:b1:fb:07:3e:76:60:58:36:73: + 3c:97:ab:5a:27:56:d6:f9:ef:43:34:67:af:57:3e:d2:dc:2e: + e7:e4:1c:8b:cb:90:11:1a:b9:8e:01:3f:e4:a2:6c:93:b3:90: + cd:6c:05:1e:d7:2f:7a:00:de:00:be:e6:35:4c:25:fc:19:96: + 27:9f:0d:0b:a8:9d:14:d9:89:4b:13:ec:53:e9:f9:31:b7:3f: + 95:61:7e:b3:bb:32:a3:f1:94:53:49:b4:f5:c8:ee:83:0d:69: + 5c:89:c3:21:e4:a5:d0:9c:af:30:af:64:e3:78:53:d5:5e:72: + 2b:d8:d7:7a:45:03:ba:9f:93:c9:fb:8d:cc:94:41:d5:2a:eb: + 87:ee:9f:c8:bf:ca:d1:6e:92:6b:96:af:20:6e:a5:42:9b:1d: + 8b:2b:ad:d5 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQy1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkMtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,12 +77,12 @@ BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAkyvw7wuBfoB+RrrkIYXWqqyz -Ip8OmUhcu2gww5gkFPycY00vnYIDYc/VnYKRWLpFauGqgdToDKgGCqVeVoQKJYFD -HNvjjbYcFqh5v56sYaI5QRYP5kk8JjSnleYgQS7V6T76jP5uLiXYqAgYkqblmpGy -QJRk741VerNx+A+vLEBz8nQbwJ7yHJh9N+EEB4y5jb9fGgokrCazXwwxeKCrnYhR -qrYMfG891tGTgV44MqOVjAS+JNAyi5TV+XHIBPHFhVnC1CAN77zyPUqGBZIUu0KV -w0Xll+EzdFKTyDgwtbiX4rq7cyo9JdDGCRk79gL5nAtPixADgzZZfbihEmDlZw== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAsI71ptffE/tyWIIeuOg0qhLM +OU6tt/+3G9SRJRJPr/Twmr/kD/E9u0bpwWGlsULzE3WxYN+6NmL0TeEsI/+S24Hc +cnF0AGuiKc1v/zzbNWyMv9XUryB4ZWzzXOWEIrYcBm76sfsHPnZgWDZzPJerWidW +1vnvQzRnr1c+0twu5+Qci8uQERq5jgE/5KJsk7OQzWwFHtcvegDeAL7mNUwl/BmW +J58NC6idFNmJSxPsU+n5Mbc/lWF+s7syo/GUU0m09cjugw1pXInDIeSl0JyvMK9k +43hT1V5yK9jXekUDup+TyfuNzJRB1Srrh+6fyL/K0W6Sa5avIG6lQpsdiyut1Q== -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:1 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 85:07:b7:5d:63:bb:41:42:b4:d4:b7:26:cc:c8:70:90:38:aa: - 08:58:77:21:dc:34:06:63:43:47:22:4f:9d:3d:bc:6a:da:9a: - b7:0c:7a:1a:bf:76:8b:32:34:b5:42:ad:60:d6:38:6a:91:df: - d7:49:e3:a2:1e:53:0b:0e:dc:56:44:dd:bf:7a:c4:72:82:c9: - 77:76:b4:52:84:2f:1e:5b:a6:58:b1:58:d9:67:9c:43:cf:28: - 3e:f4:cd:2d:9c:af:bc:e9:ec:82:2c:42:da:40:06:55:a8:1f: - f3:e4:dd:8a:a4:ba:9f:45:71:f1:b9:35:a0:fa:77:4b:67:f2: - 0d:78:7e:bf:db:f7:32:41:a3:0d:e4:38:ce:ec:fb:a4:5e:19: - 8a:7c:d6:ff:ee:cd:a7:de:d8:6a:e7:b5:30:6c:2b:a1:d9:9c: - 04:28:ee:5a:d6:83:84:15:f3:39:25:1e:9d:bc:12:09:1e:99: - 69:ae:0e:9e:92:92:69:2e:12:a3:d4:40:0a:0a:66:5a:0a:ec: - e3:7c:2a:55:b5:30:60:a7:fa:ed:26:f4:b3:b8:c7:70:01:ed: - ed:dd:cc:1d:d1:43:c1:a2:72:b1:cd:20:89:a7:95:ea:e8:ca: - 01:17:73:ab:99:67:35:f6:d5:e9:1a:06:c9:15:b2:47:2d:8c: - 35:5b:57:12 + 52:84:69:eb:36:71:76:74:41:ab:d8:70:ae:18:64:3f:b1:8d: + ef:ad:2f:6b:6b:e5:c3:5e:41:ca:6c:30:23:b5:6b:26:c2:18: + fa:b4:97:95:9f:50:16:29:94:5e:91:1b:90:22:db:1e:a8:7f: + eb:db:b9:38:d8:7d:8d:f9:1b:b2:c4:ab:0e:10:d4:ae:8e:a3: + 56:c5:e0:ed:f9:37:eb:ce:1f:93:70:32:2a:aa:30:90:38:02: + 58:e4:e7:e7:bb:80:64:a0:ef:8d:2f:15:2d:8b:d0:d8:b0:72: + 0c:63:76:ba:cb:c8:1c:79:34:d9:d3:23:15:c2:b2:da:89:1a: + c6:24:16:60:2f:8a:80:fd:ac:cf:3d:0d:eb:1b:e1:ca:aa:37: + e5:a1:80:8d:14:e1:ca:94:f2:c4:7c:22:4a:54:f6:e4:e5:db: + 57:13:a3:fb:9a:63:13:2c:6e:4b:33:cc:1e:de:73:7e:00:b9: + 8f:3d:bf:ff:af:81:83:31:2e:42:b2:c9:df:23:ae:9a:35:cf: + 3d:f4:98:fd:dc:58:15:01:41:a7:c0:6c:09:cd:88:39:24:71: + 10:97:f3:e5:0e:ad:59:77:83:00:a0:03:9e:c8:cb:26:18:d1: + a1:60:bd:8a:53:a8:4e:08:0e:57:1e:5b:1d:df:a5:bd:04:01: + 66:dd:30:2d -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluQy1JQ0Ex LXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -164,12 +164,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAIUHt11ju0FCtNS3JszIcJA4qghYdyHcNAZjQ0ciT509 -vGramrcMehq/dosyNLVCrWDWOGqR39dJ46IeUwsO3FZE3b96xHKCyXd2tFKELx5b -plixWNlnnEPPKD70zS2cr7zp7IIsQtpABlWoH/Pk3Yqkup9FcfG5NaD6d0tn8g14 -fr/b9zJBow3kOM7s+6ReGYp81v/uzafe2GrntTBsK6HZnAQo7lrWg4QV8zklHp28 -EgkemWmuDp6SkmkuEqPUQAoKZloK7ON8KlW1MGCn+u0m9LO4x3AB7e3dzB3RQ8Gi -crHNIImnleroygEXc6uZZzX21ekaBskVskctjDVbVxI= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFKEaes2cXZ0QavYcK4YZD+xje+tL2tr5cNeQcpsMCO1 +aybCGPq0l5WfUBYplF6RG5Ai2x6of+vbuTjYfY35G7LEqw4Q1K6Oo1bF4O35N+vO +H5NwMiqqMJA4Aljk5+e7gGSg740vFS2L0NiwcgxjdrrLyBx5NNnTIxXCstqJGsYk +FmAvioD9rM89Desb4cqqN+WhgI0U4cqU8sR8IkpU9uTl21cTo/uaYxMsbkszzB7e +c34AuY89v/+vgYMxLkKyyd8jrpo1zz30mP3cWBUBQafAbAnNiDkkcRCX8+UOrVl3 +gwCgA57IyyYY0aFgvYpTqE4IDlceWx3fpb0EAWbdMC0= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainC-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainC-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 93:2b:f0:ef:0b:81:7e:80:7e:46:ba:e4:21:85:d6:aa:ac:b3: - 22:9f:0e:99:48:5c:bb:68:30:c3:98:24:14:fc:9c:63:4d:2f: - 9d:82:03:61:cf:d5:9d:82:91:58:ba:45:6a:e1:aa:81:d4:e8: - 0c:a8:06:0a:a5:5e:56:84:0a:25:81:43:1c:db:e3:8d:b6:1c: - 16:a8:79:bf:9e:ac:61:a2:39:41:16:0f:e6:49:3c:26:34:a7: - 95:e6:20:41:2e:d5:e9:3e:fa:8c:fe:6e:2e:25:d8:a8:08:18: - 92:a6:e5:9a:91:b2:40:94:64:ef:8d:55:7a:b3:71:f8:0f:af: - 2c:40:73:f2:74:1b:c0:9e:f2:1c:98:7d:37:e1:04:07:8c:b9: - 8d:bf:5f:1a:0a:24:ac:26:b3:5f:0c:31:78:a0:ab:9d:88:51: - aa:b6:0c:7c:6f:3d:d6:d1:93:81:5e:38:32:a3:95:8c:04:be: - 24:d0:32:8b:94:d5:f9:71:c8:04:f1:c5:85:59:c2:d4:20:0d: - ef:bc:f2:3d:4a:86:05:92:14:bb:42:95:c3:45:e5:97:e1:33: - 74:52:93:c8:38:30:b5:b8:97:e2:ba:bb:73:2a:3d:25:d0:c6: - 09:19:3b:f6:02:f9:9c:0b:4f:8b:10:03:83:36:59:7d:b8:a1: - 12:60:e5:67 + b0:8e:f5:a6:d7:df:13:fb:72:58:82:1e:b8:e8:34:aa:12:cc: + 39:4e:ad:b7:ff:b7:1b:d4:91:25:12:4f:af:f4:f0:9a:bf:e4: + 0f:f1:3d:bb:46:e9:c1:61:a5:b1:42:f3:13:75:b1:60:df:ba: + 36:62:f4:4d:e1:2c:23:ff:92:db:81:dc:72:71:74:00:6b:a2: + 29:cd:6f:ff:3c:db:35:6c:8c:bf:d5:d4:af:20:78:65:6c:f3: + 5c:e5:84:22:b6:1c:06:6e:fa:b1:fb:07:3e:76:60:58:36:73: + 3c:97:ab:5a:27:56:d6:f9:ef:43:34:67:af:57:3e:d2:dc:2e: + e7:e4:1c:8b:cb:90:11:1a:b9:8e:01:3f:e4:a2:6c:93:b3:90: + cd:6c:05:1e:d7:2f:7a:00:de:00:be:e6:35:4c:25:fc:19:96: + 27:9f:0d:0b:a8:9d:14:d9:89:4b:13:ec:53:e9:f9:31:b7:3f: + 95:61:7e:b3:bb:32:a3:f1:94:53:49:b4:f5:c8:ee:83:0d:69: + 5c:89:c3:21:e4:a5:d0:9c:af:30:af:64:e3:78:53:d5:5e:72: + 2b:d8:d7:7a:45:03:ba:9f:93:c9:fb:8d:cc:94:41:d5:2a:eb: + 87:ee:9f:c8:bf:ca:d1:6e:92:6b:96:af:20:6e:a5:42:9b:1d: + 8b:2b:ad:d5 -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluQy1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkMtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,10 +77,10 @@ BhMCVVMxEDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNV BAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cu d29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CAWQw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAkyvw7wuBfoB+RrrkIYXWqqyz -Ip8OmUhcu2gww5gkFPycY00vnYIDYc/VnYKRWLpFauGqgdToDKgGCqVeVoQKJYFD -HNvjjbYcFqh5v56sYaI5QRYP5kk8JjSnleYgQS7V6T76jP5uLiXYqAgYkqblmpGy -QJRk741VerNx+A+vLEBz8nQbwJ7yHJh9N+EEB4y5jb9fGgokrCazXwwxeKCrnYhR -qrYMfG891tGTgV44MqOVjAS+JNAyi5TV+XHIBPHFhVnC1CAN77zyPUqGBZIUu0KV -w0Xll+EzdFKTyDgwtbiX4rq7cyo9JdDGCRk79gL5nAtPixADgzZZfbihEmDlZw== +CQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEAsI71ptffE/tyWIIeuOg0qhLM +OU6tt/+3G9SRJRJPr/Twmr/kD/E9u0bpwWGlsULzE3WxYN+6NmL0TeEsI/+S24Hc +cnF0AGuiKc1v/zzbNWyMv9XUryB4ZWzzXOWEIrYcBm76sfsHPnZgWDZzPJerWidW +1vnvQzRnr1c+0twu5+Qci8uQERq5jgE/5KJsk7OQzWwFHtcvegDeAL7mNUwl/BmW +J58NC6idFNmJSxPsU+n5Mbc/lWF+s7syo/GUU0m09cjugw1pXInDIeSl0JyvMK9k +43hT1V5yK9jXekUDup+TyfuNzJRB1Srrh+6fyL/K0W6Sa5avIG6lQpsdiyut1Q== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-ICA1-pathlen127.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-ICA1-pathlen127.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-ICA1-pathlen127.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-ICA1-pathlen127.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:127 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 14:5a:3c:65:84:c3:96:6c:0a:15:61:18:89:b8:b5:0b:66:41: - 17:bd:d9:09:03:d5:7f:fc:3c:8a:1b:2e:64:60:8d:8a:a3:47: - 55:c7:63:d1:e4:ab:15:76:d6:d3:82:84:d6:19:05:08:f5:c7: - f2:ad:d3:de:32:03:f7:bc:b6:43:5a:e7:fd:9e:7b:b5:9d:c9: - ba:0a:5a:7f:08:cf:15:f5:a1:50:89:29:fb:49:b2:78:60:30: - 28:36:2c:81:b2:0a:e0:ec:a7:d9:9f:fe:f7:38:2f:b6:6f:5a: - bb:29:b2:a5:cc:23:09:5c:f8:00:05:3a:53:3f:37:41:5d:7c: - dd:fc:69:00:3a:91:e5:c4:42:b0:0a:db:90:2a:cd:f6:99:2e: - ae:04:b7:6d:df:e8:71:9b:7f:5b:6f:78:4d:9b:78:83:01:40: - e1:fc:fa:e3:f0:fe:5a:f3:ae:a9:30:9e:da:ba:9e:6e:aa:e0: - a5:98:d1:f0:24:96:c7:37:c4:3e:5d:1b:b1:ff:5d:a1:8f:7f: - d7:78:c7:0d:c6:ce:20:e3:73:15:b0:23:24:12:e0:d7:f0:b3: - f8:b2:c0:c7:e9:53:0e:d7:b3:a6:a2:54:06:76:c0:09:31:17: - 73:42:07:e8:25:fd:6d:11:1d:1f:4d:2a:1f:06:52:68:5f:e6: - 66:c2:6a:cf + ae:70:5a:14:f9:fb:c6:c5:5e:19:92:18:5e:fc:6d:7a:9c:90: + 34:2f:d4:7e:42:cf:88:80:3c:65:96:f7:4e:b7:26:c5:aa:6c: + 6c:a0:31:51:7b:ad:92:42:9c:16:7e:5c:1a:f7:0b:d1:8a:b6: + 41:fa:d1:a1:fc:86:6f:32:15:88:a8:b2:69:a6:38:2a:16:57: + 55:d8:be:8f:6e:fa:4b:e6:a1:2b:db:4d:64:0c:08:76:31:37: + ec:c4:6d:2b:3a:62:a2:2e:9a:0d:29:57:95:3a:76:e4:b2:63: + 90:07:72:04:f4:59:6e:be:94:00:13:0d:13:99:f8:97:df:16: + b5:70:32:d8:9f:84:07:3d:9d:be:87:50:33:3e:4e:ae:51:f1: + 12:33:96:c4:d5:d1:df:cd:bf:eb:f5:20:a3:4c:36:9e:bd:d3: + 5e:7f:56:05:e9:24:65:77:59:65:c0:53:c4:59:5f:3e:b3:37: + 41:89:f4:f4:4a:ff:6c:97:f6:f1:49:09:9c:a2:a9:cf:17:27: + 31:2e:db:04:52:f9:18:a5:67:6c:d2:0d:12:2a:ff:33:26:83: + 20:1e:0e:81:e8:a4:b6:93:f9:d0:a3:b6:48:a1:5a:3e:b7:f0: + cd:b7:fe:66:6e:07:99:b0:6e:e6:a6:2b:93:7b:de:bc:41:5e: + 0d:d3:22:65 -----BEGIN CERTIFICATE----- MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRC1JQ0Ex LXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -78,12 +78,12 @@ IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7b -R50HZpI9aNfKrJBPymlBSzAPBgNVHRMECDAGAQH/AgF/MAsGA1UdDwQEAwIBBjAN -BgkqhkiG9w0BAQsFAAOCAQEAFFo8ZYTDlmwKFWEYibi1C2ZBF73ZCQPVf/w8ihsu -ZGCNiqNHVcdj0eSrFXbW04KE1hkFCPXH8q3T3jID97y2Q1rn/Z57tZ3JugpafwjP -FfWhUIkp+0myeGAwKDYsgbIK4Oyn2Z/+9zgvtm9auymypcwjCVz4AAU6Uz83QV18 -3fxpADqR5cRCsArbkCrN9pkurgS3bd/ocZt/W294TZt4gwFA4fz64/D+WvOuqTCe -2rqebqrgpZjR8CSWxzfEPl0bsf9doY9/13jHDcbOIONzFbAjJBLg1/Cz+LLAx+lT -DtezpqJUBnbACTEXc0IH6CX9bREdH00qHwZSaF/mZsJqzw== +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqo +bAHs9mDycFEKTNEU+rzpRDAPBgNVHRMECDAGAQH/AgF/MAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEArnBaFPn7xsVeGZIYXvxtepyQNC/UfkLPiIA8ZZb3 +TrcmxapsbKAxUXutkkKcFn5cGvcL0Yq2QfrRofyGbzIViKiyaaY4KhZXVdi+j276 +S+ahK9tNZAwIdjE37MRtKzpioi6aDSlXlTp25LJjkAdyBPRZbr6UABMNE5n4l98W +tXAy2J+EBz2dvodQMz5OrlHxEjOWxNXR382/6/Ugo0w2nr3TXn9WBekkZXdZZcBT +xFlfPrM3QYn09Er/bJf28UkJnKKpzxcnMS7bBFL5GKVnbNINEir/MyaDIB4Ogeik +tpP50KO2SKFaPrfwzbf+Zm4HmbBu5qYrk3vevEFeDdMiZQ== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 07:a9:44:44:fc:dc:51:bc:be:74:cf:5a:7e:ee:42:62:ab:9d: - 46:7f:5a:fe:01:f5:2e:3b:ba:60:91:84:96:61:ee:73:33:57: - f3:bc:26:0c:87:66:e5:f0:c2:ea:27:bc:17:d2:2e:16:70:6a: - 6c:24:e2:a9:8e:75:12:58:0f:a0:1c:98:18:6a:71:42:4b:d4: - 57:61:8e:e4:13:45:4b:93:e1:dc:7a:82:df:32:9f:de:7d:e4: - 79:2f:6f:39:75:ed:f3:b5:5d:ce:e7:d3:3f:b0:8c:43:81:bf: - 65:d5:52:95:a8:d2:ed:69:21:af:db:10:2d:51:5f:8b:48:0a: - 70:92:d2:63:7e:a7:ba:7c:2c:b3:1c:93:da:3d:bd:20:fc:47: - 24:12:43:a6:24:ed:6f:43:3c:a5:8a:50:7e:9c:bd:ec:92:5f: - 62:f5:e2:d6:70:78:bf:47:70:ff:c6:81:12:e1:2a:4f:3f:e3: - 2f:ee:9a:63:96:dc:a8:2c:3c:da:de:60:07:66:a5:cf:c7:93: - eb:9c:62:28:2e:d4:fa:b6:04:94:a2:7e:06:74:b0:27:c8:55: - e6:7d:e3:a3:c8:17:d0:6e:10:3e:b8:7a:8d:7e:a8:a1:0e:a2: - de:58:4c:04:4e:d8:9e:43:56:0b:31:2e:9f:62:3e:9d:a8:cb: - 68:16:f9:69 + 91:9a:e9:78:f5:c5:e1:87:94:b2:37:cb:fd:36:af:25:ad:9d: + 00:33:93:3c:ea:29:04:75:9f:a0:b8:4a:d8:68:3d:9e:94:6b: + ac:6e:51:6b:83:92:48:c1:c8:c8:01:48:d9:ac:e5:85:35:4c: + 43:c2:66:a3:3b:9c:97:71:ea:89:91:38:48:ab:d5:c5:c5:fb: + 70:40:db:1e:03:9b:a8:fc:2c:93:d6:d1:fb:42:f2:64:7a:43: + 09:59:3e:ed:71:9e:9d:62:a8:04:c8:52:5a:fd:d2:24:34:2d: + 22:72:62:27:ca:fb:88:e2:b7:a9:14:b7:0a:89:9d:2d:4f:ea: + 03:fc:a1:20:d6:98:73:1d:7a:96:42:47:d3:0c:7e:84:3d:1c: + f0:5b:90:6c:d0:2b:88:44:03:cc:a6:79:45:4f:bb:29:6b:73: + 47:ae:4f:70:b0:b4:b6:d1:c7:ec:8e:db:df:81:d9:67:57:67: + 82:3c:47:5f:92:1f:f0:58:61:9d:0b:9b:c4:4d:1f:4d:b7:d2: + 80:e6:f7:48:40:91:87:1c:b9:47:c8:68:24:30:a0:ba:ef:e8: + 7b:2e:33:85:3d:9c:d4:6b:7e:b1:1f:b7:c0:70:5d:77:49:73: + a2:f1:58:62:d6:a4:c9:37:d1:52:a4:d6:c6:9a:6e:a3:0c:f9: + 16:2a:f0:76 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRC1JQ0ExLXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRC1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,12 +77,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAHqURE/NxRvL50z1p+7kJi -q51Gf1r+AfUuO7pgkYSWYe5zM1fzvCYMh2bl8MLqJ7wX0i4WcGpsJOKpjnUSWA+g -HJgYanFCS9RXYY7kE0VLk+HceoLfMp/efeR5L285de3ztV3O59M/sIxDgb9l1VKV -qNLtaSGv2xAtUV+LSApwktJjfqe6fCyzHJPaPb0g/EckEkOmJO1vQzylilB+nL3s -kl9i9eLWcHi/R3D/xoES4SpPP+Mv7ppjltyoLDza3mAHZqXPx5PrnGIoLtT6tgSU -on4GdLAnyFXmfeOjyBfQbhA+uHqNfqihDqLeWEwETtieQ1YLMS6fYj6dqMtoFvlp +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCRmul49cXhh5SyN8v9Nq8l +rZ0AM5M86ikEdZ+guErYaD2elGusblFrg5JIwcjIAUjZrOWFNUxDwmajO5yXceqJ +kThIq9XFxftwQNseA5uo/CyT1tH7QvJkekMJWT7tcZ6dYqgEyFJa/dIkNC0icmIn +yvuI4repFLcKiZ0tT+oD/KEg1phzHXqWQkfTDH6EPRzwW5Bs0CuIRAPMpnlFT7sp +a3NHrk9wsLS20cfsjtvfgdlnV2eCPEdfkh/wWGGdC5vETR9Nt9KA5vdIQJGHHLlH +yGgkMKC67+h7LjOFPZzUa36xH7fAcF13SXOi8Vhi1qTJN9FSpNbGmm6jDPkWKvB2 -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:127 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 14:5a:3c:65:84:c3:96:6c:0a:15:61:18:89:b8:b5:0b:66:41: - 17:bd:d9:09:03:d5:7f:fc:3c:8a:1b:2e:64:60:8d:8a:a3:47: - 55:c7:63:d1:e4:ab:15:76:d6:d3:82:84:d6:19:05:08:f5:c7: - f2:ad:d3:de:32:03:f7:bc:b6:43:5a:e7:fd:9e:7b:b5:9d:c9: - ba:0a:5a:7f:08:cf:15:f5:a1:50:89:29:fb:49:b2:78:60:30: - 28:36:2c:81:b2:0a:e0:ec:a7:d9:9f:fe:f7:38:2f:b6:6f:5a: - bb:29:b2:a5:cc:23:09:5c:f8:00:05:3a:53:3f:37:41:5d:7c: - dd:fc:69:00:3a:91:e5:c4:42:b0:0a:db:90:2a:cd:f6:99:2e: - ae:04:b7:6d:df:e8:71:9b:7f:5b:6f:78:4d:9b:78:83:01:40: - e1:fc:fa:e3:f0:fe:5a:f3:ae:a9:30:9e:da:ba:9e:6e:aa:e0: - a5:98:d1:f0:24:96:c7:37:c4:3e:5d:1b:b1:ff:5d:a1:8f:7f: - d7:78:c7:0d:c6:ce:20:e3:73:15:b0:23:24:12:e0:d7:f0:b3: - f8:b2:c0:c7:e9:53:0e:d7:b3:a6:a2:54:06:76:c0:09:31:17: - 73:42:07:e8:25:fd:6d:11:1d:1f:4d:2a:1f:06:52:68:5f:e6: - 66:c2:6a:cf + ae:70:5a:14:f9:fb:c6:c5:5e:19:92:18:5e:fc:6d:7a:9c:90: + 34:2f:d4:7e:42:cf:88:80:3c:65:96:f7:4e:b7:26:c5:aa:6c: + 6c:a0:31:51:7b:ad:92:42:9c:16:7e:5c:1a:f7:0b:d1:8a:b6: + 41:fa:d1:a1:fc:86:6f:32:15:88:a8:b2:69:a6:38:2a:16:57: + 55:d8:be:8f:6e:fa:4b:e6:a1:2b:db:4d:64:0c:08:76:31:37: + ec:c4:6d:2b:3a:62:a2:2e:9a:0d:29:57:95:3a:76:e4:b2:63: + 90:07:72:04:f4:59:6e:be:94:00:13:0d:13:99:f8:97:df:16: + b5:70:32:d8:9f:84:07:3d:9d:be:87:50:33:3e:4e:ae:51:f1: + 12:33:96:c4:d5:d1:df:cd:bf:eb:f5:20:a3:4c:36:9e:bd:d3: + 5e:7f:56:05:e9:24:65:77:59:65:c0:53:c4:59:5f:3e:b3:37: + 41:89:f4:f4:4a:ff:6c:97:f6:f1:49:09:9c:a2:a9:cf:17:27: + 31:2e:db:04:52:f9:18:a5:67:6c:d2:0d:12:2a:ff:33:26:83: + 20:1e:0e:81:e8:a4:b6:93:f9:d0:a3:b6:48:a1:5a:3e:b7:f0: + cd:b7:fe:66:6e:07:99:b0:6e:e6:a6:2b:93:7b:de:bc:41:5e: + 0d:d3:22:65 -----BEGIN CERTIFICATE----- MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRC1JQ0Ex LXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -164,12 +164,12 @@ IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7b -R50HZpI9aNfKrJBPymlBSzAPBgNVHRMECDAGAQH/AgF/MAsGA1UdDwQEAwIBBjAN -BgkqhkiG9w0BAQsFAAOCAQEAFFo8ZYTDlmwKFWEYibi1C2ZBF73ZCQPVf/w8ihsu -ZGCNiqNHVcdj0eSrFXbW04KE1hkFCPXH8q3T3jID97y2Q1rn/Z57tZ3JugpafwjP -FfWhUIkp+0myeGAwKDYsgbIK4Oyn2Z/+9zgvtm9auymypcwjCVz4AAU6Uz83QV18 -3fxpADqR5cRCsArbkCrN9pkurgS3bd/ocZt/W294TZt4gwFA4fz64/D+WvOuqTCe -2rqebqrgpZjR8CSWxzfEPl0bsf9doY9/13jHDcbOIONzFbAjJBLg1/Cz+LLAx+lT -DtezpqJUBnbACTEXc0IH6CX9bREdH00qHwZSaF/mZsJqzw== +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqo +bAHs9mDycFEKTNEU+rzpRDAPBgNVHRMECDAGAQH/AgF/MAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEArnBaFPn7xsVeGZIYXvxtepyQNC/UfkLPiIA8ZZb3 +TrcmxapsbKAxUXutkkKcFn5cGvcL0Yq2QfrRofyGbzIViKiyaaY4KhZXVdi+j276 +S+ahK9tNZAwIdjE37MRtKzpioi6aDSlXlTp25LJjkAdyBPRZbr6UABMNE5n4l98W +tXAy2J+EBz2dvodQMz5OrlHxEjOWxNXR382/6/Ugo0w2nr3TXn9WBekkZXdZZcBT +xFlfPrM3QYn09Er/bJf28UkJnKKpzxcnMS7bBFL5GKVnbNINEir/MyaDIB4Ogeik +tpP50KO2SKFaPrfwzbf+Zm4HmbBu5qYrk3vevEFeDdMiZQ== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainD-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-ICA1-pathlen127, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainD-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 07:a9:44:44:fc:dc:51:bc:be:74:cf:5a:7e:ee:42:62:ab:9d: - 46:7f:5a:fe:01:f5:2e:3b:ba:60:91:84:96:61:ee:73:33:57: - f3:bc:26:0c:87:66:e5:f0:c2:ea:27:bc:17:d2:2e:16:70:6a: - 6c:24:e2:a9:8e:75:12:58:0f:a0:1c:98:18:6a:71:42:4b:d4: - 57:61:8e:e4:13:45:4b:93:e1:dc:7a:82:df:32:9f:de:7d:e4: - 79:2f:6f:39:75:ed:f3:b5:5d:ce:e7:d3:3f:b0:8c:43:81:bf: - 65:d5:52:95:a8:d2:ed:69:21:af:db:10:2d:51:5f:8b:48:0a: - 70:92:d2:63:7e:a7:ba:7c:2c:b3:1c:93:da:3d:bd:20:fc:47: - 24:12:43:a6:24:ed:6f:43:3c:a5:8a:50:7e:9c:bd:ec:92:5f: - 62:f5:e2:d6:70:78:bf:47:70:ff:c6:81:12:e1:2a:4f:3f:e3: - 2f:ee:9a:63:96:dc:a8:2c:3c:da:de:60:07:66:a5:cf:c7:93: - eb:9c:62:28:2e:d4:fa:b6:04:94:a2:7e:06:74:b0:27:c8:55: - e6:7d:e3:a3:c8:17:d0:6e:10:3e:b8:7a:8d:7e:a8:a1:0e:a2: - de:58:4c:04:4e:d8:9e:43:56:0b:31:2e:9f:62:3e:9d:a8:cb: - 68:16:f9:69 + 91:9a:e9:78:f5:c5:e1:87:94:b2:37:cb:fd:36:af:25:ad:9d: + 00:33:93:3c:ea:29:04:75:9f:a0:b8:4a:d8:68:3d:9e:94:6b: + ac:6e:51:6b:83:92:48:c1:c8:c8:01:48:d9:ac:e5:85:35:4c: + 43:c2:66:a3:3b:9c:97:71:ea:89:91:38:48:ab:d5:c5:c5:fb: + 70:40:db:1e:03:9b:a8:fc:2c:93:d6:d1:fb:42:f2:64:7a:43: + 09:59:3e:ed:71:9e:9d:62:a8:04:c8:52:5a:fd:d2:24:34:2d: + 22:72:62:27:ca:fb:88:e2:b7:a9:14:b7:0a:89:9d:2d:4f:ea: + 03:fc:a1:20:d6:98:73:1d:7a:96:42:47:d3:0c:7e:84:3d:1c: + f0:5b:90:6c:d0:2b:88:44:03:cc:a6:79:45:4f:bb:29:6b:73: + 47:ae:4f:70:b0:b4:b6:d1:c7:ec:8e:db:df:81:d9:67:57:67: + 82:3c:47:5f:92:1f:f0:58:61:9d:0b:9b:c4:4d:1f:4d:b7:d2: + 80:e6:f7:48:40:91:87:1c:b9:47:c8:68:24:30:a0:ba:ef:e8: + 7b:2e:33:85:3d:9c:d4:6b:7e:b1:1f:b7:c0:70:5d:77:49:73: + a2:f1:58:62:d6:a4:c9:37:d1:52:a4:d6:c6:9a:6e:a3:0c:f9: + 16:2a:f0:76 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRC1JQ0ExLXBhdGhsZW4xMjcxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRC1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,10 +77,10 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAHqURE/NxRvL50z1p+7kJi -q51Gf1r+AfUuO7pgkYSWYe5zM1fzvCYMh2bl8MLqJ7wX0i4WcGpsJOKpjnUSWA+g -HJgYanFCS9RXYY7kE0VLk+HceoLfMp/efeR5L285de3ztV3O59M/sIxDgb9l1VKV -qNLtaSGv2xAtUV+LSApwktJjfqe6fCyzHJPaPb0g/EckEkOmJO1vQzylilB+nL3s -kl9i9eLWcHi/R3D/xoES4SpPP+Mv7ppjltyoLDza3mAHZqXPx5PrnGIoLtT6tgSU -on4GdLAnyFXmfeOjyBfQbhA+uHqNfqihDqLeWEwETtieQ1YLMS6fYj6dqMtoFvlp +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCRmul49cXhh5SyN8v9Nq8l +rZ0AM5M86ikEdZ+guErYaD2elGusblFrg5JIwcjIAUjZrOWFNUxDwmajO5yXceqJ +kThIq9XFxftwQNseA5uo/CyT1tH7QvJkekMJWT7tcZ6dYqgEyFJa/dIkNC0icmIn +yvuI4repFLcKiZ0tT+oD/KEg1phzHXqWQkfTDH6EPRzwW5Bs0CuIRAPMpnlFT7sp +a3NHrk9wsLS20cfsjtvfgdlnV2eCPEdfkh/wWGGdC5vETR9Nt9KA5vdIQJGHHLlH +yGgkMKC67+h7LjOFPZzUa36xH7fAcF13SXOi8Vhi1qTJN9FSpNbGmm6jDPkWKvB2 -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-ICA1-pathlen128.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-ICA1-pathlen128.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-ICA1-pathlen128.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-ICA1-pathlen128.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:128 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 95:1a:fa:1a:2b:42:fd:9f:a3:10:f7:06:f5:51:20:3b:bd:e3: - fe:04:fb:ac:7c:f9:5a:af:fc:46:f3:74:55:c8:5b:72:c0:2d: - f9:e5:64:09:e2:82:e0:5f:19:a4:7e:02:47:7f:1d:6f:12:7c: - 81:1c:68:3a:34:8b:f7:86:03:71:d1:8f:36:21:25:80:fb:60: - 49:1b:27:b4:f1:a6:1e:bf:cb:8b:97:96:2a:76:1f:ee:3e:73: - 13:9b:02:d4:6e:54:57:9b:fb:39:d7:fa:45:37:ba:dd:a8:d0: - 58:c7:aa:9c:a0:ac:ef:eb:be:ff:5c:f0:10:6c:78:6b:ee:27: - db:1e:0e:cf:91:d2:30:79:a9:8c:67:77:08:c0:72:f1:db:67: - 7a:34:70:c3:17:88:19:f9:be:ef:1c:23:7d:2f:04:b9:bd:83: - 1b:06:55:a1:c5:40:97:ff:71:50:10:6c:a2:d8:bc:7e:4e:4e: - b6:42:74:7e:a6:23:54:1b:c5:01:29:40:8c:d9:8a:1f:b6:2d: - 7c:8d:da:96:99:2a:05:63:11:ea:09:50:4b:f9:ea:8b:12:dc: - a7:0f:78:e1:9c:16:24:83:74:36:ac:45:df:57:f6:21:ea:23: - 80:88:a1:45:5c:11:d4:5b:87:2a:3d:fe:c0:eb:e4:c4:9b:34: - 89:22:a7:ec + 95:df:c8:9f:0d:1a:2a:2b:8a:79:0c:c4:a9:05:4f:fc:a4:04: + d3:79:37:84:77:8d:17:db:d7:14:6b:1c:f5:f7:e8:04:6a:02: + ce:b3:63:39:f3:6e:9c:9d:0b:96:d1:dc:46:d0:3c:57:a1:19: + f9:aa:74:b0:16:15:18:91:c1:e9:9e:d6:52:b1:f0:d5:ac:0e: + cb:ca:06:e5:88:b1:4c:ad:af:a4:29:db:ce:ae:ce:d3:30:db: + 99:f3:2a:77:e7:64:cc:07:2a:f0:e5:a9:27:97:ea:d6:a6:59: + a5:0c:42:4f:02:a4:31:42:fc:9b:92:de:8b:52:d3:92:8c:fd: + 04:c2:d5:7b:80:bb:7a:90:ba:be:33:10:fd:07:d6:53:7f:b9: + 86:93:9f:1b:4c:66:75:d4:d1:0b:cd:10:76:23:0e:37:a2:d6: + c1:5f:91:2b:d0:14:c3:2f:e7:46:e4:e9:6d:2d:f0:05:e5:78: + 25:3c:7d:1d:1c:23:9a:cb:ba:30:c2:52:98:4e:16:ad:f4:30: + 22:4a:41:e5:1c:c7:da:b1:79:ed:cd:b2:c3:83:42:a6:26:6e: + ee:4f:9f:14:f7:6e:f2:e9:70:07:0b:c9:59:5a:8f:50:10:cf: + 09:77:a3:e1:96:47:e8:85:86:cd:8a:11:30:a0:72:05:11:50: + 7e:ee:0b:e6 -----BEGIN CERTIFICATE----- MIIEzzCCA7egAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRS1JQ0Ex LXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -78,12 +78,12 @@ IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7b -R50HZpI9aNfKrJBPymlBSzAQBgNVHRMECTAHAQH/AgIAgDALBgNVHQ8EBAMCAQYw -DQYJKoZIhvcNAQELBQADggEBAJUa+horQv2foxD3BvVRIDu94/4E+6x8+Vqv/Ebz -dFXIW3LALfnlZAniguBfGaR+Akd/HW8SfIEcaDo0i/eGA3HRjzYhJYD7YEkbJ7Tx -ph6/y4uXlip2H+4+cxObAtRuVFeb+znX+kU3ut2o0FjHqpygrO/rvv9c8BBseGvu -J9seDs+R0jB5qYxndwjAcvHbZ3o0cMMXiBn5vu8cI30vBLm9gxsGVaHFQJf/cVAQ -bKLYvH5OTrZCdH6mI1QbxQEpQIzZih+2LXyN2paZKgVjEeoJUEv56osS3KcPeOGc -FiSDdDasRd9X9iHqI4CIoUVcEdRbhyo9/sDr5MSbNIkip+w= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqo +bAHs9mDycFEKTNEU+rzpRDAQBgNVHRMECTAHAQH/AgIAgDALBgNVHQ8EBAMCAQYw +DQYJKoZIhvcNAQELBQADggEBAJXfyJ8NGiorinkMxKkFT/ykBNN5N4R3jRfb1xRr +HPX36ARqAs6zYznzbpydC5bR3EbQPFehGfmqdLAWFRiRweme1lKx8NWsDsvKBuWI +sUytr6Qp286uztMw25nzKnfnZMwHKvDlqSeX6tamWaUMQk8CpDFC/JuS3otS05KM +/QTC1XuAu3qQur4zEP0H1lN/uYaTnxtMZnXU0QvNEHYjDjei1sFfkSvQFMMv50bk +6W0t8AXleCU8fR0cI5rLujDCUphOFq30MCJKQeUcx9qxee3NssODQqYmbu5PnxT3 +bvLpcAcLyVlaj1AQzwl3o+GWR+iFhs2KETCgcgURUH7uC+Y= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 46:b8:f0:73:85:69:12:f3:16:00:76:1b:2e:b1:28:20:ee:13: - 54:66:28:82:62:b5:a8:ff:d8:7b:ed:6b:8a:9e:cb:28:58:df: - db:be:7b:54:ce:22:74:45:ed:02:3d:f8:bf:77:90:1a:1b:cf: - b3:5f:37:41:c3:ea:1a:24:b2:00:2e:28:ae:43:dd:c2:cd:d9: - 51:05:43:04:bb:ea:37:82:b2:e1:23:0a:0c:4f:5b:0f:a7:bd: - 4f:a1:c9:4f:6a:63:3e:58:81:0f:66:38:0a:c8:50:2f:f2:74: - 7f:e6:5a:bc:ba:e4:02:6d:e4:8a:43:ab:d3:6c:4b:aa:cf:e8: - 94:2b:8d:54:22:e1:51:87:fa:59:1d:6d:aa:d8:8a:e4:04:1a: - 8d:42:2b:f0:12:6e:5f:77:cf:e5:6a:d3:a9:8e:be:72:bc:3a: - 16:fa:82:81:f4:65:2d:fd:81:c9:96:f7:36:0f:11:1a:13:55: - ae:97:d5:67:f3:e4:03:13:db:1a:0e:ea:5e:75:21:7f:f7:c9: - 96:8d:c8:e9:94:90:79:19:7e:9a:c9:4f:d1:69:4f:8c:3c:88: - 5d:97:61:f0:12:86:36:2e:b2:5a:c5:8b:79:35:5f:16:b1:d8: - 9c:cc:ce:ba:b3:a4:92:0e:8f:5b:fb:27:96:fc:19:50:0c:28: - 45:e0:e8:81 + 65:49:39:85:07:68:20:fe:f9:28:cb:c8:ec:2a:c9:6b:2c:06: + da:1b:92:b0:d7:c4:5c:37:7b:a5:48:16:15:77:08:05:0a:55: + 2f:b7:f7:2b:ef:dd:dc:63:ab:04:f1:24:bf:ef:f4:73:43:1d: + 5d:2a:1a:69:f5:a9:e8:af:d2:56:77:79:c0:46:07:95:b6:af: + b3:cb:2e:6b:6b:ed:99:29:cd:cc:4d:f4:f9:e6:25:1f:5b:e3: + a0:82:a9:5b:c3:73:6c:9a:c4:0b:5a:80:8a:16:5d:32:99:5d: + c2:85:ab:bb:94:f7:54:62:f4:8e:d5:7f:dd:ff:84:50:de:55: + e2:0d:67:52:32:5e:48:e0:36:b3:aa:a5:d6:57:35:cb:7a:2b: + d3:4e:42:75:15:56:f2:2f:45:9c:99:c5:4c:e7:2d:45:6e:86: + 2f:4b:84:bf:49:1d:b2:fb:85:53:0a:99:28:fd:7a:3f:e8:b4: + a5:b9:6c:c2:55:cd:f3:82:c0:a3:ef:85:ed:69:28:78:1d:81: + 0e:19:bd:a8:fb:a6:b7:ff:09:36:54:a6:44:96:cf:15:0c:45: + 7e:ba:9a:50:4d:14:82:dc:ba:c2:97:08:74:89:a7:ff:ed:52: + 89:ac:65:65:70:9a:8e:8a:43:86:46:a1:f8:23:96:e2:0a:65: + 3f:2d:94:35 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRS1JQ0ExLXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,12 +77,12 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBGuPBzhWkS8xYAdhsusSgg -7hNUZiiCYrWo/9h77WuKnssoWN/bvntUziJ0Re0CPfi/d5AaG8+zXzdBw+oaJLIA -LiiuQ93CzdlRBUMEu+o3grLhIwoMT1sPp71PoclPamM+WIEPZjgKyFAv8nR/5lq8 -uuQCbeSKQ6vTbEuqz+iUK41UIuFRh/pZHW2q2IrkBBqNQivwEm5fd8/latOpjr5y -vDoW+oKB9GUt/YHJlvc2DxEaE1Wul9Vn8+QDE9saDupedSF/98mWjcjplJB5GX6a -yU/RaU+MPIhdl2HwEoY2LrJaxYt5NV8WsdiczM66s6SSDo9b+yeW/BlQDChF4OiB +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBlSTmFB2gg/vkoy8jsKslr +LAbaG5Kw18RcN3ulSBYVdwgFClUvt/cr793cY6sE8SS/7/RzQx1dKhpp9anor9JW +d3nARgeVtq+zyy5ra+2ZKc3MTfT55iUfW+Oggqlbw3NsmsQLWoCKFl0ymV3Chau7 +lPdUYvSO1X/d/4RQ3lXiDWdSMl5I4DazqqXWVzXLeivTTkJ1FVbyL0WcmcVM5y1F +boYvS4S/SR2y+4VTCpko/Xo/6LSluWzCVc3zgsCj74XtaSh4HYEOGb2o+6a3/wk2 +VKZEls8VDEV+uppQTRSC3LrClwh0iaf/7VKJrGVlcJqOikOGRqH4I5biCmU/LZQ1 -----END CERTIFICATE----- Certificate: Data: @@ -91,8 +91,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -123,34 +123,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:128 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 95:1a:fa:1a:2b:42:fd:9f:a3:10:f7:06:f5:51:20:3b:bd:e3: - fe:04:fb:ac:7c:f9:5a:af:fc:46:f3:74:55:c8:5b:72:c0:2d: - f9:e5:64:09:e2:82:e0:5f:19:a4:7e:02:47:7f:1d:6f:12:7c: - 81:1c:68:3a:34:8b:f7:86:03:71:d1:8f:36:21:25:80:fb:60: - 49:1b:27:b4:f1:a6:1e:bf:cb:8b:97:96:2a:76:1f:ee:3e:73: - 13:9b:02:d4:6e:54:57:9b:fb:39:d7:fa:45:37:ba:dd:a8:d0: - 58:c7:aa:9c:a0:ac:ef:eb:be:ff:5c:f0:10:6c:78:6b:ee:27: - db:1e:0e:cf:91:d2:30:79:a9:8c:67:77:08:c0:72:f1:db:67: - 7a:34:70:c3:17:88:19:f9:be:ef:1c:23:7d:2f:04:b9:bd:83: - 1b:06:55:a1:c5:40:97:ff:71:50:10:6c:a2:d8:bc:7e:4e:4e: - b6:42:74:7e:a6:23:54:1b:c5:01:29:40:8c:d9:8a:1f:b6:2d: - 7c:8d:da:96:99:2a:05:63:11:ea:09:50:4b:f9:ea:8b:12:dc: - a7:0f:78:e1:9c:16:24:83:74:36:ac:45:df:57:f6:21:ea:23: - 80:88:a1:45:5c:11:d4:5b:87:2a:3d:fe:c0:eb:e4:c4:9b:34: - 89:22:a7:ec + 95:df:c8:9f:0d:1a:2a:2b:8a:79:0c:c4:a9:05:4f:fc:a4:04: + d3:79:37:84:77:8d:17:db:d7:14:6b:1c:f5:f7:e8:04:6a:02: + ce:b3:63:39:f3:6e:9c:9d:0b:96:d1:dc:46:d0:3c:57:a1:19: + f9:aa:74:b0:16:15:18:91:c1:e9:9e:d6:52:b1:f0:d5:ac:0e: + cb:ca:06:e5:88:b1:4c:ad:af:a4:29:db:ce:ae:ce:d3:30:db: + 99:f3:2a:77:e7:64:cc:07:2a:f0:e5:a9:27:97:ea:d6:a6:59: + a5:0c:42:4f:02:a4:31:42:fc:9b:92:de:8b:52:d3:92:8c:fd: + 04:c2:d5:7b:80:bb:7a:90:ba:be:33:10:fd:07:d6:53:7f:b9: + 86:93:9f:1b:4c:66:75:d4:d1:0b:cd:10:76:23:0e:37:a2:d6: + c1:5f:91:2b:d0:14:c3:2f:e7:46:e4:e9:6d:2d:f0:05:e5:78: + 25:3c:7d:1d:1c:23:9a:cb:ba:30:c2:52:98:4e:16:ad:f4:30: + 22:4a:41:e5:1c:c7:da:b1:79:ed:cd:b2:c3:83:42:a6:26:6e: + ee:4f:9f:14:f7:6e:f2:e9:70:07:0b:c9:59:5a:8f:50:10:cf: + 09:77:a3:e1:96:47:e8:85:86:cd:8a:11:30:a0:72:05:11:50: + 7e:ee:0b:e6 -----BEGIN CERTIFICATE----- MIIEzzCCA7egAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRS1JQ0Ex LXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -164,12 +164,12 @@ IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7b -R50HZpI9aNfKrJBPymlBSzAQBgNVHRMECTAHAQH/AgIAgDALBgNVHQ8EBAMCAQYw -DQYJKoZIhvcNAQELBQADggEBAJUa+horQv2foxD3BvVRIDu94/4E+6x8+Vqv/Ebz -dFXIW3LALfnlZAniguBfGaR+Akd/HW8SfIEcaDo0i/eGA3HRjzYhJYD7YEkbJ7Tx -ph6/y4uXlip2H+4+cxObAtRuVFeb+znX+kU3ut2o0FjHqpygrO/rvv9c8BBseGvu -J9seDs+R0jB5qYxndwjAcvHbZ3o0cMMXiBn5vu8cI30vBLm9gxsGVaHFQJf/cVAQ -bKLYvH5OTrZCdH6mI1QbxQEpQIzZih+2LXyN2paZKgVjEeoJUEv56osS3KcPeOGc -FiSDdDasRd9X9iHqI4CIoUVcEdRbhyo9/sDr5MSbNIkip+w= +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqo +bAHs9mDycFEKTNEU+rzpRDAQBgNVHRMECTAHAQH/AgIAgDALBgNVHQ8EBAMCAQYw +DQYJKoZIhvcNAQELBQADggEBAJXfyJ8NGiorinkMxKkFT/ykBNN5N4R3jRfb1xRr +HPX36ARqAs6zYznzbpydC5bR3EbQPFehGfmqdLAWFRiRweme1lKx8NWsDsvKBuWI +sUytr6Qp286uztMw25nzKnfnZMwHKvDlqSeX6tamWaUMQk8CpDFC/JuS3otS05KM +/QTC1XuAu3qQur4zEP0H1lN/uYaTnxtMZnXU0QvNEHYjDjei1sFfkSvQFMMv50bk +6W0t8AXleCU8fR0cI5rLujDCUphOFq30MCJKQeUcx9qxee3NssODQqYmbu5PnxT3 +bvLpcAcLyVlaj1AQzwl3o+GWR+iFhs2KETCgcgURUH7uC+Y= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainE-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-ICA1-pathlen128, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainE-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 46:b8:f0:73:85:69:12:f3:16:00:76:1b:2e:b1:28:20:ee:13: - 54:66:28:82:62:b5:a8:ff:d8:7b:ed:6b:8a:9e:cb:28:58:df: - db:be:7b:54:ce:22:74:45:ed:02:3d:f8:bf:77:90:1a:1b:cf: - b3:5f:37:41:c3:ea:1a:24:b2:00:2e:28:ae:43:dd:c2:cd:d9: - 51:05:43:04:bb:ea:37:82:b2:e1:23:0a:0c:4f:5b:0f:a7:bd: - 4f:a1:c9:4f:6a:63:3e:58:81:0f:66:38:0a:c8:50:2f:f2:74: - 7f:e6:5a:bc:ba:e4:02:6d:e4:8a:43:ab:d3:6c:4b:aa:cf:e8: - 94:2b:8d:54:22:e1:51:87:fa:59:1d:6d:aa:d8:8a:e4:04:1a: - 8d:42:2b:f0:12:6e:5f:77:cf:e5:6a:d3:a9:8e:be:72:bc:3a: - 16:fa:82:81:f4:65:2d:fd:81:c9:96:f7:36:0f:11:1a:13:55: - ae:97:d5:67:f3:e4:03:13:db:1a:0e:ea:5e:75:21:7f:f7:c9: - 96:8d:c8:e9:94:90:79:19:7e:9a:c9:4f:d1:69:4f:8c:3c:88: - 5d:97:61:f0:12:86:36:2e:b2:5a:c5:8b:79:35:5f:16:b1:d8: - 9c:cc:ce:ba:b3:a4:92:0e:8f:5b:fb:27:96:fc:19:50:0c:28: - 45:e0:e8:81 + 65:49:39:85:07:68:20:fe:f9:28:cb:c8:ec:2a:c9:6b:2c:06: + da:1b:92:b0:d7:c4:5c:37:7b:a5:48:16:15:77:08:05:0a:55: + 2f:b7:f7:2b:ef:dd:dc:63:ab:04:f1:24:bf:ef:f4:73:43:1d: + 5d:2a:1a:69:f5:a9:e8:af:d2:56:77:79:c0:46:07:95:b6:af: + b3:cb:2e:6b:6b:ed:99:29:cd:cc:4d:f4:f9:e6:25:1f:5b:e3: + a0:82:a9:5b:c3:73:6c:9a:c4:0b:5a:80:8a:16:5d:32:99:5d: + c2:85:ab:bb:94:f7:54:62:f4:8e:d5:7f:dd:ff:84:50:de:55: + e2:0d:67:52:32:5e:48:e0:36:b3:aa:a5:d6:57:35:cb:7a:2b: + d3:4e:42:75:15:56:f2:2f:45:9c:99:c5:4c:e7:2d:45:6e:86: + 2f:4b:84:bf:49:1d:b2:fb:85:53:0a:99:28:fd:7a:3f:e8:b4: + a5:b9:6c:c2:55:cd:f3:82:c0:a3:ef:85:ed:69:28:78:1d:81: + 0e:19:bd:a8:fb:a6:b7:ff:09:36:54:a6:44:96:cf:15:0c:45: + 7e:ba:9a:50:4d:14:82:dc:ba:c2:97:08:74:89:a7:ff:ed:52: + 89:ac:65:65:70:9a:8e:8a:43:86:46:a1:f8:23:96:e2:0a:65: + 3f:2d:94:35 -----BEGIN CERTIFICATE----- MIIErDCCA5SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRS1JQ0ExLXBhdGhsZW4xMjgxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluRS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -77,10 +77,10 @@ VQQGEwJVUzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8G A1UECgwIU2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3 dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIB -ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBGuPBzhWkS8xYAdhsusSgg -7hNUZiiCYrWo/9h77WuKnssoWN/bvntUziJ0Re0CPfi/d5AaG8+zXzdBw+oaJLIA -LiiuQ93CzdlRBUMEu+o3grLhIwoMT1sPp71PoclPamM+WIEPZjgKyFAv8nR/5lq8 -uuQCbeSKQ6vTbEuqz+iUK41UIuFRh/pZHW2q2IrkBBqNQivwEm5fd8/latOpjr5y -vDoW+oKB9GUt/YHJlvc2DxEaE1Wul9Vn8+QDE9saDupedSF/98mWjcjplJB5GX6a -yU/RaU+MPIhdl2HwEoY2LrJaxYt5NV8WsdiczM66s6SSDo9b+yeW/BlQDChF4OiB +ZDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQBlSTmFB2gg/vkoy8jsKslr +LAbaG5Kw18RcN3ulSBYVdwgFClUvt/cr793cY6sE8SS/7/RzQx1dKhpp9anor9JW +d3nARgeVtq+zyy5ra+2ZKc3MTfT55iUfW+Oggqlbw3NsmsQLWoCKFl0ymV3Chau7 +lPdUYvSO1X/d/4RQ3lXiDWdSMl5I4DazqqXWVzXLeivTTkJ1FVbyL0WcmcVM5y1F +boYvS4S/SR2y+4VTCpko/Xo/6LSluWzCVc3zgsCj74XtaSh4HYEOGb2o+6a3/wk2 +VKZEls8VDEV+uppQTRSC3LrClwh0iaf/7VKJrGVlcJqOikOGRqH4I5biCmU/LZQ1 -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA1-pathlen1.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA1-pathlen1.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA1-pathlen1.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA1-pathlen1.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 45:0e:29:8c:cb:ba:ea:b6:f9:ef:95:7b:e2:4d:e2:da:8a:4f: - fe:3a:49:0b:6f:0a:db:64:31:8d:f7:0e:bb:31:16:30:29:d2: - 3e:41:2f:c1:df:28:60:af:0f:2e:18:c4:b6:b0:3b:dd:d9:c5: - bf:43:4b:71:e4:9e:97:26:01:ec:12:5e:75:fe:64:10:ac:76: - 19:da:be:15:7d:cb:cd:18:da:1f:86:c2:f4:1e:aa:ae:ef:98: - f1:7e:dc:95:51:f2:a8:b1:41:dc:b3:08:22:1f:96:21:5b:40: - a8:01:d7:80:e9:fd:51:c0:51:0a:b2:15:7d:a0:64:8f:ee:4e: - bf:13:a9:3d:aa:22:05:2a:e8:11:ee:db:0d:72:98:e2:07:2c: - 06:be:88:7c:3a:49:c7:18:1a:ae:c1:4f:c4:b9:c8:37:d9:20: - f8:df:cf:b9:7f:68:44:35:36:70:44:05:87:29:99:37:55:b0: - f1:de:3b:e1:e9:d8:ef:79:79:43:41:c6:5b:58:51:78:6c:13: - 0c:bb:f6:31:4a:b4:c4:23:c1:67:99:a7:9e:8c:0c:fa:4b:ad: - 7b:f0:12:3c:3e:ac:fa:ee:7a:f6:4a:a2:da:ac:50:50:46:bb: - 37:03:94:c3:dd:01:4a:ac:05:6b:9c:03:cf:b2:43:be:52:25: - 1b:af:d7:f9 + b3:d8:4b:f8:59:d5:7a:95:55:af:eb:07:0c:ac:db:b5:cc:b8: + aa:0d:81:1b:31:d4:0f:8a:ef:da:28:0e:52:f1:8b:25:54:47: + 11:d8:62:a2:5b:5e:d5:fb:6d:b5:57:b4:a3:b6:d2:e0:e1:50: + 8b:e1:7e:cd:3b:48:54:4b:55:48:18:12:fe:55:3b:1e:e2:b8: + 34:b2:77:f7:21:05:9f:32:43:34:db:e4:d4:e3:d2:74:98:3e: + 1f:39:97:ef:e3:89:d9:e2:c0:77:f9:d4:74:a5:13:c0:ce:9e: + 3e:42:bc:0d:44:73:c5:76:47:81:dc:40:f4:06:bf:29:66:51: + 7b:41:c5:35:73:fe:5c:7a:9c:bf:4c:19:c5:2b:7b:02:1f:45: + 66:0c:64:01:29:77:a8:a2:ef:ba:61:19:27:a1:56:41:a6:73: + 5d:9f:39:86:38:e9:0a:31:23:55:f1:02:54:ce:96:18:32:ae: + 22:03:1d:fb:cb:90:45:54:8f:d2:29:17:9d:44:65:68:8c:d2: + 25:df:a8:c2:29:1e:66:2c:c4:57:a1:ab:93:c7:34:a2:e3:94: + bd:dc:8f:51:d2:08:a6:3c:63:c9:c1:ee:90:de:39:92:fc:5e: + 85:d4:f9:f0:b8:6e:09:30:0c:25:ce:c8:86:c1:75:5d:e8:e8: + 90:90:ad:0d -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkYtSUNBMS1wYXRobGVuMTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAEUOKYzLuuq2+e+Ve+JN4tqKT/46SQtvCttkMY33DrsxFjAp0j5B -L8HfKGCvDy4YxLawO93Zxb9DS3HknpcmAewSXnX+ZBCsdhnavhV9y80Y2h+GwvQe -qq7vmPF+3JVR8qixQdyzCCIfliFbQKgB14Dp/VHAUQqyFX2gZI/uTr8TqT2qIgUq -6BHu2w1ymOIHLAa+iHw6SccYGq7BT8S5yDfZIPjfz7l/aEQ1NnBEBYcpmTdVsPHe -O+Hp2O95eUNBxltYUXhsEwy79jFKtMQjwWeZp56MDPpLrXvwEjw+rPruevZKotqs -UFBGuzcDlMPdAUqsBWucA8+yQ75SJRuv1/k= +AQELBQADggEBALPYS/hZ1XqVVa/rBwys27XMuKoNgRsx1A+K79ooDlLxiyVURxHY +YqJbXtX7bbVXtKO20uDhUIvhfs07SFRLVUgYEv5VOx7iuDSyd/chBZ8yQzTb5NTj +0nSYPh85l+/jidniwHf51HSlE8DOnj5CvA1Ec8V2R4HcQPQGvylmUXtBxTVz/lx6 +nL9MGcUrewIfRWYMZAEpd6ii77phGSehVkGmc12fOYY46QoxI1XxAlTOlhgyriID +HfvLkEVUj9IpF51EZWiM0iXfqMIpHmYsxFehq5PHNKLjlL3cj1HSCKY8Y8nB7pDe +OZL8XoXU+fC4bgkwDCXOyIbBdV3o6JCQrQ0= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA2-pathlen0.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA2-pathlen0.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA2-pathlen0.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-ICA2-pathlen0.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0d:51:ba:f9:87:88:e3:72:cd:79:15:4e:21:bb:c7:cd:6a:fd: - f3:1c:be:00:22:69:72:27:15:2a:43:ee:7b:3e:db:80:6b:61: - de:65:74:30:07:73:fd:82:ea:b8:b8:d1:66:08:ed:c6:87:0f: - 46:14:a9:57:dc:26:7b:cb:da:9b:bb:a2:0d:30:d8:94:ca:b8: - ae:9d:2b:e6:14:dc:63:9f:fb:6c:be:69:d9:2e:84:a0:05:1c: - b8:55:60:25:34:fb:ac:1e:3b:f5:55:14:8f:dc:65:79:51:b6: - 8f:61:08:6c:90:bf:39:a2:51:b2:43:27:db:8b:4e:9a:7b:a1: - 31:16:70:32:b9:c5:02:fe:8a:de:4c:76:5b:f9:50:0a:05:e2: - 02:b6:dd:3a:2c:6d:d3:f9:81:1b:0e:7d:e4:41:6a:b3:81:80: - 9c:f0:1e:f0:e3:d9:30:11:c8:23:79:b0:d7:c1:05:be:36:90: - 08:78:c9:08:cd:63:b0:ec:df:4b:81:50:ab:42:c8:ee:86:d6: - be:5b:ec:30:a6:60:d1:8d:0a:a5:d0:23:54:e6:c4:05:59:0e: - 74:2f:1e:d5:3c:8f:da:8f:d2:00:20:12:b5:cf:f9:d9:11:18: - 64:5d:6a:6e:37:48:58:cd:d7:48:f9:5d:6f:bb:33:d9:6f:fd: - 10:1a:18:31 + 9b:28:44:f3:e9:c3:e9:38:03:1a:19:ac:80:f8:ef:e8:a6:3e: + 83:80:71:30:48:6c:8e:28:10:f8:84:d3:12:0b:35:fc:f3:51: + 87:9b:ef:48:9a:fd:5b:ca:b2:4e:61:94:ae:5b:a7:a7:36:2e: + e2:da:83:19:82:e4:cb:70:5d:c5:1a:de:4c:b6:be:c6:6e:d9: + f8:6c:6e:64:b4:96:7f:18:ba:b5:54:f1:8a:6f:75:27:e3:51: + 98:50:f7:92:ff:a3:e8:65:ae:62:ab:7f:94:7c:e3:f9:3a:f5: + 6d:9a:d7:98:6a:3b:5a:b3:1f:73:92:ad:f2:6b:7e:e5:10:ee: + 3d:5a:73:28:18:0f:5c:e0:99:6f:1e:5f:61:da:e1:a4:d4:a1: + e7:69:b1:e0:9b:ba:e9:1b:6d:60:e2:b5:c6:9e:19:9f:21:d4: + d6:2f:da:56:15:d8:4f:b5:82:b2:62:83:a0:cd:70:05:2c:21: + 61:6d:92:9a:91:fa:16:4e:0c:e1:4a:72:6f:ad:41:d1:d4:ed: + 45:4d:07:8c:cf:79:9e:e5:95:3b:d6:27:cc:7d:f5:44:1d:6f: + 90:4b:ef:0d:f5:7f:4a:3e:87:82:ad:db:01:40:42:85:4a:b0: + 85:9b:cd:6b:0b:c3:a2:5e:48:c9:21:47:9d:f1:b0:2d:bc:5e: + d1:5f:a2:f5 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluRi1JQ0Ey LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -78,12 +78,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAA1RuvmHiONyzXkVTiG7x81q/fMcvgAiaXInFSpD7ns+ -24BrYd5ldDAHc/2C6ri40WYI7caHD0YUqVfcJnvL2pu7og0w2JTKuK6dK+YU3GOf -+2y+adkuhKAFHLhVYCU0+6weO/VVFI/cZXlRto9hCGyQvzmiUbJDJ9uLTpp7oTEW -cDK5xQL+it5Mdlv5UAoF4gK23TosbdP5gRsOfeRBarOBgJzwHvDj2TARyCN5sNfB -Bb42kAh4yQjNY7Ds30uBUKtCyO6G1r5b7DCmYNGNCqXQI1TmxAVZDnQvHtU8j9qP -0gAgErXP+dkRGGRdam43SFjN10j5XW+7M9lv/RAaGDE= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAJsoRPPpw+k4AxoZrID47+imPoOAcTBIbI4oEPiE0xIL +NfzzUYeb70ia/VvKsk5hlK5bp6c2LuLagxmC5MtwXcUa3ky2vsZu2fhsbmS0ln8Y +urVU8YpvdSfjUZhQ95L/o+hlrmKrf5R84/k69W2a15hqO1qzH3OSrfJrfuUQ7j1a +cygYD1zgmW8eX2Ha4aTUoedpseCbuukbbWDitcaeGZ8h1NYv2lYV2E+1grJig6DN +cAUsIWFtkpqR+hZODOFKcm+tQdHU7UVNB4zPeZ7llTvWJ8x99UQdb5BL7w31f0o+ +h4Kt2wFAQoVKsIWbzWsLw6JeSMkhR53xsC28XtFfovU= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 16:f8:bf:80:31:00:65:e5:68:87:29:25:68:df:90:8c:7e:92: - 58:74:92:76:b3:b8:3b:16:ce:a6:8d:c1:98:6a:5c:2f:80:50: - 35:fc:d9:bf:3d:71:ae:9e:ed:35:65:a9:b5:21:2a:95:14:18: - 1c:79:d2:a9:2f:30:ec:3d:71:ce:61:9b:80:c3:14:ad:a4:ed: - a2:a0:74:79:b8:70:ec:ac:62:b1:8c:f4:9c:cb:1c:02:23:fc: - 28:51:34:dc:da:ab:3a:bb:de:03:6f:79:3e:44:b2:0c:7e:bc: - 47:4f:8d:f4:4a:be:17:a1:27:4e:a5:e2:45:bd:5b:e0:4d:1a: - 6d:f6:fb:c2:5c:6d:01:66:fa:e0:00:49:e2:13:96:ef:9d:30: - 44:d2:ee:26:a7:d9:48:a6:1e:92:5d:ed:b1:40:8d:88:e5:73: - 4c:7f:a7:a7:e0:a3:45:29:5f:36:d7:72:9c:b6:25:d2:b8:db: - 5c:43:1e:ba:65:bf:e7:93:b7:e6:df:c4:a1:ff:b9:03:96:81: - 9e:ae:8c:88:73:2d:27:8a:e9:32:a2:c5:43:f0:96:e5:83:a0: - df:f6:1b:03:40:a5:14:2d:67:1f:43:c3:ee:cd:64:58:0f:9c: - 4d:21:3d:6e:32:30:ea:0e:c4:8c:0e:67:31:15:45:9d:b2:50: - a6:1b:57:c3 + a3:86:46:c1:10:c2:92:fe:7d:9d:ce:49:ed:8c:bd:65:74:5e: + b7:19:53:d8:79:84:ca:f3:f3:e7:30:b7:b9:e1:61:b1:f3:77: + 95:14:7b:fd:fe:d9:d0:eb:aa:05:30:d2:71:dc:fa:03:ea:08: + e2:c9:07:ec:bf:f6:41:1f:d3:39:a4:1b:7b:23:c7:a1:a7:fd: + c0:f6:0e:07:94:91:0e:b7:8e:92:40:05:fc:09:2e:c5:ba:46: + ce:94:e5:3e:09:04:e9:b7:c3:52:3e:2d:c1:01:11:d8:2f:b6: + 10:1f:2d:3b:b1:1d:b0:c5:11:92:66:4d:52:2a:4e:d1:29:d3: + 4f:fd:0d:2e:4a:60:ed:35:8c:02:91:35:77:3d:21:a5:03:3d: + d2:bc:4e:68:0e:f6:4d:f7:87:a4:85:e5:51:33:38:b7:1f:4c: + 07:85:30:13:32:d9:d9:42:4f:ef:5f:a3:26:e0:60:79:c0:8a: + 7b:00:8b:9f:18:4b:8e:b3:9e:3f:6b:69:70:03:4c:43:21:1a: + 4d:80:04:48:a2:a0:ae:99:61:a8:84:35:35:99:c7:24:81:d8: + 55:95:6b:93:dd:eb:e7:04:de:9f:d4:b9:82:4e:bd:a7:c7:c7: + 80:5f:c4:78:d8:7b:65:4f:58:8e:d0:17:c8:90:1a:1c:8d:54: + 1c:3d:d5:f4 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkYtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBABb4v4Ax -AGXlaIcpJWjfkIx+klh0knazuDsWzqaNwZhqXC+AUDX82b89ca6e7TVlqbUhKpUU -GBx50qkvMOw9cc5hm4DDFK2k7aKgdHm4cOysYrGM9JzLHAIj/ChRNNzaqzq73gNv -eT5Esgx+vEdPjfRKvhehJ06l4kW9W+BNGm32+8JcbQFm+uAASeITlu+dMETS7ian -2UimHpJd7bFAjYjlc0x/p6fgo0UpXzbXcpy2JdK421xDHrplv+eTt+bfxKH/uQOW -gZ6ujIhzLSeK6TKixUPwluWDoN/2GwNApRQtZx9Dw+7NZFgPnE0hPW4yMOoOxIwO -ZzEVRZ2yUKYbV8M= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKOGRsEQ +wpL+fZ3OSe2MvWV0XrcZU9h5hMrz8+cwt7nhYbHzd5UUe/3+2dDrqgUw0nHc+gPq +COLJB+y/9kEf0zmkG3sjx6Gn/cD2DgeUkQ63jpJABfwJLsW6Rs6U5T4JBOm3w1I+ +LcEBEdgvthAfLTuxHbDFEZJmTVIqTtEp00/9DS5KYO01jAKRNXc9IaUDPdK8TmgO +9k33h6SF5VEzOLcfTAeFMBMy2dlCT+9foybgYHnAinsAi58YS46znj9raXADTEMh +Gk2ABEiioK6ZYaiENTWZxySB2FWVa5Pd6+cE3p/UuYJOvafHx4BfxHjYe2VPWI7Q +F8iQGhyNVBw91fQ= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 45:0e:29:8c:cb:ba:ea:b6:f9:ef:95:7b:e2:4d:e2:da:8a:4f: - fe:3a:49:0b:6f:0a:db:64:31:8d:f7:0e:bb:31:16:30:29:d2: - 3e:41:2f:c1:df:28:60:af:0f:2e:18:c4:b6:b0:3b:dd:d9:c5: - bf:43:4b:71:e4:9e:97:26:01:ec:12:5e:75:fe:64:10:ac:76: - 19:da:be:15:7d:cb:cd:18:da:1f:86:c2:f4:1e:aa:ae:ef:98: - f1:7e:dc:95:51:f2:a8:b1:41:dc:b3:08:22:1f:96:21:5b:40: - a8:01:d7:80:e9:fd:51:c0:51:0a:b2:15:7d:a0:64:8f:ee:4e: - bf:13:a9:3d:aa:22:05:2a:e8:11:ee:db:0d:72:98:e2:07:2c: - 06:be:88:7c:3a:49:c7:18:1a:ae:c1:4f:c4:b9:c8:37:d9:20: - f8:df:cf:b9:7f:68:44:35:36:70:44:05:87:29:99:37:55:b0: - f1:de:3b:e1:e9:d8:ef:79:79:43:41:c6:5b:58:51:78:6c:13: - 0c:bb:f6:31:4a:b4:c4:23:c1:67:99:a7:9e:8c:0c:fa:4b:ad: - 7b:f0:12:3c:3e:ac:fa:ee:7a:f6:4a:a2:da:ac:50:50:46:bb: - 37:03:94:c3:dd:01:4a:ac:05:6b:9c:03:cf:b2:43:be:52:25: - 1b:af:d7:f9 + b3:d8:4b:f8:59:d5:7a:95:55:af:eb:07:0c:ac:db:b5:cc:b8: + aa:0d:81:1b:31:d4:0f:8a:ef:da:28:0e:52:f1:8b:25:54:47: + 11:d8:62:a2:5b:5e:d5:fb:6d:b5:57:b4:a3:b6:d2:e0:e1:50: + 8b:e1:7e:cd:3b:48:54:4b:55:48:18:12:fe:55:3b:1e:e2:b8: + 34:b2:77:f7:21:05:9f:32:43:34:db:e4:d4:e3:d2:74:98:3e: + 1f:39:97:ef:e3:89:d9:e2:c0:77:f9:d4:74:a5:13:c0:ce:9e: + 3e:42:bc:0d:44:73:c5:76:47:81:dc:40:f4:06:bf:29:66:51: + 7b:41:c5:35:73:fe:5c:7a:9c:bf:4c:19:c5:2b:7b:02:1f:45: + 66:0c:64:01:29:77:a8:a2:ef:ba:61:19:27:a1:56:41:a6:73: + 5d:9f:39:86:38:e9:0a:31:23:55:f1:02:54:ce:96:18:32:ae: + 22:03:1d:fb:cb:90:45:54:8f:d2:29:17:9d:44:65:68:8c:d2: + 25:df:a8:c2:29:1e:66:2c:c4:57:a1:ab:93:c7:34:a2:e3:94: + bd:dc:8f:51:d2:08:a6:3c:63:c9:c1:ee:90:de:39:92:fc:5e: + 85:d4:f9:f0:b8:6e:09:30:0c:25:ce:c8:86:c1:75:5d:e8:e8: + 90:90:ad:0d -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkYtSUNBMS1wYXRobGVuMTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAEUOKYzLuuq2+e+Ve+JN4tqKT/46SQtvCttkMY33DrsxFjAp0j5B -L8HfKGCvDy4YxLawO93Zxb9DS3HknpcmAewSXnX+ZBCsdhnavhV9y80Y2h+GwvQe -qq7vmPF+3JVR8qixQdyzCCIfliFbQKgB14Dp/VHAUQqyFX2gZI/uTr8TqT2qIgUq -6BHu2w1ymOIHLAa+iHw6SccYGq7BT8S5yDfZIPjfz7l/aEQ1NnBEBYcpmTdVsPHe -O+Hp2O95eUNBxltYUXhsEwy79jFKtMQjwWeZp56MDPpLrXvwEjw+rPruevZKotqs -UFBGuzcDlMPdAUqsBWucA8+yQ75SJRuv1/k= +AQELBQADggEBALPYS/hZ1XqVVa/rBwys27XMuKoNgRsx1A+K79ooDlLxiyVURxHY +YqJbXtX7bbVXtKO20uDhUIvhfs07SFRLVUgYEv5VOx7iuDSyd/chBZ8yQzTb5NTj +0nSYPh85l+/jidniwHf51HSlE8DOnj5CvA1Ec8V2R4HcQPQGvylmUXtBxTVz/lx6 +nL9MGcUrewIfRWYMZAEpd6ii77phGSehVkGmc12fOYY46QoxI1XxAlTOlhgyriID +HfvLkEVUj9IpF51EZWiM0iXfqMIpHmYsxFehq5PHNKLjlL3cj1HSCKY8Y8nB7pDe +OZL8XoXU+fC4bgkwDCXOyIbBdV3o6JCQrQ0= -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA2-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -213,34 +213,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:0 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0d:51:ba:f9:87:88:e3:72:cd:79:15:4e:21:bb:c7:cd:6a:fd: - f3:1c:be:00:22:69:72:27:15:2a:43:ee:7b:3e:db:80:6b:61: - de:65:74:30:07:73:fd:82:ea:b8:b8:d1:66:08:ed:c6:87:0f: - 46:14:a9:57:dc:26:7b:cb:da:9b:bb:a2:0d:30:d8:94:ca:b8: - ae:9d:2b:e6:14:dc:63:9f:fb:6c:be:69:d9:2e:84:a0:05:1c: - b8:55:60:25:34:fb:ac:1e:3b:f5:55:14:8f:dc:65:79:51:b6: - 8f:61:08:6c:90:bf:39:a2:51:b2:43:27:db:8b:4e:9a:7b:a1: - 31:16:70:32:b9:c5:02:fe:8a:de:4c:76:5b:f9:50:0a:05:e2: - 02:b6:dd:3a:2c:6d:d3:f9:81:1b:0e:7d:e4:41:6a:b3:81:80: - 9c:f0:1e:f0:e3:d9:30:11:c8:23:79:b0:d7:c1:05:be:36:90: - 08:78:c9:08:cd:63:b0:ec:df:4b:81:50:ab:42:c8:ee:86:d6: - be:5b:ec:30:a6:60:d1:8d:0a:a5:d0:23:54:e6:c4:05:59:0e: - 74:2f:1e:d5:3c:8f:da:8f:d2:00:20:12:b5:cf:f9:d9:11:18: - 64:5d:6a:6e:37:48:58:cd:d7:48:f9:5d:6f:bb:33:d9:6f:fd: - 10:1a:18:31 + 9b:28:44:f3:e9:c3:e9:38:03:1a:19:ac:80:f8:ef:e8:a6:3e: + 83:80:71:30:48:6c:8e:28:10:f8:84:d3:12:0b:35:fc:f3:51: + 87:9b:ef:48:9a:fd:5b:ca:b2:4e:61:94:ae:5b:a7:a7:36:2e: + e2:da:83:19:82:e4:cb:70:5d:c5:1a:de:4c:b6:be:c6:6e:d9: + f8:6c:6e:64:b4:96:7f:18:ba:b5:54:f1:8a:6f:75:27:e3:51: + 98:50:f7:92:ff:a3:e8:65:ae:62:ab:7f:94:7c:e3:f9:3a:f5: + 6d:9a:d7:98:6a:3b:5a:b3:1f:73:92:ad:f2:6b:7e:e5:10:ee: + 3d:5a:73:28:18:0f:5c:e0:99:6f:1e:5f:61:da:e1:a4:d4:a1: + e7:69:b1:e0:9b:ba:e9:1b:6d:60:e2:b5:c6:9e:19:9f:21:d4: + d6:2f:da:56:15:d8:4f:b5:82:b2:62:83:a0:cd:70:05:2c:21: + 61:6d:92:9a:91:fa:16:4e:0c:e1:4a:72:6f:ad:41:d1:d4:ed: + 45:4d:07:8c:cf:79:9e:e5:95:3b:d6:27:cc:7d:f5:44:1d:6f: + 90:4b:ef:0d:f5:7f:4a:3e:87:82:ad:db:01:40:42:85:4a:b0: + 85:9b:cd:6b:0b:c3:a2:5e:48:c9:21:47:9d:f1:b0:2d:bc:5e: + d1:5f:a2:f5 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluRi1JQ0Ey LXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -254,12 +254,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAA1RuvmHiONyzXkVTiG7x81q/fMcvgAiaXInFSpD7ns+ -24BrYd5ldDAHc/2C6ri40WYI7caHD0YUqVfcJnvL2pu7og0w2JTKuK6dK+YU3GOf -+2y+adkuhKAFHLhVYCU0+6weO/VVFI/cZXlRto9hCGyQvzmiUbJDJ9uLTpp7oTEW -cDK5xQL+it5Mdlv5UAoF4gK23TosbdP5gRsOfeRBarOBgJzwHvDj2TARyCN5sNfB -Bb42kAh4yQjNY7Ds30uBUKtCyO6G1r5b7DCmYNGNCqXQI1TmxAVZDnQvHtU8j9qP -0gAgErXP+dkRGGRdam43SFjN10j5XW+7M9lv/RAaGDE= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBADALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAJsoRPPpw+k4AxoZrID47+imPoOAcTBIbI4oEPiE0xIL +NfzzUYeb70ia/VvKsk5hlK5bp6c2LuLagxmC5MtwXcUa3ky2vsZu2fhsbmS0ln8Y +urVU8YpvdSfjUZhQ95L/o+hlrmKrf5R84/k69W2a15hqO1qzH3OSrfJrfuUQ7j1a +cygYD1zgmW8eX2Ha4aTUoedpseCbuukbbWDitcaeGZ8h1NYv2lYV2E+1grJig6DN +cAUsIWFtkpqR+hZODOFKcm+tQdHU7UVNB4zPeZ7llTvWJ8x99UQdb5BL7w31f0o+ +h4Kt2wFAQoVKsIWbzWsLw6JeSMkhR53xsC28XtFfovU= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainF-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-ICA1-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainF-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 16:f8:bf:80:31:00:65:e5:68:87:29:25:68:df:90:8c:7e:92: - 58:74:92:76:b3:b8:3b:16:ce:a6:8d:c1:98:6a:5c:2f:80:50: - 35:fc:d9:bf:3d:71:ae:9e:ed:35:65:a9:b5:21:2a:95:14:18: - 1c:79:d2:a9:2f:30:ec:3d:71:ce:61:9b:80:c3:14:ad:a4:ed: - a2:a0:74:79:b8:70:ec:ac:62:b1:8c:f4:9c:cb:1c:02:23:fc: - 28:51:34:dc:da:ab:3a:bb:de:03:6f:79:3e:44:b2:0c:7e:bc: - 47:4f:8d:f4:4a:be:17:a1:27:4e:a5:e2:45:bd:5b:e0:4d:1a: - 6d:f6:fb:c2:5c:6d:01:66:fa:e0:00:49:e2:13:96:ef:9d:30: - 44:d2:ee:26:a7:d9:48:a6:1e:92:5d:ed:b1:40:8d:88:e5:73: - 4c:7f:a7:a7:e0:a3:45:29:5f:36:d7:72:9c:b6:25:d2:b8:db: - 5c:43:1e:ba:65:bf:e7:93:b7:e6:df:c4:a1:ff:b9:03:96:81: - 9e:ae:8c:88:73:2d:27:8a:e9:32:a2:c5:43:f0:96:e5:83:a0: - df:f6:1b:03:40:a5:14:2d:67:1f:43:c3:ee:cd:64:58:0f:9c: - 4d:21:3d:6e:32:30:ea:0e:c4:8c:0e:67:31:15:45:9d:b2:50: - a6:1b:57:c3 + a3:86:46:c1:10:c2:92:fe:7d:9d:ce:49:ed:8c:bd:65:74:5e: + b7:19:53:d8:79:84:ca:f3:f3:e7:30:b7:b9:e1:61:b1:f3:77: + 95:14:7b:fd:fe:d9:d0:eb:aa:05:30:d2:71:dc:fa:03:ea:08: + e2:c9:07:ec:bf:f6:41:1f:d3:39:a4:1b:7b:23:c7:a1:a7:fd: + c0:f6:0e:07:94:91:0e:b7:8e:92:40:05:fc:09:2e:c5:ba:46: + ce:94:e5:3e:09:04:e9:b7:c3:52:3e:2d:c1:01:11:d8:2f:b6: + 10:1f:2d:3b:b1:1d:b0:c5:11:92:66:4d:52:2a:4e:d1:29:d3: + 4f:fd:0d:2e:4a:60:ed:35:8c:02:91:35:77:3d:21:a5:03:3d: + d2:bc:4e:68:0e:f6:4d:f7:87:a4:85:e5:51:33:38:b7:1f:4c: + 07:85:30:13:32:d9:d9:42:4f:ef:5f:a3:26:e0:60:79:c0:8a: + 7b:00:8b:9f:18:4b:8e:b3:9e:3f:6b:69:70:03:4c:43:21:1a: + 4d:80:04:48:a2:a0:ae:99:61:a8:84:35:35:99:c7:24:81:d8: + 55:95:6b:93:dd:eb:e7:04:de:9f:d4:b9:82:4e:bd:a7:c7:c7: + 80:5f:c4:78:d8:7b:65:4f:58:8e:d0:17:c8:90:1a:1c:8d:54: + 1c:3d:d5:f4 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRi1JQ0ExLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkYtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRi1JQ0EyLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBABb4v4Ax -AGXlaIcpJWjfkIx+klh0knazuDsWzqaNwZhqXC+AUDX82b89ca6e7TVlqbUhKpUU -GBx50qkvMOw9cc5hm4DDFK2k7aKgdHm4cOysYrGM9JzLHAIj/ChRNNzaqzq73gNv -eT5Esgx+vEdPjfRKvhehJ06l4kW9W+BNGm32+8JcbQFm+uAASeITlu+dMETS7ian -2UimHpJd7bFAjYjlc0x/p6fgo0UpXzbXcpy2JdK421xDHrplv+eTt+bfxKH/uQOW -gZ6ujIhzLSeK6TKixUPwluWDoN/2GwNApRQtZx9Dw+7NZFgPnE0hPW4yMOoOxIwO -ZzEVRZ2yUKYbV8M= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKOGRsEQ +wpL+fZ3OSe2MvWV0XrcZU9h5hMrz8+cwt7nhYbHzd5UUe/3+2dDrqgUw0nHc+gPq +COLJB+y/9kEf0zmkG3sjx6Gn/cD2DgeUkQ63jpJABfwJLsW6Rs6U5T4JBOm3w1I+ +LcEBEdgvthAfLTuxHbDFEZJmTVIqTtEp00/9DS5KYO01jAKRNXc9IaUDPdK8TmgO +9k33h6SF5VEzOLcfTAeFMBMy2dlCT+9foybgYHnAinsAi58YS46znj9raXADTEMh +Gk2ABEiioK6ZYaiENTWZxySB2FWVa5Pd6+cE3p/UuYJOvafHx4BfxHjYe2VPWI7Q +F8iQGhyNVBw91fQ= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA1-pathlen0.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA1-pathlen0.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA1-pathlen0.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA1-pathlen0.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - a8:e1:75:09:71:57:28:d6:27:3a:92:89:0c:47:57:05:3a:92: - 81:d3:23:00:92:fd:f3:77:24:60:67:af:86:ba:b2:17:1a:9f: - 5e:3a:ee:ba:a3:fa:1f:76:69:b9:18:4d:89:97:ac:54:5a:9f: - e2:ad:7a:37:d3:e1:35:fa:39:32:7f:d9:14:98:48:16:4d:99: - e6:d5:61:0e:31:df:d1:a7:cd:c1:fd:6b:72:59:80:f7:8c:77: - ef:45:c9:53:ed:b6:a4:73:06:1e:d3:d6:40:01:c8:c7:3c:48: - 71:38:ac:66:a8:f6:e2:5f:75:87:a8:93:28:db:ef:3f:e2:c6: - 2b:0d:ac:63:33:9c:1c:65:8d:9a:b2:3e:c8:2b:0d:3c:96:ef: - b3:e2:4d:b8:fe:6d:8b:59:66:02:3f:f9:a8:0b:08:a3:30:a7: - 9c:81:74:3d:88:cb:3f:f7:93:95:93:9f:38:53:ac:d9:a5:ae: - 43:46:30:17:25:b1:cb:bf:2d:fe:df:32:17:ec:b0:54:33:c7: - 1c:31:78:86:8c:fd:16:9e:0c:a4:71:3f:d0:a4:0e:26:90:39: - 68:34:bf:34:f7:73:fb:7b:64:14:3f:b4:41:95:c2:da:16:dc: - 20:a4:cc:3e:fa:64:dd:ce:d6:48:11:9d:ab:6b:a7:3e:c6:67: - 1d:ac:f6:0b + 6e:12:75:fb:ac:2b:b3:b5:f3:f8:0c:2b:61:c3:22:c0:1f:16: + cf:36:8c:b2:fc:be:83:ad:81:3d:e9:4e:76:e3:85:db:34:b4: + b1:a6:ed:fe:82:ee:b2:7c:64:14:e4:1f:d6:fb:16:3e:36:d7: + a1:f3:99:99:7c:48:96:50:d0:e4:29:43:42:93:7c:8e:24:fc: + ba:6b:89:1c:1b:c8:39:d2:62:5e:7f:ac:0c:e8:7d:f4:90:94: + a3:dc:5d:d4:25:60:07:6f:97:6c:a1:4f:5a:ec:84:70:46:de: + 4d:74:a8:5c:48:32:94:6d:69:81:65:c6:c4:ef:3e:31:fc:40: + f5:5c:10:29:23:49:a7:ca:27:27:33:ed:3f:65:1a:95:f0:57: + 5a:32:19:b4:4d:66:c5:19:15:4b:a9:79:c9:fb:cd:02:57:04: + c2:33:6d:6c:85:67:14:16:7a:d2:32:a0:66:c4:b9:0d:43:bd: + 57:52:27:da:af:f1:df:68:27:74:b9:dd:d3:3c:ba:79:d0:46: + 2c:91:fc:1c:65:a4:3a:ea:82:25:c9:b1:2f:7d:78:85:62:1f: + a4:4c:69:fc:a3:95:c3:0a:ce:ed:10:24:ec:f7:17:bf:22:42: + 44:ac:0d:77:a1:3d:9d:d0:fb:03:1b:b7:79:8a:ba:6e:3c:a4: + 3e:1c:0a:54 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkctSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHjAcBgNVBAMMFWNoYWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEAMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAqOF1CXFXKNYnOpKJDEdXBTqSgdMjAJL9 -83ckYGevhrqyFxqfXjruuqP6H3ZpuRhNiZesVFqf4q16N9PhNfo5Mn/ZFJhIFk2Z -5tVhDjHf0afNwf1rclmA94x370XJU+22pHMGHtPWQAHIxzxIcTisZqj24l91h6iT -KNvvP+LGKw2sYzOcHGWNmrI+yCsNPJbvs+JNuP5ti1lmAj/5qAsIozCnnIF0PYjL -P/eTlZOfOFOs2aWuQ0YwFyWxy78t/t8yF+ywVDPHHDF4hoz9Fp4MpHE/0KQOJpA5 -aDS/NPdz+3tkFD+0QZXC2hbcIKTMPvpk3c7WSBGdq2unPsZnHaz2Cw== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAbhJ1+6wrs7Xz+AwrYcMiwB8WzzaMsvy+ +g62BPelOduOF2zS0sabt/oLusnxkFOQf1vsWPjbXofOZmXxIllDQ5ClDQpN8jiT8 +umuJHBvIOdJiXn+sDOh99JCUo9xd1CVgB2+XbKFPWuyEcEbeTXSoXEgylG1pgWXG +xO8+MfxA9VwQKSNJp8onJzPtP2UalfBXWjIZtE1mxRkVS6l5yfvNAlcEwjNtbIVn +FBZ60jKgZsS5DUO9V1In2q/x32gndLnd0zy6edBGLJH8HGWkOuqCJcmxL314hWIf +pExp/KOVwwrO7RAk7PcXvyJCRKwNd6E9ndD7Axu3eYq6bjykPhwKVA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA2-pathlen1.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA2-pathlen1.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA2-pathlen1.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA2-pathlen1.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 56:b8:f2:49:b8:e6:65:25:db:46:5f:f4:72:40:14:a5:27:39: - 27:28:9b:f9:cc:5a:02:7f:76:05:e7:18:45:1f:29:c6:cb:ce: - 77:50:35:74:0c:95:ed:3a:7e:a0:87:8a:7d:8f:6f:2f:3c:5d: - 03:86:da:c2:2c:b3:2f:6d:7b:af:a4:83:c7:f3:6e:5b:48:c3: - d9:4a:e5:af:e1:86:e1:81:68:45:2e:fb:09:19:94:be:91:dd: - 8f:f4:e7:94:fb:9e:54:4c:a7:c9:10:87:8d:f0:08:14:08:c9: - d7:92:44:56:59:03:10:27:2c:fb:7e:24:01:8b:9f:cc:e0:6a: - 31:5c:67:e3:96:88:f8:86:3f:ec:1e:bd:07:d2:fc:34:1d:ff: - 8d:72:c1:2d:de:09:7f:e4:c4:dd:98:70:73:ed:84:a6:4f:f8: - ec:a5:18:b6:0c:55:e2:a4:aa:0c:37:60:52:3d:76:f5:dd:ab: - 0a:7c:fd:4d:81:a6:a9:c6:49:14:e7:51:00:f4:6a:d9:dc:15: - ef:72:d1:79:c3:65:e2:e1:f5:23:c4:90:ba:4a:e2:01:d9:09: - 83:e5:34:0f:c3:ea:03:cf:62:b9:bb:18:26:30:54:77:b1:a6: - 63:99:35:0a:40:2b:df:2a:2c:3a:e0:0c:2c:f6:1b:6a:de:e2: - 02:31:9d:c0 + 50:65:9b:1d:8b:6a:ae:9b:d4:f1:ff:57:ac:51:48:fd:c8:9e: + 19:bb:b2:00:bf:54:ee:c8:d4:2f:eb:5b:ff:17:1e:7c:aa:1d: + d4:01:9f:e8:cb:c4:8c:e5:ee:99:04:33:e8:16:3a:fc:44:bd: + 56:a5:45:e7:e9:fb:88:25:11:4b:07:73:5d:37:21:47:47:9d: + f8:e0:89:e0:e4:c0:6a:f4:64:25:e7:b7:d9:47:53:ff:d5:6f: + f3:e4:8d:b2:33:f6:ce:46:5b:80:82:8f:05:18:f4:bc:90:5a: + af:4a:7f:9d:67:08:f7:41:27:05:c5:34:46:03:fc:14:2e:4e: + 81:f3:ca:3d:67:9e:a9:53:ec:5b:df:38:d4:b5:92:3d:55:94: + df:88:be:a1:e7:14:18:a2:9d:22:5d:10:69:f8:54:c3:a9:14: + ef:8e:af:e1:8a:f8:cd:6d:7e:26:30:2c:40:bc:50:49:e5:9f: + bc:8f:de:30:23:93:c4:25:b3:e6:fb:b5:64:82:57:41:ac:79: + 1e:58:9e:6c:67:dc:18:ed:c4:60:79:06:b1:ee:9f:4c:2c:a3: + 9c:61:d7:77:33:b5:64:50:65:88:33:a0:30:57:99:0f:a9:aa: + a7:b3:a8:0d:b1:c5:ce:5a:34:a8:31:47:e4:66:62:b2:11:0e: + b9:58:4f:06 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMzEyMTMyMjE5MzJaFw0yNjA5MDgyMjE5MzJaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTItcGF0aGxlbjExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -80,10 +80,10 @@ ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR0wGwYDVQQDDBRjaGFpbkctSUNBNC1wYXRobGVuNTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEBMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVrjySbjmZSXbRl/0ckAUpSc5Jyib+cxa -An92BecYRR8pxsvOd1A1dAyV7Tp+oIeKfY9vLzxdA4bawiyzL217r6SDx/NuW0jD -2Urlr+GG4YFoRS77CRmUvpHdj/TnlPueVEynyRCHjfAIFAjJ15JEVlkDECcs+34k -AYufzOBqMVxn45aI+IY/7B69B9L8NB3/jXLBLd4Jf+TE3Zhwc+2Epk/47KUYtgxV -4qSqDDdgUj129d2rCnz9TYGmqcZJFOdRAPRq2dwV73LRecNl4uH1I8SQukriAdkJ -g+U0D8PqA89iubsYJjBUd7GmY5k1CkAr3yosOuAMLPYbat7iAjGdwA== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAUGWbHYtqrpvU8f9XrFFI/cieGbuyAL9U +7sjUL+tb/xcefKod1AGf6MvEjOXumQQz6BY6/ES9VqVF5+n7iCURSwdzXTchR0ed ++OCJ4OTAavRkJee32UdT/9Vv8+SNsjP2zkZbgIKPBRj0vJBar0p/nWcI90EnBcU0 +RgP8FC5OgfPKPWeeqVPsW9841LWSPVWU34i+oecUGKKdIl0QafhUw6kU746v4Yr4 +zW1+JjAsQLxQSeWfvI/eMCOTxCWz5vu1ZIJXQax5HliebGfcGO3EYHkGse6fTCyj +nGHXdzO1ZFBliDOgMFeZD6mqp7OoDbHFzlo0qDFH5GZishEOuVhPBg== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA3-pathlen99.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA3-pathlen99.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA3-pathlen99.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA3-pathlen99.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 7b:72:02:a6:a9:ab:c5:08:f6:39:85:63:df:3a:b6:25:6f:94: - 72:97:c9:64:e5:a8:c8:e9:e1:09:cd:ae:d2:95:7c:de:fb:8d: - 64:b4:51:a4:86:af:a9:5d:50:37:e8:41:87:3a:8e:0c:77:6b: - 35:0f:db:78:0e:92:bf:f9:ca:82:d5:d0:e9:27:71:6b:ac:02: - 34:86:e2:c2:0b:b2:42:06:91:d3:f6:02:55:23:71:33:57:a9: - 58:db:0d:1d:fe:d3:9b:ca:c4:c9:b8:6e:6f:32:cb:12:b8:9f: - 6d:44:2b:fd:22:cf:8f:c0:53:f9:5a:b5:3a:e9:48:37:f3:0d: - d8:77:5b:cb:1d:97:5b:a9:3b:b3:b9:b5:5e:c2:c0:d6:8d:66: - f0:19:e9:4a:ca:e3:f0:93:f3:82:93:e7:7d:7f:21:51:4e:ef: - ce:82:d7:52:91:dd:5f:74:ff:84:fe:0a:d9:c3:3d:9a:62:da: - f4:c9:5b:fc:f8:60:db:d3:69:08:7c:09:fd:04:10:7b:48:b8: - 9b:ed:eb:58:f1:1f:aa:87:a9:bf:60:f8:7a:df:96:b3:77:4b: - 4d:db:b6:6f:34:b3:8d:4d:e3:a4:cd:01:b4:15:0f:8c:12:06: - 96:e7:36:46:ac:7f:1f:ca:af:e4:2d:f8:90:ab:ce:6f:b1:b4: - 9e:2f:5a:2a + 0b:ad:52:52:31:8c:12:70:07:6c:05:83:b3:84:cf:c2:64:da: + 43:d2:cc:6c:db:ef:a5:ae:9b:44:96:4e:fe:fd:b9:61:56:59: + e2:f2:52:c8:1b:52:2c:36:79:5d:6a:83:a1:c8:03:9a:7a:80: + 4f:ee:9d:48:87:f4:cb:9b:5e:84:c8:f8:b8:0c:77:e1:cb:40: + ac:28:eb:58:07:e4:06:a7:50:e2:44:48:bc:a3:2f:5d:f1:fa: + 0c:4d:1d:84:0a:57:e5:0c:b9:bb:41:b9:12:17:09:25:9f:99: + 02:6b:9e:83:fb:07:f8:3f:59:b2:04:62:b7:12:e7:61:8b:48: + a7:cc:29:ce:11:f9:7c:64:dd:5c:51:d3:ac:0c:54:4b:22:7e: + 29:de:98:50:80:f8:1a:65:64:3c:fb:a6:07:bb:e8:b1:a4:e8: + f1:7b:07:fd:e2:50:07:67:f5:7a:fa:76:4d:1c:7f:1a:e3:52: + ad:13:a6:b5:89:9e:f5:11:68:12:13:dc:59:86:9d:f9:83:18: + 52:ee:09:24:6a:37:e9:85:95:ac:93:09:23:09:0e:f3:66:a8: + 85:ee:d1:e4:40:01:f3:c2:c3:1f:48:74:76:2b:7e:4c:9b:a9: + a2:2f:c8:7c:74:60:2d:98:e8:63:09:cf:8f:a8:c8:8a:7f:c4: + d4:f3:34:ad -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0E0LXBhdGhsZW41MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaIxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaIxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR4wHAYDVQQD DBVjaGFpbkctSUNBMy1wYXRobGVuOTkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -80,10 +80,10 @@ ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNS1wYXRobGVuMjAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBYzALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHtyAqapq8UI9jmFY986tiVvlHKXyWTl -qMjp4QnNrtKVfN77jWS0UaSGr6ldUDfoQYc6jgx3azUP23gOkr/5yoLV0OkncWus -AjSG4sILskIGkdP2AlUjcTNXqVjbDR3+05vKxMm4bm8yyxK4n21EK/0iz4/AU/la -tTrpSDfzDdh3W8sdl1upO7O5tV7CwNaNZvAZ6UrK4/CT84KT531/IVFO786C11KR -3V90/4T+CtnDPZpi2vTJW/z4YNvTaQh8Cf0EEHtIuJvt61jxH6qHqb9g+HrflrN3 -S03btm80s41N46TNAbQVD4wSBpbnNkasfx/Kr+Qt+JCrzm+xtJ4vWio= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAAutUlIxjBJwB2wFg7OEz8Jk2kPSzGzb +76Wum0SWTv79uWFWWeLyUsgbUiw2eV1qg6HIA5p6gE/unUiH9MubXoTI+LgMd+HL +QKwo61gH5AanUOJESLyjL13x+gxNHYQKV+UMubtBuRIXCSWfmQJrnoP7B/g/WbIE +YrcS52GLSKfMKc4R+Xxk3VxR06wMVEsifinemFCA+BplZDz7pge76LGk6PF7B/3i +UAdn9Xr6dk0cfxrjUq0TprWJnvURaBIT3FmGnfmDGFLuCSRqN+mFlayTCSMJDvNm +qIXu0eRAAfPCwx9IdHYrfkybqaIvyHx0YC2Y6GMJz4+oyIp/xNTzNK0= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA4-pathlen5.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA4-pathlen5.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA4-pathlen5.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA4-pathlen5.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 04:f9:2d:12:27:73:f5:79:fd:73:35:ec:7c:dd:fb:fc:66:07: - b6:ce:a6:2a:25:c2:12:6f:c7:9f:15:fa:b4:1f:3c:b9:c3:ea: - 9c:ee:85:02:d9:f3:66:19:10:e5:7f:57:76:e7:07:77:86:34: - 44:84:e8:89:a5:98:b8:b6:21:8f:f0:60:95:96:38:ce:be:ab: - ee:a6:1d:47:dc:bf:37:c2:ca:d5:54:0c:8b:6f:11:e5:52:b6: - 52:36:95:d1:ef:e0:18:7f:b2:00:8d:b4:dd:94:69:41:fc:7d: - d4:43:55:bd:e8:e3:5f:1a:71:9a:1a:fa:4a:d3:d7:bd:ce:ac: - e6:83:6b:47:31:60:90:96:d8:4c:34:0e:ba:25:d7:f2:40:3a: - 37:bb:27:4c:de:40:9a:20:a5:0e:23:9b:ef:90:7f:1c:23:fd: - 62:c7:f5:c1:35:de:73:f4:09:e6:e6:a2:15:64:53:93:95:38: - 06:2b:64:59:7d:56:8c:88:3c:6f:f5:b7:8f:21:9c:a8:a7:46: - da:66:5e:5c:e5:6a:4b:81:69:97:e3:5c:ed:7c:01:90:5e:bd: - 06:47:e7:48:db:e8:13:18:f9:2e:6b:a0:26:61:d7:49:83:b7: - 9d:b9:98:b7:c0:40:c7:0d:e8:5e:2a:f7:67:85:36:24:0e:68: - 8d:ca:8e:78 + a6:f3:32:99:ee:fd:de:b1:46:ad:68:a7:6f:d8:55:91:63:2d: + 07:ce:91:2f:e3:ff:8f:03:e3:cf:c2:33:76:91:33:5f:13:70: + 10:e4:e2:3b:70:02:fc:d2:7d:39:d2:1a:1e:82:2d:40:d8:a7: + bb:69:19:51:fb:c1:32:41:e5:cf:4f:39:f6:f8:dd:b4:cb:f2: + 11:3e:dc:8d:c7:a6:90:27:14:4b:28:6f:20:9a:58:92:3a:42: + 8c:c7:40:36:b5:c0:4a:7e:27:0b:37:a7:71:e4:fd:f4:8d:24: + 8d:fe:3d:4a:59:4e:7e:86:02:f2:e2:09:95:59:ca:19:b9:23: + 84:1e:c6:14:d9:c4:05:7a:93:77:b4:4a:f4:91:75:3f:89:43: + 8b:b1:5f:a5:36:0a:2a:b0:a1:7b:8f:33:01:92:4d:c1:d9:51: + 98:a3:1b:14:f9:34:8e:7c:db:a5:5c:2c:b2:cd:23:b6:f6:65: + 25:aa:2c:5c:cc:38:49:b2:77:aa:8f:73:3b:00:1f:33:94:43: + fd:c2:34:ba:ee:ac:7d:0d:62:58:72:4d:ea:78:29:b5:b1:29: + 99:70:8c:00:22:1c:a3:93:ca:cd:c8:02:21:57:2d:19:fd:a7: + fb:c7:1c:12:0c:49:04:73:4c:7e:dd:9f:9e:1c:5b:e4:2a:53: + b6:cf:7e:c4 -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E1LXBhdGhsZW4yMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMzEyMTMyMjE5MzJaFw0yNjA5MDgyMjE5MzJaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTQtcGF0aGxlbjUxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -80,10 +80,10 @@ ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNi1wYXRobGVuMTAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBBTALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAAT5LRInc/V5/XM17Hzd+/xmB7bOpiol -whJvx58V+rQfPLnD6pzuhQLZ82YZEOV/V3bnB3eGNESE6ImlmLi2IY/wYJWWOM6+ -q+6mHUfcvzfCytVUDItvEeVStlI2ldHv4Bh/sgCNtN2UaUH8fdRDVb3o418acZoa -+krT173OrOaDa0cxYJCW2Ew0Drol1/JAOje7J0zeQJogpQ4jm++Qfxwj/WLH9cE1 -3nP0CebmohVkU5OVOAYrZFl9VoyIPG/1t48hnKinRtpmXlzlakuBaZfjXO18AZBe -vQZH50jb6BMY+S5roCZh10mDt525mLfAQMcN6F4q92eFNiQOaI3Kjng= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKbzMpnu/d6xRq1op2/YVZFjLQfOkS/j +/48D48/CM3aRM18TcBDk4jtwAvzSfTnSGh6CLUDYp7tpGVH7wTJB5c9POfb43bTL +8hE+3I3HppAnFEsobyCaWJI6QozHQDa1wEp+Jws3p3Hk/fSNJI3+PUpZTn6GAvLi +CZVZyhm5I4QexhTZxAV6k3e0SvSRdT+JQ4uxX6U2CiqwoXuPMwGSTcHZUZijGxT5 +NI5826VcLLLNI7b2ZSWqLFzMOEmyd6qPczsAHzOUQ/3CNLrurH0NYlhyTep4KbWx +KZlwjAAiHKOTys3IAiFXLRn9p/vHHBIMSQRzTH7dn54cW+QqU7bPfsQ= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA5-pathlen20.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA5-pathlen20.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA5-pathlen20.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA5-pathlen20.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0f:b1:e3:0e:db:7f:2c:93:25:66:ef:c4:84:a6:65:86:54:58: - ff:59:ba:07:80:0f:56:cd:ae:15:39:64:8c:3d:05:c2:dc:3d: - e2:9e:e8:b9:ec:55:15:c8:4f:0c:e0:41:65:8a:86:ff:f4:7f: - a4:e0:aa:ea:a6:54:0c:3d:a2:82:d9:5c:c1:82:aa:d8:48:32: - 84:ca:96:a5:21:b5:36:de:97:50:3b:9e:00:78:2a:af:30:09: - f4:b7:6b:56:d7:38:a0:1c:b1:8b:d7:db:71:eb:46:b2:e2:c7: - 42:d2:02:6d:03:dc:9d:83:ba:aa:be:23:62:73:98:16:74:3b: - 8a:89:00:e8:b0:04:21:31:4c:0f:df:ef:3b:1e:fd:28:c5:07: - 6b:b3:87:d1:78:4a:4b:97:8f:5b:09:39:b4:09:d5:62:c0:72: - 31:0b:fa:7d:81:5f:dd:2f:3a:e1:61:d2:c0:b4:54:eb:01:e4: - 94:90:30:8d:fa:8f:94:04:b2:9f:ca:3a:b1:c1:b9:72:24:f1: - 0c:f9:09:1e:a0:5b:d9:28:a6:d4:ee:aa:bf:37:ea:ee:4d:85: - 8a:f8:b0:6c:98:7e:a4:17:0d:01:03:46:7d:82:80:2a:48:17: - a9:d6:4b:57:38:f1:53:54:54:00:5a:83:d6:96:b6:fe:c6:dc: - 65:40:60:c9 + d9:f9:09:10:86:29:c0:72:a4:93:87:4d:d3:79:ce:fa:f3:8a: + 79:9a:d0:eb:6d:42:06:00:fc:2c:c3:fa:35:c5:b6:6d:a4:7f: + 66:29:d2:ad:ed:50:a5:a8:1e:1b:24:db:f3:52:bf:54:b8:3f: + 67:c2:be:f4:a4:fc:d2:77:74:a4:02:74:0d:fe:c5:e0:42:bd: + 2b:7c:16:ae:a1:68:6f:e5:80:29:07:f3:5e:e4:0e:96:d2:ee: + cd:d2:82:00:22:a7:72:d7:c5:38:71:a0:ac:2a:38:03:c4:c1: + 23:62:1e:fa:b3:24:32:0f:01:a4:64:a8:ab:79:60:55:77:da: + ca:76:00:14:2f:e0:e1:74:f9:72:e2:7d:aa:3d:6b:9f:50:ab: + 72:31:40:4b:19:9d:b9:9a:12:de:db:15:c3:36:90:9d:48:6f: + 7a:98:47:7a:65:a2:d5:5b:0c:f3:90:5d:dd:4e:1c:ba:72:b4: + ac:be:ca:1b:87:16:7f:f2:b0:33:9b:7a:26:37:eb:1f:cb:4d: + bf:c7:f1:01:80:b7:60:c4:ae:71:bb:ab:cc:bd:8a:ba:c4:23: + 87:15:1e:b9:c7:6d:2d:44:fd:67:25:45:e2:cd:76:4d:87:a1: + 80:e0:a2:e6:60:23:51:4d:17:b0:82:51:ef:0c:88:75:64:c1: + 7b:8e:c2:29 -----BEGIN CERTIFICATE----- MIIE1zCCA7+gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGiMQswCQYDVQQG +LmNvbTAeFw0yMzEyMTMyMjE5MzJaFw0yNjA5MDgyMjE5MzJaMIGiMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEeMBwGA1UE AwwVY2hhaW5HLUlDQTUtcGF0aGxlbjIwMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -80,10 +80,10 @@ U2VhdHRsZTEVMBMGA1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVl cmluZzEfMB0GA1UEAwwWY2hhaW5HLUlDQTctcGF0aGxlbjEwMDEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEUMAsGA1Ud -DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAD7HjDtt/LJMlZu/EhKZlhlRY/1m6 -B4APVs2uFTlkjD0Fwtw94p7ouexVFchPDOBBZYqG//R/pOCq6qZUDD2igtlcwYKq -2EgyhMqWpSG1Nt6XUDueAHgqrzAJ9LdrVtc4oByxi9fbcetGsuLHQtICbQPcnYO6 -qr4jYnOYFnQ7iokA6LAEITFMD9/vOx79KMUHa7OH0XhKS5ePWwk5tAnVYsByMQv6 -fYFf3S864WHSwLRU6wHklJAwjfqPlASyn8o6scG5ciTxDPkJHqBb2Sim1O6qvzfq -7k2FiviwbJh+pBcNAQNGfYKAKkgXqdZLVzjxU1RUAFqD1pa2/sbcZUBgyQ== +DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEA2fkJEIYpwHKkk4dN03nO+vOKeZrQ +621CBgD8LMP6NcW2baR/ZinSre1QpageGyTb81K/VLg/Z8K+9KT80nd0pAJ0Df7F +4EK9K3wWrqFob+WAKQfzXuQOltLuzdKCACKnctfFOHGgrCo4A8TBI2Ie+rMkMg8B +pGSoq3lgVXfaynYAFC/g4XT5cuJ9qj1rn1CrcjFASxmduZoS3tsVwzaQnUhvephH +emWi1VsM85Bd3U4cunK0rL7KG4cWf/KwM5t6JjfrH8tNv8fxAYC3YMSucburzL2K +usQjhxUeucdtLUT9ZyVF4s12TYehgOCi5mAjUU0XsIJR7wyIdWTBe47CKQ== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA6-pathlen10.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA6-pathlen10.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA6-pathlen10.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA6-pathlen10.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - b8:32:b6:b5:8a:90:09:c7:d2:11:7d:f7:8f:14:5d:61:80:cf: - e8:ac:65:bf:d7:08:51:3c:60:16:15:9e:e0:ec:7a:9b:87:0c: - bc:ad:56:67:de:1b:a5:d4:54:53:da:73:e8:27:8f:02:77:73: - 12:86:99:22:3a:32:77:50:48:38:2b:c1:9f:46:81:26:10:0a: - ee:24:a2:ae:42:dc:81:14:d3:b7:10:2f:11:aa:bb:70:ba:9c: - 82:29:c8:2c:3e:e0:6b:8e:fb:e4:39:33:fc:ef:2f:d7:70:3a: - 09:f5:d3:85:af:b3:59:00:b4:c6:2b:c5:1a:6b:3a:a7:4b:bb: - 74:87:e1:dd:8f:9c:05:47:08:7b:0d:86:b6:35:97:67:a5:ac: - 8c:d2:fc:dd:e0:0b:ab:8c:15:82:0c:c8:38:f1:37:83:86:b4: - 0e:24:e8:5b:df:5e:e4:6b:e3:43:dc:b2:d9:c7:52:ca:cb:bd: - a2:e0:3d:75:8a:03:4c:5d:a7:2f:7e:ba:64:2f:69:e7:df:a7: - 09:22:f8:b7:a0:59:94:fd:95:31:ee:d6:5f:5e:f9:84:3c:fe: - ba:75:f8:8f:59:80:0c:da:64:21:43:7b:44:4a:fd:ae:f4:43: - 7d:b9:4a:30:8c:21:c5:11:1c:0b:e9:3c:cd:3e:ea:49:5a:c5: - 10:ff:00:c1 + 74:9d:3a:da:91:b6:e0:2d:7d:89:b6:6d:16:7d:f0:28:ba:9f: + e5:52:a0:21:92:06:77:77:9a:9a:78:47:56:de:39:4d:64:43: + 1c:e7:06:02:fd:00:42:1d:2d:71:ef:6e:a3:4f:39:1a:e9:fc: + 8d:9c:94:32:60:a9:56:12:ee:69:7f:59:ef:30:5f:c4:d6:56: + 26:1a:9a:bb:c4:ec:01:09:0a:e3:14:ab:44:41:08:75:2a:6b: + 80:69:58:5d:2e:1a:2a:00:26:0c:b0:36:cd:fb:c1:87:7e:b8: + 58:ce:4d:32:57:e5:62:2e:64:e3:c9:52:67:21:28:40:16:88: + b2:37:19:e0:93:c8:4c:ca:f9:2b:1d:2c:d9:91:82:ac:b4:79: + d9:90:79:e5:95:76:03:a2:6b:d8:ef:24:66:1d:a3:3b:6f:c6: + 0c:95:f2:c3:59:37:f9:87:db:e6:a6:e5:f1:6f:70:92:60:e0: + 6d:cd:b8:14:69:95:26:56:2c:cc:0e:7e:d4:39:dd:6e:44:32: + eb:27:15:00:0f:fa:02:60:32:a5:6c:69:f0:cd:31:c6:b8:ff: + 1c:59:2f:0f:4d:28:9b:67:79:ea:4f:2c:a6:e0:f1:cf:19:3f: + 4f:44:2c:61:2e:08:48:cb:11:e2:82:8a:c0:88:53:ad:6b:ba: + 7e:d6:fa:61 -----BEGIN CERTIFICATE----- MIIEyTCCA7GgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRy1JQ0E3LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBojELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBojELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNV BAMMFWNoYWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 @@ -80,10 +80,10 @@ emVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgw FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s ZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBCjALBgNVHQ8EBAMCAQYwDQYJKoZI -hvcNAQELBQADggEBALgytrWKkAnH0hF9948UXWGAz+isZb/XCFE8YBYVnuDsepuH -DLytVmfeG6XUVFPac+gnjwJ3cxKGmSI6MndQSDgrwZ9GgSYQCu4koq5C3IEU07cQ -LxGqu3C6nIIpyCw+4GuO++Q5M/zvL9dwOgn104Wvs1kAtMYrxRprOqdLu3SH4d2P -nAVHCHsNhrY1l2elrIzS/N3gC6uMFYIMyDjxN4OGtA4k6FvfXuRr40PcstnHUsrL -vaLgPXWKA0xdpy9+umQvaeffpwki+LegWZT9lTHu1l9e+YQ8/rp1+I9ZgAzaZCFD -e0RK/a70Q325SjCMIcURHAvpPM0+6klaxRD/AME= +hvcNAQELBQADggEBAHSdOtqRtuAtfYm2bRZ98Ci6n+VSoCGSBnd3mpp4R1beOU1k +QxznBgL9AEIdLXHvbqNPORrp/I2clDJgqVYS7ml/We8wX8TWViYamrvE7AEJCuMU +q0RBCHUqa4BpWF0uGioAJgywNs37wYd+uFjOTTJX5WIuZOPJUmchKEAWiLI3GeCT +yEzK+SsdLNmRgqy0edmQeeWVdgOia9jvJGYdoztvxgyV8sNZN/mH2+am5fFvcJJg +4G3NuBRplSZWLMwOftQ53W5EMusnFQAP+gJgMqVsafDNMca4/xxZLw9NKJtneepP +LKbg8c8ZP09ELGEuCEjLEeKCisCIU61run7W+mE= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA7-pathlen100.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA7-pathlen100.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA7-pathlen100.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-ICA7-pathlen100.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:100 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 63:fb:c6:05:34:72:7a:ac:41:40:db:7d:45:03:24:24:fc:52: - 15:95:24:05:f9:26:89:ba:59:21:5e:6a:e6:86:86:28:85:f0: - cf:46:3f:90:a1:46:3a:3b:0f:bd:2f:91:b6:59:6f:f1:b6:25: - 12:85:7a:e0:eb:18:9e:21:a1:dd:4a:68:df:91:01:47:35:02: - 4e:8a:f7:4b:15:30:e2:d1:bf:94:6e:c2:7a:d1:78:b3:ff:6d: - 23:4f:83:bb:3c:f7:aa:1d:07:09:d9:9a:1d:96:77:e3:3d:4b: - 4f:de:d9:29:1a:9c:d7:a4:03:ac:55:6f:59:b6:6a:5d:4e:ae: - 02:42:15:4c:9e:7c:57:a5:a6:35:c6:6a:44:ea:59:36:87:68: - 1d:16:4c:63:96:c0:9f:7c:5d:fd:cd:bb:fe:5c:d6:08:86:9a: - 60:ae:60:b6:2d:b2:a1:f6:6e:0a:47:d6:e2:95:f5:ff:5d:0d: - 46:a4:b5:1d:bf:96:25:11:84:07:77:1f:29:8e:4f:22:8e:65: - 07:e0:e8:c2:47:e8:c6:3a:9d:ff:df:19:f3:9f:83:be:b4:91: - 8c:0b:84:e0:2a:9e:8b:7a:e0:cf:72:d5:3e:2a:5a:ff:24:eb: - 92:7b:ed:0c:42:5c:ca:cc:ee:aa:04:37:87:63:f2:22:95:e3: - ea:5b:00:b9 + 18:8c:dc:f0:e2:14:b8:33:68:ed:a7:5e:f9:12:72:93:58:a0: + 91:2a:d5:87:77:21:24:e9:b6:af:d3:af:55:8b:31:1c:a8:bb: + 3a:30:94:bb:aa:d4:5e:bb:17:d1:93:57:51:e6:32:f0:c7:e6: + 76:86:06:6d:c7:2a:35:c2:a3:2f:54:d6:bf:b1:25:7e:e4:0b: + 1a:dd:62:ce:34:d5:18:b4:4d:d0:76:52:d4:63:00:8b:90:72: + 4e:77:ff:c1:1b:bf:31:d1:6d:d2:75:69:5a:0c:a6:b2:42:e7: + 97:c9:a1:47:50:16:89:ee:20:ee:e7:c0:c8:06:7f:5e:55:0a: + 79:90:ed:2d:11:83:49:23:f0:89:08:cb:9c:84:6e:f5:6b:fe: + b2:2c:16:0e:74:d9:a8:35:9b:1d:1c:6a:ab:58:dd:32:09:d2: + 67:c2:eb:27:18:8e:70:31:58:c2:f1:20:06:98:ac:39:5a:c2: + 0b:43:60:a8:74:35:b1:32:bd:83:4b:df:db:18:46:e1:ac:7e: + 13:4a:09:6b:05:98:7a:98:e9:e0:1a:1d:a7:88:34:c6:4b:06: + 14:69:78:8d:29:83:c2:ee:52:af:00:a3:4d:d8:61:04:5a:0c: + e5:62:f4:c7:ac:8a:f3:7d:90:10:08:7c:15:d1:37:01:3c:bc: + 89:f8:60:24 -----BEGIN CERTIFICATE----- MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRy1JQ0E3 LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -78,12 +78,12 @@ IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7b -R50HZpI9aNfKrJBPymlBSzAPBgNVHRMECDAGAQH/AgFkMAsGA1UdDwQEAwIBBjAN -BgkqhkiG9w0BAQsFAAOCAQEAY/vGBTRyeqxBQNt9RQMkJPxSFZUkBfkmibpZIV5q -5oaGKIXwz0Y/kKFGOjsPvS+Rtllv8bYlEoV64OsYniGh3Upo35EBRzUCTor3SxUw -4tG/lG7CetF4s/9tI0+Duzz3qh0HCdmaHZZ34z1LT97ZKRqc16QDrFVvWbZqXU6u -AkIVTJ58V6WmNcZqROpZNodoHRZMY5bAn3xd/c27/lzWCIaaYK5gti2yofZuCkfW -4pX1/10NRqS1Hb+WJRGEB3cfKY5PIo5lB+Dowkfoxjqd/98Z85+DvrSRjAuE4Cqe -i3rgz3LVPipa/yTrknvtDEJcyszuqgQ3h2PyIpXj6lsAuQ== +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqo +bAHs9mDycFEKTNEU+rzpRDAPBgNVHRMECDAGAQH/AgFkMAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEAGIzc8OIUuDNo7ade+RJyk1igkSrVh3chJOm2r9Ov +VYsxHKi7OjCUu6rUXrsX0ZNXUeYy8MfmdoYGbccqNcKjL1TWv7ElfuQLGt1izjTV +GLRN0HZS1GMAi5ByTnf/wRu/MdFt0nVpWgymskLnl8mhR1AWie4g7ufAyAZ/XlUK +eZDtLRGDSSPwiQjLnIRu9Wv+siwWDnTZqDWbHRxqq1jdMgnSZ8LrJxiOcDFYwvEg +BpisOVrCC0NgqHQ1sTK9g0vf2xhG4ax+E0oJawWYepjp4Bodp4g0xksGFGl4jSmD +wu5SrwCjTdhhBFoM5WL0x6yK832QEAh8FdE3ATy8ifhgJA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - a9:28:b3:d9:91:da:b9:0b:35:94:8d:b0:53:7c:6c:0d:b7:ab: - 41:7b:72:42:48:5b:13:6f:15:4b:df:cd:69:48:01:f4:b7:6d: - 4d:c3:be:85:91:31:1b:f7:54:e8:3e:6c:b7:ad:29:16:9b:f7: - 99:f4:67:a6:cb:96:7e:5b:8a:32:41:20:89:88:8d:a0:f2:81: - 3a:50:14:66:06:9b:eb:c0:ee:bb:d1:0c:84:7c:e3:bb:b6:92: - 62:68:3b:b0:0d:c2:ed:f4:d1:7f:8f:15:8c:1a:fd:fe:9d:be: - 84:0d:47:53:ad:c6:d7:60:52:71:5d:65:0a:28:aa:22:03:73: - cf:1f:d6:e1:1a:5c:b7:54:83:93:c8:38:bc:3b:64:50:91:f5: - ff:65:fd:3e:4b:fc:8c:96:80:c0:51:1f:14:16:3a:35:f2:93: - 67:99:dd:e3:8d:10:52:25:a9:1b:9f:43:7a:9a:31:ae:f1:9e: - 49:cb:17:e8:8b:17:59:42:7d:15:82:d8:4b:a4:02:d9:ea:96: - 69:0e:01:de:8c:47:63:54:88:b1:df:31:fd:16:8c:53:22:81: - 62:e3:96:10:b2:21:af:4b:72:82:66:aa:d1:06:09:f4:bd:00: - b6:f1:7a:4a:48:82:61:f5:de:c3:04:17:3a:83:46:38:b7:ff: - db:26:0e:f9 + 27:b7:93:b7:fd:71:ab:7c:a5:a2:8e:e7:4c:77:67:4c:f2:28: + b7:82:bb:4a:85:95:bf:84:57:04:49:ac:be:02:cc:6b:fd:0f: + d8:66:c8:a0:eb:40:55:cf:a1:e3:d1:e0:fe:9a:40:b5:2e:ee: + b2:bf:48:fa:20:57:fd:c7:df:de:68:8f:82:5d:58:ec:25:0a: + a8:97:73:dc:e6:66:f5:49:64:9a:e9:b1:e2:86:4e:d1:04:59: + 0f:32:e1:c5:dd:d4:39:b0:ad:e9:cc:ad:87:ef:ab:8e:fe:74: + 4c:7e:b2:cb:41:3c:54:ed:b7:8d:4b:fd:97:6e:26:22:32:9e: + 94:26:aa:45:7d:65:c1:c8:10:67:63:09:09:42:04:04:9d:0c: + 53:bb:18:f6:ce:af:dc:e7:63:d4:c8:bb:b4:6a:86:52:45:6a: + 96:a1:54:3d:8c:25:7d:1a:b1:16:65:7a:8b:ec:01:fa:c4:73: + 98:49:3c:c3:18:2f:48:3e:45:10:45:c0:85:2c:16:88:65:2b: + 02:0b:0b:02:67:d2:2a:1d:bd:66:14:f5:8d:d1:8e:f8:eb:7a: + b5:db:4e:f7:ce:fa:6f:67:a0:a2:6b:37:85:7a:f7:34:8a:71: + 9a:e5:34:2a:fd:6a:4a:ec:3e:38:e3:30:89:f3:e6:c4:a9:a6: + a4:79:35:9b -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkctZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKkos9mR -2rkLNZSNsFN8bA23q0F7ckJIWxNvFUvfzWlIAfS3bU3DvoWRMRv3VOg+bLetKRab -95n0Z6bLln5bijJBIImIjaDygTpQFGYGm+vA7rvRDIR847u2kmJoO7ANwu300X+P -FYwa/f6dvoQNR1OtxtdgUnFdZQooqiIDc88f1uEaXLdUg5PIOLw7ZFCR9f9l/T5L -/IyWgMBRHxQWOjXyk2eZ3eONEFIlqRufQ3qaMa7xnknLF+iLF1lCfRWC2EukAtnq -lmkOAd6MR2NUiLHfMf0WjFMigWLjlhCyIa9LcoJmqtEGCfS9ALbxekpIgmH13sME -FzqDRji3/9smDvk= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACe3k7f9 +cat8paKO50x3Z0zyKLeCu0qFlb+EVwRJrL4CzGv9D9hmyKDrQFXPoePR4P6aQLUu +7rK/SPogV/3H395oj4JdWOwlCqiXc9zmZvVJZJrpseKGTtEEWQ8y4cXd1DmwrenM +rYfvq47+dEx+sstBPFTtt41L/ZduJiIynpQmqkV9ZcHIEGdjCQlCBASdDFO7GPbO +r9znY9TIu7RqhlJFapahVD2MJX0asRZleovsAfrEc5hJPMMYL0g+RRBFwIUsFohl +KwILCwJn0iodvWYU9Y3RjvjrerXbTvfO+m9noKJrN4V69zSKcZrlNCr9akrsPjjj +MInz5sSppqR5NZs= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - a8:e1:75:09:71:57:28:d6:27:3a:92:89:0c:47:57:05:3a:92: - 81:d3:23:00:92:fd:f3:77:24:60:67:af:86:ba:b2:17:1a:9f: - 5e:3a:ee:ba:a3:fa:1f:76:69:b9:18:4d:89:97:ac:54:5a:9f: - e2:ad:7a:37:d3:e1:35:fa:39:32:7f:d9:14:98:48:16:4d:99: - e6:d5:61:0e:31:df:d1:a7:cd:c1:fd:6b:72:59:80:f7:8c:77: - ef:45:c9:53:ed:b6:a4:73:06:1e:d3:d6:40:01:c8:c7:3c:48: - 71:38:ac:66:a8:f6:e2:5f:75:87:a8:93:28:db:ef:3f:e2:c6: - 2b:0d:ac:63:33:9c:1c:65:8d:9a:b2:3e:c8:2b:0d:3c:96:ef: - b3:e2:4d:b8:fe:6d:8b:59:66:02:3f:f9:a8:0b:08:a3:30:a7: - 9c:81:74:3d:88:cb:3f:f7:93:95:93:9f:38:53:ac:d9:a5:ae: - 43:46:30:17:25:b1:cb:bf:2d:fe:df:32:17:ec:b0:54:33:c7: - 1c:31:78:86:8c:fd:16:9e:0c:a4:71:3f:d0:a4:0e:26:90:39: - 68:34:bf:34:f7:73:fb:7b:64:14:3f:b4:41:95:c2:da:16:dc: - 20:a4:cc:3e:fa:64:dd:ce:d6:48:11:9d:ab:6b:a7:3e:c6:67: - 1d:ac:f6:0b + 6e:12:75:fb:ac:2b:b3:b5:f3:f8:0c:2b:61:c3:22:c0:1f:16: + cf:36:8c:b2:fc:be:83:ad:81:3d:e9:4e:76:e3:85:db:34:b4: + b1:a6:ed:fe:82:ee:b2:7c:64:14:e4:1f:d6:fb:16:3e:36:d7: + a1:f3:99:99:7c:48:96:50:d0:e4:29:43:42:93:7c:8e:24:fc: + ba:6b:89:1c:1b:c8:39:d2:62:5e:7f:ac:0c:e8:7d:f4:90:94: + a3:dc:5d:d4:25:60:07:6f:97:6c:a1:4f:5a:ec:84:70:46:de: + 4d:74:a8:5c:48:32:94:6d:69:81:65:c6:c4:ef:3e:31:fc:40: + f5:5c:10:29:23:49:a7:ca:27:27:33:ed:3f:65:1a:95:f0:57: + 5a:32:19:b4:4d:66:c5:19:15:4b:a9:79:c9:fb:cd:02:57:04: + c2:33:6d:6c:85:67:14:16:7a:d2:32:a0:66:c4:b9:0d:43:bd: + 57:52:27:da:af:f1:df:68:27:74:b9:dd:d3:3c:ba:79:d0:46: + 2c:91:fc:1c:65:a4:3a:ea:82:25:c9:b1:2f:7d:78:85:62:1f: + a4:4c:69:fc:a3:95:c3:0a:ce:ed:10:24:ec:f7:17:bf:22:42: + 44:ac:0d:77:a1:3d:9d:d0:fb:03:1b:b7:79:8a:ba:6e:3c:a4: + 3e:1c:0a:54 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkctSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHjAcBgNVBAMMFWNoYWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEAMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAqOF1CXFXKNYnOpKJDEdXBTqSgdMjAJL9 -83ckYGevhrqyFxqfXjruuqP6H3ZpuRhNiZesVFqf4q16N9PhNfo5Mn/ZFJhIFk2Z -5tVhDjHf0afNwf1rclmA94x370XJU+22pHMGHtPWQAHIxzxIcTisZqj24l91h6iT -KNvvP+LGKw2sYzOcHGWNmrI+yCsNPJbvs+JNuP5ti1lmAj/5qAsIozCnnIF0PYjL -P/eTlZOfOFOs2aWuQ0YwFyWxy78t/t8yF+ywVDPHHDF4hoz9Fp4MpHE/0KQOJpA5 -aDS/NPdz+3tkFD+0QZXC2hbcIKTMPvpk3c7WSBGdq2unPsZnHaz2Cw== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAbhJ1+6wrs7Xz+AwrYcMiwB8WzzaMsvy+ +g62BPelOduOF2zS0sabt/oLusnxkFOQf1vsWPjbXofOZmXxIllDQ5ClDQpN8jiT8 +umuJHBvIOdJiXn+sDOh99JCUo9xd1CVgB2+XbKFPWuyEcEbeTXSoXEgylG1pgWXG +xO8+MfxA9VwQKSNJp8onJzPtP2UalfBXWjIZtE1mxRkVS6l5yfvNAlcEwjNtbIVn +FBZ60jKgZsS5DUO9V1In2q/x32gndLnd0zy6edBGLJH8HGWkOuqCJcmxL314hWIf +pExp/KOVwwrO7RAk7PcXvyJCRKwNd6E9ndD7Axu3eYq6bjykPhwKVA== -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA2-pathlen1, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 56:b8:f2:49:b8:e6:65:25:db:46:5f:f4:72:40:14:a5:27:39: - 27:28:9b:f9:cc:5a:02:7f:76:05:e7:18:45:1f:29:c6:cb:ce: - 77:50:35:74:0c:95:ed:3a:7e:a0:87:8a:7d:8f:6f:2f:3c:5d: - 03:86:da:c2:2c:b3:2f:6d:7b:af:a4:83:c7:f3:6e:5b:48:c3: - d9:4a:e5:af:e1:86:e1:81:68:45:2e:fb:09:19:94:be:91:dd: - 8f:f4:e7:94:fb:9e:54:4c:a7:c9:10:87:8d:f0:08:14:08:c9: - d7:92:44:56:59:03:10:27:2c:fb:7e:24:01:8b:9f:cc:e0:6a: - 31:5c:67:e3:96:88:f8:86:3f:ec:1e:bd:07:d2:fc:34:1d:ff: - 8d:72:c1:2d:de:09:7f:e4:c4:dd:98:70:73:ed:84:a6:4f:f8: - ec:a5:18:b6:0c:55:e2:a4:aa:0c:37:60:52:3d:76:f5:dd:ab: - 0a:7c:fd:4d:81:a6:a9:c6:49:14:e7:51:00:f4:6a:d9:dc:15: - ef:72:d1:79:c3:65:e2:e1:f5:23:c4:90:ba:4a:e2:01:d9:09: - 83:e5:34:0f:c3:ea:03:cf:62:b9:bb:18:26:30:54:77:b1:a6: - 63:99:35:0a:40:2b:df:2a:2c:3a:e0:0c:2c:f6:1b:6a:de:e2: - 02:31:9d:c0 + 50:65:9b:1d:8b:6a:ae:9b:d4:f1:ff:57:ac:51:48:fd:c8:9e: + 19:bb:b2:00:bf:54:ee:c8:d4:2f:eb:5b:ff:17:1e:7c:aa:1d: + d4:01:9f:e8:cb:c4:8c:e5:ee:99:04:33:e8:16:3a:fc:44:bd: + 56:a5:45:e7:e9:fb:88:25:11:4b:07:73:5d:37:21:47:47:9d: + f8:e0:89:e0:e4:c0:6a:f4:64:25:e7:b7:d9:47:53:ff:d5:6f: + f3:e4:8d:b2:33:f6:ce:46:5b:80:82:8f:05:18:f4:bc:90:5a: + af:4a:7f:9d:67:08:f7:41:27:05:c5:34:46:03:fc:14:2e:4e: + 81:f3:ca:3d:67:9e:a9:53:ec:5b:df:38:d4:b5:92:3d:55:94: + df:88:be:a1:e7:14:18:a2:9d:22:5d:10:69:f8:54:c3:a9:14: + ef:8e:af:e1:8a:f8:cd:6d:7e:26:30:2c:40:bc:50:49:e5:9f: + bc:8f:de:30:23:93:c4:25:b3:e6:fb:b5:64:82:57:41:ac:79: + 1e:58:9e:6c:67:dc:18:ed:c4:60:79:06:b1:ee:9f:4c:2c:a3: + 9c:61:d7:77:33:b5:64:50:65:88:33:a0:30:57:99:0f:a9:aa: + a7:b3:a8:0d:b1:c5:ce:5a:34:a8:31:47:e4:66:62:b2:11:0e: + b9:58:4f:06 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0EzLXBhdGhsZW45OTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMzEyMTMyMjE5MzJaFw0yNjA5MDgyMjE5MzJaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTItcGF0aGxlbjExHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -256,12 +256,12 @@ ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR0wGwYDVQQDDBRjaGFpbkctSUNBNC1wYXRobGVuNTEfMB0GCSqGSIb3DQEJ ARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEBMAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVrjySbjmZSXbRl/0ckAUpSc5Jyib+cxa -An92BecYRR8pxsvOd1A1dAyV7Tp+oIeKfY9vLzxdA4bawiyzL217r6SDx/NuW0jD -2Urlr+GG4YFoRS77CRmUvpHdj/TnlPueVEynyRCHjfAIFAjJ15JEVlkDECcs+34k -AYufzOBqMVxn45aI+IY/7B69B9L8NB3/jXLBLd4Jf+TE3Zhwc+2Epk/47KUYtgxV -4qSqDDdgUj129d2rCnz9TYGmqcZJFOdRAPRq2dwV73LRecNl4uH1I8SQukriAdkJ -g+U0D8PqA89iubsYJjBUd7GmY5k1CkAr3yosOuAMLPYbat7iAjGdwA== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAUGWbHYtqrpvU8f9XrFFI/cieGbuyAL9U +7sjUL+tb/xcefKod1AGf6MvEjOXumQQz6BY6/ES9VqVF5+n7iCURSwdzXTchR0ed ++OCJ4OTAavRkJee32UdT/9Vv8+SNsjP2zkZbgIKPBRj0vJBar0p/nWcI90EnBcU0 +RgP8FC5OgfPKPWeeqVPsW9841LWSPVWU34i+oecUGKKdIl0QafhUw6kU746v4Yr4 +zW1+JjAsQLxQSeWfvI/eMCOTxCWz5vu1ZIJXQax5HliebGfcGO3EYHkGse6fTCyj +nGHXdzO1ZFBliDOgMFeZD6mqp7OoDbHFzlo0qDFH5GZishEOuVhPBg== -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA3-pathlen99, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -309,27 +309,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 7b:72:02:a6:a9:ab:c5:08:f6:39:85:63:df:3a:b6:25:6f:94: - 72:97:c9:64:e5:a8:c8:e9:e1:09:cd:ae:d2:95:7c:de:fb:8d: - 64:b4:51:a4:86:af:a9:5d:50:37:e8:41:87:3a:8e:0c:77:6b: - 35:0f:db:78:0e:92:bf:f9:ca:82:d5:d0:e9:27:71:6b:ac:02: - 34:86:e2:c2:0b:b2:42:06:91:d3:f6:02:55:23:71:33:57:a9: - 58:db:0d:1d:fe:d3:9b:ca:c4:c9:b8:6e:6f:32:cb:12:b8:9f: - 6d:44:2b:fd:22:cf:8f:c0:53:f9:5a:b5:3a:e9:48:37:f3:0d: - d8:77:5b:cb:1d:97:5b:a9:3b:b3:b9:b5:5e:c2:c0:d6:8d:66: - f0:19:e9:4a:ca:e3:f0:93:f3:82:93:e7:7d:7f:21:51:4e:ef: - ce:82:d7:52:91:dd:5f:74:ff:84:fe:0a:d9:c3:3d:9a:62:da: - f4:c9:5b:fc:f8:60:db:d3:69:08:7c:09:fd:04:10:7b:48:b8: - 9b:ed:eb:58:f1:1f:aa:87:a9:bf:60:f8:7a:df:96:b3:77:4b: - 4d:db:b6:6f:34:b3:8d:4d:e3:a4:cd:01:b4:15:0f:8c:12:06: - 96:e7:36:46:ac:7f:1f:ca:af:e4:2d:f8:90:ab:ce:6f:b1:b4: - 9e:2f:5a:2a + 0b:ad:52:52:31:8c:12:70:07:6c:05:83:b3:84:cf:c2:64:da: + 43:d2:cc:6c:db:ef:a5:ae:9b:44:96:4e:fe:fd:b9:61:56:59: + e2:f2:52:c8:1b:52:2c:36:79:5d:6a:83:a1:c8:03:9a:7a:80: + 4f:ee:9d:48:87:f4:cb:9b:5e:84:c8:f8:b8:0c:77:e1:cb:40: + ac:28:eb:58:07:e4:06:a7:50:e2:44:48:bc:a3:2f:5d:f1:fa: + 0c:4d:1d:84:0a:57:e5:0c:b9:bb:41:b9:12:17:09:25:9f:99: + 02:6b:9e:83:fb:07:f8:3f:59:b2:04:62:b7:12:e7:61:8b:48: + a7:cc:29:ce:11:f9:7c:64:dd:5c:51:d3:ac:0c:54:4b:22:7e: + 29:de:98:50:80:f8:1a:65:64:3c:fb:a6:07:bb:e8:b1:a4:e8: + f1:7b:07:fd:e2:50:07:67:f5:7a:fa:76:4d:1c:7f:1a:e3:52: + ad:13:a6:b5:89:9e:f5:11:68:12:13:dc:59:86:9d:f9:83:18: + 52:ee:09:24:6a:37:e9:85:95:ac:93:09:23:09:0e:f3:66:a8: + 85:ee:d1:e4:40:01:f3:c2:c3:1f:48:74:76:2b:7e:4c:9b:a9: + a2:2f:c8:7c:74:60:2d:98:e8:63:09:cf:8f:a8:c8:8a:7f:c4: + d4:f3:34:ad -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0E0LXBhdGhsZW41MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaIxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaIxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR4wHAYDVQQD DBVjaGFpbkctSUNBMy1wYXRobGVuOTkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -345,12 +345,12 @@ ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNS1wYXRobGVuMjAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBYzALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHtyAqapq8UI9jmFY986tiVvlHKXyWTl -qMjp4QnNrtKVfN77jWS0UaSGr6ldUDfoQYc6jgx3azUP23gOkr/5yoLV0OkncWus -AjSG4sILskIGkdP2AlUjcTNXqVjbDR3+05vKxMm4bm8yyxK4n21EK/0iz4/AU/la -tTrpSDfzDdh3W8sdl1upO7O5tV7CwNaNZvAZ6UrK4/CT84KT531/IVFO786C11KR -3V90/4T+CtnDPZpi2vTJW/z4YNvTaQh8Cf0EEHtIuJvt61jxH6qHqb9g+HrflrN3 -S03btm80s41N46TNAbQVD4wSBpbnNkasfx/Kr+Qt+JCrzm+xtJ4vWio= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAAutUlIxjBJwB2wFg7OEz8Jk2kPSzGzb +76Wum0SWTv79uWFWWeLyUsgbUiw2eV1qg6HIA5p6gE/unUiH9MubXoTI+LgMd+HL +QKwo61gH5AanUOJESLyjL13x+gxNHYQKV+UMubtBuRIXCSWfmQJrnoP7B/g/WbIE +YrcS52GLSKfMKc4R+Xxk3VxR06wMVEsifinemFCA+BplZDz7pge76LGk6PF7B/3i +UAdn9Xr6dk0cfxrjUq0TprWJnvURaBIT3FmGnfmDGFLuCSRqN+mFlayTCSMJDvNm +qIXu0eRAAfPCwx9IdHYrfkybqaIvyHx0YC2Y6GMJz4+oyIp/xNTzNK0= -----END CERTIFICATE----- Certificate: Data: @@ -359,8 +359,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA4-pathlen5, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -398,27 +398,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 04:f9:2d:12:27:73:f5:79:fd:73:35:ec:7c:dd:fb:fc:66:07: - b6:ce:a6:2a:25:c2:12:6f:c7:9f:15:fa:b4:1f:3c:b9:c3:ea: - 9c:ee:85:02:d9:f3:66:19:10:e5:7f:57:76:e7:07:77:86:34: - 44:84:e8:89:a5:98:b8:b6:21:8f:f0:60:95:96:38:ce:be:ab: - ee:a6:1d:47:dc:bf:37:c2:ca:d5:54:0c:8b:6f:11:e5:52:b6: - 52:36:95:d1:ef:e0:18:7f:b2:00:8d:b4:dd:94:69:41:fc:7d: - d4:43:55:bd:e8:e3:5f:1a:71:9a:1a:fa:4a:d3:d7:bd:ce:ac: - e6:83:6b:47:31:60:90:96:d8:4c:34:0e:ba:25:d7:f2:40:3a: - 37:bb:27:4c:de:40:9a:20:a5:0e:23:9b:ef:90:7f:1c:23:fd: - 62:c7:f5:c1:35:de:73:f4:09:e6:e6:a2:15:64:53:93:95:38: - 06:2b:64:59:7d:56:8c:88:3c:6f:f5:b7:8f:21:9c:a8:a7:46: - da:66:5e:5c:e5:6a:4b:81:69:97:e3:5c:ed:7c:01:90:5e:bd: - 06:47:e7:48:db:e8:13:18:f9:2e:6b:a0:26:61:d7:49:83:b7: - 9d:b9:98:b7:c0:40:c7:0d:e8:5e:2a:f7:67:85:36:24:0e:68: - 8d:ca:8e:78 + a6:f3:32:99:ee:fd:de:b1:46:ad:68:a7:6f:d8:55:91:63:2d: + 07:ce:91:2f:e3:ff:8f:03:e3:cf:c2:33:76:91:33:5f:13:70: + 10:e4:e2:3b:70:02:fc:d2:7d:39:d2:1a:1e:82:2d:40:d8:a7: + bb:69:19:51:fb:c1:32:41:e5:cf:4f:39:f6:f8:dd:b4:cb:f2: + 11:3e:dc:8d:c7:a6:90:27:14:4b:28:6f:20:9a:58:92:3a:42: + 8c:c7:40:36:b5:c0:4a:7e:27:0b:37:a7:71:e4:fd:f4:8d:24: + 8d:fe:3d:4a:59:4e:7e:86:02:f2:e2:09:95:59:ca:19:b9:23: + 84:1e:c6:14:d9:c4:05:7a:93:77:b4:4a:f4:91:75:3f:89:43: + 8b:b1:5f:a5:36:0a:2a:b0:a1:7b:8f:33:01:92:4d:c1:d9:51: + 98:a3:1b:14:f9:34:8e:7c:db:a5:5c:2c:b2:cd:23:b6:f6:65: + 25:aa:2c:5c:cc:38:49:b2:77:aa:8f:73:3b:00:1f:33:94:43: + fd:c2:34:ba:ee:ac:7d:0d:62:58:72:4d:ea:78:29:b5:b1:29: + 99:70:8c:00:22:1c:a3:93:ca:cd:c8:02:21:57:2d:19:fd:a7: + fb:c7:1c:12:0c:49:04:73:4c:7e:dd:9f:9e:1c:5b:e4:2a:53: + b6:cf:7e:c4 -----BEGIN CERTIFICATE----- MIIE1TCCA72gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E1LXBhdGhsZW4yMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGhMQswCQYDVQQG +LmNvbTAeFw0yMzEyMTMyMjE5MzJaFw0yNjA5MDgyMjE5MzJaMIGhMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEdMBsGA1UE AwwUY2hhaW5HLUlDQTQtcGF0aGxlbjUxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s @@ -434,12 +434,12 @@ ZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVy aW5nMR4wHAYDVQQDDBVjaGFpbkctSUNBNi1wYXRobGVuMTAxHzAdBgkqhkiG9w0B CQEWEGluZm9Ad29sZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBBTALBgNVHQ8E -BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAAT5LRInc/V5/XM17Hzd+/xmB7bOpiol -whJvx58V+rQfPLnD6pzuhQLZ82YZEOV/V3bnB3eGNESE6ImlmLi2IY/wYJWWOM6+ -q+6mHUfcvzfCytVUDItvEeVStlI2ldHv4Bh/sgCNtN2UaUH8fdRDVb3o418acZoa -+krT173OrOaDa0cxYJCW2Ew0Drol1/JAOje7J0zeQJogpQ4jm++Qfxwj/WLH9cE1 -3nP0CebmohVkU5OVOAYrZFl9VoyIPG/1t48hnKinRtpmXlzlakuBaZfjXO18AZBe -vQZH50jb6BMY+S5roCZh10mDt525mLfAQMcN6F4q92eFNiQOaI3Kjng= +BAMCAQYwDQYJKoZIhvcNAQELBQADggEBAKbzMpnu/d6xRq1op2/YVZFjLQfOkS/j +/48D48/CM3aRM18TcBDk4jtwAvzSfTnSGh6CLUDYp7tpGVH7wTJB5c9POfb43bTL +8hE+3I3HppAnFEsobyCaWJI6QozHQDa1wEp+Jws3p3Hk/fSNJI3+PUpZTn6GAvLi +CZVZyhm5I4QexhTZxAV6k3e0SvSRdT+JQ4uxX6U2CiqwoXuPMwGSTcHZUZijGxT5 +NI5826VcLLLNI7b2ZSWqLFzMOEmyd6qPczsAHzOUQ/3CNLrurH0NYlhyTep4KbWx +KZlwjAAiHKOTys3IAiFXLRn9p/vHHBIMSQRzTH7dn54cW+QqU7bPfsQ= -----END CERTIFICATE----- Certificate: Data: @@ -448,8 +448,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA5-pathlen20, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -487,27 +487,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0f:b1:e3:0e:db:7f:2c:93:25:66:ef:c4:84:a6:65:86:54:58: - ff:59:ba:07:80:0f:56:cd:ae:15:39:64:8c:3d:05:c2:dc:3d: - e2:9e:e8:b9:ec:55:15:c8:4f:0c:e0:41:65:8a:86:ff:f4:7f: - a4:e0:aa:ea:a6:54:0c:3d:a2:82:d9:5c:c1:82:aa:d8:48:32: - 84:ca:96:a5:21:b5:36:de:97:50:3b:9e:00:78:2a:af:30:09: - f4:b7:6b:56:d7:38:a0:1c:b1:8b:d7:db:71:eb:46:b2:e2:c7: - 42:d2:02:6d:03:dc:9d:83:ba:aa:be:23:62:73:98:16:74:3b: - 8a:89:00:e8:b0:04:21:31:4c:0f:df:ef:3b:1e:fd:28:c5:07: - 6b:b3:87:d1:78:4a:4b:97:8f:5b:09:39:b4:09:d5:62:c0:72: - 31:0b:fa:7d:81:5f:dd:2f:3a:e1:61:d2:c0:b4:54:eb:01:e4: - 94:90:30:8d:fa:8f:94:04:b2:9f:ca:3a:b1:c1:b9:72:24:f1: - 0c:f9:09:1e:a0:5b:d9:28:a6:d4:ee:aa:bf:37:ea:ee:4d:85: - 8a:f8:b0:6c:98:7e:a4:17:0d:01:03:46:7d:82:80:2a:48:17: - a9:d6:4b:57:38:f1:53:54:54:00:5a:83:d6:96:b6:fe:c6:dc: - 65:40:60:c9 + d9:f9:09:10:86:29:c0:72:a4:93:87:4d:d3:79:ce:fa:f3:8a: + 79:9a:d0:eb:6d:42:06:00:fc:2c:c3:fa:35:c5:b6:6d:a4:7f: + 66:29:d2:ad:ed:50:a5:a8:1e:1b:24:db:f3:52:bf:54:b8:3f: + 67:c2:be:f4:a4:fc:d2:77:74:a4:02:74:0d:fe:c5:e0:42:bd: + 2b:7c:16:ae:a1:68:6f:e5:80:29:07:f3:5e:e4:0e:96:d2:ee: + cd:d2:82:00:22:a7:72:d7:c5:38:71:a0:ac:2a:38:03:c4:c1: + 23:62:1e:fa:b3:24:32:0f:01:a4:64:a8:ab:79:60:55:77:da: + ca:76:00:14:2f:e0:e1:74:f9:72:e2:7d:aa:3d:6b:9f:50:ab: + 72:31:40:4b:19:9d:b9:9a:12:de:db:15:c3:36:90:9d:48:6f: + 7a:98:47:7a:65:a2:d5:5b:0c:f3:90:5d:dd:4e:1c:ba:72:b4: + ac:be:ca:1b:87:16:7f:f2:b0:33:9b:7a:26:37:eb:1f:cb:4d: + bf:c7:f1:01:80:b7:60:c4:ae:71:bb:ab:cc:bd:8a:ba:c4:23: + 87:15:1e:b9:c7:6d:2d:44:fd:67:25:45:e2:cd:76:4d:87:a1: + 80:e0:a2:e6:60:23:51:4d:17:b0:82:51:ef:0c:88:75:64:c1: + 7b:8e:c2:29 -----BEGIN CERTIFICATE----- MIIE1zCCA7+gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBojELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNVBAMMFWNo YWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3Ns -LmNvbTAeFw0yMjEyMTYyMTE3NTBaFw0yNTA5MTEyMTE3NTBaMIGiMQswCQYDVQQG +LmNvbTAeFw0yMzEyMTMyMjE5MzJaFw0yNjA5MDgyMjE5MzJaMIGiMQswCQYDVQQG EwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEVMBMG A1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEeMBwGA1UE AwwVY2hhaW5HLUlDQTUtcGF0aGxlbjIwMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -523,12 +523,12 @@ U2VhdHRsZTEVMBMGA1UECgwMd29sZlNTTCBJbmMuMRQwEgYDVQQLDAtFbmdpbmVl cmluZzEfMB0GA1UEAwwWY2hhaW5HLUlDQTctcGF0aGxlbjEwMDEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAPBgNVHRMECDAGAQH/AgEUMAsGA1Ud -DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAD7HjDtt/LJMlZu/EhKZlhlRY/1m6 -B4APVs2uFTlkjD0Fwtw94p7ouexVFchPDOBBZYqG//R/pOCq6qZUDD2igtlcwYKq -2EgyhMqWpSG1Nt6XUDueAHgqrzAJ9LdrVtc4oByxi9fbcetGsuLHQtICbQPcnYO6 -qr4jYnOYFnQ7iokA6LAEITFMD9/vOx79KMUHa7OH0XhKS5ePWwk5tAnVYsByMQv6 -fYFf3S864WHSwLRU6wHklJAwjfqPlASyn8o6scG5ciTxDPkJHqBb2Sim1O6qvzfq -7k2FiviwbJh+pBcNAQNGfYKAKkgXqdZLVzjxU1RUAFqD1pa2/sbcZUBgyQ== +DwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEA2fkJEIYpwHKkk4dN03nO+vOKeZrQ +621CBgD8LMP6NcW2baR/ZinSre1QpageGyTb81K/VLg/Z8K+9KT80nd0pAJ0Df7F +4EK9K3wWrqFob+WAKQfzXuQOltLuzdKCACKnctfFOHGgrCo4A8TBI2Ie+rMkMg8B +pGSoq3lgVXfaynYAFC/g4XT5cuJ9qj1rn1CrcjFASxmduZoS3tsVwzaQnUhvephH +emWi1VsM85Bd3U4cunK0rL7KG4cWf/KwM5t6JjfrH8tNv8fxAYC3YMSucburzL2K +usQjhxUeucdtLUT9ZyVF4s12TYehgOCi5mAjUU0XsIJR7wyIdWTBe47CKQ== -----END CERTIFICATE----- Certificate: Data: @@ -537,8 +537,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA6-pathlen10, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -576,27 +576,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - b8:32:b6:b5:8a:90:09:c7:d2:11:7d:f7:8f:14:5d:61:80:cf: - e8:ac:65:bf:d7:08:51:3c:60:16:15:9e:e0:ec:7a:9b:87:0c: - bc:ad:56:67:de:1b:a5:d4:54:53:da:73:e8:27:8f:02:77:73: - 12:86:99:22:3a:32:77:50:48:38:2b:c1:9f:46:81:26:10:0a: - ee:24:a2:ae:42:dc:81:14:d3:b7:10:2f:11:aa:bb:70:ba:9c: - 82:29:c8:2c:3e:e0:6b:8e:fb:e4:39:33:fc:ef:2f:d7:70:3a: - 09:f5:d3:85:af:b3:59:00:b4:c6:2b:c5:1a:6b:3a:a7:4b:bb: - 74:87:e1:dd:8f:9c:05:47:08:7b:0d:86:b6:35:97:67:a5:ac: - 8c:d2:fc:dd:e0:0b:ab:8c:15:82:0c:c8:38:f1:37:83:86:b4: - 0e:24:e8:5b:df:5e:e4:6b:e3:43:dc:b2:d9:c7:52:ca:cb:bd: - a2:e0:3d:75:8a:03:4c:5d:a7:2f:7e:ba:64:2f:69:e7:df:a7: - 09:22:f8:b7:a0:59:94:fd:95:31:ee:d6:5f:5e:f9:84:3c:fe: - ba:75:f8:8f:59:80:0c:da:64:21:43:7b:44:4a:fd:ae:f4:43: - 7d:b9:4a:30:8c:21:c5:11:1c:0b:e9:3c:cd:3e:ea:49:5a:c5: - 10:ff:00:c1 + 74:9d:3a:da:91:b6:e0:2d:7d:89:b6:6d:16:7d:f0:28:ba:9f: + e5:52:a0:21:92:06:77:77:9a:9a:78:47:56:de:39:4d:64:43: + 1c:e7:06:02:fd:00:42:1d:2d:71:ef:6e:a3:4f:39:1a:e9:fc: + 8d:9c:94:32:60:a9:56:12:ee:69:7f:59:ef:30:5f:c4:d6:56: + 26:1a:9a:bb:c4:ec:01:09:0a:e3:14:ab:44:41:08:75:2a:6b: + 80:69:58:5d:2e:1a:2a:00:26:0c:b0:36:cd:fb:c1:87:7e:b8: + 58:ce:4d:32:57:e5:62:2e:64:e3:c9:52:67:21:28:40:16:88: + b2:37:19:e0:93:c8:4c:ca:f9:2b:1d:2c:d9:91:82:ac:b4:79: + d9:90:79:e5:95:76:03:a2:6b:d8:ef:24:66:1d:a3:3b:6f:c6: + 0c:95:f2:c3:59:37:f9:87:db:e6:a6:e5:f1:6f:70:92:60:e0: + 6d:cd:b8:14:69:95:26:56:2c:cc:0e:7e:d4:39:dd:6e:44:32: + eb:27:15:00:0f:fa:02:60:32:a5:6c:69:f0:cd:31:c6:b8:ff: + 1c:59:2f:0f:4d:28:9b:67:79:ea:4f:2c:a6:e0:f1:cf:19:3f: + 4f:44:2c:61:2e:08:48:cb:11:e2:82:8a:c0:88:53:ad:6b:ba: + 7e:d6:fa:61 -----BEGIN CERTIFICATE----- MIIEyTCCA7GgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluRy1JQ0E3LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBojELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBojELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHjAcBgNV BAMMFWNoYWluRy1JQ0E2LXBhdGhsZW4xMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 @@ -612,12 +612,12 @@ emVtYW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgw FgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29s ZnNzbC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBCjALBgNVHQ8EBAMCAQYwDQYJKoZI -hvcNAQELBQADggEBALgytrWKkAnH0hF9948UXWGAz+isZb/XCFE8YBYVnuDsepuH -DLytVmfeG6XUVFPac+gnjwJ3cxKGmSI6MndQSDgrwZ9GgSYQCu4koq5C3IEU07cQ -LxGqu3C6nIIpyCw+4GuO++Q5M/zvL9dwOgn104Wvs1kAtMYrxRprOqdLu3SH4d2P -nAVHCHsNhrY1l2elrIzS/N3gC6uMFYIMyDjxN4OGtA4k6FvfXuRr40PcstnHUsrL -vaLgPXWKA0xdpy9+umQvaeffpwki+LegWZT9lTHu1l9e+YQ8/rp1+I9ZgAzaZCFD -e0RK/a70Q325SjCMIcURHAvpPM0+6klaxRD/AME= +hvcNAQELBQADggEBAHSdOtqRtuAtfYm2bRZ98Ci6n+VSoCGSBnd3mpp4R1beOU1k +QxznBgL9AEIdLXHvbqNPORrp/I2clDJgqVYS7ml/We8wX8TWViYamrvE7AEJCuMU +q0RBCHUqa4BpWF0uGioAJgywNs37wYd+uFjOTTJX5WIuZOPJUmchKEAWiLI3GeCT +yEzK+SsdLNmRgqy0edmQeeWVdgOia9jvJGYdoztvxgyV8sNZN/mH2+am5fFvcJJg +4G3NuBRplSZWLMwOftQ53W5EMusnFQAP+gJgMqVsafDNMca4/xxZLw9NKJtneepP +LKbg8c8ZP09ELGEuCEjLEeKCisCIU61run7W+mE= -----END CERTIFICATE----- Certificate: Data: @@ -626,8 +626,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA7-pathlen100, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -658,34 +658,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:100 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 63:fb:c6:05:34:72:7a:ac:41:40:db:7d:45:03:24:24:fc:52: - 15:95:24:05:f9:26:89:ba:59:21:5e:6a:e6:86:86:28:85:f0: - cf:46:3f:90:a1:46:3a:3b:0f:bd:2f:91:b6:59:6f:f1:b6:25: - 12:85:7a:e0:eb:18:9e:21:a1:dd:4a:68:df:91:01:47:35:02: - 4e:8a:f7:4b:15:30:e2:d1:bf:94:6e:c2:7a:d1:78:b3:ff:6d: - 23:4f:83:bb:3c:f7:aa:1d:07:09:d9:9a:1d:96:77:e3:3d:4b: - 4f:de:d9:29:1a:9c:d7:a4:03:ac:55:6f:59:b6:6a:5d:4e:ae: - 02:42:15:4c:9e:7c:57:a5:a6:35:c6:6a:44:ea:59:36:87:68: - 1d:16:4c:63:96:c0:9f:7c:5d:fd:cd:bb:fe:5c:d6:08:86:9a: - 60:ae:60:b6:2d:b2:a1:f6:6e:0a:47:d6:e2:95:f5:ff:5d:0d: - 46:a4:b5:1d:bf:96:25:11:84:07:77:1f:29:8e:4f:22:8e:65: - 07:e0:e8:c2:47:e8:c6:3a:9d:ff:df:19:f3:9f:83:be:b4:91: - 8c:0b:84:e0:2a:9e:8b:7a:e0:cf:72:d5:3e:2a:5a:ff:24:eb: - 92:7b:ed:0c:42:5c:ca:cc:ee:aa:04:37:87:63:f2:22:95:e3: - ea:5b:00:b9 + 18:8c:dc:f0:e2:14:b8:33:68:ed:a7:5e:f9:12:72:93:58:a0: + 91:2a:d5:87:77:21:24:e9:b6:af:d3:af:55:8b:31:1c:a8:bb: + 3a:30:94:bb:aa:d4:5e:bb:17:d1:93:57:51:e6:32:f0:c7:e6: + 76:86:06:6d:c7:2a:35:c2:a3:2f:54:d6:bf:b1:25:7e:e4:0b: + 1a:dd:62:ce:34:d5:18:b4:4d:d0:76:52:d4:63:00:8b:90:72: + 4e:77:ff:c1:1b:bf:31:d1:6d:d2:75:69:5a:0c:a6:b2:42:e7: + 97:c9:a1:47:50:16:89:ee:20:ee:e7:c0:c8:06:7f:5e:55:0a: + 79:90:ed:2d:11:83:49:23:f0:89:08:cb:9c:84:6e:f5:6b:fe: + b2:2c:16:0e:74:d9:a8:35:9b:1d:1c:6a:ab:58:dd:32:09:d2: + 67:c2:eb:27:18:8e:70:31:58:c2:f1:20:06:98:ac:39:5a:c2: + 0b:43:60:a8:74:35:b1:32:bd:83:4b:df:db:18:46:e1:ac:7e: + 13:4a:09:6b:05:98:7a:98:e9:e0:1a:1d:a7:88:34:c6:4b:06: + 14:69:78:8d:29:83:c2:ee:52:af:00:a3:4d:d8:61:04:5a:0c: + e5:62:f4:c7:ac:8a:f3:7d:90:10:08:7c:15:d1:37:01:3c:bc: + 89:f8:60:24 -----BEGIN CERTIFICATE----- MIIEzjCCA7agAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBozELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNoYWluRy1JQ0E3 LXBhdGhsZW4xMDAxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wggEi @@ -699,12 +699,12 @@ IwSBzDCByYAUJ45nEXTDJh0/7TNjs6TYHTDl6NWhgZqkgZcwgZQxCzAJBgNVBAYT AlVTMRAwDgYDVQQIDAdNb250YW5hMRAwDgYDVQQHDAdCb3plbWFuMREwDwYDVQQK DAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYGA1UEAwwPd3d3Lndv -bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQsgM7b -R50HZpI9aNfKrJBPymlBSzAPBgNVHRMECDAGAQH/AgFkMAsGA1UdDwQEAwIBBjAN -BgkqhkiG9w0BAQsFAAOCAQEAY/vGBTRyeqxBQNt9RQMkJPxSFZUkBfkmibpZIV5q -5oaGKIXwz0Y/kKFGOjsPvS+Rtllv8bYlEoV64OsYniGh3Upo35EBRzUCTor3SxUw -4tG/lG7CetF4s/9tI0+Duzz3qh0HCdmaHZZ34z1LT97ZKRqc16QDrFVvWbZqXU6u -AkIVTJ58V6WmNcZqROpZNodoHRZMY5bAn3xd/c27/lzWCIaaYK5gti2yofZuCkfW -4pX1/10NRqS1Hb+WJRGEB3cfKY5PIo5lB+Dowkfoxjqd/98Z85+DvrSRjAuE4Cqe -i3rgz3LVPipa/yTrknvtDEJcyszuqgQ3h2PyIpXj6lsAuQ== +bGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQzRBqo +bAHs9mDycFEKTNEU+rzpRDAPBgNVHRMECDAGAQH/AgFkMAsGA1UdDwQEAwIBBjAN +BgkqhkiG9w0BAQsFAAOCAQEAGIzc8OIUuDNo7ade+RJyk1igkSrVh3chJOm2r9Ov +VYsxHKi7OjCUu6rUXrsX0ZNXUeYy8MfmdoYGbccqNcKjL1TWv7ElfuQLGt1izjTV +GLRN0HZS1GMAi5ByTnf/wRu/MdFt0nVpWgymskLnl8mhR1AWie4g7ufAyAZ/XlUK +eZDtLRGDSSPwiQjLnIRu9Wv+siwWDnTZqDWbHRxqq1jdMgnSZ8LrJxiOcDFYwvEg +BpisOVrCC0NgqHQ1sTK9g0vf2xhG4ax+E0oJawWYepjp4Bodp4g0xksGFGl4jSmD +wu5SrwCjTdhhBFoM5WL0x6yK832QEAh8FdE3ATy8ifhgJA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainG-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainG-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - a9:28:b3:d9:91:da:b9:0b:35:94:8d:b0:53:7c:6c:0d:b7:ab: - 41:7b:72:42:48:5b:13:6f:15:4b:df:cd:69:48:01:f4:b7:6d: - 4d:c3:be:85:91:31:1b:f7:54:e8:3e:6c:b7:ad:29:16:9b:f7: - 99:f4:67:a6:cb:96:7e:5b:8a:32:41:20:89:88:8d:a0:f2:81: - 3a:50:14:66:06:9b:eb:c0:ee:bb:d1:0c:84:7c:e3:bb:b6:92: - 62:68:3b:b0:0d:c2:ed:f4:d1:7f:8f:15:8c:1a:fd:fe:9d:be: - 84:0d:47:53:ad:c6:d7:60:52:71:5d:65:0a:28:aa:22:03:73: - cf:1f:d6:e1:1a:5c:b7:54:83:93:c8:38:bc:3b:64:50:91:f5: - ff:65:fd:3e:4b:fc:8c:96:80:c0:51:1f:14:16:3a:35:f2:93: - 67:99:dd:e3:8d:10:52:25:a9:1b:9f:43:7a:9a:31:ae:f1:9e: - 49:cb:17:e8:8b:17:59:42:7d:15:82:d8:4b:a4:02:d9:ea:96: - 69:0e:01:de:8c:47:63:54:88:b1:df:31:fd:16:8c:53:22:81: - 62:e3:96:10:b2:21:af:4b:72:82:66:aa:d1:06:09:f4:bd:00: - b6:f1:7a:4a:48:82:61:f5:de:c3:04:17:3a:83:46:38:b7:ff: - db:26:0e:f9 + 27:b7:93:b7:fd:71:ab:7c:a5:a2:8e:e7:4c:77:67:4c:f2:28: + b7:82:bb:4a:85:95:bf:84:57:04:49:ac:be:02:cc:6b:fd:0f: + d8:66:c8:a0:eb:40:55:cf:a1:e3:d1:e0:fe:9a:40:b5:2e:ee: + b2:bf:48:fa:20:57:fd:c7:df:de:68:8f:82:5d:58:ec:25:0a: + a8:97:73:dc:e6:66:f5:49:64:9a:e9:b1:e2:86:4e:d1:04:59: + 0f:32:e1:c5:dd:d4:39:b0:ad:e9:cc:ad:87:ef:ab:8e:fe:74: + 4c:7e:b2:cb:41:3c:54:ed:b7:8d:4b:fd:97:6e:26:22:32:9e: + 94:26:aa:45:7d:65:c1:c8:10:67:63:09:09:42:04:04:9d:0c: + 53:bb:18:f6:ce:af:dc:e7:63:d4:c8:bb:b4:6a:86:52:45:6a: + 96:a1:54:3d:8c:25:7d:1a:b1:16:65:7a:8b:ec:01:fa:c4:73: + 98:49:3c:c3:18:2f:48:3e:45:10:45:c0:85:2c:16:88:65:2b: + 02:0b:0b:02:67:d2:2a:1d:bd:66:14:f5:8d:d1:8e:f8:eb:7a: + b5:db:4e:f7:ce:fa:6f:67:a0:a2:6b:37:85:7a:f7:34:8a:71: + 9a:e5:34:2a:fd:6a:4a:ec:3e:38:e3:30:89:f3:e6:c4:a9:a6: + a4:79:35:9b -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluRy1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkctZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluRy1JQ0EyLXBhdGhsZW4xMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAKkos9mR -2rkLNZSNsFN8bA23q0F7ckJIWxNvFUvfzWlIAfS3bU3DvoWRMRv3VOg+bLetKRab -95n0Z6bLln5bijJBIImIjaDygTpQFGYGm+vA7rvRDIR847u2kmJoO7ANwu300X+P -FYwa/f6dvoQNR1OtxtdgUnFdZQooqiIDc88f1uEaXLdUg5PIOLw7ZFCR9f9l/T5L -/IyWgMBRHxQWOjXyk2eZ3eONEFIlqRufQ3qaMa7xnknLF+iLF1lCfRWC2EukAtnq -lmkOAd6MR2NUiLHfMf0WjFMigWLjlhCyIa9LcoJmqtEGCfS9ALbxekpIgmH13sME -FzqDRji3/9smDvk= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBACe3k7f9 +cat8paKO50x3Z0zyKLeCu0qFlb+EVwRJrL4CzGv9D9hmyKDrQFXPoePR4P6aQLUu +7rK/SPogV/3H395oj4JdWOwlCqiXc9zmZvVJZJrpseKGTtEEWQ8y4cXd1DmwrenM +rYfvq47+dEx+sstBPFTtt41L/ZduJiIynpQmqkV9ZcHIEGdjCQlCBASdDFO7GPbO +r9znY9TIu7RqhlJFapahVD2MJX0asRZleovsAfrEc5hJPMMYL0g+RRBFwIUsFohl +KwILCwJn0iodvWYU9Y3RjvjrerXbTvfO+m9noKJrN4V69zSKcZrlNCr9akrsPjjj +MInz5sSppqR5NZs= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA1-pathlen0.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA1-pathlen0.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA1-pathlen0.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA1-pathlen0.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 67:71:5e:c4:8d:05:a0:36:70:9d:32:66:44:00:69:81:ff:a0: - ff:2d:63:e2:79:5f:5e:c1:1b:8c:97:6d:e3:82:b2:a4:ca:fb: - 2b:e5:9d:bb:07:67:1d:b2:a9:84:fb:b9:cd:54:31:dc:2f:c2: - 70:8b:ec:fb:92:c6:38:9b:a8:d4:9d:98:5d:a4:fc:92:5e:c5: - 1c:ac:fd:76:31:11:59:0b:c2:b8:e0:b5:19:dd:4c:ec:fc:81: - 63:31:4c:00:72:e5:87:f5:aa:4a:a5:e9:b4:db:52:0d:7c:62: - 00:36:c4:ac:e1:bf:1d:ea:f8:9f:6c:a1:bc:8c:7a:4f:71:dc: - 7c:32:0e:de:c1:05:99:72:3c:a9:f6:9a:b9:f3:0d:09:db:74: - 1b:8e:0a:3e:84:93:21:2c:2d:38:2b:53:84:3b:8b:b3:49:07: - c9:ea:f0:09:2a:1f:f9:f9:f4:ad:17:df:ca:09:74:98:51:3f: - 91:a3:d3:7d:61:79:55:00:0a:51:74:7d:96:0b:b3:95:04:32: - e2:55:41:f7:fd:a3:12:2a:2f:92:14:d5:19:c7:50:8e:38:42: - 71:fe:4c:e0:31:56:7d:e4:a2:28:60:ea:b0:ac:75:47:69:fb: - 84:af:2b:62:14:8f:d3:bb:48:19:80:53:56:ae:2c:39:92:ca: - 3f:b6:22:72 + 84:70:f5:e6:36:95:d1:b9:43:99:0b:7e:a9:b1:2f:5a:4a:58: + 3f:73:83:a1:90:9e:b5:86:10:fb:0e:46:22:38:92:f2:07:19: + 20:c3:82:f0:8d:38:4f:39:38:6b:bc:43:15:fe:b4:c2:78:49: + d4:78:2e:6e:41:cb:f8:c6:ed:b9:8c:76:ad:b6:d4:68:fa:82: + 55:cc:b2:60:d5:ce:8c:bb:7a:dd:19:29:4e:c8:c6:f8:2a:1a: + b4:e7:8e:31:e8:63:76:bf:6e:77:98:3e:98:70:18:fb:d7:f5: + cc:47:da:35:54:d8:77:6e:54:db:3c:b0:b8:81:f0:ae:e2:a1: + 92:ea:c4:dd:0c:4b:fa:15:82:e0:4b:c8:cc:81:1d:54:2b:53: + c9:ed:06:00:28:e7:c5:37:d0:46:14:24:5c:6f:d4:a8:d9:c6: + e5:57:8d:0a:66:27:89:93:fc:c3:46:0c:40:b6:eb:f3:52:16: + d5:ed:21:ee:20:89:bd:ff:12:6d:7b:8e:7d:9d:1a:41:f4:0c: + 1c:ef:2d:ee:82:cf:9b:ca:8e:3e:fa:6c:13:79:13:5a:93:c4: + d8:99:1a:88:f0:c7:4c:76:4e:e7:b9:f3:1a:ec:77:42:c8:60: + f8:f6:2a:50:df:16:fa:bc:00:06:57:23:a9:34:c5:6f:d9:82: + 00:78:1b:58 -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBncV7EjQWgNnCdMmZEAGmB/6D/LWPieV9e -wRuMl23jgrKkyvsr5Z27B2cdsqmE+7nNVDHcL8Jwi+z7ksY4m6jUnZhdpPySXsUc -rP12MRFZC8K44LUZ3Uzs/IFjMUwAcuWH9apKpem021INfGIANsSs4b8d6vifbKG8 -jHpPcdx8Mg7ewQWZcjyp9pq58w0J23Qbjgo+hJMhLC04K1OEO4uzSQfJ6vAJKh/5 -+fStF9/KCXSYUT+Ro9N9YXlVAApRdH2WC7OVBDLiVUH3/aMSKi+SFNUZx1COOEJx -/kzgMVZ95KIoYOqwrHVHafuErytiFI/Tu0gZgFNWriw5kso/tiJy +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCEcPXmNpXRuUOZC36psS9aSlg/c4OhkJ61 +hhD7DkYiOJLyBxkgw4LwjThPOThrvEMV/rTCeEnUeC5uQcv4xu25jHatttRo+oJV +zLJg1c6Mu3rdGSlOyMb4Khq0544x6GN2v253mD6YcBj71/XMR9o1VNh3blTbPLC4 +gfCu4qGS6sTdDEv6FYLgS8jMgR1UK1PJ7QYAKOfFN9BGFCRcb9So2cblV40KZieJ +k/zDRgxAtuvzUhbV7SHuIIm9/xJte459nRpB9Awc7y3ugs+byo4++mwTeRNak8TY +mRqI8MdMdk7nufMa7HdCyGD49ipQ3xb6vAAGVyOpNMVv2YIAeBtY -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA2-pathlen2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA2-pathlen2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA2-pathlen2.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA2-pathlen2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 3d:c2:65:7b:7b:a6:66:c7:30:5d:48:24:b1:ac:ca:7f:88:d8: - ee:9a:cd:52:b2:96:59:b2:dd:f1:c4:9b:23:35:66:f2:25:7c: - 53:b2:1f:30:53:7d:64:d7:27:4a:dd:83:01:bf:3d:26:d3:d3: - fc:f4:84:8a:23:78:f9:b4:b3:f4:d1:9b:6e:a3:22:ec:fe:6e: - 04:0f:00:54:ed:57:53:88:b9:03:3b:b3:e9:ba:6b:cd:78:f6: - f1:d9:da:10:41:fb:84:a2:e9:1b:05:0b:14:bd:74:9a:c2:41: - 2c:b7:4b:bf:49:3f:db:48:5b:00:58:21:b3:0b:e2:e9:d5:76: - fc:86:da:73:23:a1:7a:28:33:f8:cb:29:9d:c1:0e:a0:39:dc: - 81:17:c0:04:a1:1e:46:c8:d4:8f:88:79:0b:a8:98:32:ae:13: - 98:92:72:74:55:7c:9c:33:f4:4c:65:4d:cc:28:6f:3a:8e:77: - dc:cd:40:97:d5:33:b0:6c:26:02:1b:be:69:9b:77:11:ac:42: - 85:85:e1:9a:5a:1e:60:49:45:14:85:3e:8c:ca:1f:49:96:5e: - 0c:d3:1a:7e:f0:90:8e:10:71:1c:70:19:57:53:3b:bd:75:db: - 27:a5:3f:ba:9d:a2:1b:e1:f2:cc:1b:cf:48:b7:b8:f0:23:e8: - e6:02:86:7a + 8f:ee:27:f5:45:63:56:eb:66:f5:c7:4f:b0:4a:16:ca:2a:e1: + de:75:7d:8b:09:12:0c:65:fe:a2:59:66:5e:b1:9f:1a:fc:e5: + a5:e5:c9:9b:4f:77:f1:87:8a:a7:36:2d:67:4d:ec:19:13:e3: + c1:9c:95:a5:90:ec:0f:39:5b:da:42:9f:73:6c:56:1f:aa:a8: + fb:69:82:a7:b2:21:b5:f7:fe:4e:1d:02:fc:30:e8:08:14:d8: + 86:db:ca:31:da:4d:b8:9c:91:2b:45:b4:70:6b:87:9e:e5:4c: + ea:b4:7a:75:18:1e:4c:db:e8:b1:e7:f0:50:43:59:38:31:46: + 57:59:ae:60:f8:8d:68:b6:49:3c:a5:4e:19:4c:e3:03:ef:5b: + bd:c0:9d:12:ba:b3:cb:f2:35:7a:81:a8:3b:95:9c:66:35:a2: + 94:79:bb:c0:cd:cd:cb:32:d2:8d:ef:89:c6:1c:28:f1:c2:6c: + 53:c7:fc:de:5e:c9:de:7e:11:61:d9:d7:b1:5e:61:d7:f1:a7: + e8:62:e1:f5:0f:f3:17:e8:e5:43:98:3b:cc:b7:cf:a4:ae:92: + 6b:16:51:ea:38:5f:5e:59:74:87:72:aa:5e:5f:21:dd:d8:6c: + 8a:e2:7d:11:5b:c1:5c:e9:76:aa:4f:60:46:51:5e:c0:b2:d3: + 9b:f6:ba:ca -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMi1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQA9wmV7e6ZmxzBdSCSxrMp/iNjums1SspZZ -st3xxJsjNWbyJXxTsh8wU31k1ydK3YMBvz0m09P89ISKI3j5tLP00ZtuoyLs/m4E -DwBU7VdTiLkDO7PpumvNePbx2doQQfuEoukbBQsUvXSawkEst0u/ST/bSFsAWCGz -C+Lp1Xb8htpzI6F6KDP4yymdwQ6gOdyBF8AEoR5GyNSPiHkLqJgyrhOYknJ0VXyc -M/RMZU3MKG86jnfczUCX1TOwbCYCG75pm3cRrEKFheGaWh5gSUUUhT6Myh9Jll4M -0xp+8JCOEHEccBlXUzu9ddsnpT+6naIb4fLMG89It7jwI+jmAoZ6 +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCP7if1RWNW62b1x0+wShbKKuHedX2LCRIM +Zf6iWWZesZ8a/OWl5cmbT3fxh4qnNi1nTewZE+PBnJWlkOwPOVvaQp9zbFYfqqj7 +aYKnsiG19/5OHQL8MOgIFNiG28ox2k24nJErRbRwa4ee5UzqtHp1GB5M2+ix5/BQ +Q1k4MUZXWa5g+I1otkk8pU4ZTOMD71u9wJ0SurPL8jV6gag7lZxmNaKUebvAzc3L +MtKN74nGHCjxwmxTx/zeXsnefhFh2dexXmHX8afoYuH1D/MX6OVDmDvMt8+krpJr +FlHqOF9eWXSHcqpeXyHd2GyK4n0RW8Fc6XaqT2BGUV7AstOb9rrK -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA3-pathlen2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA3-pathlen2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA3-pathlen2.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA3-pathlen2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 7a:d0:31:91:2e:bb:e2:77:ba:ae:e1:66:18:43:51:d5:28:ad: - 63:41:4d:35:9a:98:ea:c0:87:5d:71:f0:1f:d2:3f:56:d0:1f: - 82:04:d2:c1:72:ec:3f:93:6d:b4:36:5a:db:0c:9f:70:d9:65: - 81:6e:12:31:f9:24:e1:c7:2e:32:5a:e4:96:fd:53:ec:6b:1f: - 6d:2c:dc:04:1c:1a:dc:8a:5d:04:1b:16:fc:15:8a:7c:8c:e9: - c1:dd:c6:dc:71:8d:72:6f:b1:c9:93:f7:ca:a3:14:54:93:44: - 92:58:41:a4:8a:fc:55:fd:63:42:1d:0f:5f:72:aa:38:b6:02: - cb:e1:b1:e3:57:e7:87:a1:05:c8:9c:9b:49:73:0e:58:9d:30: - b5:fb:75:0c:8c:44:86:e0:c2:bc:90:60:ce:2c:ea:0a:39:fc: - 7c:e4:d1:44:55:34:e8:ce:04:a4:19:ad:00:2c:05:f1:65:24: - 6b:c7:d1:76:37:dd:33:91:86:3c:ad:b7:bc:53:4d:4a:50:ff: - d0:9c:89:4b:19:aa:40:d0:45:80:e8:d4:96:82:5b:54:68:ac: - d5:6c:77:46:b2:8d:82:ff:b5:81:71:90:84:6e:94:4b:e2:02: - 9f:c5:24:97:8e:0a:2e:71:57:8f:03:19:cb:a2:39:c0:1d:14: - e0:52:04:af + 75:ad:f2:f8:79:a5:c6:0d:4a:35:07:f6:75:1c:6c:0e:bf:3d: + d7:fc:81:de:57:9f:3f:f0:c9:8e:75:b8:23:0d:36:22:d6:d9: + 57:dc:c0:5b:a4:9a:fa:ef:2a:b5:ad:e2:c5:96:84:1a:84:49: + a8:17:b7:2e:fd:45:21:8f:e4:f1:8a:e5:64:bb:50:96:31:62: + d7:4a:11:f4:fa:78:5b:bb:0d:0a:0e:91:bb:84:e8:c6:5d:1a: + 03:1e:4b:50:5d:c5:03:f5:a3:32:fa:6c:5e:a8:c5:12:b4:5a: + c4:e6:ff:36:c3:4d:a7:1a:d1:b2:71:dd:89:1a:b2:08:46:60: + bb:8e:bb:df:bd:b9:0f:45:3d:25:06:eb:a7:95:11:a6:32:ee: + a0:2c:4c:2f:81:54:6f:54:16:d7:c3:85:6e:c4:78:43:a3:48: + 2f:81:03:81:c2:02:0a:84:9d:a8:b5:3f:02:b4:c0:fd:b5:d5: + 2f:f0:48:d7:0f:98:cb:0f:ca:e4:9c:1a:d8:1c:10:31:4b:9e: + 9b:a9:44:63:03:a0:a0:de:bc:bd:0f:d9:5a:fa:81:f2:d5:7d: + de:4b:06:88:b8:0e:98:5c:fb:60:a2:10:e9:ad:38:c7:05:09: + 9d:c9:bc:24:89:29:84:a5:3a:76:d9:ec:b8:9c:c7:9a:02:7e: + 23:d6:1b:65 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -80,10 +80,10 @@ YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAHrQMZEuu+J3uq7hZhhDUdUorWNBTTWamOrAh11x8B/SP1bQH4IE -0sFy7D+TbbQ2WtsMn3DZZYFuEjH5JOHHLjJa5Jb9U+xrH20s3AQcGtyKXQQbFvwV -inyM6cHdxtxxjXJvscmT98qjFFSTRJJYQaSK/FX9Y0IdD19yqji2AsvhseNX54eh -Bcicm0lzDlidMLX7dQyMRIbgwryQYM4s6go5/Hzk0URVNOjOBKQZrQAsBfFlJGvH -0XY33TORhjytt7xTTUpQ/9CciUsZqkDQRYDo1JaCW1RorNVsd0ayjYL/tYFxkIRu -lEviAp/FJJeOCi5xV48DGcuiOcAdFOBSBK8= +AQELBQADggEBAHWt8vh5pcYNSjUH9nUcbA6/Pdf8gd5Xnz/wyY51uCMNNiLW2Vfc +wFukmvrvKrWt4sWWhBqESagXty79RSGP5PGK5WS7UJYxYtdKEfT6eFu7DQoOkbuE +6MZdGgMeS1BdxQP1ozL6bF6oxRK0WsTm/zbDTaca0bJx3YkasghGYLuOu9+9uQ9F +PSUG66eVEaYy7qAsTC+BVG9UFtfDhW7EeEOjSC+BA4HCAgqEnai1PwK0wP211S/w +SNcPmMsPyuScGtgcEDFLnpupRGMDoKDevL0P2Vr6gfLVfd5LBoi4Dphc+2CiEOmt +OMcFCZ3JvCSJKYSlOnbZ7Licx5oCfiPWG2U= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA4-pathlen2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA4-pathlen2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA4-pathlen2.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-ICA4-pathlen2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 05:f4:24:ed:e2:f9:84:cf:1b:3d:6c:79:4f:3c:25:6b:3c:96: - ab:15:90:b3:77:07:90:f8:3e:82:e6:e4:3e:d9:a5:a7:81:d2: - fd:34:23:1d:ed:97:b5:33:aa:5d:7c:ab:06:12:03:e4:18:21: - 7b:83:f0:17:cd:43:12:d6:e6:4d:a3:a9:48:71:b8:f8:0c:af: - 25:ff:72:4d:f0:37:9d:c4:46:3f:3c:69:96:3d:00:96:31:30: - 96:9f:44:9a:eb:22:22:64:ae:7e:2f:a8:c7:3d:44:58:8b:8f: - 82:9d:4d:e7:9a:45:fe:b3:d4:bd:54:3c:5a:24:c2:8f:39:50: - 4d:24:0d:be:e1:4d:b8:1d:1d:a8:54:b5:6e:a0:d5:7f:96:ed: - c9:4d:7a:e3:e7:ec:0a:0f:2a:50:3b:90:ed:97:3f:df:2b:e1: - c3:fc:84:58:26:2d:1d:99:2b:3d:6f:aa:96:ae:01:76:86:0e: - 55:c5:bb:17:24:20:74:c7:b1:9c:69:7b:41:c0:4e:5b:e1:5c: - a2:62:34:29:e1:4b:42:62:fd:0e:f3:68:48:b6:a2:6f:d2:f6: - 15:2a:a4:a1:c1:86:88:9b:22:af:95:40:2a:64:26:e1:8e:4c: - f5:03:e0:ef:89:6d:ec:e0:46:46:32:7d:4b:6e:87:63:33:66: - f3:84:1d:7e + a1:6c:a3:2e:95:bb:e7:f0:f4:70:b8:8c:5a:a7:29:54:13:6a: + 5b:13:e3:62:6a:b5:06:68:41:91:2f:84:97:1f:25:c1:db:18: + 5d:09:26:04:ab:aa:2d:4d:59:2e:96:70:8f:0e:5d:0b:b8:b0: + db:5f:14:70:9e:00:d8:31:1f:65:54:47:69:5c:11:e8:0c:97: + 2e:ff:0d:2e:ee:45:18:5b:aa:83:21:b1:5d:66:f0:b7:b3:99: + 09:c6:fd:11:7e:b5:67:a0:d2:3b:a2:e9:b0:96:1d:42:ac:6e: + ce:f2:80:4e:8c:87:36:af:b5:c4:bc:fb:5d:18:40:d4:7d:3a: + 0f:c8:9f:f1:95:bb:8a:ad:18:f8:3c:e0:49:da:36:26:17:8c: + 87:75:79:80:5f:c4:5a:48:93:ed:62:93:73:55:a3:73:d4:ba: + 3c:54:f4:b2:ad:70:af:8f:93:4f:a7:15:49:e0:cf:88:2a:1f: + bf:18:f5:13:e4:5b:d3:37:29:12:db:8c:4d:b6:93:0b:02:70: + 47:84:cc:0a:e8:28:de:89:a1:43:0f:16:28:a9:be:85:6e:62: + 44:5c:69:a0:33:67:bf:ee:80:37:46:25:e4:d2:ec:56:07:67: + e4:d6:e0:92:a1:2f:7c:d8:18:d0:7a:02:82:5b:48:3d:61:9b: + 5f:65:db:af -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -78,12 +78,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAAX0JO3i+YTPGz1seU88JWs8lqsVkLN3B5D4PoLm5D7Z -paeB0v00Ix3tl7Uzql18qwYSA+QYIXuD8BfNQxLW5k2jqUhxuPgMryX/ck3wN53E -Rj88aZY9AJYxMJafRJrrIiJkrn4vqMc9RFiLj4KdTeeaRf6z1L1UPFokwo85UE0k -Db7hTbgdHahUtW6g1X+W7clNeuPn7AoPKlA7kO2XP98r4cP8hFgmLR2ZKz1vqpau -AXaGDlXFuxckIHTHsZxpe0HATlvhXKJiNCnhS0Ji/Q7zaEi2om/S9hUqpKHBhoib -Iq+VQCpkJuGOTPUD4O+JbezgRkYyfUtuh2MzZvOEHX4= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAKFsoy6Vu+fw9HC4jFqnKVQTalsT42JqtQZoQZEvhJcf +JcHbGF0JJgSrqi1NWS6WcI8OXQu4sNtfFHCeANgxH2VUR2lcEegMly7/DS7uRRhb +qoMhsV1m8LezmQnG/RF+tWeg0jui6bCWHUKsbs7ygE6MhzavtcS8+10YQNR9Og/I +n/GVu4qtGPg84EnaNiYXjId1eYBfxFpIk+1ik3NVo3PUujxU9LKtcK+Pk0+nFUng +z4gqH78Y9RPkW9M3KRLbjE22kwsCcEeEzAroKN6JoUMPFiipvoVuYkRcaaAzZ7/u +gDdGJeTS7FYHZ+TW4JKhL3zYGNB6AoJbSD1hm19l268= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 8c:b5:c8:f8:28:8c:cc:27:7c:21:36:75:2a:bc:af:5e:d6:7a: - d1:22:d5:1b:7a:a2:1a:5e:30:b5:38:64:2e:71:09:1c:db:a0: - 99:44:5c:e8:c2:b5:06:ac:c1:ec:d8:30:74:65:62:f5:db:c2: - 03:fa:54:e0:0f:c9:8a:d8:02:11:d3:58:a6:bc:7f:54:07:3b: - f7:6d:7d:db:18:d9:2a:01:57:38:fc:d4:18:86:84:38:8b:d0: - 5c:8c:d7:47:2e:76:d3:92:c3:75:61:93:03:56:93:74:60:ff: - 16:84:4a:70:f0:cc:0c:ed:d3:53:f9:fc:f7:b8:34:6a:5c:25: - 78:ab:27:3f:ad:04:8f:c6:01:29:a8:b7:61:09:b0:7b:51:9b: - ca:6c:23:5b:0c:18:f3:63:ea:96:56:b9:1a:0f:ec:80:cd:29: - f6:fb:d1:df:65:34:e8:1f:62:c8:95:fa:be:27:cb:40:e7:26: - 7f:18:7e:cc:5d:7d:19:9e:12:90:0b:d7:32:12:0d:cb:97:8e: - e8:3e:c3:1b:f6:a3:3c:e8:d0:35:63:de:66:89:5a:a3:ef:64: - 3a:8f:e3:5f:d2:e6:64:82:7b:2f:2e:26:78:13:34:39:ed:9c: - f8:ad:f5:d6:75:d1:60:48:aa:19:41:98:1f:4e:ce:01:76:9d: - af:0f:6b:8d + 06:45:21:fd:a8:95:fa:d4:96:c7:4f:83:6b:6c:c1:24:fa:b0: + 14:42:db:7a:5c:7b:f4:8f:4e:66:78:bc:ff:65:bd:4a:a7:8e: + d0:78:33:6f:d2:aa:bb:9b:25:26:15:4d:9d:8e:39:16:99:70: + 25:6a:2d:ee:78:54:80:13:71:f3:e1:6a:ec:56:57:1a:25:db: + 8f:b3:64:22:d2:04:d1:b2:aa:ff:2c:d9:ae:6d:74:66:18:74: + 58:38:4b:ec:77:69:f6:83:ed:4d:7d:4a:60:71:35:8e:14:02: + 72:9e:93:22:a5:ca:d9:33:7e:12:c4:41:34:cf:c4:14:66:9a: + fa:04:aa:1f:e2:d9:5e:d3:42:9e:fa:c9:71:6e:f0:43:08:a7: + 60:bc:eb:19:8e:70:09:24:12:6b:9a:10:60:fc:44:61:e3:f4: + 0d:08:15:9e:a6:b3:7e:9b:be:d5:f9:63:9d:2f:be:c3:81:c6: + ef:e8:56:99:a2:58:f3:32:7c:c2:c2:b1:d9:6a:bd:51:79:eb: + 18:02:44:b4:4e:e8:7c:3e:96:a4:ae:86:79:94:11:6f:1b:eb: + 80:71:07:1f:4c:5d:88:67:39:62:6d:c2:0d:64:2a:07:66:48: + ca:b4:76:06:da:1c:40:24:77:34:a9:8b:26:d0:20:6b:94:25: + 75:73:84:e7 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzM1oXDTI2MDkwODIyMTkzM1owgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkgtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,13 +77,13 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIy1yPgo -jMwnfCE2dSq8r17WetEi1Rt6ohpeMLU4ZC5xCRzboJlEXOjCtQaswezYMHRlYvXb -wgP6VOAPyYrYAhHTWKa8f1QHO/dtfdsY2SoBVzj81BiGhDiL0FyM10cudtOSw3Vh -kwNWk3Rg/xaESnDwzAzt01P5/Pe4NGpcJXirJz+tBI/GASmot2EJsHtRm8psI1sM -GPNj6pZWuRoP7IDNKfb70d9lNOgfYsiV+r4ny0DnJn8YfsxdfRmeEpAL1zISDcuX -jug+wxv2ozzo0DVj3maJWqPvZDqP41/S5mSCey8uJngTNDntnPit9dZ10WBIqhlB -mB9OzgF2na8Pa40= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAZFIf2o +lfrUlsdPg2tswST6sBRC23pce/SPTmZ4vP9lvUqnjtB4M2/SqrubJSYVTZ2OORaZ +cCVqLe54VIATcfPhauxWVxol24+zZCLSBNGyqv8s2a5tdGYYdFg4S+x3afaD7U19 +SmBxNY4UAnKekyKlytkzfhLEQTTPxBRmmvoEqh/i2V7TQp76yXFu8EMIp2C86xmO +cAkkEmuaEGD8RGHj9A0IFZ6ms36bvtX5Y50vvsOBxu/oVpmiWPMyfMLCsdlqvVF5 +6xgCRLRO6Hw+lqSuhnmUEW8b64BxBx9MXYhnOWJtwg1kKgdmSMq0dgbaHEAkdzSp +iybQIGuUJXVzhOc= -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 67:71:5e:c4:8d:05:a0:36:70:9d:32:66:44:00:69:81:ff:a0: - ff:2d:63:e2:79:5f:5e:c1:1b:8c:97:6d:e3:82:b2:a4:ca:fb: - 2b:e5:9d:bb:07:67:1d:b2:a9:84:fb:b9:cd:54:31:dc:2f:c2: - 70:8b:ec:fb:92:c6:38:9b:a8:d4:9d:98:5d:a4:fc:92:5e:c5: - 1c:ac:fd:76:31:11:59:0b:c2:b8:e0:b5:19:dd:4c:ec:fc:81: - 63:31:4c:00:72:e5:87:f5:aa:4a:a5:e9:b4:db:52:0d:7c:62: - 00:36:c4:ac:e1:bf:1d:ea:f8:9f:6c:a1:bc:8c:7a:4f:71:dc: - 7c:32:0e:de:c1:05:99:72:3c:a9:f6:9a:b9:f3:0d:09:db:74: - 1b:8e:0a:3e:84:93:21:2c:2d:38:2b:53:84:3b:8b:b3:49:07: - c9:ea:f0:09:2a:1f:f9:f9:f4:ad:17:df:ca:09:74:98:51:3f: - 91:a3:d3:7d:61:79:55:00:0a:51:74:7d:96:0b:b3:95:04:32: - e2:55:41:f7:fd:a3:12:2a:2f:92:14:d5:19:c7:50:8e:38:42: - 71:fe:4c:e0:31:56:7d:e4:a2:28:60:ea:b0:ac:75:47:69:fb: - 84:af:2b:62:14:8f:d3:bb:48:19:80:53:56:ae:2c:39:92:ca: - 3f:b6:22:72 + 84:70:f5:e6:36:95:d1:b9:43:99:0b:7e:a9:b1:2f:5a:4a:58: + 3f:73:83:a1:90:9e:b5:86:10:fb:0e:46:22:38:92:f2:07:19: + 20:c3:82:f0:8d:38:4f:39:38:6b:bc:43:15:fe:b4:c2:78:49: + d4:78:2e:6e:41:cb:f8:c6:ed:b9:8c:76:ad:b6:d4:68:fa:82: + 55:cc:b2:60:d5:ce:8c:bb:7a:dd:19:29:4e:c8:c6:f8:2a:1a: + b4:e7:8e:31:e8:63:76:bf:6e:77:98:3e:98:70:18:fb:d7:f5: + cc:47:da:35:54:d8:77:6e:54:db:3c:b0:b8:81:f0:ae:e2:a1: + 92:ea:c4:dd:0c:4b:fa:15:82:e0:4b:c8:cc:81:1d:54:2b:53: + c9:ed:06:00:28:e7:c5:37:d0:46:14:24:5c:6f:d4:a8:d9:c6: + e5:57:8d:0a:66:27:89:93:fc:c3:46:0c:40:b6:eb:f3:52:16: + d5:ed:21:ee:20:89:bd:ff:12:6d:7b:8e:7d:9d:1a:41:f4:0c: + 1c:ef:2d:ee:82:cf:9b:ca:8e:3e:fa:6c:13:79:13:5a:93:c4: + d8:99:1a:88:f0:c7:4c:76:4e:e7:b9:f3:1a:ec:77:42:c8:60: + f8:f6:2a:50:df:16:fa:bc:00:06:57:23:a9:34:c5:6f:d9:82: + 00:78:1b:58 -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMS1wYXRobGVuMDEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -167,12 +167,12 @@ YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQAwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBncV7EjQWgNnCdMmZEAGmB/6D/LWPieV9e -wRuMl23jgrKkyvsr5Z27B2cdsqmE+7nNVDHcL8Jwi+z7ksY4m6jUnZhdpPySXsUc -rP12MRFZC8K44LUZ3Uzs/IFjMUwAcuWH9apKpem021INfGIANsSs4b8d6vifbKG8 -jHpPcdx8Mg7ewQWZcjyp9pq58w0J23Qbjgo+hJMhLC04K1OEO4uzSQfJ6vAJKh/5 -+fStF9/KCXSYUT+Ro9N9YXlVAApRdH2WC7OVBDLiVUH3/aMSKi+SFNUZx1COOEJx -/kzgMVZ95KIoYOqwrHVHafuErytiFI/Tu0gZgFNWriw5kso/tiJy +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCEcPXmNpXRuUOZC36psS9aSlg/c4OhkJ61 +hhD7DkYiOJLyBxkgw4LwjThPOThrvEMV/rTCeEnUeC5uQcv4xu25jHatttRo+oJV +zLJg1c6Mu3rdGSlOyMb4Khq0544x6GN2v253mD6YcBj71/XMR9o1VNh3blTbPLC4 +gfCu4qGS6sTdDEv6FYLgS8jMgR1UK1PJ7QYAKOfFN9BGFCRcb9So2cblV40KZieJ +k/zDRgxAtuvzUhbV7SHuIIm9/xJte459nRpB9Awc7y3ugs+byo4++mwTeRNak8TY +mRqI8MdMdk7nufMa7HdCyGD49ipQ3xb6vAAGVyOpNMVv2YIAeBtY -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA2-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 3d:c2:65:7b:7b:a6:66:c7:30:5d:48:24:b1:ac:ca:7f:88:d8: - ee:9a:cd:52:b2:96:59:b2:dd:f1:c4:9b:23:35:66:f2:25:7c: - 53:b2:1f:30:53:7d:64:d7:27:4a:dd:83:01:bf:3d:26:d3:d3: - fc:f4:84:8a:23:78:f9:b4:b3:f4:d1:9b:6e:a3:22:ec:fe:6e: - 04:0f:00:54:ed:57:53:88:b9:03:3b:b3:e9:ba:6b:cd:78:f6: - f1:d9:da:10:41:fb:84:a2:e9:1b:05:0b:14:bd:74:9a:c2:41: - 2c:b7:4b:bf:49:3f:db:48:5b:00:58:21:b3:0b:e2:e9:d5:76: - fc:86:da:73:23:a1:7a:28:33:f8:cb:29:9d:c1:0e:a0:39:dc: - 81:17:c0:04:a1:1e:46:c8:d4:8f:88:79:0b:a8:98:32:ae:13: - 98:92:72:74:55:7c:9c:33:f4:4c:65:4d:cc:28:6f:3a:8e:77: - dc:cd:40:97:d5:33:b0:6c:26:02:1b:be:69:9b:77:11:ac:42: - 85:85:e1:9a:5a:1e:60:49:45:14:85:3e:8c:ca:1f:49:96:5e: - 0c:d3:1a:7e:f0:90:8e:10:71:1c:70:19:57:53:3b:bd:75:db: - 27:a5:3f:ba:9d:a2:1b:e1:f2:cc:1b:cf:48:b7:b8:f0:23:e8: - e6:02:86:7a + 8f:ee:27:f5:45:63:56:eb:66:f5:c7:4f:b0:4a:16:ca:2a:e1: + de:75:7d:8b:09:12:0c:65:fe:a2:59:66:5e:b1:9f:1a:fc:e5: + a5:e5:c9:9b:4f:77:f1:87:8a:a7:36:2d:67:4d:ec:19:13:e3: + c1:9c:95:a5:90:ec:0f:39:5b:da:42:9f:73:6c:56:1f:aa:a8: + fb:69:82:a7:b2:21:b5:f7:fe:4e:1d:02:fc:30:e8:08:14:d8: + 86:db:ca:31:da:4d:b8:9c:91:2b:45:b4:70:6b:87:9e:e5:4c: + ea:b4:7a:75:18:1e:4c:db:e8:b1:e7:f0:50:43:59:38:31:46: + 57:59:ae:60:f8:8d:68:b6:49:3c:a5:4e:19:4c:e3:03:ef:5b: + bd:c0:9d:12:ba:b3:cb:f2:35:7a:81:a8:3b:95:9c:66:35:a2: + 94:79:bb:c0:cd:cd:cb:32:d2:8d:ef:89:c6:1c:28:f1:c2:6c: + 53:c7:fc:de:5e:c9:de:7e:11:61:d9:d7:b1:5e:61:d7:f1:a7: + e8:62:e1:f5:0f:f3:17:e8:e5:43:98:3b:cc:b7:cf:a4:ae:92: + 6b:16:51:ea:38:5f:5e:59:74:87:72:aa:5e:5f:21:dd:d8:6c: + 8a:e2:7d:11:5b:c1:5c:e9:76:aa:4f:60:46:51:5e:c0:b2:d3: + 9b:f6:ba:ca -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMi1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -256,12 +256,12 @@ YXR0bGUxFTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJp bmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkB FhBpbmZvQHdvbGZzc2wuY29tggFkMA8GA1UdEwQIMAYBAf8CAQIwCwYDVR0PBAQD -AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQA9wmV7e6ZmxzBdSCSxrMp/iNjums1SspZZ -st3xxJsjNWbyJXxTsh8wU31k1ydK3YMBvz0m09P89ISKI3j5tLP00ZtuoyLs/m4E -DwBU7VdTiLkDO7PpumvNePbx2doQQfuEoukbBQsUvXSawkEst0u/ST/bSFsAWCGz -C+Lp1Xb8htpzI6F6KDP4yymdwQ6gOdyBF8AEoR5GyNSPiHkLqJgyrhOYknJ0VXyc -M/RMZU3MKG86jnfczUCX1TOwbCYCG75pm3cRrEKFheGaWh5gSUUUhT6Myh9Jll4M -0xp+8JCOEHEccBlXUzu9ddsnpT+6naIb4fLMG89It7jwI+jmAoZ6 +AgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCP7if1RWNW62b1x0+wShbKKuHedX2LCRIM +Zf6iWWZesZ8a/OWl5cmbT3fxh4qnNi1nTewZE+PBnJWlkOwPOVvaQp9zbFYfqqj7 +aYKnsiG19/5OHQL8MOgIFNiG28ox2k24nJErRbRwa4ee5UzqtHp1GB5M2+ix5/BQ +Q1k4MUZXWa5g+I1otkk8pU4ZTOMD71u9wJ0SurPL8jV6gag7lZxmNaKUebvAzc3L +MtKN74nGHCjxwmxTx/zeXsnefhFh2dexXmHX8afoYuH1D/MX6OVDmDvMt8+krpJr +FlHqOF9eWXSHcqpeXyHd2GyK4n0RW8Fc6XaqT2BGUV7AstOb9rrK -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -309,27 +309,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 7a:d0:31:91:2e:bb:e2:77:ba:ae:e1:66:18:43:51:d5:28:ad: - 63:41:4d:35:9a:98:ea:c0:87:5d:71:f0:1f:d2:3f:56:d0:1f: - 82:04:d2:c1:72:ec:3f:93:6d:b4:36:5a:db:0c:9f:70:d9:65: - 81:6e:12:31:f9:24:e1:c7:2e:32:5a:e4:96:fd:53:ec:6b:1f: - 6d:2c:dc:04:1c:1a:dc:8a:5d:04:1b:16:fc:15:8a:7c:8c:e9: - c1:dd:c6:dc:71:8d:72:6f:b1:c9:93:f7:ca:a3:14:54:93:44: - 92:58:41:a4:8a:fc:55:fd:63:42:1d:0f:5f:72:aa:38:b6:02: - cb:e1:b1:e3:57:e7:87:a1:05:c8:9c:9b:49:73:0e:58:9d:30: - b5:fb:75:0c:8c:44:86:e0:c2:bc:90:60:ce:2c:ea:0a:39:fc: - 7c:e4:d1:44:55:34:e8:ce:04:a4:19:ad:00:2c:05:f1:65:24: - 6b:c7:d1:76:37:dd:33:91:86:3c:ad:b7:bc:53:4d:4a:50:ff: - d0:9c:89:4b:19:aa:40:d0:45:80:e8:d4:96:82:5b:54:68:ac: - d5:6c:77:46:b2:8d:82:ff:b5:81:71:90:84:6e:94:4b:e2:02: - 9f:c5:24:97:8e:0a:2e:71:57:8f:03:19:cb:a2:39:c0:1d:14: - e0:52:04:af + 75:ad:f2:f8:79:a5:c6:0d:4a:35:07:f6:75:1c:6c:0e:bf:3d: + d7:fc:81:de:57:9f:3f:f0:c9:8e:75:b8:23:0d:36:22:d6:d9: + 57:dc:c0:5b:a4:9a:fa:ef:2a:b5:ad:e2:c5:96:84:1a:84:49: + a8:17:b7:2e:fd:45:21:8f:e4:f1:8a:e5:64:bb:50:96:31:62: + d7:4a:11:f4:fa:78:5b:bb:0d:0a:0e:91:bb:84:e8:c6:5d:1a: + 03:1e:4b:50:5d:c5:03:f5:a3:32:fa:6c:5e:a8:c5:12:b4:5a: + c4:e6:ff:36:c3:4d:a7:1a:d1:b2:71:dd:89:1a:b2:08:46:60: + bb:8e:bb:df:bd:b9:0f:45:3d:25:06:eb:a7:95:11:a6:32:ee: + a0:2c:4c:2f:81:54:6f:54:16:d7:c3:85:6e:c4:78:43:a3:48: + 2f:81:03:81:c2:02:0a:84:9d:a8:b5:3f:02:b4:c0:fd:b5:d5: + 2f:f0:48:d7:0f:98:cb:0f:ca:e4:9c:1a:d8:1c:10:31:4b:9e: + 9b:a9:44:63:03:a0:a0:de:bc:bd:0f:d9:5a:fa:81:f2:d5:7d: + de:4b:06:88:b8:0e:98:5c:fb:60:a2:10:e9:ad:38:c7:05:09: + 9d:c9:bc:24:89:29:84:a5:3a:76:d9:ec:b8:9c:c7:9a:02:7e: + 23:d6:1b:65 -----BEGIN CERTIFICATE----- MIIExjCCA66gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaExCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzMloXDTI2MDkwODIyMTkzMlowgaExCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR0wGwYDVQQD DBRjaGFpbkgtSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xm @@ -345,12 +345,12 @@ YW4xETAPBgNVBAoMCFNhd3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYD VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz bC5jb22CAWQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJKoZIhvcN -AQELBQADggEBAHrQMZEuu+J3uq7hZhhDUdUorWNBTTWamOrAh11x8B/SP1bQH4IE -0sFy7D+TbbQ2WtsMn3DZZYFuEjH5JOHHLjJa5Jb9U+xrH20s3AQcGtyKXQQbFvwV -inyM6cHdxtxxjXJvscmT98qjFFSTRJJYQaSK/FX9Y0IdD19yqji2AsvhseNX54eh -Bcicm0lzDlidMLX7dQyMRIbgwryQYM4s6go5/Hzk0URVNOjOBKQZrQAsBfFlJGvH -0XY33TORhjytt7xTTUpQ/9CciUsZqkDQRYDo1JaCW1RorNVsd0ayjYL/tYFxkIRu -lEviAp/FJJeOCi5xV48DGcuiOcAdFOBSBK8= +AQELBQADggEBAHWt8vh5pcYNSjUH9nUcbA6/Pdf8gd5Xnz/wyY51uCMNNiLW2Vfc +wFukmvrvKrWt4sWWhBqESagXty79RSGP5PGK5WS7UJYxYtdKEfT6eFu7DQoOkbuE +6MZdGgMeS1BdxQP1ozL6bF6oxRK0WsTm/zbDTaca0bJx3YkasghGYLuOu9+9uQ9F +PSUG66eVEaYy7qAsTC+BVG9UFtfDhW7EeEOjSC+BA4HCAgqEnai1PwK0wP211S/w +SNcPmMsPyuScGtgcEDFLnpupRGMDoKDevL0P2Vr6gfLVfd5LBoi4Dphc+2CiEOmt +OMcFCZ3JvCSJKYSlOnbZ7Licx5oCfiPWG2U= -----END CERTIFICATE----- Certificate: Data: @@ -359,8 +359,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:32 2023 GMT + Not After : Sep 8 22:19:32 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -391,34 +391,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 05:f4:24:ed:e2:f9:84:cf:1b:3d:6c:79:4f:3c:25:6b:3c:96: - ab:15:90:b3:77:07:90:f8:3e:82:e6:e4:3e:d9:a5:a7:81:d2: - fd:34:23:1d:ed:97:b5:33:aa:5d:7c:ab:06:12:03:e4:18:21: - 7b:83:f0:17:cd:43:12:d6:e6:4d:a3:a9:48:71:b8:f8:0c:af: - 25:ff:72:4d:f0:37:9d:c4:46:3f:3c:69:96:3d:00:96:31:30: - 96:9f:44:9a:eb:22:22:64:ae:7e:2f:a8:c7:3d:44:58:8b:8f: - 82:9d:4d:e7:9a:45:fe:b3:d4:bd:54:3c:5a:24:c2:8f:39:50: - 4d:24:0d:be:e1:4d:b8:1d:1d:a8:54:b5:6e:a0:d5:7f:96:ed: - c9:4d:7a:e3:e7:ec:0a:0f:2a:50:3b:90:ed:97:3f:df:2b:e1: - c3:fc:84:58:26:2d:1d:99:2b:3d:6f:aa:96:ae:01:76:86:0e: - 55:c5:bb:17:24:20:74:c7:b1:9c:69:7b:41:c0:4e:5b:e1:5c: - a2:62:34:29:e1:4b:42:62:fd:0e:f3:68:48:b6:a2:6f:d2:f6: - 15:2a:a4:a1:c1:86:88:9b:22:af:95:40:2a:64:26:e1:8e:4c: - f5:03:e0:ef:89:6d:ec:e0:46:46:32:7d:4b:6e:87:63:33:66: - f3:84:1d:7e + a1:6c:a3:2e:95:bb:e7:f0:f4:70:b8:8c:5a:a7:29:54:13:6a: + 5b:13:e3:62:6a:b5:06:68:41:91:2f:84:97:1f:25:c1:db:18: + 5d:09:26:04:ab:aa:2d:4d:59:2e:96:70:8f:0e:5d:0b:b8:b0: + db:5f:14:70:9e:00:d8:31:1f:65:54:47:69:5c:11:e8:0c:97: + 2e:ff:0d:2e:ee:45:18:5b:aa:83:21:b1:5d:66:f0:b7:b3:99: + 09:c6:fd:11:7e:b5:67:a0:d2:3b:a2:e9:b0:96:1d:42:ac:6e: + ce:f2:80:4e:8c:87:36:af:b5:c4:bc:fb:5d:18:40:d4:7d:3a: + 0f:c8:9f:f1:95:bb:8a:ad:18:f8:3c:e0:49:da:36:26:17:8c: + 87:75:79:80:5f:c4:5a:48:93:ed:62:93:73:55:a3:73:d4:ba: + 3c:54:f4:b2:ad:70:af:8f:93:4f:a7:15:49:e0:cf:88:2a:1f: + bf:18:f5:13:e4:5b:d3:37:29:12:db:8c:4d:b6:93:0b:02:70: + 47:84:cc:0a:e8:28:de:89:a1:43:0f:16:28:a9:be:85:6e:62: + 44:5c:69:a0:33:67:bf:ee:80:37:46:25:e4:d2:ec:56:07:67: + e4:d6:e0:92:a1:2f:7c:d8:18:d0:7a:02:82:5b:48:3d:61:9b: + 5f:65:db:af -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMyWhcNMjYwOTA4MjIxOTMyWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSC1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -432,12 +432,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAAX0JO3i+YTPGz1seU88JWs8lqsVkLN3B5D4PoLm5D7Z -paeB0v00Ix3tl7Uzql18qwYSA+QYIXuD8BfNQxLW5k2jqUhxuPgMryX/ck3wN53E -Rj88aZY9AJYxMJafRJrrIiJkrn4vqMc9RFiLj4KdTeeaRf6z1L1UPFokwo85UE0k -Db7hTbgdHahUtW6g1X+W7clNeuPn7AoPKlA7kO2XP98r4cP8hFgmLR2ZKz1vqpau -AXaGDlXFuxckIHTHsZxpe0HATlvhXKJiNCnhS0Ji/Q7zaEi2om/S9hUqpKHBhoib -Iq+VQCpkJuGOTPUD4O+JbezgRkYyfUtuh2MzZvOEHX4= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAKFsoy6Vu+fw9HC4jFqnKVQTalsT42JqtQZoQZEvhJcf +JcHbGF0JJgSrqi1NWS6WcI8OXQu4sNtfFHCeANgxH2VUR2lcEegMly7/DS7uRRhb +qoMhsV1m8LezmQnG/RF+tWeg0jui6bCWHUKsbs7ygE6MhzavtcS8+10YQNR9Og/I +n/GVu4qtGPg84EnaNiYXjId1eYBfxFpIk+1ik3NVo3PUujxU9LKtcK+Pk0+nFUng +z4gqH78Y9RPkW9M3KRLbjE22kwsCcEeEzAroKN6JoUMPFiipvoVuYkRcaaAzZ7/u +gDdGJeTS7FYHZ+TW4JKhL3zYGNB6AoJbSD1hm19l268= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainH-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-ICA1-pathlen0, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainH-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 8c:b5:c8:f8:28:8c:cc:27:7c:21:36:75:2a:bc:af:5e:d6:7a: - d1:22:d5:1b:7a:a2:1a:5e:30:b5:38:64:2e:71:09:1c:db:a0: - 99:44:5c:e8:c2:b5:06:ac:c1:ec:d8:30:74:65:62:f5:db:c2: - 03:fa:54:e0:0f:c9:8a:d8:02:11:d3:58:a6:bc:7f:54:07:3b: - f7:6d:7d:db:18:d9:2a:01:57:38:fc:d4:18:86:84:38:8b:d0: - 5c:8c:d7:47:2e:76:d3:92:c3:75:61:93:03:56:93:74:60:ff: - 16:84:4a:70:f0:cc:0c:ed:d3:53:f9:fc:f7:b8:34:6a:5c:25: - 78:ab:27:3f:ad:04:8f:c6:01:29:a8:b7:61:09:b0:7b:51:9b: - ca:6c:23:5b:0c:18:f3:63:ea:96:56:b9:1a:0f:ec:80:cd:29: - f6:fb:d1:df:65:34:e8:1f:62:c8:95:fa:be:27:cb:40:e7:26: - 7f:18:7e:cc:5d:7d:19:9e:12:90:0b:d7:32:12:0d:cb:97:8e: - e8:3e:c3:1b:f6:a3:3c:e8:d0:35:63:de:66:89:5a:a3:ef:64: - 3a:8f:e3:5f:d2:e6:64:82:7b:2f:2e:26:78:13:34:39:ed:9c: - f8:ad:f5:d6:75:d1:60:48:aa:19:41:98:1f:4e:ce:01:76:9d: - af:0f:6b:8d + 06:45:21:fd:a8:95:fa:d4:96:c7:4f:83:6b:6c:c1:24:fa:b0: + 14:42:db:7a:5c:7b:f4:8f:4e:66:78:bc:ff:65:bd:4a:a7:8e: + d0:78:33:6f:d2:aa:bb:9b:25:26:15:4d:9d:8e:39:16:99:70: + 25:6a:2d:ee:78:54:80:13:71:f3:e1:6a:ec:56:57:1a:25:db: + 8f:b3:64:22:d2:04:d1:b2:aa:ff:2c:d9:ae:6d:74:66:18:74: + 58:38:4b:ec:77:69:f6:83:ed:4d:7d:4a:60:71:35:8e:14:02: + 72:9e:93:22:a5:ca:d9:33:7e:12:c4:41:34:cf:c4:14:66:9a: + fa:04:aa:1f:e2:d9:5e:d3:42:9e:fa:c9:71:6e:f0:43:08:a7: + 60:bc:eb:19:8e:70:09:24:12:6b:9a:10:60:fc:44:61:e3:f4: + 0d:08:15:9e:a6:b3:7e:9b:be:d5:f9:63:9d:2f:be:c3:81:c6: + ef:e8:56:99:a2:58:f3:32:7c:c2:c2:b1:d9:6a:bd:51:79:eb: + 18:02:44:b4:4e:e8:7c:3e:96:a4:ae:86:79:94:11:6f:1b:eb: + 80:71:07:1f:4c:5d:88:67:39:62:6d:c2:0d:64:2a:07:66:48: + ca:b4:76:06:da:1c:40:24:77:34:a9:8b:26:d0:20:6b:94:25: + 75:73:84:e7 -----BEGIN CERTIFICATE----- MIIEtzCCA5+gAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSC1JQ0ExLXBhdGhsZW4wMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgZoxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzM1oXDTI2MDkwODIyMTkzM1owgZoxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMRYwFAYDVQQD DA1jaGFpbkgtZW50aXR5MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29t @@ -77,11 +77,11 @@ BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNV BAMMFGNoYWluSC1JQ0EyLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv -bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAIy1yPgo -jMwnfCE2dSq8r17WetEi1Rt6ohpeMLU4ZC5xCRzboJlEXOjCtQaswezYMHRlYvXb -wgP6VOAPyYrYAhHTWKa8f1QHO/dtfdsY2SoBVzj81BiGhDiL0FyM10cudtOSw3Vh -kwNWk3Rg/xaESnDwzAzt01P5/Pe4NGpcJXirJz+tBI/GASmot2EJsHtRm8psI1sM -GPNj6pZWuRoP7IDNKfb70d9lNOgfYsiV+r4ny0DnJn8YfsxdfRmeEpAL1zISDcuX -jug+wxv2ozzo0DVj3maJWqPvZDqP41/S5mSCey8uJngTNDntnPit9dZ10WBIqhlB -mB9OzgF2na8Pa40= +bGZzc2wuY29tggFkMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAZFIf2o +lfrUlsdPg2tswST6sBRC23pce/SPTmZ4vP9lvUqnjtB4M2/SqrubJSYVTZ2OORaZ +cCVqLe54VIATcfPhauxWVxol24+zZCLSBNGyqv8s2a5tdGYYdFg4S+x3afaD7U19 +SmBxNY4UAnKekyKlytkzfhLEQTTPxBRmmvoEqh/i2V7TQp76yXFu8EMIp2C86xmO +cAkkEmuaEGD8RGHj9A0IFZ6ms36bvtX5Y50vvsOBxu/oVpmiWPMyfMLCsdlqvVF5 +6xgCRLRO6Hw+lqSuhnmUEW8b64BxBx9MXYhnOWJtwg1kKgdmSMq0dgbaHEAkdzSp +iybQIGuUJXVzhOc= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA1-no_pathlen.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA1-no_pathlen.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA1-no_pathlen.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA1-no_pathlen.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 78:50:73:20:80:87:ae:ad:44:08:3a:09:a3:82:03:3f:ea:21: - c9:2f:e5:14:c1:7e:19:76:e8:f3:a8:a8:51:26:86:00:f0:a9: - c4:e9:9b:12:ab:3e:4d:c4:1b:b6:87:39:69:77:cd:7b:d8:57: - b9:7f:f4:07:32:bf:07:cb:22:c4:35:fd:1b:a6:83:d6:ab:a4: - 76:b8:1d:de:72:16:e4:21:d3:31:fa:99:bd:6b:0d:8e:1b:8c: - 5a:02:53:ad:3b:f3:c4:25:fd:c7:ca:64:28:f6:49:54:2a:d6: - f8:85:bc:c1:a5:c1:aa:68:f5:00:a1:47:8f:c3:25:5b:e1:98: - da:75:2f:bb:a0:c5:9b:65:d8:ca:1f:3c:87:ec:d0:82:75:11: - 57:9c:db:b0:3c:d5:80:87:4d:67:44:d9:39:af:f1:88:de:be: - 45:68:56:bb:97:d3:20:1b:5a:f5:fa:f1:bf:c0:51:f6:b9:a3: - 9f:1b:11:ec:c9:b3:1d:b3:8e:a8:b3:0d:2c:35:77:ad:07:46: - 17:4c:83:f3:e3:7b:91:fe:e7:d9:e5:9f:c3:45:d0:14:9b:a8: - cb:5c:38:b0:d3:45:8a:e2:30:d6:71:6a:a0:16:26:69:d5:63: - 08:fa:69:bd:86:0d:67:31:f0:2d:c0:80:7c:14:c0:63:93:ac: - c1:8c:5a:b5 + 04:ad:23:1a:c8:33:0d:3a:b7:a2:db:58:ab:51:89:0f:48:11: + 53:88:36:74:51:c3:69:9a:ed:26:9f:24:f9:9b:a1:5d:31:26: + 29:ce:3c:91:ce:37:d4:d6:50:30:e1:85:65:35:71:bc:20:f9: + 27:22:5c:cf:aa:83:32:ff:f5:77:2b:79:31:d7:5f:21:8b:34: + 14:83:d5:f4:e5:fc:f3:76:4a:09:d0:e8:d4:1b:c4:03:4e:a0: + a8:8a:e9:db:2e:33:e2:0b:58:70:76:37:d8:78:60:a2:78:9b: + af:62:0e:b4:cb:d9:51:0d:5f:dd:a5:c7:49:60:30:8d:35:46: + d1:7c:02:c0:2e:ae:74:36:dd:ef:ee:16:46:05:d2:16:ff:24: + e0:27:f5:35:01:4d:86:76:52:b4:81:c8:69:f1:62:c1:a1:28: + a5:0e:ae:d3:8f:80:a6:51:69:d6:db:8b:04:a0:cd:81:97:a2: + b5:09:e7:4f:21:75:07:30:fe:19:c5:8b:26:2d:6c:61:92:b0: + 0c:01:3d:78:50:18:12:66:58:d9:66:a7:79:72:87:52:12:bd: + 16:cf:fb:ab:6e:7b:8f:ac:0d:84:16:36:f6:87:27:95:6c:62: + b2:60:94:cb:83:69:42:96:98:5d:d2:a8:c4:b4:89:c0:f8:b8: + 7a:f0:7b:b8 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -80,10 +80,10 @@ DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkktSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAeFBzIICHrq1ECDoJo4IDP+ohyS/lFMF+ -GXbo86ioUSaGAPCpxOmbEqs+TcQbtoc5aXfNe9hXuX/0BzK/B8sixDX9G6aD1quk -drgd3nIW5CHTMfqZvWsNjhuMWgJTrTvzxCX9x8pkKPZJVCrW+IW8waXBqmj1AKFH -j8MlW+GY2nUvu6DFm2XYyh88h+zQgnURV5zbsDzVgIdNZ0TZOa/xiN6+RWhWu5fT -IBta9frxv8BR9rmjnxsR7MmzHbOOqLMNLDV3rQdGF0yD8+N7kf7n2eWfw0XQFJuo -y1w4sNNFiuIw1nFqoBYmadVjCPppvYYNZzHwLcCAfBTAY5OswYxatQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEABK0jGsgzDTq3ottYq1GJD0gRU4g2dFHD +aZrtJp8k+ZuhXTEmKc48kc431NZQMOGFZTVxvCD5JyJcz6qDMv/1dyt5MddfIYs0 +FIPV9OX883ZKCdDo1BvEA06gqIrp2y4z4gtYcHY32Hhgonibr2IOtMvZUQ1f3aXH +SWAwjTVG0XwCwC6udDbd7+4WRgXSFv8k4Cf1NQFNhnZStIHIafFiwaEopQ6u04+A +plFp1tuLBKDNgZeitQnnTyF1BzD+GcWLJi1sYZKwDAE9eFAYEmZY2WaneXKHUhK9 +Fs/7q257j6wNhBY29ocnlWxismCUy4NpQpaYXdKoxLSJwPi4evB7uA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA2-no_pathlen.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA2-no_pathlen.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA2-no_pathlen.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA2-no_pathlen.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0b:80:62:fa:ce:ce:c0:cc:0c:ac:20:c7:15:4f:0f:64:b6:17: - 9b:e8:f1:aa:3d:db:b7:cc:18:10:63:24:86:f7:9b:40:d5:05: - c8:9e:c3:0b:d5:1e:e3:dc:34:a7:66:2a:75:1e:bb:5d:31:ff: - dd:79:f6:41:68:9a:5e:4d:9b:61:02:6b:c6:62:da:ca:46:3b: - b2:ac:6a:74:bb:91:0e:a6:d2:7d:51:5e:c0:11:6e:7f:e3:da: - 58:48:58:ed:fa:70:8d:bd:c2:ef:9e:df:b1:51:4b:ee:c8:e8: - e4:2c:e3:d3:96:0b:e9:ea:82:9d:e4:78:d6:cb:84:c0:b3:39: - 3f:dd:2f:e2:e8:9c:09:58:58:d3:f4:64:9c:35:b0:ee:bf:6e: - f3:a2:f6:0e:31:7b:78:df:d6:d0:e6:29:1d:d1:af:fc:ee:c3: - 54:7b:9a:8c:8d:47:eb:40:01:4f:2b:08:bd:d7:17:b1:bc:ce: - 2c:de:db:1a:d4:6b:ad:c2:c2:42:86:5b:63:71:95:ec:88:f2: - 71:86:c9:b7:99:85:1f:06:dc:43:05:a2:37:17:c7:65:88:75: - 46:23:4c:ce:fa:1d:e6:29:ba:76:ba:42:ed:ea:5e:5c:7d:a2: - 2a:54:10:3a:72:ef:c0:52:2d:9f:a4:c7:2a:29:53:b7:a9:51: - aa:51:0a:59 + 14:61:ba:15:45:07:60:d4:c9:6d:ef:6f:74:2a:44:b5:34:a4: + df:0e:d9:f1:7b:7c:cb:50:db:d7:17:d3:9d:91:64:01:1b:93: + 0d:b5:51:07:16:77:5f:2a:b5:9a:24:39:19:fc:ee:4d:79:4f: + c3:a3:9f:a1:07:e8:a3:0c:7e:04:0c:b0:33:a1:96:21:d2:ce: + 88:41:28:88:82:39:7f:9d:54:2d:4c:56:df:41:8e:4a:59:69: + 84:0b:fc:5d:47:06:84:ec:ae:4d:52:34:b2:1a:e8:61:e0:51: + 8c:87:ad:c9:5d:f3:2e:bb:5b:36:d2:91:71:7f:f9:cf:f9:7f: + c3:2d:e5:7d:a7:fb:8a:2f:47:24:6c:3a:75:72:9b:c8:74:6f: + 17:95:a4:d4:96:b4:3e:91:bf:c1:eb:89:18:ba:c3:e1:52:f8: + e8:a4:92:1b:c9:d8:a7:11:40:bf:62:9a:e6:ee:70:0a:f5:a3: + 6d:06:0f:59:ad:53:8a:f6:b8:93:dc:39:59:b7:97:c2:3c:e2: + 3b:e8:9f:5a:c9:42:35:d2:39:32:d8:9a:1d:3f:52:e6:cd:0b: + f9:d0:be:d8:ad:09:11:d7:6b:c2:c3:2e:d2:9b:92:99:a0:a8: + c9:0e:30:41:0e:73:77:48:ac:8b:69:28:3b:1c:76:b3:da:7f: + bd:04:95:07 -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSS1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzM1oXDTI2MDkwODIyMTkzM1owgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkktSUNBMi1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -80,10 +80,10 @@ bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQALgGL6zs7AzAysIMcVTw9ktheb6PGqPdu3zBgQYySG95tA1QXInsML -1R7j3DSnZip1HrtdMf/defZBaJpeTZthAmvGYtrKRjuyrGp0u5EOptJ9UV7AEW5/ -49pYSFjt+nCNvcLvnt+xUUvuyOjkLOPTlgvp6oKd5HjWy4TAszk/3S/i6JwJWFjT -9GScNbDuv27zovYOMXt439bQ5ikd0a/87sNUe5qMjUfrQAFPKwi91xexvM4s3tsa -1GutwsJChltjcZXsiPJxhsm3mYUfBtxDBaI3F8dliHVGI0zO+h3mKbp2ukLt6l5c -faIqVBA6cu/AUi2fpMcqKVO3qVGqUQpZ +CwUAA4IBAQAUYboVRQdg1Mlt7290KkS1NKTfDtnxe3zLUNvXF9OdkWQBG5MNtVEH +FndfKrWaJDkZ/O5NeU/Do5+hB+ijDH4EDLAzoZYh0s6IQSiIgjl/nVQtTFbfQY5K +WWmEC/xdRwaE7K5NUjSyGuhh4FGMh63JXfMuu1s20pFxf/nP+X/DLeV9p/uKL0ck +bDp1cpvIdG8XlaTUlrQ+kb/B64kYusPhUvjopJIbydinEUC/Yprm7nAK9aNtBg9Z +rVOK9riT3DlZt5fCPOI76J9ayUI10jky2JodP1LmzQv50L7YrQkR12vCwy7Sm5KZ +oKjJDjBBDnN3SKyLaSg7HHaz2n+9BJUH -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA3-pathlen2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA3-pathlen2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA3-pathlen2.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-ICA3-pathlen2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 2f:e9:19:e4:18:04:44:46:80:ee:e5:9f:a0:48:72:75:2e:c5: - dd:d1:6b:53:68:36:f3:2b:7c:78:2c:7f:1e:1b:2d:24:79:76: - 75:48:c6:4e:73:99:4b:a1:3b:40:e0:c8:7b:eb:b4:80:ae:49: - 65:4c:e1:13:39:a2:97:b6:e8:19:66:9c:34:31:d9:57:3f:ea: - d0:9b:3e:f1:6b:ec:7d:86:cf:13:d4:f4:4e:d8:da:5c:17:6b: - 0a:10:c3:8c:89:de:b5:50:f3:3d:68:9e:36:47:09:44:b9:e5: - 6c:43:8c:16:f9:da:32:e7:2a:32:df:7a:55:94:33:10:fd:82: - bb:94:c1:76:04:c8:0e:89:0b:ac:dd:a1:ce:61:02:a7:0d:81: - c7:33:d8:98:4a:26:97:8b:e8:0f:24:ad:3e:32:73:10:02:23: - 77:52:ca:92:bf:16:de:cf:bc:87:bf:cc:6f:2b:28:f9:77:4e: - 32:02:82:a8:2e:3a:37:6f:b7:26:2c:84:d4:66:ea:da:27:37: - ba:26:16:40:a0:4a:f6:31:c0:de:5f:e9:b1:79:94:44:4d:29: - cb:3d:32:45:45:a4:e9:ef:a8:18:f5:b4:66:86:45:42:e2:59: - 6c:ae:38:09:81:23:4e:19:7c:f8:b7:71:eb:a8:33:28:7c:88: - 2c:0e:5e:ae + 0b:91:da:f2:ae:94:93:70:85:33:26:3d:4b:23:65:52:a3:be: + 0a:ed:7c:04:16:fa:f1:5f:3b:e2:06:f7:8e:03:41:46:bc:e9: + 79:41:ff:09:a0:77:6c:58:a6:c7:0c:1d:8b:c0:f7:6c:82:93: + 74:96:18:8a:ce:a0:00:19:46:0a:0c:d1:7a:40:66:46:ad:14: + 9b:7f:bb:2f:88:c2:94:39:49:05:36:e7:f2:b0:04:44:49:e8: + 99:07:6e:50:f0:61:18:a3:4a:e0:35:06:6a:7d:af:ac:f1:93: + fd:43:92:12:41:66:fc:60:8f:37:12:43:45:c6:38:9e:8a:e8: + 4c:1d:48:7a:62:d2:e1:f4:99:12:5b:98:5a:2e:59:07:86:64: + af:4d:33:2e:e7:26:f2:68:7b:1e:4e:1b:60:bd:5d:19:d3:7c: + 04:32:26:ea:23:33:6f:8d:30:27:84:4a:3d:8a:63:4f:02:81: + 5a:ab:ea:ae:58:0a:ce:7e:74:a1:75:6a:c4:64:ae:a7:0a:31: + 2f:41:ed:c5:12:7c:4a:34:e8:6d:22:f4:9f:3d:f2:4a:8c:ee: + 7c:e7:81:50:e0:e5:f0:52:7d:28:79:3a:5a:c4:85:fb:7b:e6: + 26:1f:71:47:c6:97:8b:4d:39:eb:4b:46:4c:d7:d7:d3:15:b6: + 82:78:83:17 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSS1JQ0Ez LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -78,12 +78,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAC/pGeQYBERGgO7ln6BIcnUuxd3Ra1NoNvMrfHgsfx4b -LSR5dnVIxk5zmUuhO0DgyHvrtICuSWVM4RM5ope26BlmnDQx2Vc/6tCbPvFr7H2G -zxPU9E7Y2lwXawoQw4yJ3rVQ8z1onjZHCUS55WxDjBb52jLnKjLfelWUMxD9gruU -wXYEyA6JC6zdoc5hAqcNgccz2JhKJpeL6A8krT4ycxACI3dSypK/Ft7PvIe/zG8r -KPl3TjICgqguOjdvtyYshNRm6tonN7omFkCgSvYxwN5f6bF5lERNKcs9MkVFpOnv -qBj1tGaGRULiWWyuOAmBI04ZfPi3ceuoMyh8iCwOXq4= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAAuR2vKulJNwhTMmPUsjZVKjvgrtfAQW+vFfO+IG944D +QUa86XlB/wmgd2xYpscMHYvA92yCk3SWGIrOoAAZRgoM0XpAZkatFJt/uy+IwpQ5 +SQU25/KwBERJ6JkHblDwYRijSuA1Bmp9r6zxk/1DkhJBZvxgjzcSQ0XGOJ6K6Ewd +SHpi0uH0mRJbmFouWQeGZK9NMy7nJvJoex5OG2C9XRnTfAQyJuojM2+NMCeESj2K +Y08CgVqr6q5YCs5+dKF1asRkrqcKMS9B7cUSfEo06G0i9J898kqM7nzngVDg5fBS +fSh5OlrEhft75iYfcUfGl4tNOetLRkzX19MVtoJ4gxc= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 7a:19:8d:a9:ab:4e:b7:89:d0:db:65:49:18:dc:23:9e:71:bf: - 28:c6:54:de:dd:e4:9a:bf:89:be:2b:3e:fb:1f:47:dc:1e:e9: - 8f:3d:b1:4e:7d:63:3b:48:12:8c:cc:c9:98:6f:35:c1:9f:26: - ed:f6:e5:50:55:84:94:c0:8e:e3:78:49:8d:21:33:41:03:10: - 9a:16:27:0b:33:90:18:3a:f4:1e:59:75:3e:c2:9d:b8:58:fe: - 52:26:11:95:f1:14:f9:17:2f:f6:6a:a5:e3:03:af:94:a4:18: - 71:82:63:aa:ad:d0:55:08:48:bd:80:16:cf:36:8a:f2:69:2f: - fd:e0:72:96:2e:b3:75:c5:8f:60:b9:46:a0:e0:ad:a2:54:2e: - b9:f9:c0:ab:a5:e2:88:47:9a:ec:a7:c9:e3:74:22:90:57:a4: - 03:b4:2f:33:bf:e6:58:35:3f:75:b3:5f:b7:aa:f8:d5:2a:7f: - 4a:bd:55:4e:d6:e6:a4:25:67:aa:99:57:4b:ca:28:7a:d8:78: - 08:51:a2:95:53:e1:04:6a:48:3f:85:57:f0:81:53:9b:80:87: - 24:da:d9:7e:c0:6c:a8:f1:75:50:7f:d4:0c:ba:c6:9a:16:f1: - 00:5e:25:c5:99:7f:44:f1:39:c6:72:bd:e5:4a:ff:3a:89:15: - 25:3c:2e:28 + 03:42:31:e4:a2:3f:2a:7a:a6:7e:87:61:8b:2c:a1:10:af:b4: + 06:db:3f:77:85:88:c4:db:df:78:3d:d2:aa:aa:ac:cd:19:c1: + a7:47:66:e2:91:9b:59:ab:70:e0:74:1a:a7:b4:5c:30:3f:ea: + a3:14:6a:aa:3e:82:38:7d:2f:db:6f:43:60:db:20:cb:e4:69: + 62:73:75:d8:22:db:c3:92:cb:96:d3:7c:5a:ca:d5:3a:d1:91: + 20:2c:37:0f:3d:ef:8e:ca:0b:8b:73:af:79:66:ec:84:93:41: + 71:a1:6d:86:57:1b:d9:83:7e:c0:18:b6:4f:3c:85:89:59:c8: + 99:1e:e7:53:5d:2b:41:7c:24:d0:9a:73:43:b3:ee:69:de:60: + 08:b9:f0:b2:ac:b5:24:70:06:b7:1e:7b:fd:30:07:80:24:45: + c5:4f:84:e7:a6:67:99:0b:42:45:38:54:90:01:49:b2:14:31: + 48:09:2b:83:3e:37:2e:d5:fd:92:7b:4f:cb:2f:ea:0d:e7:d7: + 07:62:6e:2e:c3:a4:64:e2:54:52:6e:66:41:a9:0d:68:3f:76: + 8f:e9:42:3d:a2:23:b9:ed:fc:52:f5:d4:96:29:81:fd:80:39: + 71:16:3c:df:c9:2f:ad:c3:83:56:f5:85:55:89:e6:c9:23:f6: + eb:0e:c7:34 -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,12 +78,12 @@ FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -ehmNqatOt4nQ22VJGNwjnnG/KMZU3t3kmr+Jvis++x9H3B7pjz2xTn1jO0gSjMzJ -mG81wZ8m7fblUFWElMCO43hJjSEzQQMQmhYnCzOQGDr0Hll1PsKduFj+UiYRlfEU -+Rcv9mql4wOvlKQYcYJjqq3QVQhIvYAWzzaK8mkv/eByli6zdcWPYLlGoOCtolQu -ufnAq6XiiEea7KfJ43QikFekA7QvM7/mWDU/dbNft6r41Sp/Sr1VTtbmpCVnqplX -S8ooeth4CFGilVPhBGpIP4VX8IFTm4CHJNrZfsBsqPF1UH/UDLrGmhbxAF4lxZl/ -RPE5xnK95Ur/OokVJTwuKA== +A0Ix5KI/KnqmfodhiyyhEK+0Bts/d4WIxNvfeD3SqqqszRnBp0dm4pGbWatw4HQa +p7RcMD/qoxRqqj6COH0v229DYNsgy+RpYnN12CLbw5LLltN8WsrVOtGRICw3Dz3v +jsoLi3OveWbshJNBcaFthlcb2YN+wBi2TzyFiVnImR7nU10rQXwk0JpzQ7Puad5g +CLnwsqy1JHAGtx57/TAHgCRFxU+E56ZnmQtCRThUkAFJshQxSAkrgz43LtX9kntP +yy/qDefXB2JuLsOkZOJUUm5mQakNaD92j+lCPaIjue38UvXUlimB/YA5cRY838kv +rcODVvWFVYnmySP26w7HNA== -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 78:50:73:20:80:87:ae:ad:44:08:3a:09:a3:82:03:3f:ea:21: - c9:2f:e5:14:c1:7e:19:76:e8:f3:a8:a8:51:26:86:00:f0:a9: - c4:e9:9b:12:ab:3e:4d:c4:1b:b6:87:39:69:77:cd:7b:d8:57: - b9:7f:f4:07:32:bf:07:cb:22:c4:35:fd:1b:a6:83:d6:ab:a4: - 76:b8:1d:de:72:16:e4:21:d3:31:fa:99:bd:6b:0d:8e:1b:8c: - 5a:02:53:ad:3b:f3:c4:25:fd:c7:ca:64:28:f6:49:54:2a:d6: - f8:85:bc:c1:a5:c1:aa:68:f5:00:a1:47:8f:c3:25:5b:e1:98: - da:75:2f:bb:a0:c5:9b:65:d8:ca:1f:3c:87:ec:d0:82:75:11: - 57:9c:db:b0:3c:d5:80:87:4d:67:44:d9:39:af:f1:88:de:be: - 45:68:56:bb:97:d3:20:1b:5a:f5:fa:f1:bf:c0:51:f6:b9:a3: - 9f:1b:11:ec:c9:b3:1d:b3:8e:a8:b3:0d:2c:35:77:ad:07:46: - 17:4c:83:f3:e3:7b:91:fe:e7:d9:e5:9f:c3:45:d0:14:9b:a8: - cb:5c:38:b0:d3:45:8a:e2:30:d6:71:6a:a0:16:26:69:d5:63: - 08:fa:69:bd:86:0d:67:31:f0:2d:c0:80:7c:14:c0:63:93:ac: - c1:8c:5a:b5 + 04:ad:23:1a:c8:33:0d:3a:b7:a2:db:58:ab:51:89:0f:48:11: + 53:88:36:74:51:c3:69:9a:ed:26:9f:24:f9:9b:a1:5d:31:26: + 29:ce:3c:91:ce:37:d4:d6:50:30:e1:85:65:35:71:bc:20:f9: + 27:22:5c:cf:aa:83:32:ff:f5:77:2b:79:31:d7:5f:21:8b:34: + 14:83:d5:f4:e5:fc:f3:76:4a:09:d0:e8:d4:1b:c4:03:4e:a0: + a8:8a:e9:db:2e:33:e2:0b:58:70:76:37:d8:78:60:a2:78:9b: + af:62:0e:b4:cb:d9:51:0d:5f:dd:a5:c7:49:60:30:8d:35:46: + d1:7c:02:c0:2e:ae:74:36:dd:ef:ee:16:46:05:d2:16:ff:24: + e0:27:f5:35:01:4d:86:76:52:b4:81:c8:69:f1:62:c1:a1:28: + a5:0e:ae:d3:8f:80:a6:51:69:d6:db:8b:04:a0:cd:81:97:a2: + b5:09:e7:4f:21:75:07:30:fe:19:c5:8b:26:2d:6c:61:92:b0: + 0c:01:3d:78:50:18:12:66:58:d9:66:a7:79:72:87:52:12:bd: + 16:cf:fb:ab:6e:7b:8f:ac:0d:84:16:36:f6:87:27:95:6c:62: + b2:60:94:cb:83:69:42:96:98:5d:d2:a8:c4:b4:89:c0:f8:b8: + 7a:f0:7b:b8 -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -167,12 +167,12 @@ DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkktSUNBMy1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAeFBzIICHrq1ECDoJo4IDP+ohyS/lFMF+ -GXbo86ioUSaGAPCpxOmbEqs+TcQbtoc5aXfNe9hXuX/0BzK/B8sixDX9G6aD1quk -drgd3nIW5CHTMfqZvWsNjhuMWgJTrTvzxCX9x8pkKPZJVCrW+IW8waXBqmj1AKFH -j8MlW+GY2nUvu6DFm2XYyh88h+zQgnURV5zbsDzVgIdNZ0TZOa/xiN6+RWhWu5fT -IBta9frxv8BR9rmjnxsR7MmzHbOOqLMNLDV3rQdGF0yD8+N7kf7n2eWfw0XQFJuo -y1w4sNNFiuIw1nFqoBYmadVjCPppvYYNZzHwLcCAfBTAY5OswYxatQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEABK0jGsgzDTq3ottYq1GJD0gRU4g2dFHD +aZrtJp8k+ZuhXTEmKc48kc431NZQMOGFZTVxvCD5JyJcz6qDMv/1dyt5MddfIYs0 +FIPV9OX883ZKCdDo1BvEA06gqIrp2y4z4gtYcHY32Hhgonibr2IOtMvZUQ1f3aXH +SWAwjTVG0XwCwC6udDbd7+4WRgXSFv8k4Cf1NQFNhnZStIHIafFiwaEopQ6u04+A +plFp1tuLBKDNgZeitQnnTyF1BzD+GcWLJi1sYZKwDAE9eFAYEmZY2WaneXKHUhK9 +Fs/7q257j6wNhBY29ocnlWxismCUy4NpQpaYXdKoxLSJwPi4evB7uA== -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 0b:80:62:fa:ce:ce:c0:cc:0c:ac:20:c7:15:4f:0f:64:b6:17: - 9b:e8:f1:aa:3d:db:b7:cc:18:10:63:24:86:f7:9b:40:d5:05: - c8:9e:c3:0b:d5:1e:e3:dc:34:a7:66:2a:75:1e:bb:5d:31:ff: - dd:79:f6:41:68:9a:5e:4d:9b:61:02:6b:c6:62:da:ca:46:3b: - b2:ac:6a:74:bb:91:0e:a6:d2:7d:51:5e:c0:11:6e:7f:e3:da: - 58:48:58:ed:fa:70:8d:bd:c2:ef:9e:df:b1:51:4b:ee:c8:e8: - e4:2c:e3:d3:96:0b:e9:ea:82:9d:e4:78:d6:cb:84:c0:b3:39: - 3f:dd:2f:e2:e8:9c:09:58:58:d3:f4:64:9c:35:b0:ee:bf:6e: - f3:a2:f6:0e:31:7b:78:df:d6:d0:e6:29:1d:d1:af:fc:ee:c3: - 54:7b:9a:8c:8d:47:eb:40:01:4f:2b:08:bd:d7:17:b1:bc:ce: - 2c:de:db:1a:d4:6b:ad:c2:c2:42:86:5b:63:71:95:ec:88:f2: - 71:86:c9:b7:99:85:1f:06:dc:43:05:a2:37:17:c7:65:88:75: - 46:23:4c:ce:fa:1d:e6:29:ba:76:ba:42:ed:ea:5e:5c:7d:a2: - 2a:54:10:3a:72:ef:c0:52:2d:9f:a4:c7:2a:29:53:b7:a9:51: - aa:51:0a:59 + 14:61:ba:15:45:07:60:d4:c9:6d:ef:6f:74:2a:44:b5:34:a4: + df:0e:d9:f1:7b:7c:cb:50:db:d7:17:d3:9d:91:64:01:1b:93: + 0d:b5:51:07:16:77:5f:2a:b5:9a:24:39:19:fc:ee:4d:79:4f: + c3:a3:9f:a1:07:e8:a3:0c:7e:04:0c:b0:33:a1:96:21:d2:ce: + 88:41:28:88:82:39:7f:9d:54:2d:4c:56:df:41:8e:4a:59:69: + 84:0b:fc:5d:47:06:84:ec:ae:4d:52:34:b2:1a:e8:61:e0:51: + 8c:87:ad:c9:5d:f3:2e:bb:5b:36:d2:91:71:7f:f9:cf:f9:7f: + c3:2d:e5:7d:a7:fb:8a:2f:47:24:6c:3a:75:72:9b:c8:74:6f: + 17:95:a4:d4:96:b4:3e:91:bf:c1:eb:89:18:ba:c3:e1:52:f8: + e8:a4:92:1b:c9:d8:a7:11:40:bf:62:9a:e6:ee:70:0a:f5:a3: + 6d:06:0f:59:ad:53:8a:f6:b8:93:dc:39:59:b7:97:c2:3c:e2: + 3b:e8:9f:5a:c9:42:35:d2:39:32:d8:9a:1d:3f:52:e6:cd:0b: + f9:d0:be:d8:ad:09:11:d7:6b:c2:c3:2e:d2:9b:92:99:a0:a8: + c9:0e:30:41:0e:73:77:48:ac:8b:69:28:3b:1c:76:b3:da:7f: + bd:04:95:07 -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSS1JQ0EzLXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzM1oXDTI2MDkwODIyMTkzM1owgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkktSUNBMi1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -256,12 +256,12 @@ bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQALgGL6zs7AzAysIMcVTw9ktheb6PGqPdu3zBgQYySG95tA1QXInsML -1R7j3DSnZip1HrtdMf/defZBaJpeTZthAmvGYtrKRjuyrGp0u5EOptJ9UV7AEW5/ -49pYSFjt+nCNvcLvnt+xUUvuyOjkLOPTlgvp6oKd5HjWy4TAszk/3S/i6JwJWFjT -9GScNbDuv27zovYOMXt439bQ5ikd0a/87sNUe5qMjUfrQAFPKwi91xexvM4s3tsa -1GutwsJChltjcZXsiPJxhsm3mYUfBtxDBaI3F8dliHVGI0zO+h3mKbp2ukLt6l5c -faIqVBA6cu/AUi2fpMcqKVO3qVGqUQpZ +CwUAA4IBAQAUYboVRQdg1Mlt7290KkS1NKTfDtnxe3zLUNvXF9OdkWQBG5MNtVEH +FndfKrWaJDkZ/O5NeU/Do5+hB+ijDH4EDLAzoZYh0s6IQSiIgjl/nVQtTFbfQY5K +WWmEC/xdRwaE7K5NUjSyGuhh4FGMh63JXfMuu1s20pFxf/nP+X/DLeV9p/uKL0ck +bDp1cpvIdG8XlaTUlrQ+kb/B64kYusPhUvjopJIbydinEUC/Yprm7nAK9aNtBg9Z +rVOK9riT3DlZt5fCPOI76J9ayUI10jky2JodP1LmzQv50L7YrQkR12vCwy7Sm5KZ +oKjJDjBBDnN3SKyLaSg7HHaz2n+9BJUH -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA3-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -302,34 +302,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 2f:e9:19:e4:18:04:44:46:80:ee:e5:9f:a0:48:72:75:2e:c5: - dd:d1:6b:53:68:36:f3:2b:7c:78:2c:7f:1e:1b:2d:24:79:76: - 75:48:c6:4e:73:99:4b:a1:3b:40:e0:c8:7b:eb:b4:80:ae:49: - 65:4c:e1:13:39:a2:97:b6:e8:19:66:9c:34:31:d9:57:3f:ea: - d0:9b:3e:f1:6b:ec:7d:86:cf:13:d4:f4:4e:d8:da:5c:17:6b: - 0a:10:c3:8c:89:de:b5:50:f3:3d:68:9e:36:47:09:44:b9:e5: - 6c:43:8c:16:f9:da:32:e7:2a:32:df:7a:55:94:33:10:fd:82: - bb:94:c1:76:04:c8:0e:89:0b:ac:dd:a1:ce:61:02:a7:0d:81: - c7:33:d8:98:4a:26:97:8b:e8:0f:24:ad:3e:32:73:10:02:23: - 77:52:ca:92:bf:16:de:cf:bc:87:bf:cc:6f:2b:28:f9:77:4e: - 32:02:82:a8:2e:3a:37:6f:b7:26:2c:84:d4:66:ea:da:27:37: - ba:26:16:40:a0:4a:f6:31:c0:de:5f:e9:b1:79:94:44:4d:29: - cb:3d:32:45:45:a4:e9:ef:a8:18:f5:b4:66:86:45:42:e2:59: - 6c:ae:38:09:81:23:4e:19:7c:f8:b7:71:eb:a8:33:28:7c:88: - 2c:0e:5e:ae + 0b:91:da:f2:ae:94:93:70:85:33:26:3d:4b:23:65:52:a3:be: + 0a:ed:7c:04:16:fa:f1:5f:3b:e2:06:f7:8e:03:41:46:bc:e9: + 79:41:ff:09:a0:77:6c:58:a6:c7:0c:1d:8b:c0:f7:6c:82:93: + 74:96:18:8a:ce:a0:00:19:46:0a:0c:d1:7a:40:66:46:ad:14: + 9b:7f:bb:2f:88:c2:94:39:49:05:36:e7:f2:b0:04:44:49:e8: + 99:07:6e:50:f0:61:18:a3:4a:e0:35:06:6a:7d:af:ac:f1:93: + fd:43:92:12:41:66:fc:60:8f:37:12:43:45:c6:38:9e:8a:e8: + 4c:1d:48:7a:62:d2:e1:f4:99:12:5b:98:5a:2e:59:07:86:64: + af:4d:33:2e:e7:26:f2:68:7b:1e:4e:1b:60:bd:5d:19:d3:7c: + 04:32:26:ea:23:33:6f:8d:30:27:84:4a:3d:8a:63:4f:02:81: + 5a:ab:ea:ae:58:0a:ce:7e:74:a1:75:6a:c4:64:ae:a7:0a:31: + 2f:41:ed:c5:12:7c:4a:34:e8:6d:22:f4:9f:3d:f2:4a:8c:ee: + 7c:e7:81:50:e0:e5:f0:52:7d:28:79:3a:5a:c4:85:fb:7b:e6: + 26:1f:71:47:c6:97:8b:4d:39:eb:4b:46:4c:d7:d7:d3:15:b6: + 82:78:83:17 -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSS1JQ0Ez LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -343,12 +343,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBAC/pGeQYBERGgO7ln6BIcnUuxd3Ra1NoNvMrfHgsfx4b -LSR5dnVIxk5zmUuhO0DgyHvrtICuSWVM4RM5ope26BlmnDQx2Vc/6tCbPvFr7H2G -zxPU9E7Y2lwXawoQw4yJ3rVQ8z1onjZHCUS55WxDjBb52jLnKjLfelWUMxD9gruU -wXYEyA6JC6zdoc5hAqcNgccz2JhKJpeL6A8krT4ycxACI3dSypK/Ft7PvIe/zG8r -KPl3TjICgqguOjdvtyYshNRm6tonN7omFkCgSvYxwN5f6bF5lERNKcs9MkVFpOnv -qBj1tGaGRULiWWyuOAmBI04ZfPi3ceuoMyh8iCwOXq4= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAAuR2vKulJNwhTMmPUsjZVKjvgrtfAQW+vFfO+IG944D +QUa86XlB/wmgd2xYpscMHYvA92yCk3SWGIrOoAAZRgoM0XpAZkatFJt/uy+IwpQ5 +SQU25/KwBERJ6JkHblDwYRijSuA1Bmp9r6zxk/1DkhJBZvxgjzcSQ0XGOJ6K6Ewd +SHpi0uH0mRJbmFouWQeGZK9NMy7nJvJoex5OG2C9XRnTfAQyJuojM2+NMCeESj2K +Y08CgVqr6q5YCs5+dKF1asRkrqcKMS9B7cUSfEo06G0i9J898kqM7nzngVDg5fBS +fSh5OlrEhft75iYfcUfGl4tNOetLRkzX19MVtoJ4gxc= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainI-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainI-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 7a:19:8d:a9:ab:4e:b7:89:d0:db:65:49:18:dc:23:9e:71:bf: - 28:c6:54:de:dd:e4:9a:bf:89:be:2b:3e:fb:1f:47:dc:1e:e9: - 8f:3d:b1:4e:7d:63:3b:48:12:8c:cc:c9:98:6f:35:c1:9f:26: - ed:f6:e5:50:55:84:94:c0:8e:e3:78:49:8d:21:33:41:03:10: - 9a:16:27:0b:33:90:18:3a:f4:1e:59:75:3e:c2:9d:b8:58:fe: - 52:26:11:95:f1:14:f9:17:2f:f6:6a:a5:e3:03:af:94:a4:18: - 71:82:63:aa:ad:d0:55:08:48:bd:80:16:cf:36:8a:f2:69:2f: - fd:e0:72:96:2e:b3:75:c5:8f:60:b9:46:a0:e0:ad:a2:54:2e: - b9:f9:c0:ab:a5:e2:88:47:9a:ec:a7:c9:e3:74:22:90:57:a4: - 03:b4:2f:33:bf:e6:58:35:3f:75:b3:5f:b7:aa:f8:d5:2a:7f: - 4a:bd:55:4e:d6:e6:a4:25:67:aa:99:57:4b:ca:28:7a:d8:78: - 08:51:a2:95:53:e1:04:6a:48:3f:85:57:f0:81:53:9b:80:87: - 24:da:d9:7e:c0:6c:a8:f1:75:50:7f:d4:0c:ba:c6:9a:16:f1: - 00:5e:25:c5:99:7f:44:f1:39:c6:72:bd:e5:4a:ff:3a:89:15: - 25:3c:2e:28 + 03:42:31:e4:a2:3f:2a:7a:a6:7e:87:61:8b:2c:a1:10:af:b4: + 06:db:3f:77:85:88:c4:db:df:78:3d:d2:aa:aa:ac:cd:19:c1: + a7:47:66:e2:91:9b:59:ab:70:e0:74:1a:a7:b4:5c:30:3f:ea: + a3:14:6a:aa:3e:82:38:7d:2f:db:6f:43:60:db:20:cb:e4:69: + 62:73:75:d8:22:db:c3:92:cb:96:d3:7c:5a:ca:d5:3a:d1:91: + 20:2c:37:0f:3d:ef:8e:ca:0b:8b:73:af:79:66:ec:84:93:41: + 71:a1:6d:86:57:1b:d9:83:7e:c0:18:b6:4f:3c:85:89:59:c8: + 99:1e:e7:53:5d:2b:41:7c:24:d0:9a:73:43:b3:ee:69:de:60: + 08:b9:f0:b2:ac:b5:24:70:06:b7:1e:7b:fd:30:07:80:24:45: + c5:4f:84:e7:a6:67:99:0b:42:45:38:54:90:01:49:b2:14:31: + 48:09:2b:83:3e:37:2e:d5:fd:92:7b:4f:cb:2f:ea:0d:e7:d7: + 07:62:6e:2e:c3:a4:64:e2:54:52:6e:66:41:a9:0d:68:3f:76: + 8f:e9:42:3d:a2:23:b9:ed:fc:52:f5:d4:96:29:81:fd:80:39: + 71:16:3c:df:c9:2f:ad:c3:83:56:f5:85:55:89:e6:c9:23:f6: + eb:0e:c7:34 -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSS1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSS1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,10 +78,10 @@ FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSS1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -ehmNqatOt4nQ22VJGNwjnnG/KMZU3t3kmr+Jvis++x9H3B7pjz2xTn1jO0gSjMzJ -mG81wZ8m7fblUFWElMCO43hJjSEzQQMQmhYnCzOQGDr0Hll1PsKduFj+UiYRlfEU -+Rcv9mql4wOvlKQYcYJjqq3QVQhIvYAWzzaK8mkv/eByli6zdcWPYLlGoOCtolQu -ufnAq6XiiEea7KfJ43QikFekA7QvM7/mWDU/dbNft6r41Sp/Sr1VTtbmpCVnqplX -S8ooeth4CFGilVPhBGpIP4VX8IFTm4CHJNrZfsBsqPF1UH/UDLrGmhbxAF4lxZl/ -RPE5xnK95Ur/OokVJTwuKA== +A0Ix5KI/KnqmfodhiyyhEK+0Bts/d4WIxNvfeD3SqqqszRnBp0dm4pGbWatw4HQa +p7RcMD/qoxRqqj6COH0v229DYNsgy+RpYnN12CLbw5LLltN8WsrVOtGRICw3Dz3v +jsoLi3OveWbshJNBcaFthlcb2YN+wBi2TzyFiVnImR7nU10rQXwk0JpzQ7Puad5g +CLnwsqy1JHAGtx57/TAHgCRFxU+E56ZnmQtCRThUkAFJshQxSAkrgz43LtX9kntP +yy/qDefXB2JuLsOkZOJUUm5mQakNaD92j+lCPaIjue38UvXUlimB/YA5cRY838kv +rcODVvWFVYnmySP26w7HNA== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA1-no_pathlen.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 8a:c2:bd:e8:d2:53:df:a2:01:71:2d:bd:24:c0:ce:3a:41:bc: - 86:24:51:4a:66:06:9e:1f:1f:c7:45:e2:db:ab:60:e8:89:ba: - 97:77:fe:d0:16:80:19:af:00:d0:2c:43:c3:b9:8c:6e:ff:5c: - 08:01:4a:a1:2c:ba:ba:db:96:f8:a1:d9:e7:65:2a:ee:d9:6d: - 73:7a:19:67:ed:67:69:30:13:fe:63:67:ec:e4:8c:89:37:11: - 82:c8:d5:3e:7b:bb:26:02:a0:10:44:72:51:d6:ea:33:9e:54: - 01:1a:5b:ed:0e:be:43:8f:a0:5b:dc:26:fa:e9:7c:20:e4:9a: - 6d:5b:87:c9:95:e5:7a:5b:2d:9a:9a:ab:65:37:9f:88:79:2c: - 10:83:82:32:76:1d:4f:f9:bf:8d:fd:2f:16:a7:d7:bb:64:41: - 6a:6d:02:9d:f5:f5:31:44:c5:64:56:9a:b8:a4:dd:88:ed:79: - 3b:f4:23:d7:0f:8a:2a:f3:f4:92:47:f5:f6:0f:19:e9:7c:6a: - fe:f0:62:c3:43:45:a2:6c:f5:2e:0b:c3:c5:8b:21:70:68:fc: - 58:63:91:1d:a4:35:eb:5b:4c:67:df:1d:4a:a3:a3:9e:16:a5: - 6b:e3:05:66:00:1e:03:aa:3f:0d:f8:2f:f7:f6:78:08:e0:b6: - 1f:20:0e:3d + 98:29:a6:c0:de:6c:d0:3d:c3:ff:d0:57:5f:83:48:bd:e0:80: + 1c:7a:e0:81:a9:5e:43:17:01:1b:c0:d6:89:30:eb:21:47:9e: + 8a:38:73:37:74:52:04:37:37:6e:7e:11:0e:f8:cb:c7:7c:4f: + 43:4f:07:64:56:7a:f7:66:4f:98:2f:6a:01:ae:04:72:64:03: + 32:88:e7:7e:60:ae:1e:16:93:4d:51:44:41:a7:b6:3e:19:e6: + 20:c9:30:3a:8f:86:77:b9:9c:c2:b8:f1:d9:7a:a9:10:cc:ce: + 95:46:bb:62:0d:d8:c8:78:37:51:51:2e:83:a8:5b:ef:fa:a0: + 34:bb:a3:93:66:b6:4f:72:25:fc:e2:39:1a:3a:3f:74:c5:94: + 88:0c:34:90:1e:f9:b0:d9:23:e4:29:33:4a:2f:59:c7:88:52: + c9:69:a9:6d:c7:8d:da:92:c3:4e:f3:c9:3c:5e:28:e1:ae:e0: + b7:ef:b4:07:18:70:b7:ea:2c:8a:e1:92:31:1c:71:26:cf:d5: + 5b:c6:fd:88:db:8b:30:36:41:91:b1:fd:63:c3:3e:b2:e2:64: + 5e:b2:ac:90:0c:6f:d5:21:4c:22:85:c5:0e:65:23:46:31:52: + 31:f5:42:d8:b3:78:bb:3e:d2:f0:69:61:b9:45:4e:6b:79:78: + a8:60:23:7a -----BEGIN CERTIFICATE----- MIIE1jCCA76gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -80,10 +80,10 @@ DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR8wHQYDVQQDDBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZI hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0P -BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCKwr3o0lPfogFxLb0kwM46QbyGJFFK -ZgaeHx/HReLbq2DoibqXd/7QFoAZrwDQLEPDuYxu/1wIAUqhLLq625b4odnnZSru -2W1zehln7WdpMBP+Y2fs5IyJNxGCyNU+e7smAqAQRHJR1uoznlQBGlvtDr5Dj6Bb -3Cb66Xwg5JptW4fJleV6Wy2amqtlN5+IeSwQg4Iydh1P+b+N/S8Wp9e7ZEFqbQKd -9fUxRMVkVpq4pN2I7Xk79CPXD4oq8/SSR/X2DxnpfGr+8GLDQ0WibPUuC8PFiyFw -aPxYY5EdpDXrW0xn3x1Ko6OeFqVr4wVmAB4Dqj8N+C/39ngI4LYfIA49 +BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCYKabA3mzQPcP/0Fdfg0i94IAceuCB +qV5DFwEbwNaJMOshR56KOHM3dFIENzdufhEO+MvHfE9DTwdkVnr3Zk+YL2oBrgRy +ZAMyiOd+YK4eFpNNUURBp7Y+GeYgyTA6j4Z3uZzCuPHZeqkQzM6VRrtiDdjIeDdR +US6DqFvv+qA0u6OTZrZPciX84jkaOj90xZSIDDSQHvmw2SPkKTNKL1nHiFLJaalt +x43aksNO88k8XijhruC377QHGHC36iyK4ZIxHHEmz9Vbxv2I24swNkGRsf1jwz6y +4mResqyQDG/VIUwihcUOZSNGMVIx9ULYs3i7PtLwaWG5RU5reXioYCN6 -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA2-no_pathlen.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 64:05:b5:78:b4:eb:f3:d5:be:5f:ec:27:6e:7d:ad:74:6c:da: - c4:2c:cf:fc:b9:4f:52:7f:b1:78:3a:de:f6:9a:97:f5:aa:a4: - ce:b0:2a:84:b5:33:5f:b4:55:b9:f9:03:58:ba:7a:86:8d:b7: - ff:e5:dd:69:b9:e8:40:76:cf:5b:8e:9c:a5:0b:df:35:da:d6: - 8c:72:b5:a6:92:d5:e5:7b:75:10:6c:89:33:0a:34:2d:ef:bb: - 72:6d:be:89:b0:b3:71:b4:50:a1:00:b7:01:d8:31:bf:db:40: - df:d1:1f:a8:16:e6:4b:2e:04:98:66:8c:73:43:50:95:73:80: - 0b:84:8f:2d:be:cb:6b:1b:1b:a1:78:d4:bd:b0:a5:b9:34:a9: - 3f:56:b0:0b:b2:dc:34:0f:e6:5f:42:8e:be:57:9d:40:49:6b: - 1d:f8:4d:03:30:4c:e4:d9:25:ad:3f:96:8c:3e:ac:e1:8f:34: - ee:65:50:a0:79:b0:1e:2c:85:0c:11:6d:02:d8:be:1c:d9:0a: - c5:01:4f:8b:a8:b3:91:0a:76:3a:a2:b0:cd:24:10:6e:e1:7f: - 0e:35:71:97:56:18:15:61:11:e1:4d:90:ff:67:2b:52:54:e9: - 44:27:2c:4f:fc:59:0f:e0:87:69:44:92:8d:d0:b6:db:8a:e2: - 70:0d:12:05 + 44:d2:b6:d0:85:31:bf:1f:a2:b1:91:6b:ee:dc:80:ac:29:81: + 0e:b4:c3:e8:8e:91:be:66:f2:44:61:8b:6c:44:17:d9:cd:15: + 40:bd:ce:7c:ca:7d:ad:c8:e1:81:90:a4:28:57:88:71:49:9f: + 03:bb:4b:8c:ff:02:08:98:d2:e4:b0:ca:be:f2:df:08:18:24: + f7:3c:22:be:f2:23:10:96:95:2b:f0:a0:ed:16:08:1a:1e:ce: + df:1d:f7:b3:35:af:f4:86:f2:16:b5:2c:90:bd:0a:f8:64:61: + da:c6:2e:4b:1f:05:30:1a:72:d3:51:33:26:61:5d:0d:14:0f: + b8:b9:dc:6f:78:57:a0:63:4c:f0:16:49:fd:48:54:c3:92:1e: + c0:04:8a:16:c0:9a:35:08:be:49:f2:dd:90:6a:90:48:d5:9f: + 48:82:18:f2:04:d6:d8:07:55:17:99:8e:27:cf:86:8d:1b:a6: + 02:72:42:a8:53:e6:5d:20:5a:8d:2e:d3:fc:a7:71:4c:b2:21: + 9d:14:8c:f1:49:3c:ca:e7:e6:c6:51:7f:41:3c:37:1a:38:21: + a4:ee:9e:1b:cc:8b:09:df:35:de:18:c4:7a:89:32:b9:8d:15: + eb:07:5b:2b:5c:55:a5:44:db:fb:f2:15:16:1c:01:16:dd:de: + d9:7a:bf:dc -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EzLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -80,10 +80,10 @@ DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkotSUNBNC1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAZAW1eLTr89W+X+wnbn2tdGzaxCzP/LlP -Un+xeDre9pqX9aqkzrAqhLUzX7RVufkDWLp6ho23/+XdabnoQHbPW46cpQvfNdrW -jHK1ppLV5Xt1EGyJMwo0Le+7cm2+ibCzcbRQoQC3Adgxv9tA39EfqBbmSy4EmGaM -c0NQlXOAC4SPLb7LaxsboXjUvbCluTSpP1awC7LcNA/mX0KOvledQElrHfhNAzBM -5NklrT+WjD6s4Y807mVQoHmwHiyFDBFtAti+HNkKxQFPi6izkQp2OqKwzSQQbuF/ -DjVxl1YYFWER4U2Q/2crUlTpRCcsT/xZD+CHaUSSjdC224ricA0SBQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEARNK20IUxvx+isZFr7tyArCmBDrTD6I6R +vmbyRGGLbEQX2c0VQL3OfMp9rcjhgZCkKFeIcUmfA7tLjP8CCJjS5LDKvvLfCBgk +9zwivvIjEJaVK/Cg7RYIGh7O3x33szWv9IbyFrUskL0K+GRh2sYuSx8FMBpy01Ez +JmFdDRQPuLncb3hXoGNM8BZJ/UhUw5IewASKFsCaNQi+SfLdkGqQSNWfSIIY8gTW +2AdVF5mOJ8+GjRumAnJCqFPmXSBajS7T/KdxTLIhnRSM8Uk8yufmxlF/QTw3Gjgh +pO6eG8yLCd813hjEeokyuY0V6wdbK1xVpUTb+/IVFhwBFt3e2Xq/3A== -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA3-no_pathlen.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -44,27 +44,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 6c:4e:a1:bd:fd:0a:46:ac:b3:94:e7:4b:20:99:1f:3e:4a:10: - 95:1d:21:f9:71:da:f6:4a:c9:dc:78:14:a9:5e:01:6b:40:8f: - 18:40:6e:6d:a5:82:91:19:79:0a:d1:5e:15:16:46:c0:05:5a: - 67:56:8a:14:8e:9c:09:61:bc:11:f8:4d:f8:66:8d:84:c5:7d: - e3:28:3d:ff:db:37:c4:08:48:4e:ce:0c:89:49:a6:a8:fc:d5: - 14:6f:e4:ae:cf:64:f4:21:3a:a9:58:fe:50:b2:5b:c2:14:a8: - 0f:3b:c7:c7:ae:ef:40:48:8c:35:cc:09:87:2d:6b:b3:95:a8: - ff:e9:c1:3a:88:48:a2:64:6c:2a:1c:a4:19:34:69:76:0d:e4: - 71:fc:46:f0:2f:17:fa:17:ed:c8:d4:af:d8:cc:d2:97:f1:93: - 5e:4c:37:a7:06:b0:c3:9e:a7:e3:f9:1d:ca:bf:e0:3d:8e:b1: - 30:8c:bc:4e:94:8c:0e:fa:41:29:e5:21:ba:77:f2:74:31:58: - fe:7c:c1:03:f5:28:2a:68:2b:ab:ba:87:61:b9:85:54:21:4d: - c0:22:35:4d:18:c2:a1:f3:70:56:e9:4b:a2:95:86:f5:c4:da: - 70:d6:bc:17:67:c8:f2:3d:1f:80:0f:78:85:52:30:5b:6e:eb: - 6f:b7:bb:a2 + 47:22:2e:50:b3:0b:ed:17:f9:70:a3:71:3e:8d:55:d4:2f:16: + 4a:9e:b4:c9:1d:b4:fa:20:10:2b:0f:db:71:b9:50:bf:52:f6: + f8:ad:0d:65:69:13:99:e3:eb:ef:98:7e:9c:e7:f9:5d:ff:d4: + 9b:76:44:ba:d6:ce:7d:c1:cb:03:c7:a0:30:b8:76:05:fe:a9: + ca:7d:fe:6f:da:4a:2b:a2:18:bc:98:f2:00:68:72:4a:93:ae: + 85:e0:c0:01:f9:ca:ac:f5:11:26:72:e3:48:34:3a:ce:ac:de: + dc:4e:cf:8c:ea:78:72:40:0e:08:42:ec:6e:3e:f5:13:ce:fa: + d5:38:65:88:f7:e5:61:6b:85:18:e1:ec:5b:fb:6d:1c:52:df: + 99:16:01:00:70:a8:1d:1e:89:39:df:c3:fb:de:17:cd:69:68: + bc:78:1f:21:9d:f3:69:bc:76:ee:00:e4:ea:ea:73:b4:4f:89: + 07:14:3e:94:77:28:f1:75:97:c7:43:72:2d:79:f5:a0:36:b1: + e5:26:50:c6:23:6b:88:83:57:13:74:4d:27:8a:11:f6:98:64: + a7:b2:9e:3e:18:c6:a2:85:60:22:7a:a0:5a:70:38:08:7b:2c: + 9a:1c:b9:32:e4:08:14:1b:a5:a1:ab:03:f6:60:8b:3d:b3:72: + c2:d8:de:ab -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSi1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzM1oXDTI2MDkwODIyMTkzM1owgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -80,10 +80,10 @@ bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQBsTqG9/QpGrLOU50sgmR8+ShCVHSH5cdr2SsnceBSpXgFrQI8YQG5t -pYKRGXkK0V4VFkbABVpnVooUjpwJYbwR+E34Zo2ExX3jKD3/2zfECEhOzgyJSaao -/NUUb+Suz2T0ITqpWP5QslvCFKgPO8fHru9ASIw1zAmHLWuzlaj/6cE6iEiiZGwq -HKQZNGl2DeRx/EbwLxf6F+3I1K/YzNKX8ZNeTDenBrDDnqfj+R3Kv+A9jrEwjLxO -lIwO+kEp5SG6d/J0MVj+fMED9SgqaCuruodhuYVUIU3AIjVNGMKh83BW6UuilYb1 -xNpw1rwXZ8jyPR+AD3iFUjBbbutvt7ui +CwUAA4IBAQBHIi5QswvtF/lwo3E+jVXULxZKnrTJHbT6IBArD9txuVC/Uvb4rQ1l +aROZ4+vvmH6c5/ld/9SbdkS61s59wcsDx6AwuHYF/qnKff5v2korohi8mPIAaHJK +k66F4MAB+cqs9REmcuNINDrOrN7cTs+M6nhyQA4IQuxuPvUTzvrVOGWI9+Vha4UY +4exb+20cUt+ZFgEAcKgdHok538P73hfNaWi8eB8hnfNpvHbuAOTq6nO0T4kHFD6U +dyjxdZfHQ3ItefWgNrHlJlDGI2uIg1cTdE0nihH2mGSnsp4+GMaihWAieqBacDgI +eyyaHLky5AgUG6WhqwP2YIs9s3LC2N6r -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA4-pathlen2.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA4-pathlen2.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA4-pathlen2.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-ICA4-pathlen2.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -37,34 +37,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 3b:8b:b7:2b:1d:58:68:22:70:84:71:02:0f:80:9e:f8:04:7a: - 0c:aa:ab:60:ce:d0:ef:a5:0d:1f:6f:be:cf:06:8d:a2:52:3b: - 3f:3d:22:6c:6a:37:a3:2e:be:b2:6c:c6:5f:95:7b:68:df:22: - 9a:31:6e:eb:c1:5d:80:0c:2c:34:44:b4:3a:6a:f9:1c:8c:68: - 39:1d:52:05:47:b9:a3:23:87:72:19:d4:d3:87:59:df:eb:b8: - ef:19:b3:15:e0:c4:65:5a:9b:b2:42:67:f9:01:5a:2d:a1:73: - 8c:2e:02:f9:56:20:57:23:03:3f:f9:13:ec:14:51:d0:9e:d4: - 49:ec:9e:f1:47:b2:19:19:03:59:cc:3f:f0:ef:d1:3d:8a:06: - 37:f2:3c:70:f4:c4:c8:b0:57:4c:c1:18:4d:a1:c0:c6:3e:c7: - b3:1f:66:50:39:3f:f7:12:cf:b1:ff:26:ad:59:86:d6:18:d3: - 24:b7:6f:75:b7:8d:60:c4:63:e2:22:52:ff:b3:ea:03:b8:eb: - b9:a2:2b:38:97:70:e9:5c:0d:a4:88:d0:85:b0:2b:b2:f7:75: - 3c:7d:2b:15:56:b4:78:ce:66:71:bc:62:60:24:72:3b:37:07: - 8f:75:ba:29:6e:25:9d:80:66:7b:41:f7:8a:e0:ce:8a:41:3c: - 24:1e:fc:34 + 38:0c:f8:b9:53:67:57:a3:18:3c:0a:74:2d:13:79:32:7b:e2: + 4b:4f:82:5a:0e:7f:bb:ca:87:63:09:02:bd:31:62:2b:74:c4: + 47:fe:96:4a:8b:97:ee:43:ea:be:d4:0d:07:3f:57:dd:e5:ea: + da:d8:30:94:64:73:b6:fd:d7:4f:72:41:ce:13:fc:65:c6:b1: + f7:5c:b7:60:d9:55:bd:c4:89:49:57:90:15:be:cc:93:ee:3e: + bd:37:22:7a:98:9d:17:69:4f:87:62:82:f6:03:2d:ee:52:22: + 8c:86:bb:ba:93:9e:23:d8:d9:a2:4b:7e:ef:7d:59:d8:01:00: + 8d:f8:e6:b0:ac:ef:41:72:ff:ab:0d:b1:4f:cd:1e:73:81:3a: + 19:5a:3e:ac:da:f0:7f:be:b3:98:5f:22:08:96:2a:c4:41:43: + 0b:83:30:07:c1:25:eb:2d:5f:60:a2:e5:b4:57:45:71:59:f9: + 5b:b7:fd:3b:b3:4e:f0:cf:18:b9:0f:03:88:43:1d:9e:be:7b: + b1:a4:1f:e4:bc:ee:59:b7:2c:fe:a2:a6:08:96:f8:df:63:80: + 02:a5:61:a8:16:86:d1:28:c5:db:c6:0a:bb:4a:e4:61:ec:50: + 6c:58:c3:b0:0b:ba:be:fa:14:8c:36:59:ef:a3:6b:57:4a:6c: + 3e:33:6e:8a -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSi1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -78,12 +78,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBADuLtysdWGgicIRxAg+AnvgEegyqq2DO0O+lDR9vvs8G -jaJSOz89ImxqN6MuvrJsxl+Ve2jfIpoxbuvBXYAMLDREtDpq+RyMaDkdUgVHuaMj -h3IZ1NOHWd/ruO8ZsxXgxGVam7JCZ/kBWi2hc4wuAvlWIFcjAz/5E+wUUdCe1Ens -nvFHshkZA1nMP/Dv0T2KBjfyPHD0xMiwV0zBGE2hwMY+x7MfZlA5P/cSz7H/Jq1Z -htYY0yS3b3W3jWDEY+IiUv+z6gO467miKziXcOlcDaSI0IWwK7L3dTx9KxVWtHjO -ZnG8YmAkcjs3B491uiluJZ2AZntB94rgzopBPCQe/DQ= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBADgM+LlTZ1ejGDwKdC0TeTJ74ktPgloOf7vKh2MJAr0x +Yit0xEf+lkqLl+5D6r7UDQc/V93l6trYMJRkc7b9109yQc4T/GXGsfdct2DZVb3E +iUlXkBW+zJPuPr03InqYnRdpT4digvYDLe5SIoyGu7qTniPY2aJLfu99WdgBAI34 +5rCs70Fy/6sNsU/NHnOBOhlaPqza8H++s5hfIgiWKsRBQwuDMAfBJestX2Ci5bRX +RXFZ+Vu3/TuzTvDPGLkPA4hDHZ6+e7GkH+S87lm3LP6ipgiW+N9jgAKlYagWhtEo +xdvGCrtK5GHsUGxYw7ALur76FIw2We+ja1dKbD4zboo= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-assembled.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-assembled.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-assembled.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-assembled.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 80:3e:0c:a6:77:8f:f3:d3:e5:b8:d9:7e:73:95:f7:c1:1b:6d: - 00:2b:51:a8:02:2e:11:47:1e:b7:c8:ed:04:e4:63:fc:93:6a: - a5:7c:78:b5:4c:38:36:9e:5c:60:44:92:d0:0c:e1:af:0e:7d: - 14:f6:2a:9d:13:97:92:5e:13:e6:e9:d2:88:cd:89:a2:90:58: - 2b:5d:ef:33:3e:99:19:11:f1:f5:53:17:11:ed:4c:ec:10:c6: - 7f:eb:af:81:47:d4:45:dd:40:4c:34:a4:62:ab:0d:d8:2e:fe: - eb:81:3c:7d:8d:75:81:b1:47:64:0f:87:c6:7b:c4:13:a4:40: - 8f:b9:da:be:c8:1c:15:18:58:b6:a3:f6:81:6e:0f:f3:c0:4c: - d2:77:d5:4d:ed:9f:43:58:9d:e2:f7:e7:d6:a0:dd:f3:c5:5f: - 7e:54:12:ac:4f:53:8a:60:45:d7:fc:22:df:79:1e:a3:26:78: - c6:6e:b9:f5:44:9c:71:40:16:41:18:d4:d2:79:7a:13:d7:2d: - e0:a8:25:55:67:92:66:dd:18:bf:46:40:5b:fb:be:d1:fb:ed: - db:3c:b1:c5:0f:ff:89:95:0a:a5:1e:cb:18:4d:2c:ba:ac:e9: - d3:28:af:82:21:ff:78:d5:a8:a0:3a:ce:f3:21:9a:b6:d6:61: - 4b:bd:73:14 + 46:5c:9c:45:3c:a5:1d:27:7f:4b:b6:2d:7d:aa:03:28:53:a5: + e3:cb:5a:63:16:58:5c:fe:97:65:c4:1e:d3:34:fe:8f:46:6e: + 09:e4:2f:18:c9:fd:d0:7b:90:ab:f6:a5:89:fb:d0:0c:3a:f8: + 3c:53:d5:3b:3a:2e:c0:dd:59:e1:6f:ed:e8:d4:1f:d3:9f:5e: + c8:1f:50:ba:6d:16:1f:25:ab:e0:aa:74:8f:38:50:e8:98:f9: + 07:0f:71:3f:16:ce:cc:51:f8:ff:61:47:33:b4:98:36:63:19: + 06:3e:0c:a1:69:ba:67:64:9c:46:8a:ea:3e:62:27:c0:b3:60: + 7a:37:2b:fc:e2:c5:a8:8f:82:69:48:ff:4f:be:c4:8a:22:a3: + 53:db:df:ee:c5:87:b7:da:55:f7:cd:48:e1:45:e7:22:f2:ec: + bd:94:2c:a5:e5:ea:9c:60:c6:b8:83:6a:6a:9a:c9:46:9b:6e: + 88:38:d2:56:65:42:a6:5a:0f:d0:60:92:06:f4:1f:d9:5f:cd: + 07:93:04:00:1a:c1:eb:d8:a8:78:80:9f:c2:b7:b2:e9:4d:8c: + 6d:09:85:f0:87:c1:d6:d9:12:72:13:68:71:16:f7:53:f4:92: + 9b:d4:46:31:b5:45:32:7b:f8:e6:dd:bf:d1:f9:aa:da:d3:7e: + 06:2b:dd:fa -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSi1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,12 +78,12 @@ FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -gD4MpneP89PluNl+c5X3wRttACtRqAIuEUcet8jtBORj/JNqpXx4tUw4Np5cYESS -0Azhrw59FPYqnROXkl4T5unSiM2JopBYK13vMz6ZGRHx9VMXEe1M7BDGf+uvgUfU -Rd1ATDSkYqsN2C7+64E8fY11gbFHZA+HxnvEE6RAj7navsgcFRhYtqP2gW4P88BM -0nfVTe2fQ1id4vfn1qDd88VfflQSrE9TimBF1/wi33keoyZ4xm659USccUAWQRjU -0nl6E9ct4KglVWeSZt0Yv0ZAW/u+0fvt2zyxxQ//iZUKpR7LGE0suqzp0yivgiH/ -eNWooDrO8yGattZhS71zFA== +RlycRTylHSd/S7YtfaoDKFOl48taYxZYXP6XZcQe0zT+j0ZuCeQvGMn90HuQq/al +ifvQDDr4PFPVOzouwN1Z4W/t6NQf059eyB9Qum0WHyWr4Kp0jzhQ6Jj5Bw9xPxbO +zFH4/2FHM7SYNmMZBj4MoWm6Z2ScRorqPmInwLNgejcr/OLFqI+CaUj/T77EiiKj +U9vf7sWHt9pV981I4UXnIvLsvZQspeXqnGDGuINqaprJRptuiDjSVmVCploP0GCS +BvQf2V/NB5MEABrB69ioeICfwrey6U2MbQmF8IfB1tkSchNocRb3U/SSm9RGMbVF +Mnv45t2/0fmq2tN+Bivd+g== -----END CERTIFICATE----- Certificate: Data: @@ -92,8 +92,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -131,27 +131,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 8a:c2:bd:e8:d2:53:df:a2:01:71:2d:bd:24:c0:ce:3a:41:bc: - 86:24:51:4a:66:06:9e:1f:1f:c7:45:e2:db:ab:60:e8:89:ba: - 97:77:fe:d0:16:80:19:af:00:d0:2c:43:c3:b9:8c:6e:ff:5c: - 08:01:4a:a1:2c:ba:ba:db:96:f8:a1:d9:e7:65:2a:ee:d9:6d: - 73:7a:19:67:ed:67:69:30:13:fe:63:67:ec:e4:8c:89:37:11: - 82:c8:d5:3e:7b:bb:26:02:a0:10:44:72:51:d6:ea:33:9e:54: - 01:1a:5b:ed:0e:be:43:8f:a0:5b:dc:26:fa:e9:7c:20:e4:9a: - 6d:5b:87:c9:95:e5:7a:5b:2d:9a:9a:ab:65:37:9f:88:79:2c: - 10:83:82:32:76:1d:4f:f9:bf:8d:fd:2f:16:a7:d7:bb:64:41: - 6a:6d:02:9d:f5:f5:31:44:c5:64:56:9a:b8:a4:dd:88:ed:79: - 3b:f4:23:d7:0f:8a:2a:f3:f4:92:47:f5:f6:0f:19:e9:7c:6a: - fe:f0:62:c3:43:45:a2:6c:f5:2e:0b:c3:c5:8b:21:70:68:fc: - 58:63:91:1d:a4:35:eb:5b:4c:67:df:1d:4a:a3:a3:9e:16:a5: - 6b:e3:05:66:00:1e:03:aa:3f:0d:f8:2f:f7:f6:78:08:e0:b6: - 1f:20:0e:3d + 98:29:a6:c0:de:6c:d0:3d:c3:ff:d0:57:5f:83:48:bd:e0:80: + 1c:7a:e0:81:a9:5e:43:17:01:1b:c0:d6:89:30:eb:21:47:9e: + 8a:38:73:37:74:52:04:37:37:6e:7e:11:0e:f8:cb:c7:7c:4f: + 43:4f:07:64:56:7a:f7:66:4f:98:2f:6a:01:ae:04:72:64:03: + 32:88:e7:7e:60:ae:1e:16:93:4d:51:44:41:a7:b6:3e:19:e6: + 20:c9:30:3a:8f:86:77:b9:9c:c2:b8:f1:d9:7a:a9:10:cc:ce: + 95:46:bb:62:0d:d8:c8:78:37:51:51:2e:83:a8:5b:ef:fa:a0: + 34:bb:a3:93:66:b6:4f:72:25:fc:e2:39:1a:3a:3f:74:c5:94: + 88:0c:34:90:1e:f9:b0:d9:23:e4:29:33:4a:2f:59:c7:88:52: + c9:69:a9:6d:c7:8d:da:92:c3:4e:f3:c9:3c:5e:28:e1:ae:e0: + b7:ef:b4:07:18:70:b7:ea:2c:8a:e1:92:31:1c:71:26:cf:d5: + 5b:c6:fd:88:db:8b:30:36:41:91:b1:fd:63:c3:3e:b2:e2:64: + 5e:b2:ac:90:0c:6f:d5:21:4c:22:85:c5:0e:65:23:46:31:52: + 31:f5:42:d8:b3:78:bb:3e:d2:f0:69:61:b9:45:4e:6b:79:78: + a8:60:23:7a -----BEGIN CERTIFICATE----- MIIE1jCCA76gAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -167,12 +167,12 @@ DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR8wHQYDVQQDDBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZI hvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0P -BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCKwr3o0lPfogFxLb0kwM46QbyGJFFK -ZgaeHx/HReLbq2DoibqXd/7QFoAZrwDQLEPDuYxu/1wIAUqhLLq625b4odnnZSru -2W1zehln7WdpMBP+Y2fs5IyJNxGCyNU+e7smAqAQRHJR1uoznlQBGlvtDr5Dj6Bb -3Cb66Xwg5JptW4fJleV6Wy2amqtlN5+IeSwQg4Iydh1P+b+N/S8Wp9e7ZEFqbQKd -9fUxRMVkVpq4pN2I7Xk79CPXD4oq8/SSR/X2DxnpfGr+8GLDQ0WibPUuC8PFiyFw -aPxYY5EdpDXrW0xn3x1Ko6OeFqVr4wVmAB4Dqj8N+C/39ngI4LYfIA49 +BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCYKabA3mzQPcP/0Fdfg0i94IAceuCB +qV5DFwEbwNaJMOshR56KOHM3dFIENzdufhEO+MvHfE9DTwdkVnr3Zk+YL2oBrgRy +ZAMyiOd+YK4eFpNNUURBp7Y+GeYgyTA6j4Z3uZzCuPHZeqkQzM6VRrtiDdjIeDdR +US6DqFvv+qA0u6OTZrZPciX84jkaOj90xZSIDDSQHvmw2SPkKTNKL1nHiFLJaalt +x43aksNO88k8XijhruC377QHGHC36iyK4ZIxHHEmz9Vbxv2I24swNkGRsf1jwz6y +4mResqyQDG/VIUwihcUOZSNGMVIx9ULYs3i7PtLwaWG5RU5reXioYCN6 -----END CERTIFICATE----- Certificate: Data: @@ -181,8 +181,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA2-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -220,27 +220,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 64:05:b5:78:b4:eb:f3:d5:be:5f:ec:27:6e:7d:ad:74:6c:da: - c4:2c:cf:fc:b9:4f:52:7f:b1:78:3a:de:f6:9a:97:f5:aa:a4: - ce:b0:2a:84:b5:33:5f:b4:55:b9:f9:03:58:ba:7a:86:8d:b7: - ff:e5:dd:69:b9:e8:40:76:cf:5b:8e:9c:a5:0b:df:35:da:d6: - 8c:72:b5:a6:92:d5:e5:7b:75:10:6c:89:33:0a:34:2d:ef:bb: - 72:6d:be:89:b0:b3:71:b4:50:a1:00:b7:01:d8:31:bf:db:40: - df:d1:1f:a8:16:e6:4b:2e:04:98:66:8c:73:43:50:95:73:80: - 0b:84:8f:2d:be:cb:6b:1b:1b:a1:78:d4:bd:b0:a5:b9:34:a9: - 3f:56:b0:0b:b2:dc:34:0f:e6:5f:42:8e:be:57:9d:40:49:6b: - 1d:f8:4d:03:30:4c:e4:d9:25:ad:3f:96:8c:3e:ac:e1:8f:34: - ee:65:50:a0:79:b0:1e:2c:85:0c:11:6d:02:d8:be:1c:d9:0a: - c5:01:4f:8b:a8:b3:91:0a:76:3a:a2:b0:cd:24:10:6e:e1:7f: - 0e:35:71:97:56:18:15:61:11:e1:4d:90:ff:67:2b:52:54:e9: - 44:27:2c:4f:fc:59:0f:e0:87:69:44:92:8d:d0:b6:db:8a:e2: - 70:0d:12:05 + 44:d2:b6:d0:85:31:bf:1f:a2:b1:91:6b:ee:dc:80:ac:29:81: + 0e:b4:c3:e8:8e:91:be:66:f2:44:61:8b:6c:44:17:d9:cd:15: + 40:bd:ce:7c:ca:7d:ad:c8:e1:81:90:a4:28:57:88:71:49:9f: + 03:bb:4b:8c:ff:02:08:98:d2:e4:b0:ca:be:f2:df:08:18:24: + f7:3c:22:be:f2:23:10:96:95:2b:f0:a0:ed:16:08:1a:1e:ce: + df:1d:f7:b3:35:af:f4:86:f2:16:b5:2c:90:bd:0a:f8:64:61: + da:c6:2e:4b:1f:05:30:1a:72:d3:51:33:26:61:5d:0d:14:0f: + b8:b9:dc:6f:78:57:a0:63:4c:f0:16:49:fd:48:54:c3:92:1e: + c0:04:8a:16:c0:9a:35:08:be:49:f2:dd:90:6a:90:48:d5:9f: + 48:82:18:f2:04:d6:d8:07:55:17:99:8e:27:cf:86:8d:1b:a6: + 02:72:42:a8:53:e6:5d:20:5a:8d:2e:d3:fc:a7:71:4c:b2:21: + 9d:14:8c:f1:49:3c:ca:e7:e6:c6:51:7f:41:3c:37:1a:38:21: + a4:ee:9e:1b:cc:8b:09:df:35:de:18:c4:7a:89:32:b9:8d:15: + eb:07:5b:2b:5c:55:a5:44:db:fb:f2:15:16:1c:01:16:dd:de: + d9:7a:bf:dc -----BEGIN CERTIFICATE----- MIIE1DCCA7ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0EzLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBozELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBozELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNV BAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9A @@ -256,12 +256,12 @@ DAdTZWF0dGxlMRUwEwYDVQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2lu ZWVyaW5nMR0wGwYDVQQDDBRjaGFpbkotSUNBNC1wYXRobGVuMjEfMB0GCSqGSIb3 DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIBZDAMBgNVHRMEBTADAQH/MAsGA1UdDwQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAZAW1eLTr89W+X+wnbn2tdGzaxCzP/LlP -Un+xeDre9pqX9aqkzrAqhLUzX7RVufkDWLp6ho23/+XdabnoQHbPW46cpQvfNdrW -jHK1ppLV5Xt1EGyJMwo0Le+7cm2+ibCzcbRQoQC3Adgxv9tA39EfqBbmSy4EmGaM -c0NQlXOAC4SPLb7LaxsboXjUvbCluTSpP1awC7LcNA/mX0KOvledQElrHfhNAzBM -5NklrT+WjD6s4Y807mVQoHmwHiyFDBFtAti+HNkKxQFPi6izkQp2OqKwzSQQbuF/ -DjVxl1YYFWER4U2Q/2crUlTpRCcsT/xZD+CHaUSSjdC224ricA0SBQ== +AwIBBjANBgkqhkiG9w0BAQsFAAOCAQEARNK20IUxvx+isZFr7tyArCmBDrTD6I6R +vmbyRGGLbEQX2c0VQL3OfMp9rcjhgZCkKFeIcUmfA7tLjP8CCJjS5LDKvvLfCBgk +9zwivvIjEJaVK/Cg7RYIGh7O3x33szWv9IbyFrUskL0K+GRh2sYuSx8FMBpy01Ez +JmFdDRQPuLncb3hXoGNM8BZJ/UhUw5IewASKFsCaNQi+SfLdkGqQSNWfSIIY8gTW +2AdVF5mOJ8+GjRumAnJCqFPmXSBajS7T/KdxTLIhnRSM8Uk8yufmxlF/QTw3Gjgh +pO6eG8yLCd813hjEeokyuY0V6wdbK1xVpUTb+/IVFhwBFt3e2Xq/3A== -----END CERTIFICATE----- Certificate: Data: @@ -270,8 +270,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA3-no_pathlen, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -309,27 +309,27 @@ X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 6c:4e:a1:bd:fd:0a:46:ac:b3:94:e7:4b:20:99:1f:3e:4a:10: - 95:1d:21:f9:71:da:f6:4a:c9:dc:78:14:a9:5e:01:6b:40:8f: - 18:40:6e:6d:a5:82:91:19:79:0a:d1:5e:15:16:46:c0:05:5a: - 67:56:8a:14:8e:9c:09:61:bc:11:f8:4d:f8:66:8d:84:c5:7d: - e3:28:3d:ff:db:37:c4:08:48:4e:ce:0c:89:49:a6:a8:fc:d5: - 14:6f:e4:ae:cf:64:f4:21:3a:a9:58:fe:50:b2:5b:c2:14:a8: - 0f:3b:c7:c7:ae:ef:40:48:8c:35:cc:09:87:2d:6b:b3:95:a8: - ff:e9:c1:3a:88:48:a2:64:6c:2a:1c:a4:19:34:69:76:0d:e4: - 71:fc:46:f0:2f:17:fa:17:ed:c8:d4:af:d8:cc:d2:97:f1:93: - 5e:4c:37:a7:06:b0:c3:9e:a7:e3:f9:1d:ca:bf:e0:3d:8e:b1: - 30:8c:bc:4e:94:8c:0e:fa:41:29:e5:21:ba:77:f2:74:31:58: - fe:7c:c1:03:f5:28:2a:68:2b:ab:ba:87:61:b9:85:54:21:4d: - c0:22:35:4d:18:c2:a1:f3:70:56:e9:4b:a2:95:86:f5:c4:da: - 70:d6:bc:17:67:c8:f2:3d:1f:80:0f:78:85:52:30:5b:6e:eb: - 6f:b7:bb:a2 + 47:22:2e:50:b3:0b:ed:17:f9:70:a3:71:3e:8d:55:d4:2f:16: + 4a:9e:b4:c9:1d:b4:fa:20:10:2b:0f:db:71:b9:50:bf:52:f6: + f8:ad:0d:65:69:13:99:e3:eb:ef:98:7e:9c:e7:f9:5d:ff:d4: + 9b:76:44:ba:d6:ce:7d:c1:cb:03:c7:a0:30:b8:76:05:fe:a9: + ca:7d:fe:6f:da:4a:2b:a2:18:bc:98:f2:00:68:72:4a:93:ae: + 85:e0:c0:01:f9:ca:ac:f5:11:26:72:e3:48:34:3a:ce:ac:de: + dc:4e:cf:8c:ea:78:72:40:0e:08:42:ec:6e:3e:f5:13:ce:fa: + d5:38:65:88:f7:e5:61:6b:85:18:e1:ec:5b:fb:6d:1c:52:df: + 99:16:01:00:70:a8:1d:1e:89:39:df:c3:fb:de:17:cd:69:68: + bc:78:1f:21:9d:f3:69:bc:76:ee:00:e4:ea:ea:73:b4:4f:89: + 07:14:3e:94:77:28:f1:75:97:c7:43:72:2d:79:f5:a0:36:b1: + e5:26:50:c6:23:6b:88:83:57:13:74:4d:27:8a:11:f6:98:64: + a7:b2:9e:3e:18:c6:a2:85:60:22:7a:a0:5a:70:38:08:7b:2c: + 9a:1c:b9:32:e4:08:14:1b:a5:a1:ab:03:f6:60:8b:3d:b3:72: + c2:d8:de:ab -----BEGIN CERTIFICATE----- MIIExDCCA6ygAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNo YWluSi1JQ0E0LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wu -Y29tMB4XDTIyMTIxNjIxMTc1MFoXDTI1MDkxMTIxMTc1MFowgaMxCzAJBgNVBAYT +Y29tMB4XDTIzMTIxMzIyMTkzM1oXDTI2MDkwODIyMTkzM1owgaMxCzAJBgNVBAYT AlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRUwEwYD VQQKDAx3b2xmU1NMIEluYy4xFDASBgNVBAsMC0VuZ2luZWVyaW5nMR8wHQYDVQQD DBZjaGFpbkotSUNBMy1ub19wYXRobGVuMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv @@ -345,12 +345,12 @@ bWFuMREwDwYDVQQKDAhTYXd0b290aDETMBEGA1UECwwKQ29uc3VsdGluZzEYMBYG A1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZz c2wuY29tggFkMAwGA1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEB -CwUAA4IBAQBsTqG9/QpGrLOU50sgmR8+ShCVHSH5cdr2SsnceBSpXgFrQI8YQG5t -pYKRGXkK0V4VFkbABVpnVooUjpwJYbwR+E34Zo2ExX3jKD3/2zfECEhOzgyJSaao -/NUUb+Suz2T0ITqpWP5QslvCFKgPO8fHru9ASIw1zAmHLWuzlaj/6cE6iEiiZGwq -HKQZNGl2DeRx/EbwLxf6F+3I1K/YzNKX8ZNeTDenBrDDnqfj+R3Kv+A9jrEwjLxO -lIwO+kEp5SG6d/J0MVj+fMED9SgqaCuruodhuYVUIU3AIjVNGMKh83BW6UuilYb1 -xNpw1rwXZ8jyPR+AD3iFUjBbbutvt7ui +CwUAA4IBAQBHIi5QswvtF/lwo3E+jVXULxZKnrTJHbT6IBArD9txuVC/Uvb4rQ1l +aROZ4+vvmH6c5/ld/9SbdkS61s59wcsDx6AwuHYF/qnKff5v2korohi8mPIAaHJK +k66F4MAB+cqs9REmcuNINDrOrN7cTs+M6nhyQA4IQuxuPvUTzvrVOGWI9+Vha4UY +4exb+20cUt+ZFgEAcKgdHok538P73hfNaWi8eB8hnfNpvHbuAOTq6nO0T4kHFD6U +dyjxdZfHQ3ItefWgNrHlJlDGI2uIg1cTdE0nihH2mGSnsp4+GMaihWAieqBacDgI +eyyaHLky5AgUG6WhqwP2YIs9s3LC2N6r -----END CERTIFICATE----- Certificate: Data: @@ -359,8 +359,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Montana, L = Bozeman, O = Sawtooth, OU = Consulting, CN = www.wolfssl.com, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA4-pathlen2, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -391,34 +391,34 @@ X509v3 Authority Key Identifier: keyid:27:8E:67:11:74:C3:26:1D:3F:ED:33:63:B3:A4:D8:1D:30:E5:E8:D5 DirName:/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com - serial:2C:80:CE:DB:47:9D:07:66:92:3D:68:D7:CA:AC:90:4F:CA:69:41:4B + serial:33:44:1A:A8:6C:01:EC:F6:60:F2:70:51:0A:4C:D1:14:FA:BC:E9:44 X509v3 Basic Constraints: CA:TRUE, pathlen:2 X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption - 3b:8b:b7:2b:1d:58:68:22:70:84:71:02:0f:80:9e:f8:04:7a: - 0c:aa:ab:60:ce:d0:ef:a5:0d:1f:6f:be:cf:06:8d:a2:52:3b: - 3f:3d:22:6c:6a:37:a3:2e:be:b2:6c:c6:5f:95:7b:68:df:22: - 9a:31:6e:eb:c1:5d:80:0c:2c:34:44:b4:3a:6a:f9:1c:8c:68: - 39:1d:52:05:47:b9:a3:23:87:72:19:d4:d3:87:59:df:eb:b8: - ef:19:b3:15:e0:c4:65:5a:9b:b2:42:67:f9:01:5a:2d:a1:73: - 8c:2e:02:f9:56:20:57:23:03:3f:f9:13:ec:14:51:d0:9e:d4: - 49:ec:9e:f1:47:b2:19:19:03:59:cc:3f:f0:ef:d1:3d:8a:06: - 37:f2:3c:70:f4:c4:c8:b0:57:4c:c1:18:4d:a1:c0:c6:3e:c7: - b3:1f:66:50:39:3f:f7:12:cf:b1:ff:26:ad:59:86:d6:18:d3: - 24:b7:6f:75:b7:8d:60:c4:63:e2:22:52:ff:b3:ea:03:b8:eb: - b9:a2:2b:38:97:70:e9:5c:0d:a4:88:d0:85:b0:2b:b2:f7:75: - 3c:7d:2b:15:56:b4:78:ce:66:71:bc:62:60:24:72:3b:37:07: - 8f:75:ba:29:6e:25:9d:80:66:7b:41:f7:8a:e0:ce:8a:41:3c: - 24:1e:fc:34 + 38:0c:f8:b9:53:67:57:a3:18:3c:0a:74:2d:13:79:32:7b:e2: + 4b:4f:82:5a:0e:7f:bb:ca:87:63:09:02:bd:31:62:2b:74:c4: + 47:fe:96:4a:8b:97:ee:43:ea:be:d4:0d:07:3f:57:dd:e5:ea: + da:d8:30:94:64:73:b6:fd:d7:4f:72:41:ce:13:fc:65:c6:b1: + f7:5c:b7:60:d9:55:bd:c4:89:49:57:90:15:be:cc:93:ee:3e: + bd:37:22:7a:98:9d:17:69:4f:87:62:82:f6:03:2d:ee:52:22: + 8c:86:bb:ba:93:9e:23:d8:d9:a2:4b:7e:ef:7d:59:d8:01:00: + 8d:f8:e6:b0:ac:ef:41:72:ff:ab:0d:b1:4f:cd:1e:73:81:3a: + 19:5a:3e:ac:da:f0:7f:be:b3:98:5f:22:08:96:2a:c4:41:43: + 0b:83:30:07:c1:25:eb:2d:5f:60:a2:e5:b4:57:45:71:59:f9: + 5b:b7:fd:3b:b3:4e:f0:cf:18:b9:0f:03:88:43:1d:9e:be:7b: + b1:a4:1f:e4:bc:ee:59:b7:2c:fe:a2:a6:08:96:f8:df:63:80: + 02:a5:61:a8:16:86:d1:28:c5:db:c6:0a:bb:4a:e4:61:ec:50: + 6c:58:c3:b0:0b:ba:be:fa:14:8c:36:59:ef:a3:6b:57:4a:6c: + 3e:33:6e:8a -----BEGIN CERTIFICATE----- MIIEzDCCA7SgAwIBAgIBZDANBgkqhkiG9w0BAQsFADCBlDELMAkGA1UEBhMCVVMx EDAOBgNVBAgMB01vbnRhbmExEDAOBgNVBAcMB0JvemVtYW4xETAPBgNVBAoMCFNh d3Rvb3RoMRMwEQYDVQQLDApDb25zdWx0aW5nMRgwFgYDVQQDDA93d3cud29sZnNz -bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjIxMjE2 -MjExNzUwWhcNMjUwOTExMjExNzUwWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM +bC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5jb20wHhcNMjMxMjEz +MjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBoTELMAkGA1UEBhMCVVMxEzARBgNVBAgM Cldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoMDHdvbGZTU0wg SW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHTAbBgNVBAMMFGNoYWluSi1JQ0E0 LXBhdGhsZW4yMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tMIIBIjAN @@ -432,12 +432,12 @@ gcwwgcmAFCeOZxF0wyYdP+0zY7Ok2B0w5ejVoYGapIGXMIGUMQswCQYDVQQGEwJV UzEQMA4GA1UECAwHTW9udGFuYTEQMA4GA1UEBwwHQm96ZW1hbjERMA8GA1UECgwI U2F3dG9vdGgxEzARBgNVBAsMCkNvbnN1bHRpbmcxGDAWBgNVBAMMD3d3dy53b2xm -c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIULIDO20ed -B2aSPWjXyqyQT8ppQUswDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ -KoZIhvcNAQELBQADggEBADuLtysdWGgicIRxAg+AnvgEegyqq2DO0O+lDR9vvs8G -jaJSOz89ImxqN6MuvrJsxl+Ve2jfIpoxbuvBXYAMLDREtDpq+RyMaDkdUgVHuaMj -h3IZ1NOHWd/ruO8ZsxXgxGVam7JCZ/kBWi2hc4wuAvlWIFcjAz/5E+wUUdCe1Ens -nvFHshkZA1nMP/Dv0T2KBjfyPHD0xMiwV0zBGE2hwMY+x7MfZlA5P/cSz7H/Jq1Z -htYY0yS3b3W3jWDEY+IiUv+z6gO467miKziXcOlcDaSI0IWwK7L3dTx9KxVWtHjO -ZnG8YmAkcjs3B491uiluJZ2AZntB94rgzopBPCQe/DQ= +c3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3b2xmc3NsLmNvbYIUM0QaqGwB +7PZg8nBRCkzRFPq86UQwDwYDVR0TBAgwBgEB/wIBAjALBgNVHQ8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBADgM+LlTZ1ejGDwKdC0TeTJ74ktPgloOf7vKh2MJAr0x +Yit0xEf+lkqLl+5D6r7UDQc/V93l6trYMJRkc7b9109yQc4T/GXGsfdct2DZVb3E +iUlXkBW+zJPuPr03InqYnRdpT4digvYDLe5SIoyGu7qTniPY2aJLfu99WdgBAI34 +5rCs70Fy/6sNsU/NHnOBOhlaPqza8H++s5hfIgiWKsRBQwuDMAfBJestX2Ci5bRX +RXFZ+Vu3/TuzTvDPGLkPA4hDHZ6+e7GkH+S87lm3LP6ipgiW+N9jgAKlYagWhtEo +xdvGCrtK5GHsUGxYw7ALur76FIw2We+ja1dKbD4zboo= -----END CERTIFICATE----- diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-entity.pem mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-entity.pem --- mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-entity.pem 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-pathlen/chainJ-entity.pem 2024-08-03 07:30:00.000000000 +0000 @@ -5,8 +5,8 @@ Signature Algorithm: sha256WithRSAEncryption Issuer: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-ICA1-no_pathlen, emailAddress = info@wolfssl.com Validity - Not Before: Dec 16 21:17:50 2022 GMT - Not After : Sep 11 21:17:50 2025 GMT + Not Before: Dec 13 22:19:33 2023 GMT + Not After : Sep 8 22:19:33 2026 GMT Subject: C = US, ST = Washington, L = Seattle, O = wolfSSL Inc., OU = Engineering, CN = chainJ-entity, emailAddress = info@wolfssl.com Subject Public Key Info: Public Key Algorithm: rsaEncryption @@ -42,27 +42,27 @@ X509v3 Basic Constraints: CA:FALSE Signature Algorithm: sha256WithRSAEncryption - 80:3e:0c:a6:77:8f:f3:d3:e5:b8:d9:7e:73:95:f7:c1:1b:6d: - 00:2b:51:a8:02:2e:11:47:1e:b7:c8:ed:04:e4:63:fc:93:6a: - a5:7c:78:b5:4c:38:36:9e:5c:60:44:92:d0:0c:e1:af:0e:7d: - 14:f6:2a:9d:13:97:92:5e:13:e6:e9:d2:88:cd:89:a2:90:58: - 2b:5d:ef:33:3e:99:19:11:f1:f5:53:17:11:ed:4c:ec:10:c6: - 7f:eb:af:81:47:d4:45:dd:40:4c:34:a4:62:ab:0d:d8:2e:fe: - eb:81:3c:7d:8d:75:81:b1:47:64:0f:87:c6:7b:c4:13:a4:40: - 8f:b9:da:be:c8:1c:15:18:58:b6:a3:f6:81:6e:0f:f3:c0:4c: - d2:77:d5:4d:ed:9f:43:58:9d:e2:f7:e7:d6:a0:dd:f3:c5:5f: - 7e:54:12:ac:4f:53:8a:60:45:d7:fc:22:df:79:1e:a3:26:78: - c6:6e:b9:f5:44:9c:71:40:16:41:18:d4:d2:79:7a:13:d7:2d: - e0:a8:25:55:67:92:66:dd:18:bf:46:40:5b:fb:be:d1:fb:ed: - db:3c:b1:c5:0f:ff:89:95:0a:a5:1e:cb:18:4d:2c:ba:ac:e9: - d3:28:af:82:21:ff:78:d5:a8:a0:3a:ce:f3:21:9a:b6:d6:61: - 4b:bd:73:14 + 46:5c:9c:45:3c:a5:1d:27:7f:4b:b6:2d:7d:aa:03:28:53:a5: + e3:cb:5a:63:16:58:5c:fe:97:65:c4:1e:d3:34:fe:8f:46:6e: + 09:e4:2f:18:c9:fd:d0:7b:90:ab:f6:a5:89:fb:d0:0c:3a:f8: + 3c:53:d5:3b:3a:2e:c0:dd:59:e1:6f:ed:e8:d4:1f:d3:9f:5e: + c8:1f:50:ba:6d:16:1f:25:ab:e0:aa:74:8f:38:50:e8:98:f9: + 07:0f:71:3f:16:ce:cc:51:f8:ff:61:47:33:b4:98:36:63:19: + 06:3e:0c:a1:69:ba:67:64:9c:46:8a:ea:3e:62:27:c0:b3:60: + 7a:37:2b:fc:e2:c5:a8:8f:82:69:48:ff:4f:be:c4:8a:22:a3: + 53:db:df:ee:c5:87:b7:da:55:f7:cd:48:e1:45:e7:22:f2:ec: + bd:94:2c:a5:e5:ea:9c:60:c6:b8:83:6a:6a:9a:c9:46:9b:6e: + 88:38:d2:56:65:42:a6:5a:0f:d0:60:92:06:f4:1f:d9:5f:cd: + 07:93:04:00:1a:c1:eb:d8:a8:78:80:9f:c2:b7:b2:e9:4d:8c: + 6d:09:85:f0:87:c1:d6:d9:12:72:13:68:71:16:f7:53:f4:92: + 9b:d4:46:31:b5:45:32:7b:f8:e6:dd:bf:d1:f9:aa:da:d3:7e: + 06:2b:dd:fa -----BEGIN CERTIFICATE----- MIIEvDCCA6SgAwIBAgIBZTANBgkqhkiG9w0BAQsFADCBozELMAkGA1UEBhMCVVMx EzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTATBgNVBAoM DHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAdBgNVBAMMFmNo YWluSi1JQ0ExLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz -bC5jb20wHhcNMjIxMjE2MjExNzUwWhcNMjUwOTExMjExNzUwWjCBmjELMAkGA1UE +bC5jb20wHhcNMjMxMjEzMjIxOTMzWhcNMjYwOTA4MjIxOTMzWjCBmjELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxFTAT BgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxFjAUBgNV BAMMDWNoYWluSi1lbnRpdHkxHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNzbC5j @@ -78,10 +78,10 @@ FTATBgNVBAoMDHdvbGZTU0wgSW5jLjEUMBIGA1UECwwLRW5naW5lZXJpbmcxHzAd BgNVBAMMFmNoYWluSi1JQ0EyLW5vX3BhdGhsZW4xHzAdBgkqhkiG9w0BCQEWEGlu Zm9Ad29sZnNzbC5jb22CAWQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQsFAAOCAQEA -gD4MpneP89PluNl+c5X3wRttACtRqAIuEUcet8jtBORj/JNqpXx4tUw4Np5cYESS -0Azhrw59FPYqnROXkl4T5unSiM2JopBYK13vMz6ZGRHx9VMXEe1M7BDGf+uvgUfU -Rd1ATDSkYqsN2C7+64E8fY11gbFHZA+HxnvEE6RAj7navsgcFRhYtqP2gW4P88BM -0nfVTe2fQ1id4vfn1qDd88VfflQSrE9TimBF1/wi33keoyZ4xm659USccUAWQRjU -0nl6E9ct4KglVWeSZt0Yv0ZAW/u+0fvt2zyxxQ//iZUKpR7LGE0suqzp0yivgiH/ -eNWooDrO8yGattZhS71zFA== +RlycRTylHSd/S7YtfaoDKFOl48taYxZYXP6XZcQe0zT+j0ZuCeQvGMn90HuQq/al +ifvQDDr4PFPVOzouwN1Z4W/t6NQf059eyB9Qum0WHyWr4Kp0jzhQ6Jj5Bw9xPxbO +zFH4/2FHM7SYNmMZBj4MoWm6Z2ScRorqPmInwLNgejcr/OLFqI+CaUj/T77EiiKj +U9vf7sWHt9pV981I4UXnIvLsvZQspeXqnGDGuINqaprJRptuiDjSVmVCploP0GCS +BvQf2V/NB5MEABrB69ioeICfwrey6U2MbQmF8IfB1tkSchNocRb3U/SSm9RGMbVF +Mnv45t2/0fmq2tN+Bivd+g== -----END CERTIFICATE----- Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-servercert-rc2.p12 and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-servercert-rc2.p12 differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-servercert.p12 and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-servercert.p12 differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/test-stream-sign.p7b and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/test-stream-sign.p7b differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/certs/x942dh2048.der and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/certs/x942dh2048.der differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,7 @@ +# wolfSSL CMake + +This directory contains some supplementary functions for the [CMakeLists.txt](../CMakeLists.txt) in the root. + +See also cmake notes in the [INSTALL](../INSTALL) documentation file. + +If new CMake build options are added `cmake/options.h.in` must also be updated. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/config.in mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/config.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/config.in 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/config.in 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,12 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_ARPA_INET_H @HAVE_ARPA_INET_H@ +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_IOCTL_H @HAVE_SYS_IOCTL_H@ + +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_NETDB_H @HAVE_NETDB_H@ + /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_SOCKET_H @HAVE_SYS_SOCKET_H@ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/functions.cmake mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/functions.cmake --- mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/functions.cmake 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/functions.cmake 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,7 @@ function(override_cache VAR VAL) get_property(VAR_STRINGS CACHE ${VAR} PROPERTY STRINGS) LIST(FIND VAR_STRINGS ${VAL} CK) - if(-1 EQUAL ${CK}) + if(-1 EQUAL ${CK} AND DEFINED VAR_STRINGS) message(SEND_ERROR "\"${VAL}\" is not valid override value for \"${VAR}\"." " Please select value from \"${VAR_STRINGS}\"\n") @@ -10,10 +10,15 @@ endfunction() function(add_option NAME HELP_STRING DEFAULT VALUES) - # Set the default value for the option. - set(${NAME} ${DEFAULT} CACHE STRING ${HELP_STRING}) - # Set the list of allowed values for the option. - set_property(CACHE ${NAME} PROPERTY STRINGS ${VALUES}) + if(VALUES STREQUAL "yes;no") + # Set the default value for the option. + set(${NAME} ${DEFAULT} CACHE BOOL ${HELP_STRING}) + else() + # Set the default value for the option. + set(${NAME} ${DEFAULT} CACHE STRING ${HELP_STRING}) + # Set the list of allowed values for the option. + set_property(CACHE ${NAME} PROPERTY STRINGS ${VALUES}) + endif() if(DEFINED ${NAME}) list(FIND VALUES ${${NAME}} IDX) @@ -53,7 +58,7 @@ if(WOLFSSL_SCTP OR WOLFSSL_USER_SETTINGS) set(BUILD_SCTP "yes" PARENT_SCOPE) endif() - if(WOLFSSL_DTLS_CID OR WOLFSSL_USER_SETTINGS) + if(WOLFSSL_DTLS_CID OR WOLFSSL_USER_SETTINGS OR WOLFSSL_DTLS) set(BUILD_DTLS_COMMON "yes" PARENT_SCOPE) endif() set(BUILD_MCAST ${WOLFSSL_MCAST} PARENT_SCOPE) @@ -195,6 +200,15 @@ endif() if(WOLFSSL_OQS OR WOLFSSL_USER_SETTINGS) set(BUILD_FALCON "yes" PARENT_SCOPE) + set(BUILD_SPHINCS "yes" PARENT_SCOPE) + set(BUILD_DILITHIUM "yes" PARENT_SCOPE) + set(BUILD_EXT_KYBER "yes" PARENT_SCOPE) + set(BUILD_OQS_HELPER "yes" PARENT_SCOPE) + endif() + if(WOLFSSL_ARIA OR WOLFSSL_USER_SETTINGS) + message(STATUS "ARIA functions.cmake found WOLFSSL_ARIA") + # we cannot actually build, as we only have pre-compiled bin + set(BUILD_ARIA "yes" PARENT_SCOPE) endif() set(BUILD_INLINE ${WOLFSSL_INLINE} PARENT_SCOPE) if(WOLFSSL_OCSP OR WOLFSSL_USER_SETTINGS) @@ -208,8 +222,7 @@ if(WOLFSSL_CRL_MONITOR) set(BUILD_CRL_MONITOR "yes" PARENT_SCOPE) endif() - set(BUILD_USER_RSA ${WOLFSSL_USER_RSA} PARENT_SCOPE) - set(BUILD_USER_CRYPTO ${WOLFSSL_USER_CRYPTO} PARENT_SCOPE) + set(BUILD_QUIC ${WOLFSSL_QUIC} PARENT_SCOPE) set(BUILD_WNR ${WOLFSSL_WNR} PARENT_SCOPE) if(WOLFSSL_SRP OR WOLFSSL_USER_SETTINGS) set(BUILD_SRP "yes" PARENT_SCOPE) @@ -238,7 +251,7 @@ endif() set(BUILD_EXAMPLE_CLIENTS ${WOLFSSL_EXAMPLES} PARENT_SCOPE) set(BUILD_TESTS ${WOLFSSL_EXAMPLES} PARENT_SCOPE) - if(NOT WOLFSSL_SINGLETHREADED AND WOLFSSL_EXAMPLES AND NOT WOLFSSL_LEAN_TLS) + if(NOT WOLFSSL_SINGLE_THREADED AND WOLFSSL_EXAMPLES AND NOT WOLFSSL_LEAN_TLS) set(BUILD_THREADED_EXAMPLES "yes" PARENT_SCOPE) endif() set(BUILD_WOLFCRYPT_TESTS ${WOLFSSL_CRYPT_TESTS} PARENT_SCOPE) @@ -272,13 +285,12 @@ if(WOLFSSL_SP_ARM_CORTEX_ASM OR WOLFSSL_USER_SETTINGS) set(BUILD_SP_ARM_CORTEX "yes" PARENT_SCOPE) endif() - if(WOLFSSL_SP_X86_64_ASM OR WOLFSSL_USER_SETTINGS) + if(WOLFSSL_X86_64_BUILD AND (WOLFSSL_SP_X86_64_ASM OR WOLFSSL_USER_SETTINGS)) set(BUILD_SP_X86_64 "yes" PARENT_SCOPE) endif() if(WOLFSSL_SP_MATH OR WOLFSSL_SP_MATH_ALL OR WOLFSSL_USER_SETTINGS) set(BUILD_SP_INT "yes" PARENT_SCOPE) endif() - set(BUILD_FAST_RSA ${WOLFSSL_FAST_RSA} PARENT_SCOPE) set(BUILD_MCAPI ${WOLFSSL_MCAPI} PARENT_SCOPE) set(BUILD_ASYNCCRYPT ${WOLFSSL_ASYNCCRYPT} PARENT_SCOPE) set(BUILD_WOLFEVENT ${WOLFSSL_ASYNCCRYPT} PARENT_SCOPE) @@ -304,6 +316,9 @@ if(WOLFSSL_CAAM) set(BUILD_CAAM "yes" PARENT_SCOPE) endif() + if(WOLFSSL_HPKE OR WOLFSSL_USER_SETTINGS) + set(BUILD_HPKE "yes" PARENT_SCOPE) + endif() set(BUILD_FLAGS_GENERATED "yes" PARENT_SCOPE) endfunction() @@ -315,43 +330,6 @@ # Corresponds to src/include.am if(BUILD_FIPS) - if(BUILD_FIPS_V1) - # fips first file - list(APPEND LIB_SOURCES ctaocrypt/src/wolfcrypt_first.c) - - list(APPEND LIB_SOURCES - ctaocrypt/src/hmac.c - ctaocrypt/src/random.c - ctaocrypt/src/sha256.c) - - if(BUILD_RSA) - list(APPEND LIB_SOURCES ctaocrypt/src/rsa.c) - endif() - - if(BUILD_AES) - list(APPEND LIB_SOURCES ctaocrypt/src/aes.c) - endif() - - if(BUILD_DES3) - list(APPEND LIB_SOURCES ctaocrypt/src/des3.c) - endif() - - if(BUILD_SHA) - list(APPEND LIB_SOURCES ctaocrypt/src/sha.c) - endif() - - if(BUILD_SHA512) - list(APPEND LIB_SOURCES ctaocrypt/src/sha512.c) - endif() - - list(APPEND LIB_SOURCES - ctaocrypt/src/fips.c - ctaocrypt/src/fips_test.c) - - # fips last file - list(APPEND LIB_SOURCES ctaocrypt/src/wolfcrypt_last.c) - endif() - if(BUILD_FIPS_V2) # FIPSv2 first file list(APPEND LIB_SOURCES wolfcrypt/src/wolfcrypt_first.c) @@ -518,14 +496,10 @@ list(APPEND LIB_SOURCES wolfcrypt/src/async.c) endif() - if(NOT BUILD_USER_RSA AND BUILD_RSA) - if(BUILD_FAST_RSA) - list(APPEND LIB_SOURCES wolfcrypt/user-crypto/src/rsa.c) - else() - if(NOT BUILD_FIPS_V2) - list(APPEND LIB_SOURCES wolfcrypt/src/rsa.c) - endif() - endif() + if(BUILD_RSA) + if(NOT BUILD_FIPS_V2) + list(APPEND LIB_SOURCES wolfcrypt/src/rsa.c) + endif() endif() if(BUILD_SP) @@ -536,9 +510,10 @@ endif() if(BUILD_SP_X86_64) - list(APPEND LIB_SOURCES - wolfcrypt/src/sp_x86_64.c - wolfcrypt/src/sp_x86_64_asm.S) + list(APPEND LIB_SOURCES wolfcrypt/src/sp_x86_64.c) + if(WOLFSSL_X86_64_BUILD_ASM) + list(APPEND LIB_SOURCES wolfcrypt/src/sp_x86_64_asm.S) + endif() endif() if(NOT BUILD_FIPS_V2 AND BUILD_SP_ARM32) @@ -612,12 +587,22 @@ wolfcrypt/src/wc_port.c wolfcrypt/src/error.c) + if(BUILD_OQS_HELPER) + list(APPEND LIB_SOURCES + wolfcrypt/src/port/liboqs/liboqs.c) + endif() + + if(BUILD_ARIA) + list(APPEND LIB_SOURCES + wolfcrypt/src/port/aria/aria-crypt.c + wolfcrypt/src/port/aria/aria-cryptocb.c) + endif() if(NOT BUILD_FIPS_RAND) - list(APPEND LIB_SOURCES - wolfcrypt/src/wc_encrypt.c - wolfcrypt/src/signature.c - wolfcrypt/src/wolfmath.c) + list(APPEND LIB_SOURCES + wolfcrypt/src/wc_encrypt.c + wolfcrypt/src/signature.c + wolfcrypt/src/wolfmath.c) endif() if(BUILD_MEMORY) @@ -801,6 +786,18 @@ list(APPEND LIB_SOURCES wolfcrypt/src/falcon.c) endif() + if(BUILD_SPHINCS) + list(APPEND LIB_SOURCES wolfcrypt/src/sphincs.c) + endif() + + if(BUILD_DILITHIUM) + list(APPEND LIB_SOURCES wolfcrypt/src/dilithium.c) + endif() + + if(BUILD_EXT_KYBER) + list(APPEND LIB_SOURCES wolfcrypt/src/ext_kyber.c) + endif() + if(BUILD_LIBZ) list(APPEND LIB_SOURCES wolfcrypt/src/compress.c) endif() @@ -854,7 +851,11 @@ if(BUILD_DTLS_COMMON) list(APPEND LIB_SOURCES src/dtls.c) endif() - endif() + + if(BUILD_QUIC) + list(APPEND LIB_SOURCES src/quic.c) + endif() + endif() endif() # Corresponds to wolfcrypt/src/include.am @@ -910,34 +911,79 @@ wolfcrypt/src/port/caam/wolfcaam_hmac.c) endif() + if(BUILD_HPKE) + list(APPEND LIB_SOURCES wolfcrypt/src/hpke.c) + endif() + set(LIB_SOURCES ${LIB_SOURCES} PARENT_SCOPE) endfunction() -function(add_to_options_file DEFINITIONS OPTION_FILE) - list(REMOVE_DUPLICATES DEFINITIONS) - foreach(DEF IN LISTS DEFINITIONS) - if(DEF MATCHES "^-D") - if(DEF MATCHES "^-D(N)?DEBUG(=.+)?") - message("not outputting (N)DEBUG to ${OPTION_FILE}") - endif() - - # allow user to ignore system options - if(DEF MATCHES "^-D_.*") - file(APPEND ${OPTION_FILE} "#ifndef WOLFSSL_OPTIONS_IGNORE_SYS\n") - endif() - - string(REGEX REPLACE "^-D" "" DEF_NO_PREFIX ${DEF}) - string(REGEX REPLACE "=.*$" "" DEF_NO_EQUAL_NO_VAL ${DEF_NO_PREFIX}) - string(REPLACE "=" " " DEF_NO_EQUAL ${DEF_NO_PREFIX}) +# Function: set_wolfssl_definitions +# Parameter: SEARCH_VALUE The string to search for. (e.g. "WOLFSSL_SHA3") +# Returns: RESULT +# +# Searches WOLFSSL_DEFINITIONS for SEARCH_VALUE +# Returns RESULT = 1 (true) if the search value is found +# +# Ensures setting is only added once and prints status messages. +# +# Also sets a parent (global in cmake file) variable by the same name to 1. +# +# See also get_wolfssl_definitions() for query-only. +# +function(set_wolfssl_definitions SEARCH_VALUE RESULT) + if (${SEARCH_VALUE} STREQUAL "") + message(FATAL_ERROR "Function set_wolfssl_definitions cannot have blank SEARCH_VALUE") + endif() + + list(FIND WOLFSSL_DEFINITIONS "${SEARCH_VALUE}" pos) + string(SUBSTRING "${SEARCH_VALUE}" 0 2 PREFIX_VALUE) + + if ("${PREFIX_VALUE}" STREQUAL "-D") + message(FATAL_ERROR "Do not specify the -D prefix in set_wolfssl_definitions") + endif() + + if(${pos} EQUAL -1) + message(STATUS "${SEARCH_VALUE} not found in WOLFSSL_DEFINITIONS.") + + message(STATUS "Enabling ${SEARCH_VALUE}") + list(APPEND WOLFSSL_DEFINITIONS "-D${SEARCH_VALUE}") + set(${SEARCH_VALUE} 1 PARENT_SCOPE) + # override_cache("${SEARCH_VALUE}" "yes") # Need to check that value is settable + set(${RESULT} 1 PARENT_SCOPE) + message(STATUS "Enabling ${SEARCH_VALUE} - success") + + else() + message(STATUS "${SEARCH_VALUE} found in WOLFSSL_DEFINITIONS.") + set(${RESULT} 0 PARENT_SCOPE) + endif() +endfunction() - file(APPEND ${OPTION_FILE} "#undef ${DEF_NO_EQUAL_NO_VAL}\n") - file(APPEND ${OPTION_FILE} "#define ${DEF_NO_EQUAL}\n") +# Function: get_wolfssl_definitions +# Parameter: SEARCH_VALUE The string to search for. (e.g. "WOLFSSL_SHA3") +# Returns: RESULT +# +# Searches WOLFSSL_DEFINITIONS for SEARCH_VALUE +# Returns RESULT = 1 (true) if the search value is found +# +# Unlike set_wolfssl_definitions(), this function only queries the WOLFSSL_DEFINITIONS. +# +function(get_wolfssl_definitions SEARCH_VALUE RESULT) + if (${SEARCH_VALUE} STREQUAL "") + message(FATAL_ERROR "Function get_wolfssl_definitions cannot have blank SEARCH_VALUE") + endif() + + list(FIND WOLFSSL_DEFINITIONS "${SEARCH_VALUE}" pos) + string(SUBSTRING "${SEARCH_VALUE}" 0 2 PREFIX_VALUE) + + if ("${PREFIX_VALUE}" STREQUAL "-D") + message(FATAL_ERROR "Do not specify the -D prefix in get_wolfssl_definitions") + endif() - if(DEF MATCHES "^-D_.*") - file(APPEND ${OPTION_FILE} "#endif\n") - endif() - file(APPEND ${OPTION_FILE} "\n") - endif() - endforeach() + if(${pos} EQUAL -1) + message(STATUS "${SEARCH_VALUE} not found in WOLFSSL_DEFINITIONS.") + else() + message(STATUS "${SEARCH_VALUE} found in WOLFSSL_DEFINITIONS.") + endif() endfunction() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,7 @@ +EXTRA_DIST += cmake/README.md EXTRA_DIST += cmake/Config.cmake.in EXTRA_DIST += cmake/config.in EXTRA_DIST += cmake/functions.cmake +EXTRA_DIST += cmake/options.h.in +EXTRA_DIST += cmake/modules/FindARIA.cmake EXTRA_DIST += cmake/modules/FindOQS.cmake diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/modules/FindARIA.cmake mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/modules/FindARIA.cmake --- mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/modules/FindARIA.cmake 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/modules/FindARIA.cmake 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,108 @@ +# Filename: FindARIA.cmake +# +# Usage: +# find_package(ARIA [REQUIRED] [QUIET]) +# +# Once complete this will define: +# ARIA_FOUND - system has ARIA MagicCrypto +# ARIA_INCLUDE_DIR - the include directory containing ARIA +# ARIA_LIBRARY - the path to the libARIA library +# ARIA_IS_LOCAL - optionally indicate the MagicCrypto is found locally in ./MagicCrypto + +set(ARIA_INCLUDE_DIR) +set(ARIA_LIB_FILE) +set(ARIA_IS_LOCAL) + +# when debugging cmake, ARIA_DIR environment variable can be manually set here: +# set(ENV{ARIA_DIR} "~/MagicCrypto") +# set(ENV{ARIA_DIR} "/mnt/c/workspace/MagicCrypto") +# set(ENV{ARIA_DIR} "c:\\workspace\\MagicCrypto") + +# Make sure we have a ARIA_DIR environment variable with the path to MagicCrypto +if ("$ENV{ARIA_DIR}" STREQUAL "") + message(STATUS "The ARIA_DIR environment variable is not defined. Looking for headers in wolfssl/MagicCrypto") + if (EXISTS "${WOLFSSL_ROOT}/MagicCrypto/") + set(ARIA_INCLUDE_DIR "${WOLFSSL_ROOT}/MagicCrypto/include") + message(STATUS "Found ARIA in local MagicCrypto directory ${ARIA_INCLUDE_DIR}") + set(ARIA_IS_LOCAL 1) + else() + message(ERROR "ERROR: FindARIA.cmake missing ARIA_DIR value") + message(STATUS "Please set ARIA_DIR environment variable path to your MagicCrypto or copy to wolfssl/MagicCrypto") + endif() +else() + # If an environment variable is defined, the library CANNOT be in the local wolfssl directory. + # See CMake documentation for target_include_directories() + set(ARIA_IS_LOCAL) + set(ARIA_INCLUDE_DIR "$ENV{ARIA_DIR}/include") + message(STATUS "FindARIA.cmake found ARIA_INCLUDE_DIR = $ENV{ARIA_DIR}") + + message(STATUS "Checking environment location: ${ARIA_INCLUDE_DIR} and wolfSSL: ${WOLFSSL_ROOT}") + get_filename_component(dir1 "${ARIA_INCLUDE_DIR}" REALPATH) + get_filename_component(dir2 "${WOLFSSL_ROOT}/MagicCrypto/include" REALPATH) + message(STATUS "Found location dir: ${dir1} and ${dir2}") + if("${dir1}" STREQUAL "${dir2}") + message(STATUS "${ARIA_INCLUDE_DIR} exists within ${WOLFSSL_ROOT}.") + message(STATUS "Setting ARIA_IS_LOCAL flag and using wolfSSL path.") + set(ARIA_IS_LOCAL 1) + set(ARIA_INCLUDE_DIR "${WOLFSSL_ROOT}/MagicCrypto/include") + else() + if(EXISTS "${ARIA_INCLUDE_DIR}") + message(STATUS "Confirmed directory exists: ${ARIA_INCLUDE_DIR}") + else() + message(FATAL_ERROR "Directory not found: ${ARIA_INCLUDE_DIR}") + endif() + + message(STATUS "Confirmed ${ARIA_INCLUDE_DIR} is not in local wolfSSL root.") + endif() +endif() + +# Check that the appropriate files exist +find_path(ARIA_INCLUDE_DIR NAMES "mcapi.h" ) + +if (NOT EXISTS "${ARIA_INCLUDE_DIR}/mcapi.h") + message(FATAL_ERROR "File does not exist at ${ARIA_INCLUDE_DIR}/mcapi.h") +endif() + +if(NOT EXISTS "${ARIA_INCLUDE_DIR}/mcapi_error.h") + message(FATAL_ERROR "File does not exist at ${ARIA_INCLUDE_DIR}/mcapi_error.h") +endif() + +if(NOT EXISTS "${ARIA_INCLUDE_DIR}/mcapi_type.h") + message(FATAL_ERROR "File does not exist at $ARIA_INCLUDE_DIR/mcapi_type.h") +endif() + +if(EXISTS "$ENV{ARIA_DIR}/lib/libMagicCrypto.so") + # Found ARIA binary via environment variable + set(ARIA_LIBRARY "MagicCrypto") + set(ARIA_LIB_FILE "$ENV{ARIA_DIR}/lib/libMagicCrypto.so") + message(STATUS "ARIA Check: found libMagicCrypto.so via environment variable.") + message(STATUS "Using ${ARIA_LIB_FILE}") +else() + # Did not find ARIA binary via environment variable, so let's look in the current wolfssl directory + if(EXISTS "${WOLFSSL_ROOT}/MagicCrypto/lib/libMagicCrypto.so") + # Found in the root of wolfssl, in ./MagicCrypto/lib + set(ARIA_LIBRARY "MagicCrypto") + set(ARIA_LIB_FILE "${WOLFSSL_ROOT}/MagicCrypto/lib/libMagicCrypto.so") + message(STATUS "ARIA Check: found libMagicCrypto.so via WOLFSSL_ROOT") + message(STATUS "Using ${ARIA_LIB_FILE}") + else() + # Could not find binary. Give up. + message(ERROR "ARIA Check: could not find libMagicCrypto.so via WOLFSSL_ROOT\n" + "Looked for ${WOLFSSL_ROOT}/MagicCrypto/lib/libMagicCrypto.so") + endif() +endif() + +mark_as_advanced(ARIA_INCLUDE_DIR ARIA_LIBRARY) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(ARIA DEFAULT_MSG ARIA_INCLUDE_DIR ARIA_LIBRARY) + +# Some additional optional debugging messages, set to (1) to enable +if(0) + message(STATUS "") + message(STATUS "ARIA Check: FindARIA.cmake") + message(STATUS "ARIA Check: ARIA_INCLUDE_DIR: ${ARIA_INCLUDE_DIR}") + message(STATUS "ARIA Check: ARIA_LIBRARY: ${ARIA_LIBRARY}") + message(STATUS "ARIA Check: ARIA_FOUND: ${ARIA_FOUND}") + message(STATUS "ARIA Check: CMAKE_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}") +endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/options.h.in mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/options.h.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/cmake/options.h.in 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cmake/options.h.in 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,378 @@ +/* options.h.in + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +/* cmake template for options.h */ + +#ifndef WOLFSSL_OPTIONS_H +#define WOLFSSL_OPTIONS_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WOLFSSL_OPTIONS_IGNORE_SYS +#undef _GNU_SOURCE +#cmakedefine _GNU_SOURCE +#undef _POSIX_THREADS +#cmakedefine _POSIX_THREADS +#endif +#undef ASIO_USE_WOLFSSL +#cmakedefine ASIO_USE_WOLFSSL +#undef BOOST_ASIO_USE_WOLFSSL +#cmakedefine BOOST_ASIO_USE_WOLFSSL +#undef CURVE25519_SMALL +#cmakedefine CURVE25519_SMALL +#undef CURVE448_SMALL +#cmakedefine CURVE448_SMALL +#undef DEBUG +#cmakedefine DEBUG +#undef DEBUG_WOLFSSL +#cmakedefine DEBUG_WOLFSSL +#undef ECC_SHAMIR +#cmakedefine ECC_SHAMIR +#undef ECC_TIMING_RESISTANT +#cmakedefine ECC_TIMING_RESISTANT +#undef ED25519_SMALL +#cmakedefine ED25519_SMALL +#undef ED448_SMALL +#cmakedefine ED448_SMALL +#undef GCM_SMALL +#cmakedefine GCM_SMALL +#undef GCM_TABLE +#cmakedefine GCM_TABLE +#undef GCM_TABLE_4BIT +#cmakedefine GCM_TABLE_4BIT +#undef GCM_WORD32 +#cmakedefine GCM_WORD32 +#undef HAVE___UINT128_T +#cmakedefine HAVE___UINT128_T +#undef HAVE_AES_KEYWRAP +#cmakedefine HAVE_AES_KEYWRAP +#undef HAVE_AESCCM +#cmakedefine HAVE_AESCCM +#undef HAVE_AESGCM +#cmakedefine HAVE_AESGCM +#undef HAVE_ALPN +#cmakedefine HAVE_ALPN +#undef HAVE_ARIA +#cmakedefine HAVE_ARIA +#undef HAVE_CERTIFICATE_STATUS_REQUEST +#cmakedefine HAVE_CERTIFICATE_STATUS_REQUEST +#undef HAVE_CERTIFICATE_STATUS_REQUEST_V2 +#cmakedefine HAVE_CERTIFICATE_STATUS_REQUEST_V2 +#undef HAVE_CHACHA +#cmakedefine HAVE_CHACHA +#undef HAVE_CRL +#cmakedefine HAVE_CRL +#undef HAVE_CRL_IO +#cmakedefine HAVE_CRL_IO +#undef HAVE_CURVE25519 +#cmakedefine HAVE_CURVE25519 +#undef HAVE_CURVE448 +#cmakedefine HAVE_CURVE448 +#undef HAVE_DH_DEFAULT_PARAMS +#cmakedefine HAVE_DH_DEFAULT_PARAMS +#undef HAVE_ECC +#cmakedefine HAVE_ECC +#undef HAVE_ECH +#cmakedefine HAVE_ECH +#undef HAVE_ED25519 +#cmakedefine HAVE_ED25519 +#undef HAVE_ED448 +#cmakedefine HAVE_ED448 +#undef HAVE_ENCRYPT_THEN_MAC +#cmakedefine HAVE_ENCRYPT_THEN_MAC +#undef HAVE_EX_DATA +#cmakedefine HAVE_EX_DATA +#undef HAVE_EXTENDED_MASTER +#cmakedefine HAVE_EXTENDED_MASTER +#undef HAVE_FFDHE_2048 +#cmakedefine HAVE_FFDHE_2048 +#undef HAVE_HASHDRBG +#cmakedefine HAVE_HASHDRBG +#undef HAVE_HKDF +#cmakedefine HAVE_HKDF +#undef HAVE_HPKE +#cmakedefine HAVE_HPKE +#undef HAVE_KEYING_MATERIAL +#cmakedefine HAVE_KEYING_MATERIAL +#undef HAVE_LIBOQS +#cmakedefine HAVE_LIBOQS +#undef HAVE_MAX_FRAGMENT +#cmakedefine HAVE_MAX_FRAGMENT +#undef HAVE_OCSP +#cmakedefine HAVE_OCSP +#undef HAVE_ONE_TIME_AUTH +#cmakedefine HAVE_ONE_TIME_AUTH +#undef HAVE_PKCS7 +#cmakedefine HAVE_PKCS7 +#undef HAVE_POLY1305 +#cmakedefine HAVE_POLY1305 +#undef HAVE_PTHREAD +#cmakedefine HAVE_PTHREAD +#undef HAVE_REPRODUCIBLE_BUILD +#cmakedefine HAVE_REPRODUCIBLE_BUILD +#undef HAVE_SESSION_TICKET +#cmakedefine HAVE_SESSION_TICKET +#undef HAVE_SNI +#cmakedefine HAVE_SNI +#undef HAVE_SUPPORTED_CURVES +#cmakedefine HAVE_SUPPORTED_CURVES +#undef HAVE_THREAD_LS +#cmakedefine HAVE_THREAD_LS +#undef HAVE_TLS_EXTENSIONS +#cmakedefine HAVE_TLS_EXTENSIONS +#undef HAVE_TRUNCATED_HMAC +#cmakedefine HAVE_TRUNCATED_HMAC +#undef HAVE_TRUSTED_CA +#cmakedefine HAVE_TRUSTED_CA +#undef HAVE_X963_KDF +#cmakedefine HAVE_X963_KDF +#undef NO_AES +#cmakedefine NO_AES +#undef NO_AES_CBC +#cmakedefine NO_AES_CBC +#undef NO_ASN +#cmakedefine NO_ASN +#undef NO_ASN_CRYPT +#cmakedefine NO_ASN_CRYPT +#undef NO_BIG_INT +#cmakedefine NO_BIG_INT +#undef NO_CERTS +#cmakedefine NO_CERTS +#undef NO_CHACHA_ASM +#cmakedefine NO_CHACHA_ASM +#undef NO_CODING +#cmakedefine NO_CODING +#undef NO_CURVED25519_128BIT +#cmakedefine NO_CURVED25519_128BIT +#undef NO_CURVED448_128BIT +#cmakedefine NO_CURVED448_128BIT +#undef NO_DES3 +#cmakedefine NO_DES3 +#undef NO_DH +#cmakedefine NO_DH +#undef NO_DSA +#cmakedefine NO_DSA +#undef NO_ERROR_QUEUE +#cmakedefine NO_ERROR_QUEUE +#undef NO_ERROR_STRINGS +#cmakedefine NO_ERROR_STRINGS +#undef NO_FILESYSTEM +#cmakedefine NO_FILESYSTEM +#undef NO_INLINE +#cmakedefine NO_INLINE +#undef NO_MD4 +#cmakedefine NO_MD4 +#undef NO_MD5 +#cmakedefine NO_MD5 +#undef NO_OLD_RNGNAME +#cmakedefine NO_OLD_RNGNAME +#undef NO_OLD_SHA_NAMES +#cmakedefine NO_OLD_SHA_NAMES +#undef NO_OLD_SSL_NAMES +#cmakedefine NO_OLD_SSL_NAMES +#undef NO_OLD_TLS +#cmakedefine NO_OLD_TLS +#undef NO_OLD_WC_NAMES +#cmakedefine NO_OLD_WC_NAMES +#undef NO_PKCS12 +#cmakedefine NO_PKCS12 +#undef NO_PSK +#cmakedefine NO_PSK +#undef NO_PWDBASED +#cmakedefine NO_PWDBASED +#undef NO_RC4 +#cmakedefine NO_RC4 +#undef NO_RSA +#cmakedefine NO_RSA +#undef NO_SESSION_CACHE_REF +#cmakedefine NO_SESSION_CACHE_REF +#undef NO_SHA +#cmakedefine NO_SHA +#undef NO_WOLFSSL_MEMORY +#cmakedefine NO_WOLFSSL_MEMORY +#undef OPENSSL_ALL +#cmakedefine OPENSSL_ALL +#undef OPENSSL_EXTRA +#cmakedefine OPENSSL_EXTRA +#undef OPENSSL_NO_SSL2 +#cmakedefine OPENSSL_NO_SSL2 +#undef OPENSSL_NO_SSL3 +#cmakedefine OPENSSL_NO_SSL3 +#undef SSL_TXT_TLSV1_2 +#cmakedefine SSL_TXT_TLSV1_2 +#undef TFM_ECC256 +#cmakedefine TFM_ECC256 +#undef TFM_NO_ASM +#cmakedefine TFM_NO_ASM +#undef TFM_TIMING_RESISTANT +#cmakedefine TFM_TIMING_RESISTANT +#undef USE_FAST_MATH +#cmakedefine USE_FAST_MATH +#undef WC_16BIT_CPU +#cmakedefine WC_16BIT_CPU +#undef WC_ECC_NONBLOCK +#cmakedefine WC_ECC_NONBLOCK +#undef WC_NO_ASYNC_THREADING +#cmakedefine WC_NO_ASYNC_THREADING +#undef WC_NO_HARDEN +#cmakedefine WC_NO_HARDEN +#undef WC_NO_HASHDRBG +#cmakedefine WC_NO_HASHDRBG +#undef WC_NO_RNG +#cmakedefine WC_NO_RNG +#undef WC_NO_RSA_OAEP +#cmakedefine WC_NO_RSA_OAEP +#undef WC_RSA_BLINDING +#cmakedefine WC_RSA_BLINDING +#undef WC_RSA_NO_PADDING +#cmakedefine WC_RSA_NO_PADDING +#undef WC_RSA_PSS +#cmakedefine WC_RSA_PSS +#undef WOLF_CRYPTO_CB +#cmakedefine WOLF_CRYPTO_CB +#undef WOLFSSL_AARCH64_BUILD +#cmakedefine WOLFSSL_AARCH64_BUILD +#undef WOLFSSL_AES_CFB +#cmakedefine WOLFSSL_AES_CFB +#undef WOLFSSL_AES_COUNTER +#cmakedefine WOLFSSL_AES_COUNTER +#undef WOLFSSL_AES_DIRECT +#cmakedefine WOLFSSL_AES_DIRECT +#undef WOLFSSL_AES_OFB +#cmakedefine WOLFSSL_AES_OFB +#undef WOLFSSL_AES_SIV +#cmakedefine WOLFSSL_AES_SIV +#undef WOLFSSL_ALT_CERT_CHAINS +#cmakedefine WOLFSSL_ALT_CERT_CHAINS +#undef WOLFSSL_APPLE_NATIVE_CERT_VALIDATION +#cmakedefine WOLFSSL_APPLE_NATIVE_CERT_VALIDATION +#undef WOLFSSL_ASIO +#cmakedefine WOLFSSL_ASIO +#undef WOLFSSL_BASE64_ENCODE +#cmakedefine WOLFSSL_BASE64_ENCODE +#undef WOLFSSL_CAAM +#cmakedefine WOLFSSL_CAAM +#undef WOLFSSL_CERT_EXT +#cmakedefine WOLFSSL_CERT_EXT +#undef WOLFSSL_CERT_GEN +#cmakedefine WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_GEN_CACHE +#cmakedefine WOLFSSL_CERT_GEN_CACHE +#undef WOLFSSL_CERT_NAME_ALL +#cmakedefine WOLFSSL_CERT_NAME_ALL +#undef WOLFSSL_CERT_REQ +#cmakedefine WOLFSSL_CERT_REQ +#undef WOLFSSL_CMAC +#cmakedefine WOLFSSL_CMAC +#undef WOLFSSL_DES_ECB +#cmakedefine WOLFSSL_DES_ECB +#undef WOLFSSL_DH_CONST +#cmakedefine WOLFSSL_DH_CONST +#undef WOLFSSL_DTLS +#cmakedefine WOLFSSL_DTLS +#undef WOLFSSL_DTLS_CID +#cmakedefine WOLFSSL_DTLS_CID +#undef WOLFSSL_DTLS13 +#cmakedefine WOLFSSL_DTLS13 +#undef WOLFSSL_EITHER_SIDE +#cmakedefine WOLFSSL_EITHER_SIDE +#undef WOLFSSL_ENCRYPTED_KEYS +#cmakedefine WOLFSSL_ENCRYPTED_KEYS +#undef WOLFSSL_ERROR_CODE_OPENSSL +#cmakedefine WOLFSSL_ERROR_CODE_OPENSSL +#undef WOLFSSL_IP_ALT_NAME +#cmakedefine WOLFSSL_IP_ALT_NAME +#undef WOLFSSL_KEY_GEN +#cmakedefine WOLFSSL_KEY_GEN +#undef WOLFSSL_NO_ASM +#cmakedefine WOLFSSL_NO_ASM +#undef WOLFSSL_NO_SHAKE128 +#cmakedefine WOLFSSL_NO_SHAKE128 +#undef WOLFSSL_NO_SHAKE256 +#cmakedefine WOLFSSL_NO_SHAKE256 +#undef WOLFSSL_NO_TLS12 +#cmakedefine WOLFSSL_NO_TLS12 +#undef WOLFSSL_POST_HANDSHAKE_AUTH +#cmakedefine WOLFSSL_POST_HANDSHAKE_AUTH +#undef WOLFSSL_PSS_LONG_SALT +#cmakedefine WOLFSSL_PSS_LONG_SALT +#undef WOLFSSL_PUBLIC_MP +#cmakedefine WOLFSSL_PUBLIC_MP +#undef WOLFSSL_QUIC +#cmakedefine WOLFSSL_QUIC +#undef WOLFSSL_SEND_HRR_COOKIE +#cmakedefine WOLFSSL_SEND_HRR_COOKIE +#undef WOLFSSL_SHA224 +#cmakedefine WOLFSSL_SHA224 +#undef WOLFSSL_SHA3 +#cmakedefine WOLFSSL_SHA3 +#undef WOLFSSL_SHA3_SMALL +#cmakedefine WOLFSSL_SHA3_SMALL +#undef WOLFSSL_SHA384 +#cmakedefine WOLFSSL_SHA384 +#undef WOLFSSL_SHA512 +#cmakedefine WOLFSSL_SHA512 +#undef WOLFSSL_SHAKE128 +#cmakedefine WOLFSSL_SHAKE128 +#undef WOLFSSL_SHAKE256 +#cmakedefine WOLFSSL_SHAKE256 +#undef WOLFSSL_SRTP +#cmakedefine WOLFSSL_SRTP +#undef WOLFSSL_SYS_CA_CERTS +#cmakedefine WOLFSSL_SYS_CA_CERTS +#undef WOLFSSL_TICKET_HAVE_ID +#cmakedefine WOLFSSL_TICKET_HAVE_ID +#undef WOLFSSL_TICKET_NONCE_MALLOC +#cmakedefine WOLFSSL_TICKET_NONCE_MALLOC +#undef WOLFSSL_TLS13 +#cmakedefine WOLFSSL_TLS13 +#undef WOLFSSL_USE_ALIGN +#cmakedefine WOLFSSL_USE_ALIGN +#undef WOLFSSL_USER_SETTINGS_ASM +#cmakedefine WOLFSSL_USER_SETTINGS_ASM +#undef WOLFSSL_W64_WRAPPER +#cmakedefine WOLFSSL_W64_WRAPPER +#undef WOLFSSL_WOLFSSH +#cmakedefine WOLFSSL_WOLFSSH +#undef WOLFSSL_X86_64_BUILD +#cmakedefine WOLFSSL_X86_64_BUILD +#undef NO_DES3_TLS_SUITES +#cmakedefine NO_DES3_TLS_SUITES +#undef WOLFSSL_EXPERIMENTAL_SETTINGS +#cmakedefine WOLFSSL_EXPERIMENTAL_SETTINGS +#undef WOLFSSL_HAVE_KYBER +#cmakedefine WOLFSSL_HAVE_KYBER +#undef WOLFSSL_WC_KYBER +#cmakedefine WOLFSSL_WC_KYBER +#undef NO_WOLFSSL_STUB +#cmakedefine NO_WOLFSSL_STUB + +#ifdef __cplusplus +} +#endif + + +#endif /* WOLFSSL_OPTIONS_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/configure.ac mariadb-10.11.9/extra/wolfssl/wolfssl/configure.ac --- mariadb-10.11.6/extra/wolfssl/wolfssl/configure.ac 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/configure.ac 2024-08-03 07:30:00.000000000 +0000 @@ -1,13 +1,13 @@ # configure.ac # -# Copyright (C) 2006-2021 wolfSSL Inc. +# Copyright (C) 2006-2024 wolfSSL Inc. # # This file is part of wolfSSL. (formerly known as CyaSSL) # # -AC_COPYRIGHT([Copyright (C) 2006-2020 wolfSSL Inc.]) +AC_COPYRIGHT([Copyright (C) 2006-2024 wolfSSL Inc.]) AC_PREREQ([2.69]) -AC_INIT([wolfssl],[5.6.3],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[https://www.wolfssl.com]) +AC_INIT([wolfssl],[5.7.2],[https://github.com/wolfssl/wolfssl/issues],[wolfssl],[https://www.wolfssl.com]) AC_CONFIG_AUX_DIR([build-aux]) # The following sets CFLAGS to empty if unset on command line. We do not @@ -45,22 +45,20 @@ # shared library versioning # The three numbers in the libwolfssl.so.*.*.* file name. Unfortunately -# these numbers don't always line up nicely with the library version. -WOLFSSL_LIBRARY_VERSION_FIRST=35 -WOLFSSL_LIBRARY_VERSION_SECOND=5 -WOLFSSL_LIBRARY_VERSION_THIRD=1 -WOLFSSL_LIBRARY_VERSION=40:1:5 -# | | | -# +------+ | +---+ -# | | | -# current:revision:age -# | | | -# | | +- increment if interfaces have been added -# | | set to zero if interfaces have been removed -# | | or changed -# | +- increment if source code has changed -# | set to zero if current is incremented -# +- increment if interfaces have been added, removed or changed + +# increment if interfaces have been removed or changed +WOLFSSL_LIBRARY_VERSION_FIRST=42 + +# increment if interfaces have been added +# set to zero if WOLFSSL_LIBRARY_VERSION_FIRST is incremented +WOLFSSL_LIBRARY_VERSION_SECOND=2 + +# increment if source code has changed +# set to zero if WOLFSSL_LIBRARY_VERSION_FIRST is incremented or +# WOLFSSL_LIBRARY_VERSION_SECOND is incremented +WOLFSSL_LIBRARY_VERSION_THIRD=0 + +WOLFSSL_LIBRARY_VERSION=${WOLFSSL_LIBRARY_VERSION_FIRST}:${WOLFSSL_LIBRARY_VERSION_SECOND}:${WOLFSSL_LIBRARY_VERSION_THIRD} AC_SUBST([WOLFSSL_LIBRARY_VERSION_FIRST]) AC_SUBST([WOLFSSL_LIBRARY_VERSION_SECOND]) AC_SUBST([WOLFSSL_LIBRARY_VERSION_THIRD]) @@ -71,6 +69,9 @@ AM_CFLAGS="$AM_CFLAGS $CFLAG_VISIBILITY" ]) +WOLFSSL_BUILD_DATE=$(date -R) +AC_SUBST([WOLFSSL_BUILD_DATE]) + # Moved these size of and type checks before the library checks. # The library checks add the library to subsequent test compiles @@ -99,6 +100,21 @@ REPRODUCIBLE_BUILD_DEFAULT=no fi +# Fail when an option is passed that is not recognized +m4_divert_once([DEFAULTS], [enable_option_checking=fatal]) + +# Allow experimental settings +AC_ARG_ENABLE([experimental], + [AS_HELP_STRING([--enable-experimental],[Allow experimental settings in the configuration (default: disabled)])], + [ ENABLED_EXPERIMENTAL=$enableval ], + [ ENABLED_EXPERIMENTAL=no ] + ) +if test "$ENABLED_EXPERIMENTAL" = "yes" +then + AS_IF([ test "$ENABLED_DISTRO" = "yes" && test "$ENABLED_EXPERIMENTAL" = "yes" ],[ AC_MSG_ERROR([--enable-distro and --enable-experimental are mutually exclusive.]) ]) + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_EXPERIMENTAL_SETTINGS" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_EXPERIMENTAL_SETTINGS" +fi AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stddef.h time.h sys/ioctl.h sys/socket.h sys/time.h errno.h sys/un.h]) AC_CHECK_LIB([network],[socket]) @@ -184,6 +200,27 @@ [AM_CCASFLAGS="$DEBUG_CFLAGS $AM_CCASFLAGS"], [AM_CCASFLAGS="$AM_CCASFLAGS -DNDEBUG"]) +AC_ARG_ENABLE([debug-code-points], + [ AS_HELP_STRING([--enable-debug-code-points],[Include source file and line number in --enable-verbose messages.]) ], + [ ENABLED_DEBUG_CODEPOINTS=$enableval ], + [ ENABLED_DEBUG_CODEPOINTS=no ] + ) + +if test "$ENABLED_DEBUG_CODEPOINTS" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DEBUG_CODEPOINTS" +fi + +AC_ARG_ENABLE([debug-trace-errcodes], + [ AS_HELP_STRING([--enable-debug-trace-errcodes],[Print trace messages when library errors are thrown.]) ], + [ ENABLED_DEBUG_TRACE_ERRCODES=$enableval ], + [ ENABLED_DEBUG_TRACE_ERRCODES=no ] + ) + +if test "$ENABLED_DEBUG_TRACE_ERRCODES" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DEBUG_TRACE_ERROR_CODES" +fi # Start without certificates enabled and enable if a certificate algorithm is # enabled @@ -307,6 +344,10 @@ ENABLED_WOLFENGINE="yes" ENABLED_FIPS="v5" ], + [fips-v6],[ + ENABLED_WOLFENGINE="yes" + ENABLED_FIPS="v6" + ], [fips-ready],[ ENABLED_WOLFENGINE="yes" ENABLED_FIPS="ready" @@ -333,6 +374,7 @@ # dev - FIPS 140-3 settings with in-tree wolfcrypt sources, features freely adjustable # v5-ready - Alias for ready. # v5-dev - Alias for dev. +# v6 - The SRTP-KDF-full-submission # # These options have been retired, but are listed here for historical reference: # v5-RC8 - historical FIPS 140-3 (wolfCrypt WCv5.0-RC8). @@ -346,7 +388,6 @@ AS_CASE([$ENABLED_FIPS], [no],[ FIPS_VERSION="none" - ENABLED_FIPS="no" ], [disabled],[ FIPS_VERSION="disabled" @@ -354,14 +395,14 @@ ], [v1|yes|cert2425],[ FIPS_VERSION="v1" - HAVE_FIPS_VERSION=1 + HAVE_FIPS_VERSION_MAJOR=1 ENABLED_FIPS="yes" DEF_SP_MATH="no" DEF_FAST_MATH="yes" ], [v2|cert3389],[ FIPS_VERSION="v2" - HAVE_FIPS_VERSION=2 + HAVE_FIPS_VERSION_MAJOR=2 HAVE_FIPS_VERSION_MINOR=0 ENABLED_FIPS="yes" DEF_SP_MATH="no" @@ -369,7 +410,7 @@ ], [rand],[ FIPS_VERSION="rand" - HAVE_FIPS_VERSION=2 + HAVE_FIPS_VERSION_MAJOR=2 HAVE_FIPS_VERSION_MINOR=1 ENABLED_FIPS="yes" DEF_SP_MATH="no" @@ -377,38 +418,76 @@ ], [v5|v5-RC12],[ FIPS_VERSION="v5-RC12" - HAVE_FIPS_VERSION=5 + HAVE_FIPS_VERSION_MAJOR=5 HAVE_FIPS_VERSION_MINOR=2 ENABLED_FIPS="yes" DEF_SP_MATH="no" DEF_FAST_MATH="yes" ], - [ready|v5-ready],[ - FIPS_VERSION="ready" - HAVE_FIPS_VERSION=5 + [v5-ready],[ + FIPS_VERSION="v5-ready" + HAVE_FIPS_VERSION_MAJOR=5 HAVE_FIPS_VERSION_MINOR=3 ENABLED_FIPS="yes" DEF_SP_MATH="no" DEF_FAST_MATH="yes" ], - [dev|v5-dev],[ - FIPS_VERSION="dev" - HAVE_FIPS_VERSION=5 + [v5-dev],[ + FIPS_VERSION="v5-dev" + HAVE_FIPS_VERSION_MAJOR=5 HAVE_FIPS_VERSION_MINOR=3 ENABLED_FIPS="yes" # for dev, DEF_SP_MATH and DEF_FAST_MATH follow non-FIPS defaults (currently sp-math-all) ], + [v6],[ + FIPS_VERSION="v6" + HAVE_FIPS_VERSION=6 + HAVE_FIPS_VERSION_MAJOR=6 + HAVE_FIPS_VERSION_MINOR=0 + HAVE_FIPS_VERSION_PATCH=0 + ENABLED_FIPS="yes" + DEF_SP_MATH="yes" + DEF_FAST_MATH="no" + ], + # Should always remain one ahead of the latest so as not to be confused with + # the latest + [ready|v6-ready],[ + FIPS_VERSION="ready" + HAVE_FIPS_VERSION=7 + HAVE_FIPS_VERSION_MAJOR=7 + HAVE_FIPS_VERSION_MINOR=0 + HAVE_FIPS_VERSION_PATCH=0 + ENABLED_FIPS="yes" + DEF_SP_MATH="yes" + DEF_FAST_MATH="no" + ], + [dev|v6-dev],[ + FIPS_VERSION="dev" + HAVE_FIPS_VERSION_MAJOR=7 + HAVE_FIPS_VERSION_MINOR=0 + HAVE_FIPS_VERSION_PATCH=0 + ENABLED_FIPS="yes" + # for dev, DEF_SP_MATH and DEF_FAST_MATH follow non-FIPS defaults (currently sp-math-all) + ], [ - AC_MSG_ERROR([Invalid value for --enable-fips "$ENABLED_FIPS" (main options: v1, v2, v5, ready, dev, rand, no, disabled)]) + AC_MSG_ERROR([Invalid value for --enable-fips "$ENABLED_FIPS" (main options: v1, v2, v5, v6, ready, dev, rand, no, disabled)]) ]) +if test -z "$HAVE_FIPS_VERSION_MAJOR" +then + HAVE_FIPS_VERSION_MAJOR=0 +fi if test -z "$HAVE_FIPS_VERSION_MINOR" then HAVE_FIPS_VERSION_MINOR=0 fi +if test -z "$HAVE_FIPS_VERSION_PATCH" +then + HAVE_FIPS_VERSION_PATCH=0 +fi if test -z "$HAVE_FIPS_VERSION" then - HAVE_FIPS_VERSION=0 + HAVE_FIPS_VERSION="$HAVE_FIPS_VERSION_MAJOR" fi if test "$ENABLED_FIPS" != "no" @@ -419,16 +498,11 @@ AS_CASE([$FIPS_VERSION], [none], [ - AS_IF([ test -s $srcdir/wolfcrypt/src/fips.c -o -s $srcdir/ctaocrypt/src/fips.c ], + AS_IF([ test -s $srcdir/wolfcrypt/src/fips.c ], [AC_MSG_ERROR([FIPS source tree is incompatible with non-FIPS build (requires --enable-fips)])]) ], [disabled], [], - [v1], - [ - AS_IF([ ! test -s $srcdir/ctaocrypt/src/fips.c], - [AC_MSG_ERROR([non-FIPS-v1 source tree is incompatible with --enable-fips=$enableval])]) - ], [ AS_IF([ ! test -s $srcdir/wolfcrypt/src/fips.c], [AC_MSG_ERROR([non-FIPS source tree is incompatible with --enable-fips=$enableval])]) @@ -455,9 +529,35 @@ RANLIB=ranlib fi xxx_ranlib_flags=$(${RANLIB} --help 2>&1) - AM_CFLAGS="$AM_CFLAGS -DHAVE_REPRODUCIBLE_BUILD" + AS_CASE([$xxx_ar_flags],[*'use zero for timestamps and uids/gids'*],[AR_FLAGS="Dcr" lt_ar_flags="Dcr"]) AS_CASE([$xxx_ranlib_flags],[*'Use zero for symbol map timestamp'*],[RANLIB="${RANLIB} -D"]) + + AM_CFLAGS="$AM_CFLAGS -DHAVE_REPRODUCIBLE_BUILD -g0" + + # opportunistically use -ffile-prefix-map (added in GCC8 and LLVM10) + + if "$CC" -ffile-prefix-map=/tmp=. -x c - -o /dev/null >/dev/null 2>&1 <<' EOF' + #include + int main(int argc, char **argv) { + (void)argc; (void)argv; return 0; + } + EOF + then + AM_CFLAGS="$AM_CFLAGS -ffile-prefix-map=\$(abs_top_srcdir)/= -ffile-prefix-map=\$(top_srcdir)/=" + fi + + # opportunistically use linker option --build-id=none + + if "$CC" -Wl,--build-id=none -x c - -o /dev/null >/dev/null 2>&1 <<' EOF' + #include + int main(int argc, char **argv) { + (void)argc; (void)argv; return 0; + } + EOF + then + AM_LDFLAGS="$AM_LDFLAGS -Wl,--build-id=none" + fi fi @@ -509,6 +609,9 @@ if test "$ENABLED_LINUXKM_DEFAULTS" = "yes" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DH_CONST -DWOLFSSL_SP_MOD_WORD_RP -DWOLFSSL_SP_DIV_64 -DWOLFSSL_SP_DIV_WORD_HALF -DWOLFSSL_SMALL_STACK_STATIC -DWOLFSSL_TEST_SUBROUTINE=static" + if test "$ENABLED_LINUXKM_PIE" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_OCSP_ISSUER_CHECK" + fi if test "$ENABLED_FIPS" = "no"; then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_OLD_PRIME_CHECK" fi @@ -663,7 +766,7 @@ # if sp-math-all is not set, then enable fast math if test "x$ENABLED_FASTMATH" = "xyes" && test "$enable_sp_math_all" = "" && test "$enable_sp_math" = "" then - # turn off fastmth if leanpsk on or asn off (w/o DH and ECC) + # turn off fastmath if leanpsk on or asn off (w/o DH and ECC) if test "$ENABLED_LEANPSK" = "yes" || test "$ENABLED_ASN" = "no" then if test "$ENABLED_DH" = "no" && test "$ENABLED_ECC" = "no" && test "$ENABLED_RSA" = "no" @@ -721,15 +824,18 @@ # this set is also enabled by enable-all-crypto: test "$enable_atomicuser" = "" && enable_atomicuser=yes test "$enable_aesgcm" = "" && enable_aesgcm=yes - test "$enable_aesgcm_stream" = "" && enable_aesgcm_stream=yes + test "$enable_aesgcm_stream" = "" && test "$enable_aesgcm" = "yes" && enable_aesgcm_stream=yes test "$enable_aesccm" = "" && enable_aesccm=yes test "$enable_aesctr" = "" && enable_aesctr=yes + test "$enable_aeseax" = "" && enable_aeseax=yes test "$enable_aesofb" = "" && enable_aesofb=yes test "$enable_aescfb" = "" && enable_aescfb=yes test "$enable_aescbc_length_checks" = "" && enable_aescbc_length_checks=yes test "$enable_camellia" = "" && enable_camellia=yes test "$enable_ripemd" = "" && enable_ripemd=yes test "$enable_sha224" = "" && enable_sha224=yes + test "$enable_sha512" = "" && enable_sha512=yes + test "$enable_sha3" = "" && enable_sha3=yes test "$enable_shake128" = "" && enable_shake128=yes test "$enable_shake256" = "" && enable_shake256=yes test "$enable_sessioncerts" = "" && enable_sessioncerts=yes @@ -741,22 +847,21 @@ test "$enable_hkdf" = "" && enable_hkdf=yes test "$enable_curve25519" = "" && enable_curve25519=yes test "$enable_curve448" = "" && enable_curve448=yes - test "$enable_fpecc" = "" && enable_fpecc=yes - test "$enable_eccencrypt" = "" && enable_eccencrypt=yes + test "$enable_fpecc" = "" && test "$enable_ecc" != "no" && enable_fpecc=yes + test "$enable_eccencrypt" = "" && test "$enable_ecc" != "no" && enable_eccencrypt=yes test "$enable_psk" = "" && enable_psk=yes test "$enable_cmac" = "" && enable_cmac=yes test "$enable_siphash" = "" && enable_siphash=yes - test "$enable_xts" = "" && enable_xts=yes test "$enable_ocsp" = "" && enable_ocsp=yes - test "$enable_ocspstapling" = "" && enable_ocspstapling=yes - test "$enable_ocspstapling2" = "" && enable_ocspstapling2=yes + test "$enable_ocspstapling" = "" && test "$enable_ocsp" != "no" && enable_ocspstapling=yes + test "$enable_ocspstapling2" = "" && test "$enable_ocsp" != "no" && enable_ocspstapling2=yes test "$enable_crl" = "" && enable_crl=yes test "$enable_supportedcurves" = "" && enable_supportedcurves=yes test "$enable_tlsx" = "" && enable_tlsx=yes test "$enable_pwdbased" = "" && enable_pwdbased=yes test "$enable_aeskeywrap" = "" && enable_aeskeywrap=yes test "$enable_x963kdf" = "" && enable_x963kdf=yes - test "$enable_scrypt" = "" && enable_scrypt=yes + test "$enable_scrypt" = "" && test "$enable_hmac" != "no" && enable_scrypt=yes test "$enable_indef" = "" && enable_indef=yes test "$enable_enckeys" = "" && enable_enckeys=yes test "$enable_hashflags" = "" && enable_hashflags=yes @@ -764,22 +869,19 @@ test "$enable_base64encode" = "" && enable_base64encode=yes test "$enable_base16" = "" && enable_base16=yes test "$enable_arc4" = "" && enable_arc4=yes - test "$enable_des3" = "" && enable_des3=yes - test "$enable_nullcipher" = "" && enable_nullcipher=yes test "$enable_blake2" = "" && enable_blake2=yes test "$enable_blake2s" = "" && enable_blake2s=yes test "$enable_md2" = "" && enable_md2=yes test "$enable_md4" = "" && enable_md4=yes test "$enable_cryptocb" = "" && enable_cryptocb=yes test "$enable_anon" = "" && enable_anon=yes - test "$enable_ssh" = "" && enable_ssh=yes + test "$enable_ssh" = "" && test "$enable_hmac" != "no" && enable_ssh=yes test "$enable_savesession" = "" && enable_savesession=yes test "$enable_savecert" = "" && enable_savecert=yes test "$enable_postauth" = "" && enable_postauth=yes test "$enable_hrrcookie" = "" && enable_hrrcookie=yes test "$enable_fallback_scsv" = "" && enable_fallback_scsv=yes - test "$enable_mcast" = "" && enable_mcast=yes test "$enable_webserver" = "" && enable_webserver=yes test "$enable_crl_monitor" = "" && enable_crl_monitor=yes test "$enable_sni" = "" && enable_sni=yes @@ -790,25 +892,24 @@ test "$enable_session_ticket" = "" && enable_session_ticket=yes test "$enable_earlydata" = "" && enable_earlydata=yes test "$enable_ech" = "" && enable_ech=yes - - if test "$ENABLED_32BIT" != "yes" - then - test "$enable_sha512" = "" && enable_sha512=yes - test "$enable_sha3" = "" && enable_sha3=yes - fi + test "$enable_srtp" = "" && enable_srtp=yes + test "$enable_rpk" = "" && enable_rpk=yes if test "$ENABLED_LINUXKM_DEFAULTS" != "yes" then test "$enable_compkey" = "" && enable_compkey=yes + test "$enable_quic" = "" && test "$enable_cryptonly" != "yes" && enable_quic=yes AM_CFLAGS="$AM_CFLAGS -DHAVE_CRL_IO -DHAVE_IO_TIMEOUT" fi # sp-math is incompatible with opensslextra, ECC custom curves, and DSA. if test "$ENABLED_SP_MATH" = "no" then - test "$enable_dsa" = "" && enable_dsa=yes - test "$enable_ecccustcurves" = "" && enable_ecccustcurves=yes - test "$enable_brainpool" = "" && enable_brainpool=yes + test "$enable_dsa" = "" && test "$enable_sha" != "no" && enable_dsa=yes + if test "$ENABLED_FIPS" = "no" || test "$HAVE_FIPS_VERSION" -le 5; then + test "$enable_ecccustcurves" = "" && enable_ecccustcurves=yes + test "$enable_brainpool" = "" && enable_brainpool=yes + fi test "$enable_srp" = "" && enable_srp=yes # linuxkm is incompatible with opensslextra and its dependents. if test "$ENABLED_LINUXKM_DEFAULTS" != "yes" @@ -830,23 +931,24 @@ test "$enable_openvpn" = "" && enable_openvpn=yes test "$enable_asio" = "" && enable_asio=yes test "$enable_libwebsockets" = "" && enable_libwebsockets=yes - test "$enable_qt" = "" && enable_qt=yes + if test "$ENABLED_FIPS" = "no" || test "$HAVE_FIPS_VERSION" -le 5; then + test "$enable_qt" = "" && enable_qt=yes + fi fi fi if test "$ENABLED_FIPS" = "no" then test "$enable_pkcallbacks" = "" && enable_pkcallbacks=yes - test "$enable_xchacha" = "" && enable_xchacha=yes + test "$enable_xchacha" = "" && test "$enable_chacha" != "no" && enable_xchacha=yes test "$enable_scep" = "" && enable_scep=yes test "$enable_pkcs7" = "" && enable_pkcs7=yes - if test "$ENABLED_32BIT" != "yes" - then - test "$enable_ed25519" = "" && enable_ed25519=yes - test "$enable_ed25519_stream" = "" && enable_ed25519_stream=yes - test "$enable_ed448" = "" && enable_ed448=yes - test "$enable_ed448_stream" = "" && enable_ed448_stream=yes - fi + test "$enable_nullcipher" = "" && enable_nullcipher=yes + test "$enable_mcast" = "" && enable_mcast=yes + test "$enable_ed25519" = "" && enable_ed25519=yes + test "$enable_ed25519_stream" = "" && test "$enable_ed25519" != "no" && enable_ed25519_stream=yes + test "$enable_ed448" = "" && enable_ed448=yes + test "$enable_ed448_stream" = "" && test "$enable_ed448" != "no" && enable_ed448_stream=yes if test "$ENABLED_LINUXKM_DEFAULTS" != "yes" then @@ -855,15 +957,21 @@ test "$enable_curl" = "" && enable_curl=yes test "$enable_tcpdump" = "" && enable_tcpdump=yes - test "$enable_eccsi" = "" && enable_eccsi=yes - test "$enable_sakke" = "" && enable_sakke=yes + test "$enable_eccsi" = "" && test "$enable_ecc" != "no" && enable_eccsi=yes + test "$enable_sakke" = "" && test "$enable_ecc" != "no" && enable_sakke=yes fi fi - if test "$ENABLED_FIPS" = "no" || test "$ENABLED_FIPS" = "dev"; then + if test "$ENABLED_FIPS" = "no" || test "$HAVE_FIPS_VERSION" -ge 6 || test "$FIPS_VERSION" = "v5-dev"; then + test "$enable_aesxts" = "" && enable_aesxts=yes + test "$enable_aesxts_stream" = "" && test "$enable_aesxts" = "yes" && (test "$enable_armasm" = "" || test "$enable_armasm" = "no") && enable_aesxts_stream=yes test "$enable_aessiv" = "" && enable_aessiv=yes fi + if test "$ENABLED_FIPS" = "no" || test "$HAVE_FIPS_VERSION" -le 5; then + test "$enable_des3" = "" && enable_des3=yes + fi + # Enable DH const table speedups (eliminates `-lm` math lib dependency) AM_CFLAGS="$AM_CFLAGS -DHAVE_FFDHE_2048 -DHAVE_FFDHE_3072" DEFAULT_MAX_CLASSIC_ASYM_KEY_BITS=4096 @@ -907,15 +1015,18 @@ then test "$enable_atomicuser" = "" && enable_atomicuser=yes test "$enable_aesgcm" = "" && enable_aesgcm=yes - test "$enable_aesgcm_stream" = "" && enable_aesgcm_stream=yes + test "$enable_aesgcm_stream" = "" && test "$enable_aesgcm" = "yes" && enable_aesgcm_stream=yes test "$enable_aesccm" = "" && enable_aesccm=yes test "$enable_aesctr" = "" && enable_aesctr=yes + test "$enable_aeseax" = "" && enable_aeseax=yes test "$enable_aesofb" = "" && enable_aesofb=yes test "$enable_aescfb" = "" && enable_aescfb=yes test "$enable_aescbc_length_checks" = "" && enable_aescbc_length_checks=yes test "$enable_camellia" = "" && enable_camellia=yes test "$enable_ripemd" = "" && enable_ripemd=yes test "$enable_sha224" = "" && enable_sha224=yes + test "$enable_sha512" = "" && enable_sha512=yes + test "$enable_sha3" = "" && enable_sha3=yes test "$enable_shake128" = "" && enable_shake128=yes test "$enable_shake256" = "" && enable_shake256=yes test "$enable_sessioncerts" = "" && enable_sessioncerts=yes @@ -927,22 +1038,21 @@ test "$enable_hkdf" = "" && enable_hkdf=yes test "$enable_curve25519" = "" && enable_curve25519=yes test "$enable_curve448" = "" && enable_curve448=yes - test "$enable_fpecc" = "" && enable_fpecc=yes - test "$enable_eccencrypt" = "" && enable_eccencrypt=yes + test "$enable_fpecc" = "" && test "$enable_ecc" != "no" && enable_fpecc=yes + test "$enable_eccencrypt" = "" && test "$enable_ecc" != "no" && enable_eccencrypt=yes test "$enable_psk" = "" && enable_psk=yes test "$enable_cmac" = "" && enable_cmac=yes test "$enable_siphash" = "" && enable_siphash=yes - test "$enable_xts" = "" && enable_xts=yes test "$enable_ocsp" = "" && enable_ocsp=yes - test "$enable_ocspstapling" = "" && enable_ocspstapling=yes - test "$enable_ocspstapling2" = "" && enable_ocspstapling2=yes + test "$enable_ocspstapling" = "" && test "$enable_ocsp" != "no" && enable_ocspstapling=yes + test "$enable_ocspstapling2" = "" && test "$enable_ocsp" != "no" && enable_ocspstapling2=yes test "$enable_crl" = "" && enable_crl=yes test "$enable_supportedcurves" = "" && enable_supportedcurves=yes test "$enable_tlsx" = "" && enable_tlsx=yes test "$enable_pwdbased" = "" && enable_pwdbased=yes test "$enable_aeskeywrap" = "" && enable_aeskeywrap=yes test "$enable_x963kdf" = "" && enable_x963kdf=yes - test "$enable_scrypt" = "" && enable_scrypt=yes + test "$enable_scrypt" = "" && test "$enable_hmac" != "no" && enable_scrypt=yes test "$enable_indef" = "" && enable_indef=yes test "$enable_enckeys" = "" && enable_enckeys=yes test "$enable_hashflags" = "" && enable_hashflags=yes @@ -950,21 +1060,14 @@ test "$enable_base64encode" = "" && enable_base64encode=yes test "$enable_base16" = "" && enable_base16=yes test "$enable_arc4" = "" && enable_arc4=yes - test "$enable_des3" = "" && enable_des3=yes - test "$enable_nullcipher" = "" && enable_nullcipher=yes test "$enable_blake2" = "" && enable_blake2=yes test "$enable_blake2s" = "" && enable_blake2s=yes test "$enable_md2" = "" && enable_md2=yes test "$enable_md4" = "" && enable_md4=yes test "$enable_cryptocb" = "" && enable_cryptocb=yes test "$enable_anon" = "" && enable_anon=yes - test "$enable_ssh" = "" && enable_ssh=yes - - if test "$ENABLED_32BIT" != "yes" - then - test "$enable_sha512" = "" && enable_sha512=yes - test "$enable_sha3" = "" && enable_sha3=yes - fi + test "$enable_ssh" = "" && test "$enable_hmac" != "no" && enable_ssh=yes + test "$enable_srtp_kdf" = "" && enable_srtp_kdf=yes if test "$ENABLED_LINUXKM_DEFAULTS" != "yes" then @@ -973,36 +1076,42 @@ if test "$ENABLED_SP_MATH" = "no" then - test "$enable_dsa" = "" && enable_dsa=yes - test "$enable_ecccustcurves" = "" && enable_ecccustcurves=yes - test "$enable_brainpool" = "" && enable_brainpool=yes + test "$enable_dsa" = "" && test "$enable_sha" != "no" && enable_dsa=yes + if test "$ENABLED_FIPS" = "no" || test "$HAVE_FIPS_VERSION" -le 5; then + test "$enable_ecccustcurves" = "" && enable_ecccustcurves=yes + test "$enable_brainpool" = "" && enable_brainpool=yes + fi test "$enable_srp" = "" && enable_srp=yes fi if test "$ENABLED_FIPS" = "no" then test "$enable_pkcallbacks" = "" && enable_pkcallbacks=yes - test "$enable_xchacha" = "" && enable_xchacha=yes + test "$enable_xchacha" = "" && test "$enable_chacha" != "no" && enable_xchacha=yes test "$enable_pkcs7" = "" && enable_pkcs7=yes - if test "$ENABLED_32BIT" != "yes" - then - test "$enable_ed25519" = "" && enable_ed25519=yes - test "$enable_ed25519_stream" = "" && enable_ed25519_stream=yes - test "$enable_ed448" = "" && enable_ed448=yes - test "$enable_ed448_stream" = "" && enable_ed448_stream=yes - fi + test "$enable_nullcipher" = "" && enable_nullcipher=yes + test "$enable_ed25519" = "" && enable_ed25519=yes + test "$enable_ed25519_stream" = "" && test "$enable_ed25519" != "no" && enable_ed25519_stream=yes + test "$enable_ed448" = "" && enable_ed448=yes + test "$enable_ed448_stream" = "" && test "$enable_ed448" != "no" && enable_ed448_stream=yes if test "$ENABLED_LINUXKM_DEFAULTS" != "yes" then - test "$enable_eccsi" = "" && enable_eccsi=yes - test "$enable_sakke" = "" && enable_sakke=yes + test "$enable_eccsi" = "" && test "$enable_ecc" != "no" && enable_eccsi=yes + test "$enable_sakke" = "" && test "$enable_ecc" != "no" && enable_sakke=yes fi fi - if test "$ENABLED_FIPS" = "no" || test "$ENABLED_FIPS" = "dev"; then + if test "$ENABLED_FIPS" = "no" || test "$HAVE_FIPS_VERSION" -ge 6 || test "$FIPS_VERSION" = "v5-dev"; then + test "$enable_aesxts" = "" && enable_aesxts=yes + test "$enable_aesxts_stream" = "" && test "$enable_aesxts" = "yes" && (test "$enable_armasm" = "" || test "$enable_armasm" = "no") && enable_aesxts_stream=yes test "$enable_aessiv" = "" && enable_aessiv=yes fi + if test "$ENABLED_FIPS" = "no" || test "$HAVE_FIPS_VERSION" -le 5; then + test "$enable_des3" = "" && enable_des3=yes + fi + # Enable AES Decrypt, AES ECB, Alt Names, DER Load AM_CFLAGS="$AM_CFLAGS -DHAVE_AES_DECRYPT -DHAVE_AES_ECB -DWOLFSSL_ALT_NAMES -DWOLFSSL_DER_LOAD" @@ -1027,10 +1136,12 @@ ENABLED_LIBOQS="no" tryliboqsdir="" AC_ARG_WITH([liboqs], - [AS_HELP_STRING([--with-liboqs=PATH],[Path to liboqs install (default /usr/local) EXPERIMENTAL!])], + [AS_HELP_STRING([--with-liboqs=PATH],[Path to liboqs install (default /usr/local) (requires --enable-experimental)])], [ + AS_IF([ test "$ENABLED_EXPERIMENTAL" != "yes" ],[ AC_MSG_ERROR([LIBOQS requires --enable-experimental.]) ]) AC_MSG_CHECKING([for liboqs]) LIBS="$LIBS -loqs" + AM_CFLAGS="$AM_CFLAGS -pthread" AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ OQS_init(); ]])], [ liboqs_linked=yes ],[ liboqs_linked=no ]) @@ -1072,10 +1183,9 @@ # KYBER # Used: -# - SHA3, Shake128 and Shake256, or -# - SHA256, SHA512, AES-CTR +# - SHA3, Shake128 and Shake256 AC_ARG_ENABLE([kyber], - [AS_HELP_STRING([--enable-kyber],[Enable KYBER (default: disabled)])], + [AS_HELP_STRING([--enable-kyber],[Enable KYBER (requires --enable-experimental) (default: disabled)])], [ ENABLED_KYBER=$enableval ], [ ENABLED_KYBER=no ] ) @@ -1091,10 +1201,6 @@ ;; no) ;; - wolfssl) - ENABLED_WC_KYBER=yes - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_KYBER" - ;; small) AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KYBER_SMALL" ;; @@ -1107,6 +1213,9 @@ 1024) ENABLED_KYBER1024=yes ;; + ml-kem) + ENABLED_ML_KEM=yes + ;; *) AC_MSG_ERROR([Invalid choice for KYBER []: $ENABLED_KYBER.]) break;; @@ -1115,7 +1224,14 @@ if test "$ENABLED_KYBER" != "no" then + AS_IF([ test "$ENABLED_EXPERIMENTAL" != "yes" ],[ AC_MSG_ERROR([KYBER requires --enable-experimental.]) ]) AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_KYBER" + # Use liboqs if specified. + if test "$ENABLED_LIBOQS" = "no"; then + ENABLED_WC_KYBER=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_KYBER" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_WC_KYBER" + fi if test "$ENABLED_KYBER512" = ""; then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_KYBER512" @@ -1126,21 +1242,310 @@ if test "$ENABLED_KYBER1024" = ""; then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_KYBER1024" fi + if test "$ENABLED_ML_KEM" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ML_KEM" + fi if test "$ENABLED_WC_KYBER" = "yes" then test "$enable_sha3" = "" && enable_sha3=yes test "$enable_shake128" = "" && enable_shake128=yes test "$enable_shake256" = "" && enable_shake256=yes - else - # Default is to use liboqs. Make sure its enabled. - if test "$ENABLED_LIBOQS" = "no"; then - AC_MSG_ERROR([The default implementation for kyber is liboqs. - Please use --with-liboqs.]) + fi +fi + +# Dilithium +# - SHA3, Shake128, Shake256 and AES-CTR +AC_ARG_ENABLE([dilithium], + [AS_HELP_STRING([--enable-dilithium],[Enable DILITHIUM (requires --enable-experimental) (default: disabled)])], + [ ENABLED_DILITHIUM=$enableval ], + [ ENABLED_DILITHIUM=no ] + ) + +ENABLED_DILITHIUM_OPTS=$ENABLED_DILITHIUM +ENABLED_DILITHIUM_MAKE_KEY=no +ENABLED_DILITHIUM_SIGN=no +ENABLED_DILITHIUM_VERIFY=no +for v in `echo $ENABLED_DILITHIUM_OPTS | tr "," " "` +do + case $v in + yes) + ENABLED_MLDSA44=yes + ENABLED_MLDSA65=yes + ENABLED_MLDSA87=yes + ENABLED_DILITHIUM_MAKE_KEY=yes + ENABLED_DILITHIUM_SIGN=yes + ENABLED_DILITHIUM_VERIFY=yes + ;; + no) + ;; + all) + ENABLED_DILITHIUM_MAKE_KEY=yes + ENABLED_DILITHIUM_SIGN=yes + ENABLED_DILITHIUM_VERIFY=yes + ;; + make) + ENABLED_DILITHIUM_MAKE_KEY=yes + ;; + sign) + ENABLED_DILITHIUM_SIGN=yes + ;; + verify) + ENABLED_DILITHIUM_VERIFY=yes + ;; + verify-only) + ENABLED_DILITHIUM_MAKE_KEY=no + ENABLED_DILITHIUM_SIGN=no + ENABLED_DILITHIUM_VERIFY=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DILITHIUM_VERIFY_ONLY" + ;; + small) + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DILITHIUM_SMALL" + ;; + 44) + ENABLED_MLDSA44=yes + ;; + 65) + ENABLED_MLDSA65=yes + ;; + 87) + ENABLED_MLDSA87=yes + ;; + *) + AC_MSG_ERROR([Invalid choice for DILITHIUM [all,make,sign,verify,verify-only,small,44,65,87]: $ENABLED_DILITHIUM.]) + break;; + esac +done + +if test "$ENABLED_DILITHIUM" != "no" +then + AS_IF([ test "$ENABLED_EXPERIMENTAL" != "yes" ],[ AC_MSG_ERROR([DILITHIUM requires --enable-experimental.]) ]) + AM_CFLAGS="$AM_CFLAGS -DHAVE_DILITHIUM" + + if test "$ENABLED_MLDSA44" = ""; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_ML_DSA_44" + fi + if test "$ENABLED_MLDSA65" = ""; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_ML_DSA_65" + fi + if test "$ENABLED_MLDSA87" = ""; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_ML_DSA_87" + fi + if test "$ENABLED_DILITHIUM_MAKE_KEY" = "no"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DILITHIUM_NO_MAKE_KEY" + fi + if test "$ENABLED_DILITHIUM_SIGN" = "no"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DILITHIUM_NO_SIGN" + fi + if test "$ENABLED_DILITHIUM_VERIFY" = "no"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DILITHIUM_NO_VERIFY" + fi + + if test "$ENABLED_LIBOQS" = "no"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_DILITHIUM" + test "$enable_sha3" = "" && enable_sha3=yes + test "$enable_shake128" = "" && enable_shake128=yes + test "$enable_shake256" = "" && enable_shake256=yes + fi +fi + +# XMSS +AC_ARG_ENABLE([xmss], + [AS_HELP_STRING([--enable-xmss],[Enable stateful XMSS/XMSS^MT signatures (default: disabled)])], + [ ENABLED_XMSS=$enableval ], + [ ENABLED_XMSS=no ] + ) + +for v in `echo $ENABLED_XMSS | tr "," " "` +do + case $v in + yes) + ;; + no) + ;; + verify-only) + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_XMSS_VERIFY_ONLY -DXMSS_VERIFY_ONLY" + ;; + small) + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_XMSS_SMALL" + ;; + *) + AC_MSG_ERROR([Invalid choice for XMSS []: $ENABLED_XMSS.]) + break;; + esac +done + +# libxmss +# Get the path to xmss-reference. +ENABLED_LIBXMSS="no" +trylibxmssdir="" +AC_ARG_WITH([libxmss], + [AS_HELP_STRING([--with-libxmss=PATH],[PATH to xmss-reference root dir. (requires --enable-experimental)!])], + [ + AS_IF([ test "$ENABLED_EXPERIMENTAL" != "yes" ],[ AC_MSG_ERROR([libxmss requires --enable-experimental.]) ]) + AC_MSG_CHECKING([for libxmss]) + + trylibxmssdir=$withval + + if test -e $trylibxmssdir; then + libxmss_linked=yes + else + AC_MSG_ERROR([libxmss isn't found. + If it's already installed, specify its path using --with-libxmss=/dir/]) + fi + if test "$XMSS_VERIFY_ONLY" = "yes"; then + if test -e $trylibxmssdir/xmss_verify_lib.a; then + CPPFLAGS="$AM_CPPFLAGS -DHAVE_LIBXMSS -I$trylibxmssdir" + LIB_STATIC_ADD="$LIB_STATIC_ADD $trylibxmssdir/xmss_verify_lib.a" + enable_shared=no + enable_static=yes + libxmss_linked=yes + else + AC_MSG_ERROR([xmss_verify_lib.a isn't found. + If it's already installed, specify its path using --with-libxmss=/dir/]) + fi + elif test -e $trylibxmssdir/xmss_lib.a; then + CPPFLAGS="$AM_CPPFLAGS -DHAVE_LIBXMSS -I$trylibxmssdir" + LIB_STATIC_ADD="$LIB_STATIC_ADD $trylibxmssdir/xmss_lib.a" + enable_shared=no + enable_static=yes + libxmss_linked=yes + else + AC_MSG_ERROR([libxmss isn't found. + If it's already installed, specify its path using --with-libxmss=/dir/]) fi + + XMSS_ROOT=$trylibxmssdir + + AC_MSG_RESULT([yes]) + AM_CPPFLAGS="$CPPFLAGS" + + AM_CFLAGS="$AM_CFLAGS -DHAVE_LIBXMSS -I$trylibxmssdir" + ENABLED_LIBXMSS="yes" + AC_SUBST([XMSS_ROOT]) + ], + [XMSS_ROOT=""] +) + +if test "$ENABLED_XMSS" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_XMSS" + + # Use hash-sigs XMSS lib if enabled. + if test "$ENABLED_LIBXMSS" = "yes"; then + ENABLED_WC_XMSS=no + else + ENABLED_WC_XMSS=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_XMSS" fi fi +# LMS +AC_ARG_ENABLE([lms], + [AS_HELP_STRING([--enable-lms],[Enable stateful LMS/HSS signatures (default: disabled)])], + [ ENABLED_LMS=$enableval ], + [ ENABLED_LMS=no ] + ) + +for v in `echo $ENABLED_LMS | tr "," " "` +do + case $v in + yes) + ;; + no) + ;; + verify-only) + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_LMS_VERIFY_ONLY" + ;; + small) + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_LMS_SMALL" + ;; + *) + AC_MSG_ERROR([Invalid choice for LMS []: $ENABLED_LMS.]) + break;; + esac +done + +# liblms +# Get the path to the hash-sigs LMS HSS lib. +ENABLED_LIBLMS="no" +tryliblmsdir="" +AC_ARG_WITH([liblms], + [AS_HELP_STRING([--with-liblms=PATH],[PATH to hash-sigs LMS/HSS install (default /usr/local) (requires --enable-experimental)!])], + [ + AS_IF([ test "$ENABLED_EXPERIMENTAL" != "yes" ],[ AC_MSG_ERROR([liblms requires --enable-experimental.]) ]) + AC_MSG_CHECKING([for liblms]) + + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ param_set_t lm_type; param_set_t lm_ots_type; hss_get_public_key_len(4, &lm_type, &lm_ots_type); ]])], [ liblms_linked=yes ],[ liblms_linked=no ]) + + if test "x$liblms_linked" = "xno" ; then + if test "x$withval" != "xno" ; then + tryliblmsdir=$withval + fi + if test "x$withval" = "xyes" ; then + tryliblmsdir="/usr/local" + fi + + # 1. If verify only build, use hss_verify.a + # 2. If normal build, by default use single-threaded hss_lib.a + # 3. If 2 not found, then use the multi-threaded hss_lib_thread.a + if test "$LMS_VERIFY_ONLY" = "yes"; then + if test -e $tryliblmsdir/hss_verify.a; then + CPPFLAGS="$AM_CPPFLAGS -DHAVE_LIBLMS -I$tryliblmsdir" + LIB_STATIC_ADD="$LIB_STATIC_ADD $tryliblmsdir/hss_verify.a" + enable_shared=no + enable_static=yes + liblms_linked=yes + else + AC_MSG_ERROR([hss_verify.a isn't found. + If it's already installed, specify its path using --with-liblms=/dir/]) + fi + elif test -e $tryliblmsdir/hss_lib.a; then + CPPFLAGS="$AM_CPPFLAGS -DHAVE_LIBLMS -I$tryliblmsdir" + LIB_STATIC_ADD="$LIB_STATIC_ADD $tryliblmsdir/hss_lib.a" + enable_shared=no + enable_static=yes + liblms_linked=yes + elif test -e $tryliblmsdir/hss_lib_thread.a; then + CPPFLAGS="$AM_CPPFLAGS -DHAVE_LIBLMS -I$tryliblmsdir" + LIB_STATIC_ADD="$LIB_STATIC_ADD $tryliblmsdir/hss_lib_thread.a" + enable_shared=no + enable_static=yes + liblms_linked=yes + else + AC_MSG_ERROR([liblms isn't found. + If it's already installed, specify its path using --with-liblms=/dir/]) + fi + + if test "x$liblms_linked" = "xno" ; then + AC_MSG_ERROR([liblms isn't found. + If it's already installed, specify its path using --with-liblms=/dir/]) + fi + + AC_MSG_RESULT([yes]) + AM_CPPFLAGS="$CPPFLAGS" + AM_LDFLAGS="$LDFLAGS" + else + AC_MSG_RESULT([yes]) + fi + + AM_CFLAGS="$AM_CFLAGS -DHAVE_LIBLMS" + ENABLED_LIBLMS="yes" + ] +) + +if test "$ENABLED_LMS" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HAVE_LMS" + + # Use hash-sigs LMS lib if enabled. + if test "$ENABLED_LIBLMS" = "yes"; then + ENABLED_WC_LMS=no + else + ENABLED_WC_LMS=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_WC_LMS" + fi +fi # SINGLE THREADED AC_ARG_ENABLE([singlethreaded], @@ -1225,6 +1630,18 @@ AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DTLS_MTU" fi +# KeyLog file export +AC_ARG_ENABLE([keylog-export], + [AS_HELP_STRING([--enable-keylog-export],[Enable insecure export of TLS secrets to an NSS keylog file (default: disabled)])], + [ ENABLED_KEYLOG_EXPORT=$enableval ], + [ ENABLED_KEYLOG_EXPORT=no ] + ) +if test "$ENABLED_KEYLOG_EXPORT" = "yes" +then + AC_MSG_WARN([Keylog export enabled -- Sensitive key data will be stored insecurely.]) + AM_CFLAGS="$AM_CFLAGS -DSHOW_SECRETS -DHAVE_SECRET_CALLBACK -DWOLFSSL_SSLKEYLOGFILE -DWOLFSSL_KEYLOG_EXPORT_WARNED" +fi + # TLS v1.3 Draft 18 (Note: only final TLS v1.3 supported, here for backwards build compatibility) AC_ARG_ENABLE([tls13-draft18], [AS_HELP_STRING([--enable-tls13-draft18],[Enable wolfSSL TLS v1.3 Draft 18 (default: disabled)])], @@ -1258,6 +1675,10 @@ then AC_MSG_ERROR([TLS 1.3 is disabled - necessary for QUIC]) fi + if test "$enable_aesgcm" = "no" + then + AC_MSG_ERROR([AES-GCM is disabled - necessary for QUIC]) + fi AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_QUIC" # QUIC proto handlers need app_data at WOLFSSL* AM_CFLAGS="$AM_CFLAGS -DHAVE_EX_DATA" @@ -1378,6 +1799,8 @@ # FFmpeg (--enable-ffmpeg) WOLFSSL_FFMPEG # strongSwan (--enable-strongswan) # OpenLDAP (--enable-openldap) +# hitch (--enable-hitch) +# memcached (--enable-memcached) # Bind DNS compatibility Build AC_ARG_ENABLE([bind], @@ -1581,6 +2004,20 @@ [ ENABLED_STRONGSWAN=no ] ) +# hitch support +AC_ARG_ENABLE([hitch], + [AS_HELP_STRING([--enable-hitch],[Enable hitch support (default: disabled)])], + [ ENABLED_HITCH=$enableval ], + [ ENABLED_HITCH=no ] + ) + +# memcached support +AC_ARG_ENABLE([memcached], + [AS_HELP_STRING([--enable-memcached],[Enable memcached support (default: disabled)])], + [ ENABLED_MEMCACHED=$enableval ], + [ ENABLED_MEMCACHED=no ] + ) + # OpenSSL Coexist AC_ARG_ENABLE([opensslcoexist], [AS_HELP_STRING([--enable-opensslcoexist],[Enable coexistence of wolfssl/openssl (default: disabled)])], @@ -1590,9 +2027,9 @@ if test "x$ENABLED_OPENSSLCOEXIST" = "xyes" || test "$ENABLED_WOLFENGINE" = "yes" then - # make sure old names are disabled - enable_oldnames=no - + # make sure old names are disabled (except RNG) + AM_CFLAGS="$AM_CFLAGS -DNO_OLD_WC_NAMES -DNO_OLD_SSL_NAMES" + AM_CFLAGS="$AM_CFLAGS -DNO_OLD_SHA_NAMES -DNO_OLD_MD5_NAME" AM_CFLAGS="$AM_CFLAGS -DOPENSSL_COEXIST" fi @@ -1692,7 +2129,7 @@ test "$ENABLED_OPENRESTY" = "yes" || test "$ENABLED_RSYSLOG" = "yes" || \ test "$ENABLED_KRB" = "yes" || test "$ENABLED_CHRONY" = "yes" || \ test "$ENABLED_FFMPEG" = "yes" || test "$ENABLED_STRONGSWAN" = "yes" || \ - test "$ENABLED_OPENLDAP" = "yes" + test "$ENABLED_OPENLDAP" = "yes" || test "$ENABLED_HITCH" = "yes" then ENABLED_OPENSSLALL="yes" fi @@ -1719,7 +2156,8 @@ if test "$ENABLED_ERRORQUEUEPERTHREAD" = "check" then - AS_IF([test "$thread_ls_on" = "no"], + AS_IF([test "$thread_ls_on" = "no" || + test "$ENABLED_SINGLETHREADED" = "yes"], [ENABLED_ERRORQUEUEPERTHREAD=no], [ENABLED_ERRORQUEUEPERTHREAD=yes]) fi @@ -2146,7 +2584,7 @@ if test "$ENABLED_AESCBC" = "no" then AM_CFLAGS="$AM_CFLAGS -DNO_AES_CBC" - AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_AES_CBC" + AM_CCASFLAGS="$AM_CCASFLAGS -DNO_AES_CBC" fi # AES-CBC length checks (checks that input lengths are multiples of block size) @@ -2201,6 +2639,18 @@ AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_AESCCM" fi +# AES-EAX +AC_ARG_ENABLE([aeseax], + [AS_HELP_STRING([--enable-aeseax],[Enable wolfSSL AES-EAX support (default: disabled)])], + [ ENABLED_AESEAX=$enableval ], + [ ENABLED_AESEAX=no ] + ) + +if test "$ENABLED_AESEAX" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_EAX" +fi + # AES-SIV (RFC 5297) AC_ARG_ENABLE([aessiv], [AS_HELP_STRING([--enable-aessiv],[Enable AES-SIV (RFC 5297) (default: disabled)])], @@ -2213,13 +2663,13 @@ ENABLED_AESSIV=yes fi -# AES-CTRf +# AES-CTR AC_ARG_ENABLE([aesctr], [AS_HELP_STRING([--enable-aesctr],[Enable wolfSSL AES-CTR support (default: disabled)])], [ ENABLED_AESCTR=$enableval ], [ ENABLED_AESCTR=no ] ) -if test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_LIBSSH2" = "yes" || test "$ENABLED_AESSIV" = "yes" || test "$ENABLED_WOLFENGINE" = "yes" +if test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_LIBSSH2" = "yes" || test "$ENABLED_AESSIV" = "yes" || test "$ENABLED_WOLFENGINE" = "yes" || test "$ENABLED_AESEAX" = "yes" then ENABLED_AESCTR=yes fi @@ -2254,9 +2704,108 @@ AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_CFB" fi +AC_ARG_ENABLE([aes-bitsliced], + [AS_HELP_STRING([--enable-aes-bitsliced],[Enable bitsliced implementation of AES (default: disabled)])], + [ ENABLED_AESBS=$enableval ], + [ ENABLED_AESBS=no ] + ) + +if test "$ENABLED_AESBS" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWC_AES_BITSLICED -DHAVE_AES_ECB -DWOLFSSL_AES_DIRECT" +fi + +# SM4 +ENABLED_SM4="no" +AC_ARG_ENABLE([sm4-ecb], + [AS_HELP_STRING([--enable-sm4-ecb],[Enable wolfSSL SM4-ECB support (default: disabled)])], + [ ENABLED_SM4_ECB=$enableval ], + [ ENABLED_SM4_ECB=no ] + ) + +if test "$ENABLED_SM4_ECB" = "small" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_SMALL" +fi +if test "$ENABLED_SM4_ECB" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_ECB" + ENABLED_SM4="yes" +fi + +AC_ARG_ENABLE([sm4-cbc], + [AS_HELP_STRING([--enable-sm4-cbc],[Enable wolfSSL SM4-CBC support (default: disabled)])], + [ ENABLED_SM4_CBC=$enableval ], + [ ENABLED_SM4_CBC=no ] + ) + +if test "$ENABLED_SM4_CBC" = "small" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_SMALL" +fi +if test "$ENABLED_SM4_CBC" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_CBC" + ENABLED_SM4="yes" +fi + +AC_ARG_ENABLE([sm4-ctr], + [AS_HELP_STRING([--enable-sm4-ctr],[Enable wolfSSL SM4-CTR support (default: disabled)])], + [ ENABLED_SM4_CTR=$enableval ], + [ ENABLED_SM4_CTR=no ] + ) + +if test "$ENABLED_SM4_CTR" = "small" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_SMALL" +fi +if test "$ENABLED_SM4_CTR" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_CTR" + ENABLED_SM4="yes" +fi + +AC_ARG_ENABLE([sm4-gcm], + [AS_HELP_STRING([--enable-sm4-gcm],[Enable wolfSSL SM4-GCM support (default: disabled)])], + [ ENABLED_SM4_GCM=$enableval ], + [ ENABLED_SM4_GCM=no ] + ) + +if test "$ENABLED_SM4_GCM" = "small" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_SMALL" +fi +if test "$ENABLED_SM4_GCM" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_GCM" + ENABLED_SM4="yes" +fi + +AC_ARG_ENABLE([sm4-ccm], + [AS_HELP_STRING([--enable-sm4-ccm],[Enable wolfSSL SM4-CCM support (default: disabled)])], + [ ENABLED_SM4_CCM=$enableval ], + [ ENABLED_SM4_CCM=no ] + ) + +if test "$ENABLED_SM4_CCM" = "small" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_SMALL" +fi +if test "$ENABLED_SM4_CCM" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4_CCM" + ENABLED_SM4="yes" +fi + +if test "$ENABLED_SM4" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM4" +fi + ENABLED_ARMASM_INLINE="no" ENABLED_ARMASM_SHA3="no" +ENABLED_ARMASM_CRYPTO_SM4="no" # ARM Assembly # Both SHA3 and SHA512 instructions available with ARMV8.2-a AC_ARG_ENABLE([armasm], @@ -2284,6 +2833,33 @@ break;; esac ENABLED_ARMASM_SHA3=yes + ENABLED_ARMASM_PLUS=yes + ;; + sm4) + case $host_cpu in + *aarch64*) + ;; + *) + AC_MSG_ERROR([SM4 instructions only available on Aarch64 CPU.]) + break;; + esac + ENABLED_ARMASM_SM4=yes + # gcc requires -march=...+sm4 to enable SM4 instructions + ENABLED_ARMASM_CRYPTO_SM4=yes + ENABLED_ARMASM_PLUS=yes + ;; + sm3) + case $host_cpu in + *aarch64*) + ;; + *) + AC_MSG_ERROR([SM3 instructions only available on Aarch64 CPU.]) + break;; + esac + ENABLED_ARMASM_SM3=yes + # gcc requires -march=...+sm4 to enable SM3 instructions + ENABLED_ARMASM_CRYPTO_SM4=yes + ENABLED_ARMASM_PLUS=yes ;; *) AC_MSG_ERROR([Invalid choice of ARM asm inclusions (yes, sha512-crypto, sha3-crypto): $ENABLED_ARMASM.]) @@ -2308,8 +2884,14 @@ ;; *) # +crypto needed for hardware acceleration - if test "$ENABLED_ARMASM_SHA3" = "yes"; then - AM_CPPFLAGS="$AM_CPPFLAGS -march=armv8.2-a+crypto+sha3" + if test "$ENABLED_ARMASM_PLUS" = "yes"; then + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv8.2-a+crypto" + if test "$ENABLED_ARMASM_SHA3" = "yes"; then + AM_CPPFLAGS="$AM_CPPFLAGS+sha3" + fi + if test "$ENABLED_ARMASM_CRYPTO_SM4" = "yes"; then + AM_CPPFLAGS="$AM_CPPFLAGS+sm4" + fi else AM_CPPFLAGS="$AM_CPPFLAGS -mcpu=generic+crypto" fi @@ -2318,6 +2900,7 @@ # Include options.h AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN" ENABLED_ARMASM_CRYPTO=yes + ENABLED_ARMASM_NEON=yes # Check for and set -mstrict-align compiler flag # Used to set assumption that Aarch64 systems will not handle @@ -2336,19 +2919,63 @@ esac AC_MSG_NOTICE([64bit ARMv8 found, setting mcpu to generic+crypto]) ;; - armv7a*) - AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-a -mfpu=neon -DWOLFSSL_ARMASM_NO_HW_CRYPTO -DWOLFSSL_ARM_ARCH=7" + armv7a* | armv7l*) + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-a -mfpu=neon -DWOLFSSL_ARM_ARCH=7 -marm" # Include options.h AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN" ENABLED_ARMASM_CRYPTO=no ENABLED_AESGCM_STREAM=no # not yet implemented + ENABLED_ARMASM_NEON=yes AC_MSG_NOTICE([32bit ARMv7-a found, setting mfpu to neon]) + if test "$ENABLED_FIPS" != "no" || + test "$HAVE_FIPS_VERSION_MAJOR" -ge 5; + then + # Use inline ASM with FIPS because of known "issue" with the + # assembly code + ENABLED_ARMASM_INLINE=yes + AC_MSG_NOTICE([32bit ARMv7-a found, setting inline for FIPS]) + fi + ;; + armv7m*) + # QEMU doesn't work with armv7-m + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-r -D__thumb__ -fomit-frame-pointer -DWOLFSSL_ARMASM_NO_HW_CRYPTO -DWOLFSSL_ARM_ARCH=7" + # Include options.h + AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN" + ENABLED_ARMASM_CRYPTO=no + ENABLED_AESGCM_STREAM=no # not yet implemented + ENABLED_ARMASM_NEON=no + AC_MSG_NOTICE([32bit ARMv7-m found]) + if test "$ENABLED_FIPS" != "no" || + test "$HAVE_FIPS_VERSION_MAJOR" -ge 5; + then + # Use inline ASM with FIPS because of known "issue" with the + # assembly code + ENABLED_ARMASM_INLINE=yes + AC_MSG_NOTICE([32bit ARMv7-m found, setting inline for FIPS]) + fi + ;; + armv6*) + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv6 -fomit-frame-pointer -DWOLFSSL_ARMASM_NO_HW_CRYPTO -DWOLFSSL_ARM_ARCH=6" + AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN" + ENABLED_ARMASM_CRYPTO=no + ENABLED_AESGCM_STREAM=no # not yet implemented + ENABLED_ARMASM_NEON=no + AC_MSG_NOTICE([32bit ARMv6 found]) + ;; + armv4*) + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv4 -fomit-frame-pointer -DWOLFSSL_ARMASM_NO_HW_CRYPTO -DWOLFSSL_ARM_ARCH=4" + AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN" + ENABLED_ARMASM_CRYPTO=no + ENABLED_AESGCM_STREAM=no # not yet implemented + ENABLED_ARMASM_NEON=no + AC_MSG_NOTICE([32bit ARMv4 found]) ;; *) - AM_CPPFLAGS="$AM_CPPFLAGS -mfpu=crypto-neon-fp-armv8" + AM_CPPFLAGS="$AM_CPPFLAGS -mfpu=crypto-neon-fp-armv8 -marm" # Include options.h AM_CCASFLAGS="$AM_CCASFLAGS -DEXTERNAL_OPTS_OPENVPN" ENABLED_ARMASM_CRYPTO=yes + ENABLED_ARMASM_NEON=yes AC_MSG_NOTICE([32bit ARMv8 found, setting mfpu to crypto-neon-fp-armv8]) ;; esac @@ -2359,6 +2986,93 @@ AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_CRYPTO_SHA512 -DWOLFSSL_ARMASM_CRYPTO_SHA3" AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_ARMASM_CRYPTO_SHA512 -DWOLFSSL_ARMASM_CRYPTO_SHA3" fi +if test "$ENABLED_ARMASM_SM3" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_CRYPTO_SM3" +fi +if test "$ENABLED_ARMASM_SM4" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_CRYPTO_SM4" +fi +if test "$ENABLED_ARMASM_CRYPTO" = "no"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_NO_HW_CRYPTO" +fi +if test "$ENABLED_ARMASM_NEON" = "no"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_NO_NEON" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_ARMASM_NO_NEON" +fi + +if test "$ENABLED_ARMASM_INLINE" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ARMASM_INLINE" +fi + +# RISC-V Assembly +AC_ARG_ENABLE([riscv-asm], + [AS_HELP_STRING([--enable-riscv-asm],[Enable wolfSSL RISC-V ASM support (default: disabled).])], + [ ENABLED_RISCV_ASM=$enableval ], + [ ENABLED_RISCV_ASM=no ] + ) +if test "$ENABLED_RISCV_ASM" != "no" && test "$ENABLED_ASM" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_ASM" + ENABLED_AESGCM_STREAM=no # not yet implemented + AC_MSG_NOTICE([64bit RISC-V assembly for AES]) +fi + +ENABLED_RISCV_ASM_OPTS=$ENABLED_RISCV_ASM +for v in `echo $ENABLED_RISCV_ASM_OPTS | tr "," " "` +do + case $v in + yes) + ;; + no) + ;; + zbkb) + # PACK, REV8 + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_BIT_MANIPULATION" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_BASE_BIT_MANIPULATION" + ;; + zbb) + # REV8 + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_BASE_BIT_MANIPULATION" + ;; + zbc|zbkc) + # CLMUL, CLMULH + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_CARRYLESS" + ;; + zkn|zkned) + # AES encrypt/decrpyt + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_SCALAR_CRYPTO_ASM" + ;; + zvkg) + # VGMUL, VHHSH + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_VECTOR_GCM" + ;; + zvbc) + # VCLMUL, VCLMULH + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_VECTOR_CARRYLESS" + ;; + zvbb|zvkb) + # VBREV8 + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION" + ;; + zvkned) + # Vector AES + ENABLED_RISCV_ASM=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_RISCV_VECTOR_CRYPTO_ASM" + ;; + *) + AC_MSG_ERROR([Invalid RISC-V option [yes,zbkb,zbb,zbc,zbkc,zkn,zkned,zvkg,zvbc,zvbb,zvkb,zvkned]: $ENABLED_RISCV_ASM.]) + break + ;; + esac +done + # Xilinx hardened crypto AC_ARG_ENABLE([xilinx], @@ -2385,6 +3099,30 @@ ] ) +AC_ARG_ENABLE([aria], + [AS_HELP_STRING([--enable-aria],[Enable wolfSSL support for ARIA (default: disabled)])], + [ ENABLED_ARIA=$enableval ], + [ ENABLED_ARIA=no ] + ) +if test "$ENABLED_ARIA" = "yes" +then + ARIA_DIR=MagicCrypto + # Enable dependency + CFLAGS="$CFLAGS -I$ARIA_DIR/include" + AM_CFLAGS="$AM_CFLAGS -DHAVE_ARIA" + AM_LDFLAGS="$AM_LDFLAGS -L$ARIA_DIR/lib -lMagicCrypto" + build_pwd="$(pwd)" + headers="mcapi_error.h mcapi_type.h mcapi.h" + for header in $headers + do + AC_CHECK_HEADER([$header], [], [ + AC_MSG_ERROR([Error including $header. Please put the MagicCrypto library in $build_pwd.]) + ], [ + extern int dummy_int_to_make_compiler_happy; + ]) + done +fi + AC_ARG_ENABLE([caam], [AS_HELP_STRING([--enable-caam],[Enable wolfSSL support for CAAM (default: disabled)])], [ ENABLED_CAAM=$enableval ], @@ -2451,6 +3189,10 @@ if test "$ENABLED_AESNI" = "yes" || test "$ENABLED_INTELASM" = "yes" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AESNI" + if test "$ENABLED_LINUXKM_DEFAULTS" = "yes" + then + AM_CFLAGS="$AM_CFLAGS -DWC_C_DYNAMIC_FALLBACK" + fi if test "$CC" != "icc" then case $host_os in @@ -2466,6 +3208,7 @@ esac fi AS_IF([test "x$ENABLED_AESGCM" != "xno"],[AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_AESGCM"]) + AS_IF([test "x$ENABLED_SM3" != "xno"],[AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SM3"]) fi if test "$ENABLED_INTELASM" = "yes" @@ -2873,7 +3616,8 @@ # set sha3 default SHA3_DEFAULT=no -if (test "$host_cpu" = "x86_64" || test "$host_cpu" = "aarch64" || test "$host_cpu" = "amd64") && test "$ENABLED_32BIT" = "no" +if (test "$host_cpu" = "x86_64" || test "$host_cpu" = "aarch64" || + test "$host_cpu" = "amd64") then if test "x$ENABLED_FIPS" = "xno" || test "$HAVE_FIPS_VERSION" -ge 2 then @@ -2915,7 +3659,7 @@ ) # options that don't require sha512 -if test "$ENABLED_LEANPSK" = "yes" || test "$ENABLED_LEANTLS" = "yes" || test "$ENABLED_32BIT" = "yes" || test "$ENABLED_16BIT" = "yes" +if test "$ENABLED_LEANPSK" = "yes" || test "$ENABLED_LEANTLS" = "yes" || test "$ENABLED_16BIT" = "yes" then ENABLED_SHA512="no" fi @@ -2941,7 +3685,7 @@ ) # options that don't require sha384 -if test "$ENABLED_LEANPSK" = "yes" || test "$ENABLED_LEANTLS" = "yes" || test "$ENABLED_32BIT" = "yes" || test "$ENABLED_16BIT" = "yes" +if test "$ENABLED_LEANPSK" = "yes" || test "$ENABLED_LEANTLS" = "yes" || test "$ENABLED_16BIT" = "yes" then ENABLED_SHA384="no" fi @@ -2957,6 +3701,22 @@ fi +# SM3 +AC_ARG_ENABLE([sm3], + [AS_HELP_STRING([--enable-sm3],[Enable wolfSSL SM3 support (default: disabled)])], + [ ENABLED_SM3=$enableval ], + [ ENABLED_SM3=no ] + ) + +if test "$ENABLED_SM3" = "small" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM3_SMALL" +fi +if test "$ENABLED_SM3" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM3" +fi + # SESSION CERTS AC_ARG_ENABLE([sessioncerts], [AS_HELP_STRING([--enable-sessioncerts],[Enable session cert storing (default: disabled)])], @@ -2966,7 +3726,7 @@ if test "x$ENABLED_NGINX" = "xyes" || test "x$ENABLED_OPENVPN" = "xyes" || \ test "x$ENABLED_LIGHTY" = "xyes" || test "x$ENABLED_NETSNMP" = "xyes" || \ - test "x$ENABLED_STRONGSWAN" = "xyes" + test "x$ENABLED_STRONGSWAN" = "xyes" || test "x$ENABLED_HITCH" = "xyes" then ENABLED_SESSIONCERTS=yes fi @@ -2983,7 +3743,7 @@ # KEY GENERATION AC_ARG_ENABLE([keygen], - [AS_HELP_STRING([--enable-keygen],[Enable key generation (default: disabled)])], + [AS_HELP_STRING([--enable-keygen],[Enable key generation (only applies to RSA key generation) (default: disabled)])], [ ENABLED_KEYGEN=$enableval ], [ ENABLED_KEYGEN=no ] ) @@ -3006,7 +3766,7 @@ if test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_OPENSSH" = "yes" || \ test "$ENABLED_BIND" = "yes" || test "$ENABLED_NTP" = "yes" || \ test "$ENABLED_CHRONY" = "yes" || test "$ENABLED_STRONGSWAN" = "yes" || \ - test "$ENABLED_OPENLDAP" = "yes" + test "$ENABLED_OPENLDAP" = "yes" || test "$ENABLED_HITCH" = "yes" then ENABLED_CERTGEN=yes fi @@ -3100,6 +3860,13 @@ AM_CFLAGS="$AM_CFLAGS -DHAVE_X963_KDF" fi +# SRTP-KDF +AC_ARG_ENABLE([srtp-kdf], + [AS_HELP_STRING([--enable-srtp-kdf],[Enable SRTP-KDF support (default: disabled)])], + [ ENABLED_SRTP_KDF=$enableval ], + [ ENABLED_SRTP_KDF=no ] + ) + # DSA AC_ARG_ENABLE([dsa], [AS_HELP_STRING([--enable-dsa],[Enable DSA (default: disabled)])], @@ -3107,7 +3874,7 @@ [ ENABLED_DSA=no ] ) -if test "$enable_dsa" = "" +if test "$enable_dsa" = "" && test "$enable_sha" != "no" then if (test "$ENABLED_OPENSSH" = "yes" && test "x$ENABLED_FIPS" = "xno") || test "$ENABLED_OPENVPN" = "yes" || test "$ENABLED_NGINX" = "yes" || test "$ENABLED_WPAS" = "yes" || test "$ENABLED_QT" = "yes" || test "$ENABLED_BIND" = "yes" || test "$ENABLED_LIBSSH2" = "yes" || test "$ENABLED_NTP" = "yes" then @@ -3170,6 +3937,24 @@ fi +# SM2 +AC_ARG_ENABLE([sm2], + [AS_HELP_STRING([--enable-sm2],[Enable wolfSSL SM2 support (default: disabled)])], + [ ENABLED_SM2=$enableval ], + [ ENABLED_SM2=no ] + ) + +if test "$ENABLED_SM2" = "yes" +then + if test "$ENABLED_ECC" = "no" + then + AC_MSG_ERROR([Cannot enable SM2 without enabling ecc.]) + fi + + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SM2 -DWOLFSSL_BASE16" +fi + + # ECC Custom Curves AC_ARG_ENABLE([ecccustcurves], [AS_HELP_STRING([--enable-ecccustcurves],[Enable ECC custom curves (default: disabled)])], @@ -3182,35 +3967,14 @@ ENABLED_ECCCUSTCURVES="all" fi -if test "$ENABLED_ECCCUSTCURVES" != "no" -then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CUSTOM_CURVES" - - # For distro, all or ecccustcurves=all builds, enable all curve types - if test "$ENABLED_DISTRO" = "yes" || test "$ENABLED_ALL" = "yes" || test "$ENABLED_ECCCUSTCURVES" = "all" - then - # Enable ECC SECPR2, SECPR3, BRAINPOOL and KOBLITZ curves - AM_CFLAGS="$AM_CFLAGS -DHAVE_ECC_SECPR2 -DHAVE_ECC_SECPR3 -DHAVE_ECC_BRAINPOOL -DHAVE_ECC_KOBLITZ" - - # Enable ECC Cofactor support - AM_CFLAGS="$AM_CFLAGS -DHAVE_ECC_CDH" - - # If fastmath enabled and on x86 use speedups - if test "x$ENABLED_FASTMATH" = "xyes" && test "$host_cpu" = "x86_64" -o "$host_cpu" = "amd64" - then - AM_CFLAGS="$AM_CFLAGS -DTFM_ECC192 -DTFM_ECC224 -DTFM_ECC256 -DTFM_ECC384 -DTFM_ECC521" - fi - fi -fi - # ECC Minimum Key Size -ENABLED_ECCMINSZ=224 AC_ARG_WITH([eccminsz], [AS_HELP_STRING([--with-eccminsz=BITS],[Sets the ECC minimum key size (default: 224 bits)])], [ ENABLED_ECCMINSZ=$withval AM_CFLAGS="$AM_CFLAGS -DECC_MIN_KEY_SZ=$withval" - ] + ], + [ ENABLED_ECCMINSZ=224 ] ) # Compressed Key @@ -3220,7 +3984,7 @@ [ ENABLED_COMPKEY=no ] ) -if test "$ENABLED_WPAS" = "yes" +if test "$ENABLED_WPAS" = "yes" || test "$ENABLED_OPENSSLALL" = "yes" then ENABLED_COMPKEY=yes fi @@ -3286,7 +4050,19 @@ ENABLED_CURVE25519=yes fi + if test "$ENABLED_CURVE25519" = "noasm" + then + AM_CFLAGS="$AM_CFLAGS -DNO_CURVED25519_X64" + fi + + if test "$ENABLED_CURVE25519" = "yes" && test "$ENABLED_LINUXKM_DEFAULTS" = "yes" + then + ENABLED_CURVE25519=noasm + AM_CFLAGS="$AM_CFLAGS -DNO_CURVED25519_X64" + fi + AM_CFLAGS="$AM_CFLAGS -DHAVE_CURVE25519" + AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_CURVE25519" ENABLED_FEMATH=yes fi @@ -3321,25 +4097,6 @@ [ ENABLED_CURVE448=no ] ) -if test "$ENABLED_CURVE448" != "no" -then - if test "$ENABLED_CURVE448" = "small" || test "$ENABLED_LOWRESOURCE" = "yes" - then - AM_CFLAGS="$AM_CFLAGS -DCURVE448_SMALL" - ENABLED_CURVE448_SMALL=yes - ENABLED_CURVE448=yes - fi - - if test "$ENABLED_CURVE448" = "no128bit" || test "$ENABLED_32BIT" = "yes" - then - AM_CFLAGS="$AM_CFLAGS -DNO_CURVED448_128BIT" - ENABLED_CURVE448=yes - fi - - AM_CFLAGS="$AM_CFLAGS -DHAVE_CURVE448" - ENABLED_FE448=yes -fi - # ED448 AC_ARG_ENABLE([ed448], [AS_HELP_STRING([--enable-ed448],[Enable ED448 (default: disabled)])], @@ -3352,50 +4109,6 @@ [ ENABLED_ED448_STREAM=no ] ) -if test "$ENABLED_ED448" != "no" && test "$ENABLED_32BIT" = "no" -then - if test "$ENABLED_ED448" = "small" || test "$ENABLED_LOWRESOURCE" = "yes" - then - AM_CFLAGS="$AM_CFLAGS -DED448_SMALL" - ENABLED_ED448_SMALL=yes - ENABLED_CURVE448_SMALL=yes - ENABLED_ED448=yes - fi - - if test "$ENABLED_SHA512" = "no" - then - AC_MSG_ERROR([cannot enable ed448 without enabling sha512.]) - fi - if test "$HAVE_FIPS_VERSION" = 2 - then - AC_MSG_ERROR([cannot enable ed448 w/ dependency shake256 in FIPSv2 mode]) - fi - ENABLED_FE448=yes - ENABLED_GE448=yes - AM_CFLAGS="$AM_CFLAGS -DHAVE_ED448" - - # EdDSA448 requires SHAKE256 which requires SHA-3 - if test "$ENABLED_SHA3" = "no" - then - ENABLED_SHA3=yes - fi - ENABLED_SHAKE256=yes - - ENABLED_CERTS=yes -fi - -if test "$ENABLED_ED448_STREAM" != "no" -then - if test "$ENABLED_ED448" = "no" - then - AC_MSG_ERROR([ED448 verify streaming enabled but ED448 is disabled]) - else - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ED448_STREAMING_VERIFY" - AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_ED448_STREAMING_VERIFY" - fi -fi - - # FP ECC, Fixed Point cache ECC AC_ARG_ENABLE([fpecc], [AS_HELP_STRING([--enable-fpecc],[Enable Fixed Point cache ECC (default: disabled)])], @@ -3454,6 +4167,10 @@ if test "x$ENABLED_ECCSI" = "xyes" then + if test "$ENABLED_ECC" = "no" + then + AC_MSG_ERROR([ECCSI requires ECC.]) + fi AM_CFLAGS="$AM_CFLAGS -DWOLFCRYPT_HAVE_ECCSI -DWOLFSSL_PUBLIC_MP" fi @@ -3464,6 +4181,11 @@ [ ENABLED_SAKKE=no ] ) +if test "$ENABLED_SAKKE" != "no" && test "$ENABLED_ECC" = "no" +then + AC_MSG_ERROR([SAKKE requires ECC.]) +fi + if test "x$ENABLED_SAKKE" = "xsmall" then ENABLED_SAKKE="yes" @@ -3525,47 +4247,28 @@ [ ENABLED_ERROR_QUEUE=yes ] ) -# OLD TLS -AC_ARG_ENABLE([oldtls], - [AS_HELP_STRING([--enable-oldtls],[Enable old TLS versions < 1.2 (default: enabled)])], - [ ENABLED_OLD_TLS=$enableval ], - [ ENABLED_OLD_TLS=yes ] + +# SSLv3 +AC_ARG_ENABLE([sslv3], + [AS_HELP_STRING([--enable-sslv3],[Enable SSL version 3.0 (default: disabled)])], + [ ENABLED_SSLV3=$enableval ], + [ ENABLED_SSLV3=no] ) -if test "$ENABLED_CRYPTONLY" = "yes" || test "x$ENABLED_HARDEN_TLS" != "xno" -then - ENABLED_OLD_TLS=no -fi -if test "$ENABLED_OLD_TLS" = "no" +if test "x$ENABLED_HAPROXY" = "xyes" && test "x$ENABLED_ALL" = "xno" then - AM_CFLAGS="$AM_CFLAGS -DNO_OLD_TLS" -else - # turn off old if leanpsk or leantls on - if test "$ENABLED_LEANPSK" = "yes" || test "$ENABLED_LEANTLS" = "yes" - then - AM_CFLAGS="$AM_CFLAGS -DNO_OLD_TLS" - ENABLED_OLD_TLS=no - fi + ENABLED_SSLV3="yes" fi - - -# TLSv1.2 -AC_ARG_ENABLE([tlsv12], - [AS_HELP_STRING([--enable-tlsv12],[Enable TLS versions 1.2 (default: enabled)])], - [ ENABLED_TLSV12=$enableval ], - [ ENABLED_TLSV12=yes ] - ) - if test "$ENABLED_CRYPTONLY" = "yes" then - ENABLED_TLSV12=no + ENABLED_SSLV3=no fi -if test "$ENABLED_TLSV12" = "no" + +if test "$ENABLED_SSLV3" = "yes" then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_TLS12 -DNO_OLD_TLS" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALLOW_SSLV3" fi - # TLSv1.0 AC_ARG_ENABLE([tlsv10], [AS_HELP_STRING([--enable-tlsv10],[Enable old TLS versions 1.0 (default: disabled)])], @@ -3583,28 +4286,51 @@ fi -# SSLv3 -AC_ARG_ENABLE([sslv3], - [AS_HELP_STRING([--enable-sslv3],[Enable SSL version 3.0 (default: disabled)])], - [ ENABLED_SSLV3=$enableval ], - [ ENABLED_SSLV3=no] +# OLD TLS +AC_ARG_ENABLE([oldtls], + [AS_HELP_STRING([--enable-oldtls],[Enable old TLS versions < 1.2 (default: disabled)])], + [ ENABLED_OLD_TLS=$enableval ], + [ ENABLED_OLD_TLS=no ] ) -if test "x$ENABLED_HAPROXY" = "xyes" && test "x$ENABLED_ALL" = "xno" + +if test "$ENABLED_CRYPTONLY" = "yes" || test "x$ENABLED_HARDEN_TLS" != "xno" || \ + test "$ENABLED_LEANPSK" = "yes" || test "$ENABLED_LEANTLS" = "yes" then - ENABLED_SSLV3="yes" + ENABLED_OLD_TLS=no fi -if test "$ENABLED_CRYPTONLY" = "yes" + +# if SSL v3.0 or TLS v1.0 enabled, then allow "old tls". QT also requires it apparently +if test "$ENABLED_TLSV10" = "yes" || test "$ENABLED_SSLV3" = "yes" || \ + (test "$ENABLED_QT" = "yes" && test "x$ENABLED_ALL" = "xno") then - ENABLED_SSLV3=no + ENABLED_OLD_TLS=yes fi -if test "$ENABLED_SSLV3" = "yes" +if test "$ENABLED_OLD_TLS" = "no" then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALLOW_SSLV3" + AM_CFLAGS="$AM_CFLAGS -DNO_OLD_TLS" +fi + + +# TLSv1.2 +AC_ARG_ENABLE([tlsv12], + [AS_HELP_STRING([--enable-tlsv12],[Enable TLS versions 1.2 (default: enabled)])], + [ ENABLED_TLSV12=$enableval ], + [ ENABLED_TLSV12=yes ] + ) + +if test "$ENABLED_CRYPTONLY" = "yes" +then + ENABLED_TLSV12=no +fi +if test "$ENABLED_TLSV12" = "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_TLS12 -DNO_OLD_TLS" fi + # STACK SIZE info for testwolfcrypt and examples AC_ARG_ENABLE([stacksize], [AS_HELP_STRING([--enable-stacksize],[Enable stack size info on examples (default: disabled)])], @@ -4141,6 +4867,21 @@ AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DTLS_CID" fi +# DTLS 1.3 Fragment Second ClientHello +AC_ARG_ENABLE([dtls-frag-ch], + [AS_HELP_STRING([--enable-dtls-frag-ch],[Enable wolfSSL DTLS 1.3 ClientHello fragmenting (default: disabled)])], + [ ENABLED_DTLS_CH_FRAG=$enableval ], + [ ENABLED_DTLS_CH_FRAG=no ] + ) +if test "x$ENABLED_DTLS_CH_FRAG" = "xyes" +then + if test "x$ENABLED_DTLS13" != "xyes" + then + AC_MSG_ERROR([You need to enable DTLSv1.3 to use DTLS ClientHello fragmenting]) + fi + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DTLS_CH_FRAG" +fi + # CODING AC_ARG_ENABLE([coding], [AS_HELP_STRING([--enable-coding],[Enable Coding base 16/64 (default: enabled)])], @@ -4196,6 +4937,14 @@ fi +# MD4 +AC_ARG_ENABLE([md4], + [AS_HELP_STRING([--enable-md4],[Enable MD4 (default: disabled)])], + [ ENABLED_MD4=$enableval ], + [ ENABLED_MD4=no ] + ) + + # DES3 AC_ARG_ENABLE([des3], [AS_HELP_STRING([--enable-des3],[Enable DES3 (default: disabled)])], @@ -4214,6 +4963,13 @@ ENABLED_DES3="yes" fi +# DES3 TLS suites +AC_ARG_ENABLE([des3-tls-suites], + [AS_HELP_STRING([--enable-des3-tls-suites],[Enable DES3 TLS cipher suites (default: disabled)])], + [ ENABLED_DES3_TLS_SUITES=$enableval ], + [ ENABLED_DES3_TLS_SUITES=no ] + ) + # ARC4 if (test "$ENABLED_OPENSSH" = "yes" && test "x$ENABLED_FIPS" = "xno") || \ test "$ENABLED_WPAS" = "yes" || test "$ENABLED_KRB" = "yes" @@ -4277,7 +5033,7 @@ [ ENABLED_CMAC=no ] ) -if test "$ENABLED_WPAS" != "no" || test "$ENABLED_NTP" = "yes" || test "$ENABLED_AESSIV" = "yes" || test "$ENABLED_WOLFENGINE" = "yes" +if test "$ENABLED_WPAS" != "no" || test "$ENABLED_NTP" = "yes" || test "$ENABLED_AESSIV" = "yes" || test "$ENABLED_WOLFENGINE" = "yes" || test "$ENABLED_AESEAX" = "yes" then ENABLED_CMAC=yes fi @@ -4287,14 +5043,28 @@ # AES-XTS -AC_ARG_ENABLE([xts], - [AS_HELP_STRING([--enable-xts],[Enable XTS (default: disabled)])], - [ ENABLED_XTS=$enableval ], - [ ENABLED_XTS=no ] +AC_ARG_ENABLE([aesxts], + [AS_HELP_STRING([--enable-aesxts],[Enable AES XTS (default: disabled)])], + [ ENABLED_AESXTS=$enableval ], + [ ENABLED_AESXTS=no ] ) -AS_IF([test "x$ENABLED_XTS" = "xyes"], - [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_XTS -DWOLFSSL_AES_DIRECT"]) +AS_IF([test "$ENABLED_AESXTS" = "yes" && test "$ENABLED_ARMASM" = "no"], + [ ENABLED_AESXTS_STREAM_DEFAULT=yes ], + [ ENABLED_AESXTS_STREAM_DEFAULT=no ] + ) + +AC_ARG_ENABLE([aesxts-stream], + [AS_HELP_STRING([--enable-aesxts-stream],[Enable wolfSSL AES-XTS support with streaming APIs (default: disabled)])], + [ ENABLED_AESXTS_STREAM=$enableval ], + [ ENABLED_AESXTS_STREAM=$ENABLED_AESXTS_STREAM_DEFAULT ] + ) + +# legacy old option name, for compatibility: +AC_ARG_ENABLE([xts], + [AS_HELP_STRING([--enable-xts],[Please use --enable-aesxts])], + [ ENABLED_AESXTS=$enableval ] + ) # Web Server Build AC_ARG_ENABLE([webserver], @@ -4332,15 +5102,211 @@ AM_CFLAGS="$AM_CFLAGS -DWC_RC2" fi +# CUDA +AC_ARG_ENABLE([cuda], + [AS_HELP_STRING([--enable-cuda],[Enable NVidia CUDA support (default: disabled)])], + [ ENABLED_CUDA=$enableval ], + [ ENABLED_CUDA=no ] + ) + +if test "$ENABLED_CUDA" = "yes" +then + CC=nvcc + AM_CFLAGS="$AM_CFLAGS -DWC_CUDA -DHAVE_CUDA" +fi + +# Certificate Service Support (CFLAG sections later) keep above FIPS section +AC_ARG_ENABLE([certservice], + [AS_HELP_STRING([--enable-certservice],[Enable cert service (default: disabled)])], + [ ENABLED_CERT_SERVICE=$enableval ], + [ ENABLED_CERT_SERVICE=no ] + ) + +# PWDBASED (CFLAG sections later) keep above FIPS section +AC_ARG_ENABLE([pwdbased], + [AS_HELP_STRING([--enable-pwdbased],[Enable PWDBASED (default: disabled)])], + [ ENABLED_PWDBASED=$enableval ], + [ ENABLED_PWDBASED=no ] + ) + +# MemUse Entropy +# wolfEntropy Software Jitter SP800-90B certifiable entropy source +AC_ARG_ENABLE([wolfEntropy], + [AS_HELP_STRING([--enable-wolfEntropy],[Enable memuse entropy support (default: disabled)])], + [ ENABLED_ENTROPY_MEMUSE=$enableval ], + [ ENABLED_ENTROPY_MEMUSE=no ] + ) +AC_ARG_ENABLE([entropy-memuse], + [AS_HELP_STRING([--enable-entropy-memuse],[Enable memuse entropy support (default: disabled)])], + [ ENABLED_ENTROPY_MEMUSE=$enableval ], + [ ENABLED_ENTROPY_MEMUSE=no ] + ) + +# AES key wrap +AC_ARG_ENABLE([aeskeywrap], + [AS_HELP_STRING([--enable-aeskeywrap],[Enable AES key wrap support (default: disabled)])], + [ ENABLED_AESKEYWRAP=$enableval ], + [ ENABLED_AESKEYWRAP=no ] + ) # FIPS feature and macro setup AS_CASE([$FIPS_VERSION], - [v5*|ready|dev], [ # FIPS 140-3 + [v6|ready|dev],[ # FIPS 140-3 SRTP-KDF + AM_CFLAGS="$AM_CFLAGS \ + -DHAVE_FIPS \ + -DHAVE_FIPS_VERSION=$HAVE_FIPS_VERSION \ + -DHAVE_FIPS_VERSION_MAJOR=$HAVE_FIPS_VERSION_MAJOR \ + -DHAVE_FIPS_VERSION_MINOR=$HAVE_FIPS_VERSION_MINOR \ + -DHAVE_FIPS_VERSION_PATCH=$HAVE_FIPS_VERSION_PATCH \ + -DHAVE_ECC_CDH \ + -DWC_RSA_NO_PADDING \ + -DECC_USER_CURVES \ + -DHAVE_ECC384 \ + -DHAVE_ECC521 \ + -DWOLFSSL_VALIDATE_FFC_IMPORT \ + -DHAVE_FFDHE_Q \ + -DHAVE_FFDHE_3072 \ + -DHAVE_FFDHE_4096 \ + -DHAVE_FFDHE_6144 \ + -DHAVE_FFDHE_8192" + + # KCAPI API does not support custom k for sign, don't force enable ECC key sizes and do not use seed callback + AS_IF([test "x$ENABLED_KCAPI_ECC" = "xno"], + [AM_CFLAGS="$AM_CFLAGS \ + -DWC_RNG_SEED_CB \ + -DWOLFSSL_ECDSA_SET_K \ + -DWOLFSSL_VALIDATE_ECC_IMPORT \ + -DWOLFSSL_VALIDATE_ECC_KEYGEN \ + -DHAVE_ECC192 \ + -DHAVE_ECC224 \ + -DHAVE_ECC256"]) + + DEFAULT_MAX_CLASSIC_ASYM_KEY_BITS=8192 +# optimizations section + +# protocol section + AS_IF([test "$ENABLED_WOLFSSH" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_ssh" != "no")], + [enable_ssh="yes"]) + + AS_IF([test "$ENABLED_HKDF" != "yes"], + [ENABLED_HKDF="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_HKDF"]) + + AS_IF([test "x$ENABLED_PWDBASED" = "xno"], + [ENABLED_PWDBASED="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_PBKDF2 -DHAVE_AESGCM"]) + + AS_IF([test "x$ENABLED_SRTP" = "xno"], + [ENABLED_SRTP="yes"]) + AS_IF([test "x$ENABLED_SRTP_KDF" = "xno"], + [ENABLED_SRTP_KDF="yes"]) + +# public key section + AS_IF([test "$ENABLED_KEYGEN" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_keygen" != "no")], + [ENABLED_KEYGEN="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KEY_GEN"]) + +# AS_IF([test "$ENABLED_COMPKEY" = "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_compkey" != "yes")], +# [ENABLED_COMPKEY="yes"]) + + AS_IF([test "$ENABLED_RSAPSS" != "yes"], + [ENABLED_RSAPSS="yes"; AM_CFLAGS="$AM_CFLAGS -DWC_RSA_PSS"]) + + AS_IF([test "$ENABLED_ECC" != "yes"], + [ENABLED_ECC="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_ECC -DTFM_ECC256" + AS_IF([test "$ENABLED_ECC_SHAMIR" = "yes"], + [AM_CFLAGS="$AM_CFLAGS -DECC_SHAMIR"])]) + + AS_IF([test "x$ENABLED_ED25519" != "xyes"], + [ENABLED_ED25519="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_ED25519 -DHAVE_ED25519_KEY_IMPORT"]) + AS_IF([test "$ENABLED_CURVE25519" = "no"], + [ENABLED_CURVE25519="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_CURVE25519"]) + + AS_IF([test "x$ENABLED_ED448" != "xyes"], + [ENABLED_ED448="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_ED448 -DHAVE_ED448_KEY_IMPORT"]) + AS_IF([test "x$ENABLED_CURVE448" != "xyes"], + [ENABLED_CURVE448="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_CURVE448"]) + + AS_IF([test "x$ENABLED_ED25519_STREAM" != "xyes"], + [ENABLED_ED25519_STREAM="yes"]) + AS_IF([test "x$ENABLED_ED448_STREAM" != "xyes"], + [ENABLED_ED448_STREAM="yes"]) + + AS_IF([test "x$ENABLED_ECCCUSTCURVES" != "xno" && test "$FIPS_VERSION" != "dev"], + [ENABLED_ECCCUSTCURVES="no"]) + +# Hashing section + AS_IF([test "x$ENABLED_SHA3" != "xyes"], + [ENABLED_SHA3="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA3"]) + + AS_IF([test "$ENABLED_SHA224" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_sha224" != "no")], + [ENABLED_SHA224="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA224"]) + + AS_IF([test "$ENABLED_SHA512" = "no"], + [ENABLED_SHA512="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA512 -DWOLFSSL_SHA384"]) + + # SHA512-224 and SHA512-256 are SHA-2 algorithms not in our FIPS algorithm list + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NOSHA512_224 -DWOLFSSL_NOSHA512_256" + + # Shake128 because we're testing SHAKE256 + AS_IF([test "x$ENABLED_SHAKE128" = "xno"], + [ENABLED_SHAKE128="yes"]) + + # Shake256 mandated for ED448 + AS_IF([test "x$ENABLED_SHAKE256" = "xno"], + [ENABLED_SHAKE256="yes"]) + +# Aes section + AS_IF([test "$ENABLED_AESCCM" != "yes"], + [ENABLED_AESCCM="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_AESCCM"]) + + AS_IF([test "$ENABLED_AESCTR" != "yes"], + [ENABLED_AESCTR="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_COUNTER"]) + + AS_IF([test "$ENABLED_CMAC" != "yes"], + [ENABLED_CMAC="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CMAC"]) + + AS_IF([test "$ENABLED_AESGCM" = "no"], + [ENABLED_AESGCM="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_AESGCM"; AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_AESGCM"]) + + # AES-GCM streaming is part of the v6 FIPS suite, but isn't implemented + # for armasm on arm-v7 or earlier (see armasm setup above). + AS_IF([test "$ENABLED_AESGCM_STREAM" != "yes" && ! (test "$ENABLED_ARMASM" = "yes" && test "$ENABLED_ARMASM_CRYPTO" = "no")], + [ENABLED_AESGCM_STREAM="yes"]) + + AS_IF([test "x$ENABLED_AESOFB" = "xno"], + [ENABLED_AESOFB="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_OFB"]) + + AS_IF([test "x$ENABLED_AESCFB" = "xno"], + [ENABLED_AESCFB="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_CFB"]) + + AS_IF([test "x$ENABLED_AESXTS" = "xno"], + [ENABLED_AESXTS="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_XTS"]) + AS_IF([test "x$ENABLED_AESXTS" = "xyes" && test "x$ENABLED_AESNI" = "xyes"], + [AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_AES_XTS"]) + + AS_IF([test "x$ENABLED_AESXTS_STREAM" = "xno" && ! (test "$ENABLED_ARMASM" = "yes" || test "$ENABLED_ARMASM_CRYPTO" = "no")], + [ENABLED_AESXTS_STREAM="yes"]) + + AS_IF([(test "$ENABLED_AESCCM" = "yes" && test "$HAVE_AESCCM_PORT" != "yes") || + (test "$ENABLED_AESCTR" = "yes" && test "$HAVE_AESCTR_PORT" != "yes") || + (test "$ENABLED_AESGCM" = "yes" && test "$HAVE_AESGCM_PORT" != "yes") || + (test "$ENABLED_AESOFB" = "yes" && test "$HAVE_AESOFB_PORT" != "yes")], + [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_DIRECT -DHAVE_AES_ECB"]) + + AS_IF([test "x$ENABLED_AESKEYWRAP" != "xyes"], + [ENABLED_AESKEYWRAP="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_AES_KEYWRAP"]) + +# Old TLS requires MD5 + HMAC, which is not allowed under FIPS 140-3 + AS_IF([test "$ENABLED_OLD_TLS" != "no"], + [ENABLED_OLD_TLS="no"; AM_CFLAGS="$AM_CFLAGS -DNO_OLD_TLS"]) + + ], + [v5*], [ # FIPS 140-3 AM_CFLAGS="$AM_CFLAGS \ -DHAVE_FIPS \ -DHAVE_FIPS_VERSION=$HAVE_FIPS_VERSION \ + -DHAVE_FIPS_VERSION_MAJOR=$HAVE_FIPS_VERSION_MAJOR \ -DHAVE_FIPS_VERSION_MINOR=$HAVE_FIPS_VERSION_MINOR \ + -DHAVE_FIPS_VERSION_PATCH=$HAVE_FIPS_VERSION_PATCH \ -DHAVE_ECC_CDH \ -DWC_RSA_NO_PADDING \ -DECC_USER_CURVES \ @@ -4368,60 +5334,66 @@ # force various features to FIPS 140-3 defaults, unless overridden with dev: - AS_IF([test "$ENABLED_KEYGEN" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_keygen" != "no")], + AS_IF([test "$ENABLED_KEYGEN" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_keygen" != "no")], [ENABLED_KEYGEN="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KEY_GEN"]) - AS_IF([test "$ENABLED_COMPKEY" = "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_compkey" != "yes")], + AS_IF([test "$ENABLED_COMPKEY" = "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_compkey" != "yes")], [ENABLED_COMPKEY="no"]) - AS_IF([test "$ENABLED_SHA224" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_sha224" != "no")], + AS_IF([test "$ENABLED_SHA224" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_sha224" != "no")], [ENABLED_SHA224="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA224"]) - AS_IF([test "$ENABLED_WOLFSSH" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_ssh" != "no")], + AS_IF([test "$ENABLED_SHA3" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_sha3" != "no")], + [ENABLED_SHA3="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA3"]) + + AS_IF([test "$ENABLED_WOLFSSH" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_ssh" != "no")], [enable_ssh="yes"]) - # Shake128 is a SHA-3 algorithm not in our FIPS algorithm list - AS_IF([test "$ENABLED_SHAKE128" != "no" && (test "$FIPS_VERSION" != "dev" || test "$enable_shake128" != "yes")], + # Shake128 is a SHA-3 algorithm outside the v5 FIPS algorithm list + AS_IF([test "$ENABLED_SHAKE128" != "no" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_shake128" != "yes")], [ENABLED_SHAKE128=no; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_SHAKE128"]) - # Shake256 is a SHA-3 algorithm not in our FIPS algorithm list - AS_IF([test "$ENABLED_SHAKE256" != "no" && (test "$FIPS_VERSION" != "dev" || test "$enable_shake256" != "yes")], + # Shake256 is a SHA-3 algorithm outside the v5 FIPS algorithm list + AS_IF([test "$ENABLED_SHAKE256" != "no" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_shake256" != "yes")], [ENABLED_SHAKE256=no; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_SHAKE256"]) - # SHA512-224 and SHA512-256 are SHA-2 algorithms not in our FIPS algorithm list + # SHA512-224 and SHA512-256 are SHA-2 algorithms outside the v5 FIPS algorithm list AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NOSHA512_224 -DWOLFSSL_NOSHA512_256" - AS_IF([test "$ENABLED_AESCCM" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_aesccm" != "no")], + AS_IF([test "$ENABLED_AESCCM" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_aesccm" != "no")], [ENABLED_AESCCM="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_AESCCM"]) - AS_IF([test "$ENABLED_RSAPSS" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_rsapss" != "no")], + AS_IF([test "$ENABLED_AESXTS" = "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_aesxts" != "yes")], + [ENABLED_AESXTS="no"]) + + AS_IF([test "$ENABLED_RSAPSS" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_rsapss" != "no")], [ENABLED_RSAPSS="yes"; AM_CFLAGS="$AM_CFLAGS -DWC_RSA_PSS"]) - AS_IF([test "$ENABLED_ECC" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_ecc" != "no")], + AS_IF([test "$ENABLED_ECC" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_ecc" != "no")], [ENABLED_ECC="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_ECC -DTFM_ECC256" - AS_IF([test "$ENABLED_ECC_SHAMIR" = "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_eccshamir" != "no")], + AS_IF([test "$ENABLED_ECC_SHAMIR" = "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_eccshamir" != "no")], [AM_CFLAGS="$AM_CFLAGS -DECC_SHAMIR"])]) - AS_IF([test "$ENABLED_AESCTR" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_aesctr" != "no")], + AS_IF([test "$ENABLED_AESCTR" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_aesctr" != "no")], [ENABLED_AESCTR="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_COUNTER"]) - AS_IF([test "$ENABLED_CMAC" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_cmac" != "no")], + AS_IF([test "$ENABLED_CMAC" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_cmac" != "no")], [ENABLED_CMAC="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CMAC"]) - AS_IF([test "$ENABLED_HKDF" != "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_hkdf" != "no")], + AS_IF([test "$ENABLED_HKDF" != "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_hkdf" != "no")], [ENABLED_HKDF="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_HKDF"]) AS_IF([test "$ENABLED_INTELASM" = "yes"], [AM_CFLAGS="$AM_CFLAGS -DFORCE_FAILURE_RDSEED"]) - AS_IF([test "$ENABLED_SHA512" = "no" && (test "$FIPS_VERSION" != "dev" || test "$enable_sha512" != "no")], + AS_IF([test "$ENABLED_SHA512" = "no" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_sha512" != "no")], [ENABLED_SHA512="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA512 -DWOLFSSL_SHA384"]) - AS_IF([test "$ENABLED_AESGCM" = "no" && (test "$FIPS_VERSION" != "dev" || test "$enable_aesgcm" != "no")], + AS_IF([test "$ENABLED_AESGCM" = "no" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_aesgcm" != "no")], [ENABLED_AESGCM="yes"; AM_CFLAGS="$AM_CFLAGS -DHAVE_AESGCM"; AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_AESGCM"]) - # AES-GCM streaming isn't part of the current FIPS suite. - AS_IF([test "$ENABLED_AESGCM_STREAM" = "yes" && (test "$FIPS_VERSION" != "dev" || test "$enable_aesgcm_stream" != "yes")], + # AES-GCM streaming isn't part of the v5 FIPS suite. + AS_IF([test "$ENABLED_AESGCM_STREAM" = "yes" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_aesgcm_stream" != "yes")], [ENABLED_AESGCM_STREAM="no"]) # Old TLS requires MD5 + HMAC, which is not allowed under FIPS 140-3 @@ -4429,13 +5401,14 @@ [ENABLED_OLD_TLS="no"; AM_CFLAGS="$AM_CFLAGS -DNO_OLD_TLS"]) AS_IF([test $HAVE_FIPS_VERSION_MINOR -ge 2], - [AS_IF([test "x$ENABLED_AESOFB" = "xno" && (test "$FIPS_VERSION" != "dev" || test "$enable_aesofb" != "no")], + [AS_IF([test "x$ENABLED_AESOFB" = "xno" && (test "$FIPS_VERSION" != "v5-dev" || test "$enable_aesofb" != "no")], [ENABLED_AESOFB="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_OFB"])]) AS_IF([(test "$ENABLED_AESCCM" = "yes" && test "$HAVE_AESCCM_PORT" != "yes") || (test "$ENABLED_AESCTR" = "yes" && test "$HAVE_AESCTR_PORT" != "yes") || (test "$ENABLED_AESGCM" = "yes" && test "$HAVE_AESGCM_PORT" != "yes") || - (test "$ENABLED_AESOFB" = "yes" && test "$HAVE_AESOFB_PORT" != "yes")], + (test "$ENABLED_AESOFB" = "yes" && test "$HAVE_AESOFB_PORT" != "yes") || + (test "$ENABLED_AESXTS" = "yes" && test "$HAVE_AESXTS_PORT" != "yes")], [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_DIRECT -DHAVE_AES_ECB"]) ], @@ -4443,7 +5416,9 @@ AM_CFLAGS="$AM_CFLAGS \ -DHAVE_FIPS \ -DHAVE_FIPS_VERSION=$HAVE_FIPS_VERSION \ + -DHAVE_FIPS_VERSION_MAJOR=$HAVE_FIPS_VERSION_MAJOR \ -DHAVE_FIPS_VERSION_MINOR=$HAVE_FIPS_VERSION_MINOR \ + -DHAVE_FIPS_VERSION_PATCH=$HAVE_FIPS_VERSION_PATCH \ -DWOLFSSL_KEY_GEN \ -DWOLFSSL_SHA224 \ -DWOLFSSL_AES_DIRECT \ @@ -4494,11 +5469,22 @@ ], ["rand"],[ - AM_CFLAGS="$AM_CFLAGS -DWOLFCRYPT_FIPS_RAND -DHAVE_FIPS -DHAVE_FIPS_VERSION=$HAVE_FIPS_VERSION -DHAVE_FIPS_VERSION_MINOR=$HAVE_FIPS_VERSION_MINOR" + AM_CFLAGS="$AM_CFLAGS \ + -DWOLFCRYPT_FIPS_RAND \ + -DHAVE_FIPS \ + -DHAVE_FIPS_VERSION=$HAVE_FIPS_VERSION \ + -DHAVE_FIPS_VERSION_MAJOR=$HAVE_FIPS_VERSION_MAJOR \ + -DHAVE_FIPS_VERSION_MINOR=$HAVE_FIPS_VERSION_MINOR \ + -DHAVE_FIPS_VERSION_PATCH=$HAVE_FIPS_VERSION_PATCH" ], ["v1"],[ # FIPS 140-2, Cert 2425 - AM_CFLAGS="$AM_CFLAGS -DHAVE_FIPS" + AM_CFLAGS="$AM_CFLAGS \ + -DHAVE_FIPS \ + -DHAVE_FIPS_VERSION=$HAVE_FIPS_VERSION \ + -DHAVE_FIPS_VERSION_MAJOR=$HAVE_FIPS_VERSION_MAJOR \ + -DHAVE_FIPS_VERSION_MINOR=$HAVE_FIPS_VERSION_MINOR \ + -DHAVE_FIPS_VERSION_PATCH=$HAVE_FIPS_VERSION_PATCH" AS_IF([test "x$ENABLED_SHA512" = "xno"], [ENABLED_SHA512="yes"; AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA512 -DWOLFSSL_SHA384"]) AS_IF([test "x$ENABLED_AESGCM" = "xno"], @@ -4506,10 +5492,11 @@ AS_IF([test "x$ENABLED_DES3" = "xno"],[ENABLED_DES3="yes"]) ]) -AS_IF([test "x$ENABLED_FIPS" = "xyes" && test "x$thread_ls_on" = "xno"], +AS_IF([test "x$ENABLED_FIPS" = "xyes" && test "x$thread_ls_on" = "xno" && test "$ENABLE_LINUXKM" = "no"], [AC_MSG_ERROR([FIPS requires Thread Local Storage])]) - +AS_IF([(test "$ENABLED_NULL_CIPHER" = "yes" || test "$ENABLED_LEANPSK" = "yes") && test "$ENABLED_FIPS" != "no" && test "$FIPS_VERSION" != "dev" && test "$FIPS_VERSION" != "v5-dev"], + [AC_MSG_ERROR([FIPS is incompatible with nullcipher])]) # SELFTEST AC_ARG_ENABLE([selftest], @@ -4539,18 +5526,122 @@ AM_CFLAGS="$AM_CFLAGS -DHAVE_SELFTEST -DHAVE_PUBLIC_FFDHE" ]) +AS_IF([test "x$ENABLED_AESXTS" = "xyes"], + [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_XTS -DWOLFSSL_AES_DIRECT"]) +AS_IF([test "x$ENABLED_AESXTS" = "xyes" && test "x$ENABLED_INTELASM" = "xyes"], + [AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_AES_XTS"]) +AS_IF([test "x$ENABLED_AESXTS" = "xyes" && test "x$ENABLED_AESNI" = "xyes"], + [AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_AES_XTS"]) + +# ECC Custom Curves +if test "$ENABLED_ECCCUSTCURVES" != "no" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CUSTOM_CURVES" + + # For distro, all or ecccustcurves=all builds, enable all curve types + if test "$ENABLED_DISTRO" = "yes" || test "$ENABLED_ALL" = "yes" || test "$ENABLED_ECCCUSTCURVES" = "all" + then + # Enable ECC SECPR2, SECPR3, BRAINPOOL and KOBLITZ curves + AM_CFLAGS="$AM_CFLAGS -DHAVE_ECC_SECPR2 -DHAVE_ECC_SECPR3 -DHAVE_ECC_BRAINPOOL -DHAVE_ECC_KOBLITZ" + + # Enable ECC Cofactor support + AM_CFLAGS="$AM_CFLAGS -DHAVE_ECC_CDH" + + # If fastmath enabled and on x86 use speedups + if test "x$ENABLED_FASTMATH" = "xyes" && test "$host_cpu" = "x86_64" -o "$host_cpu" = "amd64" + then + AM_CFLAGS="$AM_CFLAGS -DTFM_ECC192 -DTFM_ECC224 -DTFM_ECC256 -DTFM_ECC384 -DTFM_ECC521" + fi + fi +fi + +# Curve448 +if test "$ENABLED_CURVE448" != "no" +then + if test "$ENABLED_CURVE448" = "small" || test "$ENABLED_LOWRESOURCE" = "yes" + then + AM_CFLAGS="$AM_CFLAGS -DCURVE448_SMALL" + ENABLED_CURVE448_SMALL=yes + ENABLED_CURVE448=yes + fi + + if test "$ENABLED_CURVE448" = "no128bit" || test "$ENABLED_32BIT" = "yes" + then + AM_CFLAGS="$AM_CFLAGS -DNO_CURVED448_128BIT" + ENABLED_CURVE448=yes + fi + + AM_CFLAGS="$AM_CFLAGS -DHAVE_CURVE448" + ENABLED_FE448=yes +fi + +# Ed448 +if test "$ENABLED_ED448" != "no" +then + if test "$ENABLED_ED448" = "small" || test "$ENABLED_LOWRESOURCE" = "yes" + then + AM_CFLAGS="$AM_CFLAGS -DED448_SMALL" + ENABLED_ED448_SMALL=yes + ENABLED_CURVE448_SMALL=yes + ENABLED_ED448=yes + fi + + if test "$ENABLED_SHA512" = "no" + then + AC_MSG_ERROR([cannot enable ed448 without enabling sha512.]) + fi + if test "x$HAVE_FIPS_VERSION" = "x2" + then + AC_MSG_ERROR([cannot enable ed448 w/ dependency shake256 in FIPSv2 mode]) + fi + ENABLED_FE448=yes + ENABLED_GE448=yes + AM_CFLAGS="$AM_CFLAGS -DHAVE_ED448" + + # EdDSA448 requires SHAKE256 which requires SHA-3 + if test "$ENABLED_SHA3" = "no" + then + ENABLED_SHA3=yes + fi + ENABLED_SHAKE256=yes + + ENABLED_CERTS=yes +fi + +if test "$ENABLED_ED448_STREAM" != "no" +then + if test "$ENABLED_ED448" = "no" + then + AC_MSG_ERROR([ED448 verify streaming enabled but ED448 is disabled]) + else + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ED448_STREAMING_VERIFY" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_ED448_STREAMING_VERIFY" + fi +fi + + +# SRTP-KDF +if test "$ENABLED_SRTP" = "yes" +then + ENABLED_SRTP_KDF="yes" +fi +if test "$ENABLED_SRTP_KDF" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWC_SRTP_KDF -DHAVE_AES_ECB -DWOLFSSL_AES_DIRECT" +fi # Set SHA-3 flags -if test "$ENABLED_SHA3" != "no" && test "$ENABLED_32BIT" = "no" +if test "$ENABLED_SHA3" != "no" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA3" fi # Set SHAKE128 flags -# FIPS does not support SHAKE 128 -AS_IF([test "x$ENABLED_FIPS" = "xyes"],[ENABLED_SHAKE128="no"]) +# FIPS traditionally does not support SHAKE 128, v6 does +AS_IF([test "x$ENABLED_FIPS" = "xyes" && test $HAVE_FIPS_VERSION -lt 6], + [ENABLED_SHAKE128="no"]) -if test "$ENABLED_SHAKE128" != "no" && test "$ENABLED_32BIT" = "no" +if test "$ENABLED_SHAKE128" != "no" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHAKE128" if test "$ENABLED_SHA3" = "no" @@ -4562,10 +5653,11 @@ fi # Set SHAKE256 flags -# FIPS does not support SHAKE 256 -AS_IF([test "x$ENABLED_FIPS" = "xyes"],[ENABLED_SHAKE256="no"]) +# FIPS traditionally does not support SHAKE 256, v6 does +AS_IF([test "x$ENABLED_FIPS" = "xyes" && test $HAVE_FIPS_VERSION -lt 6], + [ENABLED_SHAKE256="no"]) -if test "$ENABLED_SHAKE256" != "no" && test "$ENABLED_32BIT" = "no" +if test "$ENABLED_SHAKE256" != "no" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHAKE256" if test "$ENABLED_SHA3" = "no" @@ -4673,14 +5765,7 @@ fi fi - -# MemUse Entropy -AC_ARG_ENABLE([entropy-memuse], - [AS_HELP_STRING([--enable-entropy-memuse],[Enable memuse entropy support (default: disabled)])], - [ ENABLED_ENTROPY_MEMUSE=$enableval ], - [ ENABLED_ENTROPY_MEMUSE=no ] - ) - +# MemUse Entropy (AKA wolfEntropy) if test "x$ENABLED_ENTROPY_MEMUSE" != "xno" then AM_CFLAGS="$AM_CFLAGS -DHAVE_ENTROPY_MEMUSE" @@ -4870,65 +5955,6 @@ esac fi - -# USER CRYPTO -ENABLED_USER_CRYPTO="no" -ENABLED_USER_RSA="no" -AC_DEFINE([BUILD_USER_RSA], [], [User RSA is being defined]) -trycryptodir="" -AC_ARG_WITH([user-crypto], - [AS_HELP_STRING([--with-user-crypto=PATH],[Path to USER_CRYPTO install (default /usr/local)])], - [ - CPPFLAGS="$CPPFLAGS -DHAVE_USER_CRYPTO" - LIBS="$LIBS -lusercrypto" - - if test "x$withval" != "xno" ; then - trycryptodir=$withval - fi - if test "x$withval" = "xyes" ; then - trycryptodir="/usr/local" - fi - - LDFLAGS="$LDFLAGS -L$trycryptodir/lib" - CPPFLAGS="$CPPFLAGS -I$trycryptodir/include" - - #Look for RSA Init function in usercrypto lib - AC_CHECK_LIB([usercrypto], [wc_InitRsaKey], [user_rsa_linked=yes], [user_rsa_linked=no]) - - if test "x$user_rsa_linked" = "xyes" ; then - AC_MSG_NOTICE([User user_rsa.h being used]) - AM_CFLAGS="$AM_CFLAGS -DHAVE_USER_RSA" - ENABLED_USER_RSA=yes - ENABLED_USER_CRYPTO=yes - fi - - - #Display check and find result of link attempts - AC_MSG_CHECKING([for USER_CRYPTO]) - if test "x$ENABLED_USER_CRYPTO" = "xno" ; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR([USER_CRYPTO not found. Either move to /usr/include and /usr/lib or - Specify its path using --with-user-crypto=/dir/]) - else - AC_MSG_RESULT([yes]) - # Check if .la is available if not then rely on exported path - if test -e $trycryptodir/lib/libusercrypto.la - then - LIB_ADD="$trycryptodir/lib/libusercrypto.la $LIB_ADD" - else - LIB_ADD="-lusercrypto $LIB_ADD" - fi - AM_LDFLAGS="$AM_LDFLAGS -L$trycryptodir/lib" - AM_CFLAGS="$AM_CFLAGS -DHAVE_USER_CRYPTO" - fi - ] -) - -if test "$ENABLED_USER_CRYPTO" = "yes" && test "$ENABLED_FIPS" = "yes" -then - AC_MSG_ERROR([cannot enable user crypto and fips, user crypto possibility of using code in fips boundary.]) -fi - # Whitewood netRandom client library ENABLED_WNR="no" trywnrdir="" @@ -4971,21 +5997,22 @@ # SNI +# enable SNI automatically for x86_64/x86/aarch64/amd64 +SNI_DEFAULT=no +if test "$host_cpu" = "x86_64" || test "$host_cpu" = "x86" || test "$host_cpu" = "aarch64" || test "$host_cpu" = "amd64" +then + SNI_DEFAULT=yes +fi AC_ARG_ENABLE([sni], - [AS_HELP_STRING([--enable-sni],[Enable SNI (default: disabled)])], + [AS_HELP_STRING([--enable-sni],[Enable SNI (default: enabled on x86_64/x86/aarch64/amd64)])], [ ENABLED_SNI=$enableval ], - [ ENABLED_SNI=no ] + [ ENABLED_SNI=$SNI_DEFAULT ] ) -if test "x$ENABLED_QT" = "xyes" +if test "x$ENABLED_QT" = "xyes" || test "$ENABLED_QUIC" = "yes" then ENABLED_SNI="yes" fi -if test "$ENABLED_QUIC" = "yes" -then - ENABLED_SNI=yes -fi - if test "x$ENABLED_SNI" = "xyes" then AM_CFLAGS="$AM_CFLAGS -DHAVE_TLS_EXTENSIONS -DHAVE_SNI" @@ -5200,7 +6227,7 @@ AC_ARG_ENABLE([ticket-nonce-malloc], [AS_HELP_STRING([--enable-ticket-nonce-malloc], [Enable dynamic allocation of ticket nonces (default: disabled)])], [ ENABLED_TICKET_NONCE_MALLOC=$enableval ], - [ ENABLED_TICKET_NONCE_MALLOC=no ] + [ ENABLED_TICKET_NONCE_MALLOC=no_implicit ] ) if test "$ENABLED_TICKET_NONCE_MALLOC" = "yes" @@ -5246,7 +6273,7 @@ ENABLED_ENCRYPT_THEN_MAC=yes AM_CFLAGS="$AM_CFLAGS -DHAVE_TLS_EXTENSIONS -DHAVE_SNI -DHAVE_MAX_FRAGMENT -DHAVE_TRUNCATED_HMAC -DHAVE_ALPN -DHAVE_TRUSTED_CA" # Check the ECC supported curves prereq - AS_IF([test "x$ENABLED_ECC" != "xno" || test "x$ENABLED_CURVE25519" = "xyes" || test "x$ENABLED_CURVE448" = "xyes" || test "x$ENABLED_TLS13" = "xyes"], + AS_IF([test "x$ENABLED_ECC" != "xno" || test "$ENABLED_CURVE25519" != "no" || test "x$ENABLED_CURVE448" = "xyes" || test "x$ENABLED_TLS13" = "xyes"], [ENABLED_SUPPORTED_CURVES=yes AM_CFLAGS="$AM_CFLAGS -DHAVE_SUPPORTED_CURVES"]) fi @@ -5362,6 +6389,9 @@ ENABLED_AESCFB="yes" AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_CFB" fi + + # Requires public mp_ + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_PUBLIC_MP" fi if test "x$ENABLED_SMIME" = "xyes" @@ -5509,13 +6539,7 @@ AM_CFLAGS="$AM_CFLAGS -DHAVE_IO_POOL -DXMALLOC_USER" fi - # Certificate Service Support -AC_ARG_ENABLE([certservice], - [AS_HELP_STRING([--enable-certservice],[Enable cert service (default: disabled)])], - [ ENABLED_CERT_SERVICE=$enableval ], - [ ENABLED_CERT_SERVICE=no ] - ) if test "$ENABLED_CERT_SERVICE" = "yes" then # Requires ecc,certgen, and opensslextra make sure on @@ -5551,7 +6575,10 @@ ) if test "$ENABLED_JNI" = "yes" then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_JNI -DHAVE_EX_DATA" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_JNI" + AM_CFLAGS="$AM_CFLAGS -DHAVE_EX_DATA" + AM_CFLAGS="$AM_CFLAGS -DKEEP_PEER_CERT" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALWAYS_VERIFY_CB" # Enable prereqs if not already enabled if test "x$ENABLED_DTLS" = "xno" @@ -5633,6 +6660,18 @@ ENABLED_CERTGEN="yes" AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CERT_GEN" fi + # wolfCrypt JNI/JCE uses keygen, enable by default here so + # both JCE and JSSE builds can use --enable-jni + if test "x$ENABLED_KEYGEN" = "xno" + then + ENABLED_KEYGEN="yes" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KEY_GEN" + fi + if test "x$ENABLED_CERTREQ" = "xno" + then + ENABLED_CERTREQ="yes" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CERT_REQ" + fi if test "x$ENABLED_SNI" = "xno" then ENABLED_SNI="yes" @@ -5643,6 +6682,20 @@ ENABLED_ALPN="yes" AM_CFLAGS="$AM_CFLAGS -DHAVE_ALPN" fi + if test "x$ENABLED_ALT_CERT_CHAINS" = "xno" + then + ENABLED_ALT_CERT_CHAINS="yes" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALT_CERT_CHAINS" + fi + + if test "x$ENABLED_SESSIONCERTS" = "xno" + then + ENABLED_SESSIONCERTS="yes" + AM_CFLAGS="$AM_CFLAGS -DSESSION_CERTS" + fi + + # cert gen requires alt names + ENABLED_ALTNAMES="yes" fi if test "$ENABLED_LIGHTY" = "yes" @@ -5682,6 +6735,8 @@ if test "$ENABLED_NGINX" = "yes" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NGINX -DWOLFSSL_SIGNER_DER_CERT" + AM_CFLAGS="$AM_CFLAGS -DOPENSSL_COMPATIBLE_DEFAULTS" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ERROR_CODE_OPENSSL" fi if test "$ENABLED_HAPROXY" = "yes" @@ -5797,6 +6852,51 @@ AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DES_ECB -DHAVE_EX_DATA -DWOLFSSL_KEY_GEN" fi +if test "$ENABLED_HITCH" = "yes" +then + # Requires opensslextra make sure on + if test "x$ENABLED_OPENSSLEXTRA" = "xno" && test "x$ENABLED_OPENSSLCOEXIST" = "xno" + then + ENABLED_OPENSSLEXTRA="yes" + AM_CFLAGS="$AM_CFLAGS -DOPENSSL_EXTRA" + fi + + # Requires OCSP make sure on + if test "x$ENABLED_OCSP" = "xno" + then + ENABLED_OCSP="yes" + fi + + # Requires ALPN + if test "x$ENABLED_ALPN" = "xno" + then + ENABLED_ALPN="yes" + AM_CFLAGS="$AM_CFLAGS -DHAVE_TLS_EXTENSIONS -DHAVE_ALPN" + fi + + if test "x$ENABLED_KEYGEN" = "xno" + then + ENABLED_KEYGEN="yes" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_KEY_GEN" + fi + + # Requires sessioncerts make sure on + if test "x$ENABLED_SESSIONCERTS" = "xno" + then + ENABLED_SESSIONCERTS="yes" + AM_CFLAGS="$AM_CFLAGS -DSESSION_CERTS" + fi + + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HITCH -DHAVE_EX_DATA -DWOLFSSL_SIGNER_DER_CERT" + AM_CFLAGS="$AM_CFLAGS -DOPENSSL_COMPATIBLE_DEFAULTS -DWOLFSSL_CIPHER_INTERNALNAME" +fi + +if test "$ENABLED_MEMCACHED" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SESSION_ID_CTX" + AM_CFLAGS="$AM_CFLAGS -DHAVE_EXT_CACHE -DHAVE_MEMCACHED" +fi + if test "$ENABLED_NGINX" = "yes"|| test "x$ENABLED_HAPROXY" = "xyes" || test "x$ENABLED_LIGHTY" = "xyes" then @@ -6012,7 +7112,7 @@ AM_CFLAGS="$AM_CFLAGS -DHAVE_TLS_EXTENSIONS -DHAVE_SNI -DHAVE_MAX_FRAGMENT -DHAVE_TRUNCATED_HMAC" # Check the ECC supported curves prereq - AS_IF([test "x$ENABLED_ECC" != "xno" || test "x$ENABLED_CURVE25519" = "xyes"], + AS_IF([test "x$ENABLED_ECC" != "xno" || test "$ENABLED_CURVE25519" != "no"], [ENABLED_SUPPORTED_CURVES=yes AM_CFLAGS="$AM_CFLAGS -DHAVE_SUPPORTED_CURVES"]) fi @@ -6062,6 +7162,11 @@ # curl support requires all the features enabled within this conditional. if test "$ENABLED_CURL" = "yes" then + if test "$ENABLED_MD4" = "no" + then + ENABLED_MD4="yes" + fi + if test "x$ENABLED_DES3" = "xno" then ENABLED_DES3="yes" @@ -6133,6 +7238,13 @@ AM_CFLAGS="$AM_CFLAGS -DNO_SESSION_CACHE_REF" AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DES_ECB" + + # support longer session ticket nonce + if test "$ENABLED_TICKET_NONCE_MALLOC" = "no_implicit" + then + ENABLED_TICKET_NONCE_MALLOC="yes" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_TICKET_NONCE_MALLOC" + fi fi if test "$ENABLED_PSK" = "no" && test "$ENABLED_LEANPSK" = "no" \ @@ -6276,14 +7388,6 @@ fi fi -# MD4 -AC_ARG_ENABLE([md4], - [AS_HELP_STRING([--enable-md4],[Enable MD4 (default: disabled)])], - [ ENABLED_MD4=$enableval ], - [ ENABLED_MD4=no ] - ) - - if test "$ENABLED_MD4" = "no" then #turn on MD4 if using stunnel @@ -6333,13 +7437,6 @@ fi # PWDBASED has to come after certservice since we want it on w/o explicit on -# PWDBASED -AC_ARG_ENABLE([pwdbased], - [AS_HELP_STRING([--enable-pwdbased],[Enable PWDBASED (default: disabled)])], - [ ENABLED_PWDBASED=$enableval ], - [ ENABLED_PWDBASED=no ] - ) - if test "$ENABLED_PWDBASED" = "no" then if test "$ENABLED_OPENSSLEXTRA" = "yes" || test "$ENABLED_OPENSSLALL" = "yes" || \ @@ -6584,7 +7681,7 @@ ENABLED_CAVIUM_V=yes ], [ - ENABLED_CAVIUM_=no + ENABLED_CAVIUM=no ENABLED_CAVIUM_V=no ] ) @@ -6695,6 +7792,7 @@ ENABLED_SP_EC_256=no ENABLED_SP_EC_384=no ENABLED_SP_EC_521=no +ENABLED_SP_SM2=$ENABLED_SM2 ENABLED_SP_SAKKE_1024=$ENABLED_SAKKE ENABLED_SP_NO_MALLOC=no ENABLED_SP_NONBLOCK=no @@ -6786,6 +7884,15 @@ ENABLED_SP_ECC=yes ENABLED_SP_SAKKE_1024=yes ;; + smallsm2) + ENABLED_SP_SMALL=yes + ENABLED_SP_ECC=yes + ENABLED_SP_SM2=yes + ;; + sm2) + ENABLED_SP_ECC=yes + ENABLED_SP_SM2=yes + ;; small2048) ENABLED_SP_SMALL=yes @@ -6933,6 +8040,10 @@ AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_1024" AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_1024" fi + if test "$ENABLED_SP_SM2" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_SM2" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_SM2" + fi fi if test "$ENABLED_SP_SMALL" = "yes"; then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_SMALL" @@ -7096,21 +8207,47 @@ AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM64_ASM" ENABLED_SP_ARM64_ASM=yes ;; + *armv7a* | *armv7l*) + if test "$ENABLED_ARMASM" = "no"; then + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-a -mfpu=neon -DWOLFSSL_ARM_ARCH=7 -marm" + fi + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM32_ASM" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM32_ASM" + ENABLED_SP_ARM32_ASM=yes + ;; + *cortex* | *armv7m*) + if test "$ENABLED_ARMASM" = "no"; then + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv7-r -D__thumb__ -DWOLFSSL_ARM_ARCH=7" + fi + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM_CORTEX_M_ASM" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM_CORTEX_M_ASM" + ENABLED_SP_ARM_CORTEX_ASM=yes + ;; + *armv6*) + if test "$ENABLED_ARMASM" = "no"; then + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv6 -DWOLFSSL_ARM_ARCH=6" + fi + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM32_ASM" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM32_ASM" + ENABLED_SP_ARM32_ASM=yes + ;; + *armv4*) + if test "$ENABLED_ARMASM" = "no"; then + AM_CPPFLAGS="$AM_CPPFLAGS -march=armv4 -DWOLFSSL_ARM_ARCH=4" + fi + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM32_ASM" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM32_ASM" + ENABLED_SP_ARM32_ASM=yes + ;; *arm*) if test "$host_alias" = "thumb" || test "$ARM_TARGET" = "thumb"; then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM_THUMB_ASM" AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM_THUMB_ASM" ENABLED_SP_ARM_THUMB_ASM=yes else - if test "$host_alias" = "cortex" || test "$ARM_TARGET" = "cortex"; then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM_CORTEX_M_ASM" - AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM_CORTEX_M_ASM" - ENABLED_SP_ARM_CORTEX_ASM=yes - else - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM32_ASM" - AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM32_ASM" - ENABLED_SP_ARM32_ASM=yes - fi + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SP_ARM32_ASM" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_SP_ARM32_ASM" + ENABLED_SP_ARM32_ASM=yes fi ;; *x86_64* | *amd64*) @@ -7134,171 +8271,6 @@ # End - Single Precision option handling # ################################################################################ -# Fast RSA using Intel IPP -ippdir="${srcdir}/IPP" -ipplib="lib" # if autoconf guesses 32bit system changes lib directory -fastRSA_found=no -abs_path=`pwd` - -# set up variables used -IPPLIBS= -IPPHEADERS= -IPPLINK= - -AC_ARG_ENABLE([fast-rsa], - [AS_HELP_STRING([--enable-fast-rsa],[Enable RSA using Intel IPP (default: disabled)])], - [ ENABLED_FAST_RSA=$enableval ], - [ ENABLED_FAST_RSA=no ], - ) - -# Fast RSA does not support RSA-PSS -if test "$ENABLED_RSAPSS" = "yes"; then - ENABLED_FAST_RSA=no -fi - -if test "$ENABLED_USER_RSA" = "no" && test "$ENABLED_FIPS" = "no"; then - - if test "$ac_cv_sizeof_long" = "4" && test "$ac_cv_sizeof_long_long" = "8"; then - ipplib="lib_32" # 32 bit OS detected - fi - -# Use static IPP Libraries -if test "$enable_shared" = "no" && test "$ENABLED_FAST_RSA" = "yes"; then - case $host_os in - *darwin*) - ipplib="$ipplib/mac_static" - AC_MSG_ERROR([Issue with static linking to libippcp.a on Mac. - Dynamic IPP libraries supported on Mac]) - break;; - - *linux*) - ipplib="$ipplib/linux_static" - break;; - *) - ENABLED_FAST_RSA=no - esac - - if test -e $srcdir/IPP/$ipplib/libippcore.a && test -e $srcdir/IPP/$ipplib/libippcp.a - then - : - else - ENABLED_FAST_RSA=no - fi - AC_CHECK_HEADERS([IPP/include/ipp.h IPP/include/ippcp.h], [AM_CPPFLAGS="-I$srcdir/IPP/include $AM_CPPFLAGS"], [ENABLED_FAST_RSA=no]) - LIB_STATIC_ADD="$srcdir/IPP/$ipplib/libippcp.a $srcdir/IPP/$ipplib/libippcore.a $LIB_STATIC_ADD" - if test "$ENABLED_FAST_RSA" = "no"; then - AC_MSG_ERROR([Could not find fast rsa libraries]) - fi -else - -# Check for and use bundled IPP libraries -if test "$ENABLED_FAST_RSA" = "yes"; then - AC_MSG_NOTICE([Using local IPP crypto library]) - - AC_CHECK_HEADER([$abs_path/IPP/include/ippcp.h], - [ - # build and default locations on linux and mac - STORE_LDFLAGS=${LDFLAGS} - STORE_CPPFLAGS=${CPPFLAGS} - - # using LDFLAGS instead of AM_ temporarily to test link to library - LDFLAGS="-L$ippdir/$ipplib -lippcp -lippcore" - CPPFLAGS="-I$ippdir/include" - AC_CHECK_HEADERS([ippcp.h], [AC_CHECK_LIB([ippcp], [ippsRSAEncrypt_PKCSv15], [fastRSA_found=yes], [fastRSA_found=no])], [fastRSA_found=no]) - name="$ippdir/$ipplib/libippcp" - case $host_os in - *darwin*) - # check file existence and conditionally set variables - if test -e $abs_path/IPP/$ipplib/libippcp.dylib - then - IPPLIBS="${name}.dylib ${name}-9.0.dylib ${name}e9-9.0.dylib ${name}g9-9.0.dylib ${name}h9-9.0.dylib ${name}k0-9.0.dylib ${name}l9-9.0.dylib ${name}n8-9.0.dylib ${name}p8-9.0.dylib ${name}s8-9.0.dylib ${name}y8-9.0.dylib IPP/lib/libippcore.dylib IPP/lib/libippcore-9.0.dylib" - IPPLINK="mkdir -p src/.libs && ln -f ${name}.dylib src/.libs/libippcp.dylib && ln -f ${srcdir}/${name}-9.0.dylib src/.libs/libippcp-9.0.dylib && ln -f ${srcdir}/${name}e9-9.0.dylib src/.libs/libippcpe9-9.0.dylib && ln -f ${srcdir}/${name}g9-9.0.dylib src/.libs/libippcpg9-9.0.dylib && ln -f ${srcdir}/${name}h9-9.0.dylib src/.libs/libippcph9-9.0.dylib && ln -f ${srcdir}/${name}k0-9.0.dylib src/.libs/libippcpk0-9.0.dylib && ln -f ${srcdir}/${name}l9-9.0.dylib src/.libs/libippcpl9-9.0.dylib && ln -f ${srcdir}/${name}n8-9.0.dylib src/.libs/libippcpn8-9.0.dylib && ln -f ${srcdir}/${name}p8-9.0.dylib src/.libs/libippcpp8-9.0.dylib && ln -f ${srcdir}/${name}s8-9.0.dylib src/.libs/libippcps8-9.0.dylib && ln -f ${srcdir}/${name}y8-9.0.dylib src/.libs/libippcpy8-9.0.dylib && ln -f ${srcdir}/IPP/lib/libippcore.dylib src/.libs/libippcore.dylib && ln -f ${srcdir}/IPP/lib/libippcore-9.0.dylib src/.libs/libippcore-9.0.dylib" - else - fastRSA_found=no - fi - break;; - - *linux*) - # check file existence and conditionally set variables - if test -e $abs_path/IPP/$ipplib/libippcp.so.9.0 - then - if test "$ac_cv_sizeof_long" = "4" && test "$ac_cv_sizeof_long_long" = "8"; then - IPPLIBS="${name}.so.9.0 ${name}g9.so.9.0 ${name}h9.so.9.0 ${name}p8.so.9.0 ${name}px.so.9.0 ${name}s8.so.9.0 ${name}.so ${name}w7.so.9.0 IPP/$ipplib/libippcore.so IPP/$ipplib/libippcore.so.9.0" - IPPLINK="mkdir -p src/.libs && ln -f ${name}.so.9.0 src/.libs/libippcp.so.9.0 && ln -f ${name}g9.so.9.0 src/.libs/libippcpg9.so.9.0 && ln -f ${name}h9.so.9.0 src/.libs/libippcph9.so.9.0 && ln -f ${name}p8.so.9.0 src/.libs/libippcpp8.so.9.0 && ln -f ${name}px.so.9.0 src/.libs/libippcppx.so.9.0 && ln -f ${name}s8.so.9.0 src/.libs/libippcps8.so.9.0 && ln -f ${name}.so src/.libs/libippcp.so && ln -f ${name}w7.so.9.0 src/.libs/libippcpw7.so.9.0 && ln -f IPP/$ipplib/libippcore.so src/.libs/libippcore.so && ln -f IPP/$ipplib/libippcore.so.9.0 src/.libs/libippcore.so.9.0" - else - IPPLIBS="${name}.so.9.0 ${name}e9.so.9.0 ${name}k0.so.9.0 ${name}l9.so.9.0 ${name}m7.so.9.0 ${name}mx.so.9.0 ${name}.so ${name}n8.so.9.0 ${name}y8.so.9.0 IPP/lib/libippcore.so IPP/lib/libippcore.so.9.0" - IPPLINK="mkdir -p src/.libs && ln -f ${name}.so.9.0 src/.libs/libippcp.so.9.0 && ln -f ${name}e9.so.9.0 src/.libs/libippcpe9.so.9.0 && ln -f ${name}k0.so.9.0 src/.libs/libippcpk0.so.9.0 && ln -f ${name}l9.so.9.0 src/.libs/libippcpl9.so.9.0 && ln -f ${name}m7.so.9.0 src/.libs/libippcpm7.so.9.0 && ln -f ${name}mx.so.9.0 src/.libs/libippcpmx.so.9.0 && ln -f ${name}.so src/.libs/libippcp.so && ln -f ${name}n8.so.9.0 src/.libs/libippcpn8.so.9.0 && ln -f ${name}y8.so.9.0 src/.libs/libippcpy8.so.9.0 && ln -f IPP/lib/libippcore.so src/.libs/libippcore.so && ln -f IPP/lib/libippcore.so.9.0 src/.libs/libippcore.so.9.0" - fi - else - fastRSA_found=no - fi - break;; - *) - fastRSA_found=no - esac - - if test "$fastRSA_found" = "yes"; then - # was successful so add tested LDFLAGS to AM_ flags - AM_LDFLAGS="${AM_LDFLAGS} ${LDFLAGS}" - AM_CPPFLAGS="${AM_CPPFLAGS} ${CPPFLAGS}" - IPPHEADERS="${srcdir}/IPP/include/*.h" - fi - - # restore LDFLAGS to user set - LDFLAGS=${STORE_LDFLAGS} - CPPFLAGS=${STORE_CPPFLAGS} - ], [fastRSA_found=no]) -fi - -# Don't cache the result so it can be checked -AS_UNSET([ac_cv_header_ippcp_h]) -AS_UNSET([ac_cv_header_ipp_h]) -AS_UNSET([ac_cv_lib_ippcp_ippsRSAEncrypt_PKCSv15]); - -# Check link and see if user has pre-existing IPP Libraries if not using local -if test "$ENABLED_FAST_RSA" = "yes" && test "$fastRSA_found" = "no"; then - AC_MSG_NOTICE([Checking if IPP crypto library installed]) - AC_CHECK_HEADER([ippcp.h], [AC_CHECK_LIB([ippcp], [ippsRSAEncrypt_PKCSv15], - [ - fastRSA_found=yes - AM_LDFLAGS="${AM_LDFLAGS} -lippcore -lippcp" - ], [ fastRSA_found=no]) - ], [fastRSA_found=no]) - - # Error out on not finding libraries - if test "$fastRSA_found" = "no"; then - AC_MSG_ERROR([Could not find fast rsa libraries]) - fi -fi -fi # end of if for shared library -else # if user rsa is set than do not use fast rsa option - if test "$ENABLED_FAST_RSA" = "yes"; then - AC_MSG_ERROR([Could not use fast rsa libraries with user crypto or fips]) - fi -fi # end of if for user rsa crypto or fips - -# End result of checking for IPP Libraries -AC_MSG_CHECKING([for fast RSA]) -if test "$ENABLED_FAST_RSA" = "yes"; then - AM_CFLAGS="$AM_CFLAGS -DHAVE_FAST_RSA -DHAVE_USER_RSA" - # add in user crypto header that uses Intel IPP - AM_CPPFLAGS="$AM_CPPFLAGS -I$srcdir/wolfcrypt/user-crypto/include" - if test "$enable_shared" = "yes"; then - LIBS="$LIBS -lippcore -lippcp" - LIB_ADD="-lippcp -lippcore $LIB_ADD" - else - LIB_ADD="$srcdir/IPP/$ipplib/libippcp.a $srcdir/IPP/$ipplib/libippcore.a $LIB_ADD" - fi - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) -fi - -AC_SUBST([IPPLIBS]) -AC_SUBST([IPPHEADERS]) -AC_SUBST([IPPLINK]) - - # static memory use AC_ARG_ENABLE([staticmemory], [AS_HELP_STRING([--enable-staticmemory],[Enable static memory use (default: disabled)])], @@ -7306,6 +8278,27 @@ [ ENABLED_STATICMEMORY=no ] ) +for v in `echo $ENABLED_STATICMEMORY | tr "," " "` +do + case $v in + yes) + ;; + no) + ;; + small|lean) + ENABLED_STATICMEMORY=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_STATIC_MEMORY_LEAN" + ;; + debug) + ENABLED_STATICMEMORY=yes + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK" + ;; + *) + AC_MSG_ERROR([Invalid choice for staticmemory.]) + break;; + esac +done + if test "x$ENABLED_STATICMEMORY" = "xyes" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_STATIC_MEMORY" @@ -7358,6 +8351,30 @@ AC_MSG_ERROR([please use --with-libz if enabling mcapi.]) fi + +# cryptodev is old name, replaced with cryptocb +AC_ARG_ENABLE([cryptodev], + [AS_HELP_STRING([--enable-cryptodev],[DEPRECATED, use cryptocb instead])], + [ ENABLED_CRYPTOCB=$enableval ],[ ENABLED_CRYPTOCB=no ]) + +# Support for crypto callbacks +AC_ARG_ENABLE([cryptocb], + [AS_HELP_STRING([--enable-cryptocb],[Enable crypto callbacks (default: disabled)])], + [ ENABLED_CRYPTOCB=$enableval ], + [ ENABLED_CRYPTOCB=no ] + ) + +if test "x$ENABLED_PKCS11" = "xyes" || test "x$ENABLED_WOLFTPM" = "xyes" || test "$ENABLED_CAAM" != "no" +then + ENABLED_CRYPTOCB=yes +fi +if test "$ENABLED_CRYPTOCB" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLF_CRYPTO_CB" +fi + + + # Asynchronous Crypto AC_ARG_ENABLE([asynccrypt], [AS_HELP_STRING([--enable-asynccrypt],[Enable Asynchronous Crypto (default: disabled)])], @@ -7380,6 +8397,7 @@ if test "$ENABLED_ASYNCCRYPT" = "yes" then + AC_MSG_NOTICE([Enabling asynchronous support]) if ! test -f ${srcdir}/wolfcrypt/src/async.c || ! test -f ${srcdir}/wolfssl/wolfcrypt/async.h then AC_MSG_ERROR([--enable-asynccrypt requested, but WOLFSSL_ASYNC_CRYPT source files are missing.]) @@ -7389,15 +8407,14 @@ # If no async backend (hardware or software) has been explicitly enabled, # use the software backend for testing. - if test "x$ENABLED_CAVIUM" = "xno" && test "x$ENABLED_INTEL_QA" = "xno" && - test "x$ENABLED_ASYNCCRYPT_SW" = "xno" + if test "x$ENABLED_CAVIUM" != "xyes" && test "x$ENABLED_INTEL_QA" != "xyes" && test "x$ENABLED_CRYPTOCB" != "xyes" && test "x$ENABLED_PKCALLBACKS" != "xyes" && test "x$ENABLED_ASYNCCRYPT_SW" != "xyes" then - # Async threading is Linux specific + AC_MSG_NOTICE([Enabling asynchronous software simulator]) AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ASYNC_CRYPT_SW" + ENABLED_ASYNCCRYPT_SW=yes fi fi - # check for async if using Intel QuckAssist or Cavium if test "x$ENABLED_INTEL_QA" = "xyes" || test "x$ENABLED_CAVIUM" = "xyes" ; then if test "x$ENABLED_ASYNCCRYPT" = "xno" ; then @@ -7405,8 +8422,7 @@ fi fi - -# Asynchronous threading +# Asynchronous threading (Linux specific) AC_ARG_ENABLE([asyncthreads], [AS_HELP_STRING([--enable-asyncthreads],[Enable Asynchronous Threading (default: enabled)])], [ ENABLED_ASYNCTHREADS=$enableval ], @@ -7429,25 +8445,16 @@ fi -# cryptodev is old name, replaced with cryptocb -AC_ARG_ENABLE([cryptodev], - [AS_HELP_STRING([--enable-cryptodev],[DEPRECATED, use cryptocb instead])], - [ ENABLED_CRYPTOCB=$enableval ],[ ENABLED_CRYPTOCB=no ]) - -# Support for crypto callbacks -AC_ARG_ENABLE([cryptocb], - [AS_HELP_STRING([--enable-cryptocb],[Enable crypto callbacks (default: disabled)])], - [ ENABLED_CRYPTOCB=$enableval ], - [ ENABLED_CRYPTOCB=no ] +# Support for autosar shim +AC_ARG_ENABLE([autosar], + [AS_HELP_STRING([--enable-autosar],[Enable AutoSAR support (default: disabled)])], + [ ENABLED_AUTOSAR=$enableval ], + [ ENABLED_AUTOSAR=no ] ) -if test "x$ENABLED_PKCS11" = "xyes" || test "x$ENABLED_WOLFTPM" = "xyes" || test "$ENABLED_CAAM" != "no" +if test "$ENABLED_AUTOSAR" = "yes" then - ENABLED_CRYPTOCB=yes -fi -if test "$ENABLED_CRYPTOCB" = "yes" -then - AM_CFLAGS="$AM_CFLAGS -DWOLF_CRYPTO_CB" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AUTOSAR" fi @@ -7470,14 +8477,8 @@ fi -# AES key wrap -AC_ARG_ENABLE([aeskeywrap], - [AS_HELP_STRING([--enable-aeskeywrap],[Enable AES key wrap support (default: disabled)])], - [ ENABLED_AESKEYWRAP=$enableval ], - [ ENABLED_AESKEYWRAP=no ] - ) - -if test "$ENABLED_WPAS" != "no" && test "$ENABLED_FIPS" = "no" +if test "$ENABLED_WPAS" != "no" && + ( test "$ENABLED_FIPS" = "no" || test "x$FIPS_VERSION" = "xv6" ) then ENABLED_AESKEYWRAP="yes" fi @@ -7532,13 +8533,13 @@ AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_HASH_FLAGS" fi -# Support for enabling setting default DH parameters in +# Support for enabling setting default DH parameters in TLS AC_ARG_ENABLE([defaultdhparams], - [AS_HELP_STRING([--enable-dhdefaultparams],[Enables option for default dh parameters (default: disabled)])], + [AS_HELP_STRING([--enable-defaultdhparams],[Enables option for default dh parameters (default: disabled)])], [ ENABLED_DHDEFAULTPARAMS=$enableval ], - [ ENABLED_DHDEFAULTPARAMS=no ] + [ ENABLED_DHDEFAULTPARAMS=yes ] ) -if test "$ENABLED_DHDEFAULTPARAMS" = "yes" || test "$ENABLED_QT" = "no" +if test "x$ENABLED_DH" = "xyes" && test "x$ENABLED_DHDEFAULTPARAMS" = "xyes" && test "x$ENABLED_QT" != "xyes" then ENABLED_DHDEFAULTPARAMS=yes AM_CFLAGS="$AM_CFLAGS -DHAVE_DH_DEFAULT_PARAMS" @@ -7564,7 +8565,7 @@ AC_ARG_WITH([max-ecc-bits], [AS_HELP_STRING([--with-max-ecc-bits=number],[number of bits to support for ECC algorithms])], [WITH_MAX_ECC_BITS=$withval], - [WITH_MAX_ECC_BITS="$DEFAULT_MAX_ECC_BITS"]) + ) if test -n "$WITH_MAX_ECC_BITS"; then if test "$WITH_MAX_ECC_BITS" -lt 112 -o "$WITH_MAX_ECC_BITS" -gt 1024; then @@ -7586,6 +8587,47 @@ fi fi +AC_ARG_ENABLE([linuxkm-lkcapi-register], + [AS_HELP_STRING([--enable-linuxkm-lkcapi-register],[Register wolfCrypt implementations with the Linux Kernel Crypto API backplane. Possible values are "none", "all", "cbc(aes)", "cfb(aes)", "gcm(aes)", and "xts(aes)", or a comma-separate combination. (default: none)])], + [ENABLED_LINUXKM_LKCAPI_REGISTER=$enableval], + [ENABLED_LINUXKM_LKCAPI_REGISTER=none] + ) +if test "$ENABLED_LINUXKM_LKCAPI_REGISTER" != "none" +then + AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER" + + if test "$ENABLED_AESGCM" != "no" && test "$ENABLED_AESGCM_STREAM" = "no" && test "$ENABLED_ARMASM" = "no" && test "$ENABLED_RISCV_ASM" = "no" && test "$ENABLED_FIPS" = "no"; then + ENABLED_AESGCM_STREAM=yes + fi + + if test "$ENABLED_LINUXKM_LKCAPI_REGISTER" = "yes" + then + ENABLED_LINUXKM_LKCAPI_REGISTER=all + fi + + for lkcapi_alg in $(echo "$ENABLED_LINUXKM_LKCAPI_REGISTER" | tr ',' ' ') + do + case "$lkcapi_alg" in + all) test "$ENABLED_EXPERIMENTAL" = "yes" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: requires --enable-experimental.]) + AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_ALL" ;; + 'cbc(aes)') test "$ENABLED_AESCBC" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: AES-CBC implementation not enabled.]) + test "$ENABLED_EXPERIMENTAL" = "yes" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: requires --enable-experimental.]) + AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_AESCBC" ;; + 'cfb(aes)') test "$ENABLED_AESCFB" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: AES-CFB implementation not enabled.]) + test "$ENABLED_EXPERIMENTAL" = "yes" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: requires --enable-experimental.]) + AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_AESCFB" ;; + 'gcm(aes)') test "$ENABLED_AESGCM" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: AES-GCM implementation not enabled.]) + test "$ENABLED_AESGCM_STREAM" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: --enable-aesgcm-stream is required for LKCAPI.]) + test "$ENABLED_EXPERIMENTAL" = "yes" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: requires --enable-experimental.]) + AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_AESGCM" ;; + 'xts(aes)') test "$ENABLED_AESXTS" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: AES-XTS implementation not enabled.]) + test "$ENABLED_AESXTS_STREAM" != "no" || AC_MSG_ERROR([linuxkm-lkcapi-register ${lkcapi_alg}: --enable-aesxts-stream is required for LKCAPI.]) + AM_CFLAGS="$AM_CFLAGS -DLINUXKM_LKCAPI_REGISTER_AESXTS" ;; + *) AC_MSG_ERROR([Unsupported LKCAPI algorithm "$lkcapi_alg".]) ;; + esac + done +fi + # Library Suffix LIBSUFFIX="" AC_ARG_WITH([libsuffix], @@ -7659,22 +8701,52 @@ [ ENABLED_SYS_CA_CERTS=yes ] ) +AC_ARG_ENABLE([dual-alg-certs], + [AS_HELP_STRING([--enable-dual-alg-certs],[Enable support for dual key/signature certificates in TLS 1.3 as defined in X9.146 (requires --enable-experimental) (default: disabled)])], + [ ENABLED_DUAL_ALG_CERTS=$enableval ], + [ ENABLED_DUAL_ALG_CERTS=no ] + ) + +AS_IF([ test "$ENABLED_DUAL_ALG_CERTS" != "no" && test "$ENABLED_EXPERIMENTAL" != "yes" ],[ AC_MSG_ERROR([dual-alg-certs requires --enable-experimental.]) ]) + +# Adds functionality to support Raw Public Key (RPK) RFC7250 +AC_ARG_ENABLE([rpk], + [AS_HELP_STRING([--enable-rpk],[Enable support for Raw Public Key (RPK) RFC7250 (default: disabled)])], + [ ENABLED_RPK=$enableval ], + [ ENABLED_RPK=no ] + ) + # check if should run the trusted peer certs test # (for now checking both C_FLAGS and C_EXTRA_FLAGS) AS_CASE(["$CFLAGS $CPPFLAGS"],[*'WOLFSSL_TRUST_PEER_CERT'*],[ENABLED_TRUSTED_PEER_CERT=yes]) +# Allows disabling the OPENSSL_COMPATIBLE_DEFAULTS macro +AC_ARG_ENABLE([openssl-compatible-defaults], + [AS_HELP_STRING([--disable-openssl-compatible-defaults],[Disable OpenSSL compatible defaults when enabled by other options (default: enabled)])], + [ ENABLED_OPENSSL_COMPATIBLE_DEFAULTS=$enableval ], + [ ENABLED_OPENSSL_COMPATIBLE_DEFAULTS=yes ] + ) AS_CASE(["$CFLAGS $CPPFLAGS $AM_CFLAGS"],[*'OPENSSL_COMPATIBLE_DEFAULTS'*], - [ENABLED_OPENSSL_COMPATIBLE_DEFAULTS=yes]) -if test "x$ENABLED_OPENSSL_COMPATIBLE_DEFAULTS" = "xyes" + [FOUND_OPENSSL_COMPATIBLE_DEFAULTS=yes]) +if test "x$FOUND_OPENSSL_COMPATIBLE_DEFAULTS" = "xyes" then - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_TRUST_PEER_CERT" - AM_CFLAGS="$AM_CFLAGS -DNO_SESSION_CACHE_REF" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALT_CERT_CHAINS" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_PRIORITIZE_PSK" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CHECK_ALERT_ON_ERR" - ENABLED_TRUSTED_PEER_CERT=yes + if test "x$ENABLED_OPENSSL_COMPATIBLE_DEFAULTS" = "xyes" + then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_TRUST_PEER_CERT" + AM_CFLAGS="$AM_CFLAGS -DNO_SESSION_CACHE_REF" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALT_CERT_CHAINS" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_PRIORITIZE_PSK" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CHECK_ALERT_ON_ERR" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_TICKET_HAVE_ID" + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_OCSP_ISSUER_CHECK" + ENABLED_TRUSTED_PEER_CERT=yes + else + CFLAGS=$(printf "%s" "$CFLAGS" | sed 's/-DOPENSSL_COMPATIBLE_DEFAULTS//g') + CPPFLAGS=$(printf "%s" "$CPPFLAGS" | sed 's/-DOPENSSL_COMPATIBLE_DEFAULTS//g') + AM_CFLAGS=$(printf "%s" "$AM_CFLAGS" | sed 's/-DOPENSSL_COMPATIBLE_DEFAULTS//g') + fi fi # determine if we have key validation mechanism @@ -7739,16 +8811,30 @@ case $host_os in *darwin*) - AC_CHECK_HEADERS([Security/SecTrustSettings.h], + # Headers used for MacOS default system CA certs behavior. Only MacOS SDK will have this header + AC_CHECK_HEADERS([Security/SecTrustSettings.h]) + # Headers used for Apple native cert validation. All device SDKs should have these headers + AC_CHECK_HEADERS([Security/SecCertificate.h]) + AC_CHECK_HEADERS([Security/SecTrust.h]) + AC_CHECK_HEADERS([Security/SecPolicy.h]) + # Either Security/SecTrustSettings (for MacOS cert loading), or the + # trio of Security/SecCertificate.h, Security/SecTrust.h, and + # Security/SecPolicy.h (for native trust APIs on other apple devices) + # must be present. Default to SecTrustSettings method on MacOS. + AS_IF([test "$ac_cv_header_Security_SecTrustSettings_h" = "yes" \ + || (test "$ac_cv_header_Security_SecCertificate_h" = "yes" \ + && test "$ac_cv_header_Security_SecTrust_h" = "yes" \ + && test "$ac_cv_header_Security_SecPolicy_h" = "yes")], + [ + LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Security" + AS_IF([test "$ac_cv_header_Security_SecTrustSettings_h" != "yes"], [ - # For Mac we need these frameworks to load system CA certs - LDFLAGS="$LDFLAGS -framework CoreFoundation -framework Security" - ], - [ - AC_MSG_NOTICE([Can't enable system CA certs without Security/SecTrustSettings.h]) - ENABLED_SYS_CA_CERTS="no" - ] - ) + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_APPLE_NATIVE_CERT_VALIDATION" + ]) + ], + [ + AC_MSG_ERROR([Unable to find Apple Security.framework headers]) + ]) ;; esac fi @@ -7815,6 +8901,9 @@ # Uses alt name ENABLED_ALTNAMES="yes" + + AM_CFLAGS="$AM_CFLAGS -DHAVE_OID_ENCODING -DWOLFSSL_NO_ASN_STRICT" + fi if test "$ENABLED_STRONGSWAN" = "yes"; then @@ -7837,12 +8926,12 @@ test "$ENABLED_LIBWEBSOCKETS" = "yes" || \ test "x$ENABLED_LIGHTY" = "xyes" || test "$ENABLED_LIBSSH2" = "yes" || \ test "x$ENABLED_NTP" = "xyes" || test "$ENABLED_RSYSLOG" = "yes" || \ - test "$ENABLED_OPENLDAP" = "yes" + test "$ENABLED_OPENLDAP" = "yes" || test "$ENABLED_HITCH" = "yes" then ENABLED_OPENSSLEXTRA="yes" fi -if test "$ENABLED_ED25519" != "no" && test "$ENABLED_32BIT" = "no" +if test "$ENABLED_ED25519" != "no" then if test "$ENABLED_ED25519" = "small" || test "$ENABLED_LOWRESOURCE" = "yes" then @@ -7992,6 +9081,12 @@ AS_IF([test "x$ENABLED_SYS_CA_CERTS" = "xyes"], [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SYS_CA_CERTS"]) +AS_IF([test "x$ENABLED_DUAL_ALG_CERTS" = "xyes"], + [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_DUAL_ALG_CERTS"]) + +AS_IF([test "x$ENABLED_RPK" = "xyes"], + [AM_CFLAGS="$AM_CFLAGS -DHAVE_RPK"]) + AS_IF([test "x$ENABLED_ALTNAMES" = "xyes"], [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ALT_NAMES"]) @@ -8007,8 +9102,10 @@ AS_IF([test "x$ENABLED_CERTEXT" = "xyes"], [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CERT_EXT"]) -AS_IF([test "x$ENABLED_ED25519" = "xyes" && test "x$ENABLED_32BIT" = "xno"], +AS_IF([test "x$ENABLED_ED25519" = "xyes"], [AM_CFLAGS="$AM_CFLAGS -DHAVE_ED25519"]) +AS_IF([test "x$ENABLED_ED25519" = "xyes"], + [AM_CCASFLAGS="$AM_CCASFLAGS -DHAVE_ED25519"]) AS_IF([test "x$ENABLED_ED25519_SMALL" = "xyes"], [AM_CFLAGS="$AM_CFLAGS -DED25519_SMALL"]) @@ -8045,6 +9142,9 @@ AM_CFLAGS="$AM_CFLAGS -DNO_MD5 -DNO_OLD_TLS" fi +AS_IF([test "x$ENABLED_AESBS" = "xyes" && test "x$ENABLED_ARMASM" = "xyes"], + [AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_DIRECT"]) + if test "$ENABLED_HMAC" = "no" then AM_CFLAGS="$AM_CFLAGS -DNO_HMAC" @@ -8052,18 +9152,13 @@ if test "$ENABLED_OPENSSLEXTRA" = "yes" && test "x$ENABLED_OPENSSLCOEXIST" = "xno" then - AM_CFLAGS="$AM_CFLAGS -DOPENSSL_EXTRA -DWOLFSSL_ALWAYS_VERIFY_CB" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_VERIFY_CB_ALL_CERTS -DWOLFSSL_EXTRA_ALERTS" - AM_CFLAGS="$AM_CFLAGS -DHAVE_EXT_CACHE -DWOLFSSL_FORCE_CACHE_ON_TICKET" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AKID_NAME -DHAVE_CTS" + AM_CFLAGS="$AM_CFLAGS -DOPENSSL_EXTRA" fi if test "$ENABLED_OPENSSLEXTRA" = "x509small" then AC_MSG_NOTICE([Enabling only a subset of X509 opensslextra]) AM_CFLAGS="$AM_CFLAGS -DOPENSSL_EXTRA_X509_SMALL" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_EKU_OID -DWOLFSSL_MULTI_ATTRIB" - AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_NO_OPENSSL_RAND_CB" fi if test "$ENABLED_WOLFSCEP" = "yes" @@ -8124,6 +9219,14 @@ fi fi +if test "x$ENABLED_DES3_TLS_SUITES" = "xno" +then + AM_CFLAGS="$AM_CFLAGS -DNO_DES3_TLS_SUITES" +else + AS_IF([test "x$ENABLED_DES3" = "xno"], + [AC_MSG_ERROR([DES3 TLS suites require DES3])]) +fi + if test "$ENABLED_AESGCM" != "no" then if test "$ENABLED_AESGCM" = "word" @@ -8168,6 +9271,17 @@ fi fi +if test "$ENABLED_AESXTS_STREAM" != "no" +then + if test "$ENABLED_AESXTS" = "no" + then + AC_MSG_ERROR([AES-XTS streaming enabled but AES-XTS is disabled]) + else + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AESXTS_STREAM" + AM_CCASFLAGS="$AM_CCASFLAGS -DWOLFSSL_AESXTS_STREAM" + fi +fi + if test "$ENABLED_IOTSAFE" != "no" then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_IOTSAFE" @@ -8262,6 +9376,11 @@ fi fi +if test "$ENABLED_WOLFSSH" = "yes" && test "$ENABLED_HMAC" = "no" +then + AC_MSG_ERROR([WOLFSSH requires HMAC.]) +fi + AS_IF([test "x$ENABLED_WOLFSSH" = "xyes"],[AM_CPPFLAGS="$AM_CPPFLAGS -DWOLFSSL_WOLFSSH"]) # only allow secure renegotiation info with TLSV12 and ASN @@ -8317,7 +9436,10 @@ # For distro disable custom build options that interfere with symbol generation if test "$GCC" = "yes" && test "$ENABLED_DISTRO" = "no" then - AM_CFLAGS="$AM_CFLAGS -Wall -Wno-unused" + if test "$ENABLED_CUDA" != "yes" + then + AM_CFLAGS="$AM_CFLAGS -Wall -Wno-unused" + fi if test "$ax_enable_debug" = "no" then AS_IF([test "x$ENABLED_OPTFLAGS" = "xyes"], [ @@ -8424,9 +9546,6 @@ if test "$ENABLED_FASTMATH" = "yes"; then AC_MSG_ERROR([--enable-fastmath is incompatible with --enable-linuxkm (exceeds stack limit).]) fi - if test "$ENABLED_FAST_RSA" = "yes"; then - AC_MSG_ERROR([--enable-fastrsa is incompatible with --enable-linuxkm.]) - fi if test "$ENABLED_LIBZ_RSA" = "yes"; then AC_MSG_ERROR([--with-libz is incompatible with --enable-linuxkm.]) fi @@ -8473,9 +9592,12 @@ AM_CONDITIONAL([BUILD_SNIFFTEST],[ test "x$ENABLED_SNIFFTEST" = "xyes"]) AM_CONDITIONAL([BUILD_AESGCM],[test "x$ENABLED_AESGCM" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_AESCCM],[test "x$ENABLED_AESCCM" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_AESXTS],[test "x$ENABLED_AESXTS" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_ARMASM],[test "x$ENABLED_ARMASM" = "xyes"]) AM_CONDITIONAL([BUILD_ARMASM_INLINE],[test "x$ENABLED_ARMASM_INLINE" = "xyes"]) AM_CONDITIONAL([BUILD_ARMASM_CRYPTO],[test "x$ENABLED_ARMASM_CRYPTO" = "xyes"]) +AM_CONDITIONAL([BUILD_ARMASM_NEON],[test "x$ENABLED_ARMASM_NEON" = "xyes"]) +AM_CONDITIONAL([BUILD_RISCV_ASM],[test "x$ENABLED_RISCV_ASM" = "xyes"]) AM_CONDITIONAL([BUILD_XILINX],[test "x$ENABLED_XILINX" = "xyes"]) AM_CONDITIONAL([BUILD_AESNI],[test "x$ENABLED_AESNI" = "xyes"]) AM_CONDITIONAL([BUILD_INTELASM],[test "x$ENABLED_INTELASM" = "xyes"]) @@ -8495,7 +9617,8 @@ AM_CONDITIONAL([BUILD_ED25519_SMALL],[test "x$ENABLED_ED25519_SMALL" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_FEMATH], [test "x$ENABLED_FEMATH" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_GEMATH], [test "x$ENABLED_GEMATH" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) -AM_CONDITIONAL([BUILD_CURVE25519],[test "x$ENABLED_CURVE25519" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_CURVE25519],[test "$ENABLED_CURVE25519" != "no" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_CURVE25519_INTELASM],[test "$ENABLED_CURVE25519" != "noasm" && test "$ENABLED_INTELASM" = "yes"]) AM_CONDITIONAL([BUILD_CURVE25519_SMALL],[test "x$ENABLED_CURVE25519_SMALL" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_ED448],[test "x$ENABLED_ED448" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_ED448_SMALL],[test "x$ENABLED_ED448_SMALL" = "xyes"]) @@ -8503,7 +9626,10 @@ AM_CONDITIONAL([BUILD_GE448], [test "x$ENABLED_GE448" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_CURVE448],[test "x$ENABLED_CURVE448" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_CURVE448_SMALL],[test "x$ENABLED_CURVE448_SMALL" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_WC_LMS],[test "x$ENABLED_WC_LMS" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_WC_XMSS],[test "x$ENABLED_WC_XMSS" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_WC_KYBER],[test "x$ENABLED_WC_KYBER" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_DILITHIUM],[test "x$ENABLED_DILITHIUM" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_ECCSI],[test "x$ENABLED_ECCSI" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_SAKKE],[test "x$ENABLED_SAKKE" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_MEMORY],[test "x$ENABLED_MEMORY" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) @@ -8521,6 +9647,7 @@ AM_CONDITIONAL([BUILD_FIPS_V2],[test "$HAVE_FIPS_VERSION" = 2 && test "$HAVE_FIPS_VERSION_MINOR" = 0]) AM_CONDITIONAL([BUILD_FIPS_RAND],[test "$HAVE_FIPS_VERSION" = 2 && test "$HAVE_FIPS_VERSION_MINOR" = 1]) AM_CONDITIONAL([BUILD_FIPS_V5],[test "$HAVE_FIPS_VERSION" = 5]) +AM_CONDITIONAL([BUILD_FIPS_V6],[test $HAVE_FIPS_VERSION -ge 6]) AM_CONDITIONAL([BUILD_FIPS_CURRENT],[test "$HAVE_FIPS_VERSION" -ge 2 ]) # BUILD_FIPS_CURRENT is for builds after cert 2425. AM_CONDITIONAL([BUILD_SIPHASH],[test "x$ENABLED_SIPHASH" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) @@ -8531,14 +9658,17 @@ AM_CONDITIONAL([BUILD_POLY1305],[test "x$ENABLED_POLY1305" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_CHACHA],[test "x$ENABLED_CHACHA" = "xyes" || test "x$ENABLED_CHACHA" = "xnoasm" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_XCHACHA],[test "x$ENABLED_XCHACHA" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_SM2],[test "x$ENABLED_SM2" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_SM3],[test "x$ENABLED_SM3" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) +AM_CONDITIONAL([BUILD_SM4],[test "x$ENABLED_SM4" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_INLINE],[test "x$ENABLED_INLINE" = "xyes"]) AM_CONDITIONAL([BUILD_OCSP],[test "x$ENABLED_OCSP" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_OCSP_STAPLING],[test "x$ENABLED_CERTIFICATE_STATUS_REQUEST" = "xyes"]) AM_CONDITIONAL([BUILD_OCSP_STAPLING_V2],[test "x$ENABLED_CERTIFICATE_STATUS_REQUEST_V2" = "xyes"]) AM_CONDITIONAL([BUILD_CRL],[test "x$ENABLED_CRL" != "xno" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_CRL_MONITOR],[test "x$ENABLED_CRL_MONITOR" = "xyes"]) -AM_CONDITIONAL([BUILD_USER_RSA],[test "x$ENABLED_USER_RSA" = "xyes"] ) -AM_CONDITIONAL([BUILD_USER_CRYPTO],[test "x$ENABLED_USER_CRYPTO" = "xyes"]) +AM_CONDITIONAL([BUILD_LIBLMS],[test "x$ENABLED_LIBLMS" = "xyes"]) +AM_CONDITIONAL([BUILD_LIBXMSS],[test "x$ENABLED_LIBXMSS" = "xyes"]) AM_CONDITIONAL([BUILD_LIBOQS],[test "x$ENABLED_LIBOQS" = "xyes"]) AM_CONDITIONAL([BUILD_WNR],[test "x$ENABLED_WNR" = "xyes"]) AM_CONDITIONAL([BUILD_SRP],[test "x$ENABLED_SRP" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) @@ -8582,7 +9712,6 @@ AM_COND_IF([BUILD_SP], [INCLUDE_SP_INT="yes"]) AM_COND_IF([BUILD_SP_INT], [INCLUDE_SP_INT="yes"]) AC_SUBST([INCLUDE_SP_INT]) -AM_CONDITIONAL([BUILD_FAST_RSA],[test "x$ENABLED_FAST_RSA" = "xyes"]) AM_CONDITIONAL([BUILD_MCAPI],[test "x$ENABLED_MCAPI" = "xyes"]) AM_CONDITIONAL([BUILD_ASYNCCRYPT],[test "x$ENABLED_ASYNCCRYPT" = "xyes"]) AM_CONDITIONAL([BUILD_WOLFEVENT],[test "x$ENABLED_ASYNCCRYPT" = "xyes"]) @@ -8598,6 +9727,7 @@ AM_CONDITIONAL([BUILD_NO_LIBRARY],[test "$ENABLED_NO_LIBRARY" = "yes"]) AM_CONDITIONAL([BUILD_BENCHMARK],[test "$ENABLED_BENCHMARK" = "yes"]) AM_CONDITIONAL([BUILD_RC2],[test "x$ENABLED_RC2" = "xyes"]) +AM_CONDITIONAL([BUILD_CUDA],[test "x$ENABLED_CUDA" = "xyes"]) AM_CONDITIONAL([BUILD_CAAM],[test "x$ENABLED_CAAM" != "xno"]) AM_CONDITIONAL([BUILD_QNXCAAM],[test "x$ENABLED_CAAM_QNX" = "xyes"]) AM_CONDITIONAL([BUILD_IOTSAFE],[test "x$ENABLED_IOTSAFE" = "xyes"]) @@ -8614,6 +9744,9 @@ AM_CONDITIONAL([BUILD_HPKE],[test "x$ENABLED_HPKE" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_DTLS],[test "x$ENABLED_DTLS" = "xyes" || test "x$ENABLED_USERSETTINGS" = "xyes"]) AM_CONDITIONAL([BUILD_MAXQ10XX],[test "x$ENABLED_MAXQ10XX" = "xyes"]) +AM_CONDITIONAL([BUILD_ARIA],[test "x$ENABLED_ARIA" = "xyes"]) +AM_CONDITIONAL([BUILD_XILINX],[test "x$ENABLED_XILINX" = "xyes"]) +AM_CONDITIONAL([BUILD_AUTOSAR],[test "x$ENABLED_AUTOSAR" = "xyes"]) if test "$ENABLED_REPRODUCIBLE_BUILD" != "yes" && (test "$ax_enable_debug" = "yes" || @@ -8642,14 +9775,16 @@ AC_SUBST([AM_CCASFLAGS]) AC_SUBST([LIB_ADD]) AC_SUBST([LIB_STATIC_ADD]) +AC_SUBST([LIBM]) # FINAL AC_CONFIG_FILES([stamp-h], [echo timestamp > stamp-h]) AC_CONFIG_FILES([Makefile wolfssl/version.h wolfssl/options.h - cyassl/options.h support/wolfssl.pc + debian/control + debian/changelog rpm/spec wolfcrypt/test/test_paths.h ]) @@ -8690,8 +9825,10 @@ if test "$ENABLED_REPRODUCIBLE_BUILD" != "yes" then - echo "#define LIBWOLFSSL_CONFIGURE_ARGS \"$ac_configure_args\"" | sed 's/\\/\\\\/g' > "${output_objdir}/.build_params" && - echo "#define LIBWOLFSSL_GLOBAL_CFLAGS \"$CPPFLAGS $AM_CPPFLAGS $CFLAGS $AM_CFLAGS\" LIBWOLFSSL_GLOBAL_EXTRA_CFLAGS" | sed 's/\\/\\\\/g' >> "${output_objdir}/.build_params" || + ESCAPED_ARGS=$(echo "$ac_configure_args" | sed 's/\\/\\\\/g;s/\"/\\\"/g') + ESCAPED_GLOBAL_CFLAGS=$(echo "$CPPFLAGS $AM_CPPFLAGS $CFLAGS $AM_CFLAGS" | sed 's/\\/\\\\/g;s/\"/\\\"/g') + echo "#define LIBWOLFSSL_CONFIGURE_ARGS \"$ESCAPED_ARGS\"" > "${output_objdir}/.build_params" && + echo "#define LIBWOLFSSL_GLOBAL_CFLAGS \"$ESCAPED_GLOBAL_CFLAGS\" LIBWOLFSSL_GLOBAL_EXTRA_CFLAGS" >> "${output_objdir}/.build_params" || AC_MSG_ERROR([Couldn't create ${output_objdir}/.build_params.]) else rm -f "${output_objdir}/.build_params" @@ -8707,7 +9844,7 @@ echo "/* wolfssl options.h" > $OPTION_FILE echo " * generated from configure options" >> $OPTION_FILE echo " *" >> $OPTION_FILE -echo " * Copyright (C) 2006-2023 wolfSSL Inc." >> $OPTION_FILE +echo " * Copyright (C) 2006-2024 wolfSSL Inc." >> $OPTION_FILE echo " *" >> $OPTION_FILE echo " * This file is part of wolfSSL. (formerly known as CyaSSL)" >> $OPTION_FILE echo " *" >> $OPTION_FILE @@ -8723,16 +9860,17 @@ echo "#endif" >> $OPTION_FILE echo "" >> $OPTION_FILE -# check for supported command to trim option with +# Check for supported command to trim option with. +# note: cut requires an argument to exit with success. if colrm >/dev/null 2>&1 /dev/null 2>&1 /dev/null 2>&1 > $OPTION_FILE echo "" >> $OPTION_FILE -#backwards compatibility for those who have included options or version -touch cyassl/options.h -echo "/* cyassl options.h" > cyassl/options.h -echo " * generated from wolfssl/options.h" >> cyassl/options.h -echo " */" >> cyassl/options.h - -while read -r line -do - echo "$line" >> cyassl/options.h -done < $OPTION_FILE - -# switch ifdef protection in cyassl/option.h to CYASSL_OPTONS_H, remove bak -sed -i.bak 's/WOLFSSL_OPTIONS_H/CYASSL_OPTIONS_H/g' cyassl/options.h - -# workaround for mingw sed that may get "Permission denied" trying to preserve permissions -case $host_os in - mingw*) - chmod u+w cyassl/options.h ;; -esac - -rm cyassl/options.h.bak +if test "$ENABLED_DEBUG_TRACE_ERRCODES" = "yes" +then + support/gen-debug-trace-error-codes.sh || AC_MSG_ERROR([Header generation for debug-trace-errcodes failed.]) +fi if test "$ENABLED_OPENSSLEXTRA" = "yes" && test "$ENABLED_LINUXKM" = "no" then SAVE_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -I. -I$srcdir" + CFLAGS="$CFLAGS $DEFS -I. -I$srcdir" if test "$ENABLED_INTEL_QA" = "yes" then CFLAGS="$CFLAGS $QAT_FLAGS" @@ -8868,7 +9989,6 @@ echo " * SIMD+FPU disable as flags: $ASFLAGS_FPUSIMD_DISABLE" && \ echo " * SIMD+FPU enable as flags: $ASFLAGS_FPUSIMD_ENABLE" && \ echo " * Linux kernel module PIE: $ENABLED_LINUXKM_PIE" -echo " * Linux kernel module bench: $ENABLED_LINUXKM_BENCHMARKS" echo " * Debug enabled: $ax_enable_debug" echo " * Coverage enabled: $ax_enable_coverage" @@ -8877,6 +9997,12 @@ echo " * VCS checkout: $ac_cv_vcs_checkout" echo echo " Features " +if test "$ENABLED_EXPERIMENTAL" = "yes" +then + echo " * Experimental settings: Allowed" +else + echo " * Experimental settings: Forbidden" +fi if test "$ENABLED_FIPS" = "yes"; then echo " * FIPS: $FIPS_VERSION" else @@ -8922,9 +10048,22 @@ echo " * AES-CTR: $ENABLED_AESCTR" echo " * AES-CFB: $ENABLED_AESCFB" echo " * AES-OFB: $ENABLED_AESOFB" +echo " * AES-XTS: $ENABLED_AESXTS" +echo " * AES-XTS streaming: $ENABLED_AESXTS_STREAM" echo " * AES-SIV: $ENABLED_AESSIV" +echo " * AES-EAX: $ENABLED_AESEAX" +echo " * AES Bitspliced: $ENABLED_AESBS" +echo " * AES Key Wrap: $ENABLED_AESKEYWRAP" +echo " * ARIA: $ENABLED_ARIA" echo " * DES3: $ENABLED_DES3" +echo " * DES3 TLS Suites: $ENABLED_DES3_TLS_SUITES" echo " * Camellia: $ENABLED_CAMELLIA" +echo " * CUDA: $ENABLED_CUDA" +echo " * SM4-ECB: $ENABLED_SM4_ECB" +echo " * SM4-CBC: $ENABLED_SM4_CBC" +echo " * SM4-CTR: $ENABLED_SM4_CTR" +echo " * SM4-GCM: $ENABLED_SM4_GCM" +echo " * SM4-CCM: $ENABLED_SM4_CCM" echo " * NULL Cipher: $ENABLED_NULL_CIPHER" echo " * MD2: $ENABLED_MD2" echo " * MD4: $ENABLED_MD4" @@ -8937,6 +10076,7 @@ echo " * SHA3: $ENABLED_SHA3" echo " * SHAKE128: $ENABLED_SHAKE128" echo " * SHAKE256: $ENABLED_SHAKE256" +echo " * SM3: $ENABLED_SM3" echo " * BLAKE2: $ENABLED_BLAKE2" echo " * BLAKE2S: $ENABLED_BLAKE2S" echo " * SipHash: $ENABLED_SIPHASH" @@ -8949,13 +10089,16 @@ echo " * CHACHA: $ENABLED_CHACHA" echo " * XCHACHA: $ENABLED_XCHACHA" echo " * Hash DRBG: $ENABLED_HASHDRBG" -echo " * MmemUse Entropy: $ENABLED_ENTROPY_MEMUSE" +echo " * MmemUse Entropy:" +echo " * (AKA: wolfEntropy): $ENABLED_ENTROPY_MEMUSE" echo " * PWDBASED: $ENABLED_PWDBASED" +echo " * Encrypted keys: $ENABLED_ENCKEYS" echo " * scrypt: $ENABLED_SCRYPT" echo " * wolfCrypt Only: $ENABLED_CRYPTONLY" echo " * HKDF: $ENABLED_HKDF" echo " * HPKE: $ENABLED_HPKE" echo " * X9.63 KDF: $ENABLED_X963KDF" +echo " * SRTP-KDF: $ENABLED_SRTP_KDF" echo " * PSK: $ENABLED_PSK" echo " * Poly1305: $ENABLED_POLY1305" echo " * LEANPSK: $ENABLED_LEANPSK" @@ -8971,14 +10114,23 @@ echo " * FPECC: $ENABLED_FPECC" echo " * ECC_ENCRYPT: $ENABLED_ECC_ENCRYPT" echo " * Brainpool: $ENABLED_BRAINPOOL" +echo " * SM2: $ENABLED_SM2" echo " * CURVE25519: $ENABLED_CURVE25519" echo " * ED25519: $ENABLED_ED25519" echo " * ED25519 streaming: $ENABLED_ED25519_STREAM" echo " * CURVE448: $ENABLED_CURVE448" echo " * ED448: $ENABLED_ED448" echo " * ED448 streaming: $ENABLED_ED448_STREAM" +echo " * LMS: $ENABLED_LMS" +echo " * LMS wolfSSL impl: $ENABLED_WC_LMS" +echo " * XMSS: $ENABLED_XMSS" +echo " * XMSS wolfSSL impl: $ENABLED_WC_XMSS" +if test "$ENABLED_LIBXMSS" = "yes"; then +echo " * XMSS_ROOT: $XMSS_ROOT" +fi echo " * KYBER: $ENABLED_KYBER" echo " * KYBER wolfSSL impl: $ENABLED_WC_KYBER" +echo " * DILITHIUM: $ENABLED_DILITHIUM" echo " * ECCSI $ENABLED_ECCSI" echo " * SAKKE $ENABLED_SAKKE" echo " * ASN: $ENABLED_ASN" @@ -9006,6 +10158,8 @@ echo " * chrony: $ENABLED_CHRONY" echo " * strongSwan: $ENABLED_STRONGSWAN" echo " * OpenLDAP: $ENABLED_OPENLDAP" +echo " * hitch: $ENABLED_HITCH" +echo " * memcached: $ENABLED_MEMCACHED" echo " * ERROR_STRINGS: $ENABLED_ERROR_STRINGS" echo " * DTLS: $ENABLED_DTLS" echo " * DTLS v1.3: $ENABLED_DTLS13" @@ -9018,6 +10172,7 @@ echo " * TLS v1.1 (Old): $ENABLED_OLD_TLS" echo " * TLS v1.2: $ENABLED_TLSV12" echo " * TLS v1.3: $ENABLED_TLS13" +echo " * RPK: $ENABLED_RPK" echo " * Post-handshake Auth: $ENABLED_TLS13_POST_AUTH" echo " * Early Data: $ENABLED_TLS13_EARLY_DATA" echo " * QUIC: $ENABLED_QUIC" @@ -9031,6 +10186,8 @@ echo " * Persistent cert cache: $ENABLED_SAVECERT" echo " * Atomic User Record Layer: $ENABLED_ATOMICUSER" echo " * Public Key Callbacks: $ENABLED_PKCALLBACKS" +echo " * libxmss: $ENABLED_LIBXMSS" +echo " * liblms: $ENABLED_LIBLMS" echo " * liboqs: $ENABLED_LIBOQS" echo " * Whitewood netRandom: $ENABLED_WNR" echo " * Server Name Indication: $ENABLED_SNI" @@ -9047,8 +10204,11 @@ echo " * Fallback SCSV: $ENABLED_FALLBACK_SCSV" echo " * Keying Material Exporter: $ENABLED_KEYING_MATERIAL" echo " * All TLS Extensions: $ENABLED_TLSX" -echo " * PKCS#7: $ENABLED_PKCS7" echo " * S/MIME: $ENABLED_SMIME" +echo " * PKCS#7: $ENABLED_PKCS7" +echo " * PKCS#8: $ENABLED_PKCS8" +echo " * PKCS#11: $ENABLED_PKCS11" +echo " * PKCS#12: $ENABLED_PKCS12" echo " * wolfSSH: $ENABLED_WOLFSSH" echo " * wolfEngine: $ENABLED_WOLFENGINE" echo " * wolfTPM: $ENABLED_WOLFTPM" @@ -9057,18 +10217,19 @@ echo " * Secure Remote Password: $ENABLED_SRP" echo " * Small Stack: $ENABLED_SMALL_STACK" echo " * Linux Kernel Module: $ENABLED_LINUXKM" + +test "$ENABLED_LINUXKM" = "yes" && \ +echo " * Linux kernel module bench: $ENABLED_LINUXKM_BENCHMARKS" && \ +echo " * Linux kernel alg register: $ENABLED_LINUXKM_LKCAPI_REGISTER" + echo " * valgrind unit tests: $ENABLED_VALGRIND" echo " * LIBZ: $ENABLED_LIBZ" echo " * Examples: $ENABLED_EXAMPLES" echo " * Crypt tests: $ENABLED_CRYPT_TESTS" echo " * Stack sizes in tests: $ENABLED_STACKSIZE" echo " * Heap stats in tests: $ENABLED_TRACKMEMORY" -echo " * User Crypto: $ENABLED_USER_CRYPTO" -echo " * Fast RSA: $ENABLED_FAST_RSA" -echo " * Async Crypto: $ENABLED_ASYNCCRYPT" -echo " * PKCS#8: $ENABLED_PKCS8" -echo " * PKCS#11: $ENABLED_PKCS11" -echo " * PKCS#12: $ENABLED_PKCS12" +echo " * Asynchronous Crypto: $ENABLED_ASYNCCRYPT" +echo " * Asynchronous Crypto (sim): $ENABLED_ASYNCCRYPT_SW" echo " * Cavium Nitrox: $ENABLED_CAVIUM" echo " * Cavium Octeon (Sync): $ENABLED_OCTEON_SYNC" echo " * Intel Quick Assist: $ENABLED_INTEL_QA" @@ -9078,13 +10239,15 @@ fi echo " * ARM ASM: $ENABLED_ARMASM" echo " * ARM ASM SHA512/SHA3 Crypto $ENABLED_ARMASM_SHA3" -echo " * AES Key Wrap: $ENABLED_AESKEYWRAP" +echo " * ARM ASM SM3/SM4 Crypto $ENABLED_ARMASM_CRYPTO_SM4" +echo " * RISC-V ASM $ENABLED_RISCV_ASM" echo " * Write duplicate: $ENABLED_WRITEDUP" echo " * Xilinx Hardware Acc.: $ENABLED_XILINX" echo " * Inline Code: $ENABLED_INLINE" echo " * Linux AF_ALG: $ENABLED_AFALG" echo " * Linux KCAPI: $ENABLED_KCAPI" echo " * Linux devcrypto: $ENABLED_DEVCRYPTO" +echo " * PK callbacks: $ENABLED_PKCALLBACKS" echo " * Crypto callbacks: $ENABLED_CRYPTOCB" echo " * i.MX CAAM: $ENABLED_CAAM" echo " * IoT-Safe: $ENABLED_IOTSAFE" @@ -9093,11 +10256,16 @@ echo " * Maxim Integrated MAXQ10XX: $ENABLED_MAXQ10XX" echo " * PSA: $ENABLED_PSA" echo " * System CA certs: $ENABLED_SYS_CA_CERTS" +echo " * Dual alg cert support: $ENABLED_DUAL_ALG_CERTS" echo " * ERR Queues per Thread: $ENABLED_ERRORQUEUEPERTHREAD" echo " * rwlock: $ENABLED_RWLOCK" +echo " * keylog export: $ENABLED_KEYLOG_EXPORT" +echo " * AutoSAR : $ENABLED_AUTOSAR" echo "" echo "---" +echo "./configure flags: $(./config.status --config)" + fi # $silent != yes ################################################################################ @@ -9126,3 +10294,10 @@ then AC_MSG_WARN([Building with shared and static library at the same time on this system may cause export/import problems when using non contemporary GNU tools.]) fi + +if test -n "$WITH_MAX_ECC_BITS"; then + if test "$WITH_MAX_ECC_BITS" -lt "$ENABLED_ECCMINSZ"; then + AC_MSG_ERROR([--with-max-ecc-bits argument ($WITH_MAX_ECC_BITS) must be greater than --with-eccminsz argument ($ENABLED_ECCMINSZ)]) + fi +fi + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.sln mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.sln --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.sln 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.sln 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ctaocrypt", "ctaocrypt.vcproj", "{BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test\test.vcproj", "{D04BDF66-664A-4D59-BEAC-8AB2D5809C21}" - ProjectSection(ProjectDependencies) = postProject - {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62} = {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "benchmark", "benchmark\benchmark.vcproj", "{615AEC46-5595-4DEA-9490-DBD5DE0F8772}" - ProjectSection(ProjectDependencies) = postProject - {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62} = {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62}.Debug|Win32.ActiveCfg = Debug|Win32 - {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62}.Debug|Win32.Build.0 = Debug|Win32 - {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62}.Release|Win32.ActiveCfg = Release|Win32 - {BF0EA0C1-3F4C-4767-B79E-7B2A391F7D62}.Release|Win32.Build.0 = Release|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|Win32.ActiveCfg = Debug|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Debug|Win32.Build.0 = Debug|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.ActiveCfg = Release|Win32 - {D04BDF66-664A-4D59-BEAC-8AB2D5809C21}.Release|Win32.Build.0 = Release|Win32 - {615AEC46-5595-4DEA-9490-DBD5DE0F8772}.Debug|Win32.ActiveCfg = Debug|Win32 - {615AEC46-5595-4DEA-9490-DBD5DE0F8772}.Debug|Win32.Build.0 = Debug|Win32 - {615AEC46-5595-4DEA-9490-DBD5DE0F8772}.Release|Win32.ActiveCfg = Release|Win32 - {615AEC46-5595-4DEA-9490-DBD5DE0F8772}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/ctaocrypt.vcproj 1970-01-01 00:00:00.000000000 +0000 @@ -1,319 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/aes.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/des3.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/des3.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/des3.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/des3.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/hmac.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/hmac.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/hmac.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/hmac.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/misc.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/misc.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/misc.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/misc.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -/* misc.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifdef NO_INLINE - #include -#else - /* for inline includes */ - #define WOLFSSL_MISC_INCLUDED - #include -#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/random.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/random.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/random.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/random.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/rsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/rsa.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/sha.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/sha.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/sha256.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha256.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/sha256.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha256.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/sha512.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha512.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/sha512.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/sha512.c 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -/* dummy file for autoconf */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_first.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_first.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_first.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_first.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -/* wolfcrypt_first.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* This file needs to be linked first in order to work correctly */ - -#ifdef HAVE_CONFIG_H - #include -#endif - -/* in case user set HAVE_FIPS there */ -#include - -#ifdef HAVE_FIPS - -#ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$a") - #pragma const_seg(".fipsB$a") -#endif - - -/* read only start address */ -const unsigned int wolfCrypt_FIPS_ro_start[] = -{ 0x1a2b3c4d, 0x00000001 }; - - -/* first function of text/code segment */ -int wolfCrypt_FIPS_first(void); -int wolfCrypt_FIPS_first(void) -{ - return 0; -} - - -#endif /* HAVE_FIPS */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_last.c mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_last.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_last.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/ctaocrypt/src/wolfcrypt_last.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -/* wolfcrypt_last.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* This file needs to be linked last in order to work correctly */ - -#ifdef HAVE_CONFIG_H - #include -#endif - -/* in case user set HAVE_FIPS there */ -#include - -#ifdef HAVE_FIPS - -#ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$l") - #pragma const_seg(".fipsB$l") -#endif - - -/* last function of text/code segment */ -int wolfCrypt_FIPS_last(void); -int wolfCrypt_FIPS_last(void) -{ - return 0; -} - - -/* read only end address */ -const unsigned int wolfCrypt_FIPS_ro_end[] = -{ 0x1a2b3c4d, 0xffffffff }; - - -#endif /* HAVE_FIPS */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/callbacks.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/callbacks.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/callbacks.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/callbacks.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* callbacks.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/certs_test.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/certs_test.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/certs_test.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/certs_test.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -/* certs_test.h */ - -#include - -#ifndef CYASSL_CERTS_TEST_H - #define CYASSL_CERTS_TEST_H WOLFSSL_CERTS_TEST_H -#else - #undef CYASSL_CERTS_TEST_H - #define CYASSL_CERTS_TEST_H WOLFSSL_CERTS_TEST_H -#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/crl.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/crl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/crl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/crl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* crl.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/aes.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/aes.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/aes.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/aes.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* aes.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_AES - -#ifndef CTAO_CRYPT_AES_H -#define CTAO_CRYPT_AES_H - -#include -#define AesSetKey wc_AesSetKey -#define AesSetIV wc_AesSetIV -#define AesCbcEncrypt wc_AesCbcEncrypt -#define AesCbcDecrypt wc_AesCbcDecrypt -#define AesCbcDecryptWithKey wc_AesCbcDecryptWithKey - -/* AES-CTR */ -#ifdef WOLFSSL_AES_COUNTER - #define AesCtrEncrypt wc_AesCtrEncrypt -#endif -/* AES-DIRECT */ -#if defined(WOLFSSL_AES_DIRECT) - #define AesEncryptDirect wc_AesEncryptDirect - #define AesDecryptDirect wc_AesDecryptDirect - #define AesSetKeyDirect wc_AesSetKeyDirect -#endif -#ifdef HAVE_AESGCM - #define AesGcmSetKey wc_AesGcmSetKey - #define AesGcmEncrypt wc_AesGcmEncrypt - #define AesGcmDecrypt wc_AesGcmDecrypt - #define GmacSetKey wc_GmacSetKey - #define GmacUpdate wc_GmacUpdate -#endif /* HAVE_AESGCM */ -#ifdef HAVE_AESCCM - #define AesCcmSetKey wc_AesCcmSetKey - #define AesCcmEncrypt wc_AesCcmEncrypt - #define AesCcmDecrypt wc_AesCcmDecrypt -#endif /* HAVE_AESCCM */ - -#endif /* CTAO_CRYPT_AES_H */ -#endif /* NO_AES */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/arc4.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/arc4.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/arc4.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/arc4.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -/* arc4.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef CTAO_CRYPT_ARC4_H -#define CTAO_CRYPT_ARC4_H - -/* for arc4 reverse compatibility */ -#ifndef NO_RC4 -#include - #define Arc4Process wc_Arc4Process - #define Arc4SetKey wc_Arc4SetKey - #define Arc4AsyncInit wc_Arc4AsyncInit - #define Arc4AsyncFree wc_Arc4AsyncFree -#endif - -#endif /* CTAO_CRYPT_ARC4_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -/* asn.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef NO_ASN - -#ifndef CTAO_CRYPT_ASN_H -#define CTAO_CRYPT_ASN_H - -/* pull in compatibility for each include */ -#include -#include -#include -#include -#include /* public interface */ -#ifdef HAVE_ECC - #include -#endif - - -#include - -#ifndef NO_FILESYSTEM - #define CyaSSL_PemCertToDer wc_PemCertToDer -#endif - -#endif /* CTAO_CRYPT_ASN_H */ - -#endif /* !NO_ASN */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn_public.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn_public.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn_public.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/asn_public.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -/* asn_public.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_ASN_PUBLIC_H -#define CTAO_CRYPT_ASN_PUBLIC_H - -/* pull in compatibility for each of the includes */ -#include -#include -#include -#ifdef WOLFSSL_CERT_GEN - #include -#endif - -#include -#ifdef WOLFSSL_CERT_GEN - #define InitCert wc_InitCert - #define MakeCert wc_MakeCert - - #ifdef WOLFSSL_CERT_REQ - #define MakeCertReq wc_MakeCertReq -#endif - - #define SignCert wc_SignCert - #define MakeSelfCert wc_MakeSelfCert - #define SetIssuer wc_SetIssuer - #define SetSubject wc_SetSubject - - #ifdef WOLFSSL_ALT_NAMES - #define SetAltNames wc_SetAltNames -#endif - - #define SetIssuerBuffer wc_SetIssuerBuffer - #define SetSubjectBuffer wc_SetSubjectBuffer - #define SetAltNamesBuffer wc_SetAltNamesBuffer - #define SetDatesBuffer wc_SetDatesBuffer - -#endif /* WOLFSSL_CERT_GEN */ - - #if defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN) - #define DerToPem wc_DerToPem -#endif - -#ifdef HAVE_ECC - /* private key helpers */ - #define EccPrivateKeyDecode wc_EccPrivateKeyDecode - #define EccKeyToDer wc_EccKeyToDer -#endif - - /* DER encode signature */ - #define EncodeSignature wc_EncodeSignature - #define GetCTC_HashOID wc_GetCTC_HashOID - -#endif /* CTAO_CRYPT_ASN_PUBLIC_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-impl.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-impl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-impl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-impl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Written in 2012 by Samuel Neves - - To the extent possible under law, the author(s) have dedicated all copyright - and related and neighboring rights to this software to the public domain - worldwide. This software is distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along with - this software. If not, see . -*/ -/* blake2-impl.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAOCRYPT_BLAKE2_IMPL_H -#define CTAOCRYPT_BLAKE2_IMPL_H - -#include -#include - -#endif /* CTAOCRYPT_BLAKE2_IMPL_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-int.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-int.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-int.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2-int.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Written in 2012 by Samuel Neves - - To the extent possible under law, the author(s) have dedicated all copyright - and related and neighboring rights to this software to the public domain - worldwide. This software is distributed without any warranty. - - You should have received a copy of the CC0 Public Domain Dedication along with - this software. If not, see . -*/ -/* blake2-int.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - - -#ifndef CTAOCRYPT_BLAKE2_INT_H -#define CTAOCRYPT_BLAKE2_INT_H - -#include -#include - -#endif /* CTAOCRYPT_BLAKE2_INT_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/blake2.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* blake2.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifdef HAVE_BLAKE2 - -#ifndef CTAOCRYPT_BLAKE2_H -#define CTAOCRYPT_BLAKE2_H - -#include - -/* for blake2 reverse compatibility */ -#ifndef HAVE_FIPS - #define InitBlake2b wc_InitBlake2b - #define Blake2bUpdate wc_Blake2bUpdate - #define Blake2bFinal wc_Blake2bFinal -#else - /* name for when fips hmac calls blake */ - #define wc_InitBlake2b InitBlake2b - #define wc_Blake2bUpdate Blake2bUpdate - #define wc_Blake2bFinal Blake2bFinal -#endif /* HAVE_FIPS */ - -#endif /* CTAOCRYPT_BLAKE2_H */ -#endif /* HAVE_BLAKE2 */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/camellia.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/camellia.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/camellia.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/camellia.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/* camellia.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef CTAO_CRYPT_CAMELLIA_H -#define CTAO_CRYPT_CAMELLIA_H - - -/* for camellia reverse compatibility */ -#ifdef HAVE_CAMELLIA - #include - #define CamelliaSetKey wc_CamelliaSetKey - #define CamelliaSetIV wc_CamelliaSetIV - #define CamelliaEncryptDirect wc_CamelliaEncryptDirect - #define CamelliaDecryptDirect wc_CamelliaDecryptDirect - #define CamelliaCbcEncrypt wc_CamelliaCbcEncrypt - #define CamelliaCbcDecrypt wc_CamelliaCbcDecrypt -#endif - -#endif /* CTAO_CRYPT_CAMELLIA_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/chacha.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/chacha.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/chacha.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/chacha.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -/* chacha.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef CTAO_CRYPT_CHACHA_H -#define CTAO_CRYPT_CHACHA_H - - -/* for chacha reverse compatibility */ -#ifdef HAVE_CHACHA - #include - #define Chacha_Process wc_Chacha_Process - #define Chacha_SetKey wc_Chacha_SetKey - #define Chacha_SetIV wc_Chacha_SetIV -#endif - -#endif /* CTAO_CRYPT_CHACHA_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/coding.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/coding.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/coding.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/coding.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/* coding.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_CODING_H -#define CTAO_CRYPT_CODING_H - -#include - -#endif /* CTAO_CRYPT_CODING_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/compress.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/compress.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/compress.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/compress.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* compress.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifdef HAVE_LIBZ - -#ifndef CTAO_CRYPT_COMPRESS_H -#define CTAO_CRYPT_COMPRESS_H - -#include - -/* reverse compatibility */ -#define Compress wc_Compress -#define DeCompress wc_DeCompress - -#endif /* CTAO_CRYPT_COMPRESS_H */ - -#endif /* HAVE_LIBZ */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/des3.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/des3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/des3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/des3.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* des3.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_DES3 - -#ifndef CTAO_CRYPT_DES3_H -#define CTAO_CRYPT_DES3_H - - -#include -#define Des_SetKey wc_Des_SetKey -#define Des_SetIV wc_Des_SetIV -#define Des_CbcEncrypt wc_Des_CbcEncrypt -#define Des_CbcDecrypt wc_Des_CbcDecrypt -#define Des_EcbEncrypt wc_Des_EcbEncrypt -#define Des_CbcDecryptWithKey wc_Des_CbcDecryptWithKey -#define Des3_SetKey wc_Des3_SetKey -#define Des3_SetIV wc_Des3_SetIV -#define Des3_CbcEncrypt wc_Des3_CbcEncrypt -#define Des3_CbcDecrypt wc_Des3_CbcDecrypt -#define Des3_CbcDecryptWithKey wc_Des3_CbcDecryptWithKey -#ifdef WOLFSSL_ASYNC_CRYPT - #define Des3AsyncInit wc_Des3AsyncInit - #define Des3AsyncFree wc_Des3AsyncFree -#endif - -#endif /* NO_DES3 */ -#endif /* CTAO_CRYPT_DES3_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dh.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dh.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dh.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dh.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* dh.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_DH - -#ifndef CTAO_CRYPT_DH_H -#define CTAO_CRYPT_DH_H - -/* for dh reverse compatibility */ -#include -#define InitDhKey wc_InitDhKey -#define FreeDhKey wc_FreeDhKey -#define DhGenerateKeyPair wc_DhGenerateKeyPair -#define DhAgree wc_DhAgree -#define DhKeyDecode wc_DhKeyDecode -#define DhSetKey wc_DhSetKey -#define DhParamsLoad wc_DhParamsLoad - -#endif /* CTAO_CRYPT_DH_H */ - -#endif /* NO_DH */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/dsa.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/* dsa.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_DSA - -#ifndef CTAO_CRYPT_DSA_H -#define CTAO_CRYPT_DSA_H - -#include - -#endif /* CTAO_CRYPT_DSA_H */ -#endif /* NO_DSA */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ecc.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ecc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ecc.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ecc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -/* ecc.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifdef HAVE_ECC - -#ifndef CTAO_CRYPT_ECC_H -#define CTAO_CRYPT_ECC_H - -#include - -/* includes for compatibility */ -#include -#include -#include - -/* for ecc reverse compatibility */ -#ifdef HAVE_ECC - #define ecc_make_key wc_ecc_make_key - #define ecc_shared_secret wc_ecc_shared_secret - #define ecc_sign_hash wc_ecc_sign_hash - #define ecc_verify_hash wc_ecc_verify_hash - #define ecc_init wc_ecc_init - #define ecc_free wc_ecc_free - #define ecc_fp_free wc_ecc_fp_free - #define ecc_export_x963 wc_ecc_export_x963 - #define ecc_size wc_ecc_size - #define ecc_sig_size wc_ecc_sig_size - #define ecc_export_x963_ex wc_ecc_export_x963_ex - #define ecc_import_x963 wc_ecc_import_x963 - #define ecc_import_private_key wc_ecc_import_private_key - #define ecc_rs_to_sig wc_ecc_rs_to_sig - #define ecc_import_raw wc_ecc_import_raw - #define ecc_export_private_only wc_ecc_export_private_only - -#ifdef HAVE_ECC_ENCRYPT - /* ecc encrypt */ - #define ecc_ctx_new wc_ecc_ctx_new - #define ecc_ctx_free wc_ecc_ctx_free - #define ecc_ctx_reset wc_ecc_ctx_reset - #define ecc_ctx_get_own_salt wc_ecc_ctx_get_own_salt - #define ecc_ctx_set_peer_salt wc_ecc_ctx_set_peer_salt - #define ecc_ctx_set_info wc_ecc_ctx_set_info - #define ecc_encrypt wc_ecc_encrypt - #define ecc_decrypt wc_ecc_decrypt -#endif /* HAVE_ECC_ENCRYPT */ -#endif - -#endif /* CTAO_CRYPT_ECC_H */ -#endif /* HAVE_ECC */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/error-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/error-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/error-crypt.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/error-crypt.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ -/* error-crypt.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_ERROR_H -#define CTAO_CRYPT_ERROR_H - -/* for name change and fips compatibility @wc_fips */ -#include -#define CTaoCryptErrorString wc_ErrorString -#define CTaoCryptGetErrorString wc_GetErrorString - -#endif /* CTAO_CRYPT_ERROR_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/fips_test.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/fips_test.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/fips_test.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/fips_test.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* fips_test.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_FIPS_TEST_H -#define CTAO_CRYPT_FIPS_TEST_H - -#include - - -#ifdef __cplusplus - extern "C" { -#endif - -/* Known Answer Test string inputs are hex, internal */ -CYASSL_LOCAL int DoKnownAnswerTests(char*, int); - - -/* FIPS failure callback */ -typedef void(*wolfCrypt_fips_cb)(int ok, int err, const char* hash); - -/* Public set function */ -CYASSL_API int wolfCrypt_SetCb_fips(wolfCrypt_fips_cb cbf); - -/* Public get status functions */ -CYASSL_API int wolfCrypt_GetStatus_fips(void); -CYASSL_API const char* wolfCrypt_GetCoreHash_fips(void); - -#ifdef HAVE_FORCE_FIPS_FAILURE - /* Public function to force failure mode for operational testing */ - CYASSL_API int wolfCrypt_SetStatus_fips(int); -#endif - - -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* CTAO_CRYPT_FIPS_TEST_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/hmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/hmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/hmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/hmac.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* hmac.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_HMAC - -#ifndef CTAO_CRYPT_HMAC_H -#define CTAO_CRYPT_HMAC_H - -#include -#define HmacSetKey wc_HmacSetKey -#define HmacUpdate wc_HmacUpdate -#define HmacFinal wc_HmacFinal -#ifdef WOLFSSL_ASYNC_CRYPT - #define HmacAsyncInit wc_HmacAsyncInit - #define HmacAsyncFree wc_HmacAsyncFree -#endif -#define CyaSSL_GetHmacMaxSize wolfSSL_GetHmacMaxSize -#ifdef HAVE_HKDF - #define HKDF wc_HKDF -#endif /* HAVE_HKDF */ - -#endif /* CTAO_CRYPT_HMAC_H */ - -#endif /* NO_HMAC */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/include.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -# vim:ft=automake -# All paths should be given relative to the root - -EXTRA_DIST+= ctaocrypt/src/misc.c - -nobase_include_HEADERS+= \ - cyassl/ctaocrypt/aes.h \ - cyassl/ctaocrypt/arc4.h \ - cyassl/ctaocrypt/asn.h \ - cyassl/ctaocrypt/asn_public.h \ - cyassl/ctaocrypt/poly1305.h \ - cyassl/ctaocrypt/camellia.h \ - cyassl/ctaocrypt/coding.h \ - cyassl/ctaocrypt/compress.h \ - cyassl/ctaocrypt/des3.h \ - cyassl/ctaocrypt/dh.h \ - cyassl/ctaocrypt/dsa.h \ - cyassl/ctaocrypt/ecc.h \ - cyassl/ctaocrypt/error-crypt.h \ - cyassl/ctaocrypt/fips_test.h \ - cyassl/ctaocrypt/hmac.h \ - cyassl/ctaocrypt/integer.h \ - cyassl/ctaocrypt/md2.h \ - cyassl/ctaocrypt/md4.h \ - cyassl/ctaocrypt/md5.h \ - cyassl/ctaocrypt/misc.h \ - cyassl/ctaocrypt/pkcs7.h \ - cyassl/ctaocrypt/wc_port.h \ - cyassl/ctaocrypt/pwdbased.h \ - cyassl/ctaocrypt/chacha.h \ - cyassl/ctaocrypt/random.h \ - cyassl/ctaocrypt/ripemd.h \ - cyassl/ctaocrypt/rsa.h \ - cyassl/ctaocrypt/settings.h \ - cyassl/ctaocrypt/settings_comp.h \ - cyassl/ctaocrypt/sha256.h \ - cyassl/ctaocrypt/sha512.h \ - cyassl/ctaocrypt/sha.h \ - cyassl/ctaocrypt/blake2.h \ - cyassl/ctaocrypt/blake2-int.h \ - cyassl/ctaocrypt/blake2-impl.h \ - cyassl/ctaocrypt/tfm.h \ - cyassl/ctaocrypt/types.h \ - cyassl/ctaocrypt/visibility.h \ - cyassl/ctaocrypt/logging.h \ - cyassl/ctaocrypt/memory.h \ - cyassl/ctaocrypt/mpi_class.h \ - cyassl/ctaocrypt/mpi_superclass.h - -noinst_HEADERS+= \ - cyassl/ctaocrypt/port/pic32/pic32mz-crypt.h - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/integer.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/integer.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/integer.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/integer.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -/* integer.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* - * Based on public domain LibTomMath 0.38 by Tom St Denis, tomstdenis@iahu.ca, - * http://math.libtomcrypt.com - */ - - -#ifndef CTAO_CRYPT_INTEGER_H -#define CTAO_CRYPT_INTEGER_H - -#include - -#endif /* CTAO_CRYPT_INTEGER_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/logging.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/logging.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/logging.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/logging.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -/* logging.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* submitted by eof */ - - -#ifndef CYASSL_LOGGING_H -#define CYASSL_LOGGING_H - -/* for fips compatibility @wc_fips */ -#include -#define CYASSL_LEAVE WOLFSSL_LEAVE -#define CYASSL_ERROR WOLFSSL_ERROR -#define CYASSL_ENTER WOLFSSL_ENTER -#define CYASSL_MSG WOLFSSL_MSG -/* check old macros possibly declared */ -#if defined(DEBUG_CYASSL) && !defined(DEBUG_WOLFSSL) - #define DEBUG_WOLFSSL -#endif - -#endif /* CYASSL_LOGGING_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md2.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md2.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md2.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md2.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -/* md2.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -/* check for old macro */ -#if !defined(CYASSL_MD2) && defined(WOLFSSL_MD2) - #define CYASSL_MD2 -#endif - -#ifdef CYASSL_MD2 - -#ifndef CTAO_CRYPT_MD2_H -#define CTAO_CRYPT_MD2_H - -#include - -#define InitMd2 wc_InitMd2 -#define Md2Update wc_Md2Update -#define Md2Final wc_Md2Final -#define Md2Hash wc_Md2Hash - -#endif /* CTAO_CRYPT_MD2_H */ -#endif /* CYASSL_MD2 */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md4.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md4.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md4.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md4.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* md4.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_MD4 - -#ifndef CTAO_CRYPT_MD4_H -#define CTAO_CRYPT_MD4_H - -#include - -#define InitMd4 wc_InitMd4 -#define Md4Update wc_Md4Update -#define Md4Final wc_Md4Final - -#endif /* CTAO_CRYPT_MD4_H */ - -#endif /* NO_MD4 */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md5.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md5.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md5.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/md5.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* md5.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef NO_MD5 - -#ifndef CTAO_CRYPT_MD5_H -#define CTAO_CRYPT_MD5_H - -#include - -#ifndef HAVE_FIPS - #define InitMd5 wc_InitMd5 - #define Md5Update wc_Md5Update - #define Md5Final wc_Md5Final - #define Md5Hash wc_Md5Hash -#else - /* redfined name so that hmac is calling same function names with fips */ - #define wc_InitMd5 InitMd5 - #define wc_Md5Update Md5Update - #define wc_Md5Final Md5Final - #define wc_Md5Hash Md5Hash -#endif - -#endif /* CTAO_CRYPT_MD5_H */ -#endif /* NO_MD5 */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/memory.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/memory.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/memory.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/memory.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* memory.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* submitted by eof */ - - -#ifndef CYASSL_MEMORY_H -#define CYASSL_MEMORY_H - - -#include -#define CyaSSL_Malloc_cb wolfSSL_Malloc_cb -#define CyaSSL_Free_cb wolfSSL_Free_cb -#define CyaSSL_Realloc_cb wolfSSL_Realloc_cb -#define CyaSSL_SetAllocators wolfSSL_SetAllocators - -/* Public in case user app wants to use XMALLOC/XFREE */ -#define CyaSSL_Malloc wolfSSL_Malloc -#define CyaSSL_Free wolfSSL_Free -#define CyaSSL_Realloc wolfSSL_Realloc - -#endif /* CYASSL_MEMORY_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/misc.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/misc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/misc.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/misc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -/* misc.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_MISC_H -#define CTAO_CRYPT_MISC_H - -#include - -#endif /* CTAO_CRYPT_MISC_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_class.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_class.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_class.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_class.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -/* mpi_class.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_superclass.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_superclass.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_superclass.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/mpi_superclass.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -/* mpi_superclass.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -/* super class file for PK algos */ - -#include - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pkcs7.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pkcs7.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pkcs7.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pkcs7.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* pkcs7.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifdef HAVE_PKCS7 - -#ifndef CTAO_CRYPT_PKCS7_H -#define CTAO_CRYPT_PKCS7_H - -/* pull in compatibility for old includes */ -#include -#include -#include -#include -#include - -#include - -/* for pkcs7 reverse compatibility */ -#define SetContentType wc_SetContentType -#define GetContentType wc_GetContentType -#define CreateRecipientInfo wc_CreateRecipientInfo -#define PKCS7_InitWithCert wc_PKCS7_InitWithCert -#define PKCS7_Free wc_PKCS7_Free -#define PKCS7_EncodeData wc_PKCS7_EncodeData -#define PKCS7_EncodeSignedData wc_PKCS7_EncodeSignedData -#define PKCS7_VerifySignedData wc_PKCS7_VerifySignedData -#define PKCS7_EncodeEnvelopedData wc_PKCS7_EncodeEnvelopedData -#define PKCS7_DecodeEnvelopedData wc_PKCS7_DecodeEnvelopedData - -#endif /* CTAO_CRYPT_PKCS7_H */ - -#endif /* HAVE_PKCS7 */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/poly1305.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/poly1305.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/poly1305.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/poly1305.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/* poly1305.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifdef HAVE_POLY1305 - -#ifndef CTAO_CRYPT_POLY1305_H -#define CTAO_CRYPT_POLY1305_H - -#include - -/* for poly1305 reverse compatibility */ -#define Poly1305SetKey wc_Poly1305SetKey -#define Poly1305Update wc_Poly1305Update -#define Poly1305Final wc_Poly1305Final - -#endif /* CTAO_CRYPT_POLY1305_H */ - -#endif /* HAVE_POLY1305 */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/port/pic32/pic32mz-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/port/pic32/pic32mz-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/port/pic32/pic32mz-crypt.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/port/pic32/pic32mz-crypt.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -/* pic32mz-crypt.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef PIC32MZ_CRYPT_H -#define PIC32MZ_CRYPT_H - -#include - -#endif /* PIC32MZ_CRYPT_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pwdbased.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pwdbased.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pwdbased.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/pwdbased.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -/* pwdbased.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_PWDBASED - -#ifndef CTAO_CRYPT_PWDBASED_H -#define CTAO_CRYPT_PWDBASED_H - -/* for pwdbased reverse compatibility */ -#include -#define PBKDF1 wc_PBKDF1 -#define PBKDF2 wc_PBKDF2 -#define PKCS12_PBKDF wc_PKCS12_PBKDF - -#endif /* CTAO_CRYPT_PWDBASED_H */ -#endif /* NO_PWDBASED */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/random.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/random.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/random.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/random.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/* random.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_RANDOM_H -#define CTAO_CRYPT_RANDOM_H - - /* for random.h compatibility */ - #include - #define InitRng wc_InitRng - #define RNG_GenerateBlock wc_RNG_GenerateBlock - #define RNG_GenerateByte wc_RNG_GenerateByte - #define FreeRng wc_FreeRng - - #if defined(HAVE_HASHDRBG) || defined(NO_RC4) - #define RNG_HealthTest wc_RNG_HealthTest - #endif /* HAVE_HASHDRBG || NO_RC4 */ - -#endif /* CTAO_CRYPT_RANDOM_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ripemd.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ripemd.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ripemd.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/ripemd.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -/* ripemd.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - - -#ifndef CTAO_CRYPT_RIPEMD_H -#define CTAO_CRYPT_RIPEME_H - -#include - -/* for ripemd reverse compatibility */ -#ifdef WOLFSSL_RIPEMD - #define InitRipeMd wc_InitRipeMd - #define RipeMdUpdate wc_RipeMdUpdate - #define RipeMdFinal wc_RipeMdFinal -#endif - -#endif /* CTAO_CRYPT_RIPEMD_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/rsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/rsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/rsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/rsa.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -/* rsa.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef NO_RSA - -#ifndef CTAO_CRYPT_RSA_H -#define CTAO_CRYPT_RSA_H - -#include -/* includes for their compatibility */ -#include -#include -#include - -#define InitRsaKey wc_InitRsaKey -#define FreeRsaKey wc_FreeRsaKey -#define RsaPublicEncrypt wc_RsaPublicEncrypt -#define RsaPrivateDecryptInline wc_RsaPrivateDecryptInline -#define RsaPrivateDecrypt wc_RsaPrivateDecrypt -#define RsaSSL_Sign wc_RsaSSL_Sign -#define RsaSSL_VerifyInline wc_RsaSSL_VerifyInline -#define RsaSSL_Verify wc_RsaSSL_Verify -#define RsaEncryptSize wc_RsaEncryptSize -#define RsaFlattenPublicKey wc_RsaFlattenPublicKey - -#ifdef WOLFSSL_KEY_GEN - #define MakeRsaKey wc_MakeRsaKey - #define RsaKeyToDer wc_RsaKeyToDer - #define CheckProbablePrime wc_CheckProbablePrime -#endif - -#ifdef WOLFSSL_ASYNC_CRYPT - #define RsaAsyncInit wc_RsaAsyncInit - #define RsaAsyncFree wc_RsaAsyncFree -#endif - -#endif /* CTAO_CRYPT_RSA_H */ - -#endif /* NO_RSA */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,702 +0,0 @@ -/* settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* Place OS specific preprocessor flags, defines, includes here, will be - included into every file because types.h includes it */ - - -#ifndef CTAO_CRYPT_SETTINGS_H -#define CTAO_CRYPT_SETTINGS_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Uncomment next line if using IPHONE */ -/* #define IPHONE */ - -/* Uncomment next line if using ThreadX */ -/* #define THREADX */ - -/* Uncomment next line if using Micrium ucOS */ -/* #define MICRIUM */ - -/* Uncomment next line if using Mbed */ -/* #define MBED */ - -/* Uncomment next line if using Microchip PIC32 ethernet starter kit */ -/* #define MICROCHIP_PIC32 */ - -/* Uncomment next line if using Microchip TCP/IP stack, version 5 */ -/* #define MICROCHIP_TCPIP_V5 */ - -/* Uncomment next line if using Microchip TCP/IP stack, version 6 or later */ -/* #define MICROCHIP_TCPIP */ - -/* Uncomment next line if using PIC32MZ Crypto Engine */ -/* #define CYASSL_MICROCHIP_PIC32MZ */ - -/* Uncomment next line if using FreeRTOS */ -/* #define FREERTOS */ - -/* Uncomment next line if using FreeRTOS Windows Simulator */ -/* #define FREERTOS_WINSIM */ - -/* Uncomment next line if using RTIP */ -/* #define EBSNET */ - -/* Uncomment next line if using lwip */ -/* #define CYASSL_LWIP */ - -/* Uncomment next line if building CyaSSL for a game console */ -/* #define CYASSL_GAME_BUILD */ - -/* Uncomment next line if building CyaSSL for LSR */ -/* #define CYASSL_LSR */ - -/* Uncomment next line if building CyaSSL for Freescale MQX/RTCS/MFS */ -/* #define FREESCALE_MQX */ - -/* Uncomment next line if using STM32F2 */ -/* #define CYASSL_STM32F2 */ - -/* Uncomment next line if using QL SEP settings */ -/* #define CYASSL_QL */ - -/* Uncomment next line if building for EROAD */ -/* #define CYASSL_EROAD */ - -/* Uncomment next line if building for IAR EWARM */ -/* #define CYASSL_IAR_ARM */ - -/* Uncomment next line if using TI-RTOS settings */ -/* #define CYASSL_TIRTOS */ - -/* Uncomment next line if building with PicoTCP */ -/* #define CYASSL_PICOTCP */ - -/* Uncomment next line if building for PicoTCP demo bundle */ -/* #define CYASSL_PICOTCP_DEMO */ - -#include - -#ifdef IPHONE - #define SIZEOF_LONG_LONG 8 -#endif - - -#ifdef CYASSL_USER_SETTINGS - #include -#endif - -/* for reverse compatibility after name change */ -#include - -#ifdef THREADX - #define SIZEOF_LONG_LONG 8 -#endif - -#ifdef HAVE_NETX - #include "nx_api.h" -#endif - -#if defined(HAVE_LWIP_NATIVE) /* using LwIP native TCP socket */ - #define CYASSL_LWIP - #define NO_WRITEV - #define SINGLE_THREADED - #define CYASSL_USER_IO - #define NO_FILESYSTEM -#endif - -#if defined(CYASSL_IAR_ARM) - #define NO_MAIN_DRIVER - #define SINGLE_THREADED - #define USE_CERT_BUFFERS_1024 - #define BENCH_EMBEDDED - #define NO_FILESYSTEM - #define NO_WRITEV - #define CYASSL_USER_IO - #define BENCH_EMBEDDED -#endif - -#ifdef MICROCHIP_PIC32 - /* #define CYASSL_MICROCHIP_PIC32MZ */ - #define SIZEOF_LONG_LONG 8 - #define SINGLE_THREADED - #define CYASSL_USER_IO - #define NO_WRITEV - #define NO_DEV_RANDOM - #define NO_FILESYSTEM - #define USE_FAST_MATH - #define TFM_TIMING_RESISTANT -#endif - -#if defined(CYASSL_MICROCHIP_PIC32MZ) || defined(WOLFSSL_MICROCHIP_PIC32MZ) - #ifndef NO_PIC32MZ_CRYPT - #define WOLFSSL_PIC32MZ_CRYPT - #endif - #ifndef NO_PIC32MZ_RNG - #define WOLFSSL_PIC32MZ_RNG - #endif - #ifndef NO_PIC32MZ_HASH - #define WOLFSSL_PIC32MZ_HASH - #endif - - #define CYASSL_AES_COUNTER - #define HAVE_AESGCM - #define NO_BIG_INT -#endif - -#ifdef MICROCHIP_TCPIP_V5 - /* include timer functions */ - #include "TCPIP Stack/TCPIP.h" -#endif - -#ifdef MICROCHIP_TCPIP - /* include timer, NTP functions */ - #ifdef MICROCHIP_MPLAB_HARMONY - #include "tcpip/tcpip.h" - #else - #include "system/system_services.h" - #include "tcpip/sntp.h" - #endif -#endif - -#ifdef MBED - #define CYASSL_USER_IO - #define NO_FILESYSTEM - #define NO_CERTS - #define USE_CERT_BUFFERS_1024 - #define NO_WRITEV - #define NO_DEV_RANDOM - #define NO_SHA512 - #define NO_DH - #define NO_DSA - #define HAVE_ECC - #define NO_SESSION_CACHE - #define CYASSL_CMSIS_RTOS -#endif - - -#ifdef CYASSL_EROAD - #define FREESCALE_MQX - #define FREESCALE_MMCAU - #define SINGLE_THREADED - #define NO_STDIO_FILESYSTEM - #define CYASSL_LEANPSK - #define HAVE_NULL_CIPHER - #define NO_OLD_TLS - #define NO_ASN - #define NO_BIG_INT - #define NO_RSA - #define NO_DSA - #define NO_DH - #define NO_CERTS - #define NO_PWDBASED - #define NO_DES3 - #define NO_MD4 - #define NO_RC4 - #define NO_MD5 - #define NO_SESSION_CACHE - #define NO_MAIN_DRIVER -#endif - -#ifdef CYASSL_PICOTCP - #define errno pico_err - #include "pico_defines.h" - #include "pico_stack.h" - #include "pico_constants.h" - #define CUSTOM_RAND_GENERATE pico_rand -#endif - -#ifdef CYASSL_PICOTCP_DEMO - #define CYASSL_STM32 - #define USE_FAST_MATH - #define TFM_TIMING_RESISTANT - #define XMALLOC(s, h, type) PICO_ZALLOC((s)) - #define XFREE(p, h, type) PICO_FREE((p)) - #define SINGLE_THREADED - #define NO_WRITEV - #define CYASSL_USER_IO - #define NO_DEV_RANDOM - #define NO_FILESYSTEM -#endif - -#ifdef FREERTOS_WINSIM - #define FREERTOS - #define USE_WINDOWS_API -#endif - - -/* Micrium will use Visual Studio for compilation but not the Win32 API */ -#if defined(_WIN32) && !defined(MICRIUM) && !defined(FREERTOS) \ - && !defined(EBSNET) && !defined(CYASSL_EROAD) && !defined(INTIME_RTOS) - #define USE_WINDOWS_API -#endif - - -#if defined(CYASSL_LEANPSK) && !defined(XMALLOC_USER) - #include - #define XMALLOC(s, h, type) malloc((s)) - #define XFREE(p, h, type) free((p)) - #define XREALLOC(p, n, h, t) realloc((p), (n)) -#endif - -#if defined(XMALLOC_USER) && defined(SSN_BUILDING_LIBYASSL) - #undef XMALLOC - #define XMALLOC yaXMALLOC - #undef XFREE - #define XFREE yaXFREE - #undef XREALLOC - #define XREALLOC yaXREALLOC -#endif - - -#ifdef FREERTOS - #ifndef NO_WRITEV - #define NO_WRITEV - #endif - #ifndef NO_SHA512 - #define NO_SHA512 - #endif - #ifndef NO_DH - #define NO_DH - #endif - #ifndef NO_DSA - #define NO_DSA - #endif - - #ifndef SINGLE_THREADED - #include "FreeRTOS.h" - #include "semphr.h" - #endif -#endif - -#ifdef CYASSL_TIRTOS - #define SIZEOF_LONG_LONG 8 - #define NO_WRITEV - #define NO_CYASSL_DIR - #define USE_FAST_MATH - #define TFM_TIMING_RESISTANT - #define NO_DEV_RANDOM - #define NO_FILESYSTEM - #define USE_CERT_BUFFERS_2048 - #define NO_ERROR_STRINGS - #define USER_TIME - - #ifdef __IAR_SYSTEMS_ICC__ - #pragma diag_suppress=Pa089 - #elif !defined(__GNUC__) - /* Suppress the sslpro warning */ - #pragma diag_suppress=11 - #endif - - #include -#endif - -#ifdef EBSNET - #include "rtip.h" - - /* #define DEBUG_CYASSL */ - #define NO_CYASSL_DIR /* tbd */ - - #if (POLLOS) - #define SINGLE_THREADED - #endif - - #if (RTPLATFORM) - #if (!RTP_LITTLE_ENDIAN) - #define BIG_ENDIAN_ORDER - #endif - #else - #if (!KS_LITTLE_ENDIAN) - #define BIG_ENDIAN_ORDER - #endif - #endif - - #if (WINMSP3) - #undef SIZEOF_LONG - #define SIZEOF_LONG_LONG 8 - #else - #if !defined(SIZEOF_LONG) && !defined(SIZEOF_LONG_LONG) - #error settings.h - please implement SIZEOF_LONG and SIZEOF_LONG_LONG - #endif - #endif - - #define XMALLOC(s, h, type) ((void *)rtp_malloc((s), SSL_PRO_MALLOC)) - #define XFREE(p, h, type) (rtp_free(p)) - #define XREALLOC(p, n, h, t) realloc((p), (n)) - -#endif /* EBSNET */ - -#ifdef CYASSL_GAME_BUILD - #define SIZEOF_LONG_LONG 8 -#endif - -#ifdef CYASSL_LSR - #define HAVE_WEBSERVER - #define SIZEOF_LONG_LONG 8 - #define CYASSL_LOW_MEMORY - #define NO_WRITEV - #define NO_SHA512 - #define NO_DH - #define NO_DSA - #define NO_DEV_RANDOM - #define NO_CYASSL_DIR - #ifndef NO_FILESYSTEM - #define LSR_FS - #include "inc/hw_types.h" - #include "fs.h" - #endif - #define CYASSL_LWIP - #include /* for tcp errno */ - #define CYASSL_SAFERTOS - #if defined(__IAR_SYSTEMS_ICC__) - /* enum uses enum */ - #pragma diag_suppress=Pa089 - #endif -#endif - -#ifdef CYASSL_SAFERTOS - #ifndef SINGLE_THREADED - #include "SafeRTOS/semphr.h" - #endif - - #include "SafeRTOS/heap.h" - #define XMALLOC(s, h, type) pvPortMalloc((s)) - #define XFREE(p, h, type) vPortFree((p)) - #define XREALLOC(p, n, h, t) pvPortRealloc((p), (n)) -#endif - -#ifdef CYASSL_LOW_MEMORY - #undef RSA_LOW_MEM - #define RSA_LOW_MEM - #undef CYASSL_SMALL_STACK - #define CYASSL_SMALL_STACK - #undef TFM_TIMING_RESISTANT - #define TFM_TIMING_RESISTANT -#endif - -#ifdef FREESCALE_MQX - #define SIZEOF_LONG_LONG 8 - #define NO_WRITEV - #define NO_DEV_RANDOM - #define NO_CYASSL_DIR - #define USE_FAST_MATH - #define TFM_TIMING_RESISTANT - #define FREESCALE_K70_RNGA - /* #define FREESCALE_K53_RNGB */ - #include "mqx.h" - #ifndef NO_FILESYSTEM - #include "mfs.h" - #include "fio.h" - #endif - #ifndef SINGLE_THREADED - #include "mutex.h" - #endif - - #define XMALLOC(s, h, t) (void *)_mem_alloc_system((s)) - #define XFREE(p, h, t) {void* xp = (p); if ((xp)) _mem_free((xp));} - /* Note: MQX has no realloc, using fastmath above */ -#endif - -#ifdef CYASSL_STM32F2 - #define SIZEOF_LONG_LONG 8 - #define NO_DEV_RANDOM - #define NO_CYASSL_DIR - #define STM32F2_RNG - #define STM32F2_CRYPTO - #define KEIL_INTRINSICS -#endif - -#ifdef MICRIUM - - #include "stdlib.h" - #include "net_cfg.h" - #include "ssl_cfg.h" - #include "net_secure_os.h" - - #define CYASSL_TYPES - - typedef CPU_INT08U byte; - typedef CPU_INT16U word16; - typedef CPU_INT32U word32; - - #if (NET_SECURE_MGR_CFG_WORD_SIZE == CPU_WORD_SIZE_32) - #define SIZEOF_LONG 4 - #undef SIZEOF_LONG_LONG - #else - #undef SIZEOF_LONG - #define SIZEOF_LONG_LONG 8 - #endif - - #define STRING_USER - - #define XSTRLEN(pstr) ((CPU_SIZE_T)Str_Len((CPU_CHAR *)(pstr))) - #define XSTRNCPY(pstr_dest, pstr_src, len_max) \ - ((CPU_CHAR *)Str_Copy_N((CPU_CHAR *)(pstr_dest), \ - (CPU_CHAR *)(pstr_src), (CPU_SIZE_T)(len_max))) - #define XSTRNCMP(pstr_1, pstr_2, len_max) \ - ((CPU_INT16S)Str_Cmp_N((CPU_CHAR *)(pstr_1), \ - (CPU_CHAR *)(pstr_2), (CPU_SIZE_T)(len_max))) - #define XSTRSTR(pstr, pstr_srch) \ - ((CPU_CHAR *)Str_Str((CPU_CHAR *)(pstr), \ - (CPU_CHAR *)(pstr_srch))) - #define XMEMSET(pmem, data_val, size) \ - ((void)Mem_Set((void *)(pmem), (CPU_INT08U) (data_val), \ - (CPU_SIZE_T)(size))) - #define XMEMCPY(pdest, psrc, size) ((void)Mem_Copy((void *)(pdest), \ - (void *)(psrc), (CPU_SIZE_T)(size))) - #define XMEMCMP(pmem_1, pmem_2, size) \ - (((CPU_BOOLEAN)Mem_Cmp((void *)(pmem_1), (void *)(pmem_2), \ - (CPU_SIZE_T)(size))) ? DEF_NO : DEF_YES) - #define XMEMMOVE XMEMCPY - -#if (NET_SECURE_MGR_CFG_EN == DEF_ENABLED) - #define MICRIUM_MALLOC - #define XMALLOC(s, h, type) ((void *)NetSecure_BlkGet((CPU_INT08U)(type), \ - (CPU_SIZE_T)(s), (void *)0)) - #define XFREE(p, h, type) (NetSecure_BlkFree((CPU_INT08U)(type), \ - (p), (void *)0)) - #define XREALLOC(p, n, h, t) realloc((p), (n)) -#endif - - #if (NET_SECURE_MGR_CFG_FS_EN == DEF_ENABLED) - #undef NO_FILESYSTEM - #else - #define NO_FILESYSTEM - #endif - - #if (SSL_CFG_TRACE_LEVEL == CYASSL_TRACE_LEVEL_DBG) - #define DEBUG_CYASSL - #else - #undef DEBUG_CYASSL - #endif - - #if (SSL_CFG_OPENSSL_EN == DEF_ENABLED) - #define OPENSSL_EXTRA - #else - #undef OPENSSL_EXTRA - #endif - - #if (SSL_CFG_MULTI_THREAD_EN == DEF_ENABLED) - #undef SINGLE_THREADED - #else - #define SINGLE_THREADED - #endif - - #if (SSL_CFG_DH_EN == DEF_ENABLED) - #undef NO_DH - #else - #define NO_DH - #endif - - #if (SSL_CFG_DSA_EN == DEF_ENABLED) - #undef NO_DSA - #else - #define NO_DSA - #endif - - #if (SSL_CFG_PSK_EN == DEF_ENABLED) - #undef NO_PSK - #else - #define NO_PSK - #endif - - #if (SSL_CFG_3DES_EN == DEF_ENABLED) - #undef NO_DES3 - #else - #define NO_DES3 - #endif - - #if (SSL_CFG_AES_EN == DEF_ENABLED) - #undef NO_AES - #else - #define NO_AES - #endif - - #if (SSL_CFG_RC4_EN == DEF_ENABLED) - #undef NO_RC4 - #else - #define NO_RC4 - #endif - - #if (CPU_CFG_ENDIAN_TYPE == CPU_ENDIAN_TYPE_BIG) - #define BIG_ENDIAN_ORDER - #else - #undef BIG_ENDIAN_ORDER - #define LITTLE_ENDIAN_ORDER - #endif - - #if (SSL_CFG_MD4_EN == DEF_ENABLED) - #undef NO_MD4 - #else - #define NO_MD4 - #endif - - #if (SSL_CFG_WRITEV_EN == DEF_ENABLED) - #undef NO_WRITEV - #else - #define NO_WRITEV - #endif - - #if (SSL_CFG_USER_RNG_SEED_EN == DEF_ENABLED) - #define NO_DEV_RANDOM - #else - #undef NO_DEV_RANDOM - #endif - - #if (SSL_CFG_USER_IO_EN == DEF_ENABLED) - #define CYASSL_USER_IO - #else - #undef CYASSL_USER_IO - #endif - - #if (SSL_CFG_DYNAMIC_BUFFERS_EN == DEF_ENABLED) - #undef LARGE_STATIC_BUFFERS - #undef STATIC_CHUNKS_ONLY - #else - #define LARGE_STATIC_BUFFERS - #define STATIC_CHUNKS_ONLY - #endif - - #if (SSL_CFG_DER_LOAD_EN == DEF_ENABLED) - #define CYASSL_DER_LOAD - #else - #undef CYASSL_DER_LOAD - #endif - - #if (SSL_CFG_DTLS_EN == DEF_ENABLED) - #define CYASSL_DTLS - #else - #undef CYASSL_DTLS - #endif - - #if (SSL_CFG_CALLBACKS_EN == DEF_ENABLED) - #define CYASSL_CALLBACKS - #else - #undef CYASSL_CALLBACKS - #endif - - #if (SSL_CFG_FAST_MATH_EN == DEF_ENABLED) - #define USE_FAST_MATH - #else - #undef USE_FAST_MATH - #endif - - #if (SSL_CFG_TFM_TIMING_RESISTANT_EN == DEF_ENABLED) - #define TFM_TIMING_RESISTANT - #else - #undef TFM_TIMING_RESISTANT - #endif - -#endif /* MICRIUM */ - - -#ifdef CYASSL_QL - #ifndef CYASSL_SEP - #define CYASSL_SEP - #endif - #ifndef OPENSSL_EXTRA - #define OPENSSL_EXTRA - #endif - #ifndef SESSION_CERTS - #define SESSION_CERTS - #endif - #ifndef HAVE_AESCCM - #define HAVE_AESCCM - #endif - #ifndef ATOMIC_USER - #define ATOMIC_USER - #endif - #ifndef CYASSL_DER_LOAD - #define CYASSL_DER_LOAD - #endif - #ifndef KEEP_PEER_CERT - #define KEEP_PEER_CERT - #endif - #ifndef HAVE_ECC - #define HAVE_ECC - #endif - #ifndef SESSION_INDEX - #define SESSION_INDEX - #endif -#endif /* CYASSL_QL */ - - -#if !defined(XMALLOC_USER) && !defined(MICRIUM_MALLOC) && \ - !defined(CYASSL_LEANPSK) && !defined(NO_CYASSL_MEMORY) - #define USE_CYASSL_MEMORY -#endif - - -#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) - #undef KEEP_PEER_CERT - #define KEEP_PEER_CERT -#endif - - -/* stream ciphers except arc4 need 32bit alignment, intel ok without */ -#ifndef XSTREAM_ALIGNMENT - #if defined(__x86_64__) || defined(__ia64__) || defined(__i386__) - #define NO_XSTREAM_ALIGNMENT - #else - #define XSTREAM_ALIGNMENT - #endif -#endif - - -/* FreeScale MMCAU hardware crypto has 4 byte alignment */ -#ifdef FREESCALE_MMCAU - #define CYASSL_MMCAU_ALIGNMENT 4 -#endif - -/* if using hardware crypto and have alignment requirements, specify the - requirement here. The record header of SSL/TLS will prvent easy alignment. - This hint tries to help as much as possible. */ -#ifndef CYASSL_GENERAL_ALIGNMENT - #ifdef CYASSL_AESNI - #define CYASSL_GENERAL_ALIGNMENT 16 - #elif defined(XSTREAM_ALIGNMENT) - #define CYASSL_GENERAL_ALIGNMENT 4 - #elif defined(FREESCALE_MMCAU) - #define CYASSL_GENERAL_ALIGNMENT CYASSL_MMCAU_ALIGNMENT - #else - #define CYASSL_GENERAL_ALIGNMENT 0 - #endif -#endif - - -#ifdef __INTEL_COMPILER - #pragma warning(disable:2259) /* explicit casts to smaller sizes, disable */ -#endif - - -/* Place any other flags or defines here */ - - -#ifdef __cplusplus - } /* extern "C" */ -#endif - - -#endif /* CTAO_CRYPT_SETTINGS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings_comp.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings_comp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings_comp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/settings_comp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -/* settings_comp.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifndef CTAO_CRYPT_SETTINGS_C_H -#define CTAO_CRYPT_SETTINGS_C_H - - -/* since fips overrides rsa.h map compatibility here */ -#if !defined(NO_RSA) - #ifdef WOLFSSL_KEY_GEN - #define RsaKeyToDer wc_RsaKeyToDer - #endif - - #define RsaPrivateKeyDecode wc_RsaPrivateKeyDecode - #define RsaPublicKeyDecode wc_RsaPublicKeyDecode - #define RsaPublicKeyDecodeRaw wc_RsaPublicKeyDecodeRaw -#endif /* have rsa and HAVE_FIPS */ - -/* Macro redefinitions for compatibility */ -#if defined(WOLFSSL_SHA512) && !defined(CYASSL_SHA512) - #define CYASSL_SHA512 -#endif -#if defined(WOLFSSL_SHA384) && !defined(CYASSL_SHA384) - #define CYASSL_SHA384 -#endif -#if defined(WOLFSSL_LEANPSK) && !defined(CYASSL_LEANPSK) - #define CYASSL_LEANPSK -#endif -#if defined(NO_WOLFSSL_MEMORY) && !defined(NO_CYASSL_MEMORY) - #define NO_CYASSL_MEMORY -#endif -#if defined(WOLFSSL_KEY_GEN) && !defined(CYASSL_KEY_GEN) - #define CYASSL_KEY_GEN -#endif - -/* AES */ -#if defined(WOLFSSL_AES_DIRECT) && !defined(CYASSL_AES_DIRECT) - #define CYASSL_AES_DIRECT -#endif -#if defined(WOLFSSL_AES_COUNTER) && !defined(CYASSL_AES_COUNTER) - #define CYASSL_AES_COUNTER -#endif - -/* DES */ -#if defined(WOLFSSL_DES_ECB) && !defined(CYASSL_DES_ECB) - #define CYASSL_DES_ECB -#endif - -#endif /* CTAO_CRYPT_SETTINGS_C_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -/* sha.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef NO_SHA - -#ifndef CTAO_CRYPT_SHA_H -#define CTAO_CRYPT_SHA_H - -#include -#define InitSha wc_InitSha -#define ShaUpdate wc_ShaUpdate -#define ShaFinal wc_ShaFinal -#define ShaHash wc_ShaHash - -#endif /* CTAO_CRYPT_SHA_H */ -#endif /* NO_SHA */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha256.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha256.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha256.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha256.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -/* sha256.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - - - -#ifndef NO_SHA256 - -#ifndef CTAO_CRYPT_SHA256_H -#define CTAO_CRYPT_SHA256_H - -#include -#define InitSha256 wc_InitSha256 -#define Sha256Update wc_Sha256Update -#define Sha256Final wc_Sha256Final -#define Sha256Hash wc_Sha256Hash - -#ifdef WOLFSSL_SHA224 - #define InitSha224 wc_InitSha224 - #define Sha224Update wc_Sha224Update - #define Sha224Final wc_Sha224Final - #define Sha224Hash wc_Sha224Hash -#endif - -#endif /* CTAO_CRYPT_SHA256_H */ -#endif /* NO_SHA256 */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha512.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha512.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha512.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/sha512.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -/* sha512.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_SHA512_H -#define CTAO_CRYPT_SHA512_H - -#include -#define InitSha512 wc_InitSha512 -#define Sha512Update wc_Sha512Update -#define Sha512Final wc_Sha512Final -#define Sha512Hash wc_Sha512Hash - -#if defined(WOLFSSL_SHA384) || defined(HAVE_AESGCM) - #define InitSha384 wc_InitSha384 - #define Sha384Update wc_Sha384Update - #define Sha384Final wc_Sha384Final - #define Sha384Hash wc_Sha384Hash -#endif /* WOLFSSL_SHA384 */ - -#endif /* CTAO_CRYPT_SHA512_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/tfm.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/tfm.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/tfm.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/tfm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* tfm.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -/* - * Based on public domain TomsFastMath 0.10 by Tom St Denis, tomstdenis@iahu.ca, - * http://math.libtomcrypt.com - */ - - -/** - * Edited by Moisés Guimarães (moises.guimaraes@phoebus.com.br) - * to fit CyaSSL's needs. - */ - - -#ifndef CTAO_CRYPT_TFM_H -#define CTAO_CRYPT_TFM_H - -#include - -#endif /* CTAO_CRYPT_TFM_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/types.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/types.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/types.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/types.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -/* types.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_TYPES_H -#define CTAO_CRYPT_TYPES_H - -#include -#include -#include - -/* compatibility macros */ -#define CYASSL_WORD_SIZE WOLFSSL_WORD_SIZE -#define CYASSL_BIT_SIZE WOLFSSL_BIT_SIZE -#define CYASSL_MAX_16BIT WOLFSSL_MAX_16BIT -#define CYASSL_MAX_ERROR_SZ WOLFSSL_MAX_ERROR_SZ -#define cyassl_word wolfssl_word - -#endif /* CTAO_CRYPT_TYPES_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/visibility.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/visibility.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/visibility.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/visibility.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,73 +0,0 @@ -/* visibility.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* Visibility control macros */ - -#ifndef CTAO_CRYPT_VISIBILITY_H -#define CTAO_CRYPT_VISIBILITY_H - -/* fips compatibility @wc_fips */ -#ifndef HAVE_FIPS - #include - #define CYASSL_API WOLFSSL_API - #define CYASSL_LOCAL WOLFSSL_LOCAL -#else -/* CYASSL_API is used for the public API symbols. - It either imports or exports (or does nothing for static builds) - - CYASSL_LOCAL is used for non-API symbols (private). -*/ - -#if defined(BUILDING_WOLFSSL) - #if defined(HAVE_VISIBILITY) && HAVE_VISIBILITY - #define CYASSL_API __attribute__ ((visibility("default"))) - #define CYASSL_LOCAL __attribute__ ((visibility("hidden"))) - #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) - #define CYASSL_API __global - #define CYASSL_LOCAL __hidden - #elif defined(_MSC_VER) - #ifdef CYASSL_DLL - #define CYASSL_API extern __declspec(dllexport) - #else - #define CYASSL_API - #endif - #define CYASSL_LOCAL - #else - #define CYASSL_API - #define CYASSL_LOCAL - #endif /* HAVE_VISIBILITY */ -#else /* BUILDING_WOLFSSL */ - #if defined(_MSC_VER) - #ifdef CYASSL_DLL - #define CYASSL_API extern __declspec(dllimport) - #else - #define CYASSL_API - #endif - #define CYASSL_LOCAL - #else - #define CYASSL_API - #define CYASSL_LOCAL - #endif -#endif /* BUILDING_WOLFSSL */ -#endif /* HAVE_FIPS */ -#endif /* CTAO_CRYPT_VISIBILITY_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/wc_port.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/wc_port.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ctaocrypt/wc_port.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ctaocrypt/wc_port.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -/* port.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -#ifndef CTAO_CRYPT_PORT_H -#define CTAO_CRYPT_PORT_H - -#include -#include -#define CyaSSL_Mutex wolfSSL_Mutex - -#endif /* CTAO_CRYPT_PORT_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/error-ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/error-ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/error-ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/error-ssl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* error-ssl.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/include.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -# vim:ft=automake -# All paths should be given relative to the root -# - -include cyassl/ctaocrypt/include.am -include cyassl/openssl/include.am - -EXTRA_DIST+= cyassl/sniffer_error.rc - -nobase_include_HEADERS+= \ - cyassl/error-ssl.h \ - cyassl/ssl.h \ - cyassl/sniffer_error.h \ - cyassl/sniffer.h \ - cyassl/callbacks.h \ - cyassl/certs_test.h \ - cyassl/test.h \ - cyassl/version.h \ - cyassl/ocsp.h \ - cyassl/crl.h - -noinst_HEADERS+= \ - cyassl/internal.h - -# For distro build don't install options.h. -# It depends on the architecture and conflicts with Multi-Arch. -if BUILD_DISTRO -noinst_HEADERS+= cyassl/options.h -else -nobase_include_HEADERS+= cyassl/options.h -endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/internal.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/internal.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/internal.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/internal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* internal.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ocsp.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ocsp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ocsp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ocsp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* ocsp.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/asn1.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/asn1.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/asn1.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/asn1.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* asn1.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/bio.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/bio.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/bio.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/bio.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -/* bio.h for openssl */ - -#include - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/bn.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/bn.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/bn.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/bn.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* bn.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/conf.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/conf.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/conf.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/conf.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* conf.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/crypto.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/crypto.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/crypto.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/crypto.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -/* crypto.h for openSSL */ - -#include - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/des.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/des.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/des.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/des.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -/* des.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -/* des.h defines mini des openssl compatibility layer - * - */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/dh.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/dh.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/dh.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/dh.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -/* dh.h for openSSL */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/dsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/dsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/dsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/dsa.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -/* dsa.h for openSSL */ - -#ifndef CYASSL_OPENSSL_DSA -#define CYASSL_OPENSSL_DSA - -#define CyaSSL_DSA_LoadDer wolfSSL_DSA_LoadDer -#define CyaSSL_DSA_do_sign wolfSSL_DSA_do_sign - -#include -#include -#endif - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ec.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ec.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ec.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ec25519.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec25519.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ec25519.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec25519.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ec25519.h */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ec448.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec448.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ec448.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ec448.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ec448.h */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ecdh.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ecdh.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ecdh.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ecdh.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ecdh.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ecdsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ecdsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ecdsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ecdsa.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ecdsa.h for openssl */ - -#include \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ed25519.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ed25519.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ed25519.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ed25519.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ed25519.h */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ed448.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ed448.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ed448.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ed448.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ed448.h */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/engine.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/engine.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/engine.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/engine.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -/* engine.h for libcurl */ - -#include - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/err.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/err.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/err.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/err.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* err.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/evp.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/evp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/evp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/evp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -/* evp.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -/* evp.h defines mini evp openssl compatibility layer - * - */ - -#ifndef CYASSL_OPENSSL_EVP -#define CYASSL_OPENSSL_EVP - -#define CyaSSL_StoreExternalIV wolfSSL_StoreExternalIV -#define CyaSSL_SetInternalIV wolfSSL_SetInternalIV -#define CYASSL_EVP_MD WOLFSSL_EVP_MD -#define CyaSSL_EVP_X_STATE wolfSSL_EVP_X_STATE -#define CyaSSL_EVP_X_STATE_LEN wolfSSL_EVP_X_STATE_LEN -#define CyaSSL_3des_iv wolfSSL_3des_iv -#define CyaSSL_aes_ctr_iv wolfSSL_aes_ctr_iv - -#include -#endif - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/hmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/hmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/hmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/hmac.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -/* hmac.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -/* hmac.h defines mini hamc openssl compatibility layer - * - */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/include.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -# vim:ft=automake -# All paths should be given relative to the root - -nobase_include_HEADERS+= \ - cyassl/openssl/asn1.h \ - cyassl/openssl/bio.h \ - cyassl/openssl/bn.h \ - cyassl/openssl/conf.h \ - cyassl/openssl/crypto.h \ - cyassl/openssl/des.h \ - cyassl/openssl/dh.h \ - cyassl/openssl/dsa.h \ - cyassl/openssl/ecdsa.h \ - cyassl/openssl/ecdh.h \ - cyassl/openssl/ec.h \ - cyassl/openssl/ec25519.h \ - cyassl/openssl/ed25519.h \ - cyassl/openssl/ec448.h \ - cyassl/openssl/ed448.h \ - cyassl/openssl/engine.h \ - cyassl/openssl/err.h \ - cyassl/openssl/evp.h \ - cyassl/openssl/hmac.h \ - cyassl/openssl/lhash.h \ - cyassl/openssl/md4.h \ - cyassl/openssl/md5.h \ - cyassl/openssl/ripemd.h \ - cyassl/openssl/ocsp.h \ - cyassl/openssl/opensslconf.h \ - cyassl/openssl/opensslv.h \ - cyassl/openssl/ossl_typ.h \ - cyassl/openssl/pem.h \ - cyassl/openssl/pkcs12.h \ - cyassl/openssl/rand.h \ - cyassl/openssl/rsa.h \ - cyassl/openssl/sha.h \ - cyassl/openssl/ssl23.h \ - cyassl/openssl/ssl.h \ - cyassl/openssl/stack.h \ - cyassl/openssl/ui.h \ - cyassl/openssl/x509.h \ - cyassl/openssl/x509v3.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/lhash.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/lhash.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/lhash.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/lhash.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* lhash.h for openSSL */ - -#include \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/md4.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/md4.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/md4.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/md4.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* md4.h for libcurl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/md5.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/md5.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/md5.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/md5.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -/* md5.h for openssl */ - - -#include - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ocsp.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ocsp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ocsp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ocsp.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ocsp.h for libcurl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/opensslconf.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/opensslconf.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/opensslconf.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/opensslconf.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* opensslconf.h for openSSL */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/opensslv.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/opensslv.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/opensslv.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/opensslv.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* opensslv.h compatibility */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ossl_typ.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ossl_typ.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ossl_typ.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ossl_typ.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ossl_typ.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/pem.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/pem.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/pem.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/pem.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* pem.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/pkcs12.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/pkcs12.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/pkcs12.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/pkcs12.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* pkcs12.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/rand.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/rand.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/rand.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/rand.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* rand.h for openSSL */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ripemd.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ripemd.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ripemd.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ripemd.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ripemd.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/rsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/rsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/rsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/rsa.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -/* rsa.h for openSSL */ - -#ifndef CYASSL_OPENSSL_RSA -#define CYASSL_OPENSSL_RSA - -#define CyaSSL_RSA_GenAdd wolfSSL_RSA_GenAdd -#define CyaSSL_RSA_LoadDer wolfSSL_RSA_LoadDer - -#include -#include -#endif - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/sha.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/sha.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/sha.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/sha.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* sha.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ssl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -/* ssl.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - - -/* ssl.h defines openssl compatibility layer - * - */ -#ifndef CYASSL_OPENSSL_H_ -#define CYASSL_OPENSSL_H_ - -#include -#include - -#endif - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ssl23.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ssl23.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ssl23.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ssl23.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ssl23.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/stack.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/stack.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/stack.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/stack.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* stack.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ui.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ui.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/ui.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/ui.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* ui.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/x509.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/x509.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/x509.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/x509.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* x509.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/x509v3.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/x509v3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/openssl/x509v3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/openssl/x509v3.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* x509v3.h for openssl */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/options.h.in mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/options.h.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/options.h.in 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/options.h.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* options.h.in - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* default blank options for autoconf */ - -#ifndef CYASSL_OPTIONS_H -#define CYASSL_OPTIONS_H - - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef __cplusplus -} -#endif - - -#endif /* CYASSL_OPTIONS_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/sniffer.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/sniffer.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* sniffer.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/sniffer_error.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer_error.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/sniffer_error.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer_error.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* sniffer_error.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/sniffer_error.rc mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer_error.rc --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/sniffer_error.rc 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/sniffer_error.rc 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ - -STRINGTABLE -{ - 1, "Out of Memory" - 2, "New SSL Sniffer Server Registered" - 3, "Checking IP Header" - 4, "SSL Sniffer Server Not Registered" - 5, "Checking TCP Header" - - 6, "SSL Sniffer Server Port Not Registered" - 7, "RSA Private Decrypt Error" - 8, "RSA Private Decode Error" - 9, "Set Cipher Spec Error" - 10, "Server Hello Input Malformed" - - 11, "Couldn't Resume Session Error" - 12, "Server Did Resumption" - 13, "Client Hello Input Malformed" - 14, "Client Trying to Resume" - 15, "Handshake Input Malformed" - - 16, "Got Hello Verify msg" - 17, "Got Server Hello msg" - 18, "Got Cert Request msg" - 19, "Got Server Key Exchange msg" - 20, "Got Cert msg" - - 21, "Got Server Hello Done msg" - 22, "Got Finished msg" - 23, "Got Client Hello msg" - 24, "Got Client Key Exchange msg" - 25, "Got Cert Verify msg" - - 26, "Got Unknown Handshake msg" - 27, "New SSL Sniffer Session created" - 28, "Couldn't create new SSL" - 29, "Got a Packet to decode" - 30, "No data present" - - 31, "Session Not Found" - 32, "Got an Old Client Hello msg" - 33, "Old Client Hello Input Malformed" - 34, "Old Client Hello OK" - 35, "Bad Old Client Hello" - - 36, "Bad Record Header" - 37, "Record Header Input Malformed" - 38, "Got a HandShake msg" - 39, "Bad HandShake msg" - 40, "Got a Change Cipher Spec msg" - - 41, "Got Application Data msg" - 42, "Bad Application Data" - 43, "Got an Alert msg" - 44, "Another msg to Process" - 45, "Removing Session From Table" - - 46, "Bad Key File" - 47, "Wrong IP Version" - 48, "Wrong Protocol type" - 49, "Packet Short for header processing" - 50, "Got Unknown Record Type" - - 51, "Can't Open Trace File" - 52, "Session in Fatal Error State" - 53, "Partial SSL record received" - 54, "Buffer Error, malformed input" - 55, "Added to Partial Input" - - 56, "Received a Duplicate Packet" - 57, "Received an Out of Order Packet" - 58, "Received an Overlap Duplicate Packet" - 59, "Received an Overlap Reassembly Begin Duplicate Packet" - 60, "Received an Overlap Reassembly End Duplicate Packet" - - 61, "Missed the Client Hello Entirely" - 62, "Got Hello Request msg" - 63, "Got Session Ticket msg" - 64, "Bad Input" - 65, "Bad Decrypt Type" - - 66, "Bad Finished Message Processing" - 67, "Bad Compression Type" - 68, "Bad DeriveKeys Error" - 69, "Saw ACK for Missing Packet Error" - 70, "Bad Decrypt Operation" - - 71, "Decrypt Keys Not Set Up" - 72, "Late Key Load Error" - 73, "Got Certificate Status msg" - 74, "RSA Key Missing Error" -} - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/ssl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,722 +0,0 @@ -/* ssl.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* - * ssl.h makes wolfssl backwards compatible with cyassl - */ - -#ifndef WOLFSSL_CYASSL_H_ -#define WOLFSSL_CYASSL_H_ -/* - * Name change - * include the new ssl.h - */ -#include -#include -#include - -#ifdef __cplusplus - extern "C" { -#endif - -#ifdef _WIN32 - /* wincrypt.h clashes */ - #undef X509_NAME -#endif - -#ifdef CYASSL_TIRTOS - #undef CYASSL_TIRTOS - #define CYASSL_TIRTOS WOLFSSL_TIRTOS -#endif - -#define CYASSL WOLFSSL -#define DEBUG_CYASSL DEBUG_WOLFSSL -#define CYASSL_CTX WOLFSSL_CTX -#define CYASSL_METHOD WOLFSSL_METHOD -#define CYASSL_SESSION WOLFSSL_SESSION - -#define CYASSL_X509 WOLFSSL_X509 -#define CYASSL_X509_NAME WOLFSSL_X509_NAME -#define CYASSL_X509_CHAIN WOLFSSL_X509_CHAIN -#ifdef WOLFSSL_SNIFFER - #define CYASSL_SNIFFER WOLFSSL_SNIFFER -#endif - -/* redeclare guard */ -#define CYASSL_TYPES_DEFINED WOLFSSL_TYPES_DEFINED - -/* legacy defines */ -#define yasslIP wolfSSLIP /**/ -#define yasslPort wolfSSLPort /**/ - -/* cyassl/ssl.h (structs) */ -#define CYASSL_RSA WOLFSSL_RSA -#define CYASSL_DSA WOLFSSL_DSA -#define CYASSL_BIO WOLFSSL_BIO -#define CYASSL_CIPHER WOLFSSL_CIPHER -#define CYASSL_MD4_CTX WOLFSSL_MD4_CTX -#define CYASSL_MFL_2_9 WOLFSSL_MFL_2_9 /**/ -#define CYASSL_MFL_2_13 WOLFSSL_MFL_2_13 /**/ -#define CYASSL_EVP_PKEY WOLFSSL_EVP_PKEY -#define CYASSL_X509_CRL WOLFSSL_X509_CRL -#define CYASSL_ASN1_TIME WOLFSSL_ASN1_TIME -#define CYASSL_BIO_METHOD WOLFSSL_BIO_METHOD -#define CYASSL_X509_STORE WOLFSSL_X509_STORE -#define CYASSL_X509_OBJECT WOLFSSL_X509_OBJECT -#define CYASSL_X509_LOOKUP WOLFSSL_X509_LOOKUP -#define CYASSL_ASN1_OBJECT WOLFSSL_ASN1_OBJECT -#define CYASSL_ASN1_STRING WOLFSSL_ASN1_STRING -#define CYASSL_COMP_METHOD WOLFSSL_COMP_METHOD -#define CYASSL_CRL_CHECKALL WOLFSSL_CRL_CHECKALL -#define CYASSL_ASN1_INTEGER WOLFSSL_ASN1_INTEGER -#define CYASSL_X509_REVOKED WOLFSSL_X509_REVOKED -#define CYASSL_dynlock_value WOLFSSL_dynlock_value -#define CYASSL_X509_EXTENSION WOLFSSL_X509_EXTENSION -#define CYASSL_X509_STORE_CTX WOLFSSL_X509_STORE_CTX -#define CYASSL_X509_LOOKUP_METHOD WOLFSSL_X509_LOOKUP_METHOD - -#define CyaSSL_LoadCRL wolfSSL_LoadCRL -#define CyaSSL_EnableCRL wolfSSL_EnableCRL -#define CyaSSL_SetCRL_Cb wolfSSL_SetCRL_Cb - -/* cyassl/test.h */ -#ifdef CyaSSL_TEST_H - #define CYASSL_THREAD WOLFSSL_THREAD -#endif - -/* src/ssl.c */ -#define CYASSL_CRL WOLFSSL_CRL -#define CYASSL_SSLV3 WOLFSSL_SSLV3 -#define CYASSL_TLSV1 WOLFSSL_TLSV1 -#define CYASSL_TLSV1_1 WOLFSSL_TLSV1_1 -#define CYASSL_TLSV1_2 WOLFSSL_TLSV1_2 -#define CYASSL_USER_CA WOLFSSL_USER_CA -#define CYASSL_CLIENT_END WOLFSSL_CLIENT_END -#define CYASSL_CERT_MANAGER WOLFSSL_CERT_MANAGER -#define MAX_CYASSL_FILE_SIZE MAX_WOLFSSL_FILE_SIZE - -#define CyaSSL_get_cipher wolfSSL_get_cipher -#define CyaSSL_get_ciphers wolfSSL_get_ciphers -#define CyaSSL_KeyPemToDer wolfSSL_KeyPemToDer -#define CyaSSL_get_version wolfSSL_get_version -#define CyaSSL_SetServerID wolfSSL_SetServerID -#define CyaSSL_use_old_poly wolfSSL_use_old_poly -#define CyaSSL_SetCertCbCtx wolfSSL_SetCertCbCtx -#define CyaSSL_CertPemToDer wolfSSL_CertPemToDer -#define CyaSSL_get_shutdown wolfSSL_get_shutdown -#define CyaSSL_SetMinVersion wolfSSL_SetMinVersion -#define CyaSSL_CTX_UnloadCAs wolfSSL_CTX_UnloadCAs -#define CyaSSL_session_reused wolfSSL_session_reused -#define CyaSSL_UnloadCertsKeys wolfSSL_UnloadCertsKeys -#define CyaSSL_CIPHER_get_name wolfSSL_CIPHER_get_name -#define CyaSSL_is_init_finished wolfSSL_is_init_finished -#define CyaSSL_get_alert_history wolfSSL_get_alert_history -#define CyaSSL_get_current_cipher wolfSSL_get_current_cipher -#define CyaSSL_CertManagerUnloadCAs wolfSSL_CertManagerUnloadCAs -#define CyaSSL_CertManagerEnableOCSP wolfSSL_CertManagerEnableOCSP -#define CyaSSL_CTX_check_private_key wolfSSL_CTX_check_private_key -#define CyaSSL_CertManagerDisableOCSP wolfSSL_CertManagerDisableOCSP -#define CyaSSL_get_current_cipher_suite wolfSSL_get_current_cipher_suite -#define CyaSSL_CTX_load_verify_locations wolfSSL_CTX_load_verify_locations -#define CyaSSL_CTX_set_default_passwd_cb wolfSSL_CTX_set_default_passwd_cb - -#define CyaSSL_save_session_cache wolfSSL_save_session_cache -#define CyaSSL_restore_session_cache wolfSSL_restore_session_cache -#define CyaSSL_memsave_session_cache wolfSSL_memsave_session_cache -#define CyaSSL_memrestore_session_cache wolfSSL_memrestore_session_cache -#define CyaSSL_get_session_cache_memsize wolfSSL_get_session_cache_memsize - -/* certificate cache persistence, uses ctx since certs are per ctx */ -#define CyaSSL_CTX_save_cert_cache wolfSSL_CTX_save_cert_cache -#define CyaSSL_CTX_restore_cert_cache wolfSSL_CTX_restore_cert_cache -#define CyaSSL_CTX_memsave_cert_cache wolfSSL_CTX_memsave_cert_cache -#define CyaSSL_CTX_memrestore_cert_cache wolfSSL_CTX_memrestore_cert_cache -#define CyaSSL_CTX_get_cert_cache_memsize wolfSSL_CTX_get_cert_cache_memsize - -/* wolfSSL extensions */ -/* get wolfSSL peer X509_CHAIN */ -#define CyaSSL_get_chain_count wolfSSL_get_chain_count -/* index cert length */ -#define CyaSSL_get_chain_length wolfSSL_get_chain_length -/* index cert in X509 */ -#define CyaSSL_get_chain_X509 wolfSSL_get_chain_X509 -/* free X509 */ -#define CyaSSL_FreeX509 wolfSSL_FreeX509 -/* get index cert in PEM */ -#define CyaSSL_X509_get_subjectCN wolfSSL_X509_get_subjectCN -#define CyaSSL_X509_get_der wolfSSL_X509_get_der -#define CyaSSL_X509_notBefore wolfSSL_X509_notBefore -#define CyaSSL_X509_notAfter wolfSSL_X509_notAfter -#define CyaSSL_X509_get_notBefore wolfSSL_X509_get_notBefore -#define CyaSSL_X509_get_notAfter wolfSSL_X509_get_notAfter -#define CyaSSL_X509_version wolfSSL_X509_version - -#define CyaSSL_cmp_peer_cert_to_file wolfSSL_cmp_peer_cert_to_file - -#define CyaSSL_X509_get_next_altname wolfSSL_X509_get_next_altname - -#define CyaSSL_X509_d2i wolfSSL_X509_d2i -#ifndef NO_FILESYSTEM - #ifndef NO_STDIO_FILESYSTEM - #define CyaSSL_X509_d2i_fp wolfSSL_X509_d2i_fp - #endif -#define CyaSSL_X509_load_certificate_file wolfSSL_X509_load_certificate_file -#endif - -#ifdef WOLFSSL_SEP -#define CyaSSL_X509_get_device_type wolfSSL_X509_get_device_type -#define CyaSSL_X509_get_hw_type wolfSSL_X509_get_hw_type -#define CyaSSL_X509_get_hw_serial_number wolfSSL_X509_get_hw_serial_number -#endif - -#define CyaSSL_CTX_SetGenCookie wolfSSL_CTX_SetGenCookie -#define CyaSSL_SetCookieCtx wolfSSL_SetCookieCtx -#define CyaSSL_GetCookieCtx wolfSSL_GetCookieCtx -#define CyaSSL_ERR_get_error_line_data wolfSSL_ERR_get_error_line_data -#define CyaSSL_ERR_get_error wolfSSL_ERR_get_error -#define CyaSSL_ERR_clear_error wolfSSL_ERR_clear_error -#define CyaSSL_RAND_status wolfSSL_RAND_status -#define CyaSSL_RAND_bytes wolfSSL_RAND_bytes -#define CyaSSL_CTX_set_options wolfSSL_CTX_set_options -#define CyaSSL_ERR_free_strings wolfSSL_ERR_free_strings -#define CyaSSL_ERR_remove_state wolfSSL_ERR_remove_state -#define CyaSSL_EVP_cleanup wolfSSL_EVP_cleanup -#define CyaSSL_cleanup_all_ex_data wolfSSL_cleanup_all_ex_data -#define CyaSSL_CTX_set_mode wolfSSL_CTX_set_mode -#define CyaSSL_CTX_get_mode wolfSSL_CTX_get_mode -#define CyaSSL_CTX_set_default_read_ahead wolfSSL_CTX_set_default_read_ahead -#define CyaSSL_CTX_sess_set_cache_size wolfSSL_CTX_sess_set_cache_size -#define CyaSSL_CTX_set_default_verify_paths wolfSSL_CTX_set_default_verify_paths -#define CyaSSL_CTX_set_session_id_context wolfSSL_CTX_set_session_id_context -#define CyaSSL_get_peer_certificate wolfSSL_get_peer_certificate -#define CyaSSL_BIO_printf wolfSSL_BIO_printf -#define CyaSSL_ASN1_UTCTIME_print wolfSSL_ASN1_UTCTIME_print -#define CyaSSL_sk_num wolfSSL_sk_num -#define CyaSSL_sk_value wolfSSL_sk_value - -/* stunnel 4.28 needs */ -#define CyaSSL_CTX_get_ex_data wolfSSL_CTX_get_ex_data -#define CyaSSL_CTX_set_ex_data wolfSSL_CTX_set_ex_data -#define CyaSSL_CTX_sess_set_get_cb wolfSSL_CTX_sess_set_get_cb -#define CyaSSL_CTX_sess_set_new_cb wolfSSL_CTX_sess_set_new_cb -#define CyaSSL_CTX_sess_set_remove_cb wolfSSL_CTX_sess_set_remove_cb - -#define CyaSSL_i2d_SSL_SESSION wolfSSL_i2d_SSL_SESSION -#define CyaSSL_d2i_SSL_SESSION wolfSSL_d2i_SSL_SESSION - -#define CyaSSL_SESSION_get_timeout wolfSSL_SESSION_get_timeout -#define CyaSSL_SESSION_get_time wolfSSL_SESSION_get_time -#define CyaSSL_CTX_get_ex_new_index wolfSSL_CTX_get_ex_new_index - - -/* wolfio.c */ -#define CYASSL_CBIO_ERR_ISR WOLFSSL_CBIO_ERR_ISR -#define CYASSL_CBIO_ERR_TIMEOUT WOLFSSL_CBIO_ERR_TIMEOUT -#define CYASSL_CBIO_ERR_GENERAL WOLFSSL_CBIO_ERR_GENERAL -#define CYASSL_CBIO_ERR_CONN_RST WOLFSSL_CBIO_ERR_CONN_RST -#define CYASSL_CBIO_ERR_WANT_READ WOLFSSL_CBIO_ERR_WANT_READ -#define CYASSL_CBIO_ERR_WANT_WRITE WOLFSSL_CBIO_ERR_WANT_WRITE -#define CYASSL_CBIO_ERR_CONN_CLOSE WOLFSSL_CBIO_ERR_CONN_CLOSE - -#define CyaSSL_GetIOReadCtx wolfSSL_GetIOReadCtx -#define CyaSSL_GetIOWriteCtx wolfSSL_GetIOWriteCtx - -/* src/tls.c */ -#define CYASSL_SERVER_END WOLFSSL_SERVER_END -#define CYASSL_TLS_HMAC_INNER_SZ WOLFSSL_TLS_HMAC_INNER_SZ - -#define CyaSSL_DeriveTlsKeys wolfSSL_DeriveTlsKeys -#define CyaSSL_make_eap_keys wolfSSL_make_eap_keys -#define CyaSSL_MakeTlsMasterSecret wolfSSL_MakeTlsMasterSecret - -/* src/internal.c */ -#define CYASSL_CHAIN_CA WOLFSSL_CHAIN_CA -#define CYASSL_ALERT_HISTORY WOLFSSL_ALERT_HISTORY -#define CYASSL_SESSION_TIMEOUT WOLFSSL_SESSION_TIMEOUT -#define CYASSL_CBIO_ERR_CONN_RST WOLFSSL_CBIO_ERR_CONN_RST - -#define cyassl_rc4 wolfssl_rc4 -#define cyassl_aes wolfssl_aes -#define cyassl_chacha wolfssl_chacha -#define CyaSSL_ERR_reason_error_string wolfSSL_ERR_reason_error_string - -#define CyaSSL_set_ex_data wolfSSL_set_ex_data -#define CyaSSL_get_shutdown wolfSSL_get_shutdown -#define CyaSSL_set_rfd wolfSSL_set_rfd -#define CyaSSL_set_wfd wolfSSL_set_wfd -#define CyaSSL_set_shutdown wolfSSL_set_shutdown -#define CyaSSL_set_session_id_context wolfSSL_set_session_id_context -#define CyaSSL_set_connect_state wolfSSL_set_connect_state -#define CyaSSL_set_accept_state wolfSSL_set_accept_state -#define CyaSSL_session_reused wolfSSL_session_reused -#define CyaSSL_SESSION_free wolfSSL_SESSION_free -#define CyaSSL_is_init_finished wolfSSL_is_init_finished - -#define CyaSSL_get_version wolfSSL_get_version -#define CyaSSL_get_current_cipher_suite wolfSSL_get_current_cipher_suite -#define CyaSSL_get_current_cipher wolfSSL_get_current_cipher -#define CyaSSL_CIPHER_description wolfSSL_CIPHER_description -#define CyaSSL_CIPHER_get_name wolfSSL_CIPHER_get_name -#define CyaSSL_get_cipher wolfSSL_get_cipher -#define CyaSSL_get1_session wolfSSL_get1_session - -#define CyaSSL_X509_free wolfSSL_X509_free -#define CyaSSL_OPENSSL_free wolfSSL_OPENSSL_free -#define CyaSSL_OCSP_parse_url wolfSSL_OCSP_parse_url - -#define CyaSSLv23_client_method wolfSSLv23_client_method -#define CyaSSLv2_client_method wolfSSLv2_client_method -#define CyaSSLv2_server_method wolfSSLv2_server_method - -#define CyaSSL_MD4_Init wolfSSL_MD4_Init -#define CyaSSL_MD4_Update wolfSSL_MD4_Update -#define CyaSSL_MD4_Final wolfSSL_MD4_Final - - -#define CyaSSL_BIO_new wolfSSL_BIO_new -#define CyaSSL_BIO_free wolfSSL_BIO_free -#define CyaSSL_BIO_free_all wolfSSL_BIO_free_all -#define CyaSSL_BIO_read wolfSSL_BIO_read -#define CyaSSL_BIO_write wolfSSL_BIO_write -#define CyaSSL_BIO_push wolfSSL_BIO_push -#define CyaSSL_BIO_pop wolfSSL_BIO_pop -#define CyaSSL_BIO_flush wolfSSL_BIO_flush -#define CyaSSL_BIO_pending wolfSSL_BIO_pending - -#define CyaSSL_BIO_f_buffer wolfSSL_BIO_f_buffer -#define CyaSSL_BIO_set_write_buffer_size wolfSSL_BIO_set_write_buffer_size -#define CyaSSL_BIO_f_ssl wolfSSL_BIO_f_ssl -#define CyaSSL_BIO_new_socket wolfSSL_BIO_new_socket -#define CyaSSL_BIO_eof wolfSSL_BIO_eof - -#define CyaSSL_BIO_s_mem wolfSSL_BIO_s_mem -#define CyaSSL_BIO_f_base64 wolfSSL_BIO_f_base64 -#define CyaSSL_BIO_set_flags wolfSSL_BIO_set_flags -#define CyaSSL_BIO_get_mem_data wolfSSL_BIO_get_mem_data -#define CyaSSL_BIO_new_mem_buf wolfSSL_BIO_new_mem_buf - - -#define CyaSSL_BIO_set_ssl wolfSSL_BIO_set_ssl -#define CyaSSL_set_bio wolfSSL_set_bio - -#define CyaSSL_add_all_algorithms wolfSSL_add_all_algorithms -#define CyaSSL_RAND_screen wolfSSL_RAND_screen -#define CyaSSL_RAND_file_name wolfSSL_RAND_file_name -#define CyaSSL_RAND_write_file wolfSSL_RAND_write_file -#define CyaSSL_RAND_load_file wolfSSL_RAND_load_file -#define CyaSSL_RAND_egd wolfSSL_RAND_egd -#define CyaSSL_RAND_seed wolfSSL_RAND_seed -#define CyaSSL_RAND_add wolfSSL_RAND_add - -#define CyaSSL_COMP_zlib wolfSSL_COMP_zlib -#define CyaSSL_COMP_rle wolfSSL_COMP_rle -#define CyaSSL_COMP_add_compression_method wolfSSL_COMP_add_compression_method -#define CyaSSL_set_dynlock_create_callback wolfSSL_set_dynlock_create_callback -#define CyaSSL_set_dynlock_lock_callback wolfSSL_set_dynlock_lock_callback -#define CyaSSL_set_dynlock_destroy_callback wolfSSL_set_dynlock_destroy_callback -#define CyaSSL_get_ex_new_index wolfSSL_get_ex_new_index -#define CyaSSL_set_id_callback wolfSSL_set_id_callback -#define CyaSSL_set_locking_callback wolfSSL_set_locking_callback -#define CyaSSL_num_locks wolfSSL_num_locks - -#define CyaSSL_X509_STORE_CTX_get_current_cert wolfSSL_X509_STORE_CTX_get_current_cert -#define CyaSSL_X509_STORE_CTX_get_error wolfSSL_X509_STORE_CTX_get_error -#define CyaSSL_X509_STORE_CTX_get_error_depth wolfSSL_X509_STORE_CTX_get_error_depth - -#define CyaSSL_X509_NAME_oneline wolfSSL_X509_NAME_oneline -#define CyaSSL_X509_get_issuer_name wolfSSL_X509_get_issuer_name -#define CyaSSL_X509_get_subject_name wolfSSL_X509_get_subject_name -#define CyaSSL_X509_ext_isSet_by_NID wolfSSL_X509_ext_isSet_by_NID -#define CyaSSL_X509_ext_get_critical_by_NID wolfSSL_X509_ext_get_critical_by_NID -#define CyaSSL_X509_get_isCA wolfSSL_X509_get_isCA -#define CyaSSL_X509_get_isSet_pathLength wolfSSL_X509_get_isSet_pathLength -#define CyaSSL_X509_get_pathLength wolfSSL_X509_get_pathLength -#define CyaSSL_X509_get_keyUsage wolfSSL_X509_get_keyUsage -#define CyaSSL_X509_get_authorityKeyID wolfSSL_X509_get_authorityKeyID -#define CyaSSL_X509_get_subjectKeyID wolfSSL_X509_get_subjectKeyID -#define CyaSSL_X509_NAME_entry_count wolfSSL_X509_NAME_entry_count -#define CyaSSL_X509_NAME_get_text_by_NID wolfSSL_X509_NAME_get_text_by_NID -#define CyaSSL_X509_verify_cert wolfSSL_X509_verify_cert -#define CyaSSL_X509_verify_cert_error_string wolfSSL_X509_verify_cert_error_string -#define CyaSSL_X509_get_signature_type wolfSSL_X509_get_signature_type -#define CyaSSL_X509_get_signature wolfSSL_X509_get_signature - -#define CyaSSL_X509_LOOKUP_add_dir wolfSSL_X509_LOOKUP_add_dir -#define CyaSSL_X509_LOOKUP_load_file wolfSSL_X509_LOOKUP_load_file -#define CyaSSL_X509_LOOKUP_hash_dir wolfSSL_X509_LOOKUP_hash_dir -#define CyaSSL_X509_LOOKUP_file wolfSSL_X509_LOOKUP_file - -#define CyaSSL_X509_STORE_add_lookup wolfSSL_X509_STORE_add_lookup -#define CyaSSL_X509_STORE_new wolfSSL_X509_STORE_new -#define CyaSSL_X509_STORE_free wolfSSL_X509_STORE_free -#define CyaSSL_X509_STORE_add_cert wolfSSL_X509_STORE_add_cert -#define CyaSSL_X509_STORE_set_default_paths wolfSSL_X509_STORE_set_default_paths -#define CyaSSL_X509_STORE_get_by_subject wolfSSL_X509_STORE_get_by_subject -#define CyaSSL_X509_STORE_CTX_new wolfSSL_X509_STORE_CTX_new -#define CyaSSL_X509_STORE_CTX_init wolfSSL_X509_STORE_CTX_init -#define CyaSSL_X509_STORE_CTX_free wolfSSL_X509_STORE_CTX_free -#define CyaSSL_X509_STORE_CTX_cleanup wolfSSL_X509_STORE_CTX_cleanup - -#define CyaSSL_X509_CRL_get_lastUpdate wolfSSL_X509_CRL_get_lastUpdate -#define CyaSSL_X509_CRL_get_nextUpdate wolfSSL_X509_CRL_get_nextUpdate - -#define CyaSSL_X509_get_pubkey wolfSSL_X509_get_pubkey -#define CyaSSL_X509_CRL_verify wolfSSL_X509_CRL_verify -#define CyaSSL_X509_STORE_CTX_set_error wolfSSL_X509_STORE_CTX_set_error -#define CyaSSL_X509_OBJECT_free_contents wolfSSL_X509_OBJECT_free_contents -#define CyaSSL_EVP_PKEY_free wolfSSL_EVP_PKEY_free -#define CyaSSL_X509_cmp_current_time wolfSSL_X509_cmp_current_time -#define CyaSSL_sk_X509_REVOKED_num wolfSSL_sk_X509_REVOKED_num - -#define CyaSSL_X509_CRL_get_REVOKED wolfSSL_X509_CRL_get_REVOKED -#define CyaSSL_sk_X509_REVOKED_value wolfSSL_sk_X509_REVOKED_value -#define CyaSSL_X509_get_serialNumber wolfSSL_X509_get_serialNumber -#define CyaSSL_ASN1_TIME_print wolfSSL_ASN1_TIME_print -#define CyaSSL_ASN1_INTEGER_cmp wolfSSL_ASN1_INTEGER_cmp -#define CyaSSL_ASN1_INTEGER_get wolfSSL_ASN1_INTEGER_get -#define CyaSSL_load_client_CA_file wolfSSL_load_client_CA_file -#define CyaSSL_CTX_set_client_CA_list wolfSSL_CTX_set_client_CA_list -#define CyaSSL_X509_STORE_CTX_get_ex_data wolfSSL_X509_STORE_CTX_get_ex_data -#define CyaSSL_get_ex_data_X509_STORE_CTX_idx wolfSSL_get_ex_data_X509_STORE_CTX_idx -#define CyaSSL_get_ex_data wolfSSL_get_ex_data - -#define CyaSSL_CTX_set_default_passwd_cb_userdata wolfSSL_CTX_set_default_passwd_cb_userdata -#define CyaSSL_CTX_set_default_passwd_cb wolfSSL_CTX_set_default_passwd_cb -#define CyaSSL_CTX_set_info_callback wolfSSL_CTX_set_info_callback -#define CyaSSL_ERR_peek_error wolfSSL_ERR_peek_error -#define CyaSSL_GET_REASON wolfSSL_GET_REASON -#define CyaSSL_alert_type_string_long wolfSSL_alert_type_string_long -#define CyaSSL_alert_desc_string_long wolfSSL_alert_desc_string_long -#define CyaSSL_state_string_long wolfSSL_state_string_long - -#define CyaSSL_RSA_generate_key wolfSSL_RSA_generate_key -#define CyaSSL_CTX_set_tmp_rsa_callback wolfSSL_CTX_set_tmp_rsa_callback -#define CyaSSL_PEM_def_callback wolfSSL_PEM_def_callback -#define CyaSSL_CTX_sess_accept wolfSSL_CTX_sess_accept -#define CyaSSL_CTX_sess_connect wolfSSL_CTX_sess_connect -#define CyaSSL_CTX_sess_accept_good wolfSSL_CTX_sess_accept_good -#define CyaSSL_CTX_sess_connect_good wolfSSL_CTX_sess_connect_good -#define CyaSSL_CTX_sess_accept_renegotiate wolfSSL_CTX_sess_accept_renegotiate -#define CyaSSL_CTX_sess_connect_renegotiate wolfSSL_CTX_sess_connect_renegotiate -#define CyaSSL_CTX_sess_hits wolfSSL_CTX_sess_hits -#define CyaSSL_CTX_sess_cb_hits wolfSSL_CTX_sess_cb_hits -#define CyaSSL_CTX_sess_cache_full wolfSSL_CTX_sess_cache_full -#define CyaSSL_CTX_sess_misses wolfSSL_CTX_sess_misses -#define CyaSSL_CTX_sess_timeouts wolfSSL_CTX_sess_timeouts -#define CyaSSL_CTX_sess_number wolfSSL_CTX_sess_number -#define CyaSSL_CTX_sess_get_cache_size wolfSSL_CTX_sess_get_cache_size - - - -/* src/keys.c */ -#define cyassl_triple_des wolfssl_triple_des - -/* Initialization and Shutdown */ -#define CyaSSL_Init wolfSSL_Init -#define CyaSSL_library_init wolfSSL_library_init -#define CyaSSL_Cleanup wolfSSL_Cleanup -#define CyaSSL_shutdown wolfSSL_shutdown - -/* Certs and keys */ -#define CyaSSL_SetTmpDH wolfSSL_SetTmpDH -#define CyaSSL_KeepArrays wolfSSL_KeepArrays -#define CyaSSL_FreeArrays wolfSSL_FreeArrays -#define CyaSSL_SetTmpDH_file wolfSSL_SetTmpDH_file -#define CyaSSL_use_PrivateKey_buffer wolfSSL_use_PrivateKey_buffer -#define CyaSSL_use_certificate_buffer wolfSSL_use_certificate_buffer -#define CyaSSL_CTX_load_verify_buffer wolfSSL_CTX_load_verify_buffer -#define CyaSSL_CTX_use_PrivateKey_file wolfSSL_CTX_use_PrivateKey_file -#define CyaSSL_CTX_use_certificate_file wolfSSL_CTX_use_certificate_file -#define CyaSSL_CTX_use_PrivateKey_buffer wolfSSL_CTX_use_PrivateKey_buffer -#define CyaSSL_CTX_use_certificate_buffer wolfSSL_CTX_use_certificate_buffer -#define CyaSSL_use_certificate_chain_buffer wolfSSL_use_certificate_chain_buffer -#define CyaSSL_CTX_der_load_verify_locations \ - wolfSSL_CTX_der_load_verify_locations -#define CyaSSL_CTX_use_certificate_chain_file \ - wolfSSL_CTX_use_certificate_chain_file -#define CyaSSL_CTX_use_certificate_chain_buffer \ - wolfSSL_CTX_use_certificate_chain_buffer - -/* Context and Session Setup*/ -#define CyaSSL_new wolfSSL_new -#define CyaSSL_free wolfSSL_free -#define CyaSSL_set_fd wolfSSL_set_fd -#define CyaSSL_CTX_new wolfSSL_CTX_new -#define CyaSSL_CTX_free wolfSSL_CTX_free -#define CyaSSL_SetVersion wolfSSL_SetVersion -#define CyaSSL_set_verify wolfSSL_set_verify -#define CyaSSL_set_session wolfSSL_set_session -#define CyaSSL_set_timeout wolfSSL_set_timeout -#define CyaSSL_CTX_set_verify wolfSSL_CTX_set_verify -#define CyaSSL_CTX_set_timeout wolfSSL_CTX_set_timeout -#define CyaSSL_set_cipher_list wolfSSL_set_cipher_list -#define CyaSSL_set_compression wolfSSL_set_compression -#define CyaTLSv1_client_method wolfTLSv1_client_method -#define CyaTLSv1_server_method wolfTLSv1_server_method -#define CyaSSLv3_client_method wolfSSLv3_client_method -#define CyaSSLv3_server_method wolfSSLv3_server_method -#define CyaSSLv23_client_method wolfSSLv23_client_method -#define CyaSSLv23_server_method wolfSSLv23_server_method -#define CyaDTLSv1_client_method wolfDTLSv1_client_method -#define CyaDTLSv1_server_method wolfDTLSv1_server_method -#define CyaSSL_check_domain_name wolfSSL_check_domain_name -#define CyaTLSv1_1_client_method wolfTLSv1_1_client_method -#define CyaTLSv1_1_server_method wolfTLSv1_1_server_method -#define CyaTLSv1_2_client_method wolfTLSv1_2_client_method -#define CyaTLSv1_2_server_method wolfTLSv1_2_server_method -#define CyaDTLSv1_2_client_method wolfDTLSv1_2_client_method -#define CyaDTLSv1_2_server_method wolfDTLSv1_2_server_method -#define CyaSSL_set_group_messages wolfSSL_set_group_messages -#define CyaSSL_CTX_set_cipher_list wolfSSL_CTX_set_cipher_list -#define CyaSSL_CTX_set_group_messages wolfSSL_CTX_set_group_messages -#define CyaSSL_CTX_set_session_cache_mode wolfSSL_CTX_set_session_cache_mode - -/* Callbacks */ - -/* - * Empty comment denotes not listed in CyaSSL Manual - * (soon to be wolfSSL Manual) - */ - -#define CyaSSL_accept_ex wolfSSL_accept_ex -#define CyaSSL_SetIORecv wolfSSL_CTX_SetIORecv -#define CyaSSL_SetIOSend wolfSSL_CTX_SetIOSend -#define CyaSSL_connect_ex wolfSSL_connect_ex -#define CyaSSL_CTX_SetCACb wolfSSL_CTX_SetCACb -#define CyaSSL_SetIOReadCtx wolfSSL_SetIOReadCtx -#define CyaSSL_SetRsaEncCtx wolfSSL_SetRsaEncCtx -#define CyaSSL_GetRsaEncCtx wolfSSL_GetRsaEncCtx -#define CyaSSL_SetRsaDecCtx wolfSSL_SetRsaDecCtx -#define CyaSSL_GetRsaDecCtx wolfSSL_GetRsaDecCtx -#define CyaSSL_SetLoggingCb wolfSSL_SetLoggingCb -#define CyaSSL_SetEccSignCtx wolfSSL_SetEccSignCtx -#define CyaSSL_GetEccSignCtx wolfSSL_GetEccSignCtx -#define CyaSSL_SetRsaSignCtx wolfSSL_SetRsaSignCtx -#define CyaSSL_GetRsaSignCtx wolfSSL_GetRsaSignCtx -#define CyaSSL_SetIOWriteCtx wolfSSL_SetIOWriteCtx -#define CyaSSL_SetIOReadFlags wolfSSL_SetIOReadFlags -#define CyaSSL_SetEccVerifyCtx wolfSSL_SetEccVerifyCtx -#define CyaSSL_GetEccVerifyCtx wolfSSL_GetEccVerifyCtx -#define CyaSSL_SetRsaVerifyCtx wolfSSL_SetRsaVerifyCtx -#define CyaSSL_GetRsaVerifyCtx wolfSSL_GetRsaVerifyCtx -#define CyaSSL_CTX_SetRsaEncCb wolfSSL_CTX_SetRsaEncCb -#define CyaSSL_CTX_SetRsaDecCb wolfSSL_CTX_SetRsaDecCb -#define CyaSSL_SetIOWriteFlags wolfSSL_SetIOWriteFlags -#define CyaSSL_SetTlsHmacInner wolfSSL_SetTlsHmacInner -#define CyaSSL_SetMacEncryptCtx wolfSSL_SetMacEncryptCtx -#define CyaSSL_GetMacEncryptCtx wolfSSL_GetMacEncryptCtx -#define CyaSSL_CTX_SetEccSignCb wolfSSL_CTX_SetEccSignCb -#define CyaSSL_CTX_SetRsaSignCb wolfSSL_CTX_SetRsaSignCb -#define CyaSSL_CTX_SetEccVerifyCb wolfSSL_CTX_SetEccVerifyCb -#define CyaSSL_CTX_SetRsaVerifyCb wolfSSL_CTX_SetRsaVerifyCb -#define CyaSSL_CTX_SetMacEncryptCb wolfSSL_CTX_SetMacEncryptCb -#define CyaSSL_SetDecryptVerifyCtx wolfSSL_SetDecryptVerifyCtx -#define CyaSSL_GetDecryptVerifyCtx wolfSSL_GetDecryptVerifyCtx -#define CyaSSL_CTX_SetDecryptVerifyCb wolfSSL_CTX_SetDecryptVerifyCb - -/* psk specific */ -#ifndef NO_PSK - -#define CyaSSL_get_psk_identity wolfSSL_get_psk_identity /**/ -#define CyaSSL_get_psk_identity_hint wolfSSL_get_psk_identity_hint /**/ -#define CyaSSL_use_psk_identity_hint wolfSSL_use_psk_identity_hint /**/ -#define CyaSSL_set_psk_client_callback wolfSSL_set_psk_client_callback /**/ -#define CyaSSL_set_psk_server_callback wolfSSL_set_psk_server_callback /**/ -#define CyaSSL_CTX_use_psk_identity_hint wolfSSL_CTX_use_psk_identity_hint /**/ -#define CyaSSL_CTX_set_psk_client_callback \ - wolfSSL_CTX_set_psk_client_callback /**/ -#define CyaSSL_CTX_set_psk_server_callback \ - wolfSSL_CTX_set_psk_server_callback /**/ - -#endif -/* end psk specific */ - -/* Anonymous */ -#define CyaSSL_CTX_allow_anon_cipher wolfSSL_CTX_allow_anon_cipher /**/ - -/* Error Handling and Debugging*/ -#define CyaSSL_get_error wolfSSL_get_error -#define CyaSSL_want_read wolfSSL_want_read -#define CyaSSL_want_write wolfSSL_want_write -#define CyaSSL_Debugging_ON wolfSSL_Debugging_ON -#define CyaSSL_Debugging_OFF wolfSSL_Debugging_OFF -#define CyaSSL_ERR_error_string wolfSSL_ERR_error_string -#define CyaSSL_load_error_strings wolfSSL_load_error_strings -#define CyaSSL_ERR_error_string_n wolfSSL_ERR_error_string_n -#define CyaSSL_ERR_print_errors_fp wolfSSL_ERR_print_errors_fp - -/* OCSP and CRL */ - -/* - * Empty comment denotes not listed in CyaSSL Manual - * (soon to be wolfSSL Manual) - */ - -#define CYASSL_CRL_MONITOR WOLFSSL_CRL_MONITOR /**/ -#define CYASSL_CRL_START_MON WOLFSSL_CRL_START_MON /**/ -#define CYASSL_OCSP_NO_NONCE WOLFSSL_OCSP_NO_NONCE /**/ -#define CYASSL_OCSP_URL_OVERRIDE WOLFSSL_OCSP_URL_OVERRIDE -#define CYASSL_OCSP_CHECKALL WOLFSSL_OCSP_CHECKALL - -#define CyaSSL_CTX_EnableOCSP wolfSSL_CTX_EnableOCSP -#define CyaSSL_CTX_OCSP_set_options wolfSSL_CTX_OCSP_set_options /**/ -#define CyaSSL_CTX_SetOCSP_OverrideURL wolfSSL_CTX_SetOCSP_OverrideURL /**/ -#define CyaSSL_CTX_OCSP_set_override_url wolfSSL_CTX_OCSP_set_override_url /**/ - -/* Informational */ -#define CyaSSL_GetSide wolfSSL_GetSide -#define CyaSSL_IsTLSv1_1 wolfSSL_IsTLSv1_1 -#define CyaSSL_GetKeySize wolfSSL_GetKeySize -#define CyaSSL_GetHmacSize wolfSSL_GetHmacSize -#define CyaSSL_GetHmacType wolfSSL_GetHmacType -#define CyaSSL_GetMacSecret wolfSSL_GetMacSecret -#define CyaSSL_GetObjectSize wolfSSL_GetObjectSize -#define CyaSSL_GetBulkCipher wolfSSL_GetBulkCipher -#define CyaSSL_GetCipherType wolfSSL_GetCipherType -#define CyaSSL_GetAeadMacSize wolfSSL_GetAeadMacSize -#define CyaSSL_GetClientWriteIV wolfSSL_GetClientWriteIV -#define CyaSSL_GetServerWriteIV wolfSSL_GetServerWriteIV -#define CyaSSL_GetClientWriteKey wolfSSL_GetClientWriteKey -#define CyaSSL_GetServerWriteKey wolfSSL_GetServerWriteKey -#define CyaSSL_GetCipherBlockSize wolfSSL_GetCipherBlockSize - -/* Connection, Session, and I/O */ -#define CyaSSL_peek wolfSSL_peek -#define CyaSSL_read wolfSSL_read -#define CyaSSL_recv wolfSSL_recv -#define CyaSSL_send wolfSSL_send -#define CyaSSL_write wolfSSL_write -#define CyaSSL_writev wolfSSL_writev -#define CyaSSL_accept wolfSSL_accept -#define CyaSSL_get_fd wolfSSL_get_fd -#define CyaSSL_connect wolfSSL_connect -#define CyaSSL_pending wolfSSL_pending -#define CyaSSL_negotiate wolfSSL_negotiate -#define CyaSSL_get_session wolfSSL_get_session -#define CyaSSL_connect_cert wolfSSL_connect_cert -#define CyaSSL_flush_sessions wolfSSL_flush_sessions -#define CyaSSL_get_using_nonblock wolfSSL_get_using_nonblock -#define CyaSSL_PrintSessionStats wolfSSL_PrintSessionStats - -/* DTLS Specific */ -#define CyaSSL_dtls wolfSSL_dtls -#define CyaSSL_dtls_set_peer wolfSSL_dtls_set_peer -#define CyaSSL_dtls_get_peer wolfSSL_dtls_get_peer -#define CyaSSL_dtls_got_timeout wolfSSL_dtls_got_timeout -#define CyaSSL_dtls_get_current_timeout wolfSSL_dtls_get_current_timeout -#define CyaSSL_set_using_nonblock wolfSSL_dtls_set_using_nonblock - -/* Certificate Manager */ -#define CyaSSL_CertManagerNew wolfSSL_CertManagerNew -#define CyaSSL_CertManagerFree wolfSSL_CertManagerFree -#define CyaSSL_CertManagerLoadCA wolfSSL_CertManagerLoadCA -#define CyaSSL_CertManagerVerify wolfSSL_CertManagerVerify -#define CyaSSL_CertManagerEnableCRL wolfSSL_CertManagerEnableCRL -#define CyaSSL_CertManagerDisableCRL wolfSSL_CertManagerDisableCRL -#define CyaSSL_CertManagerVerifyBuffer wolfSSL_CertManagerVerifyBuffer -#ifndef NO_CERTS - #define CyaSSL_CertManagerCheckCRL wolfSSL_CertManagerCheckCRL - #define CyaSSL_CertManagerLoadCRL wolfSSL_CertManagerLoadCRL - #define CyaSSL_CertManagerSetCRL_Cb wolfSSL_CertManagerSetCRL_Cb - #define CyaSSL_CertManagerCheckOCSP wolfSSL_CertManagerCheckOCSP - #define CyaSSL_CertManagerSetOCSP_Cb wolfSSL_CertManagerSetOCSP_Cb - #define CyaSSL_CertManagerSetOCSPOverrideURL \ - wolfSSL_CertManagerSetOCSPOverrideURL - - #define CyaSSL_DisableCRL wolfSSL_DisableCRL - #define CyaSSL_EnableOCSP wolfSSL_EnableOCSP - #define CyaSSL_DisableOCSP wolfSSL_DisableOCSP - #define CyaSSL_SetOCSP_OverrideURL wolfSSL_SetOCSP_OverrideURL - #define CyaSSL_SetOCSP_Cb wolfSSL_SetOCSP_Cb - - #define CyaSSL_CTX_EnableCRL wolfSSL_CTX_EnableCRL - #define CyaSSL_CTX_DisableCRL wolfSSL_CTX_DisableCRL - #define CyaSSL_CTX_LoadCRL wolfSSL_CTX_LoadCRL - #define CyaSSL_CTX_SetCRL_Cb wolfSSL_CTX_SetCRL_Cb - #define CyaSSL_CTX_DisableOCSP wolfSSL_CTX_DisableOCSP - #define CyaSSL_CTX_SetOCSP_Cb wolfSSL_CTX_SetOCSP_Cb -#endif /* !NO_CERTS */ - - -/* OpenSSL Compatibility Layer */ -#define CyaSSL_get_sessionID wolfSSL_get_sessionID -#define CyaSSL_get_peer_count wolfSSL_get_peer_count -#define CyaSSL_get_chain_cert wolfSSL_get_chain_cert -#define CyaSSL_get_peer_chain wolfSSL_get_peer_chain -#define CyaSSL_get_peer_length wolfSSL_get_peer_length -#define CyaSSL_get_chain_cert_pem wolfSSL_get_chain_cert_pem -#define CyaSSL_use_PrivateKey_file wolfSSL_use_PrivateKey_file -#define CyaSSL_use_certificate_file wolfSSL_use_certificate_file -#define CyaSSL_use_RSAPrivateKey_file wolfSSL_use_RSAPrivateKey_file -#define CyaSSL_X509_get_serial_number wolfSSL_X509_get_serial_number -#define CyaSSL_CTX_use_RSAPrivateKey_file wolfSSL_CTX_use_RSAPrivateKey_file -#define CyaSSL_use_certificate_chain_file wolfSSL_use_certificate_chain_file - -/* TLS Extensions */ -#define CYASSL_SNI_HOST_NAME WOLFSSL_SNI_HOST_NAME - -#define CyaSSL_UseSNI wolfSSL_UseSNI -#define CyaSSL_CTX_UseSNI wolfSSL_CTX_UseSNI -#define CyaSSL_SNI_SetOptions wolfSSL_SNI_SetOptions -#define CyaSSL_SNI_GetRequest wolfSSL_SNI_GetRequest -#define CyaSSL_UseMaxFragment wolfSSL_UseMaxFragment -#define CyaSSL_UseTruncatedHMAC wolfSSL_UseTruncatedHMAC -#define CyaSSL_UseSupportedCurve wolfSSL_UseSupportedCurve -#define CyaSSL_SNI_GetFromBuffer wolfSSL_SNI_GetFromBuffer -#define CyaSSL_CTX_SNI_SetOptions wolfSSL_CTX_SNI_SetOptions -#define CyaSSL_CTX_UseMaxFragment wolfSSL_CTX_UseMaxFragment -#define CyaSSL_CTX_UseTruncatedHMAC wolfSSL_CTX_UseTruncatedHMAC -#define CyaSSL_CTX_UseSupportedCurve wolfSSL_CTX_UseSupportedCurve - -/* End wolfssl -> cyassl -> openssl compatibility */ - -/* JRB macro redefinitions and api calls for cryptography for reverse compat. */ - -#ifdef WOLFSSL_SMALL_STACK - #define CYASSL_SMALL_STACK -#endif - - -/* - * wrapper around macros until they are changed in cyassl code - * needs investigation in regards to macros in fips - */ -#ifdef NO_CYASSL_ALLOC_ALIGN -#define NO_WOLFSSL_ALLOC_ALIGN NO_CYASSL_ALLOC_ALIGN -#endif - - -/* examples/client/client.h */ -#define CYASSL_THREAD WOLFSSL_THREAD -#ifdef WOLFSSL_DTLS - #define CYASSL_DTLS WOLFSSL_DTLS -#endif - -/* examples/client/client.c */ -#define LIBCYASSL_VERSION_STRING LIBWOLFSSL_VERSION_STRING - -#ifdef __cplusplus - } /* extern "C" */ -#endif - - -#endif /* CyaSSL_openssl_h__ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/test.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/test.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/test.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/test.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -/* test.h */ - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/version.h mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/version.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/version.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/version.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -/* cyassl/version.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include - -#define LIBCYASSL_VERSION_STRING LIBWOLFSSL_VERSION_STRING -#define LIBCYASSL_VERSION_HEX LIBWOLFSSL_VERSION_HEX - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/version.h.in mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/version.h.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/cyassl/version.h.in 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/cyassl/version.h.in 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -/* cyassl_version.h.in - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/debian/changelog.in mariadb-10.11.9/extra/wolfssl/wolfssl/debian/changelog.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/debian/changelog.in 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/debian/changelog.in 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,7 @@ +wolfssl (@VERSION@) stable; urgency=medium + + * For a full changelog see + https://github.com/wolfSSL/wolfssl/blob/master/ChangeLog.md + + -- wolfSSL @WOLFSSL_BUILD_DATE@ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/debian/control.in mariadb-10.11.9/extra/wolfssl/wolfssl/debian/control.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/debian/control.in 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/debian/control.in 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,44 @@ +Source: wolfssl +Maintainer: wolfSSL +Section: libs +Priority: optional +Standards-Version: 4.6.2 +Build-Depends: debhelper-compat (= 13) +Vcs-Git: https://github.com/wolfSSL/wolfssl.git +Vcs-browser: https://github.com/wolfSSL/wolfssl +Homepage: https://www.wolfssl.com/ + +Package: libwolfssl +Architecture: any +Section: libs +Priority: optional +Pre-Depends: +Depends: + ${shlibs:Depends}, + ${misc:Depends} +Description: wolfSSL encryption library + The wolfSSL embedded SSL library (formerly CyaSSL) is a lightweight SSL/TLS + library written in ANSI C and targeted for embedded, RTOS, and + resource-constrained environments - primarily because of its small size, speed, + and feature set. It is commonly used in standard operating environments as well + because of its royalty-free pricing and excellent cross platform support. + wolfSSL supports industry standards up to the current TLS 1.3 and DTLS 1.3 + levels. + +Package: libwolfssl-dev +Architecture: any +Section: libdevel +Priority: optional +Pre-Depends: +Depends: + libwolfssl (= ${binary:Version}), + ${misc:Depends} +Description: wolfSSL encryption library + The wolfSSL embedded SSL library (formerly CyaSSL) is a lightweight SSL/TLS + library written in ANSI C and targeted for embedded, RTOS, and + resource-constrained environments - primarily because of its small size, speed, + and feature set. It is commonly used in standard operating environments as well + because of its royalty-free pricing and excellent cross platform support. + wolfSSL supports industry standards up to the current TLS 1.3 and DTLS 1.3 + levels. + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/debian/copyright mariadb-10.11.9/extra/wolfssl/wolfssl/debian/copyright --- mariadb-10.11.6/extra/wolfssl/wolfssl/debian/copyright 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/debian/copyright 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,217 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: wolfssl +Upstream-Contact: David Garske +Source: https://github.com/wolfssl/wolfssl/releases + +Files: + * +Copyright: + 2006-2023 wolfSSL Inc. +License: GPL-2+ + +Files: + zephyr/Kconfig +Copyright: + 2016 Intel Corporation +License: Apache-2.0 + +Files: + zephyr/Kconfig.tls-generic +Copyright: + 2018 Intel Corporation + 2018 Nordic Semiconductor ASA +License: Apache-2.0 + +Files: + wolfcrypt/src/camellia.c + wolfssl/wolfcrypt/camellia.h +Copyright: + 2006-2007 NTT (Nippon Telegraph and Telephone Corporation) + 2006-2016 wolfSSL Inc. +License: GPL-2+ + +Files: + m4/ax_append_link_flags.m4 +Copyright: + 2011 Maarten Bosmans +License: GPL-3+-with-autoconf + +Files: + m4/ax_pthread.m4 +Copyright: + 2008 Steven G. Johnson + 2011 Daniel Richard G. +License: GPL-3+-with-autoconf + +Files: + m4/ax_check_library.m4 +Copyright: + 2012 Brian Aker + 2010 Diego Elio Petteno` +License: GPL-3+-with-autoconf + +Files: + m4/ax_append_flag.m4 + m4/ax_check_compile_flag.m4 + m4/ax_check_link_flag.m4 +Copyright: + 2008 Guido U. Draheim + 2011 Maarten Bosmans +License: GPL-3+-with-autoconf + +Files: + m4/ax_append_compile_flags.m4 +Copyright: + 2011 Maarten Bosmans +License: GPL-3+-with-autoconf + +Files: + m4/ax_tls.m4 +Copyright: + 2008 Alan Woodland + 2010 Diego Elio Petteno` +License: GPL-3+-with-autoconf + +Files: + m4/ax_create_generic_config.m4 +Copyright: + 2008 Guido U. Draheim +License: GPL-3+-with-autoconf + +Files: + m4/ax_compiler_version.m4 + m4/ax_debug.m4 + m4/ax_harden_compiler_flags.m4 + m4/ax_vcs_checkout.m4 +Copyright: + 2012 Brian Aker +License: BSD-3-clause + +Files: + m4/ax_append_to_file.m4 + m4/ax_file_escapes.m4 + m4/ax_print_to_file.m4 +Copyright: + 2008 Tom Howard +License: FSFAP + +Files: + m4/ax_am_macros.m4 +Copyright: + 2009 Tom Howard + 2008 Michael Paul Bailey + 2008 Christophe Tournayre +License: FSFAP + +Files: + debian/* +Copyright: + 2014-2022 Felix Lechner +License: GPL-2+ + + +License: FSFAP + Copying and distribution of this file, with or without modification, are + permitted in any medium without royalty provided the copyright notice + and this notice are preserved. This file is offered as-is, without any + warranty. + + +License: GPL-2+ + This package 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 of the License, or + (at your option) any later version. + . + This package 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 + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". + + +License: GPL-3+-with-autoconf + 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 3 of the License, 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, the respective Autoconf Macro's copyright owner + gives unlimited permission to copy, distribute and modify the configure + scripts that are the output of Autoconf when processing the Macro. You + need not follow the terms of the GNU General Public License when using + or distributing such scripts, even though portions of the text of the + Macro appear in them. The GNU General Public License (GPL) does govern + all other use of the material that constitutes the Autoconf Macro. + . + This special exception to the GPL applies to versions of the Autoconf + Macro released by the Autoconf Archive. When you make and distribute a + modified version of the Autoconf Macro, you may extend this special + exception to the GPL to apply to your modified version as well. + + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + . + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + . + * The names of its contributors may not be used to endorse or + promote products derived from this software without specific prior + written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER 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. + + +License: Apache-2.0 + On modern Debian systems, the text of this license can be found + at: /usr/share/common-licenses/Apache-2.0 + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/debian/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/debian/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/debian/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/debian/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,77 @@ +# vim:ft=automake + +DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) + +deb: +# Setup meta folders + mkdir -p debian/libwolfssl/DEBIAN debian/libwolfssl-dev/DEBIAN +# "Install" wolfSSL + make install exec_prefix=$(CURDIR)/debian/libwolfssl/usr \ + prefix=$(CURDIR)/debian/libwolfssl-dev/usr +# deb shared lib stuff + fakeroot dh_makeshlibs + dh_shlibdeps + dh_installdeb +# Generate the lib and src descriptions + fakeroot dh_gencontrol +# Make adjustments to the package structure and to satisfy lintian checks +# Correct doc dir name + @rm -rf debian/libwolfssl-dev/usr/share/doc/libwolfssl-dev + @mv debian/libwolfssl-dev/usr/share/doc/wolfssl \ + debian/libwolfssl-dev/usr/share/doc/libwolfssl-dev +# Clear lib folder + @rm -rf debian/libwolfssl-dev/usr/lib + @mkdir -p debian/libwolfssl-dev/usr/lib +# Move the top level .so into the dev pkg + @mv debian/libwolfssl/usr/lib/libwolfssl.so debian/libwolfssl-dev/usr/lib +# Create correct pkg doc dir + @rm -rf debian/libwolfssl/usr/share/doc/libwolfssl + @mkdir -p debian/libwolfssl/usr/share/doc/libwolfssl +# Place changelog + @gzip -n -9 -c debian/changelog | \ + tee debian/libwolfssl/usr/share/doc/libwolfssl/changelog.gz > \ + debian/libwolfssl-dev/usr/share/doc/libwolfssl-dev/changelog.gz +# Place copyright + @cp debian/copyright debian/libwolfssl/usr/share/doc/libwolfssl + @cp debian/copyright debian/libwolfssl-dev/usr/share/doc/libwolfssl-dev +# Remove .la file https://wiki.debian.org/ReleaseGoals/LAFileRemoval + @rm debian/libwolfssl/usr/lib/libwolfssl.la +# Strip unwanted symbols +# https://www.debian.org/doc/debian-policy/ch-files.html#binaries + @strip --strip-unneeded debian/libwolfssl/usr/lib/libwolfssl.so.*.*.* +# Place pkgconfig so that it is available for cross-compilation +# https://lintian.debian.org/tags/pkg-config-unavailable-for-cross-compilation + @rm -rf debian/libwolfssl/usr/lib/$(DEB_HOST_MULTIARCH) + @mkdir -p debian/libwolfssl/usr/lib/$(DEB_HOST_MULTIARCH) + @mv debian/libwolfssl/usr/lib/pkgconfig \ + debian/libwolfssl/usr/lib/$(DEB_HOST_MULTIARCH) +# Set the expected access rules + @chmod 644 debian/libwolfssl/usr/lib/libwolfssl.so.*.*.* + @chmod 644 debian/libwolfssl/usr/share/doc/libwolfssl/changelog.gz \ + debian/libwolfssl/usr/share/doc/libwolfssl/copyright \ + debian/libwolfssl-dev/usr/share/doc/libwolfssl-dev/changelog.gz \ + debian/libwolfssl-dev/usr/share/doc/libwolfssl-dev/copyright +# Do this as the last step to mark all directories with the correct access bits + @find debian/libwolfssl*/usr -type d | xargs chmod 755 +# Generate debs + dpkg-deb --root-owner-group -b debian/libwolfssl . + dpkg-deb --root-owner-group -b debian/libwolfssl-dev . +# Check that everything is correct with lintian +# - we don't provide a manual page for wolfssl-config +# - we don't care about matching the soname for our debs + lintian *.deb --fail-on error,warning --tag-display-limit 0 \ + --suppress-tags no-manual-page,package-name-doesnt-match-sonames +# Clean up the working dirs + make deb-clean + +deb-docker: + docker build -t "debian-builder:Dockerfile" Docker/packaging/debian + docker run --rm -v $(CURDIR):/opt/wolfssl debian-builder:Dockerfile \ + bash -c 'cd /opt/wolfssl && ./config.status --recheck && make deb && \ + make clean deb-clean &> /dev/null' +# To allow the user to keep using the configuration on the host + @./config.status --recheck &> /dev/null + +deb-clean: + rm -rf debian/libwolfssl debian/libwolfssl-dev debian/files \ + debian/*.substvars debian/.debhelper diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/QUIC.md mariadb-10.11.9/extra/wolfssl/wolfssl/doc/QUIC.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/QUIC.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/QUIC.md 2024-08-03 07:30:00.000000000 +0000 @@ -57,7 +57,7 @@ The separation of QUIC's "crypto" parts from its other protocol enabling functions is a matter of security. In its experimental beginnings, QUIC had its own security design. With the emerging TLSv1.3 and all it improvements, plus decades of experience, it seemed rather unwise to have something separate in QUIC. -Therefore, the complete TLSv1.3 handshake became part of the QUIC protocol, with some restrictions and simplifications (UDP based QUIC does not accommodate broken TCP middle boxes). With the need for a complete TLSv1.3 stack, QUIC implementors happily make use of existing TLS libraries. +Therefore, the complete TLSv1.3 handshake became part of the QUIC protocol, with some restrictions and simplifications (UDP based QUIC does not accommodate broken TCP middle boxes). With the need for a complete TLSv1.3 stack, QUIC implementers happily make use of existing TLS libraries. ## wolfSSL API diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/check_api.sh mariadb-10.11.9/extra/wolfssl/wolfssl/doc/check_api.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/check_api.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/check_api.sh 2024-08-03 07:30:00.000000000 +0000 @@ -21,7 +21,7 @@ api_count="$(wc -l < dox_api.txt)" match_count="$(grep -Ff dox_api.txt wolf_api.txt | wc -l)" if [ "$api_count" != "$match_count" ]; then - echo "Mistmatch" + echo "Mismatch" echo "Dox_api: $api_count" echo "Matched_api: $match_count" echo "Header file: $h_file" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/aes.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/aes.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/aes.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/aes.h 2024-08-03 07:30:00.000000000 +0000 @@ -20,6 +20,9 @@ int ret = 0; byte key[] = { some 16, 24 or 32 byte key }; byte iv[] = { some 16 byte iv }; + if (ret = wc_AesInit(&enc, HEAP_HINT, INVALID_DEVID) != 0) { + // failed to initialize aes key + } if (ret = wc_AesSetKey(&enc, key, AES_BLOCK_SIZE, iv, AES_ENCRYPTION) != 0) { // failed to set aes key @@ -94,7 +97,8 @@ \code Aes enc; int ret = 0; - // initialize enc with AesSetKey, using direction AES_ENCRYPTION + // initialize enc with wc_AesInit and wc_AesSetKey, using direction + // AES_ENCRYPTION byte msg[AES_BLOCK_SIZE * n]; // multiple of 16 bytes // fill msg with data byte cipher[AES_BLOCK_SIZE * n]; // Some multiple of 16 bytes @@ -103,6 +107,7 @@ } \endcode + \sa wc_AesInit \sa wc_AesSetKey \sa wc_AesSetIV \sa wc_AesCbcDecrypt @@ -146,7 +151,8 @@ \code Aes dec; int ret = 0; - // initialize dec with AesSetKey, using direction AES_DECRYPTION + // initialize dec with wc_AesInit and wc_AesSetKey, using direction + // AES_DECRYPTION byte cipher[AES_BLOCK_SIZE * n]; // some multiple of 16 bytes // fill cipher with cipher text byte plain [AES_BLOCK_SIZE * n]; @@ -155,6 +161,7 @@ } \endcode + \sa wc_AesInit \sa wc_AesSetKey \sa wc_AesCbcEncrypt */ @@ -187,11 +194,10 @@ \code Aes enc; Aes dec; - // initialize enc and dec with AesSetKeyDirect, using direction - AES_ENCRYPTION - // since the underlying API only calls Encrypt and by default calling - encrypt on - // a cipher results in a decryption of the cipher + // initialize enc and dec with wc_AesInit and wc_AesSetKeyDirect, using + // direction AES_ENCRYPTION since the underlying API only calls Encrypt + // and by default calling encrypt on a cipher results in a decryption of + // the cipher byte msg[AES_BLOCK_SIZE * n]; //n being a positive integer making msg some multiple of 16 bytes @@ -229,7 +235,8 @@ _Example_ \code Aes enc; - // initialize enc with AesSetKey, using direction AES_ENCRYPTION + // initialize enc with wc_AesInit and wc_AesSetKey, using direction + // AES_ENCRYPTION byte msg [AES_BLOCK_SIZE]; // 16 bytes // initialize msg with plain text to encrypt byte cipher[AES_BLOCK_SIZE]; @@ -263,7 +270,8 @@ _Example_ \code Aes dec; - // initialize enc with AesSetKey, using direction AES_DECRYPTION + // initialize enc with wc_AesInit and wc_AesSetKey, using direction + // AES_DECRYPTION byte cipher [AES_BLOCK_SIZE]; // 16 bytes // initialize cipher with cipher text to decrypt byte msg[AES_BLOCK_SIZE]; @@ -303,6 +311,10 @@ int ret = 0; byte key[] = { some 16, 24, or 32 byte key }; byte iv[] = { some 16 byte iv }; + + if (ret = wc_AesInit(&enc, HEAP_HINT, INVALID_DEVID) != 0) { + // failed to initialize aes key + } if (ret = wc_AesSetKeyDirect(&enc, key, sizeof(key), iv, AES_ENCRYPTION) != 0) { // failed to set aes key @@ -335,6 +347,9 @@ Aes enc; int ret = 0; byte key[] = { some 16, 24,32 byte key }; + if (ret = wc_AesInit(&enc, HEAP_HINT, INVALID_DEVID) != 0) { + // failed to initialize aes key + } if (ret = wc_AesGcmSetKey(&enc, key, sizeof(key)) != 0) { // failed to set aes key } @@ -373,7 +388,7 @@ _Example_ \code Aes enc; - // initialize aes structure by calling wc_AesGcmSetKey + // initialize Aes structure by calling wc_AesInit() and wc_AesGcmSetKey byte plain[AES_BLOCK_LENGTH * n]; //n being a positive integer making plain some multiple of 16 bytes @@ -424,7 +439,8 @@ _Example_ \code Aes enc; //can use the same struct as was passed to wc_AesGcmEncrypt - // initialize aes structure by calling wc_AesGcmSetKey if not already done + // initialize aes structure by calling wc_AesInit and wc_AesGcmSetKey + // if not already done byte cipher[AES_BLOCK_LENGTH * n]; //n being a positive integer making cipher some multiple of 16 bytes @@ -529,7 +545,8 @@ Aes enc; key[] = { some 16, 24, or 32 byte length key }; - wc_AesCcmSetKey(&aes, key, sizeof(key)); + wc_AesInit(&enc, HEAP_HINT, INVALID_DEVID); // Make sure devId updated + wc_AesCcmSetKey(&enc, key, sizeof(key)); \endcode \sa wc_AesCcmEncrypt @@ -564,7 +581,7 @@ _Example_ \code Aes enc; - // initialize enc with wc_AesCcmSetKey + // initialize enc with wc_AesInit and wc_AesCcmSetKey nonce[] = { initialize nonce }; plain[] = { some plain text message }; @@ -616,7 +633,7 @@ _Example_ \code Aes dec; - // initialize dec with wc_AesCcmSetKey + // initialize dec with wc_AesInit and wc_AesCcmSetKey nonce[] = { initialize nonce }; cipher[] = { encrypted message }; @@ -644,6 +661,82 @@ /*! \ingroup AES + \brief This is to initialize an AES-XTS context. It is up to user to call + wc_AesXtsFree on aes key when done. + + \return 0 Success + + \param aes AES keys for encrypt/decrypt process + \param heap heap hint to use for memory. Can be NULL + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used + + _Example_ + \code + XtsAes aes; + + if(wc_AesXtsInit(&aes, NULL, INVALID_DEVID) != 0) + { + // Handle error + } + if(wc_AesXtsSetKeyNoInit(&aes, key, sizeof(key), AES_ENCRYPTION) != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsSetKey + \sa wc_AesXtsSetKeyNoInit + \sa wc_AesXtsEncrypt + \sa wc_AesXtsDecrypt + \sa wc_AesXtsFree +*/ +int wc_AesXtsInit(XtsAes* aes, void* heap, int devId); + + +/*! + \ingroup AES + + \brief This is to help with setting keys to correct encrypt or decrypt type, + after first calling wc_AesXtsInit(). It is up to user to call wc_AesXtsFree + on aes key when done. + + \return 0 Success + + \param aes AES keys for encrypt/decrypt process + \param key buffer holding aes key | tweak key + \param len length of key buffer in bytes. Should be twice that of + key size. + i.e. 32 for a 16 byte key. + \param dir direction, either AES_ENCRYPTION or AES_DECRYPTION + + _Example_ + \code + XtsAes aes; + + if(wc_AesXtsInit(&aes, NULL, 0) != 0) + { + // Handle error + } + if(wc_AesXtsSetKeyNoInit(&aes, key, sizeof(key), AES_ENCRYPTION, NULL, 0) + != 0) + { + // Handle error + } + wc_AesXtsFree(&aes); + \endcode + + \sa wc_AesXtsEncrypt + \sa wc_AesXtsDecrypt + \sa wc_AesXtsFree +*/ +int wc_AesXtsSetKeyNoInit(XtsAes* aes, const byte* key, + word32 len, int dir); + + +/*! + \ingroup AES + \brief This is to help with setting keys to correct encrypt or decrypt type. It is up to user to call wc_AesXtsFree on aes key when done. @@ -656,19 +749,21 @@ i.e. 32 for a 16 byte key. \param dir direction, either AES_ENCRYPTION or AES_DECRYPTION \param heap heap hint to use for memory. Can be NULL - \param devId id to use with async crypto. Can be 0 + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used _Example_ \code XtsAes aes; - if(wc_AesXtsSetKey(&aes, key, sizeof(key), AES_ENCRYPTION, NULL, 0) != 0) + if(wc_AesXtsSetKey(&aes, key, sizeof(key), AES_ENCRYPTION, NULL, INVALID_DEVID) != 0) { // Handle error } wc_AesXtsFree(&aes); \endcode + \sa wc_AesXtsInit + \sa wc_AesXtsSetKeyNoInit \sa wc_AesXtsEncrypt \sa wc_AesXtsDecrypt \sa wc_AesXtsFree @@ -709,6 +804,8 @@ \sa wc_AesXtsEncrypt \sa wc_AesXtsDecrypt + \sa wc_AesXtsInit + \sa wc_AesXtsSetKeyNoInit \sa wc_AesXtsSetKey \sa wc_AesXtsFree */ @@ -748,6 +845,8 @@ \sa wc_AesXtsEncrypt \sa wc_AesXtsDecrypt + \sa wc_AesXtsInit + \sa wc_AesXtsSetKeyNoInit \sa wc_AesXtsSetKey \sa wc_AesXtsFree */ @@ -788,6 +887,8 @@ \endcode \sa wc_AesXtsDecrypt + \sa wc_AesXtsInit + \sa wc_AesXtsSetKeyNoInit \sa wc_AesXtsSetKey \sa wc_AesXtsFree */ @@ -827,6 +928,8 @@ \endcode \sa wc_AesXtsEncrypt + \sa wc_AesXtsInit + \sa wc_AesXtsSetKeyNoInit \sa wc_AesXtsSetKey \sa wc_AesXtsFree */ @@ -855,6 +958,8 @@ \sa wc_AesXtsEncrypt \sa wc_AesXtsDecrypt + \sa wc_AesXtsInit + \sa wc_AesXtsSetKeyNoInit \sa wc_AesXtsSetKey */ int wc_AesXtsFree(XtsAes* aes); @@ -869,7 +974,7 @@ \param aes aes structure in to initialize \param heap heap hint to use for malloc / free if needed - \param devId ID to use with async hardware + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used _Example_ \code @@ -1035,7 +1140,7 @@ \return BAD_FUNC_ARG If key, SIV, or output buffer are NULL. Also returned if the key size isn't 32, 48, or 64 bytes. \return AES_SIV_AUTH_E If the SIV derived by S2V doesn't match the input - SIV (see RFC 5297 2.7). + SIV (see RFC 5297 2.7). \return Other Other negative error values returned if AES or CMAC operations fail. @@ -1072,3 +1177,553 @@ int wc_AesSivDecrypt(const byte* key, word32 keySz, const byte* assoc, word32 assocSz, const byte* nonce, word32 nonceSz, const byte* in, word32 inSz, byte* siv, byte* out); + + + + + + + +/*! + \ingroup AES + + \brief This function performs AES EAX encryption and authentication as + described in "EAX: A Conventional Authenticated-Encryption Mode" + (https://eprint.iacr.org/2003/069). It is a "one-shot" API that performs + all encryption and authentication operations in one function call. + + \return 0 on successful encryption. + \return BAD_FUNC_ARG if input or output buffers are NULL. Also returned + if the key size isn't a valid AES key size (16, 24, or 32 bytes) + \return other negative error values returned if AES or CMAC operations + fail. + + \param key buffer containing the key to use + \param keySz length of the key buffer in bytes + \param[out] out buffer to hold the ciphertext. Should be the same length as + the plaintext buffer + \param in plaintext buffer to encrypt + \param inSz length of plaintext buffer + \param nonce the cryptographic nonce to use for EAX operations + \param nonceSz length of nonce buffer in bytes + \param[out] authTag pointer to the buffer in which to store the + authentication tag + \param authTagSz length of the desired authentication tag + \param authIn pointer to the buffer containing input data to authenticate + \param authInSz length of the input authentication data + + _Example_ + \code + byte key[] = { some 32, 48, or 64 byte key }; + byte nonce[] = {0x04, 0x5, 0x6}; + byte plainText[] = {0xDE, 0xAD, 0xBE, 0xEF}; + byte authIn[] = {0x01, 0x2, 0x3}; + + byte cipherText[sizeof(plainText)]; // output ciphertext + byte authTag[length, up to AES_BLOCK_SIZE]; // output authTag + + if (wc_AesEaxEncrypt(key, sizeof(key), + cipherText, plainText, sizeof(plainText), + nonce, sizeof(nonce), + authTag, sizeof(authTag), + authIn, sizeof(authIn)) != 0) { + // failed to encrypt + } + + \endcode + + \sa wc_AesEaxDecryptAuth + +*/ +WOLFSSL_API int wc_AesEaxEncryptAuth(const byte* key, word32 keySz, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + /* output computed auth tag */ + byte* authTag, word32 authTagSz, + /* input data to authenticate */ + const byte* authIn, word32 authInSz); +/*! + \ingroup AES + + \brief This function performs AES EAX decryption and authentication as + described in "EAX: A Conventional Authenticated-Encryption Mode" + (https://eprint.iacr.org/2003/069). It is a "one-shot" API that performs + all decryption and authentication operations in one function call. + + \return 0 on successful decryption + \return BAD_FUNC_ARG if input or output buffers are NULL. Also returned + if the key size isn't a valid AES key size (16, 24, or 32 bytes) + \return AES_EAX_AUTH_E If the authentication tag does not match the + supplied authentication code vector \c authTag + \return other negative error values returned if AES or CMAC operations + fail. + + \param key byte buffer containing the key to use + \param keySz length of the key buffer in bytes + \param[out] out buffer to hold the plaintext. Should be the same length as + the input ciphertext buffer + \param in ciphertext buffer to decrypt + \param inSz length of ciphertext buffer + \param nonce the cryptographic nonce to use for EAX operations + \param nonceSz length of nonce buffer in bytes + \param authTag buffer that holds the authentication tag to check the + authenticity of the data against + \param authTagSz Length of the input authentication tag + \param authIn pointer to the buffer containing input data to authenticate + \param authInSz length of the input authentication data + + _Example_ + \code + byte key[] = { some 32, 48, or 64 byte key }; + byte nonce[] = {0x04, 0x5, 0x6}; + byte cipherText[] = {0xDE, 0xAD, 0xBE, 0xEF}; + byte authIn[] = {0x01, 0x2, 0x3}; + + byte plainText[sizeof(cipherText)]; // output plaintext + byte authTag[length, up to AES_BLOCK_SIZE]; // output authTag + + if (wc_AesEaxDecrypt(key, sizeof(key), + cipherText, plainText, sizeof(plainText), + nonce, sizeof(nonce), + authTag, sizeof(authTag), + authIn, sizeof(authIn)) != 0) { + // failed to encrypt + } + + \endcode + + \sa wc_AesEaxEncryptAuth + +*/ +WOLFSSL_API int wc_AesEaxDecryptAuth(const byte* key, word32 keySz, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + /* auth tag to verify against */ + const byte* authTag, word32 authTagSz, + /* input data to authenticate */ + const byte* authIn, word32 authInSz); + +/*! + \ingroup AES + \brief This function initializes an AesEax object for use in authenticated + encryption or decryption. This function must be called on an AesEax + object before using it with any of the AES EAX incremental API functions. + It does not need to be called if using the one-shot EAX API functions. + All AesEax instances initialized with this function need to be freed with + a call to wc_AesEaxFree() when done using the instance. + + \return 0 on success + \return error code on failure + + \param eax AES EAX structure holding the context of the AEAD operation + \param key 16, 24, or 32 byte secret key for encryption and decryption + \param keySz length of the supplied key in bytes + \param nonce the cryptographic nonce to use for EAX operations + \param nonceSz length of nonce buffer in bytes + \param authIn (optional) input data to add to the authentication stream + This argument should be NULL if not used + \param authInSz size in bytes of the input authentication data + + _Example_ + \code + AesEax eax; + key[] = { some 16, 24, or 32 byte length key }; + nonce[] = { some arbitrary length nonce }; + authIn[] = { some data to add to the authentication stream }; + plainText[] = {some plaintext data to encrypt}; + + cipherText[sizeof(plainText)]; // buffer to hold cipherText + authTag[length, up to AES_BLOCK_SIZE]; // buffer to hold computed auth data + + AesEax eax; + + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + authIn, authInSz)) != 0) { + goto cleanup; + } + + // if we wanted to add more auth data, we could provide it at this point, + // otherwise we use NULL for the authIn parameter, with authIn size of 0 + if ((ret = wc_AesEaxEncryptUpdate(eax, + cipherText, plainText, sizeof(plainText), + NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxEncryptFinal(eax, authTag, sizeof(authTag))) != 0) { + goto cleanup; + } + + cleanup: + wc_AesEaxFree(eax); + \endcode + + \sa wc_AesEaxEncryptUpdate + \sa wc_AesEaxDecryptUpdate + \sa wc_AesEaxAuthDataUpdate + \sa wc_AesEaxEncryptFinal + \sa wc_AesEaxDecryptFinal + \sa wc_AesEaxFree + +*/ +WOLFSSL_API int wc_AesEaxInit(AesEax* eax, + const byte* key, word32 keySz, + const byte* nonce, word32 nonceSz, + const byte* authIn, word32 authInSz); + +/*! + \ingroup AES + \brief This function uses AES EAX to encrypt input data, and optionally, add + more input data to the authentication stream. \c eax must have been + previously initialized with a call to \ref wc_AesEaxInit. + + \return 0 on success + \return error code on failure + + \param eax AES EAX structure holding the context of the AEAD operation + \param[out] out output buffer holding the ciphertext + \param in input buffer holding the plaintext to encrypt + \param inSz size in bytes of the input data buffer + \param authIn (optional) input data to add to the authentication stream + This argument should be NULL if not used + \param authInSz size in bytes of the input authentication data + + _Example_ + \code + AesEax eax; + key[] = { some 16, 24, or 32 byte length key }; + nonce[] = { some arbitrary length nonce }; + authIn[] = { some data to add to the authentication stream }; + plainText[] = {some plaintext data to encrypt}; + + cipherText[sizeof(plainText)]; // buffer to hold cipherText + authTag[length, up to AES_BLOCK_SIZE]; // buffer to hold computed auth data + + AesEax eax; + + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + authIn, authInSz)) != 0) { + goto cleanup; + } + + // if we wanted to add more auth data, we could provide it at this point, + // otherwise we use NULL for the authIn parameter, with authInSz of 0 + if ((ret = wc_AesEaxEncryptUpdate(eax, + cipherText, plainText, sizeof(plainText), + NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxEncryptFinal(eax, authTag, sizeof(authTag))) != 0) { + goto cleanup; + } + + cleanup: + wc_AesEaxFree(eax); + \endcode + + \sa wc_AesEaxInit + \sa wc_AesEaxDecryptUpdate + \sa wc_AesEaxAuthDataUpdate + \sa wc_AesEaxEncryptFinal + \sa wc_AesEaxDecryptFinal + \sa wc_AesEaxFree + +*/ +WOLFSSL_API int wc_AesEaxEncryptUpdate(AesEax* eax, byte* out, + const byte* in, word32 inSz, + const byte* authIn, word32 authInSz); + +/*! + \ingroup AES + \brief This function uses AES EAX to decrypt input data, and optionally, add + more input data to the authentication stream. \c eax must have been + previously initialized with a call to \ref wc_AesEaxInit. + + \return 0 on success + \return error code on failure + + \param eax AES EAX structure holding the context of the AEAD operation + \param[out] out output buffer holding the decrypted plaintext + \param in input buffer holding the ciphertext + \param inSz size in bytes of the input data buffer + \param authIn (optional) input data to add to the authentication stream + This argument should be NULL if not used + \param authInSz size in bytes of the input authentication data + + + _Example_ + \code + AesEax eax; + key[] = { some 16, 24, or 32 byte length key }; + nonce[] = { some arbitrary length nonce }; + authIn[] = { some data to add to the authentication stream }; + cipherText[] = {some encrypted data}; + + plainText[sizeof(cipherText)]; // buffer to hold decrypted data + // auth tag is generated elsewhere by the encrypt AEAD operation + authTag[length, up to AES_BLOCK_SIZE] = { the auth tag }; + + AesEax eax; + + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + authIn, authInSz)) != 0) { + goto cleanup; + } + + // if we wanted to add more auth data, we could provide it at this point, + // otherwise we use NULL for the authIn parameter, with authInSz of 0 + if ((ret = wc_AesEaxDecryptUpdate(eax, + plainText, cipherText, sizeof(cipherText), + NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxDecryptFinal(eax, authTag, sizeof(authTag))) != 0) { + goto cleanup; + } + + cleanup: + wc_AesEaxFree(eax); + \endcode + + \sa wc_AesEaxInit + \sa wc_AesEaxEncryptUpdate + \sa wc_AesEaxAuthDataUpdate + \sa wc_AesEaxEncryptFinal + \sa wc_AesEaxDecryptFinal + \sa wc_AesEaxFree + +*/ +WOLFSSL_API int wc_AesEaxDecryptUpdate(AesEax* eax, byte* out, + const byte* in, word32 inSz, + const byte* authIn, word32 authInSz); +/*! + \ingroup AES + \brief This function adds input data to the authentication stream. + \c eax must have been previously initialized with a call to + \ref wc_AesEaxInit. + + \return 0 on success + \return error code on failure + + \param eax AES EAX structure holding the context of the AEAD operation + \param authIn input data to add to the authentication stream + \param authInSz size in bytes of the input authentication data + + _Example_ + \code + AesEax eax; + key[] = { some 16, 24, or 32 byte length key }; + nonce[] = { some arbitrary length nonce }; + authIn[] = { some data to add to the authentication stream }; + cipherText[] = {some encrypted data}; + + plainText[sizeof(cipherText)]; // buffer to hold decrypted data + // auth tag is generated elsewhere by the encrypt AEAD operation + authTag[length, up to AES_BLOCK_SIZE] = { the auth tag }; + + AesEax eax; + + // No auth data to add here + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + NULL, 0)) != 0) { + goto cleanup; + } + + // No auth data to add here, added later with wc_AesEaxAuthDataUpdate + if ((ret = wc_AesEaxDecryptUpdate(eax, + plainText, cipherText, sizeof(cipherText), + NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxAuthDataUpdate(eax, authIn, sizeof(authIn))) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxDecryptFinal(eax, authTag, sizeof(authTag))) != 0) { + goto cleanup; + } + + cleanup: + wc_AesEaxFree(eax); + \endcode + + \sa wc_AesEaxInit + \sa wc_AesEaxEncryptUpdate + \sa wc_AesEaxDecryptUpdate + \sa wc_AesEaxEncryptFinal + \sa wc_AesEaxDecryptFinal + \sa wc_AesEaxFree + +*/ +WOLFSSL_API int wc_AesEaxAuthDataUpdate(AesEax* eax, + const byte* authIn, word32 authInSz); + +/*! + \ingroup AES + \brief This function finalizes the encrypt AEAD operation, producing an auth + tag over the current authentication stream. \c eax must have been previously + initialized with a call to \ref wc_AesEaxInit. When done using the \c AesEax + context structure, make sure to free it using \ref wc_AesEaxFree. + + \return 0 on success + \return error code on failure + + \param eax AES EAX structure holding the context of the AEAD operation + \param authTag[out] buffer that will hold the computed auth tag + \param authTagSz size in bytes of \c authTag + + _Example_ + \code + AesEax eax; + key[] = { some 16, 24, or 32 byte length key }; + nonce[] = { some arbitrary length nonce }; + authIn[] = { some data to add to the authentication stream }; + plainText[] = {some plaintext data to encrypt}; + + cipherText[sizeof(plainText)]; // buffer to hold cipherText + authTag[length, up to AES_BLOCK_SIZE]; // buffer to hold computed auth data + + AesEax eax; + + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + authIn, authInSz)) != 0) { + goto cleanup; + } + + // if we wanted to add more auth data, we could provide it at this point, + // otherwise we use NULL for the authIn parameter, with authInSz of 0 + if ((ret = wc_AesEaxEncryptUpdate(eax, + cipherText, plainText, sizeof(plainText), + NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxEncryptFinal(eax, authTag, sizeof(authTag))) != 0) { + goto cleanup; + } + + cleanup: + wc_AesEaxFree(eax); + \endcode + + \sa wc_AesEaxInit + \sa wc_AesEaxEncryptUpdate + \sa wc_AesEaxDecryptUpdate + \sa wc_AesEaxAuthDataUpdate + \sa wc_AesEaxDecryptFinal + \sa wc_AesEaxFree + +*/ +WOLFSSL_API int wc_AesEaxEncryptFinal(AesEax* eax, + byte* authTag, word32 authTagSz); + +/*! + \ingroup AES + \brief This function finalizes the decrypt AEAD operation, finalizing the + auth tag computation and checking it for validity against the user supplied + tag. \c eax must have been previously initialized with a call to + \ref wc_AesEaxInit. When done using the \c AesEax context structure, make + sure to free it using \ref wc_AesEaxFree. + + \return 0 if data is authenticated successfully + \return AES_EAX_AUTH_E if the authentication tag does not match the + supplied authentication code vector \c authIn + \return other error code on failure + + \param eax AES EAX structure holding the context of the AEAD operation + \param authIn input auth tag to check computed auth tag against + \param authInSz size in bytes of \c authIn + + _Example_ + \code + AesEax eax; + key[] = { some 16, 24, or 32 byte length key }; + nonce[] = { some arbitrary length nonce }; + authIn[] = { some data to add to the authentication stream }; + cipherText[] = {some encrypted data}; + + plainText[sizeof(cipherText)]; // buffer to hold decrypted data + // auth tag is generated elsewhere by the encrypt AEAD operation + authTag[length, up to AES_BLOCK_SIZE] = { the auth tag }; + + AesEax eax; + + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + authIn, authInSz)) != 0) { + goto cleanup; + } + + // if we wanted to add more auth data, we could provide it at this point, + // otherwise we use NULL for the authIn parameter, with authInSz of 0 + if ((ret = wc_AesEaxDecryptUpdate(eax, + plainText, cipherText, sizeof(cipherText), + NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxDecryptFinal(eax, authTag, sizeof(authTag))) != 0) { + goto cleanup; + } + + cleanup: + wc_AesEaxFree(eax); + \endcode + + \sa wc_AesEaxInit + \sa wc_AesEaxEncryptUpdate + \sa wc_AesEaxDecryptUpdate + \sa wc_AesEaxAuthDataUpdate + \sa wc_AesEaxEncryptFinal + \sa wc_AesEaxFree + +*/ +WOLFSSL_API int wc_AesEaxDecryptFinal(AesEax* eax, + const byte* authIn, word32 authInSz); +/*! + \ingroup AES + + \brief This frees up any resources, specifically keys, used by the Aes + instance inside the AesEax wrapper struct. It should be called on the + AesEax struct after it has been initialized with wc_AesEaxInit, and all + desired EAX operations are complete. + + \return 0 Success + + \param eaxAES EAX instance to free + + _Example_ + \code + AesEax eax; + + if(wc_AesEaxInit(eax, key, keySz, nonce, nonceSz, authIn, authInSz) != 0) { + // handle errors, then free + wc_AesEaxFree(&eax); + } + \endcode + + \sa wc_AesEaxInit + \sa wc_AesEaxEncryptUpdate + \sa wc_AesEaxDecryptUpdate + \sa wc_AesEaxAuthDataUpdate + \sa wc_AesEaxEncryptFinal + \sa wc_AesEaxDecryptFinal +*/ +WOLFSSL_API int wc_AesEaxFree(AesEax* eax); + + + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/asn_public.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/asn_public.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/asn_public.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/asn_public.h 2024-08-03 07:30:00.000000000 +0000 @@ -1231,7 +1231,7 @@ word32 pemSz; byte* cipher_info[] { Additional cipher info. } - pemSz = wc_DerToPemEx(der, derSz,pemFormatted,FOURK_BUF, ,CERT_TYPE); + pemSz = wc_DerToPemEx(der, derSz, pemFormatted, FOURK_BUF, cipher_info, CERT_TYPE); \endcode \sa wc_PemCertToDer @@ -2110,7 +2110,7 @@ _Example_ \code int ret = 0; - // Unkown extension callback prototype + // Unknown extension callback prototype int myUnknownExtCallback(const word16* oid, word32 oidSz, int crit, const unsigned char* der, word32 derSz); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/cmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/cmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/cmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/cmac.h 2024-08-03 07:30:00.000000000 +0000 @@ -6,7 +6,7 @@ \param key key pointer \param keySz size of the key pointer (16, 24 or 32) \param type Always WC_CMAC_AES = 1 - \param unused not used, exists for potential future use around compatiblity + \param unused not used, exists for potential future use around compatibility _Example_ \code @@ -23,6 +23,8 @@ \sa wc_InitCmac_ex \sa wc_CmacUpdate \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_InitCmac(Cmac* cmac, const byte* key, word32 keySz, @@ -36,9 +38,9 @@ \param key key pointer \param keySz size of the key pointer (16, 24 or 32) \param type Always WC_CMAC_AES = 1 - \param unused not used, exists for potential future use around compatiblity + \param unused not used, exists for potential future use around compatibility \param heap pointer to the heap hint used for dynamic allocation. Typically used with our static memory option. Can be NULL. - \param devId ID to use with async hardware. Set to INVALID_DEVID if not using async hardware. + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used _Example_ \code @@ -55,6 +57,8 @@ \sa wc_InitCmac_ex \sa wc_CmacUpdate \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_InitCmac_ex(Cmac* cmac, const byte* key, word32 keySz, @@ -75,13 +79,16 @@ \sa wc_InitCmac \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_CmacUpdate(Cmac* cmac, const byte* in, word32 inSz); + /*! \ingroup CMAC - \brief Generate the final result using Cipher-based Message Authentication Code + \brief Generate the final result using Cipher-based Message Authentication Code, deferring context cleanup. \return 0 on success \param cmac pointer to the Cmac structure \param out pointer to return the result @@ -89,18 +96,61 @@ _Example_ \code - ret = wc_CmacFinal(cmac, out, &outSz); + ret = wc_CmacFinalNoFree(cmac, out, &outSz); + (void)wc_CmacFree(cmac); \endcode \sa wc_InitCmac \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree +*/ +int wc_CmacFinalNoFree(Cmac* cmac, + byte* out, word32* outSz); + +/*! + \ingroup CMAC + \brief Generate the final result using Cipher-based Message Authentication Code, and clean up the context with wc_CmacFree(). + \return 0 on success + \param cmac pointer to the Cmac structure + \param out pointer to return the result + \param outSz pointer size of output (in/out) + + _Example_ + \code + ret = wc_CmacFinal(cmac, out, &outSz); + \endcode + + \sa wc_InitCmac + \sa wc_CmacFinalNoFree + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz); /*! \ingroup CMAC - \brief Single shot fuction for generating a CMAC + \brief Clean up allocations in a CMAC context. + \return 0 on success + \param cmac pointer to the Cmac structure + + _Example_ + \code + ret = wc_CmacFinalNoFree(cmac, out, &outSz); + (void)wc_CmacFree(cmac); + \endcode + + \sa wc_InitCmac + \sa wc_CmacFinalNoFree + \sa wc_CmacFinal + \sa wc_CmacFree +*/ +int wc_CmacFree(Cmac* cmac); + +/*! + \ingroup CMAC + \brief Single shot function for generating a CMAC \return 0 on success \param out pointer to return the result \param outSz pointer size of output (in/out) @@ -122,7 +172,7 @@ /*! \ingroup CMAC - \brief Single shot fuction for validating a CMAC + \brief Single shot function for validating a CMAC \return 0 on success \param check pointer to return the result \param checkSz size of checkout buffer diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_groups.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_groups.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_groups.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_groups.h 2024-08-03 07:30:00.000000000 +0000 @@ -206,6 +206,7 @@ \defgroup RSA Algorithms - RSA \defgroup SHA Algorithms - SHA 128/224/256/384/512 \defgroup SipHash Algorithm - SipHash + \defgroup SrtpKdf Algorithm - SRTP KDF \defgroup SRP Algorithms - SRP \defgroup ASN ASN.1 @@ -221,7 +222,7 @@ key operations and reducing the attack surface by restricting access to certificate and keys to the SIM. - IoT-Safe support can be enabled on an existing WOLFSSL_CTX contex, using wolfSSL_CTX_iotsafe_enable().\n + IoT-Safe support can be enabled on an existing WOLFSSL_CTX context, using wolfSSL_CTX_iotsafe_enable().\n Session created within the context can set the parameters for IoT-Safe key and files usage, and enable the public keys callback, with wolfSSL_iotsafe_on(). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_pages.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_pages.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_pages.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/doxygen_pages.h 2024-08-03 07:30:00.000000000 +0000 @@ -57,6 +57,7 @@
  • \ref RSA
  • \ref SHA
  • \ref SipHash
  • +
  • \ref SrtpKdf
  • \ref SRP
  • */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ecc.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ecc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ecc.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ecc.h 2024-08-03 07:30:00.000000000 +0000 @@ -572,8 +572,8 @@ \return MEMORY_E Returned if there is an error allocating memory \param key pointer to the ecc_key object to initialize - \param devId ID to use with async hardware \param heap pointer to a heap identifier + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used _Example_ \code @@ -1722,7 +1722,7 @@ \param ctx pointer to the ecEncCtx for which to set the salt \param salt pointer to salt buffer - \param len length salt in bytes + \param sz length salt in bytes _Example_ \code @@ -1742,7 +1742,7 @@ \sa wc_ecc_ctx_get_peer_salt */ -int wc_ecc_ctx_set_kdf_salt(ecEncCtx* ctx, const byte* salt, word32 len); +int wc_ecc_ctx_set_kdf_salt(ecEncCtx* ctx, const byte* salt, word32 sz); /*! \ingroup ECC @@ -1968,7 +1968,7 @@ /*! \ingroup ECC - \brief Enable ECC support for non-blocking operations. Supported for + \brief Enable ECC support for non-blocking operations. Supported for Single Precision (SP) math with the following build options: WOLFSSL_SP_NONBLOCK WOLFSSL_SP_SMALL @@ -1978,7 +1978,7 @@ \return 0 Returned upon successfully setting the callback context the input message \param key pointer to the ecc_key object - \param ctx pointer to ecc_nb_ctx_t structure with stack data cache for SP + \param ctx pointer to ecc_nb_ctx_t structure with stack data cache for SP _Example_ \code @@ -1998,7 +1998,7 @@ &key ); - // TODO: Real-time work can be called here + // TODO: Real-time work can be called here } while (ret == FP_WOULDBLOCK); } wc_ecc_free(&key); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ed25519.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ed25519.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ed25519.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ed25519.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,21 +1,21 @@ /*! \ingroup ED25519 - \brief This function generates the Ed25519 public key from the private key. - It stores the public key in the buffer pubKey, and sets the bytes - written to this buffer in pubKeySz. + \brief This function generates the Ed25519 public key from the private key, + stored in the ed25519_key object. It stores the public key in the buffer + pubKey. \return 0 Returned upon successfully making the public key. - \return BAD_FUNC_ARG Returned ifi key or pubKey evaluate to NULL, or if the + \return BAD_FUNC_ARG Returned if key or pubKey evaluate to NULL, or if the specified key size is not 32 bytes (Ed25519 has 32 byte keys). + \return ECC_PRIV_KEY_E returned if the ed25519_key object does not have + the private key in it. \return MEMORY_E Returned if there is an error allocating memory during function execution. \param [in] key Pointer to the ed25519_key for which to generate a key. - \param [out] out Pointer to the buffer in which to store the public key. - \param [in,out] outLen Pointer to a word32 object with the size available - in out. Set with the number of bytes written to out after successfully - exporting the public key. + \param [out] pubKey Pointer to the buffer in which to store the public key. + \param [in] pubKeySz Size of the public key. Should be ED25519_PUB_KEY_SIZE. _Example_ \code @@ -301,7 +301,7 @@ \ingroup ED25519 \brief This function verifies the Ed25519 signature of a message to ensure - authenticity. It returns the answer through res, with 1 corresponding to + authenticity. It returns the answer through ret, with 1 corresponding to a valid signature, and 0 corresponding to an invalid signature. \return 0 Returned upon successfully performing the signature @@ -315,7 +315,7 @@ \param [in] siglen Length of the signature to verify. \param [in] msg Pointer to the buffer containing the message to verify. \param [in] msgLen Length of the message to verify. - \param [out] res Pointer to the result of the verification. 1 indicates the + \param [out] ret Pointer to the result of the verification. 1 indicates the message was successfully verified. \param [in] key Pointer to a public Ed25519 key with which to verify the signature. @@ -351,7 +351,7 @@ \brief This function verifies the Ed25519 signature of a message to ensure authenticity. The context is included as part of the data - verified. It returns the answer through res, with 1 corresponding to + verified. It returns the answer through ret, with 1 corresponding to a valid signature, and 0 corresponding to an invalid signature. \return 0 Returned upon successfully performing the signature @@ -365,7 +365,7 @@ \param [in] siglen Length of the signature to verify. \param [in] msg Pointer to the buffer containing the message to verify. \param [in] msgLen Length of the message to verify. - \param [out] res Pointer to the result of the verification. 1 indicates the + \param [out] ret Pointer to the result of the verification. 1 indicates the message was successfully verified. \param [in] key Pointer to a public Ed25519 key with which to verify the signature. @@ -408,7 +408,7 @@ message to ensure authenticity. The context is included as part of the data verified. The hash is the pre-hashed message before signature calculation. The hash algorithm used to create message digest must be SHA-512. - The answer is returned through res, with 1 corresponding to a valid + The answer is returned through ret, with 1 corresponding to a valid signature, and 0 corresponding to an invalid signature. @@ -424,7 +424,7 @@ \param [in] hash Pointer to the buffer containing the hash of the message to verify. \param [in] hashLen Length of the hash to verify. - \param [out] res Pointer to the result of the verification. 1 indicates the + \param [out] ret Pointer to the result of the verification. 1 indicates the message was successfully verified. \param [in] key Pointer to a public Ed25519 key with which to verify the signature. @@ -466,7 +466,7 @@ \brief This function verifies the Ed25519 signature of a message to ensure authenticity. The context is included as part of the data verified. The message is pre-hashed before verification. It returns the - answer through res, with 1 corresponding to a valid signature, and 0 + answer through ret, with 1 corresponding to a valid signature, and 0 corresponding to an invalid signature. \return 0 Returned upon successfully performing the signature @@ -480,7 +480,7 @@ \param [in] siglen Length of the signature to verify. \param [in] msg Pointer to the buffer containing the message to verify. \param [in] msgLen Length of the message to verify. - \param [out] res Pointer to the result of the verification. 1 indicates the + \param [out] ret Pointer to the result of the verification. 1 indicates the message was successfully verified. \param [in] key Pointer to a public Ed25519 key with which to verify the signature. @@ -562,7 +562,7 @@ /*! \ingroup ED25519 - \brief This function imports a public ed25519_key pair from a buffer + \brief This function imports a public ed25519_key from a buffer containing the public key. This function will handle both compressed and uncompressed keys. The public key is checked that it matches the private key when one is present. @@ -600,7 +600,7 @@ /*! \ingroup ED25519 - \brief This function imports a public ed25519_key pair from a buffer + \brief This function imports a public ed25519_key from a buffer containing the public key. This function will handle both compressed and uncompressed keys. Check public key matches private key, when present, when not trusted. @@ -649,8 +649,6 @@ \param [in] priv Pointer to the buffer containing the private key. \param [in] privSz Length of the private key. - \param [in] pub Pointer to the buffer containing the public key. - \param [in] pubSz Length of the public key. \param [in,out] key Pointer to the ed25519_key object in which to store the imported private key. @@ -950,7 +948,7 @@ \return 0 Returned if the private and public key matched. \return BAD_FUNC_ARG Returned if the given key is NULL. - \return PUBLIC_KEY_E Returned if the no public key availble or is invalid. + \return PUBLIC_KEY_E Returned if the no public key available or is invalid. \param [in] key Pointer to an ed25519_key structure holding a private and public key. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/hmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/hmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/hmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/hmac.h 2024-08-03 07:30:00.000000000 +0000 @@ -129,6 +129,9 @@ optional info into a derived key, which it stores in out. The hash type defaults to MD5 if 0 or NULL is given. + The HMAC configure option is --enable-hmac (on by default) or if building + sources directly HAVE_HKDF + \return 0 Returned upon successfully generating a key with the given inputs \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) \return MEMORY_E Returned if there is an error allocating memory @@ -170,3 +173,439 @@ const byte* salt, word32 saltSz, const byte* info, word32 infoSz, byte* out, word32 outSz); + + +/*! + \ingroup HMAC + + \brief This function provides access to a HMAC Key Derivation Function + (HKDF). It utilizes HMAC to convert inKey, with an optional salt + into a derived key, which it stores in out. The hash type + defaults to MD5 if 0 or NULL is given. + + The HMAC configure option is --enable-hmac (on by default) or if building + sources directly HAVE_HKDF + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param type hash type to use for the HKDF. Valid types are: WC_MD5, WC_SHA, + WC_SHA256, WC_SHA384, WC_SHA512, WC_SHA3_224, WC_SHA3_256, WC_SHA3_384 or + WC_SHA3_512 + \param salt pointer to a buffer containing an optional salt. Use NULL + instead if not using a salt + \param saltSz length of the salt. Use 0 if not using a salt + \param inKey pointer to the buffer containing the key to use for KDF + \param inKeySz length of the input key + \param out pointer to the buffer in which to store the derived key + + _Example_ + \code + byte key[] = { // initialize with key }; + byte salt[] = { // initialize with salt }; + byte derivedKey[MAX_DIGEST_SIZE]; + + int ret = wc_HKDF_Extract(WC_SHA512, salt, sizeof(salt), key, sizeof(key), + derivedKey); + if ( ret != 0 ) { + // error generating derived key + } + \endcode + + \sa wc_HKDF + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand + \sa wc_HKDF_Expand_ex +*/ +int wc_HKDF_Extract( + int type, + const byte* salt, word32 saltSz, + const byte* inKey, word32 inKeySz, + byte* out); + +/*! + \ingroup HMAC + + \brief This function provides access to a HMAC Key Derivation Function + (HKDF). It utilizes HMAC to convert inKey, with an optional salt + into a derived key, which it stores in out. The hash type + defaults to MD5 if 0 or NULL is given. This is the _ex version adding + heap hint and device identifier. + + The HMAC configure option is --enable-hmac (on by default) or if building + sources directly HAVE_HKDF + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param type hash type to use for the HKDF. Valid types are: WC_MD5, WC_SHA, + WC_SHA256, WC_SHA384, WC_SHA512, WC_SHA3_224, WC_SHA3_256, WC_SHA3_384 or + WC_SHA3_512 + \param salt pointer to a buffer containing an optional salt. Use NULL + instead if not using a salt + \param saltSz length of the salt. Use 0 if not using a salt + \param inKey pointer to the buffer containing the key to use for KDF + \param inKeySz length of the input key + \param out pointer to the buffer in which to store the derived key + \param heap heap hint to use for memory. Can be NULL + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used + + _Example_ + \code + byte key[] = { // initialize with key }; + byte salt[] = { // initialize with salt }; + byte derivedKey[MAX_DIGEST_SIZE]; + + int ret = wc_HKDF_Extract_ex(WC_SHA512, salt, sizeof(salt), key, sizeof(key), + derivedKey, NULL, INVALID_DEVID); + if ( ret != 0 ) { + // error generating derived key + } + \endcode + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Expand + \sa wc_HKDF_Expand_ex +*/ +int wc_HKDF_Extract_ex( + int type, + const byte* salt, word32 saltSz, + const byte* inKey, word32 inKeySz, + byte* out, + void* heap, int devId); + +/*! + \ingroup HMAC + + \brief This function provides access to a HMAC Key Derivation Function + (HKDF). It utilizes HMAC to convert inKey, with optional info into a + derived key, which it stores in out. The hash type + defaults to MD5 if 0 or NULL is given. + + The HMAC configure option is --enable-hmac (on by default) or if building + sources directly HAVE_HKDF + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param type hash type to use for the HKDF. Valid types are: WC_MD5, WC_SHA, + WC_SHA256, WC_SHA384, WC_SHA512, WC_SHA3_224, WC_SHA3_256, WC_SHA3_384 or + WC_SHA3_512 + \param inKey pointer to the buffer containing the key to use for KDF + \param inKeySz length of the input key + \param info pointer to a buffer containing optional additional info. + Use NULL if not appending extra info + \param infoSz length of additional info. Use 0 if not using additional info + \param out pointer to the buffer in which to store the derived key + \param outSz space available in the output buffer to store the + generated key + + _Example_ + \code + byte key[] = { // initialize with key }; + byte salt[] = { // initialize with salt }; + byte derivedKey[MAX_DIGEST_SIZE]; + + int ret = wc_HKDF_Expand(WC_SHA512, key, sizeof(key), NULL, 0, + derivedKey, sizeof(derivedKey)); + if ( ret != 0 ) { + // error generating derived key + } + \endcode + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand_ex +*/ +int wc_HKDF_Expand( + int type, + const byte* inKey, word32 inKeySz, + const byte* info, word32 infoSz, + byte* out, word32 outSz); + +/*! + \ingroup HMAC + + \brief This function provides access to a HMAC Key Derivation Function + (HKDF). It utilizes HMAC to convert inKey, with optional info into a + derived key, which it stores in out. The hash type + defaults to MD5 if 0 or NULL is given. This is the _ex version adding + heap hint and device identifier. + + The HMAC configure option is --enable-hmac (on by default) or if building + sources directly HAVE_HKDF + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param type hash type to use for the HKDF. Valid types are: WC_MD5, WC_SHA, + WC_SHA256, WC_SHA384, WC_SHA512, WC_SHA3_224, WC_SHA3_256, WC_SHA3_384 or + WC_SHA3_512 + \param inKey pointer to the buffer containing the key to use for KDF + \param inKeySz length of the input key + \param info pointer to a buffer containing optional additional info. + Use NULL if not appending extra info + \param infoSz length of additional info. Use 0 if not using additional info + \param out pointer to the buffer in which to store the derived key + \param outSz space available in the output buffer to store the + generated key + \param heap heap hint to use for memory. Can be NULL + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used + + _Example_ + \code + byte key[] = { // initialize with key }; + byte salt[] = { // initialize with salt }; + byte derivedKey[MAX_DIGEST_SIZE]; + + int ret = wc_HKDF_Expand_ex(WC_SHA512, key, sizeof(key), NULL, 0, + derivedKey, sizeof(derivedKey), NULL, INVALID_DEVID); + if ( ret != 0 ) { + // error generating derived key + } + \endcode + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand +*/ +int wc_HKDF_Expand_ex( + int type, + const byte* inKey, word32 inKeySz, + const byte* info, word32 infoSz, + byte* out, word32 outSz, + void* heap, int devId); + +/*! + \ingroup HMAC + + \brief This function provides access to RFC 5869 + HMAC-based Extract-and-Expand Key Derivation Function (HKDF) for TLS v1.3 + key derivation + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param prk Generated pseudorandom key + \param salt salt. + \param saltLen length of the salt + \param ikm pointer to putput for keying material + \param ikmLen length of the input keying material buffer + \param digest hash type to use for the HKDF. Valid types are: WC_SHA256, WC_SHA384 or WC_SHA512 + + _Example_ + \code + byte secret[] = { // initialize with random key }; + byte salt[] = { // initialize with optional salt }; + byte masterSecret[MAX_DIGEST_SIZE]; + + int ret = wc_Tls13_HKDF_Extract(secret, salt, sizeof(salt), 0, + masterSecret, sizeof(masterSecret), WC_SHA512); + if ( ret != 0 ) { + // error generating derived key + } + \endcode + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand + \sa wc_Tls13_HKDF_Extract_ex +*/ +int wc_Tls13_HKDF_Extract( + byte* prk, + const byte* salt, word32 saltLen, + byte* ikm, word32 ikmLen, int digest); + +/*! + \ingroup HMAC + + \brief This function provides access to RFC 5869 + HMAC-based Extract-and-Expand Key Derivation Function (HKDF) for TLS v1.3 + key derivation. This is the _ex version adding heap hint and device identifier. + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param prk Generated pseudorandom key + \param salt Salt. + \param saltLen Length of the salt + \param ikm Pointer to output for keying material + \param ikmLen Length of the input keying material buffer + \param digest Hash type to use for the HKDF. Valid types are: WC_SHA256, WC_SHA384 or WC_SHA512 + \param heap Heap hint to use for memory. Can be NULL + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used + + _Example_ + \code + byte secret[] = { // initialize with random key }; + byte salt[] = { // initialize with optional salt }; + byte masterSecret[MAX_DIGEST_SIZE]; + + int ret = wc_Tls13_HKDF_Extract_ex(secret, salt, sizeof(salt), 0, + masterSecret, sizeof(masterSecret), WC_SHA512, NULL, INVALID_DEVID); + if ( ret != 0 ) { + // error generating derived key + } + \endcode + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand + \sa wc_Tls13_HKDF_Extract +*/ +int wc_Tls13_HKDF_Extract_ex( + byte* prk, + const byte* salt, word32 saltLen, + byte* ikm, word32 ikmLen, int digest, + void* heap, int devId); + +/*! + \ingroup HMAC + + \brief Expand data using HMAC, salt and label and info. TLS v1.3 defines + this function for key derivation. This is the _ex version adding heap hint + and device identifier. + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param okm Generated pseudorandom key - output key material. + \param okmLen Length of generated pseudorandom key - output key material. + \param prk Salt - pseudo-random key. + \param prkLen Length of the salt - pseudo-random key. + \param protocol TLS protocol label. + \param protocolLen Length of the TLS protocol label. + \param info Information to expand. + \param infoLen Length of the information. + \param digest Hash type to use for the HKDF. Valid types are: WC_SHA256, WC_SHA384 or WC_SHA512 + \param heap Heap hint to use for memory. Can be NULL + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand + \sa wc_Tls13_HKDF_Expand_Label + \sa wc_Tls13_HKDF_Expand_Label_Alloc +*/ +int wc_Tls13_HKDF_Expand_Label_ex( + byte* okm, word32 okmLen, + const byte* prk, word32 prkLen, + const byte* protocol, word32 protocolLen, + const byte* label, word32 labelLen, + const byte* info, word32 infoLen, + int digest, + void* heap, int devId); + +/*! + \ingroup HMAC + + \brief Expand data using HMAC, salt and label and info. TLS v1.3 defines + this function for key derivation. This is the _ex version adding heap hint + and device identifier. + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param okm Generated pseudorandom key - output key material. + \param okmLen Length of generated pseudorandom key - output key material. + \param prk Salt - pseudo-random key. + \param prkLen Length of the salt - pseudo-random key. + \param protocol TLS protocol label. + \param protocolLen Length of the TLS protocol label. + \param info Information to expand. + \param infoLen Length of the information. + \param digest Hash type to use for the HKDF. Valid types are: WC_SHA256, WC_SHA384 or WC_SHA512 + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand + \sa wc_Tls13_HKDF_Expand_Label_ex + \sa wc_Tls13_HKDF_Expand_Label_Alloc +*/ +int wc_Tls13_HKDF_Expand_Label( + byte* okm, word32 okmLen, + const byte* prk, word32 prkLen, + const byte* protocol, word32 protocolLen, + const byte* label, word32 labelLen, + const byte* info, word32 infoLen, + int digest); + +/*! + \ingroup HMAC + + \brief This functions is very similar to wc_Tls13_HKDF_Expand_Label(), but it + allocates memory if the stack space usually used isn't enough. Expand data + using HMAC, salt and label and info. TLS v1.3 defines this function for + key derivation. This is the _ex version adding heap hint and device identifier. + + \return 0 Returned upon successfully generating a key with the given inputs + \return BAD_FUNC_ARG Returned if an invalid hash type is given (see type param) + \return MEMORY_E Returned if there is an error allocating memory + \return HMAC_MIN_KEYLEN_E May be returned when using a FIPS implementation + and the key length specified is shorter than the minimum acceptable FIPS + standard + + \param okm Generated pseudorandom key - output key material. + \param okmLen Length of generated pseudorandom key - output key material. + \param prk Salt - pseudo-random key. + \param prkLen Length of the salt - pseudo-random key. + \param protocol TLS protocol label. + \param protocolLen Length of the TLS protocol label. + \param info Information to expand. + \param infoLen Length of the information. + \param digest Hash type to use for the HKDF. Valid types are: WC_SHA256, WC_SHA384 or WC_SHA512 + \param heap Heap hint to use for memory. Can be NULL + + \sa wc_HKDF + \sa wc_HKDF_Extract + \sa wc_HKDF_Extract_ex + \sa wc_HKDF_Expand + \sa wc_Tls13_HKDF_Expand_Label + \sa wc_Tls13_HKDF_Expand_Label_ex +*/ +int wc_Tls13_HKDF_Expand_Label_Alloc( + byte* okm, word32 okmLen, + const byte* prk, word32 prkLen, + const byte* protocol, word32 protocolLen, + const byte* label, word32 labelLen, + const byte* info, word32 infoLen, + int digest, void* heap); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/iotsafe.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/iotsafe.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/iotsafe.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/iotsafe.h 2024-08-03 07:30:00.000000000 +0000 @@ -346,7 +346,7 @@ /*! \ingroup IoTSafe - \brief Sign a pre-computed 256-bit HASH, using a private key previously stored, or pre-provisioned, + \brief Sign a pre-computed HASH, using a private key previously stored, or pre-provisioned, in the IoT-Safe applet. \param in pointer to the buffer containing the message hash to sign @@ -367,7 +367,7 @@ /*! \ingroup IoTSafe - \brief Sign a pre-computed 256-bit HASH, using a private key previously stored, or pre-provisioned, + \brief Sign a pre-computed HASH, using a private key previously stored, or pre-provisioned, in the IoT-Safe applet. Equivalent to \ref wc_iotsafe_ecc_sign_hash "wc_iotsafe_ecc_sign_hash", except that it can be invoked with a key ID of two or more bytes. @@ -390,7 +390,7 @@ /*! \ingroup IoTSafe - \brief Verify an ECC signature against a pre-computed 256-bit HASH, using a public key previously stored, or pre-provisioned, + \brief Verify an ECC signature against a pre-computed HASH, using a public key previously stored, or pre-provisioned, in the IoT-Safe applet. Result is written to res. 1 is valid, 0 is invalid. Note: Do not use the return value to test for valid. Only use res. @@ -412,7 +412,7 @@ /*! \ingroup IoTSafe - \brief Verify an ECC signature against a pre-computed 256-bit HASH, using a public key previously stored, or pre-provisioned, + \brief Verify an ECC signature against a pre-computed HASH, using a public key previously stored, or pre-provisioned, in the IoT-Safe applet. Result is written to res. 1 is valid, 0 is invalid. Note: Do not use the return value to test for valid. Only use res. Equivalent to \ref wc_iotsafe_ecc_verify_hash "wc_iotsafe_ecc_verify_hash", diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/kdf.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/kdf.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/kdf.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/kdf.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,261 @@ + +/*! + \ingroup SrtpKdf + + \brief This function derives keys using SRTP KDF algorithm. + + \return 0 Returned upon successful key derivation. + \return BAD_FUNC_ARG Returned when key or salt is NULL + \return BAD_FUNC_ARG Returned when key length is not 16, 24 or 32. + \return BAD_FUNC_ARG Returned when saltSz is larger than 14. + \return BAD_FUNC_ARG Returned when kdrIdx is less than -1 or larger than 24. + \return MEMORY_E on dynamic memory allocation failure. + + \param [in] key Key to use with encryption. + \param [in] keySz Size of key in bytes. + \param [in] salt Random non-secret value. + \param [in] saltSz Size of random in bytes. + \param [in] kdrIdx Key derivation rate. kdr = 0 when -1, otherwise kdr = 2^kdrIdx. + \param [in] index Index value to XOR in. + \param [out] key1 First key. Label value of 0x00. + \param [in] key1Sz Size of first key in bytes. + \param [out] key2 Second key. Label value of 0x01. + \param [in] key2Sz Size of second key in bytes. + \param [out] key3 Third key. Label value of 0x02. + \param [in] key3Sz Size of third key in bytes. + + + _Example_ + \code + unsigned char key[16] = { ... }; + unsigned char salt[14] = { ... }; + unsigned char index[6] = { ... }; + unsigned char keyE[16]; + unsigned char keyA[20]; + unsigned char keyS[14]; + int kdrIdx = 0; // Use all of index + int ret; + + ret = wc_SRTP_KDF(key, sizeof(key), salt, sizeof(salt), kdrIdx, index, + keyE, sizeof(keyE), keyA, sizeof(keyA), keyS, sizeof(keyS)); + if (ret != 0) { + WOLFSSL_MSG("wc_SRTP_KDF failed"); + } + \endcode + + \sa wc_SRTCP_KDF + \sa wc_SRTP_KDF_label + \sa wc_SRTCP_KDF_label + \sa wc_SRTP_KDF_kdr_to_idx +*/ +int wc_SRTP_KDF(const byte* key, word32 keySz, const byte* salt, word32 saltSz, + int kdrIdx, const byte* index, byte* key1, word32 key1Sz, byte* key2, + word32 key2Sz, byte* key3, word32 key3Sz); + +/*! + \ingroup SrtpKdf + + \brief This function derives keys using SRTCP KDF algorithm. + + \return 0 Returned upon successful key derivation. + \return BAD_FUNC_ARG Returned when key or salt is NULL + \return BAD_FUNC_ARG Returned when key length is not 16, 24 or 32. + \return BAD_FUNC_ARG Returned when saltSz is larger than 14. + \return BAD_FUNC_ARG Returned when kdrIdx is less than -1 or larger than 24. + \return MEMORY_E on dynamic memory allocation failure. + + \param [in] key Key to use with encryption. + \param [in] keySz Size of key in bytes. + \param [in] salt Random non-secret value. + \param [in] saltSz Size of random in bytes. + \param [in] kdrIdx Key derivation rate. kdr = 0 when -1, otherwise kdr = 2^kdrIdx. + \param [in] index Index value to XOR in. + \param [out] key1 First key. Label value of 0x00. + \param [in] key1Sz Size of first key in bytes. + \param [out] key2 Second key. Label value of 0x01. + \param [in] key2Sz Size of second key in bytes. + \param [out] key3 Third key. Label value of 0x02. + \param [in] key3Sz Size of third key in bytes. + + + _Example_ + \code + unsigned char key[16] = { ... }; + unsigned char salt[14] = { ... }; + unsigned char index[4] = { ... }; + unsigned char keyE[16]; + unsigned char keyA[20]; + unsigned char keyS[14]; + int kdrIdx = 0; // Use all of index + int ret; + + ret = wc_SRTCP_KDF(key, sizeof(key), salt, sizeof(salt), kdrIdx, index, + keyE, sizeof(keyE), keyA, sizeof(keyA), keyS, sizeof(keyS)); + if (ret != 0) { + WOLFSSL_MSG("wc_SRTP_KDF failed"); + } + \endcode + + \sa wc_SRTP_KDF + \sa wc_SRTP_KDF_label + \sa wc_SRTCP_KDF_label + \sa wc_SRTP_KDF_kdr_to_idx +*/ +int wc_SRTCP_KDF(const byte* key, word32 keySz, const byte* salt, word32 saltSz, + int kdrIdx, const byte* index, byte* key1, word32 key1Sz, byte* key2, + word32 key2Sz, byte* key3, word32 key3Sz); +/*! + \ingroup SrtpKdf + + \brief This function derives a key with label using SRTP KDF algorithm. + + \return 0 Returned upon successful key derivation. + \return BAD_FUNC_ARG Returned when key, salt or outKey is NULL + \return BAD_FUNC_ARG Returned when key length is not 16, 24 or 32. + \return BAD_FUNC_ARG Returned when saltSz is larger than 14. + \return BAD_FUNC_ARG Returned when kdrIdx is less than -1 or larger than 24. + \return MEMORY_E on dynamic memory allocation failure. + + \param [in] key Key to use with encryption. + \param [in] keySz Size of key in bytes. + \param [in] salt Random non-secret value. + \param [in] saltSz Size of random in bytes. + \param [in] kdrIdx Key derivation rate. kdr = 0 when -1, otherwise kdr = 2^kdrIdx. + \param [in] index Index value to XOR in. + \param [in] label Label to use when deriving key. + \param [out] outKey Derived key. + \param [in] outKeySz Size of derived key in bytes. + + + _Example_ + \code + unsigned char key[16] = { ... }; + unsigned char salt[14] = { ... }; + unsigned char index[6] = { ... }; + unsigned char keyE[16]; + int kdrIdx = 0; // Use all of index + int ret; + + ret = wc_SRTP_KDF_label(key, sizeof(key), salt, sizeof(salt), kdrIdx, index, + WC_SRTP_LABEL_ENCRYPTION, keyE, sizeof(keyE)); + if (ret != 0) { + WOLFSSL_MSG("wc_SRTP_KDF failed"); + } + \endcode + + \sa wc_SRTP_KDF + \sa wc_SRTCP_KDF + \sa wc_SRTCP_KDF_label + \sa wc_SRTP_KDF_kdr_to_idx +*/ +int wc_SRTP_KDF_label(const byte* key, word32 keySz, const byte* salt, + word32 saltSz, int kdrIdx, const byte* index, byte label, byte* outKey, + word32 outKeySz); +/*! + \ingroup SrtpKdf + + \brief This function derives key with label using SRTCP KDF algorithm. + + \return 0 Returned upon successful key derivation. + \return BAD_FUNC_ARG Returned when key, salt or outKey is NULL + \return BAD_FUNC_ARG Returned when key length is not 16, 24 or 32. + \return BAD_FUNC_ARG Returned when saltSz is larger than 14. + \return BAD_FUNC_ARG Returned when kdrIdx is less than -1 or larger than 24. + \return MEMORY_E on dynamic memory allocation failure. + + \param [in] key Key to use with encryption. + \param [in] keySz Size of key in bytes. + \param [in] salt Random non-secret value. + \param [in] saltSz Size of random in bytes. + \param [in] kdrIdx Key derivation rate. kdr = 0 when -1, otherwise kdr = 2^kdrIdx. + \param [in] index Index value to XOR in. + \param [in] label Label to use when deriving key. + \param [out] outKey Derived key. + \param [in] outKeySz Size of derived key in bytes. + + + _Example_ + \code + unsigned char key[16] = { ... }; + unsigned char salt[14] = { ... }; + unsigned char index[4] = { ... }; + unsigned char keyE[16]; + int kdrIdx = 0; // Use all of index + int ret; + + ret = wc_SRTCP_KDF_label(key, sizeof(key), salt, sizeof(salt), kdrIdx, + index, WC_SRTCP_LABEL_ENCRYPTION, keyE, sizeof(keyE)); + if (ret != 0) { + WOLFSSL_MSG("wc_SRTP_KDF failed"); + } + \endcode + + \sa wc_SRTP_KDF + \sa wc_SRTCP_KDF + \sa wc_SRTP_KDF_label + \sa wc_SRTP_KDF_kdr_to_idx +*/ +int wc_SRTP_KDF_label(const byte* key, word32 keySz, const byte* salt, + word32 saltSz, int kdrIdx, const byte* index, byte label, byte* outKey, + word32 outKeySz); +/*! + \ingroup SrtpKdf + + \brief This function converts a kdr value to an index to use in SRTP/SRTCP KDF API. + + \return Key derivation rate as an index. + + \param [in] kdr Key derivation rate to convert. + + _Example_ + \code + word32 kdr = 0x00000010; + int kdrIdx; + int ret; + + kdrIdx = wc_SRTP_KDF_kdr_to_idx(kdr); + \endcode + + \sa wc_SRTP_KDF + \sa wc_SRTCP_KDF + \sa wc_SRTP_KDF_label + \sa wc_SRTCP_KDF_label +*/ +int wc_SRTP_KDF_kdr_to_idx(word32 kdr); + +/** + * \brief Performs the single-step key derivation function (KDF) as specified in + * SP800-56C option 1. + * + * \param [in] z The input keying material. + * \param [in] zSz The size of the input keying material. + * \param [in] fixedInfo The fixed information to be included in the KDF. + * \param [in] fixedInfoSz The size of the fixed information. + * \param [in] derivedSecretSz The desired size of the derived secret. + * \param [in] hashType The hash algorithm to be used in the KDF. + * \param [out] output The buffer to store the derived secret. + * \param [in] outputSz The size of the output buffer. + * + + * \return 0 if the KDF operation is successful, + * \return BAD_FUNC_ARG if the input parameters are invalid. + * \return negative error code if the KDF operation fails. + * + * _Example_ + \code + unsigned char z[32] = { ... }; + unsigned char fixedInfo[16] = { ... }; + unsigned char output[32]; + int ret; + + ret = wc_KDA_KDF_onestep(z, sizeof(z), fixedInfo, sizeof(fixedInfo), + sizeof(output), WC_HASH_TYPE_SHA256, output, sizeof(output)); + if (ret != 0) { + WOLFSSL_MSG("wc_KDA_KDF_onestep failed"); + } + \endcode + */ +int wc_KDA_KDF_onestep(const byte* z, word32 zSz, + const byte* fixedInfo, word32 fixedInfoSz, word32 derivedSecretSz, + enum wc_HashType hashType, byte* output, word32 outputSz); + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/memory.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/memory.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/memory.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/memory.h 2024-08-03 07:30:00.000000000 +0000 @@ -217,3 +217,195 @@ \sa wolfSSL_Free */ int wolfSSL_MemoryPaddingSz(void); + +/*! + \ingroup Memory + + \brief This function is used to set aside static memory for a CTX. + Memory set aside is then used for the CTX’s lifetime and for any SSL objects created + from the CTX. By passing in a NULL ctx pointer and a wolfSSL_method_func function the creation + of the CTX itself will also use static memory. wolfSSL_method_func has the function signature + of WOLFSSL_METHOD* (*wolfSSL_method_func)(void* heap);. + Passing in 0 for max makes it behave as if not set and no max concurrent use restrictions + is in place. + The flag value passed in determines how the memory is used and behavior while operating. + Available flags are the following. + + 0 - default general memory + + WOLFMEM_IO_POOL - used for input/output buffer when sending receiving messages. + Overrides general memory, so all memory in buffer passed in is used for IO. + WOLFMEM_IO_FIXED - same as WOLFMEM_IO_POOL but each SSL now keeps two + buffers to themselves for their lifetime. + WOLFMEM_TRACK_STATS - each SSL keeps track of memory stats while running. + + \return If successful, SSL_SUCCESS will be returned. + \return All unsuccessful return values will be less than 0 or equal to SSL_FAILURE. + + \param ctx address of pointer to a WOLFSSL_CTX structure. + \param method function to create protocol. (should be NULL if ctx is not also NULL) + \param buf memory to use for all operations. + \param sz size of memory buffer being passed in. + \param flag type of memory. + \param max max concurrent operations. + + _Example_ + \code + WOLFSSL_CTX* ctx; + WOLFSSL* ssl; + int ret; + unsigned char memory[MAX]; + int memorySz = MAX; + unsigned char IO[MAX]; + int IOSz = MAX; + int flag = WOLFMEM_IO_FIXED | WOLFMEM_TRACK_STATS; + ... + // create ctx also using static memory, start with general memory to use + ctx = NULL: + ret = wolfSSL_CTX_load_static_memory(&ctx, wolfSSLv23_server_method_ex, memory, memorySz, 0, + MAX_CONCURRENT_HANDSHAKES); + if (ret != SSL_SUCCESS) { + // handle error case + } + // load in memory for use with IO + ret = wolfSSL_CTX_load_static_memory(&ctx, NULL, IO, IOSz, flag, MAX_CONCURRENT_IO); + if (ret != SSL_SUCCESS) { + // handle error case + } + ... + \endcode + + \sa wolfSSL_CTX_new + \sa wolfSSL_CTX_is_static_memory + \sa wolfSSL_is_static_memory +*/ +int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method, + unsigned char* buf, unsigned int sz, int flag, int max); + +/*! + \ingroup Memory + + \brief This function does not change any of the connections behavior and is used only for + gathering information about the static memory usage. + + \return A value of 1 is returned if using static memory for the CTX is true. + \return 0 is returned if not using static memory. + + \param ctx a pointer to a WOLFSSL_CTX structure, created using wolfSSL_CTX_new(). + \param mem_stats structure to hold information about staic memory usage. + + _Example_ + \code + WOLFSSL_CTX* ctx; + int ret; + WOLFSSL_MEM_STATS mem_stats; + ... + //get information about static memory with CTX + + ret = wolfSSL_CTX_is_static_memory(ctx, &mem_stats); + + if (ret == 1) { + // handle case of is using static memory + // print out or inspect elements of mem_stats + } + + if (ret == 0) { + //handle case of ctx not using static memory + } + ... + \endcode + + \sa wolfSSL_CTX_new + \sa wolfSSL_CTX_load_static_memory + \sa wolfSSL_is_static_memory +*/ +int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats); + +/*! + \ingroup Memory + + \brief wolfSSL_is_static_memory is used to gather information about a SSL’s static + memory usage. The return value indicates if static memory is being used and + WOLFSSL_MEM_CONN_STATS will be filled out if and only if the flag WOLFMEM_TRACK_STATS was + passed to the parent CTX when loading in static memory. + + \return A value of 1 is returned if using static memory for the CTX is true. + \return 0 is returned if not using static memory. + + \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). + \param mem_stats structure to contain static memory usage + + _Example_ + \code + WOLFSSL* ssl; + int ret; + WOLFSSL_MEM_CONN_STATS mem_stats; + + ... + + ret = wolfSSL_is_static_memory(ssl, mem_stats); + + if (ret == 1) { + // handle case when is static memory + // investigate elements in mem_stats if WOLFMEM_TRACK_STATS flag + } + ... + \endcode + + \sa wolfSSL_new + \sa wolfSSL_CTX_is_static_memory +*/ +int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_CONN_STATS* mem_stats); + +/*! + \ingroup Memory + + \brief This function is used to set aside static memory for wolfCrypt use. Memory can be + used by passing the created heap hint into functions. An example of this is when calling + wc_InitRng_ex. The flag value passed in determines how the memory is used and behavior + while operating, in general wolfCrypt operations will use memory from a WOLFMEM_GENERAL pool. + Available flags are the following. + + WOLFMEM_GENERAL - default general memory + + WOLFMEM_IO_POOL - used for input/output buffer when sending receiving messages. + Overrides general memory, so all memory in buffer passed in is used for IO. + WOLFMEM_IO_FIXED - same as WOLFMEM_IO_POOL but each SSL now keeps two + buffers to themselves for their lifetime. + WOLFMEM_TRACK_STATS - each SSL keeps track of memory stats while running + + \return If successful, 0 will be returned. + \return All unsuccessful return values will be less than 0. + + \param hint WOLFSSL_HEAP_HINT structure to use + \param buf memory to use for all operations. + \param sz size of memory buffer being passed in. + \param flag type of memory. + \param max max concurrent operations (handshakes, IO). + + _Example_ + \code + WOLFSSL_HEAP_HINT hint; + int ret; + unsigned char memory[MAX]; + int memorySz = MAX; + int flag = WOLFMEM_GENERAL | WOLFMEM_TRACK_STATS; + ... + + // load in memory for use + + ret = wc_LoadStaticMemory(&hint, memory, memorySz, flag, 0); + if (ret != SSL_SUCCESS) { + // handle error case + } + ... + + ret = wc_InitRng_ex(&rng, hint, 0); + + // check ret value + \endcode + + \sa none +*/ +int wc_LoadStaticMemory(WOLFSSL_HEAP_HINT* hint, unsigned char* buf, unsigned int sz, + int flag, int max); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/rsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/rsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/rsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/rsa.h 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,6 @@ } \endcode - \sa wc_RsaInitCavium \sa wc_FreeRsaKey \sa wc_RsaSetRNG */ @@ -56,7 +55,7 @@ \param heap pointer to a heap identifier, for use with memory overrides, allowing custom handling of memory allocation. This heap will be the default used when allocating memory for use with this RSA object - \param devId ID to use with hardware device + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used _Example_ \code @@ -77,7 +76,6 @@ \endcode \sa wc_InitRsaKey - \sa wc_RsaInitCavium \sa wc_FreeRsaKey \sa wc_RsaSetRNG */ @@ -136,6 +134,51 @@ /*! \ingroup RSA + \brief Function that does the RSA operation directly with no padding. The input + size must match key size. Typically this is + used when padding is already done on the RSA input. + + \return size On successfully encryption the size of the encrypted buffer + is returned + \return RSA_BUFFER_E RSA buffer error, output too small or input too large + + \param in buffer to do operation on + \param inLen length of input buffer + \param out buffer to hold results + \param outSz gets set to size of result buffer. Should be passed in as length + of out buffer. If the pointer "out" is null then outSz gets set to the + expected buffer size needed and LENGTH_ONLY_E gets returned. + \param key initialized RSA key to use for encrypt/decrypt + \param type if using private or public key (RSA_PUBLIC_ENCRYPT, + RSA_PUBLIC_DECRYPT, RSA_PRIVATE_ENCRYPT, RSA_PRIVATE_DECRYPT) + \param rng initialized WC_RNG struct + + _Example_ + \code + int ret; + WC_RNG rng; + RsaKey key; + byte in[256]; + byte out[256]; + word32 outSz = (word32)sizeof(out); + … + + ret = wc_RsaDirect(in, (word32)sizeof(in), out, &outSz, &key, + RSA_PRIVATE_ENCRYPT, &rng); + if (ret < 0) { + //handle error + } + \endcode + + \sa wc_RsaPublicEncrypt + \sa wc_RsaPrivateDecrypt +*/ +int wc_RsaDirect(byte* in, word32 inLen, byte* out, word32* outSz, + RsaKey* key, int type, WC_RNG* rng); + +/*! + \ingroup RSA + \brief This function encrypts a message from in and stores the result in out. It requires an initialized public key and a random number generator. As a side effect, this function will return the bytes written @@ -1104,7 +1147,7 @@ \brief This function converts an RsaKey key to DER format. The result is written to output and it returns the number of bytes written. - \return 0 Success + \return >0 Success, number of bytes written. \return BAD_FUNC_ARG Returned if key or output is null, or if key->type is not RSA_PRIVATE, or if inLen isn't large enough for output buffer. \return MEMORY_E Returned if there is an error allocating memory. @@ -1377,7 +1420,7 @@ \ingroup RSA \brief Convert RSA Public key to DER format. Writes to output, and - returns count of bytes written. If with_header is 0 then only the + returns count of bytes written. If with_header is 0 then only the ( seq + n + e) is returned in ASN.1 DER format and will exclude the header. \return >0 Success, number of bytes written. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/sha3.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/sha3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/sha3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/sha3.h 2024-08-03 07:30:00.000000000 +0000 @@ -1010,7 +1010,7 @@ } else { wc_Shake256_Update(shake, data, len); - wc_Shake256_Final(shake, hash); + wc_Shake256_Final(shake, hash, sizeof(hash)); } \endcode @@ -1043,7 +1043,7 @@ } else { wc_Shake256_Update(shake, data, len); - wc_Shake256_Final(shake, hash); + wc_Shake256_Final(shake, hash, sizeof(hash)); } \endcode @@ -1063,6 +1063,7 @@ \param shake pointer to the shake structure to use for encryption \param hash Byte array to hold hash value. + \param hashLen Size of hash in bytes. _Example_ \code @@ -1075,7 +1076,7 @@ } else { wc_Shake256_Update(shake, data, len); - wc_Shake256_Final(shake, hash); + wc_Shake256_Final(shake, hash, sizeof(hash)); } \endcode @@ -1083,7 +1084,7 @@ \sa wc_Shake256_GetHash \sa wc_InitShake256 */ -int wc_Shake256_Final(wc_Shake* shake, byte* hash); +int wc_Shake256_Final(wc_Shake* shake, byte* hash, word32 hashLen); /*! \ingroup SHA @@ -1175,7 +1176,7 @@ } else { wc_Shake256_Update(&shake, data, len); - wc_Shake256_Final(&shake, hash); + wc_Shake256_Final(&shake, hash, sizeof(hash)); wc_Shake256_Free(&shake); } \endcode diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files/ssl.h 2024-08-03 07:30:00.000000000 +0000 @@ -762,7 +762,7 @@ _Example_ \code int send_session(WOLFSSL* ssl, byte* buf, word32 sz, void* userCtx); - // body of send session (wc_dtls_export) that passses + // body of send session (wc_dtls_export) that passes // buf (serialized session) to destination WOLFSSL_CTX* ctx; int ret; @@ -799,7 +799,7 @@ _Example_ \code int send_session(WOLFSSL* ssl, byte* buf, word32 sz, void* userCtx); - // body of send session (wc_dtls_export) that passses + // body of send session (wc_dtls_export) that passes // buf (serialized session) to destination WOLFSSL* ssl; int ret; @@ -859,7 +859,7 @@ /*! \brief Used to export a serialized TLS session. This function is for - importing a serialized state of the connection. + exporting a serialized state of the connection. In most cases wolfSSL_get1_session should be used instead of wolfSSL_tls_export. Additional debug info can be displayed with the macro @@ -1063,12 +1063,12 @@ argument specifies the format type of the file - SSL_FILETYPE_ASN1or SSL_FILETYPE_PEM. Please see the examples for proper usage. - If using an external key store and do not have the private key you can - instead provide the public key and register the crypro callback to handle - the signing. For this you can build with either build with crypto callbacks + If using an external key store and do not have the private key you can + instead provide the public key and register the crypro callback to handle + the signing. For this you can build with either build with crypto callbacks or PK callbacks. To enable crypto callbacks use --enable-cryptocb - or WOLF_CRYPTO_CB and register a crypto callback using - wc_CryptoCb_RegisterDevice and set the associated devId using + or WOLF_CRYPTO_CB and register a crypto callback using + wc_CryptoCb_RegisterDevice and set the associated devId using wolfSSL_CTX_SetDevId. \return SSL_SUCCESS upon success. @@ -1164,7 +1164,7 @@ \sa wolfSSL_use_certificate_chain_file */ int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, - const char* format); + const char* path); /*! \ingroup CertsKeys @@ -1236,7 +1236,9 @@ \brief This function returns a pointer to an array of strings representing directories wolfSSL will search for system CA certs when - wolfSSL_CTX_load_system_CA_certs is called. + wolfSSL_CTX_load_system_CA_certs is called. On systems that don't store + certificates in an accessible system directory (such as Apple platforms), + this function will always return NULL. \return Valid pointer on success. \return NULL pointer on failure. @@ -1266,9 +1268,19 @@ /*! \ingroup CertsKeys - \brief This function attempts to load CA certificates into a WOLFSSL_CTX - from an OS-dependent CA certificate store. Loaded certificates will be - trusted. + \brief On most platforms (including Linux and Windows), this function + attempts to load CA certificates into a WOLFSSL_CTX from an OS-dependent + CA certificate store. Loaded certificates will be trusted. + + On Apple platforms (excluding macOS), certificates can't be obtained from + the system, and therefore cannot be loaded into the wolfSSL certificate + manager. For these platforms, this function enables TLS connections bound to + the WOLFSSL_CTX to use the native system trust APIs to verify authenticity + of the peer certificate chain if the authenticity of the peer cannot first + be authenticated against certificates loaded by the user. + + The platforms supported and tested are: Linux (Debian, Ubuntu, + Gentoo, Fedora, RHEL), Windows 10/11, Android, macOS, and iOS. \return WOLFSSL_SUCCESS on success. \return WOLFSSL_BAD_PATH if no system CA certs were loaded. @@ -1438,9 +1450,9 @@ \brief This function returns the maximum chain depth allowed, which is 9 by default, for a valid session i.e. there is a non-null session object (ssl). - \return MAX_CHAIN_DEPTH returned if the WOLFSSL_CTX structure is not + \return MAX_CHAIN_DEPTH returned if the WOLFSSL structure is not NULL. By default the value is 9. - \return BAD_FUNC_ARG returned if the WOLFSSL_CTX structure is NULL. + \return BAD_FUNC_ARG returned if the WOLFSSL structure is NULL. \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). @@ -1542,12 +1554,12 @@ The format argument specifies the format type of the file - SSL_FILETYPE_ASN1 or SSL_FILETYPE_PEM. - If using an external key store and do not have the private key you can - instead provide the public key and register the crypro callback to handle - the signing. For this you can build with either build with crypto callbacks + If using an external key store and do not have the private key you can + instead provide the public key and register the crypro callback to handle + the signing. For this you can build with either build with crypto callbacks or PK callbacks. To enable crypto callbacks use --enable-cryptocb or - WOLF_CRYPTO_CB and register a crypto callback using - wc_CryptoCb_RegisterDevice and set the associated devId using + WOLF_CRYPTO_CB and register a crypto callback using + wc_CryptoCb_RegisterDevice and set the associated devId using wolfSSL_SetDevId. \return SSL_SUCCESS upon success. @@ -1645,7 +1657,7 @@ \param file a pointer to the name of the file containing the RSA private key to be loaded into the wolfSSL SSL session, with format as specified by format. - \parm format the encoding type of the RSA private key specified by file. + \param format the encoding type of the RSA private key specified by file. Possible values include SSL_FILETYPE_PEM and SSL_FILETYPE_ASN1. _Example_ @@ -1793,7 +1805,7 @@ a socket file descriptor. \return SSL_SUCCESS upon success. - \return Bad_FUNC_ARG upon failure. + \return BAD_FUNC_ARG upon failure. \param ssl pointer to the SSL session, created with wolfSSL_new(). \param fd file descriptor to use with SSL/TLS connection. @@ -1827,7 +1839,7 @@ addr and addr_len parameters set to NULL. \return SSL_SUCCESS upon success. - \return Bad_FUNC_ARG upon failure. + \return BAD_FUNC_ARG upon failure. \param ssl pointer to the SSL session, created with wolfSSL_new(). \param fd file descriptor to use with SSL/TLS connection. @@ -2074,15 +2086,18 @@ \brief This function writes sz bytes from the buffer, data, to the SSL connection, ssl. If necessary, wolfSSL_write() will negotiate an SSL/TLS session if the handshake has not already been performed yet by - wolfSSL_connect() or wolfSSL_accept(). wolfSSL_write() works with both - blocking and non-blocking I/O. When the underlying I/O is non-blocking, - wolfSSL_write() will return when the underlying I/O could not satisfy the - needs of wolfSSL_write() to continue. In this case, a call to - wolfSSL_get_error() will yield either SSL_ERROR_WANT_READ or - SSL_ERROR_WANT_WRITE. The calling process must then repeat the call to - wolfSSL_write() when the underlying I/O is ready. If the underlying I/O - is blocking, wolfSSL_write() will only return once the buffer data of - size sz has been completely written or an error occurred. + wolfSSL_connect() or wolfSSL_accept(). When using (D)TLSv1.3 and early data + feature is compiled in, this function progresses the handshake only up to + the point when it is possible to send data. Next invokations of + wolfSSL_Connect()/wolfSSL_Accept()/wolfSSL_read() will complete the + handshake. wolfSSL_write() works with both blocking and non-blocking I/O. + When the underlying I/O is non-blocking, wolfSSL_write() will return when + the underlying I/O could not satisfy the needs of wolfSSL_write() to + continue. In this case, a call to wolfSSL_get_error() will yield either + SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE. The calling process must then + repeat the call to wolfSSL_write() when the underlying I/O is ready. If the + underlying I/O is blocking, wolfSSL_write() will only return once the buffer + data of size sz has been completely written or an error occurred. \return >0 the number of bytes written upon success. \return 0 will be returned upon failure. Call wolfSSL_get_error() for @@ -2821,7 +2836,7 @@ \return none No return. \param ctx pointer to the SSL context, created with wolfSSL_CTX_new(). - \param mode session timeout value in seconds + \param mode flags indicating verification mode for peer's cert. \param verify_callback callback to be called when verification fails. If no callback is desired, the NULL pointer can be used for verify_callback. @@ -2869,7 +2884,7 @@ \return none No return. \param ssl pointer to the SSL session, created with wolfSSL_new(). - \param mode session timeout value in seconds. + \param mode flags indicating verification mode for peer's cert. \param verify_callback callback to be called when verification fails. If no callback is desired, the NULL pointer can be used for verify_callback. @@ -3029,7 +3044,7 @@ \return BAD_FUNC_ARG if ssl is NULL. \param ssl pointer to a SSL object, created with wolfSSL_new(). - \param devId ID to use with async hardware + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used _Example_ \code @@ -3052,7 +3067,7 @@ \return BAD_FUNC_ARG if ssl is NULL. \param ctx pointer to the SSL context, created with wolfSSL_CTX_new(). - \param devId ID to use with async hardware + \param devId ID to use with crypto callbacks or async hardware. Set to INVALID_DEVID (-2) if not used _Example_ \code @@ -3137,6 +3152,7 @@ \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). \param cb a SessionSecretCb type that is a function pointer with the above signature. + \param ctx a pointer to the user context to be stored _Example_ \code @@ -3168,7 +3184,7 @@ \return FWRITE_ERROR returned if XFWRITE failed to write to the file. \return BAD_MUTEX_E returned if there was a mutex lock failure. - \param name is a constant char pointer that points to a file for writing. + \param fname is a constant char pointer that points to a file for writing. _Example_ \code @@ -3183,7 +3199,7 @@ \sa wolfSSL_restore_session_cache \sa wolfSSL_memrestore_session_cache */ -int wolfSSL_save_session_cache(const char*); +int wolfSSL_save_session_cache(const char* fname); /*! \ingroup IO @@ -3213,7 +3229,7 @@ \sa XFREAD \sa XFOPEN */ -int wolfSSL_restore_session_cache(const char*); +int wolfSSL_restore_session_cache(const char* fname); /*! \ingroup IO @@ -3311,7 +3327,7 @@ \param ctx a pointer to a WOLFSSL_CTX structure, holding the certificate information. - \param fname the cert cache buffer. + \param fname a constant char pointer that points to a file for writing. _Example_ \code @@ -3343,7 +3359,7 @@ \param ctx a pointer to a WOLFSSL_CTX structure, holding the certificate information. - \param fname the cert cache buffer. + \param fname a constant char pointer that points to a file for reading. _Example_ \code @@ -3461,7 +3477,7 @@ \sa CM_GetCertCacheMemSize */ -int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX*); +int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx); /*! \ingroup Setup @@ -3598,7 +3614,7 @@ \sa wolfSSL_dtls_got_timeout \sa wolfSSL_dtls_set_using_nonblock */ -int wolfSSL_dtls_get_using_nonblock(WOLFSSL*); +int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl); /*! \brief This function returns the current timeout value in seconds for the WOLFSSL object. When using non-blocking sockets, something in the user @@ -3918,7 +3934,7 @@ \sa wolfSSL_ERR_print_errors_fp \sa wolfSSL_load_error_strings */ -char* wolfSSL_ERR_error_string(unsigned long,char*); +char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data); /*! \ingroup Debug @@ -3962,7 +3978,7 @@ structure is within the WOLFSSL structure. \return 1 SSL_SENT_SHUTDOWN is returned. - \return 2 SS_RECEIVED_SHUTDOWN is returned. + \return 2 SSL_RECEIVED_SHUTDOWN is returned. \param ssl a constant pointer to a WOLFSSL structure, created using wolfSSL_new(). @@ -3988,7 +4004,7 @@ \sa wolfSSL_SESSION_free */ -int wolfSSL_get_shutdown(const WOLFSSL*); +int wolfSSL_get_shutdown(const WOLFSSL* ssl); /*! \ingroup IO @@ -4015,7 +4031,7 @@ \sa wolfSSL_GetSessionIndex \sa wolfSSL_memsave_session_cache */ -int wolfSSL_session_reused(WOLFSSL*); +int wolfSSL_session_reused(WOLFSSL* ssl); /*! \ingroup TLS @@ -4024,8 +4040,8 @@ \return 0 returned if the connection is not established, i.e. the WOLFSSL struct is NULL or the handshake is not done. - \return 1 returned if the connection is not established i.e. the WOLFSSL - struct is null or the handshake is not done. + \return 1 returned if the connection is established i.e. the WOLFSSL + handshake is done. \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). @@ -4045,7 +4061,7 @@ \sa wolfSSL_get_keys \sa wolfSSL_set_shutdown */ -int wolfSSL_is_init_finished(WOLFSSL*); +int wolfSSL_is_init_finished(WOLFSSL* ssl); /*! \ingroup IO @@ -4077,7 +4093,7 @@ \sa wolfSSL_lib_version */ -const char* wolfSSL_get_version(WOLFSSL*); +const char* wolfSSL_get_version(WOLFSSL* ssl); /*! \ingroup IO @@ -4141,7 +4157,7 @@ \sa wolfSSL_get_cipher_name_internal \sa wolfSSL_get_cipher_name */ -WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL*); +WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl); /*! \ingroup IO @@ -4481,7 +4497,7 @@ \sa wolfSSL_BIO_new, wolfSSL_BIO_s_mem \sa wolfSSL_BIO_new, wolfSSL_BIO_free */ -int wolfSSL_BIO_ctrl_reset_read_request(WOLFSSL_BIO *b); +int wolfSSL_BIO_ctrl_reset_read_request(WOLFSSL_BIO *bio); /*! \ingroup IO @@ -4781,7 +4797,7 @@ \sa wolfSSL_get_peer_certificate \sa wolfSSL_X509_NAME_oneline */ -WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509*); +WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert); /*! \ingroup CertsKeys @@ -4810,7 +4826,7 @@ \sa wolfSSL_X509_get_isCA \sa wolfSSL_get_peer_certificate */ -WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509*); +WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert); /*! \ingroup CertsKeys @@ -4822,7 +4838,7 @@ structure is returned. \return 0 returned if there is not a valid x509 structure passed in. - \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). + \param cert a pointer to a WOLFSSL_X509 structure. _Example_ \code @@ -4841,7 +4857,7 @@ \sa wolfSSL_X509_get_issuer_name \sa wolfSSL_X509_get_isCA */ -int wolfSSL_X509_get_isCA(WOLFSSL_X509*); +int wolfSSL_X509_get_isCA(WOLFSSL_X509* cert); /*! \ingroup CertsKeys @@ -4883,7 +4899,7 @@ \return int an integer value is returned which was retrieved from the x509 object. - \param ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). + \param cert a pointer to a WOLFSSL_X509 structure. _Example_ \code @@ -4905,7 +4921,7 @@ \sa wolfSSL_X509_notAfter \sa wolfSSL_X509_free */ -int wolfSSL_X509_get_signature_type(WOLFSSL_X509*); +int wolfSSL_X509_get_signature_type(WOLFSSL_X509* cert); /*! \brief This function frees a WOLFSSL_X509 structure. @@ -5191,7 +5207,7 @@ \sa wolfSSL_CTX_free \sa wolfSSL_CTX_set_read_ahead */ -int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX*); +int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx); /*! \ingroup Setup @@ -5202,6 +5218,7 @@ \return SSL_FAILURE If ctx is NULL then SSL_FAILURE is returned. \param ctx WOLFSSL_CTX structure to set read ahead flag. + \param v read ahead flag _Example_ \code @@ -5332,7 +5349,7 @@ \sa wolfSSL_free \sa wolfSSL_set_options */ -long wolfSSL_get_options(const WOLFSSL *s); +long wolfSSL_get_options(const WOLFSSL *ssl); /*! \ingroup Setup @@ -5358,7 +5375,7 @@ \sa wolfSSL_new \sa wolfSSL_free */ -long wolfSSL_set_tlsext_debug_arg(WOLFSSL *s, void *arg); +long wolfSSL_set_tlsext_debug_arg(WOLFSSL *ssl, void *arg); /*! \ingroup openSSL @@ -5371,7 +5388,7 @@ \return 1 upon success. \return 0 upon error. - \param s pointer to WolfSSL struct which is created by SSL_new() function + \param s pointer to WOLFSSL struct which is created by SSL_new() function \param type ssl extension type which TLSEXT_STATUSTYPE_ocsp is only supported. @@ -5517,7 +5534,7 @@ \sa wolfSSL_CTX_set_psk_client_callback */ void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx, - wc_psk_client_callback); + wc_psk_client_callback cb); /*! \brief Sets the PSK client side callback. @@ -6232,7 +6249,7 @@ \brief This function sets the timeout value for SSL sessions, in seconds, for the specified SSL context. - \return the previous timeout value, if WOLFSSL_ERROR_CODE_OPENSSL is + \return the previous timeout value, if WOLFSSL_ERROR_CODE_OPENSSL is \return defined on success. If not defined, SSL_SUCCESS will be returned. \return BAD_FUNC_ARG will be returned when the input context (ctx) is null. @@ -7084,7 +7101,7 @@ to MAX_DH_SIZE. \param g a constant unsigned char pointer loaded into the buffer member of the serverDH_G struct. - \param gSz an int type representing the size of g, initialized ot + \param gSz an int type representing the size of g, initialized to MAX_DH_SIZE. _Exmaple_ @@ -7582,18 +7599,49 @@ WOLFSSL_METHOD method = wolfTLSv1_2_client_method(); WOLFSSL_CTX* ctx = WOLFSSL_CTX_new(method); … - if(!wolfSSL_CTX_UnloadCAs(ctx)){ + if(wolfSSL_CTX_UnloadCAs(ctx) != SSL_SUCCESS){ // The function did not unload CAs } \endcode \sa wolfSSL_CertManagerUnloadCAs \sa LockMutex - \sa FreeSignerTable \sa UnlockMutex */ int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX*); + +/*! + \ingroup Setup + + \brief This function unloads intermediate certificates added to the CA + signer list and frees them. + + \return SSL_SUCCESS returned on successful execution of the function. + \return BAD_FUNC_ARG returned if the WOLFSSL_CTX struct is NULL or there + are otherwise unpermitted argument values passed in a subroutine. + \return BAD_STATE_E returned if the WOLFSSL_CTX has a reference count > 1. + \return BAD_MUTEX_E returned if there was a mutex error. The LockMutex() + did not return 0. + + \param ctx a pointer to a WOLFSSL_CTX structure, created using + wolfSSL_CTX_new(). + + _Example_ + \code + WOLFSSL_METHOD method = wolfTLSv1_2_client_method(); + WOLFSSL_CTX* ctx = WOLFSSL_CTX_new(method); + … + if(wolfSSL_CTX_UnloadIntermediateCerts(ctx) != NULL){ + // The function did not unload CAs + } + \endcode + + \sa wolfSSL_CTX_UnloadCAs + \sa wolfSSL_CertManagerUnloadIntermediateCerts +*/ +int wolfSSL_CTX_UnloadIntermediateCerts(WOLFSSL_CTX* ctx); + /*! \ingroup Setup @@ -7741,7 +7789,7 @@ The buffer is provided by the in argument of size sz. format specifies the format type of the buffer; SSL_FILETYPE_ASN1 or SSL_FILETYPE_PEM. More than one CA certificate may be loaded per buffer as long as the - format is in PEM. The _ex version was added in PR 2413 and supports + format is in PEM. The _ex version was added in PR 2413 and supports additional arguments for userChain and flags. \return SSL_SUCCESS upon success @@ -9534,20 +9582,47 @@ #include WOLFSSL_CTX* ctx = wolfSSL_CTX_new(protocol method); - WOLFSSL_CERT_MANAGER* cm = wolfSSL_CertManagerNew(); + WOLFSSL_CERT_MANAGER* cm = wolfSSL_CTX_GetCertManager(ctx); ... - if(wolfSSL_CertManagerUnloadCAs(ctx->cm) != SSL_SUCCESS){ - Failure case. + if(wolfSSL_CertManagerUnloadCAs(cm) != SSL_SUCCESS){ + Failure case. } \endcode - \sa FreeSignerTable \sa UnlockMutex */ int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm); /*! \ingroup CertManager + \brief This function unloads intermediate certificates add to the CA + signer list. + + \return SSL_SUCCESS returned on successful execution of the function. + \return BAD_FUNC_ARG returned if the WOLFSSL_CERT_MANAGER is NULL. + \return BAD_MUTEX_E returned if there was a mutex error. + + \param cm a pointer to a WOLFSSL_CERT_MANAGER structure, + created using wolfSSL_CertManagerNew(). + + _Example_ + \code + #include + + WOLFSSL_CTX* ctx = wolfSSL_CTX_new(protocol method); + WOLFSSL_CERT_MANAGER* cm = wolfSSL_CTX_GetCertManager(ctx); + ... + if(wolfSSL_CertManagerUnloadIntermediateCerts(cm) != SSL_SUCCESS){ + Failure case. + } + \endcode + + \sa UnlockMutex +*/ +int wolfSSL_CertManagerUnloadIntermediateCerts(WOLFSSL_CERT_MANAGER* cm); + +/*! + \ingroup CertManager \brief The function will free the Trusted Peer linked list and unlocks the trusted peer list. @@ -10122,7 +10197,7 @@ \sa wolfSSL_CertManagerSetOCSPOverrideURL \sa wolfSSL_CertManagerCheckOCSP \sa wolfSSL_CertManagerEnableOCSPStapling - \sa wolfSSL_ENableOCSP + \sa wolfSSL_EnableOCSP \sa wolfSSL_DisableOCSP \sa wolfSSL_SetOCSP_Cb */ @@ -10281,7 +10356,13 @@ int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb); /*! - \brief This function enables OCSP certificate verification. + \brief This function enables OCSP certificate verification. The value of + options if formed by or’ing one or more of the following options: + WOLFSSL_OCSP_URL_OVERRIDE - use the override URL instead of the URL in + certificates. The override URL is specified using the + wolfSSL_CTX_SetOCSP_OverrideURL() function. + WOLFSSL_OCSP_CHECKALL - Set all OCSP checks on + WOLFSSL_OCSP_NO_NONCE - Set nonce option for creating OCSP requests \return SSL_SUCCESS returned if the function and subroutines executes without errors. @@ -10536,10 +10617,13 @@ \brief This function sets options to configure behavior of OCSP functionality in wolfSSL. The value of options if formed by or’ing one or more of the following options: - WOLFSSL_OCSP_ENABLE - enable OCSP lookups WOLFSSL_OCSP_URL_OVERRIDE - - use the override URL instead of the URL in certificates. The override URL - is specified using the wolfSSL_CTX_SetOCSP_OverrideURL() function. This - function only sets the OCSP options when wolfSSL has been compiled with + WOLFSSL_OCSP_URL_OVERRIDE - use the override URL instead of the URL in + certificates. The override URL is specified using the + wolfSSL_CTX_SetOCSP_OverrideURL() function. + WOLFSSL_OCSP_CHECKALL - Set all OCSP checks on + WOLFSSL_OCSP_NO_NONCE - Set nonce option for creating OCSP requests + + This function only sets the OCSP options when wolfSSL has been compiled with OCSP support (--enable-ocsp, #define HAVE_OCSP). \return SSL_SUCCESS is returned upon success. @@ -10552,12 +10636,17 @@ _Example_ \code - WOLFSSL_CTX* ctx = 0; - ... - wolfSSL_CTX_OCSP_set_options(ctx, WOLFSSL_OCSP_ENABLE); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); + int options; // initialize to option constant + … + int ret = wolfSSL_CTX_EnableOCSP(ctx, options); + if(ret != SSL_SUCCESS){ + // OCSP is not enabled + } \endcode - \sa wolfSSL_CTX_OCSP_set_override_url + \sa wolfSSL_CertManagerEnableOCSP + \sa wolfSSL_EnableOCSP */ int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options); @@ -13157,7 +13246,7 @@ exchange. Please note that when using protocol DTLS v1.3, the cookie exchange is enabled by default. The Cookie holds a hash of the current transcript so that another server process can handle the ClientHello in - reply. The secret is used when generting the integrity check on the Cookie + reply. The secret is used when generating the integrity check on the Cookie data. \param [in,out] ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). @@ -13168,7 +13257,7 @@ \return BAD_FUNC_ARG if ssl is NULL or not using TLS v1.3. \return SIDE_ERROR if called with a client. - \return WOLFSSL_SUCCESS if succesful. + \return WOLFSSL_SUCCESS if successful. \return MEMORY_ERROR if allocating dynamic memory for storing secret failed. \return Another -ve value on internal error. @@ -13326,7 +13415,7 @@ \brief This function is called on a TLS v1.3 client or server wolfSSL to force the rollover of keys. A KeyUpdate message is sent to the peer and new keys are calculated for encryption. The peer will send back a KeyUpdate - message and the new decryption keys wil then be calculated. + message and the new decryption keys will then be calculated. This function can only be called after a handshake has been completed. \param [in,out] ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). @@ -13391,7 +13480,7 @@ \ingroup Setup \brief This function is called on a TLS v1.3 client wolfSSL context to allow - a client certifcate to be sent post handshake upon request from server. + a client certificate to be sent post handshake upon request from server. This is useful when connecting to a web server that has some pages that require client authentication and others that don't. @@ -13422,7 +13511,7 @@ \ingroup Setup \brief This function is called on a TLS v1.3 client wolfSSL to allow - a client certifcate to be sent post handshake upon request from server. + a client certificate to be sent post handshake upon request from server. A Post-Handshake Client Authentication extension is sent in the ClientHello. This is useful when connecting to a web server that has some pages that require client authentication and others that don't. @@ -13612,7 +13701,7 @@ \param [in,out] ctx a pointer to a WOLFSSL_CTX structure, created with wolfSSL_CTX_new(). - \param [in] groups a list of key exhange groups by identifier. + \param [in] groups a list of key exchange groups by identifier. \param [in] count the number of key exchange groups in groups. \return BAD_FUNC_ARG if a pointer parameter is null, the number of groups @@ -13654,7 +13743,7 @@ use with the TLS v1.3 connections. \param [in,out] ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). - \param [in] groups a list of key exhange groups by identifier. + \param [in] groups a list of key exchange groups by identifier. \param [in] count the number of key exchange groups in groups. \return BAD_FUNC_ARG if a pointer parameter is null, the number of groups @@ -13916,7 +14005,7 @@ \sa wolfSSL_connect \sa wolfSSL_connect_TLSv13 */ -int wolfSSL_write_early_data(OLFSSL* ssl, const void* data, +int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz); /*! @@ -13924,9 +14013,11 @@ \brief This function reads any early data from a client on resumption. Call this function instead of wolfSSL_accept() or wolfSSL_accept_TLSv13() - to accept a client and read any early data in the handshake. - If there is no early data than the handshake will be processed as normal. - This function is only used with servers. + to accept a client and read any early data in the handshake. The function + should be invoked until wolfSSL_is_init_finished() returns true. Early data + may be sent by the client in multiple messsages. If there is no early data + then the handshake will be processed as normal. This function is only used + with servers. \param [in,out] ssl a pointer to a WOLFSSL structure, created using wolfSSL_new(). \param [out] data a buffer to hold the early data read from client. @@ -13937,7 +14028,7 @@ not using TLSv1.3. \return SIDE_ERROR if called with a client. \return WOLFSSL_FATAL_ERROR if accepting a connection fails. - \return WOLFSSL_SUCCESS if successful. + \return Number of early data bytes read (may be zero). _Example_ \code @@ -13949,19 +14040,16 @@ char buffer[80]; ... - ret = wolfSSL_read_early_data(ssl, earlyData, sizeof(earlyData), &outSz); - if (ret != SSL_SUCCESS) { - err = wolfSSL_get_error(ssl, ret); - printf(“error = %d, %s\nâ€, err, wolfSSL_ERR_error_string(err, buffer)); - } - if (outSz > 0) { - // early data available - } - ret = wolfSSL_accept_TLSv13(ssl); - if (ret != SSL_SUCCESS) { - err = wolfSSL_get_error(ssl, ret); - printf(“error = %d, %s\nâ€, err, wolfSSL_ERR_error_string(err, buffer)); - } + do { + ret = wolfSSL_read_early_data(ssl, earlyData, sizeof(earlyData), &outSz); + if (ret < 0) { + err = wolfSSL_get_error(ssl, ret); + printf(“error = %d, %s\nâ€, err, wolfSSL_ERR_error_string(err, buffer)); + } + if (outSz > 0) { + // early data available + } + } while (!wolfSSL_is_init_finished(ssl)); \endcode \sa wolfSSL_write_early_data @@ -14407,7 +14495,7 @@ \param keySz key size pointer \sa wolfSSL_CTX_set_ephemeral_key */ -int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, +int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, const unsigned char** key, unsigned int* keySz); /*! @@ -14420,13 +14508,13 @@ \param keySz key size pointer \sa wolfSSL_set_ephemeral_key */ -int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo, +int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo, const unsigned char** key, unsigned int* keySz); /*! \ingroup SSL \brief Sign a message with the chosen message digest, padding, and RSA key - \return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error + \return WOLFSSL_SUCCESS on success and c on error \param type Hash NID \param m Message to sign. Most likely this will be the digest of the message to sign @@ -14490,6 +14578,211 @@ int wolfSSL_CRYPTO_get_ex_new_index(int, void*, void*, void*, void*); /*! + \ingroup Setup + \brief In case this function is called in a client side, set certificate types + that can be sent to its peer. In case called in a server side, + set certificate types that can be acceptable from its peer. Put cert types in the + buffer with prioritised order. To reset the settings to default, pass NULL + for the buffer or pass zero for len. By default, certificate type is only X509. + In case both side intend to send or accept "Raw public key" cert, + WOLFSSL_CERT_TYPE_RPK should be included in the buffer to set. + + \return WOLFSSL_SUCCESS if cert types set successfully + \return BAD_FUNC_ARG if NULL was passed for ctx, illegal value was specified as + cert type, buf size exceed MAX_CLIENT_CERT_TYPE_CNT was specified or + a duplicate value is found in buf. + + \param ctx WOLFSSL_CTX object pointer + \param buf A buffer where certificate types are stored + \param len buf size in bytes (same as number of certificate types included) + _Example_ + \code + int ret; + WOLFSSL_CTX* ctx; + char buf[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(buf)/sizeof(char); + ... + + ret = wolfSSL_CTX_set_client_cert_type(ctx, buf, len); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_CTX_set_client_cert_type(WOLFSSL_CTX* ctx, const char* buf, int len); + +/*! + \ingroup Setup + \brief In case this function is called in a server side, set certificate types + that can be sent to its peer. In case called in a client side, + set certificate types that can be acceptable from its peer. Put cert types in the + buffer with prioritised order. To reset the settings to default, pass NULL + for the buffer or pass zero for len. By default, certificate type is only X509. + In case both side intend to send or accept "Raw public key" cert, + WOLFSSL_CERT_TYPE_RPK should be included in the buffer to set. + + \return WOLFSSL_SUCCESS if cert types set successfully + \return BAD_FUNC_ARG if NULL was passed for ctx, illegal value was specified as + cert type, buf size exceed MAX_SERVER_CERT_TYPE_CNT was specified or + a duplicate value is found in buf. + + \param ctx WOLFSSL_CTX object pointer + \param buf A buffer where certificate types are stored + \param len buf size in bytes (same as number of certificate types included) + _Example_ + \code + int ret; + WOLFSSL_CTX* ctx; + char buf[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(buf)/sizeof(char); + ... + + ret = wolfSSL_CTX_set_server_cert_type(ctx, buf, len); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_CTX_set_server_cert_type(WOLFSSL_CTX* ctx, const char* buf, int len); + +/*! + \ingroup Setup + \brief In case this function is called in a client side, set certificate types + that can be sent to its peer. In case called in a server side, + set certificate types that can be acceptable from its peer. Put cert types in the + buffer with prioritised order. To reset the settings to default, pass NULL + for the buffer or pass zero for len. By default, certificate type is only X509. + In case both side intend to send or accept "Raw public key" cert, + WOLFSSL_CERT_TYPE_RPK should be included in the buffer to set. + + \return WOLFSSL_SUCCESS if cert types set successfully + \return BAD_FUNC_ARG if NULL was passed for ctx, illegal value was specified as + cert type, buf size exceed MAX_CLIENT_CERT_TYPE_CNT was specified or + a duplicate value is found in buf. + + \param ssl WOLFSSL object pointer + \param buf A buffer where certificate types are stored + \param len buf size in bytes (same as number of certificate types included) + _Example_ + \code + int ret; + WOLFSSL* ssl; + char buf[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(buf)/sizeof(char); + ... + + ret = wolfSSL_set_client_cert_type(ssl, buf, len); + \endcode + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_set_client_cert_type(WOLFSSL* ssl, const char* buf, int len); + +/*! + \ingroup Setup + \brief In case this function is called in a server side, set certificate types + that can be sent to its peer. In case called in a client side, + set certificate types that can be acceptable from its peer. Put cert types in the + buffer with prioritised order. To reset the settings to default, pass NULL + for the buffer or pass zero for len. By default, certificate type is only X509. + In case both side intend to send or accept "Raw public key" cert, + WOLFSSL_CERT_TYPE_RPK should be included in the buffer to set. + + \return WOLFSSL_SUCCESS if cert types set successfully + \return BAD_FUNC_ARG if NULL was passed for ctx, illegal value was specified as + cert type, buf size exceed MAX_SERVER_CERT_TYPE_CNT was specified or + a duplicate value is found in buf. + + \param ctx WOLFSSL_CTX object pointer + \param buf A buffer where certificate types are stored + \param len buf size in bytes (same as number of certificate types included) + _Example_ + \code + int ret; + WOLFSSL* ssl; + char buf[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(buf)/sizeof(char); + ... + + ret = wolfSSL_set_server_cert_type(ssl, buf, len); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_set_server_cert_type(WOLFSSL* ssl, const char* buf, int len); + +/*! + \ingroup SSL + \brief This function returns the result of the client certificate type + negotiation done in ClientHello and ServerHello. WOLFSSL_SUCCESS is returned as + a return value if no negotiation occurs and WOLFSSL_CERT_TYPE_UNKNOWN is + returned as the certificate type. + + \return WOLFSSL_SUCCESS if a negotiated certificate type could be got + \return BAD_FUNC_ARG if NULL was passed for ctx or tp + \param ssl WOLFSSL object pointer + \param tp A buffer where a certificate type is to be returned. One of three + certificate types will be returned: WOLFSSL_CERT_TYPE_RPK, + WOLFSSL_CERT_TYPE_X509 or WOLFSSL_CERT_TYPE_UNKNOWN. + + _Example_ + \code + int ret; + WOLFSSL* ssl; + int tp; + ... + + ret = wolfSSL_get_negotiated_client_cert_type(ssl, &tp); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_get_negotiated_client_cert_type(WOLFSSL* ssl, int* tp); + +/*! + \ingroup SSL + \brief This function returns the result of the server certificate type + negotiation done in ClientHello and ServerHello. WOLFSSL_SUCCESS is returned as + a return value if no negotiation occurs and WOLFSSL_CERT_TYPE_UNKNOWN is + returned as the certificate type. + + \return WOLFSSL_SUCCESS if a negotiated certificate type could be got + \return BAD_FUNC_ARG if NULL was passed for ctx or tp + \param ssl WOLFSSL object pointer + \param tp A buffer where a certificate type is to be returned. One of three + certificate types will be returned: WOLFSSL_CERT_TYPE_RPK, + WOLFSSL_CERT_TYPE_X509 or WOLFSSL_CERT_TYPE_UNKNOWN. + _Example_ + \code + int ret; + WOLFSSL* ssl; + int tp; + ... + + ret = wolfSSL_get_negotiated_server_cert_type(ssl, &tp); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + */ +int wolfSSL_get_negotiated_server_cert_type(WOLFSSL* ssl, int* tp); + +/*! \brief Enable use of ConnectionID extensions for the SSL object. See RFC 9146 and RFC 9147 @@ -14635,3 +14928,111 @@ */ int wolfSSL_dtls_cid_get_tx(WOLFSSL* ssl, unsigned char* buffer, unsigned int bufferSz); + +/*! + \ingroup TLS + + \brief This function returns the raw list of ciphersuites and signature + algorithms offered by the client. The lists are only stored and returned + inside a callback setup with wolfSSL_CTX_set_cert_cb(). This is useful to + be able to dynamically load certificates and keys based on the available + ciphersuites and signature algorithms. + + \param [in] ssl The WOLFSSL object to extract the lists from. + \param [out] optional suites Raw and unfiltered list of client ciphersuites + \param [out] optional suiteSz Size of suites in bytes + \param [out] optional hashSigAlgo Raw and unfiltered list of client + signature algorithms + \param [out] optional hashSigAlgoSz Size of hashSigAlgo in bytes + \return WOLFSSL_SUCCESS when suites available + \return WOLFSSL_FAILURE when suites not available + + _Example_ + \code + int certCB(WOLFSSL* ssl, void* arg) + { + const byte* suites = NULL; + word16 suiteSz = 0; + const byte* hashSigAlgo = NULL; + word16 hashSigAlgoSz = 0; + + wolfSSL_get_client_suites_sigalgs(ssl, &suites, &suiteSz, &hashSigAlgo, + &hashSigAlgoSz); + + // Choose certificate to load based on ciphersuites and sigalgs + } + + WOLFSSL* ctx; + ctx = wolfSSL_CTX_new(wolfTLSv1_3_method_ex(NULL)); + wolfSSL_CTX_set_cert_cb(ctx, certCB, NULL); + \endcode + + \sa wolfSSL_get_ciphersuite_info + \sa wolfSSL_get_sigalg_info +*/ +int wolfSSL_get_client_suites_sigalgs(const WOLFSSL* ssl, + const byte** suites, word16* suiteSz, + const byte** hashSigAlgo, word16* hashSigAlgoSz); + +/*! + \ingroup TLS + + \brief This returns information about the ciphersuite directly from the + raw ciphersuite bytes. + + \param [in] first First byte of the ciphersuite + \param [in] second Second byte of the ciphersuite + + \return WOLFSSL_CIPHERSUITE_INFO A struct containing information about the + type of authentication used in the ciphersuite. + + _Example_ + \code + WOLFSSL_CIPHERSUITE_INFO info = + wolfSSL_get_ciphersuite_info(suites[0], suites[1]); + if (info.rsaAuth) + haveRSA = 1; + else if (info.eccAuth) + haveECC = 1; + \endcode + + \sa wolfSSL_get_client_suites_sigalgs + \sa wolfSSL_get_sigalg_info +*/ +WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first, + byte second); + +/*! + \ingroup TLS + + \brief This returns information about the hash and signature algorithm + directly from the raw ciphersuite bytes. + + \param [in] first First byte of the hash and signature algorithm + \param [in] second Second byte of the hash and signature algorithm + \param [out] hashAlgo The enum wc_HashType of the MAC algorithm + \param [out] sigAlgo The enum Key_Sum of the authentication algorithm + + \return 0 when info was correctly set + \return BAD_FUNC_ARG when either input paramters are NULL or the bytes + are not a recognized sigalg suite + + _Example_ + \code + enum wc_HashType hashAlgo; + enum Key_Sum sigAlgo; + + wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], hashSigAlgo[idx+1], + &hashAlgo, &sigAlgo); + + if (sigAlgo == RSAk || sigAlgo == RSAPSSk) + haveRSA = 1; + else if (sigAlgo == ECDSAk) + haveECC = 1; + \endcode + + \sa wolfSSL_get_client_suites_sigalgs + \sa wolfSSL_get_ciphersuite_info +*/ +int wolfSSL_get_sigalg_info(byte first, byte second, + int* hashAlgo, int* sigAlgo); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/aes.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/aes.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/aes.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/aes.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,12 +1,12 @@ /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€ã‚­ãƒ¼ã‚’設定ã—ã¦åˆæœŸåŒ–ベクトルを設定ã™ã‚‹ã“ã¨ã§AES構造をåˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return 0 キーã¨åˆæœŸåŒ–ベクトルを正常ã«è¨­å®šã—ã¾ã™ã€‚ - \return BAD_FUNC_ARG キーã®é•·ã•ãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param aes 変更ã™ã‚‹AES構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param key æš—å·åŒ–ã¨å¾©å·åŒ–ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ - \param len 渡ã•ã‚ŒãŸã‚­ãƒ¼ã®é•·ã• - \param iv キーをåˆæœŸåŒ–ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹åˆæœŸåŒ–ベクトルã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€éµã‚’設定ã—ã¦åˆæœŸåŒ–ベクトルを設定ã™ã‚‹ã“ã¨ã§Aes構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return 0 éµã¨åˆæœŸåŒ–ベクトルを正常ã«è¨­å®šã—ã¾ã—㟠+ \return BAD_FUNC_ARG éµã®é•·ã•ãŒç„¡åŠ¹ãªå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param aes 変更ã™ã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key æš—å·åŒ–ã¨å¾©å·ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ + \param len 渡ã•ã‚ŒãŸéµã®é•·ã• + \param iv éµã‚’åˆæœŸåŒ–ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹åˆæœŸåŒ–ベクトルã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code Aes enc; @@ -25,11 +25,11 @@ const byte* iv, int dir); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€ç‰¹å®šã®AESオブジェクトã®åˆæœŸåŒ–ベクトルを設定ã—ã¾ã™ã€‚AESオブジェクトã¯ã€ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™å‰ã«åˆæœŸåŒ–ã•ã‚Œã‚‹ã¹ãã§ã™ã€‚ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€æŒ‡å®šã•ã‚ŒãŸAes構造体ã®åˆæœŸåŒ–ベクトルを設定ã—ã¾ã™ã€‚Aes構造体ã¯ã€ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™å‰ã«åˆæœŸåŒ–ã•ã‚Œã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ \return 0 åˆæœŸåŒ–ベクトルを正常ã«è¨­å®šã—ã¾ã™ã€‚ - \return BAD_FUNC_ARG AESãƒã‚¤ãƒ³ã‚¿ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param aes åˆæœŸåŒ–ベクトルを設定ã™ã‚‹AES構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \return BAD_FUNC_ARG Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param aes åˆæœŸåŒ–ベクトルを設定ã™ã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code Aes enc; @@ -45,11 +45,19 @@ int wc_AesSetIV(Aes* aes, const byte* iv); /*! - \ingroup AES - \brief 入力ãƒãƒƒãƒ•ã‚¡ãƒ¼ã‹ã‚‰å¹³æ–‡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã—ã€AESã§Cipher Block Chainingを使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«å…¥ã‚Œã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæš—å·åŒ–ã•ã‚Œã‚‹å‰ã«AESSetKeyを呼ã³å‡ºã™ã“ã¨ã«ã‚ˆã£ã¦AESオブジェクトãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒAESブロック長ã§ã‚ã‚‹ã¨ä»®å®šã—ã€å…¥åŠ›ã•ã‚ŒãŸé•·ã•ãŒãƒ–ロック長ã®å€æ•°ã«ãªã‚‹ã“ã¨ã‚’想定ã—ã¦ã„ã‚‹ãŸã‚ã€ãƒ“ルド構æˆã§WolfSSL_AES_CBC_LENGTH_CHECKSãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ä»»æ„é¸æŠžã§ãƒã‚§ãƒƒã‚¯ãŠã‚ˆã³é©ç”¨ã•ã‚Œã¾ã™ã€‚ブロック多入力をä¿è¨¼ã™ã‚‹ãŸã‚ã«ã€PKCS#7スタイルã®ãƒ‘ディングを事å‰ã«è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯ã‚ãªãŸã®ãŸã‚ã«ãƒ‘ディングを追加ã™ã‚‹OpenSSL AES-CBCメソッドã¨ã¯ç•°ãªã‚Šã¾ã™ã€‚WOLFSSLã¨å¯¾å¿œã™ã‚‹OpenSSL関数を相互é‹ç”¨ã™ã‚‹ã«ã¯ã€OpenSSLコマンドライン関数ã§-nopadオプションを指定ã—ã¦ã€WolfSSL AESCCENCRYPTメソッドã®ã‚ˆã†ã«å‹•ä½œã—ã€æš—å·åŒ–中ã«è¿½åŠ ã®ãƒ‘ディングを追加ã—ã¾ã›ã‚“。 + \ingroup AES + \brief 入力ãƒãƒƒãƒ•ã‚¡ã®å¹³æ–‡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–ã—ã€AESã§Cipher Block Chainingを使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°å‘¼ã³å‡ºã—ã«ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–å‰ã«wc_AesSetKeyを呼ã³å‡ºã—ã¦AESオブジェクトãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒAESブロック長ã§ã‚ã‚‹ã¨ä»®å®šã—ã€å…¥åŠ›ã•ã‚ŒãŸé•·ã•ãŒãƒ–ロック長ã®å€æ•°ã«ãªã‚‹ã“ã¨ã‚’想定ã—ã¦ã„ã‚‹ãŸã‚〠+ ビルド構æˆã§WOLFSSL_AES_CBC_LENGTH_CHECKSãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ä»»æ„é¸æŠžã§ãƒã‚§ãƒƒã‚¯ãŠã‚ˆã³é©ç”¨ã•ã‚Œã¾ã™ã€‚ + ブロック多入力をä¿è¨¼ã™ã‚‹ãŸã‚ã«ã€PKCS#7スタイルã®ãƒ‘ディングを事å‰ã«è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã‚Œã¯è‡ªå‹•çš„ã«ãƒ‘ディングを追加ã™ã‚‹OpenSSL AES-CBCメソッドã¨ã¯ç•°ãªã‚Šã¾ã™ã€‚ + WOLFSSLã¨å¯¾å¿œã™ã‚‹OpenSSL関数を相互é‹ç”¨ã™ã‚‹ã«ã¯ã€OpenSSLコマンドライン関数ã§-nopadオプションを指定ã—ã¦ã€ + wolfSSL_AesCbcEncryptメソッドã®ã‚ˆã†ã«å‹•ä½œã—ã€æš—å·åŒ–中ã«è¿½åŠ ã®ãƒ‘ディングを追加ã—ã¾ã›ã‚“。 + \return 0 メッセージã®æš—å·åŒ–ã«æˆåŠŸã—ã¾ã—ãŸã€‚ - \return BAD_ALIGN_E: ブロック整列誤差ã§è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ - \return BAD_LENGTH_E 入力長ãŒAESブロック長ã®å€æ•°ã§ãªã„å ´åˆã¯ã€ãƒ©ã‚¤ãƒ–ラリーãŒwolfssl_aes_cbc_length_checksã§æ§‹ç¯‰ã•ã‚Œã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_ALIGN_E: ブロックアライメントエラー検出時ã«è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ + \return BAD_LENGTH_E ライブラリーãŒWOLFSSL_AES_CBC_LENGTH_CHECKSã§æ§‹ç¯‰ã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã€å…¥åŠ›é•·ãŒAESブロック長ã®å€æ•°ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param out æš—å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·æ–‡ã‚’æ ¼ç´ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param in æš—å·åŒ–ã•ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ @@ -73,14 +81,22 @@ const byte* in, word32 sz); /*! - \ingroup AES - \brief 入力ãƒãƒƒãƒ•ã‚¡ãƒ¼ã‹ã‚‰æš—å·ã‚’復å·åŒ–ã—ã€AESã§Cipher Block Chainingを使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«å…¥ã‚Œã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¾©å·åŒ–ã•ã‚Œã‚‹å‰ã«AESSetKeyを呼ã³å‡ºã™ã“ã¨ã«ã‚ˆã£ã¦AES構造ãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒAESブロック長ã§æ•´åˆ—ã—ã¦ã„ãŸã¨ä»®å®šã—ã€å…¥åŠ›ã•ã‚ŒãŸé•·ã•ãŒãƒ–ロック長ã®å€æ•°ã«ãªã‚‹ã¨äºˆæƒ³ã—ã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯OpenSSL AES-CBCメソッドã¨ã¯ç•°ãªã‚Šã¾ã™ã€‚ã“ã‚Œã¯ã€PKCS#7パディングを自動的ã«è¿½åŠ ã™ã‚‹ãŸã‚ã€ãƒ–ロックマルãƒå…¥åŠ›ã‚’å¿…è¦ã¨ã—ã¾ã›ã‚“。WolfSSL機能ã¨åŒç­‰ã®OpenSSL関数を相互é‹ç”¨ã™ã‚‹ã«ã¯ã€OpenSSLコマンドライン関数ã§-nopadオプションを指定ã—ã€wolfssl aescbceNcryptメソッドã®ã‚ˆã†ã«å‹•ä½œã—ã€å¾©å·åŒ–中ã«ã‚¨ãƒ©ãƒ¼ã‚’発生ã•ã›ã¾ã›ã‚“。 - \return 0 メッセージを正常ã«å¾©å·åŒ–ã—ã¾ã™ã€‚ - \return BAD_ALIGN_E ブロック整列エラーã§è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - \return BAD_LENGTH_E 入力長ãŒAESブロック長ã®å€æ•°ã§ãªã„å ´åˆã¯ã€ãƒ©ã‚¤ãƒ–ラリーãŒwolfssl_aes_cbc_length_checksã§æ§‹ç¯‰ã•ã‚Œã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param aes データを復å·åŒ–ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param out 復å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ—レーンテキストをä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param in 復å·åŒ–ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup AES + \brief 入力ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ã®æš—å·ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·ã—ã€AESã§Cipher Block Chainingを使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°å‘¼ã³å‡ºã—ã«ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–å‰ã«wc_AesSetKeyを呼ã³å‡ºã—ã¦AESオブジェクトãŒåˆæœŸåŒ–ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒAESブロック長ã§æ•´åˆ—ã—ã¦ã„ãŸã¨ä»®å®šã—ã€å…¥åŠ›ã•ã‚ŒãŸé•·ã•ãŒãƒ–ロック長ã®å€æ•°ã«ãªã‚‹ã¨äºˆæƒ³ã—ã¦ã„ã¾ã™ã€‚ + ã“ã‚Œã¯OpenSSL AES-CBCメソッドã¨ã¯ç•°ãªã‚Šã¾ã™ã€‚ã“ã‚Œã¯ã€PKCS#7パディングを自動的ã«è¿½åŠ ã™ã‚‹ãŸã‚ã€ãƒ–ロックマルãƒå…¥åŠ›ã‚’å¿…è¦ã¨ã—ã¾ã›ã‚“。 + wolfSSL機能ã¨åŒç­‰ã®OpenSSL関数を相互é‹ç”¨ã™ã‚‹ã«ã¯ã€OpenSSLコマンドライン関数ã§-nopadオプションを指定ã—〠+ wolfSSL_ AesCbcEncryptメソッドã®ã‚ˆã†ã«å‹•ä½œã—ã€å¾©å·ä¸­ã«ã‚¨ãƒ©ãƒ¼ã‚’発生ã•ã›ã¾ã›ã‚“。 + \return 0 メッセージを正常ã«å¾©å·ã—ã¾ã—㟠+ \return BAD_ALIGN_E ブロックアライメントエラー検出時ã«è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ + \return BAD_LENGTH_E ライブラリーãŒWOLFSSL_AES_CBC_LENGTH_CHECKSã§æ§‹ç¯‰ã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã€å…¥åŠ›é•·ãŒAESブロック長ã®å€æ•°ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param aes データを復å·ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param out 復å·ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ—レーンテキストをä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + サイズã¯AES_BLOCK_SIZEã®å€æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。必è¦ãªå ´åˆã¯ãƒ‘ディングã¯è¿½åŠ ã•ã‚Œã¾ã™ã€‚ + \param in 復å·ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + サイズã¯AES_BLOCK_SIZEã®å€æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。パディングã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \param sz 入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º _Example_ \code Aes dec; @@ -100,12 +116,18 @@ const byte* in, word32 sz); /*! - \ingroup AES - \brief 入力ãƒãƒƒãƒ•ã‚¡ãƒ¼ã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–/復å·åŒ–ã—ã€AESを使用ã—ã¦CTRモードを使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«å…¥ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_aes_counterãŒã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™å‰ã«ã€AES構造体をAessetKeyã§åˆæœŸåŒ–ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã¯å¾©å·åŒ–ã¨æš—å·åŒ–ã®ä¸¡æ–¹ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚_注:暗å·åŒ–ã¨å¾©å·åŒ–ã®ãŸã‚ã®åŒã˜APIを使用ã™ã‚‹ã“ã¨ã«ã¤ã„ã¦ã€‚ユーザーã¯æš—å·åŒ–/復å·åŒ–ã®ãŸã‚ã®AES構造体を区別ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup AES + \brief 入力ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æš—å·åŒ–/復å·ã—ã€AES CTRモードを使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_Aes_CounterãŒã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™å‰ã«ã€Aes構造体をwc_AesSetKeyã§åˆæœŸåŒ–ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯å¾©å·ã¨æš—å·åŒ–ã®ä¸¡æ–¹ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚_注:æš—å·åŒ–ã¨å¾©å·ã®ãŸã‚ã®åŒã˜APIを使用ã™ã‚‹ã“ã¨ã«ã¤ã„ã¦ã€‚ユーザーã¯æš—å·åŒ–/復å·ã®ãŸã‚ã®Aes構造体を区別ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return int WolfSSLエラーã¾ãŸã¯æˆåŠŸçŠ¶æ³ã«å¯¾å¿œã™ã‚‹æ•´æ•°å€¤ - \param aes データを復å·åŒ–ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param aes データを復å·ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param out æš—å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–テキストをä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param in æš—å·åŒ–ã•ã‚Œã‚‹ãƒ—レーンテキストをå«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + サイズã¯AES_BLOCK_SIZEã®å€æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。必è¦ãªå ´åˆã¯ãƒ‘ディングã¯è¿½åŠ ã•ã‚Œã¾ã™ã€‚ + \param in æš—å·åŒ–ã•ã‚Œã‚‹ãƒ—レーンテキストをå«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + サイズã¯AES_BLOCK_SIZEã®å€æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。パディングã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \param sz 入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º _Example_ \code Aes enc; @@ -131,10 +153,15 @@ const byte* in, word32 sz); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ–ロックã®å…¥åŠ›ãƒ–ロックã€INã€OUTPUTブロックã€OUTã§ã™ã€‚æä¾›ã•ã‚ŒãŸAES構造体ã®ã‚­ãƒ¼ã‚’使用ã—ã¾ã™ã€‚ã“ã‚Œã¯ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™å‰ã«WC_AESSETKEYã§åˆæœŸåŒ–ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚WC_AESSETKEYã¯ã€IVセットãŒNULLã«å‘¼ã³å‡ºã•ã‚ŒãŸã¯ãšã§ã™ã€‚ã“ã‚Œã¯ã€Configure Option WolfSSL_AES_DIRECTãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚__ warning:ã»ã¼ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã§ECBモードã¯å®‰å…¨æ€§ãŒä½Žã„ã¨è€ƒãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚å¯èƒ½ãªé™ã‚ŠECB APIを直接使用ã—ãªã„ã§ãã ã•ã„。 + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ–ロックinã§ä¸Žãˆã‚‰ã‚ŒãŸå˜ä¸€ã®å¹³æ–‡ãƒ‡ãƒ¼ã‚¿ãƒ–ロックを暗å·åŒ–ã—ã¦å˜ä¸€ã®å‡ºåŠ›ãƒ–ロックoutã«å‡ºåŠ›ã—ã¾ã™ã€‚ + ãã®éš›ã«ã€Aes構造体ã§æä¾›ã•ã‚ŒãŸã®éµã‚’使用ã—ã¾ã™ã€‚éµã¯ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™å‰ã«wc_AesSetKeyã§åˆæœŸåŒ–ã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + wc_AesSetKeyã¸ã®å…¥åŠ›ivã«ã¯NULLを指定ã—ã¦å‘¼ã³å‡ºã—ã¦ãã ã•ã„。 + ã“ã‚Œã¯ã€Configure Option WolfSSL_AES_DIRECTãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ + __ warning:ã»ã¼ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã§ECBモードã¯å®‰å…¨æ€§ãŒä½Žã„ã¨è€ƒãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ + å¯èƒ½ãªé™ã‚ŠECB APIを直接使用ã—ãªã„ã§ãã ã•ã„。 \return int WolfSSLエラーã¾ãŸã¯æˆåŠŸçŠ¶æ³ã«å¯¾å¿œã™ã‚‹æ•´æ•°å€¤ - \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param out æš—å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–テキストをä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code @@ -151,11 +178,14 @@ int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ–ロックã®1ブロック復å·åŒ–ã€INã€INã€OUTPUT OUTã§ã™ã€‚æä¾›ã•ã‚ŒãŸAES構造体ã®ã‚­ãƒ¼ã‚’使用ã—ã¾ã™ã€‚ã“ã‚Œã¯ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™å‰ã«WC_AESSETKEYã§åˆæœŸåŒ–ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚WC_AESSETKEYã¯ã€IVセットãŒNULLã«å‘¼ã³å‡ºã•ã‚ŒãŸã¯ãšã§ã™ã€‚ã“ã‚Œã¯ã€Configure Option WolfSSL_AES_DIRECTãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚__ warning:ã»ã¼ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã§ECBモードã¯å®‰å…¨æ€§ãŒä½Žã„ã¨è€ƒãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚å¯èƒ½ãªé™ã‚ŠECB APIを直接使用ã—ãªã„ã§ãã ã•ã„。 + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ–ロックinã§ä¸Žãˆã‚‰ã‚ŒãŸå˜ä¸€ã®æš—å·ãƒ‡ãƒ¼ã‚¿ãƒ–ロックを復å·ã—ã¦å˜ä¸€ã®å‡ºåŠ›ãƒ–ロックoutã«å‡ºåŠ›ã—ã¾ã™ã€‚ + æä¾›ã•ã‚ŒãŸAes構造体ã®éµã‚’使用ã—ã¾ã™ã€‚Aes構造体ã¯ã€ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã™å‰ã«wc_AesSetKeyã§åˆæœŸåŒ–ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚wc_AesSetKeyã¯ã€ivãŒNULLã§å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã‚Œã¯ã€Configure Option WOLFSSL_AES_DIRECTãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ + __ warning:ã»ã¼ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã§ECBモードã¯å®‰å…¨æ€§ãŒä½Žã„ã¨è€ƒãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚å¯èƒ½ãªé™ã‚ŠECB APIを直接使用ã—ãªã„ã§ãã ã•ã„。 \return int WolfSSLエラーã¾ãŸã¯æˆåŠŸçŠ¶æ³ã«å¯¾å¿œã™ã‚‹æ•´æ•°å€¤ - \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param out 復å·åŒ–ã•ã‚ŒãŸæš—å·ãƒ†ã‚­ã‚¹ãƒˆã®ãƒ—レーンテキストを格ç´ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param aes データã®å¾©å·ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param out 復å·ã•ã‚ŒãŸå¹³æ–‡ãƒ†ã‚­ã‚¹ãƒˆã‚’æ ¼ç´ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code Aes dec; @@ -171,14 +201,23 @@ int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€CTRモードã®AESキーをAESã§è¨­å®šã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚指定ã•ã‚ŒãŸã‚­ãƒ¼ã€IV(åˆæœŸåŒ–ベクトル)ã€ãŠã‚ˆã³æš—å·åŒ–DIR(方å‘)ã§AESオブジェクトをåˆæœŸåŒ–ã—ã¾ã™ã€‚構æˆã‚ªãƒ—ションwolfssl_aes_directãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ç¾åœ¨WC_AessetKeyDirectã¯å†…部的ã«WC_AESSETKEYを使用ã—ã¾ã™ã€‚__ warning:ã»ã¼ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã§ECBモードã¯å®‰å…¨æ€§ãŒä½Žã„ã¨è€ƒãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚å¯èƒ½ãªé™ã‚ŠECB APIを直接使用ã—ãªã„ã§ãã ã•ã„ - \return 0 キーã®è¨­å®šã«æˆåŠŸã—ã¾ã—ãŸã€‚ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€CTRモードã®AESéµã‚’AESã§è¨­å®šã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 指定ã•ã‚ŒãŸéµã€iv(åˆæœŸåŒ–ベクトル)ã€ãŠã‚ˆã³æš—å·åŒ–dir(方å‘)ã§AESオブジェクトをåˆæœŸåŒ–ã—ã¾ã™ã€‚ + 構æˆã‚ªãƒ—ションWOLFSSL_AES_DIRECTãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ + wc_AesEncryptDirectã¨wc_AesDecryptDirectを呼ã³å‡ºã™éš›ã®Aes構造体ã®åˆæœŸåŒ–ã«ã¯ã“ã®é–¢æ•°ã‚’使ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ç¾åœ¨wc_AesSetKeyDirectã¯å†…部的ã«wc_AesSetKeyを使用ã—ã¾ã™ã€‚ + __ warning:ã»ã¼ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã§ECBモードã¯å®‰å…¨æ€§ãŒä½Žã„ã¨è€ƒãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ + å¯èƒ½ãªé™ã‚ŠECB APIを直接使用ã—ãªã„ã§ãã ã•ã„ + \return 0 éµã®è¨­å®šã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ãŒç„¡åŠ¹ãªé•·ã•ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param key æš—å·åŒ–ã¨å¾©å·åŒ–ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ - \param len 渡ã•ã‚ŒãŸã‚­ãƒ¼ã®é•·ã• - \param iv キーをåˆæœŸåŒ–ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹åˆæœŸåŒ–ベクトル + \param key æš—å·åŒ–ã¨å¾©å·ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ + \param len 渡ã•ã‚ŒãŸéµã®é•·ã• + \param iv éµã‚’åˆæœŸåŒ–ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹åˆæœŸåŒ–ベクトル + \param dir æš—å·åŒ–ã®æ–¹å‘を指定ã—ã¾ã™ã€‚wc_AesEncryptDirectã«ä½¿ç”¨ã™ã‚‹éš›ã«ã¯AES_ENCRYPTIONã€wc_AesDecryptDirectã«ã¯AES_DECRYPTIONを指定ã—ã¾ã™ã€‚ + (注æ„: wc_AesSetKeyDirect ã‚’Aesカウンターモードã«ä½¿ç”¨ã™ã‚‹éš›ã«ã¯æš—å·åŒ–/復å·ã«ã‚ˆã‚‰ãšã€AES_ENCRYPTIONを指定ã—ã¦ãã ã•ã„。) + _Example_ \code Aes enc; @@ -198,12 +237,13 @@ const byte* iv, int dir); /*! - \ingroup AES - \brief ã“ã®æ©Ÿèƒ½ã¯ã€AES GCM(Galois / Counter Mode)ã®ã‚­ãƒ¼ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ã§AESオブジェクトをåˆæœŸåŒ–ã—ã¾ã™ã€‚コンパイル時ã«Configureオプションhous_aesgcmãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ - \return 0 キーã®è¨­å®šã«æˆåŠŸã—ã¾ã—ãŸã€‚ - \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ãŒç„¡åŠ¹ãªé•·ã•ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param key æš—å·åŒ–ã¨å¾©å·åŒ–ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ + \ingroup AES + \brief ã“ã®æ©Ÿèƒ½ã¯ã€AES GCM(Galois/Counter Mode)ã®éµã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 与ãˆã‚‰ã‚ŒãŸkeyã§Aes構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚コンパイル時ã«ConfigureオプションHAVE_AESGCMãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ + \return 0 éµã®è¨­å®šã«æˆåŠŸã—ã¾ã—ãŸã€‚ + \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸkeyãŒç„¡åŠ¹ãªé•·ã•ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key æš—å·åŒ–ã¨å¾©å·ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ _Example_ \code Aes enc; @@ -219,12 +259,13 @@ int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ãƒãƒƒãƒ•ã‚¡INã«ä¿æŒã—ã€çµæžœã®æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’出力ãƒãƒƒãƒ•ã‚¡OUTã«æ ¼ç´ã—ã¾ã™ã€‚æš—å·åŒ–ã™ã‚‹å‘¼ã³å‡ºã—ã”ã¨ã«æ–°ã—ã„IV(åˆæœŸåŒ–ベクトル)ãŒå¿…è¦ã§ã™ã€‚ã¾ãŸã€å…¥åŠ›èªè¨¼ãƒ™ã‚¯ãƒˆãƒ«ã€Authinã€AuthTagã¸ã®å…¥åŠ›èªè¨¼ãƒ™ã‚¯ãƒˆãƒ«ã‚’エンコードã—ã¾ã™ã€‚ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€ãƒãƒƒãƒ•ã‚¡inã«æ ¼ç´ã•ã‚Œã¦ã„る平文メッセージを暗å·åŒ–ã—çµæžœã‚’出力ãƒãƒƒãƒ•ã‚¡outã«å‡ºåŠ›ã—ã¾ã™ã€‚ + æš—å·åŒ–ã™ã‚‹å‘¼ã³å‡ºã—ã”ã¨ã«æ–°ã—ã„iv(åˆæœŸåŒ–ベクトル)ãŒå¿…è¦ã§ã™ã€‚ã¾ãŸã€å…¥åŠ›èªè¨¼ãƒ™ã‚¯ãƒˆãƒ«ã€authInã€authTagã¸ã®å…¥åŠ›èªè¨¼ãƒ™ã‚¯ãƒˆãƒ«ã‚’エンコードã—ã¾ã™ã€‚ \return 0 入力メッセージã®æš—å·åŒ–ã«æˆåŠŸã—ã¾ã—㟠- \param aes - データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param in æš—å·åŒ–ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿æŒã—ã¦ã„る入力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡inã®ã‚µã‚¤ã‚º(sz)ã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \param in æš—å·åŒ–ã™ã‚‹å¹³æ–‡ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿æŒã—ã¦ã„る入力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚サイズã¯AES_BLOCK_SIZEã®å€æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。パディングã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \param sz æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é•·ã• \param iv åˆæœŸåŒ–ベクトルをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param ivSz åˆæœŸåŒ–ベクトルã®é•·ã• @@ -257,14 +298,15 @@ const byte* authIn, word32 authInSz); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ãƒãƒƒãƒ•ã‚¡INã«ä¿æŒã—ã€çµæžœã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ†ã‚­ã‚¹ãƒˆã‚’出力ãƒãƒƒãƒ•ã‚¡OUTã«æ ¼ç´ã—ã¾ã™ã€‚ã¾ãŸã€æŒ‡å®šã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ã€authtagã«å¯¾ã—ã¦ã€å…¥åŠ›èªè¨¼ãƒ™ã‚¯ãƒˆãƒ«ã€Authinã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ - \return 0 入力メッセージã®å¾©å·åŒ–ã«æˆåŠŸã—ã¾ã—㟠+ \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€ãƒãƒƒãƒ•ã‚¡inã§ä¸Žãˆã‚‰ã‚ŒãŸå…¥åŠ›æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’復å·ã—ã€çµæžœã‚’出力ãƒãƒƒãƒ•ã‚¡outã«æ ¼ç´ã—ã¾ã™ã€‚ + ã¾ãŸã€æŒ‡å®šã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ã€authTagã«å¯¾ã—ã¦ã€å…¥åŠ›èªè¨¼ãƒ™ã‚¯ãƒˆãƒ«ã€authInã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ + \return 0 入力メッセージã®å¾©å·ã«æˆåŠŸã—ã¾ã—㟠\return AES_GCM_AUTH_E èªè¨¼ã‚¿ã‚°ãŒæä¾›ã•ã‚ŒãŸèªè¨¼ã‚³ãƒ¼ãƒ‰ãƒ™ã‚¯ãƒˆãƒ«ã¨ä¸€è‡´ã—ãªã„å ´åˆã€authtag。 - \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param out メッセージテキストをä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param in æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’復å·åŒ–ã™ã‚‹å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param sz 復å·åŒ–ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆã®é•·ã• + \param aes データã®å¾©å·ã«ä½¿ç”¨ã•ã‚Œã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param out メッセージテキストをä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚サイズã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡inã®ã‚µã‚¤ã‚º(sz)ã¨åŒã˜ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。 + \param in æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚サイズã¯AES_BLOCK_SIZEã®å€æ•°ã§ãªã‘ã‚Œã°ãªã‚‰ãªã„。 + \param sz 復å·ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆã®é•·ã• \param iv åˆæœŸåŒ–ベクトルをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param ivSz åˆæœŸåŒ–ベクトルã®é•·ã• \param authTag èªè¨¼ã‚¿ã‚°ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ @@ -296,11 +338,11 @@ const byte* authIn, word32 authInSz); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€GAROISメッセージèªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹GMACオブジェクトã®ã‚­ãƒ¼ã‚’åˆæœŸåŒ–ã—ã¦è¨­å®šã—ã¾ã™ã€‚ - \return 0 キーã®è¨­å®šã«æˆåŠŸã—ã¾ã—㟠- \return BAD_FUNC_ARG キーã®é•·ã•ãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param gmac èªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹GMACオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€GAROISメッセージèªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹Gmac構造体ã®éµã‚’åˆæœŸåŒ–ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + \return 0 éµã®è¨­å®šã«æˆåŠŸã—ã¾ã—㟠+ \return BAD_FUNC_ARG 引数keyã®é•·ã•ãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \param gmac èªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹Gmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param key èªè¨¼ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ _Example_ \code @@ -313,10 +355,11 @@ int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯Authin Inputã®GMACãƒãƒƒã‚·ãƒ¥ã‚’生æˆã—ã€çµæžœã‚’Authtagãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚wc_gmacupdateを実行ã—ãŸå¾Œã€ç”Ÿæˆã•ã‚ŒãŸauthtagを既知ã®èªè¨¼ã‚¿ã‚°ã«æ¯”較ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¿¡é ¼æ€§ã‚’検証ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯authIn Inputã®GMACãƒãƒƒã‚·ãƒ¥ã‚’生æˆã—ã€çµæžœã‚’authTagãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚ + wc_GmacUpdateを実行ã—ãŸå¾Œã€ç”Ÿæˆã•ã‚ŒãŸauthTagを既知ã®èªè¨¼ã‚¿ã‚°ã«æ¯”較ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¿¡é ¼æ€§ã‚’検証ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 GMACãƒãƒƒã‚·ãƒ¥ã®è¨ˆç®—ã«æˆåŠŸã—ã¾ã—ãŸã€‚ - \param gmac èªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹GMACオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param gmac èªè¨¼ã«ä½¿ç”¨ã•ã‚Œã‚‹Gmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param iv ãƒãƒƒã‚·ãƒ¥ã«ä½¿ç”¨ã•ã‚Œã‚‹åˆæœŸåŒ–ベクトル \param ivSz 使用ã•ã‚Œã‚‹åˆæœŸåŒ–ベクトルã®ã‚µã‚¤ã‚º \param authIn 確èªã™ã‚‹èªè¨¼ãƒ™ã‚¯ãƒˆãƒ«ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ @@ -342,11 +385,11 @@ byte* authTag, word32 authTagSz); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€CCMを使用ã—ã¦AESオブジェクトã®ã‚­ãƒ¼ã‚’設定ã—ã¾ã™ï¼ˆCBC-MACã®ã‚«ã‚¦ãƒ³ã‚¿ï¼‰ã€‚AES構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–ã‚Šã€ä»˜å±žã®ã‚­ãƒ¼ã§åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return none - \param aes 付属ã®ã‚­ãƒ¼ã‚’ä¿ç®¡ã™ã‚‹ãŸã‚ã®AES構造 - \param key æš—å·åŒ–ã¨å¾©å·åŒ–ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€CCMを使用ã—ã¦AESオブジェクトã®éµã‚’設定ã—ã¾ã™ï¼ˆCBC-MACã®ã‚«ã‚¦ãƒ³ã‚¿ï¼‰ã€‚Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–ã‚Šã€å¼•æ•°ã§ä¸Žãˆã‚‰ã‚ŒãŸkeyã§åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return none + \param aes 引数keyã‚’ä¿ç®¡ã™ã‚‹ãŸã‚ã®Aes構造体 + \param key æš—å·åŒ–ã¨å¾©å·ã®ãŸã‚ã®16,24ã€ã¾ãŸã¯32ãƒã‚¤ãƒˆã®ç§˜å¯†éµ _Example_ \code Aes enc; @@ -360,10 +403,11 @@ int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€CCMを使用ã—ã¦ã€å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€INã€OUTã€OUTã€OUTã‚’CCM(CBC-MACã®ã‚«ã‚¦ãƒ³ã‚¿ï¼‰ã‚’æš—å·åŒ–ã—ã¾ã™ã€‚ãã®å¾Œã€Authin Inputã‹ã‚‰èªè¨¼ã‚¿ã‚°ã€AuthtAgを計算ã—ã¦æ ¼ç´ã—ã¾ã™ã€‚ - \return none - \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€CCMを使用ã—ã¦ã€å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€INã€OUTã€OUTã€OUTã‚’CCM(CBC-MACã®ã‚«ã‚¦ãƒ³ã‚¿ï¼‰ã‚’æš—å·åŒ–ã—ã¾ã™ã€‚ + ãã®å¾Œã€Authin Inputã‹ã‚‰èªè¨¼ã‚¿ã‚°ã€AuthtAgを計算ã—ã¦æ ¼ç´ã—ã¾ã™ã€‚ + \return none + \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param in æš—å·åŒ–ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿æŒã—ã¦ã„る入力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param sz æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é•·ã• @@ -397,14 +441,14 @@ const byte* authIn, word32 authInSz); /*! - \ingroup AES - \brief ã“ã®é–¢æ•°ã¯ã€CCMを使用ã—ã¦ã€å…¥åŠ›æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ã€CCM(CBC-MACã®ã‚«ã‚¦ãƒ³ã‚¿ï¼‰ã‚’使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«å¾©å·åŒ–ã—ã¾ã™ã€‚ãã®å¾Œã€Authin Inputã‹ã‚‰AuthatAgã€AuthatAgを計算ã—ã¾ã™ã€‚許å¯ã‚¿ã‚°ãŒç„¡åŠ¹ãªå ´åˆã¯ã€å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã‚’ゼロã«è¨­å®šã—ã€AES_CCM_AUTH_Eã‚’è¿”ã—ã¾ã™ã€‚ - \return 0 入力メッセージã®å¾©å·åŒ–ã«æˆåŠŸã—ã¾ã—㟠- \return AES_CCM_AUTH_E èªè¨¼ã‚¿ã‚°ãŒæä¾›ã•ã‚ŒãŸèªè¨¼ã‚³ãƒ¼ãƒ‰ãƒ™ã‚¯ãƒˆãƒ«ã¨ä¸€è‡´ã—ãªã„å ´åˆã€authtag。 - \param aes データã®æš—å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹AESオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿å­˜ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param in æš—å·åŒ–ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿æŒã—ã¦ã„る入力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param sz 入力暗å·ãƒ†ã‚­ã‚¹ãƒˆã®å¾©å·åŒ– + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€CCMを使用ã—ã¦ã€å…¥åŠ›æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ã€CCM(CBC-MACã®ã‚«ã‚¦ãƒ³ã‚¿ï¼‰ã‚’使用ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«å¾©å·ã—ã¾ã™ã€‚ãã®å¾Œã€authIn入力ã‹ã‚‰authTagを計算ã—ã¾ã™ã€‚èªè¨¼ã‚¿ã‚°ãŒç„¡åŠ¹ãªå ´åˆã¯ã€å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã‚’ゼロã«è¨­å®šã—ã€AES_CCM_AUTH_Eã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 入力メッセージã®å¾©å·ã«æˆåŠŸã—ã¾ã—㟠+ \return AES_CCM_AUTH_E èªè¨¼ã‚¿ã‚°ãŒæä¾›ã•ã‚ŒãŸèªè¨¼ã‚³ãƒ¼ãƒ‰ãƒ™ã‚¯ãƒˆãƒ«ã¨ä¸€è‡´ã—ãªã„å ´åˆ + \param aes データã®å¾©å·ã«ä½¿ç”¨ã•ã‚Œã‚‹Aes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param out 復å·ã—ãŸãƒ†ã‚­ã‚¹ãƒˆã‚’出力ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param in 復å·ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿æŒã—ã¦ã„る入力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param sz 入力暗å·ãƒ†ã‚­ã‚¹ãƒˆã®ã‚µã‚¤ã‚º \param nonce nonceã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼ˆ1回ã ã‘使用ã•ã‚Œã¦ã„る数) \param nonceSz ノンスã®é•·ã• \param authTag èªè¨¼ã‚¿ã‚°ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ @@ -438,14 +482,14 @@ const byte* authIn, word32 authInSz); /*! - \ingroup AES - \brief ã“ã‚Œã¯ã€æš—å·åŒ–ã¾ãŸã¯å¾©å·åŒ–タイプを修正ã™ã‚‹ãŸã‚ã®ã‚­ãƒ¼ã®è¨­å®šã‚’支æ´ã™ã‚‹ã“ã¨ã§ã™ã€‚完了ã—ãŸã‚‰ã€AESキーã§WC_AESXTSFREEを呼ã³å‡ºã™ã“ã¨ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ãªã‚Šã¾ã—ãŸã€‚ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯ã€AES XTSモードを使用ã™ã‚‹æš—å·åŒ–ã¾ãŸã¯å¾©å·ã§ä½¿ç”¨ã™ã‚‹éµã®è¨­å®šã«ä½¿ç”¨ã—ã¾ã™ã€‚完了ã—ãŸã‚‰ã€AESキーã§wc_AesXtsFreeを呼ã³å‡ºã™ã“ã¨ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ãªã‚Šã¾ã—ãŸã€‚ \return 0 æˆåŠŸ - \param aes ENCRYPT /復å·åŒ–プロセスã®ãŸã‚ã®AESキー - \param key AESキーをä¿æŒã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼| ..Tweak Key - \param len キーãƒãƒƒãƒ•ã‚¡ã®ãƒã‚¤ãƒˆæ•°ã®é•·ã•ã€‚キーサイズã®2å€ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã™ãªã‚ã¡ã€16ãƒã‚¤ãƒˆã®ã‚­ãƒ¼ã«ã¤ã„ã¦ã€‚ - \param dir æ–¹å‘ã€AES_Encryptionã¾ãŸã¯AES_Decryptionã®ã„ãšã‚Œã‹ - \param heap メモリã«ä½¿ç”¨ã™ã‚‹ãƒ’ントヒント。nullã«ãªã‚‹ã“ã¨ãŒã§ãã¾ã™ + \param aes æš—å·åŒ–ã¾ãŸã¯å¾©å·å‡¦ç†ã«ä½¿ç”¨ã™ã‚‹XtsAes構造体 + \param key 補正値(Tewak)を加味ã—ãŸAESéµã‚’ä¿æŒã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ + \param len éµãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚éµã‚µã‚¤ã‚ºã®2å€ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚(ã™ãªã‚ã¡ã€16ãƒã‚¤ãƒˆã®éµã®å ´åˆã¯32) + \param dir 処ç†æ–¹å‘ã€AES_Encryptionã¾ãŸã¯AES_Decryptionã®ã„ãšã‚Œã‹ã‚’指定ã—ã¾ã™ã€‚ + \param heap メモリã«ä½¿ç”¨ã™ã‚‹ãƒ’ープヒント。NULLを設定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ _Example_ \code XtsAes aes; @@ -464,13 +508,13 @@ word32 len, int dir, void* heap, int devId); /*! - \ingroup AES - \brief WC_AESXTSENCRYPTã¨åŒã˜ãƒ—ロセスã§ã™ãŒã€ãƒã‚¤ãƒˆé…列ã®ä»£ã‚ã‚Šã«Tweak値ã¨ã—ã¦Word64型を使用ã—ã¾ã™ã€‚ã“ã‚Œã¯ã€Word64ã‚’ãƒã‚¤ãƒˆé…列ã«å¤‰æ›ã—ã€WC_AESXTSENCRYPTを呼ã³å‡ºã—ã¾ã™ã€‚ + \ingroup AES + \brief wc_AesXtsEncryptã¨åŒã˜å‡¦ç†ã‚’è¡Œã„ã¾ã™ãŒã€ãƒã‚¤ãƒˆé…列ã®ä»£ã‚ã‚Šã«Tweak値ã¨ã—ã¦word64型を使用ã—ã¾ã™ã€‚本関数ã§word64ã‚’ãƒã‚¤ãƒˆé…列ã«å¤‰æ›ã—ã€wc_AesXtsEncryptを呼ã³å‡ºã—ã¾ã™ã€‚ \return 0 æˆåŠŸ - \param aes ブロック暗å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹AESキー + \param aes ブロック暗å·åŒ–/復å·ã«ä½¿ç”¨ã™ã‚‹XtsAes構造体 \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ \param in æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒ—レーンテキストãƒãƒƒãƒ•ã‚¡ - \param sz 両方ã¨ã‚‚ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param sz ãƒãƒƒãƒ•ã‚¡ï¼ˆin, out両方)ã®ã‚µã‚¤ã‚º _Example_ \code XtsAes aes; @@ -495,13 +539,13 @@ const byte* in, word32 sz, word64 sector); /*! - \ingroup AES - \brief WC_AESXTSDECRYPTã¨åŒã˜ãƒ—ロセスã§ã¯ãªãã€BYTEé…列ã®ä»£ã‚ã‚Šã«Word64タイプを使用ã—ã¾ã™ã€‚ã“ã‚Œã¯Word64ã‚’ãƒã‚¤ãƒˆé…列ã«å¤‰æ›ã™ã‚‹ã ã‘ã§ã™ã€‚ + \ingroup AES + \brief wc_AesXtsDecryptã¨åŒã˜å‡¦ç†ã‚’è¡Œã„ã¾ã™ãŒã€ãƒã‚¤ãƒˆé…列ã®ä»£ã‚ã‚Šã«Tweak値ã¨ã—ã¦word64タイプを使用ã—ã¾ã™ã€‚本関数ã§word64ã‚’ãƒã‚¤ãƒˆé…列ã«å¤‰æ›ã™ã‚‹ã ã‘ã§ã™ã€‚ \return 0 æˆåŠŸ - \param aes ブロック暗å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹AESキー + \param aes ブロック暗å·åŒ–/復å·ã«ä½¿ç”¨ã™ã‚‹XtsAes構造体 \param out プレーンテキストをä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ - \param in 復å·åŒ–ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆãƒãƒƒãƒ•ã‚¡ãƒ¼ã‚’入力ã—ã¾ã™ - \param sz 両方ã¨ã‚‚ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param in 復å·ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆãƒãƒƒãƒ•ã‚¡ + \param sz ãƒãƒƒãƒ•ã‚¡ï¼ˆin, out両方)ã®ã‚µã‚¤ã‚º _Example_ \code XtsAes aes; @@ -526,13 +570,13 @@ const byte* in, word32 sz, word64 sector); /*! - \ingroup AES - \brief XTSモードã®ã‚ã‚‹AES。(XTS)XEXæš—å·åŒ–ã¨æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ç›—ã‚“ã æš—å·åŒ–。 + \ingroup AES + \brief AES XTSモードã§æš—å·åŒ–ã—ã¾ã™ã€‚(XTS)XEXæš—å·åŒ–ã¨å¹³æ–‡ãŒãƒ–ロック長ã®å€æ•°ã§ãªã„å ´åˆã®å‡¦ç†(Ciphertext Stealing)ã‚’è¡Œã„ã¾ã™ã€‚ \return 0 æˆåŠŸ - \param aes ブロック暗å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹AESキー + \param aes ブロック暗å·åŒ–/復å·ã«ä½¿ç”¨ã™ã‚‹XtsAes構造体 \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ - \param in æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒ—レーンテキストãƒãƒƒãƒ•ã‚¡ - \param sz 両方ã¨ã‚‚ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param in æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒ—レーンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ + \param sz ãƒãƒƒãƒ•ã‚¡ï¼ˆin, out両方)ã®ã‚µã‚¤ã‚º \param i Tweakã«ä½¿ç”¨ã™ã‚‹å€¤ _Example_ \code @@ -557,13 +601,13 @@ const byte* in, word32 sz, const byte* i, word32 iSz); /*! - \ingroup AES - \brief æš—å·åŒ–ã¨åŒã˜ãƒ—ロセスã§ã™ãŒã€AESキーã¯AES_Decryptionタイプã§ã™ã€‚ + \ingroup AES + \brief æš—å·åŒ–ã¨åŒã˜ãƒ—ロセスã§ã™ãŒã€XtsAes構造体ã¯AES_Decryptionタイプã§ã™ã€‚ \return 0 æˆåŠŸ - \param aes ブロック暗å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹AESキー + \param aes ブロック暗å·åŒ–/復å·ã«ä½¿ç”¨ã™ã‚‹XtsAes構造体 \param out プレーンテキストをä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ - \param in 復å·åŒ–ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆãƒãƒƒãƒ•ã‚¡ãƒ¼ã‚’入力ã—ã¾ã™ - \param sz 両方ã¨ã‚‚ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param in 復å·ã™ã‚‹æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ + \param sz ãƒãƒƒãƒ•ã‚¡ï¼ˆin, out両方)ã®ã‚µã‚¤ã‚º \param i Tweakã«ä½¿ç”¨ã™ã‚‹å€¤ _Example_ \code @@ -588,8 +632,8 @@ const byte* in, word32 sz, const byte* i, word32 iSz); /*! - \ingroup AES - \brief ã“ã‚Œã¯XTSAES構造ã«ã‚ˆã£ã¦ä½¿ç”¨ã•ã‚Œã‚‹ã™ã¹ã¦ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã™ã‚‹ã“ã¨ã§ã™ + \ingroup AES + \brief ã“ã®é–¢æ•°ã¯XtsAes構造体ã§ä½¿ç”¨ã•ã‚Œã‚‹ã™ã¹ã¦ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã—ã¾ã™ã€‚ \return 0 æˆåŠŸ _Example_ \code @@ -609,11 +653,11 @@ /*! - \ingroup AES + \ingroup AES \brief Aes構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ヒープヒントを設定ã—ã€ASYNCãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’使用ã™ã‚‹å ´åˆã®IDも設定ã—ã¾ã™ã€‚Aes構造体ã®ä½¿ç”¨ãŒçµ‚了ã—ãŸéš›ã«wc_AesFreeを呼ã³å‡ºã™ã®ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ä»»ã•ã‚Œã¦ã„ã¾ã™ã€‚ \return 0 æˆåŠŸ - \param aes åˆæœŸåŒ–ã«ã¯AES構造 - \param heap å¿…è¦ã«å¿œã˜ã¦malloc / freeã«ä½¿ç”¨ã™ã‚‹ãƒ’ントヒント + \param aes åˆæœŸåŒ–対象ã®Aes構造体 + \param heap å¿…è¦ã«å¿œã˜ã¦malloc / freeã«ä½¿ç”¨ã™ã‚‹ãƒ’ープヒント _Example_ \code Aes enc; @@ -631,10 +675,10 @@ /*! \ingroup AES - \brief Aes構造体ã«é–¢é€£ã¤ã‘られãŸãƒªã‚½ãƒ¼ã‚¹ã‚’å¯èƒ½ãªã‚‰è§£æ”¾ã™ã‚‹ã€‚ + \brief Aes構造体ã«é–¢é€£ã¤ã‘られãŸãƒªã‚½ãƒ¼ã‚¹ã‚’å¯èƒ½ãªã‚‰è§£æ”¾ã—ã¾ã™ã€‚ 内部的ã«ã¯ãƒŽãƒ¼ã‚ªãƒšãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¨ãªã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ãŒã€ãƒ™ã‚¹ãƒˆãƒ—ラクティスã¨ã—ã¦ã©ã®ã‚±ãƒ¼ã‚¹ã§ã‚‚ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ \return 戻り値ãªã— - \param aes Freeã™ã¹ãAes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ + \param aes Freeã™ã¹ãAes構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code Aes enc; @@ -650,11 +694,11 @@ int wc_AesFree(Aes* aes); /*! - \ingroup AES - \brief CFBモードをæŒã¤AES。 - \return 0 失敗時ã®æˆåŠŸã¨å¦å®šçš„ãªã‚¨ãƒ©ãƒ¼å€¤ - \param aes ブロック暗å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹AESキー - \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¯ã€å°‘ãªãã¨ã‚‚InpectBufferã¨åŒã˜ãらã„大ãã„å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ + \ingroup AES + \brief AES CFBモードã§æš—å·åŒ–ã‚’è¡Œã„ã¾ã™ã€‚ + \return 0 æˆåŠŸæ™‚ã«è¿”ã‚Šã¾ã™ã€‚失敗時ã«ã¯è² å€¤ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param aes ブロック暗å·åŒ–/復å·ã«ä½¿ç”¨ã™ã‚‹Aes構造体 + \param out æš—å·ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¯ã€å°‘ãªãã¨ã‚‚入力プレーンテキストãƒãƒƒãƒ•ã‚¡ã¨åŒã˜ã‚µã‚¤ã‚ºãŒå¿…è¦ã§ã™ã€‚ \param in æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒ—レーンテキストãƒãƒƒãƒ•ã‚¡ _Example_ \code @@ -675,12 +719,12 @@ int wc_AesCfbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz); /*! - \ingroup AES - \brief CFBモードをæŒã¤AES。 - \return 0 失敗時ã®æˆåŠŸã¨å¦å®šçš„ãªã‚¨ãƒ©ãƒ¼å€¤ - \param aes ブロック暗å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹AESキー - \param out 復å·åŒ–ã•ã‚ŒãŸãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¯ã€å°‘ãªãã¨ã‚‚inputBufferã¨åŒã˜å¤§ãã•ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“) - \param in 復å·åŒ–ã™ã‚‹å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ + \ingroup AES + \brief AES CFBモードã§å¾©å·ã‚’è¡Œã„ã¾ã™ã€‚ + \return 0 æˆåŠŸæ™‚ã«è¿”ã‚Šã¾ã™ã€‚失敗時ã«ã¯è² å€¤ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param aes ブロック暗å·åŒ–/復å·ã«ä½¿ç”¨ã™ã‚‹Aes構造体 + \param out 復å·ã•ã‚ŒãŸãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹ãŸã‚ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¯ã€å°‘ãªãã¨ã‚‚入力ãƒãƒƒãƒ•ã‚¡ã¨åŒã˜ã‚µã‚¤ã‚ºãŒå¿…è¦ã§ã™ã€‚ + \param in 復å·ã™ã‚‹æš—å·ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã—ãŸå…¥åŠ›ãƒãƒƒãƒ•ã‚¡ _Example_ \code Aes aes; @@ -700,17 +744,17 @@ int wc_AesCfbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz); /*! - \ingroup AES + \ingroup AES \brief ã“ã®é–¢æ•°ã¯ã€RFC 5297ã«è¨˜è¼‰ã•ã‚Œã¦ã„るよã†ã«SIV(åˆæˆåˆæœŸåŒ–ベクトル)暗å·åŒ–を実行ã—ã¾ã™ã€‚ \return 0 æš—å·åŒ–ã«æˆåŠŸã—ãŸå ´åˆ - \return BAD_FUNC_ARG キーã€SIVã€ã¾ãŸã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒNULLã®å ´åˆã€‚キーサイズãŒ32,48ã€ã¾ãŸã¯64ãƒã‚¤ãƒˆã®å ´åˆã«ã‚‚è¿”ã•ã‚Œã¾ã™ã€‚ - \return Other AESã¾ãŸã¯CMACæ“作ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã‚‹ãã®ä»–ã®è² ã®ã‚¨ãƒ©ãƒ¼å€¤ã€‚ + \return BAD_FUNC_ARG éµã€SIVã€ã¾ãŸã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒNULLã®å ´åˆã€‚éµã‚µã‚¤ã‚ºãŒ32,48ã€ã¾ãŸã¯64ãƒã‚¤ãƒˆã®å ´åˆã«ã‚‚è¿”ã•ã‚Œã¾ã™ã€‚ + \return Other ãã®ä»–ã®è² ã®ã‚¨ãƒ©ãƒ¼å€¤ã€‚AESã¾ãŸã¯CMACæ“作ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param key 使用ã™ã‚‹éµã‚’å«ã‚€ãƒã‚¤ãƒˆãƒãƒƒãƒ•ã‚¡ã€‚ - \param keySz キーãƒãƒƒãƒ•ã‚¡ã®é•·ã•ï¼ˆãƒã‚¤ãƒˆå˜ä½ï¼‰ã€‚ + \param keySz éµãƒãƒƒãƒ•ã‚¡ã®é•·ã•ï¼ˆãƒã‚¤ãƒˆå˜ä½ï¼‰ã€‚ \param assoc 追加ã®èªè¨¼ã•ã‚ŒãŸé–¢é€£ãƒ‡ãƒ¼ã‚¿ï¼ˆAD)。 \param assocSz ADãƒãƒƒãƒ•ã‚¡ã®ãƒã‚¤ãƒˆæ•° - \param nonce 一度使用ã•ã‚Œã‚‹æ•°ã€‚ADã¨åŒã˜æ–¹æ³•ã§ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã«ã‚ˆã£ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \param nonceSz ãƒã‚¤ãƒˆå˜ä½ã®NOCEãƒãƒƒãƒ•ã‚¡ã®é•·ã•ã€‚ + \param nonce ナンス(一度ã ã‘使用ã•ã‚Œã‚‹å€¤ï¼‰ã€‚ADã¨åŒã˜æ–¹æ³•ã§ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã«ã‚ˆã£ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \param nonceSz ãƒã‚¤ãƒˆå˜ä½ã®ãƒŠãƒ³ã‚¹ãƒãƒƒãƒ•ã‚¡ã®é•·ã•ã€‚ \param in æš—å·åŒ–ã™ã‚‹å¹³æ–‡ã®ãƒãƒƒãƒ•ã‚¡ã€‚ \param inSz 平文ãƒãƒƒãƒ•ã‚¡ã®é•·ã• \param siv S2Vã«ã‚ˆã‚‹SIV出力(RFC 5297 2.4å‚照)。 @@ -736,19 +780,19 @@ const byte* in, word32 inSz, byte* siv, byte* out); /*! - \ingroup AES - \brief ã“ã®æ©Ÿèƒ½ã¯ã€RFC 5297ã«è¨˜è¼‰ã•ã‚Œã¦ã„るよã†ã«SIV(åˆæˆåˆæœŸåŒ–ベクトル)復å·åŒ–を実行ã™ã‚‹ã€‚ - \return 0 復å·åŒ–ã«æˆåŠŸã—ãŸå ´åˆ - \return BAD_FUNC_ARG キーã€SIVã€ã¾ãŸã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒNULLã®å ´åˆã€‚キーサイズãŒ32,48ã€ã¾ãŸã¯64ãƒã‚¤ãƒˆã®å ´åˆã«ã‚‚è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup AES + \brief ã“ã®æ©Ÿèƒ½ã¯ã€RFC 5297ã«è¨˜è¼‰ã•ã‚Œã¦ã„るよã†ã«SIV(åˆæˆåˆæœŸåŒ–ベクトル)復å·ã‚’実行ã—ã¾ã™ + \return 0 復å·ã«æˆåŠŸã—ãŸå ´åˆ + \return BAD_FUNC_ARG éµã€SIVã€ã¾ãŸã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒNULLã®å ´åˆã€‚キーサイズãŒ32,48ã€ã¾ãŸã¯64ãƒã‚¤ãƒˆã®å ´åˆã«ã‚‚è¿”ã•ã‚Œã¾ã™ã€‚ \return AES_SIV_AUTH_E S2Vã«ã‚ˆã£ã¦æ´¾ç”Ÿã—ãŸSIVãŒå…¥åŠ›SIVã¨ä¸€è‡´ã—ãªã„å ´åˆï¼ˆRFC 5297 2.7ã‚’å‚照)。 - \return Other AESã¾ãŸã¯CMACæ“作ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã‚‹ãã®ä»–ã®è² ã®ã‚¨ãƒ©ãƒ¼å€¤ã€‚ + \return Other ãã®ä»–ã®è² ã®ã‚¨ãƒ©ãƒ¼å€¤ã€‚AESã¾ãŸã¯CMACæ“作ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param key 使用ã™ã‚‹éµã‚’å«ã‚€ãƒã‚¤ãƒˆãƒãƒƒãƒ•ã‚¡ã€‚ - \param keySz キーãƒãƒƒãƒ•ã‚¡ã®é•·ã•ï¼ˆãƒã‚¤ãƒˆå˜ä½ï¼‰ã€‚ + \param keySz éµãƒãƒƒãƒ•ã‚¡ã®é•·ã•ï¼ˆãƒã‚¤ãƒˆå˜ä½ï¼‰ã€‚ \param assoc 追加ã®èªè¨¼ã•ã‚ŒãŸé–¢é€£ãƒ‡ãƒ¼ã‚¿ï¼ˆAD)。 \param assocSz ADãƒãƒƒãƒ•ã‚¡ã®ãƒã‚¤ãƒˆæ•° - \param nonce 一度使用ã•ã‚Œã‚‹æ•°ã€‚ADã¨åŒã˜æ–¹æ³•ã§ã€åŸºç¤Žã¨ãªã‚‹ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã«ã‚ˆã£ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \param nonceSz ãƒã‚¤ãƒˆå˜ä½ã®NOCEãƒãƒƒãƒ•ã‚¡ã®é•·ã•ã€‚ - \param in 復å·åŒ–ã™ã‚‹æš—å·æ–‡ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ + \param nonce ナンス(一度ã ã‘使用ã•ã‚Œã‚‹å€¤ï¼‰ã€‚ADã¨åŒã˜æ–¹æ³•ã§ã€åŸºç¤Žã¨ãªã‚‹ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã«ã‚ˆã£ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \param nonceSz ãƒã‚¤ãƒˆå˜ä½ã®ãƒŠãƒ³ã‚¹ãƒãƒƒãƒ•ã‚¡ã®é•·ã•ã€‚ + \param in 復å·ã™ã‚‹æš—å·æ–‡ãƒãƒƒãƒ•ã‚¡ã€‚ \param inSz æš—å·æ–‡ãƒãƒƒãƒ•ã‚¡ã®é•·ã• \param siv æš—å·æ–‡ã«ä»˜éšã™ã‚‹SIV(RFC 5297 2.4ã‚’å‚照)。 _Example_ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/asn_public.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/asn_public.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/asn_public.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/asn_public.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,8 @@ /*! - \ingroup ASN - \brief ã“ã®é–¢æ•°ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®è¨¼æ˜Žæ›¸ã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚デフォルトã®ã‚ªãƒ—ション:version = 3(0x2)ã€sigtype = sha_with_rsaã€issuer =空白ã€dayValid = 500ã€selfsigned = 1(true)発行者ã¨ã—ã¦ã®ä»¶å=空白 - \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \ingroup ASN + \brief ã“ã®é–¢æ•°ã¯Cert構造体をデフォルトã®å€¤ã§åˆæœŸåŒ–ã—ã¾ã™ã€‚デフォルトã®ã‚ªãƒ—ション:version = 3(0x2)ã€sigtype = sha_with_rsaã€issuer =空白ã€dayValid = 500ã€selfsigned = 1(true)発行者ã¨ã—ã¦ã®ä»¶å=空白 + \return æˆåŠŸã—ãŸå ´åˆ0ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code Cert myCert; @@ -13,17 +14,78 @@ int wc_InitCert(Cert*); /*! - \ingroup ASN - \brief CAç½²å付ã証明書を作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚被写体情報ãŒå…¥åŠ›ã•ã‚ŒãŸå¾Œã«å‘¼ã³å‡ºã•ã‚Œã¾ã—ãŸã€‚ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸å…¥åŠ›ã‹ã‚‰X509証明書V3 RSAã¾ãŸã¯ECCを作æˆã—ã¾ã™ã€‚ãã®å¾Œã€ã“ã®è¨¼æ˜Žæ›¸ã‚’Derbufferã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚証明書を生æˆã™ã‚‹ãŸã‚ã®RSAKEYã¾ãŸã¯ECCKEYã®ã„ãšã‚Œã‹ã‚’å–ã‚Šã¾ã™ã€‚ã“ã®ãƒ¡ã‚½ãƒƒãƒ‰ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹å‰ã«ã€è¨¼æ˜Žæ›¸ã‚’WC_INITCERTã§åˆæœŸåŒ–ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - \return Success 指定ã•ã‚ŒãŸå…¥åŠ›è¨¼æ˜Žæ›¸ã‹ã‚‰X509証明書を正常ã«è¡Œã†ã¨ã€ç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ - \return MEMORY_E xmallocã§ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ - \return BUFFER_E æä¾›ã•ã‚ŒãŸDerbufferãŒç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸æ“作ã®ç‚ºã«æ–°ãŸãªCert構造体を割り当ã¦ã¾ã™ã€‚ + 割り当ã¦ãŸCert構造体ã¯ã“ã®é–¢æ•°å†…ã§åˆæœŸåŒ–ã•ã‚Œã‚‹ã®ã§ã€wc_InitCert()を呼ã³å‡ºã™å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。 + アプリケーションãŒã“ã®Cert構造体ã®ä½¿ç”¨ã‚’終了ã™ã‚‹éš›ã«ã¯wc_CertFree()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 処ç†ãŒæˆåŠŸã—ãŸéš›ã«ã¯æ–°ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return メモリ確ä¿ã«å¤±æ•—ã—ãŸå ´åˆã«ã¯NULLã‚’è¿”ã—ã¾ã™ã€‚ + + \param メモリã®å‹•çš„確ä¿ã§ä½¿ç”¨ã•ã‚Œã‚‹ãƒ’ープã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚NULLã®æŒ‡å®šã‚‚å¯ã€‚ + + _Example_ + \code + Cert* myCert; + + myCert = wc_CertNew(NULL); + if (myCert == NULL) { + // Cert creation failure + } + \endcode + + \sa wc_InitCert + \sa wc_MakeCert + \sa wc_CertFree + +*/ +Cert* wc_CertNew(void* heap); + + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯wc_CertNew()ã§ç¢ºä¿ã•ã‚ŒãŸCert構造体を解放ã—ã¾ã™ã€‚ + \return ç„¡ã— + \param 解放ã™ã¹ãCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Cert* myCert; + + myCert = wc_CertNew(NULL); + + // Perform cert operations. + + wc_CertFree(myCert); + \endcode + + \sa wc_InitCert + \sa wc_MakeCert + \sa wc_CertNew + +*/ +void wc_CertFree(Cert* cert); + +/*! + \ingroup ASN + \brief CAç½²å付ã証明書を作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + サブジェクト情報を入力ã—ãŸå¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸å…¥åŠ›ã‹ã‚‰X.509v3 RSAã¾ãŸã¯ECC証明書を作æˆã—derBufferã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ + 証明書を生æˆã™ã‚‹ãŸã‚ã®RsaKeyã¾ãŸã¯EccKeyã®ã„ãšã‚Œã‹ã‚’引数ã¨ã—ã¦å–ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹å‰ã«ã€è¨¼æ˜Žæ›¸ã‚’wc_InitCertã§åˆæœŸåŒ–ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 指定ã•ã‚ŒãŸå…¥åŠ›è¨¼æ˜Žæ›¸ã‹ã‚‰X509証明書ãŒæ­£å¸¸ã«ç”Ÿæˆã•ã‚ŒãŸå ´åˆã€ç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return MEMORY_E xmallocã§ã®ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã‚Šã¾ã™ã€‚ + \return BUFFER_E æä¾›ã•ã‚ŒãŸderBufferãŒç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ \return Others 証明書ã®ç”ŸæˆãŒæˆåŠŸã—ãªã‹ã£ãŸå ´åˆã€è¿½åŠ ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - \param cert åˆæœŸåŒ–ã•ã‚ŒãŸè¨¼æ˜Žæ›¸æ§‹é€ ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param cert åˆæœŸåŒ–ã•ã‚ŒãŸCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param derBuffer 生æˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param derSz 証明書をä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º - \param rsaKey 証明書ã®ç”Ÿæˆã«ä½¿ç”¨ã•ã‚Œã‚‹RSAキーをå«ã‚€RSAKEY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param eccKey 証明書ã®ç”Ÿæˆã«ä½¿ç”¨ã•ã‚Œã‚‹ECCキーをå«ã‚€ECCKEY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param rsaKey 証明書ã®ç”Ÿæˆã«ä½¿ç”¨ã•ã‚Œã‚‹RSAéµã‚’å«ã‚€RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param eccKey 証明書ã®ç”Ÿæˆã«ä½¿ç”¨ã•ã‚Œã‚‹ECCéµã‚’å«ã‚€EccKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code Cert myCert; @@ -43,16 +105,21 @@ ecc_key* eccKey, WC_RNG* rng); /*! - \ingroup ASN - \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›è¨¼æ˜Žæ›¸ã‚’使用ã—ã¦è¨¼æ˜Žæ›¸ç½²åè¦æ±‚ã‚’è¡Œã„ã€å‡ºåŠ›ã‚’Derbufferã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚証明書è¦æ±‚を生æˆã™ã‚‹RSAKEYã¾ãŸã¯ECCKEYã®ã©ã¡ã‚‰ã‹ã‚’å–ã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ãŒè¨¼æ˜Žæ›¸è¦æ±‚ã«ç½²åã™ã‚‹ãŸã‚ã«wc_signcert()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã®ä½¿ç”¨ä¾‹ã«ã¤ã„ã¦ã¯ã€WolfCryptテストアプリケーション(./wolfcrypt/test/test.c)をå‚ç…§ã—ã¦ãã ã•ã„。 - \return Success 指定ã•ã‚ŒãŸå…¥åŠ›è¨¼æ˜Žæ›¸ã‹ã‚‰X.509証明書è¦æ±‚を正常ã«è¡Œã†ã¨ã€ç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸è¦æ±‚ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ - \return MEMORY_E xmallocã§ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ - \return BUFFER_E æä¾›ã•ã‚ŒãŸDerbufferãŒç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ - \return Other 証明書è¦æ±‚生æˆãŒæˆåŠŸã—ãªã‹ã£ãŸå ´åˆã€è¿½åŠ ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - \param cert åˆæœŸåŒ–ã•ã‚ŒãŸè¨¼æ˜Žæ›¸æ§‹é€ ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param derBuffer 生æˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸è¦æ±‚ã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param derSz 証明書è¦æ±‚ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º - \param rsaKey 証明書è¦æ±‚を生æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RSAキーをå«ã‚€RSAKEY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup ASN + \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ã•ã‚ŒãŸCert構造体を使用ã—ã¦è¨¼æ˜Žæ›¸ç½²åè¦æ±‚を作æˆã—derBufferã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ + 証明書è¦æ±‚ã®ç”Ÿæˆã«ã¯RsaKeyã¾ãŸã¯EccKeyã®ã„ãšã‚Œã‹ã®éµã‚’å—ã‘å–り使用ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã®å¾Œã«ã€ç½²åã™ã‚‹ãŸã‚ã«wc_SignCert()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã®ä½¿ç”¨ä¾‹ã«ã¤ã„ã¦ã¯ã€wolfCryptテストアプリケーション(./wolfcrypt/test/test.c)ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + \return 証明書署åè¦æ±‚ãŒæ­£å¸¸ã«ç”Ÿæˆã•ã‚Œã‚‹ã¨ã€ç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ç½²åè¦æ±‚ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return MEMORY_E xmallocã§ã®ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆ + \return BUFFER_E æä¾›ã•ã‚ŒãŸderBufferãŒç”Ÿæˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã‚‹å ´åˆ + \return Other 証明書署åè¦æ±‚ã®ç”ŸæˆãŒæˆåŠŸã—ãªã‹ã£ãŸå ´åˆã€è¿½åŠ ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + \param cert åˆæœŸåŒ–ã•ã‚ŒãŸCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derBuffer 生æˆã•ã‚ŒãŸè¨¼æ˜Žæ›¸ç½²åè¦æ±‚ã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derSz 証明書署åè¦æ±‚ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param rsaKey 証明書署åè¦æ±‚を生æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RSAéµã‚’å«ã‚€RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param eccKey 証明書署åè¦æ±‚を生æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RECCéµã‚’å«ã‚€EccKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code Cert myCert; @@ -71,18 +138,21 @@ RsaKey* rsaKey, ecc_key* eccKey); /*! - \ingroup ASN - \brief ã“ã®é–¢æ•°ã¯ãƒãƒƒãƒ•ã‚¡ãƒ¼ã«ç½²åã—ã€ç½²åã‚’ãƒãƒƒãƒ•ã‚¡ã®æœ€å¾Œã«è¿½åŠ ã—ã¾ã™ã€‚ç½²åã®ç¨®é¡žã‚’å–ã‚Šã¾ã™ã€‚CAç½²å付ã証明書を作æˆã™ã‚‹å ´åˆã¯ã€wc_makecert()ã¾ãŸã¯wc_makecertreq()ã®å¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - \return Success 証明書ã«æ­£å¸¸ã«ç½²åã™ã‚‹å ´åˆã¯ã€CERTã®æ–°ã—ã„サイズ(署åã‚’å«ã‚€ï¼‰ã‚’è¿”ã—ã¾ã™ã€‚ - \return MEMORY_E xmallocã§ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ + \ingroup ASN + \brief ã“ã®é–¢æ•°ã¯ãƒãƒƒãƒ•ã‚¡ãƒ¼ã®å†…容ã«ç½²åã—ã€ç½²åã‚’ãƒãƒƒãƒ•ã‚¡ã®æœ€å¾Œã«è¿½åŠ ã—ã¾ã™ã€‚ç½²åã®ç¨®é¡žã‚’å–ã‚Šã¾ã™ã€‚ + CAç½²å付ã証明書を作æˆã™ã‚‹å ´åˆã¯ã€wc_MakeCert()ã¾ãŸã¯wc_MakeCertReq()ã®å¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \return 証明書ã¸ã®ç½²åã«æˆåŠŸã—ãŸå ´åˆã¯ã€è¨¼æ˜Žæ›¸ã®æ–°ã—ã„サイズ(ç½²åã‚’å«ã‚€)ã‚’è¿”ã—ã¾ã™ã€‚ + \return MEMORY_E xmallocã§ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã§ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ \return BUFFER_E æä¾›ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ã«ã¯æä¾›ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return Other 証明書ã®ç”ŸæˆãŒæˆåŠŸã—ãªã‹ã£ãŸå ´åˆã€è¿½åŠ ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - \param requestSz ç½²åã—ãŸã“ã¨ã‚’è¦æ±‚ã—ã¦ã„る証明書本文ã®ã‚µã‚¤ã‚º - \param sType 作æˆã™ã‚‹ç½²åã®ç¨®é¡žã€‚有効ãªã‚ªãƒ—ションã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.CTC_MD5WRSAã€CTC_SHAWRSAã€CTC_SHAWECDSAã€CTC_SHA256WECDSAã€ANDCTC_SHA256WRSA - \param buffer ç½²åã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚æˆåŠŸï¼šæ–°ãŸã«ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿æŒã—ã¾ã™ - \param buffSz æ–°ãŸã«ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ï¼ˆåˆè¨ˆï¼‰ã‚µã‚¤ã‚º - \param rsaKey 証明書ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RSAキーをå«ã‚€RSAKEY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param eccKey 証明書ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ECCキーをå«ã‚€ECCKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param requestSz ç½²å対象ã®è¨¼æ˜Žæ›¸æœ¬æ–‡ã®ã‚µã‚¤ã‚º + \param sigType 作æˆã™ã‚‹ç½²åã®ç¨®é¡žã€‚有効ãªã‚ªãƒ—ションã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™:CTC_MD5WRSAã€CTC_SHAWRSAã€CTC_SHAWECDSAã€CTC_SHA256WECDSAã€ANDCTC_SHA256WRSA + \param derBuffer ç½²å対象ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚関数ã®å‡¦ç†æˆåŠŸæ™‚ã«ã¯ç½²åãŒä»˜åŠ ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿æŒã—ã¾ã™ã€‚ + \param derSz æ–°ãŸã«ç½²åã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ï¼ˆåˆè¨ˆï¼‰ã‚µã‚¤ã‚º + \param rsaKey 証明書ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RSAéµã‚’å«ã‚€RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param eccKey 証明書ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ECCéµã‚’å«ã‚€EccKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param rng ç½²åã«ä½¿ç”¨ã™ã‚‹ä¹±æ•°ç”Ÿæˆå™¨(WC_RNG構造体)ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code Cert myCert; @@ -94,9 +164,8 @@ // initialize rng word32 certSz; - certSz = wc_SignCert(myCert.bodySz, myCert.sigType,derCert,FOURK_BUF, - &key, NULL, - &rng); + certSz = wc_SignCert(myCert.bodySz, myCert.sigType, derCert, FOURK_BUF, + &key, NULL, &rng); \endcode \sa wc_InitCert \sa wc_MakeCert @@ -105,16 +174,19 @@ word32 derSz, RsaKey* rsaKey, ecc_key* eccKey, WC_RNG* rng); /*! - \ingroup ASN - \brief ã“ã®é–¢æ•°ã¯ã€ä»¥å‰ã®2ã¤ã®é–¢æ•°ã€wc_makecertã€ãŠã‚ˆã³è‡ªå·±ç½²åã®ãŸã‚ã®wc_signcertã®çµ„ã¿åˆã‚ã›ã§ã™ï¼ˆå‰ã®é–¢æ•°ã¯CAè¦æ±‚ã«ä½¿ç”¨ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ï¼‰ã€‚証明書を作æˆã—ã¦ã‹ã‚‰ã€ãã‚Œã«ç½²åã—ã€è‡ªå·±ç½²å証明書を生æˆã—ã¾ã™ã€‚ - \return Success 証明書ã«æ­£å¸¸ã«ç½²åã™ã‚‹å ´åˆã¯ã€CERTã®æ–°ã—ã„サイズを返ã—ã¾ã™ã€‚ - \return MEMORY_E xmallocã§ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ + \ingroup ASN + \brief ã“ã®é–¢æ•°ã¯ã€ä»¥å‰ã®2ã¤ã®é–¢æ•°ã€wc_MakeCertã€ãŠã‚ˆã³è‡ªå·±ç½²åã®ãŸã‚ã®wc_SignCertã®çµ„ã¿åˆã‚ã›ã§ã™ï¼ˆå‰ã®é–¢æ•°ã¯CAè¦æ±‚ã«ä½¿ç”¨ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ï¼‰ã€‚ + 証明書を作æˆã—ã¦ã‹ã‚‰ã€ãã‚Œã«ç½²åã—ã€è‡ªå·±ç½²å証明書を生æˆã—ã¾ã™ã€‚ + \return 証明書ã¸ã®ç½²åãŒæˆåŠŸã—ãŸå ´åˆã¯ã€è¨¼æ˜Žæ›¸ã®æ–°ã—ã„サイズを返ã—ã¾ã™ã€‚ + \return MEMORY_E xmallocã§ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã§ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ \return BUFFER_E æä¾›ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã™ã‚‹ã«ã¯æä¾›ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return Other 証明書ã®ç”ŸæˆãŒæˆåŠŸã—ãªã‹ã£ãŸå ´åˆã€è¿½åŠ ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - \param cert 作æˆã—ã¦ç½²åã™ã‚‹è¨¼æ˜Žæ›¸ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param buffer ç½²å付ã証明書をä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param buffSz ç½²å付ã証明書をä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º - \param key 証明書ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RSAキーをå«ã‚€RSAKEY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param cert ç½²åã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derBuffer ç½²å付ã証明書をä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derSz ç½²å付ã証明書をä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param key 証明書ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RSAéµã‚’å«ã‚€RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param rng ç½²åã«ä½¿ç”¨ã™ã‚‹ä¹±æ•°ç”Ÿæˆå™¨(WC_RNG構造体)ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code Cert myCert; @@ -134,3 +206,1779 @@ */ int wc_MakeSelfCert(Cert* cert, byte* derBuffer, word32 derSz, RsaKey* key, WC_RNG* rng); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯PEMå½¢å¼ã®issureFileã§ä¸Žãˆã‚‰ã‚ŒãŸç™ºè¡Œè€…を証明書ã®ç™ºè¡Œè€…ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + ã¾ãŸã€ãã®éš›ã«ã€è¨¼æ˜Žæ›¸ã®è‡ªå·±ç½²åプロパティをfalseã«å¤‰æ›´ã—ã¾ã™ã€‚ + 発行者ã¯è¨¼æ˜Žæ›¸ã®ç™ºè¡Œè€…ã¨ã—ã¦è¨­å®šã•ã‚Œã‚‹å‰ã«æ¤œè¨¼ã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®ç™ºè¡Œè€…ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ç™ºè¡Œè€…を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert 発行者を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param issuerFile PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス + + _Example_ + \code + Cert myCert; + // initialize myCert + if(wc_SetIssuer(&myCert, â€./path/to/ca-cert.pemâ€) != 0) { + // error setting issuer + } + \endcode + + \sa wc_InitCert + \sa wc_SetSubject + \sa wc_SetIssuerBuffer +*/ +int wc_SetIssuer(Cert* cert, const char* issuerFile); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯PEMå½¢å¼ã®subjectFileã§ä¸Žãˆã‚‰ã‚ŒãŸä¸»ä½“者を証明書ã®ä¸»ä½“者ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®ä¸»ä½“者ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param 主体者を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param subjectFile PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス + + _Example_ + \code + Cert myCert; + // initialize myCert + if(wc_SetSubject(&myCert, â€./path/to/ca-cert.pemâ€) != 0) { + // error setting subject + } + \endcode + + \sa wc_InitCert + \sa wc_SetIssuer +*/ +int wc_SetSubject(Cert* cert, const char* subjectFile); + + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹Raw-Subject情報を証明書ã®Raw-Subject情報ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®Raw-Subject情報ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert Raw-Subject情報を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param der DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®è¨¼æ˜Žæ›¸ã®Raw-Subject情報ãŒå–り出ã•ã‚Œã¦certã«è¨­å®šã•ã‚Œã¾ã™ã€‚ + \param derSz DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + Cert myCert; + // initialize myCert + byte* der; + der = (byte*)malloc(FOURK_BUF); + // initialize der + if(wc_SetSubjectRaw(&myCert, der, FOURK_BUF) != 0) { + // error setting subject + } + \endcode + + \sa wc_InitCert + \sa wc_SetSubject +*/ +int wc_SetSubjectRaw(Cert* cert, const byte* der, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯Cert構造体ã‹ã‚‰Raw-Subject情報をå–り出ã—ã¾ã™ã€‚ + + \return 0 証明書ã®Raw-Subject情報ã®å–å¾—ã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param subjectRaw 処ç†ãŒæˆåŠŸã—ãŸéš›ã«è¿”ã•ã‚Œã‚‹Raw-Subject情報を格ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã®ãƒã‚¤ãƒ³ã‚¿ + \param cert Raw-Subject情報をä¿æŒã™ã‚‹Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Cert myCert; + byte *subjRaw; + // initialize myCert + + if(wc_GetSubjectRaw(&subjRaw, &myCert) != 0) { + // error setting subject + } + \endcode + + \sa wc_InitCert + \sa wc_SetSubjectRaw +*/ +int wc_GetSubjectRaw(byte **subjectRaw, Cert *cert); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯å¼•æ•°ã§ä¸Žãˆã‚‰ã‚ŒãŸPEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã®ä¸»ä½“者ã®åˆ¥åã‚’Cert構造体ã«è¨­å®šã—ã¾ã™ã€‚ + 複数ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã§åŒä¸€ã®è¨¼æ˜Žæ›¸ã‚’使用ã™ã‚‹éš›ã«ã¯ä¸»ä½“者ã®åˆ¥åを付与ã™ã‚‹æ©Ÿèƒ½ã¯æœ‰ç”¨ã§ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®ä¸»ä½“者ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert 主体者ã®åˆ¥åを設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param file PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス + + _Example_ + \code + Cert myCert; + // initialize myCert + if(wc_SetSubject(&myCert, â€./path/to/ca-cert.pemâ€) != 0) { + // error setting alt names + } + \endcode + + \sa wc_InitCert + \sa wc_SetIssuer +*/ +int wc_SetAltNames(Cert* cert, const char* file); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¦ã„る発行者を証明書ã®ç™ºè¡Œè€…ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + 加ãˆã¦ã€è¨¼æ˜Žæ›¸ã®äº‹æ•…ç½²åプロパティをfalseã«è¨­å®šã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®ç™ºè¡Œè€…ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert 発行者を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param der DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®è¨¼æ˜Žæ›¸ã®ç™ºè¡Œè€…情報ãŒå–り出ã•ã‚Œã¦certã«è¨­å®šã•ã‚Œã¾ã™ã€‚ + \param derSz DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + Cert myCert; + // initialize myCert + byte* der; + der = (byte*)malloc(FOURK_BUF); + // initialize der + if(wc_SetIssuerBuffer(&myCert, der, FOURK_BUF) != 0) { + // error setting issuer + } + \endcode + + \sa wc_InitCert + \sa wc_SetIssuer +*/ +int wc_SetIssuerBuffer(Cert* cert, const byte* der, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹Raw-Issuer情報を証明書ã®Raw-Issuer情報ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®Raw-Issuer情報ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + + \param cert Raw-Issuer情報を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param der DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®è¨¼æ˜Žæ›¸ã®Raw-Issuer情報ãŒå–り出ã•ã‚Œã¦certã«è¨­å®šã•ã‚Œã¾ã™ã€‚ + \param derSz DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + Cert myCert; + // initialize myCert + byte* der; + der = (byte*)malloc(FOURK_BUF); + // initialize der + if(wc_SetIssuerRaw(&myCert, der, FOURK_BUF) != 0) { + // error setting subject + } + \endcode + + \sa wc_InitCert + \sa wc_SetIssuer +*/ +int wc_SetIssuerRaw(Cert* cert, const byte* der, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¦ã„る主体者を証明書ã®ä¸»ä½“者ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®ä¸»ä½“者ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert 主体者を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param der DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®è¨¼æ˜Žæ›¸ã®ä¸»ä½“者ãŒå–り出ã•ã‚Œã¦certã«è¨­å®šã•ã‚Œã¾ã™ã€‚ + \param derSz DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + Cert myCert; + // initialize myCert + byte* der; + der = (byte*)malloc(FOURK_BUF); + // initialize der + if(wc_SetSubjectBuffer(&myCert, der, FOURK_BUF) != 0) { + // error setting subject + } + \endcode + + \sa wc_InitCert + \sa wc_SetSubject +*/ +int wc_SetSubjectBuffer(Cert* cert, const byte* der, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¦ã„る「別å情報ã€ã‚’証明書ã®ã€Œåˆ¥å情報ã€ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã¯è¤‡æ•°ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’一ã¤ã®è¨¼æ˜Žæ›¸ã‚’使ã£ã¦ã‚»ã‚­ãƒ¥ã‚¢ã«ã™ã‚‹éš›ã«æœ‰ç”¨ã§ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®åˆ¥å情報ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert 別å情報を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param der DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®è¨¼æ˜Žæ›¸ã®åˆ¥å情報ãŒå–り出ã•ã‚Œã¦certã«è¨­å®šã•ã‚Œã¾ã™ã€‚ + \param derSz DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + Cert myCert; + // initialize myCert + byte* der; + der = (byte*)malloc(FOURK_BUF); + // initialize der + if(wc_SetAltNamesBuffer(&myCert, der, FOURK_BUF) != 0) { + // error setting subject + } + \endcode + + \sa wc_InitCert + \sa wc_SetAltNames +*/ +int wc_SetAltNamesBuffer(Cert* cert, const byte* der, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¦ã„る「有効期間ã€æƒ…報を証明書ã®ã€Œæœ‰åŠ¹æœŸé–“ã€æƒ…å ±ã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã¸ã®ç½²åã«å…ˆç«‹ã¡å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + + \return 0 証明書ã®æœ‰åŠ¹æœŸé–“情報ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E XMALLOCã§ãƒ¡ãƒ¢ãƒªã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 証明書ã®ãƒ˜ãƒƒãƒ€ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æžã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ã®æš—å·ã‚¿ã‚¤ãƒ—ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_EXPECT_0_E 証明書ã®æš—å·åŒ–仕様ã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¨ãƒ©ãƒ¼ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E 証明書ã®ä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E 証明書ã®æœ‰åŠ¹æœŸé™æ—¥ã‚ˆã‚Šå¾Œã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BITSTR_E 証明書ã®ãƒ“ットストリングè¦ç´ ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 証明書ã®ECCéµã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_UNKNOWN_OID_E 証明書ãŒæœªçŸ¥ã®ã‚ªãƒ–ジェクトIDを使用ã—ã¦ã„ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_VERSION_E ALLOW_V1_EXTENSIONSマクロãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„ã®ã«è¨¼æ˜Žæ›¸ãŒV1ã‚ã‚‹ã„ã¯V2å½¢å¼ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 証明書ã®æ‹¡å¼µæƒ…å ±ã®è§£æžã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_CRIT_EXT_E 証明書ã®è§£æžä¸­ã«æœªçŸ¥ã®ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åæš—å·åŒ–タイプãŒå¼•æ•°ã§æ¸¡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_CONFIRM_E 証明書ã®ç½²åã®æ¤œè¨¼ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NAME_INVALID_E 証明書ã®åå‰ãŒCAã®åå‰ã«é–¢æ•°åˆ¶é™ã«ã‚ˆã£ã¦è¨±ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SIGNER_E CA証明書ã®ä¸»ä½“者を検証ã™ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert 有効期間情報を設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param der DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ã“ã®è¨¼æ˜Žæ›¸ã®æœ‰åŠ¹æœŸé–“情報ãŒå–り出ã•ã‚Œã¦certã«è¨­å®šã•ã‚Œã¾ã™ã€‚ + \param derSz DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + Cert myCert; + // initialize myCert + byte* der; + der = (byte*)malloc(FOURK_BUF); + // initialize der + if(wc_SetDatesBuffer(&myCert, der, FOURK_BUF) != 0) { + // error setting subject + } + \endcode + + \sa wc_InitCert +*/ +int wc_SetDatesBuffer(Cert* cert, const byte* der, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸRSAã‚ã‚‹ã„ã¯ECC公開éµã®ä¸€æ–¹ã‹ã‚‰å¾—ãŸAKID(èªè¨¼è€…éµID)を証明書ã®AKIDã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + + \return 0 証明書ã®AKIDã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿(cert)ãŒNULLã‹RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿(rsakey)ã¨ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿(eckey)ã®ä¸¡æ–¹ãŒNULLã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return PUBLIC_KEY_E 公開éµã®å–å¾—ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert AKIDを設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param rsakey RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param eckey ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Cert myCert; + RsaKey keypub; + + wc_InitRsaKey(&keypub, 0); + + if (wc_SetAuthKeyIdFromPublicKey(&myCert, &keypub, NULL) != 0) + { + // Handle error + } + \endcode + + \sa wc_SetSubjectKeyId + \sa wc_SetAuthKeyId + \sa wc_SetAuthKeyIdFromCert +*/ +int wc_SetAuthKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, + ecc_key *eckey); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‹ã‚‰å¾—ãŸAKID(èªè¨¼è€…éµID)を証明書ã®AKIDã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + + \return 0 証明書ã®AKIDã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数ã®ã„ãšã‚Œã‹ãŒNULL,ã‚ã‚‹ã„ã¯derSzãŒï¼ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_NO_SKID èªè¨¼è€…éµIDãŒè¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert AKIDを設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param der DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param derSz DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’æ ¼ç´ã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚ + + _Example_ + \code + Cert some_cert; + byte some_der[] = { // Initialize a DER buffer }; + wc_InitCert(&some_cert); + if(wc_SetAuthKeyIdFromCert(&some_cert, some_der, sizeof(some_der) != 0) + { + // Handle error + } + \endcode + + \sa wc_SetAuthKeyIdFromPublicKey + \sa wc_SetAuthKeyId +*/ +int wc_SetAuthKeyIdFromCert(Cert *cert, const byte *der, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‹ã‚‰å¾—ãŸAKID(èªè¨¼è€…éµID)を証明書ã®AKIDã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + + \return 0 証明書ã®AKIDã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数ã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert AKIDを設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param file PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス + + _Example_ + \code + char* file_name = "/path/to/file"; + cert some_cert; + wc_InitCert(&some_cert); + + if(wc_SetAuthKeyId(&some_cert, file_name) != 0) + { + // Handle Error + } + \endcode + + \sa wc_SetAuthKeyIdFromPublicKey + \sa wc_SetAuthKeyIdFromCert +*/ +int wc_SetAuthKeyId(Cert *cert, const char* file); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸRSAã‚ã‚‹ã„ã¯ECC公開éµã®ä¸€æ–¹ã‹ã‚‰å¾—ãŸSKID(主体者éµID)を証明書ã®SKIDã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + + \return 0 証明書ã®SKIDã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿(cert)ãŒNULLã‹RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿(rsakey)ã¨ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿(eckey)ã®ä¸¡æ–¹ãŒNULLã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return PUBLIC_KEY_E 公開éµã®å–å¾—ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert SKIDを設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param rsakey RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param eckey ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Cert some_cert; + RsaKey some_key; + wc_InitCert(&some_cert); + wc_InitRsaKey(&some_key); + + if(wc_SetSubjectKeyIdFromPublicKey(&some_cert,&some_key, NULL) != 0) + { + // Handle Error + } + \endcode + + \sa wc_SetSubjectKeyId +*/ +int wc_SetSubjectKeyIdFromPublicKey(Cert *cert, RsaKey *rsakey, + ecc_key *eckey); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‹ã‚‰å¾—ãŸSKID(主体者éµID)を証明書ã®SKIDã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ + 引数ã¯ä¸¡æ–¹ãŒä¸Žãˆã‚‰ã‚Œã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚ + + \return 0 証明書ã®SKIDã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数ã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return PUBLIC_KEY_E 公開éµã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert SKIDを設定ã™ã‚‹å¯¾è±¡ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param file PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス + + _Example_ + \code + const char* file_name = "path/to/file"; + Cert some_cert; + wc_InitCert(&some_cert); + + if(wc_SetSubjectKeyId(&some_cert, file_name) != 0) + { + // Handle Error + } + \endcode + + \sa wc_SetSubjectKeyIdFromPublicKey +*/ +int wc_SetSubjectKeyId(Cert *cert, const char* file); + +/*! + \ingroup RSA + + \brief ã“ã®é–¢æ•°ã¯éµã®ç”¨é€”を設定ã—ã¾ã™ã€‚設定値ã®æŒ‡å®šã¯ã‚³ãƒ³ãƒžåŒºåˆ‡ã‚Šãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã§ãã¾ã™ã€‚ + å—ã‘付ã‘られるトークンã¯ï¼šdigitalSignature, nonRepudiation, contentCommitment, keyCertSign, cRLSign, dataEncipherment, + keyAgreement, keyEncipherment, encipherOnly, decipherOnly ã§ã™ã€‚ + 指定例:"digitalSignature,nonRepudiation"。 + nonRepudiation 㨠contentCommitment ã¯åŒã˜ç”¨é€”ã‚’æ„味ã—ã¾ã™ã€‚ + + \return 0 証明書ã®ç”¨é€”ã®è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数ã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return KEYUSAGE_E 未知ã®ãƒˆãƒ¼ã‚¯ãƒ³ãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert éµã®ç”¨é€”を設定ã™ã‚‹å¯¾è±¡ã®åˆæœŸåŒ–済ã¿Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param value éµã®ç”¨é€”ã‚’æ„味ã™ã‚‹ã‚³ãƒ³ãƒžåŒºåˆ‡ã‚Šãƒˆãƒ¼ã‚¯ãƒ³æ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Cert cert; + wc_InitCert(&cert); + + if(wc_SetKeyUsage(&cert, "cRLSign,keyCertSign") != 0) + { + // Handle error + } + \endcode + + \sa wc_InitCert + \sa wc_MakeRsaKey +*/ +int wc_SetKeyUsage(Cert *cert, const char *value); + +/*! + \ingroup ASN + + \brief PEMå½¢å¼ã®éµãƒ•ã‚¡ã‚¤ãƒ«ã‚’ロードã—DERå½¢å¼ã«å¤‰æ›ã—ã¦ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + + \return 0 処ç†æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return <0 エラー発生時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルã®ã‚ªãƒ¼ãƒ—ンã«å•é¡ŒãŒç”Ÿã˜ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E 与ãˆã‚‰ã‚ŒãŸå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡derBufãŒçµæžœã‚’ä¿æŒã™ã‚‹ã®ã«å分ãªå¤§ãã•ãŒãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param fileName PEMå½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス + \param derBuf DERå½¢å¼éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ + \param derSz 出力先ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + char* some_file = "filename"; + unsigned char der[]; + + if(wc_PemPubKeyToDer(some_file, der, sizeof(der)) != 0) + { + //Handle Error + } + \endcode + + \sa wc_PubKeyPemToDer +*/ +int wc_PemPubKeyToDer(const char* fileName, + unsigned char* derBuf, int derSz); + +/*! + \ingroup ASN + + \brief PEMå½¢å¼ã®éµãƒ‡ãƒ¼ã‚¿ã‚’DERå½¢å¼ã«å¤‰æ›ã—ã¦ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã€å‡ºåŠ›ãƒã‚¤ãƒˆæ•°ã‚ã‚‹ã„ã¯è² ã®ã‚¨ãƒ©ãƒ¼å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \return >0 処ç†æˆåŠŸæ™‚ã«ã¯å‡ºåŠ›ã—ãŸãƒã‚¤ãƒˆæ•°ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数ã®pem, buff, ã‚ã‚‹ã„㯠buffSz ã®ã„ãšã‚Œã‹ã°NULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return <0 エラーãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param pem PEMå½¢å¼ã®éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param pemSz PEMå½¢å¼ã®éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param buff 出力先ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param buffSz 出力先ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + byte some_pem[] = { Initialize with PEM key } + unsigned char out_buffer[1024]; // Ensure buffer is large enough to fit DER + + if(wc_PubKeyPemToDer(some_pem, sizeof(some_pem), out_buffer, + sizeof(out_buffer)) < 0) + { + // Handle error + } + \endcode + + \sa wc_PemPubKeyToDer +*/ +int wc_PubKeyPemToDer(const unsigned char* pem, int pemSz, + unsigned char* buff, int buffSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’DERå½¢å¼ã«å¤‰æ›ã—ã€ä¸Žãˆã‚‰ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + + \return 処ç†æˆåŠŸæ™‚ã«ã¯å‡ºåŠ›ã—ãŸãƒã‚¤ãƒˆæ•°ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E 与ãˆã‚‰ã‚ŒãŸå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡derBufãŒçµæžœã‚’ä¿æŒã™ã‚‹ã®ã«å分ãªå¤§ãã•ãŒãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param fileName PEMå½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス + \param derBuf DERå½¢å¼è¨¼æ˜Žæ›¸ã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derSz DERå½¢å¼è¨¼æ˜Žæ›¸ã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + char * file = “./certs/client-cert.pemâ€; + int derSz; + byte* der = (byte*)XMALLOC((8*1024), NULL, DYNAMIC_TYPE_CERT); + + derSz = wc_PemCertToDer(file, der, (8*1024)); + if (derSz <= 0) { + //PemCertToDer error + } + \endcode + + \sa none +*/ + +int wc_PemCertToDer(const char* fileName, unsigned char* derBuf, int derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ãƒãƒƒãƒ•ã‚¡ã§ä¸Žãˆã‚‰ã‚ŒãŸDERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’PEMå½¢å¼ã«å¤‰æ›ã—ã€ä¸Žãˆã‚‰ã‚ŒãŸå‡ºåŠ›ç”¨ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¨å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã‚’共用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。両ãƒãƒƒãƒ•ã‚¡ã¯å¿…ãšåˆ¥ã®ã‚‚ã®ã‚’用æ„ã—ã¦ãã ã•ã„。 + + \return 処ç†æˆåŠŸæ™‚ã«ã¯å¤‰æ›å¾Œã®PEMå½¢å¼ãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG DERå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã€ã‚ã‚‹ã„ã¯PEMå½¢å¼ã«å¤‰æ›ã®éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_INPUT_E Base64エンコーディングエラーãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E 与ãˆã‚‰ã‚ŒãŸå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒçµæžœã‚’ä¿æŒã™ã‚‹ã®ã«å分ãªå¤§ãã•ãŒãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param der DERå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derSz DERå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º + \param output PEMå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param outSz PEMå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param type 変æ›ã™ã‚‹è¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—。次ã®ã‚¿ã‚¤ãƒ—ãŒæŒ‡å®šå¯: CERT_TYPE, PRIVATEKEY_TYPE, ECC_PRIVATEKEY_TYPE, and CERTREQ_TYPE. + + _Example_ + \code + byte* der; + // initialize der with certificate + byte* pemFormatted[FOURK_BUF]; + + word32 pemSz; + pemSz = wc_DerToPem(der, derSz,pemFormatted,FOURK_BUF, CERT_TYPE); + \endcode + + \sa wc_PemCertToDer +*/ +int wc_DerToPem(const byte* der, word32 derSz, byte* output, + word32 outputSz, int type); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼è¨¼æ˜Žæ›¸ã‚’入力ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰èª­ã¿å‡ºã—ã€PEMå½¢å¼ã«å¤‰æ›ã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã¨å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã‚’共用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。両ãƒãƒƒãƒ•ã‚¡ã¯å¿…ãšåˆ¥ã®ã‚‚ã®ã‚’用æ„ã—ã¦ãã ã•ã„。 + 追加ã®æš—å·æƒ…報を指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + + \return 処ç†æˆåŠŸæ™‚ã«ã¯å¤‰æ›å¾Œã®PEMå½¢å¼ãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG Returned DERå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã®è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã€ã‚ã‚‹ã„ã¯PEMå½¢å¼ã«å¤‰æ›ã®éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_INPUT_E Base64エンコーディングエラーãŒæ¤œå‡ºã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E 与ãˆã‚‰ã‚ŒãŸå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒçµæžœã‚’ä¿æŒã™ã‚‹ã®ã«å分ãªå¤§ãã•ãŒãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param der DERå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derSz DERå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º + \param output PEMå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param outSz PEMå½¢å¼è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param cipher_inf 追加ã®æš—å·æƒ…å ± + \param type 生æˆã™ã‚‹è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—。指定å¯èƒ½ãªã‚¿ã‚¤ãƒ—: CERT_TYPE, PRIVATEKEY_TYPE, ECC_PRIVATEKEY_TYPE 㨠CERTREQ_TYPE + + _Example_ + \code + byte* der; + // initialize der with certificate + byte* pemFormatted[FOURK_BUF]; + + word32 pemSz; + byte* cipher_info[] { Additional cipher info. } + pemSz = wc_DerToPemEx(der, derSz, pemFormatted, FOURK_BUF, cipher_info, CERT_TYPE); + \endcode + + \sa wc_PemCertToDer +*/ +int wc_DerToPemEx(const byte* der, word32 derSz, byte* output, + word32 outputSz, byte *cipherIno, int type); + +/*! + \ingroup CertsKeys + + \brief PEMå½¢å¼ã®éµã‚’DERå½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚ + + \return 変æ›ã«æˆåŠŸã—ãŸéš›ã«ã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«æ›¸ã込んã ãƒ‡ãƒ¼ã‚¿ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return エラー発生時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param pem PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param pemSz PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º + \param buff DerBuffer構造体ã®bufferメンãƒãƒ¼ã®ã‚³ãƒ”ーã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param buffSz DerBuffer構造体ã®bufferメンãƒãƒ¼ã¸ç¢ºä¿ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param pass パスワード + + _Example_ + \code + byte* loadBuf; + long fileSz = 0; + byte* bufSz; + static int LoadKeyFile(byte** keyBuf, word32* keyBufSz, + const char* keyFile, + int typeKey, const char* password); + … + bufSz = wc_KeyPemToDer(loadBuf, (int)fileSz, saveBuf, + (int)fileSz, password); + + if(saveBufSz > 0){ + // Bytes were written to the buffer. + } + \endcode + + \sa wc_PemToDer +*/ +int wc_KeyPemToDer(const unsigned char* pem, int pemSz, + unsigned char* buff, int buffSz, const char* pass); + +/*! + \ingroup CertsKeys + + \brief ã“ã®é–¢æ•°ã¯PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’DERå½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚内部ã§ã¯OpenSSL互æ›APIã®PemToDerを呼ã³å‡ºã—ã¾ã™ã€‚ + + \return ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ãŸã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + + \param pem PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param pemSz PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param buff DERå½¢å¼ã«å¤‰æ›ã—ãŸè¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã®å‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param buffSz 出力先ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param type 証明書ã®ã‚¿ã‚¤ãƒ—。asn_public.h ã§å®šç¾©ã®enum CertTypeã®å€¤ã€‚ + + _Example_ + \code + const unsigned char* pem; + int pemSz; + unsigned char buff[BUFSIZE]; + int buffSz = sizeof(buff)/sizeof(char); + int type; + ... + if(wc_CertPemToDer(pem, pemSz, buff, buffSz, type) <= 0) { + // There were bytes written to buffer + } + \endcode + + \sa wc_PemToDer +*/ +int wc_CertPemToDer(const unsigned char* pem, int pemSz, + unsigned char* buff, int buffSz, int type); + +/*! + \ingroup CertsKeys + + \brief ã“ã®é–¢æ•°ã¯å…¬é–‹éµã‚’DERå½¢å¼ã§DecodedCert構造体ã‹ã‚‰å–り出ã—ã¾ã™ã€‚ + wc_InitDecodedCert()ã¨wc_ParseCert()を事å‰ã«å‘¼ã³å‡ºã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + wc_InitDecodedCert()ã¯DER/ASN.1エンコードã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’å—ã‘付ã‘ã¾ã™ã€‚ + PEMå½¢å¼ã®éµã‚’DERå½¢å¼ã§å–å¾—ã™ã‚‹å ´åˆã«ã¯ã€wc_InitDecodedCert()より先ã«wc_CertPemToDer()を呼ã³å‡ºã—ã¦ãã ã•ã„。 + + \return æˆåŠŸæ™‚ã«0ã‚’è¿”ã—ã¾ã™ã€‚エラー発生時ã«ã¯è² ã®æ•´æ•°ã‚’è¿”ã—ã¾ã™ã€‚ + \return LENGTH_ONLY_E derKeyãŒNULLã®éš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert X.509証明書をä¿æŒã—ãŸDecodedCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derKey DERå½¢å¼ã®å…¬é–‹éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param derKeySz [IN/OUT] 入力時ã«ã¯derKeyã§ä¸Žãˆã‚‰ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º,出力時ã«ã¯å…¬é–‹éµã®ã‚µã‚¤ã‚ºã‚’ä¿æŒã—ã¾ã™ã€‚ + ã‚‚ã—ã€derKeyãŒNULLã§æ¸¡ã•ã‚ŒãŸå ´åˆã«ã¯, derKeySzã«ã¯å¿…è¦ãªãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒæ ¼ç´ã•ã‚Œã€LENGTH_ONLY_EãŒæˆ»ã‚Šå€¤ã¨ã—ã¦è¿”ã•ã‚Œã¾ã™ã€‚ + + \sa wc_GetPubKeyDerFromCert +*/ +int wc_GetPubKeyDerFromCert(struct DecodedCert* cert, + byte* derKey, word32* derKeySz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ECC秘密éµã‚’入力ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰èª­ã¿è¾¼ã¿ã€è§£æžã®å¾Œecc_key構造体を作æˆã—ã¦ãã“ã«éµã‚’æ ¼ç´ã—ã¾ã™ã€‚ + + \return 0 秘密éµã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã¨çµæžœã®ecc_key構造体ã¸ã®æ ¼ç´æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E 入力ãƒãƒƒãƒ•ã‚¡ã®è§£æžã‚ã‚‹ã„ã¯çµæžœã®æ ¼ç´æ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E 入力ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ãŒæœ€å¤§è¨¼æ˜Žæ›¸ã‚µã‚¤ã‚ºã‚ˆã‚Šå¤§ãã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_OBJECT_ID_E 証明書ãŒç„¡åŠ¹ãªã‚ªãƒ–ジェクトIDã‚’å«ã‚“ã§ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_CURVE_OID_E 与ãˆã‚‰ã‚ŒãŸç§˜å¯†éµã®ECC曲線ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ECC_BAD_ARG_E ECC秘密éµã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return NOT_COMPILED_IN 秘密éµãŒåœ§ç¸®ã•ã‚Œã¦ã„ã¦åœ§ç¸®éµãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MP_MEM 秘密éµã®è§£æžã§ä½¿ç”¨ã•ã‚Œã‚‹æ•°å­¦ãƒ©ã‚¤ãƒ–ラリãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MP_VAL 秘密éµã®è§£æžã§ä½¿ç”¨ã•ã‚Œã‚‹æ•°å­¦ãƒ©ã‚¤ãƒ–ラリãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MP_RANGE 秘密éµã®è§£æžã§ä½¿ç”¨ã•ã‚Œã‚‹æ•°å­¦ãƒ©ã‚¤ãƒ–ラリãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param input 入力ã¨ãªã‚‹ç§˜å¯†éµãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã§ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inOutIdx word32型変数ã§å†…容ã¨ã—ã¦å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã®å‡¦ç†é–‹å§‹ä½ç½®ã‚’先頭ã‹ã‚‰ã®ã‚¤ãƒ³ãƒ‡ã‚¯ã‚¹å€¤ã¨ã—ã¦ä¿æŒã—ã¦ã„る。 + \param key デコードã•ã‚ŒãŸç§˜å¯†éµãŒæ ¼ç´ã•ã‚Œã‚‹åˆæœŸåŒ–済ã¿ã®ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inSz 秘密éµã‚’å«ã‚“ã§ã„る入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + int ret, idx=0; + ecc_key key; // to store key in + + byte* tmp; // tmp buffer to read key from + tmp = (byte*) malloc(FOURK_BUF); + + int inSz; + inSz = fread(tmp, 1, FOURK_BUF, privateKeyFile); + // read key into tmp buffer + + wc_ecc_init(&key); // initialize key + ret = wc_EccPrivateKeyDecode(tmp, &idx, &key, (word32)inSz); + if(ret < 0) { + // error decoding ecc key + } + \endcode + + \sa wc_RSA_PrivateKeyDecode +*/ +int wc_EccPrivateKeyDecode(const byte* input, word32* inOutIdx, + ecc_key* key, word32 inSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ECC秘密éµã‚’DERå½¢å¼ã§ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã¾ã™ã€‚ + + \return ECC秘密éµã‚’DERå½¢å¼ã§ã®å‡ºåŠ›ã«æˆåŠŸã—ãŸå ´åˆã«ã¯ãƒãƒƒãƒ•ã‚¡ã¸å‡ºåŠ›ã—ãŸã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG 出力ãƒãƒƒãƒ•ã‚¡outputãŒNULLã‚ã‚‹ã„ã¯inLenãŒã‚¼ãƒ­ã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return MEMORY_E メモリã®ç¢ºä¿ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E 出力ãƒãƒƒãƒ•ã‚¡ãŒå¿…è¦é‡ã‚ˆã‚Šå°ã•ã„ + \return ASN_UNKNOWN_OID_E ECC秘密éµãŒæœªçŸ¥ã®ã‚¿ã‚¤ãƒ—ã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return MP_MEM 秘密éµã®è§£æžã§ä½¿ç”¨ã•ã‚Œã‚‹æ•°å­¦ãƒ©ã‚¤ãƒ–ラリãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MP_VAL 秘密éµã®è§£æžã§ä½¿ç”¨ã•ã‚Œã‚‹æ•°å­¦ãƒ©ã‚¤ãƒ–ラリãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MP_RANGE 秘密éµã®è§£æžã§ä½¿ç”¨ã•ã‚Œã‚‹æ•°å­¦ãƒ©ã‚¤ãƒ–ラリãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param key 入力ã¨ãªã‚‹ECC秘密éµãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã§ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param output DERå½¢å¼ã®ECC秘密éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inLen DERå½¢å¼ã®ECC秘密éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + int derSz; + ecc_key key; + // initialize and make key + byte der[FOURK_BUF]; + // store der formatted key here + + derSz = wc_EccKeyToDer(&key, der, FOURK_BUF); + if(derSz < 0) { + // error converting ecc key to der buffer + } + \endcode + + \sa wc_RsaKeyToDer +*/ +int wc_EccKeyToDer(ecc_key* key, byte* output, word32 inLen); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã®ECC公開éµã‚’ASNシーケンスをデコードã—ã¦å–り出ã—ã¾ã™ã€‚ + + \return 0 処ç†æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG Returns ã„ãšã‚Œã‹ã®å¼•æ•°ãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return ASN_PARSE_E 解æžä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return ASN_ECC_KEY_E éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã—ã¾ã™ã€‚ + 発生ç†ç”±ã«ã¤ã„ã¦ã¯wc_ecc_import_x963()ã‚’å‚ç…§ã®ã“ã¨ã€‚ + + \param input DERå½¢å¼ã®å…¬é–‹éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inOutIdx ãƒãƒƒãƒ•ã‚¡ã®èª­ã¿å‡ºã—ä½ç½®ã‚¤ãƒ³ãƒ‡ã‚¯ã‚¹å€¤ã‚’ä¿æŒã—ã¦ã„る変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿(入力時)。 + 出力時ã«ã¯ã“ã®å¤‰æ•°ã«è§£æžæ¸ˆã¿ã®ãƒãƒƒãƒ•ã‚¡ã®ã‚¤ãƒ³ãƒ‡ã‚¯ã‚¹å€¤ãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚ + \param key ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inSz 入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + int ret; + word32 idx = 0; + byte buff[] = { // initialize with key }; + ecc_key pubKey; + wc_ecc_init(&pubKey); + if ( wc_EccPublicKeyDecode(buff, &idx, &pubKey, sizeof(buff)) != 0) { + // error decoding key + } + \endcode + + \sa wc_ecc_import_x963 +*/ +int wc_EccPublicKeyDecode(const byte* input, word32* inOutIdx, + ecc_key* key, word32 inSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ECC公開éµã‚’DERå½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚ + 処ç†ã—ãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚変æ›ã—ã¦å¾—られるDERå½¢å¼ã®ECC公開éµã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚ + AlgCurveフラグã®æŒ‡å®šã«ã‚ˆã‚Šã€ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¨æ›²ç·šæƒ…報をヘッダーã«å«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯å‡¦ç†ã—ãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG 出力ãƒãƒƒãƒ•ã‚¡outputã‚ã‚‹ã„ã¯ecc_key構造体keyãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return LENGTH_ONLY_E ECC公開éµã®ã‚µã‚¤ã‚ºå–å¾—ã«å¤±æ•—ã—ãŸå ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return BUFFER_E 出力ãƒãƒƒãƒ•ã‚¡ãŒå¿…è¦é‡ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã—ã¾ã™ã€‚ + + \param key ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param output 出力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inLen 出力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param with_AlgCurve アルゴリズムã¨æ›²ç·šæƒ…報をヘッダーã«å«ã‚ã‚‹éš›ã«ã¯ï¼‘を指定 + + _Example_ + \code + ecc_key key; + wc_ecc_init(&key); + WC_RNG rng; + wc_InitRng(&rng); + wc_ecc_make_key(&rng, 32, &key); + int derSz = // Some appropriate size for der; + byte der[derSz]; + + if(wc_EccPublicKeyToDer(&key, der, derSz, 1) < 0) + { + // Error converting ECC public key to der + } + \endcode + + \sa wc_EccKeyToDer + \sa wc_EccPrivateKeyDecode +*/ +int wc_EccPublicKeyToDer(ecc_key* key, byte* output, + word32 inLen, int with_AlgCurve); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ECC公開éµã‚’DERå½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚ + 処ç†ã—ãŸãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚変æ›ã•ã‚ŒãŸDERå½¢å¼ã®ECC公開éµã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚ + AlgCurveフラグã®æŒ‡å®šã«ã‚ˆã‚Šã€ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¨æ›²ç·šæƒ…報をヘッダーã«å«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + compパラメータã¯å…¬é–‹éµã‚’圧縮ã—ã¦å‡ºåŠ›ã™ã‚‹ã‹å¦ã‹ã‚’指定ã—ã¾ã™ã€‚ + + \return >0 æˆåŠŸæ™‚ã«ã¯å‡¦ç†ã—ãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG 出力ãƒãƒƒãƒ•ã‚¡outputã‚ã‚‹ã„ã¯ecc_key構造体keyãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return LENGTH_ONLY_E ECC公開éµã®ã‚µã‚¤ã‚ºå–å¾—ã«å¤±æ•—ã—ãŸå ´åˆã«è¿”ã—ã¾ã™ã€‚ + \return BUFFER_E 出力ãƒãƒƒãƒ•ã‚¡ãŒå¿…è¦é‡ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã—ã¾ã™ã€‚ + + \param key ecc_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param output 出力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inLen 出力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param with_AlgCurve アルゴリズムã¨æ›²ç·šæƒ…報をヘッダーã«å«ã‚ã‚‹éš›ã«ã¯ï¼‘を指定 + \param comp éžã‚¼ãƒ­å€¤ã®æŒ‡å®šæ™‚ã«ã¯ECC公開éµã¯åœ§ç¸®å½¢å¼ã§å‡ºåŠ›ã•ã‚Œã¾ã™ã€‚ゼロãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã«ã¯éžåœ§ç¸®ã§å‡ºåŠ›ã•ã‚Œã¾ã™ã€‚ + + _Example_ + \code + ecc_key key; + wc_ecc_init(&key); + WC_RNG rng; + wc_InitRng(&rng); + wc_ecc_make_key(&rng, 32, &key); + int derSz = // Some appropriate size for der; + byte der[derSz]; + + // Write out a compressed ECC key + if(wc_EccPublicKeyToDer_ex(&key, der, derSz, 1, 1) < 0) + { + // Error converting ECC public key to der + } + \endcode + + \sa wc_EccKeyToDer + \sa wc_EccPublicKeyDecode +*/ +int wc_EccPublicKeyToDer_ex(ecc_key* key, byte* output, + word32 inLen, int with_AlgCurve, int comp); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ãƒ‡ã‚¸ã‚¿ãƒ«ç½²åをエンコードã—ã¦å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã€ç”Ÿæˆã•ã‚ŒãŸç½²åã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯ç½²åを出力ãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã—ã€å‡ºåŠ›ã—ãŸã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + + \param out エンコードã—ãŸç½²åデータを出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param digest ç½²åデータã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«ä½¿ç”¨ã™ã‚‹ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param digSz ダイジェストをå«ã‚“ã§ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param hashOID ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—を示ã™ã‚ªãƒ–ジェクトID。有効ãªå€¤ã¯: SHAh, SHA256h, SHA384h, SHA512h, MD2h, MD5h, DESb, DES3b, CTC_MD5wRSA, + CTC_SHAwRSA, CTC_SHA256wRSA, CTC_SHA384wRSA, CTC_SHA512wRSA, CTC_SHAwECDSA, CTC_SHA256wECDSA, CTC_SHA384wECDSA, 㨠CTC_SHA512wECDSA。 + + \endcode + \code + int signSz; + byte encodedSig[MAX_ENCODED_SIG_SZ]; + Sha256 sha256; + // initialize sha256 for hashing + + byte* dig = = (byte*)malloc(WC_SHA256_DIGEST_SIZE); + // perform hashing and hash updating so dig stores SHA-256 hash + // (see wc_InitSha256, wc_Sha256Update and wc_Sha256Final) + signSz = wc_EncodeSignature(encodedSig, dig, WC_SHA256_DIGEST_SIZE, SHA256h); + \endcode + + \sa none +*/ +word32 wc_EncodeSignature(byte* out, const byte* digest, + word32 digSz, int hashOID); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—ã«å¯¾å¿œã—ãŸãƒãƒƒã‚·ãƒ¥OIDã‚’è¿”ã—ã¾ã™ã€‚ + 例ãˆã°ã€ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—ãŒ"WC_SHA512"ã®å ´åˆã€ã“ã®é–¢æ•°ã¯"SHA512h"を対応ã™ã‚‹ãƒãƒƒã‚·ãƒ¥OIDã¨ã—ã¦è¿”ã—ã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯æŒ‡å®šã•ã‚ŒãŸãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—ã¨å¯¾å¿œã™ã‚‹ãƒãƒƒã‚·ãƒ¥OIDã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 èªè­˜ã§ããªã„ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—ãŒå¼•æ•°ã¨ã—ã¦æŒ‡å®šã•ã‚ŒãŸå ´åˆã«è¿”ã—ã¾ã™ã€‚ + + \param type ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—。指定å¯èƒ½ãªã‚¿ã‚¤ãƒ—: WC_MD5, WC_SHA, WC_SHA256, WC_SHA384, WC_SHA512, WC_SHA3_224, WC_SHA3_256, WC_SHA3_384, WC_SHA3_512 + + _Example_ + \code + int hashOID; + + hashOID = wc_GetCTC_HashOID(WC_SHA512); + if (hashOID == 0) { + // WOLFSSL_SHA512 not defined + } + \endcode + + \sa none +*/ +int wc_GetCTC_HashOID(int type); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ãŸCert構造体ã§ä½¿ç”¨ã•ã‚ŒãŸãƒ¡ãƒ¢ãƒªã¨ãƒªã‚½ãƒ¼ã‚¹ã‚’クリーンアップã—ã¾ã™ã€‚ + WOLFSSL_CERT_GEN_CACHEãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã¯DecodedCert構造体ãŒCert構造体内部ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã€å¾Œç¶šã™ã‚‹set系関数ã®å‘¼ã³å‡ºã—ã®éƒ½åº¦DecodedCert構造体ãŒãƒ‘ースã•ã‚Œã‚‹ã“ã¨ã‚’防ãŽã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数ã¨ã—ã¦ç„¡åŠ¹ãªå€¤ãŒæ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cert 未åˆæœŸåŒ–ã®Cert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Cert cert; // Initialized certificate structure + + wc_SetCert_Free(&cert); + \endcode + + \sa wc_SetAuthKeyIdFromCert + \sa wc_SetIssuerBuffer + \sa wc_SetSubjectBuffer + \sa wc_SetSubjectRaw + \sa wc_SetIssuerRaw + \sa wc_SetAltNamesBuffer + \sa wc_SetDatesBuffer +*/ +void wc_SetCert_Free(Cert* cert); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯PKCS#8ã®æš—å·åŒ–ã•ã‚Œã¦ã„ãªã„ãƒãƒƒãƒ•ã‚¡å†…部ã®å¾“æ¥ã®ç§˜å¯†éµã®é–‹å§‹ä½ç½®ã‚’検出ã—ã¦è¿”ã—ã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯å¾“æ¥ã®ç§˜å¯†éµã®é•·ã•ã‚’è¿”ã—ã¾ã™ã€‚ + \return エラー時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param input PKCS#8ã®æš—å·åŒ–ã•ã‚Œã¦ã„ãªã„秘密éµã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inOutIdx ãƒãƒƒãƒ•ã‚¡ã®ã‚¤ãƒ³ãƒ‡ã‚¯ã‚¹ä½ç½®ã‚’ä¿æŒã™ã‚‹å¤‰æ•°ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚入力時ã«ã¯ã“ã®å¤‰æ•°ã®å†…容ã¯ãƒãƒƒãƒ•ã‚¡å†…部ã®PKCS#8ã®é–‹å§‹ä½ç½®ã‚’示ã—ã¾ã™ã€‚出力時ã«ã¯ã€ç§˜å¯†éµã®å…ˆé ­ä½ç½®ã‚’ä¿æŒã—ã¾ã™ã€‚ + \param sz 入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + byte* pkcs8Buf; // Buffer containing PKCS#8 key. + word32 idx = 0; + word32 sz; // Size of pkcs8Buf. + ... + ret = wc_GetPkcs8TraditionalOffset(pkcs8Buf, &idx, sz); + // pkcs8Buf + idx is now the beginning of the traditional private key bytes. + \endcode + + \sa wc_CreatePKCS8Key + \sa wc_EncryptPKCS8Key + \sa wc_DecryptPKCS8Key + \sa wc_CreateEncryptedPKCS8Key +*/ +int wc_GetPkcs8TraditionalOffset(byte* input, + word32* inOutIdx, word32 sz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã®ç§˜å¯†éµã‚’入力ã¨ã—ã€RKCS#8å½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚ + ã¾ãŸã€PKCS#12ã®ã‚·ãƒ¥ãƒ­â€•ãƒ‡ã‚£ãƒƒãƒˆã‚­ãƒ¼ãƒãƒƒã‚°ã®ä½œæˆã«ã‚‚使用ã§ãã¾ã™ã€‚RFC5208ã‚’å‚ç…§ã®ã“ã¨ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯å‡ºåŠ›ã•ã‚ŒãŸPKCS#8 éµã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return LENGTH_ONLY_E 出力先ãƒãƒƒãƒ•ã‚¡outãŒNULLã¨ã—ã¦æ¸¡ã•ã‚ŒãŸå ´åˆã«ã¯ã“ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã€outSzã«å¿…è¦ãªå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚ + \return エラー時ã«ã¯è² ã®æ•´æ•°å€¤ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param out çµæžœã®å‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚NULLã®å ´åˆã«ã¯å¿…è¦ãªå‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒoutSzã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚ + \param outSz 出力先ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param key 従æ¥ã®DERå½¢å¼ã®ç§˜å¯†éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param keySz 秘密éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param algoID アルゴリズムID (RSAkç­‰ã®) + \param curveOID ECC曲線OID。RSAéµã‚’使用ã™ã‚‹å ´åˆã«ã¯NULLã«ã™ã‚‹ã“ã¨ã€‚ + \param oidSz ECC曲線OIDã®ã‚µã‚¤ã‚ºã€‚curveOIDãŒNULLã®å ´åˆã«ã¯0ã«ã™ã‚‹ã“ã¨ã€‚ + + _Example_ + \code + ecc_key eccKey; // wolfSSL ECC key object. + byte* der; // DER-encoded ECC key. + word32 derSize; // Size of der. + const byte* curveOid = NULL; // OID of curve used by eccKey. + word32 curveOidSz = 0; // Size of curve OID. + byte* pkcs8; // Output buffer for PKCS#8 key. + word32 pkcs8Sz; // Size of output buffer. + + derSize = wc_EccKeyDerSize(&eccKey, 1); + ... + derSize = wc_EccKeyToDer(&eccKey, der, derSize); + ... + ret = wc_ecc_get_oid(eccKey.dp->oidSum, &curveOid, &curveOidSz); + ... + ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, der, + derSize, ECDSAk, curveOid, curveOidSz); // Get size needed in pkcs8Sz. + ... + ret = wc_CreatePKCS8Key(pkcs8, &pkcs8Sz, der, + derSize, ECDSAk, curveOid, curveOidSz); + \endcode + + \sa wc_GetPkcs8TraditionalOffset + \sa wc_EncryptPKCS8Key + \sa wc_DecryptPKCS8Key + \sa wc_CreateEncryptedPKCS8Key +*/ +int wc_CreatePKCS8Key(byte* out, word32* outSz, + byte* key, word32 keySz, int algoID, const byte* curveOID, + word32 oidSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯æš—å·åŒ–ã•ã‚Œã¦ã„ãªã„PKCS#8ã®DERå½¢å¼ã®éµ(例ãˆã°wc_CreatePKCS8Keyã§ç”Ÿæˆã•ã‚ŒãŸéµ)ã‚’å—ã‘å–ã‚Šã€PKCS#8 æš—å·åŒ–å½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚ + çµæžœã¨ã—ã¦å¾—られãŸæš—å·åŒ–éµã¯wc_DecryptPKCS8Keyを使ã£ã¦å¾©å·ã§ãã¾ã™ã€‚RFC5208ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + \return æˆåŠŸæ™‚ã«ã¯å‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã«å‡ºåŠ›ã•ã‚ŒãŸæš—å·åŒ–éµã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return LENGTH_ONLY_E 出力先ãƒãƒƒãƒ•ã‚¡outãŒNULLã¨ã—ã¦æ¸¡ã•ã‚ŒãŸå ´åˆã«ã¯ã“ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã€outSzã«å¿…è¦ãªå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚ + \return エラー時ã«ã¯è² ã®æ•´æ•°å€¤ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param key 従æ¥ã®DERå½¢å¼ã®éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param keySz éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param out 出力çµæžœã‚’æ ¼ç´ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚NULLã®å ´åˆã«ã¯å¿…è¦ãªå‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒoutSzã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚ + \param outSz 出力先ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param password パスワードベース暗å·åŒ–アルゴリズムã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ‘スワード + \param passwordSz パスワードã®ã‚µã‚¤ã‚º(NULL終端文字ã¯å«ã¾ãªã„) + \param vPKCS 使用ã™ã‚‹PKCSã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã€‚1 ã¯PKCS12 ã‹PKCS5。 + \param pbeOid パスワードベース暗å·åŒ–スキームã®OID(PBES2 ã‚ã‚‹ã„ã¯RFC2898 A.3ã«ã‚ã‚‹OIDã®ä¸€ã¤) + \param encAlgId æš—å·åŒ–アルゴリズムID(例ãˆã°AES256CBCb)。 + \param salt ソルト。NULLã®å ´åˆã¯ãƒ©ãƒ³ãƒ€ãƒ ã«é¸å®šã—ãŸã‚½ãƒ«ãƒˆãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \param saltSz ソルトサイズ。saltã«NULLを渡ã—ãŸå ´åˆã«ã¯0を指定ã§ãã¾ã™ã€‚ + \param itt éµå°Žå‡ºã®ãŸã‚ã®ç¹°ã‚Šè¿”ã—回数 + \param rng åˆæœŸåŒ–済ã¿ã®WC_RNG構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param heap 動的メモリ確ä¿ã®ãŸã‚ã®ãƒ’ープ。NULL指定もå¯ã€‚ + + _Example_ + \code + byte* pkcs8; // Unencrypted PKCS#8 key. + word32 pkcs8Sz; // Size of pkcs8. + byte* pkcs8Enc; // Encrypted PKCS#8 key. + word32 pkcs8EncSz; // Size of pkcs8Enc. + const char* password; // Password to use for encryption. + int passwordSz; // Length of password (not including NULL terminator). + WC_RNG rng; + + // The following produces an encrypted version of pkcs8 in pkcs8Enc. The + // encryption uses password-based encryption scheme 2 (PBE2) from PKCS#5 and + // the AES cipher in CBC mode with a 256-bit key. See RFC 8018 for more on + // PKCS#5. + ret = wc_EncryptPKCS8Key(pkcs8, pkcs8Sz, pkcs8Enc, &pkcs8EncSz, password, + passwordSz, PKCS5, PBES2, AES256CBCb, NULL, 0, + WC_PKCS12_ITT_DEFAULT, &rng, NULL); + \endcode + + \sa wc_GetPkcs8TraditionalOffset + \sa wc_CreatePKCS8Key + \sa wc_DecryptPKCS8Key + \sa wc_CreateEncryptedPKCS8Key +*/ +int wc_EncryptPKCS8Key(byte* key, word32 keySz, byte* out, + word32* outSz, const char* password, int passwordSz, int vPKCS, + int pbeOid, int encAlgId, byte* salt, word32 saltSz, int itt, + WC_RNG* rng, void* heap); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯æš—å·åŒ–ã•ã‚ŒãŸPKCS#8ã®DERå½¢å¼ã®éµã‚’å—ã‘å–ã‚Šã€å¾©å·ã—ã¦PKCS#8 DERå½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚ + wc_EncryptPKCS8Keyã«ã‚ˆã£ã¦è¡Œã‚ã‚ŒãŸæš—å·åŒ–ã‚’å…ƒã«æˆ»ã—ã¾ã™ã€‚RFC5208ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + 入力データã¯å¾©å·ãƒ‡ãƒ¼ã‚¿ã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯å¾©å·ãƒ‡ãƒ¼ã‚¿ã®é•·ã•ã‚’è¿”ã—ã¾ã™ã€‚ + \return エラー発生時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param input 入力時ã«ã¯æš—å·åŒ–ã•ã‚ŒãŸPKCS#8éµãƒ‡ãƒ¼ã‚¿ã‚’å«ã¿ã¾ã™ã€‚出力時ã«ã¯å¾©å·ã•ã‚ŒãŸPKCS#8éµãƒ‡ãƒ¼ã‚¿ã‚’å«ã¿ã¾ã™ã€‚ + \param sz 入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param password éµã‚’æš—å·åŒ–ã™ã‚‹éš›ã®ãƒ‘スワード + \param passwordSz パスワードã®ã‚µã‚¤ã‚º(NULL終端文字ã¯å«ã¾ãªã„) + + _Example_ + \code + byte* pkcs8Enc; // Encrypted PKCS#8 key made with wc_EncryptPKCS8Key. + word32 pkcs8EncSz; // Size of pkcs8Enc. + const char* password; // Password to use for decryption. + int passwordSz; // Length of password (not including NULL terminator). + + ret = wc_DecryptPKCS8Key(pkcs8Enc, pkcs8EncSz, password, passwordSz); + \endcode + + \sa wc_GetPkcs8TraditionalOffset + \sa wc_CreatePKCS8Key + \sa wc_EncryptPKCS8Key + \sa wc_CreateEncryptedPKCS8Key +*/ +int wc_DecryptPKCS8Key(byte* input, word32 sz, const char* password, + int passwordSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯å¾“æ¥ã®DERå½¢å¼ã®éµã‚’PKCS#8フォーマットã«å¤‰æ›ã—ã€æš—å·åŒ–ã‚’è¡Œã„ã¾ã™ã€‚ + ã“ã®å‡¦ç†ã«ã¯wc_CreatePKCS8Keyã¨wc_EncryptPKCS8Keyを使用ã—ã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯å‡ºåŠ›ã—ãŸæš—å·åŒ–éµã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \return LENGTH_ONLY_E ã‚‚ã—出力用ãƒãƒƒãƒ•ã‚¡outã«NULLãŒæ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ãã®éš›ã«ã¯outSz変数ã«å¿…è¦ãªå‡ºåŠ›ç”¨ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã—ã¾ã™ã€‚ + \return エラー発生時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param key 従æ¥ã®DERå½¢å¼ã®éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param keySz éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param out çµæžœã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚NULLãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã«ã¯ã€å¿…è¦ãªãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒoutSzã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚ + \param outSz çµæžœã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param password パスワードベース暗å·ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ‘スワード + \param passwordSz パスワードã®ã‚µã‚¤ã‚º(NULL終端文字ã¯å«ã¾ãªã„) + \param vPKCS 使用ã™ã‚‹PKCSã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã€‚1 ã¯PKCS12 ã‹PKCS5。 + \param pbeOid パスワードベース暗å·åŒ–スキームã®OID(PBES2 ã‚ã‚‹ã„ã¯RFC2898 A.3ã«ã‚ã‚‹OIDã®ä¸€ã¤) + \param encAlgId æš—å·åŒ–アルゴリズムID(例ãˆã°AES256CBCb)。 + \param salt ソルト。NULLã®å ´åˆã¯ãƒ©ãƒ³ãƒ€ãƒ ã«é¸å®šã—ãŸã‚½ãƒ«ãƒˆãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \param saltSz ソルトサイズ。saltã«NULLを渡ã—ãŸå ´åˆã«ã¯0を指定ã§ãã¾ã™ã€‚ + \param itt éµå°Žå‡ºã®ãŸã‚ã®ç¹°ã‚Šè¿”ã—回数 + \param rng åˆæœŸåŒ–済ã¿ã®WC_RNG構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param heap 動的メモリ確ä¿ã®ãŸã‚ã®ãƒ’ープ。NULL指定もå¯ã€‚ + + _Example_ + \code + byte* key; // Traditional private key (DER formatted). + word32 keySz; // Size of key. + byte* pkcs8Enc; // Encrypted PKCS#8 key. + word32 pkcs8EncSz; // Size of pkcs8Enc. + const char* password; // Password to use for encryption. + int passwordSz; // Length of password (not including NULL terminator). + WC_RNG rng; + + // The following produces an encrypted, PKCS#8 version of key in pkcs8Enc. + // The encryption uses password-based encryption scheme 2 (PBE2) from PKCS#5 + // and the AES cipher in CBC mode with a 256-bit key. See RFC 8018 for more + // on PKCS#5. + ret = wc_CreateEncryptedPKCS8Key(key, keySz, pkcs8Enc, &pkcs8EncSz, + password, passwordSz, PKCS5, PBES2, AES256CBCb, NULL, 0, + WC_PKCS12_ITT_DEFAULT, &rng, NULL); + \endcode + + \sa wc_GetPkcs8TraditionalOffset + \sa wc_CreatePKCS8Key + \sa wc_EncryptPKCS8Key + \sa wc_DecryptPKCS8Key +*/ +int wc_CreateEncryptedPKCS8Key(byte* key, word32 keySz, byte* out, + word32* outSz, const char* password, int passwordSz, int vPKCS, + int pbeOid, int encAlgId, byte* salt, word32 saltSz, int itt, + WC_RNG* rng, void* heap); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯cert引数ã§ä¸Žãˆã‚‰ã‚ŒãŸDecodedCert構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ + DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚“ã§ã„ã‚‹source引数ã®æŒ‡ã™ãƒã‚¤ãƒ³ã‚¿ã‹ã‚‰è¨¼æ˜Žæ›¸ã‚µã‚¤ã‚ºinSzã®é•·ã•ã‚’内部ã«ä¿å­˜ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã®å¾Œã«å‘¼ã³å‡ºã•ã‚Œã‚‹wc_ParseCertã«ã‚ˆã£ã¦è¨¼æ˜Žæ›¸ãŒè§£æžã•ã‚Œã¾ã™ã€‚ + + \param cert DecodedCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param source DERå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inSz 証明書データã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°ï¼‰ + \param heap 動的メモリ確ä¿ã®ãŸã‚ã®ãƒ’ープ。NULL指定もå¯ã€‚ + + _Example_ + \code + DecodedCert decodedCert; // Decoded certificate object. + byte* certBuf; // DER-encoded certificate buffer. + word32 certBufSz; // Size of certBuf in bytes. + + wc_InitDecodedCert(&decodedCert, certBuf, certBufSz, NULL); + \endcode + + \sa wc_ParseCert + \sa wc_FreeDecodedCert +*/ +void wc_InitDecodedCert(struct DecodedCert* cert, + const byte* source, word32 inSz, void* heap); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DecodedCert構造体ã«ä¿å­˜ã•ã‚Œã¦ã„ã‚‹DERå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’解æžã—ã€ãã®æ§‹é€ ä½“ã«å„種フィールドを設定ã—ã¾ã™ã€‚ + DecodedCert構造体ã¯wc_InitDecodedCertを呼ã³å‡ºã—ã¦åˆæœŸåŒ–ã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã‚ªãƒ—ションã§CertificateManager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å—ã‘å–ã‚Šã€CAãŒè¨¼æ˜Žæ›¸ãƒžãƒã‚¸ãƒ£ãƒ¼ã§æ¤œç´¢ã§ããŸå ´åˆã«ã¯ã€ + ãã®CAã«é–¢ã™ã‚‹æƒ…報もDecodedCert構造体ã«è¿½åŠ è¨­å®šã—ã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return エラー発生時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param cert åˆæœŸåŒ–済ã¿ã®DecodedCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param type 証明書タイプ。タイプã®è¨­å®šå€¤ã«ã¤ã„ã¦ã¯asn_public.hã®CertType enum定義をå‚ç…§ã—ã¦ãã ã•ã„。 + \param verify 呼ã³å‡ºã—å´ãŒè¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚’求ã‚ã¦ã„ã‚‹ã“ã¨ã‚’指示ã™ãƒ•ãƒ©ã‚°ã§ã™ã€‚ + \param cm CertificateManager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚オプションã§æŒ‡å®šå¯ã€‚NULLã§ã‚‚å¯ã€‚ + + _Example_ + \code + int ret; + DecodedCert decodedCert; // Decoded certificate object. + byte* certBuf; // DER-encoded certificate buffer. + word32 certBufSz; // Size of certBuf in bytes. + + wc_InitDecodedCert(&decodedCert, certBuf, certBufSz, NULL); + ret = wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL); + if (ret != 0) { + fprintf(stderr, "wc_ParseCert failed.\n"); + } + \endcode + + \sa wc_InitDecodedCert + \sa wc_FreeDecodedCert +*/ +int wc_ParseCert(DecodedCert* cert, int type, int verify, void* cm); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯wc_InitDecodedCertã§åˆæœŸåŒ–済ã¿ã®DecodedCert構造体を解放ã—ã¾ã™ã€‚ + + \param cert åˆæœŸåŒ–済ã¿ã®DecodedCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + _Example_ + \code + int ret; + DecodedCert decodedCert; // Decoded certificate object. + byte* certBuf; // DER-encoded certificate buffer. + word32 certBufSz; // Size of certBuf in bytes. + + wc_InitDecodedCert(&decodedCert, certBuf, certBufSz, NULL); + ret = wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL); + if (ret != 0) { + fprintf(stderr, "wc_ParseCert failed.\n"); + } + wc_FreeDecodedCert(&decodedCert); + \endcode + + \sa wc_InitDecodedCert + \sa wc_ParseCert +*/ +void wc_FreeDecodedCert(struct DecodedCert* cert); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ã‚¿ã‚¤ãƒ ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’登録ã—ã¾ã™ã€‚wolfSSLãŒç¾åœ¨æ™‚刻を必è¦ã¨ã—ãŸã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ã“ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’呼ã³å‡ºã—ã¾ã™ã€‚ + ã“ã®ã‚¿ã‚¤ãƒ ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã®ãƒ—ロトタイプ(シグãƒãƒãƒ£ï¼‰ã¯C標準ライブラリã®"time"関数ã¨åŒä¸€ã§ã™ã€‚ + + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + + \param f タイムコールãƒãƒƒã‚¯é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + int ret = 0; + // Time callback prototype + time_t my_time_cb(time_t* t); + // Register it + ret = wc_SetTimeCb(my_time_cb); + if (ret != 0) { + // failed to set time callback + } + time_t my_time_cb(time_t* t) + { + // custom time function + } + \endcode + + \sa wc_Time +*/ +int wc_SetTimeCb(wc_time_cb f); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯ç¾åœ¨æ™‚刻をå–å¾—ã—ã¾ã™ã€‚デフォルトã§XTIMEマクロ関数を使ã„ã¾ã™ã€‚ã“ã®ãƒžã‚¯ãƒ­é–¢æ•°ã¯ãƒ—ラットフォームä¾å­˜ã§ã™ã€‚ + ユーザーã¯ã“ã®ãƒžã‚¯ãƒ­ã®ä»£ã‚ã‚Šã«wc_SetTimeCbã§ã‚¿ã‚¤ãƒ ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’使ã†ã‚ˆã†ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ + + \return æˆåŠŸæ™‚ã«ã¯ç¾åœ¨æ™‚刻を返ã—ã¾ã™ã€‚ + + \param t ç¾åœ¨æ™‚刻を返å´ã™ã‚‹ã‚ªãƒ—ションã®time_t型変数。 + + _Example_ + \code + time_t currentTime = 0; + currentTime = wc_Time(NULL); + wc_Time(¤tTime); + \endcode + + \sa wc_SetTimeCb +*/ +time_t wc_Time(time_t* t); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯X.509証明書ã«ã‚«ã‚¹ã‚¿ãƒ æ‹¡å¼µã‚’追加ã—ã¾ã™ã€‚ + 注: ã“ã®é–¢æ•°ã«æ¸¡ã™ãƒã‚¤ãƒ³ã‚¿å¼•æ•°ãŒä¿æŒã™ã‚‹å†…容ã¯è¨¼æ˜Žæ›¸ãŒç”Ÿæˆã•ã‚Œã‚‹ã¾ã§å¤‰æ›´ã•ã‚Œã¦ã¯ã„ã‘ã¾ã›ã‚“。 + ã“ã®é–¢æ•°ã§ã¯ãƒã‚¤ãƒ³ã‚¿ãŒæŒ‡ã™å…ˆã®å†…容ã¯åˆ¥ã®ãƒãƒƒãƒ•ã‚¡ã«ã¯è¤‡è£½ã—ã¾ã›ã‚“。 + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return エラー発生時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param cert åˆæœŸåŒ–済ã¿ã®DecodedCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param critical 0ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã«ã¯è¿½åŠ ã™ã‚‹æ‹¡å¼µã¯ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã¨ã¯ãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã›ã‚“。 + 0以外ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã«ã¯ã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã™ã€‚ + \param oid ドット区切りã®oid文字列。例ãˆã°ã€"1.2.840.10045.3.1.7" + \param der 拡張情報ã®DERエンコードã•ã‚ŒãŸå†…容をå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param derSz DERエンコードã•ã‚ŒãŸå†…容をå«ã‚€ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + + _Example_ + \code + int ret = 0; + Cert newCert; + wc_InitCert(&newCert); + + // Code to setup subject, public key, issuer, and other things goes here. + + ret = wc_SetCustomExtension(&newCert, 1, "1.2.3.4.5", + (const byte *)"This is a critical extension", 28); + if (ret < 0) { + // Failed to set the extension. + } + + ret = wc_SetCustomExtension(&newCert, 0, "1.2.3.4.6", + (const byte *)"This is NOT a critical extension", 32) + if (ret < 0) { + // Failed to set the extension. + } + + // Code to sign the certificate and then write it out goes here. + + \endcode + + \sa wc_InitCert + \sa wc_SetUnknownExtCallback +*/ +int wc_SetCustomExtension(Cert *cert, int critical, const char *oid, + const byte *der, word32 derSz); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯wolfSSLãŒè¨¼æ˜Žæ›¸ã®è§£æžä¸­ã«æœªçŸ¥ã®X.509æ‹¡å¼µã«é­é‡ã—ãŸéš›ã«å‘¼ã³å‡ºã™ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’登録ã—ã¾ã™ã€‚ + コールãƒãƒƒã‚¯é–¢æ•°ã®ãƒ—ロトタイプã¯ä½¿ç”¨ä¾‹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return エラー発生時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param cert コールãƒãƒƒã‚¯é–¢æ•°ã‚’登録ã™ã‚‹å¯¾è±¡ã®DecodedCert構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cb 登録ã•ã‚Œã‚‹ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + int ret = 0; + // Unknown extension callback prototype + int myUnknownExtCallback(const word16* oid, word32 oidSz, int crit, + const unsigned char* der, word32 derSz); + + // Register it + ret = wc_SetUnknownExtCallback(cert, myUnknownExtCallback); + if (ret != 0) { + // failed to set the callback + } + + // oid: OIDを構æˆã™ã‚‹ãƒ‰ãƒƒãƒˆåŒºåˆ‡ã‚Šã®æ•°ã‚’æ ¼ç´ã—ãŸé…列 + // oidSz: oid内ã®å€¤ã®æ•° + // crit: æ‹¡å¼µãŒã‚¯ãƒªãƒ†ã‚£ã‚«ãƒ«ã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„ã‚‹ã‹ + // der: DERエンコードã•ã‚Œã¦ã„ã‚‹æ‹¡å¼µã®å†…容 + // derSz: æ‹¡å¼µã®å†…容ã®ã‚µã‚¤ã‚º + int myCustomExtCallback(const word16* oid, word32 oidSz, int crit, + const unsigned char* der, word32 derSz) { + + // 拡張を解æžã™ã‚‹ãƒ­ã‚¸ãƒƒã‚¯ã¯ã“ã“ã«è¨˜è¿°ã—ã¾ã™ + + // NOTE: コールãƒãƒƒã‚¯é–¢æ•°ã‹ã‚‰0ã‚’è¿”ã™ã¨wolfSSLã«å¯¾ã—ã¦ã“ã®æ‹¡å¼µã‚’å—ã‘入れå¯èƒ½ã¨ + // 表明ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ‹¡å¼µã‚’処ç†ã§ãã‚‹ã¨åˆ¤æ–­ã§ããªã„å ´åˆã«ã¯ã‚¨ãƒ©ãƒ¼ã‚’ + // è¿”ã—ã¦ãã ã•ã„。クリティカルã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¦ã„る未知ã®æ‹¡å¼µã«é­é‡ã—ãŸéš›ã®æ¨™æº–çš„ + // ãªæŒ¯ã‚‹èˆžã„ã¯ASN_CRIT_EXT_Eã‚’è¿”ã™ã“ã¨ã§ã™ã€‚ + // ç°¡æ½”ã«ã™ã‚‹ãŸã‚ã«ã“ã®ä¾‹ã§ã¯ã™ã¹ã¦ã®æ‹¡å¼µæƒ…報をå—ã‘入れå¯ã¨ã—ã¦ã„ã¾ã™ãŒã€å®Ÿéš›ã«ã¯å®Ÿæƒ…ã«æ²¿ã†ã‚ˆã†ã«ãƒ­ã‚¸ãƒƒã‚¯ã‚’追加ã—ã¦ãã ã•ã„。 + + return 0; + } + \endcode + + \sa ParseCert + \sa wc_SetCustomExtension +*/ +int wc_SetUnknownExtCallback(DecodedCert* cert, + wc_UnknownExtCallback cb); +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯DERå½¢å¼ã®X.509 証明書ã®ç½²åを与ãˆã‚‰ã‚ŒãŸå…¬é–‹éµã‚’使ã£ã¦æ¤œè¨¼ã—ã¾ã™ã€‚ + 公開éµã¯DERå½¢å¼ã§å…¨å…¬é–‹éµæƒ…報をå«ã‚“ã ã‚‚ã®ãŒæ±‚ã‚られã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return エラー発生時ã«ã¯è² ã®æ•´æ•°å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + + \param cert DERå½¢å¼ã®X.509証明書をå«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param certSz 証明書をå«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param heap 動的メモリ確ä¿ã®ãŸã‚ã®ãƒ’ープ。NULL指定もå¯ã€‚ + \param pubKey DERå½¢å¼ã®å…¬é–‹éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param pubKeySz 公開éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param pubKeyOID 公開éµã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã‚’特定ã™ã‚‹OID(ã™ãªã‚ã¡: ECDSAk, DSAk ã‚„ RSAk) +*/ +int wc_CheckCertSigPubKey(const byte* cert, word32 certSz, + void* heap, const byte* pubKey, + word32 pubKeySz, int pubKeyOID); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯Asn1PrintOptions構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG asn1ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param opts プリントã®ãŸã‚ã®Asn1PrintOptions構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Asn1PrintOptions opt; + + // Initialize ASN.1 print options before use. + wc_Asn1PrintOptions_Init(&opt); + \endcode + + \sa wc_Asn1PrintOptions_Set + \sa wc_Asn1_PrintAll +*/ +int wc_Asn1PrintOptions_Init(Asn1PrintOptions* opts); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯Asn1PrintOptions構造体ã«ãƒ—リント情報を設定ã—ã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG asn1ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG valãŒç¯„囲外ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param opts Asn1PrintOptions構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param opt 設定ã™ã‚‹æƒ…å ±ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param val 設定値 + + _Example_ + \code + Asn1PrintOptions opt; + + // Initialize ASN.1 print options before use. + wc_Asn1PrintOptions_Init(&opt); + // Set the number of indents when printing tag name to be 1. + wc_Asn1PrintOptions_Set(&opt, ASN1_PRINT_OPT_INDENT, 1); + \endcode + + \sa wc_Asn1PrintOptions_Init + \sa wc_Asn1_PrintAll +*/ +int wc_Asn1PrintOptions_Set(Asn1PrintOptions* opts, enum Asn1PrintOpt opt, + word32 val); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯Asn1構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG asn1ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param asn1 Asn1構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + Asn1 asn1; + + // Initialize ASN.1 parse object before use. + wc_Asn1_Init(&asn1); + \endcode + + \sa wc_Asn1_SetFile + \sa wc_Asn1_PrintAll + */ +int wc_Asn1_Init(Asn1* asn1); + +/*! + \ingroup ASN + + \brief ã“ã®é–¢æ•°ã¯å‡ºåŠ›å…ˆã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’Asn1構造体ã«ã‚»ãƒƒãƒˆã—ã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG asn1ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG fileãŒXBADFILEã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚. + + \param asn1 Asn1構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param file プリント先ã®ãƒ•ã‚¡ã‚¤ãƒ« + + _Example_ + \code + Asn1 asn1; + + // Initialize ASN.1 parse object before use. + wc_Asn1_Init(&asn1); + // Set standard out to be the file descriptor to write to. + wc_Asn1_SetFile(&asn1, stdout); + \endcode + + \sa wc_Asn1_Init + \sa wc_Asn1_PrintAll + */ +int wc_Asn1_SetFile(Asn1* asn1, XFILE file); + +/*! + \ingroup ASN + + \brief ASN.1アイテムをプリントã—ã¾ã™ã€‚ + + \return 0 æˆåŠŸæ™‚ã«è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG asn1ã‹optsãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_LEN_E ASN.1アイテムãŒé•·ã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_DEPTH_E 終了オフセットãŒç„¡åŠ¹ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_PARSE_E å…¨ã®ASN.1アイテムã®è§£æžãŒå®Œäº†ã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param asn1 Asn1構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param opts Asn1PrintOptions構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param data BER/DERå½¢å¼ã®ãƒ—リント対象データã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param len プリント対象データã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°ï¼‰ + + \code + Asn1PrintOptions opts; + Asn1 asn1; + unsigned char data[] = { Initialize with DER/BER data }; + word32 len = sizeof(data); + + // Initialize ASN.1 print options before use. + wc_Asn1PrintOptions_Init(&opt); + // Set the number of indents when printing tag name to be 1. + wc_Asn1PrintOptions_Set(&opt, ASN1_PRINT_OPT_INDENT, 1); + + // Initialize ASN.1 parse object before use. + wc_Asn1_Init(&asn1); + // Set standard out to be the file descriptor to write to. + wc_Asn1_SetFile(&asn1, stdout); + // Print all ASN.1 items in buffer with the specified print options. + wc_Asn1_PrintAll(&asn1, &opts, data, len); + \endcode + + \sa wc_Asn1_Init + \sa wc_Asn1_SetFile + */ +int wc_Asn1_PrintAll(Asn1* asn1, Asn1PrintOptions* opts, unsigned char* data, + word32 len); + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/chacha20_poly1305.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/chacha20_poly1305.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/chacha20_poly1305.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/chacha20_poly1305.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,9 +1,10 @@ /*! - \ingroup ChaCha20Poly1305 - \brief ã“ã®é–¢æ•°ã¯ã€Chacha20 Streamæš—å·ã‚’使用ã—ã¦ã€Chacha20 Streamæš—å·ã‚’使用ã—ã¦ã€Output BufferTextã«å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€InPleaintextã‚’æš—å·åŒ–ã—ã¾ã™ã€‚ã¾ãŸã€Poly-1305èªè¨¼ï¼ˆæš—å·ãƒ†ã‚­ã‚¹ãƒˆï¼‰ã‚’実行ã—ã€ç”Ÿæˆã—ãŸèªè¨¼ã‚¿ã‚°ã‚’出力ãƒãƒƒãƒ•ã‚¡OutauthTagã«æ ¼ç´ã—ã¾ã™ã€‚ - \return 0 メッセージã®æš—å·åŒ–ã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã—㟠+ \ingroup ChaCha20Poly1305 + \brief ã“ã®é–¢æ•°ã¯ã€Chacha20 Streamæš—å·ã‚’使用ã—ã¦ã€Output BufferTextã«å…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€InPleaintextã‚’æš—å·åŒ–ã—ã¾ã™ã€‚ + ã¾ãŸã€Poly-1305èªè¨¼ï¼ˆæš—å·ãƒ†ã‚­ã‚¹ãƒˆï¼‰ã‚’実行ã—ã€ç”Ÿæˆã—ãŸèªè¨¼ã‚¿ã‚°ã‚’出力ãƒãƒƒãƒ•ã‚¡OutauthTagã«æ ¼ç´ã—ã¾ã™ã€‚ + \return 0 メッセージã®æš—å·åŒ–ã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG æš—å·åŒ–プロセス中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ - \param inKey æš—å·åŒ–ã«ä½¿ç”¨ã™ã‚‹32ãƒã‚¤ãƒˆã®ã‚­ãƒ¼ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inKey æš—å·åŒ–ã«ä½¿ç”¨ã™ã‚‹32ãƒã‚¤ãƒˆã®éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inIv æš—å·åŒ–ã«ä½¿ç”¨ã™ã‚‹12ãƒã‚¤ãƒˆã®IVã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inAAD ä»»æ„ã®é•·ã•ã®è¿½åŠ èªè¨¼ãƒ‡ãƒ¼ã‚¿ï¼ˆAAD)をå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inAADLen 入力AADã®é•·ã• @@ -41,17 +42,19 @@ byte outAuthTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]); /*! - \ingroup ChaCha20Poly1305 - \brief ã“ã®é–¢æ•°ã¯ã€Chacha20 Streamæš—å·ã‚’使用ã—ã¦ã€Chacha20 Streamæš—å·ã‚’使用ã—ã¦ã€å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã€OutpleAntextã«å…¥åŠ›ã•ã‚ŒãŸæš—å·æ–‡ã®å…¥åŠ›ã‚’復å·åŒ–ã—ã¾ã™ã€‚ã¾ãŸã€Poly-1305èªè¨¼ã‚’実行ã—ã€æŒ‡å®šã•ã‚ŒãŸINAUTHTAGã‚’INAADã§ç”Ÿæˆã•ã‚ŒãŸèªè¨¼ï¼ˆä»»æ„ã®é•·ã•ã®è¿½åŠ èªè¨¼ãƒ‡ãƒ¼ã‚¿ï¼‰ã¨æ¯”較ã—ã¾ã™ã€‚注:生æˆã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ãŒæä¾›ã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ã¨ä¸€è‡´ã—ãªã„å ´åˆã€ãƒ†ã‚­ã‚¹ãƒˆã¯å¾©å·åŒ–ã•ã‚Œã¾ã›ã‚“。 - \return 0 メッセージã®å¾©å·åŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã—㟠+ \ingroup ChaCha20Poly1305 + \brief ã“ã®é–¢æ•°ã¯ã€Chacha20 Streamæš—å·ã‚’使用ã—ã¦ã€å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡OutpleAntextã«å¾©å·ã—ãŸãƒ‡ãƒ¼ã‚¿ã‚’出力ã—ã¾ã™ã€‚ + ã¾ãŸã€Poly-1305èªè¨¼ã‚’実行ã—ã€æŒ‡å®šã•ã‚ŒãŸinAuthTagã‚’inAADã§ç”Ÿæˆã•ã‚ŒãŸèªè¨¼ï¼ˆä»»æ„ã®é•·ã•ã®è¿½åŠ èªè¨¼ãƒ‡ãƒ¼ã‚¿ï¼‰ã¨æ¯”較ã—ã¾ã™ã€‚ + 注:生æˆã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ãŒæä¾›ã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ã¨ä¸€è‡´ã—ãªã„å ´åˆã€ãƒ†ã‚­ã‚¹ãƒˆã¯å¾©å·ã•ã‚Œã¾ã›ã‚“。 + \return 0 メッセージã®å¾©å·ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã—㟠\return BAD_FUNC_ARG 関数引数ã®ã„ãšã‚Œã‹ãŒäºˆæƒ³ã•ã‚Œã‚‹ã‚‚ã®ã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ - \return MAC_CMP_FAILED_E 生æˆã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ãŒæä¾›ã•ã‚Œã¦ã„ã‚‹INAUTHTAGã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param inKey 復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹32ãƒã‚¤ãƒˆã®ã‚­ãƒ¼ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param inIv 復å·åŒ–ã«ä½¿ç”¨ã™ã‚‹12ãƒã‚¤ãƒˆã®IVã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \return MAC_CMP_FAILED_E 生æˆã•ã‚ŒãŸèªè¨¼ã‚¿ã‚°ãŒæä¾›ã•ã‚Œã¦ã„ã‚‹inAuthTagã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param inKey 復å·ã«ä½¿ç”¨ã™ã‚‹32ãƒã‚¤ãƒˆã®éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param inIv 復å·ã«ä½¿ç”¨ã™ã‚‹12ãƒã‚¤ãƒˆã®IVã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inAAD ä»»æ„ã®é•·ã•ã®è¿½åŠ èªè¨¼ãƒ‡ãƒ¼ã‚¿ï¼ˆAAD)をå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inAADLen 入力AADã®é•·ã• - \param inCiphertext 復å·åŒ–ã™ã‚‹æš—å·æ–‡ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param outCiphertextLen 復å·åŒ–ã™ã‚‹æš—å·æ–‡ã®é•·ã• + \param inCiphertext 復å·ã™ã‚‹æš—å·æ–‡ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param outCiphertextLen 復å·ã™ã‚‹æš—å·æ–‡ã®é•·ã• \param inAuthTag èªè¨¼ã®ãŸã‚ã®16ãƒã‚¤ãƒˆã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code @@ -65,7 +68,7 @@ byte plain[sizeof(cipher)]; int ret = wc_ChaCha20Poly1305_Decrypt(key, iv, inAAD, sizeof(inAAD), - cipher, sizeof(cipher), plain, authTag); + cipher, sizeof(cipher), authTag, plain); if(ret == MAC_CMP_FAILED_E) { // error during authentication diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/cmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/cmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/cmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/cmac.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,21 +1,21 @@ /*! \ingroup CMAC - \brief Cmac 構造体をデフォルトã§åˆæœŸåŒ–ã™ã‚‹ - \return æˆåŠŸã—ãŸã‚‰ 0 を返㙠- \param cmac Cmac 構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param キー キー ãƒã‚¤ãƒ³ã‚¿ - \param keySz キー ãƒã‚¤ãƒ³ã‚¿ã®ã‚µã‚¤ã‚º (16ã€24ã€ã¾ãŸã¯ 32) - \param type 常㫠WC_CMAC_AES = 1 - \param 未使用 使用ã•ã‚Œã¦ã„ã¾ã›ã‚“。互æ›æ€§ã«é–¢ã™ã‚‹å°†æ¥ã®æ½œåœ¨çš„ãªä½¿ç”¨ã®ãŸã‚ã«å­˜åœ¨ã—ã¾ã™ + \brief Cmac構造体をデフォルト値ã§åˆæœŸåŒ–ã—ã¾ã™ + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param cmac Cmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key éµãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param keySz éµãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º(16ã€24ã€ã¾ãŸã¯ 32) + \param type 常ã«WC_CMAC_AES(=1) + \param unused 使用ã•ã‚Œã¦ã„ã¾ã›ã‚“。互æ›æ€§ã«é–¢ã™ã‚‹å°†æ¥ã®æ½œåœ¨çš„ãªä½¿ç”¨ã®ãŸã‚ã«å­˜åœ¨ã—ã¾ã™ _例_ \code Cmac cmac[1]; - ret = wc_InitCmac(cmacã€ã‚­ãƒ¼ã€keySzã€WC_CMAC_AESã€NULL); - ã‚‚ã— (ret == 0) { + ret = wc_InitCmac(cmacã€keyã€keySzã€WC_CMAC_AESã€NULL); + if (ret == 0) { ret = wc_CmacUpdate(cmacã€inã€inSz); } - ã‚‚ã— (ret == 0) { + if (ret == 0) { ret = wc_CmacFinal(cmac, out, outSz); } \endcode @@ -23,31 +23,33 @@ \sa wc_InitCmac_ex \sa wc_CmacUpdate \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_InitCmac(Cmac* cmac, - const byte* キーã€word32 keySz〠- intåž‹ã€void*未使用); + const byte* keyã€word32 keySz〠+ int typeã€void* unused); /*! \ingroup CMAC - \brief Cmac 構造体をデフォルトã§åˆæœŸåŒ–ã™ã‚‹ - \return æˆåŠŸã—ãŸã‚‰ 0 を返㙠- \param cmac Cmac 構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param キー キー ãƒã‚¤ãƒ³ã‚¿ - \param keySz キー ãƒã‚¤ãƒ³ã‚¿ã®ã‚µã‚¤ã‚º (16ã€24ã€ã¾ãŸã¯ 32) - \param type 常㫠WC_CMAC_AES = 1 - \param 未使用 使用ã•ã‚Œã¦ã„ã¾ã›ã‚“。互æ›æ€§ã«é–¢ã™ã‚‹å°†æ¥ã®æ½œåœ¨çš„ãªä½¿ç”¨ã®ãŸã‚ã«å­˜åœ¨ã—ã¾ã™ - \param heap 動的割り当ã¦ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ’ープ ヒントã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã€‚ 通常ã€ã‚¹ã‚¿ãƒ†ã‚£ãƒƒã‚¯ メモリ オプションã§ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ NULL ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - \param devId éžåŒæœŸãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ä½¿ç”¨ã™ã‚‹ ID。 éžåŒæœŸãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’使用ã—ã¦ã„ãªã„å ´åˆã¯ã€INVALID_DEVID ã«è¨­å®šã—ã¾ã™ã€‚ + \brief Cmac構造体をデフォルト値ã§åˆæœŸåŒ–ã—ã¾ã™ + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param cmac Cmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key éµãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param keySz éµãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º(16ã€24ã€ã¾ãŸã¯ 32) + \param type 常ã«WC_CMAC_AES(=1) + \param unused 使用ã•ã‚Œã¦ã„ã¾ã›ã‚“。互æ›æ€§ã«é–¢ã™ã‚‹å°†æ¥ã®æ½œåœ¨çš„ãªä½¿ç”¨ã®ãŸã‚ã«å­˜åœ¨ã—ã¾ã™ + \param heap 動的割り当ã¦ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ’ープヒントã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ 通常ã€ã‚¹ã‚¿ãƒ†ã‚£ãƒƒã‚¯ãƒ¡ãƒ¢ãƒªã‚ªãƒ—ションã§ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ NULLã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \param devId éžåŒæœŸãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã§ä½¿ç”¨ã™ã‚‹ID。éžåŒæœŸãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚’使用ã—ã¦ã„ãªã„å ´åˆã¯ã€INVALID_DEVIDã«è¨­å®šã—ã¾ã™ã€‚ _例_ \code Cmac cmac[1]; - ret = wc_InitCmac_ex(cmacã€ã‚­ãƒ¼ã€keySzã€WC_CMAC_AESã€NULLã€NULLã€INVALID_DEVID); - ã‚‚ã— (ret == 0) { - ret = wc_CmacUpdate(cmacã€inã€inSz); + ret = wc_InitCmac_ex(cmac, key, keySz, WC_CMAC_AES, NULL, NULL, INVALID_DEVID); + if (ret == 0) { + ret = wc_CmacUpdate(cmac, in, inSz); } - ã‚‚ã— (ret == 0) { + if (ret == 0) { ret = wc_CmacFinal(cmac, out, &outSz); } \endcode @@ -55,17 +57,19 @@ \sa wc_InitCmac_ex \sa wc_CmacUpdate \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_InitCmac_ex(Cmac* cmac, - const byte* キーã€word32 keySz〠- int åž‹ã€void* 未使用ã€void* ヒープã€int devId); + const byte* key, word32 keySz, + int type, void* unusedã€void* heap, int devId); /*! \ingroup CMAC \brief æš—å·ãƒ™ãƒ¼ã‚¹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸èªè¨¼ã‚³ãƒ¼ãƒ‰å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã‚’追加 - \return æˆåŠŸã—ãŸã‚‰ 0 を返㙠- \param cmac Cmac 構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param in 処ç†ã™ã‚‹å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã® + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param cmac Cmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param in 処ç†ã™ã‚‹å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inSz 入力データã®ã‚µã‚¤ã‚º _例_ @@ -75,17 +79,40 @@ \sa wc_InitCmac \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_CmacUpdate(Cmac* cmac, const byte* in, word32 inSz); /*! - \ingroup CMAC - \brief æš—å·ãƒ™ãƒ¼ã‚¹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸èªè¨¼ã‚³ãƒ¼ãƒ‰ã‚’使用ã—ã¦æœ€çµ‚çµæžœã‚’生æˆã™ã‚‹ - \return æˆåŠŸã—ãŸã‚‰ 0 を返㙠- \param cmac Cmac 構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param out çµæžœã‚’è¿”ã™ãƒã‚¤ãƒ³ã‚¿ - \param outSz 出力ã®ãƒã‚¤ãƒ³ã‚¿ã‚µã‚¤ã‚º (in/out) + \ingroup CMAC + \brief æš—å·ãƒ™ãƒ¼ã‚¹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸èªè¨¼ã‚³ãƒ¼ãƒ‰ã®æœ€çµ‚çµæžœã‚’生æˆã—ã¾ã™ã€‚ãŸã ã—ã€ä½¿ç”¨ã—ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ã¯è¡Œã„ã¾ã›ã‚“。 + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param cmac Cmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param out çµæžœã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param outSz çµæžœå‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ + \code + ret = wc_CmacFinalNoFree(cmac, out, &outSz); + (void)wc_CmacFree(cmac); + \endcode + + \sa wc_InitCmac + \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree +*/ +int wc_CmacFinalNoFree(Cmac* cmac, + byte* out, word32* outSz); +/*! + \ingroup CMAC + \brief æš—å·ãƒ™ãƒ¼ã‚¹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸èªè¨¼ã‚³ãƒ¼ãƒ‰ã‚’使用ã—ã¦æœ€çµ‚çµæžœã‚’生æˆã—ã¾ã™ã€‚加ãˆã¦ã€å†…部ã§wc_CmacFreeを呼ã³å‡ºã—ã¦ã‚³ãƒ³ãƒ†ã‚­ã‚¹ã¨ã‚’クリーンアップã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param cmac Cmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param out çµæžœã‚’æ ¼ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param outSz çµæžœå‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º _例_ \code @@ -94,20 +121,41 @@ \sa wc_InitCmac \sa wc_CmacFinal + \sa wc_CmacFinalNoFree + \sa wc_CmacFree */ int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz); /*! + \ingroup CMAC + \brief CMAC処ç†ä¸­ã«Cmac構造体内ã«ç¢ºä¿ã•ã‚ŒãŸã‚ªãƒ–ジェクトを開放ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param cmac Cmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + ret = wc_CmacFinalNoFree(cmac, out, &outSz); + (void)wc_CmacFree(cmac); + \endcode + + \sa wc_InitCmac + \sa wc_CmacFinalNoFree + \sa wc_CmacFinal + \sa wc_CmacFree +*/ +int wc_CmacFree(Cmac* cmac); + +/*! \ingroup CMAC - \brief CMAC を生æˆã™ã‚‹ãŸã‚ã®ã‚·ãƒ³ã‚°ãƒ« ショット関数 - \return æˆåŠŸã—ãŸã‚‰ 0 を返㙠- \param out çµæžœã‚’è¿”ã™ãƒã‚¤ãƒ³ã‚¿ + \brief CMACを生æˆã™ã‚‹ãŸã‚ã®ã‚·ãƒ³ã‚°ãƒ«ã‚·ãƒ§ãƒƒãƒˆé–¢æ•° + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param out çµæžœã®å‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param outSz 出力ã®ãƒã‚¤ãƒ³ã‚¿ã‚µã‚¤ã‚º (in/out) - \param in 処ç†ã™ã‚‹å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚¤ãƒ³ã‚¿ + \param in 処ç†ã™ã‚‹å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚¤ãƒ³ã‚¿ \param inSz 入力データã®ã‚µã‚¤ã‚º - \param キー キー ãƒã‚¤ãƒ³ã‚¿ - \param keySz キー ãƒã‚¤ãƒ³ã‚¿ã®ã‚µã‚¤ã‚º (16ã€24ã€ã¾ãŸã¯ 32) + \param key éµãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param keySz éµãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º (16ã€24ã€ã¾ãŸã¯ 32) _例_ \code @@ -122,14 +170,14 @@ /*! \ingroup CMAC - \brief CMAC を検証ã™ã‚‹ãŸã‚ã®ã‚·ãƒ³ã‚°ãƒ« ショット機能 - \return æˆåŠŸã—ãŸã‚‰ 0 を返㙠- \param çµæžœã‚’è¿”ã™ãƒã‚§ãƒƒã‚¯ ãƒã‚¤ãƒ³ã‚¿ - \param checkSz ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆ ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \brief CMACを検証ã™ã‚‹ãŸã‚ã®ã‚·ãƒ³ã‚°ãƒ«ã‚·ãƒ§ãƒƒãƒˆé–¢æ•° + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param check 検証対象ã¨ãªã‚‹CMAC処ç†çµæžœãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param checkSz CMAC処ç†çµæžœãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º \param in 処ç†ã™ã‚‹å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚¤ãƒ³ã‚¿ \param inSz 入力データã®ã‚µã‚¤ã‚º - \param キー キー ãƒã‚¤ãƒ³ã‚¿ - \param keySz キー ãƒã‚¤ãƒ³ã‚¿ã®ã‚µã‚¤ã‚º (16ã€24ã€ã¾ãŸã¯ 32) + \param key éµãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param keySz éµãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º (16ã€24ã€ã¾ãŸã¯ 32) _例_ \code @@ -145,9 +193,10 @@ /*! \ingroup CMAC - \brief ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚·ãƒ³ã‚°ãƒ« ショットを必è¦ã¨ã—ã€æ›´æ–°ã‚’メモリã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã«ã®ã¿ã€WOLFSSL_HASH_KEEP ã§ä½¿ç”¨ã•ã‚Œã¾ã™ - \return æˆåŠŸã—ãŸã‚‰ 0 を返㙠- 処ç†ã™ã‚‹å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã® \param + \brief WOLFSSL_HASH_KEEPマクロ定義時ã®ã¿ä½¿ç”¨å¯èƒ½ã€‚ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚·ãƒ³ã‚°ãƒ«ã‚·ãƒ§ãƒƒãƒˆã‚’å¿…è¦ã¨ã—ã€æ›´æ–°ã‚’メモリã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã«ä½¿ç”¨ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸã‚‰0ã‚’è¿”ã—ã¾ã™ + \param cmac Cmac構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param in 処ç†ã™ã‚‹å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inSz 入力データã®ã‚µã‚¤ã‚º _例_ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve25519.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve25519.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve25519.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve25519.h 2024-08-03 07:30:00.000000000 +0000 @@ -60,7 +60,7 @@ /*! \ingroup Curve25519 - \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†ã®ç§˜å¯†éµã¨å—ä¿¡ã—ãŸå…¬é–‹éµã‚’考ãˆã‚‹ã¨ã€å…±æœ‰ç§˜å¯†éµã‚’計算ã—ã¾ã™ã€‚生æˆã•ã‚ŒãŸç§˜å¯†éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«ä¿å­˜ã—ã€ounlentã®ç§˜å¯†éµã®å¤‰æ•°ã‚’割り当ã¦ã¾ã™ã€‚大ããã¦ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†ã®ç§˜å¯†éµã¨å—ä¿¡ã—ãŸå…¬é–‹éµã‚’考ãˆã‚‹ã¨ã€å…±æœ‰ç§˜å¯†éµã‚’計算ã—ã¾ã™ã€‚生æˆã•ã‚ŒãŸç§˜å¯†éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«ä¿å­˜ã—ã€ounlentã®ç§˜å¯†éµã®å¤‰æ•°ã‚’割り当ã¦ã¾ã™ã€‚ビッグ・リトルエンディアンã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ \return 0 共有秘密éµã‚’正常ã«è¨ˆç®—ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG 渡ã•ã‚ŒãŸå…¥åŠ›ãƒ‘ラメータã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ECC_BAD_ARG_E 公開éµã®æœ€åˆã®ãƒ“ットãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€å®Ÿè£…ã®æŒ‡ç´‹ã‚’é¿ã‘ã‚‹ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -222,7 +222,7 @@ /*! \ingroup Curve25519 - \brief ã“ã®é–¢æ•°ã¯ã€ãƒ‘ブリック秘密éµãƒšã‚¢ã‚’Curve25519_Key構造体ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚大ããã¦ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯ã€ãƒ‘ブリック秘密éµãƒšã‚¢ã‚’Curve25519_Key構造体ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ビッグ・リトルエンディアンã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ \return 0 Curve25519_Key構造体ã¸ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ \return ECC_BAD_ARG_E 戻ã•ã‚ŒãŸIFã¾ãŸã¯å…¥åŠ›ã‚­ãƒ¼ã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒãƒ‘ブリックキーサイズã¾ãŸã¯ç§˜å¯†éµã‚µã‚¤ã‚ºã¨ä¸€è‡´ã—ãªã„å ´åˆ @@ -292,7 +292,7 @@ /*! \ingroup Curve25519 - \brief ã“ã®é–¢æ•°ã¯Curve25519_Key構造体ã‹ã‚‰ç§˜å¯†éµã‚’エクスãƒãƒ¼ãƒˆã—ã€ãれを指定ã•ã‚ŒãŸã‚¢ã‚¦ãƒˆãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚ã¾ãŸã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚­ãƒ¼ã®ã‚µã‚¤ã‚ºã«ãªã‚‹ã‚ˆã†ã«æ¦‚è¦ã‚’設定ã—ã¾ã™ã€‚ãã‚ŒãŒå¤§ãã„ã‹ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã‹ã‚’指定ã§ãã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯Curve25519_Key構造体ã‹ã‚‰ç§˜å¯†éµã‚’エクスãƒãƒ¼ãƒˆã—ã€ãれを指定ã•ã‚ŒãŸã‚¢ã‚¦ãƒˆãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚ã¾ãŸã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚ŒãŸã‚­ãƒ¼ã®ã‚µã‚¤ã‚ºã«ãªã‚‹ã‚ˆã†ã«æ¦‚è¦ã‚’設定ã—ã¾ã™ã€‚ãã‚ŒãŒãƒ“ッグ・リトルエンディアンã‹ã‚’指定ã§ãã¾ã™ã€‚ \return 0 Curve25519_Key構造体ã‹ã‚‰ç§˜å¯†éµã‚’正常ã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG 入力パラメータãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ECC_BAD_ARG_E WC_CURVE25519_SIZE()ãŒã‚­ãƒ¼ã¨ç­‰ã—ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -394,7 +394,7 @@ /*! \ingroup Curve25519 - \brief ã“ã®é–¢æ•°ã¯ã€å…¬é–‹éµãƒãƒƒãƒ•ã‚¡ãŒã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³æ³¨æ–‡ã‚’与ãˆã‚‰ã‚ŒãŸæœ‰åŠ¹ãªCurve2519キー値をä¿æŒã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯ã€å…¬é–‹éµãƒãƒƒãƒ•ã‚¡ãŒæŒ‡å®šã•ã‚ŒãŸã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã«å¯¾ã—ã¦æœ‰åŠ¹ãªCurve2519キー値をä¿æŒã—ã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¾ã™ã€‚ \return 0 公開éµã®å€¤ãŒæœ‰åŠ¹ãªã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ECC_BAD_ARG_E 公開éµã®å€¤ãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -450,7 +450,7 @@ /*! \ingroup Curve25519 - \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã‹ã‚‰å…¬é–‹éµã‚’エクスãƒãƒ¼ãƒˆã—ã€çµæžœã‚’アウトãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚大ããã¦ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã‹ã‚‰å…¬é–‹éµã‚’エクスãƒãƒ¼ãƒˆã—ã€çµæžœã‚’アウトãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚ビッグ・リトルエンディアンã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ \return 0 Curve25519_Key構造体ã‹ã‚‰å…¬é–‹éµã‚’正常ã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã™ã‚‹ä¸Šã§è¿”ã•ã‚Œã¾ã™ã€‚ \return ECC_BAD_ARG_E outlenãŒcurve25519_pub_key_sizeよりå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -517,7 +517,7 @@ /*! \ingroup Curve25519 - \brief Export Curve25519キーペア。大ãã„ã¾ãŸã¯ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€‚ + \brief Export Curve25519キーペア。ビッグ・リトルエンディアン。 \return 0 Curve25519_Key構造体ã‹ã‚‰ã‚­ãƒ¼ãƒšã‚¢ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG 入力パラメータãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ECC_BAD_ARG_E PRIVSZãŒCURUV25519_SEY_SIZEã¾ãŸã¯PUBSZよりもå°ã•ã„å ´åˆã¯ã€PUBSZãŒCURUG25519_PUB_KEY_SIZEよりもå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve448.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve448.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve448.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/curve448.h 2024-08-03 07:30:00.000000000 +0000 @@ -59,7 +59,7 @@ /*! \ingroup Curve448 - \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†ã®ç§˜å¯†éµã¨å—ä¿¡ã—ãŸå…¬é–‹éµã‚’考ãˆã‚‹ã¨ã€å…±æœ‰ç§˜å¯†éµã‚’計算ã—ã¾ã™ã€‚生æˆã•ã‚ŒãŸç§˜å¯†éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«ä¿å­˜ã—ã€ounlentã®ç§˜å¯†éµã®å¤‰æ•°ã‚’割り当ã¦ã¾ã™ã€‚大ããã¦ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†ã®ç§˜å¯†éµã¨å—ä¿¡ã—ãŸå…¬é–‹éµã‚’考ãˆã‚‹ã¨ã€å…±æœ‰ç§˜å¯†éµã‚’計算ã—ã¾ã™ã€‚生æˆã•ã‚ŒãŸç§˜å¯†éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«ä¿å­˜ã—ã€ounlentã®ç§˜å¯†éµã®å¤‰æ•°ã‚’割り当ã¦ã¾ã™ã€‚ビッグ・リトルエンディアンã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ \return 0 共有秘密éµã‚’正常ã«è¨ˆç®—ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG 渡ã•ã‚ŒãŸå…¥åŠ›ãƒ‘ラメータã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param [in] Private_Key Curve448_Key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ç§˜å¯†éµã§åˆæœŸåŒ–ã•ã‚Œã¾ã—ãŸã€‚ @@ -152,7 +152,7 @@ /*! \ingroup Curve448 - \brief CURVE448秘密éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã®ã¿ã€‚(大ããªã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ï¼‰ã€‚ + \brief CURVE448秘密éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã®ã¿ã€‚(ビッグエンディアン)。 \return 0 秘密éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG キーã¾ãŸã¯PRIVãŒNULLã®å ´åˆã¯è¿”ã—ã¾ã™ã€‚ \return ECC_BAD_ARG_E PRIVSZãŒCURUG448_KEY_SIZEã¨ç­‰ã—ããªã„å ´åˆã¯è¿”ã—ã¾ã™ã€‚ @@ -220,7 +220,7 @@ /*! \ingroup Curve448 - \brief ã“ã®é–¢æ•°ã¯ã€public-秘密éµã®ãƒšã‚¢ã‚’Curve448_Key構造体ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚大ããã¦ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯ã€public-秘密éµã®ãƒšã‚¢ã‚’Curve448_Key構造体ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ビッグ・リトルエンディアンã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ \return 0 Curve448_Key構造体ã¸ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ \return ECC_BAD_ARG_E 入力キーã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒPublicキーサイズã¾ãŸã¯ç§˜å¯†éµã‚µã‚¤ã‚ºã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -450,7 +450,7 @@ /*! \ingroup Curve448 - \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã‹ã‚‰å…¬é–‹éµã‚’エクスãƒãƒ¼ãƒˆã—ã€çµæžœã‚’アウトãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚大ããã¦ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã‹ã‚‰å…¬é–‹éµã‚’エクスãƒãƒ¼ãƒˆã—ã€çµæžœã‚’アウトãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚ビッグ・リトルエンディアンã®ä¸¡æ–¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ \return 0 Curve448_Key構造体ã‹ã‚‰å…¬é–‹éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return ECC_BAD_ARG_E outlenãŒcurve448_pub_key_sizeよりå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -517,8 +517,8 @@ /*! \ingroup Curve448 - \brief Curve448キーペアをエクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚大ãã„ã¾ãŸã¯ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€‚ - \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã‹ã‚‰ã‚­ãƒ¼ãƒšã‚¢ã‚’エクスãƒãƒ¼ãƒˆã—ã€çµæžœã‚’アウトãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚大ãã„ã¾ãŸã¯ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€‚ + \brief Curve448キーペアをエクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ビッグã€ã¾ãŸã¯ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€‚ + \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã‹ã‚‰ã‚­ãƒ¼ãƒšã‚¢ã‚’エクスãƒãƒ¼ãƒˆã—ã€çµæžœã‚’アウトãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚ビッグã€ã¾ãŸã¯ãƒªãƒˆãƒ«ã‚¨ãƒ³ãƒ‡ã‚£ã‚¢ãƒ³ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG 入力パラメータãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ECC_BAD_ARG_E PRIVSZãŒCURUV448_KEY_SIZEã¾ãŸã¯PUBSZよりもå°ã•ã„å ´åˆã¯ã€Curge448_PUB_KEY_SIZEよりもå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_groups.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_groups.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_groups.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_groups.h 2024-08-03 07:30:00.000000000 +0000 @@ -6,6 +6,7 @@ \defgroup Camellia Algorithms - Camellia \defgroup ChaCha Algorithms - ChaCha \defgroup ChaCha20Poly1305 Algorithms - ChaCha20_Poly1305 +  \defgroup CMAC Algorithm - CMAC \defgroup Crypto Callbacks - CryptoCb \defgroup Curve25519 Algorithms - Curve25519 \defgroup Curve448 Algorithms - Curve448 @@ -220,7 +221,7 @@ key operations and reducing the attack surface by restricting access to certificate and keys to the SIM. - IoT-Safe support can be enabled on an existing WOLFSSL_CTX contex, using wolfSSL_CTX_iotsafe_enable().\n + IoT-Safe support can be enabled on an existing WOLFSSL_CTX context, using wolfSSL_CTX_iotsafe_enable().\n Session created within the context can set the parameters for IoT-Safe key and files usage, and enable the public keys callback, with wolfSSL_iotsafe_on(). diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_pages.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_pages.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_pages.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/doxygen_pages.h 2024-08-03 07:30:00.000000000 +0000 @@ -34,6 +34,7 @@
  • \ref Camellia
  • \ref ChaCha
  • \ref ChaCha20Poly1305
  • +
  • \ref CMAC
  • \ref Crypto Callbacks
  • \ref Curve25519
  • \ref Curve448
  • diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ecc.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ecc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ecc.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ecc.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯æ–°ã—ã„ECC_KEYを生æˆã—ã€ãれをキーã«æ ¼ç´ã—ã¾ã™ã€‚ \return 0 æˆåŠŸã«æˆ»ã‚Šã¾ã—ãŸã€‚ \return ECC_BAD_ARG_E RNGã¾ãŸã¯ã‚­ãƒ¼ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -33,7 +33,7 @@ int wc_ecc_make_key(WC_RNG* rng, int keysize, ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯æ–°ã—ã„ECC_KEYを生æˆã—ã€ãれをキーã«æ ¼ç´ã—ã¾ã™ã€‚ \return 0 æˆåŠŸã«æˆ»ã‚Šã¾ã—ãŸã€‚ \return ECC_BAD_ARG_E RNGã¾ãŸã¯ã‚­ãƒ¼ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -75,7 +75,7 @@ int wc_ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key, int curve_id); /*! - \ingroup ECC + \ingroup ECC \brief ECCキーã®æœ‰åŠ¹æ€§ã‚’有効ã«ã—ã¾ã™ã€‚ \return MP_OKAY æˆåŠŸã€ã‚­ãƒ¼ã¯å¤§ä¸ˆå¤«ã§ã™ã€‚ \return BAD_FUNC_ARG キーãŒNULLã®å ´åˆã¯è¿”ã—ã¾ã™ã€‚ @@ -105,7 +105,7 @@ int wc_ecc_check_key(ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ä½¿ç”¨ã•ã‚ŒãŸå¾Œã«ECC_KEYキーを解放ã—ã¾ã™ã€‚ _Example_ \code @@ -120,7 +120,7 @@ void wc_ecc_key_free(ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ç§˜å¯†éµã¨å—ä¿¡ã—ãŸå…¬é–‹éµã‚’使用ã—ã¦æ–°ã—ã„秘密éµã‚’生æˆã—ã¾ã™ã€‚ã“ã®å…±æœ‰ç§˜å¯†éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«æ ¼ç´ã—ã€å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã‚’ä¿æŒã™ã‚‹ãŸã‚ã«outlentenã‚’æ›´æ–°ã—ã¾ã™ã€‚ \return 0 共有秘密éµã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -167,7 +167,7 @@ word32* outlen); /*! - \ingroup ECC + \ingroup ECC \brief 秘密éµã¨ãƒ‘ブリックãƒã‚¤ãƒ³ãƒˆã®é–“ã«ECC共有秘密を作æˆã—ã¾ã™ã€‚ \return MP_OKAY æˆåŠŸã‚’示ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG 引数ãŒNULLã®ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ @@ -204,7 +204,7 @@ byte* out, word32 *outlen); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ä¿¡é ¼æ€§ã‚’ä¿è¨¼ã™ã‚‹ãŸã‚ã«ECC_KEYオブジェクトを使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã«ç½²åã—ã¾ã™ã€‚ \return 0 メッセージダイジェストã®ç½²åを正常ã«ç”Ÿæˆã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã—㟠\return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¦ç”Ÿæˆã•ã‚ŒãŸç½²åã‚’ä¿å­˜ã™ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ @@ -249,7 +249,7 @@ WC_RNG* rng, ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief メッセージダイジェストã«ç½²åã—ã¾ã™ã€‚ \return MP_OKAY メッセージダイジェストã®ç½²åを正常ã«ç”Ÿæˆã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã—㟠\return ECC_BAD_ARG_E 入力キーãŒç§˜å¯†éµã§ã¯ãªã„å ´åˆã€ã¾ãŸã¯ECC IDXãŒç„¡åŠ¹ãªå ´åˆã€ã¾ãŸã¯ã„ãšã‚Œã‹ã®å…¥åŠ›ãƒ‘ラメータãŒNULLã«è©•ä¾¡ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã¾ãŸã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¦ç”Ÿæˆã•ã‚ŒãŸç½²åã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã‚‹å ´åˆ @@ -299,7 +299,7 @@ ecc_key* key, mp_int *r, mp_int *s); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€çœŸæ­£æ€§ã‚’確ä¿ã™ã‚‹ãŸã‚ã«ãƒãƒƒã‚·ãƒ¥ã®ECCã‚·ã‚°ãƒãƒãƒ£ã‚’検証ã—ã¾ã™ã€‚ç­”ãˆã‚’介ã—ã¦ã€æœ‰åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹1ã€ç„¡åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹0ã§ç­”ãˆã‚’è¿”ã—ã¾ã™ã€‚ \return 0 ç½²å検証ã«æ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚注:ã“ã‚Œã¯ç½²åãŒæ¤œè¨¼ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã™ã‚‹ã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。信頼性情報ã¯ä»£ã‚ã‚Šã«STATã§æ ¼ç´ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG è¿”ã•ã‚ŒãŸå…¥åŠ›ãƒ‘ラメータã¯NULLã«è©•ä¾¡ã•ã‚Œã¾ã™ @@ -344,7 +344,7 @@ word32 hashlen, int* stat, ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ECCç½²åを確èªã—ã¦ãã ã•ã„。çµæžœã¯statã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚1ãŒæœ‰åŠ¹ã§ã€0ãŒç„¡åŠ¹ã§ã™ã€‚注:有効ãªãƒ†ã‚¹ãƒˆã«æˆ»ã‚Šå€¤ã‚’使用ã—ãªã„ã§ãã ã•ã„。statã®ã¿ã‚’使用ã—ã¦ãã ã•ã„。 \return MP_OKAY æˆåŠŸã—ãŸå ´åˆï¼ˆç½²åãŒç„¡åŠ¹ã§ã‚ã£ã¦ã‚‚) \return ECC_BAD_ARG_E 引数ãŒNULLã®å ´åˆã€ã¾ãŸã¯key-idxãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã—ã¾ã™ã€‚ @@ -374,7 +374,7 @@ word32 hashlen, int* stat, ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æ¤œè¨¼ã¾ãŸã¯éµäº¤æ¸‰ã§å°†æ¥ã®ä½¿ç”¨ã®ãŸã‚ã«ECC_KEYオブジェクトをåˆæœŸåŒ–ã—ã¾ã™ã€‚ \return 0 ECC_Keyオブジェクトã®åˆæœŸåŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -390,7 +390,7 @@ int wc_ecc_init(ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æ¤œè¨¼ã¾ãŸã¯éµäº¤æ¸‰ã§å°†æ¥ã®ä½¿ç”¨ã®ãŸã‚ã«ECC_KEYオブジェクトをåˆæœŸåŒ–ã—ã¾ã™ã€‚ \return 0 ECC_Keyオブジェクトã®åˆæœŸåŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -409,7 +409,7 @@ int wc_ecc_init_ex(ecc_key* key, void* heap, int devId); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ãƒ’ープを使用ã—ã€ã‚­ãƒ¼æ§‹é€ ã®ã‚¹ãƒšãƒ¼ã‚¹ã‚’割り当ã¦ã¾ã™ã€‚ \return 0 ECC_Keyオブジェクトã®åˆæœŸåŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ _Example_ @@ -424,7 +424,7 @@ ecc_key* wc_ecc_key_new(void* heap); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ä½¿ç”¨å¾Œã«ECC_KEYオブジェクトを解放ã—ã¾ã™ã€‚ \return int integerãŒWolfSSLエラーã¾ãŸã¯æˆåŠŸçŠ¶æ³ã‚’示ã™ã“ã¨ã‚’è¿”ã—ã¾ã—ãŸã€‚ _Example_ @@ -439,7 +439,7 @@ int wc_ecc_free(ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯å›ºå®šå°æ•°ç‚¹ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’解放ã—ã¾ã™ã€‚ã“ã‚Œã¯ECCã§ä½¿ç”¨ã§ãã€è¨ˆç®—時間を高速化ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã«ã¯ã€FP_ECC(固定å°æ•°ç‚¹ECC)を定義ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ _Example_ @@ -456,7 +456,7 @@ void wc_ecc_fp_free(void); /*! - \ingroup ECC + \ingroup ECC \brief ECC IDXãŒæœ‰åŠ¹ã‹ã©ã†ã‹ã‚’確èªã—ã¾ã™ã€‚ \return 1 有効ãªå ´åˆã¯è¿”å“ã—ã¦ãã ã•ã„。 \return 0 無効ãªå ´åˆã¯è¿”ã—ã¾ã™ã€‚ @@ -484,7 +484,7 @@ int wc_ecc_is_valid_idx(int n); /*! - \ingroup ECC + \ingroup ECC \brief æ–°ã—ã„ECCãƒã‚¤ãƒ³ãƒˆã‚’割り当ã¦ã¾ã™ã€‚ \return p æ–°ã—ã割り当ã¦ã‚‰ã‚ŒãŸãƒã‚¤ãƒ³ãƒˆã€‚ \return NULL エラー時ã«NULLã‚’è¿”ã—ã¾ã™ã€‚ @@ -506,7 +506,7 @@ ecc_point* wc_ecc_new_point(void); /*! - \ingroup ECC + \ingroup ECC \brief メモリã‹ã‚‰ECCãƒã‚¤ãƒ³ãƒˆã‚’解放ã—ã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ _Example_ @@ -528,7 +528,7 @@ void wc_ecc_del_point(ecc_point* p); /*! - \ingroup ECC + \ingroup ECC \brief ã‚ã‚‹ãƒã‚¤ãƒ³ãƒˆã®å€¤ã‚’別ã®ãƒã‚¤ãƒ³ãƒˆã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ \return ECC_BAD_ARG_E Pã¾ãŸã¯RãŒNULLã®ã¨ãã«ã‚¹ãƒ­ãƒ¼ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã€‚ \return MP_OKAY ãƒã‚¤ãƒ³ãƒˆãŒæ­£å¸¸ã«ã‚³ãƒ”ーã•ã‚Œã¾ã—㟠@@ -555,7 +555,7 @@ int wc_ecc_copy_point(ecc_point* p, ecc_point *r); /*! - \ingroup ECC + \ingroup ECC \brief ãƒã‚¤ãƒ³ãƒˆã®å€¤ã‚’別ã®ã‚‚ã®ã¨æ¯”較ã—ã¦ãã ã•ã„。 \return BAD_FUNC_ARG 1ã¤ã¾ãŸã¯ä¸¡æ–¹ã®å¼•æ•°ã¯nullã§ã™ã€‚ \return MP_EQ ãƒã‚¤ãƒ³ãƒˆã¯åŒã˜ã§ã™ã€‚ @@ -591,7 +591,7 @@ int wc_ecc_cmp_point(ecc_point* a, ecc_point *b); /*! - \ingroup ECC + \ingroup ECC \brief ãƒã‚¤ãƒ³ãƒˆãŒç„¡é™å¤§ã«ã‚ã‚‹ã‹ã©ã†ã‹ã‚’確èªã—ã¾ã™ã€‚è¿”å“1ãŒç„¡é™å¤§ã§ã‚ã‚‹å ´åˆã¯0ã€ãã†ã§ãªã„å ´åˆã¯0ã€<0エラー時ã®0 \return 1 Pã¯ç„¡é™å¤§ã§ã™ã€‚ \return 0 Pã¯ç„¡é™å¤§ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 @@ -625,7 +625,7 @@ int wc_ecc_point_is_at_infinity(ecc_point *p); /*! - \ingroup ECC + \ingroup ECC \brief ECC固定点乗算を実行ã—ã¾ã™ã€‚ \return MP_OKAY æˆåŠŸã—ãŸæ“作ã§è¿”ã—ã¾ã™ã€‚ \return MP_INIT_E 複数ã®Precision Integer(MP_INT)ライブラリã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®æ•´æ•°ã‚’åˆæœŸåŒ–ã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -652,7 +652,7 @@ mp_int* a, mp_int* modulus, int map); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ECCキーをECC_KEY構造体ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã€çµæžœã‚’OUTã«æ ¼ç´ã—ã¾ã™ã€‚キーã¯ANSI X9.63フォーマットã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚outlenã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’æ ¼ç´ã—ã¾ã™ã€‚ \return 0 ECC_KEYã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æ­£å¸¸ã«è¿”ã•ã‚Œã¾ã—㟠\return LENGTH_ONLY_E 出力ãƒãƒƒãƒ•ã‚¡ãŒNULLã«è©•ä¾¡ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ãŒã€ä»–ã®2ã¤ã®å…¥åŠ›ãƒ‘ラメータã¯æœ‰åŠ¹ã§ã™ã€‚関数ãŒã‚­ãƒ¼ã‚’ä¿å­˜ã™ã‚‹ã®ã«å¿…è¦ãªé•·ã•ã‚’è¿”ã™ã ã‘ã§ã‚ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ @@ -692,7 +692,7 @@ int wc_ecc_export_x963(ecc_key* key, byte* out, word32* outLen); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ECCキーをECC_KEY構造体ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã€çµæžœã‚’OUTã«æ ¼ç´ã—ã¾ã™ã€‚キーã¯ANSI X9.63フォーマットã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚outlenã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’æ ¼ç´ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€åœ§ç¸®ã•ã‚ŒãŸãƒ‘ラメータを介ã—ã¦è¨¼æ˜Žæ›¸ã‚’圧縮ã™ã‚‹è¿½åŠ ã®ã‚ªãƒ—ションを使用ã™ã‚‹ã€‚ã“ã®ãƒ‘ラメータãŒtrueã®å ´åˆã€ã‚­ãƒ¼ã¯ANSI X9.63圧縮形å¼ã§ä¿å­˜ã•ã‚Œã¾ã™ã€‚ \return 0 ECC_KEYã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æ­£å¸¸ã«è¿”ã•ã‚Œã¾ã—㟠\return NOT_COMPILED_IN hand_comp_keyãŒã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ãŒã€ã‚­ãƒ¼ã¯åœ§ç¸®å½¢å¼ã§è¦æ±‚ã•ã‚Œã¾ã—㟠@@ -733,7 +733,7 @@ int wc_ecc_export_x963_ex(ecc_key* key, byte* out, word32* outLen, int compressed); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ANSI X9.63å½¢å¼ã§ä¿å­˜ã•ã‚Œã¦ã„るキーをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ãƒ‘ブリックECCキーをインãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€åœ§ç¸®ã‚­ãƒ¼ãŒhand_comp_keyオプションを介ã—ã¦ã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹é™ã‚Šã€åœ§ç¸®ã‚­ãƒ¼ã¨éžåœ§ç¸®ã‚­ãƒ¼ã®ä¸¡æ–¹ã‚’処ç†ã—ã¾ã™ã€‚ \return 0 ECC_KEYã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—㟠\return NOT_COMPILED_IN hand_comp_keyãŒã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ãŒã€ã‚­ãƒ¼ã¯åœ§ç¸®å½¢å¼ã§ä¿å­˜ã•ã‚Œã¾ã™ã€‚ @@ -774,7 +774,7 @@ int wc_ecc_import_x963(const byte* in, word32 inLen, ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ç”Ÿã®ç§˜å¯†éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¨ã€ANSI X9.63フォーマットã•ã‚ŒãŸå…¬é–‹éµã‚’å«ã‚€2番目ã®ãƒãƒƒãƒ•ã‚¡ãƒ¼ã‹ã‚‰ãƒ‘ブリック/プライベートECCキーã®ãƒšã‚¢ã‚’インãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€åœ§ç¸®ã‚­ãƒ¼ãŒhand_comp_keyオプションを介ã—ã¦ã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹é™ã‚Šã€åœ§ç¸®ã‚­ãƒ¼ã¨éžåœ§ç¸®ã‚­ãƒ¼ã®ä¸¡æ–¹ã‚’処ç†ã—ã¾ã™ã€‚ \return 0 habe_comp_keyãŒã‚³ãƒ³ãƒ‘イル時ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ãªã„å ´åˆã¯ã€ecc_key not_compiled_inを正常ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã—ãŸãŒã€ã‚­ãƒ¼ã¯åœ§ç¸®å½¢å¼ã§ä¿å­˜ã•ã‚Œã¾ã™ã€‚ \return ECC_BAD_ARG_E INã¾ãŸã¯KEYãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯InlenãŒå¶æ•°ã®å ´åˆï¼ˆX9.63è¦æ ¼ã«ã‚ˆã‚Œã°ã€ã‚­ãƒ¼ã¯å¥‡æ•°ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“)。 @@ -818,7 +818,7 @@ word32 pubSz, ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ECCã‚·ã‚°ãƒãƒãƒ£ã®R部分ã¨S部分をDER符å·åŒ–ECDSAã‚·ã‚°ãƒãƒãƒ£ã«å¤‰æ›ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€outlenã§ã¯ã€å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸé•·ã•ã‚‚記憶ã•ã‚Œã¦ã„ã¾ã™ã€‚ \return 0 ç½²åã®å¤‰æ›ã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã—㟠\return ECC_BAD_ARG_E ã„ãšã‚Œã‹ã®å…¥åŠ›ãƒ‘ラメータãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãŒDERエンコードã•ã‚ŒãŸECDSAã‚·ã‚°ãƒãƒãƒ£ã‚’ä¿æŒã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -859,7 +859,7 @@ int wc_ecc_rs_to_sig(const char* r, const char* s, byte* out, word32* outlen); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ECCç½²åã®RAWæˆåˆ†ã‚’æŒã¤ECC_KEY構造体を埋ã‚ã¾ã™ã€‚ \return 0 ECC_Key構造体ã«æ­£å¸¸ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ \return ECC_BAD_ARG_E ã„ãšã‚Œã‹ã®å…¥åŠ›å€¤ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -901,7 +901,7 @@ const char* d, const char* curveName); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ECC_KEY構造体ã‹ã‚‰ç§˜å¯†éµã®ã¿ã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚秘密éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«æ ¼ç´ã—ã€outlenã«ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ \return 0 秘密éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ \return ECC_BAD_ARG_E ã„ãšã‚Œã‹ã®å…¥åŠ›å€¤ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -939,7 +939,7 @@ int wc_ecc_export_private_only(ecc_key* key, byte* out, word32* outLen); /*! - \ingroup ECC + \ingroup ECC \brief DERã¸ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒã‚¤ãƒ³ãƒˆã€‚ \return 0 æˆåŠŸã«æˆ»ã‚Šã¾ã—ãŸã€‚ \return ECC_BAD_ARG_E curve_idxãŒ0未満ã¾ãŸã¯ç„¡åŠ¹ã§ã‚ã‚‹å ´åˆã¯è¿”ã—ã¾ã™ã€‚ã„ã¤æ¥ã‚‹ã®ã‹ @@ -964,7 +964,7 @@ byte* out, word32* outLen); /*! - \ingroup ECC + \ingroup ECC \brief Derフォーマットã‹ã‚‰ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆãƒã‚¤ãƒ³ãƒˆã€‚ \return ECC_BAD_ARG_E 引数ãŒnullã®å ´åˆã€ã¾ãŸã¯InlenãŒå¶æ•°ã®å ´åˆã¯è¿”ã—ã¾ã™ã€‚ \return MEMORY_E エラーåˆæœŸåŒ–ãŒã‚ã‚‹å ´åˆã«è¿”ã—ã¾ã™ @@ -988,7 +988,7 @@ ecc_point* point); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ecc_key構造体ã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºã‚’オクテットã§è¿”ã—ã¾ã™ã€‚ \return Given 有効ãªã‚­ãƒ¼ã€ã‚ªã‚¯ãƒ†ãƒƒãƒˆã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ \return 0 与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -1008,7 +1008,7 @@ int wc_ecc_size(ecc_key* key); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€æ¬¡ã®ã‚ˆã†ã«ã—ã¦æŒ‡å®šã•ã‚ŒãŸECCã‚·ã‚°ãƒãƒãƒ£ã®æœ€æ‚ªã®å ´åˆã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚(KEYSZ * 2)+ SIG_HEADER_SZ + ECC_MAX_PAD_SZ。実際ã®ã‚·ã‚°ãƒãƒãƒ£ã‚µã‚¤ã‚ºã¯ã€WC_ECC_SIGN_HASHã§è¨ˆç®—ã§ãã¾ã™ã€‚ \return returns 最大署åサイズ(オクテット) _Example_ @@ -1026,7 +1026,7 @@ /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€æ¬¡ã®ã‚ˆã†ã«ã—ã¦æŒ‡å®šã•ã‚ŒãŸECCã‚·ã‚°ãƒãƒãƒ£ã®æœ€æ‚ªã®å ´åˆã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚(KEYSZ * 2)+ SIG_HEADER_SZ + ECC_MAX_PAD_SZ。実際ã®ã‚·ã‚°ãƒãƒãƒ£ã‚µã‚¤ã‚ºã¯ã€WC_ECC_SIGN_HASHã§è¨ˆç®—ã§ãã¾ã™ã€‚ \return Success 有効ãªã‚­ãƒ¼ã‚’考ãˆã‚‹ã¨ã€æœ€å¤§ç½²åサイズをオクテットã§è¿”ã—ã¾ã™ã€‚ \return 0 与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -1049,7 +1049,7 @@ /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®æ©Ÿèƒ½ã¯ã€ECCã¨ã®å®‰å…¨ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸äº¤æ›ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€æ–°ã—ã„ECCコンテキストオブジェクトã®ã‚¹ãƒšãƒ¼ã‚¹ã‚’割り当ã¦ã€åˆæœŸåŒ–ã—ã¾ã™ã€‚ \return Success æ–°ã—ã„ECENCCTXオブジェクトã®ç”Ÿæˆã«æˆåŠŸã—ãŸå ´åˆã¯ã€ãã®ã‚ªãƒ–ジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ \return NULL 関数ãŒæ–°ã—ã„ECENCCTXオブジェクトを生æˆã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -1072,7 +1072,7 @@ ecEncCtx* wc_ecc_ctx_new(int flags, WC_RNG* rng); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æš—å·åŒ–ã¨å¾©å·åŒ–ã«ä½¿ç”¨ã•ã‚Œã‚‹ECENCCTXオブジェクトを解放ã—ã¾ã™ã€‚ \return none 戻り値。 _Example_ @@ -1091,11 +1091,11 @@ void wc_ecc_ctx_free(ecEncCtx*); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ECENCCTX構造をリセットã—ã¦ã€æ–°ã—ã„コンテキストオブジェクトを解放ã—ã€æ–°ã—ã„コンテキストオブジェクトを割り当ã¦ã¾ã™ã€‚ \return 0 ecencctx構造ãŒæ­£å¸¸ã«ãƒªã‚»ãƒƒãƒˆã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG RNGã¾ãŸã¯CTXãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ - \return RNG_FAILURE_E ECCオブジェクトã«æ–°ã—ã„塩を生æˆã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ + \return RNG_FAILURE_E ECCオブジェクトã«æ–°ã—ã„ソルトを生æˆã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ \param ctx リセットã™ã‚‹ECENCCTXオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code @@ -1114,7 +1114,7 @@ int wc_ecc_ctx_reset(ecEncCtx* ctx, WC_RNG* rng); /* reset for use again w/o alloc/free */ /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€wc_ecc_ctx_newã®å¾Œã«ã‚ªãƒ—ションã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚æš—å·åŒ–ã€KDFã€ãŠã‚ˆã³MACアルゴリズムをECENCENCCTXオブジェクトã«è¨­å®šã—ã¾ã™ã€‚ \return 0 ECENCCTXオブジェクトã®æƒ…報を正常ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 指定ã•ã‚ŒãŸecencctxオブジェクトãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -1136,9 +1136,9 @@ byte macAlgo); /*! - \ingroup ECC - \brief ã“ã®é–¢æ•°ã¯ECENCENCCTXオブジェクトã®å¡©ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ECENCCTXã®çŠ¶æ…‹ãŒECSRV_INITã¾ãŸã¯ECCLI_INITã®å ´åˆã«ã®ã¿å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - \return Success æˆåŠŸã™ã‚‹ã¨ã€ECENCENTXå¡©ã‚’è¿”ã—ã¾ã™ + \ingroup ECC + \brief ã“ã®é–¢æ•°ã¯ECENCENCCTXオブジェクトã®ã‚½ãƒ«ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ECENCCTXã®çŠ¶æ…‹ãŒECSRV_INITã¾ãŸã¯ECCLI_INITã®å ´åˆã«ã®ã¿å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \return æˆåŠŸã™ã‚‹ã¨ ã€ecEncCtx ソルトを返ã—ã¾ã™ \return NULL ecencctxオブジェクトãŒNULLã®å ´åˆã€ã¾ãŸã¯ECENCCTXã®çŠ¶æ…‹ãŒECSRV_INITã¾ãŸã¯ECCLI_INITã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚後者ã®2ã¤ã®ã‚±ãƒ¼ã‚¹ã§ã¯ã€ã“ã®æ©Ÿèƒ½ã¯ãã‚Œãžã‚ŒECSRV_BAD_STATEã¾ãŸã¯ECCLI_BAD_STATEã«ECENCCTXã®çŠ¶æ…‹ã‚’設定ã—ã¾ã™ã€‚ _Example_ \code @@ -1159,12 +1159,12 @@ const byte* wc_ecc_ctx_get_own_salt(ecEncCtx*); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€ECENCENCCTXオブジェクトã®ãƒ”アソルトを設定ã—ã¾ã™ã€‚ \return 0 ECENCCTXオブジェクトã®ãƒ”アソルトã®è¨­å®šã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG 指定ã•ã‚ŒãŸecencctxオブジェクトãŒnullã¾ãŸã¯ç„¡åŠ¹ãªãƒ—ロトコルãŒã‚ã‚‹å ´åˆã€ã¾ãŸã¯æŒ‡å®šã•ã‚ŒãŸå¡©ãŒNULLã®å ´åˆ + \return BAD_FUNC_ARG 指定ã•ã‚ŒãŸecencctxオブジェクトãŒnullã¾ãŸã¯ç„¡åŠ¹ãªãƒ—ロトコルãŒã‚ã‚‹å ´åˆã€ã¾ãŸã¯æŒ‡å®šã•ã‚ŒãŸã‚½ãƒ«ãƒˆãŒNULLã®å ´åˆ \return BAD_ENC_STATE_E ecencctxã®çŠ¶æ…‹ãŒECSRV_SALT_GETã¾ãŸã¯ECCLI_SALT_GETã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚後者ã®2ã¤ã®ã‚±ãƒ¼ã‚¹ã§ã¯ã€ã“ã®æ©Ÿèƒ½ã¯ãã‚Œãžã‚ŒECSRV_BAD_STATEã¾ãŸã¯ECCLI_BAD_STATEã«ECENCCTXã®çŠ¶æ…‹ã‚’設定ã—ã¾ã™ã€‚ - \param ctx 塩を設定ã™ã‚‹ãŸã‚ã®ecencctxã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param ctx ソルトを設定ã™ã‚‹ãŸã‚ã®ecencctxã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code ecEncCtx* cliCtx, srvCtx; @@ -1186,7 +1186,7 @@ int wc_ecc_ctx_set_peer_salt(ecEncCtx* ctx, const byte* salt); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯ã€wc_ecc_ctx_set_peer_saltã®å‰å¾Œã«ã‚ªãƒ—ションã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ECENCCTXオブジェクトã®ã‚ªãƒ—ションã®æƒ…報を設定ã—ã¾ã™ã€‚ \return 0 ECENCCTXオブジェクトã®æƒ…報を正常ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸECENCCTXオブジェクトãŒNULLã®å ´åˆã€å…¥åŠ›æƒ…å ±ã¯NULLã¾ãŸã¯ã‚µã‚¤ã‚ºãŒç„¡åŠ¹ã§ã™ã€‚ @@ -1207,7 +1207,7 @@ int wc_ecc_ctx_set_info(ecEncCtx* ctx, const byte* info, int sz); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸå…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’MSGã‹ã‚‰OUTã«æš—å·åŒ–ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ãƒ‘ラメータã¨ã—ã¦ã‚ªãƒ—ションã®CTXオブジェクトをå–ã‚Šã¾ã™ã€‚æä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ECENCCTXã®Encalgoã€Kdfalgoã€ãŠã‚ˆã³Macalgoã«åŸºã¥ã„ã¦æš—å·åŒ–ãŒé€²ã¿ã¾ã™ã€‚CTXãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€å‡¦ç†ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã€ECAES_128_CBCã€ECHKDF_SHA256ã€ECHMAC_SHA256ã§å®Œäº†ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒCTXã§æŒ‡å®šã•ã‚ŒãŸæš—å·åŒ–タイプã«å¾“ã£ã¦åŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 入力メッセージã®æš—å·åŒ–ã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG PRIVKEYã€PUBKEYã€MSGã€MSGSZã€OUTã€OUTSZãŒNULLã®å ´åˆã€ã¾ãŸã¯CTXオブジェクトãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„æš—å·åŒ–タイプを指定ã—ã¾ã™ã€‚ @@ -1246,7 +1246,7 @@ word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯æŒ‡å®šã•ã‚ŒãŸå…¥åŠ›ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’MSGã‹ã‚‰OUTã«æš—å·åŒ–ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ãƒ‘ラメータã¨ã—ã¦ã‚ªãƒ—ションã®CTXオブジェクトをå–ã‚Šã¾ã™ã€‚æä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ECENCCTXã®Encalgoã€Kdfalgoã€ãŠã‚ˆã³Macalgoã«åŸºã¥ã„ã¦æš—å·åŒ–ãŒé€²ã¿ã¾ã™ã€‚CTXãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€å‡¦ç†ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã€ECAES_128_CBCã€ECHKDF_SHA256ã€ECHMAC_SHA256ã§å®Œäº†ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒCTXã§æŒ‡å®šã•ã‚ŒãŸæš—å·åŒ–タイプã«å¾“ã£ã¦åŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 入力メッセージã®æš—å·åŒ–ã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG PRIVKEYã€PUBKEYã€MSGã€MSGSZã€OUTã€OUTSZãŒNULLã®å ´åˆã€ã¾ãŸã¯CTXオブジェクトãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„æš—å·åŒ–タイプを指定ã—ã¾ã™ã€‚ @@ -1287,7 +1287,7 @@ word32 msgSz, byte* out, word32* outSz, ecEncCtx* ctx, int compressed); /*! - \ingroup ECC + \ingroup ECC \brief ã“ã®é–¢æ•°ã¯MSGã‹ã‚‰OUTã¸ã®æš—å·æ–‡ã‚’復å·åŒ–ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ãƒ‘ラメータã¨ã—ã¦ã‚ªãƒ—ションã®CTXオブジェクトをå–ã‚Šã¾ã™ã€‚æä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ECENCCTXã®Encalgoã€Kdfalgoã€ãŠã‚ˆã³Macalgoã«åŸºã¥ã„ã¦æš—å·åŒ–ãŒé€²ã¿ã¾ã™ã€‚CTXãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€å‡¦ç†ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã€ECAES_128_CBCã€ECHKDF_SHA256ã€ECHMAC_SHA256ã§å®Œäº†ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒCTXã§æŒ‡å®šã•ã‚ŒãŸæš—å·åŒ–タイプã«å¾“ã£ã¦åŸ‹ã‚è¾¼ã¾ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 入力メッセージã®å¾©å·åŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG PRIVKEYã€PUBKEYã€MSGã€MSGSZã€OUTã€OUTSZãŒNULLã®å ´åˆã€ã¾ãŸã¯CTXオブジェクトãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„æš—å·åŒ–タイプを指定ã—ã¾ã™ã€‚ @@ -1329,7 +1329,7 @@ /*! - \ingroup ECC + \ingroup ECC \brief éžãƒ–ロックæ“作ã®ãŸã‚ã®ECCサãƒãƒ¼ãƒˆã‚’有効ã«ã—ã¾ã™ã€‚次ã®ãƒ“ルドオプションを使用ã—ãŸå˜ç²¾åº¦ï¼ˆSP)数学ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™.WolfSSL_SP_SP_SMALL WOLFSSL_SP_NO_MALLOC WC_ECC_NONBLOCK \return 0 コールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’入力メッセージã«æ­£å¸¸ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \param key ECC_KEYオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ @@ -1351,7 +1351,7 @@ &key ); - // TODO: Real-time work can be called here + // TODO: Real-time work can be called here } while (ret == FP_WOULDBLOCK); } wc_ecc_free(&key); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ed25519.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ed25519.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ed25519.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ed25519.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,11 +1,17 @@ /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ç§˜å¯†éµã‹ã‚‰ED25519公開éµã‚’生æˆã—ã¾ã™ã€‚公開éµã‚’ãƒãƒƒãƒ•ã‚¡Pubkeyã«æ ¼ç´ã—ã€Pubkeyszã§ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯Ed25519秘密éµã‹ã‚‰Ed25519公開éµã‚’生æˆã—ã¾ã™ã€‚公開éµã‚’ãƒãƒƒãƒ•ã‚¡pubkeyã«å‡ºåŠ›ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã®å‘¼ã³å‡ºã—ã«å…ˆç«‹ã¡ã€ed25519_key構造体ã«ã¯Ed25519秘密éµãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \return 0 公開éµã®ä½œæˆã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG IFIキーã¾ãŸã¯PubKeyãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒ32ãƒã‚¤ãƒˆã§ã¯ãªã„å ´åˆï¼ˆED25519ã«32ãƒã‚¤ãƒˆã®ã‚­ãƒ¼ãŒã‚ã‚Šã¾ã™ï¼‰ã€‚ - \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] キーを生æˆã™ã‚‹ED25519_Keyã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [out] 公開éµã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG 引数keyã¾ãŸã¯pubKeyãŒNULLã®å ´åˆã€ã¾ãŸã¯æŒ‡å®šã•ã‚ŒãŸéµã‚µã‚¤ã‚ºãŒ32ãƒã‚¤ãƒˆã§ã¯ãªã„å ´åˆï¼ˆED25519ã«32ãƒã‚¤ãƒˆã®ã‚­ãƒ¼ãŒã‚ã‚Šã¾ã™ï¼‰ã€‚ + \return ECC_PRIV_KEY_E ed25519_key構造体ã«Ed25519秘密éµãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param [in] key Ed25519秘密éµãŒã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [out] pubKey 公開éµã‚’出力ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] pubKeySz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚常ã«ED25519_PUB_KEY_SIZE(32)ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + _Example_ \code int ret; @@ -31,13 +37,14 @@ word32 pubKeySz); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯æ–°ã—ã„ED25519キーを生æˆã—ã€ãれをキーã«æ ¼ç´ã—ã¾ã™ã€‚ - \return 0 ED25519_KEYを正常ã«è¡Œã†ã¨è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG RNGã¾ãŸã¯KEYãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯æŒ‡å®šã•ã‚ŒãŸã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒ32ãƒã‚¤ãƒˆã§ã¯ãªã„å ´åˆï¼ˆED25519ã«32ãƒã‚¤ãƒˆã®ã‚­ãƒ¼ãŒã‚ã‚Šã¾ã™ï¼‰ã€‚ - \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] RNGキーを生æˆã™ã‚‹åˆæœŸåŒ–ã•ã‚ŒãŸRNGオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] keysize keyã®é•·ã•ã‚’生æˆã—ã¾ã™ã€‚ED25519ã®å ´åˆã¯å¸¸ã«32ã«ãªã‚Šã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯æ–°ã—ã„ed25519_key構造体を生æˆã—ã€ãれを引数keyã®ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ã™ã€‚ + \return 0 ed25519_key構造体を正常ã«ç”Ÿæˆã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG RNGã¾ãŸã¯KEYãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯æŒ‡å®šã•ã‚ŒãŸkeysizeãŒ32ãƒã‚¤ãƒˆã§ã¯ãªã„å ´åˆ(Ed25519éµã«ã¯å¸¸ã«32ãƒã‚¤ãƒˆã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™)。 + \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] rng RNGキーを生æˆã™ã‚‹åˆæœŸåŒ–ã•ã‚ŒãŸRNGオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] keysize keyã®é•·ã•ã€‚ED25519ã®å ´åˆã¯å¸¸ã«32ã«ãªã‚Šã¾ã™ã€‚ + _Example_ \code int ret; @@ -58,15 +65,18 @@ int wc_ed25519_make_key(WC_RNG* rng, int keysize, ed25519_key* key); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_Keyオブジェクトを使用ã—ã¦èªè¨¼ã‚’ä¿è¨¼ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体を使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ã¾ã™ã€‚ \return 0 メッセージã®ç½²åを正常ã«ç”Ÿæˆã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¦ç”Ÿæˆã•ã‚ŒãŸç½²åã‚’ä¿å­˜ã™ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚¤ãƒ³ãƒ¬ãƒ«é•·ã€‚ - \param [out] 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ - \param [in,out] 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã®ç¯„囲内。メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’ä¿å­˜ã—ã¾ã™ã€‚ + \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param [in] in ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] inlen ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚º + \param [out] out 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \param [in,out] outlen 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã€‚メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã‚’ä¿æŒã—ã¾ã™ã€‚ + \param [in] key ç½²åを生æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ç§˜å¯†éµã‚’ä¿æŒã—ã¦ã„ã‚‹ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code ed25519_key key; @@ -95,17 +105,20 @@ word32 *outlen, ed25519_key* key); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_Keyオブジェクトを使用ã—ã¦èªè¨¼ã‚’ä¿è¨¼ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ã¾ã™ã€‚コンテキストã¯ç½²åã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ã§ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体を使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ã¾ã™ã€‚ + コンテキストã¯ç½²åã•ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ã§ã™ã€‚ \return 0 メッセージã®ç½²åを正常ã«ç”Ÿæˆã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG è¿”ã•ã‚ŒãŸå…¥åŠ›ãƒ‘ラメータã¯NULLã«è©•ä¾¡ã•ã‚Œã¾ã™ã€‚出力ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¦ç”Ÿæˆã•ã‚ŒãŸç½²åã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã¾ã™ã€‚ - \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚¤ãƒ³ãƒ¬ãƒ«é•·ã€‚ - \param [out] 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ - \param [in,out] 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã®ç¯„囲内。メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’ä¿å­˜ã—ã¾ã™ã€‚ - \param [in] ç½²åを生æˆã™ã‚‹ãƒ—ライベートED25519_KEYã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] メッセージãŒç½²åã•ã‚Œã¦ã„るコンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] in ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] inlen ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚º + \param [out] out 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \param [in,out] outlen 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã€‚メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’ä¿å­˜ã—ã¾ã™ã€‚ + \param [in] key ç½²åを生æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ç§˜å¯†éµã‚’ä¿æŒã—ã¦ã„ã‚‹ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] context メッセージãŒç½²åã•ã‚Œã¦ã„るコンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] contextLen コンテキストãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code ed25519_key key; @@ -137,17 +150,24 @@ const byte* context, byte contextLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_Keyオブジェクトを使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã«ç½²åã—ã¦ä¿¡é ¼æ€§ã‚’ä¿è¨¼ã—ã¾ã™ã€‚コンテキストã¯ç½²åã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ç½²å計算ã®å‰ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯äº‹å‰ã«ãƒãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã™ã€‚メッセージダイジェストを作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯Shake-256ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体を使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã«ç½²åã—ã¾ã™ã€‚ + コンテキストã¯ç½²åã•ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + ç½²å計算ã®å‰ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯äº‹å‰ã«ãƒãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã™ã€‚ + メッセージダイジェストを作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯Shake-256ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \return 0 メッセージダイジェストã®ç½²åを正常ã«ç”Ÿæˆã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG è¿”ã•ã‚ŒãŸå…¥åŠ›ãƒ‘ラメータã¯NULLã«è©•ä¾¡ã•ã‚Œã¾ã™ã€‚出力ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¦ç”Ÿæˆã•ã‚ŒãŸç½²åã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã¾ã™ã€‚ - \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] サインã¸ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒãƒƒã‚·ãƒ¥ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒãƒƒã‚·ãƒ¥ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] サインã¸ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒãƒƒã‚·ãƒ¥ã®ãƒãƒƒã‚·ãƒ¥ã®é•·ã•ã€‚ - \param [out] 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ - \param [in,out] 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã®ç¯„囲内。メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’ä¿å­˜ã—ã¾ã™ã€‚ - \param [in] ç½²åを生æˆã™ã‚‹ãƒ—ライベートED25519_KEYã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] メッセージãŒç½²åã•ã‚Œã¦ã„るコンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param [in] hash ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒãƒƒã‚·ãƒ¥ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] hashLen ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒãƒƒã‚·ãƒ¥ã®ã‚µã‚¤ã‚º + \param [out] out 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \param [in,out] outlen 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã€‚メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’ä¿å­˜ã—ã¾ã™ã€‚ + \param [in] key ç½²åを生æˆã™ã‚‹ã®ã«ä½¿ç”¨ã™ã‚‹ç§˜å¯†éµã‚’å«ã‚“ã ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] context メッセージãŒç½²åã•ã‚Œã¦ã„るコンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] contextLen コンテキストãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code ed25519_key key; @@ -179,17 +199,19 @@ const byte* context, byte contextLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_Keyオブジェクトを使用ã—ã¦èªè¨¼ã‚’ä¿è¨¼ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ã¾ã™ã€‚コンテキストã¯ç½²åã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ç½²å計算ã®å‰ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯äº‹å‰ã«ãƒãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体を使用ã—ã¦èªè¨¼ã‚’ä¿è¨¼ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ã¾ã™ã€‚コンテキストã¯ç½²åã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ç½²å計算ã®å‰ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯äº‹å‰ã«ãƒãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã™ã€‚ \return 0 メッセージã®ç½²åを正常ã«ç”Ÿæˆã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG è¿”ã•ã‚ŒãŸå…¥åŠ›ãƒ‘ラメータã¯NULLã«è©•ä¾¡ã•ã‚Œã¾ã™ã€‚出力ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¦ç”Ÿæˆã•ã‚ŒãŸç½²åã‚’ä¿å­˜ã™ã‚‹ã«ã¯å°ã•ã™ãŽã¾ã™ã€‚ - \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚¤ãƒ³ãƒ¬ãƒ«é•·ã€‚ - \param [out] 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ - \param [in,out] 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã®ç¯„囲内。メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’ä¿å­˜ã—ã¾ã™ã€‚ - \param [in] ç½²åを生æˆã™ã‚‹ãƒ—ライベートED25519_KEYã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] メッセージãŒç½²åã•ã‚Œã¦ã„るコンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] in ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] inlen ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚¤ãƒ³ãƒ¬ãƒ«é•·ã€‚ + \param [out] out 生æˆã•ã‚ŒãŸç½²åã‚’æ ¼ç´ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \param [in,out] outlen 出力ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§é•·ã€‚メッセージ署åã®ç”Ÿæˆã«æˆåŠŸã—ãŸã¨ãã«ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’ä¿å­˜ã—ã¾ã™ã€‚ + \param [in] key ç½²åを生æˆã™ã‚‹ãƒ—ライベートed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] context メッセージãŒç½²åã•ã‚Œã¦ã„るコンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] contextLen コンテキストãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code ed25519_key key; @@ -221,16 +243,21 @@ const byte* context, byte contextLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ED25519ç½²åを確èªã—ã¦ä¿¡é ¼æ€§ã‚’確ä¿ã—ã¾ã™ã€‚RESを介ã—ã¦ç­”ãˆã‚’è¿”ã—ã€æœ‰åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹1ã€ç„¡åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹0ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®Ed25519ç½²åを検証ã—ã¾ã™ã€‚ + retを介ã—ã¦ç­”ãˆã‚’è¿”ã—ã€æœ‰åŠ¹ãªç½²åã®å ´åˆã¯1ã€ç„¡åŠ¹ãªç½²åã®å ´åˆã«ã¯0ã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 ç½²å検証ã¨èªè¨¼ã‚’正常ã«å®Ÿè¡Œã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›ãƒ‘ラメータãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯SIGLENãŒç½²åã®å®Ÿéš›ã®é•·ã•ã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SIG_VERIFY_E 検証ãŒå®Œäº†ã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ãŒã€ç”Ÿæˆã•ã‚ŒãŸç½²åã¯æä¾›ã•ã‚ŒãŸç½²åã¨ä¸€è‡´ã—ã¾ã›ã‚“。 - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®SIGãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚·ã‚°ãƒ¬ãƒ³ã®é•·ã•ã€‚ - \param [in] メッセージをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®MSGãƒã‚¤ãƒ³ã‚¿ã‚’確èªã™ã‚‹ã€‚ - \param [in] 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®MSGlen長。 - \param [out] 検証ã®çµæžœã¸ã®RESãƒã‚¤ãƒ³ã‚¿ã€‚1メッセージãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ + + \param [in] sig 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] siglen 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚µã‚¤ã‚º + \param [in] msg メッセージをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in] msgLen 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚º + \param [out] ret 検証ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å¤‰æ•°ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚1ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ + \param [in] key ç½²åを検証ã™ã‚‹ãŸã‚ã®Ed25519公開éµã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code ed25519_key key; @@ -257,18 +284,24 @@ word32 msgLen, int* ret, ed25519_key* key); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ED25519ç½²åを確èªã—ã¦ä¿¡é ¼æ€§ã‚’確ä¿ã—ã¾ã™ã€‚文脈ã¯ãƒ‡ãƒ¼ã‚¿æ¤œè¨¼æ¸ˆã¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚RESを介ã—ã¦ç­”ãˆã‚’è¿”ã—ã€æœ‰åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹1ã€ç„¡åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹0ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®Ed25519ç½²åを検証ã—ã¾ã™ã€‚ + コンテキストã¯ç½²åã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + ç­”ãˆã¯å¤‰æ•°retを介ã—ã¦è¿”ã•ã‚Œã€ç½²åãŒæœ‰åŠ¹ãªã‚‰ã°1ã€ç„¡åŠ¹ãªã‚‰ã°0ã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 ç½²å検証ã¨èªè¨¼ã‚’正常ã«å®Ÿè¡Œã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›ãƒ‘ラメータãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯SIGLENãŒç½²åã®å®Ÿéš›ã®é•·ã•ã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SIG_VERIFY_E 検証ãŒå®Œäº†ã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ãŒã€ç”Ÿæˆã•ã‚ŒãŸç½²åã¯æä¾›ã•ã‚ŒãŸç½²åã¨ä¸€è‡´ã—ã¾ã›ã‚“。 - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®SIGãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚·ã‚°ãƒ¬ãƒ³ã®é•·ã•ã€‚ - \param [in] メッセージをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®MSGãƒã‚¤ãƒ³ã‚¿ã‚’確èªã™ã‚‹ã€‚ - \param [in] 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®MSGlen長。 - \param [out] 検証ã®çµæžœã¸ã®RESãƒã‚¤ãƒ³ã‚¿ã€‚1メッセージãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ - \param [in] ç½²åを検証ã™ã‚‹ãŸã‚ã®Public ED25519キーã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] メッセージãŒç½²åã•ã‚ŒãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + + \param [in] sig 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] siglen 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚µã‚¤ã‚º + \param [in] msg メッセージをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in] msgLen 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚º + \param [out] ret 検証ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å¤‰æ•°ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚1ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ + \param [in] key ç½²åを検証ã™ã‚‹ãŸã‚ã®Ed25519公開éµã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] context メッセージãŒç½²åã•ã‚Œã¦ã„るコンテキストをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] contextLen コンテキストãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code ed25519_key key; @@ -297,18 +330,25 @@ const byte* context, byte contextLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã®ED25519ã‚·ã‚°ãƒãƒãƒ£ã‚’確èªã—ã¦ã€ä¿¡é ¼æ€§ã‚’確ä¿ã—ã¾ã™ã€‚文脈ã¯ãƒ‡ãƒ¼ã‚¿æ¤œè¨¼æ¸ˆã¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ãƒãƒƒã‚·ãƒ¥ã¯ã€ç½²å計算å‰ã®ãƒ—リãƒãƒƒã‚·ãƒ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™ã€‚メッセージダイジェストを作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯SHA-512ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。答ãˆã¯RESを介ã—ã¦è¿”ã•ã‚Œã€æœ‰åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹1ã€ç„¡åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹0ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã®Ed25519ç½²åを検証ã—ã¾ã™ã€‚ + 引数hashã¯ã€ç½²å計算å‰ã®ãƒ—リãƒãƒƒã‚·ãƒ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã™ã€‚ + メッセージダイジェストを作æˆã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯SHA-512ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + ç­”ãˆã¯å¤‰æ•°retを介ã—ã¦è¿”ã•ã‚Œã€ç½²åãŒæœ‰åŠ¹ãªã‚‰ã°1ã€ç„¡åŠ¹ãªã‚‰ã°0ã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 ç½²å検証ã¨èªè¨¼ã‚’正常ã«å®Ÿè¡Œã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›ãƒ‘ラメータãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯SIGLENãŒç½²åã®å®Ÿéš›ã®é•·ã•ã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SIG_VERIFY_E 検証ãŒå®Œäº†ã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ãŒã€ç”Ÿæˆã•ã‚ŒãŸç½²åã¯æä¾›ã•ã‚ŒãŸç½²åã¨ä¸€è‡´ã—ã¾ã›ã‚“。 - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®SIGãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚·ã‚°ãƒ¬ãƒ³ã®é•·ã•ã€‚ - \param [in] 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒãƒƒã‚·ãƒ¥ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒãƒƒã‚·ãƒ¥ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 検証ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ã®ãƒãƒƒã‚·ãƒ¥ãƒ¬ãƒ³é•·ã€‚ - \param [out] 検証ã®çµæžœã¸ã®RESãƒã‚¤ãƒ³ã‚¿ã€‚1メッセージãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ - \param [in] ç½²åを検証ã™ã‚‹ãŸã‚ã®Public ED25519キーã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] メッセージãŒç½²åã•ã‚ŒãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + + \param [in] sig 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] siglen 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚µã‚¤ã‚º + \param [in] msg メッセージをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in] msgLen 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚º + \param [out] ret 検証ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å¤‰æ•°ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚1ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ + \param [in] key ç½²åを検証ã™ã‚‹ãŸã‚ã®Ed25519公開éµã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] context メッセージãŒç½²åã•ã‚ŒãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] contextLen コンテキストã®ã‚µã‚¤ã‚º + _Example_ \code ed25519_key key; @@ -337,18 +377,24 @@ const byte* context, byte contextLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ED25519ç½²åを確èªã—ã¦ä¿¡é ¼æ€§ã‚’確ä¿ã—ã¾ã™ã€‚文脈ã¯ãƒ‡ãƒ¼ã‚¿æ¤œè¨¼æ¸ˆã¿ã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚検証å‰ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãƒ—リãƒãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã™ã€‚RESを介ã—ã¦ç­”ãˆã‚’è¿”ã—ã€æœ‰åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹1ã€ç„¡åŠ¹ãªç½²åã«å¯¾å¿œã™ã‚‹0ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã®Ed25519ç½²åを検証ã—ã¾ã™ã€‚ + 引数contextã¯æ¤œè¨¼ã™ã¹ãデータã®ä¸€éƒ¨ã¨ã—ã¦å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + 検証å‰ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãƒ—リãƒãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã™ã€‚ + ç­”ãˆã¯å¤‰æ•°resを介ã—ã¦è¿”ã•ã‚Œã€ç½²åãŒæœ‰åŠ¹ãªã‚‰ã°1ã€ç„¡åŠ¹ãªã‚‰ã°0ã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 ç½²å検証ã¨èªè¨¼ã‚’正常ã«å®Ÿè¡Œã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›ãƒ‘ラメータãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯SIGLENãŒç½²åã®å®Ÿéš›ã®é•·ã•ã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SIG_VERIFY_E 検証ãŒå®Œäº†ã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ãŒã€ç”Ÿæˆã•ã‚ŒãŸç½²åã¯æä¾›ã•ã‚ŒãŸç½²åã¨ä¸€è‡´ã—ã¾ã›ã‚“。 - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®SIGãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚·ã‚°ãƒ¬ãƒ³ã®é•·ã•ã€‚ - \param [in] メッセージをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®MSGãƒã‚¤ãƒ³ã‚¿ã‚’確èªã™ã‚‹ã€‚ - \param [in] 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®MSGlen長。 - \param [out] 検証ã®çµæžœã¸ã®RESãƒã‚¤ãƒ³ã‚¿ã€‚1メッセージãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ - \param [in] ç½²åを検証ã™ã‚‹ãŸã‚ã®Public ED25519キーã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] メッセージãŒç½²åã•ã‚ŒãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] sig 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] siglen 検証ã™ã‚‹ã‚·ã‚°ãƒãƒãƒ£ã®ã‚µã‚¤ã‚º + \param [in] msg メッセージをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in] msgLen 検証ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚º + \param [out] ret 検証ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å¤‰æ•°ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚1ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ­£å¸¸ã«æ¤œè¨¼ã•ã‚ŒãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚ + \param [in] key ç½²åを検証ã™ã‚‹ãŸã‚ã®Ed25519公開éµã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] context メッセージãŒç½²åã•ã‚ŒãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] contextLen コンテキストã®ã‚µã‚¤ã‚º + _Example_ \code ed25519_key key; @@ -377,10 +423,12 @@ const byte* context, byte contextLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æ¤œè¨¼ã§å°†æ¥ã®ä½¿ç”¨ã®ãŸã‚ã«ED25519_KeyオブジェクトをåˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return 0 ED25519_Keyオブジェクトã®åˆæœŸåŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG キーãŒNULLã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€å¾Œã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æ¤œè¨¼ã§ä½¿ç”¨ã®ãŸã‚ã«ed25519_key構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return 0 ed25519_key構造体ã®åˆæœŸåŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数keyãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in,out] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code ed25519_key key; @@ -393,8 +441,10 @@ int wc_ed25519_init(ed25519_key* key); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ä½¿ç”¨ã•ã‚ŒãŸå¾Œã«ED25519オブジェクトを解放ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ä½¿ç”¨æ¸ˆã¿ã®ed25519_key構造体を解放ã—ã¾ã™ã€‚ + \param [in,out] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code ed25519_key key; @@ -408,12 +458,16 @@ void wc_ed25519_free(ed25519_key* key); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€å…¬é–‹éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰Public ED25519_Keyペアをインãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯åœ§ç¸®ã‚­ãƒ¼ã¨éžåœ§ç¸®ã‚­ãƒ¼ã®ä¸¡æ–¹ã‚’処ç†ã—ã¾ã™ã€‚ - \return 0 ED25519_KEYã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ - \return BAD_FUNC_ARG inã¾ãŸã¯keyãŒnullã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯InlenãŒED25519キーã®ã‚µã‚¤ã‚ºã‚ˆã‚Šã‚‚å°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] 公開éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 公開éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã®ã‚¤ãƒ³ãƒ¬ãƒ«é•·ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ed25519公開éµã‚’ed25519_key構造体ã¸ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + 圧縮ã‚ã‚‹ã„ã¯éžåœ§ç¸®ã®ä¸¡æ–¹ã®å½¢å¼ã®éµã‚’扱ã„ã¾ã™ã€‚ + \return 0 ed25519公開éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG inã¾ãŸã¯keyãŒnullã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯inlenãŒED25519éµã®ã‚µã‚¤ã‚ºã‚ˆã‚Šã‚‚å°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param [in] in 公開éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in] inLen 公開éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param [in,out] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret; @@ -426,21 +480,61 @@ // error importing key } \endcode + + \sa wc_ed25519_import_public_ex \sa wc_ed25519_import_private_key + \sa wc_ed25519_import_private_key_ex \sa wc_ed25519_export_public */ int wc_ed25519_import_public(const byte* in, word32 inLen, ed25519_key* key); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ed25519秘密éµã‚’ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ã®ã¿ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ - \return 0 ED25519キーã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ + \ingroup ED25519 + + \brief ã“ã®é–¢æ•°ã¯ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ed25519公開éµã‚’ed25519_key構造体ã¸ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + 圧縮ã‚ã‚‹ã„ã¯éžåœ§ç¸®ã®ä¸¡æ–¹ã®å½¢å¼ã®éµã‚’扱ã„ã¾ã™ã€‚ + 秘密éµãŒæ—¢ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã€trusted引数ãŒ1以外ã®å ´åˆã¯ä¸¡éµãŒå¯¾å¿œã—ã¦ã„ã‚‹ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ + + \return 0 ed25519公開éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG Returned 引数inã‚ã‚‹ã„ã¯keyãŒNULLã®å ´åˆ,ã‚ã‚‹ã„ã¯å¼•æ•°inLenãŒEd25519éµã®ã‚µã‚¤ã‚ºã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param [in] in 公開éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in] inLen 公開éµã‚’å«ã‚“ã ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param [in,out] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in] trusted 公開éµãŒä¿¡é ¼ãŠã‘ã‚‹ã‹å¦ã‹ã‚’示ã™ãƒ•ãƒ©ã‚° + + _Example_ + \code + int ret; + byte pub[] = { initialize Ed25519 public key }; + + ed_25519 key; + wc_ed25519_init_key(&key); + ret = wc_ed25519_import_public_ex(pub, sizeof(pub), &key, 1); + if (ret != 0) { + // error importing key + } + \endcode + + \sa wc_ed25519_import_public + \sa wc_ed25519_import_private_key + \sa wc_ed25519_import_private_key_ex + \sa wc_ed25519_export_public +*/ + +int wc_ed25519_import_public_ex(const byte* in, word32 inLen, ed25519_key* key, + int trusted); + + +/*! + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519秘密éµã®ã¿ã‚’ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + \return 0 Ed25519秘密éµã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG privã¾ãŸã¯keyãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€ã¾ãŸã¯privSzãŒED25519_KEY_SIZEã¨ç•°ãªã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] 秘密éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®PRIVãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 秘密éµã®Privszé•·ã•ã€‚ - \param [in] 公開éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®Pubãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 公開éµã®Pubszã®é•·ã•ã€‚ + \param [in] priv 秘密éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] privSz 秘密éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code int ret; @@ -457,19 +551,21 @@ \sa wc_ed25519_import_private_key \sa wc_ed25519_export_private_only */ - int wc_ed25519_import_private_only(const byte* priv, word32 privSz, ed25519_key* key); + /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ä¸€å¯¾ã®ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ãƒ‘ブリック/プライベートED25519キーペアをインãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯åœ§ç¸®ã‚­ãƒ¼ã¨éžåœ§ç¸®ã‚­ãƒ¼ã®ä¸¡æ–¹ã‚’処ç†ã—ã¾ã™ã€‚ - \return 0 ED25519_KEYã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€Ed25519公開éµ/秘密éµã‚’ãã‚Œãžã‚Œå«ã‚€ä¸€å¯¾ã®ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰Ed25519éµãƒšã‚¢ã‚’インãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯åœ§ç¸®ã¨éžåœ§ç¸®ã®ä¸¡æ–¹ã®éµã‚’処ç†ã—ã¾ã™ã€‚ + \return 0 Ed25519_KEYã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG privã¾ãŸã¯keyãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€privSzãŒED25519_KEY_SIZEã¨ç•°ãªã‚‹ã‚ã‚‹ã„ã¯ED25519_PRV_KEY_SIZEã¨ã‚‚ç•°ãªã‚‹å ´åˆã€pubSzãŒED25519_PUB_KEY_SIZEよりもå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] 秘密éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®PRIVãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 秘密éµã®Privszé•·ã•ã€‚ - \param [in] 公開éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®Pubãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 公開éµã®Pubszã®é•·ã•ã€‚ + \param [in] priv 秘密éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] privSz 秘密éµãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param [in] pub 公開éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] pubSz 公開éµãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code int ret; @@ -497,12 +593,13 @@ \brief ã“ã®é–¢æ•°ã¯ä¸€å¯¾ã®ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰Ed25519公開éµ/秘密éµãƒšã‚¢ã‚’インãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯åœ§ç¸®ã‚­ãƒ¼ã¨éžåœ§ç¸®ã‚­ãƒ¼ã®ä¸¡æ–¹ã‚’処ç†ã—ã¾ã™ã€‚公開éµã¯trusted引数ã«ã‚ˆã‚Šä¿¡é ¼ã•ã‚Œã¦ã„ãªã„ã¨ã•ã‚ŒãŸå ´åˆã«ã¯ç§˜å¯†éµã«å¯¾ã—ã¦æ¤œè¨¼ã•ã‚Œã¾ã™ã€‚ \return 0 ed25519_keyã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG Returned if privã‚ã‚‹ã„ã¯keyãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã€privSzãŒED25519_KEY_SIZEã¨ã‚‚ED25519_PRV_KEY_SIZEã¨ã‚‚ç•°ãªã‚‹å ´åˆã€pubSzãŒED25519_PUB_KEY_SIZEよりå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] priv 秘密éµã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ + \param [in] priv 秘密éµã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param [in] privSz 秘密éµãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º - \param [in] pub 公開éµã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ + \param [in] pub 公開éµã‚’ä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param [in] pubSz 公開éµãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º \param [in,out] key インãƒãƒ¼ãƒˆã•ã‚ŒãŸå…¬é–‹éµ/秘密éµã‚’ä¿æŒã™ã‚‹ed25519_keyオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ - \param [in] trusted 公開éµãŒä¿¡é ¼ã§ãã‚‹ã‹å¦ã‹ã€‚ + \param [in] trusted 公開éµãŒä¿¡é ¼ã§ãã‚‹ã‹å¦ã‹ã‚’指定ã™ã‚‹ãƒ•ãƒ©ã‚° + _Example_ \code int ret; @@ -527,13 +624,16 @@ const byte* pub, word32 pubSz, ed25519_key* key, int trusted); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµã‚’ED25519_Key構造体ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚公開éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«æ ¼ç´ã—ã€ounterenã§ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体ã‹ã‚‰å…¬é–‹éµã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚公開éµã‚’ãƒãƒƒãƒ•ã‚¡outã«æ ¼ç´ã—ã€outLenã«ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ \return 0 公開éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›å€¤ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BUFFER_E æä¾›ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒç§˜å¯†éµã‚’ä¿å­˜ã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã™ã¨ã€outlenã«å¿…è¦ãªã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚ - \param [in] 公開éµã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ED25519_Key構造体ã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [out] 公開éµã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BUFFER_E æä¾›ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒå…¬é–‹éµã‚’ä¿å­˜ã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã®ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã™ã¨ã€outlenã«å¿…è¦ãªã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚ + \param [in] key 公開éµã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [out] out 公開éµã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] outLen 公開éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã™ã‚‹word32型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + 入力ã®éš›ã¯ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã—ã¦æ¸¡ã—ã€å‡ºåŠ›ã®éš›ã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸå…¬é–‹éµã®ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã—ã¾ã™ã€‚ + _Example_ \code int ret; @@ -555,13 +655,16 @@ int wc_ed25519_export_public(ed25519_key* key, byte* out, word32* outLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_Key構造体ã‹ã‚‰ã®ç§˜å¯†éµã®ã¿ã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚秘密éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«æ ¼ç´ã—ã€outlenã«ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体ã‹ã‚‰ã®ç§˜å¯†éµã®ã¿ã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚秘密éµã‚’ãƒãƒƒãƒ•ã‚¡ã‚¢ã‚¦ãƒˆã«æ ¼ç´ã—ã€outlenã«ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ \return 0 秘密éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›å€¤ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E æä¾›ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒç§˜å¯†éµã‚’ä¿å­˜ã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] 秘密éµã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ED25519_Key構造体ã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [out] 秘密éµã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] key 秘密éµã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [out] out 秘密éµã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] outLen 秘密éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã™ã‚‹word32型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + 入力ã®éš›ã¯ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã—ã¦æ¸¡ã—ã€å‡ºåŠ›ã®éš›ã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸç§˜å¯†éµã®ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã—ã¾ã™ã€‚ + _Example_ \code int ret; @@ -582,13 +685,16 @@ int wc_ed25519_export_private_only(ed25519_key* key, byte* out, word32* outLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_Key構造体ã‹ã‚‰ã‚­ãƒ¼ãƒšã‚¢ã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚キーペアをãƒãƒƒãƒ•ã‚¡OUTã«æ ¼ç´ã—ã€ounterenã§ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ - \return 0 キーペアã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体ã‹ã‚‰éµãƒšã‚¢ã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚éµãƒšã‚¢ã‚’ãƒãƒƒãƒ•ã‚¡outã«æ ¼ç´ã—ã€ounterenã§ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ + \return 0 éµãƒšã‚¢ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›å€¤ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BUFFER_E æä¾›ã•ã‚Œã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒã‚­ãƒ¼ãƒšã‚¢ã‚’ä¿å­˜ã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] キーペアをエクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ED25519_Key構造体ã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [out] キーペアをä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BUFFER_E æä¾›ã•ã‚Œã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒéµãƒšã‚¢ã‚’ä¿å­˜ã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] éµãƒšã‚¢ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [out] éµãƒšã‚¢ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] outLen éµãƒšã‚¢ã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã™ã‚‹word32型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + 入力ã®éš›ã¯ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã—ã¦æ¸¡ã—ã€å‡ºåŠ›ã®éš›ã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸéµãƒšã‚¢ã®ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã—ã¾ã™ã€‚ + _Example_ \code ed25519_key key; @@ -613,15 +719,21 @@ int wc_ed25519_export_private(ed25519_key* key, byte* out, word32* outLen); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_KEY構造体ã¨ã¯åˆ¥ã«ãƒ—ライベートキーã¨å…¬é–‹éµã‚’エクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚秘密éµã‚’ãƒãƒƒãƒ•ã‚¡ãƒ¼Privã«æ ¼ç´ã—ã€PRIVSZã§ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚公開éµã‚’ãƒãƒƒãƒ•ã‚¡PUBã«æ ¼ç´ã—ã€Pubszã§ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’設定ã—ã¾ã™ã€‚ - \return 0 キーペアã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体ã‹ã‚‰ç§˜å¯†éµã¨å…¬é–‹éµã‚’別々ã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + 秘密éµã‚’ãƒãƒƒãƒ•ã‚¡privã«æ ¼ç´ã—ã€priovSzã«ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ã込んã ãƒã‚¤ãƒˆæ•°ã‚’設定ã—ã¾ã™ã€‚ + 公開éµã‚’ãƒãƒƒãƒ•ã‚¡pubã«æ ¼ç´ã—ã€pubSzã«ã“ã®ãƒãƒƒãƒ•ã‚¡ã«æ›¸ã込んã ãƒã‚¤ãƒˆæ•°ã‚’設定ã—ã¾ã™ã€‚ + \return 0 éµãƒšã‚¢ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›å€¤ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BUFFER_E æä¾›ã•ã‚Œã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒã‚­ãƒ¼ãƒšã‚¢ã‚’ä¿å­˜ã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param [in] キーペアをエクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ED25519_Key構造体ã¸ã®ã‚­ãƒ¼ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [out] 秘密éµã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®PRIVãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in,out] PRIVSZ PIVINSZãƒã‚¤ãƒ³ã‚¿ã‚µã‚¤ã‚ºãŒè¡¨ç¤ºã•ã‚Œã¦ã„るサイズをæŒã¤Word32オブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚秘密éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå¾Œã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã‚’設定ã—ã¾ã™ã€‚ - \param [out] パブリックキーをä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®Pub。 + \return BUFFER_E æä¾›ã•ã‚Œã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ãŒéµãƒšã‚¢ã‚’ä¿å­˜ã™ã‚‹ã®ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] key éµãƒšã‚¢ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [out] priv 秘密éµã‚’出力ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] privSz 秘密éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’ä¿æŒã™ã‚‹word32型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + 秘密éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå¾Œã«ã¯æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ãŒã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ + \param [out] pub パブリックキーを出力ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param [in,out] pubSz 公開éµã‚’出力ã™ã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’ä¿æŒã™ã‚‹word32型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + 公開éµã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆå¾Œã«ã¯æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ãŒã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret; @@ -647,11 +759,13 @@ byte* pub, word32 *pubSz); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519_KEY構造体ã®å…¬é–‹éµã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€ed25519_key構造体ã®å…¬é–‹éµã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ \return 0 プライベートキーã¨å…¬é–‹éµãŒä¸€è‡´ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸéµãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return PUBLIC_KEY_E 公開éµãŒå‚ç…§ã§ããªã„ã‹ç„¡åŠ¹ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] key 公開éµã¨ç§˜å¯†éµã®ä¸¡æ–¹ã‚’ä¿æŒã—ã¦ã„ã‚‹ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret; @@ -672,10 +786,13 @@ int wc_ed25519_check_key(ed25519_key* key); /*! - \ingroup ED25519 - \brief ã“ã®é–¢æ•°ã¯ã€ED25519 - 32ãƒã‚¤ãƒˆã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup ED25519 + \brief ã“ã®é–¢æ•°ã¯ã€Ed25519 - 32ãƒã‚¤ãƒˆã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ \return ED25519_KEY_SIZE 有効ãªç§˜å¯†éµã®ã‚µã‚¤ã‚ºï¼ˆ32ãƒã‚¤ãƒˆï¼‰ã€‚ - \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸã‚­ãƒ¼ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸå¼•æ•°keyãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ \code int keySz; @@ -692,10 +809,12 @@ int wc_ed25519_size(ed25519_key* key); /*! - \ingroup ED25519 + \ingroup ED25519 \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµã‚µã‚¤ã‚ºï¼ˆsecret + public)をãƒã‚¤ãƒˆå˜ä½ã§è¿”ã—ã¾ã™ã€‚ \return ED25519_PRV_KEY_SIZE 秘密éµã®ã‚µã‚¤ã‚ºï¼ˆ64ãƒã‚¤ãƒˆï¼‰ã€‚ \return BAD_FUNC_ARG key引数ãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param [in] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code ed25519_key key; @@ -713,10 +832,12 @@ int wc_ed25519_priv_size(ed25519_key* key); /*! - \ingroup ED25519 + \ingroup ED25519 \brief ã“ã®é–¢æ•°ã¯åœ§ç¸®éµã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§è¿”ã—ã¾ã™ï¼ˆå…¬é–‹éµï¼‰ã€‚ \return ED25519_PUB_KEY_SIZE 圧縮公開éµã®ã‚µã‚¤ã‚ºï¼ˆ32ãƒã‚¤ãƒˆï¼‰ã€‚ \return BAD_FUNC_ARG key引数ãŒnullã®å ´åˆã¯è¿”ã—ã¾ã™ã€‚ + \param [in] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code ed25519_key key; @@ -733,10 +854,12 @@ int wc_ed25519_pub_size(ed25519_key* key); /*! - \ingroup ED25519 + \ingroup ED25519 \brief ã“ã®é–¢æ•°ã¯ã€ED25519ã‚·ã‚°ãƒãƒãƒ£ã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°64)を返ã—ã¾ã™ã€‚ \return ED25519_SIG_SIZE ED25519ã‚·ã‚°ãƒãƒãƒ£ï¼ˆ64ãƒã‚¤ãƒˆï¼‰ã®ã‚µã‚¤ã‚ºã€‚ \return BAD_FUNC_ARG key引数ãŒnullã®å ´åˆã¯è¿”ã—ã¾ã™ã€‚ + \param [in] key ed25519_key構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int sigSz; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/hmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/hmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/hmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/hmac.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /*! - \ingroup HMAC + \ingroup HMAC \brief ã“ã®é–¢æ•°ã¯HMACオブジェクトをåˆæœŸåŒ–ã—ã€ãã®æš—å·åŒ–タイプã€ã‚­ãƒ¼ã€ãŠã‚ˆã³HMACã®é•·ã•ã‚’設定ã—ã¾ã™ã€‚ \return 0 HMACオブジェクトã®åˆæœŸåŒ–ã«æˆåŠŸã—ã¾ã—㟠\return BAD_FUNC_ARG 入力タイプãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚有効ãªã‚ªãƒ—ションã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.MD5ã€SHAã€SHA256ã€SHA384ã€SHA3-224ã€SHA3-256ã€SHA3-384ã€SHA3-512 @@ -22,7 +22,7 @@ int wc_HmacSetKey(Hmac* hmac, int type, const byte* key, word32 keySz); /*! - \ingroup HMAC + \ingroup HMAC \brief ã“ã®é–¢æ•°ã¯ã€HMACを使用ã—ã¦èªè¨¼ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¾ã™ã€‚HMACオブジェクトãŒWC_HMACSETKEYã§åˆæœŸåŒ–ã•ã‚ŒãŸå¾Œã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã¹ãã§ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ãƒãƒƒã‚·ãƒ¥ã¸ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ›´æ–°ã™ã‚‹ãŸã‚ã«è¤‡æ•°å›žå‘¼ã³å‡ºã•ã‚Œã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚å¿…è¦ã«å¿œã˜ã¦wc_hmacupdateを呼ã³å‡ºã—ãŸå¾Œã€æœ€çµ‚èªè¨¼æ¸ˆã¿ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚°ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«wc_hmacfinalを呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 èªè¨¼ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ›´æ–°ã«æˆåŠŸã—ã¾ã—㟠\return MEMORY_E ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ @@ -47,7 +47,7 @@ int wc_HmacUpdate(Hmac* hmac, const byte* in, word32 sz); /*! - \ingroup HMAC + \ingroup HMAC \brief ã“ã®é–¢æ•°ã¯ã€HMACオブジェクトã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€çµ‚ãƒãƒƒã‚·ãƒ¥ã‚’計算ã—ã¾ã™ã€‚ \return 0 最後ã®ãƒãƒƒã‚·ãƒ¥ã®è¨ˆç®—ã«æˆåŠŸã—㟠\return MEMORY_E ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ @@ -69,7 +69,7 @@ int wc_HmacFinal(Hmac* hmac, byte* out); /*! - \ingroup HMAC + \ingroup HMAC \brief ã“ã®é–¢æ•°ã¯ã€æ§‹æˆã•ã‚ŒãŸæš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã«åŸºã¥ã„ã¦ä½¿ç”¨å¯èƒ½ãªæœ€å¤§ã®HMACダイジェストサイズを返ã—ã¾ã™ã€‚ \return Success 設定ã•ã‚ŒãŸæš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã«åŸºã¥ã„ã¦ä½¿ç”¨å¯èƒ½ãªæœ€å¤§ã®HMACダイジェストサイズを返ã—ã¾ã™ _Example_ @@ -81,7 +81,7 @@ int wolfSSL_GetHmacMaxSize(void); /*! - \ingroup HMAC + \ingroup HMAC \brief ã“ã®é–¢æ•°ã¯ã€HMACキー導出機能(HKDF)ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æä¾›ã—ã¾ã™ã€‚HMACを利用ã—ã¦ã€ä»»æ„ã®SALTã¨ã‚ªãƒ—ションã®æƒ…報を派生ã—ãŸã‚­ãƒ¼ã«å¤‰æ›ã—ã¾ã™ã€‚0ã¾ãŸã¯NULLãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ãƒãƒƒã‚·ãƒ¥åž‹ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§MD5ã«ãªã‚Šã¾ã™ã€‚ \return 0 与ãˆã‚‰ã‚ŒãŸå…¥åŠ›ã§ã‚­ãƒ¼ã®ç”Ÿæˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG 無効ãªãƒãƒƒã‚·ãƒ¥åž‹ãŒå¼•æ•°ã¨ã—ã¦æŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚有効ãªåž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.MD5ã€SHAã€SHA256ã€SHA384ã€SHA3-224ã€SHA3-256ã€SHA3-384ã€SHA3-512 @@ -90,8 +90,8 @@ \param type HKDFã«ä½¿ç”¨ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—。有効ãªåž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.MD5ã€SHAã€SHA256ã€SHA384ã€SHA3-224ã€SHA3-256ã€SHA3-384ã€SHA3-512 \param inKey KDFã«ä½¿ç”¨ã™ã‚‹ã‚­ãƒ¼ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inKeySz 入力キーã®é•·ã• - \param salt ä»»æ„ã®å¡©ã‚’å«ã‚€ç·©è¡æ¶²ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚塩を使用ã—ãªã„å ´åˆã¯ä»£ã‚ã‚Šã«NULLを使用ã—ã¦ãã ã•ã„ - \param saltSz å¡©ã®é•·ã•ã€‚塩を使用ã—ãªã„å ´åˆã¯0を使用ã—ã¦ãã ã•ã„ + \param salt ä»»æ„ã®ã‚½ãƒ«ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ソルトを使用ã—ãªã„å ´åˆã¯ä»£ã‚ã‚Šã«NULLを使用ã—ã¦ãã ã•ã„ + \param saltSz ソルトã®é•·ã•ã€‚ソルトを使用ã—ãªã„å ´åˆã¯0を使用ã—ã¦ãã ã•ã„ \param info オプションã®è¿½åŠ æƒ…報をå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚追加情報を追加ã—ã¦ã„ãªã„å ´åˆã¯NULLを使用ã—ã¦ãã ã•ã„ \param infoSz 追加情報ã®é•·ã•è¿½åŠ æƒ…報を使用ã—ãªã„å ´åˆã¯0を使用ã—ã¦ãã ã•ã„ \param out 派生キーをä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/pwdbased.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/pwdbased.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/pwdbased.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/pwdbased.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,14 +1,14 @@ /*! - \ingroup Password - \brief ã“ã®æ©Ÿèƒ½ã¯ãƒ‘スワードベースã®éµå°Žå‡ºæ©Ÿèƒ½1(PBKDF1)を実装ã—ã€å…¥åŠ›ãƒ‘スワードを連çµå¡©ã¨å…±ã«ã‚ˆã‚Šå®‰å…¨ãªéµã«å¤‰æ›ã—ã€å‡ºåŠ›ã«è¨˜æ†¶ã™ã‚‹ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€HASH関数ã¨ã—ã¦SHAã¨MD5ã‚’é¸æŠžã§ãã¾ã™ã€‚ + \ingroup Password + \brief ã“ã®æ©Ÿèƒ½ã¯ãƒ‘スワードベースã®éµå°Žå‡ºæ©Ÿèƒ½1(PBKDF1)を実装ã—ã€å…¥åŠ›ãƒ‘スワードを連çµã‚½ãƒ«ãƒˆã¨å…±ã«ã‚ˆã‚Šå®‰å…¨ãªéµã«å¤‰æ›ã—ã€å‡ºåŠ›ã«è¨˜æ†¶ã™ã‚‹ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€HASH関数ã¨ã—ã¦SHAã¨MD5ã‚’é¸æŠžã§ãã¾ã™ã€‚ \return 0 入力パスワードã‹ã‚‰ã‚­ãƒ¼ã®æ´¾ç”Ÿã«æ­£å¸¸ã«æˆ»ã•ã‚ŒãŸ \return BAD_FUNC_ARG 与ãˆã‚‰ã‚ŒãŸç„¡åŠ¹ãªãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—ãŒã‚ã‚‹å ´åˆï¼ˆæœ‰åŠ¹ãªã‚¿ã‚¤ãƒ—ã¯ï¼šMD5ã¨SHA)ã€å復ã¯1未満ã€ã¾ãŸã¯è¦æ±‚ã•ã‚ŒãŸã‚­ãƒ¼ã®é•·ã•ï¼ˆKlen)ã¯æä¾›ã•ã‚ŒãŸãƒãƒƒã‚·ãƒ¥ã®ãƒãƒƒã‚·ãƒ¥é•·ã‚ˆã‚Šã‚‚大ãã„ã§ã™ã€‚ \return MEMORY_E SHAã¾ãŸã¯MD5オブジェクトã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ \param output 生æˆã•ã‚ŒãŸã‚­ãƒ¼ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚å°‘ãªãã¨ã‚‚klen longã«ãªã‚‹ã¹ãã§ã™ \param passwd キーã®æ´¾ç”Ÿã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワードをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param pLen キーã®æ´¾ç”Ÿã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワードã®é•·ã• - \param salt éµç”±æ¥ã«ä½¿ç”¨ã™ã‚‹å¡©ã‚’å«ã‚€ç·©è¡æ¶²ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ - \param sLen å¡©ã®é•·ã• + \param salt éµç”±æ¥ã«ä½¿ç”¨ã™ã‚‹ã‚½ãƒ«ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ + \param sLen ソルトã®é•·ã• \param iterations ãƒãƒƒã‚·ãƒ¥ã‚’処ç†ã™ã‚‹ãŸã‚ã®å›žæ•° \param kLen 派生キーã®å¸Œæœ›ã®é•·ã•ã€‚é¸æŠžã—ãŸãƒãƒƒã‚·ãƒ¥ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã‚µã‚¤ã‚ºã‚ˆã‚Šé•·ãã—ã¦ã¯ã„ã‘ã¾ã›ã‚“ _Example_ @@ -32,16 +32,16 @@ int typeH); /*! - \ingroup Password - \brief ã“ã®æ©Ÿèƒ½ã¯ãƒ‘スワードベースã®ã‚­ãƒ¼å°Žå‡ºæ©Ÿèƒ½2(PBKDF2)を実装ã—ã€å…¥åŠ›ãƒ‘スワードを連çµã•ã‚ŒãŸå¡©ã¨ã¨ã‚‚ã«ã‚ˆã‚Šå®‰å…¨ãªã‚­ãƒ¼ã«å¤‰æ›ã—ã€å‡ºåŠ›ã«è¨˜æ†¶ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€MD5ã€SHAã€SHA256ã€SHA384ã€SHA512ã€ãŠã‚ˆã³BLAKE2Bãªã©ã€ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹HMACãƒãƒƒã‚·ãƒ¥é–¢æ•°ã®ã„ãšã‚Œã‹ã‚’é¸æŠžã§ãã¾ã™ã€‚ + \ingroup Password + \brief ã“ã®æ©Ÿèƒ½ã¯ãƒ‘スワードベースã®ã‚­ãƒ¼å°Žå‡ºæ©Ÿèƒ½2(PBKDF2)を実装ã—ã€å…¥åŠ›ãƒ‘スワードを連çµã•ã‚ŒãŸã‚½ãƒ«ãƒˆã¨ã¨ã‚‚ã«ã‚ˆã‚Šå®‰å…¨ãªã‚­ãƒ¼ã«å¤‰æ›ã—ã€å‡ºåŠ›ã«è¨˜æ†¶ã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€MD5ã€SHAã€SHA256ã€SHA384ã€SHA512ã€ãŠã‚ˆã³BLAKE2Bãªã©ã€ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹HMACãƒãƒƒã‚·ãƒ¥é–¢æ•°ã®ã„ãšã‚Œã‹ã‚’é¸æŠžã§ãã¾ã™ã€‚ \return 0 入力パスワードã‹ã‚‰ã‚­ãƒ¼ã®æ´¾ç”Ÿã«æ­£å¸¸ã«æˆ»ã•ã‚ŒãŸ \return BAD_FUNC_ARG 無効ãªãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—ãŒã‚ã‚‹å ´åˆã€ã¾ãŸã¯å復ãŒ1未満ã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E HMACオブジェクトã«å‰²ã‚ŠæŒ¯ã‚Šãƒ¡ãƒ¢ãƒªãŒã‚ã‚‹å ´åˆ \param output 生æˆã•ã‚ŒãŸã‚­ãƒ¼ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚klen longã«ã™ã‚‹ã¹ãã§ã™ \param passwd キーã®æ´¾ç”Ÿã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワードをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param pLen キーã®æ´¾ç”Ÿã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワードã®é•·ã• - \param salt éµç”±æ¥ã«ä½¿ç”¨ã™ã‚‹å¡©ã‚’å«ã‚€ç·©è¡æ¶²ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ - \param sLen å¡©ã®é•·ã• + \param salt éµç”±æ¥ã«ä½¿ç”¨ã™ã‚‹ã‚½ãƒ«ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ + \param sLen ソルトã®é•·ã• \param iterations ãƒãƒƒã‚·ãƒ¥ã‚’処ç†ã™ã‚‹ãŸã‚ã®å›žæ•° \param kLen 派生éµã®æœ›ã¾ã—ã„é•·ã• _Example_ @@ -65,8 +65,8 @@ int typeH); /*! - \ingroup Password - \brief ã“ã®é–¢æ•°ã¯ã€RFC 7292付録Bã«è¨˜è¼‰ã•ã‚Œã¦ã„るパスワードベースã®ã‚­ãƒ¼å°Žå‡ºæ©Ÿèƒ½ï¼ˆPBKDF)を実装ã—ã¦ã„ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ‘スワードを連çµå¡©ã§ã‚ˆã‚Šå®‰å…¨ãªã‚­ãƒ¼ã«å¤‰æ›ã—ã¾ã™ã€‚ãã‚Œã¯ã€MD5ã€SHAã€SHA256ã€SHA384ã€SHA512ã€ãŠã‚ˆã³BLAKE2Bã‚’å«ã‚€ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹HMACãƒãƒƒã‚·ãƒ¥é–¢æ•°ã®ã„ãšã‚Œã‹ã‚’é¸æŠžã§ãã¾ã™ã€‚ + \ingroup Password + \brief ã“ã®é–¢æ•°ã¯ã€RFC 7292付録Bã«è¨˜è¼‰ã•ã‚Œã¦ã„るパスワードベースã®ã‚­ãƒ¼å°Žå‡ºæ©Ÿèƒ½ï¼ˆPBKDF)を実装ã—ã¦ã„ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ãƒ‘スワードを連çµã‚½ãƒ«ãƒˆã§ã‚ˆã‚Šå®‰å…¨ãªã‚­ãƒ¼ã«å¤‰æ›ã—ã¾ã™ã€‚ãã‚Œã¯ã€MD5ã€SHAã€SHA256ã€SHA384ã€SHA512ã€ãŠã‚ˆã³BLAKE2Bã‚’å«ã‚€ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹HMACãƒãƒƒã‚·ãƒ¥é–¢æ•°ã®ã„ãšã‚Œã‹ã‚’é¸æŠžã§ãã¾ã™ã€‚ \return 0 入力パスワードã‹ã‚‰ã‚­ãƒ¼ã®æ´¾ç”Ÿã«æ­£å¸¸ã«æˆ»ã•ã‚ŒãŸ \return BAD_FUNC_ARG è¿”ã•ã‚ŒãŸç„¡åŠ¹ãªãƒãƒƒã‚·ãƒ¥ã‚¿ã‚¤ãƒ—ãŒä¸Žãˆã‚‰ã‚ŒãŸå ´åˆã€ç¹°ã‚Šè¿”ã—ã¯1未満ã€ã¾ãŸã¯è¦æ±‚ã•ã‚ŒãŸã‚­ãƒ¼ã®é•·ã•ï¼ˆklen)ãŒæä¾›ã•ã‚ŒãŸãƒãƒƒã‚·ãƒ¥ã®ãƒãƒƒã‚·ãƒ¥é•·ã‚ˆã‚Šã‚‚大ãã„ã§ã™ã€‚ \return MEMORY_E 割り当ã¦ãƒ¡ãƒ¢ãƒªãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ @@ -84,8 +84,8 @@ \param output 生æˆã•ã‚ŒãŸã‚­ãƒ¼ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚klen longã«ã™ã‚‹ã¹ãã§ã™ \param passwd キーã®æ´¾ç”Ÿã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワードをå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param pLen キーã®æ´¾ç”Ÿã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワードã®é•·ã• - \param salt éµç”±æ¥ã«ä½¿ç”¨ã™ã‚‹å¡©ã‚’å«ã‚€ç·©è¡æ¶²ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ - \param sLen å¡©ã®é•·ã• + \param salt éµç”±æ¥ã«ä½¿ç”¨ã™ã‚‹ã‚½ãƒ«ãƒˆã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ + \param sLen ソルトã®é•·ã• \param iterations ãƒãƒƒã‚·ãƒ¥ã‚’処ç†ã™ã‚‹ãŸã‚ã®å›žæ•° \param kLen 派生éµã®æœ›ã¾ã—ã„é•·ã• \param hashType 使用ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ æœ‰åŠ¹ãªé¸æŠžè‚¢ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.MD5ã€SHAã€SHA256ã€SHA384ã€SHA512ã€ãŠã‚ˆã³BLAKE2B diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/rsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/rsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/rsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/rsa.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /*! - \ingroup RSA - \brief ã“ã®é–¢æ•°ã¯æä¾›ã•ã‚ŒãŸRSAKEY構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ã¾ãŸã€ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ãƒ¡ãƒ¢ãƒªã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®ãƒ’ープ識別å­ã‚‚å–ã‚Šã¾ã™ï¼ˆXMALLOCã€XFREEã€XREALLOCã‚’å‚照)。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief ã“ã®é–¢æ•°ã¯æä¾›ã•ã‚ŒãŸRsaKey構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ã¾ãŸã€ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ãƒ¡ãƒ¢ãƒªã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®ãƒ’ープ識別å­ã‚‚å–ã‚Šã¾ã™ï¼ˆXMALLOCã€XFREEã€XREALLOCã‚’å‚照)。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return 0 æš—å·åŒ–ã¨å¾©å·åŒ–ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®RSA構造ã®åˆæœŸåŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARGS RSAキーãƒã‚¤ãƒ³ã‚¿ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ \param key åˆæœŸåŒ–ã™ã‚‹RSAKEY構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ @@ -13,19 +13,18 @@ // error initializing RSA key } \endcode - \sa wc_RsaInitCavium \sa wc_FreeRsaKey \sa wc_RsaSetRNG */ int wc_InitRsaKey(RsaKey* key, void* heap); /*! - \ingroup RSA - \brief ã“ã®é–¢æ•°ã¯æä¾›ã•ã‚ŒãŸRSAKEY構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚IDã¨LENã¯ã€DEVIDãŒãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã—ã¦ã„ã‚‹é–“ã«ãƒ‡ãƒã‚¤ã‚¹ä¸Šã®ã‚­ãƒ¼ã‚’識別ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ã¾ãŸã€ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ãƒ¡ãƒ¢ãƒªã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®ãƒ’ープ識別å­ã‚‚å–ã‚Šã¾ã™ï¼ˆXMALLOCã€XFREEã€XREALLOCã‚’å‚照)。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief ã“ã®é–¢æ•°ã¯æä¾›ã•ã‚ŒãŸRsaKey構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚IDã¨LENã¯ã€DEVIDãŒãƒ‡ãƒã‚¤ã‚¹ã‚’識別ã—ã¦ã„ã‚‹é–“ã«ãƒ‡ãƒã‚¤ã‚¹ä¸Šã®ã‚­ãƒ¼ã‚’識別ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ã¾ãŸã€ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©ãƒ¡ãƒ¢ãƒªã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®ãƒ’ープ識別å­ã‚‚å–ã‚Šã¾ã™ï¼ˆXMALLOCã€XFREEã€XREALLOCã‚’å‚照)。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return 0 æš—å·åŒ–ã¨å¾©å·åŒ–ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®RSA構造ã®åˆæœŸåŒ–ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARGS RSAキーãƒã‚¤ãƒ³ã‚¿ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ \return BUFFER_E LENãŒRSA_MAX_ID_LENよりもå°ã•ã„å ´åˆã€ã¾ãŸã¯å¤§ãã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param key åˆæœŸåŒ–ã™ã‚‹RSAKEY構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key åˆæœŸåŒ–ã™ã‚‹RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param id デãƒã‚¤ã‚¹ä¸Šã®ã‚­ãƒ¼ã®è­˜åˆ¥å­ \param len ãƒã‚¤ãƒˆæ•°ã®è­˜åˆ¥å­ã®é•·ã• \param heap メモリオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®ãƒ’ープ識別å­ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚メモリ割り当ã¦ã®ã‚«ã‚¹ã‚¿ãƒ å‡¦ç†ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚ã“ã®ãƒ’ープã¯ã€ã“ã®RSAオブジェクトã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«ãªã‚Šã¾ã™ã€‚ @@ -47,7 +46,6 @@ } \endcode \sa wc_InitRsaKey - \sa wc_RsaInitCavium \sa wc_FreeRsaKey \sa wc_RsaSetRNG */ @@ -55,11 +53,11 @@ void* heap, int devId); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯RNGをキーã«é–¢é€£ä»˜ã‘ã¾ã™ã€‚WC_RSA_BLINDINGãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã¯å¿…è¦ã§ã™ã€‚ \return 0 æˆåŠŸã«æˆ»ã£ãŸ \return BAD_FUNC_ARGS RSAキーã®å ´åˆã€RNGãƒã‚¤ãƒ³ã‚¿ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆ - \param key 関連付ã‘られるRSAKEY構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key 関連付ã‘られるRsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code ret = wc_InitRsaKey(&key, NULL); @@ -75,8 +73,8 @@ int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng); /*! - \ingroup RSA - \brief ã“ã®é–¢æ•°ã¯ã€MP_Clearを使用ã—ã¦æä¾›ã•ã‚ŒãŸRSAKEY構造体を解放ã—ã¾ã™ã€‚ + \ingroup RSA + \brief ã“ã®é–¢æ•°ã¯ã€MP_Clearを使用ã—ã¦æä¾›ã•ã‚ŒãŸRsaKey構造体を解放ã—ã¾ã™ã€‚ \return 0 キーã®è§£æ”¾ã«æˆåŠŸã—ãŸã‚‰è¿”å“ã•ã‚Œã¾ã™ _Example_ \code @@ -91,7 +89,7 @@ int wc_FreeRsaKey(RsaKey* key); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’INã‹ã‚‰æš—å·åŒ–ã—ã€ãã®çµæžœã‚’æ ¼ç´ã—ã¾ã™ã€‚åˆæœŸåŒ–ã•ã‚ŒãŸå…¬é–‹éµã¨ä¹±æ•°ç™ºç”Ÿå™¨ãŒå¿…è¦ã§ã™ã€‚副作用ã¨ã—ã¦ã€ã“ã®é–¢æ•°ã¯ounlenã®ä¸­ã§æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ \return Success 入力メッセージã®æš—å·åŒ–ã«æˆåŠŸã—ãŸã‚‰ã€æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã—ã€éšœå®³ã®å ´åˆã¯ã‚¼ãƒ­æœªæº€ã§ã™ã€‚ã¾ãŸã€outlenã®å€¤ã‚’æ ¼ç´ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ã€OUTã«æ›¸ãè¾¼ã¾ã‚ŒãŸæ•°ã®ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG 入力パラメータã®ã„ãšã‚Œã‹ãŒç„¡åŠ¹ãªå ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -113,7 +111,7 @@ \param inLen æš—å·åŒ–ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é•·ã• \param out 出力暗å·æ–‡ã‚’ä¿å­˜ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param outLen 出力ãƒãƒƒãƒ•ã‚¡ã®é•·ã• - \param key æš—å·åŒ–ã«ä½¿ç”¨ã™ã‚‹å…¬é–‹éµã‚’å«ã‚€RSAKEY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key æš—å·åŒ–ã«ä½¿ç”¨ã™ã‚‹å…¬é–‹éµã‚’å«ã‚€RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code RsaKey pub; @@ -138,7 +136,7 @@ word32 outLen, RsaKey* key, WC_RNG* rng); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯å¾©å·åŒ–ã®ãŸã‚ã«WC_RSAPrivateCrypt関数ã«ã‚ˆã£ã¦åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚ \return Success 復å·åŒ–データã®é•·ã• \return RSA_PAD_E RSAUNPADエラーã€ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã®æ‚ªã„フォーマット @@ -155,7 +153,7 @@ RsaKey* key); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯ç§˜å¯†ã®RSA復å·åŒ–ã‚’æä¾›ã—ã¾ã™ã€‚ \return Success 復å·åŒ–データã®é•·ã• \return MEMORY_E -125ã€ãƒ¡ãƒ¢ãƒªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠@@ -183,7 +181,7 @@ word32 outLen, RsaKey* key); /*! - \ingroup RSA + \ingroup RSA \brief æä¾›ã•ã‚ŒãŸé…列ã«ç§˜å¯†éµã¨ç½²åã—ã¾ã™ã€‚ \return RSA_BUFFER_E: -131ã€RSAãƒãƒƒãƒ•ã‚¡ã‚¨ãƒ©ãƒ¼ã€å‡ºåŠ›ãŒå°ã•ã™ãŽãŸã‚Šå…¥åŠ›ãŒå¤§ãã™ãŽãŸã‚Šã™ã‚‹ \param in æš—å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 @@ -209,7 +207,7 @@ word32 outLen, RsaKey* key, WC_RNG* rng); /*! - \ingroup RSA + \ingroup RSA \brief メッセージãŒRSAキーã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸã“ã¨ã‚’確èªã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚出力ã¯å…¥åŠ›ã¨åŒã˜ãƒã‚¤ãƒˆé…列を使用ã—ã¾ã™ã€‚ \return >0 テキストã®é•·ã• \return <0 エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ @@ -240,7 +238,7 @@ RsaKey* key); /*! - \ingroup RSA + \ingroup RSA \brief メッセージãŒã‚­ãƒ¼ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸã“ã¨ã‚’確èªã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return Success エラーã®ãªã„テキストã®é•·ã•ã€‚ \return MEMORY_E メモリ例外 @@ -266,7 +264,7 @@ word32 outLen, RsaKey* key); /*! - \ingroup RSA + \ingroup RSA \brief æä¾›ã•ã‚ŒãŸé…列ã«ç§˜å¯†éµã¨ç½²åã—ã¾ã™ã€‚ \return RSA_BUFFER_E: -131ã€RSAãƒãƒƒãƒ•ã‚¡ã‚¨ãƒ©ãƒ¼ã€å‡ºåŠ›ãŒå°ã•ã™ãŽãŸã‚Šå…¥åŠ›ãŒå¤§ãã™ãŽãŸã‚Šã™ã‚‹ \param in æš—å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 @@ -310,14 +308,15 @@ RsaKey* key, WC_RNG* rng); /*! - \ingroup RSA - \brief 入力署åを復å·åŒ–ã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚­ãƒ¼ã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸã“ã¨ã‚’確èªã—ã¾ã™ã€‚wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 - \return Success エラーã®ãªã„テキストã®é•·ã•ã€‚ + \ingroup RSA + \brief 入力署åを復å·ã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒéµã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸã“ã¨ã‚’確èªã—ã¾ã™ã€‚WC_RSA_BLINDINGãŒæœ‰åŠ¹ãªå ´åˆã€éµã¯wc_RsaSetRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \return Success エラーã®ãªã„å ´åˆã¯ãƒ†ã‚­ã‚¹ãƒˆã®é•·ã•ã‚’è¿”ã—ã¾ã™ \return MEMORY_E メモリ例外 - \param in 復å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 - \param inLen ã®é•·ã• - \param out æ ¼ç´ã™ã‚‹å¾©å·åŒ–データã®ãƒã‚¤ãƒˆé…列。 - \param outLen ã®é•·ã• + \return MP_EXPTMOD_E - fastmathを使用ã™ã‚‹æ§˜ã«æ§‹æˆã•ã‚Œã¦ã„ã‚‹å ´åˆã«FP_MAX_BITSãŒéµã‚µã‚¤ã‚ºã®å°‘ãªãã¨ã‚‚2å€ã«è¨­å®šã•ã‚Œã¦ã„ãªã„(例ãˆã°4096-bité•·ã®éµã‚’使用ã™ã‚‹å ´åˆã«ã¯FP_MAX_BITSã¯8192以上ã«è¨­å®šã™ã‚‹ã“ã¨)。 + \param in 復å·ã•ã‚Œã‚‹ç½²åデータãŒæ ¼ç´ã•ã‚Œã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ + \param inLen ç½²åデータã®é•·ã• + \param out 復å·ãƒ‡ãƒ¼ã‚¿ã®å‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ + \param outLen 出力先ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º \param hash メッセージã«å…¥ã‚‹ãƒãƒƒã‚·ãƒ¥åž‹ \param mgf マスク生æˆæ©Ÿèƒ½è­˜åˆ¥å­ _Example_ @@ -356,8 +355,8 @@ RsaKey* key); /*! - \ingroup RSA - \brief 入力署åを復å·åŒ–ã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒRSAキーã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸã“ã¨ã‚’確èªã—ã¾ã™ã€‚出力ã¯å…¥åŠ›ã¨åŒã˜ãƒã‚¤ãƒˆé…列を使用ã—ã¾ã™ã€‚wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief 入力署åを復å·åŒ–ã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒRSAキーã«ã‚ˆã£ã¦ç½²åã•ã‚ŒãŸã“ã¨ã‚’確èªã—ã¾ã™ã€‚出力ã¯å…¥åŠ›ã¨åŒã˜ãƒã‚¤ãƒˆé…列を使用ã—ã¾ã™ã€‚WC_RSA_BLINDINGãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return >0 テキストã®é•·ã• \return <0 エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ \param in 復å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 @@ -406,8 +405,8 @@ enum wc_HashType hash, int mgf, RsaKey* key); /*! - \ingroup RSA - \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。塩ã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。ソルトã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。WC_RSA_BLINDINGãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return the PSSデータã®é•·ã•ãŒæˆåŠŸã—ã€è² ã«éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚ \return MEMORY_E メモリ例外 \param in 復å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 @@ -468,8 +467,8 @@ enum wc_HashType hash, int mgf, RsaKey* key); /*! - \ingroup RSA - \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。WC_RSA_BLINDINGãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return the PSSデータã®é•·ã•ãŒæˆåŠŸã—ã€è² ã«éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚ \return MEMORY_E メモリ例外 \param in 復å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 @@ -480,7 +479,7 @@ \param digestLen ãƒãƒƒã‚·ãƒ¥ã®é•·ã• \param hash ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ  \param mgf マスク生æˆæ©Ÿèƒ½ - \param saltLen 使用ã•ã‚Œã‚‹å¡©ã®é•·ã•ã€‚RSA_PSSS_SALT_LEN_DEFAULT(-1)塩ã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã¨åŒã˜ã§ã™ã€‚RSA_PSS_SALT_LEN_DISCOVERã¯ã€å¡©ã®é•·ã•ãŒãƒ‡ãƒ¼ã‚¿ã‹ã‚‰æ±ºå®šã•ã‚Œã¾ã™ã€‚ + \param saltLen 使用ã•ã‚Œã‚‹ã‚½ãƒ«ãƒˆã®é•·ã•ã€‚RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã¨åŒã˜ã§ã™ã€‚RSA_PSS_SALT_LEN_DISCOVERã¯ã€ã‚½ãƒ«ãƒˆã®é•·ã•ãŒãƒ‡ãƒ¼ã‚¿ã‹ã‚‰æ±ºå®šã•ã‚Œã¾ã™ã€‚ _Example_ \code ret = wc_InitRsaKey(&key, NULL); @@ -531,8 +530,8 @@ RsaKey* key); /*! - \ingroup RSA - \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。入力ãƒãƒƒãƒ•ã‚¡ã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å†åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚å¡©ã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。入力ãƒãƒƒãƒ•ã‚¡ã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å†åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚ソルトã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。WC_RSA_BLINDINGãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return the PSSデータã®é•·ã•ãŒæˆåŠŸã—ã€è² ã«éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚ \param in 復å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 \param inLen ã®é•·ã• @@ -589,8 +588,8 @@ enum wc_HashType hash, int mgf, RsaKey* key); /*! - \ingroup RSA - \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。入力ãƒãƒƒãƒ•ã‚¡ã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å†åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief RSA-PSSã§ç½²åã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’確èªã—ã¦ãã ã•ã„。入力ãƒãƒƒãƒ•ã‚¡ã¯å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å†åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚WC_RSA_BLINDINGãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return the PSSデータã®é•·ã•ãŒæˆåŠŸã—ã€è² ã«éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚ \param in 復å·åŒ–ã•ã‚Œã‚‹ãƒã‚¤ãƒˆé…列。 \param inLen ã®é•·ã• @@ -599,7 +598,7 @@ \param digestLen ãƒãƒƒã‚·ãƒ¥ã®é•·ã• \param hash メッセージã«å…¥ã‚‹ãƒãƒƒã‚·ãƒ¥åž‹ \param mgf マスク生æˆæ©Ÿèƒ½è­˜åˆ¥å­ - \param saltLen 使用ã•ã‚Œã‚‹å¡©ã®é•·ã•ã€‚RSA_PSSS_SALT_LEN_DEFAULT(-1)塩ã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã¨åŒã˜ã§ã™ã€‚RSA_PSS_SALT_LEN_DISCOVERã¯ã€å¡©ã®é•·ã•ãŒãƒ‡ãƒ¼ã‚¿ã‹ã‚‰æ±ºå®šã•ã‚Œã¾ã™ã€‚ + \param saltLen 使用ã•ã‚Œã‚‹ã‚½ãƒ«ãƒˆã®é•·ã•ã€‚RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã¨åŒã˜ã§ã™ã€‚RSA_PSS_SALT_LEN_DISCOVERã¯ã€ã‚½ãƒ«ãƒˆã®é•·ã•ãŒãƒ‡ãƒ¼ã‚¿ã‹ã‚‰æ±ºå®šã•ã‚Œã¾ã™ã€‚ _Example_ \code ret = wc_InitRsaKey(&key, NULL); @@ -649,8 +648,8 @@ RsaKey* key); /*! - \ingroup RSA - \brief PSSデータを確èªã—ã¦ã€ç½²åãŒä¸€è‡´ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚å¡©ã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。wc_rsa_blindingãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + \ingroup RSA + \brief PSSデータを確èªã—ã¦ã€ç½²åãŒä¸€è‡´ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚ソルトã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。WC_RSA_BLINDINGãŒæœ‰åŠ¹ãªå ´åˆã€ã‚­ãƒ¼ã¯WC_RSASETRNGã«ã‚ˆã£ã¦RNGã«é–¢é€£ä»˜ã‘られãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 \return BAD_PADDING_E PSSデータãŒç„¡åŠ¹ãªå ´åˆã€NULLãŒINã¾ãŸã¯SIGã¾ãŸã¯INSZã«æ¸¡ã•ã‚Œã‚‹ã¨ã€BAD_FUNC_ARGã¯ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã®é•·ã•ã¨åŒã˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 \return MEMORY_E メモリ例外 \param in 検証中ã®ãƒ‡ãƒ¼ã‚¿ã®ãƒãƒƒã‚·ãƒ¥ã€‚ @@ -702,8 +701,8 @@ word32 sigSz, enum wc_HashType hashType); /*! - \ingroup RSA - \brief PSSデータを確èªã—ã¦ã€ç½²åãŒä¸€è‡´ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚å¡©ã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。 + \ingroup RSA + \brief PSSデータを確èªã—ã¦ã€ç½²åãŒä¸€è‡´ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚ソルトã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã«ç­‰ã—ã„。 \return BAD_PADDING_E PSSデータãŒç„¡åŠ¹ãªå ´åˆã€NULLãŒINã¾ãŸã¯SIGã¾ãŸã¯INSZã«æ¸¡ã•ã‚Œã‚‹ã¨ã€BAD_FUNC_ARGã¯ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã®é•·ã•ã¨åŒã˜ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 \return MEMORY_E メモリ例外 \param in 検証中ã®ãƒ‡ãƒ¼ã‚¿ã®ãƒãƒƒã‚·ãƒ¥ã€‚ @@ -711,7 +710,7 @@ \param sig PSSデータをä¿æŒã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã€‚ \param sigSz PSSデータã®ã‚µã‚¤ã‚ºã€‚ \param hashType ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ  - \param saltLen 使用ã•ã‚Œã‚‹å¡©ã®é•·ã•ã€‚RSA_PSSS_SALT_LEN_DEFAULT(-1)塩ã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã¨åŒã˜ã§ã™ã€‚RSA_PSS_SALT_LEN_DISCOVERã¯ã€å¡©ã®é•·ã•ãŒãƒ‡ãƒ¼ã‚¿ã‹ã‚‰æ±ºå®šã•ã‚Œã¾ã™ã€‚ + \param saltLen 使用ã•ã‚Œã‚‹ã‚½ãƒ«ãƒˆã®é•·ã•ã€‚RSA_PSSS_SALT_LEN_DEFAULT(-1)ソルトã®é•·ã•ã¯ãƒãƒƒã‚·ãƒ¥é•·ã¨åŒã˜ã§ã™ã€‚RSA_PSS_SALT_LEN_DISCOVERã¯ã€ã‚½ãƒ«ãƒˆã®é•·ã•ãŒãƒ‡ãƒ¼ã‚¿ã‹ã‚‰æ±ºå®šã•ã‚Œã¾ã™ã€‚ _Example_ \code ret = wc_InitRsaKey(&key, NULL); @@ -755,7 +754,7 @@ int wc_RsaPSS_CheckPadding_ex(const byte* in, word32 inLen, byte* sig, word32 sigSz, enum wc_HashType hashType, int saltLen, int bits); /*! - \ingroup RSA + \ingroup RSA \brief æä¾›ã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã®æš—å·åŒ–サイズを返ã—ã¾ã™ã€‚ \return Success æä¾›ã•ã‚ŒãŸã‚­ãƒ¼æ§‹é€ ã®æš—å·åŒ–サイズ。 _Example_ @@ -769,7 +768,7 @@ int wc_RsaEncryptSize(RsaKey* key); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯Derフォーマットã•ã‚ŒãŸRSA秘密éµã‚’解æžã—ã€ç§˜å¯†éµã‚’抽出ã—ã€ãれを与ãˆã‚‰ã‚ŒãŸResakey構造ã«æ ¼ç´ã—ã¾ã™ã€‚IDXã«è§£æžã•ã‚ŒãŸè·é›¢ã‚‚設定ã—ã¾ã™ã€‚ \return 0 DERエンコード入力ã‹ã‚‰ç§˜å¯†éµã®è§£æžã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ \return ASN_PARSE_E 入力ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ç§˜å¯†éµã‚’解æžã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€å…¥åŠ›ç§˜å¯†éµãŒASN.1è¦æ ¼ã«å¾“ã£ã¦æ­£ã—ãフォーマットã•ã‚Œã¦ã„ãªã„å ´åˆã«ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ @@ -797,8 +796,8 @@ RsaKey* key, word32 inSz); /*! - \ingroup RSA - \brief ã“ã®é–¢æ•°ã¯Derフォーマットã®RSA公開éµã‚’解æžã—ã€å…¬é–‹éµã‚’抽出ã—ã€ãれを指定ã•ã‚ŒãŸResakey構造ã«æ ¼ç´ã—ã¾ã™ã€‚IDXã«è§£æžã•ã‚ŒãŸè·é›¢ã‚‚設定ã—ã¾ã™ã€‚ + \ingroup RSA + \brief ã“ã®é–¢æ•°ã¯Derフォーマットã®RSA公開éµã‚’解æžã—ã€å…¬é–‹éµã‚’抽出ã—ã€ãれを指定ã•ã‚ŒãŸRsaKey構造体ã«æ ¼ç´ã—ã¾ã™ã€‚IDXã«è§£æžã•ã‚ŒãŸè·é›¢ã‚‚設定ã—ã¾ã™ã€‚ \return 0 DERエンコード入力ã‹ã‚‰å…¬é–‹éµã®è§£æžã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚ŒãŸ \return ASN_PARSE_E 入力ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰å…¬é–‹éµã‚’解æžã—ãŸã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€å…¥åŠ›å…¬é–‹éµãŒASN.1è¦æ ¼ã«å¾“ã£ã¦æ­£ã—ãフォーマットã•ã‚Œã¦ã„ãªã„å ´åˆã«ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ \return ASN_OBJECT_ID_E ASN.1オブジェクトIDãŒRSA公開éµã®ãã‚Œã¨ä¸€è‡´ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -807,7 +806,7 @@ \return ASN_RSA_KEY_E RSAキー入力ã®å…¬é–‹éµè¦ç´ ã‚’読ã¿å–るエラーãŒã‚ã‚‹å ´åˆ \param input 復å·ã™ã‚‹å…¥åŠ›DERエンコードRSA公開éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inOutIdx キーãŒå§‹ã¾ã‚‹ãƒãƒƒãƒ•ã‚¡å†…ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼ˆé€šå¸¸ã¯0)。ã“ã®é–¢æ•°ã®å‰¯ä½œç”¨ã¨ã—ã¦ã€InoutIDXã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã‚’介ã—ã¦è§£æžã•ã‚ŒãŸè·é›¢ã‚’記憶ã—ã¾ã™ - \param key デコードã•ã‚ŒãŸå…¬é–‹éµã‚’ä¿å­˜ã™ã‚‹RSAKEY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param key デコードã•ã‚ŒãŸå…¬é–‹éµã‚’ä¿å­˜ã™ã‚‹RsaKey構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ _Example_ \code RsaKey pub; @@ -827,9 +826,9 @@ RsaKey* key, word32 inSz); /*! - \ingroup RSA - \brief ã“ã®é–¢æ•°ã¯ã€å…¬é–‹å¼¾æ€§çŽ‡ï¼ˆn)ã¨æŒ‡æ•°ï¼ˆe)を撮影ã—ã¦ã€RSA公開éµã®ç”Ÿã®è¦ç´ ã‚’復å·ã—ã¾ã™ã€‚ã“れらã®ç”Ÿã®è¦ç´ ã‚’æä¾›ã•ã‚ŒãŸRSAKEY構造体ã«æ ¼ç´ã—ã€æš—å·åŒ–/復å·åŒ–プロセスã§ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - \return 0 公開éµã®ç”Ÿã®è¦ç´ ã‚’RSAKEY構造ã«å¾©å·ã—ãŸã¨ãã«è¿”ã•ã‚ŒãŸ + \ingroup RSA + \brief ã“ã®é–¢æ•°ã¯ã€å…¬é–‹å¼¾æ€§çŽ‡ï¼ˆn)ã¨æŒ‡æ•°ï¼ˆe)を撮影ã—ã¦ã€RSA公開éµã®ç”Ÿã®è¦ç´ ã‚’復å·ã—ã¾ã™ã€‚ã“れらã®ç”Ÿã®è¦ç´ ã‚’æä¾›ã•ã‚ŒãŸRsaKey構造体ã«æ ¼ç´ã—ã€æš—å·åŒ–/復å·åŒ–プロセスã§ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \return 0 公開éµã®ç”Ÿã®è¦ç´ ã‚’RsaKey構造体ã«å¾©å·ã—ãŸã¨ãã«è¿”ã•ã‚ŒãŸ \return BAD_FUNC_ARG ã„ãšã‚Œã‹ã®å…¥åŠ›å¼•æ•°ãŒNULLã«è©•ä¾¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MP_INIT_E 複数ã®ç²¾å¯†æ•´æ•°ï¼ˆMP_INT)ライブラリã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã®æ•´æ•°ã®åˆæœŸåŒ–中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ \return ASN_GETINT_E æä¾›ã•ã‚ŒãŸRSAキーè¦ç´ ã€nã¾ãŸã¯eã®ã„ãšã‚Œã‹ã‚’読むエラーãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ @@ -856,12 +855,12 @@ const byte* e, word32 eSz, RsaKey* key); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®æ©Ÿèƒ½ã¯RSAKEYキーをDERフォーマットã«å¤‰æ›ã—ã¾ã™ã€‚çµæžœã¯å‡ºåŠ›ã«æ›¸ãè¾¼ã¾ã‚Œã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ - \return 0 æˆåŠŸ + \return >0 æˆåŠŸã€æ›¸ã‹ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã€‚ \return BAD_FUNC_ARG キーã¾ãŸã¯å‡ºåŠ›ãŒNULLã®å ´åˆã€ã¾ãŸã¯ã‚­ãƒ¼ - >タイプãŒRSA_PRIVATEã§ãªã„å ´åˆã€ã¾ãŸã¯INLENãŒå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«å分ãªå¤§ãã•ã§ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param key åˆæœŸåŒ–ã•ã‚ŒãŸRSAKEY構造 + \param key åˆæœŸåŒ–ã•ã‚ŒãŸRsaKey構造体 \param output 出力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ _Example_ \code @@ -888,7 +887,7 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®æ©Ÿèƒ½ã¯ã€ã©ã®ãƒ‘ディングを使用ã™ã‚‹ã‹ã‚’é¸æŠžã—ãªãŒã‚‰RSAæš—å·åŒ–を実行ã—ã¾ã™ã€‚ \return size 正常ã«æš—å·åŒ–ã•ã‚Œã¦ã„ã‚‹ã¨ã€æš—å·åŒ–ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ \return RSA_BUFFER_E RSAãƒãƒƒãƒ•ã‚¡ã‚¨ãƒ©ãƒ¼ã€å‡ºåŠ›ãŒå°ã•ã™ãŽãŸã‚Šå…¥åŠ›ãŒå¤§ãã™ãŽãŸã‚Šã™ã‚‹ @@ -896,7 +895,7 @@ \param inLen æš—å·åŒ–ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®é•·ã• \param out æš—å·åŒ–ã•ã‚ŒãŸMSGãŒä½œæˆã•ã‚Œã¾ã—㟠\param outLen æš—å·åŒ–ã•ã‚ŒãŸMSGã‚’ä¿æŒã™ã‚‹ãŸã‚ã«åˆ©ç”¨å¯èƒ½ãªãƒãƒƒãƒ•ã‚¡ã®é•·ã• - \param key åˆæœŸåŒ–RSAキー構造体 + \param key åˆæœŸåŒ–ãšã¿RsaKey構造体 \param rng åˆæœŸåŒ–ã•ã‚ŒãŸWC_RNG構造体 \param type 使用ã™ã‚‹ãƒ‘ディングã®ç¨®é¡žï¼ˆWC_RSA_OAEP_PADã¾ãŸã¯WC_RSA_PKCSV15_PAD) \param hash 使用ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ã®ç¨®é¡žï¼ˆé¸æŠžã¯hash.hã«ã‚ã‚Šã¾ã™ï¼‰ @@ -925,7 +924,7 @@ enum wc_HashType hash, int mgf, byte* label, word32 labelSz); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯RSAを使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·åŒ–ã—ã€ã©ã®ãƒ‘ディングタイプã®ã‚ªãƒ—ションを指定ã—ã¾ã™ã€‚ \return size 復å·åŒ–ãŒæˆåŠŸã™ã‚‹ã¨ã€å¾©å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E å¿…è¦ãªé…列をMallocã«Mallocã«ã™ã‚‹ã®ã«å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ @@ -934,7 +933,7 @@ \param inLen 復å·åŒ–ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®é•·ã• \param out 復å·åŒ–ã•ã‚ŒãŸMSGãŒä½œæˆã•ã‚Œã¾ã—㟠\param outLen 復å·åŒ–ã•ã‚ŒãŸMSGã‚’ä¿æŒã™ã‚‹ãŸã‚ã«åˆ©ç”¨å¯èƒ½ãªãƒãƒƒãƒ•ã‚¡ã®é•·ã• - \param key åˆæœŸåŒ–RSAキー構造体 + \param key åˆæœŸåŒ–ãšã¿RsaKey構造体 \param type 使用ã™ã‚‹ãƒ‘ディングã®ç¨®é¡žï¼ˆWC_RSA_OAEP_PADã¾ãŸã¯WC_RSA_PKCSV15_PAD) \param hash 使用ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ã®ç¨®é¡žï¼ˆé¸æŠžã¯hash.hã«ã‚ã‚Šã¾ã™ï¼‰ \param mgf 使用ã™ã‚‹ãƒžã‚¹ã‚¯ç”Ÿæˆæ©Ÿèƒ½ã®ç¨®é¡ž @@ -968,7 +967,7 @@ enum wc_HashType hash, int mgf, byte* label, word32 labelSz); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯RSAを使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’インラインã§å¾©å·åŒ–ã—ã€ã©ã®ãƒ‘ディングタイプã®ã‚ªãƒ—ションを示ã—ã¾ã™ã€‚INãƒãƒƒãƒ•ã‚¡ã«ã¯ã€å‘¼ã³å‡ºã•ã‚ŒãŸå¾Œã«å¾©å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå«ã¾ã‚Œã€ã‚¢ã‚¦ãƒˆãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã¯ãƒ—レーンテキストãŒã‚る「INã€ãƒãƒƒãƒ•ã‚¡å†…ã®å ´æ‰€ã‚’指ã—ã¾ã™ã€‚ \return size 復å·åŒ–ãŒæˆåŠŸã™ã‚‹ã¨ã€å¾©å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E: å¿…è¦ãªé…列をMallocã«Mallocã«ã™ã‚‹ã®ã«å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ @@ -978,7 +977,7 @@ \param in 復å·åŒ–ã®ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param inLen 復å·åŒ–ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã®é•·ã• \param out "in"ãƒãƒƒãƒ•ã‚¡ã®å¾©å·åŒ–ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä½ç½®ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param key åˆæœŸåŒ–RSAキー構造体 + \param key åˆæœŸåŒ–ãšã¿RsaKey構造体 \param type 使用ã™ã‚‹ãƒ‘ディングã®ç¨®é¡žï¼ˆWC_RSA_OAEP_PADã¾ãŸã¯WC_RSA_PKCSV15_PAD) \param hash 使用ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ã®ç¨®é¡žï¼ˆé¸æŠžã¯hash.hã«ã‚ã‚Šã¾ã™ï¼‰ \param mgf 使用ã™ã‚‹ãƒžã‚¹ã‚¯ç”Ÿæˆæ©Ÿèƒ½ã®ç¨®é¡ž @@ -1013,8 +1012,8 @@ int mgf, byte* label, word32 labelSz); /*! - \ingroup RSA - \brief RSAアルゴリズムã«ä½¿ç”¨ã•ã‚Œã‚‹å€‹ã€…ã®è¦ç´ ï¼ˆEã€N)ã«RSAKEY構造体を平らã«ã—ã¾ã™ã€‚ + \ingroup RSA + \brief RSAアルゴリズムã«ä½¿ç”¨ã•ã‚Œã‚‹RsaKey構造体ã®å€‹ã€…ã®è¦ç´ ï¼ˆEã€N)をãƒãƒƒãƒ•ã‚¡ã«å–り出ã—ã¾ã™ã€‚ \return 0 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã¯ã€ã‚¨ãƒ©ãƒ¼ãªã—ã§è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG: ã„ãšã‚Œã‹ã®ãƒ‘ラメータãŒNULL値ã§æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return RSA_BUFFER_E: 渡ã•ã‚ŒãŸeã¾ãŸã¯nãƒãƒƒãƒ•ã‚¡ãŒæ­£ã—ã„サイズã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -1046,13 +1045,13 @@ word32* nSz); /*! - \ingroup RSA + \ingroup RSA \brief RSA公開éµã‚’DERフォーマットã«å¤‰æ›ã—ã¾ã™ã€‚出力ã«æ›¸ãè¾¼ã¿ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ \return >0 æˆåŠŸã€æ›¸ã‹ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã€‚ \return BAD_FUNC_ARG キーã¾ãŸã¯å‡ºåŠ›ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E エラー割り当ã¦ãƒ¡ãƒ¢ãƒªãŒç™ºç”Ÿã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return <0 エラー - \param key 変æ›ã™ã‚‹RSAキー構造。 + \param key 変æ›ã™ã‚‹RsaKey構造体。 \param output ä¿ç•™ã•ã‚ŒãŸå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚(NULLãŒé•·ã•ã®ã¿ã‚’è¿”ã™å ´åˆï¼‰ _Example_ \code @@ -1074,13 +1073,13 @@ int wc_RsaKeyToPublicDer(RsaKey* key, byte* output, word32 inLen); /*! - \ingroup RSA + \ingroup RSA \brief RSA公開éµã‚’DERフォーマットã«å¤‰æ›ã—ã¾ã™ã€‚出力ã«æ›¸ãè¾¼ã¿ã€æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚with_headerãŒ0ã®å ´åˆï¼ˆseq + n + e)ã ã‘ãŒASN.1 Derフォーマットã§è¿”ã•ã‚Œã€ãƒ˜ãƒƒãƒ€ãƒ¼ã‚’除外ã—ã¾ã™ã€‚ \return >0 æˆåŠŸã€æ›¸ã‹ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã€‚ \return BAD_FUNC_ARG キーã¾ãŸã¯å‡ºåŠ›ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E エラー割り当ã¦ãƒ¡ãƒ¢ãƒªãŒç™ºç”Ÿã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return <0 エラー - \param key 変æ›ã™ã‚‹RSAキー構造。 + \param key 変æ›ã™ã‚‹RsaKey構造体。 \param output ä¿ç•™ã•ã‚ŒãŸå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚(NULLãŒé•·ã•ã®ã¿ã‚’è¿”ã™å ´åˆï¼‰ _Example_ \code @@ -1103,12 +1102,12 @@ int with_header); /*! - \ingroup RSA - \brief ã“ã®é–¢æ•°ã¯ã€é•·ã•ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã®RSA秘密éµã‚’生æˆã—ã€æŒ‡æ•°ï¼ˆe)を指定ã—ã¾ã™ã€‚次ã«ã€ã“ã®ã‚­ãƒ¼ã‚’æä¾›ã•ã‚ŒãŸRSAKEY構造体ã«æ ¼ç´ã™ã‚‹ãŸã‚ã€æš—å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã§ãã¾ã™ã€‚Eã«ä½¿ç”¨ã™ã‚‹ã‚»ã‚­ãƒ¥ã‚¢ç•ªå·ã¯65537ã§ã™ã€‚サイズã¯ã€RSA_MIN_SIZEよりも大ããã€RSA_MAX_SIZEよりも大ãããªã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ãŒåˆ©ç”¨å¯èƒ½ã§ã‚ã‚‹ãŸã‚ã€ã‚³ãƒ³ãƒ‘イル時ã«ã‚ªãƒ—ションwolfssl_key_genを有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯ã€ - を使用ã—ã¦ãã ã•ã„./configureを使用ã™ã‚‹å ´åˆã¯ã€-enable-keygenã§å®Ÿç¾ã§ãã¾ã™ã€‚ + \ingroup RSA + \brief ã“ã®é–¢æ•°ã¯ã€é•·ã•ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã®RSA秘密éµã‚’生æˆã—ã€æŒ‡æ•°ï¼ˆe)を指定ã—ã¾ã™ã€‚次ã«ã€ã“ã®ã‚­ãƒ¼ã‚’æä¾›ã•ã‚ŒãŸRsaKey構造体ã«æ ¼ç´ã™ã‚‹ãŸã‚ã€æš—å·åŒ–/復å·åŒ–ã«ä½¿ç”¨ã§ãã¾ã™ã€‚Eã«ä½¿ç”¨ã™ã‚‹ã‚»ã‚­ãƒ¥ã‚¢ç•ªå·ã¯65537ã§ã™ã€‚サイズã¯ã€RSA_MIN_SIZEよりも大ããã€RSA_MAX_SIZEよりも大ãããªã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ãŒåˆ©ç”¨å¯èƒ½ã§ã‚ã‚‹ãŸã‚ã€ã‚³ãƒ³ãƒ‘イル時ã«ã‚ªãƒ—ションwolfssl_key_genを有効ã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯ã€ - を使用ã—ã¦ãã ã•ã„./configureを使用ã™ã‚‹å ´åˆã¯ã€-enable-keygenã§å®Ÿç¾ã§ãã¾ã™ã€‚ \return 0 RSA秘密éµã®ç”Ÿæˆã«æˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã—㟠\return BAD_FUNC_ARG 入力引数ã®ã„ãšã‚Œã‹ãŒNULLã®å ´åˆã€ã‚µã‚¤ã‚ºãƒ‘ラメータã¯å¿…è¦ãªç¯„囲外ã«ã‚ã‚‹ã‹ã€eãŒèª¤ã£ã¦é¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆ \return RNG_FAILURE_E æä¾›ã•ã‚ŒãŸRNG構造体を使用ã—ã¦ãƒ©ãƒ³ãƒ€ãƒ ãƒ–ロックを生æˆã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ - \return MP_INIT_E + \return MP_INIT_E \return MP_READ_E RSAキーã®ç”Ÿæˆä¸­ã«ä½¿ç”¨ã•ã‚ŒãŸæ•°å­¦ãƒ©ã‚¤ãƒ–ラリã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚ŒãŸRSAキーã®ç”Ÿæˆä¸­ã«ä½¿ç”¨ã•ã‚ŒãŸæ•°å­¦ãƒ©ã‚¤ãƒ–ラリã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ \return MP_CMP_E RSAキーã®ç”Ÿæˆä¸­ã«ä½¿ç”¨ã•ã‚Œã¦ã„る数学ライブラリã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ \return MP_INVMOD_E RSAキーã®ç”Ÿæˆä¸­ã«ä½¿ç”¨ã•ã‚Œã¦ã„る数学ライブラリã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ @@ -1143,7 +1142,7 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯ã€ãƒ–ロックã•ã‚Œã¦ã„ãªã„RSAコンテキストを設定ã—ã¾ã™ã€‚RSANBコンテキストãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€RSA関数を多ãã®å°ã•ãªæ“作ã«åˆ†å‰²ã™ã‚‹é«˜é€Ÿæ•°å­¦ãƒ™ãƒ¼ã‚¹ã®éžãƒ–ロッキングEXPTMODãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚wc_rsa_nonblockãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹ã¨ãã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG キーã¾ãŸã¯NBãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -1179,11 +1178,11 @@ int wc_RsaSetNonBlock(RsaKey* key, RsaNb* nb); /*! - \ingroup RSA + \ingroup RSA \brief ã“ã®é–¢æ•°ã¯æœ€å¤§ãƒ–ロック時間ã®æœ€å¤§ãƒ–ロック時間をマイクロ秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚ãã‚Œã¯ã€ãƒ¡ã‚¬ãƒ˜ãƒ«ãƒ„ã®CPU速度ã¨å…±ã«äº‹å‰è¨ˆç®—ã•ã‚ŒãŸãƒ†ãƒ¼ãƒ–ル(TFM.cexptModnbinstã‚’å‚照)を使用ã—ã¦ã€æä¾›ã•ã‚ŒãŸæœ€å¤§ãƒ–ロック時間内ã«æ¬¡ã®å‹•ä½œã‚’完了ã§ãã‚‹ã‹ã©ã†ã‹ã‚’判断ã—ã¾ã™ã€‚wc_rsa_nonblock_timeãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹ã¨ãã«æœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG キーãŒNULLã®å ´åˆã€ã¾ãŸã¯WC_RSASETNONBLOCKãŒä»¥å‰ã«å‘¼ã³å‡ºã•ã‚Œã€ã‚­ãƒ¼ - > NBã¯NULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param key RSAキー構造 + \param key RsaKey構造体 \param maxBlockUs マイクロ秒をブロックã™ã‚‹æœ€å¤§æ™‚間。 _Example_ \code diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/srp.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/srp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/srp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/srp.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /*! - \ingroup SRP + \ingroup SRP \brief 使用方法ã®ãŸã‚ã«SRP構造体をåˆæœŸåŒ–ã—ã¾ã™ã€‚ \return 0 æˆåŠŸã—ã¦ã„ã¾ã™ã€‚ \return BAD_FUNC_ARG SRPãªã©ã®å¼•æ•°ãŒNULLã¾ãŸã¯SRPSIDEã®å•é¡ŒãŒã‚ã‚‹å ´åˆã¯ã€SRP_CLIENT_SIESã¾ãŸã¯SRP_SERVER_SIEDã§ã¯å•é¡ŒãŒã‚ã‚‹å ´åˆã«è¿”ã—ã¾ã™ã€‚ @@ -25,7 +25,7 @@ int wc_SrpInit(Srp* srp, SrpType type, SrpSide side); /*! - \ingroup SRP + \ingroup SRP \brief 使用後ã«SRP構造リソースを解放ã—ã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ _Example_ @@ -40,7 +40,7 @@ void wc_SrpTerm(Srp* srp); /*! - \ingroup SRP + \ingroup SRP \brief ユーザーåを設定ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wc_srpinitã®å¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 ユーザーåã¯æ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG: srpã¾ãŸã¯usernameãŒnullã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ @@ -68,7 +68,7 @@ int wc_SrpSetUsername(Srp* srp, const byte* username, word32 size); /*! - \ingroup SRP + \ingroup SRP \brief ユーザーåã«åŸºã¥ã„ã¦SRPパラメータを設定ã—ã¾ã™.. wc_srpsetuserNameã®å¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG SRPã€Nã€Gã€ã¾ãŸã¯SALTãŒNULLã®å ´åˆã€ã¾ãŸã¯NSZ sideãŒsrp_client_sideã«è¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€‚ @@ -147,7 +147,7 @@ int wc_SrpSetPassword(Srp* srp, const byte* password, word32 size); /*! - \ingroup SRP + \ingroup SRP \brief 検証者を設定ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wc_srpsetparamsã®å¾Œã«å‘¼ã³å‡ºã•ã‚Œã€ã‚µãƒ¼ãƒãƒ¼å´ã®ã¿ã§ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG SRPã¾ãŸã¯VerifierãŒNULLã¾ãŸã¯SRP-> ISã®å ´åˆã€SRP_SERVER_SIEDã§ã¯ãªãè¿”ã•ã‚Œã¾ã™ã€‚ @@ -182,7 +182,7 @@ int wc_SrpSetVerifier(Srp* srp, const byte* verifier, word32 size); /*! - \ingroup SRP + \ingroup SRP \brief 検証者をå–å¾—ã—ã¾ã™ã€‚クライアントã¯V = g ^ xï¼…Nã§æ¤œè¨¼è€…を計算ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wc_srpsetpasswordã®å¾Œã«å‘¼ã³å‡ºã•ã‚Œã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ã§ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG SRPã€Verifierã€ã¾ãŸã¯SizeãŒNULLã®å ´åˆã€ã¾ãŸã¯SRP-> SIDEãŒSRP_CLIENT_SIEDã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -222,7 +222,7 @@ int wc_SrpGetVerifier(Srp* srp, byte* verifier, word32* size); /*! - \ingroup SRP + \ingroup SRP \brief プライベートã®ã‚¨ãƒ•ã‚§ãƒ©ãƒ«å€¤ã‚’設定ã—ã¾ã™ã€‚プライベートã®ä¸€æ™‚çš„ãªå€¤ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®Aã¨ã—ã¦çŸ¥ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚サーãƒãƒ¼å´ã®and random()b。b = random()ã“ã®é–¢æ•°ã¯ã€ãƒ¦ãƒ‹ãƒƒãƒˆãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã€ã¾ãŸã¯é–‹ç™ºè€…ãŒå¤–部ランダムソースを使用ã—ã¦ã‚¨ãƒ•ã‚§ãƒ¡ãƒ©ãƒ«å€¤ã‚’設定ã—ãŸã„å ´åˆã¯ä¾¿åˆ©ã§ã™ã€‚ã“ã®é–¢æ•°ã¯ã€WC_SRPGetPublicã®å‰ã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG SRPã€Privateã€ã¾ãŸã¯SizeãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -258,7 +258,7 @@ int wc_SrpSetPrivate(Srp* srp, const byte* priv, word32 size); /*! - \ingroup SRP + \ingroup SRP \brief 公共ã®ä¸€æ™‚çš„ãªå€¤ã‚’å–å¾—ã—ã¾ã™ã€‚公共ã®ä¸€æ™‚çš„ãªå€¤ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®Aã¨ã—ã¦çŸ¥ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚サーãƒå´ã®A = g ^ Aï¼…n b。B =(k * v +(g bï¼…n))%n wc_srpsetpasswordã¾ãŸã¯wc_srpsetverifierã®å¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚関数WC_SRPSetPrivateã¯ã€WC_SRPGetPublicã®å‰ã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG srpã€pubã€ã¾ãŸã¯sizeãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -300,7 +300,7 @@ int wc_SrpGetPublic(Srp* srp, byte* pub, word32* size); /*! - \ingroup SRP + \ingroup SRP \brief セッションキーを計算ã—ã¾ã™ã€‚æˆåŠŸå¾Œã«SRP->キーã§ã‚­ãƒ¼ã‚’アクセスã§ãã¾ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG SRPã€ClientPubKeyã€ã¾ãŸã¯ServerPubKeyã®å ´åˆã€ã¾ãŸã¯ClientPubkeyszã¾ãŸã¯ServerPubKeyszãŒ0ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -344,7 +344,7 @@ byte* serverPubKey, word32 serverPubKeySz); /*! - \ingroup SRP + \ingroup SRP \brief 証明をå–å¾—ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wc_srpcomputekeyã®å¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 æˆåŠŸ \return BAD_FUNC_ARG SRPã€PROVã€ã¾ãŸã¯SIZEãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ @@ -370,7 +370,7 @@ int wc_SrpGetProof(Srp* srp, byte* proof, word32* size); /*! - \ingroup SRP + \ingroup SRP \brief ピアプルーフを確èªã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€WC_SRPGetSessionKeyã®å‰ã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 æˆåŠŸ \return <0 エラー diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/doc/dox_comments/header_files-ja/ssl.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,8 @@ /*! - \brief - \return pointer ã“ã®é–¢æ•°ã¯ã€æ–°ã—ã„wolfssl_method構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯DTLS v1.2 クライアントメソッドをåˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return 作æˆã«æˆåŠŸã—ãŸå ´åˆã¯ã€WOLFSSL_METHODãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return メモリ割り当ã¦ã‚¨ãƒ©ãƒ¼ã¾ãŸã¯ãƒ¡ã‚½ãƒƒãƒ‰ã®ä½œæˆã®å¤±æ•—ã®å ´åˆã¯NULLã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code wolfSSL_Init(); @@ -15,10 +17,11 @@ WOLFSSL_METHOD *wolfDTLSv1_2_client_method_ex(void* heap); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€Wolfsslv23_client_methodã¨åŒæ§˜ã®wolfssl_methodã‚’è¿”ã—ã¾ã™ï¼ˆã‚µãƒ¼ãƒãƒ¼/クライアント)。 - \return WOLFSSL_METHOD* æˆåŠŸã—ãŸä½œæˆã§ã¯ã€wolfssl_methodãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ - \return NULL メモリ割り当ã¦ã‚¨ãƒ©ãƒ¼ã¾ãŸã¯ãƒ¡ã‚½ãƒƒãƒ‰ã®ä½œæˆã®å¤±æ•—ã®å ´åˆã¯null + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€wolfSSLv23_client_methodã¨åŒæ§˜ã«WOLFSSL_METHODã‚’è¿”ã—ã¾ã™ï¼ˆã‚µãƒ¼ãƒãƒ¼/クライアント)。 + \return 作æˆã«æˆåŠŸã—ãŸå ´åˆã¯ã€WOLFSSL_METHODãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return メモリ割り当ã¦ã‚¨ãƒ©ãƒ¼ã¾ãŸã¯ãƒ¡ã‚½ãƒƒãƒ‰ã®ä½œæˆã®å¤±æ•—ã®å ´åˆã¯NULLã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code WOLFSSL* ctx; @@ -31,10 +34,12 @@ WOLFSSL_METHOD *wolfSSLv23_method(void); /*! - \ingroup Setup - \brief WOLFSSLV3_SERVER_METHOD()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€SSL 3.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfSSLv3_server_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€SSL3.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -61,10 +66,12 @@ WOLFSSL_METHOD *wolfSSLv3_server_method(void); /*! - \ingroup Setup - \brief wolfsslv3_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€SSL 3.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfSSLv3_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€SSL 3.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -91,10 +98,12 @@ WOLFSSL_METHOD *wolfSSLv3_client_method(void); /*! - \ingroup Setup - \brief WOLFTLSV1_SERVER_METHOD()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfTLSv1_server_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -121,10 +130,12 @@ WOLFSSL_METHOD *wolfTLSv1_server_method(void); /*! - \ingroup Setup - \brief wolftlsv1_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€TLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolftlsv1_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€TLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -151,10 +162,12 @@ WOLFSSL_METHOD *wolfTLSv1_client_method(void); /*! - \ingroup Setup - \brief WOLFTLSV1_1_SERVER_METHOD()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.1プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfTLSv1_1_server_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.1プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -181,10 +194,12 @@ WOLFSSL_METHOD *wolfTLSv1_1_server_method(void); /*! - \ingroup Setup - \brief WOLFTLSV1_1_CLIENT_METHOD()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€TLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfTLSv1_1_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€TLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -211,10 +226,12 @@ WOLFSSL_METHOD *wolfTLSv1_1_client_method(void); /*! - \ingroup Setup - \brief WOLFTLSV1_2_SERVER_METHOD()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.2プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfTLSv1_2_server_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.2プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -241,10 +258,12 @@ WOLFSSL_METHOD *wolfTLSv1_2_server_method(void); /*! - \ingroup Setup - \brief wolftlsv1_2_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€TLS 1.2プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfTLSv1_2_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€TLS 1.2プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code #include @@ -271,10 +290,13 @@ WOLFSSL_METHOD *wolfTLSv1_2_client_method(void); /*! - \ingroup Setup - \brief wolfdtlsv1_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€DTLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€WolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ - enable-dtlsã€ã¾ãŸã¯WolfSSL_DTLSを定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfdtlsv1_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚Šã€DTLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€WolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ--enable-dtlsã€ã¾ãŸã¯WOLFSSL_DTLSを定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ãƒ“ルドã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code WOLFSSL_METHOD* method; @@ -299,10 +321,13 @@ WOLFSSL_METHOD *wolfDTLSv1_client_method(void); /*! - \ingroup Setup - \brief WOLFDTLSV1_SERVER_METHOD()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€DTLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€WolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ - enable-dtlsã€ã¾ãŸã¯WolfSSL_DTLSを定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return FAIL xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfDTLSv1_server_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€DTLS 1.0プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€WolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ--enable-dtlsã€ã¾ãŸã¯WOLFSSL_DTLSマクロを定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ãƒ“ルドã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code WOLFSSL_METHOD* method; @@ -327,8 +352,9 @@ WOLFSSL_METHOD *wolfDTLSv1_server_method(void); /*! - \brief サーãƒå´ã€‚ - \return This 関数ã¯wolfssl_methodãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \brief wolfDTLSv1_2_server_method()関数ã¯ã‚µãƒ¼ãƒå´ç”¨ã«WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new(wolfDTLSv1_2_server_method()); @@ -340,10 +366,165 @@ WOLFSSL_METHOD *wolfDTLSv1_2_server_method(void); /*! - \ingroup Setup - \brief Chacha-Poly Aead Constructionã®æœ€åˆã®ãƒªãƒªãƒ¼ã‚¹ã¨æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®é–“ã«ã„ãã¤ã‹ã®é•ã„ãŒã‚ã‚‹ãŸã‚ã€å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã‚µãƒ¼ãƒãƒ¼/クライアントã¨é€šä¿¡ã™ã‚‹ã‚ªãƒ—ションを追加ã—ã¾ã—ãŸã€‚デフォルトã§ã¯ã€WolfSSLã¯æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¾ã™ã€‚ - \return 0 æˆåŠŸã™ã‚‹ã¨ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup Setup + + \brief wolfDTLSv1_3_server_method()関数ã¯ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€DTLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€WolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ--enable-dtls13ã€ã¾ãŸã¯WOLFSSL_DTLS13を定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ãƒ“ルドã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ + + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \param ãªã— + + _Example_ + \code + WOLFSSL_METHOD* method; + WOLFSSL_CTX* ctx; + + method = wolfDTLSv1_3_server_method(); + if (method == NULL) { + // unable to get method + } + + ctx = wolfSSL_CTX_new(method); + ... + \endcode + + + \sa wolfDTLSv1_3_client_method +*/ + +WOLFSSL_METHOD *wolfDTLSv1_3_server_method(void); + +/*! + \ingroup Setup + + \brief wolfDTLSv1_3_client_method()関数ã¯ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€DTLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€WolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ--enable-dtls13ã€ã¾ãŸã¯WOLFSSL_DTLS13を定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ãƒ“ルドã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ + + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \param ãªã— + + + _Example_ + \code + WOLFSSL_METHOD* method; + WOLFSSL_CTX* ctx; + + method = wolfDTLSv1_3_client_method(); + if (method == NULL) { + // unable to get method + } + + ctx = wolfSSL_CTX_new(method); + ... + \endcode + + + \sa wolfDTLSv1_3_server_method +*/ +WOLFSSL_METHOD* wolfDTLSv1_3_client_method(void); + +/*! + \ingroup Setup + + \brief wolfDTLS_server_method()関数ã¯ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€ + å¯èƒ½ãªé™ã‚Šé«˜ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®DTLSプロトコルをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + デフォルトã®æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯WOLFSSL_MIN_DTLS_DOWNGRADEマクロã§ã®æŒ‡å®šã‚’ã‚‚ã¨ã«ã—ã¦ã„ã¦ã€ + 実行時ã«wolfSSL_SetMinVersion()ã§å¤‰æ›´ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€WolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ--enable-dtlsã€ã¾ãŸã¯WOLFSSL_DTLSを定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ãƒ“ルドã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ + + + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \param ãªã— + + _Example_ + \code + WOLFSSL_METHOD* method; + WOLFSSL_CTX* ctx; + + method = wolfDTLS_server_method(); + if (method == NULL) { + // unable to get method + } + + ctx = wolfSSL_CTX_new(method); + ... + \endcode + + + \sa wolfDTLS_client_method + \sa wolfSSL_SetMinVersion +*/ +WOLFSSL_METHOD *wolfDTLS_server_method(void); + +/*! + \ingroup Setup + + \brief wolfDTLS_client_method()関数㯠アプリケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€ + å¯èƒ½ãªé™ã‚Šé«˜ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®DTLSプロトコルをサãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + デフォルトã®æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯WOLFSSL_MIN_DTLS_DOWNGRADEマクロã§ã®æŒ‡å®šã‚’ã‚‚ã¨ã«ã—ã¦ã„ã¦ã€ + 実行時ã«wolfSSL_SetMinVersion()ã§å¤‰æ›´ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSL_ctx_new()を使用ã—ã¦SSL/TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„WOLFSSL_METHOD構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSLãŒDTLSサãƒãƒ¼ãƒˆï¼ˆ--enable-dtlsã€ã¾ãŸã¯WOLFSSL_DTLSを定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ï¼‰ãƒ“ルドã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚ + + + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return XMALLOCを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \param ãªã— + + + _Example_ + \code + WOLFSSL_METHOD* method; + WOLFSSL_CTX* ctx; + + method = wolfDTLS_client_method(); + if (method == NULL) { + // unable to get method + } + + ctx = wolfSSL_CTX_new(method); + ... + \endcode + + + \sa wolfDTLS_server_method + \sa wolfSSL_SetMinVersion +*/ +WOLFSSL_METHOD *wolfDTLS_client_method(void); + +/*! + \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ç”¨ã«WOLFSSL_METHOD構造体を生æˆã—ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + + \param ãªã— + + _Example_ + \code + WOLFSSL_CTX* ctx = wolfSSL_CTX_new(wolfDTLSv1_2_server_method()); + WOLFSSL* ssl = WOLFSSL_new(ctx); + … + \endcode + + \sa wolfSSL_CTX_new +*/ +WOLFSSL_METHOD *wolfDTLSv1_2_server_method(void); + + +/*! + \ingroup Setup + \brief Chacha-Poly Aead Constructionã®æœ€åˆã®ãƒªãƒªãƒ¼ã‚¹ã¨æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®é–“ã«ã„ãã¤ã‹ã®é•ã„ãŒã‚ã‚‹ãŸã‚〠+ å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã‚µãƒ¼ãƒãƒ¼/クライアントã¨é€šä¿¡ã™ã‚‹ã‚ªãƒ—ションを追加ã—ã¾ã—ãŸã€‚ + デフォルトã§ã¯ã€wolfSSLã¯æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¾ã™ã€‚ + \return 0 æˆåŠŸã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã—ãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -360,12 +541,16 @@ int wolfSSL_use_old_poly(WOLFSSL* ssl, int value); /*! - \brief セッション状態ã“ã‚Œã«ã‚ˆã‚Šã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸå¾Œã«æŽ¥ç¶šã‚’ピックアップã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - \return Success æˆåŠŸã—ãŸå ´åˆã€èª­ã¿å–ã£ãŸãƒãƒƒãƒ•ã‚¡ã®é‡ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \return Failure ã™ã¹ã¦ã®å¤±æ•—ã—ãŸæˆ»ã‚Šå€¤ã¯0未満ã«ãªã‚Šã¾ã™ã€‚ - \return VERSION_ERROR ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´ãŒè¦‹ã¤ã‹ã£ãŸå ´åˆã€IE DTLS V1ã¨CTXãŒDTLS V1.2ã«è¨­å®šã•ã‚ŒãŸå ´åˆã€Version_ErrorãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param buf インãƒãƒ¼ãƒˆã™ã‚‹ã‚·ãƒªã‚¢ãƒ«åŒ–ã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã€‚ + \brief wolfSSL_dtls_import()関数ã¯ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³çŠ¶æ…‹ã‚’解æžã™ã‚‹ãŸã‚ã«ä½¿ã‚ã‚Œã¾ã™ã€‚ + ã“ã‚Œã«ã‚ˆã‚Šã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸå¾Œã«æŽ¥ç¶šã‚’ピックアップã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€èª­ã¿å–ã£ãŸãƒãƒƒãƒ•ã‚¡ã®é‡ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return ã™ã¹ã¦ã®å¤±æ•—ã—ãŸæˆ»ã‚Šå€¤ã¯0未満ã«ãªã‚Šã¾ã™ã€‚ + \return VERSION_ERROR ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´ãŒè¦‹ã¤ã‹ã£ãŸå ´åˆã€(ã™ãªã‚ã¡ã€DTLS v1ã¨CTXãŒDTLS v1.2ã«è¨­å®šã•ã‚ŒãŸå ´åˆ)ã€Version_ErrorãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param buf インãƒãƒ¼ãƒˆã™ã‚‹ã‚·ãƒªã‚¢ãƒ«åŒ–ã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³æƒ…報を格ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param sz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL* ssl; @@ -393,10 +578,14 @@ /*! - \brief 接続ã®çŠ¶æ…‹ã‚’インãƒãƒ¼ãƒˆã—ã¾ã™ã€‚警告:BUFã«ã¯ã€çŠ¶æ…‹ã«é–¢ã™ã‚‹æ©Ÿå¯†æƒ…å ±ãŒå«ã¾ã‚Œã¦ãŠã‚Šã€ä¿å­˜ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ä¿å­˜ã™ã‚‹å‰ã«æš—å·åŒ–ã•ã‚Œã‚‹ã®ãŒæœ€å–„ã§ã™ã€‚追加ã®ãƒ‡ãƒãƒƒã‚°æƒ…報をマクロwolfssl_session_export_debugãŒå®šç¾©ã—ã¦è¡¨ç¤ºã§ãã¾ã™ã€‚ - \return the ãƒãƒƒãƒ•ã‚¡ 'BUF'ã‹ã‚‰èª­ã¿è¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•° - \param ssl セッションをインãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®WolfSSL構造 - \param buf シリアル化ã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ + \brief シリアライズã•ã‚ŒãŸTLSセッションをインãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + 警告:bufã«ã¯ã€çŠ¶æ…‹ã«é–¢ã™ã‚‹æ©Ÿå¯†æƒ…å ±ãŒå«ã¾ã‚Œã¦ãŠã‚Šã€ä¿å­˜ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ä¿å­˜ã™ã‚‹å‰ã«æš—å·åŒ–ã•ã‚Œã‚‹ã®ãŒæœ€å–„ã§ã™ã€‚ + 追加ã®ãƒ‡ãƒãƒƒã‚°æƒ…報をマクロWOLFSSL_SESSION_EXPORT_DEBUGを定義ã—ã¦è¡¨ç¤ºã§ãã¾ã™ã€‚ + \return ãƒãƒƒãƒ•ã‚¡'buf'ã‹ã‚‰èª­ã¿è¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ + \param ssl セッションをインãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param buf シリアル化ã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param sz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \sa wolfSSL_dtls_import \sa wolfSSL_tls_export */ @@ -404,14 +593,18 @@ unsigned int sz); /*! - \brief セッションをエクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã€‚ã“ã‚Œã¯ã€ä»¥å‰ã«æ ¼ç´ã•ã‚Œã¦ã„るエクスãƒãƒ¼ãƒˆæ©Ÿèƒ½ã‚’クリアã™ã‚‹ãŸã‚ã®ãƒ‘ラメータfuncã¨ã—ã¦nullを渡ã™ã“ã¨ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã™ã€‚サーãƒãƒ¼å´ã§ä½¿ç”¨ã•ã‚Œã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸç›´å¾Œã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return BAD_FUNC_ARG NULLã¾ãŸã¯äºˆæƒ³ã•ã‚Œãªã„引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief wolfSSL_CTX_dtls_set_export()関数ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’設定ã—ã¾ã™ã€‚ + 以å‰ã«æ ¼ç´ã•ã‚Œã¦ã„るエクスãƒãƒ¼ãƒˆæ©Ÿèƒ½ã‚’クリアã™ã‚‹ãŸã‚ã«ãƒ‘ラメータfuncã«NULLを渡ã™ã“ã¨ãŒè¨±ã•ã‚Œã¾ã™ã€‚ + サーãƒãƒ¼å´ã§ä½¿ç”¨ã•ã‚Œã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸç›´å¾Œã«è¨­å®šã—ãŸã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG NULLã¾ãŸã¯äºˆæƒ³ã•ã‚Œãªã„引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param func セッションをエクスãƒãƒ¼ãƒˆã™ã‚‹éš›ã«å‘¼ã³å‡ºã™é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int send_session(WOLFSSL* ssl, byte* buf, word32 sz, void* userCtx); - // body of send session (wc_dtls_export) that passses + // body of send session (wc_dtls_export) that passes // buf (serialized session) to destination WOLFSSL_CTX* ctx; int ret; @@ -429,18 +622,21 @@ \sa wolfSSL_dtls_set_export \sa Static buffer use */ -int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, - wc_dtls_export func); +int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func); /*! - \brief セッションをエクスãƒãƒ¼ãƒˆã™ã‚‹æ©Ÿèƒ½ã€‚ã“ã‚Œã¯ã€ä»¥å‰ã«æ ¼ç´ã•ã‚Œã¦ã„るエクスãƒãƒ¼ãƒˆæ©Ÿèƒ½ã‚’クリアã™ã‚‹ãŸã‚ã®ãƒ‘ラメータfuncã¨ã—ã¦nullを渡ã™ã“ã¨ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã™ã€‚サーãƒãƒ¼å´ã§ä½¿ç”¨ã•ã‚Œã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸç›´å¾Œã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return BAD_FUNC_ARG NULLã¾ãŸã¯äºˆæƒ³ã•ã‚Œãªã„引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief wolfSSL_dtls_set_export()関数ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’エクスãƒãƒ¼ãƒˆã™ã‚‹éš›ã«å‘¼ã³å‡ºã™ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’登録ã—ã¾ã™ã€‚ + 以å‰ã«ç™»éŒ²ã•ã‚Œã¦ã„るエクスãƒãƒ¼ãƒˆé–¢æ•°ã‚’クリアã™ã‚‹ãŸã‚ã«ä½¿ã†ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + サーãƒãƒ¼å´ã§ä½¿ç”¨ã•ã‚Œã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸç›´å¾Œã«è¨­å®šã—ãŸã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG NULLã¾ãŸã¯äºˆæƒ³ã•ã‚Œãªã„引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param func セッションをエクスãƒãƒ¼ãƒˆã™ã‚‹éš›ã«å‘¼ã³å‡ºã™é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int send_session(WOLFSSL* ssl, byte* buf, word32 sz, void* userCtx); - // body of send session (wc_dtls_export) that passses + // body of send session (wc_dtls_export) that passes // buf (serialized session) to destination WOLFSSL* ssl; int ret; @@ -460,11 +656,15 @@ int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func); /*! - \brief æä¾›ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ã¸ã®WolfSSLセッション。セッションをシリアル化ã—ãŸã¨ãã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã®é–¢æ•°ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’使用ã™ã‚‹ã‚ˆã‚Šã‚‚å°‘ãªã„メモリオーãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’許å¯ã—ã¾ã™ã€‚関数ã«æ¸¡ã•ã‚ŒãŸã¨ãã«ãƒãƒƒãƒ•ã‚¡ãŒNULLã®å ´åˆã€SZã¯WolfSSLセッションã®ç›´åˆ—化ã«å¿…è¦ãªãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã«è¨­å®šã•ã‚Œã¾ã™ã€‚ - \return Success æˆåŠŸã—ãŸå ´åˆã€ä½¿ç”¨ã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã®é‡ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \return Failure ã™ã¹ã¦ã®å¤±æ•—ã—ãŸæˆ»ã‚Šå€¤ã¯0未満ã«ãªã‚Šã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param buf 直列化セッションをä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \brief wolfSSL_dtls_export()関数ã¯æä¾›ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ã¸ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’シリアル化ã—ã¾ã™ã€‚ + セッションをエクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®é–¢æ•°ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’使用ã™ã‚‹ã‚ˆã‚Šã‚‚メモリオーãƒãƒ¼ãƒ˜ãƒƒãƒ‰ã‚’減らã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + 関数ã«æ¸¡ã•ã‚ŒãŸå¼•æ•°bufãŒNULLã®å ´åˆã€szã«ã¯WolfSSLセッションã®ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºã«å¿…è¦ãªãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒè¨­å®šã•ã‚Œã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€ä½¿ç”¨ã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return ã™ã¹ã¦ã®å¤±æ•—ã—ãŸæˆ»ã‚Šå€¤ã¯0未満ã«ãªã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param buf シリアライズã—ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’ä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \param sz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL* ssl; @@ -487,10 +687,15 @@ unsigned int* sz); /*! - \brief 接続ã®ç›´åˆ—化ã•ã‚ŒãŸçŠ¶æ…‹ã‚’インãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã»ã¨ã‚“ã©ã®å ´åˆã€wolfssl_tls_exportã®ä»£ã‚ã‚Šã«wolfssl_get1_sessionを使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚追加ã®ãƒ‡ãƒãƒƒã‚°æƒ…報をマクロwolfssl_session_export_debugãŒå®šç¾©ã—ã¦è¡¨ç¤ºã§ãã¾ã™ã€‚警告:BUFã«ã¯ã€çŠ¶æ…‹ã«é–¢ã™ã‚‹æ©Ÿå¯†æƒ…å ±ãŒå«ã¾ã‚Œã¦ãŠã‚Šã€ä¿å­˜ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ä¿å­˜ã™ã‚‹å‰ã«æš—å·åŒ–ã•ã‚Œã‚‹ã®ãŒæœ€å–„ã§ã™ã€‚ - \return the ãƒãƒƒãƒ•ã‚¡ãƒ¼ 'BUF'ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•° - \param ssl セッションをエクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®WolfSSL構造 - \param buf 直列化セッションã®å‡ºåŠ› + \brief シリアライズã•ã‚ŒãŸTLSセッションをエクスãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ + ã»ã¨ã‚“ã©ã®å ´åˆã€wolfSSL_tls_exportã®ä»£ã‚ã‚Šã«wolfssl_get1_sessionを使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + 追加ã®ãƒ‡ãƒãƒƒã‚°æƒ…報をマクロWOLFSSL_SESSION_EXPORT_DEBUGを定義ã—ã¦è¡¨ç¤ºã§ãã¾ã™ã€‚ + 警告:bufã«ã¯ã€çŠ¶æ…‹ã«é–¢ã™ã‚‹æ©Ÿå¯†æƒ…å ±ãŒå«ã¾ã‚Œã¦ãŠã‚Šã€ä¿å­˜ã™ã‚‹å ´åˆã¯ä¿å­˜ã™ã‚‹å‰ã«æš—å·åŒ–ã•ã‚Œã‚‹ã®ãŒæœ€å–„ã§ã™ã€‚ + \return ãƒãƒƒãƒ•ã‚¡'buf'ã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒã‚¤ãƒˆæ•° + \param ssl セッションをエクスãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param buf シリアライズã•ã‚ŒãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å‡ºåŠ›å…ˆãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param sz 出力先ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \sa wolfSSL_dtls_import \sa wolfSSL_tls_import */ @@ -498,14 +703,28 @@ unsigned int* sz); /*! - \brief ãã®å¾Œã€CTXã®æœ‰åŠ¹æœŸé–“ãŠã‚ˆã³CTXã‹ã‚‰ä½œæˆã•ã‚ŒãŸSSLオブジェクトã«ã¯ã€asideを設定ã—ã¾ã™ã€‚NULL CTXãƒã‚¤ãƒ³ã‚¿ã¨WOLFSSL_METHOD_FUNC関数を渡ã™ã“ã¨ã«ã‚ˆã£ã¦ã€CTX自体ã®ä½œæˆã‚‚é™çš„メモリを使用ã—ã¾ã™ã€‚wolfssl_method_funcã«ã¯ã€wolfssl_method *(* wolfssl_method_func)ã®é–¢æ•°ç½²åãŒã‚ã‚Šã¾ã™ï¼ˆvoid *ヒープ)。MAXã«0を渡ã™ã¨ã€è¨­å®šã•ã‚Œã¦ã„ãªã„ã‹ã®ã‚ˆã†ã«å‹•ä½œã—ã€æœ€å¤§ã®åŒæ™‚使用制é™ãŒé©ç”¨ã•ã‚Œã¾ã›ã‚“。渡ã•ã‚ŒãŸãƒ•ãƒ©ã‚°å€¤ã«ã‚ˆã£ã¦ã€ãƒ¡ãƒ¢ãƒªã®ä½¿ç”¨æ–¹æ³•ã¨å‹•ä½œä¸­ã®å‹•ä½œãŒæ±ºã¾ã‚Šã¾ã™ã€‚利用å¯èƒ½ãªãƒ•ãƒ©ã‚°ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.0 - デフォルトã®ä¸€èˆ¬ãƒ¡ãƒ¢ãƒªã€WolfMEM_IO_POOL - å—信メッセージã®é€ä¿¡ã¨ä¸€èˆ¬ãƒ¡ãƒ¢ãƒªã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã¨ãã«å…¥å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã«ä½¿ç”¨ã•ã‚Œã‚‹ã®ã§ã€æ¸¡ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡å†…ã®ã™ã¹ã¦ã®ãƒ¡ãƒ¢ãƒªãŒIOã€WolfMem_IO_FIXED - WOLFMEM_IO_POOLã¨åŒã˜ã§ã™ãŒã€ä»Šåº¦ã¯å„SSLã¨åŒã˜ã§ã™ã€‚2ã¤ã®ãƒãƒƒãƒ•ã‚¡ã‚’自分ã®ãƒ©ã‚¤ãƒ•ã‚¿ã‚¤ãƒ ã§è‡ªåˆ†è‡ªèº«ã«ä¿ã¡ã¾ã™ã€‚wolfmem_track_stats - å„SSLã¯å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªçµ±è¨ˆã‚’追跡ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE 失敗ã™ã‚‹ã¨ã€‚ - \param ctx wolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚ - \param method プロトコルを作æˆã™ã‚‹æ©Ÿèƒ½ã€‚(CTXã‚‚NULLã§ã‚‚ãªã„å ´åˆã¯NULLã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ï¼‰ - \param buf ã™ã¹ã¦ã®æ“作ã«ä½¿ç”¨ã™ã‚‹ãƒ¡ãƒ¢ãƒªã€‚ + \brief ã“ã®é–¢æ•°ã¯CTX用ã«é™çš„メモリ領域を設定ã™ã‚‹ç›®çš„ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 設定ã•ã‚ŒãŸé™çš„メモリ領域ã¯CTXã®æœ‰åŠ¹æœŸé–“ãŠã‚ˆã³CTXã‹ã‚‰ä½œæˆã•ã‚ŒãŸå…¨ã¦ã®SSLオブジェクトã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 引数ctxã«NULLを渡ã—ã€wolfSSL_method_func関数を渡ã™ã“ã¨ã«ã‚ˆã£ã¦ã€CTX自体ã®ä½œæˆã‚‚é™çš„メモリを使用ã—ã¾ã™ã€‚ + wolfssl_method_funcã¯æ¬¡ã®ã‚·ã‚°ãƒãƒãƒ£ã¨ãªã£ã¦ã„ã¾ã™:wolfssl_method *(* wolfssl_method_func)(void *heap)。 + 引数maxã«0を渡ã™ã¨ã€è¨­å®šã•ã‚Œã¦ã„ãªã„ã‚‚ã®ã¨ã—ã¦å‹•ä½œã—ã€æœ€å¤§ã®åŒæ™‚使用制é™ãŒé©ç”¨ã•ã‚Œã¾ã›ã‚“。 + 引数flagã«æ¸¡ã—ãŸå€¤ã«ã‚ˆã£ã¦ã€ãƒ¡ãƒ¢ãƒªã®ä½¿ç”¨æ–¹æ³•ã¨å‹•ä½œãŒæ±ºã¾ã‚Šã¾ã™ã€‚ + 利用å¯èƒ½ãªãƒ•ãƒ©ã‚°å€¤ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ï¼š + 0 - デフォルトã®ä¸€èˆ¬ãƒ¡ãƒ¢ãƒªã€ + WOLFMEM_IO_POOL - メッセージã®å—é€ä¿¡ã®éš›ã®å…¥å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã¨ã—ã¦ä½¿ç”¨ã•ã‚Œæ¸¡ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡å†…ã®ã™ã¹ã¦ã®ãƒ¡ãƒ¢ãƒªãŒIOã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€ + WOLFMEM_IO_FIXED - WOLFMEM_IO_POOLã¨åŒã˜ã§ã™ãŒã€å„SSLã¯2ã¤ã®ãƒãƒƒãƒ•ã‚¡ã‚’自分ã®ãƒ©ã‚¤ãƒ•ã‚¿ã‚¤ãƒ ã®é–“ä¿æŒã—ã¦ä½¿ç”¨ã—ã¾ã™ã€‚ + WOLFMEM_TRACK_STATS - å„SSLã¯å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªä½¿ç”¨çµ±è¨ˆã‚’追跡ã—ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ctx WOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã®ãƒã‚¤ãƒ³ã‚¿ + \param method メソッド関数(例ãˆã°ã€wolfSSLv23_server_method_ex)ã§ctxãŒNULLã§ãªã„å ´åˆã¯NULLã«ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \param buf ã™ã¹ã¦ã®æ“作ã«ä½¿ç”¨ã™ã‚‹ãƒ¡ãƒ¢ãƒªãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param sz 渡ã•ã‚Œã¦ã„るメモリãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚ - \param flag メモリã®ç¨®é¡ž + \param flag メモリã®ä½¿ç”¨ã‚¿ã‚¤ãƒ— + \param max åŒæ™‚使用ã®æœ€å¤§å€¤ + _Example_ \code WOLFSSL_CTX* ctx; @@ -542,10 +761,15 @@ int flag, int max); /*! - \brief ãã—ã¦ã€é™çš„メモリ使用é‡ã«é–¢ã™ã‚‹æƒ…報をåŽé›†ã™ã‚‹ãŸã‚ã«ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \return 1 CTXã®é™çš„メモリを使用ã™ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return 0 é™çš„メモリを使用ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯ç¾æ™‚点ã®æŽ¥ç¶šã«é–¢ã™ã‚‹æŒ¯ã‚‹èˆžã„ã®å¤‰æ›´ã¯è¡Œã„ã¾ã›ã‚“。 + é™çš„メモリ使用é‡ã«é–¢ã™ã‚‹æƒ…報をåŽé›†ã™ã‚‹ãŸã‚ã«ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \return 1 CTXã®é™çš„メモリを使用ã—ã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return 0 é™çš„メモリを使用ã—ã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param mem_stats é™çš„メモリã®ä½¿ç”¨é‡ã«é–¢ã™ã‚‹æƒ…報をä¿æŒã™ã‚‹WOLFSSL_MEM_STATS構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ \code WOLFSSL_CTX* ctx; @@ -571,10 +795,16 @@ WOLFSSL_MEM_STATS* mem_stats); /*! - \brief SSLã®é™çš„メモリ使用é‡ã€‚戻り値ã¯ã€é™çš„メモリを読ã¿è¾¼ã‚€ã¨ãã«ã€é™çš„メモリãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚ - \return 1 CTXã®é™çš„メモリを使用ã™ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return 0 é™çš„メモリを使用ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief wolfSSL_is_static_memory関数ã¯SSLã®é™çš„メモリ使用é‡ã«é–¢ã™ã‚‹æƒ…報を集ã‚ã¾ã™ã€‚ + 戻り値ã¯ã€é™çš„メモリãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚ + 引数sslã®ä¸Šä½ã®WOLFSSL_CTXã«é™çš„メモリを使用ã™ã‚‹ã‚ˆã†ã«æŒ‡å®šã—ã¦ã‚ã‚Šã€WOLFMEM_TRACK_STATSãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã« + 引数mem_statsã«æƒ…å ±ãŒã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ + \return 1 é™çš„メモリを使用ã—ã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return 0 é™çš„メモリを使用ã—ã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param mem_stats é™çš„メモリã®ä½¿ç”¨é‡ã«é–¢ã™ã‚‹æƒ…報をä¿æŒã™ã‚‹WOLFSSL_MEM_STATS構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl; @@ -595,12 +825,22 @@ WOLFSSL_MEM_CONN_STATS* mem_stats); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ï¼ˆwolfssl_ctx)。ファイルã¯ãƒ•ã‚¡ã‚¤ãƒ«å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚format引数ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—(SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM)を指定ã—ã¾ã™ã€‚é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ãŒèª¤ã£ãŸå½¢å¼ã«ã‚ã‚‹å ´åˆã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ファイルã¯å­˜åœ¨ã—ã¾ã›ã‚“。読ã¿å–られãªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„るメモリ状態ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãƒ™ãƒ¼ã‚¹16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã§å¤±æ•—ã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ - \param file WolfSSL SSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLコンテキスト(WOLFSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + ファイルã¯å¼•æ•°fileã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ + 引数formatã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—(SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM)を指定ã—ã¾ã™ã€‚ + é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 + + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚失敗ã—ãŸå ´åˆã®å¯èƒ½ãªåŽŸå› ã¨ã—ã¦ã¯ã€ + ファイルãŒèª¤ã£ãŸå½¢å¼ã®å ´åˆã€ã¾ãŸã¯å¼•æ•°formatを使用ã—ã¦èª¤ã£ãŸãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæŒ‡å®šã•ã‚Œã¦ã„る〠+ ã‚ã‚‹ã„ã¯ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ãªã„ã€ã‚ã‚‹ã„ã¯èª­ã¿å–ã‚‹ã“ã¨ãŒã§ããªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„る〠+ メモリä¸è¶³ãŒç™ºç”Ÿã€Base16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¦ã„ã‚‹ãªã©ã®åŽŸå› ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param file ロードã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ス文字列。 + \param format ロードã™ã‚‹è¨¼æ˜Žæ›¸ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆï¼šSSL_FILETYPE_ASN1 ã‚ã‚‹ã„㯠SSL_FILETYPE_PEM + _Example_ \code int ret = 0; @@ -621,10 +861,26 @@ int format); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLコンテキスト(WolfSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ファイルã¯ãƒ•ã‚¡ã‚¤ãƒ«å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚format引数ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™.SSL_FILETYPE_ASN1OR SSL_FILETYPE_PEM。é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。外部キーストアを使用ã—ã€ç§˜å¯†éµã‚’æŒã£ã¦ã„ãªã„å ´åˆã¯ã€ä»£ã‚ã‚Šã«å…¬é–‹éµã‚’入力ã—ã¦CryProコールãƒãƒƒã‚¯ã‚’登録ã—ã¦ç½²åを処ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ãŸã‚ã«ã¯ã€Cryptoコールãƒãƒƒã‚¯ã¾ãŸã¯PKコールãƒãƒƒã‚¯ã‚’使用ã—ãŸãƒ“ルドã§æ§‹ç¯‰ã§ãã¾ã™ã€‚Cryptoコールãƒãƒƒã‚¯ã‚’有効ã«ã™ã‚‹ã«ã¯ã€-enable-cryptocbã¾ãŸã¯wolf_crypto_cbを使用ã—ã€wc_cryptocb_registerDeviceを使用ã—ã¦æš—å·ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’登録ã—ã€wolfssl_ctx_setdevidを使用ã—ã¦é–¢é€£ã™ã‚‹devidを設定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE ファイルã¯é–“é•ã£ãŸå½¢å¼ã§ã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ファイルãŒå­˜åœ¨ã—ãªã„ã€èª­ã¿è¾¼ã‚ãªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã™ã€‚メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ã¾ã™ã€‚base16デコードã¯ãƒ•ã‚¡ã‚¤ãƒ«ã§å¤±æ•—ã—ã¾ã™ã€‚キーファイルã¯æš—å·åŒ–ã•ã‚Œã¦ã„ã¾ã™ãŒã€ãƒ‘スワードã¯æä¾›ã•ã‚Œã¾ã›ã‚“。 + \ingroup CertsKeys + + \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLコンテキスト(WOLFSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + ファイルã¯å¼•æ•°fileã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ + 引数formatã¯ã€æ¬¡ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ï¼šSSL_FILETYPE_ASN1 ã‚ã‚‹ã„㯠SSL_FILETYPE_PEM。 + é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 + 外部キーストアを使用ã—ã€ç§˜å¯†éµã‚’æŒã£ã¦ã„ãªã„å ´åˆã¯ã€ + 代ã‚ã‚Šã«å…¬é–‹éµã‚’入力ã—ã¦cryptoコールãƒãƒƒã‚¯ã‚’登録ã—ã¦ç½²åを処ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®ãŸã‚ã«ã¯ã€cryptoコールãƒãƒƒã‚¯ã¾ãŸã¯PKコールãƒãƒƒã‚¯ã‚’使用ã—ãŸã‚³ãƒ³ãƒ•ã‚£ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§ãƒ“ルドã—ã¾ã™ã€‚ + cryptoコールãƒãƒƒã‚¯ã‚’有効ã«ã™ã‚‹ã«ã¯ã€--enable-cryptocbã¾ãŸã¯WOLF_CRYPTO_CBマクロを使用ã—〠+ wc_CryptoCb_RegisterDeviceを使用ã—ã¦æš—å·ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’登録ã—〠+ wolfSSL_CTX_SetDevIdを使用ã—ã¦é–¢é€£ã™ã‚‹devidを設定ã—ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã®å¯èƒ½ãªåŽŸå› ã¨ã—ã¦ã¯ã€ + ファイルãŒèª¤ã£ãŸå½¢å¼ã®å ´åˆã€ã¾ãŸã¯å¼•æ•°formatを使用ã—ã¦èª¤ã£ãŸãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæŒ‡å®šã•ã‚Œã¦ã„る〠+ ã‚ã‚‹ã„ã¯ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ãªã„ã€ã‚ã‚‹ã„ã¯èª­ã¿å–ã‚‹ã“ã¨ãŒã§ããªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„る〠+ メモリä¸è¶³ãŒç™ºç”Ÿã€Base16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¦ã„ã‚‹ãªã©ã®åŽŸå› ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ + \param ãªã— + _Example_ \code int ret = 0; @@ -646,20 +902,33 @@ int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file, int format); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€PEMå½¢å¼ã®CA証明書ファイルをSSLコンテキスト(WolfSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ã“れらã®è¨¼æ˜Žæ›¸ã¯ã€ä¿¡é ¼ã§ãるルート証明書ã¨ã—ã¦æ‰±ã‚ã‚Œã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ãƒ”ã‚¢ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ファイル引数ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€å˜ä¸€ã®è¨¼æ˜Žæ›¸ã¾ãŸã¯è¤‡æ•°ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚り得る。複数ã®CA CERTãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€WolfSSLã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜é †åºã§ãれらをロードã—ã¾ã™ã€‚ path引数ã¯ã€ä¿¡é ¼ã§ãるルートCAã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ファイルã®å€¤ãŒNULLã§ã¯ãªã„å ´åˆã€ãƒ‘スを必è¦ãªå ´åˆã¯ãƒ‘スをNULLã¨ã—ã¦æŒ‡å®šã§ãã¾ã™ã€‚ Libraryã®æ§‹ç¯‰æ™‚ã«ãƒ‘スãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€WOLFSSLãŒæŒ‡å®šã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚‹ã™ã¹ã¦ã®CA証明書をロードã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ロードã—よã†ã¨ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ãƒ˜ãƒƒãƒ€ãƒ¼ "-----証明書-----"ã‚’æŒã¤pemフォーマットã•ã‚ŒãŸcert_typeファイルを期待ã—ã¦ã„ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ã¾ã—ãŸã€‚ - \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‘スã®ä¸¡æ–¹ãŒNULLã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€PEMå½¢å¼ã®CA証明書ファイルをSSLコンテキスト(WOLFSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + ã“れらã®è¨¼æ˜Žæ›¸ã¯ã€ä¿¡é ¼ã§ãるルート証明書ã¨ã—ã¦æ‰±ã‚ã‚Œã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ãƒ”ã‚¢ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 引数fileã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€å˜ä¸€ã®è¨¼æ˜Žæ›¸ã¾ãŸã¯è¤‡æ•°ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã§ã®å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ + 複数ã®CA証明書ãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€wolfSSLã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜é †åºã§ãれらをロードã—ã¾ã™ã€‚ + 引数pathã¯ã€ä¿¡é ¼ã§ãるルートCAã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ + 引数fileãŒNULLã§ã¯ãªã„å ´åˆã€ãƒ‘スãŒå¿…è¦ã§ãªã„å ´åˆã¯NULLã¨ã—ã¦æŒ‡å®šã§ãã¾ã™ã€‚ + 引数pathãŒæŒ‡å®šã•ã‚Œã¦ã„ã¦ã‹ã¤NO_WOLFSSL_DIRãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„å ´åˆã«ã¯ã€ + wolfSSLライブラリã¯æŒ‡å®šã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«å­˜åœ¨ã™ã‚‹ã™ã¹ã¦ã®CA証明書をロードã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ロードã—よã†ã¨ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€ãƒ˜ãƒƒãƒ€ãƒ¼ã« "-----BEGIN CERTIFICATE-----"ã‚’æŒã¤PEMフォーマットã•ã‚ŒãŸCERT_TYPEファイルを期待ã—ã¦ã„ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‘スã®ä¸¡æ–¹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã€èª­ã¿è¾¼ã‚ãªã„å ´åˆã€ã¾ãŸã¯ç ´æã—ã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return ASN_BEFORE_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå‰æ—¥ã®å‰ã«ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return ASN_AFTER_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå¾Œã®æ—¥ä»˜ã®å¾Œã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒä½¿ç”¨æœŸé™å¾Œã‚ˆã‚Šå¾Œã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ãŒå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_PATH_ERROR OpenDir()ãŒãƒ‘スを開ã“ã†ã¨ã—ãŸã¨ãã«å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param file PEMå½¢å¼ã®CA証明書をå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_PATH_ERROR opendir()ãŒãƒ‘スを開ã“ã†ã¨ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param file PEMå½¢å¼ã®CA証明書をå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param path CA証明書をå«ã‚“ã§ã„るディレクトリã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -681,22 +950,37 @@ \sa wolfSSL_use_certificate_chain_file */ int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, - const char* format); + const char* path); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€PEMå½¢å¼ã®CA証明書ファイルをSSLコンテキスト(WolfSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ã“れらã®è¨¼æ˜Žæ›¸ã¯ã€ä¿¡é ¼ã§ãるルート証明書ã¨ã—ã¦æ‰±ã‚ã‚Œã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ãƒ”ã‚¢ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ファイル引数ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€å˜ä¸€ã®è¨¼æ˜Žæ›¸ã¾ãŸã¯è¤‡æ•°ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚り得る。複数ã®CA CERTãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€WolfSSLã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜é †åºã§ãれらをロードã—ã¾ã™ã€‚ path引数ã¯ã€ä¿¡é ¼ã§ãるルートCAã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ファイルã®å€¤ãŒNULLã§ã¯ãªã„å ´åˆã€ãƒ‘スを必è¦ãªå ´åˆã¯ãƒ‘スをNULLã¨ã—ã¦æŒ‡å®šã§ãã¾ã™ã€‚ Libraryã®æ§‹ç¯‰æ™‚ã«ãƒ‘スãŒæŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€WOLFSSLãŒæŒ‡å®šã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚ã‚‹ã™ã¹ã¦ã®CA証明書をロードã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€æŒ‡å®šã•ã‚ŒãŸãƒ•ãƒ©ã‚°ã«åŸºã¥ã„ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ロードã—よã†ã¨ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ãƒ˜ãƒƒãƒ€ãƒ¼ "-----証明書-----"ã‚’æŒã¤PEMå½¢å¼ã®cert_typeファイルを想定ã—ã¦ã„ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ã¾ã—ãŸã€‚ - \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‘スã®ä¸¡æ–¹ãŒNULLã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚å°‘ãªãã¨ã‚‚1ã¤ã®è¨¼æ˜Žæ›¸ãŒæ­£å¸¸ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¦ã„ã‚‹ãŒã€å¤±æ•—ã—ãŸ1ã¤ä»¥ä¸ŠãŒã‚ã‚‹å ´åˆã€ã“れも返ã•ã‚Œã¾ã™ã€‚ç†ç”±ã§ã‚¨ãƒ©ãƒ¼ã‚¹ã‚¿ãƒƒã‚¯ã‚’確èªã—ã¦ãã ã•ã„。 - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \brief ã“ã®é–¢æ•°ã¯ã€PEMå½¢å¼ã®CA証明書ファイルをSSLコンテキスト(WOLFSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + ã“れらã®è¨¼æ˜Žæ›¸ã¯ã€ä¿¡é ¼ã§ãるルート証明書ã¨ã—ã¦æ‰±ã‚ã‚Œã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ãƒ”ã‚¢ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 引数fileã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€å˜ä¸€ã®è¨¼æ˜Žæ›¸ã¾ãŸã¯è¤‡æ•°ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã§ã®å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ + 複数ã®CA証明書ãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€wolfSSLã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜é †åºã§ãれらをロードã—ã¾ã™ã€‚ + 引数pathã¯ã€ä¿¡é ¼ã§ãるルートCAã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ + 引数fileãŒNULLã§ã¯ãªã„å ´åˆã€ãƒ‘スãŒå¿…è¦ã§ãªã„å ´åˆã¯NULLã¨ã—ã¦æŒ‡å®šã§ãã¾ã™ã€‚ + 引数pathãŒæŒ‡å®šã•ã‚Œã¦ã„ã¦ã‹ã¤NO_WOLFSSL_DIRãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„å ´åˆã«ã¯ã€ + wolfSSLライブラリã¯æŒ‡å®šã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«å­˜åœ¨ã™ã‚‹ã™ã¹ã¦ã®CA証明書をロードã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯å¼•æ•°flagsã«åŸºã¥ã„ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã®ã™ã¹ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ロードã—よã†ã¨ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€ãƒ˜ãƒƒãƒ€ãƒ¼ã« "-----BEGIN CERTIFICATE-----"ã‚’æŒã¤PEMフォーマットã•ã‚ŒãŸCERT_TYPEファイルを期待ã—ã¦ã„ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‘スã®ä¸¡æ–¹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã€èª­ã¿è¾¼ã‚ãªã„å ´åˆã€ã¾ãŸã¯ç ´æã—ã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_BEFORE_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒä½¿ç”¨é–‹å§‹æ—¥ã‚ˆã‚Šå‰ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒä½¿ç”¨æœŸé™å¾Œã‚ˆã‚Šå¾Œã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ãŒå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_PATH_ERROR OpenDir()ãŒãƒ‘スを開ã“ã†ã¨ã—ãŸã¨ãã«å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param file PEMå½¢å¼ã®CA証明書をå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param path PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’ロードã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_PATH_ERROR opendir()ãŒãƒ‘スを開ã“ã†ã¨ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param file PEMå½¢å¼ã®CA証明書をå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param path CA証明書をå«ã‚“ã§ã„るディレクトリã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ãƒ‘ス + \param flags 指定å¯èƒ½ãªãƒžã‚¹ã‚¯å€¤: WOLFSSL_LOAD_FLAG_IGNORE_ERR, + WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY, WOLFSSL_LOAD_FLAG_PEM_CA_ONLY + _Example_ \code int ret = 0; @@ -722,16 +1006,85 @@ const char* path, unsigned int flags); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€TLS / SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’実行ã™ã‚‹ã¨ãã«ãƒ”アを検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’ロードã—ã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«é€ä¿¡ã•ã‚ŒãŸãƒ”ア証明書ã¯ã€ä½¿ç”¨å¯èƒ½ãªã¨ãã«ã‚¹ã‚­ãƒƒãƒ‰ã‚’使用ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦æ¯”較ã•ã‚Œã¾ã™ã€‚ã“れら2ã¤ã®ã“ã¨ãŒä¸€è‡´ã—ãªã„å ´åˆã¯ã€ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸCASãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚マクロwolfssl_trust_peer_certを定義ã™ã‚‹ã“ã¨ã§æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 - \return SSL_SUCCES æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ä¸¡æ–¹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ç¨®é¡žãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \ingroup CertsKeys + + \brief ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_load_system_CA_certs ãŒå‘¼ã³å‡ºã•ã‚ŒãŸã¨ãã«ã€ + wolfSSLãŒã‚·ã‚¹ãƒ†ãƒ CA証明書を検索ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’表ã™æ–‡å­—列ã®é…列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯æ–‡å­—列é…列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL 失敗時ã«è¿”ã—ã¾ã™ã€‚ + + \param num word32型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚文字列é…列ã®é•·ã•ã‚’æ ¼ç´ã—ã¾ã™ã€‚ + + _Example_ + \code + WOLFSSL_CTX* ctx; + const char** dirs; + word32 numDirs; + + dirs = wolfSSL_get_system_CA_dirs(&numDirs); + for (int i = 0; i < numDirs; ++i) { + printf("Potential system CA dir: %s\n", dirs[i]); + } + ... + \endcode + + \sa wolfSSL_CTX_load_system_CA_certs + \sa wolfSSL_CTX_load_verify_locations + \sa wolfSSL_CTX_load_verify_locations_ex +*/ +const char** wolfSSL_get_system_CA_dirs(word32* num); + +/*! + \ingroup CertsKeys + + \brief ã“ã®é–¢æ•°ã¯ã€CA証明書をOSä¾å­˜ã®CA証明書ストアã‹ã‚‰WOLFSSL_CTXã«ãƒ­ãƒ¼ãƒ‰ã—よã†ã¨ã—ã¾ã™ã€‚ + ロードã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã¯ä¿¡é ¼ã•ã‚Œã¾ã™ã€‚ + サãƒãƒ¼ãƒˆãŠã‚ˆã³ãƒ†ã‚¹ãƒˆã•ã‚Œã¦ã„るプラットフォームã¯ã€Linux(Debianã€Ubuntuã€Gentooã€Fedoraã€RHEL)〠+ Windows 10/11ã€Androidã€Apple OS Xã€iOSã§ã™ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return WOLFSSL_BAD_PATH システムCA証明書ãŒãƒ­ãƒ¼ãƒ‰ã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return WOLFSSL_FAILURE ãã®ã»ã‹ã®ã‚¨ãƒ©ãƒ¼ç™ºç”Ÿæ™‚(Windows証明書ストアãŒæ­£å¸¸ã«ã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚Œãªã„等) + + \param ctx wolfSSL_CTX_new()ã§ç”Ÿæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + _Example_ + \code + int ret = 0; + WOLFSSL_CTX* ctx; + ... + ret = wolfSSL_CTX_load_system_CA_certs(ctx,); + if (ret != WOLFSSL_SUCCESS) { + // error loading system CA certs + } + ... + \endcode + + \sa wolfSSL_get_system_CA_dirs + \sa wolfSSL_CTX_load_verify_locations + \sa wolfSSL_CTX_load_verify_locations_ex +*/ +int wolfSSL_CTX_load_system_CA_certs(WOLFSSL_CTX* ctx); + + +/*! + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€TLS/SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’実行ã™ã‚‹ã¨ãã«ãƒ”アを検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’ロードã—ã¾ã™ã€‚ + ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«é€ä¿¡ã•ã‚ŒãŸãƒ”ア証明書ã¯ã€ã“ã®é–¢æ•°ã§æŒ‡å®šã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã®SKIDã¨ç½²åを比較ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦æ¤œè¨¼ã•ã‚Œã¾ã™ã€‚ + ã“れら2ã¤ã®ã“ã¨ãŒä¸€è‡´ã—ãªã„å ´åˆã¯ã€ãƒ”ア証明書ã®æ¤œè¨¼ã«ã¯ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸCA証明書ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã¯WOLFSSL_TRUST_PEER_CERTマクロを定義ã™ã‚‹ã“ã¨ã§æ©Ÿèƒ½ã‚’有効ã«ã§ãã¾ã™ã€‚ + é©åˆ‡ãªä½¿ç”¨æ³•ã¯ä¾‹ã‚’ã”覧ãã ã•ã„。 + + \return SSL_SUCCES æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ä¸¡æ–¹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ç¨®é¡žãŒç„¡åŠ¹ãªå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ç”Ÿæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param file 証明書をå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret = 0; @@ -758,11 +1111,18 @@ int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€Chain of chainã‚’SSLコンテキスト(WolfSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚証明書ãƒã‚§ãƒ¼ãƒ³ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãƒ•ã‚¡ã‚¤ãƒ«å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã€PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€æœ€å¤§MAX_CHAIN_DEPTH(Default = 9ã€internal.hã§å®šç¾©ã•ã‚Œã¦ã„る)証明書ã«åŠ ãˆã¦ã€ã‚µãƒ–ジェクト証明書を処ç†ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ãŒèª¤ã£ãŸå½¢å¼ã«ã‚ã‚‹å ´åˆã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ファイルã¯å­˜åœ¨ã—ã¾ã›ã‚“。読ã¿å–られãªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„るメモリ状態ãŒç™ºç”Ÿã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’SSLコンテキスト(WOLFSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + 証明書ãƒã‚§ãƒ¼ãƒ³ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã¯å¼•æ•°fileã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã€PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€æœ€å¤§MAX_CHAIN_DEPTH(既定ã§9ã€internal.hã§å®šç¾©ã•ã‚Œã¦ã„る)数ã®è¨¼æ˜Žæ›¸ã‚’処ç†ã—ã¾ã™ã€‚ + ã“ã®æ•°ã«ã¯ã‚µãƒ–ジェクト証明書をå«ã¿ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ã¨ã—ã¦ã¯ï¼šèª¤ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã€ + ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ + ファイルãŒå­˜åœ¨ã—ãªã„ã€èª­ã¿å–ã‚Œãªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã‚‹ã€ãƒ¡ãƒ¢ãƒªæž¯æ¸‡ãªã©ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()ã§ç”Ÿæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -783,12 +1143,21 @@ const char *file); /*! - \ingroup openSSL - \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã§ä½¿ç”¨ã•ã‚Œã¦ã„るプライベートRSAキーをSSLコンテキスト(WolfSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfsslãŒOpenSSL互æ›å±¤æœ‰åŠ¹ï¼ˆ--enable-openSSlextraã€#define openssl_extra)ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã€ã‚ˆã‚Šä¸€èˆ¬çš„ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹wolfssl_ctx_use_privatekey_file()関数ã¨åŒã˜ã§ã™ã€‚ファイル引数ã«ã¯ã€RSA秘密éµãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒã€ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚入力キーファイルãŒèª¤ã£ãŸå½¢å¼ã§ã‚ã‚‹ã‹ã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ãªã„ã€èª­ã¿è¾¼ã‚ãªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„ãªã„ã€ãƒ¡ãƒ¢ãƒªä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup openSSL + \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹RSA秘密éµã‚’SSLコンテキスト(WOLFSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSLãŒOpenSSL互æ›APIãŒæœ‰åŠ¹ï¼ˆ--enable-openSSLExtraã€#define OPENSSL_EXTRA)ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã€ + より一般的ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹wolfSSL_CTX_use_PrivateKey_file()関数ã¨åŒã˜ã§ã™ã€‚ + ファイル引数ã«ã¯ã€RSA秘密éµãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒã€å¼•æ•°formatã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + 失敗ã®åŽŸå› ã«ã¯æ¬¡ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ï¼šå…¥åŠ›éµãƒ•ã‚¡ã‚¤ãƒ«ãŒèª¤ã£ãŸå½¢å¼ã§ã‚る〠+ ã¾ãŸã¯å¼•æ•°formatを使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹å ´åˆã€ + ファイルãŒå­˜åœ¨ã—ãªã„ã€èª­ã¿è¾¼ã‚ãªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã‚‹ã€ãƒ¡ãƒ¢ãƒªä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param file フォーマットã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§ã€WolfSSL SSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹RSA秘密éµã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param format RSA秘密éµã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰å½¢å¼ã‚’指定ã—ã¾ã™ã€‚指定å¯èƒ½ãªãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆå€¤ã¯ï¼šSSL_FILETYPE_PEM 㨠SSL_FILETYPE_ASN1 + _Example_ \code int ret = 0; @@ -810,10 +1179,11 @@ int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx, const char* file, int format); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€æœ‰åŠ¹ãªã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ãŸã‚ã«ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§9ã®æœ€å¤§ãƒã‚§ãƒ¼ãƒ³æ·±åº¦ã‚’è¿”ã—ã¾ã™ã€‚ã“ã‚Œã¯ã€NULL以外ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚ªãƒ–ジェクト(SSL)ãŒã‚ã‚Šã¾ã™ã€‚ - \return MAX_CHAIN_DEPTH wolfssl_ctx構造ãŒnullã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚デフォルトã§ã¯å€¤ã¯9ã§ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造ãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€æœ‰åŠ¹ãªã‚»ãƒƒã‚·ãƒ§ãƒ³ï¼ˆNULL以外ã®å¼•æ•°ssl)ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã«ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§9ã®æœ€å¤§ãƒã‚§ãƒ¼ãƒ³æ·±åº¦ã‚’è¿”ã—ã¾ã™ã€‚ + \return MAX_CHAIN_DEPTH WOLFSSL構造体ãŒNULLã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚デフォルトã§ã¯å€¤ã¯9ã§ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -832,10 +1202,11 @@ long wolfSSL_get_verify_depth(WOLFSSL* ssl); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€CTX構造を使用ã—ã¦è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³æ·±åº¦ã‚’å–å¾—ã—ã¾ã™ã€‚ - \return MAX_CHAIN_DEPTH CTX構造体ãŒNULLã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚最大証明書ãƒã‚§ãƒ¼ãƒ³ãƒ”ア深度ã®å®šæ•°è¡¨ç¾ã€‚ - \return BAD_FUNC_ARG CTX構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造体構造を使用ã—ã¦è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³æ·±åº¦ã‚’å–å¾—ã—ã¾ã™ã€‚ + \return MAX_CHAIN_DEPTH WOLFSSL_CTX構造体ãŒNULLã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚最大証明書ãƒã‚§ãƒ¼ãƒ³ãƒ”ア深度ã®å®šæ•°è¡¨ç¾ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_METHOD method; // protocol method @@ -855,12 +1226,19 @@ long wolfSSL_CTX_get_verify_depth(WOLFSSL_CTX* ctx); /*! - \ingroup openSSL - \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLセッション(WolfSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚証明書ファイルã¯ãƒ•ã‚¡ã‚¤ãƒ«å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚format引数ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—(SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM)を指定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ファイルã¯èª¤ã£ãŸå½¢å¼ã§ã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãƒ•ã‚¡ã‚¤ãƒ«ã§base16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ãŒå¤±æ•—ã™ã‚‹ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param file wolfssl sslセッションã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã¯ã€ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã—ã¾ã™ã€‚ + \ingroup openSSL + \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLセッション(WOLFSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + 証明書ファイルã¯ãƒ•ã‚¡ã‚¤ãƒ«å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ + 引数formatã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—(SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM)を指定ã—ã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ãŒã‚ã‚Šã¾ã™ã€‚ + ファイルãŒèª¤ã£ãŸå½¢å¼ã€ã¾ãŸã¯å¼•æ•°formatを使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚ŒãŸã€ + メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«ã§Base16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ãŒå¤±æ•—ã—㟠+ \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param file WOLFSSL構造体ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param format 証明書ファイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰å½¢å¼ã‚’指定ã—ã¾ã™ã€‚指定å¯èƒ½ãªãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆå€¤ã¯ï¼šSSL_FILETYPE_PEM 㨠SSL_FILETYPE_ASN1 + _Example_ \code int ret = 0; @@ -880,12 +1258,25 @@ int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format); /*! - \ingroup openSSL - \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLセッション(WolfSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚キーファイルã¯ãƒ•ã‚¡ã‚¤ãƒ«å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚format引数ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®å½¢å¼ã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ - SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。外部キーストアを使用ã—ã€ç§˜å¯†éµã‚’æŒã£ã¦ã„ãªã„å ´åˆã¯ã€ä»£ã‚ã‚Šã«å…¬é–‹éµã‚’入力ã—ã¦CryProコールãƒãƒƒã‚¯ã‚’登録ã—ã¦ç½²åを処ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ãŸã‚ã«ã¯ã€Cryptoコールãƒãƒƒã‚¯ã¾ãŸã¯PKコールãƒãƒƒã‚¯ã‚’使用ã—ãŸãƒ“ルドã§æ§‹ç¯‰ã§ãã¾ã™ã€‚Cryptoコールãƒãƒƒã‚¯ã‚’有効ã«ã™ã‚‹ã«ã¯ã€--enable-cryptocbã¾ãŸã¯wolf_crypto_cbを使用ã—ã€wc_cryptocb_registerDeviceを使用ã—ã¦æš—å·ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’登録ã—ã€wolfssl_setdevidを使用ã—ã¦é–¢é€£ã™ã‚‹devidを設定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ファイルã¯èª¤ã£ãŸå½¢å¼ã§ã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã™ãŒã€ãƒ•ã‚¡ã‚¤ãƒ«ã¯å­˜åœ¨ã—ã¾ã›ã‚“。メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã™ã‚‹ã¨ã€ãƒ™ãƒ¼ã‚¹16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ãŒãƒ•ã‚¡ã‚¤ãƒ«ã§å¤±æ•—ã—ã€ã‚­ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã¯æš—å·åŒ–ã•ã‚Œã¦ã„ã¾ã™ãŒã€ãƒ‘スワードã¯æä¾›ã•ã‚Œã¦ã„ã¾ã›ã‚“。 - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param file wolfssl sslセッションã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹ã‚­ãƒ¼ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã¯ã€ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã—ã¾ã™ã€‚ + \ingroup openSSL + \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµãƒ•ã‚¡ã‚¤ãƒ«ã‚’SSLセッション(WOLFSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + éµãƒ•ã‚¡ã‚¤ãƒ«ã¯å¼•æ•°fileã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ + 引数formatã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¿ã‚¤ãƒ—(SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEMãŒæŒ‡å®šå¯ï¼‰ã‚’指定ã—ã¾ã™ã€‚ + 外部キーストアを使用ã—ã€ç§˜å¯†éµã‚’æŒã£ã¦ã„ãªã„å ´åˆã¯ã€ä»£ã‚ã‚Šã«å…¬é–‹éµã‚’入力ã—ã¦CryProコールãƒãƒƒã‚¯ã‚’登録ã—ã¦ç½²åを処ç†ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®ãŸã‚ã«ã¯ã€Cryptoコールãƒãƒƒã‚¯ã¾ãŸã¯PKコールãƒãƒƒã‚¯ã‚’使用ã—ãŸã‚³ãƒ³ãƒ•ã‚£ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§ãƒ“ルドã—ã¾ã™ã€‚ + Cryptoコールãƒãƒƒã‚¯ã‚’有効ã«ã™ã‚‹ã«ã¯ã€--enable-cryptocbã¾ãŸã¯WOLF_CRYPTO_CBマクロを使用ã—ã¦ãƒ“ルドã—〠+ wc_CryptoCb_RegisterDeviceを使用ã—ã¦æš—å·ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’登録ã—〠+ wolfSSL_SetDevIdを使用ã—ã¦é–¢é€£ã™ã‚‹devIdを設定ã—ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ãŒã‚ã‚Šã¾ã™ã€‚ + ファイルãŒèª¤ã£ãŸå½¢å¼ã€ã¾ãŸã¯å¼•æ•°formatを使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚ŒãŸã€ + メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«ã§Base16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ãŒå¤±æ•—ã—㟠+ \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param file WOLFSSL構造体ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param format 秘密éµãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰å½¢å¼ã‚’指定ã—ã¾ã™ã€‚指定å¯èƒ½ãªãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆå€¤ã¯ï¼šSSL_FILETYPE_PEM 㨠SSL_FILETYPE_ASN1 + _Example_ \code int ret = 0; @@ -907,11 +1298,19 @@ int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format); /*! - \ingroup openSSL - \brief ã“ã®é–¢æ•°ã¯ã€Chain of chainã‚’SSLセッション(WolfSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚証明書ãƒã‚§ãƒ¼ãƒ³ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãƒ•ã‚¡ã‚¤ãƒ«å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã€PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€MAX_CHAIN_DEPTH(Default = 9ã€internal.hã§å®šç¾©ã•ã‚Œã¦ã„る)証明書ã«åŠ ãˆã¦ã€ã‚µãƒ–ジェクト証明書を処ç†ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ファイルã¯èª¤ã£ãŸå½¢å¼ã§ã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã¾ã™ã€‚メモリã®çŠ¶æ…‹ãŒç™ºç”Ÿã—ã¾ã™ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup openSSL + \brief ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’SSLセッションWOLFSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + 証明書ãƒã‚§ãƒ¼ãƒ³ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã¯å¼•æ•°fileã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã€PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€MAX_CHAIN_DEPTH(既定ã§9ã€internal.hã§å®šç¾©ã•ã‚Œã¦ã„る)証明書ã«åŠ ãˆã¦ã€ã‚µãƒ–ジェクト証明書を処ç†ã—ã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ãŒã‚ã‚Šã¾ã™ï¼š + ファイルãŒèª¤ã£ãŸå½¢å¼ã€ã¾ãŸã¯å¼•æ•°formatを使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚ŒãŸã€ + メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«ã§base16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ãŒå¤±æ•—ã—㟠+ \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param file WOLFSSL構造体ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + 証明書ã¯PEMå½¢å¼ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + _Example_ \code int ret = 0; @@ -930,11 +1329,18 @@ int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char *file); /*! - \ingroup openSSL - \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã§ä½¿ç”¨ã•ã‚Œã¦ã„るプライベートRSAキーをSSLセッション(WolfSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfsslãŒOpenSSL互æ›å±¤æœ‰åŠ¹ï¼ˆ--enable-openSSlextraã€#define openssl_extra)ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã€ã‚ˆã‚Šä¸€èˆ¬çš„ã«ä½¿ç”¨ã•ã‚Œã‚‹wolfssl_use_privatekey_file()関数ã¨åŒã˜ã§ã™ã€‚ファイル引数ã«ã¯ã€RSA秘密éµãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒã€ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã€å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚入力キーファイルãŒèª¤ã£ãŸå½¢å¼ã§ã‚ã‚‹ã‹ã€ã¾ãŸã¯ã€Œformatã€å¼•æ•°ã‚’使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ãªã„ã€èª­ã¿è¾¼ã‚ãªã„ã€ã¾ãŸã¯ç ´æã—ã¦ã„ãªã„ã€ãƒ¡ãƒ¢ãƒªä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ã¾ã™ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup openSSL + \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹RSA秘密éµã‚’SSLセッション(WOLFSSL構造体)ã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfSSLãŒOpenSSL互æ›APIを有効(--enable-openSSlExtraã€#define OPENSSL_EXTRA)ã§ãƒ“ルドã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã€ + より一般的ã«ä½¿ç”¨ã•ã‚Œã‚‹wolfSSL_use_PrivateKey_file()関数ã¨åŒã˜ã§ã™ã€‚ + 引数fileã«ã¯ã€RSA秘密éµãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒã€ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 関数呼ã³å‡ºã—ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + å¯èƒ½ãªåŽŸå› ã«ã¯æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ãŒã‚ã‚Šã¾ã™ï¼š + ファイルãŒèª¤ã£ãŸå½¢å¼ã€ã¾ãŸã¯å¼•æ•°formatを使用ã—ã¦èª¤ã£ãŸå½¢å¼ãŒä¸Žãˆã‚‰ã‚ŒãŸã€ + メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸã€ãƒ•ã‚¡ã‚¤ãƒ«ã§Base16ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ãŒå¤±æ•—ã—㟠+ \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret = 0; @@ -956,12 +1362,21 @@ int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯wolfssl_ctx_load_verify_locationsã¨ä¼¼ã¦ã„ã¾ã™ãŒã€Derフォーマットã•ã‚ŒãŸCAファイルをSSLコンテキスト(WolfSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚ãã‚Œã¯ã¾ã PEMå½¢å¼ã®CAファイルをロードã™ã‚‹ãŸã‚ã«ã‚‚使用ã•ã‚Œã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ã“れらã®è¨¼æ˜Žæ›¸ã¯ã€ä¿¡é ¼ã§ãるルート証明書ã¨ã—ã¦æ‰±ã‚ã‚Œã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ãƒ”ã‚¢ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ファイル引数ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€å˜ä¸€ã®è¨¼æ˜Žæ›¸ã¾ãŸã¯è¤‡æ•°ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚り得る。複数ã®CA CERTãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€WolfSSLã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜é †åºã§ãれらをロードã—ã¾ã™ã€‚ format引数ã¯ã€è¨¼æ˜Žæ›¸ãŒSSL_FILETYPE_PEMã¾ãŸã¯SSL_FILETYPE_ASN1(DER)ã®ã„ãšã‚Œã‹ã«ã‚ã‚‹å½¢å¼ã‚’指定ã—ã¾ã™ã€‚ wolfssl_ctx_load_verify_locationsã¨ã¯ç•°ãªã‚Šã€ã“ã®é–¢æ•°ã¯ç‰¹å®šã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘スã‹ã‚‰ã®CA証明書ã®ãƒ­ãƒ¼ãƒ‰ã‚’許å¯ã—ã¾ã›ã‚“。ã“ã®é–¢æ•°ã¯ã€WolfSSLライブラリãŒwolfssl_der_doad定義ã•ã‚ŒãŸçŠ¶æ…‹ã§ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã¨ãã«ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FAILURE 失敗ã™ã‚‹ã¨ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯wolfSSL_CTX_load_verify_locationsã¨ä¼¼ã¦ã„ã¾ã™ãŒã€ + DERフォーマットã•ã‚ŒãŸCAファイルをSSLコンテキスト(WOLFSSL_CTX)ã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚ + ãã‚Œã¯ã¾ã PEMå½¢å¼ã®CAファイルをロードã™ã‚‹ãŸã‚ã«ã‚‚使用ã•ã‚Œã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 + ã“れらã®è¨¼æ˜Žæ›¸ã¯ã€ä¿¡é ¼ã§ãるルート証明書ã¨ã—ã¦æ‰±ã‚ã‚Œã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ãƒ”ã‚¢ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + ファイル引数ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€å˜ä¸€ã®è¨¼æ˜Žæ›¸ã¾ãŸã¯è¤‡æ•°ã®è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚‚å¯èƒ½ã€‚ + 複数ã®CA証明書ãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«ã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã€wolfSSLã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«è¡¨ç¤ºã•ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜é †åºã§ãれらをロードã—ã¾ã™ã€‚ + 引数formatã¯ã€è¨¼æ˜Žæ›¸ãŒSSL_FILETYPE_PEMã¾ãŸã¯SSL_FILETYPE_ASN1(DER)ã®ã„ãšã‚Œã‹ã«ã‚ã‚‹å½¢å¼ã‚’指定ã—ã¾ã™ã€‚ + wolfSSL_CTX_load_verify_locationsã¨ã¯ç•°ãªã‚Šã€ã“ã®é–¢æ•°ã¯ç‰¹å®šã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‘スã‹ã‚‰ã®CA証明書ã®ãƒ­ãƒ¼ãƒ‰ã‚’許å¯ã—ã¾ã›ã‚“。 + ã“ã®é–¢æ•°ã¯ã€wolfSSLライブラリãŒWOLFSSL_DER_LOADマクロãŒå®šç¾©ã•ã‚ŒãŸçŠ¶æ…‹ã§ãƒ“ルドã•ã‚ŒãŸã¨ãã«ã®ã¿åˆ©ç”¨å¯èƒ½ã§ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 失敗ã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param file wolfssl SSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹CA証明書をå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã‚’フォーマットã§æŒ‡å®šã•ã‚ŒãŸå½¢å¼ã§æŒ‡å®šã—ã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -981,10 +1396,11 @@ const char* file, int format); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€å…¥åŠ›ã®ãŸã‚ã®æ‰€æœ›ã®SSL / TLSプロトコル方å¼ã‚’å–ã£ã¦ã€æ–°ã—ã„SSLコンテキストを作æˆã—ã¾ã™ã€‚ - \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒæ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_ctxã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return NULL 失敗ã™ã‚‹ã¨ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€æ‰€æœ›ã®SSL/TLSプロトコル用メソッド構造体を引数ã«å–ã£ã¦ã€æ–°ã—ã„SSLコンテキストを作æˆã—ã¾ã™ã€‚ + \return pointer æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -1005,10 +1421,11 @@ WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD*); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯æ–°ã—ã„SSLセッションを作æˆã—ã€ã™ã§ã«ä½œæˆã•ã‚ŒãŸSSLコンテキストを入力ã¨ã—ã¦ä½œæˆã—ã¾ã™ã€‚ - \return * æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ãŒæ–°ã—ã作æˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return NULL 失敗ã™ã‚‹ã¨ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã™ã§ã«ä½œæˆã•ã‚ŒãŸSSLコンテキスト(WOLFSSL_CTX)を入力ã¨ã—ã¦ã€æ–°ã—ã„SSLセッション(WOLFSSL)を作æˆã—ã¾ã™ã€‚ + \return æˆåŠŸã—ãŸå ´åˆã€æ–°ã—ã作æˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code #include @@ -1031,11 +1448,13 @@ WOLFSSL* wolfSSL_new(WOLFSSL_CTX*); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã®å…¥å‡ºåŠ›æ©Ÿèƒ½ã¨ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ï¼ˆFD)を割り当ã¦ã¾ã™ã€‚通常ã“ã‚Œã¯ã‚½ã‚±ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã«ãªã‚Šã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return Bad_FUNC_ARG 失敗ã™ã‚‹ã¨ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã®å…¥å‡ºåŠ›æ©Ÿèƒ½ã¨ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­(fd)を割り当ã¦ã¾ã™ã€‚通常ã“ã‚Œã¯ã‚½ã‚±ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã«ãªã‚Šã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param fd SSL/TLS接続ã«ä½¿ç”¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—ã‚¿ + _Example_ \code int sockfd; @@ -1059,10 +1478,13 @@ \brief ã“ã®é–¢æ•°ã¯ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—ã‚¿(fd)ã‚’SSLコãƒã‚¯ã‚·ãƒ§ãƒ³ã®å…¥å‡ºåŠ›æ‰‹æ®µã¨ã—ã¦è¨­å®šã—ã¾ã™ã€‚ 通常ã¯ã‚½ã‚±ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—ã‚¿ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯DTLS専用ã®APIã§ã‚ã‚Šã€ã‚½ã‚±ãƒƒãƒˆã¯æŽ¥ç¶šæ¸ˆã¿ã¨ãƒžãƒ¼ã‚¯ã•ã‚Œã¾ã™ã€‚ ã—ãŸãŒã£ã¦ã€ä¸Žãˆã‚‰ã‚ŒãŸfdã«å¯¾ã™ã‚‹recvfromã¨sendto呼ã³å‡ºã—ã§ã®addrã¨addr_lenã¯NULLã«è¨­å®šã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return Bad_FUNC_ARG 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfSSL_new()ã§ç”Ÿæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param fd SSL/TLSコãƒã‚¯ã‚·ãƒ§ãƒ³ã«ä½¿ç”¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—タ。 + _Example_ \code int sockfd; @@ -1086,26 +1508,75 @@ int wolfSSL_set_dtls_fd_connected(WOLFSSL* ssl, int fd); /*! - \ingroup IO - \brief 渡ã•ã‚ŒãŸå„ªå…ˆé †ä½ã®æš—å·ã®åå‰ã‚’å–å¾—ã—ã¾ã™ã€‚ - \return string æˆåŠŸ - \return 0 優先順ä½ã¯ç¯„囲外ã¾ãŸã¯ç„¡åŠ¹ã§ã™ã€‚ + \ingroup Setup + + \brief ã“ã®é–¢æ•°ã¯DTLS ClientHelloメッセージãŒæ­£ã—ã処ç†ã§ããŸéš›ã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’設定ã—ã¾ã™ã€‚ + クッキー交æ›ãƒ¡ã‚«ãƒ‹ã‚ºãƒ ã‚’使用ã™ã‚‹å ´åˆ(DTLS1.2ã®HelloVerifyRequest ã‹ + DTLS1.3ã®ã‚¯ãƒƒã‚­ãƒ¼æ‹¡å¼µã‚’ä¼´ã£ãŸHelloRetryRequestã®ã„ãšã‚Œã‹ã‚’使用ã™ã‚‹å ´åˆ)ã«ã¯ã€ + クッキー交æ›ãŒæˆåŠŸã—ãŸæ™‚点ã§ã“ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã¯ã²ã¨ã¤ã®WOLFSSLオブジェクトを新ãŸãªæŽ¥ç¶šã‚’å¾…ã¡å—ã‘るリスナーã¨ã—ã¦ä½¿ã„, + ClientHelloãŒæ¤œè¨¼ã•ã‚ŒãŸWOLFSSLオブジェクトã‹ã‚‰çµ¶ç¸ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã“ã®å ´åˆã®æ¤œè¨¼ã¯ã‚¯ãƒƒã‚­ãƒ¼äº¤æ›ã‹ClientHelloãŒæ­£ã—ã„フォーマットã«ãªã£ã¦ã„ã‚‹ã‹ã®ãƒã‚§ãƒƒã‚¯ã«ã‚ˆã£ã¦ãªã•ã‚Œã¾ã™ã€‚ + + DTLS 1.2: + https://datatracker.ietf.org/doc/html/rfc6347#section-4.2.1 + DTLS 1.3: + https://www.rfc-editor.org/rfc/rfc8446#section-4.2.2 + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param fd SSL/TLSコãƒã‚¯ã‚·ãƒ§ãƒ³ã«ä½¿ç”¨ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ã‚£ã‚¹ã‚¯ãƒªãƒ—タ。 + + _Example_ + \code + + // Called when we have verified a connection + static int chGoodCb(WOLFSSL* ssl, void* arg) + { + // setup peer and file descriptors + + } + + if (wolfDTLS_SetChGoodCb(ssl, chGoodCb, NULL) != WOLFSSL_SUCCESS) { + // error setting callback + } + \endcode + + \sa wolfSSL_set_dtls_fd_connected +*/ +int wolfDTLS_SetChGoodCb(WOLFSSL* ssl, ClientHelloGoodCb cb, void* user_ctx); + +/*! + \ingroup IO + + \brief ã“ã®é–¢æ•°ã¯å¼•æ•°ã§æ¸¡ã•ã‚ŒãŸå„ªå…ˆé †ä½ã®æš—å·å(Cipher)文字列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯æš—å·å(Cipher)文字列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 引数ã§æ¸¡ã•ã‚ŒãŸå„ªå…ˆé †ä½ãŒç¯„囲外ã‹ã‚ã‚‹ã„ã¯ç„¡åŠ¹ãªå€¤ã§ã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param priority 整数値ã§æŒ‡å®šã™ã‚‹å„ªå…ˆé †ä½ + _Example_ \code printf("The cipher at 1 is %s", wolfSSL_get_cipher_list(1)); \endcode + \sa wolfSSL_CIPHER_get_name \sa wolfSSL_get_current_cipher */ char* wolfSSL_get_cipher_list(int priority); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯wolfsslã§ã‚¤ãƒãƒ¼ãƒ–ルã•ã‚ŒãŸæš—å·ã‚’å–å¾—ã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯wolfSSã§æœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ã‚‹æš—å·å(Cipher)ã‚’å–å¾—ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG bufパラメータãŒnullã®å ´åˆã€ã¾ãŸã¯len引数ãŒã‚¼ãƒ­ä»¥ä¸‹ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BUFFER_E ãƒãƒƒãƒ•ã‚¡ãŒå分ã«å¤§ãããªãã€ã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒ­ãƒ¼ã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ - \param buf ãƒãƒƒãƒ•ã‚¡ã‚’表ã™æ–‡å­—ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG 引数bufãŒNULLã®å ´åˆã€ã¾ãŸã¯å¼•æ•°lenãŒã‚¼ãƒ­ä»¥ä¸‹ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E ãƒãƒƒãƒ•ã‚¡ãŒå分ã«å¤§ãããªãã€ã‚ªãƒ¼ãƒãƒ¼ãƒ•ãƒ­ãƒ¼ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param buf 文字列を格ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param len ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code static void ShowCiphers(void){ @@ -1124,10 +1595,12 @@ int wolfSSL_get_ciphers(char* buf, int len); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€å¼•æ•°ã‚’wolfssl_get_cipher_name_internalã«æ¸¡ã™ã“ã¨ã«ã‚ˆã£ã¦ã€DHE-RSAã®å½¢å¼ã®æš—å·åã‚’å–å¾—ã—ã¾ã™ã€‚ - \return string ã“ã®é–¢æ•°ã¯ã€ä¸€è‡´ã—ãŸæš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã®æ–‡å­—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚ - \return NULL エラーã¾ãŸã¯æš—å·ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€å¼•æ•°ã‚’wolfSSL_get_cipher_name_internalã«æ¸¡ã™ã“ã¨ã«ã‚ˆã£ã¦ã€DHE-RSAã®å½¢å¼ã®æš—å·åã‚’å–å¾—ã—ã¾ã™ã€‚ + \return æˆåŠŸæ™‚ã«ã¯ä¸€è‡´ã—ãŸæš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã®æ–‡å­—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL エラーã¾ãŸã¯æš—å·ãŒè¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -1149,9 +1622,10 @@ const char* wolfSSL_get_cipher_name(WOLFSSL* ssl); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã®å…¥å‡ºåŠ›æ©Ÿèƒ½ã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ï¼ˆFD)を返ã—ã¾ã™ã€‚通常ã“ã‚Œã¯ã‚½ã‚±ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã«ãªã‚Šã¾ã™ã€‚ - \return fd 正常ã«ã‚³ãƒ¼ãƒ«ãŒSSLセッションファイル記述å­ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€SSL接続ã®å…¥å‡ºåŠ›æ©Ÿèƒ½ã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­(fd)ã‚’è¿”ã—ã¾ã™ã€‚通常ã“ã‚Œã¯ã‚½ã‚±ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã«ãªã‚Šã¾ã™ã€‚ + \return fd æˆåŠŸæ™‚ã«ã¯SSLセッションã«é–¢é€£ã¤ã‘られã¦ã„るファイル記述å­ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code int sockfd; @@ -1165,10 +1639,18 @@ int wolfSSL_get_fd(const WOLFSSL*); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€wolfsslオブジェクトã«åŸºç¤Žã¨ãªã‚‹I / OãŒãƒ–ロックã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’通知ã—ã¾ã™ã€‚アプリケーションãŒWolfSSLオブジェクトを作æˆã—ãŸå¾Œã€ãƒ–ロッキング以外ã®ã‚½ã‚±ãƒƒãƒˆã§ä½¿ç”¨ã•ã‚Œã‚‹å ´åˆã¯ã€wolfssl_set_using_nonblock()を呼ã³å‡ºã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€wolfsslオブジェクトã¯ã€Ewouldblockã‚’å—ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSLオブジェクトã«åŸºç¤Žã¨ãªã‚‹I/OãŒãƒŽãƒ³ãƒ–ロックã§ã‚ã‚‹ã“ã¨ã‚’通知ã—ã¾ã™ã€‚ + アプリケーションãŒWOLFSSLオブジェクトを作æˆã—ãŸå¾Œã€ãƒ–ロッキング以外ã®ã‚½ã‚±ãƒƒãƒˆã§ä½¿ç”¨ã™ã‚‹å ´åˆã¯ã€ + wolfssl_set_using_nonblock()を呼ã³å‡ºã—ã¾ã™ã€‚ + ã“ã‚Œã«ã‚ˆã‚Šã€wolfsslオブジェクトã¯ã€EWOULDBLOCKã‚’å—ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + + \return ãªã— + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param nonblock WOLFSSLオブジェクトã«ãƒŽãƒ³ãƒ–ロッキングI/Oを使用ã™ã‚‹ã“ã¨ã‚’通知ã™ã‚‹ãƒ•ãƒ©ã‚°ã€‚ + 1を指定ã™ã‚‹ã“ã¨ã§ãƒŽãƒ³ãƒ–ロッキングI/Oを使用ã™ã‚‹ã“ã¨ã‚’指定ã™ã‚‹ã€‚ + + _Example_ \code WOLFSSL* ssl = 0; @@ -1182,10 +1664,15 @@ void wolfSSL_set_using_nonblock(WOLFSSL* ssl, int nonblock); /*! - \ingroup IO - \brief ã“ã®æ©Ÿèƒ½ã«ã‚ˆã‚Šã€WolfSSLãŒéžãƒ–ロッキングI / Oを使用ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’アプリケーションãŒåˆ¤æ–­ã§ãã¾ã™ã€‚WolfSSLãŒãƒŽãƒ³ãƒ–ロッキングI / Oを使用ã—ã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€wolfsslオブジェクトã¯ã€Ewouldblockã‚’å—ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - \return 0 基礎ã¨ãªã‚‹I / OãŒãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚ - \return 1 基礎ã¨ãªã‚‹I / Oã¯éžãƒ–ロッキングã§ã™ã€‚ + \ingroup IO + \brief ã“ã®æ©Ÿèƒ½ã«ã‚ˆã‚Šã€wolfSSLãŒãƒŽãƒ³ãƒ–ロッキングI/Oを使用ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’アプリケーションãŒåˆ¤æ–­ã§ãã¾ã™ã€‚ + wolfSSLãŒãƒŽãƒ³ãƒ–ロッキングI/Oを使用ã—ã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ã€‚ + アプリケーションãŒWOLFSSLオブジェクトを生æˆã—ãŸå¾Œã«wolfSSL_set_using_nonblock()を呼ã³å‡ºã—ã¦ãƒŽãƒ³ãƒ–ロッキングソケットを使ã†ã¨ã“ã®é–¢æ•°ã¯ï¼‘ã‚’è¿”ã—ã¾ã™ã€‚ + ã“ã‚Œã«ã‚ˆã‚Šã€WOLFSSLオブジェクトã¯ã€recevfromãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã›ãšä»£ã‚ã‚Šã«EWOULDBLOCKã‚’å—ä¿¡ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ + + \return 0 基礎ã¨ãªã‚‹I/OãŒãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚ + \return 1 基礎ã¨ãªã‚‹I/Oã¯éžãƒ–ロッキングã§ã™ã€‚ + _Example_ \code int ret = 0; @@ -1202,13 +1689,22 @@ int wolfSSL_get_using_nonblock(WOLFSSL*); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€ãƒãƒƒãƒ•ã‚¡ã€ãƒ‡ãƒ¼ã‚¿ã€SSL接続ã€SSLã«SZãƒã‚¤ãƒˆã‚’書ãè¾¼ã¿ã¾ã™ã€‚å¿…è¦ã«å¿œã˜ã¦ã€wolfssl_write()ã¯ã¾ã wolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã«ã‚ˆã£ã¦ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfssl_write()ã¯SSL / TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚wolfssl_write()ã¯ã€ãƒ–ロックã¨éžãƒ–ロッキングI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfssl_write()ãŒwolfssl_write()ã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«wolfssl_write()ãŒæˆ»ã‚Šã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚ãã®çµæžœã€åŸºç¤Žã¨ãªã‚‹I / OãŒæº–å‚™ãŒã§ããŸã‚‰ã€å‘¼ã³å‡ºã—å´ãƒ—ロセスã¯wolfssl_write()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€WolfSSL_WRITE()ã¯ã€ã‚µã‚¤ã‚ºSZã®ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ãŒå®Œå…¨ã«æ›¸ã‹ã‚ŒãŸã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã€æˆ»ã‚‹ã ã‘ã§ã™ã€‚ - \return >0 æˆåŠŸæ™‚ã«æ›¸ã‹ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã€‚ - \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã¯ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WOLFSSL_WRITE()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を使用ã—ã¦ãã ã•ã„。 - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param data ピアã«é€ä¿¡ã•ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ãƒãƒƒãƒ•ã‚¡ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€ãƒãƒƒãƒ•ã‚¡ã‚ã‚‹ã„ã¯ãƒ‡ãƒ¼ã‚¿ã‹ã‚‰ã€SSL接続ã«å¯¾ã—ã¦ã€szãƒã‚¤ãƒˆã‚’書ãè¾¼ã¿ã¾ã™ã€‚ + å¿…è¦ã«å¿œã˜ã¦ã€wolfSSL_write()ã®å‘¼ã³å‡ºã—時点ã§ã¯ã¾ã wolfSSL_connect()ã¾ãŸã¯wolfSSL_accept()ãŒã¾ã å‘¼ã³å‡ºã•ã‚Œã¦ã„ãªã„å ´åˆã€SSL/TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ + wolfSSL_write()ã¯ã€ãƒ–ロックã¨ãƒŽãƒ³ãƒ–ロッキングI/Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚ + 基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒŽãƒ³ãƒ–ロッキングã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfSSL_write()ãŒè¦æ±‚を満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã‚‰wolfSSL_write()ã¯é–¢æ•°å‘¼ã³å‡ºã—ã‹ã‚‰ã™ãã«æˆ»ã‚Šã¾ã™ã€‚ + ã“ã®å ´åˆã€wolfSSL_get_error()ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’è¿”ã—ã¾ã™ã€‚ + ãã®çµæžœã€åŸºç¤Žã¨ãªã‚‹I/OãŒæº–å‚™ãŒã§ããŸã‚‰ã€å‘¼ã³å‡ºã—å´ãƒ—ロセスã¯wolfssl_write()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + 基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€WolfSSL_WRITE()ã¯ã€ã‚µã‚¤ã‚ºSZã®ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ãŒå®Œå…¨ã«æ›¸ã‹ã‚ŒãŸã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã€æˆ»ã‚‹ã ã‘ã§ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯æ›¸ã込んã ãƒã‚¤ãƒˆæ•°ï¼ˆ1以上)を返ã—ã¾ã™ã€‚ + \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã¯ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WOLFSSL_WRITE()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を使用ã—ã¦ãã ã•ã„。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param data ピアã«é€ä¿¡ã•ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã§ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param sz é€ä¿¡ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã§ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL* ssl = 0; @@ -1230,13 +1726,25 @@ int wolfSSL_write(WOLFSSL* ssl, const void* data, int sz); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€SSLセッション(SSL)内部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã‹ã‚‰SZãƒã‚¤ãƒˆã‚’ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ã«èª­ã¿å‡ºã—ã¾ã™ã€‚読ã¿å–られãŸãƒã‚¤ãƒˆã¯å†…部å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚å¿…è¦ã«å¿œã˜ã¦ã€wolfssl_read()ãŒã¾ã wolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã«ã‚ˆã£ã¦ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€wolfssl_read()ãŒSSL / TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ SSL / TLSプロトコルã¯ã€æœ€å¤§ã‚µã‚¤ã‚ºã®SSLレコードを使用ã—ã¾ã™ï¼ˆæœ€å¤§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ /wolfssl/internal.h)。ãã®ãŸã‚ã€WolfSSLã¯ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’処ç†ãŠã‚ˆã³å¾©å·åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å‰ã«ã€SSLレコード全体を内部的ã«èª­ã¿å–ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãŸã‚ã€wolfssl_read()ã¸ã®å‘¼ã³å‡ºã—ã¯ã€å‘¼ã³å‡ºã—時ã«å¾©å·åŒ–ã•ã‚ŒãŸæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã™ã€‚検索ã•ã‚Œã€æ¬¡å›žã®wolfssl_read()ã¸ã®å‘¼ã³å‡ºã—ã§å¾©å·åŒ–ã•ã‚Œã‚‹å†…部WolfSSLå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã§å¾…æ©Ÿã—ã¦ã„ãªã„追加ã®å¾©å·åŒ–データãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 SZãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡å†…ã®ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå¤§ãã„å ´åˆã€SSL_READ()ã¯å†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã§ä½¿ç”¨å¯èƒ½ãªãƒã‚¤ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ BYTESãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã«ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€WOLFSSL_READ()ã¸ã®å‘¼ã³å‡ºã—ã¯æ¬¡ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å‡¦ç†ã‚’トリガーã—ã¾ã™ã€‚ - \return >0 æˆåŠŸæ™‚ã«èª­ã¿å–られãŸãƒã‚¤ãƒˆæ•°ã€‚ - \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒªãƒ¼ãƒ³ï¼ˆé€šçŸ¥ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é–‰ã˜ã‚‹ï¼‰ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã¾ãŸã¯ãƒ”ã‚¢ãŒæŽ¥ç¶šã‚’é–‰ã˜ãŸã ã‘ã§ã‚ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WOLFSL_READ()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を使用ã—ã¦ãã ã•ã„。 - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param data wolfssl_read()ãŒãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€SSLセッション(ssl)ã®å†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã‹ã‚‰szãƒã‚¤ãƒˆã‚’ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ã«èª­ã¿å‡ºã—ã¾ã™ã€‚ + 読ã¿å–られãŸãƒã‚¤ãƒˆã¯å†…部å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚ + å¿…è¦ã«å¿œã˜ã¦ã€wolfSSL_read()ã®å‘¼ã³å‡ºã—時点ã§ã¯ã¾ã wolfSSL_connect()ã¾ãŸã¯wolfSSL_accept()ãŒã¾ã å‘¼ã³å‡ºã•ã‚Œã¦ã„ãªã„å ´åˆã€SSL/TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ + SSL/TLSプロトコルã¯ã€æœ€å¤§ã‚µã‚¤ã‚ºã®SSLレコードを使用ã—ã¾ã™ï¼ˆæœ€å¤§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ /wolfssl/internal.h)。 + ãã®ãŸã‚ã€wolfSSLã¯ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’処ç†ãŠã‚ˆã³å¾©å·ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å‰ã«ã€SSLレコード全体を内部的ã«èª­ã¿å–ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®ãŸã‚ã€wolfSSL_read()ã¸ã®å‘¼ã³å‡ºã—ã¯ã€å‘¼ã³å‡ºã—時ã«å¾©å·ã•ã‚ŒãŸæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + 検索ã•ã‚Œã€æ¬¡å›žã®wolfSSL_read()ã¸ã®å‘¼ã³å‡ºã—ã§å¾©å·ã•ã‚Œã‚‹å†…部wolfSSLå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã§å¾…æ©Ÿã—ã¦ã„ãªã„追加ã®å¾©å·ãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 + szãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡å†…ã®ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šå¤§ãã„å ´åˆã€wolfSSL_read()ã¯å†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã§ä½¿ç”¨å¯èƒ½ãªãƒã‚¤ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ + BYTESãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã«ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€wolfSSL_read()ã¸ã®å‘¼ã³å‡ºã—ã¯æ¬¡ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å‡¦ç†ã‚’トリガーã—ã¾ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯èª­ã¿å–られãŸãƒã‚¤ãƒˆæ•°ï¼ˆ1以上)を返ã—ã¾ã™ã€‚ + \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒªãƒ¼ãƒ³ï¼ˆé€šçŸ¥ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é–‰ã˜ã‚‹ï¼‰ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã¾ãŸã¯ãƒ”ã‚¢ãŒæŽ¥ç¶šã‚’é–‰ã˜ãŸã ã‘ã§ã‚ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + 特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯ãƒŽãƒ³ãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦wolfSSL_read()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を使用ã—ã¦ãã ã•ã„。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param data wolfSSL_read()ãŒèª­ã¿å–るデータを格ç´ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param sz ãƒãƒƒãƒ•ã‚¡ã«èª­ã¿å–るデータã®ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL* ssl = 0; @@ -1259,13 +1767,15 @@ int wolfSSL_read(WOLFSSL* ssl, void* data, int sz); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯SSLセッション(SSL)内部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã‹ã‚‰SZãƒã‚¤ãƒˆã‚’ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€å†…部SSLセッションå—ä¿¡ãƒãƒƒãƒ•ã‚¡å†…ã®ãƒ‡ãƒ¼ã‚¿ãŒå‰Šé™¤ã•ã‚Œã¦ã„ãªã„ã‹å¤‰æ›´ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’除ã„ã¦ã€wolfssl_read()ã¨åŒã˜ã§ã™ã€‚å¿…è¦ã«å¿œã˜ã¦ã€wolfssl_read()ã®ã‚ˆã†ã«ã€wolfssl_peek()ã¯ã¾ã wolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã«ã‚ˆã£ã¦ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfssl_peek()ã¯SSL / TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ SSL / TLSプロトコルã¯ã€æœ€å¤§ã‚µã‚¤ã‚ºã®SSLレコードを使用ã—ã¾ã™ï¼ˆæœ€å¤§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ /wolfssl/internal.h)。ãã®ãŸã‚ã€WolfSSLã¯ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’処ç†ãŠã‚ˆã³å¾©å·åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å‰ã«ã€SSLレコード全体を内部的ã«èª­ã¿å–ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãŸã‚ã€wolfssl_peek()ã¸ã®å‘¼ã³å‡ºã—ã¯ã€å‘¼ã³å‡ºã—時ã«å¾©å·åŒ–ã•ã‚ŒãŸæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ wolfssl_peek()/ wolfssl_read()ã¸ã®æ¬¡ã®å‘¼ã³å‡ºã—ã§æ¤œç´¢ãŠã‚ˆã³å¾©å·åŒ–ã•ã‚Œã‚‹å†…部WolfSSLå—ä¿¡ãƒãƒƒãƒ•ã‚¡å†…ã§å¾…æ©Ÿã—ã¦ã„ãªã„追加ã®å¾©å·åŒ–データãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 SZãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡å†…ã®ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šã‚‚大ãã„å ´åˆã€SSL_PEEK()ã¯å†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã§ä½¿ç”¨å¯èƒ½ãªãƒã‚¤ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ãƒã‚¤ãƒˆãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã«ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ãªã„å ´åˆã€Wolfssl_peek()ã¸ã®å‘¼ã³å‡ºã—ã¯æ¬¡ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å‡¦ç†ã‚’トリガーã—ã¾ã™ã€‚ - \return >0 æˆåŠŸæ™‚ã«èª­ã¿å–られãŸãƒã‚¤ãƒˆæ•°ã€‚ - \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒªãƒ¼ãƒ³ï¼ˆé€šçŸ¥ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é–‰ã˜ã‚‹ï¼‰ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã¾ãŸã¯ãƒ”ã‚¢ãŒæŽ¥ç¶šã‚’é–‰ã˜ãŸã ã‘ã§ã‚ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WolfSSL_PEEK()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を使用ã—ã¦ãã ã•ã„。 - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param data wolfssl_peek()ãŒãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯SSLセッション(SSL)内部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã‹ã‚‰SZãƒã‚¤ãƒˆã‚’ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€å†…部SSLセッションå—ä¿¡ãƒãƒƒãƒ•ã‚¡å†…ã®ãƒ‡ãƒ¼ã‚¿ãŒå‰Šé™¤ã•ã‚Œã¦ã„ãªã„ã‹å¤‰æ›´ã•ã‚Œã¦ã„ãªã„ã“ã¨ã‚’除ã„ã¦ã€wolfssl_read()ã¨åŒã˜ã§ã™ã€‚å¿…è¦ã«å¿œã˜ã¦ã€wolfssl_read()ã®ã‚ˆã†ã«ã€wolfssl_peek()ã¯ã¾ã wolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã«ã‚ˆã£ã¦ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfssl_peek()ã¯SSL / TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ SSL/TLSプロトコルã¯ã€æœ€å¤§ã‚µã‚¤ã‚ºã®SSLレコードを使用ã—ã¾ã™ï¼ˆæœ€å¤§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ /wolfssl/internal.h)。ãã®ãŸã‚ã€WolfSSLã¯ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’処ç†ãŠã‚ˆã³å¾©å·åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å‰ã«ã€SSLレコード全体を内部的ã«èª­ã¿å–ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãŸã‚ã€wolfssl_peek()ã¸ã®å‘¼ã³å‡ºã—ã¯ã€å‘¼ã³å‡ºã—時ã«å¾©å·åŒ–ã•ã‚ŒãŸæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ wolfssl_peek()/ wolfssl_read()ã¸ã®æ¬¡ã®å‘¼ã³å‡ºã—ã§æ¤œç´¢ãŠã‚ˆã³å¾©å·åŒ–ã•ã‚Œã‚‹å†…部WolfSSLå—ä¿¡ãƒãƒƒãƒ•ã‚¡å†…ã§å¾…æ©Ÿã—ã¦ã„ãªã„追加ã®å¾©å·åŒ–データãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 SZãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡å†…ã®ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šã‚‚大ãã„å ´åˆã€SSL_PEEK()ã¯å†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã§ä½¿ç”¨å¯èƒ½ãªãƒã‚¤ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ãƒã‚¤ãƒˆãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã«ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ãªã„å ´åˆã€Wolfssl_peek()ã¸ã®å‘¼ã³å‡ºã—ã¯æ¬¡ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å‡¦ç†ã‚’トリガーã—ã¾ã™ã€‚ + \return æˆåŠŸæ™‚ã«ã¯èª­ã¿å–られãŸãƒã‚¤ãƒˆæ•°ï¼ˆ1以上)を返ã—ã¾ã™ã€‚ + \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒªãƒ¼ãƒ³ï¼ˆé€šçŸ¥ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é–‰ã˜ã‚‹ï¼‰ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã¾ãŸã¯ãƒ”ã‚¢ãŒæŽ¥ç¶šã‚’é–‰ã˜ãŸã ã‘ã§ã‚ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯ãƒŽãƒ³ãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦wolfSSL_peek()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を使用ã—ã¦ãã ã•ã„。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param data wolfSSL_peek()ãŒãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ + \param sz ãƒãƒƒãƒ•ã‚¡ã«èª­ã¿å–るデータã®ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL* ssl = 0; @@ -1282,10 +1792,19 @@ int wolfSSL_peek(WOLFSSL* ssl, void* data, int sz); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã€SSLクライアントãŒSSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã™ã‚‹ã®ã‚’å¾…ã¡ã¾ã™ã€‚ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€åŸºç¤Žã¨ãªã‚‹é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚wolfssl_accept()ã¯ã€ãƒ–ロックã¨éžãƒ–ロッキングI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒŽãƒ³ãƒ–ロッキングã§ã‚ã‚‹å ´åˆã€wolfssl_accept()ã¯ã€åŸºç¤Žã¨ãªã‚‹I / OãŒwolfssl_acceptã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚通話プロセスã¯ã€èª­ã¿å–ã‚Šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãŒä½¿ç”¨å¯èƒ½ã§ã‚ã‚Šã€wolfsslãŒåœæ­¢ã—ãŸå ´æ‰€ã‚’拾ã†ã¨ãã«ã€wolfssl_acceptã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚基礎ã¨ãªã‚‹I / OãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_accept()ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ãŸã‚‰ã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰æˆ»ã‚Šã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã€SSLクライアントãŒSSL/TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã™ã‚‹ã®ã‚’å¾…ã¡ã¾ã™ã€‚ + ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€åŸºç¤Žã¨ãªã‚‹é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ + wolfSSL_accept()ã¯ã€ãƒ–ロックã¨ãƒŽãƒ³ãƒ–ロッキングI/Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚ + 基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒŽãƒ³ãƒ–ロッキングã§ã‚ã‚‹å ´åˆã€wolfSSL_accept()ã¯ã€åŸºç¤Žã¨ãªã‚‹I/OãŒwolfSSL_acceptã®è¦æ±‚を満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ + ã“ã®å ´åˆã€wolfSSL_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚ + 呼ã³å‡ºã—プロセスã¯ã€èª­ã¿å–ã‚Šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãŒä½¿ç”¨å¯èƒ½ã§ã‚ã‚Šã€wolfSSLãŒåœæ­¢ã—ãŸå ´æ‰€ã‚’拾ã†ã¨ãã«ã€wolfSSL_acceptã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚ + 基礎ã¨ãªã‚‹I/OãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfSSL_accept()ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ãŸã‚‰ã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰æˆ»ã‚Šã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret = 0; @@ -1306,9 +1825,12 @@ int wolfSSL_accept(WOLFSSL*); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸwolfssl_ctxオブジェクトを解放ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯CTXå‚照数を減らã—ã€å‚照カウントãŒ0ã«é”ã—ãŸã¨ãã«ã®ã¿ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’解放ã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸWOLFSSL_CTXオブジェクトを解放ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯CTXå‚照数を減らã—ã€å‚照カウントãŒ0ã«é”ã—ãŸã¨ãã«ã®ã¿ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’解放ã—ã¾ã™ã€‚ + \return ãªã— + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -1322,9 +1844,11 @@ void wolfSSL_CTX_free(WOLFSSL_CTX*); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸwolfsslオブジェクトを解放ã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸWOLFSSLオブジェクトを解放ã—ã¾ã™ã€‚ + \return ãªã— + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code #include @@ -1340,11 +1864,21 @@ void wolfSSL_free(WOLFSSL*); /*! - \ingroup TLS - \brief ã“ã®é–¢æ•°ã¯ã€SSLセッションSSLを使用ã—ã¦ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªSSL / TLS接続をシャットダウンã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ãƒ”ã‚¢ã«ã€ŒClose Notifyã€ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é€ä¿¡ã—よã†ã¨ã—ã¾ã™ã€‚呼ã³å‡ºã—å´ã‚¢ãƒ—リケーションã¯ã€PeerãŒãã®ã€Œé–‰ã˜ã‚‹é€šçŸ¥ã€ã‚¢ãƒ©ãƒ¼ãƒˆã‚’応答ã«é€ä¿¡ã™ã‚‹ã®ã‚’å¾…ã¤ã‹ã€ã¾ãŸã¯ç›´æŽ¥wolfssl_shutdownを呼ã³å‡ºã—ãŸå¾Œï¼ˆãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã«ï¼‰wolfssl_shutdownを直接通話ã—ãŸå¾Œã«åŸºç¤Žã¨ãªã‚‹æŽ¥ç¶šã‚’åœæ­¢ã™ã‚‹ã®ã‚’å¾…ã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ã©ã¡ã‚‰ã®ã‚ªãƒ—ションã¯TLS仕様ã§è¨±å¯ã•ã‚Œã¦ã„ã¾ã™ã€‚å°†æ¥ã€åŸºç¤Žã¨ãªã‚‹æŽ¥ç¶šãŒå†ã³ä½¿ç”¨ã•ã‚Œã‚‹å ´åˆã€åŒæœŸã‚’ピア間ã§ç„¡å‚·ã®ã¾ã¾ä¿ã¤ãŸã‚ã«å®Œå…¨ãª2æ–¹å‘ã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³æ‰‹é †ã‚’実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ wolfssl_shutdown()ã¯ã€ãƒ–ロックã¨éžãƒ–ロッキングI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹I / OãŒãƒŽãƒ³ãƒ–ロッキングã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfsl_shutdown()ãŒwolfssl_shutdown()ã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸå ´åˆã€wolfssl_shutdown()ã¯ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚ãã®çµæžœã€åŸºç¤Žã¨ãªã‚‹I / OãŒæº–å‚™ãŒã§ããŸã‚‰ã€å‘¼ã³å‡ºã—å´ãƒ—ロセスã¯wolfssl_shutdown()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã«æˆ»ã‚Šã¾ã™ã€‚ - \return SSL_SHUTDOWN_NOT_DONE シャットダウンãŒçµ‚了ã—ã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã€æ©Ÿèƒ½ã‚’å†åº¦å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - \return SSL_FATAL_ERROR 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚より具体的ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«å¯¾ã—ã¦wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \ingroup TLS + \brief ã“ã®é–¢æ•°ã¯ã€å¼•æ•°sslã®SSLセッションã«å¯¾ã—ã¦ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªSSL/TLS接続をシャットダウンã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€ãƒ”ã‚¢ã«"Close Notify"アラートをé€ä¿¡ã—よã†ã¨ã—ã¾ã™ã€‚ + 呼ã³å‡ºã—å´ã‚¢ãƒ—リケーションã¯ã€PeerãŒãã®"Close Notify"アラートを応答ã¨ã—ã¦é€ä¿¡ã—ã¦ãã‚‹ã®ã‚’å¾…ã¤ã‹ã€ + ã¾ãŸã¯wolfSSL_shutdownã‹ã‚‰å‘¼ã³å‡ºã—ãŒæˆ»ã£ãŸæ™‚点ã§ï¼ˆãƒªã‚½ãƒ¼ã‚¹ã‚’ä¿å­˜ã™ã‚‹ãŸã‚ã«ï¼‰ä¸‹å±¤ã®æŽ¥ç¶šã‚’切断ã™ã‚‹ã®ã‚’å¾…ã¤ã“ã¨ãŒã§ãã¾ã™ã€‚ + ã©ã¡ã‚‰ã®ã‚ªãƒ—ションもTLS仕様ã§è¨±ã•ã‚Œã¦ã„ã¾ã™ã€‚シャットダウンã—ãŸå¾Œã«ä¸‹å±¤ã®æŽ¥ç¶šã‚’å†ã³åˆ¥ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ã™ã‚‹äºˆå®šãªã‚‰ã°ã€ãƒ”ア間ã§åŒæœŸã‚’ä¿ã¤ãŸã‚ã«å®Œå…¨ãª2æ–¹å‘ã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³æ‰‹é †ã‚’実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + wolfSSL_shutdown()ã¯ã€ãƒ–ロックã¨ãƒŽãƒ³ãƒ–ロッキングI/Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚ + 下層ã®I/OãŒãƒŽãƒ³ãƒ–ロッキングã®å ´åˆã€wolfSSL_shutdown()ãŒè¦æ±‚を満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸå ´åˆã€wolfSSL_shutdown()ã¯ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ + ã“ã®å ´åˆã€wolfSSL_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚ + ãã®çµæžœã€ä¸‹å±¤ã®I/OãŒæº–å‚™ãŒã§ããŸã‚‰ã€å‘¼ã³å‡ºã—å´ãƒ—ロセスã¯wolfSSL_shutdown()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_SHUTDOWN_NOT_DONE シャットダウンãŒçµ‚了ã—ã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã€é–¢æ•°ã‚’å†åº¦å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \return SSL_FATAL_ERROR 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚より具体的ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã¯wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code #include @@ -1363,14 +1897,24 @@ int wolfSSL_shutdown(WOLFSSL*); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€åŸºç¤Žã¨ãªã‚‹æ›¸ãè¾¼ã¿æ“作ã®ãŸã‚ã«æŒ‡å®šã•ã‚ŒãŸãƒ•ãƒ©ã‚°ã‚’使用ã—ã¦ã€ãƒãƒƒãƒ•ã‚¡ã€ãƒ‡ãƒ¼ã‚¿ã€ãƒ‡ãƒ¼ã‚¿ã‹ã‚‰SZãƒã‚¤ãƒˆã‚’SSL接続SSLã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚å¿…è¦ã«å¿œã˜ã¦ã€wolfssl_send()ãŒã¾ã wolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã«ã‚ˆã£ã¦ã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€wolfssl_send()ãŒSSL / TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚wolfssl_send()ã¯ã€ãƒ–ロックã¨éžãƒ–ロッキングI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒéžãƒ–ロックã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfssl_send()ãŒwolfssl_sendã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«wolfssl_send()ãŒæˆ»ã‚Šã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚ãã®çµæžœã€åŸºç¤Žã¨ãªã‚‹å…¥å‡ºåŠ›ãŒæº–å‚™ãŒã§ããŸã‚‰ã€å‘¼ã³å‡ºã—å´ãƒ—ロセスã¯wolfssl_send()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€Wolfssl_send()ã¯ã€ã‚µã‚¤ã‚ºSZã®ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ãŒå®Œå…¨ã«æ›¸ãè¾¼ã¾ã‚ŒãŸã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã€æˆ»ã‚‹ã ã‘ã§ã™ã€‚ - \return >0 æˆåŠŸæ™‚ã«æ›¸ã‹ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã€‚ - \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WOLFSSL_SEND()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を使用ã—ã¦ãã ã•ã„。 - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param data ピアã«é€ä¿¡ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒãƒƒãƒ•ã‚¡ã€‚ - \param sz ピアã«é€ä¿¡ã•ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆï¼‰ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€æ›¸ãè¾¼ã¿æ“作ã®ãŸã‚ã«æŒ‡å®šã•ã‚ŒãŸãƒ•ãƒ©ã‚°ã‚’使用ã—ã¦ãƒãƒƒãƒ•ã‚¡ã‚ã‚‹ã„ã¯ãƒ‡ãƒ¼ã‚¿ã‹ã‚‰ã€SSL接続ã«å¯¾ã—ã¦ã€szãƒã‚¤ãƒˆã‚’書ãè¾¼ã¿ã¾ã™ã€‚ + å¿…è¦ã«å¿œã˜ã¦ã€wolfSSL_send()ã®å‘¼ã³å‡ºã—時点ã§ã¯ã¾ã wolfSSL_connect()ã¾ãŸã¯wolfSSL_accept()ãŒã¾ã å‘¼ã³å‡ºã•ã‚Œã¦ã„ãªã„å ´åˆã€SSL/TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ + wolfSSL_send()ã¯ã€ãƒ–ロックã¨ãƒŽãƒ³ãƒ–ロッキングI/Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚ + 基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒŽãƒ³ãƒ–ロッキングã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfSSL_send()ãŒè¦æ±‚を満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã‚‰wolfSSL_send()ã¯é–¢æ•°å‘¼ã³å‡ºã—ã‹ã‚‰ã™ãã«æˆ»ã‚Šã¾ã™ã€‚ + ã“ã®å ´åˆã€wolfSSL_get_error()ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’è¿”ã—ã¾ã™ã€‚ + ãã®çµæžœã€åŸºç¤Žã¨ãªã‚‹I/OãŒæº–å‚™ãŒã§ããŸã‚‰ã€å‘¼ã³å‡ºã—å´ãƒ—ロセスã¯wolfSSL_send()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + 基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfSSL_send()ã¯ã€ã‚µã‚¤ã‚ºSZã®ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ãŒå®Œå…¨ã«æ›¸ã‹ã‚ŒãŸã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã€æˆ»ã‚‹ã ã‘ã§ã™ã€‚ + + \return æˆåŠŸæ™‚ã«ã¯æ›¸ã込んã ãƒã‚¤ãƒˆæ•°ï¼ˆ1以上)を返ã—ã¾ã™ã€‚ + \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã¯ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WOLFSSL_WRITE()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を使用ã—ã¦ãã ã•ã„。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param data ピアã«é€ä¿¡ã•ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã§ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param sz é€ä¿¡ãƒ‡ãƒ¼ã‚¿ã‚’å«ã‚“ã§ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + \param flags 下層ã®I/Oã®sendã«å¯¾ã—ã¦æŒ‡å®šã™ã‚‹ãƒ•ãƒ©ã‚° + + _Example_ \code WOLFSSL* ssl = 0; @@ -1391,14 +1935,25 @@ int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€åŸºç¤Žã¨ãªã‚‹RECV動作ã®ãŸã‚ã«æŒ‡å®šã•ã‚ŒãŸãƒ•ãƒ©ã‚°ã‚’使用ã—ã¦ã€SSLセッション(SSL)内部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã‹ã‚‰SZãƒã‚¤ãƒˆã‚’ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ã«èª­ã¿å‡ºã—ã¾ã™ã€‚読ã¿å–られãŸãƒã‚¤ãƒˆã¯å†…部å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯wolfssl_read()ã¨åŒã˜ã§ã™ã€‚ãŸã ã—ã€ã‚¢ãƒ—リケーションãŒåŸºç¤Žã¨ãªã‚‹èª­ã¿å–ã‚Šæ“作ã®RECVフラグを設定ã§ãã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚å¿…è¦ã«å¿œã˜ã¦wolfssl_recv()ãŒwolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã«ã‚ˆã£ã¦ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€SSL / TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ SSL / TLSプロトコルã¯ã€æœ€å¤§ã‚µã‚¤ã‚ºã®SSLレコードを使用ã—ã¾ã™ï¼ˆæœ€å¤§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ /wolfssl/internal.h)。ãã®ãŸã‚ã€WolfSSLã¯ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’処ç†ãŠã‚ˆã³å¾©å·åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å‰ã«ã€SSLレコード全体を内部的ã«èª­ã¿å–ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®ãŸã‚ã€wolfssl_recv()ã¸ã®å‘¼ã³å‡ºã—ã¯ã€å‘¼ã³å‡ºã—時ã«å¾©å·åŒ–ã•ã‚ŒãŸæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’è¿”ã™ã“ã¨ãŒã§ãã‚‹ã ã‘ã§ã™ã€‚ wolfssl_recv()ã¸ã®æ¬¡ã®å‘¼ã³å‡ºã—ã§æ¤œç´¢ãŠã‚ˆã³å¾©å·åŒ–ã•ã‚Œã‚‹å†…部WolfSSLå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã§å¾…æ©Ÿã—ã¦ã„ãªã„追加ã®å¾©å·åŒ–ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 SZãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡å†…ã®ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šã‚‚大ãã„å ´åˆã€SSL_RECV()ã¯å†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã§ä½¿ç”¨å¯èƒ½ãªãƒã‚¤ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ãƒã‚¤ãƒˆãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã«ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€WOLFSSL_RECV()ã¸ã®å‘¼ã³å‡ºã—ã¯æ¬¡ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å‡¦ç†ã‚’トリガーã—ã¾ã™ã€‚ - \return >0 æˆåŠŸæ™‚ã«èª­ã¿å–られãŸãƒã‚¤ãƒˆæ•°ã€‚ - \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒªãƒ¼ãƒ³ï¼ˆé€šçŸ¥ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é–‰ã˜ã‚‹ï¼‰ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã¾ãŸã¯ãƒ”ã‚¢ãŒæŽ¥ç¶šã‚’é–‰ã˜ãŸã ã‘ã§ã‚ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã¯ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒç™ºç”Ÿã—ã€ã‚¢ãƒ—リケーションãŒå†ã³WOLFSSL_RECV()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を使用ã—ã¦ãã ã•ã„。 - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param data wolfssl_recv()ãŒãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€åŸºç¤Žã¨ãªã‚‹RECV動作ã®ãŸã‚ã«æŒ‡å®šã•ã‚ŒãŸãƒ•ãƒ©ã‚°ã‚’使用ã—ã¦ã€SSLセッション(ssl)内部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã‹ã‚‰szãƒã‚¤ãƒˆã‚’ãƒãƒƒãƒ•ã‚¡ãƒ‡ãƒ¼ã‚¿ã«èª­ã¿å‡ºã—ã¾ã™ã€‚ + 読ã¿å–られãŸãƒã‚¤ãƒˆã¯å†…部å—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯wolfssl_read()ã¨åŒã˜ã§ã™ã€‚ + ãŸã ã—ã€ã‚¢ãƒ—リケーションãŒåŸºç¤Žã¨ãªã‚‹èª­ã¿å–ã‚Šæ“作ã®RECVフラグを設定ã§ãã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚ + å¿…è¦ã«å¿œã˜ã¦wolfssl_recv()ãŒwolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã«ã‚ˆã£ã¦ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒã¾ã å®Ÿè¡Œã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€SSL/TLSセッションをãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¾ã™ã€‚ + SSL/TLSプロトコルã¯ã€æœ€å¤§ã‚µã‚¤ã‚ºã®SSLレコードを使用ã—ã¾ã™ï¼ˆæœ€å¤§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºã¯ /wolfssl/internal.h)。 + ãã®ãŸã‚ã€wolfSSLã¯ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’処ç†ãŠã‚ˆã³å¾©å·ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å‰ã«ã€SSLレコード全体を内部的ã«èª­ã¿å–ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®ãŸã‚ã€wolfSSL_recv()ã¸ã®å‘¼ã³å‡ºã—ã¯ã€å‘¼ã³å‡ºã—時ã«å¾©å·ã•ã‚ŒãŸæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’è¿”ã™ã“ã¨ãŒã§ãã‚‹ã ã‘ã§ã™ã€‚ + wolfSSL_recv()ã¸ã®æ¬¡ã®å‘¼ã³å‡ºã—ã§æ¤œç´¢ãŠã‚ˆã³å¾©å·ã•ã‚Œã‚‹å†…部wolfSSLå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã§å¾…æ©Ÿã—ã¦ã„ãªã„追加ã®å¾©å·åŒ–ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 + 引数szãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡å†…ã®ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šã‚‚大ãã„å ´åˆã€wolfSSL_recv()ã¯å†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã§ä½¿ç”¨å¯èƒ½ãªãƒã‚¤ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ + ãƒã‚¤ãƒˆãŒå†…部読ã¿å–ã‚Šãƒãƒƒãƒ•ã‚¡ã«ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ãªã„å ´åˆã¯ã€wolfSSL_recv()ã¸ã®å‘¼ã³å‡ºã—ã¯æ¬¡ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å‡¦ç†ã‚’トリガーã—ã¾ã™ã€‚ + \return æˆåŠŸæ™‚ã«ã¯èª­ã¿å–られãŸãƒã‚¤ãƒˆæ•°(1以上)ã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒªãƒ¼ãƒ³ï¼ˆé€šçŸ¥ã‚¢ãƒ©ãƒ¼ãƒˆã‚’é–‰ã˜ã‚‹ï¼‰ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã¾ãŸã¯ãƒ”ã‚¢ãŒæŽ¥ç¶šã‚’é–‰ã˜ãŸã ã‘ã§ã‚ã‚‹ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã¯ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒç™ºç”Ÿã—ã€ã‚¢ãƒ—リケーションãŒå†ã³WOLFSSL_RECV()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を使用ã—ã¦ãã ã•ã„。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param data wolfSSL_recv()ãŒãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ \param sz データを読ã¿è¾¼ã‚€ãŸã‚ã®ãƒã‚¤ãƒˆæ•°ã€‚ + _Example_ \code WOLFSSL* ssl = 0; @@ -1419,11 +1974,20 @@ int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags); /*! - \ingroup Debug - \brief ã“ã®é–¢æ•°ã¯ã€ä»¥å‰ã®API関数呼ã³å‡ºã—(wolfssl_connectã€wolfssl_acceptã€wolfssl_readã€wolfssl_writeãªã©ï¼‰ãŒã‚¨ãƒ©ãƒ¼æˆ»ã‚Šã‚³ãƒ¼ãƒ‰ï¼ˆssl_failure)を呼ã³å‡ºã—ãŸç†ç”±ã‚’表ã™ä¸€æ„ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã€‚å‰ã®é–¢æ•°ã®æˆ»ã‚Šå€¤ã¯ã€RETを介ã—ã¦wolfssl_get_errorã«æ¸¡ã•ã‚Œã¾ã™ã€‚wolfssl_get_errorãŒå‘¼ã³å‡ºã•ã‚ŒãŸå¾Œã€ä¸€æ„ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã€wolfssl_err_error_string()を呼ã³å‡ºã—ã¦äººé–“ãŒèª­ã‚るエラー文字列をå–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ã€wolfssl_err_error_string()をå‚ç…§ã—ã¦ãã ã•ã„。 - \return On 完了æˆåŠŸã€ã“ã®é–¢æ•°ã¯ã€å‰ã®API関数ãŒå¤±æ•—ã—ãŸç†ç”±ã‚’説明ã™ã‚‹å›ºæœ‰ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã€‚ - \return SSL_ERROR_NONE RET> 0ã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™.Ret <= 0ã®å ´åˆã€ä»¥å‰ã®APIãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™ãŒå®Ÿéš›ã«ç™ºç”Ÿã—ãªã‹ã£ãŸå ´åˆã«ã“ã®å€¤ã‚’è¿”ã™å ´åˆãŒã‚ã‚Šã¾ã™ã€‚例ã¯ã€ã‚¼ãƒ­SZパラメータを使用ã—ã¦wolfssl_read()を呼ã³å‡ºã™ã“ã¨ã§ã™ã€‚a 0 wolfssl_read()ã‹ã‚‰ã®æˆ»ã‚Šå€¤ã¯é€šå¸¸ã‚¨ãƒ©ãƒ¼ã‚’示ã—ã¾ã™ãŒã€ã“ã®å ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¯ç™ºç”Ÿã—ã¾ã›ã‚“ã§ã—ãŸã€‚wolfssl_get_error()ãŒãã®å¾Œå‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€ssl_error_noneãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup Debug + \brief ã“ã®é–¢æ•°ã¯ã€ç›´å‰ã®API関数呼ã³å‡ºã—(wolfssl_connectã€wolfssl_acceptã€wolfssl_readã€wolfssl_writeãªã©ï¼‰ãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ï¼ˆSSL_FAILURE)を呼ã³å‡ºã—ãŸç†ç”±ã‚’表ã™ä¸€æ„ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã€‚ + ç›´å‰ã®é–¢æ•°ã®æˆ»ã‚Šå€¤ã¯ã€retを介ã—ã¦wolfSSL_get_errorã«æ¸¡ã•ã‚Œã¾ã™ã€‚wolfSSL_get_errorã¯ä¸€æ„ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã€‚ + wolfSSL_err_error_string()を呼ã³å‡ºã—ã¦äººé–“ãŒèª­ã‚るエラー文字列をå–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + 詳細ã«ã¤ã„ã¦ã¯ã€wolfSSL_err_error_string()ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + \return 呼ã³å‡ºã—æˆåŠŸæ™‚ã€ã“ã®é–¢æ•°ã¯ã€ç›´å‰ã®é–¢æ•°ãŒå¤±æ•—ã—ãŸç†ç”±ã‚’説明ã™ã‚‹å›ºæœ‰ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã€‚ + \return SSL_ERROR_NONE 引数retãŒ0より大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚retãŒ0以下ã®å ´åˆã€ç›´å‰ã®APIãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™ãŒå®Ÿéš›ã«ç™ºç”Ÿã—ãªã‹ã£ãŸå ´åˆã«ã“ã®å€¤ã‚’è¿”ã™å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ + 例ã¨ã—ã¦ã¯ã€å¼•æ•°szã«0を渡ã—ã¦wolfSSL_read()を呼ã³å‡ºã™å ´åˆã«ç™ºç”Ÿã—ã¾ã™ã€‚ + wolfssl_read()ãŒ0を戻ã—ãŸå ´åˆã¯é€šå¸¸ã‚¨ãƒ©ãƒ¼ã‚’示ã—ã¾ã™ãŒã€ã“ã®å ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¯ç™ºç”Ÿã—ã¦ã„ã¾ã›ã‚“。 + 従ã£ã¦ã€wolfSSL_get_error()ãŒãã®å¾Œå‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€ssl_error_noneãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int err = 0; @@ -1442,10 +2006,12 @@ int wolfSSL_get_error(WOLFSSL* ssl, int ret); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã‚¢ãƒ©ãƒ¼ãƒˆå±¥æ­´ã‚’å–å¾—ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Œäº†ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚警告履歴ãŒã‚ã£ãŸã‹ã€ã¾ãŸã¯ã„ãšã‚Œã«ã‚‚ã€æˆ»ã‚Šå€¤ã¯SSL_SUCCESSã§ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param h WOLFSSL構造体ã®"alert_history member" ã®å€¤ãŒæ ¼ç´ã•ã‚Œã‚‹ã€WOLFSSL_ALERT_HISTORY構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new(protocol method); @@ -1460,12 +2026,20 @@ int wolfSSL_get_alert_history(WOLFSSL* ssl, WOLFSSL_ALERT_HISTORY *h); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€SSLオブジェクトSSLãŒSSL / TLS接続を確立ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’設定ã—ã¾ã™ã€‚セッションã®å†é–‹ã®å ´åˆã€wolfssl_shutdown()をセッションオブジェクトã«å‘¼ã³å‡ºã™å‰ã«ã€ã‚¢ãƒ—リケーションã¯ã‚ªãƒ–ジェクトã‹ã‚‰wolfssl_get1_session()を呼ã³å‡ºã—ã¦ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚後ã§ã€ã‚¢ãƒ—リケーションã¯æ–°ã—ã„WolfSSLオブジェクトを作æˆã—ã€ä¿å­˜ã—ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’wolfssl_set_session()ã«å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®æ™‚点ã§ã€ã‚¢ãƒ—リケーションã¯wolfssl_connect()を呼ã³å‡ºã—ã€WolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’å†é–‹ã—よã†ã¨ã—ã¾ã™ã€‚WolfSSLサーãƒãƒ¼ã‚³ãƒ¼ãƒ‰ã§ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å†é–‹ã‚’許å¯ã—ã¾ã™ã€‚wolfssl_get1_session()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯ã€ã‚¢ãƒ—リケーションãŒãれを使用ã—ã¦ãれを使用ã—ã¦è§£æ”¾ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€SSLオブジェクトSSLãŒSSL/TLS接続を確立ã™ã‚‹ç›®çš„ã§ä½¿ç”¨ã™ã‚‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’設定ã—ã¾ã™ã€‚ + セッションå†é–‹ã‚’è¡Œã†å ´åˆã€wolfSSL_shutdown()を呼ã³å‡ºã™å‰ã«wolfSSL_get1_session()を呼ã³å‡ºã—ã¦ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚ªãƒ–ジェクトをå–å¾—ã—ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³IDã‚’ä¿å­˜ã—ã¦ãŠãå¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + 後ã§ã€ã‚¢ãƒ—リケーションã¯æ–°ã—ã„WOLFSSLオブジェクトを作æˆã—ã€ä¿å­˜ã—ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’wolfSSL_set_session()ã«æ¸¡ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ãã®å¾Œã‚¢ãƒ—リケーションã¯wolfSSL_connect()を呼ã³å‡ºã—ã€wolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³å†é–‹ã‚’試ã¿ã¾ã™ã€‚ + wolfSSLサーãƒãƒ¼ã‚³ãƒ¼ãƒ‰ã§ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚»ãƒƒã‚·ãƒ§ãƒ³å†é–‹ã‚’許å¯ã—ã¾ã™ã€‚ + wolfSSL_get1_session()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯ã€ã‚¢ãƒ—リケーションãŒä½¿ç”¨å¾Œã«è§£æ”¾ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \return SSL_SUCCESS セッションを正常ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹ã€ã¾ãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ãŸå ´åˆã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ - \return When OpenSSL_EXTRAã¨WOLFSSL_ERROR_CODE_OPENSSLãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¦ã„ã¦ã‚‚SSL_SUCCESSãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return OPENSSL_EXTRAã¨WOLFSSL_ERROR_CODE_OPENSSLãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¦ã„ã¦ã‚‚SSL_SUCCESSãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param session WOLFSSL_SESSION構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret; @@ -1489,10 +2063,19 @@ int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session); /*! - \ingroup IO - \brief NO_SESSION_CACHE_REFãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯SSLã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ï¼ˆWolfSSL_SESSION)ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_sessionオブジェクトã¸ã®æ°¸ç¶šçš„ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚è¿”ã•ã‚Œã‚‹ãƒã‚¤ãƒ³ã‚¿ã¯ã€wolfssl_freeãŒå‘¼ã³å‡ºã•ã‚ŒãŸã¨ãã«è§£æ”¾ã•ã‚Œã¾ã™ã€‚ã“ã®å‘¼ã³å‡ºã—ã¯ã€ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’検査ã¾ãŸã¯å¤‰æ›´ã™ã‚‹ãŸã‚ã«ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚セッションã®å†é–‹ã®å ´åˆã¯ã€wolfssl_get1_session()を使用ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚NO_SESSION_CACHE_REFãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„å ´åˆã®å¾Œæ–¹äº’æ›æ€§ã®ãŸã‚ã«ã€ã“ã®é–¢æ•°ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã«æ ¼ç´ã•ã‚Œã¦ã„る永続セッションオブジェクトãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚キャッシュサイズã¯æœ‰é™ã§ã‚ã‚Šã€ã‚¢ãƒ—リケーションãŒwolfssl_set_session()を呼ã³å‡ºã™æ™‚ã¾ã§ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚ªãƒ–ジェクトãŒåˆ¥ã®SSL接続ã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œã‚‹å±é™ºæ€§ãŒã‚ã‚Šã¾ã™ã€‚アプリケーションã«NO_SESSION_CACHE_REFを定義ã—ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³å†é–‹ã«wolfssl_get1_session()を使用ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒç¾åœ¨ã®SSLセッションオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return NULL SSLãŒNULLã®å ´åˆã€SSLセッションキャッシュãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€WolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³IDを使用ã§ããªã„ã€ã¾ãŸã¯ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹é–¢æ•°ãŒå¤±æ•—ã—ã¾ã™ã€‚ + \ingroup IO + \brief NO_SESSION_CACHE_REFãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯SSLã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ï¼ˆWOLFSSL_SESSION)ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€WOLFSSL_SESSIONオブジェクトã¸ã®æ°¸ç¶šçš„ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + è¿”ã•ã‚Œã‚‹ãƒã‚¤ãƒ³ã‚¿ã¯ã€wolfSSL_freeãŒå‘¼ã³å‡ºã•ã‚ŒãŸã¨ãã«è§£æ”¾ã•ã‚Œã¾ã™ã€‚ + ã“ã®å‘¼ã³å‡ºã—ã¯ã€ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’検査ã¾ãŸã¯å¤‰æ›´ã™ã‚‹ãŸã‚ã«ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + セッションå†é–‹ã«ä½¿ç”¨ã™ã‚‹å ´åˆã¯ã€wolfSSL_get1_session()を使用ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + NO_SESSION_CACHE_REFãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„å ´åˆã®å¾Œæ–¹äº’æ›æ€§ã®ãŸã‚ã«ã€ã“ã®é–¢æ•°ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã«æ ¼ç´ã•ã‚Œã¦ã„る永続セッションオブジェクトãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + キャッシュサイズã¯æœ‰é™ã§ã‚ã‚Šã€ã‚¢ãƒ—リケーションãŒwolfSSL_set_session()を呼ã³å‡ºã™æ™‚ã¾ã§ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚ªãƒ–ジェクトãŒåˆ¥ã®SSL接続ã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œã‚‹å±é™ºæ€§ãŒã‚ã‚Šã¾ã™ã€‚ + アプリケーションã«NO_SESSION_CACHE_REFを定義ã—ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³å†é–‹ã«wolfSSL_get1_session()を使用ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + + \return ç¾åœ¨ã®SSLセッションオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL sslãŒNULLã®å ´åˆã€SSLセッションキャッシュãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€wolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³IDを使用ã§ããªã„ã€ã¾ãŸã¯ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹é–¢æ•°ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -1510,10 +2093,17 @@ WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl); /*! - \ingroup IO - \brief ã“ã®æ©Ÿèƒ½ã¯ã€æœŸé™åˆ‡ã‚Œã«ãªã£ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‹ã‚‰ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’フラッシュã—ã¾ã™ã€‚時間比較ã«ã¯TMãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚WolfSSLã¯ç¾åœ¨ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«é™çš„テーブルを使用ã—ã¦ã„ã‚‹ãŸã‚ã€ãƒ•ãƒ©ãƒƒã‚·ãƒ³ã‚°ã¯ä¸è¦ã§ã™ã€‚ãã®ãŸã‚ã€ã“ã®æ©Ÿèƒ½ã¯ç¾åœ¨ã‚µãƒ–ã ã‘ã§ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfsslãŒOpenSSL互æ›å±¤ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã‚‹ã¨ãã®OpenSSL互æ›æ€§ï¼ˆssl_flush_sessions)をæä¾›ã—ã¾ã™ã€‚ - \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup IO + \brief ã“ã®æ©Ÿèƒ½ã¯ã€æœŸé™åˆ‡ã‚Œã«ãªã£ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‹ã‚‰ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’フラッシュã—ã¾ã™ã€‚ + 時間比較ã«ã¯å¼•æ•°tmãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + wolfSSLã¯ç¾åœ¨ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«é™çš„テーブルを使用ã—ã¦ã„ã‚‹ãŸã‚ã€ãƒ•ãƒ©ãƒƒã‚·ãƒ³ã‚°ã¯ä¸è¦ã§ã™ã€‚ + ãã®ãŸã‚ã€ã“ã®æ©Ÿèƒ½ã¯ç¾åœ¨ã‚¹ã‚¿ãƒ–ã¨ã—ã¦å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€wolfsslãŒOpenSSL互æ›å±¤ã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ã‚‹ã¨ãã®OpenSSL互æ›æ€§ï¼ˆssl_flush_sessions)をæä¾›ã—ã¾ã™ã€‚ + + \return ãªã— + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param tm セッションã®æœ‰åŠ¹æœŸé™ã®æ¯”較ã§ä½¿ç”¨ã•ã‚Œã‚‹æ™‚é–“ + _Example_ \code WOLFSSL_CTX* ssl; @@ -1526,13 +2116,16 @@ void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm); /*! - \ingroup TLS - \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’サーãƒãƒ¼IDã¨é–¢é€£ä»˜ã‘ã¾ã™ã€‚NewsessionフラグãŒã‚ªãƒ³ã®å ´åˆã€æ—¢å­˜ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯å†åˆ©ç”¨ã•ã‚Œã¾ã›ã‚“。 + \ingroup TLS + \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’サーãƒãƒ¼IDã¨é–¢é€£ä»˜ã‘ã¾ã™ã€‚引数newSessionãŒã‚ªãƒ³ã®å ´åˆã€æ—¢å­˜ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯å†åˆ©ç”¨ã•ã‚Œã¾ã›ã‚“。 \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl structã¾ãŸã¯idパラメータãŒnullã®å ´åˆã€ã¾ãŸã¯LenãŒã‚¼ãƒ­ä»¥ä¸‹ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param id wolfssl_session構造体ã®ServerIDメンãƒãƒ¼ã«ã‚³ãƒ”ーã•ã‚Œã‚‹å®šæ•°ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ - \param len セッションIDパラメータã®é•·ã•ã‚’表ã™int型。 + \return BAD_FUNC_ARG 引数sslã¾ãŸã¯å¼•æ•°idãŒNULLã®å ´åˆã€ã¾ãŸã¯å¼•æ•°lenãŒã‚¼ãƒ­ä»¥ä¸‹ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param id WOLFSSL_SESSION構造体ã®ServerIDメンãƒãƒ¼ã«ã‚³ãƒ”ーã•ã‚Œã‚‹ã‚µãƒ¼ãƒãƒ¼IDデータã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param len サーãƒãƒ¼IDデータã®ã‚µã‚¤ã‚º + \param newSession セッションをå†åˆ©ç”¨ã™ã‚‹ã‹å¦ã‹ã‚’指定ã™ã‚‹ãƒ•ãƒ©ã‚°ã€‚オンã®å ´åˆã€æ—¢å­˜ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯å†åˆ©ç”¨ã•ã‚Œã¾ã›ã‚“。 + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol ); @@ -1553,9 +2146,11 @@ int len, int newSession); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€WolfSSL構造体ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’å–å¾—ã—ã¾ã™ã€‚ - \return int ã“ã®é–¢æ•°ã¯ã€wolfssl構造体内ã®SessionIndexを表ã™intåž‹ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL構造体ã®æŒ‡å®šã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å€¤ã‚’å–å¾—ã—ã¾ã™ã€‚ + \return ã“ã®é–¢æ•°ã¯ã€WOLFSSL構造体内ã®SessionIndexを表ã™intåž‹ã®å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX_new( protocol method ); @@ -1572,12 +2167,15 @@ int wolfSSL_GetSessionIndex(WOLFSSL* ssl); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã®æŒ‡å®šã•ã‚ŒãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’å–å¾—ã—ã€ãれをメモリã«ã‚³ãƒ”ーã—ã¾ã™ã€‚wolfssl_session構造体ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³æƒ…報をä¿æŒã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã®æŒ‡å®šã•ã‚ŒãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’å–å¾—ã—ã€ãれをメモリã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ + WOLFSSL_SESSION構造体ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³æƒ…報をä¿æŒã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚Œã€ã‚¨ãƒ©ãƒ¼ãŒã‚¹ãƒ­ãƒ¼ã•ã‚Œãªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_MUTEX_E アンロックã¾ãŸã¯ãƒ­ãƒƒã‚¯ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_MUTEX_E アンロックã¾ãŸã¯ãƒ­ãƒƒã‚¯ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚Œãªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param idx セッションインデックスを表ã™int型。 + \param idx セッションインデックス値 + \param session WOLFSSL_SESSION構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int idx; // The index to locate the session. @@ -1594,9 +2192,10 @@ int wolfSSL_GetSessionAtIndex(int index, WOLFSSL_SESSION* session); /*! - \ingroup IO - \brief wolfssl_session構造体ã‹ã‚‰ãƒ”ア証明書ãƒã‚§ãƒ¼ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚ - \return pointer ピアèªè¨¼ãƒã‚§ãƒ¼ãƒ³ã‚’å«ã‚€WOLFSSL_X509_CHAIN構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup IO + \brief WOLFSSL_SESSION構造体ã‹ã‚‰ãƒ”ア証明書ãƒã‚§ãƒ¼ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚ + \param session WOLFSSL_SESSION構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_SESSION* session; @@ -1615,11 +2214,31 @@ WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ãƒªãƒ¢ãƒ¼ãƒˆãƒ”ã‚¢ã®æ¤œè¨¼æ–¹æ³•ã‚’設定ã—ã€ã¾ãŸSSLコンテキストã«ç™»éŒ²ã•ã‚Œã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚検証コールãƒãƒƒã‚¯ã¯ã€æ¤œè¨¼éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã«ã®ã¿å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚検証コールãƒãƒƒã‚¯ãŒå¿…è¦ãªå ´åˆã¯ã€NULLãƒã‚¤ãƒ³ã‚¿ã‚’verify_callbackã«ä½¿ç”¨ã§ãã¾ã™ã€‚ピア証明書ã®æ¤œè¨¼ãƒ¢ãƒ¼ãƒ‰ã¯ã€è«–ç†çš„ã¾ãŸã¯ãƒ•ãƒ©ã‚°ã®ãƒªã‚¹ãƒˆã§ã™ã€‚å¯èƒ½ãªãƒ•ãƒ©ã‚°å€¤ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.SSL_VERIFY_NONEクライアントモード:クライアントã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã›ãšã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã¯é€šå¸¸ã©ãŠã‚Šç¶šãã¾ã™ã€‚サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«è¨¼æ˜Žæ›¸è¦æ±‚ã‚’é€ä¿¡ã—ã¾ã›ã‚“。ãã®ãŸã‚ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ¤œè¨¼ã¯æœ‰åŠ¹ã«ãªã‚Šã¾ã›ã‚“。 ssl_verify_peerクライアントモード:クライアントã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã—ã¾ã™ã€‚ã“ã‚Œã¯wolfsslã§ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚ªãƒ³ã«ã•ã‚Œã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€ã“ã®ã‚ªãƒ—ションを使用ã™ã‚‹ã¨åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯è¨¼æ˜Žæ›¸è¦æ±‚をクライアントã«é€ä¿¡ã—ã€å—ä¿¡ã—ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã‚’確èªã—ã¾ã™ã€‚ ssl_verify_fail_if_no_peer_certクライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šè¦æ±‚ã•ã‚ŒãŸã¨ãã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè¨¼æ˜Žæ›¸ã®é€ä¿¡ã«å¤±æ•—ã—ãŸå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã§æ¤œè¨¼ãŒå¤±æ•—ã—ã¾ã™ï¼ˆSSLサーãƒãƒ¼ã®SSL_VERIFY_PEERを使用ã™ã‚‹å ´åˆï¼‰ã€‚ ssl_verify_fail_except_pskクライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šPSK接続ã®å ´åˆã‚’除ãã€æ¤œè¨¼ã¯ssl_verify_fail_if_no_peer_certã¨åŒã˜ã§ã™ã€‚ PSK接続ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šã¯ãƒ”ア証明書ãªã—ã§é€šéŽã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param mode セッションタイムアウト値(秒) + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ãƒªãƒ¢ãƒ¼ãƒˆãƒ”ã‚¢ã®æ¤œè¨¼æ–¹æ³•ã‚’設定ã—ã€ã¾ãŸè¨¼æ˜Žæ›¸æ¤œè¨¼ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’SSLコンテキストã«ç™»éŒ²ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + 検証コールãƒãƒƒã‚¯ã¯ã€æ¤œè¨¼éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã«ã®ã¿å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ + 検証コールãƒãƒƒã‚¯ãŒå¿…è¦ãªå ´åˆã¯ã€NULLãƒã‚¤ãƒ³ã‚¿ã‚’verify_callbackã«ä½¿ç”¨ã§ãã¾ã™ã€‚ + ピア証明書ã®æ¤œè¨¼ãƒ¢ãƒ¼ãƒ‰ã¯ã€è«–ç†çš„ã¾ãŸã¯ãƒ•ãƒ©ã‚°ã®ãƒªã‚¹ãƒˆã§ã™ã€‚ + å¯èƒ½ãªãƒ•ãƒ©ã‚°å€¤ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™:
    + SSL_VERIFY_NONE
    + -クライアントモード:クライアントã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã›ãšã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã¯é€šå¸¸ã©ãŠã‚Šç¶šãã¾ã™ã€‚
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«è¨¼æ˜Žæ›¸è¦æ±‚ã‚’é€ä¿¡ã—ã¾ã›ã‚“。ãã®ãŸã‚ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ¤œè¨¼ã¯æœ‰åŠ¹ã«ãªã‚Šã¾ã›ã‚“。
    + SSL_VERIFY_PEER
    + -クライアントモード:クライアントã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã—ã¾ã™ã€‚ã“ã‚Œã¯wolfSSLã§ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚ªãƒ³ã«ã•ã‚Œã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€ã“ã®ã‚ªãƒ—ションを使用ã™ã‚‹ã¨åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯è¨¼æ˜Žæ›¸è¦æ±‚をクライアントã«é€ä¿¡ã—ã€å—ä¿¡ã—ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã‚’確èªã—ã¾ã™ã€‚
    + SSL_VERIFY_FAIL_IF_NO_PEER_CERT
    + -クライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šè¦æ±‚ã•ã‚ŒãŸã¨ãã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè¨¼æ˜Žæ›¸ã®é€ä¿¡ã«å¤±æ•—ã—ãŸå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã§æ¤œè¨¼ãŒå¤±æ•—ã—ã¾ã™ï¼ˆSSLサーãƒãƒ¼ã®SSL_VERIFY_PEERを使用ã™ã‚‹å ´åˆï¼‰ã€‚
    + SSL_VERIFY_FAIL_EXCEPT_PSK
    + -クライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šPSK接続ã®å ´åˆã‚’除ãã€æ¤œè¨¼ã¯SSL_VERIFY_FAIL_IF_NO_PEER_CERTã¨åŒã˜ã§ã™ã€‚ PSK接続ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šã¯ãƒ”ア証明書ãªã—ã§é€šéŽã—ã¾ã™ã€‚
    + + \return ãªã— + + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param mode ピアã®è¨¼æ˜Žæ›¸ã‚’ã©ã®ã‚ˆã†ã«æ¤œè¨¼ã™ã‚‹ã‹ã‚’示ã™ãƒ•ãƒ©ã‚°å€¤ + \param verify_callback 証明書検証ãŒå¤±æ•—ã—ãŸéš›ã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã€‚å¿…è¦ãŒãªã„ãªã‚‰NULLを指定ã™ã‚‹ã“ã¨ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -1633,11 +2252,31 @@ VerifyCallback verify_callback); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ãƒªãƒ¢ãƒ¼ãƒˆãƒ”ã‚¢ã®æ¤œè¨¼æ–¹æ³•ã‚’設定ã—ã€ã¾ãŸSSLセッションã«ç™»éŒ²ã™ã‚‹ã®ã‚’登録ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚検証コールãƒãƒƒã‚¯ã¯ã€æ¤œè¨¼éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã«ã®ã¿å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚検証コールãƒãƒƒã‚¯ãŒå¿…è¦ãªå ´åˆã¯ã€NULLãƒã‚¤ãƒ³ã‚¿ã‚’verify_callbackã«ä½¿ç”¨ã§ãã¾ã™ã€‚ピア証明書ã®æ¤œè¨¼ãƒ¢ãƒ¼ãƒ‰ã¯ã€è«–ç†çš„ã¾ãŸã¯ãƒ•ãƒ©ã‚°ã®ãƒªã‚¹ãƒˆã§ã™ã€‚å¯èƒ½ãªãƒ•ãƒ©ã‚°å€¤ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.SSL_VERIFY_NONEクライアントモード:クライアントã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã›ãšã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã¯é€šå¸¸ã©ãŠã‚Šç¶šãã¾ã™ã€‚サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«è¨¼æ˜Žæ›¸è¦æ±‚ã‚’é€ä¿¡ã—ã¾ã›ã‚“。ãã®ãŸã‚ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ¤œè¨¼ã¯æœ‰åŠ¹ã«ãªã‚Šã¾ã›ã‚“。 ssl_verify_peerクライアントモード:クライアントã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã—ã¾ã™ã€‚ã“ã‚Œã¯wolfsslã§ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚ªãƒ³ã«ã•ã‚Œã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€ã“ã®ã‚ªãƒ—ションを使用ã™ã‚‹ã¨åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯è¨¼æ˜Žæ›¸è¦æ±‚をクライアントã«é€ä¿¡ã—ã€å—ä¿¡ã—ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã‚’確èªã—ã¾ã™ã€‚ ssl_verify_fail_if_no_peer_certクライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šè¦æ±‚ã•ã‚ŒãŸã¨ãã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè¨¼æ˜Žæ›¸ã®é€ä¿¡ã«å¤±æ•—ã—ãŸå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã§æ¤œè¨¼ãŒå¤±æ•—ã—ã¾ã™ï¼ˆSSLサーãƒãƒ¼ã®SSL_VERIFY_PEERを使用ã™ã‚‹å ´åˆï¼‰ã€‚ ssl_verify_fail_except_pskクライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šPSK接続ã®å ´åˆã‚’除ãã€æ¤œè¨¼ã¯ssl_verify_fail_if_no_peer_certã¨åŒã˜ã§ã™ã€‚ PSK接続ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šã¯ãƒ”ア証明書ãªã—ã§é€šéŽã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param mode セッションタイムアウト値(秒å˜ä½ï¼‰ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ãƒªãƒ¢ãƒ¼ãƒˆãƒ”ã‚¢ã®æ¤œè¨¼æ–¹æ³•ã‚’設定ã—ã€ã¾ãŸè¨¼æ˜Žæ›¸æ¤œè¨¼ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’WOLFSSLオブジェクトã«ç™»éŒ²ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ + 検証コールãƒãƒƒã‚¯ã¯ã€æ¤œè¨¼éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã«ã®ã¿å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ + 検証コールãƒãƒƒã‚¯ãŒå¿…è¦ãªå ´åˆã¯ã€NULLãƒã‚¤ãƒ³ã‚¿ã‚’verify_callbackã«ä½¿ç”¨ã§ãã¾ã™ã€‚ + ピア証明書ã®æ¤œè¨¼ãƒ¢ãƒ¼ãƒ‰ã¯ã€è«–ç†çš„ã¾ãŸã¯ãƒ•ãƒ©ã‚°ã®ãƒªã‚¹ãƒˆã§ã™ã€‚ + å¯èƒ½ãªãƒ•ãƒ©ã‚°å€¤ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™:
    + SSL_VERIFY_NONE
    + -クライアントモード:クライアントã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã›ãšã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã¯é€šå¸¸ã©ãŠã‚Šç¶šãã¾ã™ã€‚
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«è¨¼æ˜Žæ›¸è¦æ±‚ã‚’é€ä¿¡ã—ã¾ã›ã‚“。ãã®ãŸã‚ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ¤œè¨¼ã¯æœ‰åŠ¹ã«ãªã‚Šã¾ã›ã‚“。
    + SSL_VERIFY_PEER
    + -クライアントモード:クライアントã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰å—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã‚’検証ã—ã¾ã™ã€‚ã“ã‚Œã¯wolfSSLã§ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚ªãƒ³ã«ã•ã‚Œã¾ã™ã€‚ã—ãŸãŒã£ã¦ã€ã“ã®ã‚ªãƒ—ションを使用ã™ã‚‹ã¨åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šã‚µãƒ¼ãƒãƒ¼ã¯è¨¼æ˜Žæ›¸è¦æ±‚をクライアントã«é€ä¿¡ã—ã€å—ä¿¡ã—ãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã‚’確èªã—ã¾ã™ã€‚
    + SSL_VERIFY_FAIL_IF_NO_PEER_CERT
    + -クライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šè¦æ±‚ã•ã‚ŒãŸã¨ãã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒè¨¼æ˜Žæ›¸ã®é€ä¿¡ã«å¤±æ•—ã—ãŸå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã§æ¤œè¨¼ãŒå¤±æ•—ã—ã¾ã™ï¼ˆSSLサーãƒãƒ¼ã®SSL_VERIFY_PEERを使用ã™ã‚‹å ´åˆï¼‰ã€‚
    + SSL_VERIFY_FAIL_EXCEPT_PSK
    + -クライアントモード:クライアントå´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ãªã„å ´åˆã¯åŠ¹æžœãŒã‚ã‚Šã¾ã›ã‚“。
    + -サーãƒãƒ¼ãƒ¢ãƒ¼ãƒ‰ï¼šPSK接続ã®å ´åˆã‚’除ãã€æ¤œè¨¼ã¯SSL_VERIFY_FAIL_IF_NO_PEER_CERTã¨åŒã˜ã§ã™ã€‚ PSK接続ãŒè¡Œã‚ã‚Œã¦ã„ã‚‹å ´åˆã€æŽ¥ç¶šã¯ãƒ”ア証明書ãªã—ã§é€šéŽã—ã¾ã™ã€‚
    + + \return ãªã— + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param mode ピアã®è¨¼æ˜Žæ›¸ã‚’ã©ã®ã‚ˆã†ã«æ¤œè¨¼ã™ã‚‹ã‹ã‚’示ã™ãƒ•ãƒ©ã‚°å€¤ + \param verify_callback 証明書検証ãŒå¤±æ•—ã—ãŸéš›ã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã€‚å¿…è¦ãŒãªã„ãªã‚‰NULLを指定ã™ã‚‹ã“ã¨ã€‚ + _Example_ \code WOLFSSL* ssl = 0; @@ -1649,10 +2288,13 @@ void wolfSSL_set_verify(WOLFSSL* ssl, int mode, VerifyCallback verify_callback); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€æ¤œè¨¼ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã®ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼CTXオブジェクト情報を格ç´ã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return ãªã— + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx ボイドãƒã‚¤ãƒ³ã‚¿ã€‚WOLFSSL構造体ã®verifyCbCtx メンãƒãƒ¼ã«ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -1672,10 +2314,12 @@ void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€æ¤œè¨¼ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã®ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼CTXオブジェクト情報を格ç´ã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ - \param ctx wolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return ãªã— + \param ctx WOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx ボイドãƒã‚¤ãƒ³ã‚¿ã€‚WOLFSSL_CTX構造体ã®verifyCbCtx メンãƒãƒ¼ã«ã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -1694,9 +2338,11 @@ void wolfSSL_CTX_SetCertCbCtx(WOLFSSL_CTX* ctx, void* userCtx); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_read()ã«ã‚ˆã£ã¦èª­ã¿å–られるSSLオブジェクトã§ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ã‚‹ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ - \return int ã“ã®é–¢æ•°ã¯ã€ä¿ç•™ä¸­ã®ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€wolfSSL_read()ã«ã‚ˆã£ã¦èª­ã¿å–られるWOLFSSLオブジェクトã§ãƒãƒƒãƒ•ã‚¡ã•ã‚Œã¦ã„ã‚‹ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ + \return ã“ã®é–¢æ•°ã¯ã€ä¿ç•™ä¸­ã®ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int pending = 0; @@ -1713,9 +2359,11 @@ int wolfSSL_pending(WOLFSSL*); /*! - \ingroup Debug - \brief ã“ã®æ©Ÿèƒ½ã¯OpenSSL互æ›æ€§ï¼ˆSSL_LOAD_ERROR_STRING)ã®ã¿ã§ã‚ã‚Šã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’å–ã‚Šã¾ã™ã€‚ - \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \ingroup Debug + \brief ã“ã®æ©Ÿèƒ½ã¯OpenSSL API(SSL_load_error_string)ã¨ã®äº’æ›æ€§ã®ç›®çš„ã¿ã§æä¾›ã—ã¦ã‚り処ç†ã¯è¡Œã„ã¾ã›ã‚“。 + \return ãªã— + \param ãªã— + _Example_ \code wolfSSL_load_error_strings(); @@ -1729,10 +2377,14 @@ void wolfSSL_load_error_strings(void); /*! - \ingroup TLS - \brief ã“ã®é–¢æ•°ã¯wolfssl_ctx_new()内ã§å†…部的ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯wolfssl_init()ã®å‘¨å›²ã®ãƒ©ãƒƒãƒ‘ーã§ã€wolfsslãŒOpenSSL互æ›å±¤ã§ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã¨ãã«OpenSSL互æ›æ€§ï¼ˆssl_library_init)ã«å­˜åœ¨ã—ã¾ã™ã€‚wolfssl_init()ã¯ã€ã‚ˆã‚Šä¸€èˆ¬çš„ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹WolfSSLåˆæœŸåŒ–機能ã§ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ + \ingroup TLS + \brief ã“ã®é–¢æ•°ã¯wolfSSL_CTX_new()内ã§å†…部的ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯wolfSSL_Init()ã®ãƒ©ãƒƒãƒ‘ーã§ã€wolfSSLãŒOpenSSL互æ›å±¤ã§ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã¨ãã®OpenSSL API(ssl_library_init)ã¨ã®äº’æ›æ€§ã®ç‚ºã«å­˜åœ¨ã—ã¾ã™ã€‚ + wolfSSL_init()ã¯ã€ã‚ˆã‚Šä¸€èˆ¬çš„ã«ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹wolfSSLåˆæœŸåŒ–機能ã§ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FATAL_ERROR 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -1748,10 +2400,12 @@ int wolfSSL_library_init(void); /*! - \brief - \return WOLFSSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯WOLFSSLオブジェクトレベルã§Device Idをセットã—ã¾ã™ã€‚ + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param devId ãƒãƒ¼ãƒ‰ã‚¦ã‚¨ã‚¢ã¨å…±ã«ä½¿ç”¨ã™ã‚‹éš›ã«æŒ‡å®šã™ã‚‹ID + _Example_ \code WOLFSSL* ssl; @@ -1766,10 +2420,14 @@ int wolfSSL_SetDevId(WOLFSSL* ssl, int devId); /*! - \brief - \return WOLFSSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯WOLFSSL_CTXレベルã§Device Idをセットã—ã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param devId ãƒãƒ¼ãƒ‰ã‚¦ã‚¨ã‚¢ã¨å…±ã«ä½¿ç”¨ã™ã‚‹éš›ã«æŒ‡å®šã™ã‚‹ID + _Example_ \code WOLFSSL_CTX* ctx; @@ -1784,10 +2442,12 @@ int wolfSSL_CTX_SetDevId(WOLFSSL_CTX* ctx, int devId); /*! - \brief - \return devId æˆåŠŸã™ã‚‹ã¨ã€‚ - \return INVALID_DEVID SSLã¨CTXã®ä¸¡æ–¹ãŒNULLã®å ´åˆã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯WOLFSSL_CTXレベルã§Device Idã‚’å–å¾—ã—ã¾ã™ã€‚ + \return devId æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return INVALID_DEVID SSLã¨CTXã®ä¸¡æ–¹ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx; @@ -1801,10 +2461,17 @@ int wolfSSL_CTX_GetDevId(WOLFSSL_CTX* ctx, WOLFSSL* ssl); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯SSLセッションキャッシュを有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã¾ã™ã€‚動作ã¯ãƒ¢ãƒ¼ãƒ‰ã«ä½¿ç”¨ã•ã‚Œã‚‹å€¤ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ã€‚モードã®å€¤ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™.SSL_SESS_CACHE_OFF - セッションキャッシングを無効ã«ã—ã¾ã™ã€‚デフォルトã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ³ã‚°ãŒã‚ªãƒ³ã«ãªã£ã¦ã„ã¾ã™ã€‚SSL_SESS_CACHE_NO_AUTO_CLEAR - セッションキャッシュã®ã‚ªãƒ¼ãƒˆãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã‚’無効ã«ã—ã¾ã™ã€‚デフォルトã§è‡ªå‹•ãƒ•ãƒ©ãƒƒã‚·ãƒ³ã‚°ã¯ã‚ªãƒ³ã«ãªã£ã¦ã„ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯SSLセッションキャッシュ機能を有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã¾ã™ã€‚ + 動作ã¯ãƒ¢ãƒ¼ãƒ‰ã«ä½¿ç”¨ã•ã‚Œã‚‹å€¤ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ã€‚ + モードã®å€¤ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ï¼š + SSL_SESS_CACHE_OFF - セッションキャッシングを無効ã«ã—ã¾ã™ã€‚デフォルトã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ³ã‚°ãŒã‚ªãƒ³ã«ãªã£ã¦ã„ã¾ã™ã€‚ + SSL_SESS_CACHE_NO_AUTO_CLEAR - セッションキャッシュã®ã‚ªãƒ¼ãƒˆãƒ•ãƒ©ãƒƒã‚·ãƒ¥ã‚’無効ã«ã—ã¾ã™ã€‚デフォルトã§è‡ªå‹•ãƒ•ãƒ©ãƒƒã‚·ãƒ³ã‚°ã¯ã‚ªãƒ³ã«ãªã£ã¦ã„ã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸã«æˆ»ã‚Šã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param mode セッションキャッシュã®æŒ¯ã‚‹èˆžã„を変更ã™ã‚‹ç‚ºã«ä½¿ç”¨ã—ã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -1823,10 +2490,15 @@ long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode); /*! - \brief SessionSecRETCBタイプã«ã¯ã€ç½²åãŒã‚ã‚Šã¾ã™ã€‚int(* sessioneCretcb)(wolfssl * sslã€void * secretã€int * secretszã€void * ctx)。WolfSSL構造体ã®SESSIONSECRETCBメンãƒãƒ¼ã¯ãƒ‘ラメータCBã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚·ãƒ¼ã‚¯ãƒ¬ãƒƒãƒˆã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’セットã—ã¾ã™ã€‚ + SessionSecretCbタイプã¯æ¬¡ã®ã‚·ã‚°ãƒãƒãƒ£ã¨ãªã£ã¦ã„ã¾ã™ï¼šint(* sessioneCretcb)(wolfssl * sslã€void * secretã€int * secretszã€void * ctx)。 + WOLFSSL構造体ã®sessionSecretCbメンãƒãƒ¼ã¯å¼•æ•°cbã«è¨­å®šã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 関数ã®å®Ÿè¡ŒãŒã‚¨ãƒ©ãƒ¼ã‚’è¿”ã•ã‚Œãªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR WolfSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return SSL_FATAL_ERROR WOLFSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param cb セッションシークレットコールãƒãƒƒã‚¯é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx セッションシークレットコールãƒãƒƒã‚¯é–¢æ•°ã«æ¸¡ã•ã‚Œã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -1844,12 +2516,14 @@ int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, void* ctx); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ファイルã«æŒç¶šã—ã¾ã™ã€‚追加ã®ãƒ¡ãƒ¢ãƒªä½¿ç”¨ã®ãŸã‚ã€MEMSAVEã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。 + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ファイルã«æŒç¶šã—ã¾ã™ã€‚追加ã®ãƒ¡ãƒ¢ãƒªä½¿ç”¨ã®ãŸã‚ã€memsaveã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。 \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚セッションキャッシュã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã—ãŸã€‚ \return SSL_BAD_FILE FNAMEã‚’é–‹ãã“ã¨ãŒã§ããªã„ã‹ã€ãれ以外ã®å ´åˆã¯ç ´æã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return FWRITE_ERROR XfWriteãŒãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_MUTEX_E ミューテックスロック障害ãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_MUTEX_E ミューテックスロック障害ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param fname 書ãè¾¼ã¿å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«åã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code const char* fname; @@ -1862,16 +2536,19 @@ \sa wolfSSL_restore_session_cache \sa wolfSSL_memrestore_session_cache */ -int wolfSSL_save_session_cache(const char*); +int wolfSSL_save_session_cache(const char* fname); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰æ°¸ç¶šã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’復元ã—ã¾ã™ã€‚追加ã®ãƒ¡ãƒ¢ãƒªä½¿ç”¨ã®ãŸã‚ã€MEMSTOREã¯ä½¿ç”¨ã—ã¾ã›ã‚“。 + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰æ°¸ç¶šã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’復元ã—ã¾ã™ã€‚追加ã®ãƒ¡ãƒ¢ãƒªä½¿ç”¨ã®ãŸã‚ã€memstoreã¯ä½¿ç”¨ã—ã¾ã›ã‚“。 \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_BAD_FILE 関数ã«æ¸¡ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒç ´æã—ã¦ã„ã¦XFOPENã«ã‚ˆã£ã¦é–‹ãã“ã¨ãŒã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return FREAD_ERROR ファイルã«XFREADã‹ã‚‰èª­ã¿å–りエラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return FREAD_ERROR ファイルã«XFREADã‹ã‚‰èª­ã¿å–りエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return CACHE_MATCH_ERROR セッションキャッシュヘッダã®ä¸€è‡´ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_MUTEX_E ミューテックスロック障害ãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_MUTEX_E ミューテックスロック障害ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param fname キャシュを読ã¿å–ã‚‹ãŸã‚ã®ãƒ•ã‚¡ã‚¤ãƒ«åã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + _Example_ \code const char *fname; @@ -1883,15 +2560,17 @@ \sa XFREAD \sa XFOPEN */ -int wolfSSL_restore_session_cache(const char*); +int wolfSSL_restore_session_cache(const char* fname); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’メモリã«ä¿æŒã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚セッションキャッシュã¯ãƒ¡ãƒ¢ãƒªã«æ­£å¸¸ã«æ°¸ç¶šåŒ–ã•ã‚Œã¾ã—ãŸã€‚ - \return BAD_MUTEX_E ミューテックスロックエラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_MUTEX_E ミューテックスロックエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒå°ã•ã™ãŽã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ - \param mem メモリコピーxmemcpy()ã®å®›å…ˆã‚’表ã™voidãƒã‚¤ãƒ³ã‚¿ã€‚ + \param mem セッションキャッシュã®ã‚³ãƒ”ー先ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param sz コピー先ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code void* mem; @@ -1907,13 +2586,15 @@ int wolfSSL_memsave_session_cache(void* mem, int sz); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ãƒ¡ãƒ¢ãƒªã‹ã‚‰æ°¸ç¶šã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’復元ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E メモリãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_MUTEX_E セッションキャッシュミューテックスロックãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return CACHE_MATCH_ERROR セッションキャッシュヘッダã®ä¸€è‡´ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param mem 復元ã®åŽŸå› ã‚’å«ã‚€å®šæ•°ã®ãƒœã‚¤ãƒ‰ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param mem セッションキャッシュをä¿æŒã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param sz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code const void* memoryFile; @@ -1928,9 +2609,10 @@ int wolfSSL_memrestore_session_cache(const void* mem, int sz); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ä¿å­˜ãƒãƒƒãƒ•ã‚¡ã‚’ã©ã®ã‚ˆã†ã«å¤§ããã™ã‚‹ã‹ã‚’è¿”ã—ã¾ã™ã€‚ - \return int ã“ã®é–¢æ•°ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ä¿å­˜ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’表ã™æ•´æ•°ã‚’è¿”ã—ã¾ã™ã€‚ + \return ã“ã®é–¢æ•°ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥ä¿å­˜ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’表ã™æ•´æ•°ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code int sz = // Minimum size for error checking; @@ -1944,7 +2626,7 @@ int wolfSSL_get_session_cache_memsize(void); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯Certキャッシュをメモリã‹ã‚‰ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚ \return SSL_SUCCESS CM_SaveCertCacheãŒæ­£å¸¸ã«çµ‚了ã—ãŸå ´åˆã€‚ \return BAD_FUNC_ARG 引数ã®ã„ãšã‚Œã‹ã®å¼•æ•°ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ @@ -1952,7 +2634,9 @@ \return BAD_MUTEX_E ロックミューテックスãŒå¤±æ•—ã—ãŸå ´åˆ \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ \return FWRITE_ERROR 証明書キャッシュファイルã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ - \param ctx wolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€è¨¼æ˜Žæ›¸æƒ…報をä¿æŒã—ã¾ã™ã€‚ + \param ctx WOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€è¨¼æ˜Žæ›¸æƒ…報をä¿æŒã—ã¾ã™ã€‚ + \param fname 出力先ファイルåã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol def ); @@ -1968,13 +2652,15 @@ int wolfSSL_CTX_save_cert_cache(WOLFSSL_CTX* ctx, const char* fname); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰è¨¼æ˜Žæ›¸ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’担当ã—ã¾ã™ã€‚ - \return SSL_SUCCESS 関数cm_restorecertcacheãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE xfopenãŒxbadfileã‚’è¿”ã™ã¨è¿”ã•ã‚Œã¾ã™ã€‚ファイルãŒç ´æã—ã¦ã„ã¾ã™ã€‚ + \return SSL_SUCCESS 正常ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE XFOPENãŒXBADFILEã‚’è¿”ã™ã¨è¿”ã•ã‚Œã¾ã™ã€‚ファイルãŒç ´æã—ã¦ã„ã¾ã™ã€‚ \return MEMORY_E TEMPãƒãƒƒãƒ•ã‚¡ã®å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒ¡ãƒ¢ãƒªãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG FNAMEã¾ãŸã¯CTXã«NULL値ãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€è¨¼æ˜Žæ›¸æƒ…報をä¿æŒã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG 引数fnameã¾ãŸã¯å¼•æ•°ctxãŒNULLã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx WOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€è¨¼æ˜Žæ›¸æƒ…報をä¿æŒã—ã¾ã™ã€‚ + \param fname 証明書キャッシュを読ã¿å–るファイルåã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -1991,15 +2677,17 @@ int wolfSSL_CTX_restore_cert_cache(WOLFSSL_CTX* ctx, const char* fname); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’メモリã«æŒç¶šã—ã¾ã™ã€‚ \return SSL_SUCCESS 機能ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚エラーãŒæŠ•ã’られã¦ã„ã¾ã›ã‚“。 - \return BAD_MUTEX_E wolfssl_cert_managerメンãƒãƒ¼ã®ã‚«ãƒ¼ãƒœãƒƒã‚¯ãŒ0(ゼロ)ã§ã¯ãªã‹ã£ãŸãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼ã€‚ - \return BAD_FUNC_ARG CTXã€MEMã€ã¾ãŸã¯ä½¿ç”¨ãŒNULLã®å ´åˆã€ã¾ãŸã¯SZãŒ0以下ã®å ´åˆï¼ˆ0(ゼロ)。 + \return BAD_MUTEX_E WOLFSSL_CERT_MANAGER構造体ã®caLockメンãƒãƒ¼0(ゼロ)ã§ã¯ãªã‹ã£ãŸã€‚ + \return BAD_FUNC_ARG 引数ctxã€memãŒNULLã®å ´åˆã€ã¾ãŸã¯szãŒ0以下ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E 出力ãƒãƒƒãƒ•ã‚¡MEMãŒå°ã•ã™ãŽã¾ã—ãŸã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param mem 宛先ã¸ã®voidãƒã‚¤ãƒ³ã‚¿ï¼ˆå‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ï¼‰ã€‚ \param sz 出力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚ + \param used 証明書キャッシュヘッダーã®ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã™ã‚‹å¤‰æ•°ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol ); @@ -2019,15 +2707,17 @@ int wolfSSL_CTX_memsave_cert_cache(WOLFSSL_CTX* ctx, void* mem, int sz, int* used); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’メモリã‹ã‚‰å¾©å…ƒã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG CTXã¾ãŸã¯MEMパラメータãŒNULLã¾ãŸã¯SZパラメータãŒã‚¼ãƒ­ä»¥ä¸‹ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E CERTキャッシュメモリãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã‚‹ã¨æˆ»ã‚Šã¾ã™ã€‚ \return CACHE_MATCH_ERROR CERTキャッシュヘッダーã®ä¸ä¸€è‡´ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_MUTEX_E ロックミューテックスãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param mem 証明書キャッシュã«å¾©å…ƒã•ã‚Œã‚‹å€¤ã‚’æŒã¤voidãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param mem 証明書キャッシュã«å¾©å…ƒã•ã‚Œã‚‹å€¤ã‚’ä¿æŒã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param sz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol method ); @@ -2044,11 +2734,14 @@ int wolfSSL_CTX_memrestore_cert_cache(WOLFSSL_CTX* ctx, const void* mem, int sz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief Certificate Cache Saveãƒãƒƒãƒ•ã‚¡ãŒå¿…è¦ãªã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ - \return int æˆåŠŸã—ãŸã¨ãã«ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºã‚’表ã™æ•´æ•°å€¤ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_MUTEX_E - ミューテックスロックエラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return メモリサイズを返ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_MUTEX_E ミューテックスロックエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = WOLFSSL_CTX_new(protocol); @@ -2061,14 +2754,25 @@ \endcode \sa CM_GetCertCacheMemSize */ -int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX*); +int wolfSSL_CTX_get_cert_cache_memsize(WOLFSSL_CTX* ctx); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€ä¸Žãˆã‚‰ã‚ŒãŸwolfssl_ctxã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚ã“ã®Cipher Suiteリストã¯ã€ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’使用ã—ã¦ä½œæˆã•ã‚ŒãŸæ–°ã—ã„SSLセッション(WolfSSL)ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒªã‚¹ãƒˆã«ãªã‚Šã¾ã™ã€‚リスト内ã®æš—å·ã¯ã€æœ€é«˜ã‹ã‚‰æœ€ä½Žã¸ã®å¥½ã¿ã®é †ã«ã‚½ãƒ¼ãƒˆã•ã‚Œã‚‹ã¹ãã§ã™ã€‚wolfssl_ctx_set_cipher_list()ã®å„呼ã³å‡ºã—ã¯ã€é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ãŸã³ã«ã€ç‰¹å®šã®SSLコンテキストã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’æä¾›ã•ã‚ŒãŸãƒªã‚¹ãƒˆã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã€ãƒªã‚¹ãƒˆã¯ã€ãƒŒãƒ«çµ‚端テキスト文字列ã€ãŠã‚ˆã³ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã™ã€‚ãŸã¨ãˆã°ã€ãƒªã‚¹ãƒˆã®å€¤ãŒã€ŒDHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:AES256-SHA256ã€æœ‰åŠ¹ãªæš—å·å€¤ã¯ã€src / internal.cã®cipher_names []é…列ã®ãƒ•ãƒ«ãƒãƒ¼ãƒ å€¤ã§ã™ã€‚(有効ãªæš—å·åŒ–値ã®æ˜Žç¢ºãªãƒªã‚¹ãƒˆã®å ´åˆã¯src / internal.cã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„) - \return SSL_SUCCESS 機能完了ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€ä¸Žãˆã‚‰ã‚ŒãŸWOLFSSL_CTXã«æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚ + ã“ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã¯ã€ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’使用ã—ã¦ä½œæˆã•ã‚ŒãŸæ–°ã—ã„SSLセッション(WolfSSL)ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒªã‚¹ãƒˆã«ãªã‚Šã¾ã™ã€‚ + リスト内ã®æš—å·ã¯ã€å„ªå…ˆåº¦ã®é«˜ã„ã‚‚ã®ã®é †ã«é †ã«ã‚½ãƒ¼ãƒˆã•ã‚Œã‚‹ã¹ãã§ã™ã€‚ + wolfSSL_CTX_set_cipher_list()ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹éƒ½åº¦ã€ç‰¹å®šã®SSLコンテキストã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’æä¾›ã•ã‚ŒãŸãƒªã‚¹ãƒˆã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚ + æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã¯ãƒŒãƒ«çµ‚端ã•ã‚ŒãŸã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã™ã€‚ + ãŸã¨ãˆã°ã€ãƒªã‚¹ãƒˆã®å€¤ãŒã€ŒDHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:AES256-SHA256ã€æœ‰åŠ¹ãªæš—å·å€¤ã¯ã€src/internal.cã®cipher_names []é…列ã®ãƒ•ãƒ«ãƒãƒ¼ãƒ å€¤ã§ã™ã€‚ + (有効ãªæš—å·åŒ–値ã®æ˜Žç¢ºãªãƒªã‚¹ãƒˆã®å ´åˆã¯src/internal.cã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„) + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param list ヌル終端ã•ã‚ŒãŸã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆæ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -2085,11 +2789,21 @@ int wolfSSL_CTX_set_cipher_list(WOLFSSL_CTX* ctx, const char* list); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€ç‰¹å®šã®WolfSSLオブジェクト(SSLセッション)ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚リスト内ã®æš—å·ã¯ã€æœ€é«˜ã‹ã‚‰æœ€ä½Žã¸ã®å¥½ã¿ã®é †ã«ã‚½ãƒ¼ãƒˆã•ã‚Œã‚‹ã¹ãã§ã™ã€‚wolfssl_set_cipher_list()ã®å„呼ã³å‡ºã—ã¯ã€é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ãŸã³ã«ã€ç‰¹å®šã®SSLセッションã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’æä¾›ã•ã‚ŒãŸãƒªã‚¹ãƒˆã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã€ãƒªã‚¹ãƒˆã¯ã€ãƒŒãƒ«çµ‚端テキスト文字列ã€ãŠã‚ˆã³ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã™ã€‚例ãˆã°ã€ãƒªã‚¹ãƒˆã®ãŸã‚ã®1ã¤ã®å€¤ã¯ã€ã€ŒDHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:AES256-SHA256ã€ã§ã‚り得る。有効ãªæš—å·åŒ–値ã¯ã€src / internal.c(有効ãªæš—å·åŒ–値ã®æ˜Žç¢ºãªãƒªã‚¹ãƒˆã®ãƒªã‚¹ãƒˆã®å ´åˆã¯src / internal.cを指定ã—ã¦ãã ã•ã„)ã®cipher_names []é…列ã®ãƒ•ãƒ«ãƒãƒ¼ãƒ å€¤ã§ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€ç‰¹å®šã®WolfSSLオブジェクト(SSLセッション)ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚ + ã“ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã¯ã€ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’使用ã—ã¦ä½œæˆã•ã‚ŒãŸæ–°ã—ã„SSLセッション(WolfSSL)ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒªã‚¹ãƒˆã«ãªã‚Šã¾ã™ã€‚ + リスト内ã®æš—å·ã¯ã€å„ªå…ˆåº¦ã®é«˜ã„ã‚‚ã®ã®é †ã«é †ã«ã‚½ãƒ¼ãƒˆã•ã‚Œã‚‹ã¹ãã§ã™ã€‚ + wolfSSL_CTX_set_cipher_list()ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹éƒ½åº¦ã€ç‰¹å®šã®SSLコンテキストã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã‚’æä¾›ã•ã‚ŒãŸãƒªã‚¹ãƒˆã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚ + æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆã¯ãƒŒãƒ«çµ‚端ã•ã‚ŒãŸã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã™ã€‚ + ãŸã¨ãˆã°ã€ãƒªã‚¹ãƒˆã®å€¤ãŒã€ŒDHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:AES256-SHA256ã€æœ‰åŠ¹ãªæš—å·å€¤ã¯ã€src/internal.cã®cipher_names []é…列ã®ãƒ•ãƒ«ãƒãƒ¼ãƒ å€¤ã§ã™ã€‚ + (有効ãªæš—å·åŒ–値ã®æ˜Žç¢ºãªãƒªã‚¹ãƒˆã®å ´åˆã¯src/internal.cã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„) + \return SSL_SUCCESS 機能完了ã«æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param list ヌル終端ã•ã‚ŒãŸã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆãƒªã‚¹ãƒˆæ–‡å­—列ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -2107,9 +2821,14 @@ int wolfSSL_set_cipher_list(WOLFSSL* ssl, const char* list); /*! - \brief UDP I / Oã¯ãƒŽãƒ³ãƒ–ロッキングã§ã™ã€‚アプリケーションãŒWolfSSLオブジェクトを作æˆã—ãŸå¾Œã€ãƒ–ロックã•ã‚Œã¦ã„ãªã„UDPソケットã§ä½¿ç”¨ã•ã‚Œã‚‹å ´åˆã¯ã€WolfsSL_DTLS_SET_USING_NONBLOCK()を呼ã³å‡ºã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€wolfsslオブジェクトã¯ã€Ewouldblockã‚’å—ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - \return none è¿”å“ä¸å¯ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸDTLSセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯WOLFSSL DTLSオブジェクトã«ä¸‹å±¤ã®UDP I/Oã¯ãƒŽãƒ³ãƒ–ロッキングã§ã‚ã‚‹ã“ã¨ã‚’通知ã—ã¾ã™ã€‚ + アプリケーションãŒWOLFSSLオブジェクトを作æˆã—ãŸå¾Œã€ãƒŽãƒ³ãƒ–ロッキングUDPソケットを使用ã™ã‚‹å ´åˆã¯ã€wolfSSL_dtls_set_using_nonblock()を呼ã³å‡ºã—ã¾ã™ã€‚ + ã“ã‚Œã«ã‚ˆã‚Šã€WOLFSSLオブジェクトã¯ã€recvfrom呼ã³å‡ºã—ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã›ãšã«EWOULDBLOCKã‚’å—ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + \return ãªã— + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param nonblock WOLFSSL構造体ã«ãƒŽãƒ³ãƒ–ロッキングI/Oを使用ã—ã¦ã„ã‚‹ã“ã¨ã‚’指定ã™ã‚‹ãƒ•ãƒ©ã‚°ã€‚ノンブロッキングを使用ã—ã¦ã„ã‚‹å ´åˆã«ã¯ï¼‘を指定ã€ãれ以外ã¯0を指定ã—ã¦ãã ã•ã„。 + + _Example_ \code WOLFSSL* ssl = 0; @@ -2122,9 +2841,14 @@ */ void wolfSSL_dtls_set_using_nonblock(WOLFSSL* ssl, int nonblock); /*! - \brief UDPを使用ã—ã¦éžãƒ–ロッキングI / Oを使用ã™ã‚‹ã€‚WolfSSLãŒãƒŽãƒ³ãƒ–ロッキングI / Oを使用ã—ã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€wolfsslオブジェクトã¯ã€Ewouldblockã‚’å—ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯DTLSセッションã«ã¨ã£ã¦ã®ã¿æ„味ãŒã‚ã‚Šã¾ã™ã€‚ - \return 0 基礎ã¨ãªã‚‹I / OãŒãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚ - \return 1 基礎ã¨ãªã‚‹I / Oã¯éžãƒ–ロッキングã§ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯WOLFSSL DTLSオブジェクトãŒä¸‹å±¤ã«UDPノンブロッキングI/Oを使用ã—ã¦ã„ã‚‹ã‹å¦ã‹ã‚’å–å¾—ã—ã¾ã™ã€‚ + WOLFSSLオブジェクトãŒãƒŽãƒ³ãƒ–ロッキングI/Oを使用ã—ã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ã€‚ + ã“ã‚Œã«ã‚ˆã‚Šã€WOLFSSLオブジェクトã¯ã€EWOULDBLOCKã‚’å—ä¿¡ã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã¯DTLSセッションã«ã¨ã£ã¦ã®ã¿æ„味ãŒã‚ã‚Šã¾ã™ã€‚ + \return 0 基礎ã¨ãªã‚‹I/OãŒãƒ–ロックã•ã‚Œã¦ã„ã¾ã™ã€‚ + \return 1 基礎ã¨ãªã‚‹I/Oã¯ãƒŽãƒ³ãƒ–ロッキングã§ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret = 0; @@ -2140,11 +2864,15 @@ \sa wolfSSL_dtls_got_timeout \sa wolfSSL_dtls_set_using_nonblock */ -int wolfSSL_dtls_get_using_nonblock(WOLFSSL*); +int wolfSSL_dtls_get_using_nonblock(WOLFSSL* ssl); /*! - \brief wolfsslオブジェクト。é®æ–­ã•ã‚Œã¦ã„ãªã„ソケットを使用ã™ã‚‹å ´åˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ¼ãƒ‰å†…ã®ä½•ã‹ã¯ã€åˆ©ç”¨å¯èƒ½ãªRECVデータをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ãã«ã„ã¤ã§ã‚‚å¾…æ©Ÿã—ã¦ã„ã‚‹ã®ã‹ã‚’決定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®é–¢æ•°ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã‚‹å€¤ã¯ã€ã‚¢ãƒ—リケーションãŒã©ã®ãらã„å¾…æ©Ÿã™ã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚ + \brief ã“ã®é–¢æ•°ã¯ç¾åœ¨ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤ã‚’秒å˜ä½ã§è¿”ã—ã¾ã™ã€‚ + ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ¼ãƒ‰ã§ã¯ã€åˆ©ç”¨å¯èƒ½ãªrecvVデータã®åˆ°ç€ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚„å¾…ã¤ã¹ã時間を知る必è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã‚‹å€¤ã¯ã€ã‚¢ãƒ—リケーションãŒã©ã®ãらã„å¾…æ©Ÿã™ã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚ \return seconds ç¾åœ¨ã®DTLSタイムアウト値(秒) - \return NOT_COMPILED_IN WolfSSLãŒDTLSサãƒãƒ¼ãƒˆã§æ§‹ç¯‰ã•ã‚Œã¦ã„ãªã„å ´åˆã€‚ + \return NOT_COMPILED_IN wolfSSLãŒDTLSサãƒãƒ¼ãƒˆã§æ§‹ç¯‰ã•ã‚Œã¦ã„ãªã„å ´åˆã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int timeout = 0; @@ -2161,11 +2889,52 @@ int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl); /*! - \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã‚¢ãƒ—リケーションãŒã‚ˆã‚Šæ—©ã„タイムアウト時間を設定ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã«trueã‚’è¿”ã—ã¾ã™ã€‚ + ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ¼ãƒ‰ã§å—信データãŒåˆ°ç€ã—ã¦ã„ã‚‹ã‹ä½•æ™‚ãƒã‚§ãƒƒã‚¯ã™ã‚‹ã‹ã€ + ã‚ã‚‹ã„ã¯ã©ã®ãらã„ã®æ™‚é–“å¾…ã¦ã°ã‚ˆã„ã®ã‹ã‚’決ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®é–¢æ•°ãŒ true ã‚’è¿”ã—ãŸå ´åˆã€ãƒ©ã‚¤ãƒ–ラリã¯ã™ã§ã«é€šä¿¡ã®ä¸­æ–­ã‚’検出ã—ã¾ã—ãŸãŒã€ + ä»–ã®ãƒ”ã‚¢ã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã¾ã é€ä¿¡ä¸­ã®å ´åˆã«å‚™ãˆã¦ã€ã‚‚ã†å°‘ã—å¾…æ©Ÿã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + ã“ã®ã‚¿ã‚¤ãƒžãƒ¼ã®å€¤ã‚’微調整ã™ã‚‹ã®ã¯ã‚¢ãƒ—リケーション次第ã§ã™ãŒã€dtls_get_current_timeout()/4ãŒæœ€é©ã§ã™ã€‚ + + \return true アプリケーションãŒã‚ˆã‚Šæ—©ã„タイムアウトを設定ã™ã‚‹å¿…è¦ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + \sa wolfSSL_dtls + \sa wolfSSL_dtls_get_peer + \sa wolfSSL_dtls_got_timeout + \sa wolfSSL_dtls_set_peer + \sa wolfSSL_dtls13_set_send_more_acks +*/ +int wolfSSL_dtls13_use_quick_timeout(WOLFSSL *ssl); +/*! + \ingroup Setup + + \brief ã“ã®é–¢æ•°ã¯ã€ãƒ©ã‚¤ãƒ–ラリãŒä¸­æ–­ã‚’検出ã—ãŸã¨ãã«ã™ãã«ä»–ã®ãƒ”ã‚¢ã«ACKã‚’é€ä¿¡ã™ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚ + ACKã‚’ã™ãã«é€ä¿¡ã™ã‚‹ã¨ã€é…延ã¯æœ€å°é™ã«æŠ‘ãˆã‚‰ã‚Œã¾ã™ãŒã€å¿…è¦ä»¥ä¸Šã«å¤šãã®å¸¯åŸŸå¹…ãŒæ¶ˆè²»ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + アプリケーションãŒç‹¬è‡ªã«ã‚¿ã‚¤ãƒžãƒ¼ã‚’管ç†ã—ã¦ãŠã‚Šã€ã“ã®ã‚ªãƒ—ションãŒ0ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ + アプリケーションコードã¯wolfSSL_dtls13_use_quick_timeout()を使用ã—ã¦ã€ + é…延ã—ãŸACKã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã‚ˆã‚Šé€Ÿã„タイムアウトを設定ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’判断ã§ãã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param value 設定を行ã†å ´åˆã«ã¯ï¼‘ã‚’è¡Œã‚ãªã„å ´åˆã«ã¯0を設定ã—ã¾ã™ã€‚ + + \sa wolfSSL_dtls + \sa wolfSSL_dtls_get_peer + \sa wolfSSL_dtls_got_timeout + \sa wolfSSL_dtls_set_peer + \sa wolfSSL_dtls13_use_quick_timeout +*/ +void wolfSSL_dtls13_set_send_more_acks(WOLFSSL *ssl, int value); + +/*! + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯DTLSタイムアウトを設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚SSLã®DTLS_TIMEOUT_INITã¨DTLS_TIMEOUTメンãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl structãŒnullã®å ´åˆã€ã¾ãŸã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒ0以下ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚タイムアウト引数ãŒè¨±å¯ã•ã‚Œã¦ã„る最大値を超ãˆã‚‹ã¨ã€æˆ»ã‚Šã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG 引数sslãŒNULLã®å ´åˆã€ã¾ãŸã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒ0以下ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚タイムアウト引数ãŒè¨±å¯ã•ã‚Œã¦ã„る最大値を超ãˆã¦ã„ã‚‹å ´åˆã«ã‚‚è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param value タイムアウトオプションを有効ã«ã™ã‚‹å ´åˆã«ã¯1を指定ã—ã€ç„¡åŠ¹ã«ã™ã‚‹å ´åˆã«ã¯0を指定ã—ã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -2184,10 +2953,12 @@ int wolfSSL_dtls_set_timeout_init(WOLFSSL* ssl, int); /*! - \brief + \brief \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl構造体ãŒNULLã®å ´åˆã€ã¾ãŸã¯TIMEOUT引数ãŒã‚¼ãƒ­ä»¥ä¸‹ã§ã‚ã‚‹å ´åˆã€ã¾ãŸã¯WolfSSL構造体ã®DTLS_TIMEOUT_INITメンãƒãƒ¼ã‚ˆã‚Šã‚‚å°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param timeout 最大タイムアウト時間 + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -2205,10 +2976,13 @@ int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int); /*! - \brief 制御コードãŒé€ä¿¡ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ãŸã¨è€ƒãˆã‚‹ã¨ã€WolfSSLオブジェクトã§å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚タイムアウト値ã®èª¿æ•´ã‚’å«ã‚€ã€æœ€å¾Œã®é€ä¿¡ã‚’å†è©¦è¡Œã™ã‚‹ãŸã‚ã«å¿…è¦ãªæ“作を実行ã—ã¾ã™ã€‚é•·ã™ãŽã‚‹ã¨ã€ã“ã‚Œã¯å¤±æ•—ã‚’è¿”ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã«æˆ»ã‚Šã¾ã™ + \brief DTLSã§ãƒŽãƒ³ãƒ–ロッキングソケットを使用ã™ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯é€ä¿¡ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ãŸã¨è€ƒãˆã‚‰ã‚Œã‚‹å ´åˆã«å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + タイムアウト値ã®èª¿æ•´ãªã©ã€æœ€å¾Œã®é€ä¿¡ã‚’å†è©¦è¡Œã™ã‚‹ãŸã‚ã«å¿…è¦ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã—ã¾ã™ã€‚ 時間ãŒã‹ã‹ã‚Šã™ãŽã‚‹ã¨ã€å¤±æ•—ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«æˆ»ã‚Šã¾ã™ \return SSL_FATAL_ERROR ピアã‹ã‚‰ã®å¿œç­”ã‚’å¾—ã‚‹ã“ã¨ãªãã€å†é€ä¿¡/タイムアウトãŒå¤šã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return NOT_COMPILED_IN WolfSSLãŒDTLSサãƒãƒ¼ãƒˆã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return NOT_COMPILED_IN wolfSSLãŒDTLSサãƒãƒ¼ãƒˆã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code See the following files for usage examples: @@ -2223,9 +2997,32 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl); /*! - \brief DTLSを使用ã™ã‚‹ã‚ˆã†ã«æ§‹æˆã•ã‚Œã¦ã„ã¾ã™ã€‚ + \brief DTLSã§ãƒŽãƒ³ãƒ–ロッキングソケットを使用ã™ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯äºˆæƒ³ã•ã‚Œã‚‹ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤ã¨å†é€ä¿¡å›žæ•°ã‚’無視ã—ã¦æœ€å¾Œã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãƒ•ãƒ©ã‚¤ãƒˆã‚’å†é€ä¿¡ã—ã¾ã™ã€‚ + ã“ã‚Œã¯ã€DTLSを使用ã—ã¦ãŠã‚Šã€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚„å†è©¦è¡Œå›žæ•°ã‚‚管ç†ã™ã‚‹å¿…è¦ãŒã‚るアプリケーションã«å½¹ç«‹ã¡ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«æˆ»ã‚Šã¾ã™ + \return SSL_FATAL_ERROR ピアã‹ã‚‰ã®å¿œç­”ãŒå¾—られãªã„ã¾ã¾å†é€ä¿¡/タイムアウトãŒå¤šã™ãŽã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ + \code + int ret = 0; + WOLFSSL* ssl; + ... + ret = wolfSSL_dtls_retransmit(ssl); + \endcode + + \sa wolfSSL_dtls_get_current_timeout + \sa wolfSSL_dtls_got_timeout + \sa wolfSSL_dtls +*/ +int wolfSSL_dtls_retransmit(WOLFSSL* ssl); + +/*! + \brief DTLSを使用ã™ã‚‹ã‚ˆã†ã«æ§‹æˆã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’å–å¾—ã—ã¾ã™ã€‚ \return 1 SSLセッション(SSL)ãŒDTLSを使用ã™ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ã€‚ - \return 0 ãã†ã§ãªã‘ã‚Œã°ã€‚ + \return 0 ãã†ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -2244,12 +3041,14 @@ int wolfSSL_dtls(WOLFSSL* ssl); /*! - \brief ピースズ。 - \return SSL_SUCCESS æˆåŠŸã«æˆ»ã‚Šã¾ã™ã€‚ - \return SSL_FAILURE 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_NOT_IMPLEMENTED WolfSSLãŒDTLSサãƒãƒ¼ãƒˆã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param peer ピアã®SOCKADDR_IN構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯å¼•æ•°peerã§ä¸Žãˆã‚‰ã‚Œã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’DTLSã®ãƒ”ã‚¢ã¨ã—ã¦ã‚»ãƒƒãƒˆã—ã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_NOT_IMPLEMENTED wolfSSLãŒDTLSをサãƒãƒ¼ãƒˆã™ã‚‹ã‚ˆã†ã«ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param peer ピアã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å«ã‚€sockaddr_in構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param peerSz sockaddr_in構造体ã®ã‚µã‚¤ã‚ºã€‚0ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã«ã¯sslã«è¨­å®šã•ã‚Œã¦ã„るピアã®æƒ…報をクリアã—ã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -2269,12 +3068,16 @@ int wolfSSL_dtls_set_peer(WOLFSSL* ssl, void* peer, unsigned int peerSz); /*! - \brief DTLSピアã“ã®é–¢æ•°ã¯ã€Peerszã‚’SSLセッションã«æ ¼ç´ã•ã‚Œã¦ã„る実際ã®DTLSピアサイズã«æ¯”較ã—ã¾ã™ã€‚ピアãŒãƒ”ã‚¢ã«åŽã¾ã‚‹å ´åˆã€ãƒ”ã‚¢ã®SOCKADDR_INã¯ãƒ”ã‚¢ã«ã‚³ãƒ”ーã•ã‚Œã€ãƒ”ースãŒãƒ”ã‚¢ã®ã‚µã‚¤ã‚ºã«è¨­å®šã•ã‚Œã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã«æˆ»ã‚Šã¾ã™ã€‚ - \return SSL_FAILURE 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_NOT_IMPLEMENTED WolfSSLãŒDTLSサãƒãƒ¼ãƒˆã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param peer ピアã®SOCKADDR_IN構造をä¿å­˜ã™ã‚‹ã«ã¯ã€ãƒ¡ãƒ¢ãƒªã®å ´æ‰€ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯ã€ç¾åœ¨ã®DTLSピアã®sockaddr_in(サイズpeerSz)ã‚’å–å¾—ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã¯ã€peerSzã‚’SSLセッションã«ä¿å­˜ã•ã‚Œã¦ã„る実際ã®DTLSピアサイズã¨æ¯”較ã—ã¾ã™ã€‚ + ピアアドレスãŒpeerã«åŽã¾ã‚‹å ´åˆã¯ã€peerSzãŒãƒ”ã‚¢ã®ã‚µã‚¤ã‚ºã«è¨­å®šã•ã‚Œã¦ã€ãƒ”ã‚¢ã®sockaddr_inãŒpeerã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_NOT_IMPLEMENTED wolfSSLãŒDTLSをサãƒãƒ¼ãƒˆã™ã‚‹ã‚ˆã†ã«ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param peer ピアã®sockaddr_in構造体をä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param peerSz サイズを格ç´ã™ã‚‹å¤‰æ•°ã€‚入力時ã«ã¯å¼•æ•°peerã§ç¤ºã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã—ã¦ãã ã•ã„。出力時ã«ã¯å®Ÿéš›ã®sockaddr_in構造体ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -2294,11 +3097,16 @@ int wolfSSL_dtls_get_peer(WOLFSSL* ssl, void* peer, unsigned int* peerSz); /*! - \ingroup Debug - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’より人間ãŒèª­ã‚るエラー文字列ã«å¤‰æ›ã—ã¾ã™ã€‚errnumberã¯ã€wolfssl_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã€ãƒ‡ãƒ¼ã‚¿ã¯ã‚¨ãƒ©ãƒ¼æ–‡å­—列ãŒé…ç½®ã•ã‚Œã‚‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚MAX_ERROR_SZã§å®šç¾©ã•ã‚Œã¦ã„るよã†ã«ã€ãƒ‡ãƒ¼ã‚¿ã®æœ€å¤§é•·ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§80文字ã§ã™ã€‚ã“ã‚Œã¯wolfssl / wolfcrypt / error.hã§ã™ã€‚ - \return success 正常ã«å®Œäº†ã™ã‚‹ã¨ã€ã“ã®é–¢æ•°ã¯ãƒ‡ãƒ¼ã‚¿ã«è¿”ã•ã‚Œã‚‹ã®ã¨åŒã˜æ–‡å­—列を返ã—ã¾ã™ã€‚ + \ingroup Debug + \brief ã“ã®é–¢æ•°ã¯ã€wolfSSL_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’より人間ãŒèª­ã‚るエラー文字列ã«å¤‰æ›ã—ã¾ã™ã€‚ + 引数errNumberã¯ã€wolfSSL_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã€å¼•æ•°dataã¯ã‚¨ãƒ©ãƒ¼æ–‡å­—列ãŒé…ç½®ã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ + MAX_ERROR_SZã§å®šç¾©ã•ã‚Œã¦ã„るよã†ã«ã€ãƒ‡ãƒ¼ã‚¿ã®æœ€å¤§é•·ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§80文字ã§ã™ã€‚ + ã“ã‚Œã¯wolfssl/wolfcrypt/error.hã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚ + \return success 正常ã«å®Œäº†ã™ã‚‹ã¨ã€ã“ã®é–¢æ•°ã¯dataã«è¿”ã•ã‚Œã‚‹ã®ã¨åŒã˜æ–‡å­—列を返ã—ã¾ã™ã€‚ \return failure 失敗ã™ã‚‹ã¨ã€ã“ã®é–¢æ•°ã¯é©åˆ‡ãªéšœå®³ç†ç”±ã€MSGã‚’æŒã¤æ–‡å­—列を返ã—ã¾ã™ã€‚ - \param errNumber wolfssl_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã€‚ + \param errNumber wolfSSL_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã€‚ + \param data 人間ãŒèª­ã‚るエラー文字列を格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int err = 0; @@ -2314,14 +3122,20 @@ \sa wolfSSL_ERR_print_errors_fp \sa wolfSSL_load_error_strings */ -char* wolfSSL_ERR_error_string(unsigned long,char*); +char* wolfSSL_ERR_error_string(unsigned long errNumber, char* data); /*! - \ingroup Debug - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_err_error_string()ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚ã“ã“ã§ã€lenã¯bufã«æ›¸ãè¾¼ã¾ã‚Œå¾—る最大文字数を指定ã—ã¾ã™ã€‚wolfssl_err_error_string()ã¨åŒæ§˜ã«ã€ã“ã®é–¢æ•°ã¯wolfssl_get_error()ã‹ã‚‰è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’より人間ãŒèª­ã‚るエラー文字列ã«å¤‰æ›ã—ã¾ã™ã€‚人間ãŒèª­ã‚る文字列ã¯bufã«ç½®ã‹ã‚Œã¾ã™ã€‚ - \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param e wolfssl_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã€‚ + \ingroup Debug + \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_err_error_string()ã®ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚ + ã“ã“ã§ã€å¼•æ•°lenã¯å¼•æ•°bufã«æ›¸ãè¾¼ã¾ã‚Œå¾—る最大文字数を指定ã—ã¾ã™ã€‚ + wolfSSL_err_error_string()ã¨åŒæ§˜ã«ã€ã“ã®é–¢æ•°ã¯wolfSSL_get_error()ã‹ã‚‰è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’より人間ãŒèª­ã‚るエラー文字列ã«å¤‰æ›ã—ã¾ã™ã€‚ + 人間ãŒèª­ã‚る文字列ã¯bufã«ç½®ã‹ã‚Œã¾ã™ã€‚ + \return ãªã— + \param e wolfSSL_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã€‚ \param buff eã¨ä¸€è‡´ã™ã‚‹äººé–“ãŒèª­ã‚るエラー文字列をå«ã‚€å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã€‚ + \param len 出力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + _Example_ \code int err = 0; @@ -2341,15 +3155,18 @@ unsigned long sz); /*! - \ingroup TLS - \brief ã“ã®é–¢æ•°ã¯ã€Options構造体ã®ClosEnotifyã¾ãŸã¯Connresetã¾ãŸã¯SentNotifyメンãƒãƒ¼ã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³æ¡ä»¶ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚オプション構造ã¯WolfSSL構造内ã«ã‚ã‚Šã¾ã™ã€‚ + \ingroup TLS + \brief ã“ã®é–¢æ•°ã¯ã€Options構造体ã®closeNotifyã¾ãŸã¯connResetã¾ãŸã¯sentNotifyメンãƒãƒ¼ã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³æ¡ä»¶ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚ + Options構造体ã¯WOLFSSL構造体内ã«ã‚ã‚Šã¾ã™ã€‚ \return 1 SSL_SENT_SHUTDOWNãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \return 2 ss_received_shutdownãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return 2 SSL_RECEIVED_SHUTDOWNãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code #include - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol method ); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); WOLFSSL* ssl = WOLFSSL_new(ctx); … int ret; @@ -2365,12 +3182,14 @@ \endcode \sa wolfSSL_SESSION_free */ -int wolfSSL_get_shutdown(const WOLFSSL*); +int wolfSSL_get_shutdown(const WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€ã‚ªãƒ—ション構造体ã®å†é–‹ãƒ¡ãƒ³ãƒã‚’è¿”ã—ã¾ã™ã€‚フラグã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’å†åˆ©ç”¨ã™ã‚‹ã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚ãã†ã§ãªã‘ã‚Œã°ã€æ–°ã—ã„セッションを確立ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return This 関数セッションã®å†åˆ©ç”¨ã®ãƒ•ãƒ©ã‚°ã‚’表ã™ã‚ªãƒ—ション構造ã«ä¿æŒã•ã‚Œã¦ã„ã‚‹intåž‹ã‚’è¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -2383,13 +3202,16 @@ \sa wolfSSL_GetSessionIndex \sa wolfSSL_memsave_session_cache */ -int wolfSSL_session_reused(WOLFSSL*); +int wolfSSL_session_reused(WOLFSSL* ssl); /*! - \ingroup TLS + \ingroup TLS \brief ã“ã®é–¢æ•°ã¯ã€æŽ¥ç¶šãŒç¢ºç«‹ã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’確èªã—ã¾ã™ã€‚ \return 0 接続ãŒç¢ºç«‹ã•ã‚Œã¦ã„ãªã„å ´åˆã€ã™ãªã‚ã¡WolfSSL構造体ãŒNULLã¾ãŸã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒè¡Œã‚ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return 1 接続ãŒç¢ºç«‹ã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™.WolfSSL構造体ã¯NULLã¾ãŸã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒè¡Œã‚ã‚Œã¦ã„ã¾ã›ã‚“。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + _Example_ \code #include @@ -2404,10 +3226,10 @@ \sa wolfSSL_get_keys \sa wolfSSL_set_shutdown */ -int wolfSSL_is_init_finished(WOLFSSL*); +int wolfSSL_is_init_finished(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief 文字列ã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹SSLãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚ \return "SSLv3" SSLv3を使ㆠ\return "TLSv1" TLSV1を使用ã™ã‚‹ @@ -2417,6 +3239,8 @@ \return "DTLS": DTLSを使ㆠ\return "DTLSv1.2" DTLSV1.2を使用ã™ã‚‹ \return "unknown" ã©ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®TLSãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’判断ã™ã‚‹ã¨ã„ã†å•é¡ŒãŒã‚ã‚Šã¾ã—ãŸã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code wolfSSL_Init(); @@ -2429,13 +3253,15 @@ \endcode \sa wolfSSL_lib_version */ -const char* wolfSSL_get_version(WOLFSSL*); +const char* wolfSSL_get_version(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief SSLセッションã§ç¾åœ¨ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã‚’è¿”ã—ã¾ã™ã€‚ \return ssl->options.cipherSuite ç¾åœ¨ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã‚’表ã™æ•´æ•°ã€‚ \return 0 æä¾›ã•ã‚Œã¦ã„ã‚‹SSLセッションã¯NULLã§ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code wolfSSL_Init(); @@ -2457,10 +3283,12 @@ int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€SSLセッションã®ç¾åœ¨ã®æš—å·ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return The 関数WolfSSL構造体ã®æš—å·ãƒ¡ãƒ³ãƒãƒ¼ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’è¿”ã—ã¾ã™ã€‚ã“ã‚Œã¯wolfssl_icipher構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ \return NULL WolfSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -2478,13 +3306,15 @@ \sa wolfSSL_get_cipher_name_internal \sa wolfSSL_get_cipher_name */ -WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL*); +WOLFSSL_CIPHER* wolfSSL_get_current_cipher(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€SSLオブジェクト内ã®Cipher Suiteã¨ä½¿ç”¨å¯èƒ½ãªã‚¹ã‚¤ãƒ¼ãƒˆã¨ä¸€è‡´ã—ã€æ–‡å­—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚ \return string ã“ã®é–¢æ•°ã¯ã€ä¸€è‡´ã—ãŸæš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã®æ–‡å­—列表ç¾ã‚’è¿”ã—ã¾ã™ã€‚ \return none スイートãŒä¸€è‡´ã—ã¦ã„ãªã„å ´åˆã¯ã€Œãªã—ã€ã‚’è¿”ã—ã¾ã™ã€‚ + \param cipher WOLFSSL_CIPHER構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code // gets cipher name in the format DHE_RSA ... @@ -2507,9 +3337,11 @@ const char* wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER* cipher); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€SSLオブジェクト内ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã¨ä½¿ç”¨å¯èƒ½ãªã‚¹ã‚¤ãƒ¼ãƒˆã¨ä¸€è‡´ã—ã¾ã™ã€‚ \return This 関数SuiteãŒä¸€è‡´ã•ã›ãŸString値を返ã—ã¾ã™ã€‚スイートãŒä¸€è‡´ã—ã¦ã„ãªã„å ´åˆã¯ã€Œãªã—ã€ã‚’è¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code #ifdef WOLFSSL_DTLS @@ -2525,13 +3357,23 @@ \sa wolfSSL_CIPHER_get_name \sa wolfSSL_get_current_cipher */ -const char* wolfSSL_get_cipher(WOLFSSL*); +const char* wolfSSL_get_cipher(WOLFSSL* ssl); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl構造ã‹ã‚‰ã®wolfssl_sessionã‚’å‚照型ã¨ã—ã¦è¿”ã—ã¾ã™ã€‚ã“ã‚Œã«ã¯ã€wolfssl_session_freeを呼ã³å‡ºã—ã¦ã‚»ãƒƒã‚·ãƒ§ãƒ³å‚照を解除ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ wolfssl_sessionã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å†é–‹ã‚’実行ã™ã‚‹ãŸã‚ã«å¿…è¦ãªã™ã¹ã¦ã®å¿…è¦ãªæƒ…報をå«ã‚€ã“ã¨ã‚’指摘ã—ã€æ–°ã—ã„ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãªã—ã§æŽ¥ç¶šã‚’å†ç¢ºç«‹ã—ã¾ã™ã€‚セッションã®å†é–‹ã®å ´åˆã€wolfssl_shutdown()をセッションオブジェクトã«å‘¼ã³å‡ºã™å‰ã«ã€ã‚¢ãƒ—リケーションã¯ã‚ªãƒ–ジェクトã‹ã‚‰wolfssl_get1_session()を呼ã³å‡ºã—ã¦ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚後ã§ã€ã‚¢ãƒ—リケーションã¯æ–°ã—ã„WolfSSLオブジェクトを作æˆã—ã€ä¿å­˜ã—ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’wolfssl_set_session()ã«å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã®æ™‚点ã§ã€ã‚¢ãƒ—リケーションã¯wolfssl_connect()を呼ã³å‡ºã—ã€WolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’å†é–‹ã—よã†ã¨ã—ã¾ã™ã€‚ WolfSSLサーãƒãƒ¼ã‚³ãƒ¼ãƒ‰ã§ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å†é–‹ã‚’許å¯ã—ã¾ã™ã€‚ wolfssl_get1_session()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯ã€ã‚¢ãƒ—リケーションãŒãれを使用ã—ã¦ãれを使用ã—ã¦è§£æ”¾ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL構造体ã‹ã‚‰WOLFSSL_SESSIONã‚’å‚照型ã¨ã—ã¦è¿”ã—ã¾ã™ã€‚ + ã“ã‚Œã«ã¯ã€wolfSSL_SESSION_freeを呼ã³å‡ºã—ã¦ã‚»ãƒƒã‚·ãƒ§ãƒ³å‚照を解除ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + WOLFSSL_SESSIONã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å†é–‹ã‚’実行ã™ã‚‹ãŸã‚ã«å¿…è¦ãªã™ã¹ã¦ã®å¿…è¦ãªæƒ…報をå«ã¿ã€æ–°ã—ã„ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãªã—ã§æŽ¥ç¶šã‚’å†ç¢ºç«‹ã—ã¾ã™ã€‚ + セッションã®å†é–‹ã®å ´åˆã€wolfSSL_shutdown()をセッションオブジェクトã«å‘¼ã³å‡ºã™å‰ã«ã€ã‚¢ãƒ—リケーションã¯ã‚ªãƒ–ジェクトã‹ã‚‰wolfssl_get1_session()を呼ã³å‡ºã—ã¦ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã‚Œã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + ãã®å¾Œã€ã‚¢ãƒ—リケーションã¯æ–°ã—ã„WOLFSSLオブジェクトを作æˆã—ã€ä¿å­˜ã—ãŸã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’wolfssl_set_session()ã«å‰²ã‚Šå½“ã¦ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã®æ™‚点ã§ã€ã‚¢ãƒ—リケーションã¯wolfssl_connect()を呼ã³å‡ºã—ã€WolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’å†é–‹ã—よã†ã¨ã—ã¾ã™ã€‚ + WolfSSLサーãƒãƒ¼ã‚³ãƒ¼ãƒ‰ã§ã¯ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å†é–‹ã‚’許å¯ã—ã¾ã™ã€‚ + wolfssl_get1_session()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚ªãƒ–ジェクトã¯ã€ã‚¢ãƒ—リケーションãŒä½¿ç”¨å¾Œã¯è§£æ”¾ã•ã‚Œã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return WOLFSSL_SESSION æˆåŠŸã®å ´åˆã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return NULL SSLãŒNULLã®å ´åˆã€SSLセッションキャッシュãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€WolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³IDを使用ã§ããªã„ã€ã¾ãŸã¯ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹é–¢æ•°ãŒå¤±æ•—ã—ã¾ã™ã€‚ + \return NULL sslãŒNULLã®å ´åˆã€SSLセッションキャッシュãŒç„¡åŠ¹ã«ãªã£ã¦ã„ã‚‹å ´åˆã€WolfSSLã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³IDを使用ã§ããªã„ã€ã¾ãŸã¯ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹é–¢æ•°ãŒå¤±æ•—ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl; @@ -2552,10 +3394,11 @@ WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl); /*! - \ingroup Setup - \brief wolfsslv23_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€SSL 3.0 - TLS 1.3ã®é–“ã§ã‚µãƒ¼ãƒãƒ¼ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„る最高ã®ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚WolfSSLクライアントã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¸¡æ–¹ãŒå …牢ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰æ©Ÿèƒ½ã‚’æŒã£ã¦ã„ã¾ã™ã€‚特定ã®ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ¡ã‚½ãƒƒãƒ‰ãŒã©ã¡ã‚‰ã®å´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€ãã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã¿ãŒãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã•ã‚ŒãŸã‚Šã€ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ãŸã¨ãˆã°ã€TLSV1を使用ã—ã€SSLv3ã®ã¿ã«æŽ¥ç¶šã—よã†ã¨ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ã€TLSV1.1ã«æŽ¥ç¶šã—ã¦ã‚‚失敗ã—ã¾ã™ã€‚ã“ã®å•é¡Œã‚’解決ã™ã‚‹ãŸã‚ã«ã€wolfsslv23_client_method()関数を使用ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ã€ã‚µãƒ¼ãƒãƒ¼ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„る最高ã®ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã€å¿…è¦ã«å¿œã˜ã¦SSLv3ã«ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ã“ã®å ´åˆã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯SSLv3 - TLSv1.3を実行ã—ã¦ã„るサーãƒãƒ¼ã«æŽ¥ç¶šã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ - \return pointer æˆåŠŸã™ã‚‹ã¨ã€wolfssl_methodã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒã‚ã‚Šã¾ã™ã€‚ - \return Failure xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \ingroup Setup + \brief wolfsslv23_client_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€SSL 3.0~TLS 1.3ã®é–“ã§ã‚µãƒ¼ãƒãƒ¼ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„る最高ã®ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚WolfSSLクライアントã¨ã‚µãƒ¼ãƒãƒ¼ã®ä¸¡æ–¹ãŒå …牢ãªãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰æ©Ÿèƒ½ã‚’æŒã£ã¦ã„ã¾ã™ã€‚特定ã®ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ¡ã‚½ãƒƒãƒ‰ãŒã©ã¡ã‚‰ã®å´ã§ä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€ãã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã¿ãŒãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã•ã‚ŒãŸã‚Šã€ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ãŸã¨ãˆã°ã€TLSV1を使用ã—ã€SSLv3ã®ã¿ã«æŽ¥ç¶šã—よã†ã¨ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ã€TLSV1.1ã«æŽ¥ç¶šã—ã¦ã‚‚失敗ã—ã¾ã™ã€‚ã“ã®å•é¡Œã‚’解決ã™ã‚‹ãŸã‚ã«ã€wolfsslv23_client_method()関数を使用ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ã€ã‚µãƒ¼ãƒãƒ¼ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„る最高ã®ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã€å¿…è¦ã«å¿œã˜ã¦SSLv3ã«ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ã“ã®å ´åˆã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯SSLv3 - TLSv1.3を実行ã—ã¦ã„るサーãƒãƒ¼ã«æŽ¥ç¶šã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ + \return pointer æˆåŠŸã™ã‚‹ã¨ã€wolfssl_methodã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return Failure xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒENOMEMã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code WOLFSSL_METHOD* method; @@ -2579,11 +3422,13 @@ WOLFSSL_METHOD* wolfSSLv23_client_method(void); /*! - \ingroup IO - \brief ã“ã‚Œã¯ã€å†…部メモリãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã¸ã®ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€å†…部メモリãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã¸ã®ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return size æˆåŠŸã™ã‚‹ã¨ã€ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ \return SSL_FATAL_ERROR エラーケースã«é­é‡ã—ãŸå ´åˆ - \param bio ã®ãƒ¡ãƒ¢ãƒªãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®wolfssl_bio構造。 + \param bio ã®ãƒ¡ãƒ¢ãƒªãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造体。 + \param p メモリãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -2601,11 +3446,13 @@ int wolfSSL_BIO_get_mem_data(WOLFSSL_BIO* bio,void* p); /*! - \ingroup IO + \ingroup IO \brief 使用ã™ã‚‹BIOã®ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã‚’設定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS(1) æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS(1) æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \param bio FDを設定ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造。 \param fd 使用ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«è¨˜è¿°å­ã€‚ + \param closeF fdをクローズã™ã‚‹éš›ã®ãµã‚‹ã¾ã„を指定ã™ã‚‹ãƒ•ãƒ©ã‚° + _Example_ \code WOLFSSL_BIO* bio; @@ -2619,10 +3466,12 @@ long wolfSSL_BIO_set_fd(WOLFSSL_BIO* b, int fd, int flag); /*! - \ingroup IO - \brief BIOãŒè§£æ”¾ã•ã‚ŒãŸã¨ãã«I / Oストリームを閉ã˜ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ã‚¯ãƒ­ãƒ¼ã‚ºãƒ•ãƒ©ã‚°ã‚’設定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS(1) æˆåŠŸã™ã‚‹ã¨ã€‚ - \param bio wolfssl_bio構造体。 + \ingroup IO + \brief BIOãŒè§£æ”¾ã•ã‚ŒãŸã¨ãã«I/Oストリームを閉ã˜ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ã‚¯ãƒ­ãƒ¼ã‚ºãƒ•ãƒ©ã‚°ã‚’設定ã—ã¾ã™ã€‚ + \return SSL_SUCCESS(1) æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param bio WOLFSSL_BIO構造体。 + \param flag I/Oストリームを閉ã˜ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹ã‚¯ãƒ­ãƒ¼ã‚ºãƒ•ãƒ©ã‚° + _Example_ \code WOLFSSL_BIO* bio; @@ -2635,9 +3484,10 @@ int wolfSSL_BIO_set_close(WOLFSSL_BIO *b, long flag); /*! - \ingroup IO - \brief ã“ã‚Œã¯Bio_Socketタイプã®wolfssl_bio_methodã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \return WOLFSSL_BIO_METHOD ソケットタイプã§ã‚ã‚‹wolfssl_bio_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯BIO_SOCKETタイプã®WOLFSSL_BIO_METHODã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \return WOLFSSL_BIO_METHOD ソケットタイプã§ã‚ã‚‹WOLFSSL_BIO_METHOD構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_BIO* bio; @@ -2649,11 +3499,15 @@ WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void); /*! - \ingroup IO - \brief ã“ã‚Œã¯ã€WolfSSL_BIOã®ãƒ©ã‚¤ãƒˆãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚書ãè¾¼ã¿ãƒãƒƒãƒ•ã‚¡ãŒä»¥å‰ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯ã‚µã‚¤ã‚ºã‚’リセットã™ã‚‹ã¨ãã«è§£æ”¾ã•ã‚Œã¾ã™ã€‚読ã¿æ›¸ãインデックスを0ã«ãƒªã‚»ãƒƒãƒˆã™ã‚‹ã¨ã„ã†ç‚¹ã§ã€wolfssl_bio_resetã«ä¼¼ã¦ã„ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_BIOã®ãƒ©ã‚¤ãƒˆãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 書ãè¾¼ã¿ãƒãƒƒãƒ•ã‚¡ãŒä»¥å‰ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯ã‚µã‚¤ã‚ºã‚’リセットã™ã‚‹ã¨ãã«è§£æ”¾ã•ã‚Œã¾ã™ã€‚ + 読ã¿æ›¸ãインデックスを0ã«ãƒªã‚»ãƒƒãƒˆã™ã‚‹ã¨ã„ã†ç‚¹ã§ã€wolfSSL_BIO_resetã«ä¼¼ã¦ã„ã¾ã™ã€‚ \return SSL_SUCCESS 書ãè¾¼ã¿ãƒãƒƒãƒ•ã‚¡ã®è¨­å®šã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ \param bio FDを設定ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造。 + \param size ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL_BIO* bio; @@ -2669,11 +3523,13 @@ int wolfSSL_BIO_set_write_buf_size(WOLFSSL_BIO *b, long size); /*! - \ingroup IO + \ingroup IO \brief ã“ã‚Œã¯2ã¤ã®BIOSを一緒ã«ãƒšã‚¢ãƒªãƒ³ã‚°ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚一対ã®BIOSã¯ã€2ã¤ã®æ–¹æ³•ãƒ‘イプã¨åŒæ§˜ã«ã€ä»–æ–¹ã§èª­ã¿å–られるã“ã¨ãŒã§ãã€ãã®é€†ã‚‚åŒæ§˜ã§ã‚る。BIOSã®ä¸¡æ–¹ãŒåŒã˜ã‚¹ãƒ¬ãƒƒãƒ‰å†…ã«ã‚ã‚‹ã“ã¨ãŒäºˆæƒ³ã•ã‚Œã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã‚¹ãƒ¬ãƒƒãƒ‰ã‚»ãƒ¼ãƒ•ã§ã¯ã‚ã‚Šã¾ã›ã‚“。2ã¤ã®BIOSã®ã†ã¡ã®1ã¤ã‚’解放ã™ã‚‹ã¨ã€ä¸¡æ–¹ã¨ã‚‚ペアã«ãªã£ã¦ã„ã¾ã™ã€‚書ãè¾¼ã¿ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒä»¥å‰ã«è¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€ãã‚Œã¯ãƒšã‚¢ã«ãªã‚‹å‰ã«17000(wolfssl_bio_size)ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚µã‚¤ã‚ºã«è¨­å®šã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 2ã¤ã®BIOSã‚’ã†ã¾ãペアリングã—ã¾ã™ã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ - \param b1 ペアを設定ã™ã‚‹ãŸã‚ã®wolfssl_bio構造。 + \param b1 ペアを設定ã™ã‚‹ãŸã‚ã®ç¬¬ä¸€ã®WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param b2 第二ã®ã®WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -2691,10 +3547,12 @@ int wolfSSL_BIO_make_bio_pair(WOLFSSL_BIO *b1, WOLFSSL_BIO *b2); /*! - \ingroup IO - \brief ã“ã‚Œã¯ã€èª­ã¿å–ã‚Šè¦æ±‚フラグを0ã«æˆ»ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€èª­ã¿å–ã‚Šè¦æ±‚フラグを0ã«æˆ»ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 値を正常ã«è¨­å®šã—ã¾ã™ã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ + \param bio WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -2706,13 +3564,17 @@ \sa wolfSSL_BIO_new, wolfSSL_BIO_s_mem \sa wolfSSL_BIO_new, wolfSSL_BIO_free */ -int wolfSSL_BIO_ctrl_reset_read_request(WOLFSSL_BIO *b); +int wolfSSL_BIO_ctrl_reset_read_request(WOLFSSL_BIO * bio); /*! - \ingroup IO - \brief ã“ã‚Œã¯ã€èª­ã¿å–り用ã®ãƒãƒƒãƒ•ã‚¡ãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚WOLFSSL_BIO_NREADã¨ã¯ç•°ãªã‚Šã€å†…部読ã¿å–りインデックスã¯é–¢æ•°å‘¼ã³å‡ºã—ã‹ã‚‰è¿”ã•ã‚ŒãŸç•ªå·ã«ã‚ˆã£ã¦é«˜åº¦ã«ã¯ãªã‚Šã¾ã›ã‚“。返ã•ã‚Œã‚‹å€¤ã‚’超ãˆã¦èª­ã¿å–ã‚‹ã¨ã€ã‚¢ãƒ¬ã‚¤ã®å¢ƒç•Œã‹ã‚‰èª­ã¿å‡ºã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup IO + \bri f ã“ã®é–¢æ•°ã¯ã€èª­ã¿å–り用ã®ãƒãƒƒãƒ•ã‚¡ãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + wolfSSL_BIO_nreadã¨ã¯ç•°ãªã‚Šã€å†…部読ã¿å–りインデックスã¯é–¢æ•°å‘¼ã³å‡ºã—ã‹ã‚‰è¿”ã•ã‚ŒãŸã‚µã‚¤ã‚ºåˆ†é€²ã¿ã¾ã›ã‚“。 + è¿”ã•ã‚Œã‚‹å€¤ã‚’超ãˆã¦èª­ã¿å–ã‚‹ã¨ã€ã‚¢ãƒ¬ã‚¤ã®å¢ƒç•Œã‹ã‚‰èª­ã¿å‡ºã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ \return >=0 æˆåŠŸã™ã‚‹ã¨ã€èª­ã¿å–ã‚‹ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ - \param bio wolfssl_bio構造体ã‹ã‚‰èª­ã¿å–り。 + \param bio WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param buf 読ã¿å–り用ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_BIO* bio; @@ -2729,12 +3591,17 @@ int wolfSSL_BIO_nread0(WOLFSSL_BIO *bio, char **buf); /*! - \ingroup IO - \brief ã“ã‚Œã¯ã€èª­ã¿å–り用ã®ãƒãƒƒãƒ•ã‚¡ãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚内部読ã¿å–りインデックスã¯ã€èª­ã¿å–ã‚Šå…ƒã®ãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã«æŒ‡ã•ã‚Œã¦ã„ã‚‹BUFを使用ã—ã¦ã€é–¢æ•°å‘¼ã³å‡ºã—ã‹ã‚‰è¿”ã•ã‚Œã‚‹æ•°ã«ã‚ˆã£ã¦é«˜åº¦ã§ã™ã€‚æ•°numã§è¦æ±‚ã•ã‚ŒãŸå€¤ã‚ˆã‚Šã‚‚ãƒã‚¤ãƒˆãŒå°‘ãªã„å ´åˆã€ã‚ˆã‚Šå°‘ãªã„値ãŒè¿”ã•ã‚Œã¾ã™ã€‚è¿”ã•ã‚Œã‚‹å€¤ã‚’超ãˆã¦èª­ã¿å–ã‚‹ã¨ã€ã‚¢ãƒ¬ã‚¤ã®å¢ƒç•Œã‹ã‚‰èª­ã¿å‡ºã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup IO + \biieã‚Œã¯ã€ã“ã®é–¢æ•°ã¯ã€èª­ã¿å–り用ã®ãƒãƒƒãƒ•ã‚¡ãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + 内部読ã¿å–りインデックスã¯ã€èª­ã¿å–ã‚Šå…ƒã®ãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã«æŒ‡ã•ã‚Œã¦ã„ã‚‹BUFを使用ã—ã¦ã€é–¢æ•°å‘¼ã³å‡ºã—ã‹ã‚‰è¿”ã•ã‚Œã‚‹ã‚µã‚¤ã‚ºåˆ†é€²ã¿ã¾ã™ã€‚ + æ•°numã§è¦æ±‚ã•ã‚ŒãŸå€¤ã‚ˆã‚Šã‚‚ãƒã‚¤ãƒˆãŒå°‘ãªã„å ´åˆã€ã‚ˆã‚Šå°‘ãªã„値ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + è¿”ã•ã‚Œã‚‹å€¤ã‚’超ãˆã¦èª­ã¿å–ã‚‹ã¨ã€ã‚¢ãƒ¬ã‚¤ã®å¢ƒç•Œã‹ã‚‰èª­ã¿å‡ºã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ \return >=0 æˆåŠŸã™ã‚‹ã¨ã€èª­ã¿å–ã‚‹ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ \return WOLFSSL_BIO_ERROR(-1) Return -1を読むもã®ã§ã¯ãªã„エラーケースã«ã¤ã„㦠- \param bio wolfssl_bio構造体ã‹ã‚‰èª­ã¿å–り。 + \param bio WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buf 読ã¿å–ã‚Šé…列ã®å…ˆé ­ã«è¨­å®šã™ã‚‹ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param num 読ã¿å–りサイズ + _Example_ \code WOLFSSL_BIO* bio; @@ -2752,13 +3619,16 @@ int wolfSSL_BIO_nread(WOLFSSL_BIO *bio, char **buf, int num); /*! - \ingroup IO - \brief 関数ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã‚‹æ•°ã®ãƒã‚¤ãƒˆã‚’書ã込むãŸã‚ã«ãƒãƒƒãƒ•ã‚¡ãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã—ã¾ã™ã€‚è¿”ã•ã‚Œã‚‹ãƒã‚¤ãƒ³ã‚¿ã«è¿½åŠ ã®ãƒã‚¤ãƒˆã‚’書ã込んã å ´åˆã€è¿”ã•ã‚ŒãŸå€¤ã¯ç¯„囲外ã®æ›¸ãè¾¼ã¿ã«ã¤ãªãŒã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup IO + \brief 関数ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã‚‹æ•°ã®ãƒã‚¤ãƒˆã‚’書ã込むãŸã‚ã«ãƒãƒƒãƒ•ã‚¡ãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã—ã¾ã™ã€‚ + è¿”ã•ã‚Œã‚‹ãƒã‚¤ãƒ³ã‚¿ã«è¿½åŠ ã®ãƒã‚¤ãƒˆã‚’書ã込んã å ´åˆã€è¿”ã•ã‚ŒãŸå€¤ã¯ç¯„囲外ã®æ›¸ãè¾¼ã¿ã«ã¤ãªãŒã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ \return int è¿”ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ãƒã‚¤ãƒ³ã‚¿ã«æ›¸ã込むã“ã¨ãŒã§ãã‚‹ãƒã‚¤ãƒˆæ•°ã‚’è¿”ã—ã¾ã™ã€‚ \return WOLFSSL_BIO_UNSET(-2) ãƒã‚¤ã‚ªãƒšã‚¢ã®ä¸€éƒ¨ã§ã¯ãªã„å ´åˆ \return WOLFSSL_BIO_ERROR(-1) ã«æ›¸ãã¹ã部屋ãŒã“れ以上ãªã„å ´åˆ \param bio WOLFSSL_BIO構造ã«æ›¸ã込む構造。 \param buf 書ã込むãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param num 書ãè¾¼ã¿ãŸã„サイズ + _Example_ \code WOLFSSL_BIO* bio; @@ -2776,10 +3646,12 @@ int wolfSSL_BIO_nwrite(WOLFSSL_BIO *bio, char **buf, int num); /*! - \ingroup IO + \ingroup IO \brief ãƒã‚¤ã‚ªã‚’åˆæœŸçŠ¶æ…‹ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚タイプBIO_BIOã®ä¾‹ã¨ã—ã¦ã€ã“ã‚Œã¯èª­ã¿æ›¸ãインデックスをリセットã—ã¾ã™ã€‚ \return 0 ãƒã‚¤ã‚ªã®ãƒªã‚»ãƒƒãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return WOLFSSL_BIO_ERROR(-1) ä¸è‰¯å…¥åŠ›ã¾ãŸã¯å¤±æ•—ã—ãŸãƒªã‚»ãƒƒãƒˆã§è¿”ã•ã‚Œã¾ã™ã€‚ + \param bio WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -2793,11 +3665,13 @@ int wolfSSL_BIO_reset(WOLFSSL_BIO *bio); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€æŒ‡å®šã•ã‚ŒãŸã‚ªãƒ•ã‚»ãƒƒãƒˆã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒã‚¤ãƒ³ã‚¿ã‚’調整ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®å…ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆã§ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€æŒ‡å®šã•ã‚ŒãŸã‚ªãƒ•ã‚»ãƒƒãƒˆã¸ãƒ•ã‚¡ã‚¤ãƒ«ãƒã‚¤ãƒ³ã‚¿ã‚’調整ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®å…ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆã§ã™ã€‚ \return 0 正常ã«æŽ¢ã—ã¦ã„ã¾ã™ã€‚ \return -1 エラーケースã«é­é‡ã—ãŸå ´åˆ - \param bio 設定ã™ã‚‹wolfssl_bio構造体。 + \param bio 設定ã™ã‚‹WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ofs ファイルã®å…ˆé ­ã‹ã‚‰ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆ + _Example_ \code WOLFSSL_BIO* bio; @@ -2817,11 +3691,13 @@ int wolfSSL_BIO_seek(WOLFSSL_BIO *bio, int ofs); /*! - \ingroup IO + \ingroup IO \brief ã“ã‚Œã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«è¨­å®šãŠã‚ˆã³æ›¸ã込むãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ç¾åœ¨ãƒ•ã‚¡ã‚¤ãƒ«å†…ã®ãƒ‡ãƒ¼ã‚¿ã‚’上書ãã—ã€BIOãŒè§£æ”¾ã•ã‚ŒãŸã¨ãã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‰ã˜ã‚‹ã‚ˆã†ã«è¨­å®šã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS ファイルã®é–‹ãã¨è¨­å®šã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ - \param bio ファイルを設定ã™ã‚‹wolfssl_bio構造体。 + \param bio ファイルを設定ã™ã‚‹WOLFSSL_BIO構造体体。 + \param name 書ãè¾¼ã¿å…ˆãƒ•ã‚¡ã‚¤ãƒ«åã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_BIO* bio; @@ -2838,10 +3714,12 @@ int wolfSSL_BIO_write_filename(WOLFSSL_BIO *bio, char *name); /*! - \ingroup IO + \ingroup IO \brief ã“ã‚Œã¯ãƒ•ã‚¡ã‚¤ãƒ«å€¤ã®çµ‚ã‚りを設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚一般的ãªå€¤ã¯äºˆæƒ³ã•ã‚Œã‚‹æ­£ã®å€¤ã¨æ··åŒã•ã‚Œãªã„よã†ã«-1ã§ã™ã€‚ \return 0 完了ã«æˆ»ã‚Šã¾ã—㟠- \param bio ファイル値ã®çµ‚ã‚りを設定ã™ã‚‹ãŸã‚ã®wolfssl_bio構造体。 + \param bio ファイル値ã®çµ‚ã‚りを設定ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造体体。 + \param v bioã«ã‚»ãƒƒãƒˆã™ã‚‹å€¤ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -2858,11 +3736,13 @@ long wolfSSL_BIO_set_mem_eof_return(WOLFSSL_BIO *bio, int v); /*! - \ingroup IO + \ingroup IO \brief ã“ã‚Œã¯WolfSSL_BIOメモリãƒã‚¤ãƒ³ã‚¿ã®ã‚²ãƒƒã‚¿ãƒ¼é–¢æ•°ã§ã™ã€‚ \return SSL_SUCCESS ãƒã‚¤ãƒ³ã‚¿SSL_SUCCESSã‚’è¿”ã™æ­£å¸¸ã«ï¼ˆç¾åœ¨1ã®å€¤ï¼‰ã€‚ - \return SSL_FAILURE null引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆï¼ˆç¾åœ¨0ã®å€¤ï¼‰ã«æ¸¡ã•ã‚ŒãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FAILURE null引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆï¼ˆç¾åœ¨0ã®å€¤ï¼‰ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param bio メモリãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ptr WOLFSSL_BUF_MEM構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼ˆç¾åœ¨ã¯char*ã¨ãªã£ã¦ã„る) + _Example_ \code WOLFSSL_BIO* bio; @@ -2877,11 +3757,13 @@ long wolfSSL_BIO_get_mem_ptr(WOLFSSL_BIO *bio, WOLFSSL_BUF_MEM **m); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯X509ã®åå‰ã‚’ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ - \return A WOLFSSL_X509_NAME構造åメンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã€ãƒãƒƒãƒ•ã‚¡ã¸ã®POINTER found struffer nameメンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return A WOLFSSL_X509_NAME構造åメンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã€nameメンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ \param name wolfssl_x509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param in wolfssl_x509_name構造ã‹ã‚‰ã‚³ãƒ”ーã•ã‚ŒãŸåå‰ã‚’ä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \param in WOLFSSL_X509_NAME構造体ã‹ã‚‰ã‚³ãƒ”ーã•ã‚ŒãŸåå‰ã‚’ä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + \param sz ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL_X509 x509; @@ -2902,10 +3784,12 @@ char* wolfSSL_X509_NAME_oneline(WOLFSSL_X509_NAME* name, char* in, int sz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ç™ºè¡Œè€…ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ \return point WOLFSSL_X509構造体ã®ç™ºè¡Œè€…メンãƒãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ \return NULL 渡ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ãŒNULLã®å ´åˆ + \param cert WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_X509* x509; @@ -2924,12 +3808,14 @@ \sa wolfSSL_get_peer_certificate \sa wolfSSL_X509_NAME_oneline */ -WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509*); +WOLFSSL_X509_NAME* wolfSSL_X509_get_issuer_name(WOLFSSL_X509* cert); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_x509構造ã®ä»¶åメンãƒãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ \return pointer wolfssl_x509_name構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚WOLFSSL_X509構造体ãŒNULLã®å ´åˆã€ã¾ãŸã¯æ§‹é€ ä½“ã®ä»¶åメンãƒãƒ¼ãŒNULLã®å ´åˆã€ãƒã‚¤ãƒ³ã‚¿ã¯NULLã«ãªã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ + \param cert WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_X509* cert; @@ -2944,13 +3830,15 @@ \sa wolfSSL_X509_get_isCA \sa wolfSSL_get_peer_certificate */ -WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509*); +WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert); /*! - \ingroup CertsKeys - \brief wolfssl_x509構造ã®ISCAメンãƒãƒ¼ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦å€¤ã‚’è¿”ã—ã¾ã™ã€‚ - \return isCA wolfssl_x509構造ã®ISCAメンãƒãƒ¼å†…ã®å€¤ã‚’è¿”ã—ã¾ã™ã€‚ - \return 0 有効ãªX509構造ãŒæ¸¡ã•ã‚Œãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup CertsKeys + \brief WOLFSSL_X509構造体ã®isCaメンãƒãƒ¼ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + \return isCA WOLFSSL_X509構造体ã®isCaメンãƒãƒ¼ã®å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + \return 0 有効ãªWOLFSSL_X509構造体ãŒæ¸¡ã•ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param cert WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl; @@ -2967,15 +3855,17 @@ \sa wolfSSL_X509_get_issuer_name \sa wolfSSL_X509_get_isCA */ -int wolfSSL_X509_get_isCA(WOLFSSL_X509*); +int wolfSSL_X509_get_isCA(WOLFSSL_X509* cert); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€æ¸¡ã•ã‚ŒãŸNID値ã«é–¢é€£ã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆã‚’å–å¾—ã—ã¾ã™ã€‚ \return int テキストãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ \param name wolfssl_x509_nameテキストを検索ã™ã‚‹ã€‚ \param nid 検索ã™ã‚‹NID。 \param buf 見ã¤ã‹ã£ãŸã¨ãã«ãƒ†ã‚­ã‚¹ãƒˆã‚’ä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ + \param len ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + _Example_ \code WOLFSSL_X509_NAME* name; @@ -2994,10 +3884,12 @@ char* buf, int len); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_x509構造ã®Sigoidメンãƒãƒ¼ã«æ ¼ç´ã•ã‚Œã¦ã„る値を返ã—ã¾ã™ã€‚ - \return 0 wolfssl_x509構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_X509構造体ã®sigOIDメンãƒãƒ¼ã«æ ¼ç´ã•ã‚Œã¦ã„る値を返ã—ã¾ã™ã€‚ + \return 0 WOLFSSL_X509構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return int x509オブジェクトã‹ã‚‰å–å¾—ã•ã‚ŒãŸæ•´æ•°å€¤ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param cert WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_X509 x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -3017,10 +3909,13 @@ \sa wolfSSL_X509_notAfter \sa wolfSSL_X509_free */ -int wolfSSL_X509_get_signature_type(WOLFSSL_X509*); +int wolfSSL_X509_get_signature_type(WOLFSSL_X509* cert); /*! - \brief + \brief ã“ã®é–¢æ•°ã¯WOLFSSL_X509構造体を解放ã—ã¾ã™ã€‚ + \return ãªã— + \param x509 WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_X509* x509 = (WOLFSSL_X509*)XMALOC(sizeof(WOLFSSL_X509), NULL, @@ -3039,12 +3934,14 @@ void wolfSSL_X509_free(WOLFSSL_X509* x509); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief x509ç½²åã‚’å–å¾—ã—ã€ãれをãƒãƒƒãƒ•ã‚¡ã«ä¿å­˜ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ç½²åãŒãƒãƒƒãƒ•ã‚¡ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã™ã€‚ \return SSL_FATAL_ERRROR X509構造体ã¾ãŸã¯BUFSZメンãƒãƒ¼ãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚SIG構造ã®é•·ã•ãƒ¡ãƒ³ãƒã®ãƒã‚§ãƒƒã‚¯ã‚‚ã‚る(SIGã¯X509ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã‚る)。 \param x509 wolfssl_x509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buf ãƒãƒƒãƒ•ã‚¡ã¸ã®æ–‡å­—ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param bufSz ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã™ã‚‹int型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_X509* x509 = (WOLFSSL_X509)XMALOC(sizeof(WOLFSSL_X509), NULL, @@ -3065,11 +3962,13 @@ int wolfSSL_X509_get_signature(WOLFSSL_X509* x509, unsigned char* buf, int* bufSz); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_x509_stre構造ã«è¨¼æ˜Žæ›¸ã‚’追加ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_X509_STRE構造体ã«è¨¼æ˜Žæ›¸ã‚’追加ã—ã¾ã™ã€‚ \return SSL_SUCCESS 証明書ãŒæ­£å¸¸ã«è¿½åŠ ã•ã‚ŒãŸå ´åˆã€‚ \return SSL_FATAL_ERROR: 証明書ãŒæ­£å¸¸ã«è¿½åŠ ã•ã‚Œãªã„å ´åˆ \param str 証明書を追加ã™ã‚‹è¨¼æ˜Žæ›¸ã‚¹ãƒˆã‚¢ã€‚ + \param x509 追加ã™ã‚‹WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_X509_STORE* str; @@ -3083,10 +3982,12 @@ int wolfSSL_X509_STORE_add_cert(WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_x509_store_ctx構造体ã®ãƒã‚§ãƒ¼ãƒ³å¤‰æ•°ã®getter関数ã§ã™ã€‚ç¾åœ¨ãƒã‚§ãƒ¼ãƒ³ã¯å–ã‚Šè¾¼ã¾ã‚Œã¦ã„ã¾ã›ã‚“。 - \return pointer æˆåŠŸã—ãŸå ´åˆwolfssl_stack(stack_of(wolfssl_x509))ãƒã‚¤ãƒ³ã‚¿ã¨åŒã˜ - \return Null 失敗ã™ã‚‹ã¨ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_X509_STORE_CTX構造体ã®ãƒã‚§ãƒ¼ãƒ³å¤‰æ•°ã®getter関数ã§ã™ã€‚ç¾åœ¨ãƒã‚§ãƒ¼ãƒ³ã¯å–ã‚Šè¾¼ã¾ã‚Œã¦ã„ã¾ã›ã‚“。 + \return pointer æˆåŠŸã—ãŸå ´åˆWOLFSSL_STACK(STACK_OF(WOLFSSL_X509))ãƒã‚¤ãƒ³ã‚¿ã¨åŒã˜ + \return Null 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx WOLFSSL_X509_STORE_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_STACK* sk; @@ -3100,11 +4001,13 @@ WOLFSSL_X509_STORE_CTX* ctx); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€æ¸¡ã•ã‚ŒãŸwolfssl_x509_store構造体ã®å‹•ä½œã‚’変更ã™ã‚‹ãŸã‚ã®ãƒ•ãƒ©ã‚°ã‚’å–ã‚Šã¾ã™ã€‚使用ã•ã‚Œã‚‹ãƒ•ãƒ©ã‚°ã®ä¾‹ã¯wolfssl_crl_checkã§ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€æ¸¡ã•ã‚ŒãŸWOLFSSL_X509_STORE構造体ã®å‹•ä½œã‚’変更ã™ã‚‹ãŸã‚ã®ãƒ•ãƒ©ã‚°ã‚’å–ã‚Šã¾ã™ã€‚使用ã•ã‚Œã‚‹ãƒ•ãƒ©ã‚°ã®ä¾‹ã¯WOLFSSL_CRL_CHECKã§ã™ã€‚ \return SSL_SUCCESS フラグを設定ã™ã‚‹ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãªã‹ã£ãŸå ´åˆã€‚ \return <0 障害ã®éš›ã«è² ã®å€¤ãŒè¿”ã•ã‚Œã¾ã™ã€‚ \param str フラグを設定ã™ã‚‹è¨¼æ˜Žæ›¸ã‚¹ãƒˆã‚¢ã€‚ + \param flag フラグ + _Example_ \code WOLFSSL_X509_STORE* str; @@ -3122,10 +4025,12 @@ unsigned long flag); /*! - \ingroup CertsKeys - \brief ã“ã‚Œã¯ã€BYTEアレイã¨ã—ã¦ç¬¦å·åŒ–ã•ã‚ŒãŸæœ‰åŠ¹æ€§ã®è¨¼æ˜Žæ›¸ã€ŒNOT BEFISEã€ã‚’機能ã—ã¾ã™ã€‚ - \return NULL wolfssl_x509構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return byte NetBeforEdataã‚’å«ã‚€è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯BYTEアレイã¨ã—ã¦ç¬¦å·åŒ–ã•ã‚ŒãŸ"not before"è¦ç´ ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL WOLFSSL_X509構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return byte NetBeforEdataã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param x509 WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_X509* x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -3145,10 +4050,12 @@ const byte* wolfSSL_X509_notBefore(WOLFSSL_X509* x509); /*! - \ingroup CertsKeys - \brief ã“ã‚Œã¯ã€BYTEé…列ã¨ã—ã¦ç¬¦å·åŒ–ã•ã‚ŒãŸæœ‰åŠ¹æ€§ã®è¨¼æ˜Žæ›¸ã€Œæœªå‡¦ç†ã€ã‚’機能ã—ã¾ã™ã€‚ - \return NULL wolfssl_x509構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return byte NOTAFTERDATAã‚’å«ã‚€è¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€BYTEé…列ã¨ã—ã¦ç¬¦å·åŒ–ã•ã‚ŒãŸ"not after"è¦ç´ ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL WOLFSSL_X509構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return byte notAfterDataã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param x509 WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_X509* x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -3168,11 +4075,15 @@ const byte* wolfSSL_X509_notAfter(WOLFSSL_X509* x509); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_asn1_integer値をwolfssl_bignum構造ã«ã‚³ãƒ”ーã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \return pointer wolfssl_asn1_integer値を正常ã«ã‚³ãƒ”ーã™ã‚‹ã¨ã€wolfssl_bignumãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \return Null 失敗ã™ã‚‹ã¨ã€‚ - \param ai wolfssl asn1_integer構造体ã‹ã‚‰ã‚³ãƒ”ーã™ã‚‹ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_ASN1_INTEGER値をWOLFSSL_BIGNUM構造体ã«ã‚³ãƒ”ーã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \return pointer WOLFSSL_ASN1_INTEGER値を正常ã«ã‚³ãƒ”ーã™ã‚‹ã¨ã€WOLFSSL_BIGNUMãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return Null 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ai WOLFSSL_ASN1_INTEGER構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param bn ã‚‚ã—ã€æ—¢å­˜ã®WOLFSSL_BIGNUM構造体ã«ã‚³ãƒ”ーã—ãŸã„å ´åˆãã®ãƒã‚¤ãƒ³ã‚¿ã‚’ã“ã®å¼•æ•°ã§æŒ‡å®šã—ã¾ã™ã€‚ + NULLを指定ã™ã‚‹ã¨æ–°ãŸã«WOLFSSL_BIGNUM構造体ãŒç”Ÿæˆã•ã‚Œã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + + _Example_ \code WOLFSSL_ASN1_INTEGER* ai; @@ -3190,11 +4101,13 @@ WOLFSSL_BIGNUM *bn); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造ã§æ§‹ç¯‰ã•ã‚Œã¦ã„る内部ãƒã‚§ãƒ¼ãƒ³ã«è¨¼æ˜Žæ›¸ã‚’追加ã—ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造ã§æ§‹ç¯‰ã•ã‚Œã¦ã„る内部ãƒã‚§ãƒ¼ãƒ³ã«è¨¼æ˜Žæ›¸ã‚’追加ã—ã¾ã™ã€‚ \return SSL_SUCCESS 証明書ã®è¿½åŠ ã«æˆåŠŸã—ãŸã‚‰ã€‚ \return SSL_FAILURE ãƒã‚§ãƒ¼ãƒ³ã«è¨¼æ˜Žæ›¸ã‚’追加ã™ã‚‹ã“ã¨ãŒå¤±æ•—ã—ãŸå ´åˆã€‚ - \param ctx 証明書を追加ã™ã‚‹ãŸã‚ã®wolfssl_ctx構造。 + \param ctx 証明書を追加ã™ã‚‹ãŸã‚ã®WOLFSSL_CTX構造。 + \param x509 WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx; @@ -3210,10 +4123,12 @@ long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造ã‹ã‚‰Get Read Hapeフラグを返ã—ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造ã‹ã‚‰Get Read Hapeフラグを返ã—ã¾ã™ã€‚ \return flag æˆåŠŸã™ã‚‹ã¨ã€èª­ã¿å–ã‚Šå…ˆã®ãƒ•ãƒ©ã‚°ã‚’è¿”ã—ã¾ã™ã€‚ \return SSL_FAILURE ctxãŒnullã®å ´åˆã€ssl_failureãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx WOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx; @@ -3226,13 +4141,16 @@ \sa wolfSSL_CTX_free \sa wolfSSL_CTX_set_read_ahead */ -int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX*); +int wolfSSL_CTX_get_read_ahead(WOLFSSL_CTX* ctx); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造内ã®èª­ã¿å‡ºã—å…ˆã®ãƒ•ãƒ©ã‚°ã‚’設定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS CTXãŒå…ˆèª­ã¿ãƒ•ãƒ©ã‚°ã‚’設定ã—ãŸå ´åˆã€‚ - \return SSL_FAILURE ctxãŒnullã®å ´åˆã€ssl_failureãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造内ã®èª­ã¿å‡ºã—å…ˆã®ãƒ•ãƒ©ã‚°ã‚’設定ã—ã¾ã™ã€‚ + \return SSL_SUCCESS ctxãŒå…ˆèª­ã¿ãƒ•ãƒ©ã‚°ã‚’設定ã—ãŸå ´åˆã€‚ + \return SSL_FAILURE ctxãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx WOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param v 先読ã¿ãƒ•ãƒ©ã‚° + _Example_ \code WOLFSSL_CTX* ctx; @@ -3249,11 +4167,13 @@ int wolfSSL_CTX_set_read_ahead(WOLFSSL_CTX* ctx, int v); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯OCSPã§ä½¿ç”¨ã™ã‚‹ã‚ªãƒ—ション引数を設定ã—ã¾ã™ã€‚ \return SSL_FAILURE CTXã¾ãŸã¯ITã®CERT ManagerãŒNULLã®å ´åˆã€‚ \return SSL_SUCCESS 正常ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€‚ - \param ctx wolfssl_ctx構造ユーザー引数を設定ã™ã‚‹ãŸã‚ã®æ§‹é€ ã€‚ + \param ctx WOLFSSL_CTX構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param arg ユーザー引数 + _Example_ \code WOLFSSL_CTX* ctx; @@ -3270,11 +4190,13 @@ long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€PRFコールãƒãƒƒã‚¯ã«æ¸¡ã™ã‚ªãƒ—ションã®å¼•æ•°ã‚’設定ã—ã¾ã™ã€‚ \return SSL_FAILURE CTXãŒNULLã®å ´åˆ \return SSL_SUCCESS 正常ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€‚ - \param ctx wolfssl_ctx構造ユーザー引数を設定ã™ã‚‹ãŸã‚ã®æ§‹é€ ã€‚ + \param ctx WOLFSSL_CTX構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param arg ユーザー引数 + _Example_ \code WOLFSSL_CTX* ctx; @@ -3291,10 +4213,21 @@ WOLFSSL_CTX* ctx, void* arg); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€SSLã®ã‚ªãƒ—ションマスクを設定ã—ã¾ã™ã€‚ã„ãã¤ã‹ã®æœ‰åŠ¹ãªã‚ªãƒ—ションã¯ã€ssl_op_allã€ssl_op_cookie_exchangeã€ssl_op_no_sslv2ã€ssl_op_no_sslv3ã€ssl_op_no_tlsv1_1ã€ssl_op_no_tlsv1_2ã€ssl_op_no_compressionã§ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€SSLã®ã‚ªãƒ—ションマスクを設定ã—ã¾ã™ã€‚ + ã„ãã¤ã‹ã®æœ‰åŠ¹ãªã‚ªãƒ—ションã¯ã€ssl_op_allã€ssl_op_cookie_exchangeã€ssl_op_no_sslv2ã€ssl_op_no_sslv3ã€ssl_op_no_tlsv1_1ã€ssl_op_no_tlsv1_2ã€ssl_op_no_compressionã§ã™ã€‚ \return val SSLã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹æ›´æ–°ã•ã‚ŒãŸã‚ªãƒ—ションマスク値を返ã—ã¾ã™ã€‚ \param s オプションマスクを設定ã™ã‚‹ãŸã‚ã®WolfSSL構造。 + \param op オプションマスク。以下ã®å€¤ãŒæŒ‡å®šå¯èƒ½ã§ã™ï¼š
    + SSL_OP_ALL
    + SSL_OP_COOKIE_EXCHANGE
    + SSL_OP_NO_SSLv2
    + SSL_OP_NO_SSLv3
    + SSL_OP_NO_TLSv1
    + SSL_OP_NO_TLSv1_1
    + SSL_OP_NO_TLSv1_2
    + SSL_OP_NO_COMPRESSION
    + _Example_ \code WOLFSSL* ssl; @@ -3310,9 +4243,11 @@ long wolfSSL_set_options(WOLFSSL *s, long op); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ç¾åœ¨ã®ã‚ªãƒ—ションマスクを返ã—ã¾ã™ã€‚ \return val SSLã«æ ¼ç´ã•ã‚Œã¦ã„るマスク値を返ã—ã¾ã™ã€‚ + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl; @@ -3324,14 +4259,16 @@ \sa wolfSSL_free \sa wolfSSL_set_options */ -long wolfSSL_get_options(const WOLFSSL *s); +long wolfSSL_get_options(const WOLFSSL *ssl); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€æ¸¡ã•ã‚ŒãŸãƒ‡ãƒãƒƒã‚°å¼•æ•°ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \return SSL_SUCCESS 設定ã®æˆåŠŸã—ãŸå¼•æ•°ã«ã¤ã„ã¦ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€æ¸¡ã•ã‚ŒãŸãƒ‡ãƒãƒƒã‚°å¼•æ•°ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE NULL SSLãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ \param ssl 引数を設定ã™ã‚‹ãŸã‚ã®WolfSSL構造。 + \param arg デãƒãƒƒã‚°å¼•æ•° + _Example_ \code WOLFSSL* ssl; @@ -3344,14 +4281,16 @@ \sa wolfSSL_new \sa wolfSSL_free */ -long wolfSSL_set_tlsext_debug_arg(WOLFSSL *s, void *arg); +long wolfSSL_set_tlsext_debug_arg(WOLFSSL *ssl, void *arg); /*! - \ingroup openSSL + \ingroup openSSL \brief ã“ã®é–¢æ•°ã¯ã€ã‚µãƒ¼ãƒãŒOCSPステータス応答(OCSPステイプルã¨ã‚‚呼ã°ã‚Œã‚‹ï¼‰ã‚’é€å—ä¿¡ã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚¢ãƒ—リケーションãŒè¦æ±‚ã•ã‚ŒãŸã¨ãã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ - \return 1 æˆåŠŸã™ã‚‹ã¨ã€‚ - \return 0 エラー時ã«ã€‚ - \param s ssl_new()関数ã«ã‚ˆã£ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \return 1 æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return 0 エラー時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param s ssl_new()関数ã«ã‚ˆã£ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param type ssl拡張タイプ。TLSEXT_STATUSTYPE_ocspã®ã¿æŒ‡å®šå¯ã€‚ + _Example_ \code WOLFSSL *ssl; @@ -3371,10 +4310,12 @@ long wolfSSL_set_tlsext_status_type(WOLFSSL *s, int type); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ã‚’確èªã—よã†ã¨ã—ãŸå¾Œã«çµæžœã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \bri f ã“ã®é–¢æ•°ã¯ã€ã‚Œã¯ã€ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ã‚’確èªã—よã†ã¨ã—ãŸå¾Œã«çµæžœã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return X509_V_OK æˆåŠŸã—ãŸæ¤œè¨¼ã«ã¤ã„㦠\return SSL_FAILURE NULL SSLãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ + \param ssl WOLFSSL 構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl; @@ -3389,10 +4330,12 @@ long wolfSSL_get_verify_result(const WOLFSSL *ssl); /*! - \ingroup Debug - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’より多ãã®äººé–“ãŒèª­ã‚るエラー文字列ã«å¤‰æ›ã—ã€ãã®æ–‡å­—列を出力ファイルã«å°åˆ·ã—ã¾ã™ã€‚ERRã¯ã€WOLFSSL_GET_ERROR()ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã€FPãŒã‚¨ãƒ©ãƒ¼æ–‡å­—列ãŒé…ç½®ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚るエラーコードã§ã™ã€‚ - \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \ingroup Debug + \brief ã“ã®é–¢æ•°ã¯ã€wolfSSL_get_error()ã«ã‚ˆã£ã¦è¿”ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’より多ãã®äººé–“ãŒèª­ã‚るエラー文字列ã«å¤‰æ›ã—ã€ãã®æ–‡å­—列を出力ファイルã«å°åˆ·ã—ã¾ã™ã€‚ERRã¯ã€WOLFSSL_GET_ERROR()ã«ã‚ˆã£ã¦è¿”ã•ã‚Œã€FPãŒã‚¨ãƒ©ãƒ¼æ–‡å­—列ãŒé…ç½®ã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚るエラーコードã§ã™ã€‚ + \return ãªã— \param fp ã«æ›¸ãè¾¼ã¾ã‚Œã‚‹äººé–“ãŒèª­ã‚るエラー文字列ã®å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã€‚ + \param err wolfSSL_get_error()ã§è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã€‚ + _Example_ \code int err = 0; @@ -3410,10 +4353,12 @@ void wolfSSL_ERR_print_errors_fp(XFILE fp, int err); /*! - \ingroup Debug - \brief ã“ã®é–¢æ•°ã¯æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’使用ã—ã¦ã‚¨ãƒ©ãƒ¼å ±å‘Šã‚’処ç†ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯é–¢æ•°ã¯ã‚¨ãƒ©ãƒ¼å›žç·šã”ã¨ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚文字列ã€é•·ã•ã€ãŠã‚ˆã³USERDATAã¯ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ‘ラメータã«æ¸¡ã•ã‚Œã¾ã™ã€‚ - \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \ingroup Debug + \brief ã“ã®é–¢æ•°ã¯æä¾›ã•ã‚ŒãŸã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’使用ã—ã¦ã‚¨ãƒ©ãƒ¼å ±å‘Šã‚’処ç†ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯é–¢æ•°ã¯ã‚¨ãƒ©ãƒ¼å›žç·šã”ã¨ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚文字列ã€é•·ã•ã€ãŠã‚ˆã³userdataã¯ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãƒ‘ラメータã«æ¸¡ã•ã‚Œã¾ã™ã€‚ + \return ãªã— \param cb コールãƒãƒƒã‚¯é–¢æ•° + \param u コールãƒãƒƒã‚¯é–¢æ•°ã«æ¸¡ã•ã‚Œã‚‹userdata + _Example_ \code int error_cb(const char *str, size_t len, void *u) @@ -3431,9 +4376,20 @@ int (*cb)(const char *str, size_t len, void *u), void *u); /*! - \brief wolfssl_ctx構造 - \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \brief ã“ã®é–¢æ•°ã¯WOLFSSL_CTX構造ã®client_psk_cbメンãƒãƒ¼ã‚’セットã—ã¾ã™ã€‚ + \return ãªã— + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cb wc_psk_client_callback ã¯ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã§WOLFSSL_CTX構造体ã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚ + 戻り値ã¯æˆåŠŸæ™‚ã«ã¯éµé•·ã‚’è¿”ã—ã€ã‚¨ãƒ©ãƒ¼æ™‚ã«ã¯ï¼ã‚’è¿”ã—ã¾ã™ã€‚ + unsigned int (*wc_psk_client_callback) + PSK クライアントコールãƒãƒƒã‚¯é–¢æ•°ã®å¼•æ•°ï¼š
    + WOLFSSL* ssl - WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿
    + const char* hint - ユーザーã«å¯¾ã—ã¦è¡¨ç¤ºã•ã‚Œã‚‹ãƒ’ント文字列
    + char* identity - ID
    + unsigned int id_max_len - IDãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º
    + unsigned char* key - æ ¼ç´ã•ã‚Œã‚‹éµ
    + unsigned int key_max_len - éµã®æœ€å¤§ã‚µã‚¤ã‚º
    + _Example_ \code WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol def ); @@ -3450,12 +4406,13 @@ \sa wolfSSL_CTX_set_psk_client_callback */ void wolfSSL_CTX_set_psk_client_callback(WOLFSSL_CTX* ctx, - wc_psk_client_callback); + wc_psk_client_callback cb); /*! - \brief + \brief \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl; @@ -3477,10 +4434,11 @@ wc_psk_client_callback); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯PSKアイデンティティヒントを返ã—ã¾ã™ã€‚ \return pointer WolfSSL構造ã®é…列メンãƒãƒ¼ã«æ ¼ç´ã•ã‚Œã¦ã„る値ã¸ã®const charãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ \return NULL WOLFSSLã¾ãŸã¯é…列構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -3499,10 +4457,11 @@ const char* wolfSSL_get_psk_identity_hint(const WOLFSSL*); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief 関数ã¯ã€é…列構造ã®Client_Identityメンãƒãƒ¼ã¸ã®å®šæ•°ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return string é…列構造ã®client_identityメンãƒã®æ–‡å­—列値。 \return NULL WOLFSSL構造ãŒNULLã®å ´åˆã€ã¾ãŸã¯WOLFSSL構造ã®é…列メンãƒãƒ¼ãŒNULLã®å ´åˆã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -3521,10 +4480,11 @@ const char* wolfSSL_get_psk_identity(const WOLFSSL*); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造体ã®server_hintメンãƒãƒ¼ã«HINT引数を格ç´ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造体ã®server_hintメンãƒãƒ¼ã«HINT引数を格ç´ã—ã¾ã™ã€‚ \return SSL_SUCCESS 機能ã®å®Ÿè¡ŒãŒæˆåŠŸã—ãŸãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -3544,11 +4504,12 @@ int wolfSSL_CTX_use_psk_identity_hint(WOLFSSL_CTX* ctx, const char* hint); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€wolfssl構造内ã®é…列構造ã®server_hintメンãƒãƒ¼ã«HINT引数を格ç´ã—ã¾ã™ã€‚ \return SSL_SUCCESS ヒントãŒWolfSSL構造ã«æ­£å¸¸ã«ä¿å­˜ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE WOLFSSLã¾ãŸã¯é…列構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -3563,9 +4524,10 @@ int wolfSSL_use_psk_identity_hint(WOLFSSL* ssl, const char* hint); /*! - \brief wolfssl_ctx構造体 + \brief WOLFSSL_CTX構造体 \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -3594,7 +4556,8 @@ /*! \brief WolfSSL構造オプションメンãƒãƒ¼ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx; @@ -3622,9 +4585,10 @@ /*! - \brief + \brief \return WOLFSSL_SUCCESS ã¾ãŸã¯wolfssl_failure. - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \sa wolfSSL_get_psk_callback_ctx \sa wolfSSL_CTX_set_psk_callback_ctx \sa wolfSSL_CTX_get_psk_callback_ctx @@ -3632,9 +4596,9 @@ int wolfSSL_set_psk_callback_ctx(WOLFSSL* ssl, void* psk_ctx); /*! - \brief + \brief \return WOLFSSL_SUCCESS ã¾ãŸã¯wolfssl_failure. - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \sa wolfSSL_set_psk_callback_ctx \sa wolfSSL_get_psk_callback_ctx \sa wolfSSL_CTX_get_psk_callback_ctx @@ -3642,7 +4606,7 @@ int wolfSSL_CTX_set_psk_callback_ctx(WOLFSSL_CTX* ctx, void* psk_ctx); /*! - \brief + \brief \return void ユーザーPSKコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ \sa wolfSSL_set_psk_callback_ctx \sa wolfSSL_CTX_set_psk_callback_ctx @@ -3651,7 +4615,7 @@ void* wolfSSL_get_psk_callback_ctx(WOLFSSL* ssl); /*! - \brief + \brief \return void ユーザーPSKコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ \sa wolfSSL_CTX_set_psk_callback_ctx \sa wolfSSL_set_psk_callback_ctx @@ -3660,10 +4624,11 @@ void* wolfSSL_CTX_get_psk_callback_ctx(WOLFSSL_CTX* ctx); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®æ©Ÿèƒ½ã«ã‚ˆã‚Šã€CTX構造ã®HAVAnonメンãƒãƒ¼ãŒã‚³ãƒ³ãƒ‘イル中ã«å®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€CTX構造ã®HABANONメンãƒãƒ¼ã‚’有効ã«ã—ã¾ã™ã€‚ \return SSL_SUCCESS 機能ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚Œã€CTXã®Haveannonメンãƒãƒ¼ãŒ1ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE CTX構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -3683,10 +4648,11 @@ int wolfSSL_CTX_allow_anon_cipher(WOLFSSL_CTX*); /*! - \ingroup Setup - \brief wolfsslv23_server_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€SSL 3.0 - TLS 1.3ã‹ã‚‰ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨æŽ¥ç¶šã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \ingroup Setup + \brief wolfsslv23_server_method()関数ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€SSL 3.0 - TLS 1.3ã‹ã‚‰ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨æŽ¥ç¶šã™ã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ \return pointer æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return Failure xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + \return Failure xmallocを呼ã³å‡ºã™ã¨ãã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã€åŸºç¤Žã¨ãªã‚‹Malloc()実装ã®å¤±æ•—値ãŒè¿”ã•ã‚Œã¾ã™ï¼ˆé€šå¸¸ã¯errnoãŒenomeemã«è¨­å®šã•ã‚Œã¾ã™ï¼‰ã€‚ + _Example_ \code WOLFSSL_METHOD* method; @@ -3711,10 +4677,11 @@ WOLFSSL_METHOD *wolfSSLv23_server_method(void); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€WolfSSL構造体ã®å†…部エラー状態をå–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \bri f ã“ã®é–¢æ•°ã¯ã€ã‚Œã¯ã€WolfSSL構造体ã®å†…部エラー状態をå–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return wolfssl_error SSLエラー状態ã€é€šå¸¸ã¯ãƒžã‚¤ãƒŠã‚¹ã‚’è¿”ã—ã¾ã™ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆ + _Example_ \code WOLFSSL* ssl; @@ -3729,10 +4696,11 @@ int wolfSSL_state(WOLFSSL* ssl); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ã‚’å–å¾—ã—ã¾ã™ã€‚ \return pointer WOLFSSL_X509構造ã®PECRERTメンãƒãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãŒå­˜åœ¨ã™ã‚‹å ´åˆã¯ã€‚ \return 0 ピア証明書発行者サイズãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -3751,10 +4719,11 @@ WOLFSSL_X509* wolfSSL_get_peer_certificate(WOLFSSL* ssl); /*! - \ingroup Debug - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_get_error()を呼ã³å‡ºã—ã¦ssl_error_want_readã‚’å–å¾—ã™ã‚‹ã®ã¨ä¼¼ã¦ã„ã¾ã™ã€‚基礎ã¨ãªã‚‹ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ãŒSSL_ERROR_WANT_READã®å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ãŒã€ãれ以外ã®å ´åˆã¯0ã§ã™ã€‚ - \return 1 WOLFSSL_GET_ERROR()ã¯SSL_ERROR_WANT_READã‚’è¿”ã—ã€åŸºç¤Žã¨ãªã‚‹I / Oã«ã¯èª­ã¿å–ã‚Šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã™ã€‚ + \ingroup Debug + \brief ã“ã®é–¢æ•°ã¯ã€wolfSSL_get_error()を呼ã³å‡ºã—ã¦ssl_error_want_readã‚’å–å¾—ã™ã‚‹ã®ã¨ä¼¼ã¦ã„ã¾ã™ã€‚基礎ã¨ãªã‚‹ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ãŒSSL_ERROR_WANT_READã®å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ãŒã€ãれ以外ã®å ´åˆã¯0ã§ã™ã€‚ + \return 1 WOLFSSL_GET_ERROR()ã¯SSL_ERROR_WANT_READã‚’è¿”ã—ã€åŸºç¤Žã¨ãªã‚‹I / Oã«ã¯èª­ã¿å–ã‚Šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãŒã‚ã‚Šã¾ã™ã€‚ \return 0 SSL_ERROR_WANT_READエラー状態ã¯ã‚ã‚Šã¾ã›ã‚“。 + _Example_ \code int ret; @@ -3772,10 +4741,11 @@ int wolfSSL_want_read(WOLFSSL*); /*! - \ingroup Debug - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_get_error()を呼ã³å‡ºã—ã€RETURSã®SSL_ERROR_WANT_WRITEã‚’å–å¾—ã™ã‚‹ã®ã¨åŒã˜ã§ã™ã€‚基礎ã¨ãªã‚‹ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ãŒSSL_ERROR_WANT_WRITEã®å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ãŒã€ãれ以外ã®å ´åˆã¯0ã§ã™ã€‚ - \return 1 WOLFSSL_GET_ERROR()ã¯SSL_ERROR_WANT_WRITEã‚’è¿”ã—ã¾ã™ã€‚基礎ã¨ãªã‚‹I / Oã¯ã€åŸºç¤Žã¨ãªã‚‹SSL接続ã§é€²è¡ŒçŠ¶æ³ã‚’è¡Œã†ãŸã‚ã«æ›¸ãè¾¼ã¾ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ + \ingroup Debug + \brief ã“ã®é–¢æ•°ã¯ã€wolfSSL_get_error()を呼ã³å‡ºã—ã€RETURSã®SSL_ERROR_WANT_WRITEã‚’å–å¾—ã™ã‚‹ã®ã¨åŒã˜ã§ã™ã€‚基礎ã¨ãªã‚‹ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ãŒSSL_ERROR_WANT_WRITEã®å ´åˆã€ã“ã®é–¢æ•°ã¯1ã‚’è¿”ã—ã¾ã™ãŒã€ãれ以外ã®å ´åˆã¯0ã§ã™ã€‚ + \return 1 WOLFSSL_GET_ERROR()ã¯SSL_ERROR_WANT_WRITEã‚’è¿”ã—ã¾ã™ã€‚基礎ã¨ãªã‚‹I / Oã¯ã€åŸºç¤Žã¨ãªã‚‹SSL接続ã§é€²è¡ŒçŠ¶æ³ã‚’è¡Œã†ãŸã‚ã«æ›¸ãè¾¼ã¾ã‚Œã‚‹ãƒ‡ãƒ¼ã‚¿ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ \return 0 ssl_error_want_writeエラー状態ã¯ã‚ã‚Šã¾ã›ã‚“。 + _Example_ \code int ret; @@ -3792,11 +4762,12 @@ int wolfSSL_want_write(WOLFSSL*); /*! - \ingroup Setup - \brief wolfsslデフォルトã§ã¯ã€æœ‰åŠ¹ãªæ—¥ä»˜ç¯„囲ã¨æ¤œè¨¼æ¸ˆã¿ã®ç½²åã®ãŸã‚ã«ãƒ”ア証明書をãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚wolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã®å‰ã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™ã¨ã€å®Ÿè¡Œã™ã‚‹ãƒã‚§ãƒƒã‚¯ã®ãƒªã‚¹ãƒˆã«ãƒ‰ãƒ¡ã‚¤ãƒ³åãƒã‚§ãƒƒã‚¯ãŒè¿½åŠ ã•ã‚Œã¾ã™ã€‚DNå—信時ã«ãƒ”ア証明書を確èªã™ã‚‹ãŸã‚ã®ãƒ‰ãƒ¡ã‚¤ãƒ³åã‚’ä¿æŒã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \ingroup Setup + \brief wolfsslデフォルトã§ã¯ã€æœ‰åŠ¹ãªæ—¥ä»˜ç¯„囲ã¨æ¤œè¨¼æ¸ˆã¿ã®ç½²åã®ãŸã‚ã«ãƒ”ア証明書をãƒã‚§ãƒƒã‚¯ã—ã¾ã™ã€‚wolfssl_connect()ã¾ãŸã¯wolfssl_accept()ã®å‰ã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™ã¨ã€å®Ÿè¡Œã™ã‚‹ãƒã‚§ãƒƒã‚¯ã®ãƒªã‚¹ãƒˆã«ãƒ‰ãƒ¡ã‚¤ãƒ³åãƒã‚§ãƒƒã‚¯ãŒè¿½åŠ ã•ã‚Œã¾ã™ã€‚DNå—信時ã«ãƒ”ア証明書を確èªã™ã‚‹ãŸã‚ã®ãƒ‰ãƒ¡ã‚¤ãƒ³åã‚’ä¿æŒã—ã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE メモリエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret = 0; @@ -3814,10 +4785,11 @@ int wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn); /*! - \ingroup TLS + \ingroup TLS \brief 使用ã™ã‚‹ãŸã‚ã«WolfSSLライブラリをåˆæœŸåŒ–ã—ã¾ã™ã€‚アプリケーションã”ã¨ã«1回ã€ãã®ä»–ã®ãƒ©ã‚¤ãƒ–ラリã¸ã®å‘¼ã³å‡ºã—ã®å‰ã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ \return BAD_MUTEX_E è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚るエラーã§ã™ã€‚ + _Example_ \code int ret = 0; @@ -3832,9 +4804,10 @@ int wolfSSL_Init(void); /*! - \ingroup TLS + \ingroup TLS \brief ã•ã‚‰ãªã‚‹ä½¿ç”¨ã‹ã‚‰WOLFSSLライブラリをåˆæœŸåŒ–ã—ã¾ã™ã€‚ライブラリã«ã‚ˆã£ã¦ä½¿ç”¨ã•ã‚Œã‚‹ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã—ã¾ã™ãŒã€å‘¼ã³å‡ºã•ã‚Œã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。 \return SSL_SUCCESS エラーを返ã—ã¾ã›ã‚“。 + _Example_ \code wolfSSL_Cleanup(); @@ -3844,9 +4817,10 @@ int wolfSSL_Cleanup(void); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ç¾åœ¨ã®ãƒ©ã‚¤ãƒ–ラリーãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚ \return LIBWOLFSSL_VERSION_STRING ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’定義ã™ã‚‹const charãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code char version[MAXSIZE]; @@ -3861,9 +4835,10 @@ const char* wolfSSL_lib_version(void); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€ç¾åœ¨ã®ãƒ©ã‚¤ãƒ–ラリーã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’16進表記ã§è¿”ã—ã¾ã™ã€‚ \return LILBWOLFSSL_VERSION_HEX wolfssl / version.hã§å®šç¾©ã•ã‚Œã¦ã„ã‚‹16進数ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code word32 libV; @@ -3880,10 +4855,11 @@ word32 wolfSSL_lib_version_hex(void); /*! - \ingroup IO - \brief SSLメソッドã®å´é¢ã«åŸºã¥ã„ã¦ã€å®Ÿéš›ã®æŽ¥ç¶šã¾ãŸã¯æ‰¿èªã‚’実行ã—ã¾ã™ã€‚クライアントå´ã‹ã‚‰å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€ã‚µãƒ¼ãƒå´ã‹ã‚‰å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã«wolfssl_accept()ãŒå®Ÿè¡Œã•ã‚Œã¦ã„ã‚‹é–“ã«wolfssl_connect()ãŒè¡Œã‚れる。 - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”å´ã•ã‚Œã¾ã™ã€‚(注æ„ã€å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯0ã‚’è¿”ã—ã¾ã™ï¼‰ - \return SSL_FATAL_ERROR 基礎ã¨ãªã‚‹å‘¼ã³å‡ºã—ãŒã‚¨ãƒ©ãƒ¼ã«ãªã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を使用ã—ã¦ãã ã•ã„。 + \ingroup IO + \brief SSLメソッドã®å´é¢ã«åŸºã¥ã„ã¦ã€å®Ÿéš›ã®æŽ¥ç¶šã¾ãŸã¯æ‰¿èªã‚’実行ã—ã¾ã™ã€‚クライアントå´ã‹ã‚‰å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€ã‚µãƒ¼ãƒå´ã‹ã‚‰å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã«wolfssl_accept()ãŒå®Ÿè¡Œã•ã‚Œã¦ã„ã‚‹é–“ã«wolfssl_connect()ãŒè¡Œã‚れる。 + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã«è¿”å´ã•ã‚Œã¾ã™ã€‚(注æ„ã€å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯0ã‚’è¿”ã—ã¾ã™ï¼‰ + \return SSL_FATAL_ERROR 基礎ã¨ãªã‚‹å‘¼ã³å‡ºã—ãŒã‚¨ãƒ©ãƒ¼ã«ãªã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を使用ã—ã¦ãã ã•ã„。 + _Example_ \code int ret = SSL_FATAL_ERROR; @@ -3903,10 +4879,11 @@ int wolfSSL_negotiate(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief SSL接続ã«åœ§ç¸®ã‚’使用ã™ã‚‹æ©Ÿèƒ½ã‚’オンã«ã—ã¾ã™ã€‚両å´ã«ã¯åœ§ç¸®ãŒã‚ªãƒ³ã«ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ãã†ã§ãªã‘ã‚Œã°åœ§ç¸®ã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。ZLIBライブラリã¯å®Ÿéš›ã®ãƒ‡ãƒ¼ã‚¿åœ§ç¸®ã‚’実行ã—ã¾ã™ã€‚ライブラリã«ã‚³ãƒ³ãƒ‘イルã™ã‚‹ã«ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ã®è¨­å®šã‚·ã‚¹ãƒ†ãƒ ã«--with-libzを使用ã—ã€ãã†ã§ãªã„å ´åˆã¯hand_libzを定義ã—ã¾ã™ã€‚é€å—ä¿¡ã•ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºã‚’減らã™å‰ã«ãƒ‡ãƒ¼ã‚¿ã‚’圧縮ã—ã¦ã„ã‚‹é–“ã«ã€åœ§ç¸®ã«ã‚ˆã£ã¦ä¿å­˜ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®é‡ã¯é€šå¸¸ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®é…ã„ã™ã¹ã¦ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’除ã„ãŸã‚‚ã®ã‚ˆã‚Šã‚‚分æžã«æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN 圧縮サãƒãƒ¼ãƒˆãŒãƒ©ã‚¤ãƒ–ラリã«çµ„ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -3922,11 +4899,12 @@ int wolfSSL_set_compression(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯SSLセッションタイムアウト値を秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚ \return SSL_SUCCESS セッションを正常ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code int ret = 0; @@ -3945,12 +4923,13 @@ int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€æŒ‡å®šã•ã‚ŒãŸSSLコンテキストã«å¯¾ã—ã¦ã€SSLセッションã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤ã‚’秒å˜ä½ã§è¨­å®šã—ã¾ã™ã€‚ \return the wolfssl_error_code_opensslã®å ´åˆã€ä»¥å‰ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤ \return defined æˆåŠŸã—ã¦ã„ã¾ã™ã€‚定義ã•ã‚Œã¦ã„ãªã„å ´åˆã€SSL_SUCCESSã¯è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 入力コンテキスト(CTX)ãŒNULLã®ã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -3969,10 +4948,11 @@ int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to); /*! - \ingroup openSSL + \ingroup openSSL \brief ピアã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’å–å¾—ã—ã¾ã™ã€‚ \return chain 正常ã«ã‚³ãƒ¼ãƒ«ãŒãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’è¿”ã—ã¾ã™ã€‚ \return 0 無効ãªWolfSSLãƒã‚¤ãƒ³ã‚¿ãŒé–¢æ•°ã«æ¸¡ã•ã‚Œã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code none @@ -3985,10 +4965,11 @@ WOLFSSL_X509_CHAIN* wolfSSL_get_peer_chain(WOLFSSL* ssl); /*! - \ingroup openSSL + \ingroup openSSL \brief ピアã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³æ•°ã‚’å–å¾—ã—ã¾ã™ã€‚ \return Success 正常ã«ã‚³ãƒ¼ãƒ«ãŒãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³æ•°ã‚’è¿”ã—ã¾ã™ã€‚ \return 0 無効ãªãƒã‚§ãƒ¼ãƒ³ãƒã‚¤ãƒ³ã‚¿ãŒé–¢æ•°ã«æ¸¡ã•ã‚Œã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code none @@ -4001,11 +4982,12 @@ int wolfSSL_get_chain_count(WOLFSSL_X509_CHAIN* chain); /*! - \ingroup openSSL + \ingroup openSSL \brief Index(IDX)ã®ãƒ”ã‚¢ã®ASN1.DER証明書長をãƒã‚¤ãƒˆå˜ä½ã§å–å¾—ã—ã¾ã™ã€‚ \return Success 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åˆ¥ã«ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸é•·ã‚’ãƒã‚¤ãƒˆå˜ä½ã§è¿”ã—ã¾ã™ã€‚ \return 0 無効ãªãƒã‚§ãƒ¼ãƒ³ãƒã‚¤ãƒ³ã‚¿ãŒé–¢æ•°ã«æ¸¡ã•ã‚Œã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \param chain 有効ãªwolfssl_x509_chain構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code none @@ -4018,11 +5000,12 @@ int wolfSSL_get_chain_length(WOLFSSL_X509_CHAIN* chain, int idx); /*! - \ingroup openSSL + \ingroup openSSL \brief インデックス(IDX)ã§ãƒ”ã‚¢ã®ASN1.DER証明書をå–å¾—ã—ã¾ã™ã€‚ \return Success 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ã‚’è¿”ã—ã¾ã™ã€‚ \return 0 無効ãªãƒã‚§ãƒ¼ãƒ³ãƒã‚¤ãƒ³ã‚¿ãŒé–¢æ•°ã«æ¸¡ã•ã‚Œã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \param chain 有効ãªwolfssl_x509_chain構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code none @@ -4035,7 +5018,7 @@ unsigned char* wolfSSL_get_chain_cert(WOLFSSL_X509_CHAIN* chain, int idx); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸ã®ãƒã‚§ãƒ¼ãƒ³ã‹ã‚‰ã®ãƒ”ã‚¢ã®WOLFSSL_X509構造体をインデックス(IDX)ã§å–å¾—ã—ã¾ã™ã€‚ \return pointer WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \param chain 動的メモリsession_cacheã®å ´åˆã«ä½¿ç”¨ã•ã‚Œã‚‹WOLFSSL_X509_CHAINã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ @@ -4064,11 +5047,12 @@ WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx); /*! - \ingroup openSSL + \ingroup openSSL \brief インデックス(IDX)ã§ãƒ”ã‚¢ã®PEM証明書をå–å¾—ã—ã¾ã™ã€‚ \return Success 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ã‚’è¿”ã—ã¾ã™ã€‚ \return 0 無効ãªãƒã‚§ãƒ¼ãƒ³ãƒã‚¤ãƒ³ã‚¿ãŒé–¢æ•°ã«æ¸¡ã•ã‚Œã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \param chain 有効ãªwolfssl_x509_chain構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code none @@ -4082,9 +5066,10 @@ unsigned char* buf, int inLen, int* outLen); /*! - \ingroup openSSL + \ingroup openSSL \brief セッションã®IDã‚’å–å¾—ã—ã¾ã™ã€‚セッションIDã¯å¸¸ã«32ãƒã‚¤ãƒˆã®é•·ã•ã§ã™ã€‚ \return id セッションID。 + _Example_ \code none @@ -4094,11 +5079,12 @@ const unsigned char* wolfSSL_get_sessionID(const WOLFSSL_SESSION* s); /*! - \ingroup openSSL + \ingroup openSSL \brief ピアã®è¨¼æ˜Žæ›¸ã®ã‚·ãƒªã‚¢ãƒ«ç•ªå·ã‚’å–å¾—ã—ã¾ã™ã€‚シリアル番å·ãƒãƒƒãƒ•ã‚¡ï¼ˆIN)ã¯å°‘ãªãã¨ã‚‚32ãƒã‚¤ãƒˆä»¥ä¸Šã§ã‚ã‚Šã€å…¥åŠ›ã¨ã—ã¦* INOUTSZ引数ã¨ã—ã¦æä¾›ã•ã‚Œã¾ã™ã€‚関数を呼ã³å‡ºã—ãŸå¾Œ* INOUTSZã¯INãƒãƒƒãƒ•ã‚¡ã«æ›¸ãè¾¼ã¾ã‚ŒãŸå®Ÿéš›ã®é•·ã•ã‚’ãƒã‚¤ãƒˆå˜ä½ã§ä¿æŒã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 関数ã®ä¸è‰¯å¼•æ•°ãŒè¦‹ã¤ã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param in シリアル番å·ãƒãƒƒãƒ•ã‚¡ã¯å°‘ãªãã¨ã‚‚32ãƒã‚¤ãƒˆã®é•·ã•ã§ã‚ã‚‹ã¹ãã§ã™ + _Example_ \code none @@ -4109,10 +5095,11 @@ int* inOutSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief 証明書ã‹ã‚‰ä»¶åã®å…±é€šåã‚’è¿”ã—ã¾ã™ã€‚ \return NULL X509構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ \return string サブジェクトã®å…±é€šåã®æ–‡å­—列表ç¾ã¯æˆåŠŸã«è¿”ã•ã‚Œã¾ã™ + _Example_ \code WOLFSSL_X509 x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -4133,11 +5120,12 @@ char* wolfSSL_X509_get_subjectCN(WOLFSSL_X509*); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_x509構造体ã®DERエンコードã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’å–å¾—ã—ã¾ã™ã€‚ \return buffer ã“ã®é–¢æ•°ã¯Derbuffer構造体ã®ãƒãƒƒãƒ•ã‚¡ãƒ¡ãƒ³ãƒãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒã‚¤ãƒˆåž‹ã§ã™ã€‚ \return NULL x509ã¾ãŸã¯outszパラメーターãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param x509 証明書情報をå«ã‚€WolfSSL_X509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_X509 x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -4158,10 +5146,11 @@ const unsigned char* wolfSSL_X509_get_der(WOLFSSL_X509* x509, int* outSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€x509ãŒnullã®ã‹ã©ã†ã‹ã‚’確èªã—ã€ãã†ã§ãªã„å ´åˆã¯ã€x509構造体ã®ãƒŽãƒƒã‚«ã‚¹ãƒ¡ãƒ³ãƒãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ \return pointer ASN1_TIMEを使用ã—ã¦X509構造体ã®ãƒŽã‚«ãƒ•ã‚¿ãƒ¼ãƒ¡ãƒ³ãƒãƒ¼ã«æ§‹é€ ä½“を表明ã—ã¾ã™ã€‚ \return NULL X509オブジェクトãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_X509* x509 = (WOLFSSL_X509)XMALOC(sizeof(WOLFSSL_X509), NULL, @@ -4177,10 +5166,11 @@ WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(WOLFSSL_X509*); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯X509証明書ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å–å¾—ã—ã¾ã™ã€‚ \return 0 X509構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return version X509構造ã«ä¿å­˜ã•ã‚Œã¦ã„ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_X509* x509; @@ -4199,11 +5189,12 @@ int wolfSSL_X509_version(WOLFSSL_X509*); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief no_stdio_filesystemãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯ãƒ’ープメモリを割り当ã¦ã€wolfssl_x509構造をåˆæœŸåŒ–ã—ã¦ãã‚Œã«ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return *WOLFSSL_X509 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã€WolfSSL_X509構造ãƒã‚¤ãƒ³ã‚¿ãŒè¿”ã•ã‚Œã¾ã™ã€‚ \return NULL Xftellマクロã®å‘¼ã³å‡ºã—ãŒè² ã®å€¤ã‚’è¿”ã™å ´åˆã€‚ \param x509 wolfssl_x509ãƒã‚¤ãƒ³ã‚¿ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_X509* x509a = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -4225,11 +5216,12 @@ wolfSSL_X509_d2i_fp(WOLFSSL_X509** x509, FILE* file); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief 関数ã¯X509証明書をメモリã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ \return pointer 実行ã•ã‚ŒãŸå®Ÿè¡Œã¯ã€wolfssl_x509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 証明書ãŒæ›¸ãè¾¼ã¾ã‚Œãªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param fname ロードã™ã‚‹è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«ã€‚ + _Example_ \code #define cliCert “certs/client-cert.pem†@@ -4248,12 +5240,13 @@ wolfSSL_X509_load_certificate_file(const char* fname, int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€ãƒ‡ãƒã‚¤ã‚¹ã®ç¨®é¡žã‚’X509構造ã‹ã‚‰ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ \return pointer X509構造ã‹ã‚‰ãƒ‡ãƒã‚¤ã‚¹ã®ç¨®é¡žã‚’ä¿æŒã™ã‚‹ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param x509 wolfssl_x509_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_x509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param x509 wolfssl_x509_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_x509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in デãƒã‚¤ã‚¹ã‚¿ã‚¤ãƒ—(ãƒãƒƒãƒ•ã‚¡ï¼‰ã‚’ä¿æŒã™ã‚‹ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_X509* x509 = (WOLFSSL_X509)XMALOC(sizeof(WOLFSSL_X509), NULL, @@ -4276,12 +5269,13 @@ int* inOutSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_x509構造ã®HWTypeメンãƒãƒ¼ã‚’ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ \return byte ã“ã®é–¢æ•°ã¯ã€wolfssl_x509構造ã®HWTypeメンãƒãƒ¼ã«ä»¥å‰ã«ä¿æŒã•ã‚Œã¦ã„るデータã®ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL inoutszãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param x509 証明書情報をå«ã‚€WolfSSL_X509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in ãƒãƒƒãƒ•ã‚¡ã‚’表ã™ãƒã‚¤ãƒˆã‚’入力ã™ã‚‹ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_X509* x509; // X509 certificate @@ -4302,11 +5296,12 @@ int* inOutSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯X509オブジェクトã®hwserialNumメンãƒã‚’è¿”ã—ã¾ã™ã€‚ \return pointer ã“ã®é–¢æ•°ã¯ã€X509オブジェクトã‹ã‚‰ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸã‚·ãƒªã‚¢ãƒ«ç•ªå·ã‚’å«ã‚€INãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \param x509 証明書情報をå«ã‚€WOLFSSL_X509構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in コピーã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code char* serial; @@ -4331,11 +5326,12 @@ unsigned char* in, int* inOutSz); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã€ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’å–å¾—ã™ã‚‹ã®ã«å分ãªé•·ã•ã ã‘サーãƒãƒ¼ã‚’æŒã¤SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€åŸºç¤Žã¨ãªã‚‹é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ wolfssl_connect_cert()ã¯ã€ãƒ–ロックã¨éžãƒ–ロックI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹I / OãŒãƒŽãƒ³ãƒ–ロッキングã§ã‚ã‚‹å ´åˆã€wolfsl_connect_cert()ã¯ã€wolfssl_connect_cert_cert()ã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’続ã‘ã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚通話プロセスã¯ã€åŸºç¤Žã¨ãªã‚‹I / OãŒæº–å‚™ãŒã§ãã¦ã€wolfsslãŒã‚ªãƒ•ã«ãªã£ã¦ã„ã‚‹ã¨ã“ã‚を拾ã†ã¨ãã«ã€wolfssl_connect_cert()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_connect_cert()ã¯ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ãŒå—ä¿¡ã•ã‚ŒãŸã‚‰ã®ã¿è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã€ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’å–å¾—ã™ã‚‹ã®ã«å分ãªé•·ã•ã ã‘サーãƒãƒ¼ã‚’æŒã¤SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€åŸºç¤Žã¨ãªã‚‹é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ wolfssl_connect_cert()ã¯ã€ãƒ–ロックã¨éžãƒ–ロックI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹I / OãŒãƒŽãƒ³ãƒ–ロッキングã§ã‚ã‚‹å ´åˆã€wolfsl_connect_cert()ã¯ã€wolfssl_connect_cert_cert()ã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’続ã‘ã¾ã™ã€‚ã“ã®å ´åˆã€wolfSSL_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚通話プロセスã¯ã€åŸºç¤Žã¨ãªã‚‹I / OãŒæº–å‚™ãŒã§ãã¦ã€wolfsslãŒã‚ªãƒ•ã«ãªã£ã¦ã„ã‚‹ã¨ã“ã‚を拾ã†ã¨ãã«ã€wolfssl_connect_cert()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_connect_cert()ã¯ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ãŒå—ä¿¡ã•ã‚ŒãŸã‚‰ã®ã¿è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE SSLセッションパラメータãŒNULLã®å ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -4356,11 +5352,12 @@ int wolfSSL_connect_cert(WOLFSSL* ssl); /*! - \ingroup openSSL + \ingroup openSSL \brief WOLFSSL_D2I_PKCS12_BIO(D2I_PKCS12_BIO)ã¯ã€WOLFSSL_BIOã‹ã‚‰æ§‹é€ WC_PKCS12ã¸ã®PKCS12情報ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ã“ã®æƒ…å ±ã¯ã€ã‚ªãƒ—ションã®MAC情報をä¿æŒã™ã‚‹ãŸã‚ã®æ§‹é€ ã¨ã¨ã‚‚ã«ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã«é–¢ã™ã‚‹æƒ…å ±ã®ãƒªã‚¹ãƒˆã¨ã—ã¦æ§‹é€ å†…ã«åˆ†å‰²ã•ã‚Œã¦ã„ã¾ã™ã€‚構造体WC_PKCS12ã§æƒ…å ±ãŒãƒãƒ£ãƒ³ã‚¯ï¼ˆãŸã ã—復å·åŒ–ã•ã‚Œã¦ã„ãªã„)ã«åˆ†å‰²ã•ã‚ŒãŸå¾Œã€ãã‚Œã¯ãã®å¾Œã€å‘¼ã³å‡ºã—ã«ã‚ˆã£ã¦è§£æžãŠã‚ˆã³å¾©å·åŒ–ã•ã‚Œå¾—る。 \return WC_PKCS12 WC_PKCS12構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \return Failure 関数ã«å¤±æ•—ã—ãŸå ´åˆã¯NULLã‚’è¿”ã—ã¾ã™ã€‚ \param bio PKCS12ãƒãƒƒãƒ•ã‚¡ã‚’読ã¿å–ã‚‹ãŸã‚ã®WOLFSSL_BIO構造。 + _Example_ \code WC_PKCS12* pkcs; @@ -4381,11 +5378,12 @@ WC_PKCS12** pkcs12); /*! - \ingroup openSSL + \ingroup openSSL \brief WOLFSSL_I2D_PKCS12_BIO(I2D_PKCS12_BIO)ã¯ã€æ§‹é€ WC_PKCS12ã‹ã‚‰WOLFSSL_BIOã¸ã®è¨¼æ˜Žæ›¸æƒ…å ±ã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ \return 1 æˆåŠŸã®ãŸã‚ã«ã€‚ \return Failure 0。 \param bio PKCS12ãƒãƒƒãƒ•ã‚¡ã‚’書ã込むãŸã‚ã®WOLFSSL_BIO構造。 + _Example_ \code WC_PKCS12 pkcs12; @@ -4413,7 +5411,7 @@ WC_PKCS12* pkcs12); /*! - \ingroup openSSL + \ingroup openSSL \brief pkcs12ã¯ã€configureコマンドã¸ã®-enable-openSSLAXTRAを追加ã™ã‚‹ã“ã¨ã§æœ‰åŠ¹ã«ã§ãã¾ã™ã€‚ãã‚Œã¯å¾©å·åŒ–ã®ãŸã‚ã«ãƒˆãƒªãƒ—ルDESã¨RC4を使ã†ã“ã¨ãŒã§ãã‚‹ã®ã§ã€OpenSSlextra(--enable-des3 -enable-arc4)を有効ã«ã™ã‚‹ã¨ãã«ã‚‚ã“れらã®æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ wolfsslã¯ç¾åœ¨RC2をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ã®ã§ã€RC2ã§ã®å¾©å·åŒ–ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。ã“ã‚Œã¯ã€.p12ファイルを作æˆã™ã‚‹ãŸã‚ã«OpenSSLコマンドラインã§ä½¿ç”¨ã•ã‚Œã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æš—å·åŒ–æ–¹å¼ã§ã¯æ³¨ç›®ã™ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 WOLFSSL_PKCS12_PARSE(PKCS12_PARSE)。ã“ã®é–¢æ•°ãŒæœ€åˆã«è¡Œã£ã¦ã„ã‚‹ã®ã¯ã€å­˜åœ¨ã™ã‚‹å ´åˆã¯MacãŒæ­£ã—ã„ãƒã‚§ãƒƒã‚¯ã§ã™ã€‚ MACãŒå¤±æ•—ã—ãŸå ´åˆã€é–¢æ•°ã¯è¿”ã•ã‚Œã€ä¿å­˜ã•ã‚Œã¦ã„るコンテンツ情報ã®ã„ãšã‚Œã‹ã‚’復å·åŒ–ã—よã†ã¨ã—ã¾ã›ã‚“。ã“ã®é–¢æ•°ã¯ã€ãƒãƒƒã‚°ã‚¿ã‚¤ãƒ—を探ã—ã¦ã„ã‚‹å„コンテンツ情報を介ã—ã¦è§£æžã—ã¾ã™ã€‚ãƒãƒƒã‚°ã‚¿ã‚¤ãƒ—ãŒã‚ã‹ã£ã¦ã„ã‚‹å ´åˆã¯ã€å¿…è¦ã«å¿œã˜ã¦å¾©å·åŒ–ã•ã‚Œã€æ§‹ç¯‰ã•ã‚Œã¦ã„る証明書ã®ãƒªã‚¹ãƒˆã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹ã‹ã€è¦‹ã¤ã‹ã£ãŸã‚­ãƒ¼ã¨ã—ã¦ä¿å­˜ã•ã‚Œã¾ã™ã€‚ã™ã¹ã¦ã®ãƒãƒƒã‚°ã‚’介ã—ã¦è§£æžã—ãŸå¾Œã€è¦‹ã¤ã‹ã£ãŸã‚­ãƒ¼ã¯ã€ä¸€è‡´ã™ã‚‹ãƒšã‚¢ãŒè¦‹ã¤ã‹ã‚‹ã¾ã§è¨¼æ˜Žæ›¸ãƒªã‚¹ãƒˆã¨æ¯”較ã•ã‚Œã¾ã™ã€‚ã“ã®ä¸€è‡´ã™ã‚‹ãƒšã‚¢ã¯ã‚­ãƒ¼ã¨è¨¼æ˜Žæ›¸ã¨ã—ã¦è¿”ã•ã‚Œã€ã‚ªãƒ—ションã§è¦‹ã¤ã‹ã£ãŸè¨¼æ˜Žæ›¸ãƒªã‚¹ãƒˆã¯stack_of証明書ã¨ã—ã¦è¿”ã•ã‚Œã¾ã™ã€‚瞬間ã€CRLã€ç§˜å¯†ã¾ãŸã¯å®‰å…¨ãªãƒãƒƒã‚°ãŒã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã€è§£æžã•ã‚Œã¾ã›ã‚“。デãƒãƒƒã‚°ãƒ—リントアウトを見るã“ã¨ã§ã€ã“れらã¾ãŸã¯ä»–ã®ã€Œä¸æ˜Žã€ãƒãƒƒã‚°ãŒã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¦ã„ã‚‹ã‹ã©ã†ã‹ãŒã‚ã‹ã‚Šã¾ã™ã€‚フレンドリーåãªã©ã®è¿½åŠ ã®å±žæ€§ã¯ã€PKCS12ファイルを解æžã™ã‚‹ã¨ãã«ã‚¹ã‚­ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS PKCS12ã®è§£æžã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ @@ -4421,6 +5419,7 @@ \param paswd PKCS12を復å·åŒ–ã™ã‚‹ãŸã‚ã®ãƒ‘スワード。 \param pkey PKCS12ã‹ã‚‰ãƒ‡ã‚³ãƒ¼ãƒ‰ã•ã‚ŒãŸç§˜å¯†éµã‚’ä¿æŒã™ã‚‹ãŸã‚ã®æ§‹é€ ã€‚ \param cert PKCS12ã‹ã‚‰å¾©å·ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’ä¿æŒã™ã‚‹æ§‹é€  + _Example_ \code WC_PKCS12* pkcs; @@ -4441,15 +5440,16 @@ WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert, WOLF_STACK_OF(WOLFSSL_X509)** ca); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief サーãƒãƒ¼DIFFIE-HELLMANエフェメラルパラメータ設定。ã“ã®é–¢æ•°ã¯ã€ã‚µãƒ¼ãƒãƒ¼ãŒDHEを使用ã™ã‚‹æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã‚’ãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã—ã¦ã„ã‚‹å ´åˆã«ä½¿ç”¨ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—パラメータを設定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_ERROR メモリエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SIDE_ERROR ã“ã®é–¢æ•°ãŒSSLサーãƒã§ã¯ãªãSSLクライアントã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param p Diffie-Hellman素数パラメータ。 \param pSz pã®ã‚µã‚¤ã‚ºã€‚ \param g Diffie-Hellman "Generator"パラメータ。 + _Example_ \code WOLFSSL* ssl; @@ -4464,20 +5464,21 @@ const unsigned char* g, int gSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief 関数ã¯wolfssl_settmph_buffer_wrapperを呼ã³å‡ºã—ã¾ã™ã€‚ã“ã‚Œã¯Diffie-Hellmanパラメータã®ãƒ©ãƒƒãƒ‘ーã§ã™ã€‚ \return SSL_SUCCESS 実行ã«æˆåŠŸã—ãŸå ´åˆã€‚ \return SSL_BAD_FILETYPE ファイルã®ç¨®é¡žãŒpemã§ã¯ãªãã€asn.1ã§ã¯ãªã„å ´åˆWC_DHParamSLOADãŒæ­£å¸¸ã«æˆ»ã£ã¦ã„ãªã„å ´åˆã¯ã€ã‚‚è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_NO_PEM_HEADER PEMヘッダーãŒãªã„å ´åˆã¯PemToderã‹ã‚‰è¿”ã—ã¾ã™ã€‚ - \return SSL_BAD_FILE PemToderã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE PemToderã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FATAL_ERROR コピーエラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯PemToderã‹ã‚‰è¿”ã•ã‚Œã¾ã—ãŸã€‚ \return MEMORY_E - メモリ割り当ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆ \return BAD_FUNC_ARG wolfssl構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ãã†ã§ãªã„å ´åˆã¯ã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return DH_KEY_SIZE_E wolfssl_settmph()ã¾ãŸã¯wolfssl_ctx_settmph()ã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SIDE_ERROR wolfssl_settmphã®ã‚µãƒ¼ãƒãƒ¼å´ã§ã¯ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return DH_KEY_SIZE_E wolfssl_settmph()ã¾ãŸã¯WOLFSSL_CTX_settmph()ã®éµã‚µã‚¤ã‚ºã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SIDE_ERROR wolfssl_settmphã®ã‚µãƒ¼ãƒãƒ¼å´ã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buf wolfssl_settmph_file_wrapperã‹ã‚‰æ¸¡ã•ã‚ŒãŸå‰²ã‚Šå½“ã¦ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ \param sz ファイルã®ã‚µã‚¤ã‚ºï¼ˆwolfssl_settmph_file_wrapper内ã®fname)をä¿æŒã™ã‚‹ãƒ­ãƒ³ã‚°int。 + _Example_ \code Static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl, @@ -4499,17 +5500,18 @@ int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_settmph_file_wrapperを呼ã³å‡ºã—ã¦ã‚µãƒ¼ãƒdiffie-hellmanパラメータを設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS ã“ã®æ©Ÿèƒ½ã®æ­£å¸¸ãªå®Œäº†ã¨ãã®ã‚µãƒ–ルーãƒãƒ³ã®å®Œäº†ã«æˆ»ã‚Šã¾ã—ãŸã€‚ \return MEMORY_E ã“ã®é–¢æ•°ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ã«ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SIDE_ERROR WolfSSL構造体ã«ã‚るオプション構造ã®ã‚µã‚¤ãƒ‰ãƒ¡ãƒ³ãƒãƒ¼ãŒã‚µãƒ¼ãƒãƒ¼å´ã§ã¯ãªã„å ´åˆã€‚ \return SSL_BAD_FILETYPE 証明書ãŒä¸€é€£ã®ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ãŸå ´åˆã¯è¿”ã—ã¾ã™ã€‚ - \return DH_KEY_SIZE_E DHパラメーターã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒWolfSSL構造体ã®MinkKeyszメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return DH_KEY_SIZE_E DHパラメータã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒwolfssl構造体ã®MAXDHKEYSZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return DH_KEY_SIZE_E DHパラメーターã®éµã‚µã‚¤ã‚ºãŒWolfSSL構造体ã®MinkKeyszメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return DH_KEY_SIZE_E DHパラメータã®éµã‚µã‚¤ã‚ºãŒwolfssl構造体ã®MAXDHKEYSZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl構造ãªã©ã€å¼•æ•°å€¤ãŒnullã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param fname 証明書をä¿æŒã—ã¦ã„る定数ã®æ–‡å­—ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -4529,19 +5531,21 @@ int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* f, int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief サーãƒãƒ¼CTX Diffie-Hellmanã®ãƒ‘ラメータを設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ã¨ã™ã¹ã¦ã®ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§æˆ»ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG CTXã€Pã€ã¾ãŸã¯GパラメーターãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return DH_KEY_SIZE_E DHパラメータã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒwolfssl_ctx構造体ã®MindHKEYSZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return DH_KEY_SIZE_E DHパラメータã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒwolfssl_ctx構造体ã®MaxDhkeySZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E ã“ã®é–¢æ•°ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ã«ãƒ¡ãƒ¢ãƒªã®å‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return DH_KEY_SIZE_E DHパラメータã®éµã‚µã‚¤ã‚ºãŒWOLFSSL_CTX構造体ã®MindHKEYSZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return DH_KEY_SIZE_E DHパラメータã®éµã‚µã‚¤ã‚ºãŒWOLFSSL_CTX構造体ã®MaxDhkeySZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E ã“ã®é–¢æ•°ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ã«ãƒ¡ãƒ¢ãƒªã®å‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param p ServerDH_P構造体ã®ãƒãƒƒãƒ•ã‚¡ãƒ¡ãƒ³ãƒãƒ¼ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸå®šæ•°ã®ç¬¦å·ãªã—文字ãƒã‚¤ãƒ³ã‚¿ã€‚ \param pSz pã®ã‚µã‚¤ã‚ºã‚’表ã™intåž‹ã¯ã€max_dh_sizeã«åˆæœŸåŒ–ã•ã‚Œã¾ã™ã€‚ \param g ServerDh_g構造体ã®ãƒãƒƒãƒ•ã‚¡ãƒ¡ãƒ³ãƒãƒ¼ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸå®šæ•°ã®ç¬¦å·ãªã—文字ãƒã‚¤ãƒ³ã‚¿ã€‚ + + _Example_ \code - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol ); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol ); byte* p; byte* g; word32 pSz = (word32)sizeof(p)/sizeof(byte); @@ -4560,15 +5564,16 @@ int pSz, const unsigned char* g, int gSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief wolfssl_settmph_buffer_wrapperを呼ã³å‡ºã™ãƒ©ãƒƒãƒ‘ー関数 \return 0 実行ãŒæˆåŠŸã™ã‚‹ãŸã‚ã«è¿”ã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG CTXパラメータã¾ãŸã¯BUFパラメータãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E メモリ割り当ã¦ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆ - \return SSL_BAD_FILETYPE フォーマットãŒæ­£ã—ããªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return SSL_BAD_FILETYPE フォーマットãŒæ­£ã—ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buf ãƒãƒƒãƒ•ã‚¡ã¨ã—ã¦å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã€wolfssl_settmpdh_buffer_wrapperã«æ¸¡ã•ã‚ŒãŸå®šæ•°ã®ç¬¦å·ãªã—文字型ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param sz wolfssl_settmph_file_wrapper()ã®FNAMEパラメータã‹ã‚‰æ´¾ç”Ÿã—ãŸé•·ã„整数型。 + \param sz wolfssl_settmph_file_wrapper()ã®FNAMEパラメータã‹ã‚‰æ´¾ç”Ÿã—ãŸé•·ã„整数型。 + _Example_ \code static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl, @@ -4594,20 +5599,21 @@ long sz, int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_settmph_file_wrapperを呼ã³å‡ºã—ã¦ã‚µãƒ¼ãƒãƒ¼Diffie-Hellmanパラメータを設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS wolfssl_settmph_file_wrapperã¾ãŸã¯ãã®ã‚µãƒ–ルーãƒãƒ³ã®ã„ãšã‚Œã‹ãŒæ­£å¸¸ã«æˆ»ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E 動的メモリã®å‰²ã‚Šå½“ã¦ãŒã‚µãƒ–ルーãƒãƒ³ã§å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG CTXã¾ãŸã¯FNAMEパラメータãŒNULLã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ãŒNULL引数ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_BAD_FILE 証明書ファイルãŒé–‹ãã“ã¨ãŒã§ããªã„å ´åˆã€ã¾ãŸã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€é€£ã®ãƒã‚§ãƒƒã‚¯ãŒwolfssl_settmpdh_file_wrapperã‹ã‚‰å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILETYPE フォーマットãŒwolfssl_settmph_buffer_wrapper()ã‹ã‚‰PEMã¾ãŸã¯ASN.1ã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return DH_KEY_SIZE_E DHパラメータã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒwolfssl_ctx構造体ã®MindHKEYSZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return DH_KEY_SIZE_E DHパラメータã®ã‚­ãƒ¼ã‚µã‚¤ã‚ºãŒwolfssl_ctx構造体ã®MaxDhkeySZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SIDE_ERROR wolfssl_settmph()ã§è¿”ã•ã‚ŒãŸã‚µã‚¤ãƒ‰ãŒã‚µãƒ¼ãƒãƒ¼çµ‚了ã§ã¯ãªã„å ´åˆã€‚ + \return SSL_BAD_FILETYPE フォーマットãŒwolfssl_settmph_buffer_wrapper()ã‹ã‚‰PEMã¾ãŸã¯ASN.1ã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return DH_KEY_SIZE_E DHパラメータã®éµã‚µã‚¤ã‚ºãŒWOLFSSL_CTX構造体ã®MindHKEYSZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šå°ã•ã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return DH_KEY_SIZE_E DHパラメータã®éµã‚µã‚¤ã‚ºãŒWOLFSSL_CTX構造体ã®MaxDhkeySZメンãƒãƒ¼ã®å€¤ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SIDE_ERROR wolfssl_settmph()ã§è¿”ã•ã‚ŒãŸã‚µã‚¤ãƒ‰ãŒã‚µãƒ¼ãƒãƒ¼çµ‚了ã§ã¯ãªã„å ´åˆã€‚ \return SSL_NO_PEM_HEADER PEMヘッダーãŒãªã„å ´åˆã¯PemToderã‹ã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FATAL_ERROR メモリコピーã®å¤±æ•—ãŒã‚ã‚‹å ´åˆã¯PemToderã‹ã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param fname 証明書ファイルã¸ã®å®šæ•°æ–‡å­—ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code #define dhParam “certs/dh2048.pem†@@ -4632,11 +5638,12 @@ int format); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造体ã®minkkeyszメンãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€Diffie Hellmanキーサイズã®æœ€å°ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造体ã®minkkeyszメンãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€Diffie Hellmanéµã‚µã‚¤ã‚ºã®æœ€å°ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Œäº†ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ã‚­ãƒ¼z_BITSãŒ16,000を超ãˆã‚‹ã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ã‚­ãƒ¼z_BITSãŒ16,000を超ãˆã‚‹ã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code public static int CTX_SetMinDhKey_Sz(IntPtr ctx, short minDhKey){ @@ -4652,11 +5659,12 @@ int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16); /*! - \ingroup CertsKeys - \brief WolfSSL構造ã®Diffie-Hellmanキーã®æœ€å°ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief WolfSSL構造ã®Diffie-Hellmanéµã®æœ€å°ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 最å°ã‚µã‚¤ã‚ºã¯æ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG wolfssl構造ã¯NULLã€ã¾ãŸã¯Keysz_BITSãŒ16,000を超ãˆã‚‹ã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -4672,11 +5680,12 @@ int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造体ã®maxdhkeyszメンãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€Diffie Hellmanキーサイズã®æœ€å¤§ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造体ã®maxdhkeyszメンãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€Diffie Hellmanéµã‚µã‚¤ã‚ºã®æœ€å¤§ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Œäº†ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ã‚­ãƒ¼z_BITSãŒ16,000を超ãˆã‚‹ã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ã‚­ãƒ¼z_BITSãŒ16,000を超ãˆã‚‹ã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code public static int CTX_SetMaxDhKey_Sz(IntPtr ctx, short maxDhKey){ @@ -4692,11 +5701,12 @@ int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits); /*! - \ingroup CertsKeys - \brief WolfSSL構造ã®Diffie-Hellmanキーã®æœ€å¤§ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief WolfSSL構造ã®Diffie-Hellmanéµã®æœ€å¤§ã‚µã‚¤ã‚ºï¼ˆãƒ“ットå˜ä½ï¼‰ã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 最大サイズã¯æ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG WOLFSSL構造ã¯NULLã¾ãŸã¯KEYSZパラメータã¯è¨±å®¹ã‚µã‚¤ã‚ºã‚ˆã‚Šå¤§ãã‹ã£ãŸã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -4712,10 +5722,11 @@ int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits); /*! - \ingroup CertsKeys - \brief オプション構造ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã‚ã‚‹DHKEYSZ(ビット内)ã®å€¤ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®å€¤ã¯ã€Diffie-Hellmanキーサイズをãƒã‚¤ãƒˆå˜ä½ã§è¡¨ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief オプション構造ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã‚ã‚‹DHKEYSZ(ビット内)ã®å€¤ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®å€¤ã¯ã€Diffie-Hellmanéµã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§è¡¨ã—ã¾ã™ã€‚ \return dhKeySz サイズを表ã™æ•´æ•°å€¤ã§ã‚ã‚‹ssl-> options.dhkeyszã§ä¿æŒã•ã‚Œã¦ã„る値を返ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl構造体ãŒNULLã®å ´åˆã«è¿”ã—ã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -4739,11 +5750,12 @@ int wolfSSL_GetDhKey_Sz(WOLFSSL*); /*! - \ingroup CertsKeys - \brief wolfssl_ctx構造体ã¨wolfssl_cert_manager構造ã®ä¸¡æ–¹ã§æœ€å°RSAキーサイズを設定ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief WOLFSSL_CTX構造体ã¨wolfssl_cert_manager構造ã®ä¸¡æ–¹ã§æœ€å°RSAéµã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 機能ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚ - \return BAD_FUNC_ARG CTX構造ãŒNULLã®å ´åˆã€ã¾ãŸã¯KEYSZãŒã‚¼ãƒ­ã‚ˆã‚Šå°ã•ã„ã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG CTX構造ãŒNULLã®å ´åˆã€ã¾ãŸã¯KEYSZãŒã‚¼ãƒ­ã‚ˆã‚Šå°ã•ã„ã‹ã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = SSL_CTX_new(method); @@ -4760,11 +5772,12 @@ int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz); /*! - \ingroup CertsKeys - \brief WolfSSL構造ã«ã‚ã‚‹RSAã®ãŸã‚ã®ãƒ“ットã§æœ€å°è¨±å®¹ã‚­ãƒ¼ã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief WolfSSL構造ã«ã‚ã‚‹RSAã®ãŸã‚ã®ãƒ“ットã§æœ€å°è¨±å®¹éµã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 最å°å€¤ãŒæ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ - \return BAD_FUNC_ARG SSL構造ãŒNULLã®å ´åˆã€ã¾ãŸã¯KSYSZãŒã‚¼ãƒ­ã‚ˆã‚Šå°ã•ã„å ´åˆã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG SSL構造ãŒNULLã®å ´åˆã€ã¾ãŸã¯KSYSZãŒã‚¼ãƒ­ã‚ˆã‚Šå°ã•ã„å ´åˆã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -4781,11 +5794,12 @@ int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz); /*! - \ingroup CertsKeys - \brief wolf_ctx構造体ã¨wolfssl_cert_manager構造体ã®ECCキーã®æœ€å°ã‚µã‚¤ã‚ºã‚’ビットå˜ä½ã§è¨­å®šã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief wolf_ctx構造体ã¨wolfssl_cert_manager構造体ã®ECCéµã®æœ€å°ã‚µã‚¤ã‚ºã‚’ビットå˜ä½ã§è¨­å®šã—ã¾ã™ã€‚ \return SSL_SUCCESS 実行ãŒæˆåŠŸã—ãŸãŸã‚ã«è¿”ã•ã‚Œã€MineCkeyszメンãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ã‚­ãƒ¼ãŒè² ã®å ´åˆã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯éµãŒè² ã®å ´åˆã€ã¾ãŸã¯8ã«ã‚ˆã£ã¦å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -4800,11 +5814,12 @@ int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ssl, short keySz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief オプション構造ã®MineCckeyszメンãƒãƒ¼ã®å€¤ã‚’設定ã—ã¾ã™ã€‚オプション構造体ã¯ã€WolfSSL構造ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã‚ã‚Šã€SSLパラメータを介ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚ªãƒ—ション構造ã®MineCckeyszメンãƒãƒ¼ã‚’正常ã«è¨­å®šã—ãŸå ´åˆã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ã‚­ãƒ¼ã‚µã‚¤ã‚ºï¼ˆkeysz)ãŒ0(ゼロ)未満ã®å ´åˆã€ã¾ãŸã¯8ã§å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯éµã‚µã‚¤ã‚ºï¼ˆkeysz)ãŒ0(ゼロ)未満ã®å ´åˆã€ã¾ãŸã¯8ã§å‰²ã‚Šåˆ‡ã‚Œãªã„å ´åˆã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); // New session @@ -4821,13 +5836,14 @@ int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€eap_tlsã¨eap-ttlsã«ã‚ˆã£ã¦ã€ãƒžã‚¹ã‚¿ãƒ¼ã‚·ãƒ¼ã‚¯ãƒ¬ãƒƒãƒˆã‹ã‚‰ã‚­ãƒ¼ã‚¤ãƒ³ã‚°ãƒžãƒ†ãƒªã‚¢ãƒ«ã‚’導出ã—ã¾ã™ã€‚ - \return BUFFER_E ãƒãƒƒãƒ•ã‚¡ã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºãŒè¨±å®¹æœ€å¤§ã‚µã‚¤ã‚ºã‚’超ãˆã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E メモリ割り当ã¦ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BUFFER_E ãƒãƒƒãƒ•ã‚¡ã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºãŒè¨±å®¹æœ€å¤§ã‚µã‚¤ã‚ºã‚’超ãˆã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリ割り当ã¦ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param msk p_hash関数ã®çµæžœã‚’ä¿æŒã™ã‚‹voidãƒã‚¤ãƒ³ã‚¿å¤‰æ•°ã€‚ \param len MSK変数ã®é•·ã•ã‚’表ã™ç¬¦å·ãªã—整数。 + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx);; @@ -4845,14 +5861,15 @@ const char* label); /*! - \ingroup IO - \brief Writev Semanticsをシミュレートã—ã¾ã™ãŒã€SSL_Write()ã®å‹•ä½œã®ãŸã‚ã«å®Ÿéš›ã«ã¯ãƒ–ロックã—ãªã„ãŸã‚ã€ãƒ•ãƒ­ãƒ³ãƒˆè¿½åŠ ãŒå°ã•ããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚Writevを使ã„ã‚„ã™ã„ソフトウェアã«ç§»æ¤ã™ã‚‹ã€‚ + \ingroup IO + \brief Writev Semanticsをシミュレートã—ã¾ã™ãŒã€SSL_Write()ã®å‹•ä½œã®ãŸã‚ã«å®Ÿéš›ã«ã¯ãƒ–ロックã—ãªã„ãŸã‚ã€ãƒ•ãƒ­ãƒ³ãƒˆè¿½åŠ ãŒå°ã•ããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚Writevを使ã„ã‚„ã™ã„ソフトウェアã«ç§»æ¤ã™ã‚‹ã€‚ \return >0 æˆåŠŸæ™‚ã«æ›¸ã‹ã‚ŒãŸãƒã‚¤ãƒˆæ•°ã€‚ - \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \return 0 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã«ã¤ã„ã¦wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ \return MEMORY_ERROR メモリエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã¯ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WOLFSSL_WRITE()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を使用ã—ã¦ãã ã•ã„。 - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸã¨ãã€ã¾ãŸã¯éžãƒ–ロッキングソケットを使用ã™ã‚‹ã¨ãã«ã¯ã€SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEエラーãŒå—ä¿¡ã•ã‚Œã€å†åº¦WOLFSSL_WRITE()を呼ã³å‡ºã™å¿…è¦ãŒã‚ã‚‹å ´åˆã¯ã€éšœå®³ãŒç™ºç”Ÿã—ã¾ã™ã€‚特定ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を使用ã—ã¦ãã ã•ã„。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param iov 書ãè¾¼ã¿ã¸ã®I / Oベクトルã®é…列 + _Example_ \code WOLFSSL* ssl = 0; @@ -4876,15 +5893,16 @@ int iovcnt); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯CAç½²å者リストをアンロードã—ã€ç½²å者全体ã®ãƒ†ãƒ¼ãƒ–ルを解放ã—ã¾ã™ã€‚ \return SSL_SUCCESS 機能ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ä»–ã®æ–¹æ³•ã§ã¯æœªè§£æ±ºã®å¼•æ•°å€¤ãŒã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_MUTEX_E ミューテックスエラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚lockmutex()ã¯0ã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯ä»–ã®æ–¹æ³•ã§ã¯æœªè§£æ±ºã®å¼•æ•°å€¤ãŒã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_MUTEX_E ミューテックスエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚lockmutex()ã¯0ã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚ + _Example_ \code WOLFSSL_METHOD method = wolfTLSv1_2_client_method(); - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new(method); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new(method); … if(!wolfSSL_CTX_UnloadCAs(ctx)){ // The function did not unload CAs @@ -4898,12 +5916,13 @@ int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX*); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€ä»¥å‰ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸã™ã¹ã¦ã®ä¿¡é ¼ã§ãるピア証明書をアンロードã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚マクロwolfssl_trust_peer_certを定義ã™ã‚‹ã“ã¨ã§æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return BAD_FUNC_ARG CTXãŒNULLã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG CTXãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -4921,17 +5940,18 @@ int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX*); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€TLS / SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’実行ã™ã‚‹ã¨ãã«ãƒ”アを検証ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’ロードã—ã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«é€ä¿¡ã•ã‚ŒãŸãƒ”ア証明書ã¯ã€ä½¿ç”¨å¯èƒ½ãªã¨ãã«ã‚¹ã‚­ãƒƒãƒ‰ã‚’使用ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦æ¯”較ã•ã‚Œã¾ã™ã€‚ã“れら2ã¤ã®ã“ã¨ãŒä¸€è‡´ã—ãªã„å ´åˆã¯ã€ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸCASãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ファイルã®ä»£ã‚ã‚Šã«ãƒãƒƒãƒ•ã‚¡ãƒ¼ã®å ´åˆã¯ã€wolfssl_ctx_trust_peer_certã¨åŒã˜æ©Ÿèƒ½ã§ã™ã€‚特徴ã¯ãƒžã‚¯ãƒ­wolfssl_trust_peer_certを定義ã™ã‚‹ã“ã¨ã«ã‚ˆã£ã¦æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ä¸¡æ–¹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ç¨®é¡žãŒç„¡åŠ¹ãªå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_FAILURE CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯ä¸¡æ–¹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ç¨®é¡žãŒç„¡åŠ¹ãªå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buffer 証明書をå«ã‚€ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param sz ãƒãƒƒãƒ•ã‚¡å…¥åŠ›ã®é•·ã•ã€‚ + _Example_ \code int ret = 0; @@ -4959,17 +5979,19 @@ long sz, int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯CA証明書ãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚å½¢å¼ãƒãƒƒãƒ•ã‚¡ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ã€‚SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。フォーマットãŒPEM内ã«ã‚ã‚‹é™ã‚Šã€ãƒãƒƒãƒ•ã‚¡ã‚ãŸã‚Šè¤‡æ•°ã®CA証明書をロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ãŒå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in CA証明書ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param sz 入力CA証明書ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€IN。 + + _Example_ \code int ret = 0; @@ -4997,19 +6019,20 @@ /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯CA証明書ãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚å½¢å¼ãƒãƒƒãƒ•ã‚¡ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ã€‚SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。フォーマットãŒPEM内ã«ã‚ã‚‹é™ã‚Šã€ãƒãƒƒãƒ•ã‚¡ã‚ãŸã‚Šè¤‡æ•°ã®CA証明書をロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚_EXãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯PR 2413ã«è¿½åŠ ã•ã‚Œã€UserChainã¨Flagsã®è¿½åŠ ã®å¼•æ•°ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ãŒå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in CA証明書ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param sz 入力CA証明書ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€IN。 \param format ãƒãƒƒãƒ•ã‚¡è¨¼æ˜Žæ›¸ã®å½¢å¼ã€SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。 \param userChain フォーマットwolfssl_filetype_asn1を使用ã™ã‚‹å ´åˆã€ã“ã®ã‚»ãƒƒãƒˆã¯ã‚¼ãƒ­ä»¥å¤–ã®ã‚»ãƒƒãƒˆã‚’示ã—ã¦ã„ã¾ã™.Derã®ãƒã‚§ãƒ¼ãƒ³ãŒè¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -5040,17 +6063,18 @@ int format, int userChain, word32 flags); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€CA証明書ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚å½¢å¼ãƒãƒƒãƒ•ã‚¡ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ã€‚SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。フォーマットãŒPEM内ã«ã‚ã‚‹é™ã‚Šã€ãƒãƒƒãƒ•ã‚¡ã‚ãŸã‚Šè¤‡æ•°ã®CA証明書をロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ãŒå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in CA証明書ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param sz 入力CA証明書ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€IN。 + _Example_ \code int ret = 0; @@ -5079,16 +6103,17 @@ long sz, int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚å½¢å¼ãƒãƒƒãƒ•ã‚¡ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ã€‚SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in ロードã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã€‚ \param sz 入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚ + _Example_ \code int ret = 0; @@ -5114,17 +6139,18 @@ int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµãƒãƒƒãƒ•ã‚¡ã‚’SSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚å½¢å¼ãƒãƒƒãƒ•ã‚¡ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ã€‚SSL_FILETYPE_ASN1OR SSL_FILETYPE_PEM。é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return NO_PASSWORD キーファイルãŒæš—å·åŒ–ã•ã‚Œã¦ã„ã‚‹ãŒãƒ‘スワードãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return NO_PASSWORD éµãƒ•ã‚¡ã‚¤ãƒ«ãŒæš—å·åŒ–ã•ã‚Œã¦ã„ã‚‹ãŒãƒ‘スワードãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in ロードã™ã‚‹ç§˜å¯†éµã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã€‚ \param sz 入力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚ + _Example_ \code int ret = 0; @@ -5150,16 +6176,17 @@ int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLコンテキストã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯PEMå½¢å¼ã§ã€ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã§çµ‚ã‚る対象ã®è¨¼æ˜Žæ›¸ã‹ã‚‰å§‹ã‚ã¦ãã ã•ã„。é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ãŒå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in ロードã•ã‚Œã‚‹PEMå½¢å¼ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã€‚ + _Example_ \code int ret = 0; @@ -5184,16 +6211,17 @@ const unsigned char* in, long sz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸ãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLオブジェクトã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚å½¢å¼ãƒãƒƒãƒ•ã‚¡ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ã€‚SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in ロードã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã€‚ \param sz ãƒãƒƒãƒ•ã‚¡ã«ã‚る証明書ã®ã‚µã‚¤ã‚ºã€‚ + _Example_ \code int buffSz; @@ -5218,17 +6246,18 @@ long sz, int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLオブジェクトã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚å½¢å¼ãƒãƒƒãƒ•ã‚¡ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚¿ã‚¤ãƒ—を指定ã—ã¾ã™ã€‚SSL_FILETYPE_ASN1ã¾ãŸã¯SSL_FILETYPE_PEM。é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return NO_PASSWORD キーファイルãŒæš—å·åŒ–ã•ã‚Œã¦ã„ã‚‹ãŒãƒ‘スワードãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return NO_PASSWORD éµãƒ•ã‚¡ã‚¤ãƒ«ãŒæš—å·åŒ–ã•ã‚Œã¦ã„ã‚‹ãŒãƒ‘スワードãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in ロードã™ã‚‹ç§˜å¯†éµã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã€‚ \param sz ãƒãƒƒãƒ•ã‚¡ã«ã‚る秘密éµã®ã‚µã‚¤ã‚ºã€‚ + _Example_ \code int buffSz; @@ -5253,16 +6282,17 @@ long sz, int format); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ã‚’WolfSSLオブジェクトã«ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ä»¥å¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚ˆã†ã«å‹•ä½œã—ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ã‚ã‚Šã«å…¥åŠ›ã¨ã—ã¦ãƒãƒƒãƒ•ã‚¡ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ãŒç•°ãªã‚‹ã ã‘ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯ã‚µã‚¤ã‚ºSZã®å¼•æ•°ã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯PEMå½¢å¼ã§ã€ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã§çµ‚ã‚る対象ã®è¨¼æ˜Žæ›¸ã‹ã‚‰å§‹ã‚ã¦ãã ã•ã„。é©åˆ‡ãªä½¿ç”¨æ³•ã®ä¾‹ã‚’ã”覧ãã ã•ã„。 - \return SSL_SUCCES æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_SUCCES æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BUFFER_E ãƒã‚§ãƒ¼ãƒ³ãƒãƒƒãƒ•ã‚¡ãŒå—ä¿¡ãƒãƒƒãƒ•ã‚¡ã‚ˆã‚Šã‚‚大ãã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLセッションã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param in ロードã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã€‚ + _Example_ \code int buffSz; @@ -5286,10 +6316,11 @@ const unsigned char* in, long sz); /*! - \ingroup CertsKeys - \brief ã“ã®é–¢æ•°ã¯ã€SSLãŒæ‰€æœ‰ã™ã‚‹è¨¼æ˜Žæ›¸ã¾ãŸã¯ã‚­ãƒ¼ã‚’アンロードã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief ã“ã®é–¢æ•°ã¯ã€SSLãŒæ‰€æœ‰ã™ã‚‹è¨¼æ˜Žæ›¸ã¾ãŸã¯éµã‚’アンロードã—ã¾ã™ã€‚ \return SSL_SUCCESS - 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG - wolfsslオブジェクトãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -5304,10 +6335,11 @@ int wolfSSL_UnloadCertsKeys(WOLFSSL*); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®æ©Ÿèƒ½ã¯ã€å¯èƒ½ãªé™ã‚Šãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚°ãƒ«ãƒ¼ãƒ—化をオンã«ã—ã¾ã™ã€‚ \return SSL_SUCCESS æˆåŠŸã«æˆ»ã‚Šã¾ã™ã€‚ \return BAD_FUNC_ARG 入力コンテキストãŒNULLã®å ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -5323,10 +6355,12 @@ int wolfSSL_CTX_set_group_messages(WOLFSSL_CTX*); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®æ©Ÿèƒ½ã¯ã€å¯èƒ½ãªé™ã‚Šãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚°ãƒ«ãƒ¼ãƒ—化をオンã«ã—ã¾ã™ã€‚ \return SSL_SUCCESS æˆåŠŸã«æˆ»ã‚Šã¾ã™ã€‚ \return BAD_FUNC_ARG 入力コンテキストãŒNULLã®å ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL* ssl = 0; @@ -5342,10 +6376,12 @@ int wolfSSL_set_group_messages(WOLFSSL*); /*! - \brief + \brief \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param cbf フォームã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã§ã‚ã‚‹CallBackFozzerタイプ:int(* callbackfuzzer)(wolfssl * sslã€consigned char * bufã€int szã€intåž‹ã€void * fuzzctx); + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -5364,13 +6400,14 @@ void wolfSSL_SetFuzzerCb(WOLFSSL* ssl, CallbackFuzzer cbf, void* fCtx); /*! - \brief + \brief \return 0 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 許容ã§ããªã„値ã§é–¢æ•°ã«æ¸¡ã•ã‚ŒãŸå¼•æ•°ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return COOKIE_SECRET_SZ 秘密サイズãŒ0ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_ERROR æ–°ã—ã„Cookie Secretã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹å•é¡ŒãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã—ãŸã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param secret 秘密ãƒãƒƒãƒ•ã‚¡ã‚’表ã™å®šæ•°ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -5392,9 +6429,9 @@ unsigned int secretSz); /*! - \brief - \return rng æˆåŠŸã™ã‚‹ã¨ã€‚ - \return NULL SSLãŒNULLã®å ´åˆ + \brief + \return rng æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return NULL sslãŒNULLã®å ´åˆ _Example_ \code WOLFSSL* ssl; @@ -5407,14 +6444,15 @@ WC_RNG* wolfSSL_GetRNG(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€è¨±å¯ã•ã‚Œã¦ã„る最å°ã®ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã—ã¾ã™ã€‚接続ãŒï¼ˆwolfsslv23_client_methodã¾ãŸã¯wolfsslv23_server_method)を使用ã—ã¦ã€æŽ¥ç¶šãŒãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã§ãã‚‹å ´åˆã«ã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS エラーãªã—ã§è¿”ã•ã‚ŒãŸé–¢æ•°ã¨æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造ãŒNULLã®å ´åˆã€ã¾ãŸã¯æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造ãŒNULLã®å ´åˆã€ã¾ãŸã¯æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol method ); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); WOLFSSL* ssl = WOLFSSL_new(ctx); int version; // macrop representation … @@ -5427,14 +6465,15 @@ int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version); /*! - \ingroup TLS + \ingroup TLS \brief ã“ã®é–¢æ•°ã¯ã€è¨±å¯ã•ã‚Œã¦ã„る最å°ã®ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã—ã¾ã™ã€‚接続ãŒï¼ˆwolfsslv23_client_methodã¾ãŸã¯wolfsslv23_server_method)を使用ã—ã¦ã€æŽ¥ç¶šãŒãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã§ãã‚‹å ´åˆã«ã®ã¿é©ç”¨ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS ã“ã®é–¢æ•°ã¨ãã®ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG SSLオブジェクトãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚サブルーãƒãƒ³ã§ã¯ã€è‰¯ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒä¸€è‡´ã—ãªã„å ´åˆã€ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã‚¹ãƒ­ãƒ¼ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new(protocol method); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new(protocol method); WOLFSSL* ssl = WOLFSSL_new(ctx); int version; macro representation … @@ -5449,6 +6488,7 @@ /*! \brief ビルドオプションã¨è¨­å®šã«ä¾å­˜ã—ã¾ã™ã€‚WolfSSLを構築ã™ã‚‹ã¨ãã«show_sizesãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã“ã®é–¢æ•°ã¯WolfSSLオブジェクト(スイートã€æš—å·ãªã©ï¼‰å†…ã®å€‹ã€…ã®ã‚ªãƒ–ジェクトã®ã‚µã‚¤ã‚ºã‚‚stdoutã«å°åˆ·ã•ã‚Œã¾ã™ã€‚ \return size ã“ã®é–¢æ•°ã¯ã€WolfSSLオブジェクトã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code int size = 0; @@ -5461,9 +6501,10 @@ /*! \brief アプリケーションãŒãƒˆãƒ©ãƒ³ã‚¹ãƒãƒ¼ãƒˆãƒ¬ã‚¤ãƒ¤é–“ã§ä½•ãƒã‚¤ãƒˆã‚’é€ä¿¡ã—ãŸã„å ´åˆã¯ã€æŒ‡å®šã•ã‚ŒãŸå¹³æ–‡ã®å…¥åŠ›ã‚µã‚¤ã‚ºã‚’指定ã—ã¦ãã ã•ã„。SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸå¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return size æˆåŠŸã™ã‚‹ã¨ã€è¦æ±‚ã•ã‚ŒãŸã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ - \return INPUT_SIZE_E 入力サイズãŒæœ€å¤§TLSフラグメントサイズより大ãã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ï¼ˆWOLFSSL_GETMAXOUTPUTSIZE())。 + \return INPUT_SIZE_E 入力サイズãŒæœ€å¤§TLSフラグメントサイズより大ãã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ï¼ˆWOLFSSL_GETMAXOUTPUTSIZE())。 \return BAD_FUNC_ARG 無効ãªé–¢æ•°å¼•æ•°ã«æˆ»ã‚Šã€ã¾ãŸã¯SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒã¾ã å®Œäº†ã—ã¦ã„ãªã„å ´åˆ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfsslオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5473,9 +6514,10 @@ int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz); /*! - \brief プロトコルè¦æ ¼ã§æŒ‡å®šã•ã‚Œã¦ã„る最大SSL / TLSレコードサイズã®ã„ãšã‚Œã‹ã«å¯¾å¿œã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒwolfssl_getOutputSize()ã¨å‘¼ã°ã‚Œã€input_size_eエラーをå—ä¿¡ã—ãŸã¨ãã«å½¹ç«‹ã¡ã¾ã™ã€‚SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸå¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \brief プロトコルè¦æ ¼ã§æŒ‡å®šã•ã‚Œã¦ã„る最大SSL / TLSレコードサイズã®ã„ãšã‚Œã‹ã«å¯¾å¿œã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒwolfssl_getOutputSize()ã¨å‘¼ã°ã‚Œã€input_size_eエラーをå—ä¿¡ã—ãŸã¨ãã«å½¹ç«‹ã¡ã¾ã™ã€‚SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸå¾Œã«å‘¼ã³å‡ºã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ \return size æˆåŠŸã™ã‚‹ã¨ã€æœ€å¤§å‡ºåŠ›ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ \return BAD_FUNC_ARG 無効ãªé–¢æ•°å¼•æ•°ã®ã¨ãã«è¿”ã•ã‚Œã‚‹ã‹ã€SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒã¾ã å®Œäº†ã—ã¦ã„ãªã„å ´åˆã€‚ + _Example_ \code none @@ -5485,11 +6527,12 @@ int wolfSSL_GetMaxOutputSize(WOLFSSL*); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§æŒ‡å®šã•ã‚ŒãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã€æŒ‡å®šã•ã‚ŒãŸSSLセッション(WolfSSLオブジェクト)ã®SSL / TLSプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€SSLセッション(SSL)ã®ãƒ—ロトコル設定ãŒæœ€åˆã«å®šç¾©ã•ã‚Œã€SSLコンテキスト(WolfSSL_CTX_NEW())メソッドã®ç¨®é¡žã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§æŒ‡å®šã•ã‚ŒãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’使用ã—ã¦ã€æŒ‡å®šã•ã‚ŒãŸSSLセッション(WolfSSLオブジェクト)ã®SSL/TLSプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€SSLセッション(SSL)ã®ãƒ—ロトコル設定ãŒæœ€åˆã«å®šç¾©ã•ã‚Œã€SSLコンテキスト(wolfSSL_CTX_new())メソッドã®ç¨®é¡žã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 入力SSLオブジェクトãŒNULLã¾ãŸã¯èª¤ã£ãŸãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§æŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -5506,8 +6549,9 @@ int wolfSSL_SetVersion(WOLFSSL* ssl, int version); /*! - \brief MAC /æš—å·åŒ–コールãƒãƒƒã‚¯ã€‚コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚MacOutã¯ã€MACã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚Macinã¯Mac入力ãƒãƒƒãƒ•ã‚¡ãƒ¼ã¨Macinszã®ã‚µã‚¤ã‚ºã‚’注æ„ã—ã¦ã„ã¾ã™ã€‚MacContentã¨Macverifyã¯ã€Wolfssl_SettlShmacinner()ã«å¿…è¦ã§ã‚ã‚Šã€ãã®ã¾ã¾é€šéŽã—ã¾ã™ã€‚Encoutã¯ã€æš—å·åŒ–ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚ENCINã¯ENCSZãŒå…¥åŠ›ã®ã‚µã‚¤ã‚ºã§ã‚ã‚‹é–“ã¯æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h mymacencryptcb()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief MAC /æš—å·åŒ–コールãƒãƒƒã‚¯ã€‚コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚MacOutã¯ã€MACã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚Macinã¯Mac入力ãƒãƒƒãƒ•ã‚¡ãƒ¼ã¨Macinszã®ã‚µã‚¤ã‚ºã‚’注æ„ã—ã¦ã„ã¾ã™ã€‚MacContentã¨Macverifyã¯ã€Wolfssl_SettlShmacinner()ã«å¿…è¦ã§ã‚ã‚Šã€ãã®ã¾ã¾é€šéŽã—ã¾ã™ã€‚Encoutã¯ã€æš—å·åŒ–ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚ENCINã¯ENCSZãŒå…¥åŠ›ã®ã‚µã‚¤ã‚ºã§ã‚ã‚‹é–“ã¯æš—å·åŒ–ã™ã‚‹å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h mymacencryptcb()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none è¿”å“ä¸å¯ã€‚ + _Example_ \code none @@ -5520,6 +6564,8 @@ /*! \brief CTXã¸ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return none è¿”å“ä¸å¯ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5530,9 +6576,11 @@ void wolfSSL_SetMacEncryptCtx(WOLFSSL* ssl, void *ctx); /*! - \brief Mac / Encryptコールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€wolfssl_setmacencryptx()ã§ä¿å­˜ã•ã‚Œã¦ã„ã¾ã—ãŸã€‚ + \brief Mac / Encryptコールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€wolfssl_setmacencryptx()ã§ä¿å­˜ã•ã‚Œã¦ã„ã¾ã—ãŸã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5543,8 +6591,9 @@ void* wolfSSL_GetMacEncryptCtx(WOLFSSL* ssl); /*! - \brief コールãƒãƒƒã‚¯ã‚’復å·åŒ–/確èªã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚DECOUTã¯ã€å¾©å·åŒ–ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚DECINã¯æš—å·åŒ–ã•ã‚ŒãŸå…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã¨Decinszã®ã‚µã‚¤ã‚ºã‚’注æ„ã—ã¦ã„ã¾ã™ã€‚コンテンツã¨æ¤œè¨¼ã¯ã€WolfSSL_SettlShmacinner()ã«å¿…è¦ã§ã‚ã‚Šã€ãã®ã¾ã¾é€šéŽã—ã¾ã™ã€‚PADSZã¯ã€ãƒ‘ディングã®åˆè¨ˆå€¤ã§è¨­å®šã™ã‚‹å‡ºåŠ›å¤‰æ•°ã§ã™ã€‚ã¤ã¾ã‚Šã€MACサイズã¨ãƒ‘ディングãƒã‚¤ãƒˆã¨ãƒ‘ッドãƒã‚¤ãƒˆã‚’加ãˆã¦ã„ã¾ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h mydecryptverifycb()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief コールãƒãƒƒã‚¯ã‚’復å·åŒ–/確èªã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚DECOUTã¯ã€å¾©å·åŒ–ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚DECINã¯æš—å·åŒ–ã•ã‚ŒãŸå…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ã¨Decinszã®ã‚µã‚¤ã‚ºã‚’注æ„ã—ã¦ã„ã¾ã™ã€‚コンテンツã¨æ¤œè¨¼ã¯ã€WolfSSL_SettlShmacinner()ã«å¿…è¦ã§ã‚ã‚Šã€ãã®ã¾ã¾é€šéŽã—ã¾ã™ã€‚PADSZã¯ã€ãƒ‘ディングã®åˆè¨ˆå€¤ã§è¨­å®šã™ã‚‹å‡ºåŠ›å¤‰æ•°ã§ã™ã€‚ã¤ã¾ã‚Šã€MACサイズã¨ãƒ‘ディングãƒã‚¤ãƒˆã¨ãƒ‘ッドãƒã‚¤ãƒˆã‚’加ãˆã¦ã„ã¾ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h mydecryptverifycb()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + _Example_ \code none @@ -5558,6 +6607,8 @@ /*! \brief コールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’CTXã«å¾©å·åŒ–/検証ã—ã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5568,9 +6619,10 @@ void wolfSSL_SetDecryptVerifyCtx(WOLFSSL* ssl, void *ctx); /*! - \brief wolfssl_setdecryptverifyctx()ã§ä»¥å‰ã«ä¿å­˜ã•ã‚Œã¦ã„るコールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’復å·åŒ–/検証ã—ã¾ã™ã€‚ + \brief wolfssl_setdecryptverifyctx()ã§ä»¥å‰ã«ä¿å­˜ã•ã‚Œã¦ã„るコールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’復å·åŒ–/検証ã—ã¾ã™ã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code none @@ -5582,9 +6634,10 @@ /*! \brief VERIFYパラメーターã¯ã€ã“ã‚ŒãŒãƒ”ア・メッセージã®æ¤œè¨¼ã®ãŸã‚ã®ã‚‚ã®ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™ã€‚ - \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒç§˜å¯†ã«æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚秘密ã®ã‚µã‚¤ã‚ºã¯ã€Wolfssl_gethmacsize()ã‹ã‚‰å…¥æ‰‹ã§ãã¾ã™ã€‚ + \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒç§˜å¯†ã«æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚秘密ã®ã‚µã‚¤ã‚ºã¯ã€Wolfssl_gethmacsize()ã‹ã‚‰å…¥æ‰‹ã§ãã¾ã™ã€‚ \return NULL エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfsslオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5594,9 +6647,11 @@ const unsigned char* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify); /*! - \brief - \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚­ãƒ¼ã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚キーã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getkeysize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ + \brief + \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚­ãƒ¼ã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚éµã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getkeysize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ \return NULL エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5608,8 +6663,10 @@ /*! \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãƒ—ロセスã‹ã‚‰ã€‚ - \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒIVã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚IVã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getCipherBlockSize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ + \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒIVã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚IVã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getCipherBlockSize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ \return NULL エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5620,9 +6677,11 @@ const unsigned char* wolfSSL_GetClientWriteIV(WOLFSSL*); /*! - \brief - \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚­ãƒ¼ã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚キーã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getkeysize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ + \brief + \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒéµã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚éµã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getkeysize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ \return NULL エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5634,17 +6693,21 @@ /*! \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãƒ—ロセスã‹ã‚‰ã€‚ - \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒIVã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚IVã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getCipherBlockSize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ + \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒIVã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚IVã®ã‚µã‚¤ã‚ºã¯ã€wolfssl_getCipherBlockSize()ã‹ã‚‰å–å¾—ã§ãã¾ã™ã€‚ \return NULL エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \sa wolfSSL_GetCipherBlockSize \sa wolfSSL_GetClientWriteKey */ const unsigned char* wolfSSL_GetServerWriteIV(WOLFSSL*); /*! - \brief - \return size 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚­ãƒ¼ã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§è¿”ã—ã¾ã™ã€‚ + \brief + \return size 正常ã«ã‚³ãƒ¼ãƒ«ãŒéµã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§è¿”ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5655,10 +6718,12 @@ int wolfSSL_GetKeySize(WOLFSSL*); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief WolfSSL構造体ã«ä¿æŒã•ã‚Œã¦ã„ã‚‹Specs構造体ã®IV_SIZEメンãƒãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ \return iv_size ssl-> specs.iv_sizeã§ä¿æŒã•ã‚Œã¦ã„る値を返ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG WolfSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -5678,9 +6743,11 @@ int wolfSSL_GetIVSize(WOLFSSL*); /*! - \brief + \brief \return success æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ãŒWolfSSLオブジェクトã®å´é¢ã«å¿œã˜ã¦wolfssl_server_endã¾ãŸã¯wolfssl_client_endã‚’è¿”ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5694,6 +6761,8 @@ \brief å°‘ãªãã¨ã‚‚TLSãƒãƒ¼ã‚¸ãƒ§ãƒ³1.1以上ã§ã™ã€‚ \return true/false æˆåŠŸã—ãŸå ´åˆã€å‘¼ã³å‡ºã—ãŒTRUEã¾ãŸã¯0ã®å ´åˆã¯0ã‚’è¿”ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5706,6 +6775,8 @@ \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‹ã‚‰ã€‚ \return If コールãŒæˆåŠŸã™ã‚‹ã¨ã€wolfssl_cipher_nullã€wolfssl_desã€wolfssl_triple_desã€wolfssl_aesã€wolfssl_aes_gcmã€wolfssl_aes_ccmã€wolfssl_camellia。 \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5719,6 +6790,8 @@ \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã€‚ \return size 正常ã«ã‚³ãƒ¼ãƒ«ãŒæš—å·ãƒ–ロックサイズã®ã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§æˆ»ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5732,6 +6805,8 @@ \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã€‚æš—å·ã‚¿ã‚¤ãƒ—ã®wolfssl_aead_typeã®å ´åˆã€‚ \return size 正常ã«ã‚³ãƒ¼ãƒ«ãŒEAD MACサイズã®ã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§æˆ»ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5745,6 +6820,8 @@ \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã€‚wolfssl_aead_type以外ã®æš—å·ã‚¿ã‚¤ãƒ—ã®å ´åˆã€‚ \return size 正常ã«ã‚³ãƒ¼ãƒ«ãŒï¼ˆH)MACサイズã®ã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§æˆ»ã—ã¾ã™ã€‚ \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5759,6 +6836,8 @@ \return If コールãŒæˆåŠŸã™ã‚‹ã¨ã€æ¬¡ã®ã„ãšã‚Œã‹ãŒè¿”ã•ã‚Œã¾ã™.MD5ã€SHAã€SHA256ã€SHA384。 \return BAD_FUNC_ARG エラー状態ã«å¯¾ã—ã¦è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ \return SSL_FATAL_ERROR エラー状態ã«ã‚‚è¿”ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5772,6 +6851,8 @@ \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‹ã‚‰ã€‚ \return If 正常ã«ã‚³ãƒ¼ãƒ«ã¯æ¬¡ã®ã„ãšã‚Œã‹ã‚’è¿”ã—ã¾ã™.WolfSSL_BLOCK_TYPEã€WOLFSSL_STREAM_TYPEã€WOLFSSL_AEAD_TYPE。 \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5782,9 +6863,11 @@ int wolfSSL_GetCipherType(WOLFSSL*); /*! - \brief é€å—ä¿¡çµæžœã¯ã€å°‘ãªãã¨ã‚‚wolfssl_gethmacsize()ãƒã‚¤ãƒˆã§ã‚ã‚‹ã¹ãã§ã‚る内部ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚メッセージã®ã‚µã‚¤ã‚ºã¯SZã§æŒ‡å®šã•ã‚Œã€å†…容ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç¨®é¡žã§ã‚ã‚Šã€æ¤œè¨¼ã¯ã“ã‚ŒãŒãƒ”アメッセージã®æ¤œè¨¼ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™ã€‚wolfssl_aead_typeを除ãæš—å·ã‚¿ã‚¤ãƒ—ã«æœ‰åŠ¹ã§ã™ã€‚ - \return 1 æˆåŠŸã™ã‚‹ã¨ã€‚ + \brief é€å—ä¿¡çµæžœã¯ã€å°‘ãªãã¨ã‚‚wolfssl_gethmacsize()ãƒã‚¤ãƒˆã§ã‚ã‚‹ã¹ãã§ã‚る内部ã«æ›¸ãè¾¼ã¾ã‚Œã¾ã™ã€‚メッセージã®ã‚µã‚¤ã‚ºã¯SZã§æŒ‡å®šã•ã‚Œã€å†…容ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç¨®é¡žã§ã‚ã‚Šã€æ¤œè¨¼ã¯ã“ã‚ŒãŒãƒ”アメッセージã®æ¤œè¨¼ã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™ã€‚wolfssl_aead_typeを除ãæš—å·ã‚¿ã‚¤ãƒ—ã«æœ‰åŠ¹ã§ã™ã€‚ + \return 1 æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5796,8 +6879,9 @@ word32 sz, int content, int verify); /*! - \brief コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INSã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒå…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚OUTã¯ã€ç½²åã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚OUTSZã¯ã€å‘¼ã³å‡ºã—時ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å…¥åŠ›/出力変数ã§ã‚ã‚Šã€ç½²åã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºã‚’戻ã™å‰ã«æ ¼ç´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®ECC秘密éµã§ã‚ã‚Šã€Keyszã¯ã‚­ãƒ¼ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myeccsign()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INSã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒå…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚OUTã¯ã€ç½²åã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚OUTSZã¯ã€å‘¼ã³å‡ºã—時ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å…¥åŠ›/出力変数ã§ã‚ã‚Šã€ç½²åã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºã‚’戻ã™å‰ã«æ ¼ç´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®ECC秘密éµã§ã‚ã‚Šã€Keyszã¯éµã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myeccsign()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + _Example_ \code none @@ -5810,7 +6894,8 @@ /*! \brief CTXã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfsslオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5821,9 +6906,11 @@ void wolfSSL_SetEccSignCtx(WOLFSSL* ssl, void *ctx); /*! - \brief 以å‰ã«wolfssl_seteccsignctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ + \brief 以å‰ã«wolfssl_seteccsignctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5836,7 +6923,8 @@ /*! \brief CTXã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code none @@ -5847,9 +6935,10 @@ void wolfSSL_CTX_SetEccSignCtx(WOLFSSL_CTX* ctx, void *userCtx); /*! - \brief 以å‰ã«wolfssl_seteccsignctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ + \brief 以å‰ã«wolfssl_seteccsignctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code none @@ -5860,8 +6949,9 @@ void* wolfSSL_CTX_GetEccSignCtx(WOLFSSL_CTX* ctx); /*! - \brief コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚SIGã¯æ¤œè¨¼ã®ç½²åã§ã‚ã‚Šã€SIGSZã¯ç½²åã®é•·ã•ã‚’表ã—ã¾ã™ã€‚ãƒãƒƒã‚·ãƒ¥ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã§ã‚ã‚Šã€HASHSZã¯ãƒãƒƒã‚·ãƒ¥ã®é•·ã•ã‚’æ„味ã—ã¾ã™ã€‚çµæžœã¯ã€æ¤œè¨¼ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å‡ºåŠ›å¤‰æ•°ã€æˆåŠŸã®ãŸã‚ã«1ã€å¤±æ•—ã®ãŸã‚ã«0を記憶ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®ECC秘密éµã§ã‚ã‚Šã€Keyszã¯ã‚­ãƒ¼ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myeccverify()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚SIGã¯æ¤œè¨¼ã®ç½²åã§ã‚ã‚Šã€SIGSZã¯ç½²åã®é•·ã•ã‚’表ã—ã¾ã™ã€‚ãƒãƒƒã‚·ãƒ¥ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã‚’å«ã‚€å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã§ã‚ã‚Šã€HASHSZã¯ãƒãƒƒã‚·ãƒ¥ã®é•·ã•ã‚’æ„味ã—ã¾ã™ã€‚çµæžœã¯ã€æ¤œè¨¼ã®çµæžœã‚’æ ¼ç´ã™ã‚‹å‡ºåŠ›å¤‰æ•°ã€æˆåŠŸã®ãŸã‚ã«1ã€å¤±æ•—ã®ãŸã‚ã«0を記憶ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®ECC秘密éµã§ã‚ã‚Šã€Keyszã¯ã‚­ãƒ¼ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myeccverify()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + _Example_ \code none @@ -5874,6 +6964,8 @@ /*! \brief CTXã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5884,9 +6976,11 @@ void wolfSSL_SetEccVerifyCtx(WOLFSSL* ssl, void *ctx); /*! - \brief 以å‰ã«wolfssl_setecverifyctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ + \brief 以å‰ã«wolfssl_setecverifyctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5897,8 +6991,9 @@ void* wolfSSL_GetEccVerifyCtx(WOLFSSL* ssl); /*! - \brief コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INSã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒå…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚OUTã¯ã€ç½²åã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚OUTSZã¯ã€å‘¼ã³å‡ºã—時ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å…¥åŠ›/出力変数ã§ã‚ã‚Šã€ç½²åã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºã‚’戻ã™å‰ã«æ ¼ç´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®RSA秘密éµã§ã‚ã‚Šã€Keyszã¯ãƒã‚¤ãƒˆæ•°ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsasign()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INSã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãƒ¼ãŒå…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚OUTã¯ã€ç½²åã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚OUTSZã¯ã€å‘¼ã³å‡ºã—時ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å…¥åŠ›/出力変数ã§ã‚ã‚Šã€ç½²åã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºã‚’戻ã™å‰ã«æ ¼ç´ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®RSA秘密éµã§ã‚ã‚Šã€Keyszã¯ãƒã‚¤ãƒˆæ•°ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsasign()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + _Example_ \code none @@ -5911,6 +7006,8 @@ /*! \brief ctxã«ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5921,10 +7018,11 @@ void wolfSSL_SetRsaSignCtx(WOLFSSL* ssl, void *ctx); /*! - \brief 以å‰ã«wolfssl_setrsAsignctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ + \brief 以å‰ã«wolfssl_setrsAsignctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param none パラメータã¯ã‚ã‚Šã¾ã›ã‚“。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5935,7 +7033,7 @@ void* wolfSSL_GetRsaSignCtx(WOLFSSL* ssl); /*! - \brief コールãƒãƒƒã‚¯ã¯ã€æˆåŠŸã®ãŸã‚ã®å¹³æ–‡ãƒã‚¤ãƒˆæ•°ã¾ãŸã¯<0エラーã®å ´åˆã¯<0ã‚’è¿”ã™ã¹ãã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚SIGã¯æ¤œè¨¼ã®ç½²åã§ã‚ã‚Šã€SIGSZã¯ç½²åã®é•·ã•ã‚’表ã—ã¾ã™ã€‚復å·åŒ–プロセスã¨ãƒ‘ディングã®å¾Œã«æ¤œè¨¼ãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1å½¢å¼ã®RSA公開éµã§ã‚ã‚Šã€Keyszã¯ã‚­ãƒ¼ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsaverify()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief コールãƒãƒƒã‚¯ã¯ã€æˆåŠŸã®ãŸã‚ã®å¹³æ–‡ãƒã‚¤ãƒˆæ•°ã¾ãŸã¯<0エラーã®å ´åˆã¯<0ã‚’è¿”ã™ã¹ãã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚SIGã¯æ¤œè¨¼ã®ç½²åã§ã‚ã‚Šã€SIGSZã¯ç½²åã®é•·ã•ã‚’表ã—ã¾ã™ã€‚復å·åŒ–プロセスã¨ãƒ‘ディングã®å¾Œã«æ¤œè¨¼ãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1å½¢å¼ã®RSA公開éµã§ã‚ã‚Šã€Keyszã¯ã‚­ãƒ¼ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsaverify()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ \sa wolfSSL_SetRsaVerifyCtx \sa wolfSSL_GetRsaVerifyCtx @@ -5945,6 +7043,7 @@ /*! \brief CTXã¸ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + _Example_ \code none @@ -5955,9 +7054,11 @@ void wolfSSL_SetRsaVerifyCtx(WOLFSSL* ssl, void *ctx); /*! - \brief 以å‰ã«wolfssl_setrsaverifyctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ + \brief 以å‰ã«wolfssl_setrsaverifyctx()ã§ä¿å­˜ã•ã‚Œã¦ã„ãŸã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5968,8 +7069,10 @@ void* wolfSSL_GetRsaVerifyCtx(WOLFSSL* ssl); /*! - \brief æš—å·åŒ–ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã§ã™ãŒã€INSZã¯å…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚æš—å·åŒ–ã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚OUTSZã¯ã€å‘¼ã³å‡ºã—時ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å…¥åŠ›/出力変数ã§ã‚ã‚Šã€æš—å·åŒ–ã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºã¯æˆ»ã£ã¦å‰ã«æ ¼ç´ã•ã‚Œã‚‹ã¹ãã§ã™ã€‚keyderã¯ASN1å½¢å¼ã®RSA公開éµã§ã‚ã‚Šã€Keyszã¯ã‚­ãƒ¼ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚例コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsaenc()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief æš—å·åŒ–ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯æˆåŠŸã®å ´åˆã¯0ã‚’è¿”ã™ã‹ã€ã‚¨ãƒ©ãƒ¼ã®å ´åˆã¯<0ã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INã¯å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ã§ã™ãŒã€INSZã¯å…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚æš—å·åŒ–ã®çµæžœã‚’ä¿å­˜ã™ã‚‹å¿…è¦ãŒã‚る出力ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚OUTSZã¯ã€å‘¼ã³å‡ºã—時ã«å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’指定ã™ã‚‹å…¥åŠ›/出力変数ã§ã‚ã‚Šã€æš—å·åŒ–ã®å®Ÿéš›ã®ã‚µã‚¤ã‚ºã¯æˆ»ã£ã¦å‰ã«æ ¼ç´ã•ã‚Œã‚‹ã¹ãã§ã™ã€‚keyderã¯ASN1å½¢å¼ã®RSA公開éµã§ã‚ã‚Šã€Keyszã¯ã‚­ãƒ¼ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚例コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsaenc()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + + _Example_ \code none \endcode @@ -5981,6 +7084,8 @@ /*! \brief CTXã¸ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -5991,9 +7096,11 @@ void wolfSSL_SetRsaEncCtx(WOLFSSL* ssl, void *ctx); /*! - \brief コールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€wolfssl_setrsaencctx()ã§ä»¥å‰ã«ä¿å­˜ã•ã‚Œã¦ã„ã¾ã—ãŸã€‚ + \brief コールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€wolfssl_setrsaencctx()ã§ä»¥å‰ã«ä¿å­˜ã•ã‚Œã¦ã„ã¾ã—ãŸã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -6004,8 +7111,9 @@ void* wolfSSL_GetRsaEncCtx(WOLFSSL* ssl); /*! - \brief 復å·åŒ–ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯ã€æˆåŠŸã®ãŸã‚ã®å¹³æ–‡ãƒã‚¤ãƒˆæ•°ã¾ãŸã¯<0エラーã®å ´åˆã¯<0ã‚’è¿”ã™ã¹ãã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INã¯ã€å¾©å·åŒ–ã™ã‚‹å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãŒå…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚復å·åŒ–プロセスãŠã‚ˆã³ä»»æ„ã®ãƒ‘ディングã®å¾Œã€å¾©å·åŒ–ãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®RSA秘密éµã§ã‚ã‚Šã€Keyszã¯ãƒã‚¤ãƒˆæ•°ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsadec()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \brief 復å·åŒ–ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯ã€æˆåŠŸã®ãŸã‚ã®å¹³æ–‡ãƒã‚¤ãƒˆæ•°ã¾ãŸã¯<0エラーã®å ´åˆã¯<0ã‚’è¿”ã™ã¹ãã§ã™ã€‚SSLã¨CTXãƒã‚¤ãƒ³ã‚¿ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åˆ©ä¾¿æ€§ã«åˆ©ç”¨ã§ãã¾ã™ã€‚INã¯ã€å¾©å·åŒ–ã™ã‚‹å…¥åŠ›ãƒãƒƒãƒ•ã‚¡ãŒå…¥åŠ›ã®é•·ã•ã‚’表ã—ã¾ã™ã€‚復å·åŒ–プロセスãŠã‚ˆã³ä»»æ„ã®ãƒ‘ディングã®å¾Œã€å¾©å·åŒ–ãƒãƒƒãƒ•ã‚¡ã®å…ˆé ­ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚keyderã¯ASN1フォーマットã®RSA秘密éµã§ã‚ã‚Šã€Keyszã¯ãƒã‚¤ãƒˆæ•°ã®ã‚­ãƒ¼ã®é•·ã•ã§ã™ã€‚コールãƒãƒƒã‚¯ã®ä¾‹ã¯ã€wolfssl / test.h myrsadec()を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + _Example_ \code none @@ -6018,6 +7126,8 @@ /*! \brief CTXã¸ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -6028,9 +7138,11 @@ void wolfSSL_SetRsaDecCtx(WOLFSSL* ssl, void *ctx); /*! - \brief コールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€wolfssl_setrsadecctx()ã§ä»¥å‰ã«ä¿å­˜ã•ã‚Œã¦ã„ã¾ã—ãŸã€‚ + \brief コールãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€wolfssl_setrsadecctx()ã§ä»¥å‰ã«ä¿å­˜ã•ã‚Œã¦ã„ã¾ã—ãŸã€‚ \return pointer 正常ã«ã‚³ãƒ¼ãƒ«ãŒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¸ã®æœ‰åŠ¹ãªãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 空白ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code none @@ -6043,7 +7155,8 @@ /*! \brief æ–°ã—ã„CA証明書ãŒWolfSSLã«ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸã¨ãã«å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼ˆWolfSSL_CTX)。コールãƒãƒƒã‚¯ã«ã¯ã€ç¬¦å·åŒ–ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚’æŒã¤ãƒãƒƒãƒ•ã‚¡ãŒä¸Žãˆã‚‰ã‚Œã¾ã™ã€‚ \return none è¿”å“ä¸å¯ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -6065,7 +7178,7 @@ void wolfSSL_CTX_SetCACb(WOLFSSL_CTX* ctx, CallbackCACache cb); /*! - \ingroup CertManager + \ingroup CertManager \brief æ–°ã—ã„証明書マãƒãƒ¼ã‚¸ãƒ£ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€SSLã®ãƒ‹ãƒ¼ã‚ºã¨ã¯ç„¡é–¢ä¿‚ã«ä½¿ç”¨ã§ãã¾ã™ã€‚証明書をロードã—ãŸã‚Šã€è¨¼æ˜Žæ›¸ã‚’確èªã—ãŸã‚Šã€å¤±åŠ¹çŠ¶æ³ã‚’確èªã—ãŸã‚Šã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return WOLFSSL_CERT_MANAGER 正常ã«ã‚³ãƒ¼ãƒ«ãŒæœ‰åŠ¹ãªwolfssl_cert_managerãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ @@ -6074,10 +7187,11 @@ WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap); /*! - \ingroup CertManager + \ingroup CertManager \brief æ–°ã—ã„証明書マãƒãƒ¼ã‚¸ãƒ£ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯ã€SSLã®ãƒ‹ãƒ¼ã‚ºã¨ã¯ç„¡é–¢ä¿‚ã«ä½¿ç”¨ã§ãã¾ã™ã€‚証明書をロードã—ãŸã‚Šã€è¨¼æ˜Žæ›¸ã‚’確èªã—ãŸã‚Šã€å¤±åŠ¹çŠ¶æ³ã‚’確èªã—ãŸã‚Šã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return WOLFSSL_CERT_MANAGER 正常ã«ã‚³ãƒ¼ãƒ«ãŒæœ‰åŠ¹ãªwolfssl_cert_managerãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL エラー状態ã«æˆ»ã‚Šã¾ã™ã€‚ + _Example_ \code #import @@ -6093,9 +7207,10 @@ WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void); /*! - \ingroup CertManager + \ingroup CertManager \brief 証明書マãƒãƒ¼ã‚¸ãƒ£ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«é–¢é€£ä»˜ã‘られã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã—ã¾ã™ã€‚証明書マãƒãƒ¼ã‚¸ãƒ£ã‚’使用ã™ã‚‹å¿…è¦ãŒãªããªã‚‹ã¨ãã«ã“れを呼ã³å‡ºã—ã¾ã™ã€‚ - \return none + \return none + _Example_ \code #include @@ -6109,17 +7224,18 @@ void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER*); /*! - \ingroup CertManager + \ingroup CertManager \brief Managerコンテキストã¸ã®CA証明書ã®ãƒ­ãƒ¼ãƒ‰ã®å ´æ‰€ã‚’指定ã—ã¾ã™ã€‚PEM証明書カフェイルã«ã¯ã€è¤‡æ•°ã®ä¿¡é ¼ã§ãã‚‹CA証明書ãŒå«ã¾ã‚Œã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚capathãŒnullã§ãªã„å ´åˆã€PEMå½¢å¼ã®CA証明書をå«ã‚€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ \return SSL_FATAL_ERROR - 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param file ロードã™ã‚‹CA証明書をå«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code #include @@ -6138,13 +7254,14 @@ const char* d); /*! - \ingroup CertManager + \ingroup CertManager \brief wolfssl_ctx_load_verify_bufferを呼ã³å‡ºã—ã¦ã€é–¢æ•°ã«æ¸¡ã•ã‚ŒãŸCM内ã®æƒ…報を失ã†ã“ã¨ãªã一時的ãªCMを使用ã—ã¦ãã®çµæžœã‚’è¿”ã™ã“ã¨ã«ã‚ˆã£ã¦CAãƒãƒƒãƒ•ã‚¡ã‚’ロードã—ã¾ã™ã€‚ - \return SSL_FATAL_ERROR wolfssl_cert_manager構造体ãŒNULLã®å ´åˆã€ã¾ãŸã¯wolfssl_ctx_new()ãŒNULLã‚’è¿”ã™å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR wolfssl_cert_manager構造体ãŒNULLã®å ´åˆã€ã¾ãŸã¯wolfSSL_CTX_new()ãŒNULLã‚’è¿”ã™å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 実行ãŒæˆåŠŸã™ã‚‹ãŸã‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param in CERT情報用ã®ãƒãƒƒãƒ•ã‚¡ãƒ¼ã€‚ \param sz ãƒãƒƒãƒ•ã‚¡ã®é•·ã•ã€‚ + _Example_ \code WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp; @@ -6166,11 +7283,12 @@ const unsigned char* in, long sz, int format); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®é–¢æ•°ã¯CAç½²å者リストをアンロードã—ã¾ã™ã€‚ \return SSL_SUCCESS 機能ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl_cert_managerãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_MUTEX_E ミューテックスエラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_MUTEX_E ミューテックスエラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code #include @@ -6188,16 +7306,17 @@ int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm); /*! - \ingroup CertManager + \ingroup CertManager \brief 関数ã¯ä¿¡é ¼ã§ãるピアリンクリストを解放ã—ã€ä¿¡é ¼ã§ãるピアリストã®ãƒ­ãƒƒã‚¯ã‚’解除ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Œäº†ã—ãŸå ´åˆ \return BAD_FUNC_ARG wolfssl_cert_managerãŒnullã®å ´åˆ \return BAD_MUTEX_E ミューテックスエラーTPLOCKã§ã¯ã€WOLFSSL_CERT_MANAGER構造体ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯0(ニル)ã§ã™ã€‚ + _Example_ \code #include - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new(Protocol define); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new(Protocol define); WOLFSSL_CERT_MANAGER* cm = wolfSSL_CertManagerNew(); ... if(wolfSSL_CertManagerUnload_trust_peers(cm) != SSL_SUCCESS){ @@ -6209,22 +7328,23 @@ int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm); /*! - \ingroup CertManager + \ingroup CertManager \brief 証明書マãƒãƒ¼ã‚¸ãƒ£ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ç¢ºèªã™ã‚‹è¨¼æ˜Žæ›¸ã‚’指定ã—ã¾ã™ã€‚フォーマットã¯SSL_FILETYPE_PEMã¾ãŸã¯SSL_FILETYPE_ASN1ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆ + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_SIG_CONFIRM_E ç½²åãŒæ¤œè¨¼ã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return ASN_SIG_OID_E ç½²åã®ç¨®é¡žãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åã®ç¨®é¡žãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return CRL_CERT_REVOKED ã“ã®è¨¼æ˜Žæ›¸ãŒå–り消ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ \return CRL_MISSING ç¾åœ¨ã®ç™ºè¡Œè€…CRLãŒåˆ©ç”¨ã§ããªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ - \return ASN_BEFORE_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå‰æ—¥ã®å‰ã«ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return ASN_AFTER_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå¾Œã®æ—¥ä»˜ã®å¾Œã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return ASN_BEFORE_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå‰æ—¥ã®å‰ã«ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå¾Œã®æ—¥ä»˜ã®å¾Œã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param fname 検証ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -6244,23 +7364,24 @@ int format); /*! - \ingroup CertManager + \ingroup CertManager \brief 証明書マãƒãƒ¼ã‚¸ãƒ£ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’使用ã—ã¦ç¢ºèªã™ã‚‹è¨¼æ˜Žæ›¸ãƒãƒƒãƒ•ã‚¡ã‚’指定ã—ã¾ã™ã€‚フォーマットã¯SSL_FILETYPE_PEMã¾ãŸã¯SSL_FILETYPE_ASN1ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆ + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_SIG_CONFIRM_E ç½²åãŒæ¤œè¨¼ã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return ASN_SIG_OID_E ç½²åã®ç¨®é¡žãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_SIG_OID_E ç½²åã®ç¨®é¡žãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return CRL_CERT_REVOKED ã“ã®è¨¼æ˜Žæ›¸ãŒå–り消ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ \return CRL_MISSING ç¾åœ¨ã®ç™ºè¡Œè€…CRLãŒåˆ©ç”¨ã§ããªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ - \return ASN_BEFORE_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå‰æ—¥ã®å‰ã«ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return ASN_AFTER_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå¾Œã®æ—¥ä»˜ã®å¾Œã®å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 + \return ASN_BEFORE_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå‰æ—¥ã®å‰ã«ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return ASN_AFTER_DATE_E ç¾åœ¨ã®æ—¥ä»˜ãŒå¾Œã®æ—¥ä»˜ã®å¾Œã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILETYPE ファイルãŒé–“é•ã£ãŸå½¢å¼ã§ã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_BAD_FILE ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚読ã¿è¾¼ã‚ã€ã¾ãŸã¯ç ´æã—ã¦ã„ã¾ã›ã‚“。 \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return ASN_INPUT_E base16デコードãŒãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦å¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buff 検証ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’å«ã‚€ãƒãƒƒãƒ•ã‚¡ã€‚ \param sz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€BUF。 + _Example_ \code #include @@ -6284,10 +7405,11 @@ const unsigned char* buff, long sz, int format); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®é–¢æ•°ã¯ã€è¨¼æ˜Žæ›¸ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®verifyCallback関数を設定ã—ã¾ã™ã€‚存在ã™ã‚‹å ´åˆã€ãã‚Œã¯ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸå„CERTã«å¯¾ã—ã¦å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚検証エラーãŒã‚ã‚‹å ´åˆã¯ã€æ¤œè¨¼ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’使用ã—ã¦ã‚¨ãƒ©ãƒ¼ã‚’éŽåº¦ã«ä¹—り越ãˆã¾ã™ã€‚ \return none è¿”å“ä¸å¯ã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code #include @@ -6295,7 +7417,7 @@ int myVerify(int preverify, WOLFSSL_X509_STORE_CTX* store) { // do custom verification of certificate } - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new(Protocol define); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new(Protocol define); WOLFSSL_CERT_MANAGER* cm = wolfSSL_CertManagerNew(); ... wolfSSL_CertManagerSetVerify(cm, myVerify); @@ -6313,6 +7435,7 @@ \return BAD_FUNC_ARG wolfssl_cert_managerãŒnullã®å ´åˆ \param cm wolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param der DERフォーマット証明書ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CERT_MANAGER* cm; @@ -6332,14 +7455,15 @@ unsigned char* der, int sz); /*! - \ingroup CertManager + \ingroup CertManager \brief 証明書マãƒãƒ¼ã‚¸ãƒ£ã‚’使用ã—ã¦è¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ã¨ãã«è¨¼æ˜Žæ›¸å¤±åŠ¹ãƒªã‚¹ãƒˆã®ç¢ºèªã‚’オンã«ã—ã¾ã™ã€‚デフォルトã§ã¯ã€CRLãƒã‚§ãƒƒã‚¯ã¯ã‚ªãƒ•ã§ã™ã€‚オプションã«ã¯ã€wolfssl_crl_checkallãŒå«ã¾ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ãƒã‚§ãƒ¼ãƒ³å†…ã®å„証明書ã«å¯¾ã—ã¦CRL検査を実行ã—ã¾ã™ã€‚ã“ã‚Œã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã§ã‚るリーフ証明書ã®ã¿ã§ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ - \return NOT_COMPILED_IN WolfSSLãŒCRLを有効ã«ã—ã¦æ§‹ç¯‰ã•ã‚Œã¦ã„ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ + \return NOT_COMPILED_IN WolfSSLãŒCRLを有効ã«ã—ã¦æ§‹ç¯‰ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E メモリä¸è¶³çŠ¶æ…‹ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ - \return SSL_FAILURE CRLコンテキストを正ã—ãåˆæœŸåŒ–ã§ããªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return SSL_FAILURE CRLコンテキストを正ã—ãåˆæœŸåŒ–ã§ããªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code #include @@ -6361,10 +7485,11 @@ int options); /*! - \ingroup CertManager + \ingroup CertManager \brief 証明書マãƒãƒ¼ã‚¸ãƒ£ã‚’使用ã—ã¦è¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ã¨ãã«è¨¼æ˜Žæ›¸å¤±åŠ¹ãƒªã‚¹ãƒˆã®ç¢ºèªã‚’オフã«ã—ã¾ã™ã€‚デフォルトã§ã¯ã€CRLãƒã‚§ãƒƒã‚¯ã¯ã‚ªãƒ•ã§ã™ã€‚ã“ã®é–¢æ•°ã‚’使用ã—ã¦ã€ã“ã®Certificate Managerコンテキストを使用ã—ã¦CRL検査を一時的ã¾ãŸã¯æ’ä¹…çš„ã«ç„¡åŠ¹ã«ã—ã¦ã€ä»¥å‰ã¯CRL検査ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã—ãŸã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã€é€šè©±ãŒæˆ»ã‚Šã¾ã™ã€‚ \return BAD_FUNC_ARG 関数ãƒã‚¤ãƒ³ã‚¿ãŒæä¾›ã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ + _Example_ \code #include @@ -6383,16 +7508,18 @@ int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER*); /*! - \ingroup CertManager - \brief 失効確èªã®ãŸã‚ã«CERTã‚’CRLã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ãŸã‚ã«ã€CERTã‚’CRLã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ãŸã‚ã«ã€ROADCRL()ã¸ã®ã‚¨ãƒ©ãƒ¼ãŒãƒã‚§ãƒƒã‚¯ã•ã‚Œã€æ¸¡ã•ã‚Œã¾ã™ã€‚ - \return SSL_SUCCESS wolfssl_certmanagerLoadcrlã«ã‚¨ãƒ©ãƒ¼ãŒãªã„å ´åˆã€ãŠã‚ˆã³loadcrlãŒæ­£å¸¸ã«æˆ»ã‚‹å ´åˆã€‚ - \return BAD_FUNC_ARG wolfssl_cert_manager構造体ãŒnullã®å ´åˆ - \return SSL_FATAL_ERROR wolfssl_certmanagerEnableCRLãŒSSL_SUCCESS以外ã®ã‚‚ã®ã‚’è¿”ã™å ´åˆã€‚ - \return BAD_PATH_ERROR パスãŒNULLã®å ´åˆ + \ingroup CertManager + \brief 証明書ã®å¤±åŠ¹ç¢ºèªã®ãŸã‚ã«è¨¼æ˜Žæ›¸ã‚’CRLã«ãƒ­ãƒ¼ãƒ‰ã™ã‚‹éš›ã«ã‚¨ãƒ©ãƒ¼ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã„ã€ãã®å¾Œè¨¼æ˜Žæ›¸ã‚’LoadCRL()ã¸æ¸¡ã—ã¾ã™ã€‚ + + \return SSL_SUCCESS wolfSSL_CertManagerLoadCRLã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã›ãšã€loadCRLãŒæˆåŠŸã§æˆ»ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CERT_MANAGER構造体ãŒNULLã®å ´åˆ + \return SSL_FATAL_ERROR wolfSSL_CertManagerEnableCRLãŒSSL_SUCCESS以外ã®ã‚’è¿”ã™å ´åˆã€‚ + \return BAD_PATH_ERROR pathãŒNULLã®å ´åˆ \return MEMORY_E LOADCRLãŒãƒ’ープメモリã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ãŸå ´åˆã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param path CRL経路をä¿æŒã—ã¦ã„る一定ã®ãƒãƒ£ãƒ¼ãƒ«ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfSSL_CertManagerNew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CERT_MANAGER構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param path CRLã¸ã®ãƒ‘スをä¿æŒã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param type ロードã™ã‚‹è¨¼æ˜Žæ›¸ã®ç¨®é¡žã€‚ + _Example_ \code #include @@ -6409,14 +7536,15 @@ const char* path, int type, int monitor); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®é–¢æ•°ã¯ã€BufferLoadCRLを呼ã³å‡ºã™ã“ã¨ã«ã‚ˆã£ã¦CRLファイルをロードã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Œäº†ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl_cert_managerãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR wolfssl_cert_managerã«é–¢é€£ä»˜ã‘られã¦ã„るエラーãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR wolfssl_cert_managerã«é–¢é€£ä»˜ã‘られã¦ã„るエラーãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param cm wolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buff 定数ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—ã¨ãƒãƒƒãƒ•ã‚¡ã§ã™ã€‚ \param sz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’表ã™é•·ã„int。 + _Example_ \code #include @@ -6441,11 +7569,12 @@ int type); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®é–¢æ•°ã¯CRL証明書マãƒãƒ¼ã‚¸ãƒ£ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚LABE_CRLãŒå®šç¾©ã•ã‚Œã¦ã„ã¦ä¸€è‡´ã™ã‚‹CRLレコードãŒè¦‹ã¤ã‹ã‚‰ãªã„å ´åˆã€CBMissingCRLã¯å‘¼ã³å‡ºã•ã‚Œã¾ã™ï¼ˆWolfSSL_CertManagerSetCRL_CBを介ã—ã¦è¨­å®šï¼‰ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€CRLを外部ã«æ¤œç´¢ã—ã¦ãƒ­ãƒ¼ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ã®å®Ÿè¡ŒãŒæˆåŠŸã—ãŸã‚‰è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl_cert_manager構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param cm 証明書ã®æƒ…報をä¿æŒã—ã¦ã„ã‚‹WOLFSSL_CERT_MANAGER構造。 + _Example_ \code #include @@ -6468,15 +7597,42 @@ */ int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb); +/*! + \ingroup CertManager + \brief ã“ã®é–¢æ•°ã¯è¨¼æ˜Žæ›¸ãƒžãƒã‚¸ãƒ£ãƒ¼ã«ä¿æŒã•ã‚Œã¦ã„ã‚‹CRLを解放ã—ã¾ã™ã€‚ + アプリケーションã¯CRLã‚’wolfSSL_CertManagerFreeCRLを呼ã³å‡ºã—ã¦è§£æ”¾ã—ãŸå¾Œã«ã€æ–°ã—ã„CRLをロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + + \return SSL_SUCCESS 関数ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CERT_MANAGER構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ãŒNULLã§æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param cm wolfSSL_CertManagerNew()ã§ç”Ÿæˆã•ã‚ŒãŸWOLFSSL_CERT_MANAGER構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã€‚ + + _Example_ + \code + #include + + const char* crl1 = "./certs/crl/crl.pem"; + WOLFSSL_CERT_MANAGER* cm = NULL; + + cm = wolfSSL_CertManagerNew(); + wolfSSL_CertManagerLoadCRL(cm, crl1, WOLFSSL_FILETYPE_PEM, 0); + … + wolfSSL_CertManagerFreeCRL(cm); + \endcode + + \sa wolfSSL_CertManagerLoadCRL +*/ +int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®æ©Ÿèƒ½ã«ã‚ˆã‚Šã€OCSPENABLED OCSPENABLEDãŒOCSPãƒã‚§ãƒƒã‚¯ã‚ªãƒ—ションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ \return SSL_SUCCESS 機能ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚wolfssl_cert_managerã®OCSPENABLEDメンãƒãƒ¼ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl_cert_manager構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯è¨±å¯ã•ã‚Œã¦ã„ãªã„引数値ãŒã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E ã“ã®é–¢æ•°å†…ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param der 証明書ã¸ã®ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code #import @@ -6496,14 +7652,15 @@ unsigned char* der, int sz); /*! - \ingroup CertManager + \ingroup CertManager \brief OCSPãŒã‚ªãƒ•ã«ãªã£ã¦ã„ã‚‹å ´åˆã¯OCSPをオンã«ã—ã€[設定]オプションを使用å¯èƒ½ã«ãªã£ã¦ã„ã‚‹å ´åˆã€‚ \return SSL_SUCCESS 関数呼ã³å‡ºã—ãŒæˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG cm構造体ãŒnullã®å ´åˆ \return MEMORY_E wolfssl_ocsp struct値ãŒnullã®å ´åˆ \return SSL_FAILURE WOLFSSL_OCSP構造体ã®åˆæœŸåŒ–ã¯åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã™ã€‚ \return NOT_COMPILED_IN æ­£ã—ã„機能を有効ã«ã—ã¦ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„ビルド。 - \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cm wolfssl_certmanagernew()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code #include @@ -6523,10 +7680,11 @@ int options); /*! - \ingroup CertManager + \ingroup CertManager \brief OCSP証明書ã®å¤±åŠ¹ã‚’無効ã«ã—ã¾ã™ã€‚ \return SSL_SUCCESS WolfSSL_CertMangerDisableCRLã¯ã€WolfSSL_CERT_MANAGER構造体ã®CRLEnabledメンãƒã‚’無効ã«ã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG WOLFSSL構造ã¯ãƒŒãƒ«ã§ã—ãŸã€‚ + _Example_ \code #include @@ -6543,11 +7701,12 @@ int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER*); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®é–¢æ•°ã¯ã€URLã‚’wolfssl_cert_manager構造体ã®OCSpoverrideURLメンãƒãƒ¼ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ \return SSL_SUCCESS ã“ã®æ©Ÿèƒ½ã¯æœŸå¾…ã©ãŠã‚Šã«å®Ÿè¡Œã§ãã¾ã—ãŸã€‚ \return BAD_FUNC_ARG wolfssl_cert_manager構造体ã¯nullã§ã™ã€‚ \return MEMEORY_E 証明書マãƒãƒ¼ã‚¸ãƒ£ã®OCSPoverRideURLメンãƒãƒ¼ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ + _Example_ \code #include @@ -6567,13 +7726,14 @@ const char* url); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_cert_managerã®OCSPコールãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 実行ã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚引数ã¯wolfssl_cert_manager構造体ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl_cert_managerãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param cm wolfssl_cert_manager構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param ioCb CBocSpioåž‹ã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã€‚ \param respFreeCb - CBOCSPRESPFREASåž‹ã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code #include @@ -6595,13 +7755,14 @@ void* ioCbCtx); /*! - \ingroup CertManager + \ingroup CertManager \brief ã“ã®é–¢æ•°ã¯ã€ã‚ªãƒ—ションをオンã«ã—ãªã„ã¨OCSPステープルをオンã«ã—ã¾ã™ã€‚オプションを設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS エラーãŒãªãã€é–¢æ•°ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl_cert_manager構造体ãŒNULLã¾ãŸã¯ãã†ã§ãªã„å ´åˆã¯ã€ã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸæœªè§£æ±ºã®å¼•æ•°å€¤ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E メモリ割り当ã¦ãŒã‚ã‚‹å•é¡ŒãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリ割り当ã¦ãŒã‚ã‚‹å•é¡ŒãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE OCSP構造体ã®åˆæœŸåŒ–ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN wolfsslãŒhaber_certificate_status_requestオプションã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX* ctx){ @@ -6614,13 +7775,14 @@ WOLFSSL_CERT_MANAGER* cm); /*! - \brief + \brief \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ã¯ã‚¨ãƒ©ãƒ¼ãªã—ã§è¿”ã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG WolfSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE initcrl関数ãŒæ­£å¸¸ã«æˆ»ã•ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN have_crlã¯ã‚³ãƒ³ãƒ‘イル中ã«æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -6636,9 +7798,10 @@ int wolfSSL_EnableCRL(WOLFSSL* ssl, int options); /*! - \brief + \brief \return SSL_SUCCESS WolfSSL_CertMangerDisableCRLã¯ã€WolfSSL_CERT_MANAGER構造体ã®CRLEnabledメンãƒã‚’無効ã«ã—ã¾ã—ãŸã€‚ \return BAD_FUNC_ARG WOLFSSL構造ã¯ãƒŒãƒ«ã§ã—ãŸã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -6658,9 +7821,10 @@ \return WOLFSSL_SUCCESS 関数ã¨ã™ã¹ã¦ã®ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FATAL_ERROR サブルーãƒãƒ³ã®1ã¤ãŒæ­£å¸¸ã«æˆ»ã•ã‚Œãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl_cert_managerã¾ãŸã¯wolfssl構造ãŒnullã®å ´åˆ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param path CRLファイルã¸ã®ãƒ‘スをä¿æŒã™ã‚‹å®šæ•°æ–‡å­—ãƒã‚¤ãƒ³ã‚¿ã€‚ \param type 証明書ã®ç¨®é¡žã‚’表ã™æ•´æ•°ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -6677,10 +7841,11 @@ int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor); /*! - \brief + \brief \return SSL_SUCCESS 関数ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚wolfssl_cert_managerã®CBMissingCRLメンãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ \return BAD_FUNC_ARG WOLFSSLã¾ãŸã¯WOLFSSL_CERT_MANAGER構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -6702,12 +7867,13 @@ int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb); /*! - \brief + \brief \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã“ã®é–¢æ•°ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ã®å¼•æ•°ãŒç„¡åŠ¹ãªå¼•æ•°å€¤ã‚’å—ä¿¡ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E 構造体やãã®ä»–ã®å¤‰æ•°ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E 構造体やãã®ä»–ã®å¤‰æ•°ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN wolfsslãŒhane_ocspオプションã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -6724,9 +7890,10 @@ int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options); /*! - \brief + \brief \return SSL_SUCCESS 関数ã¨ãã®ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§æˆ»ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚wolfssl_cert_manager構造体ã®OCSPENABLEDメンãƒãƒ¼ã¯æ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG WolfSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -6744,7 +7911,8 @@ \return SSL_SUCCESS 機能ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl構造体ãŒnullã®å ´åˆã€ã¾ãŸã¯æœªè§£æ±ºã®å¼•æ•°ãŒã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E サブルーãƒãƒ³ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -6763,9 +7931,10 @@ \brief wolfssl_cert_manager構造体。 \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚CMã®OCSPIOCBã€OCSPRESPFREECBã€ãŠã‚ˆã³OCSPIOCTXメンãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ \return BAD_FUNC_ARG WOLFSSLã¾ãŸã¯WOLFSSL_CERT_MANAGER構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param ioCb CBocSpioを入力ã™ã‚‹ãŸã‚ã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã€‚ \param respFreeCb 応答メモリを解放ã™ã‚‹ãŸã‚ã®å‘¼ã³å‡ºã—ã§ã‚ã‚‹CBocSpreSpFreeを入力ã™ã‚‹ãŸã‚ã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -6795,12 +7964,13 @@ void* ioCbCtx); /*! - \brief + \brief \return SSL_SUCCESS ã“ã®é–¢æ•°ã¨ãã‚ŒãŒã‚µãƒ–ルーãƒãƒ³ã®å ´åˆã¯ã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG CTX構造体ãŒNULLã®å ´åˆã€ã¾ãŸã¯ãã®ä»–ã®ç‚¹ã§ã¯ã‚µãƒ–ルーãƒãƒ³ã«ç„¡åŠ¹ãªå¼•æ•°ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E 関数ã®å®Ÿè¡Œä¸­ã«ãƒ¡ãƒ¢ãƒªã®å‰²ã‚Šå½“ã¦ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE wolfssl_cert_managerã®CRLメンãƒãƒ¼ãŒæ­£ã—ãåˆæœŸåŒ–ã•ã‚Œãªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN wolfsslã¯hane_crlオプションã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¾ã›ã‚“ã§ã—ãŸã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -6817,9 +7987,10 @@ int wolfSSL_CTX_EnableCRL(WOLFSSL_CTX* ctx, int options); /*! - \brief + \brief \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚wolfssl_cert_manager構造体ã®CRLEnabledメンãƒãƒ¼ã¯0ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ \return BAD_FUNC_ARG CTX構造体ã¾ãŸã¯CM構造体ã«NULL値ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -6834,14 +8005,15 @@ int wolfSSL_CTX_DisableCRL(WOLFSSL_CTX* ctx); /*! - \brief wolfssl_certmanagerLoadcr()。 + \brief wolfssl_certmanagerLoadcr()。 \return SSL_SUCCESS - 関数ã¨ãã®ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG - ã“ã®é–¢æ•°ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ãŒNULL構造ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_PATH_ERROR - パス変数ãŒnullã¨ã—ã¦é–‹ãã¨æˆ»ã‚Šã¾ã™ã€‚ \return MEMORY_E - メモリã®å‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param path 証明書ã¸ã®ãƒ‘ス。 \param type 証明書ã®ç¨®é¡žã‚’ä¿æŒã™ã‚‹æ•´æ•°å¤‰æ•°ã€‚ + _Example_ \code WOLFSSL_CTX* ctx; @@ -6858,7 +8030,8 @@ \brief wolfssl_certmanagersetCRL_CBを呼ã³å‡ºã—ã¦ã€WolfSSL_CERT_MANAGER構造ã®ãƒ¡ãƒ³ãƒãƒ¼ã€‚ \return SSL_SUCCESS 実行ãŒæˆåŠŸã™ã‚‹ãŸã‚ã«è¿”ã•ã‚Œã¾ã—ãŸã€‚WOLFSSL_CERT_MANAGER構造体ã®CBMSSINGCRLã¯CBã«æ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG wolfssl_ctxã¾ãŸã¯wolfssl_cert_managerãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -6878,11 +8051,12 @@ int wolfSSL_CTX_SetCRL_Cb(WOLFSSL_CTX* ctx, CbMissingCRL cb); /*! - \brief wolfsslã®æ©Ÿèƒ½ã‚ªãƒ—ションã®å€¤ãŒ1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションã§æ§‹æˆã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€æ¬¡ã®ã‚ªãƒ—ションを1ã¤ä»¥ä¸Šã«ã—ã¾ã™.wolfssl_ocsp_enable - OCSPルックアップを有効ã«ã™ã‚‹wolfssl_ocsp_url_override - 証明書ã®URLã®ä»£ã‚ã‚Šã«URLをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¾ã™ã€‚オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰URLã¯ã€wolfssl_ctx_setocsp_overrideURL()関数を使用ã—ã¦æŒ‡å®šã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfsslãŒOCSPサãƒãƒ¼ãƒˆï¼ˆ--enable-ocspã€#define hane_ocsp)ã§ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã¨ãã«ã®ã¿OCSPオプションを設定ã—ã¾ã™ã€‚ + \brief wolfsslã®æ©Ÿèƒ½ã‚ªãƒ—ションã®å€¤ãŒ1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションã§æ§‹æˆã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€æ¬¡ã®ã‚ªãƒ—ションを1ã¤ä»¥ä¸Šã«ã—ã¾ã™.wolfssl_ocsp_enable - OCSPルックアップを有効ã«ã™ã‚‹wolfssl_ocsp_url_override - 証明書ã®URLã®ä»£ã‚ã‚Šã«URLをオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã—ã¾ã™ã€‚オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰URLã¯ã€wolfssl_ctx_setocsp_overrideURL()関数を使用ã—ã¦æŒ‡å®šã•ã‚Œã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfsslãŒOCSPサãƒãƒ¼ãƒˆï¼ˆ--enable-ocspã€#define hane_ocsp)ã§ã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã¨ãã«ã®ã¿OCSPオプションを設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚ŒãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ãŒã€wolfsslãŒã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã¨ãã«OCSPサãƒãƒ¼ãƒˆã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -6896,7 +8070,8 @@ /*! \brief wolfssl_cert_manager構造体ã®OCSPENABLEDメンãƒãƒ¼ã«å½±éŸ¿ã‚’与ãˆã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚CMã®OCSPENABLEDメンãƒãƒ¼ã¯ç„¡åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造ãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造ãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -6916,7 +8091,8 @@ \return SSL_SUCCESS æˆåŠŸã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE 失敗ã—ãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚ŒãŸã¨ãã«è¿”ã•ã‚Œã¾ã™ãŒã€wolfsslãŒã‚³ãƒ³ãƒ‘イルã•ã‚ŒãŸã¨ãã«OCSPサãƒãƒ¼ãƒˆã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -6928,12 +8104,13 @@ int wolfSSL_CTX_SetOCSP_OverrideURL(WOLFSSL_CTX* ctx, const char* url); /*! - \brief + \brief \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚CM内ã®OCSPIOCBã€OCSPRESPFREECBã€ãŠã‚ˆã³OCSPIOCTXメンãƒãƒ¼ã¯æ­£å¸¸ã«è¨­å®šã•ã‚Œã¾ã—ãŸã€‚ - \return BAD_FUNC_ARG wolfssl_ctxã¾ãŸã¯wolfssl_cert_manager構造体ãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTXã¾ãŸã¯wolfssl_cert_manager構造体ãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param ioCb 関数ãƒã‚¤ãƒ³ã‚¿ã§ã‚ã‚‹CBocSpio型。 \param respFreeCb 関数ãƒã‚¤ãƒ³ã‚¿ã§ã‚ã‚‹CBocSprepSprepFree型。 + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -6959,15 +8136,16 @@ void* ioCbCtx); /*! - \brief wolfssl_certmanagerEnableOcspStapling()。 + \brief wolfssl_certmanagerEnableOcspStapling()。 \return SSL_SUCCESS エラーãŒãªãã€é–¢æ•°ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造体ãŒNULLã¾ãŸã¯ãã†ã§ãªã„å ´åˆã¯ã€ã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸæœªè§£æ±ºã®å¼•æ•°å€¤ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E メモリ割り当ã¦ãŒã‚ã‚‹å•é¡ŒãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造体ãŒNULLã¾ãŸã¯ãã†ã§ãªã„å ´åˆã¯ã€ã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸæœªè§£æ±ºã®å¼•æ•°å€¤ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリ割り当ã¦ãŒã‚ã‚‹å•é¡ŒãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE OCSP構造体ã®åˆæœŸåŒ–ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NOT_COMPILED_IN wolfsslãŒhaber_certificate_status_requestオプションã§ã‚³ãƒ³ãƒ‘イルã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code - WOLFSSL* ssl = WOLFSSL_new(); + WOLFSSL* ssl = wolfSSL_new(); ssl->method.version; // set to desired protocol ... if(!wolfSSL_CTX_EnableOCSPStapling(ssl->ctx)){ @@ -6980,9 +8158,10 @@ int wolfSSL_CTX_EnableOCSPStapling(WOLFSSL_CTX*); /*! - \ingroup CertsKeys - \brief 通常ã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®æœ€å¾Œã«ã€WolfSSLã¯ä¸€æ™‚çš„ãªã‚¢ãƒ¬ã‚¤ã‚’解放ã—ã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå§‹ã¾ã‚‹å‰ã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™ã¨ã€WolfSSLã¯ä¸€æ™‚çš„ãªé…列を解放ã™ã‚‹ã®ã‚’防ãŽã¾ã™ã€‚Wolfssl_get_keys()ã¾ãŸã¯PSKã®ãƒ’ントãªã©ã®ã‚‚ã®ã«ã¯ã€ä¸€æ™‚çš„ãªé…列ãŒå¿…è¦ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ユーザãŒä¸€æ™‚çš„ãªé…列ã§è¡Œã‚れるã¨ã€wolfssl_freearray()ã®ã„ãšã‚Œã‹ãŒå³åº§ã«ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã™ã‚‹ã“ã¨ãŒã§ãã€ã‚ã‚‹ã„ã¯ã€é–¢é€£ã™ã‚‹SSLオブジェクトãŒè§£æ”¾ã•ã‚ŒãŸã¨ãã«ãƒªã‚½ãƒ¼ã‚¹ãŒè§£æ”¾ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚る。 + \ingroup CertsKeys + \brief 通常ã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®æœ€å¾Œã«ã€WolfSSLã¯ä¸€æ™‚çš„ãªã‚¢ãƒ¬ã‚¤ã‚’解放ã—ã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå§‹ã¾ã‚‹å‰ã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã™ã¨ã€WolfSSLã¯ä¸€æ™‚çš„ãªé…列を解放ã™ã‚‹ã®ã‚’防ãŽã¾ã™ã€‚Wolfssl_get_keys()ã¾ãŸã¯PSKã®ãƒ’ントãªã©ã®ã‚‚ã®ã«ã¯ã€ä¸€æ™‚çš„ãªé…列ãŒå¿…è¦ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ユーザãŒä¸€æ™‚çš„ãªé…列ã§è¡Œã‚れるã¨ã€wolfssl_freearray()ã®ã„ãšã‚Œã‹ãŒå³åº§ã«ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã™ã‚‹ã“ã¨ãŒã§ãã€ã‚ã‚‹ã„ã¯ã€é–¢é€£ã™ã‚‹SSLオブジェクトãŒè§£æ”¾ã•ã‚ŒãŸã¨ãã«ãƒªã‚½ãƒ¼ã‚¹ãŒè§£æ”¾ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚‹å¯èƒ½æ€§ãŒã‚る。 \return none è¿”å“ä¸å¯ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -6994,9 +8173,10 @@ void wolfSSL_KeepArrays(WOLFSSL*); /*! - \ingroup CertsKeys - \brief 通常ã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®æœ€å¾Œã«ã€WolfSSLã¯ä¸€æ™‚çš„ãªã‚¢ãƒ¬ã‚¤ã‚’解放ã—ã¾ã™ã€‚wolfssl_keeparrays()ãŒãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®å‰ã«å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€WolfSSLã¯ä¸€æ™‚çš„ãªé…列を解放ã—ã¾ã›ã‚“。ã“ã®é–¢æ•°ã¯ä¸€æ™‚çš„ãªé…列を明示的ã«è§£æ”¾ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä¸€æ™‚çš„ãªé…列ã§è¡Œã‚ã‚ŒãŸã¨ãã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã¹ãã§ã‚ã‚Šã€SSLオブジェクトãŒã“れらã®ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã™ã‚‹ã®ã‚’å¾…ã£ãŸããªã„。 + \ingroup CertsKeys + \brief 通常ã€SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®æœ€å¾Œã«ã€WolfSSLã¯ä¸€æ™‚çš„ãªã‚¢ãƒ¬ã‚¤ã‚’解放ã—ã¾ã™ã€‚wolfssl_keeparrays()ãŒãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã®å‰ã«å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€WolfSSLã¯ä¸€æ™‚çš„ãªé…列を解放ã—ã¾ã›ã‚“。ã“ã®é–¢æ•°ã¯ä¸€æ™‚çš„ãªé…列を明示的ã«è§£æ”¾ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒä¸€æ™‚çš„ãªé…列ã§è¡Œã‚ã‚ŒãŸã¨ãã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã¹ãã§ã‚ã‚Šã€SSLオブジェクトãŒã“れらã®ãƒªã‚½ãƒ¼ã‚¹ã‚’解放ã™ã‚‹ã®ã‚’å¾…ã£ãŸããªã„。 \return none è¿”å“ä¸å¯ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -7009,12 +8189,13 @@ /*! \brief 'ssl'パラメータã«æ¸¡ã•ã‚ŒãŸã‚ªãƒ–ジェクト。ã“ã‚Œã¯ã€WolfSSLクライアントã«ã‚ˆã£ã¦SNI拡張機能ãŒClientHelloã§é€ä¿¡ã•ã‚Œã€WolfSSL Serverã¯ServerHello + SNIã¾ãŸã¯SNIミスマッãƒã®å ´åˆã¯è‡´å‘½çš„ãªAlert Hello + SNIを応答ã—ã¾ã™ã€‚ - \return WOLFSSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã§è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.SSLã¯NULLã€ãƒ‡ãƒ¼ã‚¿ã¯NULLã€ã‚¿ã‚¤ãƒ—ã¯ä¸æ˜Žãªå€¤ã§ã™ã€‚(下記å‚照) \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param type ã©ã®ç¨®é¡žã®ã‚µãƒ¼ãƒãƒ¼åãŒãƒ‡ãƒ¼ã‚¿ã«æ¸¡ã•ã‚ŒãŸã‹ã‚’示ã—ã¾ã™ã€‚既知ã®åž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_host_name = 0}; \param data サーãƒãƒ¼åデータã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -7042,12 +8223,13 @@ /*! \brief SSLコンテキストã‹ã‚‰ä½œæˆã•ã‚ŒãŸã‚ªãƒ–ジェクト㯠'ctx'パラメータã«æ¸¡ã•ã‚Œã¾ã—ãŸã€‚ã“ã‚Œã¯ã€WolfSSLクライアントã«ã‚ˆã£ã¦SNI拡張機能ãŒClientHelloã§é€ä¿¡ã•ã‚Œã€WolfSSLサーãƒãƒ¼ã¯ServerHello + SNIã¾ãŸã¯SNIã®ä¸ä¸€è‡´ã®å ´åˆã«ã¯è‡´å‘½çš„ãªALERT Hello + SNIを応答ã—ã¾ã™ã€‚ - \return WOLFSSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã§è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.CTXã¯NULLã€ãƒ‡ãƒ¼ã‚¿ã¯NULLã€ã‚¿ã‚¤ãƒ—ã¯ä¸æ˜Žãªå€¤ã§ã™ã€‚(下記å‚照) \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param type ã©ã®ç¨®é¡žã®ã‚µãƒ¼ãƒãƒ¼åãŒãƒ‡ãƒ¼ã‚¿ã«æ¸¡ã•ã‚ŒãŸã‹ã‚’示ã—ã¾ã™ã€‚既知ã®åž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_host_name = 0}; \param data サーãƒãƒ¼åデータã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -7071,10 +8253,11 @@ /*! \brief 'ssl'パラメータã«æ¸¡ã•ã‚ŒãŸSSLオブジェクト内ã®ã‚µãƒ¼ãƒãƒ¼å表示を使用ã—ãŸSSLセッションã®å‹•ä½œã€‚オプションを以下ã«èª¬æ˜Žã—ã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param type ã©ã®ç¨®é¡žã®ã‚µãƒ¼ãƒãƒ¼åãŒãƒ‡ãƒ¼ã‚¿ã«æ¸¡ã•ã‚ŒãŸã‹ã‚’示ã—ã¾ã™ã€‚既知ã®åž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_host_name = 0}; \param options é¸æŠžã•ã‚ŒãŸã‚ªãƒ—ションをæŒã¤ãƒ“ットå˜ä½ã®ã‚»ãƒžãƒ•ã‚©ã€‚利用å¯èƒ½ãªã‚ªãƒ—ションã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_continue_on_mismatch = 0x01ã€wolfssl_sni_answer_on_mismatch = 0x02};通常ã€ã‚µãƒ¼ãƒãƒ¼ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦æä¾›ã•ã‚ŒãŸãƒ›ã‚¹ãƒˆåãŒã‚µãƒ¼ãƒãƒ¼ã¨è¡¨ç¤ºã•ã‚Œã¦ã„るホストåãŒã‚µãƒ¼ãƒãƒ¼ã§æä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã¯handshakeを中止ã—ã¾ã™ã€‚ \param WOLFSSL_SNI_CONTINUE_ON_MISMATCH ã“ã®ã‚ªãƒ—ションを設定ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒãƒ¼ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’中止ã™ã‚‹ä»£ã‚ã‚Šã«SNI応答をé€ä¿¡ã—ã¾ã›ã‚“。 + _Example_ \code int ret = 0; @@ -7105,10 +8288,11 @@ /*! \brief SSLセッションを使用ã—ãŸSSLオブジェクトã®ã‚µãƒ¼ãƒå指示を使用ã—ã¦ã€SSLコンテキストã‹ã‚‰ä½œæˆã•ã‚ŒãŸSSLオブジェクトã‹ã‚‰ä½œæˆã•ã‚Œã¾ã™ã€‚オプションを以下ã«èª¬æ˜Žã—ã¾ã™ã€‚ \return none ã„ã„ãˆè¿”ã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param type ã©ã®ç¨®é¡žã®ã‚µãƒ¼ãƒãƒ¼åãŒãƒ‡ãƒ¼ã‚¿ã«æ¸¡ã•ã‚ŒãŸã‹ã‚’示ã—ã¾ã™ã€‚既知ã®åž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_host_name = 0}; \param options é¸æŠžã•ã‚ŒãŸã‚ªãƒ—ションをæŒã¤ãƒ“ットå˜ä½ã®ã‚»ãƒžãƒ•ã‚©ã€‚利用å¯èƒ½ãªã‚ªãƒ—ションã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_continue_on_mismatch = 0x01ã€wolfssl_sni_answer_on_mismatch = 0x02};通常ã€ã‚µãƒ¼ãƒãƒ¼ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦æä¾›ã•ã‚ŒãŸãƒ›ã‚¹ãƒˆåãŒã‚µãƒ¼ãƒãƒ¼ã¨è¡¨ç¤ºã•ã‚Œã¦ã„るホストåãŒã‚µãƒ¼ãƒãƒ¼ã§æä¾›ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã¯handshakeを中止ã—ã¾ã™ã€‚ \param WOLFSSL_SNI_CONTINUE_ON_MISMATCH ã“ã®ã‚ªãƒ—ションを設定ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒãƒ¼ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’中止ã™ã‚‹ä»£ã‚ã‚Šã«SNI応答をé€ä¿¡ã—ã¾ã›ã‚“。 + _Example_ \code int ret = 0; @@ -7133,7 +8317,7 @@ /*! \brief クライアントã«ã‚ˆã£ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰æä¾›ã•ã‚ŒãŸåå‰è¡¨ç¤ºã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦é€ä¿¡ã•ã‚ŒãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’開始ã™ã‚‹ã€‚SNIã‚’å–å¾—ã™ã‚‹ãŸã‚ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¾ãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³è¨­å®šãŒå¿…è¦ã‚ã‚Šã¾ã›ã‚“。 - \return WOLFSSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG ã“ã®ã‚±ãƒ¼ã‚¹ã§è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã¯ã€æ¬¡ã®ã„ãšã‚Œã‹ã®å ´åˆã§è¿”ã•ã‚Œã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡ã¯NULLã€BUFFERSZ <= 0ã€SNIã¯NULLã€INOUTSZã¯NULLã¾ãŸã¯<= 0ã§ã™ã€‚ \return BUFFER_ERROR ä¸æ­£ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆhelloメッセージãŒã‚ã‚‹ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ \return INCOMPLETE_DATA 抽出を完了ã™ã‚‹ã®ã«å分ãªãƒ‡ãƒ¼ã‚¿ãŒãªã„å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ @@ -7141,6 +8325,7 @@ \param bufferSz クライアントhelloメッセージã®ã‚µã‚¤ã‚ºã€‚ \param type ã©ã®ç¨®é¡žã®ã‚µãƒ¼ãƒãƒ¼åãŒãƒãƒƒãƒ•ã‚¡ãƒ¼ã‹ã‚‰å–å¾—ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚既知ã®åž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_host_name = 0}; \param sni 出力ãŒä¿å­˜ã•ã‚Œã‚‹å ´æ‰€ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code unsigned char buffer[1024] = {0}; @@ -7161,11 +8346,12 @@ unsigned char type, unsigned char* sni, unsigned int* inOutSz); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯SNIオブジェクトã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’å–å¾—ã—ã¾ã™ã€‚ \return value SNIãŒNULLã§ãªã„å ´åˆã€ã“ã®é–¢æ•°ã¯SNI構造体ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ¡ãƒ³ãƒãƒ¼ã®ãƒã‚¤ãƒˆå€¤ã‚’è¿”ã—ã¾ã™ã€‚ \return 0 SNIオブジェクトãŒNULLã®å ´åˆ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -7187,8 +8373,9 @@ /*! \brief SSLセッションã§ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦æä¾›ã•ã‚Œã‚‹ã‚µãƒ¼ãƒãƒ¼åã®è¡¨ç¤ºã€‚ \return size æä¾›ã•ã‚ŒãŸSNIデータã®ã‚µã‚¤ã‚ºã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param type ã©ã®ç¨®é¡žã®ã‚µãƒ¼ãƒãƒ¼åãŒãƒ‡ãƒ¼ã‚¿å†…ã§å–å¾—ã•ã‚Œã¦ã„ã‚‹ã‹ã‚’示ã—ã¾ã™ã€‚既知ã®åž‹ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™ã€‚enum {wolfssl_sni_host_name = 0}; + _Example_ \code int ret = 0; @@ -7218,15 +8405,16 @@ unsigned char type, void** data); /*! - \ingroup Setup + \ingroup Setup \brief wolfsslセッションã«ALPNを設定ã—ã¾ã™ã€‚ - \return WOLFSSL_SUCCESS: æˆåŠŸã™ã‚‹ã¨ã€‚ + \return WOLFSSL_SUCCESS: æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG SSLã¾ãŸã¯PROTOCOL_NAME_LISTãŒNULLã¾ãŸã¯PROTOCOL_NAME_LISTSZãŒå¤§ãã™ãŽãŸã‚Šã€ã‚ªãƒ—ションãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ãªã„ã‚‚ã®ã‚’å«ã¿ã¾ã™ã€‚ \return MEMORY_ERROR プロトコルリストã®ãƒ¡ãƒ¢ãƒªã®å‰²ã‚Šå½“ã¦ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ - \return SSL_FAILURE 失敗ã™ã‚‹ã¨ã€‚ + \return SSL_FAILURE 失敗時ã«è¿”ã•ã‚Œã¾ã™ã€‚ \param ssl 使用ã™ã‚‹WolfSSLセッション。 \param protocol_name_list 使用ã™ã‚‹ãƒ—ロトコルåã®ãƒªã‚¹ãƒˆã€‚カンマ区切り文字列ãŒå¿…è¦ã§ã™ã€‚ \param protocol_name_listSz プロトコルåã®ãƒªã‚¹ãƒˆã®ã‚µã‚¤ã‚ºã€‚ + _Example_ \code wolfSSL_Init(); @@ -7251,17 +8439,18 @@ unsigned char options); /*! - \ingroup TLS + \ingroup TLS \brief ã“ã®é–¢æ•°ã¯ã€ã‚µãƒ¼ãƒãƒ¼ã«ã‚ˆã£ã¦è¨­å®šã•ã‚ŒãŸãƒ—ロトコルåã‚’å–å¾—ã—ã¾ã™ã€‚ \return SSL_SUCCESS エラーãŒæŠ•ã’られã¦ã„ãªã„正常ãªå®Ÿè¡Œã«æˆ»ã‚Šã¾ã—ãŸã€‚ \return SSL_FATAL_ERROR æ‹¡å¼µå­ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸå ´åˆã€ã¾ãŸã¯ãƒ”ã‚¢ã¨ãƒ—ロトコルãŒä¸€è‡´ã—ãªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚2ã¤ä»¥ä¸Šã®ãƒ—ロトコルåãŒå—ã‘入れられã¦ã„ã‚‹å ´åˆã¯ã€ã‚¹ãƒ­ãƒ¼ã•ã‚ŒãŸã‚¨ãƒ©ãƒ¼ã‚‚ã‚ã‚Šã¾ã™ã€‚ \return SSL_ALPN_NOT_FOUND ピアã¨ãƒ—ロトコルã®ä¸€è‡´ãŒè¦‹ã¤ã‹ã‚‰ãªã‹ã£ãŸã“ã¨ã‚’示ã™è¿”ã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG 関数ã«æ¸¡ã•ã‚ŒãŸnull引数ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param protocol_name プロトコルåを表ã™CHARã¸ã®ãƒã‚¤ãƒ³ã‚¿ã¯ã€ALPN構造ã«ä¿æŒã•ã‚Œã¾ã™ã€‚ + _Example_ \code - WOLFSSL_CTX* ctx = WOLFSSL_CTX_new( protocol method ); + WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); WOLFSSL* ssl = WOLFSSL_new(ctx); ... int err; @@ -7280,14 +8469,15 @@ unsigned short *size); /*! - \ingroup TLS + \ingroup TLS \brief ã“ã®é–¢æ•°ã¯ã€alpn_client_listデータをSSLオブジェクトã‹ã‚‰ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚SSLオブジェクトã®ALPN_CLIENT_LISTメンãƒãƒ¼ãŒLISTパラメータã«ã‚³ãƒ”ーã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG listã¾ãŸã¯listszパラメーターãŒnullã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BUFFER_ERROR リストãƒãƒƒãƒ•ã‚¡ã«å•é¡ŒãŒã‚ã‚‹å ´åˆã¯ï¼ˆNULLã¾ãŸã¯ã‚µã‚¤ã‚ºãŒ0ã®å ´åˆï¼‰ã«å•é¡ŒãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_ERROR リストãƒãƒƒãƒ•ã‚¡ã«å•é¡ŒãŒã‚ã‚‹å ´åˆã¯ï¼ˆNULLã¾ãŸã¯ã‚µã‚¤ã‚ºãŒ0ã®å ´åˆï¼‰ã«å•é¡ŒãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_ERROR メモリを動的ã«å‰²ã‚Šå½“ã¦ã‚‹å•é¡ŒãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param list ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚SSLオブジェクトã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ãŒã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ + _Example_ \code #import @@ -7312,10 +8502,11 @@ /*! \brief 'ssl'パラメータã«æ¸¡ã•ã‚ŒãŸSSLオブジェクト内ã®æœ€å¤§ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆé•·ã€‚ã“ã‚Œã¯ã€æœ€å¤§ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆé•·æ‹¡å¼µæ©Ÿèƒ½ãŒWolfSSLクライアントã«ã‚ˆã£ã¦ClientHelloã§é€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.SSLã¯NULLã€MFLã¯ç¯„囲外ã§ã™ã€‚ \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -7341,10 +8532,11 @@ /*! \brief SSLコンテキストã‹ã‚‰ä½œæˆã•ã‚ŒãŸSSLオブジェクトã®æœ€å¤§ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆé•·ã• 'ctx'パラメータã«æ¸¡ã•ã‚Œã¾ã—ãŸã€‚ã“ã‚Œã¯ã€æœ€å¤§ãƒ•ãƒ©ã‚°ãƒ¡ãƒ³ãƒˆé•·æ‹¡å¼µæ©Ÿèƒ½ãŒWolfSSLクライアントã«ã‚ˆã£ã¦ClientHelloã§é€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.CTXã¯NULLã€MFLã¯ç¯„囲外ã§ã™ã€‚ \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -7365,9 +8557,10 @@ /*! \brief 'ssl'パラメータã«æ¸¡ã•ã‚ŒãŸSSLオブジェクト内ã®truncated HMAC。ã“ã‚Œã¯ã€åˆ‡ã‚Šæ¨ã¦ã‚‰ã‚ŒãŸHMAC拡張機能ãŒWolfSSLクライアントã«ã‚ˆã£ã¦ClientHelloã§é€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.SSLã¯NULLã§ã™ \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -7393,9 +8586,10 @@ /*! \brief 'ctx'パラメータã«æ¸¡ã•ã‚ŒãŸSSLコンテキストã‹ã‚‰ä½œæˆã•ã‚ŒãŸSSLオブジェクトã®ãŸã‚ã®Truncated HMAC。ã“ã‚Œã¯ã€åˆ‡ã‚Šæ¨ã¦ã‚‰ã‚ŒãŸHMAC拡張機能ãŒWolfSSLクライアントã«ã‚ˆã£ã¦ClientHelloã§é€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.CTXã¯NULL \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret = 0; @@ -7417,10 +8611,11 @@ /*! \brief OCSPã§æ示ã•ã‚ŒãŸè¨¼æ˜Žæ›¸å¤±åŠ¹ãƒã‚§ãƒƒã‚¯ã®ã‚³ã‚¹ãƒˆã‚’下ã’ã¾ã™ã€‚ \return SSL_SUCCESS tlsx_usecertificateStatusRequestãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ã«ã‚¨ãƒ©ãƒ¼ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG NULLã¾ãŸã¯ãã®ä»–ã®ç‚¹ã§ã¯ã€é–¢æ•°ã«æ¸¡ã•ã‚ŒãŸå€¤ãŒæ¸¡ã•ã‚Œã‚‹å¼•æ•°ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param status_type tlsx_usecertificateSrequest()ã«æ¸¡ã•ã‚Œã€CertificateStatusRequest構造体ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—。 + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param status_type tlsx_usecertificateSrequest()ã«æ¸¡ã•ã‚Œã€CertificateStatusRequest構造体ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—。 + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -7437,12 +8632,13 @@ unsigned char status_type, unsigned char options); /*! - \brief + \brief \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return BAD_FUNC_ARG 未解決ã®å€¤ãŒã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã€wolfssl_ctx構造体ãŒNULLã¾ãŸã¯ãã†ã§ãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG 未解決ã®å€¤ãŒã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã€WOLFSSL_CTX構造体ãŒNULLã¾ãŸã¯ãã†ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E 関数ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ãŒãƒ¡ãƒ¢ãƒªã‚’æ­£ã—ã割り振るã“ã¨ãŒã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param status_type tlsx_usecertificateSrequest()ã«æ¸¡ã•ã‚Œã€CertificateStatusRequest構造体ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—。 + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param status_type tlsx_usecertificateSrequest()ã«æ¸¡ã•ã‚Œã€CertificateStatusRequest構造体ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—。 + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -7465,12 +8661,13 @@ unsigned char status_type, unsigned char options); /*! - \brief + \brief \return SSL_SUCCESS - 関数ã¨ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E - メモリエラーã®å‰²ã‚Šå½“ã¦ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG - NULLã¾ãŸã¯ãれ以外ã®å ´åˆã¯è§£èª­ã•ã‚Œã¦ã„ãªã„引数ãŒé–¢æ•°ã¾ãŸã¯ã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param status_type OCSPステータスタイプをロードã™ã‚‹ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—。 + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -7489,10 +8686,11 @@ /*! \brief OCSPステイプルã®ãŸã‚ã«ã€‚ \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã€‚ - \return BAD_FUNC_ARG wolfssl_ctx構造ãŒnullã®å ´åˆã€ã¾ãŸã¯å´æ•°å¤‰æ•°ãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL_CTX構造ãŒnullã®å ´åˆã€ã¾ãŸã¯å´æ•°å¤‰æ•°ãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§ã¯ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E メモリã®å‰²ã‚Šå½“ã¦ãŒå¤±æ•—ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param status_type CertificatStatusRequest構造体ã«ã‚ã‚‹ãƒã‚¤ãƒˆã‚¿ã‚¤ãƒ—ã§ã€wolfssl_csr2_ocspã¾ãŸã¯wolfssl_csr2_ocsp_multiã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -7512,10 +8710,11 @@ /*! \brief サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„る楕円曲線拡張å­ã¯ã€ 'SSL'パラメータã«æ¸¡ã•ã‚ŒãŸSSLオブジェクトã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るカーブãŒWolfSSLクライアントã«ã‚ˆã£ã¦ClientHelloã§é€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯è¤‡æ•°ã®æ›²ç·šã‚’有効ã«ã™ã‚‹ãŸã‚ã«è¤‡æ•°ã®æ™‚é–“ã¨å‘¼ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.SSLã¯NULLã§ã™ã€‚åå‰ã¯æœªçŸ¥ã®å€¤ã§ã™ã€‚(下記å‚照) \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -7541,10 +8740,11 @@ /*! \brief サãƒãƒ¼ãƒˆã•ã‚Œã¦ã„る楕円曲線ã¯ã€ 'ctx'パラメータã«æ¸¡ã•ã‚ŒãŸSSLコンテキストã‹ã‚‰ä½œæˆã•ã‚ŒãŸSSLオブジェクトã®æ‹¡å¼µå­ã§ã™ã€‚ã“ã‚Œã¯ã€ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るカーブãŒWolfSSLクライアントã«ã‚ˆã£ã¦ClientHelloã§é€ä¿¡ã•ã‚Œã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯è¤‡æ•°ã®æ›²ç·šã‚’有効ã«ã™ã‚‹ãŸã‚ã«è¤‡æ•°ã®æ™‚é–“ã¨å‘¼ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 次ã®ã„ãšã‚Œã‹ã®å ´åˆã«è¿”ã•ã‚Œã‚‹ã‚¨ãƒ©ãƒ¼ã§ã™.CTXã¯NULLã€åå‰ã¯æœªçŸ¥ã®å€¤ã§ã™ã€‚(下記å‚照) \return MEMORY_E å分ãªãƒ¡ãƒ¢ãƒªãŒãªã„ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸSSLコンテキストã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -7565,11 +8765,12 @@ word16 name); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€ä¾›çµ¦ã•ã‚ŒãŸWOLFSSL構造ã®å®‰å…¨ãªå†äº¤æ¸‰ã‚’強制ã—ã¾ã™ã€‚ã“ã‚Œã¯ãŠå‹§ã‚ã§ãã¾ã›ã‚“。 \return SSL_SUCCESS 安全ãªå†ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚’正常ã«è¨­å®šã—ã¾ã™ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ \return MEMORY_E 安全ãªå†äº¤æ¸‰ã®ãŸã‚ã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‹ã“ã¨ãŒã§ããªã„å ´åˆã€ã‚¨ãƒ©ãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code wolfSSL_Init(); @@ -7590,12 +8791,13 @@ int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯å®‰å…¨ãªå†äº¤æ¸‰ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’実行ã—ã¾ã™ã€‚ã“ã‚Œã¯ã€WolfSSLãŒã“ã®æ©Ÿèƒ½ã‚’妨ã’るよã†ã«å¼·åˆ¶ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl構造ãŒnullã¾ãŸã¯ãã†ã§ãªã‘ã‚Œã°ã€è¨±å®¹ã§ããªã„引数ãŒã‚µãƒ–ルーãƒãƒ³ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SECURE_RENEGOTIATION_E ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å†ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã™ã‚‹ã“ã¨ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR サーãƒãƒ¼ã¾ãŸã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ§‹æˆã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã¯ã€å†ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãŒå®Œäº†ã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚wolfssl_negotiate()をå‚ç…§ã—ã¦ãã ã•ã„。 + \return SECURE_RENEGOTIATION_E ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å†ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã™ã‚‹ã“ã¨ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR サーãƒãƒ¼ã¾ãŸã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ§‹æˆã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã¯ã€å†ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãŒå®Œäº†ã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚wolfssl_negotiate()ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + _Example_ \code WOLFSSL* ssl = wolfSSL_new(ctx); @@ -7614,11 +8816,12 @@ int wolfSSL_Rehandshake(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief セッションãƒã‚±ãƒƒãƒˆã‚’使用ã™ã‚‹ã‚ˆã†ã«WolfSSL構造を強制ã—ã¾ã™ã€‚定数hous_session_ticketを定義ã—ã€å®šæ•°NO_WOLFSSL_CLIENTã‚’ã“ã®é–¢æ•°ã‚’使用ã™ã‚‹ã‚ˆã†ã«å®šç¾©ã—ãªã„ã§ãã ã•ã„。 \return SSL_SUCCESS セッションãƒã‚±ãƒƒãƒˆã‚’使用ã—ãŸã‚»ãƒƒãƒˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E セッションãƒã‚±ãƒƒãƒˆã‚’設定ã™ã‚‹ãŸã‚ã®ãƒ¡ãƒ¢ãƒªã®å‰²ã‚Šå½“ã¦ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + _Example_ \code wolfSSL_Init(); @@ -7638,11 +8841,12 @@ int wolfSSL_UseSessionTicket(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã‚’使用ã™ã‚‹ã‚ˆã†ã«WolfSSLコンテキストを設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ã¯æ­£å¸¸ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG CTXãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E 内部関数内ã®ãƒ¡ãƒ¢ãƒªã®å‰²ã‚Šå½“ã¦ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ + _Example_ \code wolfSSL_Init(); @@ -7660,12 +8864,13 @@ int wolfSSL_CTX_UseSessionTicket(WOLFSSL_CTX* ctx); /*! - \ingroup IO + \ingroup IO \brief ã“ã®æ©Ÿèƒ½ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³æ§‹é€ ã®ãƒã‚±ãƒƒãƒˆãƒ¡ãƒ³ãƒãƒ¼ã‚’ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 引数ã®1ã¤ãŒNULLã®å ´åˆã€ã¾ãŸã¯bufsz引数ãŒ0ã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buf メモリãƒãƒƒãƒ•ã‚¡ã‚’表ã™ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -7685,12 +8890,13 @@ int wolfSSL_get_SessionTicket(WOLFSSL* ssl, unsigned char* buf, word32* bufSz); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€WolfSSL構造体内ã®wolfssl_session構造体ã®ãƒã‚±ãƒƒãƒˆãƒ¡ãƒ³ãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚関数ã«æ¸¡ã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ã¯ãƒ¡ãƒ¢ãƒªã«ã‚³ãƒ”ーã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 機能ã®å®Ÿè¡Œã«æˆåŠŸã—ãŸã“ã¨ã«æˆ»ã‚Šã¾ã™ã€‚関数ã¯ã‚¨ãƒ©ãƒ¼ãªã—ã§è¿”ã•ã‚Œã¾ã—ãŸã€‚ \return BAD_FUNC_ARG WolfSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚BUF引数ãŒNULLã®å ´åˆã¯ã€ã“ã‚Œã¯ã‚¹ãƒ­ãƒ¼ã•ã‚Œã¾ã™ãŒã€bufsz引数ã¯ã‚¼ãƒ­ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param buf セッション構造ã®ãƒã‚±ãƒƒãƒˆãƒ¡ãƒ³ãƒãƒ¼ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã‚‹ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -7711,8 +8917,9 @@ \brief CallbackSessionTicketã¯ã€int(* callbacksessionTicket)(wolfssl *ã€const unsigned char *ã€intã€void *)ã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG WolfSSL構造ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param cb Type CallbackSessionTicketã¸ã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -7730,12 +8937,41 @@ CallbackSessionTicket cb, void* ctx); /*! + \brief ã“ã®é–¢æ•°ã¯TLS1.3ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ãŒç¢ºç«‹ã—ãŸã‚ã¨ã§ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã‚’é€ä¿¡ã—ã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS セッションãƒã‚±ãƒƒãƒˆãŒé€ä¿¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG WOLFSSL構造体ãŒNULL,ã‚ã‚‹ã„ã¯TLS v1.3を使用ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SIDE_ERROR returned サーãƒãƒ¼å´ã§ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return NOT_READY_ERROR ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ãŒå®Œäº†ã—ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return WOLFSSL_FATAL_ERROR メッセージã®ç”Ÿæˆã‹é€ä¿¡ã«å¤±æ•—ã—ãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl wolfSSL_new()を使ã£ã¦ç”Ÿæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + _Example_ + \code + int ret; + WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); + WOLFSSL* ssl = wolfSSL_new(ctx); + … + ret = wolfSSL_send_SessionTicket(ssl); + if (ret != WOLFSSL_SUCCESS) { + // New session ticket not sent. + } + \endcode + + \sa wolfSSL_get_SessionTicket + \sa CallbackSessionTicket + \sa sessionTicketCB + */ +int wolfSSL_send_SessionTicket(WOLFSSL* ssl); + +/*! \brief RFC 5077ã§æŒ‡å®šã•ã‚Œã¦ã„るセッションãƒã‚±ãƒƒãƒˆã‚’サãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®ã‚µãƒ¼ãƒãƒ¼ãŒã€‚ \return SSL_SUCCESS セッションを正常ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ç„¡åŠ¹ãªå¼•æ•°ã‚’関数ã«æ¸¡ã™ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctxオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTXオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param cb セッションãƒã‚±ãƒƒãƒˆã‚’æš—å·åŒ–/復å·åŒ–ã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•° - \param ssl(Callback) WOLFSSL_NEW()ã§ä½œæˆã•ã‚ŒãŸWolfSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param ssl(Callback) wolfSSL_new()ã§ä½œæˆã•ã‚ŒãŸWolfSSLオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param key_name(Callback) ã“ã®ãƒã‚±ãƒƒãƒˆã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ä¸€æ„ã®ã‚­ãƒ¼åã¯ãƒ©ãƒ³ãƒ€ãƒ ã«ç”Ÿæˆã•ã‚Œã‚‹ã¹ãã§ã™ \param iv(Callback) ユニークãªIVã“ã®ãƒã‚±ãƒƒãƒˆã®å ´åˆã€æœ€å¤§128ビットã€ãƒ©ãƒ³ãƒ€ãƒ ã«ç”Ÿæˆã•ã‚Œã‚‹ã¹ãã§ã™ \param mac(Callback) ã“ã®ãƒã‚±ãƒƒãƒˆã®æœ€å¤§256ビットMAC @@ -7743,6 +8979,7 @@ \param ticket(Callback) æš—å·åŒ–ãƒã‚±ãƒƒãƒˆã®å…¥å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡ã€‚ENCパラメータをå‚ç…§ã—ã¦ãã ã•ã„ \param inLen(Callback) ãƒã‚±ãƒƒãƒˆãƒ‘ラメータã®å…¥åŠ›é•· \param outLen(Callback) ãƒã‚±ãƒƒãƒˆãƒ‘ラメータã®çµæžœã®å‡ºåŠ›é•·ã€‚コールãƒãƒƒã‚¯outlenを入力ã™ã‚‹ã¨ã€ãƒã‚±ãƒƒãƒˆãƒãƒƒãƒ•ã‚¡ã§ä½¿ç”¨å¯èƒ½ãªæœ€å¤§ã‚µã‚¤ã‚ºãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ + _Example_ \code See wolfssl/test.h myTicketEncCb() used by the example @@ -7758,7 +8995,8 @@ \brief サーãƒãƒ¼ã‚µã‚¤ãƒ‰ã®ä½¿ç”¨ã®ãŸã‚ã«ã€‚ \return SSL_SUCCESS セッションを正常ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ç„¡åŠ¹ãªå¼•æ•°ã‚’関数ã«æ¸¡ã™ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctxオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTXオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code none @@ -7771,7 +9009,8 @@ \brief 折り返ã—電話。サーãƒãƒ¼ã‚µã‚¤ãƒ‰ã®ä½¿ç”¨ã®ãŸã‚ã«ã€‚ \return SSL_SUCCESS セッションを正常ã«è¨­å®šã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ç„¡åŠ¹ãªå¼•æ•°ã‚’関数ã«æ¸¡ã™ã“ã¨ã«ã‚ˆã£ã¦ç™ºç”Ÿã—ã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctxオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTXオブジェクトã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code none @@ -7784,6 +9023,7 @@ \brief 折り返ã—電話。サーãƒãƒ¼ã‚µã‚¤ãƒ‰ã®ä½¿ç”¨ã®ãŸã‚ã«ã€‚ \return userCtx セッションを正常ã«å–å¾—ã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ \return NULL 失敗ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ç„¡åŠ¹ãªå¼•æ•°ã‚’関数ã«æ¸¡ã™ã“ã¨ã«ã‚ˆã£ã¦ã€ã¾ãŸã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒè¨­å®šã•ã‚Œã¦ã„ãªã„ã¨ãã«ç™ºç”Ÿã—ã¾ã™ã€‚ + _Example_ \code none @@ -7796,8 +9036,9 @@ \brief ã“ã®æ©Ÿèƒ½ã«ã¯ã€WolfSSL構造ã®HSDonectxメンãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚WolfSSL構造体ã®HSDONECBã¨HSDonectxメンãƒãƒ¼ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ \return BAD_FUNC_ARG wolfssl構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param cb int(* HandshakedOneCB)(wolfssl *ã€void *)ã®ç½²åã‚’æŒã¤ã‚¿ã‚¤ãƒ—HandshakedOneCBã®é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -7814,11 +9055,12 @@ int wolfSSL_SetHsDoneCb(WOLFSSL* ssl, HandShakeDoneCb cb, void* user_ctx); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‹ã‚‰çµ±è¨ˆã‚’å°åˆ·ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§æˆ»ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚セッション統計ã¯æ­£å¸¸ã«å–å¾—ã•ã‚Œå°åˆ·ã•ã‚Œã¾ã—ãŸã€‚ - \return BAD_FUNC_ARG サブルーãƒãƒ³wolfssl_get_session_stats()ãŒè¨±å®¹ã§ããªã„引数ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG サブルーãƒãƒ³wolfssl_get_session_stats()ãŒè¨±å®¹ã§ããªã„引数ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_MUTEX_E サブルーãƒãƒ³ã«ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code // You will need to have a session object to retrieve stats from. @@ -7832,14 +9074,15 @@ int wolfSSL_PrintSessionStats(void); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®çµ±è¨ˆã‚’å–å¾—ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ã¨ã‚µãƒ–ルーãƒãƒ³ãŒã‚¨ãƒ©ãƒ¼ãªã—ã§æˆ»ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚セッション統計ã¯æ­£å¸¸ã«å–å¾—ã•ã‚Œå°åˆ·ã•ã‚Œã¾ã—ãŸã€‚ - \return BAD_FUNC_ARG サブルーãƒãƒ³wolfssl_get_session_stats()ãŒè¨±å®¹ã§ããªã„引数ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG サブルーãƒãƒ³wolfssl_get_session_stats()ãŒè¨±å®¹ã§ããªã„引数ã«æ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_MUTEX_E サブルーãƒãƒ³ã«ãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹ã‚¨ãƒ©ãƒ¼ãŒã‚ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param active ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®åˆè¨ˆã‚’表ã™Word32ãƒã‚¤ãƒ³ã‚¿ã€‚ \param total ç·ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’表ã™Word32ãƒã‚¤ãƒ³ã‚¿ã€‚ \param peak ピークセッションを表ã™Word32ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int wolfSSL_PrintSessionStats(void){ @@ -7857,10 +9100,10 @@ unsigned int* maxSessions); /*! - \ingroup TLS + \ingroup TLS \brief ã“ã®é–¢æ•°ã¯CRã¨SRã®å€¤ã‚’コピーã—ã¦ã‹ã‚‰WC_PRF(疑似ランダム関数)ã«æ¸¡ã—ã€ãã®å€¤ã‚’è¿”ã—ã¾ã™ã€‚ \return 0 æˆåŠŸã—㟠- \return BUFFER_E ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return BUFFER_E ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_E サブルーãƒãƒ³ãŒå‹•çš„メモリを割り当ã¦ã‚‹ã“ã¨ãŒã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \param ms マスターシークレットã¯ã‚¢ãƒ¬ã‚¤æ§‹é€ ã«ä¿æŒã•ã‚Œã¦ã„ã¾ã™ã€‚ \param msLen マスターシークレットã®é•·ã•ã€‚ @@ -7869,6 +9112,7 @@ \param cr クライアントã®ãƒ©ãƒ³ãƒ€ãƒ  \param sr サーãƒãƒ¼ã®ãƒ©ãƒ³ãƒ€ãƒ ã§ã™ã€‚ \param tls1_2 ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå°‘ãªãã¨ã‚‚TLSãƒãƒ¼ã‚¸ãƒ§ãƒ³1.2ã§ã‚ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -7897,7 +9141,7 @@ int tls1_2, int hash_type); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief TLSキーを導ã出ã™ãŸã‚ã®å¤–部ã®ãƒ©ãƒƒãƒ‘ー。 \return 0 æˆåŠŸã«æˆ»ã‚Šã¾ã—ãŸã€‚ \return BUFFER_E LABLENã¨SEADLENã®åˆè¨ˆï¼ˆåˆè¨ˆã‚µã‚¤ã‚ºã‚’計算)ãŒæœ€å¤§ã‚µã‚¤ã‚ºã‚’超ãˆã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ @@ -7908,7 +9152,8 @@ \param msLen 列挙ã•ã‚ŒãŸå®šç¾©ã§ã€ãƒžã‚¹ã‚¿ãƒ¼ã‚·ãƒ¼ã‚¯ãƒ¬ãƒƒãƒˆã®é•·ã•ã‚’ä¿æŒã™ã‚‹Word32タイプ。 \param sr WOLFSSL構造内ã®é…列構造ã®ServerRandomメンãƒãƒ¼ã¸ã®å®šæ•°ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ \param cr WolfSSL構造内ã®é…列構造ã®ClientRandomメンãƒãƒ¼ã¸ã®å®šæ•°ãƒã‚¤ãƒˆãƒã‚¤ãƒ³ã‚¿ã€‚ - \param tls1_2 ISATLEASTLSV1_2()ã‹ã‚‰è¿”ã•ã‚ŒãŸæ•´æ•°åž‹ã€‚ + \param tls1_2 ISATLEASTLSV1_2()ã‹ã‚‰è¿”ã•ã‚ŒãŸæ•´æ•°åž‹ã€‚ + _Example_ \code int DeriveTlsKeys(WOLFSSL* ssl){ @@ -7932,11 +9177,12 @@ /*! \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ãŒè¨­å®šã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ãƒ‡ãƒãƒƒã‚¬ãŒåˆ©ç”¨ã§ããšã€ã‚¹ãƒ‹ãƒƒãƒ•ã‚£ãƒ³ã‚°ãŒå®Ÿç”¨çš„ã§ã¯ãªã„å ´åˆã«ã€ã‚µãƒãƒ¼ãƒˆã‚’デãƒãƒƒã‚°ã™ã‚‹ãŸã‚ã®çµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ ã§å½¹ç«‹ã¡ã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‹å¦ã‹ãŒå‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚SSLパケットã®æœ€å¤§æ•°ãŒæ—¢çŸ¥ã§ã‚ã‚‹ãŸã‚ã€å‹•çš„メモリã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。パケットåã‚’PacketNames []ã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚接続拡張機能ã¯ã€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤ã¨ã¨ã‚‚ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã‚Œã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒTCPスタックをタイムアウトã™ã‚‹ã®ã‚’å¾…ã£ãŸããªã„å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ã“ã®æ‹¡å¼µå­ã¯ã€ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã®ã©ã¡ã‚‰ã‹ã€ã¾ãŸã¯ã©ã¡ã‚‰ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚‚呼ã³å‡ºã•ã‚Œã¾ã›ã‚“。 - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return GETTIME_ERROR gettimeofday()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ - \return SETITIMER_ERROR setItimer()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ - \return SIGACT_ERROR sigAction()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR 基ã«ãªã‚‹ssl_connect()呼ã³å‡ºã—ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return GETTIME_ERROR gettimeofday()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + \return SETITIMER_ERROR setItimer()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + \return SIGACT_ERROR sigAction()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR 基ã«ãªã‚‹ssl_connect()呼ã³å‡ºã—ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code none @@ -7948,11 +9194,12 @@ /*! \brief 設定ã™ã‚‹ã€‚ã“ã‚Œã¯ã€ãƒ‡ãƒãƒƒã‚¬ãŒåˆ©ç”¨ã§ããšã€ã‚¹ãƒ‹ãƒƒãƒ•ã‚£ãƒ³ã‚°ãŒå®Ÿç”¨çš„ã§ã¯ãªã„å ´åˆã«ã€ã‚µãƒãƒ¼ãƒˆã‚’デãƒãƒƒã‚°ã™ã‚‹ãŸã‚ã®çµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ ã§å½¹ç«‹ã¡ã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‹å¦ã‹ãŒå‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚SSLパケットã®æœ€å¤§æ•°ãŒæ—¢çŸ¥ã§ã‚ã‚‹ãŸã‚ã€å‹•çš„メモリã¯ä½¿ç”¨ã•ã‚Œã¾ã›ã‚“。パケットåã‚’PacketNames []ã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚接続拡張機能ã¯ã€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆå€¤ã¨ã¨ã‚‚ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã‚Œã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒTCPスタックをタイムアウトã™ã‚‹ã®ã‚’å¾…ã£ãŸããªã„å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ã“ã®æ‹¡å¼µå­ã¯ã€ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã®ã©ã¡ã‚‰ã‹ã€ã¾ãŸã¯ã©ã¡ã‚‰ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚‚呼ã³å‡ºã•ã‚Œã¾ã›ã‚“。 - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return GETTIME_ERROR gettimeofday()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ - \return SETITIMER_ERROR setItimer()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ - \return SIGACT_ERROR sigAction()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR 基礎ã¨ãªã‚‹ssl_accept()呼ã³å‡ºã—ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return GETTIME_ERROR gettimeofday()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + \return SETITIMER_ERROR setItimer()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + \return SIGACT_ERROR sigAction()ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã€è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR 基礎ã¨ãªã‚‹ssl_accept()呼ã³å‡ºã—ãŒã‚¨ãƒ©ãƒ¼ã‚’検出ã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code none @@ -7963,12 +9210,13 @@ TimeoutCallBack toCb, WOLFSSL_TIMEVAL timeout); /*! - \ingroup IO + \ingroup IO \brief ã“ã‚Œã¯BIOã®å†…部ファイルãƒã‚¤ãƒ³ã‚¿ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS ファイルãƒã‚¤ãƒ³ã‚¿ã‚’正常ã«è¨­å®šã—ã¾ã™ã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ - \param bio ペアを設定ã™ã‚‹ãŸã‚ã®wolfssl_bio構造。 + \param bio ペアを設定ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造体。 \param fp ãƒã‚¤ã‚ªã§è¨­å®šã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -7986,11 +9234,12 @@ long wolfSSL_BIO_set_fp(WOLFSSL_BIO *bio, XFILE fp, int c); /*! - \ingroup IO - \brief ã“ã‚Œã¯ã€BIOã®å†…部ファイルãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \ingroup IO +\brief ã“ã®é–¢æ•°ã¯ã€ \brief ã“ã‚Œã¯ã€BIOã®å†…部ファイルãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS ファイルãƒã‚¤ãƒ³ã‚¿ã‚’正常ã«å–å¾—ã—ã¾ã™ã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ - \param bio ペアを設定ã™ã‚‹ãŸã‚ã®wolfssl_bio構造。 + \param bio ペアを設定ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造体。 + _Example_ \code WOLFSSL_BIO* bio; @@ -8008,11 +9257,12 @@ long wolfSSL_BIO_get_fp(WOLFSSL_BIO *bio, XFILE* fp); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€ç§˜å¯†éµãŒä½¿ç”¨ã•ã‚Œã¦ã„る証明書ã¨ã®ä¸€è‡´ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¾ã™ã€‚ \return SSL_SUCCESS ã†ã¾ã一致ã—ã¾ã™ã€‚ \return SSL_FAILURE エラーケースã«é­é‡ã—ãŸå ´åˆ \return <0 ssl_failure以外ã®ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã‚±ãƒ¼ã‚¹ã¯è² ã®å€¤ã§ã™ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -8027,12 +9277,13 @@ int wolfSSL_check_private_key(const WOLFSSL* ssl); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®æ©Ÿèƒ½ã¯ã€æ¸¡ã•ã‚ŒãŸNID値ã«ä¸€è‡´ã™ã‚‹æ‹¡å¼µç´¢å¼•ã‚’探ã—ã¦è¿”ã—ã¾ã™ã€‚ - \return >= 0拡張インデックスãŒæˆåŠŸã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return >= 0拡張インデックスãŒæˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return -1 æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆ \param x509 æ‹¡å¼µã®ãŸã‚ã«è§£æžã™ã‚‹è¨¼æ˜Žæ›¸ã€‚ \param nid 見ã¤ã‹ã‚‹æ‹¡å¼µOID。 + _Example_ \code const WOLFSSL_X509* x509; @@ -8046,13 +9297,14 @@ int nid, int lastPos); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€æ¸¡ã•ã‚ŒãŸNID値ã«åˆã£ãŸæ‹¡å¼µå­ã‚’探ã—ã¦è¿”ã—ã¾ã™ã€‚ - \return pointer STACK_OF(wolfssl_asn1_object)ãƒã‚¤ãƒ³ã‚¿ãŒæˆåŠŸã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return pointer STACK_OF(wolfssl_asn1_object)ãƒã‚¤ãƒ³ã‚¿ãŒæˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return NULL æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆ \param x509 æ‹¡å¼µã®ãŸã‚ã«è§£æžã™ã‚‹è¨¼æ˜Žæ›¸ã€‚ \param nid 見ã¤ã‹ã‚‹æ‹¡å¼µOID。 \param c not nullãŒè¤‡æ•°ã®æ‹¡å¼µå­ã«-2ã«è¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã¯-1ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ + _Example_ \code const WOLFSSL_X509* x509; @@ -8069,13 +9321,14 @@ int nid, int* c, int* idx); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯DER証明書ã®ãƒãƒƒã‚·ãƒ¥ã‚’è¿”ã—ã¾ã™ã€‚ \return SSL_SUCCESS ãƒãƒƒã‚·ãƒ¥ã®ä½œæˆã«æˆåŠŸã—ã¾ã—ãŸã€‚ \return SSL_FAILURE ä¸è‰¯å…¥åŠ›ã¾ãŸã¯å¤±æ•—ã—ãŸãƒãƒƒã‚·ãƒ¥ã«æˆ»ã‚Šã¾ã—ãŸã€‚ \param x509 ãƒãƒƒã‚·ãƒ¥ã‚’å¾—ã‚‹ãŸã‚ã®è¨¼æ˜Žæ›¸ã€‚ \param digest 使用ã™ã‚‹ãƒãƒƒã‚·ãƒ¥ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ  \param buf ãƒãƒƒã‚·ãƒ¥ã‚’ä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + _Example_ \code WOLFSSL_X509* x509; @@ -8092,11 +9345,12 @@ const WOLFSSL_EVP_MD* digest, unsigned char* buf, unsigned int* len); /*! - \ingroup Setup + \ingroup Setup \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ã€WolfSSL構造ã®è¨¼æ˜Žæ›¸ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 設定ã®æˆåŠŸã—ãŸå¼•æ•°ã«ã¤ã„ã¦ã€‚ \return SSL_FAILURE NULL引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ \param ssl 証明書を設定ã™ã‚‹ãŸã‚ã®WolfSSL構造。 + _Example_ \code WOLFSSL* ssl; WOLFSSL_X509* x509 @@ -8111,12 +9365,13 @@ int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€handshakeã®é–“ã«ä½¿ç”¨ã™ã‚‹ãŸã‚ã«WolfSSL構造ã®è¨¼æ˜Žæ›¸ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚DERフォーマットãƒãƒƒãƒ•ã‚¡ãŒäºˆæƒ³ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \biiã“fã¯ã€ã“ã®é–¢æ•°ã¯ã€handshakeã®é–“ã«ä½¿ç”¨ã™ã‚‹ãŸã‚ã«WolfSSL構造ã®è¨¼æ˜Žæ›¸ã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚DERフォーマットãƒãƒƒãƒ•ã‚¡ãŒäºˆæƒ³ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 設定ã®æˆåŠŸã—ãŸå¼•æ•°ã«ã¤ã„ã¦ã€‚ \return SSL_FAILURE NULL引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ \param ssl 証明書を設定ã™ã‚‹ãŸã‚ã®WolfSSL構造。 \param der 使用ã™ã‚‹è¨¼æ˜Žæ›¸ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -8134,11 +9389,12 @@ int derSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã‚Œã¯WolfSSL構造ã®ç§˜å¯†éµã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 設定ã®æˆåŠŸã—ãŸå¼•æ•°ã«ã¤ã„ã¦ã€‚ \return SSL_FAILURE NULL SSLãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã‚±ãƒ¼ã‚¹ã¯è² ã®å€¤ã«ãªã‚Šã¾ã™ã€‚ \param ssl 引数を設定ã™ã‚‹ãŸã‚ã®WolfSSL構造。 + _Example_ \code WOLFSSL* ssl; @@ -8154,13 +9410,14 @@ int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã‚Œã¯WolfSSL構造ã®ç§˜å¯†éµã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚DERフォーマットã®ã‚­ãƒ¼ãƒãƒƒãƒ•ã‚¡ãŒäºˆæƒ³ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 秘密éµã®æ§‹æ–‡è§£æžã¨è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã€‚ \return SSL_FAILURE NULL SSLãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã‚±ãƒ¼ã‚¹ã¯è² ã®å€¤ã«ãªã‚Šã¾ã™ã€‚ \param pri 秘密éµã®ç¨®é¡žã€‚ \param ssl 引数を設定ã™ã‚‹ãŸã‚ã®WolfSSL構造。 \param der ãƒãƒƒãƒ•ã‚¡ãƒ¼ä¿æŒDERキー。 + _Example_ \code WOLFSSL* ssl; @@ -8179,12 +9436,13 @@ unsigned char* der, long derSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã‚Œã¯WolfSSL構造ã®ç§˜å¯†éµã‚’設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚DERフォーマットã®RSAキーãƒãƒƒãƒ•ã‚¡ãŒäºˆæƒ³ã•ã‚Œã¾ã™ã€‚ \return SSL_SUCCESS 秘密éµã®æ§‹æ–‡è§£æžã¨è¨­å®šã«æˆåŠŸã—ãŸå ´åˆã€‚ \return SSL_FAILURE NULL SSLãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã‚±ãƒ¼ã‚¹ã¯è² ã®å€¤ã«ãªã‚Šã¾ã™ã€‚ \param ssl 引数を設定ã™ã‚‹ãŸã‚ã®WolfSSL構造。 \param der ãƒãƒƒãƒ•ã‚¡ãƒ¼ä¿æŒDERキー。 + _Example_ \code WOLFSSL* ssl; @@ -8203,10 +9461,11 @@ long derSz); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€DSAã®ãƒ‘ラメータを新ã—ã作æˆã•ã‚ŒãŸWOLFSSL_DH構造体ã«é‡è¤‡ã—ã¦ã„ã¾ã™ã€‚ \return WOLFSSL_DH é‡è¤‡ã—ãŸå ´åˆã¯WolfSSL_DH構造体を返ã™å ´åˆ \return NULL 失敗ã™ã‚‹ã¨ + _Example_ \code WOLFSSL_DH* dh; @@ -8221,13 +9480,14 @@ WOLFSSL_DH *wolfSSL_DSA_dup_DH(const WOLFSSL_DSA *r); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã‚Œã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’完了ã—ãŸå¾Œã«ãƒžã‚¹ã‚¿ãƒ¼ã‚­ãƒ¼ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return >0 データã®å–å¾—ã«æˆåŠŸã—ãŸå ´åˆã€0より大ãã„値を返ã—ã¾ã™ã€‚ \return 0 ランダムãªãƒ‡ãƒ¼ã‚¿ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ãŒè¿”ã•ã‚Œãªã„å ´åˆã¯0 \return max 渡ã•ã‚ŒãŸOUTSZãŒ0ã®å ´åˆã€å¿…è¦ãªæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ã€‚ \param ses マスターシークレットãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®WolfSSL_SESSION構造。 \param out データをä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + _Example_ \code WOLFSSL_SESSION ssl; @@ -8247,9 +9507,10 @@ unsigned char* out, int outSz); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã‚Œã¯ãƒžã‚¹ã‚¿ãƒ¼ç§˜å¯†éµã®é•·ã•ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return size マスターシークレットキーサイズを返ã—ã¾ã™ã€‚ + _Example_ \code WOLFSSL_SESSION ssl; @@ -8267,10 +9528,11 @@ int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€CTXã®WOLFSSL_X509_STORE構造ã®è¨­å®šæ©Ÿèƒ½ã§ã™ã€‚ + \ingroup Setup + \bri f ã“ã®é–¢æ•°ã¯ã€ã‚Œã¯ã€CTXã®WOLFSSL_X509_STORE構造ã®è¨­å®šæ©Ÿèƒ½ã§ã™ã€‚ \return none è¿”å“ä¸å¯ã€‚ \param ctx Cert Storeãƒã‚¤ãƒ³ã‚¿ã‚’設定ã™ã‚‹ãŸã‚ã®WolfSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX ctx; @@ -8286,11 +9548,12 @@ WOLFSSL_X509_STORE* str); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯BIOã‹ã‚‰DERãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã—ã€ãれをWolfSSL_X509構造ã«å¤‰æ›ã—ã¾ã™ã€‚ \return pointer æˆåŠŸã—ãŸwolfssl_x509構造ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return Null 失敗時ã«NULLã‚’è¿”ã—ã¾ã™ - \param bio DER証明書ãƒãƒƒãƒ•ã‚¡ã‚’æŒã¤wolfssl_bio構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param bio DER証明書ãƒãƒƒãƒ•ã‚¡ã‚’æŒã¤WOLFSSL_BIO構造体体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -8306,10 +9569,11 @@ WOLFSSL_X509* wolfSSL_d2i_X509_bio(WOLFSSL_BIO* bio, WOLFSSL_X509** x509); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€CTXã®WOLFSSL_X509_STORE構造ã®ã‚²ãƒƒã‚¿ãƒ¼é–¢æ•°ã§ã™ã€‚ + \ingroup Setup + \bri f ã“ã®é–¢æ•°ã¯ã€ã‚Œã¯ã€CTXã®WOLFSSL_X509_STORE構造ã®ã‚²ãƒƒã‚¿ãƒ¼é–¢æ•°ã§ã™ã€‚ \return WOLFSSL_X509_STORE* ãƒã‚¤ãƒ³ã‚¿ã‚’正常ã«å…¥æ‰‹ã—ã¾ã™ã€‚ \return NULL NULL引数ãŒæ¸¡ã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX ctx; @@ -8325,9 +9589,10 @@ WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx); /*! - \ingroup IO + \ingroup IO \brief ä¿ç•™ä¸­ã®ãƒã‚¤ãƒˆæ•°ã‚’読ã¿å–ã‚‹æ•°ã‚’å–å¾—ã—ã¾ã™ã€‚BIOタイプãŒBIO_BIOã®å ´åˆã€ãƒšã‚¢ã‹ã‚‰èª­ã¿å–る番å·ã§ã™ã€‚BIOã«SSLオブジェクトãŒå«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€SSLオブジェクトã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿ç•™ä¸­ã§ã™ï¼ˆWolfSSL_Pending(SSL))。bio_memoryタイプãŒã‚ã‚‹å ´åˆã¯ã€ãƒ¡ãƒ¢ãƒªãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã‚’è¿”ã—ã¾ã™ã€‚ \return >=0 ä¿ç•™ä¸­ã®ãƒã‚¤ãƒˆæ•°ã€‚ + _Example_ \code WOLFSSL_BIO* bio; @@ -8342,13 +9607,14 @@ size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO *b); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã«ã‚ˆã£ã¦é€ä¿¡ã•ã‚ŒãŸãƒ©ãƒ³ãƒ€ãƒ ãªãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \biiefã¯ã€ã“ã®é–¢æ•°ã¯ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã«ã‚ˆã£ã¦é€ä¿¡ã•ã‚ŒãŸãƒ©ãƒ³ãƒ€ãƒ ãªãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return >0 データã®å–å¾—ã«æˆåŠŸã—ãŸå ´åˆã€0より大ãã„値を返ã—ã¾ã™ã€‚ \return 0 ランダムãªãƒ‡ãƒ¼ã‚¿ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ãŒè¿”ã•ã‚Œãªã„å ´åˆã¯0 \return max 渡ã•ã‚ŒãŸOUTSZãŒ0ã®å ´åˆã€å¿…è¦ãªæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ã€‚ \param ssl クライアントã®ãƒ©ãƒ³ãƒ€ãƒ ãƒ‡ãƒ¼ã‚¿ãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®WolfSSL構造。 \param out ランダムデータをä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + _Example_ \code WOLFSSL ssl; @@ -8367,13 +9633,14 @@ unsigned char *out, size_t outlen); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦é€ä¿¡ã•ã‚ŒãŸãƒ©ãƒ³ãƒ€ãƒ ãªãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \ingroup Setup + \biiefã¯ã€ã“ã®é–¢æ•°ã¯ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦é€ä¿¡ã•ã‚ŒãŸãƒ©ãƒ³ãƒ€ãƒ ãªãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ \return >0 データã®å–å¾—ã«æˆåŠŸã—ãŸå ´åˆã€0より大ãã„値を返ã—ã¾ã™ã€‚ \return 0 ランダムãªãƒ‡ãƒ¼ã‚¿ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ãŒè¿”ã•ã‚Œãªã„å ´åˆã¯0 \return max 渡ã•ã‚ŒãŸOUTSZãŒ0ã®å ´åˆã€å¿…è¦ãªæœ€å¤§ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºãŒè¿”ã•ã‚Œã¾ã™ã€‚ \param ssl クライアントã®ãƒ©ãƒ³ãƒ€ãƒ ãƒ‡ãƒ¼ã‚¿ãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®WolfSSL構造。 \param out ランダムデータをä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ + _Example_ \code WOLFSSL ssl; @@ -8392,10 +9659,11 @@ unsigned char* out, size_t outSz); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã‚Œã¯CTXã§è¨­å®šã•ã‚ŒãŸãƒ‘スワードコールãƒãƒƒã‚¯ã®ã‚²ãƒƒã‚¿ãƒ¼é–¢æ•°ã§ã™ã€‚ \return func æˆåŠŸã™ã‚‹ã¨ã€ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯é–¢æ•°ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL CTXãŒNULLã®å ´åˆã€NULLãŒè¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx; @@ -8411,10 +9679,11 @@ ctx); /*! - \ingroup Setup - \brief ã“ã‚Œã¯ã€CTXã§è¨­å®šã•ã‚Œã¦ã„るパスワードコールãƒãƒƒã‚¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ‡ãƒ¼ã‚¿ã®å–得機能ã§ã™ã€‚ + \ingroup Setup + \bri f ã“ã®é–¢æ•°ã¯ã€ã‚Œã¯ã€CTXã§è¨­å®šã•ã‚Œã¦ã„るパスワードコールãƒãƒƒã‚¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ‡ãƒ¼ã‚¿ã®å–得機能ã§ã™ã€‚ \return pointer æˆåŠŸã™ã‚‹ã¨ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ‡ãƒ¼ã‚¿ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ \return NULL CTXãŒNULLã®å ´åˆã€NULLãŒè¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx; @@ -8429,13 +9698,14 @@ void *wolfSSL_CTX_get_default_passwd_cb_userdata(WOLFSSL_CTX *ctx); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯wolfssl_pem_read_bio_x509ã¨åŒã˜ã‚ˆã†ã«å‹•ä½œã—ã¾ã™ã€‚AUXã¯ã€ä¿¡é ¼ã§ãã‚‹/æ‹’å¦ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã‚„人間ã®èª­ã¿ã‚„ã™ã•ã®ãŸã‚ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãƒªãƒ¼ãªåå‰ãªã©ã®è¿½åŠ æƒ…報をå«ã‚€ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ \return WOLFSSL_X509 PEMãƒãƒƒãƒ•ã‚¡ã®è§£æžã«æˆåŠŸã—ãŸå ´åˆã€wolfssl_x509構造ãŒè¿”ã•ã‚Œã¾ã™ã€‚ \return Null PEMãƒãƒƒãƒ•ã‚¡ã®è§£æžã«å¤±æ•—ã—ãŸå ´åˆã€‚ - \param bp wolfssl_bio構造体ã‹ã‚‰PEMãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã—ã¾ã™ã€‚ + \param bp WOLFSSL_BIO構造体体ã‹ã‚‰PEMãƒãƒƒãƒ•ã‚¡ã‚’å–å¾—ã—ã¾ã™ã€‚ \param x wolfssl_x509を機能副作用ã§è¨­å®šã™ã‚‹å ´åˆ \param cb パスワードコールãƒãƒƒã‚¯ + _Example_ \code WOLFSSL_BIO* bio; @@ -8450,13 +9720,14 @@ (WOLFSSL_BIO *bp, WOLFSSL_X509 **x, wc_pem_password_cb *cb, void *u); /*! - \ingroup CertsKeys - \brief wolfssl_ctx構造体ã®DHメンãƒãƒ¼ã‚’diffie-hellmanパラメータã§åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief WOLFSSL_CTX構造体ã®DHメンãƒãƒ¼ã‚’diffie-hellmanパラメータã§åˆæœŸåŒ–ã—ã¾ã™ã€‚ \return SSL_SUCCESS 関数ãŒæ­£å¸¸ã«å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return BAD_FUNC_ARG CTXã¾ãŸã¯DH構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \return SSL_FATAL_ERROR 構造値を設定ã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \return MEMORY_E メモリを割り当ã¦ã‚‹ã“ã¨ãŒã§ããªã‹ã£ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ - \param ctx wolfssl_ctx_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return SSL_FATAL_ERROR 構造値を設定ã™ã‚‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E メモリを割り当ã¦ã‚‹ã“ã¨ãŒã§ããªã‹ã£ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx wolfSSL_CTX_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -8469,13 +9740,14 @@ long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€BIOã®PEMãƒãƒƒãƒ•ã‚¡ã‹ã‚‰DSAパラメータをå–å¾—ã—ã¾ã™ã€‚ \return WOLFSSL_DSA PEMãƒãƒƒãƒ•ã‚¡ã®è§£æžã«æˆåŠŸã—ãŸå ´åˆã€WolfSSL_DSA構造ãŒä½œæˆã•ã‚Œã€è¿”ã•ã‚Œã¾ã™ã€‚ \return Null PEMãƒãƒƒãƒ•ã‚¡ã®è§£æžã«å¤±æ•—ã—ãŸå ´åˆã€‚ - \param bio PEMメモリãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®wolfssl_bio構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param bio PEMメモリãƒã‚¤ãƒ³ã‚¿ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®WOLFSSL_BIO構造体体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param x æ–°ã—ã„WolfSSL_DSA構造ã«è¨­å®šã™ã‚‹ãƒã‚¤ãƒ³ã‚¿ã€‚ \param cb パスワードコールãƒãƒƒã‚¯é–¢æ•° + _Example_ \code WOLFSSL_BIO* bio; @@ -8491,9 +9763,10 @@ WOLFSSL_DSA **x, wc_pem_password_cb *cb, void *u); /*! - \ingroup Debug + \ingroup Debug \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_Errorã«é­é‡ã—ãŸæœ€å¾Œã®ã‚¨ãƒ©ãƒ¼ã®çµ¶å¯¾å€¤ã‚’è¿”ã—ã¾ã™ã€‚ \return error 最後ã®ã‚¨ãƒ©ãƒ¼ã®çµ¶å¯¾å€¤ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code unsigned long err; @@ -8506,10 +9779,11 @@ unsigned long wolfSSL_ERR_peek_last_error(void); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ãƒ”ã‚¢ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã‚’å–å¾—ã—ã¾ã™ã€‚ \return pointer ピアã®è¨¼æ˜Žæ›¸ã‚¹ã‚¿ãƒƒã‚¯ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ - \return NULL ピア証明書ãŒãªã„å ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚ + \return NULL ピア証明書ãŒãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method ); @@ -8528,9 +9802,10 @@ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL*); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€wolfssl_ctxオブジェクトã®ã‚ªãƒ—ションビットをリセットã—ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTXオブジェクトã®ã‚ªãƒ—ションビットをリセットã—ã¾ã™ã€‚ \return option æ–°ã—ã„オプションビット + _Example_ \code WOLFSSL_CTX* ctx = 0; @@ -8544,15 +9819,16 @@ long wolfSSL_CTX_clear_options(WOLFSSL_CTX* ctx, long opt); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€WolfSSL構造ã®jobjectrefメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ \return SSL_SUCCESS jobjectrefãŒobjptrã«æ­£ã—ã設定ã•ã‚Œã¦ã„ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SSL_FAILURE 関数ãŒæ­£ã—ã実行ã•ã‚Œãšã€jobjectrefãŒè¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ - \param ssl wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); - WOLFSSL* ssl = WOLFSSL_new(); + WOLFSSL* ssl = wolfSSL_new(); void* objPtr = &obj; ... if(wolfSSL_set_jobject(ssl, objPtr)){ @@ -8564,10 +9840,12 @@ int wolfSSL_set_jobject(WOLFSSL* ssl, void* objPtr); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€wolfssl構造ã®jobjectrefメンãƒãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ \return value wolfssl構造体ãŒnullã§ãªã„å ´åˆã€é–¢æ•°ã¯jobjectref値を返ã—ã¾ã™ã€‚ \return NULL wolfssl構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method ); @@ -8584,10 +9862,12 @@ void* wolfSSL_get_jobject(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯SSL内ã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’観察ã™ã‚‹ã“ã¨ã§ã™ã€‚CBã®NULL値ã¯ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’リセットã—ã¾ã™ã€‚ \return SSL_SUCCESS æˆåŠŸã—ã¦ã„ã¾ã™ã€‚ \return SSL_FAILURE NULL SSLãŒæ¸¡ã•ã‚ŒãŸå ´åˆã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code static cb(int write_p, int version, int content_type, @@ -8602,9 +9882,11 @@ int wolfSSL_set_msg_callback(WOLFSSL *ssl, SSL_Msg_Cb cb); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€SSL内ã®é–¢é€£ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆå€¤ã‚’設定ã—ã¾ã™ã€‚値ã¯ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯å¼•æ•°ã«æ¸¡ã•ã‚Œã¾ã™ã€‚ \return none è¿”å“ä¸å¯ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code static cb(int write_p, int version, int content_type, @@ -8620,10 +9902,11 @@ int wolfSSL_set_msg_callback_arg(WOLFSSL *ssl, void* arg); /*! - \ingroup CertsKeys + \ingroup CertsKeys \brief ã“ã®é–¢æ•°ã¯ã€å­˜åœ¨ã™ã‚‹å ´åˆã¯ã€ãƒ”ア証明書ã‹ã‚‰altnameã‚’è¿”ã—ã¾ã™ã€‚ \return NULL 次ã®AltNameãŒãªã„å ´åˆã€‚ \return cert->altNamesNext->name wolfssl_x509ã‹ã‚‰ã€AltNameリストã‹ã‚‰ã®æ–‡å­—列値ã§ã‚る構造ãŒå­˜åœ¨ã™ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code WOLFSSL_X509 x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -8637,13 +9920,15 @@ \sa wolfSSL_X509_get_issuer_name \sa wolfSSL_X509_get_subject_name */ -char* wolfSSL_X509_get_next_altname(WOLFSSL_X509*); +char* wolfSSL_X509_get_next_altname(WOLFSSL_X509* x509); /*! - \ingroup CertsKeys - \brief 関数ã¯ã€x509ãŒnullã®ã‹ã©ã†ã‹ã‚’確èªã—ã€ãã†ã§ãªã„å ´åˆã¯ã€x509構造体ã®NotBeforeメンãƒãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ - \return pointer X509構造体ã®NotBeforeメンãƒãƒ¼ã«ASN1_TIMEを使用ã—ã¦æ§‹é€ ä½“ã«ã€‚ - \return NULL x509構造ãŒnullã®å ´åˆã€é–¢æ•°ã¯nullã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup CertsKeys + \brief 関数ã¯ã€x509ãŒnullã®ã‹ã©ã†ã‹ã‚’確èªã—ã€ãã†ã§ãªã„å ´åˆã¯ã€WOLFSSL_X509構造体ã®NotBeforeメンãƒãƒ¼ã‚’è¿”ã—ã¾ã™ã€‚ + \return pointer WOLFSSL_ASN1_TIMEã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼ˆWOLFSSL_X509構造体ã®NotBeforeメンãƒãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼‰ã‚’è¿”ã—ã¾ã™ã€‚ + \return NULL WOLFSSL_X509構造体ãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param x509 WOLFSSL_X509構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ \code WOLFSSL_X509* x509 = (WOLFSSL_X509)XMALLOC(sizeof(WOLFSSL_X509), NULL, @@ -8656,13 +9941,27 @@ \endcode \sa wolfSSL_X509_get_notAfter */ -WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(WOLFSSL_X509*); +WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(WOLFSSL_X509* x509); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã€ã‚µãƒ¼ãƒãƒ¼ã¨ã®SSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€åŸºç¤Žã¨ãªã‚‹é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ wolfssl_connect()ã¯ã€ãƒ–ロックã¨éžãƒ–ロックI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹I / OãŒãƒŽãƒ³ãƒ–ロッキングã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfssl_connect()ã¯ã€åŸºã«ãªã‚‹I / OãŒwolfssl_connectã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚通話プロセスã¯ã€åŸºç¤Žã¨ãªã‚‹I / OãŒREADYãŠã‚ˆã³WOLFSSLãŒåœæ­¢ã—ãŸã¨ãã«wolfssl_connect()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_connect()ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ãŸã‚‰ã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã®ã¿æˆ»ã‚‹ã€‚ WolfSSLã¯OpenSSLよりも証明書検証ã«ç•°ãªã‚‹ã‚¢ãƒ—ローãƒã‚’å–ã‚Šã¾ã™ã€‚クライアントã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒãƒªã‚·ãƒ¼ã¯ã‚µãƒ¼ãƒãƒ¼ã‚’確èªã™ã‚‹ã“ã¨ã§ã™ã€‚ã“ã‚Œã¯ã€CASを読ã¿è¾¼ã¾ãªã„å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã€ç¢ºèªã§ãã¾ã›ã‚“(-155)。 SSL_CONNECTã‚’æŒã¤ã“ã¨ã®OpenSSLã®å‹•ä½œãŒæˆåŠŸã—ãŸå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼ã‚’検証ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚’抑ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™.SSL_CTX_SET_VERIFY(CTXã€SSL_VERIFY_NONEã€0)。 ssl_new()を呼ã³å‡ºã™å‰ã«ã€‚ãŠå‹§ã‚ã§ãã¾ã›ã‚“ãŒã€‚ - \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã€ã‚µãƒ¼ãƒãƒ¼ã¨ã®SSL/TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¾ã§ã«ä¸‹å±¤ã®é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + wolfSSL_connect()ã¯ã€ãƒ–ロッキングã¨ãƒŽãƒ³ãƒ–ロッキングI/Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚ + 下層ã®I/OãŒãƒŽãƒ³ãƒ–ロッキングã®å ´åˆã€wolfSSL_connect()ã¯ã€ä¸‹å±¤ã®I/OãŒwolfSSL_connectã®è¦æ±‚(é€ä¿¡ãƒ‡ãƒ¼ã‚¿ã€å—信データ)を満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«ã¯å³æˆ»ã‚Šã¾ã™ã€‚ + ã“ã®å ´åˆã€wolfSSL_get_error()ã®å‘¼ã³å‡ºã—ã§SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + 呼ã³å‡ºã—ãŸãƒ—ロセスã¯ã€ä¸‹å±¤ã®I/OãŒãŒREADYã«ãªã£ãŸæ™‚点ã§ã€WOLFSSLãŒåœæ­¢ã—ãŸã¨ãã‹ã‚‰å†é–‹ã§ãるよã†ã«wolfSSL_connect()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ã“ã‚Œã«ã¯select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ãŒæ•´ã£ãŸã‹ã©ã†ã‹ã‚’確èªã§ãã¾ã™ã€‚ + ブロッキングI/Oを使用ã™ã‚‹å ´åˆã¯ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ãŒçµ‚了ã™ã‚‹ã‹ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ã¾ã§æˆ»ã£ã¦ãã¾ã›ã‚“。 + wolfSSLã¯OpenSSLã¨æ¯”ã¹ã¦è¨¼æ˜Žæ›¸æ¤œè¨¼ã«ç•°ãªã‚‹ã‚¢ãƒ—ローãƒã‚’å–ã‚Šã¾ã™ã€‚クライアントã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒãƒªã‚·ãƒ¼ã¯ã‚µãƒ¼ãƒãƒ¼ã‚’èªè¨¼ã™ã‚‹ã“ã¨ã§ã™ã€‚ + ã“ã‚Œã¯ã€CA証明書を読ã¿è¾¼ã¾ãªã„å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ããšâ€-155â€ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + OpenSSLã¨åŒã˜æŒ¯ã‚‹èˆžã„(ã¤ã¾ã‚Šã€CA証明書ã®ãƒ­ãƒ¼ãƒ‰ãªã—ã§ã‚µãƒ¼ãƒãƒ¼èªè¨¼ã‚’æˆåŠŸã•ã›ã‚‹ï¼‰ã‚’å–らã›ãŸã„å ´åˆã«ã¯ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£é¢ã§ãŠå‹§ã‚ã¯ã—ã¾ã›ã‚“ãŒã€ + SSL_CTX_SET_VERIFY(ctxã€SSL_VERIFY_NONEã€0)を呼ã³å‡ºã™ã“ã¨ã§å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWolfSSL構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -8682,15 +9981,16 @@ int wolfSSL_connect(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã¦ã€HellORetryRequestメッセージã«Cookieã‚’å«ã‚ã‚‹å¿…è¦ãŒã‚ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚Cookieã¯ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¹ã‚¯ãƒªãƒ—トã®ãƒãƒƒã‚·ãƒ¥ã‚’ä¿æŒã—ã¦ã„ã‚‹ã®ã§ã€åˆ¥ã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã¯å¿œç­”ã§ClientHelloを処ç†ã§ãã¾ã™ã€‚秘密ã¯Cookieデータã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã‚’Genertingã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] ssl l wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param [in] 秘密をä¿æŒã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’秘密ã«ã—ã¾ã™ã€‚渡ã™NULLã¯ã€æ–°ã—ã„ランダムシークレットを生æˆã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚ \param [in] シークスã®ã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§ã‚µã‚¤ã‚ºã€‚0を渡ã™ã¨ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚µã‚¤ã‚ºã‚’使用ã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™.WC_SHA256_DIGEST_SIZE(ã¾ãŸã¯SHA-256ãŒä½¿ç”¨ã§ããªã„å ´åˆã¯WC_SHA_DIGEST_SIZE)。 - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR クライアントã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ - \return WOLFSSL_SUCCESS æˆåŠŸã—ãŸå ´åˆ + \return WOLFSSL_SUCCESS æˆåŠŸã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return MEMORY_ERROR 秘密をä¿å­˜ã™ã‚‹ãŸã‚ã«å‹•çš„メモリを割り当ã¦ã‚‹å ´åˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚ + _Example_ \code int ret; @@ -8708,11 +10008,31 @@ const unsigned char* secret, unsigned int secretSz); /*! - \ingroup Setup - \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã™ã‚‹ã¨ã€ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼ä¸Šã§å†é–‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã®é€ä¿¡ã‚’åœæ­¢ã™ã‚‹ã‚ˆã†ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \ingroup Setup + + \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã€HelloRetryRequestメッセージãŒã‚¯ãƒƒã‚­ãƒ¼ã‚’å«ã‚“ã§ã¯ãªã‚‰ãªã„ã“ã¨ã€ + DTLSv1.3ãŒä½¿ç”¨ã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã¯ã‚¯ãƒƒã‚­ãƒ¼ã®äº¤æ›ãŒãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã«å«ã¾ã‚Œãªã„ã“ã¨ã‚’表明ã—ã¾ã™ã€‚ + DTLSv1.3ã§ã¯ã‚¯ãƒƒã‚­ãƒ¼äº¤æ›ã‚’è¡Œã‚ãªã„ã¨ã‚µãƒ¼ãƒãƒ¼ãŒDoS/Amplification攻撃をå—ã‘ã‚„ã™ããªã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã“ã¨ã«ç•™æ„ã—ã¦ãã ã•ã„。 + + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã‚ã‚‹ã„ã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SIDE_ERROR クライアントå´ã§ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \sa wolfSSL_send_hrr_cookie +*/ +int wolfSSL_disable_hrr_cookie(WOLFSSL* ssl); + + +/*! + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼ä¸Šã§å‘¼ã³å‡ºã•ã‚Œã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯å®Œäº†æ™‚ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³å†é–‹ã®ãŸã‚ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã®é€ä¿¡ã‚’è¡Œã‚ãªã„よã†ã«ã—ã¾ã™ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \return BAD_FUNC_ARG CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR クライアントã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -8728,11 +10048,12 @@ int wolfSSL_CTX_no_ticket_TLSv13(WOLFSSL_CTX* ctx); /*! - \ingroup Setup + \ingroup Setup \brief ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã™ã‚‹ã¨ã€ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼ä¸Šã§å†é–‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã®é€ä¿¡ã‚’åœæ­¢ã™ã‚‹ã‚ˆã†ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR クライアントã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -8748,10 +10069,11 @@ int wolfSSL_no_ticket_TLSv13(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€Authenticationã«ãƒ—リシェアキーを使用ã—ã¦ã„ã‚‹å ´åˆã€DIFFIE-HELLMAN(DH)スタイルã®ã‚­ãƒ¼äº¤æ›ã‚’許å¯ã™ã‚‹TLS V1.3 WolfSSLコンテキストã§å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \return BAD_FUNC_ARG CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + _Example_ \code int ret; @@ -8767,10 +10089,11 @@ int wolfSSL_CTX_no_dhe_psk(WOLFSSL_CTX* ctx); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€Authenticationã®ãŸã‚ã«ãƒ—リシェアキーを使用ã—ã¦ã„ã‚‹ã¨ãã«Diffie-Hellman(DH)スタイルã®ã‚­ãƒ¼äº¤æ›ã‚’許å¯ã™ã‚‹TLS V1.3クライアントã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã®WolfSSLã§å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€äº‹å‰å…±æœ‰éµã‚’使用ã—ã¦ã„ã‚‹TLS V1.3クライアントã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã§ã€ã«Diffie-Hellman(DH)スタイルã®éµäº¤æ›ã‚’許å¯ã—ãªã„よã†ã«è¨­å®šã—ã¾ã™ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + _Example_ \code int ret; @@ -8786,11 +10109,12 @@ int wolfSSL_no_dhe_psk(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3クライアントã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã®wolfsslã§å‘¼ã³å‡ºã•ã‚Œã¦ã€ã‚­ãƒ¼ã®ãƒ­ãƒ¼ãƒ«ã‚ªãƒ¼ãƒãƒ¼ã‚’強制ã—ã¾ã™ã€‚KeyUpdateメッセージãŒãƒ”ã‚¢ã«é€ä¿¡ã•ã‚Œã€æ–°ã—ã„キーãŒæš—å·åŒ–ã®ãŸã‚ã«è¨ˆç®—ã•ã‚Œã¾ã™ã€‚ピアã¯KeyUpdateメッセージをé€ã‚Šã€æ–°ã—ã„復å·åŒ–キーWILを計算ã—ã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã—ãŸå¾Œã«ã®ã¿å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return WANT_WRITE 書ãè¾¼ã¿ãŒæº–å‚™ãŒã§ãã¦ã„ãªã„å ´åˆ + _Example_ \code int ret; @@ -8809,11 +10133,12 @@ int wolfSSL_update_keys(WOLFSSL* ssl); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3クライアントã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã®wolfsslã§å‘¼ã³å‡ºã•ã‚Œã€ã‚­ãƒ¼ã®ãƒ­ãƒ¼ãƒ«ã‚ªãƒ¼ãƒãƒ¼ãŒé€²è¡Œä¸­ã‹ã©ã†ã‹ã‚’判断ã—ã¾ã™ã€‚wolfssl_update_keys()ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€KeyUpdateメッセージãŒé€ä¿¡ã•ã‚Œã€æš—å·åŒ–キーãŒæ›´æ–°ã•ã‚Œã¾ã™ã€‚復å·åŒ–キーã¯ã€å¿œç­”ãŒå—ä¿¡ã•ã‚ŒãŸã¨ãã«æ›´æ–°ã•ã‚Œã¾ã™ã€‚ - \param [in] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3クライアントã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼ã®wolfsslã§å‘¼ã³å‡ºã•ã‚Œã€ã‚­ãƒ¼ã®ãƒ­ãƒ¼ãƒ«ã‚ªãƒ¼ãƒãƒ¼ãŒé€²è¡Œä¸­ã‹ã©ã†ã‹ã‚’判断ã—ã¾ã™ã€‚wolfssl_update_keys()ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€KeyUpdateメッセージãŒé€ä¿¡ã•ã‚Œã€æš—å·åŒ–キーãŒæ›´æ–°ã•ã‚Œã¾ã™ã€‚復å·åŒ–キーã¯ã€å¿œç­”ãŒå—ä¿¡ã•ã‚ŒãŸã¨ãã«æ›´æ–°ã•ã‚Œã¾ã™ã€‚ + \param [in] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param [out] キー更新応答ãŒå¿…è¦ãªã„å ´åˆã¯å¿…é ˆ0。1キー更新応答ãŒå¿…è¦ãªã„å ´åˆã€‚ \return 0 æˆåŠŸã—ãŸã€‚ + _Example_ \code int ret; @@ -8833,11 +10158,12 @@ int wolfSSL_key_update_response(WOLFSSL* ssl, int* required); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3クライアントã®WolfSSLコンテキストã§å‘¼ã³å‡ºã•ã‚Œã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã®è¦æ±‚ã«å¿œã˜ã¦Post Handshakeã‚’é€ä¿¡ã§ãるよã†ã«ã—ã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆèªè¨¼ãªã©ã‚’å¿…è¦ã¨ã—ãªã„ページをæŒã¤Webサーãƒãƒ¼ã«æŽ¥ç¶šã™ã‚‹ã¨ãã«å½¹ç«‹ã¡ã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \return BAD_FUNC_ARG CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR サーãƒãƒ¼ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -8854,11 +10180,12 @@ int wolfSSL_CTX_allow_post_handshake_auth(WOLFSSL_CTX* ctx); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€TLS V1.3クライアントWolfSSLã§å‘¼ã³å‡ºã•ã‚Œã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¯ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã®è¦æ±‚ã«å¿œã˜ã¦ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’é€ã‚Šã¾ã™ã€‚handshakeクライアントèªè¨¼æ‹¡å¼µæ©Ÿèƒ½ã¯ClientHelloã§é€ä¿¡ã•ã‚Œã¾ã™ã€‚ã“ã‚Œã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆèªè¨¼ãªã©ã‚’å¿…è¦ã¨ã—ãªã„ページをæŒã¤Webサーãƒãƒ¼ã«æŽ¥ç¶šã™ã‚‹ã¨ãã«å½¹ç«‹ã¡ã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR サーãƒãƒ¼ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -8875,15 +10202,16 @@ int wolfSSL_allow_post_handshake_auth(WOLFSSL* ssl); /*! - \ingroup IO + \ingroup IO \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3クライアントã‹ã‚‰ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã‚’è¦æ±‚ã—ã¾ã™ã€‚ã“ã‚Œã¯ã€Webサーãƒãƒ¼ãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆèªè¨¼ã‚„ãã®ä»–ã®ã‚‚ã®ã‚’å¿…è¦ã¨ã™ã‚‹ãƒšãƒ¼ã‚¸ã«ã‚µãƒ¼ãƒ“スをæä¾›ã—ã¦ã„ã‚‹å ´åˆã«å½¹ç«‹ã¡ã¾ã™ã€‚接続ã§æœ€å¤§256ã®è¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return WANT_WRITE 書ãè¾¼ã¿ãŒæº–å‚™ãŒã§ãã¦ã„ãªã„å ´åˆ \return SIDE_ERROR クライアントã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ \return NOT_READY_ERROR ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ã¦ã„ãªã„ã¨ãã«å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ \return POST_HAND_AUTH_ERROR é€ä»˜å¾Œèªè¨¼ãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„å ´åˆã€‚ \return MEMORY_E 動的メモリ割り当ã¦ãŒå¤±æ•—ã—ãŸå ´åˆ + _Example_ \code int ret; @@ -8903,11 +10231,12 @@ int wolfSSL_request_certificate(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯æ¥•å††æ›²ç·šã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¦ã€WolfSSLコンテキストを希望ã®é †ã«è¨­å®šã—ã¾ã™ã€‚リストã¯ãƒŒãƒ«çµ‚了ã—ãŸãƒ†ã‚­ã‚¹ãƒˆæ–‡å­—列ã€ãŠã‚ˆã³ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã™ã€‚ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€TLS v1.3接続ã§ä½¿ç”¨ã™ã‚‹éµäº¤æ›æ¥•å††æ›²ç·šãƒ‘ラメータを設定ã—ã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 楕円曲線グループã®ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã‚る文字列をリストã—ã¾ã™ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] list 楕円曲線グループã®ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã‚る文字列をリストã—ã¾ã™ã€‚ \return WOLFSSL_FAILURE ãƒã‚¤ãƒ³ã‚¿ãƒ‘ラメータãŒNULLã®å ´åˆã€wolfssl_max_group_countグループãŒå¤šã„å ´åˆã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—åãŒèªè­˜ã•ã‚Œãªã„ã‹ã€TLS v1.3を使用ã—ã¦ã„ã¾ã›ã‚“。 + _Example_ \code int ret; @@ -8928,11 +10257,12 @@ int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯æ¥•å††æ›²ç·šã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¦ã€WolfSSLを希望ã®é †ã«è¨­å®šã—ã¾ã™ã€‚リストã¯ãƒŒãƒ«çµ‚了ã—ãŸãƒ†ã‚­ã‚¹ãƒˆæ–‡å­—列ã€ãŠã‚ˆã³ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã™ã€‚ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€TLS v1.3接続ã§ä½¿ç”¨ã™ã‚‹éµäº¤æ›æ¥•å††æ›²ç·šãƒ‘ラメータを設定ã—ã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã‚る文字列をリストã—ã¾ã™ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] list éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚³ãƒ­ãƒ³åŒºåˆ‡ã‚Šãƒªã‚¹ãƒˆã§ã‚る文字列をリストã—ã¾ã™ã€‚ \return WOLFSSL_FAILURE ãƒã‚¤ãƒ³ã‚¿ãƒ‘ラメータãŒNULLã®å ´åˆã€wolfssl_max_group_countグループãŒå¤šã„å ´åˆã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—åãŒèªè­˜ã•ã‚Œãªã„ã‹ã€TLS v1.3を使用ã—ã¦ã„ã¾ã›ã‚“。 + _Example_ \code int ret; @@ -8953,12 +10283,13 @@ int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list); /*! - \ingroup TLS - \brief ã“ã®é–¢æ•°ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒTLS v1.3ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚’好むキー交æ›ã‚°ãƒ«ãƒ¼ãƒ—ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®æƒ…報を完了ã—ãŸå¾Œã«ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã—ã¦ã€ã‚µãƒ¼ãƒãƒ¼ãŒã©ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒäºˆæƒ³ã•ã‚Œã‚‹ã‚ˆã†ã«ã“ã®æƒ…å ±ãŒå°†æ¥ã®æŽ¥ç¶šã§ä½¿ç”¨ã§ãるよã†ã«ãªã‚‹ã‹ã‚’決定ã™ã‚‹ãŸã‚ã«ã€ã“ã®æƒ…å ±ãŒå°†æ¥ã®æŽ¥ç¶šã§éµäº¤æ›ã®ãŸã‚ã®éµãƒšã‚¢ã‚’事å‰ç”Ÿæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \ingroup TLS + \brief ã“ã®é–¢æ•°ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒTLS v1.3ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚’好むéµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®æƒ…報を完了ã—ãŸå¾Œã«ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã—ã¦ã€ã‚µãƒ¼ãƒãƒ¼ãŒã©ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒäºˆæƒ³ã•ã‚Œã‚‹ã‚ˆã†ã«ã“ã®æƒ…å ±ãŒå°†æ¥ã®æŽ¥ç¶šã§ä½¿ç”¨ã§ãるよã†ã«ãªã‚‹ã‹ã‚’決定ã™ã‚‹ãŸã‚ã«ã€ã“ã®æƒ…å ±ãŒå°†æ¥ã®æŽ¥ç¶šã§éµäº¤æ›ã®ãŸã‚ã®éµãƒšã‚¢ã‚’事å‰ç”Ÿæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR サーãƒãƒ¼ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ \return NOT_READY_ERROR ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒå®Œäº†ã™ã‚‹å‰ã«å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -8980,12 +10311,13 @@ int wolfSSL_preferred_group(WOLFSSL* ssl); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯æ¥•å††æ›²ç·šã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¦ã€WolfSSLコンテキストを希望ã®é †ã«è¨­å®šã—ã¾ã™ã€‚リストã¯ã€Countã§æŒ‡å®šã•ã‚ŒãŸè­˜åˆ¥å­ã®æ•°ã‚’æŒã¤ã‚°ãƒ«ãƒ¼ãƒ—識別å­ã®é…列ã§ã™ã€‚ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€TLS v1.3接続ã§ä½¿ç”¨ã™ã‚‹éµäº¤æ›æ¥•å††æ›²ç·šãƒ‘ラメータを設定ã—ã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 識別å­ã«ã‚ˆã£ã¦éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’グループ化ã—ã¾ã™ã€‚ - \param [in] グループ内ã®éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®æ•°ã‚’æ•°ãˆã¾ã™ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] groups 識別å­ã«ã‚ˆã£ã¦éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’グループ化ã—ã¾ã™ã€‚ + \param [in] count グループ内ã®éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®æ•°ã‚’æ•°ãˆã¾ã™ã€‚ \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãƒ‘ラメータãŒNULLã®å ´åˆã€ã‚°ãƒ«ãƒ¼ãƒ—æ•°ã¯wolfssl_max_group_countを超ãˆã¦ã„ã‚‹ã‹ã€TLS v1.3を使用ã—ã¦ã„ã¾ã›ã‚“。 + _Example_ \code int ret; @@ -9010,12 +10342,13 @@ int count); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€wolfsslを許ã™ãŸã‚ã«æ¥•å††æ›²ç·šã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’設定ã—ã¾ã™ã€‚リストã¯ã€Countã§æŒ‡å®šã•ã‚ŒãŸè­˜åˆ¥å­ã®æ•°ã‚’æŒã¤ã‚°ãƒ«ãƒ¼ãƒ—識別å­ã®é…列ã§ã™ã€‚ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€TLS v1.3接続ã§ä½¿ç”¨ã™ã‚‹éµäº¤æ›æ¥•å††æ›²ç·šãƒ‘ラメータを設定ã—ã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] 識別å­ã«ã‚ˆã£ã¦éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’グループ化ã—ã¾ã™ã€‚ - \param [in] グループ内ã®éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®æ•°ã‚’æ•°ãˆã¾ã™ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] groups 識別å­ã«ã‚ˆã£ã¦éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒªã‚¹ãƒˆã‚’グループ化ã—ã¾ã™ã€‚ + \param [in] count グループ内ã®éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ã®æ•°ã‚’æ•°ãˆã¾ã™ã€‚ \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãƒ‘ラメータãŒNULLã®å ´åˆã€ã‚°ãƒ«ãƒ¼ãƒ—æ•°ãŒWolfSSL_MAX_GROUP_COUNTを超ãˆã¦ã„ã‚‹å ´åˆã€ä»»æ„ã®è­˜åˆ¥å­ã¯èªè­˜ã•ã‚Œãªã„ã‹ã€TLS v1.3を使用ã—ã¦ã„ã¾ã›ã‚“。 + _Example_ \code int ret; @@ -9039,10 +10372,25 @@ int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã€ã‚µãƒ¼ãƒãƒ¼ã¨ã®TLS v1.3ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€åŸºç¤Žã¨ãªã‚‹é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ wolfssl_connect()ã¯ã€ãƒ–ロックã¨éžãƒ–ロックI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹I / OãŒãƒŽãƒ³ãƒ–ロッキングã•ã‚Œã¦ã„ãªã„å ´åˆã€wolfssl_connect()ã¯ã€åŸºã«ãªã‚‹I / OãŒwolfssl_connectã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚通話プロセスã¯ã€åŸºç¤Žã¨ãªã‚‹I / OãŒREADYãŠã‚ˆã³WOLFSSLãŒåœæ­¢ã—ãŸã¨ãã«wolfssl_connect()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_connect()ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ãŸã‚‰ã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã®ã¿æˆ»ã‚‹ã€‚ WolfSSLã¯OpenSSLよりも証明書検証ã«ç•°ãªã‚‹ã‚¢ãƒ—ローãƒã‚’å–ã‚Šã¾ã™ã€‚クライアントã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒãƒªã‚·ãƒ¼ã¯ã‚µãƒ¼ãƒãƒ¼ã‚’確èªã™ã‚‹ã“ã¨ã§ã™ã€‚ã“ã‚Œã¯ã€CASを読ã¿è¾¼ã¾ãªã„å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã€ç¢ºèªã§ãã¾ã›ã‚“(-155)。 SSL_CONNECTã‚’æŒã¤ã“ã¨ã®OpenSSLã®å‹•ä½œãŒæˆåŠŸã—ãŸå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼ã‚’検証ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚’抑ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™.SSL_CTX_SET_VERIFY(CTXã€SSL_VERIFY_NONEã€0)。 ssl_new()を呼ã³å‡ºã™å‰ã«ã€‚ãŠå‹§ã‚ã§ãã¾ã›ã‚“ãŒã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã€ã‚µãƒ¼ãƒãƒ¼ã¨ã®TLS v1.3ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€ä¸‹å±¤ã®é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ + wolfSSL_connect()ã¯ã€ãƒ–ロックã¨ãƒŽãƒ³ãƒ–ロックI/Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚ + 下層I/OãŒãƒŽãƒ³ãƒ–ロッキングã®å ´åˆã€wolfSSL_connect()ã¯ã€ä¸‹å±¤I/OãŒwolfssl_connectã®è¦æ±‚を満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ + ã“ã®å ´åˆã€wolfSSL_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚ + 通話プロセスã¯ã€ä¸‹å±¤I/OãŒREADYãŠã‚ˆã³WOLFSSLãŒåœæ­¢ã—ãŸã¨ãã«wolfssl_connect()ã¸ã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚ + 基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_connect()ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ãŸã‚‰ã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰ã®ã¿æˆ»ã‚Šã¾ã™ã€‚ + WolfSSLã¯OpenSSLよりも証明書検証ã«ç•°ãªã‚‹ã‚¢ãƒ—ローãƒã‚’å–ã‚Šã¾ã™ã€‚ + クライアントã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒãƒªã‚·ãƒ¼ã¯ã‚µãƒ¼ãƒãƒ¼ã‚’確èªã™ã‚‹ã“ã¨ã§ã™ã€‚ + ã“ã‚Œã¯ã€CASを読ã¿è¾¼ã¾ãªã„å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã€ç¢ºèªã§ãã¾ã›ã‚“(-155)。 + SSL_CONNECTã‚’æŒã¤ã“ã¨ã®OpenSSLã®å‹•ä½œãŒæˆåŠŸã—ãŸå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼ã‚’検証ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚’抑ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + SSL_CTX_SET_VERIFY(CTXã€SSL_VERIFY_NONEã€0)。 + ssl_new()を呼ã³å‡ºã™å‰ã«ã€‚ãŠå‹§ã‚ã§ãã¾ã›ã‚“ãŒã€‚ + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -9062,13 +10410,24 @@ \sa wolfSSL_accept_TLSv13 \sa wolfSSL_accept */ -int wolfSSL_connect_TLSv13(WOLFSSL*); +int wolfSSL_connect_TLSv13(WOLFSSL* ssl); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã€SSL / TLSクライアントãŒSSL / TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã™ã‚‹ã®ã‚’å¾…ã¡ã¾ã™ã€‚ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€åŸºç¤Žã¨ãªã‚‹é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ wolfssl_accept()ã¯ã€ãƒ–ロックã¨éžãƒ–ロッキングI / Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚基礎ã¨ãªã‚‹å…¥å‡ºåŠ›ãŒãƒŽãƒ³ãƒ–ロッキングã§ã‚ã‚‹å ´åˆã€wolfssl_accept()ã¯ã€åŸºç¤Žã¨ãªã‚‹I / OãŒwolfssl_acceptã®ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®å ´åˆã€wolfssl_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚通話プロセスã¯ã€èª­ã¿å–ã‚Šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãŒä½¿ç”¨å¯èƒ½ã§ã‚ã‚Šã€wolfsslãŒåœæ­¢ã—ãŸå ´æ‰€ã‚’拾ã†ã¨ãã«ã€wolfssl_acceptã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚基礎ã¨ãªã‚‹I / OãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_accept()ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ãŸã‚‰ã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰æˆ»ã‚Šã¾ã™ã€‚å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ClientHelloメッセージãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ãŒã€TLS v1.3接続を期待ã™ã‚‹ã¨ãã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¾ã™ã€‚ - \return SSL_SUCCESS æˆåŠŸã™ã‚‹ã¨ã€‚ - \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã¯è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfssl_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã€SSL/TLSクライアントãŒSSL/TLSãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’開始ã™ã‚‹ã®ã‚’å¾…ã¡ã†ã‘ã¾ã™ã€‚ + ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€ä¸‹å±¤ã®é€šä¿¡ãƒãƒ£ãƒãƒ«ã¯ã™ã§ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚ + wolfSSL_accept()ã¯ã€ãƒ–ロックã¨ãƒŽãƒ³ãƒ–ロッキングI/Oã®ä¸¡æ–¹ã§å‹•ä½œã—ã¾ã™ã€‚ + 下層ã®å…¥å‡ºåŠ›ãŒãƒŽãƒ³ãƒ–ロッキングã§ã‚ã‚‹å ´åˆã€wolfSSL_accept()ã¯ã€ä¸‹å±¤ã®I/OãŒwolfSSL_acceptã®è¦æ±‚を満ãŸã™ã“ã¨ãŒã§ããªã‹ã£ãŸã¨ãã«æˆ»ã‚Šã¾ã™ã€‚ + ã“ã®å ´åˆã€wolfSSL_get_error()ã¸ã®å‘¼ã³å‡ºã—ã¯SSL_ERROR_WANT_READã¾ãŸã¯SSL_ERROR_WANT_WRITEã®ã„ãšã‚Œã‹ã‚’生æˆã—ã¾ã™ã€‚ + 通話プロセスã¯ã€èª­ã¿å–ã‚Šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãŒä½¿ç”¨å¯èƒ½ã§ã‚ã‚Šã€wolfsslãŒåœæ­¢ã—ãŸå ´æ‰€ã‚’拾ã†ã¨ãã«ã€wolfssl_acceptã®å‘¼ã³å‡ºã—ã‚’ç¹°ã‚Šè¿”ã™å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + ノンブロッキングソケットを使用ã™ã‚‹å ´åˆã¯ã€ä½•ã‚‚実行ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ãŒã€select()を使用ã—ã¦å¿…è¦ãªæ¡ä»¶ã‚’確èªã§ãã¾ã™ã€‚ + 下層ã®I/OãŒãƒ–ロックã•ã‚Œã¦ã„ã‚‹å ´åˆã€wolfssl_accept()ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ãŒçµ‚了ã—ãŸã‚‰ã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸã‚‰æˆ»ã‚Šã¾ã™ã€‚ + å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ClientHelloメッセージãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ãŒã€TLS v1.3接続を期待ã™ã‚‹ã¨ãã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¾ã™ã€‚ + + \return SSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return SSL_FATAL_ERROR エラーãŒç™ºç”Ÿã—ãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚より詳細ãªã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€wolfSSL_get_error()を呼ã³å‡ºã—ã¾ã™ã€‚ + \param ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code int ret = 0; @@ -9092,12 +10451,18 @@ wolfSSL_accept_TLSv13(WOLFSSL* ssl); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€WolfSSLコンテキストを使用ã—ã¦TLS V1.3サーãƒãƒ¼ã«ã‚ˆã£ã¦å—ã‘入れられる早期データã®æœ€å¤§é‡ã‚’設定ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€å†ç”Ÿæ”»æ’ƒã‚’軽減ã™ã‚‹ãŸã‚ã®ãƒ—ロセスã¸ã®æ—©æœŸãƒ‡ãƒ¼ã‚¿ã®é‡ã‚’制é™ã—ã¾ã™ã€‚åˆæœŸã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒé€ä¿¡ã•ã‚ŒãŸã“ã¨ã€ã—ãŸãŒã£ã¦ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒå†é–‹ã•ã‚Œã‚‹ãŸã³ã«åŒã˜æŽ¥ç¶šã®ã‚­ãƒ¼ã‹ã‚‰æ´¾ç”Ÿã—ãŸã‚­ãƒ¼ã«ã‚ˆã£ã¦ä¿è­·ã•ã‚Œã¾ã™ã€‚値ã¯å†é–‹ã®ãŸã‚ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ゼロã®å€¤ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã‚’使用ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦æ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚早期データãƒã‚¤ãƒˆæ•°ã‚’アプリケーションã§å®Ÿéš›ã«ã¯å¯èƒ½ãªé™ã‚Šä½Žãä¿ã¤ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] SZãƒã‚¤ãƒˆå˜ä½ã§å—ã‘入れる早期データã®é‡ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WolfSSLコンテキストを使用ã—ã¦TLS V1.3サーãƒãƒ¼ã«ã‚ˆã£ã¦å—ã‘入れられるアーリーデータã®æœ€å¤§é‡ã‚’設定ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€å†ç”Ÿæ”»æ’ƒã‚’軽減ã™ã‚‹ãŸã‚ã®ãƒ—ロセスã¸ã®ã‚¢ãƒ¼ãƒªãƒ¼ãƒ‡ãƒ¼ã‚¿ã®é‡ã‚’制é™ã—ã¾ã™ã€‚ + åˆæœŸã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒé€ä¿¡ã•ã‚ŒãŸã“ã¨ã€ã—ãŸãŒã£ã¦ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒå†é–‹ã•ã‚Œã‚‹ãŸã³ã«åŒã˜æŽ¥ç¶šã®éµã‹ã‚‰æ´¾ç”Ÿã—ãŸéµã«ã‚ˆã£ã¦ä¿è­·ã•ã‚Œã¾ã™ã€‚ + 値ã¯å†é–‹ã®ãŸã‚ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + ゼロã®å€¤ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã‚’使用ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦ã‚¢ãƒ¼ãƒªãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚ + アーリーデータãƒã‚¤ãƒˆæ•°ã‚’アプリケーションã§å®Ÿéš›ã«ã¯å¯èƒ½ãªé™ã‚Šä½Žãä¿ã¤ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] sz ãƒã‚¤ãƒˆå˜ä½ã§å—ã‘入れるアーリーデータã®ã‚µã‚¤ã‚ºã€‚ \return BAD_FUNC_ARG CTXãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR クライアントã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -9116,12 +10481,18 @@ unsigned int sz); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€WolfSSLコンテキストを使用ã—ã¦TLS V1.3サーãƒãƒ¼ã«ã‚ˆã£ã¦å—ã‘入れられる早期データã®æœ€å¤§é‡ã‚’設定ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€å†ç”Ÿæ”»æ’ƒã‚’軽減ã™ã‚‹ãŸã‚ã®ãƒ—ロセスã¸ã®æ—©æœŸãƒ‡ãƒ¼ã‚¿ã®é‡ã‚’制é™ã—ã¾ã™ã€‚åˆæœŸã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒé€ä¿¡ã•ã‚ŒãŸã“ã¨ã€ã—ãŸãŒã£ã¦ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒå†é–‹ã•ã‚Œã‚‹ãŸã³ã«åŒã˜æŽ¥ç¶šã®ã‚­ãƒ¼ã‹ã‚‰æ´¾ç”Ÿã—ãŸã‚­ãƒ¼ã«ã‚ˆã£ã¦ä¿è­·ã•ã‚Œã¾ã™ã€‚値ã¯å†é–‹ã®ãŸã‚ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ゼロã®å€¤ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã‚’使用ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦æ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚早期データãƒã‚¤ãƒˆæ•°ã‚’アプリケーションã§å®Ÿéš›ã«ã¯å¯èƒ½ãªé™ã‚Šä½Žãä¿ã¤ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] SZクライアントã‹ã‚‰ãƒã‚¤ãƒˆå˜ä½ã§å—ã‘入れる早期データã®é‡ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€WolfSSLコンテキストを使用ã—ã¦TLS V1.3サーãƒãƒ¼ã«ã‚ˆã£ã¦å—ã‘入れられるアーリーデータã®æœ€å¤§é‡ã‚’設定ã—ã¾ã™ã€‚ + ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€å†ç”Ÿæ”»æ’ƒã‚’軽減ã™ã‚‹ãŸã‚プロセスã¸ã®ã‚¢ãƒ¼ãƒªãƒ¼ãƒ‡ãƒ¼ã‚¿ã®é‡ã‚’制é™ã—ã¾ã™ã€‚ + åˆæœŸã®ãƒ‡ãƒ¼ã‚¿ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒé€ä¿¡ã•ã‚ŒãŸã“ã¨ã€ã—ãŸãŒã£ã¦ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆãŒå†é–‹ã•ã‚Œã‚‹ãŸã³ã«åŒã˜æŽ¥ç¶šã®éµã‹ã‚‰æ´¾ç”Ÿã—ãŸéµã«ã‚ˆã£ã¦ä¿è­·ã•ã‚Œã¾ã™ã€‚ + 値ã¯å†é–‹ã®ãŸã‚ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ + ゼロã®å€¤ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒã‚±ãƒƒãƒˆã‚’使用ã—ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã«ã‚ˆã£ã¦ã‚¢ãƒ¼ãƒªãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚ + アーリーデータãƒã‚¤ãƒˆæ•°ã‚’アプリケーションã§å®Ÿéš›ã«ã¯å¯èƒ½ãªé™ã‚Šä½Žãä¿ã¤ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] SZクライアントã‹ã‚‰ãƒã‚¤ãƒˆå˜ä½ã§å—ã‘入れるアーリーデータã®ã‚µã‚¤ã‚ºã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã€ã¾ãŸã¯TLS v1.3を使用ã—ã¦ã„ãªã„å ´åˆã€‚ \return SIDE_ERROR クライアントã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -9139,15 +10510,19 @@ int wolfSSL_set_max_early_data(WOLFSSL* ssl, unsigned int sz); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€å†é–‹æ™‚ã«ã‚µãƒ¼ãƒãƒ¼ã«æ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’書ãè¾¼ã¿ã¾ã™ã€‚wolfssl_connect()ã¾ãŸã¯wolfssl_connect_tlsv13()ã®ä»£ã‚ã‚Šã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€ã‚µãƒ¼ãƒãƒ¼ã«æŽ¥ç¶šã—ã¦ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ã‚Šã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \param [in] データ早期データをä¿æŒã—ã¦ã‚µãƒ¼ãƒãƒ¼ã«æ›¸ã込むãƒãƒƒãƒ•ã‚¡ã€‚ - \param [in] SZãƒã‚¤ãƒˆå˜ä½ã§æ›¸ã込む早期データã®é‡ã€‚ - \param [out] OUTSZãƒã‚¤ãƒˆå˜ä½ã§æ›¸ã‹ã‚ŒãŸæ—©æœŸãƒ‡ãƒ¼ã‚¿ã®é‡ã€‚ - \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãƒ‘ラメータãŒNULLã®å ´åˆã€SZã¯0未満ã¾ãŸã¯TLSV1.3を使用ã—ãªã„。 - \return SIDE_ERROR サーãƒãƒ¼ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ - \return WOLFSSL_FATAL_ERROR 接続ãŒè¡Œã‚ã‚Œã¦ã„ãªã„å ´åˆã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³å†é–‹æ™‚ã«ã‚µãƒ¼ãƒãƒ¼ã«ã‚¢ãƒ¼ãƒªãƒ¼ãƒ‡ãƒ¼ã‚¿ã‚’書ãè¾¼ã¿ã¾ã™ã€‚ + wolfSSL_connect()ã¾ãŸã¯wolfSSL_connect_tlsv13()ã®ä»£ã‚ã‚Šã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€ã‚µãƒ¼ãƒãƒ¼ã«æŽ¥ç¶šã—ã¦ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ã‚Šã¾ã™ã€‚ + ã“ã®æ©Ÿèƒ½ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãƒ‘ラメータãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚szã¯0未満ã¾ãŸã¯TLSV1.3を使用ã—ãªã„å ´åˆã«ã‚‚è¿”ã•ã‚Œã¾ã™ã€‚ + \return SIDE_ERROR サーãƒãƒ¼ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return WOLFSSL_FATAL_ERROR 接続ãŒè¡Œã‚ã‚Œã¦ã„ãªã„å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] data アーリーデータをä¿æŒã—ã¦ã„ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in] sz 書ã込むアーリーデータã®ã‚µã‚¤ã‚º + \param [out] outSz 書ã込んã ã‚¢ãƒ¼ãƒªãƒ¼ãƒ‡ãƒ¼ã‚¿ã®ã‚µã‚¤ã‚º + _Example_ \code int ret = 0; @@ -9177,19 +10552,20 @@ \sa wolfSSL_connect \sa wolfSSL_connect_TLSv13 */ -int wolfSSL_write_early_data(OLFSSL* ssl, const void* data, +int wolfSSL_write_early_data(WOLFSSL* ssl, const void* data, int sz, int* outSz); /*! - \ingroup IO - \brief ã“ã®é–¢æ•°ã¯ã€å†é–‹æ™‚ã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã®æ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚Šã¾ã™ã€‚wolfssl_accept()ã¾ãŸã¯wolfssl_accept_tlsv13()ã®ä»£ã‚ã‚Šã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚’å—ã‘入れã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯å†…ã®æ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚Šã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚ˆã‚Šã‚‚早期データãŒãªã„å ´åˆã¯ã€é€šå¸¸ã¨ã—ã¦å‡¦ç†ã•ã‚Œã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã‚µãƒ¼ãƒãƒ¼ã§ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup IO + \brief ã“ã®é–¢æ•°ã¯ã€å†é–‹æ™‚ã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã®æ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚Šã¾ã™ã€‚wolfssl_accept()ã¾ãŸã¯wolfssl_accept_tlsv13()ã®ä»£ã‚ã‚Šã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¦ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚’å—ã‘入れã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯å†…ã®æ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’読ã¿å–ã‚Šã¾ã™ã€‚ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚ˆã‚Šã‚‚早期データãŒãªã„å ´åˆã¯ã€é€šå¸¸ã¨ã—ã¦å‡¦ç†ã•ã‚Œã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã‚µãƒ¼ãƒãƒ¼ã§ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param [out] データã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰èª­ã¿è¾¼ã¾ã‚ŒãŸæ—©æœŸãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã™ã‚‹ãŸã‚ã®ãƒãƒƒãƒ•ã‚¡ã€‚ \param [in] ãƒãƒƒãƒ•ã‚¡ã®SZサイズãƒã‚¤ãƒˆæ•°ã€‚ \param [out] OUTSZåˆæœŸãƒ‡ãƒ¼ã‚¿ã®ãƒã‚¤ãƒˆæ•°ã€‚ \return BAD_FUNC_ARG ãƒã‚¤ãƒ³ã‚¿ãƒ‘ラメータãŒNULLã®å ´åˆã€SZã¯0未満ã¾ãŸã¯TLSV1.3を使用ã—ãªã„。 \return SIDE_ERROR クライアントã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ \return WOLFSSL_FATAL_ERROR 接続をå—ã‘入れるã¨å¤±æ•—ã—ãŸå ´åˆ + _Example_ \code int ret = 0; @@ -9222,9 +10598,10 @@ int* outSz); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3接続ã®ãƒ—レシェアキー(PSK)クライアントå´ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯PSKアイデンティティを見ã¤ã‘ã€ãã®ã‚­ãƒ¼ã¨ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ä½¿ç”¨ã™ã‚‹æš—å·ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造体ã®client_psk_tls13_cbメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3接続ã®ãƒ—レシェアéµï¼ˆPSK)クライアントå´ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯PSKアイデンティティを見ã¤ã‘ã€ãã®ã‚­ãƒ¼ã¨ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ä½¿ç”¨ã™ã‚‹æš—å·ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€WOLFSSL_CTX構造体ã®client_psk_tls13_cbメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx; @@ -9239,9 +10616,10 @@ wc_psk_client_tls13_callback cb); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3接続ã®ãƒ—レシェアキー(PSK)クライアントå´ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯PSKアイデンティティを見ã¤ã‘ã€ãã®ã‚­ãƒ¼ã¨ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ä½¿ç”¨ã™ã‚‹æš—å·ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl構造体ã®Optionsフィールドã®client_psk_tls13_cbメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -9256,9 +10634,10 @@ wc_psk_client_tls13_callback cb); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3接続用ã®äº‹å‰å…±æœ‰ã‚­ãƒ¼ï¼ˆPSK)サーãƒå´ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯PSKアイデンティティを見ã¤ã‘ã€ãã®ã‚­ãƒ¼ã¨ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ä½¿ç”¨ã™ã‚‹æš—å·ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造体ã®server_psk_tls13_cbメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ - \param [in,out] ctx wolfssl_ctx_new()ã§ä½œæˆã•ã‚ŒãŸwolfssl_ctx構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3接続用ã®äº‹å‰å…±æœ‰éµï¼ˆPSK)サーãƒå´ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯PSKアイデンティティを見ã¤ã‘ã€ãã®ã‚­ãƒ¼ã¨ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ä½¿ç”¨ã™ã‚‹æš—å·ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx構造体ã®server_psk_tls13_cbメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ + \param [in,out] ctx wolfSSL_CTX_new()ã§ä½œæˆã•ã‚ŒãŸWOLFSSL_CTX構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL_CTX* ctx; @@ -9273,9 +10652,10 @@ wc_psk_server_tls13_callback cb); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3接続用ã®äº‹å‰å…±æœ‰ã‚­ãƒ¼ï¼ˆPSK)サーãƒå´ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯PSKアイデンティティを見ã¤ã‘ã€ãã®ã‚­ãƒ¼ã¨ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ä½¿ç”¨ã™ã‚‹æš—å·ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl構造体ã®ã‚ªãƒ—ションフィールドã®server_psk_tls13_cbメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€TLS v1.3接続用ã®äº‹å‰å…±æœ‰éµï¼ˆPSK)サーãƒå´ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’設定ã—ã¾ã™ã€‚コールãƒãƒƒã‚¯ã¯PSKアイデンティティを見ã¤ã‘ã€ãã®ã‚­ãƒ¼ã¨ã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«ä½¿ç”¨ã™ã‚‹æš—å·ã®åå‰ã‚’è¿”ã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl構造体ã®ã‚ªãƒ—ションフィールドã®server_psk_tls13_cbメンãƒãƒ¼ã‚’設定ã—ã¾ã™ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + _Example_ \code WOLFSSL* ssl; @@ -9290,12 +10670,13 @@ wc_psk_server_tls13_callback cb); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€ã‚­ãƒ¼ãƒšã‚¢ã®ç”Ÿæˆã‚’å«ã‚€ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ã‚­ãƒ¼ã‚·ã‚§ã‚¢ã‚¨ãƒ³ãƒˆãƒªã‚’作æˆã—ã¾ã™ã€‚Keyshareエクステンションã«ã¯ã€éµäº¤æ›ã®ãŸã‚ã®ç”Ÿæˆã•ã‚ŒãŸã™ã¹ã¦ã®å…¬é–‹éµãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚ã“ã®é–¢æ•°ãŒå‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€æŒ‡å®šã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ãŒå«ã¾ã‚Œã¾ã™ã€‚優先グループãŒã‚µãƒ¼ãƒãƒ¼ã«å¯¾ã—ã¦ä»¥å‰ã«ç¢ºç«‹ã•ã‚Œã¦ã„ã‚‹ã¨ãã«ã“ã®é–¢æ•°ã‚’呼ã³å‡ºã—ã¾ã™ã€‚ - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ \param [in] キー交æ›ã‚°ãƒ«ãƒ¼ãƒ—識別å­ã‚’グループ化ã—ã¾ã™ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆ - \return MEMORY_E 動的メモリ割り当ã¦ãŒå¤±æ•—ã™ã‚‹ã¨å¤±æ•—ã™ã‚‹ã¨ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return MEMORY_E 動的メモリ割り当ã¦ã«å¤±æ•—ã™ã‚‹ã¨è¿”ã•ã‚Œã¾ã™ã€‚ + _Example_ \code int ret; @@ -9316,11 +10697,12 @@ int wolfSSL_UseKeyShare(WOLFSSL* ssl, word16 group); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€ClientHelloã§éµå…±æœ‰ãŒé€ä¿¡ã•ã‚Œãªã„よã†ã«å‘¼ã³å‡ºã•ã‚Œã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã«éµäº¤æ›ãŒå¿…è¦ãªå ´åˆã¯ã€ã‚µãƒ¼ãƒãƒ¼ãŒHelloretryRequestã§å¿œç­”ã™ã‚‹ã‚ˆã†ã«å¼·åˆ¶ã—ã¾ã™ã€‚予想ã•ã‚Œã‚‹éµäº¤æ›ã‚°ãƒ«ãƒ¼ãƒ—ãŒçŸ¥ã‚‰ã‚Œã¦ãŠã‚‰ãšã€ã‚­ãƒ¼ã®ç”Ÿæˆã‚’ä¸å¿…è¦ã«å›žé¿ã™ã‚‹ã¨ãã«ã“ã®æ©Ÿèƒ½ã‚’呼ã³å‡ºã—ã¾ã™ã€‚éµäº¤æ›ãŒå¿…è¦ãªã¨ãã«ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’完了ã™ã‚‹ãŸã‚ã«è¿½åŠ ã®å¾€å¾©ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。 - \param [in,out] SSL wolfssl_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸwolfssl構造ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ - \return BAD_FUNC_ARG SSLãŒNULLã®å ´åˆ + \param [in,out] ssl wolfSSL_new()を使用ã—ã¦ä½œæˆã•ã‚ŒãŸWOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \return BAD_FUNC_ARG sslãŒNULLã®å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ \return SIDE_ERROR サーãƒãƒ¼ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã€‚ + _Example_ \code int ret; @@ -9336,10 +10718,11 @@ int wolfSSL_NoKeyShares(WOLFSSL* ssl); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ \param [in] ヒープé™çš„メモリ割り当ã¦ä¸­ã«é™çš„メモリ割り当ã¦å™¨ãŒä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’使用ã—ã¾ã™ã€‚ - \return If æˆåŠŸã™ã‚‹ã¨ã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return æ–°ã—ã作æˆã•ã‚ŒãŸwWOLFSSL_METHOS構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code #include @@ -9367,10 +10750,11 @@ WOLFSSL_METHOD *wolfTLSv1_3_server_method_ex(void* heap); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ \param [in] ヒープé™çš„メモリ割り当ã¦ä¸­ã«é™çš„メモリ割り当ã¦å™¨ãŒä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’使用ã—ã¾ã™ã€‚ - \return If æˆåŠŸã™ã‚‹ã¨ã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \return æ–°ã—ã作æˆã•ã‚ŒãŸwWOLFSSL_METHOS構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code #include @@ -9398,9 +10782,10 @@ WOLFSSL_METHOD *wolfTLSv1_3_client_method_ex(void* heap); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return If æˆåŠŸã™ã‚‹ã¨ã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚µãƒ¼ãƒãƒ¼ã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æ–°ã—ã作æˆã•ã‚ŒãŸwWOLFSSL_METHOS構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code #include @@ -9428,9 +10813,10 @@ WOLFSSL_METHOD *wolfTLSv1_3_server_method(void); /*! - \ingroup Setup - \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfssl_ctx_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ - \return If æˆåŠŸã™ã‚‹ã¨ã€å‘¼ã³å‡ºã—ã¯æ–°ã—ã作æˆã•ã‚ŒãŸwolfssl_method構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã€ã‚¢ãƒ—リケーションãŒã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã€TLS 1.3プロトコルã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™ã€‚ã“ã®é–¢æ•°ã¯ã€wolfSSL_CTX_new()を使用ã—ã¦SSL / TLSコンテキストを作æˆã™ã‚‹ã¨ãã«ä½¿ç”¨ã•ã‚Œã‚‹æ–°ã—ã„Wolfssl_method構造体ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã¦åˆæœŸåŒ–ã—ã¾ã™ã€‚ + \return æ–°ã—ã作æˆã•ã‚ŒãŸwWOLFSSL_METHOS構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ã€‚ + _Example_ \code #include @@ -9458,10 +10844,11 @@ WOLFSSL_METHOD *wolfTLSv1_3_client_method(void); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€ã¾ã ã©ã¡ã‚‰ã®å´ï¼ˆã‚µãƒ¼ãƒ/クライアント)を決定ã—ã¦ã„ãªã„ã“ã¨ã‚’除ã„ã¦ã€Wolftlsv1_3_client_methodã¨åŒæ§˜ã®wolfssl_methodã‚’è¿”ã—ã¾ã™ã€‚ \param [in] ヒープé™çš„メモリ割り当ã¦ä¸­ã«é™çš„メモリ割り当ã¦å™¨ãŒä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’使用ã—ã¾ã™ã€‚ \return WOLFSSL_METHOD æˆåŠŸã—ãŸä½œæˆã§ã¯ã€wolfssl_methodãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ + _Example_ \code WOLFSSL* ctx; @@ -9474,9 +10861,10 @@ WOLFSSL_METHOD *wolfTLSv1_3_method_ex(void* heap); /*! - \ingroup Setup + \ingroup Setup \brief ã“ã®é–¢æ•°ã¯ã€ã¾ã ã©ã¡ã‚‰ã®å´ï¼ˆã‚µãƒ¼ãƒ/クライアント)を決定ã—ã¦ã„ãªã„ã“ã¨ã‚’除ã„ã¦ã€Wolftlsv1_3_client_methodã¨åŒæ§˜ã®wolfssl_methodã‚’è¿”ã—ã¾ã™ã€‚ \return WOLFSSL_METHOD æˆåŠŸã—ãŸä½œæˆã§ã¯ã€wolfssl_methodãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ + _Example_ \code WOLFSSL* ctx; @@ -9489,10 +10877,199 @@ WOLFSSL_METHOD *wolfTLSv1_3_method(void); /*! + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã«Certificateメッセージã§é€ä¿¡ã§ãる証明書タイプを設定ã—ã¾ã™ã€‚ + サーãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€å—入れå¯èƒ½ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ã¾ã™ã€‚ + Raw Public Key 証明書をé€å—ä¿¡ã—ãŸã„å ´åˆã«ã¯ã“ã®é–¢æ•°ã‚’使ã£ã¦è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + 設定ã™ã‚‹è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã¯å„ªå…ˆåº¦é †ã«æ ¼ç´ã—ãŸãƒã‚¤ãƒˆé…列ã¨ã—ã¦æ¸¡ã—ã¾ã™ã€‚ + 設定ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã‚¢ãƒ‰ãƒ¬ã‚¹ã«NULLを渡ã™ã‹ã€ã‚ã‚‹ã„ã¯ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã«0を渡ã™ã¨è¦å®šå€¤ã«ã‚‚ã©ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + è¦å®šå€¤ã¯X509証明書(WOLFSSL_CERT_TYPE_X509)ã®ã¿ã‚’扱ã†è¨­å®šã¨ãªã£ã¦ã„ã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸ + \return BAD_FUNC_ARG ctxã¨ã—ã¦NULLを渡ã—ãŸã€ã‚ã‚‹ã„ã¯ä¸æ­£ãªè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を指定ã—ãŸã€ + ã‚ã‚‹ã„ã¯MAX_CLIENT_CERT_TYPE_CNT以上ã®ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’指定ã—ãŸã€ã‚ã‚‹ã„ã¯æŒ‡å®šã®è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã«é‡è¤‡ãŒã‚ã‚‹ + \param ctx wolfssl_ctxコンテキストãƒã‚¤ãƒ³ã‚¿ + \param ctype 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param len 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°ï¼‰ + _Example_ + \code + int ret; + WOLFSSL_CTX* ctx; + char ctype[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(ctype)/sizeof(byte); + ... + + ret = wolfSSL_CTX_set_client_cert_type(ctx, ctype, len); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_CTX_set_client_cert_type(WOLFSSL_CTX* ctx, const char* buf, int len); + +/*! + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã«Certificateメッセージã§é€ä¿¡ã§ãる証明書タイプを設定ã—ã¾ã™ã€‚ + クライアントå´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€å—入れå¯èƒ½ãªã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ã¾ã™ã€‚ + Raw Public Key 証明書をé€å—ä¿¡ã—ãŸã„å ´åˆã«ã¯ã“ã®é–¢æ•°ã‚’使ã£ã¦è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + 設定ã™ã‚‹è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã¯å„ªå…ˆåº¦é †ã«æ ¼ç´ã—ãŸãƒã‚¤ãƒˆé…列ã¨ã—ã¦æ¸¡ã—ã¾ã™ã€‚ + 設定ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã‚¢ãƒ‰ãƒ¬ã‚¹ã«NULLを渡ã™ã‹ã€ã‚ã‚‹ã„ã¯ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã«0を渡ã™ã¨è¦å®šå€¤ã«ã‚‚ã©ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + è¦å®šå€¤ã¯X509証明書(WOLFSSL_CERT_TYPE_X509)ã®ã¿ã‚’扱ã†è¨­å®šã¨ãªã£ã¦ã„ã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸ + \return BAD_FUNC_ARG ctxã¨ã—ã¦NULLを渡ã—ãŸã€ã‚ã‚‹ã„ã¯ä¸æ­£ãªè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を指定ã—ãŸã€ + ã‚ã‚‹ã„ã¯MAX_SERVER_CERT_TYPE_CNT以上ã®ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’指定ã—ãŸã€ã‚ã‚‹ã„ã¯æŒ‡å®šã®è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã«é‡è¤‡ãŒã‚ã‚‹ + + \param ctx wolfssl_ctxコンテキストãƒã‚¤ãƒ³ã‚¿ + \param ctype 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param len 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°ï¼‰ + _Example_ + \code + int ret; + WOLFSSL_CTX* ctx; + char ctype[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(ctype)/sizeof(byte); + ... + + ret = wolfSSL_CTX_set_server_cert_type(ctx, ctype, len); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_CTX_set_server_cert_type(WOLFSSL_CTX* ctx, const char* buf, int len); + +/*! + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€ã‚µãƒ¼ãƒãƒ¼å´ã«Certificateメッセージã§é€ä¿¡ã§ãる証明書タイプを設定ã—ã¾ã™ã€‚ + サーãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€å—入れå¯èƒ½ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ã¾ã™ã€‚ + Raw Public Key 証明書をé€å—ä¿¡ã—ãŸã„å ´åˆã«ã¯ã“ã®é–¢æ•°ã‚’使ã£ã¦è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + 設定ã™ã‚‹è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã¯å„ªå…ˆåº¦é †ã«æ ¼ç´ã—ãŸãƒã‚¤ãƒˆé…列ã¨ã—ã¦æ¸¡ã—ã¾ã™ã€‚ + 設定ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã‚¢ãƒ‰ãƒ¬ã‚¹ã«NULLを渡ã™ã‹ã€ã‚ã‚‹ã„ã¯ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã«0を渡ã™ã¨è¦å®šå€¤ã«ã‚‚ã©ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + è¦å®šå€¤ã¯X509証明書(WOLFSSL_CERT_TYPE_X509)ã®ã¿ã‚’扱ã†è¨­å®šã¨ãªã£ã¦ã„ã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸ + \return BAD_FUNC_ARG sslã¨ã—ã¦NULLを渡ã—ãŸã€ã‚ã‚‹ã„ã¯ä¸æ­£ãªè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を指定ã—ãŸã€ + ã‚ã‚‹ã„ã¯MAX_CLIENT_CERT_TYPE_CNT以上ã®ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’指定ã—ãŸã€ã‚ã‚‹ã„ã¯æŒ‡å®šã®è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã«é‡è¤‡ãŒã‚ã‚‹ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param ctype 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param len 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°ï¼‰ + _Example_ + \code + int ret; + WOLFSSL* ssl; + char ctype[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(ctype)/sizeof(byte); + ... + + ret = wolfSSL_set_client_cert_type(ssl, ctype, len); + \endcode + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_set_client_cert_type(WOLFSSL* ssl, const char* buf, int len); + +/*! + \ingroup Setup + \brief ã“ã®é–¢æ•°ã¯ã‚µãƒ¼ãƒãƒ¼å´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã«Certificateメッセージã§é€ä¿¡ã§ãる証明書タイプを設定ã—ã¾ã™ã€‚ + クライアントå´ã§å‘¼ã³å‡ºã•ã‚Œã‚‹å ´åˆã«ã¯ã€å—入れå¯èƒ½ãªã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ã¾ã™ã€‚ + Raw Public Key 証明書をé€å—ä¿¡ã—ãŸã„å ´åˆã«ã¯ã“ã®é–¢æ•°ã‚’使ã£ã¦è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を設定ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + 設定ã™ã‚‹è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã¯å„ªå…ˆåº¦é †ã«æ ¼ç´ã—ãŸãƒã‚¤ãƒˆé…列ã¨ã—ã¦æ¸¡ã—ã¾ã™ã€‚ + 設定ã™ã‚‹ãƒãƒƒãƒ•ã‚¡ã‚¢ãƒ‰ãƒ¬ã‚¹ã«NULLを渡ã™ã‹ã€ã‚ã‚‹ã„ã¯ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã«0を渡ã™ã¨è¦å®šå€¤ã«ã‚‚ã©ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ + è¦å®šå€¤ã¯X509証明書(WOLFSSL_CERT_TYPE_X509)ã®ã¿ã‚’扱ã†è¨­å®šã¨ãªã£ã¦ã„ã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸ + \return BAD_FUNC_ARG ctxã¨ã—ã¦NULLを渡ã—ãŸã€ã‚ã‚‹ã„ã¯ä¸æ­£ãªè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—を指定ã—ãŸã€ + ã‚ã‚‹ã„ã¯MAX_SERVER_CERT_TYPE_CNT以上ã®ãƒãƒƒãƒ•ã‚¡ã‚µã‚¤ã‚ºã‚’指定ã—ãŸã€ã‚ã‚‹ã„ã¯æŒ‡å®šã®è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã«é‡è¤‡ãŒã‚ã‚‹ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param ctype 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param len 証明書タイプを格ç´ã—ãŸãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºï¼ˆãƒã‚¤ãƒˆæ•°ï¼‰ + _Example_ + \code + int ret; + WOLFSSL* ssl; + char ctype[] = {WOLFSSL_CERT_TYPE_RPK, WOLFSSL_CERT_TYPE_X509}; + int len = sizeof(ctype)/sizeof(byte); + ... + + ret = wolfSSL_set_server_cert_type(ssl, ctype, len); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_set_server_cert_type(WOLFSSL* ssl, const char* buf, int len); + +/*! \ingroup SSL + \brief ã“ã®é–¢æ•°ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯çµ‚了後ã«å‘¼ã³å‡ºã—ã€ç›¸æ‰‹ã¨ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®çµæžœå¾—られãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã‚’è¿”ã—ã¾ã™ã€‚ + ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãŒç™ºç”Ÿã—ãªã„å ´åˆã«ã¯æˆ»ã‚Šå€¤ã¨ã—ã¦WOLFSSL_SUCCESSãŒè¿”ã•ã‚Œã¾ã™ãŒã€ + 証明書タイプã¨ã—ã¦ã¯WOLFSSL_CERT_TYPE_UNKNOWNãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«ã‹ãˆã‚Šã¾ã™ã€‚tpã«è¿”ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã¯WOLFSSL_CERT_TYPE_X509, + WOLFSSL_CERT_TYPE_RPK ã‚ã‚‹ã„ã¯WOLFSSL_CERT_TYPE_UNKNOWNã®ã„ãšã‚Œã‹ã¨ãªã‚Šã¾ã™ã€‚ + \return BAD_FUNC_ARG sslã¨ã—ã¦NULLを渡ã—ãŸã€ã‚ã‚‹ã„ã¯tpã¨ã—ã¦NULLを渡ã—㟠+ \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param tp 証明書タイプãŒè¿”ã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ + \code + int ret; + WOLFSSL* ssl; + int tp; + ... + + ret = wolfSSL_get_negotiated_client_cert_type(ssl, &tp); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_get_negotiated_server_cert_type + */ +int wolfSSL_get_negotiated_client_cert_type(WOLFSSL* ssl, int* tp); + +/*! + \ingroup SSL + \brief ã“ã®é–¢æ•°ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯çµ‚了後ã«å‘¼ã³å‡ºã—ã€ç›¸æ‰‹ã¨ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã®çµæžœå¾—られãŸã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®ã‚¿ã‚¤ãƒ—ã‚’è¿”ã—ã¾ã™ã€‚ + ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãŒç™ºç”Ÿã—ãªã„å ´åˆã«ã¯æˆ»ã‚Šå€¤ã¨ã—ã¦WOLFSSL_SUCCESSãŒè¿”ã•ã‚Œã¾ã™ãŒã€è¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã¨ã—ã¦ã¯WOLFSSL_CERT_TYPE_UNKNOWNãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«ã‹ãˆã‚Šã¾ã™ã€‚tpã«è¿”ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã‚¿ã‚¤ãƒ—ã¯WOLFSSL_CERT_TYPE_X509, + WOLFSSL_CERT_TYPE_RPK ã‚ã‚‹ã„ã¯WOLFSSL_CERT_TYPE_UNKNOWNã®ã„ãšã‚Œã‹ã¨ãªã‚Šã¾ã™ã€‚ + \return BAD_FUNC_ARG sslã¨ã—ã¦NULLを渡ã—ãŸã€ã‚ã‚‹ã„ã¯tpã¨ã—ã¦NULLを渡ã—㟠+ \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param tp 証明書タイプãŒè¿”ã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + _Example_ + \code + int ret; + WOLFSSL* ssl; + int tp; + ... + + ret = wolfSSL_get_negotiated_server_cert_type(ssl, &tp); + \endcode + \sa wolfSSL_set_client_cert_type + \sa wolfSSL_CTX_set_client_cert_type + \sa wolfSSL_set_server_cert_type + \sa wolfSSL_CTX_set_server_cert_type + \sa wolfSSL_get_negotiated_client_cert_type + */ +int wolfSSL_get_negotiated_server_cert_type(WOLFSSL* ssl, int* tp); + +/*! + \ingroup SSL \brief ã“ã®é–¢æ•°ã¯ãƒ†ã‚¹ãƒˆã®ãŸã‚ã®å›ºå®š/é™çš„ãªã‚¨ãƒ•ã‚§ãƒ©ãƒ«ã‚­ãƒ¼ã‚’設定ã—ã¾ã™ã€‚ - \return 0 キーãŒæ­£å¸¸ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã—㟠- \param ctx wolfssl_ctxコンテキストãƒã‚¤ãƒ³ã‚¿ + \return 0 æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ctx WOLFSSL_CTXコンテキストãƒã‚¤ãƒ³ã‚¿ \param keyAlgo WC_PK_TYPE_DHãŠã‚ˆã³WC_PK_TYPE_ECDHã®ã‚ˆã†ãªenum wc_pktype \param key キーファイルパス(Keysz == 0)ã¾ãŸã¯å®Ÿéš›ã®ã‚­ãƒ¼ãƒãƒƒãƒ•ã‚¡ï¼ˆPEMã¾ãŸã¯ASN.1) \param keySz キーサイズ(「キーã€argã¯ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘スã®å ´åˆã¯0ã«ãªã‚Šã¾ã™ï¼‰ @@ -9501,10 +11078,10 @@ int wolfSSL_CTX_set_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, const char* key, unsigned int keySz, int format); /*! - \ingroup SSL + \ingroup SSL \brief ã“ã®é–¢æ•°ã¯ãƒ†ã‚¹ãƒˆã®ãŸã‚ã®å›ºå®š/é™çš„ãªã‚¨ãƒ•ã‚§ãƒ©ãƒ«ã‚­ãƒ¼ã‚’設定ã—ã¾ã™ã€‚ - \return 0 キーãŒæ­£å¸¸ã«ãƒ­ãƒ¼ãƒ‰ã•ã‚Œã¾ã—㟠- \param ssl wolfsslオブジェクトãƒã‚¤ãƒ³ã‚¿ + \return 0 æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param keyAlgo WC_PK_TYPE_DHãŠã‚ˆã³WC_PK_TYPE_ECDHã®ã‚ˆã†ãªenum wc_pktype \param key キーファイルパス(Keysz == 0)ã¾ãŸã¯å®Ÿéš›ã®ã‚­ãƒ¼ãƒãƒƒãƒ•ã‚¡ï¼ˆPEMã¾ãŸã¯ASN.1) \param keySz キーサイズ(「キーã€argã¯ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘スã®å ´åˆã¯0ã«ãªã‚Šã¾ã™ï¼‰ @@ -9513,42 +11090,225 @@ int wolfSSL_set_ephemeral_key(WOLFSSL* ssl, int keyAlgo, const char* key, unsigned int keySz, int format); /*! - \ingroup SSL - \brief ã“ã®é–¢æ•°ã¯asn.1 / derã¨ã—ã¦ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸã‚­ãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ - \return 0 キーãŒæ­£å¸¸ã«æˆ»ã‚Šã¾ã—㟠+ \ingroup SSL + \brief ã“ã®é–¢æ•°ã¯ ASN.1/DERã¨ã—ã¦ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸã‚­ãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ + \return 0 æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ \param ctx wolfssl_ctxコンテキストãƒã‚¤ãƒ³ã‚¿ \param keyAlgo WC_PK_TYPE_DHãŠã‚ˆã³WC_PK_TYPE_ECDHã®ã‚ˆã†ãªenum wc_pktype \param key キーãƒãƒƒãƒ•ã‚¡ãƒã‚¤ãƒ³ã‚¿ \sa wolfSSL_CTX_set_ephemeral_key */ -int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, +int wolfSSL_CTX_get_ephemeral_key(WOLFSSL_CTX* ctx, int keyAlgo, const unsigned char** key, unsigned int* keySz); /*! - \ingroup SSL - \brief ã“ã®é–¢æ•°ã¯asn.1 / derã¨ã—ã¦ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸã‚­ãƒ¼ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ - \return 0 キーãŒæ­£å¸¸ã«æˆ»ã‚Šã¾ã—㟠- \param ssl wolfsslオブジェクトãƒã‚¤ãƒ³ã‚¿ + \ingroup SSL + \brief ã“ã®é–¢æ•°ã¯ ASN.1/DERã¨ã—ã¦ãƒ­ãƒ¼ãƒ‰ã•ã‚ŒãŸéµã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã—ã¾ã™ + \return 0 æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ \param keyAlgo WC_PK_TYPE_DHãŠã‚ˆã³WC_PK_TYPE_ECDHã®ã‚ˆã†ãªenum wc_pktype \param key キーãƒãƒƒãƒ•ã‚¡ãƒã‚¤ãƒ³ã‚¿ \sa wolfSSL_set_ephemeral_key */ -int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo, +int wolfSSL_get_ephemeral_key(WOLFSSL* ssl, int keyAlgo, const unsigned char** key, unsigned int* keySz); /*! - \ingroup SSL - \brief é¸æŠžã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã€ãƒ‘ディングã€ãŠã‚ˆã³RSAキーを使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã™ã‚‹ - \return WOLFSSL_SUCCESS Errorã®æˆåŠŸã¨wolfssl_failureã«ã¤ã„㦠+ \ingroup SSL + \brief é¸æŠžã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã€ãƒ‘ディングã€ãŠã‚ˆã³RSAキーを使用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç½²åã—ã¾ã™ã€‚ + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \return WOLFSSL_FAILURE エラー発生時ã«è¿”ã•ã‚Œã¾ã™ã€‚ + \param type ãƒãƒƒã‚·ãƒ¥NID - \param m ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€‚ã“ã‚Œã¯ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆã«ãªã‚‹å¯èƒ½æ€§ãŒé«˜ã„ + \param m ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€‚ã“ã‚Œã¯ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆ \param mLen ç½²åã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é•·ã• - \param sigRet 出力ãƒãƒƒãƒ•ã‚¡ - \param sigLen オン入力:出力時ã®Sigretãƒãƒƒãƒ•ã‚¡ã®é•·ã•ï¼šSigretã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®é•·ã• - \param rsa RSAキー入力ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã¾ã™ + \param sigRet 出力ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + \param sigLen 入力時ã«ã¯sigRetã®é•·ã•ã‚’指定ã—ã¾ã™ã€‚出力時ã«ã¯sigRetã«æ›¸ãè¾¼ã¾ã‚ŒãŸãƒ‡ãƒ¼ã‚¿ã®é•·ã•ã‚’æ ¼ç´ã—ã¾ã™ã€‚ + \param rsa 入力ã«ç½²åã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•ã‚Œã‚‹RSAéµ \param flag 1:シグニãƒãƒ£0:未パワード署åを比較ã™ã‚‹å€¤ã‚’出力ã—ã¾ã™ã€‚注:RSA_PKCS1_PSS_PADDINGã®å ´åˆã¯ã€wc_rsapss_checkpadding_ex関数を使用ã—ã¦* VERIFY *関数ã®å‡ºåŠ›ã‚’確èªã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ + \param padding パディング */ int wolfSSL_RSA_sign_generic_padding(int type, const unsigned char* m, unsigned int mLen, unsigned char* sigRet, unsigned int* sigLen, WOLFSSL_RSA* rsa, int flag, int padding); + +/*! + \ingroup SSL + \brief DTLSv1.3 é€ä¿¡æ¸ˆã¿ã ãŒã¾ã ç›¸æ‰‹ã‹ã‚‰ã‚¢ã‚¯ãƒŽãƒªãƒƒã‚¸ã‚’å—ã‘ã¨ã£ã¦ã„ãªã„メッセージãŒã‚ã‚‹ã‹èª¿ã¹ã¾ã™ã€‚ + + \return 1 ペンディングã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚‹å ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯0ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ +*/ +int wolfSSL_dtls13_has_pending_msg(WOLFSSL *ssl); + +/*! + \ingroup SSL + \brief アーリーデータã®æœ€å¤§ã‚µã‚¤ã‚ºã‚’å–å¾—ã—ã¾ã™ã€‚ + + \param [in] s WOLFSSL_SESSION構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + \return アーリーデータã®æœ€å¤§ã‚µã‚¤ã‚ºï¼ˆmax_early_data) + \param s WOLFSSL_SESSION構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ + + \sa wolfSSL_set_max_early_data + \sa wolfSSL_write_early_data + \sa wolfSSL_read_early_data + */ +unsigned int wolfSSL_SESSION_get_max_early_data(const WOLFSSL_SESSION *s); + +/*! + \ingroup SSL + \brief Get a new index for external data. This entry applies also for the + following API: + - wolfSSL_CTX_get_ex_new_index + - wolfSSL_get_ex_new_index + - wolfSSL_SESSION_get_ex_new_index + - wolfSSL_X509_get_ex_new_index + + \param [in] All input parameters are ignored. The callback functions are not + supported with wolfSSL. + + \return The new index value to be used with the external data API for this + object class. + */ +int wolfSSL_CRYPTO_get_ex_new_index(int, void*, void*, void*, void*); + +/*! + + \brief コãƒã‚¯ã‚·ãƒ§ãƒ³ID拡張を有効ã«ã—ã¾ã™ã€‚RFC9146ã¨RFC9147ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + \return WOLFSSL_SUCCESS æˆåŠŸæ™‚ã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \sa wolfSSL_dtls_cid_is_enabled + \sa wolfSSL_dtls_cid_set + \sa wolfSSL_dtls_cid_get_rx_size + \sa wolfSSL_dtls_cid_get_rx + \sa wolfSSL_dtls_cid_get_tx_size + \sa wolfSSL_dtls_cid_get_tx +*/ +int wolfSSL_dtls_cid_use(WOLFSSL* ssl); + +/*! + + \brief ã“ã®é–¢æ•°ã¯ãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ãŒå®Œäº†ã—ãŸå¾Œã«å‘¼ã³å‡ºã•ã‚Œã‚‹ã¨ã€ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³IDãŒãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã•ã‚ŒãŸã‹ã©ã†ã‹ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ + RFC9146ã¨RFC9147ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + \return 1 コãƒã‚¯ã‚·ãƒ§ãƒ³IDãŒãƒã‚´ã‚·ã‚¨ãƒ¼ãƒˆã•ã‚ŒãŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯0ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \sa wolfSSL_dtls_cid_use + \sa wolfSSL_dtls_cid_set + \sa wolfSSL_dtls_cid_get_rx_size + \sa wolfSSL_dtls_cid_get_rx + \sa wolfSSL_dtls_cid_get_tx_size + \sa wolfSSL_dtls_cid_get_tx +*/ +int wolfSSL_dtls_cid_is_enabled(WOLFSSL* ssl); + +/*! + + \brief ã“ã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã§ä»–ã®ãƒ”ã‚¢ã«å¯¾ã—ã¦ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³IDをセットã—ã¾ã™ã€‚ + RFC9146ã¨RFC9147ã‚’å‚ç…§ã—ã¦ãã ã•ã„。コãƒã‚¯ã‚·ãƒ§ãƒ³IDã¯æœ€å¤§å€¤ãŒDTLS_CID_MAX_SIZEã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 + DTLS_CID_MAX_SIZEã¯ãƒ“ルド時ã«å€¤ã‚’指定ãŒå¯èƒ½ã§ã™ãŒ255ãƒã‚¤ãƒˆã‚’ã“ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 + + + \return WOLFSSL_SUCCESS コãƒã‚¯ã‚·ãƒ§ãƒ³IDãŒã‚»ãƒƒãƒˆã§ããŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param cid コãƒã‚¯ã‚·ãƒ§ãƒ³ID + \param size コãƒã‚¯ã‚·ãƒ§ãƒ³IDã®ã‚µã‚¤ã‚º + + \sa wolfSSL_dtls_cid_use + \sa wolfSSL_dtls_cid_is_enabled + \sa wolfSSL_dtls_cid_get_rx_size + \sa wolfSSL_dtls_cid_get_rx + \sa wolfSSL_dtls_cid_get_tx_size + \sa wolfSSL_dtls_cid_get_tx +*/ +int wolfSSL_dtls_cid_set(WOLFSSL* ssl, unsigned char* cid, + unsigned int size); + +/*! + + \brief コãƒã‚¯ã‚·ãƒ§ãƒ³IDã®ã‚µã‚¤ã‚ºã‚’å–å¾—ã—ã¾ã™ã€‚RFC9146ã¨RFC9147ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + + \return WOLFSSL_SUCCESS コãƒã‚¯ã‚·ãƒ§ãƒ³IDãŒå–å¾—ã§ããŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param size コãƒã‚¯ã‚·ãƒ§ãƒ³IDã®ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã™ã‚‹int型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \sa wolfSSL_dtls_cid_use + \sa wolfSSL_dtls_cid_is_enabled + \sa wolfSSL_dtls_cid_set + \sa wolfSSL_dtls_cid_get_rx + \sa wolfSSL_dtls_cid_get_tx_size + \sa wolfSSL_dtls_cid_get_tx +*/ +int wolfSSL_dtls_cid_get_rx_size(WOLFSSL* ssl, + unsigned int* size); + +/*! + + \brief コãƒã‚¯ã‚·ãƒ§ãƒ³IDを引数bufferã§æŒ‡å®šã•ã‚ŒãŸãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚ + RFC9146ã¨RFC9147ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã¯å¼•æ•°bufferSzã§æŒ‡å®šã—ã¦ãã ã•ã„。 + + \return WOLFSSL_SUCCESS コãƒã‚¯ã‚·ãƒ§ãƒ³IDãŒå–å¾—ã§ããŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param buffer コãƒã‚¯ã‚·ãƒ§ãƒ³IDãŒã‚³ãƒ”ーã•ã‚Œã‚‹å…ˆã®ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param bufferSz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + \sa wolfSSL_dtls_cid_use + \sa wolfSSL_dtls_cid_is_enabled + \sa wolfSSL_dtls_cid_set + \sa wolfSSL_dtls_cid_get_rx_size + \sa wolfSSL_dtls_cid_get_tx_size + \sa wolfSSL_dtls_cid_get_tx +*/ +int wolfSSL_dtls_cid_get_rx(WOLFSSL* ssl, unsigned char* buffer, + unsigned int bufferSz); + +/*! + + \brief コãƒã‚¯ã‚·ãƒ§ãƒ³IDã®ã‚µã‚¤ã‚ºã‚’å–å¾—ã—ã¾ã™ã€‚c + サイズã¯å¼•æ•°size変数ã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS コãƒã‚¯ã‚·ãƒ§ãƒ³IDã®ã‚µã‚¤ã‚ºãŒå–å¾—ã§ããŸå ´åˆã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param size コãƒã‚¯ã‚·ãƒ§ãƒ³IDã®ã‚µã‚¤ã‚ºã‚’æ ¼ç´ã™ã‚‹int型変数ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + + \sa wolfSSL_dtls_cid_use + \sa wolfSSL_dtls_cid_is_enabled + \sa wolfSSL_dtls_cid_set + \sa wolfSSL_dtls_cid_get_rx_size + \sa wolfSSL_dtls_cid_get_rx + \sa wolfSSL_dtls_cid_get_tx +*/ +int wolfSSL_dtls_cid_get_tx_size(WOLFSSL* ssl, unsigned int* size); + +/*! + + \brief コãƒã‚¯ã‚·ãƒ§ãƒ³IDを引ãæ•°bufferã§æŒ‡å®šã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã«ã‚³ãƒ”ーã—ã¾ã™ã€‚RFC9146ã¨RFC9147ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 + ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã¯å¼•ãæ•°bufferSzã§æŒ‡å®šã—ã¾ã™ã€‚ + + \return WOLFSSL_SUCCESS ConnectionIDãŒæ­£å¸¸ã«ã‚³ãƒ”ーã•ã‚ŒãŸéš›ã«è¿”ã•ã‚Œã¾ã™ã€‚ãれ以外ã¯ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ãŒè¿”ã•ã‚Œã¾ã™ã€‚ + + \param ssl WOLFSSL構造体ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param buffer ConnectionIDãŒã‚³ãƒ”ーã•ã‚Œã‚‹ãƒãƒƒãƒ•ã‚¡ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã€‚ + \param bufferSz ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º + + \sa wolfSSL_dtls_cid_use + \sa wolfSSL_dtls_cid_is_enabled + \sa wolfSSL_dtls_cid_set + \sa wolfSSL_dtls_cid_get_rx_size + \sa wolfSSL_dtls_cid_get_rx + \sa wolfSSL_dtls_cid_get_tx_size +*/ +int wolfSSL_dtls_cid_get_tx(WOLFSSL* ssl, unsigned char* buffer, + unsigned int bufferSz); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/examples/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -84,3 +84,9 @@ This directory contains example wolfSSL configuration file templates for use when autoconf is not available, such as building with a custom IDE. See [configs/README.md](configs/README.md) for more details. + +## asn1 +This directory contains an example that prints the ASN.1 data of a BER/DER or PEM encoded file. Configure wolfSSL with `--enable-asn-print`. + +## pem +This directory contains an example of converting to/from PEM and DER. Configure wolfSSL with `--enable-coding` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/asn1/asn1.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/asn1/asn1.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/asn1/asn1.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/asn1/asn1.c 2024-08-03 07:30:00.000000000 +0000 @@ -30,8 +30,9 @@ #include #include #include +#include -#ifdef WOLFSSL_ASN_PRINT +#if defined(WOLFSSL_ASN_PRINT) && !defined(NO_FILESYSTEM) /* Increment allocated data by this much. */ #define DATA_INC_LEN 256 @@ -59,7 +60,7 @@ * @return 0 on success. * @return 1 on failure. */ -static int ReadFile(FILE* fp, unsigned char** pdata, word32* plen) +static int asn1App_ReadFile(FILE* fp, unsigned char** pdata, word32* plen) { int ret = 0; word32 len = 0; @@ -72,6 +73,11 @@ while ((read_len = fread(data + len, 1, DATA_INC_LEN, fp)) != 0) { unsigned char* p; + if (ferror(fp)) { + free(data); + return IO_FAILED_E; + } + /* Add read data amount to length. */ len += (word32)read_len; @@ -91,8 +97,6 @@ /* Set data to new pointer. */ data = p; } - /* Done with file. */ - fclose(fp); } if (data != NULL) { @@ -120,7 +124,7 @@ unsigned char* data = NULL; /* Load DER/BER file. */ - if (ReadFile(fp, &data, &len) != 0) { + if (asn1App_ReadFile(fp, &data, &len) != 0) { ret = 1; } @@ -134,6 +138,7 @@ return ret; } +#ifndef NO_CODING /* Print ASN.1 of a file containing Base64 encoding of BER/DER data. * * @param [in] fp File pointer to read from. @@ -147,7 +152,7 @@ unsigned char* data = NULL; /* Load Base64 encoded file. */ - if (ReadFile(fp, &data, &len) != 0) { + if (asn1App_ReadFile(fp, &data, &len) != 0) { ret = 1; } @@ -181,8 +186,8 @@ word32* start, word32* end) { int ret = 0; - word32 i; - word32 j; + word32 i = 0; + word32 j = 0; /* Find header. */ for (i = offset; i < len; i++) { @@ -227,7 +232,7 @@ } if (ret == 0) { - /* Return start and end indeces. */ + /* Return start and end indices. */ *start = i; *end = j; } @@ -250,7 +255,7 @@ word32 len = 0; /* Load PEM file. */ - if (ReadFile(fp, &data, &len) != 0) { + if (asn1App_ReadFile(fp, &data, &len) != 0) { ret = 1; } @@ -280,16 +285,19 @@ return ret; } +#endif /* Usage lines to show. */ const char* usage[] = { - "asn1 [OPTOIN]... [FILE]", + "asn1 [OPTION]... [FILE]", "Display a human-readable version of a DER/BER encoding.", "", "Options:", " -?, --help display this help and exit", " -b, --branch draw branches before tag name", +#ifndef NO_CODING " -B, --base64 file contents are Base64 encoded", +#endif " -d, --dump show all ASN.1 item data as a hex dump", " -h, --headers show all ASN.1 item headers as a hex dump", " -i, --indent indent tag name with depth", @@ -298,7 +306,9 @@ " -N, --no-dump-text do not show data as a hex dump text", " -o, --offset OFFSET start decoding from offset", " -O, --oid show wolfSSL OID value in text", +#ifndef NO_CODING " -p, --pem file contents are PEM", +#endif " -s, --skip-pem NUM number of PEM blocks to skip", }; /* Number of usage lines. */ @@ -317,8 +327,8 @@ /* Main entry of ASN.1 printing program. * - * @param [in] argc Count of command line argements. - * @param [in] argv Command line argements. + * @param [in] argc Count of command line arguments. + * @param [in] argv Command line arguments. * @return 0 on success. * @return 1 on failure. */ @@ -328,7 +338,7 @@ /* Default to reading STDIN. */ FILE* fp = stdin; int file_format = FORMAT_DER; - int indent = 0; + word32 indent = 0; int pem_skip = 0; /* Reset options. */ @@ -343,11 +353,13 @@ (strcmp(argv[0], "--branch") == 0)) { wc_Asn1PrintOptions_Set(&opts, ASN1_PRINT_OPT_DRAW_BRANCH, 1); } +#ifndef NO_CODING /* File is Base64 encoded data. */ else if ((strcmp(argv[0], "-b64") == 0) || (strcmp(argv[0], "--base64") == 0)) { file_format = FORMAT_BASE64; } +#endif /* Dump all ASN.1 item data. */ else if ((strcmp(argv[0], "-d") == 0) || (strcmp(argv[0], "--dump") == 0)) { @@ -375,7 +387,7 @@ argc--; argv++; wc_Asn1PrintOptions_Set(&opts, ASN1_PRINT_OPT_LENGTH, - atoi(argv[0])); + (word32)atoi(argv[0])); } /* Do not show text representations of ASN.1 item data. */ else if ((strcmp(argv[0], "-n") == 0) || @@ -397,18 +409,20 @@ argc--; argv++; wc_Asn1PrintOptions_Set(&opts, ASN1_PRINT_OPT_OFFSET, - atoi(argv[0])); + (word32)atoi(argv[0])); } /* Show wolfSSL OID value for all OBJECT_IDs. */ else if ((strcmp(argv[0], "-O") == 0) || (strcmp(argv[0], "--oid") == 0)) { wc_Asn1PrintOptions_Set(&opts, ASN1_PRINT_OPT_SHOW_OID, 1); } +#ifndef NO_CODING /* File contains PEM blocks. */ else if ((strcmp(argv[0], "-p") == 0) || (strcmp(argv[0], "--pem") == 0)) { file_format = FORMAT_PEM; } +#endif /* Skip a number of PEM blocks. */ else if ((strcmp(argv[0], "-s") == 0) || (strcmp(argv[0], "--skip-pem") == 0)) { @@ -430,13 +444,17 @@ Usage(); return 0; } - /* Unknown option dectection. */ + /* Unknown option detection. */ else if (argv[0][0] == '-') { fprintf(stderr, "Bad option: %s\n", argv[0]); Usage(); return 1; } else { + if (fp != stdin) { + fprintf(stderr, "At most one input file can be supplied.\n"); + return 1; + } /* Name of file to read. */ fp = fopen(argv[0], "r"); if (fp == NULL) { @@ -459,16 +477,24 @@ if (file_format == FORMAT_DER) { ret = PrintDer(fp); } +#ifndef NO_CODING else if (file_format == FORMAT_BASE64) { ret = PrintBase64(fp); } +#endif +#ifndef NO_CODING else if (file_format == FORMAT_PEM) { ret = PrintPem(fp, pem_skip); } +#endif if (ret != 0) { fprintf(stderr, "%s\n", wc_GetErrorString(ret)); } + + if (fp != stdin) { + fclose(fp); + } return (ret == 0) ? 0 : 1; } @@ -476,8 +502,8 @@ /* Main entry of ASN.1 printing program. * - * @param [in] argc Count of command line argements. - * @param [in] argv Command line argements. + * @param [in] argc Count of command line arguments. + * @param [in] argv Command line arguments. * @return 0 on success. * @return 1 on failure. */ @@ -485,10 +511,9 @@ { (void)argc; (void)argv; - fprintf(stderr, "ASN.1 Parsing and Printing not compiled in.\n"); + fprintf(stderr, "ASN.1 Parsing and Printing or file system not compiled" + " in.\n"); return 0; } -#endif - - +#endif /* WOLFSSL_ASN_PRINT && !defined(NO_FILESYSTEM)*/ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,34 @@ +# wolfSSL Asynchronous Cryptography support + +Supported with: +* Intel QuickAssist +* Marvell (Cavium) Nitrox +* Crypto Callbacks (`--enable-cryptocb`) +* PK Callbacks (`--enable-pkcallbacks`) + +Requires files from https://github.com/wolfSSL/wolfAsyncCrypt +See `async-check.sh` for how to setup. + +Tested with: +* `./configure --enable-asynccrypt --enable-rsa --disable-ecc` +* `./configure --enable-asynccrypt --disable-rsa --enable-ecc` +* `./configure --enable-asynccrypt --enable-cryptocb --enable-rsa --disable-ecc` +* `./configure --enable-asynccrypt --enable-cryptocb --disable-rsa --enable-ecc` +* `./configure --enable-asynccrypt --enable-pkcallbacks --enable-rsa --disable-ecc` +* `./configure --enable-asynccrypt --enable-pkcallbacks --disable-rsa --enable-ecc` + +``` +make +./examples/async/async_server +./examples/async/async_client 127.0.0.1 +``` + +## Asynchronous Cryptography Design + +When a cryptogaphic call is handed off to hardware it return `WC_PENDING_E` up to caller. Then it can keep calling until the operation completes. For some platforms it is required to call `wolfSSL_AsyncPoll`. At the TLS layer a "devId" (Device ID) must be set using `wolfSSL_CTX_SetDevId` to indicate desire to offload cryptography. + +For further design details please see: https://github.com/wolfSSL/wolfAsyncCrypt#design + +## Support + +For questions please email support@wolfssl.com diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_client.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_client.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_client.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_client.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,277 @@ +/* async_client.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* TLS client demonstrating asynchronous cryptography features and optionally + * using the crypto or PK callbacks */ + +/* std */ +#include +#include +#include + +/* socket */ +#include +#include +#include +#include + +/* wolfSSL */ +#ifndef WOLFSSL_USER_SETTINGS + #include +#endif +#include +#include +#include +#include "examples/async/async_tls.h" + +/* Test certificates and keys for RSA and ECC */ +#ifndef NO_RSA + #define CERT_FILE "./certs/client-cert.pem" + #define KEY_FILE "./certs/client-key.pem" + #define CA_FILE "./certs/ca-cert.pem" +#elif defined(HAVE_ECC) + #define CERT_FILE "./certs/client-ecc-cert.pem" + #define KEY_FILE "./certs/ecc-client-key.pem" + #define CA_FILE "./certs/ca-ecc-cert.pem" +#else + #error No authentication algorithm (ECC/RSA) +#endif + +int client_async_test(int argc, char** argv) +{ + int ret = 0; + int sockfd = SOCKET_INVALID; + struct sockaddr_in servAddr; + char buff[TEST_BUF_SZ]; + size_t len; + int devId = 1; /* anything besides -2 (INVALID_DEVID) */ +#ifdef WOLF_CRYPTO_CB + AsyncTlsCryptoCbCtx myCtx; +#endif + int err; + char errBuff[WOLFSSL_MAX_ERROR_SZ]; + + /* declare wolfSSL objects */ + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; + + /* Check for proper calling convention */ + if (argc != 2) { + printf("usage: %s \n", argv[0]); + return 0; + } + + /* Create a socket that uses an internet IPv4 address, + * Sets the socket to be stream based (TCP), + * 0 means choose the default protocol. */ + if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + fprintf(stderr, "ERROR: failed to create the socket\n"); + ret = -1; goto exit; + } + + /* Initialize the server address struct with zeros */ + memset(&servAddr, 0, sizeof(servAddr)); + + /* Fill in the server address */ + servAddr.sin_family = AF_INET; /* using IPv4 */ + servAddr.sin_port = htons(DEFAULT_PORT); /* on DEFAULT_PORT */ + + /* Get the server IPv4 address from the command line call */ + if (inet_pton(AF_INET, argv[1], &servAddr.sin_addr) != 1) { + fprintf(stderr, "ERROR: invalid address\n"); + ret = -1; goto exit; + } + + /* Connect to the server */ + if ((ret = connect(sockfd, (struct sockaddr*) &servAddr, sizeof(servAddr))) + == -1) { + fprintf(stderr, "ERROR: failed to connect\n"); + goto exit; + } + + /*---------------------------------*/ + /* Start of wolfSSL initialization and configuration */ + /*---------------------------------*/ +#ifdef DEBUG_WOLFSSL + wolfSSL_Debugging_ON(); +#endif + + /* Initialize wolfSSL */ + if ((ret = wolfSSL_Init()) != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: Failed to initialize the library\n"); + goto exit; + } + + /* Create and initialize WOLFSSL_CTX */ + if ((ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())) == NULL) { + fprintf(stderr, "ERROR: failed to create WOLFSSL_CTX\n"); + ret = -1; goto exit; + } + +#ifdef WOLF_CRYPTO_CB + XMEMSET(&myCtx, 0, sizeof(myCtx)); + /* register a devID for crypto callbacks */ + ret = wc_CryptoCb_RegisterDevice(devId, AsyncTlsCryptoCb, &myCtx); + if (ret != 0) { + fprintf(stderr, "wc_CryptoCb_RegisterDevice: error %d", ret); + goto exit; + } +#endif + /* register a devID for crypto callbacks */ + wolfSSL_CTX_SetDevId(ctx, devId); + + /* Load client certificate into WOLFSSL_CTX */ + if ((ret = wolfSSL_CTX_use_certificate_file(ctx, CERT_FILE, WOLFSSL_FILETYPE_PEM)) + != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", + CERT_FILE); + goto exit; + } + + /* Load client key into WOLFSSL_CTX */ + if ((ret = wolfSSL_CTX_use_PrivateKey_file(ctx, KEY_FILE, WOLFSSL_FILETYPE_PEM)) + != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", + KEY_FILE); + goto exit; + } + + /* Load CA certificate into WOLFSSL_CTX */ + if ((ret = wolfSSL_CTX_load_verify_locations(ctx, CA_FILE, NULL)) + != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", + CA_FILE); + goto exit; + } + + /* Create a WOLFSSL object */ + if ((ssl = wolfSSL_new(ctx)) == NULL) { + fprintf(stderr, "ERROR: failed to create WOLFSSL object\n"); + ret = -1; goto exit; + } + + /* Attach wolfSSL to the socket */ + if ((ret = wolfSSL_set_fd(ssl, sockfd)) != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: Failed to set the file descriptor\n"); + goto exit; + } + + /* Connect to wolfSSL on the server side */ +#ifdef WOLFSSL_ASYNC_CRYPT + err = 0; /* Reset error */ +#endif + do { + #ifdef WOLFSSL_ASYNC_CRYPT + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) + break; + } + #endif + ret = wolfSSL_connect(ssl); + err = wolfSSL_get_error(ssl, 0); + } while (err == WC_PENDING_E); + if (ret != WOLFSSL_SUCCESS) { + fprintf(stderr, "wolfSSL_connect error %d: %s\n", + err, wolfSSL_ERR_error_string(err, errBuff)); + goto exit; + } + + /* Get a message for the server from stdin */ + printf("Message for server: "); + memset(buff, 0, sizeof(buff)); + if (fgets(buff, sizeof(buff), stdin) == NULL) { + fprintf(stderr, "ERROR: failed to get message for server\n"); + ret = -1; goto exit; + } + len = strnlen(buff, sizeof(buff)); + + /* Send the message to the server */ +#ifdef WOLFSSL_ASYNC_CRYPT + err = 0; /* Reset error */ +#endif + do { + #ifdef WOLFSSL_ASYNC_CRYPT + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) + break; + } + #endif + ret = wolfSSL_write(ssl, buff, (int)len); + err = wolfSSL_get_error(ssl, 0); + } while (err == WC_PENDING_E); + if (ret != (int)len) { + fprintf(stderr, "wolfSSL_write error %d: %s\n", + err, wolfSSL_ERR_error_string(err, errBuff)); + goto exit; + } + + /* Read the server data into our buff array */ + memset(buff, 0, sizeof(buff)); +#ifdef WOLFSSL_ASYNC_CRYPT + err = 0; /* Reset error */ +#endif + do { + #ifdef WOLFSSL_ASYNC_CRYPT + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) + break; + } + #endif + ret = wolfSSL_read(ssl, buff, sizeof(buff)-1); + err = wolfSSL_get_error(ssl, 0); + } while (err == WC_PENDING_E); + if (ret < 0) { + fprintf(stderr, "wolfSSL_read error %d: %s\n", + err, wolfSSL_ERR_error_string(err, errBuff)); + goto exit; + } + + /* Print to stdout any data the server sends */ + printf("Server: %s\n", buff); + + /* Return reporting a success */ + ret = 0; + +exit: + /* Cleanup and return */ + if (sockfd != SOCKET_INVALID) + close(sockfd); /* Close the connection to the server */ + if (ssl) + wolfSSL_free(ssl); /* Free the wolfSSL object */ + if (ctx) + wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ + wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ + + (void)argc; + (void)argv; + + return ret; +} + +#ifndef NO_MAIN_DRIVER +int main(int argc, char** argv) +{ + return client_async_test(argc, argv); +} +#endif /* !NO_MAIN_DRIVER */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_server.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_server.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_server.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_server.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,363 @@ +/* async_server.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* TLS server demonstrating asynchronous cryptography features and optionally + * using the crypto or PK callbacks */ + +/* std */ +#include +#include +#include + +/* socket */ +#include +#include +#include +#include + +#define HAVE_SIGNAL +#ifdef HAVE_SIGNAL +#include /* for catching ctrl+c */ +#endif + +/* wolfSSL */ +#ifndef WOLFSSL_USER_SETTINGS + #include +#endif +#include +#include +#include +#include "examples/async/async_tls.h" + +/* Test certificates and keys for RSA and ECC */ +#ifndef NO_RSA + #define CERT_FILE "./certs/server-cert.pem" + #define KEY_FILE "./certs/server-key.pem" + #define CA_FILE "./certs/client-cert.pem" +#elif defined(HAVE_ECC) + #define CERT_FILE "./certs/server-ecc.pem" + #define KEY_FILE "./certs/ecc-key.pem" + #define CA_FILE "./certs/client-ecc-cert.pem" +#else + #error No authentication algorithm (ECC/RSA) +#endif + +static int mSockfd = SOCKET_INVALID; +static int mConnd = SOCKET_INVALID; +static int mShutdown = 0; + +#ifdef HAVE_SIGNAL +static void sig_handler(const int sig) +{ +#ifdef DEBUG_WOLFSSL + fprintf(stderr, "SIGINT handled = %d.\n", sig); +#else + (void)sig; +#endif + + mShutdown = 1; + if (mConnd != SOCKET_INVALID) { + close(mConnd); /* Close the connection to the client */ + mConnd = SOCKET_INVALID; + } + if (mSockfd != SOCKET_INVALID) { + close(mSockfd); /* Close the socket listening for clients */ + mSockfd = SOCKET_INVALID; + } +} +#endif + +int server_async_test(int argc, char** argv) +{ + int ret = 0; + struct sockaddr_in servAddr; + struct sockaddr_in clientAddr; + socklen_t size = sizeof(clientAddr); + char buff[TEST_BUF_SZ]; + size_t len; + const char* reply = "I hear ya fa shizzle!\n"; + int on; + int devId = 1; /* anything besides -2 (INVALID_DEVID) */ +#ifdef WOLF_CRYPTO_CB + AsyncTlsCryptoCbCtx myCtx; +#endif + int err; + char errBuff[WOLFSSL_MAX_ERROR_SZ]; + + /* declare wolfSSL objects */ + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; + +#ifdef HAVE_SIGNAL + if ((signal(SIGINT, sig_handler)) == SIG_ERR) { + fprintf(stderr, "ERROR: failed to listen to SIGINT (errno: %d)\n",errno); + goto exit; + } +#endif + + /* Initialize the server address struct with zeros */ + memset(&servAddr, 0, sizeof(servAddr)); + + /* Fill in the server address */ + servAddr.sin_family = AF_INET; /* using IPv4 */ + servAddr.sin_port = htons(DEFAULT_PORT); /* on DEFAULT_PORT */ + servAddr.sin_addr.s_addr = INADDR_ANY; /* from anywhere */ + + + /* Create a socket that uses an internet IPv4 address, + * Sets the socket to be stream based (TCP), + * 0 means choose the default protocol. */ + if ((mSockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + fprintf(stderr, "ERROR: failed to create the socket\n"); + goto exit; + } + + /* make sure server is setup for reuse addr/port */ + on = 1; + if (setsockopt(mSockfd, SOL_SOCKET, SO_REUSEADDR, + (char*)&on, (socklen_t)sizeof(on)) != 0) { + fprintf(stderr, "ERROR: failed to set SO_REUSEADDR (errno: %d)\n",errno); + goto exit; + } +#ifdef SO_REUSEPORT + if (setsockopt(mSockfd, SOL_SOCKET, SO_REUSEPORT, + (char*)&on, (socklen_t)sizeof(on)) != 0) { + fprintf(stderr, "ERROR: failed to set SO_REUSEPORT (errno: %d)\n",errno); + goto exit; + } +#endif + + /* Bind the server socket to our port */ + if (bind(mSockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) { + fprintf(stderr, "ERROR: failed to bind\n"); + goto exit; + } + + /* Listen for a new connection, allow 5 pending connections */ + if (listen(mSockfd, 5) == -1) { + fprintf(stderr, "ERROR: failed to listen\n"); + goto exit; + } + + /*---------------------------------*/ + /* Start of wolfSSL initialization and configuration */ + /*---------------------------------*/ +#ifdef DEBUG_WOLFSSL + wolfSSL_Debugging_ON(); +#endif + + /* Initialize wolfSSL */ + if ((ret = wolfSSL_Init()) != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: Failed to initialize the library\n"); + goto exit; + } + + /* Create and initialize WOLFSSL_CTX */ + if ((ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())) == NULL) { + fprintf(stderr, "ERROR: failed to create WOLFSSL_CTX\n"); + ret = -1; + goto exit; + } + +#ifdef WOLF_CRYPTO_CB + XMEMSET(&myCtx, 0, sizeof(myCtx)); + /* register a devID for crypto callbacks */ + ret = wc_CryptoCb_RegisterDevice(devId, AsyncTlsCryptoCb, &myCtx); + if (ret != 0) { + fprintf(stderr, "wc_CryptoCb_RegisterDevice: error %d", ret); + goto exit; + } +#endif + + /* register a devID for crypto callbacks */ + wolfSSL_CTX_SetDevId(ctx, devId); + + /* Require mutual authentication */ + wolfSSL_CTX_set_verify(ctx, + WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); + + /* Load server certificates into WOLFSSL_CTX */ + if ((ret = wolfSSL_CTX_use_certificate_file(ctx, CERT_FILE, + WOLFSSL_FILETYPE_PEM)) != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", + CERT_FILE); + goto exit; + } + + /* Load server key into WOLFSSL_CTX */ + if ((ret = wolfSSL_CTX_use_PrivateKey_file(ctx, KEY_FILE, + WOLFSSL_FILETYPE_PEM)) != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", + KEY_FILE); + goto exit; + } + + /* Load client certificate as "trusted" into WOLFSSL_CTX */ + if ((ret = wolfSSL_CTX_load_verify_locations(ctx, CA_FILE, NULL)) + != WOLFSSL_SUCCESS) { + fprintf(stderr, "ERROR: failed to load %s, please check the file.\n", + CA_FILE); + goto exit; + } + + /* Continue to accept clients until mShutdown is issued */ + while (!mShutdown) { + printf("Waiting for a connection...\n"); + + /* Accept client connections */ + if ((mConnd = accept(mSockfd, (struct sockaddr*)&clientAddr, &size)) + == -1) { + fprintf(stderr, "ERROR: failed to accept the connection\n\n"); + ret = -1; goto exit; + } + + /* Create a WOLFSSL object */ + if ((ssl = wolfSSL_new(ctx)) == NULL) { + fprintf(stderr, "ERROR: failed to create WOLFSSL object\n"); + ret = -1; goto exit; + } + + /* Attach wolfSSL to the socket */ + wolfSSL_set_fd(ssl, mConnd); + + /* Establish TLS connection */ + #ifdef WOLFSSL_ASYNC_CRYPT + err = 0; /* Reset error */ + #endif + do { + #ifdef WOLFSSL_ASYNC_CRYPT + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) + break; + } + #endif + ret = wolfSSL_accept(ssl); + err = wolfSSL_get_error(ssl, 0); + } while (err == WC_PENDING_E); + if (ret != WOLFSSL_SUCCESS) { + fprintf(stderr, "wolfSSL_accept error %d: %s\n", + err, wolfSSL_ERR_error_string(err, errBuff)); + goto exit; + } + + + printf("Client connected successfully\n"); + + /* Read the client data into our buff array */ + memset(buff, 0, sizeof(buff)); + #ifdef WOLFSSL_ASYNC_CRYPT + err = 0; /* Reset error */ + #endif + do { + #ifdef WOLFSSL_ASYNC_CRYPT + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) + break; + } + #endif + ret = wolfSSL_read(ssl, buff, sizeof(buff)-1); + err = wolfSSL_get_error(ssl, 0); + } while (err == WC_PENDING_E); + if (ret < 0) { + fprintf(stderr, "wolfSSL_read error %d: %s\n", + err, wolfSSL_ERR_error_string(err, errBuff)); + goto exit; + } + + /* Print to stdout any data the client sends */ + printf("Client: %s\n", buff); + + /* Check for server shutdown command */ + if (strncmp(buff, "shutdown", 8) == 0) { + printf("Shutdown command issued!\n"); + mShutdown = 1; + } + + /* Write our reply into buff */ + memset(buff, 0, sizeof(buff)); + memcpy(buff, reply, strlen(reply)); + len = strnlen(buff, sizeof(buff)); + + /* Reply back to the client */ + #ifdef WOLFSSL_ASYNC_CRYPT + err = 0; /* Reset error */ + #endif + do { + #ifdef WOLFSSL_ASYNC_CRYPT + if (err == WC_PENDING_E) { + ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + if (ret < 0) + break; + } + #endif + ret = wolfSSL_write(ssl, buff, (int)len); + err = wolfSSL_get_error(ssl, 0); + } while (err == WC_PENDING_E); + if (ret != (int)len) { + fprintf(stderr, "wolfSSL_write error %d: %s\n", + err, wolfSSL_ERR_error_string(err, errBuff)); + goto exit; + } + + /* Cleanup after this connection */ + wolfSSL_shutdown(ssl); + if (ssl) { + wolfSSL_free(ssl); /* Free the wolfSSL object */ + ssl = NULL; + } + if (mConnd != SOCKET_INVALID) { + close(mConnd); /* Close the connection to the client */ + mConnd = SOCKET_INVALID; + } + } + + printf("Shutdown complete\n"); + +exit: + /* Cleanup and return */ + if (ssl) + wolfSSL_free(ssl); /* Free the wolfSSL object */ + if (mConnd != SOCKET_INVALID) { + close(mConnd); /* Close the connection to the client */ + mConnd = SOCKET_INVALID; + } + if (mSockfd != SOCKET_INVALID) { + close(mSockfd); /* Close the socket listening for clients */ + mSockfd = SOCKET_INVALID; + } + if (ctx) + wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ + wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */ + + (void)argc; + (void)argv; + + return ret; +} + +#ifndef NO_MAIN_DRIVER +int main(int argc, char** argv) +{ + return server_async_test(argc, argv); +} +#endif /* !NO_MAIN_DRIVER */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_tls.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_tls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_tls.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_tls.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,158 @@ +/* async-tls.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. (formerly known as CyaSSL) + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef WOLFSSL_USER_SETTINGS +#include +#endif +#include +#include +#include +#include "examples/async/async_tls.h" + +/* ---------------------------------------------------------------------------*/ +/* --- Example Crypto Callback --- */ +/* ---------------------------------------------------------------------------*/ +#ifdef WOLF_CRYPTO_CB + +/* Example custom context for crypto callback */ +#ifndef TEST_PEND_COUNT +#define TEST_PEND_COUNT 2 +#endif + +/* Example crypto dev callback function that calls software version */ +/* This is where you would plug-in calls to your own hardware crypto */ +int AsyncTlsCryptoCb(int devIdArg, wc_CryptoInfo* info, void* ctx) +{ + int ret = CRYPTOCB_UNAVAILABLE; /* return this to bypass HW and use SW */ + AsyncTlsCryptoCbCtx* myCtx = (AsyncTlsCryptoCbCtx*)ctx; + + if (info == NULL) + return BAD_FUNC_ARG; + +#ifdef DEBUG_CRYPTOCB + wc_CryptoCb_InfoString(info); +#endif + + if (info->algo_type == WC_ALGO_TYPE_PK) { +#ifdef WOLFSSL_ASYNC_CRYPT + /* Test pending response */ + if (info->pk.type == WC_PK_TYPE_RSA || + info->pk.type == WC_PK_TYPE_EC_KEYGEN || + info->pk.type == WC_PK_TYPE_ECDSA_SIGN || + info->pk.type == WC_PK_TYPE_ECDSA_VERIFY || + info->pk.type == WC_PK_TYPE_ECDH) + { + if (myCtx->pendingCount++ < TEST_PEND_COUNT) return WC_PENDING_E; + myCtx->pendingCount = 0; + } +#endif + + #ifndef NO_RSA + if (info->pk.type == WC_PK_TYPE_RSA) { + /* set devId to invalid, so software is used */ + info->pk.rsa.key->devId = INVALID_DEVID; + + switch (info->pk.rsa.type) { + case RSA_PUBLIC_ENCRYPT: + case RSA_PUBLIC_DECRYPT: + /* perform software based RSA public op */ + ret = wc_RsaFunction( + info->pk.rsa.in, info->pk.rsa.inLen, + info->pk.rsa.out, info->pk.rsa.outLen, + info->pk.rsa.type, info->pk.rsa.key, info->pk.rsa.rng); + break; + case RSA_PRIVATE_ENCRYPT: + case RSA_PRIVATE_DECRYPT: + /* perform software based RSA private op */ + ret = wc_RsaFunction( + info->pk.rsa.in, info->pk.rsa.inLen, + info->pk.rsa.out, info->pk.rsa.outLen, + info->pk.rsa.type, info->pk.rsa.key, info->pk.rsa.rng); + break; + } + + /* reset devId */ + info->pk.rsa.key->devId = devIdArg; + } + #endif + #ifdef HAVE_ECC + if (info->pk.type == WC_PK_TYPE_EC_KEYGEN) { + /* set devId to invalid, so software is used */ + info->pk.eckg.key->devId = INVALID_DEVID; + + ret = wc_ecc_make_key_ex(info->pk.eckg.rng, info->pk.eckg.size, + info->pk.eckg.key, info->pk.eckg.curveId); + + /* reset devId */ + info->pk.eckg.key->devId = devIdArg; + } + else if (info->pk.type == WC_PK_TYPE_ECDSA_SIGN) { + /* set devId to invalid, so software is used */ + info->pk.eccsign.key->devId = INVALID_DEVID; + + ret = wc_ecc_sign_hash( + info->pk.eccsign.in, info->pk.eccsign.inlen, + info->pk.eccsign.out, info->pk.eccsign.outlen, + info->pk.eccsign.rng, info->pk.eccsign.key); + + /* reset devId */ + info->pk.eccsign.key->devId = devIdArg; + } + else if (info->pk.type == WC_PK_TYPE_ECDSA_VERIFY) { + /* set devId to invalid, so software is used */ + info->pk.eccverify.key->devId = INVALID_DEVID; + + ret = wc_ecc_verify_hash( + info->pk.eccverify.sig, info->pk.eccverify.siglen, + info->pk.eccverify.hash, info->pk.eccverify.hashlen, + info->pk.eccverify.res, info->pk.eccverify.key); + + /* reset devId */ + info->pk.eccverify.key->devId = devIdArg; + } + else if (info->pk.type == WC_PK_TYPE_ECDH) { + /* set devId to invalid, so software is used */ + info->pk.ecdh.private_key->devId = INVALID_DEVID; + + ret = wc_ecc_shared_secret( + info->pk.ecdh.private_key, info->pk.ecdh.public_key, + info->pk.ecdh.out, info->pk.ecdh.outlen); + + /* reset devId */ + info->pk.ecdh.private_key->devId = devIdArg; + } + #endif /* HAVE_ECC */ + } + + (void)devIdArg; + (void)myCtx; + + return ret; +} +#endif /* WOLF_CRYPTO_CB */ + +/* ---------------------------------------------------------------------------*/ +/* --- Example PK (Public Key) Callback --- */ +/* ---------------------------------------------------------------------------*/ +#ifdef HAVE_PK_CALLBACKS + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_tls.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_tls.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/async_tls.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/async_tls.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,42 @@ +/* async-tls.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#ifndef WOLFSSL_ASYNC_TLS_EXAMPLES_H +#define WOLFSSL_ASYNC_TLS_EXAMPLES_H + +#define DEFAULT_PORT 11111 +#define TEST_BUF_SZ 256 + +#ifdef WOLF_CRYPTO_CB +/* Example custom context for crypto callback */ +typedef struct { + int pendingCount; /* track pending tries test count */ +} AsyncTlsCryptoCbCtx; +int AsyncTlsCryptoCb(int devIdArg, wc_CryptoInfo* info, void* ctx); +#endif /* WOLF_CRYPTO_CB */ + + +int client_async_test(int argc, char** argv); +int server_async_test(int argc, char** argv); + + +#endif /* WOLFSSL_ASYNC_TLS_EXAMPLES_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/async/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/async/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,29 @@ +# vim:ft=automake +# All paths should be given relative to the root + +if BUILD_ASYNCCRYPT + +noinst_HEADERS += examples/async/async_tls.h + +if BUILD_EXAMPLE_CLIENTS +noinst_PROGRAMS += examples/async/async_client +examples_async_async_client_SOURCES = examples/async/async_client.c examples/async/async_tls.c +examples_async_async_client_LDADD = src/libwolfssl@LIBSUFFIX@.la $(LIB_STATIC_ADD) +examples_async_async_client_DEPENDENCIES = src/libwolfssl@LIBSUFFIX@.la +examples_async_async_client_CFLAGS = $(AM_CFLAGS) +endif + +if BUILD_EXAMPLE_SERVERS +noinst_PROGRAMS += examples/async/async_server +examples_async_async_server_SOURCES = examples/async/async_server.c examples/async/async_tls.c +examples_async_async_server_LDADD = src/libwolfssl@LIBSUFFIX@.la $(LIB_STATIC_ADD) +examples_async_async_server_DEPENDENCIES = src/libwolfssl@LIBSUFFIX@.la +examples_async_async_server_CFLAGS = $(AM_CFLAGS) +endif +endif + +dist_example_DATA+= examples/async/async_server.c +dist_example_DATA+= examples/async/async_client.c +DISTCLEANFILES+= examples/async/.libs/async_server +DISTCLEANFILES+= examples/async/.libs/async_client +EXTRA_DIST += examples/async/README.md diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/benchmark/tls_bench.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/benchmark/tls_bench.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/benchmark/tls_bench.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/benchmark/tls_bench.c 2024-08-03 07:30:00.000000000 +0000 @@ -40,6 +40,8 @@ #include #endif #include +#include +#include #include #include /* WC_MAX_DIGEST_SIZE */ #include @@ -60,18 +62,31 @@ #include #include -/* For testing no pthread support */ +/* For testing no threading support */ #if 0 #undef HAVE_PTHREAD + #define SINGLE_THREADED #endif /* PTHREAD requires server and client enabled */ -#if defined(HAVE_PTHREAD) && (defined(NO_WOLFSSL_CLIENT) || defined(NO_WOLFSSL_SERVER)) - #undef HAVE_PTHREAD +#if defined(NO_WOLFSSL_CLIENT) || defined(NO_WOLFSSL_SERVER) + #if !defined(SINGLE_THREADED) + #ifdef __GNUC__ /* GCC compiler */ + #pragma message "PTHREAD requires server and client enabled." + #elif defined(_MSC_VER) /* Microsoft Visual C++ compiler */ + #pragma message("PTHREAD requires server and client enabled.") + #else + #warning "PTHREAD requires server and client enabled." + #endif + #define SINGLE_THREADED + #endif #endif - -#ifdef HAVE_PTHREAD - #include +/* Conversely, if both server and client are enabled, we must require pthreads */ +#if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) \ + && defined(SINGLE_THREADED) + #error "threads must be enabled if building benchmark suite \ +to run both client and server. Please define HAVE_PTHREAD if your \ +platform supports it" #endif #if 0 @@ -284,7 +299,7 @@ }; #endif /* WOLFSSL_TLS13 && HAVE_SUPPORTED_CURVES */ -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED typedef struct { unsigned char buf[MEM_BUFFER_SZ]; int write_bytes; @@ -292,9 +307,7 @@ int read_bytes; int read_idx; - pthread_t tid; - pthread_mutex_t mutex; - pthread_cond_t cond; + COND_TYPE cond; int done; } memBuf_t; @@ -332,17 +345,17 @@ int doDTLS; struct sockaddr_in serverAddr; struct sockaddr_in clientAddr; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED int serverReady; int clientOrserverOnly; - pthread_mutex_t dtls_mutex; - pthread_cond_t dtls_cond; + wolfSSL_Mutex dtls_mutex; + COND_TYPE dtls_cond; #endif #endif side_t client; side_t server; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED int useLocalMem; /* client messages to server in memory */ @@ -370,6 +383,32 @@ int DoneHandShake = 0; #endif + +#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 5) +static int run_all_CAST(void) +{ + int ret = 0; + int cast_idx = 0; + + for (cast_idx = 0; cast_idx < FIPS_CAST_COUNT; cast_idx++) { + if ((ret = wc_RunCast_fips(cast_idx)) != 0) { +#ifdef NO_ERROR_STRINGS + fprintf(stderr, + "ERROR: FIPS CAST failed with return code: %d\n", ret); +#else + fprintf(stderr, + "ERROR: FIPS CAST failed for algorithm: %s\n", + wc_GetErrorString(ret)); +#endif + return ret; + } + } + + return ret; +} +#endif /* HAVE_FIPS && HAVE_FIPS_VERSION == 5 */ + + static double gettime_secs(int reset) { struct timeval tv; @@ -380,16 +419,16 @@ } -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED /* server send callback */ static int ServerMemSend(info_t* info, char* buf, int sz) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&info->to_client.mutex)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->to_client.cond)); #ifndef BENCH_USE_NONBLOCK /* check for overflow */ if (info->to_client.write_idx + sz > MEM_BUFFER_SZ) { - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->to_client.mutex)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_client.cond)); fprintf(stderr, "ServerMemSend overflow\n"); return -1; } @@ -399,12 +438,12 @@ } #endif - XMEMCPY(&info->to_client.buf[info->to_client.write_idx], buf, sz); + XMEMCPY(&info->to_client.buf[info->to_client.write_idx], buf, (size_t)sz); info->to_client.write_idx += sz; info->to_client.write_bytes += sz; - PTHREAD_CHECK_RET(pthread_cond_signal(&info->to_client.cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->to_client.mutex)); + THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_client.cond)); #ifdef BENCH_USE_NONBLOCK if (sz == 0) { @@ -417,13 +456,12 @@ /* server recv callback */ static int ServerMemRecv(info_t* info, char* buf, int sz) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&info->to_server.mutex)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->to_server.cond)); #ifndef BENCH_USE_NONBLOCK while (info->to_server.write_idx - info->to_server.read_idx < sz && !info->to_client.done) { - PTHREAD_CHECK_RET(pthread_cond_wait(&info->to_server.cond, - &info->to_server.mutex)); + THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_server.cond)); } #else if (info->to_server.write_idx - info->to_server.read_idx < sz) { @@ -431,7 +469,7 @@ } #endif - XMEMCPY(buf, &info->to_server.buf[info->to_server.read_idx], sz); + XMEMCPY(buf, &info->to_server.buf[info->to_server.read_idx], (size_t)sz); info->to_server.read_idx += sz; info->to_server.read_bytes += sz; @@ -441,7 +479,7 @@ info->to_server.write_bytes = info->to_server.write_idx = 0; } - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->to_server.mutex)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_server.cond)); if (info->to_client.done != 0) { return -1; @@ -458,14 +496,14 @@ /* client send callback */ static int ClientMemSend(info_t* info, char* buf, int sz) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&info->to_server.mutex)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->to_server.cond)); #ifndef BENCH_USE_NONBLOCK /* check for overflow */ if (info->to_server.write_idx + sz > MEM_BUFFER_SZ) { fprintf(stderr, "ClientMemSend overflow %d %d %d\n", info->to_server.write_idx, sz, MEM_BUFFER_SZ); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->to_server.mutex)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_server.cond)); return -1; } #else @@ -474,12 +512,12 @@ } #endif - XMEMCPY(&info->to_server.buf[info->to_server.write_idx], buf, sz); + XMEMCPY(&info->to_server.buf[info->to_server.write_idx], buf, (size_t)sz); info->to_server.write_idx += sz; info->to_server.write_bytes += sz; - PTHREAD_CHECK_RET(pthread_cond_signal(&info->to_server.cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->to_server.mutex)); + THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_server.cond)); #ifdef BENCH_USE_NONBLOCK if (sz == 0) { @@ -492,13 +530,12 @@ /* client recv callback */ static int ClientMemRecv(info_t* info, char* buf, int sz) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&info->to_client.mutex)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->to_client.cond)); #ifndef BENCH_USE_NONBLOCK while (info->to_client.write_idx - info->to_client.read_idx < sz && !info->to_server.done) { - PTHREAD_CHECK_RET(pthread_cond_wait(&info->to_client.cond, - &info->to_client.mutex)); + THREAD_CHECK_RET(wolfSSL_CondWait(&info->to_client.cond)); } #else if (info->to_client.write_idx - info->to_client.read_idx < sz) { @@ -506,7 +543,7 @@ } #endif - XMEMCPY(buf, &info->to_client.buf[info->to_client.read_idx], sz); + XMEMCPY(buf, &info->to_client.buf[info->to_client.read_idx], (size_t)sz); info->to_client.read_idx += sz; info->to_client.read_bytes += sz; @@ -516,7 +553,7 @@ info->to_client.write_bytes = info->to_client.write_idx = 0; } - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->to_client.mutex)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_client.cond)); if (info->to_server.done != 0) { return -1; @@ -529,11 +566,11 @@ #endif return sz; } -#endif /* HAVE_PTHREAD */ +#endif /* !SINGLE_THREADED */ static int SocketRecv(int sockFd, char* buf, int sz) { - int recvd = (int)recv(sockFd, buf, sz, 0); + int recvd = (int)recv(sockFd, buf, (size_t)sz, 0); if (recvd == -1) { switch (errno) { #if EAGAIN != SOCKET_EWOULDBLOCK @@ -561,7 +598,7 @@ static int SocketSend(int sockFd, char* buf, int sz) { - int sent = (int)send(sockFd, buf, sz, 0); + int sent = (int)send(sockFd, buf, (size_t)sz, 0); if (sent == -1) { switch (errno) { #if EAGAIN != SOCKET_EWOULDBLOCK @@ -607,7 +644,7 @@ } } - recvd = (int)recvfrom(sd, buf, sz, 0, (SOCKADDR*)&peer, &peerSz); + recvd = (int)recvfrom(sd, buf, (size_t)sz, 0, (SOCKADDR*)&peer, &peerSz); if (recvd < 0) { if (errno == SOCKET_EWOULDBLOCK || errno == SOCKET_EAGAIN) { @@ -647,7 +684,7 @@ { int sent; - sent = (int)sendto(sd, buf, sz, 0, peer, peerSz); + sent = (int)sendto(sd, buf, (size_t)sz, 0, peer, peerSz); if (sent < 0) { if (errno == SOCKET_EWOULDBLOCK || errno == SOCKET_EAGAIN) { @@ -685,7 +722,7 @@ { info_t* info = (info_t*)ctx; (void)ssl; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED if (info->useLocalMem) { return ServerMemSend(info, buf, sz); } @@ -705,7 +742,7 @@ { info_t* info = (info_t*)ctx; (void)ssl; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED if (info->useLocalMem) { return ServerMemRecv(info, buf, sz); } @@ -727,7 +764,7 @@ { info_t* info = (info_t*)ctx; (void)ssl; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED if (info->useLocalMem) { return ClientMemSend(info, buf, sz); } @@ -747,7 +784,7 @@ { info_t* info = (info_t*)ctx; (void)ssl; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED if (info->useLocalMem) { return ClientMemRecv(info, buf, sz); } @@ -802,13 +839,13 @@ /* Setup server address */ XMEMSET(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; - servAddr.sin_port = htons(port); + servAddr.sin_port = htons((uint16_t)port); /* Resolve host */ entry = gethostbyname(host); if (entry) { XMEMCPY(&servAddr.sin_addr.s_addr, entry->h_addr_list[0], - entry->h_length); + (size_t)entry->h_length); } else { servAddr.sin_addr.s_addr = inet_addr(host); @@ -836,7 +873,7 @@ } /* Connect to the server */ - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED while ((info->serverListening == 0) && (info->server.shutdown == 0)) { if (info->showVerbose) { fprintf(stderr, "Waiting for server to listen...\n"); @@ -970,7 +1007,7 @@ /* Allocate and initialize a packet sized buffer */ - writeBuf = (unsigned char*)XMALLOC(info->packetSize, NULL, + writeBuf = (unsigned char*)XMALLOC((size_t)info->packetSize, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (writeBuf == NULL) { fprintf(stderr, "failed to allocate write memory\n"); @@ -979,7 +1016,7 @@ /* Allocate read buffer */ readBufSz = info->packetSize; - readBuf = (unsigned char*)XMALLOC(readBufSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + readBuf = (unsigned char*)XMALLOC((size_t)readBufSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (readBuf == NULL) { fprintf(stderr, "failed to allocate read memory\n"); ret = MEMORY_E; goto exit; @@ -992,7 +1029,7 @@ int err; #endif - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED if (!info->useLocalMem) #endif { @@ -1035,17 +1072,16 @@ wolfSSL_SetIOReadCtx(cli_ssl, info); wolfSSL_SetIOWriteCtx(cli_ssl, info); -#if defined(HAVE_PTHREAD) && defined(WOLFSSL_DTLS) +#if !defined(SINGLE_THREADED) && defined(WOLFSSL_DTLS) /* synchronize with server */ if (info->doDTLS && !info->clientOrserverOnly) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&info->dtls_mutex)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->dtls_cond)); if (info->serverReady != 1) { - PTHREAD_CHECK_RET(pthread_cond_wait(&info->dtls_cond, - &info->dtls_mutex)); + THREAD_CHECK_RET(wolfSSL_CondWait(&info->dtls_cond)); } /* for next loop */ info->serverReady = 0; - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->dtls_mutex)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->dtls_cond)); } #endif /* perform connect */ @@ -1079,7 +1115,7 @@ info->client.shutdown = 1; writeSz = (int)XSTRLEN(kShutdown) + 1; - XMEMCPY(writeBuf, kShutdown, writeSz); /* include null term */ + XMEMCPY(writeBuf, kShutdown, (size_t)writeSz); /* include null term */ if (info->showVerbose) { fprintf(stderr, "Sending shutdown\n"); } @@ -1092,8 +1128,8 @@ } } else { - XMEMSET(writeBuf, 0, info->packetSize); - XSTRNCPY((char*)writeBuf, kTestStr, info->packetSize); + XMEMSET(writeBuf, 0, (size_t)info->packetSize); + XSTRNCPY((char*)writeBuf, kTestStr, (size_t)info->packetSize); } /* write / read echo loop */ @@ -1121,7 +1157,7 @@ total_sz += ret; /* read echo of message from server */ - XMEMSET(readBuf, 0, readBufSz); + XMEMSET(readBuf, 0, (size_t)readBufSz); start = gettime_secs(1); #ifndef BENCH_USE_NONBLOCK ret = wolfSSL_read(cli_ssl, readBuf, readBufSz); @@ -1142,7 +1178,7 @@ ret = 0; /* reset return code */ /* validate echo */ - if (XMEMCMP((char*)writeBuf, (char*)readBuf, writeSz) != 0) { + if (XMEMCMP((char*)writeBuf, (char*)readBuf, (size_t)writeSz) != 0) { fprintf(stderr, "echo check failed!\n"); ret = wolfSSL_get_error(cli_ssl, ret); goto exit; @@ -1159,7 +1195,7 @@ if (ret != 0 && ret != WOLFSSL_SUCCESS) { fprintf(stderr, "Client Error: %d (%s)\n", ret, - wolfSSL_ERR_reason_error_string(ret)); + wolfSSL_ERR_reason_error_string((unsigned long)ret)); } /* clean up */ @@ -1179,21 +1215,23 @@ return ret; } -#ifdef HAVE_PTHREAD -static void* client_thread(void* args) +#if !defined(SINGLE_THREADED) && defined(WOLFSSL_THREAD_NO_JOIN) +static THREAD_RETURN WOLFSSL_THREAD_NO_JOIN client_thread(void* args) { int ret; info_t* info = (info_t*)args; ret = bench_tls_client(info); - PTHREAD_CHECK_RET(pthread_cond_signal(&info->to_server.cond)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->to_server.cond)); info->to_client.done = 1; info->client.ret = ret; + THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_server.cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_server.cond)); - return NULL; + WOLFSSL_RETURN_FROM_THREAD(0); } -#endif /* HAVE_PTHREAD */ +#endif /* !SINGLE_THREADED */ #endif /* !NO_WOLFSSL_CLIENT */ @@ -1212,7 +1250,7 @@ /* Setup server address */ XMEMSET(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; - servAddr.sin_port = htons(port); + servAddr.sin_port = htons((uint16_t)port); servAddr.sin_addr.s_addr = INADDR_ANY; #ifdef WOLFSSL_DTLS @@ -1273,12 +1311,12 @@ #ifdef WOLFSSL_DTLS if (info->doDTLS) { char msg[64]; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED if (!info->clientOrserverOnly) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&info->dtls_mutex)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->dtls_cond)); info->serverReady = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&info->dtls_cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&info->dtls_mutex)); + THREAD_CHECK_RET(wolfSSL_CondSignal(&info->dtls_cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->dtls_cond)); } #endif connd = (int)recvfrom(info->listenFd, (char *)msg, sizeof(msg), @@ -1293,7 +1331,7 @@ else #endif { - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED info->serverListening = 1; #endif if ((connd = accept(info->listenFd, (struct sockaddr*)&clientAddr, @@ -1428,7 +1466,7 @@ /* Allocate read buffer */ readBufSz = info->packetSize; - readBuf = (unsigned char*)XMALLOC(readBufSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + readBuf = (unsigned char*)XMALLOC((size_t)readBufSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (readBuf == NULL) { fprintf(stderr, "failed to allocate read memory\n"); ret = MEMORY_E; goto exit; @@ -1440,7 +1478,7 @@ int err; #endif - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED if (!info->useLocalMem) #endif { @@ -1503,7 +1541,7 @@ #endif start = gettime_secs(0) - start; if (ret != WOLFSSL_SUCCESS) { - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED if (info->to_client.done) { ret = 0; /* done - success */ } @@ -1526,7 +1564,7 @@ double rxTime; /* read message from client */ - XMEMSET(readBuf, 0, readBufSz); + XMEMSET(readBuf, 0, (size_t)readBufSz); start = gettime_secs(1); #ifndef BENCH_USE_NONBLOCK ret = wolfSSL_read(srv_ssl, readBuf, readBufSz); @@ -1551,7 +1589,7 @@ info->server_stats.rxTime += rxTime; if (ret < 0) { - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED if (info->to_client.done) { ret = 0; /* done - success */ } @@ -1603,7 +1641,7 @@ if (ret != 0 && ret != WOLFSSL_SUCCESS) { fprintf(stderr, "Server Error: %d (%s)\n", ret, - wolfSSL_ERR_reason_error_string(ret)); + wolfSSL_ERR_reason_error_string((unsigned long)ret)); } /* clean up */ @@ -1622,8 +1660,8 @@ return ret; } -#ifdef HAVE_PTHREAD -static void* server_thread(void* args) +#if !defined(SINGLE_THREADED) && defined(WOLFSSL_THREAD_NO_JOIN) +static THREAD_RETURN WOLFSSL_THREAD_NO_JOIN server_thread(void* args) { int ret = 0; info_t* info = (info_t*)args; @@ -1645,13 +1683,15 @@ } } - PTHREAD_CHECK_RET(pthread_cond_signal(&info->to_client.cond)); + THREAD_CHECK_RET(wolfSSL_CondStart(&info->to_client.cond)); info->to_server.done = 1; info->server.ret = ret; + THREAD_CHECK_RET(wolfSSL_CondSignal(&info->to_client.cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&info->to_client.cond)); - return NULL; + WOLFSSL_RETURN_FROM_THREAD(0); } -#endif /* HAVE_PTHREAD */ +#endif /* !SINGLE_THREADED */ #endif /* !NO_WOLFSSL_SERVER */ @@ -1723,7 +1763,7 @@ #ifdef DEBUG_WOLFSSL fprintf(stderr, "-d Enable debug messages\n"); #endif -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED fprintf(stderr, "-T Number of threaded server/client pairs (default %d)\n", NUM_THREAD_PAIRS); fprintf(stderr, "-m Use local memory, not socket\n"); #endif @@ -1820,12 +1860,12 @@ int argClientOnly = 0; int argServerOnly = 0; const char* argHost = BENCH_DEFAULT_HOST; - int argPort = BENCH_DEFAULT_PORT; + word32 argPort = BENCH_DEFAULT_PORT; int argShowPeerInfo = 0; -#ifdef HAVE_PTHREAD +#ifndef SINGLE_THREADED int doShutdown; #endif -#if !defined(NO_WOLFSSL_SERVER) || defined(HAVE_PTHREAD) +#if !defined(NO_WOLFSSL_SERVER) || !defined(SINGLE_THREADED) int argLocalMem = 0; int listenFd = -1; #endif @@ -1849,6 +1889,23 @@ /* Initialize wolfSSL */ wolfSSL_Init(); +#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 5) + /* + * When running benchmarks on FIPS builds, we need to run ALL CASTs up + * front before spawning client/server threads, otherwise there is the + * possibility that both threads try to run a CAST at the same time during + * the handshake. In this scenario, the thread that doesn't win the race + * will not be able to run the CAST, since it returns "busy", which is treated + * as a failure. Running the CASTs up front is a simpler solution than + * implementing an additional layer of synchronization. + */ + if ((ret = run_all_CAST()) != 0) + { + fprintf(stderr, "CAST failed. Exiting benchmark\n"); + goto exit; + } +#endif /* HAVE_FIPS && HAVE_FIPS_VERSION == 5 */ + /* Parse command line arguments */ while ((ch = mygetopt(argc, argv, "?" "udeil:p:t:vT:sch:P:mS:g")) != -1) { switch (ch) { @@ -1869,7 +1926,7 @@ break; case 'P': - argPort = atoi(myoptarg); + argPort = (word32)atoi(myoptarg); break; case 'd' : @@ -1924,13 +1981,13 @@ break; case 'T' : - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED argThreadPairs = atoi(myoptarg); #endif break; case 'm': - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED argLocalMem = 1; #endif break; @@ -1980,7 +2037,7 @@ if (argServerOnly || argClientOnly) { argThreadPairs = 1; } -#ifndef HAVE_PTHREAD +#ifdef SINGLE_THREADED else { fprintf(stderr, "Threading is not enabled, so please use -s or -c to indicate side\n"); Usage(); @@ -1989,12 +2046,12 @@ #endif /* Allocate test info array */ - theadInfo = (info_t*)XMALLOC(sizeof(info_t) * argThreadPairs, NULL, + theadInfo = (info_t*)XMALLOC(sizeof(info_t) * (size_t)argThreadPairs, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (theadInfo == NULL) { ret = MEMORY_E; goto exit; } - XMEMSET(theadInfo, 0, sizeof(info_t) * argThreadPairs); + XMEMSET(theadInfo, 0, sizeof(info_t) * (size_t)argThreadPairs); #ifndef NO_WOLFSSL_SERVER /* Use same listen socket to avoid timing issues between client and server */ @@ -2059,7 +2116,7 @@ XMEMSET(info, 0, sizeof(info_t)); info->host = argHost; - info->port = argPort + i; /* threads must have separate ports */ + info->port = argPort + (word32)i; /* threads must have separate ports */ info->cipher = cipher; #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES) @@ -2086,7 +2143,7 @@ #ifdef WOLFSSL_DTLS info->doDTLS = doDTLS; - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED info->serverReady = 0; if (argServerOnly || argClientOnly) { info->clientOrserverOnly = 1; @@ -2094,7 +2151,7 @@ #endif #endif if (argClientOnly) { - #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) + #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && !defined(SINGLE_THREADED) /* to avoid to wait server forever */ info->serverListening = 1; #endif @@ -2108,38 +2165,24 @@ #endif } else { - #ifdef HAVE_PTHREAD + #if !defined(SINGLE_THREADED) && defined(WOLFSSL_THREAD_NO_JOIN) info->useLocalMem = argLocalMem; - PTHREAD_CHECK_RET(pthread_mutex_init(&info->to_server.mutex, - NULL)); - PTHREAD_CHECK_RET(pthread_mutex_init(&info->to_client.mutex, - NULL)); #ifdef WOLFSSL_DTLS - PTHREAD_CHECK_RET(pthread_mutex_init(&info->dtls_mutex, - NULL)); - PTHREAD_CHECK_RET(pthread_cond_init(&info->dtls_cond, - NULL)); + THREAD_CHECK_RET(wc_InitMutex(&info->dtls_mutex)); + THREAD_CHECK_RET(wolfSSL_CondInit(&info->dtls_cond)); #endif - PTHREAD_CHECK_RET(pthread_cond_init(&info->to_server.cond, - NULL)); - PTHREAD_CHECK_RET(pthread_cond_init(&info->to_client.cond, - NULL)); - - PTHREAD_CHECK_RET( - pthread_create(&info->to_server.tid, NULL, - server_thread, info)); - PTHREAD_CHECK_RET( - pthread_create(&info->to_client.tid, NULL, - client_thread, info)); - - /* State that we won't be joining this thread */ - PTHREAD_CHECK_RET(pthread_detach(info->to_server.tid)); - PTHREAD_CHECK_RET(pthread_detach(info->to_client.tid)); + THREAD_CHECK_RET(wolfSSL_CondInit(&info->to_server.cond)); + THREAD_CHECK_RET(wolfSSL_CondInit(&info->to_client.cond)); + + THREAD_CHECK_RET( + wolfSSL_NewThreadNoJoin(server_thread, info)); + THREAD_CHECK_RET( + wolfSSL_NewThreadNoJoin(client_thread, info)); #endif } } - #ifdef HAVE_PTHREAD + #ifndef SINGLE_THREADED /* For threading, wait for completion */ if (!argClientOnly && !argServerOnly) { /* Wait until threads are marked done */ @@ -2159,7 +2202,7 @@ fprintf(stderr, "Shutdown complete\n"); } } - #endif /* HAVE_PTHREAD */ + #endif /* !SINGLE_THREADED */ if (argShowVerbose) { /* print results */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/client/client.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/client/client.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.c 2024-08-03 07:30:00.000000000 +0000 @@ -138,6 +138,15 @@ #endif +static int quieter = 0; /* Print fewer messages. This is helpful with overly + * ambitious log parsers. */ + +#define LOG_ERROR(...) \ + do { \ + if (!quieter) \ + fprintf(stderr, __VA_ARGS__); \ + } while(0) + #ifdef HAVE_SESSION_TICKET #ifndef SESSION_TICKET_LEN @@ -214,6 +223,9 @@ #ifdef WOLFSSL_ASYNC_CRYPT || error == WC_PENDING_E #endif + #ifdef WOLFSSL_NONBLOCK_OCSP + || error == OCSP_WANT_READ + #endif ) { #ifndef WOLFSSL_CALLBACKS ret = wolfSSL_connect(ssl); @@ -285,7 +297,7 @@ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) XSTRNCAT(verStr, "e(either):", 11); #endif - /* print all stings at same time on stdout to avoid any flush issues */ + /* print all strings at same time on stdout to avoid any flush issues */ printf("%s\n", verStr); } @@ -350,6 +362,19 @@ err_sys("unable to use curve secp256r1"); } while (ret == WC_PENDING_E); #endif + #ifdef WOLFSSL_SM2 + do { + ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_SM2P256V1); + if (ret == WOLFSSL_SUCCESS) + groups[count++] = WOLFSSL_ECC_SM2P256V1; + #ifdef WOLFSSL_ASYNC_CRYPT + else if (ret == WC_PENDING_E) + wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + #endif + else + err_sys("unable to use curve sm2p256v1"); + } while (ret == WC_PENDING_E); + #endif #endif } } @@ -435,32 +460,12 @@ } } while (err == WC_PENDING_E); if (ret != msgSz) { - fprintf(stderr, "SSL_write_early_data msg error %d, %s\n", err, - wolfSSL_ERR_error_string(err, buffer)); + LOG_ERROR("SSL_write_early_data msg error %d, %s\n", err, + wolfSSL_ERR_error_string((unsigned long)err, buffer)); wolfSSL_free(ssl); ssl = NULL; wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("SSL_write_early_data failed"); } - do { - err = 0; /* reset error */ - ret = wolfSSL_write_early_data(ssl, msg, msgSz, &msgSz); - if (ret <= 0) { - err = wolfSSL_get_error(ssl, 0); - #ifdef WOLFSSL_ASYNC_CRYPT - if (err == WC_PENDING_E) { - ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); - if (ret < 0) break; - } - #endif - } - } while (err == WC_PENDING_E); - if (ret != msgSz) { - fprintf(stderr, "SSL_write_early_data msg error %d, %s\n", err, - wolfSSL_ERR_error_string(err, buffer)); - wolfSSL_free(ssl); - wolfSSL_CTX_free(ctx); - err_sys("SSL_write_early_data failed"); - } } #endif @@ -678,8 +683,8 @@ conn_time = current_time(0) - start; /* Allocate TX/RX buffers */ - tx_buffer = (char*)XMALLOC(block, NULL, DYNAMIC_TYPE_TMP_BUFFER); - rx_buffer = (char*)XMALLOC(block, NULL, DYNAMIC_TYPE_TMP_BUFFER); + tx_buffer = (char*)XMALLOC((size_t)block, NULL, DYNAMIC_TYPE_TMP_BUFFER); + rx_buffer = (char*)XMALLOC((size_t)block, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (tx_buffer && rx_buffer) { WC_RNG rng; @@ -693,7 +698,7 @@ size_t xfer_bytes; /* Generate random data to send */ - ret = wc_RNG_GenerateBlock(&rng, (byte*)tx_buffer, block); + ret = wc_RNG_GenerateBlock(&rng, (byte*)tx_buffer, (word32)block); wc_FreeRng(&rng); if(ret != 0) { err_sys("wc_RNG_GenerateBlock failed"); @@ -705,7 +710,7 @@ int len, rx_pos, select_ret; /* Determine packet size */ - len = min(block, (int)(throughput - xfer_bytes)); + len = (int)min((word32)block, (word32)(throughput - xfer_bytes)); /* Perform TX */ start = current_time(1); @@ -723,7 +728,7 @@ } } while (err == WC_PENDING_E); if (ret != len) { - fprintf(stderr, "SSL_write bench error %d!\n", err); + LOG_ERROR("SSL_write bench error %d!\n", err); if (!exitWithRet) err_sys("SSL_write failed"); goto doExit; @@ -749,7 +754,7 @@ #endif if (err != WOLFSSL_ERROR_WANT_READ && err != WOLFSSL_ERROR_WANT_WRITE) { - fprintf(stderr, "SSL_read bench error %d\n", err); + LOG_ERROR("SSL_read bench error %d\n", err); err_sys("SSL_read failed"); } } @@ -761,7 +766,7 @@ } /* Compare TX and RX buffers */ - if (XMEMCMP(tx_buffer, rx_buffer, len) != 0) { + if (XMEMCMP(tx_buffer, rx_buffer, (size_t)len) != 0) { free(tx_buffer); tx_buffer = NULL; free(rx_buffer); @@ -770,7 +775,7 @@ } /* Update overall position */ - xfer_bytes += len; + xfer_bytes += (size_t)len; } } else { @@ -796,7 +801,7 @@ if (exitWithRet) return err; -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_WIN32) #define SIZE_FMT "%d" #define SIZE_TYPE int #else @@ -810,8 +815,8 @@ "\tRX %8.3f ms (%8.3f MBps)\n", (SIZE_TYPE)throughput, conn_time * 1000, - tx_time * 1000, throughput / tx_time / 1024 / 1024, - rx_time * 1000, throughput / rx_time / 1024 / 1024 + (double)tx_time * 1000, (double)throughput / tx_time / 1024 / 1024, + (double)rx_time * 1000, (double)throughput / rx_time / 1024 / 1024 ); return EXIT_SUCCESS; @@ -847,7 +852,7 @@ } /* C: EHLO mail.example.com */ - if (send(*sockfd, starttlsCmd[1], (int)XSTRLEN(starttlsCmd[1]), 0) != + if (send(*sockfd, starttlsCmd[1], (SIZE_TYPE)XSTRLEN(starttlsCmd[1]), 0) != (int)XSTRLEN(starttlsCmd[1])) err_sys("failed to send STARTTLS EHLO command\n"); @@ -864,7 +869,7 @@ } /* C: STARTTLS */ - if (send(*sockfd, starttlsCmd[3], (int)XSTRLEN(starttlsCmd[3]), 0) != + if (send(*sockfd, starttlsCmd[3], (SIZE_TYPE)XSTRLEN(starttlsCmd[3]), 0) != (int)XSTRLEN(starttlsCmd[3])) { err_sys("failed to send STARTTLS command\n"); } @@ -943,7 +948,7 @@ printf("Bidirectional shutdown complete\n"); } if (ret != WOLFSSL_SUCCESS) - fprintf(stderr, "Bidirectional shutdown failed\n"); + LOG_ERROR("Bidirectional shutdown failed\n"); } return WOLFSSL_SUCCESS; @@ -974,8 +979,8 @@ ); if (ret != msgSz) { char buffer[WOLFSSL_MAX_ERROR_SZ]; - fprintf(stderr, "SSL_write%s msg error %d, %s\n", str, err, - wolfSSL_ERR_error_string(err, buffer)); + LOG_ERROR("SSL_write%s msg error %d, %s\n", str, err, + wolfSSL_ERR_error_string((unsigned long)err, buffer)); if (!exitWithRet) { err_sys("SSL_write failed"); } @@ -1005,8 +1010,8 @@ #endif if (err != WOLFSSL_ERROR_WANT_READ && err != WOLFSSL_ERROR_WANT_WRITE && err != APP_DATA_READY) { - fprintf(stderr, "SSL_read reply error %d, %s\n", err, - wolfSSL_ERR_error_string(err, buffer)); + LOG_ERROR("SSL_read reply error %d, %s\n", err, + wolfSSL_ERR_error_string((unsigned long)err, buffer)); if (!exitWithRet) { err_sys("SSL_read failed"); } @@ -1021,7 +1026,7 @@ || err == WOLFSSL_ERROR_WANT_WRITE)) { elapsed = current_time(0) - start; if (elapsed > MAX_NON_BLOCK_SEC) { - fprintf(stderr, "Nonblocking read timeout\n"); + LOG_ERROR("Nonblocking read timeout\n"); ret = WOLFSSL_FATAL_ERROR; break; } @@ -1041,6 +1046,55 @@ return err; } +static int ClientWriteRead(WOLFSSL* ssl, const char* msg, int msgSz, + char* reply, int replyLen, int mustRead, + const char* str, int exitWithRet) +{ + int ret = 0; + + do { + ret = ClientWrite(ssl, msg, msgSz, str, exitWithRet); + if (ret != 0) { + if (!exitWithRet) + err_sys("ClientWrite failed"); + else + break; + } + if (wolfSSL_dtls(ssl)) { + ret = tcp_select(wolfSSL_get_fd(ssl), DEFAULT_TIMEOUT_SEC); + if (ret == TEST_TIMEOUT) { + continue; + } + else if (ret == TEST_RECV_READY) { + /* Ready to read */ + } + else { + LOG_ERROR("%s tcp_select error\n", str); + if (!exitWithRet) + err_sys("tcp_select failed"); + else + ret = WOLFSSL_FATAL_ERROR; + break; + } + } + ret = ClientRead(ssl, reply, replyLen, mustRead, str, exitWithRet); + if (mustRead && ret != 0) { + if (!exitWithRet) + err_sys("ClientRead failed"); + else + break; + } + break; + } while (1); + + if (ret != 0) { + char buffer[WOLFSSL_MAX_ERROR_SZ]; + LOG_ERROR("SSL_write%s msg error %d, %s\n", str, ret, + wolfSSL_ERR_error_string((unsigned long)ret, buffer)); + } + + return ret; +} /* when adding new option, please follow the steps below: */ /* 1. add new option message in English section */ @@ -1049,7 +1103,7 @@ /* 4. add the same message into Japanese section */ /* (will be translated later) */ /* 5. add printf() into suitable position of Usage() */ -static const char* client_usage_msg[][70] = { +static const char* client_usage_msg[][78] = { /* English */ { " NOTE: All files relative to wolfSSL home dir\n", /* 0 */ @@ -1108,6 +1162,7 @@ "-D Override Date Errors example\n", /* 18 */ "-e List Every cipher suite available, \n", /* 19 */ "-g Send server HTTP GET\n", /* 20 */ +#ifdef WOLFSSL_DTLS #ifndef WOLFSSL_DTLS13 "-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2" " (default)\n", /* 21 */ @@ -1115,6 +1170,7 @@ "-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2" " (default), -v 4 for DTLSv1.3\n", /* 21 */ #endif /* !WOLFSSL_DTLS13 */ +#endif #ifdef WOLFSSL_SCTP "-G Use SCTP DTLS," " add -v 2 for DTLSv1, -v 3 for DTLSv1.2 (default)\n", /* 22 */ @@ -1134,7 +1190,7 @@ " string 'scr-app-data' is passed in as the value and\n" " Non-blocking sockets are enabled ('-N') then wolfSSL\n" " sends a test message during the secure renegotiation.\n" - " The string parameter is optional.\n", /* 29 */ + " The string parameter is optional.\n", /* 29 */ #endif "-f Fewer packets/group messages\n", /* 30 */ #ifndef NO_CERTS @@ -1264,9 +1320,13 @@ #ifndef NO_PSK "--openssl-psk Use TLS 1.3 PSK callback compatible with OpenSSL\n", /* 74 */ #endif +#ifdef HAVE_RPK + "--rpk Use RPK for the defined certificates\n", /* 75 */ +#endif + "--files-are-der Specified files are in DER, not PEM format\n", /* 76 */ "\n" "For simpler wolfSSL TLS client examples, visit\n" - "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 75 */ + "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 77 */ NULL, }, #ifndef NO_MULTIBYTE_PRINT @@ -1329,6 +1389,7 @@ "-D 日付エラー用コールãƒãƒƒã‚¯ä¾‹ã®ä¸Šæ›¸ãã‚’è¡Œã†\n", /* 18 */ "-e 利用å¯èƒ½ãªå…¨ã¦ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆã‚’リスト, \n", /* 19 */ "-g サーãƒãƒ¼ã¸ HTTP GET ã‚’é€ä¿¡\n", /* 20 */ +#ifdef WOLFSSL_DTLS "-u UDP DTLSを使用ã™ã‚‹ã€‚\n" #ifndef WOLFSSL_DTLS13 " -v 2 を追加指定ã™ã‚‹ã¨DTLSv1, " @@ -1338,6 +1399,7 @@ "-v 3 を追加指定ã™ã‚‹ã¨ DTLSv1.2 (既定値),\n" " -v 4 を追加指定ã™ã‚‹ã¨ DTLSv1.3\n", /* 21 */ #endif /* !WOLFSSL_DTLS13 */ +#endif /* WOLFSSL_DTLS */ #ifdef WOLFSSL_SCTP "-G SCTP DTLSを使用ã™ã‚‹ã€‚-v 2 を追加指定ã™ã‚‹ã¨" " DTLSv1, -v 3 を追加指定ã™ã‚‹ã¨ DTLSv1.2 (既定値)\n", /* 22 */ @@ -1446,7 +1508,7 @@ #ifdef HAVE_TRUSTED_CA "-5 ä¿¡é ¼ã§ãã‚‹èªè¨¼å±€ã®éµè¡¨ç¤ºã‚’使用ã™ã‚‹\n", /* 63 */ #endif - "-6 WANT_WRITE エラーを全ã¦ã®IO é€ä¿¡ã§ã‚·ãƒ¥ãƒŸãƒ¬ãƒ¼ãƒˆã—ã¾ã™\n", + "-6 WANT_WRITE エラーを全ã¦ã®IO é€ä¿¡ã§ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆã—ã¾ã™\n", #ifdef HAVE_CURVE448 "-8 éµäº¤æ›ã« X448 を使用ã™ã‚‹\n", /* 66 */ #endif @@ -1488,10 +1550,14 @@ #ifndef NO_PSK "--openssl-psk Use TLS 1.3 PSK callback compatible with OpenSSL\n", /* 74 */ #endif +#ifdef HAVE_RPK + "--rpk Use RPK for the defined certificates\n", /* 75 */ +#endif + "--files-are-der Specified files are in DER, not PEM format\n", /* 76 */ "\n" - "より簡å˜ãªwolfSSL TSL クライアントã®ä¾‹ã«ã¤ã„ã¦ã¯" + "より簡å˜ãªwolfSSL TLS クライアントã®ä¾‹ã«ã¤ã„ã¦ã¯" "下記ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„\n" - "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 75 */ + "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 77 */ NULL, }, #endif @@ -1505,12 +1571,12 @@ if (peer) { WOLFSSL_BIO* bioOut = wolfSSL_BIO_new(wolfSSL_BIO_s_file()); if (bioOut == NULL) { - fprintf(stderr, "failed to get bio on stdout\n"); + LOG_ERROR("failed to get bio on stdout\n"); } else { if (wolfSSL_BIO_set_fp(bioOut, stdout, BIO_NOCLOSE) != WOLFSSL_SUCCESS) { - fprintf(stderr, "failed to set stdout to bio output\n"); + LOG_ERROR("failed to set stdout to bio output\n"); wolfSSL_BIO_free(bioOut); bioOut = NULL; } @@ -1709,9 +1775,9 @@ printf("%s", msg[++msgid]); /* Examples repo link */ #ifdef HAVE_PQC printf("%s", msg[++msgid]); /* --pqc */ - printf("%s", msg[++msgid]); /* --pqc options */ - printf("%s", msg[++msgid]); /* more --pqc options */ - printf("%s", msg[++msgid]); /* more --pqc options */ +#endif +#ifdef WOLFSSL_SRTP + printf("%s", msg[++msgid]); /* dtls-srtp */ #endif #ifdef WOLFSSL_SYS_CA_CERTS printf("%s", msg[++msgid]); /* --sys-ca-certs */ @@ -1719,9 +1785,14 @@ #ifdef HAVE_SUPPORTED_CURVES printf("%s", msg[++msgid]); /* --onlyPskDheKe */ #endif -#ifdef WOLFSSL_SRTP - printf("%s", msg[++msgid]); /* dtls-srtp */ +#ifndef NO_PSK + printf("%s", msg[++msgid]); /* --openssl-psk */ #endif +#ifdef HAVE_RPK + printf("%s", msg[++msgid]); /* --rpk */ +#endif + printf("%s", msg[++msgid]); /* --files-are-der */ + printf("%s", msg[++msgid]); /* Documentation Hint */ } #ifdef WOLFSSL_SRTP @@ -1740,7 +1811,7 @@ size_t srtp_secret_length; byte *srtp_secret, *p; int ret; -#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#ifdef WOLFSSL_COND srtp_test_helper *srtp_helper = args->srtp_helper; byte *other_secret = NULL; size_t other_size = 0; @@ -1751,7 +1822,7 @@ ret = wolfSSL_export_dtls_srtp_keying_material(ssl, NULL, &srtp_secret_length); if (ret != LENGTH_ONLY_E) { - fprintf(stderr, "DTLS SRTP: Error getting keying material length\n"); + LOG_ERROR("DTLS SRTP: Error getting keying material length\n"); return ret; } @@ -1765,7 +1836,7 @@ &srtp_secret_length); if (ret != WOLFSSL_SUCCESS) { XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER); - fprintf(stderr, "DTLS SRTP: Error getting keying material\n"); + LOG_ERROR("DTLS SRTP: Error getting keying material\n"); return ret; } @@ -1774,7 +1845,7 @@ printf("%02X", *p); printf("\n"); -#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#ifdef WOLFSSL_COND if (srtp_helper != NULL) { srtp_helper_get_ekm(srtp_helper, &other_secret, &other_size); @@ -1790,7 +1861,7 @@ /* we are delegated from server to free this buffer */ XFREE(other_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER); } -#endif +#endif /* WOLFSSL_COND */ XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -1798,6 +1869,39 @@ } #endif /* WOLFSSL_SRTP */ +#if defined(WOLFSSL_STATIC_MEMORY) && \ + defined(WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK) +static void ExampleDebugMemoryCb(size_t sz, int bucketSz, byte st, int type) { + switch (st) { + case WOLFSSL_DEBUG_MEMORY_ALLOC: + if (type == DYNAMIC_TYPE_IN_BUFFER) { + printf("IN BUFFER: "); + } + + if (type == DYNAMIC_TYPE_OUT_BUFFER) { + printf("OUT BUFFER: "); + } + + printf("Alloc'd %d bytes using bucket size %d\n", (int)sz, + bucketSz); + break; + + case WOLFSSL_DEBUG_MEMORY_FAIL: + printf("Failed when trying to allocate %d bytes\n", (int)sz); + break; + + case WOLFSSL_DEBUG_MEMORY_FREE: + printf("Free'ing : %d\n", (int)sz); + break; + + case WOLFSSL_DEBUG_MEMORY_INIT: + printf("Creating memory bucket of size : %d\n", bucketSz); + break; + } +} +#endif + + THREAD_RETURN WOLFSSL_THREAD client_test(void* args) { @@ -1837,7 +1941,9 @@ { "wolfsentry-config", 1, 256 }, #endif { "help", 0, 257 }, +#ifndef NO_MULTIBYTE_PRINT { "ヘルプ", 0, 258 }, +#endif #if defined(HAVE_PQC) { "pqc", 1, 259 }, #endif @@ -1862,6 +1968,11 @@ #ifndef NO_PSK { "openssl-psk", 0, 265 }, #endif + { "quieter", 0, 266 }, +#ifdef HAVE_RPK + { "rpk", 0, 267 }, +#endif /* HAVE_RPK */ + { "files-are-der", 0, 268 }, { 0, 0, 0 } }; #endif @@ -2002,6 +2113,10 @@ int useDtlsCID = 0; char dtlsCID[DTLS_CID_BUFFER_SIZE] = { 0 }; #endif /* WOLFSSL_DTLS_CID */ +#ifdef HAVE_RPK + int useRPK = 0; +#endif /* HAVE_RPK */ + int fileFormat = WOLFSSL_FILETYPE_PEM; char buffer[WOLFSSL_MAX_ERROR_SZ]; @@ -2018,13 +2133,26 @@ byte memory[80000]; #endif byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */ + #if !defined(WOLFSSL_STATIC_MEMORY_LEAN) WOLFSSL_MEM_CONN_STATS ssl_stats; - #ifdef DEBUG_WOLFSSL + #if defined(DEBUG_WOLFSSL) WOLFSSL_MEM_STATS mem_stats; #endif + #endif WOLFSSL_HEAP_HINT *heap = NULL; #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + /* Set our preference for verification to be for both the native and + * alternative chains. Ultimately, its the server's choice. This will be + * used in the call to wolfSSL_UseCKS(). */ + byte cks_order[3] = { + WOLFSSL_CKS_SIGSPEC_BOTH, + WOLFSSL_CKS_SIGSPEC_ALTERNATIVE, + WOLFSSL_CKS_SIGSPEC_NATIVE, + }; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + ((func_args*)args)->return_code = -1; /* error state */ #ifndef NO_RSA @@ -2077,6 +2205,7 @@ (void)usePqc; (void)pqcAlg; (void)opensslPsk; + (void)fileFormat; StackTrap(); /* Reinitialize the global myVerifyAction. */ @@ -2336,7 +2465,7 @@ break; case 'B' : - throughput = atol(myoptarg); + throughput = (size_t)atol(myoptarg); for (; *myoptarg != '\0'; myoptarg++) { if (*myoptarg == ',') { block = atoi(myoptarg + 1); @@ -2399,7 +2528,7 @@ case 'F' : #ifdef HAVE_MAX_FRAGMENT - maxFragment = atoi(myoptarg); + maxFragment = (byte)atoi(myoptarg); if (maxFragment < WOLFSSL_MFL_MIN || maxFragment > WOLFSSL_MFL_MAX) { Usage(); @@ -2426,7 +2555,7 @@ { word32 myoptargSz; - statusRequest = atoi(myoptarg); + statusRequest = (byte)atoi(myoptarg); if (statusRequest > OCSP_STAPLING_OPT_MAX) { Usage(); XEXIT_T(MY_EX_USAGE); @@ -2597,7 +2726,7 @@ nonBlocking = 1; simulateWantWrite = 1; #else - fprintf(stderr, "Ignoring -6 since async I/O support not " + LOG_ERROR("Ignoring -6 since async I/O support not " "compiled in.\n"); #endif break; @@ -2696,6 +2825,17 @@ opensslPsk = 1; #endif break; + case 266: + quieter = 1; + break; + case 267: +#ifdef HAVE_RPK + useRPK = 1; +#endif /* HAVE_RPK */ + break; + case 268: + fileFormat = WOLFSSL_FILETYPE_ASN1; + break; default: Usage(); XEXIT_T(MY_EX_USAGE); @@ -2780,7 +2920,7 @@ #endif if (done) { - fprintf(stderr, "external test can't be run in this mode\n"); + LOG_ERROR("external test can't be run in this mode\n"); ((func_args*)args)->return_code = 0; XEXIT_T(EXIT_SUCCESS); @@ -2818,7 +2958,7 @@ #ifndef HAVE_SESSION_TICKET if ((version >= 4) && resumeSession) { - fprintf(stderr, "Can't do TLS 1.3 resumption; need session tickets!\n"); + LOG_ERROR("Can't do TLS 1.3 resumption; need session tickets!\n"); } #endif @@ -2831,7 +2971,7 @@ if (usePqc) { if (version == CLIENT_DOWNGRADE_VERSION || version == EITHER_DOWNGRADE_VERSION) - fprintf(stderr, + LOG_ERROR( "WARNING: If a TLS 1.3 connection is not negotiated, you " "will not be using a post-quantum group.\n"); else if (version != 4 && version != -4) @@ -2925,14 +3065,14 @@ #ifdef WOLFSSL_STATIC_MEMORY - #ifdef DEBUG_WOLFSSL + #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) /* print off helper buffer sizes for use with static memory * printing to stderr in case of debug mode turned on */ - fprintf(stderr, "static memory management size = %d\n", + LOG_ERROR("static memory management size = %d\n", wolfSSL_MemoryPaddingSz()); - fprintf(stderr, "calculated optimum general buffer size = %d\n", + LOG_ERROR("calculated optimum general buffer size = %d\n", wolfSSL_StaticBufferSz(memory, sizeof(memory), 0)); - fprintf(stderr, "calculated optimum IO buffer size = %d\n", + LOG_ERROR("calculated optimum IO buffer size = %d\n", wolfSSL_StaticBufferSz(memoryIO, sizeof(memoryIO), WOLFMEM_IO_POOL_FIXED)); #endif /* DEBUG_WOLFSSL */ @@ -2942,6 +3082,10 @@ err_sys("unable to load static memory"); } +#if defined(WOLFSSL_STATIC_MEMORY) && \ + defined(WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK) + wolfSSL_SetDebugMemoryCb(ExampleDebugMemoryCb); +#endif ctx = wolfSSL_CTX_new_ex(method(heap), heap); if (ctx == NULL) err_sys("unable to get ctx"); @@ -3069,6 +3213,21 @@ } #endif +#ifdef HAVE_RPK + if (useRPK) { + char ctype[] = {WOLFSSL_CERT_TYPE_RPK}; + char stype[] = {WOLFSSL_CERT_TYPE_RPK}; + + wolfSSL_CTX_set_client_cert_type(ctx, ctype, sizeof(ctype)/sizeof(ctype[0])); + wolfSSL_CTX_set_server_cert_type(ctx, stype, sizeof(stype)/sizeof(stype[0])); + usePsk = 0; + #ifdef HAVE_CRL + disableCRL = 1; + #endif + doPeerCheck = 0; + } +#endif /* HAVE_RPK */ + if (usePsk) { #ifndef NO_PSK const char *defaultCipherList = cipherList; @@ -3201,7 +3360,7 @@ WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) err_sys("can't load client cert buffer"); #elif !defined(TEST_LOAD_BUFFER) - if (wolfSSL_CTX_use_certificate_chain_file(ctx, ourCert) + if (wolfSSL_CTX_use_certificate_chain_file_format(ctx, ourCert, fileFormat) != WOLFSSL_SUCCESS) { wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't load client cert file, check file and run from" @@ -3225,7 +3384,7 @@ sizeof_client_key_der_2048, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) err_sys("can't load client private key buffer"); #elif !defined(TEST_LOAD_BUFFER) - if (wolfSSL_CTX_use_PrivateKey_file(ctx, ourKey, WOLFSSL_FILETYPE_PEM) + if (wolfSSL_CTX_use_PrivateKey_file(ctx, ourKey, fileFormat) != WOLFSSL_SUCCESS) { wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't load client private key file, check file and run " @@ -3331,7 +3490,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfAsync_DevOpen(&devId); if (ret < 0) { - fprintf(stderr, "Async device open failed\nRunning without async\n"); + LOG_ERROR("Async device open failed\nRunning without async\n"); } wolfSSL_CTX_SetDevId(ctx, devId); #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -3468,8 +3627,9 @@ } #endif -#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) - fprintf(stderr, "Before creating SSL\n"); +#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) && \ + !defined(WOLFSSL_STATIC_MEMORY_LEAN) + LOG_ERROR("Before creating SSL\n"); if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) err_sys("ctx not using static memory"); if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ @@ -3498,6 +3658,13 @@ err_sys("unable to get SSL object"); } +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (!wolfSSL_UseCKS(ssl, cks_order, sizeof(cks_order))) { + wolfSSL_CTX_free(ctx); ctx = NULL; + err_sys("unable to set the CKS order."); + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + #ifndef NO_PSK if (usePsk) { #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13) && defined(TEST_PSK_USE_SESSION) @@ -3515,7 +3682,7 @@ err_sys("can't load client cert buffer"); } #elif !defined(TEST_LOAD_BUFFER) - if (wolfSSL_use_certificate_chain_file(ssl, ourCert) + if (wolfSSL_use_certificate_chain_file_format(ssl, ourCert, fileFormat) != WOLFSSL_SUCCESS) { wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't load client cert file, check file and run from" @@ -3536,7 +3703,7 @@ sizeof_client_key_der_2048, SSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) err_sys("can't load client private key buffer"); #elif !defined(TEST_LOAD_BUFFER) - if (wolfSSL_use_PrivateKey_file(ssl, ourKey, WOLFSSL_FILETYPE_PEM) + if (wolfSSL_use_PrivateKey_file(ssl, ourKey, fileFormat) != WOLFSSL_SUCCESS) { wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't load client private key file, check file and run " @@ -3559,8 +3726,9 @@ } #endif -#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) - fprintf(stderr, "After creating SSL\n"); +#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) && \ + !defined(WOLFSSL_STATIC_MEMORY_LEAN) + LOG_ERROR("After creating SSL\n"); if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) err_sys("ctx not using static memory"); if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ @@ -3640,6 +3808,7 @@ if (wolfSSL_UseOCSPStapling(ssl, WOLFSSL_CSR_OCSP, WOLFSSL_CSR_OCSP_USE_NONCE) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("UseCertificateStatusRequest failed"); } @@ -3651,6 +3820,7 @@ WOLFSSL_CSR2_OCSP, WOLFSSL_CSR2_OCSP_USE_NONCE) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("UseCertificateStatusRequest failed"); } @@ -3660,6 +3830,7 @@ WOLFSSL_CSR2_OCSP_MULTI, 0) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("UseCertificateStatusRequest failed"); } @@ -3688,6 +3859,7 @@ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, ssl); if (wolfSSL_set_fd(ssl, sockfd) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("error in setting fd"); } @@ -3703,6 +3875,7 @@ if (doSTARTTLS) { if (StartTLS_Init(&sockfd) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("error during STARTTLS protocol"); } @@ -3716,17 +3889,20 @@ if (wolfSSL_EnableCRL(ssl, WOLFSSL_CRL_CHECKALL) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't enable crl check"); } if (wolfSSL_LoadCRL(ssl, crlPemDir, WOLFSSL_FILETYPE_PEM, 0) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't load crl, check crlfile and date validity"); } if (wolfSSL_SetCRL_Cb(ssl, CRL_CallBack) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't set crl callback"); } @@ -3736,6 +3912,7 @@ if (scr) { if (wolfSSL_UseSecureRenegotiation(ssl) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't enable secure renegotiation"); } @@ -3796,8 +3973,8 @@ #endif if (ret != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(ssl, 0); - fprintf(stderr, "wolfSSL_connect error %d, %s\n", err, - wolfSSL_ERR_error_string(err, buffer)); + LOG_ERROR("wolfSSL_connect error %d, %s\n", err, + wolfSSL_ERR_error_string((unsigned long)err, buffer)); /* cleanup */ wolfSSL_free(ssl); ssl = NULL; @@ -3888,6 +4065,7 @@ size = wolfSSL_get_client_random(NULL, NULL, 0); if (size == 0) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("error getting client random buffer size"); } @@ -3895,6 +4073,7 @@ rnd = (byte*)XMALLOC(size, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (rnd == NULL) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("error creating client random buffer"); } @@ -3903,6 +4082,7 @@ if (size == 0) { XFREE(rnd, NULL, DYNAMIC_TYPE_TMP_BUFFER); wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("error getting client random buffer"); } @@ -3941,6 +4121,7 @@ if (XSTRCMP(starttlsProt, "smtp") == 0) { if (SMTP_Shutdown(ssl, wc_shutdown) != WOLFSSL_SUCCESS) { wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("error closing STARTTLS connection"); } @@ -3952,7 +4133,7 @@ wolfSSL_CTX_free(ctx); ctx = NULL; ((func_args*)args)->return_code = 0; - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); } #ifdef HAVE_ALPN @@ -4052,16 +4233,17 @@ } if (ret != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(ssl, 0); - fprintf(stderr, "wolfSSL_Rehandshake error %d, %s\n", err, + LOG_ERROR("wolfSSL_Rehandshake error %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer)); wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("non-blocking wolfSSL_Rehandshake failed"); } } } else { - fprintf(stderr, "not doing secure resumption with non-blocking"); + LOG_ERROR("not doing secure resumption with non-blocking"); } } else { if (!resumeScr) { @@ -4085,6 +4267,7 @@ printf("err = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer)); wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("wolfSSL_Rehandshake failed"); } @@ -4114,6 +4297,7 @@ printf("err = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer)); wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("wolfSSL_SecureResume failed"); } @@ -4131,11 +4315,11 @@ printf("SSL connect ok, sending GET...\n"); msgSz = (int)XSTRLEN(kHttpGetMsg); - XMEMCPY(msg, kHttpGetMsg, msgSz); + XMEMCPY(msg, kHttpGetMsg, (size_t)msgSz); } else { msgSz = (int)XSTRLEN(kHelloMsg); - XMEMCPY(msg, kHelloMsg, msgSz); + XMEMCPY(msg, kHelloMsg, (size_t)msgSz); } /* allow some time for exporting the session */ @@ -4150,6 +4334,7 @@ if (exitWithRet) { ((func_args*)args)->return_code = err; wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; goto exit; } @@ -4164,18 +4349,12 @@ wolfSSL_update_keys(ssl); #endif - err = ClientWrite(ssl, msg, msgSz, "", exitWithRet); - if (exitWithRet && (err != 0)) { - ((func_args*)args)->return_code = err; - wolfSSL_free(ssl); ssl = NULL; - wolfSSL_CTX_free(ctx); ctx = NULL; - goto exit; - } - - err = ClientRead(ssl, reply, sizeof(reply)-1, 1, "", exitWithRet); + err = ClientWriteRead(ssl, msg, msgSz, reply, sizeof(reply)-1, 1, "", + exitWithRet); if (exitWithRet && (err != 0)) { ((func_args*)args)->return_code = err; wolfSSL_free(ssl); ssl = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; goto exit; } @@ -4243,12 +4422,12 @@ break; } else if (ret != WOLFSSL_SHUTDOWN_NOT_DONE) { - fprintf(stderr, "Bidirectional shutdown failed\n"); + LOG_ERROR("Bidirectional shutdown failed\n"); break; } } if (ret != WOLFSSL_SUCCESS) - fprintf(stderr, "Bidirectional shutdown failed\n"); + LOG_ERROR("Bidirectional shutdown failed\n"); } #if defined(ATOMIC_USER) && !defined(WOLFSSL_AEAD_ONLY) if (atomicUser) @@ -4256,12 +4435,12 @@ #endif /* display collected statistics */ -#ifdef WOLFSSL_STATIC_MEMORY +#if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) if (wolfSSL_is_static_memory(ssl, &ssl_stats) != 1) err_sys("static memory was not used with ssl"); - fprintf(stderr, "\nprint off SSL memory stats\n"); - fprintf(stderr, "*** This is memory state before wolfSSL_free is called\n"); + LOG_ERROR("\nprint off SSL memory stats\n"); + LOG_ERROR("*** This is memory state before wolfSSL_free is called\n"); wolfSSL_PrintStatsConn(&ssl_stats); #endif @@ -4293,6 +4472,7 @@ tcp_connect(&sockfd, host, port, dtlsUDP, dtlsSCTP, sslResume); if (wolfSSL_set_fd(sslResume, sockfd) != WOLFSSL_SUCCESS) { wolfSSL_free(sslResume); sslResume = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("error in setting fd"); } @@ -4313,6 +4493,7 @@ if (scr) { if (wolfSSL_UseSecureRenegotiation(sslResume) != WOLFSSL_SUCCESS) { wolfSSL_free(sslResume); sslResume = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("can't enable secure renegotiation"); } @@ -4384,9 +4565,10 @@ ret = NonBlockingSSL_Connect(sslResume); /* will keep retrying on timeout */ #endif if (ret != WOLFSSL_SUCCESS) { - fprintf(stderr, "wolfSSL_connect resume error %d, %s\n", err, - wolfSSL_ERR_error_string(err, buffer)); + LOG_ERROR("wolfSSL_connect resume error %d, %s\n", err, + wolfSSL_ERR_error_string((unsigned long)err, buffer)); wolfSSL_free(sslResume); sslResume = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("wolfSSL_connect resume failed"); } @@ -4397,7 +4579,7 @@ if (wolfSSL_session_reused(sslResume)) printf("reused session id\n"); else - fprintf(stderr, "didn't reuse session id!!!\n"); + LOG_ERROR("didn't reuse session id!!!\n"); #ifdef HAVE_ALPN if (alpnList != NULL) { @@ -4432,9 +4614,10 @@ printf("Beginning secure renegotiation.\n"); if (wolfSSL_Rehandshake(sslResume) != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(sslResume, 0); - fprintf(stderr, "err = %d, %s\n", err, + LOG_ERROR("err = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer)); wolfSSL_free(sslResume); sslResume = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("wolfSSL_Rehandshake failed"); } @@ -4446,9 +4629,10 @@ printf("Beginning secure resumption.\n"); if (wolfSSL_SecureResume(sslResume) != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(sslResume, 0); - fprintf(stderr, "err = %d, %s\n", err, + LOG_ERROR("err = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer)); wolfSSL_free(sslResume); sslResume = NULL; + CloseSocket(sockfd); wolfSSL_CTX_free(ctx); ctx = NULL; err_sys("wolfSSL_SecureResume failed"); } @@ -4463,28 +4647,27 @@ XMEMSET(msg, 0, sizeof(msg)); if (sendGET) { msgSz = (int)XSTRLEN(kHttpGetMsg); - XMEMCPY(msg, kHttpGetMsg, msgSz); + XMEMCPY(msg, kHttpGetMsg, (size_t)msgSz); } else { msgSz = (int)XSTRLEN(kResumeMsg); - XMEMCPY(msg, kResumeMsg, msgSz); + XMEMCPY(msg, kResumeMsg, (size_t)msgSz); } - (void)ClientWrite(sslResume, msg, msgSz, " resume", 0); - (void)ClientRead(sslResume, reply, sizeof(reply)-1, sendGET, - "Server resume: ", 0); + (void)ClientWriteRead(sslResume, msg, msgSz, reply, sizeof(reply)-1, + sendGET, " resume", 0); ret = wolfSSL_shutdown(sslResume); if (wc_shutdown && ret == WOLFSSL_SHUTDOWN_NOT_DONE) wolfSSL_shutdown(sslResume); /* bidirectional shutdown */ /* display collected statistics */ - #ifdef WOLFSSL_STATIC_MEMORY + #if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) if (wolfSSL_is_static_memory(sslResume, &ssl_stats) != 1) err_sys("static memory was not used with ssl"); - fprintf(stderr, "\nprint off SSLresume memory stats\n"); - fprintf(stderr, "*** This is memory state before wolfSSL_free is called\n"); + LOG_ERROR("\nprint off SSLresume memory stats\n"); + LOG_ERROR("*** This is memory state before wolfSSL_free is called\n"); wolfSSL_PrintStatsConn(&ssl_stats); #endif @@ -4503,7 +4686,7 @@ wolfsentry_ret = wolfsentry_shutdown(WOLFSENTRY_CONTEXT_ARGS_OUT_EX4(&wolfsentry, NULL)); if (wolfsentry_ret < 0) { - fprintf(stderr, + LOG_ERROR( "wolfsentry_shutdown() returned " WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(wolfsentry_ret)); } @@ -4528,9 +4711,7 @@ (void) useVerifyCb; (void) customVerifyCert; -#if !defined(WOLFSSL_TIRTOS) - return 0; -#endif + WOLFSSL_RETURN_FROM_THREAD(0); } #endif /* !NO_WOLFSSL_CLIENT */ @@ -4546,7 +4727,7 @@ StartTCP(); -#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND) args.srtp_helper = NULL; #endif args.argc = argc; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/client/client.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/client/client.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.vcproj 2024-08-03 07:30:00.000000000 +0000 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -117,7 +117,7 @@ Optimization="2" EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/client/client.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/client/client.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/client/client.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -159,7 +159,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -179,7 +179,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -200,7 +200,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -218,7 +218,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -237,7 +237,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -259,7 +259,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -281,7 +281,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -302,7 +302,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -6,11 +6,16 @@ * `user_settings_template.h`: Template that allows modular algorithm and feature selection using `#if 0` logic. * `user_settings_all.h`: This is wolfSSL with all features enabled. Equivalent to `./configure --enable-all`. -* `user_settings_min_ecc.h`: This is ECC and SHA-256 only. For ECC verify only add `BUILD_VERIFY_ONLY`. -* `user_settings_wolfboot_keytools.h`: This from wolfBoot tools/keytools and is ECC, RSA, ED25519 and ChaCha20. +* `user_settings_arduino.h`: An example Arduino file. See also [wolfSSL/Arduino-wolfSSL](https://github.com/wolfSSL/Arduino-wolfSSL). +*.`user_settings_EBSnet.h`: Example configuration file for use with EBSnet ports. * `user_settings_fipsv2.h`: The FIPS v2 (3389) 140-2 certificate build options. * `user_settings_fipsv5.h`: The FIPS v5 (ready) 140-3 build options. Equivalent to `./configure --enable-fips=v5-dev`. +* `user_settings_min_ecc.h`: This is ECC and SHA-256 only. For ECC verify only add `BUILD_VERIFY_ONLY`. +* `user_settings_platformio.h`: An example for PlatformIO library. See also [platformio/wolfssl](https://registry.platformio.org/libraries/wolfssl/wolfssl) * `user_settings_stm32.h`: Example configuration file generated from the wolfSSL STM32 Cube pack. +* `user_settings_tls12`: Example for TLS v1.2 client only, ECC only, AES GCM only, SHA2-256 only. +* `user_settings_wolfboot_keytools.h`: This from wolfBoot tools/keytools and is ECC, RSA, ED25519 and ChaCha20. +* `user_settings_wolfssh.h`: Minimum options for building wolfSSH. See comment at top for ./configure used to generate. * `user_settings_wolftpm.h`: Minimum options for building wolfTPM. See comment at top for ./configure used to generate. ## Usage diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -3,10 +3,15 @@ EXTRA_DIST += examples/configs/README.md EXTRA_DIST += examples/configs/user_settings_all.h -EXTRA_DIST += examples/configs/user_settings_min_ecc.h -EXTRA_DIST += examples/configs/user_settings_wolfboot_keytools.h -EXTRA_DIST += examples/configs/user_settings_template.h +EXTRA_DIST += examples/configs/user_settings_arduino.h +EXTRA_DIST += examples/configs/user_settings_EBSnet.h EXTRA_DIST += examples/configs/user_settings_fipsv2.h EXTRA_DIST += examples/configs/user_settings_fipsv5.h +EXTRA_DIST += examples/configs/user_settings_min_ecc.h +EXTRA_DIST += examples/configs/user_settings_platformio.h EXTRA_DIST += examples/configs/user_settings_stm32.h +EXTRA_DIST += examples/configs/user_settings_template.h +EXTRA_DIST += examples/configs/user_settings_tls12.h +EXTRA_DIST += examples/configs/user_settings_wolfboot_keytools.h +EXTRA_DIST += examples/configs/user_settings_wolfssh.h EXTRA_DIST += examples/configs/user_settings_wolftpm.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_EBSnet.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_EBSnet.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_EBSnet.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_EBSnet.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,56 @@ +/* user_settings_EBSnet.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Example wolfSSL user settings for use with EBSnet ports. + * This file is included with wolfssl/wolfcrypt/settings.h when WOLFSSL_USER_SETTINGS is defined. + */ + +#ifndef WOLFSSL_USER_SETTINGS_H +#define WOLFSSL_USER_SETTINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define OPENSSL_EXTRA_X509_SMALL + +#define USE_FAST_MATH +#define TFM_TIMING_RESISTANT +#define WC_RSA_BLINDING +#define ECC_TIMING_RESISTANT + +#define HAVE_ECC +#define HAVE_CURVE25519 +#define HAVE_AESGCM +#define WOLFSSL_SHA384 + +#define NO_DSA +#define NO_RC4 +#define NO_MD4 +#define NO_MD5 +#define NO_DES3 + +#ifdef __cplusplus +} +#endif + +#endif /* WOLFSSL_USER_SETTINGS_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_all.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_all.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_all.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_all.h 2024-08-03 07:30:00.000000000 +0000 @@ -125,7 +125,7 @@ #define WOLFSSL_DER_TO_PEM #define WOLFSSL_CUSTOM_OID #define HAVE_OID_ENCODING -//#define WOLFSSL_ASN_TEMPLATE /* Not enabled yet by default */ +#define WOLFSSL_ASN_TEMPLATE /* Certificate Revocation */ #define HAVE_OCSP diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_arduino.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_arduino.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_arduino.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_arduino.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,486 @@ +/* examples/configs/user_settings_arduino.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* This is a sample Arduino user_settings.h for wolfSSL + >> Edit with caution. This is the file copied to wolfSSL Arduino library. + >> at publish time. (lines with ">>" are removed) +*/ + +/* Define a macro to display user settings version in example code: */ +#define WOLFSSL_USER_SETTINGS_ID "Arduino user_settings.h v5.6.7" + +/* Due to limited build control, we'll ignore file warnings. */ +/* See https://github.com/arduino/arduino-cli/issues/631 */ +#undef WOLFSSL_IGNORE_FILE_WARN +#define WOLFSSL_IGNORE_FILE_WARN + +#define NO_FILESYSTEM +#define USE_CERT_BUFFERS_2048 + +/* Make sure this is not an ESP-IDF file */ +#undef WOLFSSL_ESPIDF + +#define HAVE_ECC +#define WOLFSSL_SMALL_STACK +/* #define WOLFSSL_SMALL_STACK_EXTRA */ +/* #define WOLFSSL_SMALL_STACK_CIPHERS */ +/* #define NO_DH */ +#define MICRO_SESSION_CACHE + +/* RSA must be enabled for examples, but can be disabled like this: */ +/* #define NO_RSA */ +#define RSA_LOW_MEM + +#define NO_OLD_TLS +/* TLS 1.3 */ +/* #define WOLFSSL_TLS13 */ +#if defined(WOLFSSL_TLS13) + #define HAVE_TLS_EXTENSIONS + #define WC_RSA_PSS + #define HAVE_HKDF + #define HAVE_AEAD +#endif + +/* #define HAVE_SUPPORTED_CURVES */ + +/* Cannot use WOLFSSL_NO_MALLOC with small stack */ +/* #define WOLFSSL_NO_MALLOC */ + +#define HAVE_TLS_EXTENSIONS +#define HAVE_SUPPORTED_CURVES + +/* To further reduce size, client or server functionality can be disabled. + * Here, we check if the example code gave us a hint. + * + * The calling application can define either one of these macros before + * including the Arduino wolfssl.h library file: + * + * WOLFSSL_CLIENT_EXAMPLE + * WOLFSSL_SERVER_EXAMPLE + */ +#if defined(WOLFSSL_CLIENT_EXAMPLE) + #define NO_WOLFSSL_SERVER +#elif defined(WOLFSSL_SERVER_EXAMPLE) + #define NO_WOLFSSL_CLIENT +#else + /* Provide a hint to application that neither WOLFSSL_CLIENT_EXAMPLE + * or WOLFSSL_SERVER_EXAMPLE macro hint was desired but not found. */ + #define NO_WOLFSSL_SERVER_CLIENT_MISSING + #warning "Define WOLFSSL_CLIENT_EXAMPLE or WOLFSSL_SERVER_EXAMPLE to" \ + " optimize memory for small embedded devices." + /* Both can be disabled in wolfssl test & benchmark */ +#endif + + +#define NO_DH +#define NO_DSA +#define USE_FAST_MATH +#define WOLFSSL_SMALL_STACK +#define SINGLE_THREADED +#define WOLFSSL_LOW_MEMORY +#define HAVE_AESGCM + +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +#define SINGLE_THREADED + + +/* Optional OPENSSL compatibility */ +/* #define OPENSSL_EXTRA */ +/* #define OPENSSL_ALL */ + +/* when you want to use pkcs7 */ +/* #define HAVE_PKCS7 */ + +/* when you want to use AES counter mode */ +/* #define WOLFSSL_AES_DIRECT */ +/* #define WOLFSSL_AES_COUNTER */ + +/* esp32-wroom-32se specific definition */ +#if defined(WOLFSSL_ESPWROOM32SE) + #define WOLFSSL_ATECC508A + #define HAVE_PK_CALLBACKS + /* when you want to use a custom slot allocation for ATECC608A */ + /* unless your configuration is unusual, you can use default */ + /* implementation. */ + /* #define CUSTOM_SLOT_ALLOCATION */ +#endif + +/* RSA primitive specific definition */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + /* Define USE_FAST_MATH and SMALL_STACK */ + #define ESP32_USE_RSA_PRIMITIVE + + #if defined(CONFIG_IDF_TARGET_ESP32) + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + + #endif +#endif + +/* #define WOLFSSL_ATECC508A_DEBUG */ + +/* date/time */ +/* if it cannot adjust time in the device, */ +/* enable macro below */ +/* #define NO_ASN_TIME */ +/* #define XTIME time */ + + +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ +#define ESP_RSA_TIMEOUT_CNT 0x249F00 + +#define HASH_SIZE_LIMIT /* for test.c */ + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + +/* Default is HW enabled unless turned off. +** Uncomment these lines to force SW instead of HW acceleration */ + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: https://www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + /* TODO: Revisit ESP8266 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ +#else + /* Anything else encountered, disable HW acceleration */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +#define DEBUG_WOLFSSL +/* Debug options: + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK +*/ + +#define WOLFSSL_ESPIDF_ERROR_PAUSE /* Pause in a loop rather than exit. */ +#define WOLFSSL_HW_METRICS +#define ALT_ECC_SIZE +/* #define HASH_SIZE_LIMIT */ /* for test.c */ + +/* #define NO_HW_MATH_TEST */ /* Optionally turn off HW math checks */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +#define WOLFSSL_PUBLIC_MP /* used by benchmark */ + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/* optional SM4 Ciphers. See https://github.com/wolfSSL/wolfsm +/* The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see https://www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * https://github.com/wolfSSL/wolfssl/pull/6825 + * https://github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +/* Conditional macros used in wolfSSL TLS client and server examples */ +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #include + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #if defined(USE_CERT_BUFFERS_2048) + #ifdef USE_CERT_BUFFERS_1024 + #error "USE_CERT_BUFFERS_1024 is already defined. Pick one." + #endif + #include + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #elif defined(USE_CERT_BUFFERS_1024) + #ifdef USE_CERT_BUFFERS_2048 + #error "USE_CERT_BUFFERS_2048 is already defined. Pick one." + #endif + #include + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_platformio.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_platformio.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_platformio.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_platformio.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,791 @@ +/* examples/configs/user_settings_platformio.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* This is a sample PlatformIO user_settings.h for wolfSSL + * + * Do not include any wolfssl headers here + * + * When editing this file: + * ensure wolfssl_test and wolfssl_benchmark settings match. + */ + + /* Define a macro to display user settings version in example code: */ +#define WOLFSSL_USER_SETTINGS_ID "PlatformIO user_settings.h v5.7.0-test.rev02" + +/* + * For other platforms see: + * https://github.com/wolfSSL/wolfssl/tree/master/examples/configs + */ + +#if defined(ESP_IDF_VERSION_MAJOR) || defined(WOLFSSL_ESPIDF) || \ + defined(ESP_PLATFORM) || defined(WOLFSSL_ESP32) + #include "sdkconfig.h" + /* The #include "protocol_examples_common.h" fails for PlatformIO, + * so disable the WiFi *not needed for test and benchmark examples. */ + #define NO_ESP_SDK_WIFI +#endif + + +/* We don't use WiFi, so don't compile in the esp-sdk-lib WiFi helpers: */ +/* #define USE_WOLFSSL_ESP_SDK_WIFI */ + +/* Experimental Kyber */ +#if 0 + /* Kyber typically needs a minimum 10K stack */ + #define WOLFSSL_EXPERIMENTAL_SETTINGS + #define WOLFSSL_HAVE_KYBER + #define WOLFSSL_WC_KYBER + #define WOLFSSL_SHA3 +#endif + +/* Used only by benchmark: */ +#define BENCH_EMBEDDED +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + + +#define HAVE_VERSION_EXTENDED_INFO +/* Due to limited build control, we'll ignore file warnings. */ +/* See github.com/arduino/arduino-cli/issues/631 */ +#undef WOLFSSL_IGNORE_FILE_WARN +#define WOLFSSL_IGNORE_FILE_WARN + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* TODO: known PlatformIO problem if SINGLE_THREADED is not enabled. */ +/* See https://github.com/wolfSSL/wolfssl/issues/7533 */ +#define SINGLE_THREADED + +/* SMALL_SESSION_CACHE saves a lot of RAM for ClientCache and SessionCache. + * Memory requirement is about 5KB, otherwise 20K is needed when not specified. + * If extra small footprint is needed, try MICRO_SESSION_CACHE (< 1K) + * When really desperate or no TLS used, try NO_SESSION_CACHE. */ +#define NO_SESSION_CACHE + +/* Small Stack uses more heap. */ +#define WOLFSSL_SMALL_STACK + +/* Full debugging turned off, but show malloc failure detail */ +/* #define DEBUG_WOLFSSL */ +#define DEBUG_WOLFSSL_MALLOC + +/* See test.c that sets cert buffers; we'll set them here: */ +#define USE_CERT_BUFFERS_256 +#define USE_CERT_BUFFERS_2048 + +/* RSA_LOW_MEM: Half as much memory but twice as slow. */ +#define RSA_LOW_MEM + +/* Uncommon settings for testing only */ +#define TEST_ESPIDF_ALL_WOLFSSL +#ifdef TEST_ESPIDF_ALL_WOLFSSL + #define WOLFSSL_MD2 + #define HAVE_BLAKE2 + #define HAVE_BLAKE2B + #define HAVE_BLAKE2S + + #define WC_RC2 + #define WOLFSSL_ALLOW_RC4 + + #define HAVE_POLY1305 + + #define WOLFSSL_AES_128 + #define WOLFSSL_AES_OFB + #define WOLFSSL_AES_CFB + #define WOLFSSL_AES_XTS + + #define WOLFSSL_WOLFSSH + + #define HAVE_AESGCM + #define WOLFSSL_AES_COUNTER + + #define HAVE_FFDHE + #define HAVE_FFDHE_2048 + #if defined(CONFIG_IDF_TARGET_ESP8266) + /* TODO Full size SRP is disabled on the ESP8266 at this time. + * Low memory issue? */ + #define WOLFCRYPT_HAVE_SRP + /* MIN_FFDHE_FP_MAX_BITS = (MIN_FFDHE_BITS * 2); see settings.h */ + #define FP_MAX_BITS MIN_FFDHE_FP_MAX_BITS + #elif defined(CONFIG_IDF_TARGET_ESP32) || \ + defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + /* SRP Known to be working on this target:*/ + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) + /* SRP Known to be working on this target:*/ + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #else + /* For everything else, give a try and see if SRP working: */ + #define WOLFCRYPT_HAVE_SRP + #define FP_MAX_BITS (8192 * 2) + #endif + + #define HAVE_DH + + /* TODO: there may be a problem with HAVE_CAMELLIA with HW AES disabled. + * Do not define NO_WOLFSSL_ESP32_CRYPT_AES when enabled: */ + /* #define HAVE_CAMELLIA */ + + /* DSA requires old SHA */ + #define HAVE_DSA + + /* Needs SHA512 ? */ + #define HAVE_HPKE + + /* Not for Espressif? */ + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) || \ + defined(CONFIG_IDF_TARGET_ESP8266) + + #if defined(CONFIG_IDF_TARGET_ESP8266) + #undef HAVE_ECC + #undef HAVE_ECC_CDH + #undef HAVE_CURVE25519 + + /* TODO does CHACHA also need alignment? Failing on ESP8266 + * See SHA256 __attribute__((aligned(4))); and WC_SHA256_ALIGN */ + #ifdef HAVE_CHACHA + #error "HAVE_CHACHA not supported on ESP8266" + #endif + #ifdef HAVE_XCHACHA + #error "HAVE_XCHACHA not supported on ESP8266" + #endif + #else + #define HAVE_XCHACHA + #define HAVE_CHACHA + /* TODO Not enabled at this time, needs further testing: + * #define WC_SRTP_KDF + * #define HAVE_COMP_KEY + * #define WOLFSSL_HAVE_XMSS + */ + #endif + /* TODO AES-EAX not working on this platform */ + + /* Optionally disable DH + * #undef HAVE_DH + * #undef HAVE_FFDHE + */ + + /* ECC_SHAMIR out of memory on ESP32-C2 during ECC */ + #ifndef HAVE_ECC + #define ECC_SHAMIR + #endif + #else + #define WOLFSSL_AES_EAX + + #define ECC_SHAMIR + #endif + + /* Only for WOLFSSL_IMX6_CAAM / WOLFSSL_QNX_CAAM ? */ + /* #define WOLFSSL_CAAM */ + /* #define WOLFSSL_CAAM_BLOB */ + + #define WOLFSSL_AES_SIV + #define WOLFSSL_CMAC + + #define WOLFSSL_CERT_PIV + + /* HAVE_SCRYPT may turn on HAVE_PBKDF2 see settings.h */ + /* #define HAVE_SCRYPT */ + #define SCRYPT_TEST_ALL + #define HAVE_X963_KDF +#endif + +/* optionally turn off SHA512/224 SHA512/256 */ +/* #define WOLFSSL_NOSHA512_224 */ +/* #define WOLFSSL_NOSHA512_256 */ + +/* when you want to use SINGLE THREAD. Note Default ESP-IDF is FreeRTOS */ +/* #define SINGLE_THREADED */ + +/* When you don't want to use the old SHA */ +/* #define NO_SHA */ +/* #define NO_OLD_TLS */ + +/* Cannot use WOLFSSL_NO_MALLOC with small stack */ +/* #define WOLFSSL_NO_MALLOC */ + +#define BENCH_EMBEDDED + +/* TLS 1.3 */ +#define WOLFSSL_TLS13 +#define HAVE_TLS_EXTENSIONS +#define WC_RSA_PSS +#define HAVE_HKDF +#define HAVE_AEAD +#define HAVE_SUPPORTED_CURVES + +#define WOLFSSL_BENCHMARK_FIXED_UNITS_KB + +#define NO_FILESYSTEM + +/* To further reduce size, client or server functionality can be disabled. + * Here, we check if the example code gave us a hint. + * + * The calling application can define either one of these macros before + * including the Arduino wolfssl.h library file: + * + * WOLFSSL_CLIENT_EXAMPLE + * WOLFSSL_SERVER_EXAMPLE + */ +#if defined(WOLFSSL_CLIENT_EXAMPLE) + #define NO_WOLFSSL_SERVER +#elif defined(WOLFSSL_SERVER_EXAMPLE) + #define NO_WOLFSSL_CLIENT +#else + /* Provide a hint to application that neither WOLFSSL_CLIENT_EXAMPLE + * or WOLFSSL_SERVER_EXAMPLE macro hint was desired but not found. */ + #define NO_WOLFSSL_SERVER_CLIENT_MISSING + /* Both can be disabled in wolfssl test & benchmark */ +#endif + +#define NO_OLD_TLS + +#define HAVE_AESGCM + +/* Optional RIPEMD: RACE Integrity Primitives Evaluation Message Digest */ +/* #define WOLFSSL_RIPEMD */ + +/* when you want to use SHA224 */ +#define WOLFSSL_SHA224 + +/* when you want to use SHA384 */ +#define WOLFSSL_SHA384 + +/* when you want to use SHA512 */ +#define WOLFSSL_SHA512 + +/* when you want to use SHA3 */ +#define WOLFSSL_SHA3 + + /* ED25519 requires SHA512 */ +#define HAVE_ED25519 + +/* Some features not enabled for ESP8266: */ +#if defined(CONFIG_IDF_TARGET_ESP8266) || \ + defined(CONFIG_IDF_TARGET_ESP32C2) + /* TODO determine low memory configuration for ECC. */ +#else + #define HAVE_ECC + #define HAVE_CURVE25519 + #define CURVE25519_SMALL +#endif + +#define HAVE_ED25519 + +/* Optional OPENSSL compatibility */ +#define OPENSSL_EXTRA + +/* #Optional HAVE_PKCS7 */ +#define HAVE_PKCS7 + +#if defined(HAVE_PKCS7) + /* HAVE_PKCS7 may enable HAVE_PBKDF2 see settings.h */ + #define NO_PBKDF2 + + #define HAVE_AES_KEYWRAP + #define HAVE_X963_KDF + #define WOLFSSL_AES_DIRECT +#endif + +/* when you want to use AES counter mode */ +/* #define WOLFSSL_AES_DIRECT */ +/* #define WOLFSSL_AES_COUNTER */ + +/* esp32-wroom-32se specific definition */ +#if defined(WOLFSSL_ESPWROOM32SE) + #define WOLFSSL_ATECC508A + #define HAVE_PK_CALLBACKS + /* when you want to use a custom slot allocation for ATECC608A */ + /* unless your configuration is unusual, you can use default */ + /* implementation. */ + /* #define CUSTOM_SLOT_ALLOCATION */ +#endif + +/* WC_NO_CACHE_RESISTANT: slower but more secure */ +/* #define WC_NO_CACHE_RESISTANT */ + +/* TFM_TIMING_RESISTANT: slower but more secure */ +/* #define TFM_TIMING_RESISTANT */ + +/* #define WOLFSSL_ATECC508A_DEBUG */ + +/* date/time */ +/* if it cannot adjust time in the device, */ +/* enable macro below */ +/* #define NO_ASN_TIME */ +/* #define XTIME time */ + + +/* adjust wait-timeout count if you see timeout in RSA HW acceleration */ +#define ESP_RSA_TIMEOUT_CNT 0x349F00 + +/* hash limit for test.c */ +#define HASH_SIZE_LIMIT + +/* USE_FAST_MATH is default */ +#define USE_FAST_MATH + +/***** Use SP_MATH *****/ +/* #undef USE_FAST_MATH */ +/* #define SP_MATH */ +/* #define WOLFSSL_SP_MATH_ALL */ +/* #define WOLFSSL_SP_RISCV32 */ + +/***** Use Integer Heap Math *****/ +/* #undef USE_FAST_MATH */ +/* #define USE_INTEGER_HEAP_MATH */ + + +#define WOLFSSL_SMALL_STACK + + +#define HAVE_VERSION_EXTENDED_INFO +/* #define HAVE_WC_INTROSPECTION */ + +#define HAVE_SESSION_TICKET + +/* #define HAVE_HASHDRBG */ + +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_EXT +#define WOLFSSL_SYS_CA_CERTS + + +#define WOLFSSL_CERT_TEXT + +#define WOLFSSL_ASN_TEMPLATE + +/* +#undef WOLFSSL_KEY_GEN +#undef WOLFSSL_CERT_REQ +#undef WOLFSSL_CERT_GEN +#undef WOLFSSL_CERT_EXT +#undef WOLFSSL_SYS_CA_CERTS +*/ + +/* command-line options +--enable-keygen +--enable-certgen +--enable-certreq +--enable-certext +--enable-asn-template +*/ + +/* Chipset detection from sdkconfig.h + * Default is HW enabled unless turned off. + * Uncomment lines to force SW instead of HW acceleration */ +#if defined(CONFIG_IDF_TARGET_ESP32) + /* Alternatively, if there's an ECC Secure Element present: */ + /* #define WOLFSSL_ESPWROOM32SE */ + + /* wolfSSL HW Acceleration supported on ESP32. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 /* no SHA224 HW on ESP32 */ + + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 /* TODO add compile-time warning */ + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + /* wolfSSL HW Acceleration supported on ESP32-S2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S2; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + /* wolfSSL HW Acceleration supported on ESP32-S3. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* Note: There's no AES192 HW on the ESP32-S3; falls back to SW */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * See: www.esp32.com/viewtopic.php?f=5&t=27926#:~:text=ESP8684%20is%20essentially%20ESP32%2DC2,both%20ESP32%2DC2%20and%20ESP8684. */ + + /* wolfSSL HW Acceleration supported on ESP32-C2. Uncomment to disable: */ + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C2 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C2 */ + + /* There's no AES or RSA/Math accelerator on the ESP32-C2 + * Auto defined with NO_WOLFSSL_ESP32_CRYPT_RSA_PRI, for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + /***** END CONFIG_IDF_TARGET_ESP32C2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* wolfSSL HW Acceleration supported on ESP32-C3. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ /* to disable all SHA HW */ + + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* wolfSSL HW Acceleration supported on ESP32-C6. Uncomment to disable: */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* These are defined automatically in esp32-crypt.h, here for clarity: */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 /* no SHA384 HW on C6 */ + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 /* no SHA512 HW on C6 */ + + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + /* wolfSSL Hardware Acceleration not yet implemented */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8266) + #define WOLFSSL_ESP8266 + + /* There's no hardware encryption on the ESP8266 */ + /* Consider using the ESP32-C2/C3/C6 + * See www.espressif.com/en/products/socs/esp32-c2 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP266 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* There's no Hardware Acceleration available on ESP8684 */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /***** END CONFIG_IDF_TARGET_ESP8684 *****/ + +#else + /* Anything else encountered, disable HW acceleration */ + #define NO_ESP32_CRYPT + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI +#endif /* CONFIG_IDF_TARGET Check */ + +/* RSA primitive specific definition, listed AFTER the Chipset detection */ +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + /* Consider USE_FAST_MATH and SMALL_STACK */ + + #ifndef NO_RSA + #define ESP32_USE_RSA_PRIMITIVE + + #if defined(CONFIG_IDF_TARGET_ESP32) + #ifdef CONFIG_ESP_MAIN_TASK_STACK_SIZE + #if CONFIG_ESP_MAIN_TASK_STACK_SIZE < 10500 + #warning "RSA may be difficult with less than 10KB Stack "/ + #endif + #endif + + /* NOTE HW unreliable for small values! */ + /* threshold for performance adjustment for HW primitive use */ + /* X bits of G^X mod P greater than */ + #undef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 32 + + /* X and Y of X * Y mod P greater than */ + #undef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 + #endif + #endif +#endif + +/* Debug options: +See wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h for details on debug options + +#define ESP_VERIFY_MEMBLOCK +#define DEBUG_WOLFSSL +#define DEBUG_WOLFSSL_VERBOSE +#define DEBUG_WOLFSSL_SHA_MUTEX +#define WOLFSSL_ESP32_CRYPT_DEBUG +#define WOLFSSL_ESP32_CRYPT_HASH_SHA224_DEBUG +#define NO_RECOVER_SOFTWARE_CALC +#define WOLFSSL_TEST_STRAY 1 +#define USE_ESP_DPORT_ACCESS_READ_BUFFER +#define WOLFSSL_ESP32_HW_LOCK_DEBUG +#define WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +#define ESP_DISABLE_HW_TASK_LOCK + +See wolfcrypt/benchmark/benchmark.c for debug and other settings: + +Turn on benchmark timing debugging (CPU Cycles, RTOS ticks, etc) +#define DEBUG_WOLFSSL_BENCHMARK_TIMING + +Turn on timer debugging (used when CPU cycles not available) +#define WOLFSSL_BENCHMARK_TIMER_DEBUG +*/ + +/* Pause in a loop rather than exit. */ +#define WOLFSSL_ESPIDF_ERROR_PAUSE + +#define WOLFSSL_HW_METRICS +#define ALT_ECC_SIZE + +/* for test.c: */ +/* #define HASH_SIZE_LIMIT */ + +/* Optionally turn off HW math checks */ +/* #define NO_HW_MATH_TEST */ + +/* Optionally include alternate HW test library: alt_hw_test.h */ +/* When enabling, the ./components/wolfssl/CMakeLists.txt file + * will need the name of the library in the idf_component_register + * for the PRIV_REQUIRES list. */ +/* #define INCLUDE_ALT_HW_TEST */ + +/* optionally turn off individual math HW acceleration features */ + +/* Turn off Large Number ESP32 HW Multiplication: +** [Z = X * Y] in esp_mp_mul() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* Turn off Large Number ESP32 HW Modular Exponentiation: +** [Z = X^Y mod M] in esp_mp_exptmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + +/* Turn off Large Number ESP32 HW Modular Multiplication +** [Z = X * Y mod M] in esp_mp_mulmod() */ +/* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + +/* used by benchmark: */ +#define WOLFSSL_PUBLIC_MP + +/* when turning on ECC508 / ECC608 support +#define WOLFSSL_ESPWROOM32SE +#define HAVE_PK_CALLBACKS +#define WOLFSSL_ATECC508A +#define ATCA_WOLFSSL +*/ + +/* optional SM4 Ciphers. See github.com/wolfSSL/wolfsm */ + +/***************************** Certificate Macros ***************************** + * + * The section below defines macros used in typically all of the wolfSSL + * examples such as the client and server for certs stored in header files. + * + * There are various certificate examples in this header file: + * https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * To use the sets of macros below, define *one* of these: + * + * USE_CERT_BUFFERS_1024 - ECC 1024 bit encoded ASN1 + * USE_CERT_BUFFERS_2048 - RSA 2048 bit encoded ASN1 + * WOLFSSL_SM[2,3,4] - SM Ciphers + * + * For example: define USE_CERT_BUFFERS_2048 to use CA Certs used in this + * wolfSSL function for the `ca_cert_der_2048` buffer, size and types: + * + * ret = wolfSSL_CTX_load_verify_buffer(ctx, + * CTX_CA_CERT, + * CTX_CA_CERT_SIZE, + * CTX_CA_CERT_TYPE); + * + * See www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_load_verify_buffer + * + * In this case the CTX_CA_CERT will be defined as `ca_cert_der_2048` as + * defined here: github.com/wolfSSL/wolfssl/blob/master/wolfssl/certs_test.h + * + * The CTX_CA_CERT_SIZE and CTX_CA_CERT_TYPE are similarly used to reference + * array size and cert type respectively. + * + * Similarly for loading the private client key: + * + * ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + * CTX_CLIENT_KEY, + * CTX_CLIENT_KEY_SIZE, + * CTX_CLIENT_KEY_TYPE); + * + * see www.wolfssl.com/documentation/manuals/wolfssl/group__CertsKeys.html#function-wolfssl_ctx_use_privatekey_buffer + * + * Similarly, the other macros are for server certificates and keys: + * `CTX_SERVER_CERT` and `CTX_SERVER_KEY` are available. + * + * The certificate and key names are typically `static const unsigned char` + * arrays. The [NAME]_size are typically `sizeof([array name])`, and the types + * are the known wolfSSL encoding type integers (e.g. WOLFSSL_FILETYPE_PEM). + * + * See `SSL_FILETYPE_[name]` in + * github.com/wolfSSL/wolfssl/blob/master/wolfssl/ssl.h + * + * See Abstract Syntax Notation One (ASN.1) in: + * github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/asn.h + * + * Optional SM4 Ciphers: + * + * Although the SM ciphers are shown here, the `certs_test_sm.h` may not yet + * be available. See: + * github.com/wolfSSL/wolfssl/pull/6825 + * github.com/wolfSSL/wolfsm + * + * Uncomment these 3 macros to enable the SM Ciphers and use the macros below. + */ + +/* +#define WOLFSSL_SM2 +#define WOLFSSL_SM3 +#define WOLFSSL_SM4 +*/ + +/* Conditional macros used in wolfSSL TLS client and server examples */ +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + #define CTX_CA_CERT root_sm2 + #define CTX_CA_CERT_SIZE sizeof_root_sm2 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_CERT server_sm2 + #define CTX_SERVER_CERT_SIZE sizeof_server_sm2 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_PEM + #define CTX_SERVER_KEY server_sm2_priv + #define CTX_SERVER_KEY_SIZE sizeof_server_sm2_priv + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_PEM + + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 +#else + #if defined(USE_CERT_BUFFERS_2048) + #ifdef USE_CERT_BUFFERS_1024 + #error "USE_CERT_BUFFERS_1024 is already defined. Pick one." + #endif + #include + #define CTX_CA_CERT ca_cert_der_2048 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_2048 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_2048 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_2048 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_2048 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_2048 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_2048 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_2048 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_2048 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_2048 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #elif defined(USE_CERT_BUFFERS_1024) + #ifdef USE_CERT_BUFFERS_2048 + #error "USE_CERT_BUFFERS_2048 is already defined. Pick one." + #endif + #define CTX_CA_CERT ca_cert_der_1024 + #define CTX_CA_CERT_SIZE sizeof_ca_cert_der_1024 + #define CTX_CA_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_CLIENT_CERT client_cert_der_1024 + #define CTX_CLIENT_CERT_SIZE sizeof_client_cert_der_1024 + #define CTX_CLIENT_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_CLIENT_KEY client_key_der_1024 + #define CTX_CLIENT_KEY_SIZE sizeof_client_key_der_1024 + #define CTX_CLIENT_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + + #define CTX_SERVER_CERT server_cert_der_1024 + #define CTX_SERVER_CERT_SIZE sizeof_server_cert_der_1024 + #define CTX_SERVER_CERT_TYPE WOLFSSL_FILETYPE_ASN1 + #define CTX_SERVER_KEY server_key_der_1024 + #define CTX_SERVER_KEY_SIZE sizeof_server_key_der_1024 + #define CTX_SERVER_KEY_TYPE WOLFSSL_FILETYPE_ASN1 + #else + /* Optionally define custom cert arrays, sizes, and types here */ + #error "Must define USE_CERT_BUFFERS_2048 or USE_CERT_BUFFERS_1024" + #endif +#endif /* Conditional key and cert constant names */ + +/****************************************************************************** +** Sanity Checks +******************************************************************************/ +#if defined(CONFIG_ESP_MAIN_TASK_STACK_SIZE) + #if defined(WOLFCRYPT_HAVE_SRP) + #if defined(FP_MAX_BITS) + #if FP_MAX_BITS < (8192 * 2) + #define ESP_SRP_MINIMUM_STACK_8K (24 * 1024) + #else + #define ESP_SRP_MINIMUM_STACK_8K (28 * 1024) + #endif + #else + #error "Please define FP_MAX_BITS when using WOLFCRYPT_HAVE_SRP." + #endif + + #if (CONFIG_ESP_MAIN_TASK_STACK_SIZE < ESP_SRP_MINIMUM_STACK) + #warning "WOLFCRYPT_HAVE_SRP enabled with small stack size" + #endif + #endif +#else + #warning "CONFIG_ESP_MAIN_TASK_STACK_SIZE not defined!" +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_stm32.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_stm32.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_stm32.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_stm32.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,5 @@ -/* wolfSSL_conf.h (example of generated wolfSSL.I-CUBE-wolfSSL_conf.h) +/* wolfSSL_conf.h (example of generated wolfSSL.I-CUBE-wolfSSL_conf.h using + * default_conf.ftl and STM32CubeIDE or STM32CubeMX tool) * * Copyright (C) 2006-2023 wolfSSL Inc. * @@ -23,12 +24,16 @@ * Generated automatically using `default_conf.ftl` template * * Included automatically when USE_HAL_DRIVER is defined - * (and not WOLFSSL_USER_SETTINGS or HAVE_CONF_H). + * (and not WOLFSSL_USER_SETTINGS or HAVE_CONFIG_H). */ #ifndef __WOLFSSL_I_CUBE_WOLFSSL_CONF_H__ #define __WOLFSSL_I_CUBE_WOLFSSL_CONF_H__ +#ifdef __cplusplus +extern "C" { +#endif + /*---------- WOLF_CONF_DEBUG -----------*/ #define WOLF_CONF_DEBUG 0 @@ -51,6 +56,9 @@ /*---------- WOLF_CONF_RTOS -----------*/ #define WOLF_CONF_RTOS 2 +/*---------- WOLF_CONF_RNG -----------*/ +#define WOLF_CONF_RNG 1 + /*---------- WOLF_CONF_RSA -----------*/ #define WOLF_CONF_RSA 1 @@ -111,17 +119,29 @@ /*---------- WOLF_CONF_TEST -----------*/ #define WOLF_CONF_TEST 1 +/*---------- WOLF_CONF_PQM4 -----------*/ +#define WOLF_CONF_PQM4 0 + /* ------------------------------------------------------------------------- */ /* Hardware platform */ /* ------------------------------------------------------------------------- */ +/* Setup default (No crypto hardware acceleration or TLS UART test). + * Use undef in platform section to enable it. + */ #define NO_STM32_HASH #define NO_STM32_CRYPTO +#define NO_TLS_UART_TEST #if defined(STM32WB55xx) #define WOLFSSL_STM32WB #define WOLFSSL_STM32_PKA #undef NO_STM32_CRYPTO #define HAL_CONSOLE_UART huart1 +#elif defined(STM32WL55xx) + #define WOLFSSL_STM32WL + #define WOLFSSL_STM32_PKA + #undef NO_STM32_CRYPTO + #define HAL_CONSOLE_UART huart2 #elif defined(STM32F407xx) #define WOLFSSL_STM32F4 #define HAL_CONSOLE_UART huart2 @@ -137,11 +157,20 @@ #undef NO_STM32_CRYPTO #define STM32_HAL_V2 #define HAL_CONSOLE_UART huart2 +#elif defined(STM32F756xx) + #define WOLFSSL_STM32F7 + #undef NO_STM32_HASH + #undef NO_STM32_CRYPTO + #define STM32_HAL_V2 + #define HAL_CONSOLE_UART huart3 #elif defined(STM32H753xx) #define WOLFSSL_STM32H7 #undef NO_STM32_HASH #undef NO_STM32_CRYPTO #define HAL_CONSOLE_UART huart3 +#elif defined(STM32H723xx) + #define WOLFSSL_STM32H7 + #define HAL_CONSOLE_UART huart3 #elif defined(STM32L4A6xx) #define WOLFSSL_STM32L4 #undef NO_STM32_HASH @@ -163,6 +192,9 @@ #elif defined(STM32F207xx) #define WOLFSSL_STM32F2 #define HAL_CONSOLE_UART huart3 +#elif defined(STM32F217xx) + #define WOLFSSL_STM32F2 + #define HAL_CONSOLE_UART huart2 #elif defined(STM32F107xC) #define WOLFSSL_STM32F1 #define HAL_CONSOLE_UART huart4 @@ -171,18 +203,34 @@ #define WOLFSSL_STM32F4 #define HAL_CONSOLE_UART huart2 #define NO_STM32_RNG - #define WOLFSSL_GENSEED_FORTEST + #define WOLFSSL_GENSEED_FORTEST /* no HW RNG is available use test seed */ #elif defined(STM32G071xx) #define WOLFSSL_STM32G0 #define HAL_CONSOLE_UART huart2 #define NO_STM32_RNG - #define WOLFSSL_GENSEED_FORTEST + #define WOLFSSL_GENSEED_FORTEST /* no HW RNG is available use test seed */ +#elif defined(STM32U575xx) || defined(STM32U585xx) + #define HAL_CONSOLE_UART huart1 + #define WOLFSSL_STM32U5 + #define STM32_HAL_V2 + #ifdef STM32U585xx + #undef NO_STM32_HASH + #undef NO_STM32_CRYPTO + #define WOLFSSL_STM32_PKA + #endif +#elif defined(STM32H563xx) + #define WOLFSSL_STM32H5 + #define HAL_CONSOLE_UART huart3 + #define STM32_HAL_V2 + #undef NO_STM32_HASH + #else #warning Please define a hardware platform! /* This means there is not a pre-defined platform for your board/CPU */ /* You need to define a CPU type, HW crypto and debug UART */ /* CPU Type: WOLFSSL_STM32F1, WOLFSSL_STM32F2, WOLFSSL_STM32F4, - WOLFSSL_STM32F7, WOLFSSL_STM32H7, WOLFSSL_STM32L4 and WOLFSSL_STM32L5 */ + WOLFSSL_STM32F7, WOLFSSL_STM32H7, WOLFSSL_STM32L4, WOLFSSL_STM32L5, + WOLFSSL_STM32G0, WOLFSSL_STM32WB and WOLFSSL_STM32U5 */ #define WOLFSSL_STM32F4 /* Debug UART used for printf */ @@ -195,6 +243,7 @@ //#define NO_STM32_RNG //#undef NO_STM32_HASH //#undef NO_STM32_CRYPTO + /* if no HW RNG is available use test seed */ //#define WOLFSSL_GENSEED_FORTEST //#define STM32_HAL_V2 #endif @@ -222,33 +271,60 @@ /* ------------------------------------------------------------------------- */ /* Math Configuration */ /* ------------------------------------------------------------------------- */ -/* 1=Fast, 2=Normal, 3=SP C, 4=SP Cortex-M */ -#if defined(WOLF_CONF_MATH) && WOLF_CONF_MATH != 2 - /* fast (stack) math */ +/* 1=Fast (stack) + * 2=Normal (heap) + * 3=Single Precision C (only common curves/key sizes) + * 4=Single Precision ASM Cortex-M3+ + * 5=Single Precision ASM Cortex-M0 (Generic Thumb) + * 6=Single Precision C all small + * 7=Single Precision C all big + */ +#if defined(WOLF_CONF_MATH) && WOLF_CONF_MATH == 1 + /* fast (stack) math - tfm.c */ #define USE_FAST_MATH #define TFM_TIMING_RESISTANT /* Optimizations (TFM_ARM, TFM_ASM or none) */ //#define TFM_NO_ASM //#define TFM_ASM -#endif -#if defined(WOLF_CONF_MATH) && (WOLF_CONF_MATH == 3 || WOLF_CONF_MATH == 4) +#elif defined(WOLF_CONF_MATH) && WOLF_CONF_MATH == 2 + /* heap math - integer.c */ + #define USE_INTEGER_HEAP_MATH +#elif defined(WOLF_CONF_MATH) && (WOLF_CONF_MATH >= 3) /* single precision only */ #define WOLFSSL_SP - #define WOLFSSL_SP_SMALL /* use smaller version of code */ - #define WOLFSSL_HAVE_SP_RSA - #define WOLFSSL_HAVE_SP_DH - #define WOLFSSL_HAVE_SP_ECC - #define WOLFSSL_SP_MATH + #if WOLF_CONF_MATH != 7 + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + #endif + #if defined(WOLF_CONF_RSA) && WOLF_CONF_RSA == 1 + #define WOLFSSL_HAVE_SP_RSA + #endif + #if defined(WOLF_CONF_DH) && WOLF_CONF_DH == 1 + #define WOLFSSL_HAVE_SP_DH + #endif + #if defined(WOLF_CONF_ECC) && WOLF_CONF_ECC == 1 + #define WOLFSSL_HAVE_SP_ECC + #endif + #if WOLF_CONF_MATH == 6 || WOLF_CONF_MATH == 7 + #define WOLFSSL_SP_MATH_ALL /* use sp_int.c multi precision math */ + #else + #define WOLFSSL_SP_MATH /* disable non-standard curves / key sizes */ + #endif #define SP_WORD_SIZE 32 + /* Enable to put all math on stack (no heap) */ //#define WOLFSSL_SP_NO_MALLOC - //#define WOLFSSL_SP_CACHE_RESISTANT - /* single precision Cortex-M only */ - #if WOLF_CONF_MATH == 4 + #if WOLF_CONF_MATH == 4 || WOLF_CONF_MATH == 5 #define WOLFSSL_SP_ASM /* required if using the ASM versions */ - #define WOLFSSL_SP_ARM_CORTEX_M_ASM + #if WOLF_CONF_MATH == 4 + /* ARM Cortex-M3+ */ + #define WOLFSSL_SP_ARM_CORTEX_M_ASM + #endif + #if WOLF_CONF_MATH == 5 + /* Generic ARM Thumb (Cortex-M0) Assembly */ + #define WOLFSSL_SP_ARM_THUMB_ASM + #endif #endif #endif @@ -280,8 +356,14 @@ #if defined(WOLF_CONF_BASE64_ENCODE) && WOLF_CONF_BASE64_ENCODE == 1 #define WOLFSSL_BASE64_ENCODE #endif -#if defined(WOLF_CONF_OPENSSL_EXTRA) && WOLF_CONF_OPENSSL_EXTRA == 1 +#if defined(WOLF_CONF_OPENSSL_EXTRA) && WOLF_CONF_OPENSSL_EXTRA >= 1 #define OPENSSL_EXTRA + #if !defined(INT_MAX) + #include + #endif +#endif +#if defined(WOLF_CONF_OPENSSL_EXTRA) && WOLF_CONF_OPENSSL_EXTRA >= 2 + #define OPENSSL_ALL #endif /* TLS Session Cache */ @@ -291,6 +373,14 @@ #define NO_SESSION_CACHE #endif +/* Post Quantum + * Note: PQM4 is compatible with STM32. The project can be found at: + * https://github.com/mupq/pqm4 + */ +#if defined(WOLF_CONF_PQM4) && WOLF_CONF_PQM4 == 1 + #define HAVE_PQM4 +#endif + /* ------------------------------------------------------------------------- */ /* Crypto */ /* ------------------------------------------------------------------------- */ @@ -520,7 +610,6 @@ /* Allows custom "custom_time()" function to be used for benchmark */ #define WOLFSSL_USER_CURRTIME - /* ------------------------------------------------------------------------- */ /* RNG */ /* ------------------------------------------------------------------------- */ @@ -533,7 +622,6 @@ #define WC_NO_RNG #endif - /* ------------------------------------------------------------------------- */ /* Disable Features */ /* ------------------------------------------------------------------------- */ @@ -576,7 +664,6 @@ #define NO_ASN_TIME #endif - #ifdef __cplusplus } #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_template.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_template.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_template.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_template.h 2024-08-03 07:30:00.000000000 +0000 @@ -52,8 +52,8 @@ /* reduce stack use. For variables over 100 bytes allocate from heap */ #define WOLFSSL_SMALL_STACK - /* disable the built-in socket support and use the IO callbacks. - * Set with wolfSSL_CTX_SetIORecv/wolfSSL_CTX_SetIOSend + /* Disable the built-in socket support and use the IO callbacks. + * Set IO callbacks with wolfSSL_CTX_SetIORecv/wolfSSL_CTX_SetIOSend */ #define WOLFSSL_USER_IO #endif @@ -61,17 +61,7 @@ /* ------------------------------------------------------------------------- */ /* Math Configuration */ /* ------------------------------------------------------------------------- */ -#undef USE_FAST_MATH -#if 1 - /* fast math (tfmc.) (stack based and timing resistant) */ - #define USE_FAST_MATH - #define TFM_TIMING_RESISTANT -#else - /* normal heap based integer.c (not timing resistant) */ -#endif - /* Wolf Single Precision Math */ -#undef WOLFSSL_SP #if 1 #define WOLFSSL_HAVE_SP_RSA #define WOLFSSL_HAVE_SP_DH @@ -79,8 +69,7 @@ //#define WOLFSSL_SP_4096 /* Enable RSA/RH 4096-bit support */ //#define WOLFSSL_SP_384 /* Enable ECC 384-bit SECP384R1 support */ - //#define WOLFSSL_SP_CACHE_RESISTANT - #define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */ + //#define WOLFSSL_SP_MATH /* only SP math - disables integer.c/tfm.c */ #define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */ //#define WOLFSSL_SP_NO_MALLOC @@ -99,8 +88,16 @@ //#define WOLFSSL_SP_ARM64_ASM //#define WOLFSSL_SP_ARM_THUMB_ASM //#define WOLFSSL_SP_ARM_CORTEX_M_ASM +#elif 1 + /* Fast Math (tfm.c) (stack based and timing resistant) */ + #define USE_FAST_MATH + #define TFM_TIMING_RESISTANT +#else + /* Normal (integer.c) (heap based, not timing resistant) - not recommended*/ + #define USE_INTEGER_HEAP_MATH #endif + /* ------------------------------------------------------------------------- */ /* Crypto */ /* ------------------------------------------------------------------------- */ @@ -184,7 +181,7 @@ /* use heap allocation for ECC points */ #define ALT_ECC_SIZE - /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overriden */ + /* wolfSSL will compute the FP_MAX_BITS_ECC, but it can be overridden */ //#define FP_MAX_BITS_ECC (256 * 2) #endif @@ -508,6 +505,9 @@ //#define NO_CRYPT_BENCHMARK //#define WOLFCRYPT_ONLY +/* do not warm when file is included to be built and not required to be */ +#define WOLFSSL_IGNORE_FILE_WARN + /* In-lining of misc.c functions */ /* If defined, must include wolfcrypt/src/misc.c in build */ /* Slower, but about 1k smaller */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_tls12.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_tls12.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_tls12.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_tls12.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,158 @@ +/* user_settings_tls12.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Example for TLS v1.2 client only, ECC only, AES GCM only, SHA2-256 only */ +/* Derived using: + * ./configure --disable-rsa --disable-dh --disable-tls13 --disable-chacha \ + * --disable-poly1305 --disable-sha224 --disable-sha --disable-md5 + * From generated wolfssl/options.h + * Build and Test using: + * ./configure --enable-usersettings --disable-examples + * make + * ./wolfcrypt/test/testwolfcrypt + */ + +#ifndef WOLFSSL_USER_SETTINGS_H +#define WOLFSSL_USER_SETTINGS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +/* Use the SetIO callbacks, not the internal wolfio.c socket code */ +#define WOLFSSL_USER_IO +#define WOLFSSL_IGNORE_FILE_WARN /* ignore file includes not required */ +//#define WOLFSSL_SMALL_STACK /* option to reduce stack size, offload to heap */ +#define NO_FILESYSTEM +#define NO_WRITEV +#define NO_SIG_WRAPPER + +/* ------------------------------------------------------------------------- */ +/* Math */ +/* ------------------------------------------------------------------------- */ +/* Math Options */ +#if 1 /* Single-precision (SP) wolf math - ECC only */ + #define WOLFSSL_HAVE_SP_ECC /* use sp_c32.c for math */ + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + #define WOLFSSL_SP_MATH /* only SP math - eliminates fast math code */ + /* optional Cortex-M3+ speedup with inline assembly */ + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM +#elif 1 + /* Multi-precision wolf math */ + #define WOLFSSL_SP_MATH_ALL /* use sp_int.c generic math */ + #define WOLFSSL_SP_SMALL /* use smaller version of code */ +#else + /* Fast Math - tfm.c */ + #define USE_FAST_MATH + #define TFM_TIMING_RESISTANT + #define WOLFSSL_NO_ASM +#endif + +/* ------------------------------------------------------------------------- */ +/* TLS */ +/* ------------------------------------------------------------------------- */ +/* Enable TLS v1.2 (on by default) */ +#undef WOLFSSL_NO_TLS12 +/* Disable TLS server code */ +#define NO_WOLFSSL_SERVER +//#define NO_WOLFSSL_CLIENT +/* Disable TLS v1.3 code */ +#undef WOLFSSL_TLS13 +/* Disable older TLS version prior to 1.2 */ +#define NO_OLD_TLS + +/* Enable default TLS extensions */ +#define HAVE_TLS_EXTENSIONS +#define HAVE_SUPPORTED_CURVES +#define HAVE_EXTENDED_MASTER +#define HAVE_ENCRYPT_THEN_MAC +#define HAVE_SERVER_RENEGOTIATION_INFO +//#define HAVE_SNI /* optional Server Name Indicator (SNI) */ + +/* ASN */ +#define WOLFSSL_ASN_TEMPLATE /* use newer ASN template asn.c code (default) */ + +/* Disable Features */ +#define NO_SESSION_CACHE /* disable session resumption */ +#define NO_PSK /* pre-shared-key support */ + +/* ------------------------------------------------------------------------- */ +/* Algorithms */ +/* ------------------------------------------------------------------------- */ +/* RNG */ +#define HAVE_HASHDRBG /* Use DRBG SHA2-256 and seed */ + +/* Enable ECC */ +#define HAVE_ECC +#define ECC_USER_CURVES /* Enable only ECC curves specific */ +#undef NO_ECC256 /* Enable SECP256R1 only (on by default) */ +#define ECC_TIMING_RESISTANT /* Enable Timing Resistance */ +/* Optional ECC calculation speed improvement if not using SP implementation */ +//#define ECC_SHAMIR + +/* Enable SHA2-256 only (on by default) */ +#undef NO_SHA256 +//#define USE_SLOW_SHA256 /* Reduces code size by not partially unrolling */ + +/* Enable AES GCM only */ +#define HAVE_AESGCM +#define GCM_SMALL /* use small GHASH table */ +#define NO_AES_CBC /* Disable AES CBC */ + +/* Optional Features */ +//#define WOLFSSL_BASE64_ENCODE /* Enable Base64 encoding */ + + +/* Disable Algorithms */ +#define NO_RSA +#define NO_DH +#define NO_SHA +#define NO_DSA +#define NO_RC4 +#define NO_MD4 +#define NO_MD5 +#define NO_DES3 +#define NO_PWDBASED +#define WOLFSSL_NO_SHAKE128 +#define WOLFSSL_NO_SHAKE256 + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ +#undef DEBUG_WOLFSSL +#undef NO_ERROR_STRINGS +#if 0 + #define DEBUG_WOLFSSL +#else + #if 1 + #define NO_ERROR_STRINGS + #endif +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* WOLFSSL_USER_SETTINGS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfboot_keytools.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfboot_keytools.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfboot_keytools.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfboot_keytools.h 2024-08-03 07:30:00.000000000 +0000 @@ -86,7 +86,7 @@ #define NO_RABBIT #define NO_MD5 #define NO_SIG_WRAPPER -#define NO_CERT +#define NO_CERTS #define NO_SESSION_CACHE #define NO_HC128 #define NO_DES3 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfssh.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfssh.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfssh.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolfssh.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,214 @@ +/* user_settings_wolfssh.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +/* To use the rename file to user_settings.h and define WOLFSSL_USER_SETTINGS */ + +/* Started from the following configure and hand tuned, organized and commented: +./configure --enable-wolfssh --enable-sp=small --enable-sp-math \ +--disable-sp-asm --disable-asm --disable-sys-ca-certs --enable-aesgcm=small \ +--enable-cryptonly --disable-sha3 --disable-chacha --disable-poly1305 \ +--disable-md5 --disable-error-queue-per-thread --disable-pkcs12 \ +--disable-errorstrings --disable-sni --disable-sha224 +make +*/ + +/* Tested using: +cp ./examples/configs/user_settings_wolfssh.h user_settings.h +cp ./examples/configs/user_settings_wolfssh.h ../wolfSSH/user_settings.h + +wolfSSL: +./configure --enable-usersettings --disable-examples CFLAGS="-Os" +make +sudo make install + +wolfSSH: +./configure --enable-scp --disable-shared --disable-term \ + CFLAGS="-DWOLFSSL_USER_SETTINGS -Os" +make +*/ + +#ifndef WOLFSSL_USER_SETTINGS_SSH_H +#define WOLFSSL_USER_SETTINGS_SSH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* #define USE_LOW_RESOURCE */ + +/* Platform */ +#ifdef USE_LOW_RESOURCE + /* Threading and filesystem required for wolfSSH tests \ + * Can be set for wolfSSH library only use */ + #define SINGLE_THREADED + #define NO_FILESYSTEM + #define BENCH_EMBEDDED +#endif + +/* Features */ +#define WOLFSSL_WOLFSSH +#if 1 + #define WOLFCRYPT_ONLY /* no TLS */ +#endif +#define HAVE_HASHDRBG +#define WOLFSSL_ASN_TEMPLATE +#define WOLFSSL_PUBLIC_MP +#ifndef USE_LOW_RESOURCE + #define WOLFSSL_BASE64_ENCODE +#endif + +#ifndef WOLFCRYPT_ONLY + #define HAVE_TLS_EXTENSIONS + #define HAVE_SUPPORTED_CURVES + #define HAVE_ENCRYPT_THEN_MAC +#endif + +/* Timing Resistance */ +#define TFM_TIMING_RESISTANT +#define ECC_TIMING_RESISTANT +#define WC_RSA_BLINDING + +/* Asymmetric */ +#if 1 /* RSA - PKCS1v1.5 */ + #undef NO_RSA + #define WC_NO_RSA_OAEP /* SSH does not use OAEP */ + + #ifdef USE_LOW_RESOURCE + #define RSA_LOW_MEM + #endif +#else + #define NO_RSA +#endif + +#if 1 /* DH */ + /* RFC 4253 requires "DH w/SHA-1" + * RFC 9142 requires "diffie-hellman-group14-sha256" + */ + #undef NO_DH + #ifndef WOLFCRYPT_ONLY + #define HAVE_DH_DEFAULT_PARAMS + #define HAVE_FFDHE_2048 + #endif +#else + #define NO_DH +#endif +#if 1 /* ECC */ + #define HAVE_ECC + #ifndef USE_LOW_RESOURCE /* optional ECC SHAMIR speedup */ + #define ECC_SHAMIR + #endif + #define ECC_USER_CURVES + #ifndef USE_LOW_RESOURCE + #define HAVE_ECC384 + #define HAVE_ECC521 + #endif +#endif + +/* Symmetric AES CBC/GCM */ +#undef NO_AES_CBC +#if 1 /* GCM */ + #define HAVE_AESGCM + #define GCM_SMALL +#endif +#ifdef USE_LOW_RESOURCE + #define WOLFSSL_AES_SMALL_TABLES +#endif + +/* Hashing SHA-1/SHA2-256 */ +#undef NO_SHA +#undef NO_SHA256 +#ifdef USE_LOW_RESOURCE + #define USE_SLOW_SHA + #define USE_SLOW_SHA256 +#endif +#if 0 + #define WOLFSSL_SHA384 + #define WOLFSSL_SHA512 + #ifdef USE_LOW_RESOURCE + #define USE_SLOW_SHA512 + #endif +#endif + + +/* Math */ +/* Multi Precision (MP): Enable support for uncommon key sizes / curves */ +#if 0 + #define WOLFSSL_SP_MATH_ALL +#endif + +/* Single Precision (SP) Math */ +#define WOLFSSL_SP_MATH +#define WOLFSSL_SP_SMALL + +#if !defined(NO_RSA) || !defined(NO_DH) + #undef WOLFSSL_SP_NO_2048 /* 2048-bit */ + #ifdef USE_LOW_RESOURCE + #define WOLFSSL_SP_NO_3072 /* 3072-bit */ + #else + #undef WOLFSSL_SP_NO_3072 /* 3072-bit */ + #define WOLFSSL_SP_4096 /* 4096-bit */ + #endif + + #ifndef NO_RSA + #define WOLFSSL_HAVE_SP_RSA + #endif + #ifndef NO_DH + #define WOLFSSL_HAVE_SP_DH + #endif +#endif +#ifdef HAVE_ECC + #define WOLFSSL_HAVE_SP_ECC + + #undef WOLFSSL_SP_NO_256 /* 256-bit */ + #ifdef HAVE_ECC384 + #define WOLFSSL_SP_384 /* 384-bit */ + #endif + #ifdef HAVE_ECC521 + #define WOLFSSL_SP_521 /* 521-bit */ + #endif +#endif + +/* Disable Algorithms */ +#define NO_DSA +#define NO_DES3 +#define NO_MD4 +#define NO_MD5 +#define NO_RC4 +#define NO_PSK +#define NO_PKCS12 +#define NO_PWDBASED +#define WOLFSSL_NO_SHAKE128 +#define WOLFSSL_NO_SHAKE256 + +/* Disable Features */ +#define NO_ERROR_STRINGS +#define WC_NO_ASYNC_THREADING +#define NO_DES3_TLS_SUITES +#define NO_OLD_TLS +#define WOLFSSL_NO_TLS12 + +#ifdef __cplusplus +} +#endif + + +#endif /* WOLFSSL_USER_SETTINGS_SSH_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_wolftpm.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolftpm.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/configs/user_settings_wolftpm.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/configs/user_settings_wolftpm.h 2024-08-03 07:30:00.000000000 +0000 @@ -131,7 +131,7 @@ #else #define NO_RSA #endif -#ifndef USE_LOW_RESOURCE /* ECC */ +#if 1 /* ECC - needed for encrypt ECC salt */ #define HAVE_ECC #define ECC_USER_CURVES /* default to only SECP256R1 */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoclient/echoclient.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoclient/echoclient.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.c 2024-08-03 07:30:00.000000000 +0000 @@ -24,14 +24,14 @@ #include #endif -#include +#include /* let's use cyassl layer AND cyassl openssl layer */ #undef TEST_OPENSSL_COEXIST /* can't use this option with this example */ -#include +#include /* Force enable the compatibility macros for this example */ -#ifdef CYASSL_DTLS - #include +#ifdef WOLFSSL_DTLS + #include #endif #if defined(WOLFSSL_MDK_ARM) || defined(WOLFSSL_KEIL_TCP_NET) @@ -43,12 +43,12 @@ #include "wolfssl_MDK_ARM.h" #endif -#include +#include #ifndef OPENSSL_EXTRA_X509_SMALL #define OPENSSL_EXTRA_X509_SMALL #endif -#include +#include #include @@ -97,7 +97,7 @@ char** argv = 0; #endif word16 port; - char buffer[CYASSL_MAX_ERROR_SZ]; + char buffer[WOLFSSL_MAX_ERROR_SZ]; ((func_args*)args)->return_code = -1; /* error state */ @@ -118,11 +118,11 @@ if (!fin) err_sys("can't open input file"); if (!fout) err_sys("can't open output file"); -#ifdef CYASSL_DTLS +#ifdef WOLFSSL_DTLS doDTLS = 1; #endif -#ifdef CYASSL_LEANPSK +#ifdef WOLFSSL_LEANPSK doPSK = 1; #endif #if defined(NO_RSA) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \ @@ -134,10 +134,10 @@ #if defined(NO_MAIN_DRIVER) && !defined(USE_WINDOWS_API) && !defined(WOLFSSL_MDK_SHELL) port = ((func_args*)args)->signal->port; #else - port = yasslPort; + port = wolfSSLPort; #endif -#if defined(CYASSL_DTLS) +#if defined(WOLFSSL_DTLS) #ifdef WOLFSSL_DTLS13 method = wolfDTLSv1_3_client_method(); #elif !defined(WOLFSSL_NO_TLS12) @@ -145,9 +145,9 @@ #endif #elif !defined(NO_TLS) #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SNIFFER) - method = CyaTLSv1_2_client_method(); + method = wolfTLSv1_2_client_method(); #else - method = CyaSSLv23_client_method(); + method = wolfSSLv23_client_method(); #endif #elif defined(WOLFSSL_ALLOW_SSLV3) method = SSLv3_client_method(); @@ -178,7 +178,7 @@ err_sys("can't load ca buffer"); #endif -#if defined(CYASSL_SNIFFER) +#if defined(WOLFSSL_SNIFFER) /* Only set if not running testsuite */ if (XSTRSTR(argv[0], "testsuite") == NULL) { /* don't use EDH, can't sniff tmp keys */ @@ -189,7 +189,7 @@ if (doPSK) { const char *defaultCipherList; - CyaSSL_CTX_set_psk_client_callback(ctx, my_psk_client_cb); + wolfSSL_CTX_set_psk_client_callback(ctx, my_psk_client_cb); #ifdef HAVE_NULL_CIPHER defaultCipherList = "PSK-NULL-SHA256"; #elif defined(HAVE_AESGCM) && !defined(NO_DH) @@ -211,7 +211,7 @@ #else defaultCipherList = "PSK-AES128-CBC-SHA256"; #endif - if (CyaSSL_CTX_set_cipher_list(ctx,defaultCipherList) !=WOLFSSL_SUCCESS) + if (wolfSSL_CTX_set_cipher_list(ctx,defaultCipherList) !=WOLFSSL_SUCCESS) err_sys("client can't set cipher list 2"); wolfSSL_CTX_set_psk_callback_ctx(ctx, (void*)defaultCipherList); } @@ -222,7 +222,7 @@ #endif #if defined(WOLFSSL_MDK_ARM) - CyaSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, 0); + wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, 0); #endif #ifdef WOLFSSL_ASYNC_CRYPT @@ -234,10 +234,10 @@ #endif /* WOLFSSL_ASYNC_CRYPT */ ssl = SSL_new(ctx); - tcp_connect(&sockfd, yasslIP, port, doDTLS, 0, ssl); + tcp_connect(&sockfd, wolfSSLIP, port, doDTLS, 0, ssl); SSL_set_fd(ssl, sockfd); -#if defined(USE_WINDOWS_API) && defined(CYASSL_DTLS) && defined(NO_MAIN_DRIVER) +#if defined(USE_WINDOWS_API) && defined(WOLFSSL_DTLS) && defined(NO_MAIN_DRIVER) /* let echoserver bind first, TODO: add Windows signal like pthreads does */ Sleep(100); #endif @@ -257,7 +257,7 @@ } while (err == WC_PENDING_E); if (ret != WOLFSSL_SUCCESS) { fprintf(stderr, "SSL_connect error %d, %s\n", err, - ERR_error_string(err, buffer)); + ERR_error_string((unsigned long)err, buffer)); err_sys("SSL_connect failed"); } @@ -280,7 +280,7 @@ } while (err == WC_PENDING_E); if (ret != sendSz) { fprintf(stderr, "SSL_write msg error %d, %s\n", err, - ERR_error_string(err, buffer)); + ERR_error_string((unsigned long)err, buffer)); err_sys("SSL_write failed"); } @@ -319,7 +319,7 @@ LIBCALL_CHECK_RET(fflush(fout)); sendSz -= ret; } -#ifdef CYASSL_DTLS +#ifdef WOLFSSL_DTLS else if (wolfSSL_dtls(ssl) && err == DECRYPT_ERROR) { /* This condition is OK. The packet should be dropped * silently when there is a decrypt or MAC error on @@ -329,14 +329,14 @@ #endif else { fprintf(stderr, "SSL_read msg error %d, %s\n", err, - ERR_error_string(err, buffer)); + ERR_error_string((unsigned long)err, buffer)); err_sys("SSL_read failed"); } } } -#ifdef CYASSL_DTLS +#ifdef WOLFSSL_DTLS strncpy(msg, "break", 6); sendSz = (int)strlen(msg); /* try to tell server done */ @@ -394,18 +394,18 @@ args.argv = argv; args.return_code = 0; - CyaSSL_Init(); -#if defined(DEBUG_CYASSL) && !defined(WOLFSSL_MDK_SHELL) - CyaSSL_Debugging_ON(); + wolfSSL_Init(); +#if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_MDK_SHELL) + wolfSSL_Debugging_ON(); #endif -#ifndef CYASSL_TIRTOS +#ifndef WOLFSSL_TIRTOS ChangeToWolfRoot(); #endif #ifndef NO_WOLFSSL_CLIENT echoclient_test(&args); #endif - CyaSSL_Cleanup(); + wolfSSL_Cleanup(); #ifdef HAVE_WNR if (wc_FreeNetRandom() < 0) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcproj 2024-08-03 07:30:00.000000000 +0000 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -117,7 +117,7 @@ Optimization="2" EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoclient/echoclient.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -159,7 +159,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -179,7 +179,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -200,7 +200,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -218,7 +218,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -237,7 +237,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -259,7 +259,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -281,7 +281,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -302,7 +302,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoserver/echoserver.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoserver/echoserver.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.c 2024-08-03 07:30:00.000000000 +0000 @@ -24,10 +24,10 @@ #include #endif -#include /* name change portability layer */ -#include +#include /* name change portability layer */ +#include #ifdef HAVE_ECC - #include /* ecc_fp_free */ + #include /* ecc_fp_free */ #endif #if defined(WOLFSSL_MDK_ARM) || defined(WOLFSSL_KEIL_TCP_NET) @@ -39,8 +39,8 @@ #include "wolfssl_MDK_ARM.h" #endif -#include -#include +#include +#include #ifndef NO_MAIN_DRIVER #define ECHO_OUT @@ -67,26 +67,26 @@ static void SignalReady(void* args, word16 port) { -#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && !defined(__MINGW32__) +#if defined(NO_MAIN_DRIVER) && defined(WOLFSSL_COND) /* signal ready to tcp_accept */ func_args* server_args = (func_args*)args; tcp_ready* ready = server_args->signal; - PTHREAD_CHECK_RET(pthread_mutex_lock(&ready->mutex)); + THREAD_CHECK_RET(wolfSSL_CondStart(&ready->cond)); ready->ready = 1; ready->port = port; - PTHREAD_CHECK_RET(pthread_cond_signal(&ready->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&ready->mutex)); -#endif + THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&ready->cond)); +#endif /* NO_MAIN_DRIVER && WOLFSSL_COND */ (void)args; (void)port; } -THREAD_RETURN CYASSL_THREAD echoserver_test(void* args) +THREAD_RETURN WOLFSSL_THREAD echoserver_test(void* args) { SOCKET_T sockfd = 0; - CYASSL_METHOD* method = 0; - CYASSL_CTX* ctx = 0; + WOLFSSL_METHOD* method = 0; + WOLFSSL_CTX* ctx = 0; int ret = 0; int doDTLS = 0; @@ -97,7 +97,7 @@ word16 port; int argc = ((func_args*)args)->argc; char** argv = ((func_args*)args)->argv; - char buffer[CYASSL_MAX_ERROR_SZ]; + char buffer[WOLFSSL_MAX_ERROR_SZ]; #ifdef HAVE_TEST_SESSION_TICKET MyTicketCtx myTicketCtx; #endif @@ -116,19 +116,19 @@ ((func_args*)args)->return_code = -1; /* error state */ -#ifdef CYASSL_DTLS +#ifdef WOLFSSL_DTLS doDTLS = 1; #endif #if (defined(NO_RSA) && !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \ - !defined(HAVE_ED448)) || defined(CYASSL_LEANPSK) + !defined(HAVE_ED448)) || defined(WOLFSSL_LEANPSK) doPSK = 1; #else doPSK = 0; #endif -#if defined(NO_MAIN_DRIVER) && !defined(CYASSL_SNIFFER) && \ - !defined(WOLFSSL_MDK_SHELL) && !defined(CYASSL_TIRTOS) && \ +#if defined(NO_MAIN_DRIVER) && !defined(WOLFSSL_SNIFFER) && \ + !defined(WOLFSSL_MDK_SHELL) && !defined(WOLFSSL_TIRTOS) && \ !defined(USE_WINDOWS_API) /* Let tcp_listen assign port */ port = 0; @@ -141,34 +141,34 @@ useAnyAddr = 1; #endif -#ifdef CYASSL_TIRTOS +#ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); #endif tcp_listen(&sockfd, &port, useAnyAddr, doDTLS, 0); -#if defined(CYASSL_DTLS) +#if defined(WOLFSSL_DTLS) #ifdef WOLFSSL_DTLS13 method = wolfDTLSv1_3_server_method(); #elif !defined(WOLFSSL_NO_TLS12) - method = CyaDTLSv1_2_server_method(); + method = wolfDTLSv1_2_server_method(); #endif #elif !defined(NO_TLS) #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_SNIFFER) - method = CyaTLSv1_2_server_method(); + method = wolfTLSv1_2_server_method(); #else - method = CyaSSLv23_server_method(); + method = wolfSSLv23_server_method(); #endif #elif defined(WOLFSSL_ALLOW_SSLV3) - method = CyaSSLv3_server_method(); + method = wolfSSLv3_server_method(); #else #error "no valid server method built in" #endif - ctx = CyaSSL_CTX_new(method); - /* CyaSSL_CTX_set_session_cache_mode(ctx, WOLFSSL_SESS_CACHE_OFF); */ + ctx = wolfSSL_CTX_new(method); + /* wolfSSL_CTX_set_session_cache_mode(ctx, WOLFSSL_SESS_CACHE_OFF); */ #ifdef WOLFSSL_ENCRYPTED_KEYS - CyaSSL_CTX_set_default_passwd_cb(ctx, PasswordCallBack); + wolfSSL_CTX_set_default_passwd_cb(ctx, PasswordCallBack); #endif #ifdef HAVE_TEST_SESSION_TICKET @@ -181,36 +181,36 @@ #ifndef NO_FILESYSTEM if (doPSK == 0) { - #if defined(HAVE_ECC) && !defined(CYASSL_SNIFFER) + #if defined(HAVE_ECC) && !defined(WOLFSSL_SNIFFER) /* ecc */ - if (CyaSSL_CTX_use_certificate_file(ctx, eccCertFile, WOLFSSL_FILETYPE_PEM) + if (wolfSSL_CTX_use_certificate_file(ctx, eccCertFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) err_sys("can't load server cert file, " "Please run from wolfSSL home dir"); - if (CyaSSL_CTX_use_PrivateKey_file(ctx, eccKeyFile, WOLFSSL_FILETYPE_PEM) + if (wolfSSL_CTX_use_PrivateKey_file(ctx, eccKeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) err_sys("can't load server key file, " "Please run from wolfSSL home dir"); - #elif defined(HAVE_ED25519) && !defined(CYASSL_SNIFFER) + #elif defined(HAVE_ED25519) && !defined(WOLFSSL_SNIFFER) /* ed25519 */ - if (CyaSSL_CTX_use_certificate_chain_file(ctx, edCertFile) + if (wolfSSL_CTX_use_certificate_chain_file(ctx, edCertFile) != WOLFSSL_SUCCESS) err_sys("can't load server cert file, " "Please run from wolfSSL home dir"); - if (CyaSSL_CTX_use_PrivateKey_file(ctx, edKeyFile, WOLFSSL_FILETYPE_PEM) + if (wolfSSL_CTX_use_PrivateKey_file(ctx, edKeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) err_sys("can't load server key file, " "Please run from wolfSSL home dir"); - #elif defined(HAVE_ED448) && !defined(CYASSL_SNIFFER) + #elif defined(HAVE_ED448) && !defined(WOLFSSL_SNIFFER) /* ed448 */ - if (CyaSSL_CTX_use_certificate_chain_file(ctx, ed448CertFile) + if (wolfSSL_CTX_use_certificate_chain_file(ctx, ed448CertFile) != WOLFSSL_SUCCESS) err_sys("can't load server cert file, " "Please run from wolfSSL home dir"); - if (CyaSSL_CTX_use_PrivateKey_file(ctx, ed448KeyFile, + if (wolfSSL_CTX_use_PrivateKey_file(ctx, ed448KeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) err_sys("can't load server key file, " "Please run from wolfSSL home dir"); @@ -218,12 +218,12 @@ /* do nothing, just don't load cert files */ #else /* normal */ - if (CyaSSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM) + if (wolfSSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) err_sys("can't load server cert file, " "Please run from wolfSSL home dir"); - if (CyaSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, WOLFSSL_FILETYPE_PEM) + if (wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) err_sys("can't load server key file, " "Please run from wolfSSL home dir"); @@ -231,23 +231,23 @@ } /* doPSK */ #elif !defined(NO_CERTS) if (!doPSK) { - if (CyaSSL_CTX_use_certificate_buffer(ctx, server_cert_der_2048, + if (wolfSSL_CTX_use_certificate_buffer(ctx, server_cert_der_2048, sizeof_server_cert_der_2048, WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) err_sys("can't load server cert buffer"); - if (CyaSSL_CTX_use_PrivateKey_buffer(ctx, server_key_der_2048, + if (wolfSSL_CTX_use_PrivateKey_buffer(ctx, server_key_der_2048, sizeof_server_key_der_2048, WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) err_sys("can't load server key buffer"); } #endif -#if defined(CYASSL_SNIFFER) +#if defined(WOLFSSL_SNIFFER) /* Only set if not running testsuite */ if (XSTRSTR(argv[0], "testsuite") == NULL) { /* don't use EDH, can't sniff tmp keys */ - CyaSSL_CTX_set_cipher_list(ctx, "AES256-SHA"); + wolfSSL_CTX_set_cipher_list(ctx, "AES256-SHA"); } #endif @@ -255,8 +255,8 @@ #ifndef NO_PSK const char *defaultCipherList; - CyaSSL_CTX_set_psk_server_callback(ctx, my_psk_server_cb); - CyaSSL_CTX_use_psk_identity_hint(ctx, "cyassl server"); + wolfSSL_CTX_set_psk_server_callback(ctx, my_psk_server_cb); + wolfSSL_CTX_use_psk_identity_hint(ctx, "cyassl server"); #ifdef HAVE_NULL_CIPHER defaultCipherList = "PSK-NULL-SHA256"; #elif defined(HAVE_AESGCM) && !defined(NO_DH) @@ -278,7 +278,7 @@ #else defaultCipherList = "PSK-AES128-CBC-SHA256"; #endif - if (CyaSSL_CTX_set_cipher_list(ctx, defaultCipherList) != WOLFSSL_SUCCESS) + if (wolfSSL_CTX_set_cipher_list(ctx, defaultCipherList) != WOLFSSL_SUCCESS) err_sys("server can't set cipher list 2"); wolfSSL_CTX_set_psk_callback_ctx(ctx, (void*)defaultCipherList); #endif @@ -295,8 +295,8 @@ SignalReady(args, port); while (!shutDown) { - CYASSL* ssl = NULL; - CYASSL* write_ssl = NULL; /* may have separate w/ HAVE_WRITE_DUP */ + WOLFSSL* ssl = NULL; + WOLFSSL* write_ssl = NULL; /* may have separate w/ HAVE_WRITE_DUP */ char command[SVR_COMMAND_SIZE+1]; int clientfd; int firstRead = 1; @@ -304,7 +304,7 @@ int err = 0; SOCKADDR_IN_T client; socklen_t client_len = sizeof(client); -#ifndef CYASSL_DTLS +#ifndef WOLFSSL_DTLS clientfd = accept(sockfd, (struct sockaddr*)&client, (ACCEPT_THIRD_T)&client_len); #else @@ -323,23 +323,23 @@ #endif if (WOLFSSL_SOCKET_IS_INVALID(clientfd)) err_sys("tcp accept failed"); - ssl = CyaSSL_new(ctx); + ssl = wolfSSL_new(ctx); if (ssl == NULL) err_sys("SSL_new failed"); - CyaSSL_set_fd(ssl, clientfd); - #ifdef CYASSL_DTLS + wolfSSL_set_fd(ssl, clientfd); + #ifdef WOLFSSL_DTLS wolfSSL_dtls_set_peer(ssl, &client, client_len); #endif #if !defined(NO_FILESYSTEM) && !defined(NO_DH) && !defined(NO_ASN) - CyaSSL_SetTmpDH_file(ssl, dhParamFile, WOLFSSL_FILETYPE_PEM); + wolfSSL_SetTmpDH_file(ssl, dhParamFile, WOLFSSL_FILETYPE_PEM); #elif !defined(NO_DH) SetDH(ssl); /* will repick suites with DHE, higher than PSK */ #endif do { err = 0; /* Reset error */ - ret = CyaSSL_accept(ssl); + ret = wolfSSL_accept(ssl); if (ret != WOLFSSL_SUCCESS) { - err = CyaSSL_get_error(ssl, 0); + err = wolfSSL_get_error(ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT if (err == WC_PENDING_E) { ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); @@ -350,9 +350,9 @@ } while (err == WC_PENDING_E); if (ret != WOLFSSL_SUCCESS) { fprintf(stderr, "SSL_accept error = %d, %s\n", err, - CyaSSL_ERR_error_string(err, buffer)); + wolfSSL_ERR_error_string((unsigned long)err, buffer)); fprintf(stderr, "SSL_accept failed\n"); - CyaSSL_free(ssl); + wolfSSL_free(ssl); CloseSocket(clientfd); continue; } @@ -364,7 +364,7 @@ write_ssl = wolfSSL_write_dup(ssl); if (write_ssl == NULL) { fprintf(stderr, "wolfSSL_write_dup failed\n"); - CyaSSL_free(ssl); + wolfSSL_free(ssl); CloseSocket(clientfd); continue; } @@ -377,9 +377,9 @@ do { err = 0; /* reset error */ - ret = CyaSSL_read(ssl, command, sizeof(command)-1); + ret = wolfSSL_read(ssl, command, sizeof(command)-1); if (ret <= 0) { - err = CyaSSL_get_error(ssl, 0); + err = wolfSSL_get_error(ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT if (err == WC_PENDING_E) { ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); @@ -391,7 +391,7 @@ if (ret <= 0) { if (err != WOLFSSL_ERROR_WANT_READ && err != WOLFSSL_ERROR_ZERO_RETURN){ fprintf(stderr, "SSL_read echo error %d, %s!\n", err, - CyaSSL_ERR_error_string(err, buffer)); + wolfSSL_ERR_error_string((unsigned long)err, buffer)); } break; } @@ -421,7 +421,7 @@ } #ifdef PRINT_SESSION_STATS if ( strncmp(command, "printstats", 10) == 0) { - CyaSSL_PrintSessionStats(); + wolfSSL_PrintSessionStats(); break; } #endif @@ -440,9 +440,9 @@ do { err = 0; /* reset error */ - ret = CyaSSL_write(write_ssl, command, echoSz); + ret = wolfSSL_write(write_ssl, command, echoSz); if (ret <= 0) { - err = CyaSSL_get_error(write_ssl, 0); + err = wolfSSL_get_error(write_ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT if (err == WC_PENDING_E) { ret = wolfSSL_AsyncPoll(write_ssl, WOLF_POLL_FLAG_CHECK_HW); @@ -453,7 +453,7 @@ } while (err == WC_PENDING_E); if (ret != echoSz) { fprintf(stderr, "SSL_write get error = %d, %s\n", err, - CyaSSL_ERR_error_string(err, buffer)); + wolfSSL_ERR_error_string((unsigned long)err, buffer)); err_sys("SSL_write get failed"); } break; @@ -466,9 +466,9 @@ do { err = 0; /* reset error */ - ret = CyaSSL_write(write_ssl, command, echoSz); + ret = wolfSSL_write(write_ssl, command, echoSz); if (ret <= 0) { - err = CyaSSL_get_error(write_ssl, 0); + err = wolfSSL_get_error(write_ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT if (err == WC_PENDING_E) { ret = wolfSSL_AsyncPoll(write_ssl, WOLF_POLL_FLAG_CHECK_HW); @@ -480,26 +480,26 @@ if (ret != echoSz) { fprintf(stderr, "SSL_write echo error = %d, %s\n", err, - CyaSSL_ERR_error_string(err, buffer)); + wolfSSL_ERR_error_string((unsigned long)err, buffer)); err_sys("SSL_write echo failed"); } } -#ifndef CYASSL_DTLS - CyaSSL_shutdown(ssl); +#ifndef WOLFSSL_DTLS + wolfSSL_shutdown(ssl); #endif #ifdef HAVE_WRITE_DUP - CyaSSL_free(write_ssl); + wolfSSL_free(write_ssl); #endif - CyaSSL_free(ssl); + wolfSSL_free(ssl); CloseSocket(clientfd); -#ifdef CYASSL_DTLS +#ifdef WOLFSSL_DTLS tcp_listen(&sockfd, &port, useAnyAddr, doDTLS, 0); SignalReady(args, port); #endif } CloseSocket(sockfd); - CyaSSL_CTX_free(ctx); + wolfSSL_CTX_free(ctx); #ifdef ECHO_OUT if (outCreated) @@ -510,10 +510,10 @@ #if defined(NO_MAIN_DRIVER) && defined(HAVE_ECC) && defined(FP_ECC) \ && defined(HAVE_THREAD_LS) - ecc_fp_free(); /* free per thread cache */ + wc_ecc_fp_free(); /* free per thread cache */ #endif -#ifdef CYASSL_TIRTOS +#ifdef WOLFSSL_TIRTOS fdCloseSession(Task_self()); #endif @@ -525,9 +525,7 @@ wolfAsync_DevClose(&devId); #endif -#ifndef CYASSL_TIRTOS - return 0; -#endif + WOLFSSL_RETURN_FROM_THREAD(0); } #endif /* !NO_WOLFSSL_SERVER */ @@ -551,15 +549,15 @@ args.argv = argv; args.return_code = 0; - CyaSSL_Init(); -#if defined(DEBUG_CYASSL) && !defined(CYASSL_MDK_SHELL) - CyaSSL_Debugging_ON(); + wolfSSL_Init(); +#if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_MDK_SHELL) + wolfSSL_Debugging_ON(); #endif ChangeToWolfRoot(); #ifndef NO_WOLFSSL_SERVER echoserver_test(&args); #endif - CyaSSL_Cleanup(); + wolfSSL_Cleanup(); #ifdef HAVE_WNR if (wc_FreeNetRandom() < 0) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcproj 2024-08-03 07:30:00.000000000 +0000 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="USE_ANY_ADDR;WOLFSSL_USER_SETTINGS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -117,7 +117,7 @@ Optimization="2" EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="USE_ANY_ADDR;WOLFSSL_USER_SETTINGS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/echoserver/echoserver.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -159,7 +159,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -179,7 +179,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -200,7 +200,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -218,7 +218,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -237,7 +237,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -259,7 +259,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -281,7 +281,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -302,7 +302,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + USE_ANY_ADDR;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/examples/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,7 @@ # vim:ft=automake # All paths should be given relative to the root +include examples/async/include.am include examples/benchmark/include.am include examples/client/include.am include examples/echoclient/include.am @@ -9,4 +10,5 @@ include examples/sctp/include.am include examples/configs/include.am include examples/asn1/include.am +include examples/pem/include.am EXTRA_DIST += examples/README.md diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/pem/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/examples/pem/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/pem/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/pem/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,12 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + + +if BUILD_EXAMPLE_ASN1 +noinst_PROGRAMS += examples/pem/pem +examples_pem_pem_SOURCES = examples/pem/pem.c +examples_pem_pem_LDADD = src/libwolfssl@LIBSUFFIX@.la $(LIB_STATIC_ADD) +examples_pem_pem_DEPENDENCIES = src/libwolfssl@LIBSUFFIX@.la +endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/pem/pem.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/pem/pem.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/pem/pem.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/pem/pem.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1048 @@ +/* pem.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#ifndef WOLFSSL_USER_SETTINGS + #include +#endif +#include +#include +#include +#include +#include +#include +#ifdef DEBUG_WOLFSSL + #include +#endif +#include + +#if defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) + +/* Increment allocated data by this much. */ +#define DATA_INC_LEN 256 +/* Maximum block size of a cipher. */ +#define BLOCK_SIZE_MAX 16 +/* Maximum PEM type string length. */ +#define PEM_TYPE_MAX_LEN 32 +/* Maximum salt length. */ +#define SALT_MAX_LEN 64 +/* Default PBE iterations. */ +#define DEFAULT_ITERATIONS 100000 + +/* Maps a string to a value. */ +typedef struct Str2Val { + /* String to be matched. */ + const char* string; + /* Corresponding value. */ + int val; +} String2Val; + +/* Get the value corresponding to the string. + * + * @param [in] map Map of strings to values. + * @param [in] len Number of entries in map. + * @param [in] str String to look-up. + * @param [out] val Value corresponding to string. + * @return 0 on success. + * @return 1 on failure. + */ +static int StringToVal(const String2Val* map, int len, const char* str, + int* val) +{ + int ret = 1; + int i; + + for (i = 0; i < len; i++) { + if (strcmp(str, map[i].string) == 0) { + *val = map[i].val; + ret = 0; + break; + } + } + + return ret; +} + +/* Read the contents of a file into a dynamically allocated buffer. + * + * Uses realloc as input may be stdin. + * + * @param [in] fp File pointer to read from. + * @param [out] pdata Pointer to data. + * @param [out] plen Pointer to length. + * @return 0 on success. + * @return 1 on failure. + */ +static int pemApp_ReadFile(FILE* fp, unsigned char** pdata, word32* plen) +{ + int ret = 0; + word32 len = 0; + size_t read_len; + /* Allocate a minimum amount. */ + unsigned char* data = (unsigned char*)malloc(DATA_INC_LEN + BLOCK_SIZE_MAX); + + if (data != NULL) { + /* Read more data. */ + while ((read_len = fread(data + len, 1, DATA_INC_LEN, fp)) != 0) { + unsigned char* p; + + /* Add read data amount to length. */ + len += (word32)read_len; + + /* Stop if we are at end-of-file. */ + if (feof(fp)) { + break; + } + + /* Make space for more data to be added to buffer. */ + p = (unsigned char*)realloc(data, len + DATA_INC_LEN + + BLOCK_SIZE_MAX); + if (p == NULL) { + /* Reallocation failed - free current buffer. */ + free(data); + data = NULL; + break; + } + /* Set data to new pointer. */ + data = p; + } + /* Done with file. */ + fclose(fp); + } + + if (data != NULL) { + /* Return data and length. */ + *pdata = data; + *plen = len; + } + else { + /* Failed to allocate data. */ + ret = MEMORY_E; + } + return ret; +} + +/* Write the data to the file. + * + * @param [in] fp File pointer to write to. + * @param [in] data Data to write. + * @param [in] len Length of data to write in bytes. + * @return 0 on success. + * @return 1 on failure. + */ +static int WriteFile(FILE* fp, const char* data, word32 len) +{ + int ret = 0; + + /* Write data to file. */ + if (fwrite(data, 1, len, fp) != len) { + /* Not all data was written. */ + fprintf(stderr, "Failed to write\n"); + ret = 1; + } + /* Close file. */ + fclose(fp); + + return ret; +} + +/* List of known PEM types. */ +static const String2Val type_map[] = { + { "CERTIFICATE" , CERT_TYPE }, +#ifdef WOLFSSL_CERT_REQ + { "CERTIFICATE REQUEST" , CERTREQ_TYPE }, +#endif +#ifndef NO_DH + { "DH PARAMETERS" , DH_PARAM_TYPE }, + { "X9.42 DH PARAMETERS" , X942_PARAM_TYPE }, +#endif +#ifndef NO_DSA + { "DSA PARAMETERS" , DSA_PARAM_TYPE }, +#endif +#ifdef HAVE_CRL + { "X509 CRL" , CRL_TYPE }, +#endif + { "RSA PRIVATE KEY" , RSA_TYPE }, + { "RSA PUBLIC KEY" , RSA_PUBLICKEY_TYPE }, + { "PRIVATE KEY" , PKCS8_PRIVATEKEY_TYPE }, + { "ENCRYPTED PRIVATE KEY", PKCS8_ENC_PRIVATEKEY_TYPE }, +#ifdef HAVE_ECC + { "EC PRIVATE KEY" , ECC_PRIVATEKEY_TYPE }, +#ifdef OPENSSL_EXTRA + { "EC PARAMETERS" , ECC_PARAM_TYPE }, +#endif /* OPENSSL_EXTRA */ +#endif /* HAVE_ECC */ +#ifndef NO_DSA + { "DSA PRIVATE KEY" , DSA_PRIVATEKEY_TYPE }, +#endif + { "PUBLIC KEY" , ECC_PUBLICKEY_TYPE }, +#if defined(HAVE_ED25519) || defined(HAVE_ED448) + { "EDDSA PRIVATE KEY" , EDDSA_PRIVATEKEY_TYPE }, +#endif +}; +/* Number of entries in PEM type map. */ +#define TYPE_MAP_LEN ((int)(sizeof(type_map) / sizeof(*type_map))) + +/* Convert string to PEM type value. + * + * @param [in] str PEM type as a string. + * @param [out] type PEM type as a value. + * @return 0 on success. + * @return 1 on failure. + */ +static int StringToType(const char* str, int* type) +{ + int ret = StringToVal(type_map, TYPE_MAP_LEN, str, type); + if (ret == 1) { + fprintf(stderr, "String doesn't match known PEM types: %s\n", str); + } + return ret; +} + +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) +/* Password callback for returning the password set in the user data. + * + * @param [out] passwd Password buffer. + * @param [in] sz Size of password buffer. + * @param [in] rw Ignored. + * @param [in] userdata Data associated with callback in EncryptedInfo. + * @return Length of password. + */ +static int password_from_userdata(char* passwd, int sz, int rw, void* userdata) +{ + (void)rw; + /* Copy user data into buffer. */ + strncpy(passwd, (const char*)userdata, (size_t)sz); + passwd[sz - 1] = '\0'; + /* Return length of password returned. */ + return (int)XSTRLEN((const char*)passwd); +} +#endif + +/* Find needle in haystack. + * + * @param [in] haystack String to find needle in. + * @param [in] offset Offset into haystack to start looking. + * @param [in] len Length of haystack. + * @param [in] needle String to find in haystack. + * @param [in] needle_len Length of string to find. + * @param [out] needle_offset Offset into haystack at which needle was found. + * @return 0 on success. + * @return 1 on failure. + */ +static int FindStr(char* haystack, word32 offset, word32 len, + const char* needle, word32 needle_len, word32* needle_offset) +{ + /* Assume failure. */ + int ret = 1; + word32 i; + + /* Ensure there is enough space for needle. */ + if (len >= needle_len) { + /* Look through haystack starting at offset until not enough space for + * needle. */ + for (i = offset; i <= len - needle_len; i++) { + /* Check if needle found. */ + if ((haystack[i] == needle[0]) && + (strncmp(haystack + i, needle, needle_len) == 0)) { + /* Return offset at which needle found. */ + *needle_offset = i; + /* Return success. */ + ret = 0; + /* Stop looking. */ + break; + } + } + } + + return ret; +} + +/* Find the next PEM block. + * + * @param [in] data PEM data. + * @param [in] offset Offset into data to start looking. + * @param [in] len Length of PEM data. + * @param [out] start Start of Base64 encoding. + * @param [out] end End of Base64 encoding. + * @param [out] type PEM type. + * @return 0 on success. + * @return 1 on failure. + */ +static int FindPem(char* data, word32 offset, word32 len, word32* start, + word32* end, int* type) +{ + int ret = 0; + word32 i = 0; + word32 type_off = 0; + char str[PEM_TYPE_MAX_LEN]; + + /* Find header. */ + ret = FindStr(data, offset, len, "-----BEGIN ", 11, &i); + if (ret == 1) { + /* Got to end without finding PEM header. */ + fprintf(stderr, "No PEM header found\n"); + } + if (ret == 0) { + /* Return start of PEM. */ + *start = i; + /* Get start of type. */ + type_off = i + 11; + + /* Confirm header. */ + ret = FindStr(data, i + 11, len, "-----", 5, &i); + if (ret == 1) { + /* Got to end without finding rest of PEM header. */ + fprintf(stderr, "Invalid PEM header\n"); + } + } + if (ret == 0) { + /* Found end of header - convert type string to value. */ + word32 type_len = i - type_off; + if (type_len >= PEM_TYPE_MAX_LEN) { + ret = 1; + } + if (ret == 0) { + if (type_len > 0) + memcpy(str, data + type_off, type_len); + str[type_len] = '\0'; + ret = StringToType(str, type); + } + } + if (ret == 0) { + /* Find footer. */ + ret = FindStr(data, i + 5, len, "-----END ", 9, &i); + if (ret == 1) { + /* Got to end without finding PEM footer. */ + fprintf(stderr, "No PEM footer found\n"); + } + } + if (ret == 0) { + /* Confirm header. */ + ret = FindStr(data, i + 9, len, "-----", 5, &i); + if (ret == 1) { + /* Got to end without finding rest of PEM footer. */ + fprintf(stderr, "Invalid PEM footer\n"); + } + } + if (ret == 0) { + /* Return end of */ + *end = i + 6; + } + + return ret; +} + +/* Convert PEM to DER and write to file. + * + * @param [in] in Array of characters that is the PEM data. + * @param [in] offset Offset into array to start looking for PEM block. + * @param [in] len Length of data in array in bytes. + * @param [out] der Buffer holding DER encoded data. + * @param [in] type PEM type. -1 indicates to determine from array. + * @param [in] info Encryption information. + * @return 0 on success. + * @return Not 0 on failure. + */ +static int ConvPemToDer(char* in, word32 offset, word32 len, DerBuffer** der, + int type, EncryptedInfo* info, int padding) +{ + int ret = 0; + word32 start = 0; + word32 end = 0; + /* Set point to start looking and length. */ + char* pem = in + offset; + word32 pem_len = len - offset; + + /* Check if we need to discover PEM type. */ + if ((ret == 0) && (type == -1)) { + /* Find PEM block and type. */ + ret = FindPem(pem, 0, pem_len, &start, &end, &type); + if (ret != 0) { + fprintf(stderr, "Could not find PEM header\n"); + } + /* Update start pointer and length. */ + pem += start; + pem_len = end - start; + } + if (ret == 0) { + /* Convert to DER. */ + ret = wc_PemToDer((unsigned char*)pem, pem_len, type, der, NULL, info, + NULL); + if (ret != 0) { + fprintf(stderr, "Could not convert PEM to DER\n"); + } + } + /* Remove padding from encryption if requested. */ + if ((ret == 0) && padding) { + unsigned char pad = (*der)->buffer[(*der)->length - 1]; + word32 i; + + /* Simple padding validation. */ + if ((pad == 0) || (pad > (*der)->length)) { + fprintf(stderr, "Invalid padding: %02x\n", pad); + ret = 1; + } + else { + /* Check padding is valid. */ + for (i = 1; i < pad; i++) { + if ((*der)->buffer[(*der)->length - 1 - i] != pad) { + fprintf(stderr, "Invalid padding: %d\n", pad); + ret = 1; + break; + } + } + if (ret == 0) { + /* Don't write out padding. */ + (*der)->length -= pad; + } + } + } + + return ret; +} + +#ifdef WOLFSSL_DER_TO_PEM +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) +/* List of known PBE algorithms. */ +static const String2Val pbe_map[] = { +#ifndef NO_SHA + #ifndef NO_RC4 + { "SHA1_RC4_128" , ENC_PKCS8_PBE_SHA1_RC4_128 }, + #endif + #ifndef NO_DES + { "SHA1_DES3" , ENC_PKCS8_PBE_SHA1_DES3 }, + { "PBES1_SHA1_DES", ENC_PKCS8_PBES1_SHA1_DES }, + #endif + #ifdef WC_RC2 + { "SHA1_40RC2_CBC", ENC_PKCS8_PBE_SHA1_40RC2_CBC }, + #endif +#endif +#ifndef NO_MD5 + #ifndef NO_DES + { "PBES1_MD5_DES" , ENC_PKCS8_PBES1_MD5_DES }, + #endif +#endif + { "PBES2" , ENC_PKCS8_PBES2 }, +}; +/* Number of entries in PBE map. */ +#define PBE_MAP_LEN ((int)(sizeof(pbe_map) / sizeof(*pbe_map))) + +/* Convert string to PBE value. + * + * @param [in] str PBE as a string. + * @param [out] pbe PBE as a value. + * @return 0 on success. + * @return 1 on failure. + */ +static int StringToPbe(char* str, int* pbe) +{ + int ret = StringToVal(pbe_map, PBE_MAP_LEN, str, pbe); + if (ret == 1) { + fprintf(stderr, "String doesn't match known PBE algorithms: %s\n", str); + } + return ret; +} + +/* List of known PBE versions. */ +static const String2Val pbe_ver_map[] = { + { "PKCS12" , ENC_PKCS8_VER_PKCS12 }, + { "PKCS12v1", ENC_PKCS8_VER_PKCS12 }, + { "PKCS5" , ENC_PKCS8_VER_PKCS5 }, +}; +/* Number of entries in PBE versions map. */ +#define PBE_VER_MAP_LEN ((int)(sizeof(pbe_ver_map) / sizeof(*pbe_ver_map))) + +/* Convert string to PBE version value. + * + * @param [in] str PBE version as a string. + * @param [out] pbe_ver PBE version as a value. + * @return 0 on success. + * @return 1 on failure. + */ +static int StringToPbeVer(char* str, int* pbe_ver) +{ + int ret = StringToVal(pbe_ver_map, PBE_VER_MAP_LEN, str, pbe_ver); + if (ret == 1) { + fprintf(stderr, "String doesn't match known PBE versions: %s\n", str); + } + return ret; +} + +/* List of known PKCS#5v2 PBE encryption algorithms. */ +static const String2Val pbe_alg_map[] = { + { "AES-128-CBC", ENC_PKCS8_ALG_AES128CBC }, + { "AES-256-CBC", ENC_PKCS8_ALG_AES256CBC }, + { "DES" , ENC_PKCS8_ALG_DES }, + { "DES3" , ENC_PKCS8_ALG_DES3 }, +}; +/* Number of entries in PBE algorithm map. */ +#define PBE_ALG_MAP_LEN ((int)(sizeof(pbe_alg_map) / sizeof(*pbe_alg_map))) + +/* Convert string to PBE algorithm value. + * + * @param [in] str PBE algorithm as a string. + * @param [out] pbe_alg PBE algorithm as a value. + * @return 0 on success. + * @return 1 on failure. + */ +static int StringToPbeAlg(char* str, int* pbe_alg) +{ + int ret = StringToVal(pbe_alg_map, PBE_ALG_MAP_LEN, str, pbe_alg); + if (ret == 1) { + fprintf(stderr, "String doesn't match known PBE algorithms: %s\n", str); + } + return ret; +} + +/* Encrypt the DER data. + * + * @param [in] in DER data to encrypt. + * @param [in] in_len Length of DER data. + * @param [in] password Password to use to derive key for encryption. + * @param [in] iterations Number of iterations in PBE. + * @param [in] salt_sz Size of salt to use in bytes. + * @param [in] pbe PBE algorithm to use. + * @param [in] pbe_ver Version of PBE algorithm to use. + * @param [in] enc_alg_id Encryption algorithm id for when using PBES2. + * @param [out] enc DER encrypted data. + * @param [out] enc_len Length of DER encrypted data. + * @return 0 on success. + * @return 1 on failure. + */ +static int EncryptDer(unsigned char* in, word32 in_len, char* password, + unsigned int iterations, unsigned int salt_sz, int pbe, int pbe_ver, + int enc_alg_id, unsigned char** enc, word32* enc_len) +{ + int ret; + WC_RNG rng; + unsigned char salt[SALT_MAX_LEN]; + + if (password == NULL) + return 1; + + XMEMSET(&rng, 0, sizeof(rng)); + + /* Create a random number generator. */ + ret = wc_InitRng(&rng); + if (ret == 0) { + /* Get salt from random number generator. */ + ret = wc_RNG_GenerateBlock(&rng, salt, salt_sz); + } + if (ret == 0) { + /* Get length of encrypted DER data. */ + ret = wc_CreateEncryptedPKCS8Key(in, in_len, NULL, enc_len, password, + (int)strlen(password), pbe_ver, pbe, enc_alg_id, salt, salt_sz, + (int)iterations, &rng, NULL); + if (ret == LENGTH_ONLY_E) { + ret = 0; + } + else if (ret == 0) { + ret = 1; + } + } + if (ret == 0) { + /* Allocate memory for encrypted DER data. */ + *enc = (unsigned char*)malloc(*enc_len); + if (*enc == NULL) { + ret = 1; + } + } + if (ret == 0) { + /* Encrypt DER data. */ + ret = wc_CreateEncryptedPKCS8Key(in, in_len, *enc, enc_len, password, + (int)strlen(password), pbe_ver, pbe, enc_alg_id, salt, salt_sz, + (int)iterations, &rng, NULL); + if (ret > 0) { + ret = 0; + } + } + + wc_FreeRng(&rng); + return ret; +} +#endif + +/* Convert DER to PEM and write to file. + * + * @param [in] in Array of bytes holding the DER encoding. + * @param [in] offset Offset into array of data to convert to PEM. + * @param [in] len Length of data in array in bytes. + * @param [out] out Allocated buffer holding PEM encoding. + * @param [out] out_len Length of PEM encoding in bytes. + * @param [in] type PEM type. + * @param [in] cipher_str String to write into encrypted key. + * @return 0 on success. + * @return Not 0 on failure. + */ +static int ConvDerToPem(unsigned char* in, word32 offset, word32 len, + unsigned char** out, word32* out_len, int type, const char* cipher_str) +{ + int ret = 0; + unsigned char* pem = NULL; + unsigned int pem_len = 0; + /* Set point to start looking and length. */ + unsigned char* der = in + offset; + word32 der_len = len - offset; + + /* Get length of PEM based on DER. */ + ret = wc_DerToPemEx(der, der_len, NULL, 0, (byte*)cipher_str, type); + if (ret <= 0) { + fprintf(stderr, "Could not determine length of PEM\n"); + } + pem_len = (unsigned int)ret; + if (ret > 0) { + ret = 0; + } + if ((ret == 0) && (pem_len > 0)) { + /* Allocate memory to hold PEM encoding. */ + pem = (unsigned char*)malloc(pem_len); + if (pem == NULL) { + ret = 1; + } + } + if (ret == 0) { + /* Convert DER to PEM. */ + ret = wc_DerToPemEx(der, der_len, pem, pem_len, (byte*)cipher_str, + type); + if (ret <= 0) { + fprintf(stderr, "Could not convert DER to PEM\n"); + free(pem); + } + if (ret > 0) { + *out = pem; + *out_len = (word32)ret; + ret = 0; + } + } + + return ret; +} +#endif + +/* Usage lines to show. */ +const char* usage[] = { + "pem [OPTION]...", + "Convert to/from PEM and DER.", + "", + "Options:", + " -?, --help display this help and exit", + " -t --type string representing type of data", + " -in name of file to read (uses stdin otherwise)", + " -out name of file to write to (uses stdout otherwise)", + " -o --offset offset into file where data to convert starts", +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) + " -p --pass password to use with encrypted keys", +#endif +#ifdef WOLFSSL_DER_TO_PEM + " -d --der input is DER and output is PEM", +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) + " --padding Remove padding on decrypted data", + " -e --encrypt DER key is to be encrypted", + " -v --pbe-ver PBE version to use when encrypting key (see below)", + " -p --pbe PBE to use when encrypting key (see below)", + " -a --pbe-alg PBES2 algorithm to use when encrypting key (see below)", + " -i --iter number of iterations of PBE - default: 100000", + " -s --salt-sz length, in bytes, of salt to generate - 0-64", +#endif +#endif +#ifdef DEBUG_WOLFSSL + " -l --log turn on wolfSSL logging", +#endif + "", +}; +/* Number of usage lines. */ +#define USAGE_SZ ((int)(sizeof(usage) / sizeof(*usage))) + +const struct string_usage_st { + const char* str; + const String2Val* map; + int len; +} known_strings[] = { + { "Known PEM header/trailer strings:", type_map , TYPE_MAP_LEN }, +#if defined(WOLFSSL_DER_TO_PEM) && defined(WOLFSSL_ENCRYPTED_KEYS) && \ + !defined(NO_PWDBASED) + { "Known PBE version strings:" , pbe_ver_map, PBE_VER_MAP_LEN }, + { "Known PBE strings:" , pbe_map , PBE_MAP_LEN }, + { "Known PBES2 algorithm strings:" , pbe_alg_map, PBE_ALG_MAP_LEN }, +#endif +}; +/* Number of usage lines. */ +#define KNOWN_STRINGS_SZ \ + ((int)(sizeof(known_strings) / sizeof(*known_strings))) + +/* Print out usage lines. + */ +static void Usage(void) +{ + int i; + int j; + + /* Usage lines. */ + for (i = 0; i < USAGE_SZ; i++) { + printf("%s\n", usage[i]); + } + /* Known strings for options. */ + for (j = 0; j < KNOWN_STRINGS_SZ; j++) { + printf("%s\n", known_strings[j].str); + for (i = 0; i < known_strings[j].len; i++) { + printf(" %s\n", known_strings[j].map[i].string); + } + } +} + +/* Main entry of ASN.1 printing program. + * + * @param [in] argc Count of command line arguments. + * @param [in] argv Command line arguments. + * @return 0 on success. + * @return 1 on failure. + */ +int main(int argc, char* argv[]) +{ + int ret = 0; + /* Default to reading STDIN. */ + FILE* in_file = stdin; + /* Default to writing to STDOUT. */ + FILE* out_file = stdout; + const char* out_name = NULL; + unsigned char* in = NULL; + word32 in_len = 0; + word32 offset = 0; + unsigned char* out = NULL; + word32 out_len = 0; + int pem = 1; + const char* type_str = NULL; + int type = -1; + DerBuffer* der = NULL; + EncryptedInfo info; + int padding = 0; +#if defined(WOLFSSL_DER_TO_PEM) && defined(WOLFSSL_ENCRYPTED_KEYS) && \ + !defined(NO_PWDBASED) + int enc_der = 0; + unsigned char* enc = NULL; + word32 enc_len = 0; + unsigned int iterations = DEFAULT_ITERATIONS; + unsigned int salt_sz = 8; + int pbe_ver = ENC_PKCS8_VER_PKCS5; + int pbe = ENC_PKCS8_PBES2; + int pbe_alg = ENC_PKCS8_ALG_AES256CBC; +#endif +#ifdef DEBUG_WOLFSSL + int log = 0; +#endif + + memset(&info, 0, sizeof(info)); + + /* Skip over program name. */ + argc--; + argv++; + while (argc > 0) { + /* PEM header type. */ + if ((strcmp(argv[0], "-t") == 0) || + (strcmp(argv[0], "--type") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No type string provided\n"); + return 1; + } + type_str = argv[0]; + } + /* Name of input file. */ + else if (strcmp(argv[0], "-in") == 0) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No filename provided\n"); + return 1; + } + if (in_file != stdin) { + fprintf(stderr, "At most one input file can be supplied.\n"); + return 1; + } + in_file = fopen(argv[0], "r"); + if (in_file == NULL) { + fprintf(stderr, "File not able to be read: %s\n", argv[0]); + return 1; + } + } + /* Name of output file. */ + else if (strcmp(argv[0], "-out") == 0) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No filename provided\n"); + return 1; + } + out_name = argv[0]; + } + /* Offset into input data to start from. */ + else if ((strcmp(argv[0], "-o") == 0) || + (strcmp(argv[0], "--offset") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No filename provided\n"); + return 1; + } + offset = (word32)strtoul(argv[0], NULL, 10); + } +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) + /* Password to use when encrypting or decrypting keys with PEM. */ + else if ((strcmp(argv[0], "-p") == 0) || + (strcmp(argv[0], "--pass") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No password provided\n"); + return 1; + } + info.passwd_cb = password_from_userdata; + info.passwd_userdata = argv[0]; + } +#endif +#ifdef WOLFSSL_DER_TO_PEM + /* Input is DER and we are converting to PEM. */ + else if ((strcmp(argv[0], "-d") == 0) || + (strcmp(argv[0], "--der") == 0)) { + pem = 0; + } +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) + /* Remove padding leftover from decryption. */ + else if (strcmp(argv[0], "--padding") == 0) { + padding = 1; + } + /* Encrypting the DER data. */ + else if ((strcmp(argv[0], "-e") == 0) || + (strcmp(argv[0], "--encrypt") == 0)) { + enc_der = 1; + } + /* PBE version. */ + else if ((strcmp(argv[0], "-v") == 0) || + (strcmp(argv[0], "--pbe-ver") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No PBE version provided\n"); + return 1; + } + if (StringToPbeVer(argv[0], &pbe_ver) != 0) { + return 1; + } + } + /* PBE algorithm. */ + else if ((strcmp(argv[0], "-p") == 0) || + (strcmp(argv[0], "--pbe") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No PBE provided\n"); + return 1; + } + if (StringToPbe(argv[0], &pbe) != 0) { + return 1; + } + } + /* PBES2 algorithm. */ + else if ((strcmp(argv[0], "-a") == 0) || + (strcmp(argv[0], "--pbe-alg") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No PBE algorithm provided\n"); + return 1; + } + if (StringToPbeAlg(argv[0], &pbe_alg) != 0) { + return 1; + } + } + /* Number of PBE iterations. */ + else if ((strcmp(argv[0], "-i") == 0) || + (strcmp(argv[0], "--iter") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No filename provided\n"); + return 1; + } + iterations = (unsigned int)strtoul(argv[0], NULL, 10); + } + /* Size of salt to be generated. */ + else if ((strcmp(argv[0], "-s") == 0) || + (strcmp(argv[0], "--salt-sz") == 0)) { + argc--; + argv++; + if (argc == 0) { + fprintf(stderr, "No salt size provided\n"); + return 1; + } + salt_sz = (unsigned int)strtoul(argv[0], NULL, 10); + if (salt_sz > SALT_MAX_LEN) { + fprintf(stderr, "Salt size must be no bigger than %d: %d\n", + SALT_MAX_LEN, salt_sz); + return 1; + } + } +#endif /* WOLFSSL_ENCRYPTED_KEYS !NO_PWDBASED */ +#endif /* WOLFSSL_DER_TO_PEM */ +#ifdef DEBUG_WOLFSSL + /* Turn on logging. */ + else if ((strcmp(argv[0], "-l") == 0) || + (strcmp(argv[0], "--log") == 0)) { + log = 1; + } +#endif + /* Display help/usage. */ + else if ((strcmp(argv[0], "-?") == 0) || + (strcmp(argv[0], "--help") == 0)) { + Usage(); + return 0; + } + else { + fprintf(stderr, "Bad option: %s\n", argv[0]); + Usage(); + return 1; + } + + /* Move on to next command line argument. */ + argc--; + argv++; + } + +#ifdef DEBUG_WOLFSSL + if (log) { + wolfSSL_Debugging_ON(); + } +#endif + + /* Convert PEM type string to value. */ + if (type_str != NULL) { + ret = StringToType(type_str, &type); + } +#if defined(WOLFSSL_DER_TO_PEM) && defined(WOLFSSL_ENCRYPTED_KEYS) && \ + !defined(NO_PWDBASED) + /* Check whether we are encrypting DER. */ + if ((!pem) && (type == PKCS8_ENC_PRIVATEKEY_TYPE)) { + enc_der = 1; + } +#endif + /* Read all of PEM file. */ + if ((ret == 0) && (pemApp_ReadFile(in_file, &in, &in_len) != 0)) { + fprintf(stderr, "Reading file failed\n"); + ret = 1; + } + + if ((ret == 0) && pem) { + /* Convert PEM to DER. */ + ret = ConvPemToDer((char*)in, offset, in_len, &der, type, &info, + padding); + if (ret == 0) { + out = der->buffer; + out_len = der->length; + } + } + else { +#ifdef WOLFSSL_DER_TO_PEM + #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) + if (enc_der) { + /* Encrypt DER first. */ + ret = EncryptDer(in + offset, in_len - offset, + (char*)info.passwd_userdata, iterations, salt_sz, pbe, pbe_ver, + pbe_alg, &enc, &enc_len); + if (ret == 0) { + /* Convert encrypted DER data to PEM. */ + ret = ConvDerToPem(enc, 0, enc_len, &out, &out_len, type, + NULL); + } + } + else + #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */ + { + /* Convert DER data to PEM. */ + ret = ConvDerToPem(in, offset, in_len, &out, &out_len, type, NULL); + } +#else + fprintf(stderr, "DER to PEM not supported by wolfSSL\n"); + ret = 1; +#endif + } + + if ((ret == 0) && (out_name != NULL)) { + /*Open write named file to write to. */ + out_file = fopen(out_name, "w"); + if (out_file == NULL) { + fprintf(stderr, "File not able to be written: %s\n", out_name); + ret = 1; + } + } + if (ret == 0) { + /* Write out PEM. */ + ret = WriteFile(out_file, out ? (const char *)out : "", out_len); + if (ret != 0) { + fprintf(stderr, "Could not write file\n"); + } + } + + /* Dispose of allocated data. */ + if (der != NULL) { + wc_FreeDer(&der); + } + else if (out != NULL) { + free(out); + } +#if defined(WOLFSSL_DER_TO_PEM) && defined(WOLFSSL_ENCRYPTED_KEYS) && \ + !defined(NO_PWDBASED) + if (enc != NULL) { + free(enc); + } +#endif + if (in != NULL) { + free(in); + } + if (ret < 0) { + fprintf(stderr, "%s\n", wc_GetErrorString(ret)); + } + return (ret == 0) ? 0 : 1; +} + +#else + +/* Main entry of ASN.1 printing program. + * + * @param [in] argc Count of command line arguments. + * @param [in] argv Command line arguments. + * @return 0 on success. + * @return 1 on failure. + */ +int main(int argc, char* argv[]) +{ + (void)argc; + (void)argv; + fprintf(stderr, "PEM to DER conversion of file system support not compiled" + " in.\n"); + return 0; +} + +#endif /* WOLFSSL_PEM_TO_DER && !NO_FILESYSTEM */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/sctp/sctp-client-dtls.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/sctp/sctp-client-dtls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/sctp/sctp-client-dtls.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/sctp/sctp-client-dtls.c 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,7 @@ #include #include -#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) +#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) /* sctp */ #include #include @@ -47,13 +47,13 @@ perror(msg); exit(EXIT_FAILURE); } -#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS */ +#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS && !WOLFSSL_NO_TLS12 */ int main(int argc, char **argv) { (void)argc; (void)argv; -#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) +#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) int sd = socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP); if (sd < 0) @@ -126,7 +126,7 @@ wolfSSL_CTX_free(ctx); close(sd); -#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS */ +#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS && !WOLFSSL_NO_TLS12 */ return 0; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/sctp/sctp-server-dtls.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/sctp/sctp-server-dtls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/sctp/sctp-server-dtls.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/sctp/sctp-server-dtls.c 2024-08-03 07:30:00.000000000 +0000 @@ -26,7 +26,7 @@ #include #include -#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) +#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) /* sctp */ #include #include @@ -47,13 +47,13 @@ perror(msg); exit(EXIT_FAILURE); } -#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS */ +#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS && !WOLFSSL_NO_TLS12 */ int main(int argc, char **argv) { (void)argc; (void)argv; -#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) +#if defined(WOLFSSL_SCTP) && defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) int sd = socket(PF_INET, SOCK_STREAM, IPPROTO_SCTP); if (sd < 0) @@ -125,6 +125,6 @@ wolfSSL_CTX_free(ctx); close(sd); -#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS */ +#endif /* WOLFSSL_SCTP && WOLFSSL_DTLS && !WOLFSSL_NO_TLS12 */ return 0; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.c mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.c 2024-08-03 07:30:00.000000000 +0000 @@ -148,8 +148,16 @@ * cert to send to clients attempting to connect. The * server should error out completely in that case */ +static int quieter = 0; /* Print fewer messages. This is helpful with overly + * ambitious log parsers. */ static int lng_index = 0; +#define LOG_ERROR(...) \ + do { \ + if (!quieter) \ + fprintf(stderr, __VA_ARGS__); \ + } while(0) + #ifdef WOLFSSL_CALLBACKS #if !defined(NO_OLD_TIMEVAL_NAME) Timeval srvTo; @@ -186,8 +194,8 @@ static void err_sys_ex(int out, const char* msg) { if (out == 1) { /* if server is running w/ -x flag, print error w/o exit */ - fprintf(stderr, "wolfSSL error: %s\n", msg); - fprintf(stderr, "Continuing server execution...\n\n"); + LOG_ERROR("wolfSSL error: %s\n", msg); + LOG_ERROR("Continuing server execution...\n\n"); } else { err_sys(msg); } @@ -254,7 +262,8 @@ const char* c = buf + 3; if ((c[0] | c[1] | c[2] | c[3]) == 0) { - *seq = (c[4] << 24) | (c[5] << 16) | (c[6] << 8) | c[7]; + *seq = ((word32)c[4] << 24) | ((word32)c[5] << 16) | + ((word32)c[6] << 8) | (word32)c[7]; return 1; } @@ -284,8 +293,8 @@ } } - sent = (int)sendto(sd, buf, sz, 0, (const SOCKADDR*)&dtlsCtx->peer.sa, - dtlsCtx->peer.sz); + sent = (int)sendto(sd, buf, (size_t)sz, 0, + (const SOCKADDR*)&dtlsCtx->peer.sa, dtlsCtx->peer.sz); sent = TranslateReturnCode(sent, sd); @@ -411,7 +420,7 @@ size_t xfer_bytes = 0; char* buffer; - buffer = (char*)malloc(block); + buffer = (char*)malloc((size_t)block); if (!buffer) { err_sys_ex(runWithErrors, "Server buffer malloc failed"); } @@ -423,7 +432,7 @@ if (select_ret == TEST_RECV_READY) { if (throughput) - len = min(block, (int)(throughput - xfer_bytes)); + len = (int)min((word32)block, (word32)(throughput - xfer_bytes)); else len = block; rx_pos = 0; @@ -448,7 +457,7 @@ err != WOLFSSL_ERROR_WANT_WRITE && err != WOLFSSL_ERROR_ZERO_RETURN && err != APP_DATA_READY) { - fprintf(stderr, "SSL_read echo error %d\n", err); + LOG_ERROR("SSL_read echo error %d\n", err); err_sys_ex(runWithErrors, "SSL_read failed"); break; } @@ -471,7 +480,7 @@ /* Write data */ do { err = 0; /* reset error */ - ret = SSL_write(ssl, buffer, min(len, rx_pos)); + ret = SSL_write(ssl, buffer, (int)min((word32)len, (word32)rx_pos)); if (ret <= 0) { err = SSL_get_error(ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT @@ -482,8 +491,8 @@ #endif } } while (err == WC_PENDING_E); - if (ret != (int)min(len, rx_pos)) { - fprintf(stderr, "SSL_write echo error %d\n", err); + if (ret != (int)min((word32)len, (word32)rx_pos)) { + LOG_ERROR("SSL_write echo error %d\n", err); err_sys_ex(runWithErrors, "SSL_write failed"); } @@ -491,7 +500,7 @@ tx_time += current_time(0) - start; } - xfer_bytes += len; + xfer_bytes += (size_t)len; } } @@ -505,14 +514,19 @@ #define SIZE_FMT "%zu" #define SIZE_TYPE size_t #endif - printf( - "wolfSSL Server Benchmark " SIZE_FMT " bytes\n" - "\tRX %8.3f ms (%8.3f MBps)\n" - "\tTX %8.3f ms (%8.3f MBps)\n", - (SIZE_TYPE)throughput, - rx_time * 1000, throughput / rx_time / 1024 / 1024, - tx_time * 1000, throughput / tx_time / 1024 / 1024 - ); + if (rx_time > 0.0 && tx_time > 0.0) { + printf( + "wolfSSL Server Benchmark " SIZE_FMT " bytes\n" + "\tRX %8.3f ms (%8.3f MBps)\n" + "\tTX %8.3f ms (%8.3f MBps)\n", + (SIZE_TYPE)throughput, + (double)rx_time * 1000, (double)throughput / rx_time / 1024 / 1024, + (double)tx_time * 1000, (double)throughput / tx_time / 1024 / 1024 + ); + } + else { + printf("Invalid rx_time: %f or tx_time: %f\n", rx_time, tx_time); + } } return 0; @@ -557,7 +571,7 @@ #endif #ifdef WOLFSSL_DTLS if (wolfSSL_dtls(ssl) && err == DECRYPT_ERROR) { - fprintf(stderr, "Dropped client's message due to a bad MAC\n"); + LOG_ERROR("Dropped client's message due to a bad MAC\n"); } else #endif @@ -568,8 +582,8 @@ && err != APP_DATA_READY #endif ) { - fprintf(stderr, "SSL_read input error %d, %s\n", err, - ERR_error_string(err, buffer)); + LOG_ERROR("SSL_read input error %d, %s\n", err, + ERR_error_string((unsigned long)err, buffer)); err_sys_ex(runWithErrors, "SSL_read failed"); } } @@ -641,8 +655,8 @@ } while (err == WC_PENDING_E || err == WOLFSSL_ERROR_WANT_WRITE); if (ret != outputLen) { char buffer[WOLFSSL_MAX_ERROR_SZ]; - fprintf(stderr, "SSL_write msg error %d, %s\n", err, - ERR_error_string(err, buffer)); + LOG_ERROR("SSL_write msg error %d, %s\n", err, + ERR_error_string((unsigned long)err, buffer)); err_sys_ex(runWithErrors, "SSL_write failed"); } } @@ -744,6 +758,18 @@ else err_sys("unable to use curve secp256r1"); } while (ret == WC_PENDING_E); + #elif defined(WOLFSSL_SM2) + do { + ret = wolfSSL_UseKeyShare(ssl, WOLFSSL_ECC_SM2P256V1); + if (ret == WOLFSSL_SUCCESS) + groups[count++] = WOLFSSL_ECC_SM2P256V1; + #ifdef WOLFSSL_ASYNC_CRYPT + else if (ret == WC_PENDING_E) + wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); + #endif + else + err_sys("unable to use curve sm2p256r1"); + } while (ret == WC_PENDING_E); #endif #endif } @@ -950,10 +976,14 @@ #ifdef HAVE_SUPPORTED_CURVES "--onlyPskDheKe Must use DHE key exchange with PSK\n", /* 64 */ #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + "--altPrivKey Generate alternative signature with this key.\n", + /* 65 */ +#endif "\n" "For simpler wolfSSL TLS server examples, visit\n" "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", - /* 65 */ + /* 66 */ NULL, }, #ifndef NO_MULTIBYTE_PRINT @@ -1140,10 +1170,15 @@ #ifdef HAVE_SUPPORTED_CURVES "--onlyPskDheKe Must use DHE key exchange with PSK\n", /* 64 */ #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + "--altPrivKey Generate alternative signature with this key.\n", + /* 65 */ +#endif "\n" "より簡å˜ãªwolfSSL TSL クライアントã®ä¾‹ã«ã¤ã„ã¦ã¯" "下記ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ãã ã•ã„\n" - "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 65 */ + "https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", + /* 66 */ NULL, }, #endif @@ -1300,7 +1335,10 @@ #ifdef HAVE_SUPPORTED_CURVES printf("%s", msg[++msgId]); /* --onlyPskDheKe */ #endif - printf("%s", msg[++msgId]); /* Examples repo link */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + printf("%s", msg[++msgId]); /* --altPrivKey */ +#endif + printf("%s", msg[++msgId]); /* Examples repo link */ } #ifdef WOLFSSL_SRTP @@ -1319,7 +1357,7 @@ size_t srtp_secret_length; byte *srtp_secret, *p; int ret; -#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#ifdef WOLFSSL_COND srtp_test_helper *srtp_helper = args->srtp_helper; #else (void)args; @@ -1328,7 +1366,7 @@ ret = wolfSSL_export_dtls_srtp_keying_material(ssl, NULL, &srtp_secret_length); if (ret != LENGTH_ONLY_E) { - fprintf(stderr, "DTLS SRTP: Error getting key material length\n"); + LOG_ERROR("DTLS SRTP: Error getting key material length\n"); return ret; } @@ -1342,7 +1380,7 @@ &srtp_secret_length); if (ret != WOLFSSL_SUCCESS) { XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER); - fprintf(stderr, "DTLS SRTP: Error getting key material\n"); + LOG_ERROR("DTLS SRTP: Error getting key material\n"); return ret; } @@ -1351,7 +1389,7 @@ printf("%02X", *p); printf("\n"); -#if !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#ifdef WOLFSSL_COND if (srtp_helper != NULL) { srtp_helper_set_ekm(srtp_helper, srtp_secret, srtp_secret_length); @@ -1359,7 +1397,7 @@ correctness */ return 0; } -#endif /* _POSIX_THREADS */ +#endif /* WOLFSSL_COND */ XFREE(srtp_secret, NULL, DYNAMIC_TYPE_TMP_BUFFER); return 0; @@ -1391,7 +1429,9 @@ { "wolfsentry-config", 1, 256 }, #endif { "help", 0, 257 }, +#ifndef NO_MULTIBYTE_PRINT { "ヘルプ", 0, 258 }, +#endif #if defined(HAVE_PQC) { "pqc", 1, 259 }, #endif @@ -1410,6 +1450,13 @@ #ifdef HAVE_SUPPORTED_CURVES {"onlyPskDheKe", 2, 264}, #endif /* HAVE_SUPPORTED_CURVES */ +#ifdef HAVE_CRL + {"crl-dir", 1, 265}, +#endif + {"quieter", 0, 266}, +#ifdef WOLFSSL_DUAL_ALG_CERTS + { "altPrivKey", 1, 267}, +#endif { 0, 0, 0 } }; #endif @@ -1419,7 +1466,7 @@ #else int doCliCertCheck = 0; #endif -#ifdef HAVE_CRL +#if defined(HAVE_CRL) && !defined(NO_FILESYSTEM) int disableCRL = 0; #endif int useAnyAddr = 0; @@ -1531,6 +1578,9 @@ int useDtlsCID = 0; char dtlsCID[DTLS_CID_BUFFER_SIZE] = { 0 }; #endif /* WOLFSSL_DTLS_CID */ +#if defined(HAVE_CRL) && !defined(NO_FILESYSTEM) + char* crlDir = NULL; +#endif #ifdef WOLFSSL_STATIC_MEMORY /* Note: Actual memory used is much less, this is the entire buffer buckets, @@ -1551,10 +1601,12 @@ byte memory[80000]; #endif byte memoryIO[34500]; /* max for IO buffer (TLS packet can be 16k) */ + #if !defined(WOLFSSL_STATIC_MEMORY_LEAN) WOLFSSL_MEM_CONN_STATS ssl_stats; - #ifdef DEBUG_WOLFSSL + #if defined(DEBUG_WOLFSSL) WOLFSSL_MEM_STATS mem_stats; #endif + #endif #endif #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES) int onlyKeyShare = 0; @@ -1571,6 +1623,7 @@ int useX448 = 0; int usePqc = 0; char* pqcAlg = NULL; + char* altPrivKey = NULL; int exitWithRet = 0; int loadCertKeyIntoSSLObj = 0; @@ -1645,6 +1698,7 @@ (void)nonBlocking; (void)pqcAlg; (void)usePqc; + (void)altPrivKey; #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); @@ -1693,7 +1747,7 @@ break; case 'V' : - #ifdef HAVE_CRL + #if defined(HAVE_CRL) && !defined(NO_FILESYSTEM) disableCRL = 1; #endif break; @@ -1933,7 +1987,7 @@ break; case 'B': - throughput = atol(myoptarg); + throughput = (size_t)atol(myoptarg); for (; *myoptarg != '\0'; myoptarg++) { if (*myoptarg == ',') { block = atoi(myoptarg + 1); @@ -2092,7 +2146,7 @@ #if defined(WOLFSSL_DTLS) && defined(USE_WOLFSSL_IO) XMEMSET(&dtlsCtx, 0, sizeof(dtlsCtx)); doBlockSeq = 1; - dtlsCtx.blockSeq = atoi(myoptarg); + dtlsCtx.blockSeq = (word32)atoi(myoptarg); #endif break; @@ -2107,7 +2161,7 @@ nonBlocking = 1; simulateWantWrite = 1; #else - fprintf(stderr, "Ignoring -6 since async I/O support not " + LOG_ERROR("Ignoring -6 since async I/O support not " "compiled in.\n"); #endif break; @@ -2252,9 +2306,9 @@ if (force_curve_group_id <= 0) { if (lng_index == 1) { /* TODO: Need Japanese translation */ - fprintf(stderr, "Invalid curve '%s'\n", myoptarg); + LOG_ERROR("Invalid curve '%s'\n", myoptarg); } else { - fprintf(stderr, "Invalid curve '%s'\n", myoptarg); + LOG_ERROR("Invalid curve '%s'\n", myoptarg); } XEXIT_T(EXIT_FAILURE); } @@ -2281,7 +2335,23 @@ #endif #endif break; + case 265: +#if defined(HAVE_CRL) && !defined(NO_FILESYSTEM) + crlDir = myoptarg; +#endif + break; + case 266: + quieter = 1; + break; + +#ifdef WOLFSSL_DUAL_ALG_CERTS + case 267: + altPrivKey = myoptarg; + break; +#endif + + case -1: default: Usage(); XEXIT_T(MY_EX_USAGE); @@ -2327,7 +2397,7 @@ #ifndef HAVE_SESSION_TICKET if ((version >= 4) && resume) { - fprintf(stderr, "Can't do TLS 1.3 resumption; need session tickets!\n"); + LOG_ERROR("Can't do TLS 1.3 resumption; need session tickets!\n"); } #endif @@ -2341,7 +2411,7 @@ if (usePqc) { if (version == SERVER_DOWNGRADE_VERSION || version == EITHER_DOWNGRADE_VERSION) { - fprintf(stderr, + LOG_ERROR( "WARNING: If a TLS 1.3 connection is not negotiated, you " "will not be using a post-quantum group.\n"); } else if (version != 4 && version != -4) { @@ -2435,14 +2505,14 @@ err_sys_ex(runWithErrors, "unable to get method"); #ifdef WOLFSSL_STATIC_MEMORY - #ifdef DEBUG_WOLFSSL + #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) /* print off helper buffer sizes for use with static memory * printing to stderr in case of debug mode turned on */ - fprintf(stderr, "static memory management size = %d\n", + LOG_ERROR("static memory management size = %d\n", wolfSSL_MemoryPaddingSz()); - fprintf(stderr, "calculated optimum general buffer size = %d\n", + LOG_ERROR("calculated optimum general buffer size = %d\n", wolfSSL_StaticBufferSz(memory, sizeof(memory), 0)); - fprintf(stderr, "calculated optimum IO buffer size = %d\n", + LOG_ERROR("calculated optimum IO buffer size = %d\n", wolfSSL_StaticBufferSz(memoryIO, sizeof(memoryIO), WOLFMEM_IO_POOL_FIXED)); #endif /* DEBUG_WOLFSSL */ @@ -2658,6 +2728,14 @@ != WOLFSSL_SUCCESS) err_sys_ex(catastrophic, "can't load server private key file, " "check file and run from wolfSSL home dir"); + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((altPrivKey != NULL) && + wolfSSL_CTX_use_AltPrivateKey_file(ctx, altPrivKey, + WOLFSSL_FILETYPE_PEM) + != WOLFSSL_SUCCESS) + err_sys_ex(catastrophic, "can't load alt private key file, " + "check file and run from wolfSSL home dir"); + #endif /* WOLFSSL_DUAL_ALG_CERTS */ #else /* loads private key file using buffer API */ load_buffer(ctx, ourKey, WOLFSSL_KEY); @@ -2823,7 +2901,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfAsync_DevOpen(&devId); if (ret < 0) { - fprintf(stderr, "Async device open failed\nRunning without async\n"); + LOG_ERROR("Async device open failed\nRunning without async\n"); } wolfSSL_CTX_SetDevId(ctx, devId); #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -2846,6 +2924,30 @@ wolfSSL_CTX_NoTicketTLSv12(ctx); #endif #endif +#if defined(HAVE_CRL) && !defined(NO_FILESYSTEM) + if (!disableCRL) { + /* Need to load CA's to confirm CRL signatures */ + unsigned int verify_flags = 0; +#ifdef TEST_BEFORE_DATE + verify_flags |= WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY; +#endif + if (wolfSSL_CTX_load_verify_locations_ex(ctx, verifyCert, 0, + verify_flags) != WOLFSSL_SUCCESS) { + err_sys_ex(catastrophic, + "can't load ca file, Please run from wolfSSL home dir"); + } +#ifdef HAVE_CRL_MONITOR + crlFlags = WOLFSSL_CRL_MONITOR | WOLFSSL_CRL_START_MON; +#endif + if (wolfSSL_CTX_EnableCRL(ctx, 0) != WOLFSSL_SUCCESS) + err_sys_ex(runWithErrors, "unable to enable CRL"); + if (wolfSSL_CTX_LoadCRL(ctx, crlDir != NULL ? crlDir : crlPemDir, + WOLFSSL_FILETYPE_PEM, crlFlags) != WOLFSSL_SUCCESS) + err_sys_ex(runWithErrors, "unable to load CRL"); + if (wolfSSL_CTX_SetCRL_Cb(ctx, CRL_CallBack) != WOLFSSL_SUCCESS) + err_sys_ex(runWithErrors, "unable to set CRL callback url"); + } +#endif while (1) { @@ -2864,8 +2966,9 @@ err_sys_ex(runWithErrors, "tcp accept failed"); } } -#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) - fprintf(stderr, "Before creating SSL\n"); +#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) && \ + !defined(WOLFSSL_STATIC_MEMORY_LEAN) + LOG_ERROR("Before creating SSL\n"); if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) err_sys_ex(runWithErrors, "ctx not using static memory"); if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ @@ -2953,8 +3056,9 @@ } #endif -#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) - fprintf(stderr, "After creating SSL\n"); +#if defined(WOLFSSL_STATIC_MEMORY) && defined(DEBUG_WOLFSSL) && \ + !defined(WOLFSSL_STATIC_MEMORY_LEAN) + LOG_ERROR("After creating SSL\n"); if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) != 1) err_sys_ex(runWithErrors, "ctx not using static memory"); if (wolfSSL_PrintStats(&mem_stats) != 1) /* function in test.h */ @@ -3022,20 +3126,6 @@ #ifndef NO_HANDSHAKE_DONE_CB wolfSSL_SetHsDoneCb(ssl, myHsDoneCb, NULL); #endif -#if defined(HAVE_CRL) && !defined(NO_FILESYSTEM) - if (!disableCRL) { -#ifdef HAVE_CRL_MONITOR - crlFlags = WOLFSSL_CRL_MONITOR | WOLFSSL_CRL_START_MON; -#endif - if (wolfSSL_EnableCRL(ssl, 0) != WOLFSSL_SUCCESS) - err_sys_ex(runWithErrors, "unable to enable CRL"); - if (wolfSSL_LoadCRL(ssl, crlPemDir, WOLFSSL_FILETYPE_PEM, crlFlags) - != WOLFSSL_SUCCESS) - err_sys_ex(runWithErrors, "unable to load CRL"); - if (wolfSSL_SetCRL_Cb(ssl, CRL_CallBack) != WOLFSSL_SUCCESS) - err_sys_ex(runWithErrors, "unable to set CRL callback url"); - } -#endif #ifdef HAVE_OCSP if (useOcsp) { if (ocspUrl != NULL) { @@ -3097,7 +3187,7 @@ #ifdef CAN_FORCE_CURVE if (force_curve_group_id > 0) { do { - ret = wolfSSL_UseKeyShare(ssl, force_curve_group_id); + ret = wolfSSL_UseKeyShare(ssl, (word16)force_curve_group_id); if (ret == WOLFSSL_SUCCESS) { } @@ -3285,6 +3375,11 @@ } #endif /* WOLFSSL_DTLS_CID */ +#ifdef WOLFSSL_DTLS_CH_FRAG + if (doDTLS) + wolfSSL_dtls13_allow_ch_frag(ssl, 1); +#endif + #ifndef WOLFSSL_CALLBACKS if (nonBlocking) { #ifdef WOLFSSL_DTLS @@ -3304,7 +3399,7 @@ err = 0; /* reset error */ ret = wolfSSL_read_early_data(ssl, input, sizeof(input)-1, &len); - if (ret != WOLFSSL_SUCCESS) { + if (ret <= 0) { err = SSL_get_error(ssl, 0); #ifdef WOLFSSL_ASYNC_CRYPT if (err == WC_PENDING_E) { @@ -3338,7 +3433,14 @@ } while (err == WC_PENDING_E); } #else - (void)nonBlocking; + if (nonBlocking) { + #ifdef WOLFSSL_DTLS + if (doDTLS) { + wolfSSL_dtls_set_using_nonblock(ssl, 1); + } + #endif + tcp_set_nonblocking(&clientfd); + } ret = NonBlockingSSL_Accept(ssl); #endif #ifdef WOLFSSL_EARLY_DATA @@ -3346,8 +3448,8 @@ #endif if (ret != WOLFSSL_SUCCESS) { err = SSL_get_error(ssl, 0); - fprintf(stderr, "SSL_accept error %d, %s\n", err, - ERR_error_string(err, buffer)); + LOG_ERROR("SSL_accept error %d, %s\n", err, + ERR_error_string((unsigned long)err, buffer)); if (!exitWithRet) { err_sys_ex(runWithErrors, "SSL_accept failed"); } else { @@ -3560,7 +3662,7 @@ } if (ret != WOLFSSL_SUCCESS) { err = wolfSSL_get_error(ssl, 0); - fprintf(stderr, + LOG_ERROR( "wolfSSL_Rehandshake error %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer)); wolfSSL_free(ssl); ssl = NULL; @@ -3620,10 +3722,10 @@ #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) if (sendTicket) { if (wolfSSL_send_SessionTicket(ssl) != WOLFSSL_SUCCESS) { - fprintf(stderr, "Sending new session ticket failed\n"); + LOG_ERROR("Sending new session ticket failed\n"); } else { - fprintf(stderr, "New session ticket sent\n"); + LOG_ERROR("New session ticket sent\n"); } } #endif @@ -3692,21 +3794,21 @@ break; } else if (ret != WOLFSSL_SHUTDOWN_NOT_DONE) { - fprintf(stderr, "Bidirectional shutdown failed\n"); + LOG_ERROR("Bidirectional shutdown failed\n"); break; } } if (ret != WOLFSSL_SUCCESS) - fprintf(stderr, "Bidirectional shutdown failed\n"); + LOG_ERROR("Bidirectional shutdown failed\n"); } /* display collected statistics */ -#ifdef WOLFSSL_STATIC_MEMORY +#if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) if (wolfSSL_is_static_memory(ssl, &ssl_stats) != 1) err_sys_ex(runWithErrors, "static memory was not used with ssl"); - fprintf(stderr, "\nprint off SSL memory stats\n"); - fprintf(stderr, "*** This is memory state before wolfSSL_free is " + LOG_ERROR("\nprint off SSL memory stats\n"); + LOG_ERROR("*** This is memory state before wolfSSL_free is " "called\n"); wolfSSL_PrintStatsConn(&ssl_stats); @@ -3722,8 +3824,12 @@ resumeCount = 0; cnt++; - if (loops > 0 && --loops == 0) { - break; /* out of while loop, done with normal and resume option */ + if (loops > 0) { + if (--loops == 0) { + break; /* out of while loop, done with normal and resume + * option + */ + } } } /* while(1) */ @@ -3746,7 +3852,7 @@ wolfsentry_ret = wolfsentry_shutdown(WOLFSENTRY_CONTEXT_ARGS_OUT_EX4(&wolfsentry, NULL)); if (wolfsentry_ret < 0) { - fprintf(stderr, + LOG_ERROR( "wolfsentry_shutdown() returned " WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(wolfsentry_ret)); } @@ -3785,9 +3891,7 @@ #if defined(WOLFSSL_CALLBACKS) && defined(WOLFSSL_EARLY_DATA) (void) earlyData; #endif -#ifndef WOLFSSL_TIRTOS - return 0; -#endif + WOLFSSL_RETURN_FROM_THREAD(0); } #endif /* !NO_WOLFSSL_SERVER */ @@ -3807,7 +3911,7 @@ args.argv = argv; args.signal = &ready; args.return_code = 0; -#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND) args.srtp_helper = NULL; #endif InitTcpReady(&ready); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.h mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.h 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,7 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args); /* Echo bytes using buffer of blockSize until [echoData] bytes are complete. */ -/* If [bechmarkThroughput] set the statistcs will be output at the end */ +/* If [benchmarkThroughput] set the statistics will be output at the end */ int ServerEchoData(WOLFSSL* ssl, int clientfd, int echoData, int blockSize, size_t benchmarkThroughput); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.vcproj 2024-08-03 07:30:00.000000000 +0000 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -117,7 +117,7 @@ Optimization="2" EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="../../;../../IDE/WIN" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/examples/server/server.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/examples/server/server.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -159,7 +159,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -179,7 +179,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -200,7 +200,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -218,7 +218,7 @@ Disabled ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;_DEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -237,7 +237,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -259,7 +259,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -281,7 +281,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -302,7 +302,7 @@ MaxSpeed true ../../;../../IDE/WIN;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WIN32;NDEBUG;_CONSOLE;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/fips-check.sh mariadb-10.11.9/extra/wolfssl/wolfssl/fips-check.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/fips-check.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/fips-check.sh 2024-08-03 07:30:00.000000000 +0000 @@ -7,291 +7,287 @@ # copy of our FIPS approved code. # # This should check out all the approved flavors. The command line -# option selects the flavor. -# -# $ ./fips-check [flavor] [keep] -# -# - flavor: linux (default), ios, android, windows, freertos, linux-ecc, netbsd-selftest, linuxv2, fipsv2-OE-ready, stm32l4-v2, linuxv5, fips-ready, fips-dev -# -# - keep: (default off) XXX-fips-test temp dir around for inspection -# +# option selects the flavor. The keep option keeps the output +# directory. + +# These variables may be overridden on the command line. +MAKE="${MAKE:-make}" +GIT="${GIT:-git -c advice.detachedHead=false}" +TEST_DIR="${TEST_DIR:-XXX-fips-test}" +FLAVOR="${FLAVOR:-linux}" +KEEP="${KEEP:-no}" +MAKECHECK=${MAKECHECK:-yes} +FIPS_REPO="${FIPS_REPO:-git@github.com:wolfssl/fips.git}" Usage() { cat </dev/null + then + $GIT branch --no-track "my$tag" "$tag" || exit $? fi + $GIT checkout "my$tag" -- "$name" || exit $? done +} - for MOD in "${COPY_DIRECT[@]}" - do - $GIT checkout "my$CRYPT_VERSION" -- "$MOD" || exit $? +# copy_fips_files takes an array of pairs of file paths and git tags to +# checkout. It will check to see if mytag exists and if now will make that +# tag a branch. It breaks the filepath apart into file name and path, then +# copies it from the file from the fips directory to the path. +function copy_fips_files() { + local name + local bname + local dname + local tag + for file_entry in "$@"; do + name=${file_entry%%:*} + tag=${file_entry#*:} + bname=$(basename "$name") + dname=$(dirname "$name") + if ! $GIT rev-parse -q --verify "my$tag" >/dev/null; then + $GIT branch --no-track "my$tag" "$tag" || exit $? + fi + $GIT checkout "my$tag" -- "$bname" || exit $? + cp "$bname" "../$dname" done +} - $GIT branch --no-track "myrng$RNG_VERSION" "$RNG_VERSION" || exit $? - # Checkout the fips versions of the wolfCrypt files from the repo. - $GIT checkout "myrng$RNG_VERSION" -- "$CRYPT_SRC_PATH/random.c" "$CRYPT_INC_PATH/random.h" || exit $? - ;; - -*) - echo "fips-check: Invalid FIPS option \"${FIPS_OPTION}\"." +if ! $GIT clone . "$TEST_DIR"; then + echo "fips-check: Couldn't duplicate current working directory." exit 1 - ;; -esac +fi -# clone the FIPS repository -case "$FIPS_OPTION" in - *dev) - if ! $GIT clone --depth 1 "$FIPS_REPO" fips; then - echo "fips-check: Couldn't check out the FIPS repository for fips-dev." - exit 1 - fi - ;; - *) - if ! $GIT clone --depth 1 -b "$FIPS_VERSION" "$FIPS_REPO" fips; then - echo "fips-check: Couldn't check out ${FIPS_VERSION} from repository ${FIPS_REPO}." - exit 1 - fi - ;; -esac +pushd "$TEST_DIR" || exit 2 -for SRC in "${FIPS_SRCS[@]}" -do - cp "fips/$SRC" "$CRYPT_SRC_PATH" -done +if ! $GIT clone "$FIPS_REPO" fips; then + echo "fips-check: Couldn't check out FIPS repository." + exit 1 +fi -for INC in "${FIPS_INCS[@]}" -do - cp "fips/$INC" "$CRYPT_INC_PATH" -done +checkout_files "${WOLFCRYPT_FILES[@]}" || exit 3 +pushd fips || exit 2 +copy_fips_files "${FIPS_FILES[@]}" || exit 3 +popd || exit 2 # When checking out cert 3389 ready code, NIST will no longer perform # new certifications on 140-2 modules. If we were to use the latest files from @@ -415,62 +357,49 @@ # Since OE additions can still be processed for cert3389 we will call 140-2 # ready "fipsv2-OE-ready" indicating it is ready to use for an OE addition but # would not be good for a new certification effort with the latest files. -if [ "$FLAVOR" = "fipsv2-OE-ready" ]; then - OLD_VERSION=" return \"v4.0.0-alpha\";" - OE_READY_VERSION=" return \"fipsv2-OE-ready\";" - cp "${CRYPT_SRC_PATH}/fips.c" "${CRYPT_SRC_PATH}/fips.c.bak" - sed "s/^${OLD_VERSION}/${OE_READY_VERSION}/" "${CRYPT_SRC_PATH}/fips.c.bak" >"${CRYPT_SRC_PATH}/fips.c" +if [ "$FLAVOR" = 'fipsv2-OE-ready' ] && [ -s wolfcrypt/src/fips.c ]; then + cp wolfcrypt/src/fips.c wolfcrypt/src/fips.c.bak + sed "s/v4.0.0-alpha/fipsv2-OE-ready/" wolfcrypt/src/fips.c.bak >wolfcrypt/src/fips.c fi # run the make test ./autogen.sh -if [ "$CAVP_SELFTEST_ONLY" == "yes" ]; -then - if [ "$CAVP_SELFTEST_OPTION" == "v2" ] - then - ./configure --enable-selftest=v2 - else - ./configure --enable-selftest - fi -else + +case "$FIPS_OPTION" in +cavp-selftest) + ./configure --enable-selftest + ;; +cavp-selftest-v2) + ./configure --enable-selftest=v2 + ;; +*) ./configure --enable-fips=$FIPS_OPTION -fi + ;; +esac + if ! $MAKE; then - echo "fips-check: Make failed. Debris left for analysis." + echo 'fips-check: Make failed. Debris left for analysis.' exit 3 fi -if [ "$CAVP_SELFTEST_ONLY" == "no" ]; -then +if [ -s wolfcrypt/src/fips_test.c ]; then NEWHASH=$(./wolfcrypt/test/testwolfcrypt | sed -n 's/hash = \(.*\)/\1/p') if [ -n "$NEWHASH" ]; then - cp "${CRYPT_SRC_PATH}/fips_test.c" "${CRYPT_SRC_PATH}/fips_test.c.bak" - sed "s/^\".*\";/\"${NEWHASH}\";/" "${CRYPT_SRC_PATH}/fips_test.c.bak" >"${CRYPT_SRC_PATH}/fips_test.c" + cp wolfcrypt/src/fips_test.c wolfcrypt/src/fips_test.c.bak + sed "s/^\".*\";/\"${NEWHASH}\";/" wolfcrypt/src/fips_test.c.bak >wolfcrypt/src/fips_test.c make clean fi fi -if ! $MAKE test; then - echo "fips-check: Test failed. Debris left for analysis." - exit 3 -fi - -if [ ${#FIPS_CONFLICTS[@]} -ne 0 ]; -then - echo "Due to the way this package is compiled by the customer duplicate" - echo "source file names are an issue, renaming:" - for FNAME in "${FIPS_CONFLICTS[@]}" - do - echo "wolfcrypt/src/$FNAME.c to wolfcrypt/src/wc_$FNAME.c" - mv "./wolfcrypt/src/$FNAME.c" "./wolfcrypt/src/wc_$FNAME.c" - done - echo "Confirming files were renamed..." - ls -la ./wolfcrypt/src/wc_*.c +if [ "$MAKECHECK" = "yes" ]; then + if ! $MAKE check; then + echo 'fips-check: Test failed. Debris left for analysis.' + exit 3 + fi fi # Clean up popd || exit 2 -if [ "$KEEP" == "no" ]; -then +if [ "$KEEP" = 'no' ]; then rm -rf "$TEST_DIR" fi diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/gencertbuf.pl mariadb-10.11.9/extra/wolfssl/wolfssl/gencertbuf.pl --- mariadb-10.11.6/extra/wolfssl/wolfssl/gencertbuf.pl 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/gencertbuf.pl 2024-08-03 07:30:00.000000000 +0000 @@ -19,18 +19,19 @@ # Used with HAVE_ECC && USE_CERT_BUFFERS_256 my @fileList_ecc = ( - [ "./certs/ecc-client-key.der", "ecc_clikey_der_256" ], - [ "./certs/ecc-client-keyPub.der", "ecc_clikeypub_der_256" ], - [ "./certs/client-ecc-cert.der", "cliecc_cert_der_256" ], - [ "./certs/ecc-key.der", "ecc_key_der_256" ], - [ "./certs/ecc-keyPub.der", "ecc_key_pub_der_256" ], - [ "./certs/server-ecc-comp.der", "serv_ecc_comp_der_256" ], - [ "./certs/server-ecc-rsa.der", "serv_ecc_rsa_der_256" ], - [ "./certs/server-ecc.der", "serv_ecc_der_256" ], - [ "./certs/ca-ecc-key.der", "ca_ecc_key_der_256" ], - [ "./certs/ca-ecc-cert.der", "ca_ecc_cert_der_256" ], - [ "./certs/ca-ecc384-key.der", "ca_ecc_key_der_384" ], - [ "./certs/ca-ecc384-cert.der", "ca_ecc_cert_der_384" ] + [ "./certs/ecc-client-key.der", "ecc_clikey_der_256" ], + [ "./certs/ecc-client-keyPub.der", "ecc_clikeypub_der_256" ], + [ "./certs/client-ecc-cert.der", "cliecc_cert_der_256" ], + [ "./certs/ecc-key.der", "ecc_key_der_256" ], + [ "./certs/ecc-keyPub.der", "ecc_key_pub_der_256" ], + [ "./certs/statickeys/ecc-secp256r1.der", "ecc_secp_r1_statickey_der_256" ], + [ "./certs/server-ecc-comp.der", "serv_ecc_comp_der_256" ], + [ "./certs/server-ecc-rsa.der", "serv_ecc_rsa_der_256" ], + [ "./certs/server-ecc.der", "serv_ecc_der_256" ], + [ "./certs/ca-ecc-key.der", "ca_ecc_key_der_256" ], + [ "./certs/ca-ecc-cert.der", "ca_ecc_cert_der_256" ], + [ "./certs/ca-ecc384-key.der", "ca_ecc_key_der_384" ], + [ "./certs/ca-ecc384-cert.der", "ca_ecc_cert_der_384" ] ); @@ -44,6 +45,14 @@ [ "./certs/ed25519/client-ed25519-key.der", "client_ed25519_key" ] ); +# x25519 keys and certs +# Used with USE_CERT_BUFFERS_25519 define. +my @fileList_x = ( + [ "./certs/statickeys/x25519.der", "x25519_statickey_der" ], + [ "./certs/statickeys/x25519-pub.der", "x25519_pub_statickey_der" ] + ); + + # 1024-bit certs/keys to be converted # Used with USE_CERT_BUFFERS_1024 define. @@ -68,6 +77,8 @@ [ "./certs/client-cert.der", "client_cert_der_2048" ], [ "./certs/dh2048.der", "dh_key_der_2048" ], [ "./certs/dh-pubkey-2048.der", "dh_pub_key_der_2048" ], + [ "./certs/statickeys/dh-ffdhe2048.der", "dh_ffdhe_statickey_der_2048" ], + [ "./certs/statickeys/dh-ffdhe2048-pub.der", "dh_ffdhe_pub_statickey_der_2048" ], [ "./certs/dsa-pubkey-2048.der", "dsa_pub_key_der_2048" ], [ "./certs/dsa2048.der", "dsa_key_der_2048" ], [ "./certs/rsa2048.der", "rsa_key_der_2048" ], @@ -129,6 +140,7 @@ my $num_ecc = @fileList_ecc; my $num_ed = @fileList_ed; +my $num_x = @fileList_x; my $num_1024 = @fileList_1024; my $num_2048 = @fileList_2048; my $num_3072 = @fileList_3072; @@ -358,6 +370,24 @@ } print OUT_FILE "#endif /* HAVE_ED25519 */\n\n"; + +# convert and print CURVE25519 cert/keys +print OUT_FILE "#if defined(USE_CERT_BUFFERS_25519)\n\n"; +for (my $i = 0; $i < $num_x; $i++) { + + my $fname = $fileList_x[$i][0]; + my $sname = $fileList_x[$i][1]; + + print OUT_FILE "/* $fname, CURVE25519 */\n"; + print OUT_FILE "static const unsigned char $sname\[] =\n"; + print OUT_FILE "{\n"; + file_to_hex($fname); + print OUT_FILE "};\n"; + print OUT_FILE "static const int sizeof_$sname = sizeof($sname);\n\n"; +} +print OUT_FILE "#endif /* USE_CERT_BUFFERS_25519 */\n\n"; + + print OUT_FILE "#endif /* WOLFSSL_CERTS_TEST_H */\n\n"; # close certs_test.h file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/lib/dummy mariadb-10.11.9/extra/wolfssl/wolfssl/lib/dummy --- mariadb-10.11.6/extra/wolfssl/wolfssl/lib/dummy 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/lib/dummy 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -// this is a dummy file - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/Kbuild mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/Kbuild --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/Kbuild 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/Kbuild 2024-08-03 07:30:00.000000000 +0000 @@ -32,6 +32,10 @@ ifeq "$(KERNEL_ARCH)" "x86" WOLFSSL_CFLAGS += -mpreferred-stack-boundary=4 +else ifeq "$(KERNEL_ARCH)" "aarch64" + WOLFSSL_CFLAGS += -mno-outline-atomics +else ifeq "$(KERNEL_ARCH)" "arm64" + WOLFSSL_CFLAGS += -mno-outline-atomics endif obj-m := libwolfssl.o @@ -47,9 +51,14 @@ # this mechanism only works in kernel 5.x+ (fallback to hardcoded value) hostprogs := linuxkm/get_thread_size always-y := $(hostprogs) + +HOST_EXTRACFLAGS += $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CFLAGS) -static -fno-omit-frame-pointer + # "-mindirect-branch=keep -mfunction-return=keep" to avoid "undefined reference # to `__x86_return_thunk'" on CONFIG_RETHUNK kernels (5.19.0-rc7) -HOST_EXTRACFLAGS += $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CFLAGS) -static -fno-omit-frame-pointer -mindirect-branch=keep -mfunction-return=keep +ifeq "$(KERNEL_ARCH)" "x86" + HOST_EXTRACFLAGS += -mindirect-branch=keep -mfunction-return=keep +endif # this rule is needed to get build to succeed in 4.x (get_thread_size still doesn't get built) $(obj)/linuxkm/get_thread_size: $(src)/linuxkm/get_thread_size.c @@ -90,10 +99,8 @@ $(obj)/linuxkm/module_hooks.o: ccflags-y += $(PIE_SUPPORT_FLAGS) endif -ifeq "$(ENABLED_LINUXKM_BENCHMARKS)" "yes" - $(obj)/linuxkm/module_hooks.o: ccflags-y = $(WOLFSSL_CFLAGS) $(CFLAGS_FPU_ENABLE) $(CFLAGS_SIMD_ENABLE) $(PIE_SUPPORT_FLAGS) - $(obj)/linuxkm/module_hooks.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_ENABLE_SIMD_DISABLE) -endif +$(obj)/wolfcrypt/benchmark/benchmark.o: ccflags-y = $(WOLFSSL_CFLAGS) $(CFLAGS_FPU_ENABLE) $(CFLAGS_SIMD_ENABLE) $(PIE_SUPPORT_FLAGS) -DNO_MAIN_FUNCTION +$(obj)/wolfcrypt/benchmark/benchmark.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_ENABLE_SIMD_DISABLE) asflags-y := $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPUSIMD_DISABLE) @@ -103,8 +110,20 @@ $(obj)/wolfcrypt/src/aes_asm.o: OBJECT_FILES_NON_STANDARD := y $(obj)/wolfcrypt/src/aes_gcm_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) $(obj)/wolfcrypt/src/aes_gcm_asm.o: OBJECT_FILES_NON_STANDARD := y +$(obj)/wolfcrypt/src/aes_xts_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) +$(obj)/wolfcrypt/src/aes_xts_asm.o: OBJECT_FILES_NON_STANDARD := y $(obj)/wolfcrypt/src/sp_x86_64_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) $(obj)/wolfcrypt/src/sp_x86_64_asm.o: OBJECT_FILES_NON_STANDARD := y +$(obj)/wolfcrypt/src/sha256_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) +$(obj)/wolfcrypt/src/sha256_asm.o: OBJECT_FILES_NON_STANDARD := y +$(obj)/wolfcrypt/src/sha512_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) +$(obj)/wolfcrypt/src/sha512_asm.o: OBJECT_FILES_NON_STANDARD := y +$(obj)/wolfcrypt/src/sha3_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) +$(obj)/wolfcrypt/src/sha3_asm.o: OBJECT_FILES_NON_STANDARD := y +$(obj)/wolfcrypt/src/chacha_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) +$(obj)/wolfcrypt/src/chacha_asm.o: OBJECT_FILES_NON_STANDARD := y +$(obj)/wolfcrypt/src/poly1305_asm.o: asflags-y = $(WOLFSSL_ASFLAGS) $(ASFLAGS_FPU_DISABLE_SIMD_ENABLE) +$(obj)/wolfcrypt/src/poly1305_asm.o: OBJECT_FILES_NON_STANDARD := y ifeq "$(ENABLED_LINUXKM_PIE)" "yes" @@ -147,20 +166,20 @@ endif @cd "$(obj)" || exit $$?; \ for file in $(WOLFCRYPT_PIE_FILES); do \ - $(OBJCOPY) --rename-section .text=.text.wolfcrypt --rename-section .data=.data.wolfcrypt "$$file" || exit $$?; \ + $(OBJCOPY) --rename-section .text=.text.wolfcrypt --rename-section .data=.data.wolfcrypt --rename-section .rodata=.rodata.wolfcrypt "$$file" || exit $$?; \ done ifneq "$(quiet)" "silent_" - @echo ' wolfCrypt .{text,data} sections containerized to .{text,data}.wolfcrypt' + @echo ' wolfCrypt .{text,data,rodata} sections containerized to .{text,data,rodata}.wolfcrypt' endif -$(src)/linuxkm/module_exports.c: rename-pie-text-and-data-sections +$(obj)/linuxkm/module_exports.c: rename-pie-text-and-data-sections endif # auto-generate the exported symbol list, leveraging the WOLFSSL_API visibility tags. # exclude symbols that don't match wc_* or wolf*. -$(src)/linuxkm/module_exports.c: $(src)/linuxkm/module_exports.c.template $(WOLFSSL_OBJ_TARGETS) +$(obj)/linuxkm/module_exports.c: $(src)/module_exports.c.template $(WOLFSSL_OBJ_TARGETS) @cp $< $@ @readelf --symbols --wide $(WOLFSSL_OBJ_TARGETS) | \ awk '/^ *[0-9]+: / { \ @@ -171,4 +190,4 @@ }' >> $@ @echo -e '#ifndef NO_CRYPT_TEST\nEXPORT_SYMBOL_NS_GPL(wolfcrypt_test, WOLFSSL);\n#endif' >> $@ -clean-files := module_exports.c linuxkm src wolfcrypt/src wolfcrypt/test wolfcrypt +clean-files := linuxkm src wolfcrypt diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/Makefile mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/Makefile --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/Makefile 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/Makefile 2024-08-03 07:30:00.000000000 +0000 @@ -47,6 +47,10 @@ WOLFSSL_CFLAGS+=-DNO_CRYPT_TEST endif +ifeq "$(ENABLED_LINUXKM_BENCHMARKS)" "yes" + WOLFSSL_OBJ_FILES+=wolfcrypt/benchmark/benchmark.o +endif + ifeq "$(ENABLED_LINUXKM_PIE)" "yes" WOLFCRYPT_PIE_FILES := linuxkm/pie_first.o $(filter wolfcrypt/src/%,$(WOLFSSL_OBJ_FILES)) linuxkm/pie_redirect_table.o linuxkm/pie_last.o WOLFSSL_OBJ_FILES := $(WOLFCRYPT_PIE_FILES) $(filter-out $(WOLFCRYPT_PIE_FILES),$(WOLFSSL_OBJ_FILES)) @@ -58,12 +62,16 @@ @if test -z "$(KERNEL_ROOT)"; then echo '$$KERNEL_ROOT is unset' >&2; exit 1; fi @if test -z "$(AM_CFLAGS)$(CFLAGS)"; then echo '$$AM_CFLAGS and $$CFLAGS are both unset.' >&2; exit 1; fi @if test -z "$(src_libwolfssl_la_OBJECTS)"; then echo '$$src_libwolfssl_la_OBJECTS is unset.' >&2; exit 1; fi - @mkdir -p linuxkm src wolfcrypt/src wolfcrypt/test @if test ! -h $(SRC_TOP)/Kbuild; then ln -s $(MODULE_TOP)/Kbuild $(SRC_TOP)/Kbuild; fi + # after commit 9a0ebe5011 (6.10), sources must be in $(obj). work around this by making links to all needed sources: + @mkdir -p linuxkm + @cp --no-dereference --symbolic-link --no-clobber '$(MODULE_TOP)'/*.[ch] '$(MODULE_TOP)'/linuxkm/ + @cp --no-dereference --symbolic-link --no-clobber --recursive '$(SRC_TOP)'/wolfcrypt '$(MODULE_TOP)'/ + @cp --no-dereference --symbolic-link --no-clobber --recursive '$(SRC_TOP)'/src '$(MODULE_TOP)'/ ifeq "$(ENABLED_LINUXKM_PIE)" "yes" - +$(MAKE) -C $(KERNEL_ROOT) M=$(MODULE_TOP) src=$(SRC_TOP) $(KBUILD_EXTRA_FLAGS) CC_FLAGS_FTRACE= + +$(MAKE) -C $(KERNEL_ROOT) M=$(MODULE_TOP) $(KBUILD_EXTRA_FLAGS) CC_FLAGS_FTRACE= else - +$(MAKE) -C $(KERNEL_ROOT) M=$(MODULE_TOP) src=$(SRC_TOP) $(KBUILD_EXTRA_FLAGS) + +$(MAKE) -C $(KERNEL_ROOT) M=$(MODULE_TOP) $(KBUILD_EXTRA_FLAGS) endif libwolfssl.ko.signed: libwolfssl.ko diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -12,4 +12,6 @@ linuxkm/pie_redirect_table.c \ linuxkm/pie_last.c \ linuxkm/linuxkm_memory.c \ - linuxkm/linuxkm_wc_port.h + linuxkm/linuxkm_wc_port.h \ + linuxkm/lkcapi_glue.c \ + linuxkm/x86_vector_register_glue.c diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/linuxkm_memory.c mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/linuxkm_memory.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/linuxkm_memory.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/linuxkm_memory.c 2024-08-03 07:30:00.000000000 +0000 @@ -71,214 +71,6 @@ } #endif /* HAVE_KVMALLOC */ -#if defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) && defined(CONFIG_X86) - -static unsigned int wc_linuxkm_fpu_states_n_tracked = 0; - -struct wc_thread_fpu_count_ent { - volatile pid_t pid; - unsigned int fpu_state; -}; -struct wc_thread_fpu_count_ent *wc_linuxkm_fpu_states = NULL; -#define WC_FPU_COUNT_MASK 0x7fffffffU -#define WC_FPU_SAVED_MASK 0x80000000U - -WARN_UNUSED_RESULT int allocate_wolfcrypt_linuxkm_fpu_states(void) -{ - if (wc_linuxkm_fpu_states != NULL) { - static int warned_for_repeat_alloc = 0; - if (! warned_for_repeat_alloc) { - pr_err("attempt at repeat allocation" - " in allocate_wolfcrypt_linuxkm_fpu_states\n"); - warned_for_repeat_alloc = 1; - } - return BAD_STATE_E; - } - - if (nr_cpu_ids >= 16) - wc_linuxkm_fpu_states_n_tracked = nr_cpu_ids * 2; - else - wc_linuxkm_fpu_states_n_tracked = 32; - - wc_linuxkm_fpu_states = - (struct wc_thread_fpu_count_ent *)malloc( - wc_linuxkm_fpu_states_n_tracked * sizeof(wc_linuxkm_fpu_states[0])); - - if (! wc_linuxkm_fpu_states) { - pr_err("allocation of %lu bytes for " - "wc_linuxkm_fpu_states failed.\n", - nr_cpu_ids * sizeof(struct fpu_state *)); - return MEMORY_E; - } - - memset(wc_linuxkm_fpu_states, 0, wc_linuxkm_fpu_states_n_tracked * sizeof(wc_linuxkm_fpu_states[0])); - - return 0; -} - -void free_wolfcrypt_linuxkm_fpu_states(void) { - struct wc_thread_fpu_count_ent *i, *i_endptr; - pid_t i_pid; - - if (wc_linuxkm_fpu_states == NULL) { - pr_err("free_wolfcrypt_linuxkm_fpu_states called" - " before allocate_wolfcrypt_linuxkm_fpu_states.\n"); - return; - } - - for (i = wc_linuxkm_fpu_states, - i_endptr = &wc_linuxkm_fpu_states[wc_linuxkm_fpu_states_n_tracked]; - i < i_endptr; - ++i) - { - i_pid = __atomic_load_n(&i->pid, __ATOMIC_CONSUME); - if (i_pid == 0) - continue; - if (i->fpu_state != 0) { - pr_err("free_wolfcrypt_linuxkm_fpu_states called" - " with nonzero state 0x%x for pid %d.\n", i->fpu_state, i_pid); - i->fpu_state = 0; - } - } - - free(wc_linuxkm_fpu_states); - wc_linuxkm_fpu_states = NULL; -} - -/* lock-(mostly)-free thread-local storage facility for tracking recursive fpu pushing/popping */ -static struct wc_thread_fpu_count_ent *wc_linuxkm_fpu_state_assoc(int create_p) { - struct wc_thread_fpu_count_ent *i, *i_endptr, *i_empty; - pid_t my_pid = task_pid_nr(current), i_pid; - - { - static int _warned_on_null = 0; - if (wc_linuxkm_fpu_states == NULL) - { - if (_warned_on_null == 0) { - pr_err("wc_linuxkm_fpu_state_assoc called by pid %d" - " before allocate_wolfcrypt_linuxkm_fpu_states.\n", my_pid); - _warned_on_null = 1; - } - return NULL; - } - } - - i_endptr = &wc_linuxkm_fpu_states[wc_linuxkm_fpu_states_n_tracked]; - - for (;;) { - for (i = wc_linuxkm_fpu_states, - i_empty = NULL; - i < i_endptr; - ++i) - { - i_pid = __atomic_load_n(&i->pid, __ATOMIC_CONSUME); - if (i_pid == my_pid) - return i; - if ((i_empty == NULL) && (i_pid == 0)) - i_empty = i; - } - if ((i_empty == NULL) || (! create_p)) - return NULL; - - i_pid = 0; - if (__atomic_compare_exchange_n( - &(i_empty->pid), - &i_pid, - my_pid, - 0 /* weak */, - __ATOMIC_SEQ_CST /* success_memmodel */, - __ATOMIC_SEQ_CST /* failure_memmodel */)) - { - return i_empty; - } - } -} - -static void wc_linuxkm_fpu_state_free(struct wc_thread_fpu_count_ent *ent) { - if (ent->fpu_state != 0) { - static int warned_nonzero_fpu_state = 0; - if (! warned_nonzero_fpu_state) { - pr_err("wc_linuxkm_fpu_state_free for pid %d" - " with nonzero fpu_state 0x%x.\n", ent->pid, ent->fpu_state); - warned_nonzero_fpu_state = 1; - } - ent->fpu_state = 0; - } - __atomic_store_n(&ent->pid, 0, __ATOMIC_RELEASE); -} - -WARN_UNUSED_RESULT int save_vector_registers_x86(void) -{ - struct wc_thread_fpu_count_ent *pstate = wc_linuxkm_fpu_state_assoc(1); - if (pstate == NULL) - return ENOMEM; - - /* allow for nested calls */ - if (pstate->fpu_state != 0U) { - if ((pstate->fpu_state & WC_FPU_COUNT_MASK) - == WC_FPU_COUNT_MASK) - { - pr_err("save_vector_registers_x86 recursion register overflow for " - "pid %d.\n", pstate->pid); - return BAD_STATE_E; - } else { - ++pstate->fpu_state; - return 0; - } - } - - if (irq_fpu_usable()) { -#if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) - /* inhibit migration, which gums up the algorithm in kernel_fpu_{begin,end}(). */ - migrate_disable(); -#endif - kernel_fpu_begin(); - pstate->fpu_state = 1U; /* set msb 0 to trigger kernel_fpu_end() at cleanup. */ - } else if (in_nmi() || (hardirq_count() > 0) || (softirq_count() > 0)) { - static int warned_fpu_forbidden = 0; - if (! warned_fpu_forbidden) - pr_err("save_vector_registers_x86 called from IRQ handler.\n"); - wc_linuxkm_fpu_state_free(pstate); - return EPERM; - } else { -#if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) - migrate_disable(); -#endif - /* assume already safely in_kernel_fpu. */ - pstate->fpu_state = - WC_FPU_SAVED_MASK + 1U; /* set msb 1 to inhibit kernel_fpu_end() at cleanup. */ - } - - return 0; -} - -void restore_vector_registers_x86(void) -{ - struct wc_thread_fpu_count_ent *pstate = wc_linuxkm_fpu_state_assoc(0); - if (pstate == NULL) { - pr_err("restore_vector_registers_x86 called by pid %d " - "with no saved state.\n", task_pid_nr(current)); - return; - } - - if ((--pstate->fpu_state & WC_FPU_COUNT_MASK) > 0U) { - return; - } - - if (pstate->fpu_state == 0U) - kernel_fpu_end(); - else - pstate->fpu_state = 0U; -#if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) - migrate_enable(); -#endif - - wc_linuxkm_fpu_state_free(pstate); - - return; -} -#endif /* WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS && CONFIG_X86 */ - #if defined(__PIE__) && (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)) /* needed in 6.1+ because show_free_areas() static definition in mm.h calls * __show_free_areas(), which isn't exported (neither was show_free_areas()). @@ -294,3 +86,11 @@ return; } #endif + +#if defined(__PIE__) && defined(CONFIG_FORTIFY_SOURCE) +/* needed because FORTIFY_SOURCE inline implementations call fortify_panic(). */ +void __my_fortify_panic(const char *name) { + pr_emerg("__my_fortify_panic in %s\n", name); + BUG(); +} +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/linuxkm_wc_port.h mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/linuxkm_wc_port.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/linuxkm_wc_port.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/linuxkm_wc_port.h 2024-08-03 07:30:00.000000000 +0000 @@ -65,8 +65,8 @@ (int)_xatoi_res; \ }) - /* Kbuild+gcc on x86 doesn't consistently honor the default ALIGN16 on stack objects, - * but gives adequate alignment with "32". + /* Kbuild+gcc on x86 doesn't consistently honor the default ALIGN16 on stack + * objects, but gives adequate alignment with "32". */ #if defined(CONFIG_X86) && !defined(ALIGN16) #define ALIGN16 __attribute__ ( (aligned (32))) @@ -115,12 +115,138 @@ _Pragma("GCC diagnostic ignored \"-Wdiscarded-qualifiers\""); _Pragma("GCC diagnostic ignored \"-Wtype-limits\""); _Pragma("GCC diagnostic ignored \"-Wswitch-enum\""); + _Pragma("GCC diagnostic ignored \"-Wcast-function-type\""); /* needed for kernel 4.14.336 */ #include #include #include + + #if defined(CONFIG_FORTIFY_SOURCE) || defined(DEBUG_LINUXKM_FORTIFY_OVERLAY) + #ifdef __PIE__ + /* the inline definitions in fortify-string.h use non-inline + * fortify_panic(). + */ + extern void __my_fortify_panic(const char *name) __noreturn __cold; + #define fortify_panic __my_fortify_panic + #endif + + /* the _FORTIFY_SOURCE macros and implementations for several string + * functions are incompatible with libwolfssl, so just reimplement with + * inlines and remap with macros. + */ + + #define __ARCH_STRLEN_NO_REDIRECT + #define __ARCH_MEMCPY_NO_REDIRECT + #define __ARCH_MEMSET_NO_REDIRECT + #define __ARCH_MEMMOVE_NO_REDIRECT + + /* the inline definitions in fortify-string.h use non-inline + * strlen(). + */ + static inline size_t strlen(const char *s) { + const char *s_start = s; + while (*s) + ++s; + return (size_t)((uintptr_t)s - (uintptr_t)s_start); + } + + #include + + #undef strlen + #define strlen(s) \ + ((__builtin_constant_p(s) && __builtin_constant_p(*(s))) ? \ + (sizeof(s) - 1) : strlen(s)) + + static inline void *my_memcpy(void *dest, const void *src, size_t n) { + if (! (((uintptr_t)dest | (uintptr_t)src | (uintptr_t)n) + & (uintptr_t)(sizeof(uintptr_t) - 1))) + { + uintptr_t *src_longs = (uintptr_t *)src, + *dest_longs = (uintptr_t *)dest, + *endp = (uintptr_t *)((u8 *)src + n); + while (src_longs < endp) + *dest_longs++ = *src_longs++; + } else { + u8 *src_bytes = (u8 *)src, + *dest_bytes = (u8 *)dest, + *endp = src_bytes + n; + while (src_bytes < endp) + *dest_bytes++ = *src_bytes++; + } + return dest; + } + #undef memcpy + #define memcpy my_memcpy + + static inline void *my_memset(void *dest, int c, size_t n) { + if (! (((uintptr_t)dest | (uintptr_t)n) + & (uintptr_t)(sizeof(uintptr_t) - 1))) + { + uintptr_t c_long = __builtin_choose_expr( + sizeof(uintptr_t) == 8, + (uintptr_t)(u8)c * 0x0101010101010101UL, + (uintptr_t)(u8)c * 0x01010101U + ); + uintptr_t *dest_longs = (uintptr_t *)dest, + *endp = (uintptr_t *)((u8 *)dest_longs + n); + while (dest_longs < endp) + *dest_longs++ = c_long; + } else { + u8 *dest_bytes = (u8 *)dest, *endp = dest_bytes + n; + while (dest_bytes < endp) + *dest_bytes++ = (u8)c; + } + return dest; + } + #undef memset + #define memset my_memset + + static inline void *my_memmove(void *dest, const void *src, size_t n) { + if (! (((uintptr_t)dest | (uintptr_t)src | (uintptr_t)n) + & (uintptr_t)(sizeof(uintptr_t) - 1))) + { + uintptr_t *src_longs = (uintptr_t *)src, + *dest_longs = (uintptr_t *)dest; + n >>= __builtin_choose_expr( + sizeof(uintptr_t) == 8, + 3U, + 2U); + if (src_longs < dest_longs) { + uintptr_t *startp = src_longs; + src_longs += n - 1; + dest_longs += n - 1; + while (src_longs >= startp) + *dest_longs-- = *src_longs--; + } else if (src_longs > dest_longs) { + uintptr_t *endp = src_longs + n; + while (src_longs < endp) + *dest_longs++ = *src_longs++; + } + } else { + u8 *src_bytes = (u8 *)src, *dest_bytes = (u8 *)dest; + if (src_bytes < dest_bytes) { + u8 *startp = src_bytes; + src_bytes += n - 1; + dest_bytes += n - 1; + while (src_bytes >= startp) + *dest_bytes-- = *src_bytes--; + } else if (src_bytes > dest_bytes) { + u8 *endp = src_bytes + n; + while (src_bytes < endp) + *dest_bytes++ = *src_bytes++; + } + } + return dest; + } + #undef memmove + #define memmove my_memmove + + #endif /* CONFIG_FORTIFY_SOURCE */ + #include #include + #include + #ifdef __PIE__ /* without this, mm.h brings in static, but not inline, pmd_to_page(), * with direct references to global vmem variables. @@ -133,6 +259,10 @@ * reference to unexported __show_free_areas(). */ #define __show_free_areas my__show_free_areas + void my__show_free_areas( + unsigned int flags, + nodemask_t *nodemask, + int max_zone_idx); #endif #endif #include @@ -142,7 +272,33 @@ #include #include - #if defined(WOLFSSL_AESNI) || defined(USE_INTEL_SPEEDUP) || defined(WOLFSSL_SP_X86_64_ASM) + #ifdef LINUXKM_LKCAPI_REGISTER + #include + #include + #include + #include + #include + + /* the LKCAPI assumes that expanded encrypt and decrypt keys will stay + * loaded simultaneously, and the Linux in-tree implementations have two + * AES key structs in each context, one for each direction. in + * linuxkm/lkcapi_glue.c (used for CBC, CFB, and GCM), we do the same + * thing with "struct km_AesCtx". however, wolfCrypt struct AesXts + * already has two AES expanded keys, the main and tweak, and the tweak + * is always used in the encrypt direction regardless of the main + * direction. to avoid allocating and computing a duplicate second + * tweak encrypt key, we set + * WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS, which adds a second + * Aes slot to wolfCrypt's struct AesXts, and activates support for + * AES_ENCRYPTION_AND_DECRYPTION on AES-XTS. + */ + #ifndef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + #define WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + #endif + #endif + + #if defined(WOLFSSL_AESNI) || defined(USE_INTEL_SPEEDUP) || \ + defined(WOLFSSL_SP_X86_64_ASM) #ifndef CONFIG_X86 #error X86 SIMD extensions requested, but CONFIG_X86 is not set. #endif @@ -168,34 +324,98 @@ #endif #endif - /* benchmarks.c uses floating point math, so needs a working SAVE_VECTOR_REGISTERS(). */ - #if defined(WOLFSSL_LINUXKM_BENCHMARKS) && !defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) + /* benchmarks.c uses floating point math, so needs a working + * SAVE_VECTOR_REGISTERS(). + */ + #if defined(WOLFSSL_LINUXKM_BENCHMARKS) && \ + !defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) #define WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS #endif - #if defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) && defined(CONFIG_X86) + #if defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) && \ + defined(CONFIG_X86) + + extern __must_check int allocate_wolfcrypt_linuxkm_fpu_states(void); + extern void free_wolfcrypt_linuxkm_fpu_states(void); + extern __must_check int can_save_vector_registers_x86(void); + extern __must_check int save_vector_registers_x86(void); + extern void restore_vector_registers_x86(void); + #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) #include #else #include #endif + #ifndef CAN_SAVE_VECTOR_REGISTERS + #ifdef DEBUG_VECTOR_REGISTER_ACCESS_FUZZING + #define CAN_SAVE_VECTOR_REGISTERS() (can_save_vector_registers_x86() && (SAVE_VECTOR_REGISTERS2_fuzzer() == 0)) + #else + #define CAN_SAVE_VECTOR_REGISTERS() can_save_vector_registers_x86() + #endif + #endif #ifndef SAVE_VECTOR_REGISTERS - #define SAVE_VECTOR_REGISTERS(fail_clause) { int _svr_ret = save_vector_registers_x86(); if (_svr_ret != 0) { fail_clause } } + #define SAVE_VECTOR_REGISTERS(fail_clause) { \ + int _svr_ret = save_vector_registers_x86(); \ + if (_svr_ret != 0) { \ + fail_clause \ + } \ + } + #endif + #ifndef SAVE_VECTOR_REGISTERS2 + #ifdef DEBUG_VECTOR_REGISTER_ACCESS_FUZZING + #define SAVE_VECTOR_REGISTERS2() ({ \ + int _fuzzer_ret = SAVE_VECTOR_REGISTERS2_fuzzer(); \ + (_fuzzer_ret == 0) ? \ + save_vector_registers_x86() : \ + _fuzzer_ret; \ + }) + #else + #define SAVE_VECTOR_REGISTERS2() save_vector_registers_x86() + #endif #endif #ifndef RESTORE_VECTOR_REGISTERS #define RESTORE_VECTOR_REGISTERS() restore_vector_registers_x86() #endif + #elif defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) && (defined(CONFIG_ARM) || defined(CONFIG_ARM64)) + + #error kernel module ARM SIMD is not yet tested or usable. + #include + + static WARN_UNUSED_RESULT inline int save_vector_registers_arm(void) + { + preempt_disable(); + if (! may_use_simd()) { + preempt_enable(); + return BAD_STATE_E; + } else { + fpsimd_preserve_current_state(); + return 0; + } + } + static inline void restore_vector_registers_arm(void) + { + fpsimd_restore_current_state(); + preempt_enable(); + } + #ifndef SAVE_VECTOR_REGISTERS #define SAVE_VECTOR_REGISTERS(fail_clause) { int _svr_ret = save_vector_registers_arm(); if (_svr_ret != 0) { fail_clause } } #endif + #ifndef SAVE_VECTOR_REGISTERS2 + #define SAVE_VECTOR_REGISTERS2() save_vector_registers_arm() + #endif + #ifndef CAN_SAVE_VECTOR_REGISTERS + #define CAN_SAVE_VECTOR_REGISTERS() can_save_vector_registers_arm() + #endif #ifndef RESTORE_VECTOR_REGISTERS #define RESTORE_VECTOR_REGISTERS() restore_vector_registers_arm() #endif + #elif defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) #error WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS is set for an unsupported architecture. - #endif + #endif /* WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS */ _Pragma("GCC diagnostic pop"); @@ -214,6 +434,25 @@ #ifdef HAVE_FIPS extern int wolfCrypt_FIPS_first(void); extern int wolfCrypt_FIPS_last(void); + #if FIPS_VERSION3_GE(6,0,0) + extern int wolfCrypt_FIPS_AES_sanity(void); + extern int wolfCrypt_FIPS_CMAC_sanity(void); + extern int wolfCrypt_FIPS_DH_sanity(void); + extern int wolfCrypt_FIPS_ECC_sanity(void); + extern int wolfCrypt_FIPS_ED25519_sanity(void); + extern int wolfCrypt_FIPS_ED448_sanity(void); + extern int wolfCrypt_FIPS_HMAC_sanity(void); + extern int wolfCrypt_FIPS_KDF_sanity(void); + extern int wolfCrypt_FIPS_PBKDF_sanity(void); + extern int wolfCrypt_FIPS_DRBG_sanity(void); + extern int wolfCrypt_FIPS_RSA_sanity(void); + extern int wolfCrypt_FIPS_SHA_sanity(void); + extern int wolfCrypt_FIPS_SHA256_sanity(void); + extern int wolfCrypt_FIPS_SHA512_sanity(void); + extern int wolfCrypt_FIPS_SHA3_sanity(void); + extern int wolfCrypt_FIPS_FT_sanity(void); + extern int wc_RunAllCast_fips(void); + #endif #endif #if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) @@ -285,26 +524,40 @@ #else typeof(printk) *printk; #endif + +#ifdef CONFIG_FORTIFY_SOURCE + typeof(__warn_printk) *__warn_printk; +#endif + typeof(snprintf) *snprintf; const unsigned char *_ctype; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 10, 0) + typeof(kmalloc_noprof) *kmalloc_noprof; + typeof(krealloc_noprof) *krealloc_noprof; + typeof(kzalloc_noprof) *kzalloc_noprof; + typeof(kvmalloc_node_noprof) *kvmalloc_node_noprof; + typeof(kmalloc_trace_noprof) *kmalloc_trace_noprof; +#else /* <6.10.0 */ typeof(kmalloc) *kmalloc; - typeof(kfree) *kfree; - typeof(ksize) *ksize; typeof(krealloc) *krealloc; #ifdef HAVE_KVMALLOC typeof(kvmalloc_node) *kvmalloc_node; - typeof(kvfree) *kvfree; #endif - typeof(is_vmalloc_addr) *is_vmalloc_addr; - #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) typeof(kmalloc_trace) *kmalloc_trace; #else typeof(kmem_cache_alloc_trace) *kmem_cache_alloc_trace; typeof(kmalloc_order_trace) *kmalloc_order_trace; #endif +#endif /* <6.10.0 */ + #ifdef HAVE_KVMALLOC + typeof(kvfree) *kvfree; + #endif + typeof(kfree) *kfree; + typeof(ksize) *ksize; + typeof(is_vmalloc_addr) *is_vmalloc_addr; typeof(get_random_bytes) *get_random_bytes; #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) @@ -316,34 +569,15 @@ #endif struct task_struct *(*get_current)(void); - int (*preempt_count)(void); #ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS - #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0) - typeof(cpu_number) *cpu_number; - #else - typeof(pcpu_hot) *pcpu_hot; - #endif - typeof(nr_cpu_ids) *nr_cpu_ids; - - #if defined(CONFIG_SMP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) - /* note the current and needed version of these were added in af449901b8 (2020-Sep-17) */ - typeof(migrate_disable) *migrate_disable; - typeof(migrate_enable) *migrate_enable; - #endif - #ifdef CONFIG_X86 - typeof(irq_fpu_usable) *irq_fpu_usable; - /* kernel_fpu_begin() replaced by kernel_fpu_begin_mask() in commit e4512289, - * released in kernel 5.11, backported to 5.4.93 - */ - #ifdef kernel_fpu_begin - typeof(kernel_fpu_begin_mask) *kernel_fpu_begin_mask; - #else - typeof(kernel_fpu_begin) *kernel_fpu_begin; - #endif - typeof(kernel_fpu_end) *kernel_fpu_end; + typeof(allocate_wolfcrypt_linuxkm_fpu_states) *allocate_wolfcrypt_linuxkm_fpu_states; + typeof(can_save_vector_registers_x86) *can_save_vector_registers_x86; + typeof(free_wolfcrypt_linuxkm_fpu_states) *free_wolfcrypt_linuxkm_fpu_states; + typeof(restore_vector_registers_x86) *restore_vector_registers_x86; + typeof(save_vector_registers_x86) *save_vector_registers_x86; #else /* !CONFIG_X86 */ #error WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS is set for an unsupported architecture. #endif /* arch */ @@ -364,6 +598,25 @@ #ifdef HAVE_FIPS typeof(wolfCrypt_FIPS_first) *wolfCrypt_FIPS_first; typeof(wolfCrypt_FIPS_last) *wolfCrypt_FIPS_last; + #if FIPS_VERSION3_GE(6,0,0) + typeof(wolfCrypt_FIPS_AES_sanity) *wolfCrypt_FIPS_AES_sanity; + typeof(wolfCrypt_FIPS_CMAC_sanity) *wolfCrypt_FIPS_CMAC_sanity; + typeof(wolfCrypt_FIPS_DH_sanity) *wolfCrypt_FIPS_DH_sanity; + typeof(wolfCrypt_FIPS_ECC_sanity) *wolfCrypt_FIPS_ECC_sanity; + typeof(wolfCrypt_FIPS_ED25519_sanity) *wolfCrypt_FIPS_ED25519_sanity; + typeof(wolfCrypt_FIPS_ED448_sanity) *wolfCrypt_FIPS_ED448_sanity; + typeof(wolfCrypt_FIPS_HMAC_sanity) *wolfCrypt_FIPS_HMAC_sanity; + typeof(wolfCrypt_FIPS_KDF_sanity) *wolfCrypt_FIPS_KDF_sanity; + typeof(wolfCrypt_FIPS_PBKDF_sanity) *wolfCrypt_FIPS_PBKDF_sanity; + typeof(wolfCrypt_FIPS_DRBG_sanity) *wolfCrypt_FIPS_DRBG_sanity; + typeof(wolfCrypt_FIPS_RSA_sanity) *wolfCrypt_FIPS_RSA_sanity; + typeof(wolfCrypt_FIPS_SHA_sanity) *wolfCrypt_FIPS_SHA_sanity; + typeof(wolfCrypt_FIPS_SHA256_sanity) *wolfCrypt_FIPS_SHA256_sanity; + typeof(wolfCrypt_FIPS_SHA512_sanity) *wolfCrypt_FIPS_SHA512_sanity; + typeof(wolfCrypt_FIPS_SHA3_sanity) *wolfCrypt_FIPS_SHA3_sanity; + typeof(wolfCrypt_FIPS_FT_sanity) *wolfCrypt_FIPS_FT_sanity; + typeof(wc_RunAllCast_fips) *wc_RunAllCast_fips; + #endif #endif #if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) @@ -423,26 +676,44 @@ #else #define printk (wolfssl_linuxkm_get_pie_redirect_table()->printk) #endif + + #ifdef CONFIG_FORTIFY_SOURCE + #define __warn_printk (wolfssl_linuxkm_get_pie_redirect_table()->__warn_printk) + #endif + #define snprintf (wolfssl_linuxkm_get_pie_redirect_table()->snprintf) #define _ctype (wolfssl_linuxkm_get_pie_redirect_table()->_ctype) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 10, 0) + /* see include/linux/alloc_tag.h and include/linux/slab.h */ + #define kmalloc_noprof (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc_noprof) + #define krealloc_noprof (wolfssl_linuxkm_get_pie_redirect_table()->krealloc_noprof) + #define kzalloc_noprof (wolfssl_linuxkm_get_pie_redirect_table()->kzalloc_noprof) + #define kvmalloc_node_noprof (wolfssl_linuxkm_get_pie_redirect_table()->kvmalloc_node_noprof) + #define kmalloc_trace_noprof (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc_trace_noprof) +#else /* <6.10.0 */ #define kmalloc (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc) - #define kfree (wolfssl_linuxkm_get_pie_redirect_table()->kfree) - #define ksize (wolfssl_linuxkm_get_pie_redirect_table()->ksize) #define krealloc (wolfssl_linuxkm_get_pie_redirect_table()->krealloc) #define kzalloc(size, flags) kmalloc(size, (flags) | __GFP_ZERO) #ifdef HAVE_KVMALLOC #define kvmalloc_node (wolfssl_linuxkm_get_pie_redirect_table()->kvmalloc_node) - #define kvfree (wolfssl_linuxkm_get_pie_redirect_table()->kvfree) #endif - #define is_vmalloc_addr (wolfssl_linuxkm_get_pie_redirect_table()->is_vmalloc_addr) #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) #define kmalloc_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc_trace) #else #define kmem_cache_alloc_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmem_cache_alloc_trace) #define kmalloc_order_trace (wolfssl_linuxkm_get_pie_redirect_table()->kmalloc_order_trace) #endif +#endif /* <6.10.0 */ + + #define kfree (wolfssl_linuxkm_get_pie_redirect_table()->kfree) + #ifdef HAVE_KVMALLOC + #define kvfree (wolfssl_linuxkm_get_pie_redirect_table()->kvfree) + #endif + #define ksize (wolfssl_linuxkm_get_pie_redirect_table()->ksize) + + #define is_vmalloc_addr (wolfssl_linuxkm_get_pie_redirect_table()->is_vmalloc_addr) #define get_random_bytes (wolfssl_linuxkm_get_pie_redirect_table()->get_random_bytes) #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) @@ -455,33 +726,15 @@ #undef get_current #define get_current (wolfssl_linuxkm_get_pie_redirect_table()->get_current) - #undef preempt_count - #define preempt_count (wolfssl_linuxkm_get_pie_redirect_table()->preempt_count) - - #ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS - #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0) - #define cpu_number (*(wolfssl_linuxkm_get_pie_redirect_table()->cpu_number)) - #else - #define pcpu_hot (*(wolfssl_linuxkm_get_pie_redirect_table()->pcpu_hot)) - #endif - #define nr_cpu_ids (*(wolfssl_linuxkm_get_pie_redirect_table()->nr_cpu_ids)) - - #if defined(CONFIG_SMP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) - #define migrate_disable (*(wolfssl_linuxkm_get_pie_redirect_table()->migrate_disable)) - #define migrate_enable (*(wolfssl_linuxkm_get_pie_redirect_table()->migrate_enable)) - #endif - #ifdef CONFIG_X86 - #define irq_fpu_usable (wolfssl_linuxkm_get_pie_redirect_table()->irq_fpu_usable) - #ifdef kernel_fpu_begin - #define kernel_fpu_begin_mask (wolfssl_linuxkm_get_pie_redirect_table()->kernel_fpu_begin_mask) - #else - #define kernel_fpu_begin (wolfssl_linuxkm_get_pie_redirect_table()->kernel_fpu_begin) - #endif - #define kernel_fpu_end (wolfssl_linuxkm_get_pie_redirect_table()->kernel_fpu_end) - #else /* !CONFIG_X86 */ - #error WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS is set for an unsupported architecture. - #endif /* archs */ + #if defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) && defined(CONFIG_X86) + #define allocate_wolfcrypt_linuxkm_fpu_states (wolfssl_linuxkm_get_pie_redirect_table()->allocate_wolfcrypt_linuxkm_fpu_states) + #define can_save_vector_registers_x86 (wolfssl_linuxkm_get_pie_redirect_table()->can_save_vector_registers_x86) + #define free_wolfcrypt_linuxkm_fpu_states (wolfssl_linuxkm_get_pie_redirect_table()->free_wolfcrypt_linuxkm_fpu_states) + #define restore_vector_registers_x86 (wolfssl_linuxkm_get_pie_redirect_table()->restore_vector_registers_x86) + #define save_vector_registers_x86 (wolfssl_linuxkm_get_pie_redirect_table()->save_vector_registers_x86) + #elif defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) + #error WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS is set for an unsupported architecture. #endif /* WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS */ #define __mutex_init (wolfssl_linuxkm_get_pie_redirect_table()->__mutex_init) @@ -515,40 +768,6 @@ #endif /* USE_WOLFSSL_LINUXKM_PIE_REDIRECT_TABLE */ -#ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS - -#ifdef CONFIG_X86 - - extern __must_check int allocate_wolfcrypt_linuxkm_fpu_states(void); - extern void free_wolfcrypt_linuxkm_fpu_states(void); - extern __must_check int save_vector_registers_x86(void); - extern void restore_vector_registers_x86(void); - -#elif defined(CONFIG_ARM) || defined(CONFIG_ARM64) - - #error kernel module ARM SIMD is not yet tested or usable. - - static WARN_UNUSED_RESULT inline int save_vector_registers_arm(void) - { - preempt_disable(); - if (! may_use_simd()) { - preempt_enable(); - return BAD_STATE_E; - } else { - fpsimd_preserve_current_state(); - return 0; - } - } - static inline void restore_vector_registers_arm(void) - { - fpsimd_restore_current_state(); - preempt_enable(); - } - -#endif - -#endif /* WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS */ - /* remove this multifariously conflicting macro, picked up from * Linux arch//include/asm/current.h. */ @@ -601,6 +820,7 @@ */ #include typedef struct mutex wolfSSL_Mutex; + #define WOLFSSL_MUTEX_INITIALIZER(lockname) __MUTEX_INITIALIZER(lockname) /* prevent gcc's mm_malloc.h from being included, since it unconditionally * includes stdlib.h, which is kernel-incompatible. @@ -610,11 +830,13 @@ /* fun fact: since linux commit 59bb47985c, kmalloc with power-of-2 size is * aligned to the size. */ - #define WC_LINUXKM_ROUND_UP_P_OF_2(x) ( \ - { \ - size_t _alloc_sz = (x); \ - _alloc_sz = 1UL << ((sizeof(_alloc_sz) * 8UL) - __builtin_clzl(_alloc_sz)); \ - _alloc_sz; \ + #define WC_LINUXKM_ROUND_UP_P_OF_2(x) ( \ + { \ + size_t _alloc_sz = (x); \ + if (_alloc_sz < 8192) \ + _alloc_sz = 1UL << \ + ((sizeof(_alloc_sz) * 8UL) - __builtin_clzl(_alloc_sz - 1)); \ + _alloc_sz; \ }) #ifdef HAVE_KVMALLOC #define malloc(size) kvmalloc_node(WC_LINUXKM_ROUND_UP_P_OF_2(size), GFP_KERNEL, NUMA_NO_NODE) @@ -627,14 +849,28 @@ #define realloc(ptr, newsize) krealloc(ptr, WC_LINUXKM_ROUND_UP_P_OF_2(newsize), GFP_KERNEL) #endif -#ifdef WOLFSSL_TRACK_MEMORY + #ifndef static_assert + #define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr) + #define __static_assert(expr, msg, ...) _Static_assert(expr, msg) + #endif + #include + +#ifdef WOLFSSL_TRACK_MEMORY #define XMALLOC(s, h, t) ({(void)(h); (void)(t); wolfSSL_Malloc(s);}) - #define XFREE(p, h, t) ({void* _xp; (void)(h); _xp = (p); if(_xp) wolfSSL_Free(_xp);}) + #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK + #define XFREE(p, h, t) ({(void)(h); (void)(t); wolfSSL_Free(p);}) + #else + #define XFREE(p, h, t) ({void* _xp; (void)(h); _xp = (p); if(_xp) wolfSSL_Free(_xp);}) + #endif #define XREALLOC(p, n, h, t) ({(void)(h); (void)(t); wolfSSL_Realloc(p, n);}) #else #define XMALLOC(s, h, t) ({(void)(h); (void)(t); malloc(s);}) - #define XFREE(p, h, t) ({void* _xp; (void)(h); _xp = (p); if(_xp) free(_xp);}) + #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK + #define XFREE(p, h, t) ({(void)(h); (void)(t); free(p);}) + #else + #define XFREE(p, h, t) ({void* _xp; (void)(h); (void)(t); _xp = (p); if(_xp) free(_xp);}) + #endif #define XREALLOC(p, n, h, t) ({(void)(h); (void)(t); realloc(p, n);}) #endif @@ -644,7 +880,7 @@ * them to be evaluable by the preprocessor, for use in sp_int.h. */ #if BITS_PER_LONG == 64 - _Static_assert(sizeof(ULONG_MAX) == 8, + static_assert(sizeof(ULONG_MAX) == 8, "BITS_PER_LONG is 64, but ULONG_MAX is not."); #undef UCHAR_MAX @@ -666,7 +902,7 @@ #elif BITS_PER_LONG == 32 - _Static_assert(sizeof(ULONG_MAX) == 4, + static_assert(sizeof(ULONG_MAX) == 4, "BITS_PER_LONG is 32, but ULONG_MAX is not."); #undef UCHAR_MAX diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/lkcapi_glue.c mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/lkcapi_glue.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/lkcapi_glue.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/lkcapi_glue.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3153 @@ +/* lkcapi_glue.c -- glue logic to register wolfCrypt implementations with + * the Linux Kernel Cryptosystem + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* included by linuxkm/module_hooks.c */ + +#ifndef LINUXKM_LKCAPI_REGISTER + #error lkcapi_glue.c included in non-LINUXKM_LKCAPI_REGISTER project. +#endif + +#ifndef WOLFSSL_LINUXKM_LKCAPI_PRIORITY +/* Larger number means higher priority. The highest in-tree priority is 4001, + * in the Cavium driver. + */ +#define WOLFSSL_LINUXKM_LKCAPI_PRIORITY 10000 +#endif + +#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS +static int disable_setkey_warnings = 0; +#else +#define disable_setkey_warnings 0 +#endif + +#ifndef NO_AES + +/* note the FIPS code will be returned on failure even in non-FIPS builds. */ +#define LINUXKM_LKCAPI_AES_KAT_MISMATCH_E AES_KAT_FIPS_E +#define LINUXKM_LKCAPI_AESGCM_KAT_MISMATCH_E AESGCM_KAT_FIPS_E + +#define WOLFKM_AESCBC_NAME "cbc(aes)" +#define WOLFKM_AESCFB_NAME "cfb(aes)" +#define WOLFKM_AESGCM_NAME "gcm(aes)" +#define WOLFKM_AESXTS_NAME "xts(aes)" + +#ifdef WOLFSSL_AESNI + #define WOLFKM_DRIVER_ISA_EXT "-aesni" +#else + #define WOLFKM_DRIVER_ISA_EXT "" +#endif + +#ifdef HAVE_FIPS + #ifndef HAVE_FIPS_VERSION + #define WOLFKM_DRIVER_FIPS "-fips-140" + #elif HAVE_FIPS_VERSION >= 5 + #define WOLFKM_DRIVER_FIPS "-fips-140-3" + #elif HAVE_FIPS_VERSION == 2 + #define WOLFKM_DRIVER_FIPS "-fips-140-2" + #else + #define WOLFKM_DRIVER_FIPS "-fips-140" + #endif +#else + #define WOLFKM_DRIVER_FIPS "" +#endif + +#define WOLFKM_DRIVER_SUFFIX \ + WOLFKM_DRIVER_ISA_EXT WOLFKM_DRIVER_FIPS "-wolfcrypt" + +#define WOLFKM_AESCBC_DRIVER ("cbc-aes" WOLFKM_DRIVER_SUFFIX) +#define WOLFKM_AESCFB_DRIVER ("cfb-aes" WOLFKM_DRIVER_SUFFIX) +#define WOLFKM_AESGCM_DRIVER ("gcm-aes" WOLFKM_DRIVER_SUFFIX) +#define WOLFKM_AESXTS_DRIVER ("xts-aes" WOLFKM_DRIVER_SUFFIX) + +#if defined(HAVE_AES_CBC) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCBC)) +#ifndef WOLFSSL_EXPERIMENTAL_SETTINGS + #error Experimental settings without WOLFSSL_EXPERIMENTAL_SETTINGS +#endif +static int linuxkm_test_aescbc(void); +#endif +#if defined(WOLFSSL_AES_CFB) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCFB)) +#ifndef WOLFSSL_EXPERIMENTAL_SETTINGS + #error Experimental settings without WOLFSSL_EXPERIMENTAL_SETTINGS +#endif +static int linuxkm_test_aescfb(void); +#endif +#if defined(HAVE_AESGCM) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESGCM)) +#ifndef WOLFSSL_EXPERIMENTAL_SETTINGS + #error Experimental settings without WOLFSSL_EXPERIMENTAL_SETTINGS +#endif +static int linuxkm_test_aesgcm(void); +#endif +#if defined(WOLFSSL_AES_XTS) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESXTS)) +static int linuxkm_test_aesxts(void); +#endif + +/* km_AesX(): wrappers to wolfcrypt wc_AesX functions and + * structures. */ + +#include + +struct km_AesCtx { + Aes *aes_encrypt; /* allocated in km_AesInitCommon() to assure + * alignment, needed for AESNI. + */ + Aes *aes_decrypt; /* same. */ +}; + +#if defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCBC) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCFB) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESGCM) + +static void km_AesExitCommon(struct km_AesCtx * ctx); + +static int km_AesInitCommon( + struct km_AesCtx * ctx, + const char * name, + int need_decryption) +{ + int err; + + ctx->aes_encrypt = (Aes *)malloc(sizeof(*ctx->aes_encrypt)); + + if (! ctx->aes_encrypt) { + pr_err("%s: allocation of %zu bytes for encryption key failed.\n", + name, sizeof(*ctx->aes_encrypt)); + return MEMORY_E; + } + + err = wc_AesInit(ctx->aes_encrypt, NULL, INVALID_DEVID); + + if (unlikely(err)) { + pr_err("%s: wc_AesInit failed: %d\n", name, err); + free(ctx->aes_encrypt); + ctx->aes_encrypt = NULL; + return -EINVAL; + } + + if (! need_decryption) { + ctx->aes_decrypt = NULL; + return 0; + } + + ctx->aes_decrypt = (Aes *)malloc(sizeof(*ctx->aes_decrypt)); + + if (! ctx->aes_decrypt) { + pr_err("%s: allocation of %zu bytes for decryption key failed.\n", + name, sizeof(*ctx->aes_decrypt)); + km_AesExitCommon(ctx); + return MEMORY_E; + } + + err = wc_AesInit(ctx->aes_decrypt, NULL, INVALID_DEVID); + + if (unlikely(err)) { + pr_err("%s: wc_AesInit failed: %d\n", name, err); + free(ctx->aes_decrypt); + ctx->aes_decrypt = NULL; + km_AesExitCommon(ctx); + return -EINVAL; + } + + return 0; +} + +static void km_AesExitCommon(struct km_AesCtx * ctx) +{ + if (ctx->aes_encrypt) { + wc_AesFree(ctx->aes_encrypt); + free(ctx->aes_encrypt); + ctx->aes_encrypt = NULL; + } + if (ctx->aes_decrypt) { + wc_AesFree(ctx->aes_decrypt); + free(ctx->aes_decrypt); + ctx->aes_decrypt = NULL; + } +} + +#if defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCBC) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCFB) + +static int km_AesSetKeyCommon(struct km_AesCtx * ctx, const u8 *in_key, + unsigned int key_len, const char * name) +{ + int err; + + err = wc_AesSetKey(ctx->aes_encrypt, in_key, key_len, NULL, AES_ENCRYPTION); + + if (unlikely(err)) { + if (! disable_setkey_warnings) + pr_err("%s: wc_AesSetKey for encryption key failed: %d\n", name, err); + return -ENOKEY; + } + + if (ctx->aes_decrypt) { + err = wc_AesSetKey(ctx->aes_decrypt, in_key, key_len, NULL, + AES_DECRYPTION); + + if (unlikely(err)) { + if (! disable_setkey_warnings) + pr_err("%s: wc_AesSetKey for decryption key failed: %d\n", + name, err); + return -ENOKEY; + } + } + + return 0; +} + +static void km_AesExit(struct crypto_skcipher *tfm) +{ + struct km_AesCtx * ctx = crypto_skcipher_ctx(tfm); + km_AesExitCommon(ctx); +} + +#endif /* LINUXKM_LKCAPI_REGISTER_ALL || + * LINUXKM_LKCAPI_REGISTER_AESCBC || + * LINUXKM_LKCAPI_REGISTER_AESCFB + */ + +#endif /* LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESCBC || + * LINUXKM_LKCAPI_REGISTER_AESCFB || LINUXKM_LKCAPI_REGISTER_AESGCM + */ + +#if defined(HAVE_AES_CBC) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCBC)) + +static int km_AesCbcInit(struct crypto_skcipher *tfm) +{ + struct km_AesCtx * ctx = crypto_skcipher_ctx(tfm); + return km_AesInitCommon(ctx, WOLFKM_AESCBC_DRIVER, 1); +} + +static int km_AesCbcSetKey(struct crypto_skcipher *tfm, const u8 *in_key, + unsigned int key_len) +{ + struct km_AesCtx * ctx = crypto_skcipher_ctx(tfm); + return km_AesSetKeyCommon(ctx, in_key, key_len, WOLFKM_AESCBC_DRIVER); +} + +static int km_AesCbcEncrypt(struct skcipher_request *req) +{ + struct crypto_skcipher * tfm = NULL; + struct km_AesCtx * ctx = NULL; + struct skcipher_walk walk; + unsigned int nbytes = 0; + int err = 0; + + tfm = crypto_skcipher_reqtfm(req); + ctx = crypto_skcipher_ctx(tfm); + + err = skcipher_walk_virt(&walk, req, false); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_virt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + + while ((nbytes = walk.nbytes) != 0) { + err = wc_AesSetIV(ctx->aes_encrypt, walk.iv); + + if (unlikely(err)) { + pr_err("%s: wc_AesSetIV failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = wc_AesCbcEncrypt(ctx->aes_encrypt, walk.dst.virt.addr, + walk.src.virt.addr, nbytes); + + if (unlikely(err)) { + pr_err("%s: wc_AesCbcEncrypt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, walk.nbytes - nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + } + + return err; +} + +static int km_AesCbcDecrypt(struct skcipher_request *req) +{ + struct crypto_skcipher * tfm = NULL; + struct km_AesCtx * ctx = NULL; + struct skcipher_walk walk; + unsigned int nbytes = 0; + int err = 0; + + tfm = crypto_skcipher_reqtfm(req); + ctx = crypto_skcipher_ctx(tfm); + + err = skcipher_walk_virt(&walk, req, false); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_virt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + + while ((nbytes = walk.nbytes) != 0) { + err = wc_AesSetIV(ctx->aes_decrypt, walk.iv); + + if (unlikely(err)) { + if (! disable_setkey_warnings) + pr_err("%s: wc_AesSetKey failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = wc_AesCbcDecrypt(ctx->aes_decrypt, walk.dst.virt.addr, + walk.src.virt.addr, nbytes); + + if (unlikely(err)) { + pr_err("%s: wc_AesCbcDecrypt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, walk.nbytes - nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + } + + return err; +} + +static struct skcipher_alg cbcAesAlg = { + .base.cra_name = WOLFKM_AESCBC_NAME, + .base.cra_driver_name = WOLFKM_AESCBC_DRIVER, + .base.cra_priority = WOLFSSL_LINUXKM_LKCAPI_PRIORITY, + .base.cra_blocksize = AES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct km_AesCtx), + .base.cra_module = THIS_MODULE, + .init = km_AesCbcInit, + .exit = km_AesExit, + .min_keysize = AES_128_KEY_SIZE, + .max_keysize = AES_256_KEY_SIZE, + .ivsize = AES_BLOCK_SIZE, + .setkey = km_AesCbcSetKey, + .encrypt = km_AesCbcEncrypt, + .decrypt = km_AesCbcDecrypt, +}; +static int cbcAesAlg_loaded = 0; + +#endif /* HAVE_AES_CBC && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESCBC) + */ + +#if defined(WOLFSSL_AES_CFB) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCFB)) + +static int km_AesCfbInit(struct crypto_skcipher *tfm) +{ + struct km_AesCtx * ctx = crypto_skcipher_ctx(tfm); + return km_AesInitCommon(ctx, WOLFKM_AESCFB_DRIVER, 0); +} + +static int km_AesCfbSetKey(struct crypto_skcipher *tfm, const u8 *in_key, + unsigned int key_len) +{ + struct km_AesCtx * ctx = crypto_skcipher_ctx(tfm); + return km_AesSetKeyCommon(ctx, in_key, key_len, WOLFKM_AESCFB_DRIVER); +} + +static int km_AesCfbEncrypt(struct skcipher_request *req) +{ + struct crypto_skcipher * tfm = NULL; + struct km_AesCtx * ctx = NULL; + struct skcipher_walk walk; + unsigned int nbytes = 0; + int err = 0; + + tfm = crypto_skcipher_reqtfm(req); + ctx = crypto_skcipher_ctx(tfm); + + err = skcipher_walk_virt(&walk, req, false); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_virt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + + while ((nbytes = walk.nbytes) != 0) { + err = wc_AesSetIV(ctx->aes_encrypt, walk.iv); + + if (unlikely(err)) { + if (! disable_setkey_warnings) + pr_err("%s: wc_AesSetKey failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = wc_AesCfbEncrypt(ctx->aes_encrypt, walk.dst.virt.addr, + walk.src.virt.addr, nbytes); + + if (unlikely(err)) { + pr_err("%s: wc_AesCfbEncrypt failed %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, walk.nbytes - nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + } + + return err; +} + +static int km_AesCfbDecrypt(struct skcipher_request *req) +{ + struct crypto_skcipher * tfm = NULL; + struct km_AesCtx * ctx = NULL; + struct skcipher_walk walk; + unsigned int nbytes = 0; + int err = 0; + + tfm = crypto_skcipher_reqtfm(req); + ctx = crypto_skcipher_ctx(tfm); + + err = skcipher_walk_virt(&walk, req, false); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_virt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + + while ((nbytes = walk.nbytes) != 0) { + err = wc_AesSetIV(ctx->aes_encrypt, walk.iv); + + if (unlikely(err)) { + if (! disable_setkey_warnings) + pr_err("%s: wc_AesSetKey failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = wc_AesCfbDecrypt(ctx->aes_encrypt, walk.dst.virt.addr, + walk.src.virt.addr, nbytes); + + if (unlikely(err)) { + pr_err("%s: wc_AesCfbDecrypt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, walk.nbytes - nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + } + + return err; +} + +static struct skcipher_alg cfbAesAlg = { + .base.cra_name = WOLFKM_AESCFB_NAME, + .base.cra_driver_name = WOLFKM_AESCFB_DRIVER, + .base.cra_priority = WOLFSSL_LINUXKM_LKCAPI_PRIORITY, + .base.cra_blocksize = AES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct km_AesCtx), + .base.cra_module = THIS_MODULE, + .init = km_AesCfbInit, + .exit = km_AesExit, + .min_keysize = AES_128_KEY_SIZE, + .max_keysize = AES_256_KEY_SIZE, + .ivsize = AES_BLOCK_SIZE, + .setkey = km_AesCfbSetKey, + .encrypt = km_AesCfbEncrypt, + .decrypt = km_AesCfbDecrypt, +}; +static int cfbAesAlg_loaded = 0; + +#endif /* WOLFSSL_AES_CFB && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESCBC) + */ + +#if defined(HAVE_AESGCM) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESGCM)) + +#ifndef WOLFSSL_AESGCM_STREAM + #error LKCAPI registration of AES-GCM requires WOLFSSL_AESGCM_STREAM (--enable-aesgcm-stream). +#endif + +static int km_AesGcmInit(struct crypto_aead * tfm) +{ + struct km_AesCtx * ctx = crypto_aead_ctx(tfm); + return km_AesInitCommon(ctx, WOLFKM_AESGCM_DRIVER, 0); +} + +static void km_AesGcmExit(struct crypto_aead * tfm) +{ + struct km_AesCtx * ctx = crypto_aead_ctx(tfm); + km_AesExitCommon(ctx); +} + +static int km_AesGcmSetKey(struct crypto_aead *tfm, const u8 *in_key, + unsigned int key_len) +{ + int err; + struct km_AesCtx * ctx = crypto_aead_ctx(tfm); + + err = wc_AesGcmSetKey(ctx->aes_encrypt, in_key, key_len); + + if (unlikely(err)) { + if (! disable_setkey_warnings) + pr_err("%s: wc_AesGcmSetKey failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -ENOKEY; + } + + return 0; +} + +static int km_AesGcmSetAuthsize(struct crypto_aead *tfm, unsigned int authsize) +{ + (void)tfm; + if (authsize > AES_BLOCK_SIZE || + authsize < WOLFSSL_MIN_AUTH_TAG_SZ) { + pr_err("%s: invalid authsize: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), authsize); + return -EINVAL; + } + return 0; +} + +/* + * aead ciphers recieve data in scatterlists in following order: + * encrypt + * req->src: aad||plaintext + * req->dst: aad||ciphertext||tag + * decrypt + * req->src: aad||ciphertext||tag + * req->dst: aad||plaintext, return 0 or -EBADMSG + */ + +static int km_AesGcmEncrypt(struct aead_request *req) +{ + struct crypto_aead * tfm = NULL; + struct km_AesCtx * ctx = NULL; + struct skcipher_walk walk; + struct scatter_walk assocSgWalk; + unsigned int nbytes = 0; + u8 authTag[AES_BLOCK_SIZE]; + int err = 0; + unsigned int assocLeft = 0; + unsigned int cryptLeft = 0; + u8 * assoc = NULL; + + tfm = crypto_aead_reqtfm(req); + ctx = crypto_aead_ctx(tfm); + assocLeft = req->assoclen; + cryptLeft = req->cryptlen; + + scatterwalk_start(&assocSgWalk, req->src); + + err = skcipher_walk_aead_encrypt(&walk, req, false); + if (unlikely(err)) { + pr_err("%s: skcipher_walk_aead_encrypt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -1; + } + + err = wc_AesGcmInit(ctx->aes_encrypt, NULL /*key*/, 0 /*keylen*/, walk.iv, + AES_BLOCK_SIZE); + if (unlikely(err)) { + pr_err("%s: wc_AesGcmInit failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -EINVAL; + } + + assoc = scatterwalk_map(&assocSgWalk); + if (unlikely(IS_ERR(assoc))) { + pr_err("%s: scatterwalk_map failed: %ld\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), + PTR_ERR(assoc)); + return err; + } + + err = wc_AesGcmEncryptUpdate(ctx->aes_encrypt, NULL, NULL, 0, + assoc, assocLeft); + assocLeft -= assocLeft; + scatterwalk_unmap(assoc); + assoc = NULL; + + if (unlikely(err)) { + pr_err("%s: wc_AesGcmEncryptUpdate failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -EINVAL; + } + + while ((nbytes = walk.nbytes) != 0) { + int n = nbytes; + + if (likely(cryptLeft && nbytes)) { + n = cryptLeft < nbytes ? cryptLeft : nbytes; + + err = wc_AesGcmEncryptUpdate( + ctx->aes_encrypt, + walk.dst.virt.addr, + walk.src.virt.addr, + cryptLeft, + NULL, 0); + nbytes -= n; + cryptLeft -= n; + } + + if (unlikely(err)) { + pr_err("%s: wc_AesGcmEncryptUpdate failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return err; + } + } + + err = wc_AesGcmEncryptFinal(ctx->aes_encrypt, authTag, tfm->authsize); + if (unlikely(err)) { + pr_err("%s: wc_AesGcmEncryptFinal failed with return code %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -EINVAL; + } + + /* Now copy the auth tag into request scatterlist. */ + scatterwalk_map_and_copy(authTag, req->dst, + req->assoclen + req->cryptlen, + tfm->authsize, 1); + + return err; +} + +static int km_AesGcmDecrypt(struct aead_request *req) +{ + struct crypto_aead * tfm = NULL; + struct km_AesCtx * ctx = NULL; + struct skcipher_walk walk; + struct scatter_walk assocSgWalk; + unsigned int nbytes = 0; + u8 origAuthTag[AES_BLOCK_SIZE]; + int err = 0; + unsigned int assocLeft = 0; + unsigned int cryptLeft = 0; + u8 * assoc = NULL; + + tfm = crypto_aead_reqtfm(req); + ctx = crypto_aead_ctx(tfm); + assocLeft = req->assoclen; + cryptLeft = req->cryptlen - tfm->authsize; + + /* Copy out original auth tag from req->src. */ + scatterwalk_map_and_copy(origAuthTag, req->src, + req->assoclen + req->cryptlen - tfm->authsize, + tfm->authsize, 0); + + scatterwalk_start(&assocSgWalk, req->src); + + err = skcipher_walk_aead_decrypt(&walk, req, false); + if (unlikely(err)) { + pr_err("%s: skcipher_walk_aead_decrypt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return err; + } + + err = wc_AesGcmInit(ctx->aes_encrypt, NULL /*key*/, 0 /*keylen*/, walk.iv, + AES_BLOCK_SIZE); + if (unlikely(err)) { + pr_err("%s: wc_AesGcmInit failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -EINVAL; + } + + assoc = scatterwalk_map(&assocSgWalk); + if (unlikely(IS_ERR(assoc))) { + pr_err("%s: scatterwalk_map failed: %ld\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), + PTR_ERR(assoc)); + return err; + } + + err = wc_AesGcmDecryptUpdate(ctx->aes_encrypt, NULL, NULL, 0, + assoc, assocLeft); + assocLeft -= assocLeft; + scatterwalk_unmap(assoc); + assoc = NULL; + + if (unlikely(err)) { + pr_err("%s: wc_AesGcmDecryptUpdate failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -EINVAL; + } + + while ((nbytes = walk.nbytes) != 0) { + int n = nbytes; + + if (likely(cryptLeft && nbytes)) { + n = cryptLeft < nbytes ? cryptLeft : nbytes; + + err = wc_AesGcmDecryptUpdate( + ctx->aes_encrypt, + walk.dst.virt.addr, + walk.src.virt.addr, + cryptLeft, + NULL, 0); + nbytes -= n; + cryptLeft -= n; + } + + if (unlikely(err)) { + pr_err("%s: wc_AesGcmDecryptUpdate failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + return err; + } + } + + err = wc_AesGcmDecryptFinal(ctx->aes_encrypt, origAuthTag, tfm->authsize); + if (unlikely(err)) { + pr_err("%s: wc_AesGcmDecryptFinal failed with return code %d\n", + crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)), err); + + if (err == AES_GCM_AUTH_E) { + return -EBADMSG; + } + else { + return -EINVAL; + } + } + + return err; +} + +static struct aead_alg gcmAesAead = { + .base.cra_name = WOLFKM_AESGCM_NAME, + .base.cra_driver_name = WOLFKM_AESGCM_DRIVER, + .base.cra_priority = WOLFSSL_LINUXKM_LKCAPI_PRIORITY, + .base.cra_blocksize = 1, + .base.cra_ctxsize = sizeof(struct km_AesCtx), + .base.cra_module = THIS_MODULE, + .init = km_AesGcmInit, + .exit = km_AesGcmExit, + .setkey = km_AesGcmSetKey, + .setauthsize = km_AesGcmSetAuthsize, + .encrypt = km_AesGcmEncrypt, + .decrypt = km_AesGcmDecrypt, + .ivsize = AES_BLOCK_SIZE, + .maxauthsize = AES_BLOCK_SIZE, + .chunksize = AES_BLOCK_SIZE, +}; +static int gcmAesAead_loaded = 0; + +#endif /* HAVE_AESGCM && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESGCM) && + */ + +#if defined(WOLFSSL_AES_XTS) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESXTS)) + +#ifndef WOLFSSL_AESXTS_STREAM + #error LKCAPI registration of AES-XTS requires WOLFSSL_AESXTS_STREAM (--enable-aesxts-stream). +#endif + +struct km_AesXtsCtx { + XtsAes *aesXts; /* allocated in km_AesXtsInitCommon() to assure alignment + * for AESNI. + */ +}; + +static int km_AesXtsInitCommon(struct km_AesXtsCtx * ctx, const char * name) +{ + int err; + + ctx->aesXts = (XtsAes *)malloc(sizeof(*ctx->aesXts)); + + if (! ctx->aesXts) + return -MEMORY_E; + + err = wc_AesXtsInit(ctx->aesXts, NULL, INVALID_DEVID); + + if (unlikely(err)) { + pr_err("%s: km_AesXtsInitCommon failed: %d\n", name, err); + return -EINVAL; + } + + return 0; +} + +static int km_AesXtsInit(struct crypto_skcipher *tfm) +{ + struct km_AesXtsCtx * ctx = crypto_skcipher_ctx(tfm); + return km_AesXtsInitCommon(ctx, WOLFKM_AESXTS_DRIVER); +} + +static void km_AesXtsExit(struct crypto_skcipher *tfm) +{ + struct km_AesXtsCtx * ctx = crypto_skcipher_ctx(tfm); + wc_AesXtsFree(ctx->aesXts); + free(ctx->aesXts); + ctx->aesXts = NULL; +} + +static int km_AesXtsSetKey(struct crypto_skcipher *tfm, const u8 *in_key, + unsigned int key_len) +{ + int err; + struct km_AesXtsCtx * ctx = crypto_skcipher_ctx(tfm); + + err = wc_AesXtsSetKeyNoInit(ctx->aesXts, in_key, key_len, + AES_ENCRYPTION_AND_DECRYPTION); + + if (unlikely(err)) { + if (! disable_setkey_warnings) + pr_err("%s: wc_AesXtsSetKeyNoInit failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + return 0; +} + +/* see /usr/src/linux/drivers/md/dm-crypt.c */ + +static int km_AesXtsEncrypt(struct skcipher_request *req) +{ + int err = 0; + struct crypto_skcipher * tfm = NULL; + struct km_AesXtsCtx * ctx = NULL; + struct skcipher_walk walk; + unsigned int nbytes = 0; + + tfm = crypto_skcipher_reqtfm(req); + ctx = crypto_skcipher_ctx(tfm); + + if (req->cryptlen < AES_BLOCK_SIZE) + return -EINVAL; + + err = skcipher_walk_virt(&walk, req, false); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_virt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + + if (walk.nbytes == walk.total) { + err = wc_AesXtsEncrypt(ctx->aesXts, walk.dst.virt.addr, + walk.src.virt.addr, walk.nbytes, walk.iv, walk.ivsize); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsEncrypt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, 0); + + } else { + int tail = req->cryptlen % AES_BLOCK_SIZE; + struct skcipher_request subreq; + struct XtsAesStreamData stream; + + if (tail > 0) { + int blocks = DIV_ROUND_UP(req->cryptlen, AES_BLOCK_SIZE) - 2; + + skcipher_walk_abort(&walk); + + skcipher_request_set_tfm(&subreq, tfm); + skcipher_request_set_callback(&subreq, + skcipher_request_flags(req), + NULL, NULL); + skcipher_request_set_crypt(&subreq, req->src, req->dst, + blocks * AES_BLOCK_SIZE, req->iv); + req = &subreq; + + err = skcipher_walk_virt(&walk, req, false); + if (!walk.nbytes) + return err ? : -EINVAL; + } else { + tail = 0; + } + + err = wc_AesXtsEncryptInit(ctx->aesXts, walk.iv, walk.ivsize, &stream); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsEncryptInit failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + while ((nbytes = walk.nbytes) != 0) { + /* if this isn't the final call, pass block-aligned data to prevent + * end-of-message ciphertext stealing. + */ + if (nbytes < walk.total) + nbytes &= ~(AES_BLOCK_SIZE - 1); + + if (nbytes & ((unsigned int)AES_BLOCK_SIZE - 1U)) + err = wc_AesXtsEncryptFinal(ctx->aesXts, walk.dst.virt.addr, + walk.src.virt.addr, nbytes, + &stream); + else + err = wc_AesXtsEncryptUpdate(ctx->aesXts, walk.dst.virt.addr, + walk.src.virt.addr, nbytes, + &stream); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsEncryptUpdate failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, walk.nbytes - nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + } + + if (unlikely(tail > 0)) { + struct scatterlist sg_src[2], sg_dst[2]; + struct scatterlist *src, *dst; + + dst = src = scatterwalk_ffwd(sg_src, req->src, req->cryptlen); + if (req->dst != req->src) + dst = scatterwalk_ffwd(sg_dst, req->dst, req->cryptlen); + + skcipher_request_set_crypt(req, src, dst, AES_BLOCK_SIZE + tail, + req->iv); + + err = skcipher_walk_virt(&walk, &subreq, false); + if (err) + return err; + + err = wc_AesXtsEncryptFinal(ctx->aesXts, walk.dst.virt.addr, + walk.src.virt.addr, walk.nbytes, + &stream); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsEncryptFinal failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, 0); + } else if (! (stream.bytes_crypted_with_this_tweak & ((word32)AES_BLOCK_SIZE - 1U))) { + err = wc_AesXtsEncryptFinal(ctx->aesXts, NULL, NULL, 0, &stream); + } + } + + return err; +} + +static int km_AesXtsDecrypt(struct skcipher_request *req) +{ + int err = 0; + struct crypto_skcipher * tfm = NULL; + struct km_AesXtsCtx * ctx = NULL; + struct skcipher_walk walk; + unsigned int nbytes = 0; + + tfm = crypto_skcipher_reqtfm(req); + ctx = crypto_skcipher_ctx(tfm); + + if (req->cryptlen < AES_BLOCK_SIZE) + return -EINVAL; + + err = skcipher_walk_virt(&walk, req, false); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_virt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + + if (walk.nbytes == walk.total) { + err = wc_AesXtsDecrypt(ctx->aesXts, + walk.dst.virt.addr, walk.src.virt.addr, + walk.nbytes, walk.iv, walk.ivsize); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsDecrypt failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, 0); + } else { + int tail = req->cryptlen % AES_BLOCK_SIZE; + struct skcipher_request subreq; + struct XtsAesStreamData stream; + + if (unlikely(tail > 0)) { + int blocks = DIV_ROUND_UP(req->cryptlen, AES_BLOCK_SIZE) - 2; + + skcipher_walk_abort(&walk); + + skcipher_request_set_tfm(&subreq, tfm); + skcipher_request_set_callback(&subreq, + skcipher_request_flags(req), + NULL, NULL); + skcipher_request_set_crypt(&subreq, req->src, req->dst, + blocks * AES_BLOCK_SIZE, req->iv); + req = &subreq; + + err = skcipher_walk_virt(&walk, req, false); + if (!walk.nbytes) + return err ? : -EINVAL; + } else { + tail = 0; + } + + err = wc_AesXtsDecryptInit(ctx->aesXts, walk.iv, walk.ivsize, &stream); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsDecryptInit failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + while ((nbytes = walk.nbytes) != 0) { + /* if this isn't the final call, pass block-aligned data to prevent + * end-of-message ciphertext stealing. + */ + if (nbytes < walk.total) + nbytes &= ~(AES_BLOCK_SIZE - 1); + + if (nbytes & ((unsigned int)AES_BLOCK_SIZE - 1U)) + err = wc_AesXtsDecryptFinal(ctx->aesXts, walk.dst.virt.addr, + walk.src.virt.addr, nbytes, + &stream); + else + err = wc_AesXtsDecryptUpdate(ctx->aesXts, walk.dst.virt.addr, + walk.src.virt.addr, nbytes, + &stream); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsDecryptUpdate failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, walk.nbytes - nbytes); + + if (unlikely(err)) { + pr_err("%s: skcipher_walk_done failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return err; + } + } + + if (unlikely(tail > 0)) { + struct scatterlist sg_src[2], sg_dst[2]; + struct scatterlist *src, *dst; + + dst = src = scatterwalk_ffwd(sg_src, req->src, req->cryptlen); + if (req->dst != req->src) + dst = scatterwalk_ffwd(sg_dst, req->dst, req->cryptlen); + + skcipher_request_set_crypt(req, src, dst, AES_BLOCK_SIZE + tail, + req->iv); + + err = skcipher_walk_virt(&walk, &subreq, false); + if (err) + return err; + + err = wc_AesXtsDecryptFinal(ctx->aesXts, walk.dst.virt.addr, + walk.src.virt.addr, walk.nbytes, + &stream); + + if (unlikely(err)) { + pr_err("%s: wc_AesXtsDecryptFinal failed: %d\n", + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err); + return -EINVAL; + } + + err = skcipher_walk_done(&walk, 0); + } else if (! (stream.bytes_crypted_with_this_tweak & ((word32)AES_BLOCK_SIZE - 1U))) { + err = wc_AesXtsDecryptFinal(ctx->aesXts, NULL, NULL, 0, &stream); + } + } + return err; +} + +static struct skcipher_alg xtsAesAlg = { + .base.cra_name = WOLFKM_AESXTS_NAME, + .base.cra_driver_name = WOLFKM_AESXTS_DRIVER, + .base.cra_priority = WOLFSSL_LINUXKM_LKCAPI_PRIORITY, + .base.cra_blocksize = AES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct km_AesXtsCtx), + .base.cra_module = THIS_MODULE, + + .min_keysize = 2 * AES_128_KEY_SIZE, + .max_keysize = 2 * AES_256_KEY_SIZE, + .ivsize = AES_BLOCK_SIZE, + .walksize = 2 * AES_BLOCK_SIZE, + .init = km_AesXtsInit, + .exit = km_AesXtsExit, + .setkey = km_AesXtsSetKey, + .encrypt = km_AesXtsEncrypt, + .decrypt = km_AesXtsDecrypt +}; +static int xtsAesAlg_loaded = 0; + +#endif /* WOLFSSL_AES_XTS && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESXTS) + */ + +/* cipher tests, cribbed from test.c, with supplementary LKCAPI tests: */ + +#if defined(HAVE_AES_CBC) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCBC)) + +static int linuxkm_test_aescbc(void) +{ + int ret = 0; + struct crypto_skcipher * tfm = NULL; + struct skcipher_request * req = NULL; + struct scatterlist src, dst; + Aes *aes; + int aes_inited = 0; + static const byte key32[] = + { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 + }; + static const byte p_vector[] = + /* Now is the time for all good men w/o trailing 0 */ + { + 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, + 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20, + 0x67,0x6f,0x6f,0x64,0x20,0x6d,0x65,0x6e + }; + static const byte iv[] = "1234567890abcdef"; + + static const byte c_vector[] = + { + 0xd7,0xd6,0x04,0x5b,0x4d,0xc4,0x90,0xdf, + 0x4a,0x82,0xed,0x61,0x26,0x4e,0x23,0xb3, + 0xe4,0xb5,0x85,0x30,0x29,0x4c,0x9d,0xcf, + 0x73,0xc9,0x46,0xd1,0xaa,0xc8,0xcb,0x62 + }; + + byte iv_copy[sizeof(iv)]; + byte enc[sizeof(p_vector)]; + byte dec[sizeof(p_vector)]; + u8 * enc2 = NULL; + u8 * dec2 = NULL; + + aes = (Aes *)malloc(sizeof(*aes)); + if (aes == NULL) + return -ENOMEM; + + XMEMSET(enc, 0, sizeof(enc)); + XMEMSET(dec, 0, sizeof(enc)); + + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + if (ret) { + pr_err("wolfcrypt wc_AesInit failed with return code %d.\n", ret); + goto test_cbc_end; + } + aes_inited = 1; + + ret = wc_AesSetKey(aes, key32, AES_BLOCK_SIZE * 2, iv, AES_ENCRYPTION); + if (ret) { + pr_err("wolfcrypt wc_AesSetKey failed with return code %d\n", ret); + goto test_cbc_end; + } + + ret = wc_AesCbcEncrypt(aes, enc, p_vector, sizeof(p_vector)); + if (ret) { + pr_err("wolfcrypt wc_AesCbcEncrypt failed with return code %d\n", ret); + goto test_cbc_end; + } + + if (XMEMCMP(enc, c_vector, sizeof(c_vector)) != 0) { + pr_err("wolfcrypt wc_AesCbcEncrypt KAT mismatch\n"); + return LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + } + + /* Re init for decrypt and set flag. */ + wc_AesFree(aes); + aes_inited = 0; + + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + if (ret) { + pr_err("wolfcrypt wc_AesInit failed with return code %d.\n", ret); + goto test_cbc_end; + } + aes_inited = 1; + + ret = wc_AesSetKey(aes, key32, AES_BLOCK_SIZE * 2, iv, AES_DECRYPTION); + if (ret) { + pr_err("wolfcrypt wc_AesSetKey failed with return code %d.\n", ret); + goto test_cbc_end; + } + + ret = wc_AesCbcDecrypt(aes, dec, enc, sizeof(p_vector)); + if (ret) { + pr_err("wolfcrypt wc_AesCbcDecrypt failed with return code %d\n", ret); + goto test_cbc_end; + } + + ret = XMEMCMP(p_vector, dec, sizeof(p_vector)); + if (ret) { + pr_err("error: p_vector and dec do not match: %d\n", ret); + goto test_cbc_end; + } + + /* now the kernel crypto part */ + enc2 = malloc(sizeof(p_vector)); + if (!enc2) { + pr_err("error: malloc failed\n"); + goto test_cbc_end; + } + + dec2 = malloc(sizeof(p_vector)); + if (!dec2) { + pr_err("error: malloc failed\n"); + goto test_cbc_end; + } + + memcpy(dec2, p_vector, sizeof(p_vector)); + + tfm = crypto_alloc_skcipher(WOLFKM_AESCBC_NAME, 0, 0); + if (IS_ERR(tfm)) { + pr_err("error: allocating AES skcipher algorithm %s failed: %ld\n", + WOLFKM_AESCBC_DRIVER, PTR_ERR(tfm)); + goto test_cbc_end; + } + +#ifndef LINUXKM_LKCAPI_PRIORITY_ALLOW_MASKING + { + const char *driver_name = + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); + if (strcmp(driver_name, WOLFKM_AESCBC_DRIVER)) { + pr_err("error: unexpected implementation for %s: %s (expected %s)\n", + WOLFKM_AESCBC_NAME, driver_name, WOLFKM_AESCBC_DRIVER); + ret = -ENOENT; + goto test_cbc_end; + } + } +#endif + + ret = crypto_skcipher_setkey(tfm, key32, AES_BLOCK_SIZE * 2); + if (ret) { + pr_err("error: crypto_skcipher_setkey returned: %d\n", ret); + goto test_cbc_end; + } + + req = skcipher_request_alloc(tfm, GFP_KERNEL); + if (IS_ERR(req)) { + pr_err("error: allocating AES skcipher request %s failed\n", + WOLFKM_AESCBC_DRIVER); + goto test_cbc_end; + } + + sg_init_one(&src, dec2, sizeof(p_vector)); + sg_init_one(&dst, enc2, sizeof(p_vector)); + + XMEMCPY(iv_copy, iv, sizeof(iv)); + skcipher_request_set_crypt(req, &src, &dst, sizeof(p_vector), iv_copy); + + ret = crypto_skcipher_encrypt(req); + + if (ret) { + pr_err("error: crypto_skcipher_encrypt returned: %d\n", ret); + goto test_cbc_end; + } + + ret = XMEMCMP(enc, enc2, sizeof(p_vector)); + if (ret) { + pr_err("error: enc and enc2 do not match: %d\n", ret); + goto test_cbc_end; + } + + memset(dec2, 0, sizeof(p_vector)); + sg_init_one(&src, enc2, sizeof(p_vector)); + sg_init_one(&dst, dec2, sizeof(p_vector)); + + XMEMCPY(iv_copy, iv, sizeof(iv)); + skcipher_request_set_crypt(req, &src, &dst, sizeof(p_vector), iv_copy); + + ret = crypto_skcipher_decrypt(req); + + if (ret) { + pr_err("ERROR: crypto_skcipher_decrypt returned %d\n", ret); + goto test_cbc_end; + } + + ret = XMEMCMP(dec, dec2, sizeof(p_vector)); + if (ret) { + pr_err("error: dec and dec2 do not match: %d\n", ret); + goto test_cbc_end; + } + +test_cbc_end: + + if (enc2) { free(enc2); } + if (dec2) { free(dec2); } + if (req) { skcipher_request_free(req); } + if (tfm) { crypto_free_skcipher(tfm); } + + if (aes_inited) + wc_AesFree(aes); + free(aes); + + return ret; +} + +#endif /* HAVE_AES_CBC && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESCBC) + */ + +#if defined(WOLFSSL_AES_CFB) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCFB)) + +static int linuxkm_test_aescfb(void) +{ + int ret = 0; + struct crypto_skcipher * tfm = NULL; + struct skcipher_request * req = NULL; + struct scatterlist src, dst; + Aes *aes; + int aes_inited = 0; + static const byte key32[] = + { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 + }; + static const byte p_vector[] = + /* Now is the time for all good men w/o trailing 0 */ + { + 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, + 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20, + 0x67,0x6f,0x6f,0x64,0x20,0x6d,0x65,0x6e + }; + static const byte iv[] = "1234567890abcdef"; + static const byte c_vector[] = + { + 0x56,0x35,0x3f,0xdd,0xde,0xa6,0x15,0x87, + 0x57,0xdc,0x34,0x62,0x9a,0x68,0x96,0x51, + 0xc7,0x09,0xb9,0x4e,0x47,0x6b,0x24,0x72, + 0x19,0x5a,0xdf,0x7e,0xba,0xa8,0x01,0xb6 + }; + byte iv_copy[sizeof(iv)]; + byte enc[sizeof(p_vector)]; + byte dec[sizeof(p_vector)]; + u8 * enc2 = NULL; + u8 * dec2 = NULL; + + aes = (Aes *)malloc(sizeof(*aes)); + if (aes == NULL) + return -ENOMEM; + + XMEMSET(enc, 0, sizeof(enc)); + XMEMSET(dec, 0, sizeof(enc)); + + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + if (ret) { + pr_err("wolfcrypt wc_AesInit failed with return code %d.\n", ret); + goto test_cfb_end; + } + aes_inited = 1; + + ret = wc_AesSetKey(aes, key32, AES_BLOCK_SIZE * 2, iv, AES_ENCRYPTION); + if (ret) { + pr_err("wolfcrypt wc_AesSetKey failed with return code %d\n", ret); + goto test_cfb_end; + } + + ret = wc_AesCfbEncrypt(aes, enc, p_vector, sizeof(p_vector)); + if (ret) { + pr_err("wolfcrypt wc_AesCfbEncrypt failed with return code %d\n", ret); + goto test_cfb_end; + } + + if (XMEMCMP(enc, c_vector, sizeof(c_vector)) != 0) { + pr_err("wolfcrypt wc_AesCfbEncrypt KAT mismatch\n"); + return LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + } + + /* Re init for decrypt and set flag. */ + wc_AesFree(aes); + aes_inited = 0; + + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + if (ret) { + pr_err("wolfcrypt wc_AesInit failed with return code %d.\n", ret); + goto test_cfb_end; + } + aes_inited = 1; + + ret = wc_AesSetKey(aes, key32, AES_BLOCK_SIZE * 2, iv, AES_ENCRYPTION); + if (ret) { + pr_err("wolfcrypt wc_AesSetKey failed with return code %d.\n", ret); + goto test_cfb_end; + } + + ret = wc_AesCfbDecrypt(aes, dec, enc, sizeof(p_vector)); + if (ret) { + pr_err("wolfcrypt wc_AesCfbDecrypt failed with return code %d\n", ret); + goto test_cfb_end; + } + + ret = XMEMCMP(p_vector, dec, sizeof(p_vector)); + if (ret) { + pr_err("error: p_vector and dec do not match: %d\n", ret); + goto test_cfb_end; + } + + /* now the kernel crypto part */ + enc2 = malloc(sizeof(p_vector)); + if (!enc2) { + pr_err("error: malloc failed\n"); + goto test_cfb_end; + } + + dec2 = malloc(sizeof(p_vector)); + if (!dec2) { + pr_err("error: malloc failed\n"); + goto test_cfb_end; + } + + memcpy(dec2, p_vector, sizeof(p_vector)); + + tfm = crypto_alloc_skcipher(WOLFKM_AESCFB_NAME, 0, 0); + if (IS_ERR(tfm)) { + pr_err("error: allocating AES skcipher algorithm %s failed: %ld\n", + WOLFKM_AESCFB_DRIVER, PTR_ERR(tfm)); + goto test_cfb_end; + } + +#ifndef LINUXKM_LKCAPI_PRIORITY_ALLOW_MASKING + { + const char *driver_name = + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); + if (strcmp(driver_name, WOLFKM_AESCFB_DRIVER)) { + pr_err("error: unexpected implementation for %s: %s (expected %s)\n", + WOLFKM_AESCFB_NAME, driver_name, WOLFKM_AESCFB_DRIVER); + ret = -ENOENT; + goto test_cfb_end; + } + } +#endif + + ret = crypto_skcipher_setkey(tfm, key32, AES_BLOCK_SIZE * 2); + if (ret) { + pr_err("error: crypto_skcipher_setkey returned: %d\n", ret); + goto test_cfb_end; + } + + req = skcipher_request_alloc(tfm, GFP_KERNEL); + if (IS_ERR(req)) { + pr_err("error: allocating AES skcipher request %s failed\n", + WOLFKM_AESCFB_DRIVER); + goto test_cfb_end; + } + + sg_init_one(&src, dec2, sizeof(p_vector)); + sg_init_one(&dst, enc2, sizeof(p_vector)); + + XMEMCPY(iv_copy, iv, sizeof(iv)); + skcipher_request_set_crypt(req, &src, &dst, sizeof(p_vector), iv_copy); + + ret = crypto_skcipher_encrypt(req); + + if (ret) { + pr_err("error: crypto_skcipher_encrypt returned: %d\n", ret); + goto test_cfb_end; + } + + ret = XMEMCMP(enc, enc2, sizeof(p_vector)); + if (ret) { + pr_err("error: enc and enc2 do not match: %d\n", ret); + goto test_cfb_end; + } + + memset(dec2, 0, sizeof(p_vector)); + sg_init_one(&src, enc2, sizeof(p_vector)); + sg_init_one(&dst, dec2, sizeof(p_vector)); + + XMEMCPY(iv_copy, iv, sizeof(iv)); + skcipher_request_set_crypt(req, &src, &dst, sizeof(p_vector), iv_copy); + + ret = crypto_skcipher_decrypt(req); + + if (ret) { + pr_err("error: crypto_skcipher_decrypt returned: %d\n", ret); + goto test_cfb_end; + } + + ret = XMEMCMP(dec, dec2, sizeof(p_vector)); + if (ret) { + pr_err("error: dec and dec2 do not match: %d\n", ret); + goto test_cfb_end; + } + +test_cfb_end: + + if (enc2) { free(enc2); } + if (dec2) { free(dec2); } + if (req) { skcipher_request_free(req); } + if (tfm) { crypto_free_skcipher(tfm); } + + if (aes_inited) + wc_AesFree(aes); + free(aes); + + return ret; +} + +#endif /* WOLFSSL_AES_CFB && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESCFB) + */ + +#if defined(HAVE_AESGCM) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESGCM)) + +static int linuxkm_test_aesgcm(void) +{ + int ret = 0; + struct crypto_aead * tfm = NULL; + struct aead_request * req = NULL; + struct scatterlist * src = NULL; + struct scatterlist * dst = NULL; + Aes *aes; + int aes_inited = 0; + static const byte key32[] = + { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 + }; + static const byte p_vector[] = + /* Now is the time for all w/o trailing 0 */ + { + 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, + 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 + }; + static const byte assoc[] = + { + 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, + 0xab, 0xad, 0xda, 0xd2 + }; + static const byte ivstr[] = "1234567890abcdef"; + static const byte c_vector[] = + { + 0x0c,0x97,0x05,0x3c,0xef,0x5c,0x63,0x6b, + 0x15,0xe4,0x00,0x63,0xf8,0x8c,0xd0,0x95, + 0x27,0x81,0x90,0x9c,0x9f,0xe6,0x98,0xe9 + }; + static const byte KAT_authTag[] = + { + 0xc9,0xd5,0x7a,0x77,0xac,0x28,0xc2,0xe7, + 0xe4,0x28,0x90,0xaa,0x09,0xab,0xf9,0x7c + }; + byte enc[sizeof(p_vector)]; + byte authTag[AES_BLOCK_SIZE]; + byte dec[sizeof(p_vector)]; + u8 * assoc2 = NULL; + u8 * enc2 = NULL; + u8 * dec2 = NULL; + u8 * iv = NULL; + size_t encryptLen = sizeof(p_vector); + size_t decryptLen = sizeof(p_vector) + sizeof(authTag); + + /* Init stack variables. */ + XMEMSET(enc, 0, sizeof(p_vector)); + XMEMSET(dec, 0, sizeof(p_vector)); + XMEMSET(authTag, 0, AES_BLOCK_SIZE); + + aes = (Aes *)malloc(sizeof(*aes)); + if (aes == NULL) + return -ENOMEM; + + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + if (ret) { + pr_err("error: wc_AesInit failed with return code %d.\n", ret); + goto test_gcm_end; + } + aes_inited = 1; + + ret = wc_AesGcmInit(aes, key32, sizeof(key32)/sizeof(byte), ivstr, + AES_BLOCK_SIZE); + if (ret) { + pr_err("error: wc_AesGcmInit failed with return code %d.\n", ret); + goto test_gcm_end; + } + + ret = wc_AesGcmEncryptUpdate(aes, NULL, NULL, 0, assoc, sizeof(assoc)); + if (ret) { + pr_err("error: wc_AesGcmEncryptUpdate failed with return code %d\n", + ret); + goto test_gcm_end; + } + + ret = wc_AesGcmEncryptUpdate(aes, enc, p_vector, sizeof(p_vector), NULL, 0); + if (ret) { + pr_err("error: wc_AesGcmEncryptUpdate failed with return code %d\n", + ret); + goto test_gcm_end; + } + + if (XMEMCMP(enc, c_vector, sizeof(c_vector)) != 0) { + pr_err("wolfcrypt AES-GCM KAT mismatch on ciphertext\n"); + ret = LINUXKM_LKCAPI_AESGCM_KAT_MISMATCH_E; + goto test_gcm_end; + } + + ret = wc_AesGcmEncryptFinal(aes, authTag, AES_BLOCK_SIZE); + if (ret) { + pr_err("error: wc_AesGcmEncryptFinal failed with return code %d\n", + ret); + goto test_gcm_end; + } + + if (XMEMCMP(authTag, KAT_authTag, sizeof(KAT_authTag)) != 0) { + pr_err("wolfcrypt AES-GCM KAT mismatch on authTag\n"); + ret = LINUXKM_LKCAPI_AESGCM_KAT_MISMATCH_E; + goto test_gcm_end; + } + + ret = wc_AesGcmInit(aes, key32, sizeof(key32)/sizeof(byte), ivstr, + AES_BLOCK_SIZE); + if (ret) { + pr_err("error: wc_AesGcmInit failed with return code %d.\n", ret); + goto test_gcm_end; + } + + ret = wc_AesGcmDecryptUpdate(aes, dec, enc, sizeof(p_vector), + assoc, sizeof(assoc)); + if (ret) { + pr_err("error: wc_AesGcmDecryptUpdate failed with return code %d\n", + ret); + goto test_gcm_end; + } + + ret = wc_AesGcmDecryptFinal(aes, authTag, AES_BLOCK_SIZE); + if (ret) { + pr_err("error: wc_AesGcmEncryptFinal failed with return code %d\n", + ret); + goto test_gcm_end; + } + + ret = XMEMCMP(p_vector, dec, sizeof(p_vector)); + if (ret) { + pr_err("error: gcm: p_vector and dec do not match: %d\n", ret); + goto test_gcm_end; + } + + /* now the kernel crypto part */ + assoc2 = malloc(sizeof(assoc)); + if (IS_ERR(assoc2)) { + pr_err("error: malloc failed\n"); + goto test_gcm_end; + } + memset(assoc2, 0, sizeof(assoc)); + memcpy(assoc2, assoc, sizeof(assoc)); + + iv = malloc(AES_BLOCK_SIZE); + if (IS_ERR(iv)) { + pr_err("error: malloc failed\n"); + goto test_gcm_end; + } + memset(iv, 0, AES_BLOCK_SIZE); + memcpy(iv, ivstr, AES_BLOCK_SIZE); + + enc2 = malloc(decryptLen); + if (IS_ERR(enc2)) { + pr_err("error: malloc failed\n"); + goto test_gcm_end; + } + + dec2 = malloc(decryptLen); + if (IS_ERR(dec2)) { + pr_err("error: malloc failed\n"); + goto test_gcm_end; + } + + memset(enc2, 0, decryptLen); + memset(dec2, 0, decryptLen); + memcpy(dec2, p_vector, sizeof(p_vector)); + + tfm = crypto_alloc_aead(WOLFKM_AESGCM_NAME, 0, 0); + if (IS_ERR(tfm)) { + pr_err("error: allocating AES skcipher algorithm %s failed: %ld\n", + WOLFKM_AESGCM_DRIVER, PTR_ERR(tfm)); + goto test_gcm_end; + } + +#ifndef LINUXKM_LKCAPI_PRIORITY_ALLOW_MASKING + { + const char *driver_name = crypto_tfm_alg_driver_name(crypto_aead_tfm(tfm)); + if (strcmp(driver_name, WOLFKM_AESGCM_DRIVER)) { + pr_err("error: unexpected implementation for %s: %s (expected %s)\n", + WOLFKM_AESGCM_NAME, driver_name, WOLFKM_AESGCM_DRIVER); + ret = -ENOENT; + goto test_gcm_end; + } + } +#endif + + ret = crypto_aead_setkey(tfm, key32, AES_BLOCK_SIZE * 2); + if (ret) { + pr_err("error: crypto_aead_setkey returned: %d\n", ret); + goto test_gcm_end; + } + + ret = crypto_aead_setauthsize(tfm, sizeof(authTag)); + if (ret) { + pr_err("error: crypto_aead_setauthsize returned: %d\n", ret); + goto test_gcm_end; + } + + req = aead_request_alloc(tfm, GFP_KERNEL); + if (IS_ERR(req)) { + pr_err("error: allocating AES aead request %s failed: %ld\n", + WOLFKM_AESCBC_DRIVER, PTR_ERR(req)); + goto test_gcm_end; + } + + src = malloc(sizeof(struct scatterlist) * 2); + dst = malloc(sizeof(struct scatterlist) * 2); + + if (IS_ERR(src) || IS_ERR(dst)) { + pr_err("error: malloc src or dst failed: %ld, %ld\n", + PTR_ERR(src), PTR_ERR(dst)); + goto test_gcm_end; + } + + sg_init_table(src, 2); + sg_set_buf(src, assoc2, sizeof(assoc)); + sg_set_buf(&src[1], dec2, sizeof(p_vector)); + + sg_init_table(dst, 2); + sg_set_buf(dst, assoc2, sizeof(assoc)); + sg_set_buf(&dst[1], enc2, decryptLen); + + aead_request_set_callback(req, 0, NULL, NULL); + aead_request_set_ad(req, sizeof(assoc)); + aead_request_set_crypt(req, src, dst, sizeof(p_vector), iv); + + ret = crypto_aead_encrypt(req); + + if (ret) { + pr_err("error: crypto_aead_encrypt returned: %d\n", ret); + goto test_gcm_end; + } + + ret = XMEMCMP(enc, enc2, sizeof(p_vector)); + if (ret) { + pr_err("error: enc and enc2 do not match: %d\n", ret); + goto test_gcm_end; + } + + ret = XMEMCMP(authTag, enc2 + encryptLen, sizeof(authTag)); + if (ret) { + pr_err("error: authTags do not match: %d\n", ret); + goto test_gcm_end; + } + + /* Now decrypt crypto request. Reverse src and dst. */ + memset(dec2, 0, decryptLen); + aead_request_set_ad(req, sizeof(assoc)); + aead_request_set_crypt(req, dst, src, decryptLen, iv); + + ret = crypto_aead_decrypt(req); + + if (ret) { + pr_err("error: crypto_aead_decrypt returned: %d\n", ret); + goto test_gcm_end; + } + + ret = XMEMCMP(dec, dec2, sizeof(p_vector)); + if (ret) { + pr_err("error: dec and dec2 do not match: %d\n", ret); + goto test_gcm_end; + } + +test_gcm_end: + if (req) { aead_request_free(req); req = NULL; } + if (tfm) { crypto_free_aead(tfm); tfm = NULL; } + + if (src) { free(src); src = NULL; } + if (dst) { free(dst); dst = NULL; } + + if (dec2) { free(dec2); dec2 = NULL; } + if (enc2) { free(enc2); enc2 = NULL; } + + if (assoc2) { free(assoc2); assoc2 = NULL; } + if (iv) { free(iv); iv = NULL; } + + if (aes_inited) + wc_AesFree(aes); + free(aes); + + return ret; +} + +#endif /* HAVE_AESGCM && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESGCM) && + */ + +#if defined(WOLFSSL_AES_XTS) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESXTS)) + +/* test vectors from + * http://csrc.nist.gov/groups/STM/cavp/block-cipher-modes.html + */ +#ifdef WOLFSSL_AES_128 +static int aes_xts_128_test(void) +{ + XtsAes *aes = NULL; + int aes_inited = 0; + int ret = 0; +#define AES_XTS_128_TEST_BUF_SIZ (AES_BLOCK_SIZE * 2 + 8) + unsigned char *buf = NULL; + unsigned char *cipher = NULL; + u8 * enc2 = NULL; + u8 * dec2 = NULL; + struct scatterlist * src = NULL; + struct scatterlist * dst = NULL; + struct crypto_skcipher *tfm = NULL; + struct skcipher_request *req = NULL; + struct XtsAesStreamData stream; + byte* large_input = NULL; + + /* 128 key tests */ + static const unsigned char k1[] = { + 0xa1, 0xb9, 0x0c, 0xba, 0x3f, 0x06, 0xac, 0x35, + 0x3b, 0x2c, 0x34, 0x38, 0x76, 0x08, 0x17, 0x62, + 0x09, 0x09, 0x23, 0x02, 0x6e, 0x91, 0x77, 0x18, + 0x15, 0xf2, 0x9d, 0xab, 0x01, 0x93, 0x2f, 0x2f + }; + + static const unsigned char i1[] = { + 0x4f, 0xae, 0xf7, 0x11, 0x7c, 0xda, 0x59, 0xc6, + 0x6e, 0x4b, 0x92, 0x01, 0x3e, 0x76, 0x8a, 0xd5 + }; + + static const unsigned char p1[] = { + 0xeb, 0xab, 0xce, 0x95, 0xb1, 0x4d, 0x3c, 0x8d, + 0x6f, 0xb3, 0x50, 0x39, 0x07, 0x90, 0x31, 0x1c + }; + + /* plain text test of partial block is not from NIST test vector list */ + static const unsigned char pp[] = { + 0xeb, 0xab, 0xce, 0x95, 0xb1, 0x4d, 0x3c, 0x8d, + 0x6f, 0xb3, 0x50, 0x39, 0x07, 0x90, 0x31, 0x1c, + 0x6e, 0x4b, 0x92, 0x01, 0x3e, 0x76, 0x8a, 0xd5 + }; + + static const unsigned char c1[] = { + 0x77, 0x8a, 0xe8, 0xb4, 0x3c, 0xb9, 0x8d, 0x5a, + 0x82, 0x50, 0x81, 0xd5, 0xbe, 0x47, 0x1c, 0x63 + }; + + /* plain text test of partial block is not from NIST test vector list */ + static const unsigned char cp[] = { + 0x2b, 0xf7, 0x2c, 0xf3, 0xeb, 0x85, 0xef, 0x7b, + 0x0b, 0x76, 0xa0, 0xaa, 0xf3, 0x3f, 0x25, 0x8b, + 0x77, 0x8a, 0xe8, 0xb4, 0x3c, 0xb9, 0x8d, 0x5a + }; + + static const unsigned char k2[] = { + 0x39, 0x25, 0x79, 0x05, 0xdf, 0xcc, 0x77, 0x76, + 0x6c, 0x87, 0x0a, 0x80, 0x6a, 0x60, 0xe3, 0xc0, + 0x93, 0xd1, 0x2a, 0xcf, 0xcb, 0x51, 0x42, 0xfa, + 0x09, 0x69, 0x89, 0x62, 0x5b, 0x60, 0xdb, 0x16 + }; + + static const unsigned char i2[] = { + 0x5c, 0xf7, 0x9d, 0xb6, 0xc5, 0xcd, 0x99, 0x1a, + 0x1c, 0x78, 0x81, 0x42, 0x24, 0x95, 0x1e, 0x84 + }; + + static const unsigned char p2[] = { + 0xbd, 0xc5, 0x46, 0x8f, 0xbc, 0x8d, 0x50, 0xa1, + 0x0d, 0x1c, 0x85, 0x7f, 0x79, 0x1c, 0x5c, 0xba, + 0xb3, 0x81, 0x0d, 0x0d, 0x73, 0xcf, 0x8f, 0x20, + 0x46, 0xb1, 0xd1, 0x9e, 0x7d, 0x5d, 0x8a, 0x56 + }; + + static const unsigned char c2[] = { + 0xd6, 0xbe, 0x04, 0x6d, 0x41, 0xf2, 0x3b, 0x5e, + 0xd7, 0x0b, 0x6b, 0x3d, 0x5c, 0x8e, 0x66, 0x23, + 0x2b, 0xe6, 0xb8, 0x07, 0xd4, 0xdc, 0xc6, 0x0e, + 0xff, 0x8d, 0xbc, 0x1d, 0x9f, 0x7f, 0xc8, 0x22 + }; + +#ifndef HAVE_FIPS /* FIPS requires different keys for main and tweak. */ + static const unsigned char k3[] = { + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + }; + static const unsigned char i3[] = { + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + }; + static const unsigned char p3[] = { + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0xff, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 + }; + static const unsigned char c3[] = { + 0xA2, 0x07, 0x47, 0x76, 0x3F, 0xEC, 0x0C, 0x23, + 0x1B, 0xD0, 0xBD, 0x46, 0x9A, 0x27, 0x38, 0x12, + 0x95, 0x02, 0x3D, 0x5D, 0xC6, 0x94, 0x51, 0x36, + 0xA0, 0x85, 0xD2, 0x69, 0x6E, 0x87, 0x0A, 0xBF, + 0xB5, 0x5A, 0xDD, 0xCB, 0x80, 0xE0, 0xFC, 0xCD + }; +#endif /* HAVE_FIPS */ + + if ((aes = (XtsAes *)XMALLOC(sizeof(*aes), NULL, DYNAMIC_TYPE_AES)) + == NULL) + { + ret = MEMORY_E; + goto out; + } + + if ((buf = (unsigned char *)XMALLOC(AES_XTS_128_TEST_BUF_SIZ, NULL, + DYNAMIC_TYPE_AES)) == NULL) + { + ret = MEMORY_E; + goto out; + } + if ((cipher = (unsigned char *)XMALLOC(AES_XTS_128_TEST_BUF_SIZ, NULL, + DYNAMIC_TYPE_AES)) == NULL) + { + ret = MEMORY_E; + goto out; + } + + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsInit(aes, NULL, INVALID_DEVID); + if (ret != 0) + goto out; + else + aes_inited = 1; + + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_ENCRYPTION); + if (ret != 0) + goto out; + + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); + if (ret != 0) + goto out; + if (XMEMCMP(c2, buf, sizeof(c2))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + goto out; + if (XMEMCMP(c2, buf, sizeof(c2))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } +#endif + + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + + ret = wc_AesXtsEncryptInit(aes, i2, sizeof(i2), &stream); + if (ret != 0) + goto out; + ret = wc_AesXtsEncryptUpdate(aes, buf, p2, AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE, + p2 + AES_BLOCK_SIZE, + sizeof(p2) - AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + if (XMEMCMP(c2, buf, sizeof(c2))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); + if (ret != 0) + goto out; + if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + goto out; + if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } +#endif + + /* partial block encryption test */ + XMEMSET(cipher, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsEncrypt(aes, cipher, pp, sizeof(pp), i1, sizeof(i1)); + if (ret != 0) + goto out; + if (XMEMCMP(cp, cipher, sizeof(cp))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(cipher, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsEncrypt(aes, cipher, pp, sizeof(pp), i1, sizeof(i1)); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + goto out; + if (XMEMCMP(cp, cipher, sizeof(cp))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } +#endif + + /* partial block decrypt test */ + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); + if (ret != 0) + goto out; + if (XMEMCMP(pp, buf, sizeof(pp))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + goto out; + if (XMEMCMP(pp, buf, sizeof(pp))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } +#endif + + /* NIST decrypt test vector */ + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); + if (ret != 0) + goto out; + if (XMEMCMP(p1, buf, AES_BLOCK_SIZE)) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + goto out; + if (XMEMCMP(p1, buf, AES_BLOCK_SIZE)) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } +#endif + + /* fail case with decrypting using wrong key */ + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); + if (ret != 0) + goto out; + if (XMEMCMP(p2, buf, sizeof(p2)) == 0) { /* fail case with wrong key */ + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + /* set correct key and retest */ + XMEMSET(buf, 0, AES_XTS_128_TEST_BUF_SIZ); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); + if (ret != 0) + goto out; + if (XMEMCMP(p2, buf, sizeof(p2))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + +#ifndef HAVE_FIPS + + /* Test ciphertext stealing in-place. */ + XMEMCPY(buf, p3, sizeof(p3)); + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_ENCRYPTION); + if (ret != 0) + goto out; + + ret = wc_AesXtsEncrypt(aes, buf, buf, sizeof(p3), i3, sizeof(i3)); + if (ret != 0) + goto out; + if (XMEMCMP(c3, buf, sizeof(c3))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecrypt(aes, buf, buf, sizeof(c3), i3, sizeof(i3)); + if (ret != 0) + goto out; + if (XMEMCMP(p3, buf, sizeof(p3))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + +#endif /* HAVE_FIPS */ + + { + #define LARGE_XTS_SZ 1024 + int i; + int j; + int k; + + large_input = (byte *)XMALLOC(LARGE_XTS_SZ, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (large_input == NULL) { + ret = MEMORY_E; + goto out; + } + + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + /* first, encrypt block by block then decrypt with a one-shot call. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); + if (ret != 0) + goto out; + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsEncryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + if (ret != 0) + goto out; + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + } + } + + /* second, encrypt with a one-shot call then decrypt block by block. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsEncrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + if (ret != 0) + goto out; + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); + if (ret != 0) + goto out; + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsDecryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + } + } + } + + /* now the kernel crypto part */ + + enc2 = XMALLOC(sizeof(pp), NULL, DYNAMIC_TYPE_AES); + if (!enc2) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + dec2 = XMALLOC(sizeof(pp), NULL, DYNAMIC_TYPE_AES); + if (!dec2) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + src = XMALLOC(sizeof(*src) * 2, NULL, DYNAMIC_TYPE_AES); + if (! src) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + dst = XMALLOC(sizeof(*dst) * 2, NULL, DYNAMIC_TYPE_AES); + if (! dst) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + tfm = crypto_alloc_skcipher(WOLFKM_AESXTS_NAME, 0, 0); + if (IS_ERR(tfm)) { + ret = PTR_ERR(tfm); + pr_err("error: allocating AES skcipher algorithm %s failed: %d\n", + WOLFKM_AESXTS_DRIVER, ret); + goto test_xts_end; + } + +#ifndef LINUXKM_LKCAPI_PRIORITY_ALLOW_MASKING + { + const char *driver_name = + crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); + if (strcmp(driver_name, WOLFKM_AESXTS_DRIVER)) { + pr_err("error: unexpected implementation for %s: %s (expected %s)\n", + WOLFKM_AESXTS_NAME, driver_name, WOLFKM_AESXTS_DRIVER); + ret = -ENOENT; + goto test_xts_end; + } + } +#endif + + ret = crypto_skcipher_ivsize(tfm); + if (ret != sizeof(stream.tweak_block)) { + pr_err("error: AES skcipher algorithm %s crypto_skcipher_ivsize()" + " returned %d but expected %d\n", + WOLFKM_AESXTS_DRIVER, ret, (int)sizeof(stream.tweak_block)); + ret = -EINVAL; + goto test_xts_end; + } + + ret = crypto_skcipher_setkey(tfm, k1, sizeof(k1)); + if (ret) { + pr_err("error: crypto_skcipher_setkey for %s returned: %d\n", + WOLFKM_AESXTS_NAME, ret); + goto test_xts_end; + } + + req = skcipher_request_alloc(tfm, GFP_KERNEL); + if (IS_ERR(req)) { + ret = PTR_ERR(req); + pr_err("error: allocating AES skcipher request %s failed: %d\n", + WOLFKM_AESXTS_DRIVER, ret); + goto test_xts_end; + } + + memcpy(dec2, p1, sizeof(p1)); + memset(enc2, 0, sizeof(p1)); + + sg_init_one(src, dec2, sizeof(p1)); + sg_init_one(dst, enc2, sizeof(p1)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(p1), stream.tweak_block); + + ret = crypto_skcipher_encrypt(req); + + if (ret) { + pr_err("error: crypto_skcipher_encrypt returned: %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(c1, enc2, sizeof(c1)); + if (ret) { + pr_err("error: c1 and enc2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + memset(dec2, 0, sizeof(p1)); + sg_init_one(src, enc2, sizeof(p1)); + sg_init_one(dst, dec2, sizeof(p1)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(p1), stream.tweak_block); + + ret = crypto_skcipher_decrypt(req); + + if (ret) { + pr_err("ERROR: crypto_skcipher_decrypt returned %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(p1, dec2, sizeof(p1)); + if (ret) { + pr_err("error: p1 and dec2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + memcpy(dec2, pp, sizeof(pp)); + memset(enc2, 0, sizeof(pp)); + + sg_init_one(src, dec2, sizeof(pp)); + sg_init_one(dst, enc2, sizeof(pp)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(pp), stream.tweak_block); + + ret = crypto_skcipher_encrypt(req); + + if (ret) { + pr_err("error: crypto_skcipher_encrypt returned: %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(cp, enc2, sizeof(cp)); + if (ret) { + pr_err("error: cp and enc2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + memset(dec2, 0, sizeof(pp)); + sg_init_one(src, enc2, sizeof(pp)); + sg_init_one(dst, dec2, sizeof(pp)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(pp), stream.tweak_block); + + ret = crypto_skcipher_decrypt(req); + + if (ret) { + pr_err("ERROR: crypto_skcipher_decrypt returned %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(pp, dec2, sizeof(pp)); + if (ret) { + pr_err("error: pp and dec2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + test_xts_end: + + if (enc2) + XFREE(enc2, NULL, DYNAMIC_TYPE_AES); + if (dec2) + XFREE(dec2, NULL, DYNAMIC_TYPE_AES); + if (src) + XFREE(src, NULL, DYNAMIC_TYPE_AES); + if (dst) + XFREE(dst, NULL, DYNAMIC_TYPE_AES); + if (req) + skcipher_request_free(req); + if (tfm) + crypto_free_skcipher(tfm); + + out: + + if (large_input) + XFREE(large_input, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + if (aes_inited) + wc_AesXtsFree(aes); + + if (buf) + XFREE(buf, NULL, DYNAMIC_TYPE_AES); + if (cipher) + XFREE(cipher, NULL, DYNAMIC_TYPE_AES); + + if (aes) + XFREE(aes, NULL, DYNAMIC_TYPE_AES); + +#undef AES_XTS_128_TEST_BUF_SIZ + + return ret; +} +#endif /* WOLFSSL_AES_128 */ + +#ifdef WOLFSSL_AES_256 +static int aes_xts_256_test(void) +{ + XtsAes *aes = NULL; + int aes_inited = 0; + int ret = 0; +#define AES_XTS_256_TEST_BUF_SIZ (AES_BLOCK_SIZE * 3) + unsigned char *buf = NULL; + unsigned char *cipher = NULL; + u8 * enc2 = NULL; + u8 * dec2 = NULL; + struct scatterlist * src = NULL; + struct scatterlist * dst = NULL; + struct crypto_skcipher *tfm = NULL; + struct skcipher_request *req = NULL; + struct XtsAesStreamData stream; + byte* large_input = NULL; + + /* 256 key tests */ + static const unsigned char k1[] = { + 0x1e, 0xa6, 0x61, 0xc5, 0x8d, 0x94, 0x3a, 0x0e, + 0x48, 0x01, 0xe4, 0x2f, 0x4b, 0x09, 0x47, 0x14, + 0x9e, 0x7f, 0x9f, 0x8e, 0x3e, 0x68, 0xd0, 0xc7, + 0x50, 0x52, 0x10, 0xbd, 0x31, 0x1a, 0x0e, 0x7c, + 0xd6, 0xe1, 0x3f, 0xfd, 0xf2, 0x41, 0x8d, 0x8d, + 0x19, 0x11, 0xc0, 0x04, 0xcd, 0xa5, 0x8d, 0xa3, + 0xd6, 0x19, 0xb7, 0xe2, 0xb9, 0x14, 0x1e, 0x58, + 0x31, 0x8e, 0xea, 0x39, 0x2c, 0xf4, 0x1b, 0x08 + }; + + static const unsigned char i1[] = { + 0xad, 0xf8, 0xd9, 0x26, 0x27, 0x46, 0x4a, 0xd2, + 0xf0, 0x42, 0x8e, 0x84, 0xa9, 0xf8, 0x75, 0x64 + }; + + static const unsigned char p1[] = { + 0x2e, 0xed, 0xea, 0x52, 0xcd, 0x82, 0x15, 0xe1, + 0xac, 0xc6, 0x47, 0xe8, 0x10, 0xbb, 0xc3, 0x64, + 0x2e, 0x87, 0x28, 0x7f, 0x8d, 0x2e, 0x57, 0xe3, + 0x6c, 0x0a, 0x24, 0xfb, 0xc1, 0x2a, 0x20, 0x2e + }; + + static const unsigned char c1[] = { + 0xcb, 0xaa, 0xd0, 0xe2, 0xf6, 0xce, 0xa3, 0xf5, + 0x0b, 0x37, 0xf9, 0x34, 0xd4, 0x6a, 0x9b, 0x13, + 0x0b, 0x9d, 0x54, 0xf0, 0x7e, 0x34, 0xf3, 0x6a, + 0xf7, 0x93, 0xe8, 0x6f, 0x73, 0xc6, 0xd7, 0xdb + }; + + /* plain text test of partial block is not from NIST test vector list */ + static const unsigned char pp[] = { + 0xeb, 0xab, 0xce, 0x95, 0xb1, 0x4d, 0x3c, 0x8d, + 0x6f, 0xb3, 0x50, 0x39, 0x07, 0x90, 0x31, 0x1c, + 0x6e, 0x4b, 0x92, 0x01, 0x3e, 0x76, 0x8a, 0xd5 + }; + + static const unsigned char cp[] = { + 0x65, 0x5e, 0x1d, 0x37, 0x4a, 0x91, 0xe7, 0x6c, + 0x4f, 0x83, 0x92, 0xbc, 0x5a, 0x10, 0x55, 0x27, + 0x61, 0x0e, 0x5a, 0xde, 0xca, 0xc5, 0x12, 0xd8 + }; + + static const unsigned char k2[] = { + 0xad, 0x50, 0x4b, 0x85, 0xd7, 0x51, 0xbf, 0xba, + 0x69, 0x13, 0xb4, 0xcc, 0x79, 0xb6, 0x5a, 0x62, + 0xf7, 0xf3, 0x9d, 0x36, 0x0f, 0x35, 0xb5, 0xec, + 0x4a, 0x7e, 0x95, 0xbd, 0x9b, 0xa5, 0xf2, 0xec, + 0xc1, 0xd7, 0x7e, 0xa3, 0xc3, 0x74, 0xbd, 0x4b, + 0x13, 0x1b, 0x07, 0x83, 0x87, 0xdd, 0x55, 0x5a, + 0xb5, 0xb0, 0xc7, 0xe5, 0x2d, 0xb5, 0x06, 0x12, + 0xd2, 0xb5, 0x3a, 0xcb, 0x47, 0x8a, 0x53, 0xb4 + }; + + static const unsigned char i2[] = { + 0xe6, 0x42, 0x19, 0xed, 0xe0, 0xe1, 0xc2, 0xa0, + 0x0e, 0xf5, 0x58, 0x6a, 0xc4, 0x9b, 0xeb, 0x6f + }; + + static const unsigned char p2[] = { + 0x24, 0xcb, 0x76, 0x22, 0x55, 0xb5, 0xa8, 0x00, + 0xf4, 0x6e, 0x80, 0x60, 0x56, 0x9e, 0x05, 0x53, + 0xbc, 0xfe, 0x86, 0x55, 0x3b, 0xca, 0xd5, 0x89, + 0xc7, 0x54, 0x1a, 0x73, 0xac, 0xc3, 0x9a, 0xbd, + 0x53, 0xc4, 0x07, 0x76, 0xd8, 0xe8, 0x22, 0x61, + 0x9e, 0xa9, 0xad, 0x77, 0xa0, 0x13, 0x4c, 0xfc + }; + + static const unsigned char c2[] = { + 0xa3, 0xc6, 0xf3, 0xf3, 0x82, 0x79, 0x5b, 0x10, + 0x87, 0xd7, 0x02, 0x50, 0xdb, 0x2c, 0xd3, 0xb1, + 0xa1, 0x62, 0xa8, 0xb6, 0xdc, 0x12, 0x60, 0x61, + 0xc1, 0x0a, 0x84, 0xa5, 0x85, 0x3f, 0x3a, 0x89, + 0xe6, 0x6c, 0xdb, 0xb7, 0x9a, 0xb4, 0x28, 0x9b, + 0xc3, 0xea, 0xd8, 0x10, 0xe9, 0xc0, 0xaf, 0x92 + }; + + if ((aes = (XtsAes *)XMALLOC(sizeof(*aes), NULL, DYNAMIC_TYPE_AES)) + == NULL) + { + ret = MEMORY_E; + goto out; + } + + if ((buf = (unsigned char *)XMALLOC(AES_XTS_256_TEST_BUF_SIZ, NULL, + DYNAMIC_TYPE_AES)) == NULL) + { + ret = MEMORY_E; + goto out; + } + if ((cipher = (unsigned char *)XMALLOC(AES_XTS_256_TEST_BUF_SIZ, NULL, + DYNAMIC_TYPE_AES)) == NULL) + { + ret = MEMORY_E; + goto out; + } + + ret = wc_AesXtsInit(aes, NULL, INVALID_DEVID); + if (ret != 0) + goto out; + else + aes_inited = 1; + + XMEMSET(buf, 0, AES_XTS_256_TEST_BUF_SIZ); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_ENCRYPTION); + if (ret != 0) + goto out; + + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); + if (ret != 0) + goto out; + if (XMEMCMP(c2, buf, sizeof(c2))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + XMEMSET(buf, 0, AES_XTS_256_TEST_BUF_SIZ); + + ret = wc_AesXtsEncryptInit(aes, i2, sizeof(i2), &stream); + if (ret != 0) + goto out; + ret = wc_AesXtsEncryptUpdate(aes, buf, p2, AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE, + p2 + AES_BLOCK_SIZE, + sizeof(p2) - AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + if (XMEMCMP(c2, buf, sizeof(c2))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + XMEMSET(buf, 0, AES_XTS_256_TEST_BUF_SIZ); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); + if (ret != 0) + goto out; + if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + /* partial block encryption test */ + XMEMSET(cipher, 0, AES_XTS_256_TEST_BUF_SIZ); + ret = wc_AesXtsEncrypt(aes, cipher, pp, sizeof(pp), i1, sizeof(i1)); + if (ret != 0) + goto out; + + /* partial block decrypt test */ + XMEMSET(buf, 0, AES_XTS_256_TEST_BUF_SIZ); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); + if (ret != 0) + goto out; + if (XMEMCMP(pp, buf, sizeof(pp))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + /* NIST decrypt test vector */ + XMEMSET(buf, 0, AES_XTS_256_TEST_BUF_SIZ); + ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); + if (ret != 0) + goto out; + if (XMEMCMP(p1, buf, AES_BLOCK_SIZE)) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + XMEMSET(buf, 0, AES_XTS_256_TEST_BUF_SIZ); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); + if (ret != 0) + goto out; + if (XMEMCMP(p2, buf, sizeof(p2))) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + + { + #define LARGE_XTS_SZ 1024 + int i; + int j; + int k; + + large_input = (byte *)XMALLOC(LARGE_XTS_SZ, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (large_input == NULL) { + ret = MEMORY_E; + goto out; + } + + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + /* first, encrypt block by block then decrypt with a one-shot call. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); + if (ret != 0) + goto out; + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsEncryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + if (ret != 0) + goto out; + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + } + } + + /* second, encrypt with a one-shot call then decrypt block by block. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsEncrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + if (ret != 0) + goto out; + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + goto out; + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); + if (ret != 0) + goto out; + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsDecryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + if (ret != 0) + goto out; + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ret = LINUXKM_LKCAPI_AES_KAT_MISMATCH_E; + goto out; + } + } + } + } + + /* now the kernel crypto part */ + + enc2 = XMALLOC(sizeof(p1), NULL, DYNAMIC_TYPE_AES); + if (!enc2) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + dec2 = XMALLOC(sizeof(p1), NULL, DYNAMIC_TYPE_AES); + if (!dec2) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + src = XMALLOC(sizeof(*src) * 2, NULL, DYNAMIC_TYPE_AES); + if (! src) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + dst = XMALLOC(sizeof(*dst) * 2, NULL, DYNAMIC_TYPE_AES); + if (! dst) { + pr_err("error: malloc failed\n"); + ret = -ENOMEM; + goto test_xts_end; + } + + tfm = crypto_alloc_skcipher(WOLFKM_AESXTS_NAME, 0, 0); + if (IS_ERR(tfm)) { + ret = PTR_ERR(tfm); + pr_err("error: allocating AES skcipher algorithm %s failed: %d\n", + WOLFKM_AESXTS_DRIVER, ret); + goto test_xts_end; + } + +#ifndef LINUXKM_LKCAPI_PRIORITY_ALLOW_MASKING + { + const char *driver_name = crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)); + if (strcmp(driver_name, WOLFKM_AESXTS_DRIVER)) { + pr_err("error: unexpected implementation for %s: %s (expected %s)\n", + WOLFKM_AESXTS_NAME, driver_name, WOLFKM_AESXTS_DRIVER); + ret = -ENOENT; + goto test_xts_end; + } + } +#endif + + ret = crypto_skcipher_ivsize(tfm); + if (ret != sizeof(stream.tweak_block)) { + pr_err("error: AES skcipher algorithm %s crypto_skcipher_ivsize()" + " returned %d but expected %d\n", + WOLFKM_AESXTS_DRIVER, ret, (int)sizeof(stream.tweak_block)); + ret = -EINVAL; + goto test_xts_end; + } + + ret = crypto_skcipher_setkey(tfm, k1, sizeof(k1)); + if (ret) { + pr_err("error: crypto_skcipher_setkey for %s returned: %d\n", + WOLFKM_AESXTS_NAME, ret); + goto test_xts_end; + } + + req = skcipher_request_alloc(tfm, GFP_KERNEL); + if (IS_ERR(req)) { + ret = PTR_ERR(req); + pr_err("error: allocating AES skcipher request %s failed: %d\n", + WOLFKM_AESXTS_DRIVER, ret); + goto test_xts_end; + } + + memcpy(dec2, p1, sizeof(p1)); + memset(enc2, 0, sizeof(p1)); + + sg_init_one(src, dec2, sizeof(p1)); + sg_init_one(dst, enc2, sizeof(p1)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(p1), stream.tweak_block); + + ret = crypto_skcipher_encrypt(req); + + if (ret) { + pr_err("error: crypto_skcipher_encrypt returned: %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(c1, enc2, sizeof(c1)); + if (ret) { + pr_err("error: c1 and enc2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + memset(dec2, 0, sizeof(p1)); + sg_init_one(src, enc2, sizeof(p1)); + sg_init_one(dst, dec2, sizeof(p1)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(p1), stream.tweak_block); + + ret = crypto_skcipher_decrypt(req); + + if (ret) { + pr_err("ERROR: crypto_skcipher_decrypt returned %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(p1, dec2, sizeof(p1)); + if (ret) { + pr_err("error: p1 and dec2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + memcpy(dec2, pp, sizeof(pp)); + memset(enc2, 0, sizeof(pp)); + + sg_init_one(src, dec2, sizeof(pp)); + sg_init_one(dst, enc2, sizeof(pp)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(pp), stream.tweak_block); + + ret = crypto_skcipher_encrypt(req); + + if (ret) { + pr_err("error: crypto_skcipher_encrypt returned: %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(cp, enc2, sizeof(cp)); + if (ret) { + pr_err("error: cp and enc2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + memset(dec2, 0, sizeof(pp)); + sg_init_one(src, enc2, sizeof(pp)); + sg_init_one(dst, dec2, sizeof(pp)); + + memcpy(stream.tweak_block, i1, sizeof(stream.tweak_block)); + skcipher_request_set_crypt(req, src, dst, sizeof(pp), stream.tweak_block); + + ret = crypto_skcipher_decrypt(req); + + if (ret) { + pr_err("ERROR: crypto_skcipher_decrypt returned %d\n", ret); + goto test_xts_end; + } + + ret = XMEMCMP(pp, dec2, sizeof(pp)); + if (ret) { + pr_err("error: pp and dec2 do not match: %d\n", ret); + ret = -EINVAL; + goto test_xts_end; + } + + test_xts_end: + + if (enc2) + XFREE(enc2, NULL, DYNAMIC_TYPE_AES); + if (dec2) + XFREE(dec2, NULL, DYNAMIC_TYPE_AES); + if (src) + XFREE(src, NULL, DYNAMIC_TYPE_AES); + if (dst) + XFREE(dst, NULL, DYNAMIC_TYPE_AES); + if (req) + skcipher_request_free(req); + if (tfm) + crypto_free_skcipher(tfm); + + out: + + if (large_input) + XFREE(large_input, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + if (aes_inited) + wc_AesXtsFree(aes); + + if (buf) + XFREE(buf, NULL, DYNAMIC_TYPE_AES); + if (cipher) + XFREE(cipher, NULL, DYNAMIC_TYPE_AES); + + if (aes) + XFREE(aes, NULL, DYNAMIC_TYPE_AES); + +#undef AES_XTS_256_TEST_BUF_SIZ + + return ret; +} +#endif /* WOLFSSL_AES_256 */ + +static int linuxkm_test_aesxts(void) { + int ret; + + #ifdef WOLFSSL_AES_128 + ret = aes_xts_128_test(); + if (ret != 0) { + pr_err("aes_xts_128_test() failed with retval %d.\n", ret); + goto out; + } + #endif + #ifdef WOLFSSL_AES_256 + ret = aes_xts_256_test(); + if (ret != 0) { + pr_err("aes_xts_256_test() failed with retval %d.\n", ret); + goto out; + } + #endif + +out: + + return ret; +} + +#endif /* WOLFSSL_AES_XTS && + * (LINUXKM_LKCAPI_REGISTER_ALL || LINUXKM_LKCAPI_REGISTER_AESXTS) + */ + +#endif /* !NO_AES */ + +#if defined(HAVE_FIPS) && defined(CONFIG_CRYPTO_MANAGER) && \ + !defined(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) + #ifdef CONFIG_CRYPTO_FIPS + #include + #else + #error wolfCrypt FIPS with LINUXKM_LKCAPI_REGISTER and CONFIG_CRYPTO_MANAGER requires CONFIG_CRYPTO_FIPS + #endif +#endif + +static int linuxkm_lkcapi_register(void) +{ + int ret = 0; +#if defined(HAVE_FIPS) && defined(CONFIG_CRYPTO_MANAGER) && \ + !defined(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) + int enabled_fips = 0; +#endif + +#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS + /* temporarily disable warnings around setkey failures, which are expected + * from the crypto fuzzer in FIPS configs, and potentially in others. + * unexpected setkey failures are fatal errors returned by the fuzzer. + */ + disable_setkey_warnings = 1; +#endif +#if defined(HAVE_FIPS) && defined(CONFIG_CRYPTO_MANAGER) && \ + !defined(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) + if (! fips_enabled) { + /* temporarily assert system-wide FIPS status, to disable FIPS-forbidden + * test vectors and fuzzing from the CRYPTO_MANAGER. + */ + enabled_fips = fips_enabled = 1; + } +#endif + +#define REGISTER_ALG(alg, installer, tester) do { \ + if (alg ## _loaded) { \ + pr_err("ERROR: %s is already registered.\n", \ + (alg).base.cra_driver_name); \ + ret = -EEXIST; \ + goto out; \ + } \ + \ + ret = (installer)(&(alg)); \ + \ + if (ret) { \ + pr_err("ERROR: " #installer " for %s failed " \ + "with return code %d.\n", \ + (alg).base.cra_driver_name, ret); \ + goto out; \ + } \ + \ + alg ## _loaded = 1; \ + \ + ret = (tester()); \ + \ + if (ret) { \ + pr_err("ERROR: self-test for %s failed " \ + "with return code %d.\n", \ + (alg).base.cra_driver_name, ret); \ + goto out; \ + } \ + pr_info("%s self-test OK -- " \ + "registered for %s with priority %d.\n", \ + (alg).base.cra_driver_name, \ + (alg).base.cra_name, \ + (alg).base.cra_priority); \ + } while (0) + +#if defined(HAVE_AES_CBC) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCBC)) + + REGISTER_ALG(cbcAesAlg, crypto_register_skcipher, linuxkm_test_aescbc); +#endif + +#if defined(WOLFSSL_AES_CFB) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCFB)) + + REGISTER_ALG(cfbAesAlg, crypto_register_skcipher, linuxkm_test_aescfb); +#endif + +#if defined(HAVE_AESGCM) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESGCM)) + + REGISTER_ALG(gcmAesAead, crypto_register_aead, linuxkm_test_aesgcm); +#endif + +#if defined(WOLFSSL_AES_XTS) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESXTS)) + + REGISTER_ALG(xtsAesAlg, crypto_register_skcipher, linuxkm_test_aesxts); +#endif + +#undef REGISTER_ALG + + out: + +#if defined(HAVE_FIPS) && defined(CONFIG_CRYPTO_MANAGER) && \ + !defined(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) + if (enabled_fips) + fips_enabled = 0; +#endif +#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS + disable_setkey_warnings = 0; +#endif + + return ret; +} + +static void linuxkm_lkcapi_unregister(void) +{ +#define UNREGISTER_ALG(alg, uninstaller) do { \ + if (alg ## _loaded) { \ + (uninstaller)(&(alg)); \ + alg ## _loaded = 0; \ + } \ + } while (0) + +#if defined(HAVE_AES_CBC) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCBC)) + + UNREGISTER_ALG(cbcAesAlg, crypto_unregister_skcipher); +#endif +#if defined(WOLFSSL_AES_CFB) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESCFB)) + + UNREGISTER_ALG(cfbAesAlg, crypto_unregister_skcipher); +#endif +#if defined(HAVE_AESGCM) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESGCM)) + + UNREGISTER_ALG(gcmAesAead, crypto_unregister_aead); +#endif +#if defined(WOLFSSL_AES_XTS) && \ + (defined(LINUXKM_LKCAPI_REGISTER_ALL) || \ + defined(LINUXKM_LKCAPI_REGISTER_AESXTS)) + + UNREGISTER_ALG(xtsAesAlg, crypto_unregister_skcipher); +#endif + +#undef UNREGISTER_ALG +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/module_exports.c.template mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/module_exports.c.template --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/module_exports.c.template 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/module_exports.c.template 2024-08-03 07:30:00.000000000 +0000 @@ -149,14 +149,39 @@ #include #endif +#ifdef WOLFSSL_HAVE_KYBER + #include +#ifdef WOLFSSL_WC_KYBER + #include +#endif +#endif +#if defined(WOLFSSL_HAVE_XMSS) + #include +#ifdef HAVE_LIBXMSS + #include +#else + #include +#endif +#endif +#if defined(WOLFSSL_HAVE_LMS) + #include +#ifdef HAVE_LIBLMS + #include +#else + #include +#endif +#endif + #ifdef OPENSSL_EXTRA #ifndef WOLFCRYPT_ONLY - #include + #include #endif #include #include #include #include + #include + #include #endif #if defined(NO_FILESYSTEM) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/module_hooks.c mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/module_hooks.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/module_hooks.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/module_hooks.c 2024-08-03 07:30:00.000000000 +0000 @@ -20,8 +20,12 @@ */ #ifndef WOLFSSL_LICENSE +#ifdef WOLFSSL_COMMERCIAL_LICENSE +#define WOLFSSL_LICENSE "wolfSSL Commercial" +#else #define WOLFSSL_LICENSE "GPL v2" #endif +#endif #define FIPS_NO_WRAPPERS @@ -43,7 +47,6 @@ #endif #ifndef NO_CRYPT_TEST #include - #include #endif static int libwolfssl_cleanup(void) { @@ -67,6 +70,8 @@ #ifdef HAVE_LINUXKM_PIE_SUPPORT +#ifdef DEBUG_LINUXKM_PIE_SUPPORT + extern int wolfCrypt_PIE_first_function(void); extern int wolfCrypt_PIE_last_function(void); extern const unsigned int wolfCrypt_PIE_rodata_start[]; @@ -86,6 +91,8 @@ return sum; } +#endif /* DEBUG_LINUXKM_PIE_SUPPORT */ + #ifdef USE_WOLFSSL_LINUXKM_PIE_REDIRECT_TABLE extern struct wolfssl_linuxkm_pie_redirect_table wolfssl_linuxkm_pie_redirect_table; static int set_up_wolfssl_linuxkm_pie_redirect_table(void); @@ -114,14 +121,17 @@ #endif #ifdef WOLFSSL_LINUXKM_BENCHMARKS -#undef HAVE_PTHREAD -#define STRING_USER -#define NO_MAIN_FUNCTION -#define current_time benchmark_current_time -#define WOLFSSL_NO_FLOAT_FMT -#include "wolfcrypt/benchmark/benchmark.c" +extern int wolfcrypt_benchmark_main(int argc, char** argv); #endif /* WOLFSSL_LINUXKM_BENCHMARKS */ +#ifdef LINUXKM_LKCAPI_REGISTER + #include "linuxkm/lkcapi_glue.c" +#endif + +#if defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) && defined(CONFIG_X86) + #include "linuxkm/x86_vector_register_glue.c" +#endif + #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) static int __init wolfssl_init(void) #else @@ -148,7 +158,7 @@ return ret; #endif -#ifdef HAVE_LINUXKM_PIE_SUPPORT +#if defined(HAVE_LINUXKM_PIE_SUPPORT) && defined(DEBUG_LINUXKM_PIE_SUPPORT) #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0) /* see linux commit ac3b432839 */ @@ -215,7 +225,7 @@ text_hash, pie_text_end-pie_text_start, rodata_hash, pie_rodata_end-pie_rodata_start); } -#endif /* HAVE_LINUXKM_PIE_SUPPORT */ +#endif /* HAVE_LINUXKM_PIE_SUPPORT && DEBUG_LINUXKM_PIE_SUPPORT */ #ifdef HAVE_FIPS ret = wolfCrypt_SetCb_fips(lkmFipsCb); @@ -226,7 +236,7 @@ fipsEntry(); ret = wolfCrypt_GetStatus_fips(); if (ret != 0) { - pr_err("wolfCrypt_GetStatus_fips() failed: %s\n", wc_GetErrorString(ret)); + pr_err("wolfCrypt_GetStatus_fips() failed with code %d: %s\n", ret, wc_GetErrorString(ret)); if (ret == IN_CORE_FIPS_E) { const char *newhash = wolfCrypt_GetCoreHash_fips(); pr_err("Update verifyCore[] in fips_test.c with new hash \"%s\" and rebuild.\n", @@ -235,19 +245,32 @@ return -ECANCELED; } - pr_info("wolfCrypt FIPS [" - -#if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 3) - "ready" -#elif defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 2) \ - && defined(WOLFCRYPT_FIPS_RAND) - "140-2 rand" -#elif defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 2) - "140-2" + pr_info("FIPS 140-3 wolfCrypt-fips v%d.%d.%d%s%s startup " + "self-test succeeded.\n", +#ifdef HAVE_FIPS_VERSION_MAJOR + HAVE_FIPS_VERSION_MAJOR, #else - "140" + HAVE_FIPS_VERSION, +#endif +#ifdef HAVE_FIPS_VERSION_MINOR + HAVE_FIPS_VERSION_MINOR, +#else + 0, +#endif +#ifdef HAVE_FIPS_VERSION_PATCH + HAVE_FIPS_VERSION_PATCH, +#else + 0, +#endif +#ifdef HAVE_FIPS_VERSION_PORT + "-", + HAVE_FIPS_VERSION_PORT +#else + "", + "" #endif - "] POST succeeded.\n"); + ); + #endif /* HAVE_FIPS */ #ifdef WC_RNG_SEED_CB @@ -283,6 +306,21 @@ return -ECANCELED; } pr_info("wolfCrypt self-test passed.\n"); +#else + pr_info("skipping full wolfcrypt_test() " + "(configure with --enable-crypttests to enable).\n"); +#endif + +#ifdef LINUXKM_LKCAPI_REGISTER + ret = linuxkm_lkcapi_register(); + + if (ret) { + pr_err("linuxkm_lkcapi_register() failed with return code %d.\n", ret); + linuxkm_lkcapi_unregister(); + (void)libwolfssl_cleanup(); + msleep(10); + return -ECANCELED; + } #endif #ifdef WOLFSSL_LINUXKM_BENCHMARKS @@ -322,6 +360,10 @@ static void wolfssl_exit(void) #endif { +#ifdef LINUXKM_LKCAPI_REGISTER + linuxkm_lkcapi_unregister(); +#endif + (void)libwolfssl_cleanup(); return; @@ -341,11 +383,22 @@ return get_current(); } -/* ditto for preempt_count(). */ -static int my_preempt_count(void) { - return preempt_count(); +#if defined(WOLFSSL_LINUXKM_SIMD_X86) && defined(WOLFSSL_COMMERCIAL_LICENSE) + +/* ditto for fpregs_lock/fpregs_unlock */ +#ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS +static void my_fpregs_lock(void) { + fpregs_lock(); +} + +static void my_fpregs_unlock(void) { + fpregs_unlock(); } +#endif /* WOLFSSL_LINUXKM_SIMD_X86 && WOLFSSL_COMMERCIAL_LICENSE */ + +#endif /* USE_WOLFSSL_LINUXKM_PIE_REDIRECT_TABLE */ + static int set_up_wolfssl_linuxkm_pie_redirect_table(void) { memset( &wolfssl_linuxkm_pie_redirect_table, @@ -355,6 +408,7 @@ #ifndef __ARCH_MEMCMP_NO_REDIRECT wolfssl_linuxkm_pie_redirect_table.memcmp = memcmp; #endif +#ifndef CONFIG_FORTIFY_SOURCE #ifndef __ARCH_MEMCPY_NO_REDIRECT wolfssl_linuxkm_pie_redirect_table.memcpy = memcpy; #endif @@ -364,6 +418,7 @@ #ifndef __ARCH_MEMMOVE_NO_REDIRECT wolfssl_linuxkm_pie_redirect_table.memmove = memmove; #endif +#endif /* !CONFIG_FORTIFY_SOURCE */ #ifndef __ARCH_STRCMP_NO_REDIRECT wolfssl_linuxkm_pie_redirect_table.strcmp = strcmp; #endif @@ -395,19 +450,27 @@ #else wolfssl_linuxkm_pie_redirect_table.printk = printk; #endif + +#ifdef CONFIG_FORTIFY_SOURCE + wolfssl_linuxkm_pie_redirect_table.__warn_printk = __warn_printk; +#endif + wolfssl_linuxkm_pie_redirect_table.snprintf = snprintf; wolfssl_linuxkm_pie_redirect_table._ctype = _ctype; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 10, 0) + wolfssl_linuxkm_pie_redirect_table.kmalloc_noprof = kmalloc_noprof; + wolfssl_linuxkm_pie_redirect_table.krealloc_noprof = krealloc_noprof; + wolfssl_linuxkm_pie_redirect_table.kzalloc_noprof = kzalloc_noprof; + wolfssl_linuxkm_pie_redirect_table.kvmalloc_node_noprof = kvmalloc_node_noprof; + wolfssl_linuxkm_pie_redirect_table.kmalloc_trace_noprof = kmalloc_trace_noprof; +#else wolfssl_linuxkm_pie_redirect_table.kmalloc = kmalloc; - wolfssl_linuxkm_pie_redirect_table.kfree = kfree; - wolfssl_linuxkm_pie_redirect_table.ksize = ksize; wolfssl_linuxkm_pie_redirect_table.krealloc = krealloc; #ifdef HAVE_KVMALLOC wolfssl_linuxkm_pie_redirect_table.kvmalloc_node = kvmalloc_node; - wolfssl_linuxkm_pie_redirect_table.kvfree = kvfree; #endif - wolfssl_linuxkm_pie_redirect_table.is_vmalloc_addr = is_vmalloc_addr; #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) wolfssl_linuxkm_pie_redirect_table.kmalloc_trace = kmalloc_trace; @@ -417,6 +480,14 @@ wolfssl_linuxkm_pie_redirect_table.kmalloc_order_trace = kmalloc_order_trace; #endif +#endif + + wolfssl_linuxkm_pie_redirect_table.kfree = kfree; + wolfssl_linuxkm_pie_redirect_table.ksize = ksize; +#ifdef HAVE_KVMALLOC + wolfssl_linuxkm_pie_redirect_table.kvfree = kvfree; +#endif + wolfssl_linuxkm_pie_redirect_table.is_vmalloc_addr = is_vmalloc_addr; wolfssl_linuxkm_pie_redirect_table.get_random_bytes = get_random_bytes; #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0) @@ -431,34 +502,15 @@ #endif wolfssl_linuxkm_pie_redirect_table.get_current = my_get_current_thread; - wolfssl_linuxkm_pie_redirect_table.preempt_count = my_preempt_count; - -#ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS - - #if LINUX_VERSION_CODE < KERNEL_VERSION(6, 2, 0) - wolfssl_linuxkm_pie_redirect_table.cpu_number = &cpu_number; - #else - wolfssl_linuxkm_pie_redirect_table.pcpu_hot = &pcpu_hot; - #endif - wolfssl_linuxkm_pie_redirect_table.nr_cpu_ids = &nr_cpu_ids; - - #if defined(CONFIG_SMP) && (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) - wolfssl_linuxkm_pie_redirect_table.migrate_disable = &migrate_disable; - wolfssl_linuxkm_pie_redirect_table.migrate_enable = &migrate_enable; - #endif - -#ifdef WOLFSSL_LINUXKM_SIMD_X86 - wolfssl_linuxkm_pie_redirect_table.irq_fpu_usable = irq_fpu_usable; - #ifdef kernel_fpu_begin - wolfssl_linuxkm_pie_redirect_table.kernel_fpu_begin_mask = - kernel_fpu_begin_mask; - #else - wolfssl_linuxkm_pie_redirect_table.kernel_fpu_begin = - kernel_fpu_begin; - #endif - wolfssl_linuxkm_pie_redirect_table.kernel_fpu_end = kernel_fpu_end; -#endif /* WOLFSSL_LINUXKM_SIMD_X86 */ +#if defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) && defined(CONFIG_X86) + wolfssl_linuxkm_pie_redirect_table.allocate_wolfcrypt_linuxkm_fpu_states = allocate_wolfcrypt_linuxkm_fpu_states; + wolfssl_linuxkm_pie_redirect_table.can_save_vector_registers_x86 = can_save_vector_registers_x86; + wolfssl_linuxkm_pie_redirect_table.free_wolfcrypt_linuxkm_fpu_states = free_wolfcrypt_linuxkm_fpu_states; + wolfssl_linuxkm_pie_redirect_table.restore_vector_registers_x86 = restore_vector_registers_x86; + wolfssl_linuxkm_pie_redirect_table.save_vector_registers_x86 = save_vector_registers_x86; +#elif defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) + #error WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS is set for an unsupported architecture. #endif /* WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS */ wolfssl_linuxkm_pie_redirect_table.__mutex_init = __mutex_init; @@ -477,6 +529,42 @@ wolfCrypt_FIPS_first; wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_last = wolfCrypt_FIPS_last; + #if FIPS_VERSION3_GE(6,0,0) + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_AES_sanity = + wolfCrypt_FIPS_AES_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_CMAC_sanity = + wolfCrypt_FIPS_CMAC_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_DH_sanity = + wolfCrypt_FIPS_DH_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_ECC_sanity = + wolfCrypt_FIPS_ECC_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_ED25519_sanity = + wolfCrypt_FIPS_ED25519_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_ED448_sanity = + wolfCrypt_FIPS_ED448_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_HMAC_sanity = + wolfCrypt_FIPS_HMAC_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_KDF_sanity = + wolfCrypt_FIPS_KDF_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_PBKDF_sanity = + wolfCrypt_FIPS_PBKDF_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_DRBG_sanity = + wolfCrypt_FIPS_DRBG_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_RSA_sanity = + wolfCrypt_FIPS_RSA_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_SHA_sanity = + wolfCrypt_FIPS_SHA_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_SHA256_sanity = + wolfCrypt_FIPS_SHA256_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_SHA512_sanity = + wolfCrypt_FIPS_SHA512_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_SHA3_sanity = + wolfCrypt_FIPS_SHA3_sanity; + wolfssl_linuxkm_pie_redirect_table.wolfCrypt_FIPS_FT_sanity = + wolfCrypt_FIPS_FT_sanity; + wolfssl_linuxkm_pie_redirect_table.wc_RunAllCast_fips = + wc_RunAllCast_fips; + #endif #endif #if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) @@ -489,11 +577,15 @@ /* runtime assert that the table has no null slots after initialization. */ { unsigned long *i; + static_assert(sizeof(unsigned long) == sizeof(void *), + "unexpected pointer size"); for (i = (unsigned long *)&wolfssl_linuxkm_pie_redirect_table; i < (unsigned long *)&wolfssl_linuxkm_pie_redirect_table._last_slot; ++i) if (*i == 0) { - pr_err("wolfCrypt container redirect table initialization was incomplete.\n"); + pr_err("wolfCrypt container redirect table initialization was " + "incomplete [%lu].\n", + i-(unsigned long *)&wolfssl_linuxkm_pie_redirect_table); return -EFAULT; } } @@ -508,11 +600,11 @@ #include -PRAGMA_GCC_DIAG_PUSH; -PRAGMA_GCC("GCC diagnostic ignored \"-Wnested-externs\""); -PRAGMA_GCC("GCC diagnostic ignored \"-Wpointer-arith\""); +PRAGMA_GCC_DIAG_PUSH +PRAGMA_GCC("GCC diagnostic ignored \"-Wnested-externs\"") +PRAGMA_GCC("GCC diagnostic ignored \"-Wpointer-arith\"") #include -PRAGMA_GCC_DIAG_POP; +PRAGMA_GCC_DIAG_POP extern char verifyCore[WC_SHA256_DIGEST_SIZE*2 + 1]; extern const char coreKey[WC_SHA256_DIGEST_SIZE*2 + 1]; @@ -684,11 +776,19 @@ } } - if (XMEMCMP(hash, binVerify, WC_SHA256_DIGEST_SIZE) == 0) + if (XMEMCMP(hash, binVerify, WC_SHA256_DIGEST_SIZE) == 0) { +#if defined(DEBUG_LINUXKM_PIE_SUPPORT) || defined(WOLFSSL_LINUXKM_VERBOSE_DEBUG) + pr_info("updateFipsHash: verifyCore already matches [%s]\n", verifyCore); +#else pr_info("updateFipsHash: verifyCore already matches.\n"); - else { +#endif + } else { XMEMCPY(verifyCore, base16_hash, WC_SHA256_DIGEST_SIZE*2 + 1); +#if defined(DEBUG_LINUXKM_PIE_SUPPORT) || defined(WOLFSSL_LINUXKM_VERBOSE_DEBUG) + pr_info("updateFipsHash: verifyCore updated [%s].\n", base16_hash); +#else pr_info("updateFipsHash: verifyCore updated.\n"); +#endif } ret = 0; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/x86_vector_register_glue.c mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/x86_vector_register_glue.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/linuxkm/x86_vector_register_glue.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/linuxkm/x86_vector_register_glue.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,574 @@ +/* x86_vector_register_glue.c -- glue logic to save and restore vector registers + * on x86 + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* included by linuxkm/module_hooks.c */ + +#if !defined(WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS) || !defined(CONFIG_X86) + #error x86_vector_register_glue.c included in non-vectorized/non-x86 project. +#endif + +/* kernel 4.19 -- the most recent LTS before 5.4 -- lacks the necessary safety + * checks in __kernel_fpu_begin(), and lacks TIF_NEED_FPU_LOAD. + */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 0)) + #error WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS on x86 requires kernel 5.4.0 or higher. +#endif + +static unsigned int wc_linuxkm_fpu_states_n_tracked = 0; + +struct wc_thread_fpu_count_ent { + volatile pid_t pid; + unsigned int fpu_state; +}; +struct wc_thread_fpu_count_ent *wc_linuxkm_fpu_states = NULL; + +#ifdef WOLFSSL_COMMERCIAL_LICENSE + +#ifndef LINUXKM_FPU_STATES_FOLLOW_THREADS + #error WOLFSSL_COMMERCIAL_LICENSE requires LINUXKM_FPU_STATES_FOLLOW_THREADS +#endif + +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wnested-externs" +/* avoid dependence on "alternatives_patched" and "xfd_validate_state()". */ +#undef CONFIG_X86_DEBUG_FPU +#include "../kernel/fpu/internal.h" +#include "../kernel/fpu/xstate.h" +#pragma GCC diagnostic pop + +static union wc_linuxkm_fpu_savebuf { + byte buf[1024]; /* must be 64-byte-aligned */ + struct fpstate fpstate; +} *wc_linuxkm_fpu_savebufs = NULL; + +#endif /* WOLFSSL_COMMERCIAL_LICENSE */ + +#define WC_FPU_COUNT_MASK 0x7fffffffU +#define WC_FPU_SAVED_MASK 0x80000000U + +WARN_UNUSED_RESULT int allocate_wolfcrypt_linuxkm_fpu_states(void) +{ + if (wc_linuxkm_fpu_states != NULL) { +#ifdef HAVE_FIPS + /* see note below in wc_linuxkm_fpu_state_assoc_unlikely(). */ + return 0; +#else + static int warned_for_repeat_alloc = 0; + if (! warned_for_repeat_alloc) { + pr_err("attempt at repeat allocation" + " in allocate_wolfcrypt_linuxkm_fpu_states\n"); + warned_for_repeat_alloc = 1; + } + return BAD_STATE_E; +#endif + } + +#ifdef LINUXKM_FPU_STATES_FOLLOW_THREADS + if (nr_cpu_ids >= 16) + wc_linuxkm_fpu_states_n_tracked = nr_cpu_ids * 2; + else + wc_linuxkm_fpu_states_n_tracked = 32; +#else + wc_linuxkm_fpu_states_n_tracked = nr_cpu_ids; +#endif + + wc_linuxkm_fpu_states = + (struct wc_thread_fpu_count_ent *)malloc( + wc_linuxkm_fpu_states_n_tracked * sizeof(wc_linuxkm_fpu_states[0])); + + if (! wc_linuxkm_fpu_states) { + pr_err("allocation of %lu bytes for " + "wc_linuxkm_fpu_states failed.\n", + nr_cpu_ids * sizeof(struct fpu_state *)); + return MEMORY_E; + } + + memset(wc_linuxkm_fpu_states, 0, wc_linuxkm_fpu_states_n_tracked + * sizeof(wc_linuxkm_fpu_states[0])); + +#ifdef WOLFSSL_COMMERCIAL_LICENSE + wc_linuxkm_fpu_savebufs = (union wc_linuxkm_fpu_savebuf *)malloc( + wc_linuxkm_fpu_states_n_tracked * sizeof(*wc_linuxkm_fpu_savebufs)); + if (! wc_linuxkm_fpu_savebufs) { + pr_err("allocation of %lu bytes for " + "wc_linuxkm_fpu_savebufs failed.\n", + WC_LINUXKM_ROUND_UP_P_OF_2(wc_linuxkm_fpu_states_n_tracked) + * sizeof(*wc_linuxkm_fpu_savebufs)); + free(wc_linuxkm_fpu_states); + wc_linuxkm_fpu_states = NULL; + return MEMORY_E; + } + if ((uintptr_t)wc_linuxkm_fpu_savebufs + & (WC_LINUXKM_ROUND_UP_P_OF_2(sizeof(*wc_linuxkm_fpu_savebufs)) - 1)) + { + pr_err("allocation of %lu bytes for " + "wc_linuxkm_fpu_savebufs allocated with wrong alignment 0x%lx.\n", + WC_LINUXKM_ROUND_UP_P_OF_2(wc_linuxkm_fpu_states_n_tracked) + * sizeof(*wc_linuxkm_fpu_savebufs), + (uintptr_t)wc_linuxkm_fpu_savebufs); + free(wc_linuxkm_fpu_savebufs); + wc_linuxkm_fpu_savebufs = NULL; + free(wc_linuxkm_fpu_states); + wc_linuxkm_fpu_states = NULL; + return MEMORY_E; + } + +#endif + + return 0; +} + +void free_wolfcrypt_linuxkm_fpu_states(void) { + struct wc_thread_fpu_count_ent *i, *i_endptr; + pid_t i_pid; + + if (wc_linuxkm_fpu_states == NULL) { + pr_err("free_wolfcrypt_linuxkm_fpu_states called" + " before allocate_wolfcrypt_linuxkm_fpu_states.\n"); + return; + } + + for (i = wc_linuxkm_fpu_states, + i_endptr = &wc_linuxkm_fpu_states[wc_linuxkm_fpu_states_n_tracked]; + i < i_endptr; + ++i) + { + i_pid = __atomic_load_n(&i->pid, __ATOMIC_CONSUME); + if (i_pid == 0) + continue; + if (i->fpu_state != 0) { + pr_err("free_wolfcrypt_linuxkm_fpu_states called" + " with nonzero state 0x%x for pid %d.\n", i->fpu_state, i_pid); + i->fpu_state = 0; + } + } + +#ifdef WOLFSSL_COMMERCIAL_LICENSE + free(wc_linuxkm_fpu_savebufs); + wc_linuxkm_fpu_savebufs = NULL; +#endif + free(wc_linuxkm_fpu_states); + wc_linuxkm_fpu_states = NULL; +} + +#ifdef LINUXKM_FPU_STATES_FOLLOW_THREADS +/* legacy thread-local storage facility for tracking recursive fpu + * pushing/popping + */ +static struct wc_thread_fpu_count_ent *wc_linuxkm_fpu_state_assoc(int create_p) { + struct wc_thread_fpu_count_ent *i, *i_endptr, *i_empty; + pid_t my_pid = task_pid_nr(current), i_pid; + + { + static int _warned_on_null = 0; + if (wc_linuxkm_fpu_states == NULL) + { +#ifdef HAVE_FIPS + /* FIPS needs to use SHA256 for the core verify HMAC, before + * reaching the regular wolfCrypt_Init() logic. to break the + * dependency loop on intelasm builds, we allocate here. + * this is not thread-safe and doesn't need to be. + */ + if ((! create_p) || (allocate_wolfcrypt_linuxkm_fpu_states() != 0)) +#endif + { + if (_warned_on_null == 0) { + pr_err("wc_linuxkm_fpu_state_assoc called by pid %d" + " before allocate_wolfcrypt_linuxkm_fpu_states.\n", my_pid); + _warned_on_null = 1; + } + return NULL; + } + } + } + + i_endptr = &wc_linuxkm_fpu_states[wc_linuxkm_fpu_states_n_tracked]; + + for (;;) { + for (i = wc_linuxkm_fpu_states, + i_empty = NULL; + i < i_endptr; + ++i) + { + i_pid = __atomic_load_n(&i->pid, __ATOMIC_CONSUME); + if (i_pid == my_pid) + return i; + if ((i_empty == NULL) && (i_pid == 0)) + i_empty = i; + } + if ((i_empty == NULL) || (! create_p)) + return NULL; + + i_pid = 0; + if (__atomic_compare_exchange_n( + &(i_empty->pid), + &i_pid, + my_pid, + 0 /* weak */, + __ATOMIC_SEQ_CST /* success_memmodel */, + __ATOMIC_SEQ_CST /* failure_memmodel */)) + { + return i_empty; + } + } +} + +#else /* !LINUXKM_FPU_STATES_FOLLOW_THREADS */ + +/* lock-free O(1)-lookup CPU-local storage facility for tracking recursive fpu + * pushing/popping. + * + * caller must have already called kernel_fpu_begin() or preempt_disable() + * before entering this or the streamlined inline version of it below. + */ +static struct wc_thread_fpu_count_ent *wc_linuxkm_fpu_state_assoc_unlikely(int create_p) { + int my_cpu = raw_smp_processor_id(); + pid_t my_pid = task_pid_nr(current), slot_pid; + struct wc_thread_fpu_count_ent *slot; + + { + static int _warned_on_null = 0; + if (wc_linuxkm_fpu_states == NULL) + { +#ifdef HAVE_FIPS + /* FIPS needs to use SHA256 for the core verify HMAC, before + * reaching the regular wolfCrypt_Init() logic. to break the + * dependency loop on intelasm builds, we allocate here. + * this is not thread-safe and doesn't need to be. + */ + int ret = allocate_wolfcrypt_linuxkm_fpu_states(); + if (ret != 0) +#endif + { + if (_warned_on_null == 0) { + pr_err("wc_linuxkm_fpu_state_assoc called by pid %d" + " before allocate_wolfcrypt_linuxkm_fpu_states.\n", my_pid); + _warned_on_null = 1; + } + return NULL; + } + } + } + + slot = &wc_linuxkm_fpu_states[my_cpu]; + slot_pid = __atomic_load_n(&slot->pid, __ATOMIC_CONSUME); + if (slot_pid == my_pid) { + if (create_p) { + static int _warned_on_redundant_create_p = 0; + if (_warned_on_redundant_create_p < 10) { + pr_err("wc_linuxkm_fpu_state_assoc called with create_p=1 by" + " pid %d on cpu %d with cpu slot already reserved by" + " said pid.\n", my_pid, my_cpu); + ++_warned_on_redundant_create_p; + } + } + return slot; + } + if (create_p) { + if (slot_pid == 0) { + __atomic_store_n(&slot->pid, my_pid, __ATOMIC_RELEASE); + return slot; + } else { + /* if the slot is already occupied, that can be benign due to a + * migration, but it will require fixup by the thread that owns the + * slot, which will happen when it releases its lock, or sooner (see + * below). + */ + static int _warned_on_mismatched_pid = 0; + if (_warned_on_mismatched_pid < 10) { + pr_warn("wc_linuxkm_fpu_state_assoc called by pid %d on cpu %d" + " but cpu slot already reserved by pid %d.\n", + my_pid, my_cpu, slot_pid); + ++_warned_on_mismatched_pid; + } + return NULL; + } + } else { + /* check for migration. this can happen despite our best efforts if any + * I/O occured while locked, e.g. kernel messages like "uninitialized + * urandom read". since we're locked now, we can safely migrate the + * entry in wc_linuxkm_fpu_states[], freeing up the slot on the previous + * cpu. + */ + unsigned int cpu_i; + for (cpu_i = 0; cpu_i < wc_linuxkm_fpu_states_n_tracked; ++cpu_i) { + if (__atomic_load_n( + &wc_linuxkm_fpu_states[cpu_i].pid, + __ATOMIC_CONSUME) + == my_pid) + { + wc_linuxkm_fpu_states[my_cpu] = wc_linuxkm_fpu_states[cpu_i]; + __atomic_store_n(&wc_linuxkm_fpu_states[cpu_i].fpu_state, 0, + __ATOMIC_RELEASE); + __atomic_store_n(&wc_linuxkm_fpu_states[cpu_i].pid, 0, + __ATOMIC_RELEASE); + return &wc_linuxkm_fpu_states[my_cpu]; + } + } + return NULL; + } +} + +static inline struct wc_thread_fpu_count_ent *wc_linuxkm_fpu_state_assoc( + int create_p) +{ + int my_cpu = raw_smp_processor_id(); /* my_cpu is only trustworthy if we're + * already nonpreemptible -- we'll + * determine that soon enough by + * checking if the pid matches or, + * failing that, if create_p. + */ + pid_t my_pid = task_pid_nr(current), slot_pid; + struct wc_thread_fpu_count_ent *slot; + + if (unlikely(wc_linuxkm_fpu_states == NULL)) + return wc_linuxkm_fpu_state_assoc_unlikely(create_p); + + slot = &wc_linuxkm_fpu_states[my_cpu]; + slot_pid = __atomic_load_n(&slot->pid, __ATOMIC_CONSUME); + if (slot_pid == my_pid) { + if (unlikely(create_p)) + return wc_linuxkm_fpu_state_assoc_unlikely(create_p); + else + return slot; + } + if (likely(create_p)) { + if (likely(slot_pid == 0)) { + __atomic_store_n(&slot->pid, my_pid, __ATOMIC_RELEASE); + return slot; + } else { + return wc_linuxkm_fpu_state_assoc_unlikely(create_p); + } + } else { + return wc_linuxkm_fpu_state_assoc_unlikely(create_p); + } +} + +#endif /* !LINUXKM_FPU_STATES_FOLLOW_THREADS */ + +#ifdef WOLFSSL_COMMERCIAL_LICENSE +static struct fpstate *wc_linuxkm_fpstate_buf_from_fpu_state( + struct wc_thread_fpu_count_ent *state) +{ + size_t i = (size_t)(state - wc_linuxkm_fpu_states) / sizeof(*state); + return &wc_linuxkm_fpu_savebufs[i].fpstate; +} +#endif + +static void wc_linuxkm_fpu_state_release_unlikely( + struct wc_thread_fpu_count_ent *ent) +{ + if (ent->fpu_state != 0) { + static int warned_nonzero_fpu_state = 0; + if (! warned_nonzero_fpu_state) { + pr_err("wc_linuxkm_fpu_state_free for pid %d" + " with nonzero fpu_state 0x%x.\n", ent->pid, ent->fpu_state); + warned_nonzero_fpu_state = 1; + } + ent->fpu_state = 0; + } + __atomic_store_n(&ent->pid, 0, __ATOMIC_RELEASE); +} + +static inline void wc_linuxkm_fpu_state_release( + struct wc_thread_fpu_count_ent *ent) +{ + if (unlikely(ent->fpu_state != 0)) + return wc_linuxkm_fpu_state_release_unlikely(ent); + __atomic_store_n(&ent->pid, 0, __ATOMIC_RELEASE); +} + +WARN_UNUSED_RESULT int can_save_vector_registers_x86(void) +{ + if (irq_fpu_usable()) + return 1; + else if (in_nmi() || (hardirq_count() > 0) || (softirq_count() > 0)) + return 0; + else if (test_thread_flag(TIF_NEED_FPU_LOAD)) + return 1; + return 0; +} + +WARN_UNUSED_RESULT int save_vector_registers_x86(void) +{ +#ifdef LINUXKM_FPU_STATES_FOLLOW_THREADS + struct wc_thread_fpu_count_ent *pstate = wc_linuxkm_fpu_state_assoc(1); +#else + struct wc_thread_fpu_count_ent *pstate = wc_linuxkm_fpu_state_assoc(0); +#endif + + /* allow for nested calls */ +#ifdef LINUXKM_FPU_STATES_FOLLOW_THREADS + if (pstate == NULL) + return MEMORY_E; +#endif + if ( +#ifndef LINUXKM_FPU_STATES_FOLLOW_THREADS + (pstate != NULL) && +#endif + (pstate->fpu_state != 0U)) + { + if (unlikely((pstate->fpu_state & WC_FPU_COUNT_MASK) + == WC_FPU_COUNT_MASK)) + { + pr_err("save_vector_registers_x86 recursion register overflow for " + "pid %d.\n", pstate->pid); + return BAD_STATE_E; + } else { + ++pstate->fpu_state; + return 0; + } + } + + if (irq_fpu_usable() +#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 17, 0)) + /* work around a kernel bug -- see linux commit 59f5ede3bc0f0. + * what we really want here is this_cpu_read(in_kernel_fpu), but + * in_kernel_fpu is an unexported static array. + */ + && !test_thread_flag(TIF_NEED_FPU_LOAD) +#endif + ) + { +#ifdef WOLFSSL_COMMERCIAL_LICENSE + struct fpstate *fpstate = wc_linuxkm_fpstate_buf_from_fpu_state(pstate); + fpregs_lock(); + fpstate->xfeatures = ~0UL; + os_xsave(fpstate); +#else /* !WOLFSSL_COMMERCIAL_LICENSE */ + #if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) + /* inhibit migration, which gums up the algorithm in + * kernel_fpu_{begin,end}(). + */ + migrate_disable(); + #endif + kernel_fpu_begin(); + +#ifndef LINUXKM_FPU_STATES_FOLLOW_THREADS + pstate = wc_linuxkm_fpu_state_assoc(1); + if (pstate == NULL) { + kernel_fpu_end(); + #if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) && \ + !defined(WOLFSSL_COMMERCIAL_LICENSE) + migrate_enable(); + #endif + return BAD_STATE_E; + } +#endif + +#endif /* !WOLFSSL_COMMERCIAL_LICENSE */ + /* set msb to 0 to trigger kernel_fpu_end() at cleanup. */ + pstate->fpu_state = 1U; + } else if (in_nmi() || (hardirq_count() > 0) || (softirq_count() > 0)) { + static int warned_fpu_forbidden = 0; + if (! warned_fpu_forbidden) + pr_err("save_vector_registers_x86 called from IRQ handler.\n"); +#ifdef LINUXKM_FPU_STATES_FOLLOW_THREADS + wc_linuxkm_fpu_state_release(pstate); +#endif + return BAD_STATE_E; + } else if (!test_thread_flag(TIF_NEED_FPU_LOAD)) { + static int warned_fpu_forbidden = 0; + if (! warned_fpu_forbidden) + pr_err("save_vector_registers_x86 called with !irq_fpu_usable from" + " thread without previous FPU save.\n"); +#ifdef LINUXKM_FPU_STATES_FOLLOW_THREADS + wc_linuxkm_fpu_state_release(pstate); +#endif + return BAD_STATE_E; + } else { + /* assume already safely in_kernel_fpu from caller, but recursively + * preempt_disable() to be extra-safe. + */ + preempt_disable(); +#if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) && \ + !defined(WOLFSSL_COMMERCIAL_LICENSE) + migrate_disable(); +#endif +#ifndef LINUXKM_FPU_STATES_FOLLOW_THREADS + pstate = wc_linuxkm_fpu_state_assoc(1); + if (pstate == NULL) { + #if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) && \ + !defined(WOLFSSL_COMMERCIAL_LICENSE) + migrate_enable(); + #endif + preempt_enable(); + return BAD_STATE_E; + } +#endif + /* set msb to 1 to inhibit kernel_fpu_end() at cleanup. */ + pstate->fpu_state = + WC_FPU_SAVED_MASK + 1U; + } + + return 0; +} + +void restore_vector_registers_x86(void) +{ + struct wc_thread_fpu_count_ent *pstate = wc_linuxkm_fpu_state_assoc(0); + if (unlikely(pstate == NULL)) { + pr_err("restore_vector_registers_x86 called by pid %d on CPU %d " + "with no saved state.\n", task_pid_nr(current), + raw_smp_processor_id()); + return; + } + + if ((--pstate->fpu_state & WC_FPU_COUNT_MASK) > 0U) { + return; + } + + if (pstate->fpu_state == 0U) { +#ifdef WOLFSSL_COMMERCIAL_LICENSE + struct fpstate *fpstate = wc_linuxkm_fpstate_buf_from_fpu_state(pstate); + os_xrstor(fpstate, fpstate->xfeatures); + fpregs_unlock(); +#else + #ifndef LINUXKM_FPU_STATES_FOLLOW_THREADS + wc_linuxkm_fpu_state_release(pstate); + #endif + kernel_fpu_end(); +#endif + } else { + pstate->fpu_state = 0U; + #ifndef LINUXKM_FPU_STATES_FOLLOW_THREADS + wc_linuxkm_fpu_state_release(pstate); + #endif + preempt_enable(); + } +#if defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_COUNT) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)) && \ + !defined(WOLFSSL_COMMERCIAL_LICENSE) + migrate_enable(); +#endif + +#ifdef LINUXKM_FPU_STATES_FOLLOW_THREADS + wc_linuxkm_fpu_state_release(pstate); +#endif + + return; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/mcapi/crypto.h mariadb-10.11.9/extra/wolfssl/wolfssl/mcapi/crypto.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/mcapi/crypto.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/mcapi/crypto.h 2024-08-03 07:30:00.000000000 +0000 @@ -173,9 +173,9 @@ typedef struct CRYPT_AES_CTX { /* big enough to hold internal, but check on init */ #ifdef WOLF_PRIVATE_KEY_ID - int holder[108]; + int holder[110]; #else - int holder[90]; + int holder[92]; #endif } CRYPT_AES_CTX; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/mcapi/mcapi_test.c mariadb-10.11.9/extra/wolfssl/wolfssl/mcapi/mcapi_test.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/mcapi/mcapi_test.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/mcapi/mcapi_test.c 2024-08-03 07:30:00.000000000 +0000 @@ -311,7 +311,7 @@ } if (memcmp(mcDigest, defDigest, CRYPT_SHA256_DIGEST_SIZE) != 0) { - printf("sha256 final memcmp fialed\n"); + printf("sha256 final memcmp failed\n"); return -1; } printf("sha256 mcapi test passed\n"); @@ -351,7 +351,7 @@ } if (memcmp(mcDigest, defDigest, CRYPT_SHA384_DIGEST_SIZE) != 0) { - printf("sha384 final memcmp fialed\n"); + printf("sha384 final memcmp failed\n"); return -1; } printf("sha384 mcapi test passed\n"); @@ -391,7 +391,7 @@ } if (memcmp(mcDigest, defDigest, CRYPT_SHA512_DIGEST_SIZE) != 0) { - printf("sha512 final memcmp fialed\n"); + printf("sha512 final memcmp failed\n"); return -1; } printf("sha512 mcapi test passed\n"); @@ -434,7 +434,7 @@ } if (memcmp(mcDigest, defDigest, CRYPT_SHA_DIGEST_SIZE) != 0) { - printf("hmac sha final memcmp fialed\n"); + printf("hmac sha final memcmp failed\n"); return -1; } printf("hmac sha mcapi test passed\n"); @@ -462,7 +462,7 @@ } if (memcmp(mcDigest, defDigest, CRYPT_SHA256_DIGEST_SIZE) != 0) { - printf("hmac sha256 final memcmp fialed\n"); + printf("hmac sha256 final memcmp failed\n"); return -1; } printf("hmac sha256 mcapi test passed\n"); @@ -490,7 +490,7 @@ } if (memcmp(mcDigest, defDigest, CRYPT_SHA384_DIGEST_SIZE) != 0) { - printf("hmac sha384 final memcmp fialed\n"); + printf("hmac sha384 final memcmp failed\n"); return -1; } printf("hmac sha384 mcapi test passed\n"); @@ -518,7 +518,7 @@ } if (memcmp(mcDigest, defDigest, CRYPT_SHA512_DIGEST_SIZE) != 0) { - printf("hmac sha512 final memcmp fialed\n"); + printf("hmac sha512 final memcmp failed\n"); return -1; } printf("hmac sha512 mcapi test passed\n"); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.c mariadb-10.11.9/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.c 2024-08-03 07:30:00.000000000 +0000 @@ -134,8 +134,8 @@ } int sdcard_close(MQX_FILE_PTR *sdcard_handle, MQX_FILE_PTR *partman_handle, - MQX_FILE_PTR *filesystem_handle, - char *partman_name, char *filesystem_name) + MQX_FILE_PTR *filesystem_handle, + char *partman_name, char *filesystem_name) { _mqx_int error_code; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.h mariadb-10.11.9/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/mqx/util_lib/Sources/util.h 2024-08-03 07:30:00.000000000 +0000 @@ -4,11 +4,11 @@ #define UTIL_H_ int sdcard_open(MQX_FILE_PTR *com_handle, MQX_FILE_PTR *sdcard_handle, - MQX_FILE_PTR *partman_handle, MQX_FILE_PTR *filesystem_handle, - char *partman_name, char *filesystem_name); + MQX_FILE_PTR *partman_handle, MQX_FILE_PTR *filesystem_handle, + char *partman_name, char *filesystem_name); int sdcard_close(MQX_FILE_PTR *sdcard_handle, MQX_FILE_PTR *partman_handle, - MQX_FILE_PTR *filesystem_handle, - char *partman_name, char *filesystem_name); + MQX_FILE_PTR *filesystem_handle, + char *partman_name, char *filesystem_name); #endif /* UTIL_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/pre-commit.sh mariadb-10.11.9/extra/wolfssl/wolfssl/pre-commit.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/pre-commit.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/pre-commit.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -#!/bin/sh -# -# -# Our "pre-commit" hook. - -# save current config -echo "\n\nSaving current config\n\n" -cp config.status tmp.status -cp wolfssl/options.h tmp.options.h - -# stash modified files, if any, that are not part of this commit, don't test -# them -STASHED=0 -if ! git diff --quiet -then - STASHED=1 - echo "\n\nStashing modified files not part of commit\n\n" - git stash -q --keep-index -fi - -# do the commit tests -echo "\n\nRunning commit tests...\n\n" -./commit-tests.sh -RESULT=$? - -# restore modified files not part of this commit -if test $STASHED -eq 1 -then - echo "\n\nPopping stashed modified files not part of commit\n" - git stash pop -q -fi - -# restore current config -echo "\nRestoring current config\n" -mv tmp.status config.status -# don't show output in case error from above -./config.status >/dev/null 2>&1 -mv tmp.options.h wolfssl/options.h -make clean >/dev/null 2>&1 -make -j 8 >/dev/null 2>&1 - -[ $RESULT -ne 0 ] && echo "\nOops, your commit failed\n" && exit 1 - -echo "\nCommit tests passed!\n" -exit 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/pre-push.sh mariadb-10.11.9/extra/wolfssl/wolfssl/pre-push.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/pre-push.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/pre-push.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -#!/bin/bash -# -# -# Our "pre-push" hook. - -RESULT=0 - -if [ -d ./fips ]; -then - echo "\n\nTesting with FIPS release code...\n\n" - ./fips-check.sh - RESULT=$? - [ $RESULT -ne 0 ] && echo -e "\n\nFIPS build test failed" && exit 1 -fi - -[ $RESULT -ne 0 ] && echo "\nOops, your push failed\n" && exit 1 - -echo "\nPush tests passed!\n" -exit 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/rpm/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/rpm/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/rpm/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/rpm/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -22,6 +22,13 @@ rpm: rpm-build +rpm-docker: + docker build -t "fedora-builder:Dockerfile" Docker/packaging/fedora + docker run --rm -v $(CURDIR):/opt/wolfssl fedora-builder:Dockerfile \ + bash -c 'make -C /opt/wolfssl rpm' +# To allow the user to keep using the configuration on the host + @./config.status --recheck &> /dev/null + release: rpm-sign auto-rpmbuild: diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/rpm/spec.in mariadb-10.11.9/extra/wolfssl/wolfssl/rpm/spec.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/rpm/spec.in 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/rpm/spec.in 2024-08-03 07:30:00.000000000 +0000 @@ -15,7 +15,7 @@ BuildRequires: tar URL: http://www.wolfssl.com/ -Packager: Brian Aker +Packager: wolfSSL Source: http://wolfssl.com/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot @@ -49,8 +49,8 @@ %install %{__rm} -rf %{buildroot} %{__make} install DESTDIR="%{buildroot}" AM_INSTALL_PROGRAM_FLAGS="" -mkdir -p $RPM_BUILD_ROOT/ %{__rm} -f %{buildroot}/%{_libdir}/libwolfssl@LIBSUFFIX@.la +%{__rm} -f %{buildroot}/%{_libdir}/libwolfssl.a %check @@ -66,10 +66,12 @@ %defattr(-,root,root,-) %doc AUTHORS ChangeLog.md COPYING README README.md %{_docdir}/wolfssl/taoCert.txt -%{_docdir}/wolfssl/example/echoserver.c +%{_docdir}/wolfssl/example/async_client.c +%{_docdir}/wolfssl/example/async_server.c +%{_docdir}/wolfssl/example/client.c %{_docdir}/wolfssl/example/server.c %{_docdir}/wolfssl/example/echoclient.c -%{_docdir}/wolfssl/example/client.c +%{_docdir}/wolfssl/example/echoserver.c %{_docdir}/wolfssl/example/sctp-client.c %{_docdir}/wolfssl/example/sctp-server.c %{_docdir}/wolfssl/example/sctp-client-dtls.c @@ -77,257 +79,17 @@ %{_docdir}/wolfssl/example/tls_bench.c %{_docdir}/wolfssl/README.txt %{_docdir}/wolfssl/QUIC.md - -%{_libdir}/libwolfssl@LIBSUFFIX@.so -%{_libdir}/libwolfssl@LIBSUFFIX@.so.@WOLFSSL_LIBRARY_VERSION_FIRST@ -%{_libdir}/libwolfssl@LIBSUFFIX@.so.@WOLFSSL_LIBRARY_VERSION_FIRST@.@WOLFSSL_LIBRARY_VERSION_SECOND@.@WOLFSSL_LIBRARY_VERSION_THIRD@ +%{_libdir}/libwolfssl@LIBSUFFIX@.so.* %files devel %defattr(-,root,root,-) %doc AUTHORS ChangeLog.md COPYING README README.md %{_bindir}/wolfssl-config -%{_includedir}/cyassl/callbacks.h -%{_includedir}/cyassl/certs_test.h -%{_includedir}/cyassl/crl.h -%{_includedir}/cyassl/ctaocrypt/aes.h -%{_includedir}/cyassl/ctaocrypt/arc4.h -%{_includedir}/cyassl/ctaocrypt/asn.h -%{_includedir}/cyassl/ctaocrypt/asn_public.h -%{_includedir}/cyassl/ctaocrypt/blake2-impl.h -%{_includedir}/cyassl/ctaocrypt/blake2-int.h -%{_includedir}/cyassl/ctaocrypt/blake2.h -%{_includedir}/cyassl/ctaocrypt/camellia.h -%{_includedir}/cyassl/ctaocrypt/chacha.h -%{_includedir}/cyassl/ctaocrypt/coding.h -%{_includedir}/cyassl/ctaocrypt/compress.h -%{_includedir}/cyassl/ctaocrypt/des3.h -%{_includedir}/cyassl/ctaocrypt/dh.h -%{_includedir}/cyassl/ctaocrypt/dsa.h -%{_includedir}/cyassl/ctaocrypt/ecc.h -%{_includedir}/cyassl/ctaocrypt/error-crypt.h -%{_includedir}/cyassl/ctaocrypt/fips_test.h -%{_includedir}/cyassl/ctaocrypt/hmac.h -%{_includedir}/cyassl/ctaocrypt/integer.h -%{_includedir}/cyassl/ctaocrypt/logging.h -%{_includedir}/cyassl/ctaocrypt/md2.h -%{_includedir}/cyassl/ctaocrypt/md4.h -%{_includedir}/cyassl/ctaocrypt/md5.h -%{_includedir}/cyassl/ctaocrypt/memory.h -%{_includedir}/cyassl/ctaocrypt/misc.h -%{_includedir}/cyassl/ctaocrypt/mpi_class.h -%{_includedir}/cyassl/ctaocrypt/mpi_superclass.h -%{_includedir}/cyassl/ctaocrypt/pkcs7.h -%{_includedir}/cyassl/ctaocrypt/poly1305.h -%{_includedir}/cyassl/ctaocrypt/pwdbased.h -%{_includedir}/cyassl/ctaocrypt/random.h -%{_includedir}/cyassl/ctaocrypt/ripemd.h -%{_includedir}/cyassl/ctaocrypt/rsa.h -%{_includedir}/cyassl/ctaocrypt/settings.h -%{_includedir}/cyassl/ctaocrypt/settings_comp.h -%{_includedir}/cyassl/ctaocrypt/sha.h -%{_includedir}/cyassl/ctaocrypt/sha256.h -%{_includedir}/cyassl/ctaocrypt/sha512.h -%{_includedir}/cyassl/ctaocrypt/tfm.h -%{_includedir}/cyassl/ctaocrypt/types.h -%{_includedir}/cyassl/ctaocrypt/visibility.h -%{_includedir}/cyassl/ctaocrypt/wc_port.h -%{_includedir}/cyassl/error-ssl.h -%{_includedir}/cyassl/ocsp.h -%{_includedir}/cyassl/openssl/asn1.h -%{_includedir}/cyassl/openssl/bio.h -%{_includedir}/cyassl/openssl/bn.h -%{_includedir}/cyassl/openssl/conf.h -%{_includedir}/cyassl/openssl/crypto.h -%{_includedir}/cyassl/openssl/des.h -%{_includedir}/cyassl/openssl/dh.h -%{_includedir}/cyassl/openssl/dsa.h -%{_includedir}/cyassl/openssl/ec.h -%{_includedir}/cyassl/openssl/ec25519.h -%{_includedir}/cyassl/openssl/ec448.h -%{_includedir}/cyassl/openssl/ecdh.h -%{_includedir}/cyassl/openssl/ecdsa.h -%{_includedir}/cyassl/openssl/ed25519.h -%{_includedir}/cyassl/openssl/ed448.h -%{_includedir}/cyassl/openssl/engine.h -%{_includedir}/cyassl/openssl/err.h -%{_includedir}/cyassl/openssl/evp.h -%{_includedir}/cyassl/openssl/hmac.h -%{_includedir}/cyassl/openssl/lhash.h -%{_includedir}/cyassl/openssl/md4.h -%{_includedir}/cyassl/openssl/md5.h -%{_includedir}/cyassl/openssl/ocsp.h -%{_includedir}/cyassl/openssl/opensslconf.h -%{_includedir}/cyassl/openssl/opensslv.h -%{_includedir}/cyassl/openssl/ossl_typ.h -%{_includedir}/cyassl/openssl/pem.h -%{_includedir}/cyassl/openssl/pkcs12.h -%{_includedir}/cyassl/openssl/rand.h -%{_includedir}/cyassl/openssl/ripemd.h -%{_includedir}/cyassl/openssl/rsa.h -%{_includedir}/cyassl/openssl/sha.h -%{_includedir}/cyassl/openssl/ssl.h -%{_includedir}/cyassl/openssl/ssl23.h -%{_includedir}/cyassl/openssl/stack.h -%{_includedir}/cyassl/openssl/ui.h -%{_includedir}/cyassl/openssl/x509.h -%{_includedir}/cyassl/openssl/x509v3.h -%{_includedir}/cyassl/options.h -%{_includedir}/cyassl/sniffer.h -%{_includedir}/cyassl/sniffer_error.h -%{_includedir}/cyassl/ssl.h -%{_includedir}/cyassl/test.h -%{_includedir}/cyassl/version.h -%{_includedir}/wolfssl/callbacks.h -%{_includedir}/wolfssl/certs_test.h -%{_includedir}/wolfssl/crl.h -%{_includedir}/wolfssl/error-ssl.h -%{_includedir}/wolfssl/ocsp.h -%{_includedir}/wolfssl/openssl/aes.h -%{_includedir}/wolfssl/openssl/asn1.h -%{_includedir}/wolfssl/openssl/asn1t.h -%{_includedir}/wolfssl/openssl/bio.h -%{_includedir}/wolfssl/openssl/bn.h -%{_includedir}/wolfssl/openssl/cms.h -%{_includedir}/wolfssl/openssl/buffer.h -%{_includedir}/wolfssl/openssl/camellia.h -%{_includedir}/wolfssl/openssl/cmac.h -%{_includedir}/wolfssl/openssl/compat_types.h -%{_includedir}/wolfssl/openssl/conf.h -%{_includedir}/wolfssl/openssl/crypto.h -%{_includedir}/wolfssl/openssl/des.h -%{_includedir}/wolfssl/openssl/dh.h -%{_includedir}/wolfssl/openssl/dsa.h -%{_includedir}/wolfssl/openssl/ec.h -%{_includedir}/wolfssl/openssl/ec25519.h -%{_includedir}/wolfssl/openssl/ec448.h -%{_includedir}/wolfssl/openssl/ecdh.h -%{_includedir}/wolfssl/openssl/ecdsa.h -%{_includedir}/wolfssl/openssl/ed25519.h -%{_includedir}/wolfssl/openssl/ed448.h -%{_includedir}/wolfssl/openssl/engine.h -%{_includedir}/wolfssl/openssl/err.h -%{_includedir}/wolfssl/openssl/evp.h -%{_includedir}/wolfssl/openssl/fips_rand.h -%{_includedir}/wolfssl/openssl/hmac.h -%{_includedir}/wolfssl/openssl/kdf.h -%{_includedir}/wolfssl/openssl/lhash.h -%{_includedir}/wolfssl/openssl/md4.h -%{_includedir}/wolfssl/openssl/md5.h -%{_includedir}/wolfssl/openssl/modes.h -%{_includedir}/wolfssl/openssl/obj_mac.h -%{_includedir}/wolfssl/openssl/objects.h -%{_includedir}/wolfssl/openssl/ocsp.h -%{_includedir}/wolfssl/openssl/opensslconf.h -%{_includedir}/wolfssl/openssl/opensslv.h -%{_includedir}/wolfssl/openssl/ossl_typ.h -%{_includedir}/wolfssl/openssl/pem.h -%{_includedir}/wolfssl/openssl/pkcs12.h -%{_includedir}/wolfssl/openssl/pkcs7.h -%{_includedir}/wolfssl/openssl/rand.h -%{_includedir}/wolfssl/openssl/rc4.h -%{_includedir}/wolfssl/openssl/ripemd.h -%{_includedir}/wolfssl/openssl/rsa.h -%{_includedir}/wolfssl/openssl/sha.h -%{_includedir}/wolfssl/openssl/srp.h -%{_includedir}/wolfssl/openssl/sha3.h -%{_includedir}/wolfssl/openssl/ssl.h -%{_includedir}/wolfssl/openssl/ssl23.h -%{_includedir}/wolfssl/openssl/stack.h -%{_includedir}/wolfssl/openssl/txt_db.h -%{_includedir}/wolfssl/openssl/tls1.h -%{_includedir}/wolfssl/openssl/ui.h -%{_includedir}/wolfssl/openssl/x509.h -%{_includedir}/wolfssl/openssl/x509_vfy.h -%{_includedir}/wolfssl/openssl/x509v3.h -%{_includedir}/wolfssl/options.h -%{_includedir}/wolfssl/quic.h -%{_includedir}/wolfssl/sniffer.h -%{_includedir}/wolfssl/sniffer_error.h -%{_includedir}/wolfssl/ssl.h -%{_includedir}/wolfssl/test.h -%{_includedir}/wolfssl/version.h -%{_includedir}/wolfssl/wolfcrypt/aes.h -%{_includedir}/wolfssl/wolfcrypt/arc4.h -%{_includedir}/wolfssl/wolfcrypt/asn.h -%{_includedir}/wolfssl/wolfcrypt/asn_public.h -%{_includedir}/wolfssl/wolfcrypt/blake2-impl.h -%{_includedir}/wolfssl/wolfcrypt/blake2-int.h -%{_includedir}/wolfssl/wolfcrypt/blake2.h -%{_includedir}/wolfssl/wolfcrypt/camellia.h -%{_includedir}/wolfssl/wolfcrypt/chacha.h -%{_includedir}/wolfssl/wolfcrypt/chacha20_poly1305.h -%{_includedir}/wolfssl/wolfcrypt/cmac.h -%{_includedir}/wolfssl/wolfcrypt/coding.h -%{_includedir}/wolfssl/wolfcrypt/compress.h -%{_includedir}/wolfssl/wolfcrypt/cpuid.h -%{_includedir}/wolfssl/wolfcrypt/cryptocb.h -%{_includedir}/wolfssl/wolfcrypt/curve25519.h -%{_includedir}/wolfssl/wolfcrypt/curve448.h -%{_includedir}/wolfssl/wolfcrypt/des3.h -%{_includedir}/wolfssl/wolfcrypt/dh.h -%{_includedir}/wolfssl/wolfcrypt/dsa.h -%{_includedir}/wolfssl/wolfcrypt/ecc.h -%{_includedir}/wolfssl/wolfcrypt/eccsi.h -%{_includedir}/wolfssl/wolfcrypt/ed25519.h -%{_includedir}/wolfssl/wolfcrypt/ed448.h -%{_includedir}/wolfssl/wolfcrypt/error-crypt.h -%{_includedir}/wolfssl/wolfcrypt/ext_kyber.h -%{_includedir}/wolfssl/wolfcrypt/falcon.h -%{_includedir}/wolfssl/wolfcrypt/dilithium.h -%{_includedir}/wolfssl/wolfcrypt/sphincs.h -%{_includedir}/wolfssl/wolfcrypt/fe_448.h -%{_includedir}/wolfssl/wolfcrypt/fe_operations.h -%{_includedir}/wolfssl/wolfcrypt/fips_test.h -%{_includedir}/wolfssl/wolfcrypt/ge_448.h -%{_includedir}/wolfssl/wolfcrypt/ge_operations.h -%{_includedir}/wolfssl/wolfcrypt/hash.h -%{_includedir}/wolfssl/wolfcrypt/hmac.h -%{_includedir}/wolfssl/wolfcrypt/hpke.h -%{_includedir}/wolfssl/wolfcrypt/integer.h -%{_includedir}/wolfssl/wolfcrypt/kdf.h -%{_includedir}/wolfssl/wolfcrypt/kyber.h -%{_includedir}/wolfssl/wolfcrypt/logging.h -%{_includedir}/wolfssl/wolfcrypt/md2.h -%{_includedir}/wolfssl/wolfcrypt/md4.h -%{_includedir}/wolfssl/wolfcrypt/md5.h -%{_includedir}/wolfssl/wolfcrypt/mem_track.h -%{_includedir}/wolfssl/wolfcrypt/memory.h -%{_includedir}/wolfssl/wolfcrypt/misc.h -%{_includedir}/wolfssl/wolfcrypt/mpi_class.h -%{_includedir}/wolfssl/wolfcrypt/mpi_superclass.h -%{_includedir}/wolfssl/wolfcrypt/pkcs12.h -%{_includedir}/wolfssl/wolfcrypt/pkcs7.h -%{_includedir}/wolfssl/wolfcrypt/poly1305.h -%{_includedir}/wolfssl/wolfcrypt/pwdbased.h -%{_includedir}/wolfssl/wolfcrypt/random.h -%{_includedir}/wolfssl/wolfcrypt/ripemd.h -%{_includedir}/wolfssl/wolfcrypt/rc2.h -%{_includedir}/wolfssl/wolfcrypt/rsa.h -%{_includedir}/wolfssl/wolfcrypt/sakke.h -%{_includedir}/wolfssl/wolfcrypt/settings.h -%{_includedir}/wolfssl/wolfcrypt/sha.h -%{_includedir}/wolfssl/wolfcrypt/sha256.h -%{_includedir}/wolfssl/wolfcrypt/sha3.h -%{_includedir}/wolfssl/wolfcrypt/sha512.h -%{_includedir}/wolfssl/wolfcrypt/siphash.h -%{_includedir}/wolfssl/wolfcrypt/signature.h -%if "@INCLUDE_SP_INT@" != "no" -%{_includedir}/wolfssl/wolfcrypt/sp_int.h -%endif -%{_includedir}/wolfssl/wolfcrypt/srp.h -%{_includedir}/wolfssl/wolfcrypt/tfm.h -%{_includedir}/wolfssl/wolfcrypt/types.h -%{_includedir}/wolfssl/wolfcrypt/visibility.h -%{_includedir}/wolfssl/wolfcrypt/wc_encrypt.h -%{_includedir}/wolfssl/wolfcrypt/wc_port.h -%{_includedir}/wolfssl/wolfcrypt/wc_kyber.h -%{_includedir}/wolfssl/wolfcrypt/wolfevent.h -%{_includedir}/wolfssl/wolfcrypt/wolfmath.h -%{_includedir}/wolfssl/wolfio.h +%{_includedir}/wolfssl/*.h +%{_includedir}/wolfssl/wolfcrypt/*.h +%{_includedir}/wolfssl/openssl/*.h %{_libdir}/pkgconfig/wolfssl.pc -%if "@ENABLED_FIPS@" != "no" -%{_includedir}/wolfssl/wolfcrypt/fips.h -%endif +%{_libdir}/libwolfssl@LIBSUFFIX@.so %changelog * Mon Oct 17 2022 Juliusz Sosinowicz @@ -372,7 +134,7 @@ * Thu May 31 2018 John Safranek - Update the version number on the library SO file. * Fri Mar 02 2018 Jacob Barthelmeh -- Added headder files fips.h, buffer.h, objects.h, rc4.h and example tls_bench.c +- Added header files fips.h, buffer.h, objects.h, rc4.h and example tls_bench.c * Fri Sep 08 2017 Jacob Barthelmeh - Change name for header wolfssl/io.h to wolfssl/wolfio.h * Fri Aug 04 2017 Jacob Barthelmeh diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/aria-cmake-build-test.sh mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/aria-cmake-build-test.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/aria-cmake-build-test.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/aria-cmake-build-test.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,200 @@ +#!/bin/bash +# +# aria_cmake_build_test.sh +# +# This is a test script for building wolfSSL examples with various settings +# for the ARIA Magic Crypto ciphers. +# +# See https://github.com/wolfSSL/wolfssl/pull/6400 and +# https://github.com/wolfSSL/wolfssl/pull/6600 +# +# The basic steps for building: +# +# # set to your path +# export ARIA_DIR=/mnt/c/workspace/MagicCrypto +# +# mkdir -p out +# pushd out +# cmake .. -DWOLFSSL_ARIA=yes +# cmake --build . +# +# # View the available ciphers with: +# ./examples/client/client -e +# +# or with grep: +# ./examples/client/client -e | grep -i ARIA +# +# Note the OPENSSL_EXTRA and WOLF_CRYPTOCB macros may need to be defined +# in certain circumstances. The LD_LIBRARY_PATH=$ARIA_DIR may also be needed. +# + +export ARIA_BUILD_DIR=./out_temp + +export ARIA_ERROR_RM_FAIL=1 +export ARIA_ERROR_MKDIR_FAIL=2 +export ARIA_ERROR_CMAKE_FAIL=3 +export ARIA_ERROR_BUILD_FAIL=4 +export ARIA_ERROR_CLIENT_FAIL=5 +export ARIA_ERROR_CIPHER_FAIL=6 +export ARIA_ERROR_CONFIG_FAIL=7 + +# +# function build_aria_test() +# +build_aria_test() { + local EXPECTED_ERROR=$1 # First parameter; 0, 1, 2, etc + local EXPECTED_ARIA=$2 # Second parameter: typically "Y" or "N" + local BUILD_MESSAGE=$3 # Third parameter; "some message" + local BUILD_DIR=$4 # Fourth parameter: "./someDirectory" + local BUILD_OPTION=$5 # Fifth parameter. Optional: "" + + echo "********************************************************************" + echo "Starting $BUILD_MESSAGE" + echo "********************************************************************" + if [[ -z "$BUILD_DIR" ]]; then + local BUILD_DIR=out + fi + + echo "BUILD_DIR=$BUILD_DIR" + echo "BUILD_OPTION=$BUILD_OPTION" + + # remove build directory + rm -rf $BUILD_DIR + if [ $? -eq 0 ]; then + echo "$BUILD_DIR removed." + else + echo "Failed to remove directory." + return $ARIA_ERROR_RM_FAIL + fi + + # create a fresh directory + mkdir -p $BUILD_DIR + if [ $? -eq 0 ]; then + echo "$BUILD_DIR created." + else + echo "Failed to create directory $BUILD_DIR" + return $ARIA_ERROR_MKDIR_FAIL + fi + + # change into build directory + pushd $BUILD_DIR + + # initial cmake + echo "********************************************************************" + echo "CMake for $BUILD_MESSAGE" + if [ -z "$BUILD_OPTION" ]; then + echo "(No additional build options)" + else + echo "Using build option: $BUILD_OPTION" + fi + echo "********************************************************************" + cmake .. $BUILD_OPTION + if [ $? -eq 0 ]; then + echo "cmake successful." + else + echo "ERROR: cmake failed" + return $ARIA_ERROR_CMAKE_FAIL + fi + + # build + echo "********************************************************************" + echo "Build for $BUILD_MESSAGE" + if [ -z "$BUILD_OPTION" ]; then + echo "(No additional build options)" + else + echo "Using build option: $BUILD_OPTION" + fi + echo "********************************************************************" + cmake --build . + if [ $? -eq 0 ]; then + echo "cmake build successful." + else + echo "ERROR: cmake build failed" + return $ARIA_ERROR_BUILD_FAIL + fi + + # View the available ciphers with: + echo "checking wolfsl client ssl version numbers SSLv3(0) - TLS1.3(4):" + if ./examples/client/client -V; then + echo "Confirmed ./examples/client/client operational." + else + echo "ERROR ./examples/client/client error = $?" + return $ARIA_ERROR_CLIENT_FAIL + fi + + # now see if we have ARIA ciphers + if ./examples/client/client -e | awk '/ARIA/{found=1} END{exit !found}'; then + if [ "$EXPECTED_ARIA" == "Y" ]; then + echo "Found ARIA ciphers as expected." + else + echo "ERROR: Found ARIA ciphers when NOT expected." + return $ARIA_ERROR_CIPHER_FAIL + fi + else + if [ "$EXPECTED_ARIA" == "N" ]; then + echo "No ARIA ciphers found as expected with ./examples/client/client -e" + else + echo "ERROR: No ARIA ciphers found, EXPECTED_ARIA parameter = \"$EXPECTED_ARIA\"; expected \"N\"." + return $ARIA_ERROR_CONFIG_FAIL + fi + fi + ./examples/client/client -e + + echo "Return to working directory." + popd + + echo "********************************************************************" + echo "Completed $BUILD_MESSAGE" + echo "********************************************************************" + echo "" +} + +set -e + +# No ARIA Environment Variable +export ARIA_DIR= +export THIS_MESSAGE="No ARIA Environment Variable, ARIA not enabled." +build_aria_test 0 N "$THIS_MESSAGE" "$ARIA_BUILD_DIR" + +export ARIA_DIR= +export THIS_MESSAGE="No ARIA Environment Variable, ARIA Enabled" +build_aria_test 0 Y "$THIS_MESSAGE" "$ARIA_BUILD_DIR" "-DWOLFSSL_ARIA=yes" + +# ARIA Environment Variable with MagicCrypto in local user directory +export ARIA_DIR=~/MagicCrypto +export THIS_MESSAGE="ARIA Environment Variable with MagicCrypto in local user directory, ARIA not enabled." +build_aria_test 0 N "$THIS_MESSAGE" "$ARIA_BUILD_DIR" + +export ARIA_DIR=~/MagicCrypto +export THIS_MESSAGE="ARIA Environment Variable with MagicCrypto in local user directory, ARIA Enabled" +build_aria_test 0 Y "$THIS_MESSAGE" "$ARIA_BUILD_DIR" "-DWOLFSSL_ARIA=yes" + +# ARIA Environment Variable with MagicCrypto in wolfssl directory +export ARIA_DIR=~/MagicCrypto +export THIS_MESSAGE="ARIA Environment Variable with MagicCrypto in wolfssl directory, ARIA not enabled." +build_aria_test 0 N "$THIS_MESSAGE" "$ARIA_BUILD_DIR" + +export ARIA_DIR=./MagicCrypto +export THIS_MESSAGE="ARIA Environment Variable with MagicCrypto in wolfssl, ARIA Enabled" +build_aria_test 0 Y "$THIS_MESSAGE" "$ARIA_BUILD_DIR" "-DWOLFSSL_ARIA=yes" + +# ARIA Environment Variable with bad directory, ARIA not enabled so bad directory ignored +export ARIA_DIR=./UnknownDirectory +export THIS_MESSAGE="ARIA Environment Variable with bad directory, ARIA not enabled." +build_aria_test 0 N "$THIS_MESSAGE" "$ARIA_BUILD_DIR" + +# ARIA Environment Variable with bad directory, ARIA enabled so bad directory should fail +set +e +export ARIA_DIR=./UnknownDirectory +export THIS_MESSAGE="ARIA Environment Variable with bad directory, ARIA Enabled" +build_aria_test $ARIA_ERROR_CMAKE_FAIL N "$THIS_MESSAGE" "$ARIA_BUILD_DIR" "-DWOLFSSL_ARIA=yes" +if [ $? -eq $ARIA_ERROR_CMAKE_FAIL ]; then + echo "Properly detected bad directory and failed as expected." +else + echo "Error: expected failure not detected." + exit 1 +fi + +echo "Done. aria_cmake_build_test completed successfully!" + +exit 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/benchmark_compare.sh mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/benchmark_compare.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/benchmark_compare.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/benchmark_compare.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,164 @@ +#!/bin/bash +# This script is designed to compare the output of wolfcrypt/benchmark test +# application. If the file has an extension ".csv", then it will parse the +# comma separated format, otherwise it will use the standard output format. The +# green colored output field is the better result. +# Usage: benchmark_compare.sh +# You can define a few variables to set options: +# THRESHOLD - set the threshold for equality between two results +# OUTPUT_CSV - set to "1" to print CSV + +FIRST_FILE=$1 +SECOND_FILE=$2 +THRESHOLD=${THRESHOLD:-"10"} +OUTPUT_CSV=${OUTPUT_CSV:-"0"} + +declare -A symStats +declare -A asymStats + +function getAlgo() { # getAlgo + if [ "$asCSV" = 1 ]; then + declare -a fields + IFS=',' read -ra fields <<< "$line" + if [ "$mode" = 1 ]; then + echo "${fields[0]}" + else + if [ "${fields[2]}" = "" ]; then + echo "${fields[0]}" + else + echo "${fields[0]}-${fields[2]}" + fi + fi + else + if [ "$mode" = 1 ]; then + echo "$line" | sed 's/ *[0-9]* MiB.*//g' + else + if [[ $line == "scrypt"* ]]; then + echo "scrypt" + else + echo "$line" | sed 's/ *[0-9]* ops.*//g' | sed 's/ \+[0-9]\+ \+/-/g' + fi + fi + fi +} + +function getValue() { # getValue + if [ "$asCSV" = 1 ]; then + declare -a fields + IFS=',' read -ra fields <<< "$line" + if [ "$mode" = 1 ]; then + echo "${fields[1]}" + else + echo "${fields[4]}" + fi + else + if [ "$mode" = 1 ]; then + echo "$line" | sed 's/.*seconds, *//g' | sed 's/ *MiB\/s.*//g' + else + echo "$line" | sed 's/.* ms, *//g' | sed 's/ ops\/sec.*//g' + fi + fi +} + +asCSV=0 +mode=0 +while IFS= read -r line; do + if [[ $FIRST_FILE == *".csv" ]]; then + asCSV=1 + if [[ $line == *"Symmetric Ciphers"* ]]; then + mode=1 + read + read + elif [[ $line == *"Asymmetric Ciphers"* ]]; then + mode=2 + read + read + elif [[ $line == "" ]]; then + mode=0 + fi + else + asCSV=0 + if [[ $line == *"MiB/s"* ]]; then + mode=1 + elif [[ $line == *"ops/sec"* ]]; then + mode=2 + else + mode=0 + fi + fi + if [ "$mode" -ne 0 ]; then + ALGO=`getAlgo "$asCSV" "$mode" "$line"` + VALUE=`getValue "$asCSV" "$mode" "$line"` + + if [ "$mode" = "1" ]; then + symStats["${ALGO}"]=${VALUE} + elif [ "$mode" = "2" ]; then + asymStats["${ALGO}"]=${VALUE} + fi + fi +done < ${FIRST_FILE} + +RED='\033[0;31m' +GRN='\033[0;32m' +NC='\033[0m' # No Color +function printData() { # printData + ALGO=$1 + VAL1=$2 + VAL2=$3 + if (( $(echo "sqrt( (${VAL1} - ${VAL2})^2 ) < ${THRESHOLD}" | bc -l) )); then + # take absolute value and check if less than a threshold + echo "${ALGO},${GRN}${VAL1}${NC},=,${GRN}${VAL2}${NC}\n" + elif (( $(echo "${VAL1} > ${VAL2}" | bc -l) )); then + echo "${ALGO},${GRN}${VAL1}${NC},>,${VAL2}\n" + else + echo "${ALGO},${VAL1},<,${GRN}${VAL2}${NC}\n" + fi +} + +asCSV=0 +mode=0 +while IFS= read -r line; do + if [[ $SECOND_FILE == *".csv" ]]; then + asCSV=1 + if [[ $line == *"Symmetric Ciphers"* ]]; then + RES+="ALGO,${FIRST_FILE},diff(MB/s),${SECOND_FILE}\n" + mode=1 + read + read + elif [[ $line == *"Asymmetric Ciphers"* ]]; then + RES+="\nALGO,${FIRST_FILE},diff(ops/sec),${SECOND_FILE}\n" + mode=2 + read + read + elif [[ $line == "" ]]; then + mode=0 + fi + else + asCSV=0 + if [[ $line == *"MiB/s"* ]]; then + mode=1 + elif [[ $line == *"ops/sec"* ]]; then + mode=2 + else + mode=0 + fi + fi + if [ "$mode" -ne 0 ]; then + if [[ $line == *","* ]]; then + ALGO=`getAlgo "$asCSV" "$mode" "$line"` + VALUE=`getValue "$asCSV" "$mode" "$line"` + + if [ "$mode" = "1" ]; then + RES+=`printData "${ALGO}" "${symStats["${ALGO}"]}" "${VALUE}"` + elif [ "$mode" = "2" ]; then + RES+=`printData "${ALGO}" "${asymStats["${ALGO}"]}" "${VALUE}"` + fi + fi + fi +done < ${SECOND_FILE} + +if [ "${OUTPUT_CSV}" = "1" ]; then + echo -e "$RES" +else + echo -e "$RES" | column -t -s ',' -L +fi diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/crl-revoked.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/crl-revoked.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/crl-revoked.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/crl-revoked.test 2024-08-03 07:30:00.000000000 +0000 @@ -22,6 +22,7 @@ cd $RUNNING_DIR revocation_code="-361" +revocation_code_openssl="23" exit_code=1 counter=0 # need a unique resume port since may run the same time as testsuite @@ -112,7 +113,7 @@ server_result=$? case "$capture_out" in - *$revocation_code*) + *"$revocation_code"*|*"$revocation_code_openssl"*) # only exit with zero on detection of the expected error code echo "" echo "Successful Revocation!!!!" @@ -178,7 +179,7 @@ server_result=$? case "$capture_out" in - *$revocation_code*) + *"$revocation_code"*|*"$revocation_code_openssl"*) # only exit with zero on detection of the expected error code echo "" echo "Successful Revocation!!!! with hash dir" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/dtls.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtls.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/dtls.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtls.test 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,169 @@ +#!/bin/bash + +# This script can be run with several environment variables set dictating its +# run. You can set the following to what you like: +WOLFSSL_ROOT=${WOLFSSL_ROOT:-$(pwd)} +UDP_PROXY_BIN=${UDP_PROXY_BIN:-"udp_proxy"} +DTLS_VERSION=${DTLS_VERSION:-"-v4"} +PCAP_FILENAME=${PCAP_FILENAME:-"dtls${DTLS_VERSION}.pcap"} +# Additionally, you can add the following tests by setting it to '1': +DO_EXTENDED_SERVER_PERMUTATION_TEST=${DO_EXTENDED_SERVER_PERMUTATION_TEST:-0} +DO_DELAY_TEST=${DO_DELAY_TEST:-0} + +# An example use would be: DTLS_VERSION=-v3 scripts/dtls.test +# Note the output also consists of a single PCAP file which has a set of +# three packets (1-byte, strlen()-byte, 1-byte payload) deliniating each test. + +#set -x # enable debug output + +# bwrap execution environment to avoid port conflicts +if [ "${AM_BWRAPPED-}" != "yes" ]; then + bwrap_path="$(command -v bwrap)" + if [ -n "$bwrap_path" ]; then + export AM_BWRAPPED=yes + exec "$bwrap_path" --cap-add ALL --unshare-net --dev-bind / / "$0" "$@" + fi +fi + +kill_server() { + for i in $(jobs -pr); do + if [ "$i" != "$TCPDUMP_PID" ]; then + kill -9 $i + fi + done + # empty print to show which backgrounded processes were killed + sleep 0.2 && echo +} + +cleanup () { + echo + echo "Cleaning up..." + kill_server + + if [ ! -z "$TCPDUMP_PID" ];then + echo "Killing tcpdump $TCPDUMP_PID" + sleep 1 + kill $TCPDUMP_PID + fi +} + +trap cleanup err exit + +PROXY_PORT=1234 +SERVER_PORT=4321 +KEY_UPDATE_SIZE=35 +NUM_TESTS_FAILED=0 +NUM_TESTS_RUN=0 + +if [ "$DTLS_VERSION" = "-v4" ]; then + UDP_PROXY_EXTRA_ARGS="-u" +fi + +# $WOLFSSL_ROOT/tests/unit.test tests/test-dtls13.conf + +set -o pipefail +prepend() { # Usage: cmd 2>&1 | prepend "sometext " + while read line; do echo "${1}${line}"; done +} + +run_test() { # usage: run_test "" "" "" "" + ((NUM_TESTS_RUN++)) + echo "" | nc -u 127.0.0.1 $SERVER_PORT # This is a marker for the PCAP file + echo "$1" | nc -u 127.0.0.1 $SERVER_PORT # This is a marker for the PCAP file + echo "" | nc -u 127.0.0.1 $SERVER_PORT # This is a marker for the PCAP file + echo -e "\n${1}\n" + stdbuf -oL -eL $WOLFSSL_ROOT/examples/server/server -u -p$SERVER_PORT $DTLS_VERSION $3 2>&1 | prepend "[server] " & + sleep 0.2 + stdbuf -oL -eL $UDP_PROXY_BIN -p $PROXY_PORT -s 127.0.0.1:$SERVER_PORT $UDP_PROXY_EXTRA_ARGS $2 2>&1 | prepend "[udp-proxy] " & + sleep 0.2 + # Wrap this command in a timeout so that a deadlock won't bring down the entire test + timeout -s KILL 1m stdbuf -oL -eL $WOLFSSL_ROOT/examples/client/client -u -p$PROXY_PORT $DTLS_VERSION $4 2>&1 | prepend "[client] " + if [ $? != 0 ]; then + echo "***Test failed***" + ((NUM_TESTS_FAILED++)) + fi + kill_server +} + +test_dropping_packets () { + for i in $(seq 0 11);do + run_test "Dropping ${i}th packet" "-f $i" "-Ta" "" + done + + # dropping last ack would be client error as wolfssl_read doesn't support WANT_WRITE as returned error + for i in $(seq 0 10);do + run_test "Testing WANT_WRITE: dropping packet $i" "-f $i" "-Ta -6" "-6" + done +} + +# this test is based on detecting newSessionTicket message by its size. This is rather fragile. +test_dropping_new_session_ticket() { # usage: test_dropping_new_session_ticket + run_test "Dropping new session ticket packet of size $1" "-F $1" "-w" "-w --waitTicket" +} + +test_permutations () { + SIDE=$1 + PERMUTATIONS=$(python3 << EOF +import itertools +for p in itertools.permutations("$2"): + print(''.join(p)) +EOF + ) + for i in $PERMUTATIONS;do + UDP_LOGFILE=$(mktemp) + run_test "Testing $SIDE permutations order $i" "-r $i -S $SIDE -l $UDP_LOGFILE" "-Ta -w" "-w" + echo "...produced $(grep -P 'client:|server:' $UDP_LOGFILE | wc -l) messages" + rm -f $UDP_LOGFILE + done + echo "All $SIDE msg permutations succeeded" +} + + +test_time_delays () { + DELAYS=$(python3 << EOF +import itertools +t = [0.1, 0.5, 1.1] +tt = [] +for i in itertools.product(t, t, t): + tt.append(i * 15) +for i in tt: + print(','.join(map(lambda x: str(x) , i))) +EOF + ) + for DELAY in $DELAYS;do + UDP_LOGFILE=$(mktemp) + run_test "Testing delay $DELAY" "-l $UDP_LOGFILE -t $DELAY" "-Ta -w" "-w" + echo "...produced $(grep -P 'client:|server:' $UDP_LOGFILE | wc -l) messages" + rm -f $UDP_LOGFILE + done +} + +echo "Starting capture" +tcpdump -i lo -n port ${SERVER_PORT} -w ${PCAP_FILENAME} -U & +TCPDUMP_PID=$! +sleep 0.5 + +test_dropping_packets +test_permutations client 012 + +if [ "$DO_EXTENDED_SERVER_PERMUTATION_TEST" = "1" ];then + test_permutations server 0123456 +else + test_permutations server 012 +fi + +test_dropping_new_session_ticket 200 + +# TODO: fix udp_proxy to not re-order close alert before app data +if [ "$DO_DELAY_TEST" = "1" ];then + test_time_delays +fi + +if [ $NUM_TESTS_FAILED == 0 ]; then + echo -e "\nAll $NUM_TESTS_RUN tests SUCCEEDED!!!\n" +else + echo -e "\nThere were $NUM_TESTS_FAILED failures out of $NUM_TESTS_RUN tests\n" +fi + +echo "The script ran for $SECONDS seconds" +exit $NUM_TESTS_FAILED diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/dtls13.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtls13.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/dtls13.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtls13.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,171 +0,0 @@ -#!/bin/bash - -set -e - -cleanup () { - echo - echo "Cleaning up..." - if [ ! -z "$UDP_PROXY_PID" ];then - echo "Killing udp_proxy $UDP_PROXY_PID" - kill $UDP_PROXY_PID - fi - if [ ! -z "$SERVER_PID" ];then - echo "Killing server $SERVER_PID" - kill $SERVER_PID - fi -} - -trap cleanup err exit - -WOLFSSL_ROOT=$(pwd) -if [ -z $UDP_PROXY_PATH ];then -UDP_PROXY_PATH=$WOLFSSL_ROOT/../udp-proxy/udp_proxy -fi -PROXY_PORT=12345 -SERVER_PORT=11111 -NEW_SESSION_TICKET_SIZE=200 -KEY_UPDATE_SIZE=35 - -(killall udp_proxy || true) -(killall lt-server || true) -(killall lt-client || true) - -# $WOLFSSL_ROOT/tests/unit.test tests/test-dtls13.conf - -test_dropping_packets () { - for i in $(seq 0 11);do - echo -e "\ndropping packet $i\n" | tee -a /tmp/serr | tee -a /tmp/cerr | tee -a /tmp/udp - $UDP_PROXY_PATH -p $PROXY_PORT -s 127.0.0.1:$SERVER_PORT -f $i -u >>/tmp/udp & - UDP_PROXY_PID=$! - $WOLFSSL_ROOT/examples/server/server -v4 -u -Ta 2>>/tmp/serr & - SERVER_PID=$! - sleep 0.2 - now=$(date +%s.%N) - $WOLFSSL_ROOT/examples/client/client -v4 -u -p$PROXY_PORT 2>>/tmp/cerr - elapsed=$(echo $(date +%s.%N) - $now | bc) - echo "it took ${elapsed} sec(s)" >> /tmp/udp - wait $SERVER_PID - SERVER_PID= - kill $UDP_PROXY_PID - UDP_PROXY_PID= - done - - - echo -e "\nTesting WANT_WRITE\n" | tee -a /tmp/serr | tee -a /tmp/cerr | tee -a /tmp/udp - - # dropping last ack would be client error as wolfssl_read doesn't support WANT_WRITE as returned error - for i in $(seq 0 10);do - echo -e "\ndropping packet $i\n" | tee -a /tmp/serr | tee -a /tmp/cerr | tee -a /tmp/udp - $UDP_PROXY_PATH -p $PROXY_PORT -s 127.0.0.1:$SERVER_PORT -f $i -u >>/tmp/udp & - UDP_PROXY_PID=$! - $WOLFSSL_ROOT/examples/server/server -v4 -u -Ta -6 2>>/tmp/serr & - SERVER_PID=$! - sleep 0.2 - now=$(date +%s.%N) - $WOLFSSL_ROOT/examples/client/client -v4 -u -p$PROXY_PORT -6 2>>/tmp/cerr - elapsed=$(echo $(date +%s.%N) - $now | bc) - echo "it took ${elapsed} sec(s)" >> /tmp/udp - wait $SERVER_PID - SERVER_PID= - kill $UDP_PROXY_PID - UDP_PROXY_PID= - done -} - -# this test is based on detecting newSessionTicket message by its size. This is rather fragile. -test_dropping_new_session_ticket() { - echo -e "\ndropping new session ticket packet of size $NEW_SESSION_TICKET_SIZE\n" | tee -a /tmp/serr | tee -a /tmp/cerr | tee -a /tmp/udp - $UDP_PROXY_PATH -p $PROXY_PORT -s 127.0.0.1:$SERVER_PORT -F $NEW_SESSION_TICKET_SIZE -u >>/tmp/udp & - UDP_PROXY_PID=$! - $WOLFSSL_ROOT/examples/server/server -v4 -w -u 2>>/tmp/serr & - SERVER_PID=$! - sleep 0.2 - now=$(date +%s.%N) - $WOLFSSL_ROOT/examples/client/client -v4 -u -p$PROXY_PORT -w --waitTicket 2>>/tmp/cerr - elapsed=$(echo $(date +%s.%N) - $now | bc) - echo "it took ${elapsed} sec(s)" >> /tmp/udp - wait $SERVER_PID - SERVER_PID= - kill $UDP_PROXY_PID - UDP_PROXY_PID= -} - -test_permutations () { - SIDE=$1 - PERMUTATIONS=$(python3 << EOF -import itertools -for p in itertools.permutations("$2"): - print(''.join(p)) -EOF - ) - echo "Testing $SIDE msg permutations" - for i in $PERMUTATIONS;do - echo -n "Testing $SIDE order $i" - UDP_LOGFILE=/tmp/udp-$SIDE-$i - $UDP_PROXY_PATH -p $PROXY_PORT -s 127.0.0.1:$SERVER_PORT -u -r $i -l $UDP_LOGFILE -S $SIDE & - UDP_PROXY_PID=$! - $WOLFSSL_ROOT/examples/server/server -v4 -u -Ta -w &> /tmp/serr & - SERVER_PID=$! - sleep 0.2 - now=$(date +%s.%N) - $WOLFSSL_ROOT/examples/client/client -v4 -u -p$PROXY_PORT -w &> /tmp/cerr - elapsed=$(echo $(date +%s.%N) - $now | bc) - udp_lines=$(grep -P 'client:|server:' $UDP_LOGFILE | wc -l) - echo " took ${elapsed} sec(s) and produced ${udp_lines} messages" - wait $SERVER_PID - SERVER_PID= - kill $UDP_PROXY_PID - UDP_PROXY_PID= - rm $UDP_LOGFILE - done - echo "All $SIDE msg permutations succeeded" -} - - -test_time_delays () { - DELAYS=$(python3 << EOF -import itertools -t = [0.1, 0.5, 1.1] -tt = [] -for i in itertools.product(t, t, t): - tt.append(i * 15) -for i in tt: - print(','.join(map(lambda x: str(x) , i))) -EOF - ) - for DELAY in $DELAYS;do - echo -n "Testing delay $DELAY" - UDP_LOGFILE=/tmp/udp-delay-$DELAY - $UDP_PROXY_PATH -p $PROXY_PORT -s 127.0.0.1:$SERVER_PORT -u -l "$UDP_LOGFILE" -t $DELAY & - UDP_PROXY_PID=$! - $WOLFSSL_ROOT/examples/server/server -v4 -u -Ta -w &> /tmp/serr & - SERVER_PID=$! - sleep 0.2 - now=$(date +%s.%N) - $WOLFSSL_ROOT/examples/client/client -v4 -u -p$PROXY_PORT -w &> /tmp/cerr - elapsed=$(echo $(date +%s.%N) - $now | bc) - udp_lines=$(grep -P 'client:|server:' "$UDP_LOGFILE" | wc -l) - echo " took ${elapsed} sec(s) and produced ${udp_lines} messages" - wait $SERVER_PID - SERVER_PID= - kill $UDP_PROXY_PID - UDP_PROXY_PID= - rm "$UDP_LOGFILE" - done -} - -test_dropping_packets -test_permutations client 012 -test_dropping_new_session_ticket - -if [ ! -z $DTLS13_DO_SERVER_PERMUTATION_TEST ];then - test_permutations server 0123456 -fi - -# TODO: fix udp_proxy to not re-order close alert before app data -if [ ! -z $DTLS13_DO_DELAY_TEST ];then - test_time_delays -fi - -echo -echo "All tests SUCCEEDED!!!" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/dtlscid.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtlscid.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/dtlscid.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/dtlscid.test 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,7 @@ #!/bin/bash -set -e +# dtlscid.test +# Copyright wolfSSL 2022-2024 # if we can, isolate the network namespace to eliminate port collisions. if [[ -n "$NETWORK_UNSHARE_HELPER" ]]; then diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/external.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/external.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/external.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/external.test 2024-08-03 07:30:00.000000000 +0000 @@ -45,4 +45,15 @@ RESULT=$? [ $RESULT -ne 0 ] && echo -e "\n\nClient connection failed" && exit 1 +# test again, but using system CA certs to verify the server if support is enabled. +# We don't want to use --sys-ca-certs with static memory, as we don't know how +# much memory will be required to store an unbounded number of certs +BUILD_FLAGS="$(./examples/client/client '-#')" +if echo "$BUILD_FLAGS" | grep -q "WOLFSSL_SYS_CA_CERTS" && ! echo "$BUILD_FLAGS" | grep -q "WOLFSSL_STATIC_MEMORY"; then + echo -e "\nConnecting using WOLFSSL_SYS_CA_CERTS..." + ./examples/client/client -X -C -h $server -p 443 -g --sys-ca-certs + RESULT=$? + [ $RESULT -ne 0 ] && echo -e "\n\nClient connection failed when using WOLFSSL_SYS_CA_CERTS" && exit 1 +fi + exit 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -87,6 +87,8 @@ endif endif +dist_noinst_SCRIPTS+= scripts/pem.test + EXTRA_DIST += scripts/sniffer-static-rsa.pcap \ scripts/sniffer-ipv6.pcap \ scripts/sniffer-tls13-dh.pcap \ @@ -101,7 +103,8 @@ scripts/benchmark.test \ scripts/memtest.sh \ scripts/makedistsmall.sh \ - scripts/openssl_srtp.test + scripts/openssl_srtp.test \ + scripts/aria-cmake-build-test.sh # leave openssl.test as extra until non bash works @@ -114,8 +117,9 @@ EXTRA_DIST += scripts/cleanup_testfiles.sh +EXTRA_DIST += scripts/dtls.test + if BUILD_DTLS13 -EXTRA_DIST += scripts/dtls13.test EXTRA_DIST += scripts/dtlscid.test endif @@ -124,5 +128,6 @@ endif EXTRA_DIST += scripts/bench/bench_functions.sh +EXTRA_DIST += scripts/benchmark_compare.sh EXTRA_DIST += scripts/user_settings_asm.sh diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/makedistsmall.sh mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/makedistsmall.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/makedistsmall.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/makedistsmall.sh 2024-08-03 07:30:00.000000000 +0000 @@ -9,6 +9,7 @@ if [ "$1" == "keep" ]; then KEEP="yes"; else KEEP="no"; fi WOLFSSL_TEMPDIR=$(mktemp -d) || exit $? +WOLFSSL_BRANCH=$(git symbolic-ref --short HEAD) function cleanup_on_exit() { if [ "$KEEP" == "no" ]; @@ -34,15 +35,13 @@ echo "Setting up work directory..." git clone -q -n --shared . "$WOLFSSL_TEMPDIR" || exit $? pushd "$WOLFSSL_TEMPDIR" >/dev/null || exit $? -git checkout -q master || exit $? +git checkout -q "$WOLFSSL_BRANCH" # cleanup example directories echo "Removing files not needed..." rm -rf -- ./.git* rm -rf ./build-aux rm -rf ./certs -rm -rf ./ctaocrypt -rm -rf ./cyassl rm -rf ./doc rm -rf ./Docker # these use test.h, which are not portable @@ -63,7 +62,6 @@ rm -rf ./tests rm -rf ./testsuite rm -rf ./tirtos -rm -rf ./wolfcrypt/user-crypto rm -rf ./wrapper rm -f -- *.rc *.supp *.ac *.am *.conf *.sh *.cproject *.project *.pl rm -f Vagrantfile SCRIPTS-LIST quit input resource.h @@ -73,7 +71,7 @@ find . -name "*.vcproj" -delete find . -name "*.sln" -delete -# TLS/Compatiblity layer +# TLS/Compatibility layer #rm -rf ./src #rm -rf ./wolfssl/openssl diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/ocsp-stapling.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/ocsp-stapling.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/ocsp-stapling.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/ocsp-stapling.test 2024-08-03 07:30:00.000000000 +0000 @@ -243,16 +243,18 @@ OPENSSL_RESULT=$? echo "$OPENSSL_OUTPUT" fgrep -q 'self signed certificate in certificate chain' <<< "$OPENSSL_OUTPUT" - FGREP_RESULT=$? - if [ $OPENSSL_RESULT -eq 0 -a $FGREP_RESULT -ne 0 ]; then + FGREP1_RESULT=$? + fgrep -q 'self-signed certificate in certificate chain' <<< "$OPENSSL_OUTPUT" + FGREP2_RESULT=$? + if [ $OPENSSL_RESULT -eq 0 -a $FGREP1_RESULT -ne 0 -a $FGREP2_RESULT -ne 0 ]; then printf '%s\n' "Expected verification error from s_client is missing." remove_single_rF "$ready_file" exit 1 fi remove_single_rF "$ready_file" wait $wolf_pid - if [ $? -ne 1 ]; then - printf '%s\n' "wolfSSL server unexpected fail value" + if [ $? -ne 0 ]; then + printf '%s\n' "wolfSSL server unexpected fail" exit 1 fi fi @@ -386,6 +388,40 @@ echo 'skipping TLS1.3 stapling tests.' 1>&2 fi +# DTLS 1.2 and 1.3 cases +if ./examples/client/client -? 2>&1 | grep -q 'DTLSv1.2'; then + printf '%s\n\n' "------------- TEST CASE DTLS-1 SHOULD PASS -------------------" + # client test against our own server, must staple - GOOD CERT + echo $ready_file2 + ./examples/server/server -c certs/ocsp/server1-cert.pem -R "$ready_file2" \ + -k certs/ocsp/server1-key.pem -u -v 3 \ + -p $port3 & + wolf_pid3=$! + + sleep 0.2 + ./examples/client/client -C -A certs/ocsp/root-ca-cert.pem -u -v 3 \ + -W 1 -p $port3 + RESULT=$? + [ $RESULT -ne 0 ] && printf '\n\n%s\n' "Client connection 5 failed" && exit 1 + printf '%s\n\n' "Test PASSED!" +fi + +if ./examples/client/client -? 2>&1 | grep -q 'DTLSv1.3'; then + printf '%s\n\n' "------------- TEST CASE DTLS-2 SHOULD PASS -------------------" + # client test against our own server, must staple - GOOD CERT + ./examples/server/server -c certs/ocsp/server1-cert.pem -R "$ready_file2" \ + -k certs/ocsp/server1-key.pem -u -v 4 \ + -p $port3 & + wolf_pid3=$! + sleep 0.2 + ./examples/client/client -C -A certs/ocsp/root-ca-cert.pem -u -v 4 \ + -W 1 -p $port3 + RESULT=$? + [ $RESULT -ne 0 ] && printf '\n\n%s\n' "Client connection 5 failed" && exit 1 + printf '%s\n\n' "Test PASSED!" + +fi + # need a unique port since may run the same time as testsuite generate_port() { #-------------------------------------------------------------------------# diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/ocsp-stapling2.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/ocsp-stapling2.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/ocsp-stapling2.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/ocsp-stapling2.test 2024-08-03 07:30:00.000000000 +0000 @@ -334,9 +334,19 @@ "$@" \ & +# NEW: openssl isn't being cleaned up, invoke directly in script for cleanup +# purposes! +openssl ocsp -port $port4 -nmin 1 \ + -index certs/ocsp/index-ca-and-intermediate-cas.txt \ + -rsigner certs/ocsp/ocsp-responder-cert.pem \ + -rkey certs/ocsp/ocsp-responder-key.pem \ + -CA certs/ocsp/root-ca-cert.pem \ + "$@" \ + & + sleep 0.1 # "jobs" is not portable for posix. Must use bash interpreter! -[ $(jobs -r | wc -l) -ne 3 ] && printf '\n\n%s\n' "Setup ocsp responder failed, skipping" && exit 0 +[ $(jobs -r | wc -l) -ne 4 ] && printf '\n\n%s\n' "Setup ocsp responder failed, skipping" && exit 0 printf '\n\n%s\n\n' "All OCSP responders started successfully!" printf '%s\n\n' "------------- TEST CASE 1 SHOULD PASS ------------------------" @@ -352,18 +362,18 @@ [ $RESULT -ne 0 ] && printf '\n\n%s\n' "Client connection 1 failed" && exit 1 printf '%s\n\n' "Test PASSED!" -printf '%s\n\n' "TEST CASE 2 DISABLED PENDING REVIEW" -#printf '%s\n\n' "------------- TEST CASE 2 SHOULD PASS ------------------------" -#remove_single_rF $ready_file5 -#./examples/server/server -c certs/ocsp/server3-cert.pem \ -# -k certs/ocsp/server3-key.pem -R $ready_file5 \ -# -p $port5 & -#wait_for_readyFile $ready_file5 $server_pid5 $port5 -#./examples/client/client -C -A certs/ocsp/root-ca-cert.pem -W 3 -v 3 \ -# -p $port5 -#RESULT=$? -#[ $RESULT -ne 0 ] && printf '\n\n%s\n' "Client connection 2 failed" && exit 1 -#printf '%s\n\n' "Test PASSED!" +printf '%s\n\n' "------------- TEST CASE 2 SHOULD PASS ------------------------" +remove_single_rF $ready_file5 +./examples/server/server -c certs/ocsp/server3-cert.pem \ + -k certs/ocsp/server3-key.pem -R $ready_file5 \ + -p $port5 & +server_pid5=$! +wait_for_readyFile $ready_file5 $server_pid5 $port5 +./examples/client/client -C -A certs/ocsp/root-ca-cert.pem -W 3 -v 3 \ + -p $port5 +RESULT=$? +[ $RESULT -ne 0 ] && printf '\n\n%s\n' "Client connection 2 failed" && exit 1 +printf '%s\n\n' "Test PASSED!" printf '%s\n\n' "------------- TEST CASE 3 SHOULD REVOKE ----------------------" # client test against our own server - REVOKED SERVER CERT @@ -499,6 +509,22 @@ && exit 1 printf '%s\n\n' "Test PASSED!" + +if ./examples/client/client -? 2>&1 | grep -q 'DTLS'; then +printf '%s\n\n' "------------- TEST CASE DTLS-1 SHOULD PASS -------------------" +# client test against our own server - GOOD CERTS +./examples/server/server -c certs/ocsp/server3-cert.pem \ + -k certs/ocsp/server3-key.pem -R $ready_file5 \ + -p $port5 -u -v 3 & +server_pid5=$! +sleep 0.2 +./examples/client/client -C -A certs/ocsp/root-ca-cert.pem -W 2 -u -v 3 \ + -p $port5 +RESULT=$? +[ $RESULT -ne 0 ] && printf '\n\n%s\n' "Client connection 1 failed" && exit 1 +printf '%s\n\n' "Test PASSED!" +fi + printf '%s\n\n' "------------------- TESTS COMPLETE ---------------------------" exit 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/openssl.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/openssl.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/openssl.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/openssl.test 2024-08-03 07:30:00.000000000 +0000 @@ -2,7 +2,7 @@ # openssl.test -# Enviornment variables used: +# Environment variables used: # OPENSSL (openssl app to use) # OPENSSL_ENGINE_ID (engine id if any i.e. "wolfengine") @@ -279,7 +279,7 @@ server_ready=0 while [ "$counter" -lt 20 ]; do echo -e "waiting for $server_name ready..." - echo -e Checking | nc localhost $server_port + echo -e Checking | nc -w 5 localhost $server_port nc_result=$? if [ $nc_result = 0 ] then @@ -490,7 +490,7 @@ # Start OpenSSL servers # -# Check for cerificate support in wolfSSL +# Check for certificate support in wolfSSL wolf_certs=`$WOLFSSL_CLIENT -? 2>&1` case $wolf_certs in *"cert"*) @@ -1143,7 +1143,7 @@ do_wolfssl_client psk="" adh="" - openssl_psk="-psk 0123456789abcdef0123456789abcdef" + openssl_psk="-psk 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" open_temp_cases_total=$((open_temp_cases_total + 1)) port=$wolfssl_port do_openssl_client diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/pem.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/pem.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/pem.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/pem.test 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,459 @@ +#!/bin/bash + +# pem.test +# Copyright wolfSSL 2023-2023 + +tmp_file=./pem_test.$$ +tmp_der_file=./pem_test_out_der.$$ +tmp_pem_file=./pem_test_out_pem.$$ +PEM_EXE=./examples/pem/pem +ASN1_EXE=./examples/asn1/asn1 +TEST_CNT=0 +TEST_PASS_CNT=0 +TEST_SKIP_CNT=0 +TEST_FAIL_CNT=0 +TEST_FAIL= +TEST_CASES=() +RUN_ALL="YES" +CR=$'\n' +ENC_STRING="encrypt" +DER_TO_PEM_STRING="input is DER and output is PEM" + +# Cleanup temporaries created during testing. +do_cleanup() { + echo + echo "in cleanup" + + if [ -e "$tmp_der_file" ]; then + echo -e "removing existing temporary DER output file" + rm "$tmp_der_file" + fi + if [ -e "$tmp_pem_file" ]; then + echo -e "removing existing temporary PEM output file" + rm "$tmp_pem_file" + fi + if [ -e "$tmp_file" ]; then + echo -e "removing existing temporary output file" + rm "$tmp_file" + fi +} + +# Called when a signal is trapped. +do_trap() { + echo + echo "got trap" + do_cleanup + exit 1 +} + +# Trap keyboard interrupt and termination signal. +trap do_trap INT TERM + +# Check the usage text for a string to determine feature support. +# +# @param [in] $1 String to search for, +# @return 1 when string is found. +# @return 0 otherwise. +check_usage_string() { + $PEM_EXE -? | grep "$1" >$tmp_file 2>&1 + if [ "$?" = "0" ]; then + return 1 + fi + return 0 +} + +# Check whether the test case is to be run. +# When command line parameters given - only run those. +# +# @return 1 when test case is to be run. +# @return 0 otherwise. +check_run() { + # When RUN_ALL set them all test cases are run. + if [ "$RUN_ALL" != "" ]; then + return 1 + else + # Check if test case number in list. + for T in "${TEST_CASE[@]}"; do + if [ "$T" = "$TEST_CNT" ]; then + return 1 + fi + done + return 0 + fi +} + +# Setup for new test case. +# +# @param [in] $* Name of test case. +test_setup() { + TEST_CNT=$((TEST_CNT+1)) + TEST_DESC="$TEST_CNT: $*" + FAILED= + SKIP= + + if [ "$USAGE_STRING" != "" ]; then + # Check usage output for string to see whether we have to skip test case + # due to wolfSSL missing features. + check_usage_string "$USAGE_STRING" + if [ "$?" = "0" ] ; then + echo + echo "$TEST_DESC" + echo "SKIPPED" + SKIP="missing feature" + fi + USAGE_STRING= + fi + + if [ "$SKIP" = "" ]; then + # Check whether this test case is to be run. + check_run + if [ "$?" = "1" ]; then + echo + echo "$TEST_DESC" + TEST_PASS_CNT=$((TEST_PASS_CNT+1)) + else + SKIP="not requested" + fi + fi + + # Handle skipping + if [ "$SKIP" != "" ]; then + TEST_SKIP_CNT=$((TEST_SKIP_CNT+1)) + fi +} + +# Handle when a test case failed. +test_fail() { + if [ "$SKIP" = "" -a "$FAILED" = "" ]; then + TEST_PASS_CNT=$((TEST_PASS_CNT-1)) + TEST_FAIL_CNT=$((TEST_FAIL_CNT+1)) + TEST_FAIL="$TEST_FAIL$CR $TEST_DESC" + FAILED=yes + fi +} + +# Use asn1 to check DER produced is valid. +check_der() { + $ASN1_EXE $tmp_der_file >$tmp_file 2>&1 + if [ "$?" != "0" ]; then + echo + echo " DER result bad" + test_fail + fi +} + +# Convert PEM file to DER +# +# @param [in] $* Command line parameters to pem example. +convert_to_der() { + if [ "$SKIP" = "" -a "$FAILED" = "" ]; then + echo " $PEM_EXE $* -out $tmp_pem_file" + $PEM_EXE "$@" -out $tmp_der_file + if [ "$?" != "0" ]; then + echo " Failed to convert to DER" + test_fail + fi + check_der + fi +} + +# Compare generated DER file to existing file. +# +# @param [in] $1 File to compare to. +compare_der() { + diff $tmp_der_file $1 + if [ "$?" != "0" ]; then + echo " Created DER file different from expected" + test_fail + fi +} + +# Convert DER file to PEM +# +# PEM_TYPE contains PEM header to encode. +# +# @param [in] $* Command line parameters to pem example. +convert_to_pem() { + if [ "$SKIP" = "" -a "$FAILED" = "" ]; then + echo " $PEM_EXE --der -t \"$PEM_TYPE\" $* -out $tmp_pem_file" + $PEM_EXE --der "$@" -t "$PEM_TYPE" -out $tmp_pem_file + if [ "$?" != "0" ]; then + test_fail + fi + fi +} + +# Compare generated PEM file to existing file. +compare_pem() { + diff $tmp_pem_file $1 >$tmp_file 2>&1 + if [ "$?" != "0" ]; then + cat $tmp_file + echo + echo " Created PEM file different from expected" + test_fail + fi +} + +# Convert to and from PEM and DER and compare to file containing expected DER. +# +# @param [in] $1 Name of PEM file to read. +# @param [in] $2 Name of DER file to compare to. +# @param [in] $3 PEM type expected in PEM file and to place in created PEM +# file. +pem_der_exp() { + if [ "$SKIP" = "" -a "$FAILED" = "" ]; then + PEM_FILE=$1 + DER_FILE=$2 + PEM_TYPE="$3" + + # Convert PEM to DER + convert_to_der -in $PEM_FILE + if [ "$FAILED" = "" ]; then + # On success, compare to DER file. + compare_der $DER_FILE + fi + # Check if converting from DER to PEM is supported. + check_usage_string $DER_TO_PEM_STRING + if [ "$?" = "1" ]; then + if [ "$FAILED" = "" ]; then + # Convert expected DER file to PEM + convert_to_pem -in $DER_FILE + fi + if [ "$FAILED" = "" ]; then + # On success, compare to original PEM file. + compare_pem $PEM_FILE + fi + fi + fi +} + +# Convert DER to encrypted PEM. +# +# @param [in] $@ Command line parameters to pem example when encrypting. +der_pem_enc() { + PEM_TYPE="ENCRYPTED PRIVATE KEY" + convert_to_pem -in ./certs/server-key.der -p yassl123 "$@" + convert_to_der -in $tmp_pem_file -p yassl123 +} + + +################################################################################ + +# Check for pem example - can't test without it. +if [ ! -x $PEM_EXE ]; then + echo "PEM example not available, won't run" + exit 77 +fi +# Check for asn1 example - don't want to test without it. +if [ ! -x $ASN1_EXE ]; then + echo "ASN.1 example not available, won't run" + exit 77 +fi + +# Check the available features compiled into pem example. +echo "wolfSSL features:" +check_usage_string $DER_TO_PEM_STRING +if [ "$?" = "1" ]; then + echo " Conversion from DER to PEM support compiled in." +else + echo " Conversion from DER to PEM support NOT compiled in." +fi +check_usage_string $ENC_STRING +if [ "$?" = "1" ]; then + echo " Encryption support compiled in." +else + echo " Encryption support NOT compiled in." +fi +echo + +# Command line parameters are test cases to run. +while [ $# -gt 0 ]; do + TEST_CASE[${#TEST_CASE[@]}]=$1 + RUN_ALL= + shift 1 +done + + +test_setup "Convert PEM certificate (first of many) to DER" +convert_to_der -in ./certs/server-cert.pem + +test_setup "Convert PEM certificate (second of many) to DER" +convert_to_der -in ./certs/server-cert.pem --offset 6000 + +test_setup "RSA private key" +pem_der_exp ./certs/server-key.pem \ + ./certs/server-key.der "RSA PRIVATE KEY" + +test_setup "RSA public key" +pem_der_exp ./certs/server-keyPub.pem \ + ./certs/server-keyPub.der "RSA PUBLIC KEY" + +test_setup "DH parameters" +pem_der_exp ./certs/dh3072.pem \ + ./certs/dh3072.der "DH PARAMETERS" + +test_setup "X9.42 parameters" +pem_der_exp ./certs/x942dh2048.pem \ + ./certs/x942dh2048.der "X9.42 DH PARAMETERS" + +USAGE_STRING=" DSA PARAMETERS" +test_setup "DSA parameters" +pem_der_exp ./certs/dsaparams.pem \ + ./certs/dsaparams.der "DSA PARAMETERS" + +USAGE_STRING=" DSA PRIVATE KEY" +test_setup "DSA private key" +pem_der_exp ./certs/1024/dsa1024.pem \ + ./certs/1024/dsa1024.der "DSA PRIVATE KEY" + +USAGE_STRING=" EC PRIVATE KEY" +test_setup "ECC private key" +pem_der_exp ./certs/ecc-keyPkcs8.pem \ + ./certs/ecc-keyPkcs8.der "PRIVATE KEY" + +USAGE_STRING=" EC PRIVATE KEY" +test_setup "EC PRIVATE KEY" +pem_der_exp ./certs/ecc-privkey.pem \ + ./certs/ecc-privkey.der "EC PRIVATE KEY" + +USAGE_STRING=" EC PARAMETERS" +test_setup "ECC parameters" +pem_der_exp ./certs/ecc-params.pem \ + ./certs/ecc-params.der "EC PARAMETERS" + +test_setup "ECC public key" +pem_der_exp ./certs/ecc-keyPub.pem \ + ./certs/ecc-keyPub.der "PUBLIC KEY" + +test_setup "Ed25519 public key" +pem_der_exp ./certs/ed25519/client-ed25519-key.pem \ + ./certs/ed25519/client-ed25519-key.der 'PUBLIC KEY' + +test_setup "Ed25519 private key" +pem_der_exp ./certs/ed25519/client-ed25519-priv.pem \ + ./certs/ed25519/client-ed25519-priv.der 'PRIVATE KEY' + +USAGE_STRING=" EDDSA PRIVATE KEY" +test_setup "EdDSA private key" +pem_der_exp ./certs/ed25519/eddsa-ed25519.pem \ + ./certs/ed25519/eddsa-ed25519.der 'EDDSA PRIVATE KEY' + +test_setup "Ed448 public key" +pem_der_exp ./certs/ed448/client-ed448-key.pem \ + ./certs/ed448/client-ed448-key.der 'PUBLIC KEY' + +test_setup "Ed448 private key" +pem_der_exp ./certs/ed448/client-ed448-priv.pem \ + ./certs/ed448/client-ed448-priv.der 'PRIVATE KEY' + +USAGE_STRING=" CERTIFICATE REQUEST" +test_setup "Certificate Request" +pem_der_exp ./certs/csr.dsa.pem \ + ./certs/csr.dsa.der 'CERTIFICATE REQUEST' + +USAGE_STRING=" X509 CRL" +test_setup "X509 CRL" +pem_der_exp ./certs/crl/caEccCrl.pem \ + ./certs/crl/caEccCrl.der 'X509 CRL' + +USAGE_STRING=$ENC_STRING +test_setup "Encrypted Key with header" +convert_to_der -in ./certs/server-keyEnc.pem -p yassl123 --padding + +USAGE_STRING=$ENC_STRING +test_setup "Encrypted Key - PKCS#8" +convert_to_der -in ./certs/server-keyPkcs8Enc.pem -p yassl123 + +USAGE_STRING=$ENC_STRING +test_setup "Encrypted Key - PKCS#8 (PKCS#12 PBE)" +convert_to_der -in ./certs/server-keyPkcs8Enc12.pem -p yassl123 + +USAGE_STRING="PBES1_MD5_DES" +test_setup "Encrypted Key - PKCS#8 (PKCS#5 PBES1-MD5-DES)" +convert_to_der -in ./certs/ecc-keyPkcs8Enc.pem -p yassl123 + +USAGE_STRING=" DES3" +test_setup "Encrypted Key - PKCS#8 (PKCS#5v2 PBE-SHA1-DES3)" +convert_to_der -in ./certs/server-keyPkcs8Enc2.pem -p yassl123 + +USAGE_STRING="AES-256-CBC" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (Default: PKCS#5 PBES2 AES-256-CBC)" +der_pem_enc + +USAGE_STRING="AES-256-CBC" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 - Large salt" +der_pem_enc -s 16 + +USAGE_STRING="AES-256-CBC" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 - 10000 iterations (DER encoding check)" +der_pem_enc -i 10000 + +USAGE_STRING="AES-256-CBC" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 - 100 iterations (DER encoding check)" +der_pem_enc -i 100 + +USAGE_STRING="AES-128-CBC" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#5 PBES2 AES-128-CBC)" +der_pem_enc --pbe-alg AES-128-CBC + +USAGE_STRING="DES" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#5 PBES2 DES)" +der_pem_enc --pbe-alg DES + + +USAGE_STRING="DES3" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#5 PBES2 DES3)" +der_pem_enc --pbe-alg DES3 + +USAGE_STRING="PBES1_MD5_DES" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#5 PBES1-MD5-DES)" +der_pem_enc --pbe PBES1_MD5_DES + +USAGE_STRING="PBES1_SHA1_DES" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#5 PBES1-SHA1-DES)" +der_pem_enc --pbe PBES1_SHA1_DES + +USAGE_STRING=" SHA1_RC4_128" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#12 PBE-SHA1-RC4-128)" +der_pem_enc --pbe-ver PKCS12 --pbe SHA1_RC4_128 + +USAGE_STRING=" SHA1_DES3" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#12 PBE-SHA1-DES3)" +der_pem_enc --pbe-ver PKCS12 --pbe SHA1_DES3 + +USAGE_STRING="SHA1_40RC2_CBC" +PEM_TYPE="ENCRYPTED PRIVATE KEY" +test_setup "Encrypt Key - PKCS#8 (PKCS#12 PBE-SHA1-40RC2-CBC)" +der_pem_enc --pbe-ver PKCS12 --pbe SHA1_40RC2_CBC + +# Note: PKCS#12 with SHA1_DES doesn't work as we encode as PKCS#5 SHA1_DES as +# ids are the same + + +# Report results +echo +if [ "$TEST_SKIP_CNT" = "0" ]; then + echo "RESULT: $TEST_PASS_CNT/$TEST_CNT (pass/total)" +else + echo "RESULT: $TEST_PASS_CNT/$TEST_SKIP_CNT/$TEST_CNT (pass/skip/total)" +fi +if [ "$TEST_FAIL_CNT" != "0" ]; then + echo "FAILURES ($TEST_FAIL_CNT):$TEST_FAIL" +else + echo "PASSED" +fi + +# Cleanup temporaries +do_cleanup + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-gen.sh mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-gen.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-gen.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-gen.sh 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,5 @@ #!/bin/bash +#set -x # Run this script from the wolfSSL root if [ ! -f wolfssl/ssl.h ]; then @@ -6,93 +7,110 @@ exit 1 fi +server_pid=0 +tcpdump_pid=0 + +cleanup() { + if [ "$server_pid" -ne 0 ]; then kill $server_pid; server_pid=0; fi + if [ "$tcpdump_pid" -ne 0 ]; then sleep 1; kill -15 $tcpdump_pid; tcpdump_pid=0; fi +} +trap cleanup EXIT INT TERM HUP + +set -o pipefail +prepend() { # Usage: cmd 2>&1 | prepend "sometext " + while read line; do echo "${1}${line}"; done +} + +run_test() { # Usage: run_test [serverArgs [clientArgs]] + echo "Running test $1" + CIPHER=$1 + if [ "$CIPHER" != "" ]; then + CIPHER="-l $CIPHER" + fi + stdbuf -oL -eL ./examples/server/server -i -x $CIPHER $2 2>&1 | prepend "[server] " & + server_pid=$! + ((server_pid--)) # Get the first PID in the pipe + sleep 0.1 + stdbuf -oL -eL ./examples/client/client $CIPHER $3 2>&1 | prepend "[client] " + RET=$? + if [ "$RET" != 0 ]; then + echo "Error in test: $RET" + exit $RET + fi + kill $server_pid; server_pid=0 + echo "Test passed: $1" +} + run_sequence() { - if [ "$1" == "dh" ] || [ "$1" == "ecc" ]; then - # TLS v1.3 - ./examples/server/server -v 4 -l TLS13-AES128-GCM-SHA256 & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES128-GCM-SHA256 - - ./examples/server/server -v 4 -l TLS13-AES256-GCM-SHA384 & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES256-GCM-SHA384 - - ./examples/server/server -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 - fi - if [ "$1" == "dh-resume" ] || [ "$1" == "ecc-resume" ]; then - # TLS v1.3 Resumption - ./examples/server/server -v 4 -l TLS13-AES128-GCM-SHA256 -r & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES128-GCM-SHA256 -r - - ./examples/server/server -v 4 -l TLS13-AES256-GCM-SHA384 -r & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES256-GCM-SHA384 -r - - ./examples/server/server -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 -r & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 -r - fi - - if [ "$1" == "x25519" ]; then - # TLS v1.3 - ./examples/server/server -v 4 -l TLS13-AES128-GCM-SHA256 -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES128-GCM-SHA256 -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem - - ./examples/server/server -v 4 -l TLS13-AES256-GCM-SHA384 -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES256-GCM-SHA384 -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem - - ./examples/server/server -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem - fi - # Run: with x25519_resume - if [ "$1" == "x25519-resume" ]; then - # TLS v1.3 Resumption - ./examples/server/server -v 4 -l TLS13-AES128-GCM-SHA256 -r -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES128-GCM-SHA256 -r -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem - - ./examples/server/server -v 4 -l TLS13-AES256-GCM-SHA384 -r -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-AES256-GCM-SHA384 -r -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem - - ./examples/server/server -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 -r -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem & - sleep 0.1 - ./examples/client/client -v 4 -l TLS13-CHACHA20-POLY1305-SHA256 -r -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem - fi - - # TLS v1.3 Hello Retry Request - if [ "$1" == "hrr" ]; then - # TLS v1.3 Hello Retry Request - ./examples/server/server -v 4 -i -x -g & - server_pid=$! - sleep 0.1 - ./examples/client/client -v 4 -J - kill $server_pid + if [ "$1" == "tls13-dh" ] || [ "$1" == "tls13-ecc" ] || [ "$1" == "tls13-keylog" ]; then # TLS v1.3 + run_test "TLS13-AES128-GCM-SHA256" "-v 4" "-v 4" + run_test "TLS13-AES256-GCM-SHA384" "-v 4" "-v 4" + run_test "TLS13-CHACHA20-POLY1305-SHA256" "-v 4" "-v 4" + elif [ "$1" == "tls12" ] || [ "$1" == "tls12-keylog" ]; then # TLS v1.2 + run_test "ECDHE-ECDSA-AES128-GCM-SHA256" "-v 3 -A ./certs/ca-ecc-cert.pem -k ./certs/ecc-key.pem -c ./certs/intermediate/server-chain-ecc.pem -V" "-v 3 -A ./certs/ca-ecc-cert.pem -k ./certs/ecc-client-key.pem -c ./certs/intermediate/client-chain-ecc.pem -C" + run_test "ECDHE-ECDSA-AES256-GCM-SHA384" "-v 3 -A ./certs/ca-ecc-cert.pem -k ./certs/ecc-key.pem -c ./certs/intermediate/server-chain-ecc.pem -V" "-v 3 -A ./certs/ca-ecc-cert.pem -k ./certs/ecc-client-key.pem -c ./certs/intermediate/client-chain-ecc.pem -C" + elif [ "$1" == "tls13-dh-resume" ] || [ "$1" == "tls13-ecc-resume" ]; then # TLS v1.3 Resumption + run_test "TLS13-AES128-GCM-SHA256" "-v 4 -r" "-v 4 -r" + run_test "TLS13-AES256-GCM-SHA384" "-v 4 -r" "-v 4 -r" + run_test "TLS13-CHACHA20-POLY1305-SHA256" "-v 4 -r" "-v 4 -r" + elif [ "$1" == "tls13-x25519" ]; then # TLS v1.3 + run_test "TLS13-AES128-GCM-SHA256" "-v 4 -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem" "-v 4 -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem" + run_test "TLS13-AES256-GCM-SHA384" "-v 4 -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem" "-v 4 -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem" + run_test "TLS13-CHACHA20-POLY1305-SHA256" "-v 4 -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem" "-v 4 -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem" + elif [ "$1" == "tls13-x25519-resume" ]; then # TLS v1.3 x25519 Resumption + run_test "TLS13-AES128-GCM-SHA256" "-v 4 -r -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem" "-v 4 -r -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem" + run_test "TLS13-AES256-GCM-SHA384" "-v 4 -r -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem" "-v 4 -r -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem" + run_test "TLS13-CHACHA20-POLY1305-SHA256" "-v 4 -r -c ./certs/ed25519/server-ed25519.pem -k ./certs/ed25519/server-ed25519-priv.pem -A ./certs/ed25519/client-ed25519.pem" "-v 4 -r -c ./certs/ed25519/client-ed25519.pem -k ./certs/ed25519/client-ed25519-priv.pem -A ./certs/ed25519/root-ed25519.pem" + elif [ "$1" == "tls13-hrr" ]; then # TLS v1.3 Hello Retry Request + run_test "" "-v 4 -g" "-v 4 -J" + else + echo "Invalid test" + exit 1 fi - sleep 1 } -run_capture(){ - echo -e "\nconfiguring and building wolfssl..." - ./configure --enable-sniffer $2 1>/dev/null || exit $? + +run_capture() { + local config_flags=() + echo -e "\nconfiguring and building wolfssl ($1)..." + + # Add default flags + config_flags+=(--enable-sniffer) + + # If additional arguments are provided, add them to the array + if [ -n "$2" ]; then + # Convert string into an array, respecting quoted strings as a single element + eval "config_flags+=($2)" + fi + + ./configure "${config_flags[@]}" 1>/dev/null || exit $? make 1>/dev/null || exit $? + + if [[ "$1" == "tls12-keylog" || "$1" == "tls13-keylog" ]]; then + rm -f ./sslkeylog.log + fi + echo "starting capture" - tcpdump -i lo0 -nn port 11111 -w ./scripts/sniffer-tls13-$1.pcap & + tcpdump -i lo -n port 11111 -w ./scripts/sniffer-${1}.pcap -U & tcpdump_pid=$! run_sequence $1 - kill $tcpdump_pid + sleep 1 + kill -15 $tcpdump_pid; tcpdump_pid=0 + + if [[ "$1" == "tls12-keylog" || "$1" == "tls13-keylog" ]]; then + cp ./sslkeylog.log ./scripts/sniffer-${1}.sslkeylog + fi } -run_capture "ecc" "" -run_capture "ecc-resume" "--enable-session-ticket" -run_capture "dh" "--disable-ecc" -run_capture "dh-resume" "--disable-ecc --enable-session-ticket" -run_capture "x25519" "--enable-curve25519 --disable-dh --disable-ecc" -run_capture "x25519-resume" "--enable-curve25519 --disable-dh --disable-ecc --enable-session-ticket" -run_capture "hrr" "--disable-dh CFLAGS=-DWOLFSSL_SNIFFER_WATCH" +run_capture "tls12" "" +run_capture "tls12-keylog" "--enable-enc-then-mac=no --enable-keylog-export CFLAGS='-Wno-cpp -DWOLFSSL_SNIFFER_KEYLOGFILE'" +run_capture "tls13-keylog" "--enable-keylog-export CFLAGS='-Wno-cpp -DWOLFSSL_SNIFFER_KEYLOGFILE'" +run_capture "tls13-ecc" "" +run_capture "tls13-ecc-resume" "--enable-session-ticket" +run_capture "tls13-dh" "--disable-ecc" +run_capture "tls13-dh-resume" "--disable-ecc --enable-session-ticket" +run_capture "tls13-x25519" "--enable-curve25519 --disable-dh --disable-ecc" +run_capture "tls13-x25519-resume" "--enable-curve25519 --disable-dh --disable-ecc --enable-session-ticket" +run_capture "tls13-hrr" "--disable-dh CFLAGS=-DWOLFSSL_SNIFFER_WATCH" + +echo "Tests passed in $SECONDS seconds" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-testsuite.test mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-testsuite.test --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-testsuite.test 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-testsuite.test 2024-08-03 07:30:00.000000000 +0000 @@ -59,6 +59,12 @@ if [ $? -eq 0 ]; then has_static_rsa=yes fi +# ./configure --enable-sniffer CFLAGS="-DWOLFSSL_SNIFFER_KEYLOGFILE" +has_keylog=no +./sslSniffer/sslSnifferTest/snifftest -? 2>&1 | grep -- 'ssl_keylog_file' +if [ $? -eq 0 ]; then + has_keylog=yes +fi RESULT=0 @@ -66,8 +72,8 @@ # TLS v1.2 Static RSA Test if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes then - echo -e "\nStaring snifftest on testsuite.pcap...\n" - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-static-rsa.pcap ./certs/server-key.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-static-rsa.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-static-rsa.pcap -key ./certs/server-key.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest static RSA failed\n" && exit 1 @@ -76,17 +82,54 @@ # TLS v1.2 Static RSA Test (IPv6) if test $RESULT -eq 0 && test $has_rsa == yes && test $has_tlsv12 == yes && test $has_static_rsa == yes then - echo -e "\nStaring snifftest on sniffer-ipv6.pcap...\n" - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-ipv6.pcap ./certs/server-key.pem ::1 11111 + echo -e "\nStarting snifftest on sniffer-ipv6.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-ipv6.pcap -key ./certs/server-key.pem -server ::1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest (ipv6) failed\n" && exit 1 fi +# TLS v1.2 and v1.3 sniffer keylog file test: runs sniffer on pcap and associated keylog file and compares decrypted traffic with known good output. +# To regenerate the known good output, run `scripts/sniffer-gen.sh` to regenerate the pcap and keylog file, then run the sniffer on it +# with the same arguments as in the test below, but redirect output to `./scripts/sniffer-tls12-keylog.out`. +if test $RESULT -eq 0 && test $has_keylog == yes +then + for tlsver in tls12 tls13 + do + # skip tls versions we don't have compiled-in support for + [[ $tlsver == "tls12" && $has_tlsv12 == "no" ]] && continue + [[ $tlsver == "tls13" && $has_tlsv13 == "no" ]] && continue + + echo -e "\nStarting snifftest on sniffer-$tlsver-keylog.pcap...\n" + + TMPFILE=$(mktemp) + RESULT=$? + [ $RESULT -ne 0 ] && echo -e "\n$tlsver snifftest keylog test failed: unable to create tmpfile\n" && rm $TMPFILE && exit 1 + + ./sslSniffer/sslSnifferTest/snifftest \ + -pcap scripts/sniffer-$tlsver-keylog.pcap \ + -keylogfile scripts/sniffer-$tlsver-keylog.sslkeylog \ + -server 127.0.0.1 -port 11111 | tee $TMPFILE + + RESULT=$? + [ $RESULT -ne 0 ] && echo -e "\n$tlsver snifftest keylog test failed: snifftest returned $RESULT\n" && rm $TMPFILE && exit 1 + + # use grep to only compare against decrypted output + SEARCH_STRING="SSL App Data" + grep "$SEARCH_STRING" $TMPFILE | diff - <(grep "$SEARCH_STRING" scripts/sniffer-$tlsver-keylog.out) + + RESULT=$? + [ $RESULT -ne 0 ] && echo -e "\n$tlsver snifftest keylog test failed: snifftest diff returned $RESULT\n" && rm $TMPFILE && exit 1 + + rm $TMPFILE + done +fi + # TLS v1.3 sniffer test ECC if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes then - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-tls13-ecc.pcap ./certs/statickeys/ecc-secp256r1.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-tls13-ecc.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-tls13-ecc.pcap -key ./certs/statickeys/ecc-secp256r1.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest TLS v1.3 ECC failed\n" && exit 1 @@ -95,7 +138,8 @@ # TLS v1.3 sniffer test DH if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_dh == yes then - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-tls13-dh.pcap ./certs/statickeys/dh-ffdhe2048.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-tls13-dh.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-tls13-dh.pcap -key ./certs/statickeys/dh-ffdhe2048.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest TLS v1.3 DH failed\n" && exit 1 @@ -104,7 +148,8 @@ # TLS v1.3 sniffer test X25519 if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_x25519 == yes then - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-tls13-x25519.pcap ./certs/statickeys/x25519.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-tls13-x25519.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-tls13-x25519.pcap -key ./certs/statickeys/x25519.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest TLS v1.3 X25519 failed\n" && exit 1 @@ -113,7 +158,8 @@ # TLS v1.3 sniffer test ECC resumption if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes && test $session_ticket == yes then - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-tls13-ecc-resume.pcap ./certs/statickeys/ecc-secp256r1.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-tls13-ecc-resume.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-tls13-ecc-resume.pcap -key ./certs/statickeys/ecc-secp256r1.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest TLS v1.3 ECC failed\n" && exit 1 @@ -122,7 +168,8 @@ # TLS v1.3 sniffer test DH if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_dh == yes && test $session_ticket == yes then - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-tls13-dh-resume.pcap ./certs/statickeys/dh-ffdhe2048.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-tls13-dh-resume.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-tls13-dh-resume.pcap -key ./certs/statickeys/dh-ffdhe2048.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest TLS v1.3 DH failed\n" && exit 1 @@ -131,7 +178,8 @@ # TLS v1.3 sniffer test X25519 if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_x25519 == yes && test $session_ticket == yes then - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-tls13-x25519-resume.pcap ./certs/statickeys/x25519.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-tls13-x25519-resume.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-tls13-x25519-resume.pcap -key ./certs/statickeys/x25519.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest TLS v1.3 X25519 failed\n" && exit 1 @@ -140,12 +188,12 @@ # TLS v1.3 sniffer test hello_retry_request (HRR) with ECDHE if test $RESULT -eq 0 && test $has_tlsv13 == yes && test $has_ecc == yes then - ./sslSniffer/sslSnifferTest/snifftest ./scripts/sniffer-tls13-hrr.pcap ./certs/statickeys/ecc-secp256r1.pem 127.0.0.1 11111 + echo -e "\nStarting snifftest on sniffer-tls13-hrr.pcap...\n" + ./sslSniffer/sslSnifferTest/snifftest -pcap ./scripts/sniffer-tls13-hrr.pcap -key ./certs/statickeys/ecc-secp256r1.pem -server 127.0.0.1 -port 11111 RESULT=$? [ $RESULT -ne 0 ] && echo -e "\nsnifftest TLS v1.3 HRR failed\n" && exit 1 fi echo -e "\nSuccess!\n" - exit 0 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.out mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.out --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.out 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.out 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,7 @@ +snifftest 5.6.3 +sniffer features: key_callback tls_v13 tls_v12 static_ephemeral sni extended_master rsa dh ecc rsa_static dh_static ssl_keylog_file + +SSL App Data(26:14):hello wolfssl! +SSL App Data(27:22):I hear you fa shizzle! +SSL App Data(57:14):hello wolfssl! +SSL App Data(58:22):I hear you fa shizzle! Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.pcap and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.pcap differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.sslkeylog mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.sslkeylog --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.sslkeylog 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls12-keylog.sslkeylog 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4 @@ +CLIENT_RANDOM 10b90b535c84a76d92d655789c6ae562c02448f6b1ad95eecf2b619a61cdff32 dbb3e0d1968e59f16259f5c86f10df10156d2002277984c19fd6ef187a98534d01df0cc617f6e4fe644bf45bb5c371e8 +CLIENT_RANDOM 10b90b535c84a76d92d655789c6ae562c02448f6b1ad95eecf2b619a61cdff32 dbb3e0d1968e59f16259f5c86f10df10156d2002277984c19fd6ef187a98534d01df0cc617f6e4fe644bf45bb5c371e8 +CLIENT_RANDOM 0b524527d36bef5e8537e8a728ddea96b3587c84329c0f1ff524f20589e08ee4 05aae5a9ea9cc56f61801189e867a00ca780e578389ba79a287da9e7c86198061fbed81b325b754091b7b96c37182ee9 +CLIENT_RANDOM 0b524527d36bef5e8537e8a728ddea96b3587c84329c0f1ff524f20589e08ee4 05aae5a9ea9cc56f61801189e867a00ca780e578389ba79a287da9e7c86198061fbed81b325b754091b7b96c37182ee9 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.out mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.out --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.out 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.out 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9 @@ +snifftest 5.6.3 +sniffer features: key_callback tls_v13 tls_v12 static_ephemeral sni extended_master rsa dh ecc rsa_static dh_static ssl_keylog_file + +SSL App Data(22:14):hello wolfssl! +SSL App Data(24:22):I hear you fa shizzle! +SSL App Data(50:14):hello wolfssl! +SSL App Data(51:22):I hear you fa shizzle! +SSL App Data(77:14):hello wolfssl! +SSL App Data(78:22):I hear you fa shizzle! Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.pcap and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.pcap differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.sslkeylog mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.sslkeylog --- mariadb-10.11.6/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.sslkeylog 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/scripts/sniffer-tls13-keylog.sslkeylog 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +CLIENT_HANDSHAKE_TRAFFIC_SECRET d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 d7e90625f07d9ca3c09862eb23badbcfeadee90341564f0e08ccb6dca4169fa0 +CLIENT_HANDSHAKE_TRAFFIC_SECRET d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 d7e90625f07d9ca3c09862eb23badbcfeadee90341564f0e08ccb6dca4169fa0 +SERVER_HANDSHAKE_TRAFFIC_SECRET d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 6887aa8833f3c6e9b4d211e62f105100f1ec30a0e66e8bec08349388bbb1ea14 +SERVER_HANDSHAKE_TRAFFIC_SECRET d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 6887aa8833f3c6e9b4d211e62f105100f1ec30a0e66e8bec08349388bbb1ea14 +CLIENT_TRAFFIC_SECRET_0 d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 45d90c7debf4fa6123f86a229a6beacc3e4f6ccfa2fa9144f8822a31d1cd6887 +SERVER_TRAFFIC_SECRET_0 d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 5341d729eb66e2f098adc7b7fbf38efddf58cfd3946cfa45d5e43923d6d8d6e7 +CLIENT_TRAFFIC_SECRET_0 d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 45d90c7debf4fa6123f86a229a6beacc3e4f6ccfa2fa9144f8822a31d1cd6887 +SERVER_TRAFFIC_SECRET_0 d99819b631844f268f7179381e8003976d100e553ff7d55c4c79919d09231009 5341d729eb66e2f098adc7b7fbf38efddf58cfd3946cfa45d5e43923d6d8d6e7 +CLIENT_HANDSHAKE_TRAFFIC_SECRET f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 363cd576478d733f04895c0aff54f9393d542485548f29be71e43ea89c7ebbc7c527735ca97500a9bcc975e78c9fb59e +SERVER_HANDSHAKE_TRAFFIC_SECRET f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 217e25b3934b5fcb9d7f78c26c2a4a3de048d3bf6defed80901971c69c9cf805a71a3b916e8c0d1bfc274b7e45231f00 +CLIENT_HANDSHAKE_TRAFFIC_SECRET f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 363cd576478d733f04895c0aff54f9393d542485548f29be71e43ea89c7ebbc7c527735ca97500a9bcc975e78c9fb59e +SERVER_HANDSHAKE_TRAFFIC_SECRET f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 217e25b3934b5fcb9d7f78c26c2a4a3de048d3bf6defed80901971c69c9cf805a71a3b916e8c0d1bfc274b7e45231f00 +CLIENT_TRAFFIC_SECRET_0 f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 246b412ade0a21f52fd763996e07e55a12927bf342f00f26eea660803d79d31c9ccfbaca010ea2bae970cca15050af3a +SERVER_TRAFFIC_SECRET_0 f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 19135dd5d1c271e50a7a1721a21258bfab412f2bd8d607397b09eca381785b77ec7e56b014c49776de76b6c9089a8ecc +CLIENT_TRAFFIC_SECRET_0 f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 246b412ade0a21f52fd763996e07e55a12927bf342f00f26eea660803d79d31c9ccfbaca010ea2bae970cca15050af3a +SERVER_TRAFFIC_SECRET_0 f894c097fd8487eb0814460a3cb087889dde2c9ffe1ecdbe38e61ceac549263f 19135dd5d1c271e50a7a1721a21258bfab412f2bd8d607397b09eca381785b77ec7e56b014c49776de76b6c9089a8ecc +CLIENT_HANDSHAKE_TRAFFIC_SECRET b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 8b105eb411a40a629cb1cfd3163066f9e31863b5a01226c16ecbf95274022b7c +SERVER_HANDSHAKE_TRAFFIC_SECRET b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 532d887bc52a937c6101278100eda09542affd953151e7484ef12ce653cc3afb +CLIENT_HANDSHAKE_TRAFFIC_SECRET b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 8b105eb411a40a629cb1cfd3163066f9e31863b5a01226c16ecbf95274022b7c +SERVER_HANDSHAKE_TRAFFIC_SECRET b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 532d887bc52a937c6101278100eda09542affd953151e7484ef12ce653cc3afb +CLIENT_TRAFFIC_SECRET_0 b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 76ebcabed6ecf6bc7cdcc65bb15dba6d530f204b13486e926bb81a139d267240 +SERVER_TRAFFIC_SECRET_0 b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 7371413fec66d8e960bb284295514716c14c7aa451fb63f9d17aaa0c0fa8daa2 +CLIENT_TRAFFIC_SECRET_0 b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 76ebcabed6ecf6bc7cdcc65bb15dba6d530f204b13486e926bb81a139d267240 +SERVER_TRAFFIC_SECRET_0 b72cb4fa8af218c7162d459673d577cc98110edf0460ce3d3d3366b40a4af5b0 7371413fec66d8e960bb284295514716c14c7aa451fb63f9d17aaa0c0fa8daa2 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/bio.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/bio.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/bio.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/bio.c 2024-08-03 07:30:00.000000000 +0000 @@ -50,7 +50,7 @@ */ static int wolfSSL_BIO_BASE64_read(WOLFSSL_BIO* bio, void* buf, int len) { - word32 frmtSz = len; + word32 frmtSz = (word32)len; WOLFSSL_ENTER("wolfSSL_BIO_BASE64_read"); @@ -70,16 +70,35 @@ */ static int wolfSSL_BIO_BIO_read(WOLFSSL_BIO* bio, void* buf, int len) { - int sz; + int sz1; + int sz2; char* pt; - sz = wolfSSL_BIO_nread(bio, &pt, len); + if (buf == NULL || len == 0) + return 0; - if (sz > 0) { - XMEMCPY(buf, pt, sz); + /* default no retry */ + bio->flags &= ~(WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY); + sz1 = wolfSSL_BIO_nread(bio, &pt, len); + if (sz1 > 0) { + XMEMCPY(buf, pt, sz1); + buf = (char*)buf + sz1; + len -= sz1; + if (len > 0) { + /* try again to see if maybe we wrapped around the ring buffer */ + sz2 = wolfSSL_BIO_nread(bio, &pt, len); + if (sz2 > 0) { + XMEMCPY(buf, pt, sz2); + sz1 += sz2; + } + } + } + if (sz1 == 0) { + bio->flags |= WOLFSSL_BIO_FLAG_READ|WOLFSSL_BIO_FLAG_RETRY; + sz1 = -1; } - return sz; + return sz1; } #ifndef WOLFSSL_BIO_RESIZE_THRESHOLD @@ -160,7 +179,7 @@ WOLFSSL_MSG("wolfSSL_BUF_MEM_resize error"); return WOLFSSL_BIO_ERROR; } - bio->mem_buf->length = bio->wrSz; + bio->mem_buf->length = (size_t)bio->wrSz; bio->ptr = bio->mem_buf->data; } } @@ -218,13 +237,13 @@ { if (wolfSSL_EVP_MD_CTX_type((WOLFSSL_EVP_MD_CTX*)bio->ptr) == NID_hmac) { if (wolfSSL_EVP_DigestSignUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf, - sz) != WOLFSSL_SUCCESS) + (unsigned int)sz) != WOLFSSL_SUCCESS) { return WOLFSSL_FATAL_ERROR; } } else { - if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf, sz) + if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, buf, (size_t)sz) != WOLFSSL_SUCCESS) { return WOLFSSL_FATAL_ERROR; } @@ -290,12 +309,12 @@ case WOLFSSL_BIO_FILE: #ifndef NO_FILESYSTEM if (bio->ptr) { - ret = (int)XFREAD(buf, 1, len, (XFILE)bio->ptr); + ret = (int)XFREAD(buf, 1, (size_t)len, (XFILE)bio->ptr); } else { - #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR) && \ + #if defined(XREAD) && !defined(NO_WOLFSSL_DIR) && \ !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2) - ret = (int)XREAD(bio->num, buf, len); + ret = (int)XREAD(bio->num, buf, (size_t)len); #else WOLFSSL_MSG("No file pointer and XREAD not enabled"); ret = NOT_COMPILED_IN; @@ -384,7 +403,7 @@ /* get the encoded length */ if (bio->flags & WOLFSSL_BIO_FLAG_BASE64_NO_NL) { if (Base64_Encode_NoNl((const byte*)data, inLen, NULL, - &sz) != LENGTH_ONLY_E) { + &sz) != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { WOLFSSL_MSG("Error with base64 get length"); return WOLFSSL_FATAL_ERROR; } @@ -433,7 +452,7 @@ (void)heap; - return inLen; + return (int)inLen; } #endif /* WOLFSSL_BASE64_ENCODE */ @@ -470,7 +489,6 @@ } #endif /* WOLFCRYPT_ONLY */ - /* Writes to a WOLFSSL_BIO_BIO type. * * returns the amount written on success @@ -478,27 +496,45 @@ static int wolfSSL_BIO_BIO_write(WOLFSSL_BIO* bio, const void* data, int len) { - int sz; + int sz1; + int sz2; char* buf; WOLFSSL_ENTER("wolfSSL_BIO_BIO_write"); /* adding in sanity checks for static analysis tools */ - if (bio == NULL || data == NULL) { - return BAD_FUNC_ARG; - } - - sz = wolfSSL_BIO_nwrite(bio, &buf, len); + if (bio == NULL || data == NULL || len == 0) + return 0; - /* test space for write */ - if (sz <= 0) { + /* default no retry */ + bio->flags &= ~(WOLFSSL_BIO_FLAG_WRITE|WOLFSSL_BIO_FLAG_RETRY); + sz1 = wolfSSL_BIO_nwrite(bio, &buf, len); + if (sz1 == 0) { + bio->flags |= WOLFSSL_BIO_FLAG_WRITE|WOLFSSL_BIO_FLAG_RETRY; WOLFSSL_MSG("No room left to write"); - return sz; + return WOLFSSL_BIO_ERROR; + } + if (sz1 < 0) { + WOLFSSL_MSG("Error in wolfSSL_BIO_nwrite"); + return sz1; } + XMEMCPY(buf, data, sz1); + data = (char*)data + sz1; + len -= sz1; - XMEMCPY(buf, data, sz); + if (len > 0) { + /* try again to see if maybe we wrapped around the ring buffer */ + sz2 = wolfSSL_BIO_nwrite(bio, &buf, len); + if (sz2 > 0) { + XMEMCPY(buf, data, sz2); + sz1 += sz2; + if (len > sz2) + bio->flags |= WOLFSSL_BIO_FLAG_WRITE|WOLFSSL_BIO_FLAG_RETRY; + } + } - return sz; + + return sz1; } @@ -564,12 +600,12 @@ if (wolfSSL_EVP_MD_CTX_type((WOLFSSL_EVP_MD_CTX*)bio->ptr) == NID_hmac) { if (wolfSSL_EVP_DigestSignUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, data, - len) != WOLFSSL_SUCCESS) { + (unsigned int)len) != WOLFSSL_SUCCESS) { ret = WOLFSSL_BIO_ERROR; } } else { - if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, data, len) + if (wolfSSL_EVP_DigestUpdate((WOLFSSL_EVP_MD_CTX*)bio->ptr, data, (size_t)len) != WOLFSSL_SUCCESS) { ret = WOLFSSL_BIO_ERROR; } @@ -625,7 +661,7 @@ if (ret > 0) { /* change so that data is formatted buffer */ data = frmt; - len = frmtSz; + len = (int)frmtSz; } #else WOLFSSL_MSG("WOLFSSL_BIO_BASE64 used without " @@ -643,12 +679,12 @@ case WOLFSSL_BIO_FILE: #ifndef NO_FILESYSTEM if (bio->ptr) { - ret = (int)XFWRITE(data, 1, len, (XFILE)bio->ptr); + ret = (int)XFWRITE(data, 1, (size_t)len, (XFILE)bio->ptr); } else { - #if !defined(USE_WINDOWS_API) && !defined(NO_WOLFSSL_DIR) && \ + #if defined(XWRITE) && !defined(NO_WOLFSSL_DIR) && \ !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2) - ret = (int)XWRITE(bio->num, data, len); + ret = (int)XWRITE(bio->num, data, (size_t)len); #else WOLFSSL_MSG("No file pointer and XWRITE not enabled"); ret = NOT_COMPILED_IN; @@ -907,7 +943,7 @@ char* c; int cSz; cSz = wolfSSL_BIO_nread0(bio, &c); - if (cSz == 0) { + if (cSz <= 0) { ret = 0; /* Nothing to read */ buf[0] = '\0'; break; @@ -945,7 +981,7 @@ ret = wolfSSL_EVP_DigestFinal((WOLFSSL_EVP_MD_CTX*)bio->ptr, (unsigned char*)buf, &szOut); if (ret == WOLFSSL_SUCCESS) { - ret = szOut; + ret = (int)szOut; } } break; @@ -1155,6 +1191,32 @@ return ret; } +#ifdef OPENSSL_ALL + int wolfSSL_BIO_set_mem_buf(WOLFSSL_BIO* bio, WOLFSSL_BUF_MEM* bufMem, + int closeFlag) + { + if (!bio || !bufMem || + (closeFlag != BIO_NOCLOSE && closeFlag != BIO_CLOSE)) + return BAD_FUNC_ARG; + + if (bio->mem_buf) + if (closeFlag == BIO_CLOSE) + wolfSSL_BUF_MEM_free(bio->mem_buf); + + bio->mem_buf = bufMem; + bio->shutdown = closeFlag; + + bio->wrSz = (int)bio->mem_buf->length; + bio->wrSzReset = bio->wrSz; + bio->num = (int)bio->mem_buf->max; + bio->ptr = bio->mem_buf->data; + bio->wrIdx = 0; + bio->rdIdx = 0; + + return WOLFSSL_SUCCESS; + } +#endif + WOLFSSL_API long wolfSSL_BIO_int_ctrl(WOLFSSL_BIO *bp, int cmd, long larg, int iarg) { (void) bp; @@ -1204,8 +1266,8 @@ bio->rdIdx = 0; if (bio->mem_buf != NULL) { bio->mem_buf->data = (char*)bio->ptr; - bio->mem_buf->length = bio->num; - bio->mem_buf->max = bio->num; + bio->mem_buf->length = (size_t)bio->num; + bio->mem_buf->max = (size_t)bio->num; } return WOLFSSL_SUCCESS; @@ -1271,7 +1333,7 @@ if (bio == NULL || buf == NULL) { WOLFSSL_MSG("NULL argument passed in"); - return 0; + return -2; } /* if paired read from pair */ @@ -1288,7 +1350,7 @@ } } - return 0; + return -2; } @@ -1317,7 +1379,7 @@ /* get amount able to read and set buffer pointer */ sz = wolfSSL_BIO_nread0(bio, buf); - if (sz == 0) { + if (sz < 0) { return WOLFSSL_BIO_ERROR; } @@ -1555,7 +1617,12 @@ XFCLOSE((XFILE)bio->ptr); } - bio->ptr = XFOPEN(name, "w"); + /* 'b' flag is ignored on POSIX targets, but on Windows it assures + * inhibition of LF<->CRLF rewriting, so that there is consistency + * between the size and contents of the representation in memory and on + * disk. + */ + bio->ptr = XFOPEN(name, "wb"); if (((XFILE)bio->ptr) == XBADFILE) { return WOLFSSL_FAILURE; } @@ -1937,10 +2004,10 @@ WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_md(void) { - static WOLFSSL_BIO_METHOD meth; + static WOLFSSL_BIO_METHOD meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_MD); WOLFSSL_ENTER("wolfSSL_BIO_f_md"); - meth.type = WOLFSSL_BIO_MD; return &meth; } @@ -1960,10 +2027,10 @@ WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_buffer(void) { - static WOLFSSL_BIO_METHOD meth; + static WOLFSSL_BIO_METHOD meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BUFFER); WOLFSSL_ENTER("wolfSSL_BIO_f_buffer"); - meth.type = WOLFSSL_BIO_BUFFER; return &meth; } @@ -1991,10 +2058,10 @@ WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_bio(void) { - static WOLFSSL_BIO_METHOD bio_meth; + static WOLFSSL_BIO_METHOD bio_meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BIO); WOLFSSL_ENTER("wolfSSL_BIO_s_bio"); - bio_meth.type = WOLFSSL_BIO_BIO; return &bio_meth; } @@ -2003,10 +2070,10 @@ #ifndef NO_FILESYSTEM WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_file(void) { - static WOLFSSL_BIO_METHOD file_meth; + static WOLFSSL_BIO_METHOD file_meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_FILE); WOLFSSL_ENTER("wolfSSL_BIO_s_file"); - file_meth.type = WOLFSSL_BIO_FILE; return &file_meth; } @@ -2015,10 +2082,10 @@ WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_ssl(void) { - static WOLFSSL_BIO_METHOD meth; + static WOLFSSL_BIO_METHOD meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_SSL); WOLFSSL_ENTER("wolfSSL_BIO_f_ssl"); - meth.type = WOLFSSL_BIO_SSL; return &meth; } @@ -2026,10 +2093,10 @@ WOLFSSL_BIO_METHOD *wolfSSL_BIO_s_socket(void) { - static WOLFSSL_BIO_METHOD meth; + static WOLFSSL_BIO_METHOD meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_SOCKET); WOLFSSL_ENTER("wolfSSL_BIO_s_socket"); - meth.type = WOLFSSL_BIO_SOCKET; return &meth; } @@ -2069,9 +2136,15 @@ bio->ip = (char*)XMALLOC((port - str) + 1, /* +1 for null char */ bio->heap, DYNAMIC_TYPE_OPENSSL); - XMEMCPY(bio->ip, str, port - str); - bio->ip[port - str] = '\0'; - bio->type = WOLFSSL_BIO_SOCKET; + if (bio->ip != NULL) { + XMEMCPY(bio->ip, str, port - str); + bio->ip[port - str] = '\0'; + bio->type = WOLFSSL_BIO_SOCKET; + } + else { + BIO_free(bio); + bio = NULL; + } } return bio; } @@ -2328,14 +2401,13 @@ return WOLFSSL_SUCCESS; } - WOLFSSL_BIO* wolfSSL_BIO_new_ssl_connect(WOLFSSL_CTX* ctx) + WOLFSSL_BIO* wolfSSL_BIO_new_ssl(WOLFSSL_CTX* ctx, int client) { WOLFSSL* ssl = NULL; WOLFSSL_BIO* sslBio = NULL; - WOLFSSL_BIO* connBio = NULL; int err = 0; - WOLFSSL_ENTER("wolfSSL_BIO_new_ssl_connect"); + WOLFSSL_ENTER("wolfSSL_BIO_new_ssl"); if (ctx == NULL) { WOLFSSL_MSG("ctx is NULL."); @@ -2356,11 +2428,46 @@ err = 1; } } + if (err == 0) { + if (!client) + wolfSSL_set_accept_state(ssl); + else + wolfSSL_set_connect_state(ssl); + } if (err == 0 && wolfSSL_BIO_set_ssl(sslBio, ssl, BIO_CLOSE) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("Failed to set SSL pointer in BIO."); err = 1; } + + if (err) { + wolfSSL_free(ssl); + wolfSSL_BIO_free(sslBio); + } + + return sslBio; + } + + WOLFSSL_BIO* wolfSSL_BIO_new_ssl_connect(WOLFSSL_CTX* ctx) + { + WOLFSSL_BIO* sslBio = NULL; + WOLFSSL_BIO* connBio = NULL; + int err = 0; + + WOLFSSL_ENTER("wolfSSL_BIO_new_ssl_connect"); + + if (ctx == NULL) { + WOLFSSL_MSG("ctx is NULL."); + err = 1; + } + + if (err == 0) { + sslBio = wolfSSL_BIO_new_ssl(ctx, 1); + if (sslBio == NULL) { + WOLFSSL_MSG("Failed to create SSL BIO."); + err = 1; + } + } if (err == 0) { connBio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket()); if (connBio == NULL) { @@ -2373,7 +2480,6 @@ } if (err == 1) { - wolfSSL_free(ssl); wolfSSL_BIO_free(sslBio); sslBio = NULL; wolfSSL_BIO_free(connBio); @@ -2545,7 +2651,7 @@ len = (int)XSTRLEN((const char*)buf) + 1; } - if (len > 0 && wolfSSL_BUF_MEM_resize(bio->mem_buf, len) == 0) { + if (len > 0 && wolfSSL_BUF_MEM_resize(bio->mem_buf, (size_t)len) == 0) { wolfSSL_BIO_free(bio); return NULL; } @@ -2738,10 +2844,10 @@ WOLFSSL_BIO_METHOD* wolfSSL_BIO_s_mem(void) { - static WOLFSSL_BIO_METHOD meth; + static WOLFSSL_BIO_METHOD meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_MEMORY); WOLFSSL_ENTER("wolfSSL_BIO_s_mem"); - meth.type = WOLFSSL_BIO_MEMORY; return &meth; } @@ -2749,10 +2855,10 @@ WOLFSSL_BIO_METHOD* wolfSSL_BIO_f_base64(void) { - static WOLFSSL_BIO_METHOD meth; + static WOLFSSL_BIO_METHOD meth = + WOLFSSL_BIO_METHOD_INIT(WOLFSSL_BIO_BASE64); WOLFSSL_ENTER("wolfSSL_BIO_f_base64"); - meth.type = WOLFSSL_BIO_BASE64; return &meth; } @@ -3211,6 +3317,26 @@ } return ret; +} + +int wolfSSL_BIO_should_read(WOLFSSL_BIO *bio) +{ + int ret = 0; + if (bio != NULL) { + ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_READ); + } + + return ret; +} + +int wolfSSL_BIO_should_write(WOLFSSL_BIO *bio) +{ + int ret = 0; + if (bio != NULL) { + ret = (int)(bio->flags & WOLFSSL_BIO_FLAG_WRITE); + } + + return ret; } #endif /* OPENSSL_ALL */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/conf.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/conf.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/conf.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/conf.c 2024-08-03 07:30:00.000000000 +0000 @@ -143,7 +143,7 @@ failed = 0; error: if (failed && ret) { - XFREE(ret, NULL, DYNAMIC_TYPE_OPENSSL); + wolfSSL_TXT_DB_free(ret); ret = NULL; } if (buf) { @@ -458,6 +458,7 @@ } if (wolfSSL_sk_CONF_VALUE_push(conf->data, value) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("wolfSSL_sk_CONF_VALUE_push error"); + wolfssl_sk_pop_type(sk, STACK_TYPE_CONF_VALUE); return WOLFSSL_FAILURE; } @@ -743,7 +744,7 @@ strIdx += 2; startIdx = strIdx; } - while (*strIdx && (XISALNUM((int)(*strIdx)) || *strIdx == '_')) + while (*strIdx && (XISALNUM((unsigned char)*strIdx) || *strIdx == '_')) strIdx++; endIdx = strIdx; if (startIdx == endIdx) { @@ -948,6 +949,7 @@ if (wolfSSL_CONF_add_string(conf, section, newVal) != WOLFSSL_SUCCESS) { + wolfSSL_X509V3_conf_free(newVal); WOLFSSL_MSG("wolfSSL_CONF_add_string error"); goto cleanup; } @@ -1597,4 +1599,33 @@ * END OF CONF API ******************************************************************************/ +#if defined(OPENSSL_EXTRA) +OPENSSL_INIT_SETTINGS* wolfSSL_OPENSSL_INIT_new(void) +{ + OPENSSL_INIT_SETTINGS* init = (OPENSSL_INIT_SETTINGS*)XMALLOC( + sizeof(OPENSSL_INIT_SETTINGS), NULL, DYNAMIC_TYPE_OPENSSL); + + return init; +} + +void wolfSSL_OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS* init) +{ + XFREE(init, NULL, DYNAMIC_TYPE_OPENSSL); +} + +#ifndef NO_WOLFSSL_STUB +int wolfSSL_OPENSSL_INIT_set_config_appname(OPENSSL_INIT_SETTINGS* init, + char* appname) +{ + (void)init; + (void)appname; + WOLFSSL_STUB("OPENSSL_INIT_set_config_appname"); + return WOLFSSL_SUCCESS; +} +#endif + +#endif /* OPENSSL_EXTRA */ + + + #endif /* WOLFSSL_CONF_INCLUDED */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/crl.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/crl.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/crl.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/crl.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,6 +28,9 @@ * CRL_MAX_REVOKED_CERTS: default: 4 * Specifies the number of buffers to hold RevokedCerts. * The default value is set to 4. + * CRL_REPORT_LOAD_ERRORS: default: off + * Return any errors encountered during loading CRL + * from a directory. */ #ifdef HAVE_CONFIG_H #include @@ -46,10 +49,11 @@ #endif #ifdef HAVE_CRL_MONITOR - #if (defined(__MACH__) || defined(__FreeBSD__) || defined(__linux__)) - static int StopMonitor(int mfd); + #if defined(__MACH__) || defined(__FreeBSD__) || defined(__linux__) || \ + defined(_MSC_VER) + static int StopMonitor(wolfSSL_CRL_mfd_t mfd); #else - #error "CRL monitor only currently supported on linux or mach" + #error "CRL monitor only currently supported on linux or mach or windows" #endif #endif /* HAVE_CRL_MONITOR */ @@ -65,21 +69,21 @@ crl->cm = cm; crl->crlList = NULL; crl->currentEntry = NULL; +#ifdef HAVE_CRL_MONITOR crl->monitors[0].path = NULL; crl->monitors[1].path = NULL; -#ifdef HAVE_CRL_MONITOR - crl->tid = 0; - crl->mfd = -1; /* mfd for bsd is kqueue fd, eventfd for linux */ - crl->setup = 0; /* thread setup done predicate */ - if (pthread_cond_init(&crl->cond, 0) != 0) { - WOLFSSL_MSG("Pthread condition init failed"); + crl->tid = INVALID_THREAD_VAL; + crl->mfd = WOLFSSL_CRL_MFD_INIT_VAL; + crl->setup = 0; /* thread setup done predicate */ + if (wolfSSL_CondInit(&crl->cond) != 0) { + WOLFSSL_MSG("thread condition init failed"); return BAD_COND_E; } #endif #ifdef HAVE_CRL_IO crl->crlIOCb = NULL; #endif - if (wc_InitMutex(&crl->crlLock) != 0) { + if (wc_InitRwLock(&crl->crlLock) != 0) { WOLFSSL_MSG("Init Mutex failed"); return BAD_MUTEX_E; } @@ -106,18 +110,18 @@ #if defined(OPENSSL_EXTRA) crle->lastDateAsn1.length = MAX_DATE_SIZE; XMEMCPY (crle->lastDateAsn1.data, crle->lastDate, - crle->lastDateAsn1.length); + (size_t)crle->lastDateAsn1.length); crle->lastDateAsn1.type = crle->lastDateFormat; crle->nextDateAsn1.length = MAX_DATE_SIZE; XMEMCPY (crle->nextDateAsn1.data, crle->nextDate, - crle->nextDateAsn1.length); + (size_t)crle->nextDateAsn1.length); crle->nextDateAsn1.type = crle->nextDateFormat; crle->issuer = NULL; wolfSSL_d2i_X509_NAME(&crle->issuer, (unsigned char**)&dcrl->issuer, dcrl->issuerSz); if (crle->issuer == NULL) { - return WOLFSSL_FAILURE; + return -1; } #endif #ifdef CRL_STATIC_REVOKED_LIST @@ -145,6 +149,23 @@ crle->toBeSigned = NULL; return -1; } + + #ifdef WC_RSA_PSS + crle->sigParamsSz = dcrl->sigParamsLength; + if (dcrl->sigParamsLength > 0) { + crle->sigParams = (byte*)XMALLOC(crle->sigParamsSz, heap, + DYNAMIC_TYPE_CRL_ENTRY); + if (crle->sigParams== NULL) { + XFREE(crle->toBeSigned, heap, DYNAMIC_TYPE_CRL_ENTRY); + crle->toBeSigned = NULL; + XFREE(crle->signature, heap, DYNAMIC_TYPE_CRL_ENTRY); + crle->signature = NULL; + return -1; + } + XMEMCPY(crle->sigParams, buff + dcrl->sigParamsIndex, + crle->sigParamsSz); + } + #endif XMEMCPY(crle->toBeSigned, buff + dcrl->certBegin, crle->tbsSz); XMEMCPY(crle->signature, dcrl->signature, crle->signatureSz); #ifndef NO_SKID @@ -164,9 +185,23 @@ return 0; } +static CRL_Entry* CRL_Entry_new(void* heap) +{ + CRL_Entry* crle = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), heap, + DYNAMIC_TYPE_CRL_ENTRY); + if (crle != NULL) { + XMEMSET(crle, 0, sizeof(CRL_Entry)); + if (wc_InitMutex(&crle->verifyMutex) != 0) { + XFREE(crle, heap, DYNAMIC_TYPE_CRL_ENTRY); + crle = NULL; + } + } + (void)heap; + return crle; +} /* Free all CRL Entry resources */ -static void FreeCRL_Entry(CRL_Entry* crle, void* heap) +static void CRL_Entry_free(CRL_Entry* crle, void* heap) { #ifdef CRL_STATIC_REVOKED_LIST if (crle != NULL) { @@ -188,64 +223,72 @@ XFREE(crle->signature, heap, DYNAMIC_TYPE_CRL_ENTRY); if (crle->toBeSigned != NULL) XFREE(crle->toBeSigned, heap, DYNAMIC_TYPE_CRL_ENTRY); +#ifdef WC_RSA_PSS + if (crle->sigParams != NULL) + XFREE(crle->sigParams, heap, DYNAMIC_TYPE_CRL_ENTRY); +#endif #if defined(OPENSSL_EXTRA) if (crle->issuer != NULL) { FreeX509Name(crle->issuer); XFREE(crle->issuer, heap, DYNAMIC_TYPE_X509); } #endif + wc_FreeMutex(&crle->verifyMutex); + XFREE(crle, heap, DYNAMIC_TYPE_CRL_ENTRY); (void)heap; } - /* Free all CRL resources */ void FreeCRL(WOLFSSL_CRL* crl, int dynamic) { - CRL_Entry* tmp = crl->crlList; + CRL_Entry* tmp; + if (crl == NULL) + return; + + tmp = crl->crlList; WOLFSSL_ENTER("FreeCRL"); +#ifdef HAVE_CRL_MONITOR if (crl->monitors[0].path) XFREE(crl->monitors[0].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR); if (crl->monitors[1].path) XFREE(crl->monitors[1].path, crl->heap, DYNAMIC_TYPE_CRL_MONITOR); +#endif XFREE(crl->currentEntry, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); crl->currentEntry = NULL; while(tmp) { CRL_Entry* next = tmp->next; - FreeCRL_Entry(tmp, crl->heap); - XFREE(tmp, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); + CRL_Entry_free(tmp, crl->heap); tmp = next; } #ifdef HAVE_CRL_MONITOR - if (crl->tid != 0) { + if (crl->tid != INVALID_THREAD_VAL) { WOLFSSL_MSG("stopping monitor thread"); if (StopMonitor(crl->mfd) == 0) { - int _pthread_ret = pthread_join(crl->tid, NULL); - if (_pthread_ret != 0) - WOLFSSL_MSG("stop monitor failed in pthread_join"); + if (wolfSSL_JoinThread(crl->tid) != 0) + WOLFSSL_MSG("stop monitor failed in wolfSSL_JoinThread"); } else { WOLFSSL_MSG("stop monitor failed"); } } - { - int _pthread_ret = pthread_cond_destroy(&crl->cond); - if (_pthread_ret != 0) - WOLFSSL_MSG("pthread_cond_destroy failed in FreeCRL"); - } + if (wolfSSL_CondFree(&crl->cond) != 0) + WOLFSSL_MSG("wolfSSL_CondFree failed in FreeCRL"); #endif - wc_FreeMutex(&crl->crlLock); + wc_FreeRwLock(&crl->crlLock); if (dynamic) /* free self */ XFREE(crl, crl->heap, DYNAMIC_TYPE_CRL); } -static int FindRevokedSerial(DecodedCert* cert, RevokedCert* rc, int totalCerts) +static int FindRevokedSerial(RevokedCert* rc, byte* serial, int serialSz, + byte* serialHash, int totalCerts) { int ret = 0; + byte hash[SIGNER_DIGEST_SIZE]; #ifdef CRL_STATIC_REVOKED_LIST /* do binary search */ int low, high, mid; @@ -256,11 +299,10 @@ while (low <= high) { mid = (low + high) / 2; - if (XMEMCMP(rc[mid].serialNumber, cert->serial, rc->serialSz) < 0) { + if (XMEMCMP(rc[mid].serialNumber, serial, rc->serialSz) < 0) { low = mid + 1; } - else if (XMEMCMP(rc[mid].serialNumber, cert->serial, - rc->serialSz) > 0) { + else if (XMEMCMP(rc[mid].serialNumber, serial, rc->serialSz) > 0) { high = mid - 1; } else { @@ -274,119 +316,104 @@ /* search in the linked list*/ while (rc) { - if (rc->serialSz == cert->serialSz && - XMEMCMP(rc->serialNumber, cert->serial, rc->serialSz) == 0) { - WOLFSSL_MSG("Cert revoked"); - ret = CRL_CERT_REVOKED; - break; + if (serialHash == NULL) { + if (rc->serialSz == serialSz && + XMEMCMP(rc->serialNumber, serial, (size_t)rc->serialSz) == 0) { + WOLFSSL_MSG("Cert revoked"); + ret = CRL_CERT_REVOKED; + break; + } + } + else { + ret = CalcHashId(rc->serialNumber, (word32)rc->serialSz, hash); + if (ret != 0) + break; + if (XMEMCMP(hash, serialHash, SIGNER_DIGEST_SIZE) == 0) { + WOLFSSL_MSG("Cert revoked"); + ret = CRL_CERT_REVOKED; + break; + } } rc = rc->next; } #endif return ret; } -static int CheckCertCRLList(WOLFSSL_CRL* crl, DecodedCert* cert, int *pFoundEntry) + +static int VerifyCRLE(const WOLFSSL_CRL* crl, CRL_Entry* crle) +{ + Signer* ca = NULL; + SignatureCtx sigCtx; + int ret = 0; + +#ifndef NO_SKID + if (crle->extAuthKeyIdSet) + ca = GetCA(crl->cm, crle->extAuthKeyId); + if (ca == NULL) + ca = GetCAByName(crl->cm, crle->issuerHash); +#else /* NO_SKID */ + ca = GetCA(crl->cm, crle->issuerHash); +#endif /* NO_SKID */ + if (ca == NULL) { + WOLFSSL_MSG("Did NOT find CRL issuer CA"); + return ASN_CRL_NO_SIGNER_E; + } + + ret = VerifyCRL_Signature(&sigCtx, crle->toBeSigned, crle->tbsSz, + crle->signature, crle->signatureSz, crle->signatureOID, + #ifdef WC_RSA_PSS + crle->sigParams, (int)crle->sigParamsSz, + #else + NULL, 0, + #endif + ca, crl->heap); + + if (ret == 0) { + crle->verified = 1; + } + else { + crle->verified = ret; + } + + return ret; +} + +static int CheckCertCRLList(WOLFSSL_CRL* crl, byte* issuerHash, byte* serial, + int serialSz, byte* serialHash, int *pFoundEntry) { CRL_Entry* crle; int foundEntry = 0; int ret = 0; - if (wc_LockMutex(&crl->crlLock) != 0) { - WOLFSSL_MSG("wc_LockMutex failed"); + if (wc_LockRwLock_Rd(&crl->crlLock) != 0) { + WOLFSSL_MSG("wc_LockRwLock_Rd failed"); return BAD_MUTEX_E; } - crle = crl->crlList; + for (crle = crl->crlList; crle != NULL; crle = crle->next) { + if (XMEMCMP(crle->issuerHash, issuerHash, CRL_DIGEST_SIZE) == 0) { + int nextDateValid = 1; - while (crle) { - if (XMEMCMP(crle->issuerHash, cert->issuerHash, CRL_DIGEST_SIZE) == 0) { WOLFSSL_MSG("Found CRL Entry on list"); if (crle->verified == 0) { - Signer* ca = NULL; - #ifndef NO_SKID - byte extAuthKeyId[KEYID_SIZE]; - #endif - byte issuerHash[CRL_DIGEST_SIZE]; - byte* tbs; - word32 tbsSz = crle->tbsSz; - byte* sig = NULL; - word32 sigSz = crle->signatureSz; - word32 sigOID = crle->signatureOID; - SignatureCtx sigCtx; - - tbs = (byte*)XMALLOC(tbsSz, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - if (tbs == NULL) { - wc_UnLockMutex(&crl->crlLock); - return MEMORY_E; - } - sig = (byte*)XMALLOC(sigSz, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - if (sig == NULL) { - XFREE(tbs, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - wc_UnLockMutex(&crl->crlLock); - return MEMORY_E; - } - - XMEMCPY(tbs, crle->toBeSigned, tbsSz); - XMEMCPY(sig, crle->signature, sigSz); - #ifndef NO_SKID - XMEMCPY(extAuthKeyId, crle->extAuthKeyId, - sizeof(extAuthKeyId)); - #endif - XMEMCPY(issuerHash, crle->issuerHash, sizeof(issuerHash)); - - wc_UnLockMutex(&crl->crlLock); - - #ifndef NO_SKID - if (crle->extAuthKeyIdSet) - ca = GetCA(crl->cm, extAuthKeyId); - if (ca == NULL) - ca = GetCAByName(crl->cm, issuerHash); - #else /* NO_SKID */ - ca = GetCA(crl->cm, issuerHash); - #endif /* NO_SKID */ - if (ca == NULL) { - XFREE(sig, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - XFREE(tbs, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - WOLFSSL_MSG("Did NOT find CRL issuer CA"); - return ASN_CRL_NO_SIGNER_E; + if (wc_LockMutex(&crle->verifyMutex) != 0) { + WOLFSSL_MSG("wc_LockMutex failed"); + break; } - ret = VerifyCRL_Signature(&sigCtx, tbs, tbsSz, sig, sigSz, - sigOID, ca, crl->heap); + /* A different thread may have verified the entry while we were + * waiting for the mutex. */ + if (crle->verified == 0) + ret = VerifyCRLE(crl, crle); - XFREE(sig, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - XFREE(tbs, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); + wc_UnLockMutex(&crle->verifyMutex); - if (wc_LockMutex(&crl->crlLock) != 0) { - WOLFSSL_MSG("wc_LockMutex failed"); - return BAD_MUTEX_E; - } - - crle = crl->crlList; - while (crle) { - if (XMEMCMP(crle->issuerHash, cert->issuerHash, - CRL_DIGEST_SIZE) == 0) { - - if (ret == 0) - crle->verified = 1; - else - crle->verified = ret; - - XFREE(crle->toBeSigned, crl->heap, - DYNAMIC_TYPE_CRL_ENTRY); - crle->toBeSigned = NULL; - XFREE(crle->signature, crl->heap, - DYNAMIC_TYPE_CRL_ENTRY); - crle->signature = NULL; - break; - } - crle = crle->next; - } - if (crle == NULL || crle->verified < 0) + if (ret != 0) break; } - else if (crle->verified < 0) { + + if (crle->verified < 0) { WOLFSSL_MSG("Cannot use CRL as it didn't verify"); ret = crle->verified; break; @@ -398,61 +425,70 @@ if (crle->nextDateFormat != ASN_OTHER_TYPE) #endif { - #ifndef NO_ASN_TIME + #if !defined(NO_ASN_TIME) && !defined(WOLFSSL_NO_CRL_DATE_CHECK) if (!XVALIDATE_DATE(crle->nextDate,crle->nextDateFormat, AFTER)) { WOLFSSL_MSG("CRL next date is no longer valid"); - ret = ASN_AFTER_DATE_E; + nextDateValid = 0; } #endif } - if (ret == 0) { + if (nextDateValid) { foundEntry = 1; + ret = FindRevokedSerial(crle->certs, serial, serialSz, + serialHash, crle->totalCerts); + if (ret != 0) + break; + } + else if (foundEntry == 0) { + ret = ASN_AFTER_DATE_E; } - break; } - crle = crle->next; } - if (foundEntry) { - ret = FindRevokedSerial(cert, crle->certs, crle->totalCerts); - } - - wc_UnLockMutex(&crl->crlLock); + wc_UnLockRwLock(&crl->crlLock); *pFoundEntry = foundEntry; return ret; } -/* Is the cert ok with CRL, return 0 on success */ -int CheckCertCRL(WOLFSSL_CRL* crl, DecodedCert* cert) +int CheckCertCRL_ex(WOLFSSL_CRL* crl, byte* issuerHash, byte* serial, + int serialSz, byte* serialHash, const byte* extCrlInfo, + int extCrlInfoSz, void* issuerName) { int foundEntry = 0; int ret = 0; WOLFSSL_ENTER("CheckCertCRL"); + (void)issuerName; + + if ((serial == NULL || serialSz == 0) && serialHash == NULL) { + WOLFSSL_MSG("Either serial or hash has to be provided"); + return BUFFER_ERROR; + } #ifdef WOLFSSL_CRL_ALLOW_MISSING_CDP /* Skip CRL verification in case no CDP in peer cert */ - if (!cert->extCrlInfo) { + if (!extCrlInfo) { return ret; } #endif - ret = CheckCertCRLList(crl, cert, &foundEntry); + ret = CheckCertCRLList(crl, issuerHash, serial, serialSz, serialHash, + &foundEntry); #ifdef HAVE_CRL_IO if (foundEntry == 0) { /* perform embedded lookup */ if (crl->crlIOCb) { - ret = crl->crlIOCb(crl, (const char*)cert->extCrlInfo, - cert->extCrlInfoSz); + ret = crl->crlIOCb(crl, (const char*)extCrlInfo, extCrlInfoSz); if (ret == WOLFSSL_CBIO_ERR_WANT_READ) { ret = OCSP_WANT_READ; } else if (ret >= 0) { /* try again */ - ret = CheckCertCRLList(crl, cert, &foundEntry); + ret = CheckCertCRLList(crl, issuerHash, serial, serialSz, + serialHash, &foundEntry); } } } @@ -460,38 +496,40 @@ #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \ - !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) + !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \ + !defined(NO_STDIO_FILESYSTEM) /* if not find entry in the CRL list, it looks at the folder that sets */ /* by LOOKUP_ctrl because user would want to use hash_dir. */ /* Loading .rN form CRL file if find at the folder, */ /* and try again checking Cert in the CRL list. */ /* When not set the folder or not use hash_dir, do nothing. */ - if ((foundEntry == 0) && (ret != OCSP_WANT_READ)) { - if (crl->cm->x509_store_p != NULL) { + if ((foundEntry == 0) && (ret != WC_NO_ERR_TRACE(OCSP_WANT_READ))) { + if (crl->cm != NULL && crl->cm->x509_store_p != NULL) { ret = LoadCertByIssuer(crl->cm->x509_store_p, - (WOLFSSL_X509_NAME*)cert->issuerName, X509_LU_CRL); + (WOLFSSL_X509_NAME*)issuerName, X509_LU_CRL); if (ret == WOLFSSL_SUCCESS) { /* try again */ - ret = CheckCertCRLList(crl, cert, &foundEntry); + ret = CheckCertCRLList(crl, issuerHash, serial, serialSz, + serialHash, &foundEntry); } } } #endif if (foundEntry == 0) { WOLFSSL_MSG("Couldn't find CRL for status check"); - if (ret != CRL_CERT_DATE_ERR) { + if (ret != WC_NO_ERR_TRACE(CRL_CERT_DATE_ERR)) { ret = CRL_MISSING; } - if (crl->cm->cbMissingCRL) { + if (crl->cm != NULL && crl->cm->cbMissingCRL) { char url[256]; WOLFSSL_MSG("Issuing missing CRL callback"); url[0] = '\0'; - if (cert->extCrlInfo) { - if (cert->extCrlInfoSz < (int)sizeof(url) -1 ) { - XMEMCPY(url, cert->extCrlInfo, cert->extCrlInfoSz); - url[cert->extCrlInfoSz] = '\0'; + if (extCrlInfo) { + if (extCrlInfoSz < (int)sizeof(url) -1 ) { + XMEMCPY(url, extCrlInfo, (size_t)extCrlInfoSz); + url[extCrlInfoSz] = '\0'; } else { WOLFSSL_MSG("CRL url too long"); @@ -505,6 +543,18 @@ return ret; } +/* Is the cert ok with CRL, return 0 on success */ +int CheckCertCRL(WOLFSSL_CRL* crl, DecodedCert* cert) +{ +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + void* issuerName = cert->issuerName; +#else + void* issuerName = NULL; +#endif + return CheckCertCRL_ex(crl, cert->issuerHash, cert->serial, cert->serialSz, + NULL, cert->extCrlInfo, cert->extCrlInfoSz, issuerName); +} + /* Add Decoded CRL, 0 on success */ static int AddCRL(WOLFSSL_CRL* crl, DecodedCRL* dcrl, const byte* buff, @@ -520,8 +570,7 @@ crle = crl->currentEntry; if (crle == NULL) { - crle = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), crl->heap, - DYNAMIC_TYPE_CRL_ENTRY); + crle = CRL_Entry_new(crl->heap); if (crle == NULL) { WOLFSSL_MSG("alloc CRL Entry failed"); return MEMORY_E; @@ -530,25 +579,19 @@ if (InitCRL_Entry(crle, dcrl, buff, verified, crl->heap) < 0) { WOLFSSL_MSG("Init CRL Entry failed"); - FreeCRL_Entry(crle, crl->heap); - if (crle != crl->currentEntry) { - XFREE(crle, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - } + CRL_Entry_free(crle, crl->heap); return -1; } - if (wc_LockMutex(&crl->crlLock) != 0) { - WOLFSSL_MSG("wc_LockMutex failed"); - FreeCRL_Entry(crle, crl->heap); - if (crle != crl->currentEntry) { - XFREE(crle, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); - } + if (wc_LockRwLock_Wr(&crl->crlLock) != 0) { + WOLFSSL_MSG("wc_LockRwLock_Wr failed"); + CRL_Entry_free(crle, crl->heap); return BAD_MUTEX_E; } crle->next = crl->crlList; crl->crlList = crle; - wc_UnLockMutex(&crl->crlLock); + wc_UnLockRwLock(&crl->crlLock); /* Avoid heap-use-after-free after crl->crlList is released */ crl->currentEntry = NULL; @@ -599,8 +642,7 @@ } #endif - crl->currentEntry = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), crl->heap, - DYNAMIC_TYPE_CRL_ENTRY); + crl->currentEntry = CRL_Entry_new(crl->heap); if (crl->currentEntry == NULL) { WOLFSSL_MSG("alloc CRL Entry failed"); #ifdef WOLFSSL_SMALL_STACK @@ -609,20 +651,22 @@ FreeDer(&der); return MEMORY_E; } - XMEMSET(crl->currentEntry, 0, sizeof(CRL_Entry)); InitDecodedCRL(dcrl, crl->heap); ret = ParseCRL(crl->currentEntry->certs, dcrl, myBuffer, (word32)sz, verify, crl->cm); - if (ret != 0 && !(ret == ASN_CRL_NO_SIGNER_E && verify == NO_VERIFY)) { + if (ret != 0 && !(ret == WC_NO_ERR_TRACE(ASN_CRL_NO_SIGNER_E) + && verify == NO_VERIFY)) { WOLFSSL_MSG("ParseCRL error"); - XFREE(crl->currentEntry, crl->heap, DYNAMIC_TYPE_CRL_ENTRY); + CRL_Entry_free(crl->currentEntry, crl->heap); crl->currentEntry = NULL; } else { - ret = AddCRL(crl, dcrl, myBuffer, ret != ASN_CRL_NO_SIGNER_E); + ret = AddCRL(crl, dcrl, myBuffer, + ret != WC_NO_ERR_TRACE(ASN_CRL_NO_SIGNER_E)); if (ret != 0) { WOLFSSL_MSG("AddCRL error"); + crl->currentEntry = NULL; } } @@ -643,8 +687,8 @@ { WOLFSSL_X509_CRL* ret; - ret = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), cm->heap, - DYNAMIC_TYPE_CRL); + ret = (WOLFSSL_X509_CRL*)XMALLOC(sizeof(WOLFSSL_X509_CRL), + cm != NULL ? cm->heap : NULL, DYNAMIC_TYPE_CRL); if (ret != NULL) { if (InitCRL(ret, cm) < 0) { WOLFSSL_MSG("Unable to initialize new CRL structure"); @@ -701,68 +745,52 @@ static CRL_Entry* DupCRL_Entry(const CRL_Entry* ent, void* heap) { CRL_Entry *dupl; + const size_t copyOffset = OFFSETOF(CRL_Entry, verifyMutex) + + sizeof(ent->verifyMutex); #ifdef CRL_STATIC_REVOKED_LIST if (ent->totalCerts > CRL_MAX_REVOKED_CERTS) { return NULL; } #endif - dupl = (CRL_Entry*)XMALLOC(sizeof(CRL_Entry), heap, DYNAMIC_TYPE_CRL_ENTRY); + dupl = CRL_Entry_new(heap); if (dupl == NULL) { WOLFSSL_MSG("alloc CRL Entry failed"); return NULL; } - XMEMSET(dupl, 0, sizeof(CRL_Entry)); - - XMEMCPY(dupl->issuerHash, ent->issuerHash, CRL_DIGEST_SIZE); - XMEMCPY(dupl->lastDate, ent->lastDate, MAX_DATE_SIZE); - XMEMCPY(dupl->nextDate, ent->nextDate, MAX_DATE_SIZE); - dupl->lastDateFormat = ent->lastDateFormat; - dupl->nextDateFormat = ent->nextDateFormat; -#if defined(OPENSSL_EXTRA) - dupl->lastDateAsn1.length = MAX_DATE_SIZE; - XMEMCPY (dupl->lastDateAsn1.data, dupl->lastDate, - dupl->lastDateAsn1.length); - dupl->lastDateAsn1.type = dupl->lastDateFormat; - dupl->nextDateAsn1.length = MAX_DATE_SIZE; - XMEMCPY (dupl->nextDateAsn1.data, dupl->nextDate, - dupl->nextDateAsn1.length); - dupl->nextDateAsn1.type = dupl->nextDateFormat; -#endif + XMEMCPY((byte*)dupl + copyOffset, (byte*)ent + copyOffset, + sizeof(CRL_Entry) - copyOffset); -#ifdef CRL_STATIC_REVOKED_LIST - XMEMCPY(dupl->certs, ent->certs, ent->totalCerts*sizeof(RevokedCert)); -#else +#ifndef CRL_STATIC_REVOKED_LIST dupl->certs = DupRevokedCertList(ent->certs, heap); #endif - dupl->totalCerts = ent->totalCerts; - dupl->verified = ent->verified; +#ifdef OPENSSL_EXTRA + dupl->issuer = wolfSSL_X509_NAME_dup(ent->issuer); +#endif if (!ent->verified) { - dupl->tbsSz = ent->tbsSz; - dupl->signatureSz = ent->signatureSz; - dupl->signatureOID = ent->signatureOID; dupl->toBeSigned = (byte*)XMALLOC(dupl->tbsSz, heap, DYNAMIC_TYPE_CRL_ENTRY); - if (dupl->toBeSigned == NULL) { - FreeCRL_Entry(dupl, heap); - XFREE(dupl, heap, DYNAMIC_TYPE_CRL_ENTRY); - return NULL; - } - dupl->signature = (byte*)XMALLOC(dupl->signatureSz, heap, DYNAMIC_TYPE_CRL_ENTRY); - if (dupl->signature == NULL) { - FreeCRL_Entry(dupl, heap); - XFREE(dupl, heap, DYNAMIC_TYPE_CRL_ENTRY); + #ifdef WC_RSA_PSS + dupl->sigParams = (byte*)XMALLOC(dupl->sigParamsSz, heap, + DYNAMIC_TYPE_CRL_ENTRY); + #endif + if (dupl->toBeSigned == NULL || dupl->signature == NULL + #ifdef WC_RSA_PSS + || dupl->sigParams == NULL + #endif + ) { + CRL_Entry_free(dupl, heap); return NULL; } XMEMCPY(dupl->toBeSigned, ent->toBeSigned, dupl->tbsSz); XMEMCPY(dupl->signature, ent->signature, dupl->signatureSz); - #ifndef NO_SKID - dupl->extAuthKeyIdSet = ent->extAuthKeyIdSet; - if (dupl->extAuthKeyIdSet) - XMEMCPY(dupl->extAuthKeyId, ent->extAuthKeyId, KEYID_SIZE); + #ifdef WC_RSA_PSS + if (dupl->sigParamsSz > 0) { + XMEMCPY(dupl->sigParams, ent->sigParams, dupl->sigParamsSz); + } #endif } else { @@ -770,6 +798,13 @@ dupl->tbsSz = 0; dupl->signature = NULL; dupl->signatureSz = 0; +#ifdef WC_RSA_PSS + dupl->sigParams = NULL; + dupl->sigParamsSz = 0; +#endif +#if !defined(NO_SKID) && !defined(NO_ASN) + dupl->extAuthKeyIdSet = 0; +#endif } return dupl; @@ -781,33 +816,26 @@ { CRL_Entry* current; CRL_Entry* head = NULL; - CRL_Entry* prev = NULL; + CRL_Entry** prev = &head; - current = crl; - while (current != NULL) { + for (current = crl; current != NULL; current = current->next) { CRL_Entry* tmp = DupCRL_Entry(current, heap); if (tmp != NULL) { - tmp->next = NULL; - if (head == NULL) - head = tmp; - if (prev != NULL) - prev->next = tmp; - prev = tmp; + *prev = tmp; + prev = &tmp->next; } else { WOLFSSL_MSG("Failed to allocate new CRL_Entry structure"); /* free up any existing list */ while (head != NULL) { - current = head; - head = head->next; - FreeCRL_Entry(current, heap); - XFREE(current, heap, DYNAMIC_TYPE_CRL_ENTRY); + CRL_Entry* next = head->next; + CRL_Entry_free(head, heap); + head = next; } - return NULL; } - current = current->next; } + return head; } @@ -821,8 +849,9 @@ return BAD_FUNC_ARG; } +#ifdef HAVE_CRL_MONITOR if (crl->monitors[0].path) { - int pathSz = (int)XSTRLEN(crl->monitors[0].path) + 1; + size_t pathSz = XSTRLEN(crl->monitors[0].path) + 1; dupl->monitors[0].path = (char*)XMALLOC(pathSz, dupl->heap, DYNAMIC_TYPE_CRL_MONITOR); if (dupl->monitors[0].path != NULL) { @@ -834,7 +863,7 @@ } if (crl->monitors[1].path) { - int pathSz = (int)XSTRLEN(crl->monitors[1].path) + 1; + size_t pathSz = XSTRLEN(crl->monitors[1].path) + 1; dupl->monitors[1].path = (char*)XMALLOC(pathSz, dupl->heap, DYNAMIC_TYPE_CRL_MONITOR); if (dupl->monitors[1].path != NULL) { @@ -848,6 +877,7 @@ return MEMORY_E; } } +#endif dupl->crlList = DupCRL_list(crl->crlList, dupl->heap); #ifdef HAVE_CRL_IO @@ -857,11 +887,25 @@ return 0; } +WOLFSSL_X509_CRL* wolfSSL_X509_CRL_dup(const WOLFSSL_X509_CRL* crl) +{ + WOLFSSL_X509_CRL* ret; + + WOLFSSL_ENTER("wolfSSL_X509_CRL_dup"); + + ret = wolfSSL_X509_crl_new(crl->cm); + if (ret != NULL && DupX509_CRL(ret, crl) != 0) { + FreeCRL(ret, 1); + ret = NULL; + } + return ret; +} + /* returns WOLFSSL_SUCCESS on success. Does not take ownership of newcrl */ int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *store, WOLFSSL_X509_CRL *newcrl) { - CRL_Entry *crle; WOLFSSL_X509_CRL *crl; + int ret = 0; WOLFSSL_ENTER("wolfSSL_X509_STORE_add_crl"); if (store == NULL || newcrl == NULL || store->cm == NULL) @@ -870,11 +914,17 @@ if (store->cm->crl == NULL) { crl = wolfSSL_X509_crl_new(store->cm); if (crl == NULL) { + WOLFSSL_MSG("wolfSSL_X509_crl_new failed"); return WOLFSSL_FAILURE; } - if (DupX509_CRL(crl, newcrl) != 0) { - if (crl != NULL) - FreeCRL(crl, 1); + if (wc_LockRwLock_Rd(&newcrl->crlLock) != 0) { + WOLFSSL_MSG("wc_LockRwLock_Rd failed"); + return BAD_MUTEX_E; + } + ret = DupX509_CRL(crl, newcrl); + wc_UnLockRwLock(&newcrl->crlLock); + if (ret != 0) { + FreeCRL(crl, 1); return WOLFSSL_FAILURE; } store->crl = store->cm->crl = crl; @@ -888,26 +938,29 @@ /* find tail of current list and add new list */ crl = store->cm->crl; - crle = crl->crlList; if (newcrl->crlList != NULL) { - CRL_Entry *tail = crle; + CRL_Entry **tail; CRL_Entry *toAdd; - if (wc_LockMutex(&crl->crlLock) != 0) - { - WOLFSSL_MSG("wc_LockMutex failed"); + if (wc_LockRwLock_Wr(&crl->crlLock) != 0) { + WOLFSSL_MSG("wc_LockRwLock_Wr failed"); return BAD_MUTEX_E; } - toAdd = DupCRL_list(newcrl->crlList, crl->heap); - if (tail == NULL) { - crl->crlList = toAdd; - } - else { - while (tail->next != NULL) tail = tail->next; - tail->next = toAdd; + if (crl != newcrl && wc_LockRwLock_Rd(&newcrl->crlLock) != 0) { + WOLFSSL_MSG("wc_LockRwLock_Wr failed"); + wc_UnLockRwLock(&crl->crlLock); + return BAD_MUTEX_E; } - wc_UnLockMutex(&crl->crlLock); + toAdd = DupCRL_list(newcrl->crlList, crl->heap); + if (crl != newcrl) + wc_UnLockRwLock(&newcrl->crlLock); + + tail = &crl->crlList; + while (*tail != NULL) + tail = &(*tail)->next; + *tail = toAdd; + wc_UnLockRwLock(&crl->crlLock); } if (wolfSSL_CertManagerEnableCRL(store->cm, WOLFSSL_CRL_CHECKALL) @@ -928,23 +981,20 @@ /* Signal Monitor thread is setup, save status to setup flag, 0 on success */ static int SignalSetup(WOLFSSL_CRL* crl, int status) { - int ret; + int ret, condRet; - /* signal to calling thread we're setup */ - if (wc_LockMutex(&crl->crlLock) != 0) { - WOLFSSL_MSG("wc_LockMutex crlLock failed"); - return BAD_MUTEX_E; - } - - crl->setup = status; - ret = pthread_cond_signal(&crl->cond); + ret = wolfSSL_CondStart(&crl->cond); + if (ret != 0) + return ret; - wc_UnLockMutex(&crl->crlLock); + crl->setup = status; + condRet = wolfSSL_CondSignal(&crl->cond); + ret = wolfSSL_CondEnd(&crl->cond); if (ret != 0) - return BAD_COND_E; + return ret; - return 0; + return condRet; } @@ -997,8 +1047,8 @@ } } - if (wc_LockMutex(&crl->crlLock) != 0) { - WOLFSSL_MSG("wc_LockMutex failed"); + if (wc_LockRwLock_Wr(&crl->crlLock) != 0) { + WOLFSSL_MSG("wc_LockRwLock_Wr failed"); FreeCRL(tmp, 0); #ifdef WOLFSSL_SMALL_STACK XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -1012,7 +1062,7 @@ tmp->crlList = crl->crlList; crl->crlList = newList; - wc_UnLockMutex(&crl->crlLock); + wc_UnLockRwLock(&crl->crlLock); FreeCRL(tmp, 0); @@ -1035,7 +1085,7 @@ #ifdef __MACH__ #define XEVENT_MODE O_EVTONLY #elif defined(__FreeBSD__) - #define XEVENT_MODE EVFILT_VNODE + #define XEVENT_MODE O_RDONLY #endif @@ -1047,7 +1097,7 @@ /* shutdown monitor thread, 0 on success */ -static int StopMonitor(int mfd) +static int StopMonitor(wolfSSL_CRL_mfd_t mfd) { struct kevent change; @@ -1063,7 +1113,7 @@ /* OS X monitoring */ -static void* DoMonitor(void* arg) +static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg) { int fPEM, fDER; struct kevent change; @@ -1114,11 +1164,11 @@ } if (fPEM != -1) - EV_SET(&change, fPEM, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_ONESHOT, + EV_SET(&change, fPEM, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB, 0, 0); if (fDER != -1) - EV_SET(&change, fDER, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_ONESHOT, + EV_SET(&change, fDER, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB, 0, 0); /* signal to calling thread we're setup */ @@ -1180,7 +1230,7 @@ /* shutdown monitor thread, 0 on success */ -static int StopMonitor(int mfd) +static int StopMonitor(wolfSSL_CRL_mfd_t mfd) { word64 w64 = 1; @@ -1195,7 +1245,7 @@ /* linux monitoring */ -static void* DoMonitor(void* arg) +static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg) { int notifyFd; int wd = -1; @@ -1247,18 +1297,9 @@ } } -#ifdef WOLFSSL_SMALL_STACK - buff = (char*)XMALLOC(8192, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (buff == NULL) - return NULL; -#endif /* signal to calling thread we're setup */ if (SignalSetup(crl, 1) != 0) { - #ifdef WOLFSSL_SMALL_STACK - XFREE(buff, NULL, DYNAMIC_TYPE_TMP_BUFFER); - #endif - if (wd > 0) { if (inotify_rm_watch(notifyFd, wd) < 0) WOLFSSL_MSG("inotify_rm_watch #1 failed in DoMonitor"); @@ -1268,6 +1309,12 @@ return NULL; } +#ifdef WOLFSSL_SMALL_STACK + buff = (char*)XMALLOC(8192, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (buff == NULL) + return NULL; +#endif + for (;;) { fd_set readfds; int result; @@ -1326,7 +1373,145 @@ return NULL; } -#endif /* MACH or linux */ +#elif defined(_MSC_VER) + +/* shutdown monitor thread, 0 on success */ +static int StopMonitor(wolfSSL_CRL_mfd_t mfd) +{ + if (SetEvent(mfd) == 0) { + WOLFSSL_MSG("SetEvent custom event trigger failed"); + return -1; + } + return 0; +} + +#ifdef DEBUG_WOLFSSL +#define SHOW_WINDOWS_ERROR() do { \ + LPVOID lpMsgBuf; \ + DWORD dw = GetLastError(); \ + FormatMessageA( \ + FORMAT_MESSAGE_ALLOCATE_BUFFER | \ + FORMAT_MESSAGE_FROM_SYSTEM | \ + FORMAT_MESSAGE_IGNORE_INSERTS, \ + NULL, \ + dw, \ + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), \ + (LPSTR) &lpMsgBuf, \ + 0, NULL ); \ + WOLFSSL_MSG_EX("DoMonitor failed with error %d: %s\n", \ + dw, lpMsgBuf); \ + LocalFree(lpMsgBuf); \ +} while(0) +#else +#define SHOW_WINDOWS_ERROR() WC_DO_NOTHING +#endif + +#define DM_ERROR() do { \ + SHOW_WINDOWS_ERROR(); \ + status = MONITOR_SETUP_E; \ + goto cleanup; \ +} while(0) + +/* windows monitoring + * Tested initially by hand by running + * .\server.exe -A certs/ca-cert.pem -i -x + * and connecting to with + * .\client.exe -C -c certs/server-cert.pem -k certs/server-key.pem + * This connection succeeds by default. By deleting all files from certs/crl + * except for crl.revoked we disallow the client to connect. Deleting files + * is done while the server is running to show that the monitor reacts to + * changes in the crl directory. */ +static THREAD_RETURN WOLFSSL_THREAD DoMonitor(void* arg) +{ + WOLFSSL_CRL* crl = (WOLFSSL_CRL*)arg; + int status = 0; + HANDLE handles[WOLFSSL_CRL_MONITORS_LEN + 1]; + DWORD handlesLen = 0; + int i; + + WOLFSSL_ENTER("DoMonitor"); + + handles[0] = crl->mfd = CreateEventA(NULL, FALSE, FALSE, NULL); + if (crl->mfd == NULL) { + WOLFSSL_MSG("CreateEventA failed"); + DM_ERROR(); + } + handlesLen++; + + for (i = 0; i < WOLFSSL_CRL_MONITORS_LEN; i++) { + if (crl->monitors[i].path) { + handles[handlesLen] = FindFirstChangeNotificationA( + crl->monitors[i].path, TRUE, + /* Watch for any changes that may affect what CRL's we load. + * This may trigger on the same file multiple times but this + * way we are certain that we have the most up to date and + * accurate set of CRL's. We don't expect this to trigger + * often enough for it to be a bottleneck. */ + FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | + FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | + FILE_NOTIFY_CHANGE_SECURITY); + if (handles[handlesLen] == INVALID_HANDLE_VALUE) { + WOLFSSL_MSG("FindFirstChangeNotificationA failed"); + DM_ERROR(); + } + handlesLen++; + } + } + + if (handlesLen == 1) { + WOLFSSL_MSG("Nothing to watch. Only custom event handle set."); + DM_ERROR(); + } + + if (SignalSetup(crl, 1) != 0) { + WOLFSSL_MSG("Call to SignalSetup failed"); + DM_ERROR(); + } + + for (;;) { + DWORD waitRet = WaitForMultipleObjects(handlesLen, handles, FALSE, + INFINITE); + WOLFSSL_MSG("Got notify event"); + + if (waitRet >= WAIT_OBJECT_0 && waitRet < WAIT_OBJECT_0 + handlesLen) { + if (waitRet == WAIT_OBJECT_0) { + WOLFSSL_MSG("got custom shutdown event, breaking out"); + break; + } + else if (SwapLists(crl) < 0) { + WOLFSSL_MSG("SwapLists problem, continue"); + } + } + else { + WOLFSSL_MSG("Unexpected WaitForMultipleObjects return. Continue."); + } + + for (i = 1; i < (int)handlesLen; i++) { + if (FindNextChangeNotification(handles[i]) == 0) { + WOLFSSL_MSG("FindNextChangeNotification failed"); + DM_ERROR(); + } + } + } + +cleanup: + if (status != 0) + SignalSetup(crl, status); + for (i = 0; i < (int)handlesLen; i++) { + BOOL closeRet; + if (i == 0) /* First handle is our custom event */ + closeRet = CloseHandle(handles[i]); + else + closeRet = FindCloseChangeNotification(handles[i]); + if (closeRet == 0) { + WOLFSSL_MSG("Failed to close handle"); + } + } + crl->mfd = INVALID_HANDLE_VALUE; + return 0; +} + +#endif /* MACH or linux or windows */ /* Start Monitoring the CRL path(s) in a thread */ @@ -1339,58 +1524,44 @@ if (crl == NULL) return BAD_FUNC_ARG; - if (crl->tid != 0) { + if (crl->tid != INVALID_THREAD_VAL) { WOLFSSL_MSG("Monitor thread already running"); return ret; /* that's ok, someone already started */ } - if (pthread_create(&crl->tid, NULL, DoMonitor, crl) != 0) { + if (wolfSSL_NewThread(&crl->tid, DoMonitor, crl) != 0) { WOLFSSL_MSG("Thread creation error"); return THREAD_CREATE_E; } /* wait for setup to complete */ - if (wc_LockMutex(&crl->crlLock) != 0) { - WOLFSSL_MSG("wc_LockMutex crlLock error"); + if (wolfSSL_CondStart(&crl->cond) != 0) { + WOLFSSL_MSG("wolfSSL_CondStart failed"); return BAD_MUTEX_E; } - - while (crl->setup == 0) { - if (pthread_cond_wait(&crl->cond, &crl->crlLock) != 0) { - ret = BAD_COND_E; - break; - } + while (crl->setup == 0) { + int condRet; + condRet = wolfSSL_CondWait(&crl->cond); + if (condRet != 0) { + ret = BAD_COND_E; + break; } - if (crl->setup < 0) - ret = crl->setup; /* store setup error */ - - wc_UnLockMutex(&crl->crlLock); + } + if (ret >= 0 && crl->setup < 0) + ret = crl->setup; /* store setup error */ if (ret < 0) { WOLFSSL_MSG("DoMonitor setup failure"); - crl->tid = 0; /* thread already done */ + crl->tid = INVALID_THREAD_VAL; /* thread already done */ + } + if (wolfSSL_CondEnd(&crl->cond) != 0) { + WOLFSSL_MSG("wolfSSL_CondEnd failed"); + return BAD_MUTEX_E; } return ret; } - -#else /* HAVE_CRL_MONITOR */ - -#if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) - -static int StartMonitorCRL(WOLFSSL_CRL* crl) -{ - (void)crl; - - WOLFSSL_ENTER("StartMonitorCRL"); - WOLFSSL_MSG("Not compiled in"); - - return NOT_COMPILED_IN; -} - -#endif /* !NO_FILESYSTEM && !NO_WOLFSSL_DIR */ - #endif /* HAVE_CRL_MONITOR */ #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) @@ -1436,28 +1607,41 @@ } } +#ifndef CRL_REPORT_LOAD_ERRORS if (!skip && ProcessFile(NULL, name, type, CRL_TYPE, NULL, 0, crl, VERIFY) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("CRL file load failed, continuing"); } +#else + if (!skip) { + ret = ProcessFile(NULL, name, type, CRL_TYPE, NULL, 0, crl, VERIFY); + if (ret != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("CRL file load failed"); + return ret; + } + } +#endif ret = wc_ReadDirNext(readCtx, path, &name); } wc_ReadDirClose(readCtx); - ret = WOLFSSL_SUCCESS; /* load failures not reported, for backwards compat */ + + /* load failures not reported, for backwards compat */ + ret = WOLFSSL_SUCCESS; #ifdef WOLFSSL_SMALL_STACK XFREE(readCtx, crl->heap, DYNAMIC_TYPE_TMP_BUFFER); #endif if (monitor & WOLFSSL_CRL_MONITOR) { +#ifdef HAVE_CRL_MONITOR word32 pathLen; char* pathBuf; WOLFSSL_MSG("monitor path requested"); pathLen = (word32)XSTRLEN(path); - pathBuf = (char*)XMALLOC(pathLen+1, crl->heap,DYNAMIC_TYPE_CRL_MONITOR); + pathBuf = (char*)XMALLOC(pathLen+1, crl->heap, DYNAMIC_TYPE_CRL_MONITOR); if (pathBuf) { XMEMCPY(pathBuf, path, pathLen+1); @@ -1488,6 +1672,10 @@ else { ret = MEMORY_E; } +#else + WOLFSSL_MSG("CRL monitoring requested but not compiled in"); + ret = NOT_COMPILED_IN; +#endif } return ret; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/dtls.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/dtls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/dtls.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/dtls.c 2024-08-03 07:30:00.000000000 +0000 @@ -21,11 +21,29 @@ /* * WOLFSSL_DTLS_NO_HVR_ON_RESUME + * WOLFSSL_DTLS13_NO_HRR_ON_RESUME * If defined, a DTLS server will not do a cookie exchange on successful * client resumption: the resumption will be faster (one RTT less) and - * will consume less bandwidth (one ClientHello and one HelloVerifyRequest - * less). On the other hand, if a valid SessionID is collected, forged - * clientHello messages will consume resources on the server. + * will consume less bandwidth (one ClientHello and one + * HelloVerifyRequest/HelloRetryRequest less). On the other hand, if a valid + * SessionID/ticket/psk is collected, forged clientHello messages will + * consume resources on the server. For DTLS 1.3, using this option also + * allows for the server to process Early Data/0-RTT Data. Without this, the + * Early Data would be dropped since the server doesn't enter stateful + * processing until receiving a verified ClientHello with the cookie. + * + * To allow DTLS 1.3 resumption without the cookie exchange: + * - Compile wolfSSL with WOLFSSL_DTLS13_NO_HRR_ON_RESUME defined + * - Call wolfSSL_dtls13_no_hrr_on_resume(ssl, 1) on the WOLFSSL object to + * disable the cookie exchange on resumption + * - Continue like with a normal connection + * WOLFSSL_DTLS_CH_FRAG + * Allow a server to process a fragmented second/verified (one containing a + * valid cookie response) ClientHello message. The first/unverified (one + * without a cookie extension) ClientHello MUST be unfragmented so that the + * DTLS server can process it statelessly. This is only implemented for + * DTLS 1.3. The user MUST call wolfSSL_dtls13_allow_ch_frag() on the server + * to explicitly enable this during runtime. */ #ifdef HAVE_CONFIG_H @@ -75,6 +93,7 @@ ssl->options.connectState = CONNECT_BEGIN; ssl->options.acceptState = ACCEPT_BEGIN; ssl->options.handShakeState = NULL_STATE; + ssl->options.seenUnifiedHdr = 0; ssl->msgsReceived.got_client_hello = 0; ssl->keys.dtls_handshake_number = 0; ssl->keys.dtls_expected_peer_handshake_number = 0; @@ -88,13 +107,14 @@ { /* Whitelist of errors not to ignore */ switch (err) { - case MEMORY_E: - case MEMORY_ERROR: - case ASYNC_INIT_E: - case ASYNC_OP_E: - case SOCKET_ERROR_E: - case WANT_READ: - case WANT_WRITE: + case WC_NO_ERR_TRACE(MEMORY_E): + case WC_NO_ERR_TRACE(MEMORY_ERROR): + case WC_NO_ERR_TRACE(ASYNC_INIT_E): + case WC_NO_ERR_TRACE(ASYNC_OP_E): + case WC_NO_ERR_TRACE(SOCKET_ERROR_E): + case WC_NO_ERR_TRACE(WANT_READ): + case WC_NO_ERR_TRACE(WANT_WRITE): + case WC_NO_ERR_TRACE(COOKIE_ERROR): return 0; default: return 1; @@ -167,14 +187,14 @@ byte dtls12cookieSet:1; } WolfSSL_CH; -static int ReadVector8(const byte* input, WolfSSL_ConstVector* v) +static word32 ReadVector8(const byte* input, WolfSSL_ConstVector* v) { v->size = *input; v->elements = input + OPAQUE8_LEN; return v->size + OPAQUE8_LEN; } -static int ReadVector16(const byte* input, WolfSSL_ConstVector* v) +static word32 ReadVector16(const byte* input, WolfSSL_ConstVector* v) { word16 size16; ato16(input, &size16); @@ -188,6 +208,13 @@ { int ret; Hmac cookieHmac; + + if (ssl->buffers.dtlsCookieSecret.buffer == NULL || + ssl->buffers.dtlsCookieSecret.length == 0) { + WOLFSSL_MSG("Missing DTLS 1.2 cookie secret"); + return COOKIE_ERROR; + } + ret = wc_HmacInit(&cookieHmac, ssl->heap, ssl->devId); if (ret == 0) { ret = wc_HmacSetKey(&cookieHmac, DTLS_COOKIE_TYPE, @@ -240,7 +267,7 @@ return BUFFER_E; ret = TlsCheckCookie(ssl, ch->cookieExt.elements + OPAQUE16_LEN, (word16)(ch->cookieExt.size - OPAQUE16_LEN)); - if (ret < 0 && ret != HRR_COOKIE_ERROR) + if (ret < 0 && ret != WC_NO_ERR_TRACE(HRR_COOKIE_ERROR)) return ret; *cookieGood = ret > 0; ret = 0; @@ -262,10 +289,13 @@ return ret; } -static int ParseClientHello(const byte* input, word32 helloSz, WolfSSL_CH* ch) +static int ParseClientHello(const byte* input, word32 helloSz, WolfSSL_CH* ch, + byte isFirstCHFrag) { word32 idx = 0; + (void)isFirstCHFrag; + /* protocol version, random and session id length check */ if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz) return BUFFER_ERROR; @@ -285,10 +315,24 @@ if (idx > helloSz - OPAQUE8_LEN) return BUFFER_ERROR; idx += ReadVector8(input + idx, &ch->compression); - if (idx > helloSz - OPAQUE16_LEN) - return BUFFER_ERROR; - idx += ReadVector16(input + idx, &ch->extension); - if (idx > helloSz) + if (idx < helloSz - OPAQUE16_LEN) { + /* Extensions are optional */ +#ifdef WOLFSSL_DTLS_CH_FRAG + word32 extStart = idx + OPAQUE16_LEN; +#endif + idx += ReadVector16(input + idx, &ch->extension); + if (idx > helloSz) { +#ifdef WOLFSSL_DTLS_CH_FRAG + idx = helloSz; + /* Allow incomplete extensions if we are parsing a fragment */ + if (isFirstCHFrag && extStart < helloSz) + ch->extension.size = helloSz - extStart; + else +#endif + return BUFFER_ERROR; + } + } + if (idx != helloSz) return BUFFER_ERROR; ch->length = idx; return 0; @@ -718,8 +762,8 @@ #ifdef HAVE_SUPPORTED_CURVES if (doKE) { byte searched = 0; - ret = TLSX_KeyShare_Choose(ssl, parsedExts, &cs.clientKSE, - &searched); + ret = TLSX_KeyShare_Choose(ssl, parsedExts, cs.cipherSuite0, + cs.cipherSuite, &cs.clientKSE, &searched); if (ret != 0) goto dtls13_cleanup; if (cs.clientKSE == NULL && searched) @@ -744,6 +788,15 @@ } } +#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME + if (ssl->options.dtls13NoHrrOnResume && usePSK && pskInfo.isValid && + !cs.doHelloRetry) { + /* Skip HRR on resumption */ + ((WOLFSSL*)ssl)->options.dtlsStateful = 1; + goto dtls13_cleanup; + } +#endif + #ifdef HAVE_SUPPORTED_CURVES if (cs.doHelloRetry) { ret = TLSX_KeyShare_SetSupported(ssl, &parsedExts); @@ -823,6 +876,7 @@ else #endif { +#if !defined(WOLFSSL_NO_TLS12) if (!ch->dtls12cookieSet) { ret = CreateDtls12Cookie(ssl, ch, ch->dtls12cookie); if (ret != 0) @@ -831,6 +885,11 @@ } ret = SendHelloVerifyRequest((WOLFSSL*)ssl, ch->dtls12cookie, DTLS_COOKIE_SZ); +#else + WOLFSSL_MSG("DTLS1.2 disabled with WOLFSSL_NO_TLS12"); + WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN); + ret = NOT_COMPILED_IN; +#endif } return ret; } @@ -856,17 +915,30 @@ return 0; } -int DoClientHelloStateless(WOLFSSL* ssl, const byte* input, - word32* inOutIdx, word32 helloSz) +int DoClientHelloStateless(WOLFSSL* ssl, const byte* input, word32 helloSz, + byte isFirstCHFrag, byte* tls13) { int ret; WolfSSL_CH ch; byte isTls13 = 0; + WOLFSSL_ENTER("DoClientHelloStateless"); + if (isFirstCHFrag) { +#ifdef WOLFSSL_DTLS_CH_FRAG + WOLFSSL_MSG("\tProcessing fragmented ClientHello"); +#else + WOLFSSL_MSG("\tProcessing fragmented ClientHello but " + "WOLFSSL_DTLS_CH_FRAG is not defined. This should not happen."); + return BAD_STATE_E; +#endif + } + if (tls13 != NULL) + *tls13 = 0; + XMEMSET(&ch, 0, sizeof(ch)); ssl->options.dtlsStateful = 0; - ret = ParseClientHello(input + *inOutIdx, helloSz, &ch); + ret = ParseClientHello(input, helloSz, &ch, isFirstCHFrag); if (ret != 0) return ret; @@ -875,6 +947,8 @@ ret = TlsCheckSupportedVersion(ssl, &ch, &isTls13); if (ret != 0) return ret; + if (tls13 != NULL) + *tls13 = isTls13; if (isTls13) { int tlsxFound; ret = FindExtByType(&ch.cookieExt, TLSX_COOKIE, ch.extension, @@ -890,7 +964,7 @@ return ret; #ifdef WOLFSSL_DTLS_NO_HVR_ON_RESUME - if (!isTls13) { + if (!isTls13 && !isFirstCHFrag) { int resume = FALSE; ret = TlsResumptionIsValid(ssl, &ch, &resume); if (ret != 0) @@ -903,7 +977,13 @@ #endif if (ch.cookie.size == 0 && ch.cookieExt.size == 0) { - ret = SendStatelessReply((WOLFSSL*)ssl, &ch, isTls13); +#ifdef WOLFSSL_DTLS_CH_FRAG + /* Don't send anything here when processing fragment */ + if (isFirstCHFrag) + ret = COOKIE_ERROR; + else +#endif + ret = SendStatelessReply(ssl, &ch, isTls13); } else { byte cookieGood; @@ -918,10 +998,33 @@ ret = INVALID_PARAMETER; else #endif - ret = SendStatelessReply((WOLFSSL*)ssl, &ch, isTls13); +#ifdef WOLFSSL_DTLS_CH_FRAG + /* Don't send anything here when processing fragment */ + if (isFirstCHFrag) + ret = COOKIE_ERROR; + else +#endif + ret = SendStatelessReply(ssl, &ch, isTls13); } - else + else { ssl->options.dtlsStateful = 1; + /* Update the window now that we enter the stateful parsing */ +#ifdef WOLFSSL_DTLS13 + if (isTls13) { + /* Set record numbers before current record number as read */ + Dtls13Epoch* e; + ret = Dtls13UpdateWindowRecordRecvd(ssl); + e = Dtls13GetEpoch(ssl, ssl->keys.curEpoch64); + if (e != NULL) + XMEMSET(e->window, 0xFF, sizeof(e->window)); + } + else +#endif + DtlsUpdateWindow(ssl); + /* Set record numbers before current record number as read */ + XMEMSET(ssl->keys.peerSeq->window, 0xFF, + sizeof(ssl->keys.peerSeq->window)); + } } return ret; @@ -1105,7 +1208,7 @@ /* CIDInfo needs to be accessed every time we send or receive a record. To * avoid the cost of the extension lookup save a pointer to the structure * inside the SSL object itself, and save a pointer to the SSL object in the - * extension. The extension freeing routine uses te pointer to the SSL + * extension. The extension freeing routine uses the pointer to the SSL * object to find the structure and to set ssl->dtlsCidInfo pointer to NULL * after freeing the structure. */ ssl->dtlsCidInfo = info; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/dtls13.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/dtls13.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/dtls13.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/dtls13.c 2024-08-03 07:30:00.000000000 +0000 @@ -262,6 +262,7 @@ return wc_AesEncryptDirect(c->aes, mask, ciphertext); #else wc_AesEncryptDirect(c->aes, mask, ciphertext); + return 0; #endif } #endif /* HAVE_AESGCM || HAVE_AESCCM */ @@ -277,10 +278,7 @@ /* assuming CIPHER[0..3] should be interpreted as little endian 32-bits integer. The draft rfc isn't really clear on that. See sec 4.2.3 of the draft. See also Section 2.3 of the Chacha RFC. */ - XMEMCPY(&counter, ciphertext, sizeof(counter)); -#ifdef BIG_ENDIAN - counter = ByteReverseWord32(counter); -#endif /* BIG_ENDIAN */ + ato32le(ciphertext, &counter); ret = wc_Chacha_SetIV(c->chacha, &ciphertext[4], counter); if (ret != 0) @@ -355,6 +353,7 @@ WOLFSSL_ENTER("Dtls13ProcessBufferedMessages"); while (msg != NULL) { + int downgraded = 0; idx = 0; /* message not in order */ @@ -365,16 +364,47 @@ if (!msg->ready) break; - ret = DoTls13HandShakeMsgType(ssl, msg->fullMsg, &idx, msg->type, - msg->sz, msg->sz); +#ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS + ret = MsgCheckEncryption(ssl, msg->type, msg->encrypted); + if (ret != 0) { + SendAlert(ssl, alert_fatal, unexpected_message); + break; + } +#endif + + /* We may have DTLS <=1.2 msgs stored from before we knew which version + * we were going to use. Interpret correctly. */ + if (IsAtLeastTLSv1_3(ssl->version)) { + ret = DoTls13HandShakeMsgType(ssl, msg->fullMsg, &idx, msg->type, + msg->sz, msg->sz); + if (!IsAtLeastTLSv1_3(ssl->version)) + downgraded = 1; + } + else { +#if !defined(WOLFSSL_NO_TLS12) + ret = DoHandShakeMsgType(ssl, msg->fullMsg, &idx, msg->type, + msg->sz, msg->sz); +#else + WOLFSSL_MSG("DTLS1.2 disabled with WOLFSSL_NO_TLS12"); + WOLFSSL_ERROR_VERBOSE(NOT_COMPILED_IN); + ret = NOT_COMPILED_IN; +#endif + } /* processing certificate_request triggers a connect. The error came * from there, the message can be considered processed successfully. * WANT_WRITE means that we are done with processing the msg and we are * waiting to flush the output buffer. */ if ((ret == 0 || ret == WANT_WRITE) || (msg->type == certificate_request && - ssl->options.handShakeDone && ret == WC_PENDING_E)) { - Dtls13MsgWasProcessed(ssl, (enum HandShakeType)msg->type); + ssl->options.handShakeDone && + ret == WC_NO_ERR_TRACE(WC_PENDING_E))) { + if (IsAtLeastTLSv1_3(ssl->version)) + Dtls13MsgWasProcessed(ssl, (enum HandShakeType)msg->type); + else if (downgraded) + /* DoHandShakeMsgType normally handles the hs number but if + * DoTls13HandShakeMsgType processed 1.2 msgs then this wasn't + * incremented. */ + ssl->keys.dtls_expected_peer_handshake_number++; ssl->dtls_rx_msg_list = msg->next; DtlsMsgDelete(msg, ssl->heap); @@ -628,7 +658,7 @@ *prevNext = r->next; } -static void Dtls13RtxFlushBuffered(WOLFSSL* ssl, byte keepNewSessionTicket) +void Dtls13RtxFlushBuffered(WOLFSSL* ssl, byte keepNewSessionTicket) { Dtls13RtxRecord *r, **prevNext; @@ -809,10 +839,16 @@ Dtls13MaybeSaveClientHello(ssl); /* In the handshake, receiving part of the next flight, acknowledge the - sent flight. The only exception is, on the server side, receiving the - last client flight does not ACK any sent new_session_ticket - messages. */ - Dtls13RtxFlushBuffered(ssl, 1); + * sent flight. */ + /* On the server side, receiving the last client flight does not ACK any + * sent new_session_ticket messages. */ + /* We don't want to clear the buffer until we have done version + * negotiation in the SH or have received a unified header in the + * DTLS record. */ + if (ssl->options.serverState >= SERVER_HELLO_COMPLETE || + ssl->options.seenUnifiedHdr) + /* Use 1.2 API to clear 1.2 buffers too */ + DtlsMsgPoolReset(ssl); } if (ssl->keys.dtls_peer_handshake_number < @@ -856,6 +892,8 @@ void Dtls13FreeFsmResources(WOLFSSL* ssl) { Dtls13RtxFlushAcks(ssl); + /* Use 1.2 API to clear 1.2 buffers too */ + DtlsMsgPoolReset(ssl); Dtls13RtxFlushBuffered(ssl, 0); } @@ -921,8 +959,10 @@ } ret = CheckAvailableSize(ssl, recordLength + MAX_MSG_EXTRA); - if (ret != 0) + if (ret != 0) { + Dtls13FreeFragmentsBuffer(ssl); return ret; + } output = GetOutputBuffer(ssl); @@ -1551,6 +1591,19 @@ return 0; } +static int Dtls13AcceptFragmented(WOLFSSL *ssl, enum HandShakeType type) +{ + if (IsEncryptionOn(ssl, 0)) + return 1; + if (ssl->options.side == WOLFSSL_CLIENT_END && type == server_hello) + return 1; +#ifdef WOLFSSL_DTLS_CH_FRAG + if (ssl->options.side == WOLFSSL_SERVER_END && type == client_hello && + ssl->options.dtls13ChFrag && ssl->options.dtlsStateful) + return 1; +#endif + return 0; +} /** * Dtls13HandshakeRecv() - process an handshake message. Deal with fragmentation if needed @@ -1579,6 +1632,13 @@ if (ret != 0) return PARSE_ERROR; + /* Need idx + fragLength as we don't advance the inputBuffer idx value */ + ret = EarlySanityCheckMsgReceived(ssl, handshakeType, idx + fragLength); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.acceptState < TLS13_ACCEPT_FIRST_REPLY_DONE) { if (handshakeType != client_hello) { @@ -1624,13 +1684,35 @@ isFirst = fragOff == 0; isComplete = isFirst && fragLength == messageLength; - if (!isComplete && !IsEncryptionOn(ssl, 0)) { + if (!isComplete && !Dtls13AcceptFragmented(ssl, handshakeType)) { +#ifdef WOLFSSL_DTLS_CH_FRAG + byte tls13 = 0; + /* check if the first CH fragment contains a valid cookie */ + if (ssl->options.dtls13ChFrag && !ssl->options.dtlsStateful && + isFirst && handshakeType == client_hello && + DoClientHelloStateless(ssl, input + idx, fragLength, 1, &tls13) + == 0 && tls13) { + /* We can save this message and continue as stateful. */ + if (ssl->chGoodCb != NULL) { + int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx); + if (cbret < 0) { + ssl->error = cbret; + WOLFSSL_MSG("ClientHello Good Cb don't continue error"); + return WOLFSSL_FATAL_ERROR; + } + } + WOLFSSL_MSG("ClientHello fragment verified"); + } + else +#endif + { #ifdef WOLFSSL_DEBUG_TLS - WOLFSSL_MSG("DTLS1.3 not accepting fragmented plaintext message"); + WOLFSSL_MSG("DTLS1.3 not accepting fragmented plaintext message"); #endif /* WOLFSSL_DEBUG_TLS */ - /* ignore the message */ - *processedSize = idx + fragLength + ssl->keys.padSz; - return 0; + /* ignore the message */ + *processedSize = idx + fragLength + ssl->keys.padSz; + return 0; + } } usingAsyncCrypto = ssl->devId != INVALID_DEVID; @@ -2347,7 +2429,11 @@ c16toa(msgSz, ackMessage); ackMessage += OPAQUE16_LEN; + WOLFSSL_MSG("write ack records"); + while (recordNumberList != NULL) { + WOLFSSL_MSG_EX("epoch %d seq %d", recordNumberList->epoch, + recordNumberList->seq); c64toa(&recordNumberList->epoch, ackMessage); ackMessage += OPAQUE64_LEN; c64toa(&recordNumberList->seq, ackMessage); @@ -2474,7 +2560,12 @@ { int ret = 0; - if (ssl->dtls13Rtx.seenRecords != NULL) { + /* We don't want to send acks until we have done version + * negotiation in the SH or have received a unified header in the + * DTLS record. */ + if (ssl->dtls13Rtx.seenRecords != NULL && + (ssl->options.serverState >= SERVER_HELLO_COMPLETE || + ssl->options.seenUnifiedHdr)) { ssl->dtls13Rtx.sendAcks = 0; /* reset fast timeout as we are sending ACKs */ ssl->dtls13FastTimeout = 0; @@ -2534,10 +2625,13 @@ if (length % (DTLS13_RN_SIZE) != 0) return PARSE_ERROR; + WOLFSSL_MSG("read ack records"); + ackMessage = input + OPAQUE16_LEN; for (i = 0; i < length; i += DTLS13_RN_SIZE) { ato64(ackMessage + i, &epoch); ato64(ackMessage + i + OPAQUE64_LEN, &seq); + WOLFSSL_MSG_EX("epoch %d seq %d", epoch, seq); Dtls13RtxRemoveRecord(ssl, epoch, seq); } @@ -2608,14 +2702,13 @@ if (ret != 0) return ret; - if (w64IsZero(ssl->dtls13EncryptEpoch->epochNumber)) { - - ret = Dtls13WriteAckMessage(ssl, ssl->dtls13Rtx.seenRecords, &length); - if (ret != 0) - return ret; + ret = Dtls13WriteAckMessage(ssl, ssl->dtls13Rtx.seenRecords, &length); + if (ret != 0) + return ret; - output = GetOutputBuffer(ssl); + output = GetOutputBuffer(ssl); + if (w64IsZero(ssl->dtls13EncryptEpoch->epochNumber)) { ret = Dtls13RlAddPlaintextHeader(ssl, output, ack, (word16)length); if (ret != 0) return ret; @@ -2623,13 +2716,6 @@ ssl->buffers.outputBuffer.length += length + DTLS_RECORD_HEADER_SZ; } else { - - ret = Dtls13WriteAckMessage(ssl, ssl->dtls13Rtx.seenRecords, &length); - if (ret != 0) - return ret; - - output = GetOutputBuffer(ssl); - outputSize = ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.idx - ssl->buffers.outputBuffer.length; @@ -2770,4 +2856,26 @@ } #endif +#ifdef WOLFSSL_DTLS_CH_FRAG +int wolfSSL_dtls13_allow_ch_frag(WOLFSSL *ssl, int enabled) +{ + if (ssl->options.side == WOLFSSL_CLIENT_END) { + return WOLFSSL_FAILURE; + } + ssl->options.dtls13ChFrag = !!enabled; + return WOLFSSL_SUCCESS; +} +#endif + +#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME +int wolfSSL_dtls13_no_hrr_on_resume(WOLFSSL *ssl, int enabled) +{ + if (ssl->options.side == WOLFSSL_CLIENT_END) { + return WOLFSSL_FAILURE; + } + ssl->options.dtls13NoHrrOnResume = !!enabled; + return WOLFSSL_SUCCESS; +} +#endif + #endif /* WOLFSSL_DTLS13 */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/src/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -3,8 +3,6 @@ # All paths should be given relative to the root FIPS_FILES = \ - ctaocrypt/src/fips.c \ - ctaocrypt/src/fips_test.c \ wolfcrypt/src/async.c \ wolfcrypt/src/fips.c \ wolfcrypt/src/fips_test.c \ @@ -21,7 +19,12 @@ EXTRA_DIST += src/pk.c EXTRA_DIST += src/ssl_asn1.c EXTRA_DIST += src/ssl_bn.c +EXTRA_DIST += src/ssl_certman.c +EXTRA_DIST += src/ssl_crypto.c +EXTRA_DIST += src/ssl_load.c EXTRA_DIST += src/ssl_misc.c +EXTRA_DIST += src/ssl_p7p12.c +EXTRA_DIST += src/ssl_sess.c EXTRA_DIST += src/x509.c EXTRA_DIST += src/x509_str.c @@ -32,63 +35,13 @@ lib_LTLIBRARIES+= src/libwolfssl@LIBSUFFIX@.la endif src_libwolfssl@LIBSUFFIX@_la_SOURCES = -src_libwolfssl@LIBSUFFIX@_la_LDFLAGS = ${AM_LDFLAGS} -no-undefined -version-info ${WOLFSSL_LIBRARY_VERSION} +src_libwolfssl@LIBSUFFIX@_la_LDFLAGS = ${AM_LDFLAGS} -no-undefined -version-number ${WOLFSSL_LIBRARY_VERSION} src_libwolfssl@LIBSUFFIX@_la_LIBADD = $(LIBM) $(LIB_ADD) $(LIB_STATIC_ADD) src_libwolfssl@LIBSUFFIX@_la_CFLAGS = -DBUILDING_WOLFSSL $(AM_CFLAGS) -DLIBWOLFSSL_GLOBAL_EXTRA_CFLAGS="\" $(EXTRA_CFLAGS)\"" src_libwolfssl@LIBSUFFIX@_la_CPPFLAGS = -DBUILDING_WOLFSSL $(AM_CPPFLAGS) -# install the packaged IPP libraries -if BUILD_FAST_RSA - -# Link needed IPP libraries -noinst_SCRIPTS+=IPP_links -IPP_links: - @$(IPPLINK) - -ippdir = $(libdir) -ipp_DATA = $(IPPLIBS) - -include_HEADERS+=$(IPPHEADERS) -endif # BUILD_FAST_RSA - if BUILD_FIPS -if BUILD_FIPS_V1 -# fips first file -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/wolfcrypt_first.c - -src_libwolfssl@LIBSUFFIX@_la_SOURCES += \ - ctaocrypt/src/hmac.c \ - ctaocrypt/src/random.c \ - ctaocrypt/src/sha256.c - -if BUILD_RSA -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/rsa.c -endif - -if BUILD_AES -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/aes.c -endif - -if BUILD_DES3 -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/des3.c -endif - -if BUILD_SHA -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/sha.c -endif - -if BUILD_SHA512 -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/sha512.c -endif - -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/fips.c -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/fips_test.c - -# fips last file -src_libwolfssl@LIBSUFFIX@_la_SOURCES += ctaocrypt/src/wolfcrypt_last.c -endif BUILD_FIPS_V1 - if BUILD_FIPS_V2 # FIPSv2 first file src_libwolfssl@LIBSUFFIX@_la_SOURCES += \ @@ -109,6 +62,9 @@ if BUILD_AES src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c +if BUILD_CUDA +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/cuda/aes-cuda.cu +endif BUILD_CUDA endif if BUILD_AESNI @@ -117,6 +73,7 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_xts_asm.S endif endif @@ -128,23 +85,29 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha.c endif +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256_asm.S endif +endif if BUILD_SHA512 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512_asm.S endif endif +endif if BUILD_SHA3 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S endif endif +endif if BUILD_DH src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/dh.c @@ -194,13 +157,31 @@ if BUILD_AES src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c +if BUILD_CUDA +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/cuda/aes-cuda.cu +endif BUILD_CUDA if BUILD_ARMASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c +endif BUILD_ARMASM +if BUILD_ARMASM_NEON if !BUILD_ARMASM_CRYPTO +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c +else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S -endif -endif -endif +endif !BUILD_ARMASM_INLINE +endif !BUILD_ARMASM_CRYPTO +else +if BUILD_ARMASM +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm.S +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM +endif !BUILD_ARMASM_NEON if BUILD_AESNI src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S @@ -208,29 +189,48 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_xts_asm.S endif endif +if BUILD_RISCV_ASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-aes.c +endif BUILD_RISCV_ASM +endif BUILD_AES + if BUILD_SHA src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha.c endif +if BUILD_ARMASM_NEON +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S +endif !BUILD_ARMASM_INLINE +else if BUILD_ARMASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S -endif +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm.S +endif !BUILD_ARMASM_INLINE else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256_asm.S -endif -endif +endif BUILD_INTELASM +endif !BUILD_X86_ASM +endif !BUILD_ARMASM +endif !BUILD_ARMASM_NEON if BUILD_SHA512 -if BUILD_ARMASM +if BUILD_ARMASM_NEON src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm_c.c @@ -238,24 +238,199 @@ else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S -endif +endif !BUILD_ARMASM_INLINE +else +if BUILD_ARMASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm.S +endif !BUILD_ARMASM_INLINE else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512_asm.S +endif BUILD_INTELASM +endif !BUILD_X86_ASM +endif !BUILD_ARMASM +endif !BUILD_ARMASM_NEON +endif BUILD_SHA512 + +if BUILD_SHA3 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3.c +if BUILD_ARMASM_NEON +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM_NEON +if BUILD_ARMASM +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm.S +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM +if !BUILD_X86_ASM +if BUILD_INTELASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S +endif +endif endif + +if BUILD_DH +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/dh.c endif + +if BUILD_CMAC +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/cmac.c endif +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fips.c \ + wolfcrypt/src/fips_test.c + +# fips last file +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wolfcrypt_last.c +endif BUILD_FIPS_V5 + +if BUILD_FIPS_V6 +# FIPS 140-3 SRTP-KDF first file +src_libwolfssl@LIBSUFFIX@_la_SOURCES += \ + wolfcrypt/src/wolfcrypt_first.c + +src_libwolfssl@LIBSUFFIX@_la_SOURCES += \ + wolfcrypt/src/hmac.c \ + wolfcrypt/src/random.c + +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/kdf.c + +if BUILD_RSA +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/rsa.c +endif + +if BUILD_ECC +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ecc.c +endif + +if BUILD_AES +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c +if BUILD_ARMASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c +endif BUILD_ARMASM +if BUILD_ARMASM_NEON +if !BUILD_ARMASM_CRYPTO +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S +endif !BUILD_ARMASM_INLINE +endif !BUILD_ARMASM_CRYPTO +else +if BUILD_ARMASM +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm.S +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM +endif !BUILD_ARMASM_NEON +endif BUILD_AES + +if BUILD_AESNI +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_asm.S +if BUILD_X86_ASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_xts_asm.S +endif +endif + +if BUILD_SHA +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha.c +endif + +if BUILD_ARMASM_NEON +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S +endif !BUILD_ARMASM_INLINE +else +if BUILD_ARMASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm.S +endif !BUILD_ARMASM_INLINE +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256.c +if BUILD_INTELASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256_asm.S +endif BUILD_INTELASM +endif !BUILD_ARMASM +endif !BUILD_ARMASM_NEON + +if BUILD_SHA512 +if BUILD_ARMASM_NEON +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S +endif !BUILD_ARMASM_INLINE +else +if BUILD_ARMASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm.S +endif !BUILD_ARMASM_INLINE +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +if BUILD_INTELASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512_asm.S +endif BUILD_INTELASM +endif !BUILD_ARMASM +endif !BUILD_ARMASM_NEON +endif BUILD_SHA512 + if BUILD_SHA3 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3.c -if BUILD_ARMASM +if BUILD_ARMASM_NEON if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm_c.c else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S -endif -endif +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM_NEON +if BUILD_ARMASM +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm.S +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S endif @@ -269,12 +444,85 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/cmac.c endif +if BUILD_CURVE448 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/curve448.c +endif + +if BUILD_ED448 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ed448.c +endif + +if BUILD_CURVE25519 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/curve25519.c +endif + +if BUILD_ED25519 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ed25519.c +endif + +if BUILD_ARMASM +if BUILD_ARMASM_NEON +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S +endif !BUILD_ARMASM_INLINE +else +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S +endif !BUILD_ARMASM_INLINE +endif !BUILD_ARMASM_NEON +endif BUILD_ARMASM + +if BUILD_PWDBASED +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/pwdbased.c +endif BUILD_PWDBASED + +if BUILD_SP +if BUILD_SP_C32 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_c32.c +endif +if BUILD_SP_C64 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_c64.c +endif + +if BUILD_SP_X86_64 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_x86_64.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_x86_64_asm.S +endif +if !BUILD_FIPS_V2 +if BUILD_SP_ARM32 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_arm32.c +endif +endif +if BUILD_SP_ARM_THUMB +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_armthumb.c +endif +if !BUILD_FIPS_V2 +if BUILD_SP_ARM64 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_arm64.c +endif +endif +if BUILD_SP_ARM_CORTEX +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_cortexm.c +endif +endif BUILD_SP + src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fips.c \ wolfcrypt/src/fips_test.c # fips last file src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wolfcrypt_last.c -endif BUILD_FIPS_V5 +endif BUILD_FIPS_V6 + endif BUILD_FIPS @@ -307,9 +555,11 @@ if !BUILD_FIPS_RAND if !BUILD_FIPS_V5 +if !BUILD_FIPS_V6 if BUILD_KDF src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/kdf.c endif +endif !BUILD_FIPS_V6 endif !BUILD_FIPS_V5 if !BUILD_FIPS_CURRENT @@ -320,18 +570,31 @@ if !BUILD_FIPS_CURRENT src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256.c +if BUILD_ARMASM_NEON +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S +endif !BUILD_ARMASM_INLINE +else if BUILD_ARMASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha256.c if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha256-asm.S -endif +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha256-asm.S +endif !BUILD_ARMASM_INLINE else +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha256_asm.S -endif -endif +endif BUILD_INTELASM +endif !BUILD_X86_ASM +endif !BUILD_ARMASM +endif !BUILD_ARMASM_NEON endif !BUILD_FIPS_CURRENT if BUILD_AFALG @@ -355,22 +618,17 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/async.c endif -if !BUILD_USER_RSA if BUILD_RSA -if BUILD_FAST_RSA -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/user-crypto/src/rsa.c -else if !BUILD_FIPS_CURRENT src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/rsa.c endif !BUILD_FIPS_CURRENT endif -endif -endif if BUILD_RC2 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/rc2.c endif +if !BUILD_FIPS_V6 if BUILD_SP if BUILD_SP_C32 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_c32.c @@ -400,6 +658,8 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_cortexm.c endif endif BUILD_SP +endif !BUILD_FIPS_V6 + if BUILD_SP_INT src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_int.c endif @@ -407,15 +667,41 @@ if !BUILD_FIPS_CURRENT if BUILD_AES src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes.c +if BUILD_CUDA +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/cuda/aes-cuda.cu +endif BUILD_CUDA if BUILD_ARMASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-aes.c +endif BUILD_ARMASM +if BUILD_ARMASM_NEON if !BUILD_ARMASM_CRYPTO +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm_c.c +else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm.S +endif !BUILD_ARMASM_INLINE endif !BUILD_ARMASM_CRYPTO +else +if BUILD_ARMASM +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-aes-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-aes-asm.S +endif !BUILD_ARMASM_INLINE endif BUILD_ARMASM +endif !BUILD_ARMASM_NEON + if BUILD_AFALG src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/af_alg/afalg_aes.c -endif +endif BUILD_AFALG + +if BUILD_RISCV_ASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/riscv/riscv-64-aes.c +endif BUILD_RISCV_ASM endif BUILD_AES endif !BUILD_FIPS_CURRENT @@ -439,7 +725,7 @@ if !BUILD_FIPS_CURRENT if BUILD_SHA512 -if BUILD_ARMASM +if BUILD_ARMASM_NEON src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm_c.c @@ -447,30 +733,106 @@ else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512-asm.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S -endif +endif !BUILD_ARMASM_INLINE +else +if BUILD_ARMASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha512.c +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha512-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha512-asm.S +endif !BUILD_ARMASM_INLINE else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha512_asm.S -endif -endif -endif +endif BUILD_INTELASM +endif !BUILD_X86_ASM +endif !BUILD_ARMASM +endif !BUILD_ARMASM_NEON +endif BUILD_SHA512 endif !BUILD_FIPS_CURRENT if !BUILD_FIPS_CURRENT if BUILD_SHA3 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3.c -if BUILD_ARMASM +if BUILD_ARMASM_NEON if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm_c.c else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-sha3-asm.S +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM_NEON +if BUILD_ARMASM +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-sha3-asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-sha3-asm.S +endif !BUILD_ARMASM_INLINE +endif BUILD_ARMASM +if !BUILD_X86_ASM +if BUILD_INTELASM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S +endif +endif +endif +endif !BUILD_FIPS_CURRENT + +if !BUILD_FIPS_CURRENT +if BUILD_SM2 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sm2.c +if BUILD_SP +if BUILD_SP_C32 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_c32.c +endif +if BUILD_SP_C64 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_c64.c +endif + +if BUILD_SP_X86_64 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_x86_64.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_x86_64_asm.S +endif +if !BUILD_FIPS_V2 +if BUILD_SP_ARM32 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_arm32.c +endif +endif +if BUILD_SP_ARM_THUMB +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_armthumb.c endif +if !BUILD_FIPS_V2 +if BUILD_SP_ARM64 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_arm64.c endif +endif +if BUILD_SP_ARM_CORTEX +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sp_sm2_cortexm.c +endif +endif BUILD_SP +endif BUILD_SM2 +endif !BUILD_FIPS_CURRENT + +if !BUILD_FIPS_CURRENT +if BUILD_SM3 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sm3.c +if !BUILD_X86_ASM if BUILD_INTELASM -src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sha3_asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sm3_asm.S endif endif +endif BUILD_SM3 +endif !BUILD_FIPS_CURRENT + +if !BUILD_FIPS_CURRENT +if BUILD_SM4 +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sm4.c +endif BUILD_SM4 endif !BUILD_FIPS_CURRENT endif !BUILD_FIPS_RAND @@ -528,10 +890,12 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-poly1305.c endif src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/poly1305.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/poly1305_asm.S endif endif +endif if BUILD_RC4 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/arc4.c @@ -545,10 +909,15 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/md5.c endif +if !BUILD_FIPS_V6 if BUILD_PWDBASED src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/pwdbased.c +endif BUILD_PWDBASED +endif !BUILD_FIPS_V6 + +if BUILD_PKCS12 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/pkcs12.c -endif +endif BUILD_PKCS12 if BUILD_DSA src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/dsa.c @@ -561,6 +930,7 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_x86_asm.S else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_gcm_asm.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/aes_xts_asm.S endif endif endif @@ -585,14 +955,16 @@ endif if BUILD_CHACHA -if BUILD_ARMASM +if BUILD_ARMASM_NEON src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-chacha.c else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/chacha.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/chacha_asm.S endif endif +endif if BUILD_POLY1305 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/chacha20_poly1305.c endif @@ -627,12 +999,29 @@ if BUILD_WC_KYBER src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_kyber.c src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_kyber_poly.c +if !BUILD_X86_ASM if BUILD_INTELASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_kyber_asm.S endif endif endif +endif +if BUILD_DILITHIUM +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/dilithium.c +endif + +if BUILD_WC_LMS +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_lms.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_lms_impl.c +endif + +if BUILD_WC_XMSS +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_xmss.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/wc_xmss_impl.c +endif + +if !BUILD_FIPS_V6 if BUILD_CURVE25519 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/curve25519.c endif @@ -640,28 +1029,45 @@ if BUILD_ED25519 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ed25519.c endif +endif !BUILD_FIPS_V6 if BUILD_FEMATH if BUILD_CURVE25519_SMALL src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_low_mem.c else -if BUILD_INTELASM +if BUILD_CURVE25519_INTELASM +if !BUILD_X86_ASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_x25519_asm.S +endif !BUILD_X86_ASM else if BUILD_ARMASM +if !BUILD_FIPS_V6 +if BUILD_ARMASM_NEON if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519_c.c src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519.S src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S -endif +endif !BUILD_ARMASM_INLINE +else +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-32-curve25519.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S +endif !BUILD_ARMASM_INLINE +endif !BUILD_ARMASM_NEON +endif !BUILD_FIPS_V6 else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_operations.c -endif -endif -endif -endif +endif !BUILD_ARMASM +endif !BUILD_CURVE25519_INTELASM +endif !BUILD_CURVE25519_SMALL +endif BUILD_FEMATH if BUILD_GEMATH if BUILD_ED25519_SMALL @@ -669,23 +1075,38 @@ else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ge_operations.c if !BUILD_FEMATH -if BUILD_INTELASM +if BUILD_CURVE25519_INTELASM +if !BUILD_X86_ASM src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_x25519_asm.S +endif !BUILD_X86_ASM else +if !BUILD_FIPS_V6 if BUILD_ARMASM +if BUILD_ARMASM_NEON if BUILD_ARMASM_INLINE src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S -endif +endif !BUILD_ARMASM_INLINE +else +if BUILD_ARMASM_INLINE +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519_c.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519_c.c +else +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/thumb2-curve25519.S +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/arm/armv8-curve25519.S +endif !BUILD_ARMASM_INLINE +endif !BUILD_ARMASM_NEON else src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_operations.c -endif -endif -endif -endif -endif +endif !BUILD_ARMASM +endif !BUILD_FIPS_V6 +endif !BUILD_CURVE25519_INTELASM +endif !BUILD_FEMATH +endif !BUILD_ED25519_SMALL +endif BUILD_GEMATH +if !BUILD_FIPS_V6 if BUILD_CURVE448 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/curve448.c endif @@ -693,6 +1114,7 @@ if BUILD_ED448 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ed448.c endif +endif !BUILD_FIPS_V6 if BUILD_FE448 src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/fe_448.c @@ -710,6 +1132,15 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/dilithium.c src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/sphincs.c src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ext_kyber.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/liboqs/liboqs.c +endif + +if BUILD_LIBLMS +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ext_lms.c +endif + +if BUILD_LIBXMSS +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/ext_xmss.c endif if BUILD_LIBZ @@ -767,5 +1198,14 @@ endif !BUILD_CRYPTONLY +if BUILD_XILINX +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/xilinx/xil-aesgcm.c +endif endif !BUILD_FIPS_RAND + +if BUILD_ARIA +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/aria/aria-crypt.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/aria/aria-cryptocb.c +endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/internal.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/internal.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/internal.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/internal.c 2024-08-03 07:30:00.000000000 +0000 @@ -89,6 +89,9 @@ * - WOLFSSL_HARDEN_TLS_NO_SCR_CHECK * - WOLFSSL_HARDEN_TLS_NO_PKEY_CHECK * - WOLFSSL_HARDEN_TLS_ALLOW_ALL_CIPHERSUITES + * WOLFSSL_NO_INIT_CTX_KEY + * Allows SSL objects to be created from a CTX without a loaded key/cert + * pair */ @@ -125,6 +128,11 @@ #include #endif +#ifdef HAVE_ARIA + /* included to get ARIA devId value */ + #include +#endif + #if defined(DEBUG_WOLFSSL) || defined(SHOW_SECRETS) || \ defined(CHACHA_AEAD_TEST) || defined(WOLFSSL_SESSION_EXPORT_DEBUG) #ifndef NO_STDIO_FILESYSTEM @@ -141,7 +149,7 @@ #endif -#define ERROR_OUT(err, eLabel) { ret = (err); goto eLabel; } +#define ERROR_OUT(err, eLabel) { ret = (int)(err); goto eLabel; } #ifdef _MSC_VER /* disable for while(0) cases at the .c level for now */ @@ -185,8 +193,13 @@ #endif /* !WOLFSSL_NO_TLS12 */ -#ifndef NO_WOLFSSL_SERVER - #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) +#if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SESSION_TICKET) + #if defined(WOLFSSL_HAPROXY) + #define SSL_TICKET_CTX(ssl) ssl->initial_ctx->ticketEncCtx + #else + #define SSL_TICKET_CTX(ssl) ssl->ctx->ticketEncCtx + #endif + #if !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) static int TicketEncCbCtx_Init(WOLFSSL_CTX* ctx, TicketEncCbCtx* keyCtx); static void TicketEncCbCtx_Free(TicketEncCbCtx* keyCtx); @@ -202,9 +215,16 @@ #ifdef WOLFSSL_DTLS static int _DtlsCheckWindow(WOLFSSL* ssl); - static int _DtlsUpdateWindow(WOLFSSL* ssl); #endif +#if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) +#include +#include +#include +static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs, + int totalCerts); +#endif /* #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */ + #ifdef WOLFSSL_DTLS13 #ifndef WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT #define WOLFSSL_DTLS13_SEND_MOREACK_DEFAULT 0 @@ -246,7 +266,50 @@ #endif /* !WOLFSSL_NO_TLS12 */ -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) +#if !defined(NO_CERT) && defined(WOLFSSL_BLIND_PRIVATE_KEY) +int wolfssl_priv_der_blind(WC_RNG* rng, DerBuffer* key, DerBuffer** mask) +{ + int ret = 0; + WC_RNG local_rng; + + if (key != NULL) { + if (*mask != NULL) { + FreeDer(mask); + } + ret = AllocDer(mask, key->length, key->type, key->heap); + if ((ret == 0) && (rng == NULL)) { + if (wc_InitRng(&local_rng) != 0) { + ret = RNG_FAILURE_E; + } + else { + rng = &local_rng; + } + } + if (ret == 0) { + ret = wc_RNG_GenerateBlock(rng, (*mask)->buffer, (*mask)->length); + } + if (ret == 0) { + xorbuf(key->buffer, (*mask)->buffer, (*mask)->length); + } + + if (rng == &local_rng) { + wc_FreeRng(rng); + } + } + + return ret; +} + +void wolfssl_priv_der_unblind(DerBuffer* key, DerBuffer* mask) +{ + if (key != NULL) { + xorbuf(key->buffer, mask->buffer, mask->length); + } +} +#endif + + +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) #include #endif @@ -259,6 +322,7 @@ const unsigned char* secret, int secretSz, void* ctx); #endif + /* Label string for client random. */ #define SSC_CR "CLIENT_RANDOM" @@ -496,6 +560,22 @@ { if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor >=TLSv1_MINOR) return 1; +#ifdef WOLFSSL_DTLS + if (ssl->version.major == DTLS_MAJOR) + return 1; +#endif + + return 0; +} + +int IsTLS_ex(const ProtocolVersion pv) +{ + if (pv.major == SSLv3_MAJOR && pv.minor >=TLSv1_MINOR) + return 1; +#ifdef WOLFSSL_DTLS + if (pv.major == DTLS_MAJOR) + return 1; +#endif return 0; } @@ -526,7 +606,7 @@ return ret; } -int IsEncryptionOn(WOLFSSL* ssl, int isSend) +int IsEncryptionOn(const WOLFSSL* ssl, int isSend) { #ifdef WOLFSSL_DTLS /* For DTLS, epoch 0 is always not encrypted. */ @@ -1233,7 +1313,7 @@ exp[idx++] = 0; #endif #ifdef HAVE_ANON - exp[idx++] = options->haveAnon; + exp[idx++] = options->useAnon; #else exp[idx++] = 0; #endif @@ -1284,6 +1364,14 @@ #endif } + if (ver > WOLFSSL_EXPORT_VERSION_4) { +#ifdef WOLFSSL_DTLS + exp[idx++] = options->dtlsStateful; +#else + exp[idx++] = 0; +#endif + } + /* version of connection */ exp[idx++] = ssl->version.major; exp[idx++] = ssl->version.minor; @@ -1299,6 +1387,13 @@ } break; + case WOLFSSL_EXPORT_VERSION_4: + if (idx != DTLS_EXPORT_OPT_SZ_4 && type == WOLFSSL_EXPORT_DTLS) { + WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export"); + return DTLS_EXPORT_VER_E; + } + break; + case WOLFSSL_EXPORT_VERSION: if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) { WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export"); @@ -1334,6 +1429,13 @@ } break; + case WOLFSSL_EXPORT_VERSION_4: + if (len < DTLS_EXPORT_OPT_SZ_4) { + WOLFSSL_MSG("Sanity check on buffer size failed"); + return BAD_FUNC_ARG; + } + break; + case WOLFSSL_EXPORT_VERSION_3: if (len < DTLS_EXPORT_OPT_SZ_3) { WOLFSSL_MSG("Sanity check on buffer size failed"); @@ -1416,7 +1518,7 @@ idx++; #endif #ifdef HAVE_ANON - options->haveAnon = exp[idx++]; /* User wants to allow Anon suites */ + options->useAnon = exp[idx++]; /* User wants to allow Anon suites */ #else idx++; #endif @@ -1467,6 +1569,17 @@ #endif } + /* If we had a connection established, let's assume that we can act + * statefully */ + options->dtlsStateful = 1; + if (ver > WOLFSSL_EXPORT_VERSION_4) { +#ifdef WOLFSSL_DTLS + options->dtlsStateful = exp[idx++]; +#else + idx++; +#endif + } + /* version of connection */ if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) { WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2"); @@ -1535,7 +1648,8 @@ word16 port; char ip[MAX_EXPORT_IP]; - if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) { + if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_4 && + ver != WOLFSSL_EXPORT_VERSION_3) { WOLFSSL_MSG("Export version not supported"); return BAD_FUNC_ARG; } @@ -1793,6 +1907,15 @@ } break; + case WOLFSSL_EXPORT_VERSION_4: + if (type == WOLFSSL_EXPORT_DTLS) { + optSz = DTLS_EXPORT_OPT_SZ_4; + } + else { + optSz = TLS_EXPORT_OPT_SZ; + } + break; + case WOLFSSL_EXPORT_VERSION_3: WOLFSSL_MSG("Importing older version 3"); optSz = DTLS_EXPORT_OPT_SZ_3; @@ -1913,7 +2036,7 @@ /* set hmac function to use when verifying */ if (ret == 0 && (ssl->options.tls == 1 || ssl->options.tls1_1 == 1 || ssl->options.dtls == 1)) { - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) ssl->hmac = TLS_hmac; #else @@ -2044,7 +2167,7 @@ } } - if (ret != 0 && ret != LENGTH_ONLY_E && buf != NULL) { + if (ret != 0 && ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E) && buf != NULL) { /*in a fail case clear the buffer which could contain partial key info*/ XMEMSET(buf, 0, *sz); } @@ -2105,7 +2228,6 @@ ssl->options.haveECC = 1; /* server turns on with ECC key cert */ } #endif -#ifdef HAVE_PQC #ifdef HAVE_FALCON if (ssl->options.side == WOLFSSL_CLIENT_END) { ssl->options.haveFalconSig = 1; /* always on client side */ @@ -2116,7 +2238,6 @@ ssl->options.haveDilithiumSig = 1; /* always on client side */ } #endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ #if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT) if (ssl->options.side == WOLFSSL_CLIENT_END) { @@ -2154,7 +2275,12 @@ XMEMSET(ctx, 0, sizeof(WOLFSSL_CTX)); ctx->method = method; - ctx->heap = ctx; /* defaults to self */ + if (heap == NULL) { + ctx->heap = ctx; /* defaults to self */ + } + else { + ctx->heap = heap; /* wolfSSL_CTX_load_static_memory sets */ + } ctx->timeout = WOLFSSL_SESSION_TIMEOUT; #ifdef WOLFSSL_DTLS @@ -2182,6 +2308,9 @@ #ifndef NO_CERTS ctx->privateKeyDevId = INVALID_DEVID; +#ifdef WOLFSSL_DUAL_ALG_CERTS + ctx->altPrivateKeyDevId = INVALID_DEVID; +#endif #endif #ifndef NO_DH @@ -2195,14 +2324,12 @@ ctx->minEccKeySz = MIN_ECCKEY_SZ; ctx->eccTempKeySz = ECDHE_SIZE; #endif -#ifdef HAVE_PQC #ifdef HAVE_FALCON ctx->minFalconKeySz = MIN_FALCONKEY_SZ; #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM ctx->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ; #endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ ctx->verifyDepth = MAX_CHAIN_DEPTH; #ifdef OPENSSL_EXTRA ctx->cbioFlag = WOLFSSL_CBIO_NONE; @@ -2261,7 +2388,11 @@ #endif /* MICRIUM */ #endif /* WOLFSSL_USER_IO */ -#ifdef HAVE_PQC +#if defined(HAVE_RPK) + wolfSSL_CTX_set_client_cert_type(ctx, NULL, 0); /* set to default */ + wolfSSL_CTX_set_server_cert_type(ctx, NULL, 0); /* set to default */ +#endif /* HAVE_RPK */ + #ifdef HAVE_FALCON if (method->side == WOLFSSL_CLIENT_END) ctx->haveFalconSig = 1; /* always on client side */ @@ -2272,7 +2403,6 @@ ctx->haveDilithiumSig = 1; /* always on client side */ /* server can turn on by loading key */ #endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ #ifdef HAVE_ECC if (method->side == WOLFSSL_CLIENT_END) { ctx->haveECDSAsig = 1; /* always on client side */ @@ -2289,6 +2419,8 @@ #ifdef WOLFSSL_QNX_CAAM /* default to try using CAAM when built */ ctx->devId = WOLFSSL_CAAM_DEVID; +#elif defined(HAVE_ARIA) && defined(WOLF_CRYPTO_CB) + ctx->devId = WOLFSSL_ARIA_DEVID; #else ctx->devId = INVALID_DEVID; #endif @@ -2322,22 +2454,27 @@ return MEMORY_E; } XMEMSET(ctx->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM)); + /* WOLFSSL_X509_LOOKUP */ - if ((ctx->x509_store.lookup.dirs = - (WOLFSSL_BY_DIR*)XMALLOC(sizeof(WOLFSSL_BY_DIR), - heap, DYNAMIC_TYPE_OPENSSL)) == NULL) { - WOLFSSL_MSG("ctx-x509_store.lookup.dir memory allocation error"); - XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL); - ctx->param = NULL; + if ((ctx->x509_store.lookup.dirs = (WOLFSSL_BY_DIR*)XMALLOC( + sizeof(WOLFSSL_BY_DIR), + heap, DYNAMIC_TYPE_OPENSSL)) == NULL) { + WOLFSSL_MSG("ctx->x509_store.lookup.dirs: allocation error"); return MEMORY_E; } XMEMSET(ctx->x509_store.lookup.dirs, 0, sizeof(WOLFSSL_BY_DIR)); + + /* param */ + if ((ctx->x509_store.param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC( + sizeof(WOLFSSL_X509_VERIFY_PARAM), + heap, DYNAMIC_TYPE_OPENSSL)) == NULL) { + WOLFSSL_MSG("ctx->x509_store.param: allocation error"); + return MEMORY_E; + } + XMEMSET(ctx->x509_store.param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM)); + if (wc_InitMutex(&ctx->x509_store.lookup.dirs->lock) != 0) { WOLFSSL_MSG("Bad mutex init"); - XFREE(ctx->param, heap, DYNAMIC_TYPE_OPENSSL); - ctx->param = NULL; - XFREE(ctx->x509_store.lookup.dirs, heap, DYNAMIC_TYPE_OPENSSL); - ctx->x509_store.lookup.dirs = NULL; WOLFSSL_ERROR_VERBOSE(BAD_MUTEX_E); return BAD_MUTEX_E; } @@ -2402,6 +2539,11 @@ maxq10xx_SetupPkCallbacks(ctx, &method->version); #endif /* WOLFSSL_MAXQ10XX_TLS */ +#if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) + /* Should only be set when wolfSSL_CTX_load_system_CA_certs() is called */ + ctx->doAppleNativeCertValidationFlag = 0; +#endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */ + return ret; } @@ -2504,6 +2646,18 @@ ForceZero(ctx->privateKey->buffer, ctx->privateKey->length); } FreeDer(&ctx->privateKey); +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ctx->privateKeyMask); +#endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ctx->altPrivateKey != NULL && ctx->altPrivateKey->buffer != NULL) { + ForceZero(ctx->altPrivateKey->buffer, ctx->altPrivateKey->length); + } + FreeDer(&ctx->altPrivateKey); +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ctx->altPrivateKeyMask); +#endif +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #ifdef OPENSSL_ALL wolfSSL_EVP_PKEY_free(ctx->privateKeyPKey); #endif @@ -2528,8 +2682,8 @@ wolfSSL_X509_STORE_free(ctx->x509_store_pt); #endif #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY) - wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL); - ctx->ca_names = NULL; + wolfSSL_sk_X509_NAME_pop_free(ctx->client_ca_names, NULL); + ctx->client_ca_names = NULL; #endif #ifdef OPENSSL_EXTRA if (ctx->x509Chain) { @@ -2574,6 +2728,11 @@ ctx->param = NULL; } + if (ctx->x509_store.param) { + XFREE(ctx->x509_store.param, heapAtCTXInit, DYNAMIC_TYPE_OPENSSL); + ctx->x509_store.param = NULL; + } + if (ctx->x509_store.lookup.dirs) { #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) if (ctx->x509_store.lookup.dirs->dir_entry) { @@ -2645,7 +2804,7 @@ if (ret < 0) { /* check error state, if mutex error code then mutex init failed but * CTX was still malloc'd */ - if (ctx->err == CTX_INIT_MUTEX_E) { + if (ctx->err == WC_NO_ERR_TRACE(CTX_INIT_MUTEX_E)) { SSL_CtxResourceFree(ctx); XFREE(ctx, heap, DYNAMIC_TYPE_CTX); #ifdef WOLFSSL_STATIC_MEMORY @@ -2694,6 +2853,10 @@ ssl->encrypt.aes = NULL; ssl->decrypt.aes = NULL; #endif +#ifdef HAVE_ARIA + ssl->encrypt.aria = NULL; + ssl->decrypt.aria = NULL; +#endif #ifdef HAVE_CAMELLIA ssl->encrypt.cam = NULL; ssl->decrypt.cam = NULL; @@ -2737,22 +2900,33 @@ XFREE(ssl->encrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER); XFREE(ssl->decrypt.des3, ssl->heap, DYNAMIC_TYPE_CIPHER); #endif -#if defined(BUILD_AES) || defined(BUILD_AESGCM) /* See: InitKeys() in keys.c - * on addition of BUILD_AESGCM - * check (enc->aes, dec->aes) */ +#if defined(BUILD_AES) || defined(BUILD_AESGCM) || defined(HAVE_ARIA) + /* See: InitKeys() in keys.c on addition of BUILD_AESGCM check (enc->aes, dec->aes) */ wc_AesFree(ssl->encrypt.aes); wc_AesFree(ssl->decrypt.aes); - #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \ - !defined(WOLFSSL_NO_TLS12) - XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER); - XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_AES_BUFFER); - #endif XFREE(ssl->encrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER); XFREE(ssl->decrypt.aes, ssl->heap, DYNAMIC_TYPE_CIPHER); #endif +#if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + wc_Sm4Free(ssl->encrypt.sm4); + wc_Sm4Free(ssl->decrypt.sm4); + XFREE(ssl->encrypt.sm4, ssl->heap, DYNAMIC_TYPE_CIPHER); + XFREE(ssl->decrypt.sm4, ssl->heap, DYNAMIC_TYPE_CIPHER); +#endif +#if (defined(BUILD_AESGCM) || defined(BUILD_AESCCM) || defined(HAVE_ARIA)) && \ + !defined(WOLFSSL_NO_TLS12) + XFREE(ssl->decrypt.additional, ssl->heap, DYNAMIC_TYPE_CIPHER); + XFREE(ssl->encrypt.additional, ssl->heap, DYNAMIC_TYPE_CIPHER); +#endif #ifdef CIPHER_NONCE - XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER); - XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_AES_BUFFER); + XFREE(ssl->decrypt.nonce, ssl->heap, DYNAMIC_TYPE_CIPHER); + XFREE(ssl->encrypt.nonce, ssl->heap, DYNAMIC_TYPE_CIPHER); +#endif +#ifdef HAVE_ARIA + wc_AriaFreeCrypt(ssl->encrypt.aria); + wc_AriaFreeCrypt(ssl->decrypt.aria); + XFREE(ssl->encrypt.aria, ssl->heap, DYNAMIC_TYPE_CIPHER); + XFREE(ssl->decrypt.aria, ssl->heap, DYNAMIC_TYPE_CIPHER); #endif #ifdef HAVE_CAMELLIA XFREE(ssl->encrypt.cam, ssl->heap, DYNAMIC_TYPE_CIPHER); @@ -2835,12 +3009,16 @@ case sha512_mac: return WC_SHA512_DIGEST_SIZE; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + return WC_SM3_DIGEST_SIZE; + #endif default: break; } return NOT_COMPILED_IN; } -#endif /* USE_ECDSA_KEYSZ_HASH_ALGO */ +#endif /* USE_ECDSA_KEYSZ_HASH_ALGO || (WOLFSSL_TLS13 && HAVE_ECC) */ #define ADD_HASH_SIG_ALGO(out, inOutIdx, major, minor) \ do { \ @@ -2869,6 +3047,13 @@ #endif /* USE_ECDSA_KEYSZ_HASH_ALGO */ if (addSigAlgo) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (sigAlgo == sm2_sa_algo) { + ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, + SM2_SA_MAJOR, SM2_SA_MINOR); + } + else + #endif #ifdef HAVE_ED25519 if (sigAlgo == ed25519_sa_algo) { ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, @@ -2883,7 +3068,6 @@ } else #endif - #ifdef HAVE_PQC #ifdef HAVE_FALCON if (sigAlgo == falcon_level1_sa_algo) { ADD_HASH_SIG_ALGO(hashSigAlgo, inOutIdx, @@ -2913,7 +3097,6 @@ } else #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ #ifdef WC_RSA_PSS if (sigAlgo == rsa_pss_sa_algo) { /* RSA PSS is sig then mac */ @@ -2932,18 +3115,8 @@ } } -void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, int haveRSAsig, - int haveFalconSig, int haveDilithiumSig, int haveAnon, int tls1_2, - int keySz) -{ - InitSuitesHashSigAlgo_ex(suites->hashSigAlgo, haveECDSAsig, haveRSAsig, - haveFalconSig, haveDilithiumSig, haveAnon, tls1_2, keySz, - &suites->hashSigAlgoSz); -} - -void InitSuitesHashSigAlgo_ex(byte* hashSigAlgo, int haveECDSAsig, - int haveRSAsig, int haveFalconSig, int haveDilithiumSig, int haveAnon, - int tls1_2, int keySz, word16* len) +void InitSuitesHashSigAlgo(byte* hashSigAlgo, int haveSig, int tls1_2, + int keySz, word16* len) { word16 idx = 0; @@ -2951,7 +3124,7 @@ (void)keySz; #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) - if (haveECDSAsig) { + if (haveSig & SIG_ECDSA) { #ifdef HAVE_ECC #ifdef WOLFSSL_SHA512 AddSuiteHashSigAlgo(hashSigAlgo, sha512_mac, ecc_dsa_sa_algo, keySz, @@ -2978,29 +3151,31 @@ #endif } #endif /* HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */ - if (haveFalconSig) { -#if defined(HAVE_PQC) +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (haveSig & SIG_SM2) { + AddSuiteHashSigAlgo(hashSigAlgo, sm3_mac, sm2_sa_algo, keySz, + &idx); + } +#endif #ifdef HAVE_FALCON + if (haveSig & SIG_FALCON) { AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level1_sa_algo, keySz, &idx); AddSuiteHashSigAlgo(hashSigAlgo, no_mac, falcon_level5_sa_algo, keySz, &idx); -#endif /* HAVE_FALCON */ -#endif /* HAVE_PQC */ } - if (haveDilithiumSig) { -#if defined(HAVE_PQC) +#endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM + if (haveSig & SIG_DILITHIUM) { AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level2_sa_algo, keySz, &idx); AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level3_sa_algo, keySz, &idx); AddSuiteHashSigAlgo(hashSigAlgo, no_mac, dilithium_level5_sa_algo, keySz, &idx); -#endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ } - if (haveRSAsig) { +#endif /* HAVE_DILITHIUM */ + if (haveSig & SIG_RSA) { #ifdef WC_RSA_PSS if (tls1_2) { #ifdef WOLFSSL_SHA512 @@ -3036,14 +3211,12 @@ } #ifdef HAVE_ANON - if (haveAnon) { + if (haveSig & SIG_ANON) { AddSuiteHashSigAlgo(hashSigAlgo, sha_mac, anonymous_sa_algo, keySz, &idx); } #endif - (void)haveAnon; - (void)haveECDSAsig; *len = idx; } @@ -3109,6 +3282,7 @@ (void)haveStaticRSA; (void)haveStaticECC; (void)haveECC; + (void)haveECDSAsig; (void)side; (void)haveRSA; /* some builds won't read */ (void)haveRSAsig; /* non ecc builds won't read */ @@ -3161,6 +3335,19 @@ } #endif +#ifdef BUILD_TLS_SM4_GCM_SM3 + if (tls1_3) { + suites->suites[idx++] = CIPHER_BYTE; + suites->suites[idx++] = TLS_SM4_GCM_SM3; + } +#endif +#ifdef BUILD_TLS_SM4_CCM_SM3 + if (tls1_3) { + suites->suites[idx++] = CIPHER_BYTE; + suites->suites[idx++] = TLS_SM4_CCM_SM3; + } +#endif + #ifdef HAVE_NULL_CIPHER #ifdef BUILD_TLS_SHA256_SHA256 if (tls1_3 && haveNull) { @@ -3227,14 +3414,23 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 + /* OpenSSL enables ECDHE when using ECDHE aliases without RSA */ + #ifdef OPENSSL_EXTRA + if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) { + #else if (tls1_2 && haveRSA) { + #endif suites->suites[idx++] = ECC_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384; } #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + #ifdef OPENSSL_EXTRA + if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) { + #else if (tls1_2 && haveRSA) { + #endif suites->suites[idx++] = ECC_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256; } @@ -3296,6 +3492,20 @@ } #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 + if (tls1_2 && haveECC) { + suites->suites[idx++] = ECC_BYTE; + suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384; + } +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 + if (tls1_2 && haveECC) { + suites->suites[idx++] = ECC_BYTE; + suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256; + } +#endif + #ifdef BUILD_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 if (tls1_2 && haveDH && havePSK) { suites->suites[idx++] = CIPHER_BYTE; @@ -3346,7 +3556,11 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 + #ifdef OPENSSL_EXTRA + if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) { + #else if (tls1_2 && haveRSA) { + #endif suites->suites[idx++] = CHACHA_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256; } @@ -3370,7 +3584,11 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 + #ifdef OPENSSL_EXTRA + if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) { + #else if (tls1_2 && haveRSA) { + #endif suites->suites[idx++] = ECC_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256; } @@ -3398,7 +3616,11 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 + #ifdef OPENSSL_EXTRA + if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) { + #else if (tls1_2 && haveRSA) { + #endif suites->suites[idx++] = ECC_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384; } @@ -3482,7 +3704,11 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA + #ifdef OPENSSL_EXTRA + if ((tls && haveRSA) || (tls && haveECDSAsig)) { + #else if (tls && haveRSA) { + #endif suites->suites[idx++] = ECC_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA; } @@ -3496,7 +3722,11 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA + #ifdef OPENSSL_EXTRA + if ((tls && haveRSA) || (tls && haveECDSAsig)) { + #else if (tls && haveRSA) { + #endif suites->suites[idx++] = ECC_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA; } @@ -3524,7 +3754,11 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA + #ifdef OPENSSL_EXTRA + if ((tls && haveRSA) || (tls && haveECDSAsig)) { + #else if (tls && haveRSA) { + #endif suites->suites[idx++] = ECC_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA; } @@ -3667,14 +3901,22 @@ #endif #ifdef BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 + #ifdef OPENSSL_EXTRA + if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) { + #else if (tls1_2 && haveRSA) { + #endif suites->suites[idx++] = CHACHA_BYTE; suites->suites[idx++] = TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256; } #endif #ifdef BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256 + #ifdef OPENSSL_EXTRA + if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) { + #else if (tls1_2 && haveRSA) { + #endif suites->suites[idx++] = CHACHA_BYTE; suites->suites[idx++] = TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256; } @@ -4041,15 +4283,51 @@ } #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + if (tls && haveECC) { + suites->suites[idx++] = SM_BYTE; + suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3; + } +#endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + if (tls && haveECC) { + suites->suites[idx++] = SM_BYTE; + suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3; + } +#endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + if (tls && haveECC) { + suites->suites[idx++] = SM_BYTE; + suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3; + } +#endif + #endif /* !WOLFSSL_NO_TLS12 */ suites->suiteSz = idx; if (suites->hashSigAlgoSz == 0) { - InitSuitesHashSigAlgo(suites, haveECDSAsig | haveECC, - haveRSAsig | haveRSA, haveFalconSig, - haveDilithiumSig, 0, tls1_2, keySz); + InitSuitesHashSigAlgo(suites->hashSigAlgo, SIG_ALL, tls1_2, keySz, + &suites->hashSigAlgoSz); } + + /* Moved to the end as we set some of the vars but never use them */ + (void)tls; /* shut up compiler */ + (void)tls1_2; + (void)dtls; + (void)haveDH; + (void)havePSK; + (void)haveStaticRSA; + (void)haveStaticECC; + (void)haveECC; + (void)haveECDSAsig; + (void)side; + (void)haveRSA; /* some builds won't read */ + (void)haveRSAsig; /* non ecc builds won't read */ + (void)haveAnon; /* anon ciphers optional */ + (void)haveNull; + (void)haveFalconSig; + (void)haveDilithiumSig; } #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \ @@ -4061,7 +4339,7 @@ * hashalgo The hash algorithm. * hsType The signature type. */ -static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType) +void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType) { *hsType = invalid_sa_algo; switch (input[0]) { @@ -4097,13 +4375,27 @@ *hashAlgo = input[1]; } break; -#ifdef HAVE_PQC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2_SA_MAJOR: + /* SM2: 0x0708 */ + if (input[1] == SM2_SA_MINOR) { + *hsType = sm2_sa_algo; + /* Hash performed as part of sign/verify operation. */ + *hashAlgo = sm3_mac; + } + break; + #endif +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) case PQC_SA_MAJOR: - /* Hash performed as part of sign/verify operation. */ + /* Hash performed as part of sign/verify operation. + * However, if we want a dual alg signature with a + * classic algorithm as alternative, we need an explicit + * hash algo here. + */ #ifdef HAVE_FALCON if (input[1] == FALCON_LEVEL1_SA_MINOR) { *hsType = falcon_level1_sa_algo; - *hashAlgo = sha512_mac; + *hashAlgo = sha256_mac; } else if (input[1] == FALCON_LEVEL5_SA_MINOR) { *hsType = falcon_level5_sa_algo; @@ -4113,11 +4405,11 @@ #ifdef HAVE_DILITHIUM if (input[1] == DILITHIUM_LEVEL2_SA_MINOR) { *hsType = dilithium_level2_sa_algo; - *hashAlgo = sha512_mac; + *hashAlgo = sha256_mac; } else if (input[1] == DILITHIUM_LEVEL3_SA_MINOR) { *hsType = dilithium_level3_sa_algo; - *hashAlgo = sha512_mac; + *hashAlgo = sha384_mac; } else if (input[1] == DILITHIUM_LEVEL5_SA_MINOR) { *hsType = dilithium_level5_sa_algo; @@ -4139,7 +4431,7 @@ #if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \ defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS)) -static enum wc_HashType HashAlgoToType(int hashAlgo) +enum wc_HashType HashAlgoToType(int hashAlgo) { switch (hashAlgo) { #ifdef WOLFSSL_SHA512 @@ -4150,6 +4442,10 @@ case sha384_mac: return WC_HASH_TYPE_SHA384; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + return WC_HASH_TYPE_SM3; + #endif #ifndef NO_SHA256 case sha256_mac: return WC_HASH_TYPE_SHA256; @@ -4343,6 +4639,12 @@ x509->altNames = NULL; } +#ifdef WOLFSSL_DUAL_ALG_CERTS + XFREE(x509->sapkiDer, x509->heap, DYNAMIC_TYPE_X509_EXT); + XFREE(x509->altSigAlgDer, x509->heap, DYNAMIC_TYPE_X509_EXT); + XFREE(x509->altSigValDer, x509->heap, DYNAMIC_TYPE_X509_EXT); +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) wolfSSL_RefFree(&x509->ref); #endif @@ -4380,6 +4682,13 @@ (void)hashAlgo; break; #endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + output[0] = SM2_SA_MAJOR; + output[1] = SM2_SA_MINOR; + (void)hashAlgo; + break; +#endif #ifndef NO_RSA case rsa_sa_algo: output[0] = hashAlgo; @@ -4405,7 +4714,8 @@ static void SetDigest(WOLFSSL* ssl, int hashAlgo) { switch (hashAlgo) { - #ifndef NO_SHA + #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ + defined(WOLFSSL_ALLOW_TLS_SHA1)) case sha_mac: ssl->options.dontFreeDigest = 1; ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sha; @@ -4419,6 +4729,13 @@ ssl->buffers.digest.length = WC_SHA256_DIGEST_SIZE; break; #endif /* !NO_SHA256 */ + #ifdef WOLFSSL_SM3 + case sm3_mac: + ssl->options.dontFreeDigest = 1; + ssl->buffers.digest.buffer = ssl->hsHashes->certHashes.sm3; + ssl->buffers.digest.length = WC_SM3_DIGEST_SIZE; + break; + #endif /* WOLFSSL_SM2 */ #ifdef WOLFSSL_SHA384 case sha384_mac: ssl->options.dontFreeDigest = 1; @@ -4442,7 +4759,7 @@ #endif /* !NO_CERTS */ #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) -static word32 MacSize(WOLFSSL* ssl) +static word32 MacSize(const WOLFSSL* ssl) { #ifdef HAVE_TRUNCATED_HMAC word32 digestSz = ssl->truncated_hmac ? (byte)TRUNCATED_HMAC_SZ @@ -4593,14 +4910,14 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (key && ret == WC_PENDING_E) { + if (key && ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ /* For positive response return in outSz */ if (ret > 0) { - *outSz = ret; + *outSz = (word32)ret; ret = 0; } @@ -4613,7 +4930,7 @@ int RsaVerify(WOLFSSL* ssl, byte* in, word32 inSz, byte** out, int sigAlgo, int hashAlgo, RsaKey* key, buffer* keyBufInfo) { - int ret = SIG_VERIFY_E; + int ret = WC_NO_ERR_TRACE(SIG_VERIFY_E); #ifdef HAVE_PK_CALLBACKS const byte* keyBuf = NULL; @@ -4665,11 +4982,11 @@ void* ctx = wolfSSL_GetRsaVerifyCtx(ssl); ret = ssl->ctx->RsaVerifyCb(ssl, in, inSz, out, keyBuf, keySz, ctx); } - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) else #else - if (!ssl->ctx->RsaVerifyCb || ret == CRYPTOCB_UNAVAILABLE) + if (!ssl->ctx->RsaVerifyCb || ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) #endif #endif /*HAVE_PK_CALLBACKS */ { @@ -4678,7 +4995,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -4751,7 +5068,7 @@ TypeHash(hashAlgo), mgf, keyBuf, keySz, ctx); if (ret > 0) { - ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret, + ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, (word32)ret, hashType); if (ret != 0) { ret = VERIFY_CERT_ERROR; @@ -4769,7 +5086,7 @@ ret = wc_RsaPSS_CheckPadding(plain, plainSz, out, ret, hashType); #else - ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, ret, + ret = wc_RsaPSS_CheckPadding_ex(plain, plainSz, out, (word32)ret, hashType, -1, mp_count_bits(&key->n)); #endif @@ -4816,7 +5133,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (key && ret == WC_PENDING_E) { + if (key && ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -4876,7 +5193,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -4896,7 +5213,7 @@ int RsaEnc(WOLFSSL* ssl, const byte* in, word32 inSz, byte* out, word32* outSz, RsaKey* key, buffer* keyBufInfo) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); #ifdef HAVE_PK_CALLBACKS const byte* keyBuf = NULL; word32 keySz = 0; @@ -4924,11 +5241,11 @@ void* ctx = wolfSSL_GetRsaEncCtx(ssl); ret = ssl->ctx->RsaEncCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx); } - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) else #else - if (!ssl->ctx->RsaEncCb || ret == CRYPTOCB_UNAVAILABLE) + if (!ssl->ctx->RsaEncCb || ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) #endif #endif /* HAVE_PK_CALLBACKS */ { @@ -4937,14 +5254,14 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ /* For positive response return in outSz */ if (ret > 0) { - *outSz = ret; + *outSz = (word32)ret; ret = 0; } @@ -4997,7 +5314,7 @@ ret = ssl->ctx->EccSignCb(ssl, in, inSz, out, outSz, keyBuf, keySz, ctx); #if defined(WOLFSSL_RENESAS_TSIP_TLS) - if (ret == CRYPTOCB_UNAVAILABLE) { + if (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { ret = wc_ecc_sign_hash(in, inSz, out, outSz, ssl->rng, key); } #endif /* WOLFSSL_RENESAS_TSIP_TLS */ @@ -5010,7 +5327,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (key && ret == WC_PENDING_E) { + if (key && ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5023,7 +5340,7 @@ int EccVerify(WOLFSSL* ssl, const byte* in, word32 inSz, const byte* out, word32 outSz, ecc_key* key, buffer* keyBufInfo) { - int ret = SIG_VERIFY_E; + int ret = WC_NO_ERR_TRACE(SIG_VERIFY_E); #ifdef HAVE_PK_CALLBACKS const byte* keyBuf = NULL; word32 keySz = 0; @@ -5052,12 +5369,12 @@ ret = ssl->ctx->EccVerifyCb(ssl, in, inSz, out, outSz, keyBuf, keySz, &ssl->eccVerifyRes, ctx); } - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) && \ !defined(WOLFSSL_MAXQ108X) else #else - if (!ssl->ctx->EccVerifyCb || ret == CRYPTOCB_UNAVAILABLE) + if (!ssl->ctx->EccVerifyCb || ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) #endif #endif /* HAVE_PK_CALLBACKS */ { @@ -5066,7 +5383,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } else @@ -5139,7 +5456,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5171,6 +5488,24 @@ if (ssl->ecdhCurveOID > 0) { ecc_curve = wc_ecc_get_oid(ssl->ecdhCurveOID, NULL, NULL); } + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \ + (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \ + defined(WOLFSSL_SM4_CCM)) + if ((ssl->options.cipherSuite0 == SM_BYTE) && (0 + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3) + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3) + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + || (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3) + #endif + )) { + keySz = 32; + ecc_curve = ECC_SM2P256V1; + } + #endif } else { keySz = peer->dp->size; @@ -5180,7 +5515,7 @@ #ifdef HAVE_PK_CALLBACKS if (ssl->ctx->EccKeyGenCb) { void* ctx = wolfSSL_GetEccKeyGenCtx(ssl); - ret = ssl->ctx->EccKeyGenCb(ssl, key, keySz, ecc_curve, ctx); + ret = ssl->ctx->EccKeyGenCb(ssl, key, (unsigned int)keySz, ecc_curve, ctx); } else #endif @@ -5198,7 +5533,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5209,6 +5544,63 @@ } #endif /* HAVE_ECC */ +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + +int Sm2wSm3Sign(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* in, + word32 inSz, byte* out, word32* outSz, ecc_key* key, DerBuffer* keyBufInfo) +{ + int ret; + byte hash[WC_SM3_DIGEST_SIZE]; + + (void)ssl; + (void)keyBufInfo; + + WOLFSSL_ENTER("Sm2wSm3Sign"); + + ret = wc_ecc_sm2_create_digest(id, idSz, in, inSz, WC_HASH_TYPE_SM3, hash, + sizeof(hash), key); + if (ret == 0) { + ret = wc_ecc_sm2_sign_hash(hash, sizeof(hash), out, outSz, ssl->rng, + key); + } + + WOLFSSL_LEAVE("Sm2wSm3Sign", ret); + + return ret; +} + +int Sm2wSm3Verify(WOLFSSL* ssl, const byte* id, word32 idSz, const byte* sig, + word32 sigSz, const byte* msg, word32 msgSz, ecc_key* key, + buffer* keyBufInfo) +{ + int ret = WC_NO_ERR_TRACE(SIG_VERIFY_E); + byte hash[WC_SM3_DIGEST_SIZE]; + + (void)ssl; + (void)keyBufInfo; + + WOLFSSL_ENTER("Sm2wSm3Verify"); + + ret = wc_ecc_sm2_create_digest(id, idSz, msg, msgSz, WC_HASH_TYPE_SM3, hash, + sizeof(hash), key); + if (ret == 0) { + ret = wc_ecc_sm2_verify_hash(sig, sigSz, hash, sizeof(hash), + &ssl->eccVerifyRes, key); + if (ret == 0 && ssl->eccVerifyRes == 0) { + ret = VERIFY_SIGN_ERROR; + } + } + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + } + + WOLFSSL_LEAVE("Sm2wSm3Verify", ret); + + return ret; +} + +#endif /* WOLFSSL_SM2 */ + #ifdef HAVE_ED25519 /* Check whether the key contains a public key. * If not then pull it out of the leaf certificate. @@ -5304,7 +5696,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5378,7 +5770,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } else @@ -5404,7 +5796,6 @@ */ static int X25519GetKey(WOLFSSL* ssl, curve25519_key** otherKey) { - int ret = NO_PEER_KEY; struct curve25519_key* tmpKey = NULL; if (ssl == NULL || otherKey == NULL) { @@ -5427,10 +5818,11 @@ if (tmpKey) { *otherKey = (curve25519_key *)tmpKey; - ret = 0; + return 0; + } + else { + return NO_PEER_KEY; } - - return ret; } #endif /* HAVE_PK_CALLBACKS */ @@ -5474,7 +5866,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5520,7 +5912,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5628,7 +6020,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5702,7 +6094,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } else @@ -5728,7 +6120,6 @@ */ static int X448GetKey(WOLFSSL* ssl, curve448_key** otherKey) { - int ret = NO_PEER_KEY; struct curve448_key* tmpKey = NULL; if (ssl == NULL || otherKey == NULL) { @@ -5750,10 +6141,11 @@ if (tmpKey) { *otherKey = (curve448_key *)tmpKey; - ret = 0; + return 0; + } + else { + return NO_PEER_KEY; } - - return ret; } #endif /* HAVE_PK_CALLBACKS */ @@ -5798,7 +6190,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &priv_key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5843,7 +6235,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &key->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5880,7 +6272,7 @@ ret = ssl->ctx->DhGenerateKeyPairCb(dhKey, ssl->rng, priv, privSz, pub, pubSz); } - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) #endif { PRIVATE_KEY_UNLOCK(); @@ -5890,7 +6282,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -5960,7 +6352,7 @@ /* Handle async pending response */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &dhKey->asyncDev); } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -6049,7 +6441,7 @@ word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon, int side) { - /* make sure server has DH parms, and add PSK if there */ + /* make sure server has DH params, and add PSK if there */ if (side == WOLFSSL_SERVER_END) { InitSuites(suites, pv, keySz, haveRSA, havePSK, haveDH, haveECDSAsig, haveECC, TRUE, haveStaticECC, haveFalconSig, @@ -6075,7 +6467,7 @@ havePSK = ctx->havePSK; #endif /* NO_PSK */ #ifdef HAVE_ANON - haveAnon = ctx->haveAnon; + haveAnon = ctx->useAnon; #endif /* HAVE_ANON*/ #ifndef NO_CERTS keySz = ctx->privateKeySz; @@ -6108,7 +6500,7 @@ #endif /* NO_PSK */ #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT) #ifdef HAVE_ANON - haveAnon = (byte)ssl->options.haveAnon; + haveAnon = (byte)ssl->options.useAnon; #endif /* HAVE_ANON*/ #ifdef WOLFSSL_MULTICAST haveMcast = (byte)ssl->options.haveMcast; @@ -6120,11 +6512,13 @@ ssl->options.maxEarlyDataSz = ssl->ctx->maxEarlyDataSz; #endif #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \ - ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ + ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \ + (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH))) ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END || ssl->buffers.keyType == ed25519_sa_algo || - ssl->buffers.keyType == ed448_sa_algo; + ssl->buffers.keyType == ed448_sa_algo || + ssl->buffers.keyType == sm2_sa_algo; #endif #ifndef NO_CERTS @@ -6136,7 +6530,7 @@ havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, ssl->options.haveStaticECC, ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, ssl->options.side); + ssl->options.useAnon, ssl->options.side); } #if !defined(NO_CERTS) && !defined(WOLFSSL_SESSION_EXPORT) @@ -6188,7 +6582,7 @@ WOLFSSL_SUCCESS return value on success */ int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup) { - int ret; + int ret = WOLFSSL_SUCCESS; /* set default ret */ byte newSSL; WOLFSSL_ENTER("SetSSL_CTX"); @@ -6211,19 +6605,33 @@ } /* increment CTX reference count */ - wolfSSL_RefInc(&ctx->ref, &ret); + ret = wolfSSL_CTX_up_ref(ctx); #ifdef WOLFSSL_REFCNT_ERROR_RETURN - if (ret < 0) { + if (ret != WOLFSSL_SUCCESS) { return ret; } #else (void)ret; #endif - ret = WOLFSSL_SUCCESS; /* set default ret */ ssl->ctx = ctx; /* only for passing to calls, options could change */ /* Don't change version on a SSL object that has already started a * handshake */ +#if defined(WOLFSSL_HAPROXY) + if (ssl->initial_ctx == NULL) { + ret = wolfSSL_CTX_up_ref(ctx); + if (ret == WOLFSSL_SUCCESS) { + ssl->initial_ctx = ctx; /* Save access to session key materials */ + } + else { + #ifdef WOLFSSL_REFCNT_ERROR_RETURN + return ret; + #else + (void)ret; + #endif + } + } +#endif if (!ssl->msgsReceived.got_client_hello && !ssl->msgsReceived.got_server_hello) ssl->version = ctx->method->version; @@ -6342,7 +6750,7 @@ #endif #ifdef HAVE_ANON - ssl->options.haveAnon = ctx->haveAnon; + ssl->options.useAnon = ctx->useAnon; #endif #ifndef NO_DH ssl->options.minDhKeySz = ctx->minDhKeySz; @@ -6354,14 +6762,12 @@ #ifdef HAVE_ECC ssl->options.minEccKeySz = ctx->minEccKeySz; #endif -#ifdef HAVE_PQC #ifdef HAVE_FALCON ssl->options.minFalconKeySz = ctx->minFalconKeySz; #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM ssl->options.minDilithiumKeySz = ctx->minDilithiumKeySz; #endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) ssl->options.verifyDepth = ctx->verifyDepth; #endif @@ -6392,6 +6798,11 @@ ssl->buffers.serverDH_G = ctx->serverDH_G; #endif +#if defined(HAVE_RPK) + ssl->options.rpkConfig = ctx->rpkConfig; + ssl->options.rpkState = ctx->rpkState; +#endif /* HAVE_RPK */ + #ifndef NO_CERTS /* ctx still owns certificate, certChain, key, dh, and cm */ ssl->buffers.certificate = ctx->certificate; @@ -6399,19 +6810,60 @@ #ifdef WOLFSSL_TLS13 ssl->buffers.certChainCnt = ctx->certChainCnt; #endif +#ifndef WOLFSSL_BLIND_PRIVATE_KEY ssl->buffers.key = ctx->privateKey; +#else + if (ctx->privateKey != NULL) { + AllocCopyDer(&ssl->buffers.key, ctx->privateKey->buffer, + ctx->privateKey->length, ctx->privateKey->type, + ctx->privateKey->heap); + ssl->buffers.weOwnKey = 1; + /* Blind the private key for the SSL with new random mask. */ + wolfssl_priv_der_unblind(ssl->buffers.key, ctx->privateKeyMask); + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + &ssl->buffers.keyMask); + if (ret != 0) { + return ret; + } + } +#endif ssl->buffers.keyType = ctx->privateKeyType; ssl->buffers.keyId = ctx->privateKeyId; ssl->buffers.keyLabel = ctx->privateKeyLabel; ssl->buffers.keySz = ctx->privateKeySz; ssl->buffers.keyDevId = ctx->privateKeyDevId; +#ifdef WOLFSSL_DUAL_ALG_CERTS +#ifndef WOLFSSL_BLIND_PRIVATE_KEY + ssl->buffers.altKey = ctx->altPrivateKey; +#else + if (ctx->altPrivateKey != NULL) { + AllocCopyDer(&ssl->buffers.altkey, ctx->altPrivateKey->buffer, + ctx->altPrivateKey->length, ctx->altPrivateKey->type, + ctx->altPrivateKey->heap); + /* Blind the private key for the SSL with new random mask. */ + wolfssl_priv_der_unblind(ssl->buffers.altKey, ctx->altPrivateKeyMask); + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.altKey, + &ssl->buffers.altKeyMask); + if (ret != 0) { + return ret; + } + } +#endif + ssl->buffers.altKeyType = ctx->altPrivateKeyType; + ssl->buffers.altKeyId = ctx->altPrivateKeyId; + ssl->buffers.altKeyLabel = ctx->altPrivateKeyLabel; + ssl->buffers.altKeySz = ctx->altPrivateKeySz; + ssl->buffers.altKeyDevId = ctx->altPrivateKeyDevId; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #endif #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \ - ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ + ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \ + (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH))) ssl->options.cacheMessages = ssl->options.side == WOLFSSL_SERVER_END || ssl->buffers.keyType == ed25519_sa_algo || - ssl->buffers.keyType == ed448_sa_algo; + ssl->buffers.keyType == ed448_sa_algo || + ssl->buffers.keyType == sm2_sa_algo; #endif @@ -6495,8 +6947,7 @@ } XMEMSET(ssl->hsHashes, 0, sizeof(HS_Hashes)); -#ifndef NO_OLD_TLS -#ifndef NO_MD5 +#if !defined(NO_MD5) && !defined(NO_OLD_TLS) ret = wc_InitMd5_ex(&ssl->hsHashes->hashMd5, ssl->heap, ssl->devId); if (ret != 0) return ret; @@ -6504,7 +6955,8 @@ wc_Md5SetFlags(&ssl->hsHashes->hashMd5, WC_HASH_FLAG_WILLCOPY); #endif #endif -#ifndef NO_SHA +#if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ + defined(WOLFSSL_ALLOW_TLS_SHA1)) ret = wc_InitSha_ex(&ssl->hsHashes->hashSha, ssl->heap, ssl->devId); if (ret != 0) return ret; @@ -6512,7 +6964,6 @@ wc_ShaSetFlags(&ssl->hsHashes->hashSha, WC_HASH_FLAG_WILLCOPY); #endif #endif -#endif /* !NO_OLD_TLS */ #ifndef NO_SHA256 ret = wc_InitSha256_ex(&ssl->hsHashes->hashSha256, ssl->heap, ssl->devId); if (ret != 0) @@ -6537,6 +6988,14 @@ wc_Sha512SetFlags(&ssl->hsHashes->hashSha512, WC_HASH_FLAG_WILLCOPY); #endif #endif +#ifdef WOLFSSL_SM3 + ret = wc_InitSm3(&ssl->hsHashes->hashSm3, ssl->heap, ssl->devId); + if (ret != 0) + return ret; + #ifdef WOLFSSL_HASH_FLAGS + wc_Sm3SetFlags(&ssl->hsHashes->hashSm3, WC_HASH_FLAG_WILLCOPY); + #endif +#endif return ret; } @@ -6544,14 +7003,13 @@ void FreeHandshakeHashes(WOLFSSL* ssl) { if (ssl->hsHashes) { -#ifndef NO_OLD_TLS - #ifndef NO_MD5 + #if !defined(NO_MD5) && !defined(NO_OLD_TLS) wc_Md5Free(&ssl->hsHashes->hashMd5); #endif - #ifndef NO_SHA + #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ + defined(WOLFSSL_ALLOW_TLS_SHA1)) wc_ShaFree(&ssl->hsHashes->hashSha); #endif -#endif /* !NO_OLD_TLS */ #ifndef NO_SHA256 wc_Sha256Free(&ssl->hsHashes->hashSha256); #endif @@ -6561,8 +7019,12 @@ #ifdef WOLFSSL_SHA512 wc_Sha512Free(&ssl->hsHashes->hashSha512); #endif - #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \ - !defined(WOLFSSL_NO_CLIENT_AUTH) + #ifdef WOLFSSL_SM3 + wc_Sm3Free(&ssl->hsHashes->hashSm3); + #endif + #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \ + (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \ + !defined(WOLFSSL_NO_CLIENT_AUTH) if (ssl->hsHashes->messages != NULL) { ForceZero(ssl->hsHashes->messages, ssl->hsHashes->length); XFREE(ssl->hsHashes->messages, ssl->heap, DYNAMIC_TYPE_HASHES); @@ -6579,7 +7041,7 @@ int InitHandshakeHashesAndCopy(WOLFSSL* ssl, HS_Hashes* source, HS_Hashes** destination) { - int ret = 0; + int ret; HS_Hashes* tmpHashes; if (source == NULL) @@ -6589,7 +7051,11 @@ tmpHashes = ssl->hsHashes; ssl->hsHashes = NULL; - InitHandshakeHashes(ssl); + ret = InitHandshakeHashes(ssl); + if (ret != 0) { + WOLFSSL_MSG_EX("InitHandshakeHashes failed. err = %d", ret); + return ret; + } *destination = ssl->hsHashes; ssl->hsHashes = tmpHashes; @@ -6597,50 +7063,56 @@ /* now copy the source contents to the destination */ #ifndef NO_OLD_TLS #ifndef NO_SHA - ret = wc_ShaCopy(&source->hashSha, &(*destination)->hashSha); + ret = wc_ShaCopy(&source->hashSha, &(*destination)->hashSha); #endif #ifndef NO_MD5 - if (ret == 0) - ret = wc_Md5Copy(&source->hashMd5, &(*destination)->hashMd5); + if (ret == 0) + ret = wc_Md5Copy(&source->hashMd5, &(*destination)->hashMd5); #endif #endif /* !NO_OLD_TLS */ #ifndef NO_SHA256 - if (ret == 0) - ret = wc_Sha256Copy(&source->hashSha256, - &(*destination)->hashSha256); + if (ret == 0) + ret = wc_Sha256Copy(&source->hashSha256, + &(*destination)->hashSha256); #endif #ifdef WOLFSSL_SHA384 - if (ret == 0) - ret = wc_Sha384Copy(&source->hashSha384, - &(*destination)->hashSha384); + if (ret == 0) + ret = wc_Sha384Copy(&source->hashSha384, + &(*destination)->hashSha384); #endif #ifdef WOLFSSL_SHA512 - if (ret == 0) - ret = wc_Sha512Copy(&source->hashSha512, - &(*destination)->hashSha512); + if (ret == 0) + ret = wc_Sha512Copy(&source->hashSha512, + &(*destination)->hashSha512); + #endif + #ifdef WOLFSSL_SM3 + if (ret == 0) + ret = wc_Sm3Copy(&source->hashSm3, + &(*destination)->hashSm3); #endif - #if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \ - !defined(WOLFSSL_NO_CLIENT_AUTH) - if (ret == 0 && source->messages != NULL) { - (*destination)->messages = (byte*)XMALLOC(source->length, ssl->heap, - DYNAMIC_TYPE_HASHES); - (*destination)->length = source->length; - (*destination)->prevLen = source->prevLen; + #if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \ + (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \ + !defined(WOLFSSL_NO_CLIENT_AUTH) + if (ret == 0 && source->messages != NULL) { + (*destination)->messages = (byte*)XMALLOC(source->length, ssl->heap, + DYNAMIC_TYPE_HASHES); + (*destination)->length = source->length; + (*destination)->prevLen = source->prevLen; - if ((*destination)->messages == NULL) { - ret = MEMORY_E; - } - else { - XMEMCPY((*destination)->messages, source->messages, - source->length); - } + if ((*destination)->messages == NULL) { + ret = MEMORY_E; + } + else { + XMEMCPY((*destination)->messages, source->messages, + source->length); } + } #endif return ret; } -/* called if user attempts to re-use WOLFSSL object for a new session. +/* called if user attempts to reuse WOLFSSL object for a new session. * For example wolfSSL_clear() is called then wolfSSL_connect or accept */ int ReinitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup) { @@ -6761,6 +7233,8 @@ ssl_hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap)); ctx_hint = ((WOLFSSL_HEAP_HINT*)(ctx->heap)); + ssl_hint->memory = ctx_hint->memory; + #ifndef WOLFSSL_STATIC_MEMORY_LEAN /* lock and check IO count / handshake count */ if (wc_LockMutex(&(ctx_hint->memory->memory_mutex)) != 0) { WOLFSSL_MSG("Bad memory_mutex lock"); @@ -6788,7 +7262,6 @@ } ctx_hint->memory->curIO++; ctx_hint->memory->curHa++; - ssl_hint->memory = ctx_hint->memory; ssl_hint->haFlag = 1; wc_UnLockMutex(&(ctx_hint->memory->memory_mutex)); @@ -6824,6 +7297,7 @@ } wc_UnLockMutex(&(ctx_hint->memory->memory_mutex)); } + #endif /* !WOLFSSL_STATIC_MEMORY_LEAN */ #ifdef WOLFSSL_HEAP_TEST } #endif @@ -6876,12 +7350,6 @@ #endif #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU) ssl->dtlsMtuSz = ctx->dtlsMtuSz; - /* Add some bytes so that we can operate with slight difference - * in set MTU size on each peer */ - ssl->dtls_expected_rx = ssl->dtlsMtuSz + - DTLS_MTU_ADDITIONAL_READ_BUFFER; - #else - ssl->dtls_expected_rx = MAX_MTU; #endif ssl->dtls_timeout_init = DTLS_TIMEOUT_INIT; ssl->dtls_timeout_max = DTLS_TIMEOUT_MAX; @@ -6917,7 +7385,7 @@ #ifndef NO_OLD_TLS ssl->hmac = SSL_hmac; /* default to SSLv3 */ #elif !defined(WOLFSSL_NO_TLS12) && !defined(NO_TLS) - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) ssl->hmac = TLS_hmac; #else @@ -6961,6 +7429,10 @@ XMEMCPY(ssl->group, ctx->group, sizeof(*ctx->group) * ctx->numGroups); ssl->numGroups = ctx->numGroups; } + + #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT + ssl->options.tls13MiddleBoxCompat = 1; + #endif #endif #ifdef HAVE_TLS_EXTENSIONS @@ -7004,10 +7476,12 @@ ssl->alert_history.last_tx.code = -1; ssl->alert_history.last_tx.level = -1; -#ifdef OPENSSL_EXTRA +#ifdef WOLFSSL_SESSION_ID_CTX /* copy over application session context ID */ ssl->sessionCtxSz = ctx->sessionCtxSz; XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz); +#endif +#ifdef OPENSSL_EXTRA ssl->cbioFlag = ctx->cbioFlag; ssl->protoMsgCb = ctx->protoMsgCb; @@ -7027,6 +7501,7 @@ /* all done with init, now can return errors, call other stuff */ if ((ret = ReinitSSL(ssl, ctx, writeDup)) != 0) { + WOLFSSL_MSG_EX("ReinitSSL failed. err = %d", ret); return ret; } @@ -7055,9 +7530,14 @@ /* Initialize SSL with the appropriate fields from it's ctx */ /* requires valid arrays and suites unless writeDup ing */ - if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS) + if ((ret = SetSSL_CTX(ssl, ctx, writeDup)) != WOLFSSL_SUCCESS +#ifdef WOLFSSL_NO_INIT_CTX_KEY + && ret != NO_PRIVATE_KEY +#endif + ) { + WOLFSSL_MSG_EX("SetSSL_CTX failed. err = %d", ret); return ret; - + } ssl->options.dtls = ssl->version.major == DTLS_MAJOR; #ifdef HAVE_WRITE_DUP @@ -7069,20 +7549,21 @@ /* hsHashes */ ret = InitHandshakeHashes(ssl); - if (ret != 0) + if (ret != 0) { + WOLFSSL_MSG_EX("InitHandshakeHashes failed. err = %d", ret); return ret; + } #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER) if (ssl->options.dtls && ssl->options.side == WOLFSSL_SERVER_END) { - if (!IsAtLeastTLSv1_3(ssl->version)) { - ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0); - if (ret != 0) { - WOLFSSL_MSG("DTLS Cookie Secret error"); - return ret; - } + /* Initialize both in case we allow downgrading. */ + ret = wolfSSL_DTLS_SetCookieSecret(ssl, NULL, 0); + if (ret != 0) { + WOLFSSL_MSG("DTLS Cookie Secret error"); + return ret; } #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE) - else { + if (IsAtLeastTLSv1_3(ssl->version)) { ret = wolfSSL_send_hrr_cookie(ssl, NULL, 0); if (ret != WOLFSSL_SUCCESS) { WOLFSSL_MSG("DTLS1.3 Cookie secret error"); @@ -7112,10 +7593,10 @@ ssl->session = wolfSSL_NewSession(ssl->heap); if (ssl->session == NULL) { - WOLFSSL_MSG("SSL Session Memory error"); + WOLFSSL_MSG_EX("SSL Session Memory error. wolfSSL_NewSession " + "err = %d", ret); return MEMORY_E; } - #ifdef HAVE_SESSION_TICKET ssl->options.noTicketTls12 = ctx->noTicketTls12; #endif @@ -7155,7 +7636,7 @@ ret = wolfSSL_UseSecureRenegotiation(ssl); if (ret != WOLFSSL_SUCCESS) return ret; - } + } } #endif /* HAVE_SECURE_RENEGOTIATION */ @@ -7184,6 +7665,19 @@ return ret; #endif +#if defined(HAVE_SECRET_CALLBACK) && defined(SHOW_SECRETS) && \ + defined(WOLFSSL_SSLKEYLOGFILE) && defined(WOLFSSL_TLS13) + (void)wolfSSL_set_tls13_secret_cb(ssl, tls13ShowSecrets, NULL); +#endif +#if defined(HAVE_SECRET_CALLBACK) && defined(SHOW_SECRETS) + (void)wolfSSL_set_secret_cb(ssl, tlsShowSecrets, NULL); +#endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + ssl->sigSpec = ctx->sigSpec; + ssl->sigSpecSz = ctx->sigSpecSz; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Returns 0 on success, not WOLFSSL_SUCCESS (1) */ + WOLFSSL_MSG_EX("InitSSL done. return 0 (success)"); return 0; } @@ -7252,7 +7746,6 @@ wc_curve448_free((curve448_key*)*pKey); break; #endif /* HAVE_CURVE448 */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case DYNAMIC_TYPE_FALCON: wc_falcon_free((falcon_key*)*pKey); @@ -7263,7 +7756,6 @@ wc_dilithium_free((dilithium_key*)*pKey); break; #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ #ifndef NO_DH case DYNAMIC_TYPE_DH: wc_FreeDhKey((DhKey*)*pKey); @@ -7281,7 +7773,7 @@ int AllocKey(WOLFSSL* ssl, int type, void** pKey) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); int sz = 0; #ifdef HAVE_ECC ecc_key* eccKey; @@ -7298,6 +7790,12 @@ /* Sanity check key destination */ if (*pKey != NULL) { WOLFSSL_MSG("Key already present!"); + #ifdef WOLFSSL_ASYNC_CRYPT + /* allow calling this again for async reentry */ + if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) { + return 0; + } + #endif return BAD_STATE_E; } @@ -7333,7 +7831,6 @@ sz = sizeof(curve448_key); break; #endif /* HAVE_CURVE448 */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case DYNAMIC_TYPE_FALCON: sz = sizeof(falcon_key); @@ -7344,7 +7841,6 @@ sz = sizeof(dilithium_key); break; #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ #ifndef NO_DH case DYNAMIC_TYPE_DH: sz = sizeof(DhKey); @@ -7408,20 +7904,18 @@ ret = 0; break; #endif /* HAVE_CURVE448 */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case DYNAMIC_TYPE_FALCON: - wc_falcon_init((falcon_key*)*pKey); + wc_falcon_init_ex((falcon_key*)*pKey, ssl->heap, ssl->devId); ret = 0; break; #endif /* HAVE_FALCON */ #if defined(HAVE_DILITHIUM) case DYNAMIC_TYPE_DILITHIUM: - wc_dilithium_init((dilithium_key*)*pKey); + wc_dilithium_init_ex((dilithium_key*)*pKey, ssl->heap, ssl->devId); ret = 0; break; #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ #ifdef HAVE_CURVE448 case DYNAMIC_TYPE_CURVE448: wc_curve448_init((curve448_key*)*pKey); @@ -7447,8 +7941,7 @@ #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \ defined(HAVE_CURVE25519) || defined(HAVE_ED448) || \ - defined(HAVE_CURVE448) || (defined(HAVE_PQC) && defined(HAVE_FALCON)) || \ - (defined(HAVE_PQC) && defined(HAVE_DILITHIUM)) + defined(HAVE_CURVE448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) static int ReuseKey(WOLFSSL* ssl, int type, void* pKey) { int ret = 0; @@ -7494,12 +7987,18 @@ ret = wc_curve448_init((curve448_key*)pKey); break; #endif /* HAVE_CURVE448 */ - #if defined(HAVE_PQC) && defined(HAVE_FALCON) + #if defined(HAVE_FALCON) case DYNAMIC_TYPE_FALCON: wc_falcon_free((falcon_key*)pKey); ret = wc_falcon_init((falcon_key*)pKey); break; - #endif /* HAVE_PQC && HAVE_FALCON */ + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) + case DYNAMIC_TYPE_DILITHIUM: + wc_dilithium_free((dilithium_key*)pKey); + ret = wc_dilithium_init((dilithium_key*)pKey); + break; + #endif /* HAVE_DILITHIUM */ #ifndef NO_DH case DYNAMIC_TYPE_DH: wc_FreeDhKey((DhKey*)pKey); @@ -7558,6 +8057,9 @@ /* Free handshake key */ FreeKey(ssl, ssl->hsType, &ssl->hsKey); +#ifdef WOLFSSL_DUAL_ALG_CERTS + FreeKey(ssl, ssl->hsAltType, &ssl->hsAltKey); +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #ifndef NO_DH /* Free temp DH key */ @@ -7612,6 +8114,8 @@ if (ssl->options.weOwnRng) { wc_FreeRng(ssl->rng); XFREE(ssl->rng, ssl->heap, DYNAMIC_TYPE_RNG); + ssl->rng = NULL; + ssl->options.weOwnRng = 0; } FreeSuites(ssl); FreeHandshakeHashes(ssl); @@ -7662,7 +8166,7 @@ FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey); ssl->peerRsaKeyPresent = 0; #endif -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) XFREE(ssl->peerSceTsipEncRsaKeyIndex, ssl->heap, DYNAMIC_TYPE_RSA); Renesas_cmn_Cleanup(ssl); #endif @@ -7788,7 +8292,7 @@ } #endif #endif -#if defined(HAVE_PQC) && defined(HAVE_FALCON) +#if defined(HAVE_FALCON) FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey); ssl->peerFalconKeyPresent = 0; #endif @@ -7871,14 +8375,17 @@ /* avoid dereferencing a test value */ if (ssl->heap != (void*)WOLFSSL_HEAP_TEST) { #endif + void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap; + #ifndef WOLFSSL_STATIC_MEMORY_LEAN WOLFSSL_HEAP_HINT* ssl_hint = (WOLFSSL_HEAP_HINT*)ssl->heap; WOLFSSL_HEAP* ctx_heap; - void* heap = ssl->ctx ? ssl->ctx->heap : ssl->heap; ctx_heap = ssl_hint->memory; + #ifndef SINGLE_THREADED if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) { WOLFSSL_MSG("Bad memory_mutex lock"); } + #endif ctx_heap->curIO--; if (FreeFixedIO(ctx_heap, &(ssl_hint->outBuf)) != 1) { WOLFSSL_MSG("Error freeing fixed output buffer"); @@ -7886,15 +8393,20 @@ if (FreeFixedIO(ctx_heap, &(ssl_hint->inBuf)) != 1) { WOLFSSL_MSG("Error freeing fixed output buffer"); } - if (ssl_hint->haFlag) { /* check if handshake count has been decreased*/ + + /* check if handshake count has been decreased*/ + if (ssl_hint->haFlag && ctx_heap->curHa > 0) { ctx_heap->curHa--; } + #ifndef SINGLE_THREADED wc_UnLockMutex(&(ctx_heap->memory_mutex)); + #endif /* check if tracking stats */ if (ctx_heap->flag & WOLFMEM_TRACK_STATS) { XFREE(ssl_hint->stats, heap, DYNAMIC_TYPE_SSL); } + #endif /* !WOLFSSL_STATIC_MEMORY_LEAN */ XFREE(ssl->heap, heap, DYNAMIC_TYPE_SSL); #ifdef WOLFSSL_HEAP_TEST } @@ -7911,8 +8423,8 @@ #endif #endif #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY) - wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL); - ssl->ca_names = NULL; + wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL); + ssl->client_ca_names = NULL; #endif #ifdef WOLFSSL_DTLS13 Dtls13FreeFsmResources(ssl); @@ -7920,6 +8432,13 @@ #ifdef WOLFSSL_QUIC wolfSSL_quic_free(ssl); #endif +#if defined(WOLFSSL_HAPROXY) + wolfSSL_CTX_free(ssl->initial_ctx); + ssl->initial_ctx = NULL; +#endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + XFREE(ssl->peerSigSpec, ssl->heap, DYNAMIC_TYPE_TLSX); +#endif } /* Free any handshake resources no longer needed */ @@ -8024,10 +8543,10 @@ FreeKey(ssl, DYNAMIC_TYPE_ED448, (void**)&ssl->peerEd448Key); ssl->peerEd448KeyPresent = 0; #endif /* HAVE_ED448 */ -#if defined(HAVE_PQC) && defined(HAVE_FALCON) +#if defined(HAVE_FALCON) FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey); ssl->peerFalconKeyPresent = 0; -#endif /* HAVE_PQC */ +#endif /* HAVE_FALCON */ } #ifdef HAVE_ECC @@ -8090,8 +8609,14 @@ } #endif /* !NO_DH */ -#ifndef NO_CERTS - wolfSSL_UnloadCertsKeys(ssl); +#if !defined(NO_CERTS) && !defined(OPENSSL_EXTRA) && \ + !defined(WOLFSSL_WPAS_SMALL) +#ifndef WOLFSSL_POST_HANDSHAKE_AUTH + if (ssl->options.side != WOLFSSL_CLIENT_END) +#endif + { + wolfSSL_UnloadCertsKeys(ssl); + } #endif #ifdef HAVE_PK_CALLBACKS #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) @@ -8118,13 +8643,25 @@ } #endif /* HAVE_PK_CALLBACKS */ -#if defined(HAVE_TLS_EXTENSIONS) && !defined(HAVE_SNI) && \ -!defined(NO_TLS) && !defined(HAVE_ALPN) && !defined(WOLFSSL_POST_HANDSHAKE_AUTH) && \ - !defined(WOLFSSL_DTLS_CID) +#if defined(HAVE_TLS_EXTENSIONS) && !defined(NO_TLS) +#if !defined(HAVE_SNI) && !defined(HAVE_ALPN) && !defined(WOLFSSL_DTLS_CID) && \ + !defined(WOLFSSL_POST_HANDSHAKE_AUTH) /* Some extensions need to be kept for post-handshake querying. */ TLSX_FreeAll(ssl->extensions, ssl->heap); ssl->extensions = NULL; +#else +#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) + TLSX_Remove(&ssl->extensions, TLSX_SIGNATURE_ALGORITHMS, ssl->heap); +#endif + TLSX_Remove(&ssl->extensions, TLSX_EC_POINT_FORMATS, ssl->heap); + TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap); +#ifdef WOLFSSL_TLS13 + TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_VERSIONS, ssl->heap); + TLSX_Remove(&ssl->extensions, TLSX_KEY_SHARE, ssl->heap); #endif +#endif /* !HAVE_SNI && && !HAVE_ALPN && !WOLFSSL_DTLS_CID && + * !WOLFSSL_POST_HANDSHAKE_AUTH */ +#endif /* HAVE_TLS_EXTENSIONS && !NO_TLS */ #ifdef WOLFSSL_STATIC_MEMORY /* when done with handshake decrement current handshake count */ @@ -8137,12 +8674,20 @@ WOLFSSL_HEAP* ctx_heap; ctx_heap = ssl_hint->memory; + #ifndef SINGLE_THREADED if (wc_LockMutex(&(ctx_heap->memory_mutex)) != 0) { WOLFSSL_MSG("Bad memory_mutex lock"); } - ctx_heap->curHa--; + #endif + #ifndef WOLFSSL_STATIC_MEMORY_LEAN + if (ctx_heap->curHa > 0) { + ctx_heap->curHa--; + } ssl_hint->haFlag = 0; /* set to zero since handshake has been dec */ + #endif + #ifndef SINGLE_THREADED wc_UnLockMutex(&(ctx_heap->memory_mutex)); + #endif #ifdef WOLFSSL_HEAP_TEST } #endif @@ -8167,7 +8712,8 @@ #if !defined(NO_OLD_TLS) || defined(WOLFSSL_DTLS) || \ !defined(WOLFSSL_NO_TLS12) || \ - ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) \ + ((defined(HAVE_CHACHA) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) \ && defined(HAVE_AEAD)) #if defined(WOLFSSL_DTLS) || !defined(WOLFSSL_NO_TLS12) @@ -8291,7 +8837,8 @@ } #endif /* WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 */ #endif /* !NO_OLD_TLS || WOLFSSL_DTLS || !WOLFSSL_NO_TLS12 || - * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM) && HAVE_AEAD) */ + * ((HAVE_CHACHA || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_SM4_GCM || + * WOLFSSL_SM4_CCM) && HAVE_AEAD) */ #ifdef WOLFSSL_DTLS @@ -8573,7 +9120,8 @@ } int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type, - word32 fragOffset, word32 fragSz, void* heap, word32 totalLen) + word32 fragOffset, word32 fragSz, void* heap, word32 totalLen, + byte encrypted) { word32 fragOffsetEnd = fragOffset + fragSz; @@ -8594,11 +9142,13 @@ WOLFSSL_ERROR_VERBOSE(SEQUENCE_ERROR); return SEQUENCE_ERROR; } + msg->encrypted = msg->encrypted && encrypted; } else { msg->type = type; msg->epoch = epoch; msg->seq = seq; + msg->encrypted = encrypted; } if (msg->fragBucketList == NULL) { @@ -8719,6 +9269,7 @@ */ DtlsMsg* head = ssl->dtls_rx_msg_list; + byte encrypted = ssl->keys.decryptedCur == 1; WOLFSSL_ENTER("DtlsMsgStore"); if (head != NULL) { @@ -8727,7 +9278,7 @@ cur = DtlsMsgNew(dataSz, 0, heap); if (cur != NULL) { if (DtlsMsgSet(cur, seq, epoch, data, type, - fragOffset, fragSz, heap, dataSz) < 0) { + fragOffset, fragSz, heap, dataSz, encrypted) < 0) { DtlsMsgDelete(cur, heap); } else { @@ -8739,13 +9290,13 @@ else { /* If this fails, the data is just dropped. */ DtlsMsgSet(cur, seq, epoch, data, type, fragOffset, - fragSz, heap, dataSz); + fragSz, heap, dataSz, encrypted); } } else { head = DtlsMsgNew(dataSz, 0, heap); if (DtlsMsgSet(head, seq, epoch, data, type, fragOffset, - fragSz, heap, dataSz) < 0) { + fragSz, heap, dataSz, encrypted) < 0) { DtlsMsgDelete(head, heap); head = NULL; } @@ -8861,6 +9412,10 @@ ssl->dtls_tx_msg = NULL; ssl->dtls_tx_msg_list_sz = 0; } +#ifdef WOLFSSL_DTLS13 + /* Clear DTLS 1.3 buffer too */ + Dtls13RtxFlushBuffered(ssl, 1); +#endif } @@ -8871,13 +9426,21 @@ * to be used for triggering retransmission of whole DtlsMsgPool. * change cipher suite type is not verified here */ - return ((fragOffset == 0) && - (((ssl->options.side == WOLFSSL_SERVER_END) && - ((type == client_hello) || - ((ssl->options.verifyPeer) && (type == certificate)) || - ((!ssl->options.verifyPeer) && (type == client_key_exchange)))) || - ((ssl->options.side == WOLFSSL_CLIENT_END) && - (type == hello_request || type == server_hello)))); + if (fragOffset == 0) { + if (ssl->options.side == WOLFSSL_SERVER_END) { + if (type == client_hello) + return 1; + else if (ssl->options.verifyPeer && type == certificate) + return 1; + else if (!ssl->options.verifyPeer && type == client_key_exchange) + return 1; + } + else { + if (type == hello_request || type == server_hello) + return 1; + } + } + return 0; } @@ -8977,7 +9540,7 @@ int inputSz, sendSz; input = pool->raw; - inputSz = pool->sz; + inputSz = (int)pool->sz; sendSz = inputSz + cipherExtraData(ssl); #ifdef HAVE_SECURE_RENEGOTIATION @@ -9241,7 +9804,12 @@ #elif defined(FREERTOS) - #include "task.h" + #ifdef PLATFORMIO + #include + #include + #else + #include "task.h" + #endif unsigned int LowResTimer(void) { @@ -9256,6 +9824,13 @@ return sys_now()/1000; } +#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2) + + word32 LowResTimer(void) + { + return (word32)osKernelGetTickCount() / 1000; + } + #elif defined(WOLFSSL_TIRTOS) word32 LowResTimer(void) @@ -9316,7 +9891,12 @@ word32 LowResTimer(void) { - return k_uptime_get() / 1000; + int64_t t; + #if defined(CONFIG_ARCH_POSIX) + k_cpu_idle(); + #endif + t = k_uptime_get(); /* returns current uptime in milliseconds */ + return (word32)(t / 1000); } #elif defined(WOLFSSL_LINUXKM) @@ -9347,7 +9927,8 @@ #endif /* !NO_ASN_TIME */ #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \ - ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ + ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \ + (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH))) /* Store the message for use with CertificateVerify using EdDSA. * @@ -9408,23 +9989,22 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_StoreMessage(ssl, data, sz); - if (ret != 0 && ret != CRYPTOCB_UNAVAILABLE) { + if (ret != 0 && ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { return ret; } #endif /* WOLFSSL_RENESAS_TSIP_TLS */ -#ifndef NO_OLD_TLS - #ifndef NO_SHA - wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz); - #endif - #ifndef NO_MD5 - wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz); - #endif -#endif /* NO_OLD_TLS */ +#if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ + defined(WOLFSSL_ALLOW_TLS_SHA1)) + wc_ShaUpdate(&ssl->hsHashes->hashSha, data, sz); +#endif +#if !defined(NO_MD5) && !defined(NO_OLD_TLS) + wc_Md5Update(&ssl->hsHashes->hashMd5, data, sz); +#endif if (IsAtLeastTLSv1_2(ssl)) { #ifndef NO_SHA256 - ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, sz); + ret = wc_Sha256Update(&ssl->hsHashes->hashSha256, data, (word32)sz); if (ret != 0) return ret; #ifdef WOLFSSL_DEBUG_TLS @@ -9434,7 +10014,7 @@ #endif #endif #ifdef WOLFSSL_SHA384 - ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, sz); + ret = wc_Sha384Update(&ssl->hsHashes->hashSha384, data, (word32)sz); if (ret != 0) return ret; #ifdef WOLFSSL_DEBUG_TLS @@ -9444,7 +10024,7 @@ #endif #endif #ifdef WOLFSSL_SHA512 - ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, sz); + ret = wc_Sha512Update(&ssl->hsHashes->hashSha512, data, (word32)sz); if (ret != 0) return ret; #ifdef WOLFSSL_DEBUG_TLS @@ -9453,8 +10033,19 @@ WOLFSSL_BUFFER(digest, WC_SHA512_DIGEST_SIZE); #endif #endif + #ifdef WOLFSSL_SM3 + ret = wc_Sm3Update(&ssl->hsHashes->hashSm3, data, sz); + if (ret != 0) + return ret; + #ifdef WOLFSSL_DEBUG_TLS + WOLFSSL_MSG("SM3"); + wc_Sm3GetHash(&ssl->hsHashes->hashSm3, digest); + WOLFSSL_BUFFER(digest, WC_SM3_DIGEST_SIZE); + #endif + #endif #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \ - ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ + ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \ + (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH))) ret = EdDSA_Update(ssl, data, sz); if (ret != 0) @@ -9981,11 +10572,13 @@ ssl->buffers.inputBuffer.dynamicFlag = 0; ssl->buffers.inputBuffer.offset = 0; ssl->buffers.inputBuffer.idx = 0; - ssl->buffers.inputBuffer.length = usedLength; + ssl->buffers.inputBuffer.length = (word32)usedLength; } int SendBuffered(WOLFSSL* ssl) { + int retryLimit = WOLFSSL_MODE_AUTO_RETRY_ATTEMPTS; + if (ssl->CBIOSend == NULL && !WOLFSSL_IS_QUIC(ssl)) { WOLFSSL_MSG("Your IO Send callback is null, please set"); return SOCKET_ERROR_E; @@ -10006,15 +10599,22 @@ #endif while (ssl->buffers.outputBuffer.length > 0) { - int sent = ssl->CBIOSend(ssl, - (char*)ssl->buffers.outputBuffer.buffer + - ssl->buffers.outputBuffer.idx, - (int)ssl->buffers.outputBuffer.length, - ssl->IOCB_WriteCtx); + int sent = 0; +retry: + sent = ssl->CBIOSend(ssl, + (char*)ssl->buffers.outputBuffer.buffer + + ssl->buffers.outputBuffer.idx, + (int)ssl->buffers.outputBuffer.length, + ssl->IOCB_WriteCtx); if (sent < 0) { switch (sent) { case WOLFSSL_CBIO_ERR_WANT_WRITE: /* would block */ + if (retryLimit > 0 && ssl->ctx->autoRetry && + !ssl->options.handShakeDone && !ssl->options.dtls) { + retryLimit--; + goto retry; + } return WANT_WRITE; case WOLFSSL_CBIO_ERR_CONN_RST: /* connection reset */ @@ -10089,8 +10689,7 @@ #else const byte align = WOLFSSL_GENERAL_ALIGNMENT; #endif - int newSz = size + ssl->buffers.outputBuffer.idx + - ssl->buffers.outputBuffer.length; + word32 newSz; #if WOLFSSL_GENERAL_ALIGNMENT > 0 /* the encrypted data will be offset from the front of the buffer by @@ -10101,7 +10700,15 @@ align *= 2; #endif - tmp = (byte*)XMALLOC(newSz + align, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER); + if (! WC_SAFE_SUM_WORD32(ssl->buffers.outputBuffer.idx, + ssl->buffers.outputBuffer.length, newSz)) + return BUFFER_E; + if (! WC_SAFE_SUM_WORD32(newSz, (word32)size, newSz)) + return BUFFER_E; + if (! WC_SAFE_SUM_WORD32(newSz, align, newSz)) + return BUFFER_E; + tmp = (byte*)XMALLOC(newSz, ssl->heap, DYNAMIC_TYPE_OUT_BUFFER); + newSz -= align; WOLFSSL_MSG("growing output buffer"); if (tmp == NULL) @@ -10220,7 +10827,7 @@ ssl->buffers.inputBuffer.buffer = tmp; ssl->buffers.inputBuffer.bufferSize = size + usedLength; ssl->buffers.inputBuffer.idx = 0; - ssl->buffers.inputBuffer.length = usedLength; + ssl->buffers.inputBuffer.length = (word32)usedLength; return 0; } @@ -10239,13 +10846,12 @@ #ifdef WOLFSSL_DTLS if (ssl->options.dtls) { - if (size + ssl->buffers.outputBuffer.length > #if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU) - ssl->dtlsMtuSz + word32 mtu = (word32)ssl->dtlsMtuSz; #else - ssl->dtls_expected_rx + word32 mtu = MAX_MTU; #endif - ) { + if ((word32)size + ssl->buffers.outputBuffer.length > mtu) { int ret; WOLFSSL_MSG("CheckAvailableSize() flushing buffer " "to make room for new message"); @@ -10253,12 +10859,7 @@ return ret; } } - if (size > (int) -#if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU) - ssl->dtlsMtuSz -#else - ssl->dtls_expected_rx -#endif + if ((word32)size > mtu #ifdef WOLFSSL_DTLS13 /* DTLS1.3 uses the output buffer to store the full message and deal with fragmentation later in dtls13HandshakeSend() */ @@ -10281,6 +10882,290 @@ return 0; } +#ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS + +int MsgCheckEncryption(WOLFSSL* ssl, byte type, byte encrypted) +{ +#ifdef WOLFSSL_QUIC + /* QUIC protects messages outside of the TLS scope */ + if (WOLFSSL_IS_QUIC(ssl) && IsAtLeastTLSv1_3(ssl->version)) + return 0; +#endif + /* Verify which messages always have to be encrypted */ + if (IsAtLeastTLSv1_3(ssl->version)) { + switch ((enum HandShakeType)type) { + case client_hello: + case server_hello: + case hello_verify_request: + case hello_retry_request: + case change_cipher_hs: + if (encrypted) { + WOLFSSL_MSG("Message can not be encrypted"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case hello_request: + case session_ticket: + case end_of_early_data: + case encrypted_extensions: + case certificate: + case server_key_exchange: + case certificate_request: + case server_hello_done: + case certificate_verify: + case client_key_exchange: + case finished: + case certificate_status: + case key_update: + if (!encrypted) { + WOLFSSL_MSG("Message always has to be encrypted"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case message_hash: + case no_shake: + default: + WOLFSSL_MSG("Unknown message type"); + WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E); + return SANITY_MSG_E; + } + } + else { + switch ((enum HandShakeType)type) { + case client_hello: + if ((IsSCR(ssl) || ssl->options.handShakeDone) && !encrypted) { + WOLFSSL_MSG("Message has to be encrypted for SCR"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case server_hello: + case hello_verify_request: + case hello_retry_request: + case certificate: + case server_key_exchange: + case certificate_request: + case server_hello_done: + case certificate_verify: + case client_key_exchange: + case certificate_status: + case session_ticket: + case change_cipher_hs: + if (IsSCR(ssl)) { + if (!encrypted) { + WOLFSSL_MSG("Message has to be encrypted during SCR"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + } + else if (encrypted) { + WOLFSSL_MSG("Message can not be encrypted in regular " + "handshake"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case hello_request: + case finished: + if (!encrypted) { + WOLFSSL_MSG("Message always has to be encrypted"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case key_update: + case encrypted_extensions: + case end_of_early_data: + case message_hash: + case no_shake: + default: + WOLFSSL_MSG("Unknown message type"); + WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E); + return SANITY_MSG_E; + } + } + return 0; +} + +static WC_INLINE int isLastMsg(const WOLFSSL* ssl, word32 msgSz) +{ + word32 extra = 0; + if (IsEncryptionOn(ssl, 0)) { + extra = ssl->keys.padSz; +#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) + if (ssl->options.startedETMRead) + extra += MacSize(ssl); +#endif + } + return (ssl->buffers.inputBuffer.idx - ssl->curStartIdx) + msgSz + extra + == ssl->curSize; +} + +/* Check if the msg is the last msg in a record. This is also an easy way + * to check that a record doesn't span different key boundaries. */ +static int MsgCheckBoundary(const WOLFSSL* ssl, byte type, + byte version_negotiated, word32 msgSz) +{ + if (version_negotiated) { + if (IsAtLeastTLSv1_3(ssl->version)) { + switch ((enum HandShakeType)type) { + case hello_request: + case client_hello: + case server_hello: + case hello_verify_request: + case hello_retry_request: + case finished: + case end_of_early_data: + if (!isLastMsg(ssl, msgSz)) { + WOLFSSL_MSG("Message type is not last in record"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case session_ticket: + case encrypted_extensions: + case certificate: + case server_key_exchange: + case certificate_request: + case certificate_verify: + case client_key_exchange: + case certificate_status: + case key_update: + case change_cipher_hs: + break; + case server_hello_done: + case message_hash: + case no_shake: + default: + WOLFSSL_MSG("Unknown message type"); + WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E); + return SANITY_MSG_E; + } + } + else { + switch ((enum HandShakeType)type) { + case hello_request: + case client_hello: + case hello_verify_request: + if (!isLastMsg(ssl, msgSz)) { + WOLFSSL_MSG("Message type is not last in record"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case server_hello: + case session_ticket: + case end_of_early_data: + case certificate: + case server_key_exchange: + case certificate_request: + case server_hello_done: + case certificate_verify: + case client_key_exchange: + case finished: + case certificate_status: + case change_cipher_hs: + break; + case hello_retry_request: + case encrypted_extensions: + case key_update: + case message_hash: + case no_shake: + default: + WOLFSSL_MSG("Unknown message type"); + WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E); + return SANITY_MSG_E; + } + } + } + else { + switch ((enum HandShakeType)type) { + case hello_request: + case client_hello: + case hello_verify_request: + if (!isLastMsg(ssl, msgSz)) { + WOLFSSL_MSG("Message type is not last in record"); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } + break; + case server_hello: + case session_ticket: + case end_of_early_data: + case hello_retry_request: + case encrypted_extensions: + case certificate: + case server_key_exchange: + case certificate_request: + case server_hello_done: + case certificate_verify: + case client_key_exchange: + case finished: + case certificate_status: + case key_update: + case change_cipher_hs: + break; + case message_hash: + case no_shake: + default: + WOLFSSL_MSG("Unknown message type"); + WOLFSSL_ERROR_VERBOSE(SANITY_MSG_E); + return SANITY_MSG_E; + } + } + return 0; +} + +#endif /* WOLFSSL_DISABLE_EARLY_SANITY_CHECKS */ + +/** + * This check is performed as soon as the handshake message type becomes known. + * These checks can not be delayed and need to be performed when the msg is + * received and not when it is processed (fragmentation may cause messages to + * be processed at a later time). This function CAN NOT be called on stored + * messages as it relies on the state of the WOLFSSL object right after + * receiving the message. + * + * @param ssl The current connection + * @param type The enum HandShakeType of the current message + * @param msgSz Size of the current message + * @return int (less than 0 on fail, 0 on success) + */ +int EarlySanityCheckMsgReceived(WOLFSSL* ssl, byte type, word32 msgSz) +{ + int ret = 0; +#ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS + /* Version has only been negotiated after we either send or process a + * ServerHello message */ + byte version_negotiated = ssl->options.serverState >= SERVER_HELLO_COMPLETE; + + WOLFSSL_ENTER("EarlySanityCheckMsgReceived"); + + if (version_negotiated) + ret = MsgCheckEncryption(ssl, type, ssl->keys.decryptedCur == 1); + + if (ret == 0) + ret = MsgCheckBoundary(ssl, type, version_negotiated, msgSz); + + if (ret != 0 +#ifdef WOLFSSL_DTLS + && ssl->options.dtls && ssl->options.dtlsStateful +#endif + ) + SendAlert(ssl, alert_fatal, unexpected_message); + + WOLFSSL_LEAVE("EarlySanityCheckMsgReceived", ret); +#else + (void)ssl; + (void)type; + (void)msgSz; +#endif + + return ret; +} + #ifdef WOLFSSL_DTLS13 static int GetInputData(WOLFSSL *ssl, word32 size); static int GetDtls13RecordHeader(WOLFSSL* ssl, word32* inOutIdx, @@ -10397,11 +11282,14 @@ int ret; if (Dtls13IsUnifiedHeader(*(ssl->buffers.inputBuffer.buffer + *inOutIdx))) { + ssl->options.seenUnifiedHdr = 1; /* We can send ACKs to the peer */ /* version 1.3 already negotiated */ if (ssl->options.tls1_3) { ret = GetDtls13RecordHeader(ssl, inOutIdx, rh, size); - if (ret == 0 || ret != SEQUENCE_ERROR || ret != DTLS_CID_ERROR) + if (ret == 0 || + ret != WC_NO_ERR_TRACE(SEQUENCE_ERROR) || + ret != WC_NO_ERR_TRACE(DTLS_CID_ERROR)) return ret; } @@ -10423,7 +11311,7 @@ if (ssl->buffers.inputBuffer.length - *inOutIdx < DTLS_RECORD_HEADER_SZ) { ret = GetInputData(ssl, DTLS_RECORD_HEADER_SZ); /* Check if Dtls13RtxTimeout(ssl) returned socket error */ - if (ret == SOCKET_ERROR_E) + if (ret == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) return ret; if (ret != 0) return LENGTH_ERROR; @@ -10492,7 +11380,13 @@ ssl->fuzzerCb(ssl, ssl->buffers.inputBuffer.buffer + *inOutIdx, RECORD_HEADER_SZ, FUZZ_HEAD, ssl->fuzzerCtx); #endif - XMEMCPY(rh, ssl->buffers.inputBuffer.buffer + *inOutIdx, RECORD_HEADER_SZ); + /* Set explicitly rather than make assumptions on struct layout */ + rh->type = ssl->buffers.inputBuffer.buffer[*inOutIdx]; + rh->pvMajor = ssl->buffers.inputBuffer.buffer[*inOutIdx + 1]; + rh->pvMinor = ssl->buffers.inputBuffer.buffer[*inOutIdx + 2]; + rh->length[0] = ssl->buffers.inputBuffer.buffer[*inOutIdx + 3]; + rh->length[1] = ssl->buffers.inputBuffer.buffer[*inOutIdx + 4]; + *inOutIdx += RECORD_HEADER_SZ; ato16(rh->length, size); } @@ -10555,7 +11449,20 @@ } } #endif /* WOLFSSL_DTLS13 */ - else { + /* Don't care about protocol version being lower than expected on alerts + * sent back before version negotitation. */ + else if (!(ssl->options.side == WOLFSSL_CLIENT_END && + ssl->options.connectState == CLIENT_HELLO_SENT && + rh->type == alert && + rh->pvMajor == ssl->version.major && + #ifdef WOLFSSL_DTLS + ((ssl->options.dtls && rh->pvMinor == DTLS_MINOR) || + (!ssl->options.dtls && + rh->pvMinor < ssl->version.minor)) + #else + rh->pvMinor < ssl->version.minor + #endif + )) { WOLFSSL_MSG("SSL version error"); WOLFSSL_ERROR_VERBOSE(VERSION_ERROR); return VERSION_ERROR; /* only use requested version */ @@ -10725,7 +11632,7 @@ if (ret == 0) ret = wc_Md5Update(md5, sender, SIZEOF_SENDER); if (ret == 0) - ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN); + ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN); if (ret == 0) ret = wc_Md5Update(md5, PAD1, PAD_MD5); if (ret == 0) @@ -10735,7 +11642,7 @@ if (ret == 0) { ret = wc_InitMd5_ex(md5, ssl->heap, ssl->devId); if (ret == 0) { - ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN); + ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN); if (ret == 0) ret = wc_Md5Update(md5, PAD2, PAD_MD5); if (ret == 0) @@ -10771,7 +11678,7 @@ if (ret == 0) ret = wc_ShaUpdate(sha, sender, SIZEOF_SENDER); if (ret == 0) - ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN); + ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN); if (ret == 0) ret = wc_ShaUpdate(sha, PAD1, PAD_SHA); if (ret == 0) @@ -10781,7 +11688,7 @@ if (ret == 0) { ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId); if (ret == 0) { - ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN); + ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN); if (ret == 0) ret = wc_ShaUpdate(sha, PAD2, PAD_SHA); if (ret == 0) @@ -10833,31 +11740,19 @@ #endif /* WOLFSSL_NO_TLS12 */ #if !defined(NO_WOLFSSL_SERVER) || !defined(NO_WOLFSSL_CLIENT) - /* cipher requirements */ - enum { - REQUIRES_RSA, - REQUIRES_DHE, - REQUIRES_ECC, - REQUIRES_ECC_STATIC, - REQUIRES_PSK, - REQUIRES_RSA_SIG, - REQUIRES_AEAD - }; - +/* Does this cipher suite (first, second) have the requirement + an ephemeral key exchange will still require the key for signing + the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */ +int CipherRequires(byte first, byte second, int requirement) +{ - /* Does this cipher suite (first, second) have the requirement - an ephemeral key exchange will still require the key for signing - the key exchange so ECDHE_RSA requires an rsa key thus rsa_kea */ - static int CipherRequires(byte first, byte second, int requirement) - { - - (void)requirement; + (void)requirement; #ifndef WOLFSSL_NO_TLS12 #ifdef HAVE_CHACHA - if (first == CHACHA_BYTE) { + if (first == CHACHA_BYTE) { switch (second) { case TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 : @@ -10911,208 +11806,220 @@ if (requirement == REQUIRES_DHE) return 1; break; + + default: + WOLFSSL_MSG("Unsupported cipher suite, CipherRequires CHACHA"); + return 0; } if (requirement == REQUIRES_AEAD) return 1; - } + } #endif /* HAVE_CHACHA */ - /* ECC extensions */ - if (first == ECC_BYTE) { + /* ECC extensions */ + if (first == ECC_BYTE) { switch (second) { #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) #ifndef NO_RSA - case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - break; + case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + break; - #ifndef NO_DES3 - case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + #ifndef NO_DES3 + case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - break; - #endif /* !NO_DES3 */ + case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + break; + #endif /* !NO_DES3 */ - #ifndef NO_RC4 - case TLS_ECDHE_RSA_WITH_RC4_128_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + #ifndef NO_RC4 + case TLS_ECDHE_RSA_WITH_RC4_128_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_ECDH_RSA_WITH_RC4_128_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - break; - #endif /* !NO_RC4 */ + case TLS_ECDH_RSA_WITH_RC4_128_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + break; + #endif /* !NO_RC4 */ #endif /* NO_RSA */ - #ifndef NO_DES3 - case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA : - if (requirement == REQUIRES_ECC) - return 1; - break; + #ifndef NO_DES3 + case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA : + if (requirement == REQUIRES_ECC) + return 1; + break; - case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - break; - #endif /* !NO_DES3 */ - #ifndef NO_RC4 - case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA : - if (requirement == REQUIRES_ECC) - return 1; - break; + case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + break; + #endif /* !NO_DES3 */ + #ifndef NO_RC4 + case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA : + if (requirement == REQUIRES_ECC) + return 1; + break; - case TLS_ECDH_ECDSA_WITH_RC4_128_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - break; - #endif /* !NO_RC4 */ - #ifndef NO_RSA - case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_ECDH_ECDSA_WITH_RC4_128_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + break; + #endif /* !NO_RC4 */ + #ifndef NO_RSA + case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - break; - #endif /* !NO_RSA */ + case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + break; + #endif /* !NO_RSA */ - case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA : - if (requirement == REQUIRES_ECC) - return 1; - break; + case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA : + if (requirement == REQUIRES_ECC) + return 1; + break; - case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - break; + case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + break; - case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA : - if (requirement == REQUIRES_ECC) - return 1; - break; + case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA : + if (requirement == REQUIRES_ECC) + return 1; + break; - case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - break; + case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + break; - case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 : - if (requirement == REQUIRES_ECC) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 : + if (requirement == REQUIRES_ECC) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_ECC) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_ECC) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ #ifndef NO_RSA #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) - case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_ECC_STATIC) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_ECC_STATIC) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ #ifdef HAVE_AESCCM - case TLS_RSA_WITH_AES_128_CCM_8 : - case TLS_RSA_WITH_AES_256_CCM_8 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_RSA_WITH_AES_128_CCM_8 : + case TLS_RSA_WITH_AES_256_CCM_8 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; #endif /* HAVE_AESCCM */ #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) - case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 : - case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 : + case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 : - case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 : - if (requirement == REQUIRES_RSA_SIG) - return 1; - if (requirement == REQUIRES_ECC_STATIC) - return 1; - break; + case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 : + case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 : + if (requirement == REQUIRES_RSA_SIG) + return 1; + if (requirement == REQUIRES_ECC_STATIC) + return 1; + break; #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ #endif /* !NO_RSA */ +#ifdef HAVE_ARIA + case TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 : + case TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 : + if (requirement == REQUIRES_ECC) + return 1; + break; +#endif /* HAVE_ARIA */ + #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) case TLS_ECDHE_ECDSA_WITH_AES_128_CCM : case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 : @@ -11123,315 +12030,363 @@ return 1; break; - case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 : - case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 : - if (requirement == REQUIRES_ECC) - return 1; - break; + case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 : + case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 : + if (requirement == REQUIRES_ECC) + return 1; + break; - case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 : - case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 : - if (requirement == REQUIRES_ECC) - return 1; - if (requirement == REQUIRES_ECC_STATIC) - return 1; - break; -#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ + case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 : + case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 : + if (requirement == REQUIRES_ECC) + return 1; + if (requirement == REQUIRES_ECC_STATIC) + return 1; + break; + #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ -#ifndef NO_PSK - case TLS_PSK_WITH_AES_128_CCM: - case TLS_PSK_WITH_AES_256_CCM: - case TLS_PSK_WITH_AES_128_CCM_8: - case TLS_PSK_WITH_AES_256_CCM_8: - if (requirement == REQUIRES_PSK) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + #ifndef NO_PSK + case TLS_PSK_WITH_AES_128_CCM: + case TLS_PSK_WITH_AES_256_CCM: + case TLS_PSK_WITH_AES_128_CCM_8: + case TLS_PSK_WITH_AES_256_CCM_8: + if (requirement == REQUIRES_PSK) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_DHE_PSK_WITH_AES_128_CCM: - case TLS_DHE_PSK_WITH_AES_256_CCM: - if (requirement == REQUIRES_PSK) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; -#endif /* !NO_PSK */ -#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) - case TLS_ECDHE_ECDSA_WITH_NULL_SHA : - if (requirement == REQUIRES_ECC) - return 1; - break; + case TLS_DHE_PSK_WITH_AES_128_CCM: + case TLS_DHE_PSK_WITH_AES_256_CCM: + if (requirement == REQUIRES_PSK) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; + #endif /* !NO_PSK */ + #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) + case TLS_ECDHE_ECDSA_WITH_NULL_SHA : + if (requirement == REQUIRES_ECC) + return 1; + break; - case TLS_ECDHE_PSK_WITH_NULL_SHA256 : - if (requirement == REQUIRES_PSK) - return 1; - break; + case TLS_ECDHE_PSK_WITH_NULL_SHA256 : + if (requirement == REQUIRES_PSK) + return 1; + break; - case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 : - if (requirement == REQUIRES_PSK) - return 1; - break; -#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ + case TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 : + if (requirement == REQUIRES_PSK) + return 1; + break; + #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ -#if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER) - case TLS_SHA256_SHA256: - break; - case TLS_SHA384_SHA384: - break; -#endif + #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER) + case TLS_SHA256_SHA256: + break; + case TLS_SHA384_SHA384: + break; + #endif - default: - WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC"); - return 0; + default: + WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC"); + return 0; } /* switch */ - } /* if */ + } /* if */ - /* ECC extensions */ - if (first == ECDHE_PSK_BYTE) { + /* ECC extensions */ + if (first == ECDHE_PSK_BYTE) { switch (second) { -#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) - case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 : - if (requirement == REQUIRES_PSK) - return 1; - break; -#endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ - default: - WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK"); - return 0; + #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) + case TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256 : + if (requirement == REQUIRES_PSK) + return 1; + break; + #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ + default: + WOLFSSL_MSG("Unsupported cipher suite, CipherRequires ECC PSK"); + return 0; } /* switch */ - } /* if */ + } /* if */ #endif /* !WOLFSSL_NO_TLS12 */ - /* Distinct TLS v1.3 cipher suites with cipher and digest only. */ - if (first == TLS13_BYTE) { - - switch (second) { #ifdef WOLFSSL_TLS13 + /* Distinct TLS v1.3 cipher suites with cipher and digest only. */ + if (first == TLS13_BYTE) { + + switch (second) { case TLS_AES_128_GCM_SHA256: case TLS_AES_256_GCM_SHA384: case TLS_CHACHA20_POLY1305_SHA256: case TLS_AES_128_CCM_SHA256: case TLS_AES_128_CCM_8_SHA256: - break; -#endif + if (requirement == REQUIRES_AEAD) + return 1; + return 0; default: WOLFSSL_MSG("Unsupported cipher suite, CipherRequires " "TLS v1.3"); return 0; - } } + } + +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4) + if (first == CIPHER_BYTE) { + /* Other cipher suites for TLS 1.2 below. */ + switch (second) { + #if defined(WOLFSSL_SM4_GCM) + case TLS_SM4_GCM_SM3: + return 0; + break; + #endif + #if defined(WOLFSSL_SM4_CCM) + case TLS_SM4_CCM_SM3: + return 0; + break; + #endif + } + } +#endif /* WOLFSSL_SM2 && WOLFSSL_SM3 && WOLFSSL_SM4 */ +#endif /* WOLFSSL_TLS13 */ #ifndef WOLFSSL_NO_TLS12 - if (first != ECC_BYTE && first != CHACHA_BYTE && - first != TLS13_BYTE && first != ECDHE_PSK_BYTE) { +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && defined(WOLFSSL_SM4) + if (first == SM_BYTE) { + switch (second) { + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + case TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3: + if (requirement == REQUIRES_ECC) + return 1; + break; + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + case TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3: + if (requirement == REQUIRES_ECC) + return 1; + break; + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + case TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3: + if (requirement == REQUIRES_ECC) + return 1; + break; + #endif + + default: + WOLFSSL_MSG("Unsupported cipher suite, CipherRequires SM"); + return 0; + } + } +#endif + + if (first == CIPHER_BYTE) { /* normal suites */ switch (second) { -#ifndef NO_RSA - #ifndef NO_RC4 - case SSL_RSA_WITH_RC4_128_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + #ifndef NO_RSA + #ifndef NO_RC4 + case SSL_RSA_WITH_RC4_128_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case SSL_RSA_WITH_RC4_128_MD5 : - if (requirement == REQUIRES_RSA) - return 1; - break; - #endif /* NO_RC4 */ + case SSL_RSA_WITH_RC4_128_MD5 : + if (requirement == REQUIRES_RSA) + return 1; + break; + #endif /* NO_RC4 */ - case SSL_RSA_WITH_3DES_EDE_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + case SSL_RSA_WITH_3DES_EDE_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_RSA_WITH_AES_128_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_RSA_WITH_AES_128_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_RSA_WITH_AES_128_CBC_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_RSA_WITH_AES_128_CBC_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_RSA_WITH_AES_256_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_RSA_WITH_AES_256_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_RSA_WITH_AES_256_CBC_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_RSA_WITH_AES_256_CBC_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_RSA_WITH_NULL_MD5 : - case TLS_RSA_WITH_NULL_SHA : - case TLS_RSA_WITH_NULL_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - break; + case TLS_RSA_WITH_NULL_MD5 : + case TLS_RSA_WITH_NULL_SHA : + case TLS_RSA_WITH_NULL_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + break; -#endif /* !NO_RSA */ + #endif /* !NO_RSA */ -#ifndef NO_PSK - case TLS_PSK_WITH_AES_128_GCM_SHA256 : - if (requirement == REQUIRES_PSK) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + #ifndef NO_PSK + case TLS_PSK_WITH_AES_128_GCM_SHA256 : + if (requirement == REQUIRES_PSK) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_PSK_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_PSK) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_PSK_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_PSK) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_PSK_WITH_AES_128_CBC_SHA256 : - case TLS_PSK_WITH_AES_256_CBC_SHA384 : - case TLS_PSK_WITH_AES_128_CBC_SHA : - case TLS_PSK_WITH_AES_256_CBC_SHA : - case TLS_PSK_WITH_NULL_SHA384 : - case TLS_PSK_WITH_NULL_SHA256 : - case TLS_PSK_WITH_NULL_SHA : - if (requirement == REQUIRES_PSK) - return 1; - break; + case TLS_PSK_WITH_AES_128_CBC_SHA256 : + case TLS_PSK_WITH_AES_256_CBC_SHA384 : + case TLS_PSK_WITH_AES_128_CBC_SHA : + case TLS_PSK_WITH_AES_256_CBC_SHA : + case TLS_PSK_WITH_NULL_SHA384 : + case TLS_PSK_WITH_NULL_SHA256 : + case TLS_PSK_WITH_NULL_SHA : + if (requirement == REQUIRES_PSK) + return 1; + break; - case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 : - case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_DHE) - return 1; - if (requirement == REQUIRES_PSK) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 : + case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_DHE) + return 1; + if (requirement == REQUIRES_PSK) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 : - case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 : - case TLS_DHE_PSK_WITH_NULL_SHA384 : - case TLS_DHE_PSK_WITH_NULL_SHA256 : - if (requirement == REQUIRES_DHE) - return 1; - if (requirement == REQUIRES_PSK) - return 1; - break; -#endif /* NO_PSK */ + case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 : + case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 : + case TLS_DHE_PSK_WITH_NULL_SHA384 : + case TLS_DHE_PSK_WITH_NULL_SHA256 : + if (requirement == REQUIRES_DHE) + return 1; + if (requirement == REQUIRES_PSK) + return 1; + break; + #endif /* NO_PSK */ -#ifndef NO_RSA - case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - break; + #ifndef NO_RSA + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + break; - case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - break; + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + break; - case TLS_DHE_RSA_WITH_AES_128_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - break; + case TLS_DHE_RSA_WITH_AES_128_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + break; - case TLS_DHE_RSA_WITH_AES_256_CBC_SHA : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - break; + case TLS_DHE_RSA_WITH_AES_256_CBC_SHA : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + break; - case TLS_RSA_WITH_AES_128_GCM_SHA256 : - case TLS_RSA_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_RSA_WITH_AES_128_GCM_SHA256 : + case TLS_RSA_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; - case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 : - case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; + case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 : + case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; -#ifdef HAVE_CAMELLIA - case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA : - case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA : - case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 : - case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - break; + #ifdef HAVE_CAMELLIA + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA : + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA : + case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 : + case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + break; - case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA : - case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA : - case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 : - case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 : - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - break; -#endif /* HAVE_CAMELLIA */ + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA : + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA : + case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 : + case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 : + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + break; + #endif /* HAVE_CAMELLIA */ - case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: - if (requirement == REQUIRES_RSA) - return 1; - if (requirement == REQUIRES_RSA_SIG) - return 1; - if (requirement == REQUIRES_DHE) - return 1; - break; -#endif -#ifdef HAVE_ANON - case TLS_DH_anon_WITH_AES_128_CBC_SHA : - if (requirement == REQUIRES_DHE) - return 1; - break; - case TLS_DH_anon_WITH_AES_256_GCM_SHA384: - if (requirement == REQUIRES_DHE) - return 1; - if (requirement == REQUIRES_AEAD) - return 1; - break; -#endif -#ifdef WOLFSSL_MULTICAST - case WDM_WITH_NULL_SHA256 : - break; -#endif + case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA: + if (requirement == REQUIRES_RSA) + return 1; + if (requirement == REQUIRES_RSA_SIG) + return 1; + if (requirement == REQUIRES_DHE) + return 1; + break; + #endif /* !NO_RSA */ + #ifdef HAVE_ANON + case TLS_DH_anon_WITH_AES_128_CBC_SHA : + if (requirement == REQUIRES_DHE) + return 1; + break; + case TLS_DH_anon_WITH_AES_256_GCM_SHA384: + if (requirement == REQUIRES_DHE) + return 1; + if (requirement == REQUIRES_AEAD) + return 1; + break; + #endif + #ifdef WOLFSSL_MULTICAST + case WDM_WITH_NULL_SHA256 : + break; + #endif - default: - WOLFSSL_MSG("Unsupported cipher suite, CipherRequires"); - return 0; + default: + WOLFSSL_MSG("Unsupported cipher suite, CipherRequires"); + return 0; } /* switch */ - } /* if ECC / Normal suites else */ + } /* if ECC / Normal suites else */ #endif /* !WOLFSSL_NO_TLS12 */ - return 0; - } + return 0; +} #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */ @@ -11444,50 +12399,77 @@ *.z.com matches y.z.com but not x.y.z.com return 1 on success */ -int MatchDomainName(const char* pattern, int len, const char* str) +int MatchDomainName(const char* pattern, int patternLen, const char* str, + word32 strLen) { int ret = 0; - if (pattern == NULL || str == NULL || len <= 0) + if (pattern == NULL || str == NULL || patternLen <= 0 || strLen == 0) return 0; - while (len > 0) { - - char p = (char)XTOLOWER((unsigned char)*pattern++); + while (patternLen > 0) { + /* Get the next pattern char to evaluate */ + char p = (char)XTOLOWER((unsigned char)*pattern); if (p == '\0') break; + pattern++; + if (p == '*') { char s; + /* We will always match '*' */ + patternLen--; + + /* Consume any extra '*' chars until the next non '*' char. */ + while (patternLen > 0) { + p = (char)XTOLOWER((unsigned char)*pattern); + pattern++; + if (p == '\0' && patternLen > 0) + return 0; + if (p != '*') + break; - while (--len > 0 && - (p = (char)XTOLOWER((unsigned char)*pattern++)) == '*') { + patternLen--; } - if (len == 0) - p = '\0'; + /* Consume str until we reach next char in pattern after '*' or + * end of string */ + while (strLen > 0) { + s = (char)XTOLOWER((unsigned char) *str); + str++; + strLen--; + + /* p is next char in pattern after '*', or '*' if '*' is the + * last char in the pattern (in which case patternLen is 1) */ + if ( ((s == p) && (patternLen > 0))) { + /* We had already counted the '*' as matched, this means + * we also matched the next non '*' char in pattern */ + patternLen--; + break; + } - while ( (s = (char)XTOLOWER((unsigned char) *str)) != '\0') { - if (s == p) + /* If strlen is 0, we have consumed the entire string. Count that + * as a match of '*' */ + if (strLen == 0) { break; + } + if (s == '.') return 0; - str++; } } else { + /* Simple case, pattern match exactly */ if (p != (char)XTOLOWER((unsigned char) *str)) return 0; - } - - if (len > 0) { str++; - len--; + strLen--; + patternLen--; } } - if (*str == '\0' && len == 0) { + if (strLen == 0 && patternLen == 0) { ret = 1; /* success */ } @@ -11499,14 +12481,16 @@ * Fail if there are wild patterns and they didn't match. * Check the common name if no alternative names matched. * - * dCert Decoded cert to get the alternative names from. - * domain Domain name to compare against. - * checkCN Whether to check the common name. - * returns 1 : match was found. - * 0 : no match found. - * -1 : No matches and wild pattern match failed. + * dCert Decoded cert to get the alternative names from. + * domain Domain name to compare against. + * domainLen Length of the domain name. + * checkCN Whether to check the common name. + * returns 1 : match was found. + * 0 : no match found. + * -1 : No matches and wild pattern match failed. */ -int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN) +int CheckForAltNames(DecodedCert* dCert, const char* domain, word32 domainLen, + int* checkCN) { int match = 0; DNS_entry* altName = NULL; @@ -11534,10 +12518,10 @@ #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */ { buf = altName->name; - len = altName->len; + len = (word32)altName->len; } - if (MatchDomainName(buf, len, domain)) { + if (MatchDomainName(buf, (int)len, domain, domainLen)) { match = 1; if (checkCN != NULL) { *checkCN = 0; @@ -11569,12 +12553,11 @@ int CheckHostName(DecodedCert* dCert, const char *domainName, size_t domainNameLen) { int checkCN; - int ret = DOMAIN_NAME_MISMATCH; - - /* Assume name is NUL terminated. */ - (void)domainNameLen; + int ret = WC_NO_ERR_TRACE(DOMAIN_NAME_MISMATCH); - if (CheckForAltNames(dCert, domainName, &checkCN) != 1) { + if (CheckForAltNames(dCert, domainName, (word32)domainNameLen, + &checkCN) != 1) { + ret = DOMAIN_NAME_MISMATCH; WOLFSSL_MSG("DomainName match on alt names failed"); } else { @@ -11584,10 +12567,11 @@ #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY if (checkCN == 1) { if (MatchDomainName(dCert->subjectCN, dCert->subjectCNLen, - domainName) == 1) { + domainName, (word32)domainNameLen) == 1) { ret = 0; } else { + ret = DOMAIN_NAME_MISMATCH; WOLFSSL_MSG("DomainName match on common name failed"); } } @@ -11610,7 +12594,7 @@ { if (chain->count < MAX_CHAIN_DEPTH && certSz < MAX_X509_SIZE) { - chain->certs[chain->count].length = certSz; + chain->certs[chain->count].length = (int)certSz; XMEMCPY(chain->certs[chain->count].buffer, certBuf, certSz); chain->count++; } @@ -11622,15 +12606,22 @@ #if defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \ defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) -static void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType) +void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType) { + if (name->dynamicName) { + XFREE(name->name, name->heap, DYNAMIC_TYPE_X509); + name->name = name->staticName; + name->dynamicName = 0; + } + if (nameType == SUBJECT) { XSTRNCPY(name->name, dCert->subject, ASN_NAME_MAX); name->name[ASN_NAME_MAX - 1] = '\0'; name->sz = (int)XSTRLEN(name->name) + 1; #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) name->rawLen = min(dCert->subjectRawLen, ASN_NAME_MAX); - XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen); + if (name->rawLen > 0) + XMEMCPY(name->raw, dCert->subjectRaw, name->rawLen); #endif } else { @@ -11640,59 +12631,44 @@ #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY)) \ && (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT)) name->rawLen = min(dCert->issuerRawLen, ASN_NAME_MAX); - if (name->rawLen) { + if (name->rawLen > 0) { XMEMCPY(name->raw, dCert->issuerRaw, name->rawLen); } #endif } } - -#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ - !defined(IGNORE_NAME_CONSTRAINTS) -/* copies over additional alt names such as dirName - * returns 0 on success - */ -static int CopyAdditionalAltNames(DNS_entry** to, DNS_entry* from, int type, - void* heap) +static int CopyAltNames(DNS_entry** to, DNS_entry* from, int type, void* heap) { - DNS_entry* cur = from; + /* Copy from to the beginning of to */ + DNS_entry** prev_next = to; + DNS_entry* next; if (to == NULL) { return BAD_FUNC_ARG; } - while (cur != NULL) { - if (cur->type == type) { - DNS_entry* dnsEntry; - int strLen = cur->len; - - dnsEntry = AltNameNew(heap); - if (dnsEntry == NULL) { - WOLFSSL_MSG("\tOut of Memory"); - return MEMORY_E; - } + next = *to; - dnsEntry->type = type; - dnsEntry->name = (char*)XMALLOC(strLen + 1, heap, - DYNAMIC_TYPE_ALTNAME); - if (dnsEntry->name == NULL) { - WOLFSSL_MSG("\tOut of Memory"); - XFREE(dnsEntry, heap, DYNAMIC_TYPE_ALTNAME); - return MEMORY_E; - } - dnsEntry->len = strLen; - XMEMCPY(dnsEntry->name, cur->name, strLen); - dnsEntry->name[strLen] = '\0'; + for (; from != NULL; from = from->next) { + DNS_entry* dnsEntry; + + if (type != -1 && from->type != type) + continue; - dnsEntry->next = *to; - *to = dnsEntry; + dnsEntry = AltNameDup(from, heap); + if (dnsEntry == NULL) { + WOLFSSL_MSG("\tOut of Memory"); + return MEMORY_E; } - cur = cur->next; + + dnsEntry->next = next; + *prev_next = dnsEntry; + prev_next = &dnsEntry->next; } + return 0; } -#endif /* OPENSSL_EXTRA */ #ifdef WOLFSSL_CERT_REQ static int CopyREQAttributes(WOLFSSL_X509* x509, DecodedCert* dCert) @@ -11807,8 +12783,6 @@ #endif /* WOLFSSL_CERT_REQ */ /* Copy parts X509 needs from Decoded cert, 0 on success */ -/* The same DecodedCert cannot be copied to WOLFSSL_X509 twice otherwise the - * altNames pointers could be free'd by second x509 still active by first */ int CopyDecodedToX509(WOLFSSL_X509* x509, DecodedCert* dCert) { int ret = 0; @@ -11888,7 +12862,7 @@ { int minSz; if (dCert->beforeDateLen > 0) { - minSz = min(dCert->beforeDate[1], MAX_DATE_SZ); + minSz = (int)min(dCert->beforeDate[1], MAX_DATE_SZ); x509->notBefore.type = dCert->beforeDate[0]; x509->notBefore.length = minSz; XMEMCPY(x509->notBefore.data, &dCert->beforeDate[2], minSz); @@ -11896,7 +12870,7 @@ else x509->notBefore.length = 0; if (dCert->afterDateLen > 0) { - minSz = min(dCert->afterDate[1], MAX_DATE_SZ); + minSz = (int)min(dCert->afterDate[1], MAX_DATE_SZ); x509->notAfter.type = dCert->afterDate[0]; x509->notAfter.length = minSz; XMEMCPY(x509->notAfter.data, &dCert->afterDate[2], minSz); @@ -11909,7 +12883,7 @@ x509->pubKey.buffer = (byte*)XMALLOC( dCert->pubKeySize, x509->heap, DYNAMIC_TYPE_PUBLIC_KEY); if (x509->pubKey.buffer != NULL) { - x509->pubKeyOID = dCert->keyOID; + x509->pubKeyOID = (int)dCert->keyOID; x509->pubKey.length = dCert->pubKeySize; XMEMCPY(x509->pubKey.buffer, dCert->publicKey, dCert->pubKeySize); } @@ -11917,7 +12891,7 @@ ret = MEMORY_E; #if defined(OPENSSL_ALL) if (ret == 0) { - x509->key.pubKeyOID = dCert->keyOID; + x509->key.pubKeyOID = (int)dCert->keyOID; if (!x509->key.algor) { x509->key.algor = wolfSSL_X509_ALGOR_new(); @@ -11955,7 +12929,7 @@ else { XMEMCPY(x509->sig.buffer, dCert->signature, dCert->sigLength); x509->sig.length = dCert->sigLength; - x509->sigOID = dCert->signatureOID; + x509->sigOID = (int)dCert->signatureOID; } #if defined(OPENSSL_ALL) wolfSSL_ASN1_OBJECT_free(x509->algor.algorithm); @@ -11979,19 +12953,21 @@ } } - x509->altNames = dCert->altNames; - dCert->weOwnAltNames = 0; + /* add alt names from dCert to X509 */ + if (CopyAltNames(&x509->altNames, dCert->altNames, -1, x509->heap) != 0) { + return MEMORY_E; + } #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(IGNORE_NAME_CONSTRAINTS) /* add copies of email names from dCert to X509 */ - if (CopyAdditionalAltNames(&x509->altNames, dCert->altEmailNames, + if (CopyAltNames(&x509->altNames, dCert->altEmailNames, ASN_RFC822_TYPE, x509->heap) != 0) { return MEMORY_E; } #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ #if defined(OPENSSL_EXTRA) && !defined(IGNORE_NAME_CONSTRAINTS) /* add copies of alternate directory names from dCert to X509 */ - if (CopyAdditionalAltNames(&x509->altNames, dCert->altDirNames, + if (CopyAltNames(&x509->altNames, dCert->altDirNames, ASN_DIR_TYPE, x509->heap) != 0) { return MEMORY_E; } @@ -12157,6 +13133,47 @@ x509->pkCurveOID = dCert->pkCurveOID; #endif /* HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448 */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + /* Copy over alternative sig and pubkey. In this case we will allocate new + * buffers for them as we have no knowledge of when the DecodedCert is + * freed. */ + if (dCert->extSapkiSet) { + x509->sapkiDer = (byte*)XMALLOC(dCert->sapkiLen, x509->heap, + DYNAMIC_TYPE_X509_EXT); + if (x509->sapkiDer != NULL) { + XMEMCPY(x509->sapkiDer, dCert->sapkiDer, dCert->sapkiLen); + x509->sapkiLen = dCert->sapkiLen; + } + else { + ret = MEMORY_E; + } + } + if (dCert->extAltSigAlgSet) { + x509->altSigAlgDer = (byte*)XMALLOC(dCert->altSigAlgLen, x509->heap, + DYNAMIC_TYPE_X509_EXT); + if (x509->altSigAlgDer != NULL) { + XMEMCPY(x509->altSigAlgDer, dCert->altSigAlgDer, + dCert->altSigAlgLen); + x509->altSigAlgLen = dCert->altSigAlgLen; + } + else { + ret = MEMORY_E; + } + } + if (dCert->extAltSigValSet) { + x509->altSigValDer = (byte*)XMALLOC(dCert->altSigValLen, x509->heap, + DYNAMIC_TYPE_X509_EXT); + if (x509->altSigValDer != NULL) { + XMEMCPY(x509->altSigValDer, dCert->altSigValDer, + dCert->altSigValLen); + x509->altSigValLen = dCert->altSigValLen; + } + else { + ret = MEMORY_E; + } + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + return ret; } @@ -12269,7 +13286,7 @@ const unsigned char* keyDer, unsigned int keySz, int* result, void* ctx) { - int ret = NOT_COMPILED_IN; + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); WOLFSSL* ssl = (WOLFSSL*)ctx; if (ssl && ssl->ctx->EccVerifyCb) { @@ -12284,7 +13301,7 @@ unsigned char** out, const unsigned char* keyDer, unsigned int keySz, void* ctx) { - int ret = NOT_COMPILED_IN; + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); WOLFSSL* ssl = (WOLFSSL*)ctx; if (ssl && ssl->ctx->RsaVerifyCb) { @@ -12302,7 +13319,7 @@ /* only setup the verify callback if a PK is set */ #ifdef HAVE_ECC - #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) sigCtx->pkCbEcc = Renesas_cmn_SigPkCbEccVerify; sigCtx->pkCtxEcc = (void*)&sigCtx->CertAtt; (void)SigPkCbEccVerify; @@ -12316,7 +13333,7 @@ #endif #ifndef NO_RSA /* only setup the verify callback if a PK is set */ - #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) sigCtx->pkCbRsa = Renesas_cmn_SigPkCbRsaVerify; sigCtx->pkCtxRsa = (void*)&sigCtx->CertAtt; (void)SigPkCbRsaVerify; @@ -12346,17 +13363,26 @@ /* Determine alert reason */ alertWhy = bad_certificate; - if (ret == ASN_AFTER_DATE_E || ret == ASN_BEFORE_DATE_E) { + if (ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E) || + ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E)) { alertWhy = certificate_expired; - } else if (ret == ASN_NO_SIGNER_E) { + } + else if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) || + ret == WC_NO_ERR_TRACE(ASN_PATHLEN_INV_E) || + ret == WC_NO_ERR_TRACE(ASN_PATHLEN_SIZE_E)) { alertWhy = unknown_ca; } #ifdef OPENSSL_EXTRA - else if (ret == CRL_CERT_REVOKED) { + else if (ret == WC_NO_ERR_TRACE(CRL_CERT_REVOKED)) { alertWhy = certificate_revoked; } #endif - else if (ret == NO_PEER_CERT) { +#if defined(HAVE_RPK) + else if (ret == WC_NO_ERR_TRACE(UNSUPPORTED_CERTIFICATE)) { + alertWhy = unsupported_certificate; + } +#endif /* HAVE_RPK */ + else if (ret == WC_NO_ERR_TRACE(NO_PEER_CERT)) { #ifdef WOLFSSL_TLS13 if (ssl->options.tls1_3) { alertWhy = certificate_required; @@ -12373,6 +13399,167 @@ ssl->options.isClosed = 1; } + +int SetupStoreCtxCallback(WOLFSSL_X509_STORE_CTX** store_pt, + WOLFSSL* ssl, WOLFSSL_CERT_MANAGER* cm, ProcPeerCertArgs* args, + int cert_err, void* heap, int* x509Free) +{ + WOLFSSL_X509_STORE_CTX* store = NULL; + char* domain = NULL; +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_X509* x509 = NULL; +#endif + + *x509Free = 0; + + store = wolfSSL_X509_STORE_CTX_new_ex(heap); + if (store == NULL) + goto mem_error; + domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING); + if (domain == NULL) + goto mem_error; + + domain[0] = '\0'; + + /* build subject CN as string to return in store */ + if (args->dCertInit && args->dCert && args->dCert->subjectCN) { + int subjectCNLen = args->dCert->subjectCNLen; + if (subjectCNLen > ASN_NAME_MAX-1) + subjectCNLen = ASN_NAME_MAX-1; + if (subjectCNLen > 0) { + XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen); + domain[subjectCNLen] = '\0'; + } + } + +#ifndef OPENSSL_COMPATIBLE_DEFAULTS + store->error = cert_err; +#else + store->error = GetX509Error(cert_err); +#endif + store->error_depth = args->certIdx; + store->discardSessionCerts = 0; + store->domain = domain; + if (ssl != NULL) { + if (ssl->verifyCbCtx != NULL) { + /* Use the WOLFSSL user context if set */ + store->userCtx = ssl->verifyCbCtx; + } + else { + /* Else use the WOLFSSL_CTX user context */ + store->userCtx = ssl->ctx->verifyCbCtx; + } + } + else { + store->userCtx = cm; + } + store->certs = args->certs; + store->totalCerts = args->totalCerts; +#if defined(HAVE_EX_DATA) && \ + (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) + if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl) + != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX"); + } +#endif + + if (ssl != NULL) { +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) + store->store = SSL_STORE(ssl); +#if defined(OPENSSL_EXTRA) + store->depth = args->count; + /* Overwrite with non-default param values in SSL */ + if (ssl->param) { + if (ssl->param->check_time) + store->param->check_time = ssl->param->check_time; + + if (ssl->param->flags) + store->param->flags = ssl->param->flags; +#ifdef WOLFSSL_LOCAL_X509_STORE + else if (SSL_STORE(ssl) && SSL_STORE(ssl)->param && + SSL_STORE(ssl)->param->flags) + store->param->flags = SSL_STORE(ssl)->param->flags; +#endif + + + if (ssl->param->hostName[0]) + XMEMCPY(store->param->hostName, ssl->param->hostName, + WOLFSSL_HOST_NAME_MAX); + + } +#endif /* defined(OPENSSL_EXTRA) */ +#endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/ +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + #ifdef KEEP_PEER_CERT + if (args->certIdx == 0) { + FreeX509(&ssl->peerCert); + InitX509(&ssl->peerCert, 0, ssl->heap); + if (CopyDecodedToX509(&ssl->peerCert, args->dCert) == 0) + WOLFSSL_MSG("Unable to copy to ssl->peerCert"); + store->current_cert = &ssl->peerCert; /* use existing X509 */ + } + else + #endif + { + x509 = wolfSSL_X509_new_ex(heap); + if (x509 == NULL) + goto mem_error; + if (CopyDecodedToX509(x509, args->dCert) == 0) { + store->current_cert = x509; + *x509Free = 1; + } + else { + goto mem_error; + } + } +#endif +#ifdef SESSION_CERTS + store->sesChain = &ssl->session->chain; +#endif + } + *store_pt = store; + return 0; +mem_error: + if (store != NULL) + wolfSSL_X509_STORE_CTX_free(store); +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + if (x509 != NULL) + wolfSSL_X509_free(x509); +#endif + if (domain != NULL) + XFREE(domain, heap, DYNAMIC_TYPE_STRING); + return MEMORY_E; +} + +void CleanupStoreCtxCallback(WOLFSSL_X509_STORE_CTX* store, + WOLFSSL* ssl, void* heap, int x509Free) +{ + (void)ssl; + (void)x509Free; + +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + wolfSSL_sk_X509_pop_free(store->chain, NULL); + store->chain = NULL; +#endif +#ifdef SESSION_CERTS + if ((ssl != NULL) && (store->discardSessionCerts)) { + WOLFSSL_MSG("Verify callback requested discard sess certs"); + ssl->session->chain.count = 0; + #ifdef WOLFSSL_ALT_CERT_CHAINS + ssl->session->altChain.count = 0; + #endif + } +#endif /* SESSION_CERTS */ + XFREE(store->domain, heap, DYNAMIC_TYPE_STRING); + store->domain = NULL; +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + if (x509Free) + wolfSSL_X509_free(store->current_cert); + store->current_cert = NULL; +#endif + wolfSSL_X509_STORE_CTX_free(store); +} + /* WOLFSSL_ALWAYS_VERIFY_CB: Use verify callback for success or failure cases */ /* WOLFSSL_VERIFY_CB_ALL_CERTS: Issue callback for all intermediate certificates */ @@ -12381,10 +13568,10 @@ * store->error_depth member to determine index (0=peer, >1 intermediates) */ -int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret, +int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int cert_err, ProcPeerCertArgs* args) { - int verify_ok = 0, use_cb = 0; + int verify_ok = 0, use_cb = 0, ret = cert_err; void *heap; if (cm == NULL) { @@ -12394,12 +13581,12 @@ heap = (ssl != NULL) ? ssl->heap : cm->heap; /* Determine if verify was okay */ - if (ret == 0) { + if (cert_err == 0) { verify_ok = 1; } /* Determine if verify callback should be used */ - if (ret != 0) { + if (cert_err != 0) { if ((ssl != NULL) && (!ssl->options.verifyNone)) { use_cb = 1; /* always report errors */ } @@ -12424,8 +13611,9 @@ ssl->param && ssl->param->hostName[0]) { /* If altNames names is present, then subject common name is ignored */ if (args->dCert->altNames != NULL) { - if (CheckForAltNames(args->dCert, ssl->param->hostName, NULL) != 1) { - if (ret == 0) { + if (CheckForAltNames(args->dCert, ssl->param->hostName, + (word32)XSTRLEN(ssl->param->hostName), NULL) != 1) { + if (cert_err == 0) { ret = DOMAIN_NAME_MISMATCH; WOLFSSL_ERROR_VERBOSE(ret); } @@ -12434,10 +13622,12 @@ #ifndef WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY else { if (args->dCert->subjectCN) { - if (MatchDomainName(args->dCert->subjectCN, - args->dCert->subjectCNLen, - ssl->param->hostName) == 0) { - if (ret == 0) { + if (MatchDomainName( + args->dCert->subjectCN, + args->dCert->subjectCNLen, + ssl->param->hostName, + (word32)XSTRLEN(ssl->param->hostName)) == 0) { + if (cert_err == 0) { ret = DOMAIN_NAME_MISMATCH; WOLFSSL_ERROR_VERBOSE(ret); } @@ -12446,7 +13636,7 @@ } #else else { - if (ret == 0) { + if (cert_err == 0) { ret = DOMAIN_NAME_MISMATCH; WOLFSSL_ERROR_VERBOSE(ret); } @@ -12458,7 +13648,7 @@ if ((args->dCertInit != 0) && (args->dCert != NULL) && (ssl != NULL) && (ssl->param != NULL) && (XSTRLEN(ssl->param->ipasc) > 0)) { if (CheckIPAddr(args->dCert, ssl->param->ipasc) != 0) { - if (ret == 0) { + if (cert_err == 0) { ret = IPADDR_MISMATCH; WOLFSSL_ERROR_VERBOSE(ret); } @@ -12471,163 +13661,30 @@ #ifdef OPENSSL_ALL || (ssl->ctx->verifyCertCb != NULL) #endif + #if defined(WOLFSSL_LOCAL_X509_STORE) && \ + (defined(OPENSSL_ALL) || defined(WOLFSSL_QT)) + || (SSL_STORE(ssl) != NULL && SSL_STORE(ssl)->verify_cb != NULL) + #endif )) #ifndef NO_WOLFSSL_CM_VERIFY || (cm->verifyCallback != NULL) #endif ) { int verifyFail = 0; - #ifdef WOLFSSL_SMALL_STACK - WOLFSSL_X509_STORE_CTX* store; - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - WOLFSSL_X509* x509; - #endif - char* domain = NULL; - #else - WOLFSSL_X509_STORE_CTX store[1]; - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - WOLFSSL_X509 x509[1]; - #endif - char domain[ASN_NAME_MAX]; - #endif - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + WOLFSSL_X509_STORE_CTX* store = NULL; int x509Free = 0; - #endif - - #ifdef WOLFSSL_SMALL_STACK - store = (WOLFSSL_X509_STORE_CTX*)XMALLOC( - sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_STORE); - if (store == NULL) { - return MEMORY_E; - } - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap, - DYNAMIC_TYPE_X509); - if (x509 == NULL) { - XFREE(store, heap, DYNAMIC_TYPE_X509_STORE); - return MEMORY_E; - } - #endif - domain = (char*)XMALLOC(ASN_NAME_MAX, heap, DYNAMIC_TYPE_STRING); - if (domain == NULL) { - XFREE(store, heap, DYNAMIC_TYPE_X509_STORE); - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - XFREE(x509, heap, DYNAMIC_TYPE_X509); - #endif - return MEMORY_E; - } - #endif /* WOLFSSL_SMALL_STACK */ - - XMEMSET(store, 0, sizeof(WOLFSSL_X509_STORE_CTX)); - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - XMEMSET(x509, 0, sizeof(WOLFSSL_X509)); - #endif - domain[0] = '\0'; - - /* build subject CN as string to return in store */ - if (args->dCertInit && args->dCert && args->dCert->subjectCN) { - int subjectCNLen = args->dCert->subjectCNLen; - if (subjectCNLen > ASN_NAME_MAX-1) - subjectCNLen = ASN_NAME_MAX-1; - if (subjectCNLen > 0) { - XMEMCPY(domain, args->dCert->subjectCN, subjectCNLen); - domain[subjectCNLen] = '\0'; - } - } - -#ifndef OPENSSL_COMPATIBLE_DEFAULTS - store->error = ret; -#else - store->error = GetX509Error(ret); -#endif - store->error_depth = args->certIdx; - store->discardSessionCerts = 0; - store->domain = domain; - if (ssl != NULL) { - if (ssl->verifyCbCtx != NULL) { - /* Use the WOLFSSL user context if set */ - store->userCtx = ssl->verifyCbCtx; - } - else { - /* Else use the WOLFSSL_CTX user context */ - store->userCtx = ssl->ctx->verifyCbCtx; - } - } - else { - store->userCtx = cm; - } - store->certs = args->certs; - store->totalCerts = args->totalCerts; - #if defined(HAVE_EX_DATA) && \ - (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) - if (wolfSSL_CRYPTO_set_ex_data(&store->ex_data, 0, ssl) - != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Failed to store ssl context in WOLFSSL_X509_STORE_CTX"); - } - #endif + int setupRet = SetupStoreCtxCallback(&store, ssl, cm, args, cert_err, + heap, &x509Free); - if (ssl != NULL) { - #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) - store->store = SSL_STORE(ssl); - #if defined(OPENSSL_EXTRA) - store->depth = args->count; - store->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC( - sizeof(WOLFSSL_X509_VERIFY_PARAM), - heap, DYNAMIC_TYPE_OPENSSL); - if (store->param == NULL) { - #ifdef WOLFSSL_SMALL_STACK - XFREE(domain, heap, DYNAMIC_TYPE_STRING); - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - XFREE(x509, heap, DYNAMIC_TYPE_X509); - #endif - XFREE(store, heap, DYNAMIC_TYPE_X509_STORE); - #endif - return MEMORY_E; - } - XMEMSET(store->param, 0, sizeof(WOLFSSL_X509_VERIFY_PARAM)); - /* Overwrite with non-default param values in SSL */ - if (ssl->param) { - if (ssl->param->check_time) - store->param->check_time = ssl->param->check_time; - - if (ssl->param->flags) - store->param->flags = ssl->param->flags; - - if (ssl->param->hostName[0]) - XMEMCPY(store->param->hostName, ssl->param->hostName, - WOLFSSL_HOST_NAME_MAX); + if (setupRet != 0) + return setupRet; - } - #endif /* defined(OPENSSL_EXTRA) */ - #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER)*/ - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - #ifdef KEEP_PEER_CERT - if (args->certIdx == 0) { - store->current_cert = &ssl->peerCert; /* use existing X509 */ - } - else - #endif - { - InitX509(x509, 0, heap); - if (CopyDecodedToX509(x509, args->dCert) == 0) { - store->current_cert = x509; - x509Free = 1; - } - else { - FreeX509(x509); - } - } - #endif - #ifdef SESSION_CERTS - store->sesChain = &ssl->session->chain; - #endif - } #ifndef NO_WOLFSSL_CM_VERIFY /* non-zero return code indicates failure override */ if (cm->verifyCallback != NULL) { store->userCtx = cm; if (cm->verifyCallback(verify_ok, store)) { - if (ret != 0) { + if (cert_err != 0) { WOLFSSL_MSG("Verify CM callback overriding error!"); ret = 0; } @@ -12643,7 +13700,7 @@ /* non-zero return code indicates failure override */ if (ssl->ctx->verifyCertCb) { if (ssl->ctx->verifyCertCb(store, ssl->ctx->verifyCertCbArg)) { - if (ret != 0) { + if (cert_err != 0) { WOLFSSL_MSG("Verify Cert callback overriding error!"); ret = 0; } @@ -12653,11 +13710,10 @@ } } #endif - /* non-zero return code indicates failure override */ if (ssl->verifyCallback) { if (ssl->verifyCallback(verify_ok, store)) { - if (ret != 0) { + if (cert_err != 0) { WOLFSSL_MSG("Verify callback overriding error!"); ret = 0; } @@ -12666,11 +13722,25 @@ verifyFail = 1; } } +#if defined(WOLFSSL_LOCAL_X509_STORE) && \ + (defined(OPENSSL_ALL) || defined(WOLFSSL_QT)) + if (SSL_STORE(ssl) != NULL && SSL_STORE(ssl)->verify_cb != NULL) { + if (SSL_STORE(ssl)->verify_cb(verify_ok, store)) { + if (cert_err != 0) { + WOLFSSL_MSG("Store Verify callback overriding error!"); + ret = 0; + } + } + else { + verifyFail = 1; + } + } +#endif } if (verifyFail) { /* induce error if one not present */ - if (ret == 0) { + if (cert_err == 0) { ret = VERIFY_CERT_ERROR; WOLFSSL_ERROR_VERBOSE(ret); } @@ -12678,36 +13748,7 @@ /* mark as verify error */ args->verifyErr = 1; } - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - if (x509Free) { - FreeX509(x509); - } - #endif - #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - wolfSSL_sk_X509_pop_free(store->chain, NULL); - store->chain = NULL; - #endif - #ifdef SESSION_CERTS - if ((ssl != NULL) && (store->discardSessionCerts)) { - WOLFSSL_MSG("Verify callback requested discard sess certs"); - ssl->session->chain.count = 0; - #ifdef WOLFSSL_ALT_CERT_CHAINS - ssl->session->altChain.count = 0; - #endif - } - #endif /* SESSION_CERTS */ -#ifdef OPENSSL_EXTRA - if ((ssl != NULL) && (store->param)) { - XFREE(store->param, heap, DYNAMIC_TYPE_OPENSSL); - } -#endif - #ifdef WOLFSSL_SMALL_STACK - XFREE(domain, heap, DYNAMIC_TYPE_STRING); - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - XFREE(x509, heap, DYNAMIC_TYPE_X509); - #endif - XFREE(store, heap, DYNAMIC_TYPE_X509_STORE); - #endif + CleanupStoreCtxCallback(store, ssl, heap, x509Free); } (void)heap; @@ -12715,6 +13756,50 @@ return ret; } +#ifdef HAVE_CRL +void DoCrlCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, + ProcPeerCertArgs* args, int* outRet) +{ +#if defined(WOLFSSL_LOCAL_X509_STORE) && \ + (defined(OPENSSL_ALL) || defined(WOLFSSL_QT)) + int ret = 0; + void* heap = (ssl != NULL) ? ssl->heap : cm->heap; + WOLFSSL_X509_STORE* cert_store = (ssl != NULL) ? SSL_STORE(ssl) : NULL; + + if (cert_store != NULL && cert_store->get_crl_cb != NULL) { + WOLFSSL_CRL* userCrl = NULL; + WOLFSSL_X509_STORE_CTX* store = NULL; + int x509Free = 0; + + ret = SetupStoreCtxCallback(&store, ssl, cm, args, 0, heap, + &x509Free); + if (ret != 0) { + *outRet = ret; + return; + } + + ret = cert_store->get_crl_cb(store, &userCrl, store->current_cert); + if (ret == 1 && userCrl != NULL) { + /* Point to current cm to be able to verify CRL */ + userCrl->cm = SSL_CM(ssl); + *outRet = CheckCertCRL(userCrl, args->dCert); + } + else + *outRet = CRL_MISSING; + + if (userCrl != NULL) + wolfSSL_X509_CRL_free(userCrl); + CleanupStoreCtxCallback(store, ssl, heap, x509Free); + } +#else + (void)cm; + (void)ssl; + (void)args; + (void)outRet; +#endif +} +#endif + static void FreeProcPeerCertArgs(WOLFSSL* ssl, void* pArgs) { ProcPeerCertArgs* args = (ProcPeerCertArgs*)pArgs; @@ -12742,7 +13827,8 @@ } #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \ - !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) + !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \ + !defined(NO_STDIO_FILESYSTEM) /* load certificate file which has the form .(r)N[0..N] */ /* in the folder. */ /* (r), in the case of CRL file */ @@ -12781,9 +13867,11 @@ len = wolfSSL_i2d_X509_NAME_canon(issuer, &pbuf); if (len > 0) { - #ifndef NO_SHA - retHash = wc_ShaHash((const byte*)pbuf, len, dgt); - #endif + #if defined(NO_SHA) && !defined(NO_SHA256) + retHash = wc_Sha256Hash((const byte*)pbuf, len, dgt); + #elif !defined(NO_SHA) + retHash = wc_ShaHash((const byte*)pbuf, (word32)len, dgt); + #endif if (retHash == 0) { /* 4 bytes in little endian as unsigned long */ hash = (((unsigned long)dgt[3] << 24) | @@ -12852,7 +13940,7 @@ for (; suffix < MAX_SUFFIX; suffix++) { /* /folder-path/.(r)N[0..9] */ - if (XSNPRINTF(filename, len, "%s/%08lx.%s%d", entry->dir_name, + if (XSNPRINTF(filename, (size_t)len, "%s/%08lx.%s%d", entry->dir_name, hash, post, suffix) >= len) { @@ -12921,6 +14009,7 @@ } XFREE(filename, NULL, DYNAMIC_TYPE_OPENSSL); + filename = NULL; } #else (void) type; @@ -12946,6 +14035,10 @@ buffer* cert; byte* subjectHash = NULL; int alreadySigner = 0; + Signer *extraSigners = NULL; +#if defined(HAVE_RPK) + int cType; +#endif #ifdef WOLFSSL_SMALL_CERT_VERIFY int sigRet = 0; #endif @@ -12973,7 +14066,7 @@ /* check if returning from non-blocking OCSP */ /* skip this section because cert is already initialized and parsed */ #ifdef WOLFSSL_NONBLOCK_OCSP - if (args->lastErr == OCSP_WANT_READ) { + if (args->lastErr == WC_NO_ERR_TRACE(OCSP_WANT_READ)) { args->lastErr = 0; /* clear error */ return 0; } @@ -13003,7 +14096,7 @@ } /* perform cert parsing and signature check */ - sigRet = CheckCertSignature(cert->buffer, cert->length, + sigRet = wc_CheckCertSignature(cert->buffer, cert->length, ssl->heap, SSL_CM(ssl)); /* fail on errors here after the ParseCertRelative call, so dCert is populated */ @@ -13044,11 +14137,48 @@ return ret; #endif } - +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 + if (verify != NO_VERIFY && TLSX_CSR2_IsMulti(ssl->extensions)) { + extraSigners = TLSX_CSR2_GetPendingSigners(ssl->extensions); + } +#endif /* Parse Certificate */ - ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl)); + ret = ParseCertRelative(args->dCert, certType, verify, SSL_CM(ssl), extraSigners); + +#if defined(HAVE_RPK) + /* if cert type has negotiated with peer, confirm the cert received has + * the same type. + */ + if (ret == 0 ) { + if (ssl->options.side == WOLFSSL_CLIENT_END) { + if (ssl->options.rpkState.received_ServerCertTypeCnt == 1) { + cType = ssl->options.rpkState.received_ServerCertTypes[0]; + if ((cType == WOLFSSL_CERT_TYPE_RPK && !args->dCert->isRPK) || + (cType == WOLFSSL_CERT_TYPE_X509 && args->dCert->isRPK)) { + /* cert type mismatch */ + WOLFSSL_MSG("unsupported certificate type received"); + ret = UNSUPPORTED_CERTIFICATE; + } + } + } + else if (ssl->options.side == WOLFSSL_SERVER_END) { + if (ssl->options.rpkState.received_ClientCertTypeCnt == 1) { + cType = ssl->options.rpkState.sending_ClientCertTypes[0]; + if ((cType == WOLFSSL_CERT_TYPE_RPK && !args->dCert->isRPK) || + (cType == WOLFSSL_CERT_TYPE_X509 && args->dCert->isRPK)) { + /* cert type mismatch */ + WOLFSSL_MSG("unsupported certificate type received"); + ret = UNSUPPORTED_CERTIFICATE; + } + } + } + } +#endif /* HAVE_RPK */ + /* perform below checks for date failure cases */ - if (ret == 0 || ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) { + if (ret == 0 || + ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E) || + ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) { /* get subject and determine if already loaded */ #ifndef NO_SKID if (args->dCert->extAuthKeyIdSet) @@ -13071,7 +14201,7 @@ *pAlreadySigner = alreadySigner; #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, args->dCert->sigCtx.asyncDev); } @@ -13083,7 +14213,7 @@ * original return code is returned. */ if (ssl->ctx && ssl->ctx->ProcessPeerCertCb) { int new_ret = ssl->ctx->ProcessPeerCertCb(ssl, args->dCert); - if (new_ret != NOT_COMPILED_IN) { + if (new_ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { ret = new_ret; } } @@ -13152,7 +14282,6 @@ } break; #endif /* HAVE_ED448 */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case FALCON_LEVEL1k: if (ssl->options.minFalconKeySz < 0 || @@ -13171,7 +14300,6 @@ } break; #endif /* HAVE_FALCON */ - #endif /* HAVE_PQC */ #if defined(HAVE_DILITHIUM) case DILITHIUM_LEVEL2k: if (ssl->options.minDilithiumKeySz < 0 || @@ -13208,6 +14336,31 @@ return ret; } +#ifdef HAVE_CRL +static int ProcessPeerCertsChainCRLCheck(WOLFSSL* ssl, ProcPeerCertArgs* args) +{ + Signer* prev = NULL; + int ret = 0; + WOLFSSL_CERT_MANAGER* cm = SSL_CM(ssl); + Signer* ca = args->dCert->ca; + /* End loop if no more issuers found or if we have + * found a self signed cert (ca == prev) */ + for (; ret == 0 && ca != NULL && ca != prev; + prev = ca, ca = GetCAByName(cm, ca->issuerNameHash)) { + ret = CheckCertCRL_ex(cm->crl, ca->issuerNameHash, NULL, 0, + ca->serialHash, NULL, 0, NULL); + if (ret != 0) + DoCrlCallback(cm, ssl, args, &ret); + if (ret != 0){ + WOLFSSL_ERROR_VERBOSE(ret); + WOLFSSL_MSG("\tCRL check not ok"); + break; + } + } + return ret; +} +#endif + int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, word32 totalSz) { @@ -13223,6 +14376,9 @@ byte* subjectHash = NULL; int alreadySigner = 0; +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + int addToPendingCAs = 0; +#endif WOLFSSL_ENTER("ProcessPeerCerts"); #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) @@ -13236,7 +14392,7 @@ args = (ProcPeerCertArgs*)ssl->async->args; #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_ppc; @@ -13244,11 +14400,11 @@ else #endif /* WOLFSSL_ASYNC_CRYPT */ #ifdef WOLFSSL_NONBLOCK_OCSP - if (ssl->error == OCSP_WANT_READ) { + if (ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ)) { /* Re-entry after non-blocking OCSP */ #ifdef WOLFSSL_ASYNC_CRYPT /* if async operationg not pending, reset error code */ - if (ret == WC_NOT_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_NO_PENDING_E)) ret = 0; #endif } @@ -13366,7 +14522,25 @@ ERROR_OUT(BUFFER_ERROR, exit_ppc); } c24to32(input + args->idx, &listSz); - args->idx += OPAQUE24_LEN; +#ifdef HAVE_RPK + /* + * If this is RPK from the peer, then single cert (if TLS1.2). + * So, ListSz location is same as CertSz location, so fake + * we have just seen this ListSz. + */ + if (!IsAtLeastTLSv1_3(ssl->version) && + ((ssl->options.side == WOLFSSL_SERVER_END && + ssl->options.rpkState.received_ClientCertTypeCnt == 1 && + ssl->options.rpkState.received_ClientCertTypes[0] == WOLFSSL_CERT_TYPE_RPK) || + (ssl->options.side == WOLFSSL_CLIENT_END && + ssl->options.rpkState.received_ServerCertTypeCnt == 1 && + ssl->options.rpkState.received_ServerCertTypes[0] == WOLFSSL_CERT_TYPE_RPK))) { + listSz += OPAQUE24_LEN; + } else +#endif /* HAVE_RPK */ + { + args->idx += OPAQUE24_LEN; + } if (listSz > MAX_CERTIFICATE_SZ) { ERROR_OUT(BUFFER_ERROR, exit_ppc); } @@ -13559,13 +14733,15 @@ /* select last certificate */ args->certIdx = args->count - 1; - ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, + ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE, !ssl->options.verifyNone ? VERIFY : NO_VERIFY, &subjectHash, &alreadySigner); #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \ - !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) - if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) { + !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \ + !defined(NO_STDIO_FILESYSTEM) + if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) || + ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E)) { WOLFSSL_MSG("try to load certificate if hash dir is set"); ret = LoadCertByIssuer(SSL_STORE(ssl), (WOLFSSL_X509_NAME*)args->dCert->issuerName, @@ -13574,7 +14750,7 @@ FreeDecodedCert(args->dCert); args->dCertInit = 0; /* once again */ - ret = ProcessPeerCertParse(ssl, args, CERT_TYPE, + ret = ProcessPeerCertParse(ssl, args, CHAIN_CERT_TYPE, !ssl->options.verifyNone ? VERIFY : NO_VERIFY, &subjectHash, &alreadySigner); } @@ -13585,12 +14761,19 @@ } #endif #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) goto exit_ppc; #endif if (ret == 0) { ret = ProcessPeerCertCheckKey(ssl, args); } + else if (ret == WC_NO_ERR_TRACE(ASN_PARSE_E) || + ret == WC_NO_ERR_TRACE(BUFFER_E) || + ret == WC_NO_ERR_TRACE(MEMORY_E)) { + WOLFSSL_MSG( + "Got Peer cert ASN PARSE_E, BUFFER E, MEMORY_E"); + ERROR_OUT(ret, exit_ppc); + } if (ret == 0 && args->dCert->isCA == 0) { WOLFSSL_MSG("Chain cert is not a CA, not adding as one"); @@ -13621,9 +14804,11 @@ if (ret == 0) { #ifdef HAVE_OCSP #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 - if (ssl->status_request_v2) { + addToPendingCAs = 0; + if (ssl->status_request_v2 && TLSX_CSR2_IsMulti(ssl->extensions)) { ret = TLSX_CSR2_InitRequests(ssl->extensions, args->dCert, 0, ssl->heap); + addToPendingCAs = 1; } else /* skips OCSP and force CRL check */ #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */ @@ -13631,9 +14816,9 @@ SSL_CM(ssl)->ocspCheckAll) { WOLFSSL_MSG("Doing Non Leaf OCSP check"); ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp, - args->dCert, NULL, ssl); + args->dCert, ssl); #ifdef WOLFSSL_NONBLOCK_OCSP - if (ret == OCSP_WANT_READ) { + if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) { args->lastErr = ret; goto exit_ppc; } @@ -13657,7 +14842,7 @@ responder, do a CRL lookup. If any other error, skip the CRL lookup and fail the certificate. */ - doCrlLookup = (ret == OCSP_CERT_UNKNOWN); + doCrlLookup = (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN)); } #endif /* HAVE_OCSP */ @@ -13670,15 +14855,27 @@ * same WOULD_BLOCK error code as OCSP's I/O * callback, and it is enabling it using the * same flag. */ - if (ret == OCSP_WANT_READ) { + if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) { args->lastErr = ret; goto exit_ppc; } #endif + if (ret != 0) + DoCrlCallback(SSL_CM(ssl), ssl, args, &ret); if (ret != 0) { WOLFSSL_ERROR_VERBOSE(ret); WOLFSSL_MSG("\tCRL check not ok"); } + if (ret == 0 && + args->certIdx == args->totalCerts-1) { + ret = ProcessPeerCertsChainCRLCheck(ssl, + args); + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + WOLFSSL_MSG("\tCRL chain check not ok"); + args->fatal = 0; + } + } } } #endif /* HAVE_CRL */ @@ -13701,7 +14898,8 @@ chain mode only requires that the peer certificate validate to a trusted CA */ if (ret != 0 && args->dCert->isCA) { - if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) { + if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) || + ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E)) { if (!ssl->options.usingAltCertChain) { WOLFSSL_MSG("Trying alternate cert chain"); ssl->options.usingAltCertChain = 1; @@ -13719,11 +14917,32 @@ } #endif /* WOLFSSL_ALT_CERT_CHAINS */ + #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) + /* If we are using native Apple CA validation, it is okay + * for a CA cert to fail validation here, as we will verify + * the entire chain when we hit the peer (leaf) cert */ + if ((ssl->ctx->doAppleNativeCertValidationFlag) + && (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E))) { + + WOLFSSL_MSG("Bypassing errors to allow for Apple native" + " CA validation"); + ret = 0; /* clear errors and continue */ + args->verifyErr = 0; + #if defined(OPENSSL_EXTRA) \ + || defined(OPENSSL_EXTRA_X509_SMALL) + ssl->peerVerifyRet = 0; + #endif + /* do not add to certificate manager */ + skipAddCA = 1; + } + #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */ + /* Do verify callback */ ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args); if (ssl->options.verifyNone && - (ret == CRL_MISSING || ret == CRL_CERT_REVOKED || - ret == CRL_CERT_DATE_ERR)) { + (ret == WC_NO_ERR_TRACE(CRL_MISSING) || + ret == WC_NO_ERR_TRACE(CRL_CERT_REVOKED) || + ret == WC_NO_ERR_TRACE(CRL_CERT_DATE_ERR))) { WOLFSSL_MSG("Ignoring CRL problem based on verify setting"); ret = ssl->error = 0; } @@ -13734,6 +14953,67 @@ skipAddCA = 1; } #endif +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ret == 0 && addToPendingCAs && !alreadySigner) { +#ifdef WOLFSSL_SMALL_STACK + DecodedCert *dCertAdd = NULL; +#else + DecodedCert dCertAdd[1]; +#endif + int dCertAdd_inited = 0; + DerBuffer *derBuffer = NULL; + buffer* cert = &args->certs[args->certIdx]; + Signer *s = NULL; + +#ifdef WOLFSSL_SMALL_STACK + dCertAdd = (DecodedCert *) + XMALLOC(sizeof(*dCertAdd), ssl->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (dCertAdd == NULL) { + ret = MEMORY_E; + goto exit_req_v2; + } +#endif + InitDecodedCert(dCertAdd, cert->buffer, cert->length, + ssl->heap); + dCertAdd_inited = 1; + ret = ParseCert(dCertAdd, CA_TYPE, NO_VERIFY, + SSL_CM(ssl)); + if (ret != 0) { + goto exit_req_v2; + } + ret = AllocDer(&derBuffer, cert->length, CA_TYPE, ssl->heap); + if (ret != 0 || derBuffer == NULL) { + goto exit_req_v2; + } + XMEMCPY(derBuffer->buffer, cert->buffer, cert->length); + s = MakeSigner(SSL_CM(ssl)->heap); + if (s == NULL) { + ret = MEMORY_E; + goto exit_req_v2; + } + ret = FillSigner(s, dCertAdd, CA_TYPE, derBuffer); + if (ret != 0) { + goto exit_req_v2; + } + skipAddCA = 1; + ret = TLSX_CSR2_AddPendingSigner(ssl->extensions, s); + + exit_req_v2: + if (s && (ret != 0)) + FreeSigner(s, SSL_CM(ssl)->heap); + if (derBuffer) + FreeDer(&derBuffer); + if (dCertAdd_inited) + FreeDecodedCert(dCertAdd); +#ifdef WOLFSSL_SMALL_STACK + if (dCertAdd) + XFREE(dCertAdd, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + if (ret != 0) + goto exit_ppc; + } +#endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */ /* If valid CA then add to Certificate Manager */ if (ret == 0 && args->dCert->isCA && @@ -13758,6 +15038,7 @@ /* CA already verified above in ParseCertRelative */ WOLFSSL_MSG("Adding CA from chain"); + SSL_CM_WARNING(ssl); ret = AddCA(SSL_CM(ssl), &add, WOLFSSL_CHAIN_CA, NO_VERIFY); if (ret == WOLFSSL_SUCCESS) { @@ -13773,6 +15054,9 @@ if (!ssl->options.verifyNone) { WOLFSSL_ERROR_VERBOSE(ret); DoCertFatalAlert(ssl, ret); + args->lastErr = ret; + break; /* We sent a fatal alert. + * No point continuing. */ } if (args->lastErr == 0) { args->lastErr = ret; /* save error from last time */ @@ -13783,7 +15067,7 @@ FreeDecodedCert(args->dCert); args->dCertInit = 0; args->count--; - } /* while (count > 0 && !args->haveTrustPeer) */ + } /* while (count > 1 && !args->haveTrustPeer) */ } /* if (count > 0) */ /* Check for error */ @@ -13810,8 +15094,10 @@ &subjectHash, &alreadySigner); #if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \ - !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) - if (ret == ASN_NO_SIGNER_E || ret == ASN_SELF_SIGNED_E) { + !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \ + !defined(NO_STDIO_FILESYSTEM) + if (ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E) || + ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E)) { int lastErr = ret; /* save error from last time */ WOLFSSL_MSG("try to load certificate if hash dir is set"); ret = LoadCertByIssuer(SSL_STORE(ssl), @@ -13832,7 +15118,7 @@ } #endif #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) goto exit_ppc; #endif if (ret == 0) { @@ -13857,6 +15143,20 @@ * OpenSSL doesn't appear to be performing this check. * For TLS 1.3 see RFC8446 Section 4.4.2.3 */ if (ssl->options.side == WOLFSSL_SERVER_END) { + #if defined(HAVE_RPK) + if (args->dCert->isRPK) { + /* to verify Raw Public Key cert, DANE(RFC6698) + * should be introduced. Without DANE, no + * authentication is performed. + */ + #if defined(HAVE_DANE) + if (ssl->useDANE) { + /* DANE authentication should be added */ + } + #endif /* HAVE_DANE */ + } + else /* skip followingx509 version check */ + #endif /* HAVE_RPK */ if (args->dCert->version != WOLFSSL_X509_V3) { WOLFSSL_MSG("Peers certificate was not version 3!"); args->lastErr = ASN_VERSION_E; @@ -13875,8 +15175,12 @@ args->fatal = 0; } } - else if (ret == ASN_PARSE_E || ret == BUFFER_E) { - WOLFSSL_MSG("Got Peer cert ASN PARSE or BUFFER ERROR"); + else if (ret == WC_NO_ERR_TRACE(ASN_PARSE_E) || + ret == WC_NO_ERR_TRACE(BUFFER_E) || + ret == WC_NO_ERR_TRACE(MEMORY_E) || + ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { + WOLFSSL_MSG("Got Peer cert ASN_PARSE_E, BUFFER_E, MEMORY_E," + " BAD_FUNC_ARG"); #if defined(WOLFSSL_EXTRA_ALERTS) || defined(OPENSSL_EXTRA) || \ defined(OPENSSL_EXTRA_X509_SMALL) DoCertFatalAlert(ssl, ret); @@ -13889,13 +15193,14 @@ } else { WOLFSSL_MSG("Failed to verify Peer's cert"); + #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) if (ssl->peerVerifyRet == 0) { /* Return first cert error here */ - if (ret == ASN_BEFORE_DATE_E) { + if (ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E)) { ssl->peerVerifyRet = (unsigned long)WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID; } - else if (ret == ASN_AFTER_DATE_E) { + else if (ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) { ssl->peerVerifyRet = (unsigned long)WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED; } @@ -13906,6 +15211,7 @@ } } #endif + if (ssl->verifyCallback) { WOLFSSL_MSG( "\tCallback override available, will continue"); @@ -13914,6 +15220,18 @@ if (args->fatal) DoCertFatalAlert(ssl, ret); } + #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) + /* Disregard failure to verify peer cert, as we will verify + * the whole chain with the native API later */ + else if (ssl->ctx->doAppleNativeCertValidationFlag) { + WOLFSSL_MSG("\tApple native CA validation override" + " available, will continue"); + /* check if fatal error */ + args->fatal = (args->verifyErr) ? 1 : 0; + if (args->fatal) + DoCertFatalAlert(ssl, ret); + } + #endif/*defined(__APPLE__)&& defined(WOLFSSL_SYS_CA_CERTS)*/ else { WOLFSSL_MSG("\tNo callback override available, fatal"); args->fatal = 1; @@ -13930,8 +15248,8 @@ /* compare against previous time */ if (ssl->secure_renegotiation->subject_hash_set) { if (XMEMCMP(args->dCert->subjectHash, - ssl->secure_renegotiation->subject_hash, - KEYID_SIZE) != 0) { + ssl->secure_renegotiation->subject_hash, + KEYID_SIZE) != 0) { WOLFSSL_MSG( "Peer sent different cert during scr, fatal"); args->fatal = 1; @@ -14018,13 +15336,13 @@ if (doLookup && SSL_CM(ssl)->ocspEnabled) { WOLFSSL_MSG("Doing Leaf OCSP check"); ret = CheckCertOCSP_ex(SSL_CM(ssl)->ocsp, - args->dCert, NULL, ssl); + args->dCert, ssl); #ifdef WOLFSSL_NONBLOCK_OCSP - if (ret == OCSP_WANT_READ) { + if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) { goto exit_ppc; } #endif - doLookup = (ret == OCSP_CERT_UNKNOWN); + doLookup = (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN)); if (ret != 0) { WOLFSSL_MSG("\tOCSP Lookup not ok"); args->fatal = 0; @@ -14050,10 +15368,12 @@ * same WOULD_BLOCK error code as OCSP's I/O * callback, and it is enabling it using the * same flag. */ - if (ret == OCSP_WANT_READ) { + if (ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) { goto exit_ppc; } #endif + if (ret != 0) + DoCrlCallback(SSL_CM(ssl), ssl, args, &ret); if (ret != 0) { WOLFSSL_MSG("\tCRL check not ok"); args->fatal = 0; @@ -14063,11 +15383,26 @@ ssl->peerVerifyRet = ret == CRL_CERT_REVOKED ? WOLFSSL_X509_V_ERR_CERT_REVOKED - : WOLFSSL_X509_V_ERR_CERT_REJECTED;; + : WOLFSSL_X509_V_ERR_CERT_REJECTED; } #endif } } + if (ret == 0 && doLookup && SSL_CM(ssl)->crlEnabled && + SSL_CM(ssl)->crlCheckAll && args->totalCerts == 1) { + /* Check the entire cert chain */ + if (args->dCert->ca != NULL) { + ret = ProcessPeerCertsChainCRLCheck(ssl, args); + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + WOLFSSL_MSG("\tCRL chain check not ok"); + args->fatal = 0; + } + } + else { + WOLFSSL_MSG("No CA signer set"); + } + } #endif /* HAVE_CRL */ (void)doLookup; } @@ -14077,28 +15412,11 @@ if (args->fatal == 0) { int copyRet = 0; - #ifdef WOLFSSL_POST_HANDSHAKE_AUTH - if (ssl->options.handShakeDone) { - FreeX509(&ssl->peerCert); - InitX509(&ssl->peerCert, 0, ssl->heap); - } - else - #endif - #ifdef HAVE_SECURE_RENEGOTIATION - if (ssl->secure_renegotiation && - ssl->secure_renegotiation->enabled) { - /* free old peer cert */ - FreeX509(&ssl->peerCert); - InitX509(&ssl->peerCert, 0, ssl->heap); - } - else - #endif - { - } - - /* set X509 format for peer cert */ + /* free old peer cert */ + FreeX509(&ssl->peerCert); + InitX509(&ssl->peerCert, 0, ssl->heap); copyRet = CopyDecodedToX509(&ssl->peerCert, args->dCert); - if (copyRet == MEMORY_E) { + if (copyRet == WC_NO_ERR_TRACE(MEMORY_E)) { args->fatal = 1; } } @@ -14199,6 +15517,9 @@ if (args->dCert->altNames) { if (CheckForAltNames(args->dCert, (char*)ssl->buffers.domainName.buffer, + (ssl->buffers.domainName.buffer == NULL ? 0 : + (word32)XSTRLEN( + (const char *)ssl->buffers.domainName.buffer)), NULL) != 1) { WOLFSSL_MSG("DomainName match on alt names failed"); /* try to get peer key still */ @@ -14208,9 +15529,14 @@ } else { if (MatchDomainName( - args->dCert->subjectCN, - args->dCert->subjectCNLen, - (char*)ssl->buffers.domainName.buffer) == 0) { + args->dCert->subjectCN, + args->dCert->subjectCNLen, + (char*)ssl->buffers.domainName.buffer, + (ssl->buffers.domainName.buffer == NULL ? 0 : + (word32)XSTRLEN( + (const char *)ssl->buffers.domainName.buffer) + )) == 0) + { WOLFSSL_MSG("DomainName match on common name failed"); ret = DOMAIN_NAME_MISMATCH; WOLFSSL_ERROR_VERBOSE(ret); @@ -14220,10 +15546,15 @@ /* Old behavior. */ if (MatchDomainName(args->dCert->subjectCN, args->dCert->subjectCNLen, - (char*)ssl->buffers.domainName.buffer) == 0) { + (char*)ssl->buffers.domainName.buffer, + (ssl->buffers.domainName.buffer == NULL ? 0 : + (word32)XSTRLEN(ssl->buffers.domainName.buffer))) == 0) + { WOLFSSL_MSG("DomainName match on common name failed"); if (CheckForAltNames(args->dCert, (char*)ssl->buffers.domainName.buffer, + (ssl->buffers.domainName.buffer == NULL ? 0 : + (word32)XSTRLEN(ssl->buffers.domainName.buffer)), NULL) != 1) { WOLFSSL_MSG( "DomainName match on alt names failed too"); @@ -14264,7 +15595,7 @@ else { ssl->peerRsaKeyPresent = 1; #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT) + defined(WOLFSSL_RENESAS_FSPSM_TLS) /* copy encrypted tsip key index into ssl object */ if (args->dCert->sce_tsip_encRsaKeyIdx) { if (!ssl->peerSceTsipEncRsaKeyIndex) { @@ -14322,11 +15653,14 @@ } #endif /* NO_RSA */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + #endif case ECDSAk: { int keyRet = 0; word32 idx = 0; - #if defined(WOLFSSL_RENESAS_SCEPROTECT) || \ + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ defined(WOLFSSL_RENESAS_TSIP_TLS) /* copy encrypted tsip/sce key index into ssl object */ if (args->dCert->sce_tsip_encRsaKeyIdx) { @@ -14512,7 +15846,6 @@ break; } #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case FALCON_LEVEL1k: case FALCON_LEVEL5k: @@ -14562,7 +15895,8 @@ break; } #endif /* HAVE_FALCON */ - #if defined(HAVE_DILITHIUM) + #if defined(HAVE_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) case DILITHIUM_LEVEL2k: case DILITHIUM_LEVEL3k: case DILITHIUM_LEVEL5k: @@ -14615,7 +15949,6 @@ break; } #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ default: break; } @@ -14654,12 +15987,29 @@ } #endif + #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) + /* If we can't validate the peer cert chain against the CAs loaded + * into wolfSSL, try to validate against the system certificates + * using Apple's native trust APIs */ + if ((ret != 0) && (ssl->ctx->doAppleNativeCertValidationFlag)) { + if (DoAppleNativeCertValidation(args->certs, + args->totalCerts)) { + WOLFSSL_MSG("Apple native cert chain validation SUCCESS"); + ret = 0; + } + else { + WOLFSSL_MSG("Apple native cert chain validation FAIL"); + } + } + #endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */ + /* Do verify callback */ ret = DoVerifyCallback(SSL_CM(ssl), ssl, ret, args); if (ssl->options.verifyNone && - (ret == CRL_MISSING || ret == CRL_CERT_REVOKED || - ret == CRL_CERT_DATE_ERR)) { + (ret == WC_NO_ERR_TRACE(CRL_MISSING) || + ret == WC_NO_ERR_TRACE(CRL_CERT_REVOKED) || + ret == WC_NO_ERR_TRACE(CRL_CERT_DATE_ERR))) { WOLFSSL_MSG("Ignoring CRL problem based on verify setting"); ret = ssl->error = 0; } @@ -14706,7 +16056,8 @@ #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) - if (ret == WC_PENDING_E || ret == OCSP_WANT_READ) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) || + ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) { /* Mark message as not received so it can process again */ ssl->msgsReceived.got_certificate = 0; @@ -14749,11 +16100,18 @@ WOLFSSL_ENTER("DoCertificate"); #ifdef SESSION_CERTS - /* Reset the session cert chain count in case the session resume failed. */ - ssl->session->chain.count = 0; - #ifdef WOLFSSL_ALT_CERT_CHAINS + /* Reset the session cert chain count in case the session resume failed, + * do not reset if we are resuming after an async wait */ +#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) + if (ssl->error != WC_NO_ERR_TRACE(OCSP_WANT_READ) && + ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)) +#endif + { + ssl->session->chain.count = 0; +#ifdef WOLFSSL_ALT_CERT_CHAINS ssl->session->altChain.count = 0; - #endif +#endif + } #endif /* SESSION_CERTS */ ret = ProcessPeerCerts(ssl, input, inOutIdx, size); @@ -14775,6 +16133,7 @@ int ret = 0; byte status_type; word32 status_length; + int endCertificateOK = 0; WOLFSSL_START(WC_FUNC_CERTIFICATE_STATUS_DO); WOLFSSL_ENTER("DoCertificateStatus"); @@ -14798,6 +16157,7 @@ /* WOLFSSL_CSR_OCSP overlaps with WOLFSSL_CSR2_OCSP */ case WOLFSSL_CSR2_OCSP: ret = ProcessCSR(ssl, input, inOutIdx, status_length); + endCertificateOK = (ret == 0); break; #endif @@ -14808,6 +16168,7 @@ OcspRequest* request; word32 list_length = status_length; byte idx = 0; + Signer *pendingCAs = NULL; #ifdef WOLFSSL_SMALL_STACK CertStatus* status; @@ -14819,14 +16180,12 @@ OcspResponse response[1]; #endif - do { - if (ssl->status_request_v2) { - ssl->status_request_v2 = 0; - break; - } - + if (!ssl->status_request_v2) return BUFFER_ERROR; - } while(0); + + ssl->status_request_v2 = 0; + + pendingCAs = TLSX_CSR2_GetPendingSigners(ssl->extensions); #ifdef WOLFSSL_SMALL_STACK status = (CertStatus*)XMALLOC(sizeof(CertStatus), ssl->heap, @@ -14866,29 +16225,36 @@ if (status_length) { InitOcspResponse(response, single, status, input +*inOutIdx, status_length, ssl->heap); - + response->pendingCAs = pendingCAs; if ((OcspResponseDecode(response, SSL_CM(ssl), ssl->heap, 0) != 0) || (response->responseStatus != OCSP_SUCCESSFUL) || (response->single->status->status != CERT_GOOD)) ret = BAD_CERTIFICATE_STATUS_ERROR; - while (ret == 0) { + if (ret == 0) { request = (OcspRequest*)TLSX_CSR2_GetRequest( - ssl->extensions, status_type, idx++); + ssl->extensions, status_type, idx); - if (request == NULL) + if (request == NULL) { ret = BAD_CERTIFICATE_STATUS_ERROR; - else if (CompareOcspReqResp(request, response) == 0) - break; - else if (idx == 1) /* server cert must be OK */ + } + else if (CompareOcspReqResp(request, response) != 0) { ret = BAD_CERTIFICATE_STATUS_ERROR; + } + else { + if (idx == 0) /* server cert must be OK */ + endCertificateOK = 1; + } } + + /* only frees 'single' if single->isDynamic is set */ FreeOcspResponse(response); *inOutIdx += status_length; list_length -= status_length; } + idx++; } ssl->status_request_v2 = 0; @@ -14908,6 +16274,20 @@ ret = BUFFER_ERROR; } + /* end certificate MUST be present */ + if (endCertificateOK == 0) + ret = BAD_CERTIFICATE_STATUS_ERROR; +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ret == 0) { + if (TLSX_CSR2_MergePendingCA(ssl) < 0) { + WOLFSSL_MSG("Failed to merge pending CAs"); + } + } + else { + TLSX_CSR2_ClearPendingCA(ssl); + } +#endif + if (ret != 0) { WOLFSSL_ERROR_VERBOSE(ret); SendAlert(ssl, alert_fatal, bad_certificate_status_response); @@ -15084,6 +16464,9 @@ #endif ssl->options.handShakeState = HANDSHAKE_DONE; ssl->options.handShakeDone = 1; +#ifdef HAVE_SECURE_RENEGOTIATION + ssl->options.resumed = ssl->options.resuming; +#endif } } else { @@ -15100,6 +16483,9 @@ #endif ssl->options.handShakeState = HANDSHAKE_DONE; ssl->options.handShakeDone = 1; +#ifdef HAVE_SECURE_RENEGOTIATION + ssl->options.resumed = ssl->options.resuming; +#endif } } #ifdef WOLFSSL_DTLS @@ -15119,7 +16505,6 @@ return 0; } - /* Make sure no duplicates, no fast forward, or other problems; 0 on success */ static int SanityCheckMsgReceived(WOLFSSL* ssl, byte type) { @@ -15197,6 +16582,12 @@ WOLFSSL_ERROR_VERBOSE(DUPLICATE_MSG_E); return DUPLICATE_MSG_E; } + if (ssl->msgsReceived.got_hello_retry_request) { + WOLFSSL_MSG("Received HelloVerifyRequest after a " + "HelloRetryRequest"); + WOLFSSL_ERROR_VERBOSE(VERSION_ERROR); + return VERSION_ERROR; + } ssl->msgsReceived.got_hello_verify_request = 1; break; @@ -15300,43 +16691,6 @@ WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); return OUT_OF_ORDER_E; } - if (ssl->msgsReceived.got_certificate_status == 0) { -#ifdef HAVE_CERTIFICATE_STATUS_REQUEST - if (ssl->status_request) { - int ret; - - WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange"); - if ((ret = TLSX_CSR_ForceRequest(ssl)) != 0) - return ret; - } -#endif -#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 - if (ssl->status_request_v2) { - int ret; - - WOLFSSL_MSG("No CertificateStatus before ServerKeyExchange"); - if ((ret = TLSX_CSR2_ForceRequest(ssl)) != 0) - return ret; - } -#endif -#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ - defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) - /* Check that a status request extension was seen as the - * CertificateStatus wasn't when an OCSP staple is required. - */ - if ( - #ifdef HAVE_CERTIFICATE_STATUS_REQUEST - !ssl->status_request && - #endif - #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 - !ssl->status_request_v2 && - #endif - SSL_CM(ssl)->ocspMustStaple) { - WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN); - return OCSP_CERT_UNKNOWN; - } - #endif - } break; #endif @@ -15409,6 +16763,54 @@ return OUT_OF_ORDER_E; } } +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ + defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ssl->msgsReceived.got_certificate_status == 0) { + int csrRet = 0; +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST + if (csrRet == 0 && ssl->status_request) { + WOLFSSL_MSG("No CertificateStatus before ServerHelloDone"); + csrRet = TLSX_CSR_ForceRequest(ssl); + } +#endif +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 + if (csrRet == 0 && ssl->status_request_v2) { + WOLFSSL_MSG("No CertificateStatus before ServerHelloDone"); + csrRet = TLSX_CSR2_ForceRequest(ssl); + } + if (ssl->status_request_v2) { + if (csrRet == 0) { + if (TLSX_CSR2_MergePendingCA(ssl) < 0) { + WOLFSSL_MSG("Failed to merge pending CAs"); + } + } + else { + TLSX_CSR2_ClearPendingCA(ssl); + } + } +#endif + if (csrRet != 0) { + /* Error out if OCSP lookups are enabled and failed or if + * the user requires stapling. */ + if (SSL_CM(ssl)->ocspEnabled || SSL_CM(ssl)->ocspMustStaple) + return csrRet; + } + /* Check that a status request extension was seen as the + * CertificateStatus wasn't when an OCSP staple is required. + */ + if ( +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST + !ssl->status_request && +#endif +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 + !ssl->status_request_v2 && +#endif + SSL_CM(ssl)->ocspMustStaple) { + WOLFSSL_ERROR_VERBOSE(OCSP_CERT_UNKNOWN); + return OCSP_CERT_UNKNOWN; + } + } +#endif break; #endif @@ -15569,7 +16971,7 @@ } -static int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, +int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, word32* inOutIdx, byte type, word32 size, word32 totalSz) { int ret = 0; @@ -15649,8 +17051,10 @@ } if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->options.dtls == 0 && - ssl->options.serverState == NULL_STATE && type != server_hello) { - WOLFSSL_MSG("First server message not server hello"); + ssl->options.serverState == NULL_STATE && type != server_hello && + type != hello_request) { + WOLFSSL_MSG("First server message not server hello or " + "hello request"); SendAlert(ssl, alert_fatal, unexpected_message); WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); return OUT_OF_ORDER_E; @@ -15683,7 +17087,7 @@ && ssl->error != OCSP_WANT_READ #endif ) { - ret = HashInput(ssl, input + *inOutIdx, size); + ret = HashInput(ssl, input + *inOutIdx, (int)size); if (ret != 0) { WOLFSSL_MSG("Incomplete handshake hashes"); return ret; @@ -15697,7 +17101,23 @@ case certificate_request: case server_hello_done: if (ssl->options.resuming) { -#ifdef WOLFSSL_WPAS + /* https://www.rfc-editor.org/rfc/rfc5077.html#section-3.4 + * Alternatively, the client MAY include an empty Session ID + * in the ClientHello. In this case, the client ignores the + * Session ID sent in the ServerHello and determines if the + * server is resuming a session by the subsequent handshake + * messages. + */ +#ifndef WOLFSSL_WPAS + if (ssl->session->sessionIDSz != 0) { + /* Fatal error. Only try to send an alert. RFC 5246 does not + * allow for reverting back to a full handshake after the + * server has indicated the intention to do a resumption. */ + (void)SendAlert(ssl, alert_fatal, unexpected_message); + WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); + return OUT_OF_ORDER_E; + } +#endif /* This can occur when ssl->sessionSecretCb is set. EAP-FAST * (RFC 4851) allows for detecting server session resumption * based on the msg received after the ServerHello. */ @@ -15705,14 +17125,6 @@ ssl->options.resuming = 0; /* No longer resuming, reset peer authentication state. */ ssl->options.peerAuthGood = 0; -#else - /* Fatal error. Only try to send an alert. RFC 5246 does not - * allow for reverting back to a full handshake after the - * server has indicated the intention to do a resumption. */ - (void)SendAlert(ssl, alert_fatal, unexpected_message); - WOLFSSL_ERROR_VERBOSE(OUT_OF_ORDER_E); - return OUT_OF_ORDER_E; -#endif } } } @@ -15761,13 +17173,15 @@ WOLFSSL_MSG("processing server hello"); ret = DoServerHello(ssl, input, inOutIdx, size); #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \ - ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ + ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \ + (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH))) if (ssl->options.resuming || !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) { #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) - if (ret != WC_PENDING_E && ret != OCSP_WANT_READ) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E) && + ret != WC_NO_ERR_TRACE(OCSP_WANT_READ)) #endif { ssl->options.cacheMessages = 0; @@ -15843,12 +17257,14 @@ WOLFSSL_MSG("processing client hello"); ret = DoClientHello(ssl, input, inOutIdx, size); #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \ - ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ + ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \ + (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH))) if (ssl->options.resuming || !ssl->options.verifyPeer || \ !IsAtLeastTLSv1_2(ssl) || IsAtLeastTLSv1_3(ssl->version)) { #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) - if (ret != WC_PENDING_E && ret != OCSP_WANT_READ) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E) && + ret != WC_NO_ERR_TRACE(OCSP_WANT_READ)) #endif { ssl->options.cacheMessages = 0; @@ -15914,7 +17330,8 @@ #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) /* if async, offset index so this msg will be processed again */ - if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) { + if ((ret == WC_NO_ERR_TRACE(WC_PENDING_E) || + ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) && *inOutIdx > 0) { *inOutIdx -= HANDSHAKE_HEADER_SZ; #ifdef WOLFSSL_DTLS if (ssl->options.dtls) { @@ -15924,7 +17341,8 @@ } /* make sure async error is cleared */ - if (ret == 0 && (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) { + if (ret == 0 && (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) || + ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ))) { ssl->error = 0; } #endif /* WOLFSSL_ASYNC_CRYPT || WOLFSSL_NONBLOCK_OCSP */ @@ -15965,6 +17383,12 @@ return PARSE_ERROR; } + ret = EarlySanityCheckMsgReceived(ssl, type, size); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + if (size > MAX_HANDSHAKE_SZ) { WOLFSSL_MSG("Handshake message too large"); WOLFSSL_ERROR_VERBOSE(HANDSHAKE_SIZE_ERROR); @@ -15988,6 +17412,13 @@ return PARSE_ERROR; } + ret = EarlySanityCheckMsgReceived(ssl, type, + min(inputLength - HANDSHAKE_HEADER_SZ, size)); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + /* Cap the maximum size of a handshake message to something reasonable. * By default is the maximum size of a certificate message assuming * nine 2048-bit RSA certificates in the chain. */ @@ -16026,8 +17457,15 @@ if (inputLength > pendSz) inputLength = pendSz; + ret = EarlySanityCheckMsgReceived(ssl, ssl->arrays->pendingMsgType, + inputLength); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + #ifdef WOLFSSL_ASYNC_CRYPT - if (ssl->error != WC_PENDING_E) + if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* for async this copy was already done, do not replace, since @@ -16047,7 +17485,7 @@ ssl->arrays->pendingMsgSz - idx, ssl->arrays->pendingMsgSz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* setup to process fragment again */ ssl->arrays->pendingMsgOffset -= inputLength; *inOutIdx -= inputLength; @@ -16079,40 +17517,41 @@ switch (error) { /* not fatal errors */ - case WANT_WRITE: - case WANT_READ: - case ZERO_RETURN: + case WC_NO_ERR_TRACE(WANT_WRITE): + case WC_NO_ERR_TRACE(WANT_READ): + case WC_NO_ERR_TRACE(ZERO_RETURN): +#ifdef WOLFSSL_NONBLOCK_OCSP + case WC_NO_ERR_TRACE(OCSP_WANT_READ): +#endif #ifdef WOLFSSL_ASYNC_CRYPT - case WC_PENDING_E: + case WC_NO_ERR_TRACE(WC_PENDING_E): #endif return 0; /* peer already disconnected and ssl is possibly in bad state * don't try to send an alert */ - case SOCKET_ERROR_E: + case WC_NO_ERR_TRACE(SOCKET_ERROR_E): return error; - case BUFFER_ERROR: - case ASN_PARSE_E: - case COMPRESSION_ERROR: + case WC_NO_ERR_TRACE(BUFFER_ERROR): + case WC_NO_ERR_TRACE(ASN_PARSE_E): + case WC_NO_ERR_TRACE(COMPRESSION_ERROR): why = decode_error; break; - case MATCH_SUITE_ERROR: - why = illegal_parameter; - break; - case VERIFY_FINISHED_ERROR: - case SIG_VERIFY_E: + case WC_NO_ERR_TRACE(VERIFY_FINISHED_ERROR): + case WC_NO_ERR_TRACE(SIG_VERIFY_E): why = decrypt_error; break; - case DUPLICATE_MSG_E: - case NO_CHANGE_CIPHER_E: - case OUT_OF_ORDER_E: + case WC_NO_ERR_TRACE(DUPLICATE_MSG_E): + case WC_NO_ERR_TRACE(NO_CHANGE_CIPHER_E): + case WC_NO_ERR_TRACE(OUT_OF_ORDER_E): why = unexpected_message; break; - case ECC_OUT_OF_RANGE_E: + case WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E): why = bad_record_mac; break; - case VERSION_ERROR: + case WC_NO_ERR_TRACE(MATCH_SUITE_ERROR): + case WC_NO_ERR_TRACE(VERSION_ERROR): default: why = handshake_failure; break; @@ -16248,6 +17687,8 @@ int wordIndex; word32 diff; + WOLFSSL_ENTER("Dtls13CheckWindow"); + if (ssl->dtls13DecryptEpoch == NULL) { WOLFSSL_MSG("Can't find decrypting epoch"); return 0; @@ -16401,7 +17842,7 @@ diff %= DTLS_WORD_BITS; if (idx < WOLFSSL_DTLS_WINDOW_WORDS) - window[idx] |= (1 << diff); + window[idx] |= (1U << diff); } else { _DtlsUpdateWindowGTSeq(diff + 1, window); @@ -16415,7 +17856,7 @@ return 1; } -static int _DtlsUpdateWindow(WOLFSSL* ssl) +int DtlsUpdateWindow(WOLFSSL* ssl) { WOLFSSL_DTLS_PEERSEQ* peerSeq = ssl->keys.peerSeq; word16 *next_hi; @@ -16481,7 +17922,13 @@ } #ifdef WOLFSSL_DTLS13 -static WC_INLINE int Dtls13UpdateWindow(WOLFSSL* ssl) + +/* Update DTLS 1.3 window + * Return + * 0 on successful update + * <0 on error + */ +static int Dtls13UpdateWindow(WOLFSSL* ssl) { w64wrapper nextSeq, seq; w64wrapper diff64; @@ -16489,14 +17936,26 @@ int wordOffset; int wordIndex; word32 diff; + Dtls13Epoch* e = ssl->dtls13DecryptEpoch; + + WOLFSSL_ENTER("Dtls13UpdateWindow"); if (ssl->dtls13DecryptEpoch == NULL) { WOLFSSL_MSG("Can't find decrypting Epoch"); return BAD_STATE_E; } - nextSeq = ssl->dtls13DecryptEpoch->nextPeerSeqNumber; - window = ssl->dtls13DecryptEpoch->window; + if (!w64Equal(ssl->keys.curEpoch64, ssl->dtls13DecryptEpoch->epochNumber)) { + /* ssl->dtls13DecryptEpoch has been updated since we received the msg */ + e = Dtls13GetEpoch(ssl, ssl->keys.curEpoch64); + if (e == NULL) { + WOLFSSL_MSG("Can't find decrypting Epoch"); + return BAD_STATE_E; + } + } + + nextSeq = e->nextPeerSeqNumber; + window = e->window; seq = ssl->keys.curSeq; /* seq < nextSeq */ @@ -16517,7 +17976,7 @@ } window[wordIndex] |= (1 << wordOffset); - return 1; + return 0; } /* seq >= nextSeq, seq - nextSeq */ @@ -16528,9 +17987,17 @@ _DtlsUpdateWindowGTSeq(w64GetLow32(diff64), window); w64Increment(&seq); - ssl->dtls13DecryptEpoch->nextPeerSeqNumber = seq; + e->nextPeerSeqNumber = seq; - return 1; + return 0; +} + +int Dtls13UpdateWindowRecordRecvd(WOLFSSL* ssl) +{ + int ret = Dtls13UpdateWindow(ssl); + if (ret != 0) + return ret; + return Dtls13RecordRecvd(ssl); } #endif /* WOLFSSL_DTLS13 */ @@ -16549,6 +18016,14 @@ item->ready && ret == 0) { word32 idx = 0; + #ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS + ret = MsgCheckEncryption(ssl, item->type, item->encrypted); + if (ret != 0) { + SendAlert(ssl, alert_fatal, unexpected_message); + break; + } + #endif + #ifdef WOLFSSL_NO_TLS12 ret = DoTls13HandShakeMsgType(ssl, item->fullMsg, &idx, item->type, item->sz, item->sz); @@ -16560,12 +18035,12 @@ DtlsTxMsgListClean(ssl); } else if (!IsAtLeastTLSv1_3(ssl->version)) { - if (SendFatalAlertOnly(ssl, ret) == SOCKET_ERROR_E) { + if (SendFatalAlertOnly(ssl, ret) == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) { ret = SOCKET_ERROR_E; } } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { break; } #endif @@ -16598,6 +18073,12 @@ return PARSE_ERROR; } + ret = EarlySanityCheckMsgReceived(ssl, type, fragSz); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + /* Cap the maximum size of a handshake message to something reasonable. * By default is the maximum size of a certificate message assuming * nine 2048-bit RSA certificates in the chain. */ @@ -16908,7 +18389,7 @@ /* add cipher info and then its length */ XMEMSET(padding, 0, sizeof(padding)); - if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, msglen)) != 0) + if ((ret = wc_Poly1305Update(ssl->auth.poly1305, out, (word32)msglen)) != 0) return ret; /* 32 bit size of cipher to 64 bit endian */ @@ -17155,7 +18636,7 @@ * * Return 0 on success negative values in error case */ -static int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input, +int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input, word16 sz) { byte add[AEAD_AUTH_DATA_SZ]; @@ -17293,7 +18774,7 @@ return ret; } if ((ret = wc_Poly1305_MAC(ssl->auth.poly1305, add, - sizeof(add), input, msgLen, tag, sizeof(tag))) != 0) { + sizeof(add), input, (word32)msgLen, tag, sizeof(tag))) != 0) { ForceZero(poly, sizeof(poly)); #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(poly, CHACHA20_256_KEY_SIZE); @@ -17317,7 +18798,7 @@ /* if the tag was good decrypt message */ if ((ret = wc_Chacha_Process(ssl->decrypt.chacha, plain, - input, msgLen)) != 0) + input, (word32)msgLen)) != 0) return ret; #ifdef CHACHA_AEAD_TEST @@ -17358,6 +18839,25 @@ #endif +#if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + +/* The following type is used to share code between SM4-GCM and SM4-CCM. */ +typedef int (*Sm4AuthEncryptFunc)(wc_Sm4* sm4, byte* out, const byte* in, + word32 sz, const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, + const byte* aad, word32 aadSz); +typedef int (*Sm4AuthDecryptFunc)(wc_Sm4* sm4, byte* out, const byte* in, + word32 sz, const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, + const byte* aad, word32 aadSz); + +#define SM4_AUTH_ENCRYPT_FUNC Sm4AuthEncryptFunc +#define SM4_AUTH_DECRYPT_FUNC Sm4AuthDecryptFunc +#define SM4_GCM_ENCRYPT_FUNC wc_Sm4GcmEncrypt +#define SM4_CCM_ENCRYPT_FUNC wc_Sm4CcmEncrypt +#define SM4_GCM_DECRYPT_FUNC wc_Sm4GcmDecrypt +#define SM4_CCM_DECRYPT_FUNC wc_Sm4CcmDecrypt + +#endif + static WC_INLINE int EncryptDo(WOLFSSL* ssl, byte* out, const byte* input, word16 sz, int asyncOkay) @@ -17397,7 +18897,7 @@ ret = wc_Des3_CbcEncrypt(ssl->encrypt.des3, out, input, sz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E && asyncOkay) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) { ret = wolfSSL_AsyncPush(ssl, asyncDev); } #endif @@ -17415,7 +18915,7 @@ #endif ret = wc_AesCbcEncrypt(ssl->encrypt.aes, out, input, sz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E && asyncOkay) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) { ret = wolfSSL_AsyncPush(ssl, asyncDev); } #endif @@ -17486,7 +18986,7 @@ ssl->encrypt.additional, AEAD_AUTH_DATA_SZ); } - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) #endif /* HAVE_PK_CALLBACKS */ { ret = aes_auth_fn(ssl->encrypt.aes, @@ -17499,7 +18999,7 @@ } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E && asyncOkay) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) { ret = wolfSSL_AsyncPush(ssl, asyncDev); } #endif @@ -17513,6 +19013,58 @@ break; #endif /* BUILD_AESGCM || HAVE_AESCCM */ + #ifdef HAVE_ARIA + case wolfssl_aria_gcm: + { + const byte* additionalSrc = input - RECORD_HEADER_SZ; + byte *outBuf = NULL; + XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ); + + /* sequence number field is 64-bits */ + WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional); + + /* Store the type, version. Unfortunately, they are in + * the input buffer ahead of the plaintext. */ + #ifdef WOLFSSL_DTLS + if (ssl->options.dtls) { + additionalSrc -= DTLS_HANDSHAKE_EXTRA; + } + #endif + XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET, + additionalSrc, 3); + + /* Store the length of the plain text minus the explicit + * IV length minus the authentication tag size. */ + c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->encrypt.additional + AEAD_LEN_OFFSET); + XMEMCPY(ssl->encrypt.nonce, + ssl->keys.aead_enc_imp_IV, AESGCM_IMP_IV_SZ); + XMEMCPY(ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, + ssl->keys.aead_exp_IV, AESGCM_EXP_IV_SZ); + outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (outBuf == NULL) { + ret = MEMORY_ERROR; + break; + } + ret = wc_AriaEncrypt(ssl->encrypt.aria, outBuf, + (byte*) input + AESGCM_EXP_IV_SZ, + sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->encrypt.nonce, AESGCM_NONCE_SZ, + ssl->encrypt.additional, AEAD_AUTH_DATA_SZ, + out + sz - ssl->specs.aead_mac_size, + ssl->specs.aead_mac_size + ); + if (ret != 0) + break; + XMEMCPY(out, + ssl->encrypt.nonce + AESGCM_IMP_IV_SZ, AESGCM_EXP_IV_SZ); + XMEMCPY(out + AESGCM_EXP_IV_SZ,outBuf,sz - AESGCM_EXP_IV_SZ); + XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + break; + } + #endif + #ifdef HAVE_CAMELLIA case wolfssl_camellia: ret = wc_CamelliaCbcEncrypt(ssl->encrypt.cam, out, input, sz); @@ -17526,6 +19078,95 @@ break; #endif + #ifdef WOLFSSL_SM4_CBC + case wolfssl_sm4_cbc: + #ifdef WOLFSSL_ASYNC_CRYPT + /* initialize event */ + asyncDev = &ssl->encrypt.sm4->asyncDev; + ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags); + if (ret != 0) + break; + #endif + ret = wc_Sm4CbcEncrypt(ssl->encrypt.sm4, out, input, sz); + #ifdef WOLFSSL_ASYNC_CRYPT + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) { + ret = wolfSSL_AsyncPush(ssl, asyncDev); + } + #endif + break; + #endif + + #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + case wolfssl_sm4_gcm: + case wolfssl_sm4_ccm:/* GCM AEAD macros use same size as CCM */ + { + SM4_AUTH_ENCRYPT_FUNC sm4_auth_fn; + const byte* additionalSrc; + + #ifdef WOLFSSL_ASYNC_CRYPT + /* initialize event */ + asyncDev = &ssl->encrypt.sm4->asyncDev; + ret = wolfSSL_AsyncInit(ssl, asyncDev, event_flags); + if (ret != 0) + break; + #endif + + #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM) + sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) + ? SM4_GCM_ENCRYPT_FUNC : SM4_CCM_ENCRYPT_FUNC; + #elif defined(WOLFSSL_SM4_GCM) + sm4_auth_fn = SM4_GCM_ENCRYPT_FUNC; + #else + sm4_auth_fn = SM4_CCM_ENCRYPT_FUNC; + #endif + additionalSrc = input - 5; + + XMEMSET(ssl->encrypt.additional, 0, AEAD_AUTH_DATA_SZ); + + /* sequence number field is 64-bits */ + WriteSEQ(ssl, CUR_ORDER, ssl->encrypt.additional); + + /* Store the type, version. Unfortunately, they are in + * the input buffer ahead of the plaintext. */ + #ifdef WOLFSSL_DTLS + if (ssl->options.dtls) { + additionalSrc -= DTLS_HANDSHAKE_EXTRA; + } + #endif + XMEMCPY(ssl->encrypt.additional + AEAD_TYPE_OFFSET, + additionalSrc, 3); + + /* Store the length of the plain text minus the explicit + * IV length minus the authentication tag size. */ + c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->encrypt.additional + AEAD_LEN_OFFSET); + XMEMCPY(ssl->encrypt.nonce, + ssl->keys.aead_enc_imp_IV, GCM_IMP_IV_SZ); + XMEMCPY(ssl->encrypt.nonce + GCM_IMP_IV_SZ, + ssl->keys.aead_exp_IV, GCM_EXP_IV_SZ); + ret = sm4_auth_fn(ssl->encrypt.sm4, + out + GCM_EXP_IV_SZ, input + GCM_EXP_IV_SZ, + sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->encrypt.nonce, GCM_NONCE_SZ, + out + sz - ssl->specs.aead_mac_size, + ssl->specs.aead_mac_size, + ssl->encrypt.additional, AEAD_AUTH_DATA_SZ); + + #ifdef WOLFSSL_ASYNC_CRYPT + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && asyncOkay) { + ret = wolfSSL_AsyncPush(ssl, asyncDev); + } + #endif +#if !defined(NO_PUBLIC_GCM_SET_IV) && \ + ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))) + XMEMCPY(out, + ssl->encrypt.nonce + GCM_IMP_IV_SZ, GCM_EXP_IV_SZ); +#endif + } + break; + #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */ + #ifdef HAVE_NULL_CIPHER case wolfssl_cipher_null: if (input != out) { @@ -17542,7 +19183,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* if async is not okay, then block */ - if (ret == WC_PENDING_E && !asyncOkay) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && !asyncOkay) { ret = wc_AsyncWait(ret, asyncDev, event_flags); } #endif @@ -17556,7 +19197,7 @@ int ret = 0; #ifdef WOLFSSL_ASYNC_CRYPT - if (ssl->error == WC_PENDING_E) { + if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) { ssl->error = 0; /* clear async */ } #endif @@ -17582,18 +19223,19 @@ ssl->fuzzerCb(ssl, input, sz, FUZZ_ENCRYPT, ssl->fuzzerCtx); #endif - #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) + #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) /* make sure AES GCM/CCM memory is allocated */ /* free for these happens in FreeCiphers */ if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm || - ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) { + ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm || + ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) { /* make sure auth iv and auth are allocated */ if (ssl->encrypt.additional == NULL) ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ, - ssl->heap, DYNAMIC_TYPE_AES_BUFFER); + ssl->heap, DYNAMIC_TYPE_CIPHER); if (ssl->encrypt.nonce == NULL) { ssl->encrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ, - ssl->heap, DYNAMIC_TYPE_AES_BUFFER); + ssl->heap, DYNAMIC_TYPE_CIPHER); #ifdef WOLFSSL_CHECK_MEM_ZERO if (ssl->encrypt.nonce != NULL) { wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce, @@ -17606,7 +19248,33 @@ return MEMORY_E; } } - #endif /* BUILD_AESGCM || HAVE_AESCCM */ + #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */ + + #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + /* make sure SM4 GCM/CCM memory is allocated */ + /* free for these happens in FreeCiphers */ + if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm || + ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) { + /* make sure auth iv and auth are allocated */ + if (ssl->encrypt.additional == NULL) + ssl->encrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ, + ssl->heap, DYNAMIC_TYPE_CIPHER); + if (ssl->encrypt.nonce == NULL) { + ssl->encrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ, + ssl->heap, DYNAMIC_TYPE_CIPHER); + #ifdef WOLFSSL_CHECK_MEM_ZERO + if (ssl->encrypt.nonce != NULL) { + wc_MemZero_Add("Encrypt nonce", ssl->encrypt.nonce, + GCM_NONCE_SZ); + } + #endif + } + if (ssl->encrypt.additional == NULL || + ssl->encrypt.nonce == NULL) { + return MEMORY_E; + } + } + #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */ /* Advance state and proceed */ ssl->encrypt.state = CIPHER_STATE_DO; @@ -17622,7 +19290,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* If pending, then leave and return will resume below */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -17644,9 +19312,10 @@ sizeof(ssl->encrypt.sanityCheck)); #endif - #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) + #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm || - ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) + ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm || + ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) { /* finalize authentication cipher */ #if !defined(NO_PUBLIC_GCM_SET_IV) && \ @@ -17657,7 +19326,17 @@ if (ssl->encrypt.nonce) ForceZero(ssl->encrypt.nonce, AESGCM_NONCE_SZ); } - #endif /* BUILD_AESGCM || HAVE_AESCCM */ + #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */ + #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm || + ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) + { + /* finalize authentication cipher */ + AeadIncrementExpIV(ssl); + if (ssl->encrypt.nonce) + ForceZero(ssl->encrypt.nonce, GCM_NONCE_SZ); + } + #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */ #ifdef WOLFSSL_CHECK_MEM_ZERO if ((ssl->specs.bulk_cipher_algorithm != wolfssl_cipher_null) && (out != input) && (ret == 0)) { @@ -17707,7 +19386,7 @@ ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev); } #endif @@ -17725,7 +19404,7 @@ #endif ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev); } #endif @@ -17791,7 +19470,7 @@ ssl->decrypt.additional, AEAD_AUTH_DATA_SZ); } - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) #endif /* HAVE_PK_CALLBACKS */ { if ((ret = aes_auth_fn(ssl->decrypt.aes, @@ -17803,7 +19482,7 @@ ssl->specs.aead_mac_size, ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev); } @@ -17814,6 +19493,57 @@ break; #endif /* BUILD_AESGCM || HAVE_AESCCM */ + #ifdef HAVE_ARIA + case wolfssl_aria_gcm: + { + byte *outBuf = NULL; + XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ); + + /* sequence number field is 64-bits */ + WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional); + + ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type; + ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor; + ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor; + + c16toa(sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->decrypt.additional + AEAD_LEN_OFFSET); + + #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) + if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl)) + XMEMCPY(ssl->decrypt.nonce, + ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV, + AESGCM_IMP_IV_SZ); + else + #endif + XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, + AESGCM_IMP_IV_SZ); + XMEMCPY(ssl->decrypt.nonce + AESGCM_IMP_IV_SZ, input, + AESGCM_EXP_IV_SZ); + outBuf = (byte*)XMALLOC(sz - AESGCM_EXP_IV_SZ, ssl->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (outBuf == NULL) { + ret = MEMORY_ERROR; + break; + } + ret = wc_AriaDecrypt(ssl->decrypt.aria, outBuf, + (byte *)input + AESGCM_EXP_IV_SZ, + sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->decrypt.nonce, AESGCM_NONCE_SZ, + ssl->decrypt.additional, AEAD_AUTH_DATA_SZ, + (byte *)input + sz - ssl->specs.aead_mac_size, + ssl->specs.aead_mac_size + ); + if (ret != 0) + break; + XMEMCPY(plain + AESGCM_EXP_IV_SZ, + outBuf, + sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size); + XFREE(outBuf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + break; + } + #endif /* HAVE_ARIA */ + #ifdef HAVE_CAMELLIA case wolfssl_camellia: ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz); @@ -17827,6 +19557,88 @@ break; #endif + #ifdef WOLFSSL_SM4_CBC + case wolfssl_sm4_cbc: + #ifdef WOLFSSL_ASYNC_CRYPT + /* initialize event */ + ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.aes->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + if (ret != 0) + break; + #endif + ret = wc_Sm4CbcDecrypt(ssl->decrypt.sm4, plain, input, sz); + #ifdef WOLFSSL_ASYNC_CRYPT + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { + ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev); + } + #endif + break; + #endif + + #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + case wolfssl_sm4_gcm: + case wolfssl_sm4_ccm: /* GCM AEAD macros use same size as CCM */ + { + SM4_AUTH_DECRYPT_FUNC sm4_auth_fn; + + #ifdef WOLFSSL_ASYNC_CRYPT + /* initialize event */ + ret = wolfSSL_AsyncInit(ssl, &ssl->decrypt.sm4->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + if (ret != 0) + break; + #endif + + #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM4_CCM) + sm4_auth_fn = (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) + ? SM4_GCM_DECRYPT_FUNC : SM4_CCM_DECRYPT_FUNC; + #elif defined(WOLFSSL_SM4_GCM) + sm4_auth_fn = SM4_GCM_DECRYPT_FUNC; + #else + sm4_auth_fn = SM4_CCM_DECRYPT_FUNC; + #endif + + XMEMSET(ssl->decrypt.additional, 0, AEAD_AUTH_DATA_SZ); + + /* sequence number field is 64-bits */ + WriteSEQ(ssl, PEER_ORDER, ssl->decrypt.additional); + + ssl->decrypt.additional[AEAD_TYPE_OFFSET] = ssl->curRL.type; + ssl->decrypt.additional[AEAD_VMAJ_OFFSET] = ssl->curRL.pvMajor; + ssl->decrypt.additional[AEAD_VMIN_OFFSET] = ssl->curRL.pvMinor; + + c16toa(sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->decrypt.additional + AEAD_LEN_OFFSET); + + #if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION) + if (ssl->options.dtls && IsDtlsMsgSCRKeys(ssl)) + XMEMCPY(ssl->decrypt.nonce, + ssl->secure_renegotiation->tmp_keys.aead_dec_imp_IV, + GCM_IMP_IV_SZ); + else + #endif + XMEMCPY(ssl->decrypt.nonce, ssl->keys.aead_dec_imp_IV, + GCM_IMP_IV_SZ); + XMEMCPY(ssl->decrypt.nonce + GCM_IMP_IV_SZ, input, GCM_EXP_IV_SZ); + if ((ret = sm4_auth_fn(ssl->decrypt.sm4, + plain + GCM_EXP_IV_SZ, + input + GCM_EXP_IV_SZ, + sz - GCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->decrypt.nonce, GCM_NONCE_SZ, + input + sz - ssl->specs.aead_mac_size, + ssl->specs.aead_mac_size, + ssl->decrypt.additional, AEAD_AUTH_DATA_SZ)) < 0) { + #ifdef WOLFSSL_ASYNC_CRYPT + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { + ret = wolfSSL_AsyncPush(ssl, + &ssl->decrypt.sm4->asyncDev); + } + #endif + } + } + break; + #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */ + #ifdef HAVE_NULL_CIPHER case wolfssl_cipher_null: if (input != plain) { @@ -17857,9 +19669,9 @@ #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* check for still pending */ - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; ssl->error = 0; /* clear async */ @@ -17883,18 +19695,19 @@ return DECRYPT_ERROR; } - #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) + #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) /* make sure AES GCM/CCM memory is allocated */ /* free for these happens in FreeCiphers */ if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm || - ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) { + ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm || + ssl->specs.bulk_cipher_algorithm == wolfssl_aria_gcm) { /* make sure auth iv and auth are allocated */ if (ssl->decrypt.additional == NULL) ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ, - ssl->heap, DYNAMIC_TYPE_AES_BUFFER); + ssl->heap, DYNAMIC_TYPE_CIPHER); if (ssl->decrypt.nonce == NULL) { ssl->decrypt.nonce = (byte*)XMALLOC(AESGCM_NONCE_SZ, - ssl->heap, DYNAMIC_TYPE_AES_BUFFER); + ssl->heap, DYNAMIC_TYPE_CIPHER); #ifdef WOLFSSL_CHECK_MEM_ZERO if (ssl->decrypt.nonce != NULL) { wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce, @@ -17907,7 +19720,33 @@ return MEMORY_E; } } - #endif /* BUILD_AESGCM || HAVE_AESCCM */ + #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */ + + #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + /* make sure SM4 GCM/CCM memory is allocated */ + /* free for these happens in FreeCiphers */ + if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm || + ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) { + /* make sure auth iv and auth are allocated */ + if (ssl->decrypt.additional == NULL) + ssl->decrypt.additional = (byte*)XMALLOC(AEAD_AUTH_DATA_SZ, + ssl->heap, DYNAMIC_TYPE_CIPHER); + if (ssl->decrypt.nonce == NULL) { + ssl->decrypt.nonce = (byte*)XMALLOC(GCM_NONCE_SZ, + ssl->heap, DYNAMIC_TYPE_CIPHER); + #ifdef WOLFSSL_CHECK_MEM_ZERO + if (ssl->decrypt.nonce != NULL) { + wc_MemZero_Add("DecryptTls nonce", ssl->decrypt.nonce, + GCM_NONCE_SZ); + } + #endif + } + if (ssl->decrypt.additional == NULL || + ssl->decrypt.nonce == NULL) { + return MEMORY_E; + } + } + #endif /* WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM */ /* Advance state and proceed */ ssl->decrypt.state = CIPHER_STATE_DO; @@ -17947,7 +19786,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* If pending, leave and return below */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -17955,7 +19794,7 @@ FALL_THROUGH; case CIPHER_STATE_END: { - #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) + #if defined(BUILD_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) /* make sure AES GCM/CCM nonce is cleared */ if (ssl->specs.bulk_cipher_algorithm == wolfssl_aes_ccm || ssl->specs.bulk_cipher_algorithm == wolfssl_aes_gcm) { @@ -17967,6 +19806,19 @@ WOLFSSL_ERROR_VERBOSE(ret); } } + #endif /* BUILD_AESGCM || HAVE_AESCCM || HAVE_ARIA */ + #if defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + /* make sure SM4 GCM/CCM nonce is cleared */ + if (ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_ccm || + ssl->specs.bulk_cipher_algorithm == wolfssl_sm4_gcm) { + if (ssl->decrypt.nonce) + ForceZero(ssl->decrypt.nonce, GCM_NONCE_SZ); + + if (ret < 0) { + ret = VERIFY_MAC_ERROR; + WOLFSSL_ERROR_VERBOSE(ret); + } + } #endif /* BUILD_AESGCM || HAVE_AESCCM */ break; } @@ -18554,7 +20406,8 @@ return BUFFER_ERROR; } #ifdef WOLFSSL_EARLY_DATA - if (ssl->earlyData > early_data_ext) { + if (ssl->options.side == WOLFSSL_SERVER_END && + ssl->earlyData > early_data_ext) { if (ssl->earlyDataSz + dataSz > ssl->options.maxEarlyDataSz) { if (sniff == NO_SNIFF) { SendAlert(ssl, alert_fatal, unexpected_message); @@ -18578,7 +20431,7 @@ idx += rawSz; ssl->buffers.clearOutputBuffer.buffer = rawData; - ssl->buffers.clearOutputBuffer.length = dataSz; + ssl->buffers.clearOutputBuffer.length = (unsigned int)dataSz; } idx += ssl->keys.padSz; @@ -18594,11 +20447,14 @@ #endif *inOutIdx = idx; +#ifdef WOLFSSL_DTLS13 + if (ssl->options.connectState == WAIT_FINISHED_ACK) { + /* DTLS 1.3 is waiting for an ACK but we can still return app data. */ + return APP_DATA_READY; + } +#endif #ifdef HAVE_SECURE_RENEGOTIATION if (IsSCR(ssl)) { - /* Reset the processReply state since - * we finished processing this message. */ - ssl->options.processReply = doProcessInit; /* If we are in a secure renegotiation then APP DATA is treated * differently */ return APP_DATA_READY; @@ -18913,10 +20769,16 @@ inSz = (int)(size - usedLength); /* from last partial read */ #ifdef WOLFSSL_DTLS - if (ssl->options.dtls) { - if (size < ssl->dtls_expected_rx) - dtlsExtra = (int)(ssl->dtls_expected_rx - size); - inSz = ssl->dtls_expected_rx; + if (ssl->options.dtls && IsDtlsNotSctpMode(ssl)) { + /* Add DTLS_MTU_ADDITIONAL_READ_BUFFER bytes so that we can operate with + * slight difference in set MTU size on each peer */ +#ifdef WOLFSSL_DTLS_MTU + inSz = (word32)ssl->dtlsMtuSz + DTLS_MTU_ADDITIONAL_READ_BUFFER; +#else + inSz = MAX_MTU + DTLS_MTU_ADDITIONAL_READ_BUFFER; +#endif + if (size < (word32)inSz) + dtlsExtra = (int)(inSz - size); } #endif @@ -18938,14 +20800,14 @@ /* remove processed data */ ssl->buffers.inputBuffer.idx = 0; - ssl->buffers.inputBuffer.length = usedLength; + ssl->buffers.inputBuffer.length = (word32)usedLength; /* read data from network */ do { int in = wolfSSLReceive(ssl, ssl->buffers.inputBuffer.buffer + ssl->buffers.inputBuffer.length, - inSz); + (word32)inSz); if (in == WANT_READ) return WANT_READ; @@ -18996,7 +20858,7 @@ } ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER); - ret |= ConstantCompare(verify, input + msgSz - digestSz, digestSz); + ret |= ConstantCompare(verify, input + msgSz - digestSz, (int)digestSz); if (ret != 0) { WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR); return VERIFY_MAC_ERROR; @@ -19036,12 +20898,14 @@ void* ctx = wolfSSL_GetVerifyMacCtx(ssl); ret = ssl->ctx->VerifyMacCb(ssl, input, (msgSz - ivExtra) - digestSz - pad - 1, - digestSz, content, ctx); - if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) { + digestSz, (word32)content, ctx); + if (ret != 0 && + ret != WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) { return ret; } } - if (!ssl->ctx->VerifyMacCb || ret == PROTOCOLCB_UNAVAILABLE) + if (!ssl->ctx->VerifyMacCb || + ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) #endif ret = TimingPadVerify(ssl, input, pad, digestSz, msgSz - ivExtra, content); @@ -19062,9 +20926,9 @@ } (void)PadCheck(dummy, (byte)pad, MAX_PAD_SIZE); /* timing only */ ret = ssl->hmac(ssl, verify, input, msgSz - digestSz - pad - 1, - pad, content, 1, PEER_ORDER); + (int)pad, content, 1, PEER_ORDER); if (ConstantCompare(verify, input + msgSz - digestSz - pad - 1, - digestSz) != 0) { + (int)digestSz) != 0) { WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR); return VERIFY_MAC_ERROR; } @@ -19077,7 +20941,7 @@ else if (ssl->specs.cipher_type == stream) { ret = ssl->hmac(ssl, verify, input, msgSz - digestSz, -1, content, 1, PEER_ORDER); - if (ConstantCompare(verify, input + msgSz - digestSz, digestSz) != 0) { + if (ConstantCompare(verify, input + msgSz - digestSz, (int)digestSz) != 0) { WOLFSSL_ERROR_VERBOSE(VERIFY_MAC_ERROR); return VERIFY_MAC_ERROR; } @@ -19125,14 +20989,16 @@ static int DtlsShouldDrop(WOLFSSL* ssl, int retcode) { - if (ssl->options.handShakeDone && !IsEncryptionOn(ssl, 0)) { + if (ssl->options.handShakeDone && !IsEncryptionOn(ssl, 0) && + !ssl->options.dtlsHsRetain) { WOLFSSL_MSG("Silently dropping plaintext DTLS message " - "on established connection."); + "on established connection when we have nothing to send."); return 1; } if ((ssl->options.handShakeDone && retcode != 0) - || retcode == SEQUENCE_ERROR || retcode == DTLS_CID_ERROR) { + || retcode == WC_NO_ERR_TRACE(SEQUENCE_ERROR) + || retcode == WC_NO_ERR_TRACE(DTLS_CID_ERROR)) { WOLFSSL_MSG_EX("Silently dropping DTLS message: %d", retcode); return 1; } @@ -19148,21 +21014,9 @@ #ifndef NO_WOLFSSL_SERVER if (ssl->options.side == WOLFSSL_SERVER_END - && ssl->curRL.type != handshake) { - int beforeCookieVerified = 0; - if (!IsAtLeastTLSv1_3(ssl->version)) { - beforeCookieVerified = - ssl->options.acceptState < ACCEPT_FIRST_REPLY_DONE; - } -#ifdef WOLFSSL_DTLS13 - else { - beforeCookieVerified = - ssl->options.acceptState < TLS13_ACCEPT_SECOND_REPLY_DONE; - } -#endif /* WOLFSSL_DTLS13 */ - - if (beforeCookieVerified) { - WOLFSSL_MSG("Drop non-handshake record before handshake"); + && ssl->curRL.type != handshake && !IsSCR(ssl)) { + if (!ssl->options.dtlsStateful) { + WOLFSSL_MSG("Drop non-handshake record when not stateful"); return 1; } } @@ -19185,7 +21039,6 @@ { int ret = 0, type = internal_error, readSz; int atomicUser = 0; - word32 startIdx = 0; #if defined(WOLFSSL_DTLS) int used; #endif @@ -19196,7 +21049,7 @@ #endif if (ssl->error != 0 && ssl->error != WANT_READ && ssl->error != WANT_WRITE - #ifdef HAVE_SECURE_RENEGOTIATION + #if defined(HAVE_SECURE_RENEGOTIATION) || defined(WOLFSSL_DTLS13) && ssl->error != APP_DATA_READY #endif #ifdef WOLFSSL_ASYNC_CRYPT @@ -19205,7 +21058,8 @@ #ifdef WOLFSSL_NONBLOCK_OCSP && ssl->error != OCSP_WANT_READ #endif - && (allowSocketErr != 1 || ssl->error != SOCKET_ERROR_E) + && (allowSocketErr != 1 || + ssl->error != WC_NO_ERR_TRACE(SOCKET_ERROR_E)) ) { WOLFSSL_MSG("ProcessReply retry in error state, not allowed"); return ssl->error; @@ -19216,7 +21070,8 @@ #if defined(WOLFSSL_CHECK_ALERT_ON_ERR) && \ (defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP)) if (allowSocketErr == 1 && \ - (ssl->error == WC_PENDING_E || ssl->error == OCSP_WANT_READ)) { + (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) || + ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ))) { return ssl->error; } #endif @@ -19247,8 +21102,10 @@ #endif ret = RetrySendAlert(ssl); - if (ret != 0) + if (ret != 0) { + WOLFSSL_MSG_EX("RetrySendAlert failed, giving up. err = %d", ret); return ret; + } for (;;) { switch (ssl->options.processReply) { @@ -19273,7 +21130,7 @@ /* get header or return error */ if (!ssl->options.dtls) { - if ((ret = GetInputData(ssl, readSz)) < 0) + if ((ret = GetInputData(ssl, (word32)readSz)) < 0) return ret; } else { #ifdef WOLFSSL_DTLS @@ -19281,7 +21138,7 @@ used = ssl->buffers.inputBuffer.length - ssl->buffers.inputBuffer.idx; if (used < readSz) { - if ((ret = GetInputData(ssl, readSz)) < 0) + if ((ret = GetInputData(ssl, (word32)readSz)) < 0) return ret; } #endif @@ -19367,7 +21224,7 @@ case getRecordLayerHeader: /* DTLSv1.3 record numbers in the header are encrypted, and AAD - * uses the unecrypted form. Because of this we need to modify the + * uses the unencrypted form. Because of this we need to modify the * header, decrypting the numbers inside * DtlsParseUnifiedRecordLayer(). This violates the const attribute * of the buffer parameter of GetRecordHeader() used here. */ @@ -19395,7 +21252,7 @@ #endif if (ret != 0) { switch (ret) { - case VERSION_ERROR: + case WC_NO_ERR_TRACE(VERSION_ERROR): /* send alert per RFC5246 Appendix E. Backward * Compatibility */ if (ssl->options.side == WOLFSSL_CLIENT_END) @@ -19403,7 +21260,7 @@ wolfssl_alert_protocol_version); break; #ifdef HAVE_MAX_FRAGMENT - case LENGTH_ERROR: + case WC_NO_ERR_TRACE(LENGTH_ERROR): SendAlert(ssl, alert_fatal, record_overflow); break; #endif /* HAVE_MAX_FRAGMENT */ @@ -19477,7 +21334,8 @@ ssl->keys.padSz = 0; ssl->options.processReply = verifyEncryptedMessage; - startIdx = ssl->buffers.inputBuffer.idx; /* in case > 1 msg per */ + /* in case > 1 msg per record */ + ssl->curStartIdx = ssl->buffers.inputBuffer.idx; FALL_THROUGH; /* verify digest of encrypted message */ @@ -19489,7 +21347,7 @@ ssl->buffers.inputBuffer.idx, ssl->curSize, ssl->curRL.type); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif if (ret < 0) { @@ -19636,7 +21494,7 @@ } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif @@ -19720,7 +21578,7 @@ ssl->curSize, ssl->curRL.type, &ssl->keys.padSz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif if (ret < 0) { @@ -19734,7 +21592,7 @@ return HandleDTLSDecryptFailed(ssl); } #endif /* WOLFSSL_DTLS */ - #ifdef WOLFSSL_EXTRA_ALERTS + #if defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_ETM_ALERT) if (!ssl->options.dtls) SendAlert(ssl, alert_fatal, bad_record_mac); #endif @@ -19748,11 +21606,11 @@ ssl->keys.decryptedCur = 1; #ifdef WOLFSSL_TLS13 if (ssl->options.tls1_3) { - /* end of plaintext */ - word16 i = (word16)(ssl->buffers.inputBuffer.idx + - ssl->curSize - ssl->specs.aead_mac_size); - - if (i > ssl->buffers.inputBuffer.length) { + word32 i = (ssl->buffers.inputBuffer.idx + + ssl->curSize - ssl->specs.aead_mac_size); + /* check that the end of the logical length doesn't extend + * past the real buffer */ + if (i > ssl->buffers.inputBuffer.length || i == 0) { WOLFSSL_ERROR(BUFFER_ERROR); return BUFFER_ERROR; } @@ -19778,31 +21636,32 @@ /* the record layer is here */ case runProcessingOneRecord: #ifdef WOLFSSL_DTLS13 - if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version)) { - - if(!Dtls13CheckWindow(ssl)) { - /* drop packet */ - WOLFSSL_MSG( - "Dropping DTLS record outside receiving window"); - ssl->options.processReply = doProcessInit; - ssl->buffers.inputBuffer.idx += ssl->curSize; - if (ssl->buffers.inputBuffer.idx > - ssl->buffers.inputBuffer.length) - return BUFFER_E; + if (ssl->options.dtls) { + if (IsAtLeastTLSv1_3(ssl->version)) { + if (!Dtls13CheckWindow(ssl)) { + /* drop packet */ + WOLFSSL_MSG("Dropping DTLS record outside receiving " + "window"); + ssl->options.processReply = doProcessInit; + ssl->buffers.inputBuffer.idx += ssl->curSize; + if (ssl->buffers.inputBuffer.idx > + ssl->buffers.inputBuffer.length) + return BUFFER_E; - continue; - } + continue; + } - ret = Dtls13UpdateWindow(ssl); - if (ret != 1) { - WOLFSSL_ERROR(ret); - return ret; + /* Only update the window once we enter stateful parsing */ + if (ssl->options.dtlsStateful) { + ret = Dtls13UpdateWindowRecordRecvd(ssl); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + } } - - ret = Dtls13RecordRecvd(ssl); - if (ret != 0) { - WOLFSSL_ERROR(ret); - return ret; + else if (IsDtlsNotSctpMode(ssl)) { + DtlsUpdateWindow(ssl); } } #endif /* WOLFSSL_DTLS13 */ @@ -19820,7 +21679,7 @@ /* For TLS v1.1 the block size and explicit IV are added to idx, * so it needs to be included in this limit check */ if ((ssl->curSize - ssl->keys.padSz - - (ssl->buffers.inputBuffer.idx - startIdx) - + (ssl->buffers.inputBuffer.idx - ssl->curStartIdx) - MacSize(ssl) > MAX_PLAINTEXT_SZ) #ifdef WOLFSSL_ASYNC_CRYPT && ssl->buffers.inputBuffer.length != @@ -19828,7 +21687,7 @@ #endif ) { WOLFSSL_MSG("Plaintext too long - Encrypt-Then-MAC"); - #if defined(WOLFSSL_EXTRA_ALERTS) + #if defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_ETM_ALERT) SendAlert(ssl, alert_fatal, record_overflow); #endif WOLFSSL_ERROR_VERBOSE(BUFFER_ERROR); @@ -19837,16 +21696,16 @@ } else #endif - /* TLS13 plaintext limit is checked earlier before decryption */ - /* For TLS v1.1 the block size and explicit IV are added to idx, - * so it needs to be included in this limit check */ - if (!IsAtLeastTLSv1_3(ssl->version) - && ssl->curSize - ssl->keys.padSz - - (ssl->buffers.inputBuffer.idx - startIdx) - > MAX_PLAINTEXT_SZ + /* TLS13 plaintext limit is checked earlier before decryption */ + /* For TLS v1.1 the block size and explicit IV are added to idx, + * so it needs to be included in this limit check */ + if (!IsAtLeastTLSv1_3(ssl->version) + && ssl->curSize - ssl->keys.padSz - + (ssl->buffers.inputBuffer.idx - ssl->curStartIdx) + > MAX_PLAINTEXT_SZ #ifdef WOLFSSL_ASYNC_CRYPT - && ssl->buffers.inputBuffer.length != - ssl->buffers.inputBuffer.idx + && ssl->buffers.inputBuffer.length != + ssl->buffers.inputBuffer.idx #endif ) { WOLFSSL_MSG("Plaintext too long"); @@ -19857,17 +21716,6 @@ return BUFFER_ERROR; } -#ifdef WOLFSSL_DTLS - if (IsDtlsNotSctpMode(ssl) && !IsAtLeastTLSv1_3(ssl->version)) { - _DtlsUpdateWindow(ssl); - } - - if (ssl->options.dtls) { - /* Reset timeout as we have received a valid DTLS message */ - ssl->dtls_timeout = ssl->dtls_timeout_init; - } -#endif /* WOLFSSL_DTLS */ - WOLFSSL_MSG("received record layer msg"); switch (ssl->curRL.type) { @@ -19877,16 +21725,22 @@ if (ssl->options.dtls) { #ifdef WOLFSSL_DTLS if (!IsAtLeastTLSv1_3(ssl->version)) { - ret = DoDtlsHandShakeMsg(ssl, - ssl->buffers.inputBuffer.buffer, - &ssl->buffers.inputBuffer.idx, - ssl->buffers.inputBuffer.length); - if (ret != 0) { - if (SendFatalAlertOnly(ssl, ret) - == SOCKET_ERROR_E) { - ret = SOCKET_ERROR_E; - } + ret = DoDtlsHandShakeMsg(ssl, + ssl->buffers.inputBuffer.buffer, + &ssl->buffers.inputBuffer.idx, + ssl->buffers.inputBuffer.length); + if (ret == 0 || + ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { + /* Reset timeout as we have received a valid + * DTLS handshake message */ + ssl->dtls_timeout = ssl->dtls_timeout_init; + } + else { + if (SendFatalAlertOnly(ssl, ret) + == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) { + ret = SOCKET_ERROR_E; } + } } #endif #ifdef WOLFSSL_DTLS13 @@ -19924,7 +21778,8 @@ &ssl->buffers.inputBuffer.idx, ssl->buffers.inputBuffer.length); if (ret != 0) { - if (SendFatalAlertOnly(ssl, ret) == SOCKET_ERROR_E) + if (SendFatalAlertOnly(ssl, ret) == + WC_NO_ERR_TRACE(SOCKET_ERROR_E)) ret = SOCKET_ERROR_E; } #else @@ -19964,7 +21819,7 @@ * Current message should have been DtlsMsgStore'ed and * should be processed with DtlsMsgDrain */ && (!ssl->options.dtls - || ret != WC_PENDING_E) + || ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif ) { WOLFSSL_ERROR(ret); @@ -20077,7 +21932,8 @@ /* Check for duplicate CCS message in DTLS mode. * DTLS allows for duplicate messages, and it should be * skipped. Also skip if out of order. */ - if (ret != DUPLICATE_MSG_E && ret != OUT_OF_ORDER_E) + if (ret != WC_NO_ERR_TRACE(DUPLICATE_MSG_E) && + ret != WC_NO_ERR_TRACE(OUT_OF_ORDER_E)) return ret; /* Reset error */ ret = 0; @@ -20168,7 +22024,13 @@ &ssl->buffers.inputBuffer.idx, NO_SNIFF)) != 0) { WOLFSSL_ERROR(ret); - return ret; + #if defined(WOLFSSL_DTLS13) || \ + defined(HAVE_SECURE_RENEGOTIATION) + /* Not really an error. We will return after cleaning + * up the processReply state. */ + if (ret != WC_NO_ERR_TRACE(APP_DATA_READY)) + #endif + return ret; } break; @@ -20225,9 +22087,18 @@ /* input exhausted */ if (ssl->buffers.inputBuffer.idx >= ssl->buffers.inputBuffer.length #ifdef WOLFSSL_DTLS - /* If app data was processed then return now to avoid - * dropping any app data. */ - || (ssl->options.dtls && ssl->curRL.type == application_data) + || (ssl->options.dtls && + /* If app data was processed then return now to avoid + * dropping any app data. */ + (ssl->curRL.type == application_data || + /* client: if we processed a finished message, return to + * allow higher layers to establish the crypto + * parameters of the connection. The remaining data + * may be app data that we would drop without the + * crypto setup. */ + (ssl->options.side == WOLFSSL_CLIENT_END && + ssl->options.serverState == SERVER_FINISHED_COMPLETE && + ssl->options.handShakeState != HANDSHAKE_DONE))) #endif ) { /* Shrink input buffer when we successfully finish record @@ -20237,7 +22108,8 @@ return ret; } /* more messages per record */ - else if ((ssl->buffers.inputBuffer.idx - startIdx) < ssl->curSize) { + else if ((ssl->buffers.inputBuffer.idx - ssl->curStartIdx) + < ssl->curSize) { WOLFSSL_MSG("More messages in record"); ssl->options.processReply = runProcessingOneMessage; @@ -20283,6 +22155,11 @@ if (ret != 0) return ret; #endif +#if defined(WOLFSSL_DTLS13) || defined(HAVE_SECURE_RENEGOTIATION) + /* Signal to user that we have application data ready to read */ + if (ret == WC_NO_ERR_TRACE(APP_DATA_READY)) + return ret; +#endif /* It is safe to shrink the input buffer here now. local vars will * be reset to the new starting value. */ if (ret == 0 && ssl->buffers.inputBuffer.dynamicFlag) @@ -20354,7 +22231,7 @@ input[0] = 1; /* turn it on */ #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl) && - (ret = DtlsMsgPoolSave(ssl, input, inputSz, change_cipher_hs)) != 0) { + (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, change_cipher_hs)) != 0) { return ret; } #endif @@ -20367,7 +22244,7 @@ #ifdef WOLFSSL_DTLS else { if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, change_cipher_hs)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, change_cipher_hs)) != 0) return ret; DtlsSEQIncrement(ssl, CUR_ORDER); } @@ -20471,7 +22348,7 @@ ret = wc_Md5Final(&md5, result); #ifdef WOLFSSL_ASYNC_CRYPT /* TODO: Make non-blocking */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE); } #endif @@ -20491,7 +22368,7 @@ ret = wc_Md5Final(&md5, digest); #ifdef WOLFSSL_ASYNC_CRYPT /* TODO: Make non-blocking */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wc_AsyncWait(ret, &md5.asyncDev, WC_ASYNC_FLAG_NONE); } #endif @@ -20521,7 +22398,7 @@ ret = wc_ShaFinal(&sha, result); #ifdef WOLFSSL_ASYNC_CRYPT /* TODO: Make non-blocking */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE); } #endif @@ -20541,7 +22418,7 @@ ret = wc_ShaFinal(&sha, digest); #ifdef WOLFSSL_ASYNC_CRYPT /* TODO: Make non-blocking */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wc_AsyncWait(ret, &sha.asyncDev, WC_ASYNC_FLAG_NONE); } #endif @@ -20562,7 +22439,8 @@ int ret; byte md5_result[WC_MD5_DIGEST_SIZE]; #ifdef WOLFSSL_SMALL_STACK - wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, DYNAMIC_TYPE_HASHCTX); + wc_Md5* md5 = (wc_Md5*)XMALLOC(sizeof(wc_Md5), ssl->heap, + DYNAMIC_TYPE_HASHCTX); #else wc_Md5 md5[1]; #endif @@ -20570,7 +22448,7 @@ /* make md5 inner */ ret = wc_Md5Copy(&ssl->hsHashes->hashMd5, md5); /* Save current position */ if (ret == 0) - ret = wc_Md5Update(md5, ssl->arrays->masterSecret,SECRET_LEN); + ret = wc_Md5Update(md5, ssl->arrays->masterSecret, SECRET_LEN); if (ret == 0) ret = wc_Md5Update(md5, PAD1, PAD_MD5); if (ret == 0) @@ -20600,13 +22478,14 @@ #endif /* !NO_MD5 && !NO_OLD_TLS */ #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ - defined(WOLFSSL_ALLOW_TLS_SHA1)) + defined(WOLFSSL_ALLOW_TLS_SHA1)) static int BuildSHA_CertVerify(const WOLFSSL* ssl, byte* digest) { int ret; byte sha_result[WC_SHA_DIGEST_SIZE]; #ifdef WOLFSSL_SMALL_STACK - wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, DYNAMIC_TYPE_HASHCTX); + wc_Sha* sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), ssl->heap, + DYNAMIC_TYPE_HASHCTX); #else wc_Sha sha[1]; #endif @@ -20614,7 +22493,7 @@ /* make sha inner */ ret = wc_ShaCopy(&ssl->hsHashes->hashSha, sha); /* Save current position */ if (ret == 0) - ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN); + ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN); if (ret == 0) ret = wc_ShaUpdate(sha, PAD1, PAD_SHA); if (ret == 0) @@ -20624,7 +22503,7 @@ if (ret == 0) { ret = wc_InitSha_ex(sha, ssl->heap, ssl->devId); if (ret == 0) { - ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret,SECRET_LEN); + ret = wc_ShaUpdate(sha, ssl->arrays->masterSecret, SECRET_LEN); if (ret == 0) ret = wc_ShaUpdate(sha, PAD2, PAD_SHA); if (ret == 0) @@ -20655,7 +22534,8 @@ if (ret != 0) return ret; #endif - #if !defined(NO_SHA) + #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ + defined(WOLFSSL_ALLOW_TLS_SHA1)) ret = wc_ShaGetHash(&ssl->hsHashes->hashSha, hashes->sha); if (ret != 0) return ret; @@ -20679,6 +22559,12 @@ if (ret != 0) return ret; #endif + #ifdef WOLFSSL_SM3 + ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, + hashes->sm3); + if (ret != 0) + return ret; + #endif } } else { @@ -20757,7 +22643,7 @@ #endif #ifdef WOLFSSL_ASYNC_CRYPT - ret = WC_NOT_PENDING_E; + ret = WC_NO_PENDING_E; if (asyncOkay) { if (ssl->async == NULL) { return BAD_FUNC_ARG; @@ -20765,7 +22651,7 @@ args = &ssl->async->buildArgs; ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_buildmsg; @@ -20779,7 +22665,7 @@ /* Reset state */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_NOT_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_NO_PENDING_E)) #endif { ret = 0; @@ -21008,7 +22894,7 @@ { if (ssl->ctx->MacEncryptCb) { ret = ssl->ctx->MacEncryptCb(ssl, output + args->idx, - output + args->headerSz + args->ivSz, inSz, + output + args->headerSz + args->ivSz, (unsigned int)inSz, type, 0, output + args->headerSz, output + args->headerSz, args->size, ssl->MacEncryptCtx); @@ -21040,7 +22926,7 @@ #endif ret = ssl->hmac(ssl, hmac, - output + args->headerSz + args->ivSz, inSz, + output + args->headerSz + args->ivSz, (word32)inSz, -1, type, 0, epochOrder); XMEMCPY(output + args->idx, hmac, args->digestSz); @@ -21052,7 +22938,7 @@ #endif { ret = ssl->hmac(ssl, output + args->idx, output + - args->headerSz + args->ivSz, inSz, -1, type, 0, epochOrder); + args->headerSz + args->ivSz, (word32)inSz, -1, type, 0, epochOrder); } } #endif /* WOLFSSL_AEAD_ONLY */ @@ -21113,7 +22999,7 @@ if (ret != 0) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* Zeroize plaintext. */ @@ -21190,7 +23076,7 @@ WOLFSSL_LEAVE("BuildMessage", ret); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -21205,7 +23091,7 @@ /* return sz on success */ if (ret == 0) { - ret = args->sz; + ret = (int)args->sz; } else { WOLFSSL_ERROR_VERBOSE(ret); @@ -21328,6 +23214,9 @@ #endif ssl->options.handShakeState = HANDSHAKE_DONE; ssl->options.handShakeDone = 1; +#ifdef HAVE_SECURE_RENEGOTIATION + ssl->options.resumed = ssl->options.resuming; +#endif } } else { @@ -21340,6 +23229,9 @@ #endif ssl->options.handShakeState = HANDSHAKE_DONE; ssl->options.handShakeDone = 1; +#ifdef HAVE_SECURE_RENEGOTIATION + ssl->options.resumed = ssl->options.resuming; +#endif } } @@ -21396,7 +23288,7 @@ InitDecodedCert(cert, certData, length, ssl->heap); /* TODO: Setup async support here */ - ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl)); + ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, SSL_CM(ssl), NULL); if (ret != 0) { WOLFSSL_MSG("ParseCert failed"); } @@ -21489,12 +23381,13 @@ if (ret == 0) { request->ssl = ssl; - ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response); + ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, request, response, + ssl->heap); /* Suppressing, not critical */ - if (ret == OCSP_CERT_REVOKED || - ret == OCSP_CERT_UNKNOWN || - ret == OCSP_LOOKUP_FAIL) { + if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) || + ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) || + ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) { ret = 0; } } @@ -21546,6 +23439,9 @@ int ret = 0; word32 certSz, certChainSz, headerSz, listSz, payloadSz; word32 length, maxFragment; +#ifdef HAVE_RPK + int usingRpkTls12 = 0; +#endif /* HAVE_RPK */ WOLFSSL_START(WC_FUNC_CERTIFICATE_SEND); WOLFSSL_ENTER("SendCertificate"); @@ -21555,6 +23451,21 @@ return 0; /* not needed */ } +#ifdef HAVE_RPK + if (!IsAtLeastTLSv1_3(ssl->version)) { + /* If this is (D)TLS1.2 and RPK, then single cert, not list. */ + if (ssl->options.side == WOLFSSL_SERVER_END) { + if (ssl->options.rpkState.sending_ServerCertTypeCnt == 1 && + ssl->options.rpkState.sending_ServerCertTypes[0] == WOLFSSL_CERT_TYPE_RPK) + usingRpkTls12 = 1; + } else if (ssl->options.side == WOLFSSL_CLIENT_END) { + if (ssl->options.rpkState.sending_ClientCertTypeCnt == 1 && + ssl->options.rpkState.sending_ClientCertTypes[0] == WOLFSSL_CERT_TYPE_RPK) + usingRpkTls12 = 1; + } + } +#endif /* HAVE_RPK */ + if (ssl->options.sendVerify == SEND_BLANK_CERT) { #ifdef OPENSSL_EXTRA if (ssl->version.major == SSLv3_MAJOR @@ -21577,10 +23488,19 @@ return BUFFER_ERROR; } certSz = ssl->buffers.certificate->length; - headerSz = 2 * CERT_HEADER_SZ; +#ifdef HAVE_RPK + if (usingRpkTls12) { + headerSz = 1 * CERT_HEADER_SZ; + listSz = certSz; + } else { +#endif /* HAVE_RPK */ + headerSz = 2 * CERT_HEADER_SZ; + listSz = certSz + CERT_HEADER_SZ; +#ifdef HAVE_RPK + } +#endif /* HAVE_RPK */ /* list + cert size */ length = certSz + headerSz; - listSz = certSz + CERT_HEADER_SZ; /* may need to send rest of chain, already has leading size(s) */ if (certSz && ssl->buffers.certChain) { @@ -21599,7 +23519,7 @@ maxFragment = MAX_RECORD_SIZE; - maxFragment = wolfSSL_GetMaxFragSize(ssl, maxFragment); + maxFragment = (word32)wolfSSL_GetMaxFragSize(ssl, (int)maxFragment); while (length > 0 && ret == 0) { byte* output = NULL; @@ -21673,12 +23593,18 @@ } /* list total */ - c32to24(listSz, output + i); - if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) - HashRaw(ssl, output + i, CERT_HEADER_SZ); - i += CERT_HEADER_SZ; - length -= CERT_HEADER_SZ; - fragSz -= CERT_HEADER_SZ; +#ifdef HAVE_RPK + if (!usingRpkTls12) { +#endif /* HAVE_RPK */ + c32to24(listSz, output + i); + if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) + HashRaw(ssl, output + i, CERT_HEADER_SZ); + i += CERT_HEADER_SZ; + length -= CERT_HEADER_SZ; + fragSz -= CERT_HEADER_SZ; +#ifdef HAVE_RPK + } +#endif /* HAVE_RPK */ if (certSz) { c32to24(certSz, output + i); if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) @@ -21688,10 +23614,10 @@ fragSz -= CERT_HEADER_SZ; if (ssl->options.dtls || !IsEncryptionOn(ssl, 1)) { - HashRaw(ssl, ssl->buffers.certificate->buffer, certSz); + HashRaw(ssl, ssl->buffers.certificate->buffer, (int)certSz); if (certChainSz) HashRaw(ssl, ssl->buffers.certChain->buffer, - certChainSz); + (int)certChainSz); } } } @@ -21730,7 +23656,7 @@ if (IsEncryptionOn(ssl, 1)) { byte* input = NULL; - int inputSz = i; /* build msg adds rec hdr */ + int inputSz = (int)i; /* build msg adds rec hdr */ int recordHeaderSz = RECORD_HEADER_SZ; if (ssl->options.dtls) @@ -21759,7 +23685,7 @@ handshake, 1, 0, 0, CUR_ORDER); else /* DTLS 1.2 has to ignore fragmentation in hashing so we need to * calculate the hash ourselves above */ { - if ((ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate)) != 0) { + if ((ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, certificate)) != 0) { XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); return ret; } @@ -21774,10 +23700,10 @@ return sendSz; } else { - sendSz = i; + sendSz = (int)i; #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, certificate)) != 0) return ret; } if (ssl->options.dtls) @@ -21829,7 +23755,7 @@ int sendSz; word32 i = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; word32 dnLen = 0; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) +#ifndef WOLFSSL_NO_CA_NAMES WOLF_STACK_OF(WOLFSSL_X509_NAME)* names; #endif const Suites* suites = WOLFSSL_SUITES(ssl); @@ -21843,7 +23769,7 @@ if (IsAtLeastTLSv1_2(ssl)) reqSz += LENGTH_SZ + suites->hashSigAlgoSz; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) +#ifndef WOLFSSL_NO_CA_NAMES /* Certificate Authorities */ names = SSL_CA_NAMES(ssl); while (names != NULL) { @@ -21890,7 +23816,7 @@ /* get output buffer */ output = GetOutputBuffer(ssl); - AddHeaders(output, reqSz, certificate_request, ssl); + AddHeaders(output, (word32)reqSz, certificate_request, ssl); /* write to output */ output[i++] = (byte)typeTotal; /* # of types */ @@ -21899,7 +23825,26 @@ ssl->options.cipherSuite0 == CHACHA_BYTE) && ssl->specs.sig_algo == ecc_dsa_sa_algo) { output[i++] = ecdsa_sign; - } else + } + else +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \ + (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \ + defined(WOLFSSL_SM4_CCM)) + if (ssl->options.cipherSuite0 == SM_BYTE && (0 + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + || ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + #endif + )) { + output[i++] = ecdsa_sign; + } + else +#endif #endif /* HAVE_ECC */ { output[i++] = rsa_sign; @@ -21917,7 +23862,7 @@ /* Certificate Authorities */ c16toa((word16)dnLen, &output[i]); /* auth's */ i += REQ_HEADER_SZ; -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) +#ifndef WOLFSSL_NO_CA_NAMES names = SSL_CA_NAMES(ssl); while (names != NULL) { byte seq[MAX_SEQ_SZ]; @@ -21938,7 +23883,7 @@ if (IsEncryptionOn(ssl, 1)) { byte* input = NULL; - int inputSz = i; /* build msg adds rec hdr */ + int inputSz = (int)i; /* build msg adds rec hdr */ int recordHeaderSz = RECORD_HEADER_SZ; if (ssl->options.dtls) @@ -21957,7 +23902,7 @@ XMEMCPY(input, output + recordHeaderSz, inputSz); #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl) && - (ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_request)) != 0) { + (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, certificate_request)) != 0) { XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); return ret; } @@ -21969,10 +23914,10 @@ if (sendSz < 0) return sendSz; } else { - sendSz = i; + sendSz = (int)i; #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_request)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, certificate_request)) != 0) return ret; } if (ssl->options.dtls) @@ -22016,6 +23961,7 @@ byte* output = NULL; word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; word32 length = ENUM_LEN; + word32 headerSz= idx; int sendSz = 0; int ret = 0; int i = 0; @@ -22035,88 +23981,42 @@ default: return 0; } +#ifdef WOLFSSL_DTLS + if (ssl->options.dtls) { + headerSz = idx = DTLS_RECORD_HEADER_SZ + DTLS_HANDSHAKE_HEADER_SZ; + sendSz = idx + length; - sendSz = idx + length; + } else +#endif + sendSz = (int)(idx + length); if (ssl->keys.encryptionOn) sendSz += MAX_MSG_EXTRA; - /* Set this in case CheckAvailableSize returns a WANT_WRITE so that state - * is not advanced yet */ - ssl->options.buildingMsg = 1; - - if ((ret = CheckAvailableSize(ssl, sendSz)) == 0) { - output = GetOutputBuffer(ssl); - - AddHeaders(output, length, certificate_status, ssl); - - output[idx++] = type; - - if (type == WOLFSSL_CSR2_OCSP_MULTI) { - c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx); - idx += OPAQUE24_LEN; - } - - for (i = 0; i < count; i++) { - c32to24(status[i].length, output + idx); - idx += OPAQUE24_LEN; - - XMEMCPY(output + idx, status[i].buffer, status[i].length); - idx += status[i].length; - } - - if (IsEncryptionOn(ssl, 1)) { - byte* input; - int inputSz = idx; /* build msg adds rec hdr */ - int recordHeaderSz = RECORD_HEADER_SZ; + output =(byte*)XMALLOC(sendSz, ssl->heap, DYNAMIC_TYPE_OCSP); + if (output == NULL) + return MEMORY_E; - if (ssl->options.dtls) - recordHeaderSz += DTLS_RECORD_EXTRA; - inputSz -= recordHeaderSz; - input = (byte*)XMALLOC(inputSz, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); - if (input == NULL) - return MEMORY_E; + AddHeaders(output, length, certificate_status, ssl); - XMEMCPY(input, output + recordHeaderSz, inputSz); - #ifdef WOLFSSL_DTLS - ret = DtlsMsgPoolSave(ssl, input, inputSz, certificate_status); - #endif - if (ret == 0) - sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, - handshake, 1, 0, 0, CUR_ORDER); - XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); + output[idx++] = type; - if (sendSz < 0) - ret = sendSz; - } - else { - #ifdef WOLFSSL_DTLS - if (ret == 0 && IsDtlsNotSctpMode(ssl)) - ret = DtlsMsgPoolSave(ssl, output, sendSz, certificate_status); - if (ret == 0 && ssl->options.dtls) - DtlsSEQIncrement(ssl, CUR_ORDER); - #endif - ret = HashOutput(ssl, output, sendSz, 0); - } + if (type == WOLFSSL_CSR2_OCSP_MULTI) { + c32to24(length - (ENUM_LEN + OPAQUE24_LEN), output + idx); + idx += OPAQUE24_LEN; + } - #if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA) - if (ret == 0 && ssl->hsInfoOn) - AddPacketName(ssl, "CertificateStatus"); - if (ret == 0 && ssl->toInfoOn) { - ret = AddPacketInfo(ssl, "CertificateStatus", handshake, output, - sendSz, WRITE_PROTO, 0, ssl->heap); - if (ret != 0) - return ret; - } - #endif + for (i = 0; i < count; i++) { + c32to24(status[i].length, output + idx); + idx += OPAQUE24_LEN; - if (ret == 0) { - ssl->options.buildingMsg = 0; - ssl->buffers.outputBuffer.length += sendSz; - if (!ssl->options.groupMessages) - ret = SendBuffered(ssl); - } + XMEMCPY(output + idx, status[i].buffer, status[i].length); + idx += status[i].length; } + /* Send Message. Handled message fragmentation in the function if needed */ + ret = SendHandshakeMsg(ssl, output, (sendSz - headerSz), certificate_status, + "Certificate Status"); + XFREE(output, ssl->heap, DYNAMIC_TYPE_OCSP); WOLFSSL_LEAVE("BuildCertificateStatus", ret); return ret; @@ -22166,7 +24066,14 @@ if (ret == 0 && response.buffer) { ret = BuildCertificateStatus(ssl, status_type, &response, 1); + } + /* Let's not error out the connection if we can't verify our cert */ + if (ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E) || + ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E)) + ret = 0; + + if (response.buffer) { XFREE(response.buffer, ssl->heap, DYNAMIC_TYPE_OCSP_REQUEST); response.buffer = NULL; } @@ -22243,12 +24150,12 @@ if (ret == 0) { request->ssl = ssl; ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, - request, &responses[i + 1]); + request, &responses[i + 1], ssl->heap); /* Suppressing, not critical */ - if (ret == OCSP_CERT_REVOKED || - ret == OCSP_CERT_UNKNOWN || - ret == OCSP_LOOKUP_FAIL) { + if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) || + ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) || + ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) { ret = 0; } @@ -22269,12 +24176,12 @@ NULL != (request = ssl->ctx->chainOcspRequest[i])) { request->ssl = ssl; ret = CheckOcspRequest(SSL_CM(ssl)->ocsp_stapling, - request, &responses[++i]); + request, &responses[++i], ssl->heap); /* Suppressing, not critical */ - if (ret == OCSP_CERT_REVOKED || - ret == OCSP_CERT_UNKNOWN || - ret == OCSP_LOOKUP_FAIL) { + if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED) || + ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN) || + ret == WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL)) { ret = 0; } } @@ -22294,6 +24201,11 @@ } } + /* Let's not error out the connection if we can't verify our cert */ + if (ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E) || + ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E)) + ret = 0; + break; } #endif /* HAVE_CERTIFICATE_STATUS_REQUEST_V2 */ @@ -22440,6 +24352,18 @@ limit = AEAD_AES_LIMIT; /* Limit is 2^24.5 */ break; #endif +#ifdef WOLFSSL_SM4_GCM + case wolfssl_sm4_gcm: + /* Limit is 2^22 - 1 */ + limit = AEAD_SM4_GCM_LIMIT; + break; +#endif +#ifdef WOLFSSL_SM4_CCM + case wolfssl_sm4_ccm: + /* Limit is 2^10 - 1 */ + limit = AEAD_SM4_CCM_LIMIT; + break; +#endif case wolfssl_cipher_null: /* No encryption being done */ return 0; @@ -22459,13 +24383,62 @@ ssl->keys.sequence_number_lo); } - if (w64GTE(seq, limit)) + if (w64GTE(seq, limit)) { /* cppcheck-suppress uninitvar + * (false positive from cppcheck-2.13.0) + */ return Tls13UpdateKeys(ssl); /* Need to generate new keys */ + } return 0; } #endif /* WOLFSSL_TLS13 && !WOLFSSL_TLS13_IGNORE_AEAD_LIMITS */ +/** + * ssl_in_handshake(): + * Invoked in wolfSSL_read/wolfSSL_write to check if wolfSSL_negotiate() is + * needed in the handshake. + * + * In TLSv1.2 negotiate until the end of the handshake, unless: + * 1 in SCR and sending data or + * 2 in SCR and we have plain data ready + * Early data logic may bypass this logic in TLSv1.3 when appropriate. + */ +static int ssl_in_handshake(WOLFSSL *ssl, int send) +{ + if (IsSCR(ssl)) { + if (send) { + /* allow sending data in SCR */ + return 0; + } else { + /* allow reading buffered data in SCR */ + if (ssl->buffers.clearOutputBuffer.length != 0) + return 0; + } + return 1; + } + + if (ssl->options.handShakeState != HANDSHAKE_DONE) + return 1; + + if (ssl->options.side == WOLFSSL_SERVER_END) { + if (IsAtLeastTLSv1_3(ssl->version)) + return ssl->options.acceptState < TLS13_TICKET_SENT; + if (IsAtLeastTLSv1_2(ssl)) + return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE; + return 0; + } + + if (ssl->options.side == WOLFSSL_CLIENT_END) { + if (IsAtLeastTLSv1_3(ssl->version)) + return ssl->options.connectState < FINISHED_DONE; + if (IsAtLeastTLSv1_2(ssl)) + return ssl->options.connectState < SECOND_REPLY_DONE; + return 0; + } + + return 0; +} + int SendData(WOLFSSL* ssl, const void* data, int sz) { int sent = 0, /* plainText size */ @@ -22484,7 +24457,8 @@ } /* don't allow write after decrypt or mac error */ - if (ssl->error == VERIFY_MAC_ERROR || ssl->error == DECRYPT_ERROR) { + if (ssl->error == WC_NO_ERR_TRACE(VERIFY_MAC_ERROR) || + ssl->error == WC_NO_ERR_TRACE(DECRYPT_ERROR)) { /* For DTLS allow these possible errors and allow the session to continue despite them */ if (ssl->options.dtls) { @@ -22497,7 +24471,9 @@ } #ifdef WOLFSSL_EARLY_DATA - if (ssl->earlyData != no_early_data) { + if (ssl->options.side == WOLFSSL_CLIENT_END && + ssl->earlyData != no_early_data && + ssl->earlyData != done_early_data) { if (ssl->options.handShakeState == HANDSHAKE_DONE) { WOLFSSL_MSG("handshake complete, trying to send early data"); ssl->error = BUILD_MSG_ERROR; @@ -22507,15 +24483,21 @@ groupMsgs = 1; #endif } + else if (IsAtLeastTLSv1_3(ssl->version) && + ssl->options.side == WOLFSSL_SERVER_END && + ssl->options.acceptState >= TLS13_ACCEPT_FINISHED_SENT) { + /* We can send data without waiting on peer finished msg */ + WOLFSSL_MSG("server sending data before receiving client finished"); + } else #endif - if (ssl->options.handShakeState != HANDSHAKE_DONE && !IsSCR(ssl)) { + if (ssl_in_handshake(ssl, 1)) { int err; WOLFSSL_MSG("handshake not complete, trying to finish"); if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) { #ifdef WOLFSSL_ASYNC_CRYPT /* if async would block return WANT_WRITE */ - if (ssl->error == WC_PENDING_E) { + if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) { return WOLFSSL_CBIO_ERR_WANT_WRITE; } #endif @@ -22532,8 +24514,8 @@ WOLFSSL_MSG("output buffer was full, trying to send again"); if ( (ssl->error = SendBuffered(ssl)) < 0) { WOLFSSL_ERROR(ssl->error); - if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset || - ssl->options.isClosed)) { + if (ssl->error == WC_NO_ERR_TRACE(SOCKET_ERROR_E) && + (ssl->options.connReset || ssl->options.isClosed)) { ssl->error = SOCKET_PEER_CLOSED_E; WOLFSSL_ERROR(ssl->error); return 0; /* peer reset or closed */ @@ -22585,7 +24567,9 @@ return ssl->error = BAD_STATE_E; #ifdef WOLFSSL_EARLY_DATA - isEarlyData = ssl->earlyData != no_early_data; + isEarlyData = ssl->options.side == WOLFSSL_CLIENT_END && + ssl->earlyData != no_early_data && + ssl->earlyData != done_early_data; #endif if (isEarlyData) { @@ -22677,7 +24661,7 @@ } if (sendSz < 0) { #ifdef WOLFSSL_ASYNC_CRYPT - if (sendSz == WC_PENDING_E) + if (sendSz == WC_NO_ERR_TRACE(WC_PENDING_E)) ssl->error = sendSz; #endif return BUILD_MSG_ERROR; @@ -22694,8 +24678,8 @@ doesn't present like WANT_WRITE */ ssl->buffers.plainSz = buffSz; ssl->buffers.prevSent = sent; - if (ssl->error == SOCKET_ERROR_E && (ssl->options.connReset || - ssl->options.isClosed)) { + if (ssl->error == WC_NO_ERR_TRACE(SOCKET_ERROR_E) && + (ssl->options.connReset || ssl->options.isClosed)) { ssl->error = SOCKET_PEER_CLOSED_E; WOLFSSL_ERROR(ssl->error); return 0; /* peer reset or closed */ @@ -22731,9 +24715,9 @@ if (ssl->options.dtls) { /* In DTLS mode, we forgive some errors and allow the session * to continue despite them. */ - if (ssl->error == VERIFY_MAC_ERROR || - ssl->error == DECRYPT_ERROR || - ssl->error == DTLS_SIZE_ERROR) { + if (ssl->error == WC_NO_ERR_TRACE(VERIFY_MAC_ERROR) || + ssl->error == WC_NO_ERR_TRACE(DECRYPT_ERROR) || + ssl->error == WC_NO_ERR_TRACE(DTLS_SIZE_ERROR)) { ssl->error = 0; } @@ -22744,7 +24728,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT && ssl->error != WC_PENDING_E #endif -#ifdef HAVE_SECURE_RENEGOTIATION +#if defined(HAVE_SECURE_RENEGOTIATION) || defined(WOLFSSL_DTLS13) && ssl->error != APP_DATA_READY #endif ) { @@ -22753,30 +24737,19 @@ } #ifdef WOLFSSL_EARLY_DATA - if (ssl->earlyData != no_early_data) { + if (ssl->options.side == WOLFSSL_SERVER_END && + ssl->earlyData > early_data_ext && ssl->earlyData < done_early_data) { } else #endif { - int negotiate = 0; -#ifdef HAVE_SECURE_RENEGOTIATION - if (ssl->secure_renegotiation && ssl->secure_renegotiation->enabled) { - if (ssl->options.handShakeState != HANDSHAKE_DONE - && ssl->buffers.clearOutputBuffer.length == 0) - negotiate = 1; - } - else -#endif - if (ssl->options.handShakeState != HANDSHAKE_DONE) - negotiate = 1; - - if (negotiate) { + if (ssl_in_handshake(ssl, 0)) { int err; WOLFSSL_MSG("Handshake not complete, trying to finish"); if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) { #ifdef WOLFSSL_ASYNC_CRYPT /* if async would block return WANT_WRITE */ - if (ssl->error == WC_PENDING_E) { + if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) { return WOLFSSL_CBIO_ERR_WANT_READ; } #endif @@ -22803,7 +24776,7 @@ WOLFSSL_MSG("Zero return, no more data coming"); return 0; /* no more data coming */ } - if (ssl->error == SOCKET_ERROR_E) { + if (ssl->error == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) { if (ssl->options.connReset || ssl->options.isClosed) { WOLFSSL_MSG("Peer reset or closed, connection done"); ssl->error = SOCKET_PEER_CLOSED_E; @@ -22839,7 +24812,7 @@ if ( (err = wolfSSL_negotiate(ssl)) != WOLFSSL_SUCCESS) { #ifdef WOLFSSL_ASYNC_CRYPT /* if async would block return WANT_WRITE */ - if (ssl->error == WC_PENDING_E) { + if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) { return WOLFSSL_CBIO_ERR_WANT_READ; } #endif @@ -23014,6 +24987,11 @@ #endif /* WOLFSSL_DTLS13 */ { AddRecordHeader(output, ALERT_SIZE, alert, ssl, CUR_ORDER); +#ifdef WOLFSSL_DTLS + /* AddRecordHeader doesn't increment the seq number */ + if (ssl->options.dtls) + DtlsSEQIncrement(ssl, CUR_ORDER); +#endif } output += RECORD_HEADER_SZ; @@ -23057,8 +25035,16 @@ int RetrySendAlert(WOLFSSL* ssl) { - int type = ssl->pendingAlert.code; - int severity = ssl->pendingAlert.level; + int type; + int severity; + WOLFSSL_ENTER("RetrySendAlert"); + + if (ssl == NULL) { + return BAD_FUNC_ARG; + } + + type = ssl->pendingAlert.code; + severity = ssl->pendingAlert.level; if (severity == alert_none) return 0; @@ -23072,6 +25058,12 @@ /* send alert message */ int SendAlert(WOLFSSL* ssl, int severity, int type) { + WOLFSSL_ENTER("SendAlert"); + + if (ssl == NULL) { + return BAD_FUNC_ARG; + } + if (ssl->pendingAlert.level != alert_none) { int ret = RetrySendAlert(ssl); if (ret != 0) { @@ -23090,6 +25082,10 @@ return SendAlert_ex(ssl, severity, type); } +#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES_H +#include +#endif + const char* wolfSSL_ERR_reason_error_string(unsigned long e) { #ifdef NO_ERROR_STRINGS @@ -23100,12 +25096,11 @@ #else int error = (int)e; -#ifdef OPENSSL_EXTRA + /* OpenSSL uses positive error codes */ if (error > 0) { error = -error; } -#endif /* pass to wolfCrypt */ if (error < MAX_CODE_E && error > MIN_CODE_E) { @@ -23204,7 +25199,7 @@ return "peer ip address mismatch"; case WANT_READ : - case WOLFSSL_ERROR_WANT_READ : + case -WOLFSSL_ERROR_WANT_READ : return "non-blocking socket wants data to be read"; case NOT_READY_ERROR : @@ -23214,9 +25209,22 @@ return "record layer version error"; case WANT_WRITE : - case WOLFSSL_ERROR_WANT_WRITE : + case -WOLFSSL_ERROR_WANT_WRITE : return "non-blocking socket write buffer full"; + case -WOLFSSL_ERROR_WANT_CONNECT: + case -WOLFSSL_ERROR_WANT_ACCEPT: + return "The underlying BIO was not yet connected"; + + case -WOLFSSL_ERROR_SYSCALL: + return "fatal I/O error in TLS layer"; + + case -WOLFSSL_ERROR_WANT_X509_LOOKUP: + return "application client cert callback asked to be called again"; + + case -WOLFSSL_ERROR_SSL: + return "fatal TLS protocol error"; + case BUFFER_ERROR : return "malformed buffer input error"; @@ -23254,7 +25262,7 @@ return "can't decode peer key"; case ZERO_RETURN: - case WOLFSSL_ERROR_ZERO_RETURN: + case -WOLFSSL_ERROR_ZERO_RETURN: return "peer sent close notify alert"; case ECC_CURVETYPE_ERROR: @@ -23534,6 +25542,9 @@ case SOCKET_FILTERED_E: return "Session stopped by network filter"; + case UNSUPPORTED_CERTIFICATE: + return "Unsupported certificate type"; + #ifdef HAVE_HTTP_CLIENT case HTTP_TIMEOUT: return "HTTP timeout for OCSP or CRL req"; @@ -23550,10 +25561,36 @@ case HTTP_APPSTR_ERR: return "HTTP Application string error"; #endif -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) + /* TODO: -WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE. Conflicts with + * -WOLFSSL_ERROR_WANT_CONNECT. */ + case -WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID: + return "certificate not yet valid"; + case -WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED: + return "certificate has expired"; + case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: + return "certificate signature failure"; + case -WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: + return "format error in certificate's notAfter field"; + case -WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: + return "self-signed certificate in certificate chain"; case -WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: return "unable to get local issuer certificate"; -#endif + case -WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: + return "unable to verify the first certificate"; + case -WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG: + return "certificate chain too long"; + case -WOLFSSL_X509_V_ERR_CERT_REVOKED: + return "certificate revoked"; + case -WOLFSSL_X509_V_ERR_INVALID_CA: + return "invalid CA certificate"; + case -WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED: + return "path length constraint exceeded"; + case -WOLFSSL_X509_V_ERR_CERT_REJECTED: + return "certificate rejected"; + case -WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH: + return "subject issuer mismatch"; +#endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL || HAVE_WEBSERVER */ case UNSUPPORTED_PROTO_VERSION: #ifdef OPENSSL_EXTRA return "WRONG_SSL_VERSION"; @@ -23587,6 +25624,10 @@ #endif /* NO_ERROR_STRINGS */ } +#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES +#include +#endif + const char* wolfSSL_ERR_func_error_string(unsigned long e) { (void)e; @@ -23625,7 +25666,7 @@ void SetErrorString(int error, char* str) { - XSTRNCPY(str, wolfSSL_ERR_reason_error_string(error), WOLFSSL_MAX_ERROR_SZ); + XSTRNCPY(str, wolfSSL_ERR_reason_error_string((unsigned long)error), WOLFSSL_MAX_ERROR_SZ); str[WOLFSSL_MAX_ERROR_SZ-1] = 0; } @@ -23633,18 +25674,18 @@ #ifndef NO_ERROR_STRINGS #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE} - #define SUITE_ALIAS(x,z,w,v,u) + #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */ #else #define SUITE_INFO(x,y,z,w,v,u) {(x),(y),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE} - #define SUITE_ALIAS(x,z,w,v,u) + #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */ #endif #else #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),(v),(u),WOLFSSL_CIPHER_SUITE_FLAG_NONE} - #define SUITE_ALIAS(x,z,w,v,u) + #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */ #else #define SUITE_INFO(x,y,z,w,v,u) {(x),(z),(w),WOLFSSL_CIPHER_SUITE_FLAG_NONE} - #define SUITE_ALIAS(x,z,w,v,u) + #define SUITE_ALIAS(x,z,w,v,u) /* null expansion */ #endif #endif #else /* !NO_CIPHER_SUITE_ALIASES */ @@ -23699,6 +25740,14 @@ SUITE_ALIAS("TLS13-AES128-CCM8-SHA256",TLS13_BYTE,TLS_AES_128_CCM_8_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR) #endif +#ifdef BUILD_TLS_SM4_GCM_SM3 + SUITE_INFO("TLS13-SM4-GCM-SM3","TLS_SM4_GCM_SM3",CIPHER_BYTE,TLS_SM4_GCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR), +#endif + +#ifdef BUILD_TLS_SM4_CCM_SM3 + SUITE_INFO("TLS13-SM4-CCM-SM3","TLS_SM4_CCM_SM3",CIPHER_BYTE,TLS_SM4_CCM_SM3, TLSv1_3_MINOR, SSLv3_MAJOR), +#endif + #ifdef BUILD_TLS_SHA256_SHA256 SUITE_INFO("TLS13-SHA256-SHA256","TLS_SHA256_SHA256",ECC_BYTE,TLS_SHA256_SHA256,TLSv1_3_MINOR, SSLv3_MAJOR), #endif @@ -24075,6 +26124,18 @@ SUITE_INFO("DHE-RSA-CHACHA20-POLY1305-OLD","TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256",CHACHA_BYTE,TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR), #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + SUITE_INFO("ECDHE-ECDSA-SM4-CBC-SM3","TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3, TLSv1_2_MINOR, SSLv3_MAJOR), +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + SUITE_INFO("ECDHE-ECDSA-SM4-GCM-SM3","TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3, TLSv1_2_MINOR, SSLv3_MAJOR), +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + SUITE_INFO("ECDHE-ECDSA-SM4-CCM-SM3","TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3",SM_BYTE,TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3, TLSv1_2_MINOR, SSLv3_MAJOR), +#endif + #ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA SUITE_INFO("ADH-AES128-SHA","TLS_DH_anon_WITH_AES_128_CBC_SHA",CIPHER_BYTE,TLS_DH_anon_WITH_AES_128_CBC_SHA, TLSv1_2_MINOR, SSLv3_MAJOR), #endif @@ -24119,6 +26180,14 @@ SUITE_INFO("EDH-RSA-DES-CBC3-SHA","TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",CIPHER_BYTE,TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLSv1_MINOR, SSLv3_MAJOR), #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 + SUITE_INFO("ECDHE-ECDSA-ARIA128-GCM-SHA256","TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, TLSv1_2_MINOR, SSLv3_MAJOR), +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 + SUITE_INFO("ECDHE-ECDSA-ARIA256-GCM-SHA384","TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384",ECC_BYTE,TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, TLSv1_2_MINOR, SSLv3_MAJOR), +#endif + #ifdef BUILD_WDM_WITH_NULL_SHA256 SUITE_INFO("WDM-NULL-SHA256","WDM_WITH_NULL_SHA256",CIPHER_BYTE,WDM_WITH_NULL_SHA256, TLSv1_3_MINOR, SSLv3_MAJOR) #endif @@ -24318,12 +26387,37 @@ (XSTRCMP(n[2],"AES") == 0 && XSTRCMP(n[3],"256") == 0)) encStr = "AES(256)"; +#ifdef HAVE_ARIA + else if ((XSTRCMP(n[0],"ARIA256") == 0) || + (XSTRCMP(n[2],"ARIA256") == 0)) + encStr = "ARIA(256)"; + else if ((XSTRCMP(n[0],"ARIA128") == 0) || + (XSTRCMP(n[2],"ARIA128") == 0)) + encStr = "ARIA(128)"; +#endif else if ((XSTRCMP(n[0],"CAMELLIA256") == 0) || (XSTRCMP(n[2],"CAMELLIA256") == 0)) encStr = "CAMELLIA(256)"; else if ((XSTRCMP(n[0],"CAMELLIA128") == 0) || (XSTRCMP(n[2],"CAMELLIA128") == 0)) encStr = "CAMELLIA(128)"; +#ifdef WOLFSSL_SM4_GCM + else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"GCM") == 0) || + (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"GCM") == 0) || + (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"GCM") == 0)) + encStr = "SM4-GCM"; +#endif +#ifdef WOLFSSL_SM4_CCM + else if ((XSTRCMP(n[0],"SM4") == 0 && XSTRCMP(n[1],"CCM") == 0) || + (XSTRCMP(n[1],"SM4") == 0 && XSTRCMP(n[2],"CCM") == 0) || + (XSTRCMP(n[2],"SM4") == 0 && XSTRCMP(n[3],"CCM") == 0)) + encStr = "SM4-CCM"; +#endif +#ifdef WOLFSSL_SM4_CBC + else if ((XSTRCMP(n[0],"SM4") == 0) || + (XSTRCMP(n[2],"SM4") == 0)) + encStr = "SM4"; +#endif else if ((XSTRCMP(n[0],"RC4") == 0) || (XSTRCMP(n[1],"RC4") == 0) || (XSTRCMP(n[2],"RC4") == 0)) encStr = "RC4"; @@ -24380,6 +26474,13 @@ (XSTRCMP(n[2],"SHA384") == 0) || (XSTRCMP(n[1],"SHA384") == 0)) macStr = "SHA384"; +#ifdef WOLFSSL_SM3 + else if ((XSTRCMP(n[4],"SM3") == 0) || + (XSTRCMP(n[3],"SM3") == 0) || + (XSTRCMP(n[2],"SM3") == 0) || + (XSTRCMP(n[1],"SM3") == 0)) + macStr = "SM3"; +#endif else if ((XSTRCMP(n[4],"SHA") == 0) || (XSTRCMP(n[3],"SHA") == 0) || (XSTRCMP(n[2],"SHA") == 0) || (XSTRCMP(n[1],"SHA") == 0) || (XSTRCMP(n[1],"MD5") == 0)) @@ -24468,7 +26569,7 @@ int GetCipherSuiteFromName(const char* name, byte* cipherSuite0, byte* cipherSuite, int* flags) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); int i; unsigned long len; const char* nameDelim; @@ -24515,15 +26616,12 @@ @return true on success, else false. */ -int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, const char* list) +static int ParseCipherList(Suites* suites, + const char* list, ProtocolVersion version, int privateKeySz, byte side) { int ret = 0; int idx = 0; - word16 haveRSAsig = 0; - word16 haveECDSAsig = 0; - word16 haveFalconSig = 0; - word16 haveDilithiumSig = 0; - word16 haveAnon = 0; + int haveSig = 0; word16 haveRSA = 0; #ifdef OPENSSL_EXTRA word16 haveDH = 0; @@ -24537,27 +26635,29 @@ const int suiteSz = GetCipherNamesSize(); const char* next = list; - (void)haveRSA; - if (suites == NULL || list == NULL) { WOLFSSL_MSG("SetCipherList parameter error"); return 0; } - if (next[0] == 0 || XSTRCMP(next, "ALL") == 0 || - XSTRCMP(next, "DEFAULT") == 0 || XSTRCMP(next, "HIGH") == 0) { + if (next[0] == '\0' || + XSTRCMP(next, "ALL") == 0 || + XSTRCMP(next, "DEFAULT") == 0 || + XSTRCMP(next, "HIGH") == 0) + { /* Add all ciphersuites except anonymous and null ciphers. Prefer RSA */ #ifndef NO_RSA haveRSA = 1; #endif - InitSuites(suites, ctx->method->version, + InitSuites(suites, version, #ifndef NO_CERTS - ctx->privateKeySz, + privateKeySz, #else 0, #endif haveRSA, 1, 1, !haveRSA, 1, haveRSA, !haveRSA, 1, 1, 0, 0, - ctx->method->side); + side + ); return 1; /* wolfSSL default */ } @@ -24577,6 +26677,8 @@ if (length > currLen) { length = currLen; } + if (currLen == 0) + break; } #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) @@ -24607,7 +26709,7 @@ substrCurrent[length] = '\0'; } else { - length = (int)XSTRLEN(substrCurrent); + length = (word32)XSTRLEN(substrCurrent); } /* check if is a public key type */ @@ -24631,12 +26733,9 @@ if (XSTRCMP(name, "DEFAULT") == 0 || XSTRCMP(name, "ALL") == 0) { if (XSTRCMP(name, "ALL") == 0) - haveAnon = 1; + haveSig |= SIG_ANON; else - haveAnon = 0; - #ifdef HAVE_ANON - ctx->haveAnon = haveAnon; - #endif + haveSig &= ~SIG_ANON; haveRSA = 1; haveDH = 1; haveECC = 1; @@ -24645,7 +26744,7 @@ * static ECC suites here * haveStaticECC = 1; */ haveStaticRSA = 1; - haveRSAsig = 1; + haveSig |= SIG_RSA; havePSK = 1; haveNull = 0; @@ -24658,16 +26757,13 @@ * ciphersuites. */ if (XSTRCMP(name, "HIGH") == 0 && allowing) { /* Disable static, anonymous, and null ciphers */ - haveAnon = 0; - #ifdef HAVE_ANON - ctx->haveAnon = 0; - #endif + haveSig &= ~SIG_ANON; haveRSA = 1; haveDH = 1; haveECC = 1; haveStaticECC = 0; haveStaticRSA = 0; - haveRSAsig = 1; + haveSig |= SIG_RSA; havePSK = 1; haveNull = 0; @@ -24677,16 +26773,16 @@ } if (XSTRCMP(name, "aNULL") == 0) { - haveAnon = allowing; - #ifdef HAVE_ANON - ctx->haveAnon = allowing; - #endif + if (allowing) + haveSig |= SIG_ANON; + else + haveSig &= ~SIG_ANON; if (allowing) { /* Allow RSA by default. */ if (!haveECC) haveRSA = 1; - if (!haveECDSAsig) - haveRSAsig = 1; + if ((haveSig & SIG_ECDSA) == 0) + haveSig |= SIG_RSA; callInitSuites = 1; ret = 1; } @@ -24699,8 +26795,8 @@ /* Allow RSA by default. */ if (!haveECC) haveRSA = 1; - if (!haveECDSAsig) - haveRSAsig = 1; + if ((haveSig & SIG_ECDSA) == 0) + haveSig |= SIG_RSA; callInitSuites = 1; ret = 1; } @@ -24708,20 +26804,27 @@ } if (XSTRCMP(name, "kDH") == 0) { - haveStaticECC = allowing; if (allowing) { - haveECC = 1; - haveECDSAsig = 1; + haveDH = 1; + callInitSuites = 1; + ret = 1; + } + continue; + } + + if (XSTRCMP(name, "DHE") == 0 || XSTRCMP(name, "EDH") == 0) { + if (allowing) { + haveDH = 1; callInitSuites = 1; ret = 1; } continue; } - if (XSTRCMP(name, "ECDHE") == 0) { + if (XSTRCMP(name, "ECDHE") == 0 || XSTRCMP(name, "EECDH") == 0) { if (allowing) { haveECC = 1; - haveECDSAsig = 1; + haveSig |= SIG_ECDSA; callInitSuites = 1; ret = 1; } @@ -24732,7 +26835,7 @@ haveStaticRSA = allowing; if (allowing) { haveRSA = 1; - haveRSAsig = 1; + haveSig |= SIG_RSA; callInitSuites = 1; ret = 1; } @@ -24741,13 +26844,13 @@ if (XSTRCMP(name, "PSK") == 0) { havePSK = allowing; - haveRSAsig = 1; + haveSig |= SIG_RSA; if (allowing) { /* Allow RSA by default. */ if (!haveECC) haveRSA = 1; - if (!haveECDSAsig) - haveRSAsig = 1; + if ((haveSig & SIG_ECDSA) == 0) + haveSig |= SIG_RSA; callInitSuites = 1; ret = 1; } @@ -24759,7 +26862,7 @@ if (allowing) { /* Allow RSA by default */ haveRSA = 1; - haveRSAsig = 1; + haveSig |= SIG_RSA; callInitSuites = 1; ret = 1; } @@ -24787,7 +26890,7 @@ #ifdef WOLFSSL_DTLS /* don't allow stream ciphers with DTLS */ - if (ctx->method->version.major == DTLS_MAJOR) { + if (version.major == DTLS_MAJOR) { if (XSTRSTR(name, "RC4")) { WOLFSSL_MSG("Stream ciphers not supported with DTLS"); @@ -24817,46 +26920,79 @@ suites->suites[idx++] = cipher_names[i].cipherSuite; /* The suites are either ECDSA, RSA, PSK, or Anon. The RSA * suites don't necessarily have RSA in the name. */ - #ifdef WOLFSSL_TLS13 + #ifdef WOLFSSL_TLS13 if (cipher_names[i].cipherSuite0 == TLS13_BYTE || (cipher_names[i].cipherSuite0 == ECC_BYTE && (cipher_names[i].cipherSuite == TLS_SHA256_SHA256 || cipher_names[i].cipherSuite == TLS_SHA384_SHA384))) { #ifndef NO_RSA - haveRSAsig = 1; + haveSig |= SIG_RSA; #endif #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \ defined(HAVE_ED448) - haveECDSAsig = 1; + haveSig |= SIG_ECDSA; #endif - #if defined(HAVE_PQC) #ifdef HAVE_FALCON - haveFalconSig = 1; + haveSig |= SIG_FALCON; #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM - haveDilithiumSig = 1; + haveSig |= SIG_DILITHIUM; #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ + } + else + #ifdef BUILD_TLS_SM4_GCM_SM3 + if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) && + (cipher_names[i].cipherSuite == TLS_SM4_GCM_SM3)) { + haveSig |= SIG_SM2; + } + else + #endif + #ifdef BUILD_TLS_SM4_CCM_SM3 + if ((cipher_names[i].cipherSuite0 == CIPHER_BYTE) && + (cipher_names[i].cipherSuite == TLS_SM4_CCM_SM3)) { + haveSig |= SIG_SM2; + } + else + #endif + #endif /* WOLFSSL_TLS13 */ + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \ + (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \ + defined(WOLFSSL_SM4_CCM)) + if ((cipher_names[i].cipherSuite0 == SM_BYTE) && (0 + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + || (cipher_names[i].cipherSuite == + TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3) + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + || (cipher_names[i].cipherSuite == + TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3) + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + || (cipher_names[i].cipherSuite == + TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3) + #endif + )) { + haveSig |= SIG_SM2; } else #endif #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \ defined(HAVE_ED448) - if ((haveECDSAsig == 0) && XSTRSTR(name, "ECDSA")) - haveECDSAsig = 1; + if (XSTRSTR(name, "ECDSA")) + haveSig |= SIG_ECDSA; else #endif #ifdef HAVE_ANON if (XSTRSTR(name, "ADH")) - haveAnon = 1; + haveSig |= SIG_ANON; else #endif - if (haveRSAsig == 0 - #ifndef NO_PSK - && (XSTRSTR(name, "PSK") == NULL) - #endif - ) { - haveRSAsig = 1; + #ifndef NO_PSK + if (XSTRSTR(name, "PSK") == NULL) + #endif + { + /* Fall back to RSA */ + haveSig |= SIG_RSA; } ret = 1; /* found at least one */ @@ -24864,26 +27000,27 @@ } } } - while (next++); /* ++ needed to skip ':' */ + while (next++); /* increment to skip ':' */ if (ret) { int keySz = 0; #ifndef NO_CERTS - keySz = ctx->privateKeySz; + keySz = privateKeySz; #endif #ifdef OPENSSL_EXTRA if (callInitSuites) { - byte tmp[WOLFSSL_MAX_SUITE_SZ]; - XMEMCPY(tmp, suites->suites, idx); /* Store copy */ suites->setSuites = 0; /* Force InitSuites */ suites->hashSigAlgoSz = 0; /* Force InitSuitesHashSigAlgo call * inside InitSuites */ - InitSuites(suites, ctx->method->version, keySz, haveRSA, - havePSK, haveDH, haveECDSAsig, - haveECC, haveStaticRSA, - haveStaticECC, haveFalconSig, - haveDilithiumSig, haveAnon, - haveNull, ctx->method->side); + InitSuites(suites, version, keySz, (word16)haveRSA, + (word16)havePSK, (word16)haveDH, + (word16)((haveSig & SIG_ECDSA) != 0), + (word16)haveECC, (word16)haveStaticRSA, + (word16)haveStaticECC, + (word16)((haveSig & SIG_FALCON) != 0), + (word16)((haveSig & SIG_DILITHIUM) != 0), + (word16)((haveSig & SIG_ANON) != 0), + (word16)haveNull, side); /* Restore user ciphers ahead of defaults */ XMEMMOVE(suites->suites + idx, suites->suites, min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx)); @@ -24893,18 +27030,67 @@ #endif { suites->suiteSz = (word16)idx; - InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, - haveFalconSig, haveDilithiumSig, haveAnon, - 1, keySz); + InitSuitesHashSigAlgo(suites->hashSigAlgo, haveSig, 1, keySz, + &suites->hashSigAlgoSz); + } + +#ifdef HAVE_RENEGOTIATION_INDICATION + if (side == WOLFSSL_CLIENT_END) { + if (suites->suiteSz > WOLFSSL_MAX_SUITE_SZ - 2) { + WOLFSSL_MSG("Too many ciphersuites"); + return 0; + } + suites->suites[suites->suiteSz] = CIPHER_BYTE; + suites->suites[suites->suiteSz+1] = + TLS_EMPTY_RENEGOTIATION_INFO_SCSV; + suites->suiteSz += 2; } +#endif suites->setSuites = 1; } - (void)ctx; +#ifdef NO_CERTS + (void)privateKeySz; +#endif return ret; } +int SetCipherList_ex(const WOLFSSL_CTX* ctx, const WOLFSSL* ssl, + Suites* suites, const char* list) +{ + ProtocolVersion version; + int privateKeySz = 0; + byte side; + + if (ctx != NULL) { + version = ctx->method->version; +#ifndef NO_CERTS + privateKeySz = ctx->privateKeySz; +#endif + side = ctx->method->side; + } + else if (ssl != NULL) { + version = ssl->version; +#ifndef NO_CERTS + privateKeySz = ssl->buffers.keySz; +#endif + side = (byte)ssl->options.side; + } + else { + WOLFSSL_MSG("SetCipherList_ex parameter error"); + return 0; + } + + return ParseCipherList(suites, list, version, privateKeySz, side); +} + +int SetCipherList(const WOLFSSL_CTX* ctx, Suites* suites, + const char* list) +{ + return SetCipherList_ex(ctx, NULL, suites, list); +} + #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES) int SetCipherListFromBytes(WOLFSSL_CTX* ctx, Suites* suites, const byte* list, const int listSz) @@ -24973,22 +27159,22 @@ * suites don't necessarily have RSA in the name. */ #ifdef WOLFSSL_TLS13 if (firstByte == TLS13_BYTE || (firstByte == ECC_BYTE && - (secondByte == TLS_SHA256_SHA256 || - secondByte == TLS_SHA384_SHA384))) { + (secondByte == TLS_SHA256_SHA256 || + secondByte == TLS_SHA384_SHA384)) || + (firstByte == CIPHER_BYTE && (secondByte == TLS_SM4_GCM_SM3 || + secondByte == TLS_SM4_CCM_SM3))) { #ifndef NO_RSA haveRSAsig = 1; #endif #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) haveECDSAsig = 1; #endif - #if defined(HAVE_PQC) #ifdef HAVE_FALCON haveFalconSig = 1; #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM haveDilithiumSig = 1; #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ } else #endif /* WOLFSSL_TLS13 */ @@ -25015,13 +27201,33 @@ if (ret) { int keySz = 0; + int haveSig = 0; #ifndef NO_CERTS keySz = ctx->privateKeySz; #endif suites->suiteSz = (word16)idx; - InitSuitesHashSigAlgo(suites, haveECDSAsig, haveRSAsig, - haveFalconSig, haveDilithiumSig, haveAnon, 1, - keySz); + haveSig |= haveECDSAsig ? SIG_ECDSA : 0; + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + haveSig |= haveECDSAsig ? SIG_SM2 : 0; + #endif + haveSig |= haveRSAsig ? SIG_RSA : 0; + haveSig |= haveFalconSig ? SIG_FALCON : 0; + haveSig |= haveDilithiumSig ? SIG_DILITHIUM : 0; + haveSig |= haveAnon ? SIG_ANON : 0; + InitSuitesHashSigAlgo(suites->hashSigAlgo, haveSig, 1, keySz, + &suites->hashSigAlgoSz); +#ifdef HAVE_RENEGOTIATION_INDICATION + if (ctx->method->side == WOLFSSL_CLIENT_END) { + if (suites->suiteSz > WOLFSSL_MAX_SUITE_SZ - 2) { + WOLFSSL_MSG("Too many ciphersuites"); + return 0; + } + suites->suites[suites->suiteSz] = CIPHER_BYTE; + suites->suites[suites->suiteSz+1] = + TLS_EMPTY_RENEGOTIATION_INFO_SCSV; + suites->suiteSz += 2; + } +#endif suites->setSuites = 1; } @@ -25050,6 +27256,9 @@ #ifdef WOLFSSL_SHA224 { sha224_mac, "SHA224" }, #endif +#ifdef WOLFSSL_SM3 + { sm3_mac, "SM3" }, +#endif #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ defined(WOLFSSL_ALLOW_TLS_SHA1)) { sha_mac, "SHA1" }, @@ -25097,6 +27306,9 @@ #ifndef NO_DSA { dsa_sa_algo, "DSA" }, #endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + { sm2_sa_algo, "SM2" }, +#endif }; #define SIG_NAMES_SZ (int)(sizeof(sig_names)/sizeof(*sig_names)) @@ -25203,7 +27415,6 @@ return sigAlgo == ed448_sa_algo; } #endif -#ifdef HAVE_PQC #ifdef HAVE_FALCON if (ssl->pkCurveOID == CTC_FALCON_LEVEL1) { /* Certificate has Falcon level 1 key, only match with Falcon level 1 @@ -25230,7 +27441,6 @@ return sigAlgo == dilithium_level5_sa_algo; } #endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ #ifdef WC_RSA_PSS /* RSA certificate and PSS sig alg. */ if (ssl->options.sigAlgo == rsa_sa_algo) { @@ -25262,9 +27472,15 @@ static byte MinHashAlgo(WOLFSSL* ssl) { #ifdef WOLFSSL_TLS13 +#ifndef NO_SHA256 if (IsAtLeastTLSv1_3(ssl->version)) { return sha256_mac; } +#elif defined(WOLFSSL_SM3) + if (IsAtLeastTLSv1_3(ssl->version)) { + return sm3_mac; + } +#endif #endif #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_ALLOW_TLS_SHA1) if (IsAtLeastTLSv1_2(ssl)) { @@ -25275,10 +27491,43 @@ return sha_mac; } -int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz) +/* Check if a given peer hashSigAlgo is supported in our ssl->suites or + * ssl->ctx->suites. + * + * Returns 1 on match. + * Returns 0 otherwise. + * */ +static int SupportedHashSigAlgo(WOLFSSL* ssl, const byte * hashSigAlgo) +{ + const Suites * suites = NULL; + word32 i = 0; + + if (ssl == NULL || hashSigAlgo == NULL) { + return 0; + } + + suites = WOLFSSL_SUITES(ssl); + + if (suites == NULL || suites->hashSigAlgoSz == 0) { + return 0; + } + + for (i = 0; (i+1) < suites->hashSigAlgoSz; i += HELLO_EXT_SIGALGO_SZ) { + if (XMEMCMP(&suites->hashSigAlgo[i], hashSigAlgo, + HELLO_EXT_SIGALGO_SZ) == 0) { + /* Match found. */ + return 1; + } + } + + return 0; +} + +int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, word32 hashSigAlgoSz, + int matchSuites) { word32 i; - int ret = MATCH_SUITE_ERROR; + int ret = WC_NO_ERR_TRACE(MATCH_SUITE_ERROR); byte minHash; /* set defaults */ @@ -25316,6 +27565,14 @@ if (!MatchSigAlgo(ssl, sigAlgo)) continue; + if (matchSuites) { + /* Keep looking if peer algorithm isn't supported in our ssl->suites + * or ssl->ctx->suites. */ + if (!SupportedHashSigAlgo(ssl, &hashSigAlgo[i])) { + continue; + } + } + #ifdef HAVE_ED25519 if (ssl->pkCurveOID == ECC_ED25519_OID) { /* Matched Ed25519 - set chosen and finished. */ @@ -25334,7 +27591,6 @@ break; } #endif - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) if (ssl->pkCurveOID == CTC_FALCON_LEVEL1 || ssl->pkCurveOID == CTC_FALCON_LEVEL5 ) { @@ -25356,7 +27612,6 @@ break; } #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ #if defined(WOLFSSL_ECDSA_MATCH_HASH) && defined(USE_ECDSA_KEYSZ_HASH_ALGO) #error "WOLFSSL_ECDSA_MATCH_HASH and USE_ECDSA_KEYSZ_HASH_ALGO cannot " @@ -25365,6 +27620,23 @@ #if defined(HAVE_ECC) && (defined(WOLFSSL_TLS13) || \ defined(WOLFSSL_ECDSA_MATCH_HASH)) + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (sigAlgo == sm2_sa_algo && hashAlgo == sm3_mac + #ifndef WOLFSSL_ECDSA_MATCH_HASH + && IsAtLeastTLSv1_3(ssl->version) + #endif + ) { + /* Must be exact match. */ + if (CmpEccStrength(hashAlgo, ssl->buffers.keySz) != 0) + continue; + /* Matched SM2-SM3 - set chosen and finished. */ + ssl->options.sigAlgo = sigAlgo; + ssl->options.hashAlgo = hashAlgo; + ret = 0; + break; + } + else + #endif if (sigAlgo == ecc_dsa_sa_algo #ifndef WOLFSSL_ECDSA_MATCH_HASH && IsAtLeastTLSv1_3(ssl->version) @@ -25429,12 +27701,15 @@ #ifdef WOLFSSL_SHA512 case sha512_mac: #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + #endif #ifdef WOLFSSL_STRONGEST_HASH_SIG /* Is hash algorithm weaker than chosen/min? */ if (hashAlgo < ssl->options.hashAlgo) break; #else - /* Is hash algorithm stonger than last chosen? */ + /* Is hash algorithm stronger than last chosen? */ if (ret == 0 && hashAlgo > ssl->options.hashAlgo) break; #endif @@ -25456,6 +27731,9 @@ #ifdef WOLFSSL_SHA512 && (hashAlgo != sha512_mac) #endif + #ifdef WOLFSSL_SM3 + && (hashAlgo != sm3_mac) + #endif ) { break; @@ -25620,7 +27898,7 @@ /* add data, put in buffer if bigger than static buffer */ info->packets[info->numberPackets].valueSz = totalSz; if (totalSz < MAX_VALUE_SZ) { - XMEMCPY(info->packets[info->numberPackets].value, data + lateRL, + XMEMCPY(info->packets[info->numberPackets].value + lateRL, data, sz); } else { @@ -25694,7 +27972,7 @@ int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType, int label, int id, void* heap, int devId) { - int ret = NOT_COMPILED_IN; + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); if (hsType == DYNAMIC_TYPE_RSA) { #ifndef NO_RSA @@ -25709,7 +27987,7 @@ ret = wc_InitRsaKey_Label(rsaKey, (char*)data, heap, devId); } else if (id) { - ret = wc_InitRsaKey_Id(rsaKey, data, length, heap, devId); + ret = wc_InitRsaKey_Id(rsaKey, data, (int)length, heap, devId); } if (ret == 0) { *pkey = (void*)rsaKey; @@ -25732,7 +28010,7 @@ ret = wc_ecc_init_label(ecKey, (char*)data, heap, devId); } else if (id) { - ret = wc_ecc_init_id(ecKey, data, length, heap, devId); + ret = wc_ecc_init_id(ecKey, data, (int)length, heap, devId); } if (ret == 0) { *pkey = (void*)ecKey; @@ -25742,6 +28020,55 @@ } #endif } + else if (hsType == DYNAMIC_TYPE_DILITHIUM) { +#if defined(HAVE_DILITHIUM) + dilithium_key* dilithiumKey; + + dilithiumKey = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap, + DYNAMIC_TYPE_DILITHIUM); + if (dilithiumKey == NULL) { + return MEMORY_E; + } + + if (label) { + ret = wc_dilithium_init_label(dilithiumKey, (char*)data, + heap, devId); + } + else if (id) { + ret = wc_dilithium_init_id(dilithiumKey, data, length, heap, devId); + } + if (ret == 0) { + *pkey = (void*)dilithiumKey; + } + else { + XFREE(dilithiumKey, heap, DYNAMIC_TYPE_DILITHIUM); + } +#endif + } + else if (hsType == DYNAMIC_TYPE_FALCON) { +#if defined(HAVE_FALCON) + falcon_key* falconKey; + + falconKey = (falcon_key*)XMALLOC(sizeof(falcon_key), heap, + DYNAMIC_TYPE_FALCON); + if (falconKey == NULL) { + return MEMORY_E; + } + + if (label) { + ret = wc_falcon_init_label(falconKey, (char*)data, heap, devId); + } + else if (id) { + ret = wc_falcon_init_id(falconKey, data, length, heap, devId); + } + if (ret == 0) { + *pkey = (void*)falconKey; + } + else { + XFREE(falconKey, heap, DYNAMIC_TYPE_FALCON); + } +#endif + } return ret; } @@ -25757,9 +28084,9 @@ * length The length of a signature. * returns 0 on success, otherwise failure. */ -int DecodePrivateKey(WOLFSSL *ssl, word16* length) +int DecodePrivateKey(WOLFSSL *ssl, word32* length) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); int keySz; word32 idx; @@ -25772,7 +28099,7 @@ || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx) #endif ) { - *length = GetPrivateKeySigSize(ssl); + *length = (word32)GetPrivateKeySigSize(ssl); return 0; } else @@ -25790,6 +28117,13 @@ ssl->hsType = DYNAMIC_TYPE_RSA; else if (ssl->buffers.keyType == ecc_dsa_sa_algo) ssl->hsType = DYNAMIC_TYPE_ECC; + else if ((ssl->buffers.keyType == falcon_level1_sa_algo) || + (ssl->buffers.keyType == falcon_level5_sa_algo)) + ssl->hsType = DYNAMIC_TYPE_FALCON; + else if ((ssl->buffers.keyType == dilithium_level2_sa_algo) || + (ssl->buffers.keyType == dilithium_level3_sa_algo) || + (ssl->buffers.keyType == dilithium_level5_sa_algo)) + ssl->hsType = DYNAMIC_TYPE_DILITHIUM; ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey); if (ret != 0) { goto exit_dpk; @@ -25815,7 +28149,7 @@ } /* Return the maximum signature length. */ - *length = (word16)ssl->buffers.keySz; + *length = (word32)ssl->buffers.keySz; } #else ret = NOT_COMPILED_IN; @@ -25841,7 +28175,82 @@ } /* Return the maximum signature length. */ - *length = (word16)wc_ecc_sig_size_calc(ssl->buffers.keySz); + *length = (word32)wc_ecc_sig_size_calc(ssl->buffers.keySz); + } + #else + ret = NOT_COMPILED_IN; + #endif + } + else if ((ssl->buffers.keyType == falcon_level1_sa_algo) || + (ssl->buffers.keyType == falcon_level5_sa_algo)) { + #if defined(HAVE_FALCON) + if (ssl->buffers.keyLabel) { + ret = wc_falcon_init_label((falcon_key*)ssl->hsKey, + (char*)ssl->buffers.key->buffer, + ssl->heap, ssl->buffers.keyDevId); + } + else if (ssl->buffers.keyId) { + ret = wc_falcon_init_id((falcon_key*)ssl->hsKey, + ssl->buffers.key->buffer, + ssl->buffers.key->length, ssl->heap, + ssl->buffers.keyDevId); + } + if (ret == 0) { + if (ssl->buffers.keyType == falcon_level1_sa_algo) { + ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 1); + } + else if (ssl->buffers.keyType == falcon_level5_sa_algo) { + ret = wc_falcon_set_level((falcon_key*)ssl->hsKey, 5); + } + } + if (ret == 0) { + if (ssl->buffers.keySz < ssl->options.minFalconKeySz) { + WOLFSSL_MSG("Falcon key size too small"); + ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk); + } + + /* Return the maximum signature length. */ + *length = wc_falcon_sig_size((falcon_key*)ssl->hsKey); + } + #else + ret = NOT_COMPILED_IN; + #endif + } + else if ((ssl->buffers.keyType == dilithium_level2_sa_algo) || + (ssl->buffers.keyType == dilithium_level3_sa_algo) || + (ssl->buffers.keyType == dilithium_level5_sa_algo)) { + #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) + if (ssl->buffers.keyLabel) { + ret = wc_dilithium_init_label((dilithium_key*)ssl->hsKey, + (char*)ssl->buffers.key->buffer, + ssl->heap, ssl->buffers.keyDevId); + } + else if (ssl->buffers.keyId) { + ret = wc_dilithium_init_id((dilithium_key*)ssl->hsKey, + ssl->buffers.key->buffer, + ssl->buffers.key->length, ssl->heap, + ssl->buffers.keyDevId); + } + if (ret == 0) { + if (ssl->buffers.keyType == dilithium_level2_sa_algo) { + ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 2); + } + else if (ssl->buffers.keyType == dilithium_level3_sa_algo) { + ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 3); + } + else if (ssl->buffers.keyType == dilithium_level5_sa_algo) { + ret = wc_dilithium_set_level((dilithium_key*)ssl->hsKey, 5); + } + } + if (ret == 0) { + if (ssl->buffers.keySz < ssl->options.minDilithiumKeySz) { + WOLFSSL_MSG("Dilithium key size too small"); + ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk); + } + + /* Return the maximum signature length. */ + *length = wc_dilithium_sig_size( + (dilithium_key*)ssl->hsKey); } #else ret = NOT_COMPILED_IN; @@ -25894,7 +28303,7 @@ } /* Return the maximum signature length. */ - *length = (word16)keySz; + *length = (word32)keySz; goto exit_dpk; } @@ -25906,7 +28315,11 @@ FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey); #endif /* !NO_RSA */ - if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0) { + if (ssl->buffers.keyType == ecc_dsa_sa_algo || ssl->buffers.keyType == 0 + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + || ssl->buffers.keyType == sm2_sa_algo + #endif + ) { ssl->hsType = DYNAMIC_TYPE_ECC; ret = AllocKey(ssl, ssl->hsType, &ssl->hsKey); if (ret != 0) { @@ -25939,6 +28352,12 @@ ssl->buffers.key->length); } #endif + #ifdef WOLFSSL_SM2 + if ((ret == 0) && (ssl->buffers.keyType == sm2_sa_algo)) { + ret = wc_ecc_set_curve((ecc_key*)ssl->hsKey, + WOLFSSL_SM2_KEY_BITS / 8, ECC_SM2P256V1); + } + #endif if (ret == 0) { WOLFSSL_MSG("Using ECC private key"); @@ -25950,7 +28369,7 @@ } /* Return the maximum signature length. */ - *length = (word16)wc_ecc_sig_size((ecc_key*)ssl->hsKey); + *length = (word32)wc_ecc_sig_size((ecc_key*)ssl->hsKey); goto exit_dpk; } @@ -26070,8 +28489,11 @@ } } #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */ -#if defined(HAVE_PQC) #if defined(HAVE_FALCON) + #if !defined(NO_RSA) || defined(HAVE_ECC) + FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey); + #endif + if (ssl->buffers.keyType == falcon_level1_sa_algo || ssl->buffers.keyType == falcon_level5_sa_algo || ssl->buffers.keyType == 0) { @@ -26120,19 +28542,25 @@ WOLFSSL_MSG("Using Falcon private key"); /* Check it meets the minimum Falcon key size requirements. */ - if (FALCON_MAX_KEY_SIZE < ssl->options.minFalconKeySz) { + keySz = wc_falcon_size((falcon_key*)ssl->hsKey); + if (keySz < ssl->options.minFalconKeySz) { WOLFSSL_MSG("Falcon key size too small"); ERROR_OUT(FALCON_KEY_SIZE_E, exit_dpk); } /* Return the maximum signature length. */ - *length = FALCON_MAX_SIG_SIZE; + *length = wc_falcon_sig_size((falcon_key*)ssl->hsKey); goto exit_dpk; } } #endif /* HAVE_FALCON */ -#if defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) + #if !defined(NO_RSA) || defined(HAVE_ECC) + FreeKey(ssl, ssl->hsType, (void**)&ssl->hsKey); + #endif + if (ssl->buffers.keyType == dilithium_level2_sa_algo || ssl->buffers.keyType == dilithium_level3_sa_algo || ssl->buffers.keyType == dilithium_level5_sa_algo || @@ -26180,26 +28608,27 @@ /* Set start of data to beginning of buffer. */ idx = 0; /* Decode the key assuming it is a Dilithium private key. */ - ret = wc_dilithium_import_private_only(ssl->buffers.key->buffer, - ssl->buffers.key->length, - (dilithium_key*)ssl->hsKey); + ret = wc_Dilithium_PrivateKeyDecode(ssl->buffers.key->buffer, + &idx, + (dilithium_key*)ssl->hsKey, + ssl->buffers.key->length); if (ret == 0) { WOLFSSL_MSG("Using Dilithium private key"); /* Check it meets the minimum Dilithium key size requirements. */ - if (DILITHIUM_MAX_KEY_SIZE < ssl->options.minDilithiumKeySz) { + keySz = wc_dilithium_size((dilithium_key*)ssl->hsKey); + if (keySz < ssl->options.minDilithiumKeySz) { WOLFSSL_MSG("Dilithium key size too small"); ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dpk); } /* Return the maximum signature length. */ - *length = DILITHIUM_MAX_SIG_SIZE; + *length = wc_dilithium_sig_size((dilithium_key*)ssl->hsKey); goto exit_dpk; } } #endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ (void)idx; (void)keySz; @@ -26213,6 +28642,444 @@ return ret; } +#if defined(WOLFSSL_DUAL_ALG_CERTS) +/* This is just like the above, but only consider RSA, ECC, Falcon and + * Dilthium; Furthermore, use the alternative key, not the native key. + */ +int DecodeAltPrivateKey(WOLFSSL *ssl, word32* length) +{ + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); + int keySz; + word32 idx; + + /* make sure alt private key exists */ + if (ssl->buffers.altKey == NULL || ssl->buffers.altKey->buffer == NULL) { + WOLFSSL_MSG("Alternative Private key missing!"); + ERROR_OUT(NO_PRIVATE_KEY, exit_dapk); + } + +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.altKey, ssl->buffers.altKeyMask); +#endif + +#ifdef WOLF_PRIVATE_KEY_ID + if (ssl->buffers.altKeyDevId != INVALID_DEVID && + (ssl->buffers.altKeyId || ssl->buffers.altKeyLabel)) { + if (ssl->buffers.altKeyType == rsa_sa_algo) + ssl->hsAltType = DYNAMIC_TYPE_RSA; + else if (ssl->buffers.altKeyType == ecc_dsa_sa_algo) + ssl->hsAltType = DYNAMIC_TYPE_ECC; + else if ((ssl->buffers.altKeyType == falcon_level1_sa_algo) || + (ssl->buffers.altKeyType == falcon_level5_sa_algo)) + ssl->hsAltType = DYNAMIC_TYPE_FALCON; + else if ((ssl->buffers.altKeyType == dilithium_level2_sa_algo) || + (ssl->buffers.altKeyType == dilithium_level3_sa_algo) || + (ssl->buffers.altKeyType == dilithium_level5_sa_algo)) + ssl->hsAltType = DYNAMIC_TYPE_DILITHIUM; + ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey); + if (ret != 0) { + goto exit_dapk; + } + + if (ssl->buffers.altKeyType == rsa_sa_algo) { + #ifndef NO_RSA + if (ssl->buffers.altKeyLabel) { + ret = wc_InitRsaKey_Label((RsaKey*)ssl->hsAltKey, + (char*)ssl->buffers.altKey->buffer, + ssl->heap, ssl->buffers.altKeyDevId); + } + else if (ssl->buffers.altKeyId) { + ret = wc_InitRsaKey_Id((RsaKey*)ssl->hsAltKey, + ssl->buffers.altKey->buffer, + ssl->buffers.altKey->length, ssl->heap, + ssl->buffers.altKeyDevId); + } + if (ret == 0) { + if (ssl->buffers.altKeySz < ssl->options.minRsaKeySz) { + WOLFSSL_MSG("RSA key size too small"); + ERROR_OUT(RSA_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = ssl->buffers.altKeySz; + } + #else + ret = NOT_COMPILED_IN; + #endif + } + else if (ssl->buffers.altKeyType == ecc_dsa_sa_algo) { + #ifdef HAVE_ECC + if (ssl->buffers.altKeyLabel) { + ret = wc_ecc_init_label((ecc_key*)ssl->hsAltKey, + (char*)ssl->buffers.altKey->buffer, + ssl->heap, ssl->buffers.altKeyDevId); + } + else if (ssl->buffers.altKeyId) { + ret = wc_ecc_init_id((ecc_key*)ssl->hsAltKey, + ssl->buffers.altKey->buffer, + ssl->buffers.altKey->length, ssl->heap, + ssl->buffers.altKeyDevId); + } + if (ret == 0) { + if (ssl->buffers.altKeySz < ssl->options.minEccKeySz) { + WOLFSSL_MSG("ECC key size too small"); + ERROR_OUT(ECC_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = wc_ecc_sig_size_calc(ssl->buffers.altKeySz); + } + #else + ret = NOT_COMPILED_IN; + #endif + } + else if ((ssl->buffers.altKeyType == falcon_level1_sa_algo) || + (ssl->buffers.altKeyType == falcon_level5_sa_algo)) { + #if defined(HAVE_FALCON) + if (ssl->buffers.altKeyLabel) { + ret = wc_falcon_init_label((falcon_key*)ssl->hsAltKey, + (char*)ssl->buffers.altKey->buffer, + ssl->heap, ssl->buffers.altKeyDevId); + } + else if (ssl->buffers.altKeyId) { + ret = wc_falcon_init_id((falcon_key*)ssl->hsAltKey, + ssl->buffers.altKey->buffer, + ssl->buffers.altKey->length, ssl->heap, + ssl->buffers.altKeyDevId); + } + if (ret == 0) { + if (ssl->buffers.altKeyType == falcon_level1_sa_algo) { + ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 1); + } + else if (ssl->buffers.altKeyType == falcon_level5_sa_algo) { + ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 5); + } + } + if (ret == 0) { + if (ssl->buffers.altKeySz < ssl->options.minFalconKeySz) { + WOLFSSL_MSG("Falcon key size too small"); + ERROR_OUT(FALCON_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = wc_falcon_sig_size((falcon_key*)ssl->hsAltKey); + } + #else + ret = NOT_COMPILED_IN; + #endif + } + else if ((ssl->buffers.altKeyType == dilithium_level2_sa_algo) || + (ssl->buffers.altKeyType == dilithium_level3_sa_algo) || + (ssl->buffers.altKeyType == dilithium_level5_sa_algo)) { + #if defined(HAVE_DILITHIUM) + if (ssl->buffers.altKeyLabel) { + ret = wc_dilithium_init_label((dilithium_key*)ssl->hsAltKey, + (char*)ssl->buffers.altKey->buffer, + ssl->heap, ssl->buffers.altKeyDevId); + } + else if (ssl->buffers.altKeyId) { + ret = wc_dilithium_init_id((dilithium_key*)ssl->hsAltKey, + ssl->buffers.altKey->buffer, + ssl->buffers.altKey->length, ssl->heap, + ssl->buffers.altKeyDevId); + } + if (ret == 0) { + if (ssl->buffers.altKeyType == dilithium_level2_sa_algo) { + ret = wc_dilithium_set_level( + (dilithium_key*)ssl->hsAltKey, 2); + } + else if (ssl->buffers.altKeyType == dilithium_level3_sa_algo) { + ret = wc_dilithium_set_level( + (dilithium_key*)ssl->hsAltKey, 3); + } + else if (ssl->buffers.altKeyType == dilithium_level5_sa_algo) { + ret = wc_dilithium_set_level( + (dilithium_key*)ssl->hsAltKey, 5); + } + } + if (ret == 0) { + if (ssl->buffers.altKeySz < ssl->options.minDilithiumKeySz) { + WOLFSSL_MSG("Dilithium key size too small"); + ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = wc_dilithium_sig_size( + (dilithium_key*)ssl->hsAltKey); + } + #else + ret = NOT_COMPILED_IN; + #endif + } + goto exit_dapk; + } +#endif /* WOLF_PRIVATE_KEY_ID */ + +#ifndef NO_RSA + if (ssl->buffers.altKeyType == rsa_sa_algo || + ssl->buffers.altKeyType == 0) { + ssl->hsAltType = DYNAMIC_TYPE_RSA; + ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey); + if (ret != 0) { + goto exit_dapk; + } + + WOLFSSL_MSG("Trying RSA private key"); + + /* Set start of data to beginning of buffer. */ + idx = 0; + /* Decode the key assuming it is an RSA private key. */ + ret = wc_RsaPrivateKeyDecode(ssl->buffers.altKey->buffer, &idx, + (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey->length); + #ifdef WOLF_PRIVATE_KEY_ID + /* if using external key then allow using a public key */ + if (ret != 0 && (ssl->devId != INVALID_DEVID + #ifdef HAVE_PK_CALLBACKS + || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx) + #endif + )) { + WOLFSSL_MSG("Trying RSA public key with crypto callbacks"); + idx = 0; + ret = wc_RsaPublicKeyDecode(ssl->buffers.altKey->buffer, &idx, + (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey->length); + } + #endif + if (ret == 0) { + WOLFSSL_MSG("Using RSA private key"); + + /* It worked so check it meets minimum key size requirements. */ + keySz = wc_RsaEncryptSize((RsaKey*)ssl->hsAltKey); + if (keySz < 0) { /* check if keySz has error case */ + ERROR_OUT(keySz, exit_dapk); + } + + if (keySz < ssl->options.minRsaKeySz) { + WOLFSSL_MSG("RSA key size too small"); + ERROR_OUT(RSA_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = keySz; + + goto exit_dapk; + } + } +#endif /* !NO_RSA */ + +#ifdef HAVE_ECC +#ifndef NO_RSA + FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey); +#endif /* !NO_RSA */ + + if (ssl->buffers.altKeyType == ecc_dsa_sa_algo || + ssl->buffers.altKeyType == 0 + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + || ssl->buffers.altKeyType == sm2_sa_algo + #endif + ) { + ssl->hsAltType = DYNAMIC_TYPE_ECC; + ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey); + if (ret != 0) { + goto exit_dapk; + } + + #ifndef NO_RSA + WOLFSSL_MSG("Trying ECC private key, RSA didn't work"); + #else + WOLFSSL_MSG("Trying ECC private key"); + #endif + + /* Set start of data to beginning of buffer. */ + idx = 0; + /* Decode the key assuming it is an ECC private key. */ + ret = wc_EccPrivateKeyDecode(ssl->buffers.altKey->buffer, &idx, + (ecc_key*)ssl->hsAltKey, + ssl->buffers.altKey->length); + #ifdef WOLF_PRIVATE_KEY_ID + /* if using external key then allow using a public key */ + if (ret != 0 && (ssl->devId != INVALID_DEVID + #ifdef HAVE_PK_CALLBACKS + || wolfSSL_CTX_IsPrivatePkSet(ssl->ctx) + #endif + )) { + WOLFSSL_MSG("Trying ECC public key with crypto callbacks"); + idx = 0; + ret = wc_EccPublicKeyDecode(ssl->buffers.altKey->buffer, &idx, + (ecc_key*)ssl->hsAltKey, + ssl->buffers.altKey->length); + } + #endif + if (ret == 0) { + WOLFSSL_MSG("Using ECC private key"); + + /* Check it meets the minimum ECC key size requirements. */ + keySz = wc_ecc_size((ecc_key*)ssl->hsAltKey); + if (keySz < ssl->options.minEccKeySz) { + WOLFSSL_MSG("ECC key size too small"); + ERROR_OUT(ECC_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = wc_ecc_sig_size((ecc_key*)ssl->hsAltKey); + + goto exit_dapk; + } + } +#endif +#if defined(HAVE_FALCON) + #if !defined(NO_RSA) || defined(HAVE_ECC) + FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey); + #endif + + if (ssl->buffers.altKeyType == falcon_level1_sa_algo || + ssl->buffers.altKeyType == falcon_level5_sa_algo || + ssl->buffers.altKeyType == 0) { + + ssl->hsAltType = DYNAMIC_TYPE_FALCON; + ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey); + if (ret != 0) { + goto exit_dapk; + } + + if (ssl->buffers.altKeyType == falcon_level1_sa_algo) { + ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 1); + } + else if (ssl->buffers.altKeyType == falcon_level5_sa_algo) { + ret = wc_falcon_set_level((falcon_key*)ssl->hsAltKey, 5); + } + else { + /* What if ssl->buffers.keyType is 0? We might want to do something + * more graceful here. */ + ret = ALGO_ID_E; + } + + if (ret != 0) { + goto exit_dapk; + } + + #if defined(HAVE_ECC) + WOLFSSL_MSG("Trying Falcon private key, ECC didn't work"); + #elif !defined(NO_RSA) + WOLFSSL_MSG("Trying Falcon private key, RSA didn't work"); + #else + WOLFSSL_MSG("Trying Falcon private key"); + #endif + + /* Set start of data to beginning of buffer. */ + idx = 0; + /* Decode the key assuming it is a Falcon private key. */ + ret = wc_falcon_import_private_only(ssl->buffers.altKey->buffer, + ssl->buffers.altKey->length, + (falcon_key*)ssl->hsAltKey); + if (ret == 0) { + WOLFSSL_MSG("Using Falcon private key"); + + /* Check it meets the minimum Falcon key size requirements. */ + keySz = wc_falcon_size((falcon_key*)ssl->hsAltKey); + if (keySz < ssl->options.minFalconKeySz) { + WOLFSSL_MSG("Falcon key size too small"); + ERROR_OUT(FALCON_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = wc_falcon_sig_size((falcon_key*)ssl->hsAltKey); + + goto exit_dapk; + } + } +#endif /* HAVE_FALCON */ +#if defined(HAVE_DILITHIUM) + #if !defined(NO_RSA) || defined(HAVE_ECC) + FreeKey(ssl, ssl->hsAltType, (void**)&ssl->hsAltKey); + #endif + + if (ssl->buffers.altKeyType == dilithium_level2_sa_algo || + ssl->buffers.altKeyType == dilithium_level3_sa_algo || + ssl->buffers.altKeyType == dilithium_level5_sa_algo || + ssl->buffers.altKeyType == 0) { + + ssl->hsAltType = DYNAMIC_TYPE_DILITHIUM; + ret = AllocKey(ssl, ssl->hsAltType, &ssl->hsAltKey); + if (ret != 0) { + goto exit_dapk; + } + + if (ssl->buffers.altKeyType == dilithium_level2_sa_algo) { + ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, 2); + } + else if (ssl->buffers.altKeyType == dilithium_level3_sa_algo) { + ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, 3); + } + else if (ssl->buffers.altKeyType == dilithium_level5_sa_algo) { + ret = wc_dilithium_set_level((dilithium_key*)ssl->hsAltKey, 5); + } + else { + /* What if ssl->buffers.keyType is 0? We might want to do something + * more graceful here. */ + ret = ALGO_ID_E; + } + + if (ret != 0) { + goto exit_dapk; + } + + #if defined(HAVE_FALCON) + WOLFSSL_MSG("Trying Dilithium private key, Falcon didn't work"); + #elif defined(HAVE_ECC) + WOLFSSL_MSG("Trying Dilithium private key, ECC didn't work"); + #elif !defined(NO_RSA) + WOLFSSL_MSG("Trying Dilithium private key, RSA didn't work"); + #else + WOLFSSL_MSG("Trying Dilithium private key"); + #endif + + /* Set start of data to beginning of buffer. */ + idx = 0; + /* Decode the key assuming it is a Dilithium private key. */ + ret = wc_Dilithium_PrivateKeyDecode(ssl->buffers.altKey->buffer, + &idx, + (dilithium_key*)ssl->hsAltKey, + ssl->buffers.altKey->length); + if (ret == 0) { + WOLFSSL_MSG("Using Dilithium private key"); + + /* Check it meets the minimum Dilithium key size requirements. */ + keySz = wc_dilithium_size((dilithium_key*)ssl->hsAltKey); + if (keySz < ssl->options.minDilithiumKeySz) { + WOLFSSL_MSG("Dilithium key size too small"); + ERROR_OUT(DILITHIUM_KEY_SIZE_E, exit_dapk); + } + + /* Return the maximum signature length. */ + *length = wc_dilithium_sig_size((dilithium_key*)ssl->hsAltKey); + + goto exit_dapk; + } + } +#endif /* HAVE_DILITHIUM */ + + (void)idx; + (void)keySz; + (void)length; + +exit_dapk: +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + if (ret == 0) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.altKey, + &ssl->buffers.altKeyMask); + } + else { + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + } +#endif + + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + } + + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */ #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12) @@ -26245,8 +29112,45 @@ ((defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \ (defined(HAVE_ED25519) || defined(HAVE_ED448) || !defined(NO_RSA)))) || \ (!defined(NO_DH) && (!defined(NO_RSA) || defined(HAVE_ANON)))) +/* Returns whether the signature algorithm requires caching of messages. + * + * @param [in] sigAlgo Signature algorithm. + * @return 1 when caching required. + * @return 0 when caching not required. + */ +static int SigAlgoCachesMsgs(int sigAlgo) +{ + int ret; + + (void)sigAlgo; + +#ifdef HAVE_ED25519 + if (sigAlgo == ed25519_sa_algo) { + ret = 1; + } + else +#endif +#ifdef HAVE_ED448 + if (sigAlgo == ed448_sa_algo) { + ret = 1; + } + else +#endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (sigAlgo == sm2_sa_algo) { + ret = 1; + } + else +#endif + { + ret = 0; + } + + return ret; +} + static int HashSkeData(WOLFSSL* ssl, enum wc_HashType hashType, - const byte* data, int sz, byte sigAlgo) + const byte* data, word32 sz, byte sigAlgo) { int ret = 0; int digest_sz = wc_HashGetDigestSize(hashType); @@ -26256,11 +29160,16 @@ } if (ret == 0) { + word32 new_size = SEED_LEN; /* buffer for signature */ - ssl->buffers.sig.buffer = (byte*)XMALLOC(SEED_LEN + sz, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); - if (ssl->buffers.sig.buffer == NULL) { + if (! WC_SAFE_SUM_WORD32(new_size, sz, new_size)) ret = MEMORY_E; + else { + ssl->buffers.sig.buffer = (byte*)XMALLOC(new_size, ssl->heap, + DYNAMIC_TYPE_SIGNATURE); + if (ssl->buffers.sig.buffer == NULL) { + ret = MEMORY_E; + } } } if (ret == 0) { @@ -26273,8 +29182,8 @@ /* message */ XMEMCPY(&ssl->buffers.sig.buffer[RAN_LEN * 2], data, sz); } - if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) { - ssl->buffers.digest.length = (unsigned int)digest_sz; + if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) { + ssl->buffers.digest.length = (unsigned int)digest_sz; /* buffer for hash */ if (!ssl->buffers.digest.buffer) { @@ -26291,7 +29200,7 @@ ret = MEMORY_E; } } - if (ret == 0 && sigAlgo != ed25519_sa_algo && sigAlgo != ed448_sa_algo) { + if (ret == 0 && !SigAlgoCachesMsgs(sigAlgo)) { /* Perform hash. Only wc_Hash supports MD5_SHA1. */ ret = wc_Hash(hashType, ssl->buffers.sig.buffer, ssl->buffers.sig.length, @@ -26315,6 +29224,20 @@ /* client only parts */ #ifndef NO_WOLFSSL_CLIENT + int HaveUniqueSessionObj(WOLFSSL* ssl) + { + if (ssl->session->ref.count > 1) { + WOLFSSL_SESSION* newSession = wolfSSL_SESSION_dup(ssl->session); + if (newSession == NULL) { + WOLFSSL_MSG("Session duplicate failed"); + return 0; + } + wolfSSL_FreeSession(ssl->ctx, ssl->session); + ssl->session = newSession; + } + return 1; + } + #ifndef WOLFSSL_NO_TLS12 /* handle generation of client_hello (1) */ @@ -26325,20 +29248,27 @@ int sendSz; int idSz; int ret; - word16 extSz = 0; + word32 extSz = 0; const Suites* suites; if (ssl == NULL) { return BAD_FUNC_ARG; } - idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0; - #ifdef WOLFSSL_TLS13 if (IsAtLeastTLSv1_3(ssl->version)) return SendTls13ClientHello(ssl); #endif +#ifdef HAVE_SECURE_RENEGOTIATION + /* We don't want to resume in SCR */ + if (IsSCR(ssl)) + ssl->options.resuming = 0; +#endif + + idSz = ssl->options.resuming ? ssl->session->sessionIDSz : 0; + + WOLFSSL_START(WC_FUNC_CLIENT_HELLO_SEND); WOLFSSL_ENTER("SendClientHello"); @@ -26367,7 +29297,7 @@ } #endif length = VERSION_SZ + RAN_LEN - + idSz + ENUM_LEN + + (word32)idSz + ENUM_LEN + SUITE_LEN + COMP_LEN + ENUM_LEN; #ifndef NO_FORCE_SCR_SAME_SUITE @@ -26397,7 +29327,7 @@ if (extSz != 0) length += extSz + HELLO_EXT_SZ_SZ; #endif - sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ; + sendSz = (int)length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ; if (ssl->arrays == NULL) { return BAD_FUNC_ARG; @@ -26407,7 +29337,7 @@ if (ssl->options.dtls) { length += ENUM_LEN; /* cookie */ if (ssl->arrays->cookieSz != 0) length += ssl->arrays->cookieSz; - sendSz = length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ; + sendSz = (int)length + DTLS_HANDSHAKE_HEADER_SZ + DTLS_RECORD_HEADER_SZ; idx += DTLS_HANDSHAKE_EXTRA + DTLS_RECORD_EXTRA; } #endif @@ -26538,7 +29468,7 @@ if (IsEncryptionOn(ssl, 1)) { byte* input; - int inputSz = idx; /* build msg adds rec hdr */ + int inputSz = (int)idx; /* build msg adds rec hdr */ int recordHeaderSz = RECORD_HEADER_SZ; if (ssl->options.dtls) @@ -26551,7 +29481,7 @@ XMEMCPY(input, output + recordHeaderSz, inputSz); #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl) && - (ret = DtlsMsgPoolSave(ssl, input, inputSz, client_hello)) != 0) { + (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, client_hello)) != 0) { XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); return ret; } @@ -26565,7 +29495,7 @@ } else { #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, client_hello)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, client_hello)) != 0) return ret; } if (ssl->options.dtls) @@ -26653,10 +29583,15 @@ #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) if (IsAtLeastTLSv1_3(ssl->version) && ssl->options.dtls) { /* we sent a TLSv1.3 ClientHello but received a - * HELLO_VERIFY_REQUEST */ + * HELLO_VERIFY_REQUEST. We only check if DTLSv1_3_MINOR is the + * min downgrade option as per the server_version field comments in + * https://www.rfc-editor.org/rfc/rfc6347#section-4.2.1 */ if (!ssl->options.downgrade || - ssl->options.minDowngrade < pv.minor) + ssl->options.minDowngrade <= DTLSv1_3_MINOR) return VERSION_ERROR; + + /* Cannot be DTLS1.3 as HELLO_VERIFY_REQUEST */ + ssl->options.tls1_3 = 0; } #endif /* defined(WOLFSSL_DTLS13) && defined(WOLFSSL_TLS13) */ @@ -27145,6 +30080,11 @@ else { if (DSH_CheckSessionId(ssl)) { if (SetCipherSpecs(ssl) == 0) { + if (!HaveUniqueSessionObj(ssl)) { + WOLFSSL_MSG("Unable to have unique session object"); + WOLFSSL_ERROR_VERBOSE(MEMORY_ERROR); + return MEMORY_ERROR; + } XMEMCPY(ssl->arrays->masterSecret, ssl->session->masterSecret, SECRET_LEN); @@ -27253,7 +30193,7 @@ if ((len > size) || ((*inOutIdx - begin) + len > size)) return BUFFER_ERROR; - if (PickHashSigAlgo(ssl, input + *inOutIdx, len) != 0 && + if (PickHashSigAlgo(ssl, input + *inOutIdx, len, 0) != 0 && ssl->buffers.certificate && ssl->buffers.certificate->buffer) { #ifdef HAVE_PK_CALLBACKS @@ -27288,10 +30228,10 @@ return BUFFER_ERROR; #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) - if (ssl->ca_names != ssl->ctx->ca_names) - wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL); - ssl->ca_names = wolfSSL_sk_X509_NAME_new(NULL); - if (ssl->ca_names == NULL) { + if (ssl->client_ca_names != ssl->ctx->client_ca_names) + wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL); + ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL); + if (ssl->client_ca_names == NULL) { return MEMORY_ERROR; } #endif @@ -27327,7 +30267,7 @@ ret = GetName(cert, SUBJECT, dnSz); if (ret == 0) { - if ((name = wolfSSL_X509_NAME_new()) == NULL) + if ((name = wolfSSL_X509_NAME_new_ex(cert->heap)) == NULL) ret = MEMORY_ERROR; } @@ -27336,7 +30276,7 @@ } if (ret == 0) { - if (wolfSSL_sk_X509_NAME_push(ssl->ca_names, name) + if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name) == WOLFSSL_FAILURE) { ret = MEMORY_ERROR; @@ -27426,7 +30366,7 @@ static int CheckCurveId(int tlsCurveId) { - int ret = ECC_CURVE_ERROR; + int ret = WC_NO_ERR_TRACE(ECC_CURVE_ERROR); switch (tlsCurveId) { #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 @@ -27469,6 +30409,9 @@ #ifdef HAVE_ECC_BRAINPOOL case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID; #endif /* HAVE_ECC_BRAINPOOL */ + #ifdef WOLFSSL_SM2 + case WOLFSSL_ECC_SM2P256V1: return ECC_SM2P256V1_OID; + #endif /* WOLFSSL_SM2 */ #endif #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448 case WOLFSSL_ECC_X448: return ECC_X448_OID; @@ -27491,7 +30434,9 @@ case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID; #endif /* !NO_ECC_SECP */ #endif - default: break; + default: + ret = WC_NO_ERR_TRACE(ECC_CURVE_ERROR); + break; } return ret; @@ -27513,8 +30458,6 @@ word16 verifySigSz; #endif word16 sigSz; - byte sigAlgo; - byte hashAlgo; #if !defined(NO_RSA) && defined(WC_RSA_PSS) int bits; #endif @@ -27819,7 +30762,7 @@ args = (DskeArgs*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_dske; @@ -27833,8 +30776,8 @@ XMEMSET(args, 0, sizeof(DskeArgs)); args->idx = *inOutIdx; args->begin = *inOutIdx; - args->sigAlgo = ssl->specs.sig_algo; - args->hashAlgo = sha_mac; + ssl->options.peerSigAlgo = ssl->specs.sig_algo; + ssl->options.peerHashAlgo = sha_mac; #ifdef WOLFSSL_ASYNC_CRYPT ssl->async->freeArgs = FreeDskeArgs; #endif @@ -27871,7 +30814,7 @@ } /* get PSK server hint from the wire */ - srvHintLen = min(length, MAX_PSK_ID_LEN); + srvHintLen = (int)min(length, MAX_PSK_ID_LEN); XMEMCPY(ssl->arrays->server_hint, input + args->idx, srvHintLen); ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */ @@ -27914,7 +30857,7 @@ if ((curveOid = CheckCurveId(b)) < 0) { ERROR_OUT(ECC_CURVE_ERROR, exit_dske); } - ssl->ecdhCurveOID = curveOid; + ssl->ecdhCurveOID = (word32)curveOid; #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE) ssl->namedGroup = 0; #endif @@ -27945,9 +30888,9 @@ input + args->idx, length, EC25519_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, illegal_parameter); @@ -27988,9 +30931,9 @@ input + args->idx, length, EC448_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, illegal_parameter); @@ -28025,7 +30968,7 @@ } } - curveId = wc_ecc_get_oid(curveOid, NULL, NULL); + curveId = wc_ecc_get_oid((word32)curveOid, NULL, NULL); if (wc_ecc_import_x963_ex(input + args->idx, length, ssl->peerEccKey, curveId) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS @@ -28058,7 +31001,7 @@ } /* get PSK server hint from the wire */ - srvHintLen = min(length, MAX_PSK_ID_LEN); + srvHintLen = (int)min(length, MAX_PSK_ID_LEN); XMEMCPY(ssl->arrays->server_hint, input + args->idx, srvHintLen); ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */ @@ -28091,7 +31034,7 @@ } /* get PSK server hint from the wire */ - srvHintLen = min(length, MAX_PSK_ID_LEN); + srvHintLen = (int)min(length, MAX_PSK_ID_LEN); XMEMCPY(ssl->arrays->server_hint, input + args->idx, srvHintLen); ssl->arrays->server_hint[srvHintLen] = '\0'; /* null term */ @@ -28114,6 +31057,7 @@ if ((curveOid = CheckCurveId(b)) < 0) { ERROR_OUT(ECC_CURVE_ERROR, exit_dske); } + ssl->ecdhCurveOID = (word32)curveOid; length = input[args->idx++]; if ((args->idx - args->begin) + length > size) { @@ -28141,9 +31085,9 @@ input + args->idx, length, EC25519_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, illegal_parameter); @@ -28184,9 +31128,9 @@ input + args->idx, length, EC448_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, illegal_parameter); @@ -28221,7 +31165,7 @@ } } - curveId = wc_ecc_get_oid(curveOid, NULL, NULL); + curveId = wc_ecc_get_oid((word32)curveOid, NULL, NULL); if (wc_ecc_import_x963_ex(input + args->idx, length, ssl->peerEccKey, curveId) != 0) { ERROR_OUT(ECC_PEERKEY_ERROR, exit_dske); @@ -28266,14 +31210,14 @@ ERROR_OUT(NOT_COMPILED_IN, exit_dske); #else enum wc_HashType hashType; - word16 verifySz; + word32 verifySz; byte sigAlgo; if (ssl->options.usingAnon_cipher) { break; } - verifySz = (word16)(args->idx - args->begin); + verifySz = (args->idx - args->begin); if (verifySz > MAX_DH_SZ) { ERROR_OUT(BUFFER_ERROR, exit_dske); } @@ -28284,36 +31228,52 @@ ERROR_OUT(BUFFER_ERROR, exit_dske); } - DecodeSigAlg(&input[args->idx], &args->hashAlgo, + /* Check if hashSigAlgo in Server Key Exchange is supported + * in our ssl->suites or ssl->ctx->suites. */ + if (!SupportedHashSigAlgo(ssl, &input[args->idx])) { + #ifdef WOLFSSL_EXTRA_ALERTS + SendAlert(ssl, alert_fatal, handshake_failure); + #endif + ERROR_OUT(MATCH_SUITE_ERROR, exit_dske); + } + + DecodeSigAlg(&input[args->idx], &ssl->options.peerHashAlgo, &sigAlgo); #ifndef NO_RSA if (sigAlgo == rsa_pss_sa_algo && - args->sigAlgo == rsa_sa_algo) { - args->sigAlgo = sigAlgo; + ssl->options.peerSigAlgo == rsa_sa_algo) { + ssl->options.peerSigAlgo = sigAlgo; + } + else + #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (sigAlgo == sm2_sa_algo && + ssl->options.peerSigAlgo == ecc_dsa_sa_algo) { + ssl->options.peerSigAlgo = sigAlgo; } else #endif #ifdef HAVE_ED25519 if (sigAlgo == ed25519_sa_algo && - args->sigAlgo == ecc_dsa_sa_algo) { - args->sigAlgo = sigAlgo; + ssl->options.peerSigAlgo == ecc_dsa_sa_algo) { + ssl->options.peerSigAlgo = sigAlgo; } else #endif #ifdef HAVE_ED448 if (sigAlgo == ed448_sa_algo && - args->sigAlgo == ecc_dsa_sa_algo) { - args->sigAlgo = sigAlgo; + ssl->options.peerSigAlgo == ecc_dsa_sa_algo) { + ssl->options.peerSigAlgo = sigAlgo; } else #endif /* Signature algorithm from message must match signature * algorithm in cipher suite. */ - if (sigAlgo != args->sigAlgo) { + if (sigAlgo != ssl->options.peerSigAlgo) { ERROR_OUT(ALGO_ID_E, exit_dske); } args->idx += 2; - hashType = HashAlgoToType(args->hashAlgo); + hashType = HashAlgoToType(ssl->options.peerHashAlgo); if (hashType == WC_HASH_TYPE_NONE) { ERROR_OUT(ALGO_ID_E, exit_dske); } @@ -28321,7 +31281,7 @@ /* only using sha and md5 for rsa */ #ifndef NO_OLD_TLS hashType = WC_HASH_TYPE_SHA; - if (args->sigAlgo == rsa_sa_algo) { + if (ssl->options.peerSigAlgo == rsa_sa_algo) { hashType = WC_HASH_TYPE_MD5_SHA; } #else @@ -28342,12 +31302,12 @@ } ret = HashSkeData(ssl, hashType, input + args->begin, - verifySz, args->sigAlgo); + verifySz, ssl->options.peerSigAlgo); if (ret != 0) { goto exit_dske; } - switch (args->sigAlgo) + switch (ssl->options.peerSigAlgo) { #ifndef NO_RSA #ifdef WC_RSA_PSS @@ -28363,6 +31323,9 @@ } #endif /* !NO_RSA */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + #endif case ecc_dsa_sa_algo: { if (!ssl->peerEccDsaKeyPresent) { @@ -28392,7 +31355,7 @@ default: ret = ALGO_ID_E; - } /* switch (args->sigAlgo) */ + } /* switch (ssl->options.peerSigAlgo) */ #endif /* NO_DH && !HAVE_ECC && !HAVE_ED25519 && !HAVE_ED448 */ break; @@ -28444,7 +31407,7 @@ args->verifySigSz); } - switch (args->sigAlgo) + switch (ssl->options.peerSigAlgo) { #ifndef NO_RSA #ifdef WC_RSA_PSS @@ -28455,7 +31418,7 @@ ret = RsaVerify(ssl, args->verifySig, args->verifySigSz, &args->output, - args->sigAlgo, args->hashAlgo, + ssl->options.peerSigAlgo, ssl->options.peerHashAlgo, ssl->peerRsaKey, #ifdef HAVE_PK_CALLBACKS &ssl->buffers.peerRsaKey @@ -28472,7 +31435,7 @@ ret = 0; } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* peerRsaKey */ @@ -28484,35 +31447,57 @@ } #endif /* !NO_RSA */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + #endif case ecc_dsa_sa_algo: { ret = NOT_COMPILED_IN; #ifdef HAVE_PK_CALLBACKS if (ssl->ctx && ssl->ctx->ProcessServerSigKexCb) { ret = ssl->ctx->ProcessServerSigKexCb(ssl, - args->sigAlgo, + ssl->options.peerSigAlgo, args->verifySig, args->verifySigSz, ssl->buffers.sig.buffer, SEED_LEN, &ssl->buffers.sig.buffer[SEED_LEN], (ssl->buffers.sig.length - SEED_LEN)); } #endif /* HAVE_PK_CALLBACKS */ - if (ret == NOT_COMPILED_IN) { - ret = EccVerify(ssl, - args->verifySig, args->verifySigSz, - ssl->buffers.digest.buffer, - ssl->buffers.digest.length, - ssl->peerEccDsaKey, - #ifdef HAVE_PK_CALLBACKS - &ssl->buffers.peerEccDsaKey - #else - NULL - #endif - ); + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->options.peerSigAlgo == sm2_sa_algo) { + ret = Sm2wSm3Verify(ssl, + TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ, + args->verifySig, args->verifySigSz, + ssl->buffers.sig.buffer, + ssl->buffers.sig.length, + ssl->peerEccDsaKey, + #ifdef HAVE_PK_CALLBACKS + &ssl->buffers.peerEccDsaKey + #else + NULL + #endif + ); + } + else + #endif + { + ret = EccVerify(ssl, + args->verifySig, args->verifySigSz, + ssl->buffers.digest.buffer, + ssl->buffers.digest.length, + ssl->peerEccDsaKey, + #ifdef HAVE_PK_CALLBACKS + &ssl->buffers.peerEccDsaKey + #else + NULL + #endif + ); + } } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* peerEccDsaKey */ @@ -28542,7 +31527,7 @@ ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* peerEccDsaKey */ @@ -28572,7 +31557,7 @@ ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* peerEccDsaKey */ @@ -28633,7 +31618,7 @@ /* increment index after verify is done */ args->idx += args->verifySigSz; - switch(args->sigAlgo) + switch(ssl->options.peerSigAlgo) { #ifndef NO_RSA #ifdef WC_RSA_PSS @@ -28643,13 +31628,13 @@ ssl->buffers.digest.buffer, ssl->buffers.digest.length, args->output, args->sigSz, - HashAlgoToType(args->hashAlgo)); + HashAlgoToType(ssl->options.peerHashAlgo)); #else ret = wc_RsaPSS_CheckPadding_ex( ssl->buffers.digest.buffer, ssl->buffers.digest.length, args->output, args->sigSz, - HashAlgoToType(args->hashAlgo), + HashAlgoToType(ssl->options.peerHashAlgo), -1, args->bits); #endif if (ret != 0) @@ -28661,8 +31646,8 @@ #endif case rsa_sa_algo: { - #if (defined(WOLFSSL_RENESAS_SCEPROTECT) && \ - defined(WOLFSSL_RENESAS_SCEPROTECT_ECC)) || \ + #if (defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ + defined(WOLFSSL_RENESAS_FSPSM_ECC)) || \ defined(WOLFSSL_RENESAS_TSIP_TLS) /* already checked signature result by SCE */ /* skip the sign checks below */ @@ -28689,7 +31674,7 @@ encSigSz = wc_EncodeSignature(encodedSig, ssl->buffers.digest.buffer, ssl->buffers.digest.length, - TypeHash(args->hashAlgo)); + TypeHash(ssl->options.peerHashAlgo)); if (encSigSz != args->sigSz || !args->output || XMEMCMP(args->output, encodedSig, min(encSigSz, MAX_ENCODED_SIG_SZ)) != 0) { @@ -28720,6 +31705,11 @@ /* Nothing to do in this algo */ break; #endif /* HAVE_ECC */ + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + /* Nothing to do in this algo */ + break; + #endif /* WOLFSSL_SM2 && WOLFSSL_SM3 */ #if defined(HAVE_ED25519) case ed25519_sa_algo: /* Nothing to do in this algo */ @@ -28784,7 +31774,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* Handle async operation */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Mark message as not received so it can process again */ ssl->msgsReceived.got_server_key_exchange = 0; @@ -28865,7 +31855,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_scke; @@ -29165,11 +32155,13 @@ void* ctx = wolfSSL_GetGenPreMasterCtx(ssl); ret = ssl->ctx->GenPreMasterCb(ssl, ssl->arrays->preMasterSecret, ENCRYPT_LEN, ctx); - if (ret != 0 && ret != PROTOCOLCB_UNAVAILABLE) { + if (ret != 0 && + ret != WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) { goto exit_scke; } } - if (!ssl->ctx->GenPreMasterCb || ret == PROTOCOLCB_UNAVAILABLE) + if (!ssl->ctx->GenPreMasterCb || + ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) #endif { /* build PreMasterSecret with RNG data */ @@ -29259,23 +32251,13 @@ case psk_kea: { byte* pms = ssl->arrays->preMasterSecret; - int cbret = (int)ssl->options.client_psk_cb(ssl, + ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl, ssl->arrays->server_hint, ssl->arrays->client_identity, MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN); - - if (cbret == 0 || cbret > MAX_PSK_KEY_LEN) { - if (cbret != USE_HW_PSK) { - ERROR_OUT(PSK_KEY_ERROR, exit_scke); - } - } - - if (cbret == USE_HW_PSK) { - /* USE_HW_PSK indicates that the hardware has the PSK - * and generates the premaster secret. */ - ssl->arrays->psk_keySz = 0; - } - else { - ssl->arrays->psk_keySz = (word32)cbret; + if (ssl->arrays->psk_keySz == 0 || + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { + ERROR_OUT(PSK_KEY_ERROR, exit_scke); } /* Ensure the buffer is null-terminated. */ @@ -29287,7 +32269,7 @@ XMEMCPY(args->encSecret, ssl->arrays->client_identity, args->encSz); ssl->options.peerAuthGood = 1; - if (cbret != USE_HW_PSK) { + if ((int)ssl->arrays->psk_keySz > 0) { /* CLIENT: Pre-shared Key for peer authentication. */ /* make psk pre master secret */ @@ -29303,8 +32285,8 @@ ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) + (2 * OPAQUE16_LEN); ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz); - ssl->arrays->psk_keySz = 0; /* No further need */ } + ssl->arrays->psk_keySz = 0; /* No further need */ break; } #endif /* !NO_PSK */ @@ -29315,12 +32297,14 @@ args->output = args->encSecret; ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl, - ssl->arrays->server_hint, ssl->arrays->client_identity, - MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN); + ssl->arrays->server_hint, ssl->arrays->client_identity, + MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN); if (ssl->arrays->psk_keySz == 0 || - ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { ERROR_OUT(PSK_KEY_ERROR, exit_scke); } + ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */ esSz = (word32)XSTRLEN(ssl->arrays->client_identity); @@ -29396,12 +32380,14 @@ /* Send PSK client identity */ ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl, - ssl->arrays->server_hint, ssl->arrays->client_identity, - MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN); + ssl->arrays->server_hint, ssl->arrays->client_identity, + MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN); if (ssl->arrays->psk_keySz == 0 || - ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { ERROR_OUT(PSK_KEY_ERROR, exit_scke); } + ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; /* null term */ esSz = (word32)XSTRLEN(ssl->arrays->client_identity); if (esSz > MAX_PSK_ID_LEN) { @@ -29421,7 +32407,7 @@ args->length = MAX_ENCRYPT_SZ; /* Create shared ECC key leaving room at the beginning - of buffer for size of shared key. */ + * of buffer for size of shared key. */ ssl->arrays->preMasterSz = ENCRYPT_LEN - OPAQUE16_LEN; #ifdef HAVE_CURVE25519 @@ -29673,7 +32659,7 @@ WOLFSSL_CLIENT_END ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { FreeKey(ssl, DYNAMIC_TYPE_ECC, @@ -29812,13 +32798,15 @@ pms += ssl->arrays->preMasterSz; /* make psk pre master secret */ - /* length of key + length 0s + length of key + key */ - c16toa((word16)ssl->arrays->psk_keySz, pms); - pms += OPAQUE16_LEN; - XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); - ssl->arrays->preMasterSz += - ssl->arrays->psk_keySz + OPAQUE16_LEN; - ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz); + if ((int)ssl->arrays->psk_keySz > 0) { + /* length of key + length 0s + length of key + key */ + c16toa((word16)ssl->arrays->psk_keySz, pms); + pms += OPAQUE16_LEN; + XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); + ssl->arrays->preMasterSz += + ssl->arrays->psk_keySz + OPAQUE16_LEN; + ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz); + } ssl->arrays->psk_keySz = 0; /* No further need */ break; } @@ -29839,18 +32827,19 @@ args->encSz += args->length + OPAQUE8_LEN; /* Create pre master secret is the concatenation of - eccSize + eccSharedKey + pskSize + pskKey */ + * eccSize + eccSharedKey + pskSize + pskKey */ c16toa((word16)ssl->arrays->preMasterSz, pms); ssl->arrays->preMasterSz += OPAQUE16_LEN; pms += ssl->arrays->preMasterSz; - c16toa((word16)ssl->arrays->psk_keySz, pms); - pms += OPAQUE16_LEN; - XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); - ssl->arrays->preMasterSz += - ssl->arrays->psk_keySz + OPAQUE16_LEN; + if ((int)ssl->arrays->psk_keySz > 0) { + c16toa((word16)ssl->arrays->psk_keySz, pms); + pms += OPAQUE16_LEN; + XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); + ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN; - ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz); + ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz); + } ssl->arrays->psk_keySz = 0; /* No further need */ break; } @@ -29902,7 +32891,7 @@ } idx = HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ; - args->sendSz = args->encSz + tlsSz + idx; + args->sendSz = (int)(args->encSz + tlsSz + idx); #ifdef WOLFSSL_DTLS if (ssl->options.dtls) { @@ -30035,7 +33024,7 @@ #ifdef WOLFSSL_ASYNC_IO /* Handle async operation */ - if (ret == WC_PENDING_E || ret == WANT_WRITE) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) || ret == WANT_WRITE) { if (ssl->options.buildingMsg) return ret; /* If we have completed all states then we will not enter this function @@ -30083,7 +33072,7 @@ word32 sigSz; int sendSz; int inputSz; - word16 length; + word32 length; byte sigAlgo; } ScvArgs; @@ -30119,6 +33108,10 @@ WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND); WOLFSSL_ENTER("SendCertificateVerify"); +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); +#endif + #ifdef WOLFSSL_ASYNC_IO if (ssl->async == NULL) { ssl->async = (struct WOLFSSL_ASYNC*) @@ -30131,10 +33124,10 @@ args = (ScvArgs*)ssl->async->args; #ifdef WOLFSSL_ASYNC_CRYPT /* BuildMessage does its own Pop */ - if (ssl->error != WC_PENDING_E || + if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E) || ssl->options.asyncState != TLS_ASYNC_END) ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_scv; @@ -30165,6 +33158,10 @@ case TLS_ASYNC_BEGIN: { if (ssl->options.sendVerify == SEND_BLANK_CERT) { + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, + ssl->buffers.keyMask); + #endif return 0; /* sent blank cert, can't verify */ } @@ -30195,7 +33192,7 @@ if (ssl->buffers.key == NULL) { #ifdef HAVE_PK_CALLBACKS if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) - args->length = GetPrivateKeySigSize(ssl); + args->length = (word16)GetPrivateKeySigSize(ssl); else #endif ERROR_OUT(NO_PRIVATE_KEY, exit_scv); @@ -30260,7 +33257,15 @@ args->sigAlgo = rsa_sa_algo; } else if (ssl->hsType == DYNAMIC_TYPE_ECC) - args->sigAlgo = ecc_dsa_sa_algo; + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->buffers.keyType == sm2_sa_algo) { + args->sigAlgo = sm2_sa_algo; + } + else + #endif + { + args->sigAlgo = ecc_dsa_sa_algo; + } else if (ssl->hsType == DYNAMIC_TYPE_ED25519) args->sigAlgo = ed25519_sa_algo; else if (ssl->hsType == DYNAMIC_TYPE_ED448) @@ -30294,7 +33299,7 @@ } /* prepend hdr */ - c16toa(args->length, args->verify + args->extraSz); + c16toa((word16)args->length, args->verify + args->extraSz); } #ifdef WC_RSA_PSS else if (args->sigAlgo == rsa_pss_sa_algo) { @@ -30304,7 +33309,7 @@ args->sigSz = ENCRYPT_LEN; /* prepend hdr */ - c16toa(args->length, args->verify + args->extraSz); + c16toa((word16)args->length, args->verify + args->extraSz); } #endif #endif /* !NO_RSA */ @@ -30334,17 +33339,36 @@ if (ssl->hsType == DYNAMIC_TYPE_ECC) { ecc_key* key = (ecc_key*)ssl->hsKey; - ret = EccSign(ssl, - ssl->buffers.digest.buffer, ssl->buffers.digest.length, - ssl->buffers.sig.buffer, - (word32*)&ssl->buffers.sig.length, - key, - #ifdef HAVE_PK_CALLBACKS - ssl->buffers.key - #else - NULL + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (args->sigAlgo == sm2_sa_algo) { + ret = Sm2wSm3Sign(ssl, + TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ, + ssl->hsHashes->messages, ssl->hsHashes->length, + ssl->buffers.sig.buffer, + (word32*)&ssl->buffers.sig.length, + key, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } + else #endif - ); + { + ret = EccSign(ssl, + ssl->buffers.digest.buffer, ssl->buffers.digest.length, + ssl->buffers.sig.buffer, + (word32*)&ssl->buffers.sig.length, + key, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } } #endif /* HAVE_ECC */ #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH) @@ -30418,16 +33442,34 @@ { ecc_key* key = (ecc_key*)ssl->hsKey; - ret = EccVerify(ssl, - ssl->buffers.sig.buffer, ssl->buffers.sig.length, - ssl->buffers.digest.buffer, ssl->buffers.digest.length, - key, - #ifdef HAVE_PK_CALLBACKS - ssl->buffers.key - #else - NULL - #endif - ); + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->buffers.keyType == sm2_sa_algo) { + ret = Sm3wSm2Verify(ssl, + TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ, + ssl->buffers.sig.buffer, ssl->buffers.sig.length, + ssl->buffers.digest.buffer, + ssl->buffers.digest.length, key, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } + else + #endif + { + ret = EccVerify(ssl, + ssl->buffers.sig.buffer, ssl->buffers.sig.length, + ssl->buffers.digest.buffer, + ssl->buffers.digest.length, key, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } if (ret != 0) { WOLFSSL_MSG("Failed to verify ECC signature"); goto exit_scv; @@ -30446,7 +33488,7 @@ #endif args->length = (word16)ssl->buffers.sig.length; /* prepend hdr */ - c16toa(args->length, args->verify + args->extraSz); + c16toa((word16)args->length, args->verify + args->extraSz); XMEMCPY(args->verify + args->extraSz + VERIFY_HEADER, ssl->buffers.sig.buffer, ssl->buffers.sig.length); break; @@ -30475,7 +33517,7 @@ ); /* free temporary buffer now */ - if (ret != WC_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) { XFREE(args->verifySig, ssl->heap, DYNAMIC_TYPE_SIGNATURE); args->verifySig = NULL; } @@ -30524,6 +33566,15 @@ } /* switch(ssl->options.asyncState) */ exit_scv: +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + if (ret == 0) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + &ssl->buffers.keyMask); + } + else { + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + } +#endif WOLFSSL_LEAVE("SendCertificateVerify", ret); WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND); @@ -30575,6 +33626,9 @@ #ifdef HAVE_SESSION_TICKET int SetTicket(WOLFSSL* ssl, const byte* ticket, word32 length) { + if (!HaveUniqueSessionObj(ssl)) + return MEMORY_ERROR; + /* Free old dynamic ticket if we already had one */ if (ssl->session->ticketLenAlloc > 0) { XFREE(ssl->session->ticket, ssl->heap, DYNAMIC_TYPE_SESSION_TICK); @@ -30684,7 +33738,7 @@ #ifndef NO_CERTS -#ifdef WOLF_PRIVATE_KEY_ID +#if defined(WOLF_PRIVATE_KEY_ID) || defined(HAVE_PK_CALLBACKS) int GetPrivateKeySigSize(WOLFSSL* ssl) { int sigSz = 0; @@ -30725,7 +33779,7 @@ } return sigSz; } -#endif /* HAVE_PK_CALLBACKS */ +#endif /* WOLF_PRIVATE_KEY_ID || HAVE_PK_CALLBACKS */ #endif /* NO_CERTS */ @@ -30780,6 +33834,10 @@ case ECC_BRAINPOOLP256R1_OID: return WOLFSSL_ECC_BRAINPOOLP256R1; #endif /* HAVE_ECC_BRAINPOOL */ + #ifdef WOLFSSL_SM2 + case ECC_SM2P256V1_OID: + return WOLFSSL_ECC_SM2P256V1; + #endif /* WOLFSSL_SM2 */ #endif #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP @@ -30813,28 +33871,47 @@ int TranslateErrorToAlert(int err) { switch (err) { - case BUFFER_ERROR: + case WC_NO_ERR_TRACE(BUFFER_ERROR): return decode_error; - case EXT_NOT_ALLOWED: - case PEER_KEY_ERROR: - case ECC_PEERKEY_ERROR: - case BAD_KEY_SHARE_DATA: - case PSK_KEY_ERROR: - case INVALID_PARAMETER: - case HRR_COOKIE_ERROR: + case WC_NO_ERR_TRACE(EXT_NOT_ALLOWED): + case WC_NO_ERR_TRACE(PEER_KEY_ERROR): + case WC_NO_ERR_TRACE(ECC_PEERKEY_ERROR): + case WC_NO_ERR_TRACE(BAD_KEY_SHARE_DATA): + case WC_NO_ERR_TRACE(PSK_KEY_ERROR): + case WC_NO_ERR_TRACE(INVALID_PARAMETER): + case WC_NO_ERR_TRACE(HRR_COOKIE_ERROR): + case WC_NO_ERR_TRACE(BAD_BINDER): return illegal_parameter; - case INCOMPLETE_DATA: + case WC_NO_ERR_TRACE(INCOMPLETE_DATA): return missing_extension; - case MATCH_SUITE_ERROR: - case MISSING_HANDSHAKE_DATA: + case WC_NO_ERR_TRACE(MATCH_SUITE_ERROR): + case WC_NO_ERR_TRACE(MISSING_HANDSHAKE_DATA): return handshake_failure; - case VERSION_ERROR: + case WC_NO_ERR_TRACE(VERSION_ERROR): return wolfssl_alert_protocol_version; default: return invalid_alert; } } + /* search suites for specific one, idx on success, negative on error */ + int FindSuite(const Suites* suites, byte first, byte second) + { + int i; + + if (suites == NULL || suites->suiteSz == 0) { + WOLFSSL_MSG("Suites pointer error or suiteSz 0"); + return SUITES_ERROR; + } + + for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) { + if (suites->suites[i] == first && + suites->suites[i+1] == second ) + return i; + } + + return MATCH_SUITE_ERROR; + } #ifndef NO_WOLFSSL_SERVER @@ -31023,7 +34100,7 @@ if (IsEncryptionOn(ssl, 1)) { byte* input; - int inputSz = idx; /* build msg adds rec hdr */ + int inputSz = (int)idx; /* build msg adds rec hdr */ int recordHeaderSz = RECORD_HEADER_SZ; if (ssl->options.dtls) @@ -31036,7 +34113,7 @@ XMEMCPY(input, output + recordHeaderSz, inputSz); #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl) && - (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello)) != 0) { + (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, server_hello)) != 0) { XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); return ret; } @@ -31050,7 +34127,7 @@ } else { #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, server_hello)) != 0) return ret; } if (ssl->options.dtls) @@ -31122,7 +34199,7 @@ #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) word32 exportSz; #endif - int sendSz; + word32 sendSz; int inputSz; } SskeArgs; @@ -31161,6 +34238,10 @@ WOLFSSL_START(WC_FUNC_SERVER_KEY_EXCHANGE_SEND); WOLFSSL_ENTER("SendServerKeyExchange"); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + #endif + #ifdef WOLFSSL_ASYNC_IO if (ssl->async == NULL) { ssl->async = (struct WOLFSSL_ASYNC*) @@ -31173,7 +34254,7 @@ args = (SskeArgs*)ssl->async->args; #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_sske; @@ -31463,10 +34544,15 @@ if (ssl->eccTempKeyPresent == 0) { ret = X25519MakeKey(ssl, (curve25519_key*)ssl->eccTempKey, NULL); - if (ret == 0 || ret == WC_PENDING_E) { + if (ret == 0 || + ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ssl->eccTempKeyPresent = DYNAMIC_TYPE_CURVE25519; } + else { + FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, + (void**)&ssl->eccTempKey); + } } break; } @@ -31486,10 +34572,15 @@ if (ssl->eccTempKeyPresent == 0) { ret = X448MakeKey(ssl, (curve448_key*)ssl->eccTempKey, NULL); - if (ret == 0 || ret == WC_PENDING_E) { + if (ret == 0 || + ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ssl->eccTempKeyPresent = DYNAMIC_TYPE_CURVE448; } + else { + FreeKey(ssl, DYNAMIC_TYPE_CURVE448, + (void**)&ssl->eccTempKey); + } } break; } @@ -31507,7 +34598,8 @@ if (ssl->eccTempKeyPresent == 0) { ret = EccMakeKey(ssl, ssl->eccTempKey, NULL); - if (ret == 0 || ret == WC_PENDING_E) { + if (ret == 0 || + ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ssl->eccTempKeyPresent = DYNAMIC_TYPE_ECC; } } @@ -31831,7 +34923,7 @@ if (ssl->buffers.key == NULL) { #ifdef HAVE_PK_CALLBACKS if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) { - args->tmpSigSz = GetPrivateKeySigSize(ssl); + args->tmpSigSz = (word32)GetPrivateKeySigSize(ssl); if (args->tmpSigSz == 0) { ERROR_OUT(NO_PRIVATE_KEY, exit_sske); } @@ -31848,7 +34940,7 @@ #endif case rsa_sa_algo: { - word16 keySz; + word32 keySz; ssl->buffers.keyType = rsa_sa_algo; ret = DecodePrivateKey(ssl, &keySz); @@ -31861,11 +34953,14 @@ } #endif /* !NO_RSA */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + #endif case ecc_dsa_sa_algo: { - word16 keySz; + word32 keySz; - ssl->buffers.keyType = ecc_dsa_sa_algo; + ssl->buffers.keyType = ssl->options.sigAlgo; ret = DecodePrivateKey(ssl, &keySz); if (ret != 0) { goto exit_sske; @@ -31878,7 +34973,7 @@ #ifdef HAVE_ED25519 case ed25519_sa_algo: { - word16 keySz; + word32 keySz; ssl->buffers.keyType = ed25519_sa_algo; ret = DecodePrivateKey(ssl, &keySz); @@ -31894,7 +34989,7 @@ #ifdef HAVE_ED448 case ed448_sa_algo: { - word16 keySz; + word32 keySz; ssl->buffers.keyType = ed448_sa_algo; ret = DecodePrivateKey(ssl, &keySz); @@ -32053,6 +35148,9 @@ break; #endif #endif /* !NO_RSA */ + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + #endif case ecc_dsa_sa_algo: { break; @@ -32094,7 +35192,7 @@ preSigSz = args->length; if (!ssl->options.usingAnon_cipher) { - word16 keySz = 0; + word32 keySz = 0; /* sig length */ args->length += LENGTH_SZ; @@ -32102,7 +35200,7 @@ if (ssl->buffers.key == NULL) { #ifdef HAVE_PK_CALLBACKS if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) - keySz = (word32)GetPrivateKeySigSize(ssl); + keySz = (word16)GetPrivateKeySigSize(ssl); else #endif ERROR_OUT(NO_PRIVATE_KEY, exit_sske); @@ -32332,6 +35430,27 @@ } #endif /* !NO_RSA */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + { + ecc_key* key = (ecc_key*)ssl->hsKey; + + ret = Sm2wSm3Sign(ssl, + TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ, + ssl->buffers.sig.buffer, + ssl->buffers.sig.length, + args->output + LENGTH_SZ + args->idx, + &args->sigSz, + key, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + break; + } + #endif case ecc_dsa_sa_algo: { ecc_key* key = (ecc_key*)ssl->hsKey; @@ -32513,23 +35632,46 @@ break; } #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + #endif /* WOLFSSL_SM2 */ case ecc_dsa_sa_algo: #ifdef WOLFSSL_CHECK_SIG_FAULTS { ecc_key* key = (ecc_key*)ssl->hsKey; - ret = EccVerify(ssl, - args->output + LENGTH_SZ + args->idx, - args->sigSz, - ssl->buffers.digest.buffer, - ssl->buffers.digest.length, - key, - #ifdef HAVE_PK_CALLBACKS - ssl->buffers.key - #else - NULL - #endif - ); + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->options.sigAlgo == sm2_sa_algo) { + ret = Sm2wSm3Verify(ssl, + TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ, + args->output + LENGTH_SZ + args->idx, + args->sigSz, + ssl->buffers.sig.buffer, + ssl->buffers.sig.length, + key, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } + else + #endif /* WOLFSSL_SM2 */ + { + ret = EccVerify(ssl, + args->output + LENGTH_SZ + args->idx, + args->sigSz, + ssl->buffers.digest.buffer, + ssl->buffers.digest.length, + key, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } if (ret != 0) { WOLFSSL_MSG( "Failed to verify ECC signature"); @@ -32659,6 +35801,16 @@ exit_sske: + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + if (ret == 0) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + &ssl->buffers.keyMask); + } + else { + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + } + #endif + WOLFSSL_LEAVE("SendServerKeyExchange", ret); WOLFSSL_END(WC_FUNC_SERVER_KEY_EXCHANGE_SEND); @@ -32696,30 +35848,6 @@ return ret; } -#if defined(HAVE_SERVER_RENEGOTIATION_INFO) || defined(HAVE_FALLBACK_SCSV) || \ - defined(OPENSSL_ALL) - - /* search suites for specific one, idx on success, negative on error */ - static int FindSuite(Suites* suites, byte first, byte second) - { - int i; - - if (suites == NULL || suites->suiteSz == 0) { - WOLFSSL_MSG("Suites pointer error or suiteSz 0"); - return SUITES_ERROR; - } - - for (i = 0; i < suites->suiteSz-1; i += SUITE_LEN) { - if (suites->suites[i] == first && - suites->suites[i+1] == second ) - return i; - } - - return MATCH_SUITE_ERROR; - } - -#endif - #endif /* !WOLFSSL_NO_TLS12 */ /* Make sure server cert/key are valid for this suite, true on success @@ -32826,26 +35954,36 @@ ssl->options.side == WOLFSSL_SERVER_END) { #ifdef HAVE_SUPPORTED_CURVES byte searched = 0; - int ret = TLSX_KeyShare_Choose(ssl, extensions, &cs->clientKSE, - &searched); + int ret = TLSX_KeyShare_Choose(ssl, extensions, first, second, + &cs->clientKSE, &searched); - if (ret == MEMORY_E) { + if (ret == WC_NO_ERR_TRACE(MEMORY_E)) { WOLFSSL_MSG("TLSX_KeyShare_Choose() failed in " "VerifyServerSuite() with MEMORY_E"); return 0; } - if (cs->clientKSE == NULL && searched) + if (cs->clientKSE == NULL && searched) { + #ifdef WOLFSSL_SEND_HRR_COOKIE + /* If the CH contains a cookie then we need to send an alert to + * start from scratch. */ + if (TLSX_Find(extensions, TLSX_COOKIE) != NULL) + return INVALID_PARAMETER; + #endif cs->doHelloRetry = 1; + } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif if (!cs->doHelloRetry && ret != 0) return 0; /* not found */ #endif /* HAVE_SUPPORTED_CURVES */ } - else if (first == TLS13_BYTE || (first == ECC_BYTE && - (second == TLS_SHA256_SHA256 || second == TLS_SHA384_SHA384))) { + else if ((first == TLS13_BYTE) || ((first == ECC_BYTE) && + ((second == TLS_SHA256_SHA256) || + (second == TLS_SHA384_SHA384))) || + ((first == CIPHER_BYTE) && ((second == TLS_SM4_GCM_SM3) || + (second == TLS_SM4_CCM_SM3)))) { /* Can't negotiate TLS 1.3 cipher suites with lower protocol * version. */ return 0; @@ -32901,7 +36039,7 @@ for (i = 0; i < suites->suiteSz; i += 2) { for (j = 0; j < peerSuites->suiteSz; j += 2) { ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions); - if (ret != MATCH_SUITE_ERROR) + if (ret != WC_NO_ERR_TRACE(MATCH_SUITE_ERROR)) return ret; } } @@ -32911,7 +36049,7 @@ for (j = 0; j < peerSuites->suiteSz; j += 2) { for (i = 0; i < suites->suiteSz; i += 2) { ret = CompareSuites(ssl, suites, peerSuites, i, j, cs, extensions); - if (ret != MATCH_SUITE_ERROR) + if (ret != WC_NO_ERR_TRACE(MATCH_SUITE_ERROR)) return ret; } } @@ -32950,12 +36088,15 @@ if (ret != 0) return ret; ret = PickHashSigAlgo(ssl, peerSuites->hashSigAlgo, - peerSuites->hashSigAlgoSz); + peerSuites->hashSigAlgoSz, 1); if (ret != 0) return ret; #if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES) if (cs.doHelloRetry) { + /* Make sure we don't send HRR twice */ + if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) + return INVALID_PARAMETER; ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE; return TLSX_KeyShare_SetSupported(ssl, &ssl->extensions); } @@ -33003,7 +36144,7 @@ #ifndef NO_SHA wc_ShaUpdate(&ssl->hsHashes->hashSha, input + idx, sz); #endif -#endif +#endif /* !NO_OLD_TLS */ #ifndef NO_SHA256 if (IsAtLeastTLSv1_2(ssl)) { int shaRet = wc_Sha256Update(&ssl->hsHashes->hashSha256, @@ -33071,7 +36212,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, - ssl->options.haveDilithiumSig, ssl->options.haveAnon, + ssl->options.haveDilithiumSig, ssl->options.useAnon, TRUE, ssl->options.side); } @@ -33195,19 +36336,55 @@ * session ticket validation check in TLS1.2 and below, define * WOLFSSL_NO_TICKET_EXPIRE. */ - int HandleTlsResumption(WOLFSSL* ssl, int bogusID, Suites* clSuites) + int HandleTlsResumption(WOLFSSL* ssl, Suites* clSuites) { int ret = 0; WOLFSSL_SESSION* session; - (void)bogusID; + +#ifdef HAVE_SECRET_CALLBACK + if (ssl->sessionSecretCb != NULL +#ifdef HAVE_SESSION_TICKET + && ssl->session->ticketLen > 0 +#endif + ) { + int secretSz = SECRET_LEN; + WOLFSSL_MSG("Calling session secret callback"); + ret = wc_RNG_GenerateBlock(ssl->rng, ssl->arrays->serverRandom, + RAN_LEN); + if (ret == 0) { + ret = ssl->sessionSecretCb(ssl, ssl->arrays->masterSecret, + &secretSz, ssl->sessionSecretCtx); + if (secretSz != SECRET_LEN) + ret = SESSION_SECRET_CB_E; + } + if (ret == 0) + ret = MatchSuite(ssl, clSuites); + if (ret == 0) { + #ifdef NO_OLD_TLS + ret = DeriveTlsKeys(ssl); + #else + #ifndef NO_TLS + if (ssl->options.tls) + ret = DeriveTlsKeys(ssl); + #endif + if (!ssl->options.tls) + ret = DeriveKeys(ssl); + #endif + /* SERVER: peer auth based on session secret. */ + ssl->options.peerAuthGood = (ret == 0); + ssl->options.clientState = CLIENT_KEYEXCHANGE_COMPLETE; + } + if (ret != 0) + WOLFSSL_ERROR_VERBOSE(ret); + WOLFSSL_LEAVE("HandleTlsResumption", ret); + return ret; + } +#endif /* HAVE_SECRET_CALLBACK */ + #ifdef HAVE_SESSION_TICKET if (ssl->options.useTicket == 1) { session = ssl->session; } - else if (bogusID == 1 && ssl->options.rejectTicket == 0) { - WOLFSSL_MSG("Bogus session ID without session ticket"); - return BUFFER_ERROR; - } else #endif { @@ -33218,14 +36395,13 @@ ssl->options.resuming = 0; return ret; } -#if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TICKET_EXPIRE) && \ - !defined(NO_ASN_TIME) +#if !defined(WOLFSSL_NO_TICKET_EXPIRE) && !defined(NO_ASN_TIME) /* check if the ticket is valid */ if (LowResTimer() > session->bornOn + ssl->timeout) { - WOLFSSL_MSG("Expired session ticket, fall back to full handshake."); + WOLFSSL_MSG("Expired session, fall back to full handshake."); ssl->options.resuming = 0; } -#endif /* HAVE_SESSION_TICKET && !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */ +#endif /* !WOLFSSL_NO_TICKET_EXPIRE && !NO_ASN_TIME */ else if (session->haveEMS != ssl->options.haveEMS) { /* RFC 7627, 5.3, server-side */ @@ -33275,7 +36451,7 @@ ret = SetCipherSpecs(ssl); if (ret == 0) { ret = PickHashSigAlgo(ssl, clSuites->hashSigAlgo, - clSuites->hashSigAlgoSz); + clSuites->hashSigAlgoSz, 0); } } else if (ret == 0) { @@ -33316,7 +36492,6 @@ word32 helloSz) { byte b; - byte bogusID = 0; /* flag for a bogus session id */ ProtocolVersion pv; #ifdef WOLFSSL_SMALL_STACK Suites* clSuites = NULL; @@ -33340,9 +36515,11 @@ #ifdef WOLFSSL_DTLS /* Update the ssl->options.dtlsStateful setting `if` statement in * wolfSSL_accept when changing this one. */ - if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl)) { + if (IsDtlsNotSctpMode(ssl) && IsDtlsNotSrtpMode(ssl) && !IsSCR(ssl) && + !ssl->options.dtlsStateful) { DtlsSetSeqNumForReply(ssl); - ret = DoClientHelloStateless(ssl, input, inOutIdx, helloSz); + ret = DoClientHelloStateless(ssl, input + *inOutIdx, helloSz, 0, + NULL); if (ret != 0 || !ssl->options.dtlsStateful) { int alertType = TranslateErrorToAlert(ret); if (alertType != invalid_alert) { @@ -33350,7 +36527,7 @@ /* propagate socket errors to avoid re-calling send alert */ err = SendAlert(ssl, alert_fatal, alertType); - if (err == SOCKET_ERROR_E) + if (err == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) ret = SOCKET_ERROR_E; } *inOutIdx += helloSz; @@ -33359,10 +36536,22 @@ ret = 0; return ret; } + if (ssl->chGoodCb != NULL) { + int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx); + if (cbret < 0) { + ssl->error = cbret; + WOLFSSL_MSG("ClientHello Good Cb don't continue error"); + return WOLFSSL_FATAL_ERROR; + } + } } ssl->options.dtlsStateful = 1; #endif /* WOLFSSL_DTLS */ + /* Reset to sane value for SCR */ + ssl->options.resuming = 0; + ssl->arrays->sessionIDSz = 0; + /* protocol version, random and session id length check */ if (OPAQUE16_LEN + RAN_LEN + OPAQUE8_LEN > helloSz) return BUFFER_ERROR; @@ -33455,7 +36644,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, - ssl->options.haveDilithiumSig, ssl->options.haveAnon, + ssl->options.haveDilithiumSig, ssl->options.useAnon, TRUE, ssl->options.side); } @@ -33498,6 +36687,9 @@ WOLFSSL_OP_NO_SSLv3) { WOLFSSL_MSG("\tError, option set to not allow SSLv3"); ret = VERSION_ERROR; +#ifdef WOLFSSL_EXTRA_ALERTS + SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version); +#endif goto out; } @@ -33530,7 +36722,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, - ssl->options.haveDilithiumSig, ssl->options.haveAnon, + ssl->options.haveDilithiumSig, ssl->options.useAnon, TRUE, ssl->options.side); } } @@ -33551,31 +36743,26 @@ /* session id */ b = input[i++]; - -#ifdef HAVE_SESSION_TICKET - if (b > 0 && b < ID_LEN) { - bogusID = 1; - WOLFSSL_MSG("Client sent bogus session id, let's allow for echo"); + if (b > ID_LEN) { + WOLFSSL_MSG("Invalid session ID size"); + ret = BUFFER_ERROR; /* session ID greater than 32 bytes long */ + goto out; } -#endif - - if (b == ID_LEN || bogusID) { + else if (b > 0 && !IsSCR(ssl)) { if ((i - begin) + b > helloSz) { ret = BUFFER_ERROR; goto out; } + /* Always save session ID in case we want to echo it. */ XMEMCPY(ssl->arrays->sessionID, input + i, b); ssl->arrays->sessionIDSz = b; - i += b; - ssl->options.resuming = 1; /* client wants to resume */ + + if (b == ID_LEN) + ssl->options.resuming = 1; /* client wants to resume */ WOLFSSL_MSG("Client wants to resume session"); } - else if (b) { - WOLFSSL_MSG("Invalid session ID size"); - ret = BUFFER_ERROR; /* session ID nor 0 neither 32 bytes long */ - goto out; - } + i += b; #ifdef WOLFSSL_DTLS /* cookie */ @@ -33648,8 +36835,12 @@ /* check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV suite */ ret = TLSX_AddEmptyRenegotiationInfo(&ssl->extensions, ssl->heap); - if (ret != WOLFSSL_SUCCESS) + if (ret != WOLFSSL_SUCCESS) { + ret = SECURE_RENEGOTIATION_E; goto out; + } else { + ret = 0; + } extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO); if (extension) { @@ -33853,8 +37044,9 @@ ssl->options.haveSessionId = 1; /* ProcessOld uses same resume code */ + WOLFSSL_MSG_EX("ssl->options.resuming %d", ssl->options.resuming); if (ssl->options.resuming) { - ret = HandleTlsResumption(ssl, bogusID, clSuites); + ret = HandleTlsResumption(ssl, clSuites); if (ret != 0) goto out; @@ -33890,6 +37082,13 @@ #endif #ifdef OPENSSL_EXTRA + ssl->clSuites = clSuites; /* cppcheck-suppress autoVariables + * + * (suppress warning that ssl, a persistent + * non-local allocation, has its ->clSuites + * set to clSuites, a local stack allocation. + * we clear this assignment before returning.) + */ /* Give user last chance to provide a cert for cipher selection */ if (ret == 0 && ssl->ctx->certSetupCb != NULL) ret = CertSetupCbWrapper(ssl); @@ -33913,7 +37112,9 @@ #endif out: - +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) + ssl->clSuites = NULL; +#endif #ifdef WOLFSSL_SMALL_STACK if (clSuites != NULL) XFREE(clSuites, ssl->heap, DYNAMIC_TYPE_SUITES); @@ -33939,8 +37140,6 @@ word32 sigSz; word32 idx; word32 begin; - byte hashAlgo; - byte sigAlgo; } DcvArgs; static void FreeDcvArgs(WOLFSSL* ssl, void* pArgs) @@ -33977,7 +37176,7 @@ args = (DcvArgs*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_dcv; @@ -33989,8 +37188,8 @@ ret = 0; ssl->options.asyncState = TLS_ASYNC_BEGIN; XMEMSET(args, 0, sizeof(DcvArgs)); - args->hashAlgo = sha_mac; - args->sigAlgo = anonymous_sa_algo; + ssl->options.peerHashAlgo = sha_mac; + ssl->options.peerSigAlgo = anonymous_sa_algo; args->idx = *inOutIdx; args->begin = *inOutIdx; #ifdef WOLFSSL_ASYNC_CRYPT @@ -34021,25 +37220,34 @@ ERROR_OUT(BUFFER_ERROR, exit_dcv); } - DecodeSigAlg(&input[args->idx], &args->hashAlgo, - &args->sigAlgo); + DecodeSigAlg(&input[args->idx], &ssl->options.peerHashAlgo, + &ssl->options.peerSigAlgo); args->idx += 2; } #ifndef NO_RSA else if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) - args->sigAlgo = rsa_sa_algo; + ssl->options.peerSigAlgo = rsa_sa_algo; #endif #ifdef HAVE_ECC - else if (ssl->peerEccDsaKeyPresent) - args->sigAlgo = ecc_dsa_sa_algo; + else if (ssl->peerEccDsaKeyPresent) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->peerEccDsaKey->dp->id == ECC_SM2P256V1) { + ssl->options.peerSigAlgo = sm2_sa_algo; + } + else + #endif + { + ssl->options.peerSigAlgo = ecc_dsa_sa_algo; + } + } #endif #if defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH) else if (ssl->peerEd25519KeyPresent) - args->sigAlgo = ed25519_sa_algo; + ssl->options.peerSigAlgo = ed25519_sa_algo; #endif /* HAVE_ED25519 && !NO_ED25519_CLIENT_AUTH */ #if defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH) else if (ssl->peerEd448KeyPresent) - args->sigAlgo = ed448_sa_algo; + ssl->options.peerSigAlgo = ed448_sa_algo; #endif /* HAVE_ED448 && !NO_ED448_CLIENT_AUTH */ if ((args->idx - args->begin) + OPAQUE16_LEN > size) { @@ -34064,6 +37272,8 @@ SetDigest(ssl, sha_mac); #elif !defined(NO_SHA256) SetDigest(ssl, sha256_mac); + #elif defined(WOLFSSL_SM3) + SetDigest(ssl, sm3_mac); #elif defined(WOLFSSL_SHA384) SetDigest(ssl, sha384_mac); #elif defined(WOLFSSL_SHA512) @@ -34073,11 +37283,15 @@ #endif if (IsAtLeastTLSv1_2(ssl)) { - if (args->sigAlgo != ecc_dsa_sa_algo) { + if (ssl->options.peerSigAlgo != ecc_dsa_sa_algo + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + && ssl->options.peerSigAlgo != sm2_sa_algo + #endif + ) { WOLFSSL_MSG("Oops, peer sent ECC key but not in verify"); } - SetDigest(ssl, args->hashAlgo); + SetDigest(ssl, ssl->options.peerHashAlgo); } } #endif /* HAVE_ECC */ @@ -34085,7 +37299,7 @@ if (ssl->peerEd25519KeyPresent) { WOLFSSL_MSG("Doing ED25519 peer cert verify"); if (IsAtLeastTLSv1_2(ssl) && - args->sigAlgo != ed25519_sa_algo) { + ssl->options.peerSigAlgo != ed25519_sa_algo) { WOLFSSL_MSG( "Oops, peer sent ED25519 key but not in verify"); } @@ -34095,7 +37309,7 @@ if (ssl->peerEd448KeyPresent) { WOLFSSL_MSG("Doing ED448 peer cert verify"); if (IsAtLeastTLSv1_2(ssl) && - args->sigAlgo != ed448_sa_algo) { + ssl->options.peerSigAlgo != ed448_sa_algo) { WOLFSSL_MSG( "Oops, peer sent ED448 key but not in verify"); } @@ -34117,7 +37331,7 @@ input + args->idx, args->sz, &args->output, - args->sigAlgo, args->hashAlgo, + ssl->options.peerSigAlgo, ssl->options.peerHashAlgo, ssl->peerRsaKey, #ifdef HAVE_PK_CALLBACKS &ssl->buffers.peerRsaKey @@ -34126,10 +37340,10 @@ #endif ); if (ret >= 0) { - if (args->sigAlgo == rsa_sa_algo) - args->sendSz = ret; + if (ssl->options.peerSigAlgo == rsa_sa_algo) + args->sendSz = (word32)ret; else { - args->sigSz = ret; + args->sigSz = (word32)ret; args->sendSz = ssl->buffers.digest.length; } ret = 0; @@ -34140,16 +37354,35 @@ if (ssl->peerEccDsaKeyPresent) { WOLFSSL_MSG("Doing ECC peer cert verify"); - ret = EccVerify(ssl, - input + args->idx, args->sz, - ssl->buffers.digest.buffer, ssl->buffers.digest.length, - ssl->peerEccDsaKey, - #ifdef HAVE_PK_CALLBACKS - &ssl->buffers.peerEccDsaKey - #else - NULL - #endif - ); + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->options.peerSigAlgo == sm2_sa_algo) { + ret = Sm2wSm3Verify(ssl, + TLS12_SM2_SIG_ID, TLS12_SM2_SIG_ID_SZ, + input + args->idx, args->sz, + ssl->hsHashes->messages, ssl->hsHashes->prevLen, + ssl->peerEccDsaKey, + #ifdef HAVE_PK_CALLBACKS + &ssl->buffers.peerEccDsaKey + #else + NULL + #endif + ); + } + else + #endif + { + ret = EccVerify(ssl, + input + args->idx, args->sz, + ssl->buffers.digest.buffer, + ssl->buffers.digest.length, + ssl->peerEccDsaKey, + #ifdef HAVE_PK_CALLBACKS + &ssl->buffers.peerEccDsaKey + #else + NULL + #endif + ); + } /* SERVER: Data verified with certificate's public key. */ ssl->options.peerAuthGood = ssl->options.havePeerCert && (ret == 0); @@ -34196,7 +37429,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* handle async pending */ - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) goto exit_dcv; #endif @@ -34217,21 +37450,21 @@ if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) { if (IsAtLeastTLSv1_2(ssl)) { #ifdef WC_RSA_PSS - if (args->sigAlgo == rsa_pss_sa_algo) { - SetDigest(ssl, args->hashAlgo); + if (ssl->options.peerSigAlgo == rsa_pss_sa_algo) { + SetDigest(ssl, ssl->options.peerHashAlgo); #ifdef HAVE_SELFTEST ret = wc_RsaPSS_CheckPadding( ssl->buffers.digest.buffer, ssl->buffers.digest.length, args->output, args->sigSz, - HashAlgoToType(args->hashAlgo)); + HashAlgoToType(ssl->options.peerHashAlgo)); #else ret = wc_RsaPSS_CheckPadding_ex( ssl->buffers.digest.buffer, ssl->buffers.digest.length, args->output, args->sigSz, - HashAlgoToType(args->hashAlgo), -1, + HashAlgoToType(ssl->options.peerHashAlgo), -1, mp_count_bits(&ssl->peerRsaKey->n)); #endif if (ret != 0) { @@ -34252,17 +37485,17 @@ } #endif - if (args->sigAlgo != rsa_sa_algo) { + if (ssl->options.peerSigAlgo != rsa_sa_algo) { WOLFSSL_MSG("Oops, peer sent RSA key but not " "in verify"); } - SetDigest(ssl, args->hashAlgo); + SetDigest(ssl, ssl->options.peerHashAlgo); args->sigSz = wc_EncodeSignature(encodedSig, ssl->buffers.digest.buffer, ssl->buffers.digest.length, - TypeHash(args->hashAlgo)); + TypeHash(ssl->options.peerHashAlgo)); if (args->sendSz != args->sigSz || !args->output || XMEMCMP(args->output, encodedSig, @@ -34334,7 +37567,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* Handle async operation */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Mark message as not received so it can process again */ ssl->msgsReceived.got_certificate_verify = 0; @@ -34342,9 +37575,9 @@ } #endif /* WOLFSSL_ASYNC_CRYPT */ #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_ERROR) + if (ret == WC_NO_ERR_TRACE(BUFFER_ERROR)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == SIG_VERIFY_E) + else if (ret == WC_NO_ERR_TRACE(SIG_VERIFY_E)) SendAlert(ssl, alert_fatal, decrypt_error); else if (ret != 0) SendAlert(ssl, alert_fatal, bad_certificate); @@ -34426,7 +37659,7 @@ XMEMCPY(input, output + recordHeaderSz, inputSz); #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl) && - (ret = DtlsMsgPoolSave(ssl, input, inputSz, server_hello_done)) != 0) { + (ret = DtlsMsgPoolSave(ssl, input, (word32)inputSz, server_hello_done)) != 0) { XFREE(input, ssl->heap, DYNAMIC_TYPE_IN_BUFFER); return ret; } @@ -34440,7 +37673,7 @@ } else { #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, server_hello_done)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, server_hello_done)) != 0) return ret; } if (ssl->options.dtls) @@ -34478,7 +37711,61 @@ #ifdef HAVE_SESSION_TICKET - /* create a new session ticket, 0 on success */ +#ifdef WOLFSSL_TICKET_HAVE_ID + static void GetRealSessionID(WOLFSSL* ssl, const byte** id, byte* idSz) + { + if (ssl->session->haveAltSessionID) { + *id = ssl->session->altSessionID; + *idSz = ID_LEN; + } + else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) { + *id = ssl->arrays->sessionID; + *idSz = ssl->arrays->sessionIDSz; + } + else { + *id = ssl->session->sessionID; + *idSz = ssl->session->sessionIDSz; + } + } +#endif + + int SetupTicket(WOLFSSL* ssl) + { + int ret = 0; + + (void)ssl; + +#ifdef WOLFSSL_TLS13 + { + /* Client adds to ticket age to obfuscate. */ + byte ageAdd[AGEADD_LEN]; /* Obfuscation of age */ + ret = wc_RNG_GenerateBlock(ssl->rng, ageAdd, AGEADD_LEN); + if (ret != 0) + return ret; + ato32(ageAdd, &ssl->session->ticketAdd); + } +#endif + +#ifdef WOLFSSL_TICKET_HAVE_ID + { + const byte* id = NULL; + byte idSz = 0; + + GetRealSessionID(ssl, &id, &idSz); + if (idSz == 0) { + ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID, + ID_LEN); + if (ret != 0) + return ret; + ssl->session->haveAltSessionID = 1; + } + } +#endif + return ret; + } + + /* create a new session ticket, 0 on success + * Do any kind of setup in SetupTicket */ int CreateTicket(WOLFSSL* ssl) { InternalTicket* it; @@ -34503,7 +37790,7 @@ it = (InternalTicket*)et->enc_ticket; #ifdef WOLFSSL_ASYNC_CRYPT - if (ssl->error != WC_PENDING_E) + if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { XMEMSET(et, 0, sizeof(*et)); @@ -34521,6 +37808,11 @@ #endif if (!ssl->options.tls1_3) { + if (ssl->arrays == NULL) { + WOLFSSL_MSG("CreateTicket called with null arrays"); + ret = BAD_FUNC_ARG; + goto error; + } XMEMCPY(it->msecret, ssl->arrays->masterSecret, SECRET_LEN); #ifndef NO_ASN_TIME c32toa(LowResTimer(), it->timestamp); @@ -34539,14 +37831,7 @@ goto error; } - /* Client adds to ticket age to obfuscate. */ - ret = wc_RNG_GenerateBlock(ssl->rng, it->ageAdd, - sizeof(it->ageAdd)); - if (ret != 0) { - ret = BAD_TICKET_ENCRYPT; - goto error; - } - ato32(it->ageAdd, &ssl->session->ticketAdd); + c32toa(ssl->session->ticketAdd, it->ageAdd); c16toa(ssl->session->namedGroup, it->namedGroup); #ifdef WOLFSSL_32BIT_MILLI_TIME c32toa(now, it->timestamp); @@ -34567,31 +37852,16 @@ #endif } +#ifdef OPENSSL_EXTRA + it->sessionCtxSz = ssl->sessionCtxSz; + XMEMCPY(it->sessionCtx, ssl->sessionCtx, ID_LEN); +#endif + #ifdef WOLFSSL_TICKET_HAVE_ID { const byte* id = NULL; byte idSz = 0; - if (ssl->session->haveAltSessionID) { - id = ssl->session->altSessionID; - idSz = ID_LEN; - } - else if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) { - id = ssl->arrays->sessionID; - idSz = ssl->arrays->sessionIDSz; - } - else { - id = ssl->session->sessionID; - idSz = ssl->session->sessionIDSz; - } - if (idSz == 0) { - ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID, - ID_LEN); - if (ret != 0) - goto error; - ssl->session->haveAltSessionID = 1; - id = ssl->session->altSessionID; - idSz = ID_LEN; - } + GetRealSessionID(ssl, &id, &idSz); /* make sure idSz is not larger than ID_LEN */ if (idSz > ID_LEN) idSz = ID_LEN; @@ -34619,7 +37889,7 @@ if (error == 0) { ret = ssl->ctx->ticketEncCb(ssl, et->key_name, et->iv, et->mac, 1, et->enc_ticket, sizeof(InternalTicket), &encLen, - ssl->ctx->ticketEncCtx); + SSL_TICKET_CTX(ssl)); } else { ret = WOLFSSL_TICKET_RET_FATAL; @@ -34627,7 +37897,7 @@ } if (ret != WOLFSSL_TICKET_RET_OK) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -34744,11 +38014,11 @@ ret = ssl->ctx->ticketEncCb((WOLFSSL*)ssl, et->key_name, et->iv, et->enc_ticket + inLen, 0, et->enc_ticket, inLen, &outLen, - ssl->ctx->ticketEncCtx); + SSL_TICKET_CTX(ssl)); } if (ret != WOLFSSL_TICKET_RET_OK) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -34867,6 +38137,13 @@ if (!FindSuiteSSL(ssl, psk->it->suite)) return -1; #endif +#ifdef OPENSSL_EXTRA + if (ssl->sessionCtxSz > 0 && + (psk->it->sessionCtxSz != ssl->sessionCtxSz || + XMEMCMP(psk->it->sessionCtx, ssl->sessionCtx, + ssl->sessionCtxSz) != 0)) + return -1; +#endif return 0; } #endif /* WOLFSSL_SLT13 */ @@ -34999,6 +38276,10 @@ else XMEMCPY(it->id, sess->sessionID, ID_LEN); #endif +#ifdef OPENSSL_EXTRA + it->sessionCtxSz = sess->sessionCtxSz; + XMEMCPY(it->sessionCtx, sess->sessionCtx, sess->sessionCtxSz); +#endif } @@ -35023,7 +38304,7 @@ #endif if (sess == NULL) { ret = TlsSessionCacheGetAndRdLock(id, &sess, &freeCtx->row, - ssl->options.side); + (byte)ssl->options.side); if (ret != 0) sess = NULL; } @@ -35104,6 +38385,7 @@ break; default: psk->decryptRet = PSK_DECRYPT_FAIL; + WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet); return decryptRet; } #ifdef WOLFSSL_CHECK_MEM_ZERO @@ -35119,8 +38401,10 @@ #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(psk->it, sizeof(InternalTicket)); #endif + WOLFSSL_LEAVE("DoClientTicket_ex", ret); return ret; } + WOLFSSL_LEAVE("DoClientTicket_ex", decryptRet); return decryptRet; } #endif /* WOLFSL_TLS13 */ @@ -35130,7 +38414,7 @@ { int decryptRet = WOLFSSL_TICKET_RET_REJECT; int ret; - InternalTicket* it; + InternalTicket* it = NULL; #ifdef WOLFSSL_TLS13 InternalTicket staticIt; const WOLFSSL_SESSION* sess = NULL; @@ -35142,6 +38426,22 @@ WOLFSSL_START(WC_FUNC_TICKET_DO); WOLFSSL_ENTER("DoClientTicket"); +#ifdef HAVE_SECRET_CALLBACK + if (ssl->ticketParseCb != NULL) { + decryptRet = WOLFSSL_TICKET_RET_OK; + if (!ssl->ticketParseCb(ssl, input, len, ssl->ticketParseCtx)) { + /* Failure kills the connection */ + decryptRet = WOLFSSL_TICKET_RET_FATAL; + } + else { + if (wolfSSL_set_SessionTicket(ssl, input, len) != + WOLFSSL_SUCCESS) + decryptRet = WOLFSSL_TICKET_RET_REJECT; + } + goto cleanup; + } + else +#endif #ifdef WOLFSSL_TLS13 if (len == ID_LEN && IsAtLeastTLSv1_3(ssl->version)) { /* This is a stateful ticket. We can be sure about this because @@ -35156,7 +38456,11 @@ } else #endif + if (len >= sizeof(*it)) decryptRet = DoDecryptTicket(ssl, input, len, &it); + else + WOLFSSL_MSG("Ticket is smaller than InternalTicket. Rejecting."); + if (decryptRet != WOLFSSL_TICKET_RET_OK && decryptRet != WOLFSSL_TICKET_RET_CREATE) { @@ -35223,13 +38527,16 @@ WOLFSSL_ENTER("SendTicket"); if (ssl->options.createTicket) { + ret = SetupTicket(ssl); + if (ret != 0) + return ret; ret = CreateTicket(ssl); if (ret != 0) return ret; } length += ssl->session->ticketLen; - sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ; + sendSz = (int)length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ; if (!ssl->options.dtls) { if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) @@ -35271,7 +38578,7 @@ if (IsEncryptionOn(ssl, 1) && ssl->options.handShakeDone) { byte* input; - int inputSz = idx; /* build msg adds rec hdr */ + int inputSz = (int)idx; /* build msg adds rec hdr */ int recordHeaderSz = RECORD_HEADER_SZ; if (ssl->options.dtls) @@ -35292,7 +38599,7 @@ else { #ifdef WOLFSSL_DTLS if (ssl->options.dtls) { - if ((ret = DtlsMsgPoolSave(ssl, output, sendSz, session_ticket)) != 0) + if ((ret = DtlsMsgPoolSave(ssl, output, (word32)sendSz, session_ticket)) != 0) return ret; DtlsSEQIncrement(ssl, CUR_ORDER); @@ -35525,6 +38832,75 @@ return ret; } +#elif defined(WOLFSSL_SM4_GCM) +/* Ticket encryption/decryption implementation. + * + * @param [in] key Key for encryption/decryption. + * @param [in] keyLen Length of key in bytes. + * @param [in] iv IV/Nonce for encryption/decryption. + * @param [in] aad Additional authentication data. + * @param [in] aadSz Length of additional authentication data. + * @param [in] in Data to encrypt/decrypt. + * @param [in] inLen Length of encrypted data. + * @param [out] out Resulting data from encrypt/decrypt. + * @param [out] outLen Size of resulting data. + * @param [in] tag Authentication tag for encrypted data. + * @param [in] heap Dynamic memory allocation data hint. + * @param [in] enc 1 when encrypting, 0 when decrypting. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + * @return Other value when encryption/decryption fails. + */ +static int TicketEncDec(byte* key, int keyLen, byte* iv, byte* aad, int aadSz, + byte* in, int inLen, byte* out, int* outLen, byte* tag, + void* heap, int enc) +{ + int ret; +#ifdef WOLFSSL_SMALL_STACK + wc_Sm4* sm4; +#else + wc_Sm4 sm4[1]; +#endif + + (void)heap; + +#ifdef WOLFSSL_SMALL_STACK + sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, DYNAMIC_TYPE_TMP_BUFFER); + if (sm4 == NULL) + return MEMORY_E; +#endif + + if (enc) { + ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID); + if (ret == 0) { + ret = wc_Sm4GcmSetKey(sm4, key, keyLen); + } + if (ret == 0) { + ret = wc_Sm4GcmEncrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, aadSz); + } + wc_Sm4Free(sm4); + } + else { + ret = wc_Sm4Init(sm4, NULL, INVALID_DEVID); + if (ret == 0) { + ret = wc_Sm4GcmSetKey(sm4, key, keyLen); + } + if (ret == 0) { + ret = wc_Sm4GcmDecrypt(sm4, in, out, inLen, iv, GCM_NONCE_MID_SZ, + tag, SM$_BLOCK_SIZE, aad, aadSz); + } + wc_Sm4Free(sm4); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(sm4, heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + *outLen = inLen; + + return ret; +} #else #error "No encryption algorithm available for default ticket encryption." #endif @@ -35587,7 +38963,7 @@ /* Default Session Ticket encryption/decryption callback. * - * Use ChaCha20-Poly1305 or AES-GCM to encrypt/decrypt the ticket. + * Use ChaCha20-Poly1305, AES-GCM or SM4-GCM to encrypt/decrypt the ticket. * Two keys are used: * - When the first expires for encryption, then use the other. * - Don't encrypt with key if the ticket lifetime will go beyond expirary. @@ -35640,6 +39016,10 @@ WOLFSSL_ENTER("DefTicketEncCb"); + if ((!enc) && (inLen != sizeof(InternalTicket))) { + return BUFFER_E; + } + /* Check we have setup the RNG, name and primary key. */ if (keyCtx->expirary[0] == 0) { #ifndef SINGLE_THREADED @@ -35877,7 +39257,7 @@ ssl->keys.dtls_sequence_number_hi = ssl->keys.curSeq_hi; ssl->keys.dtls_sequence_number_lo = ssl->keys.curSeq_lo; } - AddHeaders(output, length, hello_verify_request, ssl); + AddHeaders(output, (word32)length, hello_verify_request, ssl); output[idx++] = DTLS_MAJOR; output[idx++] = DTLS_MINOR; @@ -35961,6 +39341,10 @@ WOLFSSL_START(WC_FUNC_CLIENT_KEY_EXCHANGE_DO); WOLFSSL_ENTER("DoClientKeyExchange"); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + #endif + #ifdef WOLFSSL_ASYNC_CRYPT if (ssl->async == NULL) { ssl->async = (struct WOLFSSL_ASYNC*) @@ -35972,7 +39356,7 @@ args = (DckeArgs*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_dcke; @@ -36116,7 +39500,7 @@ #ifndef NO_RSA case rsa_kea: { - word16 keySz; + word32 keySz; ssl->buffers.keyType = rsa_sa_algo; ret = DecodePrivateKey(ssl, &keySz); @@ -36193,31 +39577,35 @@ MAX_PSK_KEY_LEN); if (ssl->arrays->psk_keySz == 0 || - ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { - #if defined(WOLFSSL_EXTRA_ALERTS) || \ - defined(WOLFSSL_PSK_IDENTITY_ALERT) - SendAlert(ssl, alert_fatal, - unknown_psk_identity); - #endif + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { + #if defined(WOLFSSL_EXTRA_ALERTS) || \ + defined(WOLFSSL_PSK_IDENTITY_ALERT) + SendAlert(ssl, alert_fatal, + unknown_psk_identity); + #endif ERROR_OUT(PSK_KEY_ERROR, exit_dcke); } /* SERVER: Pre-shared Key for peer authentication. */ ssl->options.peerAuthGood = 1; /* make psk pre master secret */ - /* length of key + length 0s + length of key + key */ - c16toa((word16) ssl->arrays->psk_keySz, pms); - pms += OPAQUE16_LEN; - - XMEMSET(pms, 0, ssl->arrays->psk_keySz); - pms += ssl->arrays->psk_keySz; - - c16toa((word16) ssl->arrays->psk_keySz, pms); - pms += OPAQUE16_LEN; - - XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); - ssl->arrays->preMasterSz = - (ssl->arrays->psk_keySz * 2) + (OPAQUE16_LEN * 2); + if ((int)ssl->arrays->psk_keySz > 0) { + /* length of key + length 0s + length of key + key */ + c16toa((word16) ssl->arrays->psk_keySz, pms); + pms += OPAQUE16_LEN; + + XMEMSET(pms, 0, ssl->arrays->psk_keySz); + pms += ssl->arrays->psk_keySz; + + c16toa((word16) ssl->arrays->psk_keySz, pms); + pms += OPAQUE16_LEN; + + XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); + ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) + + (OPAQUE16_LEN * 2); + } + ssl->arrays->psk_keySz = 0; /* no further need */ break; } #endif /* !NO_PSK */ @@ -36232,7 +39620,7 @@ if (ssl->specs.static_ecdh && ssl->ecdhCurveOID != ECC_X25519_OID && ssl->ecdhCurveOID != ECC_X448_OID) { - word16 keySz; + word32 keySz; ssl->buffers.keyType = ecc_dsa_sa_algo; ret = DecodePrivateKey(ssl, &keySz); @@ -36282,9 +39670,9 @@ input + args->idx, args->length, EC25519_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, @@ -36339,9 +39727,9 @@ input + args->idx, args->length, EC448_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, @@ -36407,7 +39795,7 @@ ERROR_OUT(ECC_PEERKEY_ERROR, exit_dcke); } - ssl->arrays->preMasterSz = private_key->dp->size; + ssl->arrays->preMasterSz = (word32)private_key->dp->size; ssl->peerEccKeyPresent = 1; @@ -36584,9 +39972,9 @@ input + args->idx, args->length, EC25519_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, @@ -36643,9 +40031,9 @@ input + args->idx, args->length, EC448_LITTLE_ENDIAN)) != 0) { #ifdef WOLFSSL_EXTRA_ALERTS - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) SendAlert(ssl, alert_fatal, decode_error); - else if (ret == ECC_OUT_OF_RANGE_E) + else if (ret == WC_NO_ERR_TRACE(ECC_OUT_OF_RANGE_E)) SendAlert(ssl, alert_fatal, bad_record_mac); else { SendAlert(ssl, alert_fatal, @@ -36726,6 +40114,7 @@ case rsa_kea: { RsaKey* key = (RsaKey*)ssl->hsKey; + int lenErrMask; ret = RsaDec(ssl, input + args->idx, @@ -36745,13 +40134,15 @@ * RSA_BUFFER_E, RSA_PAD_E and RSA_PRIVATE_ERROR */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) goto exit_dcke; #endif - if (ret == BAD_FUNC_ARG) + if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) goto exit_dcke; - args->lastErr = ret - (SECRET_LEN - args->sigSz); + lenErrMask = 0 - (SECRET_LEN != args->sigSz); + args->lastErr = (ret & (~lenErrMask)) | + (RSA_PAD_E & lenErrMask); ret = 0; break; } /* rsa_kea */ @@ -36809,7 +40200,7 @@ WOLFSSL_SERVER_END ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { FreeKey(ssl, DYNAMIC_TYPE_ECC, @@ -36865,7 +40256,7 @@ WOLFSSL_SERVER_END ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { FreeKey(ssl, DYNAMIC_TYPE_CURVE25519, @@ -36886,7 +40277,7 @@ WOLFSSL_SERVER_END ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { FreeKey(ssl, DYNAMIC_TYPE_CURVE448, @@ -37029,24 +40420,27 @@ MAX_PSK_KEY_LEN); if (ssl->arrays->psk_keySz == 0 || - ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { - #if defined(WOLFSSL_EXTRA_ALERTS) || \ - defined(WOLFSSL_PSK_IDENTITY_ALERT) - SendAlert(ssl, alert_fatal, - unknown_psk_identity); - #endif + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { + #if defined(WOLFSSL_EXTRA_ALERTS) || \ + defined(WOLFSSL_PSK_IDENTITY_ALERT) + SendAlert(ssl, alert_fatal, + unknown_psk_identity); + #endif ERROR_OUT(PSK_KEY_ERROR, exit_dcke); } /* SERVER: Pre-shared Key for peer authentication. */ ssl->options.peerAuthGood = 1; - c16toa((word16) ssl->arrays->psk_keySz, pms); - pms += OPAQUE16_LEN; - - XMEMCPY(pms, ssl->arrays->psk_key, - ssl->arrays->psk_keySz); - ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + - OPAQUE16_LEN; + if ((int)ssl->arrays->psk_keySz > 0) { + c16toa((word16) ssl->arrays->psk_keySz, pms); + pms += OPAQUE16_LEN; + + XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); + ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN; + ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz); + } + ssl->arrays->psk_keySz = 0; /* no further need */ break; } #endif /* !NO_DH && !NO_PSK */ @@ -37072,18 +40466,21 @@ MAX_PSK_KEY_LEN); if (ssl->arrays->psk_keySz == 0 || - ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { ERROR_OUT(PSK_KEY_ERROR, exit_dcke); } /* SERVER: Pre-shared Key for peer authentication. */ ssl->options.peerAuthGood = 1; - - c16toa((word16) ssl->arrays->psk_keySz, pms); - pms += OPAQUE16_LEN; - - XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); - ssl->arrays->preMasterSz += - ssl->arrays->psk_keySz + OPAQUE16_LEN; + if ((int)ssl->arrays->psk_keySz > 0) { + c16toa((word16) ssl->arrays->psk_keySz, pms); + pms += OPAQUE16_LEN; + + XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz); + ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN; + ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz); + } + ssl->arrays->psk_keySz = 0; /* no further need */ break; } #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */ @@ -37142,11 +40539,21 @@ exit_dcke: + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + if (ret == 0) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + &ssl->buffers.keyMask); + } + else { + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + } + #endif + WOLFSSL_LEAVE("DoClientKeyExchange", ret); WOLFSSL_END(WC_FUNC_CLIENT_KEY_EXCHANGE_DO); #ifdef WOLFSSL_ASYNC_CRYPT /* Handle async operation */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Mark message as not received so it can process again */ ssl->msgsReceived.got_client_key_exchange = 0; @@ -37185,6 +40592,13 @@ int ad = 0; int sniRet = 0; int ret = 0; + + /* OpenSSL defaults alert to SSL_AD_UNRECOGNIZED_NAME, use this if + WOLFSSL_EXTRA_ALERTS is defined, indicating user is OK with + potential information disclosure from alerts. */ +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_EXTRA_ALERTS) + ad = SSL_AD_UNRECOGNIZED_NAME; +#endif /* Stunnel supports a custom sni callback to switch an SSL's ctx * when SNI is received. Call it now if exists */ if(ssl && ssl->ctx && ssl->ctx->sniRecvCb) { @@ -37231,22 +40645,32 @@ event = &asyncDev->event; ret = wolfAsync_EventPop(event, WOLF_EVENT_TYPE_ASYNC_WOLFSSL); - if (ret != WC_NOT_PENDING_E && ret != WC_PENDING_E) { - + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && + ret != WC_NO_ERR_TRACE(WC_PENDING_E)) { /* advance key share state if doesn't need called again */ if (state && (asyncDev->event.flags & WC_ASYNC_FLAG_CALL_AGAIN) == 0) { (*state)++; } - - /* clear event */ + /* clear event and async device */ XMEMSET(&asyncDev->event, 0, sizeof(WOLF_EVENT)); - - /* clear async dev */ ssl->asyncDev = NULL; } + /* for crypto or PK callback, if pending remove from queue */ + #if (defined(WOLF_CRYPTO_CB) || defined(HAVE_PK_CALLBACKS)) && \ + !defined(WOLFSSL_ASYNC_CRYPT_SW) && !defined(HAVE_INTEL_QA) && \ + !defined(HAVE_CAVIUM) + else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { + /* Allow the underlying crypto API to be called again to trigger the + * crypto or PK callback. The actual callback must be called, since + * the completion is not detected in the poll like Intel QAT or + * Nitrox */ + ret = wolfEventQueue_Remove(&ssl->ctx->event_queue, event); + + } + #endif } else { - ret = WC_NOT_PENDING_E; + ret = WC_NO_PENDING_E; } WOLFSSL_LEAVE("wolfSSL_AsyncPop", ret); @@ -37763,6 +41187,139 @@ #endif /* OPENSSL_ALL */ +#if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) + +/* + * Converts a DER formatted certificate to a SecCertificateRef + * + * @param derCert pointer to the DER formatted certificate + * @param derLen length of the DER formatted cert, in bytes + * + * @return The newly created SecCertificateRef. Must be freed by caller when + * no longer in use + */ +static SecCertificateRef ConvertToSecCertificateRef(const byte* derCert, + int derLen) +{ + CFDataRef derData = NULL; + SecCertificateRef secCert = NULL; + + WOLFSSL_ENTER("ConvertToSecCertificateRef"); + + /* Create a CFDataRef from the DER encoded certificate */ + derData = CFDataCreate(kCFAllocatorDefault, derCert, derLen); + if (!derData) { + WOLFSSL_MSG("Error: can't create CFDataRef object for DER cert"); + goto cleanup; + } + + /* Create a SecCertificateRef from the CFDataRef */ + secCert = SecCertificateCreateWithData(kCFAllocatorDefault, derData); + if (!secCert) { + WOLFSSL_MSG("Error: can't create SecCertificateRef from CFDataRef"); + goto cleanup; + } + +cleanup: + if (derData) { + CFRelease(derData); + } + + WOLFSSL_LEAVE("ConvertToSecCertificateRef", !!secCert); + + return secCert; +} + + +/* + * Validates a chain of certificates using the Apple system trust APIs + * + * @param certs pointer to the certificate chain to validate + * @param totalCerts the number of certificates in certs + * + * @return 1 if chain is valid and trusted + * @return 0 if chain is invalid or untrusted + * + * As of MacOS 14.0 we are still able to access system certificates and load + * them manually into wolfSSL. For other apple devices, apple has removed the + * ability to obtain certificates from the trust store, so we can't use + * wolfSSL's built-in certificate validation mechanisms anymore. We instead + * must call into the Security Framework APIs to authenticate peer certificates + */ +static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs, + int totalCerts) +{ + int i; + int ret; + OSStatus status; + CFMutableArrayRef certArray = NULL; + SecCertificateRef secCert = NULL; + SecTrustRef trust = NULL; + SecPolicyRef policy = NULL ; + + WOLFSSL_ENTER("DoAppleNativeCertValidation"); + + certArray = CFArrayCreateMutable(kCFAllocatorDefault, + totalCerts, + &kCFTypeArrayCallBacks); + if (!certArray) { + WOLFSSL_MSG("Error: can't allocate CFArray for certificates"); + ret = 0; + goto cleanup; + } + + for (i = 0; i < totalCerts; i++) { + secCert = ConvertToSecCertificateRef(certs[i].buffer, certs[i].length); + if (!secCert) { + WOLFSSL_MSG("Error: can't convert DER cert to SecCertificateRef"); + ret = 0; + goto cleanup; + } + else { + CFArrayAppendValue(certArray, secCert); + /* Release, since the array now holds the reference */ + CFRelease(secCert); + } + } + + /* Create trust object for SecCertifiate Ref */ + policy = SecPolicyCreateSSL(true, NULL); + status = SecTrustCreateWithCertificates(certArray, policy, &trust); + if (status != errSecSuccess) { + WOLFSSL_MSG_EX("Error creating trust object, " + "SecTrustCreateWithCertificates returned %d",status); + ret = 0; + goto cleanup; + } + + /* Evaluate the certificate's authenticity */ + if (SecTrustEvaluateWithError(trust, NULL) == 1) { + WOLFSSL_MSG("Cert chain is trusted"); + ret = 1; + } + else { + WOLFSSL_MSG("Cert chain trust evaluation failed" + "SecTrustEvaluateWithError returned 0"); + ret = 0; + } + + /* Cleanup */ +cleanup: + if (certArray) { + CFRelease(certArray); + } + if (trust) { + CFRelease(trust); + } + if (policy) { + CFRelease(policy); + } + + WOLFSSL_LEAVE("DoAppleNativeCertValidation", ret); + + return ret; +} +#endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */ #undef ERROR_OUT diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/keys.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/keys.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/keys.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/keys.c 2024-08-03 07:30:00.000000000 +0000 @@ -38,7 +38,7 @@ #endif #endif -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) #include #endif @@ -54,7 +54,7 @@ #ifndef NO_TLS ssl->options.tls = 1; #if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY) - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) ssl->hmac = TLS_hmac; #else @@ -77,7 +77,7 @@ #if defined(WOLFSSL_DTLS) if (ssl->options.dtls && ssl->version.major == DTLS_MAJOR) { #ifndef WOLFSSL_AEAD_ONLY - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) ssl->hmac = TLS_hmac; #else @@ -105,7 +105,7 @@ * @param cipherSuite [in] * @param specs [out] CipherSpecs * @param opts [in/out] Options can be NULL - * @return + * @return int (less than 0 on fail, 0 on success) */ int GetCipherSpec(word16 side, byte cipherSuite0, byte cipherSuite, CipherSpecs* specs, Options* opts) @@ -672,7 +672,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_16_AUTH_SZ; break; @@ -690,7 +690,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_8_AUTH_SZ; break; @@ -708,7 +708,7 @@ specs->static_ecdh = 0; specs->key_size = AES_256_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_8_AUTH_SZ; break; @@ -1019,6 +1019,42 @@ break; #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 + case TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 : + specs->bulk_cipher_algorithm = wolfssl_aria_gcm; + specs->cipher_type = aead; + specs->mac_algorithm = sha256_mac; + specs->kea = ecc_diffie_hellman_kea; + specs->sig_algo = ecc_dsa_sa_algo; + specs->hash_size = WC_SHA256_DIGEST_SIZE; + specs->pad_size = PAD_SHA; + specs->static_ecdh = 0; + specs->key_size = ARIA_128_KEY_SIZE; + specs->block_size = ARIA_BLOCK_SIZE; + specs->iv_size = AESGCM_IMP_IV_SZ; + specs->aead_mac_size = ARIA_GCM_AUTH_SZ; + + break; +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 + case TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 : + specs->bulk_cipher_algorithm = wolfssl_aria_gcm; + specs->cipher_type = aead; + specs->mac_algorithm = sha384_mac; + specs->kea = ecc_diffie_hellman_kea; + specs->sig_algo = ecc_dsa_sa_algo; + specs->hash_size = WC_SHA384_DIGEST_SIZE; + specs->pad_size = PAD_SHA; + specs->static_ecdh = 0; + specs->key_size = ARIA_256_KEY_SIZE; + specs->block_size = ARIA_BLOCK_SIZE; + specs->iv_size = AESGCM_IMP_IV_SZ; + specs->aead_mac_size = ARIA_GCM_AUTH_SZ; + + break; +#endif + #endif /* HAVE_ECC */ #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8 @@ -1033,7 +1069,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_8_AUTH_SZ; break; @@ -1051,7 +1087,7 @@ specs->static_ecdh = 0; specs->key_size = AES_256_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_8_AUTH_SZ; break; @@ -1069,7 +1105,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_8_AUTH_SZ; if (opts != NULL) @@ -1089,7 +1125,7 @@ specs->static_ecdh = 0; specs->key_size = AES_256_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_8_AUTH_SZ; if (opts != NULL) @@ -1109,7 +1145,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_16_AUTH_SZ; if (opts != NULL) @@ -1129,7 +1165,7 @@ specs->static_ecdh = 0; specs->key_size = AES_256_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_16_AUTH_SZ; if (opts != NULL) @@ -1149,7 +1185,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_16_AUTH_SZ; if (opts != NULL) @@ -1169,7 +1205,7 @@ specs->static_ecdh = 0; specs->key_size = AES_256_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_IMP_IV_SZ; + specs->iv_size = AESCCM_IMP_IV_SZ; specs->aead_mac_size = AES_CCM_16_AUTH_SZ; if (opts != NULL) @@ -1294,7 +1330,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_NONCE_SZ; + specs->iv_size = AESCCM_NONCE_SZ; specs->aead_mac_size = AES_CCM_16_AUTH_SZ; break; @@ -1312,7 +1348,7 @@ specs->static_ecdh = 0; specs->key_size = AES_128_KEY_SIZE; specs->block_size = AES_BLOCK_SIZE; - specs->iv_size = AESGCM_NONCE_SZ; + specs->iv_size = AESCCM_NONCE_SZ; specs->aead_mac_size = AES_CCM_8_AUTH_SZ; break; @@ -1354,13 +1390,114 @@ } } + if (cipherSuite0 == SM_BYTE) { + + switch (cipherSuite) { +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + case TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 : + specs->bulk_cipher_algorithm = wolfssl_sm4_cbc; + specs->cipher_type = block; + specs->mac_algorithm = sm3_mac; + specs->kea = ecc_diffie_hellman_kea; + specs->sig_algo = sm2_sa_algo; + specs->hash_size = WC_SM3_DIGEST_SIZE; + specs->pad_size = PAD_SHA; + specs->static_ecdh = 0; + specs->key_size = SM4_KEY_SIZE; + specs->iv_size = SM4_IV_SIZE; + specs->block_size = SM4_BLOCK_SIZE; + + break; +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + case TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 : + specs->bulk_cipher_algorithm = wolfssl_sm4_gcm; + specs->cipher_type = aead; + specs->mac_algorithm = sm3_mac; + specs->kea = ecc_diffie_hellman_kea; + specs->sig_algo = sm2_sa_algo; + specs->hash_size = WC_SM3_DIGEST_SIZE; + specs->pad_size = PAD_SHA; + specs->static_ecdh = 0; + specs->key_size = SM4_KEY_SIZE; + specs->block_size = SM4_BLOCK_SIZE; + specs->iv_size = GCM_IMP_IV_SZ; + specs->aead_mac_size = SM4_GCM_AUTH_SZ; + + break; +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + case TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 : + specs->bulk_cipher_algorithm = wolfssl_sm4_ccm; + specs->cipher_type = aead; + specs->mac_algorithm = sm3_mac; + specs->kea = ecc_diffie_hellman_kea; + specs->sig_algo = sm2_sa_algo; + specs->hash_size = WC_SM3_DIGEST_SIZE; + specs->pad_size = PAD_SHA; + specs->static_ecdh = 0; + specs->key_size = SM4_KEY_SIZE; + specs->block_size = SM4_BLOCK_SIZE; + specs->iv_size = CCM_IMP_IV_SZ; + specs->aead_mac_size = SM4_CCM_AUTH_SZ; + + break; +#endif + + default: + break; + } + } if (cipherSuite0 != ECC_BYTE && cipherSuite0 != ECDHE_PSK_BYTE && cipherSuite0 != CHACHA_BYTE && +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \ + (defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_GCM) || \ + defined(WOLFSSL_SM4_CCM)) + cipherSuite0 != SM_BYTE && +#endif cipherSuite0 != TLS13_BYTE) { /* normal suites */ switch (cipherSuite) { +#ifdef BUILD_TLS_SM4_GCM_SM3 + case TLS_SM4_GCM_SM3 : + specs->bulk_cipher_algorithm = wolfssl_sm4_gcm; + specs->cipher_type = aead; + specs->mac_algorithm = sm3_mac; + specs->kea = 0; + specs->sig_algo = 0; + specs->hash_size = WC_SM3_DIGEST_SIZE; + specs->pad_size = PAD_SHA; + specs->static_ecdh = 0; + specs->key_size = SM4_KEY_SIZE; + specs->block_size = SM4_BLOCK_SIZE; + specs->iv_size = SM4_GCM_NONCE_SZ; + specs->aead_mac_size = SM4_GCM_AUTH_SZ; + + break; +#endif + +#ifdef BUILD_TLS_SM4_CCM_SM3 + case TLS_SM4_CCM_SM3 : + specs->bulk_cipher_algorithm = wolfssl_sm4_ccm; + specs->cipher_type = aead; + specs->mac_algorithm = sm3_mac; + specs->kea = 0; + specs->sig_algo = 0; + specs->hash_size = WC_SM3_DIGEST_SIZE; + specs->pad_size = PAD_SHA; + specs->static_ecdh = 0; + specs->key_size = SM4_KEY_SIZE; + specs->block_size = SM4_BLOCK_SIZE; + specs->iv_size = SM4_CCM_NONCE_SZ; + specs->aead_mac_size = SM4_CCM_AUTH_SZ; + + break; +#endif + #ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA case SSL_RSA_WITH_RC4_128_SHA : specs->bulk_cipher_algorithm = wolfssl_rc4; @@ -2728,6 +2865,106 @@ } #endif /* HAVE_AESCCM */ +#ifdef HAVE_ARIA + /* check that buffer sizes are sufficient */ + #if (MAX_WRITE_IV_SZ < 16) /* AES_IV_SIZE */ + #error MAX_WRITE_IV_SZ too small for AES + #endif + + if (specs->bulk_cipher_algorithm == wolfssl_aria_gcm) { + int ret = 0; + MC_ALGID algo; + + switch(specs->key_size) { + case ARIA_128_KEY_SIZE: + algo = MC_ALGID_ARIA_128BITKEY; + break; + case ARIA_192_KEY_SIZE: + algo = MC_ALGID_ARIA_192BITKEY; + break; + case ARIA_256_KEY_SIZE: + algo = MC_ALGID_ARIA_256BITKEY; + break; + default: + return WOLFSSL_NOT_IMPLEMENTED; /* This should never happen */ + } + + if (enc) { + if (enc->aria == NULL) { + enc->aria = (wc_Aria*)XMALLOC(sizeof(wc_Aria), heap, DYNAMIC_TYPE_CIPHER); + if (enc->aria == NULL) + return MEMORY_E; + } else { + wc_AriaFreeCrypt(enc->aria); + } + + XMEMSET(enc->aria, 0, sizeof(wc_Aria)); + if (wc_AriaInitCrypt(enc->aria, algo) != 0) { + WOLFSSL_MSG("AriaInit failed in SetKeys"); + return ASYNC_INIT_E; + } + } + if (dec) { + if (dec->aria == NULL) { + dec->aria = (wc_Aria*)XMALLOC(sizeof(wc_Aria), heap, DYNAMIC_TYPE_CIPHER); + if (dec->aria == NULL) + return MEMORY_E; + } else { + wc_AriaFreeCrypt(dec->aria); + } + + XMEMSET(dec->aria, 0, sizeof(wc_Aria)); + if (wc_AriaInitCrypt(dec->aria, algo) != 0) { + WOLFSSL_MSG("AriaInit failed in SetKeys"); + return ASYNC_INIT_E; + } + } + + if (side == WOLFSSL_CLIENT_END) { + if (enc) { + ret = wc_AriaSetKey(enc->aria, keys->client_write_key); + if (ret != 0) return ret; + XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV, + AEAD_MAX_IMP_SZ); + if (!tls13) { + ret = wc_AriaGcmSetIV(enc->aria, AESGCM_NONCE_SZ, + keys->client_write_IV, AESGCM_IMP_IV_SZ, rng); + if (ret != 0) return ret; + } + } + if (dec) { + ret = wc_AriaSetKey(dec->aria, keys->server_write_key); + if (ret != 0) return ret; + XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV, + AEAD_MAX_IMP_SZ); + } + } + else { + if (enc) { + ret = wc_AriaSetKey(enc->aria, keys->server_write_key); + if (ret != 0) return ret; + XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV, + AEAD_MAX_IMP_SZ); + if (!tls13) { + ret = wc_AriaGcmSetIV(enc->aria, AESGCM_NONCE_SZ, + keys->server_write_IV, AESGCM_IMP_IV_SZ, rng); + if (ret != 0) return ret; + } + } + if (dec) { + ret = wc_AriaSetKey(dec->aria, keys->client_write_key); + if (ret != 0) return ret; + XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV, + AEAD_MAX_IMP_SZ); + } + } + if (enc) + enc->setup = 1; + if (dec) + dec->setup = 1; + } +#endif /* HAVE_ARIA */ + #ifdef HAVE_CAMELLIA /* check that buffer sizes are sufficient */ #if (MAX_WRITE_IV_SZ < 16) /* CAMELLIA_IV_SIZE */ @@ -2780,6 +3017,284 @@ } #endif /* HAVE_CAMELLIA */ +#ifdef WOLFSSL_SM4_CBC + /* check that buffer sizes are sufficient */ + #if (MAX_WRITE_IV_SZ < 16) /* AES_IV_SIZE */ + #error MAX_WRITE_IV_SZ too small for SM4_CBC + #endif + + if (specs->bulk_cipher_algorithm == wolfssl_sm4_cbc) { + int sm4Ret = 0; + + if (enc) { + if (enc->sm4 == NULL) { + enc->sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, + DYNAMIC_TYPE_CIPHER); + if (enc->sm4 == NULL) + return MEMORY_E; + } + else { + wc_Sm4Free(enc->sm4); + } + + XMEMSET(enc->sm4, 0, sizeof(wc_Sm4)); + } + if (dec) { + if (dec->sm4 == NULL) { + dec->sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, + DYNAMIC_TYPE_CIPHER); + if (dec->sm4 == NULL) + return MEMORY_E; + } + else { + wc_Sm4Free(dec->sm4); + } + + XMEMSET(dec->sm4, 0, sizeof(wc_Sm4)); + } + if (enc) { + if (wc_Sm4Init(enc->sm4, heap, devId) != 0) { + WOLFSSL_MSG("Sm4Init failed in SetKeys"); + return ASYNC_INIT_E; + } + } + if (dec) { + if (wc_Sm4Init(dec->sm4, heap, devId) != 0) { + WOLFSSL_MSG("Sm4Init failed in SetKeys"); + return ASYNC_INIT_E; + } + } + + if (side == WOLFSSL_CLIENT_END) { + if (enc) { + sm4Ret = wc_Sm4SetKey(enc->sm4, keys->client_write_key, + specs->key_size); + if (sm4Ret != 0) return sm4Ret; + sm4Ret = wc_Sm4SetIV(enc->sm4, keys->client_write_IV); + if (sm4Ret != 0) return sm4Ret; + } + if (dec) { + sm4Ret = wc_Sm4SetKey(dec->sm4, keys->server_write_key, + specs->key_size); + if (sm4Ret != 0) return sm4Ret; + sm4Ret = wc_Sm4SetIV(dec->sm4, keys->server_write_IV); + if (sm4Ret != 0) return sm4Ret; + } + } + else { + if (enc) { + sm4Ret = wc_Sm4SetKey(enc->sm4, keys->server_write_key, + specs->key_size); + if (sm4Ret != 0) return sm4Ret; + sm4Ret = wc_Sm4SetIV(enc->sm4, keys->server_write_IV); + if (sm4Ret != 0) return sm4Ret; + } + if (dec) { + sm4Ret = wc_Sm4SetKey(dec->sm4, keys->client_write_key, + specs->key_size); + if (sm4Ret != 0) return sm4Ret; + sm4Ret = wc_Sm4SetIV(dec->sm4, keys->client_write_IV); + if (sm4Ret != 0) return sm4Ret; + } + } + if (enc) + enc->setup = 1; + if (dec) + dec->setup = 1; + } +#endif /* WOLFSSL_SM4_CBC */ + +#ifdef WOLFSSL_SM4_GCM + /* check that buffer sizes are sufficient */ + #if (AEAD_MAX_IMP_SZ < 4) /* SM4-GCM_IMP_IV_SZ */ + #error AEAD_MAX_IMP_SZ too small for SM4-GCM + #endif + #if (AEAD_MAX_EXP_SZ < 8) /* SM4-GCM_EXP_IV_SZ */ + #error AEAD_MAX_EXP_SZ too small for SM4-GCM + #endif + #if (MAX_WRITE_IV_SZ < 4) /* SM4-GCM_IMP_IV_SZ */ + #error MAX_WRITE_IV_SZ too small for SM4-GCM + #endif + + if (specs->bulk_cipher_algorithm == wolfssl_sm4_gcm) { + int gcmRet; + + if (enc) { + if (enc->sm4 == NULL) { + enc->sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, + DYNAMIC_TYPE_CIPHER); + if (enc->sm4 == NULL) + return MEMORY_E; + } else { + wc_Sm4Free(enc->sm4); + } + + XMEMSET(enc->sm4, 0, sizeof(wc_Sm4)); + } + if (dec) { + if (dec->sm4 == NULL) { + dec->sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, + DYNAMIC_TYPE_CIPHER); + if (dec->sm4 == NULL) + return MEMORY_E; + } else { + wc_Sm4Free(dec->sm4); + } + + XMEMSET(dec->sm4, 0, sizeof(wc_Sm4)); + } + + if (enc) { + if (wc_Sm4Init(enc->sm4, heap, devId) != 0) { + WOLFSSL_MSG("Sm4Init failed in SetKeys"); + return ASYNC_INIT_E; + } + } + if (dec) { + if (wc_Sm4Init(dec->sm4, heap, devId) != 0) { + WOLFSSL_MSG("Sm4Init failed in SetKeys"); + return ASYNC_INIT_E; + } + } + + if (side == WOLFSSL_CLIENT_END) { + if (enc) { + gcmRet = wc_Sm4GcmSetKey(enc->sm4, keys->client_write_key, + specs->key_size); + if (gcmRet != 0) return gcmRet; + XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV, + AEAD_MAX_IMP_SZ); + } + if (dec) { + gcmRet = wc_Sm4GcmSetKey(dec->sm4, keys->server_write_key, + specs->key_size); + if (gcmRet != 0) return gcmRet; + XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV, + AEAD_MAX_IMP_SZ); + } + } + else { + if (enc) { + gcmRet = wc_Sm4GcmSetKey(enc->sm4, keys->server_write_key, + specs->key_size); + if (gcmRet != 0) return gcmRet; + XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV, + AEAD_MAX_IMP_SZ); + } + if (dec) { + gcmRet = wc_Sm4GcmSetKey(dec->sm4, keys->client_write_key, + specs->key_size); + if (gcmRet != 0) return gcmRet; + XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV, + AEAD_MAX_IMP_SZ); + } + } + if (enc) + enc->setup = 1; + if (dec) + dec->setup = 1; + } +#endif /* WOLFSSL_SM4_GCM */ + +#ifdef WOLFSSL_SM4_CCM + /* check that buffer sizes are sufficient (CCM is same size as GCM) */ + #if (AEAD_MAX_IMP_SZ < 4) /* SM4-CCM_IMP_IV_SZ */ + #error AEAD_MAX_IMP_SZ too small for SM4-CCM + #endif + #if (AEAD_MAX_EXP_SZ < 8) /* SM4-CCM_EXP_IV_SZ */ + #error AEAD_MAX_EXP_SZ too small for SM4-CCM + #endif + #if (MAX_WRITE_IV_SZ < 4) /* SM4-CCM_IMP_IV_SZ */ + #error MAX_WRITE_IV_SZ too small for SM4-CCM + #endif + + if (specs->bulk_cipher_algorithm == wolfssl_sm4_ccm) { + int CcmRet; + + if (enc) { + if (enc->sm4 == NULL) { + enc->sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, + DYNAMIC_TYPE_CIPHER); + if (enc->sm4 == NULL) + return MEMORY_E; + } else { + wc_Sm4Free(enc->sm4); + } + + XMEMSET(enc->sm4, 0, sizeof(wc_Sm4)); + } + if (dec) { + if (dec->sm4 == NULL) { + dec->sm4 = (wc_Sm4*)XMALLOC(sizeof(wc_Sm4), heap, + DYNAMIC_TYPE_CIPHER); + if (dec->sm4 == NULL) + return MEMORY_E; + } else { + wc_Sm4Free(dec->sm4); + } + XMEMSET(dec->sm4, 0, sizeof(wc_Sm4)); + } + + if (enc) { + if (wc_Sm4Init(enc->sm4, heap, devId) != 0) { + WOLFSSL_MSG("Sm4Init failed in SetKeys"); + return ASYNC_INIT_E; + } + } + if (dec) { + if (wc_Sm4Init(dec->sm4, heap, devId) != 0) { + WOLFSSL_MSG("Sm4Init failed in SetKeys"); + return ASYNC_INIT_E; + } + } + + if (side == WOLFSSL_CLIENT_END) { + if (enc) { + CcmRet = wc_Sm4SetKey(enc->sm4, keys->client_write_key, + specs->key_size); + if (CcmRet != 0) { + return CcmRet; + } + XMEMCPY(keys->aead_enc_imp_IV, keys->client_write_IV, + AEAD_MAX_IMP_SZ); + } + if (dec) { + CcmRet = wc_Sm4SetKey(dec->sm4, keys->server_write_key, + specs->key_size); + if (CcmRet != 0) { + return CcmRet; + } + XMEMCPY(keys->aead_dec_imp_IV, keys->server_write_IV, + AEAD_MAX_IMP_SZ); + } + } + else { + if (enc) { + CcmRet = wc_Sm4SetKey(enc->sm4, keys->server_write_key, + specs->key_size); + if (CcmRet != 0) { + return CcmRet; + } + XMEMCPY(keys->aead_enc_imp_IV, keys->server_write_IV, + AEAD_MAX_IMP_SZ); + } + if (dec) { + CcmRet = wc_Sm4SetKey(dec->sm4, keys->client_write_key, + specs->key_size); + if (CcmRet != 0) { + return CcmRet; + } + XMEMCPY(keys->aead_dec_imp_IV, keys->client_write_IV, + AEAD_MAX_IMP_SZ); + } + } + if (enc) + enc->setup = 1; + if (dec) + dec->setup = 1; + } +#endif /* WOLFSSL_SM4_CCM */ + #ifdef HAVE_NULL_CIPHER if (specs->bulk_cipher_algorithm == wolfssl_cipher_null) { #ifdef WOLFSSL_TLS13 @@ -3046,7 +3561,8 @@ void* ctx = wolfSSL_GetEncryptKeysCtx(ssl); ret = ssl->ctx->EncryptKeysCb(ssl, ctx); } - if (!ssl->ctx->EncryptKeysCb || ret == PROTOCOLCB_UNAVAILABLE) + if (!ssl->ctx->EncryptKeysCb || + ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) #endif { ret = SetKeys(wc_encrypt, wc_decrypt, keys, &ssl->specs, ssl->options.side, @@ -3153,7 +3669,8 @@ /* TLS can call too */ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side) { - int sz, i = 0; + size_t sz; + int i = 0; Keys* keys = &ssl->keys; #ifdef WOLFSSL_DTLS /* In case of DTLS, ssl->keys is updated here */ @@ -3197,7 +3714,7 @@ XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz); XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz); #endif - i += sz; + i += (int)sz; } sz = ssl->specs.key_size; #ifdef WOLFSSL_DTLS @@ -3210,7 +3727,7 @@ #endif XMEMCPY(keys->client_write_key, &keyData[i], sz); XMEMCPY(keys->server_write_key, &keyData[i], sz); - i += sz; + i += (int)sz; sz = ssl->specs.iv_size; #ifdef WOLFSSL_DTLS @@ -3252,7 +3769,7 @@ #endif XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz); #endif - i += sz; + i += (int)sz; } if (side & PROVISION_SERVER) { #ifndef WOLFSSL_AEAD_ONLY @@ -3263,7 +3780,7 @@ #endif XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz); #endif - i += sz; + i += (int)sz; } } sz = ssl->specs.key_size; @@ -3274,7 +3791,7 @@ keys->client_write_key, sz); #endif XMEMCPY(keys->client_write_key, &keyData[i], sz); - i += sz; + i += (int)sz; } if (side & PROVISION_SERVER) { #ifdef WOLFSSL_DTLS @@ -3283,7 +3800,7 @@ keys->server_write_key, sz); #endif XMEMCPY(keys->server_write_key, &keyData[i], sz); - i += sz; + i += (int)sz; } sz = ssl->specs.iv_size; @@ -3294,7 +3811,7 @@ keys->client_write_IV, sz); #endif XMEMCPY(keys->client_write_IV, &keyData[i], sz); - i += sz; + i += (int)sz; } if (side & PROVISION_SERVER) { #ifdef WOLFSSL_DTLS diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ocsp.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ocsp.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ocsp.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ocsp.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,6 +28,13 @@ #include +/* + * WOLFSSL_NO_OCSP_ISSUER_CHAIN_CHECK: + * Disable looking for an authorized responder in the verification path of + * the issuer. This will make the authorized responder only look at the + * OCSP response signer and direct issuer. + */ + #ifndef WOLFCRYPT_ONLY #ifdef HAVE_OCSP @@ -135,9 +142,9 @@ } } -int CheckCertOCSP_ex(WOLFSSL_OCSP* ocsp, DecodedCert* cert, buffer* responseBuffer, WOLFSSL* ssl) +int CheckCertOCSP_ex(WOLFSSL_OCSP* ocsp, DecodedCert* cert, WOLFSSL* ssl) { - int ret = OCSP_LOOKUP_FAIL; + int ret = WC_NO_ERR_TRACE(OCSP_LOOKUP_FAIL); #ifdef WOLFSSL_SMALL_STACK OcspRequest* ocspRequest; @@ -160,7 +167,7 @@ if (InitOcspRequest(ocspRequest, cert, ocsp->cm->ocspSendNonce, ocsp->cm->heap) == 0) { ocspRequest->ssl = ssl; - ret = CheckOcspRequest(ocsp, ocspRequest, responseBuffer); + ret = CheckOcspRequest(ocsp, ocspRequest, NULL, NULL); FreeOcspRequest(ocspRequest); } @@ -172,9 +179,9 @@ WOLFSSL_LEAVE("CheckCertOCSP", ret); return ret; } -int CheckCertOCSP(WOLFSSL_OCSP* ocsp, DecodedCert* cert, buffer* responseBuffer) +int CheckCertOCSP(WOLFSSL_OCSP* ocsp, DecodedCert* cert) { - return CheckCertOCSP_ex(ocsp, cert, responseBuffer, NULL); + return CheckCertOCSP_ex(ocsp, cert, NULL); } static int GetOcspEntry(WOLFSSL_OCSP* ocsp, OcspRequest* request, @@ -217,12 +224,14 @@ * Returns OCSP status */ static int GetOcspStatus(WOLFSSL_OCSP* ocsp, OcspRequest* request, - OcspEntry* entry, CertStatus** status, buffer* responseBuffer) + OcspEntry* entry, CertStatus** status, buffer* responseBuffer, + void* heap) { - int ret = OCSP_INVALID_STATUS; + int ret = WC_NO_ERR_TRACE(OCSP_INVALID_STATUS); WOLFSSL_ENTER("GetOcspStatus"); + (void)heap; *status = NULL; if (wc_LockMutex(&ocsp->ocspLock) != 0) { @@ -232,7 +241,7 @@ for (*status = entry->status; *status; *status = (*status)->next) if ((*status)->serialSz == request->serialSz - && !XMEMCMP((*status)->serial, request->serial, (*status)->serialSz)) + && !XMEMCMP((*status)->serial, request->serial, (size_t)(*status)->serialSz)) break; if (responseBuffer && *status && !(*status)->rawOcspResponse) { @@ -252,7 +261,8 @@ if (responseBuffer) { responseBuffer->buffer = (byte*)XMALLOC( - (*status)->rawOcspResponseSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + (*status)->rawOcspResponseSz, heap, + DYNAMIC_TYPE_TMP_BUFFER); if (responseBuffer->buffer) { responseBuffer->length = (*status)->rawOcspResponseSz; @@ -277,11 +287,13 @@ * reponseBuffer Buffer object to return the response with. * status The certificate status object. * entry The OCSP entry for this certificate. + * ocspRequest Request corresponding to response. + * heap Heap hint used for responseBuffer * returns OCSP_LOOKUP_FAIL when the response is bad and 0 otherwise. */ int CheckOcspResponse(WOLFSSL_OCSP *ocsp, byte *response, int responseSz, WOLFSSL_BUFFER_INFO *responseBuffer, CertStatus *status, - OcspEntry *entry, OcspRequest *ocspRequest) + OcspEntry *entry, OcspRequest *ocspRequest, void* heap) { #ifdef WOLFSSL_SMALL_STACK CertStatus* newStatus; @@ -295,6 +307,8 @@ int ret; int validated = 0; /* ocsp validation flag */ + (void)heap; + #ifdef WOLFSSL_SMALL_STACK newStatus = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL, DYNAMIC_TYPE_OCSP_STATUS); @@ -312,9 +326,14 @@ return MEMORY_E; } #endif - InitOcspResponse(ocspResponse, newSingle, newStatus, response, responseSz, - ocsp->cm->heap); - + InitOcspResponse(ocspResponse, newSingle, newStatus, response, + (word32)responseSz, ocsp->cm->heap); +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ocspRequest != NULL && ocspRequest->ssl != NULL && + TLSX_CSR2_IsMulti(((WOLFSSL*)ocspRequest->ssl)->extensions)) { + ocspResponse->pendingCAs = TLSX_CSR2_GetPendingSigners(((WOLFSSL*)ocspRequest->ssl)->extensions); + } +#endif ret = OcspResponseDecode(ocspResponse, ocsp->cm, ocsp->cm->heap, 0); if (ret != 0) { ocsp->error = ret; @@ -336,12 +355,12 @@ } if (responseBuffer) { - responseBuffer->buffer = (byte*)XMALLOC(responseSz, ocsp->cm->heap, + responseBuffer->buffer = (byte*)XMALLOC((size_t)responseSz, heap, DYNAMIC_TYPE_TMP_BUFFER); if (responseBuffer->buffer) { - responseBuffer->length = responseSz; - XMEMCPY(responseBuffer->buffer, response, responseSz); + responseBuffer->length = (unsigned int)responseSz; + XMEMCPY(responseBuffer->buffer, response, (size_t)responseSz); } } @@ -395,10 +414,14 @@ end: if (ret == 0 && validated == 1) { WOLFSSL_MSG("New OcspResponse validated"); - } else if ((ret == ocsp->error) && (ocspResponse->single->status->status == CERT_UNKNOWN)) { + } + else if (ret == WC_NO_ERR_TRACE(OCSP_CERT_REVOKED)) { + WOLFSSL_MSG("OCSP revoked"); + } + else if (ret == WC_NO_ERR_TRACE(OCSP_CERT_UNKNOWN)) { WOLFSSL_MSG("OCSP unknown"); - ret = OCSP_CERT_UNKNOWN; - } else if (ret != OCSP_CERT_REVOKED) { + } + else { WOLFSSL_MSG("OCSP lookup failure"); ret = OCSP_LOOKUP_FAIL; } @@ -418,7 +441,7 @@ #define OCSP_MAX_REQUEST_SZ 2048 #endif int CheckOcspRequest(WOLFSSL_OCSP* ocsp, OcspRequest* ocspRequest, - buffer* responseBuffer) + buffer* responseBuffer, void* heap) { OcspEntry* entry = NULL; CertStatus* status = NULL; @@ -446,10 +469,16 @@ if (ret != 0) return ret; - ret = GetOcspStatus(ocsp, ocspRequest, entry, &status, responseBuffer); - if (ret != OCSP_INVALID_STATUS) + ret = GetOcspStatus(ocsp, ocspRequest, entry, &status, responseBuffer, + heap); + if (ret != WC_NO_ERR_TRACE(OCSP_INVALID_STATUS)) return ret; + if (responseBuffer) { + XFREE(responseBuffer->buffer, heap, DYNAMIC_TYPE_TMP_BUFFER); + responseBuffer->buffer = NULL; + } + /* get SSL and IOCtx */ ssl = (WOLFSSL*)ocspRequest->ssl; ioCtx = (ssl && ssl->ocspIOCtx != NULL) ? @@ -457,16 +486,26 @@ #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) if (ocsp->statusCb != NULL && ssl != NULL) { + WOLFSSL_MSG("Calling ocsp->statusCb"); ret = ocsp->statusCb(ssl, ioCtx); - if (ret == 0) { - ret = wolfSSL_get_ocsp_response(ssl, &response); - ret = CheckOcspResponse(ocsp, response, ret, responseBuffer, status, - entry, NULL); - if (response != NULL) - XFREE(response, NULL, DYNAMIC_TYPE_OPENSSL); - return ret; + switch (ret) { + case SSL_TLSEXT_ERR_OK: + ret = wolfSSL_get_ocsp_response(ssl, &response); + ret = CheckOcspResponse(ocsp, response, ret, responseBuffer, + status, entry, NULL, heap); + if (response != NULL) + XFREE(response, NULL, DYNAMIC_TYPE_OPENSSL); + break; + case SSL_TLSEXT_ERR_NOACK: + ret = OCSP_LOOKUP_FAIL; + break; + case SSL_TLSEXT_ERR_ALERT_FATAL: + default: + WOLFSSL_LEAVE("CheckOcspRequest", ocsp->error); + ret = WOLFSSL_FATAL_ERROR; + break; } - WOLFSSL_LEAVE("CheckOcspRequest", ocsp->error); + WOLFSSL_LEAVE("CheckOcspRequest", ret); return ret; } #endif @@ -488,17 +527,13 @@ return 0; } - request = (byte*)XMALLOC(requestSz, ocsp->cm->heap, DYNAMIC_TYPE_OCSP); + request = (byte*)XMALLOC((size_t)requestSz, ocsp->cm->heap, DYNAMIC_TYPE_OCSP); if (request == NULL) { WOLFSSL_LEAVE("CheckCertOCSP", MEMORY_ERROR); - if (responseBuffer) { - XFREE(responseBuffer->buffer, NULL, DYNAMIC_TYPE_TMP_BUFFER); - responseBuffer->buffer = NULL; - } return MEMORY_ERROR; } - requestSz = EncodeOcspRequest(ocspRequest, request, requestSz); + requestSz = EncodeOcspRequest(ocspRequest, request, (word32)requestSz); if (requestSz > 0 && ocsp->cm->ocspIOCb) { responseSz = ocsp->cm->ocspIOCb(ioCtx, url, urlSz, request, requestSz, &response); @@ -511,7 +546,7 @@ if (responseSz >= 0 && response) { ret = CheckOcspResponse(ocsp, response, responseSz, responseBuffer, status, - entry, ocspRequest); + entry, ocspRequest, heap); } if (response != NULL && ocsp->cm->ocspRespFreeCb) @@ -523,9 +558,118 @@ return ret; } +#ifndef WOLFSSL_NO_OCSP_ISSUER_CHAIN_CHECK +static int CheckOcspResponderChain(OcspEntry* single, DecodedCert *cert, + void* vp, Signer* pendingCAs) { + /* Attempt to build a chain up to cert's issuer */ + WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp; + Signer* ca = NULL; + Signer* prev = NULL; + int passed = 0; + + /* + * Relation between certs: + * CA + * / \ + * intermediate(s) cert in OCSP response + * | with OCSP key usage ext + * issuer of cert + * in OCSP request + */ + + /* End loop if no more issuers found or if we have found a self + * signed cert (ca == prev) */ + ca = GetCAByName(cm, single->issuerHash); +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ca == NULL && pendingCAs != NULL) { + ca = findSignerByName(pendingCAs, single->issuerHash); + } +#else + (void)pendingCAs; +#endif + for (; ca != NULL && ca != prev; + prev = ca) { + if (XMEMCMP(cert->issuerHash, ca->issuerNameHash, + OCSP_DIGEST_SIZE) == 0) { + WOLFSSL_MSG("\tOCSP Response signed by authorized " + "responder delegated by issuer " + "(found in chain)"); + passed = 1; + break; + } + ca = GetCAByName(cm, ca->issuerNameHash); +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ca == NULL && pendingCAs != NULL) { + ca = findSignerByName(pendingCAs, single->issuerHash); + } +#endif + } + return passed; +} +#endif + +/** + * Enforce https://www.rfc-editor.org/rfc/rfc6960#section-4.2.2.2 + * @param bs The basic response to verify + * @param cert The decoded bs->cert + * @return + */ +int CheckOcspResponder(OcspResponse *bs, DecodedCert *cert, void* vp) +{ + int ret = 0; + OcspEntry* single; + + /* Both evaluate to enum values so can't use a pre-processor check */ + WOLFSSL_ASSERT_EQ(OCSP_DIGEST_SIZE, SIGNER_DIGEST_SIZE); + + (void)vp; + + WOLFSSL_ENTER("CheckOcspResponder"); + + /* In the future if this API is used more then it could be beneficial to + * implement calling InitDecodedCert and ParseCertRelative here + * automatically when cert == NULL. */ + if (bs == NULL || cert == NULL) + return BAD_FUNC_ARG; + + /* Traverse the list and check that the cert has the authority to provide + * an OCSP response for each entry. */ + for (single = bs->single; single != NULL; single = single->next) { + int passed = 0; + + if (XMEMCMP(cert->subjectHash, single->issuerHash, OCSP_DIGEST_SIZE) + == 0) { + WOLFSSL_MSG("\tOCSP Response signed by issuer"); + passed = 1; + } + else if ((cert->extExtKeyUsage & EXTKEYUSE_OCSP_SIGN) != 0) { + if (XMEMCMP(cert->issuerHash, single->issuerHash, + OCSP_DIGEST_SIZE) == 0) { + WOLFSSL_MSG("\tOCSP Response signed by authorized responder " + "delegated by issuer"); + passed = 1; + } +#ifndef WOLFSSL_NO_OCSP_ISSUER_CHAIN_CHECK + else if (vp != NULL) { + passed = CheckOcspResponderChain(single, cert, vp, bs->pendingCAs); + } +#endif + } + + if (!passed) { + WOLFSSL_MSG("\tOCSP Responder not authorized"); +#ifdef OPENSSL_EXTRA + bs->verifyError = OCSP_BAD_ISSUER; +#endif + ret = BAD_OCSP_RESPONDER; + break; + } + } + return ret; +} + #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \ defined(WOLFSSL_APACHE_HTTPD) || defined(HAVE_LIGHTY) - int wolfSSL_OCSP_resp_find_status(WOLFSSL_OCSP_BASICRESP *bs, WOLFSSL_OCSP_CERTID* id, int* status, int* reason, WOLFSSL_ASN1_TIME** revtime, WOLFSSL_ASN1_TIME** thisupd, @@ -538,7 +682,7 @@ single = bs->single; while (single != NULL) { - if ((XMEMCMP(single->status->serial, id->status->serial, single->status->serialSz) == 0) + if ((XMEMCMP(single->status->serial, id->status->serial, (size_t)single->status->serialSz) == 0) && (XMEMCMP(single->issuerHash, id->issuerHash, OCSP_DIGEST_SIZE) == 0) && (XMEMCMP(single->issuerKeyHash, id->issuerKeyHash, OCSP_DIGEST_SIZE) == 0)) { break; @@ -658,13 +802,14 @@ InitDecodedCert(cert, subject->derCert->buffer, subject->derCert->length, NULL); - if (ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm) != 0) { + if (ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm, NULL) != 0) { + FreeDecodedCert(cert); goto out; } else { XMEMCPY(certId->issuerHash, cert->issuerHash, OCSP_DIGEST_SIZE); XMEMCPY(certId->issuerKeyHash, cert->issuerKeyHash, OCSP_DIGEST_SIZE); - XMEMCPY(certId->status->serial, cert->serial, cert->serialSz); + XMEMCPY(certId->status->serial, cert->serial, (size_t)cert->serialSz); certId->status->serialSz = cert->serialSz; FreeDecodedCert(cert); } @@ -676,11 +821,12 @@ if (ret != 0) { if (derCert != NULL) FreeDer(&derCert); - if (certId != NULL) + if (certId != NULL) { XFREE(certId, cm->heap, DYNAMIC_TYPE_OPENSSL); + certId = NULL; + } if (certStatus) XFREE(certStatus, cm->heap, DYNAMIC_TYPE_OPENSSL); - return NULL; } #ifdef WOLFSSL_SMALL_STACK @@ -704,38 +850,60 @@ int wolfSSL_OCSP_basic_verify(WOLFSSL_OCSP_BASICRESP *bs, WOLF_STACK_OF(WOLFSSL_X509) *certs, WOLFSSL_X509_STORE *st, unsigned long flags) { - int ret; + int ret = WOLFSSL_FAILURE; #ifdef WOLFSSL_SMALL_STACK - DecodedCert *cert = (DecodedCert *) - XMALLOC(sizeof(*cert), (st && st->cm) ? st->cm->heap : NULL, - DYNAMIC_TYPE_DCERT); - if (cert == NULL) - return WOLFSSL_FAILURE; + DecodedCert *cert; #else DecodedCert cert[1]; #endif + byte certInit = 0; + int idx; (void)certs; - if (flags & OCSP_NOVERIFY) { - ret = WOLFSSL_SUCCESS; - goto out; - } + if (flags & OCSP_NOVERIFY) + return WOLFSSL_SUCCESS; + +#ifdef WOLFSSL_SMALL_STACK + cert = (DecodedCert *) + XMALLOC(sizeof(*cert), (st && st->cm) ? st->cm->heap : NULL, + DYNAMIC_TYPE_DCERT); + if (cert == NULL) + return WOLFSSL_FAILURE; +#endif #ifdef OPENSSL_EXTRA - if (bs->verifyError != OCSP_VERIFY_ERROR_NONE) { - ret = WOLFSSL_FAILURE; + if (bs->verifyError != OCSP_VERIFY_ERROR_NONE) goto out; - } #endif - ret = WOLFSSL_SUCCESS; + if (flags & OCSP_TRUSTOTHER) { + for (idx = 0; idx < wolfSSL_sk_X509_num(certs); idx++) { + WOLFSSL_X509* x = wolfSSL_sk_X509_value(certs, idx); + int derSz = 0; + const byte* der = wolfSSL_X509_get_der(x, &derSz); + if (der != NULL && derSz == (int)bs->certSz && + XMEMCMP(bs->cert, der, (size_t)derSz) == 0) { + ret = WOLFSSL_SUCCESS; + goto out; + } + } + } + InitDecodedCert(cert, bs->cert, bs->certSz, NULL); - if (ParseCertRelative(cert, CERT_TYPE, VERIFY, st->cm) < 0) - ret = WOLFSSL_FAILURE; - FreeDecodedCert(cert); + certInit = 1; + if (ParseCertRelative(cert, CERT_TYPE, VERIFY, st->cm, NULL) < 0) + goto out; + + if (!(flags & OCSP_NOCHECKS)) { + if (CheckOcspResponder(bs, cert, st->cm) != 0) + goto out; + } + ret = WOLFSSL_SUCCESS; out: + if (certInit) + FreeDecodedCert(cert); #ifdef WOLFSSL_SMALL_STACK XFREE(cert, (st && st->cm) ? st->cm->heap : NULL, DYNAMIC_TYPE_DCERT); @@ -803,7 +971,7 @@ if (fcur > MAX_WOLFSSL_FILE_SIZE || fcur <= 0) return NULL; - data = (byte*)XMALLOC(fcur, 0, DYNAMIC_TYPE_TMP_BUFFER); + data = (byte*)XMALLOC((size_t)fcur, 0, DYNAMIC_TYPE_TMP_BUFFER); if (data == NULL) return NULL; dataAlloced = 1; @@ -848,7 +1016,7 @@ XMEMSET(resp, 0, sizeof(OcspResponse)); } - resp->source = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER); + resp->source = (byte*)XMALLOC((size_t)len, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (resp->source == NULL) { XFREE(resp, NULL, DYNAMIC_TYPE_OCSP_REQUEST); return NULL; @@ -872,19 +1040,19 @@ } XMEMSET(resp->single->status, 0, sizeof(CertStatus)); - XMEMCPY(resp->source, *data, len); - resp->maxIdx = len; + XMEMCPY(resp->source, *data, (size_t)len); + resp->maxIdx = (word32)len; ret = OcspResponseDecode(resp, NULL, NULL, 1); - if (ret != 0 && ret != ASN_OCSP_CONFIRM_E) { + if (ret != 0 && ret != WC_NO_ERR_TRACE(ASN_OCSP_CONFIRM_E)) { /* for just converting from a DER to an internal structure the CA may * not yet be known to this function for signature verification */ wolfSSL_OCSP_RESPONSE_free(resp); return NULL; } - if (GetSequence(*data, &idx, &length, len) >= 0) - (*data) += idx + length; + if (GetSequence(*data, &idx, &length, (word32)len) >= 0) + (*data) += (unsigned char) ((int)idx + length); return resp; } @@ -893,10 +1061,10 @@ unsigned char** data) { if (data == NULL) - return response->maxIdx; + return (int)response->maxIdx; XMEMCPY(*data, response->source, response->maxIdx); - return response->maxIdx; + return (int)response->maxIdx; } int wolfSSL_OCSP_response_status(OcspResponse *response) @@ -979,7 +1147,7 @@ if (size <= 0 || data == NULL) return size; - return EncodeOcspRequest(request, *data, size); + return EncodeOcspRequest(request, *data, (word32) size); } WOLFSSL_OCSP_ONEREQ* wolfSSL_OCSP_request_add0_id(OcspRequest *req, @@ -988,17 +1156,22 @@ if (req == NULL || cid == NULL || cid->status == NULL) return NULL; + if (req->cid != NULL) + wolfSSL_OCSP_CERTID_free((WOLFSSL_OCSP_CERTID*)req->cid); + /* Keep to free */ + req->cid = (void*)cid; + XMEMCPY(req->issuerHash, cid->issuerHash, KEYID_SIZE); XMEMCPY(req->issuerKeyHash, cid->issuerKeyHash, KEYID_SIZE); if (cid->status->serialSz > req->serialSz) { if (req->serial != NULL) XFREE(req->serial, req->heap, DYNAMIC_TYPE_OCSP); - req->serial = (byte*)XMALLOC(cid->status->serialSz, + req->serial = (byte*)XMALLOC((size_t)cid->status->serialSz, req->heap, DYNAMIC_TYPE_OCSP_REQUEST); if (req->serial == NULL) return NULL; } - XMEMCPY(req->serial, cid->status->serial, cid->status->serialSz); + XMEMCPY(req->serial, cid->status->serial, (size_t)cid->status->serialSz); req->serialSz = cid->status->serialSz; return req; @@ -1034,7 +1207,7 @@ size = wolfSSL_i2d_OCSP_REQUEST(req, NULL); if (size > 0) { - data = (unsigned char*) XMALLOC(size, out->heap, + data = (unsigned char*) XMALLOC((size_t)size, out->heap, DYNAMIC_TYPE_TMP_BUFFER); } @@ -1063,15 +1236,15 @@ return WOLFSSL_FAILURE; if (*data != NULL) { - XMEMCPY(*data, id->rawCertId, id->rawCertIdSize); + XMEMCPY(*data, id->rawCertId, (size_t)id->rawCertIdSize); *data = *data + id->rawCertIdSize; } else { - *data = (unsigned char*)XMALLOC(id->rawCertIdSize, NULL, DYNAMIC_TYPE_OPENSSL); + *data = (unsigned char*)XMALLOC((size_t)id->rawCertIdSize, NULL, DYNAMIC_TYPE_OPENSSL); if (*data == NULL) { return WOLFSSL_FAILURE; } - XMEMCPY(*data, id->rawCertId, id->rawCertIdSize); + XMEMCPY(*data, id->rawCertId, (size_t)id->rawCertIdSize); } return id->rawCertIdSize; @@ -1100,9 +1273,9 @@ } if (cid != NULL) { - cid->rawCertId = (byte*)XMALLOC(length + 1, NULL, DYNAMIC_TYPE_OPENSSL); + cid->rawCertId = (byte*)XMALLOC((size_t)length + 1, NULL, DYNAMIC_TYPE_OPENSSL); if (cid->rawCertId != NULL) { - XMEMCPY(cid->rawCertId, *derIn, length); + XMEMCPY(cid->rawCertId, *derIn, (size_t)length); cid->rawCertIdSize = length; /* Per spec. advance past the data that is being returned @@ -1115,7 +1288,7 @@ } } - if (cid && (!cidOut || cid != *cidOut)) { + if ((cid != NULL) && ((cidOut == NULL) || (cid != *cidOut))) { XFREE(cid, NULL, DYNAMIC_TYPE_OPENSSL); } @@ -1149,7 +1322,7 @@ if (a->status != NULL && b->status != NULL) { if (a->status->serialSz == b->status->serialSz) ret = XMEMCMP(a->status->serial, b->status->serial, - a->status->serialSz); + (size_t)a->status->serialSz); else ret = -1; } @@ -1278,13 +1451,13 @@ if (cid->status->serialSz > (WOLFSSL_ASN1_INTEGER_MAX - 2)) { /* allocate data buffer, +2 for type and length */ - ser->data = (unsigned char*)XMALLOC(cid->status->serialSz + 2, NULL, + ser->data = (unsigned char*)XMALLOC((size_t)cid->status->serialSz + 2, NULL, DYNAMIC_TYPE_OPENSSL); if (ser->data == NULL) { wolfSSL_ASN1_INTEGER_free(ser); return 0; } - ser->dataMax = cid->status->serialSz + 2; + ser->dataMax = (unsigned int)cid->status->serialSz + 2; ser->isDynamic = 1; } else { /* Use array instead of dynamic memory */ @@ -1294,12 +1467,12 @@ #if defined(WOLFSSL_QT) || defined(WOLFSSL_HAPROXY) /* Serial number starts at 0 index of ser->data */ - XMEMCPY(&ser->data[i], cid->status->serial, cid->status->serialSz); + XMEMCPY(&ser->data[i], cid->status->serial, (size_t)cid->status->serialSz); ser->length = cid->status->serialSz; #else ser->data[i++] = ASN_INTEGER; i += SetLength(cid->status->serialSz, ser->data + i); - XMEMCPY(&ser->data[i], cid->status->serial, cid->status->serialSz); + XMEMCPY(&ser->data[i], cid->status->serial, (size_t)cid->status->serialSz); ser->length = i + cid->status->serialSz; #endif @@ -1339,7 +1512,7 @@ sz = MAX_OCSP_NONCE_SZ; if (val != NULL) { - XMEMCPY(req->nonce, val, sz); + XMEMCPY(req->nonce, val, (size_t)sz); } else { if ( @@ -1352,7 +1525,7 @@ WOLFSSL_MSG("RNG init failed"); return WOLFSSL_FAILURE; } - if (wc_RNG_GenerateBlock(&rng, req->nonce, sz) != 0) { + if (wc_RNG_GenerateBlock(&rng, req->nonce, (word32)sz) != 0) { WOLFSSL_MSG("wc_RNG_GenerateBlock failed"); wc_FreeRng(&rng); return WOLFSSL_FAILURE; @@ -1405,7 +1578,7 @@ /* nonces are present and equal, return 1. Extra NULL check for fixing scan-build warning. */ if (reqNonceSz == rspNonceSz && reqNonce && rspNonce) { - if (XMEMCMP(reqNonce, rspNonce, reqNonceSz) == 0) + if (XMEMCMP(reqNonce, rspNonce, (size_t)reqNonceSz) == 0) return 1; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/pk.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/pk.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/pk.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/pk.c 2024-08-03 07:30:00.000000000 +0000 @@ -25,13 +25,19 @@ #include - #include +#include #ifndef WC_NO_RNG #include #endif #ifdef HAVE_ECC #include + #ifdef HAVE_SELFTEST + /* point compression types. */ + #define ECC_POINT_COMP_EVEN 0x02 + #define ECC_POINT_COMP_ODD 0x03 + #define ECC_POINT_UNCOMP 0x04 + #endif #endif #ifndef WOLFSSL_HAVE_ECC_KEY_GET_PRIV /* FIPS build has replaced ecc.h. */ @@ -49,15 +55,6 @@ #include #endif -#if defined(OPENSSL_EXTRA) && !defined(NO_BIO) && defined(WOLFSSL_KEY_GEN) && \ - (!defined(HAVE_USER_RSA) || defined(HAVE_ECC) || \ - (!defined(NO_DSA) && !defined(HAVE_SELFTEST))) -/* Forward declaration for wolfSSL_PEM_write_bio_DSA_PUBKEY. - * Implementation in ssl.c. - */ -static int pem_write_bio_pubkey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key); -#endif - /******************************************************************************* * COMMON FUNCTIONS ******************************************************************************/ @@ -168,8 +165,7 @@ /* Write left over data back to BIO if not a file BIO */ if ((ret > 0) && ((memSz - ret) > 0) && (bio->type != WOLFSSL_BIO_FILE)) { - int res; - res = wolfSSL_BIO_write(bio, mem + ret, memSz - ret); + int res = wolfSSL_BIO_write(bio, mem + ret, memSz - ret); if (res != memSz - ret) { WOLFSSL_ERROR_MSG("Unable to write back excess data"); if (res < 0) { @@ -181,7 +177,7 @@ } } if (alloced) { - XFREE(mem, NULL, DYNAMIC_TYPE_OPENSSL); + XFREE(mem, NULL, DYNAMIC_TYPE_TMP_BUFFER); } } @@ -220,8 +216,8 @@ #endif /* !NO_FILESYSTEM */ #endif -#if defined(OPENSSL_EXTRA) && ((!defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) \ - && !defined(HAVE_USER_RSA)) || !defined(WOLFCRYPT_ONLY)) +#if defined(OPENSSL_EXTRA) && ((!defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)) \ + || !defined(WOLFCRYPT_ONLY)) /* Convert DER data to PEM in an allocated buffer. * * @param [in] der Buffer containing DER data. @@ -230,33 +226,36 @@ * @param [in] heap Heap hint for dynamic memory allocation. * @param [out] out Allocated buffer containing PEM. * @param [out] outSz Size of PEM encoding. - * @return WOLFSSL_FAILURE on error. - * @return WOLFSSL_SUCCESS on success. + * @return 1 on success. + * @return 0 on error. */ static int der_to_pem_alloc(const unsigned char* der, int derSz, int type, void* heap, byte** out, int* outSz) { - int ret = WOLFSSL_SUCCESS; + int ret = 1; int pemSz; byte* pem = NULL; (void)heap; + /* Convert DER to PEM - to get size. */ pemSz = wc_DerToPem(der, (word32)derSz, NULL, 0, type); if (pemSz < 0) { - ret = WOLFSSL_FAILURE; + ret = 0; } - if (ret == WOLFSSL_SUCCESS) { + if (ret == 1) { + /* Allocate memory for PEM to be encoded into. */ pem = (byte*)XMALLOC((size_t)pemSz, heap, DYNAMIC_TYPE_TMP_BUFFER); if (pem == NULL) { - ret = WOLFSSL_FAILURE; + ret = 0; } } - if ((ret == WOLFSSL_SUCCESS) && (wc_DerToPem(der, (word32)derSz, pem, - (word32)pemSz, type) < 0)) { - ret = WOLFSSL_FAILURE; + /* Convert DER to PEM. */ + if ((ret == 1) && (wc_DerToPem(der, (word32)derSz, pem, (word32)pemSz, + type) < 0)) { + ret = 0; XFREE(pem, heap, DYNAMIC_TYPE_TMP_BUFFER); pem = NULL; } @@ -273,8 +272,8 @@ * @param [in] derSz Size of DER data in bytes. * @param [in, out] bio BIO object to write with. * @param [in] type Type of key being encoded. - * @return WOLFSSL_FAILURE on error. - * @return WOLFSSL_SUCCESS on success. + * @return 1 on success. + * @return 0 on error. */ static int der_write_to_bio_as_pem(const unsigned char* der, int derSz, WOLFSSL_BIO* bio, int type) @@ -284,11 +283,11 @@ byte* pem = NULL; ret = der_to_pem_alloc(der, derSz, type, bio->heap, &pem, &pemSz); - if (ret == WOLFSSL_SUCCESS) { + if (ret == 1) { int len = wolfSSL_BIO_write(bio, pem, pemSz); if (len != pemSz) { WOLFSSL_ERROR_MSG("Unable to write full PEM to BIO"); - ret = WOLFSSL_FAILURE; + ret = 0; } } @@ -298,8 +297,7 @@ #endif #endif -#if (!defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_USER_RSA)) || \ +#if (!defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)) || \ (!defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)) || \ (defined(HAVE_ECC) && defined(WOLFSSL_KEY_GEN)) #if !defined(NO_FILESYSTEM) @@ -310,8 +308,8 @@ * @param [in] fp File pointer to write with. * @param [in] type Type of key being encoded. * @param [in] heap Heap hint for dynamic memory allocation. - * @return WOLFSSL_FAILURE on error. - * @return WOLFSSL_SUCCESS on success. + * @return 1 on success. + * @return 0 on error. */ static int der_write_to_file_as_pem(const unsigned char* der, int derSz, XFILE fp, int type, void* heap) @@ -321,11 +319,11 @@ byte* pem = NULL; ret = der_to_pem_alloc(der, derSz, type, heap, &pem, &pemSz); - if (ret == WOLFSSL_SUCCESS) { + if (ret == 1) { int len = (int)XFWRITE(pem, 1, (size_t)pemSz, fp); if (len != pemSz) { WOLFSSL_ERROR_MSG("Unable to write full PEM to BIO"); - ret = WOLFSSL_FAILURE; + ret = 0; } } @@ -335,9 +333,153 @@ #endif #endif +#if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER) +/* Encrypt private key into PEM format. + * + * DER is encrypted in place. + * + * @param [in] der DER encoding of private key. + * @param [in] derSz Size of DER in bytes. + * @param [in] cipher EVP cipher. + * @param [in] passwd Password to use with encryption. + * @param [in] passedSz Size of password in bytes. + * @param [out] cipherInfo PEM cipher information lines. + * @param [in] maxDerSz Maximum size of DER buffer. + * @return 1 on success. + * @return 0 on error. + */ +int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher, + unsigned char* passwd, int passwdSz, byte **cipherInfo, int maxDerSz) +{ + int ret = 0; + int paddingSz = 0; + word32 idx; + word32 cipherInfoSz; +#ifdef WOLFSSL_SMALL_STACK + EncryptedInfo* info = NULL; +#else + EncryptedInfo info[1]; +#endif + + WOLFSSL_ENTER("EncryptDerKey"); + + /* Validate parameters. */ + if ((der == NULL) || (derSz == NULL) || (cipher == NULL) || + (passwd == NULL) || (cipherInfo == NULL)) { + ret = BAD_FUNC_ARG; + } + + #ifdef WOLFSSL_SMALL_STACK + if (ret == 0) { + /* Allocate encrypted info. */ + info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL, + DYNAMIC_TYPE_ENCRYPTEDINFO); + if (info == NULL) { + WOLFSSL_MSG("malloc failed"); + ret = 0; + } + } + #endif + if (ret == 0) { + /* Clear the encrypted info and set name. */ + XMEMSET(info, 0, sizeof(EncryptedInfo)); + XSTRNCPY(info->name, cipher, NAME_SZ - 1); + info->name[NAME_SZ - 1] = '\0'; /* null term */ + + /* Get encrypted info from name. */ + ret = wc_EncryptedInfoGet(info, info->name); + if (ret != 0) { + WOLFSSL_MSG("unsupported cipher"); + } + } + + if (ret == 0) { + /* Generate a random salt. */ + if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != 1) { + WOLFSSL_MSG("generate iv failed"); + ret = -1; + } + } + + if (ret == 0) { + /* Calculate padding size - always a padding block. */ + paddingSz = info->ivSz - ((*derSz) % info->ivSz); + /* Check der is big enough. */ + if (maxDerSz < (*derSz) + paddingSz) { + WOLFSSL_MSG("not enough DER buffer allocated"); + ret = BAD_FUNC_ARG; + } + } + if (ret == 0) { + /* Set padding bytes to padding length. */ + XMEMSET(der + (*derSz), (byte)paddingSz, paddingSz); + /* Add padding to DER size. */ + (*derSz) += (int)paddingSz; + + /* Encrypt DER buffer. */ + ret = wc_BufferKeyEncrypt(info, der, (word32)*derSz, passwd, passwdSz, WC_MD5); + if (ret != 0) { + WOLFSSL_MSG("encrypt key failed"); + } + } + + if (ret == 0) { + /* Create cipher info : 'cipher_name,Salt(hex)' */ + cipherInfoSz = (word32)(2 * info->ivSz + XSTRLEN(info->name) + 2); + /* Allocate memory for PEM encryption lines. */ + *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL, DYNAMIC_TYPE_STRING); + if (*cipherInfo == NULL) { + WOLFSSL_MSG("malloc failed"); + ret = MEMORY_E; + } + } + if (ret == 0) { + /* Copy in name and add on comma. */ + XSTRLCPY((char*)*cipherInfo, info->name, cipherInfoSz); + XSTRLCAT((char*)*cipherInfo, ",", cipherInfoSz); + + /* Find end of string. */ + idx = (word32)XSTRLEN((char*)*cipherInfo); + /* Calculate remaining bytes. */ + cipherInfoSz -= idx; + + /* Encode IV into PEM encryption lines. */ + ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo + idx, + &cipherInfoSz); + if (ret != 0) { + WOLFSSL_MSG("Base16_Encode failed"); + XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING); + *cipherInfo = NULL; + } + } + +#ifdef WOLFSSL_SMALL_STACK + /* Free dynamically allocated info. */ + XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO); +#endif + return ret == 0; +} +#endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */ + + #if defined(WOLFSSL_KEY_GEN) && \ (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)) && \ - ((!defined(NO_RSA) && !defined(HAVE_USER_RSA)) || defined(HAVE_ECC)) + (!defined(NO_RSA) || defined(HAVE_ECC)) +/* Encrypt the DER in PEM format. + * + * @param [in] der DER encoded private key. + * @param [in] derSz Size of DER in bytes. + * @param [in] cipher EVP cipher. + * @param [in] passwd Password to use in encryption. + * @param [in] passwdSz Size of password in bytes. + * @param [in] type PEM type of write out. + * @param [in] heap Dynamic memory hint. + * @param [out] out Allocated buffer containing PEM encoding. + * heap was NULL and dynamic type is DYNAMIC_TYPE_KEY. + * @param [out] outSz Size of PEM encoding in bytes. + * @return 1 on success. + * @return 0 on failure. + */ static int der_to_enc_pem_alloc(unsigned char* der, int derSz, const EVP_CIPHER *cipher, unsigned char *passwd, int passwdSz, int type, void* heap, byte** out, int* outSz) @@ -532,8 +674,7 @@ #endif /* !NO_CERTS && XFPRINTF && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM && * (!NO_DSA || !NO_RSA || HAVE_ECC) */ -#if defined(XSNPRINTF) && !defined(NO_BIO) && !defined(NO_RSA) && \ - !defined(HAVE_FAST_RSA) +#if defined(XSNPRINTF) && !defined(NO_BIO) && !defined(NO_RSA) /* snprintf() must be available */ /* Maximum number of extra indent spaces on each line. */ @@ -737,10 +878,13 @@ return ret; } -#endif /* XSNPRINTF && !NO_BIO && !NO_RSA && !HAVE_FAST_RSA */ +#endif /* XSNPRINTF && !NO_BIO && !NO_RSA */ + +#endif /* OPENSSL_EXTRA */ -#if !defined(NO_RSA) || (!defined(NO_DH) && !defined(NO_CERTS) && \ - defined(HAVE_FIPS) && !FIPS_VERSION_GT(2,0)) || defined(HAVE_ECC) +#if !defined(NO_CERTS) || (defined(OPENSSL_EXTRA) && (!defined(NO_RSA) || \ + (!defined(NO_DH) && defined(HAVE_FIPS) && !FIPS_VERSION_GT(2,0)) || \ + defined(HAVE_ECC))) /* Uses the DER SEQUENCE to determine size of DER data. * @@ -768,9 +912,7 @@ return ret; } -#endif /* !NO_RSA */ - -#endif /* OPENSSL_EXTRA */ +#endif /******************************************************************************* * START OF RSA API @@ -825,6 +967,7 @@ if (err) { /* meth->name won't be allocated on error. */ XFREE(meth, NULL, DYNAMIC_TYPE_OPENSSL); + meth = NULL; } return meth; } @@ -921,8 +1064,7 @@ #endif if (rsa->internal != NULL) { - #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \ - !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING) + #if !defined(HAVE_FIPS) && defined(WC_RSA_BLINDING) /* Check if RNG is owned before freeing it. */ if (rsa->ownRng) { WC_RNG* rng = ((RsaKey*)(rsa->internal))->rng; @@ -1021,8 +1163,7 @@ rsaKeyInited = 1; } } - #if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && \ - !defined(HAVE_FAST_RSA) && defined(WC_RSA_BLINDING) + #if !defined(HAVE_FIPS) && defined(WC_RSA_BLINDING) if (!err) { WC_RNG* rng; @@ -1051,8 +1192,7 @@ /* Won't fail as key and rng are not NULL. */ } } - #endif /* !HAVE_FIPS && !HAVE_USER_RSA && !HAVE_FAST_RSA && - * WC_RSA_BLINDING */ + #endif /* !HAVE_FIPS && WC_RSA_BLINDING */ if (!err) { /* Set wolfCrypt RSA key into RSA key. */ rsa->internal = key; @@ -1104,7 +1244,7 @@ #ifdef OPENSSL_EXTRA -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) /* Allocate a new RSA key and make it a copy. * @@ -1160,12 +1300,10 @@ /* wolfSSL_RSAPrivateKey_dup not supported */ -#endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA */ +#endif /* WOLFSSL_KEY_GEN */ -#ifndef HAVE_USER_RSA static int wolfSSL_RSA_To_Der_ex(WOLFSSL_RSA* rsa, byte** outBuf, int publicKey, void* heap); -#endif /* * RSA to/from bin APIs @@ -1269,8 +1407,6 @@ return rsa; } -#if defined(OPENSSL_EXTRA) && !defined(HAVE_USER_RSA) && \ - !defined(HAVE_FAST_RSA) /* Converts an internal RSA structure to DER format for the private key. * * If "pp" is null then buffer size only is returned. @@ -1344,8 +1480,6 @@ return ret; } -#endif /* defined(OPENSSL_EXTRA) && !defined(HAVE_USER_RSA) && - * !defined(HAVE_FAST_RSA) */ #endif /* OPENSSL_EXTRA */ @@ -1358,8 +1492,7 @@ #if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) \ || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && \ - !defined(HAVE_FAST_RSA) && !defined(NO_BIO) +#if defined(WOLFSSL_KEY_GEN) && !defined(NO_BIO) /* Read DER data from a BIO. * @@ -1463,8 +1596,7 @@ XFREE(der, bio ? bio->heap : NULL, DYNAMIC_TYPE_TMP_BUFFER); return key; } -#endif /* defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && - * !defined(HAVE_FAST_RSA) && !NO_BIO */ +#endif /* defined(WOLFSSL_KEY_GEN) && !NO_BIO */ #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */ @@ -1474,7 +1606,6 @@ #ifdef OPENSSL_EXTRA -#ifndef HAVE_USER_RSA /* Create a DER encoding of key. * * Not OpenSSL API. @@ -1611,7 +1742,6 @@ WOLFSSL_LEAVE("wolfSSL_RSA_To_Der", ret); return ret; } -#endif /* !HAVE_USER_RSA */ #endif /* OPENSSL_EXTRA */ @@ -1674,7 +1804,7 @@ rsa->pkcs8HeaderSz = (word16)idx; } /* When decoding and not PKCS#8, return will be ASN_PARSE_E. */ - else if (res != ASN_PARSE_E) { + else if (res != WC_NO_ERR_TRACE(ASN_PARSE_E)) { /* Something went wrong while decoding. */ WOLFSSL_ERROR_MSG("Unexpected error with trying to remove PKCS#8 " "header"); @@ -1771,7 +1901,7 @@ #ifdef OPENSSL_EXTRA #ifndef NO_BIO -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) /* Writes PEM encoding of an RSA public key to a BIO. * * @param [in] bio BIO object to write to. @@ -1802,7 +1932,7 @@ ret = 0; } if ((ret == 1) && (der_write_to_bio_as_pem(derBuf, derSz, bio, - PUBLICKEY_TYPE) != WOLFSSL_SUCCESS)) { + PUBLICKEY_TYPE) != 1)) { ret = 0; } @@ -1811,10 +1941,10 @@ return ret; } -#endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA */ +#endif /* WOLFSSL_KEY_GEN */ #endif /* !NO_BIO */ -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) #ifndef NO_FILESYSTEM /* Writes PEM encoding of an RSA public key to a file pointer. @@ -1847,7 +1977,7 @@ ret = 0; } if ((ret == 1) && (der_write_to_file_as_pem(derBuf, derSz, fp, type, - rsa->heap) != WOLFSSL_SUCCESS)) { + rsa->heap) != 1)) { ret = 0; } @@ -1885,7 +2015,7 @@ return wolfssl_pem_write_rsa_public_key(fp, rsa, RSA_PUBLICKEY_TYPE); } #endif /* !NO_FILESYSTEM */ -#endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA */ +#endif /* WOLFSSL_KEY_GEN */ #ifndef NO_BIO /* Create an RSA public key by reading the PEM encoded data from the BIO. @@ -1982,7 +2112,7 @@ #endif /* NO_FILESYSTEM */ -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && \ +#if defined(WOLFSSL_KEY_GEN) && \ (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)) /* Writes PEM encoding of an RSA private key to newly allocated buffer. @@ -2109,7 +2239,7 @@ { int ret = 1; byte* pem = NULL; - int pLen; + int pLen = 0; (void)cb; (void)arg; @@ -2141,7 +2271,7 @@ return ret; } #endif /* NO_FILESYSTEM */ -#endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA && WOLFSSL_PEM_TO_DER */ +#endif /* WOLFSSL_KEY_GEN && WOLFSSL_PEM_TO_DER */ #ifndef NO_BIO /* Create an RSA private key by reading the PEM encoded data from the BIO. @@ -2289,7 +2419,7 @@ } #endif /* XFPRINTF && !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */ -#if defined(XSNPRINTF) && !defined(NO_BIO) && !defined(HAVE_FAST_RSA) +#if defined(XSNPRINTF) && !defined(NO_BIO) /* snprintf() must be available */ /* Maximum size of a header line. */ @@ -2397,7 +2527,7 @@ return ret; } -#endif /* XSNPRINTF && !NO_BIO && !HAVE_FAST_RSA */ +#endif /* XSNPRINTF && !NO_BIO */ #endif /* OPENSSL_EXTRA */ @@ -2406,7 +2536,6 @@ */ #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) -#if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) /* Set RSA key data (external) from wolfCrypt RSA key (internal). * * @param [in, out] rsa RSA key. @@ -2499,12 +2628,10 @@ return ret; } -#endif /* !HAVE_USER_RSA && !HAVE_FAST_RSA */ #endif /* (OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL) */ #ifdef OPENSSL_EXTRA -#if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) /* Set wolfCrypt RSA key data (internal) from RSA key (external). * * @param [in, out] rsa RSA key. @@ -2577,7 +2704,7 @@ } /* Copy down d mod q-1 if available. */ - if ((ret == 1) && (rsa->dmp1 != NULL) && + if ((ret == 1) && (rsa->dmq1 != NULL) && (wolfssl_bn_get_value(rsa->dmq1, &key->dQ) != 1)) { WOLFSSL_ERROR_MSG("rsa dQ key error"); ret = -1; @@ -2600,8 +2727,6 @@ return ret; } -#endif /* HAVE_USER_RSA */ - /* Set the RSA method into object. * * @param [in, out] rsa RSA key. @@ -2678,8 +2803,6 @@ return ret; } -#ifndef HAVE_USER_RSA - /* Get the BN objects that are the Chinese-Remainder Theorem (CRT) parameters. * * Only for those that are not NULL parameters. @@ -2751,6 +2874,15 @@ /* Set the values into the wolfCrypt RSA key. */ if (SetRsaInternal(rsa) != 1) { + if (dmp1 != NULL) { + rsa->dmp1 = NULL; + } + if (dmq1 != NULL) { + rsa->dmq1 = NULL; + } + if (iqmp != NULL) { + rsa->iqmp = NULL; + } ret = 0; } } @@ -2815,6 +2947,12 @@ /* Set the values into the wolfCrypt RSA key. */ if (SetRsaInternal(rsa) != 1) { + if (p != NULL) { + rsa->p = NULL; + } + if (q != NULL) { + rsa->q = NULL; + } ret = 0; } } @@ -2890,6 +3028,15 @@ /* Set the values into the wolfCrypt RSA key. */ if (SetRsaInternal(rsa) != 1) { + if (n != NULL) { + rsa->n = NULL; + } + if (e != NULL) { + rsa->e = NULL; + } + if (d != NULL) { + rsa->d = NULL; + } ret = 0; } } @@ -2897,8 +3044,6 @@ return ret; } -#endif /* !HAVE_USER_RSA */ - /* Get the flags of the RSA key. * * @param [in] rsa RSA key. @@ -3063,7 +3208,6 @@ * RSA generate APIs */ -#if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) /* Get a random number generator associated with the RSA key. * * If not able, then get the global if possible. @@ -3106,7 +3250,6 @@ return rng; } -#endif /* Use the wolfCrypt RSA APIs to generate a new RSA key. * @@ -3241,7 +3384,7 @@ ret = wolfssl_rsa_generate_key_native(rsa, bits, bn, NULL); #ifdef HAVE_FIPS /* Keep trying if failed to find a prime. */ - if (ret == PRIME_GEN_E) { + if (ret == WC_NO_ERR_TRACE(PRIME_GEN_E)) { continue; } #endif @@ -3292,7 +3435,7 @@ int gen_ret = wolfssl_rsa_generate_key_native(rsa, bits, e, cb); #ifdef HAVE_FIPS /* Keep trying again if public key value didn't work. */ - if (gen_ret == PRIME_GEN_E) { + if (gen_ret == WC_NO_ERR_TRACE(PRIME_GEN_E)) { continue; } #endif @@ -3421,7 +3564,7 @@ if (ret == 1) { /* Get length of RSA key - encrypted message length. */ emLen = wolfSSL_RSA_size(rsa); - if (ret <= 0) { + if (emLen <= 0) { WOLFSSL_ERROR_MSG("wolfSSL_RSA_size error"); ret = 0; } @@ -3531,13 +3674,16 @@ if (ret == 1) { /* Calculate the salt length to use for special cases. */ - /* TODO: use special case wolfCrypt values. */ switch (saltLen) { /* Negative saltLen values are treated differently */ case RSA_PSS_SALTLEN_DIGEST: saltLen = hashLen; break; - case RSA_PSS_SALTLEN_MAX_SIGN: + case RSA_PSS_SALTLEN_AUTO: + #ifdef WOLFSSL_PSS_SALT_LEN_DISCOVER + saltLen = RSA_PSS_SALT_LEN_DISCOVER; + break; + #endif case RSA_PSS_SALTLEN_MAX: #ifdef WOLFSSL_PSS_LONG_SALT saltLen = emLen - hashLen - 2; @@ -3624,8 +3770,6 @@ #if defined(OPENSSL_EXTRA) -#if !defined(HAVE_USER_RSA) - /* Encode the message hash. * * Used by signing and verification. @@ -4054,8 +4198,6 @@ * RSA public/private encrypt/decrypt APIs */ -#if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) - /* Encrypt with the RSA public key. * * Return compliant with OpenSSL. @@ -4453,7 +4595,6 @@ WOLFSSL_LEAVE("wolfSSL_RSA_private_encrypt", ret); return ret; } -#endif /* !HAVE_USER_RSA && !HAVE_FAST_RSA */ /* * RSA misc operation APIs @@ -4553,7 +4694,6 @@ return ret; } -#endif /* !HAVE_USER_RSA */ #ifndef NO_WOLFSSL_STUB /* Enable blinding for RSA key operations. @@ -5038,15 +5178,19 @@ WOLFSSL_ENTER("wolfSSL_DSA_set0_key"); /* The private key may be NULL */ - if (pub_key == NULL) { + if (d->pub_key == NULL && pub_key == NULL) { WOLFSSL_MSG("Bad parameter"); return 0; } - wolfSSL_BN_free(d->pub_key); - wolfSSL_BN_free(d->priv_key); - d->pub_key = pub_key; - d->priv_key = priv_key; + if (pub_key != NULL) { + wolfSSL_BN_free(d->pub_key); + d->pub_key = pub_key; + } + if (priv_key != NULL) { + wolfSSL_BN_free(d->priv_key); + d->priv_key = priv_key; + } return 1; } @@ -5469,7 +5613,7 @@ } #endif /* !HAVE_SELFTEST */ -WOLFSSL_API int wolfSSL_i2d_DSAparams(const WOLFSSL_DSA* dsa, +int wolfSSL_i2d_DSAparams(const WOLFSSL_DSA* dsa, unsigned char** out) { int ret = 0; @@ -5486,7 +5630,7 @@ if (ret == 0) { key = (DsaKey*)dsa->internal; ret = wc_DsaKeyToParamsDer_ex(key, NULL, &derLen); - if (ret == LENGTH_ONLY_E) { + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { ret = 0; } } @@ -5578,99 +5722,115 @@ * Returns 1 or 0 */ int wolfSSL_PEM_write_bio_DSAPrivateKey(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa, - const EVP_CIPHER* cipher, - unsigned char* passwd, int len, - wc_pem_password_cb* cb, void* arg) + const EVP_CIPHER* cipher, unsigned char* passwd, int passwdSz, + wc_pem_password_cb* cb, void* arg) { - int ret = 0, der_max_len = 0, derSz = 0; - byte *derBuf; - WOLFSSL_EVP_PKEY* pkey; + int ret = 1; + byte *pem = NULL; + int pLen = 0; WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSAPrivateKey"); - if (bio == NULL || dsa == NULL) { + (void)cb; + (void)arg; + + /* Validate parameters. */ + if ((bio == NULL) || (dsa == NULL)) { WOLFSSL_MSG("Bad Function Arguments"); - return 0; + ret = 0; } - pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap); - if (pkey == NULL) { - WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed"); - return 0; + if (ret == 1) { + ret = wolfSSL_PEM_write_mem_DSAPrivateKey(dsa, cipher, passwd, passwdSz, + &pem, &pLen); } - pkey->type = EVP_PKEY_DSA; - pkey->dsa = dsa; - pkey->ownDsa = 0; + /* Write PEM to BIO. */ + if ((ret == 1) && (wolfSSL_BIO_write(bio, pem, pLen) != pLen)) { + WOLFSSL_ERROR_MSG("DSA private key BIO write failed"); + ret = 0; + } - /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */ - der_max_len = MAX_DSA_PRIVKEY_SZ; + XFREE(pem, NULL, DYNAMIC_TYPE_KEY); + return ret; +} - derBuf = (byte*)XMALLOC((size_t)der_max_len, bio->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (derBuf == NULL) { - WOLFSSL_MSG("Malloc failed"); - wolfSSL_EVP_PKEY_free(pkey); - return 0; - } +#ifndef HAVE_SELFTEST +/* Encode the DSA public key as DER. + * + * @param [in] key DSA key to encode. + * @param [out] der Pointer through which buffer is returned. + * @param [in] heap Heap hint. + * @return Size of encoding on success. + * @return 0 on error. + */ +static int wolfssl_dsa_key_to_pubkey_der(WOLFSSL_DSA* key, unsigned char** der, + void* heap) +{ + int sz; + unsigned char* buf = NULL; - /* convert key to der format */ - derSz = wc_DsaKeyToDer((DsaKey*)dsa->internal, derBuf, (word32)der_max_len); - if (derSz < 0) { - WOLFSSL_MSG("wc_DsaKeyToDer failed"); - XFREE(derBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); - wolfSSL_EVP_PKEY_free(pkey); - return 0; + /* Use maximum encoded size to allocate. */ + sz = MAX_DSA_PUBKEY_SZ; + /* Allocate memory to hold encoding. */ + buf = (byte*)XMALLOC((size_t)sz, heap, DYNAMIC_TYPE_TMP_BUFFER); + if (buf == NULL) { + WOLFSSL_MSG("malloc failed"); + sz = 0; } - - pkey->pkey.ptr = (char*)XMALLOC((size_t)derSz, bio->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (pkey->pkey.ptr == NULL) { - WOLFSSL_MSG("key malloc failed"); - XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - wolfSSL_EVP_PKEY_free(pkey); - return 0; + if (sz > 0) { + /* Encode public key to DER using wolfSSL. */ + sz = wc_DsaKeyToPublicDer((DsaKey*)key->internal, buf, (word32)sz); + if (sz < 0) { + WOLFSSL_MSG("wc_DsaKeyToPublicDer failed"); + sz = 0; + } } - /* add der info to the evp key */ - pkey->pkey_sz = derSz; - XMEMCPY(pkey->pkey.ptr, derBuf, (size_t)derSz); - XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - - ret = wolfSSL_PEM_write_bio_PrivateKey(bio, pkey, cipher, passwd, len, - cb, arg); - wolfSSL_EVP_PKEY_free(pkey); + /* Return buffer on success. */ + if (sz > 0) { + *der = buf; + } + else { + /* Dispose of any dynamically allocated data not returned. */ + XFREE(buf, heap, DYNAMIC_TYPE_TMP_BUFFER); + } - return ret; + return sz; } -#ifndef HAVE_SELFTEST /* Takes a DSA public key and writes it out to a WOLFSSL_BIO * Returns 1 or 0 */ int wolfSSL_PEM_write_bio_DSA_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_DSA* dsa) { - int ret = 0; - WOLFSSL_EVP_PKEY* pkey; + int ret = 1; + unsigned char* derBuf = NULL; + int derSz = 0; + WOLFSSL_ENTER("wolfSSL_PEM_write_bio_DSA_PUBKEY"); - if (bio == NULL || dsa == NULL) { - WOLFSSL_MSG("Bad function arguments"); + /* Validate parameters. */ + if ((bio == NULL) || (dsa == NULL)) { + WOLFSSL_MSG("Bad Function Arguments"); return 0; } - pkey = wolfSSL_EVP_PKEY_new_ex(bio->heap); - if (pkey == NULL) { - WOLFSSL_MSG("wolfSSL_EVP_PKEY_new_ex failed"); - return 0; + /* Encode public key in EC key as DER. */ + derSz = wolfssl_dsa_key_to_pubkey_der(dsa, &derBuf, bio->heap); + if (derSz == 0) { + ret = 0; } - pkey->type = EVP_PKEY_DSA; - pkey->dsa = dsa; - pkey->ownDsa = 0; + /* Write out to BIO the PEM encoding of the DSA public key. */ + if ((ret == 1) && (der_write_to_bio_as_pem(derBuf, derSz, bio, + PUBLICKEY_TYPE) != 1)) { + ret = 0; + } + + /* Dispose of any dynamically allocated data. */ + XFREE(derBuf, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - ret = pem_write_bio_pubkey(bio, pkey); - wolfSSL_EVP_PKEY_free(pkey); return ret; } #endif /* HAVE_SELFTEST */ @@ -7306,7 +7466,7 @@ *out += len; } /* An error occurred unless only length returned. */ - else if (ret != LENGTH_ONLY_E) { + else if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { err = 1; } } @@ -7456,7 +7616,7 @@ } if (memAlloced) { /* PEM data no longer needed. */ - XFREE(pem, NULL, DYNAMIC_TYPE_PEM); + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); } if (!err) { @@ -7598,7 +7758,7 @@ int err = 0; byte* der = NULL; word32 derSz; - DhKey* key; + DhKey* key = NULL; (void)heap; @@ -7611,7 +7771,7 @@ /* Use wolfSSL API to get length of DER encode DH parameters. */ key = (DhKey*)dh->internal; ret = wc_DhParamsToDer(key, NULL, &derSz); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { WOLFSSL_ERROR_MSG("Failed to get size of DH params"); err = 1; } @@ -7682,7 +7842,7 @@ } } if ((ret == 1) && (der_write_to_file_as_pem(derBuf, derSz, fp, - DH_PARAM_TYPE, NULL) != WOLFSSL_SUCCESS)) { + DH_PARAM_TYPE, NULL) != 1)) { ret = 0; } @@ -7930,10 +8090,10 @@ * free'd with a call to wolfSSL_DH_free -- not individually. * * @param [in, out] dh DH key to set. - * @parma [in] p Prime value to set. May be NULL when value already + * @param [in] p Prime value to set. May be NULL when value already * present. - * @parma [in] q Order value to set. May be NULL. - * @parma [in] g Generator value to set. May be NULL when value already + * @param [in] q Order value to set. May be NULL. + * @param [in] g Generator value to set. May be NULL when value already * present. * @return 1 on success. * @return 0 on failure. @@ -8233,7 +8393,7 @@ /* Generate DH parameters. * * @param [in] prime_len Length of prime in bits. - * @param [in] generator Gnerator value to use. + * @param [in] generator Generator value to use. * @param [in] callback Called with progress information. Unused. * @param [in] cb_arg User callback argument. Unused. * @return NULL on failure. @@ -8268,7 +8428,7 @@ * * @param [in] dh DH key to generate parameters into. * @param [in] prime_len Length of prime in bits. - * @param [in] generator Gnerator value to use. + * @param [in] generator Generator value to use. * @param [in] callback Called with progress information. Unused. * @param [in] cb_arg User callback argument. Unused. * @return 0 on failure. @@ -8278,7 +8438,7 @@ int generator, void (*callback) (int, int, void *)) { int ret = 1; - DhKey* key; + DhKey* key = NULL; #ifdef WOLFSSL_SMALL_STACK WC_RNG* tmpRng = NULL; #else @@ -8500,7 +8660,7 @@ word32 keySz = 0; int pubSz = MAX_DHKEY_SZ; int privSz = MAX_DHKEY_SZ; - int sz; + int sz = 0; #ifdef WOLFSSL_SMALL_STACK unsigned char* pub = NULL; unsigned char* priv = NULL; @@ -8570,7 +8730,7 @@ if (ret == 0) { /* Get the public key into the array. */ pubSz = wolfSSL_BN_bn2bin(otherPub, pub); - if (privSz <= 0) { + if (pubSz <= 0) { ret = -1; } } @@ -8790,6 +8950,10 @@ return NID_brainpoolP384r1; case ECC_BRAINPOOLP512R1: return NID_brainpoolP512r1; + #ifdef WOLFSSL_SM2 + case ECC_SM2P256V1: + return NID_sm2; + #endif default: WOLFSSL_MSG("NID not found"); return -1; @@ -9682,27 +9846,27 @@ WOLFSSL_ENTER("wolfSSL_EC_POINT_dump"); - /* Only print when debugging on and logging callback set. */ - if (WOLFSSL_IS_DEBUG_ON() && (wolfSSL_GetLoggingCb() == NULL)) { + /* Only print when debugging on. */ + if (WOLFSSL_IS_DEBUG_ON()) { if (point == NULL) { /* No point passed in so just put out "NULL". */ - XFPRINTF(stderr, "%s = NULL\n", msg); + WOLFSSL_MSG_EX("%s = NULL\n", msg); } else { /* Put out message and status of internal/external data set. */ - XFPRINTF(stderr, "%s:\n\tinSet=%d, exSet=%d\n", msg, point->inSet, + WOLFSSL_MSG_EX("%s:\n\tinSet=%d, exSet=%d\n", msg, point->inSet, point->exSet); /* Get x-ordinate as a hex string and print. */ num = wolfSSL_BN_bn2hex(point->X); - XFPRINTF(stderr, "\tX = %s\n", num); + WOLFSSL_MSG_EX("\tX = %s\n", num); XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL); /* Get x-ordinate as a hex string and print. */ num = wolfSSL_BN_bn2hex(point->Y); - XFPRINTF(stderr, "\tY = %s\n", num); + WOLFSSL_MSG_EX("\tY = %s\n", num); XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL); /* Get z-ordinate as a hex string and print. */ num = wolfSSL_BN_bn2hex(point->Z); - XFPRINTF(stderr, "\tZ = %s\n", num); + WOLFSSL_MSG_EX("\tZ = %s\n", num); XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL); } } @@ -9712,7 +9876,6 @@ #endif } -#ifndef HAVE_SELFTEST /* Convert EC point to hex string that as either uncompressed or compressed. * * ECC point compression types were not included in selftest ecc.h @@ -9825,7 +9988,100 @@ return hex; } -#endif /* HAVE_SELFTEST */ +static size_t hex_to_bytes(const char *hex, unsigned char *output, size_t sz) +{ + word32 i; + for (i = 0; i < sz; i++) { + signed char ch1, ch2; + ch1 = HexCharToByte(hex[i * 2]); + ch2 = HexCharToByte(hex[i * 2 + 1]); + if ((ch1 < 0) || (ch2 < 0)) { + WOLFSSL_MSG("hex_to_bytes: syntax error"); + return 0; + } + output[i] = (unsigned char)((ch1 << 4) + ch2); + } + return sz; +} + +WOLFSSL_EC_POINT* wolfSSL_EC_POINT_hex2point(const EC_GROUP *group, + const char *hex, WOLFSSL_EC_POINT*p, WOLFSSL_BN_CTX *ctx) +{ + /* for uncompressed mode */ + size_t str_sz; + BIGNUM *Gx = NULL; + BIGNUM *Gy = NULL; + char strGx[MAX_ECC_BYTES * 2 + 1]; + + /* for compressed mode */ + int key_sz; + byte *octGx = (byte *)strGx; /* octGx[MAX_ECC_BYTES] */ + + int p_alloc = 0; + int ret; + + WOLFSSL_ENTER("wolfSSL_EC_POINT_hex2point"); + + if (group == NULL || hex == NULL || ctx == NULL) + return NULL; + + if (p == NULL) { + if ((p = wolfSSL_EC_POINT_new(group)) == NULL) { + WOLFSSL_MSG("wolfSSL_EC_POINT_new"); + goto err; + } + p_alloc = 1; + } + + key_sz = (wolfSSL_EC_GROUP_get_degree(group) + 7) / 8; + if (hex[0] == '0' && hex[1] == '4') { /* uncompressed mode */ + str_sz = key_sz * 2; + + XMEMSET(strGx, 0x0, str_sz + 1); + XMEMCPY(strGx, hex + 2, str_sz); + + if (wolfSSL_BN_hex2bn(&Gx, strGx) == 0) + goto err; + + if (wolfSSL_BN_hex2bn(&Gy, hex + 2 + str_sz) == 0) + goto err; + + ret = wolfSSL_EC_POINT_set_affine_coordinates_GFp + (group, p, Gx, Gy, ctx); + + if (ret != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp"); + goto err; + } + } + else if (hex[0] == '0' && (hex[1] == '2' || hex[1] == '3')) { + size_t sz = XSTRLEN(hex + 2) / 2; + /* compressed mode */ + octGx[0] = ECC_POINT_COMP_ODD; + if (hex_to_bytes(hex + 2, octGx + 1, sz) != sz) { + goto err; + } + if (wolfSSL_ECPoint_d2i(octGx, key_sz + 1, group, p) + != WOLFSSL_SUCCESS) { + goto err; + } + } + else + goto err; + + wolfSSL_BN_free(Gx); + wolfSSL_BN_free(Gy); + return p; + +err: + wolfSSL_BN_free(Gx); + wolfSSL_BN_free(Gy); + if (p_alloc) { + EC_POINT_free(p); + } + return NULL; + +} /* Encode the EC point as an uncompressed point in DER. * @@ -9868,7 +10124,8 @@ int ret = wc_ecc_export_point_der(group->curve_idx, (ecc_point*)point->internal, out, len); /* Check return. When out is NULL, return will be length only error. */ - if ((ret != MP_OKAY) && ((out != NULL) || (ret != LENGTH_ONLY_E))) { + if ((ret != MP_OKAY) && ((out != NULL) || + (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)))) { WOLFSSL_MSG("wolfSSL_ECPoint_i2d wc_ecc_export_point_der failed"); res = 0; } @@ -9893,6 +10150,8 @@ const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *point) { int ret = 1; + WOLFSSL_BIGNUM* x = NULL; + WOLFSSL_BIGNUM* y = NULL; WOLFSSL_ENTER("wolfSSL_ECPoint_d2i"); @@ -9929,17 +10188,49 @@ #endif } + if (ret == 1) + point->inSet = 1; + /* Set new external point. */ - if ((ret == 1) && (ec_point_external_set(point) != 1)) { + if (ret == 1 && ec_point_external_set(point) != 1) { WOLFSSL_MSG("ec_point_external_set failed"); ret = 0; } + if (ret == 1 && !wolfSSL_BN_is_one(point->Z)) { +#if !defined(WOLFSSL_SP_MATH) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) + x = wolfSSL_BN_new(); + y = wolfSSL_BN_new(); + if (x == NULL || y == NULL) + ret = 0; + + if (ret == 1 && wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, + point, x, y, NULL) != 1) { + WOLFSSL_MSG("wolfSSL_EC_POINT_get_affine_coordinates_GFp failed"); + ret = 0; + } + + /* wolfSSL_EC_POINT_set_affine_coordinates_GFp check that the point is + * on the curve. */ + if (ret == 1 && wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, + point, x, y, NULL) != 1) { + WOLFSSL_MSG("wolfSSL_EC_POINT_set_affine_coordinates_GFp failed"); + ret = 0; + } +#else + WOLFSSL_MSG("Importing non-affine point. This may cause issues in math " + "operations later on."); +#endif + } + if (ret == 1) { /* Dump new point. */ wolfSSL_EC_POINT_dump("d2i p", point); } + wolfSSL_BN_free(x); + wolfSSL_BN_free(y); + return ret; } @@ -10031,6 +10322,14 @@ } } +#if defined(DEBUG_WOLFSSL) + if (!err) { + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_point2oct point", point); + WOLFSSL_MSG("\twolfSSL_EC_POINT_point2oct output:"); + WOLFSSL_BUFFER(buf, enc_len); + } +#endif + /* On error, return encoding length of 0. */ if (err) { enc_len = 0; @@ -10176,15 +10475,15 @@ /* Convert Jacobian ordinates to affine. * * @param [in] group EC group. - * @param [in] point EC point to get co-ordinates from. + * @param [in] point EC point to get coordinates from. * @return 1 on success. * @return 0 on error. */ -static int ec_point_convert_to_affine(const WOLFSSL_EC_GROUP *group, +int ec_point_convert_to_affine(const WOLFSSL_EC_GROUP *group, WOLFSSL_EC_POINT *point) { int err = 0; - mp_digit mp; + mp_digit mp = 0; #ifdef WOLFSSL_SMALL_STACK mp_int* modulus; #else @@ -10241,9 +10540,9 @@ return err; } -/* Get the affine co-ordinates of the EC point on a Prime curve. +/* Get the affine coordinates of the EC point on a Prime curve. * - * When z-ordinate is not one then co-ordinates are Jacobian and need to be + * When z-ordinate is not one then coordinates are Jacobian and need to be * converted to affine before storing in BNs. * * Return code compliant with OpenSSL. @@ -10251,7 +10550,7 @@ * TODO: OpenSSL doesn't change point when Jacobian. Do the same? * * @param [in] group EC group. - * @param [in] point EC point to get co-ordinates from. + * @param [in] point EC point to get coordinates from. * @param [in, out] x BN to hold x-ordinate. * @param [in, out] y BN to hold y-ordinate. * @param [in] ctx Context to use for BN operations. Unused. @@ -10305,10 +10604,10 @@ } #endif /* !WOLFSSL_SP_MATH && !WOLF_CRYPTO_CB_ONLY_ECC */ -/* Sets the affine co-ordinates that belong on a prime curve. +/* Sets the affine coordinates that belong on a prime curve. * * @param [in] group EC group. - * @param [in, out] point EC point to set co-ordinates into. + * @param [in, out] point EC point to set coordinates into. * @param [in] x BN holding x-ordinate. * @param [in] y BN holding y-ordinate. * @param [in] ctx Context to use for BN operations. Unused. @@ -10362,7 +10661,7 @@ WOLFSSL_MSG("wolfSSL_BN_copy failed"); ret = 0; } - /* z-ordinate is one for affine co-ordinates. */ + /* z-ordinate is one for affine coordinates. */ if ((ret == 1) && ((wolfSSL_BN_one(point->Z)) == 0)) { WOLFSSL_MSG("wolfSSL_BN_one failed"); ret = 0; @@ -10393,7 +10692,7 @@ /* Add two points on the same together. * * @param [in] curveIdx Index of curve in ecc_set. - * @oaram [out] r Result point. + * @param [out] r Result point. * @param [in] p1 First point to add. * @param [in] p2 Second point to add. * @return 1 on success. @@ -10526,7 +10825,7 @@ ret = 0; } - /* Map point back to affine co-ordinates. Converts from Montogomery form. */ + /* Map point back to affine coordinates. Converts from Montogomery form. */ if ((ret == 1) && (ecc_map(r, prime, mp) != MP_OKAY)) { WOLFSSL_MSG("ecc_map error"); ret = 0; @@ -10577,6 +10876,20 @@ ret = 0; } +#ifdef DEBUG_WOLFSSL + if (ret == 1) { + int nid = wolfSSL_EC_GROUP_get_curve_name(group); + const char* curve = wolfSSL_OBJ_nid2ln(nid); + const char* nistName = wolfSSL_EC_curve_nid2nist(nid); + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_add p1", p1); + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_add p2", p2); + if (curve != NULL) + WOLFSSL_MSG_EX("curve name: %s", curve); + if (nistName != NULL) + WOLFSSL_MSG_EX("nist curve name: %s", nistName); + } +#endif + if (ret == 1) { /* Add points using wolfCrypt objects. */ ret = wolfssl_ec_point_add(group->curve_idx, (ecc_point*)r->internal, @@ -10589,6 +10902,12 @@ ret = 0; } +#ifdef DEBUG_WOLFSSL + if (ret == 1) { + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_add result", r); + } +#endif + return ret; } @@ -10646,7 +10965,7 @@ WOLFSSL_MSG("wc_ecc_mulmod nqm error"); ret = 0; } - /* Map point back to affine co-ordinates. Converts from Montogomery + /* Map point back to affine coordinates. Converts from Montogomery * form. */ if ((ret == 1) && (ecc_map(r, prime, mp) != MP_OKAY)) { WOLFSSL_MSG("ecc_map nqm error"); @@ -10750,7 +11069,7 @@ if ((ret == 1) && (n != NULL) && (q != NULL) && (m != NULL)) { /* r = base point * n + q * m */ - ec_mul2add(r, r, m, q, n, a, prime); + ret = ec_mul2add(r, r, n, q, m, a, prime); } /* Not all values present, see if we are only doing base point * n. */ else if ((ret == 1) && (n != NULL)) { @@ -10823,6 +11142,26 @@ ret = 0; } +#ifdef DEBUG_WOLFSSL + if (ret == 1) { + int nid = wolfSSL_EC_GROUP_get_curve_name(group); + const char* curve = wolfSSL_OBJ_nid2ln(nid); + const char* nistName = wolfSSL_EC_curve_nid2nist(nid); + char* num; + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_mul input q", q); + num = wolfSSL_BN_bn2hex(n); + WOLFSSL_MSG_EX("\tn = %s", num); + XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL); + num = wolfSSL_BN_bn2hex(m); + WOLFSSL_MSG_EX("\tm = %s", num); + XFREE(num, NULL, DYNAMIC_TYPE_OPENSSL); + if (curve != NULL) + WOLFSSL_MSG_EX("curve name: %s", curve); + if (nistName != NULL) + WOLFSSL_MSG_EX("nist curve name: %s", nistName); + } +#endif + if (ret == 1) { mp_int* ni = (n != NULL) ? (mp_int*)n->internal : NULL; ecc_point* qi = (q != NULL) ? (ecc_point*)q->internal : NULL; @@ -10843,6 +11182,12 @@ ret = 0; } +#ifdef DEBUG_WOLFSSL + if (ret == 1) { + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_mul result", r); + } +#endif + return ret; } #endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A && !HAVE_SELFTEST && @@ -10931,6 +11276,30 @@ ret = 0; } +#ifdef DEBUG_WOLFSSL + if (ret == 1) { + int nid = wolfSSL_EC_GROUP_get_curve_name(group); + const char* curve = wolfSSL_OBJ_nid2ln(nid); + const char* nistName = wolfSSL_EC_curve_nid2nist(nid); + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_invert input", point); + if (curve != NULL) + WOLFSSL_MSG_EX("curve name: %s", curve); + if (nistName != NULL) + WOLFSSL_MSG_EX("nist curve name: %s", nistName); + + } +#endif + + if (ret == 1 && !wolfSSL_BN_is_one(point->Z)) { +#if !defined(WOLFSSL_SP_MATH) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) + if (ec_point_convert_to_affine(group, point) != 0) + ret = 0; +#else + WOLFSSL_MSG("wolfSSL_EC_POINT_invert called on non-affine point"); + ret = 0; +#endif + } + if (ret == 1) { /* Perform inversion using wolfCrypt objects. */ ret = wolfssl_ec_point_invert(group->curve_idx, @@ -10943,6 +11312,12 @@ ret = 0; } +#ifdef DEBUG_WOLFSSL + if (ret == 1) { + wolfSSL_EC_POINT_dump("wolfSSL_EC_POINT_invert result", point); + } +#endif + return ret; } @@ -11428,7 +11803,8 @@ if (ret == 0) { /* Copy private key. */ - ret = mp_copy(wc_ecc_key_get_priv(src), wc_ecc_key_get_priv(dst)); + ret = mp_copy(wc_ecc_key_get_priv((ecc_key*)src), + wc_ecc_key_get_priv(dst)); if (ret != MP_OKAY) { WOLFSSL_MSG("mp_copy error"); } @@ -11884,7 +12260,7 @@ res = 1; } /* Error out on parsing error. */ - else if (ret != ASN_PARSE_E) { + else if (ret != WC_NO_ERR_TRACE(ASN_PARSE_E)) { WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 header"); res = -1; } @@ -11955,13 +12331,10 @@ * EC key PEM APIs */ -#if (defined(WOLFSSL_KEY_GEN) && !defined(NO_FILESYSTEM)) || \ - (!defined(NO_BIO) && (defined(WOLFSSL_KEY_GEN) || \ - defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT))) +#ifdef HAVE_ECC_KEY_EXPORT +#if defined(WOLFSSL_KEY_GEN) && (!defined(NO_FILESYSTEM) || !defined(NO_BIO)) /* Encode the EC public key as DER. * - * Also used by pem_write_pubkey(). - * * @param [in] key EC key to encode. * @param [out] der Pointer through which buffer is returned. * @param [in] heap Heap hint. @@ -12055,6 +12428,7 @@ return ret; } #endif +#endif #ifndef NO_BIO /* Read a PEM encoded EC public key from a BIO. @@ -12181,7 +12555,7 @@ } #endif /* !NO_BIO */ -#if defined(WOLFSSL_KEY_GEN) +#if defined(WOLFSSL_KEY_GEN) && defined(HAVE_ECC_KEY_EXPORT) #ifndef NO_BIO /* Write out the EC public key as PEM to the BIO. * @@ -12210,7 +12584,7 @@ ret = 0; } - /* Write out to BIO the PEM encoding of the EC private key. */ + /* Write out to BIO the PEM encoding of the EC public key. */ if ((ret == 1) && (der_write_to_bio_as_pem(derBuf, derSz, bio, ECC_PUBLICKEY_TYPE) != 1)) { ret = 0; @@ -12413,7 +12787,7 @@ } #endif /* NO_FILESYSTEM */ -#endif /* defined(WOLFSSL_KEY_GEN) */ +#endif /* WOLFSSL_KEY_GEN && HAVE_ECC_KEY_EXPORT */ /* * EC key print APIs @@ -12985,13 +13359,17 @@ /* Check if we know which internal curve index to use. */ if (key->group->curve_idx < 0) { /* Generate key using the default curve. */ +#if FIPS_VERSION3_GE(6,0,0) + key->group->curve_idx = ECC_SECP256R1; /* FIPS default to 256 */ +#else key->group->curve_idx = ECC_CURVE_DEF; +#endif } /* Create a random number generator. */ rng = wolfssl_make_rng(tmpRng, &initTmpRng); if (rng == NULL) { - WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to set RNG"); + WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to make RNG"); res = 0; } } @@ -12999,11 +13377,30 @@ /* NIDToEccEnum returns -1 for invalid NID so if key->group->curve_nid * is 0 then pass ECC_CURVE_DEF as arg */ int eccEnum = key->group->curve_nid ? +#if FIPS_VERSION3_GE(6,0,0) + NIDToEccEnum(key->group->curve_nid) : ECC_SECP256R1; +#else NIDToEccEnum(key->group->curve_nid) : ECC_CURVE_DEF; +#endif /* Get the internal EC key. */ ecc_key* ecKey = (ecc_key*)key->internal; /* Make the key using internal API. */ - int ret = wc_ecc_make_key_ex(rng, 0, ecKey, eccEnum); + int ret = 0; + +#if FIPS_VERSION3_GE(6,0,0) + /* In the case of FIPS only allow key generation with approved curves */ + if (eccEnum != ECC_SECP256R1 && eccEnum != ECC_SECP224R1 && + eccEnum != ECC_SECP384R1 && eccEnum != ECC_SECP521R1) { + WOLFSSL_MSG("Unsupported curve selected in FIPS mode"); + res = 0; + } + if (res == 1) { +#endif + ret = wc_ecc_make_key_ex(rng, 0, ecKey, eccEnum); +#if FIPS_VERSION3_GE(6,0,0) + } +#endif + #if defined(WOLFSSL_ASYNC_CRYPT) /* Wait on asynchronouse operation. */ ret = wc_AsyncWait(ret, &ecKey->asyncDev, WC_ASYNC_FLAG_NONE); @@ -13262,6 +13659,7 @@ int wolfSSL_i2d_ECDSA_SIG(const WOLFSSL_ECDSA_SIG *sig, unsigned char **pp) { word32 len = 0; + int update_p = 1; /* Validate parameter. */ if (sig != NULL) { @@ -13281,6 +13679,17 @@ /* Add in the length of the SEQUENCE. */ len += (word32)1 + ASN_LEN_SIZE(len); + #ifdef WOLFSSL_I2D_ECDSA_SIG_ALLOC + if ((pp != NULL) && (*pp == NULL)) { + *pp = (unsigned char *)XMALLOC(len, NULL, DYNAMIC_TYPE_OPENSSL); + if (*pp != NULL) { + WOLFSSL_MSG("malloc error"); + return 0; + } + update_p = 0; + } + #endif + /* Encode only if there is a buffer to encode into. */ if ((pp != NULL) && (*pp != NULL)) { /* Encode using the internal representations of r and s. */ @@ -13289,7 +13698,7 @@ /* No bytes encoded. */ len = 0; } - else { + else if (update_p) { /* Update pointer to after encoding. */ *pp += len; } @@ -13299,7 +13708,7 @@ return (int)len; } -/* Get the pointer to the feilds of the ECDSA signature. +/* Get the pointer to the fields of the ECDSA signature. * * r and s untouched when sig is NULL. * @@ -13740,6 +14149,79 @@ /* End ECDH */ +#ifndef NO_WOLFSSL_STUB +const WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_OpenSSL(void) +{ + WOLFSSL_STUB("wolfSSL_EC_KEY_OpenSSL"); + + return NULL; +} + +WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_METHOD_new( + const WOLFSSL_EC_KEY_METHOD *meth) +{ + WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_new"); + + (void)meth; + + return NULL; +} + +void wolfSSL_EC_KEY_METHOD_free(WOLFSSL_EC_KEY_METHOD *meth) +{ + WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_free"); + + (void)meth; +} + +void wolfSSL_EC_KEY_METHOD_set_init(WOLFSSL_EC_KEY_METHOD *meth, + void* a1, void* a2, void* a3, void* a4, void* a5, void* a6) +{ + WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_set_init"); + + (void)meth; + (void)a1; + (void)a2; + (void)a3; + (void)a4; + (void)a5; + (void)a6; +} + +void wolfSSL_EC_KEY_METHOD_set_sign(WOLFSSL_EC_KEY_METHOD *meth, + void* a1, void* a2, void* a3) +{ + WOLFSSL_STUB("wolfSSL_EC_KEY_METHOD_set_sign"); + + (void)meth; + (void)a1; + (void)a2; + (void)a3; +} + +const WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_get_method( + const WOLFSSL_EC_KEY *key) +{ + WOLFSSL_STUB("wolfSSL_EC_KEY_get_method"); + + (void)key; + + return NULL; +} + +int wolfSSL_EC_KEY_set_method(WOLFSSL_EC_KEY *key, + const WOLFSSL_EC_KEY_METHOD *meth) +{ + WOLFSSL_STUB("wolfSSL_EC_KEY_set_method"); + + (void)key; + (void)meth; + + return 0; +} + +#endif /* !NO_WOLFSSL_STUB */ + #endif /* OPENSSL_EXTRA */ #endif /* HAVE_ECC */ @@ -13748,5 +14230,2231 @@ * END OF EC API ******************************************************************************/ +/******************************************************************************* + * START OF EC25519 API + ******************************************************************************/ + +#if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519) + +/* Generate an EC25519 key pair. + * + * Output keys are in little endian format. + * + * @param [out] priv EC25519 private key data. + * @param [in, out] privSz On in, the size of priv in bytes. + * On out, the length of the private key data in bytes. + * @param [out] pub EC25519 public key data. + * @param [in, out] pubSz On in, the size of pub in bytes. + * On out, the length of the public key data in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz, + unsigned char *pub, unsigned int *pubSz) +{ +#ifdef WOLFSSL_KEY_GEN + int res = 1; + int initTmpRng = 0; + WC_RNG *rng = NULL; +#ifdef WOLFSSL_SMALL_STACK + WC_RNG *tmpRng = NULL; +#else + WC_RNG tmpRng[1]; +#endif + curve25519_key key; + + WOLFSSL_ENTER("wolfSSL_EC25519_generate_key"); + + /* Validate parameters. */ + if ((priv == NULL) || (privSz == NULL) || (*privSz < CURVE25519_KEYSIZE) || + (pub == NULL) || (pubSz == NULL) || (*pubSz < CURVE25519_KEYSIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + if (res) { + /* Create a random number generator. */ + rng = wolfssl_make_rng(tmpRng, &initTmpRng); + if (rng == NULL) { + WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to make RNG"); + res = 0; + } + } + + /* Initialize a Curve25519 key. */ + if (res && (wc_curve25519_init(&key) != 0)) { + WOLFSSL_MSG("wc_curve25519_init failed"); + res = 0; + } + if (res) { + /* Make a Curve25519 key pair. */ + int ret = wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key); + if (ret != MP_OKAY) { + WOLFSSL_MSG("wc_curve25519_make_key failed"); + res = 0; + } + if (res) { + /* Export Curve25519 key pair to buffers. */ + ret = wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub, + pubSz, EC25519_LITTLE_ENDIAN); + if (ret != MP_OKAY) { + WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed"); + res = 0; + } + } + + /* Dispose of key. */ + wc_curve25519_free(&key); + } + + if (initTmpRng) { + wc_FreeRng(rng); + #ifdef WOLFSSL_SMALL_STACK + XFREE(rng, NULL, DYNAMIC_TYPE_RNG); + #endif + } + + return res; +#else + WOLFSSL_MSG("No Key Gen built in"); + + (void)priv; + (void)privSz; + (void)pub; + (void)pubSz; + + return 0; +#endif /* WOLFSSL_KEY_GEN */ +} + +/* Compute a shared secret from private and public EC25519 keys. + * + * Input and output keys are in little endian format + * + * @param [out] shared Shared secret buffer. + * @param [in, out] sharedSz On in, the size of shared in bytes. + * On out, the length of the secret in bytes. + * @param [in] priv EC25519 private key data. + * @param [in] privSz Length of the private key data in bytes. + * @param [in] pub EC25519 public key data. + * @param [in] pubSz Length of the public key data in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz, + const unsigned char *priv, unsigned int privSz, const unsigned char *pub, + unsigned int pubSz) +{ +#ifdef WOLFSSL_KEY_GEN + int res = 1; + curve25519_key privkey; + curve25519_key pubkey; + + WOLFSSL_ENTER("wolfSSL_EC25519_shared_key"); + + /* Validate parameters. */ + if ((shared == NULL) || (sharedSz == NULL) || + (*sharedSz < CURVE25519_KEYSIZE) || (priv == NULL) || + (privSz < CURVE25519_KEYSIZE) || (pub == NULL) || + (pubSz < CURVE25519_KEYSIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + /* Initialize private key object. */ + if (res && (wc_curve25519_init(&privkey) != 0)) { + WOLFSSL_MSG("wc_curve25519_init privkey failed"); + res = 0; + } + if (res) { + /* Initialize public key object. */ + if (wc_curve25519_init(&pubkey) != MP_OKAY) { + WOLFSSL_MSG("wc_curve25519_init pubkey failed"); + res = 0; + } + if (res) { + /* Import our private key. */ + int ret = wc_curve25519_import_private_ex(priv, privSz, &privkey, + EC25519_LITTLE_ENDIAN); + if (ret != 0) { + WOLFSSL_MSG("wc_curve25519_import_private_ex failed"); + res = 0; + } + + if (res) { + /* Import peer's public key. */ + ret = wc_curve25519_import_public_ex(pub, pubSz, &pubkey, + EC25519_LITTLE_ENDIAN); + if (ret != 0) { + WOLFSSL_MSG("wc_curve25519_import_public_ex failed"); + res = 0; + } + } + if (res) { + /* Compute shared secret. */ + ret = wc_curve25519_shared_secret_ex(&privkey, &pubkey, shared, + sharedSz, EC25519_LITTLE_ENDIAN); + if (ret != 0) { + WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed"); + res = 0; + } + } + + wc_curve25519_free(&pubkey); + } + wc_curve25519_free(&privkey); + } + + return res; +#else + WOLFSSL_MSG("No Key Gen built in"); + + (void)shared; + (void)sharedSz; + (void)priv; + (void)privSz; + (void)pub; + (void)pubSz; + + return 0; +#endif /* WOLFSSL_KEY_GEN */ +} +#endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */ + +/******************************************************************************* + * END OF EC25519 API + ******************************************************************************/ + +/******************************************************************************* + * START OF ED25519 API + ******************************************************************************/ + +#if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519) +/* Generate an ED25519 key pair. + * + * Output keys are in little endian format. + * + * @param [out] priv ED25519 private key data. + * @param [in, out] privSz On in, the size of priv in bytes. + * On out, the length of the private key data in bytes. + * @param [out] pub ED25519 public key data. + * @param [in, out] pubSz On in, the size of pub in bytes. + * On out, the length of the public key data in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz, + unsigned char *pub, unsigned int *pubSz) +{ +#if defined(WOLFSSL_KEY_GEN) && defined(HAVE_ED25519_KEY_EXPORT) + int res = 1; + int initTmpRng = 0; + WC_RNG *rng = NULL; +#ifdef WOLFSSL_SMALL_STACK + WC_RNG *tmpRng = NULL; +#else + WC_RNG tmpRng[1]; +#endif + ed25519_key key; + + WOLFSSL_ENTER("wolfSSL_ED25519_generate_key"); + + /* Validate parameters. */ + if ((priv == NULL) || (privSz == NULL) || + (*privSz < ED25519_PRV_KEY_SIZE) || (pub == NULL) || + (pubSz == NULL) || (*pubSz < ED25519_PUB_KEY_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + if (res) { + /* Create a random number generator. */ + rng = wolfssl_make_rng(tmpRng, &initTmpRng); + if (rng == NULL) { + WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to make RNG"); + res = 0; + } + } + + /* Initialize an Ed25519 key. */ + if (res && (wc_ed25519_init(&key) != 0)) { + WOLFSSL_MSG("wc_ed25519_init failed"); + res = 0; + } + if (res) { + /* Make an Ed25519 key pair. */ + int ret = wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_ed25519_make_key failed"); + res = 0; + } + if (res) { + /* Export Curve25519 key pair to buffers. */ + ret = wc_ed25519_export_key(&key, priv, privSz, pub, pubSz); + if (ret != 0) { + WOLFSSL_MSG("wc_ed25519_export_key failed"); + res = 0; + } + } + + wc_ed25519_free(&key); + } + + if (initTmpRng) { + wc_FreeRng(rng); + #ifdef WOLFSSL_SMALL_STACK + XFREE(rng, NULL, DYNAMIC_TYPE_RNG); + #endif + } + + return res; +#else +#ifndef WOLFSSL_KEY_GEN + WOLFSSL_MSG("No Key Gen built in"); +#else + WOLFSSL_MSG("No ED25519 key export built in"); +#endif + + (void)priv; + (void)privSz; + (void)pub; + (void)pubSz; + + return 0; +#endif /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */ +} + +/* Sign a message with Ed25519 using the private key. + * + * Input and output keys are in little endian format. + * Priv is a buffer containing private and public part of key. + * + * @param [in] msg Message to be signed. + * @param [in] msgSz Length of message in bytes. + * @param [in] priv ED25519 private key data. + * @param [in] privSz Length in bytes of private key data. + * @param [out] sig Signature buffer. + * @param [in, out] sigSz On in, the length of the signature buffer in bytes. + * On out, the length of the signature in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz, + const unsigned char *priv, unsigned int privSz, unsigned char *sig, + unsigned int *sigSz) +{ +#if defined(HAVE_ED25519_SIGN) && defined(WOLFSSL_KEY_GEN) && \ + defined(HAVE_ED25519_KEY_IMPORT) + ed25519_key key; + int res = 1; + + WOLFSSL_ENTER("wolfSSL_ED25519_sign"); + + /* Validate parameters. */ + if ((priv == NULL) || (privSz != ED25519_PRV_KEY_SIZE) || + (msg == NULL) || (sig == NULL) || (sigSz == NULL) || + (*sigSz < ED25519_SIG_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + /* Initialize Ed25519 key. */ + if (res && (wc_ed25519_init(&key) != 0)) { + WOLFSSL_MSG("wc_curve25519_init failed"); + res = 0; + } + if (res) { + /* Import private and public key. */ + int ret = wc_ed25519_import_private_key(priv, privSz / 2, + priv + (privSz / 2), ED25519_PUB_KEY_SIZE, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_ed25519_import_private failed"); + res = 0; + } + + if (res) { + /* Sign message with Ed25519. */ + ret = wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed"); + res = 0; + } + } + + wc_ed25519_free(&key); + } + + return res; +#else +#if !defined(HAVE_ED25519_SIGN) + WOLFSSL_MSG("No ED25519 sign built in"); +#elif !defined(WOLFSSL_KEY_GEN) + WOLFSSL_MSG("No Key Gen built in"); +#elif !defined(HAVE_ED25519_KEY_IMPORT) + WOLFSSL_MSG("No ED25519 Key import built in"); +#endif + + (void)msg; + (void)msgSz; + (void)priv; + (void)privSz; + (void)sig; + (void)sigSz; + + return 0; +#endif /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */ +} + +/* Verify a message with Ed25519 using the public key. + * + * Input keys are in little endian format. + * + * @param [in] msg Message to be verified. + * @param [in] msgSz Length of message in bytes. + * @param [in] pub ED25519 public key data. + * @param [in] privSz Length in bytes of public key data. + * @param [in] sig Signature buffer. + * @param [in] sigSz Length of the signature in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz, + const unsigned char *pub, unsigned int pubSz, const unsigned char *sig, + unsigned int sigSz) +{ +#if defined(HAVE_ED25519_VERIFY) && defined(WOLFSSL_KEY_GEN) && \ + defined(HAVE_ED25519_KEY_IMPORT) + ed25519_key key; + int res = 1; + + WOLFSSL_ENTER("wolfSSL_ED25519_verify"); + + /* Validate parameters. */ + if ((pub == NULL) || (pubSz != ED25519_PUB_KEY_SIZE) || (msg == NULL) || + (sig == NULL) || (sigSz != ED25519_SIG_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + /* Initialize Ed25519 key. */ + if (res && (wc_ed25519_init(&key) != 0)) { + WOLFSSL_MSG("wc_curve25519_init failed"); + res = 0; + } + if (res) { + /* Import public key. */ + int ret = wc_ed25519_import_public(pub, pubSz, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_ed25519_import_public failed"); + res = 0; + } + + if (res) { + int check = 0; + + /* Verify signature with message and public key. */ + ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz, &check, + &key); + /* Check for errors in verification process. */ + if (ret != 0) { + WOLFSSL_MSG("wc_ed25519_verify_msg failed"); + res = 0; + } + /* Check signature is valid. */ + else if (!check) { + WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)"); + res = 0; + } + } + + wc_ed25519_free(&key); + } + + return res; +#else +#if !defined(HAVE_ED25519_VERIFY) + WOLFSSL_MSG("No ED25519 verify built in"); +#elif !defined(WOLFSSL_KEY_GEN) + WOLFSSL_MSG("No Key Gen built in"); +#elif !defined(HAVE_ED25519_KEY_IMPORT) + WOLFSSL_MSG("No ED25519 Key import built in"); +#endif + + (void)msg; + (void)msgSz; + (void)pub; + (void)pubSz; + (void)sig; + (void)sigSz; + + return 0; +#endif /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */ +} + +#endif /* OPENSSL_EXTRA && HAVE_ED25519 */ + +/******************************************************************************* + * END OF ED25519 API + ******************************************************************************/ + +/******************************************************************************* + * START OF EC448 API + ******************************************************************************/ + +#if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448) +/* Generate an EC448 key pair. + * + * Output keys are in little endian format. + * + * @param [out] priv EC448 private key data. + * @param [in, out] privSz On in, the size of priv in bytes. + * On out, the length of the private key data in bytes. + * @param [out] pub EC448 public key data. + * @param [in, out] pubSz On in, the size of pub in bytes. + * On out, the length of the public key data in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz, + unsigned char *pub, unsigned int *pubSz) +{ +#ifdef WOLFSSL_KEY_GEN + int res = 1; + int initTmpRng = 0; + WC_RNG *rng = NULL; +#ifdef WOLFSSL_SMALL_STACK + WC_RNG *tmpRng = NULL; +#else + WC_RNG tmpRng[1]; +#endif + curve448_key key; + + WOLFSSL_ENTER("wolfSSL_EC448_generate_key"); + + /* Validate parameters. */ + if ((priv == NULL) || (privSz == NULL) || (*privSz < CURVE448_KEY_SIZE) || + (pub == NULL) || (pubSz == NULL) || (*pubSz < CURVE448_KEY_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + if (res) { + /* Create a random number generator. */ + rng = wolfssl_make_rng(tmpRng, &initTmpRng); + if (rng == NULL) { + WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to make RNG"); + res = 0; + } + } + + /* Initialize a Curve448 key. */ + if (res && (wc_curve448_init(&key) != 0)) { + WOLFSSL_MSG("wc_curve448_init failed"); + res = 0; + } + if (res) { + /* Make a Curve448 key pair. */ + int ret = wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_curve448_make_key failed"); + res = 0; + } + if (res) { + /* Export Curve448 key pair to buffers. */ + ret = wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz, + EC448_LITTLE_ENDIAN); + if (ret != 0) { + WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed"); + res = 0; + } + } + + /* Dispose of key. */ + wc_curve448_free(&key); + } + + if (initTmpRng) { + wc_FreeRng(rng); + #ifdef WOLFSSL_SMALL_STACK + XFREE(rng, NULL, DYNAMIC_TYPE_RNG); + #endif + } + + return res; +#else + WOLFSSL_MSG("No Key Gen built in"); + + (void)priv; + (void)privSz; + (void)pub; + (void)pubSz; + + return 0; +#endif /* WOLFSSL_KEY_GEN */ +} + +/* Compute a shared secret from private and public EC448 keys. + * + * Input and output keys are in little endian format + * + * @param [out] shared Shared secret buffer. + * @param [in, out] sharedSz On in, the size of shared in bytes. + * On out, the length of the secret in bytes. + * @param [in] priv EC448 private key data. + * @param [in] privSz Length of the private key data in bytes. + * @param [in] pub EC448 public key data. + * @param [in] pubSz Length of the public key data in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz, + const unsigned char *priv, unsigned int privSz, + const unsigned char *pub, unsigned int pubSz) +{ +#ifdef WOLFSSL_KEY_GEN + int res = 1; + curve448_key privkey; + curve448_key pubkey; + + WOLFSSL_ENTER("wolfSSL_EC448_shared_key"); + + /* Validate parameters. */ + if ((shared == NULL) || (sharedSz == NULL) || + (*sharedSz < CURVE448_KEY_SIZE) || (priv == NULL) || + (privSz < CURVE448_KEY_SIZE) || (pub == NULL) || + (pubSz < CURVE448_KEY_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + /* Initialize private key object. */ + if (res && (wc_curve448_init(&privkey) != 0)) { + WOLFSSL_MSG("wc_curve448_init privkey failed"); + res = 0; + } + if (res) { + /* Initialize public key object. */ + if (wc_curve448_init(&pubkey) != MP_OKAY) { + WOLFSSL_MSG("wc_curve448_init pubkey failed"); + res = 0; + } + if (res) { + /* Import our private key. */ + int ret = wc_curve448_import_private_ex(priv, privSz, &privkey, + EC448_LITTLE_ENDIAN); + if (ret != 0) { + WOLFSSL_MSG("wc_curve448_import_private_ex failed"); + res = 0; + } + + if (res) { + /* Import peer's public key. */ + ret = wc_curve448_import_public_ex(pub, pubSz, &pubkey, + EC448_LITTLE_ENDIAN); + if (ret != 0) { + WOLFSSL_MSG("wc_curve448_import_public_ex failed"); + res = 0; + } + } + if (res) { + /* Compute shared secret. */ + ret = wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, + sharedSz, EC448_LITTLE_ENDIAN); + if (ret != 0) { + WOLFSSL_MSG("wc_curve448_shared_secret_ex failed"); + res = 0; + } + } + + wc_curve448_free(&pubkey); + } + wc_curve448_free(&privkey); + } + + return res; +#else + WOLFSSL_MSG("No Key Gen built in"); + + (void)shared; + (void)sharedSz; + (void)priv; + (void)privSz; + (void)pub; + (void)pubSz; + + return 0; +#endif /* WOLFSSL_KEY_GEN */ +} +#endif /* OPENSSL_EXTRA && HAVE_CURVE448 */ + +/******************************************************************************* + * END OF EC448 API + ******************************************************************************/ + +/******************************************************************************* + * START OF ED448 API + ******************************************************************************/ + +#if defined(OPENSSL_EXTRA) && defined(HAVE_ED448) +/* Generate an ED448 key pair. + * + * Output keys are in little endian format. + * + * @param [out] priv ED448 private key data. + * @param [in, out] privSz On in, the size of priv in bytes. + * On out, the length of the private key data in bytes. + * @param [out] pub ED448 public key data. + * @param [in, out] pubSz On in, the size of pub in bytes. + * On out, the length of the public key data in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz, + unsigned char *pub, unsigned int *pubSz) +{ +#if defined(WOLFSSL_KEY_GEN) && defined(HAVE_ED448_KEY_EXPORT) + int res = 1; + int initTmpRng = 0; + WC_RNG *rng = NULL; +#ifdef WOLFSSL_SMALL_STACK + WC_RNG *tmpRng = NULL; +#else + WC_RNG tmpRng[1]; +#endif + ed448_key key; + + WOLFSSL_ENTER("wolfSSL_ED448_generate_key"); + + /* Validate parameters. */ + if ((priv == NULL) || (privSz == NULL) || + (*privSz < ED448_PRV_KEY_SIZE) || (pub == NULL) || + (pubSz == NULL) || (*pubSz < ED448_PUB_KEY_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + if (res) { + /* Create a random number generator. */ + rng = wolfssl_make_rng(tmpRng, &initTmpRng); + if (rng == NULL) { + WOLFSSL_MSG("wolfSSL_EC_KEY_generate_key failed to make RNG"); + res = 0; + } + } + + /* Initialize an Ed448 key. */ + if (res && (wc_ed448_init(&key) != 0)) { + WOLFSSL_MSG("wc_ed448_init failed"); + res = 0; + } + if (res) { + /* Make an Ed448 key pair. */ + int ret = wc_ed448_make_key(rng, ED448_KEY_SIZE, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_ed448_make_key failed"); + res = 0; + } + if (res) { + /* Export Curve448 key pair to buffers. */ + ret = wc_ed448_export_key(&key, priv, privSz, pub, pubSz); + if (ret != 0) { + WOLFSSL_MSG("wc_ed448_export_key failed"); + res = 0; + } + } + + wc_ed448_free(&key); + } + + if (initTmpRng) { + wc_FreeRng(rng); + #ifdef WOLFSSL_SMALL_STACK + XFREE(rng, NULL, DYNAMIC_TYPE_RNG); + #endif + } + + return res; +#else +#ifndef WOLFSSL_KEY_GEN + WOLFSSL_MSG("No Key Gen built in"); +#else + WOLFSSL_MSG("No ED448 key export built in"); +#endif + + (void)priv; + (void)privSz; + (void)pub; + (void)pubSz; + + return 0; +#endif /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */ +} + +/* Sign a message with Ed448 using the private key. + * + * Input and output keys are in little endian format. + * Priv is a buffer containing private and public part of key. + * + * @param [in] msg Message to be signed. + * @param [in] msgSz Length of message in bytes. + * @param [in] priv ED448 private key data. + * @param [in] privSz Length in bytes of private key data. + * @param [out] sig Signature buffer. + * @param [in, out] sigSz On in, the length of the signature buffer in bytes. + * On out, the length of the signature in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz, + const unsigned char *priv, unsigned int privSz, unsigned char *sig, + unsigned int *sigSz) +{ +#if defined(HAVE_ED448_SIGN) && defined(WOLFSSL_KEY_GEN) && \ + defined(HAVE_ED448_KEY_IMPORT) + ed448_key key; + int res = 1; + + WOLFSSL_ENTER("wolfSSL_ED448_sign"); + + /* Validate parameters. */ + if ((priv == NULL) || (privSz != ED448_PRV_KEY_SIZE) || + (msg == NULL) || (sig == NULL) || (sigSz == NULL) || + (*sigSz < ED448_SIG_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + /* Initialize Ed448 key. */ + if (res && (wc_ed448_init(&key) != 0)) { + WOLFSSL_MSG("wc_curve448_init failed"); + res = 0; + } + if (res) { + /* Import private and public key. */ + int ret = wc_ed448_import_private_key(priv, privSz / 2, + priv + (privSz / 2), ED448_PUB_KEY_SIZE, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_ed448_import_private failed"); + res = 0; + } + + if (res) { + /* Sign message with Ed448 - no context. */ + ret = wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0); + if (ret != 0) { + WOLFSSL_MSG("wc_curve448_shared_secret_ex failed"); + res = 0; + } + } + + wc_ed448_free(&key); + } + + return res; +#else +#if !defined(HAVE_ED448_SIGN) + WOLFSSL_MSG("No ED448 sign built in"); +#elif !defined(WOLFSSL_KEY_GEN) + WOLFSSL_MSG("No Key Gen built in"); +#elif !defined(HAVE_ED448_KEY_IMPORT) + WOLFSSL_MSG("No ED448 Key import built in"); +#endif + + (void)msg; + (void)msgSz; + (void)priv; + (void)privSz; + (void)sig; + (void)sigSz; + + return 0; +#endif /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */ +} + +/* Verify a message with Ed448 using the public key. + * + * Input keys are in little endian format. + * + * @param [in] msg Message to be verified. + * @param [in] msgSz Length of message in bytes. + * @param [in] pub ED448 public key data. + * @param [in] privSz Length in bytes of public key data. + * @param [in] sig Signature buffer. + * @param [in] sigSz Length of the signature in bytes. + * @return 1 on success + * @return 0 on failure. + */ +int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz, + const unsigned char *pub, unsigned int pubSz, const unsigned char *sig, + unsigned int sigSz) +{ +#if defined(HAVE_ED448_VERIFY) && defined(WOLFSSL_KEY_GEN) && \ + defined(HAVE_ED448_KEY_IMPORT) + ed448_key key; + int res = 1; + + WOLFSSL_ENTER("wolfSSL_ED448_verify"); + + /* Validate parameters. */ + if ((pub == NULL) || (pubSz != ED448_PUB_KEY_SIZE) || (msg == NULL) || + (sig == NULL) || (sigSz != ED448_SIG_SIZE)) { + WOLFSSL_MSG("Bad arguments"); + res = 0; + } + + /* Initialize Ed448 key. */ + if (res && (wc_ed448_init(&key) != 0)) { + WOLFSSL_MSG("wc_curve448_init failed"); + res = 0; + } + if (res) { + /* Import public key. */ + int ret = wc_ed448_import_public(pub, pubSz, &key); + if (ret != 0) { + WOLFSSL_MSG("wc_ed448_import_public failed"); + res = 0; + } + + if (res) { + int check = 0; + + /* Verify signature with message and public key - no context. */ + ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check, + &key, NULL, 0); + /* Check for errors in verification process. */ + if (ret != 0) { + WOLFSSL_MSG("wc_ed448_verify_msg failed"); + res = 0; + } + /* Check signature is valid. */ + else if (!check) { + WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)"); + res = 0; + } + } + + wc_ed448_free(&key); + } + + return res; +#else +#if !defined(HAVE_ED448_VERIFY) + WOLFSSL_MSG("No ED448 verify built in"); +#elif !defined(WOLFSSL_KEY_GEN) + WOLFSSL_MSG("No Key Gen built in"); +#elif !defined(HAVE_ED448_KEY_IMPORT) + WOLFSSL_MSG("No ED448 Key import built in"); +#endif + + (void)msg; + (void)msgSz; + (void)pub; + (void)pubSz; + (void)sig; + (void)sigSz; + + return 0; +#endif /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */ +} +#endif /* OPENSSL_EXTRA && HAVE_ED448 */ + +/******************************************************************************* + * END OF ED448 API + ******************************************************************************/ + +/******************************************************************************* + * START OF GENERIC PUBLIC KEY PEM APIs + ******************************************************************************/ + +#ifdef OPENSSL_EXTRA +/* Sets default callback password for PEM. + * + * @param [out] buf Buffer to hold password. + * @param [in] num Number of characters in buffer. + * @param [in] rwFlag Read/write flag. Ignored. + * @param [in] userData User data - assumed to be default password. + * @return Password size on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_def_callback(char* buf, int num, int rwFlag, void* userData) +{ + int sz = 0; + + WOLFSSL_ENTER("wolfSSL_PEM_def_callback"); + + (void)rwFlag; + + /* We assume that the user passes a default password as userdata */ + if ((buf != NULL) && (userData != NULL)) { + sz = (int)XSTRLEN((const char*)userData); + sz = (int)min((word32)sz, (word32)num); + XMEMCPY(buf, userData, sz); + } + else { + WOLFSSL_MSG("Error, default password cannot be created."); + } + + return sz; +} + +#ifndef NO_BIO +/* Writes a public key to a WOLFSSL_BIO encoded in PEM format. + * + * @param [in] bio BIO to write to. + * @param [in] key Public key to write in PEM format. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key) +{ + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY"); + + if ((bio != NULL) && (key != NULL)) { + switch (key->type) { +#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) + case EVP_PKEY_RSA: + ret = wolfSSL_PEM_write_bio_RSA_PUBKEY(bio, key->rsa); + break; +#endif /* WOLFSSL_KEY_GEN && !NO_RSA */ +#if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && \ + (defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN)) + case EVP_PKEY_DSA: + ret = wolfSSL_PEM_write_bio_DSA_PUBKEY(bio, key->dsa); + break; +#endif /* !NO_DSA && !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) */ +#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \ + defined(WOLFSSL_KEY_GEN) + case EVP_PKEY_EC: + ret = wolfSSL_PEM_write_bio_EC_PUBKEY(bio, key->ecc); + break; +#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */ +#if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) + case EVP_PKEY_DH: + /* DH public key not supported. */ + WOLFSSL_MSG("Writing DH PUBKEY not supported!"); + break; +#endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ + default: + /* Key type not supported. */ + WOLFSSL_MSG("Unknown Key type!"); + break; + } + } + + return ret; +} + +/* Writes a private key to a WOLFSSL_BIO encoded in PEM format. + * + * @param [in] bio BIO to write to. + * @param [in] key Public key to write in PEM format. + * @param [in] cipher Encryption cipher to use. + * @param [in] passwd Password to use when encrypting. + * @param [in] len Length of password. + * @param [in] cb Password callback. + * @param [in] arg Password callback argument. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key, + const WOLFSSL_EVP_CIPHER* cipher, unsigned char* passwd, int len, + wc_pem_password_cb* cb, void* arg) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey"); + + (void)cipher; + (void)passwd; + (void)len; + (void)cb; + (void)arg; + + /* Validate parameters. */ + if ((bio == NULL) || (key == NULL)) { + WOLFSSL_MSG("Bad Function Arguments"); + ret = 0; + } + + if (ret == 1) { + #ifdef WOLFSSL_KEY_GEN + switch (key->type) { + #ifndef NO_RSA + case EVP_PKEY_RSA: + /* Write using RSA specific API. */ + ret = wolfSSL_PEM_write_bio_RSAPrivateKey(bio, key->rsa, + cipher, passwd, len, cb, arg); + break; + #endif + #ifndef NO_DSA + case EVP_PKEY_DSA: + /* Write using DSA specific API. */ + ret = wolfSSL_PEM_write_bio_DSAPrivateKey(bio, key->dsa, + cipher, passwd, len, cb, arg); + break; + #endif + #ifdef HAVE_ECC + case EVP_PKEY_EC: + #if defined(HAVE_ECC_KEY_EXPORT) + /* Write using EC specific API. */ + ret = wolfSSL_PEM_write_bio_ECPrivateKey(bio, key->ecc, + cipher, passwd, len, cb, arg); + #else + ret = der_write_to_bio_as_pem((byte*)key->pkey.ptr, + key->pkey_sz, bio, EC_PRIVATEKEY_TYPE); + #endif + break; + #endif + #ifndef NO_DH + case EVP_PKEY_DH: + /* Write using generic API with DH type. */ + ret = der_write_to_bio_as_pem((byte*)key->pkey.ptr, + key->pkey_sz, bio, DH_PRIVATEKEY_TYPE); + break; + #endif + default: + WOLFSSL_MSG("Unknown Key type!"); + ret = 0; + break; + } + #else + int type = 0; + + switch (key->type) { + #ifndef NO_DSA + case EVP_PKEY_DSA: + type = DSA_PRIVATEKEY_TYPE; + break; + #endif + #ifdef HAVE_ECC + case EVP_PKEY_EC: + type = ECC_PRIVATEKEY_TYPE; + break; + #endif + #ifndef NO_DH + case EVP_PKEY_DH: + type = DH_PRIVATEKEY_TYPE; + break; + #endif + #ifndef NO_RSA + case EVP_PKEY_RSA: + type = PRIVATEKEY_TYPE; + break; + #endif + default: + ret = 0; + break; + } + if (ret == 1) { + /* Write using generic API with generic type. */ + ret = der_write_to_bio_as_pem((byte*)key->pkey.ptr, key->pkey_sz, + bio, type); + } + #endif + } + + return ret; +} +#endif /* !NO_BIO */ + +#ifndef NO_BIO +/* Create a private key object from the data in the BIO. + * + * @param [in] bio BIO to read from. + * @param [in, out] key Public key object. Object used if passed in. + * @param [in] cb Password callback. + * @param [in] arg Password callback argument. + * @return A WOLFSSL_EVP_PKEY object on success. + * @return NULL on failure. + */ +WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio, + WOLFSSL_EVP_PKEY **key, wc_pem_password_cb *cb, void *arg) +{ + int err = 0; + WOLFSSL_EVP_PKEY* pkey = NULL; + DerBuffer* der = NULL; + + WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY"); + + if (bio == NULL) { + err = 1; + } + + /* Read the PEM public key from the BIO and convert to DER. */ + if ((!err) && (pem_read_bio_key(bio, cb, arg, PUBLICKEY_TYPE, NULL, + &der) < 0)) { + err = 1; + } + + if (!err) { + const unsigned char* ptr = der->buffer; + + /* Use key passed in if set. */ + if ((key != NULL) && (*key != NULL)) { + pkey = *key; + } + + /* Convert DER data to a public key object. */ + if (wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length) == NULL) { + WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); + pkey = NULL; + err = 1; + } + } + + /* Return the key if possible. */ + if ((!err) && (key != NULL) && (pkey != NULL)) { + *key = pkey; + } + /* Dispose of the DER encoding. */ + FreeDer(&der); + + WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0); + + return pkey; +} + +/* Create a private key object from the data in the BIO. + * + * @param [in] bio BIO to read from. + * @param [in, out] key Private key object. Object used if passed in. + * @param [in] cb Password callback. + * @param [in] arg Password callback argument. + * @return A WOLFSSL_EVP_PKEY object on success. + * @return NULL on failure. + */ +WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio, + WOLFSSL_EVP_PKEY** key, wc_pem_password_cb* cb, void* arg) +{ + int err = 0; + WOLFSSL_EVP_PKEY* pkey = NULL; + DerBuffer* der = NULL; + int keyFormat = 0; + + WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey"); + + /* Validate parameters. */ + if (bio == NULL) { + err = 1; + } + + /* Read the PEM private key from the BIO and convert to DER. */ + if ((!err) && (pem_read_bio_key(bio, cb, arg, PRIVATEKEY_TYPE, &keyFormat, + &der) < 0)) { + err = 1; + } + + if (!err) { + const unsigned char* ptr = der->buffer; + int type = -1; + + /* Set key type based on format returned. */ + switch (keyFormat) { + /* No key format set - default to RSA. */ + case 0: + case RSAk: + type = EVP_PKEY_RSA; + break; + case DSAk: + type = EVP_PKEY_DSA; + break; + case ECDSAk: + type = EVP_PKEY_EC; + break; + case DHk: + type = EVP_PKEY_DH; + break; + default: + break; + } + + /* Use key passed in if set. */ + if ((key != NULL) && (*key != NULL)) { + pkey = *key; + } + + /* Convert DER data to a private key object. */ + if (wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length) == NULL) { + WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); + pkey = NULL; + err = 1; + } + } + + /* Return the key if possible. */ + if ((!err) && (key != NULL) && (pkey != NULL)) { + *key = pkey; + } + /* Dispose of the DER encoding. */ + FreeDer(&der); + + WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", err); + + return pkey; +} +#endif /* !NO_BIO */ + +#if !defined(NO_FILESYSTEM) +/* Create a private key object from the data in a file. + * + * @param [in] fp File pointer. + * @param [in, out] key Public key object. Object used if passed in. + * @param [in] cb Password callback. + * @param [in] arg Password callback argument. + * @return A WOLFSSL_EVP_PKEY object on success. + * @return NULL on failure. + */ +WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, WOLFSSL_EVP_PKEY **key, + wc_pem_password_cb *cb, void *arg) +{ + int err = 0; + WOLFSSL_EVP_PKEY* pkey = NULL; + DerBuffer* der = NULL; + + WOLFSSL_ENTER("wolfSSL_PEM_read_PUBKEY"); + + /* Validate parameters. */ + if (fp == XBADFILE) { + err = 1; + } + + /* Read the PEM public key from the file and convert to DER. */ + if ((!err) && ((pem_read_file_key(fp, cb, arg, PUBLICKEY_TYPE, NULL, + &der) < 0) || (der == NULL))) { + err = 1; + } + if (!err) { + const unsigned char* ptr = der->buffer; + + /* Use key passed in if set. */ + if ((key != NULL) && (*key != NULL)) { + pkey = *key; + } + + /* Convert DER data to a public key object. */ + if (wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length) == NULL) { + WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); + pkey = NULL; + err = 1; + } + } + + /* Return the key if possible. */ + if ((!err) && (key != NULL) && (pkey != NULL)) { + *key = pkey; + } + /* Dispose of the DER encoding. */ + FreeDer(&der); + + WOLFSSL_LEAVE("wolfSSL_PEM_read_PUBKEY", 0); + + return pkey; +} + +#ifndef NO_CERTS +/* Create a private key object from the data in a file. + * + * @param [in] fp File pointer. + * @param [in, out] key Private key object. Object used if passed in. + * @param [in] cb Password callback. + * @param [in] arg Password callback argument. + * @return A WOLFSSL_EVP_PKEY object on success. + * @return NULL on failure. + */ +WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_PrivateKey(XFILE fp, WOLFSSL_EVP_PKEY **key, + wc_pem_password_cb *cb, void *arg) +{ + int err = 0; + WOLFSSL_EVP_PKEY* pkey = NULL; + DerBuffer* der = NULL; + int keyFormat = 0; + + WOLFSSL_ENTER("wolfSSL_PEM_read_PrivateKey"); + + /* Validate parameters. */ + if (fp == XBADFILE) { + err = 1; + } + + /* Read the PEM private key from the file and convert to DER. */ + if ((!err) && (pem_read_file_key(fp, cb, arg, PRIVATEKEY_TYPE, &keyFormat, + &der)) < 0) { + err = 1; + } + + if (!err) { + const unsigned char* ptr = der->buffer; + int type = -1; + + /* Set key type based on format returned. */ + switch (keyFormat) { + /* No key format set - default to RSA. */ + case 0: + case RSAk: + type = EVP_PKEY_RSA; + break; + case DSAk: + type = EVP_PKEY_DSA; + break; + case ECDSAk: + type = EVP_PKEY_EC; + break; + case DHk: + type = EVP_PKEY_DH; + break; + default: + break; + } + + /* Use key passed in if set. */ + if ((key != NULL) && (*key != NULL)) { + pkey = *key; + } + + /* Convert DER data to a private key object. */ + if (wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length) == NULL) { + WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); + pkey = NULL; + err = 1; + } + } + + /* Return the key if possible. */ + if ((!err) && (key != NULL) && (pkey != NULL)) { + *key = pkey; + } + /* Dispose of the DER encoding. */ + FreeDer(&der); + + WOLFSSL_LEAVE("wolfSSL_PEM_read_PrivateKey", 0); + + return pkey; +} +#endif /* !NO_CERTS */ +#endif /* !NO_FILESYSTEM */ + +#ifndef NO_CERTS + +#if !defined(NO_BIO) || !defined(NO_FILESYSTEM) +#define PEM_BEGIN "-----BEGIN " +#define PEM_BEGIN_SZ 11 +#define PEM_END "-----END " +#define PEM_END_SZ 9 +#define PEM_HDR_FIN "-----" +#define PEM_HDR_FIN_SZ 5 +#define PEM_HDR_FIN_EOL_NEWLINE "-----\n" +#define PEM_HDR_FIN_EOL_NULL_TERM "-----\0" +#define PEM_HDR_FIN_EOL_SZ 6 + +/* Find strings and return middle offsets. + * + * Find first string in pem as a prefix and then locate second string as a + * postfix. + * len returning with 0 indicates not found. + * + * @param [in] pem PEM data. + * @param [in] pemLen Length of PEM data. + * @param [in] idx Current index. + * @param [in] prefix First string to find. + * @param [in] postfix Second string to find after first. + * @param [out] start Start index of data between strings. + * @param [out] len Length of data between strings. + */ +static void pem_find_pattern(char* pem, int pemLen, int idx, const char* prefix, + const char* postfix, int* start, int* len) +{ + int prefixLen = (int)XSTRLEN(prefix); + int postfixLen = (int)XSTRLEN(postfix); + + *start = *len = 0; + /* Find prefix part. */ + for (; idx < pemLen - prefixLen; idx++) { + if ((pem[idx] == prefix[0]) && + (XMEMCMP(pem + idx, prefix, prefixLen) == 0)) { + idx += prefixLen; + *start = idx; + break; + } + } + /* Find postfix part. */ + for (; idx < pemLen - postfixLen; idx++) { + if ((pem[idx] == postfix[0]) && + (XMEMCMP(pem + idx, postfix, postfixLen) == 0)) { + *len = idx - *start; + break; + } + } +} + +/* Parse out content type name, any encryption headers and DER encoding. + * + * @param [in] pem PEM data. + * @param [in] pemLen Length of PEM data. + * @param [out] name Name of content type. + * @param [out] header Encryption headers. + * @param [out] data DER encoding from PEM. + * @param [out] len Length of DER data. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + * @return ASN_NO_PEM_HEADER when no header found or different names found. + */ +static int pem_read_data(char* pem, int pemLen, char **name, char **header, + unsigned char **data, long *len) +{ + int ret = 0; + int start; + int nameLen; + int startHdr = 0; + int hdrLen = 0; + int startEnd = 0; + int endLen; + + *name = NULL; + *header = NULL; + + /* Find header. */ + pem_find_pattern(pem, pemLen, 0, PEM_BEGIN, PEM_HDR_FIN, &start, &nameLen); + /* Allocate memory for header name. */ + *name = (char*)XMALLOC(nameLen + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (*name == NULL) { + ret = MEMORY_E; + } + if (ret == 0) { + /* Put in header name. */ + (*name)[nameLen] = '\0'; + if (nameLen == 0) { + ret = ASN_NO_PEM_HEADER; + } + else { + XMEMCPY(*name, pem + start, nameLen); + } + } + if (ret == 0) { + /* Find encryption headers after header. */ + start += nameLen + PEM_HDR_FIN_SZ; + pem_find_pattern(pem, pemLen, start, "\n", "\n\n", &startHdr, &hdrLen); + if (hdrLen > 0) { + /* Include first of two '\n' characters. */ + hdrLen++; + } + /* Allocate memory for encryption header string. */ + *header = (char*)XMALLOC(hdrLen + 1, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (*header == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + /* Put in encryption header string. */ + (*header)[hdrLen] = '\0'; + if (hdrLen > 0) { + XMEMCPY(*header, pem + startHdr, hdrLen); + start = startHdr + hdrLen + 1; + } + + /* Find footer. */ + pem_find_pattern(pem, pemLen, start, PEM_END, PEM_HDR_FIN, &startEnd, + &endLen); + /* Validate header name and footer name are the same. */ + if ((endLen != nameLen) || + (XMEMCMP(*name, pem + startEnd, nameLen) != 0)) { + ret = ASN_NO_PEM_HEADER; + } + } + if (ret == 0) { + unsigned char* der = (unsigned char*)pem; + word32 derLen; + + /* Convert PEM body to DER. */ + derLen = (word32)(startEnd - PEM_END_SZ - start); + ret = Base64_Decode(der + start, derLen, der, &derLen); + if (ret == 0) { + /* Return the DER data. */ + *data = der; + *len = derLen; + } + } + + return ret; +} + +/* Encode the DER data in PEM format into a newly allocated buffer. + * + * @param [in] name Header/footer name. + * @param [in] header Encryption header. + * @param [in] data DER data. + * @param [in] len Length of DER data. + * @param [out] pemOut PEM encoded data. + * @param [out] pemOutLen Length of PEM encoded data. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int pem_write_data(const char *name, const char *header, + const unsigned char *data, long len, char** pemOut, word32* pemOutLen) +{ + int ret = 0; + int nameLen; + int headerLen; + char* pem = NULL; + word32 pemLen; + word32 derLen = (word32)len; + byte* p; + + nameLen = (int)XSTRLEN(name); + headerLen = (int)XSTRLEN(header); + + /* DER encode for PEM. */ + pemLen = (derLen + 2) / 3 * 4; + pemLen += (pemLen + 63) / 64; + /* Header */ + pemLen += PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ; + if (headerLen > 0) { + /* Encryption lines plus extra carriage return. */ + pemLen += headerLen + 1; + } + /* Trailer */ + pemLen += PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ; + + pem = (char*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (pem == NULL) { + ret = MEMORY_E; + } + p = (byte*)pem; + + if (ret == 0) { + /* Add header. */ + XMEMCPY(p, PEM_BEGIN, PEM_BEGIN_SZ); + p += PEM_BEGIN_SZ; + XMEMCPY(p, name, nameLen); + p += nameLen; + XMEMCPY(p, PEM_HDR_FIN_EOL_NEWLINE, PEM_HDR_FIN_EOL_SZ); + p += PEM_HDR_FIN_EOL_SZ; + + if (headerLen > 0) { + /* Add encryption header. */ + XMEMCPY(p, header, headerLen); + p += headerLen; + /* Blank line after a header and before body. */ + *(p++) = '\n'; + } + + /* Add DER data as PEM. */ + pemLen -= (word32)((size_t)p - (size_t)pem); + ret = Base64_Encode(data, derLen, p, &pemLen); + } + if (ret == 0) { + p += pemLen; + + /* Add trailer. */ + XMEMCPY(p, PEM_END, PEM_END_SZ); + p += PEM_END_SZ; + XMEMCPY(p, name, nameLen); + p += nameLen; + XMEMCPY(p, PEM_HDR_FIN_EOL_NEWLINE, PEM_HDR_FIN_EOL_SZ); + p += PEM_HDR_FIN_EOL_SZ; + + /* Return buffer and length of data. */ + *pemOut = pem; + *pemOutLen = (word32)((size_t)p - (size_t)pem); + } + + return ret; +} +#endif /* !NO_BIO || !NO_FILESYSTEM */ + +#ifndef NO_BIO +/* Read PEM encoded data from a BIO. + * + * Reads the entire contents in. + * + * @param [in] bio BIO to read from. + * @param [out] name Name of content type. + * @param [out] header Encryption headers. + * @param [out] data DER encoding from PEM. + * @param [out] len Length of DER data. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header, + unsigned char **data, long *len) +{ + int res = 1; + char* pem = NULL; + int pemLen = 0; + int memAlloced = 1; + + /* Validate parameters. */ + if ((bio == NULL) || (name == NULL) || (header == NULL) || (data == NULL) || + (len == NULL)) { + res = 0; + } + + /* Load all the data from the BIO. */ + if ((res == 1) && (wolfssl_read_bio(bio, &pem, &pemLen, &memAlloced) != + 0)) { + res = 0; + } + if ((res == 1) && (!memAlloced)) { + /* Need to return allocated memory - make sure it is allocated. */ + char* p = (char*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (p == NULL) { + res = 0; + } + else { + /* Copy the data into new buffer. */ + XMEMCPY(p, pem, pemLen); + pem = p; + } + } + + /* Read the PEM data. */ + if ((res == 1) && (pem_read_data(pem, pemLen, name, header, data, len) != + 0)) { + /* Dispose of any allocated memory. */ + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(*name, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(*header, NULL, DYNAMIC_TYPE_TMP_BUFFER); + *name = NULL; + *header = NULL; + res = 0; + } + + return res; +} + +/* Encode the DER data in PEM format into a BIO. + * + * @param [in] bio BIO to write to. + * @param [in] name Header/footer name. + * @param [in] header Encryption header. + * @param [in] data DER data. + * @param [in] len Length of DER data. + * @return 0 on failure. + */ +int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name, + const char *header, const unsigned char *data, long len) +{ + int err = 0; + char* pem = NULL; + word32 pemLen = 0; + + /* Validate parameters. */ + if ((bio == NULL) || (name == NULL) || (header == NULL) || (data == NULL)) { + err = BAD_FUNC_ARG; + } + + /* Encode into a buffer. */ + if (!err) { + err = pem_write_data(name, header, data, len, &pem, &pemLen); + } + + /* Write PEM into BIO. */ + if ((!err) && (wolfSSL_BIO_write(bio, pem, (int)pemLen) != (int)pemLen)) { + err = IO_FAILED_E; + } + + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return (!err) ? pemLen : 0; +} +#endif /* !NO_BIO */ + +#if !defined(NO_FILESYSTEM) +/* Read PEM encoded data from a file. + * + * Reads the entire contents in. + * + * @param [in] bio BIO to read from. + * @param [out] name Name of content type. + * @param [out] header Encryption headers. + * @param [out] data DER encoding from PEM. + * @param [out] len Length of DER data. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_read(XFILE fp, char **name, char **header, unsigned char **data, + long *len) +{ + int res = 1; + char* pem = NULL; + int pemLen = 0; + + /* Validate parameters. */ + if ((fp == XBADFILE) || (name == NULL) || (header == NULL) || + (data == NULL) || (len == NULL)) { + res = 0; + } + + /* Load all the data from the file. */ + if ((res == 1) && (wolfssl_read_file(fp, &pem, &pemLen) != 0)) { + res = 0; + } + + /* Read the PEM data. */ + if ((res == 1) && (pem_read_data(pem, pemLen, name, header, data, len) != + 0)) { + /* Dispose of any allocated memory. */ + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(*name, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(*header, NULL, DYNAMIC_TYPE_TMP_BUFFER); + *name = NULL; + *header = NULL; + res = 0; + } + + return res; +} + +/* Encode the DER data in PEM format into a file. + * + * @param [in] fp File pointer to write to. + * @param [in] name Header/footer name. + * @param [in] header Encryption header. + * @param [in] data DER data. + * @param [in] len Length of DER data. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header, + const unsigned char *data, long len) +{ + int err = 0; + char* pem = NULL; + word32 pemLen = 0; + + /* Validate parameters. */ + if ((fp == XBADFILE) || (name == NULL) || (header == NULL) || + (data == NULL)) { + err = 1; + } + + /* Encode into a buffer. */ + if ((!err) && (pem_write_data(name, header, data, len, &pem, &pemLen) != + 0)) { + pemLen = 0; + err = 1; + } + + /* Write PEM to a file. */ + if ((!err) && (XFWRITE(pem, 1, pemLen, fp) != pemLen)) { + pemLen = 0; + } + + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return (int)pemLen; +} +#endif + +/* Get EVP cipher info from encryption header string. + * + * @param [in] header Encryption header. + * @param [out] cipher EVP Cipher info. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header, EncryptedInfo* cipher) +{ + int res = 1; + + /* Validate parameters. */ + if ((header == NULL) || (cipher == NULL)) { + res = 0; + } + + if (res == 1) { + XMEMSET(cipher, 0, sizeof(*cipher)); + + if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0) { + res = 0; + } + } + + return res; +} + +/* Apply cipher to DER data. + * + * @param [in] cipher EVP cipher info. + * @param [in, out] data On in, encrypted DER data. + * On out, unencrypted DER data. + * @param [in, out] len On in, length of encrypted DER data. + * On out, length of unencrypted DER data. + * @param [in] cb Password callback. + * @param [in] ctx Context for password callback. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data, long* len, + wc_pem_password_cb* cb, void* ctx) +{ + int ret = 1; + char password[NAME_SZ]; + int passwordSz = 0; + + /* Validate parameters. */ + if ((cipher == NULL) || (data == NULL) || (len == NULL) || (cb == NULL)) { + ret = 0; + } + + if (ret == 1) { + /* Get password and length. */ + passwordSz = cb(password, sizeof(password), PEM_PASS_READ, ctx); + if (passwordSz < 0) { + ret = 0; + } + } + + if (ret == 1) { + /* Decrypt the data using password and MD5. */ + if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password, + passwordSz, WC_MD5) != 0) { + ret = WOLFSSL_FAILURE; + } + } + + if (passwordSz > 0) { + /* Ensure password is erased from memory. */ + ForceZero(password, (word32)passwordSz); + } + + return ret; +} + +#endif /* !NO_CERTS */ +#endif /* OPENSSL_EXTRA */ + +#ifdef OPENSSL_ALL +#if !defined(NO_PWDBASED) && defined(HAVE_PKCS8) + +#if !defined(NO_BIO) || (!defined(NO_FILESYSTEM) && \ + !defined(NO_STDIO_FILESYSTEM)) +/* Encrypt the key into a buffer using PKCS$8 and a password. + * + * @param [in] pkey Private key to encrypt. + * @param [in] enc EVP cipher. + * @param [in] passwd Password to encrypt with. + * @param [in] passwdSz Number of bytes in password. + * @param [in] key Buffer to hold encrypted key. + * @param [in, out] keySz On in, size of buffer in bytes. + * On out, size of encrypted key in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when EVP cipher not supported. + */ +static int pem_pkcs8_encrypt(WOLFSSL_EVP_PKEY* pkey, + const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz, byte* key, + word32* keySz) +{ + int ret; + WC_RNG rng; + + /* Initialize a new random number generator. */ + ret = wc_InitRng(&rng); + if (ret == 0) { + int encAlgId = 0; + + /* Convert EVP cipher to a support encryption id. */ + #ifndef NO_DES3 + if (enc == EVP_DES_CBC) { + encAlgId = DESb; + } + else if (enc == EVP_DES_EDE3_CBC) { + encAlgId = DES3b; + } + else + #endif +#if !defined(NO_AES) && defined(HAVE_AES_CBC) + #ifdef WOLFSSL_AES_128 + if (enc == EVP_AES_128_CBC) { + encAlgId = AES128CBCb; + } + else + #endif + #ifdef WOLFSSL_AES_256 + if (enc == EVP_AES_256_CBC) { + encAlgId = AES256CBCb; + } + else + #endif +#endif + { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Encrypt private into buffer. */ + ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, + key, keySz, passwd, passwdSz, PKCS5, PBES2, encAlgId, + NULL, 0, WC_PKCS12_ITT_DEFAULT, &rng, NULL); + if (ret > 0) { + *keySz = (word32)ret; + } + } + /* Dispose of random number generator. */ + wc_FreeRng(&rng); + } + + return ret; +} + +/* Encode private key in PKCS#8 format. + * + * @param [in] pkey Private key. + * @param [out] key Buffer to hold encoding. + * @param [in, out] keySz On in, size of buffer in bytes. + * @param On out, size of encoded key in bytes. + * @return 0 on success. + */ +static int pem_pkcs8_encode(WOLFSSL_EVP_PKEY* pkey, byte* key, word32* keySz) +{ + int ret = 0; + int algId; + const byte* curveOid; + word32 oidSz; + + /* Get the details of the private key. */ +#ifdef HAVE_ECC + if (pkey->type == EVP_PKEY_EC) { + /* ECC private and get curve OID information. */ + algId = ECDSAk; + ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid, + &oidSz); + } + else +#endif + if (pkey->type == EVP_PKEY_RSA) { + /* RSA private has no curve information. */ + algId = RSAk; + curveOid = NULL; + oidSz = 0; + } + else { + ret = NOT_COMPILED_IN; + } + + if (ret >= 0) { + /* Encode private key in PKCS#8 format. */ + ret = wc_CreatePKCS8Key(key, keySz, (byte*)pkey->pkey.ptr, + pkey->pkey_sz, algId, curveOid, oidSz); + } + + return ret; +} + +/* Write PEM encoded, PKCS#8 formatted private key to BIO. + * + * @param [out] pem Buffer holding PEM encoding. + * @param [out] pemSz Size of data in buffer in bytes. + * @param [in] pkey Private key to write. + * @param [in] enc Encryption information to use. May be NULL. + * @param [in] passwd Password to use when encrypting. May be NULL. + * @param [in] passwdSz Size of password in bytes. + * @param [in] cb Password callback. Used when passwd is NULL. May be + * NULL. + * @param [in] ctx Context for password callback. + * @return Length of PEM encoding on success. + * @return 0 on failure. + */ +static int pem_write_mem_pkcs8privatekey(byte** pem, int* pemSz, + WOLFSSL_EVP_PKEY* pkey, const WOLFSSL_EVP_CIPHER* enc, char* passwd, + int passwdSz, wc_pem_password_cb* cb, void* ctx) +{ + int res = 1; + int ret = 0; + char password[NAME_SZ]; + byte* key = NULL; + word32 keySz; + int type = PKCS8_PRIVATEKEY_TYPE; + + /* Validate parameters. */ + if (pkey == NULL) { + res = 0; + } + + if (res == 1) { + /* Guestimate key size and PEM size. */ + if (pem_pkcs8_encode(pkey, NULL, &keySz) != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { + res = 0; + } + } + if (res == 1) { + if (enc != NULL) { + /* Add on enough for extra DER data when encrypting. */ + keySz += 128; + } + /* PEM encoding size from DER size. */ + *pemSz = (int)(keySz + 2) / 3 * 4; + *pemSz += (*pemSz + 63) / 64; + /* Header and footer. */ + if (enc != NULL) { + /* Name is: 'ENCRYPTED PRIVATE KEY'. */ + *pemSz += 74; + } + else { + /* Name is: 'PRIVATE KEY'. */ + *pemSz += 54; + } + + /* Allocate enough memory to hold PEM encoded encrypted key. */ + *pem = (byte*)XMALLOC((size_t)*pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (*pem == NULL) { + res = 0; + } + else { + /* Use end of PEM buffer for key data. */ + key = *pem + *pemSz - keySz; + } + } + + if ((res == 1) && (enc != NULL)) { + /* Set type for PEM. */ + type = PKCS8_ENC_PRIVATEKEY_TYPE; + + if (passwd == NULL) { + /* Get the password by using callback. */ + passwdSz = cb(password, sizeof(password), 1, ctx); + if (passwdSz < 0) { + res = 0; + } + passwd = password; + } + + if (res == 1) { + /* Encrypt the private key. */ + ret = pem_pkcs8_encrypt(pkey, enc, passwd, passwdSz, key, &keySz); + if (ret <= 0) { + res = 0; + } + } + + /* Zeroize the password from memory. */ + if ((password == passwd) && (passwdSz > 0)) { + ForceZero(password, (word32)passwdSz); + } + } + else if ((res == 1) && (enc == NULL)) { + /* Set type for PEM. */ + type = PKCS8_PRIVATEKEY_TYPE; + + /* Encode private key in PKCS#8 format. */ + ret = pem_pkcs8_encode(pkey, key, &keySz); + if (ret < 0) { + res = 0; + } + } + + if (res == 1) { + /* Encode PKCS#8 formatted key to PEM. */ + ret = wc_DerToPemEx(key, keySz, *pem, (word32)*pemSz, NULL, type); + if (ret < 0) { + res = 0; + } + else { + *pemSz = ret; + } + } + + /* Return appropriate return code. */ + return (res == 0) ? 0 : ret; + +} +#endif /* !NO_BIO || (!NO_FILESYSTEM && !NO_STDIO_FILESYSTEM) */ + +#ifndef NO_BIO +/* Write PEM encoded, PKCS#8 formatted private key to BIO. + * + * TODO: OpenSSL returns 1 and 0 only. + * + * @param [in] bio BIO to write to. + * @param [in] pkey Private key to write. + * @param [in] enc Encryption information to use. May be NULL. + * @param [in] passwd Password to use when encrypting. May be NULL. + * @param [in] passwdSz Size of password in bytes. + * @param [in] cb Password callback. Used when passwd is NULL. May be + * NULL. + * @param [in] ctx Context for password callback. + * @return Length of PEM encoding on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio, + WOLFSSL_EVP_PKEY* pkey, const WOLFSSL_EVP_CIPHER* enc, char* passwd, + int passwdSz, wc_pem_password_cb* cb, void* ctx) +{ + byte* pem = NULL; + int pemSz = 0; + int res = 1; + + /* Validate parameters. */ + if (bio == NULL) { + res = 0; + } + if (res == 1) { + /* Write private key to memory. */ + res = pem_write_mem_pkcs8privatekey(&pem, &pemSz, pkey, enc, passwd, + passwdSz, cb, ctx); + } + + /* Write encoded key to BIO. */ + if ((res >= 1) && (wolfSSL_BIO_write(bio, pem, pemSz) != pemSz)) { + res = 0; + } + + /* Dispose of dynamically allocated memory (pem and key). */ + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return res; +} +#endif /* !NO_BIO */ + +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) +/* Write PEM encoded, PKCS#8 formatted private key to BIO. + * + * TODO: OpenSSL returns 1 and 0 only. + * + * @param [in] f File pointer. + * @param [in] pkey Private key to write. + * @param [in] enc Encryption information to use. May be NULL. + * @param [in] passwd Password to use when encrypting. May be NULL. + * @param [in] passwdSz Size of password in bytes. + * @param [in] cb Password callback. Used when passwd is NULL. May be + * NULL. + * @param [in] ctx Context for password callback. + * @return Length of PEM encoding on success. + * @return 0 on failure. + */ +int wolfSSL_PEM_write_PKCS8PrivateKey(XFILE f, WOLFSSL_EVP_PKEY* pkey, + const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz, + wc_pem_password_cb* cb, void* ctx) +{ + byte* pem = NULL; + int pemSz = 0; + int res = 1; + + /* Validate parameters. */ + if (f == XBADFILE) { + res = 0; + } + if (res == 1) { + /* Write private key to memory. */ + res = pem_write_mem_pkcs8privatekey(&pem, &pemSz, pkey, enc, passwd, + passwdSz, cb, ctx); + } + + /* Write encoded key to file. */ + if ((res >= 1) && (XFWRITE(pem, 1, (size_t)pemSz, f) != (size_t)pemSz)) { + res = 0; + } + + /* Dispose of dynamically allocated memory (pem and key). */ + XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return res; +} +#endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */ + +#endif /* !NO_PWDBASED && HAVE_PKCS8 */ +#endif /* OPENSSL_ALL */ + +/******************************************************************************* + * END OF GENERIC PUBLIC KEY PEM APIs + ******************************************************************************/ + #endif /* !WOLFSSL_PK_INCLUDED */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/quic.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/quic.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/quic.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/quic.c 2024-08-03 07:30:00.000000000 +0000 @@ -82,7 +82,12 @@ qr->capacity = qr->len = (word32)len; } else { - qr->capacity = qr->len = qr_length(data, len); + qr->capacity = qr->len = (word32) qr_length(data, len); + if (qr->capacity > WOLFSSL_QUIC_MAX_RECORD_CAPACITY) { + WOLFSSL_MSG("QUIC length read larger than expected"); + quic_record_free(ssl, qr); + return NULL; + } } if (qr->capacity == 0) { qr->capacity = 2*1024; @@ -118,19 +123,27 @@ missing = 4 - qr->end; if (len < missing) { XMEMCPY(qr->data + qr->end, data, len); - qr->end += len; + qr->end += (word32)len; consumed = len; goto cleanup; /* len consumed, but qr->len still unknown */ } XMEMCPY(qr->data + qr->end, data, missing); - qr->end += missing; + qr->end += (word32)missing; len -= missing; data += missing; consumed = missing; - qr->len = qr_length(qr->data, qr->end); + qr->len = (word32)qr_length(qr->data, qr->end); + + /* sanity check on length read from wire before use */ + if (qr->len > WOLFSSL_QUIC_MAX_RECORD_CAPACITY) { + WOLFSSL_MSG("Length read for quic is larger than expected"); + ret = BUFFER_E; + goto cleanup; + } + if (qr->len > qr->capacity) { - uint8_t *ndata = (uint8_t*)XREALLOC(qr->data, qr->len, ssl->head, + uint8_t *ndata = (uint8_t*)XREALLOC(qr->data, qr->len, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); if (!ndata) { ret = WOLFSSL_FAILURE; @@ -150,7 +163,7 @@ len = missing; } XMEMCPY(qr->data + qr->end, data, len); - qr->end += len; + qr->end += (word32)len; consumed += len; cleanup: @@ -159,7 +172,7 @@ } -static word32 add_rec_header(byte* output, word32 length, int type) +static word32 add_rec_header(byte* output, word32 length, byte type) { RecordLayerHeader* rl; @@ -175,15 +188,21 @@ return RECORD_HEADER_SZ; } -static word32 quic_record_transfer(QuicRecord* qr, byte* buf, word32 sz) +static sword32 quic_record_transfer(QuicRecord* qr, byte* buf, word32 sz) { word32 len = qr->end - qr->start; word32 offset = 0; - word16 rlen; + word32 rlen; if (len <= 0) { return 0; } + + /* We check if the buf is at least RECORD_HEADER_SZ */ + if (sz < RECORD_HEADER_SZ) { + return -1; + } + if (qr->rec_hdr_remain == 0) { /* start a new TLS record */ rlen = (qr->len <= (word32)MAX_RECORD_SIZE) ? @@ -205,7 +224,7 @@ qr->start += len; qr->rec_hdr_remain -= len; } - return len + offset; + return (sword32)(len + offset); } @@ -223,7 +242,7 @@ return NULL; } XMEMCPY((uint8_t*)tp->data, data, len); - tp->len = len; + tp->len = (word16)len; return tp; } @@ -753,7 +772,7 @@ /* Called internally when SSL wants a certain amount of input. */ int wolfSSL_quic_receive(WOLFSSL* ssl, byte* buf, word32 sz) { - word32 n = 0; + sword32 n = 0; int transferred = 0; WOLFSSL_ENTER("wolfSSL_quic_receive"); @@ -761,6 +780,11 @@ n = 0; if (ssl->quic.input_head) { n = quic_record_transfer(ssl->quic.input_head, buf, sz); + + /* record too small to be fit into a RecordLayerHeader struct. */ + if (n == -1) { + return -1; + } if (quic_record_done(ssl->quic.input_head)) { QuicRecord* qr = ssl->quic.input_head; ssl->quic.input_head = qr->next; @@ -778,9 +802,9 @@ ssl->error = transferred = WANT_READ; goto cleanup; } - sz -= n; + sz -= (word32)n; buf += n; - transferred += n; + transferred += (int)n; } cleanup: WOLFSSL_LEAVE("wolfSSL_quic_receive", transferred); @@ -823,8 +847,8 @@ goto cleanup; } output += len; - length -= len; - ssl->quic.output_rec_remain -= len; + length -= (word32)len; + ssl->quic.output_rec_remain -= (word32)len; } else { /* at start of a TLS Record */ @@ -950,8 +974,18 @@ const WOLFSSL_EVP_CIPHER* wolfSSL_quic_get_aead(WOLFSSL* ssl) { - WOLFSSL_CIPHER* cipher = wolfSSL_get_current_cipher(ssl); - const WOLFSSL_EVP_CIPHER* evp_cipher; + WOLFSSL_CIPHER* cipher = NULL; + const WOLFSSL_EVP_CIPHER* evp_cipher = NULL; + + if (ssl == NULL) { + return NULL; + } + + cipher = wolfSSL_get_current_cipher(ssl); + + if (cipher == NULL) { + return NULL; + } switch (cipher->cipherSuite) { #if !defined(NO_AES) && defined(HAVE_AESGCM) @@ -967,11 +1001,13 @@ evp_cipher = wolfSSL_EVP_chacha20_poly1305(); break; #endif -#if defined(WOLFSSL_AES_COUNTER) && defined(WOLFSSL_AES_128) +#if !defined(NO_AES) && defined(HAVE_AESCCM) && defined(WOLFSSL_AES_128) case TLS_AES_128_CCM_SHA256: - FALL_THROUGH; + evp_cipher = wolfSSL_EVP_aes_128_ccm(); + break; case TLS_AES_128_CCM_8_SHA256: - evp_cipher = wolfSSL_EVP_aes_128_ctr(); + WOLFSSL_MSG("wolfSSL_quic_get_aead: no CCM-8 support in EVP layer"); + evp_cipher = NULL; break; #endif @@ -988,7 +1024,8 @@ return evp_cipher; } -static int evp_cipher_eq(const WOLFSSL_EVP_CIPHER* c1, +/* currently only used if HAVE_CHACHA && HAVE_POLY1305. */ +WC_MAYBE_UNUSED static int evp_cipher_eq(const WOLFSSL_EVP_CIPHER* c1, const WOLFSSL_EVP_CIPHER* c2) { /* We could check on nid equality, but we seem to have singulars */ @@ -997,31 +1034,54 @@ const WOLFSSL_EVP_CIPHER* wolfSSL_quic_get_hp(WOLFSSL* ssl) { - WOLFSSL_CIPHER* cipher = wolfSSL_get_current_cipher(ssl); - const WOLFSSL_EVP_CIPHER* evp_cipher; + WOLFSSL_CIPHER* cipher = NULL; + const WOLFSSL_EVP_CIPHER* evp_cipher = NULL; + + if (ssl == NULL) { + return NULL; + } + + cipher = wolfSSL_get_current_cipher(ssl); + + if (cipher == NULL) { + return NULL; + } switch (cipher->cipherSuite) { -#if !defined(NO_AES) && defined(HAVE_AESGCM) +#if !defined(NO_AES) && defined(HAVE_AESGCM) && defined(WOLFSSL_AES_COUNTER) + /* This has to be CTR even though the spec says that ECB is used for + * mask generation. ngtcp2_crypto_hp_mask uses a hack where they pass + * in the "ECB" input as the IV for the CTR cipher and then the input + * is just a cleared buffer. They do this so that the EVP + * init-update-final cycle can be used without the padding that is added + * for EVP_aes_(128|256)_ecb. */ +#if defined(WOLFSSL_AES_128) case TLS_AES_128_GCM_SHA256: evp_cipher = wolfSSL_EVP_aes_128_ctr(); break; +#endif +#if defined(WOLFSSL_AES_256) case TLS_AES_256_GCM_SHA384: evp_cipher = wolfSSL_EVP_aes_256_ctr(); break; #endif +#endif #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) case TLS_CHACHA20_POLY1305_SHA256: evp_cipher = wolfSSL_EVP_chacha20(); break; #endif -#if defined(WOLFSSL_AES_COUNTER) && defined(WOLFSSL_AES_128) +#if !defined(NO_AES) && defined(HAVE_AESCCM) && defined(WOLFSSL_AES_128) && \ + defined(WOLFSSL_AES_COUNTER) + /* This has to be CTR. See comment above. */ case TLS_AES_128_CCM_SHA256: - FALL_THROUGH; - case TLS_AES_128_CCM_8_SHA256: evp_cipher = wolfSSL_EVP_aes_128_ctr(); break; + case TLS_AES_128_CCM_8_SHA256: + WOLFSSL_MSG("wolfSSL_quic_get_hp: no CCM-8 support in EVP layer"); + evp_cipher = NULL; + break; #endif - default: evp_cipher = NULL; break; @@ -1039,8 +1099,7 @@ { size_t ret; #ifdef WOLFSSL_SMALL_STACK - WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX *)XMALLOC( - sizeof(*ctx), NULL, DYNAMIC_TYPE_TMP_BUFFER); + WOLFSSL_EVP_CIPHER_CTX *ctx = wolfSSL_EVP_CIPHER_CTX_new(); if (ctx == NULL) return 0; #else @@ -1050,13 +1109,14 @@ XMEMSET(ctx, 0, sizeof(*ctx)); if (wolfSSL_EVP_CipherInit(ctx, aead_cipher, NULL, NULL, 0) == WOLFSSL_SUCCESS) { - ret = ctx->authTagSz; + ret = (size_t)ctx->authTagSz; } else { ret = 0; } + (void)wolfSSL_EVP_CIPHER_CTX_cleanup(ctx); #ifdef WOLFSSL_SMALL_STACK - XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUF); + XFREE(ctx, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return ret; @@ -1064,30 +1124,12 @@ int wolfSSL_quic_aead_is_gcm(const WOLFSSL_EVP_CIPHER* aead_cipher) { -#if !defined(NO_AES) && defined(HAVE_AESGCM) - if (evp_cipher_eq(aead_cipher, wolfSSL_EVP_aes_128_gcm()) -#ifdef WOLFSSL_AES_256 - || evp_cipher_eq(aead_cipher, wolfSSL_EVP_aes_256_gcm()) -#endif - ) { - return 1; - } -#else - (void)aead_cipher; -#endif - return 0; + return WOLFSSL_EVP_CIPHER_mode(aead_cipher) == WOLFSSL_EVP_CIPH_GCM_MODE; } int wolfSSL_quic_aead_is_ccm(const WOLFSSL_EVP_CIPHER* aead_cipher) { -#if defined(WOLFSSL_AES_COUNTER) && defined(WOLFSSL_AES_128) - if (evp_cipher_eq(aead_cipher, wolfSSL_EVP_aes_128_ctr())) { - return 1; - } -#else - (void)aead_cipher; -#endif - return 0; + return WOLFSSL_EVP_CIPHER_mode(aead_cipher) == WOLFSSL_EVP_CIPH_CCM_MODE; } int wolfSSL_quic_aead_is_chacha20(const WOLFSSL_EVP_CIPHER* aead_cipher) @@ -1324,7 +1366,7 @@ return WOLFSSL_FAILURE; } - enclen -= ctx->authTagSz; + enclen -= (size_t)ctx->authTagSz; tag = enc + enclen; if (wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, 0) != WOLFSSL_SUCCESS diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/sniffer.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/sniffer.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/sniffer.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/sniffer.c 2024-08-03 07:30:00.000000000 +0000 @@ -373,6 +373,9 @@ "Setting up keys", "Unsupported TLS Version", "Server Client Key Mismatch", + + /* 99 */ + "Invalid or missing keylog file", }; @@ -436,10 +439,14 @@ NamedKey* namedKeys; /* mapping of names and keys */ wolfSSL_Mutex namedKeysMutex; /* mutex for namedKey list */ #endif +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + byte useKeyLogFile; /* True if session secrets are coming from a + keylog file */ +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ + struct SnifferServer* next; /* for list */ } SnifferServer; - /* Session Flags */ typedef struct Flags { byte side; /* which end is current packet headed */ @@ -561,13 +568,13 @@ /* Sniffer Server List and mutex */ static THREAD_LS_T WOLFSSL_GLOBAL SnifferServer* ServerList = NULL; #ifndef HAVE_C___ATOMIC -static WOLFSSL_GLOBAL wolfSSL_Mutex ServerListMutex; +static WOLFSSL_GLOBAL wolfSSL_Mutex ServerListMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(ServerListMutex); #endif /* Session Hash Table, mutex, and count */ static THREAD_LS_T WOLFSSL_GLOBAL SnifferSession* SessionTable[HASH_SIZE]; #ifndef HAVE_C___ATOMIC -static WOLFSSL_GLOBAL wolfSSL_Mutex SessionMutex; +static WOLFSSL_GLOBAL wolfSSL_Mutex SessionMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(SessionMutex); #endif static THREAD_LS_T WOLFSSL_GLOBAL int SessionCount = 0; @@ -576,7 +583,7 @@ /* per session max recovery memory */ #ifndef WOLFSSL_SNIFFER_NO_RECOVERY /* Recovery of missed data switches and stats */ -static WOLFSSL_GLOBAL wolfSSL_Mutex RecoveryMutex; /* for stats */ +static WOLFSSL_GLOBAL wolfSSL_Mutex RecoveryMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(RecoveryMutex); /* for stats */ /* # of sessions with missed data */ static WOLFSSL_GLOBAL word32 MissedDataSessions = 0; #endif @@ -588,7 +595,7 @@ #ifdef WOLFSSL_SNIFFER_STATS /* Sessions Statistics */ static WOLFSSL_GLOBAL SSLStats SnifferStats; -static WOLFSSL_GLOBAL wolfSSL_Mutex StatsMutex; +static WOLFSSL_GLOBAL wolfSSL_Mutex StatsMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(StatsMutex); #endif #ifdef WOLFSSL_SNIFFER_KEY_CALLBACK @@ -619,8 +626,8 @@ #ifdef WOLFSSL_SNIFFER_STATS #ifdef HAVE_C___ATOMIC - #define LOCK_STAT() - #define UNLOCK_STAT() + #define LOCK_STAT() WC_DO_NOTHING + #define UNLOCK_STAT() WC_DO_NOTHING #define NOLOCK_ADD_TO_STAT(x,y) ({ TraceStat(#x, y); \ __atomic_fetch_add(&x, y, __ATOMIC_RELAXED); }) #else @@ -636,10 +643,10 @@ #endif /* WOLFSSL_SNIFFER_STATS */ #ifdef HAVE_C___ATOMIC - #define LOCK_SESSION() - #define UNLOCK_SESSION() - #define LOCK_SERVER_LIST() - #define UNLOCK_SERVER_LIST() + #define LOCK_SESSION() WC_DO_NOTHING + #define UNLOCK_SESSION() WC_DO_NOTHING + #define LOCK_SERVER_LIST() WC_DO_NOTHING + #define UNLOCK_SERVER_LIST() WC_DO_NOTHING #else #define LOCK_SESSION() wc_LockMutex(&SessionMutex) #define UNLOCK_SESSION() wc_UnLockMutex(&SessionMutex) @@ -652,11 +659,30 @@ static WOLFSSL_GLOBAL int CryptoDeviceId = INVALID_DEVID; #endif +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) +static int addSecretNode(unsigned char* clientRandom, + int type, + unsigned char* masterSecret, + char* error); +static void hexToBin(const char* hex, unsigned char* bin, int binLength); +static int parseKeyLogFile(const char* fileName, char* error); +static unsigned char* findSecret(unsigned char* clientRandom, int type); +static void freeSecretList(void); +static int snifferSecretCb(unsigned char* client_random, + int type, + unsigned char* output_secret); +static void setSnifferSecretCb(SnifferSession* session); +static int addKeyLogSnifferServerHelper(const char* address, + int port, + char* error); +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ + /* Initialize overall Sniffer */ void ssl_InitSniffer_ex(int devId) { wolfSSL_Init(); +#ifndef WOLFSSL_MUTEX_INITIALIZER #ifndef HAVE_C___ATOMIC wc_InitMutex(&ServerListMutex); wc_InitMutex(&SessionMutex); @@ -668,6 +694,11 @@ XMEMSET(&SnifferStats, 0, sizeof(SSLStats)); wc_InitMutex(&StatsMutex); #endif +#endif /* !WOLFSSL_MUTEX_INITIALIZER */ + +#ifdef WOLFSSL_SNIFFER_STATS + XMEMSET(&SnifferStats, 0, sizeof(SSLStats)); +#endif #if defined(WOLF_CRYPTO_CB) || defined(WOLFSSL_ASYNC_CRYPT) CryptoDeviceId = devId; #endif @@ -867,8 +898,17 @@ } ServerList = NULL; + + UNLOCK_SESSION(); UNLOCK_SERVER_LIST(); + +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + freeSecretList(); +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ + + +#ifndef WOLFSSL_MUTEX_INITIALIZER #ifndef WOLFSSL_SNIFFER_NO_RECOVERY wc_FreeMutex(&RecoveryMutex); #endif @@ -876,6 +916,7 @@ wc_FreeMutex(&SessionMutex); wc_FreeMutex(&ServerListMutex); #endif +#endif /* !WOLFSSL_MUTEX_INITIALIZER */ #ifdef WOLF_CRYPTO_CB #ifdef HAVE_INTEL_QA_SYNC @@ -1162,8 +1203,14 @@ { if (TraceOn) { XFPRINTF(TraceFile, "\tTrying to install a new Sniffer Server with\n"); - XFPRINTF(TraceFile, "\tserver: %s, port: %d, keyFile: %s\n", srv, port, - keyFile); + if (keyFile != NULL) { + XFPRINTF(TraceFile, "\tserver: %s, port: %d, keyFile: %s\n", + srv, port, keyFile); + } + else { + XFPRINTF(TraceFile, "\tserver: %s, port: %d\n", + srv, port); + } } } @@ -1732,6 +1779,7 @@ #endif + /* Caller locks ServerListMutex */ static int SetNamedPrivateKey(const char* name, const char* address, int port, const char* keyFile, int keySz, int typeKey, const char* password, @@ -1780,10 +1828,11 @@ if (serverIp.ip4 == XINADDR_NONE) { #ifdef FUSION_RTOS if (XINET_PTON(AF_INET6, address, serverIp.ip6, - sizeof(serverIp.ip4)) == 1) { + sizeof(serverIp.ip4)) == 1) #else - if (XINET_PTON(AF_INET6, address, serverIp.ip6) == 1) { + if (XINET_PTON(AF_INET6, address, serverIp.ip6) == 1) #endif + { serverIp.version = IPV6; } } @@ -2432,7 +2481,7 @@ args = (SetupKeysArgs*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_sk; @@ -2463,6 +2512,17 @@ } #endif + #if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + if (session->context->useKeyLogFile) { + ret = 0; + XMEMSET(args, 0, sizeof(SetupKeysArgs)); + + /* We want to skip all the key setup and go right to master secret generation, which is + * where we inject the master secret obtained from the keylog file */ + ssl->options.asyncState = TLS_ASYNC_FINALIZE; + } + #endif + switch (ssl->options.asyncState) { case TLS_ASYNC_BEGIN: { @@ -3029,7 +3089,7 @@ #endif /* HAVE_CURVE448 */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Handle async pending response */ ret = wolfSSL_AsyncPush(ssl, asyncDev); break; @@ -3084,12 +3144,17 @@ case TLS_ASYNC_FINALIZE: { - /* store for client side as well */ - XMEMCPY(session->sslClient->arrays->preMasterSecret, - session->sslServer->arrays->preMasterSecret, - session->sslServer->arrays->preMasterSz); - session->sslClient->arrays->preMasterSz = - session->sslServer->arrays->preMasterSz; + #if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + if (!session->context->useKeyLogFile) + #endif /* !WOLFSSL_SNIFFER_KEYLOGFILE */ + { + /* store for client side as well */ + XMEMCPY(session->sslClient->arrays->preMasterSecret, + session->sslServer->arrays->preMasterSecret, + session->sslServer->arrays->preMasterSz); + session->sslClient->arrays->preMasterSz = + session->sslServer->arrays->preMasterSz; + } #ifdef SHOW_SECRETS PrintSecret("pre master secret", @@ -3163,7 +3228,7 @@ exit_sk: /* Handle async pending response */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -3267,6 +3332,11 @@ info->curve_id = ECC_SECP256R1; break; #endif /* !NO_ECC_SECP */ + #ifdef WOLFSSL_SM2 + case WOLFSSL_ECC_SM2P256V1: + info->curve_id = ECC_SM2P256V1; + break; + #endif /* WOLFSSL_SM2 */ #endif #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) #ifndef NO_ECC_SECP @@ -3827,7 +3897,8 @@ #endif #ifdef WOLFSSL_ASYNC_CRYPT - if (session->sslServer->error != WC_PENDING_E && session->pendSeq == 0) + if (session->sslServer->error != WC_NO_ERR_TRACE(WC_PENDING_E) && + session->pendSeq == 0) #endif { /* hash server_hello */ @@ -3861,7 +3932,7 @@ session, error, &session->cliKs); if (ret != 0) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -4508,7 +4579,8 @@ #ifdef WOLFSSL_TLS13 if (type != client_hello && type != server_hello #ifdef WOLFSSL_ASYNC_CRYPT - && session->sslServer->error != WC_PENDING_E && session->pendSeq == 0 + && session->sslServer->error != WC_NO_ERR_TRACE(WC_PENDING_E) + && session->pendSeq == 0 #endif ) { /* For resumption the hash is before / after client_hello PSK binder */ @@ -4551,14 +4623,21 @@ Trace(GOT_CERT_REQ_STR); break; case server_key_exchange: -#ifdef WOLFSSL_SNIFFER_STATS - INC_STAT(SnifferStats.sslEphemeralMisses); -#endif Trace(GOT_SERVER_KEY_EX_STR); - /* can't know temp key passively */ - SetError(BAD_CIPHER_SPEC_STR, error, session, FATAL_ERROR_STATE); - session->verboseErr = 1; - ret = -1; + +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + if (!session->context->useKeyLogFile) +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ + { + /* can't know temp key passively */ + SetError(BAD_CIPHER_SPEC_STR, error, session, FATAL_ERROR_STATE); + session->verboseErr = 1; + ret = -1; + +#if defined(WOLFSSL_SNIFFER_STATS) + INC_STAT(SnifferStats.sslEphemeralMisses); +#endif /* WOLFSSL_SNIFFER_STATS */ + } break; case encrypted_extensions: Trace(GOT_ENC_EXT_STR); @@ -4619,7 +4698,7 @@ if (ret == 0) { ret = ProcessClientKeyExchange(input, sslBytes, session, error); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif if (ret != 0) { @@ -4686,7 +4765,7 @@ ret = wc_Des3_CbcDecrypt(ssl->decrypt.des3, plain, input, sz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.des3->asyncDev); } #endif @@ -4704,7 +4783,7 @@ #endif ret = wc_AesCbcDecrypt(ssl->decrypt.aes, plain, input, sz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev); } #endif @@ -4715,6 +4794,8 @@ case wolfssl_aes_gcm: case wolfssl_aes_ccm: /* GCM AEAD macros use same size as CCM */ { + /* For ciphers that use AEAD use the encrypt routine to + * bypass the auth tag checking */ wc_AesAuthEncryptFunc aes_auth_fn; #ifdef WOLFSSL_ASYNC_CRYPT @@ -4744,10 +4825,10 @@ input + AESGCM_EXP_IV_SZ, sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, ssl->decrypt.nonce, AESGCM_NONCE_SZ, - ssl->decrypt.additional, ssl->specs.aead_mac_size, + ssl->decrypt.additional, AEAD_AUTH_DATA_SZ, NULL, 0)) < 0) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev); } #endif @@ -4756,6 +4837,18 @@ break; #endif /* HAVE_AESGCM || HAVE_AESCCM */ + #ifdef HAVE_ARIA + case wolfssl_aria_gcm: + ret = wc_AriaDecrypt(ssl->decrypt.aria, + plain, + (byte *)input + AESGCM_EXP_IV_SZ, + sz - AESGCM_EXP_IV_SZ - ssl->specs.aead_mac_size, + ssl->decrypt.nonce, AESGCM_NONCE_SZ, + ssl->decrypt.additional, ssl->specs.aead_mac_size, + NULL, 0); + break; + #endif + #ifdef HAVE_CAMELLIA case wolfssl_camellia: ret = wc_CamelliaCbcDecrypt(ssl->decrypt.cam, plain, input, sz); @@ -4765,7 +4858,7 @@ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \ !defined(NO_CHAPOL_AEAD) case wolfssl_chacha: - ret = ChachaAEADEncrypt(ssl, plain, input, sz); + ret = ChachaAEADDecrypt(ssl, plain, input, sz); break; #endif @@ -4793,9 +4886,9 @@ #ifdef WOLFSSL_ASYNC_CRYPT if (ssl->decrypt.state != CIPHER_STATE_BEGIN) { ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* check for still pending */ - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; ssl->error = 0; /* clear async */ @@ -4851,7 +4944,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* If pending, return now */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -4903,7 +4996,7 @@ } #ifdef WOLFSSL_ASYNC_CRYPT /* for async the symmetric operations are blocking */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { do { ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW); } while (ret == 0); @@ -5105,6 +5198,13 @@ /* put server back into server mode */ session->sslServer->options.side = WOLFSSL_SERVER_END; +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + if (session->context->useKeyLogFile) { + setSnifferSecretCb(session); + } +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ + + row = SessionHash(ipInfo, tcpInfo); /* add it to the session table */ @@ -5156,7 +5256,7 @@ ret = ProcessOldClientHello(session->sslServer, input, &idx, *sslBytes, (word16)*rhSize); - if (ret < 0 && ret != MATCH_SUITE_ERROR) { + if (ret < 0 && ret != WC_NO_ERR_TRACE(MATCH_SUITE_ERROR)) { SetError(BAD_OLD_CLIENT_STR, error, session, FATAL_ERROR_STATE); return -1; } @@ -5581,7 +5681,7 @@ if (real + *sslBytes > *expected) { #ifdef WOLFSSL_ASYNC_CRYPT - if (session->sslServer->error != WC_PENDING_E && + if (session->sslServer->error != WC_NO_ERR_TRACE(WC_PENDING_E) && session->pendSeq != tcpInfo->sequence) #endif { @@ -5637,7 +5737,7 @@ * already been ack'd during handshake */ if ( #ifdef WOLFSSL_ASYNC_CRYPT - session->sslServer->error != WC_PENDING_E && + session->sslServer->error != WC_NO_ERR_TRACE(WC_PENDING_E) && session->pendSeq != tcpInfo->sequence && #endif FindPrevAck(session, real)) { @@ -5941,7 +6041,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* if this is a pending async packet do not "grow" on partial (we already did) */ if (session->pendSeq == tcpInfo->sequence) { - if (session->sslServer->error == WC_PENDING_E) { + if (session->sslServer->error == WC_NO_ERR_TRACE(WC_PENDING_E)) { return 0; /* don't check pre-record again */ } /* if record check already done then restore, otherwise process normal */ @@ -6273,7 +6373,7 @@ Trace(GOT_HANDSHAKE_STR); ret = DoHandShake(sslFrame, &sslBytes, session, error, rhSize); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif if (ret != 0 || sslBytes > startIdx) { @@ -6475,10 +6575,10 @@ SnifferSession* session, char* error) { if (session && session->flags.fatalError == FATAL_ERROR_STATE) { - RemoveSession(session, ipInfo, tcpInfo, 0); if (!session->verboseErr) { SetError(FATAL_ERROR_STR, error, NULL, 0); } + RemoveSession(session, ipInfo, tcpInfo, 0); return 1; } return 0; @@ -6557,7 +6657,7 @@ if (RemoveFatalSession(&ipInfo, &tcpInfo, session, error)) return WOLFSSL_SNIFFER_FATAL_ERROR; #ifdef WOLFSSL_ASYNC_CRYPT - else if (ret == WC_PENDING_E) return WC_PENDING_E; + else if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return WC_PENDING_E; #endif else if (ret == -1) return WOLFSSL_SNIFFER_ERROR; else if (ret == 1) { @@ -6608,7 +6708,8 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* make sure this server was polled */ - if (asyncOkay && session->sslServer->error == WC_PENDING_E && + if (asyncOkay && + session->sslServer->error == WC_NO_ERR_TRACE(WC_PENDING_E) && !session->flags.wasPolled) { return WC_PENDING_E; } @@ -6616,7 +6717,7 @@ #ifdef WOLFSSL_SNIFFER_STATS #ifdef WOLFSSL_ASYNC_CRYPT - if (session->sslServer->error != WC_PENDING_E) + if (session->sslServer->error != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { if (sslBytes > 0) { @@ -6638,7 +6739,7 @@ session->sslServer->error = ret; #ifdef WOLFSSL_ASYNC_CRYPT /* capture the seq pending for this session */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { session->flags.wasPolled = 0; session->pendSeq = tcpInfo.sequence; if (!asyncOkay || CryptoDeviceId == INVALID_DEVID) { @@ -6653,7 +6754,7 @@ else { session->pendSeq = 0; } - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #else (void)asyncOkay; #endif @@ -7115,6 +7216,409 @@ } #endif + +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + +/* Maximum length of the NSS Keylog prefix string */ +#define MAX_PREFIX_LENGTH (31) +/* Maximum length (in bytes) required to store the binary representation of + * the "client random" value parsed from keylog file */ +#define CLIENT_RANDOM_LENGTH (32) +/* Maximum length (in bytes) required to store the binary representation of the + * "secret" value parsed from keylog file */ +#define SECRET_LENGTH (48) + +typedef struct SecretNode { + unsigned char clientRandom[CLIENT_RANDOM_LENGTH]; + unsigned char secrets[SNIFFER_SECRET_NUM_SECRET_TYPES][SECRET_LENGTH]; + struct SecretNode* next; +} SecretNode; + + +/* Default to the same size hash table as the session table, + * but allow user to override */ +#ifndef WOLFSSL_SNIFFER_KEYLOGFILE_HASH_TABLE_SIZE +#define WOLFSSL_SNIFFER_KEYLOGFILE_HASH_TABLE_SIZE HASH_SIZE +#endif + +static THREAD_LS_T WOLFSSL_GLOBAL +SecretNode* +secretHashTable[WOLFSSL_SNIFFER_KEYLOGFILE_HASH_TABLE_SIZE] = {NULL}; +#ifndef HAVE_C___ATOMIC +static WOLFSSL_GLOBAL wolfSSL_Mutex secretListMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(secretListMutex); +#endif + +static unsigned int secretHashFunction(unsigned char* clientRandom); + +#ifdef HAVE_C___ATOMIC + #define LOCK_SECRET_LIST() WC_DO_NOTHING + #define UNLOCK_SECRET_LIST() WC_DO_NOTHING +#else + #define LOCK_SECRET_LIST() wc_LockMutex(&secretListMutex) + #define UNLOCK_SECRET_LIST() wc_UnLockMutex(&secretListMutex) +#endif + + +/* + * Basic polynomial hash function that maps a 32-byte client random value to an + * array index + */ +static unsigned int secretHashFunction(unsigned char* clientRandom) +{ + int i = 0; + unsigned int hash = 0; + const int CLIENT_RANDOM_NUM_BITS = CLIENT_RANDOM_LENGTH * 8; + + for (i = 0; i < CLIENT_RANDOM_LENGTH; i++) { + hash = (hash * CLIENT_RANDOM_NUM_BITS + clientRandom[i]) + % WOLFSSL_SNIFFER_KEYLOGFILE_HASH_TABLE_SIZE; + } + + return hash; +} + + +/* + * Adds a new secret to the secret table, creating a new node based on the + * client random if necessary. If the client random is already present in the + * list, the requested secret will be updated. + */ +static int addSecretNode(unsigned char* clientRandom, + int type, + unsigned char* secret, + char* error) +{ + int index = 0; + int ret = 0; + SecretNode* node = NULL; + + if (type >= SNIFFER_SECRET_NUM_SECRET_TYPES) { + return WOLFSSL_SNIFFER_ERROR; + } + + LOCK_SECRET_LIST(); + + index = secretHashFunction(clientRandom); + node = secretHashTable[index]; + + while(node) { + /* Node already exists, so just add the requested secret */ + if (XMEMCMP(node->clientRandom, clientRandom, CLIENT_RANDOM_LENGTH) + == 0) + { + XMEMCPY(node->secrets[type], secret, SECRET_LENGTH); + ret = 0; + goto unlockReturn; + } + node = node ->next; + } + + node = (SecretNode*)XMALLOC(sizeof(SecretNode), + NULL, + DYNAMIC_TYPE_SNIFFER_KEYLOG_NODE); + if (node == NULL) { + SetError(MEMORY_STR, error, NULL, 0); + ret = WOLFSSL_SNIFFER_ERROR; + goto unlockReturn; + } + + XMEMCPY(node->clientRandom, clientRandom, CLIENT_RANDOM_LENGTH); + XMEMCPY(node->secrets[type], secret, SECRET_LENGTH); + node->next = secretHashTable[index]; + secretHashTable[index] = node; + +unlockReturn: + + UNLOCK_SECRET_LIST(); + + return ret; +} + + +/* + * Looks up a master secret for a given client random from the keylog file + */ +static unsigned char* findSecret(unsigned char* clientRandom, int type) +{ + unsigned char* secret = NULL; + SecretNode* node = NULL; + unsigned int index = 0; + + LOCK_SECRET_LIST(); + + index = secretHashFunction(clientRandom); + node = secretHashTable[index]; + + while (node != NULL) { + if (XMEMCMP(node->clientRandom, + clientRandom, CLIENT_RANDOM_LENGTH) == 0) { + secret = node->secrets[type]; + break; + } + node = node->next; + } + + UNLOCK_SECRET_LIST(); + + return secret; +} + + +static void hexToBin(const char* hex, unsigned char* bin, int binLength) +{ + int i = 0; + for (i = 0; i < binLength; i++) { + sscanf(hex + 2*i, "%02hhx", &bin[i]); + } +} + +/* + * Helper function to parse secrets from the keylog file into the secret table + */ +static int parseKeyLogFile(const char* fileName, char* error) +{ + unsigned char clientRandom[CLIENT_RANDOM_LENGTH]; + unsigned char secret[SECRET_LENGTH]; + FILE* file = NULL; + int ret = 0; + int type = 0; + /* +1 for null terminator */ + char prefix[MAX_PREFIX_LENGTH + 1] = {0}; + /* 2 chars for Hexadecimal representation, plus null terminator */ + char clientRandomHex[2 * CLIENT_RANDOM_LENGTH + 1] = {0}; + char secretHex[2 * SECRET_LENGTH + 1] = {0}; + + + file = fopen(fileName, "r"); + if (file == NULL) { + fprintf(stderr, "Could not open keylog file: %s\n", fileName); + SetError(KEYLOG_FILE_INVALID, error, NULL, 0); + return WOLFSSL_SNIFFER_ERROR; + } + + /* Format specifiers for each column should be: + * MAX_PREFIX_LENGTH, 2*CLIENT_RANDOM_LENGTH, and 2*SECRET_LENGTH */ + while (fscanf(file, "%31s %64s %96s", prefix, clientRandomHex, secretHex) + == 3) { + + if (XSTRCMP(prefix, "CLIENT_RANDOM") == 0) { + type = SNIFFER_SECRET_TLS12_MASTER_SECRET; + } +#if defined(WOLFSSL_TLS13) + else if (XSTRCMP(prefix, "CLIENT_EARLY_TRAFFIC_SECRET") == 0) { + type = SNIFFER_SECRET_CLIENT_EARLY_TRAFFIC_SECRET; + } + else if (XSTRCMP(prefix, "CLIENT_HANDSHAKE_TRAFFIC_SECRET") == 0) { + type = SNIFFER_SECRET_CLIENT_HANDSHAKE_TRAFFIC_SECRET; + } + else if (XSTRCMP(prefix, "SERVER_HANDSHAKE_TRAFFIC_SECRET") == 0) { + type = SNIFFER_SECRET_SERVER_HANDSHAKE_TRAFFIC_SECRET; + } + else if (XSTRCMP(prefix, "CLIENT_TRAFFIC_SECRET_0") == 0) { + type = SNIFFER_SECRET_CLIENT_TRAFFIC_SECRET; + } + else if (XSTRCMP(prefix, "SERVER_TRAFFIC_SECRET_0") == 0) { + type = SNIFFER_SECRET_SERVER_TRAFFIC_SECRET; + } +#endif /* WOLFSSL_TLS13 */ + else { + fprintf(stderr, "unrecognized prefix: %s\n", prefix); + continue; + } + + hexToBin(clientRandomHex, clientRandom, CLIENT_RANDOM_LENGTH); + hexToBin(secretHex, secret, SECRET_LENGTH); + ret = addSecretNode(clientRandom, type, secret, error); + + if (ret != 0) { + fclose(file); + return ret; + } + } + fclose(file); + + return 0; +} + + +static void freeSecretList(void) +{ + int i = 0; + + LOCK_SECRET_LIST(); + + for (i=0; inext; + XFREE(current, NULL, DYNAMIC_TYPE_SNIFFER_KEYLOG_NODE); + current = next; + } + } + + UNLOCK_SECRET_LIST(); +} + + +/* + * Looks up secret based on client random and copies it to output_secret + */ +static int snifferSecretCb(unsigned char* client_random, + int type, + unsigned char* output_secret) +{ + unsigned char* secret = NULL; + + if (client_random == NULL || output_secret == NULL) { + return WOLFSSL_SNIFFER_FATAL_ERROR; + } + + if (type >= SNIFFER_SECRET_NUM_SECRET_TYPES) { + return WOLFSSL_SNIFFER_FATAL_ERROR; + } + + /* get secret from secret table based on client random */ + secret = findSecret(client_random, type); + if (secret != NULL) { + XMEMCPY(output_secret, secret, SECRET_LENGTH); + return 0; + } + + /* didn't find the secret */ + return WOLFSSL_SNIFFER_ERROR; +} + + +static void setSnifferSecretCb(SnifferSession* session) +{ + session->context->useKeyLogFile = 1; + session->sslServer->snifferSecretCb = snifferSecretCb; + session->sslClient->snifferSecretCb = snifferSecretCb; +} + + +/* + * Helper function that creates a sniffer server object that can decrypt using + * a keylog file, and adds it to the server list + * + * NOTE: the caller is responsible for locking and unlocking the server list + */ +static int addKeyLogSnifferServerHelper(const char* address, + int port, + char* error) +{ + IpAddrInfo serverIp = {0}; + SnifferServer *sniffer = NULL; + + TraceHeader(); + TraceSetServer(address, port, NULL); + + serverIp.version = IPV4; + serverIp.ip4 = XINET_ADDR(address); + if (serverIp.ip4 == XINADDR_NONE) { + #ifdef FUSION_RTOS + if (XINET_PTON(AF_INET6, address, serverIp.ip6, + sizeof(serverIp.ip4)) == 1) + #else + if (XINET_PTON(AF_INET6, address, serverIp.ip6) == 1) + #endif + { + serverIp.version = IPV6; + } + } + + sniffer = ServerList; + while (sniffer != NULL && + (!MatchAddr(sniffer->server, serverIp) || sniffer->port != port)) { + sniffer = sniffer->next; + } + + if (sniffer == NULL) { + sniffer = (SnifferServer*)XMALLOC(sizeof(SnifferServer), + NULL, DYNAMIC_TYPE_SNIFFER_SERVER); + if (sniffer == NULL) { + SetError(MEMORY_STR, error, NULL, 0); + return WOLFSSL_SNIFFER_ERROR; + } + InitSnifferServer(sniffer); + + XSTRNCPY(sniffer->address, address, MAX_SERVER_ADDRESS-1); + sniffer->address[MAX_SERVER_ADDRESS-1] = '\0'; + sniffer->server = serverIp; + sniffer->port = port; + + sniffer->ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); + if (!sniffer->ctx) { + SetError(MEMORY_STR, error, NULL, 0); + FreeSnifferServer(sniffer); + return WOLFSSL_SNIFFER_ERROR; + } + #if defined(WOLF_CRYPTO_CB) || defined(WOLFSSL_ASYNC_CRYPT) + if (CryptoDeviceId != INVALID_DEVID) + wolfSSL_CTX_SetDevId(sniffer->ctx, CryptoDeviceId); + #endif + + sniffer->next = ServerList; + ServerList = sniffer; + } + else { + printf("SESSION ALREADY EXISTS\n"); + } + + /* Tag the new or existing server as requiring keylog support to + * decrypt, otherwise it won't be usable */ + sniffer->useKeyLogFile = 1; + + return 0; +} + +/* + * Creates a sniffer server that is able to decrypt using secrets from a + * keylog file, and adds it to the server list + * + * If a server at the address and port already exists, it will be marked + * for keylog file decryption + */ +int ssl_CreateKeyLogSnifferServer(const char* address, int port, char* error) +{ + int ret = 0; + + if (address == NULL) { + SetError(KEYLOG_FILE_INVALID, error, NULL, 0); + return WOLFSSL_SNIFFER_ERROR; + } + + LOCK_SERVER_LIST(); + + ret = addKeyLogSnifferServerHelper(address, port, error); + + UNLOCK_SERVER_LIST(); + + return ret; +} + + +/* + * Loads secrets to decrypt TLS traffic from a keylog file. Only sniffer + * servers registered with ssl_createKeyLogSnifferServer() will be able to + * decrypt using these secrets + */ +int ssl_LoadSecretsFromKeyLogFile(const char* keylogfile, char* error) +{ + if (keylogfile == NULL) { + SetError(KEYLOG_FILE_INVALID, error, NULL, 0); + return WOLFSSL_SNIFFER_ERROR; + } + + return parseKeyLogFile(keylogfile, error); +} + +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ + + #undef ERROR_OUT #endif /* WOLFSSL_SNIFFER */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl.c 2024-08-03 07:30:00.000000000 +0000 @@ -54,7 +54,8 @@ #if defined(NO_DH) && !defined(HAVE_ECC) && !defined(WOLFSSL_STATIC_RSA) \ && !defined(WOLFSSL_STATIC_DH) && !defined(WOLFSSL_STATIC_PSK) \ && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) - #error "No cipher suites defined because DH disabled, ECC disabled, and no static suites defined. Please see top of README" + #error "No cipher suites defined because DH disabled, ECC disabled, " + "and no static suites defined. Please see top of README" #endif #ifdef WOLFSSL_CERT_GEN /* need access to Cert struct for creating certificate */ @@ -115,14 +116,15 @@ #include #include #include - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) #include #endif /* HAVE_FALCON */ #if defined(HAVE_DILITHIUM) #include #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ + #if defined(HAVE_SPHINCS) + #include + #endif /* HAVE_SPHINCS */ #if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) #ifdef HAVE_OCSP #include @@ -137,12 +139,6 @@ && !defined(WC_NO_RNG) #include #endif - #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST) - #include - #endif - #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) - #include - #endif /* OPENSSL_ALL && HAVE_PKCS7 */ #endif #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) @@ -160,25 +156,6 @@ #endif #endif /* !WOLFCRYPT_ONLY || OPENSSL_EXTRA */ -#ifdef WOLFSSL_SYS_CA_CERTS - -#ifdef _WIN32 - #include - #include - - /* mingw gcc does not support pragma comment, and the - * linking with crypt32 is handled in configure.ac */ - #if !defined(__MINGW32__) && !defined(__MINGW64__) - #pragma comment(lib, "crypt32") - #endif -#endif - -#if defined(__APPLE__) && defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) -#include -#endif - -#endif /* WOLFSSL_SYS_CA_CERTS */ - /* * OPENSSL_COMPATIBLE_DEFAULTS: * Enable default behaviour that is compatible with OpenSSL. For example @@ -208,6 +185,18 @@ #define WOLFSSL_EVP_INCLUDED #include "wolfcrypt/src/evp.c" +/* Crypto code uses EVP APIs. */ +#define WOLFSSL_SSL_CRYPTO_INCLUDED +#include "src/ssl_crypto.c" + +#ifndef WOLFCRYPT_ONLY +#define WOLFSSL_SSL_CERTMAN_INCLUDED +#include "src/ssl_certman.c" + +#define WOLFSSL_SSL_SESS_INCLUDED +#include "src/ssl_sess.c" +#endif + #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(WOLFCRYPT_ONLY) /* Convert shortname to NID. @@ -298,10 +287,13 @@ #define HAVE_GLOBAL_RNG /* consolidate flags for using globalRNG */ static WC_RNG globalRNG; -static int initGlobalRNG = 0; +static volatile int initGlobalRNG = 0; -static wolfSSL_Mutex globalRNGMutex; +static WC_MAYBE_UNUSED wolfSSL_Mutex globalRNGMutex + WOLFSSL_MUTEX_INITIALIZER_CLAUSE(globalRNGMutex); +#ifndef WOLFSSL_MUTEX_INITIALIZER static int globalRNGMutex_valid = 0; +#endif #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG) static WOLFSSL_DRBG_CTX* gDrbgDefCtx = NULL; @@ -397,8 +389,11 @@ * OPENSSL_EXTRA where RAND callbacks are not used */ #ifndef WOLFSSL_NO_OPENSSL_RAND_CB static const WOLFSSL_RAND_METHOD* gRandMethods = NULL; + static wolfSSL_Mutex gRandMethodMutex + WOLFSSL_MUTEX_INITIALIZER_CLAUSE(gRandMethodMutex); + #ifndef WOLFSSL_MUTEX_INITIALIZER static int gRandMethodsInit = 0; - static wolfSSL_Mutex gRandMethodMutex; + #endif #endif /* !WOLFSSL_NO_OPENSSL_RAND_CB */ #endif /* OPENSSL_EXTRA */ @@ -415,44 +410,6 @@ #include -#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) -const WOLF_EC_NIST_NAME kNistCurves[] = { - {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1}, - {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1}, - {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1}, - {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2}, - {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1}, - {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2}, - {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1}, - {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2}, - {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1}, - {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1}, - {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1}, - {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1}, - {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1}, - {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1}, - {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1}, - {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1}, - {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1}, - {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1}, - {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1}, - {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1}, - {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1}, - {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1}, -#ifdef HAVE_PQC - {XSTR_SIZEOF("KYBER_LEVEL1"), "KYBER_LEVEL1", WOLFSSL_KYBER_LEVEL1}, - {XSTR_SIZEOF("KYBER_LEVEL3"), "KYBER_LEVEL3", WOLFSSL_KYBER_LEVEL3}, - {XSTR_SIZEOF("KYBER_LEVEL5"), "KYBER_LEVEL5", WOLFSSL_KYBER_LEVEL5}, -#ifdef HAVE_LIBOQS - {XSTR_SIZEOF("P256_KYBER_LEVEL1"), "P256_KYBER_LEVEL1", WOLFSSL_P256_KYBER_LEVEL1}, - {XSTR_SIZEOF("P384_KYBER_LEVEL3"), "P384_KYBER_LEVEL3", WOLFSSL_P384_KYBER_LEVEL3}, - {XSTR_SIZEOF("P521_KYBER_LEVEL5"), "P521_KYBER_LEVEL5", WOLFSSL_P521_KYBER_LEVEL5}, -#endif -#endif - {0, NULL, 0}, -}; -#endif - #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) /* create the hpke key and ech config to send to clients */ int wolfSSL_CTX_GenerateEchConfig(WOLFSSL_CTX* ctx, const char* publicName, @@ -1021,7 +978,7 @@ workingOutputLen = *outputLen - totalLen; /* only error we break on, other 2 we need to keep finding length */ - if (ret == BAD_FUNC_ARG) + if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) return BAD_FUNC_ARG; workingConfig = workingConfig->next; @@ -1047,214 +1004,18 @@ #endif /* WOLFSSL_TLS13 && HAVE_ECH */ -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) #include #endif -#ifdef WOLFSSL_SESSION_EXPORT -/* Used to import a serialized TLS session. - * WARNING: buf contains sensitive information about the state and is best to be - * encrypted before storing if stored. - * - * @param ssl WOLFSSL structure to import the session into - * @param buf serialized session - * @param sz size of buffer 'buf' - * @return the number of bytes read from buffer 'buf' - */ -int wolfSSL_tls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz) -{ - if (ssl == NULL || buf == NULL) { - return BAD_FUNC_ARG; - } - return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS); -} - - -/* Used to export a serialized TLS session. - * WARNING: buf contains sensitive information about the state and is best to be - * encrypted before storing if stored. - * - * @param ssl WOLFSSL structure to export the session from - * @param buf output of serialized session - * @param sz size in bytes set in 'buf' - * @return the number of bytes written into buffer 'buf' - */ -int wolfSSL_tls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz) -{ - if (ssl == NULL || sz == NULL) { - return BAD_FUNC_ARG; - } - return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS); -} - -#ifdef WOLFSSL_DTLS -int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz) -{ - WOLFSSL_ENTER("wolfSSL_session_import"); - - if (ssl == NULL || buf == NULL) { - return BAD_FUNC_ARG; - } - - /* sanity checks on buffer and protocol are done in internal function */ - return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS); -} - - -/* Sets the function to call for serializing the session. This function is - * called right after the handshake is completed. */ -int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func) -{ - - WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export"); - - /* purposefully allow func to be NULL */ - if (ctx == NULL) { - return BAD_FUNC_ARG; - } - - ctx->dtls_export = func; - - return WOLFSSL_SUCCESS; -} - - -/* Sets the function in WOLFSSL struct to call for serializing the session. This - * function is called right after the handshake is completed. */ -int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func) -{ - - WOLFSSL_ENTER("wolfSSL_dtls_set_export"); - - /* purposefully allow func to be NULL */ - if (ssl == NULL) { - return BAD_FUNC_ARG; - } - - ssl->dtls_export = func; - - return WOLFSSL_SUCCESS; -} - - -/* This function allows for directly serializing a session rather than using - * callbacks. It has less overhead by removing a temporary buffer and gives - * control over when the session gets serialized. When using callbacks the - * session is always serialized immediately after the handshake is finished. - * - * buf is the argument to contain the serialized session - * sz is the size of the buffer passed in - * ssl is the WOLFSSL struct to serialize - * returns the size of serialized session on success, 0 on no action, and - * negative value on error */ -int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz) -{ - WOLFSSL_ENTER("wolfSSL_dtls_export"); - - if (ssl == NULL || sz == NULL) { - return BAD_FUNC_ARG; - } - - if (buf == NULL) { - *sz = MAX_EXPORT_BUFFER; - return 0; - } - - /* if not DTLS do nothing */ - if (!ssl->options.dtls) { - WOLFSSL_MSG("Currently only DTLS export is supported"); - return 0; - } - - /* copy over keys, options, and dtls state struct */ - return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS); -} - - -/* This function is similar to wolfSSL_dtls_export but only exports the portion - * of the WOLFSSL structure related to the state of the connection, i.e. peer - * sequence number, epoch, AEAD state etc. - * - * buf is the argument to contain the serialized state, if null then set "sz" to - * buffer size required - * sz is the size of the buffer passed in - * ssl is the WOLFSSL struct to serialize - * returns the size of serialized session on success, 0 on no action, and - * negative value on error */ -int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf, - unsigned int* sz) -{ - WOLFSSL_ENTER("wolfSSL_dtls_export_state_only"); - - if (ssl == NULL || sz == NULL) { - return BAD_FUNC_ARG; - } - - if (buf == NULL) { - *sz = MAX_EXPORT_STATE_BUFFER; - return 0; - } - - /* if not DTLS do nothing */ - if (!ssl->options.dtls) { - WOLFSSL_MSG("Currently only DTLS export state is supported"); - return 0; - } - - /* copy over keys, options, and dtls state struct */ - return wolfSSL_dtls_export_state_internal(ssl, buf, *sz); -} - - -/* returns 0 on success */ -int wolfSSL_send_session(WOLFSSL* ssl) -{ - int ret; - byte* buf; - word32 bufSz = MAX_EXPORT_BUFFER; - - WOLFSSL_ENTER("wolfSSL_send_session"); - - if (ssl == NULL) { - return BAD_FUNC_ARG; - } - - buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (buf == NULL) { - return MEMORY_E; - } - - /* if not DTLS do nothing */ - if (!ssl->options.dtls) { - XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); - WOLFSSL_MSG("Currently only DTLS export is supported"); - return 0; - } - - /* copy over keys, options, and dtls state struct */ - ret = wolfSSL_session_export_internal(ssl, buf, &bufSz, WOLFSSL_EXPORT_DTLS); - if (ret < 0) { - XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); - return ret; - } - - /* if no error ret has size of buffer */ - ret = ssl->dtls_export(ssl, buf, ret, NULL); - if (ret != WOLFSSL_SUCCESS) { - XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); - return ret; - } - - XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); - return 0; -} -#endif /* WOLFSSL_DTLS */ -#endif /* WOLFSSL_SESSION_EXPORT */ - /* prevent multiple mutex initializations */ static volatile WOLFSSL_GLOBAL int initRefCount = 0; -static WOLFSSL_GLOBAL wolfSSL_Mutex count_mutex; /* init ref count mutex */ -static WOLFSSL_GLOBAL int count_mutex_valid = 0; +/* init ref count mutex */ +static WOLFSSL_GLOBAL wolfSSL_Mutex inits_count_mutex + WOLFSSL_MUTEX_INITIALIZER_CLAUSE(inits_count_mutex); +#ifndef WOLFSSL_MUTEX_INITIALIZER +static WOLFSSL_GLOBAL int inits_count_mutex_valid = 0; +#endif /* Create a new WOLFSSL_CTX struct and return the pointer to created struct. WOLFSSL_METHOD pointer passed in is given to ctx to manage. @@ -1321,8 +1082,8 @@ wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL); wolfSSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY); if (wolfSSL_CTX_set_min_proto_version(ctx, - (method->version.major == DTLS_MAJOR) ? - DTLS1_VERSION : SSL3_VERSION) != WOLFSSL_SUCCESS || + (method->version.major == DTLS_MAJOR) ? + DTLS1_VERSION : SSL3_VERSION) != WOLFSSL_SUCCESS || #ifdef HAVE_ANON wolfSSL_CTX_allow_anon_cipher(ctx) != WOLFSSL_SUCCESS || #endif @@ -1458,17 +1219,35 @@ WOLFSSL_ENTER("wolfSSL_new"); - if (ctx == NULL) - return ssl; + if (ctx == NULL) { + WOLFSSL_MSG("wolfSSL_new ctx is null"); + return NULL; + } ssl = (WOLFSSL*) XMALLOC(sizeof(WOLFSSL), ctx->heap, DYNAMIC_TYPE_SSL); - if (ssl) - if ( (ret = InitSSL(ssl, ctx, 0)) < 0) { + + if (ssl == NULL) { + WOLFSSL_MSG_EX("ssl xmalloc failed to allocate %d bytes", + (int)sizeof(WOLFSSL)); + } + else { + ret = InitSSL(ssl, ctx, 0); + if (ret < 0) { + WOLFSSL_MSG_EX("wolfSSL_new failed during InitSSL. err = %d", ret); FreeSSL(ssl, ctx->heap); - ssl = 0; + ssl = NULL; } + else if (ret == 0) { + WOLFSSL_MSG("wolfSSL_new InitSSL success"); + } + else { + /* Only success (0) or negative values should ever be seen. */ + WOLFSSL_MSG_EX("WARNING: wolfSSL_new unexpected InitSSL return" + " value = %d", ret); + } /* InitSSL check */ + } /* ssl XMALLOC success */ - WOLFSSL_LEAVE("wolfSSL_new", ret); + WOLFSSL_LEAVE("wolfSSL_new InitSSL =", ret); (void)ret; return ssl; @@ -1479,8 +1258,14 @@ void wolfSSL_free(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_free"); - if (ssl) + + if (ssl) { + WOLFSSL_MSG_EX("Free SSL: %p", (wc_ptr_t)ssl); FreeSSL(ssl, ssl->ctx->heap); + } + else { + WOLFSSL_MSG("Free SSL: wolfSSL_free already null"); + } WOLFSSL_LEAVE("wolfSSL_free", 0); } @@ -1537,6 +1322,8 @@ */ static int DupSSL(WOLFSSL* dup, WOLFSSL* ssl) { + word16 tmp_weOwnRng; + /* shared dupWrite setup */ ssl->dupWrite = (WriteDup*)XMALLOC(sizeof(WriteDup), ssl->heap, DYNAMIC_TYPE_WRITEDUP); @@ -1553,6 +1340,8 @@ ssl->dupWrite->dupCount = 2; /* both sides have a count to start */ dup->dupWrite = ssl->dupWrite; /* each side uses */ + tmp_weOwnRng = dup->options.weOwnRng; + /* copy write parts over to dup writer */ XMEMCPY(&dup->specs, &ssl->specs, sizeof(CipherSpecs)); XMEMCPY(&dup->options, &ssl->options, sizeof(Options)); @@ -1561,6 +1350,18 @@ XMEMCPY(&dup->version, &ssl->version, sizeof(ProtocolVersion)); XMEMCPY(&dup->chVersion, &ssl->chVersion, sizeof(ProtocolVersion)); +#ifdef HAVE_ONE_TIME_AUTH +#ifdef HAVE_POLY1305 + if (ssl->auth.setup && ssl->auth.poly1305 != NULL) { + dup->auth.poly1305 = (Poly1305*)XMALLOC(sizeof(Poly1305), dup->heap, + DYNAMIC_TYPE_CIPHER); + if (dup->auth.poly1305 == NULL) + return MEMORY_E; + dup->auth.setup = 1; + } +#endif +#endif + /* dup side now owns encrypt/write ciphers */ XMEMSET(&ssl->encrypt, 0, sizeof(Ciphers)); @@ -1578,6 +1379,9 @@ dup->truncated_hmac = ssl->truncated_hmac; #endif + /* Restore rng option */ + dup->options.weOwnRng = tmp_weOwnRng; + /* unique side dup setup */ dup->dupSide = WRITE_DUP_SIDE; ssl->dupSide = READ_DUP_SIDE; @@ -1884,7 +1688,7 @@ return NULL; cipher = wolfSSL_get_cipher_name_iana(ssl); - len = min(len, (int)(XSTRLEN(cipher) + 1)); + len = (int)min((word32)len, (int)(XSTRLEN(cipher) + 1)); XMEMCPY(buf, cipher, len); return buf; } @@ -2157,10 +1961,12 @@ static const WOLFSSL_SRTP_PROTECTION_PROFILE gSrtpProfiles[] = { /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 80-bits * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */ - {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80, (((128 + 112) * 2) / 8) }, + {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80, + (((128 + 112) * 2) / 8) }, /* AES CCM 128, Salt:112-bits, Auth HMAC-SHA1 Tag: 32-bits * (master_key:128bits + master_salt:112bits) * 2 = 480 bits (60) */ - {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32, (((128 + 112) * 2) / 8) }, + {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32, + (((128 + 112) * 2) / 8) }, /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 80-bits */ {"SRTP_NULL_SHA1_80", SRTP_NULL_SHA1_80, ((112 * 2) / 8)}, /* NULL Cipher, Salt:112-bits, Auth HMAC-SHA1 Tag 32-bits */ @@ -2217,15 +2023,19 @@ do { current = next; next = XSTRSTR(current, ":"); - current_length = (!next) ? (word32)XSTRLEN(current) - : (word32)(next - current); + if (next) { + current_length = (word32)(next - current); + ++next; /* ++ needed to skip ':' */ + } else { + current_length = (word32)XSTRLEN(current); + } if (current_length < length) length = current_length; profile = DtlsSrtpFindProfile(current, current_length, 0); if (profile != NULL) { *id |= (1 << profile->id); /* selected bit based on ID */ } - } while (next != NULL && next++); /* ++ needed to skip ':' */ + } while (next != NULL); return WOLFSSL_SUCCESS; } @@ -2283,7 +2093,7 @@ return EXT_MISSING; } if (out == NULL) { - *olen = profile->kdfBits; + *olen = (size_t)profile->kdfBits; return LENGTH_ONLY_E; } @@ -2400,7 +2210,8 @@ if (ret == 0) { XMEMCPY(ssl->arrays->preMasterSecret, preMasterSecret, preMasterSz); - XMEMSET(ssl->arrays->preMasterSecret + preMasterSz, 0, ENCRYPT_LEN - preMasterSz); + XMEMSET(ssl->arrays->preMasterSecret + preMasterSz, 0, + ENCRYPT_LEN - preMasterSz); ssl->arrays->preMasterSz = preMasterSz; XMEMCPY(ssl->arrays->clientRandom, clientRandom, RAN_LEN); XMEMCPY(ssl->arrays->serverRandom, serverRandom, RAN_LEN); @@ -2648,7 +2459,11 @@ #ifdef HAVE_CHACHA printf("\tsizeof chacha = %lu\n", (unsigned long)sizeof(ChaCha)); #endif - printf("sizeof cipher specs = %lu\n", (unsigned long)sizeof(CipherSpecs)); +#ifdef WOLFSSL_SM4 + printf("\tsizeof sm4 = %lu\n", (unsigned long)sizeof(Sm4)); +#endif + printf("sizeof cipher specs = %lu\n", (unsigned long) + sizeof(CipherSpecs)); printf("sizeof keys = %lu\n", (unsigned long)sizeof(Keys)); printf("sizeof Hashes(2) = %lu\n", (unsigned long)sizeof(Hashes)); #ifndef NO_MD5 @@ -2669,6 +2484,9 @@ #ifdef WOLFSSL_SHA384 printf("\tsizeof SHA512 = %lu\n", (unsigned long)sizeof(wc_Sha512)); #endif +#ifdef WOLFSSL_SM3 + printf("\tsizeof sm3 = %lu\n", (unsigned long)sizeof(Sm3)); +#endif printf("sizeof Buffers = %lu\n", (unsigned long)sizeof(Buffers)); printf("sizeof Options = %lu\n", (unsigned long)sizeof(Options)); printf("sizeof Arrays = %lu\n", (unsigned long)sizeof(Arrays)); @@ -2678,10 +2496,13 @@ #ifdef HAVE_ECC printf("sizeof ecc_key = %lu\n", (unsigned long)sizeof(ecc_key)); #endif - printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long)sizeof(WOLFSSL_CIPHER)); - printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long)sizeof(WOLFSSL_SESSION)); + printf("sizeof WOLFSSL_CIPHER = %lu\n", (unsigned long) + sizeof(WOLFSSL_CIPHER)); + printf("sizeof WOLFSSL_SESSION = %lu\n", (unsigned long) + sizeof(WOLFSSL_SESSION)); printf("sizeof WOLFSSL = %lu\n", (unsigned long)sizeof(WOLFSSL)); - printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long)sizeof(WOLFSSL_CTX)); + printf("sizeof WOLFSSL_CTX = %lu\n", (unsigned long) + sizeof(WOLFSSL_CTX)); #endif return sizeof(WOLFSSL); @@ -2701,13 +2522,11 @@ #ifdef WOLFSSL_STATIC_MEMORY -int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, wolfSSL_method_func method, - unsigned char* buf, unsigned int sz, - int flag, int maxSz) +int wolfSSL_CTX_load_static_memory(WOLFSSL_CTX** ctx, + wolfSSL_method_func method, unsigned char* buf, unsigned int sz, int flag, + int maxSz) { - WOLFSSL_HEAP* heap; - WOLFSSL_HEAP_HINT* hint; - word32 idx = 0; + WOLFSSL_HEAP_HINT* hint = NULL; if (ctx == NULL || buf == NULL) { return BAD_FUNC_ARG; @@ -2717,42 +2536,23 @@ return BAD_FUNC_ARG; } - if (*ctx == NULL || (*ctx)->heap == NULL) { - if (sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT) > sz - idx) { - return BUFFER_E; /* not enough memory for structures */ - } - heap = (WOLFSSL_HEAP*)buf; - idx += sizeof(WOLFSSL_HEAP); - if (wolfSSL_init_memory_heap(heap) != 0) { - return WOLFSSL_FAILURE; - } - hint = (WOLFSSL_HEAP_HINT*)(buf + idx); - idx += sizeof(WOLFSSL_HEAP_HINT); - XMEMSET(hint, 0, sizeof(WOLFSSL_HEAP_HINT)); - hint->memory = heap; - - if (*ctx && (*ctx)->heap == NULL) { - (*ctx)->heap = (void*)hint; - } - } - else { -#ifdef WOLFSSL_HEAP_TEST - /* do not load in memory if test has been set */ - if ((*ctx)->heap == (void*)WOLFSSL_HEAP_TEST) { - return WOLFSSL_SUCCESS; - } -#endif - hint = (WOLFSSL_HEAP_HINT*)((*ctx)->heap); - heap = hint->memory; + /* If there is a heap already, capture it in hint. */ + if (*ctx && (*ctx)->heap != NULL) { + hint = (*ctx)->heap; } - if (wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap) != 1) { - WOLFSSL_MSG("Error partitioning memory"); + if (wc_LoadStaticMemory(&hint, buf, sz, flag, maxSz)) { + WOLFSSL_MSG("Error loading static memory"); return WOLFSSL_FAILURE; } - /* create ctx if needed */ - if (*ctx == NULL) { + if (*ctx) { + if ((*ctx)->heap == NULL) { + (*ctx)->heap = (void*)hint; + } + } + else { + /* create ctx if needed */ *ctx = wolfSSL_CTX_new_ex(method(hint), hint); if (*ctx == NULL) { WOLFSSL_MSG("Error creating ctx"); @@ -2760,19 +2560,6 @@ } } - /* determine what max applies too */ - if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) { - heap->maxIO = maxSz; - } - else { /* general memory used in handshakes */ - heap->maxHa = maxSz; - } - - heap->flag |= flag; - - (void)maxSz; - (void)method; - return WOLFSSL_SUCCESS; } @@ -2784,6 +2571,7 @@ } WOLFSSL_ENTER("wolfSSL_is_static_memory"); +#ifndef WOLFSSL_STATIC_MEMORY_LEAN /* fill out statistics if wanted and WOLFMEM_TRACK_STATS flag */ if (mem_stats != NULL && ssl->heap != NULL) { WOLFSSL_HEAP_HINT* hint = ((WOLFSSL_HEAP_HINT*)(ssl->heap)); @@ -2792,7 +2580,9 @@ XMEMCPY(mem_stats, hint->stats, sizeof(WOLFSSL_MEM_CONN_STATS)); } } +#endif + (void)mem_stats; return (ssl->heap) ? 1 : 0; } @@ -2804,6 +2594,7 @@ } WOLFSSL_ENTER("wolfSSL_CTX_is_static_memory"); +#ifndef WOLFSSL_STATIC_MEMORY_LEAN /* fill out statistics if wanted */ if (mem_stats != NULL && ctx->heap != NULL) { WOLFSSL_HEAP* heap = ((WOLFSSL_HEAP_HINT*)(ctx->heap))->memory; @@ -2811,7 +2602,9 @@ return MEMORY_E; } } +#endif + (void)mem_stats; return (ctx->heap) ? 1 : 0; } @@ -2851,13 +2644,15 @@ if (inSz > maxSize) return INPUT_SIZE_E; - return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER); + return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, + CUR_ORDER); } #ifdef HAVE_ECC int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz) { + WOLFSSL_ENTER("wolfSSL_CTX_SetMinEccKey_Sz"); if (ctx == NULL || keySz < 0 || keySz % 8 != 0) { WOLFSSL_MSG("Key size must be divisible by 8 or ctx was null"); return BAD_FUNC_ARG; @@ -2873,6 +2668,7 @@ int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz) { + WOLFSSL_ENTER("wolfSSL_SetMinEccKey_Sz"); if (ssl == NULL || keySz < 0 || keySz % 8 != 0) { WOLFSSL_MSG("Key size must be divisible by 8 or ssl was null"); return BAD_FUNC_ARG; @@ -2912,138 +2708,6 @@ #ifndef NO_DH -#ifdef OPENSSL_EXTRA -long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh) -{ - int pSz, gSz; - byte *p, *g; - int ret = 0; - - WOLFSSL_ENTER("wolfSSL_set_tmp_dh"); - - if (!ssl || !dh) - return BAD_FUNC_ARG; - - /* Get needed size for p and g */ - pSz = wolfSSL_BN_bn2bin(dh->p, NULL); - gSz = wolfSSL_BN_bn2bin(dh->g, NULL); - - if (pSz <= 0 || gSz <= 0) - return -1; - - p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - if (!p) - return MEMORY_E; - - g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - if (!g) { - XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - return MEMORY_E; - } - - pSz = wolfSSL_BN_bn2bin(dh->p, p); - gSz = wolfSSL_BN_bn2bin(dh->g, g); - - if (pSz >= 0 && gSz >= 0) /* Conversion successful */ - ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz); - - XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - - return pSz > 0 && gSz > 0 ? ret : -1; -} -#endif /* OPENSSL_EXTRA */ - -/* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */ -int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz, - const unsigned char* g, int gSz) -{ - WOLFSSL_ENTER("wolfSSL_SetTmpDH"); - - if (ssl == NULL || p == NULL || g == NULL) - return BAD_FUNC_ARG; - - if ((word16)pSz < ssl->options.minDhKeySz) - return DH_KEY_SIZE_E; - if ((word16)pSz > ssl->options.maxDhKeySz) - return DH_KEY_SIZE_E; - - /* this function is for server only */ - if (ssl->options.side == WOLFSSL_CLIENT_END) - return SIDE_ERROR; - - #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \ - !defined(HAVE_SELFTEST) - ssl->options.dhKeyTested = 0; - ssl->options.dhDoKeyTest = 1; - #endif - - if (ssl->buffers.serverDH_P.buffer && ssl->buffers.weOwnDH) { - XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - ssl->buffers.serverDH_P.buffer = NULL; - } - if (ssl->buffers.serverDH_G.buffer && ssl->buffers.weOwnDH) { - XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - ssl->buffers.serverDH_G.buffer = NULL; - } - - ssl->buffers.weOwnDH = 1; /* SSL owns now */ - ssl->buffers.serverDH_P.buffer = (byte*)XMALLOC(pSz, ssl->heap, - DYNAMIC_TYPE_PUBLIC_KEY); - if (ssl->buffers.serverDH_P.buffer == NULL) - return MEMORY_E; - - ssl->buffers.serverDH_G.buffer = (byte*)XMALLOC(gSz, ssl->heap, - DYNAMIC_TYPE_PUBLIC_KEY); - if (ssl->buffers.serverDH_G.buffer == NULL) { - XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); - ssl->buffers.serverDH_P.buffer = NULL; - return MEMORY_E; - } - - ssl->buffers.serverDH_P.length = pSz; - ssl->buffers.serverDH_G.length = gSz; - - XMEMCPY(ssl->buffers.serverDH_P.buffer, p, pSz); - XMEMCPY(ssl->buffers.serverDH_G.buffer, g, gSz); - - ssl->options.haveDH = 1; - - if (ssl->options.side != WOLFSSL_NEITHER_END) { - word16 havePSK; - word16 haveRSA; - int keySz = 0; - int ret; - - #ifndef NO_PSK - havePSK = ssl->options.havePSK; - #else - havePSK = 0; - #endif - #ifdef NO_RSA - haveRSA = 0; - #else - haveRSA = 1; - #endif - #ifndef NO_CERTS - keySz = ssl->buffers.keySz; - #endif - ret = AllocateSuites(ssl); - if (ret != 0) - return ret; - InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, - ssl->options.haveDH, ssl->options.haveECDSAsig, - ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, - ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); - } - - WOLFSSL_LEAVE("wolfSSL_SetTmpDH", 0); - - return WOLFSSL_SUCCESS; -} - - #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \ !defined(HAVE_SELFTEST) /* Enables or disables the session's DH key prime test. */ @@ -3064,82 +2728,6 @@ } #endif - -/* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */ -int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz, - const unsigned char* g, int gSz) -{ - WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH"); - if (ctx == NULL || p == NULL || g == NULL) return BAD_FUNC_ARG; - - if ((word16)pSz < ctx->minDhKeySz) - return DH_KEY_SIZE_E; - if ((word16)pSz > ctx->maxDhKeySz) - return DH_KEY_SIZE_E; - - #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \ - !defined(HAVE_SELFTEST) - { - WC_RNG rng; - int error, freeKey = 0; - #ifdef WOLFSSL_SMALL_STACK - DhKey *checkKey = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH); - if (checkKey == NULL) - return MEMORY_E; - #else - DhKey checkKey[1]; - #endif - - error = wc_InitRng(&rng); - if (!error) - error = wc_InitDhKey(checkKey); - if (!error) { - freeKey = 1; - error = wc_DhSetCheckKey(checkKey, - p, pSz, g, gSz, NULL, 0, 0, &rng); - } - if (freeKey) - wc_FreeDhKey(checkKey); - #ifdef WOLFSSL_SMALL_STACK - XFREE(checkKey, NULL, DYNAMIC_TYPE_DH); - #endif - wc_FreeRng(&rng); - if (error) - return error; - - ctx->dhKeyTested = 1; - } - #endif - - XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - ctx->serverDH_P.buffer = NULL; - XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - ctx->serverDH_G.buffer = NULL; - - ctx->serverDH_P.buffer = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - if (ctx->serverDH_P.buffer == NULL) - return MEMORY_E; - - ctx->serverDH_G.buffer = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - if (ctx->serverDH_G.buffer == NULL) { - XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - ctx->serverDH_P.buffer = NULL; - return MEMORY_E; - } - - ctx->serverDH_P.length = pSz; - ctx->serverDH_G.length = gSz; - - XMEMCPY(ctx->serverDH_P.buffer, p, pSz); - XMEMCPY(ctx->serverDH_G.buffer, g, gSz); - - ctx->haveDH = 1; - - WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0); - return WOLFSSL_SUCCESS; -} - - int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits) { if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0) @@ -3207,13 +2795,6 @@ return BAD_FUNC_ARG; } #endif -#ifdef WOLFSSL_EARLY_DATA - if (ssl->earlyData != no_early_data && (ret = wolfSSL_negotiate(ssl)) < 0) { - ssl->error = ret; - return WOLFSSL_FATAL_ERROR; - } - ssl->earlyData = no_early_data; -#endif #ifdef HAVE_WRITE_DUP { /* local variable scope */ @@ -3315,22 +2896,6 @@ errno = 0; #endif -#ifdef WOLFSSL_DTLS - if (ssl->options.dtls) { - ssl->dtls_expected_rx = max(sz + DTLS_MTU_ADDITIONAL_READ_BUFFER, - MAX_MTU); -#ifdef WOLFSSL_SCTP - if (ssl->options.dtlsSctp) -#endif -#if defined(WOLFSSL_SCTP) || defined(WOLFSSL_DTLS_MTU) - /* Add some bytes so that we can operate with slight difference - * in set MTU size on each peer */ - ssl->dtls_expected_rx = max(ssl->dtls_expected_rx, - ssl->dtlsMtuSz + (word32)DTLS_MTU_ADDITIONAL_READ_BUFFER); -#endif - } -#endif - ret = ReceiveData(ssl, (byte*)data, sz, peek); #ifdef HAVE_WRITE_DUP @@ -3501,7 +3066,7 @@ *data = NULL; if (ssl && ssl->extensions) - return TLSX_SNI_GetRequest(ssl->extensions, type, data); + return TLSX_SNI_GetRequest(ssl->extensions, type, data, 0); return 0; } @@ -3692,6 +3257,7 @@ case WOLFSSL_ECC_BRAINPOOLP256R1: case WOLFSSL_ECC_BRAINPOOLP384R1: case WOLFSSL_ECC_BRAINPOOLP512R1: + case WOLFSSL_ECC_SM2P256V1: case WOLFSSL_ECC_X25519: case WOLFSSL_ECC_X448: @@ -3701,11 +3267,11 @@ case WOLFSSL_FFDHE_6144: case WOLFSSL_FFDHE_8192: -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER case WOLFSSL_KYBER_LEVEL1: case WOLFSSL_KYBER_LEVEL3: case WOLFSSL_KYBER_LEVEL5: - #ifdef HAVE_LIBOQS + #if defined(WOLFSSL_WC_KYBER) || defined(HAVE_LIBOQS) case WOLFSSL_P256_KYBER_LEVEL1: case WOLFSSL_P384_KYBER_LEVEL3: case WOLFSSL_P521_KYBER_LEVEL5: @@ -3745,7 +3311,7 @@ #endif /* NO_TLS */ } -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_TLS13) +#if defined(OPENSSL_EXTRA) int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups, int count) { @@ -3763,7 +3329,7 @@ #ifdef HAVE_ECC else { /* groups may be populated with curve NIDs */ - int oid = nid2oid(groups[i], oidCurveType); + int oid = (int)nid2oid(groups[i], oidCurveType); int name = (int)GetCurveByOID(oid); if (name == 0) { WOLFSSL_MSG("Invalid group name"); @@ -3798,7 +3364,7 @@ #ifdef HAVE_ECC else { /* groups may be populated with curve NIDs */ - int oid = nid2oid(groups[i], oidCurveType); + int oid = (int)nid2oid(groups[i], oidCurveType); int name = (int)GetCurveByOID(oid); if (name == 0) { WOLFSSL_MSG("Invalid group name"); @@ -3816,7 +3382,7 @@ return wolfSSL_set_groups(ssl, _groups, count) == WOLFSSL_SUCCESS ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; } -#endif /* OPENSSL_EXTRA && WOLFSSL_TLS13 */ +#endif /* OPENSSL_EXTRA */ #endif /* HAVE_SUPPORTED_CURVES */ /* Application-Layer Protocol Negotiation */ @@ -3857,7 +3423,8 @@ return MEMORY_ERROR; } - token = (char **)XMALLOC(sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1), ssl->heap, DYNAMIC_TYPE_ALPN); + token = (char **)XMALLOC(sizeof(char *) * (WOLFSSL_MAX_ALPN_NUMBER+1), + ssl->heap, DYNAMIC_TYPE_ALPN); if (token == NULL) { XFREE(list, ssl->heap, DYNAMIC_TYPE_ALPN); WOLFSSL_MSG("Memory failure"); @@ -3963,12 +3530,14 @@ /* user is forcing ability to use secure renegotiation, we discourage it */ int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); #if defined(NO_TLS) (void)ssl; #else if (ssl) ret = TLSX_UseSecureRenegotiation(&ssl->extensions, ssl->heap); + else + ret = BAD_FUNC_ARG; if (ret == WOLFSSL_SUCCESS) { TLSX* extension = TLSX_Find(ssl->extensions, TLSX_RENEGOTIATION_INFO); @@ -3989,7 +3558,7 @@ return WOLFSSL_SUCCESS; } - +#ifdef HAVE_SECURE_RENEGOTIATION /* do a secure renegotiation handshake, user forced, we discourage */ static int _Rehandshake(WOLFSSL* ssl) { @@ -4054,7 +3623,7 @@ ssl->secure_renegotiation->cache_status = SCR_CACHE_NEEDED; -#if !defined(NO_WOLFSSL_SERVER) && defined(HAVE_SECURE_RENEGOTIATION) +#if !defined(NO_WOLFSSL_SERVER) if (ssl->options.side == WOLFSSL_SERVER_END) { ret = SendHelloRequest(ssl); if (ret != 0) { @@ -4062,7 +3631,7 @@ return WOLFSSL_FATAL_ERROR; } } -#endif /* !NO_WOLFSSL_SERVER && HAVE_SECURE_RENEGOTIATION */ +#endif /* !NO_WOLFSSL_SERVER */ ret = InitHandshakeHashes(ssl); if (ret != 0) { @@ -4093,6 +3662,8 @@ if (ssl->options.side == WOLFSSL_SERVER_END) { /* Reset option to send certificate verify. */ ssl->options.sendVerify = 0; + /* Reset resuming flag to do full secure handshake. */ + ssl->options.resuming = 0; } else { /* Reset resuming flag to do full secure handshake. */ @@ -4134,6 +3705,8 @@ #endif /* NO_WOLFSSL_CLIENT */ +#endif /* HAVE_SECURE_RENEGOTIATION */ + long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_SSL_get_secure_renegotiation_support"); @@ -4286,7 +3859,8 @@ } } else { /* Ticket requires dynamic ticket storage */ - if (ssl->session->ticketLen < bufSz) { /* is dyn buffer big enough */ + /* is dyn buffer big enough */ + if (ssl->session->ticketLen < bufSz) { if (ssl->session->ticketLenAlloc > 0) { XFREE(ssl->session->ticket, ssl->session->heap, DYNAMIC_TYPE_SESSION_TICK); @@ -4399,6 +3973,25 @@ } #endif +int wolfSSL_SendUserCanceled(WOLFSSL* ssl) +{ + int ret = WOLFSSL_FAILURE; + WOLFSSL_ENTER("wolfSSL_recv"); + + if (ssl != NULL) { + ssl->error = SendAlert(ssl, alert_warning, user_canceled); + if (ssl->error < 0) { + WOLFSSL_ERROR(ssl->error); + } + else { + ret = wolfSSL_shutdown(ssl); + } + } + + WOLFSSL_LEAVE("wolfSSL_SendUserCanceled", ret); + + return ret; +} /* WOLFSSL_SUCCESS on ok */ WOLFSSL_ABI @@ -4446,12 +4039,15 @@ /* call wolfSSL_shutdown again for bidirectional shutdown */ if (ssl->options.sentNotify && !ssl->options.closeNotify) { ret = ProcessReply(ssl); - if (ret == ZERO_RETURN) { + if ((ret == ZERO_RETURN) || + (ret == WC_NO_ERR_TRACE(SOCKET_ERROR_E))) { /* simulate OpenSSL behavior */ ssl->options.shutdownDone = 1; /* Clear error */ ssl->error = WOLFSSL_ERROR_NONE; ret = WOLFSSL_SUCCESS; + } else if (ret == WC_NO_ERR_TRACE(MEMORY_E)) { + ret = WOLFSSL_FATAL_ERROR; } else if (ssl->error == WOLFSSL_ERROR_NONE) { ret = WOLFSSL_SHUTDOWN_NOT_DONE; } else { @@ -4462,7 +4058,7 @@ } #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) - /* reset WOLFSSL structure state for possible re-use */ + /* reset WOLFSSL structure state for possible reuse */ if (ret == WOLFSSL_SUCCESS) { if (wolfSSL_clear(ssl) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("could not clear WOLFSSL"); @@ -4507,6 +4103,10 @@ return WOLFSSL_ERROR_WANT_WRITE; /* convert to OpenSSL type */ else if (ssl->error == ZERO_RETURN || ssl->options.shutdownDone) return WOLFSSL_ERROR_ZERO_RETURN; /* convert to OpenSSL type */ +#ifdef OPENSSL_EXTRA + else if (ssl->error == WC_NO_ERR_TRACE(SOCKET_PEER_CLOSED_E)) + return WOLFSSL_ERROR_SYSCALL; /* convert to OpenSSL type */ +#endif return ssl->error; } @@ -5018,7 +4618,6 @@ #endif /* ATOMIC_USER */ #ifndef NO_CERTS - WOLFSSL_CERT_MANAGER* wolfSSL_CTX_GetCertManager(WOLFSSL_CTX* ctx) { WOLFSSL_CERT_MANAGER* cm = NULL; @@ -5026,298 +4625,6 @@ cm = ctx->cm; return cm; } - -WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap) -{ - WOLFSSL_CERT_MANAGER* cm; - - WOLFSSL_ENTER("wolfSSL_CertManagerNew"); - - cm = (WOLFSSL_CERT_MANAGER*) XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap, - DYNAMIC_TYPE_CERT_MANAGER); - if (cm) { - int ret; - - XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER)); - - if (wc_InitMutex(&cm->caLock) != 0) { - WOLFSSL_MSG("Bad mutex init"); - wolfSSL_CertManagerFree(cm); - return NULL; - } - - wolfSSL_RefInit(&cm->ref, &ret); - #ifdef WOLFSSL_REFCNT_ERROR_RETURN - if (ret != 0) { - WOLFSSL_MSG("Bad mutex init"); - wolfSSL_CertManagerFree(cm); - return NULL; - } - #else - (void)ret; - #endif - - #ifdef WOLFSSL_TRUST_PEER_CERT - if (wc_InitMutex(&cm->tpLock) != 0) { - WOLFSSL_MSG("Bad mutex init"); - wolfSSL_CertManagerFree(cm); - return NULL; - } - #endif - - /* set default minimum key size allowed */ - #ifndef NO_RSA - cm->minRsaKeySz = MIN_RSAKEY_SZ; - #endif - #ifdef HAVE_ECC - cm->minEccKeySz = MIN_ECCKEY_SZ; - #endif - #ifdef HAVE_PQC - #ifdef HAVE_FALCON - cm->minFalconKeySz = MIN_FALCONKEY_SZ; - #endif /* HAVE_FALCON */ - #ifdef HAVE_DILITHIUM - cm->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ; - #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ - - cm->heap = heap; - } - - return cm; -} - - -WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void) -{ - return wolfSSL_CertManagerNew_ex(NULL); -} - - -void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerFree"); - - if (cm) { - int doFree = 0; - int ret; - - wolfSSL_RefDec(&cm->ref, &doFree, &ret); - #ifdef WOLFSSL_REFCNT_ERROR_RETURN - if (ret != 0) { - WOLFSSL_MSG("Couldn't lock cm mutex"); - } - #else - (void)ret; - #endif - if (doFree) { - #ifdef HAVE_CRL - if (cm->crl) - FreeCRL(cm->crl, 1); - #endif - #ifdef HAVE_OCSP - if (cm->ocsp) - FreeOCSP(cm->ocsp, 1); - XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL); - #if !defined(NO_WOLFSSL_SERVER) && \ - (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ - defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)) - if (cm->ocsp_stapling) - FreeOCSP(cm->ocsp_stapling, 1); - #endif - #endif - FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap); - wc_FreeMutex(&cm->caLock); - - #ifdef WOLFSSL_TRUST_PEER_CERT - FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap); - wc_FreeMutex(&cm->tpLock); - #endif - wolfSSL_RefFree(&cm->ref); - XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER); - } - } - -} - -int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm) -{ - if (cm) { - int ret; - - wolfSSL_RefInc(&cm->ref, &ret); - #ifdef WOLFSSL_REFCNT_ERROR_RETURN - if (ret != 0) { - WOLFSSL_MSG("Failed to lock cm mutex"); - return WOLFSSL_FAILURE; - } - #else - (void)ret; - #endif - - return WOLFSSL_SUCCESS; - } - - return WOLFSSL_FAILURE; -} - -#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) -#if defined(WOLFSSL_SIGNER_DER_CERT) -/****************************************************************************** -* wolfSSL_CertManagerGetCerts - retrieve stack of X509 certificates in a -* certificate manager (CM). -* -* RETURNS: -* returns stack of X509 certs on success, otherwise returns a NULL. -*/ -WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm) -{ - WOLFSSL_STACK* sk = NULL; - int numCerts = 0; - DerBuffer** certBuffers = NULL; - const byte* derBuffer = NULL; - Signer* signers = NULL; - word32 row = 0; - WOLFSSL_X509* x509 = NULL; - int i = 0; - int ret = 0; - - if (cm == NULL) - return NULL; - - sk = wolfSSL_sk_X509_new_null(); - if (sk == NULL) - goto error; - - if (wc_LockMutex(&cm->caLock) != 0) - goto error; - - /* Iterate once to get the number of certs, for memory allocation - purposes. */ - for (row = 0; row < CA_TABLE_SIZE; row++) { - signers = cm->caTable[row]; - while (signers && signers->derCert && signers->derCert->buffer) { - ++numCerts; - signers = signers->next; - } - } - - if (numCerts == 0) { - wc_UnLockMutex(&cm->caLock); - goto error; - } - - certBuffers = (DerBuffer**)XMALLOC(sizeof(DerBuffer*) * numCerts, cm->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (certBuffers == NULL) { - wc_UnLockMutex(&cm->caLock); - goto error; - } - XMEMSET(certBuffers, 0, sizeof(DerBuffer*) * numCerts); - - /* Copy the certs locally so that we can release the caLock. If the lock is - held when wolfSSL_d2i_X509 is called, GetCA will also try to get the - lock, leading to deadlock. */ - for (row = 0; row < CA_TABLE_SIZE; row++) { - signers = cm->caTable[row]; - while (signers && signers->derCert && signers->derCert->buffer) { - ret = AllocDer(&certBuffers[i], signers->derCert->length, CA_TYPE, - cm->heap); - if (ret < 0) { - wc_UnLockMutex(&cm->caLock); - goto error; - } - - XMEMCPY(certBuffers[i]->buffer, signers->derCert->buffer, - signers->derCert->length); - certBuffers[i]->length = signers->derCert->length; - - ++i; - signers = signers->next; - } - } - - wc_UnLockMutex(&cm->caLock); - - for (i = 0; i < numCerts; ++i) { - derBuffer = certBuffers[i]->buffer; - wolfSSL_d2i_X509(&x509, &derBuffer, certBuffers[i]->length); - if (x509 == NULL) - goto error; - - if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) { - wolfSSL_X509_free(x509); - goto error; - } - } - - for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) { - FreeDer(&certBuffers[i]); - } - - XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - - return sk; - -error: - if (sk) - wolfSSL_sk_X509_pop_free(sk, NULL); - - if (certBuffers != NULL) { - for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) { - FreeDer(&certBuffers[i]); - } - } - - if (certBuffers) - XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - - return NULL; -} - -#endif /* WOLFSSL_SIGNER_DER_CERT */ -#endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */ - -/* Unload the CA signer list */ -int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs"); - - if (cm == NULL) - return BAD_FUNC_ARG; - - if (wc_LockMutex(&cm->caLock) != 0) - return BAD_MUTEX_E; - - FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap); - - wc_UnLockMutex(&cm->caLock); - - - return WOLFSSL_SUCCESS; -} - - -#ifdef WOLFSSL_TRUST_PEER_CERT -int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers"); - - if (cm == NULL) - return BAD_FUNC_ARG; - - if (wc_LockMutex(&cm->tpLock) != 0) - return BAD_MUTEX_E; - - FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap); - - wc_UnLockMutex(&cm->tpLock); - - - return WOLFSSL_SUCCESS; -} -#endif /* WOLFSSL_TRUST_PEER_CERT */ - #endif /* NO_CERTS */ #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) \ @@ -5597,7 +4904,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); + ssl->options.useAnon, TRUE, ssl->options.side); return WOLFSSL_SUCCESS; } #endif /* !leanpsk */ @@ -5787,6 +5094,46 @@ return ret; } +#ifdef WOLFSSL_AKID_NAME +Signer* GetCAByAKID(void* vp, const byte* issuer, word32 issuerSz, + const byte* serial, word32 serialSz) +{ + WOLFSSL_CERT_MANAGER* cm = (WOLFSSL_CERT_MANAGER*)vp; + Signer* ret = NULL; + Signer* signers; + byte nameHash[SIGNER_DIGEST_SIZE]; + byte serialHash[SIGNER_DIGEST_SIZE]; + word32 row; + + if (cm == NULL || issuer == NULL || issuerSz == 0 || + serial == NULL || serialSz == 0) + return NULL; + + if (CalcHashId(issuer, issuerSz, nameHash) != 0 || + CalcHashId(serial, serialSz, serialHash) != 0) + return NULL; + + if (wc_LockMutex(&cm->caLock) != 0) + return ret; + + /* Unfortunately we need to look through the entire table */ + for (row = 0; row < CA_TABLE_SIZE && ret == NULL; row++) { + for (signers = cm->caTable[row]; signers != NULL; + signers = signers->next) { + if (XMEMCMP(signers->subjectNameHash, nameHash, SIGNER_DIGEST_SIZE) + == 0 && XMEMCMP(signers->serialHash, serialHash, + SIGNER_DIGEST_SIZE) == 0) { + ret = signers; + break; + } + } + } + + wc_UnLockMutex(&cm->caLock); + + return ret; +} +#endif #ifndef NO_SKID /* return CA if found, otherwise NULL. Walk through hash table. */ @@ -5824,7 +5171,8 @@ /* add a trusted peer cert to linked list */ int AddTrustedPeer(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int verify) { - int ret, row; + int ret = 0; + int row = 0; TrustedPeerCert* peerCert; DecodedCert* cert; DerBuffer* der = *pDer; @@ -5898,14 +5246,15 @@ #endif XMEMCPY(peerCert->subjectNameHash, cert->subjectHash, SIGNER_DIGEST_SIZE); - peerCert->next = NULL; /* If Key Usage not set, all uses valid. */ + /* If Key Usage not set, all uses valid. */ + peerCert->next = NULL; cert->subjectCN = 0; #ifndef IGNORE_NAME_CONSTRAINTS cert->permittedNames = NULL; cert->excludedNames = NULL; #endif - row = TrustedPeerHashSigner(peerCert->subjectNameHash); + row = (int)TrustedPeerHashSigner(peerCert->subjectNameHash); if (wc_LockMutex(&cm->tpLock) == 0) { peerCert->next = cm->tpTable[row]; @@ -5934,6 +5283,38 @@ } #endif /* WOLFSSL_TRUST_PEER_CERT */ +int AddSigner(WOLFSSL_CERT_MANAGER* cm, Signer *s) +{ + byte* subjectHash; + Signer* signers; + word32 row; + + if (cm == NULL || s == NULL) + return BAD_FUNC_ARG; + +#ifndef NO_SKID + subjectHash = s->subjectKeyIdHash; +#else + subjectHash = s->subjectNameHash; +#endif + + if (AlreadySigner(cm, subjectHash)) { + FreeSigner(s, cm->heap); + return 0; + } + + row = HashSigner(subjectHash); + + if (wc_LockMutex(&cm->caLock) != 0) + return BAD_MUTEX_E; + + signers = cm->caTable[row]; + s->next = signers; + cm->caTable[row] = s; + + wc_UnLockMutex(&cm->caLock); + return 0; +} /* owns der, internal now uses too */ /* type flag ids from user or from chain received during verify @@ -6019,7 +5400,6 @@ } break; #endif /* HAVE_ED448 */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case FALCON_LEVEL1k: if (cm->minFalconKeySz < 0 || @@ -6059,7 +5439,6 @@ } break; #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ default: WOLFSSL_MSG("\tNo key size check done on CA"); @@ -6091,48 +5470,7 @@ ret = MEMORY_ERROR; } if (ret == 0 && signer != NULL) { - #ifdef WOLFSSL_SIGNER_DER_CERT - ret = AllocDer(&signer->derCert, der->length, der->type, NULL); - } - if (ret == 0 && signer != NULL) { - XMEMCPY(signer->derCert->buffer, der->buffer, der->length); - #endif - signer->keyOID = cert->keyOID; - if (cert->pubKeyStored) { - signer->publicKey = cert->publicKey; - signer->pubKeySize = cert->pubKeySize; - } - if (cert->subjectCNStored) { - signer->nameLen = cert->subjectCNLen; - signer->name = cert->subjectCN; - } - signer->pathLength = cert->pathLength; - signer->maxPathLen = cert->maxPathLen; - signer->pathLengthSet = cert->pathLengthSet; - signer->selfSigned = cert->selfSigned; - #ifndef IGNORE_NAME_CONSTRAINTS - signer->permittedNames = cert->permittedNames; - signer->excludedNames = cert->excludedNames; - #endif - #ifndef NO_SKID - XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId, - SIGNER_DIGEST_SIZE); - #endif - XMEMCPY(signer->subjectNameHash, cert->subjectHash, - SIGNER_DIGEST_SIZE); - #ifdef HAVE_OCSP - XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash, - KEYID_SIZE); - #endif - signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage - : 0xFFFF; - signer->next = NULL; /* If Key Usage not set, all uses valid. */ - cert->publicKey = 0; /* in case lock fails don't free here. */ - cert->subjectCN = 0; - #ifndef IGNORE_NAME_CONSTRAINTS - cert->permittedNames = NULL; - cert->excludedNames = NULL; - #endif + ret = FillSigner(signer, cert, type, der); #ifndef NO_SKID row = HashSigner(signer->subjectKeyIdHash); @@ -6140,7 +5478,8 @@ row = HashSigner(signer->subjectNameHash); #endif - if (wc_LockMutex(&cm->caLock) == 0) { + + if (ret == 0 && wc_LockMutex(&cm->caLock) == 0) { signer->next = cm->caTable[row]; cm->caTable[row] = signer; /* takes ownership */ wc_UnLockMutex(&cm->caLock); @@ -6152,7 +5491,7 @@ ret = BAD_MUTEX_E; } } -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) /* Verify CA by TSIP so that generated tsip key is going to be able to */ /* be used for peer's cert verification */ /* TSIP is only able to handle USER CA, and only one CA. */ @@ -6194,181 +5533,6 @@ #endif /* !NO_CERTS */ -#ifndef NO_SESSION_CACHE - - /* basic config gives a cache with 33 sessions, adequate for clients and - embedded servers - - TITAN_SESSION_CACHE allows just over 2 million sessions, for servers - with titanic amounts of memory with long session ID timeouts and high - levels of traffic. - - ENABLE_SESSION_CACHE_ROW_LOCK: Allows row level locking for increased - performance with large session caches - - HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load, - allows over 13,000 new sessions per minute or over 200 new sessions per - second - - BIG_SESSION_CACHE yields 20,027 sessions - - MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that - aren't under heavy load, basically allows 200 new sessions per minute - - SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients - or systems where the default of nearly 3kB is too much RAM, this define - uses less than 500 bytes RAM - - default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined) - */ - #if defined(TITAN_SESSION_CACHE) - #define SESSIONS_PER_ROW 31 - #define SESSION_ROWS 64937 - #ifndef ENABLE_SESSION_CACHE_ROW_LOCK - #define ENABLE_SESSION_CACHE_ROW_LOCK - #endif - #elif defined(HUGE_SESSION_CACHE) - #define SESSIONS_PER_ROW 11 - #define SESSION_ROWS 5981 - #elif defined(BIG_SESSION_CACHE) - #define SESSIONS_PER_ROW 7 - #define SESSION_ROWS 2861 - #elif defined(MEDIUM_SESSION_CACHE) - #define SESSIONS_PER_ROW 5 - #define SESSION_ROWS 211 - #elif defined(SMALL_SESSION_CACHE) - #define SESSIONS_PER_ROW 2 - #define SESSION_ROWS 3 - #else - #define SESSIONS_PER_ROW 3 - #define SESSION_ROWS 11 - #endif - #define INVALID_SESSION_ROW (-1) - - #ifdef NO_SESSION_CACHE_ROW_LOCK - #undef ENABLE_SESSION_CACHE_ROW_LOCK - #endif - - typedef struct SessionRow { - int nextIdx; /* where to place next one */ - int totalCount; /* sessions ever on this row */ -#ifdef SESSION_CACHE_DYNAMIC_MEM - WOLFSSL_SESSION* Sessions[SESSIONS_PER_ROW]; - void* heap; -#else - WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW]; -#endif - - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - /* not included in import/export */ - wolfSSL_RwLock row_lock; - int lock_valid; - #endif - } SessionRow; - #define SIZEOF_SESSION_ROW (sizeof(WOLFSSL_SESSION) + (sizeof(int) * 2)) - - static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS]; - - #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) - static WOLFSSL_GLOBAL word32 PeakSessions; - #endif - - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&(row)->row_lock) - #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&(row)->row_lock) - #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&(row)->row_lock); - #else - static WOLFSSL_GLOBAL wolfSSL_RwLock session_lock; /* SessionCache lock */ - static WOLFSSL_GLOBAL int session_lock_valid = 0; - #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&session_lock) - #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&session_lock) - #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&session_lock); - #endif - - #if !defined(NO_SESSION_CACHE_REF) && defined(NO_CLIENT_CACHE) - #error ClientCache is required when not using NO_SESSION_CACHE_REF - #endif - - #ifndef NO_CLIENT_CACHE - - #ifndef CLIENT_SESSIONS_MULTIPLIER - #ifdef NO_SESSION_CACHE_REF - #define CLIENT_SESSIONS_MULTIPLIER 1 - #else - /* ClientSession objects are lightweight (compared to - * WOLFSSL_SESSION) so to decrease chance that user will reuse - * the wrong session, increase the ClientCache size. This will - * make the entire ClientCache about the size of one - * WOLFSSL_SESSION object. */ - #define CLIENT_SESSIONS_MULTIPLIER 8 - #endif - #endif - #define CLIENT_SESSIONS_PER_ROW \ - (SESSIONS_PER_ROW * CLIENT_SESSIONS_MULTIPLIER) - #define CLIENT_SESSION_ROWS (SESSION_ROWS * CLIENT_SESSIONS_MULTIPLIER) - - #if CLIENT_SESSIONS_PER_ROW > 65535 - #error CLIENT_SESSIONS_PER_ROW too big - #endif - #if CLIENT_SESSION_ROWS > 65535 - #error CLIENT_SESSION_ROWS too big - #endif - - struct ClientSession { - word16 serverRow; /* SessionCache Row id */ - word16 serverIdx; /* SessionCache Idx (column) */ - word32 sessionIDHash; - }; - #ifndef WOLFSSL_CLIENT_SESSION_DEFINED - typedef struct ClientSession ClientSession; - #define WOLFSSL_CLIENT_SESSION_DEFINED - #endif - - typedef struct ClientRow { - int nextIdx; /* where to place next one */ - int totalCount; /* sessions ever on this row */ - ClientSession Clients[CLIENT_SESSIONS_PER_ROW]; - } ClientRow; - - static WOLFSSL_GLOBAL ClientRow ClientCache[CLIENT_SESSION_ROWS]; - /* Client Cache */ - /* uses session mutex */ - - static WOLFSSL_GLOBAL wolfSSL_Mutex clisession_mutex; /* ClientCache mutex */ - static WOLFSSL_GLOBAL int clisession_mutex_valid = 0; - #endif /* !NO_CLIENT_CACHE */ - - void EvictSessionFromCache(WOLFSSL_SESSION* session) - { -#ifdef HAVE_EX_DATA - int save_ownExData = session->ownExData; - session->ownExData = 1; /* Make sure ex_data access doesn't lead back - * into the cache. */ -#endif -#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) - if (session->rem_sess_cb != NULL) { - session->rem_sess_cb(NULL, session); - session->rem_sess_cb = NULL; - } -#endif - ForceZero(session->masterSecret, SECRET_LEN); - XMEMSET(session->sessionID, 0, ID_LEN); - session->sessionIDSz = 0; -#ifdef HAVE_SESSION_TICKET - if (session->ticketLenAlloc > 0) { - XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK); - session->ticket = session->staticTicket; - session->ticketLen = 0; - session->ticketLenAlloc = 0; - } -#endif -#ifdef HAVE_EX_DATA - session->ownExData = save_ownExData; -#endif - } - -#endif /* !NO_SESSION_CACHE */ - #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB) static int wolfSSL_RAND_InitMutex(void); #endif @@ -6393,22 +5557,40 @@ WOLFSSL_ENTER("wolfSSL_Init"); - #if FIPS_VERSION_GE(5,1) +#ifndef WOLFSSL_MUTEX_INITIALIZER + if (inits_count_mutex_valid == 0) { + if (wc_InitMutex(&inits_count_mutex) != 0) { + WOLFSSL_MSG("Bad Init Mutex count"); + return BAD_MUTEX_E; + } + else { + inits_count_mutex_valid = 1; + } + } +#endif /* !WOLFSSL_MUTEX_INITIALIZER */ + + if (wc_LockMutex(&inits_count_mutex) != 0) { + WOLFSSL_MSG("Bad Lock Mutex count"); + return BAD_MUTEX_E; + } + +#if FIPS_VERSION_GE(5,1) + if ((ret == WOLFSSL_SUCCESS) && (initRefCount == 0)) { ret = wolfCrypt_SetPrivateKeyReadEnable_fips(1, WC_KEYTYPE_ALL); - if (ret != 0) - return ret; - else + if (ret == 0) ret = WOLFSSL_SUCCESS; - #endif + } +#endif - if (initRefCount == 0) { + if ((ret == WOLFSSL_SUCCESS) && (initRefCount == 0)) { /* Initialize crypto for use with TLS connection */ + if (wolfCrypt_Init() != 0) { WOLFSSL_MSG("Bad wolfCrypt Init"); ret = WC_INIT_E; } -#ifdef HAVE_GLOBAL_RNG +#if defined(HAVE_GLOBAL_RNG) && !defined(WOLFSSL_MUTEX_INITIALIZER) if (ret == WOLFSSL_SUCCESS) { if (wc_InitMutex(&globalRNGMutex) != 0) { WOLFSSL_MSG("Bad Init Mutex rng"); @@ -6463,6 +5645,7 @@ } #endif #ifndef NO_CLIENT_CACHE + #ifndef WOLFSSL_MUTEX_INITIALIZER if (ret == WOLFSSL_SUCCESS) { if (wc_InitMutex(&clisession_mutex) != 0) { WOLFSSL_MSG("Bad Init Mutex session"); @@ -6472,17 +5655,9 @@ clisession_mutex_valid = 1; } } + #endif #endif #endif - if (ret == WOLFSSL_SUCCESS) { - if (wc_InitMutex(&count_mutex) != 0) { - WOLFSSL_MSG("Bad Init Mutex count"); - ret = BAD_MUTEX_E; - } - else { - count_mutex_valid = 1; - } - } #if defined(OPENSSL_EXTRA) && defined(HAVE_ATEXIT) /* OpenSSL registers cleanup using atexit */ if ((ret == WOLFSSL_SUCCESS) && (atexit(AtExitCleanup) != 0)) { @@ -6493,1684 +5668,29 @@ } if (ret == WOLFSSL_SUCCESS) { - if (wc_LockMutex(&count_mutex) != 0) { - WOLFSSL_MSG("Bad Lock Mutex count"); - ret = BAD_MUTEX_E; - } - else { - initRefCount++; - wc_UnLockMutex(&count_mutex); - } - } - - if (ret != WOLFSSL_SUCCESS) { - initRefCount = 1; /* Force cleanup */ - (void)wolfSSL_Cleanup(); /* Ignore any error from cleanup */ - } - - return ret; -} - - -#ifndef NO_CERTS - -/* process user cert chain to pass during the handshake */ -static int ProcessUserChain(WOLFSSL_CTX* ctx, const unsigned char* buff, - long sz, int format, int type, WOLFSSL* ssl, - long* used, EncryptedInfo* info, int verify) -{ - int ret = 0; - void* heap = wolfSSL_CTX_GetHeap(ctx, ssl); - - if ((type == CA_TYPE) && (ctx == NULL)) { - WOLFSSL_MSG("Need context for CA load"); - return BAD_FUNC_ARG; - } - - /* we may have a user cert chain, try to consume */ - if ((type == CERT_TYPE || type == CA_TYPE) && (info->consumed < sz)) { - #ifdef WOLFSSL_SMALL_STACK - byte staticBuffer[1]; /* force heap usage */ - #else - byte staticBuffer[FILE_BUFFER_SIZE]; /* tmp chain buffer */ - #endif - byte* chainBuffer = staticBuffer; - int dynamicBuffer = 0; - word32 bufferSz; - long consumed = info->consumed; - word32 idx = 0; - int gotOne = 0; - #ifdef WOLFSSL_TLS13 - int cnt = 0; - #endif - - /* Calculate max possible size, including max headers */ - bufferSz = (word32)(sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH); - if (bufferSz > sizeof(staticBuffer)) { - WOLFSSL_MSG("Growing Tmp Chain Buffer"); - /* will shrink to actual size */ - chainBuffer = (byte*)XMALLOC(bufferSz, heap, DYNAMIC_TYPE_FILE); - if (chainBuffer == NULL) { - return MEMORY_E; - } - dynamicBuffer = 1; - } - - WOLFSSL_MSG("Processing Cert Chain"); - while (consumed < sz) { - DerBuffer* part = NULL; - word32 remain = (word32)(sz - consumed); - info->consumed = 0; - - if (format == WOLFSSL_FILETYPE_PEM) { - #ifdef WOLFSSL_PEM_TO_DER - ret = PemToDer(buff + consumed, remain, type, &part, - heap, info, NULL); - #else - ret = NOT_COMPILED_IN; - #endif - } - else { - int length = remain; - if (format == WOLFSSL_FILETYPE_ASN1) { - /* get length of der (read sequence) */ - word32 inOutIdx = 0; - if (GetSequence(buff + consumed, &inOutIdx, &length, - remain) < 0) { - ret = ASN_NO_PEM_HEADER; - } - length += inOutIdx; /* include leading sequence */ - } - info->consumed = length; - if (ret == 0) { - ret = AllocDer(&part, length, type, heap); - if (ret == 0) { - XMEMCPY(part->buffer, buff + consumed, length); - } - } - } - if (ret == 0) { - gotOne = 1; -#ifdef WOLFSSL_TLS13 - cnt++; -#endif - if ((idx + part->length + CERT_HEADER_SZ) > bufferSz) { - WOLFSSL_MSG(" Cert Chain bigger than buffer. " - "Consider increasing MAX_CHAIN_DEPTH"); - ret = BUFFER_E; - } - else { - c32to24(part->length, &chainBuffer[idx]); - idx += CERT_HEADER_SZ; - XMEMCPY(&chainBuffer[idx], part->buffer, part->length); - idx += part->length; - consumed += info->consumed; - if (used) - *used += info->consumed; - } - - /* add CA's to certificate manager */ - if (ret == 0 && type == CA_TYPE) { - /* verify CA unless user set to no verify */ - ret = AddCA(ctx->cm, &part, WOLFSSL_USER_CA, verify); - if (ret == WOLFSSL_SUCCESS) { - ret = 0; /* converted success case */ - } - gotOne = 0; /* don't exit loop for CA type */ - } - } - - FreeDer(&part); - - if (ret == ASN_NO_PEM_HEADER && gotOne) { - WOLFSSL_MSG("We got one good cert, so stuff at end ok"); - break; - } - - if (ret < 0) { - WOLFSSL_MSG(" Error in Cert in Chain"); - if (dynamicBuffer) - XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE); - return ret; - } - WOLFSSL_MSG(" Consumed another Cert in Chain"); - } - WOLFSSL_MSG("Finished Processing Cert Chain"); - - /* only retain actual size used */ - ret = 0; - if (idx > 0) { - if (ssl) { - if (ssl->buffers.weOwnCertChain) { - FreeDer(&ssl->buffers.certChain); - } - ret = AllocDer(&ssl->buffers.certChain, idx, type, heap); - if (ret == 0) { - XMEMCPY(ssl->buffers.certChain->buffer, chainBuffer, - idx); - ssl->buffers.weOwnCertChain = 1; - } - #ifdef WOLFSSL_TLS13 - ssl->buffers.certChainCnt = cnt; - #endif - } else if (ctx) { - FreeDer(&ctx->certChain); - ret = AllocDer(&ctx->certChain, idx, type, heap); - if (ret == 0) { - XMEMCPY(ctx->certChain->buffer, chainBuffer, idx); - } - #ifdef WOLFSSL_TLS13 - ctx->certChainCnt = cnt; - #endif - } - } - - if (dynamicBuffer) - XFREE(chainBuffer, heap, DYNAMIC_TYPE_FILE); - } - - return ret; -} - -#ifndef NO_RSA -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) -static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - int devId) -{ - int ret; - - (void)devId; - - *idx = 0; - ret = wc_RsaPrivateKeyValidate(der->buffer, idx, keySz, der->length); -#ifdef WOLF_PRIVATE_KEY_ID - if ((ret != 0) && (devId != INVALID_DEVID - #ifdef HAVE_PK_CALLBACKS - || wolfSSL_CTX_IsPrivatePkSet(ctx) - #endif - )) { - word32 nSz; - - /* if using crypto or PK callbacks, try public key decode */ - *idx = 0; - ret = wc_RsaPublicKeyDecode_ex(der->buffer, idx, der->length, NULL, - &nSz, NULL, NULL); - if (ret == 0) { - *keySz = (int)nSz; - } - } -#endif - if (ret != 0) { - #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \ - !defined(HAVE_ED448) && !defined(HAVE_PQC) - WOLFSSL_MSG("RSA decode failed and other algorithms " - "not enabled to try"); - ret = WOLFSSL_BAD_FILE; - #else - ret = 0; /* continue trying other algorithms */ - #endif - } - else { - /* check that the size of the RSA key is enough */ - int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz; - if (*keySz < minRsaSz) { - ret = RSA_KEY_SIZE_E; - WOLFSSL_MSG("Private Key size too small"); - } - - if (ssl) { - ssl->buffers.keyType = rsa_sa_algo; - ssl->buffers.keySz = *keySz; - } - else { - ctx->privateKeyType = rsa_sa_algo; - ctx->privateKeySz = *keySz; - } - - *keyFormat = RSAk; - - if (ssl && ssl->options.side == WOLFSSL_SERVER_END) { - ssl->options.haveStaticECC = 0; - *resetSuites = 1; - } - } - - return ret; -} -#else -static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - void* heap, int devId) -{ - int ret; - - /* make sure RSA key can be used */ -#ifdef WOLFSSL_SMALL_STACK - RsaKey* key; -#else - RsaKey key[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA); - if (key == NULL) - return MEMORY_E; -#endif - - ret = wc_InitRsaKey_ex(key, heap, devId); - if (ret == 0) { - *idx = 0; - ret = wc_RsaPrivateKeyDecode(der->buffer, idx, key, der->length); - #ifdef WOLF_PRIVATE_KEY_ID - if (ret != 0 && (devId != INVALID_DEVID - #ifdef HAVE_PK_CALLBACKS - || wolfSSL_CTX_IsPrivatePkSet(ctx) - #endif - )) { - /* if using crypto or PK callbacks, try public key decode */ - *idx = 0; - ret = wc_RsaPublicKeyDecode(der->buffer, idx, key, der->length); - } - #endif - if (ret != 0) { - #if !defined(HAVE_ECC) && !defined(HAVE_ED25519) && \ - !defined(HAVE_ED448) && !defined(HAVE_PQC) - WOLFSSL_MSG("RSA decode failed and other algorithms " - "not enabled to try"); - ret = WOLFSSL_BAD_FILE; - #else - ret = 0; /* continue trying other algorithms */ - #endif - } - else { - /* check that the size of the RSA key is enough */ - int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz; - *keySz = wc_RsaEncryptSize((RsaKey*)key); - if (*keySz < minRsaSz) { - ret = RSA_KEY_SIZE_E; - WOLFSSL_MSG("Private Key size too small"); - } - - if (ssl) { - ssl->buffers.keyType = rsa_sa_algo; - ssl->buffers.keySz = *keySz; - } - else { - ctx->privateKeyType = rsa_sa_algo; - ctx->privateKeySz = *keySz; - } - - *keyFormat = RSAk; - - if (ssl && ssl->options.side == WOLFSSL_SERVER_END) { - ssl->options.haveStaticECC = 0; - *resetSuites = 1; - } - } - - wc_FreeRsaKey(key); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(key, heap, DYNAMIC_TYPE_RSA); -#endif - - return ret; -} -#endif -#endif /* !NO_RSA */ - -#ifdef HAVE_ECC -static int ProcessBufferTryDecodeEcc(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - void* heap, int devId) -{ - int ret = 0; - /* make sure ECC key can be used */ -#ifdef WOLFSSL_SMALL_STACK - ecc_key* key; -#else - ecc_key key[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC); - if (key == NULL) - return MEMORY_E; -#endif - - if (wc_ecc_init_ex(key, heap, devId) == 0) { - *idx = 0; - ret = wc_EccPrivateKeyDecode(der->buffer, idx, key, der->length); - #ifdef WOLF_PRIVATE_KEY_ID - if (ret != 0 && (devId != INVALID_DEVID - #ifdef HAVE_PK_CALLBACKS - || wolfSSL_CTX_IsPrivatePkSet(ctx) - #endif - )) { - /* if using crypto or PK callbacks, try public key decode */ - *idx = 0; - ret = wc_EccPublicKeyDecode(der->buffer, idx, key, der->length); - } - #endif - if (ret == 0) { - /* check for minimum ECC key size and then free */ - int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz; - *keySz = wc_ecc_size(key); - if (*keySz < minKeySz) { - WOLFSSL_MSG("ECC private key too small"); - ret = ECC_KEY_SIZE_E; - } - - *keyFormat = ECDSAk; - if (ssl) { - ssl->options.haveStaticECC = 1; - ssl->buffers.keyType = ecc_dsa_sa_algo; - ssl->buffers.keySz = *keySz; - } - else { - ctx->haveStaticECC = 1; - ctx->privateKeyType = ecc_dsa_sa_algo; - ctx->privateKeySz = *keySz; - } - - if (ssl && ssl->options.side == WOLFSSL_SERVER_END) { - *resetSuites = 1; - } - } - else { - ret = 0; /* continue trying other algorithms */ - } - - wc_ecc_free(key); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(key, heap, DYNAMIC_TYPE_ECC); -#endif - return ret; -} -#endif /* HAVE_ECC */ - -#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) -static int ProcessBufferTryDecodeEd25519(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - void* heap, int devId) -{ - int ret; - /* make sure Ed25519 key can be used */ -#ifdef WOLFSSL_SMALL_STACK - ed25519_key* key; -#else - ed25519_key key[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap, - DYNAMIC_TYPE_ED25519); - if (key == NULL) - return MEMORY_E; -#endif - - ret = wc_ed25519_init_ex(key, heap, devId); - if (ret == 0) { - *idx = 0; - ret = wc_Ed25519PrivateKeyDecode(der->buffer, idx, key, der->length); - #ifdef WOLF_PRIVATE_KEY_ID - if (ret != 0 && (devId != INVALID_DEVID - #ifdef HAVE_PK_CALLBACKS - || wolfSSL_CTX_IsPrivatePkSet(ctx) - #endif - )) { - /* if using crypto or PK callbacks, try public key decode */ - *idx = 0; - ret = wc_Ed25519PublicKeyDecode(der->buffer, idx, key, der->length); - } - #endif - if (ret == 0) { - /* check for minimum key size and then free */ - int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz; - *keySz = ED25519_KEY_SIZE; - if (*keySz < minKeySz) { - WOLFSSL_MSG("ED25519 private key too small"); - ret = ECC_KEY_SIZE_E; - } - if (ret == 0) { - if (ssl) { - ssl->buffers.keyType = ed25519_sa_algo; - ssl->buffers.keySz = *keySz; - } - else if (ctx) { - ctx->privateKeyType = ed25519_sa_algo; - ctx->privateKeySz = *keySz; - } - - *keyFormat = ED25519k; - if (ssl != NULL) { - /* ED25519 requires caching enabled for tracking message - * hash used in EdDSA_Update for signing */ - ssl->options.cacheMessages = 1; - if (ssl->options.side == WOLFSSL_SERVER_END) { - *resetSuites = 1; - } - } - } - } - else { - ret = 0; /* continue trying other algorithms */ - } - - wc_ed25519_free(key); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(key, heap, DYNAMIC_TYPE_ED25519); -#endif - return ret; -} -#endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */ - -#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT) -static int ProcessBufferTryDecodeEd448(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - void* heap, int devId) -{ - int ret; - /* make sure Ed448 key can be used */ -#ifdef WOLFSSL_SMALL_STACK - ed448_key* key = NULL; -#else - ed448_key key[1]; -#endif - -#ifdef WOLFSSL_SMALL_STACK - key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448); - if (key == NULL) - return MEMORY_E; -#endif - - ret = wc_ed448_init_ex(key, heap, devId); - if (ret == 0) { - *idx = 0; - ret = wc_Ed448PrivateKeyDecode(der->buffer, idx, key, der->length); - #ifdef WOLF_PRIVATE_KEY_ID - if (ret != 0 && (devId != INVALID_DEVID - #ifdef HAVE_PK_CALLBACKS - || wolfSSL_CTX_IsPrivatePkSet(ctx) - #endif - )) { - /* if using crypto or PK callbacks, try public key decode */ - *idx = 0; - ret = wc_Ed448PublicKeyDecode(der->buffer, idx, key, der->length); - } - #endif - if (ret == 0) { - /* check for minimum key size and then free */ - int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz; - *keySz = ED448_KEY_SIZE; - if (*keySz < minKeySz) { - WOLFSSL_MSG("ED448 private key too small"); - ret = ECC_KEY_SIZE_E; - } - } - if (ret == 0) { - if (ssl) { - ssl->buffers.keyType = ed448_sa_algo; - ssl->buffers.keySz = *keySz; - } - else if (ctx) { - ctx->privateKeyType = ed448_sa_algo; - ctx->privateKeySz = *keySz; - } - - *keyFormat = ED448k; - if (ssl != NULL) { - /* ED448 requires caching enabled for tracking message - * hash used in EdDSA_Update for signing */ - ssl->options.cacheMessages = 1; - if (ssl->options.side == WOLFSSL_SERVER_END) { - *resetSuites = 1; - } - } - } - - wc_ed448_free(key); - } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(key, heap, DYNAMIC_TYPE_ED448); -#endif - return ret; -} -#endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */ - -#if defined(HAVE_PQC) -#if defined(HAVE_FALCON) -static int ProcessBufferTryDecodeFalcon(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - void* heap) -{ - int ret; - /* make sure Falcon key can be used */ - falcon_key* key = (falcon_key*)XMALLOC(sizeof(falcon_key), heap, - DYNAMIC_TYPE_FALCON); - if (key == NULL) { - return MEMORY_E; - } - ret = wc_falcon_init(key); - if (ret == 0) { - if (*keyFormat == FALCON_LEVEL1k) { - ret = wc_falcon_set_level(key, 1); - } - else if (*keyFormat == FALCON_LEVEL5k) { - ret = wc_falcon_set_level(key, 5); - } - else { - /* What if *keyformat is 0? We might want to do something more - * graceful here. */ - wc_falcon_free(key); - ret = ALGO_ID_E; - } - } - - if (ret == 0) { - *idx = 0; - ret = wc_falcon_import_private_only(der->buffer, der->length, key); - if (ret == 0) { - /* check for minimum key size and then free */ - int minKeySz = ssl ? ssl->options.minFalconKeySz : - ctx->minFalconKeySz; - *keySz = FALCON_MAX_KEY_SIZE; - if (*keySz < minKeySz) { - WOLFSSL_MSG("Falcon private key too small"); - ret = FALCON_KEY_SIZE_E; - } - if (ssl) { - if (*keyFormat == FALCON_LEVEL1k) { - ssl->buffers.keyType = falcon_level1_sa_algo; - } - else { - ssl->buffers.keyType = falcon_level5_sa_algo; - } - ssl->buffers.keySz = *keySz; - } - else { - if (*keyFormat == FALCON_LEVEL1k) { - ctx->privateKeyType = falcon_level1_sa_algo; - } - else { - ctx->privateKeyType = falcon_level5_sa_algo; - } - ctx->privateKeySz = *keySz; - } - - if (ssl && ssl->options.side == WOLFSSL_SERVER_END) { - *resetSuites = 1; - } - } - wc_falcon_free(key); - } - XFREE(key, heap, DYNAMIC_TYPE_FALCON); - return ret; -} -#endif - -#if defined(HAVE_DILITHIUM) -static int ProcessBufferTryDecodeDilithium(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - void* heap) -{ - int ret; - /* make sure Dilithium key can be used */ - dilithium_key* key = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap, - DYNAMIC_TYPE_DILITHIUM); - if (key == NULL) { - return MEMORY_E; - } - ret = wc_dilithium_init(key); - if (ret == 0) { - if (*keyFormat == DILITHIUM_LEVEL2k) { - ret = wc_dilithium_set_level(key, 2); - } - else if (*keyFormat == DILITHIUM_LEVEL3k) { - ret = wc_dilithium_set_level(key, 3); - } - else if (*keyFormat == DILITHIUM_LEVEL5k) { - ret = wc_dilithium_set_level(key, 5); - } - else { - /* What if *keyformat is 0? We might want to do something more - * graceful here. */ - wc_dilithium_free(key); - ret = ALGO_ID_E; - } - } - - if (ret == 0) { - *idx = 0; - ret = wc_dilithium_import_private_only(der->buffer, der->length, key); - if (ret == 0) { - /* check for minimum key size and then free */ - int minKeySz = ssl ? ssl->options.minDilithiumKeySz : - ctx->minDilithiumKeySz; - *keySz = DILITHIUM_MAX_KEY_SIZE; - if (*keySz < minKeySz) { - WOLFSSL_MSG("Dilithium private key too small"); - ret = DILITHIUM_KEY_SIZE_E; - } - if (ssl) { - if (*keyFormat == DILITHIUM_LEVEL2k) { - ssl->buffers.keyType = dilithium_level2_sa_algo; - } - else if (*keyFormat == DILITHIUM_LEVEL3k) { - ssl->buffers.keyType = dilithium_level3_sa_algo; - } - else if (*keyFormat == DILITHIUM_LEVEL5k) { - ssl->buffers.keyType = dilithium_level5_sa_algo; - } - ssl->buffers.keySz = *keySz; - } - else { - if (*keyFormat == DILITHIUM_LEVEL2k) { - ctx->privateKeyType = dilithium_level2_sa_algo; - } - else if (*keyFormat == DILITHIUM_LEVEL3k) { - ctx->privateKeyType = dilithium_level3_sa_algo; - } - else if (*keyFormat == DILITHIUM_LEVEL5k) { - ctx->privateKeyType = dilithium_level5_sa_algo; - } - ctx->privateKeySz = *keySz; - } - - if (ssl && ssl->options.side == WOLFSSL_SERVER_END) { - *resetSuites = 1; - } - } - wc_dilithium_free(key); - } - XFREE(key, heap, DYNAMIC_TYPE_DILITHIUM); - - return ret; -} -#endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ - -static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - DerBuffer* der, int* keySz, word32* idx, int* resetSuites, int* keyFormat, - void* heap, int devId) -{ - int ret = 0; - - (void)heap; - (void)devId; - - if (ctx == NULL && ssl == NULL) - return BAD_FUNC_ARG; - if (!der || !keySz || !idx || !resetSuites || !keyFormat) - return BAD_FUNC_ARG; - -#ifndef NO_RSA - if ((*keyFormat == 0 || *keyFormat == RSAk)) { -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) - ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keySz, idx, resetSuites, - keyFormat, devId); -#else - ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keySz, idx, resetSuites, - keyFormat, heap, devId); -#endif - if (ret != 0) - return ret; - } -#endif -#ifdef HAVE_ECC - if ((*keyFormat == 0 || *keyFormat == ECDSAk)) { - ret = ProcessBufferTryDecodeEcc(ctx, ssl, der, keySz, idx, resetSuites, - keyFormat, heap, devId); - if (ret != 0) - return ret; - } -#endif /* HAVE_ECC */ -#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) - if ((*keyFormat == 0 || *keyFormat == ED25519k)) { - ret = ProcessBufferTryDecodeEd25519(ctx, ssl, der, keySz, idx, - resetSuites, keyFormat, heap, devId); - if (ret != 0) - return ret; - } -#endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */ -#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT) - if ((*keyFormat == 0 || *keyFormat == ED448k)) { - ret = ProcessBufferTryDecodeEd448(ctx, ssl, der, keySz, idx, - resetSuites, keyFormat, heap, devId); - if (ret != 0) - return ret; - } -#endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */ -#if defined(HAVE_PQC) -#if defined(HAVE_FALCON) - if (((*keyFormat == 0) || (*keyFormat == FALCON_LEVEL1k) || - (*keyFormat == FALCON_LEVEL5k))) { - ret = ProcessBufferTryDecodeFalcon(ctx, ssl, der, keySz, idx, - resetSuites, keyFormat, heap); - if (ret != 0) - return ret; - } -#endif /* HAVE_FALCON */ -#if defined(HAVE_DILITHIUM) - if ((*keyFormat == 0) || - (*keyFormat == DILITHIUM_LEVEL2k) || - (*keyFormat == DILITHIUM_LEVEL3k) || - (*keyFormat == DILITHIUM_LEVEL5k)) { - ret = ProcessBufferTryDecodeDilithium(ctx, ssl, der, keySz, idx, - resetSuites, keyFormat, heap); - if (ret != 0) { - return ret; - } - } -#endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ - return ret; -} - -/* process the buffer buff, length sz, into ctx of format and type - used tracks bytes consumed, userChain specifies a user cert chain - to pass during the handshake */ -int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff, - long sz, int format, int type, WOLFSSL* ssl, - long* used, int userChain, int verify) -{ - DerBuffer* der = NULL; - int ret = 0; - int done = 0; - int keyFormat = 0; - int resetSuites = 0; - void* heap = wolfSSL_CTX_GetHeap(ctx, ssl); - int devId = wolfSSL_CTX_GetDevId(ctx, ssl); - word32 idx = 0; - int keySz = 0; -#if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \ - defined(HAVE_PKCS8) - word32 algId = 0; -#endif -#ifdef WOLFSSL_SMALL_STACK - EncryptedInfo* info = NULL; -#else - EncryptedInfo info[1]; -#endif - - (void)devId; - (void)idx; - (void)keySz; - - if (used) - *used = sz; /* used bytes default to sz, PEM chain may shorten*/ - - /* check args */ - if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM) - return WOLFSSL_BAD_FILETYPE; - - if (ctx == NULL && ssl == NULL) - return BAD_FUNC_ARG; - -#ifdef WOLFSSL_SMALL_STACK - info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap, - DYNAMIC_TYPE_ENCRYPTEDINFO); - if (info == NULL) - return MEMORY_E; -#endif - - XMEMSET(info, 0, sizeof(EncryptedInfo)); -#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) - if (ctx) { - info->passwd_cb = ctx->passwd_cb; - info->passwd_userdata = ctx->passwd_userdata; - } -#endif - - if (format == WOLFSSL_FILETYPE_PEM) { - #ifdef WOLFSSL_PEM_TO_DER - ret = PemToDer(buff, sz, type, &der, heap, info, &keyFormat); - #else - ret = NOT_COMPILED_IN; - #endif + initRefCount++; } else { - /* ASN1 (DER) */ - int length = (int)sz; - if (format == WOLFSSL_FILETYPE_ASN1) { - /* get length of der (read sequence or octet string) */ - word32 inOutIdx = 0; - if (GetSequence(buff, &inOutIdx, &length, (word32)sz) >= 0) { - length += inOutIdx; /* include leading sequence */ - } - /* get length using octet string (allowed for private key types) */ - else if (type == PRIVATEKEY_TYPE && - GetOctetString(buff, &inOutIdx, &length, (word32)sz) >= 0) { - length += inOutIdx; /* include leading oct string */ - } - else { - ret = ASN_PARSE_E; - } - } - - info->consumed = length; - - if (ret == 0) { - ret = AllocDer(&der, (word32)length, type, heap); - if (ret == 0) { - XMEMCPY(der->buffer, buff, length); - } - - #ifdef HAVE_PKCS8 - /* if private key try and remove PKCS8 header */ - if (ret == 0 && type == PRIVATEKEY_TYPE) { - if ((ret = ToTraditional_ex(der->buffer, der->length, - &algId)) > 0) { - /* Found PKCS8 header */ - /* ToTraditional_ex moves buff and returns adjusted length */ - der->length = ret; - keyFormat = algId; - } - ret = 0; /* failures should be ignored */ - } - #endif - } - } - - if (used) { - *used = info->consumed; - } - - /* process user chain */ - if (ret >= 0) { - /* Chain should have server cert first, then intermediates, then root. - * First certificate in chain is processed below after ProcessUserChain - * and is loaded into ssl->buffers.certificate. - * Remainder are processed using ProcessUserChain and are loaded into - * ssl->buffers.certChain. */ - if (userChain) { - ret = ProcessUserChain(ctx, buff, sz, format, type, ssl, used, info, - verify); - if (ret == ASN_NO_PEM_HEADER) { /* Additional chain is optional */ - unsigned long pemErr = 0; - CLEAR_ASN_NO_PEM_HEADER_ERROR(pemErr); - ret = 0; - } - } - } - - /* info is only used for private key with DER or PEM, so free now */ - if (ret < 0 || type != PRIVATEKEY_TYPE) { - #ifdef WOLFSSL_SMALL_STACK - XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO); - #endif - } - - /* check for error */ - if (ret < 0) { - FreeDer(&der); - done = 1; - } - - if (done == 1) { - /* No operation, just skip the next section */ - } - /* Handle DER owner */ - else if (type == CA_TYPE) { - if (ctx == NULL) { - WOLFSSL_MSG("Need context for CA load"); - FreeDer(&der); - return BAD_FUNC_ARG; - } - /* verify CA unless user set to no verify */ - ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify); - done = 1; - } -#ifdef WOLFSSL_TRUST_PEER_CERT - else if (type == TRUSTED_PEER_TYPE) { - /* add trusted peer cert. der is freed within */ - if (ctx != NULL) - ret = AddTrustedPeer(ctx->cm, &der, !ctx->verifyNone); - else - ret = AddTrustedPeer(SSL_CM(ssl), &der, !ssl->options.verifyNone); - if (ret != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Error adding trusted peer"); - } - done = 1; - } -#endif /* WOLFSSL_TRUST_PEER_CERT */ - else if (type == CERT_TYPE) { - if (ssl != NULL) { - /* Make sure previous is free'd */ - if (ssl->buffers.weOwnCert) { - FreeDer(&ssl->buffers.certificate); - #ifdef KEEP_OUR_CERT - wolfSSL_X509_free(ssl->ourCert); - ssl->ourCert = NULL; - #endif - } - ssl->buffers.certificate = der; - #ifdef KEEP_OUR_CERT - ssl->keepCert = 1; /* hold cert for ssl lifetime */ - #endif - ssl->buffers.weOwnCert = 1; - } - else if (ctx != NULL) { - FreeDer(&ctx->certificate); /* Make sure previous is free'd */ - #ifdef KEEP_OUR_CERT - if (ctx->ourCert) { - if (ctx->ownOurCert) - wolfSSL_X509_free(ctx->ourCert); - ctx->ourCert = NULL; - } - #endif - ctx->certificate = der; - } - } - else if (type == PRIVATEKEY_TYPE) { - if (ssl != NULL) { - /* Make sure previous is free'd */ - if (ssl->buffers.weOwnKey) { - ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length); - FreeDer(&ssl->buffers.key); - } - ssl->buffers.key = der; -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("SSL Buffers key", der->buffer, der->length); -#endif - ssl->buffers.weOwnKey = 1; - } - else if (ctx != NULL) { - if (ctx->privateKey != NULL && ctx->privateKey->buffer != NULL) { - ForceZero(ctx->privateKey->buffer, ctx->privateKey->length); - } - FreeDer(&ctx->privateKey); - ctx->privateKey = der; -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("CTX private key", der->buffer, der->length); -#endif - } - } - else { - FreeDer(&der); - return WOLFSSL_BAD_CERTTYPE; - } - - if (done == 1) { - /* No operation, just skip the next section */ - } - else if (type == PRIVATEKEY_TYPE) { - ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, &resetSuites, - &keyFormat, heap, devId); - - #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) - /* for WOLFSSL_FILETYPE_PEM, PemToDer manages the decryption */ - /* If private key type PKCS8 header wasn't already removed (algoId == 0) */ - if ((ret != 0 || keyFormat == 0) - && format != WOLFSSL_FILETYPE_PEM && info->passwd_cb && algId == 0) - { - int passwordSz = NAME_SZ; - #ifndef WOLFSSL_SMALL_STACK - char password[NAME_SZ]; - #else - char* password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING); - if (password == NULL) { - XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO); - FreeDer(&der); - return MEMORY_E; - } - #endif - /* get password */ - ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ, - info->passwd_userdata); - if (ret >= 0) { - passwordSz = ret; - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("ProcessBuffer password", password, passwordSz); - #endif - - /* PKCS8 decrypt */ - ret = ToTraditionalEnc(der->buffer, der->length, - password, passwordSz, &algId); - if (ret >= 0) { - ForceZero(der->buffer + ret, der->length - ret); - der->length = ret; - } - /* ignore failures and try parsing as unencrypted */ - - ForceZero(password, passwordSz); - } - - #ifdef WOLFSSL_SMALL_STACK - XFREE(password, heap, DYNAMIC_TYPE_STRING); - #elif defined(WOLFSSL_CHECK_MEM_ZERO) - wc_MemZero_Check(password, NAME_SZ); - #endif - ret = ProcessBufferTryDecode(ctx, ssl, der, &keySz, &idx, - &resetSuites, &keyFormat, heap, devId); - } - #endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */ - - #ifdef WOLFSSL_SMALL_STACK - XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO); - #endif - - if (ret != 0) - return ret; - if (keyFormat == 0) { -#ifdef OPENSSL_EXTRA - /* Reaching this point probably means that the - * decryption password is wrong */ - if (info->passwd_cb) - EVPerr(0, EVP_R_BAD_DECRYPT); -#endif - WOLFSSL_ERROR(WOLFSSL_BAD_FILE); - return WOLFSSL_BAD_FILE; - } - - (void)devId; - } - else if (type == CERT_TYPE) { - #ifdef WOLFSSL_SMALL_STACK - DecodedCert* cert; - #else - DecodedCert cert[1]; - #endif - #ifdef WOLF_PRIVATE_KEY_ID - int keyType = 0; - #endif - - #ifdef WOLFSSL_SMALL_STACK - cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap, - DYNAMIC_TYPE_DCERT); - if (cert == NULL) - return MEMORY_E; - #endif - - WOLFSSL_MSG("Checking cert signature type"); - InitDecodedCert_ex(cert, der->buffer, der->length, heap, devId); - - if (DecodeToKey(cert, 0) < 0) { - WOLFSSL_MSG("Decode to key failed"); - FreeDecodedCert(cert); - #ifdef WOLFSSL_SMALL_STACK - XFREE(cert, heap, DYNAMIC_TYPE_DCERT); - #endif - return WOLFSSL_BAD_FILE; - } - - if (ssl) { - if (ssl->options.side == WOLFSSL_SERVER_END) - resetSuites = 1; - } - else if (ctx && ctx->method->side == WOLFSSL_SERVER_END) { - resetSuites = 1; - } - if (ssl && ssl->ctx->haveECDSAsig) { - WOLFSSL_MSG("SSL layer setting cert, CTX had ECDSA, turning off"); - ssl->options.haveECDSAsig = 0; /* may turn back on next */ - } - - switch (cert->signatureOID) { - case CTC_SHAwECDSA: - case CTC_SHA256wECDSA: - case CTC_SHA384wECDSA: - case CTC_SHA512wECDSA: - case CTC_ED25519: - case CTC_ED448: - WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature"); - if (ssl) - ssl->options.haveECDSAsig = 1; - else if (ctx) - ctx->haveECDSAsig = 1; - break; - case CTC_FALCON_LEVEL1: - case CTC_FALCON_LEVEL5: - WOLFSSL_MSG("Falcon cert signature"); - if (ssl) - ssl->options.haveFalconSig = 1; - else if (ctx) - ctx->haveFalconSig = 1; - break; - case CTC_DILITHIUM_LEVEL2: - case CTC_DILITHIUM_LEVEL3: - case CTC_DILITHIUM_LEVEL5: - WOLFSSL_MSG("Dilithium cert signature"); - if (ssl) - ssl->options.haveDilithiumSig = 1; - else if (ctx) - ctx->haveDilithiumSig = 1; - break; - default: - WOLFSSL_MSG("Not ECDSA cert signature"); - break; - } - - #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \ - (defined(HAVE_PQC) && defined(HAVE_LIBOQS)) || !defined(NO_RSA) - if (ssl) { - #if defined(HAVE_ECC) || defined(HAVE_ED25519) || \ - (defined(HAVE_CURVE448) && defined(HAVE_ED448)) - ssl->pkCurveOID = cert->pkCurveOID; - #endif - #ifndef WC_STRICT_SIG - if (cert->keyOID == ECDSAk) { - ssl->options.haveECC = 1; - } - #ifndef NO_RSA - else if (cert->keyOID == RSAk) { - ssl->options.haveRSA = 1; - } - #ifdef WC_RSA_PSS - else if (cert->keyOID == RSAPSSk) { - ssl->options.haveRSA = 1; - } - #endif - #endif - #ifdef HAVE_ED25519 - else if (cert->keyOID == ED25519k) { - ssl->options.haveECC = 1; - } - #endif - #ifdef HAVE_ED448 - else if (cert->keyOID == ED448k) { - ssl->options.haveECC = 1; - } - #endif - #ifdef HAVE_PQC - #ifdef HAVE_FALCON - else if (cert->keyOID == FALCON_LEVEL1k || - cert->keyOID == FALCON_LEVEL5k) { - ssl->options.haveFalconSig = 1; - } - #endif /* HAVE_FALCON */ - #ifdef HAVE_DILITHIUM - else if (cert->keyOID == DILITHIUM_LEVEL2k || - cert->keyOID == DILITHIUM_LEVEL3k || - cert->keyOID == DILITHIUM_LEVEL5k) { - ssl->options.haveDilithiumSig = 1; - } - #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ - #else - ssl->options.haveECC = ssl->options.haveECDSAsig; - #endif - } - else if (ctx) { - #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) - ctx->pkCurveOID = cert->pkCurveOID; - #endif - #ifndef WC_STRICT_SIG - if (cert->keyOID == ECDSAk) { - ctx->haveECC = 1; - } - #ifndef NO_RSA - else if (cert->keyOID == RSAk) { - ctx->haveRSA = 1; - } - #ifdef WC_RSA_PSS - else if (cert->keyOID == RSAPSSk) { - ctx->haveRSA = 1; - } - #endif - #endif - #ifdef HAVE_ED25519 - else if (cert->keyOID == ED25519k) { - ctx->haveECC = 1; - } - #endif - #ifdef HAVE_ED448 - else if (cert->keyOID == ED448k) { - ctx->haveECC = 1; - } - #endif - #ifdef HAVE_PQC - #ifdef HAVE_FALCON - else if (cert->keyOID == FALCON_LEVEL1k || - cert->keyOID == FALCON_LEVEL5k) { - ctx->haveFalconSig = 1; - } - #endif /* HAVE_FALCON */ - #ifdef HAVE_DILITHIUM - else if (cert->keyOID == DILITHIUM_LEVEL2k || - cert->keyOID == DILITHIUM_LEVEL3k || - cert->keyOID == DILITHIUM_LEVEL5k) { - ctx->haveDilithiumSig = 1; - } - #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ - #else - ctx->haveECC = ctx->haveECDSAsig; - #endif - } - #endif - - /* check key size of cert unless specified not to */ - switch (cert->keyOID) { - #ifndef NO_RSA - #ifdef WC_RSA_PSS - case RSAPSSk: - #endif - case RSAk: - #ifdef WOLF_PRIVATE_KEY_ID - keyType = rsa_sa_algo; - #endif - /* Determine RSA key size by parsing public key */ - idx = 0; - ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx, - cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL); - if (ret < 0) - break; - - if (ssl && !ssl->options.verifyNone) { - if (ssl->options.minRsaKeySz < 0 || - keySz < (int)ssl->options.minRsaKeySz || - keySz > (RSA_MAX_SIZE / 8)) { - ret = RSA_KEY_SIZE_E; - WOLFSSL_MSG("Certificate RSA key size too small"); - } - } - else if (ctx && !ctx->verifyNone) { - if (ctx->minRsaKeySz < 0 || - keySz < (int)ctx->minRsaKeySz || - keySz > (RSA_MAX_SIZE / 8)) { - ret = RSA_KEY_SIZE_E; - WOLFSSL_MSG("Certificate RSA key size too small"); - } - } - break; - #endif /* !NO_RSA */ - #ifdef HAVE_ECC - case ECDSAk: - #ifdef WOLF_PRIVATE_KEY_ID - keyType = ecc_dsa_sa_algo; - #endif - /* Determine ECC key size based on curve */ - keySz = wc_ecc_get_curve_size_from_id( - wc_ecc_get_oid(cert->pkCurveOID, NULL, NULL)); - - if (ssl && !ssl->options.verifyNone) { - if (ssl->options.minEccKeySz < 0 || - keySz < (int)ssl->options.minEccKeySz) { - ret = ECC_KEY_SIZE_E; - WOLFSSL_MSG("Certificate ECC key size error"); - } - } - else if (ctx && !ctx->verifyNone) { - if (ctx->minEccKeySz < 0 || - keySz < (int)ctx->minEccKeySz) { - ret = ECC_KEY_SIZE_E; - WOLFSSL_MSG("Certificate ECC key size error"); - } - } - break; - #endif /* HAVE_ECC */ - #ifdef HAVE_ED25519 - case ED25519k: - #ifdef WOLF_PRIVATE_KEY_ID - keyType = ed25519_sa_algo; - #endif - /* ED25519 is fixed key size */ - keySz = ED25519_KEY_SIZE; - if (ssl && !ssl->options.verifyNone) { - if (ssl->options.minEccKeySz < 0 || - keySz < (int)ssl->options.minEccKeySz) { - ret = ECC_KEY_SIZE_E; - WOLFSSL_MSG("Certificate Ed key size error"); - } - } - else if (ctx && !ctx->verifyNone) { - if (ctx->minEccKeySz < 0 || - keySz < (int)ctx->minEccKeySz) { - ret = ECC_KEY_SIZE_E; - WOLFSSL_MSG("Certificate ECC key size error"); - } - } - break; - #endif /* HAVE_ED25519 */ - #ifdef HAVE_ED448 - case ED448k: - #ifdef WOLF_PRIVATE_KEY_ID - keyType = ed448_sa_algo; - #endif - /* ED448 is fixed key size */ - keySz = ED448_KEY_SIZE; - if (ssl && !ssl->options.verifyNone) { - if (ssl->options.minEccKeySz < 0 || - keySz < (int)ssl->options.minEccKeySz) { - ret = ECC_KEY_SIZE_E; - WOLFSSL_MSG("Certificate Ed key size error"); - } - } - else if (ctx && !ctx->verifyNone) { - if (ctx->minEccKeySz < 0 || - keySz < (int)ctx->minEccKeySz) { - ret = ECC_KEY_SIZE_E; - WOLFSSL_MSG("Certificate ECC key size error"); - } - } - break; - #endif /* HAVE_ED448 */ - #if defined(HAVE_PQC) - #if defined(HAVE_FALCON) - case FALCON_LEVEL1k: - case FALCON_LEVEL5k: - /* Falcon is fixed key size */ - keySz = FALCON_MAX_KEY_SIZE; - if (ssl && !ssl->options.verifyNone) { - if (ssl->options.minFalconKeySz < 0 || - keySz < (int)ssl->options.minFalconKeySz) { - ret = FALCON_KEY_SIZE_E; - WOLFSSL_MSG("Certificate Falcon key size error"); - } - } - else if (ctx && !ctx->verifyNone) { - if (ctx->minFalconKeySz < 0 || - keySz < (int)ctx->minFalconKeySz) { - ret = FALCON_KEY_SIZE_E; - WOLFSSL_MSG("Certificate Falcon key size error"); - } - } - break; - #endif /* HAVE_FALCON */ - #if defined(HAVE_DILITHIUM) - case DILITHIUM_LEVEL2k: - case DILITHIUM_LEVEL3k: - case DILITHIUM_LEVEL5k: - /* Dilithium is fixed key size */ - keySz = DILITHIUM_MAX_KEY_SIZE; - if (ssl && !ssl->options.verifyNone) { - if (ssl->options.minDilithiumKeySz < 0 || - keySz < (int)ssl->options.minDilithiumKeySz) { - ret = DILITHIUM_KEY_SIZE_E; - WOLFSSL_MSG("Certificate Dilithium key size error"); - } - } - else if (ctx && !ctx->verifyNone) { - if (ctx->minDilithiumKeySz < 0 || - keySz < (int)ctx->minDilithiumKeySz) { - ret = DILITHIUM_KEY_SIZE_E; - WOLFSSL_MSG("Certificate Dilithium key size error"); - } - } - break; - #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ - - default: - WOLFSSL_MSG("No key size check done on certificate"); - break; /* do no check if not a case for the key */ - } - - #ifdef WOLF_PRIVATE_KEY_ID - if (ssl != NULL) { - ssl->buffers.keyType = keyType; - ssl->buffers.keySz = keySz; - } - else if (ctx != NULL) { - ctx->privateKeyType = keyType; - ctx->privateKeySz = keySz; - } - #endif - - FreeDecodedCert(cert); - #ifdef WOLFSSL_SMALL_STACK - XFREE(cert, heap, DYNAMIC_TYPE_DCERT); - #endif - - if (ret != 0) { - done = 1; - } - } - - if (done == 1) { - #if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \ - !defined(WOLFSSL_NO_CLIENT_AUTH)) - if ((type == CA_TYPE) || (type == CERT_TYPE)) { - /* Call to over-ride status */ - if ((ctx != NULL) && (ctx->cm != NULL) && - (ctx->cm->verifyCallback != NULL)) { - ret = CM_VerifyBuffer_ex(ctx->cm, buff, - sz, format, (ret == WOLFSSL_SUCCESS ? 0 : ret)); - } - } - #endif /* NO_WOLFSSL_CM_VERIFY */ - - return ret; - } - - - if (ssl && resetSuites) { - word16 havePSK = 0; - word16 haveRSA = 0; - - #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) - if (ssl->options.havePSK) { - havePSK = 1; - } - #endif - #ifndef NO_RSA - haveRSA = 1; - #endif - keySz = ssl->buffers.keySz; - - if (AllocateSuites(ssl) != 0) - return WOLFSSL_FAILURE; - /* let's reset suites */ - InitSuites(ssl->suites, ssl->version, keySz, haveRSA, - havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig, - ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, - ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); - } - else if (ctx && resetSuites) { - word16 havePSK = 0; - word16 haveRSA = 0; - - #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) - if (ctx->havePSK) { - havePSK = 1; - } - #endif - #ifndef NO_RSA - haveRSA = 1; - #endif - keySz = ctx->privateKeySz; - - if (AllocateCtxSuites(ctx) != 0) - return WOLFSSL_FAILURE; - /* let's reset suites */ - InitSuites(ctx->suites, ctx->method->version, keySz, haveRSA, - havePSK, ctx->haveDH, ctx->haveECDSAsig, - ctx->haveECC, TRUE, ctx->haveStaticECC, - ctx->haveFalconSig, ctx->haveDilithiumSig, -#ifdef HAVE_ANON - ctx->haveAnon, -#else - FALSE, -#endif - TRUE, ctx->method->side); + initRefCount = 1; /* Force cleanup */ } - return WOLFSSL_SUCCESS; -} - - -/* CA PEM file for verification, may have multiple/chain certs to process */ -static int ProcessChainBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff, - long sz, int format, int type, WOLFSSL* ssl, int verify) -{ - long used = 0; - int ret = 0; - int gotOne = 0; - - WOLFSSL_MSG("Processing CA PEM file"); - while (used < sz) { - long consumed = 0; - - ret = ProcessBuffer(ctx, buff + used, sz - used, format, type, ssl, - &consumed, 0, verify); - - if (ret == MEMORY_E) { - return ret; - } - else if (ret < 0) { -#if defined(WOLFSSL_WPAS) && defined(HAVE_CRL) - DerBuffer* der = NULL; - EncryptedInfo info; - - WOLFSSL_MSG("Trying a CRL"); - if (PemToDer(buff + used, sz - used, CRL_TYPE, &der, NULL, &info, - NULL) == 0) { - WOLFSSL_MSG(" Processed a CRL"); - wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer, - der->length, WOLFSSL_FILETYPE_ASN1); - FreeDer(&der); - used += info.consumed; - continue; - } -#endif + wc_UnLockMutex(&inits_count_mutex); - if (consumed > 0) { /* Made progress in file */ - WOLFSSL_ERROR(ret); - WOLFSSL_MSG("CA Parse failed, with progress in file."); - WOLFSSL_MSG("Search for other certs in file"); - } - else { - WOLFSSL_MSG("CA Parse failed, no progress in file."); - WOLFSSL_MSG("Do not continue search for other certs in file"); - break; - } - } - else { - WOLFSSL_MSG(" Processed a CA"); - gotOne = 1; - } - used += consumed; + if (ret != WOLFSSL_SUCCESS) { + (void)wolfSSL_Cleanup(); /* Ignore any error from cleanup */ } - if (gotOne) { - WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK"); - return WOLFSSL_SUCCESS; - } return ret; } -static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void) -{ - #ifndef NO_WOLFSSL_CLIENT - #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3) - return wolfSSLv3_client_method(); - #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10) - return wolfTLSv1_client_method(); - #elif !defined(NO_OLD_TLS) - return wolfTLSv1_1_client_method(); - #elif !defined(WOLFSSL_NO_TLS12) - return wolfTLSv1_2_client_method(); - #elif defined(WOLFSSL_TLS13) - return wolfTLSv1_3_client_method(); - #else - return NULL; - #endif - #elif !defined(NO_WOLFSSL_SERVER) - #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3) - return wolfSSLv3_server_method(); - #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10) - return wolfTLSv1_server_method(); - #elif !defined(NO_OLD_TLS) - return wolfTLSv1_1_server_method(); - #elif !defined(WOLFSSL_NO_TLS12) - return wolfTLSv1_2_server_method(); - #elif defined(WOLFSSL_TLS13) - return wolfTLSv1_3_server_method(); - #else - return NULL; - #endif - #else - return NULL; - #endif -} +#define WOLFSSL_SSL_LOAD_INCLUDED +#include - -int wolfSSL_CertManagerLoadCABuffer_ex(WOLFSSL_CERT_MANAGER* cm, - const unsigned char* in, long sz, - int format, int userChain, word32 flags) -{ - int ret = WOLFSSL_FATAL_ERROR; - WOLFSSL_CTX* tmp; - - WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer_ex"); - - if (cm == NULL) { - WOLFSSL_MSG("No CertManager error"); - return ret; - } - tmp = wolfSSL_CTX_new(cm_pick_method()); - - if (tmp == NULL) { - WOLFSSL_MSG("CTX new failed"); - return ret; - } - - /* for tmp use */ - wolfSSL_CertManagerFree(tmp->cm); - tmp->cm = cm; - - ret = wolfSSL_CTX_load_verify_buffer_ex(tmp, in, sz, format, - userChain, flags); - - /* don't loose our good one */ - tmp->cm = NULL; - wolfSSL_CTX_free(tmp); - - return ret; -} - -/* like load verify locations, 1 for success, < 0 for error */ -int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm, - const unsigned char* in, long sz, - int format) -{ - return wolfSSL_CertManagerLoadCABuffer_ex(cm, in, sz, format, 0, - WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); -} +#ifndef NO_CERTS #ifdef HAVE_CRL -int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm, - const unsigned char* buff, long sz, int type) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer"); - if (cm == NULL) - return BAD_FUNC_ARG; - - if (cm->crl == NULL) { - if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Enable CRL failed"); - return WOLFSSL_FATAL_ERROR; - } - } - - return BufferLoadCRL(cm->crl, buff, sz, type, VERIFY); -} - -int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL"); - if (cm == NULL) - return BAD_FUNC_ARG; - if (cm->crl != NULL){ - FreeCRL(cm->crl, 1); - cm->crl = NULL; - } - return WOLFSSL_SUCCESS; -} - int wolfSSL_CTX_LoadCRLBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff, long sz, int type) { @@ -8191,443 +5711,20 @@ if (ssl == NULL || ssl->ctx == NULL) return BAD_FUNC_ARG; + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerLoadCRLBuffer(SSL_CM(ssl), buff, sz, type); } - #endif /* HAVE_CRL */ -/* turn on CRL if off and compiled in, set options */ -int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options) -{ - int ret = WOLFSSL_SUCCESS; - - (void)options; - - WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL"); - if (cm == NULL) - return BAD_FUNC_ARG; - - #ifdef HAVE_CRL - if (cm->crl == NULL) { - cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap, - DYNAMIC_TYPE_CRL); - if (cm->crl == NULL) - return MEMORY_E; - - if (InitCRL(cm->crl, cm) != 0) { - WOLFSSL_MSG("Init CRL failed"); - FreeCRL(cm->crl, 1); - cm->crl = NULL; - return WOLFSSL_FAILURE; - } - - #if defined(HAVE_CRL_IO) && defined(USE_WOLFSSL_IO) - cm->crl->crlIOCb = EmbedCrlLookup; - #endif - } - - cm->crlEnabled = 1; - if (options & WOLFSSL_CRL_CHECKALL) - cm->crlCheckAll = 1; - #else - ret = NOT_COMPILED_IN; - #endif - - return ret; -} - - -int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL"); - if (cm == NULL) - return BAD_FUNC_ARG; - - cm->crlEnabled = 0; - - return WOLFSSL_SUCCESS; -} - -#ifndef NO_WOLFSSL_CM_VERIFY -void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify"); - if (cm == NULL) - return; - - cm->verifyCallback = vc; -} -#endif /* NO_WOLFSSL_CM_VERIFY */ - -#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) -/* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */ -int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff, - long sz, int format, int err_val) -{ - int ret = 0; - DerBuffer* der = NULL; -#ifdef WOLFSSL_SMALL_STACK - DecodedCert* cert; -#else - DecodedCert cert[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer"); - -#ifdef WOLFSSL_SMALL_STACK - cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, - DYNAMIC_TYPE_DCERT); - if (cert == NULL) - return MEMORY_E; -#endif - - if (format == WOLFSSL_FILETYPE_PEM) { -#ifdef WOLFSSL_PEM_TO_DER - ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL); - if (ret != 0) { - FreeDer(&der); - #ifdef WOLFSSL_SMALL_STACK - XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT); - #endif - return ret; - } - InitDecodedCert(cert, der->buffer, der->length, cm->heap); -#else - ret = NOT_COMPILED_IN; -#endif - } - else { - InitDecodedCert(cert, buff, (word32)sz, cm->heap); - } - - if (ret == 0) - ret = ParseCertRelative(cert, CERT_TYPE, 1, cm); - -#ifdef HAVE_CRL - if (ret == 0 && cm->crlEnabled) - ret = CheckCertCRL(cm->crl, cert); -#endif - -#ifndef NO_WOLFSSL_CM_VERIFY - /* if verify callback has been set */ - if (cm->verifyCallback) { - buffer certBuf; - #ifdef WOLFSSL_SMALL_STACK - ProcPeerCertArgs* args; - args = (ProcPeerCertArgs*)XMALLOC( - sizeof(ProcPeerCertArgs), cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (args == NULL) { - XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT); - return MEMORY_E; - } - #else - ProcPeerCertArgs args[1]; - #endif - - certBuf.buffer = (byte*)buff; - certBuf.length = (unsigned int)sz; - XMEMSET(args, 0, sizeof(ProcPeerCertArgs)); - - args->totalCerts = 1; - args->certs = &certBuf; - args->dCert = cert; - args->dCertInit = 1; - - if (err_val != 0) { - ret = err_val; - } - ret = DoVerifyCallback(cm, NULL, ret, args); - #ifdef WOLFSSL_SMALL_STACK - XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - #endif - } -#else - (void)err_val; -#endif - - FreeDecodedCert(cert); - FreeDer(&der); -#ifdef WOLFSSL_SMALL_STACK - XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT); -#endif - - return ret == 0 ? WOLFSSL_SUCCESS : ret; -} - -/* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */ -int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, const byte* buff, - long sz, int format) -{ - return CM_VerifyBuffer_ex(cm, buff, sz, format, 0); -} -#endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */ - -/* turn on OCSP if off and compiled in, set options */ -int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options) -{ - int ret = WOLFSSL_SUCCESS; - - (void)options; - - WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP"); - if (cm == NULL) - return BAD_FUNC_ARG; - - #ifdef HAVE_OCSP - if (cm->ocsp == NULL) { - cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap, - DYNAMIC_TYPE_OCSP); - if (cm->ocsp == NULL) - return MEMORY_E; - - if (InitOCSP(cm->ocsp, cm) != 0) { - WOLFSSL_MSG("Init OCSP failed"); - FreeOCSP(cm->ocsp, 1); - cm->ocsp = NULL; - return WOLFSSL_FAILURE; - } - } - cm->ocspEnabled = 1; - if (options & WOLFSSL_OCSP_URL_OVERRIDE) - cm->ocspUseOverrideURL = 1; - if (options & WOLFSSL_OCSP_NO_NONCE) - cm->ocspSendNonce = 0; - else - cm->ocspSendNonce = 1; - if (options & WOLFSSL_OCSP_CHECKALL) - cm->ocspCheckAll = 1; - #ifndef WOLFSSL_USER_IO - cm->ocspIOCb = EmbedOcspLookup; - cm->ocspRespFreeCb = EmbedOcspRespFree; - cm->ocspIOCtx = cm->heap; - #endif /* WOLFSSL_USER_IO */ - #else - ret = NOT_COMPILED_IN; - #endif - - return ret; -} - - -int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP"); - if (cm == NULL) - return BAD_FUNC_ARG; - - cm->ocspEnabled = 0; - - return WOLFSSL_SUCCESS; -} - -/* turn on OCSP Stapling if off and compiled in, set options */ -int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm) -{ - int ret = WOLFSSL_SUCCESS; - - WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling"); - - if (cm == NULL) - return BAD_FUNC_ARG; - -#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ - || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) - #ifndef NO_WOLFSSL_SERVER - if (cm->ocsp_stapling == NULL) { - cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), - cm->heap, DYNAMIC_TYPE_OCSP); - if (cm->ocsp_stapling == NULL) - return MEMORY_E; - - if (InitOCSP(cm->ocsp_stapling, cm) != 0) { - WOLFSSL_MSG("Init OCSP failed"); - FreeOCSP(cm->ocsp_stapling, 1); - cm->ocsp_stapling = NULL; - return WOLFSSL_FAILURE; - } - } - - #ifndef WOLFSSL_USER_IO - cm->ocspIOCb = EmbedOcspLookup; - cm->ocspRespFreeCb = EmbedOcspRespFree; - cm->ocspIOCtx = cm->heap; - #endif /* WOLFSSL_USER_IO */ - #endif /* NO_WOLFSSL_SERVER */ - cm->ocspStaplingEnabled = 1; -#else - ret = NOT_COMPILED_IN; -#endif - - return ret; -} - -int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm) -{ - int ret = WOLFSSL_SUCCESS; - - WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling"); - - if (cm == NULL) - return BAD_FUNC_ARG; - -#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ - || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) - cm->ocspStaplingEnabled = 0; -#else - ret = NOT_COMPILED_IN; -#endif - return ret; -} - -/* require OCSP stapling response */ -int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm) -{ - int ret; - - WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple"); - - if (cm == NULL) - return BAD_FUNC_ARG; - -#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ - || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) - #ifndef NO_WOLFSSL_CLIENT - cm->ocspMustStaple = 1; - #endif - ret = WOLFSSL_SUCCESS; -#else - ret = NOT_COMPILED_IN; -#endif - - return ret; -} - -int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm) -{ - int ret; - - WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple"); - - if (cm == NULL) - return BAD_FUNC_ARG; - -#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ - || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) - #ifndef NO_WOLFSSL_CLIENT - cm->ocspMustStaple = 0; - #endif - ret = WOLFSSL_SUCCESS; -#else - ret = NOT_COMPILED_IN; -#endif - return ret; -} - #ifdef HAVE_OCSP -/* check CRL if enabled, WOLFSSL_SUCCESS */ -int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz) -{ - int ret; -#ifdef WOLFSSL_SMALL_STACK - DecodedCert* cert = NULL; -#else - DecodedCert cert[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP"); - - if (cm == NULL) - return BAD_FUNC_ARG; - - if (cm->ocspEnabled == 0) - return WOLFSSL_SUCCESS; - -#ifdef WOLFSSL_SMALL_STACK - cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, DYNAMIC_TYPE_DCERT); - if (cert == NULL) - return MEMORY_E; -#endif - - InitDecodedCert(cert, der, sz, NULL); - - if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm)) != 0) { - WOLFSSL_MSG("ParseCert failed"); - } - else if ((ret = CheckCertOCSP(cm->ocsp, cert, NULL)) != 0) { - WOLFSSL_MSG("CheckCertOCSP failed"); - } - - FreeDecodedCert(cert); -#ifdef WOLFSSL_SMALL_STACK - XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT); -#endif - - return ret == 0 ? WOLFSSL_SUCCESS : ret; -} - -int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm, - byte *response, int responseSz, buffer *responseBuffer, - CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest) -{ - int ret; - - WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSPResponse"); - if (cm == NULL || response == NULL) - return BAD_FUNC_ARG; - if (cm->ocspEnabled == 0) - return WOLFSSL_SUCCESS; - - ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, status, - entry, ocspRequest); - - return ret == 0 ? WOLFSSL_SUCCESS : ret; -} - -int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm, - const char* url) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL"); - if (cm == NULL) - return BAD_FUNC_ARG; - - XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL); - if (url != NULL) { - int urlSz = (int)XSTRLEN(url) + 1; - cm->ocspOverrideURL = (char*)XMALLOC(urlSz, cm->heap, DYNAMIC_TYPE_URL); - if (cm->ocspOverrideURL != NULL) { - XMEMCPY(cm->ocspOverrideURL, url, urlSz); - } - else - return MEMORY_E; - } - else - cm->ocspOverrideURL = NULL; - - return WOLFSSL_SUCCESS; -} - - -int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm, - CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb"); - if (cm == NULL) - return BAD_FUNC_ARG; - - cm->ocspIOCb = ioCb; - cm->ocspRespFreeCb = respFreeCb; - cm->ocspIOCtx = ioCbCtx; - - return WOLFSSL_SUCCESS; -} - - int wolfSSL_EnableOCSP(WOLFSSL* ssl, int options) { WOLFSSL_ENTER("wolfSSL_EnableOCSP"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerEnableOCSP(SSL_CM(ssl), options); + } else return BAD_FUNC_ARG; } @@ -8635,8 +5732,10 @@ int wolfSSL_DisableOCSP(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_DisableOCSP"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerDisableOCSP(SSL_CM(ssl)); + } else return BAD_FUNC_ARG; } @@ -8645,8 +5744,10 @@ int wolfSSL_EnableOCSPStapling(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_EnableOCSPStapling"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerEnableOCSPStapling(SSL_CM(ssl)); + } else return BAD_FUNC_ARG; } @@ -8654,8 +5755,10 @@ int wolfSSL_DisableOCSPStapling(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_DisableOCSPStapling"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerDisableOCSPStapling(SSL_CM(ssl)); + } else return BAD_FUNC_ARG; } @@ -8663,8 +5766,10 @@ int wolfSSL_SetOCSP_OverrideURL(WOLFSSL* ssl, const char* url) { WOLFSSL_ENTER("wolfSSL_SetOCSP_OverrideURL"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerSetOCSPOverrideURL(SSL_CM(ssl), url); + } else return BAD_FUNC_ARG; } @@ -8675,6 +5780,7 @@ { WOLFSSL_ENTER("wolfSSL_SetOCSP_Cb"); if (ssl) { + SSL_CM_WARNING(ssl); ssl->ocspIOCtx = ioCbCtx; /* use SSL specific ioCbCtx */ return wolfSSL_CertManagerSetOCSP_Cb(SSL_CM(ssl), ioCb, respFreeCb, NULL); @@ -8683,7 +5789,6 @@ return BAD_FUNC_ARG; } - int wolfSSL_CTX_EnableOCSP(WOLFSSL_CTX* ctx, int options) { WOLFSSL_ENTER("wolfSSL_CTX_EnableOCSP"); @@ -8762,706 +5867,20 @@ else return BAD_FUNC_ARG; } -#endif /* HAVE_CERTIFICATE_STATUS_REQUEST || HAVE_CERTIFICATE_STATUS_REQUEST_V2 */ +#endif /* HAVE_CERTIFICATE_STATUS_REQUEST || \ + * HAVE_CERTIFICATE_STATUS_REQUEST_V2 */ #endif /* HAVE_OCSP */ -/* macro to get verify settings for AddCA */ -#define GET_VERIFY_SETTING_CTX(ctx) \ - ((ctx) && (ctx)->verifyNone ? NO_VERIFY : VERIFY) -#define GET_VERIFY_SETTING_SSL(ssl) \ - ((ssl)->options.verifyNone ? NO_VERIFY : VERIFY) - -#ifndef NO_FILESYSTEM - -/* process a file with name fname into ctx of format and type - userChain specifies a user certificate chain to pass during handshake */ -int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type, - WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify) -{ -#ifdef WOLFSSL_SMALL_STACK - byte staticBuffer[1]; /* force heap usage */ -#else - byte staticBuffer[FILE_BUFFER_SIZE]; -#endif - byte* myBuffer = staticBuffer; - int dynamic = 0; - int ret; - long sz = 0; - XFILE file; - void* heapHint = wolfSSL_CTX_GetHeap(ctx, ssl); -#ifndef NO_CODING - const char* header = NULL; - const char* footer = NULL; -#endif - - (void)crl; - (void)heapHint; - - if (fname == NULL) return WOLFSSL_BAD_FILE; - - file = XFOPEN(fname, "rb"); - if (file == XBADFILE) return WOLFSSL_BAD_FILE; - if (XFSEEK(file, 0, XSEEK_END) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - sz = XFTELL(file); - if (XFSEEK(file, 0, XSEEK_SET) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - - if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) { - WOLFSSL_MSG("ProcessFile file size error"); - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - - if (sz > (long)sizeof(staticBuffer)) { - WOLFSSL_MSG("Getting dynamic buffer"); - myBuffer = (byte*)XMALLOC(sz, heapHint, DYNAMIC_TYPE_FILE); - if (myBuffer == NULL) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - dynamic = 1; - } - - if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz) - ret = WOLFSSL_BAD_FILE; - else { - /* Try to detect type by parsing cert header and footer */ - if (type == DETECT_CERT_TYPE) { -#ifndef NO_CODING - if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 && - (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) { - type = CA_TYPE; - } -#ifdef HAVE_CRL - else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 && - (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) { - type = CRL_TYPE; - } -#endif - else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 && - (XSTRNSTR((char*)myBuffer, header, (int)sz) != NULL)) { - type = CERT_TYPE; - } - else -#endif - { - WOLFSSL_MSG("Failed to detect certificate type"); - if (dynamic) - XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE); - XFCLOSE(file); - return WOLFSSL_BAD_CERTTYPE; - } - } - if ((type == CA_TYPE || type == TRUSTED_PEER_TYPE) - && format == WOLFSSL_FILETYPE_PEM) { - ret = ProcessChainBuffer(ctx, myBuffer, sz, format, type, ssl, - verify); - } -#ifdef HAVE_CRL - else if (type == CRL_TYPE) - ret = BufferLoadCRL(crl, myBuffer, sz, format, verify); -#endif - else - ret = ProcessBuffer(ctx, myBuffer, sz, format, type, ssl, NULL, - userChain, verify); - } - - XFCLOSE(file); - if (dynamic) - XFREE(myBuffer, heapHint, DYNAMIC_TYPE_FILE); - - return ret; -} - -/* loads file then loads each file in path, no c_rehash */ -int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file, - const char* path, word32 flags) -{ - int ret = WOLFSSL_SUCCESS; -#ifndef NO_WOLFSSL_DIR - int successCount = 0; -#endif - int verify; - - WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex"); - - if (ctx == NULL || (file == NULL && path == NULL)) { - return WOLFSSL_FAILURE; - } - - verify = GET_VERIFY_SETTING_CTX(ctx); - if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY) - verify = VERIFY_SKIP_DATE; - - if (file) { - ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0, - NULL, verify); -#ifndef NO_WOLFSSL_DIR - if (ret == WOLFSSL_SUCCESS) - successCount++; -#endif -#if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS) - ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM); - if (ret != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error"); - } -#endif - } - - if (ret == WOLFSSL_SUCCESS && path) { -#ifndef NO_WOLFSSL_DIR - char* name = NULL; - int fileRet; - int failCount = 0; - #ifdef WOLFSSL_SMALL_STACK - ReadDirCtx* readCtx; - readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap, - DYNAMIC_TYPE_DIRCTX); - if (readCtx == NULL) - return MEMORY_E; - #else - ReadDirCtx readCtx[1]; - #endif - - /* try to load each regular file in path */ - fileRet = wc_ReadDirFirst(readCtx, path, &name); - while (fileRet == 0 && name) { - WOLFSSL_MSG(name); /* log file name */ - ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE, - NULL, 0, NULL, verify); - if (ret != WOLFSSL_SUCCESS) { - /* handle flags for ignoring errors, skipping expired certs or - by PEM certificate header error */ - if ( (flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) || - ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) && - (ret == ASN_NO_PEM_HEADER))) { - /* Do not fail here if a certificate fails to load, - continue to next file */ - unsigned long err = 0; - CLEAR_ASN_NO_PEM_HEADER_ERROR(err); - #if defined(WOLFSSL_QT) - ret = WOLFSSL_SUCCESS; - #endif - } - else { - WOLFSSL_ERROR(ret); - WOLFSSL_MSG("Load CA file failed, continuing"); - failCount++; - } - } - else { - #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS) - ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM); - if (ret != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error. Ignoring" - "this error."); - } - #endif - successCount++; - } - fileRet = wc_ReadDirNext(readCtx, path, &name); - } - wc_ReadDirClose(readCtx); - - /* pass directory read failure to response code */ - if (fileRet != WC_READDIR_NOFILE) { - ret = fileRet; - #if defined(WOLFSSL_QT) - if (ret == BAD_PATH_ERROR && - flags & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR) { - /* QSslSocket always loads certs in system folder - * when it is initialized. - * Compliant with OpenSSL when flag sets. - */ - ret = WOLFSSL_SUCCESS; - } - else { - /* qssl socket wants to know errors. */ - WOLFSSL_ERROR(ret); - } - #endif - } - /* report failure if no files were loaded or there were failures */ - else if (successCount == 0 || failCount > 0) { - /* use existing error code if exists */ - #if defined(WOLFSSL_QT) - /* compliant with OpenSSL when flag sets*/ - if (!(flags & WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE)) - #endif - { - ret = WOLFSSL_FAILURE; - } - } - else { - ret = WOLFSSL_SUCCESS; - } - - #ifdef WOLFSSL_SMALL_STACK - XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX); - #endif -#else - ret = NOT_COMPILED_IN; - (void)flags; -#endif - } - - return ret; -} - -WOLFSSL_ABI -int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, - const char* path) -{ - int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path, - WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); - - return WS_RETURN_CODE(ret,WOLFSSL_FAILURE); -} - -#ifdef WOLFSSL_SYS_CA_CERTS - -#ifdef USE_WINDOWS_API - -static int LoadSystemCaCertsWindows(WOLFSSL_CTX* ctx, byte* loaded) -{ - int ret = WOLFSSL_SUCCESS; - word32 i; - HANDLE handle = NULL; - PCCERT_CONTEXT certCtx = NULL; - LPCSTR storeNames[2] = {"ROOT", "CA"}; - HCRYPTPROV_LEGACY hProv = (HCRYPTPROV_LEGACY)NULL; - - if (ctx == NULL || loaded == NULL) { - ret = WOLFSSL_FAILURE; - } - - for (i = 0; ret == WOLFSSL_SUCCESS && - i < sizeof(storeNames)/sizeof(*storeNames); ++i) { - handle = CertOpenSystemStoreA(hProv, storeNames[i]); - if (handle != NULL) { - while ((certCtx = CertEnumCertificatesInStore(handle, certCtx)) - != NULL) { - if (certCtx->dwCertEncodingType == X509_ASN_ENCODING) { - if (ProcessBuffer(ctx, certCtx->pbCertEncoded, - certCtx->cbCertEncoded, WOLFSSL_FILETYPE_ASN1, - CA_TYPE, NULL, NULL, 0, - GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) { - /* - * Set "loaded" as long as we've loaded one CA - * cert. - */ - *loaded = 1; - } - } - } - } - else { - WOLFSSL_MSG_EX("Failed to open cert store %s.", storeNames[i]); - } - - if (handle != NULL && !CertCloseStore(handle, 0)) { - WOLFSSL_MSG_EX("Failed to close cert store %s.", storeNames[i]); - ret = WOLFSSL_FAILURE; - } - } - - return ret; -} - -#elif defined(__APPLE__) - -static int LoadSystemCaCertsMac(WOLFSSL_CTX* ctx, byte* loaded) -{ - int ret = WOLFSSL_SUCCESS; - word32 i; - const unsigned int trustDomains[] = { - kSecTrustSettingsDomainUser, - kSecTrustSettingsDomainAdmin, - kSecTrustSettingsDomainSystem - }; - CFArrayRef certs; - OSStatus stat; - CFIndex numCerts; - CFDataRef der; - CFIndex j; - - if (ctx == NULL || loaded == NULL) { - ret = WOLFSSL_FAILURE; - } - - for (i = 0; ret == WOLFSSL_SUCCESS && - i < sizeof(trustDomains)/sizeof(*trustDomains); ++i) { - stat = SecTrustSettingsCopyCertificates( - (SecTrustSettingsDomain)trustDomains[i], &certs); - if (stat == errSecSuccess) { - numCerts = CFArrayGetCount(certs); - for (j = 0; j < numCerts; ++j) { - der = SecCertificateCopyData((SecCertificateRef) - CFArrayGetValueAtIndex(certs, j)); - if (der != NULL) { - if (ProcessBuffer(ctx, CFDataGetBytePtr(der), - CFDataGetLength(der), WOLFSSL_FILETYPE_ASN1, - CA_TYPE, NULL, NULL, 0, - GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) { - /* - * Set "loaded" as long as we've loaded one CA - * cert. - */ - *loaded = 1; - } - - CFRelease(der); - } - } - - CFRelease(certs); - } - else if (stat == errSecNoTrustSettings) { - WOLFSSL_MSG_EX("No trust settings for domain %d, moving to next " - "domain.", trustDomains[i]); - } - else { - WOLFSSL_MSG_EX("SecTrustSettingsCopyCertificates failed with" - " status %d.", stat); - ret = WOLFSSL_FAILURE; - break; - } - } - - return ret; -} - -#else - -/* Potential system CA certs directories on Linux/Unix distros. */ -static const char* systemCaDirs[] = { -#if defined(__ANDROID__) || defined(ANDROID) - "/system/etc/security/cacerts" /* Android */ -#else - "/etc/ssl/certs", /* Debian, Ubuntu, Gentoo, others */ - "/etc/pki/ca-trust/source/anchors", /* Fedora, RHEL */ - "/etc/pki/tls/certs" /* Older RHEL */ -#endif -}; - -const char** wolfSSL_get_system_CA_dirs(word32* num) -{ - const char** ret; - - if (num == NULL) { - ret = NULL; - } - else { - ret = systemCaDirs; - *num = sizeof(systemCaDirs)/sizeof(*systemCaDirs); - } - - return ret; -} - -static int LoadSystemCaCertsNix(WOLFSSL_CTX* ctx, byte* loaded) { - int ret = WOLFSSL_SUCCESS; - word32 i; - - if (ctx == NULL || loaded == NULL) { - ret = WOLFSSL_FAILURE; - } - - for (i = 0; ret == WOLFSSL_SUCCESS && - i < sizeof(systemCaDirs)/sizeof(*systemCaDirs); ++i) { - WOLFSSL_MSG_EX("Attempting to load system CA certs from %s.", - systemCaDirs[i]); - /* - * We want to keep trying to load more CAs even if one cert in - * the directory is bad and can't be used (e.g. if one is expired), - * so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR. - */ - if (wolfSSL_CTX_load_verify_locations_ex(ctx, NULL, systemCaDirs[i], - WOLFSSL_LOAD_FLAG_IGNORE_ERR) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG_EX("Failed to load CA certs from %s, trying " - "next possible location.", systemCaDirs[i]); - } - else { - WOLFSSL_MSG_EX("Loaded CA certs from %s.", - systemCaDirs[i]); - *loaded = 1; - /* Stop searching after we've loaded one directory. */ - break; - } - } - - return ret; -} - -#endif - -int wolfSSL_CTX_load_system_CA_certs(WOLFSSL_CTX* ctx) -{ - int ret; - byte loaded = 0; - - WOLFSSL_ENTER("wolfSSL_CTX_load_system_CA_certs"); - -#ifdef USE_WINDOWS_API - ret = LoadSystemCaCertsWindows(ctx, &loaded); -#elif defined(__APPLE__) - ret = LoadSystemCaCertsMac(ctx, &loaded); -#else - ret = LoadSystemCaCertsNix(ctx, &loaded); -#endif - - if (ret == WOLFSSL_SUCCESS && !loaded) { - ret = WOLFSSL_BAD_PATH; - } - - WOLFSSL_LEAVE("wolfSSL_CTX_load_system_CA_certs", ret); - - return ret; -} - -#endif /* WOLFSSL_SYS_CA_CERTS */ - -#ifdef WOLFSSL_TRUST_PEER_CERT -/* Used to specify a peer cert to match when connecting - ctx : the ctx structure to load in peer cert - file: the string name of cert file - type: type of format such as PEM/DER - */ -int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int type) -{ - WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert"); - - if (ctx == NULL || file == NULL) { - return WOLFSSL_FAILURE; - } - - return ProcessFile(ctx, file, type, TRUSTED_PEER_TYPE, NULL, 0, NULL, - GET_VERIFY_SETTING_CTX(ctx)); -} - -int wolfSSL_trust_peer_cert(WOLFSSL* ssl, const char* file, int type) -{ - WOLFSSL_ENTER("wolfSSL_trust_peer_cert"); - - if (ssl == NULL || file == NULL) { - return WOLFSSL_FAILURE; - } - - return ProcessFile(NULL, file, type, TRUSTED_PEER_TYPE, ssl, 0, NULL, - GET_VERIFY_SETTING_SSL(ssl)); -} -#endif /* WOLFSSL_TRUST_PEER_CERT */ - - -#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) -/* Verify the certificate, WOLFSSL_SUCCESS for ok, < 0 for error */ -int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname, - int format) -{ - int ret = WOLFSSL_FATAL_ERROR; -#ifdef WOLFSSL_SMALL_STACK - byte staticBuffer[1]; /* force heap usage */ -#else - byte staticBuffer[FILE_BUFFER_SIZE]; -#endif - byte* myBuffer = staticBuffer; - int dynamic = 0; - long sz = 0; - XFILE file = XFOPEN(fname, "rb"); - - WOLFSSL_ENTER("wolfSSL_CertManagerVerify"); - - if (file == XBADFILE) return WOLFSSL_BAD_FILE; - if(XFSEEK(file, 0, XSEEK_END) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - sz = XFTELL(file); - if(XFSEEK(file, 0, XSEEK_SET) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - - if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) { - WOLFSSL_MSG("CertManagerVerify file size error"); - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - - if (sz > (long)sizeof(staticBuffer)) { - WOLFSSL_MSG("Getting dynamic buffer"); - myBuffer = (byte*) XMALLOC(sz, cm->heap, DYNAMIC_TYPE_FILE); - if (myBuffer == NULL) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - dynamic = 1; - } - - if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz) - ret = WOLFSSL_BAD_FILE; - else - ret = wolfSSL_CertManagerVerifyBuffer(cm, myBuffer, sz, format); - - XFCLOSE(file); - if (dynamic) - XFREE(myBuffer, cm->heap, DYNAMIC_TYPE_FILE); - - return ret; -} -#endif - -/* like load verify locations, 1 for success, < 0 for error */ -int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file, - const char* path) -{ - int ret = WOLFSSL_FATAL_ERROR; - WOLFSSL_CTX* tmp; - - WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA"); - - if (cm == NULL) { - WOLFSSL_MSG("No CertManager error"); - return ret; - } - tmp = wolfSSL_CTX_new(cm_pick_method()); - - if (tmp == NULL) { - WOLFSSL_MSG("CTX new failed"); - return ret; - } - - /* for tmp use */ - wolfSSL_CertManagerFree(tmp->cm); - tmp->cm = cm; - - ret = wolfSSL_CTX_load_verify_locations(tmp, file, path); - - /* don't lose our good one */ - tmp->cm = NULL; - wolfSSL_CTX_free(tmp); - - return ret; -} - - -#endif /* NO_FILESYSTEM */ - #ifdef HAVE_CRL -/* check CRL if enabled, WOLFSSL_SUCCESS */ -int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, byte* der, int sz) -{ - int ret = 0; -#ifdef WOLFSSL_SMALL_STACK - DecodedCert* cert = NULL; -#else - DecodedCert cert[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL"); - - if (cm == NULL) - return BAD_FUNC_ARG; - - if (cm->crlEnabled == 0) - return WOLFSSL_SUCCESS; - -#ifdef WOLFSSL_SMALL_STACK - cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT); - if (cert == NULL) - return MEMORY_E; -#endif - - InitDecodedCert(cert, der, sz, NULL); - - if ((ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm)) != 0) { - WOLFSSL_MSG("ParseCert failed"); - } - else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) { - WOLFSSL_MSG("CheckCertCRL failed"); - } - - FreeDecodedCert(cert); -#ifdef WOLFSSL_SMALL_STACK - XFREE(cert, NULL, DYNAMIC_TYPE_DCERT); -#endif - - return ret == 0 ? WOLFSSL_SUCCESS : ret; -} - - -int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb"); - if (cm == NULL) - return BAD_FUNC_ARG; - - cm->cbMissingCRL = cb; - - return WOLFSSL_SUCCESS; -} - -#ifdef HAVE_CRL_IO -int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb) -{ - if (cm == NULL) - return BAD_FUNC_ARG; - - cm->crl->crlIOCb = cb; - - return WOLFSSL_SUCCESS; -} -#endif - -#ifndef NO_FILESYSTEM -int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path, - int type, int monitor) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL"); - if (cm == NULL) - return BAD_FUNC_ARG; - - if (cm->crl == NULL) { - if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Enable CRL failed"); - return WOLFSSL_FATAL_ERROR; - } - } - - return LoadCRL(cm->crl, path, type, monitor); -} - -int wolfSSL_CertManagerLoadCRLFile(WOLFSSL_CERT_MANAGER* cm, const char* file, - int type) -{ - WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLFile"); - if (cm == NULL || file == NULL) - return BAD_FUNC_ARG; - - if (cm->crl == NULL) { - if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Enable CRL failed"); - return WOLFSSL_FATAL_ERROR; - } - } - - return ProcessFile(NULL, file, type, CRL_TYPE, NULL, 0, cm->crl, - VERIFY); -} -#endif - int wolfSSL_EnableCRL(WOLFSSL* ssl, int options) { WOLFSSL_ENTER("wolfSSL_EnableCRL"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerEnableCRL(SSL_CM(ssl), options); + } else return BAD_FUNC_ARG; } @@ -9470,8 +5889,10 @@ int wolfSSL_DisableCRL(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_DisableCRL"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerDisableCRL(SSL_CM(ssl)); + } else return BAD_FUNC_ARG; } @@ -9480,28 +5901,33 @@ int wolfSSL_LoadCRL(WOLFSSL* ssl, const char* path, int type, int monitor) { WOLFSSL_ENTER("wolfSSL_LoadCRL"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerLoadCRL(SSL_CM(ssl), path, type, monitor); + } else return BAD_FUNC_ARG; } int wolfSSL_LoadCRLFile(WOLFSSL* ssl, const char* file, int type) { - WOLFSSL_ENTER("wolfSSL_LoadCRL"); - if (ssl) + WOLFSSL_ENTER("wolfSSL_LoadCRLFile"); + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerLoadCRLFile(SSL_CM(ssl), file, type); + } else return BAD_FUNC_ARG; } #endif - int wolfSSL_SetCRL_Cb(WOLFSSL* ssl, CbMissingCRL cb) { WOLFSSL_ENTER("wolfSSL_SetCRL_Cb"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerSetCRL_Cb(SSL_CM(ssl), cb); + } else return BAD_FUNC_ARG; } @@ -9510,8 +5936,10 @@ int wolfSSL_SetCRL_IOCb(WOLFSSL* ssl, CbCrlIO cb) { WOLFSSL_ENTER("wolfSSL_SetCRL_Cb"); - if (ssl) + if (ssl) { + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerSetCRL_IOCb(SSL_CM(ssl), cb); + } else return BAD_FUNC_ARG; } @@ -9584,64 +6012,6 @@ #endif /* HAVE_CRL */ -#ifndef NO_FILESYSTEM - - -#ifdef WOLFSSL_DER_LOAD - -/* Add format parameter to allow DER load of CA files */ -int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, - int format) -{ - WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations"); - if (ctx == NULL || file == NULL) - return WOLFSSL_FAILURE; - - if (ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL, - GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; - } - - return WOLFSSL_FAILURE; -} - -#endif /* WOLFSSL_DER_LOAD */ - - - -WOLFSSL_ABI -int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file, - int format) -{ - WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file"); - - if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL, - GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; - } - - return WOLFSSL_FAILURE; -} - - -WOLFSSL_ABI -int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file, - int format) -{ - WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file"); - - if (ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL, - GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; - } - - return WOLFSSL_FAILURE; -} - - -#endif /* NO_FILESYSTEM */ - - /* Sets the max chain depth when verifying a certificate chain. Default depth * is set to MAX_CHAIN_DEPTH. * @@ -9687,131 +6057,135 @@ #endif } +#ifndef NO_CHECK_PRIVATE_KEY -#ifndef NO_FILESYSTEM - - -WOLFSSL_ABI -int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file) +#ifdef WOLF_PRIVATE_KEY_ID +/* Check private against public in certificate for match using external + * device with given devId */ +static int check_cert_key_dev(word32 keyOID, byte* privKey, word32 privSz, + const byte* pubKey, word32 pubSz, int label, int id, void* heap, int devId) { - /* process up to MAX_CHAIN_DEPTH plus subject cert */ - WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file"); + int ret = 0; + int type = 0; + void *pkey = NULL; - if (ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL, - GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; + if (privKey == NULL) { + return MISSING_KEY; } - return WOLFSSL_FAILURE; -} - - -int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx, - const char* file, int format) -{ - /* process up to MAX_CHAIN_DEPTH plus subject cert */ - WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format"); - - if (ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL, - GET_VERIFY_SETTING_CTX(ctx)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; +#ifndef NO_RSA + if (keyOID == RSAk) { + type = DYNAMIC_TYPE_RSA; + } +#ifdef WC_RSA_PSS + if (keyOID == RSAPSSk) { + type = DYNAMIC_TYPE_RSA; } - - return WOLFSSL_FAILURE; -} - - -#ifndef NO_DH - -/* server Diffie-Hellman parameters */ -static int wolfSSL_SetTmpDH_file_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - const char* fname, int format) -{ -#ifdef WOLFSSL_SMALL_STACK - byte staticBuffer[1]; /* force heap usage */ -#else - byte staticBuffer[FILE_BUFFER_SIZE]; #endif - byte* myBuffer = staticBuffer; - int dynamic = 0; - int ret; - long sz = 0; - XFILE file; - - if (ctx == NULL || fname == NULL) - return BAD_FUNC_ARG; - - file = XFOPEN(fname, "rb"); - if (file == XBADFILE) return WOLFSSL_BAD_FILE; - if(XFSEEK(file, 0, XSEEK_END) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; +#endif +#ifdef HAVE_ECC + if (keyOID == ECDSAk) { + type = DYNAMIC_TYPE_ECC; } - sz = XFTELL(file); - if(XFSEEK(file, 0, XSEEK_SET) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; +#endif +#if defined(HAVE_DILITHIUM) + if ((keyOID == DILITHIUM_LEVEL2k) || + (keyOID == DILITHIUM_LEVEL3k) || + (keyOID == DILITHIUM_LEVEL5k)) { + type = DYNAMIC_TYPE_DILITHIUM; } - - if (sz > MAX_WOLFSSL_FILE_SIZE || sz <= 0) { - WOLFSSL_MSG("SetTmpDH file size error"); - XFCLOSE(file); - return WOLFSSL_BAD_FILE; +#endif +#if defined(HAVE_FALCON) + if ((keyOID == FALCON_LEVEL1k) || + (keyOID == FALCON_LEVEL5k)) { + type = DYNAMIC_TYPE_FALCON; } +#endif - if (sz > (long)sizeof(staticBuffer)) { - WOLFSSL_MSG("Getting dynamic buffer"); - myBuffer = (byte*) XMALLOC(sz, ctx->heap, DYNAMIC_TYPE_FILE); - if (myBuffer == NULL) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; + ret = CreateDevPrivateKey(&pkey, privKey, privSz, type, label, id, + heap, devId); + #ifdef WOLF_CRYPTO_CB + if (ret == 0) { + #ifndef NO_RSA + if (keyOID == RSAk + #ifdef WC_RSA_PSS + || keyOID == RSAPSSk + #endif + ) { + ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, pubKey, pubSz); } - dynamic = 1; + #endif + #ifdef HAVE_ECC + if (keyOID == ECDSAk) { + ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, pubKey, pubSz); + } + #endif + #if defined(HAVE_DILITHIUM) + if ((keyOID == DILITHIUM_LEVEL2k) || + (keyOID == DILITHIUM_LEVEL3k) || + (keyOID == DILITHIUM_LEVEL5k)) { + ret = wc_CryptoCb_PqcSignatureCheckPrivKey(pkey, + WC_PQC_SIG_TYPE_DILITHIUM, + pubKey, pubSz); + } + #endif + #if defined(HAVE_FALCON) + if ((keyOID == FALCON_LEVEL1k) || + (keyOID == FALCON_LEVEL5k)) { + ret = wc_CryptoCb_PqcSignatureCheckPrivKey(pkey, + WC_PQC_SIG_TYPE_FALCON, + pubKey, pubSz); + } + #endif } - - if ((size_t)XFREAD(myBuffer, 1, sz, file) != (size_t)sz) - ret = WOLFSSL_BAD_FILE; - else { - if (ssl) - ret = wolfSSL_SetTmpDH_buffer(ssl, myBuffer, sz, format); - else - ret = wolfSSL_CTX_SetTmpDH_buffer(ctx, myBuffer, sz, format); + #else + /* devId was set, don't check, for now */ + /* TODO: Add callback for private key check? */ + (void) pubKey; + (void) pubSz; + #endif + if (pkey != NULL) { + #ifndef NO_RSA + if (keyOID == RSAk + #ifdef WC_RSA_PSS + || keyOID == RSAPSSk + #endif + ) { + wc_FreeRsaKey((RsaKey*)pkey); + } + #endif + #ifdef HAVE_ECC + if (keyOID == ECDSAk) { + wc_ecc_free((ecc_key*)pkey); + } + #endif + #if defined(HAVE_DILITHIUM) + if ((keyOID == DILITHIUM_LEVEL2k) || + (keyOID == DILITHIUM_LEVEL3k) || + (keyOID == DILITHIUM_LEVEL5k)) { + wc_dilithium_free((dilithium_key*)pkey); + } + #endif + #if defined(HAVE_FALCON) + if ((keyOID == FALCON_LEVEL1k) || + (keyOID == FALCON_LEVEL5k)) { + wc_falcon_free((falcon_key*)pkey); + } + #endif + XFREE(pkey, heap, type); } - XFCLOSE(file); - if (dynamic) - XFREE(myBuffer, ctx->heap, DYNAMIC_TYPE_FILE); - return ret; } +#endif /* WOLF_PRIVATE_KEY_ID */ -/* server Diffie-Hellman parameters */ -int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format) -{ - if (ssl == NULL) - return BAD_FUNC_ARG; - - return wolfSSL_SetTmpDH_file_wrapper(ssl->ctx, ssl, fname, format); -} - - -/* server Diffie-Hellman parameters */ -int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format) -{ - return wolfSSL_SetTmpDH_file_wrapper(ctx, NULL, fname, format); -} - -#endif /* NO_DH */ - -#endif /* NO_FILESYSTEM */ - -#ifndef NO_CHECK_PRIVATE_KEY /* Check private against public in certificate for match * * Returns WOLFSSL_SUCCESS on good private key * WOLFSSL_FAILURE if mismatched */ -static int check_cert_key(DerBuffer* cert, DerBuffer* key, void* heap, - int devId, int isKeyLabel, int isKeyId) +static int check_cert_key(DerBuffer* cert, DerBuffer* key, DerBuffer* altKey, + void* heap, int devId, int isKeyLabel, int isKeyId, int altDevId, + int isAltKeyLabel, int isAltKeyId) { #ifdef WOLFSSL_SMALL_STACK DecodedCert* der = NULL; @@ -9829,7 +6203,7 @@ } #ifdef WOLFSSL_SMALL_STACK - der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT); + der = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap, DYNAMIC_TYPE_DCERT); if (der == NULL) return MEMORY_E; #endif @@ -9837,10 +6211,10 @@ size = cert->length; buff = cert->buffer; InitDecodedCert_ex(der, buff, size, heap, devId); - if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL) != 0) { + if (ParseCertRelative(der, CERT_TYPE, NO_VERIFY, NULL, NULL) != 0) { FreeDecodedCert(der); #ifdef WOLFSSL_SMALL_STACK - XFREE(der, NULL, DYNAMIC_TYPE_DCERT); + XFREE(der, heap, DYNAMIC_TYPE_DCERT); #endif return WOLFSSL_FAILURE; } @@ -9849,68 +6223,10 @@ buff = key->buffer; #ifdef WOLF_PRIVATE_KEY_ID if (devId != INVALID_DEVID) { - int type = 0; - void *pkey = NULL; - - #ifndef NO_RSA - if (der->keyOID == RSAk) { - type = DYNAMIC_TYPE_RSA; - } - #ifdef WC_RSA_PSS - if (der->keyOID == RSAPSSk) { - type = DYNAMIC_TYPE_RSA; - } - #endif - #endif - #ifdef HAVE_ECC - if (der->keyOID == ECDSAk) { - type = DYNAMIC_TYPE_ECC; - } - #endif - - ret = CreateDevPrivateKey(&pkey, buff, size, type, - isKeyLabel, isKeyId, heap, devId); - #ifdef WOLF_CRYPTO_CB - if (ret == 0) { - #ifndef NO_RSA - if (der->keyOID == RSAk - #ifdef WC_RSA_PSS - || der->keyOID == RSAPSSk - #endif - ) { - ret = wc_CryptoCb_RsaCheckPrivKey((RsaKey*)pkey, - der->publicKey, der->pubKeySize); - } - #endif - #ifdef HAVE_ECC - if (der->keyOID == ECDSAk) { - ret = wc_CryptoCb_EccCheckPrivKey((ecc_key*)pkey, - der->publicKey, der->pubKeySize); - } - #endif - } - #else - /* devId was set, don't check, for now */ - /* TODO: Add callback for private key check? */ - #endif - if (pkey != NULL) { - #ifndef NO_RSA - if (der->keyOID == RSAk - #ifdef WC_RSA_PSS - || der->keyOID == RSAPSSk - #endif - ) { - wc_FreeRsaKey((RsaKey*)pkey); - } - #endif - #ifdef HAVE_ECC - if (der->keyOID == ECDSAk) { - wc_ecc_free((ecc_key*)pkey); - } - #endif - XFREE(pkey, heap, type); - } - if (ret != CRYPTOCB_UNAVAILABLE) { + ret = check_cert_key_dev(der->keyOID, buff, size, der->publicKey, + der->pubKeySize, isKeyLabel, isKeyId, heap, + devId); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE; } } @@ -9919,20 +6235,86 @@ ret = CRYPTOCB_UNAVAILABLE; } - if (ret == CRYPTOCB_UNAVAILABLE) + if (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) #endif /* WOLF_PRIVATE_KEY_ID */ { - ret = wc_CheckPrivateKeyCert(buff, size, der); + ret = wc_CheckPrivateKeyCert(buff, size, der, 0); ret = (ret == 1) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE; } + +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ret == WOLFSSL_SUCCESS && der->extSapkiSet && der->sapkiDer != NULL) { + /* Certificate contains an alternative public key. Hence, we also + * need an alternative private key. */ + if (altKey == NULL) { + ret = MISSING_KEY; + buff = NULL; + size = 0; + } + else { + size = altKey->length; + buff = altKey->buffer; + } +#ifdef WOLF_PRIVATE_KEY_ID + if (ret == WOLFSSL_SUCCESS && altDevId != INVALID_DEVID) { + /* We have to decode the public key first */ + word32 idx = 0; + /* Dilithium has the largest public key at the moment */ + word32 pubKeyLen = DILITHIUM_MAX_PUB_KEY_SIZE; + byte* decodedPubKey = (byte*)XMALLOC(pubKeyLen, heap, + DYNAMIC_TYPE_PUBLIC_KEY); + if (decodedPubKey == NULL) { + ret = MEMORY_E; + } + if (ret == WOLFSSL_SUCCESS) { + if (der->sapkiOID == RSAk || der->sapkiOID == ECDSAk) { + /* Simply copy the data */ + XMEMCPY(decodedPubKey, der->sapkiDer, der->sapkiLen); + pubKeyLen = der->sapkiLen; + ret = 0; + } + else { + ret = DecodeAsymKeyPublic(der->sapkiDer, &idx, + der->sapkiLen, decodedPubKey, + &pubKeyLen, der->sapkiOID); + } + } + if (ret == 0) { + ret = check_cert_key_dev(der->sapkiOID, buff, size, + decodedPubKey, pubKeyLen, + isAltKeyLabel, isAltKeyId, + heap, altDevId); + } + XFREE(decodedPubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { + ret = (ret == 0) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE; + } + } + else { + /* fall through if unavailable */ + ret = CRYPTOCB_UNAVAILABLE; + } + + if (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) +#endif /* WOLF_PRIVATE_KEY_ID */ + { + ret = wc_CheckPrivateKeyCert(buff, size, der, 1); + ret = (ret == 1) ? WOLFSSL_SUCCESS: WOLFSSL_FAILURE; + } + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ FreeDecodedCert(der); #ifdef WOLFSSL_SMALL_STACK - XFREE(der, NULL, DYNAMIC_TYPE_DCERT); + XFREE(der, heap, DYNAMIC_TYPE_DCERT); #endif (void)devId; (void)isKeyLabel; (void)isKeyId; + (void)altKey; + (void)altDevId; + (void)isAltKeyLabel; + (void)isAltKeyId; return ret; } @@ -9945,11 +6327,54 @@ * WOLFSSL_FAILURE if mismatched. */ int wolfSSL_CTX_check_private_key(const WOLFSSL_CTX* ctx) { + int res; + if (ctx == NULL) { return WOLFSSL_FAILURE; } - return check_cert_key(ctx->certificate, ctx->privateKey, ctx->heap, - ctx->privateKeyDevId, ctx->privateKeyLabel, ctx->privateKeyId); + +#ifdef WOLFSSL_DUAL_ALG_CERTS +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ctx->privateKey, ctx->privateKeyMask); + wolfssl_priv_der_unblind(ctx->altPrivateKey, ctx->altPrivateKeyMask); +#endif + res = check_cert_key(ctx->certificate, ctx->privateKey, ctx->altPrivateKey, + ctx->heap, ctx->privateKeyDevId, ctx->privateKeyLabel, + ctx->privateKeyId, ctx->altPrivateKeyDevId, ctx->altPrivateKeyLabel, + ctx->altPrivateKeyId) != 0; +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + { + int ret; + ret = wolfssl_priv_der_blind(NULL, ctx->privateKey, + (DerBuffer**)&ctx->privateKeyMask); + if (ret == 0) { + ret = wolfssl_priv_der_blind(NULL, ctx->altPrivateKey, + (DerBuffer**)&ctx->altPrivateKeyMask); + } + if (ret != 0) { + res = WOLFSSL_FAILURE; + } + } +#endif +#else +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ctx->privateKey, ctx->privateKeyMask); +#endif + res = check_cert_key(ctx->certificate, ctx->privateKey, NULL, ctx->heap, + ctx->privateKeyDevId, ctx->privateKeyLabel, ctx->privateKeyId, + INVALID_DEVID, 0, 0); +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + { + int ret = wolfssl_priv_der_blind(NULL, ctx->privateKey, + (DerBuffer**)&ctx->privateKeyMask); + if (ret != 0) { + res = WOLFSSL_FAILURE; + } + } +#endif +#endif + + return res; } #endif /* !NO_CHECK_PRIVATE_KEY */ @@ -9960,6 +6385,7 @@ */ WOLFSSL_EVP_PKEY* wolfSSL_CTX_get0_privatekey(const WOLFSSL_CTX* ctx) { + WOLFSSL_EVP_PKEY* res; const unsigned char *key; int type; @@ -9982,6 +6408,11 @@ type = EVP_PKEY_EC; break; #endif +#ifdef WOLFSSL_SM2 + case sm2_sa_algo: + type = EVP_PKEY_EC; + break; +#endif default: /* Other key types not supported either as ssl private keys * or in the EVP layer */ @@ -9991,505 +6422,712 @@ key = ctx->privateKey->buffer; - if (ctx->privateKeyPKey != NULL) - return ctx->privateKeyPKey; - else - return wolfSSL_d2i_PrivateKey(type, + if (ctx->privateKeyPKey != NULL) { + res = ctx->privateKeyPKey; + } + else { + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ctx->privateKey, ctx->privateKeyMask); + #endif + res = wolfSSL_d2i_PrivateKey(type, (WOLFSSL_EVP_PKEY**)&ctx->privateKeyPKey, &key, (long)ctx->privateKey->length); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ctx->privateKey, ctx->privateKeyMask); + #endif + } + + return res; } #endif #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) -static WOLFSSL_EVP_PKEY* d2iGenericKey(WOLFSSL_EVP_PKEY** out, - const unsigned char** in, long inSz, int priv) -{ - - WOLFSSL_EVP_PKEY* pkey = NULL; - const unsigned char* mem; - long memSz = inSz; - - WOLFSSL_ENTER("d2iGenericKey"); - - if (in == NULL || *in == NULL || inSz < 0) { - WOLFSSL_MSG("Bad argument"); - return NULL; - } - mem = *in; +#if !defined(NO_RSA) +static int d2iTryRsaKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, + long memSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey; + word32 keyIdx = 0; + int isRsaKey; + int ret = 1; +#ifndef WOLFSSL_SMALL_STACK + RsaKey rsa[1]; +#else + RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA); + if (rsa == NULL) + return 0; +#endif - #if !defined(NO_RSA) - { - word32 keyIdx = 0; - int isRsaKey; - #ifdef WOLFSSL_SMALL_STACK - RsaKey *rsa = (RsaKey*)XMALLOC(sizeof(RsaKey), NULL, DYNAMIC_TYPE_RSA); - if (rsa == NULL) - return NULL; - #else - RsaKey rsa[1]; - #endif - XMEMSET(rsa, 0, sizeof(RsaKey)); + XMEMSET(rsa, 0, sizeof(RsaKey)); - /* test if RSA key */ - if (priv) - isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 && - wc_RsaPrivateKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0; - else - isRsaKey = wc_InitRsaKey(rsa, NULL) == 0 && - wc_RsaPublicKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0; - wc_FreeRsaKey(rsa); + if (wc_InitRsaKey(rsa, NULL) != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(rsa, NULL, DYNAMIC_TYPE_RSA); #endif + return 0; + } + /* test if RSA key */ + if (priv) { + isRsaKey = + (wc_RsaPrivateKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0); + } + else { + isRsaKey = + (wc_RsaPublicKeyDecode(mem, &keyIdx, rsa, (word32)memSz) == 0); + } + wc_FreeRsaKey(rsa); +#ifdef WOLFSSL_SMALL_STACK + XFREE(rsa, NULL, DYNAMIC_TYPE_RSA); +#endif - if (isRsaKey) { - pkey = wolfSSL_EVP_PKEY_new(); - if (pkey != NULL) { - pkey->pkey_sz = keyIdx; - pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, - priv ? DYNAMIC_TYPE_PRIVATE_KEY : - DYNAMIC_TYPE_PUBLIC_KEY); - if (pkey->pkey.ptr == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } - XMEMCPY(pkey->pkey.ptr, mem, keyIdx); - pkey->type = EVP_PKEY_RSA; - if (out != NULL) { - *out = pkey; - } + if (!isRsaKey) { + return -1; + } - pkey->ownRsa = 1; - pkey->rsa = wolfssl_rsa_d2i(NULL, mem, inSz, - priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC); - if (pkey->rsa == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + if (*out != NULL) { + pkey = *out; + } + else { + pkey = wolfSSL_EVP_PKEY_new(); + if (pkey == NULL) { + WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error"); + return 0; + } + } - return pkey; - } - else { - WOLFSSL_MSG("RSA wolfSSL_EVP_PKEY_new error"); - } + pkey->pkey_sz = (int)keyIdx; + pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, + priv ? DYNAMIC_TYPE_PRIVATE_KEY : + DYNAMIC_TYPE_PUBLIC_KEY); + if (pkey->pkey.ptr == NULL) { + ret = 0; + } + if (ret == 1) { + XMEMCPY(pkey->pkey.ptr, mem, keyIdx); + pkey->type = EVP_PKEY_RSA; + + pkey->ownRsa = 1; + pkey->rsa = wolfssl_rsa_d2i(NULL, mem, memSz, + priv ? WOLFSSL_RSA_LOAD_PRIVATE : WOLFSSL_RSA_LOAD_PUBLIC); + if (pkey->rsa == NULL) { + ret = 0; } } - #endif /* NO_RSA */ - #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) - { - word32 keyIdx = 0; - int isEccKey; - #ifdef WOLFSSL_SMALL_STACK - ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, DYNAMIC_TYPE_ECC); - if (ecc == NULL) - return NULL; - #else - ecc_key ecc[1]; - #endif - XMEMSET(ecc, 0, sizeof(ecc_key)); + if (ret == 1) { + *out = pkey; + } - if (priv) - isEccKey = wc_ecc_init(ecc) == 0 && - wc_EccPrivateKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0; - else - isEccKey = wc_ecc_init(ecc) == 0 && - wc_EccPublicKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0; - wc_ecc_free(ecc); + if ((ret == 0) && (*out == NULL)) { + wolfSSL_EVP_PKEY_free(pkey); + } + return ret; +} +#endif /* !NO_RSA */ + +#if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) +static int d2iTryEccKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, + long memSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey; + word32 keyIdx = 0; + int isEccKey; + int ret = 1; +#ifndef WOLFSSL_SMALL_STACK + ecc_key ecc[1]; +#else + ecc_key *ecc = (ecc_key*)XMALLOC(sizeof(ecc_key), NULL, + DYNAMIC_TYPE_ECC); + if (ecc == NULL) + return 0; +#endif + + XMEMSET(ecc, 0, sizeof(ecc_key)); + + if (wc_ecc_init(ecc) != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(ecc, NULL, DYNAMIC_TYPE_ECC); #endif + return 0; + } - if (isEccKey) { - pkey = wolfSSL_EVP_PKEY_new(); - if (pkey != NULL) { - pkey->pkey_sz = keyIdx; - pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL, - priv ? DYNAMIC_TYPE_PRIVATE_KEY : - DYNAMIC_TYPE_PUBLIC_KEY); - if (pkey->pkey.ptr == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } - XMEMCPY(pkey->pkey.ptr, mem, keyIdx); - pkey->type = EVP_PKEY_EC; - if (out != NULL) { - *out = pkey; - } + if (priv) { + isEccKey = + (wc_EccPrivateKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0); + } + else { + isEccKey = + (wc_EccPublicKeyDecode(mem, &keyIdx, ecc, (word32)memSz) == 0); + } + wc_ecc_free(ecc); +#ifdef WOLFSSL_SMALL_STACK + XFREE(ecc, NULL, DYNAMIC_TYPE_ECC); +#endif - pkey->ownEcc = 1; - pkey->ecc = wolfSSL_EC_KEY_new(); - if (pkey->ecc == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + if (!isEccKey) { + return -1; + } - if (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc, - (const unsigned char*)pkey->pkey.ptr, - pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE - : WOLFSSL_RSA_LOAD_PUBLIC) != 1) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + if (*out != NULL) { + pkey = *out; + } + else { + pkey = wolfSSL_EVP_PKEY_new(); + if (pkey == NULL) { + WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error"); + return 0; + } + } - return pkey; - } - else { - WOLFSSL_MSG("ECC wolfSSL_EVP_PKEY_new error"); - } + pkey->pkey_sz = (int)keyIdx; + pkey->pkey.ptr = (char*)XMALLOC(keyIdx, NULL, + priv ? DYNAMIC_TYPE_PRIVATE_KEY : + DYNAMIC_TYPE_PUBLIC_KEY); + if (pkey->pkey.ptr == NULL) { + ret = 0; + } + if (ret == 1) { + XMEMCPY(pkey->pkey.ptr, mem, keyIdx); + pkey->type = EVP_PKEY_EC; + + pkey->ownEcc = 1; + pkey->ecc = wolfSSL_EC_KEY_new(); + if (pkey->ecc == NULL) { + ret = 0; } } - #endif /* HAVE_ECC && OPENSSL_EXTRA */ + if ((ret == 1) && (wolfSSL_EC_KEY_LoadDer_ex(pkey->ecc, + (const unsigned char*)pkey->pkey.ptr, + pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE + : WOLFSSL_RSA_LOAD_PUBLIC) != 1)) { + ret = 0; + } + if (ret == 1) { + *out = pkey; + } - #if !defined(NO_DSA) - { - word32 keyIdx = 0; - int isDsaKey; - #ifdef WOLFSSL_SMALL_STACK - DsaKey *dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA); - if (dsa == NULL) - return NULL; - #else - DsaKey dsa[1]; - #endif - XMEMSET(dsa, 0, sizeof(DsaKey)); + if ((ret == 0) && (*out == NULL)) { + wolfSSL_EVP_PKEY_free(pkey); + } + return ret; +} +#endif /* HAVE_ECC && OPENSSL_EXTRA */ - if (priv) - isDsaKey = wc_InitDsaKey(dsa) == 0 && - wc_DsaPrivateKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0; - else - isDsaKey = wc_InitDsaKey(dsa) == 0 && - wc_DsaPublicKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0; - wc_FreeDsaKey(dsa); +#if !defined(NO_DSA) +static int d2iTryDsaKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, + long memSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey; + word32 keyIdx = 0; + int isDsaKey; + int ret = 1; +#ifndef WOLFSSL_SMALL_STACK + DsaKey dsa[1]; +#else + DsaKey *dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), NULL, DYNAMIC_TYPE_DSA); + if (dsa == NULL) + return 0; +#endif + + XMEMSET(dsa, 0, sizeof(DsaKey)); + + if (wc_InitDsaKey(dsa) != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(dsa, NULL, DYNAMIC_TYPE_DSA); #endif + return 0; + } - /* test if DSA key */ - if (isDsaKey) { - pkey = wolfSSL_EVP_PKEY_new(); - - if (pkey != NULL) { - pkey->pkey_sz = keyIdx; - pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, - priv ? DYNAMIC_TYPE_PRIVATE_KEY : - DYNAMIC_TYPE_PUBLIC_KEY); - if (pkey->pkey.ptr == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } - XMEMCPY(pkey->pkey.ptr, mem, keyIdx); - pkey->type = EVP_PKEY_DSA; - if (out != NULL) { - *out = pkey; - } + if (priv) { + isDsaKey = + (wc_DsaPrivateKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0); + } + else { + isDsaKey = + (wc_DsaPublicKeyDecode(mem, &keyIdx, dsa, (word32)memSz) == 0); + } + wc_FreeDsaKey(dsa); +#ifdef WOLFSSL_SMALL_STACK + XFREE(dsa, NULL, DYNAMIC_TYPE_DSA); +#endif - pkey->ownDsa = 1; - pkey->dsa = wolfSSL_DSA_new(); - if (pkey->dsa == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + /* test if DSA key */ + if (!isDsaKey) { + return -1; + } - if (wolfSSL_DSA_LoadDer_ex(pkey->dsa, - (const unsigned char*)pkey->pkey.ptr, - pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE - : WOLFSSL_RSA_LOAD_PUBLIC) != 1) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + if (*out != NULL) { + pkey = *out; + } + else { + pkey = wolfSSL_EVP_PKEY_new(); + if (pkey == NULL) { + WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error"); + return 0; + } + } - return pkey; - } - else { - WOLFSSL_MSG("DSA wolfSSL_EVP_PKEY_new error"); - } + pkey->pkey_sz = (int)keyIdx; + pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, + priv ? DYNAMIC_TYPE_PRIVATE_KEY : + DYNAMIC_TYPE_PUBLIC_KEY); + if (pkey->pkey.ptr == NULL) { + ret = 0; + } + if (ret == 1) { + XMEMCPY(pkey->pkey.ptr, mem, keyIdx); + pkey->type = EVP_PKEY_DSA; + + pkey->ownDsa = 1; + pkey->dsa = wolfSSL_DSA_new(); + if (pkey->dsa == NULL) { + ret = 0; } } - #endif /* NO_DSA */ - #if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) - #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) - { - int isDhKey; - word32 keyIdx = 0; - #ifdef WOLFSSL_SMALL_STACK - DhKey *dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH); - if (dh == NULL) - return NULL; - #else - DhKey dh[1]; - #endif - XMEMSET(dh, 0, sizeof(DhKey)); + if ((ret == 1) && (wolfSSL_DSA_LoadDer_ex(pkey->dsa, + (const unsigned char*)pkey->pkey.ptr, + pkey->pkey_sz, priv ? WOLFSSL_RSA_LOAD_PRIVATE + : WOLFSSL_RSA_LOAD_PUBLIC) != 1)) { + ret = 0; + } + if (ret == 1) { + *out = pkey; + } + + if ((ret == 0) && (*out == NULL)) { + wolfSSL_EVP_PKEY_free(pkey); + } + return ret; +} +#endif /* NO_DSA */ - isDhKey = wc_InitDhKey(dh) == 0 && - wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz) == 0; - wc_FreeDhKey(dh); +#if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) +static int d2iTryDhKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, + long memSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey; + int isDhKey; + word32 keyIdx = 0; + int ret = 1; +#ifndef WOLFSSL_SMALL_STACK + DhKey dh[1]; +#else + DhKey *dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH); + if (dh == NULL) + return 0; +#endif + + XMEMSET(dh, 0, sizeof(DhKey)); + + if (wc_InitDhKey(dh) != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(dh, NULL, DYNAMIC_TYPE_DH); #endif + return 0; + } - /* test if DH key */ - if (isDhKey) { - pkey = wolfSSL_EVP_PKEY_new(); - - if (pkey != NULL) { - pkey->pkey_sz = (int)memSz; - pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, - priv ? DYNAMIC_TYPE_PRIVATE_KEY : - DYNAMIC_TYPE_PUBLIC_KEY); - if (pkey->pkey.ptr == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } - XMEMCPY(pkey->pkey.ptr, mem, memSz); - pkey->type = EVP_PKEY_DH; - if (out != NULL) { - *out = pkey; - } + isDhKey = (wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz) == 0); + wc_FreeDhKey(dh); +#ifdef WOLFSSL_SMALL_STACK + XFREE(dh, NULL, DYNAMIC_TYPE_DH); +#endif - pkey->ownDh = 1; - pkey->dh = wolfSSL_DH_new(); - if (pkey->dh == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + /* test if DH key */ + if (!isDhKey) { + return -1; + } - if (wolfSSL_DH_LoadDer(pkey->dh, - (const unsigned char*)pkey->pkey.ptr, - pkey->pkey_sz) != WOLFSSL_SUCCESS) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + if (*out != NULL) { + pkey = *out; + } + else { + pkey = wolfSSL_EVP_PKEY_new(); + if (pkey == NULL) { + WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error"); + return 0; + } + } - return pkey; - } - else { - WOLFSSL_MSG("DH wolfSSL_EVP_PKEY_new error"); - } + pkey->pkey_sz = (int)memSz; + pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, + priv ? DYNAMIC_TYPE_PRIVATE_KEY : + DYNAMIC_TYPE_PUBLIC_KEY); + if (pkey->pkey.ptr == NULL) { + ret = 0; + } + if (ret == 1) { + XMEMCPY(pkey->pkey.ptr, mem, memSz); + pkey->type = EVP_PKEY_DH; + + pkey->ownDh = 1; + pkey->dh = wolfSSL_DH_new(); + if (pkey->dh == NULL) { + ret = 0; } } - #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ - #endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ - #if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA) - #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) - { - word32 keyIdx = 0; - DhKey* key = NULL; - int ret; - #ifdef WOLFSSL_SMALL_STACK - DhKey* dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH); - if (dh == NULL) - return NULL; - #else - DhKey dh[1]; - #endif - XMEMSET(dh, 0, sizeof(DhKey)); + if ((ret == 1) && (wolfSSL_DH_LoadDer(pkey->dh, + (const unsigned char*)pkey->pkey.ptr, + pkey->pkey_sz) != WOLFSSL_SUCCESS)) { + ret = 0; + } + if (ret == 1) { + *out = pkey; + } - /* test if DH-public key */ - if (wc_InitDhKey(dh) != 0) - return NULL; + if ((ret == 0) && (*out == NULL)) { + wolfSSL_EVP_PKEY_free(pkey); + } + return ret; +} +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ - ret = wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz); - wc_FreeDhKey(dh); +#if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) +static int d2iTryAltDhKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, + long memSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey; + word32 keyIdx = 0; + DhKey* key = NULL; + int elements; + int ret; +#ifndef WOLFSSL_SMALL_STACK + DhKey dh[1]; +#else + DhKey* dh = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH); + if (dh == NULL) + return 0; +#endif + XMEMSET(dh, 0, sizeof(DhKey)); + + /* test if DH-public key */ + if (wc_InitDhKey(dh) != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(dh, NULL, DYNAMIC_TYPE_DH); - #endif +#endif + return 0; + } - if (ret == 0) { - pkey = wolfSSL_EVP_PKEY_new(); - if (pkey != NULL) { - pkey->type = EVP_PKEY_DH; - pkey->pkey_sz = (int)memSz; - pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, - priv ? DYNAMIC_TYPE_PRIVATE_KEY : - DYNAMIC_TYPE_PUBLIC_KEY); - if (pkey->pkey.ptr == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } - XMEMCPY(pkey->pkey.ptr, mem, memSz); - if (out != NULL) { - *out = pkey; - } - pkey->ownDh = 1; - pkey->dh = wolfSSL_DH_new(); - if (pkey->dh == NULL) { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } + ret = wc_DhKeyDecode(mem, &keyIdx, dh, (word32)memSz); + wc_FreeDhKey(dh); +#ifdef WOLFSSL_SMALL_STACK + XFREE(dh, NULL, DYNAMIC_TYPE_DH); +#endif - key = (DhKey*)pkey->dh->internal; + if (ret != 0) { + return -1; + } - keyIdx = 0; - if (wc_DhKeyDecode(mem, &keyIdx, key, (word32)memSz) == 0) - { - int elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q | - ELEMENT_PUB; - if (priv) - elements |= ELEMENT_PRV; - if(SetDhExternal_ex(pkey->dh, elements) - == WOLFSSL_SUCCESS ) { - return pkey; - } - } - else { - wolfSSL_EVP_PKEY_free(pkey); - return NULL; - } - } + if (*out != NULL) { + pkey = *out; + } + else { + pkey = wolfSSL_EVP_PKEY_new(); + if (pkey == NULL) { + return 0; } } - #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ - #endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */ - #ifdef HAVE_PQC - #ifdef HAVE_FALCON - { - int isFalcon = 0; - #ifdef WOLFSSL_SMALL_STACK - falcon_key *falcon = (falcon_key *)XMALLOC(sizeof(falcon_key), NULL, - DYNAMIC_TYPE_FALCON); - if (falcon == NULL) { - return NULL; + ret = 1; + pkey->type = EVP_PKEY_DH; + pkey->pkey_sz = (int)memSz; + pkey->pkey.ptr = (char*)XMALLOC(memSz, NULL, + priv ? DYNAMIC_TYPE_PRIVATE_KEY : + DYNAMIC_TYPE_PUBLIC_KEY); + if (pkey->pkey.ptr == NULL) { + ret = 0; + } + if (ret == 1) { + XMEMCPY(pkey->pkey.ptr, mem, memSz); + pkey->ownDh = 1; + pkey->dh = wolfSSL_DH_new(); + if (pkey->dh == NULL) { + ret = 0; } - #else - falcon_key falcon[1]; - #endif + } - if (wc_falcon_init(falcon) == 0) { - /* test if Falcon key */ - if (priv) { - /* Try level 1 */ - isFalcon = wc_falcon_set_level(falcon, 1) == 0 && - wc_falcon_import_private_only(mem, (word32)memSz, - falcon) == 0; - if (!isFalcon) { - /* Try level 5 */ - isFalcon = wc_falcon_set_level(falcon, 5) == 0 && - wc_falcon_import_private_only(mem, (word32)memSz, - falcon) == 0; - } - } else { - /* Try level 1 */ - isFalcon = wc_falcon_set_level(falcon, 1) == 0 && - wc_falcon_import_public(mem, (word32)memSz, falcon) - == 0; - - if (!isFalcon) { - /* Try level 5 */ - isFalcon = wc_falcon_set_level(falcon, 5) == 0 && - wc_falcon_import_public(mem, (word32)memSz, - falcon) == 0; - } - } - wc_falcon_free(falcon); + if (ret == 1) { + key = (DhKey*)pkey->dh->internal; + + keyIdx = 0; + if (wc_DhKeyDecode(mem, &keyIdx, key, (word32)memSz) != 0) { + ret = 0; + } + } + + if (ret == 1) { + elements = ELEMENT_P | ELEMENT_G | ELEMENT_Q | ELEMENT_PUB; + if (priv) { + elements |= ELEMENT_PRV; + } + if (SetDhExternal_ex(pkey->dh, elements) != WOLFSSL_SUCCESS ) { + ret = 0; } + } + if (ret == 1) { + *out = pkey; + } + + if ((ret == 0) && (*out == NULL)) { + wolfSSL_EVP_PKEY_free(pkey); + } + return ret; +} +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */ +#ifdef HAVE_FALCON +static int d2iTryFalconKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, + long memSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey; + int isFalcon = 0; +#ifndef WOLFSSL_SMALL_STACK + falcon_key falcon[1]; +#else + falcon_key *falcon = (falcon_key *)XMALLOC(sizeof(falcon_key), NULL, + DYNAMIC_TYPE_FALCON); + if (falcon == NULL) { + return 0; + } +#endif + + if (wc_falcon_init(falcon) != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON); #endif - if (isFalcon) { - /* Create a fake Falcon EVP_PKEY. In the future, we might integrate - * Falcon into the compatibility layer. */ - pkey = wolfSSL_EVP_PKEY_new(); - if (pkey == NULL) { - WOLFSSL_MSG("Falcon wolfSSL_EVP_PKEY_new error"); - return NULL; - } - pkey->type = EVP_PKEY_FALCON; - pkey->pkey.ptr = NULL; - pkey->pkey_sz = 0; - return pkey; - } + return 0; + } + /* test if Falcon key */ + if (priv) { + /* Try level 1 */ + isFalcon = ((wc_falcon_set_level(falcon, 1) == 0) && + (wc_falcon_import_private_only(mem, (word32)memSz, + falcon) == 0)); + if (!isFalcon) { + /* Try level 5 */ + isFalcon = ((wc_falcon_set_level(falcon, 5) == 0) && + (wc_falcon_import_private_only(mem, (word32)memSz, + falcon) == 0)); + } } - #endif /* HAVE_FALCON */ - #ifdef HAVE_DILITHIUM - { - int isDilithium = 0; - #ifdef WOLFSSL_SMALL_STACK - dilithium_key *dilithium = (dilithium_key *) - XMALLOC(sizeof(dilithium_key), NULL, DYNAMIC_TYPE_DILITHIUM); - if (dilithium == NULL) { - return NULL; + else { + /* Try level 1 */ + isFalcon = ((wc_falcon_set_level(falcon, 1) == 0) && + (wc_falcon_import_public(mem, (word32)memSz, falcon) == 0)); + + if (!isFalcon) { + /* Try level 5 */ + isFalcon = ((wc_falcon_set_level(falcon, 5) == 0) && + (wc_falcon_import_public(mem, (word32)memSz, + falcon) == 0)); } - #else - dilithium_key dilithium[1]; - #endif + } + wc_falcon_free(falcon); +#ifdef WOLFSSL_SMALL_STACK + XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON); +#endif - if (wc_dilithium_init(dilithium) == 0) { - /* Test if Dilithium key. Try all levels. */ - if (priv) { - isDilithium = wc_dilithium_set_level(dilithium, 2) == 0 && - wc_dilithium_import_private_only(mem, - (word32)memSz, dilithium) == 0; - if (!isDilithium) { - isDilithium = wc_dilithium_set_level(dilithium, 3) == 0 && - wc_dilithium_import_private_only(mem, - (word32)memSz, dilithium) == 0; - } - if (!isDilithium) { - isDilithium = wc_dilithium_set_level(dilithium, 5) == 0 && - wc_dilithium_import_private_only(mem, - (word32)memSz, dilithium) == 0; - } - } else { - isDilithium = wc_dilithium_set_level(dilithium, 2) == 0 && - wc_dilithium_import_public(mem, (word32)memSz, - dilithium) == 0; - if (!isDilithium) { - isDilithium = wc_dilithium_set_level(dilithium, 3) == 0 && - wc_dilithium_import_public(mem, (word32)memSz, - dilithium) == 0; - } - if (!isDilithium) { - isDilithium = wc_dilithium_set_level(dilithium, 5) == 0 && - wc_dilithium_import_public(mem, (word32)memSz, - dilithium) == 0; - } - } - wc_dilithium_free(dilithium); + if (!isFalcon) { + return -1; + } + + if (*out != NULL) { + pkey = *out; + } + else { + /* Create a fake Falcon EVP_PKEY. In the future, we might integrate + * Falcon into the compatibility layer. */ + pkey = wolfSSL_EVP_PKEY_new(); + if (pkey == NULL) { + WOLFSSL_MSG("Falcon wolfSSL_EVP_PKEY_new error"); + return 0; } + } + pkey->type = EVP_PKEY_FALCON; + pkey->pkey.ptr = NULL; + pkey->pkey_sz = 0; + + *out = pkey; + return 1; +} +#endif /* HAVE_FALCON */ + +#ifdef HAVE_DILITHIUM +static int d2iTryDilithiumKey(WOLFSSL_EVP_PKEY** out, const unsigned char* mem, + long memSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey; + int isDilithium = 0; +#ifndef WOLFSSL_SMALL_STACK + dilithium_key dilithium[1]; +#else + dilithium_key *dilithium = (dilithium_key *) + XMALLOC(sizeof(dilithium_key), NULL, DYNAMIC_TYPE_DILITHIUM); + if (dilithium == NULL) { + return 0; + } +#endif + + if (wc_dilithium_init(dilithium) != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM); #endif - if (isDilithium) { - /* Create a fake Dilithium EVP_PKEY. In the future, we might - * integrate Dilithium into the compatibility layer. */ - pkey = wolfSSL_EVP_PKEY_new(); - if (pkey == NULL) { - WOLFSSL_MSG("Dilithium wolfSSL_EVP_PKEY_new error"); - return NULL; - } - pkey->type = EVP_PKEY_DILITHIUM; - pkey->pkey.ptr = NULL; - pkey->pkey_sz = 0; - return pkey; + return 0; + } + + /* Test if Dilithium key. Try all levels. */ + if (priv) { + isDilithium = ((wc_dilithium_set_level(dilithium, 2) == 0) && + (wc_dilithium_import_private(mem, + (word32)memSz, dilithium) == 0)); + if (!isDilithium) { + isDilithium = ((wc_dilithium_set_level(dilithium, 3) == 0) && + (wc_dilithium_import_private(mem, + (word32)memSz, dilithium) == 0)); + } + if (!isDilithium) { + isDilithium = ((wc_dilithium_set_level(dilithium, 5) == 0) && + (wc_dilithium_import_private(mem, + (word32)memSz, dilithium) == 0)); + } + } + else { + isDilithium = ((wc_dilithium_set_level(dilithium, 2) == 0) && + (wc_dilithium_import_public(mem, (word32)memSz, + dilithium) == 0)); + if (!isDilithium) { + isDilithium = ((wc_dilithium_set_level(dilithium, 3) == 0) && + (wc_dilithium_import_public(mem, (word32)memSz, + dilithium) == 0)); } + if (!isDilithium) { + isDilithium = ((wc_dilithium_set_level(dilithium, 5) == 0) && + (wc_dilithium_import_public(mem, (word32)memSz, + dilithium) == 0)); + } + } + wc_dilithium_free(dilithium); +#ifdef WOLFSSL_SMALL_STACK + XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM); +#endif + + if (!isDilithium) { + return -1; + } + if (*out != NULL) { + pkey = *out; } - #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ + else { + /* Create a fake Dilithium EVP_PKEY. In the future, we might + * integrate Dilithium into the compatibility layer. */ + pkey = wolfSSL_EVP_PKEY_new(); + if (pkey == NULL) { + WOLFSSL_MSG("Dilithium wolfSSL_EVP_PKEY_new error"); + return 0; + } + } + pkey->type = EVP_PKEY_DILITHIUM; + pkey->pkey.ptr = NULL; + pkey->pkey_sz = 0; + + *out = pkey; + return 1; +} +#endif /* HAVE_DILITHIUM */ + +static WOLFSSL_EVP_PKEY* d2iGenericKey(WOLFSSL_EVP_PKEY** out, + const unsigned char** in, long inSz, int priv) +{ + WOLFSSL_EVP_PKEY* pkey = NULL; + + WOLFSSL_ENTER("d2iGenericKey"); + + if (in == NULL || *in == NULL || inSz < 0) { + WOLFSSL_MSG("Bad argument"); + return NULL; + } + + if ((out != NULL) && (*out != NULL)) { + pkey = *out; + } + +#if !defined(NO_RSA) + if (d2iTryRsaKey(&pkey, *in, inSz, priv) >= 0) { + ; + } + else +#endif /* NO_RSA */ +#if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) + if (d2iTryEccKey(&pkey, *in, inSz, priv) >= 0) { + ; + } + else +#endif /* HAVE_ECC && OPENSSL_EXTRA */ +#if !defined(NO_DSA) + if (d2iTryDsaKey(&pkey, *in, inSz, priv) >= 0) { + ; + } + else +#endif /* NO_DSA */ +#if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) + if (d2iTryDhKey(&pkey, *in, inSz, priv) >= 0) { + ; + } + else +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ + +#if !defined(NO_DH) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_DH_EXTRA) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) + if (d2iTryAltDhKey(&pkey, *in, inSz, priv) >= 0) { + ; + } + else +#endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ +#endif /* !NO_DH && OPENSSL_EXTRA && WOLFSSL_DH_EXTRA */ - if (pkey == NULL) { +#ifdef HAVE_FALCON + if (d2iTryFalconKey(&pkey, *in, inSz, priv) >= 0) { + ; + } + else +#endif /* HAVE_FALCON */ +#ifdef HAVE_DILITHIUM + if (d2iTryDilithiumKey(&pkey, *in, inSz, priv) >= 0) { + ; + } + else +#endif /* HAVE_DILITHIUM */ + { WOLFSSL_MSG("wolfSSL_d2i_PUBKEY couldn't determine key type"); } + if ((pkey != NULL) && (out != NULL)) { + *out = pkey; + } return pkey; - } #endif /* OPENSSL_EXTRA || WPA_SMALL */ #ifdef OPENSSL_EXTRA WOLFSSL_PKCS8_PRIV_KEY_INFO* wolfSSL_d2i_PKCS8_PKEY( - WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey, const unsigned char** keyBuf, long keyLen) + WOLFSSL_PKCS8_PRIV_KEY_INFO** pkey, const unsigned char** keyBuf, + long keyLen) { WOLFSSL_PKCS8_PRIV_KEY_INFO* pkcs8 = NULL; #ifdef WOLFSSL_PEM_TO_DER @@ -10514,7 +7152,8 @@ /* Verify this is PKCS8 Key */ word32 inOutIdx = 0; word32 algId; - ret = ToTraditionalInline_ex(der->buffer, &inOutIdx, der->length, &algId); + ret = ToTraditionalInline_ex(der->buffer, &inOutIdx, der->length, + &algId); if (ret >= 0) { ret = 0; /* good DER */ } @@ -10533,7 +7172,7 @@ } if (ret == 0) { XMEMCPY(pkcs8->pkey.ptr, der->buffer, der->length); - pkcs8->pkey_sz = der->length; + pkcs8->pkey_sz = (int)der->length; } FreeDer(&der); @@ -10660,7 +7299,8 @@ !defined(NO_PWDBASED) /* helper function to get raw pointer to DER buffer from WOLFSSL_EVP_PKEY */ -static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, unsigned char** der) +static int wolfSSL_EVP_PKEY_get_der(const WOLFSSL_EVP_PKEY* key, + unsigned char** der) { int sz; word16 pkcs8HeaderSz; @@ -10707,7 +7347,7 @@ word32 idx = 0, algId; word16 pkcs8HeaderSz = 0; WOLFSSL_EVP_PKEY* local; - int opt; + int opt = 0; (void)opt; @@ -10739,7 +7379,7 @@ (void)idx; /* not used */ } else { - if (ret != ASN_PARSE_E) { + if (ret != WC_NO_ERR_TRACE(ASN_PARSE_E)) { WOLFSSL_MSG("Unexpected error with trying to remove PKCS8 " "header"); return NULL; @@ -10973,187 +7613,293 @@ * WOLFSSL_FAILURE if mismatched. */ int wolfSSL_check_private_key(const WOLFSSL* ssl) { + int res = WOLFSSL_SUCCESS; + if (ssl == NULL) { return WOLFSSL_FAILURE; } - return check_cert_key(ssl->buffers.certificate, ssl->buffers.key, ssl->heap, - ssl->buffers.keyDevId, ssl->buffers.keyLabel, ssl->buffers.keyId); +#ifdef WOLFSSL_DUAL_ALG_CERTS +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + wolfssl_priv_der_unblind(ssl->buffers.altKey, ssl->buffers.altKeyMask); +#endif + res = check_cert_key(ssl->buffers.certificate, ssl->buffers.key, + ssl->buffers.altKey, ssl->heap, ssl->buffers.keyDevId, + ssl->buffers.keyLabel, ssl->buffers.keyId, ssl->buffers.altKeyDevId, + ssl->buffers.altKeyLabel, ssl->buffers.altKeyId); +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + if (res == WOLFSSL_SUCCESS) { + int ret; + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + (DerBuffer**)&ssl->buffers.keyMask); + if (ret == 0) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.altKey, + (DerBuffer**)&ssl->buffers.altKeyMask); + } + if (ret != 0) { + res = WOLFSSL_FAILURE; + } + } +#endif +#else +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); +#endif + res = check_cert_key(ssl->buffers.certificate, ssl->buffers.key, NULL, + ssl->heap, ssl->buffers.keyDevId, ssl->buffers.keyLabel, + ssl->buffers.keyId, INVALID_DEVID, 0, 0); +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + if (res == WOLFSSL_SUCCESS) { + int ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + (DerBuffer**)&ssl->buffers.keyMask); + if (ret != 0) { + res = WOLFSSL_FAILURE; + } + } +#endif +#endif + + return res; } #endif /* !NO_CHECK_PRIVATE_KEY */ #endif /* !NO_CERTS */ -int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey) -{ - WOLFSSL_ENTER("wolfSSL_use_PrivateKey"); - if (ssl == NULL || pkey == NULL ) { - return WOLFSSL_FAILURE; - } +#endif /* OPENSSL_EXTRA */ - return wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr, - pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1); +#if defined(HAVE_RPK) +/* Confirm that all the byte data in the buffer is unique. + * return 1 if all the byte data in the buffer is unique, otherwise 0. + */ +static int isArrayUnique(const char* buf, size_t len) +{ + size_t i, j; + /* check the array is unique */ + for (i = 0; i < len -1; ++i) { + for (j = i+ 1; j < len; ++j) { + if (buf[i] == buf[j]) { + return 0; + } + } + } + return 1; } - -int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der, - long derSz) +/* Set user preference for the client_cert_type exetnsion. + * Takes byte array containing cert types the caller can provide to its peer. + * Cert types are in preferred order in the array. + */ +WOLFSSL_API int wolfSSL_CTX_set_client_cert_type(WOLFSSL_CTX* ctx, + const char* buf, int bufLen) { - WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1"); - if (ssl == NULL || der == NULL ) { - return WOLFSSL_FAILURE; - } + int i; - (void)pri; /* type of private key */ - return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1); -} -/****************************************************************************** -* wolfSSL_CTX_use_PrivateKey_ASN1 - loads a private key buffer into the SSL ctx -* -* RETURNS: -* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE -*/ + if (ctx == NULL || bufLen > MAX_CLIENT_CERT_TYPE_CNT) { + return BAD_FUNC_ARG; + } -int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx, - unsigned char* der, long derSz) -{ - WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1"); - if (ctx == NULL || der == NULL ) { - return WOLFSSL_FAILURE; + /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/ + if (buf == NULL || bufLen == 0) { + ctx->rpkConfig.preferred_ClientCertTypeCnt = 1; + ctx->rpkConfig.preferred_ClientCertTypes[0]= WOLFSSL_CERT_TYPE_X509; + ctx->rpkConfig.preferred_ClientCertTypes[1]= WOLFSSL_CERT_TYPE_X509; + return WOLFSSL_SUCCESS; } - (void)pri; /* type of private key */ - return wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1); -} + if (!isArrayUnique(buf, (size_t)bufLen)) + return BAD_FUNC_ARG; + for (i = 0; i < bufLen; i++){ + if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509) + return BAD_FUNC_ARG; -#ifndef NO_RSA -int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz) -{ - WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1"); - if (ssl == NULL || der == NULL ) { - return WOLFSSL_FAILURE; + ctx->rpkConfig.preferred_ClientCertTypes[i] = (byte)buf[i]; } + ctx->rpkConfig.preferred_ClientCertTypeCnt = bufLen; - return wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, WOLFSSL_FILETYPE_ASN1); + return WOLFSSL_SUCCESS; } -#endif -int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509) +/* Set user preference for the server_cert_type exetnsion. + * Takes byte array containing cert types the caller can provide to its peer. + * Cert types are in preferred order in the array. + */ +WOLFSSL_API int wolfSSL_CTX_set_server_cert_type(WOLFSSL_CTX* ctx, + const char* buf, int bufLen) { - long idx; + int i; - WOLFSSL_ENTER("wolfSSL_use_certificate"); - if (x509 != NULL && ssl != NULL && x509->derCert != NULL) { - if (ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length, - WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0, - GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; - } + if (ctx == NULL || bufLen > MAX_SERVER_CERT_TYPE_CNT) { + return BAD_FUNC_ARG; } - (void)idx; - return WOLFSSL_FAILURE; -} + /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/ + if (buf == NULL || bufLen == 0) { + ctx->rpkConfig.preferred_ServerCertTypeCnt = 1; + ctx->rpkConfig.preferred_ServerCertTypes[0]= WOLFSSL_CERT_TYPE_X509; + ctx->rpkConfig.preferred_ServerCertTypes[1]= WOLFSSL_CERT_TYPE_X509; + return WOLFSSL_SUCCESS; + } -#endif /* OPENSSL_EXTRA */ + if (!isArrayUnique(buf, (size_t)bufLen)) + return BAD_FUNC_ARG; -int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der, - int derSz) -{ - long idx; + for (i = 0; i < bufLen; i++){ + if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509) + return BAD_FUNC_ARG; - WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1"); - if (der != NULL && ssl != NULL) { - if (ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE, - ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; - } + ctx->rpkConfig.preferred_ServerCertTypes[i] = (byte)buf[i]; } + ctx->rpkConfig.preferred_ServerCertTypeCnt = bufLen; - (void)idx; - return WOLFSSL_FAILURE; + return WOLFSSL_SUCCESS; } -#ifndef NO_FILESYSTEM - -WOLFSSL_ABI -int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format) +/* Set user preference for the client_cert_type exetnsion. + * Takes byte array containing cert types the caller can provide to its peer. + * Cert types are in preferred order in the array. + */ +WOLFSSL_API int wolfSSL_set_client_cert_type(WOLFSSL* ssl, + const char* buf, int bufLen) { - WOLFSSL_ENTER("wolfSSL_use_certificate_file"); + int i; - if (ssl == NULL) { + if (ssl == NULL || bufLen > MAX_CLIENT_CERT_TYPE_CNT) { return BAD_FUNC_ARG; } - if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, - ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) { + /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/ + if (buf == NULL || bufLen == 0) { + ssl->options.rpkConfig.preferred_ClientCertTypeCnt = 1; + ssl->options.rpkConfig.preferred_ClientCertTypes[0] + = WOLFSSL_CERT_TYPE_X509; + ssl->options.rpkConfig.preferred_ClientCertTypes[1] + = WOLFSSL_CERT_TYPE_X509; return WOLFSSL_SUCCESS; } - return WOLFSSL_FAILURE; -} + if (!isArrayUnique(buf, (size_t)bufLen)) + return BAD_FUNC_ARG; + for (i = 0; i < bufLen; i++){ + if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509) + return BAD_FUNC_ARG; -WOLFSSL_ABI -int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format) + ssl->options.rpkConfig.preferred_ClientCertTypes[i] = (byte)buf[i]; + } + ssl->options.rpkConfig.preferred_ClientCertTypeCnt = bufLen; + + return WOLFSSL_SUCCESS; +} + +/* Set user preference for the server_cert_type exetnsion. + * Takes byte array containing cert types the caller can provide to its peer. + * Cert types are in preferred order in the array. + */ +WOLFSSL_API int wolfSSL_set_server_cert_type(WOLFSSL* ssl, + const char* buf, int bufLen) { - WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file"); + int i; - if (ssl == NULL) { + if (ssl == NULL || bufLen > MAX_SERVER_CERT_TYPE_CNT) { return BAD_FUNC_ARG; } - if (ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE, - ssl, 0, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) { + /* if buf is set to NULL or bufLen is set to zero, it defaults the setting*/ + if (buf == NULL || bufLen == 0) { + ssl->options.rpkConfig.preferred_ServerCertTypeCnt = 1; + ssl->options.rpkConfig.preferred_ServerCertTypes[0] + = WOLFSSL_CERT_TYPE_X509; + ssl->options.rpkConfig.preferred_ServerCertTypes[1] + = WOLFSSL_CERT_TYPE_X509; return WOLFSSL_SUCCESS; } - return WOLFSSL_FAILURE; -} + if (!isArrayUnique(buf, (size_t)bufLen)) + return BAD_FUNC_ARG; + for (i = 0; i < bufLen; i++){ + if (buf[i] != WOLFSSL_CERT_TYPE_RPK && buf[i] != WOLFSSL_CERT_TYPE_X509) + return BAD_FUNC_ARG; -WOLFSSL_ABI -int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file) + ssl->options.rpkConfig.preferred_ServerCertTypes[i] = (byte)buf[i]; + } + ssl->options.rpkConfig.preferred_ServerCertTypeCnt = bufLen; + + return WOLFSSL_SUCCESS; +} + +/* get negotiated certificate type value and return it to the second parameter. + * cert type value: + * -1: WOLFSSL_CERT_TYPE_UNKNOWN + * 0: WOLFSSL_CERT_TYPE_X509 + * 2: WOLFSSL_CERT_TYPE_RPK + * return WOLFSSL_SUCCESS on success, otherwise negative value. + * in case no negotiation performed, it returns WOLFSSL_SUCCESS and -1 is for + * cert type. + */ +WOLFSSL_API int wolfSSL_get_negotiated_client_cert_type(WOLFSSL* ssl, int* tp) { - /* process up to MAX_CHAIN_DEPTH plus subject cert */ - WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file"); + int ret = WOLFSSL_SUCCESS; - if (ssl == NULL) { + if (ssl == NULL || tp == NULL) return BAD_FUNC_ARG; - } - if (ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, - ssl, 1, NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; + if (ssl->options.side == WOLFSSL_CLIENT_END) { + if (ssl->options.rpkState.received_ClientCertTypeCnt == 1) + *tp = ssl->options.rpkState.received_ClientCertTypes[0]; + else + *tp = WOLFSSL_CERT_TYPE_UNKNOWN; } - - return WOLFSSL_FAILURE; + else { + if (ssl->options.rpkState.sending_ClientCertTypeCnt == 1) + *tp = ssl->options.rpkState.sending_ClientCertTypes[0]; + else + *tp = WOLFSSL_CERT_TYPE_UNKNOWN; + } + return ret; } -int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file, - int format) +/* get negotiated certificate type value and return it to the second parameter. + * cert type value: + * -1: WOLFSSL_CERT_TYPE_UNKNOWN + * 0: WOLFSSL_CERT_TYPE_X509 + * 2: WOLFSSL_CERT_TYPE_RPK + * return WOLFSSL_SUCCESS on success, otherwise negative value. + * in case no negotiation performed, it returns WOLFSSL_SUCCESS and -1 is for + * cert type. + */ +WOLFSSL_API int wolfSSL_get_negotiated_server_cert_type(WOLFSSL* ssl, int* tp) { - /* process up to MAX_CHAIN_DEPTH plus subject cert */ - WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format"); + int ret = WOLFSSL_SUCCESS; - if (ssl == NULL) { + if (ssl == NULL || tp == NULL) return BAD_FUNC_ARG; - } - if (ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1, - NULL, GET_VERIFY_SETTING_SSL(ssl)) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; + if (ssl->options.side == WOLFSSL_CLIENT_END) { + if (ssl->options.rpkState.received_ServerCertTypeCnt == 1) + *tp = ssl->options.rpkState.received_ServerCertTypes[0]; + else + *tp = WOLFSSL_CERT_TYPE_UNKNOWN; } - return WOLFSSL_FAILURE; + else { + if (ssl->options.rpkState.sending_ServerCertTypeCnt == 1) + *tp = ssl->options.rpkState.sending_ServerCertTypes[0]; + else + *tp = WOLFSSL_CERT_TYPE_UNKNOWN; + } + return ret; } -#endif /* !NO_FILESYSTEM */ +#endif /* HAVE_RPK */ #ifdef HAVE_ECC /* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */ int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz) { + WOLFSSL_ENTER("wolfSSL_CTX_SetTmpEC_DHE_Sz"); + if (ctx == NULL) return BAD_FUNC_ARG; @@ -11172,7 +7918,11 @@ } /* check size */ - if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE) +#if ECC_MIN_KEY_SZ > 0 + if (sz < ECC_MINSIZE) + return BAD_FUNC_ARG; +#endif + if (sz > ECC_MAXSIZE) return BAD_FUNC_ARG; ctx->eccTempKeySz = sz; @@ -11184,11 +7934,17 @@ /* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */ int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz) { + WOLFSSL_ENTER("wolfSSL_SetTmpEC_DHE_Sz"); + if (ssl == NULL) return BAD_FUNC_ARG; /* check size */ - if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE) +#if ECC_MIN_KEY_SZ > 0 + if (sz < ECC_MINSIZE) + return BAD_FUNC_ARG; +#endif + if (sz > ECC_MAXSIZE) return BAD_FUNC_ARG; ssl->eccTempKeySz = sz; @@ -11199,78 +7955,6 @@ #endif /* HAVE_ECC */ -#ifdef OPENSSL_EXTRA - -#ifndef NO_FILESYSTEM -int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file, - int format) -{ - WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey_file"); - - return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format); -} - - -int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format) -{ - WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file"); - - return wolfSSL_use_PrivateKey_file(ssl, file, format); -} -#endif /* NO_FILESYSTEM */ - - -/* Copies the master secret over to out buffer. If outSz is 0 returns the size - * of master secret. - * - * ses : a session from completed TLS/SSL handshake - * out : buffer to hold copy of master secret - * outSz : size of out buffer - * returns : number of bytes copied into out buffer on success - * less then or equal to 0 is considered a failure case - */ -int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses, - unsigned char* out, int outSz) -{ - int size; - - ses = ClientSessionToSession(ses); - - if (outSz == 0) { - return SECRET_LEN; - } - - if (ses == NULL || out == NULL || outSz < 0) { - return 0; - } - - if (outSz > SECRET_LEN) { - size = SECRET_LEN; - } - else { - size = outSz; - } - - XMEMCPY(out, ses->masterSecret, size); - return size; -} - - -int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses) -{ - (void)ses; - return SECRET_LEN; -} - -#ifdef WOLFSSL_EARLY_DATA -unsigned int wolfSSL_SESSION_get_max_early_data(const WOLFSSL_SESSION *session) -{ - return session->maxEarlyDataSz; -} -#endif /* WOLFSSL_EARLY_DATA */ - -#endif /* OPENSSL_EXTRA */ - typedef struct { byte verifyPeer:1; byte verifyNone:1; @@ -11367,8 +8051,9 @@ if (ssl == NULL) return; -#ifdef OPENSSL_ALL - ssl->verifyCallbackResult = v; +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ + defined(OPENSSL_ALL) + ssl->peerVerifyRet = (unsigned long)v; #else (void)v; WOLFSSL_STUB("wolfSSL_set_verify_result"); @@ -11411,7 +8096,8 @@ } return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; } -#endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && WOLFSSL_POST_HANDSHAKE_AUTH */ +#endif /* OPENSSL_EXTRA && !NO_CERTS && WOLFSSL_TLS13 && + * WOLFSSL_POST_HANDSHAKE_AUTH */ /* store user ctx for verify callback */ void wolfSSL_SetCertCbCtx(WOLFSSL* ssl, void* ctx) @@ -11508,499 +8194,6 @@ #endif /* !NO_CERTS */ -#ifndef NO_SESSION_CACHE - -WOLFSSL_ABI -WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl) -{ - WOLFSSL_ENTER("wolfSSL_get_session"); - if (ssl) { -#ifdef NO_SESSION_CACHE_REF - return ssl->session; -#else - if (ssl->options.side == WOLFSSL_CLIENT_END) { - /* On the client side we want to return a persistent reference for - * backwards compatibility. */ -#ifndef NO_CLIENT_CACHE - if (ssl->clientSession) { - return (WOLFSSL_SESSION*)ssl->clientSession; - } - else { - /* Try to add a ClientCache entry to associate with the current - * session. Ignore any session cache options. */ - int err; - const byte* id = ssl->session->sessionID; - byte idSz = ssl->session->sessionIDSz; - if (ssl->session->haveAltSessionID) { - id = ssl->session->altSessionID; - idSz = ID_LEN; - } - err = AddSessionToCache(ssl->ctx, ssl->session, id, idSz, - NULL, ssl->session->side, - #ifdef HAVE_SESSION_TICKET - ssl->session->ticketLen > 0, - #else - 0, - #endif - &ssl->clientSession); - if (err == 0) { - return (WOLFSSL_SESSION*)ssl->clientSession; - } - } -#endif - } - else { - return ssl->session; - } -#endif - } - - return NULL; -} - -/* The get1 version requires caller to call SSL_SESSION_free */ -WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl) -{ - WOLFSSL_SESSION* sess = NULL; - WOLFSSL_ENTER("wolfSSL_get1_session"); - if (ssl != NULL) { - sess = ssl->session; - if (sess != NULL) { - /* increase reference count if allocated session */ - if (sess->type == WOLFSSL_SESSION_TYPE_HEAP) { - if (wolfSSL_SESSION_up_ref(sess) != WOLFSSL_SUCCESS) - sess = NULL; - } - } - } - return sess; -} - - -/* - * Sets the session object to use when establishing a TLS/SSL session using - * the ssl object. Therefore, this function must be called before - * wolfSSL_connect. The session object to use can be obtained in a previous - * TLS/SSL connection using wolfSSL_get_session. - * - * This function rejects the session if it has been expired when this function - * is called. Note that this expiration check is wolfSSL specific and differs - * from OpenSSL return code behavior. - * - * By default, wolfSSL_set_session returns WOLFSSL_SUCCESS on successfully - * setting the session, WOLFSSL_FAILURE on failure due to the session cache - * being disabled, or the session has expired. - * - * To match OpenSSL return code behavior when session is expired, define - * OPENSSL_EXTRA and WOLFSSL_ERROR_CODE_OPENSSL. This behavior will return - * WOLFSSL_SUCCESS even when the session is expired and rejected. - */ -WOLFSSL_ABI -int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session) -{ - WOLFSSL_ENTER("wolfSSL_set_session"); - if (session) - return wolfSSL_SetSession(ssl, session); - - return WOLFSSL_FAILURE; -} - - -#ifndef NO_CLIENT_CACHE - -/* Associate client session with serverID, find existing or store for saving - if newSession flag on, don't reuse existing session - WOLFSSL_SUCCESS on ok */ -int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession) -{ - WOLFSSL_SESSION* session = NULL; - byte idHash[SERVER_ID_LEN]; - - WOLFSSL_ENTER("wolfSSL_SetServerID"); - - if (ssl == NULL || id == NULL || len <= 0) - return BAD_FUNC_ARG; - - if (len > SERVER_ID_LEN) { -#if defined(NO_SHA) && !defined(NO_SHA256) - if (wc_Sha256Hash(id, len, idHash) != 0) - return WOLFSSL_FAILURE; -#else - if (wc_ShaHash(id, len, idHash) != 0) - return WOLFSSL_FAILURE; -#endif - id = idHash; - len = SERVER_ID_LEN; - } - - if (newSession == 0) { - session = wolfSSL_GetSessionClient(ssl, id, len); - if (session) { - if (wolfSSL_SetSession(ssl, session) != WOLFSSL_SUCCESS) { - #ifdef HAVE_EXT_CACHE - wolfSSL_FreeSession(ssl->ctx, session); - #endif - WOLFSSL_MSG("wolfSSL_SetSession failed"); - session = NULL; - } - } - } - - if (session == NULL) { - WOLFSSL_MSG("Valid ServerID not cached already"); - - ssl->session->idLen = (word16)len; - XMEMCPY(ssl->session->serverID, id, len); - } -#ifdef HAVE_EXT_CACHE - else { - wolfSSL_FreeSession(ssl->ctx, session); - } -#endif - - return WOLFSSL_SUCCESS; -} - -#endif /* !NO_CLIENT_CACHE */ - -/* TODO: Add SESSION_CACHE_DYNAMIC_MEM support for PERSIST_SESSION_CACHE. - * Need a count of current sessions to get an accurate memsize (totalCount is - * not decremented when sessions are removed). - * Need to determine ideal layout for mem/filesave. - * Also need mem/filesave checking to ensure not restoring non DYNAMIC_MEM cache. - */ -#if defined(PERSIST_SESSION_CACHE) && !defined(SESSION_CACHE_DYNAMIC_MEM) - -/* for persistence, if changes to layout need to increment and modify - save_session_cache() and restore_session_cache and memory versions too */ -#define WOLFSSL_CACHE_VERSION 2 - -/* Session Cache Header information */ -typedef struct { - int version; /* cache layout version id */ - int rows; /* session rows */ - int columns; /* session columns */ - int sessionSz; /* sizeof WOLFSSL_SESSION */ -} cache_header_t; - -/* current persistence layout is: - - 1) cache_header_t - 2) SessionCache - 3) ClientCache - - update WOLFSSL_CACHE_VERSION if change layout for the following - PERSISTENT_SESSION_CACHE functions -*/ - -/* get how big the the session cache save buffer needs to be */ -int wolfSSL_get_session_cache_memsize(void) -{ - int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t)); -#ifndef NO_CLIENT_CACHE - sz += (int)(sizeof(ClientCache)); -#endif - return sz; -} - - -/* Persist session cache to memory */ -int wolfSSL_memsave_session_cache(void* mem, int sz) -{ - int i; - cache_header_t cache_header; - SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header)); - - WOLFSSL_ENTER("wolfSSL_memsave_session_cache"); - - if (sz < wolfSSL_get_session_cache_memsize()) { - WOLFSSL_MSG("Memory buffer too small"); - return BUFFER_E; - } - - cache_header.version = WOLFSSL_CACHE_VERSION; - cache_header.rows = SESSION_ROWS; - cache_header.columns = SESSIONS_PER_ROW; - cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION); - XMEMCPY(mem, &cache_header, sizeof(cache_header)); - -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_RD_LOCK(row) != 0) { - WOLFSSL_MSG("Session cache mutex lock failed"); - return BAD_MUTEX_E; - } -#endif - for (i = 0; i < cache_header.rows; ++i) { - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) { - WOLFSSL_MSG("Session row cache mutex lock failed"); - return BAD_MUTEX_E; - } - #endif - - XMEMCPY(row++, &SessionCache[i], SIZEOF_SESSION_ROW); - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[i]); - #endif - } -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(row); -#endif - -#ifndef NO_CLIENT_CACHE - if (wc_LockMutex(&clisession_mutex) != 0) { - WOLFSSL_MSG("Client cache mutex lock failed"); - return BAD_MUTEX_E; - } - XMEMCPY(row, ClientCache, sizeof(ClientCache)); - wc_UnLockMutex(&clisession_mutex); -#endif - - WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS); - - return WOLFSSL_SUCCESS; -} - - -/* Restore the persistent session cache from memory */ -int wolfSSL_memrestore_session_cache(const void* mem, int sz) -{ - int i; - cache_header_t cache_header; - SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header)); - - WOLFSSL_ENTER("wolfSSL_memrestore_session_cache"); - - if (sz < wolfSSL_get_session_cache_memsize()) { - WOLFSSL_MSG("Memory buffer too small"); - return BUFFER_E; - } - - XMEMCPY(&cache_header, mem, sizeof(cache_header)); - if (cache_header.version != WOLFSSL_CACHE_VERSION || - cache_header.rows != SESSION_ROWS || - cache_header.columns != SESSIONS_PER_ROW || - cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) { - - WOLFSSL_MSG("Session cache header match failed"); - return CACHE_MATCH_ERROR; - } - -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) { - WOLFSSL_MSG("Session cache mutex lock failed"); - return BAD_MUTEX_E; - } -#endif - for (i = 0; i < cache_header.rows; ++i) { - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) { - WOLFSSL_MSG("Session row cache mutex lock failed"); - return BAD_MUTEX_E; - } - #endif - - XMEMCPY(&SessionCache[i], row++, SIZEOF_SESSION_ROW); - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[i]); - #endif - } -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[0]); -#endif - -#ifndef NO_CLIENT_CACHE - if (wc_LockMutex(&clisession_mutex) != 0) { - WOLFSSL_MSG("Client cache mutex lock failed"); - return BAD_MUTEX_E; - } - XMEMCPY(ClientCache, row, sizeof(ClientCache)); - wc_UnLockMutex(&clisession_mutex); -#endif - - WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS); - - return WOLFSSL_SUCCESS; -} - -#if !defined(NO_FILESYSTEM) - -/* Persist session cache to file */ -/* doesn't use memsave because of additional memory use */ -int wolfSSL_save_session_cache(const char *fname) -{ - XFILE file; - int ret; - int rc = WOLFSSL_SUCCESS; - int i; - cache_header_t cache_header; - - WOLFSSL_ENTER("wolfSSL_save_session_cache"); - - file = XFOPEN(fname, "w+b"); - if (file == XBADFILE) { - WOLFSSL_MSG("Couldn't open session cache save file"); - return WOLFSSL_BAD_FILE; - } - cache_header.version = WOLFSSL_CACHE_VERSION; - cache_header.rows = SESSION_ROWS; - cache_header.columns = SESSIONS_PER_ROW; - cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION); - - /* cache header */ - ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file); - if (ret != 1) { - WOLFSSL_MSG("Session cache header file write failed"); - XFCLOSE(file); - return FWRITE_ERROR; - } - -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_RD_LOCK(&SessionCache[0]) != 0) { - WOLFSSL_MSG("Session cache mutex lock failed"); - XFCLOSE(file); - return BAD_MUTEX_E; - } -#endif - /* session cache */ - for (i = 0; i < cache_header.rows; ++i) { - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) { - WOLFSSL_MSG("Session row cache mutex lock failed"); - XFCLOSE(file); - return BAD_MUTEX_E; - } - #endif - - ret = (int)XFWRITE(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file); - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[i]); - #endif - if (ret != 1) { - WOLFSSL_MSG("Session cache member file write failed"); - rc = FWRITE_ERROR; - break; - } - } -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[0]); -#endif - -#ifndef NO_CLIENT_CACHE - /* client cache */ - if (wc_LockMutex(&clisession_mutex) != 0) { - WOLFSSL_MSG("Client cache mutex lock failed"); - XFCLOSE(file); - return BAD_MUTEX_E; - } - ret = (int)XFWRITE(ClientCache, sizeof(ClientCache), 1, file); - if (ret != 1) { - WOLFSSL_MSG("Client cache member file write failed"); - rc = FWRITE_ERROR; - } - wc_UnLockMutex(&clisession_mutex); -#endif /* !NO_CLIENT_CACHE */ - - XFCLOSE(file); - WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc); - - return rc; -} - - -/* Restore the persistent session cache from file */ -/* doesn't use memstore because of additional memory use */ -int wolfSSL_restore_session_cache(const char *fname) -{ - XFILE file; - int rc = WOLFSSL_SUCCESS; - int ret; - int i; - cache_header_t cache_header; - - WOLFSSL_ENTER("wolfSSL_restore_session_cache"); - - file = XFOPEN(fname, "rb"); - if (file == XBADFILE) { - WOLFSSL_MSG("Couldn't open session cache save file"); - return WOLFSSL_BAD_FILE; - } - /* cache header */ - ret = (int)XFREAD(&cache_header, sizeof(cache_header), 1, file); - if (ret != 1) { - WOLFSSL_MSG("Session cache header file read failed"); - XFCLOSE(file); - return FREAD_ERROR; - } - if (cache_header.version != WOLFSSL_CACHE_VERSION || - cache_header.rows != SESSION_ROWS || - cache_header.columns != SESSIONS_PER_ROW || - cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) { - - WOLFSSL_MSG("Session cache header match failed"); - XFCLOSE(file); - return CACHE_MATCH_ERROR; - } - -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) { - WOLFSSL_MSG("Session cache mutex lock failed"); - XFCLOSE(file); - return BAD_MUTEX_E; - } -#endif - /* session cache */ - for (i = 0; i < cache_header.rows; ++i) { - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) { - WOLFSSL_MSG("Session row cache mutex lock failed"); - XFCLOSE(file); - return BAD_MUTEX_E; - } - #endif - - ret = (int)XFREAD(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file); - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[i]); - #endif - if (ret != 1) { - WOLFSSL_MSG("Session cache member file read failed"); - XMEMSET(SessionCache, 0, sizeof SessionCache); - rc = FREAD_ERROR; - break; - } - } -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[0]); -#endif - -#ifndef NO_CLIENT_CACHE - /* client cache */ - if (wc_LockMutex(&clisession_mutex) != 0) { - WOLFSSL_MSG("Client cache mutex lock failed"); - XFCLOSE(file); - return BAD_MUTEX_E; - } - ret = (int)XFREAD(ClientCache, sizeof(ClientCache), 1, file); - if (ret != 1) { - WOLFSSL_MSG("Client cache member file read failed"); - XMEMSET(ClientCache, 0, sizeof ClientCache); - rc = FREAD_ERROR; - } - wc_UnLockMutex(&clisession_mutex); -#endif /* !NO_CLIENT_CACHE */ - - XFCLOSE(file); - WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc); - - return rc; -} - -#endif /* !NO_FILESYSTEM */ -#endif /* PERSIST_SESSION_CACHE && !SESSION_CACHE_DYNAMIC_MEM */ -#endif /* NO_SESSION_CACHE */ - - void wolfSSL_load_error_strings(void) { /* compatibility only */ @@ -12023,7 +8216,7 @@ { WOLFSSL_ENTER("wolfSSL_set_session_secret_cb"); if (ssl == NULL) - return WOLFSSL_FATAL_ERROR; + return WOLFSSL_FAILURE; ssl->sessionSecretCb = cb; ssl->sessionSecretCtx = ctx; @@ -12036,536 +8229,97 @@ return WOLFSSL_SUCCESS; } -#endif - - -#ifndef NO_SESSION_CACHE - -/* on by default if built in but allow user to turn off */ -WOLFSSL_ABI -long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode) +int wolfSSL_set_session_ticket_ext_cb(WOLFSSL* ssl, TicketParseCb cb, + void *ctx) { - WOLFSSL_ENTER("wolfSSL_CTX_set_session_cache_mode"); - - if (ctx == NULL) + WOLFSSL_ENTER("wolfSSL_set_session_ticket_ext_cb"); + if (ssl == NULL) return WOLFSSL_FAILURE; - if (mode == WOLFSSL_SESS_CACHE_OFF) - ctx->sessionCacheOff = 1; - - if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0) - ctx->sessionCacheFlushOff = 1; - -#ifdef HAVE_EXT_CACHE - if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0) - ctx->internalCacheOff = 1; - if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP) != 0) - ctx->internalCacheLookupOff = 1; -#endif + ssl->ticketParseCb = cb; + ssl->ticketParseCtx = ctx; return WOLFSSL_SUCCESS; } -#ifdef OPENSSL_EXTRA -/* Get the session cache mode for CTX - * - * ctx WOLFSSL_CTX struct to get cache mode from - * - * Returns a bit mask that has the session cache mode */ -long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx) +int wolfSSL_set_secret_cb(WOLFSSL* ssl, TlsSecretCb cb, void* ctx) { - long m = 0; - - WOLFSSL_ENTER("wolfSSL_CTX_get_session_cache_mode"); - - if (ctx == NULL) { - return m; - } - - if (ctx->sessionCacheOff != 1) { - m |= WOLFSSL_SESS_CACHE_SERVER; - } - - if (ctx->sessionCacheFlushOff == 1) { - m |= WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR; - } - -#ifdef HAVE_EXT_CACHE - if (ctx->internalCacheOff == 1) { - m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE; - } - if (ctx->internalCacheLookupOff == 1) { - m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP; - } -#endif - - return m; -} -#endif /* OPENSSL_EXTRA */ - -#endif /* NO_SESSION_CACHE */ - - -#if !defined(NO_CERTS) -#if defined(PERSIST_CERT_CACHE) - - -#define WOLFSSL_CACHE_CERT_VERSION 1 - -typedef struct { - int version; /* cache cert layout version id */ - int rows; /* hash table rows, CA_TABLE_SIZE */ - int columns[CA_TABLE_SIZE]; /* columns per row on list */ - int signerSz; /* sizeof Signer object */ -} CertCacheHeader; - -/* current cert persistence layout is: - - 1) CertCacheHeader - 2) caTable - - update WOLFSSL_CERT_CACHE_VERSION if change layout for the following - PERSIST_CERT_CACHE functions -*/ - - -/* Return memory needed to persist this signer, have lock */ -static WC_INLINE int GetSignerMemory(Signer* signer) -{ - int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) - + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash); - -#if !defined(NO_SKID) - sz += (int)sizeof(signer->subjectKeyIdHash); -#endif - - /* add dynamic bytes needed */ - sz += signer->pubKeySize; - sz += signer->nameLen; - - return sz; -} - - -/* Return memory needed to persist this row, have lock */ -static WC_INLINE int GetCertCacheRowMemory(Signer* row) -{ - int sz = 0; - - while (row) { - sz += GetSignerMemory(row); - row = row->next; - } - - return sz; -} - - -/* get the size of persist cert cache, have lock */ -static WC_INLINE int GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm) -{ - int sz; - int i; - - sz = sizeof(CertCacheHeader); - - for (i = 0; i < CA_TABLE_SIZE; i++) - sz += GetCertCacheRowMemory(cm->caTable[i]); - - return sz; -} - - -/* Store cert cache header columns with number of items per list, have lock */ -static WC_INLINE void SetCertHeaderColumns(WOLFSSL_CERT_MANAGER* cm, int* columns) -{ - int i; - Signer* row; - - for (i = 0; i < CA_TABLE_SIZE; i++) { - int count = 0; - row = cm->caTable[i]; - - while (row) { - ++count; - row = row->next; - } - columns[i] = count; - } -} - - -/* Restore whole cert row from memory, have lock, return bytes consumed, - < 0 on error, have lock */ -static WC_INLINE int RestoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, - int row, int listSz, const byte* end) -{ - int idx = 0; - - if (listSz < 0) { - WOLFSSL_MSG("Row header corrupted, negative value"); - return PARSE_ERROR; - } - - while (listSz) { - Signer* signer; - byte* publicKey; - byte* start = current + idx; /* for end checks on this signer */ - int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) + - sizeof(signer->nameLen) + sizeof(signer->subjectNameHash); - #ifndef NO_SKID - minSz += (int)sizeof(signer->subjectKeyIdHash); - #endif - - if (start + minSz > end) { - WOLFSSL_MSG("Would overread restore buffer"); - return BUFFER_E; - } - signer = MakeSigner(cm->heap); - if (signer == NULL) - return MEMORY_E; - - /* pubKeySize */ - XMEMCPY(&signer->pubKeySize, current + idx, sizeof(signer->pubKeySize)); - idx += (int)sizeof(signer->pubKeySize); - - /* keyOID */ - XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID)); - idx += (int)sizeof(signer->keyOID); - - /* publicKey */ - if (start + minSz + signer->pubKeySize > end) { - WOLFSSL_MSG("Would overread restore buffer"); - FreeSigner(signer, cm->heap); - return BUFFER_E; - } - publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap, - DYNAMIC_TYPE_KEY); - if (publicKey == NULL) { - FreeSigner(signer, cm->heap); - return MEMORY_E; - } - - XMEMCPY(publicKey, current + idx, signer->pubKeySize); - signer->publicKey = publicKey; - idx += signer->pubKeySize; - - /* nameLen */ - XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen)); - idx += (int)sizeof(signer->nameLen); - - /* name */ - if (start + minSz + signer->pubKeySize + signer->nameLen > end) { - WOLFSSL_MSG("Would overread restore buffer"); - FreeSigner(signer, cm->heap); - return BUFFER_E; - } - signer->name = (char*)XMALLOC(signer->nameLen, cm->heap, - DYNAMIC_TYPE_SUBJECT_CN); - if (signer->name == NULL) { - FreeSigner(signer, cm->heap); - return MEMORY_E; - } - - XMEMCPY(signer->name, current + idx, signer->nameLen); - idx += signer->nameLen; - - /* subjectNameHash */ - XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE); - idx += SIGNER_DIGEST_SIZE; - - #ifndef NO_SKID - /* subjectKeyIdHash */ - XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE); - idx += SIGNER_DIGEST_SIZE; - #endif - - signer->next = cm->caTable[row]; - cm->caTable[row] = signer; - - --listSz; - } - - return idx; -} - - -/* Store whole cert row into memory, have lock, return bytes added */ -static WC_INLINE int StoreCertRow(WOLFSSL_CERT_MANAGER* cm, byte* current, int row) -{ - int added = 0; - Signer* list = cm->caTable[row]; - - while (list) { - XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize)); - added += (int)sizeof(list->pubKeySize); - - XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID)); - added += (int)sizeof(list->keyOID); - - XMEMCPY(current + added, list->publicKey, list->pubKeySize); - added += list->pubKeySize; - - XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen)); - added += (int)sizeof(list->nameLen); - - XMEMCPY(current + added, list->name, list->nameLen); - added += list->nameLen; - - XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE); - added += SIGNER_DIGEST_SIZE; - - #ifndef NO_SKID - XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE); - added += SIGNER_DIGEST_SIZE; - #endif - - list = list->next; - } - - return added; -} - - -/* Persist cert cache to memory, have lock */ -static WC_INLINE int DoMemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, - void* mem, int sz) -{ - int realSz; - int ret = WOLFSSL_SUCCESS; - int i; - - WOLFSSL_ENTER("DoMemSaveCertCache"); - - realSz = GetCertCacheMemSize(cm); - if (realSz > sz) { - WOLFSSL_MSG("Mem output buffer too small"); - ret = BUFFER_E; - } - else { - byte* current; - CertCacheHeader hdr; - - hdr.version = WOLFSSL_CACHE_CERT_VERSION; - hdr.rows = CA_TABLE_SIZE; - SetCertHeaderColumns(cm, hdr.columns); - hdr.signerSz = (int)sizeof(Signer); - - XMEMCPY(mem, &hdr, sizeof(CertCacheHeader)); - current = (byte*)mem + sizeof(CertCacheHeader); - - for (i = 0; i < CA_TABLE_SIZE; ++i) - current += StoreCertRow(cm, current, i); - } - - return ret; -} - - -#if !defined(NO_FILESYSTEM) - -/* Persist cert cache to file */ -int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname) -{ - XFILE file; - int rc = WOLFSSL_SUCCESS; - int memSz; - byte* mem; - - WOLFSSL_ENTER("CM_SaveCertCache"); - - file = XFOPEN(fname, "w+b"); - if (file == XBADFILE) { - WOLFSSL_MSG("Couldn't open cert cache save file"); - return WOLFSSL_BAD_FILE; - } - - if (wc_LockMutex(&cm->caLock) != 0) { - WOLFSSL_MSG("wc_LockMutex on caLock failed"); - XFCLOSE(file); - return BAD_MUTEX_E; - } - - memSz = GetCertCacheMemSize(cm); - mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (mem == NULL) { - WOLFSSL_MSG("Alloc for tmp buffer failed"); - rc = MEMORY_E; - } else { - rc = DoMemSaveCertCache(cm, mem, memSz); - if (rc == WOLFSSL_SUCCESS) { - int ret = (int)XFWRITE(mem, memSz, 1, file); - if (ret != 1) { - WOLFSSL_MSG("Cert cache file write failed"); - rc = FWRITE_ERROR; - } - } - XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - } - - wc_UnLockMutex(&cm->caLock); - XFCLOSE(file); - - return rc; -} - - -/* Restore cert cache from file */ -int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname) -{ - XFILE file; - int rc = WOLFSSL_SUCCESS; - int ret; - int memSz; - byte* mem; - - WOLFSSL_ENTER("CM_RestoreCertCache"); - - file = XFOPEN(fname, "rb"); - if (file == XBADFILE) { - WOLFSSL_MSG("Couldn't open cert cache save file"); - return WOLFSSL_BAD_FILE; - } - - if(XFSEEK(file, 0, XSEEK_END) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - memSz = (int)XFTELL(file); - if(XFSEEK(file, 0, XSEEK_SET) != 0) { - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - - if (memSz > MAX_WOLFSSL_FILE_SIZE || memSz <= 0) { - WOLFSSL_MSG("CM_RestoreCertCache file size error"); - XFCLOSE(file); - return WOLFSSL_BAD_FILE; - } - - mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (mem == NULL) { - WOLFSSL_MSG("Alloc for tmp buffer failed"); - XFCLOSE(file); - return MEMORY_E; - } - - ret = (int)XFREAD(mem, memSz, 1, file); - if (ret != 1) { - WOLFSSL_MSG("Cert file read error"); - rc = FREAD_ERROR; - } else { - rc = CM_MemRestoreCertCache(cm, mem, memSz); - if (rc != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Mem restore cert cache failed"); - } - } + WOLFSSL_ENTER("wolfSSL_set_secret_cb"); + if (ssl == NULL) + return WOLFSSL_FATAL_ERROR; - XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); - XFCLOSE(file); + ssl->tlsSecretCb = cb; + ssl->tlsSecretCtx = ctx; - return rc; + return WOLFSSL_SUCCESS; } -#endif /* NO_FILESYSTEM */ - - -/* Persist cert cache to memory */ -int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used) +#ifdef SHOW_SECRETS +int tlsShowSecrets(WOLFSSL* ssl, void* secret, int secretSz, + void* ctx) { - int ret = WOLFSSL_SUCCESS; - - WOLFSSL_ENTER("CM_MemSaveCertCache"); - - if (wc_LockMutex(&cm->caLock) != 0) { - WOLFSSL_MSG("wc_LockMutex on caLock failed"); - return BAD_MUTEX_E; - } - - ret = DoMemSaveCertCache(cm, mem, sz); - if (ret == WOLFSSL_SUCCESS) - *used = GetCertCacheMemSize(cm); - - wc_UnLockMutex(&cm->caLock); - - return ret; -} - + /* Wireshark Pre-Master-Secret Format: + * CLIENT_RANDOM + */ + const char* CLIENT_RANDOM_LABEL = "CLIENT_RANDOM"; + int i, pmsPos = 0; + char pmsBuf[13 + 1 + 64 + 1 + 96 + 1 + 1]; + byte clientRandom[RAN_LEN]; + int clientRandomSz; -/* Restore cert cache from memory */ -int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz) -{ - int ret = WOLFSSL_SUCCESS; - int i; - CertCacheHeader* hdr = (CertCacheHeader*)mem; - byte* current = (byte*)mem + sizeof(CertCacheHeader); - byte* end = (byte*)mem + sz; /* don't go over */ + (void)ctx; - WOLFSSL_ENTER("CM_MemRestoreCertCache"); + clientRandomSz = (int)wolfSSL_get_client_random(ssl, clientRandom, + sizeof(clientRandom)); - if (current > end) { - WOLFSSL_MSG("Cert Cache Memory buffer too small"); - return BUFFER_E; + if (clientRandomSz <= 0) { + printf("Error getting server random %d\n", clientRandomSz); + return BAD_FUNC_ARG; } - if (hdr->version != WOLFSSL_CACHE_CERT_VERSION || - hdr->rows != CA_TABLE_SIZE || - hdr->signerSz != (int)sizeof(Signer)) { - - WOLFSSL_MSG("Cert Cache Memory header mismatch"); - return CACHE_MATCH_ERROR; + XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%s ", + CLIENT_RANDOM_LABEL); + pmsPos += XSTRLEN(CLIENT_RANDOM_LABEL) + 1; + for (i = 0; i < clientRandomSz; i++) { + XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x", + clientRandom[i]); + pmsPos += 2; } - - if (wc_LockMutex(&cm->caLock) != 0) { - WOLFSSL_MSG("wc_LockMutex on caLock failed"); - return BAD_MUTEX_E; + XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, " "); + pmsPos += 1; + for (i = 0; i < secretSz; i++) { + XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x", + ((byte*)secret)[i]); + pmsPos += 2; } + XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "\n"); + pmsPos += 1; - FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap); + /* print master secret */ + puts(pmsBuf); - for (i = 0; i < CA_TABLE_SIZE; ++i) { - int added = RestoreCertRow(cm, current, i, hdr->columns[i], end); - if (added < 0) { - WOLFSSL_MSG("RestoreCertRow error"); - ret = added; - break; + #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE) + { + FILE* f = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "a"); + if (f != XBADFILE) { + XFWRITE(pmsBuf, 1, pmsPos, f); + XFCLOSE(f); } - current += added; } - - wc_UnLockMutex(&cm->caLock); - - return ret; + #endif + return 0; } +#endif /* SHOW_SECRETS */ +#endif -/* get how big the the cert cache save buffer needs to be */ -int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm) -{ - int sz; - - WOLFSSL_ENTER("CM_GetCertCacheMemSize"); - - if (wc_LockMutex(&cm->caLock) != 0) { - WOLFSSL_MSG("wc_LockMutex on caLock failed"); - return BAD_MUTEX_E; - } - - sz = GetCertCacheMemSize(cm); - - wc_UnLockMutex(&cm->caLock); - - return sz; -} - -#endif /* PERSIST_CERT_CACHE */ -#endif /* NO_CERTS */ #ifdef OPENSSL_EXTRA /* * check if the list has TLS13 and pre-TLS13 suites * @param list cipher suite list that user want to set + * (caller required to check for NULL) * @return mixed: 0, only pre-TLS13: 1, only TLS13: 2 */ static int CheckcipherList(const char* list) @@ -12588,6 +8342,9 @@ current_length = (!next) ? (word32)XSTRLEN(current) : (word32)(next - current); + if (current_length == 0) { + break; + } if (current_length < length) { length = current_length; @@ -12595,8 +8352,10 @@ XMEMCPY(name, current, length); name[length] = 0; - if (XSTRCMP(name, "ALL") == 0 || XSTRCMP(name, "DEFAULT") == 0 || - XSTRCMP(name, "HIGH") == 0) { + if (XSTRCMP(name, "ALL") == 0 || + XSTRCMP(name, "DEFAULT") == 0 || + XSTRCMP(name, "HIGH") == 0) + { findTLSv13Suites = 1; findbeforeSuites = 1; break; @@ -12624,7 +8383,7 @@ subStrNext = XSTRSTR(subStr, "+"); if ((XSTRCMP(subStr, "ECDHE") == 0) || - (XSTRCMP(subStr, "RSA") == 0)) { + (XSTRCMP(subStr, "RSA") == 0)) { return 0; } @@ -12640,7 +8399,7 @@ return 0; } } - while (next++); /* ++ needed to skip ':' */ + while (next++); /* increment to skip ':' */ if (findTLSv13Suites == 0 && findbeforeSuites == 1) { ret = 1;/* only before TLSv13 suites */ @@ -12658,8 +8417,8 @@ * * returns WOLFSSL_SUCCESS on success and sets the cipher suite list */ -static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, Suites* suites, - const char* list) +static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + Suites* suites, const char* list) { int ret = 0; int listattribute = 0; @@ -12667,7 +8426,7 @@ #ifndef WOLFSSL_SMALL_STACK byte suitesCpy[WOLFSSL_MAX_SUITE_SZ]; #else - byte* suitesCpy; + byte* suitesCpy = NULL; #endif word16 suitesCpySz = 0; word16 i = 0; @@ -12684,7 +8443,7 @@ /* list has mixed(pre-TLSv13 and TLSv13) suites * update cipher suites the same as before */ - return (SetCipherList(ctx, suites, list)) ? WOLFSSL_SUCCESS : + return (SetCipherList_ex(ctx, ssl, suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; } else if (listattribute == 1) { @@ -12698,24 +8457,37 @@ * simulate set_ciphersuites() compatibility layer API */ tls13Only = 1; - if (!IsAtLeastTLSv1_3(ctx->method->version)) { + if ((ctx != NULL && !IsAtLeastTLSv1_3(ctx->method->version)) || + (ssl != NULL && !IsAtLeastTLSv1_3(ssl->version))) { /* Silently ignore TLS 1.3 ciphers if we don't support it. */ return WOLFSSL_SUCCESS; } } /* list contains ciphers either only for TLS 1.3 or <= TLS 1.2 */ - + if (suites->suiteSz == 0) { + WOLFSSL_MSG("Warning suites->suiteSz = 0 set to WOLFSSL_MAX_SUITE_SZ"); + suites->suiteSz = WOLFSSL_MAX_SUITE_SZ; + } #ifdef WOLFSSL_SMALL_STACK - suitesCpy = (byte*)XMALLOC(suites->suiteSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (suitesCpy == NULL) - return WOLFSSL_FAILURE; + if (suites->suiteSz > 0) { + suitesCpy = (byte*)XMALLOC(suites->suiteSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (suitesCpy == NULL) { + return WOLFSSL_FAILURE; + } + + XMEMSET(suitesCpy, 0, suites->suiteSz); + } +#else + XMEMSET(suitesCpy, 0, sizeof(suitesCpy)); #endif - XMEMCPY(suitesCpy, suites->suites, suites->suiteSz); + if (suites->suiteSz > 0) + XMEMCPY(suitesCpy, suites->suites, suites->suiteSz); suitesCpySz = suites->suiteSz; - ret = SetCipherList(ctx, suites, list); + ret = SetCipherList_ex(ctx, ssl, suites, list); if (ret != 1) { #ifdef WOLFSSL_SMALL_STACK XFREE(suitesCpy, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -12779,7 +8551,7 @@ return WOLFSSL_FAILURE; #ifdef OPENSSL_EXTRA - return wolfSSL_parse_cipher_list(ctx, ctx->suites, list); + return wolfSSL_parse_cipher_list(ctx, NULL, ctx->suites, list); #else return (SetCipherList(ctx, ctx->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; @@ -12815,9 +8587,9 @@ return WOLFSSL_FAILURE; #ifdef OPENSSL_EXTRA - return wolfSSL_parse_cipher_list(ssl->ctx, ssl->suites, list); + return wolfSSL_parse_cipher_list(NULL, ssl, ssl->suites, list); #else - return (SetCipherList(ssl->ctx, ssl->suites, list)) ? + return (SetCipherList_ex(NULL, ssl, ssl->suites, list)) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; #endif @@ -12858,7 +8630,8 @@ {TLS_PRF_LABEL_CLIENT_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_CLIENT_FINISHED)}, {TLS_PRF_LABEL_SERVER_FINISHED, XSTR_SIZEOF(TLS_PRF_LABEL_SERVER_FINISHED)}, {TLS_PRF_LABEL_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_MASTER_SECRET)}, - {TLS_PRF_LABEL_EXT_MASTER_SECRET, XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)}, + {TLS_PRF_LABEL_EXT_MASTER_SECRET, + XSTR_SIZEOF(TLS_PRF_LABEL_EXT_MASTER_SECRET)}, {TLS_PRF_LABEL_KEY_EXPANSION, XSTR_SIZEOF(TLS_PRF_LABEL_KEY_EXPANSION)}, {NULL, 0}, }; @@ -12947,8 +8720,9 @@ PRIVATE_KEY_UNLOCK(); if (wc_PRF_TLS(out, (word32)outLen, ssl->arrays->masterSecret, SECRET_LEN, - (byte*)label, (word32)labelLen, seed, seedLen, IsAtLeastTLSv1_2(ssl), - ssl->specs.mac_algorithm, ssl->heap, ssl->devId) != 0) { + (byte*)label, (word32)labelLen, seed, seedLen, + IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm, ssl->heap, + ssl->devId) != 0) { WOLFSSL_MSG("wc_PRF_TLS error"); PRIVATE_KEY_LOCK(); XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -13060,7 +8834,8 @@ #endif #ifndef NO_WOLFSSL_STUB -void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, word32 duration_ms) +void wolfSSL_DTLSv1_set_initial_timeout_duration(WOLFSSL* ssl, + word32 duration_ms) { WOLFSSL_STUB("SSL_DTLSv1_set_initial_timeout_duration"); (void)ssl; @@ -13075,7 +8850,8 @@ return BAD_FUNC_ARG; if (timeout > ssl->dtls_timeout_max) { - WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout max"); + WOLFSSL_MSG("Can't set dtls timeout init greater than dtls timeout " + "max"); return BAD_FUNC_ARG; } @@ -13262,6 +9038,7 @@ return m; } + #ifndef NO_OLD_TLS #ifdef WOLFSSL_ALLOW_SSLV3 WOLFSSL_METHOD* wolfSSLv3_method(void) { @@ -13283,6 +9060,7 @@ return m; } #endif + #endif #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */ /* client only parts */ @@ -13327,7 +9105,8 @@ (void)heap; WOLFSSL_ENTER("wolfSSLv23_client_method_ex"); if (method) { - #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512) + #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || \ + defined(WOLFSSL_SHA512) #if defined(WOLFSSL_TLS13) InitSSL_Method(method, MakeTLSv1_3()); #elif !defined(WOLFSSL_NO_TLS12) @@ -13351,7 +9130,8 @@ WOLFSSL_ABI int wolfSSL_connect(WOLFSSL* ssl) { - #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)) + #if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && \ + defined(WOLFSSL_TLS13)) int neededState; byte advanceState; #endif @@ -13384,18 +9164,22 @@ #endif #endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */ - #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13) + #if defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && \ + defined(WOLFSSL_TLS13) return wolfSSL_connect_TLSv13(ssl); #else #ifdef WOLFSSL_TLS13 - if (ssl->options.tls1_3) + if (ssl->options.tls1_3) { + WOLFSSL_MSG("TLS 1.3"); return wolfSSL_connect_TLSv13(ssl); + } #endif + WOLFSSL_MSG("TLS 1.2 or lower"); WOLFSSL_ENTER("wolfSSL_connect"); /* make sure this wolfSSL object has arrays and rng setup. Protects - * case where the WOLFSSL object is re-used via wolfSSL_clear() */ + * case where the WOLFSSL object is reused via wolfSSL_clear() */ if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) { return ret; } @@ -13455,8 +9239,8 @@ if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) { if (advanceState) { ssl->options.connectState++; - WOLFSSL_MSG("connect state: " - "Advanced from last buffered fragment send"); + WOLFSSL_MSG("connect state: Advanced from last " + "buffered fragment send"); #ifdef WOLFSSL_ASYNC_IO /* Cleanup async */ FreeAsyncCtx(ssl, 0); @@ -13509,17 +9293,20 @@ neededState = SERVER_HELLOVERIFYREQUEST_COMPLETE; #endif /* get response */ + WOLFSSL_MSG("Server state up to needed state."); while (ssl->options.serverState < neededState) { + WOLFSSL_MSG("Progressing server state..."); #ifdef WOLFSSL_TLS13 if (ssl->options.tls1_3) return wolfSSL_connect_TLSv13(ssl); #endif + WOLFSSL_MSG("ProcessReply..."); if ( (ssl->error = ProcessReply(ssl)) < 0) { WOLFSSL_ERROR(ssl->error); return WOLFSSL_FATAL_ERROR; } /* if resumption failed, reset needed state */ - else if (neededState == SERVER_FINISHED_COMPLETE) + else if (neededState == SERVER_FINISHED_COMPLETE) { if (!ssl->options.resuming) { #ifdef WOLFSSL_DTLS if (IsDtlsNotSctpMode(ssl)) @@ -13528,17 +9315,20 @@ #endif neededState = SERVER_HELLODONE_COMPLETE; } -#ifdef WOLFSSL_DTLS13 + } + WOLFSSL_MSG("ProcessReply done."); +#ifdef WOLFSSL_DTLS13 if (ssl->options.dtls && IsAtLeastTLSv1_3(ssl->version) - && ssl->dtls13Rtx.sendAcks == 1) { - ssl->dtls13Rtx.sendAcks = 0; + && ssl->dtls13Rtx.sendAcks == 1 + && ssl->options.seenUnifiedHdr) { /* we aren't negotiated the version yet, so we aren't sure * the other end can speak v1.3. On the other side we have * received a unified records, assuming that the * ServerHello got lost, we will send an empty ACK. In case * the server is a DTLS with version less than 1.3, it * should just ignore the message */ + ssl->dtls13Rtx.sendAcks = 0; if ((ssl->error = SendDtls13Ack(ssl)) < 0) { if (ssl->error == WANT_WRITE) ssl->dtls13SendingAckOrRtx = 1; @@ -13546,8 +9336,6 @@ return WOLFSSL_FATAL_ERROR; } } - - #endif /* WOLFSSL_DTLS13 */ } @@ -13644,7 +9432,7 @@ #endif #ifdef WOLFSSL_EXTRA_ALERTS if (ssl->error == NO_PEER_KEY || - ssl->error == PSK_KEY_ERROR) { + ssl->error == WC_NO_ERR_TRACE(PSK_KEY_ERROR)) { SendAlert(ssl, alert_fatal, handshake_failure); } #endif @@ -13753,7 +9541,8 @@ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION) /* This may be necessary in async so that we don't try to * renegotiate again */ - if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) { + if (ssl->secure_renegotiation && + ssl->secure_renegotiation->startScr) { ssl->secure_renegotiation->startScr = 0; } #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */ @@ -13822,7 +9611,8 @@ (void)heap; WOLFSSL_ENTER("wolfSSLv23_server_method_ex"); if (method) { - #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512) + #if !defined(NO_SHA256) || defined(WOLFSSL_SHA384) || \ + defined(WOLFSSL_SHA512) #ifdef WOLFSSL_TLS13 InitSSL_Method(method, MakeTLSv1_3()); #elif !defined(WOLFSSL_NO_TLS12) @@ -13849,7 +9639,8 @@ WOLFSSL_ABI int wolfSSL_accept(WOLFSSL* ssl) { -#if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && defined(WOLFSSL_TLS13)) +#if !(defined(WOLFSSL_NO_TLS12) && defined(NO_OLD_TLS) && \ + defined(WOLFSSL_TLS13)) word16 havePSK = 0; word16 haveAnon = 0; word16 haveMcast = 0; @@ -13883,7 +9674,7 @@ WOLFSSL_ENTER("wolfSSL_accept"); /* make sure this wolfSSL object has arrays and rng setup. Protects - * case where the WOLFSSL object is re-used via wolfSSL_clear() */ + * case where the WOLFSSL object is reused via wolfSSL_clear() */ if ((ret = ReinitSSL(ssl, ssl->ctx, 0)) != 0) { return ret; } @@ -13917,7 +9708,7 @@ (void)havePSK; #ifdef HAVE_ANON - haveAnon = ssl->options.haveAnon; + haveAnon = ssl->options.useAnon; #endif (void)haveAnon; @@ -14010,8 +9801,8 @@ ssl->options.acceptState == TICKET_SENT || ssl->options.acceptState == CHANGE_CIPHER_SENT) { ssl->options.acceptState++; - WOLFSSL_MSG("accept state: " - "Advanced from last buffered fragment send"); + WOLFSSL_MSG("accept state: Advanced from last " + "buffered fragment send"); #ifdef WOLFSSL_ASYNC_IO /* Cleanup async */ FreeAsyncCtx(ssl, 0); @@ -14064,17 +9855,6 @@ } #endif -#ifdef WOLFSSL_DTLS - if (ssl->chGoodCb != NULL && !IsSCR(ssl)) { - int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx); - if (cbret < 0) { - ssl->error = cbret; - WOLFSSL_MSG("ClientHello Good Cb don't continue error"); - return WOLFSSL_FATAL_ERROR; - } - } -#endif - ssl->options.acceptState = ACCEPT_FIRST_REPLY_DONE; WOLFSSL_MSG("accept state ACCEPT_FIRST_REPLY_DONE"); FALL_THROUGH; @@ -14150,7 +9930,8 @@ if (ssl->options.verifyPeer) { if ( (ssl->error = SendCertificateRequest(ssl)) != 0) { #ifdef WOLFSSL_CHECK_ALERT_ON_ERR - ProcessReplyEx(ssl, 1); /* See if an alert was sent. */ + /* See if an alert was sent. */ + ProcessReplyEx(ssl, 1); #endif WOLFSSL_ERROR(ssl->error); return WOLFSSL_FATAL_ERROR; @@ -14293,7 +10074,8 @@ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION) /* This may be necessary in async so that we don't try to * renegotiate again */ - if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) { + if (ssl->secure_renegotiation && + ssl->secure_renegotiation->startScr) { ssl->secure_renegotiation->startScr = 0; } #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */ @@ -14352,7 +10134,6 @@ ssl->hsDoneCb = cb; ssl->hsDoneCtx = user_ctx; - return WOLFSSL_SUCCESS; } @@ -14370,21 +10151,30 @@ WOLFSSL_ENTER("wolfSSL_Cleanup"); - if (initRefCount == 0) - return ret; /* possibly no init yet, but not failure either way */ - - if ((count_mutex_valid == 1) && (wc_LockMutex(&count_mutex) != 0)) { - WOLFSSL_MSG("Bad Lock Mutex count"); - ret = BAD_MUTEX_E; +#ifndef WOLFSSL_MUTEX_INITIALIZER + if (inits_count_mutex_valid == 1) { +#endif + if (wc_LockMutex(&inits_count_mutex) != 0) { + WOLFSSL_MSG("Bad Lock Mutex count"); + return BAD_MUTEX_E; + } +#ifndef WOLFSSL_MUTEX_INITIALIZER } +#endif - release = initRefCount-- == 1; - if (initRefCount < 0) - initRefCount = 0; + if (initRefCount > 0) { + --initRefCount; + if (initRefCount == 0) + release = 1; + } - if (count_mutex_valid == 1) { - wc_UnLockMutex(&count_mutex); +#ifndef WOLFSSL_MUTEX_INITIALIZER + if (inits_count_mutex_valid == 1) { +#endif + wc_UnLockMutex(&inits_count_mutex); +#ifndef WOLFSSL_MUTEX_INITIALIZER } +#endif if (!release) return ret; @@ -14404,7 +10194,7 @@ SessionCache[i].lock_valid = 0; } #else - if ((session_lock_valid == 1) && (wc_UnLockRwLock(&session_lock) != 0)) { + if ((session_lock_valid == 1) && (wc_FreeRwLock(&session_lock) != 0)) { if (ret == WOLFSSL_SUCCESS) ret = BAD_MUTEX_E; } @@ -14425,6 +10215,7 @@ } } #ifndef NO_CLIENT_CACHE + #ifndef WOLFSSL_MUTEX_INITIALIZER if ((clisession_mutex_valid == 1) && (wc_FreeMutex(&clisession_mutex) != 0)) { if (ret == WOLFSSL_SUCCESS) @@ -14432,13 +10223,17 @@ } clisession_mutex_valid = 0; #endif + #endif #endif /* !NO_SESSION_CACHE */ - if ((count_mutex_valid == 1) && (wc_FreeMutex(&count_mutex) != 0)) { +#ifndef WOLFSSL_MUTEX_INITIALIZER + if ((inits_count_mutex_valid == 1) && + (wc_FreeMutex(&inits_count_mutex) != 0)) { if (ret == WOLFSSL_SUCCESS) ret = BAD_MUTEX_E; } - count_mutex_valid = 0; + inits_count_mutex_valid = 0; +#endif #ifdef OPENSSL_EXTRA wolfSSL_RAND_Cleanup(); @@ -14458,11 +10253,13 @@ #endif #ifdef HAVE_GLOBAL_RNG +#ifndef WOLFSSL_MUTEX_INITIALIZER if ((globalRNGMutex_valid == 1) && (wc_FreeMutex(&globalRNGMutex) != 0)) { if (ret == WOLFSSL_SUCCESS) ret = BAD_MUTEX_E; } globalRNGMutex_valid = 0; +#endif /* !WOLFSSL_MUTEX_INITIALIZER */ #if defined(OPENSSL_EXTRA) && defined(HAVE_HASHDRBG) wolfSSL_FIPS_drbg_free(gDrbgDefCtx); @@ -14479,1690 +10276,13 @@ crypto_ex_cb_ctx_session = NULL; #endif - return ret; -} - -void SetupSession(WOLFSSL* ssl) -{ - WOLFSSL_SESSION* session = ssl->session; - - WOLFSSL_ENTER("SetupSession"); - - if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL && - !session->haveAltSessionID) { - /* Make sure the session ID is available when the user calls any - * get_session API */ - XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN); - session->sessionIDSz = ssl->arrays->sessionIDSz; - } - session->side = (byte)ssl->options.side; - if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) - XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN); - session->haveEMS = ssl->options.haveEMS; -#ifdef OPENSSL_EXTRA - /* If using compatibility layer then check for and copy over session context - * id. */ - if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) { - XMEMCPY(ssl->session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz); - session->sessionCtxSz = ssl->sessionCtxSz; - } -#endif - session->timeout = ssl->timeout; -#ifndef NO_ASN_TIME - session->bornOn = LowResTimer(); -#endif -#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ - defined(HAVE_SESSION_TICKET)) - session->version = ssl->version; -#endif -#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ - (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) - session->cipherSuite0 = ssl->options.cipherSuite0; - session->cipherSuite = ssl->options.cipherSuite; -#endif -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - session->peerVerifyRet = (byte)ssl->peerVerifyRet; -#endif - session->isSetup = 1; -} - -#ifndef NO_SESSION_CACHE - -WOLFSSL_ABI -void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm) -{ - /* static table now, no flushing needed */ - (void)ctx; - (void)tm; -} - -void wolfSSL_CTX_flush_sessions(WOLFSSL_CTX* ctx, long tm) -{ - int i, j; - byte id[ID_LEN]; - - (void)ctx; - XMEMSET(id, 0, ID_LEN); - WOLFSSL_ENTER("wolfSSL_flush_sessions"); - for (i = 0; i < SESSION_ROWS; ++i) { - if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) { - WOLFSSL_MSG("Session cache mutex lock failed"); - return; - } - for (j = 0; j < SESSIONS_PER_ROW; j++) { -#ifdef SESSION_CACHE_DYNAMIC_MEM - WOLFSSL_SESSION* s = SessionCache[i].Sessions[j]; -#else - WOLFSSL_SESSION* s = &SessionCache[i].Sessions[j]; -#endif - if ( -#ifdef SESSION_CACHE_DYNAMIC_MEM - s != NULL && -#endif - XMEMCMP(s->sessionID, id, ID_LEN) != 0 && - s->bornOn + s->timeout < (word32)tm - ) - { - EvictSessionFromCache(s); -#ifdef SESSION_CACHE_DYNAMIC_MEM - XFREE(s, s->heap, DYNAMIC_TYPE_SESSION); - SessionCache[i].Sessions[j] = NULL; -#endif - } - } - SESSION_ROW_UNLOCK(&SessionCache[i]); - } -} - - -/* set ssl session timeout in seconds */ -WOLFSSL_ABI -int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to) -{ - if (ssl == NULL) - return BAD_FUNC_ARG; - - if (to == 0) - to = WOLFSSL_SESSION_TIMEOUT; - ssl->timeout = to; - - return WOLFSSL_SUCCESS; -} - - -/** - * Sets ctx session timeout in seconds. - * The timeout value set here should be reflected in the - * "session ticket lifetime hint" if this API works in the openssl compat-layer. - * Therefore wolfSSL_CTX_set_TicketHint is called internally. - * Arguments: - * - ctx WOLFSSL_CTX object which the timeout is set to - * - to timeout value in second - * Returns: - * WOLFSSL_SUCCESS on success, BAD_FUNC_ARG on failure. - * When WOLFSSL_ERROR_CODE_OPENSSL is defined, returns previous timeout value - * on success, BAD_FUNC_ARG on failure. - */ -WOLFSSL_ABI -int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to) -{ - #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - word32 prev_timeout = 0; - #endif - - int ret = WOLFSSL_SUCCESS; - (void)ret; - - if (ctx == NULL) - ret = BAD_FUNC_ARG; - - if (ret == WOLFSSL_SUCCESS) { - #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - prev_timeout = ctx->timeout; - #endif - if (to == 0) { - ctx->timeout = WOLFSSL_SESSION_TIMEOUT; - } - else { - ctx->timeout = to; - } - } -#if defined(OPENSSL_EXTRA) && defined(HAVE_SESSION_TICKET) && \ - !defined(NO_WOLFSSL_SERVER) - if (ret == WOLFSSL_SUCCESS) { - if (to == 0) { - ret = wolfSSL_CTX_set_TicketHint(ctx, SESSION_TICKET_HINT_DEFAULT); - } - else { - ret = wolfSSL_CTX_set_TicketHint(ctx, to); - } - } -#endif /* OPENSSL_EXTRA && HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */ - -#if defined(WOLFSSL_ERROR_CODE_OPENSSL) - if (ret == WOLFSSL_SUCCESS) { - return prev_timeout; - } - else { - return ret; - } -#else - return ret; -#endif /* WOLFSSL_ERROR_CODE_OPENSSL */ -} - - -#ifndef NO_CLIENT_CACHE - -/* Get Session from Client cache based on id/len, return NULL on failure */ -WOLFSSL_SESSION* wolfSSL_GetSessionClient(WOLFSSL* ssl, const byte* id, int len) -{ - WOLFSSL_SESSION* ret = NULL; - word32 row; - int idx; - int count; - int error = 0; - ClientSession* clSess; - - WOLFSSL_ENTER("wolfSSL_GetSessionClient"); - - if (ssl->ctx->sessionCacheOff) { - WOLFSSL_MSG("Session Cache off"); - return NULL; - } - - if (ssl->options.side == WOLFSSL_SERVER_END) - return NULL; - - len = min(SERVER_ID_LEN, (word32)len); - - /* Do not access ssl->ctx->get_sess_cb from here. It is using a different - * set of ID's */ - - row = HashObject(id, len, &error) % CLIENT_SESSION_ROWS; - if (error != 0) { - WOLFSSL_MSG("Hash session failed"); - return NULL; - } - - if (wc_LockMutex(&clisession_mutex) != 0) { - WOLFSSL_MSG("Client cache mutex lock failed"); - return NULL; - } - - /* start from most recently used */ - count = min((word32)ClientCache[row].totalCount, CLIENT_SESSIONS_PER_ROW); - idx = ClientCache[row].nextIdx - 1; - if (idx < 0 || idx >= CLIENT_SESSIONS_PER_ROW) { - idx = CLIENT_SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */ - } - clSess = ClientCache[row].Clients; - - for (; count > 0; --count) { - WOLFSSL_SESSION* current; - SessionRow* sessRow; - - if (clSess[idx].serverRow >= SESSION_ROWS) { - WOLFSSL_MSG("Client cache serverRow invalid"); - break; - } - - /* lock row */ - sessRow = &SessionCache[clSess[idx].serverRow]; - if (SESSION_ROW_RD_LOCK(sessRow) != 0) { - WOLFSSL_MSG("Session cache row lock failure"); - break; - } - -#ifdef SESSION_CACHE_DYNAMIC_MEM - current = sessRow->Sessions[clSess[idx].serverIdx]; -#else - current = &sessRow->Sessions[clSess[idx].serverIdx]; -#endif - if (current && XMEMCMP(current->serverID, id, len) == 0) { - WOLFSSL_MSG("Found a serverid match for client"); - if (LowResTimer() < (current->bornOn + current->timeout)) { - WOLFSSL_MSG("Session valid"); - ret = current; - SESSION_ROW_UNLOCK(sessRow); - break; - } else { - WOLFSSL_MSG("Session timed out"); /* could have more for id */ - } - } else { - WOLFSSL_MSG("ServerID not a match from client table"); - } - SESSION_ROW_UNLOCK(sessRow); - - idx = idx > 0 ? idx - 1 : CLIENT_SESSIONS_PER_ROW - 1; - } - - wc_UnLockMutex(&clisession_mutex); - - return ret; -} - -#endif /* !NO_CLIENT_CACHE */ - -static int SslSessionCacheOff(const WOLFSSL* ssl, const WOLFSSL_SESSION* session) -{ - (void)session; - return ssl->options.sessionCacheOff - #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_FORCE_CACHE_ON_TICKET) - && session->ticketLen == 0 - #endif - ; -} - -#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ - defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) -/** - * SessionTicketNoncePrealloc() - prealloc a buffer for ticket nonces - * @output: [in] pointer to WOLFSSL_SESSION object that will soon be a - * destination of a session duplication - * @buf: [out] address of the preallocated buf - * @len: [out] len of the preallocated buf - * - * prealloc a buffer that will likely suffice to contain a ticket nonce. It's - * used when copying session under lock, when syscalls need to be avoided. If - * output already has a dynamic buffer, it's reused. - */ -static int SessionTicketNoncePrealloc(byte** buf, byte* len, void *heap) -{ - (void)heap; - - *buf = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_NONCE_LEN, heap, - DYNAMIC_TYPE_SESSION_TICK); - if (*buf == NULL) { - WOLFSSL_MSG("Failed to preallocate ticket nonce buffer"); - *len = 0; - return WOLFSSL_FAILURE; - } - - *len = PREALLOC_SESSION_TICKET_NONCE_LEN; - return 0; -} -#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */ - -static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input, - WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf, - byte* ticketNonceLen, byte* preallocUsed); - -void TlsSessionCacheUnlockRow(word32 row) -{ - SessionRow* sessRow; - - sessRow = &SessionCache[row]; - (void)sessRow; - SESSION_ROW_UNLOCK(sessRow); -} - -/* Don't use this function directly. Use TlsSessionCacheGetAndRdLock and - * TlsSessionCacheGetAndWrLock to fully utilize compiler const support. */ -static int TlsSessionCacheGetAndLock(const byte *id, - const WOLFSSL_SESSION **sess, word32 *lockedRow, byte readOnly, byte side) -{ - SessionRow *sessRow; - const WOLFSSL_SESSION *s; - word32 row; - int count; - int error; - int idx; - - *sess = NULL; - row = HashObject(id, ID_LEN, &error) % SESSION_ROWS; - if (error != 0) - return error; - sessRow = &SessionCache[row]; - if (readOnly) - error = SESSION_ROW_RD_LOCK(sessRow); - else - error = SESSION_ROW_WR_LOCK(sessRow); - if (error != 0) - return FATAL_ERROR; - - /* start from most recently used */ - count = min((word32)sessRow->totalCount, SESSIONS_PER_ROW); - idx = sessRow->nextIdx - 1; - if (idx < 0 || idx >= SESSIONS_PER_ROW) { - idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */ - } - for (; count > 0; --count) { -#ifdef SESSION_CACHE_DYNAMIC_MEM - s = sessRow->Sessions[idx]; -#else - s = &sessRow->Sessions[idx]; -#endif - if (s && XMEMCMP(s->sessionID, id, ID_LEN) == 0 && s->side == side) { - *sess = s; - break; - } - idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1; - } - if (*sess == NULL) { - SESSION_ROW_UNLOCK(sessRow); - } - else { - *lockedRow = row; - } - - return 0; -} - -int TlsSessionCacheGetAndRdLock(const byte *id, const WOLFSSL_SESSION **sess, - word32 *lockedRow, byte side) -{ - return TlsSessionCacheGetAndLock(id, sess, lockedRow, 1, side); -} - -int TlsSessionCacheGetAndWrLock(const byte *id, WOLFSSL_SESSION **sess, - word32 *lockedRow, byte side) -{ - return TlsSessionCacheGetAndLock(id, (const WOLFSSL_SESSION**)sess, - lockedRow, 0, side); -} - -int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output) -{ - const WOLFSSL_SESSION* sess = NULL; - const byte* id = NULL; - word32 row; - int error = 0; -#ifdef HAVE_SESSION_TICKET -#ifndef WOLFSSL_SMALL_STACK - byte tmpTicket[PREALLOC_SESSION_TICKET_LEN]; -#else - byte* tmpTicket = NULL; -#endif -#ifdef WOLFSSL_TLS13 - byte *preallocNonce = NULL; - byte preallocNonceLen = 0; - byte preallocNonceUsed = 0; -#endif /* WOLFSSL_TLS13 */ - byte tmpBufSet = 0; -#endif -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - WOLFSSL_X509* peer = NULL; -#endif - byte bogusID[ID_LEN]; - byte bogusIDSz = 0; - - WOLFSSL_ENTER("wolfSSL_GetSessionFromCache"); - - if (output == NULL) { - WOLFSSL_MSG("NULL output"); - return WOLFSSL_FAILURE; - } - - if (SslSessionCacheOff(ssl, ssl->session)) - return WOLFSSL_FAILURE; - - if (ssl->options.haveSessionId == 0) - return WOLFSSL_FAILURE; - -#ifdef HAVE_SESSION_TICKET - if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1) - return WOLFSSL_FAILURE; -#endif - - XMEMSET(bogusID, 0, sizeof(bogusID)); - if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) - id = ssl->arrays->sessionID; - else if (ssl->session->haveAltSessionID) { - id = ssl->session->altSessionID; - /* We want to restore the bogus ID for TLS compatibility */ - if (output == ssl->session) { - XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN); - bogusIDSz = ssl->session->sessionIDSz; - } - } - else - id = ssl->session->sessionID; - - -#ifdef HAVE_EXT_CACHE - if (ssl->ctx->get_sess_cb != NULL) { - int copy = 0; - WOLFSSL_SESSION* extSess; - /* Attempt to retrieve the session from the external cache. */ - WOLFSSL_MSG("Calling external session cache"); - extSess = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, ©); - if ((extSess != NULL) - #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) - && (IsAtLeastTLSv1_3(ssl->version) == - IsAtLeastTLSv1_3(extSess->version)) - #endif - ) { - WOLFSSL_MSG("Session found in external cache"); - error = wolfSSL_DupSession(extSess, output, 0); -#ifdef HAVE_EX_DATA - extSess->ownExData = 1; - output->ownExData = 0; -#endif - /* If copy not set then free immediately */ - if (!copy) - wolfSSL_FreeSession(ssl->ctx, extSess); - /* We want to restore the bogus ID for TLS compatibility */ - if (ssl->session->haveAltSessionID && - output == ssl->session) { - XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN); - ssl->session->sessionIDSz = bogusIDSz; - } - return error; - } - WOLFSSL_MSG("Session not found in external cache"); - } - - if (ssl->ctx->internalCacheLookupOff) { - WOLFSSL_MSG("Internal cache lookup turned off"); - return WOLFSSL_FAILURE; - } -#endif - -#ifdef HAVE_SESSION_TICKET - if (output->ticket == NULL || - output->ticketLenAlloc < PREALLOC_SESSION_TICKET_LEN) { -#ifdef WOLFSSL_SMALL_STACK - tmpTicket = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_LEN, output->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (tmpTicket == NULL) { - WOLFSSL_MSG("tmpTicket malloc failed"); - return WOLFSSL_FAILURE; - } -#endif - if (output->ticketLenAlloc) - XFREE(output->ticket, output->heap, DYNAMIC_TYPE_SESSION_TICK); - output->ticket = tmpTicket; - output->ticketLenAlloc = PREALLOC_SESSION_TICKET_LEN; - output->ticketLen = 0; - tmpBufSet = 1; - } -#endif - -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - if (output->peer != NULL) { - wolfSSL_X509_free(output->peer); - output->peer = NULL; - } -#endif - -#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) && \ - defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (output->ticketNonce.data != output->ticketNonce.dataStatic) { - XFREE(output->ticketNonce.data, output->heap, - DYNAMIC_TYPE_SESSION_TICK); - output->ticketNonce.data = output->ticketNonce.dataStatic; - output->ticketNonce.len = 0; - } - error = SessionTicketNoncePrealloc(&preallocNonce, &preallocNonceLen, - output->heap); - if (error != 0) { - if (tmpBufSet) { - output->ticket = output->staticTicket; - output->ticketLenAlloc = 0; - } -#ifdef WOLFSSL_SMALL_STACK - if (tmpTicket != NULL) - XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER); -#endif - return WOLFSSL_FAILURE; - } -#endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET*/ - - /* init to avoid clang static analyzer false positive */ - row = 0; - error = TlsSessionCacheGetAndRdLock(id, &sess, &row, (byte)ssl->options.side); - error = (error == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; - if (error != WOLFSSL_SUCCESS || sess == NULL) { - WOLFSSL_MSG("Get Session from cache failed"); - error = WOLFSSL_FAILURE; -#ifdef HAVE_SESSION_TICKET - if (tmpBufSet) { - output->ticket = output->staticTicket; - output->ticketLenAlloc = 0; - } -#ifdef WOLFSSL_TLS13 - if (preallocNonce != NULL) { - XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK); - preallocNonce = NULL; - } -#endif /* WOLFSSL_TLS13 */ -#ifdef WOLFSSL_SMALL_STACK - if (tmpTicket != NULL) { - XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER); - tmpTicket = NULL; - } -#endif -#endif - } - else { -#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) - if (IsAtLeastTLSv1_3(ssl->version) != IsAtLeastTLSv1_3(sess->version)) { - WOLFSSL_MSG("Invalid session: different protocol version"); - TlsSessionCacheUnlockRow(row); - error = WOLFSSL_FAILURE; - } - else if (LowResTimer() >= (sess->bornOn + sess->timeout)) { - WOLFSSL_SESSION* wrSess = NULL; - WOLFSSL_MSG("Invalid session: timed out"); - sess = NULL; - TlsSessionCacheUnlockRow(row); - /* Attempt to get a write lock */ - error = TlsSessionCacheGetAndWrLock(id, &wrSess, &row, - ssl->options.side); - if (error == 0 && wrSess != NULL) { - EvictSessionFromCache(wrSess); - TlsSessionCacheUnlockRow(row); - } - error = WOLFSSL_FAILURE; - } -#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */ - } - - if (error == WOLFSSL_SUCCESS) { -#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) - error = wolfSSL_DupSessionEx(sess, output, 1, - preallocNonce, &preallocNonceLen, &preallocNonceUsed); -#else - error = wolfSSL_DupSession(sess, output, 1); -#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */ -#ifdef HAVE_EX_DATA - output->ownExData = !sess->ownExData; /* Session may own ex_data */ -#endif - TlsSessionCacheUnlockRow(row); - } - - /* We want to restore the bogus ID for TLS compatibility */ - if (ssl->session->haveAltSessionID && - output == ssl->session) { - XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN); - ssl->session->sessionIDSz = bogusIDSz; - } - -#ifdef HAVE_SESSION_TICKET - if (tmpBufSet) { - if (error == WOLFSSL_SUCCESS) { - if (output->ticketLen > SESSION_TICKET_LEN) { - output->ticket = (byte*)XMALLOC(output->ticketLen, output->heap, - DYNAMIC_TYPE_SESSION_TICK); - if (output->ticket == NULL) { - error = WOLFSSL_FAILURE; - output->ticket = output->staticTicket; - output->ticketLenAlloc = 0; - output->ticketLen = 0; - } - } - else { - output->ticket = output->staticTicket; - output->ticketLenAlloc = 0; - } - } - else { - output->ticket = output->staticTicket; - output->ticketLenAlloc = 0; - output->ticketLen = 0; - } - if (error == WOLFSSL_SUCCESS) { - XMEMCPY(output->ticket, tmpTicket, output->ticketLen); - } - } -#ifdef WOLFSSL_SMALL_STACK - if (tmpTicket != NULL) - XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER); -#endif - -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (error == WOLFSSL_SUCCESS && preallocNonceUsed) { - if (preallocNonceLen < PREALLOC_SESSION_TICKET_NONCE_LEN) { - /* buffer bigger than needed */ -#ifndef XREALLOC - output->ticketNonce.data = (byte*)XMALLOC(preallocNonceLen, - output->heap, DYNAMIC_TYPE_SESSION_TICK); - if (output->ticketNonce.data != NULL) - XMEMCPY(output->ticketNonce.data, preallocNonce, - preallocNonceLen); - XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK); - preallocNonce = NULL; -#else - output->ticketNonce.data = XREALLOC(preallocNonce, - preallocNonceLen, output->heap, DYNAMIC_TYPE_SESSION_TICK); - if (output->ticketNonce.data != NULL) { - /* don't free the reallocated pointer */ - preallocNonce = NULL; - } -#endif /* !XREALLOC */ - if (output->ticketNonce.data == NULL) { - output->ticketNonce.data = output->ticketNonce.dataStatic; - output->ticketNonce.len = 0; - error = WOLFSSL_FAILURE; - /* preallocNonce will be free'd after the if */ - } - } - else { - output->ticketNonce.data = preallocNonce; - output->ticketNonce.len = preallocNonceLen; - preallocNonce = NULL; - } - } - if (preallocNonce != NULL) - XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK); -#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ - -#endif - -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - if (peer != NULL) { - wolfSSL_X509_free(peer); - } +#ifdef WOLFSSL_MEM_FAIL_COUNT + wc_MemFailCount_Free(); #endif - return error; -} - -WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret, - byte restoreSessionCerts) -{ - WOLFSSL_SESSION* ret = NULL; - - (void)restoreSessionCerts; /* Kept for compatibility */ - - if (wolfSSL_GetSessionFromCache(ssl, ssl->session) == WOLFSSL_SUCCESS) { - ret = ssl->session; - } - else { - WOLFSSL_MSG("wolfSSL_GetSessionFromCache did not return a session"); - } - - if (ret != NULL && masterSecret != NULL) - XMEMCPY(masterSecret, ret->masterSecret, SECRET_LEN); - return ret; } -int wolfSSL_SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session) -{ - SessionRow* sessRow = NULL; - int ret = WOLFSSL_SUCCESS; - - session = ClientSessionToSession(session); - - if (ssl == NULL || session == NULL || !session->isSetup) { - WOLFSSL_MSG("ssl or session NULL or not set up"); - return WOLFSSL_FAILURE; - } - - /* We need to lock the session as the first step if its in the cache */ - if (session->type == WOLFSSL_SESSION_TYPE_CACHE) { - if (session->cacheRow < SESSION_ROWS) { - sessRow = &SessionCache[session->cacheRow]; - if (SESSION_ROW_RD_LOCK(sessRow) != 0) { - WOLFSSL_MSG("Session row lock failed"); - return WOLFSSL_FAILURE; - } - } - } - - if (ret == WOLFSSL_SUCCESS && ssl->options.side != WOLFSSL_NEITHER_END && - (byte)ssl->options.side != session->side) { - WOLFSSL_MSG("Setting session for wrong role"); - ret = WOLFSSL_FAILURE; - } - - if (ret == WOLFSSL_SUCCESS) { - if (ssl->session == session) { - WOLFSSL_MSG("ssl->session and session same"); - } - else -#ifdef HAVE_STUNNEL - /* stunnel depends on the ex_data not being duplicated. Copy OpenSSL - * behaviour for now. */ - if (session->type != WOLFSSL_SESSION_TYPE_CACHE) { - if (wolfSSL_SESSION_up_ref(session) == WOLFSSL_SUCCESS) { - wolfSSL_FreeSession(ssl->ctx, ssl->session); - ssl->session = session; - } - else - ret = WOLFSSL_FAILURE; - } - else -#endif - { - ret = wolfSSL_DupSession(session, ssl->session, 0); - if (ret != WOLFSSL_SUCCESS) - WOLFSSL_MSG("Session duplicate failed"); - } - } - - /* Let's copy over the altSessionID for local cache purposes */ - if (ret == WOLFSSL_SUCCESS && session->haveAltSessionID && - ssl->session != session) { - ssl->session->haveAltSessionID = 1; - XMEMCPY(ssl->session->altSessionID, session->altSessionID, ID_LEN); - } - - if (sessRow != NULL) { - SESSION_ROW_UNLOCK(sessRow); - sessRow = NULL; - } - - /* Note: the `session` variable cannot be used below, since the row is - * un-locked */ - - if (ret != WOLFSSL_SUCCESS) - return ret; - -#ifdef OPENSSL_EXTRA - /* check for application context id */ - if (ssl->sessionCtxSz > 0) { - if (XMEMCMP(ssl->sessionCtx, ssl->session->sessionCtx, ssl->sessionCtxSz)) { - /* context id did not match! */ - WOLFSSL_MSG("Session context did not match"); - return WOLFSSL_FAILURE; - } - } -#endif /* OPENSSL_EXTRA */ - - if (LowResTimer() >= (ssl->session->bornOn + ssl->session->timeout)) { -#if !defined(OPENSSL_EXTRA) || !defined(WOLFSSL_ERROR_CODE_OPENSSL) - return WOLFSSL_FAILURE; /* session timed out */ -#else /* defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL) */ - WOLFSSL_MSG("Session is expired but return success for " - "OpenSSL compatibility"); -#endif - } - ssl->options.resuming = 1; - ssl->options.haveEMS = ssl->session->haveEMS; - -#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ - defined(HAVE_SESSION_TICKET)) - ssl->version = ssl->session->version; - if (IsAtLeastTLSv1_3(ssl->version)) - ssl->options.tls1_3 = 1; -#endif -#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ - (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) - ssl->options.cipherSuite0 = ssl->session->cipherSuite0; - ssl->options.cipherSuite = ssl->session->cipherSuite; -#endif -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - ssl->peerVerifyRet = (unsigned long)ssl->session->peerVerifyRet; -#endif - - return WOLFSSL_SUCCESS; -} - - -#ifdef WOLFSSL_SESSION_STATS -static int get_locked_session_stats(word32* active, word32* total, - word32* peak); -#endif - -#ifndef NO_CLIENT_CACHE -ClientSession* AddSessionToClientCache(int side, int row, int idx, byte* serverID, - word16 idLen, const byte* sessionID, - word16 useTicket) -{ - int error = -1; - word32 clientRow = 0, clientIdx = 0; - (void)useTicket; - if (side == WOLFSSL_CLIENT_END - && row != INVALID_SESSION_ROW - && (idLen -#ifdef HAVE_SESSION_TICKET - || useTicket == 1 -#endif - || serverID != NULL - )) { - - WOLFSSL_MSG("Trying to add client cache entry"); - - if (idLen) { - clientRow = HashObject(serverID, - idLen, &error) % CLIENT_SESSION_ROWS; - } - else if (serverID != NULL) { - clientRow = HashObject(sessionID, - ID_LEN, &error) % CLIENT_SESSION_ROWS; - } - else { - error = -1; - } - if (error == 0 && wc_LockMutex(&clisession_mutex) == 0) { - clientIdx = ClientCache[clientRow].nextIdx; - if (clientIdx < CLIENT_SESSIONS_PER_ROW) { - ClientCache[clientRow].Clients[clientIdx].serverRow = - (word16)row; - ClientCache[clientRow].Clients[clientIdx].serverIdx = - (word16)idx; - if (sessionID != NULL) { - word32 sessionIDHash = HashObject(sessionID, ID_LEN, - &error); - if (error == 0) { - ClientCache[clientRow].Clients[clientIdx].sessionIDHash - = sessionIDHash; - } - } - } - else { - error = -1; - ClientCache[clientRow].nextIdx = 0; /* reset index as safety */ - WOLFSSL_MSG("Invalid client cache index! " - "Possible corrupted memory"); - } - if (error == 0) { - WOLFSSL_MSG("Adding client cache entry"); - if (ClientCache[clientRow].totalCount < CLIENT_SESSIONS_PER_ROW) - ClientCache[clientRow].totalCount++; - ClientCache[clientRow].nextIdx++; - ClientCache[clientRow].nextIdx %= CLIENT_SESSIONS_PER_ROW; - } - - wc_UnLockMutex(&clisession_mutex); - } - else { - WOLFSSL_MSG("Hash session or lock failed"); - error = -1; - } - } - else { - WOLFSSL_MSG("Skipping client cache"); - } - if (error == 0) - return &ClientCache[clientRow].Clients[clientIdx]; - else - return NULL; -} -#endif /* !NO_CLIENT_CACHE */ - -/** - * For backwards compatibility, this API needs to be used in *ALL* functions - * that access the WOLFSSL_SESSION members directly. - * - * This API checks if the passed in session is actually a ClientSession object - * and returns the matching session cache object. Otherwise just return the - * input. ClientSession objects only occur in the ClientCache. They are not - * allocated anywhere else. - */ -WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session) -{ - WOLFSSL_ENTER("ClientSessionToSession"); -#ifdef NO_SESSION_CACHE_REF - return (WOLFSSL_SESSION*)session; -#else -#ifndef NO_CLIENT_CACHE - if (session == NULL) - return NULL; - /* Check if session points into ClientCache */ - if ((byte*)session >= (byte*)ClientCache && - /* Cast to byte* to make pointer arithmetic work per byte */ - (byte*)session < ((byte*)ClientCache) + sizeof(ClientCache)) { - ClientSession* clientSession = (ClientSession*)session; - SessionRow* sessRow = NULL; - WOLFSSL_SESSION* cacheSession = NULL; - word32 sessionIDHash = 0; - int error = 0; - session = NULL; /* Default to NULL for failure case */ - if (wc_LockMutex(&clisession_mutex) != 0) { - WOLFSSL_MSG("Client cache mutex lock failed"); - return NULL; - } - if (clientSession->serverRow >= SESSION_ROWS || - clientSession->serverIdx >= SESSIONS_PER_ROW) { - WOLFSSL_MSG("Client cache serverRow or serverIdx invalid"); - error = -1; - } - if (error == 0) { - /* Lock row */ - sessRow = &SessionCache[clientSession->serverRow]; - error = SESSION_ROW_RD_LOCK(sessRow); - if (error != 0) { - WOLFSSL_MSG("Session cache row lock failure"); - sessRow = NULL; - } - } - if (error == 0) { -#ifdef SESSION_CACHE_DYNAMIC_MEM - cacheSession = sessRow->Sessions[clientSession->serverIdx]; -#else - cacheSession = &sessRow->Sessions[clientSession->serverIdx]; -#endif - if (cacheSession && cacheSession->sessionIDSz == 0) { - cacheSession = NULL; - WOLFSSL_MSG("Session cache entry not set"); - error = -1; - } - } - if (error == 0) { - /* Calculate the hash of the session ID */ - sessionIDHash = HashObject(cacheSession->sessionID, ID_LEN, - &error); - } - if (error == 0) { - /* Check the session ID hash matches */ - error = clientSession->sessionIDHash != sessionIDHash; - if (error != 0) - WOLFSSL_MSG("session ID hash don't match"); - } - if (error == 0) { - /* Hashes match */ - session = cacheSession; - WOLFSSL_MSG("Found session cache matching client session object"); - } - if (sessRow != NULL) { - SESSION_ROW_UNLOCK(sessRow); - } - wc_UnLockMutex(&clisession_mutex); - return (WOLFSSL_SESSION*)session; - } - else { - /* Plain WOLFSSL_SESSION object */ - return (WOLFSSL_SESSION*)session; - } -#else - return (WOLFSSL_SESSION*)session; -#endif -#endif -} - -int AddSessionToCache(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* addSession, - const byte* id, byte idSz, int* sessionIndex, int side, - word16 useTicket, ClientSession** clientCacheEntry) -{ - WOLFSSL_SESSION* cacheSession = NULL; - SessionRow* sessRow = NULL; - word32 idx = 0; -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - WOLFSSL_X509* cachePeer = NULL; - WOLFSSL_X509* addPeer = NULL; -#endif -#ifdef HAVE_SESSION_TICKET - byte* cacheTicBuff = NULL; - byte ticBuffUsed = 0; - byte* ticBuff = NULL; - int ticLen = 0; -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - byte *preallocNonce = NULL; - byte preallocNonceLen = 0; - byte preallocNonceUsed = 0; - byte *toFree = NULL; -#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC */ -#endif /* HAVE_SESSION_TICKET */ - int ret = 0; - int row; - int i; - int overwrite = 0; - (void)ctx; - (void)sessionIndex; - (void)useTicket; - (void)clientCacheEntry; - - WOLFSSL_ENTER("AddSessionToCache"); - - if (idSz == 0) { - WOLFSSL_MSG("AddSessionToCache idSz == 0"); - return BAD_FUNC_ARG; - } - - addSession = ClientSessionToSession(addSession); - if (addSession == NULL) { - WOLFSSL_MSG("AddSessionToCache is NULL"); - return MEMORY_E; - } - -#ifdef HAVE_SESSION_TICKET - ticLen = addSession->ticketLen; - /* Alloc Memory here to avoid syscalls during lock */ - if (ticLen > SESSION_TICKET_LEN) { - ticBuff = (byte*)XMALLOC(ticLen, NULL, - DYNAMIC_TYPE_SESSION_TICK); - if (ticBuff == NULL) { - return MEMORY_E; - } - } -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (addSession->ticketNonce.data != addSession->ticketNonce.dataStatic) { - /* use the AddSession->heap even if the buffer maybe saved in - * CachedSession objects. CachedSession heap and AddSession heap should - * be the same */ - preallocNonce = (byte*)XMALLOC(addSession->ticketNonce.len, - addSession->heap, DYNAMIC_TYPE_SESSION_TICK); - if (preallocNonce == NULL) { - if (ticBuff != NULL) - XFREE(ticBuff, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); - return MEMORY_E; - } - preallocNonceLen = addSession->ticketNonce.len; - } -#endif /* WOLFSSL_TLS13 && WOLFSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */ -#endif /* HAVE_SESSION_TICKET */ - - /* Find a position for the new session in cache and use that */ - /* Use the session object in the cache for external cache if required */ - row = (int)(HashObject(id, ID_LEN, &ret) % SESSION_ROWS); - if (ret != 0) { - WOLFSSL_MSG("Hash session failed"); - #ifdef HAVE_SESSION_TICKET - XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); - #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKE_NONCE_MALLOC) - if (preallocNonce != NULL) - XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); - #endif - #endif - return ret; - } - - sessRow = &SessionCache[row]; - if (SESSION_ROW_WR_LOCK(sessRow) != 0) { - #ifdef HAVE_SESSION_TICKET - XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); - #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKE_NONCE_MALLOC) - if (preallocNonce != NULL) - XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); - #endif - #endif - WOLFSSL_MSG("Session row lock failed"); - return BAD_MUTEX_E; - } - - for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) { -#ifdef SESSION_CACHE_DYNAMIC_MEM - cacheSession = sessRow->Sessions[i]; -#else - cacheSession = &sessRow->Sessions[i]; -#endif - if (cacheSession && XMEMCMP(id, - cacheSession->sessionID, ID_LEN) == 0 && - cacheSession->side == side) { - WOLFSSL_MSG("Session already exists. Overwriting."); - overwrite = 1; - idx = i; - break; - } - } - - if (!overwrite) - idx = sessRow->nextIdx; -#ifdef SESSION_INDEX - if (sessionIndex != NULL) - *sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx; -#endif - -#ifdef SESSION_CACHE_DYNAMIC_MEM - cacheSession = sessRow->Sessions[idx]; - if (cacheSession == NULL) { - cacheSession = (WOLFSSL_SESSION*) XMALLOC(sizeof(WOLFSSL_SESSION), - sessRow->heap, DYNAMIC_TYPE_SESSION); - if (cacheSession == NULL) { - #ifdef HAVE_SESSION_TICKET - XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); - #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKE_NONCE_MALLOC) - if (preallocNonce != NULL) - XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); - #endif - #endif - SESSION_ROW_UNLOCK(sessRow); - return MEMORY_E; - } - XMEMSET(cacheSession, 0, sizeof(WOLFSSL_SESSION)); - sessRow->Sessions[idx] = cacheSession; - } -#else - cacheSession = &sessRow->Sessions[idx]; -#endif - -#ifdef HAVE_EX_DATA - if (overwrite) { - /* Figure out who owns the ex_data */ - if (cacheSession->ownExData) { - /* Prioritize cacheSession copy */ - XMEMCPY(&addSession->ex_data, &cacheSession->ex_data, - sizeof(WOLFSSL_CRYPTO_EX_DATA)); - } - /* else will be copied in wolfSSL_DupSession call */ - } - else if (cacheSession->ownExData) { - crypto_ex_cb_free_data(cacheSession, crypto_ex_cb_ctx_session, - &cacheSession->ex_data); - cacheSession->ownExData = 0; - } -#endif - - if (!overwrite) - EvictSessionFromCache(cacheSession); - - cacheSession->type = WOLFSSL_SESSION_TYPE_CACHE; - cacheSession->cacheRow = row; - -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - /* Save the peer field to free after unlocking the row */ - if (cacheSession->peer != NULL) - cachePeer = cacheSession->peer; - cacheSession->peer = NULL; -#endif -#ifdef HAVE_SESSION_TICKET - /* If we can re-use the existing buffer in cacheSession then we won't touch - * ticBuff at all making it a very cheap malloc/free. The page on a modern - * OS will most likely not even be allocated to the process. */ - if (ticBuff != NULL && cacheSession->ticketLenAlloc < ticLen) { - /* Save pointer only if separately allocated */ - if (cacheSession->ticket != cacheSession->staticTicket) - cacheTicBuff = cacheSession->ticket; - ticBuffUsed = 1; - cacheSession->ticket = ticBuff; - cacheSession->ticketLenAlloc = (word16) ticLen; - } -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - /* cache entry never used */ - if (cacheSession->ticketNonce.data == NULL) - cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic; - - if (cacheSession->ticketNonce.data != - cacheSession->ticketNonce.dataStatic) { - toFree = cacheSession->ticketNonce.data; - cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic; - cacheSession->ticketNonce.len = 0; - } -#endif /* WOFLSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ -#endif -#ifdef SESSION_CERTS - if (overwrite && - addSession->chain.count == 0 && - cacheSession->chain.count > 0) { - /* Copy in the certs from the session */ - addSession->chain.count = cacheSession->chain.count; - XMEMCPY(addSession->chain.certs, cacheSession->chain.certs, - sizeof(x509_buffer) * cacheSession->chain.count); - } -#endif /* SESSION_CERTS */ -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - /* Don't copy the peer cert into cache */ - addPeer = addSession->peer; - addSession->peer = NULL; -#endif - cacheSession->heap = NULL; - /* Copy data into the cache object */ -#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ - defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - ret = wolfSSL_DupSessionEx(addSession, cacheSession, 1, preallocNonce, - &preallocNonceLen, &preallocNonceUsed) == WOLFSSL_FAILURE; -#else - ret = wolfSSL_DupSession(addSession, cacheSession, 1) == WOLFSSL_FAILURE; -#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC - && FIPS_VERSION_GE(5,3)*/ -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - addSession->peer = addPeer; -#endif - - if (ret == 0) { - if (!overwrite) { - /* Increment the totalCount and the nextIdx */ - if (sessRow->totalCount < SESSIONS_PER_ROW) - sessRow->totalCount++; - sessRow->nextIdx = (sessRow->nextIdx + 1) % SESSIONS_PER_ROW; - } - if (id != addSession->sessionID) { - /* ssl->session->sessionID may contain the bogus ID or we want the - * ID from the arrays object */ - XMEMCPY(cacheSession->sessionID, id, ID_LEN); - cacheSession->sessionIDSz = ID_LEN; - } -#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) - if (ctx->rem_sess_cb != NULL) - cacheSession->rem_sess_cb = ctx->rem_sess_cb; -#endif -#ifdef HAVE_EX_DATA - /* The session in cache now owns the ex_data */ - addSession->ownExData = 0; - cacheSession->ownExData = 1; -#endif -#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ - defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (preallocNonce != NULL && preallocNonceUsed) { - cacheSession->ticketNonce.data = preallocNonce; - cacheSession->ticketNonce.len = preallocNonceLen; - preallocNonce = NULL; - preallocNonceLen = 0; - } -#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC - * && FIPS_VERSION_GE(5,3)*/ - } -#ifdef HAVE_SESSION_TICKET - else if (ticBuffUsed) { - /* Error occurred. Need to clean up the ticket buffer. */ - cacheSession->ticket = cacheSession->staticTicket; - cacheSession->ticketLenAlloc = 0; - cacheSession->ticketLen = 0; - } -#endif - SESSION_ROW_UNLOCK(sessRow); - cacheSession = NULL; /* Can't access after unlocked */ - -#ifndef NO_CLIENT_CACHE - if (ret == 0 && clientCacheEntry != NULL) { - ClientSession* clientCache = AddSessionToClientCache(side, row, idx, - addSession->serverID, addSession->idLen, id, useTicket); - if (clientCache != NULL) - *clientCacheEntry = clientCache; - } -#endif - -#ifdef HAVE_SESSION_TICKET - if (ticBuff != NULL && !ticBuffUsed) - XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); - if (cacheTicBuff != NULL) - XFREE(cacheTicBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (preallocNonce != NULL) - XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); - if (toFree != NULL) - XFREE(toFree, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); -#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ -#endif - -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - if (cachePeer != NULL) { - wolfSSL_X509_free(cachePeer); - cachePeer = NULL; /* Make sure not use after this point */ - } -#endif - - return ret; -} - -void AddSession(WOLFSSL* ssl) -{ - int error = 0; - const byte* id = NULL; - byte idSz = 0; - WOLFSSL_SESSION* session = ssl->session; - - (void)error; - - WOLFSSL_ENTER("AddSession"); - - if (SslSessionCacheOff(ssl, session)) { - WOLFSSL_MSG("Cache off"); - return; - } - - if (session->haveAltSessionID) { - id = session->altSessionID; - idSz = ID_LEN; - } - else { - id = session->sessionID; - idSz = session->sessionIDSz; - } - - /* Do this only for the client because if the server doesn't have an ID at - * this point, it won't on resumption. */ - if (idSz == 0 && ssl->options.side == WOLFSSL_CLIENT_END) { - WC_RNG* rng = NULL; - if (ssl->rng != NULL) - rng = ssl->rng; -#if defined(HAVE_GLOBAL_RNG) && defined(OPENSSL_EXTRA) - else if (initGlobalRNG == 1 || wolfSSL_RAND_Init() == WOLFSSL_SUCCESS) { - rng = &globalRNG; - } -#endif - if (wc_RNG_GenerateBlock(rng, ssl->session->altSessionID, - ID_LEN) != 0) - return; - ssl->session->haveAltSessionID = 1; - id = ssl->session->altSessionID; - idSz = ID_LEN; - } - - /* Try to add the session to internal cache or external cache - if a new_sess_cb is set. Its ok if we don't succeed. */ - (void)AddSessionToCache(ssl->ctx, session, id, idSz, -#ifdef SESSION_INDEX - &ssl->sessionIndex, -#else - NULL, -#endif - ssl->options.side, -#ifdef HAVE_SESSION_TICKET - ssl->options.useTicket, -#else - 0, -#endif -#ifdef NO_SESSION_CACHE_REF - NULL -#else - (ssl->options.side == WOLFSSL_CLIENT_END) ? - &ssl->clientSession : NULL -#endif - ); - -#ifdef HAVE_EXT_CACHE - if (error == 0 && ssl->ctx->new_sess_cb != NULL) { - int cbRet = 0; - wolfSSL_SESSION_up_ref(session); - cbRet = ssl->ctx->new_sess_cb(ssl, session); - if (cbRet == 0) - wolfSSL_FreeSession(ssl->ctx, session); - } -#endif - -#if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) - if (error == 0) { - word32 active = 0; - - error = get_locked_session_stats(&active, NULL, NULL); - if (error == WOLFSSL_SUCCESS) { - error = 0; /* back to this function ok */ - - if (PeakSessions < active) { - PeakSessions = active; - } - } - } -#endif /* WOLFSSL_SESSION_STATS && WOLFSSL_PEAK_SESSIONS */ - (void)error; -} - - -#ifdef SESSION_INDEX - -int wolfSSL_GetSessionIndex(WOLFSSL* ssl) -{ - WOLFSSL_ENTER("wolfSSL_GetSessionIndex"); - WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex); - return ssl->sessionIndex; -} - - -int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session) -{ - int row, col, result = WOLFSSL_FAILURE; - SessionRow* sessRow; - WOLFSSL_SESSION* cacheSession; - - WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex"); - - session = ClientSessionToSession(session); - - row = idx >> SESSIDX_ROW_SHIFT; - col = idx & SESSIDX_IDX_MASK; - - if (session == NULL || - row < 0 || row >= SESSION_ROWS || col >= SESSIONS_PER_ROW) { - return WOLFSSL_FAILURE; - } - - sessRow = &SessionCache[row]; - if (SESSION_ROW_RD_LOCK(sessRow) != 0) { - return BAD_MUTEX_E; - } - -#ifdef SESSION_CACHE_DYNAMIC_MEM - cacheSession = sessRow->Sessions[col]; -#else - cacheSession = &sessRow->Sessions[col]; -#endif - if (cacheSession) { - XMEMCPY(session, cacheSession, sizeof(WOLFSSL_SESSION)); - result = WOLFSSL_SUCCESS; - } - else { - result = WOLFSSL_FAILURE; - } - - SESSION_ROW_UNLOCK(sessRow); - - WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result); - return result; -} - -#endif /* SESSION_INDEX */ - -#if defined(SESSION_CERTS) - -WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session) -{ - WOLFSSL_X509_CHAIN* chain = NULL; - - WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain"); - - session = ClientSessionToSession(session); - - if (session) - chain = &session->chain; - - WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0); - return chain; -} - - -#ifdef OPENSSL_EXTRA -/* gets the peer certificate associated with the session passed in - * returns null on failure, the caller should not free the returned pointer */ -WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain"); - - session = ClientSessionToSession(session); - if (session) { - int count; - - count = wolfSSL_get_chain_count(&session->chain); - if (count < 1 || count >= MAX_CHAIN_DEPTH) { - WOLFSSL_MSG("bad count found"); - return NULL; - } - - if (session->peer == NULL) { - session->peer = wolfSSL_get_chain_X509(&session->chain, 0); - } - return session->peer; - } - WOLFSSL_MSG("No session passed in"); - - return NULL; -} -#endif /* OPENSSL_EXTRA */ -#endif /* SESSION_INDEX && SESSION_CERTS */ - - -#ifdef WOLFSSL_SESSION_STATS - -static int get_locked_session_stats(word32* active, word32* total, word32* peak) -{ - int result = WOLFSSL_SUCCESS; - int i; - int count; - int idx; - word32 now = 0; - word32 seen = 0; - word32 ticks = LowResTimer(); - - WOLFSSL_ENTER("get_locked_session_stats"); - -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_RD_LOCK(&SessionCache[0]); -#endif - for (i = 0; i < SESSION_ROWS; i++) { - SessionRow* row = &SessionCache[i]; - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - if (SESSION_ROW_RD_LOCK(row) != 0) { - WOLFSSL_MSG("Session row cache mutex lock failed"); - return BAD_MUTEX_E; - } - #endif - - seen += row->totalCount; - - if (active == NULL) { - SESSION_ROW_UNLOCK(row); - continue; - } - - count = min((word32)row->totalCount, SESSIONS_PER_ROW); - idx = row->nextIdx - 1; - if (idx < 0 || idx >= SESSIONS_PER_ROW) { - idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */ - } - - for (; count > 0; --count) { - /* if not expired then good */ -#ifdef SESSION_CACHE_DYNAMIC_MEM - if (row->Sessions[idx] && - ticks < (row->Sessions[idx]->bornOn + - row->Sessions[idx]->timeout) ) -#else - if (ticks < (row->Sessions[idx].bornOn + - row->Sessions[idx].timeout) ) -#endif - { - now++; - } - - idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1; - } - - #ifdef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(row); - #endif - } -#ifndef ENABLE_SESSION_CACHE_ROW_LOCK - SESSION_ROW_UNLOCK(&SessionCache[0]); -#endif - - if (active) { - *active = now; - } - if (total) { - *total = seen; - } - -#ifdef WOLFSSL_PEAK_SESSIONS - if (peak) { - *peak = PeakSessions; - } -#else - (void)peak; -#endif - - WOLFSSL_LEAVE("get_locked_session_stats", result); - - return result; -} - - -/* return WOLFSSL_SUCCESS on ok */ -int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak, - word32* maxSessions) -{ - int result = WOLFSSL_SUCCESS; - - WOLFSSL_ENTER("wolfSSL_get_session_stats"); - - if (maxSessions) { - *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS; - - if (active == NULL && total == NULL && peak == NULL) - return result; /* we're done */ - } - - /* user must provide at least one query value */ - if (active == NULL && total == NULL && peak == NULL) { - return BAD_FUNC_ARG; - } - - result = get_locked_session_stats(active, total, peak); - - WOLFSSL_LEAVE("wolfSSL_get_session_stats", result); - - return result; -} - -#endif /* WOLFSSL_SESSION_STATS */ - - - #ifdef PRINT_SESSION_STATS - - /* WOLFSSL_SUCCESS on ok */ - int wolfSSL_PrintSessionStats(void) - { - word32 totalSessionsSeen = 0; - word32 totalSessionsNow = 0; - word32 peak = 0; - word32 maxSessions = 0; - int i; - int ret; - double E; /* expected freq */ - double chiSquare = 0; - - ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen, - &peak, &maxSessions); - if (ret != WOLFSSL_SUCCESS) - return ret; - printf("Total Sessions Seen = %u\n", totalSessionsSeen); - printf("Total Sessions Now = %u\n", totalSessionsNow); -#ifdef WOLFSSL_PEAK_SESSIONS - printf("Peak Sessions = %u\n", peak); -#endif - printf("Max Sessions = %u\n", maxSessions); - - E = (double)totalSessionsSeen / SESSION_ROWS; - - for (i = 0; i < SESSION_ROWS; i++) { - double diff = SessionCache[i].totalCount - E; - diff *= diff; /* square */ - diff /= E; /* normalize */ - - chiSquare += diff; - } - printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare, - SESSION_ROWS - 1); - #if (SESSION_ROWS == 11) - printf(" .05 p value = 18.3, chi-square should be less\n"); - #elif (SESSION_ROWS == 211) - printf(".05 p value = 244.8, chi-square should be less\n"); - #elif (SESSION_ROWS == 5981) - printf(".05 p value = 6161.0, chi-square should be less\n"); - #elif (SESSION_ROWS == 3) - printf(".05 p value = 6.0, chi-square should be less\n"); - #elif (SESSION_ROWS == 2861) - printf(".05 p value = 2985.5, chi-square should be less\n"); - #endif - printf("\n"); - - return ret; - } - - #endif /* SESSION_STATS */ - -#else /* NO_SESSION_CACHE */ - -WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session) -{ - return (WOLFSSL_SESSION*)session; -} - -/* No session cache version */ -WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret, - byte restoreSessionCerts) -{ - (void)ssl; - (void)masterSecret; - (void)restoreSessionCerts; - - return NULL; -} - -#endif /* NO_SESSION_CACHE */ - /* call before SSL_connect, if verifying will add name check to date check and signature check */ @@ -16253,10 +10373,10 @@ /* myBuffer may not be initialized fully, but the span up to the * sending length will be. */ - PRAGMA_GCC_DIAG_PUSH; - PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\""); + PRAGMA_GCC_DIAG_PUSH + PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") ret = wolfSSL_write(ssl, myBuffer, sending); - PRAGMA_GCC_DIAG_POP; + PRAGMA_GCC_DIAG_POP if (dynamic) XFREE(myBuffer, ssl->heap, DYNAMIC_TYPE_WRITEV); @@ -16489,7 +10609,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); + ssl->options.useAnon, TRUE, ssl->options.side); } #ifdef OPENSSL_EXTRA /** @@ -16503,8 +10623,10 @@ { WOLFSSL_ENTER("wolfSSL_set_psk_use_session_callback"); - ssl->options.havePSK = 1; - ssl->options.session_psk_cb = cb; + if (ssl != NULL) { + ssl->options.havePSK = 1; + ssl->options.session_psk_cb = cb; + } WOLFSSL_LEAVE("wolfSSL_set_psk_use_session_callback", WOLFSSL_SUCCESS); } @@ -16544,7 +10666,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); + ssl->options.useAnon, TRUE, ssl->options.side); } const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl) @@ -16635,391 +10757,14 @@ if (ctx == NULL) return WOLFSSL_FAILURE; - ctx->haveAnon = 1; + ctx->useAnon = 1; return WOLFSSL_SUCCESS; } #endif /* HAVE_ANON */ - #ifndef NO_CERTS -/* used to be defined on NO_FILESYSTEM only, but are generally useful */ - - int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx, - const unsigned char* in, - long sz, int format, int userChain, - word32 flags) - { - int verify; - int ret = WOLFSSL_FAILURE; - - WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex"); - - verify = GET_VERIFY_SETTING_CTX(ctx); - if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY) - verify = VERIFY_SKIP_DATE; - - if (format == WOLFSSL_FILETYPE_PEM) - ret = ProcessChainBuffer(ctx, in, sz, format, CA_TYPE, NULL, - verify); - else - ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL, - userChain, verify); -#if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS) - if (ret == WOLFSSL_SUCCESS) - ret = wolfSSL_CTX_trust_peer_buffer(ctx, in, sz, format); -#endif - - WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret); - return ret; - } - - /* wolfSSL extension allows DER files to be loaded from buffers as well */ - int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx, - const unsigned char* in, - long sz, int format) - { - return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0, - WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); - } - - int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx, - const unsigned char* in, - long sz, int format) - { - return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1, - WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); - } - - -#ifdef WOLFSSL_TRUST_PEER_CERT - int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx, - const unsigned char* in, - long sz, int format) - { - WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer"); - - /* sanity check on arguments */ - if (sz < 0 || in == NULL || ctx == NULL) { - return BAD_FUNC_ARG; - } - - if (format == WOLFSSL_FILETYPE_PEM) - return ProcessChainBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, - NULL, GET_VERIFY_SETTING_CTX(ctx)); - else - return ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL, - NULL, 0, GET_VERIFY_SETTING_CTX(ctx)); - } -#endif /* WOLFSSL_TRUST_PEER_CERT */ - - - int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx, - const unsigned char* in, long sz, int format) - { - int ret = WOLFSSL_FAILURE; - - WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer"); - ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0, - GET_VERIFY_SETTING_CTX(ctx)); - WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret); - return ret; - } - - - int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx, - const unsigned char* in, long sz, int format) - { - int ret = WOLFSSL_FAILURE; - - WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer"); - ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, NULL, - 0, GET_VERIFY_SETTING_CTX(ctx)); - WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret); - return ret; - } - -#ifdef WOLF_PRIVATE_KEY_ID - int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id, - long sz, int devId, long keySz) - { - int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId); - - if (ret == WOLFSSL_SUCCESS) - ctx->privateKeySz = (word32)keySz; - - return ret; - } - - int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id, - long sz, int devId) - { - int ret = WOLFSSL_FAILURE; - - FreeDer(&ctx->privateKey); - if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE, - ctx->heap) == 0) { - XMEMCPY(ctx->privateKey->buffer, id, sz); - ctx->privateKeyId = 1; - if (devId != INVALID_DEVID) - ctx->privateKeyDevId = devId; - else - ctx->privateKeyDevId = ctx->devId; - - ret = WOLFSSL_SUCCESS; - } - - return ret; - } - - int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label, - int devId) - { - int ret = WOLFSSL_FAILURE; - word32 sz = (word32)XSTRLEN(label) + 1; - - FreeDer(&ctx->privateKey); - if (AllocDer(&ctx->privateKey, (word32)sz, PRIVATEKEY_TYPE, - ctx->heap) == 0) { - XMEMCPY(ctx->privateKey->buffer, label, sz); - ctx->privateKeyLabel = 1; - if (devId != INVALID_DEVID) - ctx->privateKeyDevId = devId; - else - ctx->privateKeyDevId = ctx->devId; - - ret = WOLFSSL_SUCCESS; - } - - return ret; - } -#endif /* WOLF_PRIVATE_KEY_ID */ - - int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx, - const unsigned char* in, long sz, int format) - { - WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format"); - return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1, - GET_VERIFY_SETTING_CTX(ctx)); - } - - int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx, - const unsigned char* in, long sz) - { - return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz, - WOLFSSL_FILETYPE_PEM); - } - - -#ifndef NO_DH - - /* server wrapper for ctx or ssl Diffie-Hellman parameters */ - static int wolfSSL_SetTmpDH_buffer_wrapper(WOLFSSL_CTX* ctx, WOLFSSL* ssl, - const unsigned char* buf, - long sz, int format) - { - DerBuffer* der = NULL; - int ret = 0; - word32 pSz = MAX_DH_SIZE; - word32 gSz = MAX_DH_SIZE; - #ifdef WOLFSSL_SMALL_STACK - byte* p = NULL; - byte* g = NULL; - #else - byte p[MAX_DH_SIZE]; - byte g[MAX_DH_SIZE]; - #endif - - if (ctx == NULL || buf == NULL) - return BAD_FUNC_ARG; - - ret = AllocDer(&der, 0, DH_PARAM_TYPE, ctx->heap); - if (ret != 0) { - return ret; - } - der->buffer = (byte*)buf; - der->length = (word32)sz; - - #ifdef WOLFSSL_SMALL_STACK - p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY); - g = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_PUBLIC_KEY); - - if (p == NULL || g == NULL) { - XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY); - XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY); - return MEMORY_E; - } - #endif - - if (format != WOLFSSL_FILETYPE_ASN1 && format != WOLFSSL_FILETYPE_PEM) - ret = WOLFSSL_BAD_FILETYPE; - else { - if (format == WOLFSSL_FILETYPE_PEM) { -#ifdef WOLFSSL_PEM_TO_DER - FreeDer(&der); - ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, ctx->heap, - NULL, NULL); - if (ret < 0) { - /* Also try X9.42 format */ - ret = PemToDer(buf, sz, X942_PARAM_TYPE, &der, ctx->heap, - NULL, NULL); - } - #ifdef WOLFSSL_WPAS - #ifndef NO_DSA - if (ret < 0) { - ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, ctx->heap, - NULL, NULL); - } - #endif - #endif /* WOLFSSL_WPAS */ -#else - ret = NOT_COMPILED_IN; -#endif /* WOLFSSL_PEM_TO_DER */ - } - - if (ret == 0) { - if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0) - ret = WOLFSSL_BAD_FILETYPE; - else if (ssl) - ret = wolfSSL_SetTmpDH(ssl, p, pSz, g, gSz); - else - ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz); - } - } - - FreeDer(&der); - - #ifdef WOLFSSL_SMALL_STACK - XFREE(p, NULL, DYNAMIC_TYPE_PUBLIC_KEY); - XFREE(g, NULL, DYNAMIC_TYPE_PUBLIC_KEY); - #endif - - return ret; - } - - - /* server Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */ - int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz, - int format) - { - if (ssl == NULL) - return BAD_FUNC_ARG; - - return wolfSSL_SetTmpDH_buffer_wrapper(ssl->ctx, ssl, buf, sz, format); - } - - - /* server ctx Diffie-Hellman parameters, WOLFSSL_SUCCESS on ok */ - int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf, - long sz, int format) - { - return wolfSSL_SetTmpDH_buffer_wrapper(ctx, NULL, buf, sz, format); - } - -#endif /* NO_DH */ - - - int wolfSSL_use_certificate_buffer(WOLFSSL* ssl, - const unsigned char* in, long sz, int format) - { - WOLFSSL_ENTER("wolfSSL_use_certificate_buffer"); - if (ssl == NULL) - return BAD_FUNC_ARG; - - return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0, - GET_VERIFY_SETTING_SSL(ssl)); - } - - - int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl, - const unsigned char* in, long sz, int format) - { - WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer"); - if (ssl == NULL) - return BAD_FUNC_ARG; - - return ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE, - ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl)); - } - -#ifdef WOLF_PRIVATE_KEY_ID - int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id, - long sz, int devId, long keySz) - { - int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId); - - if (ret == WOLFSSL_SUCCESS) - ssl->buffers.keySz = (word32)keySz; - - return ret; - } - - int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id, - long sz, int devId) - { - int ret = WOLFSSL_FAILURE; - - if (ssl->buffers.weOwnKey) - FreeDer(&ssl->buffers.key); - if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE, - ssl->heap) == 0) { - XMEMCPY(ssl->buffers.key->buffer, id, sz); - ssl->buffers.weOwnKey = 1; - ssl->buffers.keyId = 1; - if (devId != INVALID_DEVID) - ssl->buffers.keyDevId = devId; - else - ssl->buffers.keyDevId = ssl->devId; - - ret = WOLFSSL_SUCCESS; - } - - return ret; - } - - int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId) - { - int ret = WOLFSSL_FAILURE; - word32 sz = (word32)XSTRLEN(label) + 1; - - if (ssl->buffers.weOwnKey) - FreeDer(&ssl->buffers.key); - if (AllocDer(&ssl->buffers.key, (word32)sz, PRIVATEKEY_TYPE, - ssl->heap) == 0) { - XMEMCPY(ssl->buffers.key->buffer, label, sz); - ssl->buffers.weOwnKey = 1; - ssl->buffers.keyLabel = 1; - if (devId != INVALID_DEVID) - ssl->buffers.keyDevId = devId; - else - ssl->buffers.keyDevId = ssl->devId; - - ret = WOLFSSL_SUCCESS; - } - - return ret; - } -#endif /* WOLF_PRIVATE_KEY_ID */ - - int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl, - const unsigned char* in, long sz, int format) - { - WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format"); - if (ssl == NULL) - return BAD_FUNC_ARG; - - return ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, - ssl, NULL, 1, GET_VERIFY_SETTING_SSL(ssl)); - } - - int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl, - const unsigned char* in, long sz) - { - return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz, - WOLFSSL_FILETYPE_PEM); - } - /* unload any certs or keys that SSL owns, leave CTX as is WOLFSSL_SUCCESS on ok */ @@ -17050,9 +10795,24 @@ WOLFSSL_MSG("Unloading key"); ForceZero(ssl->buffers.key->buffer, ssl->buffers.key->length); FreeDer(&ssl->buffers.key); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.keyMask); + #endif ssl->buffers.weOwnKey = 0; } +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->buffers.weOwnAltKey) { + WOLFSSL_MSG("Unloading alt key"); + ForceZero(ssl->buffers.altKey->buffer, ssl->buffers.altKey->length); + FreeDer(&ssl->buffers.altKey); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.altKeyMask); + #endif + ssl->buffers.weOwnAltKey = 0; + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + return WOLFSSL_SUCCESS; } @@ -17067,6 +10827,22 @@ return wolfSSL_CertManagerUnloadCAs(ctx->cm); } + int wolfSSL_CTX_UnloadIntermediateCerts(WOLFSSL_CTX* ctx) + { + WOLFSSL_ENTER("wolfSSL_CTX_UnloadIntermediateCerts"); + + if (ctx == NULL) + return BAD_FUNC_ARG; + + if (ctx->ref.count > 1) { + WOLFSSL_MSG("ctx object must have a ref count of 1 before " + "unloading intermediate certs"); + return BAD_STATE_E; + } + + return wolfSSL_CertManagerUnloadIntermediateCerts(ctx->cm); + } + #ifdef WOLFSSL_TRUST_PEER_CERT int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx) @@ -17087,6 +10863,7 @@ if (ssl == NULL) return BAD_FUNC_ARG; + SSL_CM_WARNING(ssl); return wolfSSL_CertManagerUnload_trust_peers(SSL_CM(ssl)); } #endif /* WOLFSSL_LOCAL_X509_STORE */ @@ -17130,20 +10907,6 @@ return WOLFSSL_SUCCESS; } - /* returns previous set cache size which stays constant */ - long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz) - { - /* cache size fixed at compile time in wolfSSL */ - (void)ctx; - (void)sz; - WOLFSSL_MSG("session cache is set at compile time"); - #ifndef NO_SESSION_CACHE - return (long)(SESSIONS_PER_ROW * SESSION_ROWS); - #else - return 0; - #endif - } - #endif #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ @@ -17224,8 +10987,8 @@ { WOLFSSL_ENTER("wolfSSL_CTX_set_client_CA_list"); if (ctx != NULL) { - wolfSSL_sk_X509_NAME_pop_free(ctx->ca_names, NULL); - ctx->ca_names = names; + wolfSSL_sk_X509_NAME_pop_free(ctx->client_ca_names, NULL); + ctx->client_ca_names = names; } } @@ -17234,9 +10997,9 @@ { WOLFSSL_ENTER("wolfSSL_set_client_CA_list"); if (ssl != NULL) { - if (ssl->ca_names != ssl->ctx->ca_names) - wolfSSL_sk_X509_NAME_pop_free(ssl->ca_names, NULL); - ssl->ca_names = names; + if (ssl->client_ca_names != ssl->ctx->client_ca_names) + wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL); + ssl->client_ca_names = names; } } @@ -17263,6 +11026,163 @@ ctx->certSetupCbArg = arg; } + int wolfSSL_get_client_suites_sigalgs(const WOLFSSL* ssl, + const byte** suites, word16* suiteSz, + const byte** hashSigAlgo, word16* hashSigAlgoSz) + { + WOLFSSL_ENTER("wolfSSL_get_client_suites_sigalgs"); + + if (suites != NULL) + *suites = NULL; + if (suiteSz != NULL) + *suiteSz = 0; + if (hashSigAlgo != NULL) + *hashSigAlgo = NULL; + if (hashSigAlgoSz != NULL) + *hashSigAlgoSz = 0; + + if (ssl != NULL && ssl->clSuites != NULL) { + if (suites != NULL && suiteSz != NULL) { + *suites = ssl->clSuites->suites; + *suiteSz = ssl->clSuites->suiteSz; + } + if (hashSigAlgo != NULL && hashSigAlgoSz != NULL) { + *hashSigAlgo = ssl->clSuites->hashSigAlgo; + *hashSigAlgoSz = ssl->clSuites->hashSigAlgoSz; + } + return WOLFSSL_SUCCESS; + } + return WOLFSSL_FAILURE; + } + WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first, + byte second) + { + WOLFSSL_CIPHERSUITE_INFO info; + info.rsaAuth = (byte)(CipherRequires(first, second, REQUIRES_RSA) || + CipherRequires(first, second, REQUIRES_RSA_SIG)); + info.eccAuth = (byte)(CipherRequires(first, second, REQUIRES_ECC) || + /* Static ECC ciphers may require RSA for authentication */ + (CipherRequires(first, second, REQUIRES_ECC_STATIC) && + !CipherRequires(first, second, REQUIRES_RSA_SIG))); + info.eccStatic = + (byte)CipherRequires(first, second, REQUIRES_ECC_STATIC); + info.psk = (byte)CipherRequires(first, second, REQUIRES_PSK); + return info; + } + + /** + * @param first First byte of the hash and signature algorithm + * @param second Second byte of the hash and signature algorithm + * @param hashAlgo The enum wc_HashType of the MAC algorithm + * @param sigAlgo The enum Key_Sum of the authentication algorithm + */ + int wolfSSL_get_sigalg_info(byte first, byte second, + int* hashAlgo, int* sigAlgo) + { + byte input[2]; + byte hashType; + byte sigType; + + if (hashAlgo == NULL || sigAlgo == NULL) + return BAD_FUNC_ARG; + + input[0] = first; + input[1] = second; + DecodeSigAlg(input, &hashType, &sigType); + + /* cast so that compiler reminds us of unimplemented values */ + switch ((enum SignatureAlgorithm)sigType) { + case anonymous_sa_algo: + *sigAlgo = ANONk; + break; + case rsa_sa_algo: + *sigAlgo = RSAk; + break; + case dsa_sa_algo: + *sigAlgo = DSAk; + break; + case ecc_dsa_sa_algo: + *sigAlgo = ECDSAk; + break; + case rsa_pss_sa_algo: + *sigAlgo = RSAPSSk; + break; + case ed25519_sa_algo: + *sigAlgo = ED25519k; + break; + case rsa_pss_pss_algo: + *sigAlgo = RSAPSSk; + break; + case ed448_sa_algo: + *sigAlgo = ED448k; + break; + case falcon_level1_sa_algo: + *sigAlgo = FALCON_LEVEL1k; + break; + case falcon_level5_sa_algo: + *sigAlgo = FALCON_LEVEL5k; + break; + case dilithium_level2_sa_algo: + *sigAlgo = DILITHIUM_LEVEL2k; + break; + case dilithium_level3_sa_algo: + *sigAlgo = DILITHIUM_LEVEL3k; + break; + case dilithium_level5_sa_algo: + *sigAlgo = DILITHIUM_LEVEL5k; + break; + case sm2_sa_algo: + *sigAlgo = SM2k; + break; + case invalid_sa_algo: + default: + *hashAlgo = WC_HASH_TYPE_NONE; + *sigAlgo = 0; + return BAD_FUNC_ARG; + } + + /* cast so that compiler reminds us of unimplemented values */ + switch((enum wc_MACAlgorithm)hashType) { + case no_mac: + case rmd_mac: /* Don't have a RIPEMD type in wc_HashType */ + *hashAlgo = WC_HASH_TYPE_NONE; + break; + case md5_mac: + *hashAlgo = WC_HASH_TYPE_MD5; + break; + case sha_mac: + *hashAlgo = WC_HASH_TYPE_SHA; + break; + case sha224_mac: + *hashAlgo = WC_HASH_TYPE_SHA224; + break; + case sha256_mac: + *hashAlgo = WC_HASH_TYPE_SHA256; + break; + case sha384_mac: + *hashAlgo = WC_HASH_TYPE_SHA384; + break; + case sha512_mac: + *hashAlgo = WC_HASH_TYPE_SHA512; + break; + case blake2b_mac: + *hashAlgo = WC_HASH_TYPE_BLAKE2B; + break; + case sm3_mac: +#ifdef WOLFSSL_SM3 + *hashAlgo = WC_HASH_TYPE_SM3; +#else + *hashAlgo = WC_HASH_TYPE_NONE; +#endif + break; + default: + *hashAlgo = WC_HASH_TYPE_NONE; + *sigAlgo = 0; + return BAD_FUNC_ARG; + } + return 0; + } + /** * Internal wrapper for calling certSetupCb * @param ssl The SSL/TLS Object @@ -17296,18 +11216,19 @@ #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || HAVE_WEBSERVER */ -#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) +#ifndef WOLFSSL_NO_CA_NAMES WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_CTX_get_client_CA_list( const WOLFSSL_CTX *ctx) { WOLFSSL_ENTER("wolfSSL_CTX_get_client_CA_list"); if (ctx == NULL) { - WOLFSSL_MSG("Bad argument passed to wolfSSL_CTX_get_client_CA_list"); + WOLFSSL_MSG("Bad argument passed to " + "wolfSSL_CTX_get_client_CA_list"); return NULL; } - return ctx->ca_names; + return ctx->client_ca_names; } /* returns the CA's set on server side or the CA's sent from server when @@ -17337,9 +11258,9 @@ return WOLFSSL_FAILURE; } - if (ctx->ca_names == NULL) { - ctx->ca_names = wolfSSL_sk_X509_NAME_new(NULL); - if (ctx->ca_names == NULL) { + if (ctx->client_ca_names == NULL) { + ctx->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL); + if (ctx->client_ca_names == NULL) { WOLFSSL_MSG("wolfSSL_sk_X509_NAME_new error"); return WOLFSSL_FAILURE; } @@ -17351,7 +11272,8 @@ return WOLFSSL_FAILURE; } - if (wolfSSL_sk_X509_NAME_push(ctx->ca_names, nameCopy) != WOLFSSL_SUCCESS) { + if (wolfSSL_sk_X509_NAME_push(ctx->client_ca_names, nameCopy) != + WOLFSSL_SUCCESS) { WOLFSSL_MSG("wolfSSL_sk_X509_NAME_push error"); wolfSSL_X509_NAME_free(nameCopy); return WOLFSSL_FAILURE; @@ -17363,7 +11285,8 @@ #ifndef NO_BIO #if !defined(NO_RSA) && !defined(NO_CERTS) - WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file(const char* fname) + WOLF_STACK_OF(WOLFSSL_X509_NAME)* wolfSSL_load_client_CA_file( + const char* fname) { /* The webserver build is using this to load a CA into the server * for client authentication as an option. Have this return NULL in @@ -17442,36 +11365,6 @@ #ifdef OPENSSL_EXTRA - #ifdef WOLFSSL_SYS_CA_CERTS - /* - * This is an OpenSSL compatibility layer function, but it doesn't mirror - * the exact functionality of its OpenSSL counterpart. We don't support the - * notion of an "OpenSSL directory," nor do we support the environment - * variables SSL_CERT_DIR or SSL_CERT_FILE. This function is simply a - * wrapper around our native wolfSSL_CTX_load_system_CA_certs function. This - * function does conform to OpenSSL's return value conventions, though. - */ - int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx) - { - int ret; - - WOLFSSL_ENTER("wolfSSL_CTX_set_default_verify_paths"); - - ret = wolfSSL_CTX_load_system_CA_certs(ctx); - if (ret == WOLFSSL_BAD_PATH) { - /* - * OpenSSL doesn't treat the lack of a system CA cert directory as a - * failure. We do the same here. - */ - ret = WOLFSSL_SUCCESS; - } - - WOLFSSL_LEAVE("wolfSSL_CTX_set_default_verify_paths", ret); - - return ret; - } - #endif /* WOLFSSL_SYS_CA_CERTS */ - #if defined(WOLFCRYPT_HAVE_SRP) && !defined(NO_SHA256) \ && !defined(WC_NO_RNG) static const byte srp_N[] = { @@ -17660,7 +11553,8 @@ #endif /* OPENSSL_EXTRA */ -#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || \ + defined(WOLFSSL_WPAS_SMALL) /* store keys returns WOLFSSL_SUCCESS or -1 on error */ int wolfSSL_get_keys(WOLFSSL* ssl, unsigned char** ms, unsigned int* msLen, @@ -17737,11 +11631,13 @@ #endif /* OPENSSL_EXTRA || WOLFSSL_EXTRA || WOLFSSL_WPAS_SMALL */ /* return true if connection established */ - int wolfSSL_is_init_finished(WOLFSSL* ssl) + int wolfSSL_is_init_finished(const WOLFSSL* ssl) { if (ssl == NULL) return 0; + /* Can't use ssl->options.connectState and ssl->options.acceptState + * because they differ in meaning for TLS <=1.2 and 1.3 */ if (ssl->options.handShakeState == HANDSHAKE_DONE) return 1; @@ -17849,7 +11745,8 @@ } #endif /* OPENSSL_EXTRA */ -#if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) +#if !defined(NO_CERTS) && (defined(OPENSSL_EXTRA) || \ + defined(WOLFSSL_WPAS_SMALL)) #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) /** @@ -17908,7 +11805,7 @@ } #endif /* SESSION_CERTS && OPENSSL_EXTRA */ - WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx) + WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(const WOLFSSL_CTX* ctx) { if (ctx == NULL) { return NULL; @@ -17916,7 +11813,7 @@ if (ctx->x509_store_pt != NULL) return ctx->x509_store_pt; - return &ctx->x509_store; + return &((WOLFSSL_CTX*)ctx)->x509_store; } void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str) @@ -17946,6 +11843,33 @@ and free it with CTX free*/ } +#ifdef OPENSSL_ALL + int wolfSSL_CTX_set1_verify_cert_store(WOLFSSL_CTX* ctx, + WOLFSSL_X509_STORE* str) + { + WOLFSSL_ENTER("wolfSSL_CTX_set1_verify_cert_store"); + + if (ctx == NULL || str == NULL) { + WOLFSSL_MSG("Bad parameter"); + return WOLFSSL_FAILURE; + } + + /* NO-OP when setting existing store */ + if (str == CTX_STORE(ctx)) + return WOLFSSL_SUCCESS; + + if (wolfSSL_X509_STORE_up_ref(str) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_X509_STORE_up_ref error"); + return WOLFSSL_FAILURE; + } + + /* free existing store if it exists */ + wolfSSL_X509_STORE_free(ctx->x509_store_pt); + ctx->x509_store_pt = str; /* take ownership of store and free it + with CTX free */ + return WOLFSSL_SUCCESS; + } +#endif int wolfSSL_set0_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str) { @@ -18043,13 +11967,26 @@ #endif /* WOLFSSL_ENCRYPTED_KEYS */ +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED) + unsigned long wolfSSL_ERR_get_error(void) + { + WOLFSSL_ENTER("wolfSSL_ERR_get_error"); +#ifdef WOLFSSL_HAVE_ERROR_QUEUE + return wc_GetErrorNodeErr(); +#else + return (unsigned long)(0 - NOT_COMPILED_IN); +#endif + } +#endif + #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) + int wolfSSL_num_locks(void) { return 0; } - void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, int)) + void wolfSSL_set_locking_callback(mutex_cb* f) { WOLFSSL_ENTER("wolfSSL_set_locking_callback"); @@ -18058,6 +11995,13 @@ } } + mutex_cb* wolfSSL_get_locking_callback(void) + { + WOLFSSL_ENTER("wolfSSL_get_locking_callback"); + + return wc_GetMutexCb(); + } + typedef unsigned long (idCb)(void); static idCb* inner_idCb = NULL; @@ -18078,16 +12022,6 @@ inner_idCb = f; } - unsigned long wolfSSL_ERR_get_error(void) - { - WOLFSSL_ENTER("wolfSSL_ERR_get_error"); -#ifdef WOLFSSL_HAVE_ERROR_QUEUE - return wc_GetErrorNodeErr(); -#else - return (unsigned long)(0 - NOT_COMPILED_IN); -#endif - } - #ifdef WOLFSSL_HAVE_ERROR_QUEUE #ifndef NO_BIO /* print out and clear all errors */ @@ -18176,7 +12110,7 @@ * NOTE: currently wolfSSL_KeepHandshakeResources(WOLFSSL* ssl) must be called * before the ephemeral key is stored. * return WOLFSSL_SUCCESS on success */ -int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey) +int wolfSSL_get_peer_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey) { WOLFSSL_EVP_PKEY* ret = NULL; @@ -18762,1405 +12696,239 @@ case TLS1_1_VERSION: ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_2; FALL_THROUGH; - case TLS1_2_VERSION: - ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_3; - FALL_THROUGH; - case TLS1_3_VERSION: - /* Nothing to do here */ - break; -#endif -#ifdef WOLFSSL_DTLS - case DTLS1_VERSION: - case DTLS1_2_VERSION: - break; -#endif - default: - WOLFSSL_MSG("Unrecognized protocol version or not compiled in"); - return WOLFSSL_FAILURE; - } - - return CheckSslMethodVersion(ssl->version.major, ssl->options.mask); -} - -int wolfSSL_set_max_proto_version(WOLFSSL* ssl, int version) -{ - int i; - int ret = WOLFSSL_FAILURE;; - - WOLFSSL_ENTER("wolfSSL_set_max_proto_version"); - - if (ssl == NULL) { - return WOLFSSL_FAILURE; - } - if (version != 0) { - return Set_SSL_max_proto_version(ssl, version); - } - - /* when 0 is specified as version, try to find out the min version from - * the bottom to top of the protoverTbl. - */ - for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) { - ret = Set_SSL_max_proto_version(ssl, protoVerTbl[i]); - if (ret == WOLFSSL_SUCCESS) - break; - } - - return ret; -} - -static int GetMinProtoVersion(int minDowngrade) -{ - int ret; - - switch (minDowngrade) { -#ifndef NO_OLD_TLS - #ifdef WOLFSSL_ALLOW_SSLV3 - case SSLv3_MINOR: - ret = SSL3_VERSION; - break; - #endif - #ifdef WOLFSSL_ALLOW_TLSV10 - case TLSv1_MINOR: - ret = TLS1_VERSION; - break; - #endif - case TLSv1_1_MINOR: - ret = TLS1_1_VERSION; - break; -#endif -#ifndef WOLFSSL_NO_TLS12 - case TLSv1_2_MINOR: - ret = TLS1_2_VERSION; - break; -#endif -#ifdef WOLFSSL_TLS13 - case TLSv1_3_MINOR: - ret = TLS1_3_VERSION; - break; -#endif - default: - ret = 0; - break; - } - - return ret; -} - -int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx) -{ - int ret = 0; - - WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version"); - - if (ctx != NULL) { - if (ctx->minProto) { - ret = 0; - } - else { - ret = GetMinProtoVersion(ctx->minDowngrade); - } - } - else { - ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE); - } - - WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret); - - return ret; -} - - -/* returns the maximum allowed protocol version given the 'options' used - * returns WOLFSSL_FATAL_ERROR on no match */ -static int GetMaxProtoVersion(long options) -{ -#ifndef NO_TLS -#ifdef WOLFSSL_TLS13 - if (!(options & WOLFSSL_OP_NO_TLSv1_3)) - return TLS1_3_VERSION; -#endif -#ifndef WOLFSSL_NO_TLS12 - if (!(options & WOLFSSL_OP_NO_TLSv1_2)) - return TLS1_2_VERSION; -#endif -#ifndef NO_OLD_TLS - if (!(options & WOLFSSL_OP_NO_TLSv1_1)) - return TLS1_1_VERSION; - #ifdef WOLFSSL_ALLOW_TLSV10 - if (!(options & WOLFSSL_OP_NO_TLSv1)) - return TLS1_VERSION; - #endif - #ifdef WOLFSSL_ALLOW_SSLV3 - if (!(options & WOLFSSL_OP_NO_SSLv3)) - return SSL3_VERSION; - #endif -#endif -#else - (void)options; -#endif /* NO_TLS */ - return WOLFSSL_FATAL_ERROR; -} - - -/* returns the maximum protocol version for 'ctx' */ -int wolfSSL_CTX_get_max_proto_version(WOLFSSL_CTX* ctx) -{ - int ret = 0; - long options = 0; /* default to nothing set */ - - WOLFSSL_ENTER("wolfSSL_CTX_get_max_proto_version"); - - if (ctx != NULL) { - options = wolfSSL_CTX_get_options(ctx); - } - - if ((ctx != NULL) && ctx->maxProto) { - ret = 0; - } - else { - ret = GetMaxProtoVersion(options); - } - - WOLFSSL_LEAVE("wolfSSL_CTX_get_max_proto_version", ret); - - if (ret == WOLFSSL_FATAL_ERROR) { - WOLFSSL_MSG("Error getting max proto version"); - ret = 0; /* setting ret to 0 to match compat return */ - } - return ret; -} -#endif /* OPENSSL_EXTRA */ - -#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \ - defined(HAVE_SECRET_CALLBACK) -#if !defined(NO_WOLFSSL_CLIENT) -/* Return the amount of random bytes copied over or error case. - * ssl : ssl struct after handshake - * out : buffer to hold random bytes - * outSz : either 0 (return max buffer sz) or size of out buffer - */ -size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, - size_t outSz) -{ - size_t size; - - /* return max size of buffer */ - if (outSz == 0) { - return RAN_LEN; - } - - if (ssl == NULL || out == NULL) { - return 0; - } - - if (ssl->arrays == NULL) { - WOLFSSL_MSG("Arrays struct not saved after handshake"); - return 0; - } - - if (outSz > RAN_LEN) { - size = RAN_LEN; - } - else { - size = outSz; - } - - XMEMCPY(out, ssl->arrays->clientRandom, size); - return size; -} -#endif /* !NO_WOLFSSL_CLIENT */ -#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */ - -#ifdef OPENSSL_EXTRA - - unsigned long wolfSSLeay(void) - { - return SSLEAY_VERSION_NUMBER; - } - - unsigned long wolfSSL_OpenSSL_version_num(void) - { - return OPENSSL_VERSION_NUMBER; - } - - const char* wolfSSLeay_version(int type) - { - (void)type; -#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L - return wolfSSL_OpenSSL_version(type); -#else - return wolfSSL_OpenSSL_version(); -#endif - } -#endif /* OPENSSL_EXTRA */ - - -#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL) -#ifndef NO_MD5 - int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5) - { - int ret; - typedef char md5_test[sizeof(MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1]; - (void)sizeof(md5_test); - - WOLFSSL_ENTER("MD5_Init"); - ret = wc_InitMd5((wc_Md5*)md5); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("MD5_Update"); - ret = wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - - int wolfSSL_MD5_Final(byte* output, WOLFSSL_MD5_CTX* md5) - { - int ret; - - WOLFSSL_ENTER("MD5_Final"); - ret = wc_Md5Final((wc_Md5*)md5, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Md5Free((wc_Md5*)md5); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - /* Apply MD5 transformation to the data */ - int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data) - { - int ret; - - WOLFSSL_ENTER("MD5_Transform"); - - /* sanity check */ - if (md5 == NULL || data == NULL) { - return 0; - } - #if defined(BIG_ENDIAN_ORDER) - ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE); - #endif - - ret = wc_Md5Transform((wc_Md5*)md5, data); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - unsigned char *wolfSSL_MD5(const unsigned char* data, size_t len, - unsigned char* hash) - { - static unsigned char out[WC_MD5_DIGEST_SIZE]; - - WOLFSSL_ENTER("wolfSSL_MD5"); - - if (hash == NULL) - hash = out; - if (wc_Md5Hash(data, (word32)len, hash) != 0) { - WOLFSSL_MSG("wc_Md5Hash error"); - return NULL; - } - return hash; - } -#endif /* !NO_MD5 */ - - -#ifndef NO_SHA - int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha) - { - int ret; - - typedef char sha_test[sizeof(SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA_Init"); - ret = wc_InitSha((wc_Sha*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - - int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA_Update"); - ret = wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - - int wolfSSL_SHA_Final(byte* output, WOLFSSL_SHA_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA_Final"); - ret = wc_ShaFinal((wc_Sha*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_ShaFree((wc_Sha*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) - /* Apply SHA1 transformation to the data */ - int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha, - const unsigned char* data) - { - int ret; - - WOLFSSL_ENTER("SHA_Transform"); - /* sanity check */ - if (sha == NULL || data == NULL) { - return 0; - } - #if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE); - #endif - ret = wc_ShaTransform((wc_Sha*)sha, data); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - #endif - - int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha) - { - WOLFSSL_ENTER("SHA1_Init"); - return SHA_Init(sha); - } - - - int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input, - unsigned long sz) - { - WOLFSSL_ENTER("SHA1_Update"); - return SHA_Update(sha, input, sz); - } - - - int wolfSSL_SHA1_Final(byte* output, WOLFSSL_SHA_CTX* sha) - { - WOLFSSL_ENTER("SHA1_Final"); - return SHA_Final(output, sha); - } - - #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) - /* Apply SHA1 transformation to the data */ - int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha, - const unsigned char* data) - { - WOLFSSL_ENTER("SHA1_Transform"); - return (wolfSSL_SHA_Transform(sha, data)); - } - #endif -#endif /* !NO_SHA */ - -#ifndef NO_SHA256 -#ifdef WOLFSSL_SHA224 - - int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha) - { - int ret; - - typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA224_Init"); - ret = wc_InitSha224((wc_Sha224*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - - int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA224_Update"); - ret = wc_Sha224Update((wc_Sha224*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - - int wolfSSL_SHA224_Final(byte* output, WOLFSSL_SHA224_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA224_Final"); - ret = wc_Sha224Final((wc_Sha224*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha224Free((wc_Sha224*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - -#endif /* WOLFSSL_SHA224 */ - - int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256) - { - int ret; - - typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA256_Init"); - ret = wc_InitSha256((wc_Sha256*)sha256); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA256_Update"); - ret = wc_Sha256Update((wc_Sha256*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA256_Final(byte* output, WOLFSSL_SHA256_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA256_Final"); - ret = wc_Sha256Final((wc_Sha256*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha256Free((wc_Sha256*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ - !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH) && \ - !defined(WOLFSSL_KCAPI_HASH) /* doesn't support direct transform */ - /* Apply SHA256 transformation to the data */ - int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256, - const unsigned char* data) - { - int ret; - - WOLFSSL_ENTER("SHA256_Transform"); - /* sanity check */ - if (sha256 == NULL || data == NULL) { - return 0; - } - #if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE); - #endif - ret = wc_Sha256Transform((wc_Sha256*)sha256, data); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - #endif -#endif /* !NO_SHA256 */ - - -#ifdef WOLFSSL_SHA384 - - int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha) - { - int ret; - - typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA384_Init"); - ret = wc_InitSha384((wc_Sha384*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA384_Update"); - ret = wc_Sha384Update((wc_Sha384*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA384_Final(byte* output, WOLFSSL_SHA384_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA384_Final"); - ret = wc_Sha384Final((wc_Sha384*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha384Free((wc_Sha384*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - -#endif /* WOLFSSL_SHA384 */ - - -#ifdef WOLFSSL_SHA512 - - int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha) - { - int ret; - - typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA512_Init"); - ret = wc_InitSha512((wc_Sha512*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA512_Update"); - ret = wc_Sha512Update((wc_Sha512*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA512_Final(byte* output, WOLFSSL_SHA512_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA512_Final"); - ret = wc_Sha512Final((wc_Sha512*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha512Free((wc_Sha512*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ - !defined(WOLFSSL_KCAPI_HASH) /* doesn't support direct transform */ - /* Apply SHA512 transformation to the data */ - int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512, - const unsigned char* data) - { - int ret; - - WOLFSSL_ENTER("SHA512_Transform"); - /* sanity check */ - if (sha512 == NULL || data == NULL) { - return WOLFSSL_FAILURE; - } - - ret = wc_Sha512Transform((wc_Sha512*)sha512, data); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) && !WOLFSSL_KCAPI_HASH */ - -#if !defined(WOLFSSL_NOSHA512_224) && \ - (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) - int wolfSSL_SHA512_224_Init(WOLFSSL_SHA512_224_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA512_224_Init"); - ret = wc_InitSha512_224((wc_Sha512*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA512_224_Update(WOLFSSL_SHA512_224_CTX* sha, - const void* input, unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA512_224_Update"); - ret = wc_Sha512_224Update((wc_Sha512*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA512_224_Final(byte* output, WOLFSSL_SHA512_224_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA512_224_Final"); - ret = wc_Sha512_224Final((wc_Sha512*)sha, output); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) - /* Apply SHA512 transformation to the data */ - int wolfSSL_SHA512_224_Transform(WOLFSSL_SHA512_CTX* sha512, - const unsigned char* data) - { - int ret; - - WOLFSSL_ENTER("SHA512_224_Transform"); - /* sanity check */ - if (sha512 == NULL || data == NULL) { - return WOLFSSL_FAILURE; - } - - ret = wc_Sha512_224Transform((wc_Sha512*)sha512, data); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) */ - -#endif /* !WOLFSSL_NOSHA512_224 && !FIPS ... */ - -#if !defined(WOLFSSL_NOSHA512_256) && \ - (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) - int wolfSSL_SHA512_256_Init(WOLFSSL_SHA512_256_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA512_256_Init"); - ret = wc_InitSha512_256((wc_Sha512*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA512_256_Update(WOLFSSL_SHA512_256_CTX* sha, - const void* input, unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA512_256_Update"); - ret = wc_Sha512_256Update((wc_Sha512*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA512_256_Final(byte* output, WOLFSSL_SHA512_256_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA512_256_Final"); - ret = wc_Sha512_256Final((wc_Sha512*)sha, output); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) - /* Apply SHA512 transformation to the data */ - int wolfSSL_SHA512_256_Transform(WOLFSSL_SHA512_CTX* sha512, - const unsigned char* data) - { - int ret; - - WOLFSSL_ENTER("SHA512_256_Transform"); - /* sanity check */ - if (sha512 == NULL || data == NULL) { - return WOLFSSL_FAILURE; - } - - ret = wc_Sha512_256Transform((wc_Sha512*)sha512, data); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - #endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION > 2)) */ - -#endif /* !WOLFSSL_NOSHA512_256 && !FIPS ... */ - -#endif /* WOLFSSL_SHA512 */ - -#ifdef WOLFSSL_SHA3 -#ifndef WOLFSSL_NOSHA3_224 - int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha) - { - int ret; - - typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA3_224_Init"); - ret = wc_InitSha3_224((wc_Sha3*)sha, NULL, INVALID_DEVID); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA3_224_Update"); - ret = wc_Sha3_224_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA3_224_Final(byte* output, WOLFSSL_SHA3_224_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA3_224_Final"); - ret = wc_Sha3_224_Final((wc_Sha3*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha3_224_Free((wc_Sha3*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - -#endif /* WOLFSSL_NOSHA3_224 */ - -#ifndef WOLFSSL_NOSHA3_256 - int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256) - { - int ret; - - typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA3_256_Init"); - ret = wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA3_256_Update"); - ret = wc_Sha3_256_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA3_256_Final(byte* output, WOLFSSL_SHA3_256_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA3_256_Final"); - ret = wc_Sha3_256_Final((wc_Sha3*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha3_256_Free((wc_Sha3*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } -#endif /* WOLFSSL_NOSHA3_256 */ - - int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha) - { - int ret; - - typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA3_384_Init"); - ret = wc_InitSha3_384((wc_Sha3*)sha, NULL, INVALID_DEVID); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA3_384_Update"); - ret = wc_Sha3_384_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA3_384_Final(byte* output, WOLFSSL_SHA3_384_CTX* sha) - { - int ret; - - WOLFSSL_ENTER("SHA3_384_Final"); - ret = wc_Sha3_384_Final((wc_Sha3*)sha, output); - - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha3_384_Free((wc_Sha3*)sha); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - -#ifndef WOLFSSL_NOSHA3_512 - int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha) - { - int ret; - - typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; - (void)sizeof(sha_test); - - WOLFSSL_ENTER("SHA3_512_Init"); - ret = wc_InitSha3_512((wc_Sha3*)sha, NULL, INVALID_DEVID); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; - return WOLFSSL_FAILURE; - } - - int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha, const void* input, - unsigned long sz) - { - int ret; - - WOLFSSL_ENTER("SHA3_512_Update"); - ret = wc_Sha3_512_Update((wc_Sha3*)sha, (const byte*)input, (word32)sz); - - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; + case TLS1_2_VERSION: + ssl->options.mask |= WOLFSSL_OP_NO_TLSv1_3; + FALL_THROUGH; + case TLS1_3_VERSION: + /* Nothing to do here */ + break; +#endif +#ifdef WOLFSSL_DTLS + case DTLS1_VERSION: + case DTLS1_2_VERSION: + break; +#endif + default: + WOLFSSL_MSG("Unrecognized protocol version or not compiled in"); return WOLFSSL_FAILURE; } - int wolfSSL_SHA3_512_Final(byte* output, WOLFSSL_SHA3_512_CTX* sha) - { - int ret; + return CheckSslMethodVersion(ssl->version.major, ssl->options.mask); +} - WOLFSSL_ENTER("SHA3_512_Final"); - ret = wc_Sha3_512_Final((wc_Sha3*)sha, output); +int wolfSSL_set_max_proto_version(WOLFSSL* ssl, int version) +{ + int i; + int ret = WOLFSSL_FAILURE;; - /* have to actually free the resources (if any) here, because the - * OpenSSL API doesn't include SHA*_Free(). - */ - wc_Sha3_512_Free((wc_Sha3*)sha); + WOLFSSL_ENTER("wolfSSL_set_max_proto_version"); - /* return 1 on success, 0 otherwise */ - if (ret == 0) - return WOLFSSL_SUCCESS; + if (ssl == NULL) { return WOLFSSL_FAILURE; } -#endif /* WOLFSSL_NOSHA3_512 */ -#endif /* WOLFSSL_SHA3 */ -#endif + if (version != 0) { + return Set_SSL_max_proto_version(ssl, version); + } -#ifdef OPENSSL_EXTRA + /* when 0 is specified as version, try to find out the min version from + * the bottom to top of the protoverTbl. + */ + for (i = NUMBER_OF_PROTOCOLS -1; i >= 0; i--) { + ret = Set_SSL_max_proto_version(ssl, protoVerTbl[i]); + if (ret == WOLFSSL_SUCCESS) + break; + } - unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key, - int key_len, const unsigned char* d, int n, - unsigned char* md, unsigned int* md_len) - { - int type; - int mdlen; - unsigned char* ret = NULL; -#ifdef WOLFSSL_SMALL_STACK - Hmac* hmac = NULL; -#else - Hmac hmac[1]; -#endif - void* heap = NULL; + return ret; +} - WOLFSSL_ENTER("wolfSSL_HMAC"); - if (!md) { - WOLFSSL_MSG("Static buffer not supported, pass in md buffer"); - return NULL; /* no static buffer support */ - } +static int GetMinProtoVersion(int minDowngrade) +{ + int ret; -#ifndef NO_MD5 - if (XSTRCMP(evp_md, "MD5") == 0) { - type = WC_MD5; - mdlen = WC_MD5_DIGEST_SIZE; - } else -#endif -#ifdef WOLFSSL_SHA224 - if (XSTRCMP(evp_md, "SHA224") == 0) { - type = WC_SHA224; - mdlen = WC_SHA224_DIGEST_SIZE; - } else -#endif -#ifndef NO_SHA256 - if (XSTRCMP(evp_md, "SHA256") == 0) { - type = WC_SHA256; - mdlen = WC_SHA256_DIGEST_SIZE; - } else -#endif -#ifdef WOLFSSL_SHA384 - if (XSTRCMP(evp_md, "SHA384") == 0) { - type = WC_SHA384; - mdlen = WC_SHA384_DIGEST_SIZE; - } else -#endif -#ifdef WOLFSSL_SHA512 - if (XSTRCMP(evp_md, "SHA512") == 0) { - type = WC_SHA512; - mdlen = WC_SHA512_DIGEST_SIZE; - } else -#endif -#ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 - if (XSTRCMP(evp_md, "SHA3_224") == 0) { - type = WC_SHA3_224; - mdlen = WC_SHA3_224_DIGEST_SIZE; - } else - #endif - #ifndef WOLFSSL_NOSHA3_256 - if (XSTRCMP(evp_md, "SHA3_256") == 0) { - type = WC_SHA3_256; - mdlen = WC_SHA3_256_DIGEST_SIZE; - } else - #endif - if (XSTRCMP(evp_md, "SHA3_384") == 0) { - type = WC_SHA3_384; - mdlen = WC_SHA3_384_DIGEST_SIZE; - } else - #ifndef WOLFSSL_NOSHA3_512 - if (XSTRCMP(evp_md, "SHA3_512") == 0) { - type = WC_SHA3_512; - mdlen = WC_SHA3_512_DIGEST_SIZE; - } else + switch (minDowngrade) { +#ifndef NO_OLD_TLS + #ifdef WOLFSSL_ALLOW_SSLV3 + case SSLv3_MINOR: + ret = SSL3_VERSION; + break; #endif + #ifdef WOLFSSL_ALLOW_TLSV10 + case TLSv1_MINOR: + ret = TLS1_VERSION; + break; + #endif + case TLSv1_1_MINOR: + ret = TLS1_1_VERSION; + break; #endif -#ifndef NO_SHA - if (XSTRCMP(evp_md, "SHA") == 0 || XSTRCMP(evp_md, "SHA1") == 0) { - type = WC_SHA; - mdlen = WC_SHA_DIGEST_SIZE; - } - else +#ifndef WOLFSSL_NO_TLS12 + case TLSv1_2_MINOR: + ret = TLS1_2_VERSION; + break; #endif - { - return NULL; - } - - #ifdef WOLFSSL_SMALL_STACK - hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC); - if (hmac == NULL) - return NULL; - #endif - - if (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0) { - if (wc_HmacSetKey(hmac, type, (const byte*)key, key_len) == 0) { - if (wc_HmacUpdate(hmac, d, n) == 0) { - if (wc_HmacFinal(hmac, md) == 0) { - if (md_len) - *md_len = mdlen; - ret = md; - } - } - } - wc_HmacFree(hmac); - } +#ifdef WOLFSSL_TLS13 + case TLSv1_3_MINOR: + ret = TLS1_3_VERSION; + break; +#endif + default: + ret = 0; + break; + } - #ifdef WOLFSSL_SMALL_STACK - XFREE(hmac, heap, DYNAMIC_TYPE_HMAC); - #endif + return ret; +} - (void)evp_md; - return ret; - } +int wolfSSL_CTX_get_min_proto_version(WOLFSSL_CTX* ctx) +{ + int ret = 0; -#ifndef NO_DES3 - /* 0 on ok */ - int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key, - WOLFSSL_DES_key_schedule* schedule) - { - WOLFSSL_ENTER("wolfSSL_DES_key_sched"); + WOLFSSL_ENTER("wolfSSL_CTX_get_min_proto_version"); - if (key == NULL || schedule == NULL) { - WOLFSSL_MSG("Null argument passed in"); + if (ctx != NULL) { + if (ctx->minProto) { + ret = 0; } else { - XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock)); + ret = GetMinProtoVersion(ctx->minDowngrade); } - - return 0; + } + else { + ret = GetMinProtoVersion(WOLFSSL_MIN_DOWNGRADE); } + WOLFSSL_LEAVE("wolfSSL_CTX_get_min_proto_version", ret); - /* intended to behave similar to Kerberos mit_des_cbc_cksum - * return the last 4 bytes of cipher text */ - WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in, - WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc, - WOLFSSL_const_DES_cblock* iv) - { - WOLFSSL_DES_LONG ret; - unsigned char* tmp; - unsigned char* data = (unsigned char*)in; - long dataSz = length; - byte dynamicFlag = 0; /* when padding the buffer created needs free'd */ + return ret; +} - WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum"); - if (in == NULL || out == NULL || sc == NULL || iv == NULL) { - WOLFSSL_MSG("Bad argument passed in"); - return 0; - } +/* returns the maximum allowed protocol version given the 'options' used + * returns WOLFSSL_FATAL_ERROR on no match */ +static int GetMaxProtoVersion(long options) +{ +#ifndef NO_TLS +#ifdef WOLFSSL_TLS13 + if (!(options & WOLFSSL_OP_NO_TLSv1_3)) + return TLS1_3_VERSION; +#endif +#ifndef WOLFSSL_NO_TLS12 + if (!(options & WOLFSSL_OP_NO_TLSv1_2)) + return TLS1_2_VERSION; +#endif +#ifndef NO_OLD_TLS + if (!(options & WOLFSSL_OP_NO_TLSv1_1)) + return TLS1_1_VERSION; + #ifdef WOLFSSL_ALLOW_TLSV10 + if (!(options & WOLFSSL_OP_NO_TLSv1)) + return TLS1_VERSION; + #endif + #ifdef WOLFSSL_ALLOW_SSLV3 + if (!(options & WOLFSSL_OP_NO_SSLv3)) + return SSL3_VERSION; + #endif +#endif +#else + (void)options; +#endif /* NO_TLS */ + return WOLFSSL_FATAL_ERROR; +} - /* if input length is not a multiple of DES_BLOCK_SIZE pad with 0s */ - if (dataSz % DES_BLOCK_SIZE) { - dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE); - data = (unsigned char*)XMALLOC(dataSz, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (data == NULL) { - WOLFSSL_MSG("Issue creating temporary buffer"); - return 0; - } - dynamicFlag = 1; /* set to free buffer at end */ - XMEMCPY(data, in, length); - XMEMSET(data + length, 0, dataSz - length); /* padding */ - } - tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (tmp == NULL) { - WOLFSSL_MSG("Issue creating temporary buffer"); - if (dynamicFlag == 1) { - XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - return 0; - } +/* returns the maximum protocol version for 'ctx' */ +int wolfSSL_CTX_get_max_proto_version(WOLFSSL_CTX* ctx) +{ + int ret = 0; + long options = 0; /* default to nothing set */ - wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc, - (WOLFSSL_DES_cblock*)iv, 1); - XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE), - DES_BLOCK_SIZE); - - ret = (((*((unsigned char*)out + 4) & 0xFF) << 24)| - ((*((unsigned char*)out + 5) & 0xFF) << 16)| - ((*((unsigned char*)out + 6) & 0xFF) << 8) | - (*((unsigned char*)out + 7) & 0xFF)); - - XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (dynamicFlag == 1) { - XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } + WOLFSSL_ENTER("wolfSSL_CTX_get_max_proto_version"); - return ret; + if (ctx != NULL) { + options = wolfSSL_CTX_get_options(ctx); } - - void wolfSSL_DES_cbc_encrypt(const unsigned char* input, - unsigned char* output, long length, - WOLFSSL_DES_key_schedule* schedule, - WOLFSSL_DES_cblock* ivec, int enc) - { - Des myDes; - byte lastblock[DES_BLOCK_SIZE]; - int lb_sz; - long blk; - - WOLFSSL_ENTER("wolfSSL_DES_cbc_encrypt"); - - /* OpenSSL compat, no ret */ - if (wc_Des_SetKey(&myDes, (const byte*)schedule, (const byte*)ivec, - !enc) != 0) { - WOLFSSL_MSG("wc_Des_SetKey return error."); - return; - } - lb_sz = length%DES_BLOCK_SIZE; - blk = length/DES_BLOCK_SIZE; - - if (enc == DES_ENCRYPT){ - wc_Des_CbcEncrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE); - if(lb_sz){ - XMEMSET(lastblock, 0, DES_BLOCK_SIZE); - XMEMCPY(lastblock, input+length-lb_sz, lb_sz); - wc_Des_CbcEncrypt(&myDes, output+blk*DES_BLOCK_SIZE, - lastblock, (word32)DES_BLOCK_SIZE); - } - } - else { - wc_Des_CbcDecrypt(&myDes, output, input, (word32)blk*DES_BLOCK_SIZE); - if(lb_sz){ - wc_Des_CbcDecrypt(&myDes, lastblock, input+length-lb_sz, (word32)DES_BLOCK_SIZE); - XMEMCPY(output+length-lb_sz, lastblock, lb_sz); - } - } + if ((ctx != NULL) && ctx->maxProto) { + ret = 0; + } + else { + ret = GetMaxProtoVersion(options); } + WOLFSSL_LEAVE("wolfSSL_CTX_get_max_proto_version", ret); - /* WOLFSSL_DES_key_schedule is a unsigned char array of size 8 */ - void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input, - unsigned char* output, long sz, - WOLFSSL_DES_key_schedule* ks1, - WOLFSSL_DES_key_schedule* ks2, - WOLFSSL_DES_key_schedule* ks3, - WOLFSSL_DES_cblock* ivec, int enc) - { - int ret; - Des3 des; - byte key[24];/* EDE uses 24 size key */ - byte lastblock[DES_BLOCK_SIZE]; - int lb_sz; - long blk; + if (ret == WOLFSSL_FATAL_ERROR) { + WOLFSSL_MSG("Error getting max proto version"); + ret = 0; /* setting ret to 0 to match compat return */ + } + return ret; +} +#endif /* OPENSSL_EXTRA */ - WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt"); +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \ + defined(HAVE_SECRET_CALLBACK) +#if !defined(NO_WOLFSSL_CLIENT) +/* Return the amount of random bytes copied over or error case. + * ssl : ssl struct after handshake + * out : buffer to hold random bytes + * outSz : either 0 (return max buffer sz) or size of out buffer + */ +size_t wolfSSL_get_client_random(const WOLFSSL* ssl, unsigned char* out, + size_t outSz) +{ + size_t size; - if (sz <= 0) - return; + /* return max size of buffer */ + if (outSz == 0) { + return RAN_LEN; + } - XMEMSET(key, 0, sizeof(key)); - XMEMCPY(key, *ks1, DES_BLOCK_SIZE); - XMEMCPY(&key[DES_BLOCK_SIZE], *ks2, DES_BLOCK_SIZE); - XMEMCPY(&key[DES_BLOCK_SIZE * 2], *ks3, DES_BLOCK_SIZE); - lb_sz = sz%DES_BLOCK_SIZE; - blk = sz/DES_BLOCK_SIZE; - - /* OpenSSL compat, no ret */ - (void)wc_Des3Init(&des, NULL, INVALID_DEVID); - - if (enc == DES_ENCRYPT) { - if (wc_Des3_SetKey(&des, key, (const byte*)ivec, - DES_ENCRYPTION) == 0) { - ret = wc_Des3_CbcEncrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - (void)ret; /* ignore return codes for processing */ - if(lb_sz){ - XMEMSET(lastblock, 0, DES_BLOCK_SIZE); - XMEMCPY(lastblock, input+sz-lb_sz, lb_sz); - ret = wc_Des3_CbcEncrypt(&des, output+blk*DES_BLOCK_SIZE, - lastblock, (word32)DES_BLOCK_SIZE); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - (void)ret; /* ignore return codes for processing */ - XMEMCPY(ivec, output+blk*DES_BLOCK_SIZE, DES_BLOCK_SIZE); - } - else { - XMEMCPY(ivec, output+(blk-1)*DES_BLOCK_SIZE, DES_BLOCK_SIZE); - } - } - } - else { - if (wc_Des3_SetKey(&des, key, (const byte*)ivec, - DES_DECRYPTION) == 0) { - if(lb_sz) - XMEMCPY(ivec, input+sz-lb_sz, DES_BLOCK_SIZE); - else - XMEMCPY(ivec, input+(blk-1)*DES_BLOCK_SIZE, DES_BLOCK_SIZE); - ret = wc_Des3_CbcDecrypt(&des, output, input, (word32)blk*DES_BLOCK_SIZE); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - (void)ret; /* ignore return codes for processing */ - if(lb_sz){ - ret = wc_Des3_CbcDecrypt(&des, lastblock, input+sz-lb_sz, (word32)DES_BLOCK_SIZE); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &des.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - (void)ret; /* ignore return codes for processing */ - XMEMCPY(output+sz-lb_sz, lastblock, lb_sz); - } - } - } - wc_Des3Free(&des); + if (ssl == NULL || out == NULL) { + return 0; } + if (ssl->arrays == NULL) { + WOLFSSL_MSG("Arrays struct not saved after handshake"); + return 0; + } - /* correctly sets ivec for next call */ - void wolfSSL_DES_ncbc_encrypt(const unsigned char* input, - unsigned char* output, long length, - WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec, - int enc) - { - Des myDes; - byte lastblock[DES_BLOCK_SIZE]; - int lb_sz; - long idx = length; - long blk; + if (outSz > RAN_LEN) { + size = RAN_LEN; + } + else { + size = outSz; + } - WOLFSSL_ENTER("wolfSSL_DES_ncbc_encrypt"); + XMEMCPY(out, ssl->arrays->clientRandom, size); + return size; +} +#endif /* !NO_WOLFSSL_CLIENT */ +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_SECRET_CALLBACK */ - /* OpenSSL compat, no ret */ - if (wc_Des_SetKey(&myDes, (const byte*)schedule, - (const byte*)ivec, !enc) != 0) { - WOLFSSL_MSG("wc_Des_SetKey return error."); - return; - } +#ifdef OPENSSL_EXTRA - lb_sz = length%DES_BLOCK_SIZE; - blk = length/DES_BLOCK_SIZE; - idx -= sizeof(DES_cblock); - if (lb_sz) { - idx += DES_BLOCK_SIZE - lb_sz; - } - if (enc == DES_ENCRYPT){ - wc_Des_CbcEncrypt(&myDes, output, input, - (word32)blk * DES_BLOCK_SIZE); - if (lb_sz){ - XMEMSET(lastblock, 0, DES_BLOCK_SIZE); - XMEMCPY(lastblock, input+length-lb_sz, lb_sz); - wc_Des_CbcEncrypt(&myDes, output + blk * DES_BLOCK_SIZE, - lastblock, (word32)DES_BLOCK_SIZE); - } - XMEMCPY(ivec, output + idx, sizeof(DES_cblock)); - } else { - WOLFSSL_DES_cblock tmp; - XMEMCPY(tmp, input + idx, sizeof(DES_cblock)); - wc_Des_CbcDecrypt(&myDes, output, input, - (word32)blk * DES_BLOCK_SIZE); - if (lb_sz){ - wc_Des_CbcDecrypt(&myDes, lastblock, input + length - lb_sz, - (word32)DES_BLOCK_SIZE); - XMEMCPY(output+length-lb_sz, lastblock, lb_sz); - } - XMEMCPY(ivec, tmp, sizeof(WOLFSSL_DES_cblock)); - } + unsigned long wolfSSLeay(void) + { + return SSLEAY_VERSION_NUMBER; + } + unsigned long wolfSSL_OpenSSL_version_num(void) + { + return OPENSSL_VERSION_NUMBER; } -#endif /* NO_DES3 */ + const char* wolfSSLeay_version(int type) + { + (void)type; +#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L + return wolfSSL_OpenSSL_version(type); +#else + return wolfSSL_OpenSSL_version(); +#endif + } +#endif /* OPENSSL_EXTRA */ +#ifdef OPENSSL_EXTRA void wolfSSL_ERR_free_strings(void) { /* handled internally */ @@ -20225,6 +12993,9 @@ ssl->options.haveSessionId = 0; ssl->options.tls = 0; ssl->options.tls1_1 = 0; + #ifdef WOLFSSL_DTLS + ssl->options.dtlsStateful = 0; + #endif #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) ssl->options.noPskDheKe = 0; #ifdef HAVE_SUPPORTED_CURVES @@ -20280,7 +13051,7 @@ #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ -#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED) long wolfSSL_CTX_set_mode(WOLFSSL_CTX* ctx, long mode) { /* WOLFSSL_MODE_ACCEPT_MOVING_WRITE_BUFFER is wolfSSL default mode */ @@ -20369,69 +13140,6 @@ #endif - /* Storing app session context id, this value is inherited by WOLFSSL - * objects created from WOLFSSL_CTX. Any session that is imported with a - * different session context id will be rejected. - * - * ctx structure to set context in - * sid_ctx value of context to set - * sid_ctx_len length of sid_ctx buffer - * - * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing - */ - int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx, - const unsigned char* sid_ctx, - unsigned int sid_ctx_len) - { - WOLFSSL_ENTER("wolfSSL_CTX_set_session_id_context"); - - /* No application specific context needed for wolfSSL */ - if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) { - return WOLFSSL_FAILURE; - } - XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len); - ctx->sessionCtxSz = (byte)sid_ctx_len; - - return WOLFSSL_SUCCESS; - } - - - - /* Storing app session context id. Any session that is imported with a - * different session context id will be rejected. - * - * ssl structure to set context in - * id value of context to set - * len length of sid_ctx buffer - * - * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing - */ - int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id, - unsigned int len) - { - WOLFSSL_ENTER("wolfSSL_set_session_id_context"); - - if (len > ID_LEN || ssl == NULL || id == NULL) { - return WOLFSSL_FAILURE; - } - XMEMCPY(ssl->sessionCtx, id, len); - ssl->sessionCtxSz = (byte)len; - - return WOLFSSL_SUCCESS; - } - - - long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx) - { - (void)ctx; - #ifndef NO_SESSION_CACHE - return (long)(SESSIONS_PER_ROW * SESSION_ROWS); - #else - return 0; - #endif - } - - /* returns the unsigned error value and increments the pointer into the * error queue. * @@ -20443,7 +13151,8 @@ #ifdef WOLFSSL_HAVE_ERROR_QUEUE int ret = wc_PullErrorNode(file, NULL, line); if (ret < 0) { - if (ret == BAD_STATE_E) return 0; /* no errors in queue */ + if (ret == WC_NO_ERR_TRACE(BAD_STATE_E)) + return 0; /* no errors in queue */ WOLFSSL_MSG("Issue getting error node"); WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line", ret); ret = 0 - ret; /* return absolute value of error */ @@ -20555,7 +13264,8 @@ ret = wc_PullErrorNode(file, data, line); if (ret < 0) { - if (ret == BAD_STATE_E) return 0; /* no errors in queue */ + if (ret == WC_NO_ERR_TRACE(BAD_STATE_E)) + return 0; /* no errors in queue */ WOLFSSL_MSG("Error with pulling error node!"); WOLFSSL_LEAVE("wolfSSL_ERR_get_error_line_data", ret); ret = 0 - ret; /* return absolute value of error */ @@ -20608,8 +13318,8 @@ /* Create a DecodedCert object and copy fields into WOLFSSL_X509 object. */ - InitDecodedCert(cert, (byte*)in, len, NULL); - if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) == 0) { + InitDecodedCert(cert, (byte*)in, (word32)len, NULL); + if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL, NULL)) == 0) { /* Check if x509 was not previously initialized by wolfSSL_X509_new() */ if (x509->dynamicMemory != TRUE) InitX509(x509, 0, NULL); @@ -20652,7 +13362,8 @@ #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) /* Return stack of peer certs. - * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl is. + * Caller does not need to free return. The stack is Free'd when WOLFSSL* ssl + * is. */ WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_get_peer_cert_chain(const WOLFSSL* ssl) { @@ -20731,7 +13442,7 @@ sk = wolfSSL_sk_X509_new_null(); i = ssl->session->chain.count-1; for (; i >= 0; i--) { - x509 = wolfSSL_X509_new(); + x509 = wolfSSL_X509_new_ex(ssl->heap); if (x509 == NULL) { WOLFSSL_MSG("Error Creating X509"); wolfSSL_sk_X509_pop_free(sk, NULL); @@ -20743,6 +13454,7 @@ if (ret == 0 && i == ssl->session->chain.count-1) { /* On the last element in the chain try to add the CA chain * first if we have one for this cert */ + SSL_CM_WARNING(ssl); if (PushCAx509Chain(SSL_CM(ssl), x509, sk) == WOLFSSL_FATAL_ERROR) { ret = WOLFSSL_FATAL_ERROR; @@ -21098,9 +13810,10 @@ return NULL; } #ifndef WOLFSSL_X509_STORE_CERTS - ssl->ourCert = wolfSSL_X509_d2i(NULL, + ssl->ourCert = wolfSSL_X509_d2i_ex(NULL, ssl->buffers.certificate->buffer, - ssl->buffers.certificate->length); + ssl->buffers.certificate->length, + ssl->heap); #endif } return ssl->ourCert; @@ -21113,9 +13826,10 @@ return NULL; } #ifndef WOLFSSL_X509_STORE_CERTS - ssl->ctx->ourCert = wolfSSL_X509_d2i(NULL, + ssl->ctx->ourCert = wolfSSL_X509_d2i_ex(NULL, ssl->ctx->certificate->buffer, - ssl->ctx->certificate->length); + ssl->ctx->certificate->length, + ssl->heap); #endif ssl->ctx->ownOurCert = 1; } @@ -21135,9 +13849,9 @@ return NULL; } #ifndef WOLFSSL_X509_STORE_CERTS - ctx->ourCert = wolfSSL_X509_d2i(NULL, + ctx->ourCert = wolfSSL_X509_d2i_ex(NULL, ctx->certificate->buffer, - ctx->certificate->length); + ctx->certificate->length, ctx->heap); #endif ctx->ownOurCert = 1; } @@ -21214,538 +13928,16 @@ { int resuming = 0; WOLFSSL_ENTER("wolfSSL_session_reused"); - if (ssl) + if (ssl) { +#ifndef HAVE_SECURE_RENEGOTIATION resuming = ssl->options.resuming; - WOLFSSL_LEAVE("wolfSSL_session_reused", resuming); - return resuming; -} - -/* return a new malloc'd session with default settings on success */ -WOLFSSL_SESSION* wolfSSL_NewSession(void* heap) -{ - WOLFSSL_SESSION* ret = NULL; - - WOLFSSL_ENTER("wolfSSL_NewSession"); - - ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), heap, - DYNAMIC_TYPE_SESSION); - if (ret != NULL) { - int err; - XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION)); - wolfSSL_RefInit(&ret->ref, &err); - #ifdef WOLFSSL_REFCNT_ERROR_RETURN - if (err != 0) { - WOLFSSL_MSG("Error setting up session reference mutex"); - XFREE(ret, ret->heap, DYNAMIC_TYPE_SESSION); - return NULL; - } - #else - (void)err; - #endif -#ifndef NO_SESSION_CACHE - ret->cacheRow = INVALID_SESSION_ROW; /* not in cache */ -#endif - ret->type = WOLFSSL_SESSION_TYPE_HEAP; - ret->heap = heap; -#ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("SESSION master secret", ret->masterSecret, SECRET_LEN); - wc_MemZero_Add("SESSION id", ret->sessionID, ID_LEN); -#endif - #ifdef HAVE_SESSION_TICKET - ret->ticket = ret->staticTicket; - #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - ret->ticketNonce.data = ret->ticketNonce.dataStatic; - #endif - #endif -#ifdef HAVE_EX_DATA - ret->ownExData = 1; - if (crypto_ex_cb_ctx_session != NULL) { - crypto_ex_cb_setup_new_data(ret, crypto_ex_cb_ctx_session, - &ret->ex_data); - } -#endif - } - return ret; -} - - -WOLFSSL_SESSION* wolfSSL_SESSION_new_ex(void* heap) -{ - return wolfSSL_NewSession(heap); -} - -WOLFSSL_SESSION* wolfSSL_SESSION_new(void) -{ - return wolfSSL_SESSION_new_ex(NULL); -} - -/* add one to session reference count - * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */ -int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session) -{ - int ret; - - session = ClientSessionToSession(session); - - if (session == NULL || session->type != WOLFSSL_SESSION_TYPE_HEAP) - return WOLFSSL_FAILURE; - - wolfSSL_RefInc(&session->ref, &ret); -#ifdef WOLFSSL_REFCNT_ERROR_RETURN - if (ret != 0) { - WOLFSSL_MSG("Failed to lock session mutex"); - return WOLFSSL_FAILURE; - } -#else - (void)ret; -#endif - - return WOLFSSL_SUCCESS; -} - -/** - * Deep copy the contents from input to output. - * @param input The source of the copy. - * @param output The destination of the copy. - * @param avoidSysCalls If true, then system calls will be avoided or an error - * will be returned if it is not possible to proceed - * without a system call. This is useful for fetching - * sessions from cache. When a cache row is locked, we - * don't want to block other threads with long running - * system calls. - * @param ticketNonceBuf If not null and @avoidSysCalls is true, the copy of the - * ticketNonce will happen in this pre allocated buffer - * @param ticketNonceLen @ticketNonceBuf len as input, used length on output - * @param ticketNonceUsed if @ticketNonceBuf was used to copy the ticket noncet - * @return WOLFSSL_SUCCESS on success - * WOLFSSL_FAILURE on failure - */ -static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input, - WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf, - byte* ticketNonceLen, byte* preallocUsed) -{ -#ifdef HAVE_SESSION_TICKET - int ticLenAlloc = 0; - byte *ticBuff = NULL; -#endif - const size_t copyOffset = OFFSETOF(WOLFSSL_SESSION, heap) + sizeof(input->heap); - int ret = WOLFSSL_SUCCESS; - - (void)avoidSysCalls; - (void)ticketNonceBuf; - (void)ticketNonceLen; - (void)preallocUsed; - - input = ClientSessionToSession(input); - output = ClientSessionToSession(output); - - if (input == NULL || output == NULL || input == output) { - WOLFSSL_MSG("input or output are null or same"); - return WOLFSSL_FAILURE; - } - -#ifdef HAVE_SESSION_TICKET - if (output->ticket != output->staticTicket) { - ticBuff = output->ticket; - ticLenAlloc = output->ticketLenAlloc; - } -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - /* free the data, it would be better to re-use the buffer but this - * maintain the code simpler. A smart allocator should re-use the free'd - * buffer in the next malloc without much performance penalties. */ - if (output->ticketNonce.data != output->ticketNonce.dataStatic) { - - /* Callers that avoid syscall should never calls this with - * output->tickeNonce.data being a dynamic buffer.*/ - if (avoidSysCalls) { - WOLFSSL_MSG("can't avoid syscalls with dynamic TicketNonce buffer"); - return WOLFSSL_FAILURE; - } - - XFREE(output->ticketNonce.data, - output->heap, DYNAMIC_TYPE_SESSION_TICK); - output->ticketNonce.data = output->ticketNonce.dataStatic; - output->ticketNonce.len = 0; - } -#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ -#endif /* HAVE_SESSION_TICKET */ - -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - if (output->peer != NULL) { - if (avoidSysCalls) { - WOLFSSL_MSG("Can't free cert when avoiding syscalls"); - return WOLFSSL_FAILURE; - } - wolfSSL_X509_free(output->peer); - output->peer = NULL; - } -#endif - - XMEMCPY((byte*)output + copyOffset, (byte*)input + copyOffset, - sizeof(WOLFSSL_SESSION) - copyOffset); - -#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ - defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - /* fix pointer to static after the copy */ - output->ticketNonce.data = output->ticketNonce.dataStatic; -#endif - /* Set sane values for copy */ -#ifndef NO_SESSION_CACHE - if (output->type != WOLFSSL_SESSION_TYPE_CACHE) - output->cacheRow = INVALID_SESSION_ROW; -#endif -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - if (input->peer != NULL && input->peer->dynamicMemory) { - if (wolfSSL_X509_up_ref(input->peer) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Can't increase peer cert ref count"); - output->peer = NULL; - } - } - else if (!avoidSysCalls) - output->peer = wolfSSL_X509_dup(input->peer); - else - /* output->peer is not that important to copy */ - output->peer = NULL; -#endif -#ifdef HAVE_SESSION_TICKET - if (input->ticketLen > SESSION_TICKET_LEN) { - /* Need dynamic buffer */ - if (ticBuff == NULL || ticLenAlloc < input->ticketLen) { - /* allocate new one */ - byte* tmp; - if (avoidSysCalls) { - WOLFSSL_MSG("Failed to allocate memory for ticket when avoiding" - " syscalls"); - output->ticket = ticBuff; - output->ticketLenAlloc = (word16) ticLenAlloc; - output->ticketLen = 0; - ret = WOLFSSL_FAILURE; - } - else { -#ifdef WOLFSSL_NO_REALLOC - tmp = (byte*)XMALLOC(input->ticketLen, - output->heap, DYNAMIC_TYPE_SESSION_TICK); - XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK); - ticBuff = NULL; -#else - tmp = (byte*)XREALLOC(ticBuff, input->ticketLen, - output->heap, DYNAMIC_TYPE_SESSION_TICK); -#endif /* WOLFSSL_NO_REALLOC */ - if (tmp == NULL) { - WOLFSSL_MSG("Failed to allocate memory for ticket"); -#ifndef WOLFSSL_NO_REALLOC - XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK); - ticBuff = NULL; -#endif /* WOLFSSL_NO_REALLOC */ - output->ticket = NULL; - output->ticketLen = 0; - output->ticketLenAlloc = 0; - ret = WOLFSSL_FAILURE; - } - else { - ticBuff = tmp; - ticLenAlloc = input->ticketLen; - } - } - } - if (ticBuff != NULL && ret == WOLFSSL_SUCCESS) { - XMEMCPY(ticBuff, input->ticket, input->ticketLen); - output->ticket = ticBuff; - output->ticketLenAlloc = (word16) ticLenAlloc; - } - } - else { - /* Default ticket to non dynamic */ - if (avoidSysCalls) { - /* Try to use ticBuf if available. Caller can later move it to - * the static buffer. */ - if (ticBuff != NULL) { - if (ticLenAlloc >= input->ticketLen) { - output->ticket = ticBuff; - output->ticketLenAlloc = ticLenAlloc; - } - else { - WOLFSSL_MSG("ticket dynamic buffer too small but we are " - "avoiding system calls"); - ret = WOLFSSL_FAILURE; - output->ticket = ticBuff; - output->ticketLenAlloc = (word16) ticLenAlloc; - output->ticketLen = 0; - } - } - else { - output->ticket = output->staticTicket; - output->ticketLenAlloc = 0; - } - } - else { - if (ticBuff != NULL) - XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK); - output->ticket = output->staticTicket; - output->ticketLenAlloc = 0; - } - if (input->ticketLenAlloc > 0 && ret == WOLFSSL_SUCCESS) { - /* Shouldn't happen as session should have placed this in - * the static buffer */ - XMEMCPY(output->ticket, input->ticket, - input->ticketLen); - } - } - ticBuff = NULL; - -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (preallocUsed != NULL) - *preallocUsed = 0; - - if (input->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ && - ret == WOLFSSL_SUCCESS) { - /* TicketNonce does not fit in the static buffer */ - if (!avoidSysCalls) { - output->ticketNonce.data = (byte*)XMALLOC(input->ticketNonce.len, - output->heap, DYNAMIC_TYPE_SESSION_TICK); - - if (output->ticketNonce.data == NULL) { - WOLFSSL_MSG("Failed to allocate space for ticket nonce"); - output->ticketNonce.data = output->ticketNonce.dataStatic; - output->ticketNonce.len = 0; - ret = WOLFSSL_FAILURE; - } - else { - output->ticketNonce.len = input->ticketNonce.len; - XMEMCPY(output->ticketNonce.data, input->ticketNonce.data, - input->ticketNonce.len); - ret = WOLFSSL_SUCCESS; - } - } - /* we can't do syscalls. Use prealloc buffers if provided from the - * caller. */ - else if (ticketNonceBuf != NULL && - *ticketNonceLen >= input->ticketNonce.len) { - XMEMCPY(ticketNonceBuf, input->ticketNonce.data, - input->ticketNonce.len); - *ticketNonceLen = input->ticketNonce.len; - if (preallocUsed != NULL) - *preallocUsed = 1; - ret = WOLFSSL_SUCCESS; - } - else { - WOLFSSL_MSG("TicketNonce bigger than static buffer, and we can't " - "do syscalls"); - ret = WOLFSSL_FAILURE; - } - } -#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ - -#endif /* HAVE_SESSION_TICKET */ - -#ifdef HAVE_EX_DATA - if (input->type != WOLFSSL_SESSION_TYPE_CACHE && - output->type != WOLFSSL_SESSION_TYPE_CACHE) { - /* Not called with cache as that passes ownership of ex_data */ - ret = crypto_ex_cb_dup_data(&input->ex_data, &output->ex_data, - crypto_ex_cb_ctx_session); - } -#endif - - return ret; -} - -/** - * Deep copy the contents from input to output. - * @param input The source of the copy. - * @param output The destination of the copy. - * @param avoidSysCalls If true, then system calls will be avoided or an error - * will be returned if it is not possible to proceed - * without a system call. This is useful for fetching - * sessions from cache. When a cache row is locked, we - * don't want to block other threads with long running - * system calls. - * @return WOLFSSL_SUCCESS on success - * WOLFSSL_FAILURE on failure - */ -int wolfSSL_DupSession(const WOLFSSL_SESSION* input, WOLFSSL_SESSION* output, - int avoidSysCalls) -{ - return wolfSSL_DupSessionEx(input, output, avoidSysCalls, NULL, NULL, NULL); -} - -WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session) -{ -#ifdef HAVE_EXT_CACHE - WOLFSSL_SESSION* copy; - - WOLFSSL_ENTER("wolfSSL_SESSION_dup"); - - session = ClientSessionToSession(session); - if (session == NULL) - return NULL; - -#ifdef HAVE_SESSION_TICKET - if (session->ticketLenAlloc > 0 && !session->ticket) { - WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null"); - return NULL; - } -#endif - - copy = wolfSSL_NewSession(session->heap); - if (copy != NULL && - wolfSSL_DupSession(session, copy, 0) != WOLFSSL_SUCCESS) { - wolfSSL_FreeSession(NULL, copy); - copy = NULL; - } - return copy; -#else - WOLFSSL_MSG("wolfSSL_SESSION_dup feature not compiled in"); - (void)session; - return NULL; -#endif /* HAVE_EXT_CACHE */ -} - -void wolfSSL_FreeSession(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session) -{ - session = ClientSessionToSession(session); - if (session == NULL) - return; - - (void)ctx; - - WOLFSSL_ENTER("wolfSSL_FreeSession"); - - if (session->ref.count > 0) { - int ret; - int isZero; - wolfSSL_RefDec(&session->ref, &isZero, &ret); - (void)ret; - if (!isZero) { - return; - } - wolfSSL_RefFree(&session->ref); - } - - WOLFSSL_MSG("wolfSSL_FreeSession full free"); - -#ifdef HAVE_EX_DATA - if (session->ownExData) { - crypto_ex_cb_free_data(session, crypto_ex_cb_ctx_session, - &session->ex_data); - } -#endif - -#ifdef HAVE_EX_DATA_CLEANUP_HOOKS - wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data); -#endif - -#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) - if (session->peer) { - wolfSSL_X509_free(session->peer); - session->peer = NULL; - } -#endif - -#ifdef HAVE_SESSION_TICKET - if (session->ticketLenAlloc > 0) { - XFREE(session->ticket, session->heap, DYNAMIC_TYPE_SESSION_TICK); - } -#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (session->ticketNonce.data != session->ticketNonce.dataStatic) { - XFREE(session->ticketNonce.data, session->heap, - DYNAMIC_TYPE_SESSION_TICK); - } -#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ -#endif - -#ifdef HAVE_EX_DATA_CLEANUP_HOOKS - wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data); -#endif - - /* Make sure masterSecret is zeroed. */ - ForceZero(session->masterSecret, SECRET_LEN); - /* Session ID is sensitive information too. */ - ForceZero(session->sessionID, ID_LEN); - - if (session->type == WOLFSSL_SESSION_TYPE_HEAP) { - XFREE(session, session->heap, DYNAMIC_TYPE_SESSION); - } -} - -/* DO NOT use this API internally. Use wolfSSL_FreeSession directly instead - * and pass in the ctx parameter if possible (like from ssl->ctx). */ -void wolfSSL_SESSION_free(WOLFSSL_SESSION* session) -{ - session = ClientSessionToSession(session); - wolfSSL_FreeSession(NULL, session); -} - -#ifndef NO_SESSION_CACHE -int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session) -{ - int error = 0; - const byte* id = NULL; - byte idSz = 0; - - WOLFSSL_ENTER("wolfSSL_CTX_add_session"); - - session = ClientSessionToSession(session); - if (session == NULL) - return WOLFSSL_FAILURE; - - /* Session cache is global */ - (void)ctx; - - if (session->haveAltSessionID) { - id = session->altSessionID; - idSz = ID_LEN; - } - else { - id = session->sessionID; - idSz = session->sessionIDSz; - } - - error = AddSessionToCache(ctx, session, id, idSz, - NULL, session->side, -#ifdef HAVE_SESSION_TICKET - session->ticketLen > 0, #else - 0, -#endif - NULL); - - return error == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; -} + resuming = ssl->options.resuming || ssl->options.resumed; #endif - -#if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE) - -/** -* set cipher to WOLFSSL_SESSION from WOLFSSL_CIPHER -* @param session a pointer to WOLFSSL_SESSION structure -* @param cipher a function pointer to WOLFSSL_CIPHER -* @return WOLFSSL_SUCCESS on success, otherwise WOLFSSL_FAILURE -*/ -int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session, - const WOLFSSL_CIPHER* cipher) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_set_cipher"); - - session = ClientSessionToSession(session); - /* sanity check */ - if (session == NULL || cipher == NULL) { - WOLFSSL_MSG("bad argument"); - return WOLFSSL_FAILURE; } - session->cipherSuite0 = cipher->cipherSuite0; - session->cipherSuite = cipher->cipherSuite; - - WOLFSSL_LEAVE("wolfSSL_SESSION_set_cipher", WOLFSSL_SUCCESS); - return WOLFSSL_SUCCESS; + WOLFSSL_LEAVE("wolfSSL_session_reused", resuming); + return resuming; } -#endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */ - /* helper function that takes in a protocol version struct and returns string */ static const char* wolfSSL_internal_get_version(const ProtocolVersion* version) @@ -21882,25 +14074,6 @@ return wolfSSL_get_version(cipher->ssl); } -const char* wolfSSL_SESSION_CIPHER_get_name(const WOLFSSL_SESSION* session) -{ - session = ClientSessionToSession(session); - if (session == NULL) { - return NULL; - } - -#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ - (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) - #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) - return GetCipherNameIana(session->cipherSuite0, session->cipherSuite); - #else - return GetCipherNameInternal(session->cipherSuite0, session->cipherSuite); - #endif -#else - return NULL; -#endif -} - const char* wolfSSL_get_cipher(WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_get_cipher"); @@ -21914,14 +14087,14 @@ return wolfSSL_get_cipher_name_internal(ssl); } -const char* wolfSSL_get_cipher_name_from_suite(const byte cipherSuite0, - const byte cipherSuite) +const char* wolfSSL_get_cipher_name_from_suite(byte cipherSuite0, + byte cipherSuite) { return GetCipherNameInternal(cipherSuite0, cipherSuite); } -const char* wolfSSL_get_cipher_name_iana_from_suite(const byte cipherSuite0, - const byte cipherSuite) +const char* wolfSSL_get_cipher_name_iana_from_suite(byte cipherSuite0, + byte cipherSuite) { return GetCipherNameIana(cipherSuite0, cipherSuite); } @@ -22051,10 +14224,12 @@ { const char* cName = NULL; + WOLFSSL_ENTER("wolfSSL_get_curve_name"); + if (ssl == NULL) return NULL; -#if defined(WOLFSSL_TLS13) && defined(HAVE_PQC) +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_KYBER) /* Check for post-quantum groups. Return now because we do not want the ECC * check to override this result in the case of a hybrid. */ if (IsAtLeastTLSv1_3(ssl->version)) { @@ -22079,20 +14254,26 @@ #ifdef WOLFSSL_KYBER512 case WOLFSSL_KYBER_LEVEL1: return "KYBER_LEVEL1"; + case WOLFSSL_P256_KYBER_LEVEL1: + return "P256_KYBER_LEVEL1"; #endif #ifdef WOLFSSL_KYBER768 case WOLFSSL_KYBER_LEVEL3: return "KYBER_LEVEL3"; + case WOLFSSL_P384_KYBER_LEVEL3: + return "P384_KYBER_LEVEL3"; #endif #ifdef WOLFSSL_KYBER1024 case WOLFSSL_KYBER_LEVEL5: return "KYBER_LEVEL5"; + case WOLFSSL_P521_KYBER_LEVEL5: + return "P521_KYBER_LEVEL5"; #endif #endif } } +#endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_KYBER */ -#endif /* WOLFSSL_TLS13 && HAVE_PQC */ #ifdef HAVE_FFDHE if (ssl->namedGroup != 0) { cName = wolfssl_ffdhe_name(ssl->namedGroup); @@ -22498,6 +14679,11 @@ authStr = "ECDSA"; break; #endif +#ifdef WOLFSSL_SM2 + case sm2_sa_algo: + authStr = "SM2"; + break; +#endif #ifdef HAVE_ED25519 case ed25519_sa_algo: authStr = "Ed25519"; @@ -22571,6 +14757,18 @@ encStr = "CHACHA20/POLY1305(256)"; break; #endif +#ifdef HAVE_ARIA + case wolfssl_aria_gcm: + if (key_size == 128) + encStr = "Aria(128)"; + else if (key_size == 192) + encStr = "Aria(192)"; + else if (key_size == 256) + encStr = "Aria(256)"; + else + encStr = "Aria(?)"; + break; +#endif #ifdef HAVE_CAMELLIA case wolfssl_camellia: if (key_size == 128) @@ -22711,55 +14909,6 @@ } #endif -#ifndef NO_MD4 - -void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4) -{ - /* make sure we have a big enough buffer */ - typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1]; - (void) sizeof(ok); - - WOLFSSL_ENTER("MD4_Init"); - wc_InitMd4((Md4*)md4); -} - - -void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data, - unsigned long len) -{ - WOLFSSL_ENTER("MD4_Update"); - wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len); -} - - -void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4) -{ - WOLFSSL_ENTER("MD4_Final"); - wc_Md4Final((Md4*)md4, digest); -} - -#endif /* NO_MD4 */ - -#ifndef NO_WOLFSSL_STUB -void wolfSSL_RAND_screen(void) -{ - WOLFSSL_STUB("RAND_screen"); -} -#endif - - - -int wolfSSL_RAND_load_file(const char* fname, long len) -{ - (void)fname; - /* wolfCrypt provides enough entropy internally or will report error */ - if (len == -1) - return 1024; - else - return (int)len; -} - - #ifndef NO_WOLFSSL_STUB WOLFSSL_COMP_METHOD* wolfSSL_COMP_zlib(void) { @@ -22786,6 +14935,17 @@ } #endif +#ifndef NO_WOLFSSL_STUB +const char* wolfSSL_COMP_get_name(const void* comp) +{ + static const char ret[] = "not supported"; + + (void)comp; + WOLFSSL_STUB("wolfSSL_COMP_get_name"); + return ret; +} +#endif + /* wolfSSL_set_dynlock_create_callback * CRYPTO_set_dynlock_create_callback has been deprecated since openSSL 1.0.1. * This function exists for compatibility purposes because wolfSSL satisfies @@ -22879,12 +15039,12 @@ /* In this case, there was no buffered DER at all. This could be the * case where the key that was passed in was generated. So now we * have to create the local DER. */ - local_derSz = wolfSSL_i2d_ECPrivateKey(key->ecc, &local_der); + local_derSz = (word32)wolfSSL_i2d_ECPrivateKey(key->ecc, &local_der); if (local_derSz == 0) { ret = WOLFSSL_FATAL_ERROR; } } else { - local_derSz = ret; + local_derSz = (word32)ret; ret = 0; } @@ -22909,7 +15069,7 @@ } if (ret == 0) { - pub_derSz = wc_EccPublicKeyDerSize(eccKey, 0); + pub_derSz = (word32)wc_EccPublicKeyDerSize(eccKey, 0); if ((int)pub_derSz <= 0) { ret = WOLFSSL_FAILURE; } @@ -22925,7 +15085,7 @@ } if (ret == 0) { - pub_derSz = wc_EccPublicKeyToDer(eccKey, pub_der, pub_derSz, 0); + pub_derSz = (word32)wc_EccPublicKeyToDer(eccKey, pub_der, pub_derSz, 0); if ((int)pub_derSz <= 0) { ret = WOLFSSL_FATAL_ERROR; } @@ -22962,7 +15122,7 @@ #endif /* HAVE_ECC */ if (ret == 0) { - return pub_derSz; + return (int)pub_derSz; } return ret; @@ -23064,6 +15224,18 @@ } } +void wolfSSL_set_info_callback(WOLFSSL* ssl, + void (*f)(const WOLFSSL* ssl, int type, int val)) +{ + WOLFSSL_ENTER("wolfSSL_set_info_callback"); + if (ssl == NULL) { + WOLFSSL_MSG("Bad function argument"); + } + else { + ssl->CBIS = f; + } +} + unsigned long wolfSSL_ERR_peek_error(void) { @@ -23078,9 +15250,9 @@ value = (err & 0xFFFFFFL); switch (value) { - case -SSL_R_HTTP_REQUEST: + case -WC_NO_ERR_TRACE(PARSE_ERROR): return ERR_LIB_SSL; - case -ASN_NO_PEM_HEADER: + case -WC_NO_ERR_TRACE(ASN_NO_PEM_HEADER): case PEM_R_NO_START_LINE: case PEM_R_PROBLEMS_GETTING_PASSWORD: case PEM_R_BAD_PASSWORD_READ: @@ -23114,8 +15286,9 @@ #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) /* Nginx looks for this error to know to stop parsing certificates. * Same for HAProxy. */ - if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE) - || (err & 0xFFFFFFL) == -ASN_NO_PEM_HEADER) + if (err == ((ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE) || + ((err & 0xFFFFFFL) == -ASN_NO_PEM_HEADER) || + ((err & 0xFFFL) == PEM_R_NO_START_LINE )) return PEM_R_NO_START_LINE; if (err == ((ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST)) return SSL_R_HTTP_REQUEST; @@ -23515,29 +15688,6 @@ } } -/* - * Sets default PEM callback password if null is passed into - * the callback parameter of a PEM_read_bio_* function. - * - * Returns callback phrase size on success or WOLFSSL_FAILURE otherwise. - */ -int wolfSSL_PEM_def_callback(char* name, int num, int w, void* key) -{ - (void)w; - WOLFSSL_ENTER("wolfSSL_PEM_def_callback"); - - /* We assume that the user passes a default password as userdata */ - if (key) { - int sz = (int)XSTRLEN((const char*)key); - sz = (sz > num) ? num : sz; - XMEMCPY(name, key, sz); - return sz; - } else { - WOLFSSL_MSG("Error, default password cannot be created."); - return WOLFSSL_FAILURE; - } -} - #endif /* OPENSSL_EXTRA */ static long wolf_set_options(long old_op, long op) @@ -23594,6 +15744,24 @@ return old_op | op; } +static int FindHashSig(const Suites* suites, byte first, byte second) +{ + word16 i; + + if (suites == NULL || suites->hashSigAlgoSz == 0) { + WOLFSSL_MSG("Suites pointer error or suiteSz 0"); + return SUITES_ERROR; + } + + for (i = 0; i < suites->hashSigAlgoSz-1; i += 2) { + if (suites->hashSigAlgo[i] == first && + suites->hashSigAlgo[i+1] == second ) + return i; + } + + return MATCH_SUITE_ERROR; +} + long wolfSSL_set_options(WOLFSSL* ssl, long op) { word16 haveRSA = 1; @@ -23609,21 +15777,25 @@ ssl->options.mask = wolf_set_options(ssl->options.mask, op); if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_3) == WOLFSSL_OP_NO_TLSv1_3) { + WOLFSSL_MSG("Disabling TLS 1.3"); if (ssl->version.minor == TLSv1_3_MINOR) ssl->version.minor = TLSv1_2_MINOR; } if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_2) == WOLFSSL_OP_NO_TLSv1_2) { + WOLFSSL_MSG("Disabling TLS 1.2"); if (ssl->version.minor == TLSv1_2_MINOR) ssl->version.minor = TLSv1_1_MINOR; } if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1_1) == WOLFSSL_OP_NO_TLSv1_1) { + WOLFSSL_MSG("Disabling TLS 1.1"); if (ssl->version.minor == TLSv1_1_MINOR) ssl->version.minor = TLSv1_MINOR; } if ((ssl->options.mask & WOLFSSL_OP_NO_TLSv1) == WOLFSSL_OP_NO_TLSv1) { + WOLFSSL_MSG("Disabling TLS 1.0"); if (ssl->version.minor == TLSv1_MINOR) ssl->version.minor = SSLv3_MINOR; } @@ -23657,11 +15829,52 @@ if (ssl->options.side != WOLFSSL_NEITHER_END) { if (AllocateSuites(ssl) != 0) return 0; - InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK, - ssl->options.haveDH, ssl->options.haveECDSAsig, - ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, - ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); + if (!ssl->suites->setSuites) { + InitSuites(ssl->suites, ssl->version, keySz, haveRSA, + havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig, + ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, + ssl->options.haveFalconSig, + ssl->options.haveDilithiumSig, ssl->options.useAnon, + TRUE, ssl->options.side); + } + else { + /* Only preserve overlapping suites */ + Suites tmpSuites; + word16 in, out, haveECDSAsig = 0; + word16 haveStaticECC = ssl->options.haveStaticECC; +#ifdef NO_RSA + haveECDSAsig = 1; + haveStaticECC = 1; +#endif + XMEMSET(&tmpSuites, 0, sizeof(Suites)); + /* Get all possible ciphers and sigalgs for the version. Following + * options limit the allowed ciphers so let's try to get as many as + * possible. + * - haveStaticECC turns off haveRSA + * - haveECDSAsig turns off haveRSAsig */ + InitSuites(&tmpSuites, ssl->version, 0, 1, 1, 1, haveECDSAsig, 1, 1, + haveStaticECC, 1, 1, 1, 1, ssl->options.side); + for (in = 0, out = 0; in < ssl->suites->suiteSz; in += SUITE_LEN) { + if (FindSuite(&tmpSuites, ssl->suites->suites[in], + ssl->suites->suites[in+1]) >= 0) { + ssl->suites->suites[out] = ssl->suites->suites[in]; + ssl->suites->suites[out+1] = ssl->suites->suites[in+1]; + out += SUITE_LEN; + } + } + ssl->suites->suiteSz = out; + for (in = 0, out = 0; in < ssl->suites->hashSigAlgoSz; in += 2) { + if (FindHashSig(&tmpSuites, ssl->suites->hashSigAlgo[in], + ssl->suites->hashSigAlgo[in+1]) >= 0) { + ssl->suites->hashSigAlgo[out] = + ssl->suites->hashSigAlgo[in]; + ssl->suites->hashSigAlgo[out+1] = + ssl->suites->hashSigAlgo[in+1]; + out += 2; + } + } + ssl->suites->hashSigAlgoSz = out; + } } return ssl->options.mask; @@ -23744,47 +15957,6 @@ } #endif /* HAVE_PK_CALLBACKS */ -#if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) -const unsigned char *wolfSSL_SESSION_get0_id_context( - const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length) -{ - return wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length); -} -int wolfSSL_SESSION_set1_id(WOLFSSL_SESSION *s, - const unsigned char *sid, unsigned int sid_len) -{ - if (s == NULL) { - return WOLFSSL_FAILURE; - } - if (sid_len > ID_LEN) { - return WOLFSSL_FAILURE; - } - s->sessionIDSz = sid_len; - if (sid != s->sessionID) { - XMEMCPY(s->sessionID, sid, sid_len); - } - return WOLFSSL_SUCCESS; -} - -int wolfSSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, - const unsigned char *sid_ctx, unsigned int sid_ctx_len) -{ - if (s == NULL) { - return WOLFSSL_FAILURE; - } - if (sid_ctx_len > ID_LEN) { - return WOLFSSL_FAILURE; - } - s->sessionCtxSz = sid_ctx_len; - if (sid_ctx != s->sessionCtx) { - XMEMCPY(s->sessionCtx, sid_ctx, sid_ctx_len); - } - - return WOLFSSL_SUCCESS; -} - -#endif - /*** TBD ***/ #ifndef NO_WOLFSSL_STUB int wolfSSL_sk_SSL_COMP_zero(WOLFSSL_STACK* st) @@ -23806,8 +15978,8 @@ } if (type == TLSEXT_STATUSTYPE_ocsp){ - int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, s, - s->heap, s->devId); + int r = TLSX_UseCertificateStatusRequest(&s->extensions, (byte)type, 0, + s, s->heap, s->devId); return (long)r; } else { WOLFSSL_MSG( @@ -24027,7 +16199,8 @@ } #endif /* WOLFSSL_HAVE_TLS_UNIQUE */ -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ + defined(OPENSSL_ALL) long wolfSSL_get_verify_result(const WOLFSSL *ssl) { if (ssl == NULL) { @@ -24154,117 +16327,7 @@ } #endif - -/* Return the total number of sessions */ -long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx) -{ - word32 total = 0; - - WOLFSSL_ENTER("wolfSSL_CTX_sess_number"); - (void)ctx; - -#if defined(WOLFSSL_SESSION_STATS) && !defined(NO_SESSION_CACHE) - if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Error getting session stats"); - } -#else - WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats"); -#endif - - return (long)total; -} - - #ifndef NO_CERTS -long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509) -{ - byte* chain = NULL; - int derSz; - const byte* der; - int ret; - DerBuffer *derBuffer = NULL; - - WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert"); - - if (ctx == NULL || x509 == NULL) { - WOLFSSL_MSG("Bad Argument"); - return WOLFSSL_FAILURE; - } - - der = wolfSSL_X509_get_der(x509, &derSz); - if (der == NULL || derSz <= 0) { - WOLFSSL_MSG("Error getting X509 DER"); - return WOLFSSL_FAILURE; - } - - if (ctx->certificate == NULL) { - WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format"); - - /* Process buffer makes first certificate the leaf. */ - ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE, - NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx)); - if (ret != WOLFSSL_SUCCESS) { - WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret); - return WOLFSSL_FAILURE; - } - } - else { - long chainSz = 0; - int idx = 0; - - /* TODO: Do this elsewhere. */ - ret = AllocDer(&derBuffer, derSz, CERT_TYPE, ctx->heap); - if (ret != 0) { - WOLFSSL_MSG("Memory Error"); - return WOLFSSL_FAILURE; - } - XMEMCPY(derBuffer->buffer, der, derSz); - ret = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA, - GET_VERIFY_SETTING_CTX(ctx)); - if (ret != WOLFSSL_SUCCESS) { - WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret); - return WOLFSSL_FAILURE; - } - - /* adding cert to existing chain */ - if (ctx->certChain != NULL && ctx->certChain->length > 0) { - chainSz += ctx->certChain->length; - } - chainSz += OPAQUE24_LEN + derSz; - - chain = (byte*)XMALLOC(chainSz, ctx->heap, DYNAMIC_TYPE_DER); - if (chain == NULL) { - WOLFSSL_MSG("Memory Error"); - return WOLFSSL_FAILURE; - } - - if (ctx->certChain != NULL && ctx->certChain->length > 0) { - XMEMCPY(chain, ctx->certChain->buffer, ctx->certChain->length); - idx = ctx->certChain->length; - } - c32to24(derSz, chain + idx); - idx += OPAQUE24_LEN; - XMEMCPY(chain + idx, der, derSz); - idx += derSz; -#ifdef WOLFSSL_TLS13 - ctx->certChainCnt++; -#endif - - FreeDer(&ctx->certChain); - ret = AllocDer(&ctx->certChain, idx, CERT_TYPE, ctx->heap); - if (ret == 0) { - XMEMCPY(ctx->certChain->buffer, chain, idx); - } - } - - /* on success WOLFSSL_X509 memory is responsibility of ctx */ - wolfSSL_X509_free(x509); - if (chain != NULL) - XFREE(chain, ctx->heap, DYNAMIC_TYPE_DER); - - return WOLFSSL_SUCCESS; -} - long wolfSSL_CTX_set_tlsext_status_arg(WOLFSSL_CTX* ctx, void* arg) { @@ -24333,676 +16396,6 @@ return WOLFSSL_SUCCESS; } - -#ifndef NO_DES3 -/* 0 on success */ -int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* myDes, - WOLFSSL_DES_key_schedule* key) -{ -#ifdef WOLFSSL_CHECK_DESKEY - return wolfSSL_DES_set_key_checked(myDes, key); -#else - wolfSSL_DES_set_key_unchecked(myDes, key); - return 0; -#endif -} - - - -/* return true in fail case (1) */ -static int DES_check(word32 mask, word32 mask2, unsigned char* key) -{ - word32 value[2]; - - /* sanity check on length made in wolfSSL_DES_set_key_checked */ - value[0] = mask; - value[1] = mask2; - return (XMEMCMP(value, key, sizeof(value)) == 0)? 1: 0; -} - - -/* check that the key is odd parity and is not a weak key - * returns -1 if parity is wrong, -2 if weak/null key and 0 on success */ -int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* myDes, - WOLFSSL_DES_key_schedule* key) -{ - if (myDes == NULL || key == NULL) { - WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked"); - return -2; - } - else { - word32 sz = sizeof(WOLFSSL_DES_key_schedule); - - /* sanity check before call to DES_check */ - if (sz != (sizeof(word32) * 2)) { - WOLFSSL_MSG("Unexpected WOLFSSL_DES_key_schedule size"); - return -2; - } - - /* check odd parity */ - if (wolfSSL_DES_check_key_parity(myDes) != 1) { - WOLFSSL_MSG("Odd parity test fail"); - return -1; - } - - if (wolfSSL_DES_is_weak_key(myDes) == 1) { - WOLFSSL_MSG("Weak key found"); - return -2; - } - - /* passed tests, now copy over key */ - XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock)); - - return 0; - } -} - - -/* check is not weak. Weak key list from Nist "Recommendation for the Triple - * Data Encryption Algorithm (TDEA) Block Cipher" - * - * returns 1 if is weak 0 if not - */ -int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key) -{ - word32 mask, mask2; - - WOLFSSL_ENTER("wolfSSL_DES_is_weak_key"); - - if (key == NULL) { - WOLFSSL_MSG("NULL key passed in"); - return 1; - } - - mask = 0x01010101; mask2 = 0x01010101; - if (DES_check(mask, mask2, *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - mask = 0xFEFEFEFE; mask2 = 0xFEFEFEFE; - if (DES_check(mask, mask2, *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - mask = 0xE0E0E0E0; mask2 = 0xF1F1F1F1; - if (DES_check(mask, mask2, *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - mask = 0x1F1F1F1F; mask2 = 0x0E0E0E0E; - if (DES_check(mask, mask2, *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - /* semi-weak *key check (list from same Nist paper) */ - mask = 0x011F011F; mask2 = 0x010E010E; - if (DES_check(mask, mask2, *key) || - DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - mask = 0x01E001E0; mask2 = 0x01F101F1; - if (DES_check(mask, mask2, *key) || - DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - mask = 0x01FE01FE; mask2 = 0x01FE01FE; - if (DES_check(mask, mask2, *key) || - DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - mask = 0x1FE01FE0; mask2 = 0x0EF10EF1; - if (DES_check(mask, mask2, *key) || - DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - mask = 0x1FFE1FFE; mask2 = 0x0EFE0EFE; - if (DES_check(mask, mask2, *key) || - DES_check(ByteReverseWord32(mask), ByteReverseWord32(mask2), *key)) { - WOLFSSL_MSG("Weak key found"); - return 1; - } - - return 0; -} - - -void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* myDes, - WOLFSSL_DES_key_schedule* key) -{ - if (myDes != NULL && key != NULL) { - XMEMCPY(key, myDes, sizeof(WOLFSSL_const_DES_cblock)); - } -} - - -/* Sets the parity of the DES key for use */ -void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* myDes) -{ - word32 i; - word32 sz = sizeof(WOLFSSL_DES_cblock); - - WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity"); - - for (i = 0; i < sz; i++) { - unsigned char c = (*myDes)[i]; - if (( - ((c >> 1) & 0x01) ^ - ((c >> 2) & 0x01) ^ - ((c >> 3) & 0x01) ^ - ((c >> 4) & 0x01) ^ - ((c >> 5) & 0x01) ^ - ((c >> 6) & 0x01) ^ - ((c >> 7) & 0x01)) == (c & 0x01)) { - WOLFSSL_MSG("Flipping parity bit"); - (*myDes)[i] = c ^ 0x01; - } - } -} - -int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *myDes) -{ - word32 i; - word32 sz = sizeof(WOLFSSL_DES_cblock); - - WOLFSSL_ENTER("wolfSSL_DES_check_key_parity"); - - for (i = 0; i < sz; i++) { - unsigned char c = (*myDes)[i]; - if (( - ((c >> 1) & 0x01) ^ - ((c >> 2) & 0x01) ^ - ((c >> 3) & 0x01) ^ - ((c >> 4) & 0x01) ^ - ((c >> 5) & 0x01) ^ - ((c >> 6) & 0x01) ^ - ((c >> 7) & 0x01)) == (c & 0x01)) { - return 0; - } - } - return 1; -} - -#ifdef WOLFSSL_DES_ECB -/* Encrypt or decrypt input message desa with key and get output in desb. - * if enc is DES_ENCRYPT,input message is encrypted or - * if enc is DES_DECRYPT,input message is decrypted. - * */ -void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* desa, - WOLFSSL_DES_cblock* desb, WOLFSSL_DES_key_schedule* key, int enc) -{ - Des myDes; - - WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt"); - - if (desa == NULL || key == NULL || desb == NULL || - (enc != DES_ENCRYPT && enc != DES_DECRYPT)) { - WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt"); - } else { - if (wc_Des_SetKey(&myDes, (const byte*) key, - (const byte*) NULL, !enc) != 0) { - WOLFSSL_MSG("wc_Des_SetKey return error."); - return; - } - if (enc == DES_ENCRYPT){ - if (wc_Des_EcbEncrypt(&myDes, (byte*) desb, (const byte*) desa, - sizeof(WOLFSSL_DES_cblock)) != 0){ - WOLFSSL_MSG("wc_Des_EcbEncrypt return error."); - } - } else { - if (wc_Des_EcbDecrypt(&myDes, (byte*) desb, (const byte*) desa, - sizeof(WOLFSSL_DES_cblock)) != 0){ - WOLFSSL_MSG("wc_Des_EcbDecrpyt return error."); - } - } - } -} -#endif -#endif /* NO_DES3 */ - -#ifndef NO_RC4 -/* Set the key state for Arc4 structure. - * - * key Arc4 structure to use - * len length of data buffer - * data initial state to set Arc4 structure - */ -void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len, - const unsigned char* data) -{ - typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1]; - (void)sizeof(rc4_test); - - WOLFSSL_ENTER("wolfSSL_RC4_set_key"); - - if (key == NULL || len < 0) { - WOLFSSL_MSG("bad argument passed in"); - return; - } - - XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY)); - wc_Arc4SetKey((Arc4*)key, data, (word32)len); -} - - -/* Encrypt/decrypt with Arc4 structure. - * - * len length of buffer to encrypt/decrypt (in/out) - * in buffer to encrypt/decrypt - * out results of encryption/decryption - */ -void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len, - const unsigned char* in, unsigned char* out) -{ - WOLFSSL_ENTER("wolfSSL_RC4"); - - if (key == NULL || in == NULL || out == NULL) { - WOLFSSL_MSG("Bad argument passed in"); - return; - } - - wc_Arc4Process((Arc4*)key, out, in, (word32)len); -} -#endif /* NO_RC4 */ - -#ifndef NO_AES - -#ifdef WOLFSSL_AES_DIRECT -/* AES encrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input. - * - * input Data to encrypt - * output Encrypted data after done - * key AES key to use for encryption - */ -void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output, - AES_KEY *key) -{ - WOLFSSL_ENTER("wolfSSL_AES_encrypt"); - - if (input == NULL || output == NULL || key == NULL) { - WOLFSSL_MSG("Null argument passed in"); - return; - } - -#if !defined(HAVE_SELFTEST) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (wc_AesEncryptDirect((Aes*)key, output, input) != 0) { - WOLFSSL_MSG("wc_AesEncryptDirect failed"); - return; - } -#else - wc_AesEncryptDirect((Aes*)key, output, input); -#endif -} - - -/* AES decrypt direct, it is expected to be blocks of AES_BLOCK_SIZE for input. - * - * input Data to decrypt - * output Decrypted data after done - * key AES key to use for encryption - */ -void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output, - AES_KEY *key) -{ - WOLFSSL_ENTER("wolfSSL_AES_decrypt"); - - if (input == NULL || output == NULL || key == NULL) { - WOLFSSL_MSG("Null argument passed in"); - return; - } - -#if !defined(HAVE_SELFTEST) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - if (wc_AesDecryptDirect((Aes*)key, output, input) != 0) { - WOLFSSL_MSG("wc_AesDecryptDirect failed"); - return; - } -#else - wc_AesDecryptDirect((Aes*)key, output, input); -#endif -} -#endif /* WOLFSSL_AES_DIRECT */ - -/* Setup of an AES key to use for encryption. - * - * key key in bytes to use for encryption - * bits size of key in bits - * aes AES structure to initialize - */ -int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits, - AES_KEY *aes) -{ - typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1]; - (void)sizeof(aes_test); - - WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key"); - - if (key == NULL || aes == NULL) { - WOLFSSL_MSG("Null argument passed in"); - return -1; - } - - XMEMSET(aes, 0, sizeof(AES_KEY)); - if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_ENCRYPT) != 0) { - WOLFSSL_MSG("Error in setting AES key"); - return -1; - } - return 0; -} - - -/* Setup of an AES key to use for decryption. - * - * key key in bytes to use for decryption - * bits size of key in bits - * aes AES structure to initialize - */ -int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits, - AES_KEY *aes) -{ - typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1]; - (void)sizeof(aes_test); - - WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key"); - - if (key == NULL || aes == NULL) { - WOLFSSL_MSG("Null argument passed in"); - return -1; - } - - XMEMSET(aes, 0, sizeof(AES_KEY)); - if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, AES_DECRYPT) != 0) { - WOLFSSL_MSG("Error in setting AES key"); - return -1; - } - return 0; -} - - -#ifdef HAVE_AES_ECB -/* Encrypt/decrypt a 16 byte block of data using the key passed in. - * - * in buffer to encrypt/decrypt - * out buffer to hold result of encryption/decryption - * key AES structure to use with encryption/decryption - * enc AES_ENCRPT for encryption and AES_DECRYPT for decryption - */ -void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out, - AES_KEY *key, const int enc) -{ - Aes* aes; - - WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt"); - - if (key == NULL || in == NULL || out == NULL) { - WOLFSSL_MSG("Error, Null argument passed in"); - return; - } - - aes = (Aes*)key; - if (enc == AES_ENCRYPT) { - if (wc_AesEcbEncrypt(aes, out, in, AES_BLOCK_SIZE) != 0) { - WOLFSSL_MSG("Error with AES CBC encrypt"); - } - } - else { - #ifdef HAVE_AES_DECRYPT - if (wc_AesEcbDecrypt(aes, out, in, AES_BLOCK_SIZE) != 0) { - WOLFSSL_MSG("Error with AES CBC decrypt"); - } - #else - WOLFSSL_MSG("AES decryption not compiled in"); - #endif - } -} -#endif /* HAVE_AES_ECB */ - -#ifdef HAVE_AES_CBC -/* Encrypt data using key and iv passed in. iv gets updated to most recent iv - * state after encryption/decryption. - * - * in buffer to encrypt/decrypt - * out buffer to hold result of encryption/decryption - * len length of input buffer - * key AES structure to use with encryption/decryption - * iv iv to use with operation - * enc 1 for encryption and 0 for decryption - */ -void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out, - size_t len, AES_KEY *key, unsigned char* iv, const int enc) -{ - Aes* aes; - - WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt"); - - if (key == NULL || in == NULL || out == NULL || iv == NULL || len == 0) { - WOLFSSL_MSG("Error, Null argument passed in"); - return; - } - - aes = (Aes*)key; - if (wc_AesSetIV(aes, (const byte*)iv) != 0) { - WOLFSSL_MSG("Error with setting iv"); - return; - } - - if (enc == AES_ENCRYPT) { - if (wc_AesCbcEncrypt(aes, out, in, (word32)len) != 0) { - WOLFSSL_MSG("Error with AES CBC encrypt"); - return; - } - } - else { - if (wc_AesCbcDecrypt(aes, out, in, (word32)len) != 0) { - WOLFSSL_MSG("Error with AES CBC decrypt"); - return; - } - } - - /* to be compatible copy iv to iv buffer after completing operation */ - XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE); -} -#endif /* HAVE_AES_CBC */ - - -/* Encrypt data using CFB mode with key and iv passed in. iv gets updated to - * most recent iv state after encryption/decryption. - * - * in buffer to encrypt/decrypt - * out buffer to hold result of encryption/decryption - * len length of input buffer - * key AES structure to use with encryption/decryption - * iv iv to use with operation - * num contains the amount of block used - * enc AES_ENCRYPT for encryption and AES_DECRYPT for decryption - */ -void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out, - size_t len, AES_KEY *key, unsigned char* iv, int* num, - const int enc) -{ -#ifndef WOLFSSL_AES_CFB - WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB"); - (void)in; - (void)out; - (void)len; - (void)key; - (void)iv; - (void)num; - (void)enc; - - return; -#else - Aes* aes; - - WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt"); - if (key == NULL || in == NULL || out == NULL || iv == NULL) { - WOLFSSL_MSG("Error, Null argument passed in"); - return; - } - - aes = (Aes*)key; - - /* - * We copy the IV directly into reg here because using wc_AesSetIV will - * clear the leftover bytes field "left", and this function relies on the - * leftover bytes being preserved between calls. - */ - XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); - - if (enc == AES_ENCRYPT) { - if (wc_AesCfbEncrypt(aes, out, in, (word32)len) != 0) { - WOLFSSL_MSG("Error with AES CBC encrypt"); - return; - } - } - else { - if (wc_AesCfbDecrypt(aes, out, in, (word32)len) != 0) { - WOLFSSL_MSG("Error with AES CBC decrypt"); - return; - } - } - - /* to be compatible copy iv to iv buffer after completing operation */ - XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE); - - /* store number of left over bytes to num */ - *num = (aes->left)? AES_BLOCK_SIZE - aes->left : 0; -#endif /* WOLFSSL_AES_CFB */ -} - -/* wc_AesKey*Wrap_ex API not available in FIPS and SELFTEST */ -#if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) -int wolfSSL_AES_wrap_key(AES_KEY *key, const unsigned char *iv, - unsigned char *out, - const unsigned char *in, unsigned int inlen) -{ - int ret; - - WOLFSSL_ENTER("wolfSSL_AES_wrap_key"); - - if (out == NULL || in == NULL) { - WOLFSSL_MSG("Error, Null argument passed in"); - return WOLFSSL_FAILURE; - } - - ret = wc_AesKeyWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv); - - return ret < 0 ? WOLFSSL_FAILURE : ret; -} - -int wolfSSL_AES_unwrap_key(AES_KEY *key, const unsigned char *iv, - unsigned char *out, - const unsigned char *in, unsigned int inlen) -{ - int ret; - - WOLFSSL_ENTER("wolfSSL_AES_wrap_key"); - - if (out == NULL || in == NULL) { - WOLFSSL_MSG("Error, Null argument passed in"); - return WOLFSSL_FAILURE; - } - - ret = wc_AesKeyUnWrap_ex((Aes*)key, in, inlen, out, inlen + KEYWRAP_BLOCK_SIZE, iv); - - return ret < 0 ? WOLFSSL_FAILURE : ret; -} -#endif /* HAVE_AES_KEYWRAP && !HAVE_FIPS && !HAVE_SELFTEST */ - -#ifdef HAVE_CTS -/* - * Ciphertext stealing interface compatible with RFC2040 and RFC3962. - */ -size_t wolfSSL_CRYPTO_cts128_encrypt(const unsigned char *in, - unsigned char *out, size_t len, const void *key, - unsigned char *iv, WOLFSSL_CBC128_CB cbc) -{ - byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ]; - int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ; - WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_encrypt"); - - if (in == NULL || out == NULL || len < WOLFSSL_CTS128_BLOCK_SZ || - cbc == NULL) { - WOLFSSL_MSG("Bad parameter"); - return WOLFSSL_FAILURE; - } - - if (lastBlkLen == 0) - lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ; - - /* Encrypt data up to last block */ - (*cbc)(in, out, len - lastBlkLen, key, iv, AES_ENCRYPT); - - /* Move to last block */ - in += len - lastBlkLen; - out += len - lastBlkLen; - - /* RFC2040: Pad Pn with zeros at the end to create P of length BB. */ - XMEMCPY(lastBlk, in, lastBlkLen); - XMEMSET(lastBlk + lastBlkLen, 0, WOLFSSL_CTS128_BLOCK_SZ - lastBlkLen); - /* RFC2040: Select the first Ln bytes of En-1 to create Cn */ - XMEMCPY(out, out - WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen); - (*cbc)(lastBlk, out - WOLFSSL_CTS128_BLOCK_SZ, WOLFSSL_CTS128_BLOCK_SZ, - key, iv, AES_ENCRYPT); - - return len; -} - -size_t wolfSSL_CRYPTO_cts128_decrypt(const unsigned char *in, - unsigned char *out, size_t len, const void *key, - unsigned char *iv, WOLFSSL_CBC128_CB cbc) -{ - byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ]; - byte prevBlk[WOLFSSL_CTS128_BLOCK_SZ]; - int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ; - WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_decrypt"); - - if (in == NULL || out == NULL || len <= WOLFSSL_CTS128_BLOCK_SZ || - cbc == NULL) { - WOLFSSL_MSG("Bad parameter"); - return WOLFSSL_FAILURE; - } - - if (lastBlkLen == 0) - lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ; - - /* Decrypt up to last two blocks */ - (*cbc)(in, out, len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ, key, iv, - AES_DECRYPTION); - - /* Move to last two blocks */ - in += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ; - out += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ; - - /* RFC2040: Decrypt Cn-1 to create Dn. - * Use 0 buffer as IV to do straight decryption. - * This places the Cn-1 block at lastBlk */ - XMEMSET(lastBlk, 0, WOLFSSL_CTS128_BLOCK_SZ); - (*cbc)(in, prevBlk, WOLFSSL_CTS128_BLOCK_SZ, key, lastBlk, AES_DECRYPT); - /* RFC2040: Append the tail (BB minus Ln) bytes of Xn to Cn - * to create En. */ - XMEMCPY(prevBlk, in + WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen); - /* Cn and Cn-1 can now be decrypted */ - (*cbc)(prevBlk, out, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT); - (*cbc)(lastBlk, lastBlk, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT); - XMEMCPY(out + WOLFSSL_CTS128_BLOCK_SZ, lastBlk, lastBlkLen); - return len; -} -#endif /* HAVE_CTS */ -#endif /* NO_AES */ - #endif /* OPENSSL_EXTRA */ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) @@ -25174,6 +16567,38 @@ return NULL; } + +WOLFSSL_STACK* wolfSSL_shallow_sk_dup(WOLFSSL_STACK* sk) +{ + + WOLFSSL_STACK* ret = NULL; + WOLFSSL_STACK** prev = &ret; + + WOLFSSL_ENTER("wolfSSL_shallow_sk_dup"); + + for (; sk != NULL; sk = sk->next) { + WOLFSSL_STACK* cur = wolfSSL_sk_new_node(sk->heap); + + if (!cur) { + WOLFSSL_MSG("wolfSSL_sk_new_node error"); + goto error; + } + + XMEMCPY(cur, sk, sizeof(WOLFSSL_STACK)); + cur->next = NULL; + + *prev = cur; + prev = &cur->next; + } + return ret; + +error: + if (ret) { + wolfSSL_sk_free(ret); + } + return NULL; +} + /* Free the just the stack structure */ void wolfSSL_sk_free(WOLFSSL_STACK* sk) { @@ -25414,569 +16839,6 @@ #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ -#if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \ - defined(HAVE_EXT_CACHE)) -/* stunnel 4.28 needs - * - * Callback that is called if a session tries to resume but could not find - * the session to resume it. - */ -void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx, - WOLFSSL_SESSION*(*f)(WOLFSSL*, const unsigned char*, int, int*)) -{ - if (ctx == NULL) - return; - -#ifdef HAVE_EXT_CACHE - ctx->get_sess_cb = f; -#else - (void)f; -#endif -} - -void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx, - int (*f)(WOLFSSL*, WOLFSSL_SESSION*)) -{ - if (ctx == NULL) - return; - -#ifdef HAVE_EXT_CACHE - ctx->new_sess_cb = f; -#else - (void)f; -#endif -} - -void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*, - WOLFSSL_SESSION*)) -{ - if (ctx == NULL) - return; - -#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) - ctx->rem_sess_cb = f; -#else - (void)f; -#endif -} - - -/* - * - * Note: It is expected that the importing and exporting function have been - * built with the same settings. For example if session tickets was - * enabled with the wolfSSL library exporting a session then it is - * expected to be turned on with the wolfSSL library importing the session. - */ -int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p) -{ - int size = 0; -#ifdef HAVE_EXT_CACHE - int idx = 0; -#ifdef SESSION_CERTS - int i; -#endif - - WOLFSSL_ENTER("wolfSSL_i2d_SSL_SESSION"); - - sess = ClientSessionToSession(sess); - if (sess == NULL) { - return BAD_FUNC_ARG; - } - - /* side | bornOn | timeout | sessionID len | sessionID | masterSecret | - * haveEMS */ - size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN + - sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN; - /* altSessionID */ - size += OPAQUE8_LEN + (sess->haveAltSessionID ? ID_LEN : 0); -#ifdef SESSION_CERTS - /* Peer chain */ - size += OPAQUE8_LEN; - for (i = 0; i < sess->chain.count; i++) - size += OPAQUE16_LEN + sess->chain.certs[i].length; -#endif -#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ - defined(HAVE_SESSION_TICKET)) - /* Protocol version */ - size += OPAQUE16_LEN; -#endif -#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ - (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) - /* cipher suite */ - size += OPAQUE16_LEN; -#endif -#ifndef NO_CLIENT_CACHE - /* ServerID len | ServerID */ - size += OPAQUE16_LEN + sess->idLen; -#endif -#ifdef OPENSSL_EXTRA - /* session context ID len | session context ID */ - size += OPAQUE8_LEN + sess->sessionCtxSz; -#endif -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - /* peerVerifyRet */ - size += OPAQUE8_LEN; -#endif -#ifdef WOLFSSL_TLS13 - /* namedGroup */ - size += OPAQUE16_LEN; -#endif -#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) -#ifdef WOLFSSL_TLS13 -#ifdef WOLFSSL_32BIT_MILLI_TIME - /* ticketSeen | ticketAdd */ - size += OPAQUE32_LEN + OPAQUE32_LEN; -#else - /* ticketSeen Hi 32 bits | ticketSeen Lo 32 bits | ticketAdd */ - size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE32_LEN; -#endif - /* ticketNonce */ - size += OPAQUE8_LEN + sess->ticketNonce.len; -#endif -#ifdef WOLFSSL_EARLY_DATA - size += OPAQUE32_LEN; -#endif -#endif -#ifdef HAVE_SESSION_TICKET - /* ticket len | ticket */ - size += OPAQUE16_LEN + sess->ticketLen; -#endif - - if (p != NULL) { - unsigned char *data; - - if (*p == NULL) - *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL); - if (*p == NULL) - return 0; - data = *p; - - data[idx++] = sess->side; - c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN; - c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN; - data[idx++] = sess->sessionIDSz; - XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz); - idx += sess->sessionIDSz; - XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN; - data[idx++] = (byte)sess->haveEMS; - data[idx++] = sess->haveAltSessionID ? ID_LEN : 0; - if (sess->haveAltSessionID) { - XMEMCPY(data + idx, sess->altSessionID, ID_LEN); - idx += ID_LEN; - } -#ifdef SESSION_CERTS - data[idx++] = (byte)sess->chain.count; - for (i = 0; i < sess->chain.count; i++) { - c16toa((word16)sess->chain.certs[i].length, data + idx); - idx += OPAQUE16_LEN; - XMEMCPY(data + idx, sess->chain.certs[i].buffer, - sess->chain.certs[i].length); - idx += sess->chain.certs[i].length; - } -#endif -#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ - defined(HAVE_SESSION_TICKET)) - data[idx++] = sess->version.major; - data[idx++] = sess->version.minor; -#endif -#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ - (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) - data[idx++] = sess->cipherSuite0; - data[idx++] = sess->cipherSuite; -#endif -#ifndef NO_CLIENT_CACHE - c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN; - XMEMCPY(data + idx, sess->serverID, sess->idLen); - idx += sess->idLen; -#endif -#ifdef OPENSSL_EXTRA - data[idx++] = sess->sessionCtxSz; - XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz); - idx += sess->sessionCtxSz; -#endif -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - data[idx++] = sess->peerVerifyRet; -#endif -#ifdef WOLFSSL_TLS13 - c16toa(sess->namedGroup, data + idx); - idx += OPAQUE16_LEN; -#endif -#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) -#ifdef WOLFSSL_TLS13 -#ifdef WOLFSSL_32BIT_MILLI_TIME - c32toa(sess->ticketSeen, data + idx); - idx += OPAQUE32_LEN; -#else - c32toa((word32)(sess->ticketSeen >> 32), data + idx); - idx += OPAQUE32_LEN; - c32toa((word32)sess->ticketSeen, data + idx); - idx += OPAQUE32_LEN; -#endif - c32toa(sess->ticketAdd, data + idx); - idx += OPAQUE32_LEN; - data[idx++] = sess->ticketNonce.len; - XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len); - idx += sess->ticketNonce.len; -#endif -#ifdef WOLFSSL_EARLY_DATA - c32toa(sess->maxEarlyDataSz, data + idx); - idx += OPAQUE32_LEN; -#endif -#endif -#ifdef HAVE_SESSION_TICKET - c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN; - XMEMCPY(data + idx, sess->ticket, sess->ticketLen); - idx += sess->ticketLen; -#endif - } -#endif - - (void)sess; - (void)p; -#ifdef HAVE_EXT_CACHE - (void)idx; -#endif - - return size; -} - - -/* TODO: no function to free new session. - * - * Note: It is expected that the importing and exporting function have been - * built with the same settings. For example if session tickets was - * enabled with the wolfSSL library exporting a session then it is - * expected to be turned on with the wolfSSL library importing the session. - */ -WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess, - const unsigned char** p, long i) -{ - WOLFSSL_SESSION* s = NULL; - int ret = 0; -#if defined(HAVE_EXT_CACHE) - int idx; - byte* data; -#ifdef SESSION_CERTS - int j; - word16 length; -#endif -#endif /* HAVE_EXT_CACHE */ - - (void)p; - (void)i; - (void)ret; - (void)sess; - -#ifdef HAVE_EXT_CACHE - if (p == NULL || *p == NULL) - return NULL; - - s = wolfSSL_SESSION_new(); - if (s == NULL) - return NULL; - - idx = 0; - data = (byte*)*p; - - /* side | bornOn | timeout | sessionID len */ - if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) { - ret = BUFFER_ERROR; - goto end; - } - s->side = data[idx++]; - ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN; - ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN; - s->sessionIDSz = data[idx++]; - - /* sessionID | secret | haveEMS | haveAltSessionID */ - if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN + OPAQUE8_LEN) { - ret = BUFFER_ERROR; - goto end; - } - XMEMCPY(s->sessionID, data + idx, s->sessionIDSz); - idx += s->sessionIDSz; - XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN; - s->haveEMS = data[idx++]; - if (data[idx] != ID_LEN && data[idx] != 0) { - ret = BUFFER_ERROR; - goto end; - } - s->haveAltSessionID = data[idx++] == ID_LEN; - - /* altSessionID */ - if (s->haveAltSessionID) { - if (i - idx < ID_LEN) { - ret = BUFFER_ERROR; - goto end; - } - XMEMCPY(s->altSessionID, data + idx, ID_LEN); idx += ID_LEN; - } - -#ifdef SESSION_CERTS - /* Certificate chain */ - if (i - idx == 0) { - ret = BUFFER_ERROR; - goto end; - } - s->chain.count = data[idx++]; - for (j = 0; j < s->chain.count; j++) { - if (i - idx < OPAQUE16_LEN) { - ret = BUFFER_ERROR; - goto end; - } - ato16(data + idx, &length); idx += OPAQUE16_LEN; - s->chain.certs[j].length = length; - if (i - idx < length) { - ret = BUFFER_ERROR; - goto end; - } - XMEMCPY(s->chain.certs[j].buffer, data + idx, length); - idx += length; - } -#endif -#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ - defined(HAVE_SESSION_TICKET)) - /* Protocol Version */ - if (i - idx < OPAQUE16_LEN) { - ret = BUFFER_ERROR; - goto end; - } - s->version.major = data[idx++]; - s->version.minor = data[idx++]; -#endif -#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ - (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) - /* Cipher suite */ - if (i - idx < OPAQUE16_LEN) { - ret = BUFFER_ERROR; - goto end; - } - s->cipherSuite0 = data[idx++]; - s->cipherSuite = data[idx++]; -#endif -#ifndef NO_CLIENT_CACHE - /* ServerID len */ - if (i - idx < OPAQUE16_LEN) { - ret = BUFFER_ERROR; - goto end; - } - ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN; - - /* ServerID */ - if (i - idx < s->idLen) { - ret = BUFFER_ERROR; - goto end; - } - XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen; -#endif -#ifdef OPENSSL_EXTRA - /* byte for length of session context ID */ - if (i - idx < OPAQUE8_LEN) { - ret = BUFFER_ERROR; - goto end; - } - s->sessionCtxSz = data[idx++]; - - /* app session context ID */ - if (i - idx < s->sessionCtxSz) { - ret = BUFFER_ERROR; - goto end; - } - XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz; -#endif -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - /* byte for peerVerifyRet */ - if (i - idx < OPAQUE8_LEN) { - ret = BUFFER_ERROR; - goto end; - } - s->peerVerifyRet = data[idx++]; -#endif -#ifdef WOLFSSL_TLS13 - if (i - idx < OPAQUE16_LEN) { - ret = BUFFER_ERROR; - goto end; - } - ato16(data + idx, &s->namedGroup); - idx += OPAQUE16_LEN; -#endif -#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) -#ifdef WOLFSSL_TLS13 - if (i - idx < (OPAQUE32_LEN * 2)) { - ret = BUFFER_ERROR; - goto end; - } -#ifdef WOLFSSL_32BIT_MILLI_TIME - ato32(data + idx, &s->ticketSeen); - idx += OPAQUE32_LEN; -#else - { - word32 seenHi, seenLo; - - ato32(data + idx, &seenHi); - idx += OPAQUE32_LEN; - ato32(data + idx, &seenLo); - idx += OPAQUE32_LEN; - s->ticketSeen = ((sword64)seenHi << 32) + seenLo; - } -#endif - ato32(data + idx, &s->ticketAdd); - idx += OPAQUE32_LEN; - if (i - idx < OPAQUE8_LEN) { - ret = BUFFER_ERROR; - goto end; - } - s->ticketNonce.len = data[idx++]; - - if (i - idx < s->ticketNonce.len) { - ret = BUFFER_ERROR; - goto end; - } -#if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) - ret = SessionTicketNoncePopulate(s, data + idx, s->ticketNonce.len); - if (ret != 0) - goto end; -#else - if (s->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) { - ret = BUFFER_ERROR; - goto end; - } - XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len); -#endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */ - - idx += s->ticketNonce.len; -#endif -#ifdef WOLFSSL_EARLY_DATA - if (i - idx < OPAQUE32_LEN) { - ret = BUFFER_ERROR; - goto end; - } - ato32(data + idx, &s->maxEarlyDataSz); - idx += OPAQUE32_LEN; -#endif -#endif -#ifdef HAVE_SESSION_TICKET - /* ticket len */ - if (i - idx < OPAQUE16_LEN) { - ret = BUFFER_ERROR; - goto end; - } - ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN; - - /* Dispose of ol dynamic ticket and ensure space for new ticket. */ - if (s->ticketLenAlloc > 0) { - XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK); - } - if (s->ticketLen <= SESSION_TICKET_LEN) - s->ticket = s->staticTicket; - else { - s->ticket = (byte*)XMALLOC(s->ticketLen, NULL, - DYNAMIC_TYPE_SESSION_TICK); - if (s->ticket == NULL) { - ret = MEMORY_ERROR; - goto end; - } - s->ticketLenAlloc = (word16)s->ticketLen; - } - - /* ticket */ - if (i - idx < s->ticketLen) { - ret = BUFFER_ERROR; - goto end; - } - XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen; -#endif - (void)idx; - - if (sess != NULL) { - *sess = s; - } - - s->isSetup = 1; - - *p += idx; - -end: - if (ret != 0 && (sess == NULL || *sess != s)) { - wolfSSL_FreeSession(NULL, s); - s = NULL; - } -#endif /* HAVE_EXT_CACHE */ - return s; -} - -/* Check if there is a session ticket associated with this WOLFSSL_SESSION. - * - * sess - pointer to WOLFSSL_SESSION struct - * - * Returns 1 if has session ticket, otherwise 0 */ -int wolfSSL_SESSION_has_ticket(const WOLFSSL_SESSION* sess) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_has_ticket"); -#ifdef HAVE_SESSION_TICKET - sess = ClientSessionToSession(sess); - if (sess) { - if ((sess->ticketLen > 0) && (sess->ticket != NULL)) { - return WOLFSSL_SUCCESS; - } - } -#else - (void)sess; -#endif - return WOLFSSL_FAILURE; -} - -unsigned long wolfSSL_SESSION_get_ticket_lifetime_hint( - const WOLFSSL_SESSION* sess) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_get_ticket_lifetime_hint"); - sess = ClientSessionToSession(sess); - if (sess) { - return sess->timeout; - } - return 0; -} - -long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess) -{ - long timeout = 0; - WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout"); - sess = ClientSessionToSession(sess); - if (sess) - timeout = sess->timeout; - return timeout; -} - - -long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess) -{ - long bornOn = 0; - WOLFSSL_ENTER("wolfSSL_SESSION_get_time"); - sess = ClientSessionToSession(sess); - if (sess) - bornOn = sess->bornOn; - return bornOn; -} - -long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t) -{ - word32 tmptime; - - ses = ClientSessionToSession(ses); - if (ses == NULL || t < 0) { - return BAD_FUNC_ARG; - } - - tmptime = t & 0xFFFFFFFF; - ses->timeout = tmptime; - - return WOLFSSL_SUCCESS; -} - -#endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */ - #ifdef OPENSSL_EXTRA #if defined(HAVE_EX_DATA) && !defined(NO_FILESYSTEM) @@ -26028,7 +16890,7 @@ if ((myBuffer != NULL) && (sz > 0) && - (XFREAD(myBuffer, 1, sz, file) == (size_t)sz) && + (XFREAD(myBuffer, 1, (size_t)sz, file) == (size_t)sz) && (PemToDer(myBuffer, (long)sz, CERT_TYPE, &fileDer, ctx->heap, NULL, NULL) == 0) && (fileDer->length != 0) && @@ -26056,80 +16918,83 @@ #ifndef NO_CERTS /* oidCertExtType */ { NID_basic_constraints, BASIC_CA_OID, oidCertExtType, "basicConstraints", - "X509v3 Basic Constraints"}, + "X509v3 Basic Constraints"}, { NID_subject_alt_name, ALT_NAMES_OID, oidCertExtType, "subjectAltName", - "X509v3 Subject Alternative Name"}, - { NID_crl_distribution_points, CRL_DIST_OID, oidCertExtType, "crlDistributionPoints", - "X509v3 CRL Distribution Points"}, + "X509v3 Subject Alternative Name"}, + { NID_crl_distribution_points, CRL_DIST_OID, oidCertExtType, + "crlDistributionPoints", "X509v3 CRL Distribution Points"}, { NID_info_access, AUTH_INFO_OID, oidCertExtType, "authorityInfoAccess", - "Authority Information Access"}, + "Authority Information Access"}, { NID_authority_key_identifier, AUTH_KEY_OID, oidCertExtType, - "authorityKeyIdentifier", "X509v3 Authority Key Identifier"}, + "authorityKeyIdentifier", "X509v3 Authority Key Identifier"}, { NID_subject_key_identifier, SUBJ_KEY_OID, oidCertExtType, - "subjectKeyIdentifier", "X509v3 Subject Key Identifier"}, + "subjectKeyIdentifier", "X509v3 Subject Key Identifier"}, { NID_key_usage, KEY_USAGE_OID, oidCertExtType, "keyUsage", - "X509v3 Key Usage"}, + "X509v3 Key Usage"}, { NID_inhibit_any_policy, INHIBIT_ANY_OID, oidCertExtType, - "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"}, + "inhibitAnyPolicy", "X509v3 Inhibit Any Policy"}, { NID_ext_key_usage, EXT_KEY_USAGE_OID, oidCertExtType, - "extendedKeyUsage", "X509v3 Extended Key Usage"}, + "extendedKeyUsage", "X509v3 Extended Key Usage"}, { NID_name_constraints, NAME_CONS_OID, oidCertExtType, - "nameConstraints", "X509v3 Name Constraints"}, + "nameConstraints", "X509v3 Name Constraints"}, { NID_certificate_policies, CERT_POLICY_OID, oidCertExtType, - "certificatePolicies", "X509v3 Certificate Policies"}, + "certificatePolicies", "X509v3 Certificate Policies"}, /* oidCertAuthInfoType */ { NID_ad_OCSP, AIA_OCSP_OID, oidCertAuthInfoType, "OCSP", - "OCSP"}, + "OCSP"}, { NID_ad_ca_issuers, AIA_CA_ISSUER_OID, oidCertAuthInfoType, - "caIssuers", "CA Issuers"}, + "caIssuers", "CA Issuers"}, /* oidCertPolicyType */ { NID_any_policy, CP_ANY_OID, oidCertPolicyType, "anyPolicy", - "X509v3 Any Policy"}, + "X509v3 Any Policy"}, /* oidCertAltNameType */ { NID_hw_name_oid, HW_NAME_OID, oidCertAltNameType, "Hardware name",""}, /* oidCertKeyUseType */ { NID_anyExtendedKeyUsage, EKU_ANY_OID, oidCertKeyUseType, - "anyExtendedKeyUsage", "Any Extended Key Usage"}, + "anyExtendedKeyUsage", "Any Extended Key Usage"}, { EKU_SERVER_AUTH_OID, EKU_SERVER_AUTH_OID, oidCertKeyUseType, - "serverAuth", "TLS Web Server Authentication"}, + "serverAuth", "TLS Web Server Authentication"}, { EKU_CLIENT_AUTH_OID, EKU_CLIENT_AUTH_OID, oidCertKeyUseType, - "clientAuth", "TLS Web Client Authentication"}, + "clientAuth", "TLS Web Client Authentication"}, { EKU_OCSP_SIGN_OID, EKU_OCSP_SIGN_OID, oidCertKeyUseType, - "OCSPSigning", "OCSP Signing"}, + "OCSPSigning", "OCSP Signing"}, /* oidCertNameType */ { NID_commonName, NID_commonName, oidCertNameType, "CN", "commonName"}, +#if !defined(WOLFSSL_CERT_REQ) { NID_surname, NID_surname, oidCertNameType, "SN", "surname"}, +#endif { NID_serialNumber, NID_serialNumber, oidCertNameType, "serialNumber", - "serialNumber"}, + "serialNumber"}, { NID_userId, NID_userId, oidCertNameType, "UID", "userid"}, { NID_countryName, NID_countryName, oidCertNameType, "C", "countryName"}, { NID_localityName, NID_localityName, oidCertNameType, "L", "localityName"}, { NID_stateOrProvinceName, NID_stateOrProvinceName, oidCertNameType, "ST", - "stateOrProvinceName"}, + "stateOrProvinceName"}, { NID_streetAddress, NID_streetAddress, oidCertNameType, "street", - "streetAddress"}, + "streetAddress"}, { NID_organizationName, NID_organizationName, oidCertNameType, "O", - "organizationName"}, + "organizationName"}, { NID_organizationalUnitName, NID_organizationalUnitName, oidCertNameType, - "OU", "organizationalUnitName"}, + "OU", "organizationalUnitName"}, { NID_emailAddress, NID_emailAddress, oidCertNameType, "emailAddress", - "emailAddress"}, + "emailAddress"}, { NID_domainComponent, NID_domainComponent, oidCertNameType, "DC", - "domainComponent"}, + "domainComponent"}, { NID_favouriteDrink, NID_favouriteDrink, oidCertNameType, "favouriteDrink", - "favouriteDrink"}, - { NID_businessCategory, NID_businessCategory, oidCertNameType, "businessCategory", - "businessCategory"}, - { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, "jurisdictionC", - "jurisdictionCountryName"}, + "favouriteDrink"}, + { NID_businessCategory, NID_businessCategory, oidCertNameType, + "businessCategory", "businessCategory"}, + { NID_jurisdictionCountryName, NID_jurisdictionCountryName, oidCertNameType, + "jurisdictionC", "jurisdictionCountryName"}, { NID_jurisdictionStateOrProvinceName, NID_jurisdictionStateOrProvinceName, - oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"}, - { NID_postalCode, NID_postalCode, oidCertNameType, "postalCode", "postalCode"}, + oidCertNameType, "jurisdictionST", "jurisdictionStateOrProvinceName"}, + { NID_postalCode, NID_postalCode, oidCertNameType, "postalCode", + "postalCode"}, { NID_userId, NID_userId, oidCertNameType, "UID", "userId"}, #if defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_NAME_ALL) @@ -26187,59 +17052,62 @@ { NID_sha3_512, SHA3_512h, oidHashType, "SHA3-512", "sha3-512"}, #endif #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + { NID_sm3, SM3h, oidHashType, "SM3", "sm3"}, + #endif /* oidSigType */ #ifndef NO_DSA #ifndef NO_SHA { NID_dsaWithSHA1, CTC_SHAwDSA, oidSigType, "DSA-SHA1", "dsaWithSHA1"}, { NID_dsa_with_SHA256, CTC_SHA256wDSA, oidSigType, "dsa_with_SHA256", - "dsa_with_SHA256"}, + "dsa_with_SHA256"}, #endif #endif /* NO_DSA */ #ifndef NO_RSA #ifdef WOLFSSL_MD2 { NID_md2WithRSAEncryption, CTC_MD2wRSA, oidSigType, "RSA-MD2", - "md2WithRSAEncryption"}, + "md2WithRSAEncryption"}, #endif #ifndef NO_MD5 { NID_md5WithRSAEncryption, CTC_MD5wRSA, oidSigType, "RSA-MD5", - "md5WithRSAEncryption"}, + "md5WithRSAEncryption"}, #endif #ifndef NO_SHA { NID_sha1WithRSAEncryption, CTC_SHAwRSA, oidSigType, "RSA-SHA1", - "sha1WithRSAEncryption"}, + "sha1WithRSAEncryption"}, #endif #ifdef WOLFSSL_SHA224 { NID_sha224WithRSAEncryption, CTC_SHA224wRSA, oidSigType, "RSA-SHA224", - "sha224WithRSAEncryption"}, + "sha224WithRSAEncryption"}, #endif #ifndef NO_SHA256 { NID_sha256WithRSAEncryption, CTC_SHA256wRSA, oidSigType, "RSA-SHA256", - "sha256WithRSAEncryption"}, + "sha256WithRSAEncryption"}, #endif #ifdef WOLFSSL_SHA384 { NID_sha384WithRSAEncryption, CTC_SHA384wRSA, oidSigType, "RSA-SHA384", - "sha384WithRSAEncryption"}, + "sha384WithRSAEncryption"}, #endif #ifdef WOLFSSL_SHA512 { NID_sha512WithRSAEncryption, CTC_SHA512wRSA, oidSigType, "RSA-SHA512", - "sha512WithRSAEncryption"}, + "sha512WithRSAEncryption"}, #endif #ifdef WOLFSSL_SHA3 #ifndef WOLFSSL_NOSHA3_224 { NID_RSA_SHA3_224, CTC_SHA3_224wRSA, oidSigType, "RSA-SHA3-224", - "sha3-224WithRSAEncryption"}, + "sha3-224WithRSAEncryption"}, #endif #ifndef WOLFSSL_NOSHA3_256 { NID_RSA_SHA3_256, CTC_SHA3_256wRSA, oidSigType, "RSA-SHA3-256", - "sha3-256WithRSAEncryption"}, + "sha3-256WithRSAEncryption"}, #endif #ifndef WOLFSSL_NOSHA3_384 { NID_RSA_SHA3_384, CTC_SHA3_384wRSA, oidSigType, "RSA-SHA3-384", - "sha3-384WithRSAEncryption"}, + "sha3-384WithRSAEncryption"}, #endif #ifndef WOLFSSL_NOSHA3_512 { NID_RSA_SHA3_512, CTC_SHA3_512wRSA, oidSigType, "RSA-SHA3-512", - "sha3-512WithRSAEncryption"}, + "sha3-512WithRSAEncryption"}, #endif #endif #ifdef WC_RSA_PSS @@ -26248,36 +17116,41 @@ #endif /* NO_RSA */ #ifdef HAVE_ECC #ifndef NO_SHA - { NID_ecdsa_with_SHA1, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", "shaWithECDSA"}, + { NID_ecdsa_with_SHA1, CTC_SHAwECDSA, oidSigType, "ecdsa-with-SHA1", + "shaWithECDSA"}, #endif #ifdef WOLFSSL_SHA224 - { NID_ecdsa_with_SHA224, CTC_SHA224wECDSA, oidSigType, "ecdsa-with-SHA224","sha224WithECDSA"}, + { NID_ecdsa_with_SHA224, CTC_SHA224wECDSA, oidSigType, + "ecdsa-with-SHA224","sha224WithECDSA"}, #endif #ifndef NO_SHA256 - { NID_ecdsa_with_SHA256, CTC_SHA256wECDSA, oidSigType, "ecdsa-with-SHA256","sha256WithECDSA"}, + { NID_ecdsa_with_SHA256, CTC_SHA256wECDSA, oidSigType, + "ecdsa-with-SHA256","sha256WithECDSA"}, #endif #ifdef WOLFSSL_SHA384 - { NID_ecdsa_with_SHA384, CTC_SHA384wECDSA, oidSigType, "ecdsa-with-SHA384","sha384WithECDSA"}, + { NID_ecdsa_with_SHA384, CTC_SHA384wECDSA, oidSigType, + "ecdsa-with-SHA384","sha384WithECDSA"}, #endif #ifdef WOLFSSL_SHA512 - { NID_ecdsa_with_SHA512, CTC_SHA512wECDSA, oidSigType, "ecdsa-with-SHA512","sha512WithECDSA"}, + { NID_ecdsa_with_SHA512, CTC_SHA512wECDSA, oidSigType, + "ecdsa-with-SHA512","sha512WithECDSA"}, #endif #ifdef WOLFSSL_SHA3 #ifndef WOLFSSL_NOSHA3_224 - { NID_ecdsa_with_SHA3_224, CTC_SHA3_224wECDSA, oidSigType, "id-ecdsa-with-SHA3-224", - "ecdsa_with_SHA3-224"}, + { NID_ecdsa_with_SHA3_224, CTC_SHA3_224wECDSA, oidSigType, + "id-ecdsa-with-SHA3-224", "ecdsa_with_SHA3-224"}, #endif #ifndef WOLFSSL_NOSHA3_256 - { NID_ecdsa_with_SHA3_256, CTC_SHA3_256wECDSA, oidSigType, "id-ecdsa-with-SHA3-256", - "ecdsa_with_SHA3-256"}, + { NID_ecdsa_with_SHA3_256, CTC_SHA3_256wECDSA, oidSigType, + "id-ecdsa-with-SHA3-256", "ecdsa_with_SHA3-256"}, #endif #ifndef WOLFSSL_NOSHA3_384 - { NID_ecdsa_with_SHA3_384, CTC_SHA3_384wECDSA, oidSigType, "id-ecdsa-with-SHA3-384", - "ecdsa_with_SHA3-384"}, + { NID_ecdsa_with_SHA3_384, CTC_SHA3_384wECDSA, oidSigType, + "id-ecdsa-with-SHA3-384", "ecdsa_with_SHA3-384"}, #endif #ifndef WOLFSSL_NOSHA3_512 - { NID_ecdsa_with_SHA3_512, CTC_SHA3_512wECDSA, oidSigType, "id-ecdsa-with-SHA3-512", - "ecdsa_with_SHA3-512"}, + { NID_ecdsa_with_SHA3_512, CTC_SHA3_512wECDSA, oidSigType, + "id-ecdsa-with-SHA3-512", "ecdsa_with_SHA3-512"}, #endif #endif #endif /* HAVE_ECC */ @@ -26287,7 +17160,8 @@ { NID_dsa, DSAk, oidKeyType, "DSA", "dsaEncryption"}, #endif /* NO_DSA */ #ifndef NO_RSA - { NID_rsaEncryption, RSAk, oidKeyType, "rsaEncryption", "rsaEncryption"}, + { NID_rsaEncryption, RSAk, oidKeyType, "rsaEncryption", + "rsaEncryption"}, #ifdef WC_RSA_PSS { NID_rsassaPss, RSAPSSk, oidKeyType, "RSASSA-PSS", "rsassaPss"}, #endif @@ -26297,7 +17171,8 @@ "id-ecPublicKey"}, #endif /* HAVE_ECC */ #ifndef NO_DH - { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", "dhKeyAgreement"}, + { NID_dhKeyAgreement, DHk, oidKeyType, "dhKeyAgreement", + "dhKeyAgreement"}, #endif #ifdef HAVE_ED448 { NID_ED448, ED448k, oidKeyType, "ED448", "ED448"}, @@ -26305,7 +17180,6 @@ #ifdef HAVE_ED25519 { NID_ED25519, ED25519k, oidKeyType, "ED25519", "ED25519"}, #endif - #ifdef HAVE_PQC #ifdef HAVE_FALCON { CTC_FALCON_LEVEL1, FALCON_LEVEL1k, oidKeyType, "Falcon Level 1", "Falcon Level 1"}, @@ -26320,45 +17194,75 @@ { CTC_DILITHIUM_LEVEL5, DILITHIUM_LEVEL5k, oidKeyType, "Dilithium Level 5", "Dilithium Level 5"}, #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ /* oidCurveType */ #ifdef HAVE_ECC - { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", "prime192v1"}, - { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", "prime192v2"}, - { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", "prime192v3"}, - - { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", "prime239v1"}, - { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", "prime239v2"}, - { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", "prime239v3"}, - - { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", "prime256v1"}, - - { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", "secp112r1"}, - { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", "secp112r2"}, - - { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", "secp128r1"}, - { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", "secp128r2"}, - - { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", "secp160r1"}, - { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", "secp160r2"}, - - { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", "secp224r1"}, - { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", "secp384r1"}, - { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", "secp521r1"}, - - { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", "secp160k1"}, - { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", "secp192k1"}, - { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", "secp224k1"}, - { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", "secp256k1"}, - - { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, "brainpoolP160r1", "brainpoolP160r1"}, - { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, "brainpoolP192r1", "brainpoolP192r1"}, - { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, "brainpoolP224r1", "brainpoolP224r1"}, - { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, "brainpoolP256r1", "brainpoolP256r1"}, - { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, "brainpoolP320r1", "brainpoolP320r1"}, - { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, "brainpoolP384r1", "brainpoolP384r1"}, - { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, "brainpoolP512r1", "brainpoolP512r1"}, + { NID_X9_62_prime192v1, ECC_SECP192R1_OID, oidCurveType, "prime192v1", + "prime192v1"}, + { NID_X9_62_prime192v2, ECC_PRIME192V2_OID, oidCurveType, "prime192v2", + "prime192v2"}, + { NID_X9_62_prime192v3, ECC_PRIME192V3_OID, oidCurveType, "prime192v3", + "prime192v3"}, + + { NID_X9_62_prime239v1, ECC_PRIME239V1_OID, oidCurveType, "prime239v1", + "prime239v1"}, + { NID_X9_62_prime239v2, ECC_PRIME239V2_OID, oidCurveType, "prime239v2", + "prime239v2"}, + { NID_X9_62_prime239v3, ECC_PRIME239V3_OID, oidCurveType, "prime239v3", + "prime239v3"}, + + { NID_X9_62_prime256v1, ECC_SECP256R1_OID, oidCurveType, "prime256v1", + "prime256v1"}, + + { NID_secp112r1, ECC_SECP112R1_OID, oidCurveType, "secp112r1", + "secp112r1"}, + { NID_secp112r2, ECC_SECP112R2_OID, oidCurveType, "secp112r2", + "secp112r2"}, + + { NID_secp128r1, ECC_SECP128R1_OID, oidCurveType, "secp128r1", + "secp128r1"}, + { NID_secp128r2, ECC_SECP128R2_OID, oidCurveType, "secp128r2", + "secp128r2"}, + + { NID_secp160r1, ECC_SECP160R1_OID, oidCurveType, "secp160r1", + "secp160r1"}, + { NID_secp160r2, ECC_SECP160R2_OID, oidCurveType, "secp160r2", + "secp160r2"}, + + { NID_secp224r1, ECC_SECP224R1_OID, oidCurveType, "secp224r1", + "secp224r1"}, + { NID_secp384r1, ECC_SECP384R1_OID, oidCurveType, "secp384r1", + "secp384r1"}, + { NID_secp521r1, ECC_SECP521R1_OID, oidCurveType, "secp521r1", + "secp521r1"}, + + { NID_secp160k1, ECC_SECP160K1_OID, oidCurveType, "secp160k1", + "secp160k1"}, + { NID_secp192k1, ECC_SECP192K1_OID, oidCurveType, "secp192k1", + "secp192k1"}, + { NID_secp224k1, ECC_SECP224K1_OID, oidCurveType, "secp224k1", + "secp224k1"}, + { NID_secp256k1, ECC_SECP256K1_OID, oidCurveType, "secp256k1", + "secp256k1"}, + + { NID_brainpoolP160r1, ECC_BRAINPOOLP160R1_OID, oidCurveType, + "brainpoolP160r1", "brainpoolP160r1"}, + { NID_brainpoolP192r1, ECC_BRAINPOOLP192R1_OID, oidCurveType, + "brainpoolP192r1", "brainpoolP192r1"}, + { NID_brainpoolP224r1, ECC_BRAINPOOLP224R1_OID, oidCurveType, + "brainpoolP224r1", "brainpoolP224r1"}, + { NID_brainpoolP256r1, ECC_BRAINPOOLP256R1_OID, oidCurveType, + "brainpoolP256r1", "brainpoolP256r1"}, + { NID_brainpoolP320r1, ECC_BRAINPOOLP320R1_OID, oidCurveType, + "brainpoolP320r1", "brainpoolP320r1"}, + { NID_brainpoolP384r1, ECC_BRAINPOOLP384R1_OID, oidCurveType, + "brainpoolP384r1", "brainpoolP384r1"}, + { NID_brainpoolP512r1, ECC_BRAINPOOLP512R1_OID, oidCurveType, + "brainpoolP512r1", "brainpoolP512r1"}, + + #ifdef WOLFSSL_SM2 + { NID_sm2, ECC_SM2P256V1_OID, oidCurveType, "sm2", "sm2"}, + #endif #endif /* HAVE_ECC */ /* oidBlkType */ @@ -26376,15 +17280,15 @@ { NID_des3, DES3b, oidBlkType, "DES-EDE3-CBC", "des-ede3-cbc"}, #endif /* !NO_DES3 */ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) - { NID_chacha20_poly1305, NID_chacha20_poly1305, oidBlkType, "ChaCha20-Poly1305", "chacha20-poly1305"}, + { NID_chacha20_poly1305, NID_chacha20_poly1305, oidBlkType, + "ChaCha20-Poly1305", "chacha20-poly1305"}, #endif /* oidOcspType */ #ifdef HAVE_OCSP - { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, "basicOCSPResponse", - "Basic OCSP Response"}, - { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce", - "OCSP Nonce"}, + { NID_id_pkix_OCSP_basic, OCSP_BASIC_OID, oidOcspType, + "basicOCSPResponse", "Basic OCSP Response"}, + { OCSP_NONCE_OID, OCSP_NONCE_OID, oidOcspType, "Nonce", "OCSP Nonce"}, #endif /* HAVE_OCSP */ #ifndef NO_PWDBASED @@ -26393,22 +17297,25 @@ /* oidPBEType */ { PBE_SHA1_RC4_128, PBE_SHA1_RC4_128, oidPBEType, - "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"}, + "PBE-SHA1-RC4-128", "pbeWithSHA1And128BitRC4"}, { PBE_SHA1_DES, PBE_SHA1_DES, oidPBEType, "PBE-SHA1-DES", - "pbeWithSHA1AndDES-CBC"}, + "pbeWithSHA1AndDES-CBC"}, { PBE_SHA1_DES3, PBE_SHA1_DES3, oidPBEType, "PBE-SHA1-3DES", - "pbeWithSHA1And3-KeyTripleDES-CBC"}, + "pbeWithSHA1And3-KeyTripleDES-CBC"}, #endif /* oidKeyWrapType */ #ifdef WOLFSSL_AES_128 - { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", "aes128-wrap"}, + { AES128_WRAP, AES128_WRAP, oidKeyWrapType, "AES-128 wrap", + "aes128-wrap"}, #endif #ifdef WOLFSSL_AES_192 - { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", "aes192-wrap"}, + { AES192_WRAP, AES192_WRAP, oidKeyWrapType, "AES-192 wrap", + "aes192-wrap"}, #endif #ifdef WOLFSSL_AES_256 - { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", "aes256-wrap"}, + { AES256_WRAP, AES256_WRAP, oidKeyWrapType, "AES-256 wrap", + "aes256-wrap"}, #endif #ifndef NO_PKCS7 @@ -26416,27 +17323,32 @@ /* oidCmsKeyAgreeType */ #ifndef NO_SHA { dhSinglePass_stdDH_sha1kdf_scheme, dhSinglePass_stdDH_sha1kdf_scheme, - oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", "dhSinglePass-stdDH-sha1kdf-scheme"}, + oidCmsKeyAgreeType, "dhSinglePass-stdDH-sha1kdf-scheme", + "dhSinglePass-stdDH-sha1kdf-scheme"}, #endif #ifdef WOLFSSL_SHA224 { dhSinglePass_stdDH_sha224kdf_scheme, - dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha224kdf-scheme", "dhSinglePass-stdDH-sha224kdf-scheme"}, + dhSinglePass_stdDH_sha224kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha224kdf-scheme", + "dhSinglePass-stdDH-sha224kdf-scheme"}, #endif #ifndef NO_SHA256 { dhSinglePass_stdDH_sha256kdf_scheme, - dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha256kdf-scheme", "dhSinglePass-stdDH-sha256kdf-scheme"}, + dhSinglePass_stdDH_sha256kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha256kdf-scheme", + "dhSinglePass-stdDH-sha256kdf-scheme"}, #endif #ifdef WOLFSSL_SHA384 { dhSinglePass_stdDH_sha384kdf_scheme, - dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha384kdf-scheme", "dhSinglePass-stdDH-sha384kdf-scheme"}, + dhSinglePass_stdDH_sha384kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha384kdf-scheme", + "dhSinglePass-stdDH-sha384kdf-scheme"}, #endif #ifdef WOLFSSL_SHA512 { dhSinglePass_stdDH_sha512kdf_scheme, - dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType, - "dhSinglePass-stdDH-sha512kdf-scheme", "dhSinglePass-stdDH-sha512kdf-scheme"}, + dhSinglePass_stdDH_sha512kdf_scheme, oidCmsKeyAgreeType, + "dhSinglePass-stdDH-sha512kdf-scheme", + "dhSinglePass-stdDH-sha512kdf-scheme"}, #endif #endif #endif @@ -26461,724 +17373,6 @@ const size_t wolfssl_object_info_sz = WOLFSSL_OBJECT_INFO_SZ; #endif -#ifdef OPENSSL_EXTRA -WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void) -{ - WOLFSSL_HMAC_CTX* hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC( - sizeof(WOLFSSL_HMAC_CTX), NULL, DYNAMIC_TYPE_OPENSSL); - if (hmac_ctx != NULL) { - XMEMSET(hmac_ctx, 0, sizeof(WOLFSSL_HMAC_CTX)); - } - return hmac_ctx; -} - -int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx) -{ - WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init"); - - if (ctx != NULL) { - /* wc_HmacSetKey sets up ctx->hmac */ - XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX)); - } - - return WOLFSSL_SUCCESS; -} - - -int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key, - int keylen, const EVP_MD* type, WOLFSSL_ENGINE* e) -{ - WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex"); - - /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */ - (void)e; - return wolfSSL_HMAC_Init(ctx, key, keylen, type); -} - - -/* helper function for Deep copy of internal wolfSSL hmac structure - * returns WOLFSSL_SUCCESS on success */ -int wolfSSL_HmacCopy(Hmac* des, Hmac* src) -{ - void* heap; - int ret; - -#ifndef HAVE_FIPS - heap = src->heap; -#else - heap = NULL; -#endif - if (wc_HmacInit(des, heap, 0) != 0) { - return WOLFSSL_FAILURE; - } - - /* requires that hash structures have no dynamic parts to them */ - switch (src->macType) { - #ifndef NO_MD5 - case WC_MD5: - ret = wc_Md5Copy(&src->hash.md5, &des->hash.md5); - break; - #endif /* !NO_MD5 */ - - #ifndef NO_SHA - case WC_SHA: - ret = wc_ShaCopy(&src->hash.sha, &des->hash.sha); - break; - #endif /* !NO_SHA */ - - #ifdef WOLFSSL_SHA224 - case WC_SHA224: - ret = wc_Sha224Copy(&src->hash.sha224, &des->hash.sha224); - break; - #endif /* WOLFSSL_SHA224 */ - - #ifndef NO_SHA256 - case WC_SHA256: - ret = wc_Sha256Copy(&src->hash.sha256, &des->hash.sha256); - break; - #endif /* !NO_SHA256 */ - - #ifdef WOLFSSL_SHA384 - case WC_SHA384: - ret = wc_Sha384Copy(&src->hash.sha384, &des->hash.sha384); - break; - #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 - case WC_SHA512: - ret = wc_Sha512Copy(&src->hash.sha512, &des->hash.sha512); - break; - #endif /* WOLFSSL_SHA512 */ -#ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 - case WC_SHA3_224: - ret = wc_Sha3_224_Copy(&src->hash.sha3, &des->hash.sha3); - break; - #endif /* WOLFSSL_NO_SHA3_224 */ - #ifndef WOLFSSL_NOSHA3_256 - case WC_SHA3_256: - ret = wc_Sha3_256_Copy(&src->hash.sha3, &des->hash.sha3); - break; - #endif /* WOLFSSL_NO_SHA3_256 */ - #ifndef WOLFSSL_NOSHA3_384 - case WC_SHA3_384: - ret = wc_Sha3_384_Copy(&src->hash.sha3, &des->hash.sha3); - break; - #endif /* WOLFSSL_NO_SHA3_384 */ - #ifndef WOLFSSL_NOSHA3_512 - case WC_SHA3_512: - ret = wc_Sha3_512_Copy(&src->hash.sha3, &des->hash.sha3); - break; - #endif /* WOLFSSL_NO_SHA3_512 */ -#endif /* WOLFSSL_SHA3 */ - - default: - return WOLFSSL_FAILURE; - } - - if (ret != 0) - return WOLFSSL_FAILURE; - - XMEMCPY((byte*)des->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE); - XMEMCPY((byte*)des->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE); - XMEMCPY((byte*)des->innerHash, (byte*)src->innerHash, WC_MAX_DIGEST_SIZE); -#ifndef HAVE_FIPS - des->heap = heap; -#endif - des->macType = src->macType; - des->innerHashKeyed = src->innerHashKeyed; - -#ifdef WOLFSSL_ASYNC_CRYPT - XMEMCPY(&des->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV)); - des->keyLen = src->keyLen; - #ifdef HAVE_CAVIUM - des->data = (byte*)XMALLOC(src->dataLen, des->heap, - DYNAMIC_TYPE_HMAC); - if (des->data == NULL) { - return BUFFER_E; - } - XMEMCPY(des->data, src->data, src->dataLen); - des->dataLen = src->dataLen; - #endif /* HAVE_CAVIUM */ -#endif /* WOLFSSL_ASYNC_CRYPT */ - return WOLFSSL_SUCCESS; -} - - -/* Deep copy of information from src to des structure - * - * des destination to copy information to - * src structure to get information from - * - * Returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error - */ -int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* des, WOLFSSL_HMAC_CTX* src) -{ - WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy"); - - if (des == NULL || src == NULL) { - return WOLFSSL_FAILURE; - } - - des->type = src->type; - XMEMCPY((byte *)&des->save_ipad, (byte *)&src->hmac.ipad, - WC_HMAC_BLOCK_SIZE); - XMEMCPY((byte *)&des->save_opad, (byte *)&src->hmac.opad, - WC_HMAC_BLOCK_SIZE); - - return wolfSSL_HmacCopy(&des->hmac, &src->hmac); -} - - -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - -static int _HMAC_Init(Hmac* hmac, int type, void* heap) -{ - int ret = 0; - - switch (type) { - #ifndef NO_MD5 - case WC_MD5: - ret = wc_InitMd5(&hmac->hash.md5); - break; - #endif /* !NO_MD5 */ - - #ifndef NO_SHA - case WC_SHA: - ret = wc_InitSha(&hmac->hash.sha); - break; - #endif /* !NO_SHA */ - - #ifdef WOLFSSL_SHA224 - case WC_SHA224: - ret = wc_InitSha224(&hmac->hash.sha224); - break; - #endif /* WOLFSSL_SHA224 */ - - #ifndef NO_SHA256 - case WC_SHA256: - ret = wc_InitSha256(&hmac->hash.sha256); - break; - #endif /* !NO_SHA256 */ - - #ifdef WOLFSSL_SHA384 - case WC_SHA384: - ret = wc_InitSha384(&hmac->hash.sha384); - break; - #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 - case WC_SHA512: - ret = wc_InitSha512(&hmac->hash.sha512); - break; - #endif /* WOLFSSL_SHA512 */ - - #ifdef WOLFSSL_SHA3 - case WC_SHA3_224: - ret = wc_InitSha3_224(&hmac->hash.sha3, heap, INVALID_DEVID); - break; - case WC_SHA3_256: - ret = wc_InitSha3_256(&hmac->hash.sha3, heap, INVALID_DEVID); - break; - case WC_SHA3_384: - ret = wc_InitSha3_384(&hmac->hash.sha3, heap, INVALID_DEVID); - break; - case WC_SHA3_512: - ret = wc_InitSha3_512(&hmac->hash.sha3, heap, INVALID_DEVID); - break; - #endif - - default: - ret = BAD_FUNC_ARG; - break; - } - - (void)heap; - - return ret; -} - -#else - #define _HMAC_Init _InitHmac -#endif - - -int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen, - const EVP_MD* type) -{ - int hmac_error = 0; - void* heap = NULL; - int inited; - - WOLFSSL_MSG("wolfSSL_HMAC_Init"); - - if (ctx == NULL) { - WOLFSSL_MSG("no ctx on init"); - return WOLFSSL_FAILURE; - } - -#ifndef HAVE_FIPS - heap = ctx->hmac.heap; -#endif - - if (type) { - WOLFSSL_MSG("init has type"); - -#ifndef NO_MD5 - if (XSTRNCMP(type, "MD5", 3) == 0) { - WOLFSSL_MSG("md5 hmac"); - ctx->type = WC_MD5; - } - else -#endif -#ifdef WOLFSSL_SHA224 - if (XSTRNCMP(type, "SHA224", 6) == 0) { - WOLFSSL_MSG("sha224 hmac"); - ctx->type = WC_SHA224; - } - else -#endif -#ifndef NO_SHA256 - if (XSTRNCMP(type, "SHA256", 6) == 0) { - WOLFSSL_MSG("sha256 hmac"); - ctx->type = WC_SHA256; - } - else -#endif -#ifdef WOLFSSL_SHA384 - if (XSTRNCMP(type, "SHA384", 6) == 0) { - WOLFSSL_MSG("sha384 hmac"); - ctx->type = WC_SHA384; - } - else -#endif -#ifdef WOLFSSL_SHA512 - if (XSTRNCMP(type, "SHA512", 6) == 0) { - WOLFSSL_MSG("sha512 hmac"); - ctx->type = WC_SHA512; - } - else -#endif -#ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 - if (XSTRNCMP(type, "SHA3_224", 8) == 0) { - WOLFSSL_MSG("sha3_224 hmac"); - ctx->type = WC_SHA3_224; - } - else - #endif - #ifndef WOLFSSL_NOSHA3_256 - if (XSTRNCMP(type, "SHA3_256", 8) == 0) { - WOLFSSL_MSG("sha3_256 hmac"); - ctx->type = WC_SHA3_256; - } - else - #endif - if (XSTRNCMP(type, "SHA3_384", 8) == 0) { - WOLFSSL_MSG("sha3_384 hmac"); - ctx->type = WC_SHA3_384; - } - else - #ifndef WOLFSSL_NOSHA3_512 - if (XSTRNCMP(type, "SHA3_512", 8) == 0) { - WOLFSSL_MSG("sha3_512 hmac"); - ctx->type = WC_SHA3_512; - } - else - #endif -#endif - -#ifndef NO_SHA - /* has to be last since would pick or 256, 384, or 512 too */ - if (XSTRNCMP(type, "SHA", 3) == 0) { - WOLFSSL_MSG("sha hmac"); - ctx->type = WC_SHA; - } - else -#endif - { - WOLFSSL_MSG("bad init type"); - return WOLFSSL_FAILURE; - } - } - - /* Check if init has been called before */ - inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE); - /* Free if needed */ - if (inited) { - wc_HmacFree(&ctx->hmac); - } - if (key != NULL) { - WOLFSSL_MSG("keying hmac"); - - if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) { - hmac_error = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key, - (word32)keylen); - if (hmac_error < 0){ - /* in FIPS mode a key < 14 characters will fail here */ - WOLFSSL_MSG("hmac set key error"); - WOLFSSL_ERROR(hmac_error); - wc_HmacFree(&ctx->hmac); - return WOLFSSL_FAILURE; - } - XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad, - WC_HMAC_BLOCK_SIZE); - XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad, - WC_HMAC_BLOCK_SIZE); - } - /* OpenSSL compat, no error */ - } - else if (!inited) { - return WOLFSSL_FAILURE; - } - else if (ctx->type >= 0) { /* MD5 == 0 */ - WOLFSSL_MSG("recover hmac"); - if (wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID) == 0) { - ctx->hmac.macType = (byte)ctx->type; - ctx->hmac.innerHashKeyed = 0; - XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad, - WC_HMAC_BLOCK_SIZE); - XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad, - WC_HMAC_BLOCK_SIZE); - if ((hmac_error = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap)) - !=0) { - WOLFSSL_MSG("hmac init error"); - WOLFSSL_ERROR(hmac_error); - return WOLFSSL_FAILURE; - } - } - } - - (void)hmac_error; - - return WOLFSSL_SUCCESS; -} - - -int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data, - int len) -{ - WOLFSSL_MSG("wolfSSL_HMAC_Update"); - - if (ctx == NULL) { - WOLFSSL_MSG("no ctx"); - return WOLFSSL_FAILURE; - } - - if (data) { - int hmac_error = 0; - - WOLFSSL_MSG("updating hmac"); - hmac_error = wc_HmacUpdate(&ctx->hmac, data, (word32)len); - if (hmac_error < 0){ - WOLFSSL_MSG("hmac update error"); - return WOLFSSL_FAILURE; - } - } - - return WOLFSSL_SUCCESS; -} - - -int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash, - unsigned int* len) -{ - int hmac_error; - - WOLFSSL_MSG("wolfSSL_HMAC_Final"); - - /* "len" parameter is optional. */ - if (ctx == NULL || hash == NULL) { - WOLFSSL_MSG("invalid parameter"); - return WOLFSSL_FAILURE; - } - - WOLFSSL_MSG("final hmac"); - hmac_error = wc_HmacFinal(&ctx->hmac, hash); - if (hmac_error < 0){ - WOLFSSL_MSG("final hmac error"); - return WOLFSSL_FAILURE; - } - - if (len) { - WOLFSSL_MSG("setting output len"); - switch (ctx->type) { - #ifndef NO_MD5 - case WC_MD5: - *len = WC_MD5_DIGEST_SIZE; - break; - #endif - - #ifndef NO_SHA - case WC_SHA: - *len = WC_SHA_DIGEST_SIZE; - break; - #endif - - #ifdef WOLFSSL_SHA224 - case WC_SHA224: - *len = WC_SHA224_DIGEST_SIZE; - break; - #endif - - #ifndef NO_SHA256 - case WC_SHA256: - *len = WC_SHA256_DIGEST_SIZE; - break; - #endif - - #ifdef WOLFSSL_SHA384 - case WC_SHA384: - *len = WC_SHA384_DIGEST_SIZE; - break; - #endif - - #ifdef WOLFSSL_SHA512 - case WC_SHA512: - *len = WC_SHA512_DIGEST_SIZE; - break; - #endif - - #ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 - case WC_SHA3_224: - *len = WC_SHA3_224_DIGEST_SIZE; - break; - #endif - #ifndef WOLFSSL_NOSHA3_256 - case WC_SHA3_256: - *len = WC_SHA3_256_DIGEST_SIZE; - break; - #endif - #ifndef WOLFSSL_NOSHA3_384 - case WC_SHA3_384: - *len = WC_SHA3_384_DIGEST_SIZE; - break; - #endif - #ifndef WOLFSSL_NOSHA3_512 - case WC_SHA3_512: - *len = WC_SHA3_512_DIGEST_SIZE; - break; - #endif - #endif - - default: - WOLFSSL_MSG("bad hmac type"); - return WOLFSSL_FAILURE; - } - } - - return WOLFSSL_SUCCESS; -} - - -int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx) -{ - WOLFSSL_MSG("wolfSSL_HMAC_cleanup"); - - if (ctx) { - wc_HmacFree(&ctx->hmac); - } - - return WOLFSSL_SUCCESS; -} - -void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx) -{ - if (ctx) { - wolfSSL_HMAC_cleanup(ctx); - } -} - -void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx) -{ - if (ctx) { - wolfSSL_HMAC_CTX_cleanup(ctx); - XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); - } -} - -size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX *ctx) -{ - if (!ctx) { - return 0; - } - - return (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType); -} - -const WOLFSSL_EVP_MD *wolfSSL_HMAC_CTX_get_md(const WOLFSSL_HMAC_CTX *ctx) -{ - if (!ctx) { - return NULL; - } - - return wolfSSL_macType2EVP_md((enum wc_HashType)ctx->type); -} - -#if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \ - defined(WOLFSSL_AES_DIRECT) -WOLFSSL_CMAC_CTX* wolfSSL_CMAC_CTX_new(void) -{ - WOLFSSL_CMAC_CTX* ctx = NULL; - - ctx = (WOLFSSL_CMAC_CTX*)XMALLOC(sizeof(WOLFSSL_CMAC_CTX), NULL, - DYNAMIC_TYPE_OPENSSL); - if (ctx != NULL) { - ctx->internal = (Cmac*)XMALLOC(sizeof(Cmac), NULL, DYNAMIC_TYPE_CMAC); - if (ctx->internal == NULL) { - XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); - ctx = NULL; - } - } - if (ctx != NULL) { - ctx->cctx = wolfSSL_EVP_CIPHER_CTX_new(); - if (ctx->cctx == NULL) { - XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC); - XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); - ctx = NULL; - } - } - - return ctx; -} - -void wolfSSL_CMAC_CTX_free(WOLFSSL_CMAC_CTX *ctx) -{ - if (ctx != NULL) { - if (ctx->internal != NULL) { - XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC); - } - if (ctx->cctx != NULL) { - wolfSSL_EVP_CIPHER_CTX_free(ctx->cctx); - } - XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); - } -} - -WOLFSSL_EVP_CIPHER_CTX* wolfSSL_CMAC_CTX_get0_cipher_ctx(WOLFSSL_CMAC_CTX* ctx) -{ - WOLFSSL_EVP_CIPHER_CTX* cctx = NULL; - - if (ctx != NULL) { - cctx = ctx->cctx; - } - - return cctx; -} - -int wolfSSL_CMAC_Init(WOLFSSL_CMAC_CTX* ctx, const void *key, size_t keyLen, - const WOLFSSL_EVP_CIPHER* cipher, WOLFSSL_ENGINE* engine) -{ - int ret = WOLFSSL_SUCCESS; - - (void)engine; - - WOLFSSL_ENTER("wolfSSL_CMAC_Init"); - - if (ctx == NULL || cipher == NULL || ( - cipher != EVP_AES_128_CBC && - cipher != EVP_AES_192_CBC && - cipher != EVP_AES_256_CBC)) { - ret = WOLFSSL_FAILURE; - } - - if (ret == WOLFSSL_SUCCESS) { - /* Check input keyLen matches input cipher. */ - if ((int) keyLen != wolfSSL_EVP_Cipher_key_length(cipher)) { - ret = WOLFSSL_FAILURE; - } - } - - if (ret == WOLFSSL_SUCCESS) { - ret = wc_InitCmac((Cmac*)ctx->internal, (const byte*)key, - (word32)keyLen, WC_CMAC_AES, NULL); - if (ret != 0) { - ret = WOLFSSL_FAILURE; - } - else { - ret = WOLFSSL_SUCCESS; - } - } - if (ret == WOLFSSL_SUCCESS) { - ret = wolfSSL_EVP_CipherInit(ctx->cctx, cipher, (const byte*)key, NULL, - 1); - } - - WOLFSSL_LEAVE("wolfSSL_CMAC_Init", ret); - - return ret; -} - -int wolfSSL_CMAC_Update(WOLFSSL_CMAC_CTX* ctx, const void* data, size_t len) -{ - int ret = WOLFSSL_SUCCESS; - - WOLFSSL_ENTER("wolfSSL_CMAC_Update"); - - if (ctx == NULL || ctx->internal == NULL) { - ret = WOLFSSL_FAILURE; - } - - if (ret == WOLFSSL_SUCCESS) { - if (data) { - ret = wc_CmacUpdate((Cmac*)ctx->internal, (const byte*)data, - (word32)len); - if (ret != 0){ - ret = WOLFSSL_FAILURE; - } - else { - ret = WOLFSSL_SUCCESS; - } - } - } - - WOLFSSL_LEAVE("wolfSSL_CMAC_Update", ret); - - return ret; -} - -int wolfSSL_CMAC_Final(WOLFSSL_CMAC_CTX* ctx, unsigned char* out, - size_t* len) -{ - int ret = WOLFSSL_SUCCESS; - int blockSize; - - WOLFSSL_ENTER("wolfSSL_CMAC_Final"); - - if (ctx == NULL || ctx->cctx == NULL || ctx->internal == NULL || - len == NULL) { - ret = WOLFSSL_FAILURE; - } - - if (ret == WOLFSSL_SUCCESS) { - blockSize = EVP_CIPHER_CTX_block_size(ctx->cctx); - if (blockSize <= 0) { - ret = WOLFSSL_FAILURE; - } - else { - *len = blockSize; - } - } - if (ret == WOLFSSL_SUCCESS) { - word32 len32 = (word32)*len; - - ret = wc_CmacFinal((Cmac*)ctx->internal, out, &len32); - *len = (size_t)len32; - if (ret != 0) { - ret = WOLFSSL_FAILURE; - } - else { - ret = WOLFSSL_SUCCESS; - } - } - - WOLFSSL_LEAVE("wolfSSL_CMAC_Final", ret); - - return ret; -} -#endif /* WOLFSSL_CMAC && OPENSSL_EXTRA && WOLFSSL_AES_DIRECT */ -#endif /* OPENSSL_EXTRA */ - #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) /* Free the dynamically allocated data. * @@ -27226,15 +17420,16 @@ continue; } - srcDigitHigh = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]); - srcDigitLow = wolfSSL_OPENSSL_hexchar2int(str[srcIdx++]); + srcDigitHigh = wolfSSL_OPENSSL_hexchar2int((unsigned char)str[srcIdx++]); + srcDigitLow = wolfSSL_OPENSSL_hexchar2int((unsigned char)str[srcIdx++]); if (srcDigitHigh < 0 || srcDigitLow < 0) { WOLFSSL_MSG("Invalid hex character."); XFREE(targetBuf, NULL, DYNAMIC_TYPE_OPENSSL); return NULL; } - targetBuf[targetIdx++] = (unsigned char)((srcDigitHigh << 4) | srcDigitLow); + targetBuf[targetIdx++] = (unsigned char)((srcDigitHigh << 4) | + srcDigitLow ); } if (len != NULL) @@ -27250,651 +17445,229 @@ return wolfSSL_library_init(); } -int wolfSSL_OPENSSL_init_crypto(word64 opts, const OPENSSL_INIT_SETTINGS* settings) +int wolfSSL_OPENSSL_init_crypto(word64 opts, + const OPENSSL_INIT_SETTINGS* settings) { (void)opts; (void)settings; return wolfSSL_library_init(); } -#if defined(WOLFSSL_KEY_GEN) && defined(WOLFSSL_PEM_TO_DER) - -int EncryptDerKey(byte *der, int *derSz, const EVP_CIPHER* cipher, - unsigned char* passwd, int passwdSz, byte **cipherInfo, - int maxDerSz) +/* Colon separated list of + algorithms. + * Replaces list in context. + */ +int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list) { - int ret, paddingSz; - word32 idx, cipherInfoSz; -#ifdef WOLFSSL_SMALL_STACK - EncryptedInfo* info = NULL; -#else - EncryptedInfo info[1]; -#endif - - WOLFSSL_ENTER("EncryptDerKey"); - - if (der == NULL || derSz == NULL || cipher == NULL || - passwd == NULL || cipherInfo == NULL) - return BAD_FUNC_ARG; - -#ifdef WOLFSSL_SMALL_STACK - info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), NULL, - DYNAMIC_TYPE_ENCRYPTEDINFO); - if (info == NULL) { - WOLFSSL_MSG("malloc failed"); - return WOLFSSL_FAILURE; - } -#endif - - XMEMSET(info, 0, sizeof(EncryptedInfo)); - - /* set the cipher name on info */ - XSTRNCPY(info->name, cipher, NAME_SZ-1); - info->name[NAME_SZ-1] = '\0'; /* null term */ + WOLFSSL_MSG("wolfSSL_CTX_set1_sigalg_list"); - ret = wc_EncryptedInfoGet(info, info->name); - if (ret != 0) { - WOLFSSL_MSG("unsupported cipher"); - #ifdef WOLFSSL_SMALL_STACK - XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO); - #endif + if (ctx == NULL || list == NULL) { + WOLFSSL_MSG("Bad function arguments"); return WOLFSSL_FAILURE; } - /* Generate a random salt */ - if (wolfSSL_RAND_bytes(info->iv, info->ivSz) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("generate iv failed"); -#ifdef WOLFSSL_SMALL_STACK - XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO); -#endif + if (AllocateCtxSuites(ctx) != 0) return WOLFSSL_FAILURE; - } - /* add the padding before encryption */ - paddingSz = ((*derSz)/info->ivSz + 1) * info->ivSz - (*derSz); - if (paddingSz == 0) - paddingSz = info->ivSz; - if (maxDerSz < *derSz + paddingSz) { - WOLFSSL_MSG("not enough DER buffer allocated"); -#ifdef WOLFSSL_SMALL_STACK - XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO); -#endif - return WOLFSSL_FAILURE; - } - XMEMSET(der+(*derSz), (byte)paddingSz, paddingSz); - (*derSz) += paddingSz; + return SetSuitesHashSigAlgo(ctx->suites, list); +} - /* encrypt buffer */ - if (wc_BufferKeyEncrypt(info, der, *derSz, passwd, passwdSz, WC_MD5) != 0) { - WOLFSSL_MSG("encrypt key failed"); -#ifdef WOLFSSL_SMALL_STACK - XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO); -#endif - return WOLFSSL_FAILURE; - } +/* Colon separated list of + algorithms. + * Replaces list in SSL. + */ +int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list) +{ + WOLFSSL_MSG("wolfSSL_set1_sigalg_list"); - /* create cipher info : 'cipher_name,Salt(hex)' */ - cipherInfoSz = (word32)(2*info->ivSz + XSTRLEN(info->name) + 2); - *cipherInfo = (byte*)XMALLOC(cipherInfoSz, NULL, - DYNAMIC_TYPE_STRING); - if (*cipherInfo == NULL) { - WOLFSSL_MSG("malloc failed"); -#ifdef WOLFSSL_SMALL_STACK - XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO); -#endif + if (ssl == NULL || list == NULL) { + WOLFSSL_MSG("Bad function arguments"); return WOLFSSL_FAILURE; } - XSTRLCPY((char*)*cipherInfo, info->name, cipherInfoSz); - XSTRLCAT((char*)*cipherInfo, ",", cipherInfoSz); - idx = (word32)XSTRLEN((char*)*cipherInfo); - cipherInfoSz -= idx; - ret = Base16_Encode(info->iv, info->ivSz, *cipherInfo+idx, &cipherInfoSz); - -#ifdef WOLFSSL_SMALL_STACK - XFREE(info, NULL, DYNAMIC_TYPE_ENCRYPTEDINFO); -#endif - if (ret != 0) { - WOLFSSL_MSG("Base16_Encode failed"); - XFREE(*cipherInfo, NULL, DYNAMIC_TYPE_STRING); + if (AllocateSuites(ssl) != 0) return WOLFSSL_FAILURE; - } - return WOLFSSL_SUCCESS; + return SetSuitesHashSigAlgo(ssl->suites, list); } -#endif /* WOLFSSL_KEY_GEN || WOLFSSL_PEM_TO_DER */ -#if !defined(NO_BIO) -static int pem_write_pubkey(WOLFSSL_EVP_PKEY* key, void* heap, byte** derBuf, - int* derSz) +static int HashToNid(byte hashAlgo, int* nid) { - byte* buf = NULL; - int sz = 0; - - (void)heap; - - if (key == NULL) { - WOLFSSL_MSG("Bad parameters"); - return WOLFSSL_FAILURE; - } + int ret = WOLFSSL_SUCCESS; - switch (key->type) { -#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA) - case EVP_PKEY_RSA: - if ((sz = wolfSSL_RSA_To_Der(key->rsa, &buf, 1, heap)) - < 0) { - WOLFSSL_MSG("wolfSSL_RSA_To_Der failed"); - break; - } + /* Cast for compiler to check everything is implemented */ + switch ((enum wc_MACAlgorithm)hashAlgo) { + case no_mac: + case rmd_mac: + *nid = NID_undef; break; -#endif /* WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA */ -#if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \ - defined(WOLFSSL_CERT_GEN)) - case EVP_PKEY_DSA: - if (key->dsa == NULL) { - WOLFSSL_MSG("key->dsa is null"); - break; - } - sz = MAX_DSA_PUBKEY_SZ; - buf = (byte*)XMALLOC(sz, heap, DYNAMIC_TYPE_TMP_BUFFER); - if (buf == NULL) { - WOLFSSL_MSG("malloc failed"); - break; - } - /* Key to DER */ - sz = wc_DsaKeyToPublicDer((DsaKey*)key->dsa->internal, buf, sz); - if (sz < 0) { - WOLFSSL_MSG("wc_DsaKeyToDer failed"); - break; - } + case md5_mac: + *nid = NID_md5; break; -#endif /* !NO_DSA && !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) */ -#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) - case EVP_PKEY_EC: - { - if (key->ecc == NULL) { - WOLFSSL_MSG("key->ecc is null"); - break; - } - if ((sz = wolfssl_ec_key_to_pubkey_der(key->ecc, &buf, heap)) <= - 0) { - WOLFSSL_MSG("wolfssl_ec_key_to_pubkey_der failed"); - break; - } + case sha_mac: + *nid = NID_sha1; break; - } -#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */ -#if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) - case EVP_PKEY_DH: - WOLFSSL_MSG("Writing DH PUBKEY not supported!"); + case sha224_mac: + *nid = NID_sha224; + break; + case sha256_mac: + *nid = NID_sha256; + break; + case sha384_mac: + *nid = NID_sha384; + break; + case sha512_mac: + *nid = NID_sha512; + break; + case blake2b_mac: + *nid = NID_blake2b512; + break; + case sm3_mac: + *nid = NID_sm3; break; -#endif /* !NO_DH && (WOLFSSL_QT || OPENSSL_ALL) */ default: - WOLFSSL_MSG("Unknown Key type!"); + ret = WOLFSSL_FAILURE; break; } - if (buf == NULL || sz <= 0) { - if (buf != NULL) - XFREE(buf, heap, DYNAMIC_TYPE_DER); - return WOLFSSL_FAILURE; - } - - *derBuf = buf; - *derSz = sz; - return WOLFSSL_SUCCESS; -} -#endif - -#ifndef NO_BIO -static int pem_write_bio_pubkey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key) -{ - int ret; - int derSz = 0; - byte* derBuf = NULL; - - ret = pem_write_pubkey(key, bio->heap, &derBuf, &derSz); - if (ret == WOLFSSL_SUCCESS) { - ret = der_write_to_bio_as_pem(derBuf, derSz, bio, PUBLICKEY_TYPE); - XFREE(derBuf, bio->heap, DYNAMIC_TYPE_DER); - } - - return ret; -} - -/* Takes a public key and writes it out to a WOLFSSL_BIO - * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE - */ -int wolfSSL_PEM_write_bio_PUBKEY(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key) -{ - int ret; - - WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PUBKEY"); - - if ((bio == NULL) || (key == NULL)) { - ret = WOLFSSL_FAILURE; - } - else { - ret = pem_write_bio_pubkey(bio, key); - } - return ret; } -/* Takes a private key and writes it out to a WOLFSSL_BIO - * Returns WOLFSSL_SUCCESS or WOLFSSL_FAILURE - */ -int wolfSSL_PEM_write_bio_PrivateKey(WOLFSSL_BIO* bio, WOLFSSL_EVP_PKEY* key, - const WOLFSSL_EVP_CIPHER* cipher, - unsigned char* passwd, int len, - wc_pem_password_cb* cb, void* arg) +static int SaToNid(byte sa, int* nid) { - byte* keyDer; - int type; - - (void)cipher; - (void)passwd; - (void)len; - (void)cb; - (void)arg; - - WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PrivateKey"); - - if (bio == NULL || key == NULL) { - WOLFSSL_MSG("Bad Function Arguments"); - return WOLFSSL_FAILURE; - } - - keyDer = (byte*)key->pkey.ptr; - - switch (key->type) { -#ifndef NO_RSA - case EVP_PKEY_RSA: - type = PRIVATEKEY_TYPE; + int ret = WOLFSSL_SUCCESS; + /* Cast for compiler to check everything is implemented */ + switch ((enum SignatureAlgorithm)sa) { + case anonymous_sa_algo: + *nid = NID_undef; break; -#endif - -#ifndef NO_DSA - case EVP_PKEY_DSA: - type = DSA_PRIVATEKEY_TYPE; + case rsa_sa_algo: + *nid = NID_rsaEncryption; break; -#endif - -#ifdef HAVE_ECC - case EVP_PKEY_EC: - type = ECC_PRIVATEKEY_TYPE; + case dsa_sa_algo: + *nid = NID_dsa; + break; + case ecc_dsa_sa_algo: + *nid = NID_X9_62_id_ecPublicKey; + break; + case rsa_pss_sa_algo: + *nid = NID_rsassaPss; break; + case ed25519_sa_algo: +#ifdef HAVE_ED25519 + *nid = NID_ED25519; +#else + ret = WOLFSSL_FAILURE; #endif - -#if !defined(NO_DH) && (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) - case EVP_PKEY_DH: - type = DH_PRIVATEKEY_TYPE; break; + case rsa_pss_pss_algo: + *nid = NID_rsassaPss; + break; + case ed448_sa_algo: +#ifdef HAVE_ED448 + *nid = NID_ED448; +#else + ret = WOLFSSL_FAILURE; #endif - + break; + case falcon_level1_sa_algo: + *nid = CTC_FALCON_LEVEL1; + break; + case falcon_level5_sa_algo: + *nid = CTC_FALCON_LEVEL5; + break; + case dilithium_level2_sa_algo: + *nid = CTC_DILITHIUM_LEVEL2; + break; + case dilithium_level3_sa_algo: + *nid = CTC_DILITHIUM_LEVEL3; + break; + case dilithium_level5_sa_algo: + *nid = CTC_DILITHIUM_LEVEL5; + break; + case sm2_sa_algo: + *nid = NID_sm2; + break; + case invalid_sa_algo: default: - WOLFSSL_MSG("Unknown Key type!"); - type = PRIVATEKEY_TYPE; + ret = WOLFSSL_FAILURE; + break; } - - return der_write_to_bio_as_pem(keyDer, key->pkey_sz, bio, type); + return ret; } -#endif /* !NO_BIO */ -/* Colon separated list of + algorithms. - * Replaces list in context. - */ -int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list) +/* This API returns the hash selected. */ +int wolfSSL_get_signature_nid(WOLFSSL *ssl, int* nid) { - WOLFSSL_MSG("wolfSSL_CTX_set1_sigalg_list"); + WOLFSSL_MSG("wolfSSL_get_signature_nid"); - if (ctx == NULL || list == NULL) { + if (ssl == NULL || nid == NULL) { WOLFSSL_MSG("Bad function arguments"); return WOLFSSL_FAILURE; } - if (AllocateCtxSuites(ctx) != 0) - return WOLFSSL_FAILURE; - - return SetSuitesHashSigAlgo(ctx->suites, list); + return HashToNid(ssl->options.hashAlgo, nid); } -/* Colon separated list of + algorithms. - * Replaces list in SSL. - */ -int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list) +/* This API returns the signature selected. */ +int wolfSSL_get_signature_type_nid(const WOLFSSL* ssl, int* nid) { - WOLFSSL_MSG("wolfSSL_set1_sigalg_list"); + WOLFSSL_MSG("wolfSSL_get_signature_type_nid"); - if (ssl == NULL || list == NULL) { + if (ssl == NULL || nid == NULL) { WOLFSSL_MSG("Bad function arguments"); return WOLFSSL_FAILURE; } - if (AllocateSuites(ssl) != 0) - return WOLFSSL_FAILURE; - - return SetSuitesHashSigAlgo(ssl->suites, list); + return SaToNid(ssl->options.sigAlgo, nid); } -struct WOLFSSL_HashSigInfo { - int hashAlgo; - int sigAlgo; - int nid; -} wolfssl_hash_sig_info[] = -{ -#ifndef NO_RSA - #ifndef NO_SHA256 - { sha256_mac, rsa_sa_algo, CTC_SHA256wRSA }, - #endif - #ifdef WOLFSSL_SHA384 - { sha384_mac, rsa_sa_algo, CTC_SHA384wRSA }, - #endif - #ifdef WOLFSSL_SHA512 - { sha512_mac, rsa_sa_algo, CTC_SHA512wRSA }, - #endif - #ifdef WOLFSSL_SHA224 - { sha224_mac, rsa_sa_algo, CTC_SHA224wRSA }, - #endif - #ifndef NO_SHA - { sha_mac, rsa_sa_algo, CTC_SHAwRSA }, - #endif - #ifdef WC_RSA_PSS - #ifndef NO_SHA256 - { sha256_mac, rsa_pss_sa_algo, CTC_SHA256wRSA }, - #endif - #ifdef WOLFSSL_SHA384 - { sha384_mac, rsa_pss_sa_algo, CTC_SHA384wRSA }, - #endif - #ifdef WOLFSSL_SHA512 - { sha512_mac, rsa_pss_sa_algo, CTC_SHA512wRSA }, - #endif - #ifdef WOLFSSL_SHA224 - { sha224_mac, rsa_pss_sa_algo, CTC_SHA224wRSA }, - #endif - #endif -#endif -#ifdef HAVE_ECC - #ifndef NO_SHA256 - { sha256_mac, ecc_dsa_sa_algo, CTC_SHA256wECDSA }, - #endif - #ifdef WOLFSSL_SHA384 - { sha384_mac, ecc_dsa_sa_algo, CTC_SHA384wECDSA }, - #endif - #ifdef WOLFSSL_SHA512 - { sha512_mac, ecc_dsa_sa_algo, CTC_SHA512wECDSA }, - #endif - #ifdef WOLFSSL_SHA224 - { sha224_mac, ecc_dsa_sa_algo, CTC_SHA224wECDSA }, - #endif - #ifndef NO_SHA - { sha_mac, ecc_dsa_sa_algo, CTC_SHAwECDSA }, - #endif -#endif -#ifdef HAVE_ED25519 - { no_mac, ed25519_sa_algo, CTC_ED25519 }, -#endif -#ifdef HAVE_ED448 - { no_mac, ed448_sa_algo, CTC_ED448 }, -#endif -#ifdef HAVE_PQC -#ifdef HAVE_FALCON - { no_mac, falcon_level1_sa_algo, CTC_FALCON_LEVEL1 }, - { no_mac, falcon_level5_sa_algo, CTC_FALCON_LEVEL5 }, -#endif /* HAVE_FALCON */ -#ifdef HAVE_DILITHIUM - { no_mac, dilithium_level2_sa_algo, CTC_DILITHIUM_LEVEL2 }, - { no_mac, dilithium_level3_sa_algo, CTC_DILITHIUM_LEVEL3 }, - { no_mac, dilithium_level5_sa_algo, CTC_DILITHIUM_LEVEL5 }, -#endif /* HAVE_DILITHIUM */ -#endif /* HAVE_PQC */ -#ifndef NO_DSA - #ifndef NO_SHA - { sha_mac, dsa_sa_algo, CTC_SHAwDSA }, - #endif -#endif -}; -#define WOLFSSL_HASH_SIG_INFO_SZ \ - (int)(sizeof(wolfssl_hash_sig_info)/sizeof(*wolfssl_hash_sig_info)) - -int wolfSSL_get_signature_nid(WOLFSSL *ssl, int* nid) +int wolfSSL_get_peer_signature_nid(WOLFSSL* ssl, int* nid) { - int i; - int ret = WOLFSSL_FAILURE; - - WOLFSSL_MSG("wolfSSL_get_signature_nid"); + WOLFSSL_MSG("wolfSSL_get_peer_signature_nid"); - if (ssl == NULL) { + if (ssl == NULL || nid == NULL) { WOLFSSL_MSG("Bad function arguments"); return WOLFSSL_FAILURE; } - for (i = 0; i < WOLFSSL_HASH_SIG_INFO_SZ; i++) { - if (ssl->options.hashAlgo == wolfssl_hash_sig_info[i].hashAlgo && - ssl->options.sigAlgo == wolfssl_hash_sig_info[i].sigAlgo) { - *nid = wolfssl_hash_sig_info[i].nid; - ret = WOLFSSL_SUCCESS; - break; - } - } - - return ret; + return HashToNid(ssl->options.peerHashAlgo, nid); } -#ifdef HAVE_ECC - -#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES) -static int populate_groups(int* groups, int max_count, char *list) +int wolfSSL_get_peer_signature_type_nid(const WOLFSSL* ssl, int* nid) { - char *end; - int count = 0; - const WOLF_EC_NIST_NAME* nist_name; - - if (!groups || !list) { - return -1; - } + WOLFSSL_MSG("wolfSSL_get_peer_signature_type_nid"); - for (end = list; ; list = ++end) { - int len; - - if (count > max_count) { - WOLFSSL_MSG("Too many curves in list"); - return -1; - } - while (*end != ':' && *end != '\0') end++; - len = (int)(end - list); /* end points to char after end - * of curve name so no need for -1 */ - if ((len < kNistCurves_MIN_NAME_LEN) || - (len > kNistCurves_MAX_NAME_LEN)) { - WOLFSSL_MSG("Unrecognized curve name in list"); - return -1; - } - for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) { - if (len == nist_name->name_len && - XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) { - break; - } - } - if (!nist_name->name) { - WOLFSSL_MSG("Unrecognized curve name in list"); - return -1; - } - groups[count++] = nist_name->nid; - if (*end == '\0') break; + if (ssl == NULL || nid == NULL) { + WOLFSSL_MSG("Bad function arguments"); + return WOLFSSL_FAILURE; } - return count; + return SaToNid(ssl->options.peerSigAlgo, nid); } -int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list) -{ - int groups[WOLFSSL_MAX_GROUP_COUNT]; - int count; +#ifdef HAVE_ECC +#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES) +int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, const char *list) +{ if (!ctx || !list) { return WOLFSSL_FAILURE; } - if ((count = populate_groups(groups, - WOLFSSL_MAX_GROUP_COUNT, list)) == -1) { - return WOLFSSL_FAILURE; - } - - return wolfSSL_CTX_set1_groups(ctx, groups, count); + return set_curves_list(NULL, ctx, list, 0); } -int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list) +int wolfSSL_set1_groups_list(WOLFSSL *ssl, const char *list) { - int groups[WOLFSSL_MAX_GROUP_COUNT]; - int count; - if (!ssl || !list) { return WOLFSSL_FAILURE; } - if ((count = populate_groups(groups, - WOLFSSL_MAX_GROUP_COUNT, list)) == -1) { - return WOLFSSL_FAILURE; - } - - return wolfSSL_set1_groups(ssl, groups, count); + return set_curves_list(ssl, NULL, list, 0); } #endif /* WOLFSSL_TLS13 */ #endif /* HAVE_ECC */ -#ifndef NO_BIO -WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_bio_PrivateKey(WOLFSSL_BIO* bio, - WOLFSSL_EVP_PKEY** key, - wc_pem_password_cb* cb, - void* pass) -{ - WOLFSSL_EVP_PKEY* pkey = NULL; - DerBuffer* der = NULL; - int keyFormat = 0; - - WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PrivateKey"); - - if (bio == NULL) - return pkey; - - if (pem_read_bio_key(bio, cb, pass, PRIVATEKEY_TYPE, &keyFormat, &der) - >= 0) { - const unsigned char* ptr = der->buffer; - int type = -1; - - if (keyFormat) { - /* keyFormat is Key_Sum enum */ - if (keyFormat == RSAk) - type = EVP_PKEY_RSA; - else if (keyFormat == ECDSAk) - type = EVP_PKEY_EC; - else if (keyFormat == DSAk) - type = EVP_PKEY_DSA; - else if (keyFormat == DHk) - type = EVP_PKEY_DH; - } - else { - /* Default to RSA if format is not set */ - type = EVP_PKEY_RSA; - } - - /* handle case where reuse is attempted */ - if (key != NULL && *key != NULL) - pkey = *key; - - wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length); - if (pkey == NULL) { - WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); - } - } - - FreeDer(&der); - - if (key != NULL && pkey != NULL) - *key = pkey; - - WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PrivateKey", 0); - - return pkey; -} - -WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_bio_PUBKEY(WOLFSSL_BIO* bio, - WOLFSSL_EVP_PKEY **key, - wc_pem_password_cb *cb, - void *pass) -{ - WOLFSSL_EVP_PKEY* pkey = NULL; - DerBuffer* der = NULL; - int keyFormat = 0; - - WOLFSSL_ENTER("wolfSSL_PEM_read_bio_PUBKEY"); - - if (bio == NULL) - return pkey; - - if (pem_read_bio_key(bio, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) - >= 0) { - const unsigned char* ptr = der->buffer; - - /* handle case where reuse is attempted */ - if (key != NULL && *key != NULL) - pkey = *key; - - wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length); - if (pkey == NULL) { - WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); - } - } - - FreeDer(&der); - - if (key != NULL && pkey != NULL) - *key = pkey; - - WOLFSSL_LEAVE("wolfSSL_PEM_read_bio_PUBKEY", 0); - - return pkey; -} -#endif /* !NO_BIO */ - -#if !defined(NO_FILESYSTEM) -WOLFSSL_EVP_PKEY *wolfSSL_PEM_read_PUBKEY(XFILE fp, WOLFSSL_EVP_PKEY **key, - wc_pem_password_cb *cb, void *pass) -{ - WOLFSSL_EVP_PKEY* pkey = NULL; - DerBuffer* der = NULL; - int keyFormat = 0; - - WOLFSSL_ENTER("wolfSSL_PEM_read_PUBKEY"); - - if (pem_read_file_key(fp, cb, pass, PUBLICKEY_TYPE, &keyFormat, &der) - >= 0) { - const unsigned char* ptr = der->buffer; - - /* handle case where reuse is attempted */ - if ((key != NULL) && (*key != NULL)) { - pkey = *key; - } - - if ((wolfSSL_d2i_PUBKEY(&pkey, &ptr, der->length) == NULL) || - (pkey == NULL)) { - WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); - pkey = NULL; - } - } - - FreeDer(&der); - - if ((key != NULL) && (pkey != NULL)) { - *key = pkey; - } - - WOLFSSL_LEAVE("wolfSSL_PEM_read_PUBKEY", 0); - - return pkey; -} -#endif /* NO_FILESYSTEM */ #endif /* OPENSSL_EXTRA */ #ifdef WOLFSSL_ALT_CERT_CHAINS @@ -27970,7 +17743,7 @@ /* Get peer's wolfSSL X509 certificate at index (idx) */ WOLFSSL_X509* wolfSSL_get_chain_X509(WOLFSSL_X509_CHAIN* chain, int idx) { - int ret; + int ret = 0; WOLFSSL_X509* x509 = NULL; #ifdef WOLFSSL_SMALL_STACK DecodedCert* cert = NULL; @@ -27979,7 +17752,7 @@ #endif WOLFSSL_ENTER("wolfSSL_get_chain_X509"); - if (chain != NULL) { + if (chain != NULL && idx < MAX_CHAIN_DEPTH) { #ifdef WOLFSSL_SMALL_STACK cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT); @@ -27989,7 +17762,7 @@ InitDecodedCert(cert, chain->certs[idx].buffer, chain->certs[idx].length, NULL); - if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL)) != 0) { + if ((ret = ParseCertRelative(cert, CERT_TYPE, 0, NULL, NULL)) != 0) { WOLFSSL_MSG("Failed to parse cert"); } else { @@ -28050,7 +17823,7 @@ /* Null output buffer return size needed in outLen */ if(!buf) { if(Base64_Encode(chain->certs[idx].buffer, chain->certs[idx].length, - NULL, &szNeeded) != LENGTH_ONLY_E) + NULL, &szNeeded) != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) return WOLFSSL_FAILURE; *outLen = szNeeded + headerLen + footerLen; return LENGTH_ONLY_E; @@ -28091,20 +17864,6 @@ #endif /* WOLFSSL_PEM_TO_DER || WOLFSSL_DER_TO_PEM */ } - -/* get session ID */ -WOLFSSL_ABI -const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session) -{ - WOLFSSL_ENTER("wolfSSL_get_sessionID"); - session = ClientSessionToSession(session); - if (session) - return session->sessionID; - - return NULL; -} - - #endif /* SESSION_CERTS */ #ifdef HAVE_FUZZER @@ -28188,7 +17947,8 @@ return NULL; } -void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, CallbackEccSharedSecret cb) +void wolfSSL_CTX_SetEccSharedSecretCb(WOLFSSL_CTX* ctx, + CallbackEccSharedSecret cb) { if (ctx) ctx->EccSharedSecretCb = cb; @@ -28412,7 +18172,8 @@ if (ctx) ctx->RsaPssSignCb = cb; } -void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, CallbackRsaPssVerify cb) +void wolfSSL_CTX_SetRsaPssSignCheckCb(WOLFSSL_CTX* ctx, + CallbackRsaPssVerify cb) { if (ctx) ctx->RsaPssSignCheckCb = cb; @@ -28508,7 +18269,8 @@ } /* callback for master secret generation */ -void wolfSSL_CTX_SetGenMasterSecretCb(WOLFSSL_CTX* ctx, CallbackGenMasterSecret cb) +void wolfSSL_CTX_SetGenMasterSecretCb(WOLFSSL_CTX* ctx, + CallbackGenMasterSecret cb) { if (ctx) ctx->GenMasterCb = cb; @@ -28705,427 +18467,6 @@ #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(WOLFCRYPT_ONLY) -#ifndef NO_CERTS - -#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) - -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) -#if !defined(NO_FILESYSTEM) - WOLFSSL_EVP_PKEY* wolfSSL_PEM_read_PrivateKey(XFILE fp, - WOLFSSL_EVP_PKEY **key, wc_pem_password_cb *cb, void *pass) - { - WOLFSSL_EVP_PKEY* pkey = NULL; - DerBuffer* der = NULL; - int keyFormat = 0; - - WOLFSSL_ENTER("wolfSSL_PEM_read_PrivateKey"); - - if (pem_read_file_key(fp, cb, pass, PRIVATEKEY_TYPE, &keyFormat, - &der) >= 0) { - const unsigned char* ptr = der->buffer; - int type = -1; - - if (keyFormat) { - /* keyFormat is Key_Sum enum */ - if (keyFormat == RSAk) - type = EVP_PKEY_RSA; - else if (keyFormat == ECDSAk) - type = EVP_PKEY_EC; - else if (keyFormat == DSAk) - type = EVP_PKEY_DSA; - else if (keyFormat == DHk) - type = EVP_PKEY_DH; - } - else { - /* Default to RSA if format is not set */ - type = EVP_PKEY_RSA; - } - - /* handle case where reuse is attempted */ - if (key != NULL && *key != NULL) - pkey = *key; - - wolfSSL_d2i_PrivateKey(type, &pkey, &ptr, der->length); - if (pkey == NULL) { - WOLFSSL_MSG("Error loading DER buffer into WOLFSSL_EVP_PKEY"); - } - } - - FreeDer(&der); - - if (key != NULL && pkey != NULL) - *key = pkey; - - WOLFSSL_LEAVE("wolfSSL_PEM_read_PrivateKey", 0); - - return pkey; - } -#endif -#endif - -#endif /* OPENSSL_ALL || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL*/ - -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) - - #define PEM_BEGIN "-----BEGIN " - #define PEM_BEGIN_SZ 11 - #define PEM_END "-----END " - #define PEM_END_SZ 9 - #define PEM_HDR_FIN "-----" - #define PEM_HDR_FIN_SZ 5 - #define PEM_HDR_FIN_EOL_NEWLINE "-----\n" - #define PEM_HDR_FIN_EOL_NULL_TERM "-----\0" - #define PEM_HDR_FIN_EOL_SZ 6 - -#ifndef NO_BIO - - int wolfSSL_PEM_read_bio(WOLFSSL_BIO* bio, char **name, char **header, - unsigned char **data, long *len) - { - int ret = WOLFSSL_SUCCESS; - char pem[256]; - int pemLen; - char* p; - char* nameStr = NULL; - int nameLen = 0; - char* headerStr = NULL; - int headerFound = 0; - unsigned char* der = NULL; - word32 derLen = 0; - - if (bio == NULL || name == NULL || header == NULL || data == NULL || - len == NULL) { - return WOLFSSL_FAILURE; - } - - /* Find header line. */ - pem[sizeof(pem) - 1] = '\0'; - while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) { - if (XSTRNCMP(pem, PEM_BEGIN, PEM_BEGIN_SZ) == 0) - break; - } - if (pemLen <= 0) - ret = WOLFSSL_FAILURE; - /* Have a header line. */ - if (ret == WOLFSSL_SUCCESS) { - while (pem[pemLen - 1] == '\r' || pem[pemLen - 1] == '\n') - pemLen--; - pem[pemLen] = '\0'; - if (XSTRNCMP(pem + pemLen - PEM_HDR_FIN_SZ, PEM_HDR_FIN, - PEM_HDR_FIN_SZ) != 0) { - ret = WOLFSSL_FAILURE; - } - } - - /* Get out name. */ - if (ret == WOLFSSL_SUCCESS) { - nameLen = pemLen - PEM_BEGIN_SZ - PEM_HDR_FIN_SZ; - nameStr = (char*)XMALLOC(nameLen + 1, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (nameStr == NULL) - ret = WOLFSSL_FAILURE; - } - if (ret == WOLFSSL_SUCCESS) { - int headerLen; - - XSTRNCPY(nameStr, pem + PEM_BEGIN_SZ, nameLen); - nameStr[nameLen] = '\0'; - - /* Get header of PEM - encryption header. */ - headerLen = 0; - while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) { - while (pemLen > 0 && (pem[pemLen - 1] == '\r' || - pem[pemLen - 1] == '\n')) { - pemLen--; - } - pem[pemLen++] = '\n'; - pem[pemLen] = '\0'; - - /* Header separator is a blank line. */ - if (pem[0] == '\n') { - headerFound = 1; - break; - } - - /* Didn't find a blank line - no header. */ - if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) { - der = (unsigned char*)headerStr; - derLen = headerLen; - /* Empty header - empty string. */ - headerStr = (char*)XMALLOC(1, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (headerStr == NULL) - ret = WOLFSSL_FAILURE; - else - headerStr[0] = '\0'; - break; - } - - p = (char*)XREALLOC(headerStr, headerLen + pemLen + 1, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (p == NULL) { - ret = WOLFSSL_FAILURE; - break; - } - - headerStr = p; - XMEMCPY(headerStr + headerLen, pem, pemLen + 1); - headerLen += pemLen; - } - if (pemLen <= 0) - ret = WOLFSSL_FAILURE; - } - - /* Get body of PEM - if there was a header */ - if (ret == WOLFSSL_SUCCESS && headerFound) { - derLen = 0; - while ((pemLen = wolfSSL_BIO_gets(bio, pem, sizeof(pem) - 1)) > 0) { - while (pemLen > 0 && (pem[pemLen - 1] == '\r' || - pem[pemLen - 1] == '\n')) { - pemLen--; - } - pem[pemLen++] = '\n'; - pem[pemLen] = '\0'; - - if (XSTRNCMP(pem, PEM_END, PEM_END_SZ) == 0) - break; - - p = (char*)XREALLOC(der, derLen + pemLen + 1, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (p == NULL) { - ret = WOLFSSL_FAILURE; - break; - } - - der = (unsigned char*)p; - XMEMCPY(der + derLen, pem, pemLen + 1); - derLen += pemLen; - } - if (pemLen <= 0) - ret = WOLFSSL_FAILURE; - } - - /* Check trailer. */ - if (ret == WOLFSSL_SUCCESS) { - if (XSTRNCMP(pem + PEM_END_SZ, nameStr, nameLen) != 0) - ret = WOLFSSL_FAILURE; - } - if (ret == WOLFSSL_SUCCESS) { - if (XSTRNCMP(pem + PEM_END_SZ + nameLen, - PEM_HDR_FIN_EOL_NEWLINE, - PEM_HDR_FIN_EOL_SZ) != 0 && - XSTRNCMP(pem + PEM_END_SZ + nameLen, - PEM_HDR_FIN_EOL_NULL_TERM, - PEM_HDR_FIN_EOL_SZ) != 0) { - ret = WOLFSSL_FAILURE; - } - } - - /* Base64 decode body. */ - if (ret == WOLFSSL_SUCCESS) { - if (Base64_Decode(der, derLen, der, &derLen) != 0) - ret = WOLFSSL_FAILURE; - } - - if (ret == WOLFSSL_SUCCESS) { - *name = nameStr; - *header = headerStr; - *data = der; - *len = derLen; - nameStr = NULL; - headerStr = NULL; - der = NULL; - } - - if (nameStr != NULL) - XFREE(nameStr, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (headerStr != NULL) - XFREE(headerStr, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (der != NULL) - XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - return ret; - } - - int wolfSSL_PEM_write_bio(WOLFSSL_BIO* bio, const char *name, - const char *header, const unsigned char *data, - long len) - { - int err = 0; - int outSz = 0; - int nameLen; - int headerLen; - byte* pem = NULL; - word32 pemLen; - word32 derLen = (word32)len; - - if (bio == NULL || name == NULL || header == NULL || data == NULL) - return 0; - - nameLen = (int)XSTRLEN(name); - headerLen = (int)XSTRLEN(header); - - pemLen = (derLen + 2) / 3 * 4; - pemLen += (pemLen + 63) / 64; - - pem = (byte*)XMALLOC(pemLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); - err = pem == NULL; - if (!err) - err = Base64_Encode(data, derLen, pem, &pemLen) != 0; - - if (!err) { - err = wolfSSL_BIO_write(bio, PEM_BEGIN, PEM_BEGIN_SZ) != - (int)PEM_BEGIN_SZ; - } - if (!err) - err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen; - if (!err) { - err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE, - PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ; - } - if (!err && headerLen > 0) { - err = wolfSSL_BIO_write(bio, header, headerLen) != headerLen; - /* Blank line after a header and before body. */ - if (!err) - err = wolfSSL_BIO_write(bio, "\n", 1) != 1; - headerLen++; - } - if (!err) - err = wolfSSL_BIO_write(bio, pem, pemLen) != (int)pemLen; - if (!err) - err = wolfSSL_BIO_write(bio, PEM_END, PEM_END_SZ) != - (int)PEM_END_SZ; - if (!err) - err = wolfSSL_BIO_write(bio, name, nameLen) != nameLen; - if (!err) { - err = wolfSSL_BIO_write(bio, PEM_HDR_FIN_EOL_NEWLINE, - PEM_HDR_FIN_EOL_SZ) != (int)PEM_HDR_FIN_EOL_SZ; - } - - if (!err) { - outSz = PEM_BEGIN_SZ + nameLen + PEM_HDR_FIN_EOL_SZ + headerLen + - pemLen + PEM_END_SZ + nameLen + PEM_HDR_FIN_EOL_SZ; - } - - if (pem != NULL) - XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - return outSz; - } - -#if !defined(NO_FILESYSTEM) - int wolfSSL_PEM_read(XFILE fp, char **name, char **header, - unsigned char **data, long *len) - { - int ret; - WOLFSSL_BIO* bio; - - if (name == NULL || header == NULL || data == NULL || len == NULL) - return WOLFSSL_FAILURE; - - bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE); - if (bio == NULL) - return 0; - - ret = wolfSSL_PEM_read_bio(bio, name, header, data, len); - - if (bio != NULL) - wolfSSL_BIO_free(bio); - - return ret; - } - - int wolfSSL_PEM_write(XFILE fp, const char *name, const char *header, - const unsigned char *data, long len) - { - int ret; - WOLFSSL_BIO* bio; - - if (name == NULL || header == NULL || data == NULL) - return 0; - - bio = wolfSSL_BIO_new_fp(fp, BIO_NOCLOSE); - if (bio == NULL) - return 0; - - ret = wolfSSL_PEM_write_bio(bio, name, header, data, len); - - if (bio != NULL) - wolfSSL_BIO_free(bio); - - return ret; - } -#endif -#endif /* !NO_BIO */ - - int wolfSSL_PEM_get_EVP_CIPHER_INFO(const char* header, - EncryptedInfo* cipher) - { - if (header == NULL || cipher == NULL) - return WOLFSSL_FAILURE; - - XMEMSET(cipher, 0, sizeof(*cipher)); - - if (wc_EncryptedInfoParse(cipher, &header, XSTRLEN(header)) != 0) - return WOLFSSL_FAILURE; - - return WOLFSSL_SUCCESS; - } - - int wolfSSL_PEM_do_header(EncryptedInfo* cipher, unsigned char* data, - long* len, wc_pem_password_cb* callback, - void* ctx) - { - int ret = WOLFSSL_SUCCESS; - char password[NAME_SZ]; - int passwordSz; - - if (cipher == NULL || data == NULL || len == NULL || callback == NULL) - return WOLFSSL_FAILURE; - - passwordSz = callback(password, sizeof(password), PEM_PASS_READ, ctx); - if (passwordSz < 0) - ret = WOLFSSL_FAILURE; - - if (ret == WOLFSSL_SUCCESS) { - if (wc_BufferKeyDecrypt(cipher, data, (word32)*len, (byte*)password, - passwordSz, WC_MD5) != 0) { - ret = WOLFSSL_FAILURE; - } - } - - if (passwordSz > 0) - XMEMSET(password, 0, passwordSz); - - return ret; - } - -#ifndef NO_BIO - /* - * bp : bio to read X509 from - * x : x509 to write to - * cb : password call back for reading PEM - * u : password - * _AUX is for working with a trusted X509 certificate - */ - WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp, - WOLFSSL_X509 **x, wc_pem_password_cb *cb, - void *u) - { - WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509"); - - /* AUX info is; trusted/rejected uses, friendly name, private key id, - * and potentially a stack of "other" info. wolfSSL does not store - * friendly name or private key id yet in WOLFSSL_X509 for human - * readability and does not support extra trusted/rejected uses for - * root CA. */ - return wolfSSL_PEM_read_bio_X509(bp, x, cb, u); - } -#endif /* !NO_BIO */ - - -#endif /* OPENSSL_EXTRA || OPENSSL_ALL */ -#endif /* !NO_CERTS */ /* NID variables are dependent on compatibility header files currently * @@ -29169,14 +18510,14 @@ WOLFSSL_MSG("NID not in table"); #ifdef WOLFSSL_QT sName = NULL; - type = id; + type = (word32)id; #else return NULL; #endif } #ifdef HAVE_ECC - if (type == 0 && wc_ecc_get_oid(id, &oid, &oidSz) > 0) { + if (type == 0 && wc_ecc_get_oid((word32)id, &oid, &oidSz) > 0) { type = oidCurveType; } #endif /* HAVE_ECC */ @@ -29188,7 +18529,7 @@ } } - oid = OidFromId(id, type, &oidSz); + oid = OidFromId((word32)id, type, &oidSz); /* set object ID to buffer */ if (obj == NULL){ @@ -29200,7 +18541,7 @@ } obj->nid = nid; obj->type = id; - obj->grp = type; + obj->grp = (int)type; obj->sName[0] = '\0'; if (sName != NULL) { @@ -29225,10 +18566,10 @@ wolfSSL_ASN1_OBJECT_free(obj); return NULL; } - obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ; + obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA; } else { - obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA ; + obj->dynamic &= ~WOLFSSL_ASN1_DYNAMIC_DATA; } } XMEMCPY((byte*)obj->obj, objBuf, obj->objSz); @@ -29348,12 +18689,12 @@ else if (a->type == GEN_DNS || a->type == GEN_EMAIL || a->type == GEN_URI) { bufSz = (int)XSTRLEN((const char*)a->obj); - XMEMCPY(buf, a->obj, min(bufSz, bufLen)); + XMEMCPY(buf, a->obj, min((word32)bufSz, (word32)bufLen)); } else if ((bufSz = wolfssl_obj2txt_numeric(buf, bufLen, a)) > 0) { if ((desc = oid_translate_num_to_str(buf))) { bufSz = (int)XSTRLEN(desc); - bufSz = min(bufSz, bufLen - 1); + bufSz = (int)min((word32)bufSz,(word32) bufLen - 1); XMEMCPY(buf, desc, bufSz); } } @@ -29393,223 +18734,6 @@ defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \ defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \ defined(WOLFSSL_HAPROXY) - char wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x) - { - int ret; - - WOLFSSL_ENTER("wolfSSL_CTX_use_certificate"); - if (!ctx || !x || !x->derCert) { - WOLFSSL_MSG("Bad parameter"); - return WOLFSSL_FAILURE; - } - - FreeDer(&ctx->certificate); /* Make sure previous is free'd */ - ret = AllocDer(&ctx->certificate, x->derCert->length, CERT_TYPE, - ctx->heap); - if (ret != 0) - return WOLFSSL_FAILURE; - - XMEMCPY(ctx->certificate->buffer, x->derCert->buffer, - x->derCert->length); -#ifdef KEEP_OUR_CERT - if (ctx->ourCert != NULL && ctx->ownOurCert) { - wolfSSL_X509_free(ctx->ourCert); - } - #ifndef WOLFSSL_X509_STORE_CERTS - ctx->ourCert = x; - if (wolfSSL_X509_up_ref(x) != 1) { - return WOLFSSL_FAILURE; - } - #else - ctx->ourCert = wolfSSL_X509_d2i(NULL, x->derCert->buffer,x->derCert->length); - if(ctx->ourCert == NULL){ - return WOLFSSL_FAILURE; - } - #endif - - /* We own the cert because either we up its reference counter - * or we create our own copy of the cert object. */ - ctx->ownOurCert = 1; -#endif - - /* Update the available options with public keys. */ - switch (x->pubKeyOID) { - #ifndef NO_RSA - #ifdef WC_RSA_PSS - case RSAPSSk: - #endif - case RSAk: - ctx->haveRSA = 1; - break; - #endif - #ifdef HAVE_ED25519 - case ED25519k: - #endif - #ifdef HAVE_ED448 - case ED448k: - #endif - case ECDSAk: - ctx->haveECC = 1; - #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) - ctx->pkCurveOID = x->pkCurveOID; - #endif - break; - } - - return WOLFSSL_SUCCESS; - } - - static int PushCertToDerBuffer(DerBuffer** inOutDer, int weOwn, - byte* cert, word32 certSz, void* heap) - { - int ret; - DerBuffer* inChain = NULL; - DerBuffer* der = NULL; - word32 len = 0; - if (inOutDer == NULL) - return BAD_FUNC_ARG; - inChain = *inOutDer; - if (inChain != NULL) - len = inChain->length; - ret = AllocDer(&der, len + CERT_HEADER_SZ + certSz, CERT_TYPE, - heap); - if (ret != 0) { - WOLFSSL_MSG("AllocDer error"); - return ret; - } - if (inChain != NULL) - XMEMCPY(der->buffer, inChain->buffer, len); - c32to24(certSz, der->buffer + len); - XMEMCPY(der->buffer + len + CERT_HEADER_SZ, cert, certSz); - if (weOwn) - FreeDer(inOutDer); - *inOutDer = der; - return WOLFSSL_SUCCESS; - } - - /** - * wolfSSL_CTX_add1_chain_cert makes a copy of the cert so we free it - * on success - */ - int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509) - { - WOLFSSL_ENTER("wolfSSL_CTX_add0_chain_cert"); - if (wolfSSL_CTX_add1_chain_cert(ctx, x509) != WOLFSSL_SUCCESS) { - return WOLFSSL_FAILURE; - } - wolfSSL_X509_free(x509); - return WOLFSSL_SUCCESS; - } - - int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509) - { - int ret; - WOLFSSL_ENTER("wolfSSL_CTX_add1_chain_cert"); - if (ctx == NULL || x509 == NULL || x509->derCert == NULL) { - return WOLFSSL_FAILURE; - } - - if (ctx->certificate == NULL) - ret = (int)wolfSSL_CTX_use_certificate(ctx, x509); - else { - if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_X509_up_ref error"); - return WOLFSSL_FAILURE; - } - ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer, - x509->derCert->length, WOLFSSL_FILETYPE_ASN1); - if (ret == WOLFSSL_SUCCESS) { - /* push to ctx->certChain */ - ret = PushCertToDerBuffer(&ctx->certChain, 1, - x509->derCert->buffer, x509->derCert->length, ctx->heap); - } - /* Store cert to free it later */ - if (ret == WOLFSSL_SUCCESS && ctx->x509Chain == NULL) { - ctx->x509Chain = wolfSSL_sk_X509_new_null(); - if (ctx->x509Chain == NULL) { - WOLFSSL_MSG("wolfSSL_sk_X509_new_null error"); - ret = WOLFSSL_FAILURE; - } - } - if (ret == WOLFSSL_SUCCESS && - wolfSSL_sk_X509_push(ctx->x509Chain, x509) - != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_sk_X509_push error"); - ret = WOLFSSL_FAILURE; - } - if (ret != WOLFSSL_SUCCESS) - wolfSSL_X509_free(x509); /* Decrease ref counter */ - } - - return (ret == WOLFSSL_SUCCESS) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; - } - -#ifdef KEEP_OUR_CERT - int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509) - { - int ret; - - WOLFSSL_ENTER("wolfSSL_add0_chain_cert"); - - if (ssl == NULL || ssl->ctx == NULL || x509 == NULL || - x509->derCert == NULL) - return WOLFSSL_FAILURE; - - if (ssl->buffers.certificate == NULL) { - ret = wolfSSL_use_certificate(ssl, x509); - /* Store cert to free it later */ - if (ret == WOLFSSL_SUCCESS) { - if (ssl->buffers.weOwnCert) - wolfSSL_X509_free(ssl->ourCert); - ssl->ourCert = x509; - ssl->buffers.weOwnCert = 1; - } - } - else { - ret = PushCertToDerBuffer(&ssl->buffers.certChain, - ssl->buffers.weOwnCertChain, x509->derCert->buffer, - x509->derCert->length, ssl->heap); - if (ret == WOLFSSL_SUCCESS) { - ssl->buffers.weOwnCertChain = 1; - /* Store cert to free it later */ - if (ssl->ourCertChain == NULL) { - ssl->ourCertChain = wolfSSL_sk_X509_new_null(); - if (ssl->ourCertChain == NULL) { - WOLFSSL_MSG("wolfSSL_sk_X509_new_null error"); - return WOLFSSL_FAILURE; - } - } - if (wolfSSL_sk_X509_push(ssl->ourCertChain, x509) - != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_sk_X509_push error"); - return WOLFSSL_FAILURE; - } - } - } - return ret == WOLFSSL_SUCCESS ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; - } - - int wolfSSL_add1_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509) - { - int ret; - - WOLFSSL_ENTER("wolfSSL_add1_chain_cert"); - if (ssl == NULL || ssl->ctx == NULL || x509 == NULL || - x509->derCert == NULL) - return WOLFSSL_FAILURE; - - if (wolfSSL_X509_up_ref(x509) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_X509_up_ref error"); - return WOLFSSL_FAILURE; - } - ret = wolfSSL_add0_chain_cert(ssl, x509); - /* Decrease ref counter on error */ - if (ret != WOLFSSL_SUCCESS) - wolfSSL_X509_free(x509); - return ret; - } -#endif - /* Return the corresponding short name for the nid . * or NULL if short name can't be found. */ @@ -29631,7 +18755,7 @@ return obj_info->sName; } } - WOLFSSL_MSG("SN not found"); + WOLFSSL_MSG_EX("SN not found (nid:%d)",n); return NULL; } @@ -29663,7 +18787,7 @@ err = 1; } if (err == 0) { - ret = len; + ret = (size_t)len; } WOLFSSL_LEAVE("wolfSSL_OBJ_length", (int)ret); @@ -29728,7 +18852,7 @@ if (o->nid > 0) return o->nid; if ((ret = GetObjectId(o->obj, &idx, &oid, o->grp, o->objSz)) < 0) { - if (ret == ASN_OBJECT_ID_E) { + if (ret == WC_NO_ERR_TRACE(ASN_OBJECT_ID_E)) { /* Put ASN object tag in front and try again */ int len = SetObjectId(o->objSz, NULL) + o->objSz; byte* buf = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -29936,8 +19060,8 @@ wolfSSL_ASN1_OBJECT_free(obj); return NULL; } - obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA ; - i = SetObjectId(outSz, (byte*)obj->obj); + obj->dynamic |= WOLFSSL_ASN1_DYNAMIC_DATA; + i = SetObjectId((int)outSz, (byte*)obj->obj); XMEMCPY((byte*)obj->obj + i, out, outSz); obj->objSz = i + outSz; return obj; @@ -30028,53 +19152,6 @@ #endif } - -#ifndef NO_CERTS -int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey) -{ - WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey"); - - if (ctx == NULL || pkey == NULL) { - return WOLFSSL_FAILURE; - } - - switch (pkey->type) { -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && !defined(NO_RSA) - case EVP_PKEY_RSA: - WOLFSSL_MSG("populating RSA key"); - if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) - return WOLFSSL_FAILURE; - break; -#endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */ -#if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \ - defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA) - case EVP_PKEY_DSA: - break; -#endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && !NO_DSA */ -#ifdef HAVE_ECC - case EVP_PKEY_EC: - WOLFSSL_MSG("populating ECC key"); - if (ECC_populate_EVP_PKEY(pkey, pkey->ecc) - != WOLFSSL_SUCCESS) - return WOLFSSL_FAILURE; - break; -#endif - default: - return WOLFSSL_FAILURE; - } - - if (pkey->pkey.ptr != NULL) { - /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */ - return wolfSSL_CTX_use_PrivateKey_buffer(ctx, - (const unsigned char*)pkey->pkey.ptr, - pkey->pkey_sz, SSL_FILETYPE_ASN1); - } - - WOLFSSL_MSG("wolfSSL private key not set"); - return BAD_FUNC_ARG; -} -#endif /* !NO_CERTS */ - #endif /* OPENSSL_EXTRA */ #if defined(HAVE_EX_DATA) && \ @@ -30385,50 +19462,6 @@ #if defined(HAVE_LIGHTY) || defined(HAVE_STUNNEL) \ || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA) -#if defined(OPENSSL_EXTRA) && !defined(NO_DH) -/* Initialize ctx->dh with dh's params. Return WOLFSSL_SUCCESS on ok */ -long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh) -{ - int pSz, gSz; - byte *p, *g; - int ret=0; - - WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh"); - - if(!ctx || !dh) - return BAD_FUNC_ARG; - - /* Get needed size for p and g */ - pSz = wolfSSL_BN_bn2bin(dh->p, NULL); - gSz = wolfSSL_BN_bn2bin(dh->g, NULL); - - if(pSz <= 0 || gSz <= 0) - return WOLFSSL_FATAL_ERROR; - - p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - if(!p) - return MEMORY_E; - - g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - if(!g) { - XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - return MEMORY_E; - } - - pSz = wolfSSL_BN_bn2bin(dh->p, p); - gSz = wolfSSL_BN_bn2bin(dh->g, g); - - if(pSz >= 0 && gSz >= 0) /* Conversion successful */ - ret = wolfSSL_CTX_SetTmpDH(ctx, p, pSz, g, gSz); - - XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); - - return pSz > 0 && gSz > 0 ? ret : WOLFSSL_FATAL_ERROR; -} -#endif /* OPENSSL_EXTRA && !NO_DH */ - - /* returns the enum value associated with handshake state * * ssl the WOLFSSL structure to get state of @@ -30464,14 +19497,33 @@ #ifdef WOLFSSL_TLS13 ssl->buffers.certChainCnt = 0; #endif - if (ssl->buffers.weOwnKey) + if (ssl->buffers.weOwnKey) { FreeDer(&ssl->buffers.key); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.keyMask); + #endif + } ssl->buffers.key = NULL; +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + ssl->buffers.keyMask = NULL; +#endif ssl->buffers.keyType = 0; ssl->buffers.keyId = 0; ssl->buffers.keyLabel = 0; ssl->buffers.keySz = 0; ssl->buffers.keyDevId = 0; +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->buffers.weOwnAltKey) { + FreeDer(&ssl->buffers.altKey); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.altKeyMask); + #endif + } + ssl->buffers.altKey = NULL; +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + ssl->buffers.altKeyMask = NULL; +#endif +#endif /* WOLFSSL_DUAL_ALG_CERTS */ } #endif @@ -30485,7 +19537,8 @@ return BAD_FUNC_ARG; switch (cmd) { - #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(OPENSSL_ALL) + #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || \ + defined(OPENSSL_ALL) #ifdef HAVE_SNI case SSL_CTRL_SET_TLSEXT_HOSTNAME: WOLFSSL_MSG("Entering Case: SSL_CTRL_SET_TLSEXT_HOSTNAME."); @@ -30647,7 +19700,7 @@ return ret; } -#ifndef WOLFSSL_NO_STUB +#ifndef NO_WOLFSSL_STUB long wolfSSL_CTX_callback_ctrl(WOLFSSL_CTX* ctx, int cmd, void (*fp)(void)) { (void) ctx; @@ -30657,7 +19710,7 @@ return WOLFSSL_FAILURE; } -#endif /* WOLFSSL_NO_STUB */ +#endif /* NO_WOLFSSL_STUB */ #ifndef NO_WOLFSSL_STUB long wolfSSL_CTX_clear_extra_chain_certs(WOLFSSL_CTX* ctx) @@ -30677,65 +19730,6 @@ return NULL; } -/* Adds the ASN1 certificate to the user ctx. -Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/ -int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz, - const unsigned char *der) -{ - WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1"); - if (der != NULL && ctx != NULL) { - if (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz, - WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) { - return WOLFSSL_SUCCESS; - } - - } - return WOLFSSL_FAILURE; -} - - -#if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(NO_RSA) && !defined(HAVE_USER_RSA) -/* Adds the rsa private key to the user ctx. -Returns WOLFSSL_SUCCESS if no error, returns WOLFSSL_FAILURE otherwise.*/ -int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa) -{ - int ret; - int derSize; - unsigned char *maxDerBuf; - unsigned char* key = NULL; - - WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey"); - - if (ctx == NULL || rsa == NULL) { - WOLFSSL_MSG("one or more inputs were NULL"); - return BAD_FUNC_ARG; - } - maxDerBuf = (unsigned char*)XMALLOC(4096, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (maxDerBuf == NULL) { - WOLFSSL_MSG("Malloc failure"); - return MEMORY_E; - } - key = maxDerBuf; - /* convert RSA struct to der encoded buffer and get the size */ - if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &key)) <= 0) { - WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure"); - XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, (const unsigned char*)maxDerBuf, - derSize, SSL_FILETYPE_ASN1); - if (ret != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure"); - XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); - return WOLFSSL_FAILURE; - } - XFREE(maxDerBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); - return ret; -} -#endif /* NO_RSA && !HAVE_FAST_RSA */ - - #ifndef NO_BIO /* Converts EVP_PKEY data from a bio buffer to a WOLFSSL_EVP_PKEY structure. Returns pointer to private EVP_PKEY struct upon success, NULL if there @@ -30772,7 +19766,8 @@ int derLength; /* Determines key type and returns the new private EVP_PKEY object */ - if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == NULL) { + if ((key = wolfSSL_d2i_PrivateKey_EVP(NULL, &mem, (long)memSz)) == + NULL) { WOLFSSL_MSG("wolfSSL_d2i_PrivateKey_EVP() failure"); XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); return NULL; @@ -30824,8 +19819,9 @@ #endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */ -#if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || defined(WOLFSSL_HAPROXY) || \ - defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) || defined(WOLFSSL_WPAS_SMALL) +#if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_QT) || defined(WOLFSSL_WPAS_SMALL) /* Converts a DER encoded private key to a WOLFSSL_EVP_PKEY structure. * returns a pointer to a new WOLFSSL_EVP_PKEY structure on success and NULL @@ -30837,13 +19833,15 @@ return d2iGenericKey(out, (const unsigned char**)in, inSz, 1); } -#endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT || WOLFSSL_WPAS_SMALL*/ +#endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT || + * WOLFSSL_WPAS_SMALL*/ /* stunnel compatibility functions*/ -#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \ - defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \ - defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH))) +#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ + (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ + defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ + defined(WOLFSSL_OPENSSH))) void wolfSSL_ERR_remove_thread_state(void* pid) { (void) pid; @@ -30861,176 +19859,15 @@ #endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH */ - -#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \ - defined(HAVE_EX_DATA) - -#if defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE) -static void SESSION_ex_data_cache_update(WOLFSSL_SESSION* session, int idx, - void* data, byte get, void** getRet, int* setRet) -{ - int row; - int i; - int error = 0; - SessionRow* sessRow = NULL; - const byte* id; - byte foundCache = 0; - - if (getRet != NULL) - *getRet = NULL; - if (setRet != NULL) - *setRet = WOLFSSL_FAILURE; - - id = session->sessionID; - if (session->haveAltSessionID) - id = session->altSessionID; - - row = (int)(HashObject(id, ID_LEN, &error) % SESSION_ROWS); - if (error != 0) { - WOLFSSL_MSG("Hash session failed"); - return; - } - - sessRow = &SessionCache[row]; - if (get) - error = SESSION_ROW_RD_LOCK(sessRow); - else - error = SESSION_ROW_WR_LOCK(sessRow); - if (error != 0) { - WOLFSSL_MSG("Session row lock failed"); - return; - } - - for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) { - WOLFSSL_SESSION* cacheSession; -#ifdef SESSION_CACHE_DYNAMIC_MEM - cacheSession = sessRow->Sessions[i]; -#else - cacheSession = &sessRow->Sessions[i]; -#endif - if (cacheSession && - XMEMCMP(id, cacheSession->sessionID, ID_LEN) == 0 - && session->side == cacheSession->side - #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) - && (IsAtLeastTLSv1_3(session->version) == - IsAtLeastTLSv1_3(cacheSession->version)) - #endif - ) { - if (get) { - *getRet = wolfSSL_CRYPTO_get_ex_data( - &cacheSession->ex_data, idx); - } - else { - *setRet = wolfSSL_CRYPTO_set_ex_data( - &cacheSession->ex_data, idx, data); - } - foundCache = 1; - break; - } - } - SESSION_ROW_UNLOCK(sessRow); - /* If we don't have a session in cache then clear the ex_data and - * own it */ - if (!foundCache) { - XMEMSET(&session->ex_data, 0, sizeof(WOLFSSL_CRYPTO_EX_DATA)); - session->ownExData = 1; - if (!get) { - *setRet = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, - data); - } - } - -} -#endif - -int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data) -{ - int ret = WOLFSSL_FAILURE; - WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data"); -#ifdef HAVE_EX_DATA - session = ClientSessionToSession(session); - if (session != NULL) { -#ifndef NO_SESSION_CACHE - if (!session->ownExData) { - /* Need to update in cache */ - SESSION_ex_data_cache_update(session, idx, data, 0, NULL, &ret); - } - else -#endif - { - ret = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data); - } - } -#else - (void)session; - (void)idx; - (void)data; -#endif - return ret; -} - -#ifdef HAVE_EX_DATA_CLEANUP_HOOKS -int wolfSSL_SESSION_set_ex_data_with_cleanup( - WOLFSSL_SESSION* session, - int idx, - void* data, - wolfSSL_ex_data_cleanup_routine_t cleanup_routine) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data_with_cleanup"); - session = ClientSessionToSession(session); - if(session != NULL) { - return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&session->ex_data, idx, - data, cleanup_routine); - } - return WOLFSSL_FAILURE; -} -#endif /* HAVE_EX_DATA_CLEANUP_HOOKS */ - -void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx) -{ - void* ret = NULL; - WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data"); -#ifdef HAVE_EX_DATA - session = ClientSessionToSession(session); - if (session != NULL) { -#ifndef NO_SESSION_CACHE - if (!session->ownExData) { - /* Need to retrieve the data from the session cache */ - SESSION_ex_data_cache_update((WOLFSSL_SESSION*)session, idx, NULL, - 1, &ret, NULL); - } - else -#endif - { - ret = wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx); - } - } -#else - (void)session; - (void)idx; -#endif - return ret; -} -#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_EX_DATA */ - /* Note: This is a huge section of API's - through * wolfSSL_X509_OBJECT_get0_X509_CRL */ #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB))) -#ifdef HAVE_EX_DATA -int wolfSSL_SESSION_get_ex_new_index(long ctx_l,void* ctx_ptr, - WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func, - WOLFSSL_CRYPTO_EX_free* free_func) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index"); - return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION, ctx_l, - ctx_ptr, new_func, dup_func, free_func); -} -#endif -#if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_DEBUG_MEMORY) +#if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_DEBUG_MEMORY) && \ + !defined(WOLFSSL_STATIC_MEMORY) static wolfSSL_OSSL_Malloc_cb ossl_malloc = NULL; static wolfSSL_OSSL_Free_cb ossl_free = NULL; static wolfSSL_OSSL_Realloc_cb ossl_realloc = NULL; @@ -31056,14 +19893,15 @@ else return NULL; } -#endif /* USE_WOLFSSL_MEMORY && !WOLFSSL_DEBUG_MEMORY */ +#endif /* USE_WOLFSSL_MEMORY && !WOLFSSL_DEBUG_MEMORY && + * !WOLFSSL_STATIC_MEMORY */ int wolfSSL_CRYPTO_set_mem_functions( wolfSSL_OSSL_Malloc_cb m, wolfSSL_OSSL_Realloc_cb r, wolfSSL_OSSL_Free_cb f) { -#ifdef USE_WOLFSSL_MEMORY +#if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY) #ifdef WOLFSSL_DEBUG_MEMORY WOLFSSL_MSG("mem functions will receive function name instead of " "file name"); @@ -31194,17 +20032,17 @@ return ret; } - -#ifndef NO_WOLFSSL_SERVER +/* May be called by server to get the requested accepted name and by the client + * to get the requested name. */ const char * wolfSSL_get_servername(WOLFSSL* ssl, byte type) { void * serverName = NULL; if (ssl == NULL) return NULL; - TLSX_SNI_GetRequest(ssl->extensions, type, &serverName); + TLSX_SNI_GetRequest(ssl->extensions, type, &serverName, + !wolfSSL_is_server(ssl)); return (const char *)serverName; } -#endif /* NO_WOLFSSL_SERVER */ #endif /* HAVE_SNI */ WOLFSSL_CTX* wolfSSL_set_SSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx) @@ -31232,6 +20070,13 @@ if (ssl->ctx == ctx) return ssl->ctx; + if (ctx->suites == NULL) { + /* suites */ + if (AllocateCtxSuites(ctx) != 0) + return NULL; + InitSSL_CTX_Suites(ctx); + } + wolfSSL_RefInc(&ctx->ref, &ret); #ifdef WOLFSSL_REFCNT_ERROR_RETURN if (ret != 0) { @@ -31242,9 +20087,8 @@ #else (void)ret; #endif - if (ssl->ctx) { + if (ssl->ctx != NULL) wolfSSL_CTX_free(ssl->ctx); - } ssl->ctx = ctx; #ifndef NO_CERTS @@ -31254,7 +20098,22 @@ #ifdef WOLFSSL_TLS13 ssl->buffers.certChainCnt = ctx->certChainCnt; #endif +#ifndef WOLFSSL_BLIND_PRIVATE_KEY ssl->buffers.key = ctx->privateKey; +#else + if (ctx->privateKey != NULL) { + AllocCopyDer(&ssl->buffers.key, ctx->privateKey->buffer, + ctx->privateKey->length, ctx->privateKey->type, + ctx->privateKey->heap); + /* Blind the private key for the SSL with new random mask. */ + wolfssl_priv_der_unblind(ssl->buffers.key, ctx->privateKeyMask); + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + &ssl->buffers.keyMask); + if (ret != 0) { + return ret; + } + } +#endif ssl->buffers.keyType = ctx->privateKeyType; ssl->buffers.keyId = ctx->privateKeyId; ssl->buffers.keyLabel = ctx->privateKeyLabel; @@ -31268,9 +20127,29 @@ ssl->options.haveStaticECC = ctx->haveStaticECC; ssl->options.haveFalconSig = ctx->haveFalconSig; ssl->options.haveDilithiumSig = ctx->haveDilithiumSig; +#ifdef WOLFSSL_DUAL_ALG_CERTS +#ifndef WOLFSSL_BLIND_PRIVATE_KEY + ssl->buffers.altKey = ctx->altPrivateKey; +#else + if (ctx->altPrivateKey != NULL) { + AllocCopyDer(&ssl->buffers.altkey, ctx->altPrivateKey->buffer, + ctx->altPrivateKey->length, ctx->altPrivateKey->type, + ctx->altPrivateKey->heap); + /* Blind the private key for the SSL with new random mask. */ + wolfssl_priv_der_unblind(ssl->buffers.altKey, ctx->altPrivateKeyMask); + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.altKey, + &ssl->buffers.altKeyMask); + if (ret != 0) { + return ret; + } + } +#endif + ssl->buffers.altKeySz = ctx->altPrivateKeySz; + ssl->buffers.altKeyType = ctx->altPrivateKeyType; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #endif -#ifdef OPENSSL_EXTRA +#ifdef WOLFSSL_SESSION_ID_CTX /* copy over application session context ID */ ssl->sessionCtxSz = ctx->sessionCtxSz; XMEMCPY(ssl->sessionCtx, ctx->sessionCtx, ctx->sessionCtxSz); @@ -31288,16 +20167,9 @@ return NULL; } - #ifdef HAVE_SNI - -void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb) -{ - WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback"); - if (ctx) - ctx->sniRecvCb = cb; -} - +/* this is a compatibily function, consider using + * wolfSSL_CTX_set_servername_callback */ int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb) { @@ -31309,19 +20181,8 @@ return WOLFSSL_FAILURE; } -int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg) -{ - WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg"); - if (ctx) { - ctx->sniRecvCbArg = arg; - return WOLFSSL_SUCCESS; - } - return WOLFSSL_FAILURE; -} - #endif /* HAVE_SNI */ - #ifndef NO_BIO void wolfSSL_ERR_load_BIO_strings(void) { WOLFSSL_ENTER("wolfSSL_ERR_load_BIO_strings"); @@ -31356,6 +20217,27 @@ * HAVE_LIGHTY || WOLFSSL_HAPROXY || WOLFSSL_OPENSSH || * HAVE_SBLIM_SFCB)) */ +#ifdef HAVE_SNI + +void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb) +{ + WOLFSSL_ENTER("wolfSSL_CTX_set_servername_callback"); + if (ctx) + ctx->sniRecvCb = cb; +} + + +int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg) +{ + WOLFSSL_ENTER("wolfSSL_CTX_set_servername_arg"); + if (ctx) { + ctx->sniRecvCbArg = arg; + return WOLFSSL_SUCCESS; + } + return WOLFSSL_FAILURE; +} + +#endif /* HAVE_SNI */ #if defined(OPENSSL_EXTRA) @@ -31427,219 +20309,12 @@ return WOLFSSL_FAILURE; } -WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl) +WOLFSSL_CTX* wolfSSL_get_SSL_CTX(const WOLFSSL* ssl) { WOLFSSL_ENTER("wolfSSL_get_SSL_CTX"); return ssl->ctx; } -#if defined(OPENSSL_ALL) || \ - defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \ - defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) - -const byte* wolfSSL_SESSION_get_id(const WOLFSSL_SESSION* sess, - unsigned int* idLen) -{ - WOLFSSL_ENTER("wolfSSL_SESSION_get_id"); - sess = ClientSessionToSession(sess); - if (sess == NULL || idLen == NULL) { - WOLFSSL_MSG("Bad func args. Please provide idLen"); - return NULL; - } - *idLen = sess->sessionIDSz; - return sess->sessionID; -} - -#if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \ - !defined(NO_FILESYSTEM) - -#ifndef NO_BIO - -#if defined(SESSION_CERTS) || \ - (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) -/* returns a pointer to the protocol used by the session */ -static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in) -{ - in = ClientSessionToSession(in); - return wolfSSL_internal_get_version((ProtocolVersion*)&in->version); -} -#endif - -/* returns true (non 0) if the session has EMS (extended master secret) */ -static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in) -{ - in = ClientSessionToSession(in); - if (in == NULL) - return 0; - return in->haveEMS; -} - -#if defined(HAVE_SESSION_TICKET) -/* prints out the ticket to bio passed in - * return WOLFSSL_SUCCESS on success - */ -static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio, - const WOLFSSL_SESSION* in, const char* tab) -{ - unsigned short i, j, z, sz; - short tag = 0; - byte* pt; - - - in = ClientSessionToSession(in); - if (in == NULL || bio == NULL) { - return BAD_FUNC_ARG; - } - - sz = in->ticketLen; - pt = in->ticket; - - if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0) - return WOLFSSL_FAILURE; - - for (i = 0; i < sz;) { - char asc[16]; - - if (sz - i < 16) { - if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0) - return WOLFSSL_FAILURE; - } - else { - if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0) - return WOLFSSL_FAILURE; - } - for (j = 0; i < sz && j < 8; j++,i++) { - asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.'; - if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0) - return WOLFSSL_FAILURE; - } - - if (i < sz) { - asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.'; - if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0) - return WOLFSSL_FAILURE; - j++; - i++; - } - - for (; i < sz && j < 16; j++,i++) { - asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.'; - if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0) - return WOLFSSL_FAILURE; - } - - /* pad out spacing */ - for (z = j; z < 17; z++) { - if (wolfSSL_BIO_printf(bio, " ") <= 0) - return WOLFSSL_FAILURE; - } - - for (z = 0; z < j; z++) { - if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0) - return WOLFSSL_FAILURE; - } - if (wolfSSL_BIO_printf(bio, "\n") <= 0) - return WOLFSSL_FAILURE; - - tag += 16; - } - return WOLFSSL_SUCCESS; -} -#endif /* HAVE_SESSION_TICKET */ - - -/* prints out the session information in human readable form - * return WOLFSSL_SUCCESS on success - */ -int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *session) -{ - const unsigned char* pt; - unsigned char buf[SECRET_LEN]; - unsigned int sz = 0, i; - int ret; - - session = ClientSessionToSession(session); - if (session == NULL) { - return WOLFSSL_FAILURE; - } - - if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0) - return WOLFSSL_FAILURE; - -#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ - defined(HAVE_SESSION_TICKET)) - if (wolfSSL_BIO_printf(bp, " Protocol : %s\n", - wolfSSL_SESSION_get_protocol(session)) <= 0) - return WOLFSSL_FAILURE; -#endif - - if (wolfSSL_BIO_printf(bp, " Cipher : %s\n", - wolfSSL_SESSION_CIPHER_get_name(session)) <= 0) - return WOLFSSL_FAILURE; - - pt = wolfSSL_SESSION_get_id(session, &sz); - if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0) - return WOLFSSL_FAILURE; - - for (i = 0; i < sz; i++) { - if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0) - return WOLFSSL_FAILURE; - } - if (wolfSSL_BIO_printf(bp, "\n") <= 0) - return WOLFSSL_FAILURE; - - if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0) - return WOLFSSL_FAILURE; - - ret = wolfSSL_SESSION_get_master_key(session, buf, sizeof(buf)); - if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0) - return WOLFSSL_FAILURE; - - if (ret > 0) { - sz = (unsigned int)ret; - for (i = 0; i < sz; i++) { - if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0) - return WOLFSSL_FAILURE; - } - } - if (wolfSSL_BIO_printf(bp, "\n") <= 0) - return WOLFSSL_FAILURE; - - /* @TODO PSK identity hint and SRP */ - - if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0) - return WOLFSSL_FAILURE; - -#ifdef HAVE_SESSION_TICKET - if (wolfSSL_SESSION_print_ticket(bp, session, " ") != WOLFSSL_SUCCESS) - return WOLFSSL_FAILURE; -#endif - -#if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \ - defined(HAVE_EXT_CACHE)) - if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n", - wolfSSL_SESSION_get_time(session)) <= 0) - return WOLFSSL_FAILURE; - - if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n", - wolfSSL_SESSION_get_timeout(session)) <= 0) - return WOLFSSL_FAILURE; -#endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */ - - /* @TODO verify return code print */ - - if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n", - (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0) - return WOLFSSL_FAILURE; - - return WOLFSSL_SUCCESS; -} - -#endif /* !NO_BIO */ -#endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */ - -#endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */ - #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && defined(HAVE_STUNNEL)) \ || defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) @@ -31710,709 +20385,6 @@ } #endif -#if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE25519) -/* return 1 if success, 0 if error - * output keys are little endian format - */ -int wolfSSL_EC25519_generate_key(unsigned char *priv, unsigned int *privSz, - unsigned char *pub, unsigned int *pubSz) -{ -#ifndef WOLFSSL_KEY_GEN - WOLFSSL_MSG("No Key Gen built in"); - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#else /* WOLFSSL_KEY_GEN */ - int ret = WOLFSSL_FAILURE; - int initTmpRng = 0; - WC_RNG *rng = NULL; -#ifdef WOLFSSL_SMALL_STACK - WC_RNG *tmpRNG = NULL; -#else - WC_RNG tmpRNG[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_EC25519_generate_key"); - - if (priv == NULL || privSz == NULL || *privSz < CURVE25519_KEYSIZE || - pub == NULL || pubSz == NULL || *pubSz < CURVE25519_KEYSIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - -#ifdef WOLFSSL_SMALL_STACK - tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG); - if (tmpRNG == NULL) - return WOLFSSL_FAILURE; -#endif - if (wc_InitRng(tmpRNG) == 0) { - rng = tmpRNG; - initTmpRng = 1; - } - else { - WOLFSSL_MSG("Bad RNG Init, trying global"); - if (initGlobalRNG == 0) - WOLFSSL_MSG("Global RNG no Init"); - else - rng = &globalRNG; - } - - if (rng) { - curve25519_key key; - - if (wc_curve25519_init(&key) != MP_OKAY) - WOLFSSL_MSG("wc_curve25519_init failed"); - else if (wc_curve25519_make_key(rng, CURVE25519_KEYSIZE, &key)!=MP_OKAY) - WOLFSSL_MSG("wc_curve25519_make_key failed"); - /* export key pair */ - else if (wc_curve25519_export_key_raw_ex(&key, priv, privSz, pub, - pubSz, EC25519_LITTLE_ENDIAN) - != MP_OKAY) - WOLFSSL_MSG("wc_curve25519_export_key_raw_ex failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_curve25519_free(&key); - } - - if (initTmpRng) - wc_FreeRng(tmpRNG); - -#ifdef WOLFSSL_SMALL_STACK - XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG); -#endif - - return ret; -#endif /* WOLFSSL_KEY_GEN */ -} - -/* return 1 if success, 0 if error - * input and output keys are little endian format - */ -int wolfSSL_EC25519_shared_key(unsigned char *shared, unsigned int *sharedSz, - const unsigned char *priv, unsigned int privSz, - const unsigned char *pub, unsigned int pubSz) -{ -#ifndef WOLFSSL_KEY_GEN - WOLFSSL_MSG("No Key Gen built in"); - (void) shared; - (void) sharedSz; - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#else /* WOLFSSL_KEY_GEN */ - int ret = WOLFSSL_FAILURE; - curve25519_key privkey, pubkey; - - WOLFSSL_ENTER("wolfSSL_EC25519_shared_key"); - - if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE25519_KEYSIZE || - priv == NULL || privSz < CURVE25519_KEYSIZE || - pub == NULL || pubSz < CURVE25519_KEYSIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - - /* import private key */ - if (wc_curve25519_init(&privkey) != MP_OKAY) { - WOLFSSL_MSG("wc_curve25519_init privkey failed"); - return ret; - } - if (wc_curve25519_import_private_ex(priv, privSz, &privkey, - EC25519_LITTLE_ENDIAN) != MP_OKAY) { - WOLFSSL_MSG("wc_curve25519_import_private_ex failed"); - wc_curve25519_free(&privkey); - return ret; - } - - /* import public key */ - if (wc_curve25519_init(&pubkey) != MP_OKAY) { - WOLFSSL_MSG("wc_curve25519_init pubkey failed"); - wc_curve25519_free(&privkey); - return ret; - } - if (wc_curve25519_import_public_ex(pub, pubSz, &pubkey, - EC25519_LITTLE_ENDIAN) != MP_OKAY) { - WOLFSSL_MSG("wc_curve25519_import_public_ex failed"); - wc_curve25519_free(&privkey); - wc_curve25519_free(&pubkey); - return ret; - } - - if (wc_curve25519_shared_secret_ex(&privkey, &pubkey, - shared, sharedSz, - EC25519_LITTLE_ENDIAN) != MP_OKAY) - WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_curve25519_free(&privkey); - wc_curve25519_free(&pubkey); - - return ret; -#endif /* WOLFSSL_KEY_GEN */ -} -#endif /* OPENSSL_EXTRA && HAVE_CURVE25519 */ - -#if defined(OPENSSL_EXTRA) && defined(HAVE_ED25519) -/* return 1 if success, 0 if error - * output keys are little endian format - */ -int wolfSSL_ED25519_generate_key(unsigned char *priv, unsigned int *privSz, - unsigned char *pub, unsigned int *pubSz) -{ -#ifndef WOLFSSL_KEY_GEN - WOLFSSL_MSG("No Key Gen built in"); - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#elif !defined(HAVE_ED25519_KEY_EXPORT) - WOLFSSL_MSG("No ED25519 key export built in"); - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#else /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */ - int ret = WOLFSSL_FAILURE; - int initTmpRng = 0; - WC_RNG *rng = NULL; -#ifdef WOLFSSL_SMALL_STACK - WC_RNG *tmpRNG = NULL; -#else - WC_RNG tmpRNG[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_ED25519_generate_key"); - - if (priv == NULL || privSz == NULL || *privSz < ED25519_PRV_KEY_SIZE || - pub == NULL || pubSz == NULL || *pubSz < ED25519_PUB_KEY_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - -#ifdef WOLFSSL_SMALL_STACK - tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG); - if (tmpRNG == NULL) - return WOLFSSL_FATAL_ERROR; -#endif - if (wc_InitRng(tmpRNG) == 0) { - rng = tmpRNG; - initTmpRng = 1; - } - else { - WOLFSSL_MSG("Bad RNG Init, trying global"); - if (initGlobalRNG == 0) - WOLFSSL_MSG("Global RNG no Init"); - else - rng = &globalRNG; - } - - if (rng) { - ed25519_key key; - - if (wc_ed25519_init(&key) != MP_OKAY) - WOLFSSL_MSG("wc_ed25519_init failed"); - else if (wc_ed25519_make_key(rng, ED25519_KEY_SIZE, &key)!=MP_OKAY) - WOLFSSL_MSG("wc_ed25519_make_key failed"); - /* export private key */ - else if (wc_ed25519_export_key(&key, priv, privSz, pub, pubSz)!=MP_OKAY) - WOLFSSL_MSG("wc_ed25519_export_key failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_ed25519_free(&key); - } - - if (initTmpRng) - wc_FreeRng(tmpRNG); - -#ifdef WOLFSSL_SMALL_STACK - XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG); -#endif - - return ret; -#endif /* WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_EXPORT */ -} - -/* return 1 if success, 0 if error - * input and output keys are little endian format - * priv is a buffer containing private and public part of key - */ -int wolfSSL_ED25519_sign(const unsigned char *msg, unsigned int msgSz, - const unsigned char *priv, unsigned int privSz, - unsigned char *sig, unsigned int *sigSz) -{ -#if !defined(HAVE_ED25519_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT) -#if !defined(HAVE_ED25519_SIGN) - WOLFSSL_MSG("No ED25519 sign built in"); -#elif !defined(WOLFSSL_KEY_GEN) - WOLFSSL_MSG("No Key Gen built in"); -#elif !defined(HAVE_ED25519_KEY_IMPORT) - WOLFSSL_MSG("No ED25519 Key import built in"); -#endif - (void) msg; - (void) msgSz; - (void) priv; - (void) privSz; - (void) sig; - (void) sigSz; - return WOLFSSL_FAILURE; -#else /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */ - ed25519_key key; - int ret = WOLFSSL_FAILURE; - - WOLFSSL_ENTER("wolfSSL_ED25519_sign"); - - if (priv == NULL || privSz != ED25519_PRV_KEY_SIZE || - msg == NULL || sig == NULL || *sigSz < ED25519_SIG_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - - /* import key */ - if (wc_ed25519_init(&key) != MP_OKAY) { - WOLFSSL_MSG("wc_curve25519_init failed"); - return ret; - } - if (wc_ed25519_import_private_key(priv, privSz/2, - priv+(privSz/2), ED25519_PUB_KEY_SIZE, - &key) != MP_OKAY){ - WOLFSSL_MSG("wc_ed25519_import_private failed"); - wc_ed25519_free(&key); - return ret; - } - - if (wc_ed25519_sign_msg(msg, msgSz, sig, sigSz, &key) != MP_OKAY) - WOLFSSL_MSG("wc_curve25519_shared_secret_ex failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_ed25519_free(&key); - - return ret; -#endif /* HAVE_ED25519_SIGN && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */ -} - -/* return 1 if success, 0 if error - * input and output keys are little endian format - * pub is a buffer containing public part of key - */ -int wolfSSL_ED25519_verify(const unsigned char *msg, unsigned int msgSz, - const unsigned char *pub, unsigned int pubSz, - const unsigned char *sig, unsigned int sigSz) -{ -#if !defined(HAVE_ED25519_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED25519_KEY_IMPORT) -#if !defined(HAVE_ED25519_VERIFY) - WOLFSSL_MSG("No ED25519 verify built in"); -#elif !defined(WOLFSSL_KEY_GEN) - WOLFSSL_MSG("No Key Gen built in"); -#elif !defined(HAVE_ED25519_KEY_IMPORT) - WOLFSSL_MSG("No ED25519 Key import built in"); -#endif - (void) msg; - (void) msgSz; - (void) pub; - (void) pubSz; - (void) sig; - (void) sigSz; - return WOLFSSL_FAILURE; -#else /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */ - ed25519_key key; - int ret = WOLFSSL_FAILURE, check = 0; - - WOLFSSL_ENTER("wolfSSL_ED25519_verify"); - - if (pub == NULL || pubSz != ED25519_PUB_KEY_SIZE || - msg == NULL || sig == NULL || sigSz != ED25519_SIG_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - - /* import key */ - if (wc_ed25519_init(&key) != MP_OKAY) { - WOLFSSL_MSG("wc_curve25519_init failed"); - return ret; - } - if (wc_ed25519_import_public(pub, pubSz, &key) != MP_OKAY){ - WOLFSSL_MSG("wc_ed25519_import_public failed"); - wc_ed25519_free(&key); - return ret; - } - - if ((ret = wc_ed25519_verify_msg((byte*)sig, sigSz, msg, msgSz, - &check, &key)) != MP_OKAY) { - WOLFSSL_MSG("wc_ed25519_verify_msg failed"); - } - else if (!check) - WOLFSSL_MSG("wc_ed25519_verify_msg failed (signature invalid)"); - else - ret = WOLFSSL_SUCCESS; - - wc_ed25519_free(&key); - - return ret; -#endif /* HAVE_ED25519_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED25519_KEY_IMPORT */ -} - -#endif /* OPENSSL_EXTRA && HAVE_ED25519 */ - -#if defined(OPENSSL_EXTRA) && defined(HAVE_CURVE448) -/* return 1 if success, 0 if error - * output keys are little endian format - */ -int wolfSSL_EC448_generate_key(unsigned char *priv, unsigned int *privSz, - unsigned char *pub, unsigned int *pubSz) -{ -#ifndef WOLFSSL_KEY_GEN - WOLFSSL_MSG("No Key Gen built in"); - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#else /* WOLFSSL_KEY_GEN */ - int ret = WOLFSSL_FAILURE; - int initTmpRng = 0; - WC_RNG *rng = NULL; -#ifdef WOLFSSL_SMALL_STACK - WC_RNG *tmpRNG = NULL; -#else - WC_RNG tmpRNG[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_EC448_generate_key"); - - if (priv == NULL || privSz == NULL || *privSz < CURVE448_KEY_SIZE || - pub == NULL || pubSz == NULL || *pubSz < CURVE448_KEY_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - -#ifdef WOLFSSL_SMALL_STACK - tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG); - if (tmpRNG == NULL) - return WOLFSSL_FAILURE; -#endif - if (wc_InitRng(tmpRNG) == 0) { - rng = tmpRNG; - initTmpRng = 1; - } - else { - WOLFSSL_MSG("Bad RNG Init, trying global"); - if (initGlobalRNG == 0) - WOLFSSL_MSG("Global RNG no Init"); - else - rng = &globalRNG; - } - - if (rng) { - curve448_key key; - - if (wc_curve448_init(&key) != MP_OKAY) - WOLFSSL_MSG("wc_curve448_init failed"); - else if (wc_curve448_make_key(rng, CURVE448_KEY_SIZE, &key)!=MP_OKAY) - WOLFSSL_MSG("wc_curve448_make_key failed"); - /* export key pair */ - else if (wc_curve448_export_key_raw_ex(&key, priv, privSz, pub, pubSz, - EC448_LITTLE_ENDIAN) - != MP_OKAY) - WOLFSSL_MSG("wc_curve448_export_key_raw_ex failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_curve448_free(&key); - } - - if (initTmpRng) - wc_FreeRng(tmpRNG); - -#ifdef WOLFSSL_SMALL_STACK - XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG); -#endif - - return ret; -#endif /* WOLFSSL_KEY_GEN */ -} - -/* return 1 if success, 0 if error - * input and output keys are little endian format - */ -int wolfSSL_EC448_shared_key(unsigned char *shared, unsigned int *sharedSz, - const unsigned char *priv, unsigned int privSz, - const unsigned char *pub, unsigned int pubSz) -{ -#ifndef WOLFSSL_KEY_GEN - WOLFSSL_MSG("No Key Gen built in"); - (void) shared; - (void) sharedSz; - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#else /* WOLFSSL_KEY_GEN */ - int ret = WOLFSSL_FAILURE; - curve448_key privkey, pubkey; - - WOLFSSL_ENTER("wolfSSL_EC448_shared_key"); - - if (shared == NULL || sharedSz == NULL || *sharedSz < CURVE448_KEY_SIZE || - priv == NULL || privSz < CURVE448_KEY_SIZE || - pub == NULL || pubSz < CURVE448_KEY_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - - /* import private key */ - if (wc_curve448_init(&privkey) != MP_OKAY) { - WOLFSSL_MSG("wc_curve448_init privkey failed"); - return ret; - } - if (wc_curve448_import_private_ex(priv, privSz, &privkey, - EC448_LITTLE_ENDIAN) != MP_OKAY) { - WOLFSSL_MSG("wc_curve448_import_private_ex failed"); - wc_curve448_free(&privkey); - return ret; - } - - /* import public key */ - if (wc_curve448_init(&pubkey) != MP_OKAY) { - WOLFSSL_MSG("wc_curve448_init pubkey failed"); - wc_curve448_free(&privkey); - return ret; - } - if (wc_curve448_import_public_ex(pub, pubSz, &pubkey, - EC448_LITTLE_ENDIAN) != MP_OKAY) { - WOLFSSL_MSG("wc_curve448_import_public_ex failed"); - wc_curve448_free(&privkey); - wc_curve448_free(&pubkey); - return ret; - } - - if (wc_curve448_shared_secret_ex(&privkey, &pubkey, shared, sharedSz, - EC448_LITTLE_ENDIAN) != MP_OKAY) - WOLFSSL_MSG("wc_curve448_shared_secret_ex failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_curve448_free(&privkey); - wc_curve448_free(&pubkey); - - return ret; -#endif /* WOLFSSL_KEY_GEN */ -} -#endif /* OPENSSL_EXTRA && HAVE_CURVE448 */ - -#if defined(OPENSSL_EXTRA) && defined(HAVE_ED448) -/* return 1 if success, 0 if error - * output keys are little endian format - */ -int wolfSSL_ED448_generate_key(unsigned char *priv, unsigned int *privSz, - unsigned char *pub, unsigned int *pubSz) -{ -#ifndef WOLFSSL_KEY_GEN - WOLFSSL_MSG("No Key Gen built in"); - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#elif !defined(HAVE_ED448_KEY_EXPORT) - WOLFSSL_MSG("No ED448 key export built in"); - (void) priv; - (void) privSz; - (void) pub; - (void) pubSz; - return WOLFSSL_FAILURE; -#else /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */ - int ret = WOLFSSL_FAILURE; - int initTmpRng = 0; - WC_RNG *rng = NULL; -#ifdef WOLFSSL_SMALL_STACK - WC_RNG *tmpRNG = NULL; -#else - WC_RNG tmpRNG[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_ED448_generate_key"); - - if (priv == NULL || privSz == NULL || *privSz < ED448_PRV_KEY_SIZE || - pub == NULL || pubSz == NULL || *pubSz < ED448_PUB_KEY_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - -#ifdef WOLFSSL_SMALL_STACK - tmpRNG = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG); - if (tmpRNG == NULL) - return WOLFSSL_FATAL_ERROR; -#endif - if (wc_InitRng(tmpRNG) == 0) { - rng = tmpRNG; - initTmpRng = 1; - } - else { - WOLFSSL_MSG("Bad RNG Init, trying global"); - if (initGlobalRNG == 0) - WOLFSSL_MSG("Global RNG no Init"); - else - rng = &globalRNG; - } - - if (rng) { - ed448_key key; - - if (wc_ed448_init(&key) != MP_OKAY) - WOLFSSL_MSG("wc_ed448_init failed"); - else if (wc_ed448_make_key(rng, ED448_KEY_SIZE, &key) != MP_OKAY) - WOLFSSL_MSG("wc_ed448_make_key failed"); - /* export private key */ - else if (wc_ed448_export_key(&key, priv, privSz, pub, pubSz) != MP_OKAY) - WOLFSSL_MSG("wc_ed448_export_key failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_ed448_free(&key); - } - - if (initTmpRng) - wc_FreeRng(tmpRNG); - -#ifdef WOLFSSL_SMALL_STACK - XFREE(tmpRNG, NULL, DYNAMIC_TYPE_RNG); -#endif - - return ret; -#endif /* WOLFSSL_KEY_GEN && HAVE_ED448_KEY_EXPORT */ -} - -/* return 1 if success, 0 if error - * input and output keys are little endian format - * priv is a buffer containing private and public part of key - */ -int wolfSSL_ED448_sign(const unsigned char *msg, unsigned int msgSz, - const unsigned char *priv, unsigned int privSz, - unsigned char *sig, unsigned int *sigSz) -{ -#if !defined(HAVE_ED448_SIGN) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT) -#if !defined(HAVE_ED448_SIGN) - WOLFSSL_MSG("No ED448 sign built in"); -#elif !defined(WOLFSSL_KEY_GEN) - WOLFSSL_MSG("No Key Gen built in"); -#elif !defined(HAVE_ED448_KEY_IMPORT) - WOLFSSL_MSG("No ED448 Key import built in"); -#endif - (void) msg; - (void) msgSz; - (void) priv; - (void) privSz; - (void) sig; - (void) sigSz; - return WOLFSSL_FAILURE; -#else /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */ - ed448_key key; - int ret = WOLFSSL_FAILURE; - - WOLFSSL_ENTER("wolfSSL_ED448_sign"); - - if (priv == NULL || privSz != ED448_PRV_KEY_SIZE || msg == NULL || - sig == NULL || *sigSz < ED448_SIG_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - - /* import key */ - if (wc_ed448_init(&key) != MP_OKAY) { - WOLFSSL_MSG("wc_curve448_init failed"); - return ret; - } - if (wc_ed448_import_private_key(priv, privSz/2, priv+(privSz/2), - ED448_PUB_KEY_SIZE, &key) != MP_OKAY){ - WOLFSSL_MSG("wc_ed448_import_private failed"); - wc_ed448_free(&key); - return ret; - } - - if (wc_ed448_sign_msg(msg, msgSz, sig, sigSz, &key, NULL, 0) != MP_OKAY) - WOLFSSL_MSG("wc_curve448_shared_secret_ex failed"); - else - ret = WOLFSSL_SUCCESS; - - wc_ed448_free(&key); - - return ret; -#endif /* HAVE_ED448_SIGN && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */ -} - -/* return 1 if success, 0 if error - * input and output keys are little endian format - * pub is a buffer containing public part of key - */ -int wolfSSL_ED448_verify(const unsigned char *msg, unsigned int msgSz, - const unsigned char *pub, unsigned int pubSz, - const unsigned char *sig, unsigned int sigSz) -{ -#if !defined(HAVE_ED448_VERIFY) || !defined(WOLFSSL_KEY_GEN) || !defined(HAVE_ED448_KEY_IMPORT) -#if !defined(HAVE_ED448_VERIFY) - WOLFSSL_MSG("No ED448 verify built in"); -#elif !defined(WOLFSSL_KEY_GEN) - WOLFSSL_MSG("No Key Gen built in"); -#elif !defined(HAVE_ED448_KEY_IMPORT) - WOLFSSL_MSG("No ED448 Key import built in"); -#endif - (void) msg; - (void) msgSz; - (void) pub; - (void) pubSz; - (void) sig; - (void) sigSz; - return WOLFSSL_FAILURE; -#else /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN && HAVE_ED448_KEY_IMPORT */ - ed448_key key; - int ret = WOLFSSL_FAILURE, check = 0; - - WOLFSSL_ENTER("wolfSSL_ED448_verify"); - - if (pub == NULL || pubSz != ED448_PUB_KEY_SIZE || msg == NULL || - sig == NULL || sigSz != ED448_SIG_SIZE) { - WOLFSSL_MSG("Bad arguments"); - return WOLFSSL_FAILURE; - } - - /* import key */ - if (wc_ed448_init(&key) != MP_OKAY) { - WOLFSSL_MSG("wc_curve448_init failed"); - return ret; - } - if (wc_ed448_import_public(pub, pubSz, &key) != MP_OKAY){ - WOLFSSL_MSG("wc_ed448_import_public failed"); - wc_ed448_free(&key); - return ret; - } - - if ((ret = wc_ed448_verify_msg((byte*)sig, sigSz, msg, msgSz, &check, - &key, NULL, 0)) != MP_OKAY) { - WOLFSSL_MSG("wc_ed448_verify_msg failed"); - } - else if (!check) - WOLFSSL_MSG("wc_ed448_verify_msg failed (signature invalid)"); - else - ret = WOLFSSL_SUCCESS; - - wc_ed448_free(&key); - - return ret; -#endif /* HAVE_ED448_VERIFY && WOLFSSL_KEY_GEN */ -} - -#endif /* OPENSSL_EXTRA && HAVE_ED448 */ #ifdef WOLFSSL_JNI @@ -32474,12 +20446,12 @@ static int peek_ignore_err(int err) { switch(err) { - case -WANT_READ: - case -WANT_WRITE: - case -ZERO_RETURN: + case -WC_NO_ERR_TRACE(WANT_READ): + case -WC_NO_ERR_TRACE(WANT_WRITE): + case -WC_NO_ERR_TRACE(ZERO_RETURN): case -WOLFSSL_ERROR_ZERO_RETURN: - case -SOCKET_PEER_CLOSED_E: - case -SOCKET_ERROR_E: + case -WC_NO_ERR_TRACE(SOCKET_PEER_CLOSED_E): + case -WC_NO_ERR_TRACE(SOCKET_ERROR_E): return 1; default: return 0; @@ -32494,15 +20466,15 @@ WOLFSSL_ENTER("wolfSSL_ERR_peek_error_line_data"); err = wc_PeekErrorNodeLineData(file, line, data, flags, peek_ignore_err); - if (err == -ASN_NO_PEM_HEADER) + if (err == -WC_NO_ERR_TRACE(ASN_NO_PEM_HEADER)) return (ERR_LIB_PEM << 24) | PEM_R_NO_START_LINE; #ifdef OPENSSL_ALL /* PARSE_ERROR is returned if an HTTP request is detected. */ - else if (err == -SSL_R_HTTP_REQUEST) + else if (err == -WC_NO_ERR_TRACE(PARSE_ERROR)) return (ERR_LIB_SSL << 24) | -SSL_R_HTTP_REQUEST; #endif #if defined(OPENSSL_ALL) && defined(WOLFSSL_PYTHON) - else if (err == ASN1_R_HEADER_TOO_LONG) + else if (err == WC_NO_ERR_TRACE(ASN1_R_HEADER_TOO_LONG)) return (ERR_LIB_ASN1 << 24) | ASN1_R_HEADER_TOO_LONG; #endif return err; @@ -32653,7 +20625,7 @@ add->data.cipher.cipherSuite0 && cipher_names[j].cipherSuite == add->data.cipher.cipherSuite) { - add->data.cipher.offset = j; + add->data.cipher.offset = (unsigned long)j; break; } } @@ -32679,8 +20651,9 @@ } #endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */ -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \ - || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || defined(HAVE_SECRET_CALLBACK) +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \ + defined(HAVE_LIGHTY) || defined(HAVE_SECRET_CALLBACK) long wolfSSL_SSL_CTX_get_timeout(const WOLFSSL_CTX *ctx) { WOLFSSL_ENTER("wolfSSL_SSL_CTX_get_timeout"); @@ -32714,86 +20687,11 @@ if (ctx == NULL || ecdh == NULL) return BAD_FUNC_ARG; - ctx->ecdhCurveOID = ecdh->group->curve_oid; + ctx->ecdhCurveOID = (word32)ecdh->group->curve_oid; return WOLFSSL_SUCCESS; } #endif -#ifndef NO_SESSION_CACHE -int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s) -{ -#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) - int rem_called = FALSE; -#endif - - WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session"); - - s = ClientSessionToSession(s); - if (ctx == NULL || s == NULL) - return BAD_FUNC_ARG; - -#ifdef HAVE_EXT_CACHE - if (!ctx->internalCacheOff) -#endif - { - const byte* id; - WOLFSSL_SESSION *sess = NULL; - word32 row = 0; - int ret; - - id = s->sessionID; - if (s->haveAltSessionID) - id = s->altSessionID; - - ret = TlsSessionCacheGetAndWrLock(id, &sess, &row, ctx->method->side); - if (ret == 0 && sess != NULL) { -#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) - if (sess->rem_sess_cb != NULL) { - rem_called = TRUE; - } -#endif - /* Call this before changing ownExData so that calls to ex_data - * don't try to access the SessionCache again. */ - EvictSessionFromCache(sess); -#ifdef HAVE_EX_DATA - if (sess->ownExData) { - /* Most recent version of ex data is in cache. Copy it - * over so the user can free it. */ - XMEMCPY(&s->ex_data, &sess->ex_data, - sizeof(WOLFSSL_CRYPTO_EX_DATA)); - s->ownExData = 1; - sess->ownExData = 0; - } -#endif -#ifdef SESSION_CACHE_DYNAMIC_MEM - { - /* Find and clear entry. Row is locked so we are good to go. */ - int idx; - for (idx = 0; idx < SESSIONS_PER_ROW; idx++) { - if (sess == SessionCache[row].Sessions[idx]) { - XFREE(sess, sess->heap, DYNAMIC_TYPE_SESSION); - SessionCache[row].Sessions[idx] = NULL; - break; - } - } - } -#endif - TlsSessionCacheUnlockRow(row); - } - } - -#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) - if (ctx->rem_sess_cb != NULL && !rem_called) { - ctx->rem_sess_cb(ctx, s); - } -#endif - - /* s cannot be resumed at this point */ - s->timeout = 0; - - return 0; -} -#endif /* !NO_SESSION_CACHE */ #ifndef NO_BIO BIO *wolfSSL_SSL_get_rbio(const WOLFSSL *s) { @@ -32862,13 +20760,17 @@ { WOLFSSL_ENTER("wolfSSL_SSL_in_init"); + return !wolfSSL_is_init_finished(ssl); +} + +int wolfSSL_SSL_in_before(const WOLFSSL *ssl) +{ + WOLFSSL_ENTER("wolfSSL_SSL_in_before"); + if (ssl == NULL) return WOLFSSL_FAILURE; - if (ssl->options.side == WOLFSSL_CLIENT_END) { - return ssl->options.connectState < SECOND_REPLY_DONE; - } - return ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE; + return ssl->options.handShakeState == NULL_STATE; } int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl) @@ -32887,17 +20789,6 @@ ssl->options.acceptState < ACCEPT_THIRD_REPLY_DONE; } -#ifndef NO_SESSION_CACHE - -WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl) -{ - WOLFSSL_ENTER("wolfSSL_SSL_get0_session"); - - return ssl->session; -} - -#endif /* NO_SESSION_CACHE */ - #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) /* Expected return values from implementations of OpenSSL ticket key callback. */ @@ -33038,6 +20929,8 @@ end: (void)wc_HmacFree(&hmacCtx.hmac); + (void)wolfSSL_EVP_CIPHER_CTX_cleanup(evpCtx); + #ifdef WOLFSSL_SMALL_STACK XFREE(evpCtx, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -33112,8 +21005,9 @@ * correct length. */ long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx, - unsigned char *keys, int keylen) + const void *keys_vp, int keylen) { + const byte* keys = (const byte*)keys_vp; if (ctx == NULL || keys == NULL) { return WOLFSSL_FAILURE; } @@ -33179,7 +21073,8 @@ if (XSTRLEN((char *)ssl->ocspProducedDate) >= producedDate_space) return BUFFER_E; - XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, producedDate_space); + XSTRNCPY((char *)producedDate, (const char *)ssl->ocspProducedDate, + producedDate_space); *producedDateFormat = ssl->ocspProducedDateFormat; return 0; @@ -33206,7 +21101,8 @@ #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \ defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) -int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, WOLF_STACK_OF(X509)** chain) +int wolfSSL_CTX_get_extra_chain_certs(WOLFSSL_CTX* ctx, + WOLF_STACK_OF(X509)** chain) { word32 idx; word32 length; @@ -33230,8 +21126,7 @@ /* Create a new stack of WOLFSSL_X509 object from chain buffer. */ for (idx = 0; idx < ctx->certChain->length; ) { - node = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), NULL, - DYNAMIC_TYPE_OPENSSL); + node = wolfSSL_sk_X509_new_null(); if (node == NULL) return WOLFSSL_FAILURE; node->next = NULL; @@ -33241,8 +21136,8 @@ idx += 3; /* Create a new X509 from DER encoded data. */ - node->data.x509 = wolfSSL_X509_d2i(NULL, ctx->certChain->buffer + idx, - length); + node->data.x509 = wolfSSL_X509_d2i_ex(NULL, + ctx->certChain->buffer + idx, (int)length, ctx->heap); if (node->data.x509 == NULL) { XFREE(node, NULL, DYNAMIC_TYPE_OPENSSL); /* Return as much of the chain as we created. */ @@ -33318,8 +21213,11 @@ WOLFSSL_MSG("Bad parameter"); return WOLFSSL_FAILURE; } - *sk = ctx->x509Chain; - return WOLFSSL_SUCCESS; + + /* This function should return ctx->x509Chain if it is populated, otherwise + it should be populated from ctx->certChain. This matches the behavior of + wolfSSL_CTX_get_extra_chain_certs, so it is used directly. */ + return wolfSSL_CTX_get_extra_chain_certs(ctx, sk); } #ifdef KEEP_OUR_CERT @@ -33372,8 +21270,8 @@ } } -WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value(WOLF_STACK_OF(WOLFSSL_STRING)* strings, - int idx) +WOLFSSL_STRING wolfSSL_sk_WOLFSSL_STRING_value( + WOLF_STACK_OF(WOLFSSL_STRING)* strings, int idx) { for (; idx > 0 && strings != NULL; idx--) strings = strings->next; @@ -33438,6 +21336,20 @@ return OPENSSL_NPN_NO_OVERLAP; } +void wolfSSL_set_alpn_select_cb(WOLFSSL *ssl, + int (*cb) (WOLFSSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg) +{ + if (ssl != NULL) { + ssl->alpnSelect = cb; + ssl->alpnSelectArg = arg; + } +} + void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx, int (*cb) (WOLFSSL *ssl, const unsigned char **out, @@ -33479,8 +21391,8 @@ WOLFSSL_STUB("wolfSSL_CTX_set_next_proto_select_cb"); } -void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, const unsigned char **data, - unsigned *len) +void wolfSSL_get0_next_proto_negotiated(const WOLFSSL *s, + const unsigned char **data, unsigned *len) { (void)s; (void)data; @@ -33494,14 +21406,86 @@ #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL) int wolfSSL_curve_is_disabled(const WOLFSSL* ssl, word16 curve_id) { - return (curve_id <= WOLFSSL_ECC_MAX && - ssl->disabledCurves && - ssl->disabledCurves & (1 << curve_id)); + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_curve_is_disabled"); + WOLFSSL_MSG_EX("wolfSSL_curve_is_disabled checking for %d", curve_id); + + /* (curve_id >= WOLFSSL_FFDHE_START) - DH parameters are never disabled. */ + if (curve_id < WOLFSSL_FFDHE_START) { + if (curve_id > WOLFSSL_ECC_MAX_AVAIL) { + WOLFSSL_MSG("Curve id out of supported range"); + /* Disabled if not in valid range. */ + ret = 1; + } + else if (curve_id >= 32) { + /* 0 is for invalid and 1-14 aren't used otherwise. */ + ret = (ssl->disabledCurves & (1U << (curve_id - 32))) != 0; + } + else { + ret = (ssl->disabledCurves & (1U << curve_id)) != 0; + } + } + + WOLFSSL_LEAVE("wolfSSL_curve_is_disabled", ret); + return ret; } #if (defined(HAVE_ECC) || \ defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) -static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names) +#define CURVE_NAME(c) XSTR_SIZEOF((c)), (c) + +const WOLF_EC_NIST_NAME kNistCurves[] = { +#ifdef HAVE_ECC + {CURVE_NAME("P-160"), NID_secp160r1, WOLFSSL_ECC_SECP160R1}, + {CURVE_NAME("P-160-2"), NID_secp160r2, WOLFSSL_ECC_SECP160R2}, + {CURVE_NAME("P-192"), NID_X9_62_prime192v1, WOLFSSL_ECC_SECP192R1}, + {CURVE_NAME("P-224"), NID_secp224r1, WOLFSSL_ECC_SECP224R1}, + {CURVE_NAME("P-256"), NID_X9_62_prime256v1, WOLFSSL_ECC_SECP256R1}, + {CURVE_NAME("P-384"), NID_secp384r1, WOLFSSL_ECC_SECP384R1}, + {CURVE_NAME("P-521"), NID_secp521r1, WOLFSSL_ECC_SECP521R1}, + {CURVE_NAME("K-160"), NID_secp160k1, WOLFSSL_ECC_SECP160K1}, + {CURVE_NAME("K-192"), NID_secp192k1, WOLFSSL_ECC_SECP192K1}, + {CURVE_NAME("K-224"), NID_secp224k1, WOLFSSL_ECC_SECP224R1}, + {CURVE_NAME("K-256"), NID_secp256k1, WOLFSSL_ECC_SECP256K1}, + {CURVE_NAME("B-256"), NID_brainpoolP256r1, WOLFSSL_ECC_BRAINPOOLP256R1}, + {CURVE_NAME("B-384"), NID_brainpoolP384r1, WOLFSSL_ECC_BRAINPOOLP384R1}, + {CURVE_NAME("B-512"), NID_brainpoolP512r1, WOLFSSL_ECC_BRAINPOOLP512R1}, +#endif +#ifdef HAVE_CURVE25519 + {CURVE_NAME("X25519"), NID_X25519, WOLFSSL_ECC_X25519}, +#endif +#ifdef HAVE_CURVE448 + {CURVE_NAME("X448"), NID_X448, WOLFSSL_ECC_X448}, +#endif +#ifdef WOLFSSL_HAVE_KYBER + {CURVE_NAME("KYBER_LEVEL1"), WOLFSSL_KYBER_LEVEL1, WOLFSSL_KYBER_LEVEL1}, + {CURVE_NAME("KYBER_LEVEL3"), WOLFSSL_KYBER_LEVEL3, WOLFSSL_KYBER_LEVEL1}, + {CURVE_NAME("KYBER_LEVEL5"), WOLFSSL_KYBER_LEVEL5, WOLFSSL_KYBER_LEVEL1}, +#if (defined(WOLFSSL_WC_KYBER) || defined(HAVE_LIBOQS)) && defined(HAVE_ECC) + {CURVE_NAME("P256_KYBER_LEVEL1"), WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_P256_KYBER_LEVEL1}, + {CURVE_NAME("P384_KYBER_LEVEL3"), WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_P256_KYBER_LEVEL1}, + {CURVE_NAME("P521_KYBER_LEVEL5"), WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_P256_KYBER_LEVEL1}, +#endif +#endif +#ifdef WOLFSSL_SM2 + {CURVE_NAME("SM2"), NID_sm2, WOLFSSL_ECC_SM2P256V1}, +#endif +#ifdef HAVE_ECC + /* Alternative curve names */ + {CURVE_NAME("prime256v1"), NID_X9_62_prime256v1, WOLFSSL_ECC_SECP256R1}, + {CURVE_NAME("secp256r1"), NID_X9_62_prime256v1, WOLFSSL_ECC_SECP256R1}, + {CURVE_NAME("secp384r1"), NID_secp384r1, WOLFSSL_ECC_SECP384R1}, + {CURVE_NAME("secp521r1"), NID_secp521r1, WOLFSSL_ECC_SECP521R1}, +#endif +#ifdef WOLFSSL_SM2 + {CURVE_NAME("sm2p256v1"), NID_sm2, WOLFSSL_ECC_SM2P256V1}, +#endif + {0, NULL, 0, 0}, +}; + +int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names, + byte curves_only) { int idx, start = 0, len, i, ret = WOLFSSL_FAILURE; word16 curve; @@ -33514,6 +21498,7 @@ #else int groups[WOLFSSL_MAX_GROUP_COUNT]; #endif + const WOLF_EC_NIST_NAME* nist_name; #ifdef WOLFSSL_SMALL_STACK groups = (int*)XMALLOC(sizeof(int)*WOLFSSL_MAX_GROUP_COUNT, @@ -33533,39 +21518,19 @@ goto leave; XMEMCPY(name, names + start, len); - name[len++] = 0; + name[len] = 0; + curve = WOLFSSL_NAMED_GROUP_INVALID; - /* Use XSTRNCMP to avoid valgrind error. */ - if ((XSTRNCMP(name, "prime256v1", len) == 0) || - (XSTRNCMP(name, "secp256r1", len) == 0) || - (XSTRNCMP(name, "P-256", len) == 0)) - { - curve = WOLFSSL_ECC_SECP256R1; - } - else if ((XSTRNCMP(name, "secp384r1", len) == 0) || - (XSTRNCMP(name, "P-384", len) == 0)) - { - curve = WOLFSSL_ECC_SECP384R1; - } - else if ((XSTRNCMP(name, "secp521r1", len) == 0) || - (XSTRNCMP(name, "P-521", len) == 0)) - { - curve = WOLFSSL_ECC_SECP521R1; - } - #ifdef HAVE_CURVE25519 - else if (XSTRNCMP(name, "X25519", len) == 0) - { - curve = WOLFSSL_ECC_X25519; - } - #endif - #ifdef HAVE_CURVE448 - else if (XSTRNCMP(name, "X448", len) == 0) - { - curve = WOLFSSL_ECC_X448; + for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) { + if (len == nist_name->name_len && + XSTRNCMP(name, nist_name->name, len) == 0) { + curve = nist_name->curve; + break; + } } - #endif - else { - #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) + + if (curve == WOLFSSL_NAMED_GROUP_INVALID) { + #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(HAVE_ECC) int nret; const ecc_set_type *eccSet; @@ -33588,10 +21553,9 @@ #endif } - if (curve >= (sizeof(word32) * WOLFSSL_BIT_SIZE)) { - /* shift left more than size of ctx->disabledCurves causes static - * analysis report */ - WOLFSSL_MSG("curve value is too large for upcoming shift"); + if ((curves_only && curve >= WOLFSSL_ECC_MAX_AVAIL) || + curve == WOLFSSL_NAMED_GROUP_INVALID) { + WOLFSSL_MSG("curve value is not supported"); goto leave; } @@ -33618,9 +21582,18 @@ for (i = 0; i < groups_len; ++i) { /* Switch the bit to off and therefore is enabled. */ curve = (word16)groups[i]; - disabled &= ~(1U << curve); + if (curve >= 64) { + WC_DO_NOTHING; + } + else if (curve >= 32) { + /* 0 is for invalid and 1-14 aren't used otherwise. */ + disabled &= ~(1U << (curve - 32)); + } + else { + disabled &= ~(1U << curve); + } #ifdef HAVE_SUPPORTED_CURVES - #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_OLD_SET_CURVES_LIST) + #if !defined(WOLFSSL_OLD_SET_CURVES_LIST) /* using the wolfSSL API to set the groups, this will populate * (ssl|ctx)->groups and reset any TLSX_SUPPORTED_GROUPS. * The order in (ssl|ctx)->groups will then be respected @@ -33661,20 +21634,22 @@ int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names) { + WOLFSSL_ENTER("wolfSSL_CTX_set1_curves_list"); if (ctx == NULL || names == NULL) { WOLFSSL_MSG("ctx or names was NULL"); return WOLFSSL_FAILURE; } - return set_curves_list(NULL, ctx, names); + return set_curves_list(NULL, ctx, names, 1); } int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names) { + WOLFSSL_ENTER("wolfSSL_set1_curves_list"); if (ssl == NULL || names == NULL) { WOLFSSL_MSG("ssl or names was NULL"); return WOLFSSL_FAILURE; } - return set_curves_list(ssl, NULL, names); + return set_curves_list(ssl, NULL, names, 1); } #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) */ #endif /* OPENSSL_EXTRA || HAVE_CURL */ @@ -33750,7 +21725,8 @@ return WOLFSSL_SUCCESS; } -void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, int line) +void *wolfSSL_OPENSSL_memdup(const void *data, size_t siz, const char* file, + int line) { void *ret; (void)file; @@ -33822,7 +21798,7 @@ const unsigned char* p, unsigned int p_len) { WOLFSSL_BIO* bio; - char* pt; + char* pt = NULL; unsigned int sz; unsigned int idx = 0; @@ -33882,7 +21858,7 @@ /* clears out all current ALPN extensions set */ TLSX_Remove(&ssl->extensions, TLSX_APPLICATION_LAYER_PROTOCOL, ssl->heap); - if ((sz = wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) { + if ((sz = (unsigned int)wolfSSL_BIO_get_mem_data(bio, &pt)) > 0) { wolfSSL_UseALPN(ssl, pt, sz, (byte) alpn_opt); } wolfSSL_BIO_free(bio); @@ -34265,6 +22241,24 @@ } break; + /* oidCmsKeyAgreeType */ + #ifdef WOLFSSL_CERT_REQ + case oidCsrAttrType: + switch (nid) { + case NID_pkcs9_contentType: + return PKCS9_CONTENT_TYPE_OID; + case NID_pkcs9_challengePassword: + return CHALLENGE_PASSWORD_OID; + case NID_serialNumber: + return SERIAL_NUMBER_OID; + case NID_userId: + return USER_ID_OID; + case NID_surname: + return SURNAME_OID; + } + break; + #endif + default: WOLFSSL_MSG("NID not in table"); /* MSVC warns without the cast */ @@ -34643,7 +22637,7 @@ #endif default: - WOLFSSL_MSG("NID not in table"); + WOLFSSL_MSG("OID not in table"); } /* If not found in above switch then try the table */ for (i = 0; i < WOLFSSL_OBJECT_INFO_SZ; i++) { @@ -34674,150 +22668,6 @@ #ifdef OPENSSL_ALL #if !defined(NO_BIO) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8) -int wolfSSL_PEM_write_bio_PKCS8PrivateKey(WOLFSSL_BIO* bio, - WOLFSSL_EVP_PKEY* pkey, - const WOLFSSL_EVP_CIPHER* enc, - char* passwd, int passwdSz, - wc_pem_password_cb* cb, void* ctx) -{ - int ret = 0; - char password[NAME_SZ]; - byte* key = NULL; - word32 keySz; - byte* pem = NULL; - int pemSz = 0; - int type = PKCS8_PRIVATEKEY_TYPE; - const byte* curveOid; - word32 oidSz; - - if (bio == NULL || pkey == NULL) - return -1; - - keySz = pkey->pkey_sz + 128; - key = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (key == NULL) - ret = MEMORY_E; - - if (ret == 0 && enc != NULL && passwd == NULL) { - passwdSz = cb(password, sizeof(password), 1, ctx); - if (passwdSz < 0) - ret = WOLFSSL_FAILURE; - passwd = password; - } - - if (ret == 0 && enc != NULL) { - WC_RNG rng; - ret = wc_InitRng(&rng); - if (ret == 0) { - int encAlgId = 0; - #ifndef NO_DES3 - if (enc == EVP_DES_CBC) - encAlgId = DESb; - else if (enc == EVP_DES_EDE3_CBC) - encAlgId = DES3b; - else - #endif - #if !defined(NO_AES) && defined(HAVE_AES_CBC) - #ifdef WOLFSSL_AES_256 - if (enc == EVP_AES_256_CBC) - encAlgId = AES256CBCb; - else - #endif - #endif - ret = -1; - if (ret == 0) { - ret = TraditionalEnc((byte*)pkey->pkey.ptr, pkey->pkey_sz, key, - &keySz, passwd, passwdSz, PKCS5, PBES2, - encAlgId, NULL, 0, WC_PKCS12_ITT_DEFAULT, - &rng, NULL); - if (ret > 0) { - keySz = ret; - ret = 0; - } - } - wc_FreeRng(&rng); - } - type = PKCS8_ENC_PRIVATEKEY_TYPE; - } - if (ret == 0 && enc == NULL) { - int algId; - type = PKCS8_PRIVATEKEY_TYPE; - #ifdef HAVE_ECC - if (pkey->type == EVP_PKEY_EC) { - algId = ECDSAk; - ret = wc_ecc_get_oid(pkey->ecc->group->curve_oid, &curveOid, - &oidSz); - } - else - #endif - { - algId = RSAk; - curveOid = NULL; - oidSz = 0; - } - - #ifdef HAVE_ECC - if (ret >= 0) - #endif - { - ret = wc_CreatePKCS8Key(key, &keySz, (byte*)pkey->pkey.ptr, - pkey->pkey_sz, algId, curveOid, oidSz); - keySz = ret; - } - } - - if (password == passwd) - XMEMSET(password, 0, passwdSz); - - if (ret >= 0) { - pemSz = 2 * keySz + 2 * 64; - pem = (byte*)XMALLOC(pemSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (pem == NULL) - ret = MEMORY_E; - } - - if (ret >= 0) - ret = wc_DerToPemEx(key, keySz, pem, pemSz, NULL, type); - - if (key != NULL) - XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - if (ret >= 0) { - if (wolfSSL_BIO_write(bio, pem, ret) != ret) - ret = -1; - } - - if (pem != NULL) - XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - return ret < 0 ? 0 : ret; - -} - -#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) -int wolfSSL_PEM_write_PKCS8PrivateKey(XFILE f, WOLFSSL_EVP_PKEY* pkey, - const WOLFSSL_EVP_CIPHER* enc, char* passwd, int passwdSz, - wc_pem_password_cb* cb, void* ctx) -{ - int ret = WOLFSSL_SUCCESS; - BIO *b; - - WOLFSSL_ENTER("wolfSSL_PEM_write_PKCS8PrivateKey"); - - b = wolfSSL_BIO_new_fp(f, BIO_NOCLOSE); - if (b == NULL) { - ret = WOLFSSL_FAILURE; - } - if (ret == WOLFSSL_SUCCESS) { - ret = wolfSSL_PEM_write_bio_PKCS8PrivateKey(b, pkey, enc, passwd, - passwdSz, cb, ctx); - } - - wolfSSL_BIO_free(b); - - return ret; -} -#endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */ static int bio_get_data(WOLFSSL_BIO* bio, byte** data) { @@ -34873,13 +22723,13 @@ passwordSz); #endif - ret = ToTraditionalEnc(der, len, password, passwordSz, &algId); + ret = ToTraditionalEnc(der, (word32)len, password, passwordSz, &algId); if (ret < 0) { XFREE(der, bio->heap, DYNAMIC_TYPE_OPENSSL); return NULL; } - ForceZero(password, passwordSz); + ForceZero(password, (word32)passwordSz); #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(password, passwordSz); #endif @@ -34910,7 +22760,7 @@ /* Take off PKCS#8 wrapper if found. */ if ((len = ToTraditionalInline_ex(der, &idx, keyLen, &algId)) >= 0) { der += idx; - keyLen = len; + keyLen = (word32)len; } idx = 0; len = 0; @@ -34998,7 +22848,8 @@ if (der != NULL) { ecc_key* key = (ecc_key*)keyPtr; WOLFSSL_MSG("Using static ECDH key"); - ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, der->length); + ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, + der->length); } break; #endif @@ -35132,8 +22983,8 @@ curve25519_key x25519Key; ret = wc_curve25519_init_ex(&x25519Key, heap, INVALID_DEVID); if (ret == 0) { - ret = wc_Curve25519PrivateKeyDecode(keyBuf, &idx, &x25519Key, - keySz); + ret = wc_Curve25519PrivateKeyDecode(keyBuf, &idx, + &x25519Key, keySz); if (ret == 0) keyAlgo = WC_PK_TYPE_CURVE25519; wc_curve25519_free(&x25519Key); @@ -35366,6 +23217,17 @@ (void)id; return 0UL; } +/* wolfSSL_set_ecdh_auto is provided as compatible API with + * SSL_set_ecdh_auto to enable auto ecdh curve selection functionality. + * Since this functionality is enabled by default in wolfSSL, + * this API exists as a stub. + */ +int wolfSSL_set_ecdh_auto(WOLFSSL* ssl, int onoff) +{ + (void)ssl; + (void)onoff; + return WOLFSSL_SUCCESS; +} /* wolfSSL_CTX_set_ecdh_auto is provided as compatible API with * SSL_CTX_set_ecdh_auto to enable auto ecdh curve selection functionality. * Since this functionality is enabled by default in wolfSSL, @@ -35401,36 +23263,14 @@ return 0; } - -/** - * Determine whether a WOLFSSL_SESSION object can be used for resumption - * @param s a pointer to WOLFSSL_SESSION structure - * @return return 1 if session is resumable, otherwise 0. - */ -int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s) -{ - s = ClientSessionToSession(s); - if (s == NULL) - return 0; - -#ifdef HAVE_SESSION_TICKET - if (s->ticketLen > 0) - return 1; -#endif - - if (s->sessionIDSz > 0) - return 1; - - return 0; -} - #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK) /* * This API accepts a user callback which puts key-log records into * a KEY LOGFILE. The callback is stored into a CTX and propagated to * each SSL object on its creation timing. */ -void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx, wolfSSL_CTX_keylog_cb_func cb) +void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx, + wolfSSL_CTX_keylog_cb_func cb) { WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback"); /* stores the callback into WOLFSSL_CTX */ @@ -35451,7 +23291,7 @@ #endif /* OPENSSL_EXTRA */ -#ifndef NO_CERT +#ifndef NO_CERTS #define WOLFSSL_X509_INCLUDED #include "src/x509.c" #endif @@ -35459,9 +23299,10 @@ /******************************************************************************* * START OF standard C library wrapping APIs ******************************************************************************/ -#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \ - defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \ - defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH))) +#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ + (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ + defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ + defined(WOLFSSL_OPENSSH))) #ifndef NO_WOLFSSL_STUB int wolfSSL_CRYPTO_set_mem_ex_functions(void *(*m) (size_t, const char *, int), void *(*r) (void *, size_t, const char *, @@ -35515,9 +23356,10 @@ /******************************************************************************* * START OF EX_DATA APIs ******************************************************************************/ -#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && (defined(HAVE_STUNNEL) || \ - defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) || \ - defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_OPENSSH))) +#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ + (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ + defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ + defined(WOLFSSL_OPENSSH))) void wolfSSL_CRYPTO_cleanup_all_ex_data(void){ WOLFSSL_ENTER("CRYPTO_cleanup_all_ex_data"); } @@ -35538,7 +23380,8 @@ return NULL; } -int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, void *data) +int wolfSSL_CRYPTO_set_ex_data(WOLFSSL_CRYPTO_EX_DATA* ex_data, int idx, + void *data) { WOLFSSL_ENTER("wolfSSL_CRYPTO_set_ex_data"); #ifdef MAX_EX_DATA @@ -35668,7 +23511,7 @@ } buf->data = tmp; - buf->max = mx; + buf->max = (size_t)mx; if (zeroFill) XMEMSET(&buf->data[buf->length], 0, len - buf->length); buf->length = len; @@ -35710,7 +23553,7 @@ buf->data = tmp; buf->length = len; - buf->max = mx; + buf->max = (size_t)mx; return (int)len; } @@ -35745,6 +23588,7 @@ #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB) static int wolfSSL_RAND_InitMutex(void) { +#ifndef WOLFSSL_MUTEX_INITIALIZER if (gRandMethodsInit == 0) { if (wc_InitMutex(&gRandMethodMutex) != 0) { WOLFSSL_MSG("Bad Init Mutex rand methods"); @@ -35752,6 +23596,7 @@ } gRandMethodsInit = 1; } +#endif return 0; } #endif @@ -35820,7 +23665,7 @@ */ const char* wolfSSL_RAND_file_name(char* fname, unsigned long len) { -#ifndef NO_FILESYSTEM +#if !defined(NO_FILESYSTEM) && defined(XGETENV) char* rt; WOLFSSL_ENTER("wolfSSL_RAND_file_name"); @@ -35830,7 +23675,7 @@ } XMEMSET(fname, 0, len); - /* if access to stdlib.h */ + if ((rt = XGETENV("RANDFILE")) != NULL) { if (len > XSTRLEN(rt)) { XMEMCPY(fname, rt, XSTRLEN(rt)); @@ -35843,31 +23688,40 @@ /* $RANDFILE was not set or is too large, check $HOME */ if (rt == NULL) { - char ap[] = "/.rnd"; + const char ap[] = "/.rnd"; WOLFSSL_MSG("Environment variable RANDFILE not set"); + if ((rt = XGETENV("HOME")) == NULL) { + #ifdef XALTHOMEVARNAME + if ((rt = XGETENV(XALTHOMEVARNAME)) == NULL) { + WOLFSSL_MSG("Environment variable HOME and " XALTHOMEVARNAME + " not set"); + return NULL; + } + #else WOLFSSL_MSG("Environment variable HOME not set"); return NULL; + #endif } - if (len > XSTRLEN(rt) + XSTRLEN(ap)) { + if (len > XSTRLEN(rt) + XSTRLEN(ap)) { fname[0] = '\0'; XSTRNCAT(fname, rt, len); XSTRNCAT(fname, ap, len - XSTRLEN(rt)); return fname; } else { - WOLFSSL_MSG("HOME too large for buffer"); + WOLFSSL_MSG("Path too large for buffer"); return NULL; } } return fname; #else - /* no filesystem defined */ WOLFSSL_ENTER("wolfSSL_RAND_file_name"); - WOLFSSL_MSG("No filesystem feature enabled, not compiled in"); + WOLFSSL_MSG("RAND_file_name requires filesystem and getenv support, " + "not compiled in"); (void)fname; (void)len; return NULL; @@ -35913,7 +23767,7 @@ return 0; } - if (wc_RNG_GenerateBlock(&globalRNG, buf, bytes) != 0) { + if (wc_RNG_GenerateBlock(&globalRNG, buf, (word32)bytes) != 0) { WOLFSSL_MSG("Error generating random buffer"); bytes = 0; } @@ -35930,12 +23784,12 @@ bytes = 0; } else { - size_t bytes_written = XFWRITE(buf, 1, bytes, f); + size_t bytes_written = XFWRITE(buf, 1, (size_t)bytes, f); bytes = (int)bytes_written; XFCLOSE(f); } } - ForceZero(buf, bytes); + ForceZero(buf, (word32)bytes); #ifdef WOLFSSL_SMALL_STACK XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); #elif defined(WOLFSSL_CHECK_MEM_ZERO) @@ -35950,8 +23804,9 @@ #ifndef FREERTOS_TCP /* These constant values are protocol values made by egd */ -#if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && !defined(HAVE_FIPS) && \ - defined(HAVE_HASHDRBG) && !defined(NETOS) && defined(HAVE_SYS_UN_H) +#if defined(USE_WOLFSSL_IO) && !defined(USE_WINDOWS_API) && \ + !defined(HAVE_FIPS) && defined(HAVE_HASHDRBG) && !defined(NETOS) && \ + defined(HAVE_SYS_UN_H) #define WOLFSSL_EGD_NBLOCK 0x01 #include #endif @@ -36098,7 +23953,7 @@ close(fd); if (ret == WOLFSSL_SUCCESS) { - return bytes; + return (int)bytes; } else { return ret; @@ -36123,8 +23978,10 @@ wc_UnLockMutex(&gRandMethodMutex); } + #ifndef WOLFSSL_MUTEX_INITIALIZER if (wc_FreeMutex(&gRandMethodMutex) == 0) gRandMethodsInit = 0; + #endif #endif #ifdef HAVE_GLOBAL_RNG if (wc_LockMutex(&globalRNGMutex) == 0) { @@ -36137,7 +23994,8 @@ #endif } -/* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */ +/* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise + * WOLFSSL_FAILURE */ int wolfSSL_RAND_pseudo_bytes(unsigned char* buf, int num) { int ret; @@ -36187,7 +24045,8 @@ return ret; } -/* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise WOLFSSL_FAILURE */ +/* returns WOLFSSL_SUCCESS if the bytes generated are valid otherwise + * WOLFSSL_FAILURE */ int wolfSSL_RAND_bytes(unsigned char* buf, int num) { int ret = 0; @@ -36225,11 +24084,19 @@ WOLFSSL_MSG("Bad Lock Mutex rng"); return ret; } - - rng = &globalRNG; - used_global = 1; + /* the above access to initGlobalRNG is racey -- recheck it now that we + * have the lock. + */ + if (initGlobalRNG) { + rng = &globalRNG; + used_global = 1; + } + else { + wc_UnLockMutex(&globalRNGMutex); + } } - else + + if (used_global == 0) #endif { #ifdef WOLFSSL_SMALL_STACK @@ -36257,7 +24124,7 @@ } if (ret == 0 && num) - ret = wc_RNG_GenerateBlock(rng, buf, num); + ret = wc_RNG_GenerateBlock(rng, buf, (word32)num); if (ret != 0) WOLFSSL_MSG("Bad wc_RNG_GenerateBlock"); @@ -36309,7 +24176,8 @@ int wolfSSL_RAND_set_rand_method(const WOLFSSL_RAND_METHOD *methods) { #ifndef WOLFSSL_NO_OPENSSL_RAND_CB - if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) { + if (wolfSSL_RAND_InitMutex() == 0 && + wc_LockMutex(&gRandMethodMutex) == 0) { gRandMethods = methods; wc_UnLockMutex(&gRandMethodMutex); return WOLFSSL_SUCCESS; @@ -36325,7 +24193,8 @@ { int ret = WOLFSSL_SUCCESS; #ifndef WOLFSSL_NO_OPENSSL_RAND_CB - if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) { + if (wolfSSL_RAND_InitMutex() == 0 && + wc_LockMutex(&gRandMethodMutex) == 0) { if (gRandMethods && gRandMethods->status) ret = gRandMethods->status(); wc_UnLockMutex(&gRandMethodMutex); @@ -36342,7 +24211,8 @@ void wolfSSL_RAND_add(const void* add, int len, double entropy) { #ifndef WOLFSSL_NO_OPENSSL_RAND_CB - if (wolfSSL_RAND_InitMutex() == 0 && wc_LockMutex(&gRandMethodMutex) == 0) { + if (wolfSSL_RAND_InitMutex() == 0 && + wc_LockMutex(&gRandMethodMutex) == 0) { if (gRandMethods && gRandMethods->add) { /* callback has return code, but RAND_add does not */ (void)gRandMethods->add(add, len, entropy); @@ -36358,6 +24228,24 @@ #endif } + +#ifndef NO_WOLFSSL_STUB +void wolfSSL_RAND_screen(void) +{ + WOLFSSL_STUB("RAND_screen"); +} +#endif + +int wolfSSL_RAND_load_file(const char* fname, long len) +{ + (void)fname; + /* wolfCrypt provides enough entropy internally or will report error */ + if (len == -1) + return 1024; + else + return (int)len; +} + #endif /* OPENSSL_EXTRA */ /******************************************************************************* @@ -36455,6 +24343,15 @@ #endif /* WOLFSSL_AES_XTS */ #endif /* NO_AES */ +#ifdef HAVE_ARIA + case ARIA_128_GCM_TYPE : + case ARIA_192_GCM_TYPE : + case ARIA_256_GCM_TYPE : + WOLFSSL_MSG("ARIA GCM"); + XMEMCPY(ctx->iv, &ctx->cipher.aria.nonce, ARIA_BLOCK_SIZE); + break; +#endif /* HAVE_ARIA */ + #ifndef NO_DES3 case DES_CBC_TYPE : WOLFSSL_MSG("DES CBC"); @@ -36488,6 +24385,35 @@ break; #endif +#ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: + break; +#endif +#ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: + WOLFSSL_MSG("SM4 CBC"); + XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE); + break; +#endif +#ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: + WOLFSSL_MSG("SM4 CTR"); + XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE); + break; +#endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + WOLFSSL_MSG("SM4 GCM"); + XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE); + break; +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + WOLFSSL_MSG("SM4 CCM"); + XMEMCPY(&ctx->cipher.sm4.iv, ctx->iv, SM4_BLOCK_SIZE); + break; +#endif + case NULL_CIPHER_TYPE : WOLFSSL_MSG("NULL"); break; @@ -36548,6 +24474,15 @@ #endif /* NO_AES */ +#ifdef HAVE_ARIA + case ARIA_128_GCM_TYPE : + case ARIA_192_GCM_TYPE : + case ARIA_256_GCM_TYPE : + WOLFSSL_MSG("ARIA GCM"); + XMEMCPY(&ctx->cipher.aria.nonce, ctx->iv, ARIA_BLOCK_SIZE); + break; +#endif /* HAVE_ARIA */ + #ifndef NO_DES3 case DES_CBC_TYPE : WOLFSSL_MSG("DES CBC"); @@ -36582,6 +24517,35 @@ break; #endif +#ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: + break; +#endif +#ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: + WOLFSSL_MSG("SM4 CBC"); + XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz); + break; +#endif +#ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: + WOLFSSL_MSG("SM4 CTR"); + XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz); + break; +#endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + WOLFSSL_MSG("SM4 GCM"); + XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz); + break; +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + WOLFSSL_MSG("SM4 CCM"); + XMEMCPY(ctx->iv, &ctx->cipher.sm4.iv, ctx->ivSz); + break; +#endif + case NULL_CIPHER_TYPE : WOLFSSL_MSG("NULL"); break; @@ -36650,2048 +24614,8 @@ #define WOLFSSL_X509_STORE_INCLUDED #include -/******************************************************************************* - * START OF PKCS7 APIs - ******************************************************************************/ -#ifdef HAVE_PKCS7 - -#ifdef OPENSSL_ALL -PKCS7* wolfSSL_PKCS7_new(void) -{ - WOLFSSL_PKCS7* pkcs7; - int ret = 0; - - pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(WOLFSSL_PKCS7), NULL, - DYNAMIC_TYPE_PKCS7); - if (pkcs7 != NULL) { - XMEMSET(pkcs7, 0, sizeof(WOLFSSL_PKCS7)); - ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID); - } - - if (ret != 0 && pkcs7 != NULL) { - XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7); - pkcs7 = NULL; - } - - return (PKCS7*)pkcs7; -} - -/****************************************************************************** -* wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data -* -* RETURNS: -* returns pointer to the PKCS7 structure on success, otherwise returns NULL -*/ -PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void) -{ - byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02}; - PKCS7* pkcs7 = NULL; - - if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL) - return NULL; - pkcs7->contentOID = SIGNED_DATA; - if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) { - if (pkcs7) { - wolfSSL_PKCS7_free(pkcs7); - return NULL; - } - } - return pkcs7; -} - -void wolfSSL_PKCS7_free(PKCS7* pkcs7) -{ - WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; - - if (p7 != NULL) { - if (p7->data != NULL) - XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7); - wc_PKCS7_Free(&p7->pkcs7); - if (p7->certs) - wolfSSL_sk_pop_free(p7->certs, NULL); - XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7); - } -} - -void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7) -{ - wolfSSL_PKCS7_free(p7); - return; -} - -/** - * Convert DER/ASN.1 encoded signedData structure to internal PKCS7 - * structure. Note, does not support detached content. - * - * p7 - pointer to set to address of newly created PKCS7 structure on return - * in - pointer to pointer of DER/ASN.1 data - * len - length of input data, bytes - * - * Returns newly allocated and populated PKCS7 structure or NULL on error. - */ -PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len) -{ - return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0); -} - -/***************************************************************************** -* wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len -* into a PKCS7 object. Optionally, accepts a byte buffer of content which -* is stored as the PKCS7 object's content, to support detached signatures. -* @param content The content which is signed, in case the signature is -* detached. Ignored if NULL. -* @param contentSz The size of the passed in content. -* -* RETURNS: -* returns pointer to a PKCS7 structure on success, otherwise returns NULL -*/ -PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len, - byte* content, word32 contentSz) -{ - WOLFSSL_PKCS7* pkcs7 = NULL; - - WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex"); - - if (in == NULL || *in == NULL || len < 0) - return NULL; - - if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL) - return NULL; - - pkcs7->len = len; - pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7); - if (pkcs7->data == NULL) { - wolfSSL_PKCS7_free((PKCS7*)pkcs7); - return NULL; - } - XMEMCPY(pkcs7->data, *in, pkcs7->len); - - if (content != NULL) { - pkcs7->pkcs7.content = content; - pkcs7->pkcs7.contentSz = contentSz; - } - if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) - != 0) { - WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed"); - wolfSSL_PKCS7_free((PKCS7*)pkcs7); - return NULL; - } - - if (p7 != NULL) - *p7 = (PKCS7*)pkcs7; - *in += pkcs7->len; - return (PKCS7*)pkcs7; -} - -/** - * This API was added as a helper function for libest. It - * extracts a stack of certificates from the pkcs7 object. - * @param pkcs7 PKCS7 parameter object - * @return WOLFSSL_STACK_OF(WOLFSSL_X509)* - */ -WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7) -{ - int i; - WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; - WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL; - - WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack"); - - if (!p7) { - WOLFSSL_MSG("Bad parameter"); - return NULL; - } - - if (p7->certs) - return p7->certs; - - for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) { - WOLFSSL_X509* x509 = wolfSSL_X509_d2i(NULL, p7->pkcs7.cert[i], - p7->pkcs7.certSz[i]); - if (!ret) - ret = wolfSSL_sk_X509_new_null(); - if (x509) { - if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) { - wolfSSL_X509_free(x509); - WOLFSSL_MSG("wolfSSL_sk_X509_push error"); - goto error; - } - } - else { - WOLFSSL_MSG("wolfSSL_X509_d2i error"); - goto error; - } - } - - /* Save stack to free later */ - if (p7->certs) - wolfSSL_sk_pop_free(p7->certs, NULL); - p7->certs = ret; - - return ret; -error: - if (ret) { - wolfSSL_sk_pop_free(ret, NULL); - } - return NULL; -} - -/** - * Return stack of signers contained in PKCS7 cert. - * Notes: - * - Currently only PKCS#7 messages with a single signer cert is supported. - * - Returned WOLFSSL_STACK must be freed by caller. - * - * pkcs7 - PKCS7 struct to retrieve signer certs from. - * certs - currently unused - * flags - flags to control function behavior. - * - * Return WOLFSSL_STACK of signers on success, NULL on error. - */ -WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs, - int flags) -{ - WOLFSSL_X509* x509 = NULL; - WOLFSSL_STACK* signers = NULL; - WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; - - if (p7 == NULL) - return NULL; - - /* Only PKCS#7 messages with a single cert that is the verifying certificate - * is supported. - */ - if (flags & PKCS7_NOINTERN) { - WOLFSSL_MSG("PKCS7_NOINTERN flag not supported"); - return NULL; - } - - signers = wolfSSL_sk_X509_new_null(); - if (signers == NULL) - return NULL; - - if (wolfSSL_d2i_X509(&x509, (const byte**)&p7->pkcs7.singleCert, - p7->pkcs7.singleCertSz) == NULL) { - wolfSSL_sk_X509_pop_free(signers, NULL); - return NULL; - } - - if (wolfSSL_sk_X509_push(signers, x509) != WOLFSSL_SUCCESS) { - wolfSSL_sk_X509_pop_free(signers, NULL); - return NULL; - } - - (void)certs; - - return signers; -} - -#ifndef NO_BIO - -PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7) -{ - WOLFSSL_PKCS7* pkcs7; - int ret; - - WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio"); - - if (bio == NULL) - return NULL; - - if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL) - return NULL; - - pkcs7->len = wolfSSL_BIO_get_len(bio); - pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7); - if (pkcs7->data == NULL) { - wolfSSL_PKCS7_free((PKCS7*)pkcs7); - return NULL; - } - - if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) { - wolfSSL_PKCS7_free((PKCS7*)pkcs7); - return NULL; - } - /* pkcs7->len may change if using b64 for example */ - pkcs7->len = ret; - - if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) - != 0) { - WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed"); - wolfSSL_PKCS7_free((PKCS7*)pkcs7); - return NULL; - } - - if (p7 != NULL) - *p7 = (PKCS7*)pkcs7; - return (PKCS7*)pkcs7; -} - -int wolfSSL_i2d_PKCS7(PKCS7 *p7, unsigned char **out) -{ - byte* output = NULL; - int localBuf = 0; - int len; - WC_RNG rng; - int ret = WOLFSSL_FAILURE; - WOLFSSL_ENTER("wolfSSL_i2d_PKCS7"); - - if (!out || !p7) { - WOLFSSL_MSG("Bad parameter"); - return WOLFSSL_FAILURE; - } - - if (!p7->rng) { - if (wc_InitRng(&rng) != 0) { - WOLFSSL_MSG("wc_InitRng error"); - return WOLFSSL_FAILURE; - } - p7->rng = &rng; /* cppcheck-suppress autoVariables - */ - } - - if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) { - WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error"); - goto cleanup; - } - - if (*out == NULL) { - output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (!output) { - WOLFSSL_MSG("malloc error"); - goto cleanup; - } - localBuf = 1; - } - else { - output = *out; - } - - if ((len = wc_PKCS7_EncodeSignedData(p7, output, len)) < 0) { - WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error"); - goto cleanup; - } - - ret = len; -cleanup: - if (p7->rng == &rng) { - wc_FreeRng(&rng); - p7->rng = NULL; - } - if (ret == WOLFSSL_FAILURE && localBuf && output) - XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (ret != WOLFSSL_FAILURE) - *out = output; - return ret; -} - -int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7) -{ - byte* output = NULL; - int len; - int ret = WOLFSSL_FAILURE; - WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio"); - - if (!bio || !p7) { - WOLFSSL_MSG("Bad parameter"); - return WOLFSSL_FAILURE; - } - - if ((len = wolfSSL_i2d_PKCS7(p7, &output)) == WOLFSSL_FAILURE) { - WOLFSSL_MSG("wolfSSL_i2d_PKCS7 error"); - goto cleanup; - } - - if (wolfSSL_BIO_write(bio, output, len) <= 0) { - WOLFSSL_MSG("wolfSSL_BIO_write error"); - goto cleanup; - } - - ret = WOLFSSL_SUCCESS; -cleanup: - if (output) - XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER); - return ret; -} - -/** - * Creates and returns a PKCS7 signedData structure. - * - * Inner content type is set to DATA to match OpenSSL behavior. - * - * signer - certificate to sign bundle with - * pkey - private key matching signer - * certs - optional additional set of certificates to include - * in - input data to be signed - * flags - optional set of flags to control sign behavior - * - * PKCS7_BINARY - Do not translate input data to MIME canonical - * format (\r\n line endings), thus preventing corruption of - * binary content. - * PKCS7_TEXT - Prepend MIME headers for text/plain to content. - * PKCS7_DETACHED - Set signature detached, omit content from output bundle. - * PKCS7_STREAM - initialize PKCS7 struct for signing, do not read data. - * - * Flags not currently supported: - * PKCS7_NOCERTS - Do not include the signer cert in the output bundle. - * PKCS7_PARTIAL - Allow for PKCS7_sign() to be only partially set up, - * then signers etc to be added separately before - * calling PKCS7_final(). - * - * Returns valid PKCS7 structure pointer, or NULL if an error occurred. - */ -PKCS7* wolfSSL_PKCS7_sign(WOLFSSL_X509* signer, WOLFSSL_EVP_PKEY* pkey, - WOLFSSL_STACK* certs, WOLFSSL_BIO* in, int flags) -{ - int err = 0; - WOLFSSL_PKCS7* p7 = NULL; - WOLFSSL_STACK* cert = certs; - - WOLFSSL_ENTER("wolfSSL_PKCS7_sign"); - - if (flags & PKCS7_NOCERTS) { - WOLFSSL_MSG("PKCS7_NOCERTS flag not yet supported"); - err = 1; - } - - if (flags & PKCS7_PARTIAL) { - WOLFSSL_MSG("PKCS7_PARTIAL flag not yet supported"); - err = 1; - } - - if ((err == 0) && (signer == NULL || signer->derCert == NULL || - signer->derCert->length == 0)) { - WOLFSSL_MSG("Bad function arg, signer is NULL or incomplete"); - err = 1; - } - - if ((err == 0) && (pkey == NULL || pkey->pkey.ptr == NULL || - pkey->pkey_sz <= 0)) { - WOLFSSL_MSG("Bad function arg, pkey is NULL or incomplete"); - err = 1; - } - - if ((err == 0) && (in == NULL) && !(flags & PKCS7_STREAM)) { - WOLFSSL_MSG("input data required unless PKCS7_STREAM used"); - err = 1; - } - - if ((err == 0) && ((p7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)) { - WOLFSSL_MSG("Error allocating new WOLFSSL_PKCS7"); - err = 1; - } - - /* load signer certificate */ - if (err == 0) { - if (wc_PKCS7_InitWithCert(&p7->pkcs7, signer->derCert->buffer, - signer->derCert->length) != 0) { - WOLFSSL_MSG("Failed to load signer certificate"); - err = 1; - } - } - - /* set signer private key, data types, defaults */ - if (err == 0) { - p7->pkcs7.privateKey = (byte*)pkey->pkey.ptr; - p7->pkcs7.privateKeySz = pkey->pkey_sz; - p7->pkcs7.contentOID = DATA; /* inner content default is DATA */ - p7->pkcs7.hashOID = SHA256h; /* default to SHA-256 hash type */ - p7->type = SIGNED_DATA; /* PKCS7_final switches on type */ - } - - /* add additional chain certs if provided */ - while (cert && (err == 0)) { - if (cert->data.x509 != NULL && cert->data.x509->derCert != NULL) { - if (wc_PKCS7_AddCertificate(&p7->pkcs7, - cert->data.x509->derCert->buffer, - cert->data.x509->derCert->length) != 0) { - WOLFSSL_MSG("Error in wc_PKCS7_AddCertificate"); - err = 1; - } - } - cert = cert->next; - } - - if ((err == 0) && (flags & PKCS7_DETACHED)) { - if (wc_PKCS7_SetDetached(&p7->pkcs7, 1) != 0) { - WOLFSSL_MSG("Failed to set signature detached"); - err = 1; - } - } - - if ((err == 0) && (flags & PKCS7_STREAM)) { - /* if streaming, return before finalizing */ - return (PKCS7*)p7; - } - - if ((err == 0) && (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1)) { - WOLFSSL_MSG("Error calling wolfSSL_PKCS7_final"); - err = 1; - } - - if ((err != 0) && (p7 != NULL)) { - wolfSSL_PKCS7_free((PKCS7*)p7); - p7 = NULL; - } - - return (PKCS7*)p7; -} - -#ifdef HAVE_SMIME - -#ifndef MAX_MIME_LINE_LEN - #define MAX_MIME_LINE_LEN 1024 -#endif - -/** - * Copy input BIO to output BIO, but convert all line endings to CRLF (\r\n), - * used by PKCS7_final(). - * - * in - input WOLFSSL_BIO to be converted - * out - output WOLFSSL_BIO to hold copy of in, with line endings adjusted - * - * Return 0 on success, negative on error - */ -static int wolfSSL_BIO_to_MIME_crlf(WOLFSSL_BIO* in, WOLFSSL_BIO* out) -{ - int ret = 0; - int lineLen = 0; - word32 canonLineLen = 0; - char* canonLine = NULL; -#ifdef WOLFSSL_SMALL_STACK - char* line = NULL; -#else - char line[MAX_MIME_LINE_LEN]; -#endif - - if (in == NULL || out == NULL) { - return BAD_FUNC_ARG; - } - -#ifdef WOLFSSL_SMALL_STACK - line = (char*)XMALLOC(MAX_MIME_LINE_LEN, in->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (line == NULL) { - return MEMORY_E; - } -#endif - XMEMSET(line, 0, MAX_MIME_LINE_LEN); - - while ((lineLen = wolfSSL_BIO_gets(in, line, (int)sizeof(line))) > 0) { - - if (line[lineLen - 1] == '\r' || line[lineLen - 1] == '\n') { - canonLineLen = (word32)lineLen; - if ((canonLine = wc_MIME_single_canonicalize( - line, &canonLineLen)) == NULL) { - ret = -1; - break; - } - - /* remove trailing null */ - if (canonLine[canonLineLen] == '\0') { - canonLineLen--; - } - - if (wolfSSL_BIO_write(out, canonLine, (int)canonLineLen) < 0) { - ret = -1; - break; - } - XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7); - canonLine = NULL; - } - else { - /* no line ending in current line, write direct to out */ - if (wolfSSL_BIO_write(out, line, lineLen) < 0) { - ret = -1; - break; - } - } - } - - if (canonLine != NULL) { - XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7); - } -#ifdef WOLFSSL_SMALL_STACK - XFREE(line, in->heap, DYNAMIC_TYPE_TMP_BUFFER); -#endif - - return ret; -} - -#endif /* HAVE_SMIME */ - -/* Used by both PKCS7_final() and PKCS7_verify() */ -static const char contTypeText[] = "Content-Type: text/plain\r\n\r\n"; - -/** - * Finalize PKCS7 structure, currently supports signedData only. - * - * Does not generate final bundle (ie: signedData), but finalizes - * the PKCS7 structure in preparation for a output function to be called next. - * - * pkcs7 - initialized PKCS7 structure, populated with signer, etc - * in - input data - * flags - flags to control PKCS7 behavior. Other flags except those noted - * below are ignored: - * - * PKCS7_BINARY - Do not translate input data to MIME canonical - * format (\r\n line endings), thus preventing corruption of - * binary content. - * PKCS7_TEXT - Prepend MIME headers for text/plain to content. - * - * Returns 1 on success, 0 on error - */ -int wolfSSL_PKCS7_final(PKCS7* pkcs7, WOLFSSL_BIO* in, int flags) -{ - int ret = 1; - int memSz = 0; - unsigned char* mem = NULL; - WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; - WOLFSSL_BIO* data = NULL; - - WOLFSSL_ENTER("wolfSSL_PKCS7_final"); - - if (p7 == NULL || in == NULL) { - WOLFSSL_MSG("Bad input args to PKCS7_final"); - ret = 0; - } - - if (ret == 1) { - if ((data = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())) == NULL) { - WOLFSSL_MSG("Error in wolfSSL_BIO_new"); - ret = 0; - } - } - - /* prepend Content-Type header if PKCS7_TEXT */ - if ((ret == 1) && (flags & PKCS7_TEXT)) { - if (wolfSSL_BIO_write(data, contTypeText, - (int)XSTR_SIZEOF(contTypeText)) < 0) { - WOLFSSL_MSG("Error prepending Content-Type header"); - ret = 0; - } - } - - /* convert line endings to CRLF if !PKCS7_BINARY */ - if (ret == 1) { - if (flags & PKCS7_BINARY) { - - /* no CRLF conversion, direct copy content */ - if ((memSz = wolfSSL_BIO_get_len(in)) <= 0) { - ret = 0; - } - if (ret == 1) { - mem = (unsigned char*)XMALLOC(memSz, in->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (mem == NULL) { - WOLFSSL_MSG("Failed to allocate memory for input data"); - ret = 0; - } - } - - if (ret == 1) { - if (wolfSSL_BIO_read(in, mem, memSz) != memSz) { - WOLFSSL_MSG("Error reading from input BIO"); - ret = 0; - } - else if (wolfSSL_BIO_write(data, mem, memSz) < 0) { - ret = 0; - } - } - - if (mem != NULL) { - XFREE(mem, in->heap, DYNAMIC_TYPE_TMP_BUFFER); - } - } - else { - #ifdef HAVE_SMIME - /* convert content line endings to CRLF */ - if (wolfSSL_BIO_to_MIME_crlf(in, data) != 0) { - WOLFSSL_MSG("Error converting line endings to CRLF"); - ret = 0; - } - else { - p7->pkcs7.contentCRLF = 1; - } - #else - WOLFSSL_MSG("Without PKCS7_BINARY requires wolfSSL to be built " - "with HAVE_SMIME"); - ret = 0; - #endif - } - } - - if ((ret == 1) && ((memSz = wolfSSL_BIO_get_mem_data(data, &mem)) < 0)) { - WOLFSSL_MSG("Error in wolfSSL_BIO_get_mem_data"); - ret = 0; - } - - if (ret == 1) { - if (p7->data != NULL) { - XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7); - } - p7->data = (byte*)XMALLOC(memSz, NULL, DYNAMIC_TYPE_PKCS7); - if (p7->data == NULL) { - ret = 0; - } - else { - XMEMCPY(p7->data, mem, memSz); - p7->len = memSz; - } - } - - if (ret == 1) { - p7->pkcs7.content = p7->data; - p7->pkcs7.contentSz = p7->len; - } - - if (data != NULL) { - wolfSSL_BIO_free(data); - } - - return ret; -} - -int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs, - WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in, WOLFSSL_BIO* out, int flags) -{ - int i, ret = 0; - unsigned char* mem = NULL; - int memSz = 0; - WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; - int contTypeLen; - WOLFSSL_X509* signer = NULL; - WOLFSSL_STACK* signers = NULL; - - WOLFSSL_ENTER("wolfSSL_PKCS7_verify"); - - if (pkcs7 == NULL) - return WOLFSSL_FAILURE; - - if (in != NULL) { - if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0) - return WOLFSSL_FAILURE; - - p7->pkcs7.content = mem; - p7->pkcs7.contentSz = memSz; - } - - /* certs is the list of certificates to find the cert with issuer/serial. */ - (void)certs; - /* store is the certificate store to use to verify signer certificate - * associated with the signers. - */ - (void)store; - - ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len); - if (ret != 0) - return WOLFSSL_FAILURE; - - if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) { - /* Verify signer certificates */ - if (store == NULL || store->cm == NULL) { - WOLFSSL_MSG("No store or store certs, but PKCS7_NOVERIFY not set"); - return WOLFSSL_FAILURE; - } - - signers = wolfSSL_PKCS7_get0_signers(pkcs7, certs, flags); - if (signers == NULL) { - WOLFSSL_MSG("No signers found to verify"); - return WOLFSSL_FAILURE; - } - for (i = 0; i < wolfSSL_sk_X509_num(signers); i++) { - signer = wolfSSL_sk_X509_value(signers, i); - - if (wolfSSL_CertManagerVerifyBuffer(store->cm, - signer->derCert->buffer, - signer->derCert->length, - WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Failed to verify signer certificate"); - wolfSSL_sk_X509_pop_free(signers, NULL); - return WOLFSSL_FAILURE; - } - } - wolfSSL_sk_X509_pop_free(signers, NULL); - } - - if (flags & PKCS7_TEXT) { - /* strip MIME header for text/plain, otherwise error */ - contTypeLen = XSTR_SIZEOF(contTypeText); - if ((p7->pkcs7.contentSz < (word32)contTypeLen) || - (XMEMCMP(p7->pkcs7.content, contTypeText, contTypeLen) != 0)) { - WOLFSSL_MSG("Error PKCS7 Content-Type not found with PKCS7_TEXT"); - return WOLFSSL_FAILURE; - } - p7->pkcs7.content += contTypeLen; - p7->pkcs7.contentSz -= contTypeLen; - } - - if (out != NULL) { - wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz); - } - - WOLFSSL_LEAVE("wolfSSL_PKCS7_verify", WOLFSSL_SUCCESS); - - return WOLFSSL_SUCCESS; -} - -/** - * This API was added as a helper function for libest. It - * encodes a stack of certificates to pkcs7 format. - * @param pkcs7 PKCS7 parameter object - * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)* - * @param out Output bio - * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure - */ -int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs, - WOLFSSL_BIO* out) -{ - int ret; - WOLFSSL_PKCS7* p7; - WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs"); - - if (!pkcs7 || !certs || !out) { - WOLFSSL_MSG("Bad parameter"); - return WOLFSSL_FAILURE; - } - - p7 = (WOLFSSL_PKCS7*)pkcs7; - - /* take ownership of certs */ - p7->certs = certs; - /* TODO: takes ownership even on failure below but not on above failure. */ - - if (pkcs7->certList) { - WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same " - "struct"); - return WOLFSSL_FAILURE; - } - - if (certs) { - /* Save some of the values */ - int hashOID = pkcs7->hashOID; - byte version = pkcs7->version; - - if (!certs->data.x509 || !certs->data.x509->derCert) { - WOLFSSL_MSG("Missing cert"); - return WOLFSSL_FAILURE; - } - - if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer, - certs->data.x509->derCert->length) != 0) { - WOLFSSL_MSG("wc_PKCS7_InitWithCert error"); - return WOLFSSL_FAILURE; - } - certs = certs->next; - - pkcs7->hashOID = hashOID; - pkcs7->version = version; - } - - /* Add the certs to the PKCS7 struct */ - while (certs) { - if (!certs->data.x509 || !certs->data.x509->derCert) { - WOLFSSL_MSG("Missing cert"); - return WOLFSSL_FAILURE; - } - if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer, - certs->data.x509->derCert->length) != 0) { - WOLFSSL_MSG("wc_PKCS7_AddCertificate error"); - return WOLFSSL_FAILURE; - } - certs = certs->next; - } - - if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) { - WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error"); - return WOLFSSL_FAILURE; - } - - ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7); - - return ret; -} - -/****************************************************************************** -* wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO -* -* RETURNS: -* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE -*/ -int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7) -{ -#ifdef WOLFSSL_SMALL_STACK - byte* outputHead; - byte* outputFoot; -#else - byte outputHead[2048]; - byte outputFoot[2048]; -#endif - word32 outputHeadSz = 2048; - word32 outputFootSz = 2048; - word32 outputSz = 0; - byte* output = NULL; - byte* pem = NULL; - int pemSz = -1; - enum wc_HashType hashType; - byte hashBuf[WC_MAX_DIGEST_SIZE]; - word32 hashSz = -1; - - WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7"); - - if (bio == NULL || p7 == NULL) - return WOLFSSL_FAILURE; - -#ifdef WOLFSSL_SMALL_STACK - outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (outputHead == NULL) - return MEMORY_E; - - outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (outputFoot == NULL) - goto error; - -#endif - - XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE); - XMEMSET(outputHead, 0, outputHeadSz); - XMEMSET(outputFoot, 0, outputFootSz); - - hashType = wc_OidGetHash(p7->hashOID); - hashSz = wc_HashGetDigestSize(hashType); - if (hashSz > WC_MAX_DIGEST_SIZE) - return WOLFSSL_FAILURE; - - /* only SIGNED_DATA is supported */ - switch (p7->contentOID) { - case SIGNED_DATA: - break; - default: - WOLFSSL_MSG("Unknown PKCS#7 Type"); - return WOLFSSL_FAILURE; - }; - - if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz, - outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0) - return WOLFSSL_FAILURE; - - outputSz = outputHeadSz + p7->contentSz + outputFootSz; - output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - - if (!output) - return WOLFSSL_FAILURE; - - XMEMSET(output, 0, outputSz); - outputSz = 0; - XMEMCPY(&output[outputSz], outputHead, outputHeadSz); - outputSz += outputHeadSz; - XMEMCPY(&output[outputSz], p7->content, p7->contentSz); - outputSz += p7->contentSz; - XMEMCPY(&output[outputSz], outputFoot, outputFootSz); - outputSz += outputFootSz; - - /* get PEM size */ - pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE); - if (pemSz < 0) - goto error; - - pemSz++; /* for '\0'*/ - - /* create PEM buffer and convert from DER to PEM*/ - if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER)) - == NULL) - goto error; - - XMEMSET(pem, 0, pemSz); - - if (wc_DerToPemEx(output, outputSz, pem, pemSz, NULL, CERT_TYPE) < 0) { - goto error; - } - if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) { - XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); -#ifdef WOLFSSL_SMALL_STACK - XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); -#endif - return WOLFSSL_SUCCESS; - } - -error: -#ifdef WOLFSSL_SMALL_STACK - if (outputHead) { - XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - } - if (outputFoot) { - XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - } -#endif - if (output) { - XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - } - if (pem) { - XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - } - return WOLFSSL_FAILURE; -} - -#ifdef HAVE_SMIME -/***************************************************************************** -* wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into -* a PKCS7 object. In case of a multipart message, stores the signed data in -* bcont. -* -* RETURNS: -* returns pointer to a PKCS7 structure on success, otherwise returns NULL -*/ -PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in, - WOLFSSL_BIO** bcont) -{ - MimeHdr* allHdrs = NULL; - MimeHdr* curHdr = NULL; - MimeParam* curParam = NULL; - int inLen = 0; - byte* bcontMem = NULL; - int bcontMemSz = 0; - int sectionLen = 0; - int ret = -1; - char* section = NULL; - char* canonLine = NULL; - char* canonSection = NULL; - PKCS7* pkcs7 = NULL; - word32 outLen = 0; - word32 canonLineLen = 0; - byte* out = NULL; - byte* outHead = NULL; - - int canonPos = 0; - int lineLen = 0; - int remainLen = 0; - byte isEnd = 0; - size_t canonSize = 0; - size_t boundLen = 0; - char* boundary = NULL; - - static const char kContType[] = "Content-Type"; - static const char kCTE[] = "Content-Transfer-Encoding"; - static const char kMultSigned[] = "multipart/signed"; - static const char kAppPkcsSign[] = "application/pkcs7-signature"; - static const char kAppXPkcsSign[] = "application/x-pkcs7-signature"; - static const char kAppPkcs7Mime[] = "application/pkcs7-mime"; - static const char kAppXPkcs7Mime[] = "application/x-pkcs7-mime"; - - WOLFSSL_ENTER("wolfSSL_SMIME_read_PKCS7"); - - if (in == NULL || bcont == NULL) { - goto error; - } - inLen = wolfSSL_BIO_get_len(in); - if (inLen <= 0) { - goto error; - } - remainLen = wolfSSL_BIO_get_len(in); - if (remainLen <= 0) { - goto error; - } - - section = (char*)XMALLOC(remainLen+1, NULL, DYNAMIC_TYPE_PKCS7); - if (section == NULL) { - goto error; - } - lineLen = wolfSSL_BIO_gets(in, section, remainLen); - if (lineLen <= 0) { - goto error; - } - while (isEnd == 0 && remainLen > 0) { - sectionLen += lineLen; - remainLen -= lineLen; - lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], remainLen); - if (lineLen <= 0) { - goto error; - } - /* Line with just newline signals end of headers. */ - if ((lineLen==2 && !XSTRNCMP(§ion[sectionLen], - "\r\n", 2)) || - (lineLen==1 && (section[sectionLen] == '\r' || - section[sectionLen] == '\n'))) { - isEnd = 1; - } - } - section[sectionLen] = '\0'; - ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs); - if (ret < 0) { - WOLFSSL_MSG("Parsing MIME headers failed."); - goto error; - } - isEnd = 0; - section[0] = '\0'; - sectionLen = 0; - - curHdr = wc_MIME_find_header_name(kContType, allHdrs); - if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned, - XSTR_SIZEOF(kMultSigned))) { - curParam = wc_MIME_find_param_attr("protocol", curHdr->params); - if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign, - XSTR_SIZEOF(kAppPkcsSign)) || - !XSTRNCMP(curParam->value, kAppXPkcsSign, - XSTR_SIZEOF(kAppXPkcsSign)))) { - curParam = wc_MIME_find_param_attr("boundary", curHdr->params); - if (curParam == NULL) { - goto error; - } - - boundLen = XSTRLEN(curParam->value) + 2; - boundary = (char*)XMALLOC(boundLen+1, NULL, DYNAMIC_TYPE_PKCS7); - if (boundary == NULL) { - goto error; - } - XMEMSET(boundary, 0, (word32)(boundLen+1)); - boundary[0] = boundary[1] = '-'; - XSTRNCPY(&boundary[2], curParam->value, boundLen-2); - - /* Parse up to first boundary, ignore everything here. */ - lineLen = wolfSSL_BIO_gets(in, section, remainLen); - if (lineLen <= 0) { - goto error; - } - while (XSTRNCMP(§ion[sectionLen], boundary, boundLen) && - remainLen > 0) { - sectionLen += lineLen; - remainLen -= lineLen; - lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], - remainLen); - if (lineLen <= 0) { - goto error; - } - } - - section[0] = '\0'; - sectionLen = 0; - canonSize = remainLen + 1; - canonSection = (char*)XMALLOC(canonSize, NULL, - DYNAMIC_TYPE_PKCS7); - if (canonSection == NULL) { - goto error; - } - - lineLen = wolfSSL_BIO_gets(in, section, remainLen); - while (XSTRNCMP(§ion[sectionLen], boundary, boundLen) && - remainLen > 0) { - canonLineLen = lineLen; - canonLine = wc_MIME_single_canonicalize(§ion[sectionLen], - &canonLineLen); - if (canonLine == NULL) { - goto error; - } - /* If line endings were added, the initial length may be - * exceeded. */ - if ((canonPos + canonLineLen) >= canonSize) { - canonSize = canonPos + canonLineLen; - canonSection = (char*)XREALLOC(canonSection, canonSize, - NULL, DYNAMIC_TYPE_PKCS7); - if (canonSection == NULL) { - goto error; - } - } - XMEMCPY(&canonSection[canonPos], canonLine, - (int)canonLineLen - 1); - canonPos += canonLineLen - 1; - XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7); - canonLine = NULL; - - sectionLen += lineLen; - remainLen -= lineLen; - - lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], - remainLen); - if (lineLen <= 0) { - goto error; - } - } - - if (canonPos > 0) { - canonPos--; - } - - /* Strip the final trailing newline. Support \r, \n or \r\n. */ - if (canonSection[canonPos] == '\n') { - if (canonPos > 0) { - canonPos--; - } - } - - if (canonSection[canonPos] == '\r') { - if (canonPos > 0) { - canonPos--; - } - } - - canonSection[canonPos+1] = '\0'; - - *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()); - ret = wolfSSL_BIO_write(*bcont, canonSection, - canonPos + 1); - if (ret != (canonPos+1)) { - goto error; - } - if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem)) - < 0) { - goto error; - } - XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7); - canonSection = NULL; - - wc_MIME_free_hdrs(allHdrs); - allHdrs = NULL; - section[0] = '\0'; - sectionLen = 0; - lineLen = wolfSSL_BIO_gets(in, section, remainLen); - if (lineLen <= 0) { - goto error; - } - while (isEnd == 0 && remainLen > 0) { - sectionLen += lineLen; - remainLen -= lineLen; - lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], - remainLen); - if (lineLen <= 0) { - goto error; - } - /* Line with just newline signals end of headers. */ - if ((lineLen==2 && !XSTRNCMP(§ion[sectionLen], - "\r\n", 2)) || - (lineLen==1 && (section[sectionLen] == '\r' || - section[sectionLen] == '\n'))) { - isEnd = 1; - } - } - section[sectionLen] = '\0'; - ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs); - if (ret < 0) { - WOLFSSL_MSG("Parsing MIME headers failed."); - goto error; - } - curHdr = wc_MIME_find_header_name(kContType, allHdrs); - if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign, - XSTR_SIZEOF(kAppPkcsSign)) && - XSTRNCMP(curHdr->body, kAppXPkcsSign, - XSTR_SIZEOF(kAppXPkcsSign)))) { - WOLFSSL_MSG("S/MIME headers not found inside " - "multipart message.\n"); - goto error; - } - - section[0] = '\0'; - sectionLen = 0; - lineLen = wolfSSL_BIO_gets(in, section, remainLen); - while (XSTRNCMP(§ion[sectionLen], boundary, boundLen) && - remainLen > 0) { - sectionLen += lineLen; - remainLen -= lineLen; - lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], - remainLen); - if (lineLen <= 0) { - goto error; - } - } - - XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7); - boundary = NULL; - } - } - else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime, - XSTR_SIZEOF(kAppPkcs7Mime)) || - !XSTRNCMP(curHdr->body, kAppXPkcs7Mime, - XSTR_SIZEOF(kAppXPkcs7Mime)))) { - sectionLen = wolfSSL_BIO_get_len(in); - if (sectionLen <= 0) { - goto error; - } - ret = wolfSSL_BIO_read(in, section, sectionLen); - if (ret < 0 || ret != sectionLen) { - WOLFSSL_MSG("Error reading input BIO."); - goto error; - } - } - else { - WOLFSSL_MSG("S/MIME headers not found."); - goto error; - } - - curHdr = wc_MIME_find_header_name(kCTE, allHdrs); - if (curHdr == NULL) { - WOLFSSL_MSG("Content-Transfer-Encoding header not found, " - "assuming base64 encoding."); - } - else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) { - WOLFSSL_MSG("S/MIME encodings other than base64 are not " - "currently supported.\n"); - goto error; - } - - if (section == NULL || sectionLen <= 0) { - goto error; - } - outLen = ((sectionLen*3+3)/4)+1; - out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7); - outHead = out; - if (outHead == NULL) { - goto error; - } - /* Strip trailing newlines. */ - while ((sectionLen > 0) && - (section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n')) { - sectionLen--; - } - section[sectionLen] = '\0'; - ret = Base64_Decode((const byte*)section, sectionLen, out, &outLen); - if (ret < 0) { - WOLFSSL_MSG("Error base64 decoding S/MIME message."); - goto error; - } - pkcs7 = wolfSSL_d2i_PKCS7_ex(NULL, (const unsigned char**)&out, outLen, - bcontMem, bcontMemSz); - - wc_MIME_free_hdrs(allHdrs); - XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7); - XFREE(section, NULL, DYNAMIC_TYPE_PKCS7); - - return pkcs7; - -error: - wc_MIME_free_hdrs(allHdrs); - XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7); - XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7); - XFREE(section, NULL, DYNAMIC_TYPE_PKCS7); - if (canonSection != NULL) - XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7); - if (bcont) { - wolfSSL_BIO_free(*bcont); - *bcont = NULL; /* reset 'bcount' pointer to NULL on failure */ - } - - return NULL; -} - -/* Convert hash algo OID (from Hash_Sum in asn.h) to SMIME string equivalent. - * Returns hash algorithm string or "unknown" if not found */ -static const char* wolfSSL_SMIME_HashOIDToString(int hashOID) -{ - switch (hashOID) { - case MD5h: - return "md5"; - case SHAh: - return "sha1"; - case SHA224h: - return "sha-224"; - case SHA256h: - return "sha-256"; - case SHA384h: - return "sha-384"; - case SHA512h: - return "sha-512"; - case SHA3_224h: - return "sha3-224"; - case SHA3_384h: - return "sha3-384"; - case SHA3_512h: - return "sha3-512"; - default: - break; - } - - return "unknown"; -} - -/* Convert PKCS#7 type (from PKCS7_TYPES in pkcs7.h) to SMIME string. - * RFC2633 only defines signed-data, enveloped-data, certs-only. - * Returns string on success, NULL on unknown type. */ -static const char* wolfSSL_SMIME_PKCS7TypeToString(int type) -{ - switch (type) { - case SIGNED_DATA: - return "signed-data"; - case ENVELOPED_DATA: - return "enveloped-data"; - default: - break; - } - - return NULL; -} - -/** - * Convert PKCS7 structure to SMIME format, adding necessary headers. - * - * Handles generation of PKCS7 bundle (ie: signedData). PKCS7 structure - * should be set up beforehand with PKCS7_sign/final/etc. Output is always - * Base64 encoded. - * - * out - output BIO for SMIME formatted data to be placed - * pkcs7 - input PKCS7 structure, initialized and set up - * in - input content to be encoded into PKCS7 - * flags - flags to control behavior of PKCS7 generation - * - * Returns 1 on success, 0 or negative on failure - */ -int wolfSSL_SMIME_write_PKCS7(WOLFSSL_BIO* out, PKCS7* pkcs7, WOLFSSL_BIO* in, - int flags) -{ - int i; - int ret = 1; - WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; - byte* p7out = NULL; - int len = 0; - - char boundary[33]; /* 32 chars + \0 */ - byte* sigBase64 = NULL; - word32 sigBase64Len = 0; - const char* p7TypeString = NULL; - - static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - if (out == NULL || p7 == NULL) { - WOLFSSL_MSG("Bad function arguments"); - return 0; - } - - if (in != NULL && (p7->pkcs7.content == NULL || p7->pkcs7.contentSz == 0 || - p7->pkcs7.contentCRLF == 0)) { - /* store and adjust content line endings for CRLF if needed */ - if (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1) { - ret = 0; - } - } - - if (ret > 0) { - /* Generate signedData bundle, DER in output (dynamic) */ - if ((len = wolfSSL_i2d_PKCS7((PKCS7*)p7, &p7out)) == WOLFSSL_FAILURE) { - WOLFSSL_MSG("Error in wolfSSL_i2d_PKCS7"); - ret = 0; - } - } - - /* Base64 encode signedData bundle */ - if (ret > 0) { - if (Base64_Encode(p7out, len, NULL, &sigBase64Len) != LENGTH_ONLY_E) { - ret = 0; - } - else { - sigBase64 = (byte*)XMALLOC(sigBase64Len, NULL, - DYNAMIC_TYPE_TMP_BUFFER); - if (sigBase64 == NULL) { - ret = 0; - } - } - } - - if (ret > 0) { - XMEMSET(sigBase64, 0, sigBase64Len); - if (Base64_Encode(p7out, len, sigBase64, &sigBase64Len) < 0) { - WOLFSSL_MSG("Error in Base64_Encode of signature"); - ret = 0; - } - } - - /* build up SMIME message */ - if (ret > 0) { - if (flags & PKCS7_DETACHED) { - - /* generate random boundary */ - if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("No RNG to use"); - ret = 0; - } - - /* no need to generate random byte for null terminator (size-1) */ - if ((ret > 0) && (wc_RNG_GenerateBlock(&globalRNG, (byte*)boundary, - sizeof(boundary) - 1 ) != 0)) { - WOLFSSL_MSG("Error in wc_RNG_GenerateBlock"); - ret = 0; - } - - if (ret > 0) { - for (i = 0; i < (int)sizeof(boundary) - 1; i++) { - boundary[i] = - alphanum[boundary[i] % XSTR_SIZEOF(alphanum)]; - } - boundary[sizeof(boundary)-1] = 0; - } - - if (ret > 0) { - /* S/MIME header beginning */ - ret = wolfSSL_BIO_printf(out, - "MIME-Version: 1.0\n" - "Content-Type: multipart/signed; " - "protocol=\"application/x-pkcs7-signature\"; " - "micalg=\"%s\"; " - "boundary=\"----%s\"\n\n" - "This is an S/MIME signed message\n\n" - "------%s\n", - wolfSSL_SMIME_HashOIDToString(p7->pkcs7.hashOID), - boundary, boundary); - } - - if (ret > 0) { - /* S/MIME content */ - ret = wolfSSL_BIO_write(out, - p7->pkcs7.content, p7->pkcs7.contentSz); - } - - if (ret > 0) { - /* S/SMIME header end boundary */ - ret = wolfSSL_BIO_printf(out, - "\n------%s\n", boundary); - } - - if (ret > 0) { - /* Signature and header */ - ret = wolfSSL_BIO_printf(out, - "Content-Type: application/x-pkcs7-signature; " - "name=\"smime.p7s\"\n" - "Content-Transfer-Encoding: base64\n" - "Content-Disposition: attachment; " - "filename=\"smime.p7s\"\n\n" - "%.*s\n" /* Base64 encoded signature */ - "------%s--\n\n", - sigBase64Len, sigBase64, - boundary); - } - } - else { - p7TypeString = wolfSSL_SMIME_PKCS7TypeToString(p7->type); - if (p7TypeString == NULL) { - WOLFSSL_MSG("Unsupported PKCS7 SMIME type"); - ret = 0; - } - - if (ret > 0) { - /* not detached */ - ret = wolfSSL_BIO_printf(out, - "MIME-Version: 1.0\n" - "Content-Disposition: attachment; " - "filename=\"smime.p7m\"\n" - "Content-Type: application/x-pkcs7-mime; " - "smime-type=%s; name=\"smime.p7m\"\n" - "Content-Transfer-Encoding: base64\n\n" - "%.*s\n" /* signature */, - p7TypeString, sigBase64Len, sigBase64); - } - } - } - - if (p7out != NULL) { - XFREE(p7out, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - if (sigBase64 != NULL) { - XFREE(sigBase64, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - - if (ret > 0) { - return WOLFSSL_SUCCESS; - } - - return WOLFSSL_FAILURE; -} - -#endif /* HAVE_SMIME */ -#endif /* !NO_BIO */ -#endif /* OPENSSL_ALL */ - -#endif /* HAVE_PKCS7 */ -/******************************************************************************* - * END OF PKCS7 APIs - ******************************************************************************/ - -/******************************************************************************* - * START OF PKCS12 APIs - ******************************************************************************/ -#ifdef OPENSSL_EXTRA - -/* no-op function. Was initially used for adding encryption algorithms available - * for PKCS12 */ -void wolfSSL_PKCS12_PBE_add(void) -{ - WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add"); -} - -#if !defined(NO_FILESYSTEM) -WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp, - WOLFSSL_X509_PKCS12 **pkcs12) -{ - WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp"); - return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12, - PKCS12_TYPE); -} -#endif /* !NO_FILESYSTEM */ - -#endif /* OPENSSL_EXTRA */ - -#if defined(HAVE_PKCS12) - -#ifdef OPENSSL_EXTRA - -#if !defined(NO_ASN) && !defined(NO_PWDBASED) - -#ifndef NO_BIO -WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12) -{ - WC_PKCS12* localPkcs12 = NULL; - unsigned char* mem = NULL; - long memSz; - int ret = -1; - - WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio"); - - if (bio == NULL) { - WOLFSSL_MSG("Bad Function Argument bio is NULL"); - return NULL; - } - - memSz = wolfSSL_BIO_get_len(bio); - if (memSz <= 0) { - return NULL; - } - mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (mem == NULL) { - return NULL; - } - - if (mem != NULL) { - localPkcs12 = wc_PKCS12_new(); - if (localPkcs12 == NULL) { - WOLFSSL_MSG("Memory error"); - } - } - - if (mem != NULL && localPkcs12 != NULL) { - if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) { - ret = wc_d2i_PKCS12(mem, (word32)memSz, localPkcs12); - if (ret < 0) { - WOLFSSL_MSG("Failed to get PKCS12 sequence"); - } - } - else { - WOLFSSL_MSG("Failed to get data from bio struct"); - } - } - - /* cleanup */ - if (mem != NULL) - XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (ret < 0 && localPkcs12 != NULL) { - wc_PKCS12_free(localPkcs12); - localPkcs12 = NULL; - } - if (pkcs12 != NULL) - *pkcs12 = localPkcs12; - - return localPkcs12; -} - -/* Converts the PKCS12 to DER format and outputs it into bio. - * - * bio is the structure to hold output DER - * pkcs12 structure to create DER from - * - * return 1 for success or 0 if an error occurs - */ -int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12) -{ - int ret = WOLFSSL_FAILURE; - - WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio"); - - if ((bio != NULL) && (pkcs12 != NULL)) { - word32 certSz = 0; - byte *certDer = NULL; - - certSz = wc_i2d_PKCS12(pkcs12, &certDer, NULL); - if ((certSz > 0) && (certDer != NULL)) { - if (wolfSSL_BIO_write(bio, certDer, certSz) == (int)certSz) { - ret = WOLFSSL_SUCCESS; - } - } - - if (certDer != NULL) { - XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS); - } - } - - return ret; -} -#endif /* !NO_BIO */ - -/* Creates a new WC_PKCS12 structure - * - * pass password to use - * name friendlyName to use - * pkey private key to go into PKCS12 bundle - * cert certificate to go into PKCS12 bundle - * ca extra certificates that can be added to bundle. Can be NULL - * keyNID type of encryption to use on the key (-1 means no encryption) - * certNID type of encryption to use on the certificate - * itt number of iterations with encryption - * macItt number of iterations with mac creation - * keyType flag for signature and/or encryption key - * - * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail - */ -WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name, WOLFSSL_EVP_PKEY* pkey, - WOLFSSL_X509* cert, WOLF_STACK_OF(WOLFSSL_X509)* ca, int keyNID, - int certNID, int itt, int macItt, int keyType) -{ - WC_PKCS12* pkcs12; - WC_DerCertList* list = NULL; - word32 passSz; - byte* keyDer = NULL; - word32 keyDerSz; - byte* certDer; - int certDerSz; - - WOLFSSL_ENTER("wolfSSL_PKCS12_create"); - - if (pass == NULL || pkey == NULL || cert == NULL) { - WOLFSSL_LEAVE("wolfSSL_PKCS12_create", BAD_FUNC_ARG); - return NULL; - } - passSz = (word32)XSTRLEN(pass); - - keyDer = (byte*)pkey->pkey.ptr; - keyDerSz = pkey->pkey_sz; - - certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz); - if (certDer == NULL) { - return NULL; - } - - if (ca != NULL) { - unsigned long numCerts = ca->num; - WOLFSSL_STACK* sk = ca; - - while (numCerts > 0 && sk != NULL) { - byte* curDer; - WC_DerCertList* cur; - int curDerSz = 0; - - cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL, - DYNAMIC_TYPE_PKCS); - if (cur == NULL) { - wc_FreeCertList(list, NULL); - return NULL; - } - - curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz); - if (curDer == NULL || curDerSz < 0) { - XFREE(cur, NULL, DYNAMIC_TYPE_PKCS); - wc_FreeCertList(list, NULL); - return NULL; - } - - cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS); - if (cur->buffer == NULL) { - XFREE(cur, NULL, DYNAMIC_TYPE_PKCS); - wc_FreeCertList(list, NULL); - return NULL; - } - XMEMCPY(cur->buffer, curDer, curDerSz); - cur->bufferSz = curDerSz; - cur->next = list; - list = cur; - - sk = sk->next; - numCerts--; - } - } - - pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz, - certDer, certDerSz, list, keyNID, certNID, itt, macItt, - keyType, NULL); - - if (ca != NULL) { - wc_FreeCertList(list, NULL); - } - - return pkcs12; -} - - -/* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */ -int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw, - WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert, - WOLF_STACK_OF(WOLFSSL_X509)** ca) -{ - void* heap = NULL; - int ret; - byte* certData = NULL; - word32 certDataSz; - byte* pk = NULL; - word32 pkSz; - WC_DerCertList* certList = NULL; -#ifdef WOLFSSL_SMALL_STACK - DecodedCert *DeCert; -#else - DecodedCert DeCert[1]; -#endif - - WOLFSSL_ENTER("wolfSSL_PKCS12_parse"); - - /* make sure we init return args */ - if (pkey) *pkey = NULL; - if (cert) *cert = NULL; - if (ca) *ca = NULL; - - if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) { - WOLFSSL_MSG("Bad argument value"); - return WOLFSSL_FAILURE; - } - - heap = wc_PKCS12_GetHeap(pkcs12); - - if (ca == NULL) { - ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz, - NULL); - } - else { - ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz, - &certList); - } - if (ret < 0) { - WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret); - return WOLFSSL_FAILURE; - } - -#ifdef WOLFSSL_SMALL_STACK - DeCert = (DecodedCert *)XMALLOC(sizeof(*DeCert), heap, - DYNAMIC_TYPE_DCERT); - if (DeCert == NULL) { - WOLFSSL_MSG("out of memory"); - return WOLFSSL_FAILURE; - } -#endif - - /* Decode cert and place in X509 stack struct */ - if (certList != NULL) { - WC_DerCertList* current = certList; - - *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC( - sizeof(WOLF_STACK_OF(WOLFSSL_X509)), heap, DYNAMIC_TYPE_X509); - if (*ca == NULL) { - if (pk != NULL) { - XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); - } - if (certData != NULL) { - XFREE(certData, heap, DYNAMIC_TYPE_PKCS); - } - /* Free up WC_DerCertList and move on */ - while (current != NULL) { - WC_DerCertList* next = current->next; - - XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS); - XFREE(current, heap, DYNAMIC_TYPE_PKCS); - current = next; - } - ret = WOLFSSL_FAILURE; - goto out; - } - XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509))); - - /* add list of DER certs as X509's to stack */ - while (current != NULL) { - WC_DerCertList* toFree = current; - WOLFSSL_X509* x509; - - x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap, - DYNAMIC_TYPE_X509); - InitX509(x509, 1, heap); - InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap); - if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) { - WOLFSSL_MSG("Issue with parsing certificate"); - FreeDecodedCert(DeCert); - wolfSSL_X509_free(x509); - } - else { - if (CopyDecodedToX509(x509, DeCert) != 0) { - WOLFSSL_MSG("Failed to copy decoded cert"); - FreeDecodedCert(DeCert); - wolfSSL_X509_free(x509); - wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; - if (pk != NULL) { - XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); - } - if (certData != NULL) { - XFREE(certData, heap, DYNAMIC_TYPE_PKCS); - } - /* Free up WC_DerCertList */ - while (current != NULL) { - WC_DerCertList* next = current->next; - - XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS); - XFREE(current, heap, DYNAMIC_TYPE_PKCS); - current = next; - } - ret = WOLFSSL_FAILURE; - goto out; - } - FreeDecodedCert(DeCert); - - if (wolfSSL_sk_X509_push(*ca, x509) != 1) { - WOLFSSL_MSG("Failed to push x509 onto stack"); - wolfSSL_X509_free(x509); - wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; - if (pk != NULL) { - XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); - } - if (certData != NULL) { - XFREE(certData, heap, DYNAMIC_TYPE_PKCS); - } - - /* Free up WC_DerCertList */ - while (current != NULL) { - WC_DerCertList* next = current->next; - - XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS); - XFREE(current, heap, DYNAMIC_TYPE_PKCS); - current = next; - } - ret = WOLFSSL_FAILURE; - goto out; - } - } - current = current->next; - XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS); - XFREE(toFree, heap, DYNAMIC_TYPE_PKCS); - } - } - - - /* Decode cert and place in X509 struct */ - if (certData != NULL) { - *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap, - DYNAMIC_TYPE_X509); - if (*cert == NULL) { - if (pk != NULL) { - XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); - } - if (ca != NULL) { - wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; - } - XFREE(certData, heap, DYNAMIC_TYPE_PKCS); - ret = WOLFSSL_FAILURE; - goto out; - } - InitX509(*cert, 1, heap); - InitDecodedCert(DeCert, certData, certDataSz, heap); - if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) != 0) { - WOLFSSL_MSG("Issue with parsing certificate"); - } - if (CopyDecodedToX509(*cert, DeCert) != 0) { - WOLFSSL_MSG("Failed to copy decoded cert"); - FreeDecodedCert(DeCert); - if (pk != NULL) { - XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); - } - if (ca != NULL) { - wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; - } - wolfSSL_X509_free(*cert); *cert = NULL; - XFREE(certData, heap, DYNAMIC_TYPE_PKCS); - ret = WOLFSSL_FAILURE; - goto out; - } - FreeDecodedCert(DeCert); - XFREE(certData, heap, DYNAMIC_TYPE_PKCS); - } - - - /* get key type */ - ret = BAD_STATE_E; - if (pk != NULL) { /* decode key if present */ - *pkey = wolfSSL_EVP_PKEY_new_ex(heap); - if (*pkey == NULL) { - wolfSSL_X509_free(*cert); *cert = NULL; - if (ca != NULL) { - wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; - } - XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); - ret = WOLFSSL_FAILURE; - goto out; - } - - #ifndef NO_RSA - { - const unsigned char* pt = pk; - if (wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, pkey, &pt, pkSz) != - NULL) { - ret = 0; - } - } - #endif /* NO_RSA */ - - #ifdef HAVE_ECC - if (ret != 0) { /* if is in fail state check if ECC key */ - const unsigned char* pt = pk; - if (wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, pkey, &pt, pkSz) != - NULL) { - ret = 0; - } - } - #endif /* HAVE_ECC */ - if (pk != NULL) - XFREE(pk, heap, DYNAMIC_TYPE_PKCS); - if (ret != 0) { /* if is in fail state and no PKEY then fail */ - wolfSSL_X509_free(*cert); *cert = NULL; - if (ca != NULL) { - wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; - } - wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL; - WOLFSSL_MSG("Bad PKCS12 key format"); - ret = WOLFSSL_FAILURE; - goto out; - } - - if (pkey != NULL && *pkey != NULL) { - (*pkey)->save_type = 0; - } - } - - (void)ret; - (void)ca; - - ret = WOLFSSL_SUCCESS; - -out: - -#ifdef WOLFSSL_SMALL_STACK - XFREE(DeCert, heap, DYNAMIC_TYPE_DCERT); -#endif - - return ret; -} - -int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw, - int pswLen) -{ - WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac"); - - if (!pkcs12) { - return WOLFSSL_FAILURE; - } - - return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, pswLen) == 0 ? - WOLFSSL_SUCCESS : WOLFSSL_FAILURE; -} - -#endif /* !NO_ASN && !NO_PWDBASED */ - -#endif /* OPENSSL_EXTRA */ - -#endif /* HAVE_PKCS12 */ -/******************************************************************************* - * END OF PKCS12 APIs - ******************************************************************************/ +#define WOLFSSL_SSL_P7P12_INCLUDED +#include #endif /* !NO_CERTS */ @@ -38706,7 +24630,7 @@ if (ctx != NULL) { XMEMSET(ctx, 0, sizeof(WOLFSSL_DRBG_CTX)); ctx->type = type; - ctx->xflags = flags; + ctx->xflags = (int)flags; ctx->status = DRBG_STATUS_UNINITIALISED; ret = WOLFSSL_SUCCESS; } @@ -38878,252 +24802,3 @@ #endif /* !WOLFCRYPT_ONLY */ -/******************************************************************************* - * START OF CRYPTO-ONLY APIs - ******************************************************************************/ - -#if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \ - defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \ - defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \ - defined(WOLFSSL_HAPROXY) - -#ifndef NO_SHA - /* One shot SHA1 hash of message. - * - * d message to hash - * n size of d buffer - * md buffer to hold digest. Should be SHA_DIGEST_SIZE. - * - * Note: if md is null then a static buffer of SHA_DIGEST_SIZE is used. - * When the static buffer is used this function is not thread safe. - * - * Returns a pointer to the message digest on success and NULL on failure. - */ - unsigned char *wolfSSL_SHA1(const unsigned char *d, size_t n, - unsigned char *md) - { - static byte dig[WC_SHA_DIGEST_SIZE]; - byte* ret = md; - wc_Sha sha; - - WOLFSSL_ENTER("wolfSSL_SHA1"); - - if (wc_InitSha_ex(&sha, NULL, INVALID_DEVID) != 0) { - WOLFSSL_MSG("SHA1 Init failed"); - return NULL; - } - - if (wc_ShaUpdate(&sha, (const byte*)d, (word32)n) != 0) { - WOLFSSL_MSG("SHA1 Update failed"); - return NULL; - } - - if (md == NULL) { - WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT " - "THREAD SAFE WHEN md == NULL"); - ret = dig; - } - if (wc_ShaFinal(&sha, ret) != 0) { - WOLFSSL_MSG("SHA1 Final failed"); - wc_ShaFree(&sha); - return NULL; - } - wc_ShaFree(&sha); - - return ret; - } -#endif /* ! NO_SHA */ - -#ifdef WOLFSSL_SHA224 - /* One shot SHA224 hash of message. - * - * d message to hash - * n size of d buffer - * md buffer to hold digest. Should be WC_SHA224_DIGEST_SIZE. - * - * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used. - * When the static buffer is used this function is not thread safe. - * - * Returns a pointer to the message digest on success and NULL on failure. - */ - unsigned char *wolfSSL_SHA224(const unsigned char *d, size_t n, - unsigned char *md) - { - static byte dig[WC_SHA224_DIGEST_SIZE]; - byte* ret = md; - wc_Sha256 sha; - - WOLFSSL_ENTER("wolfSSL_SHA224"); - - if (wc_InitSha224_ex(&sha, NULL, INVALID_DEVID) != 0) { - WOLFSSL_MSG("SHA224 Init failed"); - return NULL; - } - - if (wc_Sha224Update(&sha, (const byte*)d, (word32)n) != 0) { - WOLFSSL_MSG("SHA224 Update failed"); - return NULL; - } - - if (md == NULL) { - WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA224 IS NOT " - "THREAD SAFE WHEN md == NULL"); - ret = dig; - } - if (wc_Sha224Final(&sha, ret) != 0) { - WOLFSSL_MSG("SHA224 Final failed"); - wc_Sha224Free(&sha); - return NULL; - } - wc_Sha224Free(&sha); - - return ret; - } -#endif - -#ifndef NO_SHA256 - /* One shot SHA256 hash of message. - * - * d message to hash - * n size of d buffer - * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE. - * - * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used. - * When the static buffer is used this function is not thread safe. - * - * Returns a pointer to the message digest on success and NULL on failure. - */ - unsigned char *wolfSSL_SHA256(const unsigned char *d, size_t n, - unsigned char *md) - { - static byte dig[WC_SHA256_DIGEST_SIZE]; - byte* ret = md; - wc_Sha256 sha; - - WOLFSSL_ENTER("wolfSSL_SHA256"); - - if (wc_InitSha256_ex(&sha, NULL, INVALID_DEVID) != 0) { - WOLFSSL_MSG("SHA256 Init failed"); - return NULL; - } - - if (wc_Sha256Update(&sha, (const byte*)d, (word32)n) != 0) { - WOLFSSL_MSG("SHA256 Update failed"); - return NULL; - } - - if (md == NULL) { - WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT " - "THREAD SAFE WHEN md == NULL"); - ret = dig; - } - if (wc_Sha256Final(&sha, ret) != 0) { - WOLFSSL_MSG("SHA256 Final failed"); - wc_Sha256Free(&sha); - return NULL; - } - wc_Sha256Free(&sha); - - return ret; - } -#endif /* ! NO_SHA256 */ - -#ifdef WOLFSSL_SHA384 - /* One shot SHA384 hash of message. - * - * d message to hash - * n size of d buffer - * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE. - * - * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used. - * When the static buffer is used this function is not thread safe. - * - * Returns a pointer to the message digest on success and NULL on failure. - */ - unsigned char *wolfSSL_SHA384(const unsigned char *d, size_t n, - unsigned char *md) - { - static byte dig[WC_SHA384_DIGEST_SIZE]; - byte* ret = md; - wc_Sha384 sha; - - WOLFSSL_ENTER("wolfSSL_SHA384"); - - if (wc_InitSha384_ex(&sha, NULL, INVALID_DEVID) != 0) { - WOLFSSL_MSG("SHA384 Init failed"); - return NULL; - } - - if (wc_Sha384Update(&sha, (const byte*)d, (word32)n) != 0) { - WOLFSSL_MSG("SHA384 Update failed"); - return NULL; - } - - if (md == NULL) { - WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT " - "THREAD SAFE WHEN md == NULL"); - ret = dig; - } - if (wc_Sha384Final(&sha, ret) != 0) { - WOLFSSL_MSG("SHA384 Final failed"); - wc_Sha384Free(&sha); - return NULL; - } - wc_Sha384Free(&sha); - - return ret; - } -#endif /* WOLFSSL_SHA384 */ - -#if defined(WOLFSSL_SHA512) - /* One shot SHA512 hash of message. - * - * d message to hash - * n size of d buffer - * md buffer to hold digest. Should be WC_SHA256_DIGEST_SIZE. - * - * Note: if md is null then a static buffer of WC_SHA256_DIGEST_SIZE is used. - * When the static buffer is used this function is not thread safe. - * - * Returns a pointer to the message digest on success and NULL on failure. - */ - unsigned char *wolfSSL_SHA512(const unsigned char *d, size_t n, - unsigned char *md) - { - static byte dig[WC_SHA512_DIGEST_SIZE]; - byte* ret = md; - wc_Sha512 sha; - - WOLFSSL_ENTER("wolfSSL_SHA512"); - - if (wc_InitSha512_ex(&sha, NULL, INVALID_DEVID) != 0) { - WOLFSSL_MSG("SHA512 Init failed"); - return NULL; - } - - if (wc_Sha512Update(&sha, (const byte*)d, (word32)n) != 0) { - WOLFSSL_MSG("SHA512 Update failed"); - return NULL; - } - - if (md == NULL) { - WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT " - "THREAD SAFE WHEN md == NULL"); - ret = dig; - } - if (wc_Sha512Final(&sha, ret) != 0) { - WOLFSSL_MSG("SHA512 Final failed"); - wc_Sha512Free(&sha); - return NULL; - } - wc_Sha512Free(&sha); - - return ret; - } -#endif /* WOLFSSL_SHA512 */ -#endif /* OPENSSL_EXTRA || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE || - * HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */ - -/******************************************************************************* - * END OF CRYPTO-ONLY APIs - ******************************************************************************/ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_asn1.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_asn1.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_asn1.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_asn1.c 2024-08-03 07:30:00.000000000 +0000 @@ -247,6 +247,11 @@ len = 0; } + if (len < 0) { + len = 0; /* wolfSSL_i2d_ASN1_INTEGER can return a value less than 0 + * on error */ + } + return len; } @@ -974,7 +979,8 @@ nLen = 1; for (i = 0; i < len; i++) { /* Check if character is a hexadecimal character. */ - if (Base16_Decode((const byte*)str + i, 1, &num, &nLen) == ASN_INPUT_E) + if (Base16_Decode((const byte*)str + i, 1, &num, &nLen) == + WC_NO_ERR_TRACE(ASN_INPUT_E)) { /* Found end of hexadecimal characters, return count. */ len = i; @@ -1139,7 +1145,7 @@ * @param [in] len Length of number in bytes. * @param [in, out] neg Indicates number is negative. * @param [out] pad Number of padding bytes required. - * @param [out] padVal Padding byte to preprend. + * @param [out] padVal Padding byte to prepend. */ static void wolfssl_asn1_integer_pad(unsigned char* data, int len, unsigned char* neg, char* pad, unsigned char* padVal) @@ -1606,6 +1612,9 @@ dupl->grp = obj->grp; dupl->nid = obj->nid; dupl->objSz = obj->objSz; + #ifdef OPENSSL_EXTRA + dupl->ca = obj->ca; + #endif /* Check for encoding. */ if (obj->obj) { /* Allocate memory for ASN.1 OBJECT_ID DER encoding. */ @@ -1630,7 +1639,7 @@ #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ #endif /* !NO_ASN */ -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /** * Parse DER encoding and return header information. @@ -1859,6 +1868,10 @@ return ret; } +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ + +#ifdef OPENSSL_EXTRA + /* Write at most buf_len bytes of textual representation of ASN.1 OBJECT_ID. * * @param [in, out] buf Buffer to write to. @@ -2312,7 +2325,7 @@ * Assumes length is greater than 0. * * @param [in] s ASN.1 STRING object. - * @return Buffer cotaining string representation on success. + * @return Buffer containing string representation on success. * @return NULL when dynamic memory allocation fails. * @return NULL when encoding a character as hex fails. */ @@ -2990,7 +3003,7 @@ { WOLFSSL_ENTER("wolfSSL_ASN1_GENERALIZEDTIME_free"); if (asn1Time != NULL) { - XMEMSET(asn1Time->data, 0, sizeof(asn1Time->data)); + XFREE(asn1Time, NULL, DYNAMIC_TYPE_OPENSSL); } } @@ -3227,7 +3240,7 @@ /* Calculate difference in time of two ASN.1 TIME objects. * * @param [out] days Number of whole days between from and to. - * @param [out] secs Number of serconds less than a day between from and to. + * @param [out] secs Number of seconds less than a day between from and to. * @param [in] from ASN.1 TIME object as start time. * @param [in] to ASN.1 TIME object as end time. * @return 1 on success. @@ -3502,14 +3515,17 @@ if (ret != NULL) { /* Set the ASN.1 type and length of string. */ ret->type = V_ASN1_GENERALIZEDTIME; - ret->length = ASN_GENERALIZED_TIME_SIZE; if (t->type == V_ASN1_GENERALIZEDTIME) { + ret->length = ASN_GENERALIZED_TIME_SIZE; + /* Just copy as data already appropriately formatted. */ XMEMCPY(ret->data, t->data, ASN_GENERALIZED_TIME_SIZE); } else { /* Convert UTC TIME to GENERALIZED TIME. */ + ret->length = t->length + 2; /* Add two extra year digits */ + if (t->data[0] >= '5') { /* >= 50 is 1900s. */ ret->data[0] = '1'; ret->data[1] = '9'; @@ -3519,7 +3535,7 @@ ret->data[0] = '2'; ret->data[1] = '0'; } /* Append rest of the data as it is the same. */ - XMEMCPY(&ret->data[2], t->data, ASN_UTC_TIME_SIZE); + XMEMCPY(&ret->data[2], t->data, t->length); } /* Check for pointer to return result through. */ @@ -3531,6 +3547,32 @@ return ret; } +WOLFSSL_ASN1_TIME* wolfSSL_ASN1_UTCTIME_set(WOLFSSL_ASN1_TIME *s, time_t t) +{ + WOLFSSL_ASN1_TIME* ret = s; + + WOLFSSL_ENTER("wolfSSL_ASN1_UTCTIME_set"); + + if (ret == NULL) { + ret = wolfSSL_ASN1_TIME_new(); + if (ret == NULL) + return NULL; + } + + ret->length = GetFormattedTime(&t, ret->data, sizeof(ret->data)); + if (ret->length + 1 != ASN_UTC_TIME_SIZE) { + /* Either snprintf error or t can't be represented in UTC format */ + if (ret != s) + wolfSSL_ASN1_TIME_free(ret); + ret = NULL; + } + else { + ret->type = V_ASN1_UTCTIME; + } + + return ret; +} + #endif /* OPENSSL_EXTRA */ #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(OPENSSL_EXTRA) @@ -3918,7 +3960,7 @@ * ASN1_TYPE APIs ******************************************************************************/ -#ifdef OPENSSL_EXTRA +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /** * Allocate a new ASN.1 TYPE object. @@ -3954,12 +3996,12 @@ wolfSSL_ASN1_OBJECT_free(at->value.object); break; case V_ASN1_UTCTIME: - #ifndef NO_ASN_TIME + #if !defined(NO_ASN_TIME) && defined(OPENSSL_EXTRA) wolfSSL_ASN1_TIME_free(at->value.utctime); #endif break; case V_ASN1_GENERALIZEDTIME: - #ifndef NO_ASN_TIME + #if !defined(NO_ASN_TIME) && defined(OPENSSL_EXTRA) wolfSSL_ASN1_TIME_free(at->value.generalizedtime); #endif break; @@ -3991,9 +4033,10 @@ XFREE(at, NULL, DYNAMIC_TYPE_OPENSSL); } -#endif /* OPENSSL_EXTRA */ +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ -#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS) +#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS) || \ + defined(WOLFSSL_WPAS_SMALL) /** * Set ASN.1 TYPE object with a type and value. * diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_bn.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_bn.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_bn.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_bn.c 2024-08-03 07:30:00.000000000 +0000 @@ -25,7 +25,7 @@ #include - #include +#include #ifndef WC_NO_RNG #include #endif @@ -1689,23 +1689,31 @@ const WOLFSSL_BIGNUM* a, const WOLFSSL_BIGNUM* d, WOLFSSL_BN_CTX* ctx) { int ret = 1; + WOLFSSL_BIGNUM* res = dv; /* BN context not needed. */ (void)ctx; WOLFSSL_ENTER("wolfSSL_BN_div"); + if (BN_IS_NULL(res)) { + res = wolfSSL_BN_new(); + } + /* Validate parameters. */ - if (BN_IS_NULL(dv) || BN_IS_NULL(rem) || BN_IS_NULL(a) || BN_IS_NULL(d)) { + if (BN_IS_NULL(res) || BN_IS_NULL(rem) || BN_IS_NULL(a) || BN_IS_NULL(d)) { ret = 0; } /* Have wolfCrypt perform operation with internal representations. */ if ((ret == 1) && (mp_div((mp_int*)a->internal, (mp_int*)d->internal, - (mp_int*)dv->internal, (mp_int*)rem->internal) != MP_OKAY)) { + (mp_int*)res->internal, (mp_int*)rem->internal) != MP_OKAY)) { ret = 0; } + if (res != dv) + wolfSSL_BN_free(res); + WOLFSSL_LEAVE("wolfSSL_BN_div", ret); return ret; } @@ -2295,7 +2303,8 @@ * Print APIs ******************************************************************************/ -#if !defined(NO_FILESYSTEM) && defined(XFPRINTF) +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) && \ + defined(XFPRINTF) /* Print big number to file pointer. * * Return code compliant with OpenSSL. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_certman.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_certman.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_certman.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_certman.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2425 @@ +/* ssl_certman.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#include + +#if !defined(WOLFSSL_SSL_CERTMAN_INCLUDED) + #ifndef WOLFSSL_IGNORE_FILE_WARN + #warning ssl_certman.c does not need to be compiled separately from ssl.c + #endif +#else + +#ifndef NO_CERTS + +/* Pick an available TLS method. + * + * Used when creating temporary WOLFSSL_CTX. + * + * @return A TLS method on success. + * @return NULL when no TLS method built into wolfSSL. + */ +static WC_INLINE WOLFSSL_METHOD* cm_pick_method(void* heap) +{ + #ifndef NO_WOLFSSL_CLIENT + #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3) + return wolfSSLv3_client_method_ex(heap); + #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10) + return wolfTLSv1_client_method_ex(heap); + #elif !defined(NO_OLD_TLS) + return wolfTLSv1_1_client_method_ex(heap); + #elif !defined(WOLFSSL_NO_TLS12) + return wolfTLSv1_2_client_method_ex(heap); + #elif defined(WOLFSSL_TLS13) + return wolfTLSv1_3_client_method_ex(heap); + #else + return NULL; + #endif + #elif !defined(NO_WOLFSSL_SERVER) + #if !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_SSLV3) + return wolfSSLv3_server_method_ex(heap); + #elif !defined(NO_OLD_TLS) && defined(WOLFSSL_ALLOW_TLSV10) + return wolfTLSv1_server_method_ex(heap); + #elif !defined(NO_OLD_TLS) + return wolfTLSv1_1_server_method_ex(heap); + #elif !defined(WOLFSSL_NO_TLS12) + return wolfTLSv1_2_server_method_ex(heap); + #elif defined(WOLFSSL_TLS13) + return wolfTLSv1_3_server_method_ex(heap); + #else + return NULL; + #endif + #else + return NULL; + #endif +} + +/* Create a new certificate manager with a heap hint. + * + * @param [in] heap Heap hint. + * @return Certificate manager object on success. + * @return NULL on failure. + */ +WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew_ex(void* heap) +{ + int err = 0; + WOLFSSL_CERT_MANAGER* cm; + + WOLFSSL_ENTER("wolfSSL_CertManagerNew"); + if (heap == NULL) { + WOLFSSL_MSG("heap param is null"); + } + else { + /* Some systems may have heap in unexpected segments. (IRAM vs DRAM) */ + WOLFSSL_MSG_EX("heap param = %p", heap); + } + WOLFSSL_MSG_EX("DYNAMIC_TYPE_CERT_MANAGER Allocating = %d bytes", + (word32)sizeof(WOLFSSL_CERT_MANAGER)); + + /* Allocate memory for certificate manager. */ + cm = (WOLFSSL_CERT_MANAGER*)XMALLOC(sizeof(WOLFSSL_CERT_MANAGER), heap, + DYNAMIC_TYPE_CERT_MANAGER); + if (cm == NULL) { + WOLFSSL_MSG_EX("XMALLOC failed to allocate WOLFSSL_CERT_MANAGER %d " + "bytes.", (int)sizeof(WOLFSSL_CERT_MANAGER)); + err = 1; + } + if (!err) { + /* Reset all fields. */ + XMEMSET(cm, 0, sizeof(WOLFSSL_CERT_MANAGER)); + + /* Create a mutex for use when modify table of stored CAs. */ + if (wc_InitMutex(&cm->caLock) != 0) { + WOLFSSL_MSG("Bad mutex init"); + err = 1; + } + } + if (!err) { + /* Initialize reference count. */ + wolfSSL_RefInit(&cm->ref, &err); + #ifdef WOLFSSL_REFCNT_ERROR_RETURN + if (err != 0) { + WOLFSSL_MSG("Bad reference count init"); + } + #endif + } +#ifdef WOLFSSL_TRUST_PEER_CERT + /* Create a mutex for use when modify table of trusted peers. */ + if ((!err) && (wc_InitMutex(&cm->tpLock) != 0)) { + WOLFSSL_MSG("Bad mutex init"); + err = 1; + } +#endif + if (!err) { + /* Set default minimum key sizes allowed. */ + #ifndef NO_RSA + cm->minRsaKeySz = MIN_RSAKEY_SZ; + #endif + #ifdef HAVE_ECC + cm->minEccKeySz = MIN_ECCKEY_SZ; + #endif + #ifdef HAVE_FALCON + cm->minFalconKeySz = MIN_FALCONKEY_SZ; + #endif /* HAVE_FALCON */ + #ifdef HAVE_DILITHIUM + cm->minDilithiumKeySz = MIN_DILITHIUMKEY_SZ; + #endif /* HAVE_DILITHIUM */ + + /* Set heap hint to use in certificate manager operations. */ + cm->heap = heap; + } + + /* Dispose of certificate manager on error. */ + if (err && (cm != NULL)) { + wolfSSL_CertManagerFree(cm); + cm = NULL; + } + return cm; +} + +/* Create a new certificate manager. + * + * @return Certificate manager object on success. + * @return NULL on failure. + */ +WOLFSSL_CERT_MANAGER* wolfSSL_CertManagerNew(void) +{ + /* No heap hint. */ + return wolfSSL_CertManagerNew_ex(NULL); +} + +/* Dispose of certificate manager. + * + * @param [in, out] cm Certificate manager. + */ +void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm) +{ + WOLFSSL_ENTER("wolfSSL_CertManagerFree"); + + /* Validate parameter. */ + if (cm != NULL) { + int doFree = 0; + int ret; + + /* Decrement reference count and check if value is 0. */ + wolfSSL_RefDec(&cm->ref, &doFree, &ret); + #ifdef WOLFSSL_REFCNT_ERROR_RETURN + if (ret != 0) { + WOLFSSL_MSG("Couldn't lock cm mutex"); + } + #else + (void)ret; + #endif + if (doFree) { + #ifdef HAVE_CRL + /* Dispose of CRL handler. */ + if (cm->crl != NULL) { + /* Dispose of CRL object - indicating dynamically allocated. */ + FreeCRL(cm->crl, 1); + } + #endif + + #ifdef HAVE_OCSP + /* Dispose of OCSP handler. */ + if (cm->ocsp != NULL) { + FreeOCSP(cm->ocsp, 1); + } + /* Dispose of URL. */ + XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL); + #if !defined(NO_WOLFSSL_SERVER) && \ + (defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ + defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2)) + /* Dispose of OCSP stapling handler. */ + if (cm->ocsp_stapling) { + FreeOCSP(cm->ocsp_stapling, 1); + } + #endif + #endif /* HAVE_OCSP */ + + /* Dispose of CA table and mutex. */ + FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap); + wc_FreeMutex(&cm->caLock); + + #ifdef WOLFSSL_TRUST_PEER_CERT + /* Dispose of trusted peer table and mutex. */ + FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap); + wc_FreeMutex(&cm->tpLock); + #endif + + /* Dispose of reference count. */ + wolfSSL_RefFree(&cm->ref); + /* Dispose of certificate manager memory. */ + XFREE(cm, cm->heap, DYNAMIC_TYPE_CERT_MANAGER); + } + } +} + +/* Increase reference count on certificate manager. + * + * @param [in, out] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return 0 when cm is NULL or locking mutex fails. + */ +int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + /* Validate parameter. */ + if (cm == NULL) { + ret = 0; + } + if (ret == WOLFSSL_SUCCESS) { + int err; + + /* Increment reference. */ + wolfSSL_RefInc(&cm->ref, &err); + #ifdef WOLFSSL_REFCNT_ERROR_RETURN + if (err) { + WOLFSSL_MSG("Failed to lock cm mutex"); + ret = 0; + } + #else + (void)err; + #endif + } + + return ret; +} + +#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) +#if defined(WOLFSSL_SIGNER_DER_CERT) +static WC_INLINE int wolfssl_cm_get_certs_der(WOLFSSL_CERT_MANAGER* cm, + DerBuffer*** buffers, int* cnt) +{ + int err = 0; + Signer* signers = NULL; + DerBuffer** certBuffers = NULL; + int i = 0; + word32 row = 0; + int numCerts = 0; + + /* Iterate once to get the number of certs, for memory allocation + * purposes. */ + for (row = 0; row < CA_TABLE_SIZE; row++) { + /* Get signer information of CAs in a row. */ + signers = cm->caTable[row]; + /* Count each signer in row that has a DER certificate buffer. */ + while ((signers != NULL) && (signers->derCert != NULL) && + (signers->derCert->buffer != NULL)) { + ++numCerts; + signers = signers->next; + } + } + /* Check we found certificates. */ + if (numCerts == 0) { + err = 1; + } + + if (!err) { + /* Allocate memory for pointers to each DER buffer. */ + certBuffers = (DerBuffer**)XMALLOC( + sizeof(DerBuffer*) * (size_t)numCerts, cm->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (certBuffers == NULL) { + err = 1; + } + } + if (!err) { + /* Reset pointers. */ + XMEMSET(certBuffers, 0, sizeof(DerBuffer*) * (size_t)numCerts); + } + + /* Copy the certs locally so that we can release the caLock. If the lock + * is held when wolfSSL_d2i_X509 is called, GetCA will also try to get + * the lock, leading to deadlock. */ + for (row = 0; (!err) && (row < CA_TABLE_SIZE); row++) { + /* Get signer information of CAs in a row. */ + signers = cm->caTable[row]; + /* Copy each DER certificate buffer of signers in a row. */ + while ((signers != NULL) && (signers->derCert != NULL) && + (signers->derCert->buffer != NULL)) { + /* Allocate memory to hold DER certificate buffer. */ + int ret = AllocDer(&certBuffers[i], signers->derCert->length, + CA_TYPE, cm->heap); + if (ret < 0) { + err = 1; + break; + } + + /* Copy buffer into array element. */ + XMEMCPY(certBuffers[i]->buffer, signers->derCert->buffer, + signers->derCert->length); + certBuffers[i]->length = signers->derCert->length; + + /* Store in next index. */ + ++i; + /* Move on to next signer in row. */ + signers = signers->next; + } + } + + *buffers = certBuffers; + *cnt = numCerts; + return err; +} + +/* Retrieve stack of X509 certificates in a certificate manager (CM). + * + * @param [in] cm Certificate manager. + * + * @return Stack of X509 certs on success + * @return NULL on failure. + */ +WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm) +{ + WOLFSSL_STACK* sk = NULL; + int numCerts = 0; + DerBuffer** certBuffers = NULL; + int i = 0; + int err = 0; + + WOLFSSL_ENTER("wolfSSL_CertManagerGetCerts"); + + /* Validate parameter. */ + if (cm == NULL) { + err = 1; + } + if (!err) { + /* Create an empty certificate stack to return. */ + sk = wolfSSL_sk_X509_new_null(); + if (sk == NULL) { + err = 1; + } + } + /* Lock CA table. */ + if ((!err) && (wc_LockMutex(&cm->caLock) != 0)) { + err = 1; + } + if (!err) { + err = wolfssl_cm_get_certs_der(cm, &certBuffers, &numCerts); + /* Release CA lock. */ + wc_UnLockMutex(&cm->caLock); + } + + /* Put each DER certificate buffer into a stack of WOLFSSL_X509 */ + for (i = 0; (!err) && (i < numCerts); ++i) { + const byte* derBuffer = NULL; + WOLFSSL_X509* x509 = NULL; + + /* Get pointer to DER encoding of certificate. */ + derBuffer = certBuffers[i]->buffer; + /* Decode certificate. */ + wolfSSL_d2i_X509(&x509, &derBuffer, (int)certBuffers[i]->length); + if (x509 == NULL) { + err = 1; + } + + /* Decode certificate. */ + if ((!err) && (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS)) { + wolfSSL_X509_free(x509); + err = 1; + } + } + + if (certBuffers != NULL) { + /* Dispose of temporary cert storage (for access outside of lock). */ + for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) { + FreeDer(&certBuffers[i]); + } + XFREE(certBuffers, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + + /* Dispose of stack of certificates on error. */ + if (err && (sk != NULL)) { + wolfSSL_sk_X509_pop_free(sk, NULL); + sk = NULL; + } + return sk; +} + +#endif /* WOLFSSL_SIGNER_DER_CERT */ +#endif /* OPENSSL_EXTRA && !NO_FILESYSTEM */ + +/* Unload the CA signer table. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + * @return BAD_MUTEX_E when locking fails. + */ +int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerUnloadCAs"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + /* Lock CA table. */ + if ((ret == WOLFSSL_SUCCESS) && (wc_LockMutex(&cm->caLock) != 0)) { + ret = BAD_MUTEX_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Dispose of CA table. */ + FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap); + + /* Unlock CA table. */ + wc_UnLockMutex(&cm->caLock); + } + + return ret; +} + +int wolfSSL_CertManagerUnloadIntermediateCerts(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerUnloadIntermediateCerts"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + /* Lock CA table. */ + if ((ret == WOLFSSL_SUCCESS) && (wc_LockMutex(&cm->caLock) != 0)) { + ret = BAD_MUTEX_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Dispose of CA table. */ + FreeSignerTableType(cm->caTable, CA_TABLE_SIZE, WOLFSSL_CHAIN_CA, + cm->heap); + + /* Unlock CA table. */ + wc_UnLockMutex(&cm->caLock); + } + + return ret; +} + +#ifdef WOLFSSL_TRUST_PEER_CERT +/* Unload the trusted peers table. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + * @return BAD_MUTEX_E when locking fails. + */ +int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerUnload_trust_peers"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + /* Lock trusted peers table. */ + if ((ret == WOLFSSL_SUCCESS) && (wc_LockMutex(&cm->tpLock) != 0)) { + ret = BAD_MUTEX_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Dispose of trusted peers table. */ + FreeTrustedPeerTable(cm->tpTable, TP_TABLE_SIZE, cm->heap); + + /* Unlock trusted peers table. */ + wc_UnLockMutex(&cm->tpLock); + } + + return ret; +} +#endif /* WOLFSSL_TRUST_PEER_CERT */ + +/* Load certificate/s from buffer with flags. + * + * @param [in] cm Certificate manager. + * @param [in] buff Buffer holding encoding of certificate. + * @param [in] sz Length in bytes of data in buffer. + * @param [in] format Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @param [in] userChain Indicates buffer holds chain of certificates. + * @param [in] flags Flags to modify behaviour of loading. Valid flags: + * WOLFSSL_LOAD_FLAG_IGNORE_ERR, + * WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY, + * WOLFSSL_LOAD_FLAG_PEM_CA_ONLY, + * WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR, and + * WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE. + * @return WOLFSSL_SUCCESS on success. + * @return WOLFSSL_FATAL_ERROR when cm is NULL or failed create WOLFSSL_CTX. + * @return Other values on loading failure. + */ +int wolfSSL_CertManagerLoadCABuffer_ex(WOLFSSL_CERT_MANAGER* cm, + const unsigned char* buff, long sz, int format, int userChain, word32 flags) +{ + int ret = WOLFSSL_SUCCESS; + WOLFSSL_CTX* tmp = NULL; + + WOLFSSL_ENTER("wolfSSL_CertManagerLoadCABuffer_ex"); + + /* Validate parameters. */ + if (cm == NULL) { + WOLFSSL_MSG("No CertManager error"); + ret = WOLFSSL_FATAL_ERROR; + } + /* Allocate a temporary WOLFSSL_CTX to load with. */ + if ((ret == WOLFSSL_SUCCESS) && ((tmp = + wolfSSL_CTX_new_ex(cm_pick_method(cm->heap), cm->heap)) == NULL)) { + WOLFSSL_MSG("CTX new failed"); + ret = WOLFSSL_FATAL_ERROR; + } + if (ret == WOLFSSL_SUCCESS) { + /* Some configurations like OPENSSL_COMPATIBLE_DEFAULTS may turn off + * verification by default. Let's restore our desired defaults. */ + wolfSSL_CTX_set_verify(tmp, WOLFSSL_VERIFY_DEFAULT, NULL); + + /* Replace certificate manager with one to load certificate/s into. */ + wolfSSL_CertManagerFree(tmp->cm); + tmp->cm = cm; + + /* Load certificate buffer. */ + ret = wolfSSL_CTX_load_verify_buffer_ex(tmp, buff, sz, format, + userChain, flags); + + /* Clear certificate manager in WOLFSSL_CTX so it won't be freed. */ + tmp->cm = NULL; + } + + /* Dispose of temporary WOLFSSL_CTX. */ + wolfSSL_CTX_free(tmp); + return ret; +} + +/* Load certificate/s from buffer into table. + * + * Uses default load verification flags and is not a user chain. + * + * @param [in] cm Certificate manager. + * @param [in] buff Buffer holding encoding of certificate. + * @param [in] sz Length in bytes of data in buffer. + * @param [in] format Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @return WOLFSSL_SUCCESS on success. + * @return WOLFSSL_FATAL_ERROR when cm is NULL or failed create WOLFSSL_CTX. + * @return Other values on loading failure. + */ +int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm, + const unsigned char* buff, long sz, int format) +{ + return wolfSSL_CertManagerLoadCABuffer_ex(cm, buff, sz, format, 0, + WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); +} + +#ifndef NO_WOLFSSL_CM_VERIFY +/* Set the verification callback into certificate manager. + * + * @param [in] cm Certificate manager. + * @param [in] vc Verification callback. + */ +void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, VerifyCallback vc) +{ + WOLFSSL_ENTER("wolfSSL_CertManagerSetVerify"); + if (cm != NULL) { + cm->verifyCallback = vc; + } +} +#endif /* NO_WOLFSSL_CM_VERIFY */ + +#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ + && defined(HAVE_OID_DECODING) +void wolfSSL_CertManagerSetUnknownExtCallback(WOLFSSL_CERT_MANAGER* cm, + wc_UnknownExtCallback cb) +{ + WOLFSSL_ENTER("wolfSSL_CertManagerSetUnknownExtCallback"); + if (cm != NULL) { + cm->unknownExtCallback = cb; + } + +} +#endif /* WOLFSSL_CUSTOM_OID && WOLFSSL_ASN_TEMPLATE && HAVE_OID_DECODING */ + +#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) +/* Verify the certificate. + * + * Uses the verification callback if available. + * + * @param [in] cm Certificate manager. + * @param [in] buff Buffer holding encoded certificate. + * @param [in] sz Size in bytes of data in buffer. + * @param [in] format Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @param [in] prev_err Previous error. Passed to callback. + * @return WOLFSSL_SUCCESS on success. + * @return MEMORY_E when dynamic memory allocation fails. + * @return NOT_COMPILED_IN when converting from PEM to DER is not a feature of + * the wolfSSL build. + */ +int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const unsigned char* buff, + long sz, int format, int prev_err) +{ + int ret = 0; + int fatal = 0; + DerBuffer* der = NULL; +#ifdef WOLFSSL_SMALL_STACK + DecodedCert* cert = NULL; +#else + DecodedCert cert[1]; +#endif + + WOLFSSL_ENTER("CM_VerifyBuffer_ex"); + + (void)prev_err; + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for decoded certificate. */ + cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, + DYNAMIC_TYPE_DCERT); + if (cert == NULL) { + ret = MEMORY_E; + fatal = 1; + } + if (ret == 0) +#endif + { + /* Reset fields of decoded certificate. */ + XMEMSET(cert, 0, sizeof(DecodedCert)); + + if (format == WOLFSSL_FILETYPE_PEM) { + #ifndef WOLFSSL_PEM_TO_DER + ret = NOT_COMPILED_IN; + fatal = 1; + #else + /* Convert to DER from PEM. */ + ret = PemToDer(buff, sz, CERT_TYPE, &der, cm->heap, NULL, NULL); + if (ret != 0) { + fatal = 1; + } + else { + /* Replace buffer pointer and size with DER buffer. */ + buff = der->buffer; + sz = (long)der->length; + } + #endif + } + } + if (ret == 0) { + /* Create a decoded certificate with DER buffer. */ + InitDecodedCert(cert, buff, (word32)sz, cm->heap); + +#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ + && defined(HAVE_OID_DECODING) + if (cm->unknownExtCallback != NULL) + wc_SetUnknownExtCallback(cert, cm->unknownExtCallback); +#endif + + /* Parse DER into decoded certificate fields and verify signature + * against a known CA. */ + ret = ParseCertRelative(cert, CERT_TYPE, VERIFY, cm, NULL); + } + +#ifdef HAVE_CRL + if ((ret == 0) && cm->crlEnabled) { + /* Check for a CRL for the CA and check validity of certificate. */ + ret = CheckCertCRL(cm->crl, cert); + } +#endif + + (void)fatal; + +#ifndef NO_WOLFSSL_CM_VERIFY + /* Use callback to perform verification too if available. */ + if ((!fatal) && cm->verifyCallback) { + #ifdef WOLFSSL_SMALL_STACK + ProcPeerCertArgs* args; + #else + ProcPeerCertArgs args[1]; + #endif + buffer certBuf; + + #ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for object to hold arguments for callback. */ + args = (ProcPeerCertArgs*)XMALLOC(sizeof(ProcPeerCertArgs), cm->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (args == NULL) { + ret = MEMORY_E; + fatal = 1; + } + if (!fatal) + #endif + { + XMEMSET(args, 0, sizeof(ProcPeerCertArgs)); + + /* DER encoding. */ + certBuf.buffer = (byte*)buff; + certBuf.length = (unsigned int)sz; + + /* One certificate available. */ + args->totalCerts = 1; + args->certs = &certBuf; + args->dCert = cert; + args->dCertInit = 1; + + /* Replace value in ret with an error value passed in. */ + if (prev_err != 0) { + ret = prev_err; + } + /* Use callback to verify certificate. */ + ret = DoVerifyCallback(cm, NULL, ret, args); + } + #ifdef WOLFSSL_SMALL_STACK + /* Dispose of allocated callback args. */ + XFREE(args, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } +#endif + + /* Dispose of allocated memory. */ + FreeDecodedCert(cert); + FreeDer(&der); +#ifdef WOLFSSL_SMALL_STACK + XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT); +#endif + + /* Convert the ret value to a return value. */ + return (ret == 0) ? WOLFSSL_SUCCESS : ret; +} + +/* Verify the certificate. + * + * Uses the verification callback if available. + * + * @param [in] cm Certificate manager. + * @param [in] buff Buffer holding encoded certificate. + * @param [in] sz Size in bytes of data in buffer. + * @param [in] format Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @param [in] prev_err Previous error. Passed to callback. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or buff is NULL or sz is negative or zero. + * @return WOLFSSL_BAD_FILETYPE when format is invalid. + * @return MEMORY_E when dynamic memory allocation fails. + * @return NOT_COMPILED_IN when converting from PEM to DER is not a feature of + * the wolfSSL build. + */ +int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, + const unsigned char* buff, long sz, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CertManagerVerifyBuffer"); + + /* Validate parameters. */ + if ((cm == NULL) || (buff == NULL) || (sz <= 0)) { + ret = BAD_FUNC_ARG; + } + else if ((format != WOLFSSL_FILETYPE_ASN1) && + (format != WOLFSSL_FILETYPE_PEM)) { + ret = WOLFSSL_BAD_FILETYPE; + } + else { + /* No previous error. */ + ret = CM_VerifyBuffer_ex(cm, buff, sz, format, 0); + } + + return ret; +} +#endif /* !NO_WOLFSSL_CLIENT || !WOLFSSL_NO_CLIENT_AUTH */ + +#ifndef NO_FILESYSTEM + +#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) +/* Verify the certificate loaded from a file. + * + * Uses the verification callback if available. + * + * @param [in] cm Certificate manager. + * @param [in] format Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @param [in] prev_err Previous error. Passed to callback. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or buff is NULL or sz is negative. + * @return WOLFSSL_BAD_FILETYPE when format is invalid. + * @return WOLFSSL_BAD_FILE when reading the certificate file fails. + * @return MEMORY_E when dynamic memory allocation fails. + * @return NOT_COMPILED_IN when converting from PEM to DER is not a feature of + * the wolfSSL build. + */ +int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* fname, + int format) +{ + int ret = WOLFSSL_SUCCESS; +#ifndef WOLFSSL_SMALL_STACK + byte staticBuffer[FILE_BUFFER_SIZE]; +#endif + byte* buff = NULL; + long sz = 0; + XFILE file = XBADFILE; + + WOLFSSL_ENTER("wolfSSL_CertManagerVerify"); + +#ifndef WOLFSSL_SMALL_STACK + buff = staticBuffer; +#endif + + /* Validate parameters. cm and format validated in: + * wolfSSL_CertManagerVerifyBuffer */ + if ((cm == NULL) || (fname == NULL)) { + ret = BAD_FUNC_ARG; + } + + /* Open the file containing a certificate. */ + if ((ret == WOLFSSL_SUCCESS) && + ((file = XFOPEN(fname, "rb")) == XBADFILE)) { + ret = WOLFSSL_BAD_FILE; + } + /* Get the length of the file. */ + if (ret == WOLFSSL_SUCCESS) { + ret = wolfssl_file_len(file, &sz); + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + } + } + /* Allocate dynamic memory for file contents if no static buffer or too + * small. */ +#ifndef WOLFSSL_SMALL_STACK + if ((ret == WOLFSSL_SUCCESS) && (sz > (long)sizeof(staticBuffer))) +#else + + if (ret == WOLFSSL_SUCCESS) +#endif + { + WOLFSSL_MSG("Getting dynamic buffer"); + buff = (byte*)XMALLOC((size_t)sz, cm->heap, DYNAMIC_TYPE_FILE); + if (buff == NULL) { + ret = WOLFSSL_BAD_FILE; + } + } + /* Read all the file into buffer. */ + if ((ret == WOLFSSL_SUCCESS) && (XFREAD(buff, 1, (size_t)sz, file) != + (size_t)sz)) { + ret = WOLFSSL_BAD_FILE; + } + /* Close file if opened. */ + if (file != XBADFILE) { + XFCLOSE(file); + } + if (ret == WOLFSSL_SUCCESS) { + /* Verify the certificate read. */ + ret = wolfSSL_CertManagerVerifyBuffer(cm, buff, sz, format); + } + + /* Dispose of buffer if it was allocated. */ +#ifndef WOLFSSL_SMALL_STACK + if (buff != staticBuffer) +#endif + { + if (cm != NULL) { + XFREE(buff, cm->heap, DYNAMIC_TYPE_FILE); + } + } + return ret; +} +#endif + +/* Load the CA file and/or certificate files in a path. + * + * @param [in] cm Certificate manager. + * @param [in] file Name of CA file. + * @param [in] path Path to a directory containing certificates. + * @return WOLFSSL_SUCCESS on success. + * @return WOLFSSL_FATAL_ERROR when cm is NULL or unable to create WOLFSSL_CTX. + * @return Otherwise failure. + */ +int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* file, + const char* path) +{ + int ret = WOLFSSL_SUCCESS; + WOLFSSL_CTX* tmp = NULL; + + WOLFSSL_ENTER("wolfSSL_CertManagerLoadCA"); + + /* Validate parameters. file and path validated in: + * wolfSSL_CTX_load_verify_locations*/ + if (cm == NULL) { + WOLFSSL_MSG("No CertManager error"); + ret = WOLFSSL_FATAL_ERROR; + } + /* Create temporary WOLFSSL_CTX. */ + if ((ret == WOLFSSL_SUCCESS) && ((tmp = + wolfSSL_CTX_new_ex(cm_pick_method(cm->heap), cm->heap)) == NULL)) { + WOLFSSL_MSG("CTX new failed"); + ret = WOLFSSL_FATAL_ERROR; + } + if (ret == WOLFSSL_SUCCESS) { + /* Some configurations like OPENSSL_COMPATIBLE_DEFAULTS may turn off + * verification by default. Let's restore our desired defaults. */ + wolfSSL_CTX_set_verify(tmp, WOLFSSL_VERIFY_DEFAULT, NULL); + + /* Replace certificate manager with one to load certificate/s into. */ + wolfSSL_CertManagerFree(tmp->cm); + tmp->cm = cm; + + /* Load certificate from file and path. */ + ret = wolfSSL_CTX_load_verify_locations(tmp, file, path); + + /* Clear certificate manager in WOLFSSL_CTX so it won't be freed. */ + tmp->cm = NULL; + } + + /* Dispose of temporary WOLFSSL_CTX. */ + wolfSSL_CTX_free(tmp); + return ret; +} + +#endif /* NO_FILESYSTEM */ + +#if defined(PERSIST_CERT_CACHE) + +/* Version of layout of cache of CA certificates. */ +#define WOLFSSL_CACHE_CERT_VERSION 1 + +/* CA certificates cache information. */ +typedef struct { + /* Cache certificate layout version id. */ + int version; + /* Number of hash table rows. Maximum of CA_TABLE_SIZE. */ + int rows; + /* Number of columns per row. */ + int columns[CA_TABLE_SIZE]; + /* Size of Signer object. */ + int signerSz; +} CertCacheHeader; + +/* current cert persistence layout is: + + 1) CertCacheHeader + 2) caTable + + update WOLFSSL_CERT_CACHE_VERSION if change layout for the following + PERSIST_CERT_CACHE functions +*/ + + +/* Return number of bytes of memory needed to persist this signer. + * + * Assumes we have locked CA table. + * + * @param [in] Signer Signer entry in CA table. + * @return Number of bytes. + */ +static WC_INLINE int cm_get_signer_memory(Signer* signer) +{ + int sz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) + + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash); + +#if !defined(NO_SKID) + sz += (int)sizeof(signer->subjectKeyIdHash); +#endif + + /* Add dynamic bytes needed. */ + sz += (int)signer->pubKeySize; + sz += signer->nameLen; + + return sz; +} + + +/* Return number of bytes of memory needed to persist this row. + * + * Assumes we have locked CA table. + * + * @param [in] row A row of signers from the CA table. + * @return Number of bytes. + */ +static WC_INLINE int cm_get_cert_cache_row_memory(Signer* row) +{ + int sz = 0; + + /* Each signer in row. */ + while (row != NULL) { + /* Add in size of this signer. */ + sz += cm_get_signer_memory(row); + row = row->next; + } + + return sz; +} + + +/* Return the number of bytes of memory to persist cert cache. + * + * Assumes we have locked CA table. + * + * @param [in] cm Certificate manager. + * @return Number of bytes. + */ +static WC_INLINE int cm_get_cert_cache_mem_size(WOLFSSL_CERT_MANAGER* cm) +{ + int sz; + int i; + + sz = sizeof(CertCacheHeader); + + /* Each row in table. */ + for (i = 0; i < CA_TABLE_SIZE; i++) { + /* Add in size of this row. */ + sz += cm_get_cert_cache_row_memory(cm->caTable[i]); + } + + return sz; +} + + +/* Get count of columns for each row. + * + * Assumes we have locked CA table. + * + * @param [in] cm Certificate manager. + * @param [in] columns Array of row counts. + */ +static WC_INLINE void cm_set_cert_header_Columns(WOLFSSL_CERT_MANAGER* cm, + int* columns) +{ + int i; + Signer* row; + + /* Each row in table. */ + for (i = 0; i < CA_TABLE_SIZE; i++) { + int count = 0; + + /* Get row from table. */ + row = cm->caTable[i]; + /* Each entry in row. */ + while (row != NULL) { + /* Update count. */ + ++count; + row = row->next; + } + /* Store row count. */ + columns[i] = count; + } +} + + +/* Restore whole cert row from memory, + * + * Assumes we have locked CA table. + * + * @param [in] cm Certificate manager. + * @param [in] current Buffer containing rows. + * @param [in] row Row number being restored. + * @param [in] listSz Number of entries in row. + * @param [in] end End of data in buffer. + * @return Number of bytes consumed on success. + * @return PARSE_ERROR when listSz is less than zero. + * @return BUFFER_E when buffer is too small. + * @return MEMORY_E when dynamic memory allocation fails. + * @return Negative value on error. + */ +static WC_INLINE int cm_restore_cert_row(WOLFSSL_CERT_MANAGER* cm, + byte* current, int row, int listSz, const byte* end) +{ + int ret = 0; + int idx = 0; + + /* Validate parameters. */ + if (listSz < 0) { + WOLFSSL_MSG("Row header corrupted, negative value"); + ret = PARSE_ERROR; + } + + /* Process all entries. */ + while ((ret == 0) && (listSz > 0)) { + Signer* signer = NULL; + byte* publicKey; + byte* start = current + idx; /* for end checks on this signer */ + int minSz = sizeof(signer->pubKeySize) + sizeof(signer->keyOID) + + sizeof(signer->nameLen) + sizeof(signer->subjectNameHash); + #ifndef NO_SKID + minSz += (int)sizeof(signer->subjectKeyIdHash); + #endif + + /* Check minimal size of bytes available. */ + if (start + minSz > end) { + WOLFSSL_MSG("Would overread restore buffer"); + ret = BUFFER_E; + } + /* Make a new signer. */ + if ((ret == 0) && ((signer = MakeSigner(cm->heap)) == NULL)) { + ret = MEMORY_E; + } + + if (ret == 0) { + /* Copy in public key size. */ + XMEMCPY(&signer->pubKeySize, current + idx, + sizeof(signer->pubKeySize)); + idx += (int)sizeof(signer->pubKeySize); + + /* Copy in public key OID. */ + XMEMCPY(&signer->keyOID, current + idx, sizeof(signer->keyOID)); + idx += (int)sizeof(signer->keyOID); + + /* Check bytes available for public key. */ + if (start + minSz + signer->pubKeySize > end) { + WOLFSSL_MSG("Would overread restore buffer"); + ret = BUFFER_E; + } + } + if (ret == 0) { + /* Allocate memory for public key to be stored in. */ + publicKey = (byte*)XMALLOC(signer->pubKeySize, cm->heap, + DYNAMIC_TYPE_KEY); + if (publicKey == NULL) { + ret = MEMORY_E; + } + } + + if (ret == 0) { + /* Copy in public key. */ + XMEMCPY(publicKey, current + idx, signer->pubKeySize); + signer->publicKey = publicKey; + idx += (int)signer->pubKeySize; + + /* Copy in certificate name length. */ + XMEMCPY(&signer->nameLen, current + idx, sizeof(signer->nameLen)); + idx += (int)sizeof(signer->nameLen); + + /* Check bytes available for certificate name. */ + if (start + minSz + signer->pubKeySize + signer->nameLen > end) { + WOLFSSL_MSG("Would overread restore buffer"); + ret = BUFFER_E; + } + } + if (ret == 0) { + /* Allocate memory for public key to be stored in. */ + signer->name = (char*)XMALLOC((size_t)signer->nameLen, cm->heap, + DYNAMIC_TYPE_SUBJECT_CN); + if (signer->name == NULL) { + ret = MEMORY_E; + } + } + + if (ret == 0) { + /* Copy in certificate name. */ + XMEMCPY(signer->name, current + idx, (size_t)signer->nameLen); + idx += signer->nameLen; + + /* Copy in hash of subject name. */ + XMEMCPY(signer->subjectNameHash, current + idx, SIGNER_DIGEST_SIZE); + idx += SIGNER_DIGEST_SIZE; + + #ifndef NO_SKID + /* Copy in hash of subject key. */ + XMEMCPY(signer->subjectKeyIdHash, current + idx,SIGNER_DIGEST_SIZE); + idx += SIGNER_DIGEST_SIZE; + #endif + + /* Make next Signer the head of the row. */ + signer->next = cm->caTable[row]; + /* Add Signer to start of row. */ + cm->caTable[row] = signer; + + /* Done one more Signer. */ + --listSz; + } + + if ((ret != 0) && (signer != NULL)) { + /* Dispose of allocated signer. */ + FreeSigner(signer, cm->heap); + } + } + + if (ret == 0) { + /* Return the number of bytes used on success. */ + ret = idx; + } + return ret; +} + + +/* Store whole CA certificate row into memory. + * + * Assumes we have locked CA table. + * + * @param [in] cm Certificate manager. + * @param [in] current Buffer to write to. + * @param [in] row Row number being stored. + * @return Number of bytes added. + */ +static WC_INLINE int cm_store_cert_row(WOLFSSL_CERT_MANAGER* cm, byte* current, + int row) +{ + int added = 0; + Signer* list; + + /* Get the row - a linked list. */ + list = cm->caTable[row]; + /* Each certificate in row. */ + while (list != NULL) { + /* Public key size. */ + XMEMCPY(current + added, &list->pubKeySize, sizeof(list->pubKeySize)); + added += (int)sizeof(list->pubKeySize); + + /* Public key OID. */ + XMEMCPY(current + added, &list->keyOID, sizeof(list->keyOID)); + added += (int)sizeof(list->keyOID); + + /* Public key. */ + XMEMCPY(current + added, list->publicKey, (size_t)list->pubKeySize); + added += (int)list->pubKeySize; + + /* Certificate name length. */ + XMEMCPY(current + added, &list->nameLen, sizeof(list->nameLen)); + added += (int)sizeof(list->nameLen); + + /* Certificate name. */ + XMEMCPY(current + added, list->name, (size_t)list->nameLen); + added += list->nameLen; + + /* Hash of subject name. */ + XMEMCPY(current + added, list->subjectNameHash, SIGNER_DIGEST_SIZE); + added += SIGNER_DIGEST_SIZE; + + #ifndef NO_SKID + /* Hash of public key. */ + XMEMCPY(current + added, list->subjectKeyIdHash,SIGNER_DIGEST_SIZE); + added += SIGNER_DIGEST_SIZE; + #endif + + /* Next certificate in row. */ + list = list->next; + } + + return added; +} + + +/* Persist CA certificate cache to memory. + * + * Assumes we have locked CA table. + * + * @param [in] cm Certificate manager. + * @param [in] mem Memory to persist into. + * @param [in] sz Size in bytes of memory. + * @return WOLFSSL_SUCCESS on success. + * @return BUFFER_E when memory is too small. + */ +static WC_INLINE int cm_do_mem_save_cert_cache(WOLFSSL_CERT_MANAGER* cm, + void* mem, int sz) +{ + int ret = WOLFSSL_SUCCESS; + int realSz; + int i; + + WOLFSSL_ENTER("cm_do_mem_save_cert_cache"); + + /* Calculate amount of memory required to store CA certificate table. */ + realSz = cm_get_cert_cache_mem_size(cm); + if (realSz > sz) { + WOLFSSL_MSG("Mem output buffer too small"); + ret = BUFFER_E; + } + if (ret == WOLFSSL_SUCCESS) { + byte* current; + CertCacheHeader hdr; + + /* Create header for storage. */ + hdr.version = WOLFSSL_CACHE_CERT_VERSION; + hdr.rows = CA_TABLE_SIZE; + cm_set_cert_header_Columns(cm, hdr.columns); + hdr.signerSz = (int)sizeof(Signer); + + /* Copy header into memory. */ + XMEMCPY(mem, &hdr, sizeof(CertCacheHeader)); + current = (byte*)mem + sizeof(CertCacheHeader); + + /* Each row of table. */ + for (i = 0; i < CA_TABLE_SIZE; ++i) { + /* Append row to memory. */ + current += cm_store_cert_row(cm, current, i); + } + } + + return ret; +} + + +#if !defined(NO_FILESYSTEM) + +/* Persist CA certificate cache to file. + * + * Locks CA table. + * + * @param [in] cm Certificate manager. + * @param [in] fname File name to write to. + * @return WOLFSSL_SUCCESS on success. + * @return WOLFSSL_BAD_FILE when opening file fails. + * @return BAD_MUTEX_E when locking fails. + * @return MEMORY_E when dynamic memory allocation fails. + * @return FWRITE_ERROR when writing to file fails. + */ +int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname) +{ + XFILE file; + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("CM_SaveCertCache"); + + /* Open file for writing. */ + file = XFOPEN(fname, "w+b"); + if (file == XBADFILE) { + WOLFSSL_MSG("Couldn't open cert cache save file"); + ret = WOLFSSL_BAD_FILE; + } + + /* Lock CA table. */ + if ((ret == WOLFSSL_SUCCESS) && (wc_LockMutex(&cm->caLock) != 0)) { + WOLFSSL_MSG("wc_LockMutex on caLock failed"); + ret = BAD_MUTEX_E; + } + + if (ret == WOLFSSL_SUCCESS) { + byte* mem; + /* Calculate size of memory required to store CA table. */ + size_t memSz = (size_t)cm_get_cert_cache_mem_size(cm); + /* Allocate memory to hold CA table. */ + mem = (byte*)XMALLOC(memSz, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (mem == NULL) { + WOLFSSL_MSG("Alloc for tmp buffer failed"); + ret = MEMORY_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Store CA table in memory. */ + ret = cm_do_mem_save_cert_cache(cm, mem, (int)memSz); + } + if (ret == WOLFSSL_SUCCESS) { + /* Write memory to file. */ + int sz = (int)XFWRITE(mem, memSz, 1, file); + if (sz != 1) { + WOLFSSL_MSG("Cert cache file write failed"); + ret = FWRITE_ERROR; + } + } + if (mem != NULL) { + XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + + /* Unlock CA table. */ + wc_UnLockMutex(&cm->caLock); + } + + /* Close file. */ + if (file != XBADFILE) { + XFCLOSE(file); + } + return ret; +} + + +/* Restore CA certificate cache from file. + * + * @param [in] cm Certificate manager. + * @param [in] fname File name to write to. + * @return WOLFSSL_SUCCESS on success. + * @return WOLFSSL_BAD_FILE when opening or using file fails. + * @return MEMORY_E when dynamic memory allocation fails. + * @return FREAD_ERROR when reading from file fails. + */ +int CM_RestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const char* fname) +{ + XFILE file; + int ret = WOLFSSL_SUCCESS; + int memSz = 0; + byte* mem = NULL; + + WOLFSSL_ENTER("CM_RestoreCertCache"); + + /* Open file for reading. */ + file = XFOPEN(fname, "rb"); + if (file == XBADFILE) { + WOLFSSL_MSG("Couldn't open cert cache save file"); + ret = WOLFSSL_BAD_FILE; + } + + if (ret == WOLFSSL_SUCCESS) { + /* Read file into allocated memory. */ + ret = wolfssl_read_file(file, (char**)&mem, &memSz); + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + } + } + if (ret == WOLFSSL_SUCCESS) { + /* Create the CA certificate table from memory. */ + ret = CM_MemRestoreCertCache(cm, mem, memSz); + if (ret != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Mem restore cert cache failed"); + } + } + + /* Dispose of dynamic memory read into. */ + XFREE(mem, cm->heap, DYNAMIC_TYPE_TMP_BUFFER); + /* Close file. */ + if (file != XBADFILE) { + XFCLOSE(file); + } + return ret; +} + +#endif /* NO_FILESYSTEM */ + + +/* Persist CA certificate cache to memory. + * + * Locks CA table. + * + * @param [in] cm Certificate manager. + * @param [in] mem Memory to persist into. + * @param [in] sz Size in bytes of memory. + * @param [out] used Number of bytes used when persisting cache. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_MUTEX_E when locking fails. + * @return BUFFER_E when memory is too small. + */ +int CM_MemSaveCertCache(WOLFSSL_CERT_MANAGER* cm, void* mem, int sz, int* used) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("CM_MemSaveCertCache"); + + /* Lock CA table. */ + if (wc_LockMutex(&cm->caLock) != 0) { + WOLFSSL_MSG("wc_LockMutex on caLock failed"); + ret = BAD_MUTEX_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Save CA table into memory. */ + ret = cm_do_mem_save_cert_cache(cm, mem, sz); + if (ret == WOLFSSL_SUCCESS) { + /* Get the number of bytes used. */ + *used = cm_get_cert_cache_mem_size(cm); + } + + /* Unlock CA table. */ + wc_UnLockMutex(&cm->caLock); + } + + return ret; +} + + +/* Restore CA certificate table from memory, + * + * Locks CA table. + * + * @param [in] cm Certificate manager. + * @param [in] mem Buffer containing rows. + * @param [in] sz Size in bytes of data in buffer. + * @return WOLFSSL_SUCCESS on success. + * @return BUFFER_E when buffer is too small. + * @return BAD_MUTEX_E when locking fails. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int CM_MemRestoreCertCache(WOLFSSL_CERT_MANAGER* cm, const void* mem, int sz) +{ + int ret = WOLFSSL_SUCCESS; + int i; + CertCacheHeader* hdr = (CertCacheHeader*)mem; + byte* current = (byte*)mem + sizeof(CertCacheHeader); + byte* end = (byte*)mem + sz; /* don't go over */ + + WOLFSSL_ENTER("CM_MemRestoreCertCache"); + + /* Check memory available is bigger than cache header. */ + if (current > end) { + WOLFSSL_MSG("Cert Cache Memory buffer too small"); + ret = BUFFER_E; + } + + /* Validate the cache header. */ + if ((ret == WOLFSSL_SUCCESS) && + ((hdr->version != WOLFSSL_CACHE_CERT_VERSION) || + (hdr->rows != CA_TABLE_SIZE) || + (hdr->signerSz != (int)sizeof(Signer)))) { + WOLFSSL_MSG("Cert Cache Memory header mismatch"); + ret = CACHE_MATCH_ERROR; + } + + /* Lock CA table. */ + if ((ret == WOLFSSL_SUCCESS) && (wc_LockMutex(&cm->caLock) != 0)) { + WOLFSSL_MSG("wc_LockMutex on caLock failed"); + ret = BAD_MUTEX_E; + } + + if (ret == WOLFSSL_SUCCESS) { + /* Dispose of current CA certificate table. */ + FreeSignerTable(cm->caTable, CA_TABLE_SIZE, cm->heap); + + /* Each row. */ + for (i = 0; i < CA_TABLE_SIZE; ++i) { + /* Restore a row from memory. */ + int added = cm_restore_cert_row(cm, current, i, hdr->columns[i], + end); + /* Bail on error. */ + if (added < 0) { + WOLFSSL_MSG("cm_restore_cert_row error"); + ret = added; + break; + } + /* Update pointer to data of next row. */ + current += added; + } + + /* Unlock CA table. */ + wc_UnLockMutex(&cm->caLock); + } + + return ret; +} + + +/* Calculate size of CA certificate cache when persisted to memory. + * + * Locks CA table. + * + * @param [in] cm Certificate manager. + * @return Number of bytes on success. + * @return BAD_MUTEX_E when locking fails. + */ +int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm) +{ + int ret; + + WOLFSSL_ENTER("CM_GetCertCacheMemSize"); + + /* Lock CA table. */ + if (wc_LockMutex(&cm->caLock) != 0) { + WOLFSSL_MSG("wc_LockMutex on caLock failed"); + ret = BAD_MUTEX_E; + } + else { + /* Calculate memory size. */ + ret = cm_get_cert_cache_mem_size(cm); + + /* Unlock CA table. */ + wc_UnLockMutex(&cm->caLock); + } + + return ret; +} + +#endif /* PERSIST_CERT_CACHE */ + +/******************************************************************************* + * CRL handling + ******************************************************************************/ + +/* Enables/disables the use of CRLs when validating certificates. + * + * @param [in] cm Certificate manager. + * @param [in] options Options for using CRLs. Valid flags: + * WOLFSSL_CRL_CHECKALL, WOLFSSL_CRL_CHECK. + * @return WOLFSSL_SUCCESS on success. + * @return WOLFSSL_FAILURE when initializing the CRL object fails. + * @return BAD_FUNC_ARG when cm is NULL. + * @return MEMORY_E when dynamic memory allocation fails. + * @return NOT_COMPILED_IN when the CRL feature is disabled. + */ +int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, int options) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerEnableCRL"); + + (void)options; + + /* Validate parameters. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + +#if defined(OPENSSL_COMPATIBLE_DEFAULTS) + /* If disabling then don't worry about whether CRL feature is enabled. */ + if ((ret == WOLFSSL_SUCCESS) && (options == 0)) { + /* Disable leaf CRL check. */ + cm->crlEnabled = 0; + /* Disable all CRL checks. */ + cm->crlCheckAll = 0; + } + else +#endif + if (ret == WOLFSSL_SUCCESS) { +#ifndef HAVE_CRL + /* CRL feature not enabled. */ + ret = NOT_COMPILED_IN; +#else + /* Create CRL object if not present. */ + if (cm->crl == NULL) { + /* Allocate memory for CRL object. */ + cm->crl = (WOLFSSL_CRL*)XMALLOC(sizeof(WOLFSSL_CRL), cm->heap, + DYNAMIC_TYPE_CRL); + if (cm->crl == NULL) { + ret = MEMORY_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Reset fields of CRL object. */ + XMEMSET(cm->crl, 0, sizeof(WOLFSSL_CRL)); + /* Initialize CRL object. */ + if (InitCRL(cm->crl, cm) != 0) { + WOLFSSL_MSG("Init CRL failed"); + /* Dispose of CRL object - indicating dynamically allocated. + */ + FreeCRL(cm->crl, 1); + cm->crl = NULL; + ret = WOLFSSL_FAILURE; + } + } + } + + if (ret == WOLFSSL_SUCCESS) { + #if defined(HAVE_CRL_IO) && defined(USE_WOLFSSL_IO) + /* Use built-in callback to lookup CRL from URL. */ + cm->crl->crlIOCb = EmbedCrlLookup; + #endif + #if defined(OPENSSL_COMPATIBLE_DEFAULTS) + if ((options & WOLFSSL_CRL_CHECKALL) || + (options & WOLFSSL_CRL_CHECK)) + #endif + { + /* Enable leaf CRL check. */ + cm->crlEnabled = 1; + if (options & WOLFSSL_CRL_CHECKALL) { + /* Enable all CRL check. */ + cm->crlCheckAll = 1; + } + } + } +#endif + } + + return ret; +} + + +/* Disables the CRL checks. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerDisableCRL"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == WOLFSSL_SUCCESS) { + /* Disable CRL checking. */ + cm->crlEnabled = 0; + cm->crlCheckAll = 0; + } + + return ret; +} + +#ifdef HAVE_CRL + +/* Load CRL for use. + * + * @param [in] cm Certificate manager. + * @param [in] buff Buffer holding CRL. + * @param [in] sz Size in bytes of CRL in buffer. + * @param [in] type Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or buff is NULL or sz is negative or zero. + * @return WOLFSSL_FATAL_ERROR when creating CRL object fails. + */ +int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm, + const unsigned char* buff, long sz, int type) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLBuffer"); + + /* Validate parameters. */ + if ((cm == NULL) || (buff == NULL) || (sz <= 0)) { + ret = BAD_FUNC_ARG; + } + + /* Create a CRL object if not available and enable CRL checking. */ + if ((ret == WOLFSSL_SUCCESS) && (cm->crl == NULL) && + (wolfSSL_CertManagerEnableCRL(cm, WOLFSSL_CRL_CHECK) != + WOLFSSL_SUCCESS)) { + WOLFSSL_MSG("Enable CRL failed"); + ret = WOLFSSL_FATAL_ERROR; + } + + if (ret == WOLFSSL_SUCCESS) { + /* Load CRL into CRL object of the certificate manager. */ + ret = BufferLoadCRL(cm->crl, buff, sz, type, VERIFY); + } + + return ret; +} + +/* Free the CRL object of the certificate manager. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerFreeCRL"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + /* Check whether CRL object exists. */ + if ((ret == WOLFSSL_SUCCESS) && (cm->crl != NULL)) { + /* Dispose of CRL object - indicating dynamically allocated. */ + FreeCRL(cm->crl, 1); + cm->crl = NULL; + } + + return ret; +} + +/* Check DER encoded certificate against CRLs if checking enabled. + * + * @param [in] cm Certificate manager. + * @param [in] der DER encode certificate. + * @param [in] sz Size in bytes of DER encode certificate. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or der is NULL or sz is negative or zero. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, + const unsigned char* der, int sz) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + DecodedCert* cert = NULL; +#else + DecodedCert cert[1]; +#endif + + WOLFSSL_ENTER("wolfSSL_CertManagerCheckCRL"); + + /* Validate parameters. */ + if ((cm == NULL) || (der == NULL) || (sz <= 0)) { + ret = BAD_FUNC_ARG; + } + + /* Check if CRL checking enabled. */ + if ((ret == 0) && cm->crlEnabled) { + #ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for decoded certificate. */ + cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, + DYNAMIC_TYPE_DCERT); + if (cert == NULL) + ret = MEMORY_E; + if (ret == 0) + #endif + { + /* Initialize decoded certificate with buffer. */ + InitDecodedCert(cert, der, (word32)sz, NULL); + + /* Parse certificate and perform CRL checks. */ + ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_CRL, cm, NULL); + if (ret != 0) { + WOLFSSL_MSG("ParseCert failed"); + } + /* Do CRL checks with decoded certificate. */ + else if ((ret = CheckCertCRL(cm->crl, cert)) != 0) { + WOLFSSL_MSG("CheckCertCRL failed"); + } + + /* Dispose of dynamically allocated memory. */ + FreeDecodedCert(cert); + #ifdef WOLFSSL_SMALL_STACK + XFREE(cert, NULL, DYNAMIC_TYPE_DCERT); + #endif + } + } + + return (ret == 0) ? WOLFSSL_SUCCESS : ret; +} + +/* Set the missing CRL callback. + * + * @param [in] cm Certificate manager. + * @param [in] cb Missing CRL callback. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, CbMissingCRL cb) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerSetCRL_Cb"); + + /* Validate parameters. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == WOLFSSL_SUCCESS) { + /* Store callback. */ + cm->cbMissingCRL = cb; + } + + return ret; +} + +#ifdef HAVE_CRL_IO +/* Set the CRL I/O callback. + * + * @param [in] cm Certificate manager. + * @param [in] cb CRL I/O callback. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, CbCrlIO cb) +{ + int ret = WOLFSSL_SUCCESS; + + /* Validate parameters. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + if ((ret == WOLFSSL_SUCCESS) && (cm->crl != NULL)) { + /* Store callback. */ + cm->crl->crlIOCb = cb; + } + + return ret; +} +#endif + +#ifndef NO_FILESYSTEM +/* Load CRL/s from path with the option of monitoring for changes. + * + * @param [in] cm Certificate manager. + * @param [in] path Path to a directory containing CRLs. + * @param [in] type Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @param [in] monitor Whether to monitor path for changes to files. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or path is NULL. + * @return WOLFSSL_FATAL_ERROR when enabling CRLs fails. + */ +int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, const char* path, + int type, int monitor) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRL"); + + /* Validate parameters. */ + if ((cm == NULL) || (path == NULL)) { + ret = BAD_FUNC_ARG; + } + + /* Create a CRL object if not available. */ + if ((ret == WOLFSSL_SUCCESS) && (cm->crl == NULL) && + (wolfSSL_CertManagerEnableCRL(cm, WOLFSSL_CRL_CHECK) != + WOLFSSL_SUCCESS)) { + WOLFSSL_MSG("Enable CRL failed"); + ret = WOLFSSL_FATAL_ERROR; + } + + if (ret == WOLFSSL_SUCCESS) { + /* Load CRLs from path into CRL object of certificate manager. */ + ret = LoadCRL(cm->crl, path, type, monitor); + } + + return ret; +} + +/* Load CRL from file. + * + * @param [in] cm Certificate manager. + * @param [in] file Path to a directory containing CRLs. + * @param [in] type Format of encoding. Valid values: + * WOLFSSL_FILETYPE_ASN1, WOLFSSL_FILETYPE_PEM. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or file is NULL. + * @return WOLFSSL_FATAL_ERROR when enabling CRLs fails. + */ +int wolfSSL_CertManagerLoadCRLFile(WOLFSSL_CERT_MANAGER* cm, const char* file, + int type) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerLoadCRLFile"); + + /* Validate parameters. */ + if ((cm == NULL) || (file == NULL)) { + ret = BAD_FUNC_ARG; + } + + /* Create a CRL object if not available. */ + if ((ret == WOLFSSL_SUCCESS) && (cm->crl == NULL) && + (wolfSSL_CertManagerEnableCRL(cm, WOLFSSL_CRL_CHECK) != + WOLFSSL_SUCCESS)) { + WOLFSSL_MSG("Enable CRL failed"); + ret = WOLFSSL_FATAL_ERROR; + } + + if (ret == WOLFSSL_SUCCESS) { + /* Load CRL file into CRL object of certificate manager. */ + ret = ProcessFile(NULL, file, type, CRL_TYPE, NULL, 0, cm->crl, VERIFY); + } + + return ret; +} +#endif /* !NO_FILESYSTEM */ + +#endif /* HAVE_CRL */ + +/******************************************************************************* + * OCSP handling + ******************************************************************************/ + +/* Enables OCSP when validating certificates and sets options. + * + * @param [in] cm Certificate manager. + * @param [in] options Options for using OCSP. Valid flags: + * WOLFSSL_OCSP_URL_OVERRIDE, WOLFSSL_OCSP_NO_NONCE, + * WOLFSSL_OCSP_CHECKALL. + * @return WOLFSSL_SUCCESS on success. + * @return 0 when initializing the OCSP object fails. + * @return BAD_FUNC_ARG when cm is NULL. + * @return MEMORY_E when dynamic memory allocation fails. + * @return NOT_COMPILED_IN when the OCSP feature is disabled. + */ +int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, int options) +{ + int ret = WOLFSSL_SUCCESS; + + (void)options; + + WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSP"); + + /* Validate parameters. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + +#ifndef HAVE_OCSP + if (ret == WOLFSSL_SUCCESS) { + /* OCSP feature not enabled. */ + ret = NOT_COMPILED_IN; + } +#else + if (ret == WOLFSSL_SUCCESS) { + /* Check whether OCSP object is available. */ + if (cm->ocsp == NULL) { + /* Allocate memory for OCSP object. */ + cm->ocsp = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), cm->heap, + DYNAMIC_TYPE_OCSP); + if (cm->ocsp == NULL) { + ret = MEMORY_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Reset the fields of the OCSP object. */ + XMEMSET(cm->ocsp, 0, sizeof(WOLFSSL_OCSP)); + /* Initialize the OCSP object. */ + if (InitOCSP(cm->ocsp, cm) != 0) { + WOLFSSL_MSG("Init OCSP failed"); + /* Dispose of OCSP object - indicating dynamically allocated. + */ + FreeOCSP(cm->ocsp, 1); + cm->ocsp = NULL; + ret = 0; + } + } + } + } + if (ret == WOLFSSL_SUCCESS) { + /* Enable OCSP checking. */ + cm->ocspEnabled = 1; + /* Enable URL override if requested. */ + if (options & WOLFSSL_OCSP_URL_OVERRIDE) { + cm->ocspUseOverrideURL = 1; + } + /* Set nonce option for creating OCSP requests. */ + cm->ocspSendNonce = (options & WOLFSSL_OCSP_NO_NONCE) != + WOLFSSL_OCSP_NO_NONCE; + /* Set all OCSP checks on if requested. */ + if (options & WOLFSSL_OCSP_CHECKALL) { + cm->ocspCheckAll = 1; + } + #ifndef WOLFSSL_USER_IO + /* Set built-in OCSP lookup. */ + cm->ocspIOCb = EmbedOcspLookup; + cm->ocspRespFreeCb = EmbedOcspRespFree; + cm->ocspIOCtx = cm->heap; + #endif /* WOLFSSL_USER_IO */ + } +#endif /* HAVE_OCSP */ + + return ret; +} + +/* Disables the OCSP checks. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSP"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == WOLFSSL_SUCCESS) { + /* Disable use of OCSP with certificate validation. */ + cm->ocspEnabled = 0; + } + + return ret; +} + +/* Enables OCSP stapling with certificates in manager. + * + * @param [in] cm Certificate manager. + * @param [in] options Options for using OCSP. Valid flags: + * WOLFSSL_OCSP_URL_OVERRIDE, WOLFSSL_OCSP_NO_NONCE, + * WOLFSSL_OCSP_CHECKALL. + * @return WOLFSSL_SUCCESS on success. + * @return 0 when initializing the OCSP stapling object fails. + * @return BAD_FUNC_ARG when cm is NULL. + * @return MEMORY_E when dynamic memory allocation fails. + * @return NOT_COMPILED_IN when the OCSP stapling feature is disabled. + */ +int wolfSSL_CertManagerEnableOCSPStapling(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPStapling"); + + /* Validate parameters. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + +#if !defined(HAVE_CERTIFICATE_STATUS_REQUEST) && \ + !defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ret == WOLFSSL_SUCCESS) { + /* OCSP stapling feature not enabled. */ + ret = NOT_COMPILED_IN; + } +#else +#ifndef NO_WOLFSSL_SERVER + if (ret == WOLFSSL_SUCCESS) { + /* Check whether OCSP object is available. */ + if (cm->ocsp_stapling == NULL) { + /* Allocate memory for OCSP stapling object. */ + cm->ocsp_stapling = (WOLFSSL_OCSP*)XMALLOC(sizeof(WOLFSSL_OCSP), + cm->heap, DYNAMIC_TYPE_OCSP); + if (cm->ocsp_stapling == NULL) { + ret = MEMORY_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Reset the fields of the OCSP object. */ + XMEMSET(cm->ocsp_stapling, 0, sizeof(WOLFSSL_OCSP)); + /* Initialize the OCSP stapling object. */ + if (InitOCSP(cm->ocsp_stapling, cm) != 0) { + WOLFSSL_MSG("Init OCSP failed"); + /* Dispose of OCSP stapling object - indicating dynamically + * allocated. */ + FreeOCSP(cm->ocsp_stapling, 1); + cm->ocsp_stapling = NULL; + ret = 0; + } + } + } + } +#ifndef WOLFSSL_USER_IO + if (ret == WOLFSSL_SUCCESS) { + /* Set built-in OCSP lookup. */ + cm->ocspIOCb = EmbedOcspLookup; + cm->ocspRespFreeCb = EmbedOcspRespFree; + cm->ocspIOCtx = cm->heap; + } +#endif /* WOLFSSL_USER_IO */ +#endif /* NO_WOLFSSL_SERVER */ + if (ret == WOLFSSL_SUCCESS) { + /* Enable OCSP stapling. */ + cm->ocspStaplingEnabled = 1; + } +#endif /* HAVE_CERTIFICATE_STATUS_REQUEST || + * HAVE_CERTIFICATE_STATUS_REQUEST_V2 */ + + return ret; +} + +/* Disables OCSP Stapling. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerDisableOCSPStapling(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPStapling"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == WOLFSSL_SUCCESS) { + #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ + defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + /* Disable use of OCSP Stapling. */ + cm->ocspStaplingEnabled = 0; + #else + /* OCSP stapling feature not enabled. */ + ret = NOT_COMPILED_IN; + #endif + } + + return ret; +} + +/* Enable the must use OCSP Stapling option. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerEnableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerEnableOCSPMustStaple"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == WOLFSSL_SUCCESS) { +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ + defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + #ifndef NO_WOLFSSL_CLIENT + /* Enable must use OCSP Stapling option. */ + cm->ocspMustStaple = 1; + #endif +#else + /* OCSP stapling feature not enabled. */ + ret = NOT_COMPILED_IN; +#endif + } + + return ret; +} + +/* Disable the must use OCSP Stapling option. + * + * @param [in] cm Certificate manager. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerDisableOCSPMustStaple(WOLFSSL_CERT_MANAGER* cm) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerDisableOCSPMustStaple"); + + /* Validate parameter. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + + if (ret == WOLFSSL_SUCCESS) { +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ + defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + #ifndef NO_WOLFSSL_CLIENT + /* Disable must use OCSP Stapling option. */ + cm->ocspMustStaple = 0; + #endif +#else + /* OCSP stapling feature not enabled. */ + ret = NOT_COMPILED_IN; +#endif + } + + return ret; +} + +#ifdef HAVE_OCSP +/* Check DER encoded certificate against with OCSP if checking enabled. + * + * @param [in] cm Certificate manager. + * @param [in] der DER encode certificate. + * @param [in] sz Size in bytes of DER encode certificate. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or der is NULL or sz is negative or 0. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, + const unsigned char* der, int sz) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + DecodedCert* cert = NULL; +#else + DecodedCert cert[1]; +#endif + + WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSP"); + + /* Validate parameters. */ + if ((cm == NULL) || (der == NULL) || (sz <= 0)) { + ret = BAD_FUNC_ARG; + } + + /* Check if OCSP checking enabled. */ + if ((ret == 0) && cm->ocspEnabled) { + #ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for decoded certificate. */ + cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), cm->heap, + DYNAMIC_TYPE_DCERT); + if (cert == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize decoded certificate with buffer. */ + InitDecodedCert(cert, der, (word32)sz, NULL); + + /* Parse certificate and perform CRL checks. */ + ret = ParseCertRelative(cert, CERT_TYPE, VERIFY_OCSP, cm, NULL); + if (ret != 0) { + WOLFSSL_MSG("ParseCert failed"); + } + /* Do OCSP checks with decoded certificate. */ + else if ((ret = CheckCertOCSP(cm->ocsp, cert)) != 0) { + WOLFSSL_MSG("CheckCertOCSP failed"); + } + + /* Dispose of dynamically allocated memory. */ + FreeDecodedCert(cert); + #ifdef WOLFSSL_SMALL_STACK + XFREE(cert, cm->heap, DYNAMIC_TYPE_DCERT); + #endif + } + } + + return (ret == 0) ? WOLFSSL_SUCCESS : ret; +} + +/* Check OCSP response. + * + * @param [in] cm Certificate manager. + * @param [in] response Buffer holding OCSP response. + * @param [in] responseSz Size in bytes of OCSP response. + * @param [in] responseBuffer Buffer to copy response into. + * @param [in] status Place to store certificate status. + * @param [in] entry Place to store OCSP entry. + * @param [in] ocspRequest OCSP request to match with response. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm or response is NULL. + */ +int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER *cm, + byte *response, int responseSz, buffer *responseBuffer, + CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest) +{ + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_CertManagerCheckOCSPResponse"); + + /* Validate parameters. */ + if ((cm == NULL) || (response == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && cm->ocspEnabled) { + /* Check OCSP response with OCSP object from certificate manager. */ + ret = CheckOcspResponse(cm->ocsp, response, responseSz, responseBuffer, + status, entry, ocspRequest, NULL); + } + + return (ret == 0) ? WOLFSSL_SUCCESS : ret; +} + +/* Set the OCSP override URL. + * + * @param [in] cm Certificate manager. + * @param [in] url URL to get an OCSP response from. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm, + const char* url) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSPOverrideURL"); + + /* Validate parameters. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + + if (ret == WOLFSSL_SUCCESS) { + /* Dispose of old URL. */ + XFREE(cm->ocspOverrideURL, cm->heap, DYNAMIC_TYPE_URL); + if (url != NULL) { + /* Calculate size of URL string. Include terminator character. */ + int urlSz = (int)XSTRLEN(url) + 1; + /* Allocate memory for URL to be copied into. */ + cm->ocspOverrideURL = (char*)XMALLOC((size_t)urlSz, cm->heap, + DYNAMIC_TYPE_URL); + if (cm->ocspOverrideURL == NULL) { + ret = MEMORY_E; + } + if (ret == WOLFSSL_SUCCESS) { + /* Copy URL into certificate manager. */ + XMEMCPY(cm->ocspOverrideURL, url, (size_t)urlSz); + } + } + else { + /* No URL to set so make it NULL. */ + cm->ocspOverrideURL = NULL; + } + } + + return ret; +} + +/* Set the OCSP I/O callback, OCSP response free callback and related data. + * + * @param [in] cm Certificate manager. + * @param [in] ioCb OCSP callback. + * @param [in] respFreeCb Callback to free OCSP response buffer. + * @param [in] ioCbCtx Context data to pass to OCSP callbacks. + * @return WOLFSSL_SUCCESS on success. + * @return BAD_FUNC_ARG when cm is NULL. + */ +int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm, CbOCSPIO ioCb, + CbOCSPRespFree respFreeCb, void* ioCbCtx) +{ + int ret = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_CertManagerSetOCSP_Cb"); + + /* Validate parameters. */ + if (cm == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == WOLFSSL_SUCCESS) { + /* Set callbacks and data into certificate manager. */ + cm->ocspIOCb = ioCb; + cm->ocspRespFreeCb = respFreeCb; + cm->ocspIOCtx = ioCbCtx; + } + + return ret; +} + +#endif /* HAVE_OCSP */ + +#endif /* NO_CERTS */ + +#endif /* !WOLFSSL_SSL_CERTMAN_INCLUDED */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_crypto.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_crypto.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_crypto.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_crypto.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3499 @@ +/* ssl_crypto.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifndef WOLFSSL_SSL_CRYPTO_INCLUDED + #ifndef WOLFSSL_IGNORE_FILE_WARN + #warning ssl_crypto.c does not need to be compiled separately from ssl.c + #endif +#else + +/******************************************************************************* + * START OF Digest APIs + ******************************************************************************/ + +#ifdef OPENSSL_EXTRA +#ifndef NO_MD4 +/* Initialize MD4 hash operation. + * + * @param [in, out] md4 MD4 context object. + */ +void wolfSSL_MD4_Init(WOLFSSL_MD4_CTX* md4) +{ + /* Ensure WOLFSSL_MD4_CTX is big enough for wolfCrypt Md4. */ + typedef char ok[sizeof(md4->buffer) >= sizeof(Md4) ? 1 : -1]; + (void)sizeof(ok); + + WOLFSSL_ENTER("MD4_Init"); + + /* Initialize wolfCrypt MD4 object. */ + wc_InitMd4((Md4*)md4); +} + +/* Update MD4 hash with data. + * + * @param [in, out] md4 MD4 context object. + * @param [in] data Data to be hashed. + * @param [in] len Length of data in bytes. + */ +void wolfSSL_MD4_Update(WOLFSSL_MD4_CTX* md4, const void* data, + unsigned long len) +{ + WOLFSSL_ENTER("MD4_Update"); + + /* Update wolfCrypt MD4 object with data. */ + wc_Md4Update((Md4*)md4, (const byte*)data, (word32)len); +} + +/* Finalize MD4 hash and return output. + * + * @param [out] digest Hash output. + * Must be able to hold MD4_DIGEST_SIZE bytes. + * @param [in, out] md4 MD4 context object. + */ +void wolfSSL_MD4_Final(unsigned char* digest, WOLFSSL_MD4_CTX* md4) +{ + WOLFSSL_ENTER("MD4_Final"); + + /* Finalize wolfCrypt MD4 hash into digest. */ + wc_Md4Final((Md4*)md4, digest); +} + +#endif /* NO_MD4 */ +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL) +#ifndef NO_MD5 +/* Initialize MD5 hash operation. + * + * @param [in, out] md5 MD5 context object. + * @return 1 on success. + * @return 0 when md5 is NULL. + */ +int wolfSSL_MD5_Init(WOLFSSL_MD5_CTX* md5) +{ + /* Ensure WOLFSSL_MD5_CTX is big enough for wolfCrypt wc_Md5. */ + typedef char md5_test[sizeof(WOLFSSL_MD5_CTX) >= sizeof(wc_Md5) ? 1 : -1]; + (void)sizeof(md5_test); + + WOLFSSL_ENTER("MD5_Init"); + + /* Initialize wolfCrypt MD5 object. */ + return wc_InitMd5((wc_Md5*)md5) == 0; +} + +/* Update MD5 hash with data. + * + * @param [in, out] md5 MD5 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when md5 is NULL. + */ +int wolfSSL_MD5_Update(WOLFSSL_MD5_CTX* md5, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("MD5_Update"); + + /* Update wolfCrypt MD5 object with data. */ + return wc_Md5Update((wc_Md5*)md5, (const byte*)input, (word32)sz) == 0; +} + +/* Finalize MD5 hash and return output. + * + * @param [out] digest Hash output. + * Must be able to hold MD5_DIGEST_SIZE bytes. + * @param [in, out] md5 MD5 context object. + * @return 1 on success. + * @return 0 when md5 or output is NULL. + */ +int wolfSSL_MD5_Final(byte* output, WOLFSSL_MD5_CTX* md5) +{ + int ret; + + WOLFSSL_ENTER("MD5_Final"); + + /* Finalize wolfCrypt MD5 hash into output. */ + ret = (wc_Md5Final((wc_Md5*)md5, output) == 0); + /* Free resources here, as OpenSSL API doesn't include MD5_Free(). */ + wc_Md5Free((wc_Md5*)md5); + + return ret; +} + +/* Apply MD5 transformation to the data. + * + * 'data' has words reversed in this function when big endian. + * + * @param [in, out] md5 MD5 context object. + * @param [in, out] data One block of data to be hashed. + * @return 1 on success. + * @return 0 when md5 or data is NULL. + */ +int wolfSSL_MD5_Transform(WOLFSSL_MD5_CTX* md5, const unsigned char* data) +{ + WOLFSSL_ENTER("MD5_Transform"); + +#if defined(BIG_ENDIAN_ORDER) + /* Byte reversal done outside transform. */ + if ((md5 != NULL) && (data != NULL)) { + ByteReverseWords((word32*)data, (word32*)data, WC_MD5_BLOCK_SIZE); + } +#endif + /* Transform block of data with wolfCrypt MD5 object. */ + return wc_Md5Transform((wc_Md5*)md5, data) == 0; +} + +/* One shot MD5 hash of data. + * + * When hash is null, a static buffer of MD5_DIGEST_SIZE is used. + * When the static buffer is used this function is not thread safe. + * + * @param [in] data Data to be hashed. + * @param [in] len Length of data in bytes. + * @param [out] hash Buffer to hold digest. May be NULL. + * Must be able to hold MD5_DIGEST_SIZE bytes. + * @return Buffer holding hash on success. + * @return NULL when hashing fails. + */ +unsigned char* wolfSSL_MD5(const unsigned char* data, size_t len, + unsigned char* hash) +{ + /* Buffer to use when hash is NULL. */ + static unsigned char dgst[WC_MD5_DIGEST_SIZE]; + + WOLFSSL_ENTER("wolfSSL_MD5"); + + /* Ensure buffer available for digest result. */ + if (hash == NULL) { + hash = dgst; + } + /* One shot MD5 hash with wolfCrypt. */ + if (wc_Md5Hash(data, (word32)len, hash) != 0) { + WOLFSSL_MSG("wc_Md5Hash error"); + hash = NULL; + } + + return hash; +} +#endif /* !NO_MD5 */ + +#ifndef NO_SHA +/* Initialize SHA hash operation. + * + * @param [in, out] sha SHA context object. + * @return 1 on success. + * @return 0 when sha is NULL. + */ +int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX* sha) +{ + /* Ensure WOLFSSL_SHA_CTX is big enough for wolfCrypt wc_Sha. */ + typedef char sha_test[sizeof(WOLFSSL_SHA_CTX) >= sizeof(wc_Sha) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA_Init"); + + /* Initialize wolfCrypt SHA object. */ + return wc_InitSha((wc_Sha*)sha) == 0; +} + +/* Update SHA hash with data. + * + * @param [in, out] sha SHA context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when md5 is NULL. + */ +int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX* sha, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA_Update"); + + /* Update wolfCrypt SHA object with data. */ + return wc_ShaUpdate((wc_Sha*)sha, (const byte*)input, (word32)sz) == 0; +} + +/* Finalize SHA hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA_DIGEST_SIZE bytes. + * @param [in, out] sha SHA context object. + * @return 1 on success. + * @return 0 when sha or output is NULL. + */ +int wolfSSL_SHA_Final(byte* output, WOLFSSL_SHA_CTX* sha) +{ + int ret; + + WOLFSSL_ENTER("SHA_Final"); + + /* Finalize wolfCrypt SHA hash into output. */ + ret = (wc_ShaFinal((wc_Sha*)sha, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA_Free(). */ + wc_ShaFree((wc_Sha*)sha); + + return ret; +} + +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) +/* Apply SHA transformation to the data. + * + * 'data' has words reversed in this function when little endian. + * + * @param [in, out] sha SHA context object. + * @param [in, out] data One block of data to be hashed. + * @return 1 on success. + * @return 0 when sha or data is NULL. + */ +int wolfSSL_SHA_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) +{ + WOLFSSL_ENTER("SHA_Transform"); + +#if defined(LITTLE_ENDIAN_ORDER) + /* Byte reversal done outside transform. */ + if ((sha != NULL) && (data != NULL)) { + ByteReverseWords((word32*)data, (word32*)data, WC_SHA_BLOCK_SIZE); + } +#endif + /* Transform block of data with wolfCrypt SHA object. */ + return wc_ShaTransform((wc_Sha*)sha, data) == 0; +} +#endif + +/* Initialize SHA-1 hash operation. + * + * @param [in, out] sha SHA context object. + * @return 1 on success. + * @return 0 when sha is NULL. + */ +int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX* sha) +{ + WOLFSSL_ENTER("SHA1_Init"); + + return SHA_Init(sha); +} + + +/* Update SHA-1 hash with data. + * + * @param [in, out] sha SHA context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha is NULL. + */ +int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX* sha, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA1_Update"); + + return SHA_Update(sha, input, sz); +} + +/* Finalize SHA-1 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA_DIGEST_SIZE bytes. + * @param [in, out] sha SHA context object. + * @return 1 on success. + * @return 0 when sha or output is NULL. + */ +int wolfSSL_SHA1_Final(byte* output, WOLFSSL_SHA_CTX* sha) +{ + WOLFSSL_ENTER("SHA1_Final"); + + return SHA_Final(output, sha); +} + +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) +/* Apply SHA-1 transformation to the data. + * + * 'data' has words reversed in this function when little endian. + * + * @param [in, out] sha SHA context object. + * @param [in, out] data One block of data to be hashed. + * @return 1 on success. + * @return 0 when sha or data is NULL. + */ +int wolfSSL_SHA1_Transform(WOLFSSL_SHA_CTX* sha, const unsigned char* data) +{ + WOLFSSL_ENTER("SHA1_Transform"); + + return wolfSSL_SHA_Transform(sha, data); +} +#endif +#endif /* !NO_SHA */ + +#ifndef NO_SHA256 +#ifdef WOLFSSL_SHA224 +/* Initialize SHA-224 hash operation. + * + * @param [in, out] sha224 SHA-224 context object. + * @return 1 on success. + * @return 0 when sha224 is NULL. + */ +int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX* sha224) +{ + /* Ensure WOLFSSL_SHA224_CTX is big enough for wolfCrypt wc_Sha224. */ + typedef char sha_test[sizeof(SHA224_CTX) >= sizeof(wc_Sha224) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA224_Init"); + + /* Initialize wolfCrypt SHA-224 object. */ + return wc_InitSha224((wc_Sha224*)sha224) == 0; +} + +/* Update SHA-224 hash with data. + * + * @param [in, out] sha224 SHA-224 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha224 is NULL. + */ +int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX* sha224, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA224_Update"); + + /* Update wolfCrypt SHA-224 object with data. */ + return wc_Sha224Update((wc_Sha224*)sha224, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA-224 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA224_DIGEST_SIZE bytes. + * @param [in, out] sha224 SHA-224 context object. + * @return 1 on success. + * @return 0 when sha224 or output is NULL. + */ +int wolfSSL_SHA224_Final(byte* output, WOLFSSL_SHA224_CTX* sha224) +{ + int ret; + + WOLFSSL_ENTER("SHA224_Final"); + + /* Finalize wolfCrypt SHA-224 hash into output. */ + ret = (wc_Sha224Final((wc_Sha224*)sha224, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA224_Free(). */ + wc_Sha224Free((wc_Sha224*)sha224); + + return ret; +} + +#endif /* WOLFSSL_SHA224 */ + +/* Initialize SHA-256 hash operation. + * + * @param [in, out] sha256 SHA-256 context object. + * @return 1 on success. + * @return 0 when sha256 is NULL. + */ +int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX* sha256) +{ + /* Ensure WOLFSSL_SHA256_CTX is big enough for wolfCrypt wc_Sha256. */ + typedef char sha_test[sizeof(SHA256_CTX) >= sizeof(wc_Sha256) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA256_Init"); + + /* Initialize wolfCrypt SHA-256 object. */ + return wc_InitSha256((wc_Sha256*)sha256) == 0; +} + +/* Update SHA-256 hash with data. + * + * @param [in, out] sha256 SHA-256 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha256 is NULL. + */ +int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX* sha256, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA256_Update"); + + /* Update wolfCrypt SHA-256 object with data. */ + return wc_Sha256Update((wc_Sha256*)sha256, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA-256 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA256_DIGEST_SIZE bytes. + * @param [in, out] sha256 SHA-256 context object. + * @return 1 on success. + * @return 0 when sha256 or output is NULL. + */ +int wolfSSL_SHA256_Final(byte* output, WOLFSSL_SHA256_CTX* sha256) +{ + int ret; + + WOLFSSL_ENTER("SHA256_Final"); + + /* Finalize wolfCrypt SHA-256 hash into output. */ + ret = (wc_Sha256Final((wc_Sha256*)sha256, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA256_Free(). */ + wc_Sha256Free((wc_Sha256*)sha256); + + return ret; +} + +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ + !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH) && \ + !defined(WOLFSSL_KCAPI_HASH) /* doesn't support direct transform */ +/* Apply SHA-256 transformation to the data. + * + * 'data' has words reversed in this function when little endian. + * + * @param [in, out] sha256 SHA256 context object. + * @param [in, out] data One block of data to be hashed. + * @return 1 on success. + * @return 0 when sha256 or data is NULL. + */ +int wolfSSL_SHA256_Transform(WOLFSSL_SHA256_CTX* sha256, + const unsigned char* data) +{ + WOLFSSL_ENTER("SHA256_Transform"); + +#if defined(LITTLE_ENDIAN_ORDER) + /* Byte reversal done outside transform. */ + if ((sha256 != NULL) && (data != NULL)) { + ByteReverseWords((word32*)data, (word32*)data, WC_SHA256_BLOCK_SIZE); + } +#endif + /* Transform block of data with wolfCrypt SHA-256 object. */ + return wc_Sha256Transform((wc_Sha256*)sha256, data) == 0; +} +#endif +#endif /* !NO_SHA256 */ + +#ifdef WOLFSSL_SHA384 + +/* Initialize SHA-384 hash operation. + * + * @param [in, out] sha384 SHA-384 context object. + * @return 1 on success. + * @return 0 when sha384 is NULL. + */ +int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX* sha384) +{ + /* Ensure WOLFSSL_SHA384_CTX is big enough for wolfCrypt wc_Sha384. */ + typedef char sha_test[sizeof(SHA384_CTX) >= sizeof(wc_Sha384) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA384_Init"); + + /* Initialize wolfCrypt SHA-384 object. */ + return wc_InitSha384((wc_Sha384*)sha384) == 0; +} + +/* Update SHA-384 hash with data. + * + * @param [in, out] sha384 SHA-384 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha384 is NULL. + */ +int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX* sha384, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA384_Update"); + + /* Update wolfCrypt SHA-384 object with data. */ + return wc_Sha384Update((wc_Sha384*)sha384, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA-384 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA384_DIGEST_SIZE bytes. + * @param [in, out] sha384 SHA-384 context object. + * @return 1 on success. + * @return 0 when sha384 or output is NULL. + */ +int wolfSSL_SHA384_Final(byte* output, WOLFSSL_SHA384_CTX* sha384) +{ + int ret; + + WOLFSSL_ENTER("SHA384_Final"); + + /* Finalize wolfCrypt SHA-384 hash into output. */ + ret = (wc_Sha384Final((wc_Sha384*)sha384, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA384_Free(). */ + wc_Sha384Free((wc_Sha384*)sha384); + + return ret; +} +#endif /* WOLFSSL_SHA384 */ + +#ifdef WOLFSSL_SHA512 +/* Initialize SHA-512 hash operation. + * + * @param [in, out] sha512 SHA-512 context object. + * @return 1 on success. + * @return 0 when sha512 is NULL. + */ +int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX* sha512) +{ + /* Ensure WOLFSSL_SHA512_CTX is big enough for wolfCrypt wc_Sha512. */ + typedef char sha_test[sizeof(SHA512_CTX) >= sizeof(wc_Sha512) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA512_Init"); + + /* Initialize wolfCrypt SHA-512 object. */ + return wc_InitSha512((wc_Sha512*)sha512) == 0; +} + +/* Update SHA-512 hash with data. + * + * @param [in, out] sha512 SHA-512 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha512 is NULL. + */ +int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX* sha512, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA512_Update"); + + /* Update wolfCrypt SHA-512 object with data. */ + return wc_Sha512Update((wc_Sha512*)sha512, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA-512 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA512_DIGEST_SIZE bytes. + * @param [in, out] sha512 SHA-512 context object. + * @return 1 on success. + * @return 0 when sha512 or output is NULL. + */ +int wolfSSL_SHA512_Final(byte* output, WOLFSSL_SHA512_CTX* sha512) +{ + int ret; + + WOLFSSL_ENTER("SHA512_Final"); + + /* Finalize wolfCrypt SHA-512 hash into output. */ + ret = (wc_Sha512Final((wc_Sha512*)sha512, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA512_Free(). */ + wc_Sha512Free((wc_Sha512*)sha512); + + return ret; +} + +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ + !defined(WOLFSSL_KCAPI_HASH) /* doesn't support direct transform */ +/* Apply SHA-512 transformation to the data. + * + * @param [in, out] sha512 SHA512 context object. + * @param [in] data One block of data to be hashed. + * @return 1 on success. + * @return 0 when sha512 or data is NULL. + */ +int wolfSSL_SHA512_Transform(WOLFSSL_SHA512_CTX* sha512, + const unsigned char* data) +{ + WOLFSSL_ENTER("SHA512_Transform"); + + /* Transform block of data with wolfCrypt SHA-512 object. */ + return wc_Sha512Transform((wc_Sha512*)sha512, data) == 0; +} +#endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) && !WOLFSSL_KCAPI_HASH */ + +#if !defined(WOLFSSL_NOSHA512_224) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) +/* Initialize SHA-512-224 hash operation. + * + * @param [in, out] sha512 SHA-512-224 context object. + * @return 1 on success. + * @return 0 when sha512 is NULL. + */ +int wolfSSL_SHA512_224_Init(WOLFSSL_SHA512_224_CTX* sha512) +{ + WOLFSSL_ENTER("SHA512_224_Init"); + + /* Initialize wolfCrypt SHA-512-224 object. */ + return wc_InitSha512_224((wc_Sha512*)sha512) == 0; +} + +/* Update SHA-512-224 hash with data. + * + * @param [in, out] sha512 SHA-512-224 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha512 is NULL. + */ +int wolfSSL_SHA512_224_Update(WOLFSSL_SHA512_224_CTX* sha512, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA512_224_Update"); + + /* Update wolfCrypt SHA-512-224 object with data. */ + return wc_Sha512_224Update((wc_Sha512*)sha512, (const byte*)input, + (word32)sz) == 0; +} + +/* Finalize SHA-512-224 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA224_DIGEST_SIZE bytes. + * @param [in, out] sha512 SHA-512-224 context object. + * @return 1 on success. + * @return 0 when sha512 or output is NULL. + */ +int wolfSSL_SHA512_224_Final(byte* output, WOLFSSL_SHA512_224_CTX* sha512) +{ + int ret; + + WOLFSSL_ENTER("SHA512_224_Final"); + + /* Finalize wolfCrypt SHA-512-224 hash into output. */ + ret = (wc_Sha512_224Final((wc_Sha512*)sha512, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA512_224_Free(). */ + wc_Sha512_224Free((wc_Sha512*)sha512); + + return ret; +} + +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) +/* Apply SHA-512-224 transformation to the data. + * + * @param [in, out] sha512 SHA512 context object. + * @param [in] data One block of data to be hashed. + * @return 1 on success. + * @return 0 when sha512 or data is NULL. + */ +int wolfSSL_SHA512_224_Transform(WOLFSSL_SHA512_CTX* sha512, + const unsigned char* data) +{ + WOLFSSL_ENTER("SHA512_224_Transform"); + + /* Transform block of data with wolfCrypt SHA-512-224 object. */ + return wc_Sha512_224Transform((wc_Sha512*)sha512, data) == 0; +} +#endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) */ + +#endif /* !WOLFSSL_NOSHA512_224 && !FIPS ... */ + +#if !defined(WOLFSSL_NOSHA512_256) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) +/* Initialize SHA-512-256 hash operation. + * + * @param [in, out] sha512 SHA-512-256 context object. + * @return 1 on success. + * @return 0 when sha512 is NULL. + */ +int wolfSSL_SHA512_256_Init(WOLFSSL_SHA512_256_CTX* sha) +{ + WOLFSSL_ENTER("SHA512_256_Init"); + + /* Initialize wolfCrypt SHA-512-256 object. */ + return wc_InitSha512_256((wc_Sha512*)sha) == 0; +} + +/* Update SHA-512-256 hash with data. + * + * @param [in, out] sha512 SHA-512-256 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha512 is NULL. + */ +int wolfSSL_SHA512_256_Update(WOLFSSL_SHA512_256_CTX* sha512, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA512_256_Update"); + + /* Update wolfCrypt SHA-512-256 object with data. */ + return wc_Sha512_256Update((wc_Sha512*)sha512, (const byte*)input, + (word32)sz) == 0; +} + +/* Finalize SHA-512-256 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA256_DIGEST_SIZE bytes. + * @param [in, out] sha512 SHA-512-256 context object. + * @return 1 on success. + * @return 0 when sha512 or output is NULL. + */ +int wolfSSL_SHA512_256_Final(byte* output, WOLFSSL_SHA512_256_CTX* sha512) +{ + int ret; + + WOLFSSL_ENTER("SHA512_256_Final"); + + /* Finalize wolfCrypt SHA-512-256 hash into output. */ + ret = (wc_Sha512_256Final((wc_Sha512*)sha512, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA512_256_Free(). */ + wc_Sha512_224Free((wc_Sha512*)sha512); + + return ret; +} + +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) +/* Apply SHA-512-256 transformation to the data. + * + * @param [in, out] sha512 SHA512 context object. + * @param [in] data One block of data to be hashed. + * @return 1 on success. + * @return 0 when sha512 or data is NULL. + */ +int wolfSSL_SHA512_256_Transform(WOLFSSL_SHA512_CTX* sha512, + const unsigned char* data) +{ + WOLFSSL_ENTER("SHA512_256_Transform"); + + /* Transform block of data with wolfCrypt SHA-512-256 object. */ + return wc_Sha512_256Transform((wc_Sha512*)sha512, data) == 0; +} +#endif /* !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) */ +#endif /* !WOLFSSL_NOSHA512_256 && !FIPS ... */ +#endif /* WOLFSSL_SHA512 */ + +#ifdef WOLFSSL_SHA3 +#ifndef WOLFSSL_NOSHA3_224 +/* Initialize SHA3-224 hash operation. + * + * @param [in, out] sha3_224 SHA3-224 context object. + * @return 1 on success. + * @return 0 when sha3_224 is NULL. + */ +int wolfSSL_SHA3_224_Init(WOLFSSL_SHA3_224_CTX* sha3_224) +{ + /* Ensure WOLFSSL_SHA3_224_CTX is big enough for wolfCrypt wc_Sha3. */ + typedef char sha_test[sizeof(SHA3_224_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA3_224_Init"); + + /* Initialize wolfCrypt SHA3-224 object. */ + return wc_InitSha3_224((wc_Sha3*)sha3_224, NULL, INVALID_DEVID) == 0; +} + +/* Update SHA3-224 hash with data. + * + * @param [in, out] sha3 SHA3-224 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha3 is NULL. + */ +int wolfSSL_SHA3_224_Update(WOLFSSL_SHA3_224_CTX* sha3, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA3_224_Update"); + + /* Update wolfCrypt SHA3-224 object with data. */ + return wc_Sha3_224_Update((wc_Sha3*)sha3, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA3-224 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA3_224_DIGEST_SIZE bytes. + * @param [in, out] sha3 SHA3-224 context object. + * @return 1 on success. + * @return 0 when sha3 or output is NULL. + */ +int wolfSSL_SHA3_224_Final(byte* output, WOLFSSL_SHA3_224_CTX* sha3) +{ + int ret; + + WOLFSSL_ENTER("SHA3_224_Final"); + + /* Finalize wolfCrypt SHA3-224 hash into output. */ + ret = (wc_Sha3_224_Final((wc_Sha3*)sha3, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA3_224_Free(). */ + wc_Sha3_224_Free((wc_Sha3*)sha3); + + return ret; +} +#endif /* WOLFSSL_NOSHA3_224 */ + +#ifndef WOLFSSL_NOSHA3_256 +/* Initialize SHA3-256 hash operation. + * + * @param [in, out] sha3_256 SHA3-256 context object. + * @return 1 on success. + * @return 0 when sha3_256 is NULL. + */ +int wolfSSL_SHA3_256_Init(WOLFSSL_SHA3_256_CTX* sha3_256) +{ + /* Ensure WOLFSSL_SHA3_256_CTX is big enough for wolfCrypt wc_Sha3. */ + typedef char sha_test[sizeof(SHA3_256_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA3_256_Init"); + + /* Initialize wolfCrypt SHA3-256 object. */ + return wc_InitSha3_256((wc_Sha3*)sha3_256, NULL, INVALID_DEVID) == 0; +} + +/* Update SHA3-256 hash with data. + * + * @param [in, out] sha3 SHA3-256 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha3 is NULL. + */ +int wolfSSL_SHA3_256_Update(WOLFSSL_SHA3_256_CTX* sha3, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA3_256_Update"); + + /* Update wolfCrypt SHA3-256 object with data. */ + return wc_Sha3_256_Update((wc_Sha3*)sha3, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA3-256 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA3_256_DIGEST_SIZE bytes. + * @param [in, out] sha3 SHA3-256 context object. + * @return 1 on success. + * @return 0 when sha3 or output is NULL. + */ +int wolfSSL_SHA3_256_Final(byte* output, WOLFSSL_SHA3_256_CTX* sha3) +{ + int ret; + + WOLFSSL_ENTER("SHA3_256_Final"); + + /* Finalize wolfCrypt SHA3-256 hash into output. */ + ret = (wc_Sha3_256_Final((wc_Sha3*)sha3, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA3_256_Free(). */ + wc_Sha3_256_Free((wc_Sha3*)sha3); + + return ret; +} +#endif /* WOLFSSL_NOSHA3_256 */ + +#ifndef WOLFSSL_NOSHA3_384 +/* Initialize SHA3-384 hash operation. + * + * @param [in, out] sha3_384 SHA3-384 context object. + * @return 1 on success. + * @return 0 when sha3_384 is NULL. + */ +int wolfSSL_SHA3_384_Init(WOLFSSL_SHA3_384_CTX* sha3_384) +{ + /* Ensure WOLFSSL_SHA3_384_CTX is big enough for wolfCrypt wc_Sha3. */ + typedef char sha_test[sizeof(SHA3_384_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA3_384_Init"); + + /* Initialize wolfCrypt SHA3-384 object. */ + return wc_InitSha3_384((wc_Sha3*)sha3_384, NULL, INVALID_DEVID) == 0; +} + +/* Update SHA3-384 hash with data. + * + * @param [in, out] sha3 SHA3-384 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha3 is NULL. + */ +int wolfSSL_SHA3_384_Update(WOLFSSL_SHA3_384_CTX* sha3, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA3_384_Update"); + + /* Update wolfCrypt SHA3-384 object with data. */ + return wc_Sha3_384_Update((wc_Sha3*)sha3, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA3-384 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA3_384_DIGEST_SIZE bytes. + * @param [in, out] sha3 SHA3-384 context object. + * @return 1 on success. + * @return 0 when sha3 or output is NULL. + */ +int wolfSSL_SHA3_384_Final(byte* output, WOLFSSL_SHA3_384_CTX* sha3) +{ + int ret; + + WOLFSSL_ENTER("SHA3_384_Final"); + + /* Finalize wolfCrypt SHA3-384 hash into output. */ + ret = (wc_Sha3_384_Final((wc_Sha3*)sha3, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA3_384_Free(). */ + wc_Sha3_384_Free((wc_Sha3*)sha3); + + return ret; +} +#endif /* WOLFSSL_NOSHA3_384 */ + +#ifndef WOLFSSL_NOSHA3_512 +/* Initialize SHA3-512 hash operation. + * + * @param [in, out] sha3_512 SHA3-512 context object. + * @return 1 on success. + * @return 0 when sha3_512 is NULL. + */ +int wolfSSL_SHA3_512_Init(WOLFSSL_SHA3_512_CTX* sha3_512) +{ + /* Ensure WOLFSSL_SHA3_512_CTX is big enough for wolfCrypt wc_Sha3. */ + typedef char sha_test[sizeof(SHA3_512_CTX) >= sizeof(wc_Sha3) ? 1 : -1]; + (void)sizeof(sha_test); + + WOLFSSL_ENTER("SHA3_512_Init"); + + /* Initialize wolfCrypt SHA3-512 object. */ + return wc_InitSha3_512((wc_Sha3*)sha3_512, NULL, INVALID_DEVID) == 0; +} + +/* Update SHA3-512 hash with data. + * + * @param [in, out] sha3 SHA3-512 context object. + * @param [in] input Data to be hashed. + * @param [in] sz Length of data in bytes. + * @return 1 on success. + * @return 0 when sha3 is NULL. + */ +int wolfSSL_SHA3_512_Update(WOLFSSL_SHA3_512_CTX* sha3, const void* input, + unsigned long sz) +{ + WOLFSSL_ENTER("SHA3_512_Update"); + + /* Update wolfCrypt SHA3-512 object with data. */ + return wc_Sha3_512_Update((wc_Sha3*)sha3, (const byte*)input, (word32)sz) + == 0; +} + +/* Finalize SHA3-512 hash and return output. + * + * @param [out] output Hash output. + * Must be able to hold SHA3_512_DIGEST_SIZE bytes. + * @param [in, out] sha3 SHA3-512 context object. + * @return 1 on success. + * @return 0 when sha3 or output is NULL. + */ +int wolfSSL_SHA3_512_Final(byte* output, WOLFSSL_SHA3_512_CTX* sha3) +{ + int ret; + + WOLFSSL_ENTER("SHA3_512_Final"); + + /* Finalize wolfCrypt SHA3-512 hash into output. */ + ret = (wc_Sha3_512_Final((wc_Sha3*)sha3, output) == 0); + /* Free resources here, as OpenSSL API doesn't include SHA3_512_Free(). */ + wc_Sha3_512_Free((wc_Sha3*)sha3); + + return ret; +} +#endif /* WOLFSSL_NOSHA3_512 */ +#endif /* WOLFSSL_SHA3 */ +#endif /* OPENSSL_EXTRA || HAVE_CURL */ + +#if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \ + defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \ + defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \ + defined(WOLFSSL_HAPROXY) + +#ifndef NO_SHA +/* One shot SHA1 hash of data. + * + * When hash is null, a static buffer of SHA_DIGEST_SIZE is used. + * When the static buffer is used this function is not thread safe. + * + * @param [in] data Data to hash. + * @param [in] len Size of data in bytes. + * @param [out] hash Buffer to hold digest. May be NULL. + * Must be able to hold SHA_DIGEST_SIZE bytes. + * @return Buffer holding hash on success. + * @return NULL when hashing fails. + */ +unsigned char* wolfSSL_SHA1(const unsigned char* data, size_t len, + unsigned char* hash) +{ + /* Buffer to use when hash is NULL. */ + static byte dgst[WC_SHA_DIGEST_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + wc_Sha* sha; +#else + wc_Sha sha[1]; +#endif + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_SHA1"); + + /* Use static buffer if none passed in. */ + if (hash == NULL) { + WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA1 IS NOT " + "THREAD SAFE WHEN hash == NULL"); + hash = dgst; + } + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate dynamic memory for a wolfSSL SHA object. */ + sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), NULL, DYNAMIC_TYPE_DIGEST); + if (sha == NULL) { + ret = MEMORY_E; + } +#endif + + if (ret == 0) { + /* Initialize wolfCrypt SHA object. */ + ret = wc_InitSha_ex(sha, NULL, INVALID_DEVID); + if (ret != 0) { + WOLFSSL_MSG("SHA1 Init failed"); + hash = NULL; + } + } + if (ret == 0) { + /* Update wolfCrypt SHA object with data. */ + ret = wc_ShaUpdate(sha, (const byte*)data, (word32)len); + if (ret != 0) { + WOLFSSL_MSG("SHA1 Update failed"); + hash = NULL; + } + + if (ret == 0) { + /* Finalize wolfCrypt SHA hash into hash. */ + ret = wc_ShaFinal(sha, hash); + if (ret != 0) { + WOLFSSL_MSG("SHA1 Final failed"); + hash = NULL; + } + } + /* Dispose of dynamic memory associated with SHA object. */ + wc_ShaFree(sha); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Free dynamic memory of a wolfSSL SHA object. */ + XFREE(sha, NULL, DYNAMIC_TYPE_DIGEST); +#endif + return hash; +} +#endif /* ! NO_SHA */ + +#ifdef WOLFSSL_SHA224 +/* One shot SHA-224 hash of data. + * + * When hash is null, a static buffer of SHA224_DIGEST_SIZE is used. + * When the static buffer is used this function is not thread safe. + * + * @param [in] data Data to hash. + * @param [in] len Size of data in bytes. + * @param [out] hash Buffer to hold digest. May be NULL. + * Must be able to hold SHA224_DIGEST_SIZE bytes. + * @return Buffer holding hash on success. + * @return NULL when hashing fails. + */ +unsigned char* wolfSSL_SHA224(const unsigned char* data, size_t len, + unsigned char* hash) +{ + /* Buffer to use when hash is NULL. */ + static byte dgst[WC_SHA224_DIGEST_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + wc_Sha224* sha224; +#else + wc_Sha224 sha224[1]; +#endif + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_SHA224"); + + /* Use static buffer if none passed in. */ + if (hash == NULL) { + WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA224 IS NOT " + "THREAD SAFE WHEN hash == NULL"); + hash = dgst; + } + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate dynamic memory for a wolfSSL SHA-224 object. */ + sha224 = (wc_Sha224*)XMALLOC(sizeof(wc_Sha224), NULL, DYNAMIC_TYPE_DIGEST); + if (sha224 == NULL) { + ret = MEMORY_E; + } +#endif + + if (ret == 0) { + /* Initialize wolfCrypt SHA224 object. */ + ret = wc_InitSha224_ex(sha224, NULL, INVALID_DEVID); + if (ret != 0) { + WOLFSSL_MSG("SHA224 Init failed"); + hash = NULL; + } + } + if (ret == 0) { + /* Update wolfCrypt SHA-224 object with data. */ + ret = wc_Sha224Update(sha224, (const byte*)data, (word32)len); + if (ret != 0) { + WOLFSSL_MSG("SHA224 Update failed"); + hash = NULL; + } + + if (ret == 0) { + /* Finalize wolfCrypt SHA-224 hash into hash. */ + ret = wc_Sha224Final(sha224, hash); + if (ret != 0) { + WOLFSSL_MSG("SHA224 Final failed"); + hash = NULL; + } + } + /* Dispose of dynamic memory associated with SHA-224 object. */ + wc_Sha224Free(sha224); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Free dynamic memory of a wolfSSL SHA-224 object. */ + XFREE(sha224, NULL, DYNAMIC_TYPE_DIGEST); +#endif + return hash; +} +#endif + +#ifndef NO_SHA256 +/* One shot SHA-256 hash of data. + * + * When hash is null, a static buffer of SHA256_DIGEST_SIZE is used. + * When the static buffer is used this function is not thread safe. + * + * @param [in] data Data to hash. + * @param [in] len Size of data in bytes. + * @param [out] hash Buffer to hold digest. May be NULL. + * Must be able to hold SHA256_DIGEST_SIZE bytes. + * @return Buffer holding hash on success. + * @return NULL when hashing fails. + */ +unsigned char* wolfSSL_SHA256(const unsigned char* data, size_t len, + unsigned char* hash) +{ + /* Buffer to use when hash is NULL. */ + static byte dgst[WC_SHA256_DIGEST_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + wc_Sha256* sha256; +#else + wc_Sha256 sha256[1]; +#endif + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_SHA256"); + + /* Use static buffer if none passed in. */ + if (hash == NULL) { + WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA256 IS NOT " + "THREAD SAFE WHEN hash == NULL"); + hash = dgst; + } + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate dynamic memory for a wolfSSL SHA-256 object. */ + sha256 = (wc_Sha256*)XMALLOC(sizeof(wc_Sha256), NULL, DYNAMIC_TYPE_DIGEST); + if (sha256 == NULL) { + ret = MEMORY_E; + } +#endif + + if (ret == 0) { + /* Initialize wolfCrypt SHA256 object. */ + ret = wc_InitSha256_ex(sha256, NULL, INVALID_DEVID); + if (ret != 0) { + WOLFSSL_MSG("SHA256 Init failed"); + hash = NULL; + } + } + if (ret == 0) { + /* Update wolfCrypt SHA-256 object with data. */ + ret = wc_Sha256Update(sha256, (const byte*)data, (word32)len); + if (ret != 0) { + WOLFSSL_MSG("SHA256 Update failed"); + hash = NULL; + } + + if (ret == 0) { + /* Finalize wolfCrypt SHA-256 hash into hash. */ + ret = wc_Sha256Final(sha256, hash); + if (ret != 0) { + WOLFSSL_MSG("SHA256 Final failed"); + hash = NULL; + } + } + /* Dispose of dynamic memory associated with SHA-256 object. */ + wc_Sha256Free(sha256); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Free dynamic memory of a wolfSSL SHA object. */ + XFREE(sha256, NULL, DYNAMIC_TYPE_DIGEST); +#endif + return hash; +} +#endif /* ! NO_SHA256 */ + +#ifdef WOLFSSL_SHA384 +/* One shot SHA-384 hash of data. + * + * When hash is null, a static buffer of SHA384_DIGEST_SIZE is used. + * When the static buffer is used this function is not thread safe. + * + * @param [in] data Data to hash. + * @param [in] len Size of data in bytes. + * @param [out] hash Buffer to hold digest. May be NULL. + * Must be able to hold SHA384_DIGEST_SIZE bytes. + * @return Buffer holding hash on success. + * @return NULL when hashing fails. + */ +unsigned char* wolfSSL_SHA384(const unsigned char* data, size_t len, + unsigned char* hash) +{ + /* Buffer to use when hash is NULL. */ + static byte dgst[WC_SHA384_DIGEST_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + wc_Sha384* sha384; +#else + wc_Sha384 sha384[1]; +#endif + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_SHA384"); + + /* Use static buffer if none passed in. */ + if (hash == NULL) { + WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA384 IS NOT " + "THREAD SAFE WHEN hash == NULL"); + hash = dgst; + } + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate dynamic memory for a wolfSSL SHA-384 object. */ + sha384 = (wc_Sha384*)XMALLOC(sizeof(wc_Sha384), NULL, DYNAMIC_TYPE_DIGEST); + if (sha384 == NULL) { + ret = MEMORY_E; + } +#endif + + if (ret == 0) { + /* Initialize wolfCrypt SHA384 object. */ + ret = wc_InitSha384_ex(sha384, NULL, INVALID_DEVID); + if (ret != 0) { + WOLFSSL_MSG("SHA384 Init failed"); + hash = NULL; + } + } + if (ret == 0) { + /* Update wolfCrypt SHA-384 object with data. */ + ret = wc_Sha384Update(sha384, (const byte*)data, (word32)len); + if (ret != 0) { + WOLFSSL_MSG("SHA384 Update failed"); + hash = NULL; + } + + if (ret == 0) { + /* Finalize wolfCrypt SHA-384 hash into hash. */ + ret = wc_Sha384Final(sha384, hash); + if (ret != 0) { + WOLFSSL_MSG("SHA384 Final failed"); + hash = NULL; + } + } + /* Dispose of dynamic memory associated with SHA-384 object. */ + wc_Sha384Free(sha384); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Free dynamic memory of a wolfSSL SHA-384 object. */ + XFREE(sha384, NULL, DYNAMIC_TYPE_DIGEST); +#endif + return hash; +} +#endif /* WOLFSSL_SHA384 */ + +#if defined(WOLFSSL_SHA512) +/* One shot SHA-512 hash of data. + * + * When hash is null, a static buffer of SHA512_DIGEST_SIZE is used. + * When the static buffer is used this function is not thread safe. + * + * @param [in] data Data to hash. + * @param [in] len Size of data in bytes. + * @param [out] hash Buffer to hold digest. May be NULL. + * Must be able to hold SHA512_DIGEST_SIZE bytes. + * @return Buffer holding hash on success. + * @return NULL when hashing fails. + */ +unsigned char* wolfSSL_SHA512(const unsigned char* data, size_t len, + unsigned char* hash) +{ + /* Buffer to use when hash is NULL. */ + static byte dgst[WC_SHA512_DIGEST_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + wc_Sha512* sha512; +#else + wc_Sha512 sha512[1]; +#endif + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_SHA512"); + + /* Use static buffer if none passed in. */ + if (hash == NULL) { + WOLFSSL_MSG("STATIC BUFFER BEING USED. wolfSSL_SHA512 IS NOT " + "THREAD SAFE WHEN hash == NULL"); + hash = dgst; + } + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate dynamic memory for a wolfSSL SHA-512 object. */ + sha512 = (wc_Sha512*)XMALLOC(sizeof(wc_Sha512), NULL, DYNAMIC_TYPE_DIGEST); + if (sha512 == NULL) { + ret = MEMORY_E; + } +#endif + + if (ret == 0) { + /* Initialize wolfCrypt SHA512 object. */ + ret = wc_InitSha512_ex(sha512, NULL, INVALID_DEVID); + if (ret != 0) { + WOLFSSL_MSG("SHA512 Init failed"); + hash = NULL; + } + } + if (ret == 0) { + /* Update wolfCrypt SHA-512 object with data. */ + ret = wc_Sha512Update(sha512, (const byte*)data, (word32)len); + if (ret != 0) { + WOLFSSL_MSG("SHA512 Update failed"); + hash = NULL; + } + + if (ret == 0) { + /* Finalize wolfCrypt SHA-512 hash into hash. */ + ret = wc_Sha512Final(sha512, hash); + if (ret != 0) { + WOLFSSL_MSG("SHA512 Final failed"); + hash = NULL; + } + } + /* Dispose of dynamic memory associated with SHA-512 object. */ + wc_Sha512Free(sha512); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Free dynamic memory of a wolfSSL SHA-512 object. */ + XFREE(sha512, NULL, DYNAMIC_TYPE_DIGEST); +#endif + return hash; +} +#endif /* WOLFSSL_SHA512 */ +#endif /* OPENSSL_EXTRA || HAVE_LIGHTY || WOLFSSL_MYSQL_COMPATIBLE || + * HAVE_STUNNEL || WOLFSSL_NGINX || HAVE_POCO_LIB || WOLFSSL_HAPROXY */ + +/******************************************************************************* + * END OF Digest APIs + ******************************************************************************/ + +/******************************************************************************* + * START OF HMAC API + ******************************************************************************/ + +/* _Internal Hmac object initialization. */ +#define _HMAC_Init _InitHmac + +#if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) + +/* + * Helper Functions + */ + +/* Copy a wolfSSL HMAC object. + * + * Requires that hash structures have no dynamic parts to them. + * + * @param [out] dst Copy into this object. + * @param [in] src Copy from this object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_HmacCopy(Hmac* dst, Hmac* src) +{ + void* heap; + int ret = 1; + +#ifndef HAVE_FIPS + heap = src->heap; +#else + heap = NULL; +#endif + + /* Initialize the destination object to reset state. */ + if (wc_HmacInit(dst, heap, 0) != 0) { + ret = 0; + } + + if (ret == 1) { + int rc; + + /* Copy the digest object based on the MAC type. */ + switch (src->macType) { + #ifndef NO_MD5 + case WC_MD5: + rc = wc_Md5Copy(&src->hash.md5, &dst->hash.md5); + break; + #endif /* !NO_MD5 */ + + #ifndef NO_SHA + case WC_SHA: + rc = wc_ShaCopy(&src->hash.sha, &dst->hash.sha); + break; + #endif /* !NO_SHA */ + + #ifdef WOLFSSL_SHA224 + case WC_SHA224: + rc = wc_Sha224Copy(&src->hash.sha224, &dst->hash.sha224); + break; + #endif /* WOLFSSL_SHA224 */ + + #ifndef NO_SHA256 + case WC_SHA256: + rc = wc_Sha256Copy(&src->hash.sha256, &dst->hash.sha256); + break; + #endif /* !NO_SHA256 */ + + #ifdef WOLFSSL_SHA384 + case WC_SHA384: + rc = wc_Sha384Copy(&src->hash.sha384, &dst->hash.sha384); + break; + #endif /* WOLFSSL_SHA384 */ + #ifdef WOLFSSL_SHA512 + case WC_SHA512: + rc = wc_Sha512Copy(&src->hash.sha512, &dst->hash.sha512); + break; + #endif /* WOLFSSL_SHA512 */ +#ifdef WOLFSSL_SHA3 + #ifndef WOLFSSL_NOSHA3_224 + case WC_SHA3_224: + rc = wc_Sha3_224_Copy(&src->hash.sha3, &dst->hash.sha3); + break; + #endif /* WOLFSSL_NO_SHA3_224 */ + #ifndef WOLFSSL_NOSHA3_256 + case WC_SHA3_256: + rc = wc_Sha3_256_Copy(&src->hash.sha3, &dst->hash.sha3); + break; + #endif /* WOLFSSL_NO_SHA3_256 */ + #ifndef WOLFSSL_NOSHA3_384 + case WC_SHA3_384: + rc = wc_Sha3_384_Copy(&src->hash.sha3, &dst->hash.sha3); + break; + #endif /* WOLFSSL_NO_SHA3_384 */ + #ifndef WOLFSSL_NOSHA3_512 + case WC_SHA3_512: + rc = wc_Sha3_512_Copy(&src->hash.sha3, &dst->hash.sha3); + break; + #endif /* WOLFSSL_NO_SHA3_512 */ +#endif /* WOLFSSL_SHA3 */ + + default: + /* Digest algorithm not supported. */ + rc = BAD_FUNC_ARG; + } + + /* Check result of digest object copy. */ + if (rc != 0) { + ret = 0; + } + } + + if (ret == 1) { + /* Copy the pads which are derived from the key. */ + XMEMCPY((byte*)dst->ipad, (byte*)src->ipad, WC_HMAC_BLOCK_SIZE); + XMEMCPY((byte*)dst->opad, (byte*)src->opad, WC_HMAC_BLOCK_SIZE); + /* Copy the inner hash that is the current state. */ + XMEMCPY((byte*)dst->innerHash, (byte*)src->innerHash, + WC_MAX_DIGEST_SIZE); + /* Copy other fields. */ + #ifndef HAVE_FIPS + dst->heap = heap; + #endif + dst->macType = src->macType; + dst->innerHashKeyed = src->innerHashKeyed; + +#ifdef WOLFSSL_ASYNC_CRYPT + XMEMCPY(&dst->asyncDev, &src->asyncDev, sizeof(WC_ASYNC_DEV)); + dst->keyLen = src->keyLen; + #ifdef HAVE_CAVIUM + /* Copy the dynamic data. */ + dst->data = (byte*)XMALLOC(src->dataLen, dst->heap, DYNAMIC_TYPE_HMAC); + if (dst->data == NULL) { + ret = BUFFER_E; + } + else { + XMEMCPY(dst->data, src->data, src->dataLen); + dst->dataLen = src->dataLen; + } + #endif /* HAVE_CAVIUM */ +#endif /* WOLFSSL_ASYNC_CRYPT */ + } + + return ret; +} + + +/* + * wolfSSL_HMAC_CTX APIs. + */ + +/* Allocate a new HMAC context object and initialize. + * + * @return A cleared HMAC context object on success. + * @return NULL on failure. + */ +WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void) +{ + WOLFSSL_HMAC_CTX* hmac_ctx; + + /* Allocate dynamic memory for HMAC context object. */ + hmac_ctx = (WOLFSSL_HMAC_CTX*)XMALLOC(sizeof(WOLFSSL_HMAC_CTX), NULL, + DYNAMIC_TYPE_OPENSSL); + if (hmac_ctx != NULL) { + /* Initialize HMAC context object. */ + wolfSSL_HMAC_CTX_Init(hmac_ctx); + } + + return hmac_ctx; +} + +/* Initialize a HMAC context object. + * + * Not an OpenSSL compatibility API. + * + * @param [in, out] ctx HMAC context object. + * @return 1 indicating success. + */ +int wolfSSL_HMAC_CTX_Init(WOLFSSL_HMAC_CTX* ctx) +{ + WOLFSSL_MSG("wolfSSL_HMAC_CTX_Init"); + + if (ctx != NULL) { + /* Clear all fields. */ + XMEMSET(ctx, 0, sizeof(WOLFSSL_HMAC_CTX)); + /* type field is 0 == WC_HASH_TYPE_NONE. */ + /* TODO: for FIPS and selftest 0 == WC_HASH_TYPE_MD5 instead. */ + } + + return 1; +} + +/* Deep copy of information from one HMAC context object to another. + * + * @param [out] dst Copy into this object. + * @param [in] src Copy from this object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_HMAC_CTX_copy(WOLFSSL_HMAC_CTX* dst, WOLFSSL_HMAC_CTX* src) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_HMAC_CTX_copy"); + + /* Validate parameters. */ + if ((dst == NULL) || (src == NULL)) { + ret = 0; + } + + if (ret == 1) { + /* Copy hash type. */ + dst->type = src->type; + /* Move pads derived from key into save space. */ + XMEMCPY((byte *)&dst->save_ipad, (byte *)&src->hmac.ipad, + WC_HMAC_BLOCK_SIZE); + XMEMCPY((byte *)&dst->save_opad, (byte *)&src->hmac.opad, + WC_HMAC_BLOCK_SIZE); + /* Copy the wolfSSL Hmac ocbject. */ + ret = wolfSSL_HmacCopy(&dst->hmac, &src->hmac); + } + + return ret; +} + +/* Cleanup internal state of HMAC context object. + * + * Not an OpenSSL compatibility API. + * + * @param [in, out] ctx HMAC context object. + */ +void wolfSSL_HMAC_CTX_cleanup(WOLFSSL_HMAC_CTX* ctx) +{ + if (ctx != NULL) { + /* Cleanup HMAC operation data. */ + wolfSSL_HMAC_cleanup(ctx); + } +} + +/* Free HMAC context object. + * + * ctx is deallocated and can no longer be used after this call. + * + * @param [in] ctx HMAC context object. + */ +void wolfSSL_HMAC_CTX_free(WOLFSSL_HMAC_CTX* ctx) +{ + if (ctx != NULL) { + /* Cleanup HMAC context object, including freeing dynamic data. */ + wolfSSL_HMAC_CTX_cleanup(ctx); + /* Dispose of the memory for the HMAC context object. */ + XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); + } +} + +/* Get the EVP digest of the HMAC context. + * + * @param [in] ctx HMAC context object. + * @return EVP digest object. + * @return NULL when ctx is NULL or EVP digest not set. + */ +const WOLFSSL_EVP_MD* wolfSSL_HMAC_CTX_get_md(const WOLFSSL_HMAC_CTX* ctx) +{ + const WOLFSSL_EVP_MD* ret = NULL; + + if (ctx != NULL) { + /* Get EVP digest based on digest type. */ + ret = wolfSSL_macType2EVP_md((enum wc_HashType)ctx->type); + } + + return ret; +} + +/* + * wolfSSL_HMAC APIs. + */ + +/* Initialize the HMAC operation. + * + * @param [in, out] ctx HMAC context object. + * @param [in] key Array of bytes representing key. + * May be NULL indicating to use the same key as + * previously. + * @param [in] keySz Number of bytes in key. + * 0+ in non-FIPS, 14+ in FIPS. + * @param [in] type EVP digest indicate digest type. + * May be NULL if initialized previously. + * @param [in] e wolfSSL engine. Ignored. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_HMAC_Init_ex(WOLFSSL_HMAC_CTX* ctx, const void* key, int keySz, + const EVP_MD* type, WOLFSSL_ENGINE* e) +{ + WOLFSSL_ENTER("wolfSSL_HMAC_Init_ex"); + + /* WOLFSSL_ENGINE not used, call wolfSSL_HMAC_Init */ + (void)e; + + return wolfSSL_HMAC_Init(ctx, key, keySz, type); +} + +/* Initialize the HMAC operation. + * + * @param [in, out] ctx HMAC context object. + * @param [in] key Array of bytes representing key. + * May be NULL indicating to use the same key as + * previously. + * @param [in] keySz Number of bytes in key. + * 0+ in non-FIPS, 14+ in FIPS. + * @param [in] type EVP digest indicate digest type. + * May be NULL if initialized previously. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_HMAC_Init(WOLFSSL_HMAC_CTX* ctx, const void* key, int keylen, + const EVP_MD* type) +{ + int ret = 1; + void* heap = NULL; + int rc; + + WOLFSSL_MSG("wolfSSL_HMAC_Init"); + + /* Validate parameters. */ + if (ctx == NULL) { + WOLFSSL_MSG("no ctx on init"); + ret = 0; + } + /* Digest type must have been previously set if not specified. */ + if ((ret == 1) && (type == NULL) && (ctx->type == (int)WC_HASH_TYPE_NONE)) { + WOLFSSL_MSG("no hash type"); + ret = 0; + } + /* wolfSSL HMAC object must have been setup with a key if not specified. */ + if ((ret == 1) && (key == NULL) && + (ctx->hmac.macType == (int)WC_HASH_TYPE_NONE)) { + WOLFSSL_MSG("wolfCrypt hash not setup"); + ret = 0; + } + + if (ret == 1) { + #ifndef HAVE_FIPS + heap = ctx->hmac.heap; + #endif + + if (type != NULL) { + WOLFSSL_MSG("init has type"); + /* Get the digest type based on EVP digest. */ + if (wolfssl_evp_md_to_hash_type(type, &ctx->type) != 0) { + WOLFSSL_MSG("bad init type"); + ret = 0; + } + } + } + + if (ret == 1) { + /* Check if init has been called before */ + int inited = (ctx->hmac.macType != WC_HASH_TYPE_NONE); + /* Free if wolfSSL HMAC object when initialized. */ + if (inited) { + wc_HmacFree(&ctx->hmac); + } + /* Initialize wolfSSL HMAC object for new HMAC operation. */ + rc = wc_HmacInit(&ctx->hmac, NULL, INVALID_DEVID); + if (rc != 0) { + ret = 0; + } + } + if ((ret == 1) && (key != NULL)) { + /* Set the key into wolfSSL HMAC object. */ + rc = wc_HmacSetKey(&ctx->hmac, ctx->type, (const byte*)key, + (word32)keylen); + if (rc != 0) { + /* in FIPS mode a key < 14 characters will fail here */ + WOLFSSL_MSG("hmac set key error"); + WOLFSSL_ERROR(rc); + wc_HmacFree(&ctx->hmac); + ret = 0; + } + if (ret == 1) { + /* Save the pads which are derived from the key. Used to re-init. */ + XMEMCPY((byte *)&ctx->save_ipad, (byte *)&ctx->hmac.ipad, + WC_HMAC_BLOCK_SIZE); + XMEMCPY((byte *)&ctx->save_opad, (byte *)&ctx->hmac.opad, + WC_HMAC_BLOCK_SIZE); + } + } + else if (ret == 1) { + WOLFSSL_MSG("recover hmac"); + /* Set state of wolfSSL HMAC object. */ + ctx->hmac.macType = (byte)ctx->type; + ctx->hmac.innerHashKeyed = 0; + /* Restore key by copying in saved pads. */ + XMEMCPY((byte *)&ctx->hmac.ipad, (byte *)&ctx->save_ipad, + WC_HMAC_BLOCK_SIZE); + XMEMCPY((byte *)&ctx->hmac.opad, (byte *)&ctx->save_opad, + WC_HMAC_BLOCK_SIZE); + /* Initialize the wolfSSL HMAC object. */ + rc = _HMAC_Init(&ctx->hmac, ctx->hmac.macType, heap); + if (rc != 0) { + WOLFSSL_MSG("hmac init error"); + WOLFSSL_ERROR(rc); + ret = 0; + } + } + + return ret; +} + +/* Update the HMAC operation with more data. + * + * TODO: 'len' should be a signed type. + * + * @param [in, out] ctx HMAC context object. + * @param [in] data Array of byted to MAC. May be NULL. + * @param [in] len Number of bytes to MAC. May be 0. + * @return 1 on success. + * @return 0 when ctx is NULL or HMAC update fails. + */ +int wolfSSL_HMAC_Update(WOLFSSL_HMAC_CTX* ctx, const unsigned char* data, + int len) +{ + int ret = 1; + + WOLFSSL_MSG("wolfSSL_HMAC_Update"); + + /* Validate parameters. */ + if (ctx == NULL) { + WOLFSSL_MSG("no ctx"); + ret = 0; + } + + /* Update when there is data to add. */ + if ((ret == 1) && (data != NULL) && (len > 0)) { + int rc; + + WOLFSSL_MSG("updating hmac"); + /* Update wolfSSL HMAC object. */ + rc = wc_HmacUpdate(&ctx->hmac, data, (word32)len); + if (rc != 0){ + WOLFSSL_MSG("hmac update error"); + ret = 0; + } + } + + return ret; +} + +/* Finalize HMAC operation. + * + * @param [in, out] ctx HMAC context object. + * @param [out] hash Buffer to hold HMAC result. + * Must be able to hold bytes equivalent to digest size. + * @param [out] len Length of HMAC result. May be NULL. + * @return 1 on success. + * @return 0 when ctx or hash is NULL. + * @return 0 when HMAC finalization fails. + */ +int wolfSSL_HMAC_Final(WOLFSSL_HMAC_CTX* ctx, unsigned char* hash, + unsigned int* len) +{ + int ret = 1; + int rc; + + WOLFSSL_MSG("wolfSSL_HMAC_Final"); + + /* Validate parameters. */ + if ((ctx == NULL) || (hash == NULL)) { + WOLFSSL_MSG("invalid parameter"); + ret = 0; + } + + if (ret == 1) { + WOLFSSL_MSG("final hmac"); + /* Finalize wolfSSL HMAC object. */ + rc = wc_HmacFinal(&ctx->hmac, hash); + if (rc != 0){ + WOLFSSL_MSG("final hmac error"); + ret = 0; + } + } + if ((ret == 1) && (len != NULL)) { + WOLFSSL_MSG("setting output len"); + /* Get the length of the output based on digest type. */ + *len = wolfssl_mac_len((unsigned char)ctx->type); + } + + return ret; +} + + +/* Cleanup the HMAC operation. + * + * Not an OpenSSL compatibility API. + * + * @param [in, out] ctx HMAC context object. + * @return 1 indicating success. + */ +int wolfSSL_HMAC_cleanup(WOLFSSL_HMAC_CTX* ctx) +{ + WOLFSSL_MSG("wolfSSL_HMAC_cleanup"); + + if (ctx != NULL) { + /* Free the dynamic data in the wolfSSL HMAC object. */ + wc_HmacFree(&ctx->hmac); + } + + return 1; +} + +/* HMAC data using the specified EVP digest. + * + * @param [in] evp_md EVP digest. + * @param [in] key Array of bytes representing key. + * @param [in] keySz Number of bytes in key. + * 0+ in non-FIPS, 14+ in FIPS. + * @param [in] data Data to MAC. + * @param [in] len Length in bytes of data to MAC. + * @param [out] md HMAC output. + * @param [out] md_len Length of HMAC output in bytes. May be NULL. + * @return Buffer holding HMAC output. + * @return NULL on failure. + */ +unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key, + int key_len, const unsigned char* data, size_t len, unsigned char* md, + unsigned int* md_len) +{ + unsigned char* ret = NULL; + int rc = 0; + int type = 0; + int hmacLen = 0; +#ifdef WOLFSSL_SMALL_STACK + Hmac* hmac = NULL; +#else + Hmac hmac[1]; +#endif + void* heap = NULL; + + /* Validate parameters. */ + if ((evp_md == NULL) || (key == NULL) || (md == NULL)) { + rc = BAD_FUNC_ARG; + } + + if (rc == 0) { + /* Get the hash type corresponding to the EVP digest. */ + rc = wolfssl_evp_md_to_hash_type(evp_md, &type); + } +#ifdef WOLFSSL_SMALL_STACK + if (rc == 0) { + /* Allocate dynamic memory for a wolfSSL HMAC object. */ + hmac = (Hmac*)XMALLOC(sizeof(Hmac), heap, DYNAMIC_TYPE_HMAC); + if (hmac == NULL) { + rc = MEMORY_E; + } + } +#endif + if (rc == 0) { + /* Get the HMAC output length. */ + hmacLen = (int)wolfssl_mac_len((unsigned char)type); + /* 0 indicates the digest is not supported. */ + if (hmacLen == 0) { + rc = BAD_FUNC_ARG; + } + } + /* Initialize the wolfSSL HMAC object. */ + if ((rc == 0) && (wc_HmacInit(hmac, heap, INVALID_DEVID) == 0)) { + /* Set the key into the wolfSSL HMAC object. */ + rc = wc_HmacSetKey(hmac, type, (const byte*)key, (word32)key_len); + if (rc == 0) { + /* Update the wolfSSL HMAC object with data. */ + rc = wc_HmacUpdate(hmac, data, (word32)len); + } + /* Finalize the wolfSSL HMAC object. */ + if ((rc == 0) && (wc_HmacFinal(hmac, md) == 0)) { + /* Return the length of the HMAC output if required. */ + if (md_len != NULL) { + *md_len = (unsigned int)hmacLen; + } + /* Set the buffer to return. */ + ret = md; + } + /* Dispose of dynamic memory associated with the wolfSSL HMAC object. */ + wc_HmacFree(hmac); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Free dynamic memory of a wolfSSL HMAC object. */ + XFREE(hmac, heap, DYNAMIC_TYPE_HMAC); +#endif + return ret; +} + +/* Get the HMAC output size. + * + * @param [in] ctx HMAC context object. + * @return Size of HMAC output in bytes. + * @return 0 when ctx is NULL or no digest algorithm set. + */ +size_t wolfSSL_HMAC_size(const WOLFSSL_HMAC_CTX* ctx) +{ + size_t ret = 0; + + if (ctx != NULL) { + /* Look up digest size with wolfSSL. */ + ret = (size_t)wc_HashGetDigestSize((enum wc_HashType)ctx->hmac.macType); + } + + return ret; +} +#endif /* OPENSSL_EXTRA */ + +/******************************************************************************* + * END OF HMAC API + ******************************************************************************/ + +/******************************************************************************* + * START OF CMAC API + ******************************************************************************/ + +#if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) +#if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \ + defined(WOLFSSL_AES_DIRECT) +/* Allocate a new CMAC context object. + * + * TODO: make fields static. + * + * @return A CMAC context object on success. + * @return NULL on failure. + */ +WOLFSSL_CMAC_CTX* wolfSSL_CMAC_CTX_new(void) +{ + WOLFSSL_CMAC_CTX* ctx = NULL; + + /* Allocate memory for CMAC context object. */ + ctx = (WOLFSSL_CMAC_CTX*)XMALLOC(sizeof(WOLFSSL_CMAC_CTX), NULL, + DYNAMIC_TYPE_OPENSSL); + if (ctx != NULL) { + /* Memory for wolfSSL CMAC object is allocated in + * wolfSSL_CMAC_Init(). + */ + ctx->internal = NULL; + /* Allocate memory for EVP cipher context object. */ + ctx->cctx = wolfSSL_EVP_CIPHER_CTX_new(); + if (ctx->cctx == NULL) { + XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC); + XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); + ctx = NULL; + } + } + + return ctx; +} + +/* Free CMAC context object and dynamically allocated fields. + * + * ctx is deallocated and can no longer be used after this call. + * + * @param [in] ctx CMAC context object. + */ +void wolfSSL_CMAC_CTX_free(WOLFSSL_CMAC_CTX *ctx) +{ + if (ctx != NULL) { + /* Deallocate dynamically allocated fields. */ + if (ctx->internal != NULL) { +#if (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + wc_CmacFree((Cmac*)ctx->internal); +#endif + XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC); + } + if (ctx->cctx != NULL) { + wolfSSL_EVP_CIPHER_CTX_cleanup(ctx->cctx); + wolfSSL_EVP_CIPHER_CTX_free(ctx->cctx); + } + /* Deallocate CMAC context object. */ + XFREE(ctx, NULL, DYNAMIC_TYPE_OPENSSL); + } +} + +/* Return a reference to the EVP cipher context. + * + * @param [in] ctx CMAC context object. + * @return EVP cipher context. + * @return NULL when ctx is NULL. + */ +WOLFSSL_EVP_CIPHER_CTX* wolfSSL_CMAC_CTX_get0_cipher_ctx(WOLFSSL_CMAC_CTX* ctx) +{ + WOLFSSL_EVP_CIPHER_CTX* cctx = NULL; + + if (ctx != NULL) { + /* Return EVP cipher context object. */ + cctx = ctx->cctx; + } + + return cctx; +} + +/* Initialize the CMAC operation. + * + * @param [in, out] cmac CMAC context object. + * @param [in] key Symmetric key to use. + * @param [in] keySz Length of key in bytes. + * @param [in] cipher EVP cipher object describing encryption algorithm + * to use. + * @param [in] engine wolfSSL Engine. Not used. + * @return 1 on success. + * @return 0 when ctx or cipher is NULL. + * @return 0 when cipher is not an AES-CBC algorithm. + * @return 0 when key length does not match cipher. + */ +int wolfSSL_CMAC_Init(WOLFSSL_CMAC_CTX* ctx, const void *key, size_t keySz, + const WOLFSSL_EVP_CIPHER* cipher, WOLFSSL_ENGINE* engine) +{ + int ret = 1; + + (void)engine; + + WOLFSSL_ENTER("wolfSSL_CMAC_Init"); + + /* Validate parameters. */ + if ((ctx == NULL) || (cipher == NULL)) { + ret = 0; + } + /* Only AES-CBC ciphers are supported. */ + if ((ret == 1) && (cipher != EVP_AES_128_CBC) && + (cipher != EVP_AES_192_CBC) && (cipher != EVP_AES_256_CBC)) { + WOLFSSL_MSG("wolfSSL_CMAC_Init: requested cipher is unsupported"); + ret = 0; + } + /* Key length must match cipher. */ + if ((ret == 1) && ((int)keySz != wolfSSL_EVP_Cipher_key_length(cipher))) { + WOLFSSL_MSG("wolfSSL_CMAC_Init: " + "supplied key size doesn't match requested cipher"); + ret = 0; + } + + if ((ret == 1) && (ctx->internal == NULL)) { + /* Allocate memory for wolfSSL CMAC object. */ + ctx->internal = (Cmac*)XMALLOC(sizeof(Cmac), NULL, DYNAMIC_TYPE_CMAC); + if (ctx->internal == NULL) + ret = 0; + } + + /* Initialize the wolfCrypt CMAC object. */ + if ((ret == 1) && (wc_InitCmac((Cmac*)ctx->internal, (const byte*)key, + (word32)keySz, WC_CMAC_AES, NULL) != 0)) { + WOLFSSL_MSG("wolfSSL_CMAC_Init: wc_InitCmac() failed"); + XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC); + ctx->internal = NULL; + ret = 0; + } + if (ret == 1) { + /* Initialize the EVP cipher context object for encryption. */ + ret = wolfSSL_EVP_CipherInit(ctx->cctx, cipher, (const byte*)key, NULL, + 1); + if (ret != WOLFSSL_SUCCESS) + WOLFSSL_MSG("wolfSSL_CMAC_Init: wolfSSL_EVP_CipherInit() failed"); + } + + WOLFSSL_LEAVE("wolfSSL_CMAC_Init", ret); + + return ret; +} + +/* Update the CMAC operation with data. + * + * @param [in, out] ctx CMAC context object. + * @param [in] data Data to MAC as a byte array. + * @param [in] len Length of data in bytes. + * @return 1 on success. + * @return 0 when ctx is NULL. + */ +int wolfSSL_CMAC_Update(WOLFSSL_CMAC_CTX* ctx, const void* data, size_t len) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_CMAC_Update"); + + /* Validate parameters. */ + if (ctx == NULL) { + ret = 0; + } + + /* Update the wolfCrypto CMAC object with data. */ + if ((ret == 1) && (data != NULL) && (wc_CmacUpdate((Cmac*)ctx->internal, + (const byte*)data, (word32)len) != 0)) { + ret = 0; + } + + WOLFSSL_LEAVE("wolfSSL_CMAC_Update", ret); + + return ret; +} + +/* Finalize the CMAC operation into output buffer. + * + * @param [in, out] ctx CMAC context object. + * @param [out] out Buffer to place CMAC result into. + * Must be able to hold AES_BLOCK_SIZE bytes. + * @param [out] len Length of CMAC result. May be NULL. + * @return 1 on success. + * @return 0 when ctx is NULL. + */ +int wolfSSL_CMAC_Final(WOLFSSL_CMAC_CTX* ctx, unsigned char* out, size_t* len) +{ + int ret = 1; + int blockSize; + word32 len32; + + WOLFSSL_ENTER("wolfSSL_CMAC_Final"); + + /* Validate parameters. */ + if (ctx == NULL) { + ret = 0; + } + + if (ret == 1) { + /* Get the expected output size. */ + blockSize = EVP_CIPHER_CTX_block_size(ctx->cctx); + /* Check value is valid. */ + if (blockSize <= 0) { + ret = 0; + } + else { + /* wolfCrypt CMAC expects buffer size. */ + len32 = (word32)blockSize; + /* Return size if required. */ + if (len != NULL) { + *len = (size_t)blockSize; + } + } + } + if ((ret == 1) && (out != NULL)) { + /* Calculate MAC result with wolfCrypt CMAC object. */ + if (wc_CmacFinal((Cmac*)ctx->internal, out, &len32) != 0) { + ret = 0; + } + /* TODO: Is this necessary? Length should not change. */ + /* Return actual size if required. */ + else if (len != NULL) { + *len = (size_t)len32; + } + + XFREE(ctx->internal, NULL, DYNAMIC_TYPE_CMAC); + ctx->internal = NULL; + } + + WOLFSSL_LEAVE("wolfSSL_CMAC_Final", ret); + + return ret; +} +#endif /* WOLFSSL_CMAC && OPENSSL_EXTRA && WOLFSSL_AES_DIRECT */ +#endif /* OPENSSL_EXTRA && !WOLFCRYPT_ONLY */ + +/******************************************************************************* + * END OF CMAC API + ******************************************************************************/ + +/******************************************************************************* + * START OF DES API + ******************************************************************************/ + +#ifdef OPENSSL_EXTRA +#ifndef NO_DES3 +/* Set parity of the DES key. + * + * @param [in, out] key DES key. + */ +void wolfSSL_DES_set_odd_parity(WOLFSSL_DES_cblock* key) +{ + int i; + + WOLFSSL_ENTER("wolfSSL_DES_set_odd_parity"); + + for (i = 0; i < DES_KEY_SIZE; i++) { + unsigned char c = (*key)[i]; + /* Set bottom bit to odd parity - XOR of each bit is to be 1. + * XOR 1 to XOR of each bit. + * When even parity, the value will be 1 and the bottom bit will be + * flipped. + * When odd parity, the value will be 0 and the bottom bit will be + * unchanged. + */ + c ^= ((c >> 0) ^ (c >> 1) ^ (c >> 2) ^ (c >> 3) ^ (c >> 4) ^ (c >> 5) ^ + (c >> 6) ^ (c >> 7) ^ 0x01) & 0x01; + (*key)[i] = c; + } +} + +/* Check parity of the DES key. + * + * @param [in] key DES key. + * @return 1 when odd parity on all bytes. + * @return 0 when even parity on any byte. + */ +int wolfSSL_DES_check_key_parity(WOLFSSL_DES_cblock *key) +{ + int i; + /* Assume odd parity. */ + unsigned char p = 1; + + WOLFSSL_ENTER("wolfSSL_DES_check_key_parity"); + + for (i = 0; i < DES_KEY_SIZE; i++) { + unsigned char c = (*key)[i]; + /* p will be 0 when parity is even (XOR of bits is 0). */ + p &= (c >> 0) ^ (c >> 1) ^ (c >> 2) ^ (c >> 3) ^ (c >> 4) ^ (c >> 5) ^ + (c >> 6) ^ (c >> 7); + } + + /* Only care about bottom bit. */ + return p & 1; +} + +/* Check whether key data is the two 32-bit words. + * + * return true in fail case (1) + * + * @param [in] k1 First part of key. + * @param [in] k2 Second part of key. + * @param [in] key DES key as an array of bytes. + **/ +static int wolfssl_des_check(word32 k1, word32 k2, unsigned char* key) +{ + /* Compare the two 32-bit words. */ + return (((word32*)key)[0] == k1) && (((word32*)key)[1] == k2); +} + +/* Check key is not weak. + * + * Weak key list from Nist "Recommendation for the Triple Data Encryption + * Algorithm (TDEA) Block Cipher" + * + * @param [in] key DES key. + * @return 0 when #key is not a weak key. + * @return 1 when #key is a weak key. + */ +int wolfSSL_DES_is_weak_key(WOLFSSL_const_DES_cblock* key) +{ + int ret = 0; + + WOLFSSL_ENTER("wolfSSL_DES_is_weak_key"); + + /* Validate parameter. */ + if (key == NULL) { + WOLFSSL_MSG("NULL key passed in"); + ret = 1; + } + + /* Check weak keys - endian doesn't matter. */ + if ((ret == 0) && (wolfssl_des_check(0x01010101, 0x01010101, *key) || + wolfssl_des_check(0xFEFEFEFE, 0xFEFEFEFE, *key) || + wolfssl_des_check(0xE0E0E0E0, 0xF1F1F1F1, *key) || + wolfssl_des_check(0x1F1F1F1F, 0x0E0E0E0E, *key))) { + WOLFSSL_MSG("Weak key found"); + ret = 1; + } + + /* Check semi-weak keys - endian doesn't matter. */ + if ((ret == 0) && (wolfssl_des_check(0x011F011F, 0x010E010E, *key) || + wolfssl_des_check(0x1F011F01, 0x0E010E01, *key) || + wolfssl_des_check(0x01E001E0, 0x01F101F1, *key) || + wolfssl_des_check(0xE001E001, 0xF101F101, *key) || + wolfssl_des_check(0x01FE01FE, 0x01FE01FE, *key) || + wolfssl_des_check(0xFE01FE01, 0xFE01FE01, *key) || + wolfssl_des_check(0x1FE01FE0, 0x0EF10EF1, *key) || + wolfssl_des_check(0xE01FE01F, 0xF10EF10E, *key) || + wolfssl_des_check(0x1FFE1FFE, 0x0EFE0EFE, *key) || + wolfssl_des_check(0xFE1FFE1F, 0xFE0EFE0E, *key) || + wolfssl_des_check(0xE0FEE0FE, 0xF1FEF1FE, *key) || + wolfssl_des_check(0xFEE0FEE0, 0xFEF1FEF1, *key))) { + WOLFSSL_MSG("Semi-weak key found"); + ret = 1; + } + + return ret; +} + +/* Set key into schedule if key parity is odd and key is not weak. + * + * @param [in] key DES key data. + * @param [out] schedule DES key schedule. + * @return 0 on success. + * @return -1 when parity is not odd. + * @return -2 when key or schedule is NULL. + * @return -2 when key is weak or semi-weak. + */ +int wolfSSL_DES_set_key_checked(WOLFSSL_const_DES_cblock* key, + WOLFSSL_DES_key_schedule* schedule) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (schedule == NULL)) { + WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_set_key_checked"); + ret = -2; + } + + /* Check key parity is odd. */ + if ((ret == 0) && (!wolfSSL_DES_check_key_parity(key))) { + WOLFSSL_MSG("Odd parity test fail"); + ret = -1; + } + /* Check whether key is weak. */ + if ((ret == 0) && wolfSSL_DES_is_weak_key(key)) { + WOLFSSL_MSG("Weak key found"); + ret = -2; + } + if (ret == 0) { + /* Key data passed checks, now copy key into schedule. */ + XMEMCPY(schedule, key, DES_KEY_SIZE); + } + + return ret; +} + +/* Set key into schedule - no checks on key data performed. + * + * @param [in] key DES key data. + * @param [out] schedule DES key schedule. + */ +void wolfSSL_DES_set_key_unchecked(WOLFSSL_const_DES_cblock* key, + WOLFSSL_DES_key_schedule* schedule) +{ + /* Validate parameters. */ + if ((key != NULL) && (schedule != NULL)) { + /* Copy the key data into the schedule. */ + XMEMCPY(schedule, key, DES_KEY_SIZE); + } +} + +/* Set key into schedule. + * + * @param [in] key DES key data. + * @param [out] schedule DES key schedule. + * @return 0 on success. + * @return -1 when parity is not odd. + * @return -2 when key or schedule is NULL. + * @return -2 when key is weak or semi-weak. + */ +int wolfSSL_DES_set_key(WOLFSSL_const_DES_cblock* key, + WOLFSSL_DES_key_schedule* schedule) +{ +#ifdef WOLFSSL_CHECK_DESKEY + return wolfSSL_DES_set_key_checked(key, schedule); +#else + wolfSSL_DES_set_key_unchecked(key, schedule); + return 0; +#endif +} + +/* Set the key schedule from the DES key. + * + * TODO: OpenSSL checks parity and weak keys. + * + * @param [in] key DES key data. + * @param [out] schedule DES key schedule. + * @return 0 on success. + */ +int wolfSSL_DES_key_sched(WOLFSSL_const_DES_cblock* key, + WOLFSSL_DES_key_schedule* schedule) +{ + WOLFSSL_ENTER("wolfSSL_DES_key_sched"); + + /* Check parameters are usable. */ + if ((key == NULL) || (schedule == NULL)) { + WOLFSSL_MSG("Null argument passed in"); + } + else { + /* Copy the key data into the schedule. */ + XMEMCPY(schedule, key, sizeof(WOLFSSL_const_DES_cblock)); + } + + return 0; +} + +/* Encrypt with DES-CBC to create a checksum. + * + * Intended to behave similar to Kerberos mit_des_cbc_cksum. + * Returns the last 4 bytes of cipher text. + * + * TODO: Encrypt one block at a time instead of allocating a large amount. + * + * @param [in] in Data to encrypt. + * @param [out] out Last encrypted block. + * @param [in] length Length of data to encrypt. + * @param [in] sc Key schedule for encryption. + * @param [in] iv Initialization vector for CBC. + * @return Checksum of encryption. + * @return 0 on error. + */ +WOLFSSL_DES_LONG wolfSSL_DES_cbc_cksum(const unsigned char* in, + WOLFSSL_DES_cblock* out, long length, WOLFSSL_DES_key_schedule* sc, + WOLFSSL_const_DES_cblock* iv) +{ + WOLFSSL_DES_LONG ret = 0; + int err = 0; + unsigned char* data = (unsigned char*)in; + unsigned char* tmp = NULL; + long dataSz = length; + + WOLFSSL_ENTER("wolfSSL_DES_cbc_cksum"); + + /* Validate parameters. */ + if ((in == NULL) || (out == NULL) || (sc == NULL) || (iv == NULL)) { + WOLFSSL_MSG("Bad argument passed in"); + err = 1; + } + + /* When input length is not a multiple of DES_BLOCK_SIZE pad with 0s. */ + if ((!err) && (dataSz % DES_BLOCK_SIZE)) { + /* Allocate a buffer big enough to hold padded input. */ + dataSz += DES_BLOCK_SIZE - (dataSz % DES_BLOCK_SIZE); + data = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (data == NULL) { + WOLFSSL_MSG("Issue creating temporary buffer"); + err = 1; + } + else { + /* Copy input and pad with 0s. */ + XMEMCPY(data, in, length); + XMEMSET(data + length, 0, dataSz - length); + } + } + + if (!err) { + /* Allocate buffer to hold encrypted data. */ + tmp = (unsigned char*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (tmp == NULL) { + WOLFSSL_MSG("Issue creating temporary buffer"); + err = 1; + } + } + + if (!err) { + /* Encrypt data into temporary. */ + wolfSSL_DES_cbc_encrypt(data, tmp, dataSz, sc, (WOLFSSL_DES_cblock*)iv, + DES_ENCRYPT); + /* Copy out last block. */ + XMEMCPY((unsigned char*)out, tmp + (dataSz - DES_BLOCK_SIZE), + DES_BLOCK_SIZE); + + /* Use the last half of the encrypted block as the checksum. */ + ret = (((*((unsigned char*)out + 4) & 0xFF) << 24) | + ((*((unsigned char*)out + 5) & 0xFF) << 16) | + ((*((unsigned char*)out + 6) & 0xFF) << 8) | + (*((unsigned char*)out + 7) & 0xFF) ); + } + + /* Dispose of allocated memory. */ + XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (data != in) { + XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + return ret; +} + +/* Encrypt/decrypt data with DES-CBC. + * + * TODO: OpenSSL expects a length that is a multiple of the block size but + * we are padding the last block. This is not a padding API. + * TODO: Validate parameters? + * + * @param [in] input Data to encipher. + * @param [out] output Enciphered data. + * @param [in] length Length of data to encipher. + * @param [in] schedule Key schedule. + * @param [in] ivec IV for CBC operation. + * @param [in] enc Whether to encrypt. + */ +void wolfSSL_DES_cbc_encrypt(const unsigned char* input, unsigned char* output, + long length, WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec, + int enc) +{ +#ifdef WOLFSSL_SMALL_STACK + Des* des = NULL; +#else + Des des[1]; +#endif + byte lastBlock[DES_BLOCK_SIZE]; + + WOLFSSL_ENTER("wolfSSL_DES_cbc_encrypt"); + +#ifdef WOLFSSL_SMALL_STACK + des = XMALLOC(sizeof(Des3), NULL, DYNAMIC_TYPE_CIPHER); + if (des == NULL) { + WOLFSSL_MSG("Failed to allocate memory for Des object"); + } + else +#endif + /* OpenSSL compat, no ret */ + if (wc_Des_SetKey(des, (const byte*)schedule, (const byte*)ivec, + !enc) != 0) { + WOLFSSL_MSG("wc_Des_SetKey return error."); + } + else { + /* Last incomplete block size. 0 means none over. */ + int lb_sz = length % DES_BLOCK_SIZE; + /* Length of data that is a multiple of a block. */ + word32 len = (word32)(length - lb_sz); + + if (enc == DES_ENCRYPT) { + /* Encrypt full blocks into output. */ + wc_Des_CbcEncrypt(des, output, input, len); + if (lb_sz != 0) { + /* Create a 0 padded block from remaining bytes. */ + XMEMSET(lastBlock, 0, DES_BLOCK_SIZE); + XMEMCPY(lastBlock, input + len, lb_sz); + /* Encrypt last block into output. */ + wc_Des_CbcEncrypt(des, output + len, lastBlock, + (word32)DES_BLOCK_SIZE); + } + } + else { + /* Decrypt full blocks into output. */ + wc_Des_CbcDecrypt(des, output, input, len); + if (lb_sz != 0) { + /* Decrypt the last block that is not going to be full size. */ + wc_Des_CbcDecrypt(des, lastBlock, input + len, + (word32)DES_BLOCK_SIZE); + /* Copy out the required amount of the decrypted block. */ + XMEMCPY(output + len, lastBlock, lb_sz); + } + } + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(des, NULL, DYNAMIC_TYPE_CIPHER); +#endif +} + +/* Encrypt/decrypt data with DES-CBC. Sets the IV for following operation. + * + * TODO: OpenSSL expects a length that is a multiple of the block size but + * we are padding the last block. This is not a padding API. + * TODO: Validate parameters? + * + * @param [in] input Data to encipher. + * @param [out] output Enciphered data. + * @param [in] length Length of data to encipher. + * @param [in] schedule Key schedule. + * @param [in, out] ivec IV for CBC operation. + * @param [in] enc Whether to encrypt. + */ +void wolfSSL_DES_ncbc_encrypt(const unsigned char* input, unsigned char* output, + long length, WOLFSSL_DES_key_schedule* schedule, WOLFSSL_DES_cblock* ivec, + int enc) +{ + unsigned char tmp[DES_IV_SIZE]; + /* Calculate length to a multiple of block size. */ + size_t offset = (size_t)length; + + WOLFSSL_ENTER("wolfSSL_DES_ncbc_encrypt"); + + offset = (offset + DES_BLOCK_SIZE - 1) / DES_BLOCK_SIZE; + offset *= DES_BLOCK_SIZE; + offset -= DES_BLOCK_SIZE; + if (enc == DES_ENCRYPT) { + /* Encrypt data. */ + wolfSSL_DES_cbc_encrypt(input, output, length, schedule, ivec, enc); + /* Use last encrypted block as new IV. */ + XMEMCPY(ivec, output + offset, DES_IV_SIZE); + } + else { + /* Get last encrypted block for new IV. */ + XMEMCPY(tmp, input + offset, DES_IV_SIZE); + /* Decrypt data. */ + wolfSSL_DES_cbc_encrypt(input, output, length, schedule, ivec, enc); + /* Use last encrypted block as new IV. */ + XMEMCPY(ivec, tmp, DES_IV_SIZE); + } +} + +/* Encrypt/decrypt data with DES-CBC. + * + * WOLFSSL_DES_key_schedule is an unsigned char array of size 8. + * + * TODO: OpenSSL expects a length that is a multiple of the block size but + * we are padding the last block. This is not a padding API. + * TODO: Validate parameters? + * + * @param [in] input Data to encipher. + * @param [out] output Enciphered data. + * @param [in] length Length of data to encipher. + * @param [in] schedule Key schedule. + * @param [in, out] ivec IV for CBC operation. + * @param [in] enc Whether to encrypt. + */ +void wolfSSL_DES_ede3_cbc_encrypt(const unsigned char* input, + unsigned char* output, long sz, WOLFSSL_DES_key_schedule* ks1, + WOLFSSL_DES_key_schedule* ks2, WOLFSSL_DES_key_schedule* ks3, + WOLFSSL_DES_cblock* ivec, int enc) +{ +#ifdef WOLFSSL_SMALL_STACK + Des3* des3; +#else + Des3 des3[1]; +#endif + + WOLFSSL_ENTER("wolfSSL_DES_ede3_cbc_encrypt"); + +#ifdef WOLFSSL_SMALL_STACK + des3 = XMALLOC(sizeof(Des3), NULL, DYNAMIC_TYPE_CIPHER); + if (des3 == NULL) { + WOLFSSL_MSG("Failed to allocate memory for Des3 object"); + sz = 0; + } +#endif + + if (sz > 0) { + int ret; + byte key[DES3_KEY_SIZE]; + byte lastBlock[DES_BLOCK_SIZE]; + int lb_sz; + word32 len; + + /* Copy the three keys into the buffer for wolfCrypt DES. */ + XMEMCPY(key + 0 * DES_BLOCK_SIZE, *ks1, DES_BLOCK_SIZE); + XMEMCPY(key + 1 * DES_BLOCK_SIZE, *ks2, DES_BLOCK_SIZE); + XMEMCPY(key + 2 * DES_BLOCK_SIZE, *ks3, DES_BLOCK_SIZE); + + /* Last incomplete block size. 0 means none over. */ + lb_sz = sz % DES_BLOCK_SIZE; + /* Length of data that is a multiple of a block. */ + len = (word32)(sz - lb_sz); + + /* Initialize wolfCrypt DES3 object. */ + XMEMSET(des3, 0, sizeof(Des3)); + ret = wc_Des3Init(des3, NULL, INVALID_DEVID); + (void)ret; + + if (enc == DES_ENCRYPT) { + /* Initialize wolfCrypt DES3 object. */ + if (wc_Des3_SetKey(des3, key, (const byte*)ivec, DES_ENCRYPTION) + == 0) { + /* Encrypt full blocks into output. */ + ret = wc_Des3_CbcEncrypt(des3, output, input, len); + (void)ret; + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &des3->asyncDev, WC_ASYNC_FLAG_NONE); + (void)ret; + #endif + if (lb_sz != 0) { + /* Create a 0 padded block from remaining bytes. */ + XMEMSET(lastBlock, 0, DES_BLOCK_SIZE); + XMEMCPY(lastBlock, input + len, lb_sz); + /* Encrypt last block into output. */ + ret = wc_Des3_CbcEncrypt(des3, output + len, lastBlock, + (word32)DES_BLOCK_SIZE); + (void)ret; + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &des3->asyncDev, + WC_ASYNC_FLAG_NONE); + (void)ret; + #endif + /* Copy the last encrypted block as IV for next decrypt. */ + XMEMCPY(ivec, output + len, DES_BLOCK_SIZE); + } + else { + /* Copy the last encrypted block as IV for next decrypt. */ + XMEMCPY(ivec, output + len - DES_BLOCK_SIZE, + DES_BLOCK_SIZE); + } + } + } + else { + /* Initialize wolfCrypt DES3 object. */ + if (wc_Des3_SetKey(des3, key, (const byte*)ivec, DES_DECRYPTION) + == 0) { + /* Copy the last encrypted block as IV for next decrypt. */ + if (lb_sz != 0) { + XMEMCPY(ivec, input + len, DES_BLOCK_SIZE); + } + else { + XMEMCPY(ivec, input + len - DES_BLOCK_SIZE, DES_BLOCK_SIZE); + } + /* Decrypt full blocks into output. */ + ret = wc_Des3_CbcDecrypt(des3, output, input, len); + (void)ret; + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &des3->asyncDev, WC_ASYNC_FLAG_NONE); + (void)ret; + #endif + if (lb_sz != 0) { + /* Decrypt the last block that is not going to be full size. + */ + ret = wc_Des3_CbcDecrypt(des3, lastBlock, input + len, + (word32)DES_BLOCK_SIZE); + (void)ret; + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &des3->asyncDev, + WC_ASYNC_FLAG_NONE); + (void)ret; + #endif + /* Copy out the required amount of the decrypted block. */ + XMEMCPY(output + len, lastBlock, lb_sz); + } + } + } + wc_Des3Free(des3); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(des3, NULL, DYNAMIC_TYPE_CIPHER); +#endif +} + +#ifdef WOLFSSL_DES_ECB +/* Encrypt or decrypt input message desa with key and get output in desb. + * + * @param [in] in Block to encipher with DES-ECB. + * @param [out] out Enciphered block. + * @param [in] key DES key schedule. + * @param [in] enc Whether to encrypt. + */ +void wolfSSL_DES_ecb_encrypt(WOLFSSL_DES_cblock* in, WOLFSSL_DES_cblock* out, + WOLFSSL_DES_key_schedule* key, int enc) +{ +#ifdef WOLFSSL_SMALL_STACK + Des* des = NULL; +#else + Des des[1]; +#endif + + WOLFSSL_ENTER("wolfSSL_DES_ecb_encrypt"); + + /* Validate parameters. */ + if ((in == NULL) || (out == NULL) || (key == NULL) || + ((enc != DES_ENCRYPT) && (enc != DES_DECRYPT))) { + WOLFSSL_MSG("Bad argument passed to wolfSSL_DES_ecb_encrypt"); + } +#ifdef WOLFSSL_SMALL_STACK + else if ((des = XMALLOC(sizeof(Des), NULL, DYNAMIC_TYPE_CIPHER)) == NULL) { + WOLFSSL_MSG("Failed to allocate memory for Des object"); + } +#endif + /* Set key in wolfCrypt DES object for encryption or decryption. + * DES_ENCRYPT = 1, wolfSSL DES_ENCRYPTION = 0. + * DES_DECRYPT = 0, wolfSSL DES_DECRYPTION = 1. + */ + else if (wc_Des_SetKey(des, (const byte*)key, NULL, !enc) != 0) { + WOLFSSL_MSG("wc_Des_SetKey return error."); + } + else if (enc == DES_ENCRYPT) { + /* Encrypt a block with wolfCrypt DES object. */ + if (wc_Des_EcbEncrypt(des, (byte*)out, (const byte*)in, DES_KEY_SIZE) + != 0) { + WOLFSSL_MSG("wc_Des_EcbEncrypt return error."); + } + } + else { + /* Decrypt a block with wolfCrypt DES object. */ + if (wc_Des_EcbDecrypt(des, (byte*)out, (const byte*)in, DES_KEY_SIZE) + != 0) { + WOLFSSL_MSG("wc_Des_EcbDecrpyt return error."); + } + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(des, NULL, DYNAMIC_TYPE_CIPHER); +#endif +} +#endif +#endif /* NO_DES3 */ +#endif /* OPENSSL_EXTRA */ + +/******************************************************************************* + * END OF DES API + ******************************************************************************/ + +/******************************************************************************* + * START OF AES API + ******************************************************************************/ + +#ifdef OPENSSL_EXTRA + +#if !defined(NO_AES) && !defined(WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API) + +/* Sets the key into the AES key object for encryption or decryption. + * + * TODO: check bits value? + * + * @param [in] key Key data. + * @param [in] bits Number of bits in key. + * @param [out] aes AES key object. + * @param [in] enc Whether to encrypt. AES_ENCRYPT or AES_DECRYPT. + * @return 0 on success. + * @return -1 when key or aes is NULL. + * @return -1 when setting key with wolfCrypt fails. + */ +static int wolfssl_aes_set_key(const unsigned char *key, const int bits, + AES_KEY *aes, int enc) +{ + typedef char aes_test[sizeof(AES_KEY) >= sizeof(Aes) ? 1 : -1]; + (void)sizeof(aes_test); + + /* Validate parameters. */ + if ((key == NULL) || (aes == NULL)) { + WOLFSSL_MSG("Null argument passed in"); + return -1; + } + + XMEMSET(aes, 0, sizeof(AES_KEY)); + + if (wc_AesInit((Aes*)aes, NULL, INVALID_DEVID) != 0) { + WOLFSSL_MSG("Error in initting AES key"); + return -1; + } + + if (wc_AesSetKey((Aes*)aes, key, ((bits)/8), NULL, enc) != 0) { + WOLFSSL_MSG("Error in setting AES key"); + return -1; + } + return 0; +} + +/* Sets the key into the AES key object for encryption. + * + * @param [in] key Key data. + * @param [in] bits Number of bits in key. + * @param [out] aes AES key object. + * @return 0 on success. + * @return -1 when key or aes is NULL. + * @return -1 when setting key with wolfCrypt fails. + */ +int wolfSSL_AES_set_encrypt_key(const unsigned char *key, const int bits, + AES_KEY *aes) +{ + WOLFSSL_ENTER("wolfSSL_AES_set_encrypt_key"); + + return wolfssl_aes_set_key(key, bits, aes, AES_ENCRYPT); +} + +/* Sets the key into the AES key object for decryption. + * + * @param [in] key Key data. + * @param [in] bits Number of bits in key. + * @param [out] aes AES key object. + * @return 0 on success. + * @return -1 when key or aes is NULL. + * @return -1 when setting key with wolfCrypt fails. + */ +int wolfSSL_AES_set_decrypt_key(const unsigned char *key, const int bits, + AES_KEY *aes) +{ + WOLFSSL_ENTER("wolfSSL_AES_set_decrypt_key"); + + return wolfssl_aes_set_key(key, bits, aes, AES_DECRYPT); +} + +#ifdef WOLFSSL_AES_DIRECT +/* Encrypt a 16-byte block of data using AES-ECB. + * + * wolfSSL_AES_set_encrypt_key() must have been called. + * + * #input must contain AES_BLOCK_SIZE bytes of data. + * #output must be a buffer at least AES_BLOCK_SIZE bytes in length. + * + * @param [in] input Data to encrypt. + * @param [out] output Encrypted data. + * @param [in] key AES key to use for encryption. + */ +void wolfSSL_AES_encrypt(const unsigned char* input, unsigned char* output, + AES_KEY *key) +{ + WOLFSSL_ENTER("wolfSSL_AES_encrypt"); + + /* Validate parameters. */ + if ((input == NULL) || (output == NULL) || (key == NULL)) { + WOLFSSL_MSG("Null argument passed in"); + } + else +#if !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + /* Encrypt a block with wolfCrypt AES. */ + if (wc_AesEncryptDirect((Aes*)key, output, input) != 0) { + WOLFSSL_MSG("wc_AesEncryptDirect failed"); + } +#else + { + /* Encrypt a block with wolfCrypt AES. */ + wc_AesEncryptDirect((Aes*)key, output, input); + } +#endif +} + + +/* Decrypt a 16-byte block of data using AES-ECB. + * + * wolfSSL_AES_set_decrypt_key() must have been called. + * + * #input must contain AES_BLOCK_SIZE bytes of data. + * #output must be a buffer at least AES_BLOCK_SIZE bytes in length. + * + * @param [in] input Data to decrypt. + * @param [out] output Decrypted data. + * @param [in] key AES key to use for encryption. + */ +void wolfSSL_AES_decrypt(const unsigned char* input, unsigned char* output, + AES_KEY *key) +{ + WOLFSSL_ENTER("wolfSSL_AES_decrypt"); + + /* Validate parameters. */ + if ((input == NULL) || (output == NULL) || (key == NULL)) { + WOLFSSL_MSG("Null argument passed in"); + } + else +#if !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + /* Decrypt a block with wolfCrypt AES. */ + if (wc_AesDecryptDirect((Aes*)key, output, input) != 0) { + WOLFSSL_MSG("wc_AesDecryptDirect failed"); + } +#else + { + /* Decrypt a block with wolfCrypt AES. */ + wc_AesDecryptDirect((Aes*)key, output, input); + } +#endif +} +#endif /* WOLFSSL_AES_DIRECT */ + + + +#ifdef HAVE_AES_ECB +/* Encrypt/decrypt a 16-byte block of data using AES-ECB. + * + * wolfSSL_AES_set_encrypt_key() or wolfSSL_AES_set_decrypt_key ()must have been + * called. + * + * #input must contain AES_BLOCK_SIZE bytes of data. + * #output must be a buffer at least AES_BLOCK_SIZE bytes in length. + * + * @param [in] in Data to encipher. + * @param [out] out Enciphered data. + * @param [in] key AES key to use for encryption/decryption. + * @param [in] enc Whether to encrypt. + * AES_ENCRPT for encryption, AES_DECRYPT for decryption. + */ +void wolfSSL_AES_ecb_encrypt(const unsigned char *in, unsigned char* out, + AES_KEY *key, const int enc) +{ + WOLFSSL_ENTER("wolfSSL_AES_ecb_encrypt"); + + /* Validate parameters. */ + if ((key == NULL) || (in == NULL) || (out == NULL)) { + WOLFSSL_MSG("Error, Null argument passed in"); + } + else if (enc == AES_ENCRYPT) { + /* Encrypt block. */ + if (wc_AesEcbEncrypt((Aes*)key, out, in, AES_BLOCK_SIZE) != 0) { + WOLFSSL_MSG("Error with AES CBC encrypt"); + } + } + else { + #ifdef HAVE_AES_DECRYPT + /* Decrypt block. */ + if (wc_AesEcbDecrypt((Aes*)key, out, in, AES_BLOCK_SIZE) != 0) { + WOLFSSL_MSG("Error with AES CBC decrypt"); + } + #else + WOLFSSL_MSG("AES decryption not compiled in"); + #endif + } +} +#endif /* HAVE_AES_ECB */ + +#ifdef HAVE_AES_CBC +/* Encrypt/decrypt data with IV using AES-CBC. + * + * wolfSSL_AES_set_encrypt_key() or wolfSSL_AES_set_decrypt_key() must have been + * called. + * + * @param [in] in Data to encipher. + * @param [out] out Enciphered data. + * @param [in] len Length of data to encipher. + * @param [in] key AES key to use for encryption/decryption. + * @param [in, out] iv Initialization Vector (IV) of CBC mode. + * On in, used with first block. + * On out, IV for further operations. + * @param [in] enc Whether to encrypt. + * AES_ENCRPT for encryption, AES_DECRYPT for decryption. + */ +void wolfSSL_AES_cbc_encrypt(const unsigned char *in, unsigned char* out, + size_t len, AES_KEY *key, unsigned char* iv, const int enc) +{ + WOLFSSL_ENTER("wolfSSL_AES_cbc_encrypt"); + + /* Validate parameters. */ + if ((key == NULL) || (in == NULL) || (out == NULL) || (iv == NULL) || + (len == 0)) { + WOLFSSL_MSG("Error, Null argument passed in"); + } + /* Set IV for operation. */ + else { + int ret; + Aes* aes = (Aes*)key; + + if ((ret = wc_AesSetIV(aes, (const byte*)iv)) != 0) { + WOLFSSL_MSG("Error with setting iv"); + } + else if (enc == AES_ENCRYPT) { + /* Encrypt with wolfCrypt AES object. */ + if ((ret = wc_AesCbcEncrypt(aes, out, in, (word32)len)) != 0) { + WOLFSSL_MSG("Error with AES CBC encrypt"); + } + } + else { + /* Decrypt with wolfCrypt AES object. */ + if ((ret = wc_AesCbcDecrypt(aes, out, in, (word32)len)) != 0) { + WOLFSSL_MSG("Error with AES CBC decrypt"); + } + } + + if (ret == 0) { + /* Get IV for next operation. */ + XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE); + } + } +} +#endif /* HAVE_AES_CBC */ + + +/* Encrypt/decrypt data with IV using AES-CFB. + * + * wolfSSL_AES_set_encrypt_key() must have been called. + * + * @param [in] in Data to encipher. + * @param [out] out Enciphered data. + * @param [in] len Length of data to encipher. + * @param [in] key AES key to use for encryption/decryption. + * @param [in, out] iv Initialization Vector (IV) of CFB mode. + * On in, used with first block. + * On out, IV for further operations. + * @param [out] num Number of bytes used from last incomplete block. + * @param [in] enc Whether to encrypt. + * AES_ENCRPT for encryption, AES_DECRYPT for decryption. + */ +void wolfSSL_AES_cfb128_encrypt(const unsigned char *in, unsigned char* out, + size_t len, AES_KEY *key, unsigned char* iv, int* num, const int enc) +{ +#ifndef WOLFSSL_AES_CFB + WOLFSSL_MSG("CFB mode not enabled please use macro WOLFSSL_AES_CFB"); + + (void)in; + (void)out; + (void)len; + (void)key; + (void)iv; + (void)num; + (void)enc; +#else + WOLFSSL_ENTER("wolfSSL_AES_cfb_encrypt"); + + /* Validate parameters. */ + if ((key == NULL) || (in == NULL) || (out == NULL) || (iv == NULL)) { + WOLFSSL_MSG("Error, Null argument passed in"); + } + else { + int ret; + Aes* aes = (Aes*)key; + + /* Copy the IV directly into reg here because wc_AesSetIV clears + * leftover bytes field "left", and this function relies on the leftover + * bytes being preserved between calls. + */ + XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); + + if (enc == AES_ENCRYPT) { + /* Encrypt data with AES-CFB. */ + if ((ret = wc_AesCfbEncrypt(aes, out, in, (word32)len)) != 0) { + WOLFSSL_MSG("Error with AES CBC encrypt"); + } + } + else { + /* Decrypt data with AES-CFB. */ + if ((ret = wc_AesCfbDecrypt(aes, out, in, (word32)len)) != 0) { + WOLFSSL_MSG("Error with AES CBC decrypt"); + } + } + + if (ret == 0) { + /* Copy IV out after operation. */ + XMEMCPY(iv, (byte*)(aes->reg), AES_BLOCK_SIZE); + + /* Store number of left over bytes to num. */ + if (num != NULL) { + *num = (AES_BLOCK_SIZE - aes->left) % AES_BLOCK_SIZE; + } + } + } +#endif /* WOLFSSL_AES_CFB */ +} + +/* wc_AesKey*Wrap_ex API not available in FIPS and SELFTEST */ +#if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) +/* Wrap (encrypt) a key using RFC3394 AES key wrap. + * + * @param [in, out] key AES key. + * @param [in] iv Initialization vector used by encryption mode. + * @param [out] out Wrapped key. + * @param [in] in Key data to wrap. + * @param [in] inSz Length of key to wrap in bytes. + * @return Length of encrypted key in bytes. + * @return 0 when key, iv, out or in is NULL. + * @return 0 when key length is not valid. + */ +int wolfSSL_AES_wrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, const unsigned char *in, unsigned int inSz) +{ + int ret = 0; + int len = 0; + + WOLFSSL_ENTER("wolfSSL_AES_wrap_key"); + + /* Validate parameters. */ + if ((out == NULL) || (in == NULL)) { + WOLFSSL_MSG("Error, Null argument passed in"); + ret = BAD_FUNC_ARG; + } + + /* Wrap key. */ + if ((ret == 0) && ((ret = wc_AesKeyWrap_ex((Aes*)key, in, inSz, out, + inSz + KEYWRAP_BLOCK_SIZE, iv)) > 0)) { + /* Get the length of the wrapped key. */ + len = ret; + } + + return len; +} + +/* Unwrap (decrypt) a key using RFC3394 AES key wrap. + * + * @param [in, out] key AES key. + * @param [in] iv Initialization vector used by decryption mode. + * @param [out] out Unwrapped key. + * @param [in] in Wrapped key data. + * @param [in] inSz Length of wrapped key data in bytes. + * @return Length of decrypted key in bytes. + * @return 0 when key, iv, out or in is NULL. + * @return 0 when wrapped key data length is not valid. + */ +int wolfSSL_AES_unwrap_key(AES_KEY *key, const unsigned char *iv, + unsigned char *out, const unsigned char *in, unsigned int inSz) +{ + int ret = 0; + int len = 0; + + WOLFSSL_ENTER("wolfSSL_AES_wrap_key"); + + /* Validate parameters. */ + if ((out == NULL) || (in == NULL)) { + WOLFSSL_MSG("Error, Null argument passed in"); + ret = BAD_FUNC_ARG; + } + + /* Unwrap key. */ + if ((ret == 0) && ((ret = wc_AesKeyUnWrap_ex((Aes*)key, in, inSz, out, + inSz + KEYWRAP_BLOCK_SIZE, iv)) > 0)) { + /* Get the length of the unwrapped key. */ + len = ret; + } + + return len; +} +#endif /* HAVE_AES_KEYWRAP && !HAVE_FIPS && !HAVE_SELFTEST */ + +#ifdef HAVE_CTS +/* Ciphertext stealing encryption compatible with RFC2040 and RFC3962. + * + * @param [in] in Data to encrypt. + * @param [out] out Encrypted data. + * @param [in] len Length of data to encrypt. + * @param [in] key Symmetric key. + * @param [in] iv Initialization Vector for encryption mode. + * @param [in] cbc CBC mode encryption function. + * @return Length of encrypted data in bytes on success. + * @return 0 when in, out, cbc, key or iv are NULL. + * @return 0 when len is less than or equal to 16 bytes. + */ +size_t wolfSSL_CRYPTO_cts128_encrypt(const unsigned char *in, + unsigned char *out, size_t len, const void *key, unsigned char *iv, + WOLFSSL_CBC128_CB cbc) +{ + byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ]; + int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ; + + WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_encrypt"); + + /* Validate parameters. */ + if ((in == NULL) || (out == NULL) || (len <= WOLFSSL_CTS128_BLOCK_SZ) || + (cbc == NULL) || (key == NULL) || (iv == NULL)) { + WOLFSSL_MSG("Bad parameter"); + len = 0; + } + + if (len > 0) { + /* Must have a last block. */ + if (lastBlkLen == 0) { + lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ; + } + + /* Encrypt data up to last block */ + (*cbc)(in, out, len - lastBlkLen, key, iv, AES_ENCRYPT); + + /* Move to last block */ + in += len - lastBlkLen; + out += len - lastBlkLen; + + /* RFC2040: Pad Pn with zeros at the end to create P of length BB. */ + XMEMCPY(lastBlk, in, lastBlkLen); + XMEMSET(lastBlk + lastBlkLen, 0, WOLFSSL_CTS128_BLOCK_SZ - lastBlkLen); + /* RFC2040: Select the first Ln bytes of En-1 to create Cn */ + XMEMCPY(out, out - WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen); + /* Encrypt last block. */ + (*cbc)(lastBlk, out - WOLFSSL_CTS128_BLOCK_SZ, WOLFSSL_CTS128_BLOCK_SZ, + key, iv, AES_ENCRYPT); + } + + return len; +} + +/* Ciphertext stealing decryption compatible with RFC2040 and RFC3962. + * + * @param [in] in Data to decrypt. + * @param [out] out Decrypted data. + * @param [in] len Length of data to decrypt. + * @param [in] key Symmetric key. + * @param [in] iv Initialization Vector for decryption mode. + * @param [in] cbc CBC mode encryption function. + * @return Length of decrypted data in bytes on success. + * @return 0 when in, out, cbc, key or iv are NULL. + * @return 0 when len is less than or equal to 16 bytes. + */ +size_t wolfSSL_CRYPTO_cts128_decrypt(const unsigned char *in, + unsigned char *out, size_t len, const void *key, unsigned char *iv, + WOLFSSL_CBC128_CB cbc) +{ + byte lastBlk[WOLFSSL_CTS128_BLOCK_SZ]; + byte prevBlk[WOLFSSL_CTS128_BLOCK_SZ]; + int lastBlkLen = len % WOLFSSL_CTS128_BLOCK_SZ; + + WOLFSSL_ENTER("wolfSSL_CRYPTO_cts128_decrypt"); + + /* Validate parameters. */ + if ((in == NULL) || (out == NULL) || (len <= WOLFSSL_CTS128_BLOCK_SZ) || + (cbc == NULL) || (key == NULL) || (iv == NULL)) { + WOLFSSL_MSG("Bad parameter"); + len = 0; + } + + if (len > 0) { + /* Must have a last block. */ + if (lastBlkLen == 0) { + lastBlkLen = WOLFSSL_CTS128_BLOCK_SZ; + } + + if (len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ != 0) { + /* Decrypt up to last two blocks */ + (*cbc)(in, out, len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ, key, iv, + AES_DECRYPTION); + + /* Move to last two blocks */ + in += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ; + out += len - lastBlkLen - WOLFSSL_CTS128_BLOCK_SZ; + } + + /* RFC2040: Decrypt Cn-1 to create Dn. + * Use 0 buffer as IV to do straight decryption. + * This places the Cn-1 block at lastBlk */ + XMEMSET(lastBlk, 0, WOLFSSL_CTS128_BLOCK_SZ); + (*cbc)(in, prevBlk, WOLFSSL_CTS128_BLOCK_SZ, key, lastBlk, AES_DECRYPT); + /* RFC2040: Append the tail (BB minus Ln) bytes of Xn to Cn + * to create En. */ + XMEMCPY(prevBlk, in + WOLFSSL_CTS128_BLOCK_SZ, lastBlkLen); + /* Cn and Cn-1 can now be decrypted */ + (*cbc)(prevBlk, out, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT); + (*cbc)(lastBlk, lastBlk, WOLFSSL_CTS128_BLOCK_SZ, key, iv, AES_DECRYPT); + XMEMCPY(out + WOLFSSL_CTS128_BLOCK_SZ, lastBlk, lastBlkLen); + } + + return len; +} +#endif /* HAVE_CTS */ +#endif /* !NO_AES && !WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API */ +#endif /* OPENSSL_EXTRA */ + +/******************************************************************************* + * END OF AES API + ******************************************************************************/ + +/******************************************************************************* + * START OF RC4 API + ******************************************************************************/ + +#ifdef OPENSSL_EXTRA + +#ifndef NO_RC4 +/* Set the key state for Arc4 key. + * + * @param [out] key Arc4 key. + * @param [in] len Length of key in buffer. + * @param [in] data Key data buffer. + */ +void wolfSSL_RC4_set_key(WOLFSSL_RC4_KEY* key, int len, + const unsigned char* data) +{ + typedef char rc4_test[sizeof(WOLFSSL_RC4_KEY) >= sizeof(Arc4) ? 1 : -1]; + (void)sizeof(rc4_test); + + WOLFSSL_ENTER("wolfSSL_RC4_set_key"); + + /* Validate parameters. */ + if ((key == NULL) || (len < 0) || (data == NULL)) { + WOLFSSL_MSG("bad argument passed in"); + } + else { + /* Reset wolfCrypt Arc4 object. */ + XMEMSET(key, 0, sizeof(WOLFSSL_RC4_KEY)); + /* Set key into wolfCrypt Arc4 object. */ + wc_Arc4SetKey((Arc4*)key, data, (word32)len); + } +} + + +/* Encrypt/decrypt with Arc4 key. + * + * @param [in] len Length of data to encrypt/decrypt. + * @param [in] in Data to encrypt/decrypt. + * @param [out] out Enciphered data. + */ +void wolfSSL_RC4(WOLFSSL_RC4_KEY* key, size_t len, const unsigned char* in, + unsigned char* out) +{ + WOLFSSL_ENTER("wolfSSL_RC4"); + + /* Validate parameters. */ + if ((key == NULL) || (in == NULL) || (out == NULL)) { + WOLFSSL_MSG("Bad argument passed in"); + } + else { + /* Encrypt/decrypt data. */ + wc_Arc4Process((Arc4*)key, out, in, (word32)len); + } +} +#endif /* NO_RC4 */ + +#endif /* OPENSSL_EXTRA */ + +/******************************************************************************* + * END OF RC4 API + ******************************************************************************/ + +#endif /* WOLFSSL_SSL_CRYPTO_INCLUDED */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_load.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_load.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_load.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_load.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,5831 @@ +/* ssl_load.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +/* + * WOLFSSL_SYS_CA_CERTS + * Enables ability to load system CA certs from the OS via + * wolfSSL_CTX_load_system_CA_certs. + */ + +#ifdef WOLFSSL_SYS_CA_CERTS + +#ifdef _WIN32 + #include + #include + + /* mingw gcc does not support pragma comment, and the + * linking with crypt32 is handled in configure.ac */ + #if !defined(__MINGW32__) && !defined(__MINGW64__) + #pragma comment(lib, "crypt32") + #endif +#endif + +#if defined(__APPLE__) && defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) +#include +#endif + +#endif /* WOLFSSL_SYS_CA_CERTS */ + +#if !defined(WOLFSSL_SSL_LOAD_INCLUDED) + #ifndef WOLFSSL_IGNORE_FILE_WARN + #warning ssl_load.c does not need to be compiled separately from ssl.c + #endif +#else + +#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) + /* PSK field of context when it exists. */ + #define CTX_HAVE_PSK(ctx) (ctx)->havePSK + /* PSK field of ssl when it exists. */ + #define SSL_HAVE_PSK(ssl) (ssl)->options.havePSK +#else + /* Have PSK value when no field. */ + #define CTX_HAVE_PSK(ctx) 0 + /* Have PSK value when no field. */ + #define SSL_HAVE_PSK(ssl) 0 +#endif +#ifdef NO_RSA + /* Boolean for RSA available. */ + #define WOLFSSL_HAVE_RSA 0 +#else + /* Boolean for RSA available. */ + #define WOLFSSL_HAVE_RSA 1 +#endif +#ifndef NO_CERTS + /* Private key size from ssl. */ + #define SSL_KEY_SZ(ssl) (ssl)->buffers.keySz +#else + /* Private key size not available. */ + #define SSL_KEY_SZ(ssl) 0 +#endif +#ifdef HAVE_ANON + /* Anonymous ciphersuite allowed field in context. */ + #define CTX_USE_ANON(ctx) (ctx)->useAnon +#else + /* Anonymous ciphersuite allowed field not in context. */ + #define CTX_USE_ANON(ctx) 0 +#endif + +#ifdef HAVE_PK_CALLBACKS + #define WOLFSSL_IS_PRIV_PK_SET(ctx, ssl) \ + wolfSSL_CTX_IsPrivatePkSet(((ssl) == NULL) ? (ctx) : (ssl)->ctx) +#else + #define WOLFSSL_IS_PRIV_PK_SET(ctx, ssl) 0 +#endif + +/* Get the heap from the context or the ssl depending on which is available. */ +#define WOLFSSL_HEAP(ctx, ssl) \ + (((ctx) != NULL) ? (ctx)->heap : (((ssl) != NULL) ? (ssl)->heap : NULL)) + + +#ifndef NO_CERTS + +/* Get DER encoding from data in a buffer as a DerBuffer. + * + * @param [in] buff Buffer containing data. + * @param [in] len Length of data in buffer. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @param [in] type Type of data: + * CERT_TYPE, CA_TYPE, TRUSTED_PEER_TYPE, + * PRIVATEKEY_TYPE or ALT_PRIVATEKEY_TYPE. + * @param [in, out] info Info for encryption. + * @param [in] heap Dynamic memory allocation hint. + * @param [out] der Holds DER encoded data. + * @param [out] algId Algorithm identifier for private keys. + * @return 0 on success. + * @return NOT_COMPILED_IN when format is PEM and PEM not supported. + * @return ASN_PARSE_E when format is ASN.1 and invalid DER encoding. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int DataToDerBuffer(const unsigned char* buff, word32 len, int format, + int type, EncryptedInfo* info, void* heap, DerBuffer** der, int* algId) +{ + int ret; + + info->consumed = 0; + + /* Data in buffer has PEM format - extract DER data. */ + if (format == WOLFSSL_FILETYPE_PEM) { + #ifdef WOLFSSL_PEM_TO_DER + ret = PemToDer(buff, len, type, der, heap, info, algId); + if (ret != 0) { + FreeDer(der); + } + #else + ret = NOT_COMPILED_IN; + #endif + } + /* Data in buffer is ASN.1 format - get first SEQ or OCT into der. */ + else { + int length; + word32 inOutIdx = 0; + + /* Get length of SEQ including header. */ + if ((info->consumed = wolfssl_der_length(buff, (int)len)) > 0) { + ret = 0; + } + /* Private keys may be wrapped in OCT when PKCS#8 wrapper removed. + * TODO: is this really needed? */ + else if ((type == PRIVATEKEY_TYPE) && + (GetOctetString(buff, &inOutIdx, &length, len) >= 0)) { + /* Include octet string DER header. */ + info->consumed = length + inOutIdx; + ret = 0; + } + else { + ret = ASN_PARSE_E; + } + + if (info->consumed > (int)len) { + ret = ASN_PARSE_E; + } + if (ret == 0) { + ret = AllocCopyDer(der, buff, (word32)info->consumed, type, heap); + } + } + + return ret; +} + +/* Process a user's certificate. + * + * Puts the 3-byte length before certificate data as required for TLS. + * CA certificates are added to the certificate manager. + * + * @param [in] cm Certificate manager. + * @param [in, out] pDer DER encoded data. + * @param [in] type Type of data. Valid values: + * CERT_TYPE, CA_TYPE or TRUSTED_PEER_TYPE. + * @param [in] verify How to verify certificate. + * @param [out] chainBuffer Buffer to hold chain of certificates. + * @param [in, out] pIdx On in, current index into chainBuffer. + * On out, index after certificate added. + * @param [in] bufferSz Size of buffer in bytes. + * @return 0 on success. + * @return BUFFER_E if chain buffer not big enough to hold certificate. + */ +static int ProcessUserCert(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, + int type, int verify, byte* chainBuffer, word32* pIdx, word32 bufferSz) +{ + int ret = 0; + word32 idx = *pIdx; + DerBuffer* der = *pDer; + + /* Check there is space for certificate in chainBuffer. */ + if ((ret == 0) && ((idx + der->length + CERT_HEADER_SZ) > bufferSz)) { + WOLFSSL_MSG(" Cert Chain bigger than buffer. " + "Consider increasing MAX_CHAIN_DEPTH"); + ret = BUFFER_E; + } + if (ret == 0) { + /* 3-byte length. */ + c32to24(der->length, &chainBuffer[idx]); + idx += CERT_HEADER_SZ; + /* Add complete DER encoded certificate. */ + XMEMCPY(&chainBuffer[idx], der->buffer, der->length); + idx += der->length; + + if (type == CA_TYPE) { + /* Add CA to certificate manager */ + ret = AddCA(cm, pDer, WOLFSSL_USER_CA, verify); + if (ret == 1) { + ret = 0; + } + } + } + + /* Update the index into chainBuffer. */ + *pIdx = idx; + return ret; +} + +/* Store the certificate chain buffer aganst WOLFSSL_CTX or WOLFSSL object. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] chainBuffer Buffer containing chain of certificates. + * @param [in] len Length, in bytes, of data in buffer. + * @param [in] cnt Number of certificates in chain. + * @param [in] type Type of data. Valid values: + * CERT_TYPE, CA_TYPE or CHAIN_CERT_TYPE. + * @param [in] heap Dynamic memory allocation hint. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int ProcessUserChainRetain(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + const byte* chainBuffer, word32 len, int cnt, int type, void* heap) +{ + int ret = 0; + + (void)cnt; + + /* Store in SSL object if available. */ + if (ssl != NULL) { + /* Dispose of old chain if not reference to context's. */ + if (ssl->buffers.weOwnCertChain) { + FreeDer(&ssl->buffers.certChain); + } + /* Allocate and copy the buffer into SSL object. */ + ret = AllocCopyDer(&ssl->buffers.certChain, chainBuffer, len, type, + heap); + ssl->buffers.weOwnCertChain = (ret == 0); + #ifdef WOLFSSL_TLS13 + /* Update count of certificates in chain. */ + ssl->buffers.certChainCnt = cnt; + #endif + } + /* Store in SSL context object if available. */ + else if (ctx != NULL) { + /* Dispose of old chain and allocate and copy in new chain. */ + FreeDer(&ctx->certChain); + /* Allocate and copy the buffer into SSL context object. */ + ret = AllocCopyDer(&ctx->certChain, chainBuffer, len, type, heap); + #ifdef WOLFSSL_TLS13 + /* Update count of certificates in chain. */ + ctx->certChainCnt = cnt; + #endif + } + + return ret; +} + +/* Process user cert chain to pass during the TLS handshake. + * + * If not a certificate type then data is ignored. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] buff Buffer holding certificates. + * @param [in] sz Length of data in buffer. + * @param [in] format Format of the certificate: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1 + * @param [in] type Type of certificate: + * CA_TYPE, CERT_TYPE or CHAIN_CERT_TYPE + * @param [out] used Number of bytes from buff used. + * @param [in, out] info Encryption information. + * @param [in] verify How to verify certificate. + * @return 0 on success. + * @return BAD_FUNC_ARG when type is CA_TYPE and ctx is NULL. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int ProcessUserChain(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + const unsigned char* buff, long sz, int format, int type, long* used, + EncryptedInfo* info, int verify) +{ + int ret = 0; + void* heap = WOLFSSL_HEAP(ctx, ssl); + + WOLFSSL_ENTER("ProcessUserChain"); + + /* Validate parameters. */ + if ((type == CA_TYPE) && (ctx == NULL)) { + WOLFSSL_MSG("Need context for CA load"); + ret = BAD_FUNC_ARG; + } + + /* Ignore non-certificate types. */ + if ((ret == 0) && (type != CERT_TYPE) && (type != CHAIN_CERT_TYPE) && + (type != CA_TYPE)) { + WOLFSSL_MSG("File type not a certificate"); + } + /* Check we haven't consumed all the data. */ + else if ((ret == 0) && (info->consumed >= sz)) { + WOLFSSL_MSG("Already consumed data"); + } + else if (ret == 0) { + #ifndef WOLFSSL_SMALL_STACK + byte stackBuffer[FILE_BUFFER_SIZE]; + #endif + StaticBuffer chain; + long consumed = info->consumed; + word32 idx = 0; + int gotOne = 0; + int cnt = 0; + /* Calculate max possible size, including max headers */ + long maxSz = (sz - consumed) + (CERT_HEADER_SZ * MAX_CHAIN_DEPTH); + + /* Setup buffer to hold chain. */ + #ifdef WOLFSSL_SMALL_STACK + static_buffer_init(&chain); + #else + static_buffer_init(&chain, stackBuffer, FILE_BUFFER_SIZE); + #endif + /* Make buffer big enough to support maximum size. */ + ret = static_buffer_set_size(&chain, (word32)maxSz, heap, + DYNAMIC_TYPE_FILE); + + WOLFSSL_MSG("Processing Cert Chain"); + /* Keep parsing certificates will data available. */ + while ((ret == 0) && (consumed < sz)) { + DerBuffer* part = NULL; + + /* Get a certificate as DER. */ + ret = DataToDerBuffer(buff + consumed, (word32)(sz - consumed), + format, type, info, heap, &part, NULL); + if (ret == 0) { + /* Process the user certificate. */ + ret = ProcessUserCert(ctx->cm, &part, type, verify, + chain.buffer, &idx, (word32)maxSz); + } + /* PEM may have trailing data that can be ignored. */ + if ((ret == WC_NO_ERR_TRACE(ASN_NO_PEM_HEADER)) && gotOne) { + WOLFSSL_MSG("We got one good cert, so stuff at end ok"); + ret = 0; + break; + } + /* Certificate data handled. */ + FreeDer(&part); + + if (ret == 0) { + /* Update consumed length. */ + consumed += info->consumed; + WOLFSSL_MSG(" Consumed another Cert in Chain"); + /* Update whether we got a user certificate. */ + gotOne |= (type != CA_TYPE); + /* Update count of certificates added to chain. */ + cnt++; + } + } + if (used != NULL) { + /* Return the total consumed length. */ + *used = consumed; + } + + /* Check whether there is data in the chain buffer. */ + if ((ret == 0) && (idx > 0)) { + /* Put the chain buffer against the SSL or SSL context object. */ + ret = ProcessUserChainRetain(ctx, ssl, chain.buffer, idx, cnt, type, + heap); + } + + /* Dispose of chain buffer. */ + static_buffer_free(&chain, heap, DYNAMIC_TYPE_FILE); + } + + WOLFSSL_LEAVE("ProcessUserChain", ret); + return ret; +} + +#ifndef NO_RSA +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) +/* See if DER data is an RSA private key. + * + * Checks size meets minimum RSA key size. + * This implementation uses less dynamic memory. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] devId Device identifier. + * @param [out] keyType Type of key. + * @param [out] keySize Size of key. + * @return 0 on success or not an RSA key and format unknown. + * @return RSA_KEY_SIZE_E when key size doesn't meet minimum required. + */ +static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, int devId, byte* keyType, int* keySize) +{ + int ret; + word32 idx; + int keySz = 0; + + (void)devId; + + /* Validate we have an RSA private key and get key size. */ + idx = 0; + ret = wc_RsaPrivateKeyValidate(der->buffer, &idx, &keySz, der->length); +#ifdef WOLF_PRIVATE_KEY_ID + /* If that didn't work then maybe a public key if device ID or callback. */ + if ((ret != 0) && ((devId != INVALID_DEVID) || + WOLFSSL_IS_PRIV_PK_SET(ctx, ssl))) { + word32 nSz; + + /* Decode as an RSA public key. */ + idx = 0; + ret = wc_RsaPublicKeyDecode_ex(der->buffer, &idx, der->length, NULL, + &nSz, NULL, NULL); + if (ret == 0) { + keySz = (int)nSz; + } + } +#endif + if (ret == 0) { + /* Get the minimum RSA key size from SSL or SSL context object. */ + int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz; + + /* Format, type and size are known. */ + *keyFormat = RSAk; + *keyType = rsa_sa_algo; + *keySize = keySz; + + /* Check that the size of the RSA key is enough. */ + if (keySz < minRsaSz) { + WOLFSSL_MSG("Private Key size too small"); + ret = RSA_KEY_SIZE_E; + } + /* No static ECC key possible. */ + if ((ssl != NULL) && (ssl->options.side == WOLFSSL_SERVER_END)) { + ssl->options.haveStaticECC = 0; + } + } + /* Not an RSA key but check whether we know what it is. */ + else if (*keyFormat == 0) { + WOLFSSL_MSG("Not an RSA key"); + /* Format unknown so keep trying. */ + ret = 0; + } + + return ret; +} +#else +/* See if DER data is an RSA private key. + * + * Checks size meets minimum RSA key size. + * This implementation uses more dynamic memory but supports older FIPS. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] devId Device identifier. + * @param [out] keyType Type of key. + * @param [out] keySize Size of key. + * @return 0 on success or not an RSA key and format unknown. + * @return RSA_KEY_SIZE_E when key size doesn't meet minimum required. + */ +static int ProcessBufferTryDecodeRsa(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, void* heap, int devId, byte* keyType, + int* keySize) +{ + int ret; + word32 idx; + /* make sure RSA key can be used */ +#ifdef WOLFSSL_SMALL_STACK + RsaKey* key; +#else + RsaKey key[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate an RSA key to parse into so we can get size. */ + key = (RsaKey*)XMALLOC(sizeof(RsaKey), heap, DYNAMIC_TYPE_RSA); + if (key == NULL) + return MEMORY_E; +#endif + + /* Initialize the RSA key. */ + ret = wc_InitRsaKey_ex(key, heap, devId); + if (ret == 0) { + /* Check we have an RSA private key. */ + idx = 0; + ret = wc_RsaPrivateKeyDecode(der->buffer, &idx, key, der->length); + #ifdef WOLF_PRIVATE_KEY_ID + /* If that didn't work then maybe a public key if device ID or callback. + */ + if ((ret != 0) && ((devId != INVALID_DEVID) || + WOLFSSL_IS_PRIV_PK_SET(ctx, ssl))) { + /* If that didn't work then maybe a public key if device ID or + * callback. */ + idx = 0; + ret = wc_RsaPublicKeyDecode(der->buffer, &idx, key, der->length); + } + #endif + if (ret == 0) { + /* Get the minimum RSA key size from SSL or SSL context object. */ + int minRsaSz = ssl ? ssl->options.minRsaKeySz : ctx->minRsaKeySz; + int keySz = wc_RsaEncryptSize((RsaKey*)key); + + /* Format is known. */ + *keyFormat = RSAk; + *keyType = rsa_sa_algo; + *keySize = keySz; + + /* Check that the size of the RSA key is enough. */ + if (keySz < minRsaSz) { + WOLFSSL_MSG("Private Key size too small"); + ret = RSA_KEY_SIZE_E; + } + /* No static ECC key possible. */ + if ((ssl != NULL) && (ssl->options.side == WOLFSSL_SERVER_END)) { + ssl->options.haveStaticECC = 0; + } + } + /* Not an RSA key but check whether we know what it is. */ + else if (*keyFormat == 0) { + WOLFSSL_MSG("Not an RSA key"); + /* Format unknown so keep trying. */ + ret = 0; + } + + /* Free dynamically allocated data in key. */ + wc_FreeRsaKey(key); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of allocated key. */ + XFREE(key, heap, DYNAMIC_TYPE_RSA); +#endif + + return ret; +} +#endif +#endif /* !NO_RSA */ + +#ifdef HAVE_ECC +/* See if DER data is an ECC private key. + * + * Checks size meets minimum ECC key size. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] devId Device identifier. + * @param [out] keyType Type of key. + * @param [out] keySize Size of key. + * @return 0 on success or not an ECC key and format unknown. + * @return ECC_KEY_SIZE_E when ECC key size doesn't meet minimum required. + */ +static int ProcessBufferTryDecodeEcc(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, void* heap, int devId, byte* keyType, + int* keySize) +{ + int ret = 0; + word32 idx; + /* make sure ECC key can be used */ +#ifdef WOLFSSL_SMALL_STACK + ecc_key* key; +#else + ecc_key key[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate an ECC key to parse into. */ + key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, DYNAMIC_TYPE_ECC); + if (key == NULL) + return MEMORY_E; +#endif + + /* Initialize ECC key. */ + if (wc_ecc_init_ex(key, heap, devId) == 0) { + /* Decode as an ECC private key. */ + idx = 0; + ret = wc_EccPrivateKeyDecode(der->buffer, &idx, key, der->length); + #ifdef WOLF_PRIVATE_KEY_ID + /* If that didn't work then maybe a public key if device ID or callback. + */ + if ((ret != 0) && ((devId != INVALID_DEVID) || + WOLFSSL_IS_PRIV_PK_SET(ctx, ssl))) { + /* Decode as an ECC public key. */ + idx = 0; + ret = wc_EccPublicKeyDecode(der->buffer, &idx, key, der->length); + } + #endif + #ifdef WOLFSSL_SM2 + if (*keyFormat == SM2k) { + ret = wc_ecc_set_curve(key, WOLFSSL_SM2_KEY_BITS / 8, + ECC_SM2P256V1); + } + #endif + if (ret == 0) { + /* Get the minimum ECC key size from SSL or SSL context object. */ + int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz; + int keySz = wc_ecc_size(key); + + /* Format is known. */ + *keyFormat = ECDSAk; + #ifdef WOLFSSL_SM2 + if (key->dp->id == ECC_SM2P256V1) { + *keyType = sm2_sa_algo; + } + else + #endif + { + *keyType = ecc_dsa_sa_algo; + } + *keySize = keySz; + + /* Check that the size of the ECC key is enough. */ + if (keySz < minKeySz) { + WOLFSSL_MSG("ECC private key too small"); + ret = ECC_KEY_SIZE_E; + } + /* Static ECC key possible. */ + if (ssl) { + ssl->options.haveStaticECC = 1; + } + else { + ctx->haveStaticECC = 1; + } + } + /* Not an ECC key but check whether we know what it is. */ + else if (*keyFormat == 0) { + WOLFSSL_MSG("Not an ECC key"); + /* Format unknown so keep trying. */ + ret = 0; + } + + /* Free dynamically allocated data in key. */ + wc_ecc_free(key); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of allocated key. */ + XFREE(key, heap, DYNAMIC_TYPE_ECC); +#endif + return ret; +} +#endif /* HAVE_ECC */ + +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) +/* See if DER data is an Ed25519 private key. + * + * Checks size meets minimum ECC key size. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] devId Device identifier. + * @param [out] keyType Type of key. + * @param [out] keySize Size of key. + * @return 0 on success or not an Ed25519 key and format unknown. + * @return ECC_KEY_SIZE_E when key size doesn't meet minimum required. + */ +static int ProcessBufferTryDecodeEd25519(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, void* heap, int devId, byte* keyType, + int* keySize) +{ + int ret; + word32 idx; + /* make sure Ed25519 key can be used */ +#ifdef WOLFSSL_SMALL_STACK + ed25519_key* key; +#else + ed25519_key key[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate an Ed25519 key to parse into. */ + key = (ed25519_key*)XMALLOC(sizeof(ed25519_key), heap, + DYNAMIC_TYPE_ED25519); + if (key == NULL) + return MEMORY_E; +#endif + + /* Initialize Ed25519 key. */ + ret = wc_ed25519_init_ex(key, heap, devId); + if (ret == 0) { + /* Decode as an Ed25519 private key. */ + idx = 0; + ret = wc_Ed25519PrivateKeyDecode(der->buffer, &idx, key, der->length); + #ifdef WOLF_PRIVATE_KEY_ID + /* If that didn't work then maybe a public key if device ID or callback. + */ + if ((ret != 0) && ((devId != INVALID_DEVID) || + WOLFSSL_IS_PRIV_PK_SET(ctx, ssl))) { + /* Decode as an Ed25519 public key. */ + idx = 0; + ret = wc_Ed25519PublicKeyDecode(der->buffer, &idx, key, + der->length); + } + #endif + if (ret == 0) { + /* Get the minimum ECC key size from SSL or SSL context object. */ + int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz; + + /* Format is known. */ + *keyFormat = ED25519k; + *keyType = ed25519_sa_algo; + *keySize = ED25519_KEY_SIZE; + + /* Check that the size of the ECC key is enough. */ + if (ED25519_KEY_SIZE < minKeySz) { + WOLFSSL_MSG("ED25519 private key too small"); + ret = ECC_KEY_SIZE_E; + } + if (ssl != NULL) { +#if !defined(WOLFSSL_NO_CLIENT_AUTH) && !defined(NO_ED25519_CLIENT_AUTH) + /* Ed25519 requires caching enabled for tracking message + * hash used in EdDSA_Update for signing */ + ssl->options.cacheMessages = 1; +#endif + } + } + /* Not an Ed25519 key but check whether we know what it is. */ + else if (*keyFormat == 0) { + WOLFSSL_MSG("Not an Ed25519 key"); + /* Format unknown so keep trying. */ + ret = 0; + } + + /* Free dynamically allocated data in key. */ + wc_ed25519_free(key); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of allocated key. */ + XFREE(key, heap, DYNAMIC_TYPE_ED25519); +#endif + return ret; +} +#endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */ + +#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT) +/* See if DER data is an Ed448 private key. + * + * Checks size meets minimum ECC key size. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] devId Device identifier. + * @param [out] keyType Type of key. + * @param [out] keySize Size of key. + * @return 0 on success or not an Ed448 key and format unknown. + * @return ECC_KEY_SIZE_E when key size doesn't meet minimum required. + */ +static int ProcessBufferTryDecodeEd448(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, void* heap, int devId, byte* keyType, + int* keySize) +{ + int ret; + word32 idx; + /* make sure Ed448 key can be used */ +#ifdef WOLFSSL_SMALL_STACK + ed448_key* key = NULL; +#else + ed448_key key[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate an Ed448 key to parse into. */ + key = (ed448_key*)XMALLOC(sizeof(ed448_key), heap, DYNAMIC_TYPE_ED448); + if (key == NULL) + return MEMORY_E; +#endif + + /* Initialize Ed448 key. */ + ret = wc_ed448_init_ex(key, heap, devId); + if (ret == 0) { + /* Decode as an Ed448 private key. */ + idx = 0; + ret = wc_Ed448PrivateKeyDecode(der->buffer, &idx, key, der->length); + #ifdef WOLF_PRIVATE_KEY_ID + /* If that didn't work then maybe a public key if device ID or callback. + */ + if ((ret != 0) && ((devId != INVALID_DEVID) || + WOLFSSL_IS_PRIV_PK_SET(ctx, ssl))) { + /* Decode as an Ed448 public key. */ + idx = 0; + ret = wc_Ed448PublicKeyDecode(der->buffer, &idx, key, der->length); + } + #endif + if (ret == 0) { + /* Get the minimum ECC key size from SSL or SSL context object. */ + int minKeySz = ssl ? ssl->options.minEccKeySz : ctx->minEccKeySz; + + /* Format is known. */ + *keyFormat = ED448k; + *keyType = ed448_sa_algo; + *keySize = ED448_KEY_SIZE; + + /* Check that the size of the ECC key is enough. */ + if (ED448_KEY_SIZE < minKeySz) { + WOLFSSL_MSG("ED448 private key too small"); + ret = ECC_KEY_SIZE_E; + } + if (ssl != NULL) { + /* Ed448 requires caching enabled for tracking message + * hash used in EdDSA_Update for signing */ + ssl->options.cacheMessages = 1; + } + } + /* Not an Ed448 key but check whether we know what it is. */ + else if (*keyFormat == 0) { + WOLFSSL_MSG("Not an Ed448 key"); + /* Format unknown so keep trying. */ + ret = 0; + } + + /* Free dynamically allocated data in key. */ + wc_ed448_free(key); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of allocated key. */ + XFREE(key, heap, DYNAMIC_TYPE_ED448); +#endif + return ret; +} +#endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */ + +#if defined(HAVE_FALCON) +/* See if DER data is an Falcon private key. + * + * Checks size meets minimum Falcon key size. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] devId Device identifier. + * @param [out] keyType Type of key. + * @param [out] keySize Size of key. + * @return 0 on success or not an Falcon key and format unknown. + * @return FALCON_KEY_SIZE_E when key size doesn't meet minimum required. + */ +static int ProcessBufferTryDecodeFalcon(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, void* heap, byte* keyType, int* keySize) +{ + int ret; + falcon_key* key; + + /* Allocate a Falcon key to parse into. */ + key = (falcon_key*)XMALLOC(sizeof(falcon_key), heap, DYNAMIC_TYPE_FALCON); + if (key == NULL) { + return MEMORY_E; + } + + /* Initialize Falcon key. */ + ret = wc_falcon_init(key); + if (ret == 0) { + /* Set up key to parse the format specified. */ + if (*keyFormat == FALCON_LEVEL1k) { + ret = wc_falcon_set_level(key, 1); + } + else if (*keyFormat == FALCON_LEVEL5k) { + ret = wc_falcon_set_level(key, 5); + } + else { + /* What if *keyformat is 0? We might want to do something more + * graceful here. */ + /* TODO: get the size of the private key for different formats and + * compare with DER length. */ + wc_falcon_free(key); + ret = ALGO_ID_E; + } + } + + if (ret == 0) { + /* Decode as a Falcon private key. */ + ret = wc_falcon_import_private_only(der->buffer, der->length, key); + if (ret == 0) { + /* Get the minimum Falcon key size from SSL or SSL context object. + */ + int minKeySz = ssl ? ssl->options.minFalconKeySz : + ctx->minFalconKeySz; + + /* Format is known. */ + if (*keyFormat == FALCON_LEVEL1k) { + *keyType = falcon_level1_sa_algo; + *keySize = FALCON_LEVEL1_KEY_SIZE; + } + else { + *keyType = falcon_level5_sa_algo; + *keySize = FALCON_LEVEL5_KEY_SIZE; + } + + /* Check that the size of the Falcon key is enough. */ + if (*keySize < minKeySz) { + WOLFSSL_MSG("Falcon private key too small"); + ret = FALCON_KEY_SIZE_E; + } + } + /* Not a Falcon key but check whether we know what it is. */ + else if (*keyFormat == 0) { + WOLFSSL_MSG("Not a Falcon key"); + /* Format unknown so keep trying. */ + ret = 0; + } + + /* Free dynamically allocated data in key. */ + wc_falcon_free(key); + } + + /* Dispose of allocated key. */ + XFREE(key, heap, DYNAMIC_TYPE_FALCON); + return ret; +} +#endif + +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) +/* See if DER data is an Dilithium private key. + * + * Checks size meets minimum Falcon key size. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] devId Device identifier. + * @param [out] keyType Type of key. + * @param [out] keySize Size of key. + * @return 0 on success or not a Dilithium key and format unknown. + * @return DILITHIUM_KEY_SIZE_E when key size doesn't meet minimum required. + */ +static int ProcessBufferTryDecodeDilithium(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, void* heap, byte* keyType, int* keySize) +{ + int ret; + word32 idx; + dilithium_key* key; + + /* Allocate a Dilithium key to parse into. */ + key = (dilithium_key*)XMALLOC(sizeof(dilithium_key), heap, + DYNAMIC_TYPE_DILITHIUM); + if (key == NULL) { + return MEMORY_E; + } + + /* Initialize Dilithium key. */ + ret = wc_dilithium_init(key); + if (ret == 0) { + /* Set up key to parse the format specified. */ + if (*keyFormat == DILITHIUM_LEVEL2k) { + ret = wc_dilithium_set_level(key, 2); + } + else if (*keyFormat == DILITHIUM_LEVEL3k) { + ret = wc_dilithium_set_level(key, 3); + } + else if (*keyFormat == DILITHIUM_LEVEL5k) { + ret = wc_dilithium_set_level(key, 5); + } + else { + /* What if *keyformat is 0? We might want to do something more + * graceful here. */ + /* TODO: get the size of the private key for different formats and + * compare with DER length. */ + wc_dilithium_free(key); + ret = ALGO_ID_E; + } + } + + if (ret == 0) { + /* Decode as a Dilithium private key. */ + idx = 0; + ret = wc_Dilithium_PrivateKeyDecode(der->buffer, &idx, key, der->length); + if (ret == 0) { + /* Get the minimum Dilithium key size from SSL or SSL context + * object. */ + int minKeySz = ssl ? ssl->options.minDilithiumKeySz : + ctx->minDilithiumKeySz; + + /* Format is known. */ + if (*keyFormat == DILITHIUM_LEVEL2k) { + *keyType = dilithium_level2_sa_algo; + *keySize = DILITHIUM_LEVEL2_KEY_SIZE; + } + else if (*keyFormat == DILITHIUM_LEVEL3k) { + *keyType = dilithium_level3_sa_algo; + *keySize = DILITHIUM_LEVEL3_KEY_SIZE; + } + else if (*keyFormat == DILITHIUM_LEVEL5k) { + *keyType = dilithium_level5_sa_algo; + *keySize = DILITHIUM_LEVEL5_KEY_SIZE; + } + + /* Check that the size of the Dilithium key is enough. */ + if (*keySize < minKeySz) { + WOLFSSL_MSG("Dilithium private key too small"); + ret = DILITHIUM_KEY_SIZE_E; + } + } + /* Not a Dilithium key but check whether we know what it is. */ + else if (*keyFormat == 0) { + WOLFSSL_MSG("Not a Dilithium key"); + /* Format unknown so keep trying. */ + ret = 0; + } + + /* Free dynamically allocated data in key. */ + wc_dilithium_free(key); + } + + /* Dispose of allocated key. */ + XFREE(key, heap, DYNAMIC_TYPE_DILITHIUM); + return ret; +} +#endif /* HAVE_DILITHIUM */ + +/* Try to decode DER data is a known private key. + * + * Checks size meets minimum for key type. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in, out] keyFormat On in, expected format. 0 means unknown. + * @param [in] heap Dynamic memory allocation hint. + * @param [out] type Type of key: + * PRIVATEKEY_TYPE or ALT_PRIVATEKEY_TYPE. + * @return 0 on success. + * @return BAD_FUNC_ARG when der or keyFormat is NULL. + * @return BAD_FUNC_ARG when ctx and ssl are NULL. + * @return WOLFSSL_BAD_FILE when unable to identify the key format. + */ +static int ProcessBufferTryDecode(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int* keyFormat, void* heap, int type) +{ + int ret = 0; + int devId = wolfSSL_CTX_GetDevId(ctx, ssl); + byte* keyType = NULL; + int* keySz = NULL; + + (void)heap; + (void)devId; + (void)type; + + /* Validate parameters. */ + if ((der == NULL) || (keyFormat == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Must have an SSL context or SSL object to use. */ + if ((ret == 0) && (ctx == NULL) && (ssl == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Determine where to put key type and size in SSL or context object. */ + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (type == ALT_PRIVATEKEY_TYPE) { + if (ssl != NULL) { + keyType = &ssl->buffers.altKeyType; + keySz = &ssl->buffers.altKeySz; + } + else { + keyType = &ctx->altPrivateKeyType; + keySz = &ctx->altPrivateKeySz; + } + } + else + #endif + /* Type is PRIVATEKEY_TYPE. */ + if (ssl != NULL) { + keyType = &ssl->buffers.keyType; + keySz = &ssl->buffers.keySz; + } + else { + keyType = &ctx->privateKeyType; + keySz = &ctx->privateKeySz; + } + } + +#ifndef NO_RSA + /* Try RSA if key format is RSA or yet unknown. */ + if ((ret == 0) && ((*keyFormat == 0) || (*keyFormat == RSAk))) { +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) + ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keyFormat, devId, + keyType, keySz); +#else + ret = ProcessBufferTryDecodeRsa(ctx, ssl, der, keyFormat, heap, devId, + keyType, keySz); +#endif + } +#endif +#ifdef HAVE_ECC + /* Try ECC if key format is ECDSA or SM2, or yet unknown. */ + if ((ret == 0) && ((*keyFormat == 0) || (*keyFormat == ECDSAk) + #ifdef WOLFSSL_SM2 + || (*keyFormat == SM2k) + #endif + )) { + ret = ProcessBufferTryDecodeEcc(ctx, ssl, der, keyFormat, heap, devId, + keyType, keySz); + } +#endif /* HAVE_ECC */ +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) + /* Try Ed25519 if key format is Ed25519 or yet unknown. */ + if ((ret == 0) && ((*keyFormat == 0 || *keyFormat == ED25519k))) { + ret = ProcessBufferTryDecodeEd25519(ctx, ssl, der, keyFormat, heap, + devId, keyType, keySz); + } +#endif /* HAVE_ED25519 && HAVE_ED25519_KEY_IMPORT */ +#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT) + /* Try Ed448 if key format is Ed448 or yet unknown. */ + if ((ret == 0) && ((*keyFormat == 0 || *keyFormat == ED448k))) { + ret = ProcessBufferTryDecodeEd448(ctx, ssl, der, keyFormat, heap, devId, + keyType, keySz); + } +#endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT */ +#if defined(HAVE_FALCON) + /* Try Falcon if key format is Falcon level 1k or 5k or yet unknown. */ + if ((ret == 0) && ((*keyFormat == 0) || (*keyFormat == FALCON_LEVEL1k) || + (*keyFormat == FALCON_LEVEL5k))) { + ret = ProcessBufferTryDecodeFalcon(ctx, ssl, der, keyFormat, heap, + keyType, keySz); + } +#endif /* HAVE_FALCON */ +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) + /* Try Falcon if key format is Dilithium level 2k, 3k or 5k or yet unknown. + */ + if ((ret == 0) && ((*keyFormat == 0) || (*keyFormat == DILITHIUM_LEVEL2k) || + (*keyFormat == DILITHIUM_LEVEL3k) || + (*keyFormat == DILITHIUM_LEVEL5k))) { + ret = ProcessBufferTryDecodeDilithium(ctx, ssl, der, keyFormat, heap, + keyType, keySz); + } +#endif /* HAVE_DILITHIUM */ + + /* Check we know the format. */ + if ((ret == 0) && (*keyFormat == 0)) { + WOLFSSL_MSG("Not a supported key type"); + /* Not supported key format. */ + ret = WOLFSSL_BAD_FILE; + } + + return ret; +} + +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) +/* Decrypt PKCS#8 private key. + * + * @param [in] info Encryption information. + * @param [in] der DER encoded data. + * @param [in] heap Dynamic memory allocation hint. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int ProcessBufferPrivPkcs8Dec(EncryptedInfo* info, DerBuffer* der, + void* heap) +{ + int ret = 0; + word32 algId; + int passwordSz = NAME_SZ; +#ifndef WOLFSSL_SMALL_STACK + char password[NAME_SZ]; +#else + char* password; +#endif + + (void)heap; +#ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for password. */ + password = (char*)XMALLOC(passwordSz, heap, DYNAMIC_TYPE_STRING); + if (password == NULL) { + ret = MEMORY_E; + } +#endif + + if (ret == 0) { + /* Get password. */ + ret = info->passwd_cb(password, passwordSz, PEM_PASS_READ, + info->passwd_userdata); + } + if (ret >= 0) { + /* Returned value is password size. */ + passwordSz = ret; + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Add("ProcessBuffer password", password, passwordSz); + #endif + + /* Decrypt PKCS#8 private key inline and get algorithm id. */ + ret = ToTraditionalEnc(der->buffer, der->length, password, passwordSz, + &algId); + } + if (ret >= 0) { + /* Zero out encrypted data not overwritten. */ + ForceZero(der->buffer + ret, der->length - ret); + /* Set decrypted data length. */ + der->length = (word32)ret; + } + + /* Ensure password is zeroized. */ + ForceZero(password, (word32)passwordSz); +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of password memory. */ + XFREE(password, heap, DYNAMIC_TYPE_STRING); +#elif defined(WOLFSSL_CHECK_MEM_ZERO) + wc_MemZero_Check(password, NAME_SZ); +#endif + return ret; +} +#endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */ + +/* Put the DER into the SSL or SSL context object. + * + * Precondition: ctx or ssl is not NULL. + * Precondition: Must be a private key type. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @return 0 on success. + */ +static int ProcessBufferPrivKeyHandleDer(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer** der, int type) +{ + int ret = 0; + + (void)type; + +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (type == ALT_PRIVATEKEY_TYPE) { + /* Put in alternate private key fields of objects. */ + if (ssl != NULL) { + /* Dispose of previous key if not context's. */ + if (ssl->buffers.weOwnAltKey) { + FreeDer(&ssl->buffers.altKey); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.altKeyMask); + #endif + } + ssl->buffers.altKeyId = 0; + ssl->buffers.altKeyLabel = 0; + ssl->buffers.altKeyDevId = INVALID_DEVID; + /* Store key by reference and own it. */ + ssl->buffers.altKey = *der; + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Add("SSL Buffers key", (*der)->buffer, (*der)->length); + #endif + ssl->buffers.weOwnAltKey = 1; + } + else if (ctx != NULL) { + /* Dispose of previous key. */ + FreeDer(&ctx->altPrivateKey); + ctx->altPrivateKeyId = 0; + ctx->altPrivateKeyLabel = 0; + ctx->altPrivateKeyDevId = INVALID_DEVID; + /* Store key by reference. */ + ctx->altPrivateKey = *der; + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Add("CTX private key", (*der)->buffer, (*der)->length); + #endif + } + } + else +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + if (ssl != NULL) { + /* Dispose of previous key if not context's. */ + if (ssl->buffers.weOwnKey) { + FreeDer(&ssl->buffers.key); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.keyMask); + #endif + } + ssl->buffers.keyId = 0; + ssl->buffers.keyLabel = 0; + ssl->buffers.keyDevId = INVALID_DEVID; + /* Store key by reference and own it. */ + ssl->buffers.key = *der; + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Add("SSL Buffers key", (*der)->buffer, (*der)->length); + #endif + ssl->buffers.weOwnKey = 1; + } + else if (ctx != NULL) { + /* Dispose of previous key. */ + FreeDer(&ctx->privateKey); + ctx->privateKeyId = 0; + ctx->privateKeyLabel = 0; + ctx->privateKeyDevId = INVALID_DEVID; + /* Store key by reference. */ + ctx->privateKey = *der; + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Add("CTX private key", (*der)->buffer, (*der)->length); + #endif + } + + return ret; +} + +/* Decode private key. + * + * Precondition: ctx or ssl is not NULL. + * Precondition: Must be a private key type. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoding. + * @param [in] format Original format of data. + * @param [in] info Encryption information. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] type Type of data: + * PRIVATEKEY_TYPE or ALT_PRIVATEKEY_TYPE. + * @param [in] algId Algorithm id of key. + * @return 0 on success. + * @return WOLFSSL_BAD_FILE when not able to decode. + */ +static int ProcessBufferPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int format, EncryptedInfo* info, void* heap, int type, + int algId) +{ + int ret; +#if (defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED)) || \ + defined(HAVE_PKCS8) + word32 p8AlgId = 0; +#endif + + (void)info; + (void)format; + +#ifdef HAVE_PKCS8 + /* Try and remove PKCS8 header and get algorithm id. */ + ret = ToTraditional_ex(der->buffer, der->length, &p8AlgId); + if (ret > 0) { + /* Header stripped inline. */ + der->length = (word32)ret; + algId = p8AlgId; + } +#endif + + /* Put the data into the SSL or SSL context object. */ + ret = ProcessBufferPrivKeyHandleDer(ctx, ssl, &der, type); + if (ret == 0) { + /* Try to decode the DER data. */ + ret = ProcessBufferTryDecode(ctx, ssl, der, &algId, heap, type); + } + +#if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) + /* If private key type PKCS8 header wasn't already removed (algId == 0). */ + if (((ret != 0) || (algId == 0)) && (format != WOLFSSL_FILETYPE_PEM) && + (info->passwd_cb != NULL) && (algId == 0)) { + /* Try to decrypt DER data as a PKCS#8 private key. */ + ret = ProcessBufferPrivPkcs8Dec(info, der, heap); + if (ret >= 0) { + /* Try to decode decrypted data. */ + ret = ProcessBufferTryDecode(ctx, ssl, der, &algId, heap, type); + } + } +#endif /* WOLFSSL_ENCRYPTED_KEYS && !NO_PWDBASED */ + +#ifdef WOLFSSL_BLIND_PRIVATE_KEY +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (type == ALT_PRIVATEKEY_TYPE) { + if (ssl != NULL) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.altKey, + &ssl->buffers.altKeyMask); + } + else { + ret = wolfssl_priv_der_blind(NULL, ctx->altPrivateKey, + &ctx->altPrivateKeyMask); + } + } + else +#endif + if (ssl != NULL) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + &ssl->buffers.keyMask); + } + else { + ret = wolfssl_priv_der_blind(NULL, ctx->privateKey, + &ctx->privateKeyMask); + } +#endif + + /* Check if we were able to determine algorithm id. */ + if ((ret == 0) && (algId == 0)) { + #ifdef OPENSSL_EXTRA + /* Decryption password is probably wrong. */ + if (info->passwd_cb) { + EVPerr(0, EVP_R_BAD_DECRYPT); + } + #endif + WOLFSSL_ERROR(WOLFSSL_BAD_FILE); + /* Unable to decode DER data. */ + ret = WOLFSSL_BAD_FILE; + } + + return ret; +} + +/* Use the key OID to determine have options. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] keyOID OID for public/private key. + */ +static void wolfssl_set_have_from_key_oid(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + int keyOID) +{ + /* Set which private key algorithm available based on key OID. */ + switch (keyOID) { + case ECDSAk: + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + #endif + #ifdef HAVE_ED25519 + case ED25519k: + #endif + #ifdef HAVE_ED448 + case ED448k: + #endif + if (ssl != NULL) { + ssl->options.haveECC = 1; + } + else { + ctx->haveECC = 1; + } + break; + #ifndef NO_RSA + case RSAk: + #ifdef WC_RSA_PSS + case RSAPSSk: + #endif + if (ssl != NULL) { + ssl->options.haveRSA = 1; + } + else { + ctx->haveRSA = 1; + } + break; + #endif + #ifdef HAVE_FALCON + case FALCON_LEVEL1k: + case FALCON_LEVEL5k: + if (ssl != NULL) { + ssl->options.haveFalconSig = 1; + } + else { + ctx->haveFalconSig = 1; + } + break; + #endif /* HAVE_FALCON */ + #ifdef HAVE_DILITHIUM + case DILITHIUM_LEVEL2k: + case DILITHIUM_LEVEL3k: + case DILITHIUM_LEVEL5k: + if (ssl != NULL) { + ssl->options.haveDilithiumSig = 1; + } + else { + ctx->haveDilithiumSig = 1; + } + break; + #endif /* HAVE_DILITHIUM */ + default: + WOLFSSL_MSG("Cert key not supported"); + break; + } +} + +/* Set which private key algorithm we have against SSL or SSL context object. + * + * Precondition: ctx or ssl is not NULL. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] cert Decode certificate. + */ +static void ProcessBufferCertSetHave(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DecodedCert* cert) +{ + if (ssl != NULL) { + /* Reset signatures we have in SSL. */ + ssl->options.haveECDSAsig = 0; + ssl->options.haveFalconSig = 0; + ssl->options.haveDilithiumSig = 0; + } + + /* Set which signature we have based on the type in the cert. */ + switch (cert->signatureOID) { + case CTC_SHAwECDSA: + case CTC_SHA256wECDSA: + case CTC_SHA384wECDSA: + case CTC_SHA512wECDSA: + #ifdef HAVE_ED25519 + case CTC_ED25519: + #endif + #ifdef HAVE_ED448 + case CTC_ED448: + #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case CTC_SM3wSM2: + #endif + WOLFSSL_MSG("ECDSA/ED25519/ED448 cert signature"); + if (ssl) { + ssl->options.haveECDSAsig = 1; + } + else if (ctx) { + ctx->haveECDSAsig = 1; + } + break; + #ifdef HAVE_FALCON + case CTC_FALCON_LEVEL1: + case CTC_FALCON_LEVEL5: + WOLFSSL_MSG("Falcon cert signature"); + if (ssl) { + ssl->options.haveFalconSig = 1; + } + else if (ctx) { + ctx->haveFalconSig = 1; + } + break; + #endif + #ifdef HAVE_DILITHIUM + case CTC_DILITHIUM_LEVEL2: + case CTC_DILITHIUM_LEVEL3: + case CTC_DILITHIUM_LEVEL5: + WOLFSSL_MSG("Dilithium cert signature"); + if (ssl) { + ssl->options.haveDilithiumSig = 1; + } + else if (ctx) { + ctx->haveDilithiumSig = 1; + } + break; + #endif + default: + WOLFSSL_MSG("Cert signature not supported"); + break; + } + +#if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \ + defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || !defined(NO_RSA) + #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) + /* Set the private key curve OID. */ + if (ssl != NULL) { + ssl->pkCurveOID = cert->pkCurveOID; + } + else if (ctx) { + ctx->pkCurveOID = cert->pkCurveOID; + } + #endif +#ifndef WC_STRICT_SIG + wolfssl_set_have_from_key_oid(ctx, ssl, cert->keyOID); +#else + /* Set whether ECC is available based on signature available. */ + if (ssl != NULL) { + ssl->options.haveECC = ssl->options.haveECDSAsig; + } + else if (ctx) { + ctx->haveECC = ctx->haveECDSAsig; + } +#endif /* !WC_STRICT_SIG */ +#endif +} + +/* Check key size is valid. + * + * Precondition: ctx or ssl is not NULL. + * + * @param [in] min Minimum key size. + * @param [in] max Maximum key size. + * @param [in] keySz Key size. + * @param [in] err Error value to return when key size is invalid. + * @return 0 on success. + * @return err when verifying and min is less than 0 or key size is invalid. + */ +#define CHECK_KEY_SZ(min, max, keySz, err) \ + (((min) < 0) || ((keySz) < (min)) || ((keySz) > (max))) ? (err) : 0 + +/* Check public key in certificate. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] cert Certificate object. + * @return 0 on success. + * @return Non-zero when an error occurred. + */ +static int ProcessBufferCertPublicKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DecodedCert* cert, int checkKeySz) +{ + int ret = 0; + byte keyType = 0; + int keySz = 0; +#ifndef NO_RSA + word32 idx; +#endif + + /* Get key size and check unless not verifying. */ + switch (cert->keyOID) { +#ifndef NO_RSA + #ifdef WC_RSA_PSS + case RSAPSSk: + #endif + case RSAk: + keyType = rsa_sa_algo; + /* Determine RSA key size by parsing public key */ + idx = 0; + ret = wc_RsaPublicKeyDecode_ex(cert->publicKey, &idx, + cert->pubKeySize, NULL, (word32*)&keySz, NULL, NULL); + if ((ret == 0) && checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minRsaKeySz : + ctx->minRsaKeySz, RSA_MAX_SIZE / 8, keySz, RSA_KEY_SIZE_E); + } + break; +#endif /* !NO_RSA */ + #ifdef HAVE_ECC + case ECDSAk: + keyType = ecc_dsa_sa_algo; + /* Determine ECC key size based on curve */ + #ifdef WOLFSSL_CUSTOM_CURVES + if ((cert->pkCurveOID == 0) && (cert->pkCurveSize != 0)) { + keySz = cert->pkCurveSize; + } + else + #endif + { + keySz = wc_ecc_get_curve_size_from_id(wc_ecc_get_oid( + cert->pkCurveOID, NULL, NULL)); + } + + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, (MAX_ECC_BITS + 7) / 8, keySz, + ECC_KEY_SIZE_E); + } + break; + #endif /* HAVE_ECC */ + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + keyType = sm2_sa_algo; + /* Determine ECC key size based on curve */ + keySz = WOLFSSL_SM2_KEY_BITS / 8; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, (MAX_ECC_BITS + 7) / 8, keySz, + ECC_KEY_SIZE_E); + } + break; + #endif /* HAVE_ED25519 */ + #ifdef HAVE_ED25519 + case ED25519k: + keyType = ed25519_sa_algo; + /* ED25519 is fixed key size */ + keySz = ED25519_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, ED25519_KEY_SIZE, keySz, ECC_KEY_SIZE_E); + } + break; + #endif /* HAVE_ED25519 */ + #ifdef HAVE_ED448 + case ED448k: + keyType = ed448_sa_algo; + /* ED448 is fixed key size */ + keySz = ED448_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, ED448_KEY_SIZE, keySz, ECC_KEY_SIZE_E); + } + break; + #endif /* HAVE_ED448 */ + #if defined(HAVE_FALCON) + case FALCON_LEVEL1k: + keyType = falcon_level1_sa_algo; + /* Falcon is fixed key size */ + keySz = FALCON_LEVEL1_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minFalconKeySz : + ctx->minFalconKeySz, FALCON_MAX_KEY_SIZE, keySz, + FALCON_KEY_SIZE_E); + } + break; + case FALCON_LEVEL5k: + keyType = falcon_level5_sa_algo; + /* Falcon is fixed key size */ + keySz = FALCON_LEVEL5_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minFalconKeySz : + ctx->minFalconKeySz, FALCON_MAX_KEY_SIZE, keySz, + FALCON_KEY_SIZE_E); + } + break; + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) + case DILITHIUM_LEVEL2k: + keyType = dilithium_level2_sa_algo; + /* Dilithium is fixed key size */ + keySz = DILITHIUM_LEVEL2_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minDilithiumKeySz : + ctx->minDilithiumKeySz, DILITHIUM_MAX_KEY_SIZE, keySz, + DILITHIUM_KEY_SIZE_E); + } + break; + case DILITHIUM_LEVEL3k: + keyType = dilithium_level3_sa_algo; + /* Dilithium is fixed key size */ + keySz = DILITHIUM_LEVEL3_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minDilithiumKeySz : + ctx->minDilithiumKeySz, DILITHIUM_MAX_KEY_SIZE, keySz, + DILITHIUM_KEY_SIZE_E); + } + break; + case DILITHIUM_LEVEL5k: + keyType = dilithium_level5_sa_algo; + /* Dilithium is fixed key size */ + keySz = DILITHIUM_LEVEL5_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minDilithiumKeySz : + ctx->minDilithiumKeySz, DILITHIUM_MAX_KEY_SIZE, keySz, + DILITHIUM_KEY_SIZE_E); + } + break; + #endif /* HAVE_DILITHIUM */ + + default: + WOLFSSL_MSG("No key size check done on public key in certificate"); + break; + } + + /* Store the type and key size as there may not be a private key set. */ + if (ssl != NULL) { + ssl->buffers.keyType = keyType; + ssl->buffers.keySz = keySz; + } + else { + ctx->privateKeyType = keyType; + ctx->privateKeySz = keySz; + } + + return ret; +} + +#ifdef WOLFSSL_DUAL_ALG_CERTS +static int ProcessBufferCertAltPublicKey(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DecodedCert* cert, int checkKeySz) +{ + int ret = 0; + void* heap = WOLFSSL_HEAP(ctx, ssl); + byte keyType = 0; + int keySz = 0; +#ifndef NO_RSA + word32 idx; +#endif + + /* Check alternative key size of cert. */ + switch (cert->sapkiOID) { + /* No OID set. */ + case 0: + if (cert->sapkiLen != 0) { + /* Have the alternative key data but no OID. */ + ret = NOT_COMPILED_IN; + } + break; + +#ifndef NO_RSA + #ifdef WC_RSA_PSS + case RSAPSSk: + #endif + case RSAk: + keyType = rsa_sa_algo; + /* Determine RSA key size by parsing public key */ + idx = 0; + ret = wc_RsaPublicKeyDecode_ex(cert->sapkiDer, &idx, + cert->sapkiLen, NULL, (word32*)&keySz, NULL, NULL); + if ((ret == 0) && checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minRsaKeySz : + ctx->minRsaKeySz, RSA_MAX_SIZE / 8, keySz, RSA_KEY_SIZE_E); + } + break; +#endif /* !NO_RSA */ + #ifdef HAVE_ECC + case ECDSAk: + { + #ifdef WOLFSSL_SMALL_STACK + ecc_key* temp_key = NULL; + #else + ecc_key temp_key[1]; + #endif + keyType = ecc_dsa_sa_algo; + + #ifdef WOLFSSL_SMALL_STACK + temp_key = (ecc_key*)XMALLOC(sizeof(ecc_key), heap, + DYNAMIC_TYPE_ECC); + if (temp_key == NULL) { + ret = MEMORY_E; + } + #endif + + /* Determine ECC key size. We have to decode the sapki for + * that. */ + if (ret == 0) { + ret = wc_ecc_init_ex(temp_key, heap, INVALID_DEVID); + if (ret == 0) { + idx = 0; + ret = wc_EccPublicKeyDecode(cert->sapkiDer, &idx, temp_key, + cert->sapkiLen); + if (ret == 0) { + keySz = wc_ecc_size(temp_key); + } + wc_ecc_free(temp_key); + } + } + #ifdef WOLFSSL_SMALL_STACK + XFREE(temp_key, heap, DYNAMIC_TYPE_ECC); + #endif + + if ((ret == 0) && checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, (MAX_ECC_BITS + 7) / 8, keySz, + ECC_KEY_SIZE_E); + } + break; + } + #endif /* HAVE_ECC */ + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + keyType = sm2_sa_algo; + /* Determine ECC key size based on curve */ + keySz = WOLFSSL_SM2_KEY_BITS / 8; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, (MAX_ECC_BITS + 7) / 8, keySz, + ECC_KEY_SIZE_E); + } + break; + #endif /* HAVE_ED25519 */ + #ifdef HAVE_ED25519 + case ED25519k: + keyType = ed25519_sa_algo; + /* ED25519 is fixed key size */ + keySz = ED25519_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, ED25519_KEY_SIZE, keySz, ECC_KEY_SIZE_E); + } + break; + #endif /* HAVE_ED25519 */ + #ifdef HAVE_ED448 + case ED448k: + keyType = ed448_sa_algo; + /* ED448 is fixed key size */ + keySz = ED448_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minEccKeySz : + ctx->minEccKeySz, ED448_KEY_SIZE, keySz, ECC_KEY_SIZE_E); + } + break; + #endif /* HAVE_ED448 */ + #if defined(HAVE_FALCON) + case FALCON_LEVEL1k: + keyType = falcon_level1_sa_algo; + /* Falcon is fixed key size */ + keySz = FALCON_LEVEL1_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minFalconKeySz : + ctx->minFalconKeySz, FALCON_MAX_KEY_SIZE, keySz, + FALCON_KEY_SIZE_E); + } + break; + case FALCON_LEVEL5k: + keyType = falcon_level5_sa_algo; + /* Falcon is fixed key size */ + keySz = FALCON_LEVEL5_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minFalconKeySz : + ctx->minFalconKeySz, FALCON_MAX_KEY_SIZE, keySz, + FALCON_KEY_SIZE_E); + } + break; + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) + case DILITHIUM_LEVEL2k: + keyType = dilithium_level2_sa_algo; + /* Dilithium is fixed key size */ + keySz = DILITHIUM_LEVEL2_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minDilithiumKeySz : + ctx->minDilithiumKeySz, DILITHIUM_MAX_KEY_SIZE, keySz, + DILITHIUM_KEY_SIZE_E); + } + break; + case DILITHIUM_LEVEL3k: + keyType = dilithium_level3_sa_algo; + /* Dilithium is fixed key size */ + keySz = DILITHIUM_LEVEL3_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minDilithiumKeySz : + ctx->minDilithiumKeySz, DILITHIUM_MAX_KEY_SIZE, keySz, + DILITHIUM_KEY_SIZE_E); + } + break; + case DILITHIUM_LEVEL5k: + keyType = dilithium_level5_sa_algo; + /* Dilithium is fixed key size */ + keySz = DILITHIUM_LEVEL5_KEY_SIZE; + if (checkKeySz) { + ret = CHECK_KEY_SZ(ssl ? ssl->options.minDilithiumKeySz : + ctx->minDilithiumKeySz, DILITHIUM_MAX_KEY_SIZE, keySz, + DILITHIUM_KEY_SIZE_E); + } + break; + #endif /* HAVE_DILITHIUM */ + + default: + /* In this case, there was an OID that we didn't recognize. + * This is an error. Use not compiled in because likely the + * given algorithm was not enabled. */ + ret = NOT_COMPILED_IN; + WOLFSSL_MSG("No alt key size check done on certificate"); + break; + } + + if (ssl != NULL) { + ssl->buffers.altKeyType = (byte)keyType; + ssl->buffers.altKeySz = keySz; + } + else if (ctx != NULL) { + ctx->altPrivateKeyType = (byte)keyType; + ctx->altPrivateKeySz = keySz; + } + + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + +/* Parse the certificate and pull out information for TLS handshake. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoded X509 certificate. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + * @return WOLFSSL_BAD_FILE when decoding certificate fails. + */ +static int ProcessBufferCert(WOLFSSL_CTX* ctx, WOLFSSL* ssl, DerBuffer* der) +{ + int ret = 0; + void* heap = WOLFSSL_HEAP(ctx, ssl); +#if defined(HAVE_RPK) + RpkState* rpkState = ssl ? &ssl->options.rpkState : &ctx->rpkState; +#endif +#ifdef WOLFSSL_SMALL_STACK + DecodedCert* cert; +#else + DecodedCert cert[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for certificate to be decoded into. */ + cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), heap, DYNAMIC_TYPE_DCERT); + if (cert == NULL) { + ret = MEMORY_E; + } + + if (ret == 0) +#endif + { + /* Get device id from SSL context or SSL object. */ + int devId = wolfSSL_CTX_GetDevId(ctx, ssl); + + WOLFSSL_MSG("Checking cert signature type"); + /* Initialize certificate object. */ + InitDecodedCert_ex(cert, der->buffer, der->length, heap, devId); + + /* Decode up to and including public key. */ + if (DecodeToKey(cert, 0) < 0) { + WOLFSSL_MSG("Decode to key failed"); + ret = WOLFSSL_BAD_FILE; + } + if (ret == 0) { + int checkKeySz = 1; + + #if defined(HAVE_RPK) + /* Store whether the crtificate is a raw public key. */ + rpkState->isRPKLoaded = cert->isRPK; + #endif /* HAVE_RPK */ + + /* Set which private key algorithm we have. */ + ProcessBufferCertSetHave(ctx, ssl, cert); + + /* Don't check if verification is disabled for SSL. */ + if ((ssl != NULL) && ssl->options.verifyNone) { + checkKeySz = 0; + } + /* Don't check if no SSL object verification is disabled for SSL + * context. */ + else if ((ssl == NULL) && ctx->verifyNone) { + checkKeySz = 0; + } + + /* Check public key size. */ + ret = ProcessBufferCertPublicKey(ctx, ssl, cert, checkKeySz); + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ret == 0) { + ret = ProcessBufferCertAltPublicKey(ctx, ssl, cert, checkKeySz); + } + #endif + } + } + + /* Dispose of dynamic memory in certificate object. */ + FreeDecodedCert(cert); +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of certificate object. */ + XFREE(cert, heap, DYNAMIC_TYPE_DCERT); +#endif + return ret; +} + +/* Handle storing the DER encoding of the certificate. + * + * Do not free der outside of this function. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] der DER encoded certificate. + * @param [in] type Type of data: + * CERT_TYPE, CA_TYPE or TRUSTED_PEER_TYPE. + * @param [in] verify What verification to do. + * @return 0 on success. + * @return BAD_FUNC_ARG when type is CA_TYPE and ctx is NULL. + * @return WOLFSSL_BAD_CERTTYPE when data type is not supported. + */ +static int ProcessBufferCertHandleDer(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + DerBuffer* der, int type, int verify) +{ + int ret = 0; + + /* CA certificate to verify with. */ + if (type == CA_TYPE) { + /* verify CA unless user set to no verify */ + ret = AddCA(ctx->cm, &der, WOLFSSL_USER_CA, verify); + if (ret == 1) { + ret = 0; + } + } +#ifdef WOLFSSL_TRUST_PEER_CERT + /* Trusted certificate to verify peer with. */ + else if (type == TRUSTED_PEER_TYPE) { + WOLFSSL_CERT_MANAGER* cm; + + /* Get certificate manager to add certificate to. */ + if (ctx != NULL) { + cm = ctx->cm; + } + else { + SSL_CM_WARNING(ssl); + cm = SSL_CM(ssl); + } + /* Add certificate as a trusted peer. */ + ret = AddTrustedPeer(cm, &der, verify); + if (ret != 1) { + WOLFSSL_MSG("Error adding trusted peer"); + } + } +#endif /* WOLFSSL_TRUST_PEER_CERT */ + /* Leaf certificate - our certificate. */ + else if (type == CERT_TYPE) { + if (ssl != NULL) { + /* Free previous certificate if we own it. */ + if (ssl->buffers.weOwnCert) { + FreeDer(&ssl->buffers.certificate); + #ifdef KEEP_OUR_CERT + /* Dispose of X509 version of certificate. */ + wolfSSL_X509_free(ssl->ourCert); + ssl->ourCert = NULL; + #endif + } + /* Store certificate as ours. */ + ssl->buffers.certificate = der; + #ifdef KEEP_OUR_CERT + ssl->keepCert = 1; /* hold cert for ssl lifetime */ + #endif + /* We have to free the certificate buffer. */ + ssl->buffers.weOwnCert = 1; + /* ourCert is created on demand. */ + } + else if (ctx != NULL) { + /* Free previous certificate. */ + FreeDer(&ctx->certificate); /* Make sure previous is free'd */ + #ifdef KEEP_OUR_CERT + /* Dispose of X509 version of certificate if we own it. */ + if (ctx->ownOurCert) { + wolfSSL_X509_free(ctx->ourCert); + } + ctx->ourCert = NULL; + #endif + /* Store certificate as ours. */ + ctx->certificate = der; + /* ourCert is created on demand. */ + } + } + else { + /* Dispose of DER buffer. */ + FreeDer(&der); + /* Not a certificate type supported. */ + ret = WOLFSSL_BAD_CERTTYPE; + } + + return ret; +} + +/* Process certificate based on type. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] buff Buffer holding original data. + * @param [in] sz Size of data in buffer. + * @param [in] der DER encoding of certificate. + * @param [in] format Format of data. + * @param [in] type Type of data: + * CERT_TYPE, CA_TYPE or TRUSTED_PEER_TYPE. + * @param [in] verify What verification to do. + * @return 0 on success. + * @return WOLFSSL_FATAL_ERROR on failure. + */ +static int ProcessBufferCertTypes(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + const unsigned char* buff, long sz, DerBuffer* der, int format, int type, + int verify) +{ + int ret; + + (void)buff; + (void)sz; + (void)format; + + ret = ProcessBufferCertHandleDer(ctx, ssl, der, type, verify); + if ((ret == 0) && (type == CERT_TYPE)) { + /* Process leaf certificate. */ + ret = ProcessBufferCert(ctx, ssl, der); + } +#if !defined(NO_WOLFSSL_CM_VERIFY) && (!defined(NO_WOLFSSL_CLIENT) || \ + !defined(WOLFSSL_NO_CLIENT_AUTH)) + /* Hand bad CA or user certificate to callback. */ + if ((ret < 0) && ((type == CA_TYPE) || (type == CERT_TYPE))) { + /* Check for verification callback that may override error. */ + if ((ctx != NULL) && (ctx->cm != NULL) && + (ctx->cm->verifyCallback != NULL)) { + /* Verify and use callback. */ + ret = CM_VerifyBuffer_ex(ctx->cm, buff, sz, format, ret); + /* Convert error. */ + if (ret == 0) { + ret = WOLFSSL_FATAL_ERROR; + } + if (ret == 1) { + ret = 0; + } + } + } +#endif /* NO_WOLFSSL_CM_VERIFY */ + + return ret; +} + +/* Reset the cipher suites based on updated private key or certificate. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] type Type of certificate. + * @return 0 on success. + * @return WOLFSSL_FATAL_ERROR when allocation fails. + */ +static int ProcessBufferResetSuites(WOLFSSL_CTX* ctx, WOLFSSL* ssl, int type) +{ + int ret = 0; + + /* Reset suites of SSL object. */ + if (ssl != NULL) { + if (ssl->options.side == WOLFSSL_SERVER_END) { + /* Allocate memory for suites. */ + if (AllocateSuites(ssl) != 0) { + ret = WOLFSSL_FATAL_ERROR; + } + else { + /* Determine cipher suites based on what we have. */ + InitSuites(ssl->suites, ssl->version, ssl->buffers.keySz, + WOLFSSL_HAVE_RSA, SSL_HAVE_PSK(ssl), ssl->options.haveDH, + ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, + ssl->options.haveStaticECC, ssl->options.haveFalconSig, + ssl->options.haveDilithiumSig, ssl->options.useAnon, TRUE, + ssl->options.side); + } + } + } + /* Reset suites of SSL context object. */ + else if ((type == CERT_TYPE) && (ctx->method->side == WOLFSSL_SERVER_END)) { + /* Allocate memory for suites. */ + if (AllocateCtxSuites(ctx) != 0) { + ret = WOLFSSL_FATAL_ERROR; + } + else { + /* Determine cipher suites based on what we have. */ + InitSuites(ctx->suites, ctx->method->version, ctx->privateKeySz, + WOLFSSL_HAVE_RSA, CTX_HAVE_PSK(ctx), ctx->haveDH, + ctx->haveECDSAsig, ctx->haveECC, TRUE, ctx->haveStaticECC, + ctx->haveFalconSig, ctx->haveDilithiumSig, CTX_USE_ANON(ctx), + TRUE, ctx->method->side); + } + } + + return ret; +} + +#ifndef WOLFSSL_DUAL_ALG_CERTS + /* Determine whether the type is for a private key. */ + #define IS_PRIVKEY_TYPE(type) ((type) == PRIVATEKEY_TYPE) +#else + /* Determine whether the type is for a private key. */ + #define IS_PRIVKEY_TYPE(type) (((type) == PRIVATEKEY_TYPE) || \ + ((type) == ALT_PRIVATEKEY_TYPE)) +#endif + +/* Process a buffer of data. + * + * Data type is a private key or a certificate. + * The format can be ASN.1 (DER) or PEM. + * + * @param [in, out] ctx SSL context object. + * @param [in] buff Buffer holding data. + * @param [in] sz Size of data in buffer. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @param [in] type Type of data: + * CERT_TYPE, CA_TYPE, TRUSTED_PEER_TYPE, + * PRIVATEKEY_TYPE or ALT_PRIVATEKEY_TYPE. + * @param [in, out] ssl SSL object. + * @param [out] used Number of bytes consumed. + * @param [in[ userChain Whether this certificate is for user's chain. + * @param [in] verify How to verify certificate. + * @return 1 on success. + * @return Less than 1 on failure. + */ +int ProcessBuffer(WOLFSSL_CTX* ctx, const unsigned char* buff, long sz, + int format, int type, WOLFSSL* ssl, long* used, int userChain, int verify) +{ + DerBuffer* der = NULL; + int ret = 0; + void* heap = WOLFSSL_HEAP(ctx, ssl); +#ifdef WOLFSSL_SMALL_STACK + EncryptedInfo* info = NULL; +#else + EncryptedInfo info[1]; +#endif + int algId = 0; + + WOLFSSL_ENTER("ProcessBuffer"); + + /* Check data format is supported. */ + if ((format != WOLFSSL_FILETYPE_ASN1) && (format != WOLFSSL_FILETYPE_PEM)) { + ret = WOLFSSL_BAD_FILETYPE; + } + /* Need an object to store certificate into. */ + if ((ret == 0) && (ctx == NULL) && (ssl == NULL)) { + ret = BAD_FUNC_ARG; + } + /* CA certificates go into the SSL context object. */ + if ((ret == 0) && (ctx == NULL) && (type == CA_TYPE)) { + ret = BAD_FUNC_ARG; + } + /* This API does not handle CHAIN_CERT_TYPE */ + if ((ret == 0) && (type == CHAIN_CERT_TYPE)) { + ret = BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if (ret == 0) { + /* Allocate memory for encryption information. */ + info = (EncryptedInfo*)XMALLOC(sizeof(EncryptedInfo), heap, + DYNAMIC_TYPE_ENCRYPTEDINFO); + if (info == NULL) { + ret = MEMORY_E; + } + } +#endif + if (ret == 0) { + /* Initialize encryption information. */ + XMEMSET(info, 0, sizeof(EncryptedInfo)); + #if defined(WOLFSSL_ENCRYPTED_KEYS) && !defined(NO_PWDBASED) + if (ctx != NULL) { + info->passwd_cb = ctx->passwd_cb; + info->passwd_userdata = ctx->passwd_userdata; + } + #endif + + /* Get the DER data for a private key or certificate. */ + ret = DataToDerBuffer(buff, (word32)sz, format, type, info, heap, &der, + &algId); + if (used != NULL) { + /* Update to amount used/consumed. */ + *used = info->consumed; + } + #ifdef WOLFSSL_SMALL_STACK + if (ret != 0) { + /* Info no longer needed as loading failed. */ + XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO); + } + #endif + } + + if ((ret == 0) && IS_PRIVKEY_TYPE(type)) { + /* Process the private key. */ + ret = ProcessBufferPrivateKey(ctx, ssl, der, format, info, heap, type, + algId); + #ifdef WOLFSSL_SMALL_STACK + /* Info no longer needed - keep max memory usage down. */ + XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO); + #endif + } + else if (ret == 0) { + /* Processing a cerificate. */ + if (userChain) { + /* Take original buffer and add to user chain to send in TLS + * handshake. */ + ret = ProcessUserChain(ctx, ssl, buff, sz, format, type, used, info, + verify); + /* Additional chain is optional */ + if (ret == WC_NO_ERR_TRACE(ASN_NO_PEM_HEADER)) { + unsigned long pemErr = 0; + CLEAR_ASN_NO_PEM_HEADER_ERROR(pemErr); + ret = 0; + } + } + + #ifdef WOLFSSL_SMALL_STACK + /* Info no longer needed - keep max memory usage down. */ + XFREE(info, heap, DYNAMIC_TYPE_ENCRYPTEDINFO); + #endif + + if (ret == 0) { + /* Process the different types of certificates. */ + ret = ProcessBufferCertTypes(ctx, ssl, buff, sz, der, format, type, + verify); + } + else { + FreeDer(&der); + } + } + + /* Reset suites if this is a private key or user certificate. */ + if ((ret == 0) && ((type == PRIVATEKEY_TYPE) || (type == CERT_TYPE))) { + ret = ProcessBufferResetSuites(ctx, ssl, type); + } + + /* Convert return code. */ + if (ret == 0) { + ret = 1; + } + else if (ret == WOLFSSL_FATAL_ERROR) { + ret = 0; + } + WOLFSSL_LEAVE("ProcessBuffer", ret); + return ret; +} + +#if defined(WOLFSSL_WPAS) && defined(HAVE_CRL) +/* Try to parse data as a PEM CRL. + * + * @param [in] ctx SSL context object. + * @param [in] buff Buffer containing potential CRL in PEM format. + * @param [in] sz Amount of data in buffer remaining. + * @param [out] consumed Number of bytes in buffer was the CRL. + * @return 0 on success. + */ +static int ProcessChainBufferCRL(WOLFSSL_CTX* ctx, const unsigned char* buff, + long sz, long* consumed) +{ + int ret; + DerBuffer* der = NULL; + EncryptedInfo info; + + WOLFSSL_MSG("Trying a CRL"); + ret = PemToDer(buff, sz, CRL_TYPE, &der, NULL, &info, NULL); + if (ret == 0) { + WOLFSSL_MSG(" Processed a CRL"); + wolfSSL_CertManagerLoadCRLBuffer(ctx->cm, der->buffer, der->length, + WOLFSSL_FILETYPE_ASN1); + FreeDer(&der); + *consumed = info.consumed; + } + + return ret; +} +#endif + +/* Process all chain certificates (and CRLs) in the PEM data. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] buff Buffer containing PEM data. + * @param [in] sz Size of data in buffer. + * @param [in] type Type of data. + * @param [in] verify How to verify certificate. + * @return 1 on success. + * @return 0 on failure. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int ProcessChainBuffer(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + const unsigned char* buff, long sz, int type, int verify) +{ + int ret = 0; + long used = 0; + int gotOne = 0; + + WOLFSSL_MSG("Processing CA PEM file"); + /* Keep processing file while no errors and data to parse. */ + while ((ret >= 0) && (used < sz)) { + long consumed = 0; + + /* Process the buffer. */ + ret = ProcessBuffer(ctx, buff + used, sz - used, WOLFSSL_FILETYPE_PEM, + type, ssl, &consumed, 0, verify); + /* Memory allocation failure is fatal. */ + if (ret == WC_NO_ERR_TRACE(MEMORY_E)) { + gotOne = 0; + } + /* Other error parsing. */ + else if (ret < 0) { +#if defined(WOLFSSL_WPAS) && defined(HAVE_CRL) + /* Try parsing a CRL. */ + if (ProcessChainBufferCRL(ctx, buff + used, sz - used, + &consumed) == 0) { + ret = 0; + } + else +#endif + /* Check whether we made progress. */ + if (consumed > 0) { + WOLFSSL_ERROR(ret); + WOLFSSL_MSG("CA Parse failed, with progress in file."); + WOLFSSL_MSG("Search for other certs in file"); + /* Check if we have more data to parse to recover. */ + if (used + consumed < sz) { + ret = 0; + } + } + else { + /* No progress in parsing being made - stop here. */ + WOLFSSL_MSG("CA Parse failed, no progress in file."); + WOLFSSL_MSG("Do not continue search for other certs in file"); + } + } + else { + /* Got a certificate out. */ + WOLFSSL_MSG(" Processed a CA"); + gotOne = 1; + } + /* Update used count. */ + used += consumed; + } + + /* May have other unparsable data but did we get a certificate? */ + if (gotOne) { + WOLFSSL_MSG("Processed at least one valid CA. Other stuff OK"); + ret = 1; + } + return ret; +} + + +/* Get verify settings for AddCA from SSL context. */ +#define GET_VERIFY_SETTING_CTX(ctx) \ + ((ctx) && (ctx)->verifyNone ? NO_VERIFY : VERIFY) +/* Get verify settings for AddCA from SSL. */ +#define GET_VERIFY_SETTING_SSL(ssl) \ + ((ssl)->options.verifyNone ? NO_VERIFY : VERIFY) + +#ifndef NO_FILESYSTEM + +/* Process data from a file as private keys, CRL or certificates. + * + * @param [in, out] ctx SSL context object. + * @param [in] fname Name of file to read. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @param [in] type Type of data: + * CERT_TYPE, CA_TYPE, TRUSTED_PEER_TYPE, + * PRIVATEKEY_TYPE or ALT_PRIVATEKEY_TYPE. + * @param [in, out] ssl SSL object. + * @param [in] userChain Whether file contains chain of certificates. + * @param [in, out] crl CRL object to load data into. + * @param [in] verify How to verify certificates. + * @return 1 on success. + * @return WOLFSSL_BAD_FILE when reading the file fails. + * @return WOLFSSL_BAD_CERTTYPE when unable to detect certificate type. + */ +int ProcessFile(WOLFSSL_CTX* ctx, const char* fname, int format, int type, + WOLFSSL* ssl, int userChain, WOLFSSL_CRL* crl, int verify) +{ + int ret = 0; +#ifndef WOLFSSL_SMALL_STACK + byte stackBuffer[FILE_BUFFER_SIZE]; +#endif + StaticBuffer content; + long sz = 0; + void* heap = WOLFSSL_HEAP(ctx, ssl); + + (void)crl; + (void)heap; + +#ifdef WOLFSSL_SMALL_STACK + static_buffer_init(&content); +#else + static_buffer_init(&content, stackBuffer, FILE_BUFFER_SIZE); +#endif + + /* Read file into static buffer. */ + ret = wolfssl_read_file_static(fname, &content, heap, DYNAMIC_TYPE_FILE, + &sz); + if ((ret == 0) && (type == DETECT_CERT_TYPE) && + (format != WOLFSSL_FILETYPE_PEM)) { + WOLFSSL_MSG("Cannot detect certificate type when not PEM"); + ret = WOLFSSL_BAD_CERTTYPE; + } + /* Try to detect type by parsing cert header and footer. */ + if ((ret == 0) && (type == DETECT_CERT_TYPE)) { +#if !defined(NO_CODING) && !defined(WOLFSSL_NO_PEM) + const char* header = NULL; + const char* footer = NULL; + + /* Look for CA header and footer - same as CERT_TYPE. */ + if (wc_PemGetHeaderFooter(CA_TYPE, &header, &footer) == 0 && + (XSTRNSTR((char*)content.buffer, header, (word32)sz) != NULL)) { + type = CA_TYPE; + } +#ifdef HAVE_CRL + /* Look for CRL header and footer. */ + else if (wc_PemGetHeaderFooter(CRL_TYPE, &header, &footer) == 0 && + (XSTRNSTR((char*)content.buffer, header, (word32)sz) != NULL)) { + type = CRL_TYPE; + } +#endif + /* Look for cert header and footer - same as CA_TYPE. */ + else if (wc_PemGetHeaderFooter(CERT_TYPE, &header, &footer) == 0 && + (XSTRNSTR((char*)content.buffer, header, (word32)sz) != + NULL)) { + type = CERT_TYPE; + } + else +#endif + { + /* Not a header that we support. */ + WOLFSSL_MSG("Failed to detect certificate type"); + ret = WOLFSSL_BAD_CERTTYPE; + } + } + if (ret == 0) { + /* When CA or trusted peer and PEM - process as a chain buffer. */ + if (((type == CA_TYPE) || (type == TRUSTED_PEER_TYPE)) && + (format == WOLFSSL_FILETYPE_PEM)) { + ret = ProcessChainBuffer(ctx, ssl, content.buffer, sz, type, + verify); + } +#ifdef HAVE_CRL + else if (type == CRL_TYPE) { + /* Load the CRL. */ + ret = BufferLoadCRL(crl, content.buffer, sz, format, verify); + } +#endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + else if (type == PRIVATEKEY_TYPE) { + /* When support for dual algorithm certificates is enabled, the + * private key file may contain both the primary and the + * alternative private key. Hence, we have to parse both of them. + */ + long consumed = 0; + + ret = ProcessBuffer(ctx, content.buffer, sz, format, type, ssl, + &consumed, userChain, verify); + if ((ret == 1) && (consumed < sz)) { + ret = ProcessBuffer(ctx, content.buffer + consumed, + sz - consumed, format, ALT_PRIVATEKEY_TYPE, ssl, NULL, 0, + verify); + } + } +#endif + else { + /* Load all other certificate types. */ + ret = ProcessBuffer(ctx, content.buffer, sz, format, type, ssl, + NULL, userChain, verify); + } + } + + /* Dispose of dynamically allocated data. */ + static_buffer_free(&content, heap, DYNAMIC_TYPE_FILE); + return ret; +} + +#ifndef NO_WOLFSSL_DIR +/* Load file when filename is in the path. + * + * @param [in, out] ctx SSL context object. + * @param [in] name Name of file. + * @param [in] verify How to verify a certificate. + * @param [in] flags Flags representing options for loading. + * @param [in, out] failCount Number of files that failed to load. + * @param [in, out] successCount Number of files successfully loaded. + * @return 1 on success. + * @return Not 1 when loading PEM certificate failed. + */ +static int wolfssl_ctx_load_path_file(WOLFSSL_CTX* ctx, const char* name, + int verify, int flags, int* failCount, int* successCount) +{ + int ret; + + /* Attempt to load file as a CA. */ + ret = ProcessFile(ctx, name, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0, NULL, + verify); + if (ret != 1) { + /* When ignoring errors or loading PEM only and no PEM. don't fail. */ + if ((flags & WOLFSSL_LOAD_FLAG_IGNORE_ERR) || + ((flags & WOLFSSL_LOAD_FLAG_PEM_CA_ONLY) && + (ret == WC_NO_ERR_TRACE(ASN_NO_PEM_HEADER)))) { + unsigned long err = 0; + CLEAR_ASN_NO_PEM_HEADER_ERROR(err); + #if defined(WOLFSSL_QT) + ret = 1; + #endif + } + else { + WOLFSSL_ERROR(ret); + WOLFSSL_MSG("Load CA file failed, continuing"); + /* Add to fail count. */ + (*failCount)++; + } + } + else { + #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS) + /* Try loading as a trusted peer certificate. */ + ret = wolfSSL_CTX_trust_peer_cert(ctx, name, WOLFSSL_FILETYPE_PEM); + if (ret != 1) { + WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error. " + "Ignoring this error."); + } + #endif + /* Add to success count. */ + (*successCount)++; + } + + return ret; +} + +/* Load PEM formatted CA files from a path. + * + * @param [in, out] ctx SSL context object. + * @param [in] path Path to directory to read. + * @param [in] flags Flags representing options for loading. + * @param [in] verify How to verify a certificate. + * @param [in] successCount Number of files successfully loaded. + * @return 1 on success. + * @return 0 on failure. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int wolfssl_ctx_load_path(WOLFSSL_CTX* ctx, const char* path, + word32 flags, int verify, int successCount) +{ + int ret = 1; + char* name = NULL; + int fileRet; + int failCount = 0; +#ifdef WOLFSSL_SMALL_STACK + ReadDirCtx* readCtx; +#else + ReadDirCtx readCtx[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for directory reading context. */ + readCtx = (ReadDirCtx*)XMALLOC(sizeof(ReadDirCtx), ctx->heap, + DYNAMIC_TYPE_DIRCTX); + if (readCtx == NULL) { + ret = MEMORY_E; + } +#endif + + if (ret == 1) { + /* Get name of first file in path. */ + fileRet = wc_ReadDirFirst(readCtx, path, &name); + /* While getting filename doesn't fail and name returned, process file. + */ + while ((fileRet == 0) && (name != NULL)) { + WOLFSSL_MSG(name); + /* Load file. */ + ret = wolfssl_ctx_load_path_file(ctx, name, verify, (int)flags, + &failCount, &successCount); + /* Get next filenmae. */ + fileRet = wc_ReadDirNext(readCtx, path, &name); + } + /* Cleanup directory reading context. */ + wc_ReadDirClose(readCtx); + + /* When not WOLFSSL_QT, ret is always overwritten. */ + (void)ret; + + /* Return real directory read failure error codes. */ + if (fileRet != WC_READDIR_NOFILE) { + ret = fileRet; + #if defined(WOLFSSL_QT) || defined(WOLFSSL_IGNORE_BAD_CERT_PATH) + /* Ignore bad path error when flag set. */ + if ((ret == WC_NO_ERR_TRACE(BAD_PATH_ERROR)) && + (flags & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR)) { + /* QSslSocket always loads certs in system folder + * when it is initialized. + * Compliant with OpenSSL when flag set. + */ + ret = 1; + } + else { + /* qssl socket wants to know errors. */ + WOLFSSL_ERROR(ret); + } + #endif + } + /* Report failure if no files successfully loaded or there were + * failures. */ + else if ((successCount == 0) || (failCount > 0)) { + /* Use existing error code if exists. */ + #if defined(WOLFSSL_QT) + /* Compliant with OpenSSL when flag set. */ + if (!(flags & WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE)) + #endif + { + /* Return 0 when no files loaded. */ + ret = 0; + } + } + else { + /* We loaded something so it is a success. */ + ret = 1; + } + + #ifdef WOLFSSL_SMALL_STACK + /* Dispose of dynamically allocated memory. */ + XFREE(readCtx, ctx->heap, DYNAMIC_TYPE_DIRCTX); + #endif + } + + return ret; +} +#endif + +/* Load a file and/or files in path + * + * No c_rehash. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of file to load. May be NULL. + * @param [in] path Path to directory containing PEM CA files. + * May be NULL. + * @param [in] flags Flags representing options for loading. + * @return 1 on success. + * @return 0 on failure. + * @return NOT_COMPILED_IN when directory reading not supported and path is + * not NULL. + * @return Other negative on error. + */ +int wolfSSL_CTX_load_verify_locations_ex(WOLFSSL_CTX* ctx, const char* file, + const char* path, word32 flags) +{ + int ret = 1; +#ifndef NO_WOLFSSL_DIR + int successCount = 0; +#endif + int verify = WOLFSSL_VERIFY_DEFAULT; + + WOLFSSL_MSG("wolfSSL_CTX_load_verify_locations_ex"); + + /* Validate parameters. */ + if ((ctx == NULL) || ((file == NULL) && (path == NULL))) { + ret = 0; + } + + if (ret == 1) { + /* Get setting on how to verify certificates. */ + verify = GET_VERIFY_SETTING_CTX(ctx); + /* Overwrite setting when flag set. */ + if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY) { + verify = VERIFY_SKIP_DATE; + } + + if (file != NULL) { + /* Load the PEM formatted CA file. */ + ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CA_TYPE, NULL, 0, + NULL, verify); + #ifndef NO_WOLFSSL_DIR + if (ret == 1) { + /* Include success in overall count. */ + successCount++; + } + #endif + #if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS) + /* Load CA as a trusted peer certificate. */ + ret = wolfSSL_CTX_trust_peer_cert(ctx, file, WOLFSSL_FILETYPE_PEM); + if (ret != 1) { + WOLFSSL_MSG("wolfSSL_CTX_trust_peer_cert error"); + } + #endif + } + } + + if ((ret == 1) && (path != NULL)) { +#ifndef NO_WOLFSSL_DIR + /* Load CA files form path. */ + ret = wolfssl_ctx_load_path(ctx, path, flags, verify, successCount); +#else + /* Loading a path not supported. */ + ret = NOT_COMPILED_IN; + (void)flags; +#endif + } + + return ret; +} + +/* Load a file and/or files in path + * + * No c_rehash. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of file to load. May be NULL. + * @param [in] path Path to directory containing PEM CA files. + * May be NULL. + * @return 1 on success. + * @return 0 on failure. + */ +WOLFSSL_ABI +int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, + const char* path) +{ + /* Load using default flags/options. */ + int ret = wolfSSL_CTX_load_verify_locations_ex(ctx, file, path, + WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); + + /* Return 1 on success or 0 on failure. */ + return WS_RETURN_CODE(ret, 0); +} + +#ifdef WOLFSSL_SYS_CA_CERTS + +#ifdef USE_WINDOWS_API + +/* Load CA certificate from Windows store. + * + * Assumes loaded is 0. + * + * @param [in, out] ctx SSL context object. + * @param [out] loaded Whether CA certificates were loaded. + * @return 1 on success. + * @return 0 on failure. + */ +static int LoadSystemCaCertsWindows(WOLFSSL_CTX* ctx, byte* loaded) +{ + int ret = 1; + word32 i; + HANDLE handle = NULL; + PCCERT_CONTEXT certCtx = NULL; + LPCSTR storeNames[2] = {"ROOT", "CA"}; + HCRYPTPROV_LEGACY hProv = (HCRYPTPROV_LEGACY)NULL; + + if ((ctx == NULL) || (loaded == NULL)) { + ret = 0; + } + + for (i = 0; (ret == 1) && (i < sizeof(storeNames)/sizeof(*storeNames)); + ++i) { + handle = CertOpenSystemStoreA(hProv, storeNames[i]); + if (handle != NULL) { + while ((certCtx = CertEnumCertificatesInStore(handle, certCtx)) + != NULL) { + if (certCtx->dwCertEncodingType == X509_ASN_ENCODING) { + if (ProcessBuffer(ctx, certCtx->pbCertEncoded, + certCtx->cbCertEncoded, WOLFSSL_FILETYPE_ASN1, + CA_TYPE, NULL, NULL, 0, + GET_VERIFY_SETTING_CTX(ctx)) == 1) { + /* + * Set "loaded" as long as we've loaded one CA + * cert. + */ + *loaded = 1; + } + } + } + } + else { + WOLFSSL_MSG_EX("Failed to open cert store %s.", storeNames[i]); + } + + if (handle != NULL && !CertCloseStore(handle, 0)) { + WOLFSSL_MSG_EX("Failed to close cert store %s.", storeNames[i]); + ret = 0; + } + } + + return ret; +} + +#elif defined(__APPLE__) + +#if defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) \ + && !defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION) +/* Manually obtains certificates from the system trust store and loads them + * directly into wolfSSL "the old way". + * + * As of MacOS 14.0 we are still able to use this method to access system + * certificates. Accessibility of this API is indicated by the presence of the + * Security/SecTrustSettings.h header. In the likely event that Apple removes + * access to this API on Macs, this function should be removed and the + * DoAppleNativeCertValidation() routine should be used for all devices. + * + * Assumes loaded is 0. + * + * @param [in, out] ctx SSL context object. + * @param [out] loaded Whether CA certificates were loaded. + * @return 1 on success. + * @return 0 on failure. + */ +static int LoadSystemCaCertsMac(WOLFSSL_CTX* ctx, byte* loaded) +{ + int ret = 1; + word32 i; + const unsigned int trustDomains[] = { + kSecTrustSettingsDomainUser, + kSecTrustSettingsDomainAdmin, + kSecTrustSettingsDomainSystem + }; + CFArrayRef certs; + OSStatus stat; + CFIndex numCerts; + CFDataRef der; + CFIndex j; + + if ((ctx == NULL) || (loaded == NULL)) { + ret = 0; + } + + for (i = 0; (ret == 1) && (i < sizeof(trustDomains)/sizeof(*trustDomains)); + ++i) { + stat = SecTrustSettingsCopyCertificates( + (SecTrustSettingsDomain)trustDomains[i], &certs); + if (stat == errSecSuccess) { + numCerts = CFArrayGetCount(certs); + for (j = 0; j < numCerts; ++j) { + der = SecCertificateCopyData((SecCertificateRef) + CFArrayGetValueAtIndex(certs, j)); + if (der != NULL) { + if (ProcessBuffer(ctx, CFDataGetBytePtr(der), + CFDataGetLength(der), WOLFSSL_FILETYPE_ASN1, + CA_TYPE, NULL, NULL, 0, + GET_VERIFY_SETTING_CTX(ctx)) == 1) { + /* + * Set "loaded" as long as we've loaded one CA + * cert. + */ + *loaded = 1; + } + + CFRelease(der); + } + } + + CFRelease(certs); + } + else if (stat == errSecNoTrustSettings) { + WOLFSSL_MSG_EX("No trust settings for domain %d, moving to next " + "domain.", trustDomains[i]); + } + else { + WOLFSSL_MSG_EX("SecTrustSettingsCopyCertificates failed with" + " status %d.", stat); + ret = 0; + break; + } + } + + return ret; +} +#endif /* defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) */ + +#else + +/* Potential system CA certs directories on Linux/Unix distros. */ +static const char* systemCaDirs[] = { +#if defined(__ANDROID__) || defined(ANDROID) + "/system/etc/security/cacerts" /* Android */ +#else + "/etc/ssl/certs", /* Debian, Ubuntu, Gentoo, others */ + "/etc/pki/ca-trust/source/anchors", /* Fedora, RHEL */ + "/etc/pki/tls/certs" /* Older RHEL */ +#endif +}; + +/* Get CA directory list. + * + * @param [out] num Number of CA directories. + * @return CA directory list. + * @return NULL when num is NULL. + */ +const char** wolfSSL_get_system_CA_dirs(word32* num) +{ + const char** ret; + + /* Validate parameters. */ + if (num == NULL) { + ret = NULL; + } + else { + ret = systemCaDirs; + *num = sizeof(systemCaDirs)/sizeof(*systemCaDirs); + } + + return ret; +} + +/* Load CA certificate from default system directories. + * + * Assumes loaded is 0. + * + * @param [in, out] ctx SSL context object. + * @param [out] loaded Whether CA certificates were loaded. + * @return 1 on success. + * @return 0 on failure. + */ +static int LoadSystemCaCertsNix(WOLFSSL_CTX* ctx, byte* loaded) { + int ret = 1; + word32 i; + + if ((ctx == NULL) || (loaded == NULL)) { + ret = 0; + } + + for (i = 0; (ret == 1) && (i < sizeof(systemCaDirs)/sizeof(*systemCaDirs)); + ++i) { + WOLFSSL_MSG_EX("Attempting to load system CA certs from %s.", + systemCaDirs[i]); + /* + * We want to keep trying to load more CA certs even if one cert in + * the directory is bad and can't be used (e.g. if one is expired), + * so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR. + */ + if (wolfSSL_CTX_load_verify_locations_ex(ctx, NULL, systemCaDirs[i], + WOLFSSL_LOAD_FLAG_IGNORE_ERR) != 1) { + WOLFSSL_MSG_EX("Failed to load CA certs from %s, trying " + "next possible location.", systemCaDirs[i]); + } + else { + WOLFSSL_MSG_EX("Loaded CA certs from %s.", + systemCaDirs[i]); + *loaded = 1; + /* Stop searching after we've loaded one directory. */ + break; + } + } + + return ret; +} + +#endif + +/* Load CA certificates from system defined locations. + * + * @param [in, out] ctx SSL context object. + * @return 1 on success. + * @return 0 on failure. + * @return WOLFSSL_BAD_PATH when no error but no certificates loaded. + */ +int wolfSSL_CTX_load_system_CA_certs(WOLFSSL_CTX* ctx) +{ + int ret; + byte loaded = 0; + + WOLFSSL_ENTER("wolfSSL_CTX_load_system_CA_certs"); + +#ifdef USE_WINDOWS_API + + ret = LoadSystemCaCertsWindows(ctx, &loaded); + +#elif defined(__APPLE__) + +#if defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) \ + && !defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION) + /* As of MacOS 14.0 we are still able to access system certificates and + * load them manually into wolfSSL "the old way". Accessibility of this API + * is indicated by the presence of the Security/SecTrustSettings.h header */ + ret = LoadSystemCaCertsMac(ctx, &loaded); +#elif defined(WOLFSSL_APPLE_NATIVE_CERT_VALIDATION) + /* For other Apple devices, Apple has removed the ability to obtain + * certificates from the trust store, so we can't use wolfSSL's built-in + * certificate validation mechanisms anymore. We instead must call into the + * Security Framework APIs to authenticate peer certificates when received. + * (see src/internal.c:DoAppleNativeCertValidation()). + * Thus, there is no CA "loading" required, but to keep behavior consistent + * with the current API (not using system CA certs unless this function has + * been called), we simply set a flag indicating that the new apple trust + * verification routine should be used later */ + ctx->doAppleNativeCertValidationFlag = 1; + ret = 1; + loaded = 1; + +#if FIPS_VERSION_GE(2,0) /* Gate back to cert 3389 FIPS modules */ +#warning "Cryptographic operations may occur outside the FIPS module boundary" \ + "Please review FIPS claims for cryptography on this Apple device" +#endif /* FIPS_VERSION_GE(2,0) */ + +#else +/* HAVE_SECURITY_SECXXX_H macros are set by autotools or CMake when searching + * system for the required SDK headers. If building with user_settings.h, you + * will need to manually define WOLFSSL_APPLE_NATIVE_CERT_VALIDATION + * and ensure the appropriate Security.framework headers and libraries are + * visible to your compiler */ +#error "WOLFSSL_SYS_CA_CERTS on Apple devices requires Security.framework" \ + " header files to be detected, or a manual override with" \ + " WOLFSSL_APPLE_NATIVE_CERT_VALIDATION" +#endif + +#else + + ret = LoadSystemCaCertsNix(ctx, &loaded); + +#endif + + /* If we didn't fail but didn't load then we error out. */ + if ((ret == 1) && (!loaded)) { + ret = WOLFSSL_BAD_PATH; + } + + WOLFSSL_LEAVE("wolfSSL_CTX_load_system_CA_certs", ret); + + return ret; +} + +#endif /* WOLFSSL_SYS_CA_CERTS */ + +#ifdef WOLFSSL_TRUST_PEER_CERT +/* Load a trusted peer certificate into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of peer certificate file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 when ctx or file is NULL. + */ +int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX* ctx, const char* file, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_cert"); + + /* Validate parameters. */ + if ((ctx == NULL) || (file == NULL)) { + ret = 0; + } + else { + ret = ProcessFile(ctx, file, format, TRUSTED_PEER_TYPE, NULL, 0, NULL, + GET_VERIFY_SETTING_CTX(ctx)); + } + + return ret; +} + +/* Load a trusted peer certificate into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] file Name of peer certificate file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 when ssl or file is NULL. + */ +int wolfSSL_trust_peer_cert(WOLFSSL* ssl, const char* file, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_trust_peer_cert"); + + /* Validate parameters. */ + if ((ssl == NULL) || (file == NULL)) { + ret = 0; + } + else { + ret = ProcessFile(NULL, file, format, TRUSTED_PEER_TYPE, ssl, 0, NULL, + GET_VERIFY_SETTING_SSL(ssl)); + } + + return ret; +} +#endif /* WOLFSSL_TRUST_PEER_CERT */ + + +#ifdef WOLFSSL_DER_LOAD + +/* Load a CA certificate into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of peer certificate file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_der_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, + int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_der_load_verify_locations"); + + /* Validate parameters. */ + if ((ctx == NULL) || (file == NULL)) { + ret = 0; + } + else { + ret = ProcessFile(ctx, file, format, CA_TYPE, NULL, 0, NULL, + GET_VERIFY_SETTING_CTX(ctx)); + } + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} + +#endif /* WOLFSSL_DER_LOAD */ + + +/* Load a user certificate into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of user certificate file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + */ +WOLFSSL_ABI +int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX* ctx, const char* file, + int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_file"); + + ret = ProcessFile(ctx, file, format, CERT_TYPE, NULL, 0, NULL, + GET_VERIFY_SETTING_CTX(ctx)); + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} + + +/* Load a private key into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of private key file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + */ +WOLFSSL_ABI +int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX* ctx, const char* file, + int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_file"); + + ret = ProcessFile(ctx, file, format, PRIVATEKEY_TYPE, NULL, 0, NULL, + GET_VERIFY_SETTING_CTX(ctx)); + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} + +#ifdef WOLFSSL_DUAL_ALG_CERTS +/* Load an alternative private key into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of private key file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_AltPrivateKey_file(WOLFSSL_CTX* ctx, const char* file, + int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_AltPrivateKey_file"); + + ret = ProcessFile(ctx, file, format, ALT_PRIVATEKEY_TYPE, NULL, 0, NULL, + GET_VERIFY_SETTING_CTX(ctx)); + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + + +/* Load a PEM certificate chain into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of PEM certificate chain file. + * @return 1 on success. + * @return 0 on failure. + */ +WOLFSSL_ABI +int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX* ctx, const char* file) +{ + int ret; + + /* process up to MAX_CHAIN_DEPTH plus subject cert */ + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file"); + + ret = ProcessFile(ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, NULL, 1, NULL, + GET_VERIFY_SETTING_CTX(ctx)); + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} + +/* Load certificate chain into SSL context. + * + * Processes up to MAX_CHAIN_DEPTH plus subject cert. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of private key file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_certificate_chain_file_format(WOLFSSL_CTX* ctx, + const char* file, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_file_format"); + + ret = ProcessFile(ctx, file, format, CERT_TYPE, NULL, 1, NULL, + GET_VERIFY_SETTING_CTX(ctx)); + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} + +#endif /* NO_FILESYSTEM */ + +#ifdef OPENSSL_EXTRA + +/* Load a private key into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] pkey EVP private key. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_PrivateKey(WOLFSSL* ssl, WOLFSSL_EVP_PKEY* pkey) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_PrivateKey"); + + /* Validate parameters. */ + if ((ssl == NULL) || (pkey == NULL)) { + ret = 0; + } + else { + /* Get DER encoded key data from EVP private key. */ + ret = wolfSSL_use_PrivateKey_buffer(ssl, (unsigned char*)pkey->pkey.ptr, + pkey->pkey_sz, WOLFSSL_FILETYPE_ASN1); + } + + return ret; +} + +/* Load a DER encoded private key in a buffer into SSL. + * + * @param [in] pri Indicates type of private key. Ignored. + * @param [in, out] ssl SSL object. + * @param [in] der Buffer holding DER encoded private key. + * @param [in] derSz Size of data in bytes. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_PrivateKey_ASN1(int pri, WOLFSSL* ssl, const unsigned char* der, + long derSz) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_PrivateKey_ASN1"); + + (void)pri; + + /* Validate parameters. */ + if ((ssl == NULL) || (der == NULL)) { + ret = 0; + } + else { + ret = wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, + WOLFSSL_FILETYPE_ASN1); + } + + return ret; +} + +/* Load a DER encoded private key in a buffer into SSL context. + * + * @param [in] pri Indicates type of private key. Ignored. + * @param [in, out] ctx SSL context object. + * @param [in] der Buffer holding DER encoded private key. + * @param [in] derSz Size of data in bytes. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_PrivateKey_ASN1(int pri, WOLFSSL_CTX* ctx, + unsigned char* der, long derSz) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_ASN1"); + + (void)pri; + + /* Validate parameters. */ + if ((ctx == NULL) || (der == NULL)) { + ret = 0; + } + else { + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSz, + WOLFSSL_FILETYPE_ASN1); + } + + return ret; +} + + +#ifndef NO_RSA +/* Load a DER encoded RSA private key in a buffer into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] der Buffer holding DER encoded RSA private key. + * @param [in] derSz Size of data in bytes. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_RSAPrivateKey_ASN1(WOLFSSL* ssl, unsigned char* der, long derSz) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_ASN1"); + + /* Validate parameters. */ + if ((ssl == NULL) || (der == NULL)) { + ret = 0; + } + else { + ret = wolfSSL_use_PrivateKey_buffer(ssl, der, derSz, + WOLFSSL_FILETYPE_ASN1); + } + + return ret; +} +#endif + +/* Load a certificate into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] x509 X509 certificate object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_certificate(WOLFSSL* ssl, WOLFSSL_X509* x509) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_certificate"); + + /* Validate parameters. */ + if ((ssl == NULL) || (x509 == NULL) || (x509->derCert == NULL)) { + ret = 0; + } + else { + long idx = 0; + + /* Get DER encoded certificate data from X509 object. */ + ret = ProcessBuffer(NULL, x509->derCert->buffer, x509->derCert->length, + WOLFSSL_FILETYPE_ASN1, CERT_TYPE, ssl, &idx, 0, + GET_VERIFY_SETTING_SSL(ssl)); + } + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} + +#endif /* OPENSSL_EXTRA */ + +/* Load a DER encoded certificate in a buffer into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] der Buffer holding DER encoded certificate. + * @param [in] derSz Size of data in bytes. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_certificate_ASN1(WOLFSSL* ssl, const unsigned char* der, + int derSz) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_certificate_ASN1"); + + /* Validate parameters. */ + if ((ssl == NULL) || (der == NULL)) { + ret = 0; + } + else { + long idx = 0; + + ret = ProcessBuffer(NULL, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE, + ssl, &idx, 0, GET_VERIFY_SETTING_SSL(ssl)); + } + + /* Return 1 on success or 0 on failure. */ + return WS_RC(ret); +} + +#ifndef NO_FILESYSTEM + +/* Load a certificate from a file into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] file Name of file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +WOLFSSL_ABI +int wolfSSL_use_certificate_file(WOLFSSL* ssl, const char* file, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_certificate_file"); + + /* Validate parameters. */ + if (ssl == NULL) { + ret = BAD_FUNC_ARG; + } + else { + ret = ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 0, NULL, + GET_VERIFY_SETTING_SSL(ssl)); + /* Return 1 on success or 0 on failure. */ + ret = WS_RC(ret); + } + + return ret; +} + + +/* Load a private key from a file into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] file Name of file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +WOLFSSL_ABI +int wolfSSL_use_PrivateKey_file(WOLFSSL* ssl, const char* file, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_PrivateKey_file"); + + /* Validate parameters. */ + if (ssl == NULL) { + ret = BAD_FUNC_ARG; + } + else { + ret = ProcessFile(ssl->ctx, file, format, PRIVATEKEY_TYPE, ssl, 0, NULL, + GET_VERIFY_SETTING_SSL(ssl)); + /* Return 1 on success or 0 on failure. */ + ret = WS_RC(ret); + } + + return ret; +} + + +/* Load a PEM encoded certificate chain from a file into SSL. + * + * Process up to MAX_CHAIN_DEPTH plus subject cert. + * + * @param [in, out] ssl SSL object. + * @param [in] file Name of file. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +WOLFSSL_ABI +int wolfSSL_use_certificate_chain_file(WOLFSSL* ssl, const char* file) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file"); + + /* Validate parameters. */ + if (ssl == NULL) { + ret = BAD_FUNC_ARG; + } + else { + ret = ProcessFile(ssl->ctx, file, WOLFSSL_FILETYPE_PEM, CERT_TYPE, ssl, + 1, NULL, GET_VERIFY_SETTING_SSL(ssl)); + /* Return 1 on success or 0 on failure. */ + ret = WS_RC(ret); + } + + return ret; +} + +/* Load a certificate chain from a file into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] file Name of file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file, + int format) +{ + int ret; + + /* process up to MAX_CHAIN_DEPTH plus subject cert */ + WOLFSSL_ENTER("wolfSSL_use_certificate_chain_file_format"); + + /* Validate parameters. */ + if (ssl == NULL) { + ret = BAD_FUNC_ARG; + } + else { + ret = ProcessFile(ssl->ctx, file, format, CERT_TYPE, ssl, 1, NULL, + GET_VERIFY_SETTING_SSL(ssl)); + /* Return 1 on success or 0 on failure. */ + ret = WS_RC(ret); + } + + return ret; +} + +#endif /* !NO_FILESYSTEM */ + +#ifdef OPENSSL_EXTRA + +#ifndef NO_FILESYSTEM +/* Load an RSA private key from a file into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] file Name of file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_RSAPrivateKey_file(WOLFSSL_CTX* ctx,const char* file, + int format) +{ + WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey_file"); + + return wolfSSL_CTX_use_PrivateKey_file(ctx, file, format); +} + +/* Load an RSA private key from a file into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] file Name of file. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +int wolfSSL_use_RSAPrivateKey_file(WOLFSSL* ssl, const char* file, int format) +{ + WOLFSSL_ENTER("wolfSSL_use_RSAPrivateKey_file"); + + return wolfSSL_use_PrivateKey_file(ssl, file, format); +} +#endif /* NO_FILESYSTEM */ + +#endif /* OPENSSL_EXTRA */ + +/* Load a buffer of certificate/s into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding certificate or private key. + * @param [in] sz Length of data in buffer in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @param [in] userChain Whether file contains chain of certificates. + * @param [in] flags Flags representing options for loading. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_CTX_load_verify_buffer_ex(WOLFSSL_CTX* ctx, const unsigned char* in, + long sz, int format, int userChain, word32 flags) +{ + int ret; + int verify; + + WOLFSSL_ENTER("wolfSSL_CTX_load_verify_buffer_ex"); + + /* Get setting on how to verify certificates. */ + verify = GET_VERIFY_SETTING_CTX(ctx); + /* Overwrite setting when flag set. */ + if (flags & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY) { + verify = VERIFY_SKIP_DATE; + } + + /* When PEM, treat as certificate chain of CA certificates. */ + if (format == WOLFSSL_FILETYPE_PEM) { + ret = ProcessChainBuffer(ctx, NULL, in, sz, CA_TYPE, verify); + } + /* When DER, load the CA certificate. */ + else { + ret = ProcessBuffer(ctx, in, sz, format, CA_TYPE, NULL, NULL, + userChain, verify); + } +#if defined(WOLFSSL_TRUST_PEER_CERT) && defined(OPENSSL_COMPATIBLE_DEFAULTS) + if (ret == 1) { + /* Load certificate/s as trusted peer certificate. */ + ret = wolfSSL_CTX_trust_peer_buffer(ctx, in, sz, format); + } +#endif + + WOLFSSL_LEAVE("wolfSSL_CTX_load_verify_buffer_ex", ret); + return ret; +} + +/* Load a buffer of certificate/s into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding certificate or private key. + * @param [in] sz Length of data in buffer in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, + long sz, int format) +{ + return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 0, + WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); +} + +/* Load a buffer of certificate chain into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding certificate chain. + * @param [in] sz Length of data in buffer in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_CTX_load_verify_chain_buffer_format(WOLFSSL_CTX* ctx, + const unsigned char* in, long sz, int format) +{ + return wolfSSL_CTX_load_verify_buffer_ex(ctx, in, sz, format, 1, + WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS); +} + + +#ifdef WOLFSSL_TRUST_PEER_CERT +/* Load a buffer of certificate/s into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding certificate/s. + * @param [in] sz Length of data in buffer in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ctx or in is NULL, or sz is less than zero. + */ +int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, + long sz, int format) +{ + int ret; + int verify; + + WOLFSSL_ENTER("wolfSSL_CTX_trust_peer_buffer"); + + /* Validate parameters. */ + if ((ctx == NULL) || (in == NULL) || (sz < 0)) { + ret = BAD_FUNC_ARG; + } + else { + #if WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY + verify = VERIFY_SKIP_DATE; + #else + verify = GET_VERIFY_SETTING_CTX(ctx); + #endif + + /* When PEM, treat as certificate chain of trusted peer certificates. */ + if (format == WOLFSSL_FILETYPE_PEM) { + ret = ProcessChainBuffer(ctx, NULL, in, sz, TRUSTED_PEER_TYPE, + verify); + } + /* When DER, load the trusted peer certificate. */ + else { + ret = ProcessBuffer(ctx, in, sz, format, TRUSTED_PEER_TYPE, NULL, + NULL, 0, verify); + } + } + + return ret; +} +#endif /* WOLFSSL_TRUST_PEER_CERT */ + +/* Load a certificate in a buffer into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding certificate. + * @param [in] sz Size of data in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx, + const unsigned char* in, long sz, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_buffer"); + ret = ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 0, + GET_VERIFY_SETTING_CTX(ctx)); + WOLFSSL_LEAVE("wolfSSL_CTX_use_certificate_buffer", ret); + + return ret; +} + +/* Load a private key in a buffer into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding private key. + * @param [in] sz Size of data in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, + long sz, int format) +{ + int ret; + long consumed = 0; + + WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey_buffer"); + + ret = ProcessBuffer(ctx, in, sz, format, PRIVATEKEY_TYPE, NULL, &consumed, + 0, GET_VERIFY_SETTING_CTX(ctx)); +#ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ret == 1) && (consumed < sz)) { + /* When support for dual algorithm certificates is enabled, the + * buffer may contain both the primary and the alternative + * private key. Hence, we have to parse both of them. + */ + ret = ProcessBuffer(ctx, in + consumed, sz - consumed, format, + ALT_PRIVATEKEY_TYPE, NULL, NULL, 0, GET_VERIFY_SETTING_CTX(ctx)); + } +#endif + + (void)consumed; + + WOLFSSL_LEAVE("wolfSSL_CTX_use_PrivateKey_buffer", ret); + return ret; +} + +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wolfSSL_CTX_use_AltPrivateKey_buffer(WOLFSSL_CTX* ctx, + const unsigned char* in, long sz, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_AltPrivateKey_buffer"); + ret = ProcessBuffer(ctx, in, sz, format, ALT_PRIVATEKEY_TYPE, NULL, + NULL, 0, GET_VERIFY_SETTING_CTX(ctx)); + WOLFSSL_LEAVE("wolfSSL_CTX_use_AltPrivateKey_buffer", ret); + + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + +#ifdef WOLF_PRIVATE_KEY_ID +/* Load the id of a private key into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] id Buffer holding id. + * @param [in] sz Size of data in bytes. + * @param [in] devId Device identifier. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_PrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id, + long sz, int devId) +{ + int ret = 1; + + /* Dispose of old private key and allocate and copy in id. */ + FreeDer(&ctx->privateKey); + if (AllocCopyDer(&ctx->privateKey, id, (word32)sz, PRIVATEKEY_TYPE, + ctx->heap) != 0) { + ret = 0; + } + if (ret == 1) { + /* Private key is an id. */ + ctx->privateKeyId = 1; + ctx->privateKeyLabel = 0; + /* Set private key device id to be one passed in or for SSL context. */ + if (devId != INVALID_DEVID) { + ctx->privateKeyDevId = devId; + } + else { + ctx->privateKeyDevId = ctx->devId; + } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* Set the ID for the alternative key, too. User can still override that + * afterwards. */ + ret = wolfSSL_CTX_use_AltPrivateKey_Id(ctx, id, sz, devId); + #endif + } + + return ret; +} + +/* Load the id of a private key into SSL context and set key size. + * + * @param [in, out] ctx SSL context object. + * @param [in] id Buffer holding id. + * @param [in] sz Size of data in bytes. + * @param [in] devId Device identifier. + * @param [in] keySz Size of key. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_PrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id, + long sz, int devId, long keySz) +{ + int ret = wolfSSL_CTX_use_PrivateKey_Id(ctx, id, sz, devId); + if (ret == 1) { + /* Set the key size which normally is calculated during decoding. */ + ctx->privateKeySz = (int)keySz; + } + + return ret; +} + +/* Load the label name of a private key into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] label Buffer holding label. + * @param [in] devId Device identifier. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_PrivateKey_Label(WOLFSSL_CTX* ctx, const char* label, + int devId) +{ + int ret = 1; + word32 sz = (word32)XSTRLEN(label) + 1; + + /* Dispose of old private key and allocate and copy in label. */ + FreeDer(&ctx->privateKey); + if (AllocCopyDer(&ctx->privateKey, (const byte*)label, (word32)sz, + PRIVATEKEY_TYPE, ctx->heap) != 0) { + ret = 0; + } + if (ret == 1) { + /* Private key is a label. */ + ctx->privateKeyId = 0; + ctx->privateKeyLabel = 1; + /* Set private key device id to be one passed in or for SSL context. */ + if (devId != INVALID_DEVID) { + ctx->privateKeyDevId = devId; + } + else { + ctx->privateKeyDevId = ctx->devId; + } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* Set the ID for the alternative key, too. User can still override that + * afterwards. */ + ret = wolfSSL_CTX_use_AltPrivateKey_Label(ctx, label, devId); + #endif + } + + return ret; +} + +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wolfSSL_CTX_use_AltPrivateKey_Id(WOLFSSL_CTX* ctx, const unsigned char* id, + long sz, int devId) +{ + int ret = 1; + + if ((ctx == NULL) || (id == NULL)) { + ret = 0; + } + + if (ret == 1) { + FreeDer(&ctx->altPrivateKey); + if (AllocDer(&ctx->altPrivateKey, (word32)sz, ALT_PRIVATEKEY_TYPE, + ctx->heap) != 0) { + ret = 0; + } + } + if (ret == 1) { + XMEMCPY(ctx->altPrivateKey->buffer, id, sz); + ctx->altPrivateKeyId = 1; + if (devId != INVALID_DEVID) { + ctx->altPrivateKeyDevId = devId; + } + else { + ctx->altPrivateKeyDevId = ctx->devId; + } + } + + return ret; +} + +int wolfSSL_CTX_use_AltPrivateKey_id(WOLFSSL_CTX* ctx, const unsigned char* id, + long sz, int devId, long keySz) +{ + int ret = wolfSSL_CTX_use_AltPrivateKey_Id(ctx, id, sz, devId); + if (ret == 1) { + ctx->altPrivateKeySz = (word32)keySz; + } + + return ret; +} + +int wolfSSL_CTX_use_AltPrivateKey_Label(WOLFSSL_CTX* ctx, const char* label, + int devId) +{ + int ret = 1; + word32 sz; + + if ((ctx == NULL) || (label == NULL)) { + ret = 0; + } + + if (ret == 1) { + sz = (word32)XSTRLEN(label) + 1; + FreeDer(&ctx->altPrivateKey); + if (AllocDer(&ctx->altPrivateKey, (word32)sz, ALT_PRIVATEKEY_TYPE, + ctx->heap) != 0) { + ret = 0; + } + } + if (ret == 1) { + XMEMCPY(ctx->altPrivateKey->buffer, label, sz); + ctx->altPrivateKeyLabel = 1; + if (devId != INVALID_DEVID) { + ctx->altPrivateKeyDevId = devId; + } + else { + ctx->altPrivateKeyDevId = ctx->devId; + } + } + + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ +#endif /* WOLF_PRIVATE_KEY_ID */ + +/* Load a certificate chain in a buffer into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding DER encoded certificate chain. + * @param [in] sz Size of data in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_CTX_use_certificate_chain_buffer_format(WOLFSSL_CTX* ctx, + const unsigned char* in, long sz, int format) +{ + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_chain_buffer_format"); + return ProcessBuffer(ctx, in, sz, format, CERT_TYPE, NULL, NULL, 1, + GET_VERIFY_SETTING_CTX(ctx)); +} + +/* Load a PEM encoded certificate chain in a buffer into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] in Buffer holding DER encoded certificate chain. + * @param [in] sz Size of data in bytes. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx, + const unsigned char* in, long sz) +{ + return wolfSSL_CTX_use_certificate_chain_buffer_format(ctx, in, sz, + WOLFSSL_FILETYPE_PEM); +} + +/* Load a user certificate in a buffer into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] in Buffer holding user certificate. + * @param [in] sz Size of data in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +int wolfSSL_use_certificate_buffer(WOLFSSL* ssl, const unsigned char* in, + long sz, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_certificate_buffer"); + + /* Validate parameters. */ + if (ssl == NULL) { + ret = BAD_FUNC_ARG; + } + else { + ret = ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 0, + GET_VERIFY_SETTING_SSL(ssl)); + } + + return ret; +} + +/* Load a private key in a buffer into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] in Buffer holding private key. + * @param [in] sz Size of data in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +int wolfSSL_use_PrivateKey_buffer(WOLFSSL* ssl, const unsigned char* in, + long sz, int format) +{ + int ret; + long consumed = 0; + + WOLFSSL_ENTER("wolfSSL_use_PrivateKey_buffer"); + + /* Validate parameters. */ + if (ssl == NULL) { + ret = BAD_FUNC_ARG; + } + else { + ret = ProcessBuffer(ssl->ctx, in, sz, format, PRIVATEKEY_TYPE, ssl, + &consumed, 0, GET_VERIFY_SETTING_SSL(ssl)); + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ret == 1) && (consumed < sz)) { + /* When support for dual algorithm certificates is enabled, the + * buffer may contain both the primary and the alternative + * private key. Hence, we have to parse both of them. + */ + ret = ProcessBuffer(ssl->ctx, in + consumed, sz - consumed, format, + ALT_PRIVATEKEY_TYPE, ssl, NULL, 0, GET_VERIFY_SETTING_SSL(ssl)); + } + #endif + } + + return ret; +} + +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wolfSSL_use_AltPrivateKey_buffer(WOLFSSL* ssl, const unsigned char* in, + long sz, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_AltPrivateKey_buffer"); + ret = ProcessBuffer(ssl->ctx, in, sz, format, ALT_PRIVATEKEY_TYPE, ssl, + NULL, 0, GET_VERIFY_SETTING_SSL(ssl)); + WOLFSSL_LEAVE("wolfSSL_use_AltPrivateKey_buffer", ret); + + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + +#ifdef WOLF_PRIVATE_KEY_ID +/* Load the id of a private key into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] id Buffer holding id. + * @param [in] sz Size of data in bytes. + * @param [in] devId Device identifier. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_PrivateKey_Id(WOLFSSL* ssl, const unsigned char* id, + long sz, int devId) +{ + int ret = 1; + + /* Dispose of old private key if owned and allocate and copy in id. */ + if (ssl->buffers.weOwnKey) { + FreeDer(&ssl->buffers.key); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.keyMask); + #endif + } + if (AllocCopyDer(&ssl->buffers.key, id, (word32)sz, PRIVATEKEY_TYPE, + ssl->heap) != 0) { + ret = 0; + } + if (ret == 1) { + /* Buffer now ours. */ + ssl->buffers.weOwnKey = 1; + /* Private key is an id. */ + ssl->buffers.keyId = 1; + ssl->buffers.keyLabel = 0; + /* Set private key device id to be one passed in or for SSL. */ + if (devId != INVALID_DEVID) { + ssl->buffers.keyDevId = devId; + } + else { + ssl->buffers.keyDevId = ssl->devId; + } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* Set the ID for the alternative key, too. User can still override that + * afterwards. */ + ret = wolfSSL_use_AltPrivateKey_Id(ssl, id, sz, devId); + #endif + } + + return ret; +} + +/* Load the id of a private key into SSL and set key size. + * + * @param [in, out] ssl SSL object. + * @param [in] id Buffer holding id. + * @param [in] sz Size of data in bytes. + * @param [in] devId Device identifier. + * @param [in] keySz Size of key. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_PrivateKey_id(WOLFSSL* ssl, const unsigned char* id, + long sz, int devId, long keySz) +{ + int ret = wolfSSL_use_PrivateKey_Id(ssl, id, sz, devId); + if (ret == 1) { + /* Set the key size which normally is calculated during decoding. */ + ssl->buffers.keySz = (int)keySz; + } + + return ret; +} + +/* Load the label name of a private key into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] label Buffer holding label. + * @param [in] devId Device identifier. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_use_PrivateKey_Label(WOLFSSL* ssl, const char* label, int devId) +{ + int ret = 1; + word32 sz = (word32)XSTRLEN(label) + 1; + + /* Dispose of old private key if owned and allocate and copy in label. */ + if (ssl->buffers.weOwnKey) { + FreeDer(&ssl->buffers.key); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.keyMask); + #endif + } + if (AllocCopyDer(&ssl->buffers.key, (const byte*)label, (word32)sz, + PRIVATEKEY_TYPE, ssl->heap) != 0) { + ret = 0; + } + if (ret == 1) { + /* Buffer now ours. */ + ssl->buffers.weOwnKey = 1; + /* Private key is a label. */ + ssl->buffers.keyId = 0; + ssl->buffers.keyLabel = 1; + /* Set private key device id to be one passed in or for SSL. */ + if (devId != INVALID_DEVID) { + ssl->buffers.keyDevId = devId; + } + else { + ssl->buffers.keyDevId = ssl->devId; + } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* Set the label for the alternative key, too. User can still override + * that afterwards. */ + ret = wolfSSL_use_AltPrivateKey_Label(ssl, label, devId); + #endif + } + + return ret; +} + +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wolfSSL_use_AltPrivateKey_Id(WOLFSSL* ssl, const unsigned char* id, long sz, + int devId) +{ + int ret = 1; + + if ((ssl == NULL) || (id == NULL)) { + ret = 0; + } + + if (ret == 1) { + if (ssl->buffers.weOwnAltKey) { + FreeDer(&ssl->buffers.altKey); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.altKeyMask); + #endif + } + if (AllocDer(&ssl->buffers.altKey, (word32)sz, ALT_PRIVATEKEY_TYPE, + ssl->heap) == 0) { + ret = 0; + } + } + if (ret == 1) { + XMEMCPY(ssl->buffers.altKey->buffer, id, sz); + ssl->buffers.weOwnAltKey = 1; + ssl->buffers.altKeyId = 1; + if (devId != INVALID_DEVID) { + ssl->buffers.altKeyDevId = devId; + } + else { + ssl->buffers.altKeyDevId = ssl->devId; + } + } + + return ret; +} + +int wolfSSL_use_AltPrivateKey_id(WOLFSSL* ssl, const unsigned char* id, long sz, + int devId, long keySz) +{ + int ret = wolfSSL_use_AltPrivateKey_Id(ssl, id, sz, devId); + if (ret == 1) { + ssl->buffers.altKeySz = (word32)keySz; + } + + return ret; +} + +int wolfSSL_use_AltPrivateKey_Label(WOLFSSL* ssl, const char* label, int devId) +{ + int ret = 1; + word32 sz; + + if ((ssl == NULL) || (label == NULL)) { + ret = 0; + } + + if (ret == 1) { + sz = (word32)XSTRLEN(label) + 1; + if (ssl->buffers.weOwnAltKey) { + FreeDer(&ssl->buffers.altKey); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.altKeyMask); + #endif + } + if (AllocDer(&ssl->buffers.altKey, (word32)sz, ALT_PRIVATEKEY_TYPE, + ssl->heap) == 0) { + ret = 0; + } + } + if (ret == 1) { + XMEMCPY(ssl->buffers.altKey->buffer, label, sz); + ssl->buffers.weOwnAltKey = 1; + ssl->buffers.altKeyLabel = 1; + if (devId != INVALID_DEVID) { + ssl->buffers.altKeyDevId = devId; + } + else { + ssl->buffers.altKeyDevId = ssl->devId; + } + } + + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ +#endif /* WOLF_PRIVATE_KEY_ID */ + +/* Load a certificate chain in a buffer into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] in Buffer holding DER encoded certificate chain. + * @param [in] sz Size of data in bytes. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ssl is NULL. + */ +int wolfSSL_use_certificate_chain_buffer_format(WOLFSSL* ssl, + const unsigned char* in, long sz, int format) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format"); + + /* Validate parameters. */ + if (ssl == NULL) { + ret = BAD_FUNC_ARG; + } + else { + ret = ProcessBuffer(ssl->ctx, in, sz, format, CERT_TYPE, ssl, NULL, 1, + GET_VERIFY_SETTING_SSL(ssl)); + } + + return ret; +} + +/* Load a PEM encoded certificate chain in a buffer into SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] in Buffer holding DER encoded certificate chain. + * @param [in] sz Size of data in bytes. + * @return 1 on success. + * @return 0 on failure. + * @return Negative on error. + */ +int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl, const unsigned char* in, + long sz) +{ + return wolfSSL_use_certificate_chain_buffer_format(ssl, in, sz, + WOLFSSL_FILETYPE_PEM); +} + +#if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \ + defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \ + defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \ + defined(WOLFSSL_HAPROXY) +/* Add certificate to chain. + * + * @param [in, out] chain Buffer holding encoded certificate for TLS. + * @param [in] weOwn Indicates we need to free chain if repleced. + * @param [in] cert Buffer holding DER encoded certificate. + * @param [in] certSz Size of DER encoded certificate in bytes. + * @param [in] heap Dynamic memory allocation hint. + * @return 1 on success. + * @return 0 on failure. + */ +static int wolfssl_add_to_chain(DerBuffer** chain, int weOwn, const byte* cert, + word32 certSz, void* heap) +{ + int res = 1; + int ret; + DerBuffer* oldChain = *chain; + DerBuffer* newChain = NULL; + word32 len = 0; + + if (oldChain != NULL) { + /* Get length of previous chain. */ + len = oldChain->length; + } + /* Allocate DER buffer bug enough to hold old and new certificates. */ + ret = AllocDer(&newChain, len + CERT_HEADER_SZ + certSz, CERT_TYPE, heap); + if (ret != 0) { + WOLFSSL_MSG("AllocDer error"); + res = 0; + } + + if (res == 1) { + if (oldChain != NULL) { + /* Place old chain in new buffer. */ + XMEMCPY(newChain->buffer, oldChain->buffer, len); + } + /* Append length and DER encoded certificate. */ + c32to24(certSz, newChain->buffer + len); + XMEMCPY(newChain->buffer + len + CERT_HEADER_SZ, cert, certSz); + + /* Dispose of old chain if we own it. */ + if (weOwn) { + FreeDer(chain); + } + /* Replace chain. */ + *chain = newChain; + } + + return res; +} +#endif + +#ifdef OPENSSL_EXTRA + +/* Add a certificate to end of chain sent in TLS handshake. + * + * @param [in, out] ctx SSL context. + * @param [in] der Buffer holding DER encoded certificate. + * @param [in] derSz Size of data in buffer. + * @return 1 on success. + * @return 0 on failure. + */ +static int wolfssl_ctx_add_to_chain(WOLFSSL_CTX* ctx, const byte* der, + int derSz) +{ + int res = 1; + int ret; + DerBuffer* derBuffer = NULL; + + /* Create a DER buffer from DER encoding. */ + ret = AllocCopyDer(&derBuffer, der, (word32)derSz, CERT_TYPE, ctx->heap); + if (ret != 0) { + WOLFSSL_MSG("Memory Error"); + res = 0; + } + if (res == 1) { + /* Add a user CA certificate to the certificate manager. */ + res = AddCA(ctx->cm, &derBuffer, WOLFSSL_USER_CA, + GET_VERIFY_SETTING_CTX(ctx)); + if (res != 1) { + res = 0; + } + } + + if (res == 1) { + /* Add chain to DER buffer. */ + res = wolfssl_add_to_chain(&ctx->certChain, 1, der, (word32)derSz, ctx->heap); + #ifdef WOLFSSL_TLS13 + /* Update count of certificates. */ + ctx->certChainCnt++; + #endif + } + + return res; +} + +/* Add a certificate to chain sent in TLS handshake. + * + * @param [in, out] ctx SSL context. + * @param [in] x509 X509 certificate object. + * @return 1 on success. + * @return 0 on failure. + */ +long wolfSSL_CTX_add_extra_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509) +{ + int ret = 1; + int derSz = 0; + const byte* der = NULL; + + WOLFSSL_ENTER("wolfSSL_CTX_add_extra_chain_cert"); + + /* Validate parameters. */ + if ((ctx == NULL) || (x509 == NULL)) { + WOLFSSL_MSG("Bad Argument"); + ret = 0; + } + + if (ret == 1) { + /* Get the DER encoding of the certificate from the X509 object. */ + der = wolfSSL_X509_get_der(x509, &derSz); + /* Validate buffer. */ + if ((der == NULL) || (derSz <= 0)) { + WOLFSSL_MSG("Error getting X509 DER"); + ret = 0; + } + } + + if ((ret == 1) && (ctx->certificate == NULL)) { + WOLFSSL_ENTER("wolfSSL_use_certificate_chain_buffer_format"); + + /* Process buffer makes first certificate the leaf. */ + ret = ProcessBuffer(ctx, der, derSz, WOLFSSL_FILETYPE_ASN1, CERT_TYPE, + NULL, NULL, 1, GET_VERIFY_SETTING_CTX(ctx)); + if (ret != 1) { + ret = 0; + } + } + else if (ret == 1) { + /* Add certificate to existing chain. */ + ret = wolfssl_ctx_add_to_chain(ctx, der, derSz); + } + + if (ret == 1) { + /* On success WOLFSSL_X509 memory is responsibility of SSL context. */ + wolfSSL_X509_free(x509); + } + + WOLFSSL_LEAVE("wolfSSL_CTX_add_extra_chain_cert", ret); + return ret; +} + +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) || \ + defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(HAVE_STUNNEL) || \ + defined(WOLFSSL_NGINX) || defined(HAVE_POCO_LIB) || \ + defined(WOLFSSL_HAPROXY) +/* Load a certificate into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] x509 X509 certificate object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_certificate(WOLFSSL_CTX *ctx, WOLFSSL_X509 *x) +{ + int res = 1; + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate"); + + /* Validate parameters. */ + if ((ctx == NULL) || (x == NULL) || (x->derCert == NULL)) { + WOLFSSL_MSG("Bad parameter"); + res = 0; + } + + if (res == 1) { + /* Replace certificate buffer with one holding the new certificate. */ + FreeDer(&ctx->certificate); + ret = AllocCopyDer(&ctx->certificate, x->derCert->buffer, + x->derCert->length, CERT_TYPE, ctx->heap); + if (ret != 0) { + res = 0; + } + } + +#ifdef KEEP_OUR_CERT + if (res == 1) { + /* Dispose of our certificate if it is ours. */ + if ((ctx->ourCert != NULL) && ctx->ownOurCert) { + wolfSSL_X509_free(ctx->ourCert); + } + #ifndef WOLFSSL_X509_STORE_CERTS + /* Keep a reference to the new certificate. */ + ctx->ourCert = x; + if (wolfSSL_X509_up_ref(x) != 1) { + res = 0; + } + #else + /* Keep a copy of the new certificate. */ + ctx->ourCert = wolfSSL_X509_d2i_ex(NULL, x->derCert->buffer, + x->derCert->length, ctx->heap); + if (ctx->ourCert == NULL) { + res = 0; + } + #endif + /* Now own our certificate. */ + ctx->ownOurCert = 1; + } +#endif + + if (res == 1) { + /* Set have options based on public key OID. */ + wolfssl_set_have_from_key_oid(ctx, NULL, x->pubKeyOID); + } + + return res; +} + +/* Add the certificate to the chain in the SSL context and own the X509 object. + * + * @param [in, out] ctx SSL context object. + * @param [in] x509 X509 certificate object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509) +{ + int ret; + + WOLFSSL_ENTER("wolfSSL_CTX_add0_chain_cert"); + + /* Add certificate to chain and copy or up reference it. */ + ret = wolfSSL_CTX_add1_chain_cert(ctx, x509); + if (ret == 1) { + /* Down reference or free original now as we own certificate. */ + wolfSSL_X509_free(x509); + } + + return ret; +} + +/* Add the certificate to the chain in the SSL context. + * + * X509 object copied or up referenced. + * + * @param [in, out] ctx SSL context object. + * @param [in] x509 X509 certificate object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_CTX_add1_chain_cert"); + + /* Validate parameters. */ + if ((ctx == NULL) || (x509 == NULL) || (x509->derCert == NULL)) { + ret = 0; + } + + /* Check if we already have set a certificate. */ + if ((ret == 1) && (ctx->certificate == NULL)) { + /* Use the certificate. */ + ret = wolfSSL_CTX_use_certificate(ctx, x509); + } + /* Increate reference count as we will store it. */ + else if ((ret == 1) && ((ret = wolfSSL_X509_up_ref(x509)) == 1)) { + /* Load the DER encoding. */ + ret = wolfSSL_CTX_load_verify_buffer(ctx, x509->derCert->buffer, + x509->derCert->length, WOLFSSL_FILETYPE_ASN1); + if (ret == 1) { + /* Add DER encoding to chain. */ + ret = wolfssl_add_to_chain(&ctx->certChain, 1, + x509->derCert->buffer, x509->derCert->length, ctx->heap); + } + /* Store cert in stack to free it later. */ + if ((ret == 1) && (ctx->x509Chain == NULL)) { + /* Create a stack for certificates. */ + ctx->x509Chain = wolfSSL_sk_X509_new_null(); + if (ctx->x509Chain == NULL) { + WOLFSSL_MSG("wolfSSL_sk_X509_new_null error"); + ret = 0; + } + } + if (ret == 1) { + /* Push the X509 object onto stack. */ + ret = wolfSSL_sk_X509_push(ctx->x509Chain, x509); + } + + if (ret != 1) { + /* Decrease reference count on error as we didn't store it. */ + wolfSSL_X509_free(x509); + } + } + + return WS_RC(ret); +} + +#ifdef KEEP_OUR_CERT +/* Add the certificate to the chain in the SSL and own the X509 object. + * + * @param [in, out] ssl SSL object. + * @param [in] x509 X509 certificate object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_add0_chain_cert"); + + /* Validate parameters. */ + if ((ssl == NULL) || (ssl->ctx == NULL) || (x509 == NULL) || + (x509->derCert == NULL)) { + ret = 0; + } + + /* Check if we already have set a certificate. */ + if ((ret == 1) && (ssl->buffers.certificate == NULL)) { + /* Use the certificate. */ + ret = wolfSSL_use_certificate(ssl, x509); + if (ret == 1) { + /* Dispose of old certificate if we own it. */ + if (ssl->buffers.weOwnCert) { + wolfSSL_X509_free(ssl->ourCert); + } + /* Store cert to free it later. */ + ssl->ourCert = x509; + ssl->buffers.weOwnCert = 1; + } + } + else if (ret == 1) { + /* Add DER encoding to chain. */ + ret = wolfssl_add_to_chain(&ssl->buffers.certChain, + ssl->buffers.weOwnCertChain, x509->derCert->buffer, + x509->derCert->length, ssl->heap); + if (ret == 1) { + /* We now own cert chain. */ + ssl->buffers.weOwnCertChain = 1; + /* Create a stack to put certificate into. */ + if (ssl->ourCertChain == NULL) { + ssl->ourCertChain = wolfSSL_sk_X509_new_null(); + if (ssl->ourCertChain == NULL) { + WOLFSSL_MSG("wolfSSL_sk_X509_new_null error"); + ret = 0; + } + } + } + if (ret == 1) { + /* Push X509 object onto stack to be freed. */ + ret = wolfSSL_sk_X509_push(ssl->ourCertChain, x509); + if (ret != 1) { + /* Free it now on error. */ + wolfSSL_X509_free(x509); + } + } + } + return WS_RC(ret); +} + +/* Add the certificate to the chain in the SSL. + * + * X509 object is up referenced. + * + * @param [in, out] ssl SSL object. + * @param [in] x509 X509 certificate object. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_add1_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_add1_chain_cert"); + + /* Validate parameters. */ + if ((ssl == NULL) || (ssl->ctx == NULL) || (x509 == NULL) || + (x509->derCert == NULL)) { + ret = 0; + } + + /* Increase reference count on X509 object before adding. */ + if ((ret == 1) && ((ret == wolfSSL_X509_up_ref(x509)) == 1)) { + /* Add this to the chain. */ + if ((ret = wolfSSL_add0_chain_cert(ssl, x509)) != 1) { + /* Decrease reference count on error as not stored. */ + wolfSSL_X509_free(x509); + } + } + + return ret; +} +#endif /* KEEP_OUR_CERT */ +#endif /* OPENSSL_EXTRA, HAVE_LIGHTY, WOLFSSL_MYSQL_COMPATIBLE, HAVE_STUNNEL, + WOLFSSL_NGINX, HAVE_POCO_LIB, WOLFSSL_HAPROXY */ + +#ifdef OPENSSL_EXTRA + +/* Load a private key into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] pkey EVP private key. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_PrivateKey(WOLFSSL_CTX *ctx, WOLFSSL_EVP_PKEY *pkey) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_CTX_use_PrivateKey"); + + /* Validate parameters. */ + if ((ctx == NULL) || (pkey == NULL) || (pkey->pkey.ptr == NULL)) { + ret = 0; + } + + if (ret == 1) { + switch (pkey->type) { + #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) + case EVP_PKEY_RSA: + WOLFSSL_MSG("populating RSA key"); + ret = PopulateRSAEvpPkeyDer(pkey); + break; + #endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */ + #if !defined(HAVE_SELFTEST) && (defined(WOLFSSL_KEY_GEN) || \ + defined(WOLFSSL_CERT_GEN)) && !defined(NO_DSA) + case EVP_PKEY_DSA: + break; + #endif /* !HAVE_SELFTEST && (WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN) && + * !NO_DSA */ + #ifdef HAVE_ECC + case EVP_PKEY_EC: + WOLFSSL_MSG("populating ECC key"); + ret = ECC_populate_EVP_PKEY(pkey, pkey->ecc); + break; + #endif + default: + ret = 0; + } + } + + if (ret == 1) { + /* ptr for WOLFSSL_EVP_PKEY struct is expected to be DER format */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, + (const unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, + SSL_FILETYPE_ASN1); + } + + return ret; +} + +#endif /* OPENSSL_EXTRA */ + +#if defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_QT) +/* Load a DER encoded certificate in a buffer into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] der Buffer holding DER encoded certificate. + * @param [in] derSz Size of data in bytes. + * @return 1 on success. + * @return 0 on failure. + */ +int wolfSSL_CTX_use_certificate_ASN1(WOLFSSL_CTX *ctx, int derSz, + const unsigned char *der) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_CTX_use_certificate_ASN1"); + + /* Validate parameters. */ + if ((ctx == NULL) || (der == NULL)) { + ret = 0; + } + /* Load DER encoded cerificate into SSL context. */ + if ((ret == 1) && (wolfSSL_CTX_use_certificate_buffer(ctx, der, derSz, + WOLFSSL_FILETYPE_ASN1) != 1)) { + ret = 0; + } + + return ret; +} + +#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) +/* Load an RSA private key into SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] rsa RSA private key. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ctx or rsa is NULL. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wolfSSL_CTX_use_RSAPrivateKey(WOLFSSL_CTX* ctx, WOLFSSL_RSA* rsa) +{ + int ret = 1; + int derSize; + unsigned char* der = NULL; + unsigned char* p; + + WOLFSSL_ENTER("wolfSSL_CTX_use_RSAPrivateKey"); + + /* Validate parameters. */ + if ((ctx == NULL) || (rsa == NULL)) { + WOLFSSL_MSG("one or more inputs were NULL"); + ret = BAD_FUNC_ARG; + } + + /* Get DER encoding size. */ + if ((ret == 1) && ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, NULL)) <= 0)) { + ret = 0; + } + + if (ret == 1) { + /* Allocate memory to hold DER encoding.. */ + der = (unsigned char*)XMALLOC(derSize, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (der == NULL) { + WOLFSSL_MSG("Malloc failure"); + ret = MEMORY_E; + } + } + + if (ret == 1) { + /* Pointer passed in is modified.. */ + p = der; + /* Encode the RSA key as DER into buffer and get size. */ + if ((derSize = wolfSSL_i2d_RSAPrivateKey(rsa, &p)) <= 0) { + WOLFSSL_MSG("wolfSSL_i2d_RSAPrivateKey() failure"); + ret = 0; + } + } + + if (ret == 1) { + /* Load DER encoded cerificate into SSL context. */ + ret = wolfSSL_CTX_use_PrivateKey_buffer(ctx, der, derSize, + SSL_FILETYPE_ASN1); + if (ret != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_CTX_USE_PrivateKey_buffer() failure"); + ret = 0; + } + } + + /* Dispos of dynamically allocated data. */ + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return ret; +} +#endif /* WOLFSSL_KEY_GEN && !NO_RSA */ + +#endif /* OPENSSL_ALL || WOLFSSL_ASIO || WOLFSSL_HAPROXY || WOLFSSL_QT */ + +#endif /* !NO_CERTS */ + +#ifdef OPENSSL_EXTRA + +/* Use the default paths to look for CA certificate. + * + * This is an OpenSSL compatibility layer function, but it doesn't mirror + * the exact functionality of its OpenSSL counterpart. We don't support the + * notion of an "OpenSSL directory". This function will attempt to load the + * environment variables SSL_CERT_DIR and SSL_CERT_FILE, if either are + * found, they will be loaded. Otherwise, it will act as a wrapper around + * our native wolfSSL_CTX_load_system_CA_certs function. This function does + * conform to OpenSSL's return value conventions. + * + * @param [in] ctx SSL context object. + * @return 1 on success. + * @return 0 on failure. + * @return WOLFSSL_FATAL_ERROR when using a filesystem is not supported. + */ +int wolfSSL_CTX_set_default_verify_paths(WOLFSSL_CTX* ctx) +{ + int ret; +#ifdef XGETENV + char* certDir; + char* certFile; + word32 flags; +#elif !defined(WOLFSSL_SYS_CA_CERTS) + (void)ctx; +#endif + + WOLFSSL_ENTER("wolfSSL_CTX_set_default_verify_paths"); + +#ifdef XGETENV + certDir = XGETENV("SSL_CERT_DIR"); + certFile = XGETENV("SSL_CERT_FILE"); + flags = WOLFSSL_LOAD_FLAG_PEM_CA_ONLY; + + if ((certDir != NULL) || (certFile != NULL)) { + if (certDir != NULL) { + /* We want to keep trying to load more CA certs even if one cert in + * the directory is bad and can't be used (e.g. if one is + * expired), so we use WOLFSSL_LOAD_FLAG_IGNORE_ERR. + */ + flags |= WOLFSSL_LOAD_FLAG_IGNORE_ERR; + } + + /* Load CA certificates from environment variable locations. */ + ret = wolfSSL_CTX_load_verify_locations_ex(ctx, certFile, certDir, + flags); + if (ret != 1) { + WOLFSSL_MSG_EX("Failed to load CA certs from SSL_CERT_FILE: %s" + " SSL_CERT_DIR: %s. Error: %d", certFile, + certDir, ret); + ret = 0; + } + } + else +#endif + + { + #ifdef NO_FILESYSTEM + WOLFSSL_MSG("wolfSSL_CTX_set_default_verify_paths not supported" + " with NO_FILESYSTEM enabled"); + ret = WOLFSSL_FATAL_ERROR; + #elif defined(WOLFSSL_SYS_CA_CERTS) + /* Load the system CA certificates. */ + ret = wolfSSL_CTX_load_system_CA_certs(ctx); + if (ret == WOLFSSL_BAD_PATH) { + /* OpenSSL doesn't treat the lack of a system CA cert directory as a + * failure. We do the same here. + */ + ret = 1; + } + #else + /* OpenSSL's implementation of this API does not require loading the + system CA cert directory. Allow skipping this without erroring out. */ + ret = 1; + #endif + } + + WOLFSSL_LEAVE("wolfSSL_CTX_set_default_verify_paths", ret); + + return ret; +} + +#endif /* OPENSSL_EXTRA */ + +#ifndef NO_DH + +/* Set the temporary DH parameters against the SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] p Buffer holding prime. + * @param [in] pSz Length of prime in bytes. + * @param [in] g Buffer holding generator. + * @param [in] gSz Length of generator in bytes. + * @return 1 on success. + * @return 0 on failure. + * @return DH_KEY_SIZE_E when the prime is too short or long. + * @return SIDE_ERROR when the SSL is for a client. + */ +static int wolfssl_set_tmp_dh(WOLFSSL* ssl, unsigned char* p, int pSz, + unsigned char* g, int gSz) +{ + int ret = 1; + + /* Check the size of the prime meets the requirements of the SSL. */ + if (((word16)pSz < ssl->options.minDhKeySz) || + ((word16)pSz > ssl->options.maxDhKeySz)) { + ret = DH_KEY_SIZE_E; + } + /* Only able to set DH parameters on server. */ + if ((ret == 1) && (ssl->options.side == WOLFSSL_CLIENT_END)) { + ret = SIDE_ERROR; + } + + if (ret == 1) { + #if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \ + !defined(HAVE_SELFTEST) + /* New DH parameters not tested for validity. */ + ssl->options.dhKeyTested = 0; + /* New DH parameters must be tested for validity before use. */ + ssl->options.dhDoKeyTest = 1; + #endif + + /* Dispose of old DH parameters if we own it. */ + if (ssl->buffers.weOwnDH) { + XFREE(ssl->buffers.serverDH_P.buffer, ssl->heap, + DYNAMIC_TYPE_PUBLIC_KEY); + XFREE(ssl->buffers.serverDH_G.buffer, ssl->heap, + DYNAMIC_TYPE_PUBLIC_KEY); + } + + /* Assign the buffers and lengths to SSL. */ + ssl->buffers.serverDH_P.buffer = p; + ssl->buffers.serverDH_G.buffer = g; + ssl->buffers.serverDH_P.length = (unsigned int)pSz; + ssl->buffers.serverDH_G.length = (unsigned int)gSz; + /* We own the buffers. */ + ssl->buffers.weOwnDH = 1; + /* We have a DH parameters to use. */ + ssl->options.haveDH = 1; + } + + /* Allocate space for cipher suites. */ + if ((ret == 1) && (AllocateSuites(ssl) != 0)) { + ssl->buffers.serverDH_P.buffer = NULL; + ssl->buffers.serverDH_G.buffer = NULL; + ret = 0; + } + if (ret == 1) { + /* Reset the cipher suites based on having a DH parameters now. */ + InitSuites(ssl->suites, ssl->version, SSL_KEY_SZ(ssl), + WOLFSSL_HAVE_RSA, SSL_HAVE_PSK(ssl), ssl->options.haveDH, + ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, + ssl->options.haveStaticECC, ssl->options.haveFalconSig, + ssl->options.haveDilithiumSig, ssl->options.useAnon, TRUE, + ssl->options.side); + } + + return ret; +} + +/* Set the temporary DH parameters against the SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] p Buffer holding prime. + * @param [in] pSz Length of prime in bytes. + * @param [in] g Buffer holding generator. + * @param [in] gSz Length of generator in bytes. + * @return 1 on success. + * @return 0 on failure. + * @return DH_KEY_SIZE_E when the prime is too short or long. + * @return SIDE_ERROR when the SSL is for a client. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wolfSSL_SetTmpDH(WOLFSSL* ssl, const unsigned char* p, int pSz, + const unsigned char* g, int gSz) +{ + int ret = 1; + byte* pAlloc = NULL; + byte* gAlloc = NULL; + + WOLFSSL_ENTER("wolfSSL_SetTmpDH"); + + /* Validate parameters. */ + if ((ssl == NULL) || (p == NULL) || (g == NULL)) { + ret = 0; + } + + if (ret == 1) { + /* Allocate buffers for p and g to be assigned into SSL. */ + pAlloc = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + gAlloc = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + if ((pAlloc == NULL) || (gAlloc == NULL)) { + ret = MEMORY_E; + } + } + if (ret == 1) { + /* Copy p and g into allocated buffers. */ + XMEMCPY(pAlloc, p, pSz); + XMEMCPY(gAlloc, g, gSz); + /* Set the buffers into SSL. */ + ret = wolfssl_set_tmp_dh(ssl, pAlloc, pSz, gAlloc, gSz); + } + + if (ret != 1 && ssl != NULL) { + /* Free the allocated buffers if not assigned into SSL. */ + XFREE(pAlloc, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + XFREE(gAlloc, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + + WOLFSSL_LEAVE("wolfSSL_SetTmpDH", ret); + return ret; +} + +#if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \ + !defined(HAVE_SELFTEST) +/* Check the DH parameters is valid. + * + * @param [in] p Buffer holding prime. + * @param [in] pSz Length of prime in bytes. + * @param [in] g Buffer holding generator. + * @param [in] gSz Length of generator in bytes. + * @return 1 on success. + * @return DH_CHECK_PUB_E when p is not a prime. + * @return BAD_FUNC_ARG when p or g is NULL, or pSz or gSz is 0. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int wolfssl_check_dh_key(unsigned char* p, int pSz, unsigned char* g, + int gSz) +{ + WC_RNG rng; + int ret = 0; +#ifndef WOLFSSL_SMALL_STACK + DhKey checkKey[1]; +#else + DhKey *checkKey; +#endif + +#ifdef WOLFSSL_SMALL_STACK + checkKey = (DhKey*)XMALLOC(sizeof(DhKey), NULL, DYNAMIC_TYPE_DH); + if (checkKey == NULL) { + ret = MEMORY_E; + } +#endif + /* Initialize a new random number generator. */ + if ((ret == 0) && ((ret = wc_InitRng(&rng)) == 0)) { + /* Initialize a DH object. */ + if ((ret = wc_InitDhKey(checkKey)) == 0) { + /* Check DH parameters. */ + ret = wc_DhSetCheckKey(checkKey, p, (word32)pSz, g, gSz, NULL, 0, 0, &rng); + /* Dispose of DH object. */ + wc_FreeDhKey(checkKey); + } + /* Dispose of random number generator. */ + wc_FreeRng(&rng); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of dynamically allocated data. */ + XFREE(checkKey, NULL, DYNAMIC_TYPE_DH); +#endif + /* Convert wolfCrypt return code to 1 on success and ret on failure. */ + return WC_TO_WS_RC(ret); +} +#endif + +/* Set the temporary DH parameters against the SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] p Buffer holding prime. + * @param [in] pSz Length of prime in bytes. + * @param [in] g Buffer holding generator. + * @param [in] gSz Length of generator in bytes. + * @return 1 on success. + * @return 0 on failure. + * @return DH_KEY_SIZE_E when the prime is too short or long. + * @return SIDE_ERROR when the SSL is for a client. + * @return BAD_FUNC_ARG when ctx, p or g is NULL. + * @return DH_CHECK_PUB_E when p is not a prime. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int wolfssl_ctx_set_tmp_dh(WOLFSSL_CTX* ctx, unsigned char* p, int pSz, + unsigned char* g, int gSz) +{ + int ret = 1; + + WOLFSSL_ENTER("wolfSSL_CTX_SetTmpDH"); + + /* Check the size of the prime meets the requirements of the SSL context. */ + if (((word16)pSz < ctx->minDhKeySz) || ((word16)pSz > ctx->maxDhKeySz)) { + ret = DH_KEY_SIZE_E; + } + +#if !defined(WOLFSSL_OLD_PRIME_CHECK) && !defined(HAVE_FIPS) && \ + !defined(HAVE_SELFTEST) + if (ret == 1) { + /* Test DH parameters for validity. */ + ret = wolfssl_check_dh_key(p, pSz, g, gSz); + /* Record as whether tested based on result of validity test. */ + ctx->dhKeyTested = (ret == 1); + } +#endif + + if (ret == 1) { + /* Dispose of old DH parameters. */ + XFREE(ctx->serverDH_P.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + XFREE(ctx->serverDH_G.buffer, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + /* Assign the buffers and lengths to SSL context. */ + ctx->serverDH_P.buffer = p; + ctx->serverDH_G.buffer = g; + ctx->serverDH_P.length = (unsigned int)pSz; + ctx->serverDH_G.length = (unsigned int)gSz; + /* We have a DH parameters to use. */ + ctx->haveDH = 1; + } + + WOLFSSL_LEAVE("wolfSSL_CTX_SetTmpDH", 0); + return ret; +} + +/* Set the temporary DH parameters against the SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] p Buffer holding prime. + * @param [in] pSz Length of prime in bytes. + * @param [in] g Buffer holding generator. + * @param [in] gSz Length of generator in bytes. + * @return 1 on success. + * @return 0 on failure. + * @return DH_KEY_SIZE_E when the prime is too short or long. + * @return SIDE_ERROR when the SSL is for a client. + * @return BAD_FUNC_ARG when ctx, p or g is NULL. + * @return DH_CHECK_PUB_E when p is not a prime. + */ +int wolfSSL_CTX_SetTmpDH(WOLFSSL_CTX* ctx, const unsigned char* p, int pSz, + const unsigned char* g, int gSz) +{ + int ret = 1; + byte* pAlloc = NULL; + byte* gAlloc = NULL; + + /* Validate parameters. */ + if ((ctx == NULL) || (p == NULL) || (g == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 1) { + /* Allocate buffers for p and g to be assigned into SSL context. */ + pAlloc = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + gAlloc = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + if ((pAlloc == NULL) || (gAlloc == NULL)) { + XFREE(pAlloc, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + pAlloc = NULL; + XFREE(gAlloc, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + gAlloc = NULL; + ret = MEMORY_E; + } + } + + if (ret == 1) { + /* Copy p and g into allocated buffers. */ + XMEMCPY(pAlloc, p, pSz); + XMEMCPY(gAlloc, g, gSz); + /* Set the buffers into SSL context. */ + ret = wolfssl_ctx_set_tmp_dh(ctx, pAlloc, pSz, gAlloc, gSz); + } + + if (ret != 1) { + /* Free the allocated buffers if not assigned into SSL context. */ + if (pAlloc) + XFREE(pAlloc, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + if (gAlloc) + XFREE(gAlloc, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + return ret; +} + +#ifdef OPENSSL_EXTRA +/* Set the temporary DH parameters against the SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] dh DH object. + * @return 1 on success. + * @return 0 on failure. + * @return WOLFSSL_FATAL_ERROR on failure. + * @return BAD_FUNC_ARG when ssl or dh is NULL. + * @return DH_KEY_SIZE_E when the prime is too short or long. + * @return SIDE_ERROR when the SSL is for a client. + */ +long wolfSSL_set_tmp_dh(WOLFSSL *ssl, WOLFSSL_DH *dh) +{ + int ret = 1; + byte* p = NULL; + byte* g = NULL; + int pSz = 0; + int gSz = 0; + + WOLFSSL_ENTER("wolfSSL_set_tmp_dh"); + + /* Validate parameters. */ + if ((ssl == NULL) || (dh == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 1) { + /* Get needed size for p and g. */ + pSz = wolfSSL_BN_bn2bin(dh->p, NULL); + gSz = wolfSSL_BN_bn2bin(dh->g, NULL); + /* Validate p and g size. */ + if ((pSz <= 0) || (gSz <= 0)) { + ret = WOLFSSL_FATAL_ERROR; + } + } + + if (ret == 1) { + /* Allocate buffers for p and g to be assigned into SSL. */ + p = (byte*)XMALLOC(pSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + g = (byte*)XMALLOC(gSz, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + if ((p == NULL) || (g == NULL)) { + ret = MEMORY_E; + } + } + if (ret == 1) { + /* Encode p and g and get sizes. */ + pSz = wolfSSL_BN_bn2bin(dh->p, p); + gSz = wolfSSL_BN_bn2bin(dh->g, g); + /* Check encoding worked. */ + if ((pSz <= 0) || (gSz <= 0)) { + ret = WOLFSSL_FATAL_ERROR; + } + } + if (ret == 1) { + /* Set the buffers into SSL. */ + ret = wolfssl_set_tmp_dh(ssl, p, pSz, g, gSz); + } + + if (ret != 1 && ssl != NULL) { + /* Free the allocated buffers if not assigned into SSL. */ + XFREE(p, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + XFREE(g, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + return ret; +} + +/* Set the temporary DH parameters object against the SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] dh DH object. + * @return 1 on success. + * @return 0 on failure. + * @return DH_KEY_SIZE_E when the prime is too short or long. + * @return SIDE_ERROR when the SSL is for a client. + * @return BAD_FUNC_ARG when ctx, p or g is NULL. + * @return DH_CHECK_PUB_E when p is not a prime. + */ +long wolfSSL_CTX_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL_DH* dh) +{ + int ret = 1; + int pSz = 0; + int gSz = 0; + byte* p = NULL; + byte* g = NULL; + + WOLFSSL_ENTER("wolfSSL_CTX_set_tmp_dh"); + + /* Validate parameters. */ + if ((ctx == NULL) || (dh == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 1) { + /* Get needed size for p and g. */ + pSz = wolfSSL_BN_bn2bin(dh->p, NULL); + gSz = wolfSSL_BN_bn2bin(dh->g, NULL); + /* Validate p and g size. */ + if ((pSz <= 0) || (gSz <= 0)) { + ret = WOLFSSL_FATAL_ERROR; + } + } + + if (ret == 1) { + /* Allocate buffers for p and g to be assigned into SSL. */ + p = (byte*)XMALLOC(pSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + g = (byte*)XMALLOC(gSz, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + if ((p == NULL) || (g == NULL)) { + ret = MEMORY_E; + } + } + + if (ret == 1) { + /* Encode p and g and get sizes. */ + pSz = wolfSSL_BN_bn2bin(dh->p, p); + gSz = wolfSSL_BN_bn2bin(dh->g, g); + /* Check encoding worked. */ + if ((pSz < 0) && (gSz < 0)) { + ret = WOLFSSL_FATAL_ERROR; + } + } + if (ret == 1) { + /* Set the buffers into SSL context. */ + ret = wolfssl_ctx_set_tmp_dh(ctx, p, pSz, g, gSz); + } + + if (ret != 1 && ctx != NULL) { + /* Free the allocated buffers if not assigned into SSL. */ + XFREE(p, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + XFREE(g, ctx->heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + return ret; +} + +#endif /* OPENSSL_EXTRA */ + +#ifndef NO_CERTS + +/* Set the temporary DH parameters against the SSL context or SSL. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] buf Buffer holding encoded DH parameters. + * @param [in] sz Size of encoded DH parameters. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return 0 on failure. + * @return BAD_FUNC_ARG when ctx and ssl NULL or buf is NULL. + * @return NOT_COMPLED_IN when format is PEM but PEM is not supported. + * @return WOLFSSL_BAD_FILETYPE if format is not supported. + */ +static int ws_ctx_ssl_set_tmp_dh(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + const unsigned char* buf, long sz, int format) +{ + DerBuffer* der = NULL; + int res = 1; + int ret; + /* p and g size to allocate set to maximum valid size. */ + word32 pSz = MAX_DH_SIZE; + word32 gSz = MAX_DH_SIZE; + byte* p = NULL; + byte* g = NULL; + void* heap = WOLFSSL_HEAP(ctx, ssl); + + /* Validate parameters. */ + if (((ctx == NULL) && (ssl == NULL)) || (buf == NULL)) { + res = BAD_FUNC_ARG; + } + /* Check format is supported. */ + if ((res == 1) && (format != WOLFSSL_FILETYPE_ASN1)) { + if (format != WOLFSSL_FILETYPE_PEM) { + res = WOLFSSL_BAD_FILETYPE; + } + #ifndef WOLFSSL_PEM_TO_DER + else { + res = NOT_COMPILED_IN; + } + #endif + } + + /* PemToDer allocates its own DER buffer. */ + if ((res == 1) && (format != WOLFSSL_FILETYPE_PEM)) { + /* Create an empty DER buffer. */ + ret = AllocDer(&der, 0, DH_PARAM_TYPE, heap); + if (ret == 0) { + /* Assign encoded DH parameters to DER buffer. */ + der->buffer = (byte*)buf; + der->length = (word32)sz; + } + else { + res = ret; + } + } + + if (res == 1) { + /* Allocate enough memory to p and g to support valid use cases. */ + p = (byte*)XMALLOC(pSz, heap, DYNAMIC_TYPE_PUBLIC_KEY); + g = (byte*)XMALLOC(gSz, heap, DYNAMIC_TYPE_PUBLIC_KEY); + if ((p == NULL) || (g == NULL)) { + res = MEMORY_E; + } + } + +#ifdef WOLFSSL_PEM_TO_DER + if ((res == 1) && (format == WOLFSSL_FILETYPE_PEM)) { + /* Convert from PEM to DER. */ + /* Try converting DH parameters from PEM to DER. */ + ret = PemToDer(buf, sz, DH_PARAM_TYPE, &der, heap, NULL, NULL); + if (ret < 0) { + /* Otherwise, try converting X9.43 format DH parameters. */ + ret = PemToDer(buf, sz, X942_PARAM_TYPE, &der, heap, NULL, NULL); + } + #if defined(WOLFSSL_WPAS) && !defined(NO_DSA) + if (ret < 0) { + /* Otherwise, try converting DSA parameters. */ + ret = PemToDer(buf, sz, DSA_PARAM_TYPE, &der, heap, NULL, NULL); + } + #endif /* WOLFSSL_WPAS && !NO_DSA */ + if (ret < 0) { + /* Return error from conversion. */ + res = ret; + } + } +#endif /* WOLFSSL_PEM_TO_DER */ + + if (res == 1) { + /* Get the p and g from the DER encoded parameters. */ + if (wc_DhParamsLoad(der->buffer, der->length, p, &pSz, g, &gSz) < 0) { + res = WOLFSSL_BAD_FILETYPE; + } + else if (ssl != NULL) { + /* Set p and g into SSL. */ + res = wolfssl_set_tmp_dh(ssl, p, (int)pSz, g, gSz); + } + else { + /* Set p and g into SSL context. */ + res = wolfssl_ctx_set_tmp_dh(ctx, p, (int)pSz, g, gSz); + } + } + + /* Dispose of the DER buffer. */ + FreeDer(&der); + if (res != 1) { + /* Free the allocated buffers if not assigned into SSL or context. */ + XFREE(p, heap, DYNAMIC_TYPE_PUBLIC_KEY); + XFREE(g, heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + return res; +} + + +/* Set the temporary DH parameters against the SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] buf Buffer holding encoded DH parameters. + * @param [in] sz Size of encoded DH parameters. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return BAD_FUNC_ARG when ssl or buf is NULL. + * @return NOT_COMPLED_IN when format is PEM but PEM is not supported. + * @return WOLFSSL_BAD_FILETYPE if format is not supported. + */ +int wolfSSL_SetTmpDH_buffer(WOLFSSL* ssl, const unsigned char* buf, long sz, + int format) +{ + return ws_ctx_ssl_set_tmp_dh(NULL, ssl, buf, sz, format); +} + + +/* Set the temporary DH parameters against the SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] buf Buffer holding encoded DH parameters. + * @param [in] sz Size of encoded DH parameters. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return BAD_FUNC_ARG when ctx or buf is NULL. + * @return NOT_COMPLED_IN when format is PEM but PEM is not supported. + * @return WOLFSSL_BAD_FILETYPE if format is not supported. + */ +int wolfSSL_CTX_SetTmpDH_buffer(WOLFSSL_CTX* ctx, const unsigned char* buf, + long sz, int format) +{ + return ws_ctx_ssl_set_tmp_dh(ctx, NULL, buf, sz, format); +} + +#ifndef NO_FILESYSTEM + +/* Set the temporary DH parameters file against the SSL context or SSL. + * + * @param [in, out] ctx SSL context object. + * @param [in, out] ssl SSL object. + * @param [in] fname Name of file to load. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return BAD_FUNC_ARG when ctx and ssl NULL or fname is NULL. + * @return NOT_COMPLED_IN when format is PEM but PEM is not supported. + * @return WOLFSSL_BAD_FILETYPE if format is not supported. + */ +static int ws_ctx_ssl_set_tmp_dh_file(WOLFSSL_CTX* ctx, WOLFSSL* ssl, + const char* fname, int format) +{ + int res = 1; + int ret; +#ifndef WOLFSSL_SMALL_STACK + byte stackBuffer[FILE_BUFFER_SIZE]; +#endif + StaticBuffer dhFile; + long sz = 0; + void* heap = WOLFSSL_HEAP(ctx, ssl); + + /* Setup buffer to hold file contents. */ +#ifdef WOLFSSL_SMALL_STACK + static_buffer_init(&dhFile); +#else + static_buffer_init(&dhFile, stackBuffer, FILE_BUFFER_SIZE); +#endif + + /* Validate parameters. */ + if (((ctx == NULL) && (ssl == NULL)) || (fname == NULL)) { + res = BAD_FUNC_ARG; + } + + if (res == 1) { + /* Read file into static buffer. */ + ret = wolfssl_read_file_static(fname, &dhFile, heap, DYNAMIC_TYPE_FILE, + &sz); + if (ret != 0) { + res = ret; + } + } + if (res == 1) { + if (ssl != NULL) { + /* Set encoded DH parameters into SSL. */ + res = wolfSSL_SetTmpDH_buffer(ssl, dhFile.buffer, sz, format); + } + else { + /* Set encoded DH parameters into SSL context. */ + res = wolfSSL_CTX_SetTmpDH_buffer(ctx, dhFile.buffer, sz, format); + } + } + + /* Dispose of any dynamically allocated data. */ + static_buffer_free(&dhFile, heap, DYNAMIC_TYPE_FILE); + return res; +} + +/* Set the temporary DH parameters file against the SSL. + * + * @param [in, out] ssl SSL object. + * @param [in] fname Name of file to load. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return BAD_FUNC_ARG when ssl or fname is NULL. + * @return NOT_COMPLED_IN when format is PEM but PEM is not supported. + * @return WOLFSSL_BAD_FILETYPE if format is not supported. + */ +int wolfSSL_SetTmpDH_file(WOLFSSL* ssl, const char* fname, int format) +{ + return ws_ctx_ssl_set_tmp_dh_file(NULL, ssl, fname, format); +} + + +/* Set the temporary DH parameters file against the SSL context. + * + * @param [in, out] ctx SSL context object. + * @param [in] fname Name of file to load. + * @param [in] format Format of data: + * WOLFSSL_FILETYPE_PEM or WOLFSSL_FILETYPE_ASN1. + * @return 1 on success. + * @return BAD_FUNC_ARG when ctx or fname is NULL. + * @return NOT_COMPLED_IN when format is PEM but PEM is not supported. + * @return WOLFSSL_BAD_FILETYPE if format is not supported. + */ +int wolfSSL_CTX_SetTmpDH_file(WOLFSSL_CTX* ctx, const char* fname, int format) +{ + return ws_ctx_ssl_set_tmp_dh_file(ctx, NULL, fname, format); +} + +#endif /* NO_FILESYSTEM */ + +#endif /* NO_CERTS */ + +#endif /* !NO_DH */ + +#endif /* !WOLFSSL_SSL_LOAD_INCLUDED */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_misc.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_misc.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_misc.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_misc.c 2024-08-03 07:30:00.000000000 +0000 @@ -24,6 +24,8 @@ #endif #include +#include +#include #if !defined(WOLFSSL_SSL_MISC_INCLUDED) #ifndef WOLFSSL_IGNORE_FILE_WARN @@ -54,7 +56,7 @@ char* p; /* Allocate buffer to hold a chunk of data. */ - mem = (char*)XMALLOC(READ_BIO_FILE_CHUNK, bio->heap, DYNAMIC_TYPE_OPENSSL); + mem = (char*)XMALLOC(READ_BIO_FILE_CHUNK, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (mem == NULL) { WOLFSSL_ERROR_MSG("Memory allocation error"); ret = MEMORY_E; @@ -86,8 +88,8 @@ } else { /* No space left for more data to be read - add a chunk. */ - p = (char*)XREALLOC(mem, ret + READ_BIO_FILE_CHUNK, bio->heap, - DYNAMIC_TYPE_OPENSSL); + p = (char*)XREALLOC(mem, ret + READ_BIO_FILE_CHUNK, NULL, + DYNAMIC_TYPE_TMP_BUFFER); if (p == NULL) { sz = MEMORY_E; break; @@ -103,7 +105,7 @@ } if ((sz < 0) || (ret == 0)) { /* Dispose of memory on error or no data read. */ - XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL); + XFREE(mem, NULL, DYNAMIC_TYPE_TMP_BUFFER); mem = NULL; /* Return error. */ ret = sz; @@ -129,14 +131,14 @@ char* mem; /* Allocate buffer to hold data. */ - mem = (char*)XMALLOC((size_t)sz, bio->heap, DYNAMIC_TYPE_OPENSSL); + mem = (char*)XMALLOC((size_t)sz, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (mem == NULL) { WOLFSSL_ERROR_MSG("Memory allocation error"); ret = MEMORY_E; } else if ((ret = wolfSSL_BIO_read(bio, mem, sz)) != sz) { /* Pending data not read. */ - XFREE(mem, bio->heap, DYNAMIC_TYPE_OPENSSL); + XFREE(mem, NULL, DYNAMIC_TYPE_TMP_BUFFER); mem = NULL; ret = MEMORY_E; } @@ -203,8 +205,10 @@ return ret; } #endif /* !NO_BIO */ +#endif /* OPENSSL_EXTRA && !WOLFCRYPT_ONLY */ -#if !defined(NO_FILESYSTEM) +#if (defined(OPENSSL_EXTRA) || defined(PERSIST_CERT_CACHE) || \ + !defined(NO_CERTS)) && !defined(WOLFCRYPT_ONLY) && !defined(NO_FILESYSTEM) /* Read all the data from a file. * * @param [in] fp File pointer to read with. @@ -253,7 +257,10 @@ return ret; } +#endif +#if (defined(OPENSSL_EXTRA) || defined(PERSIST_CERT_CACHE)) && \ + !defined(WOLFCRYPT_ONLY) && !defined(NO_FILESYSTEM) /* Read all the data from a file. * * @param [in] fp File pointer to read with. @@ -290,7 +297,206 @@ XFREE(mem, NULL, DYNAMIC_TYPE_TMP_BUFFER); return ret; } +#endif /* (OPENSSL_EXTRA || PERSIST_CERT_CACHE) && !WOLFCRYPT_ONLY && + * !NO_FILESYSTEM */ + +#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) + +#ifdef WOLFSSL_SMALL_STACK + +/* Buffer and size with no stack buffer. */ +typedef struct { + /* Dynamically allocated buffer. */ + byte* buffer; + /* Size of buffer in bytes. */ + word32 sz; +} StaticBuffer; + +/* Initialize static buffer. + * + * @param [in, out] sb Static buffer. + */ +static void static_buffer_init(StaticBuffer* sb) +{ + sb->buffer = NULL; + sb->sz = 0; +} + +/* Set the size of the buffer. + * + * Can only set size once. + * + * @param [in] sb Static buffer. + * @param [in] len Length required. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] type Type of dynamic memory. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int static_buffer_set_size(StaticBuffer* sb, word32 len, void* heap, + int type) +{ + int ret = 0; + + (void)heap; + (void)type; + + sb->buffer = (byte*)XMALLOC(len, heap, type); + if (sb->buffer == NULL) { + ret = MEMORY_E; + } + else { + sb->sz = len; + } + + return ret; +} + +/* Dispose of dynamically allocated buffer. + * + * @param [in] sb Static buffer. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] type Type of dynamic memory. + */ +static void static_buffer_free(StaticBuffer* sb, void* heap, int type) +{ + (void)heap; + (void)type; + XFREE(sb->buffer, heap, type); +} + +#else + +/* Buffer and size with stack buffer set and option to dynamically allocate. */ +typedef struct { + /* Stack or heap buffer. */ + byte* buffer; + /* Size of buffer in bytes. */ + word32 sz; + /* Indicates whether the buffer was dynamically allocated. */ + int dyn; +} StaticBuffer; + +/* Initialize static buffer. + * + * @param [in, out] sb Static buffer. + * @param [in] stackBuffer Buffer allocated on the stack. + * @param [in] len Length of stack buffer. + */ +static void static_buffer_init(StaticBuffer* sb, byte* stackBuffer, word32 len) +{ + sb->buffer = stackBuffer; + sb->sz = len; + sb->dyn = 0; +} + +/* Set the size of the buffer. + * + * Pre: Buffer on the stack set with its size. + * Can only set size once. + * + * @param [in] sb Static buffer. + * @param [in] len Length required. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] type Type of dynamic memory. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + */ +static int static_buffer_set_size(StaticBuffer* sb, word32 len, void* heap, + int type) +{ + int ret = 0; + + (void)heap; + (void)type; + + if (len > sb->sz) { + byte* buff = (byte*)XMALLOC(len, heap, type); + if (buff == NULL) { + ret = MEMORY_E; + } + else { + sb->buffer = buff; + sb->sz = len; + sb->dyn = 1; + } + } + + return ret; +} + +/* Dispose of dynamically allocated buffer. + * + * @param [in] sb Static buffer. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] type Type of dynamic memory. + */ +static void static_buffer_free(StaticBuffer* sb, void* heap, int type) +{ + (void)heap; + (void)type; + + if (sb->dyn) { + XFREE(sb->buffer, heap, type); + } +} + +#endif /* WOLFSSL_SMALL_STACK */ + +#ifndef NO_FILESYSTEM + +/* Read all the data from a file into content. + * + * @param [in] fname File pointer to read with. + * @param [in, out] content Read data in an allocated buffer. + * @param [in] heap Dynamic memory allocation hint. + * @param [in] type Type of dynamic memory. + * @param [out] size Amount of data read in bytes. + * @return 0 on success. + * @return WOLFSSL_BAD_FILE when reading fails. + * @return MEMORY_E when memory allocation fails. + */ +static int wolfssl_read_file_static(const char* fname, StaticBuffer* content, + void* heap, int type, long* size) +{ + int ret = 0; + XFILE file = XBADFILE; + long sz = 0; + + /* Check filename is usable. */ + if (fname == NULL) { + ret = WOLFSSL_BAD_FILE; + } + /* Open file for reading. */ + if ((ret == 0) && ((file = XFOPEN(fname, "rb")) == XBADFILE)) { + ret = WOLFSSL_BAD_FILE; + } + if (ret == 0) { + /* Get length of file. */ + ret = wolfssl_file_len(file, &sz); + } + if (ret == 0) { + /* Set the buffer to be big enough to hold all data. */ + ret = static_buffer_set_size(content, (word32)sz, heap, type); + } + /* Read data from file. */ + if ((ret == 0) && ((size_t)XFREAD(content->buffer, 1, (size_t)sz, file) != + (size_t)sz)) { + ret = WOLFSSL_BAD_FILE; + } + + /* Close file if opened. */ + if (file != XBADFILE) { + XFCLOSE(file); + } + /* Return size read. */ + *size = sz; + return ret; +} + #endif /* !NO_FILESYSTEM */ -#endif /* OPENSSL_EXTRA && !WOLFCRYPT_ONLY */ + +#endif /* !WOLFCRYPT_ONLY && !NO_CERTS */ + #endif /* !WOLFSSL_SSL_MISC_INCLUDED */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_p7p12.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_p7p12.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_p7p12.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_p7p12.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2123 @@ +/* ssl_p7p12.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if defined(OPENSSL_EXTRA) && (defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) + #include +#endif +#if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) + #include +#endif + +#if !defined(WOLFSSL_SSL_P7P12_INCLUDED) + #ifndef WOLFSSL_IGNORE_FILE_WARN + #warning ssl_p7p12.c does not need to be compiled separately from ssl.c + #endif +#else + +#if !defined(WOLFCRYPT_ONLY) && !defined(NO_CERTS) + +/******************************************************************************* + * START OF PKCS7 APIs + ******************************************************************************/ +#ifdef HAVE_PKCS7 + +#ifdef OPENSSL_ALL +PKCS7* wolfSSL_PKCS7_new(void) +{ + WOLFSSL_PKCS7* pkcs7; + int ret = 0; + + pkcs7 = (WOLFSSL_PKCS7*)XMALLOC(sizeof(WOLFSSL_PKCS7), NULL, + DYNAMIC_TYPE_PKCS7); + if (pkcs7 != NULL) { + XMEMSET(pkcs7, 0, sizeof(WOLFSSL_PKCS7)); + ret = wc_PKCS7_Init(&pkcs7->pkcs7, NULL, INVALID_DEVID); + } + + if (ret != 0 && pkcs7 != NULL) { + XFREE(pkcs7, NULL, DYNAMIC_TYPE_PKCS7); + pkcs7 = NULL; + } + + return (PKCS7*)pkcs7; +} + +/****************************************************************************** +* wolfSSL_PKCS7_SIGNED_new - allocates PKCS7 and initialize it for a signed data +* +* RETURNS: +* returns pointer to the PKCS7 structure on success, otherwise returns NULL +*/ +PKCS7_SIGNED* wolfSSL_PKCS7_SIGNED_new(void) +{ + byte signedData[]= { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07, 0x02}; + PKCS7* pkcs7 = NULL; + + if ((pkcs7 = wolfSSL_PKCS7_new()) == NULL) + return NULL; + pkcs7->contentOID = SIGNED_DATA; + if ((wc_PKCS7_SetContentType(pkcs7, signedData, sizeof(signedData))) < 0) { + if (pkcs7) { + wolfSSL_PKCS7_free(pkcs7); + return NULL; + } + } + return pkcs7; +} + +void wolfSSL_PKCS7_free(PKCS7* pkcs7) +{ + WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; + + if (p7 != NULL) { + if (p7->data != NULL) + XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7); + wc_PKCS7_Free(&p7->pkcs7); + if (p7->certs) + wolfSSL_sk_pop_free(p7->certs, NULL); + XFREE(p7, NULL, DYNAMIC_TYPE_PKCS7); + } +} + +void wolfSSL_PKCS7_SIGNED_free(PKCS7_SIGNED* p7) +{ + wolfSSL_PKCS7_free(p7); + return; +} + +/** + * Convert DER/ASN.1 encoded signedData structure to internal PKCS7 + * structure. Note, does not support detached content. + * + * p7 - pointer to set to address of newly created PKCS7 structure on return + * in - pointer to pointer of DER/ASN.1 data + * len - length of input data, bytes + * + * Returns newly allocated and populated PKCS7 structure or NULL on error. + */ +PKCS7* wolfSSL_d2i_PKCS7(PKCS7** p7, const unsigned char** in, int len) +{ + return wolfSSL_d2i_PKCS7_ex(p7, in, len, NULL, 0); +} + +/* This internal function is only decoding and setting up the PKCS7 struct. It +* does not verify the PKCS7 signature. +* +* RETURNS: +* returns pointer to a PKCS7 structure on success, otherwise returns NULL +*/ +static PKCS7* wolfSSL_d2i_PKCS7_only(PKCS7** p7, const unsigned char** in, + int len, byte* content, word32 contentSz) +{ + WOLFSSL_PKCS7* pkcs7 = NULL; + + WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex"); + + if (in == NULL || *in == NULL || len < 0) + return NULL; + + if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL) + return NULL; + + pkcs7->len = len; + pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7); + if (pkcs7->data == NULL) { + wolfSSL_PKCS7_free((PKCS7*)pkcs7); + return NULL; + } + XMEMCPY(pkcs7->data, *in, pkcs7->len); + + if (content != NULL) { + pkcs7->pkcs7.content = content; + pkcs7->pkcs7.contentSz = contentSz; + } + + if (p7 != NULL) + *p7 = (PKCS7*)pkcs7; + *in += pkcs7->len; + return (PKCS7*)pkcs7; +} + + +/***************************************************************************** +* wolfSSL_d2i_PKCS7_ex - Converts the given unsigned char buffer of size len +* into a PKCS7 object. Optionally, accepts a byte buffer of content which +* is stored as the PKCS7 object's content, to support detached signatures. +* @param content The content which is signed, in case the signature is +* detached. Ignored if NULL. +* @param contentSz The size of the passed in content. +* +* RETURNS: +* returns pointer to a PKCS7 structure on success, otherwise returns NULL +*/ +PKCS7* wolfSSL_d2i_PKCS7_ex(PKCS7** p7, const unsigned char** in, int len, + byte* content, word32 contentSz) +{ + WOLFSSL_PKCS7* pkcs7 = NULL; + + WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_ex"); + + if (in == NULL || *in == NULL || len < 0) + return NULL; + + pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_d2i_PKCS7_only(p7, in, len, content, + contentSz); + if (pkcs7 != NULL) { + if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) + != 0) { + WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed"); + wolfSSL_PKCS7_free((PKCS7*)pkcs7); + if (p7 != NULL) { + *p7 = NULL; + } + return NULL; + } + } + + return (PKCS7*)pkcs7; +} + + +/** + * This API was added as a helper function for libest. It + * extracts a stack of certificates from the pkcs7 object. + * @param pkcs7 PKCS7 parameter object + * @return WOLFSSL_STACK_OF(WOLFSSL_X509)* + */ +WOLFSSL_STACK* wolfSSL_PKCS7_to_stack(PKCS7* pkcs7) +{ + int i; + WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; + WOLF_STACK_OF(WOLFSSL_X509)* ret = NULL; + + WOLFSSL_ENTER("wolfSSL_PKCS7_to_stack"); + + if (!p7) { + WOLFSSL_MSG("Bad parameter"); + return NULL; + } + + if (p7->certs) + return p7->certs; + + for (i = 0; i < MAX_PKCS7_CERTS && p7->pkcs7.cert[i]; i++) { + WOLFSSL_X509* x509 = wolfSSL_X509_d2i_ex(NULL, p7->pkcs7.cert[i], + p7->pkcs7.certSz[i], pkcs7->heap); + if (!ret) + ret = wolfSSL_sk_X509_new_null(); + if (x509) { + if (wolfSSL_sk_X509_push(ret, x509) != WOLFSSL_SUCCESS) { + wolfSSL_X509_free(x509); + WOLFSSL_MSG("wolfSSL_sk_X509_push error"); + goto error; + } + } + else { + WOLFSSL_MSG("wolfSSL_X509_d2i error"); + goto error; + } + } + + /* Save stack to free later */ + if (p7->certs) + wolfSSL_sk_pop_free(p7->certs, NULL); + p7->certs = ret; + + return ret; +error: + if (ret) { + wolfSSL_sk_pop_free(ret, NULL); + } + return NULL; +} + +/** + * Return stack of signers contained in PKCS7 cert. + * Notes: + * - Currently only PKCS#7 messages with a single signer cert is supported. + * - Returned WOLFSSL_STACK must be freed by caller. + * + * pkcs7 - PKCS7 struct to retrieve signer certs from. + * certs - currently unused + * flags - flags to control function behavior. + * + * Return WOLFSSL_STACK of signers on success, NULL on error. + */ +WOLFSSL_STACK* wolfSSL_PKCS7_get0_signers(PKCS7* pkcs7, WOLFSSL_STACK* certs, + int flags) +{ + WOLFSSL_X509* x509 = NULL; + WOLFSSL_STACK* signers = NULL; + WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; + + if (p7 == NULL) + return NULL; + + /* Only PKCS#7 messages with a single cert that is the verifying certificate + * is supported. + */ + if (flags & PKCS7_NOINTERN) { + WOLFSSL_MSG("PKCS7_NOINTERN flag not supported"); + return NULL; + } + + signers = wolfSSL_sk_X509_new_null(); + if (signers == NULL) + return NULL; + + if (wolfSSL_d2i_X509(&x509, (const byte**)&p7->pkcs7.singleCert, + p7->pkcs7.singleCertSz) == NULL) { + wolfSSL_sk_X509_pop_free(signers, NULL); + return NULL; + } + + if (wolfSSL_sk_X509_push(signers, x509) != WOLFSSL_SUCCESS) { + wolfSSL_sk_X509_pop_free(signers, NULL); + return NULL; + } + + (void)certs; + + return signers; +} + +#ifndef NO_BIO + +PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7) +{ + WOLFSSL_PKCS7* pkcs7; + int ret; + + WOLFSSL_ENTER("wolfSSL_d2i_PKCS7_bio"); + + if (bio == NULL) + return NULL; + + if ((pkcs7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL) + return NULL; + + pkcs7->len = wolfSSL_BIO_get_len(bio); + pkcs7->data = (byte*)XMALLOC(pkcs7->len, NULL, DYNAMIC_TYPE_PKCS7); + if (pkcs7->data == NULL) { + wolfSSL_PKCS7_free((PKCS7*)pkcs7); + return NULL; + } + + if ((ret = wolfSSL_BIO_read(bio, pkcs7->data, pkcs7->len)) <= 0) { + wolfSSL_PKCS7_free((PKCS7*)pkcs7); + return NULL; + } + /* pkcs7->len may change if using b64 for example */ + pkcs7->len = ret; + + if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) + != 0) { + WOLFSSL_MSG("wc_PKCS7_VerifySignedData failed"); + wolfSSL_PKCS7_free((PKCS7*)pkcs7); + return NULL; + } + + if (p7 != NULL) + *p7 = (PKCS7*)pkcs7; + return (PKCS7*)pkcs7; +} + +int wolfSSL_i2d_PKCS7(PKCS7 *p7, unsigned char **out) +{ + byte* output = NULL; + int localBuf = 0; + int len; + WC_RNG rng; + int ret = WOLFSSL_FAILURE; + WOLFSSL_ENTER("wolfSSL_i2d_PKCS7"); + + if (!out || !p7) { + WOLFSSL_MSG("Bad parameter"); + return WOLFSSL_FAILURE; + } + + if (!p7->rng) { + if (wc_InitRng(&rng) != 0) { + WOLFSSL_MSG("wc_InitRng error"); + return WOLFSSL_FAILURE; + } + p7->rng = &rng; /* cppcheck-suppress autoVariables + */ + } + + if ((len = wc_PKCS7_EncodeSignedData(p7, NULL, 0)) < 0) { + WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error"); + goto cleanup; + } + + if (*out == NULL) { + output = (byte*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (!output) { + WOLFSSL_MSG("malloc error"); + goto cleanup; + } + localBuf = 1; + } + else { + output = *out; + } + + if ((len = wc_PKCS7_EncodeSignedData(p7, output, (word32)len)) < 0) { + WOLFSSL_MSG("wc_PKCS7_EncodeSignedData error"); + goto cleanup; + } + + ret = len; +cleanup: + if (p7->rng == &rng) { + wc_FreeRng(&rng); + p7->rng = NULL; + } + if (ret == WOLFSSL_FAILURE && localBuf && output) + XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (ret != WOLFSSL_FAILURE) + *out = output; + return ret; +} + +int wolfSSL_i2d_PKCS7_bio(WOLFSSL_BIO *bio, PKCS7 *p7) +{ + byte* output = NULL; + int len; + int ret = WOLFSSL_FAILURE; + WOLFSSL_ENTER("wolfSSL_i2d_PKCS7_bio"); + + if (!bio || !p7) { + WOLFSSL_MSG("Bad parameter"); + return WOLFSSL_FAILURE; + } + + if ((len = wolfSSL_i2d_PKCS7(p7, &output)) == WOLFSSL_FAILURE) { + WOLFSSL_MSG("wolfSSL_i2d_PKCS7 error"); + goto cleanup; + } + + if (wolfSSL_BIO_write(bio, output, len) <= 0) { + WOLFSSL_MSG("wolfSSL_BIO_write error"); + goto cleanup; + } + + ret = WOLFSSL_SUCCESS; +cleanup: + if (output) + XFREE(output, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return ret; +} + +/** + * Creates and returns a PKCS7 signedData structure. + * + * Inner content type is set to DATA to match OpenSSL behavior. + * + * signer - certificate to sign bundle with + * pkey - private key matching signer + * certs - optional additional set of certificates to include + * in - input data to be signed + * flags - optional set of flags to control sign behavior + * + * PKCS7_BINARY - Do not translate input data to MIME canonical + * format (\r\n line endings), thus preventing corruption of + * binary content. + * PKCS7_TEXT - Prepend MIME headers for text/plain to content. + * PKCS7_DETACHED - Set signature detached, omit content from output bundle. + * PKCS7_STREAM - initialize PKCS7 struct for signing, do not read data. + * + * Flags not currently supported: + * PKCS7_NOCERTS - Do not include the signer cert in the output bundle. + * PKCS7_PARTIAL - Allow for PKCS7_sign() to be only partially set up, + * then signers etc to be added separately before + * calling PKCS7_final(). + * + * Returns valid PKCS7 structure pointer, or NULL if an error occurred. + */ +PKCS7* wolfSSL_PKCS7_sign(WOLFSSL_X509* signer, WOLFSSL_EVP_PKEY* pkey, + WOLFSSL_STACK* certs, WOLFSSL_BIO* in, int flags) +{ + int err = 0; + WOLFSSL_PKCS7* p7 = NULL; + WOLFSSL_STACK* cert = certs; + + WOLFSSL_ENTER("wolfSSL_PKCS7_sign"); + + if (flags & PKCS7_NOCERTS) { + WOLFSSL_MSG("PKCS7_NOCERTS flag not yet supported"); + err = 1; + } + + if (flags & PKCS7_PARTIAL) { + WOLFSSL_MSG("PKCS7_PARTIAL flag not yet supported"); + err = 1; + } + + if ((err == 0) && (signer == NULL || signer->derCert == NULL || + signer->derCert->length == 0)) { + WOLFSSL_MSG("Bad function arg, signer is NULL or incomplete"); + err = 1; + } + + if ((err == 0) && (pkey == NULL || pkey->pkey.ptr == NULL || + pkey->pkey_sz <= 0)) { + WOLFSSL_MSG("Bad function arg, pkey is NULL or incomplete"); + err = 1; + } + + if ((err == 0) && (in == NULL) && !(flags & PKCS7_STREAM)) { + WOLFSSL_MSG("input data required unless PKCS7_STREAM used"); + err = 1; + } + + if ((err == 0) && ((p7 = (WOLFSSL_PKCS7*)wolfSSL_PKCS7_new()) == NULL)) { + WOLFSSL_MSG("Error allocating new WOLFSSL_PKCS7"); + err = 1; + } + + /* load signer certificate */ + if (err == 0) { + if (wc_PKCS7_InitWithCert(&p7->pkcs7, signer->derCert->buffer, + signer->derCert->length) != 0) { + WOLFSSL_MSG("Failed to load signer certificate"); + err = 1; + } + } + + /* set signer private key, data types, defaults */ + if (err == 0) { + p7->pkcs7.privateKey = (byte*)pkey->pkey.ptr; + p7->pkcs7.privateKeySz = (word32)pkey->pkey_sz; + p7->pkcs7.contentOID = DATA; /* inner content default is DATA */ + p7->pkcs7.hashOID = SHA256h; /* default to SHA-256 hash type */ + p7->type = SIGNED_DATA; /* PKCS7_final switches on type */ + } + + /* add additional chain certs if provided */ + while (cert && (err == 0)) { + if (cert->data.x509 != NULL && cert->data.x509->derCert != NULL) { + if (wc_PKCS7_AddCertificate(&p7->pkcs7, + cert->data.x509->derCert->buffer, + cert->data.x509->derCert->length) != 0) { + WOLFSSL_MSG("Error in wc_PKCS7_AddCertificate"); + err = 1; + } + } + cert = cert->next; + } + + if ((err == 0) && (flags & PKCS7_DETACHED)) { + if (wc_PKCS7_SetDetached(&p7->pkcs7, 1) != 0) { + WOLFSSL_MSG("Failed to set signature detached"); + err = 1; + } + } + + if ((err == 0) && (flags & PKCS7_STREAM)) { + /* if streaming, return before finalizing */ + return (PKCS7*)p7; + } + + if ((err == 0) && (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1)) { + WOLFSSL_MSG("Error calling wolfSSL_PKCS7_final"); + err = 1; + } + + if ((err != 0) && (p7 != NULL)) { + wolfSSL_PKCS7_free((PKCS7*)p7); + p7 = NULL; + } + + return (PKCS7*)p7; +} + +#ifdef HAVE_SMIME + +#ifndef MAX_MIME_LINE_LEN + #define MAX_MIME_LINE_LEN 1024 +#endif + +/** + * Copy input BIO to output BIO, but convert all line endings to CRLF (\r\n), + * used by PKCS7_final(). + * + * in - input WOLFSSL_BIO to be converted + * out - output WOLFSSL_BIO to hold copy of in, with line endings adjusted + * + * Return 0 on success, negative on error + */ +static int wolfSSL_BIO_to_MIME_crlf(WOLFSSL_BIO* in, WOLFSSL_BIO* out) +{ + int ret = 0; + int lineLen = 0; + word32 canonLineLen = 0; + char* canonLine = NULL; +#ifdef WOLFSSL_SMALL_STACK + char* line = NULL; +#else + char line[MAX_MIME_LINE_LEN]; +#endif + + if (in == NULL || out == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + line = (char*)XMALLOC(MAX_MIME_LINE_LEN, in->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (line == NULL) { + return MEMORY_E; + } +#endif + XMEMSET(line, 0, MAX_MIME_LINE_LEN); + + while ((lineLen = wolfSSL_BIO_gets(in, line, MAX_MIME_LINE_LEN)) > 0) { + + if (line[lineLen - 1] == '\r' || line[lineLen - 1] == '\n') { + canonLineLen = (word32)lineLen; + if ((canonLine = wc_MIME_single_canonicalize( + line, &canonLineLen)) == NULL) { + ret = -1; + break; + } + + /* remove trailing null */ + if (canonLineLen >= 1 && canonLine[canonLineLen-1] == '\0') { + canonLineLen--; + } + + if (wolfSSL_BIO_write(out, canonLine, (int)canonLineLen) < 0) { + ret = -1; + break; + } + XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7); + canonLine = NULL; + } + else { + /* no line ending in current line, write direct to out */ + if (wolfSSL_BIO_write(out, line, lineLen) < 0) { + ret = -1; + break; + } + } + } + + if (canonLine != NULL) { + XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7); + } +#ifdef WOLFSSL_SMALL_STACK + XFREE(line, in->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +#endif /* HAVE_SMIME */ + +/* Used by both PKCS7_final() and PKCS7_verify() */ +static const char contTypeText[] = "Content-Type: text/plain\r\n\r\n"; + +/** + * Finalize PKCS7 structure, currently supports signedData only. + * + * Does not generate final bundle (ie: signedData), but finalizes + * the PKCS7 structure in preparation for a output function to be called next. + * + * pkcs7 - initialized PKCS7 structure, populated with signer, etc + * in - input data + * flags - flags to control PKCS7 behavior. Other flags except those noted + * below are ignored: + * + * PKCS7_BINARY - Do not translate input data to MIME canonical + * format (\r\n line endings), thus preventing corruption of + * binary content. + * PKCS7_TEXT - Prepend MIME headers for text/plain to content. + * + * Returns 1 on success, 0 on error + */ +int wolfSSL_PKCS7_final(PKCS7* pkcs7, WOLFSSL_BIO* in, int flags) +{ + int ret = 1; + int memSz = 0; + unsigned char* mem = NULL; + WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; + WOLFSSL_BIO* data = NULL; + + WOLFSSL_ENTER("wolfSSL_PKCS7_final"); + + if (p7 == NULL || in == NULL) { + WOLFSSL_MSG("Bad input args to PKCS7_final"); + ret = 0; + } + + if (ret == 1) { + if ((data = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())) == NULL) { + WOLFSSL_MSG("Error in wolfSSL_BIO_new"); + ret = 0; + } + } + + /* prepend Content-Type header if PKCS7_TEXT */ + if ((ret == 1) && (flags & PKCS7_TEXT)) { + if (wolfSSL_BIO_write(data, contTypeText, + (int)XSTR_SIZEOF(contTypeText)) < 0) { + WOLFSSL_MSG("Error prepending Content-Type header"); + ret = 0; + } + } + + /* convert line endings to CRLF if !PKCS7_BINARY */ + if (ret == 1) { + if (flags & PKCS7_BINARY) { + + /* no CRLF conversion, direct copy content */ + if ((memSz = wolfSSL_BIO_get_len(in)) <= 0) { + ret = 0; + } + if (ret == 1) { + mem = (unsigned char*)XMALLOC(memSz, in->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (mem == NULL) { + WOLFSSL_MSG("Failed to allocate memory for input data"); + ret = 0; + } + } + + if (ret == 1) { + if (wolfSSL_BIO_read(in, mem, memSz) != memSz) { + WOLFSSL_MSG("Error reading from input BIO"); + ret = 0; + } + else if (wolfSSL_BIO_write(data, mem, memSz) < 0) { + ret = 0; + } + } + + if (mem != NULL) { + XFREE(mem, in->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + } + else { + #ifdef HAVE_SMIME + /* convert content line endings to CRLF */ + if (wolfSSL_BIO_to_MIME_crlf(in, data) != 0) { + WOLFSSL_MSG("Error converting line endings to CRLF"); + ret = 0; + } + else { + p7->pkcs7.contentCRLF = 1; + } + #else + WOLFSSL_MSG("Without PKCS7_BINARY requires wolfSSL to be built " + "with HAVE_SMIME"); + ret = 0; + #endif + } + } + + if ((ret == 1) && ((memSz = wolfSSL_BIO_get_mem_data(data, &mem)) < 0)) { + WOLFSSL_MSG("Error in wolfSSL_BIO_get_mem_data"); + ret = 0; + } + + if (ret == 1) { + if (p7->data != NULL) { + XFREE(p7->data, NULL, DYNAMIC_TYPE_PKCS7); + } + p7->data = (byte*)XMALLOC(memSz, NULL, DYNAMIC_TYPE_PKCS7); + if (p7->data == NULL) { + ret = 0; + } + else { + XMEMCPY(p7->data, mem, memSz); + p7->len = memSz; + } + } + + if (ret == 1) { + p7->pkcs7.content = p7->data; + p7->pkcs7.contentSz = (word32)p7->len; + } + + if (data != NULL) { + wolfSSL_BIO_free(data); + } + + return ret; +} + +int wolfSSL_PKCS7_verify(PKCS7* pkcs7, WOLFSSL_STACK* certs, + WOLFSSL_X509_STORE* store, WOLFSSL_BIO* in, WOLFSSL_BIO* out, int flags) +{ + int i, ret = 0; + unsigned char* mem = NULL; + int memSz = 0; + WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; + int contTypeLen; + WOLFSSL_X509* signer = NULL; + WOLFSSL_STACK* signers = NULL; + + WOLFSSL_ENTER("wolfSSL_PKCS7_verify"); + + if (pkcs7 == NULL) + return WOLFSSL_FAILURE; + + if (in != NULL) { + if ((memSz = wolfSSL_BIO_get_mem_data(in, &mem)) < 0) + return WOLFSSL_FAILURE; + + p7->pkcs7.content = mem; + p7->pkcs7.contentSz = (word32)memSz; + } + + /* certs is the list of certificates to find the cert with issuer/serial. */ + (void)certs; + /* store is the certificate store to use to verify signer certificate + * associated with the signers. + */ + (void)store; + + ret = wc_PKCS7_VerifySignedData(&p7->pkcs7, p7->data, p7->len); + if (ret != 0) + return WOLFSSL_FAILURE; + + if ((flags & PKCS7_NOVERIFY) != PKCS7_NOVERIFY) { + /* Verify signer certificates */ + if (store == NULL || store->cm == NULL) { + WOLFSSL_MSG("No store or store certs, but PKCS7_NOVERIFY not set"); + return WOLFSSL_FAILURE; + } + + signers = wolfSSL_PKCS7_get0_signers(pkcs7, certs, flags); + if (signers == NULL) { + WOLFSSL_MSG("No signers found to verify"); + return WOLFSSL_FAILURE; + } + for (i = 0; i < wolfSSL_sk_X509_num(signers); i++) { + signer = wolfSSL_sk_X509_value(signers, i); + + if (wolfSSL_CertManagerVerifyBuffer(store->cm, + signer->derCert->buffer, + signer->derCert->length, + WOLFSSL_FILETYPE_ASN1) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Failed to verify signer certificate"); + wolfSSL_sk_X509_pop_free(signers, NULL); + return WOLFSSL_FAILURE; + } + } + wolfSSL_sk_X509_pop_free(signers, NULL); + } + + if (flags & PKCS7_TEXT) { + /* strip MIME header for text/plain, otherwise error */ + contTypeLen = XSTR_SIZEOF(contTypeText); + if ((p7->pkcs7.contentSz < (word32)contTypeLen) || + (XMEMCMP(p7->pkcs7.content, contTypeText, contTypeLen) != 0)) { + WOLFSSL_MSG("Error PKCS7 Content-Type not found with PKCS7_TEXT"); + return WOLFSSL_FAILURE; + } + p7->pkcs7.content += contTypeLen; + p7->pkcs7.contentSz -= contTypeLen; + } + + if (out != NULL) { + wolfSSL_BIO_write(out, p7->pkcs7.content, p7->pkcs7.contentSz); + } + + WOLFSSL_LEAVE("wolfSSL_PKCS7_verify", WOLFSSL_SUCCESS); + + return WOLFSSL_SUCCESS; +} + +/** + * This API was added as a helper function for libest. It + * encodes a stack of certificates to pkcs7 format. + * @param pkcs7 PKCS7 parameter object + * @param certs WOLFSSL_STACK_OF(WOLFSSL_X509)* + * @param out Output bio + * @return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure + */ +int wolfSSL_PKCS7_encode_certs(PKCS7* pkcs7, WOLFSSL_STACK* certs, + WOLFSSL_BIO* out) +{ + int ret; + WOLFSSL_PKCS7* p7; + WOLFSSL_ENTER("wolfSSL_PKCS7_encode_certs"); + + if (!pkcs7 || !certs || !out) { + WOLFSSL_MSG("Bad parameter"); + return WOLFSSL_FAILURE; + } + + p7 = (WOLFSSL_PKCS7*)pkcs7; + + /* take ownership of certs */ + p7->certs = certs; + /* TODO: takes ownership even on failure below but not on above failure. */ + + if (pkcs7->certList) { + WOLFSSL_MSG("wolfSSL_PKCS7_encode_certs called multiple times on same " + "struct"); + return WOLFSSL_FAILURE; + } + + if (certs) { + /* Save some of the values */ + int hashOID = pkcs7->hashOID; + byte version = pkcs7->version; + + if (!certs->data.x509 || !certs->data.x509->derCert) { + WOLFSSL_MSG("Missing cert"); + return WOLFSSL_FAILURE; + } + + if (wc_PKCS7_InitWithCert(pkcs7, certs->data.x509->derCert->buffer, + certs->data.x509->derCert->length) != 0) { + WOLFSSL_MSG("wc_PKCS7_InitWithCert error"); + return WOLFSSL_FAILURE; + } + certs = certs->next; + + pkcs7->hashOID = hashOID; + pkcs7->version = version; + } + + /* Add the certs to the PKCS7 struct */ + while (certs) { + if (!certs->data.x509 || !certs->data.x509->derCert) { + WOLFSSL_MSG("Missing cert"); + return WOLFSSL_FAILURE; + } + if (wc_PKCS7_AddCertificate(pkcs7, certs->data.x509->derCert->buffer, + certs->data.x509->derCert->length) != 0) { + WOLFSSL_MSG("wc_PKCS7_AddCertificate error"); + return WOLFSSL_FAILURE; + } + certs = certs->next; + } + + if (wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID) != 0) { + WOLFSSL_MSG("wc_PKCS7_SetSignerIdentifierType error"); + return WOLFSSL_FAILURE; + } + + ret = wolfSSL_i2d_PKCS7_bio(out, pkcs7); + + return ret; +} + +/****************************************************************************** +* wolfSSL_PEM_write_bio_PKCS7 - writes the PKCS7 data to BIO +* +* RETURNS: +* returns WOLFSSL_SUCCESS on success, otherwise returns WOLFSSL_FAILURE +*/ +int wolfSSL_PEM_write_bio_PKCS7(WOLFSSL_BIO* bio, PKCS7* p7) +{ +#ifdef WOLFSSL_SMALL_STACK + byte* outputHead; + byte* outputFoot; +#else + byte outputHead[2048]; + byte outputFoot[2048]; +#endif + word32 outputHeadSz = 2048; + word32 outputFootSz = 2048; + word32 outputSz = 0; + byte* output = NULL; + byte* pem = NULL; + int pemSz = -1; + enum wc_HashType hashType; + byte hashBuf[WC_MAX_DIGEST_SIZE]; + word32 hashSz = -1; + + WOLFSSL_ENTER("wolfSSL_PEM_write_bio_PKCS7"); + + if (bio == NULL || p7 == NULL) + return WOLFSSL_FAILURE; + +#ifdef WOLFSSL_SMALL_STACK + outputHead = (byte*)XMALLOC(outputHeadSz, bio->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (outputHead == NULL) + return MEMORY_E; + + outputFoot = (byte*)XMALLOC(outputFootSz, bio->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (outputFoot == NULL) + goto error; + +#endif + + XMEMSET(hashBuf, 0, WC_MAX_DIGEST_SIZE); + XMEMSET(outputHead, 0, outputHeadSz); + XMEMSET(outputFoot, 0, outputFootSz); + + hashType = wc_OidGetHash(p7->hashOID); + hashSz = (word32)wc_HashGetDigestSize(hashType); + if (hashSz > WC_MAX_DIGEST_SIZE) + goto error; + + /* only SIGNED_DATA is supported */ + switch (p7->contentOID) { + case SIGNED_DATA: + break; + default: + WOLFSSL_MSG("Unknown PKCS#7 Type"); + goto error; + }; + + if ((wc_PKCS7_EncodeSignedData_ex(p7, hashBuf, hashSz, + outputHead, &outputHeadSz, outputFoot, &outputFootSz)) != 0) + goto error; + + outputSz = outputHeadSz + p7->contentSz + outputFootSz; + output = (byte*)XMALLOC(outputSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + + if (!output) + goto error; + + XMEMSET(output, 0, outputSz); + outputSz = 0; + XMEMCPY(&output[outputSz], outputHead, outputHeadSz); + outputSz += outputHeadSz; + XMEMCPY(&output[outputSz], p7->content, p7->contentSz); + outputSz += p7->contentSz; + XMEMCPY(&output[outputSz], outputFoot, outputFootSz); + outputSz += outputFootSz; + + /* get PEM size */ + pemSz = wc_DerToPemEx(output, outputSz, NULL, 0, NULL, CERT_TYPE); + if (pemSz < 0) + goto error; + + pemSz++; /* for '\0'*/ + + /* create PEM buffer and convert from DER to PEM*/ + if ((pem = (byte*)XMALLOC(pemSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER)) + == NULL) + goto error; + + XMEMSET(pem, 0, pemSz); + + if (wc_DerToPemEx(output, outputSz, pem, (word32)pemSz, NULL, CERT_TYPE) < 0) { + goto error; + } + if ((wolfSSL_BIO_write(bio, pem, pemSz) == pemSz)) { + XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); +#ifdef WOLFSSL_SMALL_STACK + XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return WOLFSSL_SUCCESS; + } + +error: +#ifdef WOLFSSL_SMALL_STACK + if (outputHead) { + XFREE(outputHead, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + if (outputFoot) { + XFREE(outputFoot, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + } +#endif + if (output) { + XFREE(output, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + if (pem) { + XFREE(pem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + return WOLFSSL_FAILURE; +} + +#ifdef HAVE_SMIME +/***************************************************************************** +* wolfSSL_SMIME_read_PKCS7 - Reads the given S/MIME message and parses it into +* a PKCS7 object. In case of a multipart message, stores the signed data in +* bcont. +* +* RETURNS: +* returns pointer to a PKCS7 structure on success, otherwise returns NULL +*/ +PKCS7* wolfSSL_SMIME_read_PKCS7(WOLFSSL_BIO* in, + WOLFSSL_BIO** bcont) +{ + MimeHdr* allHdrs = NULL; + MimeHdr* curHdr = NULL; + MimeParam* curParam = NULL; + int inLen = 0; + byte* bcontMem = NULL; + int bcontMemSz = 0; + int sectionLen = 0; + int ret = -1; + char* section = NULL; + char* canonLine = NULL; + char* canonSection = NULL; + PKCS7* pkcs7 = NULL; + word32 outLen = 0; + word32 canonLineLen = 0; + byte* out = NULL; + byte* outHead = NULL; + + int canonPos = 0; + int lineLen = 0; + int remainLen = 0; + byte isEnd = 0; + size_t canonSize = 0; + size_t boundLen = 0; + char* boundary = NULL; + + static const char kContType[] = "Content-Type"; + static const char kCTE[] = "Content-Transfer-Encoding"; + static const char kMultSigned[] = "multipart/signed"; + static const char kAppPkcsSign[] = "application/pkcs7-signature"; + static const char kAppXPkcsSign[] = "application/x-pkcs7-signature"; + static const char kAppPkcs7Mime[] = "application/pkcs7-mime"; + static const char kAppXPkcs7Mime[] = "application/x-pkcs7-mime"; + + WOLFSSL_ENTER("wolfSSL_SMIME_read_PKCS7"); + + if (in == NULL || bcont == NULL) { + goto error; + } + inLen = wolfSSL_BIO_get_len(in); + if (inLen <= 0) { + goto error; + } + remainLen = wolfSSL_BIO_get_len(in); + if (remainLen <= 0) { + goto error; + } + + section = (char*)XMALLOC(remainLen+1, NULL, DYNAMIC_TYPE_PKCS7); + if (section == NULL) { + goto error; + } + lineLen = wolfSSL_BIO_gets(in, section, remainLen); + if (lineLen <= 0) { + goto error; + } + while (isEnd == 0 && remainLen > 0) { + sectionLen += lineLen; + remainLen -= lineLen; + lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], remainLen); + if (lineLen <= 0) { + goto error; + } + /* Line with just newline signals end of headers. */ + if ((lineLen==2 && !XSTRNCMP(§ion[sectionLen], + "\r\n", 2)) || + (lineLen==1 && (section[sectionLen] == '\r' || + section[sectionLen] == '\n'))) { + isEnd = 1; + } + } + section[sectionLen] = '\0'; + ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs); + if (ret < 0) { + WOLFSSL_MSG("Parsing MIME headers failed."); + goto error; + } + isEnd = 0; + section[0] = '\0'; + sectionLen = 0; + + curHdr = wc_MIME_find_header_name(kContType, allHdrs); + if (curHdr && !XSTRNCMP(curHdr->body, kMultSigned, + XSTR_SIZEOF(kMultSigned))) { + curParam = wc_MIME_find_param_attr("protocol", curHdr->params); + if (curParam && (!XSTRNCMP(curParam->value, kAppPkcsSign, + XSTR_SIZEOF(kAppPkcsSign)) || + !XSTRNCMP(curParam->value, kAppXPkcsSign, + XSTR_SIZEOF(kAppXPkcsSign)))) { + curParam = wc_MIME_find_param_attr("boundary", curHdr->params); + if (curParam == NULL) { + goto error; + } + + boundLen = XSTRLEN(curParam->value) + 2; + boundary = (char*)XMALLOC(boundLen+1, NULL, DYNAMIC_TYPE_PKCS7); + if (boundary == NULL) { + goto error; + } + XMEMSET(boundary, 0, (word32)(boundLen+1)); + boundary[0] = boundary[1] = '-'; + XSTRNCPY(&boundary[2], curParam->value, boundLen-2); + + /* Parse up to first boundary, ignore everything here. */ + lineLen = wolfSSL_BIO_gets(in, section, remainLen); + if (lineLen <= 0) { + goto error; + } + while (XSTRNCMP(§ion[sectionLen], boundary, boundLen) && + remainLen > 0) { + sectionLen += lineLen; + remainLen -= lineLen; + lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], + remainLen); + if (lineLen <= 0) { + goto error; + } + } + + section[0] = '\0'; + sectionLen = 0; + canonSize = (size_t)remainLen + 1; + canonSection = (char*)XMALLOC(canonSize, NULL, + DYNAMIC_TYPE_PKCS7); + if (canonSection == NULL) { + goto error; + } + + lineLen = wolfSSL_BIO_gets(in, section, remainLen); + if (lineLen < 0) { + goto error; + } + while (XSTRNCMP(§ion[sectionLen], boundary, boundLen) && + remainLen > 0) { + canonLineLen = (word32)lineLen; + canonLine = wc_MIME_single_canonicalize(§ion[sectionLen], + &canonLineLen); + if (canonLine == NULL) { + goto error; + } + /* If line endings were added, the initial length may be + * exceeded. */ + if ((canonPos + canonLineLen) >= canonSize) { + canonSize = canonPos + canonLineLen; + canonSection = (char*)XREALLOC(canonSection, canonSize, + NULL, DYNAMIC_TYPE_PKCS7); + if (canonSection == NULL) { + goto error; + } + } + XMEMCPY(&canonSection[canonPos], canonLine, + (int)canonLineLen - 1); + canonPos += canonLineLen - 1; + XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7); + canonLine = NULL; + + sectionLen += lineLen; + remainLen -= lineLen; + + lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], + remainLen); + if (lineLen <= 0) { + goto error; + } + } + + if (canonPos > 0) { + canonPos--; + } + + /* Strip the final trailing newline. Support \r, \n or \r\n. */ + if (canonSection[canonPos] == '\n') { + if (canonPos > 0) { + canonPos--; + } + } + + if (canonSection[canonPos] == '\r') { + if (canonPos > 0) { + canonPos--; + } + } + + canonSection[canonPos+1] = '\0'; + + *bcont = wolfSSL_BIO_new(wolfSSL_BIO_s_mem()); + ret = wolfSSL_BIO_write(*bcont, canonSection, + canonPos + 1); + if (ret != (canonPos+1)) { + goto error; + } + if ((bcontMemSz = wolfSSL_BIO_get_mem_data(*bcont, &bcontMem)) + < 0) { + goto error; + } + XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7); + canonSection = NULL; + + wc_MIME_free_hdrs(allHdrs); + allHdrs = NULL; + section[0] = '\0'; + sectionLen = 0; + lineLen = wolfSSL_BIO_gets(in, section, remainLen); + if (lineLen <= 0) { + goto error; + } + while (isEnd == 0 && remainLen > 0) { + sectionLen += lineLen; + remainLen -= lineLen; + lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], + remainLen); + if (lineLen <= 0) { + goto error; + } + /* Line with just newline signals end of headers. */ + if ((lineLen==2 && !XSTRNCMP(§ion[sectionLen], + "\r\n", 2)) || + (lineLen==1 && (section[sectionLen] == '\r' || + section[sectionLen] == '\n'))) { + isEnd = 1; + } + } + section[sectionLen] = '\0'; + ret = wc_MIME_parse_headers(section, sectionLen, &allHdrs); + if (ret < 0) { + WOLFSSL_MSG("Parsing MIME headers failed."); + goto error; + } + curHdr = wc_MIME_find_header_name(kContType, allHdrs); + if (curHdr == NULL || (XSTRNCMP(curHdr->body, kAppPkcsSign, + XSTR_SIZEOF(kAppPkcsSign)) && + XSTRNCMP(curHdr->body, kAppXPkcsSign, + XSTR_SIZEOF(kAppXPkcsSign)))) { + WOLFSSL_MSG("S/MIME headers not found inside " + "multipart message.\n"); + goto error; + } + + section[0] = '\0'; + sectionLen = 0; + lineLen = wolfSSL_BIO_gets(in, section, remainLen); + while (XSTRNCMP(§ion[sectionLen], boundary, boundLen) && + remainLen > 0) { + sectionLen += lineLen; + remainLen -= lineLen; + lineLen = wolfSSL_BIO_gets(in, §ion[sectionLen], + remainLen); + if (lineLen <= 0) { + goto error; + } + } + + XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7); + boundary = NULL; + } + } + else if (curHdr && (!XSTRNCMP(curHdr->body, kAppPkcs7Mime, + XSTR_SIZEOF(kAppPkcs7Mime)) || + !XSTRNCMP(curHdr->body, kAppXPkcs7Mime, + XSTR_SIZEOF(kAppXPkcs7Mime)))) { + sectionLen = wolfSSL_BIO_get_len(in); + if (sectionLen <= 0) { + goto error; + } + ret = wolfSSL_BIO_read(in, section, sectionLen); + if (ret < 0 || ret != sectionLen) { + WOLFSSL_MSG("Error reading input BIO."); + goto error; + } + } + else { + WOLFSSL_MSG("S/MIME headers not found."); + goto error; + } + + curHdr = wc_MIME_find_header_name(kCTE, allHdrs); + if (curHdr == NULL) { + WOLFSSL_MSG("Content-Transfer-Encoding header not found, " + "assuming base64 encoding."); + } + else if (XSTRNCMP(curHdr->body, "base64", XSTRLEN("base64"))) { + WOLFSSL_MSG("S/MIME encodings other than base64 are not " + "currently supported.\n"); + goto error; + } + + if (section == NULL || sectionLen <= 0) { + goto error; + } + outLen = (word32)((sectionLen*3+3)/4)+1; + out = (byte*)XMALLOC(outLen*sizeof(byte), NULL, DYNAMIC_TYPE_PKCS7); + outHead = out; + if (outHead == NULL) { + goto error; + } + /* Strip trailing newlines. */ + while ((sectionLen > 0) && + (section[sectionLen-1] == '\r' || section[sectionLen-1] == '\n')) { + sectionLen--; + } + section[sectionLen] = '\0'; + ret = Base64_Decode((const byte*)section, (word32)sectionLen, out, &outLen); + if (ret < 0) { + WOLFSSL_MSG("Error base64 decoding S/MIME message."); + goto error; + } + pkcs7 = wolfSSL_d2i_PKCS7_only(NULL, (const unsigned char**)&out, (int)outLen, + bcontMem, (word32)bcontMemSz); + + wc_MIME_free_hdrs(allHdrs); + XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7); + XFREE(section, NULL, DYNAMIC_TYPE_PKCS7); + + return pkcs7; + +error: + wc_MIME_free_hdrs(allHdrs); + XFREE(boundary, NULL, DYNAMIC_TYPE_PKCS7); + XFREE(outHead, NULL, DYNAMIC_TYPE_PKCS7); + XFREE(section, NULL, DYNAMIC_TYPE_PKCS7); + if (canonSection != NULL) + XFREE(canonSection, NULL, DYNAMIC_TYPE_PKCS7); + if (canonLine != NULL) + XFREE(canonLine, NULL, DYNAMIC_TYPE_PKCS7); + if (bcont) { + wolfSSL_BIO_free(*bcont); + *bcont = NULL; /* reset 'bcount' pointer to NULL on failure */ + } + + return NULL; +} + +/* Convert hash algo OID (from Hash_Sum in asn.h) to SMIME string equivalent. + * Returns hash algorithm string or "unknown" if not found */ +static const char* wolfSSL_SMIME_HashOIDToString(int hashOID) +{ + switch (hashOID) { + case MD5h: + return "md5"; + case SHAh: + return "sha1"; + case SHA224h: + return "sha-224"; + case SHA256h: + return "sha-256"; + case SHA384h: + return "sha-384"; + case SHA512h: + return "sha-512"; + case SHA3_224h: + return "sha3-224"; + case SHA3_384h: + return "sha3-384"; + case SHA3_512h: + return "sha3-512"; + default: + break; + } + + return "unknown"; +} + +/* Convert PKCS#7 type (from PKCS7_TYPES in pkcs7.h) to SMIME string. + * RFC2633 only defines signed-data, enveloped-data, certs-only. + * Returns string on success, NULL on unknown type. */ +static const char* wolfSSL_SMIME_PKCS7TypeToString(int type) +{ + switch (type) { + case SIGNED_DATA: + return "signed-data"; + case ENVELOPED_DATA: + return "enveloped-data"; + default: + break; + } + + return NULL; +} + +/** + * Convert PKCS7 structure to SMIME format, adding necessary headers. + * + * Handles generation of PKCS7 bundle (ie: signedData). PKCS7 structure + * should be set up beforehand with PKCS7_sign/final/etc. Output is always + * Base64 encoded. + * + * out - output BIO for SMIME formatted data to be placed + * pkcs7 - input PKCS7 structure, initialized and set up + * in - input content to be encoded into PKCS7 + * flags - flags to control behavior of PKCS7 generation + * + * Returns 1 on success, 0 or negative on failure + */ +int wolfSSL_SMIME_write_PKCS7(WOLFSSL_BIO* out, PKCS7* pkcs7, WOLFSSL_BIO* in, + int flags) +{ + int i; + int ret = 1; + WOLFSSL_PKCS7* p7 = (WOLFSSL_PKCS7*)pkcs7; + byte* p7out = NULL; + int len = 0; + + char boundary[33]; /* 32 chars + \0 */ + byte* sigBase64 = NULL; + word32 sigBase64Len = 0; + const char* p7TypeString = NULL; + + static const char alphanum[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + if (out == NULL || p7 == NULL) { + WOLFSSL_MSG("Bad function arguments"); + return 0; + } + + if (in != NULL && (p7->pkcs7.content == NULL || p7->pkcs7.contentSz == 0 || + p7->pkcs7.contentCRLF == 0)) { + /* store and adjust content line endings for CRLF if needed */ + if (wolfSSL_PKCS7_final((PKCS7*)p7, in, flags) != 1) { + ret = 0; + } + } + + if (ret > 0) { + /* Generate signedData bundle, DER in output (dynamic) */ + if ((len = wolfSSL_i2d_PKCS7((PKCS7*)p7, &p7out)) == WOLFSSL_FAILURE) { + WOLFSSL_MSG("Error in wolfSSL_i2d_PKCS7"); + ret = 0; + } + } + + /* Base64 encode signedData bundle */ + if (ret > 0) { + if (Base64_Encode(p7out, (word32)len, NULL, &sigBase64Len) != + WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { + ret = 0; + } + else { + sigBase64 = (byte*)XMALLOC(sigBase64Len, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (sigBase64 == NULL) { + ret = 0; + } + } + } + + if (ret > 0) { + XMEMSET(sigBase64, 0, sigBase64Len); + if (Base64_Encode(p7out, (word32)len, sigBase64, &sigBase64Len) < 0) { + WOLFSSL_MSG("Error in Base64_Encode of signature"); + ret = 0; + } + } + + /* build up SMIME message */ + if (ret > 0) { + if (flags & PKCS7_DETACHED) { + + /* generate random boundary */ + if (initGlobalRNG == 0 && wolfSSL_RAND_Init() != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("No RNG to use"); + ret = 0; + } + + /* no need to generate random byte for null terminator (size-1) */ + if ((ret > 0) && (wc_RNG_GenerateBlock(&globalRNG, (byte*)boundary, + sizeof(boundary) - 1 ) != 0)) { + WOLFSSL_MSG("Error in wc_RNG_GenerateBlock"); + ret = 0; + } + + if (ret > 0) { + for (i = 0; i < (int)sizeof(boundary) - 1; i++) { + boundary[i] = + alphanum[boundary[i] % XSTR_SIZEOF(alphanum)]; + } + boundary[sizeof(boundary)-1] = 0; + } + + if (ret > 0) { + /* S/MIME header beginning */ + ret = wolfSSL_BIO_printf(out, + "MIME-Version: 1.0\n" + "Content-Type: multipart/signed; " + "protocol=\"application/x-pkcs7-signature\"; " + "micalg=\"%s\"; " + "boundary=\"----%s\"\n\n" + "This is an S/MIME signed message\n\n" + "------%s\n", + wolfSSL_SMIME_HashOIDToString(p7->pkcs7.hashOID), + boundary, boundary); + } + + if (ret > 0) { + /* S/MIME content */ + ret = wolfSSL_BIO_write(out, + p7->pkcs7.content, p7->pkcs7.contentSz); + } + + if (ret > 0) { + /* S/SMIME header end boundary */ + ret = wolfSSL_BIO_printf(out, + "\n------%s\n", boundary); + } + + if (ret > 0) { + /* Signature and header */ + ret = wolfSSL_BIO_printf(out, + "Content-Type: application/x-pkcs7-signature; " + "name=\"smime.p7s\"\n" + "Content-Transfer-Encoding: base64\n" + "Content-Disposition: attachment; " + "filename=\"smime.p7s\"\n\n" + "%.*s\n" /* Base64 encoded signature */ + "------%s--\n\n", + sigBase64Len, sigBase64, + boundary); + } + } + else { + p7TypeString = wolfSSL_SMIME_PKCS7TypeToString(p7->type); + if (p7TypeString == NULL) { + WOLFSSL_MSG("Unsupported PKCS7 SMIME type"); + ret = 0; + } + + if (ret > 0) { + /* not detached */ + ret = wolfSSL_BIO_printf(out, + "MIME-Version: 1.0\n" + "Content-Disposition: attachment; " + "filename=\"smime.p7m\"\n" + "Content-Type: application/x-pkcs7-mime; " + "smime-type=%s; name=\"smime.p7m\"\n" + "Content-Transfer-Encoding: base64\n\n" + "%.*s\n" /* signature */, + p7TypeString, sigBase64Len, sigBase64); + } + } + } + + if (p7out != NULL) { + XFREE(p7out, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + if (sigBase64 != NULL) { + XFREE(sigBase64, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + + if (ret > 0) { + return WOLFSSL_SUCCESS; + } + + return WOLFSSL_FAILURE; +} + +#endif /* HAVE_SMIME */ +#endif /* !NO_BIO */ +#endif /* OPENSSL_ALL */ + +#endif /* HAVE_PKCS7 */ +/******************************************************************************* + * END OF PKCS7 APIs + ******************************************************************************/ + +/******************************************************************************* + * START OF PKCS12 APIs + ******************************************************************************/ +#ifdef OPENSSL_EXTRA + +/* no-op function. Was initially used for adding encryption algorithms available + * for PKCS12 */ +void wolfSSL_PKCS12_PBE_add(void) +{ + WOLFSSL_ENTER("wolfSSL_PKCS12_PBE_add"); +} + +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) +WOLFSSL_X509_PKCS12 *wolfSSL_d2i_PKCS12_fp(XFILE fp, + WOLFSSL_X509_PKCS12 **pkcs12) +{ + WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_fp"); + return (WOLFSSL_X509_PKCS12 *)wolfSSL_d2i_X509_fp_ex(fp, (void **)pkcs12, + PKCS12_TYPE); +} +#endif /* !NO_FILESYSTEM */ + +#endif /* OPENSSL_EXTRA */ + +#if defined(HAVE_PKCS12) + +#ifdef OPENSSL_EXTRA + +#if !defined(NO_ASN) && !defined(NO_PWDBASED) + +#ifndef NO_BIO +WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12) +{ + WC_PKCS12* localPkcs12 = NULL; + unsigned char* mem = NULL; + long memSz; + int ret = -1; + + WOLFSSL_ENTER("wolfSSL_d2i_PKCS12_bio"); + + if (bio == NULL) { + WOLFSSL_MSG("Bad Function Argument bio is NULL"); + return NULL; + } + + memSz = wolfSSL_BIO_get_len(bio); + if (memSz <= 0) { + return NULL; + } + mem = (unsigned char*)XMALLOC(memSz, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (mem == NULL) { + return NULL; + } + + if (mem != NULL) { + localPkcs12 = wc_PKCS12_new_ex(bio->heap); + if (localPkcs12 == NULL) { + WOLFSSL_MSG("Memory error"); + } + } + + if (mem != NULL && localPkcs12 != NULL) { + if (wolfSSL_BIO_read(bio, mem, (int)memSz) == memSz) { + ret = wc_d2i_PKCS12(mem, (word32)memSz, localPkcs12); + if (ret < 0) { + WOLFSSL_MSG("Failed to get PKCS12 sequence"); + } + } + else { + WOLFSSL_MSG("Failed to get data from bio struct"); + } + } + + /* cleanup */ + if (mem != NULL) + XFREE(mem, bio->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (ret < 0 && localPkcs12 != NULL) { + wc_PKCS12_free(localPkcs12); + localPkcs12 = NULL; + } + if (pkcs12 != NULL) + *pkcs12 = localPkcs12; + + return localPkcs12; +} + +/* Converts the PKCS12 to DER format and outputs it into bio. + * + * bio is the structure to hold output DER + * pkcs12 structure to create DER from + * + * return 1 for success or 0 if an error occurs + */ +int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12) +{ + int ret = WOLFSSL_FAILURE; + + WOLFSSL_ENTER("wolfSSL_i2d_PKCS12_bio"); + + if ((bio != NULL) && (pkcs12 != NULL)) { + word32 certSz = 0; + byte *certDer = NULL; + + certSz = (word32)wc_i2d_PKCS12(pkcs12, &certDer, NULL); + if ((certSz > 0) && (certDer != NULL)) { + if (wolfSSL_BIO_write(bio, certDer, (int)certSz) == (int)certSz) { + ret = WOLFSSL_SUCCESS; + } + } + + if (certDer != NULL) { + XFREE(certDer, NULL, DYNAMIC_TYPE_PKCS); + } + } + + return ret; +} +#endif /* !NO_BIO */ + +/* Creates a new WC_PKCS12 structure + * + * pass password to use + * name friendlyName to use + * pkey private key to go into PKCS12 bundle + * cert certificate to go into PKCS12 bundle + * ca extra certificates that can be added to bundle. Can be NULL + * keyNID type of encryption to use on the key (-1 means no encryption) + * certNID type of encryption to use on the certificate + * itt number of iterations with encryption + * macItt number of iterations with mac creation + * keyType flag for signature and/or encryption key + * + * returns a pointer to a new WC_PKCS12 structure on success and NULL on fail + */ +WC_PKCS12* wolfSSL_PKCS12_create(char* pass, char* name, WOLFSSL_EVP_PKEY* pkey, + WOLFSSL_X509* cert, WOLF_STACK_OF(WOLFSSL_X509)* ca, int keyNID, + int certNID, int itt, int macItt, int keyType) +{ + WC_PKCS12* pkcs12; + WC_DerCertList* list = NULL; + word32 passSz; + byte* keyDer = NULL; + word32 keyDerSz; + byte* certDer; + int certDerSz; + + WOLFSSL_ENTER("wolfSSL_PKCS12_create"); + + if (pass == NULL || pkey == NULL || cert == NULL) { + WOLFSSL_LEAVE("wolfSSL_PKCS12_create", BAD_FUNC_ARG); + return NULL; + } + passSz = (word32)XSTRLEN(pass); + + keyDer = (byte*)pkey->pkey.ptr; + keyDerSz = (word32)pkey->pkey_sz; + + certDer = (byte*)wolfSSL_X509_get_der(cert, &certDerSz); + if (certDer == NULL) { + return NULL; + } + + if (ca != NULL) { + unsigned long numCerts = ca->num; + WOLFSSL_STACK* sk = ca; + + while (numCerts > 0 && sk != NULL) { + byte* curDer; + WC_DerCertList* cur; + int curDerSz = 0; + + cur = (WC_DerCertList*)XMALLOC(sizeof(WC_DerCertList), NULL, + DYNAMIC_TYPE_PKCS); + if (cur == NULL) { + wc_FreeCertList(list, NULL); + return NULL; + } + + curDer = (byte*)wolfSSL_X509_get_der(sk->data.x509, &curDerSz); + if (curDer == NULL || curDerSz < 0) { + XFREE(cur, NULL, DYNAMIC_TYPE_PKCS); + wc_FreeCertList(list, NULL); + return NULL; + } + + cur->buffer = (byte*)XMALLOC(curDerSz, NULL, DYNAMIC_TYPE_PKCS); + if (cur->buffer == NULL) { + XFREE(cur, NULL, DYNAMIC_TYPE_PKCS); + wc_FreeCertList(list, NULL); + return NULL; + } + XMEMCPY(cur->buffer, curDer, curDerSz); + cur->bufferSz = (word32)curDerSz; + cur->next = list; + list = cur; + + sk = sk->next; + numCerts--; + } + } + + pkcs12 = wc_PKCS12_create(pass, passSz, name, keyDer, keyDerSz, + certDer, (word32)certDerSz, list, keyNID, certNID, itt, macItt, + keyType, NULL); + + if (ca != NULL) { + wc_FreeCertList(list, NULL); + } + + return pkcs12; +} + + +/* return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure */ +int wolfSSL_PKCS12_parse(WC_PKCS12* pkcs12, const char* psw, + WOLFSSL_EVP_PKEY** pkey, WOLFSSL_X509** cert, + WOLF_STACK_OF(WOLFSSL_X509)** ca) +{ + void* heap = NULL; + int ret; + byte* certData = NULL; + word32 certDataSz; + byte* pk = NULL; + word32 pkSz; + WC_DerCertList* certList = NULL; +#ifdef WOLFSSL_SMALL_STACK + DecodedCert *DeCert; +#else + DecodedCert DeCert[1]; +#endif + + WOLFSSL_ENTER("wolfSSL_PKCS12_parse"); + + /* make sure we init return args */ + if (pkey) *pkey = NULL; + if (cert) *cert = NULL; + if (ca) *ca = NULL; + + if (pkcs12 == NULL || psw == NULL || pkey == NULL || cert == NULL) { + WOLFSSL_MSG("Bad argument value"); + return WOLFSSL_FAILURE; + } + + heap = wc_PKCS12_GetHeap(pkcs12); + + if (ca == NULL) { + ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz, + NULL); + } + else { + ret = wc_PKCS12_parse(pkcs12, psw, &pk, &pkSz, &certData, &certDataSz, + &certList); + } + if (ret < 0) { + WOLFSSL_LEAVE("wolfSSL_PKCS12_parse", ret); + return WOLFSSL_FAILURE; + } + +#ifdef WOLFSSL_SMALL_STACK + DeCert = (DecodedCert *)XMALLOC(sizeof(*DeCert), heap, + DYNAMIC_TYPE_DCERT); + if (DeCert == NULL) { + WOLFSSL_MSG("out of memory"); + return WOLFSSL_FAILURE; + } +#endif + + /* Decode cert and place in X509 stack struct */ + if (certList != NULL) { + WC_DerCertList* current = certList; + + *ca = (WOLF_STACK_OF(WOLFSSL_X509)*)XMALLOC( + sizeof(WOLF_STACK_OF(WOLFSSL_X509)), heap, DYNAMIC_TYPE_X509); + if (*ca == NULL) { + if (pk != NULL) { + XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + if (certData != NULL) { + XFREE(certData, heap, DYNAMIC_TYPE_PKCS); + } + /* Free up WC_DerCertList and move on */ + while (current != NULL) { + WC_DerCertList* next = current->next; + + XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS); + XFREE(current, heap, DYNAMIC_TYPE_PKCS); + current = next; + } + ret = WOLFSSL_FAILURE; + goto out; + } + XMEMSET(*ca, 0, sizeof(WOLF_STACK_OF(WOLFSSL_X509))); + + /* add list of DER certs as X509's to stack */ + while (current != NULL) { + WC_DerCertList* toFree = current; + WOLFSSL_X509* x509; + + x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap, + DYNAMIC_TYPE_X509); + InitX509(x509, 1, heap); + InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap); + if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL, NULL) != 0) { + WOLFSSL_MSG("Issue with parsing certificate"); + FreeDecodedCert(DeCert); + wolfSSL_X509_free(x509); + } + else { + if (CopyDecodedToX509(x509, DeCert) != 0) { + WOLFSSL_MSG("Failed to copy decoded cert"); + FreeDecodedCert(DeCert); + wolfSSL_X509_free(x509); + wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; + if (pk != NULL) { + XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + if (certData != NULL) { + XFREE(certData, heap, DYNAMIC_TYPE_PKCS); + } + /* Free up WC_DerCertList */ + while (current != NULL) { + WC_DerCertList* next = current->next; + + XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS); + XFREE(current, heap, DYNAMIC_TYPE_PKCS); + current = next; + } + ret = WOLFSSL_FAILURE; + goto out; + } + FreeDecodedCert(DeCert); + + if (wolfSSL_sk_X509_push(*ca, x509) != 1) { + WOLFSSL_MSG("Failed to push x509 onto stack"); + wolfSSL_X509_free(x509); + wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; + if (pk != NULL) { + XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + if (certData != NULL) { + XFREE(certData, heap, DYNAMIC_TYPE_PKCS); + } + + /* Free up WC_DerCertList */ + while (current != NULL) { + WC_DerCertList* next = current->next; + + XFREE(current->buffer, heap, DYNAMIC_TYPE_PKCS); + XFREE(current, heap, DYNAMIC_TYPE_PKCS); + current = next; + } + ret = WOLFSSL_FAILURE; + goto out; + } + } + current = current->next; + XFREE(toFree->buffer, heap, DYNAMIC_TYPE_PKCS); + XFREE(toFree, heap, DYNAMIC_TYPE_PKCS); + } + } + + + /* Decode cert and place in X509 struct */ + if (certData != NULL) { + *cert = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap, + DYNAMIC_TYPE_X509); + if (*cert == NULL) { + if (pk != NULL) { + XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + if (ca != NULL) { + wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; + } + XFREE(certData, heap, DYNAMIC_TYPE_PKCS); + ret = WOLFSSL_FAILURE; + goto out; + } + InitX509(*cert, 1, heap); + InitDecodedCert(DeCert, certData, certDataSz, heap); + if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL, NULL) != 0) { + WOLFSSL_MSG("Issue with parsing certificate"); + } + if (CopyDecodedToX509(*cert, DeCert) != 0) { + WOLFSSL_MSG("Failed to copy decoded cert"); + FreeDecodedCert(DeCert); + if (pk != NULL) { + XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); + } + if (ca != NULL) { + wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; + } + wolfSSL_X509_free(*cert); *cert = NULL; + XFREE(certData, heap, DYNAMIC_TYPE_PKCS); + ret = WOLFSSL_FAILURE; + goto out; + } + FreeDecodedCert(DeCert); + XFREE(certData, heap, DYNAMIC_TYPE_PKCS); + } + + + /* get key type */ + ret = BAD_STATE_E; + if (pk != NULL) { /* decode key if present */ + *pkey = wolfSSL_EVP_PKEY_new_ex(heap); + if (*pkey == NULL) { + wolfSSL_X509_free(*cert); *cert = NULL; + if (ca != NULL) { + wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; + } + XFREE(pk, heap, DYNAMIC_TYPE_PUBLIC_KEY); + ret = WOLFSSL_FAILURE; + goto out; + } + + #ifndef NO_RSA + { + const unsigned char* pt = pk; + if (wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, pkey, &pt, pkSz) != + NULL) { + ret = 0; + } + } + #endif /* NO_RSA */ + + #ifdef HAVE_ECC + if (ret != 0) { /* if is in fail state check if ECC key */ + const unsigned char* pt = pk; + if (wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, pkey, &pt, pkSz) != + NULL) { + ret = 0; + } + } + #endif /* HAVE_ECC */ + if (pk != NULL) + XFREE(pk, heap, DYNAMIC_TYPE_PKCS); + if (ret != 0) { /* if is in fail state and no PKEY then fail */ + wolfSSL_X509_free(*cert); *cert = NULL; + if (ca != NULL) { + wolfSSL_sk_X509_pop_free(*ca, NULL); *ca = NULL; + } + wolfSSL_EVP_PKEY_free(*pkey); *pkey = NULL; + WOLFSSL_MSG("Bad PKCS12 key format"); + ret = WOLFSSL_FAILURE; + goto out; + } + + if (pkey != NULL && *pkey != NULL) { + (*pkey)->save_type = 0; + } + } + + (void)ret; + (void)ca; + + ret = WOLFSSL_SUCCESS; + +out: + +#ifdef WOLFSSL_SMALL_STACK + XFREE(DeCert, heap, DYNAMIC_TYPE_DCERT); +#endif + + return ret; +} + +int wolfSSL_PKCS12_verify_mac(WC_PKCS12 *pkcs12, const char *psw, + int pswLen) +{ + WOLFSSL_ENTER("wolfSSL_PKCS12_verify_mac"); + + if (!pkcs12) { + return WOLFSSL_FAILURE; + } + + return wc_PKCS12_verify_ex(pkcs12, (const byte*)psw, (word32)pswLen) == 0 ? + WOLFSSL_SUCCESS : WOLFSSL_FAILURE; +} + +#endif /* !NO_ASN && !NO_PWDBASED */ + +#endif /* OPENSSL_EXTRA */ + +#endif /* HAVE_PKCS12 */ +/******************************************************************************* + * END OF PKCS12 APIs + ******************************************************************************/ + +#endif /* !WOLFCRYPT_ONLY && !NO_CERTS */ + +#endif /* !WOLFSSL_SSL_P7P12_INCLUDED */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_sess.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_sess.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/ssl_sess.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/ssl_sess.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4567 @@ +/* ssl_sess.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#if !defined(WOLFSSL_SSL_SESS_INCLUDED) + #ifndef WOLFSSL_IGNORE_FILE_WARN + #warning ssl_sess.c does not need to be compiled separately from ssl.c + #endif +#else + +#ifndef NO_SESSION_CACHE + + /* basic config gives a cache with 33 sessions, adequate for clients and + embedded servers + + TITAN_SESSION_CACHE allows just over 2 million sessions, for servers + with titanic amounts of memory with long session ID timeouts and high + levels of traffic. + + ENABLE_SESSION_CACHE_ROW_LOCK: Allows row level locking for increased + performance with large session caches + + HUGE_SESSION_CACHE yields 65,791 sessions, for servers under heavy load, + allows over 13,000 new sessions per minute or over 200 new sessions per + second + + BIG_SESSION_CACHE yields 20,027 sessions + + MEDIUM_SESSION_CACHE allows 1055 sessions, adequate for servers that + aren't under heavy load, basically allows 200 new sessions per minute + + SMALL_SESSION_CACHE only stores 6 sessions, good for embedded clients + or systems where the default of is too much RAM. + SessionCache takes about 2K, ClientCache takes about 3Kbytes + + MICRO_SESSION_CACHE only stores 1 session, good for embedded clients + or systems where memory is at a premium. + SessionCache takes about 400 bytes, ClientCache takes 576 bytes + + default SESSION_CACHE stores 33 sessions (no XXX_SESSION_CACHE defined) + SessionCache takes about 13K bytes, ClientCache takes 17K bytes + */ + #if defined(TITAN_SESSION_CACHE) + #define SESSIONS_PER_ROW 31 + #define SESSION_ROWS 64937 + #ifndef ENABLE_SESSION_CACHE_ROW_LOCK + #define ENABLE_SESSION_CACHE_ROW_LOCK + #endif + #elif defined(HUGE_SESSION_CACHE) + #define SESSIONS_PER_ROW 11 + #define SESSION_ROWS 5981 + #elif defined(BIG_SESSION_CACHE) + #define SESSIONS_PER_ROW 7 + #define SESSION_ROWS 2861 + #elif defined(MEDIUM_SESSION_CACHE) + #define SESSIONS_PER_ROW 5 + #define SESSION_ROWS 211 + #elif defined(SMALL_SESSION_CACHE) + #define SESSIONS_PER_ROW 2 + #define SESSION_ROWS 3 + #elif defined(MICRO_SESSION_CACHE) + #define SESSIONS_PER_ROW 1 + #define SESSION_ROWS 1 + #else + #define SESSIONS_PER_ROW 3 + #define SESSION_ROWS 11 + #endif + #define INVALID_SESSION_ROW (-1) + + #ifdef NO_SESSION_CACHE_ROW_LOCK + #undef ENABLE_SESSION_CACHE_ROW_LOCK + #endif + + typedef struct SessionRow { + int nextIdx; /* where to place next one */ + int totalCount; /* sessions ever on this row */ +#ifdef SESSION_CACHE_DYNAMIC_MEM + WOLFSSL_SESSION* Sessions[SESSIONS_PER_ROW]; + void* heap; +#else + WOLFSSL_SESSION Sessions[SESSIONS_PER_ROW]; +#endif + + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + /* not included in import/export */ + wolfSSL_RwLock row_lock; + int lock_valid; + #endif + } SessionRow; + #define SIZEOF_SESSION_ROW (sizeof(WOLFSSL_SESSION) + (sizeof(int) * 2)) + + static WOLFSSL_GLOBAL SessionRow SessionCache[SESSION_ROWS]; + + #if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) + static WOLFSSL_GLOBAL word32 PeakSessions; + #endif + + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&(row)->row_lock) + #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&(row)->row_lock) + #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&(row)->row_lock); + #else + static WOLFSSL_GLOBAL wolfSSL_RwLock session_lock; /* SessionCache lock */ + static WOLFSSL_GLOBAL int session_lock_valid = 0; + #define SESSION_ROW_RD_LOCK(row) wc_LockRwLock_Rd(&session_lock) + #define SESSION_ROW_WR_LOCK(row) wc_LockRwLock_Wr(&session_lock) + #define SESSION_ROW_UNLOCK(row) wc_UnLockRwLock(&session_lock); + #endif + + #if !defined(NO_SESSION_CACHE_REF) && defined(NO_CLIENT_CACHE) + #error ClientCache is required when not using NO_SESSION_CACHE_REF + #endif + + #ifndef NO_CLIENT_CACHE + + #ifndef CLIENT_SESSIONS_MULTIPLIER + #ifdef NO_SESSION_CACHE_REF + #define CLIENT_SESSIONS_MULTIPLIER 1 + #else + /* ClientSession objects are lightweight (compared to + * WOLFSSL_SESSION) so to decrease chance that user will reuse + * the wrong session, increase the ClientCache size. This will + * make the entire ClientCache about the size of one + * WOLFSSL_SESSION object. */ + #define CLIENT_SESSIONS_MULTIPLIER 8 + #endif + #endif + #define CLIENT_SESSIONS_PER_ROW \ + (SESSIONS_PER_ROW * CLIENT_SESSIONS_MULTIPLIER) + #define CLIENT_SESSION_ROWS (SESSION_ROWS * CLIENT_SESSIONS_MULTIPLIER) + + #if CLIENT_SESSIONS_PER_ROW > 65535 + #error CLIENT_SESSIONS_PER_ROW too big + #endif + #if CLIENT_SESSION_ROWS > 65535 + #error CLIENT_SESSION_ROWS too big + #endif + + struct ClientSession { + word16 serverRow; /* SessionCache Row id */ + word16 serverIdx; /* SessionCache Idx (column) */ + word32 sessionIDHash; + }; + #ifndef WOLFSSL_CLIENT_SESSION_DEFINED + typedef struct ClientSession ClientSession; + #define WOLFSSL_CLIENT_SESSION_DEFINED + #endif + + typedef struct ClientRow { + int nextIdx; /* where to place next one */ + int totalCount; /* sessions ever on this row */ + ClientSession Clients[CLIENT_SESSIONS_PER_ROW]; + } ClientRow; + + static WOLFSSL_GLOBAL ClientRow ClientCache[CLIENT_SESSION_ROWS]; + /* Client Cache */ + /* uses session mutex */ + + /* ClientCache mutex */ + static WOLFSSL_GLOBAL wolfSSL_Mutex clisession_mutex + WOLFSSL_MUTEX_INITIALIZER_CLAUSE(clisession_mutex); + #ifndef WOLFSSL_MUTEX_INITIALIZER + static WOLFSSL_GLOBAL int clisession_mutex_valid = 0; + #endif + #endif /* !NO_CLIENT_CACHE */ + + void EvictSessionFromCache(WOLFSSL_SESSION* session) + { +#ifdef HAVE_EX_DATA + int save_ownExData = session->ownExData; + session->ownExData = 1; /* Make sure ex_data access doesn't lead back + * into the cache. */ +#endif +#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) + if (session->rem_sess_cb != NULL) { + session->rem_sess_cb(NULL, session); + session->rem_sess_cb = NULL; + } +#endif + ForceZero(session->masterSecret, SECRET_LEN); + XMEMSET(session->sessionID, 0, ID_LEN); + session->sessionIDSz = 0; +#ifdef HAVE_SESSION_TICKET + if (session->ticketLenAlloc > 0) { + XFREE(session->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK); + session->ticket = session->staticTicket; + session->ticketLen = 0; + session->ticketLenAlloc = 0; + } +#endif +#ifdef HAVE_EX_DATA + session->ownExData = save_ownExData; +#endif + +#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) && \ + defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + if ((session->ticketNonce.data != NULL) && + (session->ticketNonce.data != session->ticketNonce.dataStatic)) + { + XFREE(session->ticketNonce.data, NULL, DYNAMIC_TYPE_SESSION_TICK); + session->ticketNonce.data = NULL; + } +#endif + } + +WOLFSSL_ABI +WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl) +{ + WOLFSSL_ENTER("wolfSSL_get_session"); + if (ssl) { +#ifdef NO_SESSION_CACHE_REF + return ssl->session; +#else + if (ssl->options.side == WOLFSSL_CLIENT_END) { + /* On the client side we want to return a persistent reference for + * backwards compatibility. */ +#ifndef NO_CLIENT_CACHE + if (ssl->clientSession) { + return (WOLFSSL_SESSION*)ssl->clientSession; + } + else { + /* Try to add a ClientCache entry to associate with the current + * session. Ignore any session cache options. */ + int err; + const byte* id = ssl->session->sessionID; + byte idSz = ssl->session->sessionIDSz; + if (ssl->session->haveAltSessionID) { + id = ssl->session->altSessionID; + idSz = ID_LEN; + } + err = AddSessionToCache(ssl->ctx, ssl->session, id, idSz, + NULL, ssl->session->side, + #ifdef HAVE_SESSION_TICKET + ssl->session->ticketLen > 0, + #else + 0, + #endif + &ssl->clientSession); + if (err == 0) { + return (WOLFSSL_SESSION*)ssl->clientSession; + } + } +#endif + } + else { + return ssl->session; + } +#endif + } + + return NULL; +} + +/* The get1 version requires caller to call SSL_SESSION_free */ +WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl) +{ + WOLFSSL_SESSION* sess = NULL; + WOLFSSL_ENTER("wolfSSL_get1_session"); + if (ssl != NULL) { + sess = ssl->session; + if (sess != NULL) { + /* increase reference count if allocated session */ + if (sess->type == WOLFSSL_SESSION_TYPE_HEAP) { + if (wolfSSL_SESSION_up_ref(sess) != WOLFSSL_SUCCESS) + sess = NULL; + } + } + } + return sess; +} + +/* session is a private struct, return if it is setup or not */ +WOLFSSL_API int wolfSSL_SessionIsSetup(WOLFSSL_SESSION* session) +{ + if (session != NULL) + return session->isSetup; + return 0; +} + +/* + * Sets the session object to use when establishing a TLS/SSL session using + * the ssl object. Therefore, this function must be called before + * wolfSSL_connect. The session object to use can be obtained in a previous + * TLS/SSL connection using wolfSSL_get_session. + * + * This function rejects the session if it has been expired when this function + * is called. Note that this expiration check is wolfSSL specific and differs + * from OpenSSL return code behavior. + * + * By default, wolfSSL_set_session returns WOLFSSL_SUCCESS on successfully + * setting the session, WOLFSSL_FAILURE on failure due to the session cache + * being disabled, or the session has expired. + * + * To match OpenSSL return code behavior when session is expired, define + * OPENSSL_EXTRA and WOLFSSL_ERROR_CODE_OPENSSL. This behavior will return + * WOLFSSL_SUCCESS even when the session is expired and rejected. + */ +WOLFSSL_ABI +int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session) +{ + WOLFSSL_ENTER("wolfSSL_set_session"); + if (session) + return wolfSSL_SetSession(ssl, session); + + return WOLFSSL_FAILURE; +} + + +#ifndef NO_CLIENT_CACHE + +/* Associate client session with serverID, find existing or store for saving + if newSession flag on, don't reuse existing session + WOLFSSL_SUCCESS on ok */ +int wolfSSL_SetServerID(WOLFSSL* ssl, const byte* id, int len, int newSession) +{ + WOLFSSL_SESSION* session = NULL; + byte idHash[SERVER_ID_LEN]; + + WOLFSSL_ENTER("wolfSSL_SetServerID"); + + if (ssl == NULL || id == NULL || len <= 0) + return BAD_FUNC_ARG; + + if (len > SERVER_ID_LEN) { +#if defined(NO_SHA) && !defined(NO_SHA256) + if (wc_Sha256Hash(id, len, idHash) != 0) + return WOLFSSL_FAILURE; +#else + if (wc_ShaHash(id, (word32)len, idHash) != 0) + return WOLFSSL_FAILURE; +#endif + id = idHash; + len = SERVER_ID_LEN; + } + + if (newSession == 0) { + session = wolfSSL_GetSessionClient(ssl, id, len); + if (session) { + if (wolfSSL_SetSession(ssl, session) != WOLFSSL_SUCCESS) { + #ifdef HAVE_EXT_CACHE + wolfSSL_FreeSession(ssl->ctx, session); + #endif + WOLFSSL_MSG("wolfSSL_SetSession failed"); + session = NULL; + } + } + } + + if (session == NULL) { + WOLFSSL_MSG("Valid ServerID not cached already"); + + ssl->session->idLen = (word16)len; + XMEMCPY(ssl->session->serverID, id, len); + } +#ifdef HAVE_EXT_CACHE + else { + wolfSSL_FreeSession(ssl->ctx, session); + } +#endif + + return WOLFSSL_SUCCESS; +} + +#endif /* !NO_CLIENT_CACHE */ + +/* TODO: Add SESSION_CACHE_DYNAMIC_MEM support for PERSIST_SESSION_CACHE. + * Need a count of current sessions to get an accurate memsize (totalCount is + * not decremented when sessions are removed). + * Need to determine ideal layout for mem/filesave. + * Also need mem/filesave checking to ensure not restoring non DYNAMIC_MEM + * cache. + */ +#if defined(PERSIST_SESSION_CACHE) && !defined(SESSION_CACHE_DYNAMIC_MEM) + +/* for persistence, if changes to layout need to increment and modify + save_session_cache() and restore_session_cache and memory versions too */ +#define WOLFSSL_CACHE_VERSION 2 + +/* Session Cache Header information */ +typedef struct { + int version; /* cache layout version id */ + int rows; /* session rows */ + int columns; /* session columns */ + int sessionSz; /* sizeof WOLFSSL_SESSION */ +} cache_header_t; + +/* current persistence layout is: + + 1) cache_header_t + 2) SessionCache + 3) ClientCache + + update WOLFSSL_CACHE_VERSION if change layout for the following + PERSISTENT_SESSION_CACHE functions +*/ + +/* get how big the the session cache save buffer needs to be */ +int wolfSSL_get_session_cache_memsize(void) +{ + int sz = (int)(sizeof(SessionCache) + sizeof(cache_header_t)); +#ifndef NO_CLIENT_CACHE + sz += (int)(sizeof(ClientCache)); +#endif + return sz; +} + + +/* Persist session cache to memory */ +int wolfSSL_memsave_session_cache(void* mem, int sz) +{ + int i; + cache_header_t cache_header; + SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header)); + + WOLFSSL_ENTER("wolfSSL_memsave_session_cache"); + + if (sz < wolfSSL_get_session_cache_memsize()) { + WOLFSSL_MSG("Memory buffer too small"); + return BUFFER_E; + } + + cache_header.version = WOLFSSL_CACHE_VERSION; + cache_header.rows = SESSION_ROWS; + cache_header.columns = SESSIONS_PER_ROW; + cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION); + XMEMCPY(mem, &cache_header, sizeof(cache_header)); + +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_RD_LOCK(row) != 0) { + WOLFSSL_MSG("Session cache mutex lock failed"); + return BAD_MUTEX_E; + } +#endif + for (i = 0; i < cache_header.rows; ++i) { + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) { + WOLFSSL_MSG("Session row cache mutex lock failed"); + return BAD_MUTEX_E; + } + #endif + + XMEMCPY(row++, &SessionCache[i], SIZEOF_SESSION_ROW); + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[i]); + #endif + } +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(row); +#endif + +#ifndef NO_CLIENT_CACHE + if (wc_LockMutex(&clisession_mutex) != 0) { + WOLFSSL_MSG("Client cache mutex lock failed"); + return BAD_MUTEX_E; + } + XMEMCPY(row, ClientCache, sizeof(ClientCache)); + wc_UnLockMutex(&clisession_mutex); +#endif + + WOLFSSL_LEAVE("wolfSSL_memsave_session_cache", WOLFSSL_SUCCESS); + + return WOLFSSL_SUCCESS; +} + + +/* Restore the persistent session cache from memory */ +int wolfSSL_memrestore_session_cache(const void* mem, int sz) +{ + int i; + cache_header_t cache_header; + SessionRow* row = (SessionRow*)((byte*)mem + sizeof(cache_header)); + + WOLFSSL_ENTER("wolfSSL_memrestore_session_cache"); + + if (sz < wolfSSL_get_session_cache_memsize()) { + WOLFSSL_MSG("Memory buffer too small"); + return BUFFER_E; + } + + XMEMCPY(&cache_header, mem, sizeof(cache_header)); + if (cache_header.version != WOLFSSL_CACHE_VERSION || + cache_header.rows != SESSION_ROWS || + cache_header.columns != SESSIONS_PER_ROW || + cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) { + + WOLFSSL_MSG("Session cache header match failed"); + return CACHE_MATCH_ERROR; + } + +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) { + WOLFSSL_MSG("Session cache mutex lock failed"); + return BAD_MUTEX_E; + } +#endif + for (i = 0; i < cache_header.rows; ++i) { + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) { + WOLFSSL_MSG("Session row cache mutex lock failed"); + return BAD_MUTEX_E; + } + #endif + + XMEMCPY(&SessionCache[i], row++, SIZEOF_SESSION_ROW); + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[i]); + #endif + } +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[0]); +#endif + +#ifndef NO_CLIENT_CACHE + if (wc_LockMutex(&clisession_mutex) != 0) { + WOLFSSL_MSG("Client cache mutex lock failed"); + return BAD_MUTEX_E; + } + XMEMCPY(ClientCache, row, sizeof(ClientCache)); + wc_UnLockMutex(&clisession_mutex); +#endif + + WOLFSSL_LEAVE("wolfSSL_memrestore_session_cache", WOLFSSL_SUCCESS); + + return WOLFSSL_SUCCESS; +} + +#if !defined(NO_FILESYSTEM) + +/* Persist session cache to file */ +/* doesn't use memsave because of additional memory use */ +int wolfSSL_save_session_cache(const char *fname) +{ + XFILE file; + int ret; + int rc = WOLFSSL_SUCCESS; + int i; + cache_header_t cache_header; + + WOLFSSL_ENTER("wolfSSL_save_session_cache"); + + file = XFOPEN(fname, "w+b"); + if (file == XBADFILE) { + WOLFSSL_MSG("Couldn't open session cache save file"); + return WOLFSSL_BAD_FILE; + } + cache_header.version = WOLFSSL_CACHE_VERSION; + cache_header.rows = SESSION_ROWS; + cache_header.columns = SESSIONS_PER_ROW; + cache_header.sessionSz = (int)sizeof(WOLFSSL_SESSION); + + /* cache header */ + ret = (int)XFWRITE(&cache_header, sizeof cache_header, 1, file); + if (ret != 1) { + WOLFSSL_MSG("Session cache header file write failed"); + XFCLOSE(file); + return FWRITE_ERROR; + } + +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_RD_LOCK(&SessionCache[0]) != 0) { + WOLFSSL_MSG("Session cache mutex lock failed"); + XFCLOSE(file); + return BAD_MUTEX_E; + } +#endif + /* session cache */ + for (i = 0; i < cache_header.rows; ++i) { + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_RD_LOCK(&SessionCache[i]) != 0) { + WOLFSSL_MSG("Session row cache mutex lock failed"); + XFCLOSE(file); + return BAD_MUTEX_E; + } + #endif + + ret = (int)XFWRITE(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file); + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[i]); + #endif + if (ret != 1) { + WOLFSSL_MSG("Session cache member file write failed"); + rc = FWRITE_ERROR; + break; + } + } +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[0]); +#endif + +#ifndef NO_CLIENT_CACHE + /* client cache */ + if (wc_LockMutex(&clisession_mutex) != 0) { + WOLFSSL_MSG("Client cache mutex lock failed"); + XFCLOSE(file); + return BAD_MUTEX_E; + } + ret = (int)XFWRITE(ClientCache, sizeof(ClientCache), 1, file); + if (ret != 1) { + WOLFSSL_MSG("Client cache member file write failed"); + rc = FWRITE_ERROR; + } + wc_UnLockMutex(&clisession_mutex); +#endif /* !NO_CLIENT_CACHE */ + + XFCLOSE(file); + WOLFSSL_LEAVE("wolfSSL_save_session_cache", rc); + + return rc; +} + + +/* Restore the persistent session cache from file */ +/* doesn't use memstore because of additional memory use */ +int wolfSSL_restore_session_cache(const char *fname) +{ + XFILE file; + int rc = WOLFSSL_SUCCESS; + int ret; + int i; + cache_header_t cache_header; + + WOLFSSL_ENTER("wolfSSL_restore_session_cache"); + + file = XFOPEN(fname, "rb"); + if (file == XBADFILE) { + WOLFSSL_MSG("Couldn't open session cache save file"); + return WOLFSSL_BAD_FILE; + } + /* cache header */ + ret = (int)XFREAD(&cache_header, sizeof(cache_header), 1, file); + if (ret != 1) { + WOLFSSL_MSG("Session cache header file read failed"); + XFCLOSE(file); + return FREAD_ERROR; + } + if (cache_header.version != WOLFSSL_CACHE_VERSION || + cache_header.rows != SESSION_ROWS || + cache_header.columns != SESSIONS_PER_ROW || + cache_header.sessionSz != (int)sizeof(WOLFSSL_SESSION)) { + + WOLFSSL_MSG("Session cache header match failed"); + XFCLOSE(file); + return CACHE_MATCH_ERROR; + } + +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_WR_LOCK(&SessionCache[0]) != 0) { + WOLFSSL_MSG("Session cache mutex lock failed"); + XFCLOSE(file); + return BAD_MUTEX_E; + } +#endif + /* session cache */ + for (i = 0; i < cache_header.rows; ++i) { + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) { + WOLFSSL_MSG("Session row cache mutex lock failed"); + XFCLOSE(file); + return BAD_MUTEX_E; + } + #endif + + ret = (int)XFREAD(&SessionCache[i], SIZEOF_SESSION_ROW, 1, file); + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[i]); + #endif + if (ret != 1) { + WOLFSSL_MSG("Session cache member file read failed"); + XMEMSET(SessionCache, 0, sizeof SessionCache); + rc = FREAD_ERROR; + break; + } + } +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[0]); +#endif + +#ifndef NO_CLIENT_CACHE + /* client cache */ + if (wc_LockMutex(&clisession_mutex) != 0) { + WOLFSSL_MSG("Client cache mutex lock failed"); + XFCLOSE(file); + return BAD_MUTEX_E; + } + ret = (int)XFREAD(ClientCache, sizeof(ClientCache), 1, file); + if (ret != 1) { + WOLFSSL_MSG("Client cache member file read failed"); + XMEMSET(ClientCache, 0, sizeof ClientCache); + rc = FREAD_ERROR; + } + wc_UnLockMutex(&clisession_mutex); +#endif /* !NO_CLIENT_CACHE */ + + XFCLOSE(file); + WOLFSSL_LEAVE("wolfSSL_restore_session_cache", rc); + + return rc; +} + +#endif /* !NO_FILESYSTEM */ +#endif /* PERSIST_SESSION_CACHE && !SESSION_CACHE_DYNAMIC_MEM */ + + +/* on by default if built in but allow user to turn off */ +WOLFSSL_ABI +long wolfSSL_CTX_set_session_cache_mode(WOLFSSL_CTX* ctx, long mode) +{ + WOLFSSL_ENTER("wolfSSL_CTX_set_session_cache_mode"); + + if (ctx == NULL) + return WOLFSSL_FAILURE; + + if (mode == WOLFSSL_SESS_CACHE_OFF) { + ctx->sessionCacheOff = 1; +#ifdef HAVE_EXT_CACHE + ctx->internalCacheOff = 1; + ctx->internalCacheLookupOff = 1; +#endif + } + + if ((mode & WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR) != 0) + ctx->sessionCacheFlushOff = 1; + +#ifdef HAVE_EXT_CACHE + /* WOLFSSL_SESS_CACHE_NO_INTERNAL activates both if's */ + if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE) != 0) + ctx->internalCacheOff = 1; + if ((mode & WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP) != 0) + ctx->internalCacheLookupOff = 1; +#endif + + return WOLFSSL_SUCCESS; +} + +#ifdef OPENSSL_EXTRA +#ifdef HAVE_MAX_FRAGMENT +/* return the max fragment size set when handshake was negotiated */ +unsigned char wolfSSL_SESSION_get_max_fragment_length(WOLFSSL_SESSION* session) +{ + session = ClientSessionToSession(session); + if (session == NULL) { + return 0; + } + + return session->mfl; +} +#endif + + +/* Get the session cache mode for CTX + * + * ctx WOLFSSL_CTX struct to get cache mode from + * + * Returns a bit mask that has the session cache mode */ +long wolfSSL_CTX_get_session_cache_mode(WOLFSSL_CTX* ctx) +{ + long m = 0; + + WOLFSSL_ENTER("wolfSSL_CTX_get_session_cache_mode"); + + if (ctx == NULL) { + return m; + } + + if (ctx->sessionCacheOff != 1) { + m |= WOLFSSL_SESS_CACHE_SERVER; + } + + if (ctx->sessionCacheFlushOff == 1) { + m |= WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR; + } + +#ifdef HAVE_EXT_CACHE + if (ctx->internalCacheOff == 1) { + m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE; + } + if (ctx->internalCacheLookupOff == 1) { + m |= WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP; + } +#endif + + return m; +} +#endif /* OPENSSL_EXTRA */ + +#endif /* !NO_SESSION_CACHE */ + +#ifndef NO_SESSION_CACHE + +WOLFSSL_ABI +void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm) +{ + /* static table now, no flushing needed */ + (void)ctx; + (void)tm; +} + +void wolfSSL_CTX_flush_sessions(WOLFSSL_CTX* ctx, long tm) +{ + int i, j; + byte id[ID_LEN]; + + (void)ctx; + XMEMSET(id, 0, ID_LEN); + WOLFSSL_ENTER("wolfSSL_flush_sessions"); + for (i = 0; i < SESSION_ROWS; ++i) { + if (SESSION_ROW_WR_LOCK(&SessionCache[i]) != 0) { + WOLFSSL_MSG("Session cache mutex lock failed"); + return; + } + for (j = 0; j < SESSIONS_PER_ROW; j++) { +#ifdef SESSION_CACHE_DYNAMIC_MEM + WOLFSSL_SESSION* s = SessionCache[i].Sessions[j]; +#else + WOLFSSL_SESSION* s = &SessionCache[i].Sessions[j]; +#endif + if ( +#ifdef SESSION_CACHE_DYNAMIC_MEM + s != NULL && +#endif + XMEMCMP(s->sessionID, id, ID_LEN) != 0 && + s->bornOn + s->timeout < (word32)tm + ) + { + EvictSessionFromCache(s); +#ifdef SESSION_CACHE_DYNAMIC_MEM + XFREE(s, s->heap, DYNAMIC_TYPE_SESSION); + SessionCache[i].Sessions[j] = NULL; +#endif + } + } + SESSION_ROW_UNLOCK(&SessionCache[i]); + } +} + + +/* set ssl session timeout in seconds */ +WOLFSSL_ABI +int wolfSSL_set_timeout(WOLFSSL* ssl, unsigned int to) +{ + if (ssl == NULL) + return BAD_FUNC_ARG; + + if (to == 0) + to = WOLFSSL_SESSION_TIMEOUT; + ssl->timeout = to; + + return WOLFSSL_SUCCESS; +} + + +/** + * Sets ctx session timeout in seconds. + * The timeout value set here should be reflected in the + * "session ticket lifetime hint" if this API works in the openssl compat-layer. + * Therefore wolfSSL_CTX_set_TicketHint is called internally. + * Arguments: + * - ctx WOLFSSL_CTX object which the timeout is set to + * - to timeout value in second + * Returns: + * WOLFSSL_SUCCESS on success, BAD_FUNC_ARG on failure. + * When WOLFSSL_ERROR_CODE_OPENSSL is defined, returns previous timeout value + * on success, BAD_FUNC_ARG on failure. + */ +WOLFSSL_ABI +int wolfSSL_CTX_set_timeout(WOLFSSL_CTX* ctx, unsigned int to) +{ + #if defined(WOLFSSL_ERROR_CODE_OPENSSL) + word32 prev_timeout = 0; + #endif + + int ret = WOLFSSL_SUCCESS; + (void)ret; + + if (ctx == NULL) + ret = BAD_FUNC_ARG; + + if (ret == WOLFSSL_SUCCESS) { + #if defined(WOLFSSL_ERROR_CODE_OPENSSL) + prev_timeout = ctx->timeout; + #endif + if (to == 0) { + ctx->timeout = WOLFSSL_SESSION_TIMEOUT; + } + else { + ctx->timeout = to; + } + } +#if defined(OPENSSL_EXTRA) && defined(HAVE_SESSION_TICKET) && \ + !defined(NO_WOLFSSL_SERVER) + if (ret == WOLFSSL_SUCCESS) { + if (to == 0) { + ret = wolfSSL_CTX_set_TicketHint(ctx, SESSION_TICKET_HINT_DEFAULT); + } + else { + ret = wolfSSL_CTX_set_TicketHint(ctx, (int)to); + } + } +#endif /* OPENSSL_EXTRA && HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */ + +#if defined(WOLFSSL_ERROR_CODE_OPENSSL) + if (ret == WOLFSSL_SUCCESS) { + return (int)prev_timeout; + } + else { + return ret; + } +#else + return ret; +#endif /* WOLFSSL_ERROR_CODE_OPENSSL */ +} + + +#ifndef NO_CLIENT_CACHE + +/* Get Session from Client cache based on id/len, return NULL on failure */ +WOLFSSL_SESSION* wolfSSL_GetSessionClient(WOLFSSL* ssl, const byte* id, int len) +{ + WOLFSSL_SESSION* ret = NULL; + word32 row; + int idx; + int count; + int error = 0; + ClientSession* clSess; + + WOLFSSL_ENTER("wolfSSL_GetSessionClient"); + + if (ssl->ctx->sessionCacheOff) { + WOLFSSL_MSG("Session Cache off"); + return NULL; + } + + if (ssl->options.side == WOLFSSL_SERVER_END) + return NULL; + + len = (int)min(SERVER_ID_LEN, (word32)len); + + /* Do not access ssl->ctx->get_sess_cb from here. It is using a different + * set of ID's */ + + row = HashObject(id, (word32)len, &error) % CLIENT_SESSION_ROWS; + if (error != 0) { + WOLFSSL_MSG("Hash session failed"); + return NULL; + } + + if (wc_LockMutex(&clisession_mutex) != 0) { + WOLFSSL_MSG("Client cache mutex lock failed"); + return NULL; + } + + /* start from most recently used */ + count = (int)min((word32)ClientCache[row].totalCount, CLIENT_SESSIONS_PER_ROW); + idx = ClientCache[row].nextIdx - 1; + if (idx < 0 || idx >= CLIENT_SESSIONS_PER_ROW) { + /* if back to front, the previous was end */ + idx = CLIENT_SESSIONS_PER_ROW - 1; + } + clSess = ClientCache[row].Clients; + + for (; count > 0; --count) { + WOLFSSL_SESSION* current; + SessionRow* sessRow; + + if (clSess[idx].serverRow >= SESSION_ROWS) { + WOLFSSL_MSG("Client cache serverRow invalid"); + break; + } + + /* lock row */ + sessRow = &SessionCache[clSess[idx].serverRow]; + if (SESSION_ROW_RD_LOCK(sessRow) != 0) { + WOLFSSL_MSG("Session cache row lock failure"); + break; + } + +#ifdef SESSION_CACHE_DYNAMIC_MEM + current = sessRow->Sessions[clSess[idx].serverIdx]; +#else + current = &sessRow->Sessions[clSess[idx].serverIdx]; +#endif + if (current && XMEMCMP(current->serverID, id, len) == 0) { + WOLFSSL_MSG("Found a serverid match for client"); + if (LowResTimer() < (current->bornOn + current->timeout)) { + WOLFSSL_MSG("Session valid"); + ret = current; + SESSION_ROW_UNLOCK(sessRow); + break; + } else { + WOLFSSL_MSG("Session timed out"); /* could have more for id */ + } + } else { + WOLFSSL_MSG("ServerID not a match from client table"); + } + SESSION_ROW_UNLOCK(sessRow); + + idx = idx > 0 ? idx - 1 : CLIENT_SESSIONS_PER_ROW - 1; + } + + wc_UnLockMutex(&clisession_mutex); + + return ret; +} + +#endif /* !NO_CLIENT_CACHE */ + +static int SslSessionCacheOff(const WOLFSSL* ssl, + const WOLFSSL_SESSION* session) +{ + (void)session; + return ssl->options.sessionCacheOff + #if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_FORCE_CACHE_ON_TICKET) + && session->ticketLen == 0 + #endif + ; +} + +#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ + defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) +/** + * SessionTicketNoncePrealloc() - prealloc a buffer for ticket nonces + * @output: [in] pointer to WOLFSSL_SESSION object that will soon be a + * destination of a session duplication + * @buf: [out] address of the preallocated buf + * @len: [out] len of the preallocated buf + * + * prealloc a buffer that will likely suffice to contain a ticket nonce. It's + * used when copying session under lock, when syscalls need to be avoided. If + * output already has a dynamic buffer, it's reused. + */ +static int SessionTicketNoncePrealloc(byte** buf, byte* len, void *heap) +{ + (void)heap; + + *buf = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_NONCE_LEN, heap, + DYNAMIC_TYPE_SESSION_TICK); + if (*buf == NULL) { + WOLFSSL_MSG("Failed to preallocate ticket nonce buffer"); + *len = 0; + return 1; + } + + *len = PREALLOC_SESSION_TICKET_NONCE_LEN; + return 0; +} +#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */ + +static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input, + WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf, + byte* ticketNonceLen, byte* preallocUsed); + +void TlsSessionCacheUnlockRow(word32 row) +{ + SessionRow* sessRow; + + sessRow = &SessionCache[row]; + (void)sessRow; + SESSION_ROW_UNLOCK(sessRow); +} + +/* Don't use this function directly. Use TlsSessionCacheGetAndRdLock and + * TlsSessionCacheGetAndWrLock to fully utilize compiler const support. */ +static int TlsSessionCacheGetAndLock(const byte *id, + const WOLFSSL_SESSION **sess, word32 *lockedRow, byte readOnly, byte side) +{ + SessionRow *sessRow; + const WOLFSSL_SESSION *s; + word32 row; + int count; + int error; + int idx; + + *sess = NULL; + row = HashObject(id, ID_LEN, &error) % SESSION_ROWS; + if (error != 0) + return error; + sessRow = &SessionCache[row]; + if (readOnly) + error = SESSION_ROW_RD_LOCK(sessRow); + else + error = SESSION_ROW_WR_LOCK(sessRow); + if (error != 0) + return FATAL_ERROR; + + /* start from most recently used */ + count = (int)min((word32)sessRow->totalCount, SESSIONS_PER_ROW); + idx = sessRow->nextIdx - 1; + if (idx < 0 || idx >= SESSIONS_PER_ROW) { + idx = SESSIONS_PER_ROW - 1; /* if back to front, the previous was end */ + } + for (; count > 0; --count) { +#ifdef SESSION_CACHE_DYNAMIC_MEM + s = sessRow->Sessions[idx]; +#else + s = &sessRow->Sessions[idx]; +#endif + if (s && XMEMCMP(s->sessionID, id, ID_LEN) == 0 && s->side == side) { + *sess = s; + break; + } + idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1; + } + if (*sess == NULL) { + SESSION_ROW_UNLOCK(sessRow); + } + else { + *lockedRow = row; + } + + return 0; +} + +static int CheckSessionMatch(const WOLFSSL* ssl, const WOLFSSL_SESSION* sess) +{ + if (ssl == NULL || sess == NULL) + return 0; +#ifdef OPENSSL_EXTRA + if (ssl->sessionCtxSz > 0 && (ssl->sessionCtxSz != sess->sessionCtxSz || + XMEMCMP(ssl->sessionCtx, sess->sessionCtx, sess->sessionCtxSz) != 0)) + return 0; +#endif +#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) + if (IsAtLeastTLSv1_3(ssl->version) != IsAtLeastTLSv1_3(sess->version)) + return 0; +#endif + return 1; +} + +int TlsSessionCacheGetAndRdLock(const byte *id, const WOLFSSL_SESSION **sess, + word32 *lockedRow, byte side) +{ + return TlsSessionCacheGetAndLock(id, sess, lockedRow, 1, side); +} + +int TlsSessionCacheGetAndWrLock(const byte *id, WOLFSSL_SESSION **sess, + word32 *lockedRow, byte side) +{ + return TlsSessionCacheGetAndLock(id, (const WOLFSSL_SESSION**)sess, + lockedRow, 0, side); +} + +int wolfSSL_GetSessionFromCache(WOLFSSL* ssl, WOLFSSL_SESSION* output) +{ + const WOLFSSL_SESSION* sess = NULL; + const byte* id = NULL; + word32 row; + int error = 0; +#ifdef HAVE_SESSION_TICKET +#ifndef WOLFSSL_SMALL_STACK + byte tmpTicket[PREALLOC_SESSION_TICKET_LEN]; +#else + byte* tmpTicket = NULL; +#endif +#ifdef WOLFSSL_TLS13 + byte *preallocNonce = NULL; + byte preallocNonceLen = 0; + byte preallocNonceUsed = 0; +#endif /* WOLFSSL_TLS13 */ + byte tmpBufSet = 0; +#endif +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + WOLFSSL_X509* peer = NULL; +#endif + byte bogusID[ID_LEN]; + byte bogusIDSz = 0; + + WOLFSSL_ENTER("wolfSSL_GetSessionFromCache"); + + if (output == NULL) { + WOLFSSL_MSG("NULL output"); + return WOLFSSL_FAILURE; + } + + if (SslSessionCacheOff(ssl, ssl->session)) + return WOLFSSL_FAILURE; + + if (ssl->options.haveSessionId == 0 && !ssl->session->haveAltSessionID) + return WOLFSSL_FAILURE; + +#ifdef HAVE_SESSION_TICKET + if (ssl->options.side == WOLFSSL_SERVER_END && ssl->options.useTicket == 1) + return WOLFSSL_FAILURE; +#endif + + XMEMSET(bogusID, 0, sizeof(bogusID)); + if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL + && !ssl->session->haveAltSessionID) + id = ssl->arrays->sessionID; + else if (ssl->session->haveAltSessionID) { + id = ssl->session->altSessionID; + /* We want to restore the bogus ID for TLS compatibility */ + if (output == ssl->session) { + XMEMCPY(bogusID, ssl->session->sessionID, ID_LEN); + bogusIDSz = ssl->session->sessionIDSz; + } + } + else + id = ssl->session->sessionID; + + +#ifdef HAVE_EXT_CACHE + if (ssl->ctx->get_sess_cb != NULL) { + int copy = 0; + int found = 0; + WOLFSSL_SESSION* extSess; + /* Attempt to retrieve the session from the external cache. */ + WOLFSSL_MSG("Calling external session cache"); + extSess = ssl->ctx->get_sess_cb(ssl, (byte*)id, ID_LEN, ©); + if ((extSess != NULL) + && CheckSessionMatch(ssl, extSess) + ) { + WOLFSSL_MSG("Session found in external cache"); + found = 1; + + error = wolfSSL_DupSession(extSess, output, 0); +#ifdef HAVE_EX_DATA + extSess->ownExData = 1; + output->ownExData = 0; +#endif + /* We want to restore the bogus ID for TLS compatibility */ + if (ssl->session->haveAltSessionID && + output == ssl->session) { + XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN); + ssl->session->sessionIDSz = bogusIDSz; + } + } + /* If copy not set then free immediately */ + if (extSess != NULL && !copy) + wolfSSL_FreeSession(ssl->ctx, extSess); + if (found) + return error; + WOLFSSL_MSG("Session not found in external cache"); + } + + if (ssl->options.internalCacheLookupOff) { + WOLFSSL_MSG("Internal cache lookup turned off"); + return WOLFSSL_FAILURE; + } +#endif + +#ifdef HAVE_SESSION_TICKET + if (output->ticket == NULL || + output->ticketLenAlloc < PREALLOC_SESSION_TICKET_LEN) { +#ifdef WOLFSSL_SMALL_STACK + tmpTicket = (byte*)XMALLOC(PREALLOC_SESSION_TICKET_LEN, output->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (tmpTicket == NULL) { + WOLFSSL_MSG("tmpTicket malloc failed"); + return WOLFSSL_FAILURE; + } +#endif + if (output->ticketLenAlloc) + XFREE(output->ticket, output->heap, DYNAMIC_TYPE_SESSION_TICK); + output->ticket = tmpTicket; /* cppcheck-suppress autoVariables + */ + output->ticketLenAlloc = PREALLOC_SESSION_TICKET_LEN; + output->ticketLen = 0; + tmpBufSet = 1; + } +#endif + +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + if (output->peer != NULL) { + wolfSSL_X509_free(output->peer); + output->peer = NULL; + } +#endif + +#if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) && \ + defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + if (output->ticketNonce.data != output->ticketNonce.dataStatic) { + XFREE(output->ticketNonce.data, output->heap, + DYNAMIC_TYPE_SESSION_TICK); + output->ticketNonce.data = output->ticketNonce.dataStatic; + output->ticketNonce.len = 0; + } + error = SessionTicketNoncePrealloc(&preallocNonce, &preallocNonceLen, + output->heap); + if (error != 0) { + if (tmpBufSet) { + output->ticket = output->staticTicket; + output->ticketLenAlloc = 0; + } +#ifdef WOLFSSL_SMALL_STACK + if (tmpTicket != NULL) + XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return WOLFSSL_FAILURE; + } +#endif /* WOLFSSL_TLS13 && HAVE_SESSION_TICKET*/ + + /* init to avoid clang static analyzer false positive */ + row = 0; + error = TlsSessionCacheGetAndRdLock(id, &sess, &row, + (byte)ssl->options.side); + error = (error == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; + if (error != WOLFSSL_SUCCESS || sess == NULL) { + WOLFSSL_MSG("Get Session from cache failed"); + error = WOLFSSL_FAILURE; +#ifdef HAVE_SESSION_TICKET + if (tmpBufSet) { + output->ticket = output->staticTicket; + output->ticketLenAlloc = 0; + } +#ifdef WOLFSSL_TLS13 + if (preallocNonce != NULL) { + XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK); + preallocNonce = NULL; + } +#endif /* WOLFSSL_TLS13 */ +#ifdef WOLFSSL_SMALL_STACK + if (tmpTicket != NULL) { + XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER); + tmpTicket = NULL; + } +#endif +#endif + } + else { + if (!CheckSessionMatch(ssl, sess)) { + WOLFSSL_MSG("Invalid session: can't be used in this context"); + TlsSessionCacheUnlockRow(row); + error = WOLFSSL_FAILURE; + } + else if (LowResTimer() >= (sess->bornOn + sess->timeout)) { + WOLFSSL_SESSION* wrSess = NULL; + WOLFSSL_MSG("Invalid session: timed out"); + sess = NULL; + TlsSessionCacheUnlockRow(row); + /* Attempt to get a write lock */ + error = TlsSessionCacheGetAndWrLock(id, &wrSess, &row, + (byte)ssl->options.side); + if (error == 0 && wrSess != NULL) { + EvictSessionFromCache(wrSess); + TlsSessionCacheUnlockRow(row); + } + error = WOLFSSL_FAILURE; + } + } + + /* mollify confused cppcheck nullPointer warning. */ + if (sess == NULL) + error = WOLFSSL_FAILURE; + + if (error == WOLFSSL_SUCCESS) { +#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) + error = wolfSSL_DupSessionEx(sess, output, 1, + preallocNonce, &preallocNonceLen, &preallocNonceUsed); +#else + error = wolfSSL_DupSession(sess, output, 1); +#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 */ +#ifdef HAVE_EX_DATA + output->ownExData = !sess->ownExData; /* Session may own ex_data */ +#endif + TlsSessionCacheUnlockRow(row); + } + + /* We want to restore the bogus ID for TLS compatibility */ + if (ssl->session->haveAltSessionID && + output == ssl->session) { + XMEMCPY(ssl->session->sessionID, bogusID, ID_LEN); + ssl->session->sessionIDSz = bogusIDSz; + } + +#ifdef HAVE_SESSION_TICKET + if (tmpBufSet) { + if (error == WOLFSSL_SUCCESS) { + if (output->ticketLen > SESSION_TICKET_LEN) { + output->ticket = (byte*)XMALLOC(output->ticketLen, output->heap, + DYNAMIC_TYPE_SESSION_TICK); + if (output->ticket == NULL) { + error = WOLFSSL_FAILURE; + output->ticket = output->staticTicket; + output->ticketLenAlloc = 0; + output->ticketLen = 0; + } + } + else { + output->ticket = output->staticTicket; + output->ticketLenAlloc = 0; + } + } + else { + output->ticket = output->staticTicket; + output->ticketLenAlloc = 0; + output->ticketLen = 0; + } + if (error == WOLFSSL_SUCCESS) { + XMEMCPY(output->ticket, tmpTicket, output->ticketLen); + } + } +#ifdef WOLFSSL_SMALL_STACK + if (tmpTicket != NULL) + XFREE(tmpTicket, output->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + if (error == WOLFSSL_SUCCESS && preallocNonceUsed) { + if (preallocNonceLen < PREALLOC_SESSION_TICKET_NONCE_LEN) { + /* buffer bigger than needed */ +#ifndef XREALLOC + output->ticketNonce.data = (byte*)XMALLOC(preallocNonceLen, + output->heap, DYNAMIC_TYPE_SESSION_TICK); + if (output->ticketNonce.data != NULL) + XMEMCPY(output->ticketNonce.data, preallocNonce, + preallocNonceLen); + XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK); + preallocNonce = NULL; +#else + output->ticketNonce.data = (byte*)XREALLOC(preallocNonce, + preallocNonceLen, output->heap, DYNAMIC_TYPE_SESSION_TICK); + if (output->ticketNonce.data != NULL) { + /* don't free the reallocated pointer */ + preallocNonce = NULL; + } +#endif /* !XREALLOC */ + if (output->ticketNonce.data == NULL) { + output->ticketNonce.data = output->ticketNonce.dataStatic; + output->ticketNonce.len = 0; + error = WOLFSSL_FAILURE; + /* preallocNonce will be free'd after the if */ + } + } + else { + output->ticketNonce.data = preallocNonce; + output->ticketNonce.len = preallocNonceLen; + preallocNonce = NULL; + } + } + if (preallocNonce != NULL) + XFREE(preallocNonce, output->heap, DYNAMIC_TYPE_SESSION_TICK); +#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ + +#endif + +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + if (peer != NULL) { + wolfSSL_X509_free(peer); + } +#endif + + return error; +} + +WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret, + byte restoreSessionCerts) +{ + WOLFSSL_SESSION* ret = NULL; + + (void)restoreSessionCerts; /* Kept for compatibility */ + + if (wolfSSL_GetSessionFromCache(ssl, ssl->session) == WOLFSSL_SUCCESS) { + ret = ssl->session; + } + else { + WOLFSSL_MSG("wolfSSL_GetSessionFromCache did not return a session"); + } + + if (ret != NULL && masterSecret != NULL) + XMEMCPY(masterSecret, ret->masterSecret, SECRET_LEN); + + return ret; +} + +int wolfSSL_SetSession(WOLFSSL* ssl, WOLFSSL_SESSION* session) +{ + SessionRow* sessRow = NULL; + int ret = WOLFSSL_SUCCESS; + + session = ClientSessionToSession(session); + + if (ssl == NULL || session == NULL || !session->isSetup) { + WOLFSSL_MSG("ssl or session NULL or not set up"); + return WOLFSSL_FAILURE; + } + + /* We need to lock the session as the first step if its in the cache */ + if (session->type == WOLFSSL_SESSION_TYPE_CACHE) { + if (session->cacheRow < SESSION_ROWS) { + sessRow = &SessionCache[session->cacheRow]; + if (SESSION_ROW_RD_LOCK(sessRow) != 0) { + WOLFSSL_MSG("Session row lock failed"); + return WOLFSSL_FAILURE; + } + } + } + + if (ret == WOLFSSL_SUCCESS && ssl->options.side != WOLFSSL_NEITHER_END && + (byte)ssl->options.side != session->side) { + WOLFSSL_MSG("Setting session for wrong role"); + ret = WOLFSSL_FAILURE; + } + + if (ret == WOLFSSL_SUCCESS) { + if (ssl->session == session) { + WOLFSSL_MSG("ssl->session and session same"); + } + else if (session->type != WOLFSSL_SESSION_TYPE_CACHE) { + if (wolfSSL_SESSION_up_ref(session) == WOLFSSL_SUCCESS) { + wolfSSL_FreeSession(ssl->ctx, ssl->session); + ssl->session = session; + } + else + ret = WOLFSSL_FAILURE; + } + else { + ret = wolfSSL_DupSession(session, ssl->session, 0); + if (ret != WOLFSSL_SUCCESS) + WOLFSSL_MSG("Session duplicate failed"); + } + } + + /* Let's copy over the altSessionID for local cache purposes */ + if (ret == WOLFSSL_SUCCESS && session->haveAltSessionID && + ssl->session != session) { + ssl->session->haveAltSessionID = 1; + XMEMCPY(ssl->session->altSessionID, session->altSessionID, ID_LEN); + } + + if (sessRow != NULL) { + SESSION_ROW_UNLOCK(sessRow); + sessRow = NULL; + } + + /* Note: the `session` variable cannot be used below, since the row is + * un-locked */ + + if (ret != WOLFSSL_SUCCESS) + return ret; + +#ifdef WOLFSSL_SESSION_ID_CTX + /* check for application context id */ + if (ssl->sessionCtxSz > 0) { + if (XMEMCMP(ssl->sessionCtx, ssl->session->sessionCtx, + ssl->sessionCtxSz)) { + /* context id did not match! */ + WOLFSSL_MSG("Session context did not match"); + return WOLFSSL_FAILURE; + } + } +#endif /* WOLFSSL_SESSION_ID_CTX */ + + if (LowResTimer() >= (ssl->session->bornOn + ssl->session->timeout)) { +#if !defined(OPENSSL_EXTRA) || !defined(WOLFSSL_ERROR_CODE_OPENSSL) + return WOLFSSL_FAILURE; /* session timed out */ +#else /* defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL) */ + WOLFSSL_MSG("Session is expired but return success for " + "OpenSSL compatibility"); +#endif + } + ssl->options.resuming = 1; + ssl->options.haveEMS = ssl->session->haveEMS; + +#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET)) + ssl->version = ssl->session->version; + if (IsAtLeastTLSv1_3(ssl->version)) + ssl->options.tls1_3 = 1; +#endif +#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ + (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) + ssl->options.cipherSuite0 = ssl->session->cipherSuite0; + ssl->options.cipherSuite = ssl->session->cipherSuite; +#endif +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + ssl->peerVerifyRet = (unsigned long)ssl->session->peerVerifyRet; +#endif + + return WOLFSSL_SUCCESS; +} + + +#ifdef WOLFSSL_SESSION_STATS +static int get_locked_session_stats(word32* active, word32* total, + word32* peak); +#endif + +#ifndef NO_CLIENT_CACHE +ClientSession* AddSessionToClientCache(int side, int row, int idx, + byte* serverID, word16 idLen, const byte* sessionID, word16 useTicket) +{ + int error = -1; + word32 clientRow = 0, clientIdx = 0; + ClientSession* ret = NULL; + + (void)useTicket; + if (side == WOLFSSL_CLIENT_END + && row != INVALID_SESSION_ROW + && (idLen +#ifdef HAVE_SESSION_TICKET + || useTicket == 1 +#endif + || serverID != NULL + )) { + + WOLFSSL_MSG("Trying to add client cache entry"); + + if (idLen) { + clientRow = HashObject(serverID, + idLen, &error) % CLIENT_SESSION_ROWS; + } + else if (serverID != NULL) { + clientRow = HashObject(sessionID, + ID_LEN, &error) % CLIENT_SESSION_ROWS; + } + else { + error = -1; + } + if (error == 0 && wc_LockMutex(&clisession_mutex) == 0) { + clientIdx = (word32)ClientCache[clientRow].nextIdx; + if (clientIdx < CLIENT_SESSIONS_PER_ROW) { + ClientCache[clientRow].Clients[clientIdx].serverRow = + (word16)row; + ClientCache[clientRow].Clients[clientIdx].serverIdx = + (word16)idx; + if (sessionID != NULL) { + word32 sessionIDHash = HashObject(sessionID, ID_LEN, + &error); + if (error == 0) { + ClientCache[clientRow].Clients[clientIdx].sessionIDHash + = sessionIDHash; + } + } + } + else { + error = -1; + ClientCache[clientRow].nextIdx = 0; /* reset index as safety */ + WOLFSSL_MSG("Invalid client cache index! " + "Possible corrupted memory"); + } + if (error == 0) { + WOLFSSL_MSG("Adding client cache entry"); + + ret = &ClientCache[clientRow].Clients[clientIdx]; + + if (ClientCache[clientRow].totalCount < CLIENT_SESSIONS_PER_ROW) + ClientCache[clientRow].totalCount++; + ClientCache[clientRow].nextIdx++; + ClientCache[clientRow].nextIdx %= CLIENT_SESSIONS_PER_ROW; + } + + wc_UnLockMutex(&clisession_mutex); + } + else { + WOLFSSL_MSG("Hash session or lock failed"); + } + } + else { + WOLFSSL_MSG("Skipping client cache"); + } + + return ret; +} +#endif /* !NO_CLIENT_CACHE */ + +/** + * For backwards compatibility, this API needs to be used in *ALL* functions + * that access the WOLFSSL_SESSION members directly. + * + * This API checks if the passed in session is actually a ClientSession object + * and returns the matching session cache object. Otherwise just return the + * input. ClientSession objects only occur in the ClientCache. They are not + * allocated anywhere else. + */ +WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session) +{ + WOLFSSL_ENTER("ClientSessionToSession"); +#ifdef NO_SESSION_CACHE_REF + return (WOLFSSL_SESSION*)session; +#else +#ifndef NO_CLIENT_CACHE + if (session == NULL) + return NULL; + /* Check if session points into ClientCache */ + if ((byte*)session >= (byte*)ClientCache && + /* Cast to byte* to make pointer arithmetic work per byte */ + (byte*)session < ((byte*)ClientCache) + sizeof(ClientCache)) { + ClientSession* clientSession = (ClientSession*)session; + SessionRow* sessRow = NULL; + WOLFSSL_SESSION* cacheSession = NULL; + word32 sessionIDHash = 0; + int error = 0; + session = NULL; /* Default to NULL for failure case */ + if (wc_LockMutex(&clisession_mutex) != 0) { + WOLFSSL_MSG("Client cache mutex lock failed"); + return NULL; + } + if (clientSession->serverRow >= SESSION_ROWS || + clientSession->serverIdx >= SESSIONS_PER_ROW) { + WOLFSSL_MSG("Client cache serverRow or serverIdx invalid"); + error = -1; + } + /* Prevent memory access before clientSession->serverRow and + * clientSession->serverIdx are sanitized. */ + XFENCE(); + if (error == 0) { + /* Lock row */ + sessRow = &SessionCache[clientSession->serverRow]; + error = SESSION_ROW_RD_LOCK(sessRow); + if (error != 0) { + WOLFSSL_MSG("Session cache row lock failure"); + sessRow = NULL; + } + } + if (error == 0) { +#ifdef SESSION_CACHE_DYNAMIC_MEM + cacheSession = sessRow->Sessions[clientSession->serverIdx]; +#else + cacheSession = &sessRow->Sessions[clientSession->serverIdx]; +#endif + if (cacheSession && cacheSession->sessionIDSz == 0) { + cacheSession = NULL; + WOLFSSL_MSG("Session cache entry not set"); + error = -1; + } + } + if (error == 0) { + /* Calculate the hash of the session ID */ + sessionIDHash = HashObject(cacheSession->sessionID, ID_LEN, + &error); + } + if (error == 0) { + /* Check the session ID hash matches */ + error = clientSession->sessionIDHash != sessionIDHash; + if (error != 0) + WOLFSSL_MSG("session ID hashes don't match"); + } + if (error == 0) { + /* Hashes match */ + session = cacheSession; + WOLFSSL_MSG("Found session cache matching client session object"); + } + if (sessRow != NULL) { + SESSION_ROW_UNLOCK(sessRow); + } + wc_UnLockMutex(&clisession_mutex); + return (WOLFSSL_SESSION*)session; + } + else { + /* Plain WOLFSSL_SESSION object */ + return (WOLFSSL_SESSION*)session; + } +#else + return (WOLFSSL_SESSION*)session; +#endif +#endif +} + +int AddSessionToCache(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* addSession, + const byte* id, byte idSz, int* sessionIndex, int side, + word16 useTicket, ClientSession** clientCacheEntry) +{ + WOLFSSL_SESSION* cacheSession = NULL; + SessionRow* sessRow = NULL; + word32 idx = 0; +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + WOLFSSL_X509* cachePeer = NULL; + WOLFSSL_X509* addPeer = NULL; +#endif +#ifdef HAVE_SESSION_TICKET + byte* cacheTicBuff = NULL; + byte ticBuffUsed = 0; + byte* ticBuff = NULL; + int ticLen = 0; +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + byte *preallocNonce = NULL; + byte preallocNonceLen = 0; + byte preallocNonceUsed = 0; + byte *toFree = NULL; +#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC */ +#endif /* HAVE_SESSION_TICKET */ + int ret = 0; + int row; + int i; + int overwrite = 0; + (void)ctx; + (void)sessionIndex; + (void)useTicket; + (void)clientCacheEntry; + + WOLFSSL_ENTER("AddSessionToCache"); + + if (idSz == 0) { + WOLFSSL_MSG("AddSessionToCache idSz == 0"); + return BAD_FUNC_ARG; + } + + addSession = ClientSessionToSession(addSession); + if (addSession == NULL) { + WOLFSSL_MSG("AddSessionToCache is NULL"); + return MEMORY_E; + } + +#ifdef HAVE_SESSION_TICKET + ticLen = addSession->ticketLen; + /* Alloc Memory here to avoid syscalls during lock */ + if (ticLen > SESSION_TICKET_LEN) { + ticBuff = (byte*)XMALLOC(ticLen, NULL, + DYNAMIC_TYPE_SESSION_TICK); + if (ticBuff == NULL) { + return MEMORY_E; + } + } +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + if (addSession->ticketNonce.data != addSession->ticketNonce.dataStatic) { + /* use the AddSession->heap even if the buffer maybe saved in + * CachedSession objects. CachedSession heap and AddSession heap should + * be the same */ + preallocNonce = (byte*)XMALLOC(addSession->ticketNonce.len, + addSession->heap, DYNAMIC_TYPE_SESSION_TICK); + if (preallocNonce == NULL) { + if (ticBuff != NULL) + XFREE(ticBuff, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); + return MEMORY_E; + } + preallocNonceLen = addSession->ticketNonce.len; + } +#endif /* WOLFSSL_TLS13 && WOLFSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3) */ +#endif /* HAVE_SESSION_TICKET */ + + /* Find a position for the new session in cache and use that */ + /* Use the session object in the cache for external cache if required */ + row = (int)(HashObject(id, ID_LEN, &ret) % SESSION_ROWS); + if (ret != 0) { + WOLFSSL_MSG("Hash session failed"); + #ifdef HAVE_SESSION_TICKET + XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); + #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) + XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); + #endif + #endif + return ret; + } + + sessRow = &SessionCache[row]; + if (SESSION_ROW_WR_LOCK(sessRow) != 0) { + #ifdef HAVE_SESSION_TICKET + XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); + #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) + XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); + #endif + #endif + WOLFSSL_MSG("Session row lock failed"); + return BAD_MUTEX_E; + } + + for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) { +#ifdef SESSION_CACHE_DYNAMIC_MEM + cacheSession = sessRow->Sessions[i]; +#else + cacheSession = &sessRow->Sessions[i]; +#endif + if (cacheSession && XMEMCMP(id, + cacheSession->sessionID, ID_LEN) == 0 && + cacheSession->side == side) { + WOLFSSL_MSG("Session already exists. Overwriting."); + overwrite = 1; + idx = (word32)i; + break; + } + } + + if (!overwrite) + idx = (word32)sessRow->nextIdx; +#ifdef SESSION_INDEX + if (sessionIndex != NULL) + *sessionIndex = (row << SESSIDX_ROW_SHIFT) | idx; +#endif + +#ifdef SESSION_CACHE_DYNAMIC_MEM + cacheSession = sessRow->Sessions[idx]; + if (cacheSession == NULL) { + cacheSession = (WOLFSSL_SESSION*) XMALLOC(sizeof(WOLFSSL_SESSION), + sessRow->heap, DYNAMIC_TYPE_SESSION); + if (cacheSession == NULL) { + #ifdef HAVE_SESSION_TICKET + XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); + #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) + XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); + #endif + #endif + SESSION_ROW_UNLOCK(sessRow); + return MEMORY_E; + } + XMEMSET(cacheSession, 0, sizeof(WOLFSSL_SESSION)); + sessRow->Sessions[idx] = cacheSession; + } +#else + cacheSession = &sessRow->Sessions[idx]; +#endif + +#ifdef HAVE_EX_DATA + if (overwrite) { + /* Figure out who owns the ex_data */ + if (cacheSession->ownExData) { + /* Prioritize cacheSession copy */ + XMEMCPY(&addSession->ex_data, &cacheSession->ex_data, + sizeof(WOLFSSL_CRYPTO_EX_DATA)); + } + /* else will be copied in wolfSSL_DupSession call */ + } + else if (cacheSession->ownExData) { + crypto_ex_cb_free_data(cacheSession, crypto_ex_cb_ctx_session, + &cacheSession->ex_data); + cacheSession->ownExData = 0; + } +#endif + + if (!overwrite) + EvictSessionFromCache(cacheSession); + + cacheSession->type = WOLFSSL_SESSION_TYPE_CACHE; + cacheSession->cacheRow = row; + +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + /* Save the peer field to free after unlocking the row */ + if (cacheSession->peer != NULL) + cachePeer = cacheSession->peer; + cacheSession->peer = NULL; +#endif +#ifdef HAVE_SESSION_TICKET + /* If we can reuse the existing buffer in cacheSession then we won't touch + * ticBuff at all making it a very cheap malloc/free. The page on a modern + * OS will most likely not even be allocated to the process. */ + if (ticBuff != NULL && cacheSession->ticketLenAlloc < ticLen) { + /* Save pointer only if separately allocated */ + if (cacheSession->ticket != cacheSession->staticTicket) + cacheTicBuff = cacheSession->ticket; + ticBuffUsed = 1; + cacheSession->ticket = ticBuff; + cacheSession->ticketLenAlloc = (word16) ticLen; + } +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + /* cache entry never used */ + if (cacheSession->ticketNonce.data == NULL) + cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic; + + if (cacheSession->ticketNonce.data != + cacheSession->ticketNonce.dataStatic) { + toFree = cacheSession->ticketNonce.data; + cacheSession->ticketNonce.data = cacheSession->ticketNonce.dataStatic; + cacheSession->ticketNonce.len = 0; + } +#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ +#endif +#ifdef SESSION_CERTS + if (overwrite && + addSession->chain.count == 0 && + cacheSession->chain.count > 0) { + /* Copy in the certs from the session */ + addSession->chain.count = cacheSession->chain.count; + XMEMCPY(addSession->chain.certs, cacheSession->chain.certs, + sizeof(x509_buffer) * cacheSession->chain.count); + } +#endif /* SESSION_CERTS */ +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + /* Don't copy the peer cert into cache */ + addPeer = addSession->peer; + addSession->peer = NULL; +#endif + cacheSession->heap = NULL; + /* Copy data into the cache object */ +#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ + defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + ret = wolfSSL_DupSessionEx(addSession, cacheSession, 1, preallocNonce, + &preallocNonceLen, &preallocNonceUsed) == WOLFSSL_FAILURE; +#else + ret = wolfSSL_DupSession(addSession, cacheSession, 1) == WOLFSSL_FAILURE; +#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC + && FIPS_VERSION_GE(5,3)*/ +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + addSession->peer = addPeer; +#endif + + if (ret == 0) { + if (!overwrite) { + /* Increment the totalCount and the nextIdx */ + if (sessRow->totalCount < SESSIONS_PER_ROW) + sessRow->totalCount++; + sessRow->nextIdx = (sessRow->nextIdx + 1) % SESSIONS_PER_ROW; + } + if (id != addSession->sessionID) { + /* ssl->session->sessionID may contain the bogus ID or we want the + * ID from the arrays object */ + XMEMCPY(cacheSession->sessionID, id, ID_LEN); + cacheSession->sessionIDSz = ID_LEN; + } +#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) + if (ctx->rem_sess_cb != NULL) + cacheSession->rem_sess_cb = ctx->rem_sess_cb; +#endif +#ifdef HAVE_EX_DATA + /* The session in cache now owns the ex_data */ + addSession->ownExData = 0; + cacheSession->ownExData = 1; +#endif +#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ + defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + if (preallocNonce != NULL && preallocNonceUsed) { + cacheSession->ticketNonce.data = preallocNonce; + cacheSession->ticketNonce.len = preallocNonceLen; + preallocNonce = NULL; + preallocNonceLen = 0; + } +#endif /* HAVE_SESSION_TICKET && WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC + * && FIPS_VERSION_GE(5,3)*/ + } +#ifdef HAVE_SESSION_TICKET + else if (ticBuffUsed) { + /* Error occurred. Need to clean up the ticket buffer. */ + cacheSession->ticket = cacheSession->staticTicket; + cacheSession->ticketLenAlloc = 0; + cacheSession->ticketLen = 0; + } +#endif + SESSION_ROW_UNLOCK(sessRow); + cacheSession = NULL; /* Can't access after unlocked */ + +#ifndef NO_CLIENT_CACHE + if (ret == 0 && clientCacheEntry != NULL) { + ClientSession* clientCache = AddSessionToClientCache(side, row, (int)idx, + addSession->serverID, addSession->idLen, id, useTicket); + if (clientCache != NULL) + *clientCacheEntry = clientCache; + } +#endif + +#ifdef HAVE_SESSION_TICKET + if (ticBuff != NULL && !ticBuffUsed) + XFREE(ticBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); + XFREE(cacheTicBuff, NULL, DYNAMIC_TYPE_SESSION_TICK); +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + XFREE(preallocNonce, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); + XFREE(toFree, addSession->heap, DYNAMIC_TYPE_SESSION_TICK); +#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ +#endif + +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + if (cachePeer != NULL) { + wolfSSL_X509_free(cachePeer); + cachePeer = NULL; /* Make sure not use after this point */ + } +#endif + + return ret; +} + +void AddSession(WOLFSSL* ssl) +{ + int error = 0; + const byte* id = NULL; + byte idSz = 0; + WOLFSSL_SESSION* session = ssl->session; + + (void)error; + + WOLFSSL_ENTER("AddSession"); + + if (SslSessionCacheOff(ssl, session)) { + WOLFSSL_MSG("Cache off"); + return; + } + + if (session->haveAltSessionID) { + id = session->altSessionID; + idSz = ID_LEN; + } + else { + id = session->sessionID; + idSz = session->sessionIDSz; + } + + /* Do this only for the client because if the server doesn't have an ID at + * this point, it won't on resumption. */ + if (idSz == 0 && ssl->options.side == WOLFSSL_CLIENT_END) { + WC_RNG* rng = NULL; + if (ssl->rng != NULL) + rng = ssl->rng; +#if defined(HAVE_GLOBAL_RNG) && defined(OPENSSL_EXTRA) + else if (initGlobalRNG == 1 || wolfSSL_RAND_Init() == WOLFSSL_SUCCESS) { + rng = &globalRNG; + } +#endif + if (wc_RNG_GenerateBlock(rng, ssl->session->altSessionID, + ID_LEN) != 0) + return; + ssl->session->haveAltSessionID = 1; + id = ssl->session->altSessionID; + idSz = ID_LEN; + } + +#ifdef HAVE_EXT_CACHE + if (!ssl->options.internalCacheOff) +#endif + { + /* Try to add the session to internal cache or external cache + if a new_sess_cb is set. Its ok if we don't succeed. */ + (void)AddSessionToCache(ssl->ctx, session, id, idSz, +#ifdef SESSION_INDEX + &ssl->sessionIndex, +#else + NULL, +#endif + ssl->options.side, +#ifdef HAVE_SESSION_TICKET + ssl->options.useTicket, +#else + 0, +#endif +#ifdef NO_SESSION_CACHE_REF + NULL +#else + (ssl->options.side == WOLFSSL_CLIENT_END) ? + &ssl->clientSession : NULL +#endif + ); + } + +#ifdef HAVE_EXT_CACHE + if (error == 0 && ssl->ctx->new_sess_cb != NULL) { + int cbRet = 0; + wolfSSL_SESSION_up_ref(session); + cbRet = ssl->ctx->new_sess_cb(ssl, session); + if (cbRet == 0) + wolfSSL_FreeSession(ssl->ctx, session); + } +#endif + +#if defined(WOLFSSL_SESSION_STATS) && defined(WOLFSSL_PEAK_SESSIONS) + if (error == 0) { + word32 active = 0; + + error = get_locked_session_stats(&active, NULL, NULL); + if (error == WOLFSSL_SUCCESS) { + error = 0; /* back to this function ok */ + + if (PeakSessions < active) { + PeakSessions = active; + } + } + } +#endif /* WOLFSSL_SESSION_STATS && WOLFSSL_PEAK_SESSIONS */ + (void)error; +} + + +#ifdef SESSION_INDEX + +int wolfSSL_GetSessionIndex(WOLFSSL* ssl) +{ + WOLFSSL_ENTER("wolfSSL_GetSessionIndex"); + WOLFSSL_LEAVE("wolfSSL_GetSessionIndex", ssl->sessionIndex); + return ssl->sessionIndex; +} + + +int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION* session) +{ + int row, col, result = WOLFSSL_FAILURE; + SessionRow* sessRow; + WOLFSSL_SESSION* cacheSession; + + WOLFSSL_ENTER("wolfSSL_GetSessionAtIndex"); + + session = ClientSessionToSession(session); + + row = idx >> SESSIDX_ROW_SHIFT; + col = idx & SESSIDX_IDX_MASK; + + if (session == NULL || + row < 0 || row >= SESSION_ROWS || col >= SESSIONS_PER_ROW) { + return WOLFSSL_FAILURE; + } + + sessRow = &SessionCache[row]; + if (SESSION_ROW_RD_LOCK(sessRow) != 0) { + return BAD_MUTEX_E; + } + +#ifdef SESSION_CACHE_DYNAMIC_MEM + cacheSession = sessRow->Sessions[col]; +#else + cacheSession = &sessRow->Sessions[col]; +#endif + if (cacheSession) { + XMEMCPY(session, cacheSession, sizeof(WOLFSSL_SESSION)); + result = WOLFSSL_SUCCESS; + } + else { + result = WOLFSSL_FAILURE; + } + + SESSION_ROW_UNLOCK(sessRow); + + WOLFSSL_LEAVE("wolfSSL_GetSessionAtIndex", result); + return result; +} + +#endif /* SESSION_INDEX */ + +#if defined(SESSION_CERTS) + +WOLFSSL_X509_CHAIN* wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION* session) +{ + WOLFSSL_X509_CHAIN* chain = NULL; + + WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain"); + + session = ClientSessionToSession(session); + + if (session) + chain = &session->chain; + + WOLFSSL_LEAVE("wolfSSL_SESSION_get_peer_chain", chain ? 1 : 0); + return chain; +} + + +#ifdef OPENSSL_EXTRA +/* gets the peer certificate associated with the session passed in + * returns null on failure, the caller should not free the returned pointer */ +WOLFSSL_X509* wolfSSL_SESSION_get0_peer(WOLFSSL_SESSION* session) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_get_peer_chain"); + + session = ClientSessionToSession(session); + if (session) { + int count; + + count = wolfSSL_get_chain_count(&session->chain); + if (count < 1 || count >= MAX_CHAIN_DEPTH) { + WOLFSSL_MSG("bad count found"); + return NULL; + } + + if (session->peer == NULL) { + session->peer = wolfSSL_get_chain_X509(&session->chain, 0); + } + return session->peer; + } + WOLFSSL_MSG("No session passed in"); + + return NULL; +} +#endif /* OPENSSL_EXTRA */ +#endif /* SESSION_INDEX && SESSION_CERTS */ + + +#ifdef WOLFSSL_SESSION_STATS + +static int get_locked_session_stats(word32* active, word32* total, word32* peak) +{ + int result = WOLFSSL_SUCCESS; + int i; + int count; + int idx; + word32 now = 0; + word32 seen = 0; + word32 ticks = LowResTimer(); + + WOLFSSL_ENTER("get_locked_session_stats"); + +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_RD_LOCK(&SessionCache[0]); +#endif + for (i = 0; i < SESSION_ROWS; i++) { + SessionRow* row = &SessionCache[i]; + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + if (SESSION_ROW_RD_LOCK(row) != 0) { + WOLFSSL_MSG("Session row cache mutex lock failed"); + return BAD_MUTEX_E; + } + #endif + + seen += row->totalCount; + + if (active == NULL) { + SESSION_ROW_UNLOCK(row); + continue; + } + + count = min((word32)row->totalCount, SESSIONS_PER_ROW); + idx = row->nextIdx - 1; + if (idx < 0 || idx >= SESSIONS_PER_ROW) { + idx = SESSIONS_PER_ROW - 1; /* if back to front previous was end */ + } + + for (; count > 0; --count) { + /* if not expired then good */ +#ifdef SESSION_CACHE_DYNAMIC_MEM + if (row->Sessions[idx] && + ticks < (row->Sessions[idx]->bornOn + + row->Sessions[idx]->timeout) ) +#else + if (ticks < (row->Sessions[idx].bornOn + + row->Sessions[idx].timeout) ) +#endif + { + now++; + } + + idx = idx > 0 ? idx - 1 : SESSIONS_PER_ROW - 1; + } + + #ifdef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(row); + #endif + } +#ifndef ENABLE_SESSION_CACHE_ROW_LOCK + SESSION_ROW_UNLOCK(&SessionCache[0]); +#endif + + if (active) { + *active = now; + } + if (total) { + *total = seen; + } + +#ifdef WOLFSSL_PEAK_SESSIONS + if (peak) { + *peak = PeakSessions; + } +#else + (void)peak; +#endif + + WOLFSSL_LEAVE("get_locked_session_stats", result); + + return result; +} + + +/* return WOLFSSL_SUCCESS on ok */ +int wolfSSL_get_session_stats(word32* active, word32* total, word32* peak, + word32* maxSessions) +{ + int result = WOLFSSL_SUCCESS; + + WOLFSSL_ENTER("wolfSSL_get_session_stats"); + + if (maxSessions) { + *maxSessions = SESSIONS_PER_ROW * SESSION_ROWS; + + if (active == NULL && total == NULL && peak == NULL) + return result; /* we're done */ + } + + /* user must provide at least one query value */ + if (active == NULL && total == NULL && peak == NULL) { + return BAD_FUNC_ARG; + } + + result = get_locked_session_stats(active, total, peak); + + WOLFSSL_LEAVE("wolfSSL_get_session_stats", result); + + return result; +} + +#endif /* WOLFSSL_SESSION_STATS */ + + + #ifdef PRINT_SESSION_STATS + + /* WOLFSSL_SUCCESS on ok */ + int wolfSSL_PrintSessionStats(void) + { + word32 totalSessionsSeen = 0; + word32 totalSessionsNow = 0; + word32 peak = 0; + word32 maxSessions = 0; + int i; + int ret; + double E; /* expected freq */ + double chiSquare = 0; + + ret = wolfSSL_get_session_stats(&totalSessionsNow, &totalSessionsSeen, + &peak, &maxSessions); + if (ret != WOLFSSL_SUCCESS) + return ret; + printf("Total Sessions Seen = %u\n", totalSessionsSeen); + printf("Total Sessions Now = %u\n", totalSessionsNow); +#ifdef WOLFSSL_PEAK_SESSIONS + printf("Peak Sessions = %u\n", peak); +#endif + printf("Max Sessions = %u\n", maxSessions); + + E = (double)totalSessionsSeen / SESSION_ROWS; + + for (i = 0; i < SESSION_ROWS; i++) { + double diff = SessionCache[i].totalCount - E; + diff *= diff; /* square */ + diff /= E; /* normalize */ + + chiSquare += diff; + } + printf(" chi-square = %5.1f, d.f. = %d\n", chiSquare, + SESSION_ROWS - 1); + #if (SESSION_ROWS == 11) + printf(" .05 p value = 18.3, chi-square should be less\n"); + #elif (SESSION_ROWS == 211) + printf(".05 p value = 244.8, chi-square should be less\n"); + #elif (SESSION_ROWS == 5981) + printf(".05 p value = 6161.0, chi-square should be less\n"); + #elif (SESSION_ROWS == 3) + printf(".05 p value = 6.0, chi-square should be less\n"); + #elif (SESSION_ROWS == 2861) + printf(".05 p value = 2985.5, chi-square should be less\n"); + #endif + printf("\n"); + + return ret; + } + + #endif /* SESSION_STATS */ + +#else /* NO_SESSION_CACHE */ + +WOLFSSL_SESSION* ClientSessionToSession(const WOLFSSL_SESSION* session) +{ + return (WOLFSSL_SESSION*)session; +} + +/* No session cache version */ +WOLFSSL_SESSION* wolfSSL_GetSession(WOLFSSL* ssl, byte* masterSecret, + byte restoreSessionCerts) +{ + (void)ssl; + (void)masterSecret; + (void)restoreSessionCerts; + + return NULL; +} + +#endif /* NO_SESSION_CACHE */ + +#ifdef OPENSSL_EXTRA + + /* returns previous set cache size which stays constant */ + long wolfSSL_CTX_sess_set_cache_size(WOLFSSL_CTX* ctx, long sz) + { + /* cache size fixed at compile time in wolfSSL */ + (void)ctx; + (void)sz; + WOLFSSL_MSG("session cache is set at compile time"); + #ifndef NO_SESSION_CACHE + return (long)(SESSIONS_PER_ROW * SESSION_ROWS); + #else + return 0; + #endif + } + + + long wolfSSL_CTX_sess_get_cache_size(WOLFSSL_CTX* ctx) + { + (void)ctx; + #ifndef NO_SESSION_CACHE + return (long)(SESSIONS_PER_ROW * SESSION_ROWS); + #else + return 0; + #endif + } + +#endif + +#ifndef NO_SESSION_CACHE +int wolfSSL_CTX_add_session(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session) +{ + int error = 0; + const byte* id = NULL; + byte idSz = 0; + + WOLFSSL_ENTER("wolfSSL_CTX_add_session"); + + session = ClientSessionToSession(session); + if (session == NULL) + return WOLFSSL_FAILURE; + + /* Session cache is global */ + (void)ctx; + + if (session->haveAltSessionID) { + id = session->altSessionID; + idSz = ID_LEN; + } + else { + id = session->sessionID; + idSz = session->sessionIDSz; + } + + error = AddSessionToCache(ctx, session, id, idSz, + NULL, session->side, +#ifdef HAVE_SESSION_TICKET + session->ticketLen > 0, +#else + 0, +#endif + NULL); + + return error == 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; +} +#endif + +#if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \ + defined(HAVE_EXT_CACHE)) +/* stunnel 4.28 needs + * + * Callback that is called if a session tries to resume but could not find + * the session to resume it. + */ +void wolfSSL_CTX_sess_set_get_cb(WOLFSSL_CTX* ctx, + WOLFSSL_SESSION*(*f)(WOLFSSL*, const unsigned char*, int, int*)) +{ + if (ctx == NULL) + return; + +#ifdef HAVE_EXT_CACHE + ctx->get_sess_cb = f; +#else + (void)f; +#endif +} + +void wolfSSL_CTX_sess_set_new_cb(WOLFSSL_CTX* ctx, + int (*f)(WOLFSSL*, WOLFSSL_SESSION*)) +{ + if (ctx == NULL) + return; + +#ifdef HAVE_EXT_CACHE + ctx->new_sess_cb = f; +#else + (void)f; +#endif +} + +void wolfSSL_CTX_sess_set_remove_cb(WOLFSSL_CTX* ctx, void (*f)(WOLFSSL_CTX*, + WOLFSSL_SESSION*)) +{ + if (ctx == NULL) + return; + +#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) + ctx->rem_sess_cb = f; +#else + (void)f; +#endif +} + + +/* + * + * Note: It is expected that the importing and exporting function have been + * built with the same settings. For example if session tickets was + * enabled with the wolfSSL library exporting a session then it is + * expected to be turned on with the wolfSSL library importing the + * session. + */ +int wolfSSL_i2d_SSL_SESSION(WOLFSSL_SESSION* sess, unsigned char** p) +{ + int size = 0; +#ifdef HAVE_EXT_CACHE + int idx = 0; +#ifdef SESSION_CERTS + int i; +#endif + + WOLFSSL_ENTER("wolfSSL_i2d_SSL_SESSION"); + + sess = ClientSessionToSession(sess); + if (sess == NULL) { + return BAD_FUNC_ARG; + } + + /* side | bornOn | timeout | sessionID len | sessionID | masterSecret | + * haveEMS */ + size += OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN + + sess->sessionIDSz + SECRET_LEN + OPAQUE8_LEN; + /* altSessionID */ + size += OPAQUE8_LEN + (sess->haveAltSessionID ? ID_LEN : 0); +#ifdef SESSION_CERTS + /* Peer chain */ + size += OPAQUE8_LEN; + for (i = 0; i < sess->chain.count; i++) + size += OPAQUE16_LEN + sess->chain.certs[i].length; +#endif +#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET)) + /* Protocol version */ + size += OPAQUE16_LEN; +#endif +#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ + (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) + /* cipher suite */ + size += OPAQUE16_LEN; +#endif +#ifndef NO_CLIENT_CACHE + /* ServerID len | ServerID */ + size += OPAQUE16_LEN + sess->idLen; +#endif +#ifdef WOLFSSL_SESSION_ID_CTX + /* session context ID len | session context ID */ + size += OPAQUE8_LEN + sess->sessionCtxSz; +#endif +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + /* peerVerifyRet */ + size += OPAQUE8_LEN; +#endif +#ifdef WOLFSSL_TLS13 + /* namedGroup */ + size += OPAQUE16_LEN; +#endif +#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) +#ifdef WOLFSSL_TLS13 +#ifdef WOLFSSL_32BIT_MILLI_TIME + /* ticketSeen | ticketAdd */ + size += OPAQUE32_LEN + OPAQUE32_LEN; +#else + /* ticketSeen Hi 32 bits | ticketSeen Lo 32 bits | ticketAdd */ + size += OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE32_LEN; +#endif + /* ticketNonce */ + size += OPAQUE8_LEN + sess->ticketNonce.len; +#endif +#ifdef WOLFSSL_EARLY_DATA + size += OPAQUE32_LEN; +#endif +#endif +#ifdef HAVE_SESSION_TICKET + /* ticket len | ticket */ + size += OPAQUE16_LEN + sess->ticketLen; +#endif + + if (p != NULL) { + unsigned char *data; + + if (*p == NULL) + *p = (unsigned char*)XMALLOC(size, NULL, DYNAMIC_TYPE_OPENSSL); + if (*p == NULL) + return 0; + data = *p; + + data[idx++] = sess->side; + c32toa(sess->bornOn, data + idx); idx += OPAQUE32_LEN; + c32toa(sess->timeout, data + idx); idx += OPAQUE32_LEN; + data[idx++] = sess->sessionIDSz; + XMEMCPY(data + idx, sess->sessionID, sess->sessionIDSz); + idx += sess->sessionIDSz; + XMEMCPY(data + idx, sess->masterSecret, SECRET_LEN); idx += SECRET_LEN; + data[idx++] = (byte)sess->haveEMS; + data[idx++] = sess->haveAltSessionID ? ID_LEN : 0; + if (sess->haveAltSessionID) { + XMEMCPY(data + idx, sess->altSessionID, ID_LEN); + idx += ID_LEN; + } +#ifdef SESSION_CERTS + data[idx++] = (byte)sess->chain.count; + for (i = 0; i < sess->chain.count; i++) { + c16toa((word16)sess->chain.certs[i].length, data + idx); + idx += OPAQUE16_LEN; + XMEMCPY(data + idx, sess->chain.certs[i].buffer, + sess->chain.certs[i].length); + idx += sess->chain.certs[i].length; + } +#endif +#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET)) + data[idx++] = sess->version.major; + data[idx++] = sess->version.minor; +#endif +#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ + (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) + data[idx++] = sess->cipherSuite0; + data[idx++] = sess->cipherSuite; +#endif +#ifndef NO_CLIENT_CACHE + c16toa(sess->idLen, data + idx); idx += OPAQUE16_LEN; + XMEMCPY(data + idx, sess->serverID, sess->idLen); + idx += sess->idLen; +#endif +#ifdef WOLFSSL_SESSION_ID_CTX + data[idx++] = sess->sessionCtxSz; + XMEMCPY(data + idx, sess->sessionCtx, sess->sessionCtxSz); + idx += sess->sessionCtxSz; +#endif +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + data[idx++] = sess->peerVerifyRet; +#endif +#ifdef WOLFSSL_TLS13 + c16toa(sess->namedGroup, data + idx); + idx += OPAQUE16_LEN; +#endif +#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) +#ifdef WOLFSSL_TLS13 +#ifdef WOLFSSL_32BIT_MILLI_TIME + c32toa(sess->ticketSeen, data + idx); + idx += OPAQUE32_LEN; +#else + c32toa((word32)(sess->ticketSeen >> 32), data + idx); + idx += OPAQUE32_LEN; + c32toa((word32)sess->ticketSeen, data + idx); + idx += OPAQUE32_LEN; +#endif + c32toa(sess->ticketAdd, data + idx); + idx += OPAQUE32_LEN; + data[idx++] = sess->ticketNonce.len; + XMEMCPY(data + idx, sess->ticketNonce.data, sess->ticketNonce.len); + idx += sess->ticketNonce.len; +#endif +#ifdef WOLFSSL_EARLY_DATA + c32toa(sess->maxEarlyDataSz, data + idx); + idx += OPAQUE32_LEN; +#endif +#endif +#ifdef HAVE_SESSION_TICKET + c16toa(sess->ticketLen, data + idx); idx += OPAQUE16_LEN; + XMEMCPY(data + idx, sess->ticket, sess->ticketLen); + idx += sess->ticketLen; +#endif + } +#endif + + (void)sess; + (void)p; +#ifdef HAVE_EXT_CACHE + (void)idx; +#endif + + return size; +} + + +/* TODO: no function to free new session. + * + * Note: It is expected that the importing and exporting function have been + * built with the same settings. For example if session tickets was + * enabled with the wolfSSL library exporting a session then it is + * expected to be turned on with the wolfSSL library importing the + * session. + */ +WOLFSSL_SESSION* wolfSSL_d2i_SSL_SESSION(WOLFSSL_SESSION** sess, + const unsigned char** p, long i) +{ + WOLFSSL_SESSION* s = NULL; + int ret = 0; +#if defined(HAVE_EXT_CACHE) + int idx = 0; + byte* data; +#ifdef SESSION_CERTS + int j; + word16 length; +#endif +#endif /* HAVE_EXT_CACHE */ + + (void)p; + (void)i; + (void)ret; + (void)sess; + +#ifdef HAVE_EXT_CACHE + if (p == NULL || *p == NULL) + return NULL; + + s = wolfSSL_SESSION_new(); + if (s == NULL) + return NULL; + + idx = 0; + data = (byte*)*p; + + /* side | bornOn | timeout | sessionID len */ + if (i < OPAQUE8_LEN + OPAQUE32_LEN + OPAQUE32_LEN + OPAQUE8_LEN) { + ret = BUFFER_ERROR; + goto end; + } + s->side = data[idx++]; + ato32(data + idx, &s->bornOn); idx += OPAQUE32_LEN; + ato32(data + idx, &s->timeout); idx += OPAQUE32_LEN; + s->sessionIDSz = data[idx++]; + + /* sessionID | secret | haveEMS | haveAltSessionID */ + if (i - idx < s->sessionIDSz + SECRET_LEN + OPAQUE8_LEN + OPAQUE8_LEN) { + ret = BUFFER_ERROR; + goto end; + } + XMEMCPY(s->sessionID, data + idx, s->sessionIDSz); + idx += s->sessionIDSz; + XMEMCPY(s->masterSecret, data + idx, SECRET_LEN); idx += SECRET_LEN; + s->haveEMS = data[idx++]; + if (data[idx] != ID_LEN && data[idx] != 0) { + ret = BUFFER_ERROR; + goto end; + } + s->haveAltSessionID = data[idx++] == ID_LEN; + + /* altSessionID */ + if (s->haveAltSessionID) { + if (i - idx < ID_LEN) { + ret = BUFFER_ERROR; + goto end; + } + XMEMCPY(s->altSessionID, data + idx, ID_LEN); idx += ID_LEN; + } + +#ifdef SESSION_CERTS + /* Certificate chain */ + if (i - idx == 0) { + ret = BUFFER_ERROR; + goto end; + } + s->chain.count = data[idx++]; + for (j = 0; j < s->chain.count; j++) { + if (i - idx < OPAQUE16_LEN) { + ret = BUFFER_ERROR; + goto end; + } + ato16(data + idx, &length); idx += OPAQUE16_LEN; + s->chain.certs[j].length = length; + if (i - idx < length) { + ret = BUFFER_ERROR; + goto end; + } + XMEMCPY(s->chain.certs[j].buffer, data + idx, length); + idx += length; + } +#endif +#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET)) + /* Protocol Version */ + if (i - idx < OPAQUE16_LEN) { + ret = BUFFER_ERROR; + goto end; + } + s->version.major = data[idx++]; + s->version.minor = data[idx++]; +#endif +#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ + (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) + /* Cipher suite */ + if (i - idx < OPAQUE16_LEN) { + ret = BUFFER_ERROR; + goto end; + } + s->cipherSuite0 = data[idx++]; + s->cipherSuite = data[idx++]; +#endif +#ifndef NO_CLIENT_CACHE + /* ServerID len */ + if (i - idx < OPAQUE16_LEN) { + ret = BUFFER_ERROR; + goto end; + } + ato16(data + idx, &s->idLen); idx += OPAQUE16_LEN; + + /* ServerID */ + if (i - idx < s->idLen) { + ret = BUFFER_ERROR; + goto end; + } + XMEMCPY(s->serverID, data + idx, s->idLen); idx += s->idLen; +#endif +#ifdef WOLFSSL_SESSION_ID_CTX + /* byte for length of session context ID */ + if (i - idx < OPAQUE8_LEN) { + ret = BUFFER_ERROR; + goto end; + } + s->sessionCtxSz = data[idx++]; + + /* app session context ID */ + if (i - idx < s->sessionCtxSz) { + ret = BUFFER_ERROR; + goto end; + } + XMEMCPY(s->sessionCtx, data + idx, s->sessionCtxSz); idx += s->sessionCtxSz; +#endif +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + /* byte for peerVerifyRet */ + if (i - idx < OPAQUE8_LEN) { + ret = BUFFER_ERROR; + goto end; + } + s->peerVerifyRet = data[idx++]; +#endif +#ifdef WOLFSSL_TLS13 + if (i - idx < OPAQUE16_LEN) { + ret = BUFFER_ERROR; + goto end; + } + ato16(data + idx, &s->namedGroup); + idx += OPAQUE16_LEN; +#endif +#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) +#ifdef WOLFSSL_TLS13 + if (i - idx < (OPAQUE32_LEN * 2)) { + ret = BUFFER_ERROR; + goto end; + } +#ifdef WOLFSSL_32BIT_MILLI_TIME + ato32(data + idx, &s->ticketSeen); + idx += OPAQUE32_LEN; +#else + { + word32 seenHi, seenLo; + + ato32(data + idx, &seenHi); + idx += OPAQUE32_LEN; + ato32(data + idx, &seenLo); + idx += OPAQUE32_LEN; + s->ticketSeen = ((sword64)seenHi << 32) + seenLo; + } +#endif + ato32(data + idx, &s->ticketAdd); + idx += OPAQUE32_LEN; + if (i - idx < OPAQUE8_LEN) { + ret = BUFFER_ERROR; + goto end; + } + s->ticketNonce.len = data[idx++]; + + if (i - idx < s->ticketNonce.len) { + ret = BUFFER_ERROR; + goto end; + } +#if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + ret = SessionTicketNoncePopulate(s, data + idx, s->ticketNonce.len); + if (ret != 0) + goto end; +#else + if (s->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ) { + ret = BUFFER_ERROR; + goto end; + } + XMEMCPY(s->ticketNonce.data, data + idx, s->ticketNonce.len); +#endif /* defined(WOLFSSL_TICKET_NONCE_MALLOC) && FIPS_VERSION_GE(5,3) */ + + idx += s->ticketNonce.len; +#endif +#ifdef WOLFSSL_EARLY_DATA + if (i - idx < OPAQUE32_LEN) { + ret = BUFFER_ERROR; + goto end; + } + ato32(data + idx, &s->maxEarlyDataSz); + idx += OPAQUE32_LEN; +#endif +#endif +#ifdef HAVE_SESSION_TICKET + /* ticket len */ + if (i - idx < OPAQUE16_LEN) { + ret = BUFFER_ERROR; + goto end; + } + ato16(data + idx, &s->ticketLen); idx += OPAQUE16_LEN; + + /* Dispose of ol dynamic ticket and ensure space for new ticket. */ + if (s->ticketLenAlloc > 0) { + XFREE(s->ticket, NULL, DYNAMIC_TYPE_SESSION_TICK); + } + if (s->ticketLen <= SESSION_TICKET_LEN) + s->ticket = s->staticTicket; + else { + s->ticket = (byte*)XMALLOC(s->ticketLen, NULL, + DYNAMIC_TYPE_SESSION_TICK); + if (s->ticket == NULL) { + ret = MEMORY_ERROR; + goto end; + } + s->ticketLenAlloc = (word16)s->ticketLen; + } + + /* ticket */ + if (i - idx < s->ticketLen) { + ret = BUFFER_ERROR; + goto end; + } + XMEMCPY(s->ticket, data + idx, s->ticketLen); idx += s->ticketLen; +#endif + (void)idx; + + if (sess != NULL) { + *sess = s; + } + + s->isSetup = 1; + + *p += idx; + +end: + if (ret != 0 && (sess == NULL || *sess != s)) { + wolfSSL_FreeSession(NULL, s); + s = NULL; + } +#endif /* HAVE_EXT_CACHE */ + return s; +} + +/* Check if there is a session ticket associated with this WOLFSSL_SESSION. + * + * sess - pointer to WOLFSSL_SESSION struct + * + * Returns 1 if has session ticket, otherwise 0 */ +int wolfSSL_SESSION_has_ticket(const WOLFSSL_SESSION* sess) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_has_ticket"); +#ifdef HAVE_SESSION_TICKET + sess = ClientSessionToSession(sess); + if (sess) { + if ((sess->ticketLen > 0) && (sess->ticket != NULL)) { + return WOLFSSL_SUCCESS; + } + } +#else + (void)sess; +#endif + return WOLFSSL_FAILURE; +} + +unsigned long wolfSSL_SESSION_get_ticket_lifetime_hint( + const WOLFSSL_SESSION* sess) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_get_ticket_lifetime_hint"); + sess = ClientSessionToSession(sess); + if (sess) { + return sess->timeout; + } + return 0; +} + +long wolfSSL_SESSION_get_timeout(const WOLFSSL_SESSION* sess) +{ + long timeout = 0; + WOLFSSL_ENTER("wolfSSL_SESSION_get_timeout"); + sess = ClientSessionToSession(sess); + if (sess) + timeout = sess->timeout; + return timeout; +} + +long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t) +{ + word32 tmptime; + + ses = ClientSessionToSession(ses); + if (ses == NULL || t < 0) { + return BAD_FUNC_ARG; + } + + tmptime = t & 0xFFFFFFFF; + ses->timeout = tmptime; + + return WOLFSSL_SUCCESS; +} + +long wolfSSL_SESSION_get_time(const WOLFSSL_SESSION* sess) +{ + long bornOn = 0; + WOLFSSL_ENTER("wolfSSL_SESSION_get_time"); + sess = ClientSessionToSession(sess); + if (sess) + bornOn = sess->bornOn; + return bornOn; +} + +long wolfSSL_SESSION_set_time(WOLFSSL_SESSION *ses, long t) +{ + + ses = ClientSessionToSession(ses); + if (ses == NULL || t < 0) { + return 0; + } + ses->bornOn = (word32)t; + return t; +} + +#endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */ + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \ + defined(HAVE_EX_DATA) + +#if defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE) +static void SESSION_ex_data_cache_update(WOLFSSL_SESSION* session, int idx, + void* data, byte get, void** getRet, int* setRet) +{ + int row; + int i; + int error = 0; + SessionRow* sessRow = NULL; + const byte* id; + byte foundCache = 0; + + if (getRet != NULL) + *getRet = NULL; + if (setRet != NULL) + *setRet = WOLFSSL_FAILURE; + + id = session->sessionID; + if (session->haveAltSessionID) + id = session->altSessionID; + + row = (int)(HashObject(id, ID_LEN, &error) % SESSION_ROWS); + if (error != 0) { + WOLFSSL_MSG("Hash session failed"); + return; + } + + sessRow = &SessionCache[row]; + if (get) + error = SESSION_ROW_RD_LOCK(sessRow); + else + error = SESSION_ROW_WR_LOCK(sessRow); + if (error != 0) { + WOLFSSL_MSG("Session row lock failed"); + return; + } + + for (i = 0; i < SESSIONS_PER_ROW && i < sessRow->totalCount; i++) { + WOLFSSL_SESSION* cacheSession; +#ifdef SESSION_CACHE_DYNAMIC_MEM + cacheSession = sessRow->Sessions[i]; +#else + cacheSession = &sessRow->Sessions[i]; +#endif + if (cacheSession && + XMEMCMP(id, cacheSession->sessionID, ID_LEN) == 0 + && session->side == cacheSession->side + #if defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET) + && (IsAtLeastTLSv1_3(session->version) == + IsAtLeastTLSv1_3(cacheSession->version)) + #endif + ) { + if (get) { + if (getRet) { + *getRet = wolfSSL_CRYPTO_get_ex_data( + &cacheSession->ex_data, idx); + } + } + else { + if (setRet) { + *setRet = wolfSSL_CRYPTO_set_ex_data( + &cacheSession->ex_data, idx, data); + } + } + foundCache = 1; + break; + } + } + SESSION_ROW_UNLOCK(sessRow); + /* If we don't have a session in cache then clear the ex_data and + * own it */ + if (!foundCache) { + XMEMSET(&session->ex_data, 0, sizeof(WOLFSSL_CRYPTO_EX_DATA)); + session->ownExData = 1; + if (!get) { + *setRet = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, + data); + } + } + +} +#endif + +#endif + +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) \ + || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) + +#ifndef NO_SESSION_CACHE +int wolfSSL_SSL_CTX_remove_session(WOLFSSL_CTX *ctx, WOLFSSL_SESSION *s) +{ +#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) + int rem_called = FALSE; +#endif + + WOLFSSL_ENTER("wolfSSL_SSL_CTX_remove_session"); + + s = ClientSessionToSession(s); + if (ctx == NULL || s == NULL) + return BAD_FUNC_ARG; + +#ifdef HAVE_EXT_CACHE + if (!ctx->internalCacheOff) +#endif + { + const byte* id; + WOLFSSL_SESSION *sess = NULL; + word32 row = 0; + int ret; + + id = s->sessionID; + if (s->haveAltSessionID) + id = s->altSessionID; + + ret = TlsSessionCacheGetAndWrLock(id, &sess, &row, ctx->method->side); + if (ret == 0 && sess != NULL) { +#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) + if (sess->rem_sess_cb != NULL) { + rem_called = TRUE; + } +#endif + /* Call this before changing ownExData so that calls to ex_data + * don't try to access the SessionCache again. */ + EvictSessionFromCache(sess); +#ifdef HAVE_EX_DATA + if (sess->ownExData) { + /* Most recent version of ex data is in cache. Copy it + * over so the user can free it. */ + XMEMCPY(&s->ex_data, &sess->ex_data, + sizeof(WOLFSSL_CRYPTO_EX_DATA)); + s->ownExData = 1; + sess->ownExData = 0; + } +#endif +#ifdef SESSION_CACHE_DYNAMIC_MEM + { + /* Find and clear entry. Row is locked so we are good to go. */ + int idx; + for (idx = 0; idx < SESSIONS_PER_ROW; idx++) { + if (sess == SessionCache[row].Sessions[idx]) { + XFREE(sess, sess->heap, DYNAMIC_TYPE_SESSION); + SessionCache[row].Sessions[idx] = NULL; + break; + } + } + } +#endif + TlsSessionCacheUnlockRow(row); + } + } + +#if defined(HAVE_EXT_CACHE) || defined(HAVE_EX_DATA) + if (ctx->rem_sess_cb != NULL && !rem_called) { + ctx->rem_sess_cb(ctx, s); + } +#endif + + /* s cannot be resumed at this point */ + s->timeout = 0; + + return 0; +} + +WOLFSSL_SESSION *wolfSSL_SSL_get0_session(const WOLFSSL *ssl) +{ + WOLFSSL_ENTER("wolfSSL_SSL_get0_session"); + + return ssl->session; +} + +#endif /* NO_SESSION_CACHE */ + +#endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || + OPENSSL_EXTRA || HAVE_LIGHTY */ + +#ifdef WOLFSSL_SESSION_EXPORT +/* Used to import a serialized TLS session. + * WARNING: buf contains sensitive information about the state and is best to be + * encrypted before storing if stored. + * + * @param ssl WOLFSSL structure to import the session into + * @param buf serialized session + * @param sz size of buffer 'buf' + * @return the number of bytes read from buffer 'buf' + */ +int wolfSSL_tls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz) +{ + if (ssl == NULL || buf == NULL) { + return BAD_FUNC_ARG; + } + return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS); +} + + +/* Used to export a serialized TLS session. + * WARNING: buf contains sensitive information about the state and is best to be + * encrypted before storing if stored. + * + * @param ssl WOLFSSL structure to export the session from + * @param buf output of serialized session + * @param sz size in bytes set in 'buf' + * @return the number of bytes written into buffer 'buf' + */ +int wolfSSL_tls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz) +{ + if (ssl == NULL || sz == NULL) { + return BAD_FUNC_ARG; + } + return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_TLS); +} + +#ifdef WOLFSSL_DTLS +int wolfSSL_dtls_import(WOLFSSL* ssl, const unsigned char* buf, unsigned int sz) +{ + WOLFSSL_ENTER("wolfSSL_session_import"); + + if (ssl == NULL || buf == NULL) { + return BAD_FUNC_ARG; + } + + /* sanity checks on buffer and protocol are done in internal function */ + return wolfSSL_session_import_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS); +} + + +/* Sets the function to call for serializing the session. This function is + * called right after the handshake is completed. */ +int wolfSSL_CTX_dtls_set_export(WOLFSSL_CTX* ctx, wc_dtls_export func) +{ + + WOLFSSL_ENTER("wolfSSL_CTX_dtls_set_export"); + + /* purposefully allow func to be NULL */ + if (ctx == NULL) { + return BAD_FUNC_ARG; + } + + ctx->dtls_export = func; + + return WOLFSSL_SUCCESS; +} + +/* Sets the function in WOLFSSL struct to call for serializing the session. This + * function is called right after the handshake is completed. */ +int wolfSSL_dtls_set_export(WOLFSSL* ssl, wc_dtls_export func) +{ + + WOLFSSL_ENTER("wolfSSL_dtls_set_export"); + + /* purposefully allow func to be NULL */ + if (ssl == NULL) { + return BAD_FUNC_ARG; + } + + ssl->dtls_export = func; + + return WOLFSSL_SUCCESS; +} + + +/* This function allows for directly serializing a session rather than using + * callbacks. It has less overhead by removing a temporary buffer and gives + * control over when the session gets serialized. When using callbacks the + * session is always serialized immediately after the handshake is finished. + * + * buf is the argument to contain the serialized session + * sz is the size of the buffer passed in + * ssl is the WOLFSSL struct to serialize + * returns the size of serialized session on success, 0 on no action, and + * negative value on error */ +int wolfSSL_dtls_export(WOLFSSL* ssl, unsigned char* buf, unsigned int* sz) +{ + WOLFSSL_ENTER("wolfSSL_dtls_export"); + + if (ssl == NULL || sz == NULL) { + return BAD_FUNC_ARG; + } + + if (buf == NULL) { + *sz = MAX_EXPORT_BUFFER; + return 0; + } + + /* if not DTLS do nothing */ + if (!ssl->options.dtls) { + WOLFSSL_MSG("Currently only DTLS export is supported"); + return 0; + } + + /* copy over keys, options, and dtls state struct */ + return wolfSSL_session_export_internal(ssl, buf, sz, WOLFSSL_EXPORT_DTLS); +} + + +/* This function is similar to wolfSSL_dtls_export but only exports the portion + * of the WOLFSSL structure related to the state of the connection, i.e. peer + * sequence number, epoch, AEAD state etc. + * + * buf is the argument to contain the serialized state, if null then set "sz" to + * buffer size required + * sz is the size of the buffer passed in + * ssl is the WOLFSSL struct to serialize + * returns the size of serialized session on success, 0 on no action, and + * negative value on error */ +int wolfSSL_dtls_export_state_only(WOLFSSL* ssl, unsigned char* buf, + unsigned int* sz) +{ + WOLFSSL_ENTER("wolfSSL_dtls_export_state_only"); + + if (ssl == NULL || sz == NULL) { + return BAD_FUNC_ARG; + } + + if (buf == NULL) { + *sz = MAX_EXPORT_STATE_BUFFER; + return 0; + } + + /* if not DTLS do nothing */ + if (!ssl->options.dtls) { + WOLFSSL_MSG("Currently only DTLS export state is supported"); + return 0; + } + + /* copy over keys, options, and dtls state struct */ + return wolfSSL_dtls_export_state_internal(ssl, buf, *sz); +} + + +/* returns 0 on success */ +int wolfSSL_send_session(WOLFSSL* ssl) +{ + int ret; + byte* buf; + word32 bufSz = MAX_EXPORT_BUFFER; + + WOLFSSL_ENTER("wolfSSL_send_session"); + + if (ssl == NULL) { + return BAD_FUNC_ARG; + } + + buf = (byte*)XMALLOC(bufSz, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (buf == NULL) { + return MEMORY_E; + } + + /* if not DTLS do nothing */ + if (!ssl->options.dtls) { + XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + WOLFSSL_MSG("Currently only DTLS export is supported"); + return 0; + } + + /* copy over keys, options, and dtls state struct */ + ret = wolfSSL_session_export_internal(ssl, buf, &bufSz, + WOLFSSL_EXPORT_DTLS); + if (ret < 0) { + XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + return ret; + } + + /* if no error ret has size of buffer */ + ret = ssl->dtls_export(ssl, buf, ret, NULL); + if (ret != WOLFSSL_SUCCESS) { + XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + return ret; + } + + XFREE(buf, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + return 0; +} +#endif /* WOLFSSL_DTLS */ +#endif /* WOLFSSL_SESSION_EXPORT */ + +#ifdef OPENSSL_EXTRA + +/* Copies the master secret over to out buffer. If outSz is 0 returns the size + * of master secret. + * + * ses : a session from completed TLS/SSL handshake + * out : buffer to hold copy of master secret + * outSz : size of out buffer + * returns : number of bytes copied into out buffer on success + * less then or equal to 0 is considered a failure case + */ +int wolfSSL_SESSION_get_master_key(const WOLFSSL_SESSION* ses, + unsigned char* out, int outSz) +{ + int size; + + ses = ClientSessionToSession(ses); + + if (outSz == 0) { + return SECRET_LEN; + } + + if (ses == NULL || out == NULL || outSz < 0) { + return 0; + } + + if (outSz > SECRET_LEN) { + size = SECRET_LEN; + } + else { + size = outSz; + } + + XMEMCPY(out, ses->masterSecret, size); + return size; +} + + +int wolfSSL_SESSION_get_master_key_length(const WOLFSSL_SESSION* ses) +{ + (void)ses; + return SECRET_LEN; +} + +#ifdef WOLFSSL_EARLY_DATA +unsigned int wolfSSL_SESSION_get_max_early_data(const WOLFSSL_SESSION *session) +{ + return session->maxEarlyDataSz; +} +#endif /* WOLFSSL_EARLY_DATA */ + +#endif /* OPENSSL_EXTRA */ + +void SetupSession(WOLFSSL* ssl) +{ + WOLFSSL_SESSION* session = ssl->session; + + WOLFSSL_ENTER("SetupSession"); + + if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) { + /* Make sure the session ID is available when the user calls any + * get_session API */ + if (!session->haveAltSessionID) { + XMEMCPY(session->sessionID, ssl->arrays->sessionID, ID_LEN); + session->sessionIDSz = ssl->arrays->sessionIDSz; + } + else { + XMEMCPY(session->sessionID, session->altSessionID, ID_LEN); + session->sessionIDSz = ID_LEN; + } + } + session->side = (byte)ssl->options.side; + if (!IsAtLeastTLSv1_3(ssl->version) && ssl->arrays != NULL) + XMEMCPY(session->masterSecret, ssl->arrays->masterSecret, SECRET_LEN); + session->haveEMS = ssl->options.haveEMS; +#ifdef WOLFSSL_SESSION_ID_CTX + /* If using compatibility layer then check for and copy over session context + * id. */ + if (ssl->sessionCtxSz > 0 && ssl->sessionCtxSz < ID_LEN) { + XMEMCPY(ssl->session->sessionCtx, ssl->sessionCtx, ssl->sessionCtxSz); + session->sessionCtxSz = ssl->sessionCtxSz; + } +#endif + session->timeout = ssl->timeout; +#ifndef NO_ASN_TIME + session->bornOn = LowResTimer(); +#endif +#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET)) + session->version = ssl->version; +#endif +#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ + (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) + session->cipherSuite0 = ssl->options.cipherSuite0; + session->cipherSuite = ssl->options.cipherSuite; +#endif +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) + session->peerVerifyRet = (byte)ssl->peerVerifyRet; +#endif + session->isSetup = 1; +} + +#ifdef WOLFSSL_SESSION_ID_CTX + /* Storing app session context id, this value is inherited by WOLFSSL + * objects created from WOLFSSL_CTX. Any session that is imported with a + * different session context id will be rejected. + * + * ctx structure to set context in + * sid_ctx value of context to set + * sid_ctx_len length of sid_ctx buffer + * + * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing + */ + int wolfSSL_CTX_set_session_id_context(WOLFSSL_CTX* ctx, + const unsigned char* sid_ctx, + unsigned int sid_ctx_len) + { + WOLFSSL_ENTER("wolfSSL_CTX_set_session_id_context"); + + /* No application specific context needed for wolfSSL */ + if (sid_ctx_len > ID_LEN || ctx == NULL || sid_ctx == NULL) { + return WOLFSSL_FAILURE; + } + XMEMCPY(ctx->sessionCtx, sid_ctx, sid_ctx_len); + ctx->sessionCtxSz = (byte)sid_ctx_len; + + return WOLFSSL_SUCCESS; + } + + + + /* Storing app session context id. Any session that is imported with a + * different session context id will be rejected. + * + * ssl structure to set context in + * id value of context to set + * len length of sid_ctx buffer + * + * Returns WOLFSSL_SUCCESS in success case and WOLFSSL_FAILURE when failing + */ + int wolfSSL_set_session_id_context(WOLFSSL* ssl, const unsigned char* id, + unsigned int len) + { + WOLFSSL_ENTER("wolfSSL_set_session_id_context"); + + if (len > ID_LEN || ssl == NULL || id == NULL) { + return WOLFSSL_FAILURE; + } + XMEMCPY(ssl->sessionCtx, id, len); + ssl->sessionCtxSz = (byte)len; + + return WOLFSSL_SUCCESS; + } +#endif + +/* return a new malloc'd session with default settings on success */ +WOLFSSL_SESSION* wolfSSL_NewSession(void* heap) +{ + WOLFSSL_SESSION* ret = NULL; + + WOLFSSL_ENTER("wolfSSL_NewSession"); + + ret = (WOLFSSL_SESSION*)XMALLOC(sizeof(WOLFSSL_SESSION), heap, + DYNAMIC_TYPE_SESSION); + if (ret != NULL) { + int err; + XMEMSET(ret, 0, sizeof(WOLFSSL_SESSION)); + wolfSSL_RefInit(&ret->ref, &err); + #ifdef WOLFSSL_REFCNT_ERROR_RETURN + if (err != 0) { + WOLFSSL_MSG("Error setting up session reference mutex"); + XFREE(ret, ret->heap, DYNAMIC_TYPE_SESSION); + return NULL; + } + #else + (void)err; + #endif +#ifndef NO_SESSION_CACHE + ret->cacheRow = INVALID_SESSION_ROW; /* not in cache */ +#endif + ret->type = WOLFSSL_SESSION_TYPE_HEAP; + ret->heap = heap; +#ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Add("SESSION master secret", ret->masterSecret, SECRET_LEN); + wc_MemZero_Add("SESSION id", ret->sessionID, ID_LEN); +#endif + #ifdef HAVE_SESSION_TICKET + ret->ticket = ret->staticTicket; + #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + ret->ticketNonce.data = ret->ticketNonce.dataStatic; + #endif + #endif +#ifdef HAVE_EX_DATA + ret->ownExData = 1; + if (crypto_ex_cb_ctx_session != NULL) { + crypto_ex_cb_setup_new_data(ret, crypto_ex_cb_ctx_session, + &ret->ex_data); + } +#endif + } + return ret; +} + + +WOLFSSL_SESSION* wolfSSL_SESSION_new_ex(void* heap) +{ + return wolfSSL_NewSession(heap); +} + +WOLFSSL_SESSION* wolfSSL_SESSION_new(void) +{ + return wolfSSL_SESSION_new_ex(NULL); +} + +/* add one to session reference count + * return WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on error */ +int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session) +{ + int ret; + + session = ClientSessionToSession(session); + + if (session == NULL || session->type != WOLFSSL_SESSION_TYPE_HEAP) + return WOLFSSL_FAILURE; + + wolfSSL_RefInc(&session->ref, &ret); +#ifdef WOLFSSL_REFCNT_ERROR_RETURN + if (ret != 0) { + WOLFSSL_MSG("Failed to lock session mutex"); + return WOLFSSL_FAILURE; + } +#else + (void)ret; +#endif + + return WOLFSSL_SUCCESS; +} + +/** + * Deep copy the contents from input to output. + * @param input The source of the copy. + * @param output The destination of the copy. + * @param avoidSysCalls If true, then system calls will be avoided or an error + * will be returned if it is not possible to proceed + * without a system call. This is useful for fetching + * sessions from cache. When a cache row is locked, we + * don't want to block other threads with long running + * system calls. + * @param ticketNonceBuf If not null and @avoidSysCalls is true, the copy of the + * ticketNonce will happen in this pre allocated buffer + * @param ticketNonceLen @ticketNonceBuf len as input, used length on output + * @param ticketNonceUsed if @ticketNonceBuf was used to copy the ticket noncet + * @return WOLFSSL_SUCCESS on success + * WOLFSSL_FAILURE on failure + */ +static int wolfSSL_DupSessionEx(const WOLFSSL_SESSION* input, + WOLFSSL_SESSION* output, int avoidSysCalls, byte* ticketNonceBuf, + byte* ticketNonceLen, byte* preallocUsed) +{ +#ifdef HAVE_SESSION_TICKET + int ticLenAlloc = 0; + byte *ticBuff = NULL; +#endif + const size_t copyOffset = OFFSETOF(WOLFSSL_SESSION, heap) + + sizeof(input->heap); + int ret = WOLFSSL_SUCCESS; + + (void)avoidSysCalls; + (void)ticketNonceBuf; + (void)ticketNonceLen; + (void)preallocUsed; + + input = ClientSessionToSession(input); + output = ClientSessionToSession(output); + + if (input == NULL || output == NULL || input == output) { + WOLFSSL_MSG("input or output are null or same"); + return WOLFSSL_FAILURE; + } + +#ifdef HAVE_SESSION_TICKET + if (output->ticket != output->staticTicket) { + ticBuff = output->ticket; + ticLenAlloc = output->ticketLenAlloc; + } +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + /* free the data, it would be better to reuse the buffer but this + * maintain the code simpler. A smart allocator should reuse the free'd + * buffer in the next malloc without much performance penalties. */ + if (output->ticketNonce.data != output->ticketNonce.dataStatic) { + + /* Callers that avoid syscall should never calls this with + * output->tickeNonce.data being a dynamic buffer.*/ + if (avoidSysCalls) { + WOLFSSL_MSG("can't avoid syscalls with dynamic TicketNonce buffer"); + return WOLFSSL_FAILURE; + } + + XFREE(output->ticketNonce.data, + output->heap, DYNAMIC_TYPE_SESSION_TICK); + output->ticketNonce.data = output->ticketNonce.dataStatic; + output->ticketNonce.len = 0; + } +#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ +#endif /* HAVE_SESSION_TICKET */ + +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + if (output->peer != NULL) { + if (avoidSysCalls) { + WOLFSSL_MSG("Can't free cert when avoiding syscalls"); + return WOLFSSL_FAILURE; + } + wolfSSL_X509_free(output->peer); + output->peer = NULL; + } +#endif + + XMEMCPY((byte*)output + copyOffset, (byte*)input + copyOffset, + sizeof(WOLFSSL_SESSION) - copyOffset); + +#if defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TLS13) && \ + defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + /* fix pointer to static after the copy */ + output->ticketNonce.data = output->ticketNonce.dataStatic; +#endif + /* Set sane values for copy */ +#ifndef NO_SESSION_CACHE + if (output->type != WOLFSSL_SESSION_TYPE_CACHE) + output->cacheRow = INVALID_SESSION_ROW; +#endif +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + if (input->peer != NULL && input->peer->dynamicMemory) { + if (wolfSSL_X509_up_ref(input->peer) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Can't increase peer cert ref count"); + output->peer = NULL; + } + } + else if (!avoidSysCalls) + output->peer = wolfSSL_X509_dup(input->peer); + else + /* output->peer is not that important to copy */ + output->peer = NULL; +#endif +#ifdef HAVE_SESSION_TICKET + if (input->ticketLen > SESSION_TICKET_LEN) { + /* Need dynamic buffer */ + if (ticBuff == NULL || ticLenAlloc < input->ticketLen) { + /* allocate new one */ + byte* tmp; + if (avoidSysCalls) { + WOLFSSL_MSG("Failed to allocate memory for ticket when avoiding" + " syscalls"); + output->ticket = ticBuff; + output->ticketLenAlloc = (word16) ticLenAlloc; + output->ticketLen = 0; + ret = WOLFSSL_FAILURE; + } + else { +#ifdef WOLFSSL_NO_REALLOC + tmp = (byte*)XMALLOC(input->ticketLen, + output->heap, DYNAMIC_TYPE_SESSION_TICK); + XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK); + ticBuff = NULL; +#else + tmp = (byte*)XREALLOC(ticBuff, input->ticketLen, + output->heap, DYNAMIC_TYPE_SESSION_TICK); +#endif /* WOLFSSL_NO_REALLOC */ + if (tmp == NULL) { + WOLFSSL_MSG("Failed to allocate memory for ticket"); +#ifndef WOLFSSL_NO_REALLOC + XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK); + ticBuff = NULL; +#endif /* WOLFSSL_NO_REALLOC */ + output->ticket = NULL; + output->ticketLen = 0; + output->ticketLenAlloc = 0; + ret = WOLFSSL_FAILURE; + } + else { + ticBuff = tmp; + ticLenAlloc = input->ticketLen; + } + } + } + if (ticBuff != NULL && ret == WOLFSSL_SUCCESS) { + XMEMCPY(ticBuff, input->ticket, input->ticketLen); + output->ticket = ticBuff; + output->ticketLenAlloc = (word16) ticLenAlloc; + } + } + else { + /* Default ticket to non dynamic */ + if (avoidSysCalls) { + /* Try to use ticBuf if available. Caller can later move it to + * the static buffer. */ + if (ticBuff != NULL) { + if (ticLenAlloc >= input->ticketLen) { + output->ticket = ticBuff; + output->ticketLenAlloc = ticLenAlloc; + } + else { + WOLFSSL_MSG("ticket dynamic buffer too small but we are " + "avoiding system calls"); + ret = WOLFSSL_FAILURE; + output->ticket = ticBuff; + output->ticketLenAlloc = (word16) ticLenAlloc; + output->ticketLen = 0; + } + } + else { + output->ticket = output->staticTicket; + output->ticketLenAlloc = 0; + } + } + else { + if (ticBuff != NULL) + XFREE(ticBuff, output->heap, DYNAMIC_TYPE_SESSION_TICK); + output->ticket = output->staticTicket; + output->ticketLenAlloc = 0; + } + if (input->ticketLenAlloc > 0 && ret == WOLFSSL_SUCCESS) { + /* Shouldn't happen as session should have placed this in + * the static buffer */ + XMEMCPY(output->ticket, input->ticket, + input->ticketLen); + } + } + ticBuff = NULL; + +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + if (preallocUsed != NULL) + *preallocUsed = 0; + + if (input->ticketNonce.len > MAX_TICKET_NONCE_STATIC_SZ && + ret == WOLFSSL_SUCCESS) { + /* TicketNonce does not fit in the static buffer */ + if (!avoidSysCalls) { + output->ticketNonce.data = (byte*)XMALLOC(input->ticketNonce.len, + output->heap, DYNAMIC_TYPE_SESSION_TICK); + + if (output->ticketNonce.data == NULL) { + WOLFSSL_MSG("Failed to allocate space for ticket nonce"); + output->ticketNonce.data = output->ticketNonce.dataStatic; + output->ticketNonce.len = 0; + ret = WOLFSSL_FAILURE; + } + else { + output->ticketNonce.len = input->ticketNonce.len; + XMEMCPY(output->ticketNonce.data, input->ticketNonce.data, + input->ticketNonce.len); + ret = WOLFSSL_SUCCESS; + } + } + /* we can't do syscalls. Use prealloc buffers if provided from the + * caller. */ + else if (ticketNonceBuf != NULL && + *ticketNonceLen >= input->ticketNonce.len) { + XMEMCPY(ticketNonceBuf, input->ticketNonce.data, + input->ticketNonce.len); + *ticketNonceLen = input->ticketNonce.len; + if (preallocUsed != NULL) + *preallocUsed = 1; + ret = WOLFSSL_SUCCESS; + } + else { + WOLFSSL_MSG("TicketNonce bigger than static buffer, and we can't " + "do syscalls"); + ret = WOLFSSL_FAILURE; + } + } +#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ + +#endif /* HAVE_SESSION_TICKET */ + +#ifdef HAVE_EX_DATA + if (input->type != WOLFSSL_SESSION_TYPE_CACHE && + output->type != WOLFSSL_SESSION_TYPE_CACHE) { + /* Not called with cache as that passes ownership of ex_data */ + ret = crypto_ex_cb_dup_data(&input->ex_data, &output->ex_data, + crypto_ex_cb_ctx_session); + } +#endif + + return ret; +} + +/** + * Deep copy the contents from input to output. + * @param input The source of the copy. + * @param output The destination of the copy. + * @param avoidSysCalls If true, then system calls will be avoided or an error + * will be returned if it is not possible to proceed + * without a system call. This is useful for fetching + * sessions from cache. When a cache row is locked, we + * don't want to block other threads with long running + * system calls. + * @return WOLFSSL_SUCCESS on success + * WOLFSSL_FAILURE on failure + */ +int wolfSSL_DupSession(const WOLFSSL_SESSION* input, WOLFSSL_SESSION* output, + int avoidSysCalls) +{ + return wolfSSL_DupSessionEx(input, output, avoidSysCalls, NULL, NULL, NULL); +} + +WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session) +{ + WOLFSSL_SESSION* copy; + + WOLFSSL_ENTER("wolfSSL_SESSION_dup"); + + session = ClientSessionToSession(session); + if (session == NULL) + return NULL; + +#ifdef HAVE_SESSION_TICKET + if (session->ticketLenAlloc > 0 && !session->ticket) { + WOLFSSL_MSG("Session dynamic flag is set but ticket pointer is null"); + return NULL; + } +#endif + + copy = wolfSSL_NewSession(session->heap); + if (copy != NULL && + wolfSSL_DupSession(session, copy, 0) != WOLFSSL_SUCCESS) { + wolfSSL_FreeSession(NULL, copy); + copy = NULL; + } + return copy; +} + +void wolfSSL_FreeSession(WOLFSSL_CTX* ctx, WOLFSSL_SESSION* session) +{ + session = ClientSessionToSession(session); + if (session == NULL) + return; + + (void)ctx; + + WOLFSSL_ENTER("wolfSSL_FreeSession"); + + if (session->ref.count > 0) { + int ret; + int isZero; + wolfSSL_RefDec(&session->ref, &isZero, &ret); + (void)ret; + if (!isZero) { + return; + } + wolfSSL_RefFree(&session->ref); + } + + WOLFSSL_MSG("wolfSSL_FreeSession full free"); + +#ifdef HAVE_EX_DATA + if (session->ownExData) { + crypto_ex_cb_free_data(session, crypto_ex_cb_ctx_session, + &session->ex_data); + } +#endif + +#ifdef HAVE_EX_DATA_CLEANUP_HOOKS + wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data); +#endif + +#if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) + if (session->peer) { + wolfSSL_X509_free(session->peer); + session->peer = NULL; + } +#endif + +#ifdef HAVE_SESSION_TICKET + if (session->ticketLenAlloc > 0) { + XFREE(session->ticket, session->heap, DYNAMIC_TYPE_SESSION_TICK); + session->ticket = session->staticTicket; + session->ticketLen = 0; + session->ticketLenAlloc = 0; + } +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + if (session->ticketNonce.data != session->ticketNonce.dataStatic) { + XFREE(session->ticketNonce.data, session->heap, + DYNAMIC_TYPE_SESSION_TICK); + session->ticketNonce.data = session->ticketNonce.dataStatic; + session->ticketNonce.len = 0; + } +#endif /* WOLFSSL_TLS13 && WOLFSSL_TICKET_NONCE_MALLOC && FIPS_VERSION_GE(5,3)*/ +#endif + +#ifdef HAVE_EX_DATA_CLEANUP_HOOKS + wolfSSL_CRYPTO_cleanup_ex_data(&session->ex_data); +#endif + + /* Make sure masterSecret is zeroed. */ + ForceZero(session->masterSecret, SECRET_LEN); + /* Session ID is sensitive information too. */ + ForceZero(session->sessionID, ID_LEN); + + if (session->type == WOLFSSL_SESSION_TYPE_HEAP) { + XFREE(session, session->heap, DYNAMIC_TYPE_SESSION); + } +} + +/* DO NOT use this API internally. Use wolfSSL_FreeSession directly instead + * and pass in the ctx parameter if possible (like from ssl->ctx). */ +void wolfSSL_SESSION_free(WOLFSSL_SESSION* session) +{ + session = ClientSessionToSession(session); + wolfSSL_FreeSession(NULL, session); +} + +#if defined(OPENSSL_EXTRA) || defined(HAVE_EXT_CACHE) + +/** +* set cipher to WOLFSSL_SESSION from WOLFSSL_CIPHER +* @param session a pointer to WOLFSSL_SESSION structure +* @param cipher a function pointer to WOLFSSL_CIPHER +* @return WOLFSSL_SUCCESS on success, otherwise WOLFSSL_FAILURE +*/ +int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session, + const WOLFSSL_CIPHER* cipher) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_set_cipher"); + + session = ClientSessionToSession(session); + /* sanity check */ + if (session == NULL || cipher == NULL) { + WOLFSSL_MSG("bad argument"); + return WOLFSSL_FAILURE; + } + session->cipherSuite0 = cipher->cipherSuite0; + session->cipherSuite = cipher->cipherSuite; + + WOLFSSL_LEAVE("wolfSSL_SESSION_set_cipher", WOLFSSL_SUCCESS); + return WOLFSSL_SUCCESS; +} +#endif /* OPENSSL_EXTRA || HAVE_EXT_CACHE */ + +const char* wolfSSL_SESSION_CIPHER_get_name(const WOLFSSL_SESSION* session) +{ + session = ClientSessionToSession(session); + if (session == NULL) { + return NULL; + } + +#if defined(SESSION_CERTS) || !defined(NO_RESUME_SUITE_CHECK) || \ + (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) + #if !defined(WOLFSSL_CIPHER_INTERNALNAME) && !defined(NO_ERROR_STRINGS) + return GetCipherNameIana(session->cipherSuite0, session->cipherSuite); + #else + return GetCipherNameInternal(session->cipherSuite0, + session->cipherSuite); + #endif +#else + return NULL; +#endif +} + +#if defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_NGINX) +const unsigned char *wolfSSL_SESSION_get0_id_context( + const WOLFSSL_SESSION *sess, unsigned int *sid_ctx_length) +{ + return wolfSSL_SESSION_get_id((WOLFSSL_SESSION *)sess, sid_ctx_length); +} +int wolfSSL_SESSION_set1_id(WOLFSSL_SESSION *s, + const unsigned char *sid, unsigned int sid_len) +{ + if (s == NULL) { + return WOLFSSL_FAILURE; + } + if (sid_len > ID_LEN) { + return WOLFSSL_FAILURE; + } + s->sessionIDSz = sid_len; + if (sid != s->sessionID) { + XMEMCPY(s->sessionID, sid, sid_len); + } + return WOLFSSL_SUCCESS; +} + +int wolfSSL_SESSION_set1_id_context(WOLFSSL_SESSION *s, + const unsigned char *sid_ctx, unsigned int sid_ctx_len) +{ + if (s == NULL) { + return WOLFSSL_FAILURE; + } + if (sid_ctx_len > ID_LEN) { + return WOLFSSL_FAILURE; + } + s->sessionCtxSz = sid_ctx_len; + if (sid_ctx != s->sessionCtx) { + XMEMCPY(s->sessionCtx, sid_ctx, sid_ctx_len); + } + + return WOLFSSL_SUCCESS; +} + +#endif + +#ifdef OPENSSL_EXTRA + +/* Return the total number of sessions */ +long wolfSSL_CTX_sess_number(WOLFSSL_CTX* ctx) +{ + word32 total = 0; + + WOLFSSL_ENTER("wolfSSL_CTX_sess_number"); + (void)ctx; + +#if defined(WOLFSSL_SESSION_STATS) && !defined(NO_SESSION_CACHE) + if (wolfSSL_get_session_stats(NULL, &total, NULL, NULL) != + WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Error getting session stats"); + } +#else + WOLFSSL_MSG("Please use macro WOLFSSL_SESSION_STATS for session stats"); +#endif + + return (long)total; +} + +#endif + +#ifdef SESSION_CERTS + +/* get session ID */ +WOLFSSL_ABI +const byte* wolfSSL_get_sessionID(const WOLFSSL_SESSION* session) +{ + WOLFSSL_ENTER("wolfSSL_get_sessionID"); + session = ClientSessionToSession(session); + if (session) + return session->sessionID; + + return NULL; +} + +#endif + +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \ + defined(HAVE_EX_DATA) + +int wolfSSL_SESSION_set_ex_data(WOLFSSL_SESSION* session, int idx, void* data) +{ + int ret = WOLFSSL_FAILURE; + WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data"); +#ifdef HAVE_EX_DATA + session = ClientSessionToSession(session); + if (session != NULL) { +#ifndef NO_SESSION_CACHE + if (!session->ownExData) { + /* Need to update in cache */ + SESSION_ex_data_cache_update(session, idx, data, 0, NULL, &ret); + } + else +#endif + { + ret = wolfSSL_CRYPTO_set_ex_data(&session->ex_data, idx, data); + } + } +#else + (void)session; + (void)idx; + (void)data; +#endif + return ret; +} + +#ifdef HAVE_EX_DATA_CLEANUP_HOOKS +int wolfSSL_SESSION_set_ex_data_with_cleanup( + WOLFSSL_SESSION* session, + int idx, + void* data, + wolfSSL_ex_data_cleanup_routine_t cleanup_routine) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_set_ex_data_with_cleanup"); + session = ClientSessionToSession(session); + if(session != NULL) { + return wolfSSL_CRYPTO_set_ex_data_with_cleanup(&session->ex_data, idx, + data, cleanup_routine); + } + return WOLFSSL_FAILURE; +} +#endif /* HAVE_EX_DATA_CLEANUP_HOOKS */ + +void* wolfSSL_SESSION_get_ex_data(const WOLFSSL_SESSION* session, int idx) +{ + void* ret = NULL; + WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_data"); +#ifdef HAVE_EX_DATA + session = ClientSessionToSession(session); + if (session != NULL) { +#ifndef NO_SESSION_CACHE + if (!session->ownExData) { + /* Need to retrieve the data from the session cache */ + SESSION_ex_data_cache_update((WOLFSSL_SESSION*)session, idx, NULL, + 1, &ret, NULL); + } + else +#endif + { + ret = wolfSSL_CRYPTO_get_ex_data(&session->ex_data, idx); + } + } +#else + (void)session; + (void)idx; +#endif + return ret; +} +#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL || HAVE_EX_DATA */ + +#if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ + (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ + defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ + defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB))) +#ifdef HAVE_EX_DATA +int wolfSSL_SESSION_get_ex_new_index(long ctx_l,void* ctx_ptr, + WOLFSSL_CRYPTO_EX_new* new_func, WOLFSSL_CRYPTO_EX_dup* dup_func, + WOLFSSL_CRYPTO_EX_free* free_func) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_get_ex_new_index"); + return wolfssl_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION, ctx_l, + ctx_ptr, new_func, dup_func, free_func); +} +#endif +#endif + + +#if defined(OPENSSL_ALL) || \ + defined(OPENSSL_EXTRA) || defined(HAVE_STUNNEL) || \ + defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) + +const byte* wolfSSL_SESSION_get_id(const WOLFSSL_SESSION* sess, + unsigned int* idLen) +{ + WOLFSSL_ENTER("wolfSSL_SESSION_get_id"); + sess = ClientSessionToSession(sess); + if (sess == NULL || idLen == NULL) { + WOLFSSL_MSG("Bad func args. Please provide idLen"); + return NULL; + } +#ifdef HAVE_SESSION_TICKET + if (sess->haveAltSessionID) { + *idLen = ID_LEN; + return sess->altSessionID; + } +#endif + *idLen = sess->sessionIDSz; + return sess->sessionID; +} + +#if (defined(HAVE_SESSION_TICKET) || defined(SESSION_CERTS)) && \ + !defined(NO_FILESYSTEM) + +#ifndef NO_BIO + +#if defined(SESSION_CERTS) || \ + (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) +static const char* wolfSSL_internal_get_version(const ProtocolVersion* version); + +/* returns a pointer to the protocol used by the session */ +static const char* wolfSSL_SESSION_get_protocol(const WOLFSSL_SESSION* in) +{ + in = ClientSessionToSession(in); + return wolfSSL_internal_get_version((ProtocolVersion*)&in->version); +} +#endif + +/* returns true (non 0) if the session has EMS (extended master secret) */ +static int wolfSSL_SESSION_haveEMS(const WOLFSSL_SESSION* in) +{ + in = ClientSessionToSession(in); + if (in == NULL) + return 0; + return in->haveEMS; +} + +#if defined(HAVE_SESSION_TICKET) +/* prints out the ticket to bio passed in + * return WOLFSSL_SUCCESS on success + */ +static int wolfSSL_SESSION_print_ticket(WOLFSSL_BIO* bio, + const WOLFSSL_SESSION* in, const char* tab) +{ + unsigned short i, j, z, sz; + short tag = 0; + byte* pt; + + + in = ClientSessionToSession(in); + if (in == NULL || bio == NULL) { + return BAD_FUNC_ARG; + } + + sz = in->ticketLen; + pt = in->ticket; + + if (wolfSSL_BIO_printf(bio, "%s\n", (sz == 0)? " NONE": "") <= 0) + return WOLFSSL_FAILURE; + + for (i = 0; i < sz;) { + char asc[16]; + XMEMSET(asc, 0, sizeof(asc)); + + if (sz - i < 16) { + if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag + (sz - i)) <= 0) + return WOLFSSL_FAILURE; + } + else { + if (wolfSSL_BIO_printf(bio, "%s%04X -", tab, tag) <= 0) + return WOLFSSL_FAILURE; + } + for (j = 0; i < sz && j < 8; j++,i++) { + asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.'; + if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0) + return WOLFSSL_FAILURE; + } + + if (i < sz) { + asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.'; + if (wolfSSL_BIO_printf(bio, "-%02X", pt[i]) <= 0) + return WOLFSSL_FAILURE; + j++; + i++; + } + + for (; i < sz && j < 16; j++,i++) { + asc[j] = ((pt[i])&0x6f)>='A'?((pt[i])&0x6f):'.'; + if (wolfSSL_BIO_printf(bio, " %02X", pt[i]) <= 0) + return WOLFSSL_FAILURE; + } + + /* pad out spacing */ + for (z = j; z < 17; z++) { + if (wolfSSL_BIO_printf(bio, " ") <= 0) + return WOLFSSL_FAILURE; + } + + for (z = 0; z < j; z++) { + if (wolfSSL_BIO_printf(bio, "%c", asc[z]) <= 0) + return WOLFSSL_FAILURE; + } + if (wolfSSL_BIO_printf(bio, "\n") <= 0) + return WOLFSSL_FAILURE; + + tag += 16; + } + return WOLFSSL_SUCCESS; +} +#endif /* HAVE_SESSION_TICKET */ + + +/* prints out the session information in human readable form + * return WOLFSSL_SUCCESS on success + */ +int wolfSSL_SESSION_print(WOLFSSL_BIO *bp, const WOLFSSL_SESSION *session) +{ + const unsigned char* pt; + unsigned char buf[SECRET_LEN]; + unsigned int sz = 0, i; + int ret; + + session = ClientSessionToSession(session); + if (session == NULL) { + return WOLFSSL_FAILURE; + } + + if (wolfSSL_BIO_printf(bp, "%s\n", "SSL-Session:") <= 0) + return WOLFSSL_FAILURE; + +#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET)) + if (wolfSSL_BIO_printf(bp, " Protocol : %s\n", + wolfSSL_SESSION_get_protocol(session)) <= 0) + return WOLFSSL_FAILURE; +#endif + + if (wolfSSL_BIO_printf(bp, " Cipher : %s\n", + wolfSSL_SESSION_CIPHER_get_name(session)) <= 0) + return WOLFSSL_FAILURE; + + pt = wolfSSL_SESSION_get_id(session, &sz); + if (wolfSSL_BIO_printf(bp, " Session-ID: ") <= 0) + return WOLFSSL_FAILURE; + + for (i = 0; i < sz; i++) { + if (wolfSSL_BIO_printf(bp, "%02X", pt[i]) <= 0) + return WOLFSSL_FAILURE; + } + if (wolfSSL_BIO_printf(bp, "\n") <= 0) + return WOLFSSL_FAILURE; + + if (wolfSSL_BIO_printf(bp, " Session-ID-ctx: \n") <= 0) + return WOLFSSL_FAILURE; + + ret = wolfSSL_SESSION_get_master_key(session, buf, sizeof(buf)); + if (wolfSSL_BIO_printf(bp, " Master-Key: ") <= 0) + return WOLFSSL_FAILURE; + + if (ret > 0) { + sz = (unsigned int)ret; + for (i = 0; i < sz; i++) { + if (wolfSSL_BIO_printf(bp, "%02X", buf[i]) <= 0) + return WOLFSSL_FAILURE; + } + } + if (wolfSSL_BIO_printf(bp, "\n") <= 0) + return WOLFSSL_FAILURE; + + /* @TODO PSK identity hint and SRP */ + + if (wolfSSL_BIO_printf(bp, " TLS session ticket:") <= 0) + return WOLFSSL_FAILURE; + +#ifdef HAVE_SESSION_TICKET + if (wolfSSL_SESSION_print_ticket(bp, session, " ") != WOLFSSL_SUCCESS) + return WOLFSSL_FAILURE; +#endif + +#if !defined(NO_SESSION_CACHE) && (defined(OPENSSL_EXTRA) || \ + defined(HAVE_EXT_CACHE)) + if (wolfSSL_BIO_printf(bp, " Start Time: %ld\n", + wolfSSL_SESSION_get_time(session)) <= 0) + return WOLFSSL_FAILURE; + + if (wolfSSL_BIO_printf(bp, " Timeout : %ld (sec)\n", + wolfSSL_SESSION_get_timeout(session)) <= 0) + return WOLFSSL_FAILURE; +#endif /* !NO_SESSION_CACHE && OPENSSL_EXTRA || HAVE_EXT_CACHE */ + + /* @TODO verify return code print */ + + if (wolfSSL_BIO_printf(bp, " Extended master secret: %s\n", + (wolfSSL_SESSION_haveEMS(session) == 0)? "no" : "yes") <= 0) + return WOLFSSL_FAILURE; + + return WOLFSSL_SUCCESS; +} + +#endif /* !NO_BIO */ +#endif /* (HAVE_SESSION_TICKET || SESSION_CERTS) && !NO_FILESYSTEM */ + +#endif /* OPENSSL_ALL || OPENSSL_EXTRA || HAVE_STUNNEL || WOLFSSL_NGINX || + * WOLFSSL_HAPROXY */ + +#ifdef OPENSSL_EXTRA +/** + * Determine whether a WOLFSSL_SESSION object can be used for resumption + * @param s a pointer to WOLFSSL_SESSION structure + * @return return 1 if session is resumable, otherwise 0. + */ +int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s) +{ + s = ClientSessionToSession(s); + if (s == NULL) + return 0; + +#ifdef HAVE_SESSION_TICKET + if (s->ticketLen > 0) + return 1; +#endif + + if (s->sessionIDSz > 0) + return 1; + + return 0; +} +#endif /* OPENSSL_EXTRA */ + +#endif /* !WOLFSSL_SSL_SESS_INCLUDED */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/tls.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/tls.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/tls.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/tls.c 2024-08-03 07:30:00.000000000 +0000 @@ -48,7 +48,7 @@ #ifdef HAVE_CURVE448 #include #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER #include #ifdef WOLFSSL_WC_KYBER #include @@ -106,7 +106,8 @@ #endif /* Warn if secrets logging is enabled */ -#if defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE) +#if (defined(SHOW_SECRETS) || defined(WOLFSSL_SSLKEYLOGFILE)) && \ + !defined(WOLFSSL_KEYLOG_EXPORT_WARNED) #ifndef _MSC_VER #warning The SHOW_SECRETS and WOLFSSL_SSLKEYLOGFILE options should only be used for debugging and never in a production environment #else @@ -114,13 +115,6 @@ #endif #endif -/* Optional Pre-Master-Secret logging for Wireshark */ -#if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE) -#ifndef WOLFSSL_SSLKEYLOGFILE_OUTPUT - #define WOLFSSL_SSLKEYLOGFILE_OUTPUT "sslkeylog.log" -#endif -#endif - #ifndef WOLFSSL_NO_TLS12 #ifdef WOLFSSL_SHA384 @@ -157,6 +151,12 @@ hashSz = WC_SHA384_DIGEST_SIZE; } #endif +#ifdef WOLFSSL_SM3 + if (ssl->specs.mac_algorithm == sm3_mac) { + ret |= wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash); + hashSz = WC_SM3_DIGEST_SIZE; + } +#endif } *hashLen = hashSz; @@ -182,10 +182,12 @@ byte handshake_hash[HSHASH_SZ]; #else WC_DECLARE_VAR(handshake_hash, byte, HSHASH_SZ, ssl->heap); + WC_ALLOC_VAR(handshake_hash, byte, HSHASH_SZ, ssl->heap); if (handshake_hash == NULL) return MEMORY_E; #endif + XMEMSET(handshake_hash, 0, HSHASH_SZ); ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz); if (ret == 0) { if (XSTRNCMP((const char*)sender, (const char*)kTlsClientStr, @@ -210,7 +212,8 @@ ret = ssl->ctx->TlsFinishedCb(ssl, side, handshake_hash, hashSz, (byte*)hashes, ctx); } - if (!ssl->ctx->TlsFinishedCb || ret == PROTOCOLCB_UNAVAILABLE) + if (!ssl->ctx->TlsFinishedCb || + ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) #endif { PRIVATE_KEY_UNLOCK(); @@ -298,6 +301,98 @@ } #endif +#if defined(HAVE_SUPPORTED_CURVES) +/* Sets the key exchange groups in rank order on a context. + * + * ctx SSL/TLS context object. + * groups Array of groups. + * count Number of groups in array. + * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3 or + * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success. + */ +int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count) +{ + int ret, i; + + WOLFSSL_ENTER("wolfSSL_CTX_set_groups"); + if (ctx == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT) + return BAD_FUNC_ARG; + if (!IsTLS_ex(ctx->method->version)) + return BAD_FUNC_ARG; + + #ifdef WOLFSSL_TLS13 + ctx->numGroups = 0; + #endif + #if !defined(NO_TLS) + TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap); + #endif /* !NO_TLS */ + for (i = 0; i < count; i++) { + /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups + * are valid */ + if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i])) + != WOLFSSL_SUCCESS) { + #if !defined(NO_TLS) + TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap); + #endif /* !NO_TLS */ + return ret; + } + #ifdef WOLFSSL_TLS13 + ctx->group[i] = (word16)groups[i]; + #endif + } + #ifdef WOLFSSL_TLS13 + ctx->numGroups = (byte)count; + #endif + + return WOLFSSL_SUCCESS; +} + +/* Sets the key exchange groups in rank order. + * + * ssl SSL/TLS object. + * groups Array of groups. + * count Number of groups in array. + * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3 or + * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success. + */ +int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count) +{ + int ret, i; + + WOLFSSL_ENTER("wolfSSL_set_groups"); + if (ssl == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT) + return BAD_FUNC_ARG; + if (!IsTLS_ex(ssl->version)) + return BAD_FUNC_ARG; + + #ifdef WOLFSSL_TLS13 + ssl->numGroups = 0; + #endif + #if !defined(NO_TLS) + TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap); + #endif /* !NO_TLS */ + for (i = 0; i < count; i++) { + /* Call to wolfSSL_UseSupportedCurve also checks if input groups + * are valid */ + if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i])) + != WOLFSSL_SUCCESS) { + #if !defined(NO_TLS) + TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap); + #endif /* !NO_TLS */ + return ret; + } + #ifdef WOLFSSL_TLS13 + ssl->group[i] = (word16)groups[i]; + #endif + } + #ifdef WOLFSSL_TLS13 + ssl->numGroups = (byte)count; + #endif + + return WOLFSSL_SUCCESS; +} +#endif /* HAVE_SUPPORTED_CURVES */ + #ifndef WOLFSSL_NO_TLS12 #ifdef HAVE_EXTENDED_MASTER @@ -316,6 +411,7 @@ int ret; #if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_ASYNC_NO_HASH) WC_DECLARE_VAR(seed, byte, SEED_LEN, heap); + WC_ALLOC_VAR(seed, byte, SEED_LEN, heap); if (seed == NULL) return MEMORY_E; #else @@ -393,9 +489,10 @@ void* ctx = wolfSSL_GetGenSessionKeyCtx(ssl); ret = ssl->ctx->GenSessionKeyCb(ssl, ctx); } - if (!ssl->ctx->GenSessionKeyCb || ret == PROTOCOLCB_UNAVAILABLE) + if (!ssl->ctx->GenSessionKeyCb || + ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) #endif - ret = _DeriveTlsKeys(key_dig, key_dig_len, + ret = _DeriveTlsKeys(key_dig, (word32)key_dig_len, ssl->arrays->masterSecret, SECRET_LEN, ssl->arrays->serverRandom, ssl->arrays->clientRandom, IsAtLeastTLSv1_2(ssl), ssl->specs.mac_algorithm, @@ -421,6 +518,7 @@ byte seed[SEED_LEN]; #else WC_DECLARE_VAR(seed, byte, SEED_LEN, heap); + WC_ALLOC_VAR(seed, byte, SEED_LEN, heap); if (seed == NULL) return MEMORY_E; #endif @@ -517,6 +615,21 @@ { int ret; +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) + /* If this is called from a sniffer session with keylog file support, obtain + * the master secret from the callback */ + if (ssl->snifferSecretCb != NULL) { + ret = ssl->snifferSecretCb(ssl->arrays->clientRandom, + SNIFFER_SECRET_TLS12_MASTER_SECRET, + ssl->arrays->masterSecret); + if (ret != 0) { + return ret; + } + ret = DeriveTlsKeys(ssl); + return ret; + } +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ + #ifdef HAVE_EXTENDED_MASTER if (ssl->options.haveEMS) { word32 hashSz = HSHASH_SZ; @@ -529,6 +642,7 @@ byte handshake_hash[HSHASH_SZ]; #endif + XMEMSET(handshake_hash, 0, HSHASH_SZ); ret = BuildTlsHandshakeHash(ssl, handshake_hash, &hashSz); if (ret == 0) { ret = _MakeTlsExtendedMasterSecret( @@ -556,7 +670,8 @@ void* ctx = wolfSSL_GetGenMasterSecretCtx(ssl); ret = ssl->ctx->GenMasterCb(ssl, ctx); } - if (!ssl->ctx->GenMasterCb || ret == PROTOCOLCB_UNAVAILABLE) + if (!ssl->ctx->GenMasterCb || + ret == WC_NO_ERR_TRACE(PROTOCOLCB_UNAVAILABLE)) #endif { ret = _MakeTlsMasterSecret(ssl->arrays->masterSecret, @@ -566,47 +681,13 @@ ssl->specs.mac_algorithm, ssl->heap, ssl->devId); } } +#ifdef HAVE_SECRET_CALLBACK + if (ret == 0 && ssl->tlsSecretCb != NULL) { + ret = ssl->tlsSecretCb(ssl, ssl->arrays->masterSecret, + SECRET_LEN, ssl->tlsSecretCtx); + } +#endif /* HAVE_SECRET_CALLBACK */ if (ret == 0) { - #ifdef SHOW_SECRETS - /* Wireshark Pre-Master-Secret Format: - * CLIENT_RANDOM - */ - const char* CLIENT_RANDOM_LABEL = "CLIENT_RANDOM"; - int i, pmsPos = 0; - char pmsBuf[13 + 1 + 64 + 1 + 96 + 1 + 1]; - - XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%s ", - CLIENT_RANDOM_LABEL); - pmsPos += XSTRLEN(CLIENT_RANDOM_LABEL) + 1; - for (i = 0; i < RAN_LEN; i++) { - XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x", - ssl->arrays->clientRandom[i]); - pmsPos += 2; - } - XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, " "); - pmsPos += 1; - for (i = 0; i < SECRET_LEN; i++) { - XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "%02x", - ssl->arrays->masterSecret[i]); - pmsPos += 2; - } - XSNPRINTF(&pmsBuf[pmsPos], sizeof(pmsBuf) - pmsPos, "\n"); - pmsPos += 1; - - /* print master secret */ - puts(pmsBuf); - - #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE) - { - FILE* f = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "a"); - if (f != XBADFILE) { - XFWRITE(pmsBuf, 1, pmsPos, f); - XFCLOSE(f); - } - } - #endif - #endif /* SHOW_SECRETS */ - ret = DeriveTlsKeys(ssl); } @@ -663,50 +744,6 @@ return ret; } -int wolfSSL_GetHmacType_ex(CipherSpecs* specs) -{ - if (specs == NULL) - return BAD_FUNC_ARG; - - switch (specs->mac_algorithm) { - #ifndef NO_MD5 - case md5_mac: - { - return WC_MD5; - } - #endif - #ifndef NO_SHA256 - case sha256_mac: - { - return WC_SHA256; - } - #endif - #ifdef WOLFSSL_SHA384 - case sha384_mac: - { - return WC_SHA384; - } - - #endif - #ifndef NO_SHA - case sha_mac: - { - return WC_SHA; - } - #endif - #ifdef HAVE_BLAKE2 - case blake2b_mac: - { - return BLAKE2B_ID; - } - #endif - default: - { - return WOLFSSL_FATAL_ERROR; - } - } -} - /* return HMAC digest type in wolfSSL format */ int wolfSSL_GetHmacType(WOLFSSL* ssl) { @@ -748,7 +785,7 @@ */ static int Hmac_HashUpdate(Hmac* hmac, const byte* data, word32 sz) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (hmac->macType) { #ifndef NO_SHA @@ -775,7 +812,14 @@ break; #endif /* WOLFSSL_SHA512 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + ret = wc_Sm3Update(&hmac->hash.sm3, data, sz); + break; + #endif /* WOLFSSL_SM3 */ + default: + ret = BAD_FUNC_ARG; break; } @@ -790,7 +834,7 @@ */ static int Hmac_HashFinalRaw(Hmac* hmac, unsigned char* hash) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (hmac->macType) { #ifndef NO_SHA @@ -817,7 +861,14 @@ break; #endif /* WOLFSSL_SHA512 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + ret = wc_Sm3FinalRaw(&hmac->hash.sm3, hash); + break; + #endif /* WOLFSSL_SM3 */ + default: + ret = BAD_FUNC_ARG; break; } @@ -832,7 +883,7 @@ */ static int Hmac_OuterHash(Hmac* hmac, unsigned char* mac) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); wc_HashAlg hash; enum wc_HashType hashType = (enum wc_HashType)hmac->macType; int digestSz = wc_HashGetDigestSize(hashType); @@ -841,12 +892,16 @@ if ((digestSz >= 0) && (blockSz >= 0)) { ret = wc_HashInit(&hash, hashType); } + else { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->opad, - blockSz); + (word32)blockSz); if (ret == 0) ret = wc_HashUpdate(&hash, hashType, (byte*)hmac->innerHash, - digestSz); + (word32)digestSz); if (ret == 0) ret = wc_HashFinal(&hash, hashType, mac); wc_HashFree(&hash, hashType); @@ -913,6 +968,14 @@ break; #endif /* WOLFSSL_SHA512 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + blockSz = WC_SM3_BLOCK_SIZE; + blockBits = 6; + padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1; + break; + #endif /* WOLFSSL_SM3 */ + default: return BAD_FUNC_ARG; } @@ -946,7 +1009,7 @@ c32toa(realLen >> ((sizeof(word32) * 8) - 3), lenBytes); c32toa(realLen << 3, lenBytes + sizeof(word32)); - ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, blockSz); + ret = Hmac_HashUpdate(hmac, (unsigned char*)hmac->ipad, (word32)blockSz); if (ret != 0) return ret; @@ -965,7 +1028,7 @@ safeBlocks = 0; XMEMSET(digest, 0, macLen); - k = safeBlocks * blockSz; + k = (unsigned int)(safeBlocks * blockSz); for (i = safeBlocks; i < blocks; i++) { unsigned char hashBlock[WC_MAX_BLOCK_SIZE]; unsigned char isEocBlock = ctMaskEq(i, eocBlock); @@ -993,7 +1056,7 @@ hashBlock[j] = b; } - ret = Hmac_HashUpdate(hmac, hashBlock, blockSz); + ret = Hmac_HashUpdate(hmac, hashBlock, (word32)blockSz); if (ret != 0) return ret; ret = Hmac_HashFinalRaw(hmac, hashBlock); @@ -1028,7 +1091,7 @@ word32 sz, byte* header) { byte dummy[WC_MAX_BLOCK_SIZE] = {0}; - int ret; + int ret = 0; word32 msgSz, blockSz, macSz, padSz, maxSz, realSz; word32 offset = 0; int msgBlocks, blocks, blockBits; @@ -1080,7 +1143,17 @@ break; #endif /* HAVE_BLAKE2 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + blockSz = WC_SM3_BLOCK_SIZE; + blockBits = 6; + macSz = WC_SM3_DIGEST_SIZE; + padSz = WC_SM3_BLOCK_SIZE - WC_SM3_PAD_SIZE + 1; + break; + #endif + default: + WOLFSSL_MSG("ERROR: Hmac_UpdateFinal failed, no hmac->macType"); return BAD_FUNC_ARG; } @@ -1089,11 +1162,13 @@ msgSz &= ~(0 - (msgSz >> 31)); realSz = WOLFSSL_TLS_HMAC_INNER_SZ + msgSz; maxSz = WOLFSSL_TLS_HMAC_INNER_SZ + (sz - 1) - macSz; + /* Make negative result 0 */ + maxSz &= ~(0 - (maxSz >> 31)); /* Calculate #blocks processed in HMAC for max and real data. */ - blocks = maxSz >> blockBits; + blocks = (int)(maxSz >> blockBits); blocks += ((maxSz + padSz) % blockSz) < padSz; - msgBlocks = realSz >> blockBits; + msgBlocks = (int)(realSz >> blockBits); /* #Extra blocks to process. */ blocks -= msgBlocks + ((((realSz + padSz) % blockSz) < padSz) ? 1 : 0); /* Calculate whole blocks. */ @@ -1102,8 +1177,8 @@ ret = wc_HmacUpdate(hmac, header, WOLFSSL_TLS_HMAC_INNER_SZ); if (ret == 0) { /* Fill the rest of the block with any available data. */ - word32 currSz = ctMaskLT(msgSz, blockSz) & msgSz; - currSz |= ctMaskGTE(msgSz, blockSz) & blockSz; + word32 currSz = ctMaskLT((int)msgSz, blockSz) & msgSz; + currSz |= ctMaskGTE((int)msgSz, blockSz) & blockSz; currSz -= WOLFSSL_TLS_HMAC_INNER_SZ; currSz &= ~(0 - (currSz >> 31)); ret = wc_HmacUpdate(hmac, in, currSz); @@ -1227,6 +1302,55 @@ #endif /* !WOLFSSL_NO_TLS12 */ +int wolfSSL_GetHmacType_ex(CipherSpecs* specs) +{ + if (specs == NULL) + return BAD_FUNC_ARG; + + switch (specs->mac_algorithm) { + #ifndef NO_MD5 + case md5_mac: + { + return WC_MD5; + } + #endif + #ifndef NO_SHA256 + case sha256_mac: + { + return WC_SHA256; + } + #endif + #ifdef WOLFSSL_SHA384 + case sha384_mac: + { + return WC_SHA384; + } + #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + { + return WC_SM3; + } + #endif + #ifndef NO_SHA + case sha_mac: + { + return WC_SHA; + } + #endif + #ifdef HAVE_BLAKE2 + case blake2b_mac: + { + return BLAKE2B_ID; + } + #endif + default: + { + return WOLFSSL_FATAL_ERROR; + } + } +} + #ifdef HAVE_TLS_EXTENSIONS /** @@ -1272,6 +1396,10 @@ case TLSX_ECH: /* 0xfe0d */ return 65; #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + case TLSX_CKS: + return 66; +#endif default: if (type > 62) { /* This message SHOULD only happens during the adding of @@ -1652,19 +1780,28 @@ #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) if (ssl->alpnSelect != NULL && ssl->options.side == WOLFSSL_SERVER_END) { - if (ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested, - ssl->alpn_peer_requested_length, - ssl->alpnSelectArg) == 0) { - WOLFSSL_MSG("ALPN protocol match"); - } - else { - sel = NULL; - sel_len = 0; + r = ssl->alpnSelect(ssl, &sel, &sel_len, ssl->alpn_peer_requested, + ssl->alpn_peer_requested_length, ssl->alpnSelectArg); + switch (r) { + case SSL_TLSEXT_ERR_OK: + WOLFSSL_MSG("ALPN protocol match"); + break; + case SSL_TLSEXT_ERR_NOACK: + WOLFSSL_MSG("ALPN cb no match but not fatal"); + sel = NULL; + sel_len = 0; + break; + case SSL_TLSEXT_ERR_ALERT_FATAL: + default: + WOLFSSL_MSG("ALPN cb no match and fatal"); + SendAlert(ssl, alert_fatal, no_application_protocol); + WOLFSSL_ERROR_VERBOSE(UNKNOWN_ALPN_PROTOCOL_NAME_E); + return UNKNOWN_ALPN_PROTOCOL_NAME_E; } } + else #endif - - if (sel == NULL) { + { r = ALPN_find_match(ssl, &extension, &sel, &sel_len, ssl->alpn_peer_requested, ssl->alpn_peer_requested_length); @@ -1803,6 +1940,9 @@ if (extensions == NULL || data == NULL || dataSz == NULL) return BAD_FUNC_ARG; + *data = NULL; + *dataSz = 0; + extension = TLSX_Find(extensions, TLSX_APPLICATION_LAYER_PROTOCOL); if (extension == NULL) { WOLFSSL_MSG("TLS extension not found"); @@ -1813,8 +1953,6 @@ alpn = (ALPN *)extension->data; if (alpn == NULL) { WOLFSSL_MSG("ALPN extension not found"); - *data = NULL; - *dataSz = 0; WOLFSSL_ERROR_VERBOSE(WOLFSSL_FATAL_ERROR); return WOLFSSL_FATAL_ERROR; } @@ -1853,7 +1991,7 @@ #else /* HAVE_ALPN */ -#define ALPN_FREE_ALL(list, heap) +#define ALPN_FREE_ALL(list, heap) WC_DO_NOTHING #define ALPN_GET_SIZE(list) 0 #define ALPN_WRITE(a, b) 0 #define ALPN_PARSE(a, b, c, d) 0 @@ -2278,12 +2416,13 @@ #ifndef NO_WOLFSSL_SERVER /** Tells the SNI requested by the client. */ -word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data) +word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, void** data, + byte ignoreStatus) { TLSX* extension = TLSX_Find(extensions, TLSX_SERVER_NAME); SNI* sni = TLSX_SNI_Find(extension ? (SNI*)extension->data : NULL, type); - if (sni && sni->status != WOLFSSL_SNI_NO_MATCH) { + if (sni && (ignoreStatus || sni->status != WOLFSSL_SNI_NO_MATCH)) { switch (sni->type) { case WOLFSSL_SNI_HOST_NAME: if (data) { @@ -2470,7 +2609,7 @@ #else -#define SNI_FREE_ALL(list, heap) +#define SNI_FREE_ALL(list, heap) WC_DO_NOTHING #define SNI_GET_SIZE(list) 0 #define SNI_WRITE(a, b) 0 #define SNI_PARSE(a, b, c, d) 0 @@ -2810,7 +2949,7 @@ #else /* HAVE_TRUSTED_CA */ -#define TCA_FREE_ALL(list, heap) +#define TCA_FREE_ALL(list, heap) WC_DO_NOTHING #define TCA_GET_SIZE(list) 0 #define TCA_WRITE(a, b) 0 #define TCA_PARSE(a, b, c, d) 0 @@ -2858,6 +2997,9 @@ WOLFSSL_ERROR_VERBOSE(UNKNOWN_MAX_FRAG_LEN_E); return UNKNOWN_MAX_FRAG_LEN_E; } + if (ssl->session != NULL) { + ssl->session->mfl = *input; + } #ifndef NO_WOLFSSL_SERVER if (isRequest) { @@ -2904,7 +3046,7 @@ #else -#define MFL_FREE_ALL(a, b) +#define MFL_FREE_ALL(a, b) WC_DO_NOTHING #define MFL_GET_SIZE(a) 0 #define MFL_WRITE(a, b) 0 #define MFL_PARSE(a, b, c, d) 0 @@ -2981,6 +3123,12 @@ break; } +#ifdef WOLFSSL_TLS13 + if (csr->response.buffer != NULL) { + XFREE(csr->response.buffer, csr->ssl->heap, + DYNAMIC_TYPE_TMP_BUFFER); + } +#endif XFREE(csr, heap, DYNAMIC_TYPE_TLSX); (void)heap; } @@ -3012,14 +3160,15 @@ return size; } -static word16 TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output, - byte isRequest) +static int TLSX_CSR_Write(CertificateStatusRequest* csr, byte* output, + byte isRequest) { /* shut up compiler warnings */ (void) csr; (void) output; (void) isRequest; #ifndef NO_WOLFSSL_CLIENT if (isRequest) { + int ret = 0; word16 offset = 0; word16 length = 0; @@ -3033,19 +3182,26 @@ offset += OPAQUE16_LEN; /* request extensions */ - if (csr->request.ocsp.nonceSz) - length = (word16)EncodeOcspRequestExtensions( - &csr->request.ocsp, + if (csr->request.ocsp.nonceSz) { + ret = (int)EncodeOcspRequestExtensions(&csr->request.ocsp, output + offset + OPAQUE16_LEN, OCSP_NONCE_EXT_SZ); + if (ret > 0) { + length = (word16)ret; + } + else { + return ret; + } + } + c16toa(length, output + offset); offset += OPAQUE16_LEN + length; break; } - return offset; + return (int)offset; } #endif #if defined(WOLFSSL_TLS13) && !defined(NO_WOLFSSL_SERVER) @@ -3112,7 +3268,7 @@ csr->status_type, csr->options, ssl, ssl->heap, ssl->devId); if (ret != WOLFSSL_SUCCESS) - return ret; + return ret == 0 ? -1 : ret; switch (csr->status_type) { case WOLFSSL_CSR_OCSP: @@ -3155,7 +3311,13 @@ ret = BUFFER_ERROR; } if (ret == 0) { - csr->response.buffer = (byte*)(input + offset); + csr->response.buffer = (byte*)XMALLOC(resp_length, ssl->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (csr->response.buffer == NULL) + ret = MEMORY_ERROR; + } + if (ret == 0) { + XMEMCPY(csr->response.buffer, input + offset, resp_length); csr->response.length = resp_length; } @@ -3217,7 +3379,7 @@ ret = TLSX_UseCertificateStatusRequest(&ssl->extensions, status_type, 0, ssl, ssl->heap, ssl->devId); if (ret != WOLFSSL_SUCCESS) - return ret; /* throw error */ + return ret == 0 ? -1 : ret; /* throw error */ #if defined(WOLFSSL_TLS13) if (ssl->options.tls1_3) { @@ -3233,15 +3395,23 @@ InitDecodedCert(cert, ssl->buffers.certificate->buffer, ssl->buffers.certificate->length, ssl->heap); ret = ParseCert(cert, CERT_TYPE, 1, SSL_CM(ssl)); - if (ret != 0 ) { + if (ret != 0) { + FreeDecodedCert(cert); XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT); + /* Let's not error out the connection if we can't verify our + * cert */ + if (ret == WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E) || + ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E)) + ret = 0; return ret; } ret = TLSX_CSR_InitRequest(ssl->extensions, cert, ssl->heap); if (ret != 0 ) { + FreeDecodedCert(cert); XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT); return ret; } + FreeDecodedCert(cert); XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT); extension = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST); @@ -3326,7 +3496,7 @@ if (SSL_CM(ssl)->ocspEnabled) { csr->request.ocsp.ssl = ssl; return CheckOcspRequest(SSL_CM(ssl)->ocsp, - &csr->request.ocsp, NULL); + &csr->request.ocsp, NULL, NULL); } else { WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL); @@ -3396,7 +3566,7 @@ #else -#define CSR_FREE_ALL(data, heap) +#define CSR_FREE_ALL(data, heap) WC_DO_NOTHING #define CSR_GET_SIZE(a, b) 0 #define CSR_WRITE(a, b, c) 0 #define CSR_PARSE(a, b, c, d) 0 @@ -3409,10 +3579,20 @@ #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 +static void TLSX_CSR2_FreePendingSigners(Signer *s, void* heap) +{ + Signer* next; + while(s) { + next = s->next; + FreeSigner(s, heap); + s = next; + } +} static void TLSX_CSR2_FreeAll(CertificateStatusRequestItemV2* csr2, void* heap) { CertificateStatusRequestItemV2* next; + TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, heap); for (; csr2; csr2 = next) { next = csr2->next; @@ -3460,7 +3640,7 @@ return size; } -static word16 TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2, +static int TLSX_CSR2_Write(CertificateStatusRequestItemV2* csr2, byte* output, byte isRequest) { /* shut up compiler warnings */ @@ -3468,6 +3648,7 @@ #ifndef NO_WOLFSSL_CLIENT if (isRequest) { + int ret = 0; word16 offset; word16 length; @@ -3495,12 +3676,20 @@ /* request extensions */ length = 0; - if (csr2->request.ocsp[0].nonceSz) - length = (word16)EncodeOcspRequestExtensions( + if (csr2->request.ocsp[0].nonceSz) { + ret = (int)EncodeOcspRequestExtensions( &csr2->request.ocsp[0], output + offset + OPAQUE16_LEN, OCSP_NONCE_EXT_SZ); + if (ret > 0) { + length = (word16)ret; + } + else { + return ret; + } + } + c16toa(length, output + offset); offset += OPAQUE16_LEN + length; break; @@ -3510,7 +3699,7 @@ /* list size */ c16toa(offset - OPAQUE16_LEN, output); - return offset; + return (int)offset; } #endif @@ -3674,6 +3863,83 @@ return 0; } +static CertificateStatusRequestItemV2* TLSX_CSR2_GetMulti(TLSX *extensions) +{ + TLSX* extension = TLSX_Find(extensions, TLSX_STATUS_REQUEST_V2); + CertificateStatusRequestItemV2* csr2 = extension ? + (CertificateStatusRequestItemV2*)extension->data : NULL; + + for (; csr2; csr2 = csr2->next) { + if (csr2->status_type == WOLFSSL_CSR2_OCSP_MULTI) + return csr2; + } + return NULL; +} + +int TLSX_CSR2_IsMulti(TLSX *extensions) +{ + return TLSX_CSR2_GetMulti(extensions) != NULL; +} + +int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s) +{ + CertificateStatusRequestItemV2* csr2; + + csr2 = TLSX_CSR2_GetMulti(extensions); + if (!csr2) + return -1; + + s->next = csr2->pendingSigners; + csr2->pendingSigners = s; + return 0; +} + +Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions) +{ + CertificateStatusRequestItemV2* csr2; + + csr2 = TLSX_CSR2_GetMulti(extensions); + if (!csr2) + return NULL; + + return csr2->pendingSigners; +} + +int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl) +{ + CertificateStatusRequestItemV2* csr2; + + csr2 = TLSX_CSR2_GetMulti(ssl->extensions); + if (csr2 == NULL) + return 0; + + TLSX_CSR2_FreePendingSigners(csr2->pendingSigners, SSL_CM(ssl)->heap); + csr2->pendingSigners = NULL; + return 0; +} + +int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl) +{ + CertificateStatusRequestItemV2* csr2; + Signer *s, *next; + int r = 0; + + csr2 = TLSX_CSR2_GetMulti(ssl->extensions); + if (csr2 == NULL) + return 0; + + s = csr2->pendingSigners; + while (s != NULL) { + next = s->next; + r = AddSigner(SSL_CM(ssl), s); + if (r != 0) + FreeSigner(s, SSL_CM(ssl)->heap); + s = next; + } + csr2->pendingSigners = NULL; + return r; +} + int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer, void* heap) { @@ -3755,10 +4021,10 @@ /* followed by */ case WOLFSSL_CSR2_OCSP_MULTI: - if (SSL_CM(ssl)->ocspEnabled) { - csr2->request.ocsp[0].ssl = ssl; + if (SSL_CM(ssl)->ocspEnabled && csr2->requests >= 1) { + csr2->request.ocsp[csr2->requests-1].ssl = ssl; return CheckOcspRequest(SSL_CM(ssl)->ocsp, - &csr2->request.ocsp[0], NULL); + &csr2->request.ocsp[csr2->requests-1], NULL, NULL); } else { WOLFSSL_ERROR_VERBOSE(OCSP_LOOKUP_FAIL); @@ -3842,7 +4108,7 @@ #else -#define CSR2_FREE_ALL(data, heap) +#define CSR2_FREE_ALL(data, heap) WC_DO_NOTHING #define CSR2_GET_SIZE(a, b) 0 #define CSR2_WRITE(a, b, c) 0 #define CSR2_PARSE(a, b, c, d) 0 @@ -3856,10 +4122,10 @@ #ifdef HAVE_SUPPORTED_CURVES #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && !defined(HAVE_CURVE448) \ - && !defined(HAVE_FFDHE) && !defined(HAVE_PQC) + && !defined(HAVE_FFDHE) && !defined(WOLFSSL_HAVE_KYBER) #error Elliptic Curves Extension requires Elliptic Curve Cryptography or liboqs groups. \ Use --enable-ecc and/or --enable-liboqs in the configure script or \ - define HAVE_ECC. Alternatively use FFDHE for DH ciphersuites. + define HAVE_ECC. Alternatively use FFDHE for DH cipher suites. #endif static int TLSX_SupportedCurve_New(SupportedCurve** curve, word16 name, @@ -3924,7 +4190,7 @@ static int TLSX_SupportedCurve_Append(SupportedCurve* list, word16 name, void* heap) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); while (list) { if (list->name == name) { @@ -3945,7 +4211,7 @@ static int TLSX_PointFormat_Append(PointFormat* list, byte format, void* heap) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); while (list) { if (list->format == format) { @@ -3986,6 +4252,21 @@ for (i = 0; i < suites->suiteSz; i += 2) { if (suites->suites[i] == TLS13_BYTE) return; + #ifdef BUILD_TLS_SM4_GCM_SM3 + if ((suites->suites[i] == CIPHER_BYTE) && + (suites->suites[i+1] == TLS_SM4_GCM_SM3)) + return; + #endif + #ifdef BUILD_TLS_SM4_CCM_SM3 + if ((suites->suites[i] == CIPHER_BYTE) && + (suites->suites[i+1] == TLS_SM4_CCM_SM3)) + return; + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + if ((suites->suites[i] == SM_BYTE) && + (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)) + return; + #endif if ((suites->suites[i] == ECC_BYTE) || (suites->suites[i] == ECDHE_PSK_BYTE) || (suites->suites[i] == CHACHA_BYTE)) { @@ -4023,6 +4304,21 @@ for (i = 0; i < suites->suiteSz; i += 2) { if (suites->suites[i] == TLS13_BYTE) return; + #ifdef BUILD_TLS_SM4_GCM_SM3 + if ((suites->suites[i] == CIPHER_BYTE) && + (suites->suites[i+1] == TLS_SM4_GCM_SM3)) + return; + #endif + #ifdef BUILD_TLS_SM4_CCM_SM3 + if ((suites->suites[i] == CIPHER_BYTE) && + (suites->suites[i+1] == TLS_SM4_CCM_SM3)) + return; + #endif + #ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + if ((suites->suites[i] == SM_BYTE) && + (suites->suites[i+1] == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)) + return; + #endif if ((suites->suites[i] == ECC_BYTE) || (suites->suites[i] == ECDHE_PSK_BYTE) || (suites->suites[i] == CHACHA_BYTE)) { @@ -4050,6 +4346,21 @@ if (ssl->options.cipherSuite0 == TLS13_BYTE) return; +#ifdef BUILD_TLS_SM4_GCM_SM3 + if ((ssl->options.cipherSuite0 == CIPHER_BYTE) && + (ssl->options.cipherSuite == TLS_SM4_GCM_SM3)) + return; +#endif +#ifdef BUILD_TLS_SM4_CCM_SM3 + if ((ssl->options.cipherSuite0 == CIPHER_BYTE) && + (ssl->options.cipherSuite == TLS_SM4_CCM_SM3)) + return; +#endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + if ((ssl->options.cipherSuite0 == SM_BYTE) && + (ssl->options.cipherSuite == TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3)) + return; +#endif #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) if (ssl->options.cipherSuite0 == ECC_BYTE || ssl->options.cipherSuite0 == ECDHE_PSK_BYTE || @@ -4064,7 +4375,7 @@ #endif /* !NO_WOLFSSL_SERVER */ -#ifndef NO_WOLFSSL_CLIENT +#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13) static word16 TLSX_SupportedCurve_GetSize(SupportedCurve* list) { @@ -4094,7 +4405,7 @@ return length; } -#ifndef NO_WOLFSSL_CLIENT +#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13) static word16 TLSX_SupportedCurve_Write(SupportedCurve* list, byte* output) { @@ -4187,7 +4498,7 @@ ret = TLSX_UseSupportedCurve(extensions, name, ssl->heap); /* If it is BAD_FUNC_ARG then it is a group we do not support, but * that is fine. */ - if (ret != WOLFSSL_SUCCESS && ret != BAD_FUNC_ARG) { + if (ret != WOLFSSL_SUCCESS && ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { return ret; } } @@ -4557,6 +4868,7 @@ int ephmSuite = 0; word16 octets = 0; /* according to 'ecc_set_type ecc_sets[];' */ int key = 0; /* validate key */ + int foundCurve = 0; /* Found at least one supported curve */ (void)oid; @@ -4585,8 +4897,7 @@ #ifdef OPENSSL_EXTRA /* skip if name is not in supported ECC range * or disabled by user */ - if (curve->name > WOLFSSL_ECC_MAX || - wolfSSL_curve_is_disabled(ssl, curve->name)) + if (wolfSSL_curve_is_disabled(ssl, curve->name)) continue; #endif @@ -4670,6 +4981,12 @@ octets = 32; break; #endif /* HAVE_ECC_BRAINPOOL */ + #ifdef WOLFSSL_SM2 + case WOLFSSL_ECC_SM2P256V1: + oid = ECC_SM2P256V1_OID; + octets = 32; + break; + #endif /* WOLFSSL_SM2 */ #endif #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP @@ -4713,6 +5030,8 @@ default: continue; /* unsupported curve */ } + foundCurve = 1; + #ifdef HAVE_ECC /* Set default Oid */ if (defOid == 0 && ssl->eccTempKeySz <= octets && defSz > octets) { @@ -4857,6 +5176,10 @@ } } + /* Check we found at least one supported curve */ + if (!foundCurve) + return 0; + *ecdhCurveOID = ssl->ecdhCurveOID; /* Choose the default if it is at the required strength. */ #ifdef HAVE_ECC @@ -4983,7 +5306,10 @@ #define EC_FREE_ALL TLSX_SupportedCurve_FreeAll #define EC_VALIDATE_REQUEST TLSX_SupportedCurve_ValidateRequest -#ifndef NO_WOLFSSL_CLIENT +/* In TLS 1.2 the server never sends supported curve extension, but in TLS 1.3 + * the server can send supported groups extension to indicate what it will + * support for later connections. */ +#if !defined(NO_WOLFSSL_CLIENT) || defined(WOLFSSL_TLS13) #define EC_GET_SIZE TLSX_SupportedCurve_GetSize #define EC_WRITE TLSX_SupportedCurve_Write #else @@ -5013,18 +5339,18 @@ #else -#define EC_FREE_ALL(list, heap) +#define EC_FREE_ALL(list, heap) WC_DO_NOTHING #define EC_GET_SIZE(list) 0 #define EC_WRITE(a, b) 0 #define EC_PARSE(a, b, c, d, e) 0 -#define EC_VALIDATE_REQUEST(a, b) +#define EC_VALIDATE_REQUEST(a, b) WC_DO_NOTHING -#define PF_FREE_ALL(list, heap) +#define PF_FREE_ALL(list, heap) WC_DO_NOTHING #define PF_GET_SIZE(list) 0 #define PF_WRITE(a, b) 0 #define PF_PARSE(a, b, c, d) 0 -#define PF_VALIDATE_REQUEST(a, b) -#define PF_VALIDATE_RESPONSE(a, b) +#define PF_VALIDATE_REQUEST(a, b) WC_DO_NOTHING +#define PF_VALIDATE_RESPONSE(a, b) WC_DO_NOTHING #endif /* HAVE_SUPPORTED_CURVES */ @@ -5077,7 +5403,7 @@ static int TLSX_SecureRenegotiation_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte isRequest) { - int ret = SECURE_RENEGOTIATION_E; + int ret = WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E); if (length >= OPAQUE8_LEN) { if (isRequest) { @@ -5087,7 +5413,7 @@ if (ret == WOLFSSL_SUCCESS) ret = 0; } - if (ret != 0 && ret != SECURE_RENEGOTIATION_E) { + if (ret != 0 && ret != WC_NO_ERR_TRACE(SECURE_RENEGOTIATION_E)) { } else if (ssl->secure_renegotiation == NULL) { } @@ -5157,6 +5483,12 @@ } #endif } + else { + ret = SECURE_RENEGOTIATION_E; + } + } + else { + ret = SECURE_RENEGOTIATION_E; } if (ret != 0) { @@ -5219,7 +5551,7 @@ #else -#define SCR_FREE_ALL(a, heap) +#define SCR_FREE_ALL(a, heap) WC_DO_NOTHING #define SCR_GET_SIZE(a, b) 0 #define SCR_WRITE(a, b, c) 0 #define SCR_PARSE(a, b, c, d) 0 @@ -5296,6 +5628,13 @@ return 0; } +#ifdef HAVE_SECURE_RENEGOTIATION + if (IsSCR(ssl)) { + WOLFSSL_MSG("Client sent session ticket during SCR. Ignoring."); + return 0; + } +#endif + if (length > SESSION_TICKET_LEN) { ret = BAD_TICKET_MSG_SZ; WOLFSSL_ERROR_VERBOSE(ret); @@ -5343,7 +5682,7 @@ WOLFSSL_MSG("Process client ticket rejected, not using"); ssl->options.rejectTicket = 1; ret = 0; /* not fatal */ - } else if (ret == VERSION_ERROR) { + } else if (ret == WC_NO_ERR_TRACE(VERSION_ERROR)) { WOLFSSL_MSG("Process client ticket rejected, bad TLS version"); ssl->options.rejectTicket = 1; ret = 0; /* not fatal */ @@ -5418,8 +5757,8 @@ #else -#define WOLF_STK_FREE(a, b) -#define WOLF_STK_VALIDATE_REQUEST(a) +#define WOLF_STK_FREE(a, b) WC_DO_NOTHING +#define WOLF_STK_VALIDATE_REQUEST(a) WC_DO_NOTHING #define WOLF_STK_GET_SIZE(a, b) 0 #define WOLF_STK_WRITE(a, b, c) 0 #define WOLF_STK_PARSE(a, b, c, d) 0 @@ -5645,7 +5984,7 @@ static int TLSX_UseSRTP_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte isRequest) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); word16 profile_len = 0; word16 profile_value = 0; word16 offset = 0; @@ -5685,6 +6024,12 @@ /* parse remainder one profile at a time, looking for match in CTX */ ret = 0; for (i=offset; ioptions.dtls) { tls13minor = (byte)DTLSv1_3_MINOR; + #ifndef WOLFSSL_NO_TLS12 tls12minor = (byte)DTLSv1_2_MINOR; + #endif + #ifndef NO_OLD_TLS tls11minor = (byte)DTLS_MINOR; + #endif isDtls = 1; } #endif /* WOLFSSL_DTLS13 */ @@ -6326,7 +6675,7 @@ return BUFFER_E; if (msgType == hello_retry_request) - return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 0, + return TLSX_Cookie_Use(ssl, input + idx, len, NULL, 0, 1, &ssl->extensions); /* client_hello */ @@ -6421,6 +6770,183 @@ #define CKE_PARSE(a, b, c, d) 0 #endif + +#if defined(WOLFSSL_TLS13) && !defined(NO_CERTS) && \ + !defined(WOLFSSL_NO_CA_NAMES) && defined(OPENSSL_EXTRA) +/* Currently only settable through compatibility API */ +/******************************************************************************/ +/* Certificate Authorities */ +/******************************************************************************/ + +static word16 TLSX_CA_Names_GetSize(void* data) +{ + WOLFSSL* ssl = (WOLFSSL*)data; + WOLF_STACK_OF(WOLFSSL_X509_NAME)* names; + word16 size = 0; + + if (ssl->options.side == WOLFSSL_CLIENT_END) { + /* To add support use a different member like ssl->ca_names and + * add accessor functions: + * - *_set0_CA_list + * - *_get0_CA_list */ + WOLFSSL_MSG("We don't currently support sending the client's list."); + return 0; + } + + /* Length of names */ + size += OPAQUE16_LEN; + for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) { + byte seq[MAX_SEQ_SZ]; + WOLFSSL_X509_NAME* name = names->data.name; + + if (name != NULL) { + /* 16-bit length | SEQ | Len | DER of name */ + size += (word16)(OPAQUE16_LEN + SetSequence(name->rawLen, seq) + + name->rawLen); + } + } + return size; +} + +static word16 TLSX_CA_Names_Write(void* data, byte* output) +{ + WOLFSSL* ssl = (WOLFSSL*)data; + WOLF_STACK_OF(WOLFSSL_X509_NAME)* names; + byte* len; + + if (ssl->options.side == WOLFSSL_CLIENT_END) { + /* To add support use a different member like ssl->ca_names and + * add accessor functions: + * - *_set0_CA_list + * - *_get0_CA_list */ + WOLFSSL_MSG("We don't currently support sending the client's list."); + return 0; + } + + /* Reserve space for the length value */ + len = output; + output += OPAQUE16_LEN; + for (names = SSL_CA_NAMES(ssl); names != NULL; names = names->next) { + byte seq[MAX_SEQ_SZ]; + WOLFSSL_X509_NAME* name = names->data.name; + + if (name != NULL) { + c16toa((word16)name->rawLen + + (word16)SetSequence(name->rawLen, seq), output); + output += OPAQUE16_LEN; + output += SetSequence(name->rawLen, output); + XMEMCPY(output, name->raw, name->rawLen); + output += name->rawLen; + } + } + /* Write the total length */ + c16toa((word16)(output - len - OPAQUE16_LEN), len); + return (word16)(output - len); +} + +static int TLSX_CA_Names_Parse(WOLFSSL *ssl, const byte* input, + word16 length, byte isRequest) +{ + word16 extLen; + + (void)isRequest; + + if (ssl->options.side == WOLFSSL_SERVER_END) { + /* To add support use a different member like ssl->ca_names and + * add accessor functions: + * - *_set0_CA_list + * - *_get0_CA_list */ + WOLFSSL_MSG("We don't currently support parsing the client's list."); + return 0; + } + + if (ssl->client_ca_names != ssl->ctx->client_ca_names) + wolfSSL_sk_X509_NAME_pop_free(ssl->client_ca_names, NULL); + ssl->client_ca_names = wolfSSL_sk_X509_NAME_new(NULL); + if (ssl->client_ca_names == NULL) + return MEMORY_ERROR; + + if (length < OPAQUE16_LEN) + return BUFFER_ERROR; + + ato16(input, &extLen); + input += OPAQUE16_LEN; + length -= OPAQUE16_LEN; + if (extLen != length) + return BUFFER_ERROR; + + while (length) { + word32 idx = 0; + WOLFSSL_X509_NAME* name = NULL; + int ret = 0; + int didInit = FALSE; + /* Use a DecodedCert struct to get access to GetName to + * parse DN name */ +#ifdef WOLFSSL_SMALL_STACK + DecodedCert *cert = (DecodedCert *)XMALLOC( + sizeof(*cert), ssl->heap, DYNAMIC_TYPE_DCERT); + if (cert == NULL) + return MEMORY_ERROR; +#else + DecodedCert cert[1]; +#endif + + if (length < OPAQUE16_LEN) { + ret = BUFFER_ERROR; + } + + if (ret == 0) { + ato16(input, &extLen); + idx += OPAQUE16_LEN; + + if (idx + extLen > length) + ret = BUFFER_ERROR; + } + + if (ret == 0) { + InitDecodedCert(cert, input + idx, extLen, ssl->heap); + didInit = TRUE; + idx += extLen; + ret = GetName(cert, SUBJECT, extLen); + } + + if (ret == 0 && (name = wolfSSL_X509_NAME_new()) == NULL) + ret = MEMORY_ERROR; + + if (ret == 0) { + CopyDecodedName(name, cert, SUBJECT); + if (wolfSSL_sk_X509_NAME_push(ssl->client_ca_names, name) + == WOLFSSL_FAILURE) + ret = MEMORY_ERROR; + } + + if (didInit) + FreeDecodedCert(cert); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(cert, ssl->heap, DYNAMIC_TYPE_DCERT); +#endif + if (ret != 0) + return ret; + + input += idx; + length -= (word16)idx; + } + return 0; +} + +#define CAN_GET_SIZE TLSX_CA_Names_GetSize +#define CAN_WRITE TLSX_CA_Names_Write +#define CAN_PARSE TLSX_CA_Names_Parse + +#else + +#define CAN_GET_SIZE(...) 0 +#define CAN_WRITE(...) 0 +#define CAN_PARSE(...) 0 + +#endif + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) /******************************************************************************/ /* Signature Algorithms */ @@ -6831,7 +7357,7 @@ kse->pubKey, &kse->pubKeyLen /* public */ ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -7087,7 +7613,7 @@ word16 curveId = (word16) ECC_CURVE_INVALID; ecc_key* eccKey = (ecc_key*)kse->key; - /* TODO: [TLS13] The key sizes should come from wolfcrypt. */ + /* TODO: [TLS13] Get key sizes using wc_ecc_get_curve_size_from_id. */ /* Translate named group to a curve id. */ switch (kse->group) { #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 @@ -7097,6 +7623,12 @@ keySize = 32; break; #endif /* !NO_ECC_SECP */ + #ifdef WOLFSSL_SM2 + case WOLFSSL_ECC_SM2P256V1: + curveId = ECC_SM2P256V1; + keySize = 32; + break; + #endif /* !NO_ECC_SECP */ #endif #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP @@ -7120,25 +7652,28 @@ } if (kse->key == NULL) { - kse->keyLen = keySize; - kse->pubKeyLen = keySize * 2 + 1; - - #if defined(WOLFSSL_RENESAS_TSIP_TLS) - ret = tsip_Tls13GenEccKeyPair(ssl, kse); - if (ret != CRYPTOCB_UNAVAILABLE) { - return ret; - } - #endif /* Allocate an ECC key to hold private key. */ kse->key = (byte*)XMALLOC(sizeof(ecc_key), ssl->heap, DYNAMIC_TYPE_ECC); if (kse->key == NULL) { - WOLFSSL_MSG("EccTempKey Memory error"); + WOLFSSL_MSG_EX("Failed to allocate %d bytes, ssl->heap: %p", + (int)sizeof(ecc_key), (wc_ptr_t)ssl->heap); + WOLFSSL_MSG("EccTempKey Memory error!"); return MEMORY_E; } - /* Make an ECC key */ + /* Initialize an ECC key struct for the ephemeral key */ ret = wc_ecc_init_ex((ecc_key*)kse->key, ssl->heap, ssl->devId); + if (ret == 0) { + kse->keyLen = keySize; + kse->pubKeyLen = keySize * 2 + 1; + + #if defined(WOLFSSL_RENESAS_TSIP_TLS) + ret = tsip_Tls13GenEccKeyPair(ssl, kse); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { + return ret; + } + #endif /* setting eccKey means okay to call wc_ecc_free */ eccKey = (ecc_key*)kse->key; @@ -7150,14 +7685,24 @@ /* set curve info for EccMakeKey "peer" info */ ret = wc_ecc_set_curve(eccKey, kse->keyLen, curveId); if (ret == 0) { - /* Generate ephemeral ECC key */ - /* For async this is called once and when event is done, the - * provided buffers in key be populated. - * Final processing is x963 key export below. */ - ret = EccMakeKey(ssl, eccKey, eccKey); + #ifdef WOLFSSL_ASYNC_CRYPT + /* Detect when private key generation is done */ + if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) && + eccKey->type == ECC_PRIVATEKEY) { + ret = 0; /* ECC Key Generation is done */ + } + else + #endif + { + /* Generate ephemeral ECC key */ + /* For async this is called once and when event is done, the + * provided buffers in key be populated. + * Final processing is x963 key export below. */ + ret = EccMakeKey(ssl, eccKey, eccKey); + } } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif } @@ -7216,7 +7761,7 @@ return ret; } -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER static int kyber_id2type(int id, int *type) { int ret = 0; @@ -7311,9 +7856,16 @@ word32 privSz = 0; word32 pubSz = 0; + /* This gets called twice. Once during parsing of the key share and once + * during the population of the extension. No need to do work the second + * time. Just return success if its already been done. */ + if (kse->pubKey != NULL) { + return ret; + } + findEccPqc(&ecc_group, &oqs_group, kse->group); ret = kyber_id2type(oqs_group, &type); - if (ret == NOT_COMPILED_IN) { + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { WOLFSSL_MSG("Invalid Kyber algorithm specified."); ret = BAD_FUNC_ARG; } @@ -7380,17 +7932,19 @@ ret = wc_KyberKey_EncodePrivateKey(kem, privKey, privSz); } if (ret == 0) { - XMEMCPY(pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen); + if (ecc_kse->pubKeyLen > 0) + XMEMCPY(pubKey, ecc_kse->pubKey, ecc_kse->pubKeyLen); kse->pubKey = pubKey; kse->pubKeyLen = ecc_kse->pubKeyLen + pubSz; pubKey = NULL; /* Note we are saving the OQS private key and ECC private key * separately. That's because the ECC private key is not simply a - * buffer. Its is an ecc_key struct. - */ + * buffer. Its is an ecc_key struct. Typically do not need the private + * key size, but will need to zero it out upon freeing. */ kse->privKey = privKey; privKey = NULL; + kse->privKeyLen = privSz; kse->key = ecc_kse->key; ecc_kse->key = NULL; @@ -7410,7 +7964,7 @@ return ret; } -#endif /* HAVE_PQC */ +#endif /* WOLFSSL_HAVE_KYBER */ /* Generate a secret/key using the key share entry. * @@ -7427,7 +7981,7 @@ ret = TLSX_KeyShare_GenX25519Key(ssl, kse); else if (kse->group == WOLFSSL_ECC_X448) ret = TLSX_KeyShare_GenX448Key(ssl, kse); -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER else if (WOLFSSL_NAMED_GROUP_IS_PQC(kse->group)) ret = TLSX_KeyShare_GenPqcKey(ssl, kse); #endif @@ -7465,10 +8019,20 @@ wc_curve448_free((curve448_key*)current->key); #endif } -#ifdef HAVE_PQC - else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group) && - current->key != NULL) { - ForceZero((byte*)current->key, current->keyLen); +#ifdef WOLFSSL_HAVE_KYBER + else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) { + if (current->key != NULL) { + ForceZero((byte*)current->key, current->keyLen); + } + if (current->pubKey != NULL) { + XFREE(current->pubKey, heap, DYNAMIC_TYPE_PUBLIC_KEY); + current->pubKey = NULL; + } + if (current->privKey != NULL) { + ForceZero(current->privKey, current->privKeyLen); + XFREE(current->privKey, heap, DYNAMIC_TYPE_PRIVATE_KEY); + current->privKey = NULL; + } } #endif else { @@ -7662,7 +8226,7 @@ NULL, 0 ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -7887,6 +8451,11 @@ curveId = ECC_SECP256R1; break; #endif /* !NO_ECC_SECP */ + #ifdef WOLFSSL_SM2 + case WOLFSSL_ECC_SM2P256V1: + curveId = ECC_SM2P256V1; + break; + #endif #endif #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP @@ -7929,7 +8498,7 @@ } #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13GenSharedSecret(ssl, keyShareEntry); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { return ret; } ret = 0; @@ -7971,7 +8540,7 @@ ssl->options.side ); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif } @@ -8005,7 +8574,7 @@ return ret; } -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER /* Process the Kyber key share extension on the client side. * * ssl The SSL/TLS object. @@ -8044,7 +8613,7 @@ XMEMCPY(ssl->arrays->preMasterSecret, keyShareEntry->ke, keyShareEntry->keLen); ssl->arrays->preMasterSz = keyShareEntry->keLen; - XFREE(keyShareEntry->ke, sl->heap, DYNAMIC_TYPE_SECRET) + XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_SECRET); keyShareEntry->ke = NULL; keyShareEntry->keLen = 0; return 0; @@ -8053,16 +8622,24 @@ /* I am the client, the ciphertext is in keyShareEntry->ke */ findEccPqc(&ecc_group, &oqs_group, keyShareEntry->group); + ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId); + if (ret != 0) { + WOLFSSL_MSG("Memory allocation error."); + return MEMORY_E; + } + ret = kyber_id2type(oqs_group, &type); if (ret != 0) { + wc_ecc_free(&eccpubkey); WOLFSSL_MSG("Invalid OQS algorithm specified."); - ret = BAD_FUNC_ARG; + return BAD_FUNC_ARG; } - if (ret == 0) { - ret = wc_KyberKey_Init(type, kem, ssl->heap, INVALID_DEVID); - if (ret != 0) { - WOLFSSL_MSG("Error creating Kyber KEM"); - } + + ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId); + if (ret != 0) { + wc_ecc_free(&eccpubkey); + WOLFSSL_MSG("Error creating Kyber KEM"); + return MEMORY_E; } if (ret == 0) { @@ -8086,12 +8663,6 @@ default: break; } - - ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId); - if (ret != 0) { - WOLFSSL_MSG("Memory allocation error."); - ret = MEMORY_E; - } } if (ret == 0) { sharedSecret = (byte*)XMALLOC(sharedSecretLen, ssl->heap, @@ -8172,7 +8743,7 @@ wc_KyberKey_Free(kem); return ret; } -#endif /* HAVE_PQC */ +#endif /* WOLFSSL_HAVE_KYBER */ /* Process the key share extension on the client side. * @@ -8198,7 +8769,7 @@ ret = TLSX_KeyShare_ProcessX25519(ssl, keyShareEntry); else if (keyShareEntry->group == WOLFSSL_ECC_X448) ret = TLSX_KeyShare_ProcessX448(ssl, keyShareEntry); -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER else if (WOLFSSL_NAMED_GROUP_IS_PQC(keyShareEntry->group)) ret = TLSX_KeyShare_ProcessPqc(ssl, keyShareEntry); #endif @@ -8249,7 +8820,7 @@ if (keLen > length - offset) return BUFFER_ERROR; -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER if (WOLFSSL_NAMED_GROUP_IS_PQC(group) && ssl->options.side == WOLFSSL_SERVER_END) { /* For KEMs, the public key is not stored. Casting away const because @@ -8320,8 +8891,7 @@ TLSX* extension; SupportedCurve* curve = NULL; - if ((extension = TLSX_Find(extensions, - TLSX_SUPPORTED_GROUPS)) == NULL) { + if ((extension = TLSX_Find(extensions, TLSX_SUPPORTED_GROUPS)) == NULL) { if ((extension = TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS)) == NULL) { return 0; @@ -8392,7 +8962,7 @@ int TLSX_KeyShare_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType) { - int ret; + int ret = 0; KeyShareEntry *keyShareEntry = NULL; word16 group; @@ -8429,7 +8999,7 @@ /* Not in list sent if there isn't a private key. */ if (keyShareEntry == NULL || (keyShareEntry->key == NULL - #if !defined(NO_DH) || defined(HAVE_PQC) + #if !defined(NO_DH) || defined(WOLFSSL_HAVE_KYBER) && keyShareEntry->privKey == NULL #endif )) { @@ -8451,7 +9021,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* only perform find and clear TLSX if not returning from async */ - if (ssl->error != WC_PENDING_E) + if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* Check the selected group was supported by ClientHello extensions. */ @@ -8472,12 +9042,7 @@ return ret; } -#ifdef HAVE_PQC - /* For post-quantum groups, do this in TLSX_PopulateExtensions(). */ - if (!WOLFSSL_NAMED_GROUP_IS_PQC(group)) -#endif - ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions); - + ret = TLSX_KeyShare_Use(ssl, group, 0, NULL, NULL, &ssl->extensions); if (ret == 0) ssl->session->namedGroup = ssl->namedGroup = group; } @@ -8526,7 +9091,7 @@ return 0; } -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER static int server_generate_pqc_ciphertext(WOLFSSL* ssl, KeyShareEntry* keyShareEntry, byte* data, word16 len) { @@ -8553,16 +9118,22 @@ ret = kyber_id2type(oqs_group, &type); if (ret != 0) { WOLFSSL_MSG("Invalid Kyber algorithm specified."); - ret = BAD_FUNC_ARG; + return BAD_FUNC_ARG; } - if (ret == 0) { - ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId); - if (ret != 0) { - WOLFSSL_MSG("Could not do ECC public key initialization."); - ret = MEMORY_E; - } + ret = wc_ecc_init_ex(&eccpubkey, ssl->heap, ssl->devId); + if (ret != 0) { + WOLFSSL_MSG("Could not do ECC public key initialization."); + return MEMORY_E; } + + ret = wc_KyberKey_Init(type, kem, ssl->heap, ssl->devId); + if (ret != 0) { + wc_ecc_free(&eccpubkey); + WOLFSSL_MSG("Error creating Kyber KEM"); + return MEMORY_E; + } + if (ret == 0) { ecc_kse = (KeyShareEntry*)XMALLOC(sizeof(*ecc_kse), ssl->heap, DYNAMIC_TYPE_TLSX); @@ -8579,20 +9150,10 @@ if (ret == 0 && ecc_group != 0) { ecc_kse->group = ecc_group; ret = TLSX_KeyShare_GenEccKey(ssl, ecc_kse); - if (ret != 0) { - /* No message, TLSX_KeyShare_GenEccKey() will do it. */ - return ret; - } - ret = 0; + /* No message, TLSX_KeyShare_GenEccKey() will do it. */ } if (ret == 0) { - ret = wc_KyberKey_Init(type, kem, ssl->heap, INVALID_DEVID); - if (ret != 0) { - WOLFSSL_MSG("Error creating Kyber KEM"); - } - } - if (ret == 0) { ret = wc_KyberKey_PublicKeySize(kem, &pubSz); } if (ret == 0) { @@ -8609,7 +9170,7 @@ if (ret == 0) { sharedSecret = (byte*)XMALLOC(ecc_kse->keyLen + ssSz, ssl->heap, - DYNAMIC_TYPE_TLSX); + DYNAMIC_TYPE_SECRET); ciphertext = (byte*)XMALLOC(ecc_kse->pubKeyLen + ctSz, ssl->heap, DYNAMIC_TYPE_TLSX); @@ -8671,22 +9232,27 @@ keyShareEntry->keLen = outlen + ssSz; sharedSecret = NULL; - XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen); + if (ecc_kse->pubKeyLen > 0) + XMEMCPY(ciphertext, ecc_kse->pubKey, ecc_kse->pubKeyLen); keyShareEntry->pubKey = ciphertext; keyShareEntry->pubKeyLen = (word32)(ecc_kse->pubKeyLen + ctSz); ciphertext = NULL; + + /* Set namedGroup so wolfSSL_get_curve_name() can function properly on + * the server side. */ + ssl->namedGroup = keyShareEntry->group; } TLSX_KeyShare_FreeAll(ecc_kse, ssl->heap); if (sharedSecret != NULL) - XFREE(sharedSecret, ssl->heap, DYNAMIC_TYPE_TLSX); + XFREE(sharedSecret, ssl->heap, DYNAMIC_TYPE_SECRET); if (ciphertext != NULL) XFREE(ciphertext, ssl->heap, DYNAMIC_TYPE_TLSX); wc_ecc_free(&eccpubkey); wc_KyberKey_Free(kem); return ret; } -#endif /* HAVE_PQC */ +#endif /* WOLFSSL_HAVE_KYBER */ /* Use the data to create a new key share object in the extensions. * @@ -8735,7 +9301,7 @@ } -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER if (WOLFSSL_NAMED_GROUP_IS_PQC(group) && ssl->options.side == WOLFSSL_SERVER_END) { ret = server_generate_pqc_ciphertext((WOLFSSL*)ssl, keyShareEntry, data, @@ -8833,6 +9399,10 @@ case WOLFSSL_ECC_BRAINPOOLP256R1: break; #endif + #ifdef WOLFSSL_SM2 + case WOLFSSL_ECC_SM2P256V1: + break; + #endif /* WOLFSSL_SM2 */ #endif #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256 case WOLFSSL_ECC_X25519: @@ -8898,16 +9468,19 @@ break; #endif #endif - #ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER #ifdef WOLFSSL_WC_KYBER #ifdef WOLFSSL_KYBER512 case WOLFSSL_KYBER_LEVEL1: + case WOLFSSL_P256_KYBER_LEVEL1: #endif #ifdef WOLFSSL_KYBER768 case WOLFSSL_KYBER_LEVEL3: + case WOLFSSL_P384_KYBER_LEVEL3: #endif #ifdef WOLFSSL_KYBER1024 case WOLFSSL_KYBER_LEVEL5: + case WOLFSSL_P521_KYBER_LEVEL5: #endif break; #elif defined(HAVE_LIBOQS) @@ -8922,7 +9495,7 @@ int id; findEccPqc(NULL, &namedGroup, namedGroup); ret = kyber_id2type(namedGroup, &id); - if (ret == NOT_COMPILED_IN) { + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { return 0; } @@ -8935,7 +9508,7 @@ case WOLFSSL_KYBER_LEVEL1: break; #endif - #endif /* HAVE_PQC */ +#endif default: return 0; } @@ -8948,6 +9521,9 @@ #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \ defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256 WOLFSSL_ECC_SECP256R1, +#if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2) + WOLFSSL_ECC_SM2P256V1, +#endif #endif #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256 WOLFSSL_ECC_X25519, @@ -8981,12 +9557,15 @@ #ifdef WOLFSSL_WC_KYBER #ifdef WOLFSSL_KYBER512 WOLFSSL_KYBER_LEVEL1, + WOLFSSL_P256_KYBER_LEVEL1, #endif #ifdef WOLFSSL_KYBER768 WOLFSSL_KYBER_LEVEL3, + WOLFSSL_P384_KYBER_LEVEL3, #endif #ifdef WOLFSSL_KYBER1024 WOLFSSL_KYBER_LEVEL5, + WOLFSSL_P521_KYBER_LEVEL5, #endif #elif defined(HAVE_LIBOQS) /* These require a runtime call to TLSX_KeyShare_IsSupported to use */ @@ -9090,7 +9669,7 @@ kse = (KeyShareEntry*)extension->data; /* We should not be computing keys if we are only going to advertise * our choice here. */ - if (kse != NULL && kse->lastRet == WC_PENDING_E) { + if (kse != NULL && kse->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) { WOLFSSL_ERROR_VERBOSE(BAD_KEY_SHARE_DATA); return BAD_KEY_SHARE_DATA; } @@ -9121,9 +9700,124 @@ return ret; } +#ifdef WOLFSSL_DUAL_ALG_CERTS +/* Writes the CKS objects of a list in a buffer. */ +static word16 CKS_WRITE(WOLFSSL* ssl, byte* output) +{ + XMEMCPY(output, ssl->sigSpec, ssl->sigSpecSz); + return ssl->sigSpecSz; +} + +static int TLSX_UseCKS(TLSX** extensions, WOLFSSL* ssl, void* heap) +{ + int ret = 0; + TLSX* extension; + + if (extensions == NULL) { + return BAD_FUNC_ARG; + } + + extension = TLSX_Find(*extensions, TLSX_CKS); + /* If it is already present, do nothing. */ + if (extension == NULL) { + /* The data required is in the ssl struct, so push it in. */ + ret = TLSX_Push(extensions, TLSX_CKS, (void*)ssl, heap); + } + + return ret; +} + +int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions) +{ + int ret; + TLSX* extension; + /* Push new KeyShare extension. This will also free the old one */ + ret = TLSX_Push(extensions, TLSX_CKS, NULL, ssl->heap); + if (ret != 0) + return ret; + /* Extension got pushed to head */ + extension = *extensions; + /* Need ssl->sigSpecSz during extension length calculation. */ + extension->data = ssl; + /* Set extension to be in response. */ + extension->resp = 1; + return ret; +} + +int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, word16 length, + TLSX** extensions) +{ + (void) extensions; + int ret; + int i, j; + + /* Validating the input. */ + if (length == 0) + return BUFFER_ERROR; + for (i = 0; i < length; i++) { + switch (input[i]) + { + case WOLFSSL_CKS_SIGSPEC_NATIVE: + case WOLFSSL_CKS_SIGSPEC_ALTERNATIVE: + case WOLFSSL_CKS_SIGSPEC_BOTH: + /* These are all valid values; do nothing */ + break; + case WOLFSSL_CKS_SIGSPEC_EXTERNAL: + default: + /* All other values (including external) are not. */ + return BAD_FUNC_ARG; + } + } + + /* Extension data is valid, but if we are the server and we don't have an + * alt private key, do not respond with CKS extension. */ + if (wolfSSL_is_server(ssl) && ssl->buffers.altKey == NULL) { + ssl->sigSpec = NULL; + ssl->sigSpecSz = 0; + return 0; + } + + /* Copy as the lifetime of input seems to be ephemeral. */ + ssl->peerSigSpec = (byte*)XMALLOC(length, ssl->heap, DYNAMIC_TYPE_TLSX); + if (ssl->peerSigSpec == NULL) { + return BUFFER_ERROR; + } + XMEMCPY(ssl->peerSigSpec, input, length); + ssl->peerSigSpecSz = length; + + /* If there is no preference set, use theirs... */ + if (ssl->sigSpec == NULL) { + ret = wolfSSL_UseCKS(ssl, ssl->peerSigSpec, 1); + if (ret == WOLFSSL_SUCCESS) { + ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap); + TLSX_SetResponse(ssl, TLSX_CKS); + } + return ret; + } + + /* ...otherwise, prioritize our preference. */ + for (i = 0; i < ssl->sigSpecSz; i++) { + for (j = 0; j < length; j++) { + if (ssl->sigSpec[i] == input[j]) { + /* Got the match, set to this one. */ + ret = wolfSSL_UseCKS(ssl, &ssl->sigSpec[i], 1); + if (ret == WOLFSSL_SUCCESS) { + ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap); + TLSX_SetResponse(ssl, TLSX_CKS); + } + return ret; + } + } + } + + /* No match found. Cannot continue. */ + return MATCH_SUITE_ERROR; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Server side KSE processing */ int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions, - KeyShareEntry** kse, byte* searched) + byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, byte* searched) { TLSX* extension; KeyShareEntry* clientKSE = NULL; @@ -9132,6 +9826,9 @@ int preferredRank = WOLFSSL_MAX_GROUP_COUNT; int rank; + (void)cipherSuite0; + (void)cipherSuite; + if (ssl == NULL || ssl->options.side != WOLFSSL_SERVER_END) return BAD_FUNC_ARG; @@ -9144,16 +9841,20 @@ if (extension && extension->resp == 1) { /* Outside of the async case this path should not be taken. */ - int ret = INCOMPLETE_DATA; + int ret = WC_NO_ERR_TRACE(INCOMPLETE_DATA); #ifdef WOLFSSL_ASYNC_CRYPT /* in async case make sure key generation is finalized */ KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data; - if (serverKSE && serverKSE->lastRet == WC_PENDING_E) { + if (serverKSE && serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) { if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) *searched = 1; ret = TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE); } + else #endif + { + ret = INCOMPLETE_DATA; + } return ret; } @@ -9162,6 +9863,19 @@ if (clientKSE->ke == NULL) continue; +#ifdef WOLFSSL_SM2 + if ((cipherSuite0 == CIPHER_BYTE) && + ((cipherSuite == TLS_SM4_GCM_SM3) || + (cipherSuite == TLS_SM4_CCM_SM3))) { + if (clientKSE->group != WOLFSSL_ECC_SM2P256V1) { + continue; + } + } + else if (clientKSE->group == WOLFSSL_ECC_SM2P256V1) { + continue; + } +#endif + /* Check consistency now - extensions in any order. */ if (!TLSX_SupportedGroups_Find(ssl, clientKSE->group, extensions)) continue; @@ -9169,7 +9883,7 @@ if (!WOLFSSL_NAMED_GROUP_IS_FFHDE(clientKSE->group)) { /* Check max value supported. */ if (clientKSE->group > WOLFSSL_ECC_MAX) { -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER if (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) #endif continue; @@ -9215,7 +9929,7 @@ serverKSE = (KeyShareEntry*)extension->data; if (serverKSE != NULL) { /* in async case make sure key generation is finalized */ - if (serverKSE->lastRet == WC_PENDING_E) + if (serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) return TLSX_KeyShare_GenKey((WOLFSSL*)ssl, serverKSE); else if (serverKSE->lastRet == 0) return 0; @@ -9234,7 +9948,7 @@ return ret; if (clientKSE->key == NULL) { -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) { /* Going to need the public key (AKA ciphertext). */ serverKSE->pubKey = clientKSE->pubKey; @@ -9275,6 +9989,7 @@ serverKSE->keLen = clientKSE->keLen; clientKSE->ke = NULL; clientKSE->keLen = 0; + ssl->namedGroup = serverKSE->group; TLSX_KeyShare_FreeAll((KeyShareEntry*)extension->data, ssl->heap); extension->data = (void *)serverKSE; @@ -9297,7 +10012,8 @@ *doHelloRetry = 0; - ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, &clientKSE, &searched); + ret = TLSX_KeyShare_Choose(ssl, ssl->extensions, ssl->cipher.cipherSuite0, + ssl->cipher.cipherSuite, &clientKSE, &searched); if (ret != 0 || !searched) return ret; @@ -9325,7 +10041,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfSSL_AsyncPop(ssl, NULL); /* Check for error */ - if (ret != WC_NOT_PENDING_E && ret < 0) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E) && ret < 0) { return ret; } #endif @@ -9351,7 +10067,7 @@ #else -#define KS_FREE_ALL(a, b) +#define KS_FREE_ALL(a, b) WC_DO_NOTHING #define KS_GET_SIZE(a, b) 0 #define KS_WRITE(a, b, c) 0 #define KS_PARSE(a, b, c, d) 0 @@ -9501,7 +10217,7 @@ word16 len; int ret; - /* Write identites only. Binders after HMACing over this. */ + /* Write identities only. Binders after HMACing over this. */ lenIdx = idx; idx += OPAQUE16_LEN; while (current != NULL) { @@ -9518,7 +10234,7 @@ current = current->next; } - /* Length of the identites. */ + /* Length of the identities. */ len = idx - lenIdx - OPAQUE16_LEN; c16toa(len, output + lenIdx); @@ -9779,6 +10495,12 @@ case sha512_mac: return WC_SHA512_DIGEST_SIZE; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + return WC_SM3_DIGEST_SIZE; + #endif + default: + break; } return 0; } @@ -9790,8 +10512,8 @@ * len The length of the identity data. * age The age of the identity. * hmac The HMAC algorithm. - * ciphersuite0 The first byte of the ciphersuite to use. - * ciphersuite The second byte of the ciphersuite to use. + * cipherSuite0 The first byte of the cipher suite to use. + * cipherSuite The second byte of the cipher suite to use. * resumption The PSK is for resumption of a session. * preSharedKey The new pre-shared key object. * returns 0 on success and other values indicate failure. @@ -9857,7 +10579,7 @@ #else -#define PSK_FREE_ALL(a, b) +#define PSK_FREE_ALL(a, b) WC_DO_NOTHING #define PSK_GET_SIZE(a, b, c) 0 #define PSK_WRITE(a, b, c, d) 0 #define PSK_PARSE(a, b, c, d) 0 @@ -9979,7 +10701,10 @@ if (ret == 0) ret = TLSX_PskKeyModes_Use(ssl, modes); - WOLFSSL_ERROR_VERBOSE(ret); + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + } + return ret; } @@ -10397,6 +11122,499 @@ #define CID_FREE(a, b) 0 #endif /* defined(WOLFSSL_DTLS_CID) */ +#if defined(HAVE_RPK) +/******************************************************************************/ +/* Client_Certificate_Type extension */ +/******************************************************************************/ +/* return 1 if specified type is included in the given list, otherwise 0 */ +static int IsCertTypeListed(byte type, byte cnt, const byte* list) +{ + int ret = 0; + int i; + + if (cnt == 0 || list == NULL) + return ret; + + if (cnt > 0 && cnt <= MAX_CLIENT_CERT_TYPE_CNT) { + for (i = 0; i < cnt; i++) { + if (list[i] == type) + return 1; + } + } + return 0; +} + +/* Search both arrays from above to find a common value between the two given + * arrays(a and b). return 1 if it finds a common value, otherwise return 0. + */ +static int GetCommonItem(const byte* a, byte aLen, const byte* b, byte bLen, + byte* type) +{ + int i, j; + + if (a == NULL || b == NULL) + return 0; + + for (i = 0; i < aLen; i++) { + for (j = 0; j < bLen; j++) { + if (a[i] == b[j]) { + *type = a[i]; + return 1; + } + } + } + return 0; +} + +/* Creates a "client certificate type" extension if necessary. + * Returns 0 if no error occurred, negative value otherwise. + * A return of 0, it does not indicae that the extension was created. + */ +static int TLSX_ClientCertificateType_Use(WOLFSSL* ssl, byte isServer) +{ + int ret = 0; + + if (ssl == NULL) + return BAD_FUNC_ARG; + + if (isServer) { + /* [in server side] + */ + + if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK, + ssl->options.rpkConfig.preferred_ClientCertTypeCnt, + ssl->options.rpkConfig.preferred_ClientCertTypes)) { + + WOLFSSL_MSG("Adding Client Certificate Type extension"); + ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl, + ssl->heap); + if (ret == 0) { + TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE); + } + } + } + else { + /* [in client side] + * This extension MUST be omitted from the ClientHello unless the RPK + * certificate is preferred by the user and actually loaded. + */ + + if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK, + ssl->options.rpkConfig.preferred_ClientCertTypeCnt, + ssl->options.rpkConfig.preferred_ClientCertTypes)) { + + if (ssl->options.rpkState.isRPKLoaded) { + + ssl->options.rpkState.sending_ClientCertTypeCnt = 1; + ssl->options.rpkState.sending_ClientCertTypes[0] = + WOLFSSL_CERT_TYPE_RPK; + + /* Push new client_certificate_type extension. */ + WOLFSSL_MSG("Adding Client Certificate Type extension"); + ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, + ssl, ssl->heap); + } + else { + WOLFSSL_MSG("Willing to use RPK cert but not loaded it"); + } + } + else { + WOLFSSL_MSG("No will to use RPK cert"); + } + } + return ret; +} + +/* Parse a "client certificate type" extension received from peer. + * returns 0 on success and other values indicate failure. + */ +static int TLSX_ClientCertificateType_Parse(WOLFSSL* ssl, const byte* input, + word16 length, byte msgType) +{ + byte typeCnt; + int idx = 0; + int ret = 0; + int i; + int populate = 0; + byte cmnType; + + + if (msgType == client_hello) { + /* [parse ClientHello in server end] + * case 1) if peer verify is disabled, this extension must be omitted + * from ServerHello. + * case 2) if user have not set his preference, find X509 in parsed + * result, then populate "Client Certificate Type" extension. + * case 3) if user have not set his preference and X509 isn't included + * in parsed result, send "unsupported certificate" alert. + * case 4) if user have set his preference, find a common cert type + * in users preference and received cert types. + * case 5) if user have set his preference, but no common cert type + * found. + */ + + /* case 1 */ + if (ssl->options.verifyNone) { + return ret; + } + + /* parse extension */ + if (length < OPAQUE8_LEN) + return BUFFER_E; + + typeCnt = input[idx]; + + if (typeCnt > MAX_CLIENT_CERT_TYPE_CNT) + return BUFFER_E; + + if ((typeCnt + 1) * OPAQUE8_LEN != length){ + return BUFFER_E; + } + + ssl->options.rpkState.received_ClientCertTypeCnt = input[idx]; + idx += OPAQUE8_LEN; + + for (i = 0; i < typeCnt; i++) { + ssl->options.rpkState.received_ClientCertTypes[i] = input[idx]; + idx += OPAQUE8_LEN; + } + + if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt == 0) { + /* case 2 */ + if (IsCertTypeListed(WOLFSSL_CERT_TYPE_X509, + ssl->options.rpkState.received_ClientCertTypeCnt, + ssl->options.rpkState.received_ClientCertTypes)) { + + ssl->options.rpkState.sending_ClientCertTypeCnt = 1; + ssl->options.rpkState.sending_ClientCertTypes[0] = + WOLFSSL_CERT_TYPE_X509; + populate = 1; + } + /* case 3 */ + else { + WOLFSSL_MSG("No common cert type found in client_certificate_type ext"); + SendAlert(ssl, alert_fatal, unsupported_certificate); + return UNSUPPORTED_CERTIFICATE; + } + } + else if (ssl->options.rpkConfig.preferred_ClientCertTypeCnt > 0) { + /* case 4 */ + if (GetCommonItem( + ssl->options.rpkConfig.preferred_ClientCertTypes, + ssl->options.rpkConfig.preferred_ClientCertTypeCnt, + ssl->options.rpkState.received_ClientCertTypes, + ssl->options.rpkState.received_ClientCertTypeCnt, + &cmnType)) { + ssl->options.rpkState.sending_ClientCertTypeCnt = 1; + ssl->options.rpkState.sending_ClientCertTypes[0] = cmnType; + populate = 1; + } + /* case 5 */ + else { + WOLFSSL_MSG("No common cert type found in client_certificate_type ext"); + SendAlert(ssl, alert_fatal, unsupported_certificate); + return UNSUPPORTED_CERTIFICATE; + } + } + + /* populate client_certificate_type extension */ + if (populate) { + WOLFSSL_MSG("Adding Client Certificate Type extension"); + ret = TLSX_Push(&ssl->extensions, TLSX_CLIENT_CERTIFICATE_TYPE, ssl, + ssl->heap); + if (ret == 0) { + TLSX_SetResponse(ssl, TLSX_CLIENT_CERTIFICATE_TYPE); + } + } + } + else if (msgType == server_hello || msgType == encrypted_extensions) { + /* parse it in client side */ + if (length == 1) { + ssl->options.rpkState.received_ClientCertTypeCnt = 1; + ssl->options.rpkState.received_ClientCertTypes[0] = *input; + } + else { + return BUFFER_E; + } + } + + return ret; +} + +/* Write out the "client certificate type" extension data into the given buffer. + * return the size wrote in the buffer on success, negative value on error. + */ +static word16 TLSX_ClientCertificateType_Write(void* data, byte* output, + byte msgType) +{ + WOLFSSL* ssl = (WOLFSSL*)data; + word16 idx = 0; + byte cnt = 0; + int i; + + /* skip to write extension if count is zero */ + cnt = ssl->options.rpkState.sending_ClientCertTypeCnt; + + if (cnt == 0) + return 0; + + if (msgType == client_hello) { + /* client side */ + + *(output + idx) = cnt; + idx += OPAQUE8_LEN; + + for (i = 0; i < cnt; i++) { + *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[i]; + idx += OPAQUE8_LEN; + } + return idx; + } + else if (msgType == server_hello || msgType == encrypted_extensions) { + /* sever side */ + if (cnt == 1) { + *(output + idx) = ssl->options.rpkState.sending_ClientCertTypes[0]; + idx += OPAQUE8_LEN; + } + } + return idx; +} + +/* Calculate then return the size of the "client certificate type" extension + * data. + * return the extension data size on success, negative value on error. +*/ +static int TLSX_ClientCertificateType_GetSize(WOLFSSL* ssl, byte msgType) +{ + int ret = 0; + byte cnt; + + if (ssl == NULL) + return BAD_FUNC_ARG; + + if (msgType == client_hello) { + /* client side */ + cnt = ssl->options.rpkState.sending_ClientCertTypeCnt; + ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN); + } + else if (msgType == server_hello || msgType == encrypted_extensions) { + /* server side */ + cnt = ssl->options.rpkState.sending_ClientCertTypeCnt;/* must be one */ + if (cnt != 1) + return SANITY_MSG_E; + ret = OPAQUE8_LEN; + } + else { + return SANITY_MSG_E; + } + return ret; +} + + #define CCT_GET_SIZE TLSX_ClientCertificateType_GetSize + #define CCT_WRITE TLSX_ClientCertificateType_Write + #define CCT_PARSE TLSX_ClientCertificateType_Parse +#else + #define CCT_GET_SIZE(a) 0 + #define CCT_WRITE(a, b) 0 + #define CCT_PARSE(a, b, c, d) 0 +#endif /* HAVE_RPK */ + +#if defined(HAVE_RPK) +/******************************************************************************/ +/* Server_Certificate_Type extension */ +/******************************************************************************/ +/* Creates a "server certificate type" extension if necessary. + * Returns 0 if no error occurred, negative value otherwise. + * A return of 0, it does not indicae that the extension was created. + */ +static int TLSX_ServerCertificateType_Use(WOLFSSL* ssl, byte isServer) +{ + int ret = 0; + byte ctype; + + if (ssl == NULL) + return BAD_FUNC_ARG; + + if (isServer) { + /* [in server side] */ + /* find common cert type to both end */ + if (GetCommonItem( + ssl->options.rpkConfig.preferred_ServerCertTypes, + ssl->options.rpkConfig.preferred_ServerCertTypeCnt, + ssl->options.rpkState.received_ServerCertTypes, + ssl->options.rpkState.received_ServerCertTypeCnt, + &ctype)) { + ssl->options.rpkState.sending_ServerCertTypeCnt = 1; + ssl->options.rpkState.sending_ServerCertTypes[0] = ctype; + + /* Push new server_certificate_type extension. */ + WOLFSSL_MSG("Adding Server Certificate Type extension"); + ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl, + ssl->heap); + if (ret == 0) { + TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE); + } + } + else { + /* no common cert type found */ + WOLFSSL_MSG("No common cert type found in server_certificate_type ext"); + SendAlert(ssl, alert_fatal, unsupported_certificate); + ret = UNSUPPORTED_CERTIFICATE; + } + } + else { + /* [in client side] */ + if (IsCertTypeListed(WOLFSSL_CERT_TYPE_RPK, + ssl->options.rpkConfig.preferred_ServerCertTypeCnt, + ssl->options.rpkConfig.preferred_ServerCertTypes)) { + + ssl->options.rpkState.sending_ServerCertTypeCnt = + ssl->options.rpkConfig.preferred_ServerCertTypeCnt; + XMEMCPY(ssl->options.rpkState.sending_ServerCertTypes, + ssl->options.rpkConfig.preferred_ServerCertTypes, + ssl->options.rpkConfig.preferred_ServerCertTypeCnt); + + /* Push new server_certificate_type extension. */ + WOLFSSL_MSG("Adding Server Certificate Type extension"); + ret = TLSX_Push(&ssl->extensions, TLSX_SERVER_CERTIFICATE_TYPE, ssl, + ssl->heap); + } + else { + WOLFSSL_MSG("No will to accept RPK cert"); + } + } + + return ret; +} + +/* Parse a "server certificate type" extension received from peer. + * returns 0 on success and other values indicate failure. + */ +static int TLSX_ServerCertificateType_Parse(WOLFSSL* ssl, const byte* input, + word16 length, byte msgType) +{ + byte typeCnt; + int idx = 0; + int ret = 0; + int i; + + if (msgType == client_hello) { + /* in server side */ + + if (length < OPAQUE8_LEN) + return BUFFER_E; + + typeCnt = input[idx]; + + if (typeCnt > MAX_SERVER_CERT_TYPE_CNT) + return BUFFER_E; + + if ((typeCnt + 1) * OPAQUE8_LEN != length){ + return BUFFER_E; + } + ssl->options.rpkState.received_ServerCertTypeCnt = input[idx]; + idx += OPAQUE8_LEN; + + for (i = 0; i < typeCnt; i++) { + ssl->options.rpkState.received_ServerCertTypes[i] = input[idx]; + idx += OPAQUE8_LEN; + } + + ret = TLSX_ServerCertificateType_Use(ssl, 1); + if (ret == 0) { + TLSX_SetResponse(ssl, TLSX_SERVER_CERTIFICATE_TYPE); + } + } + else if (msgType == server_hello || msgType == encrypted_extensions) { + /* in client side */ + if (length != 1) /* length slould be 1 */ + return BUFFER_E; + + ssl->options.rpkState.received_ServerCertTypeCnt = 1; + ssl->options.rpkState.received_ServerCertTypes[0] = *input; + } + + return 0; +} + +/* Write out the "server certificate type" extension data into the given buffer. + * return the size wrote in the buffer on success, negative value on error. + */ +static word16 TLSX_ServerCertificateType_Write(void* data, byte* output, + byte msgType) +{ + WOLFSSL* ssl = (WOLFSSL*)data; + word16 idx = 0; + int cnt = 0; + int i; + + /* skip to write extension if count is zero */ + cnt = ssl->options.rpkState.sending_ServerCertTypeCnt; + + if (cnt == 0) + return 0; + + if (msgType == client_hello) { + /* in client side */ + + *(output + idx) = cnt; + idx += OPAQUE8_LEN; + + for (i = 0; i < cnt; i++) { + *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[i]; + idx += OPAQUE8_LEN; + } + } + else if (msgType == server_hello || msgType == encrypted_extensions) { + /* in server side */ + /* ensure cnt is one */ + if (cnt != 1) + return 0; + + *(output + idx) = ssl->options.rpkState.sending_ServerCertTypes[0]; + idx += OPAQUE8_LEN; + } + return idx; +} + +/* Calculate then return the size of the "server certificate type" extension + * data. + * return the extension data size on success, negative value on error. +*/ +static int TLSX_ServerCertificateType_GetSize(WOLFSSL* ssl, byte msgType) +{ + int ret = 0; + int cnt; + + if (ssl == NULL) + return BAD_FUNC_ARG; + + if (msgType == client_hello) { + /* in clent side */ + cnt = ssl->options.rpkState.sending_ServerCertTypeCnt; + if (cnt > 0) { + ret = (int)(OPAQUE8_LEN + cnt * OPAQUE8_LEN); + } + } + else if (msgType == server_hello || msgType == encrypted_extensions) { + /* in server side */ + ret = (int)OPAQUE8_LEN; + } + else { + return SANITY_MSG_E; + } + return ret; +} + + #define SCT_GET_SIZE TLSX_ServerCertificateType_GetSize + #define SCT_WRITE TLSX_ServerCertificateType_Write + #define SCT_PARSE TLSX_ServerCertificateType_Parse +#else + #define SCT_GET_SIZE(a) 0 + #define SCT_WRITE(a, b) 0 + #define SCT_PARSE(a, b, c, d) 0 +#endif /* HAVE_RPK */ + /******************************************************************************/ /* TLS Extensions Framework */ /******************************************************************************/ @@ -10638,7 +11856,7 @@ /* get size then write */ ret = GetEchConfigsEx(ech->echConfig, NULL, &configsLen); - if (ret != LENGTH_ONLY_E) + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) return ret; ret = GetEchConfigsEx(ech->echConfig, writeBuf, &configsLen); @@ -10775,7 +11993,7 @@ /* get the size of the raw configs */ ret = GetEchConfigsEx(ech->echConfig, NULL, &size); - if (ret != LENGTH_ONLY_E) + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) return ret; } else if (ech->type == ECH_TYPE_INNER) @@ -10858,7 +12076,7 @@ if (ret == 0) ret = GetEchConfig(echConfig, NULL, &rawConfigLen); - if (ret == LENGTH_ONLY_E) + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) ret = 0; /* create info */ @@ -11100,7 +12318,7 @@ /* seal the payload */ ret = wc_HpkeSealBase(ech->hpke, ech->ephemeralKey, receiverPubkey, - info, infoLen, aadCopy, aadLen, ech->innerClientHello, + info, (word32)infoLen, aadCopy, aadLen, ech->innerClientHello, ech->innerClientHelloLen - ech->hpke->Nt, ech->outerClientPayload); @@ -11135,103 +12353,143 @@ list = extension->next; switch (extension->type) { +#if defined(HAVE_RPK) + case TLSX_CLIENT_CERTIFICATE_TYPE: + WOLFSSL_MSG("Client Certificate Type extension free"); + /* nothing to do */ + break; + case TLSX_SERVER_CERTIFICATE_TYPE: + WOLFSSL_MSG("Server Certificate Type extension free"); + /* nothing to do */ + break; +#endif #ifdef HAVE_SNI case TLSX_SERVER_NAME: + WOLFSSL_MSG("SNI extension free"); SNI_FREE_ALL((SNI*)extension->data, heap); break; #endif case TLSX_TRUSTED_CA_KEYS: + WOLFSSL_MSG("Trusted CA Indication extension free"); TCA_FREE_ALL((TCA*)extension->data, heap); break; case TLSX_MAX_FRAGMENT_LENGTH: + WOLFSSL_MSG("Max Fragment Length extension free"); MFL_FREE_ALL(extension->data, heap); break; case TLSX_EXTENDED_MASTER_SECRET: + WOLFSSL_MSG("Extended Master Secret free"); + /* Nothing to do. */ + break; case TLSX_TRUNCATED_HMAC: + WOLFSSL_MSG("Truncated HMAC extension free"); /* Nothing to do. */ break; case TLSX_SUPPORTED_GROUPS: + WOLFSSL_MSG("Supported Groups extension free"); EC_FREE_ALL((SupportedCurve*)extension->data, heap); break; case TLSX_EC_POINT_FORMATS: + WOLFSSL_MSG("Point Formats extension free"); PF_FREE_ALL((PointFormat*)extension->data, heap); break; case TLSX_STATUS_REQUEST: + WOLFSSL_MSG("Certificate Status Request extension free"); CSR_FREE_ALL((CertificateStatusRequest*)extension->data, heap); break; case TLSX_STATUS_REQUEST_V2: + WOLFSSL_MSG("Certificate Status Request v2 extension free"); CSR2_FREE_ALL((CertificateStatusRequestItemV2*)extension->data, heap); break; case TLSX_RENEGOTIATION_INFO: + WOLFSSL_MSG("Secure Renegotiation extension free"); SCR_FREE_ALL(extension->data, heap); break; case TLSX_SESSION_TICKET: + WOLFSSL_MSG("Session Ticket extension free"); WOLF_STK_FREE(extension->data, heap); break; case TLSX_APPLICATION_LAYER_PROTOCOL: + WOLFSSL_MSG("ALPN extension free"); ALPN_FREE_ALL((ALPN*)extension->data, heap); break; #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) case TLSX_SIGNATURE_ALGORITHMS: + WOLFSSL_MSG("Signature Algorithms extension to free"); SA_FREE_ALL((SignatureAlgorithms*)extension->data, heap); break; #endif #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) case TLSX_ENCRYPT_THEN_MAC: + WOLFSSL_MSG("Encrypt-Then-Mac extension free"); break; #endif #ifdef WOLFSSL_TLS13 case TLSX_SUPPORTED_VERSIONS: + WOLFSSL_MSG("Supported Versions extension free"); break; #ifdef WOLFSSL_SEND_HRR_COOKIE case TLSX_COOKIE: + WOLFSSL_MSG("Cookie extension free"); CKE_FREE_ALL((Cookie*)extension->data, heap); break; #endif #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) case TLSX_PRE_SHARED_KEY: + WOLFSSL_MSG("Pre-Shared Key extension free"); PSK_FREE_ALL((PreSharedKey*)extension->data, heap); break; case TLSX_PSK_KEY_EXCHANGE_MODES: + WOLFSSL_MSG("PSK Key Exchange Modes extension free"); break; #endif #ifdef WOLFSSL_EARLY_DATA case TLSX_EARLY_DATA: + WOLFSSL_MSG("Early Data extension free"); break; #endif #ifdef WOLFSSL_POST_HANDSHAKE_AUTH case TLSX_POST_HANDSHAKE_AUTH: + WOLFSSL_MSG("Post-Handshake Authentication extension free"); break; #endif #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) case TLSX_SIGNATURE_ALGORITHMS_CERT: + WOLFSSL_MSG("Signature Algorithms extension free"); break; #endif case TLSX_KEY_SHARE: + WOLFSSL_MSG("Key Share extension free"); KS_FREE_ALL((KeyShareEntry*)extension->data, heap); break; + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + case TLSX_CERTIFICATE_AUTHORITIES: + WOLFSSL_MSG("Certificate Authorities extension free"); + break; + #endif #endif #ifdef WOLFSSL_SRTP case TLSX_USE_SRTP: + WOLFSSL_MSG("SRTP extension free"); SRTP_FREE((TlsxSrtp*)extension->data, heap); break; #endif @@ -11240,19 +12498,28 @@ case TLSX_KEY_QUIC_TP_PARAMS: FALL_THROUGH; case TLSX_KEY_QUIC_TP_PARAMS_DRAFT: + WOLFSSL_MSG("QUIC transport parameter free"); QTP_FREE((QuicTransportParam*)extension->data, heap); break; #endif #ifdef WOLFSSL_DTLS_CID - case TLSX_CONNECTION_ID: - CID_FREE((byte*)extension->data, heap); - break; + case TLSX_CONNECTION_ID: + WOLFSSL_MSG("Connection ID extension free"); + CID_FREE((byte*)extension->data, heap); + break; #endif /* WOLFSSL_DTLS_CID */ #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) - case TLSX_ECH: - ECH_FREE((WOLFSSL_ECH*)extension->data, heap); - break; + case TLSX_ECH: + WOLFSSL_MSG("ECH extension free"); + ECH_FREE((WOLFSSL_ECH*)extension->data, heap); + break; +#endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + case TLSX_CKS: + WOLFSSL_MSG("CKS extension free"); + /* nothing to do */ + break; #endif default: break; @@ -11294,7 +12561,11 @@ length += HELLO_EXT_TYPE_SZ + OPAQUE16_LEN; switch (extension->type) { - +#ifdef WOLFSSL_DUAL_ALG_CERTS + case TLSX_CKS: + length += ((WOLFSSL*)extension->data)->sigSpecSz ; + break; +#endif #ifdef HAVE_SNI case TLSX_SERVER_NAME: /* SNI only sends the name on the request. */ @@ -11403,6 +12674,11 @@ case TLSX_KEY_SHARE: length += KS_GET_SIZE((KeyShareEntry*)extension->data, msgType); break; + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + case TLSX_CERTIFICATE_AUTHORITIES: + length += CAN_GET_SIZE(extension->data); + break; + #endif #endif #ifdef WOLFSSL_SRTP case TLSX_USE_SRTP: @@ -11410,6 +12686,16 @@ break; #endif +#ifdef HAVE_RPK + case TLSX_CLIENT_CERTIFICATE_TYPE: + length += CCT_GET_SIZE((WOLFSSL*)extension->data, msgType); + break; + + case TLSX_SERVER_CERTIFICATE_TYPE: + length += SCT_GET_SIZE((WOLFSSL*)extension->data, msgType); + break; +#endif /* HAVE_RPK */ + #ifdef WOLFSSL_QUIC case TLSX_KEY_QUIC_TP_PARAMS: FALL_THROUGH; /* followed by */ @@ -11470,6 +12756,13 @@ /* extension data should be written internally. */ switch (extension->type) { +#ifdef WOLFSSL_DUAL_ALG_CERTS + case TLSX_CKS: + WOLFSSL_MSG("CKS extension to write"); + offset += CKS_WRITE(((WOLFSSL*)extension->data), + output + offset); + break; +#endif #ifdef HAVE_SNI case TLSX_SERVER_NAME: if (isRequest) { @@ -11515,15 +12808,23 @@ case TLSX_STATUS_REQUEST: WOLFSSL_MSG("Certificate Status Request extension to write"); - offset += CSR_WRITE((CertificateStatusRequest*)extension->data, + ret = CSR_WRITE((CertificateStatusRequest*)extension->data, output + offset, isRequest); + if (ret > 0) { + offset += (word16)ret; + ret = 0; + } break; case TLSX_STATUS_REQUEST_V2: WOLFSSL_MSG("Certificate Status Request v2 extension to write"); - offset += CSR2_WRITE( + ret = CSR2_WRITE( (CertificateStatusRequestItemV2*)extension->data, output + offset, isRequest); + if (ret > 0) { + offset += (word16)ret; + ret = 0; + } break; case TLSX_RENEGOTIATION_INFO: @@ -11609,12 +12910,32 @@ offset += KS_WRITE((KeyShareEntry*)extension->data, output + offset, msgType); break; + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + case TLSX_CERTIFICATE_AUTHORITIES: + WOLFSSL_MSG("Certificate Authorities extension to write"); + offset += CAN_WRITE(extension->data, output + offset); + break; + #endif #endif #ifdef WOLFSSL_SRTP case TLSX_USE_SRTP: + WOLFSSL_MSG("SRTP extension to write"); offset += SRTP_WRITE((TlsxSrtp*)extension->data, output+offset); break; #endif + +#ifdef HAVE_RPK + case TLSX_CLIENT_CERTIFICATE_TYPE: + WOLFSSL_MSG("Client Certificate Type extension to write"); + offset += CCT_WRITE(extension->data, output + offset, msgType); + break; + + case TLSX_SERVER_CERTIFICATE_TYPE: + WOLFSSL_MSG("Server Certificate Type extension to write"); + offset += SCT_WRITE(extension->data, output + offset, msgType); + break; +#endif /* HAVE_RPK */ + #ifdef WOLFSSL_QUIC case TLSX_KEY_QUIC_TP_PARAMS: FALL_THROUGH; @@ -11626,12 +12947,14 @@ #endif #ifdef WOLFSSL_DTLS_CID case TLSX_CONNECTION_ID: + WOLFSSL_MSG("Connection ID extension to write"); offset += CID_WRITE((byte*)extension->data, output+offset); break; #endif /* WOLFSSL_DTLS_CID */ #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) case TLSX_ECH: + WOLFSSL_MSG("ECH extension to write"); ret = ECH_WRITE((WOLFSSL_ECH*)extension->data, output + offset, &offset); break; @@ -11737,6 +13060,11 @@ WOLFSSL_ECC_BRAINPOOLP256R1, ssl->heap); if (ret != WOLFSSL_SUCCESS) return ret; #endif + #ifdef WOLFSSL_SM2 + ret = TLSX_UseSupportedCurve(extensions, + WOLFSSL_ECC_SM2P256V1, ssl->heap); + if (ret != WOLFSSL_SUCCESS) return ret; + #endif #endif #endif /* HAVE_ECC */ @@ -11844,22 +13172,31 @@ #endif #endif -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER #ifdef WOLFSSL_WC_KYBER #ifdef WOLFSSL_KYBER512 if (ret == WOLFSSL_SUCCESS) ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap); + if (ret == WOLFSSL_SUCCESS) + ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P256_KYBER_LEVEL1, + ssl->heap); #endif #ifdef WOLFSSL_KYBER768 if (ret == WOLFSSL_SUCCESS) ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL3, ssl->heap); + if (ret == WOLFSSL_SUCCESS) + ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P384_KYBER_LEVEL3, + ssl->heap); #endif #ifdef WOLFSSL_KYBER768 if (ret == WOLFSSL_SUCCESS) ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL5, ssl->heap); + if (ret == WOLFSSL_SUCCESS) + ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_P521_KYBER_LEVEL5, + ssl->heap); #endif #elif defined(HAVE_LIBOQS) ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap); @@ -11881,7 +13218,7 @@ #elif defined(HAVE_PQM4) ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_KYBER_LEVEL1, ssl->heap); #endif /* HAVE_LIBOQS */ -#endif /* HAVE_PQC */ +#endif /* WOLFSSL_HAVE_KYBER */ (void)ssl; (void)extensions; @@ -11906,6 +13243,16 @@ /* server will add extension depending on what is parsed from client */ if (!isServer) { +#if defined(HAVE_RPK) + ret = TLSX_ClientCertificateType_Use(ssl, isServer); + if (ret != 0) + return ret; + + ret = TLSX_ServerCertificateType_Use(ssl, isServer); + if (ret != 0) + return ret; +#endif /* HAVE_RPK */ + #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) if (!ssl->options.disallowEncThenMac) { ret = TLSX_EncryptThenMac_Use(ssl); @@ -11943,6 +13290,14 @@ } } #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + if ((IsAtLeastTLSv1_3(ssl->version)) && (ssl->sigSpec != NULL)) { + WOLFSSL_MSG("Adding CKS extension"); + if ((ret = TLSX_UseCKS(&ssl->extensions, ssl, ssl->heap)) != 0) { + return ret; + } + } +#endif } /* is not server */ #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) @@ -11955,6 +13310,17 @@ ret = 0; #endif #ifdef WOLFSSL_TLS13 + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + if (isServer && IsAtLeastTLSv1_3(ssl->version)) { + if (SSL_CA_NAMES(ssl) != NULL) { + WOLFSSL_MSG("Adding certificate authorities extension"); + if ((ret = TLSX_Push(&ssl->extensions, + TLSX_CERTIFICATE_AUTHORITIES, ssl, ssl->heap)) != 0) { + return ret; + } + } + } + #endif if (!isServer && IsAtLeastTLSv1_3(ssl->version)) { /* Add mandatory TLS v1.3 extension: supported version */ WOLFSSL_MSG("Adding supported versions extension"); @@ -12041,19 +13407,8 @@ namedGroup = kse->group; } if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) { -#ifdef HAVE_PQC - /* For KEMs, the key share has already been generated, but not - * if we are resuming. */ - if (!WOLFSSL_NAMED_GROUP_IS_PQC(namedGroup) -#ifdef HAVE_SESSION_TICKET - || ssl->options.resuming -#endif /* HAVE_SESSION_TICKET */ - ) -#endif /* HAVE_PQC */ - { - ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL, - &ssl->extensions); - } + ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL, + &ssl->extensions); if (ret != 0) return ret; } @@ -12082,7 +13437,7 @@ ret = SetCipherSpecs(ssl); if (ret != 0) return ret; - now = TimeNowInMilliseconds(); + now = (word64)TimeNowInMilliseconds(); if (now == 0) return GETTIME_ERROR; #ifdef WOLFSSL_32BIT_MILLI_TIME @@ -12135,6 +13490,16 @@ } else #endif + #if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \ + defined(WOLFSSL_SM3) + if (cipherSuite0 == CIPHER_BYTE) { + if ((cipherSuite != TLS_SM4_GCM_SM3) && + (cipherSuite != TLS_SM4_CCM_SM3)) { + continue; + } + } + else + #endif if (cipherSuite0 != TLS13_BYTE) continue; @@ -12173,8 +13538,8 @@ else #endif if (ssl->options.client_psk_cb != NULL || - ssl->options.client_psk_tls13_cb != NULL) { - /* Default ciphersuite. */ + ssl->options.client_psk_tls13_cb != NULL) { + /* Default cipher suite. */ byte cipherSuite0 = TLS13_BYTE; byte cipherSuite = WOLFSSL_DEF_PSK_CIPHER; int cipherSuiteFlags = WOLFSSL_CIPHER_SUITE_FLAG_NONE; @@ -12195,42 +13560,40 @@ ssl->arrays->server_hint, ssl->arrays->client_identity, MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN); } - #if defined(OPENSSL_EXTRA) - /* OpenSSL treats 0 as a PSK key length of 0 - * and meaning no PSK available. - */ - if (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { - return PSK_KEY_ERROR; - } - if (ssl->arrays->psk_keySz > 0) { - #else - if (ssl->arrays->psk_keySz == 0 || - ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { - return PSK_KEY_ERROR; + if ( + #ifdef OPENSSL_EXTRA + /* OpenSSL treats a PSK key length of 0 + * to indicate no PSK available. + */ + ssl->arrays->psk_keySz == 0 || + #endif + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { + #ifndef OPENSSL_EXTRA + ret = PSK_KEY_ERROR; + #endif } - #endif - ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; - - ssl->options.cipherSuite0 = cipherSuite0; - ssl->options.cipherSuite = cipherSuite; - (void)cipherSuiteFlags; - ret = SetCipherSpecs(ssl); - if (ret != 0) - return ret; + else { + ssl->arrays->client_identity[MAX_PSK_ID_LEN] = '\0'; - ret = TLSX_PreSharedKey_Use(&ssl->extensions, - (byte*)ssl->arrays->client_identity, - (word16)XSTRLEN(ssl->arrays->client_identity), - 0, ssl->specs.mac_algorithm, - cipherSuite0, cipherSuite, 0, - NULL, ssl->heap); + ssl->options.cipherSuite0 = cipherSuite0; + ssl->options.cipherSuite = cipherSuite; + (void)cipherSuiteFlags; + ret = SetCipherSpecs(ssl); + if (ret == 0) { + ret = TLSX_PreSharedKey_Use( + &ssl->extensions, + (byte*)ssl->arrays->client_identity, + (word16)XSTRLEN(ssl->arrays->client_identity), + 0, ssl->specs.mac_algorithm, + cipherSuite0, cipherSuite, 0, + NULL, ssl->heap); + } + if (ret == 0) + usingPSK = 1; + } if (ret != 0) return ret; - - usingPSK = 1; - #if defined(OPENSSL_EXTRA) - } - #endif } #endif /* !NO_PSK */ #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) @@ -12404,7 +13767,7 @@ #endif /** Tells the buffered size of extensions to be sent into the client hello. */ -int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word16* pLength) +int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, word32* pLength) { int ret = 0; word16 length = 0; @@ -12421,8 +13784,9 @@ TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS)); #endif #if defined(WOLFSSL_TLS13) - if (!IsAtLeastTLSv1_2(ssl)) + if (!IsAtLeastTLSv1_2(ssl)) { TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_SUPPORTED_VERSIONS)); + } #if !defined(WOLFSSL_NO_TLS12) || !defined(NO_OLD_TLS) if (!IsAtLeastTLSv1_3(ssl->version)) { TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_KEY_SHARE)); @@ -12439,6 +13803,10 @@ #ifdef WOLFSSL_POST_HANDSHAKE_AUTH TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH)); #endif + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + TURN_ON(semaphore, + TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES)); + #endif } #endif #endif /* WOLFSSL_TLS13 */ @@ -12460,8 +13828,11 @@ #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS)); #endif - /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, - * TLSX_CERTIFICATE_AUTHORITIES, OID_FILTERS +#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + if (SSL_CA_NAMES(ssl) != NULL) + TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES)); +#endif + /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, OID_FILTERS * TLSX_STATUS_REQUEST */ } @@ -12626,7 +13997,7 @@ #endif /** Writes the extensions to be sent into the client hello. */ -int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word16* pOffset) +int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, byte msgType, word32* pOffset) { int ret = 0; word16 offset = 0; @@ -12664,6 +14035,14 @@ #ifdef WOLFSSL_POST_HANDSHAKE_AUTH TURN_ON(semaphore, TLSX_ToSemaphore(TLSX_POST_HANDSHAKE_AUTH)); #endif + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + TURN_ON(semaphore, + TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES)); + #endif + #ifdef WOLFSSL_DUAL_ALG_CERTS + TURN_ON(semaphore, + TLSX_ToSemaphore(TLSX_CKS)); + #endif } #endif #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) @@ -12691,8 +14070,13 @@ #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) TURN_OFF(semaphore, TLSX_ToSemaphore(TLSX_SIGNATURE_ALGORITHMS)); #endif - /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, - * TLSX_CERTIFICATE_AUTHORITIES, TLSX_OID_FILTERS +#if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + if (SSL_CA_NAMES(ssl) != NULL) { + TURN_OFF(semaphore, + TLSX_ToSemaphore(TLSX_CERTIFICATE_AUTHORITIES)); + } +#endif + /* TODO: TLSX_SIGNED_CERTIFICATE_TIMESTAMP, TLSX_OID_FILTERS * TLSX_STATUS_REQUEST */ } @@ -12753,7 +14137,6 @@ return ret; } - #endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */ #if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER) @@ -13108,6 +14491,143 @@ return ret; } #endif +/* Jump Table to check minimum size values for client case in TLSX_Parse */ +#ifndef NO_WOLFSSL_SERVER +static word16 TLSX_GetMinSize_Client(word16* type) +{ + switch (*type) { + case TLSXT_SERVER_NAME: + return WOLFSSL_SNI_MIN_SIZE_CLIENT; + case TLSXT_EARLY_DATA: + return WOLFSSL_EDI_MIN_SIZE_CLIENT; + case TLSXT_MAX_FRAGMENT_LENGTH: + return WOLFSSL_MFL_MIN_SIZE_CLIENT; + case TLSXT_TRUSTED_CA_KEYS: + return WOLFSSL_TCA_MIN_SIZE_CLIENT; + case TLSXT_TRUNCATED_HMAC: + return WOLFSSL_THM_MIN_SIZE_CLIENT; + case TLSXT_STATUS_REQUEST: + return WOLFSSL_CSR_MIN_SIZE_CLIENT; + case TLSXT_SUPPORTED_GROUPS: + return WOLFSSL_EC_MIN_SIZE_CLIENT; + case TLSXT_EC_POINT_FORMATS: + return WOLFSSL_PF_MIN_SIZE_CLIENT; + case TLSXT_SIGNATURE_ALGORITHMS: + return WOLFSSL_SA_MIN_SIZE_CLIENT; + case TLSXT_USE_SRTP: + return WOLFSSL_SRTP_MIN_SIZE_CLIENT; + case TLSXT_APPLICATION_LAYER_PROTOCOL: + return WOLFSSL_ALPN_MIN_SIZE_CLIENT; + case TLSXT_STATUS_REQUEST_V2: + return WOLFSSL_CSR2_MIN_SIZE_CLIENT; + case TLSXT_CLIENT_CERTIFICATE: + return WOLFSSL_CCT_MIN_SIZE_CLIENT; + case TLSXT_SERVER_CERTIFICATE: + return WOLFSSL_SCT_MIN_SIZE_CLIENT; + case TLSXT_ENCRYPT_THEN_MAC: + return WOLFSSL_ETM_MIN_SIZE_CLIENT; + case TLSXT_SESSION_TICKET: + return WOLFSSL_STK_MIN_SIZE_CLIENT; + case TLSXT_PRE_SHARED_KEY: + return WOLFSSL_PSK_MIN_SIZE_CLIENT; + case TLSXT_COOKIE: + return WOLFSSL_CKE_MIN_SIZE_CLIENT; + case TLSXT_PSK_KEY_EXCHANGE_MODES: + return WOLFSSL_PKM_MIN_SIZE_CLIENT; + case TLSXT_CERTIFICATE_AUTHORITIES: + return WOLFSSL_CAN_MIN_SIZE_CLIENT; + case TLSXT_POST_HANDSHAKE_AUTH: + return WOLFSSL_PHA_MIN_SIZE_CLIENT; + case TLSXT_SIGNATURE_ALGORITHMS_CERT: + return WOLFSSL_SA_MIN_SIZE_CLIENT; + case TLSXT_KEY_SHARE: + return WOLFSSL_KS_MIN_SIZE_CLIENT; + case TLSXT_CONNECTION_ID: + return WOLFSSL_CID_MIN_SIZE_CLIENT; + case TLSXT_RENEGOTIATION_INFO: + return WOLFSSL_SCR_MIN_SIZE_CLIENT; + case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT: + return WOLFSSL_QTP_MIN_SIZE_CLIENT; + case TLSXT_ECH: + return WOLFSSL_ECH_MIN_SIZE_CLIENT; + default: + return 0; + } +} + #define TLSX_GET_MIN_SIZE_CLIENT TLSX_GetMinSize_Client +#else + #define TLSX_GET_MIN_SIZE_CLIENT(...) 0 +#endif + + +#ifndef NO_WOLFSSL_CLIENT +/* Jump Table to check minimum size values for server case in TLSX_Parse */ +static word16 TLSX_GetMinSize_Server(const word16 *type) +{ + switch (*type) { + case TLSXT_SERVER_NAME: + return WOLFSSL_SNI_MIN_SIZE_SERVER; + case TLSXT_EARLY_DATA: + return WOLFSSL_EDI_MIN_SIZE_SERVER; + case TLSXT_MAX_FRAGMENT_LENGTH: + return WOLFSSL_MFL_MIN_SIZE_SERVER; + case TLSXT_TRUSTED_CA_KEYS: + return WOLFSSL_TCA_MIN_SIZE_SERVER; + case TLSXT_TRUNCATED_HMAC: + return WOLFSSL_THM_MIN_SIZE_SERVER; + case TLSXT_STATUS_REQUEST: + return WOLFSSL_CSR_MIN_SIZE_SERVER; + case TLSXT_SUPPORTED_GROUPS: + return WOLFSSL_EC_MIN_SIZE_SERVER; + case TLSXT_EC_POINT_FORMATS: + return WOLFSSL_PF_MIN_SIZE_SERVER; + case TLSXT_SIGNATURE_ALGORITHMS: + return WOLFSSL_SA_MIN_SIZE_SERVER; + case TLSXT_USE_SRTP: + return WOLFSSL_SRTP_MIN_SIZE_SERVER; + case TLSXT_APPLICATION_LAYER_PROTOCOL: + return WOLFSSL_ALPN_MIN_SIZE_SERVER; + case TLSXT_STATUS_REQUEST_V2: + return WOLFSSL_CSR2_MIN_SIZE_SERVER; + case TLSXT_CLIENT_CERTIFICATE: + return WOLFSSL_CCT_MIN_SIZE_SERVER; + case TLSXT_SERVER_CERTIFICATE: + return WOLFSSL_SCT_MIN_SIZE_SERVER; + case TLSXT_ENCRYPT_THEN_MAC: + return WOLFSSL_ETM_MIN_SIZE_SERVER; + case TLSXT_SESSION_TICKET: + return WOLFSSL_STK_MIN_SIZE_SERVER; + case TLSXT_PRE_SHARED_KEY: + return WOLFSSL_PSK_MIN_SIZE_SERVER; + case TLSXT_COOKIE: + return WOLFSSL_CKE_MIN_SIZE_SERVER; + case TLSXT_PSK_KEY_EXCHANGE_MODES: + return WOLFSSL_PKM_MIN_SIZE_SERVER; + case TLSXT_CERTIFICATE_AUTHORITIES: + return WOLFSSL_CAN_MIN_SIZE_SERVER; + case TLSXT_POST_HANDSHAKE_AUTH: + return WOLFSSL_PHA_MIN_SIZE_SERVER; + case TLSXT_SIGNATURE_ALGORITHMS_CERT: + return WOLFSSL_SA_MIN_SIZE_SERVER; + case TLSXT_KEY_SHARE: + return WOLFSSL_KS_MIN_SIZE_SERVER; + case TLSXT_CONNECTION_ID: + return WOLFSSL_CID_MIN_SIZE_SERVER; + case TLSXT_RENEGOTIATION_INFO: + return WOLFSSL_SCR_MIN_SIZE_SERVER; + case TLSXT_KEY_QUIC_TP_PARAMS_DRAFT: + return WOLFSSL_QTP_MIN_SIZE_SERVER; + case TLSXT_ECH: + return WOLFSSL_ECH_MIN_SIZE_SERVER; + default: + return 0; + } +} + #define TLSX_GET_MIN_SIZE_SERVER TLSX_GetMinSize_Server +#else + #define TLSX_GET_MIN_SIZE_SERVER(...) 0 +#endif + /** Parses a buffer of TLS extensions. */ int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType, @@ -13171,6 +14691,29 @@ if (length - offset < size) return BUFFER_ERROR; + /* Check minimum size required for TLSX, even if disabled */ + switch (msgType) { + #ifndef NO_WOLFSSL_SERVER + case client_hello: + if (size < TLSX_GET_MIN_SIZE_CLIENT(&type)){ + WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied"); + return BUFFER_ERROR; + } + break; + #endif + #ifndef NO_WOLFSSL_CLIENT + case server_hello: + case hello_retry_request: + if (size < TLSX_GET_MIN_SIZE_SERVER(&type)){ + WOLFSSL_MSG("Minimum TLSX Size Requirement not Satisfied"); + return BUFFER_ERROR; + } + break; + #endif + default: + break; + } + switch (type) { #ifdef HAVE_SNI case TLSX_SERVER_NAME: @@ -13203,15 +14746,16 @@ #endif #ifdef WOLFSSL_TLS13 + /* RFC 8446 4.2.4 states trusted_ca_keys is not used + in TLS 1.3. */ if (IsAtLeastTLSv1_3(ssl->version)) { - if (msgType != client_hello && - msgType != encrypted_extensions) - return EXT_NOT_ALLOWED; + return EXT_NOT_ALLOWED; } else #endif { - if (msgType != client_hello) + if (msgType != client_hello && + msgType != server_hello) return EXT_NOT_ALLOWED; } ret = TCA_PARSE(ssl, input + offset, size, isRequest); @@ -13283,7 +14827,19 @@ ret = EC_PARSE(ssl, input + offset, size, isRequest, &ssl->extensions); break; - +#ifdef WOLFSSL_DUAL_ALG_CERTS + case TLSX_CKS: + WOLFSSL_MSG("CKS extension received"); + if (!IsAtLeastTLSv1_3(ssl->version) || + (msgType != client_hello && + msgType != encrypted_extensions)) { + WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED); + return EXT_NOT_ALLOWED; + } + ret = TLSX_CKS_Parse(ssl, (byte *)(input + offset), size, + &ssl->extensions); + break; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ case TLSX_EC_POINT_FORMATS: WOLFSSL_MSG("Point Formats extension received"); #ifdef WOLFSSL_DEBUG_TLS @@ -13601,6 +15157,26 @@ break; #endif + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + case TLSX_CERTIFICATE_AUTHORITIES: + WOLFSSL_MSG("Certificate Authorities extension received"); + #ifdef WOLFSSL_DEBUG_TLS + WOLFSSL_BUFFER(input + offset, size); + #endif + + if (!IsAtLeastTLSv1_3(ssl->version)) + break; + + if (msgType != client_hello && + msgType != certificate_request) { + WOLFSSL_ERROR_VERBOSE(EXT_NOT_ALLOWED); + return EXT_NOT_ALLOWED; + } + + ret = CAN_PARSE(ssl, input + offset, size, isRequest); + break; + #endif + case TLSX_KEY_SHARE: WOLFSSL_MSG("Key Share extension received"); #ifdef WOLFSSL_DEBUG_TLS @@ -13669,8 +15245,20 @@ break; #endif /* defined(WOLFSSL_DTLS_CID) */ +#if defined(HAVE_RPK) + case TLSX_CLIENT_CERTIFICATE_TYPE: + WOLFSSL_MSG("Client Certificate Type extension received"); + ret = CCT_PARSE(ssl, input + offset, size, msgType); + break; + + case TLSX_SERVER_CERTIFICATE_TYPE: + WOLFSSL_MSG("Server Certificate Type extension received"); + ret = SCT_PARSE(ssl, input + offset, size, msgType); + break; +#endif /* HAVE_RPK */ #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) case TLSX_ECH: + WOLFSSL_MSG("ECH extension received"); ret = ECH_PARSE(ssl, input + offset, size, msgType); break; #endif @@ -13683,7 +15271,8 @@ } #ifdef HAVE_EXTENDED_MASTER - if (IsAtLeastTLSv1_3(ssl->version) && msgType == hello_retry_request) { + if (IsAtLeastTLSv1_3(ssl->version) && + (msgType == hello_retry_request || msgType == hello_verify_request)) { /* Don't change EMS status until server_hello received. * Second ClientHello must have same extensions. */ @@ -13691,6 +15280,12 @@ else if (!isRequest && ssl->options.haveEMS && !pendingEMS) ssl->options.haveEMS = 0; #endif +#if defined(WOLFSSL_TLS13) && !defined(NO_PSK) + if (IsAtLeastTLSv1_3(ssl->version) && msgType == server_hello && + IS_OFF(seenType, TLSX_ToSemaphore(TLSX_KEY_SHARE))) { + ssl->options.noPskDheKe = 1; + } +#endif if (ret == 0) ret = SNI_VERIFY_PARSE(ssl, isRequest); @@ -14261,4 +15856,5 @@ #endif /* NO_WOLFSSL_SERVER */ #endif /* NO_TLS */ + #endif /* WOLFCRYPT_ONLY */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/tls13.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/tls13.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/tls13.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/tls13.c 2024-08-03 07:30:00.000000000 +0000 @@ -77,7 +77,7 @@ * Requires client to set a client certificate * WOLFSSL_PSK_MULTI_ID_PER_CS * When multiple PSK identities are available for the same cipher suite. - * Sets the first byte of the client identity to the count of identites + * Sets the first byte of the client identity to the count of identities * that have been seen so far for the cipher suite. * WOLFSSL_CHECK_SIG_FAULTS * Verifies the ECC signature after signing in case of faults in the @@ -117,6 +117,7 @@ #include #include #include +#include #ifdef NO_INLINE #include #else @@ -135,6 +136,15 @@ #define FALSE 0 #endif +#ifndef HAVE_AEAD + #ifndef _MSC_VER + #error "The build option HAVE_AEAD is required for TLS 1.3" + #else + #pragma \ + message("error: The build option HAVE_AEAD is required for TLS 1.3") + #endif +#endif + #ifndef HAVE_HKDF #ifndef _MSC_VER #error "The build option HAVE_HKDF is required for TLS 1.3" @@ -179,7 +189,7 @@ #ifndef NO_CERTS #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \ - defined(HAVE_ED448) || defined(HAVE_PQC) + defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) static WC_INLINE int GetMsgHash(WOLFSSL* ssl, byte* hash); @@ -187,21 +197,7 @@ #endif /* Expand data using HMAC, salt and label and info. - * TLS v1.3 defines this function. Use callback if available. - * - * ssl The SSL/TLS object. - * okm The generated pseudorandom key - output key material. - * okmLen The length of generated pseudorandom key - - * output key material. - * prk The salt - pseudo-random key. - * prkLen The length of the salt - pseudo-random key. - * protocol The TLS protocol label. - * protocolLen The length of the TLS protocol label. - * info The information to expand. - * infoLen The length of the information. - * digest The type of digest to use. - * returns 0 on success, otherwise failure. - */ + * TLS v1.3 defines this function. Use callback if available. */ static int Tls13HKDFExpandLabel(WOLFSSL* ssl, byte* okm, word32 okmLen, const byte* prk, word32 prkLen, const byte* protocol, word32 protocolLen, @@ -209,7 +205,7 @@ const byte* info, word32 infoLen, int digest) { - int ret = NOT_COMPILED_IN; + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #if defined(HAVE_PK_CALLBACKS) if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) { @@ -220,23 +216,29 @@ WOLFSSL_CLIENT_END /* ignored */); } - if (ret != NOT_COMPILED_IN) + if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN)) return ret; #endif (void)ssl; PRIVATE_KEY_UNLOCK(); +#if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)) + ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen, + protocol, protocolLen, + label, labelLen, + info, infoLen, digest, + ssl->heap, ssl->devId); +#else ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen, protocol, protocolLen, label, labelLen, info, infoLen, digest); +#endif PRIVATE_KEY_LOCK(); return ret; } -#if !defined(HAVE_FIPS) || !defined(wc_Tls13_HKDF_Expand_Label) -/* Same as above, but pass in the side we are expanding for. - * - * side The side (WOLFSSL_CLIENT_END or WOLFSSL_SERVER_END). +/* Same as above, but pass in the side we are expanding for: + * side: either WOLFSSL_CLIENT_END or WOLFSSL_SERVER_END. */ static int Tls13HKDFExpandKeyLabel(WOLFSSL* ssl, byte* okm, word32 okmLen, const byte* prk, word32 prkLen, @@ -245,8 +247,9 @@ const byte* info, word32 infoLen, int digest, int side) { + int ret; #if defined(HAVE_PK_CALLBACKS) - int ret = NOT_COMPILED_IN; + ret = NOT_COMPILED_IN; if (ssl->ctx && ssl->ctx->HKDFExpandLabelCb) { ret = ssl->ctx->HKDFExpandLabelCb(okm, okmLen, prk, prkLen, protocol, protocolLen, @@ -254,25 +257,33 @@ info, infoLen, digest, side); } - - if (ret != NOT_COMPILED_IN) + if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN)) return ret; #endif -/* hash buffer may not be fully initialized, but the sending length won't - * extend beyond the initialized span. - */ -PRAGMA_GCC_DIAG_PUSH; -PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\""); - (void)ssl; - (void)side; - return wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen, +#if !defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)) + ret = wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen, + protocol, protocolLen, + label, labelLen, + info, infoLen, digest, + ssl->heap, ssl->devId); + +#elif defined(HAVE_FIPS) && defined(wc_Tls13_HKDF_Expand_Label) + ret = wc_Tls13_HKDF_Expand_Label_fips(okm, okmLen, prk, prkLen, + protocol, protocolLen, + label, labelLen, + info, infoLen, digest); +#else + ret = wc_Tls13_HKDF_Expand_Label(okm, okmLen, prk, prkLen, protocol, protocolLen, label, labelLen, info, infoLen, digest); -PRAGMA_GCC_DIAG_POP; +#endif + (void)ssl; + (void)side; + return ret; } -#endif /* !HAVE_FIPS || !wc_Tls13_HKDF_Expand_Label */ + /* Derive a key from a message. * @@ -297,14 +308,14 @@ const byte* protocol; word32 protocolLen; int digestAlg = -1; - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (hashAlgo) { #ifndef NO_WOLFSSL_SHA256 case sha256_mac: - ret = wc_InitSha256_ex(&digest.sha256, ssl->heap, INVALID_DEVID); + ret = wc_InitSha256_ex(&digest.sha256, ssl->heap, ssl->devId); if (ret == 0) { - ret = wc_Sha256Update(&digest.sha256, msg, msgLen); + ret = wc_Sha256Update(&digest.sha256, msg, (word32)msgLen); if (ret == 0) ret = wc_Sha256Final(&digest.sha256, hash); wc_Sha256Free(&digest.sha256); @@ -315,9 +326,9 @@ #endif #ifdef WOLFSSL_SHA384 case sha384_mac: - ret = wc_InitSha384_ex(&digest.sha384, ssl->heap, INVALID_DEVID); + ret = wc_InitSha384_ex(&digest.sha384, ssl->heap, ssl->devId); if (ret == 0) { - ret = wc_Sha384Update(&digest.sha384, msg, msgLen); + ret = wc_Sha384Update(&digest.sha384, msg, (word32)msgLen); if (ret == 0) ret = wc_Sha384Final(&digest.sha384, hash); wc_Sha384Free(&digest.sha384); @@ -328,9 +339,9 @@ #endif #ifdef WOLFSSL_TLS13_SHA512 case sha512_mac: - ret = wc_InitSha512_ex(&digest.sha512, ssl->heap, INVALID_DEVID); + ret = wc_InitSha512_ex(&digest.sha512, ssl->heap, ssl->devId); if (ret == 0) { - ret = wc_Sha512Update(&digest.sha512, msg, msgLen); + ret = wc_Sha512Update(&digest.sha512, msg, (word32)msgLen); if (ret == 0) ret = wc_Sha512Final(&digest.sha512, hash); wc_Sha512Free(&digest.sha512); @@ -339,7 +350,21 @@ digestAlg = WC_SHA512; break; #endif +#ifdef WOLFSSL_SM3 + case sm3_mac: + ret = wc_InitSm3(&digest.sm3, ssl->heap, ssl->devId); + if (ret == 0) { + ret = wc_Sm3Update(&digest.sm3, msg, (word32)msgLen); + if (ret == 0) + ret = wc_Sm3Final(&digest.sm3, hash); + wc_Sm3Free(&digest.sm3); + } + hashSz = WC_SM3_DIGEST_SIZE; + digestAlg = WC_SM3; + break; +#endif default: + ret = BAD_FUNC_ARG; digestAlg = -1; break; } @@ -368,9 +393,9 @@ return VERSION_ERROR; } if (outputLen == -1) - outputLen = hashSz; + outputLen = (int)hashSz; - ret = Tls13HKDFExpandLabel(ssl, output, outputLen, secret, hashSz, + ret = Tls13HKDFExpandLabel(ssl, output, (word32)outputLen, secret, hashSz, protocol, protocolLen, label, labelLen, hash, hashSz, digestAlg); return ret; @@ -401,6 +426,7 @@ word32 protocolLen; int digestAlg = 0; + switch (hashAlgo) { #ifndef NO_SHA256 case sha256_mac: @@ -429,6 +455,15 @@ break; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + hashSz = WC_SM3_DIGEST_SIZE; + digestAlg = WC_SM3; + if (includeMsgs) + ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash); + break; + #endif + default: ret = HASH_TYPE_E; break; @@ -446,34 +481,31 @@ } #endif /* WOLFSSL_DTLS13 */ - if (outputLen == -1) - outputLen = hashSz; - if (includeMsgs) + if (outputLen == -1) { + outputLen = (int)hashSz; + } + if (includeMsgs) { hashOutSz = hashSz; + } + else { + /* Appease static analyzers by making sure hash is cleared, since it is + * passed into expand key label where older wc_Tls13_HKDF_Expand_Label + * will unconditionally try to call a memcpy on it, however length will + * always be 0. */ + XMEMSET(hash, 0, sizeof(hash)); + hashOutSz = 0; + } - /* hash buffer may not be fully initialized, but the sending length won't - * extend beyond the initialized span. - */ - PRAGMA_GCC_DIAG_PUSH; - PRAGMA_GCC("GCC diagnostic ignored \"-Wmaybe-uninitialized\""); PRIVATE_KEY_UNLOCK(); - #if defined(HAVE_FIPS) && defined(wc_Tls13_HKDF_Expand_Label) - (void)side; - ret = wc_Tls13_HKDF_Expand_Label_fips(output, outputLen, secret, hashSz, - protocol, protocolLen, label, labelLen, - hash, hashOutSz, digestAlg); - #else - ret = Tls13HKDFExpandKeyLabel(ssl, output, outputLen, secret, hashSz, + ret = Tls13HKDFExpandKeyLabel(ssl, output, (word32)outputLen, secret, hashSz, protocol, protocolLen, label, labelLen, hash, hashOutSz, digestAlg, side); - #endif PRIVATE_KEY_LOCK(); #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Add("TLS 1.3 derived key", output, outputLen); #endif return ret; - PRAGMA_GCC_DIAG_POP; } /* Convert TLS mac ID to a hash algorithm ID @@ -502,6 +534,13 @@ hash = WC_SHA512; break; #endif + + #ifdef WOLFSSL_SM3 + case sm3_mac: + hash = WC_SM3; + break; + #endif + default: hash = WC_HASH_TYPE_NONE; } @@ -581,6 +620,17 @@ if (ssl == NULL || ssl->arrays == NULL) { return BAD_FUNC_ARG; } + +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) + /* If this is called from a sniffer session with keylog file support, + * obtain the appropriate secret from the callback */ + if (ssl->snifferSecretCb != NULL) { + return ssl->snifferSecretCb(ssl->arrays->clientRandom, + SNIFFER_SECRET_CLIENT_EARLY_TRAFFIC_SECRET, + key); + } +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ + ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->secret, earlyTrafficLabel, EARLY_TRAFFIC_LABEL_SZ, ssl->specs.mac_algorithm, 1, side); @@ -629,6 +679,16 @@ return BAD_FUNC_ARG; } +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) + /* If this is called from a sniffer session with keylog file support, + * obtain the appropriate secret from the callback */ + if (ssl->snifferSecretCb != NULL) { + return ssl->snifferSecretCb(ssl->arrays->clientRandom, + SNIFFER_SECRET_CLIENT_HANDSHAKE_TRAFFIC_SECRET, + key); + } +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ + ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret, clientHandshakeLabel, CLIENT_HANDSHAKE_LABEL_SZ, ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END); @@ -674,9 +734,21 @@ if (ssl == NULL || ssl->arrays == NULL) { return BAD_FUNC_ARG; } + +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) + /* If this is called from a sniffer session with keylog file support, + * obtain the appropriate secret from the callback */ + if (ssl->snifferSecretCb != NULL) { + return ssl->snifferSecretCb(ssl->arrays->clientRandom, + SNIFFER_SECRET_SERVER_HANDSHAKE_TRAFFIC_SECRET, + key); + } +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ + ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->preMasterSecret, serverHandshakeLabel, SERVER_HANDSHAKE_LABEL_SZ, ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END); + #ifdef HAVE_SECRET_CALLBACK if (ret == 0 && ssl->tls13SecretCb != NULL) { ret = ssl->tls13SecretCb(ssl, SERVER_HANDSHAKE_TRAFFIC_SECRET, key, @@ -719,9 +791,21 @@ if (ssl == NULL || ssl->arrays == NULL) { return BAD_FUNC_ARG; } + +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) + /* If this is called from a sniffer session with keylog file support, + * obtain the appropriate secret from the callback */ + if (ssl->snifferSecretCb != NULL) { + return ssl->snifferSecretCb(ssl->arrays->clientRandom, + SNIFFER_SECRET_CLIENT_TRAFFIC_SECRET, + key); + } +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ + ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret, clientAppLabel, CLIENT_APP_LABEL_SZ, ssl->specs.mac_algorithm, 1, WOLFSSL_CLIENT_END); + #ifdef HAVE_SECRET_CALLBACK if (ret == 0 && ssl->tls13SecretCb != NULL) { ret = ssl->tls13SecretCb(ssl, CLIENT_TRAFFIC_SECRET, key, @@ -764,9 +848,21 @@ if (ssl == NULL || ssl->arrays == NULL) { return BAD_FUNC_ARG; } + +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) + /* If this is called from a sniffer session with keylog file support, + * obtain the appropriate secret from the callback */ + if (ssl->snifferSecretCb != NULL) { + return ssl->snifferSecretCb(ssl->arrays->clientRandom, + SNIFFER_SECRET_SERVER_TRAFFIC_SECRET, + key); + } +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ + ret = Tls13DeriveKey(ssl, key, -1, ssl->arrays->masterSecret, serverAppLabel, SERVER_APP_LABEL_SZ, ssl->specs.mac_algorithm, 1, WOLFSSL_SERVER_END); + #ifdef HAVE_SECRET_CALLBACK if (ret == 0 && ssl->tls13SecretCb != NULL) { ret = ssl->tls13SecretCb(ssl, SERVER_TRAFFIC_SECRET, key, @@ -878,7 +974,7 @@ { int ret; enum wc_HashType hashType = WC_HASH_TYPE_NONE; - int hashLen = 0; + word32 hashLen = 0; byte hashOut[WC_MAX_DIGEST_SIZE]; const byte* emptyHash = NULL; byte firstExpand[WC_MAX_DIGEST_SIZE]; @@ -1021,21 +1117,33 @@ } -static int Tls13_HKDF_Extract(WOLFSSL *ssl, byte* prk, const byte* salt, int saltLen, - byte* ikm, int ikmLen, int digest) +static int Tls13_HKDF_Extract(WOLFSSL *ssl, byte* prk, const byte* salt, + int saltLen, byte* ikm, int ikmLen, int digest) { int ret; #ifdef HAVE_PK_CALLBACKS void *cb_ctx = ssl->HkdfExtractCtx; CallbackHKDFExtract cb = ssl->ctx->HkdfExtractCb; if (cb != NULL) { - ret = cb(prk, salt, saltLen, ikm, ikmLen, digest, cb_ctx); + ret = cb(prk, salt, (word32)saltLen, ikm, (word32)ikmLen, digest, cb_ctx); + } + else +#endif +#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) + if ((int)ssl->arrays->psk_keySz < 0) { + ret = PSK_KEY_ERROR; } else #endif { - (void)ssl; + #if !defined(HAVE_FIPS) || \ + (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)) + ret = wc_Tls13_HKDF_Extract_ex(prk, salt, (word32)saltLen, ikm, (word32)ikmLen, digest, + ssl->heap, ssl->devId); + #else ret = wc_Tls13_HKDF_Extract(prk, salt, saltLen, ikm, ikmLen, digest); + (void)ssl; + #endif } return ret; } @@ -1054,13 +1162,13 @@ } #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13DeriveEarlySecret(ssl); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; #endif PRIVATE_KEY_UNLOCK(); #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0, - ssl->arrays->psk_key, ssl->arrays->psk_keySz, + ssl->arrays->psk_key, (int)ssl->arrays->psk_keySz, mac2hash(ssl->specs.mac_algorithm)); #else ret = Tls13_HKDF_Extract(ssl, ssl->arrays->secret, NULL, 0, @@ -1090,7 +1198,7 @@ } #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13DeriveHandshakeSecret(ssl); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; #endif @@ -1103,7 +1211,7 @@ PRIVATE_KEY_UNLOCK(); ret = Tls13_HKDF_Extract(ssl, ssl->arrays->preMasterSecret, key, ssl->specs.hash_size, - ssl->arrays->preMasterSecret, ssl->arrays->preMasterSz, + ssl->arrays->preMasterSecret, (int)ssl->arrays->preMasterSz, mac2hash(ssl->specs.mac_algorithm)); PRIVATE_KEY_LOCK(); @@ -1125,7 +1233,7 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13DeriveMasterSecret(ssl); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; #endif @@ -1202,6 +1310,12 @@ break; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + digestAlg = WC_SM3; + break; + #endif + default: return BAD_FUNC_ARG; } @@ -1242,7 +1356,7 @@ #endif int hashType = WC_SHA256; int hashSz = WC_SHA256_DIGEST_SIZE; - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); if (ssl == NULL || key == NULL || hash == NULL) { return BAD_FUNC_ARG; @@ -1271,7 +1385,15 @@ ret = wc_Sha512GetHash(&ssl->hsHashes->hashSha512, hash); break; #endif /* WOLFSSL_TLS13_SHA512 */ + #ifdef WOLFSSL_SM3 + case sm3_mac: + hashType = WC_SM3; + hashSz = WC_SM3_DIGEST_SIZE; + ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash); + break; + #endif /* WOLFSSL_SM3 */ default: + ret = BAD_FUNC_ARG; break; } if (ret != 0) @@ -1296,7 +1418,7 @@ if (ret == 0) { ret = wc_HmacSetKey(verifyHmac, hashType, key, ssl->specs.hash_size); if (ret == 0) - ret = wc_HmacUpdate(verifyHmac, hash, hashSz); + ret = wc_HmacUpdate(verifyHmac, hash, (word32)hashSz); if (ret == 0) ret = wc_HmacFinal(verifyHmac, hash); wc_HmacFree(verifyHmac); @@ -1312,7 +1434,7 @@ #endif if (pHashSz) - *pHashSz = hashSz; + *pHashSz = (word32)hashSz; return ret; } @@ -1346,7 +1468,7 @@ */ int DeriveTls13Keys(WOLFSSL* ssl, int secret, int side, int store) { - int ret = BAD_FUNC_ARG; /* Assume failure */ + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); /* Assume failure */ int i = 0; #ifdef WOLFSSL_SMALL_STACK byte* key_dig; @@ -1357,10 +1479,10 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13DeriveKeys(ssl, secret, side); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { return ret; } - ret = BAD_FUNC_ARG; /* Assume failure */ + ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); /* Assume failure */ #endif #ifdef WOLFSSL_SMALL_STACK @@ -1433,6 +1555,7 @@ break; default: + ret = BAD_FUNC_ARG; break; } @@ -1513,7 +1636,7 @@ #endif /* WOLFSSL_DTLS13 */ end: - ForceZero(key_dig, i); + ForceZero(key_dig, (word32)i); #ifdef WOLFSSL_SMALL_STACK XFREE(key_dig, ssl->heap, DYNAMIC_TYPE_DIGEST); #elif defined(WOLFSSL_CHECK_MEM_ZERO) @@ -1713,6 +1836,14 @@ { return sys_now(); } + +#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2) + + word32 TimeNowInMilliseconds(void) + { + return (word32)osKernelGetTickCount(); + } + #elif defined(WOLFSSL_TIRTOS) /* The time in milliseconds. * Used for tickets to represent difference between when first seen and when @@ -1782,10 +1913,12 @@ #elif defined(WOLFSSL_ZEPHYR) word32 TimeNowInMilliseconds(void) { + int64_t t; #if defined(CONFIG_ARCH_POSIX) k_cpu_idle(); #endif - return (word32)k_uptime_get() / 1000; + t = k_uptime_get(); /* returns current uptime in milliseconds */ + return (word32)t; } #else @@ -1996,6 +2129,14 @@ { return sys_now(); } + +#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2) + + sword64 TimeNowInMilliseconds(void) + { + return (sword64)osKernelGetTickCount(); + } + #elif defined(WOLFSSL_TIRTOS) /* The time in milliseconds. * Used for tickets to represent difference between when first seen and when @@ -2065,10 +2206,12 @@ #elif defined(WOLFSSL_ZEPHYR) sword64 TimeNowInMilliseconds(void) { + int64_t t; #if defined(CONFIG_ARCH_POSIX) k_cpu_idle(); #endif - return (sword64)k_uptime_get() / 1000; + t = k_uptime_get(); /* returns current uptime in milliseconds */ + return (sword64)t; } #else @@ -2431,13 +2574,13 @@ (void)nonceSz; #ifdef WOLFSSL_ASYNC_CRYPT - if (ssl->error == WC_PENDING_E) { + if (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E)) { ssl->error = 0; /* clear async */ } #endif #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13AesEncrypt(ssl, output, input, dataSz); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { if (ret > 0) { ret = 0; /* tsip_Tls13AesEncrypt returns output size */ } @@ -2466,7 +2609,7 @@ #ifdef CIPHER_NONCE if (ssl->encrypt.nonce == NULL) { ssl->encrypt.nonce = (byte*)XMALLOC(AEAD_NONCE_SZ, - ssl->heap, DYNAMIC_TYPE_AES_BUFFER); + ssl->heap, DYNAMIC_TYPE_CIPHER); #ifdef WOLFSSL_CHECK_MEM_ZERO if (ssl->encrypt.nonce != NULL) { wc_MemZero_Add("EncryptTls13 nonce", ssl->encrypt.nonce, @@ -2510,7 +2653,7 @@ output + dataSz, macSz, aad, aadSz); } - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) #endif { @@ -2552,7 +2695,7 @@ output + dataSz, macSz, aad, aadSz); } - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) #endif { #if ((defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) && \ @@ -2580,6 +2723,24 @@ break; #endif + #ifdef WOLFSSL_SM4_GCM + case wolfssl_sm4_gcm: + nonceSz = SM4_GCM_NONCE_SZ; + ret = wc_Sm4GcmEncrypt(ssl->encrypt.sm4, output, input, + dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz, + macSz, aad, aadSz); + break; + #endif + + #ifdef WOLFSSL_SM4_CCM + case wolfssl_sm4_ccm: + nonceSz = SM4_CCM_NONCE_SZ; + ret = wc_Sm4CcmEncrypt(ssl->encrypt.sm4, output, input, + dataSz, ssl->encrypt.nonce, nonceSz, output + dataSz, + macSz, aad, aadSz); + break; + #endif + #ifdef HAVE_NULL_CIPHER case wolfssl_cipher_null: ret = Tls13IntegrityOnly_Encrypt(ssl, output, input, dataSz, @@ -2596,7 +2757,7 @@ ssl->encrypt.state = CIPHER_STATE_END; #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* if async is not okay, then block */ if (!asyncOkay) { ret = wc_AsyncWait(ret, asyncDev, event_flags); @@ -2798,7 +2959,7 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13AesDecrypt(ssl, output, input, sz); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { #ifndef WOLFSSL_EARLY_DATA if (ret < 0) { ret = VERIFY_MAC_ERROR; @@ -2811,9 +2972,9 @@ #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfSSL_AsyncPop(ssl, &ssl->decrypt.state); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* check for still pending */ - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; ssl->error = 0; /* clear async */ @@ -2850,7 +3011,7 @@ #ifdef CIPHER_NONCE if (ssl->decrypt.nonce == NULL) { ssl->decrypt.nonce = (byte*)XMALLOC(AEAD_NONCE_SZ, - ssl->heap, DYNAMIC_TYPE_AES_BUFFER); + ssl->heap, DYNAMIC_TYPE_CIPHER); #ifdef WOLFSSL_CHECK_MEM_ZERO if (ssl->decrypt.nonce != NULL) { wc_MemZero_Add("DecryptTls13 nonce", ssl->decrypt.nonce, @@ -2894,7 +3055,7 @@ (byte *)(input + dataSz), macSz, aad, aadSz); } - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) #endif { @@ -2903,7 +3064,7 @@ input + dataSz, macSz, aad, aadSz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev); } @@ -2933,14 +3094,14 @@ (byte *)(input + dataSz), macSz, aad, aadSz); } - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) #endif { ret = wc_AesCcmDecrypt(ssl->decrypt.aes, output, input, dataSz, ssl->decrypt.nonce, nonceSz, input + dataSz, macSz, aad, aadSz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = wolfSSL_AsyncPush(ssl, &ssl->decrypt.aes->asyncDev); } @@ -2956,6 +3117,24 @@ break; #endif + #ifdef WOLFSSL_SM4_GCM + case wolfssl_sm4_gcm: + nonceSz = SM4_GCM_NONCE_SZ; + ret = wc_Sm4GcmDecrypt(ssl->decrypt.sm4, output, input, + dataSz, ssl->decrypt.nonce, nonceSz, output + dataSz, + macSz, aad, aadSz); + break; + #endif + + #ifdef WOLFSSL_SM4_CCM + case wolfssl_sm4_ccm: + nonceSz = SM4_CCM_NONCE_SZ; + ret = wc_Sm4CcmDecrypt(ssl->decrypt.sm4, output, input, + dataSz, ssl->decrypt.nonce, nonceSz, output + dataSz, + macSz, aad, aadSz); + break; + #endif + #ifdef HAVE_NULL_CIPHER case wolfssl_cipher_null: ret = Tls13IntegrityOnly_Decrypt(ssl, output, input, dataSz, @@ -2972,7 +3151,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* If pending, leave now */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -3056,7 +3235,7 @@ WOLFSSL_ENTER("BuildTls13Message"); #ifdef WOLFSSL_ASYNC_CRYPT - ret = WC_NOT_PENDING_E; + ret = WC_NO_PENDING_E; if (asyncOkay) { WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args); @@ -3070,7 +3249,7 @@ args = (BuildMsg13Args*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.buildMsgState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_buildmsg; @@ -3084,7 +3263,7 @@ /* Reset state */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_NOT_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_NO_PENDING_E)) #endif { ret = 0; @@ -3097,7 +3276,7 @@ args->headerSz = Dtls13GetRlHeaderLength(ssl, 1); #endif /* WOLFSSL_DTLS13 */ - args->sz = args->headerSz + inSz; + args->sz = args->headerSz + (word32)inSz; args->idx = args->headerSz; #ifdef WOLFSSL_ASYNC_CRYPT @@ -3127,7 +3306,7 @@ args->sz += ssl->specs.aead_mac_size; if (sizeOnly) - return args->sz; + return (int)args->sz; if (args->sz > (word32)outSz) { WOLFSSL_MSG("Oops, want to write past output buffer size"); @@ -3152,8 +3331,8 @@ /* TLS v1.3 can do in place encryption. */ if (input != output + args->idx) - XMEMCPY(output + args->idx, input, inSz); - args->idx += inSz; + XMEMCPY(output + args->idx, input, (size_t)inSz); + args->idx += (word32)inSz; ssl->options.buildMsgState = BUILD_MSG_HASH; } @@ -3162,7 +3341,7 @@ case BUILD_MSG_HASH: { if (hashOutput) { - ret = HashOutput(ssl, output, args->headerSz + inSz, 0); + ret = HashOutput(ssl, output, (int)args->headerSz + inSz, 0); if (ret != 0) goto exit_buildmsg; } @@ -3181,8 +3360,8 @@ /* QUIC does not use encryption of the TLS Record Layer. * Return the original length + added headers * and restore it in the record header. */ - AddTls13RecordHeader(output, inSz, type, ssl); - ret = args->headerSz + inSz; + AddTls13RecordHeader(output, (word32)inSz, (byte)type, ssl); + ret = (int)args->headerSz + inSz; goto exit_buildmsg; } #endif @@ -3192,7 +3371,7 @@ byte* mac = output + args->idx; output += args->headerSz; - ret = ssl->ctx->MacEncryptCb(ssl, mac, output, inSz, type, 0, + ret = ssl->ctx->MacEncryptCb(ssl, mac, output, (unsigned int)inSz, (byte)type, 0, output, output, args->size, ssl->MacEncryptCtx); } else @@ -3204,7 +3383,7 @@ (word16)args->headerSz, asyncOkay); if (ret != 0) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { /* Zeroize plaintext. */ @@ -3230,7 +3409,7 @@ WOLFSSL_LEAVE("BuildTls13Message", ret); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -3240,7 +3419,7 @@ /* return sz on success */ if (ret == 0) { - ret = args->sz; + ret = (int)args->sz; } else { WOLFSSL_ERROR_VERBOSE(ret); @@ -3323,6 +3502,25 @@ break; } } +#if (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \ + defined(WOLFSSL_SM3) + else if (suite[0] == CIPHER_BYTE) { + switch (suite[1]) { + #ifdef BUILD_TLS_SM4_GCM_SM3 + case TLS_SM4_GCM_SM3: + mac = sm3_mac; + break; + #endif + #ifdef BUILD_TLS_SM4_CCM_SM3 + case TLS_SM4_CCM_SM3: + mac = sm3_mac; + break; + #endif + default: + break; + } + } +#endif #ifdef HAVE_NULL_CIPHER else if (suite[0] == ECC_BYTE) { switch (suite[1]) { @@ -3370,6 +3568,12 @@ return BAD_FUNC_ARG; } + if (ssl->buffers.tls13CookieSecret.buffer == NULL || + ssl->buffers.tls13CookieSecret.length == 0) { + WOLFSSL_MSG("Missing DTLS 1.3 cookie secret"); + return COOKIE_ERROR; + } + /* Cookie Data = Hash Len | Hash | CS | KeyShare Group */ cookie[cookieSz++] = (byte)hashSz; XMEMCPY(cookie + cookieSz, hash, hashSz); @@ -3456,6 +3660,11 @@ *hash = hashes->sha512; break; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + *hash = hashes->sm3; + break; + #endif } *hashSz = ssl->specs.hash_size; @@ -3586,6 +3795,12 @@ if (psk == NULL) return BAD_FUNC_ARG; + if (!HaveUniqueSessionObj(ssl)) { + WOLFSSL_MSG("Unable to have unique session object"); + WOLFSSL_ERROR_VERBOSE(MEMORY_ERROR); + return MEMORY_ERROR; + } + suite[0] = ssl->options.cipherSuite0; suite[1] = ssl->options.cipherSuite; @@ -3741,7 +3956,8 @@ ssl->options.cipherSuite = WOLFSSL_DEF_PSK_CIPHER; } if (ssl->arrays->psk_keySz == 0 || - ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN) { + (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN && + (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) { WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR); return PSK_KEY_ERROR; } @@ -3754,7 +3970,7 @@ #endif /* !WOLFSSL_PSK_ONE_ID */ if (!clientHello && (psk->cipherSuite0 != suite[0] || - psk->cipherSuite != suite[1])) { + psk->cipherSuite != suite[1])) { WOLFSSL_ERROR_VERBOSE(PSK_KEY_ERROR); return PSK_KEY_ERROR; } @@ -3810,7 +4026,7 @@ idx - Dtls13GetRlHeaderLength(ssl, 0)); else #endif /* WOLFSSL_DTLS13 */ - ret = HashOutput(ssl, output, idx, 0); + ret = HashOutput(ssl, output, (int)idx, 0); if (ret != 0) return ret; @@ -3958,7 +4174,7 @@ /* hash the body */ if (ret == 0) { ret = HashRaw(ssl, ech->innerClientHello, - ech->innerClientHelloLen - ech->paddingLen - ech->hpke->Nt); + (int)(ech->innerClientHelloLen - ech->paddingLen - ech->hpke->Nt)); } /* swap hsHashes back */ @@ -3968,6 +4184,49 @@ } #endif +static void GetTls13SessionId(WOLFSSL* ssl, byte* output, word32* idx) +{ + if (ssl->session->sessionIDSz > 0) { + /* Session resumption for old versions of protocol. */ + if (ssl->session->sessionIDSz <= ID_LEN) { + if (output != NULL) + output[*idx] = ssl->session->sessionIDSz; + (*idx)++; + if (output != NULL) { + XMEMCPY(output + *idx, ssl->session->sessionID, + ssl->session->sessionIDSz); + } + *idx += ssl->session->sessionIDSz; + } + else { + /* Invalid session ID length. Reset it. */ + ssl->session->sessionIDSz = 0; + if (output != NULL) + output[*idx] = 0; + (*idx)++; + } + } + else { + #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT + if (ssl->options.tls13MiddleBoxCompat) { + if (output != NULL) + output[*idx] = ID_LEN; + (*idx)++; + if (output != NULL) + XMEMCPY(output + *idx, ssl->arrays->clientRandom, ID_LEN); + *idx += ID_LEN; + } + else + #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */ + { + /* TLS v1.3 does not use session id - 0 length. */ + if (output != NULL) + output[*idx] = 0; + (*idx)++; + } + } +} + /* handle generation of TLS 1.3 client_hello (1) */ /* Send a ClientHello message to the server. * Include the information required to start a handshake with servers using @@ -3982,7 +4241,7 @@ byte* output; word32 idx; int sendSz; - word16 length; + word32 length; #if defined(HAVE_ECH) int clientRandomOffset; int preXLength; @@ -4060,7 +4319,7 @@ args = (Sch13Args*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) return ret; @@ -4076,6 +4335,7 @@ switch (ssl->options.asyncState) { case TLS_ASYNC_BEGIN: { + word32 sessIdSz = 0; args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; @@ -4084,8 +4344,8 @@ args->idx += DTLS_RECORD_EXTRA + DTLS_HANDSHAKE_EXTRA; #endif /* WOLFSSL_DTLS13 */ - /* Version | Random | Session Id | Cipher Suites | Compression */ - args->length = VERSION_SZ + RAN_LEN + ENUM_LEN + suites->suiteSz + + /* Version | Random | Cipher Suites | Compression */ + args->length = VERSION_SZ + RAN_LEN + suites->suiteSz + SUITE_LEN + COMP_LEN + ENUM_LEN; #ifdef WOLFSSL_QUIC if (WOLFSSL_IS_QUIC(ssl)) { @@ -4093,17 +4353,9 @@ ssl->session->sessionIDSz = 0; ssl->options.tls13MiddleBoxCompat = 0; } - else -#endif -#if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) - { - args->length += ID_LEN; - ssl->options.tls13MiddleBoxCompat = 1; - } -#else - if (ssl->options.resuming && ssl->session->sessionIDSz > 0) - args->length += ssl->session->sessionIDSz; #endif + GetTls13SessionId(ssl, NULL, &sessIdSz); + args->length += (word16)sessIdSz; #ifdef WOLFSSL_DTLS13 if (ssl->options.dtls) { @@ -4174,7 +4426,7 @@ /* set the type to inner */ args->ech->type = ECH_TYPE_INNER; - args->preXLength = args->length; + args->preXLength = (int)args->length; /* get size for inner */ ret = TLSX_GetRequestSize(ssl, client_hello, &args->length); @@ -4185,20 +4437,47 @@ args->ech->type = 0; /* set innerClientHelloLen to ClientHelloInner + padding + tag */ args->ech->paddingLen = 31 - ((args->length - 1) % 32); - args->ech->innerClientHelloLen = args->length + - args->ech->paddingLen + args->ech->hpke->Nt; + args->ech->innerClientHelloLen = (word16)(args->length + + args->ech->paddingLen + args->ech->hpke->Nt); /* set the length back to before we computed ClientHelloInner size */ - args->length = args->preXLength; + args->length = (word32)args->preXLength; } #endif - /* Include length of TLS extensions. */ - ret = TLSX_GetRequestSize(ssl, client_hello, &args->length); - if (ret != 0) - return ret; + { +#ifdef WOLFSSL_DTLS_CH_FRAG + word16 maxFrag = wolfSSL_GetMaxFragSize(ssl, MAX_RECORD_SIZE); + word16 lenWithoutExts = args->length; +#endif + + /* Include length of TLS extensions. */ + ret = TLSX_GetRequestSize(ssl, client_hello, &args->length); + if (ret != 0) + return ret; + +#ifdef WOLFSSL_DTLS_CH_FRAG + if (ssl->options.dtls && args->length > maxFrag && + TLSX_Find(ssl->extensions, TLSX_COOKIE) == NULL) { + /* Try again with an empty key share if we would be fragmenting + * without a cookie */ + ret = TLSX_KeyShare_Empty(ssl); + if (ret != 0) + return ret; + args->length = lenWithoutExts; + ret = TLSX_GetRequestSize(ssl, client_hello, &args->length); + if (ret != 0) + return ret; + if (args->length > maxFrag) { + WOLFSSL_MSG("Can't fit first CH in one fragment."); + return BUFFER_ERROR; + } + WOLFSSL_MSG("Sending empty key share so we don't fragment CH1"); + } +#endif + } /* Total message size. */ - args->sendSz = args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ; + args->sendSz = (int)(args->length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ); #ifdef WOLFSSL_DTLS13 if (ssl->options.dtls) @@ -4238,38 +4517,12 @@ XMEMCPY(args->output + args->idx, ssl->arrays->clientRandom, RAN_LEN); #if defined(HAVE_ECH) - args->clientRandomOffset = args->idx; + args->clientRandomOffset = (int)args->idx; #endif args->idx += RAN_LEN; - if (ssl->session->sessionIDSz > 0) { - /* Session resumption for old versions of protocol. */ - if (ssl->options.resuming) { - args->output[args->idx++] = ID_LEN; - XMEMCPY(args->output + args->idx, ssl->session->sessionID, - ssl->session->sessionIDSz); - args->idx += ID_LEN; - } - else { - /* Not resuming, zero length session ID */ - args->output[args->idx++] = 0; - } - } - else { - #ifdef WOLFSSL_TLS13_MIDDLEBOX_COMPAT - if (ssl->options.tls13MiddleBoxCompat) { - args->output[args->idx++] = ID_LEN; - XMEMCPY(args->output + args->idx, ssl->arrays->clientRandom, ID_LEN); - args->idx += ID_LEN; - } - else - #endif /* WOLFSSL_TLS13_MIDDLEBOX_COMPAT */ - { - /* TLS v1.3 does not use session id - 0 length. */ - args->output[args->idx++] = 0; - } - } + GetTls13SessionId(ssl, args->output, &args->idx); #ifdef WOLFSSL_DTLS13 if (ssl->options.dtls) { @@ -4373,7 +4626,7 @@ if (ssl->options.useEch == 1) { ret = TLSX_FinalizeEch(args->ech, args->output + RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ, - args->sendSz - (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ)); + (word32)(args->sendSz - (RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ))); if (ret != 0) return ret; @@ -4407,7 +4660,7 @@ /* compute the outer hash */ if (ret == 0) - ret = HashOutput(ssl, args->output, args->idx, 0); + ret = HashOutput(ssl, args->output, (int)args->idx, 0); } } if (ret != 0) @@ -4434,7 +4687,7 @@ } #endif /* WOLFSSL_DTLS13 */ - ssl->buffers.outputBuffer.length += args->sendSz; + ssl->buffers.outputBuffer.length += (word32)args->sendSz; /* Advance state and proceed */ ssl->options.asyncState = TLS_ASYNC_END; @@ -4469,7 +4722,7 @@ } #if defined(WOLFSSL_DTLS13) && !defined(WOLFSSL_NO_CLIENT) -static int Dtls13DoDowngrade(WOLFSSL* ssl) +static int Dtls13ClientDoDowngrade(WOLFSSL* ssl) { int ret; if (ssl->dtls13ClientHello == NULL) @@ -4500,45 +4753,42 @@ int serverRandomOffset, int helloSz) { int ret = 0; - int digestType; - int digestSize; + int digestType = 0; + int digestSize = 0; HS_Hashes* tmpHashes; HS_Hashes* acceptHashes; - byte zeros[WC_MAX_DIGEST_SIZE] = {0}; + byte zeros[WC_MAX_DIGEST_SIZE]; byte transcriptEchConf[WC_MAX_DIGEST_SIZE]; byte expandLabelPrk[WC_MAX_DIGEST_SIZE]; byte acceptConfirmation[ECH_ACCEPT_CONFIRMATION_SZ]; - + XMEMSET(zeros, 0, sizeof(zeros)); + XMEMSET(transcriptEchConf, 0, sizeof(transcriptEchConf)); + XMEMSET(expandLabelPrk, 0, sizeof(expandLabelPrk)); + XMEMSET(acceptConfirmation, 0, sizeof(acceptConfirmation)); /* copy ech hashes to accept */ ret = InitHandshakeHashesAndCopy(ssl, ssl->hsHashesEch, &acceptHashes); - /* swap hsHashes to acceptHashes */ tmpHashes = ssl->hsHashes; ssl->hsHashes = acceptHashes; - /* hash up to the last 8 bytes */ if (ret == 0) ret = HashRaw(ssl, input, serverRandomOffset + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ); - /* hash 8 zeros */ if (ret == 0) ret = HashRaw(ssl, zeros, ECH_ACCEPT_CONFIRMATION_SZ); - /* hash the rest of the hello */ - if (ret == 0) + if (ret == 0) { ret = HashRaw(ssl, input + serverRandomOffset + RAN_LEN, helloSz + HANDSHAKE_HEADER_SZ - (serverRandomOffset + RAN_LEN)); - + } /* get the modified transcript hash */ if (ret == 0) ret = GetMsgHash(ssl, transcriptEchConf); - if (ret > 0) ret = 0; - /* pick the right type and size based on mac_algorithm */ - if (ret == 0) + if (ret == 0) { switch (ssl->specs.mac_algorithm) { #ifndef NO_SHA256 case sha256_mac: @@ -4558,70 +4808,75 @@ digestSize = WC_SHA512_DIGEST_SIZE; break; #endif /* WOLFSSL_TLS13_SHA512 */ +#ifdef WOLFSSL_SM3 + case sm3_mac: + digestType = WC_SM3; + digestSize = WC_SM3_DIGEST_SIZE; + break; +#endif /* WOLFSSL_SM3 */ default: ret = -1; break; } - + } /* extract clientRandomInner with a key of all zeros */ - if (ret == 0) + if (ret == 0) { + PRIVATE_KEY_UNLOCK(); + #if !defined(HAVE_FIPS) || \ + (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)) + ret = wc_HKDF_Extract_ex(digestType, zeros, (word32)digestSize, + ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk, + ssl->heap, ssl->devId); + #else ret = wc_HKDF_Extract(digestType, zeros, digestSize, ssl->arrays->clientRandomInner, RAN_LEN, expandLabelPrk); - + #endif + PRIVATE_KEY_LOCK(); + } /* tls expand with the confirmation label */ - if (ret == 0) - ret = wc_Tls13_HKDF_Expand_Label(acceptConfirmation, - ECH_ACCEPT_CONFIRMATION_SZ, - expandLabelPrk, digestSize, tls13ProtocolLabel, - TLS13_PROTOCOL_LABEL_SZ, echAcceptConfirmationLabel, - ECH_ACCEPT_CONFIRMATION_LABEL_SZ, transcriptEchConf, digestSize, - digestType); - + if (ret == 0) { + PRIVATE_KEY_UNLOCK(); + ret = Tls13HKDFExpandKeyLabel(ssl, + acceptConfirmation, ECH_ACCEPT_CONFIRMATION_SZ, + expandLabelPrk, (word32)digestSize, + tls13ProtocolLabel, TLS13_PROTOCOL_LABEL_SZ, + echAcceptConfirmationLabel, ECH_ACCEPT_CONFIRMATION_LABEL_SZ, + transcriptEchConf, (word32)digestSize, digestType, WOLFSSL_SERVER_END); + PRIVATE_KEY_LOCK(); + } if (ret == 0) { /* last 8 bytes should match our expand output */ ret = XMEMCMP(acceptConfirmation, ssl->arrays->serverRandom + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ, ECH_ACCEPT_CONFIRMATION_SZ); - /* ech accepted */ if (ret == 0) { /* use the inner random for client random */ XMEMCPY(ssl->arrays->clientRandom, ssl->arrays->clientRandomInner, RAN_LEN); - - /* switch back to original hsHashes */ + /* switch back to original hsHashes to free */ ssl->hsHashes = tmpHashes; - - /* free hsHashes */ - FreeHandshakeHashes(ssl); - /* set the final hsHashes to the ech hashes */ tmpHashes = ssl->hsHashesEch; - - /* set hsHashesEch to NULL to avoid double free */ - ssl->hsHashesEch = NULL; } /* ech rejected */ else { - /* switch to hsHashesEch */ + /* switch to hsHashesEch to free */ ssl->hsHashes = ssl->hsHashesEch; - - /* free ech hashes */ - FreeHandshakeHashes(ssl); } - + /* free hsHashes */ + FreeHandshakeHashes(ssl); + /* set hsHashesEch to NULL to avoid double free */ + ssl->hsHashesEch = NULL; /* continue with outer if we failed to verify ech was accepted */ ret = 0; } - /* switch to acceptHashes */ ssl->hsHashes = acceptHashes; - /* free acceptHashes */ FreeHandshakeHashes(ssl); - + /* swap to tmp, will ech if accepted, hsHashes if rejected */ ssl->hsHashes = tmpHashes; - return ret; } @@ -4631,13 +4886,16 @@ int serverRandomOffset, int helloSz) { int ret = 0; - int digestType; - int digestSize; - HS_Hashes* tmpHashes; - HS_Hashes* acceptHashes; - byte zeros[WC_MAX_DIGEST_SIZE] = {0}; + int digestType = 0; + int digestSize = 0; + HS_Hashes* tmpHashes = NULL; + HS_Hashes* acceptHashes = NULL; + byte zeros[WC_MAX_DIGEST_SIZE]; byte transcriptEchConf[WC_MAX_DIGEST_SIZE]; byte expandLabelPrk[WC_MAX_DIGEST_SIZE]; + XMEMSET(zeros, 0, sizeof(zeros)); + XMEMSET(transcriptEchConf, 0, sizeof(transcriptEchConf)); + XMEMSET(expandLabelPrk, 0, sizeof(expandLabelPrk)); /* copy ech hashes to accept */ ret = InitHandshakeHashesAndCopy(ssl, ssl->hsHashes, &acceptHashes); @@ -4688,6 +4946,12 @@ digestSize = WC_SHA512_DIGEST_SIZE; break; #endif /* WOLFSSL_TLS13_SHA512 */ +#ifdef WOLFSSL_SM3 + case sm3_mac: + digestType = WC_SM3; + digestSize = WC_SM3_DIGEST_SIZE; + break; +#endif /* WOLFSSL_SM3 */ default: ret = -1; break; @@ -4696,21 +4960,28 @@ /* extract clientRandom with a key of all zeros */ if (ret == 0) { PRIVATE_KEY_UNLOCK(); + #if !defined(HAVE_FIPS) || \ + (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)) + ret = wc_HKDF_Extract_ex(digestType, zeros, (word32)digestSize, + ssl->arrays->clientRandom, RAN_LEN, expandLabelPrk, + ssl->heap, ssl->devId); + #else ret = wc_HKDF_Extract(digestType, zeros, digestSize, ssl->arrays->clientRandom, RAN_LEN, expandLabelPrk); + #endif PRIVATE_KEY_LOCK(); } /* tls expand with the confirmation label */ if (ret == 0) { PRIVATE_KEY_UNLOCK(); - ret = wc_Tls13_HKDF_Expand_Label( + ret = Tls13HKDFExpandKeyLabel(ssl, output + serverRandomOffset + RAN_LEN - ECH_ACCEPT_CONFIRMATION_SZ, - ECH_ACCEPT_CONFIRMATION_SZ, - expandLabelPrk, digestSize, tls13ProtocolLabel, - TLS13_PROTOCOL_LABEL_SZ, echAcceptConfirmationLabel, - ECH_ACCEPT_CONFIRMATION_LABEL_SZ, transcriptEchConf, digestSize, - digestType); + ECH_ACCEPT_CONFIRMATION_SZ, + expandLabelPrk, (word32)digestSize, + tls13ProtocolLabel, TLS13_PROTOCOL_LABEL_SZ, + echAcceptConfirmationLabel, ECH_ACCEPT_CONFIRMATION_LABEL_SZ, + transcriptEchConf, (word32)digestSize, digestType, WOLFSSL_SERVER_END); PRIVATE_KEY_LOCK(); } @@ -4791,10 +5062,10 @@ args = (Dsh13Args*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) { - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Mark message as not received so it can process again */ ssl->msgsReceived.got_server_hello = 0; } @@ -4857,7 +5128,7 @@ if (ssl->options.dtls) { ssl->chVersion.minor = DTLSv1_2_MINOR; ssl->version.minor = DTLSv1_2_MINOR; - ret = Dtls13DoDowngrade(ssl); + ret = Dtls13ClientDoDowngrade(ssl); if (ret != 0) return ret; } @@ -4884,6 +5155,13 @@ WOLFSSL_MSG("HelloRetryRequest format"); *extMsgType = hello_retry_request; + if (ssl->msgsReceived.got_hello_verify_request) { + WOLFSSL_MSG("Received HelloRetryRequest after a " + "HelloVerifyRequest"); + WOLFSSL_ERROR_VERBOSE(VERSION_ERROR); + return VERSION_ERROR; + } + /* A HelloRetryRequest comes in as an ServerHello for MiddleBox compat. * Found message to be a HelloRetryRequest. * Don't allow more than one HelloRetryRequest or ServerHello. @@ -4898,7 +5176,7 @@ /* Server random - keep for debugging. */ XMEMCPY(ssl->arrays->serverRandom, input + args->idx, RAN_LEN); #if defined(HAVE_ECH) - args->serverRandomOffset = args->idx; + args->serverRandomOffset = (int)args->idx; #endif args->idx += RAN_LEN; @@ -4944,7 +5222,7 @@ if (ssl->options.dtls) { ssl->chVersion.minor = DTLSv1_2_MINOR; ssl->version.minor = DTLSv1_2_MINOR; - ret = Dtls13DoDowngrade(ssl); + ret = Dtls13ClientDoDowngrade(ssl); if (ret != 0) return ret; } @@ -5014,10 +5292,11 @@ } ssl->version.minor = args->pv.minor; + ssl->options.tls1_3 = 0; #ifdef WOLFSSL_DTLS13 if (ssl->options.dtls) { - ret = Dtls13DoDowngrade(ssl); + ret = Dtls13ClientDoDowngrade(ssl); if (ret != 0) return ret; } @@ -5047,14 +5326,15 @@ /* restore message type */ *extMsgType = args->extMsgType; - if (args->totalExtSz > 0) { - /* Parse and handle extensions. */ + /* Parse and handle extensions, unless lower than TLS1.3. In that case, + * extensions will be parsed in DoServerHello. */ + if (args->totalExtSz > 0 && IsAtLeastTLSv1_3(ssl->version)) { ret = TLSX_Parse(ssl, input + args->idx, args->totalExtSz, *extMsgType, NULL); if (ret != 0) { #ifdef WOLFSSL_ASYNC_CRYPT /* Handle async operation */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Mark message as not received so it can process again */ ssl->msgsReceived.got_server_hello = 0; } @@ -5067,7 +5347,9 @@ ssl->msgsReceived.got_hello_retry_request = 1; ssl->msgsReceived.got_server_hello = 0; } + } + if (args->totalExtSz > 0) { args->idx += args->totalExtSz; } @@ -5076,7 +5358,9 @@ DtlsCIDOnExtensionsParsed(ssl); #endif /* WOLFSSL_DTLS_CID */ - *inOutIdx = args->idx; + if (IsAtLeastTLSv1_3(ssl->version)) { + *inOutIdx = args->idx; + } ssl->options.serverState = SERVER_HELLO_COMPLETE; @@ -5115,9 +5399,12 @@ } /* Force client hello version 1.2 to work for static RSA. */ - ssl->chVersion.minor = TLSv1_2_MINOR; + if (ssl->options.dtls) + ssl->chVersion.minor = DTLSv1_2_MINOR; + else + ssl->chVersion.minor = TLSv1_2_MINOR; /* Complete TLS v1.2 processing of ServerHello. */ - ret = CompleteServerHello(ssl); + ret = DoServerHello(ssl, input, inOutIdx, helloSz); #else WOLFSSL_MSG("Client using higher version, fatal error"); WOLFSSL_ERROR_VERBOSE(VERSION_ERROR); @@ -5186,7 +5473,7 @@ #if defined(HAVE_ECH) /* check for acceptConfirmation and HashInput with 8 0 bytes */ if (ssl->options.useEch == 1) { - ret = EchCheckAcceptance(ssl, input, args->serverRandomOffset, helloSz); + ret = EchCheckAcceptance(ssl, input, args->serverRandomOffset, (int)helloSz); if (ret != 0) return ret; } @@ -5200,6 +5487,20 @@ } else #endif +#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3) + if (ssl->options.cipherSuite0 == CIPHER_BYTE && + ssl->options.cipherSuite == TLS_SM4_GCM_SM3) { + ; /* Do nothing. */ + } + else +#endif +#if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3) + if (ssl->options.cipherSuite0 == CIPHER_BYTE && + ssl->options.cipherSuite == TLS_SM4_CCM_SM3) { + ; /* Do nothing. */ + } + else +#endif /* Check that the negotiated ciphersuite matches protocol version. */ if (ssl->options.cipherSuite0 != TLS13_BYTE) { WOLFSSL_MSG("Server sent non-TLS13 cipher suite in TLS 1.3 packet"); @@ -5379,6 +5680,11 @@ if (ssl->toInfoOn) AddLateName("CertificateRequest", &ssl->timeoutInfo); #endif +#ifdef OPENSSL_EXTRA + if ((ret = CertSetupCbWrapper(ssl)) != 0) + return ret; +#endif + if (OPAQUE8_LEN > size) return BUFFER_ERROR; @@ -5434,7 +5740,7 @@ #endif ) { if (PickHashSigAlgo(ssl, peerSuites.hashSigAlgo, - peerSuites.hashSigAlgoSz) != 0) { + peerSuites.hashSigAlgoSz, 0) != 0) { WOLFSSL_ERROR_VERBOSE(INVALID_PARAMETER); return INVALID_PARAMETER; } @@ -5479,7 +5785,7 @@ if (AllocateSuites(ssl) != 0) return; - XMEMSET(suites, 0, WOLFSSL_MAX_SUITE_SZ); + XMEMSET(suites, 0, sizeof(suites)); if (!ssl->options.useClientOrder) { /* Server order refining. */ @@ -5556,7 +5862,8 @@ *found = (*psk_keySz != 0); } if (*found) { - if (*psk_keySz > MAX_PSK_KEY_LEN) { + if (*psk_keySz > MAX_PSK_KEY_LEN && + *((int*)psk_keySz) != WC_NO_ERR_TRACE(USE_HW_PSK)) { WOLFSSL_MSG("Key len too long in FindPsk()"); ret = PSK_KEY_ERROR; WOLFSSL_ERROR_VERBOSE(ret); @@ -5606,32 +5913,32 @@ int found = 0; byte foundSuite[SUITE_LEN]; + WOLFSSL_ENTER("FindPsk"); + ret = FindPskSuite(ssl, psk, ssl->arrays->psk_key, &ssl->arrays->psk_keySz, suite, &found, foundSuite); if (ret == 0 && found) { - if ((ret == 0) && found) { - /* Default to ciphersuite if cb doesn't specify. */ - ssl->options.resuming = 0; - /* Don't send certificate request when using PSK. */ - ssl->options.verifyPeer = 0; + /* Default to ciphersuite if cb doesn't specify. */ + ssl->options.resuming = 0; + /* Don't send certificate request when using PSK. */ + ssl->options.verifyPeer = 0; - /* PSK age is always zero. */ - if (psk->ticketAge != 0) { - ret = PSK_KEY_ERROR; - WOLFSSL_ERROR_VERBOSE(ret); - } + /* PSK age is always zero. */ + if (psk->ticketAge != 0) { + ret = PSK_KEY_ERROR; + WOLFSSL_ERROR_VERBOSE(ret); } - if ((ret == 0) && found) { + if (ret == 0) { /* Set PSK ciphersuite into SSL. */ ssl->options.cipherSuite0 = foundSuite[0]; ssl->options.cipherSuite = foundSuite[1]; ret = SetCipherSpecs(ssl); } - if ((ret == 0) && found) { + if (ret == 0) { /* Derive the early secret using the PSK. */ ret = DeriveEarlySecret(ssl); } - if ((ret == 0) && found) { + if (ret == 0) { /* PSK negotiation has succeeded */ ssl->options.isPSK = 1; /* SERVER: using PSK for peer authentication. */ @@ -5640,6 +5947,8 @@ } *err = ret; + WOLFSSL_LEAVE("FindPsk", found); + WOLFSSL_LEAVE("FindPsk", ret); return found; } #endif /* !NO_PSK */ @@ -5708,7 +6017,7 @@ } #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif @@ -5759,7 +6068,7 @@ return ret; /* Hash data up to binders for deriving binders in PSK extension. */ - ret = HashInput(ssl, input, inputSz); + ret = HashInput(ssl, input, (int)inputSz); if (ret < 0) return ret; @@ -5775,7 +6084,7 @@ if (ret != 0) return ret; - ret = HashInput(ssl, input, inputSz); + ret = HashInput(ssl, input, (int)inputSz); if (ret < 0) return ret; @@ -5856,7 +6165,7 @@ int first = 0; #ifndef WOLFSSL_PSK_ONE_ID int i; - const Suites* suites = WOLFSSL_SUITES(ssl); + const Suites* suites; #else byte suite[2]; #endif @@ -5871,7 +6180,7 @@ if (usingPSK) *usingPSK = 0; /* Hash data up to binders for deriving binders in PSK extension. */ - ret = HashInput(ssl, input, helloSz); + ret = HashInput(ssl, input, (int)helloSz); return ret; } @@ -5894,11 +6203,12 @@ /* Refine list for PSK processing. */ RefineSuites(ssl, clSuites); - #ifndef WOLFSSL_PSK_ONE_ID if (usingPSK == NULL) return BAD_FUNC_ARG; + /* set after refineSuites, to avoid taking a stale ptr to ctx->Suites */ + suites = WOLFSSL_SUITES(ssl); /* Server list has only common suites from refining in server or client * order. */ for (i = 0; !(*usingPSK) && i < suites->suiteSz; i += 2) { @@ -5907,7 +6217,7 @@ if (ret != 0) { #ifdef HAVE_SESSION_TICKET #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif CleanupClientTickets((PreSharedKey*)ext->data); #endif @@ -5937,7 +6247,7 @@ else { /* No suitable PSK found, Hash the complete ClientHello, * as caller expect it after we return */ - ret = HashInput(ssl, input, helloSz); + ret = HashInput(ssl, input, (int)helloSz); } if (ret != 0) return ret; @@ -5961,6 +6271,8 @@ if ((ret = SetKeysSide(ssl, DECRYPT_SIDE_ONLY)) != 0) return ret; + ssl->keys.encryptionOn = 1; + #ifdef WOLFSSL_DTLS13 if (ssl->options.dtls) { ret = Dtls13NewEpoch(ssl, @@ -6046,6 +6358,12 @@ byte cookieType = 0; byte macSz = 0; + if (ssl->buffers.tls13CookieSecret.buffer == NULL || + ssl->buffers.tls13CookieSecret.length == 0) { + WOLFSSL_MSG("Missing DTLS 1.3 cookie secret"); + return COOKIE_ERROR; + } + #if !defined(NO_SHA) && defined(NO_SHA256) cookieType = SHA; macSz = WC_SHA_DIGEST_SIZE; @@ -6349,6 +6667,9 @@ XFREE(args->clSuites, ssl->heap, DYNAMIC_TYPE_SUITES); args->clSuites = NULL; } +#ifdef OPENSSL_EXTRA + ssl->clSuites = NULL; +#endif } int DoTls13ClientHello(WOLFSSL* ssl, const byte* input, word32* inOutIdx, @@ -6379,7 +6700,7 @@ args = (Dch13Args*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) { goto exit_dch; @@ -6415,12 +6736,22 @@ #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE) /* Update the ssl->options.dtlsStateful setting `if` statement in * wolfSSL_accept_TLSv13 when changing this one. */ - if (IsDtlsNotSctpMode(ssl) && ssl->options.sendCookie) { - ret = DoClientHelloStateless(ssl, input, inOutIdx, helloSz); + if (IsDtlsNotSctpMode(ssl) && ssl->options.sendCookie && + !ssl->options.dtlsStateful) { + DtlsSetSeqNumForReply(ssl); + ret = DoClientHelloStateless(ssl, input + *inOutIdx, helloSz, 0, NULL); if (ret != 0 || !ssl->options.dtlsStateful) { *inOutIdx += helloSz; goto exit_dch; } + if (ssl->chGoodCb != NULL) { + int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx); + if (cbret < 0) { + ssl->error = cbret; + WOLFSSL_MSG("ClientHello Good Cb don't continue error"); + return WOLFSSL_FATAL_ERROR; + } + } } ssl->options.dtlsStateful = 1; #endif /* WOLFSSL_DTLS */ @@ -6495,7 +6826,7 @@ realMinor = ssl->version.minor; ssl->version.minor = args->pv.minor; - ret = HashInput(ssl, input + args->begin, helloSz); + ret = HashInput(ssl, input + args->begin, (int)helloSz); ssl->version.minor = realMinor; if (ret == 0) { ret = DoClientHello(ssl, input, inOutIdx, helloSz); @@ -6520,7 +6851,12 @@ #endif sessIdSz = input[args->idx++]; - if (sessIdSz != ID_LEN && sessIdSz != 0) { +#ifndef WOLFSSL_TLS13_MIDDLEBOX_COMPAT + if (sessIdSz > ID_LEN) +#else + if (sessIdSz != ID_LEN && sessIdSz != 0) +#endif + { ERROR_OUT(INVALID_PARAMETER, exit_dch); } @@ -6528,10 +6864,9 @@ ERROR_OUT(BUFFER_ERROR, exit_dch); ssl->session->sessionIDSz = sessIdSz; - if (sessIdSz == ID_LEN) { + if (sessIdSz > 0) XMEMCPY(ssl->session->sessionID, input + args->idx, sessIdSz); - args->idx += ID_LEN; - } + args->idx += sessIdSz; #ifdef WOLFSSL_DTLS13 /* legacy_cookie */ @@ -6660,7 +6995,11 @@ } } else { - ERROR_OUT(HRR_COOKIE_ERROR, exit_dch); +#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS13_NO_HRR_ON_RESUME) + /* Don't error out as we may be resuming. We confirm this later. */ + if (!ssl->options.dtls) +#endif + ERROR_OUT(HRR_COOKIE_ERROR, exit_dch); } } #endif @@ -6716,17 +7055,21 @@ case TLS_ASYNC_DO: { +#ifdef OPENSSL_EXTRA + ssl->clSuites = args->clSuites; + if ((ret = CertSetupCbWrapper(ssl)) != 0) + goto exit_dch; +#endif #ifndef NO_CERTS if (!args->usingPSK) { if ((ret = MatchSuite(ssl, args->clSuites)) < 0) { #ifdef WOLFSSL_ASYNC_CRYPT - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif WOLFSSL_MSG("Unsupported cipher suite, ClientHello 1.3"); goto exit_dch; } } - else #endif #ifdef HAVE_SUPPORTED_CURVES if (args->usingPSK == 2) { @@ -6734,8 +7077,11 @@ int doHelloRetry = 0; ret = TLSX_KeyShare_Establish(ssl, &doHelloRetry); if (doHelloRetry) { + /* Make sure we don't send HRR twice */ + if (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) + ERROR_OUT(INVALID_PARAMETER, exit_dch); ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE; - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) ret = 0; /* for hello_retry return 0 */ } if (ret != 0) @@ -6757,7 +7103,8 @@ TLSX* extension = TLSX_Find(ssl->extensions, TLSX_KEY_SHARE); if (extension != NULL && extension->resp == 1) { KeyShareEntry* serverKSE = (KeyShareEntry*)extension->data; - if (serverKSE != NULL && serverKSE->lastRet == WC_PENDING_E) { + if (serverKSE != NULL && + serverKSE->lastRet == WC_NO_ERR_TRACE(WC_PENDING_E)) { ret = TLSX_KeyShare_GenKey(ssl, serverKSE); if (ret != 0) goto exit_dch; @@ -6779,6 +7126,7 @@ if (!args->usingPSK) { #ifndef NO_CERTS + /* Check that the negotiated ciphersuite matches protocol version. */ #ifdef HAVE_NULL_CIPHER if (ssl->options.cipherSuite0 == ECC_BYTE && (ssl->options.cipherSuite == TLS_SHA256_SHA256 || @@ -6787,7 +7135,20 @@ } else #endif - /* Check that the negotiated ciphersuite matches protocol version. */ + #if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_SM3) + if (ssl->options.cipherSuite0 == CIPHER_BYTE && + ssl->options.cipherSuite == TLS_SM4_GCM_SM3) { + ; /* Do nothing. */ + } + else + #endif + #if defined(WOLFSSL_SM4_CCM) && defined(WOLFSSL_SM3) + if (ssl->options.cipherSuite0 == CIPHER_BYTE && + ssl->options.cipherSuite == TLS_SM4_CCM_SM3) { + ; /* Do nothing. */ + } + else + #endif if (ssl->options.cipherSuite0 != TLS13_BYTE) { WOLFSSL_MSG("Negotiated ciphersuite from lesser version than " "TLS v1.3"); @@ -6797,6 +7158,7 @@ #ifdef HAVE_SESSION_TICKET if (ssl->options.resuming) { ssl->options.resuming = 0; + ssl->arrays->psk_keySz = 0; XMEMSET(ssl->arrays->psk_key, 0, ssl->specs.hash_size); } #endif @@ -6812,32 +7174,58 @@ ret = INPUT_CASE_ERROR; } /* switch (ssl->options.asyncState) */ -#if defined(WOLFSSL_SEND_HRR_COOKIE) - if (ret == 0 && ssl->options.sendCookie && ssl->options.cookieGood && - (ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE +#ifdef WOLFSSL_SEND_HRR_COOKIE + if (ret == 0 && ssl->options.sendCookie) { + if (ssl->options.cookieGood && + ssl->options.acceptState == TLS13_ACCEPT_FIRST_REPLY_DONE) { + /* Processing second ClientHello. Clear HRR state. */ + ssl->options.serverState = NULL_STATE; + } + + if (ssl->options.cookieGood && + ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) { + /* If we already verified the peer with a cookie then we can't + * do another HRR for cipher negotiation. Send alert and restart + * the entire handshake. */ + ERROR_OUT(INVALID_PARAMETER, exit_dch); + } #ifdef WOLFSSL_DTLS13 - /* DTLS cookie exchange should be done in stateless code in - * DoClientHelloStateless. If we verified the cookie then - * always advance the state. */ - || ssl->options.dtls + if (ssl->options.dtls && + ssl->options.serverState == SERVER_HELLO_RETRY_REQUEST_COMPLETE) { + /* Cookie and key share negotiation should be handled in + * DoClientHelloStateless. If we enter here then something went + * wrong in our logic. */ + ERROR_OUT(BAD_HELLO, exit_dch); + } #endif - )) - ssl->options.serverState = SERVER_HELLO_COMPLETE; + /* Send a cookie */ + if (!ssl->options.cookieGood && + ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE) { +#ifdef WOLFSSL_DTLS13 + if (ssl->options.dtls) { +#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME + /* We can skip cookie on resumption */ + if (!ssl->options.dtls || !ssl->options.dtls13NoHrrOnResume || + !args->usingPSK) #endif + ERROR_OUT(BAD_HELLO, exit_dch); + } + else +#endif + { + /* Need to remove the keyshare ext if we found a common group + * and are not doing curve negotiation. */ + TLSX_Remove(&ssl->extensions, TLSX_KEY_SHARE, ssl->heap); + ssl->options.serverState = SERVER_HELLO_RETRY_REQUEST_COMPLETE; + } -#if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE) - if (ret == 0 && ssl->options.dtls && ssl->options.sendCookie && - ssl->options.serverState <= SERVER_HELLO_RETRY_REQUEST_COMPLETE) { - /* Cookie and key share negotiation should be handled in - * DoClientHelloStateless. If we enter here then something went wrong - * in our logic. */ - ERROR_OUT(BAD_HELLO, exit_dch); + } } #endif /* WOLFSSL_DTLS13 */ #ifdef WOLFSSL_DTLS_CID /* do not modify CID state if we are sending an HRR */ - if (ssl->options.useDtlsCID && + if (ret == 0 && ssl->options.dtls && ssl->options.useDtlsCID && ssl->options.serverState != SERVER_HELLO_RETRY_REQUEST_COMPLETE) DtlsCIDOnExtensionsParsed(ssl); #endif /* WOLFSSL_DTLS_CID */ @@ -6849,7 +7237,7 @@ WOLFSSL_LEAVE("DoTls13ClientHello", ret); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { ssl->msgsReceived.got_client_hello = 0; return ret; } @@ -6927,7 +7315,7 @@ ret = TLSX_GetResponseSize(ssl, extMsgType, &length); if (ret != 0) return ret; - sendSz = idx + length; + sendSz = (int)(idx + length); /* Check buffers are big enough and grow if needed. */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) @@ -7166,7 +7554,7 @@ if (ret != 0) return ret; - sendSz = idx + length; + sendSz = (int)(idx + length); /* Encryption always on. */ sendSz += MAX_MSG_EXTRA; @@ -7251,7 +7639,7 @@ int ret; int sendSz; word32 i; - word16 reqSz; + word32 reqSz; word16 hashSigAlgoSz = 0; SignatureAlgorithms* sa; @@ -7264,13 +7652,13 @@ return SIDE_ERROR; /* Get the length of the hashSigAlgo buffer */ - InitSuitesHashSigAlgo_ex(NULL, 1, 1, 1, 1, 0, 1, ssl->buffers.keySz, - &hashSigAlgoSz); + InitSuitesHashSigAlgo(NULL, SIG_ALL, 1, ssl->buffers.keySz, + &hashSigAlgoSz); sa = TLSX_SignatureAlgorithms_New(ssl, hashSigAlgoSz, ssl->heap); if (sa == NULL) return MEMORY_ERROR; - InitSuitesHashSigAlgo_ex(sa->hashSigAlgo, 1, 1, 1, 1, 0, 1, - ssl->buffers.keySz, &sa->hashSigAlgoSz); + InitSuitesHashSigAlgo(sa->hashSigAlgo, SIG_ALL, 1, ssl->buffers.keySz, + &hashSigAlgoSz); ret = TLSX_Push(&ssl->extensions, TLSX_SIGNATURE_ALGORITHMS, sa, ssl->heap); if (ret != 0) { TLSX_SignatureAlgorithms_FreeAll(sa, ssl->heap); @@ -7288,7 +7676,7 @@ if (ret != 0) return ret; - sendSz = i + reqSz; + sendSz = (int)(i + reqSz); /* Always encrypted and make room for padding. */ sendSz += MAX_MSG_EXTRA; @@ -7363,7 +7751,7 @@ #ifndef NO_CERTS #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \ - defined(HAVE_ED448) || defined(HAVE_PQC) + defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) /* Encode the signature algorithm into buffer. * * hashalgo The hash algorithm. @@ -7379,6 +7767,12 @@ output[1] = ecc_dsa_sa_algo; break; #endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case sm2_sa_algo: + output[0] = SM2_SA_MAJOR; + output[1] = SM2_SA_MINOR; + break; +#endif #ifdef HAVE_ED25519 /* ED25519: 0x0807 */ case ed25519_sa_algo: @@ -7402,8 +7796,7 @@ output[1] = hashAlgo; break; #endif -#ifdef HAVE_PQC - #ifdef HAVE_FALCON +#ifdef HAVE_FALCON case falcon_level1_sa_algo: output[0] = FALCON_LEVEL1_SA_MAJOR; output[1] = FALCON_LEVEL1_SA_MINOR; @@ -7412,8 +7805,8 @@ output[0] = FALCON_LEVEL5_SA_MAJOR; output[1] = FALCON_LEVEL5_SA_MINOR; break; - #endif - #ifdef HAVE_DILITHIUM +#endif +#ifdef HAVE_DILITHIUM case dilithium_level2_sa_algo: output[0] = DILITHIUM_LEVEL2_SA_MAJOR; output[1] = DILITHIUM_LEVEL2_SA_MINOR; @@ -7426,13 +7819,101 @@ output[0] = DILITHIUM_LEVEL5_SA_MAJOR; output[1] = DILITHIUM_LEVEL5_SA_MINOR; break; - #endif #endif default: break; } } +#ifdef WOLFSSL_DUAL_ALG_CERTS +/* These match up with what the OQS team has defined. */ +#define HYBRID_SA_MAJOR 0xFE +#define HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR 0xA1 +#define HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR 0xA2 +#define HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR 0xA4 +#define HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR 0xA6 +#define HYBRID_P256_FALCON_LEVEL1_SA_MINOR 0xAF +#define HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR 0xB0 +#define HYBRID_P521_FALCON_LEVEL5_SA_MINOR 0xB2 + +/* Custom defined ones for PQC first */ +#define HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR 0xD1 +#define HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR 0xD2 +#define HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR 0xD3 +#define HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR 0xD4 +#define HYBRID_FALCON_LEVEL1_P256_SA_MINOR 0xD5 +#define HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR 0xD6 +#define HYBRID_FALCON_LEVEL5_P521_SA_MINOR 0xD7 + + +static void EncodeDualSigAlg(byte sigAlg, byte altSigAlg, byte* output) +{ + /* Initialize output to error indicator. */ + output[0] = 0x0; + output[1] = 0x0; + + if (sigAlg == ecc_dsa_sa_algo && altSigAlg == dilithium_level2_sa_algo) { + output[1] = HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR; + } + else if (sigAlg == rsa_pss_sa_algo && + altSigAlg == dilithium_level2_sa_algo) { + output[1] = HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR; + } + else if (sigAlg == ecc_dsa_sa_algo && + altSigAlg == dilithium_level3_sa_algo) { + output[1] = HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR; + } + else if (sigAlg == ecc_dsa_sa_algo && + altSigAlg == dilithium_level5_sa_algo) { + output[1] = HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR; + } + else if (sigAlg == ecc_dsa_sa_algo && + altSigAlg == falcon_level1_sa_algo) { + output[1] = HYBRID_P256_FALCON_LEVEL1_SA_MINOR; + } + else if (sigAlg == rsa_pss_sa_algo && + altSigAlg == falcon_level1_sa_algo) { + output[1] = HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR; + } + else if (sigAlg == ecc_dsa_sa_algo && + altSigAlg == falcon_level5_sa_algo) { + output[1] = HYBRID_P521_FALCON_LEVEL5_SA_MINOR; + } + else if (sigAlg == dilithium_level2_sa_algo && + altSigAlg == ecc_dsa_sa_algo) { + output[1] = HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR; + } + else if (sigAlg == dilithium_level2_sa_algo && + altSigAlg == rsa_pss_sa_algo) { + output[1] = HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR; + } + else if (sigAlg == dilithium_level3_sa_algo && + altSigAlg == ecc_dsa_sa_algo) { + output[1] = HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR; + } + else if (sigAlg == dilithium_level5_sa_algo && + altSigAlg == ecc_dsa_sa_algo) { + output[1] = HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR; + } + else if (sigAlg == falcon_level1_sa_algo && + altSigAlg == ecc_dsa_sa_algo) { + output[1] = HYBRID_FALCON_LEVEL1_P256_SA_MINOR; + } + else if (sigAlg == falcon_level1_sa_algo && + altSigAlg == rsa_pss_sa_algo) { + output[1] = HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR; + } + else if (sigAlg == falcon_level5_sa_algo && + altSigAlg == ecc_dsa_sa_algo) { + output[1] = HYBRID_FALCON_LEVEL5_P521_SA_MINOR; + } + + if (output[1] != 0x0) { + output[0] = HYBRID_SA_MAJOR; + } +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Decode the signature algorithm. * * input The encoded signature algorithm. @@ -7446,6 +7927,16 @@ int ret = 0; switch (input[0]) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2_SA_MAJOR: + if (input[1] == SM2_SA_MINOR) { + *hsType = sm2_sa_algo; + *hashAlgo = sm3_mac; + } + else + ret = INVALID_PARAMETER; + break; + #endif case NEW_SA_MAJOR: /* PSS signatures: 0x080[4-6] */ if (input[1] >= sha256_mac && input[1] <= sha512_mac) { @@ -7471,7 +7962,7 @@ else ret = INVALID_PARAMETER; break; -#ifdef HAVE_PQC +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) case PQC_SA_MAJOR: #if defined(HAVE_FALCON) if (input[1] == FALCON_LEVEL1_SA_MINOR) { @@ -7515,6 +8006,100 @@ return ret; } +#ifdef WOLFSSL_DUAL_ALG_CERTS +/* Decode the hybrid signature algorithm. + * + * input The encoded signature algorithm. + * hashalgo The hash algorithm. + * hsType The signature type. + * returns INVALID_PARAMETER if not recognized and 0 otherwise. + */ +static WC_INLINE int DecodeTls13HybridSigAlg(byte* input, byte* hashAlg, + byte *sigAlg, byte *altSigAlg) +{ + + if (input[0] != HYBRID_SA_MAJOR) { + return INVALID_PARAMETER; + } + + if (input[1] == HYBRID_P256_DILITHIUM_LEVEL2_SA_MINOR) { + *sigAlg = ecc_dsa_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = dilithium_level2_sa_algo; + } + else if (input[1] == HYBRID_RSA3072_DILITHIUM_LEVEL2_SA_MINOR) { + *sigAlg = rsa_pss_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = dilithium_level2_sa_algo; + } + else if (input[1] == HYBRID_P384_DILITHIUM_LEVEL3_SA_MINOR) { + *sigAlg = ecc_dsa_sa_algo; + *hashAlg = sha384_mac; + *altSigAlg = dilithium_level3_sa_algo; + } + else if (input[1] == HYBRID_P521_DILITHIUM_LEVEL5_SA_MINOR) { + *sigAlg = ecc_dsa_sa_algo; + *hashAlg = sha512_mac; + *altSigAlg = dilithium_level5_sa_algo; + } + else if (input[1] == HYBRID_P256_FALCON_LEVEL1_SA_MINOR) { + *sigAlg = ecc_dsa_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = falcon_level1_sa_algo; + } + else if (input[1] == HYBRID_RSA3072_FALCON_LEVEL1_SA_MINOR) { + *sigAlg = rsa_pss_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = falcon_level1_sa_algo; + } + else if (input[1] == HYBRID_P521_FALCON_LEVEL5_SA_MINOR) { + *sigAlg = ecc_dsa_sa_algo; + *hashAlg = sha512_mac; + *altSigAlg = falcon_level5_sa_algo; + } + else if (input[1] == HYBRID_DILITHIUM_LEVEL2_P256_SA_MINOR) { + *sigAlg = dilithium_level2_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = ecc_dsa_sa_algo; + } + else if (input[1] == HYBRID_DILITHIUM_LEVEL2_RSA3072_SA_MINOR) { + *sigAlg = dilithium_level2_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = rsa_pss_sa_algo; + } + else if (input[1] == HYBRID_DILITHIUM_LEVEL3_P384_SA_MINOR) { + *sigAlg = dilithium_level3_sa_algo; + *hashAlg = sha384_mac; + *altSigAlg = ecc_dsa_sa_algo; + } + else if (input[1] == HYBRID_DILITHIUM_LEVEL5_P521_SA_MINOR) { + *sigAlg = dilithium_level5_sa_algo; + *hashAlg = sha512_mac; + *altSigAlg = ecc_dsa_sa_algo; + } + else if (input[1] == HYBRID_FALCON_LEVEL1_P256_SA_MINOR) { + *sigAlg = falcon_level1_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = ecc_dsa_sa_algo; + } + else if (input[1] == HYBRID_FALCON_LEVEL1_RSA3072_SA_MINOR) { + *sigAlg = falcon_level1_sa_algo; + *hashAlg = sha256_mac; + *altSigAlg = rsa_pss_sa_algo; + } + else if (input[1] == HYBRID_FALCON_LEVEL5_P521_SA_MINOR) { + *sigAlg = falcon_level5_sa_algo; + *hashAlg = sha512_mac; + *altSigAlg = ecc_dsa_sa_algo; + } + else { + return INVALID_PARAMETER; + } + + return 0; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Get the hash of the messages so far. * * ssl The SSL/TLS object. @@ -7546,6 +8131,13 @@ ret = WC_SHA512_DIGEST_SIZE; break; #endif /* WOLFSSL_TLS13_SHA512 */ + #ifdef WOLFSSL_SM3 + case sm3_mac: + ret = wc_Sm3GetHash(&ssl->hsHashes->hashSm3, hash); + if (ret == 0) + ret = WC_SM3_DIGEST_SIZE; + break; + #endif /* WOLFSSL_SM3 */ default: break; } @@ -7613,7 +8205,7 @@ { Digest digest; int hashSz = 0; - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); byte* hash; (void)sigAlgo; @@ -7626,7 +8218,7 @@ case sha256_mac: ret = wc_InitSha256(&digest.sha256); if (ret == 0) { - ret = wc_Sha256Update(&digest.sha256, sigData, sigDataSz); + ret = wc_Sha256Update(&digest.sha256, sigData, (word32)sigDataSz); if (ret == 0) ret = wc_Sha256Final(&digest.sha256, hash); wc_Sha256Free(&digest.sha256); @@ -7638,7 +8230,7 @@ case sha384_mac: ret = wc_InitSha384(&digest.sha384); if (ret == 0) { - ret = wc_Sha384Update(&digest.sha384, sigData, sigDataSz); + ret = wc_Sha384Update(&digest.sha384, sigData, (word32)sigDataSz); if (ret == 0) ret = wc_Sha384Final(&digest.sha384, hash); wc_Sha384Free(&digest.sha384); @@ -7650,7 +8242,7 @@ case sha512_mac: ret = wc_InitSha512(&digest.sha512); if (ret == 0) { - ret = wc_Sha512Update(&digest.sha512, sigData, sigDataSz); + ret = wc_Sha512Update(&digest.sha512, sigData, (word32)sigDataSz); if (ret == 0) ret = wc_Sha512Final(&digest.sha512, hash); wc_Sha512Free(&digest.sha512); @@ -7658,6 +8250,10 @@ hashSz = WC_SHA512_DIGEST_SIZE; break; #endif + default: + ret = BAD_FUNC_ARG; + break; + } if (ret != 0) @@ -7679,7 +8275,7 @@ { Digest digest; int hashSz = 0; - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); /* Digest the signature data. */ switch (hashAlgo) { @@ -7687,7 +8283,7 @@ case sha256_mac: ret = wc_InitSha256(&digest.sha256); if (ret == 0) { - ret = wc_Sha256Update(&digest.sha256, sigData, sigDataSz); + ret = wc_Sha256Update(&digest.sha256, sigData, (word32)sigDataSz); if (ret == 0) ret = wc_Sha256Final(&digest.sha256, sigData); wc_Sha256Free(&digest.sha256); @@ -7699,7 +8295,7 @@ case sha384_mac: ret = wc_InitSha384(&digest.sha384); if (ret == 0) { - ret = wc_Sha384Update(&digest.sha384, sigData, sigDataSz); + ret = wc_Sha384Update(&digest.sha384, sigData, (word32)sigDataSz); if (ret == 0) ret = wc_Sha384Final(&digest.sha384, sigData); wc_Sha384Free(&digest.sha384); @@ -7711,7 +8307,7 @@ case sha512_mac: ret = wc_InitSha512(&digest.sha512); if (ret == 0) { - ret = wc_Sha512Update(&digest.sha512, sigData, sigDataSz); + ret = wc_Sha512Update(&digest.sha512, sigData, (word32)sigDataSz); if (ret == 0) ret = wc_Sha512Final(&digest.sha512, sigData); wc_Sha512Free(&digest.sha512); @@ -7720,6 +8316,7 @@ break; #endif default: + ret = BAD_FUNC_ARG; break; } @@ -7765,7 +8362,7 @@ sigAlgo, hashAlgo); if (ret < 0) return ret; - sigSz = ret; + sigSz = (word32)ret; ret = wc_RsaPSS_CheckPadding(sigData, sigSz, decSig, decSigSz, hashType); @@ -7913,14 +8510,9 @@ listSz = 0; } else { -#ifdef OPENSSL_EXTRA - if ((ret = CertSetupCbWrapper(ssl)) != 0) - return ret; -#endif - if (!ssl->buffers.certificate) { WOLFSSL_MSG("Send Cert missing certificate buffer"); - return BUFFER_ERROR; + return NO_CERT_ERROR; } /* Certificate Data */ certSz = ssl->buffers.certificate->length; @@ -7968,7 +8560,7 @@ if (ssl->fragOffset != 0) length -= (ssl->fragOffset + headerSz); - maxFragment = wolfSSL_GetMaxFragSize(ssl, MAX_RECORD_SIZE); + maxFragment = (word32)wolfSSL_GetMaxFragSize(ssl, MAX_RECORD_SIZE); while (length > 0 && ret == 0) { byte* output = NULL; @@ -8153,7 +8745,8 @@ } #if (!defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \ - defined(HAVE_ED448) || defined(HAVE_PQC)) && \ + defined(HAVE_ED448) || defined(HAVE_FALCON) || \ + defined(HAVE_DILITHIUM)) && \ (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)) typedef struct Scv13Args { byte* output; /* not allocated */ @@ -8166,6 +8759,12 @@ byte sigAlgo; byte* sigData; word16 sigDataSz; +#ifdef WOLFSSL_DUAL_ALG_CERTS + byte altSigAlgo; + word32 altSigLen; /* Only used in the case of both native and alt. */ + byte* altSigData; + word16 altSigDataSz; +#endif } Scv13Args; static void FreeScv13Args(WOLFSSL* ssl, void* pArgs) @@ -8178,6 +8777,12 @@ XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE); args->sigData = NULL; } +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (args && args->altSigData != NULL) { + XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE); + args->altSigData = NULL; + } +#endif } /* handle generation TLS v1.3 certificate_verify (15) */ @@ -8193,7 +8798,10 @@ static int SendTls13CertificateVerify(WOLFSSL* ssl) { int ret = 0; - buffer* sig = &ssl->buffers.sig; +#ifndef NO_RSA + /* Use this as a temporary buffer for RSA signature verification. */ + buffer* rsaSigBuf = &ssl->buffers.sig; +#endif #ifdef WOLFSSL_ASYNC_CRYPT Scv13Args* args = NULL; WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args); @@ -8208,11 +8816,15 @@ WOLFSSL_START(WC_FUNC_CERTIFICATE_VERIFY_SEND); WOLFSSL_ENTER("SendTls13CertificateVerify"); +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); +#endif + ssl->options.buildingMsg = 1; #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13SendCertVerify(ssl); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { goto exit_scv; } ret = 0; @@ -8238,7 +8850,7 @@ args = (Scv13Args*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_scv; @@ -8260,6 +8872,10 @@ case TLS_ASYNC_BEGIN: { if (ssl->options.sendVerify == SEND_BLANK_CERT) { + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + wolfssl_priv_der_unblind(ssl->buffers.key, + ssl->buffers.keyMask); + #endif return 0; /* sent blank cert, can't verify */ } @@ -8282,9 +8898,9 @@ case TLS_ASYNC_BUILD: { - int rem = ssl->buffers.outputBuffer.bufferSize + int rem = (int)(ssl->buffers.outputBuffer.bufferSize - ssl->buffers.outputBuffer.length - - RECORD_HEADER_SZ - HANDSHAKE_HEADER_SZ; + - RECORD_HEADER_SZ - HANDSHAKE_HEADER_SZ); /* idx is used to track verify pointer offset to output */ args->idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ; @@ -8302,22 +8918,47 @@ if (ssl->buffers.key == NULL) { #ifdef HAVE_PK_CALLBACKS if (wolfSSL_CTX_IsPrivatePkSet(ssl->ctx)) - args->length = GetPrivateKeySigSize(ssl); + args->length = (word16)GetPrivateKeySigSize(ssl); else #endif ERROR_OUT(NO_PRIVATE_KEY, exit_scv); } else { - ret = DecodePrivateKey(ssl, &args->length); +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) { + /* In the case of alternative, we swap in the alt. */ + if (ssl->buffers.altKey == NULL) { + ERROR_OUT(NO_PRIVATE_KEY, exit_scv); + } + ssl->buffers.keyType = ssl->buffers.altKeyType; + ssl->buffers.keySz = ssl->buffers.altKeySz; + /* If we own it, free key before overriding it. */ + if (ssl->buffers.weOwnKey) { + FreeDer(&ssl->buffers.key); + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + FreeDer(&ssl->buffers.keyMask); + #endif + } + + /* Swap keys */ + ssl->buffers.key = ssl->buffers.altKey; + #ifdef WOLFSSL_BLIND_PRIVATE_KEY + ssl->buffers.keyMask = ssl->buffers.altKeyMask; + #endif + ssl->buffers.weOwnKey = ssl->buffers.weOwnAltKey; + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + ret = DecodePrivateKey(ssl, &args->sigLen); if (ret != 0) goto exit_scv; } - if (rem < 0 || args->length > rem) { + if (rem < 0 || (int)args->sigLen > rem) { ERROR_OUT(BUFFER_E, exit_scv); } - if (args->length == 0) { + if (args->sigLen == 0) { ERROR_OUT(NO_PRIVATE_KEY, exit_scv); } @@ -8325,8 +8966,17 @@ if (ssl->hsType == DYNAMIC_TYPE_RSA) args->sigAlgo = rsa_pss_sa_algo; #ifdef HAVE_ECC - else if (ssl->hsType == DYNAMIC_TYPE_ECC) - args->sigAlgo = ecc_dsa_sa_algo; + else if (ssl->hsType == DYNAMIC_TYPE_ECC) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->buffers.keyType == sm2_sa_algo) { + args->sigAlgo = sm2_sa_algo; + } + else + #endif + { + args->sigAlgo = ecc_dsa_sa_algo; + } + } #endif #ifdef HAVE_ED25519 else if (ssl->hsType == DYNAMIC_TYPE_ED25519) @@ -8336,8 +8986,7 @@ else if (ssl->hsType == DYNAMIC_TYPE_ED448) args->sigAlgo = ed448_sa_algo; #endif - #if defined(HAVE_PQC) - #if defined(HAVE_FALCON) + #if defined(HAVE_FALCON) else if (ssl->hsType == DYNAMIC_TYPE_FALCON) { falcon_key* fkey = (falcon_key*)ssl->hsKey; byte level = 0; @@ -8354,8 +9003,8 @@ ERROR_OUT(ALGO_ID_E, exit_scv); } } - #endif /* HAVE_FALCON */ - #if defined(HAVE_DILITHIUM) + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) else if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) { dilithium_key* fkey = (dilithium_key*)ssl->hsKey; byte level = 0; @@ -8375,64 +9024,141 @@ ERROR_OUT(ALGO_ID_E, exit_scv); } } - #endif /* HAVE_DILITHIUM */ - #endif /* HAVE_PQC */ + #endif /* HAVE_DILITHIUM */ else { ERROR_OUT(ALGO_ID_E, exit_scv); } - EncodeSigAlg(ssl->options.hashAlgo, args->sigAlgo, args->verify); - if (ssl->hsType == DYNAMIC_TYPE_RSA) { - int sigLen = MAX_SIG_DATA_SZ; - if (args->length > MAX_SIG_DATA_SZ) - sigLen = args->length; - args->sigData = (byte*)XMALLOC(sigLen, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->peerSigSpec == NULL) { + /* The peer did not respond. We didn't send CKS or they don't + * support it. Either way, we do not need to handle dual + * key/sig case. */ + ssl->sigSpec = NULL; + ssl->sigSpecSz = 0; } - else { - args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); + + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + /* The native was already decoded. Now we need to do the + * alternative. Note that no swap was done because this case is + * both native and alternative, not just alternative. */ + if (ssl->ctx->altPrivateKey == NULL) { + ERROR_OUT(NO_PRIVATE_KEY, exit_scv); + } + + /* After this call, args->altSigLen has the length we need for + * the alternative signature. */ + ret = DecodeAltPrivateKey(ssl, &args->altSigLen); + if (ret != 0) + goto exit_scv; + + if (ssl->buffers.altKeyType == ecc_dsa_sa_algo || + ssl->buffers.altKeyType == falcon_level1_sa_algo || + ssl->buffers.altKeyType == falcon_level5_sa_algo || + ssl->buffers.altKeyType == dilithium_level2_sa_algo || + ssl->buffers.altKeyType == dilithium_level3_sa_algo || + ssl->buffers.altKeyType == dilithium_level5_sa_algo) { + args->altSigAlgo = ssl->buffers.altKeyType; + } + else if (ssl->buffers.altKeyType == rsa_sa_algo && + ssl->hsAltType == DYNAMIC_TYPE_RSA) { + args->altSigAlgo = rsa_pss_sa_algo; + } + else { + ERROR_OUT(ALGO_ID_E, exit_scv); + } + + EncodeDualSigAlg(args->sigAlgo, args->altSigAlgo, args->verify); + if (args->verify[0] == 0) { + ERROR_OUT(ALGO_ID_E, exit_scv); + } } + else + #endif /* WOLFSSL_DUAL_ALG_CERTS */ + EncodeSigAlg(ssl->options.hashAlgo, args->sigAlgo, + args->verify); + if (args->sigData == NULL) { - ERROR_OUT(MEMORY_E, exit_scv); + word32 sigLen = MAX_SIG_DATA_SZ; + if ((ssl->hsType == DYNAMIC_TYPE_RSA) && + (args->sigLen > MAX_SIG_DATA_SZ)) { + /* We store the RSA signature in the sigData buffer + * temporarily, hence its size must be fitting. */ + sigLen = args->sigLen; + } + args->sigData = (byte*)XMALLOC(sigLen, ssl->heap, + DYNAMIC_TYPE_SIGNATURE); + if (args->sigData == NULL) { + ERROR_OUT(MEMORY_E, exit_scv); + } + } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ssl->sigSpec != NULL) && + (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) && + (args->altSigData == NULL)) { + word32 sigLen = MAX_SIG_DATA_SZ; + if (ssl->hsAltType == DYNAMIC_TYPE_RSA && + args->altSigLen > MAX_SIG_DATA_SZ) { + /* We store the RSA signature in the sigData buffer + * temporarily, hence its size must be fitting. */ + sigLen = args->altSigLen; + } + args->altSigData = (byte*)XMALLOC(sigLen, ssl->heap, + DYNAMIC_TYPE_SIGNATURE); + if (args->altSigData == NULL) { + ERROR_OUT(MEMORY_E, exit_scv); + } } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ /* Create the data to be signed. */ ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 0); if (ret != 0) goto exit_scv; + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ssl->sigSpec != NULL) && + (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) { + XMEMCPY(args->altSigData, args->sigData, args->sigDataSz); + args->altSigDataSz = args->sigDataSz; + } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ + #ifndef NO_RSA if (ssl->hsType == DYNAMIC_TYPE_RSA) { /* build encoded signature buffer */ - sig->length = WC_MAX_DIGEST_SIZE; - sig->buffer = (byte*)XMALLOC(sig->length, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); - if (sig->buffer == NULL) { + rsaSigBuf->length = WC_MAX_DIGEST_SIZE; + rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length, ssl->heap, + DYNAMIC_TYPE_SIGNATURE); + if (rsaSigBuf->buffer == NULL) { ERROR_OUT(MEMORY_E, exit_scv); } - ret = CreateRSAEncodedSig(sig->buffer, args->sigData, + ret = CreateRSAEncodedSig(rsaSigBuf->buffer, args->sigData, args->sigDataSz, args->sigAlgo, ssl->options.hashAlgo); if (ret < 0) goto exit_scv; - sig->length = ret; + rsaSigBuf->length = (unsigned int)ret; ret = 0; - - /* Maximum size of RSA Signature. */ - args->sigLen = args->length; } #endif /* !NO_RSA */ #ifdef HAVE_ECC if (ssl->hsType == DYNAMIC_TYPE_ECC) { - sig->length = args->sendSz - args->idx - HASH_SIG_SIZE - - VERIFY_HEADER; - ret = CreateECCEncodedSig(args->sigData, - args->sigDataSz, ssl->options.hashAlgo); - if (ret < 0) - goto exit_scv; - args->sigDataSz = (word16)ret; - ret = 0; + args->sigLen = args->sendSz - args->idx - HASH_SIG_SIZE - + VERIFY_HEADER; + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->buffers.keyType != sm2_sa_algo) + #endif + { + ret = CreateECCEncodedSig(args->sigData, + args->sigDataSz, ssl->options.hashAlgo); + if (ret < 0) + goto exit_scv; + args->sigDataSz = (word16)ret; + ret = 0; + } } #endif /* HAVE_ECC */ #ifdef HAVE_ED25519 @@ -8441,7 +9167,7 @@ if (ret < 0) { ERROR_OUT(ret, exit_scv); } - sig->length = ED25519_SIG_SIZE; + args->sigLen = ED25519_SIG_SIZE; } #endif /* HAVE_ED25519 */ #ifdef HAVE_ED448 @@ -8450,21 +9176,57 @@ if (ret < 0) { ERROR_OUT(ret, exit_scv); } - sig->length = ED448_SIG_SIZE; + args->sigLen = ED448_SIG_SIZE; } + #endif /* HAVE_ED448 */ - #if defined(HAVE_PQC) - #if defined(HAVE_FALCON) + #if defined(HAVE_FALCON) if (ssl->hsType == DYNAMIC_TYPE_FALCON) { - sig->length = FALCON_MAX_SIG_SIZE; + args->sigLen = FALCON_MAX_SIG_SIZE; } - #endif - #if defined(HAVE_DILITHIUM) + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) { - sig->length = DILITHIUM_MAX_SIG_SIZE; + args->sigLen = DILITHIUM_MAX_SIG_SIZE; } - #endif - #endif /* HAVE_PQC */ + #endif /* HAVE_DILITHIUM */ + + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + + #ifndef NO_RSA + if (ssl->hsAltType == DYNAMIC_TYPE_RSA) { + /* build encoded signature buffer */ + rsaSigBuf->length = WC_MAX_DIGEST_SIZE; + rsaSigBuf->buffer = (byte*)XMALLOC(rsaSigBuf->length, + ssl->heap, + DYNAMIC_TYPE_SIGNATURE); + if (rsaSigBuf->buffer == NULL) { + ERROR_OUT(MEMORY_E, exit_scv); + } + + ret = CreateRSAEncodedSig(rsaSigBuf->buffer, + args->altSigData, args->altSigDataSz, + args->altSigAlgo, ssl->options.hashAlgo); + if (ret < 0) + goto exit_scv; + rsaSigBuf->length = ret; + ret = 0; + } + #endif /* !NO_RSA */ + #ifdef HAVE_ECC + if (ssl->hsAltType == DYNAMIC_TYPE_ECC) { + ret = CreateECCEncodedSig(args->altSigData, + args->altSigDataSz, ssl->options.hashAlgo); + if (ret < 0) + goto exit_scv; + args->altSigDataSz = (word16)ret; + ret = 0; + } + #endif /* HAVE_ECC */ + } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ /* Advance state and proceed */ ssl->options.asyncState = TLS_ASYNC_DO; @@ -8473,82 +9235,91 @@ case TLS_ASYNC_DO: { + byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER; + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + /* As we have two signatures in the message, we store + * the length of each before the actual signature. This + * is necessary, as we could have two algorithms with + * variable length signatures. */ + sigOut += OPAQUE16_LEN; + } + #endif #ifdef HAVE_ECC - if (ssl->hsType == DYNAMIC_TYPE_ECC) { - ret = EccSign(ssl, args->sigData, args->sigDataSz, - args->verify + HASH_SIG_SIZE + VERIFY_HEADER, - (word32*)&sig->length, (ecc_key*)ssl->hsKey, - #ifdef HAVE_PK_CALLBACKS - ssl->buffers.key - #else - NULL + if (ssl->hsType == DYNAMIC_TYPE_ECC) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->buffers.keyType == sm2_sa_algo) { + ret = Sm2wSm3Sign(ssl, TLS13_SM2_SIG_ID, + TLS13_SM2_SIG_ID_SZ, args->sigData, args->sigDataSz, + sigOut, &args->sigLen, (ecc_key*)ssl->hsKey, NULL); + } + else #endif - ); - args->length = (word16)sig->length; + { + ret = EccSign(ssl, args->sigData, args->sigDataSz, + sigOut, &args->sigLen, (ecc_key*)ssl->hsKey, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } + args->length = (word16)args->sigLen; } #endif /* HAVE_ECC */ #ifdef HAVE_ED25519 if (ssl->hsType == DYNAMIC_TYPE_ED25519) { ret = Ed25519Sign(ssl, args->sigData, args->sigDataSz, - args->verify + HASH_SIG_SIZE + VERIFY_HEADER, - (word32*)&sig->length, (ed25519_key*)ssl->hsKey, + sigOut, &args->sigLen, (ed25519_key*)ssl->hsKey, #ifdef HAVE_PK_CALLBACKS ssl->buffers.key #else NULL #endif ); - args->length = (word16)sig->length; + args->length = (word16)args->sigLen; } #endif #ifdef HAVE_ED448 if (ssl->hsType == DYNAMIC_TYPE_ED448) { ret = Ed448Sign(ssl, args->sigData, args->sigDataSz, - args->verify + HASH_SIG_SIZE + VERIFY_HEADER, - (word32*)&sig->length, (ed448_key*)ssl->hsKey, + sigOut, &args->sigLen, (ed448_key*)ssl->hsKey, #ifdef HAVE_PK_CALLBACKS ssl->buffers.key #else NULL #endif ); - args->length = (word16)sig->length; + args->length = (word16)args->sigLen; } #endif - #if defined(HAVE_PQC) - #if defined(HAVE_FALCON) + #if defined(HAVE_FALCON) if (ssl->hsType == DYNAMIC_TYPE_FALCON) { ret = wc_falcon_sign_msg(args->sigData, args->sigDataSz, - args->verify + HASH_SIG_SIZE + - VERIFY_HEADER, (word32*)&sig->length, - (falcon_key*)ssl->hsKey); - args->length = (word16)sig->length; + sigOut, &args->sigLen, + (falcon_key*)ssl->hsKey, ssl->rng); + args->length = (word16)args->sigLen; } - #endif - #if defined(HAVE_DILITHIUM) + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) if (ssl->hsType == DYNAMIC_TYPE_DILITHIUM) { ret = wc_dilithium_sign_msg(args->sigData, args->sigDataSz, - args->verify + HASH_SIG_SIZE + - VERIFY_HEADER, (word32*)&sig->length, - (dilithium_key*)ssl->hsKey); - args->length = (word16)sig->length; + sigOut, &args->sigLen, + (dilithium_key*)ssl->hsKey, ssl->rng); + args->length = (word16)args->sigLen; } - #endif - #endif /* HAVE_PQC */ + #endif /* HAVE_DILITHIUM */ #ifndef NO_RSA if (ssl->hsType == DYNAMIC_TYPE_RSA) { - ret = RsaSign(ssl, sig->buffer, (word32)sig->length, - args->verify + HASH_SIG_SIZE + VERIFY_HEADER, &args->sigLen, - args->sigAlgo, ssl->options.hashAlgo, - (RsaKey*)ssl->hsKey, - ssl->buffers.key - ); + ret = RsaSign(ssl, rsaSigBuf->buffer, (word32)rsaSigBuf->length, + sigOut, &args->sigLen, args->sigAlgo, + ssl->options.hashAlgo, (RsaKey*)ssl->hsKey, + ssl->buffers.key); if (ret == 0) { args->length = (word16)args->sigLen; - - XMEMCPY(args->sigData, - args->verify + HASH_SIG_SIZE + VERIFY_HEADER, - args->sigLen); + XMEMCPY(args->sigData, sigOut, args->sigLen); } } #endif /* !NO_RSA */ @@ -8558,6 +9329,77 @@ goto exit_scv; } + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + /* Add signature length for the first signature. */ + c16toa((word16)args->sigLen, sigOut - OPAQUE16_LEN); + args->length += OPAQUE16_LEN; + + /* Advance our pointer to where we store the alt signature. + * We also add additional space for the length field of the + * second signature. */ + sigOut += args->sigLen + OPAQUE16_LEN; + + /* Generate the alternative signature */ + #ifdef HAVE_ECC + if (ssl->hsAltType == DYNAMIC_TYPE_ECC) { + ret = EccSign(ssl, args->altSigData, args->altSigDataSz, + sigOut, &args->altSigLen, + (ecc_key*)ssl->hsAltKey, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.altKey + #else + NULL + #endif + ); + } + #endif /* HAVE_ECC */ + #ifndef NO_RSA + if (ssl->hsAltType == DYNAMIC_TYPE_RSA) { + ret = RsaSign(ssl, rsaSigBuf->buffer, + (word32)rsaSigBuf->length, sigOut, + &args->altSigLen, args->altSigAlgo, + ssl->options.hashAlgo, (RsaKey*)ssl->hsAltKey, + ssl->buffers.altKey); + + if (ret == 0) { + XMEMCPY(args->altSigData, sigOut, args->altSigLen); + } + } + #endif /* !NO_RSA */ + #if defined(HAVE_FALCON) + if (ssl->hsAltType == DYNAMIC_TYPE_FALCON) { + ret = wc_falcon_sign_msg(args->altSigData, + args->altSigDataSz, sigOut, + &args->altSigLen, + (falcon_key*)ssl->hsAltKey, + ssl->rng); + } + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) + if (ssl->hsAltType == DYNAMIC_TYPE_DILITHIUM) { + ret = wc_dilithium_sign_msg(args->altSigData, + args->altSigDataSz, sigOut, + &args->altSigLen, + (dilithium_key*)ssl->hsAltKey, + ssl->rng); + } + #endif /* HAVE_DILITHIUM */ + + /* Check for error */ + if (ret != 0) { + goto exit_scv; + } + + /* Add signature length for the alternative signature. */ + c16toa((word16)args->altSigLen, sigOut - OPAQUE16_LEN); + + /* Add length of the alt sig to the total length */ + args->length += args->altSigLen + OPAQUE16_LEN; + } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Add signature length. */ c16toa(args->length, args->verify + HASH_SIG_SIZE); @@ -8572,26 +9414,72 @@ if (ssl->hsType == DYNAMIC_TYPE_RSA) { /* check for signature faults */ ret = VerifyRsaSign(ssl, args->sigData, args->sigLen, - sig->buffer, (word32)sig->length, args->sigAlgo, + rsaSigBuf->buffer, (word32)rsaSigBuf->length, args->sigAlgo, ssl->options.hashAlgo, (RsaKey*)ssl->hsKey, - ssl->buffers.key - ); + ssl->buffers.key); + } + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH && + ssl->hsAltType == DYNAMIC_TYPE_RSA) { + /* check for signature faults */ + ret = VerifyRsaSign(ssl, args->altSigData, args->altSigLen, + rsaSigBuf->buffer, (word32)rsaSigBuf->length, + args->altSigAlgo, ssl->options.hashAlgo, + (RsaKey*)ssl->hsAltKey, ssl->buffers.altKey); } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ #endif /* !NO_RSA */ #if defined(HAVE_ECC) && defined(WOLFSSL_CHECK_SIG_FAULTS) - if (ssl->hsType == DYNAMIC_TYPE_ECC) { - ret = EccVerify(ssl, - args->verify + HASH_SIG_SIZE + VERIFY_HEADER, - sig->length, args->sigData, args->sigDataSz, - (ecc_key*)ssl->hsKey, + if (ssl->hsType == DYNAMIC_TYPE_ECC) { + byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER; + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + /* Add our length offset. */ + sigOut += OPAQUE16_LEN; + } + #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->buffers.keyType == sm2_sa_algo) { + ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID, + TLS13_SM2_SIG_ID_SZ, + sigOut, args->sigLen, args->sigData, args->sigDataSz, + (ecc_key*)ssl->hsKey, NULL); + } + else + #endif + { + ret = EccVerify(ssl, sigOut, args->sigLen, + args->sigData, args->sigDataSz, + (ecc_key*)ssl->hsKey, + #ifdef HAVE_PK_CALLBACKS + ssl->buffers.key + #else + NULL + #endif + ); + } + } + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH && + ssl->hsAltType == DYNAMIC_TYPE_ECC) { + /* check for signature faults */ + byte* sigOut = args->verify + HASH_SIG_SIZE + VERIFY_HEADER + + args->sigLen + OPAQUE16_LEN + OPAQUE16_LEN; + ret = EccVerify(ssl, sigOut, args->altSigLen, + args->altSigData, args->altSigDataSz, + (ecc_key*)ssl->hsAltKey, #ifdef HAVE_PK_CALLBACKS - ssl->buffers.key + ssl->buffers.altKey #else - NULL + NULL #endif - ); + ); } - #endif + #endif /* WOLFSSL_DUAL_ALG_CERTS */ + #endif /* HAVE_ECC && WOLFSSL_CHECK_SIG_FAULTS */ /* Check for error */ if (ret != 0) { @@ -8610,7 +9498,7 @@ VERIFY_HEADER, certificate_verify, ssl); args->sendSz = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ + - args->length + HASH_SIG_SIZE + VERIFY_HEADER; + args->length + HASH_SIG_SIZE + VERIFY_HEADER; #ifdef WOLFSSL_DTLS13 if (ssl->options.dtls) args->sendSz += recordLayerHdrExtra + DTLS_HANDSHAKE_EXTRA; @@ -8674,13 +9562,22 @@ } /* switch(ssl->options.asyncState) */ exit_scv: +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + if (ret == 0) { + ret = wolfssl_priv_der_blind(ssl->rng, ssl->buffers.key, + &ssl->buffers.keyMask); + } + else { + wolfssl_priv_der_unblind(ssl->buffers.key, ssl->buffers.keyMask); + } +#endif WOLFSSL_LEAVE("SendTls13CertificateVerify", ret); WOLFSSL_END(WC_FUNC_CERTIFICATE_VERIFY_SEND); #ifdef WOLFSSL_ASYNC_CRYPT /* Handle async operation */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -8764,11 +9661,16 @@ word32 sigSz; word32 idx; word32 begin; - byte hashAlgo; - byte sigAlgo; byte* sigData; word16 sigDataSz; +#ifdef WOLFSSL_DUAL_ALG_CERTS + byte altSigAlgo; + byte* altSigData; + word32 altSigDataSz; + word32 altSignatureSz; + byte altPeerAuthGood; +#endif } Dcv13Args; static void FreeDcv13Args(WOLFSSL* ssl, void* pArgs) @@ -8779,10 +9681,130 @@ XFREE(args->sigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE); args->sigData = NULL; } - +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (args && args->altSigData != NULL) { + XFREE(args->altSigData, ssl->heap, DYNAMIC_TYPE_SIGNATURE); + args->altSigData = NULL; + } +#endif (void)ssl; } +#ifdef WOLFSSL_DUAL_ALG_CERTS +#ifndef NO_RSA +/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a + * RSA public key. Convert it into a usable public key. */ +static int decodeRsaKey(WOLFSSL* ssl) +{ + int keyRet; + word32 tmpIdx = 0; + + if (ssl->peerRsaKeyPresent) + return INVALID_PARAMETER; + + keyRet = AllocKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey); + if (keyRet != 0) + return PEER_KEY_ERROR; + + ssl->peerRsaKeyPresent = 1; + keyRet = wc_RsaPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx, + ssl->peerRsaKey, + ssl->peerCert.sapkiLen); + if (keyRet != 0) + return PEER_KEY_ERROR; + + return 0; +} +#endif /* !NO_RSA */ + +#ifdef HAVE_ECC +/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a + * ECC public key. Convert it into a usable public key. */ +static int decodeEccKey(WOLFSSL* ssl) +{ + int keyRet; + word32 tmpIdx = 0; + + if (ssl->peerEccDsaKeyPresent) + return INVALID_PARAMETER; + + keyRet = AllocKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey); + if (keyRet != 0) + return PEER_KEY_ERROR; + + ssl->peerEccDsaKeyPresent = 1; + keyRet = wc_EccPublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx, + ssl->peerEccDsaKey, + ssl->peerCert.sapkiLen); + if (keyRet != 0) + return PEER_KEY_ERROR; + + return 0; +} +#endif /* HAVE_ECC */ + +#ifdef HAVE_DILITHIUM +/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a + * dilithium public key. Convert it into a usable public key. */ +static int decodeDilithiumKey(WOLFSSL* ssl, int level) +{ + int keyRet; + word32 tmpIdx = 0; + + if (ssl->peerDilithiumKeyPresent) + return INVALID_PARAMETER; + + keyRet = AllocKey(ssl, DYNAMIC_TYPE_DILITHIUM, + (void**)&ssl->peerDilithiumKey); + if (keyRet != 0) + return PEER_KEY_ERROR; + + ssl->peerDilithiumKeyPresent = 1; + keyRet = wc_dilithium_set_level(ssl->peerDilithiumKey, level); + if (keyRet != 0) + return PEER_KEY_ERROR; + + keyRet = wc_Dilithium_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx, + ssl->peerDilithiumKey, + ssl->peerCert.sapkiLen); + if (keyRet != 0) + return PEER_KEY_ERROR; + + return 0; +} +#endif /* HAVE_DILITHIUM */ + +#ifdef HAVE_FALCON +/* ssl->peerCert->sapkiDer is the alternative public key. Hopefully it is a + * falcon public key. Convert it into a usable public key. */ +static int decodeFalconKey(WOLFSSL* ssl, int level) +{ + int keyRet; + word32 tmpIdx = 0; + + if (ssl->peerFalconKeyPresent) + return INVALID_PARAMETER; + + keyRet = AllocKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey); + if (keyRet != 0) + return PEER_KEY_ERROR; + + ssl->peerFalconKeyPresent = 1; + keyRet = wc_falcon_set_level(ssl->peerFalconKey, level); + if (keyRet != 0) + return PEER_KEY_ERROR; + + keyRet = wc_Falcon_PublicKeyDecode(ssl->peerCert.sapkiDer, &tmpIdx, + ssl->peerFalconKey, + ssl->peerCert.sapkiLen); + if (keyRet != 0) + return PEER_KEY_ERROR; + + return 0; +} +#endif /* HAVE_FALCON */ +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* handle processing TLS v1.3 certificate_verify (15) */ /* Parse and handle a TLS v1.3 CertificateVerify message. * @@ -8798,7 +9820,11 @@ word32* inOutIdx, word32 totalSz) { int ret = 0; - buffer* sig = &ssl->buffers.sig; + byte* sig = NULL; +#ifndef NO_RSA + /* Use this as a temporary buffer for RSA signature verification. */ + buffer* rsaSigBuf = &ssl->buffers.sig; +#endif #ifdef WOLFSSL_ASYNC_CRYPT Dcv13Args* args = NULL; WOLFSSL_ASSERT_SIZEOF_GE(ssl->async->args, *args); @@ -8811,7 +9837,7 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_Tls13CertificateVerify(ssl, input, inOutIdx, totalSz); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { goto exit_dcv; } ret = 0; @@ -8828,7 +9854,7 @@ args = (Dcv13Args*)ssl->async->args; ret = wolfSSL_AsyncPop(ssl, &ssl->options.asyncState); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) goto exit_dcv; @@ -8840,8 +9866,8 @@ ret = 0; ssl->options.asyncState = TLS_ASYNC_BEGIN; XMEMSET(args, 0, sizeof(Dcv13Args)); - args->hashAlgo = sha_mac; - args->sigAlgo = anonymous_sa_algo; + ssl->options.peerHashAlgo = sha_mac; + ssl->options.peerSigAlgo = anonymous_sa_algo; args->idx = *inOutIdx; args->begin = *inOutIdx; #ifdef WOLFSSL_ASYNC_CRYPT @@ -8872,8 +9898,35 @@ if ((args->idx - args->begin) + ENUM_LEN + ENUM_LEN > totalSz) { ERROR_OUT(BUFFER_ERROR, exit_dcv); } - ret = DecodeTls13SigAlg(input + args->idx, &args->hashAlgo, - &args->sigAlgo); + +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->peerSigSpec == NULL) { + /* The peer did not respond. We didn't send CKS or they don't + * support it. Either way, we do not need to handle dual + * key/sig case. */ + ssl->sigSpec = NULL; + ssl->sigSpecSz = 0; + } + + /* If no CKS extension or either native or alternative, then just + * get a normal sigalgo. But if BOTH, then get the native and alt + * sig algos. */ + if (ssl->sigSpec == NULL || + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_NATIVE || + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) { +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + ret = DecodeTls13SigAlg(input + args->idx, + &ssl->options.peerHashAlgo, &ssl->options.peerSigAlgo); +#ifdef WOLFSSL_DUAL_ALG_CERTS + } + else { + ret = DecodeTls13HybridSigAlg(input + args->idx, + &ssl->options.peerHashAlgo, + &ssl->options.peerSigAlgo, + &args->altSigAlgo); + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + if (ret < 0) goto exit_dcv; args->idx += OPAQUE16_LEN; @@ -8891,63 +9944,163 @@ ERROR_OUT(BUFFER_ERROR, exit_dcv); } +#ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ssl->sigSpec != NULL) && + (*ssl->sigSpec != WOLFSSL_CKS_SIGSPEC_NATIVE)) { + + word16 sa; + if (args->altSigAlgo == 0) + sa = ssl->options.peerSigAlgo; + else + sa = args->altSigAlgo; + + switch(sa) { + #ifndef NO_RSA + case rsa_pss_sa_algo: + ret = decodeRsaKey(ssl); + break; + #endif + #ifdef HAVE_ECC + case ecc_dsa_sa_algo: + ret = decodeEccKey(ssl); + break; + #endif + #ifdef HAVE_DILITHIUM + case dilithium_level2_sa_algo: + ret = decodeDilithiumKey(ssl, 2); + break; + case dilithium_level3_sa_algo: + ret = decodeDilithiumKey(ssl, 3); + break; + case dilithium_level5_sa_algo: + ret = decodeDilithiumKey(ssl, 5); + break; + #endif + #ifdef HAVE_FALCON + case falcon_level1_sa_algo: + ret = decodeFalconKey(ssl, 1); + break; + case falcon_level5_sa_algo: + ret = decodeFalconKey(ssl, 5); + break; + #endif + default: + ERROR_OUT(PEER_KEY_ERROR, exit_dcv); + } + + if (ret != 0) + ERROR_OUT(ret, exit_dcv); + + if (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_ALTERNATIVE) { + /* Now swap in the alternative by removing the native. + * sa contains the alternative signature type. */ + #ifndef NO_RSA + if (ssl->peerRsaKeyPresent && sa != rsa_pss_sa_algo) { + FreeKey(ssl, DYNAMIC_TYPE_RSA, + (void**)&ssl->peerRsaKey); + ssl->peerRsaKeyPresent = 0; + } + #endif + #ifdef HAVE_ECC + else if (ssl->peerEccDsaKeyPresent && + sa != ecc_dsa_sa_algo) { + FreeKey(ssl, DYNAMIC_TYPE_ECC, + (void**)&ssl->peerEccDsaKey); + ssl->peerEccDsaKeyPresent = 0; + } + #endif + #ifdef HAVE_DILITHIUM + else if (ssl->peerDilithiumKeyPresent && + sa != dilithium_level2_sa_algo && + sa != dilithium_level3_sa_algo && + sa != dilithium_level5_sa_algo) { + FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM, + (void**)&ssl->peerDilithiumKey); + ssl->peerDilithiumKeyPresent = 0; + } + #endif + #ifdef HAVE_FALCON + else if (ssl->peerFalconKeyPresent && + sa != falcon_level1_sa_algo && + sa != falcon_level5_sa_algo) { + FreeKey(ssl, DYNAMIC_TYPE_FALCON, + (void**)&ssl->peerFalconKey); + ssl->peerFalconKeyPresent = 0; + } + #endif + else { + ERROR_OUT(PEER_KEY_ERROR, exit_dcv); + } + } + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Check for public key of required type. */ /* Assume invalid unless signature algo matches the key provided */ validSigAlgo = 0; #ifdef HAVE_ED25519 - if (args->sigAlgo == ed25519_sa_algo) { + if (ssl->options.peerSigAlgo == ed25519_sa_algo) { WOLFSSL_MSG("Peer sent ED25519 sig"); validSigAlgo = (ssl->peerEd25519Key != NULL) && ssl->peerEd25519KeyPresent; } #endif #ifdef HAVE_ED448 - if (args->sigAlgo == ed448_sa_algo) { + if (ssl->options.peerSigAlgo == ed448_sa_algo) { WOLFSSL_MSG("Peer sent ED448 sig"); validSigAlgo = (ssl->peerEd448Key != NULL) && ssl->peerEd448KeyPresent; } #endif #ifdef HAVE_ECC - if (args->sigAlgo == ecc_dsa_sa_algo) { + if (ssl->options.peerSigAlgo == ecc_dsa_sa_algo) { WOLFSSL_MSG("Peer sent ECC sig"); validSigAlgo = (ssl->peerEccDsaKey != NULL) && ssl->peerEccDsaKeyPresent; } #endif - #ifdef HAVE_PQC - if (args->sigAlgo == falcon_level1_sa_algo) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->options.peerSigAlgo == sm2_sa_algo) { + WOLFSSL_MSG("Peer sent SM2 sig"); + validSigAlgo = (ssl->peerEccDsaKey != NULL) && + ssl->peerEccDsaKeyPresent; + } + #endif + #ifdef HAVE_FALCON + if (ssl->options.peerSigAlgo == falcon_level1_sa_algo) { WOLFSSL_MSG("Peer sent Falcon Level 1 sig"); validSigAlgo = (ssl->peerFalconKey != NULL) && ssl->peerFalconKeyPresent; } - if (args->sigAlgo == falcon_level5_sa_algo) { + if (ssl->options.peerSigAlgo == falcon_level5_sa_algo) { WOLFSSL_MSG("Peer sent Falcon Level 5 sig"); validSigAlgo = (ssl->peerFalconKey != NULL) && ssl->peerFalconKeyPresent; } - if (args->sigAlgo == dilithium_level2_sa_algo) { + #endif + #ifdef HAVE_DILITHIUM + if (ssl->options.peerSigAlgo == dilithium_level2_sa_algo) { WOLFSSL_MSG("Peer sent Dilithium Level 2 sig"); validSigAlgo = (ssl->peerDilithiumKey != NULL) && ssl->peerDilithiumKeyPresent; } - if (args->sigAlgo == dilithium_level3_sa_algo) { + if (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) { WOLFSSL_MSG("Peer sent Dilithium Level 3 sig"); validSigAlgo = (ssl->peerDilithiumKey != NULL) && ssl->peerDilithiumKeyPresent; } - if (args->sigAlgo == dilithium_level5_sa_algo) { + if (ssl->options.peerSigAlgo == dilithium_level5_sa_algo) { WOLFSSL_MSG("Peer sent Dilithium Level 5 sig"); validSigAlgo = (ssl->peerDilithiumKey != NULL) && ssl->peerDilithiumKeyPresent; } #endif #ifndef NO_RSA - if (args->sigAlgo == rsa_sa_algo) { + if (ssl->options.peerSigAlgo == rsa_sa_algo) { WOLFSSL_MSG("Peer sent PKCS#1.5 algo - not valid TLS 1.3"); ERROR_OUT(INVALID_PARAMETER, exit_dcv); } - if (args->sigAlgo == rsa_pss_sa_algo) { + if (ssl->options.peerSigAlgo == rsa_pss_sa_algo) { WOLFSSL_MSG("Peer sent RSA sig"); validSigAlgo = (ssl->peerRsaKey != NULL) && ssl->peerRsaKeyPresent; @@ -8958,90 +10111,116 @@ ERROR_OUT(SIG_VERIFY_E, exit_dcv); } - sig->buffer = (byte*)XMALLOC(args->sz, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); - if (sig->buffer == NULL) { - ERROR_OUT(MEMORY_E, exit_dcv); - } - sig->length = args->sz; - XMEMCPY(sig->buffer, input + args->idx, args->sz); - - #ifdef HAVE_ECC - if (ssl->peerEccDsaKeyPresent) { - WOLFSSL_MSG("Doing ECC peer cert verify"); - - args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); - if (args->sigData == NULL) { - ERROR_OUT(MEMORY_E, exit_dcv); + args->sigSz = args->sz; +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + /* In case we received two signatures, both of them are encoded + * with their size as 16-bit integeter prior in memory. Hence, + * we can decode both lengths here now. */ + word32 tmpIdx = args->idx; + word16 tmpSz = 0; + ato16(input + tmpIdx, &tmpSz); + args->sigSz = tmpSz; + + tmpIdx += OPAQUE16_LEN + args->sigSz; + ato16(input + tmpIdx, &tmpSz); + args->altSignatureSz = tmpSz; + + if (args->sz != (args->sigSz + args->altSignatureSz + + OPAQUE16_LEN + OPAQUE16_LEN)) { + ERROR_OUT(BUFFER_ERROR, exit_dcv); } - - ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 1); - if (ret != 0) - goto exit_dcv; - ret = CreateECCEncodedSig(args->sigData, - args->sigDataSz, args->hashAlgo); - if (ret < 0) - goto exit_dcv; - args->sigDataSz = (word16)ret; - ret = 0; } - #endif - #ifdef HAVE_ED25519 - if (ssl->peerEd25519KeyPresent) { - WOLFSSL_MSG("Doing ED25519 peer cert verify"); +#endif /* WOLFSSL_DUAL_ALG_CERTS */ - args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); - if (args->sigData == NULL) { - ERROR_OUT(MEMORY_E, exit_dcv); + #if !defined(NO_RSA) && defined(WC_RSA_PSS) + /* In case we have to verify an RSA signature, we have to store the + * signature in the 'rsaSigBuf' structure for further processing. + */ + if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) { + word32 sigSz = args->sigSz; + sig = input + args->idx; + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* Check if our alternative signature was RSA */ + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + if (ssl->options.peerSigAlgo != rsa_pss_sa_algo) { + /* We have to skip the first signature (length field + * and signature itself) and the length field of the + * alternative signature. */ + sig += OPAQUE16_LEN + OPAQUE16_LEN + args->sigSz; + sigSz = args->altSignatureSz; + } + else { + /* We have to skip the length field */ + sig += OPAQUE16_LEN; + } } - - CreateSigData(ssl, args->sigData, &args->sigDataSz, 1); - ret = 0; - } - #endif - #ifdef HAVE_ED448 - if (ssl->peerEd448KeyPresent) { - WOLFSSL_MSG("Doing ED448 peer cert verify"); - - args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); - if (args->sigData == NULL) { + #endif + rsaSigBuf->buffer = (byte*)XMALLOC(sigSz, ssl->heap, + DYNAMIC_TYPE_SIGNATURE); + if (rsaSigBuf->buffer == NULL) { ERROR_OUT(MEMORY_E, exit_dcv); } + rsaSigBuf->length = sigSz; + XMEMCPY(rsaSigBuf->buffer, sig, rsaSigBuf->length); + } + #endif /* !NO_RSA && WC_RSA_PSS */ - CreateSigData(ssl, args->sigData, &args->sigDataSz, 1); - ret = 0; + args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, + DYNAMIC_TYPE_SIGNATURE); + if (args->sigData == NULL) { + ERROR_OUT(MEMORY_E, exit_dcv); } - #endif - #ifdef HAVE_PQC - if (ssl->peerFalconKeyPresent) { - WOLFSSL_MSG("Doing Falcon peer cert verify"); - args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, + ret = CreateSigData(ssl, args->sigData, &args->sigDataSz, 1); + if (ret < 0) + goto exit_dcv; + + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ssl->sigSpec != NULL) && + (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH)) { + args->altSigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, DYNAMIC_TYPE_SIGNATURE); - if (args->sigData == NULL) { + if (args->altSigData == NULL) { ERROR_OUT(MEMORY_E, exit_dcv); } - - CreateSigData(ssl, args->sigData, &args->sigDataSz, 1); - ret = 0; + XMEMCPY(args->altSigData, args->sigData, args->sigDataSz); + args->altSigDataSz = args->sigDataSz; } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ - if (ssl->peerDilithiumKeyPresent) { - WOLFSSL_MSG("Doing Dilithium peer cert verify"); - - args->sigData = (byte*)XMALLOC(MAX_SIG_DATA_SZ, ssl->heap, - DYNAMIC_TYPE_SIGNATURE); - if (args->sigData == NULL) { - ERROR_OUT(MEMORY_E, exit_dcv); + #ifdef HAVE_ECC + if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) && + (ssl->peerEccDsaKeyPresent)) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->options.peerSigAlgo != sm2_sa_algo) + #endif + { + ret = CreateECCEncodedSig(args->sigData, + args->sigDataSz, ssl->options.peerHashAlgo); + if (ret < 0) + goto exit_dcv; + args->sigDataSz = (word16)ret; + ret = 0; } + } - CreateSigData(ssl, args->sigData, &args->sigDataSz, 1); - ret = 0; + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ssl->sigSpec != NULL) && + (*ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) && + (args->altSigAlgo == ecc_dsa_sa_algo) && + (ssl->peerEccDsaKeyPresent)) { + ret = CreateECCEncodedSig(args->altSigData, + args->altSigDataSz, ssl->options.peerHashAlgo); + if (ret < 0) + goto exit_dcv; + args->altSigDataSz = (word16)ret; + ret = 0; } - #endif + #endif /* WOLFSSL_DUAL_ALG_CERTS */ + #endif /* HAVE_ECC */ /* Advance state and proceed */ ssl->options.asyncState = TLS_ASYNC_DO; @@ -9050,46 +10229,77 @@ case TLS_ASYNC_DO: { + sig = input + args->idx; + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + /* As we have two signatures in the message, we stored + * the length of each before the actual signature. This + * is necessary, as we could have two algorithms with + * variable length signatures. */ + sig += OPAQUE16_LEN; + } + #endif #ifndef NO_RSA - if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) { - ret = RsaVerify(ssl, sig->buffer, (word32)sig->length, &args->output, - args->sigAlgo, args->hashAlgo, ssl->peerRsaKey, + if ((ssl->options.peerSigAlgo == rsa_pss_sa_algo) && + (ssl->peerRsaKey != NULL) && (ssl->peerRsaKeyPresent != 0)) { + WOLFSSL_MSG("Doing RSA peer cert verify"); + ret = RsaVerify(ssl, rsaSigBuf->buffer, + (word32)rsaSigBuf->length, &args->output, + ssl->options.peerSigAlgo, + ssl->options.peerHashAlgo, ssl->peerRsaKey, #ifdef HAVE_PK_CALLBACKS - &ssl->buffers.peerRsaKey + &ssl->buffers.peerRsaKey #else - NULL + NULL #endif - ); + ); if (ret >= 0) { - args->sendSz = ret; + args->sendSz = (word32)ret; ret = 0; } } #endif /* !NO_RSA */ #ifdef HAVE_ECC - if (ssl->peerEccDsaKeyPresent) { - ret = EccVerify(ssl, input + args->idx, args->sz, - args->sigData, args->sigDataSz, - ssl->peerEccDsaKey, - #ifdef HAVE_PK_CALLBACKS - &ssl->buffers.peerEccDsaKey - #else - NULL - #endif - ); + if ((ssl->options.peerSigAlgo == ecc_dsa_sa_algo) && + (ssl->peerEccDsaKeyPresent)) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (ssl->options.peerSigAlgo == sm2_sa_algo) { + ret = Sm2wSm3Verify(ssl, TLS13_SM2_SIG_ID, + TLS13_SM2_SIG_ID_SZ, sig, args->sigSz, + args->sigData, args->sigDataSz, + ssl->peerEccDsaKey, NULL); + } + else + #endif + { + WOLFSSL_MSG("Doing ECC peer cert verify"); + ret = EccVerify(ssl, sig, args->sigSz, + args->sigData, args->sigDataSz, + ssl->peerEccDsaKey, + #ifdef HAVE_PK_CALLBACKS + &ssl->buffers.peerEccDsaKey + #else + NULL + #endif + ); + } if (ret >= 0) { /* CLIENT/SERVER: data verified with public key from * certificate. */ ssl->options.peerAuthGood = 1; + FreeKey(ssl, DYNAMIC_TYPE_ECC, (void**)&ssl->peerEccDsaKey); ssl->peerEccDsaKeyPresent = 0; } } #endif /* HAVE_ECC */ #ifdef HAVE_ED25519 - if (ssl->peerEd25519KeyPresent) { - ret = Ed25519Verify(ssl, input + args->idx, args->sz, + if ((ssl->options.peerSigAlgo == ed25519_sa_algo) && + (ssl->peerEd25519KeyPresent)) { + WOLFSSL_MSG("Doing ED25519 peer cert verify"); + ret = Ed25519Verify(ssl, sig, args->sigSz, args->sigData, args->sigDataSz, ssl->peerEd25519Key, #ifdef HAVE_PK_CALLBACKS @@ -9097,7 +10307,7 @@ #else NULL #endif - ); + ); if (ret >= 0) { /* CLIENT/SERVER: data verified with public key from @@ -9110,8 +10320,10 @@ } #endif #ifdef HAVE_ED448 - if (ssl->peerEd448KeyPresent) { - ret = Ed448Verify(ssl, input + args->idx, args->sz, + if ((ssl->options.peerSigAlgo == ed448_sa_algo) && + (ssl->peerEd448KeyPresent)) { + WOLFSSL_MSG("Doing ED448 peer cert verify"); + ret = Ed448Verify(ssl, sig, args->sigSz, args->sigData, args->sigDataSz, ssl->peerEd448Key, #ifdef HAVE_PK_CALLBACKS @@ -9131,29 +10343,35 @@ } } #endif - #if defined(HAVE_PQC) && defined(HAVE_FALCON) - if (ssl->peerFalconKeyPresent) { + #if defined(HAVE_FALCON) + if (((ssl->options.peerSigAlgo == falcon_level1_sa_algo) || + (ssl->options.peerSigAlgo == falcon_level5_sa_algo)) && + (ssl->peerFalconKeyPresent)) { int res = 0; WOLFSSL_MSG("Doing Falcon peer cert verify"); - ret = wc_falcon_verify_msg(input + args->idx, args->sz, - args->sigData, args->sigDataSz, - &res, ssl->peerFalconKey); + ret = wc_falcon_verify_msg(sig, args->sigSz, + args->sigData, args->sigDataSz, + &res, ssl->peerFalconKey); if ((ret >= 0) && (res == 1)) { /* CLIENT/SERVER: data verified with public key from * certificate. */ ssl->options.peerAuthGood = 1; + FreeKey(ssl, DYNAMIC_TYPE_FALCON, (void**)&ssl->peerFalconKey); ssl->peerFalconKeyPresent = 0; } } - #endif /* HAVE_PQC && HAVE_FALCON */ - #if defined(HAVE_PQC) && defined(HAVE_DILITHIUM) - if (ssl->peerDilithiumKeyPresent) { + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + if (((ssl->options.peerSigAlgo == dilithium_level2_sa_algo) || + (ssl->options.peerSigAlgo == dilithium_level3_sa_algo) || + (ssl->options.peerSigAlgo == dilithium_level5_sa_algo)) && + (ssl->peerDilithiumKeyPresent)) { int res = 0; WOLFSSL_MSG("Doing Dilithium peer cert verify"); - ret = wc_dilithium_verify_msg(input + args->idx, args->sz, + ret = wc_dilithium_verify_msg(sig, args->sigSz, args->sigData, args->sigDataSz, &res, ssl->peerDilithiumKey); @@ -9161,18 +10379,123 @@ /* CLIENT/SERVER: data verified with public key from * certificate. */ ssl->options.peerAuthGood = 1; + FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM, (void**)&ssl->peerDilithiumKey); ssl->peerDilithiumKeyPresent = 0; } } - #endif /* HAVE_PQC && HAVE_DILITHIUM */ + #endif /* HAVE_DILITHIUM */ /* Check for error */ if (ret != 0) { goto exit_dcv; } + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + /* Move forward to the alternative signature. */ + sig += args->sigSz + OPAQUE16_LEN; + + /* Verify the alternative signature */ + #ifndef NO_RSA + if ((args->altSigAlgo == rsa_pss_sa_algo) && + (ssl->peerRsaKey != NULL) && + (ssl->peerRsaKeyPresent != 0)) { + WOLFSSL_MSG("Doing RSA peer cert alt verify"); + ret = RsaVerify(ssl, rsaSigBuf->buffer, + (word32)rsaSigBuf->length, + &args->output, args->altSigAlgo, + ssl->options.peerHashAlgo, ssl->peerRsaKey, + #ifdef HAVE_PK_CALLBACKS + &ssl->buffers.peerRsaKey + #else + NULL + #endif + ); + if (ret >= 0) { + args->sendSz = ret; + ret = 0; + } + } + #endif /* !NO_RSA */ + #ifdef HAVE_ECC + if ((args->altSigAlgo == ecc_dsa_sa_algo) && + (ssl->peerEccDsaKeyPresent)) { + WOLFSSL_MSG("Doing ECC peer cert alt verify"); + ret = EccVerify(ssl, sig, args->altSignatureSz, + args->altSigData, args->altSigDataSz, + ssl->peerEccDsaKey, + #ifdef HAVE_PK_CALLBACKS + &ssl->buffers.peerEccDsaKey + #else + NULL + #endif + ); + + if (ret >= 0) { + /* CLIENT/SERVER: data verified with public key from + * certificate. */ + args->altPeerAuthGood = 1; + + FreeKey(ssl, DYNAMIC_TYPE_ECC, + (void**)&ssl->peerEccDsaKey); + ssl->peerEccDsaKeyPresent = 0; + } + } + #endif /* HAVE_ECC */ + #if defined(HAVE_FALCON) + if (((args->altSigAlgo == falcon_level1_sa_algo) || + (args->altSigAlgo == falcon_level5_sa_algo)) && + (ssl->peerFalconKeyPresent)) { + int res = 0; + WOLFSSL_MSG("Doing Falcon peer cert alt verify"); + ret = wc_falcon_verify_msg(sig, args->altSignatureSz, + args->altSigData, args->altSigDataSz, + &res, ssl->peerFalconKey); + + if ((ret >= 0) && (res == 1)) { + /* CLIENT/SERVER: data verified with public key from + * certificate. */ + args->altPeerAuthGood = 1; + + FreeKey(ssl, DYNAMIC_TYPE_FALCON, + (void**)&ssl->peerFalconKey); + ssl->peerFalconKeyPresent = 0; + } + } + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + if (((args->altSigAlgo == dilithium_level2_sa_algo) || + (args->altSigAlgo == dilithium_level3_sa_algo) || + (args->altSigAlgo == dilithium_level5_sa_algo)) && + (ssl->peerDilithiumKeyPresent)) { + int res = 0; + WOLFSSL_MSG("Doing Dilithium peer cert alt verify"); + ret = wc_dilithium_verify_msg(sig, args->altSignatureSz, + args->altSigData, args->altSigDataSz, + &res, ssl->peerDilithiumKey); + + if ((ret >= 0) && (res == 1)) { + /* CLIENT/SERVER: data verified with public key from + * certificate. */ + args->altPeerAuthGood = 1; + + FreeKey(ssl, DYNAMIC_TYPE_DILITHIUM, + (void**)&ssl->peerDilithiumKey); + ssl->peerDilithiumKeyPresent = 0; + } + } + #endif /* HAVE_DILITHIUM */ + + /* Check for error */ + if (ret != 0) { + goto exit_dcv; + } + } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Advance state and proceed */ ssl->options.asyncState = TLS_ASYNC_VERIFY; } /* case TLS_ASYNC_DO */ @@ -9182,8 +10505,17 @@ { #if !defined(NO_RSA) && defined(WC_RSA_PSS) if (ssl->peerRsaKey != NULL && ssl->peerRsaKeyPresent != 0) { - ret = CheckRSASignature(ssl, args->sigAlgo, args->hashAlgo, - args->output, args->sendSz); + int sigAlgo = ssl->options.peerSigAlgo; + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* Check if our alternative signature was RSA */ + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH && + ssl->options.peerSigAlgo != rsa_pss_sa_algo) { + sigAlgo = args->altSigAlgo; + } + #endif + ret = CheckRSASignature(ssl, sigAlgo, + ssl->options.peerHashAlgo, args->output, args->sendSz); if (ret != 0) goto exit_dcv; @@ -9191,7 +10523,16 @@ * certificate. */ ssl->peerRsaKeyPresent = 0; FreeKey(ssl, DYNAMIC_TYPE_RSA, (void**)&ssl->peerRsaKey); - ssl->options.peerAuthGood = 1; + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* Check if our alternative signature was RSA */ + if (ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH && + ssl->options.peerSigAlgo != rsa_pss_sa_algo) { + args->altPeerAuthGood = 1; + } + else + #endif + ssl->options.peerAuthGood = 1; } #endif /* !NO_RSA && WC_RSA_PSS */ @@ -9202,6 +10543,13 @@ case TLS_ASYNC_FINALIZE: { +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ssl->options.peerAuthGood && + ssl->sigSpec != NULL && + *ssl->sigSpec == WOLFSSL_CKS_SIGSPEC_BOTH) { + ssl->options.peerAuthGood = args->altPeerAuthGood; + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ ssl->options.havePeerVerify = 1; /* Set final index */ @@ -9237,7 +10585,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* Handle async operation */ - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Mark message as not received so it can process again */ ssl->msgsReceived.got_certificate_verify = 0; @@ -9248,7 +10596,7 @@ if (ret != 0) { WOLFSSL_ERROR_VERBOSE(ret); - if (ret != INVALID_PARAMETER) { + if (ret != WC_NO_ERR_TRACE(INVALID_PARAMETER)) { SendAlert(ssl, alert_fatal, decrypt_error); } } @@ -9322,11 +10670,11 @@ ssl->options.serverState = SERVER_FINISHED_COMPLETE; return ret; } - if (ret == VERIFY_FINISHED_ERROR) { + if (ret == WC_NO_ERR_TRACE(VERIFY_FINISHED_ERROR)) { SendAlert(ssl, alert_fatal, decrypt_error); return ret; } - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { /* other errors */ return ret; } @@ -9389,7 +10737,8 @@ if (sniff == NO_SNIFF) { /* Actually check verify data. */ - if (XMEMCMP(input + *inOutIdx, mac, size) != 0){ + if (size > WC_MAX_DIGEST_SIZE || + XMEMCMP(input + *inOutIdx, mac, size) != 0){ WOLFSSL_MSG("Verify finished error on hashes"); SendAlert(ssl, alert_fatal, decrypt_error); WOLFSSL_ERROR_VERBOSE(VERIFY_FINISHED_ERROR); @@ -9493,12 +10842,12 @@ input = output + Dtls13GetRlHeaderLength(ssl, 1); #endif /* WOLFSSL_DTLS13 */ - AddTls13HandShakeHeader(input, finishedSz, 0, finishedSz, finished, ssl); + AddTls13HandShakeHeader(input, (word32)finishedSz, 0, finishedSz, finished, ssl); #if defined(WOLFSSL_RENESAS_TSIP_TLS) if (ssl->options.side == WOLFSSL_CLIENT_END) { ret = tsip_Tls13SendFinished(ssl, output, outputSz, input, 1); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { return ret; } ret = 0; @@ -9925,7 +11274,7 @@ WOLFSSL_ENTER("SendTls13EndOfEarlyData"); length = 0; - sendSz = idx + length + MAX_MSG_EXTRA; + sendSz = (int)(idx + length + MAX_MSG_EXTRA); ssl->options.buildingMsg = 1; /* Check buffers are big enough and grow if needed. */ @@ -9953,6 +11302,8 @@ if (!ssl->options.groupMessages) ret = SendBuffered(ssl); + ssl->earlyData = done_early_data; + WOLFSSL_LEAVE("SendTls13EndOfEarlyData", ret); WOLFSSL_END(WC_FUNC_END_OF_EARLY_DATA_SEND); @@ -10221,6 +11572,13 @@ return ret; break; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + ret = wc_Sm3Copy(&ssl->hsHashes->hashSm3, &digest.sm3); + if (ret != 0) + return ret; + break; + #endif } /* Generate the Client's Finished message and hash it. */ @@ -10274,6 +11632,15 @@ return ret; break; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + wc_Sm3Free(&ssl->hsHashes->hashSm3); + ret = wc_Sm3Copy(&digest.sm3, &ssl->hsHashes->hashSm3); + wc_Sm3Free(&digest.sm3); + if (ret != 0) + return ret; + break; + #endif } return ret; @@ -10317,15 +11684,30 @@ } else #ifdef WOLFSSL_ASYNC_CRYPT - if (ssl->error != WC_PENDING_E) + if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { ssl->session->ticketNonce.data[0]++; } + if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) != 0) { + /* In this case we only send the ID as the ticket. Let's generate a new + * ID for the new ticket so that we don't overwrite any old ones */ + ret = wc_RNG_GenerateBlock(ssl->rng, ssl->session->altSessionID, + ID_LEN); + if (ret != 0) + return ret; + ssl->session->haveAltSessionID = 1; + } + if (!ssl->options.noTicketTls13) { - if ((ret = CreateTicket(ssl)) != 0) + if ((ret = SetupTicket(ssl)) != 0) return ret; + /* No need to create the ticket if we only send the ID */ + if ((ssl->options.mask & WOLFSSL_OP_NO_TICKET) == 0) { + if ((ret = CreateTicket(ssl)) != 0) + return ret; + } } #ifdef WOLFSSL_EARLY_DATA @@ -10348,7 +11730,7 @@ /* Nonce */ length += TICKET_NONCE_LEN_SZ + DEF_TICKET_NONCE_SZ; - sendSz = idx + length + MAX_MSG_EXTRA; + sendSz = (int)(idx + length + MAX_MSG_EXTRA); /* Check buffers are big enough and grow if needed. */ if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) @@ -10384,7 +11766,7 @@ if (ssl->session->haveAltSessionID) XMEMCPY(output + idx, ssl->session->altSessionID, ID_LEN); else - XMEMCPY(output + idx, ssl->session->sessionID, ID_LEN); + return BAD_FUNC_ARG; /* Should not happen */ idx += ID_LEN; } else { @@ -10982,7 +12364,7 @@ /* sanity check msg received */ if ((ret = SanityCheckTls13MsgReceived(ssl, type)) != 0) { WOLFSSL_MSG("Sanity Check on handshake message type received failed"); - if (ret == VERSION_ERROR) + if (ret == WC_NO_ERR_TRACE(VERSION_ERROR)) SendAlert(ssl, alert_fatal, wolfssl_alert_protocol_version); else SendAlert(ssl, alert_fatal, unexpected_message); @@ -11090,7 +12472,8 @@ #endif ) { #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_NONBLOCK_OCSP) - if (ret != WC_PENDING_E && ret != OCSP_WANT_READ) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E) && + ret != WC_NO_ERR_TRACE(OCSP_WANT_READ)) #endif { ssl->options.cacheMessages = 0; @@ -11147,7 +12530,7 @@ #endif #if !defined(NO_RSA) || defined(HAVE_ECC) || defined(HAVE_ED25519) || \ - defined(HAVE_ED448) || defined(HAVE_PQC) + defined(HAVE_ED448) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) case certificate_verify: WOLFSSL_MSG("processing certificate verify"); ret = DoTls13CertificateVerify(ssl, input, inOutIdx, size); @@ -11179,21 +12562,24 @@ #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_ASYNC_IO) /* if async, offset index so this msg will be processed again */ /* NOTE: check this now before other calls can overwrite ret */ - if ((ret == WC_PENDING_E || ret == OCSP_WANT_READ) && *inOutIdx > 0) { + if ((ret == WC_NO_ERR_TRACE(WC_PENDING_E) || + ret == WC_NO_ERR_TRACE(OCSP_WANT_READ)) && *inOutIdx > 0) { /* DTLS always stores a message in a buffer when async is enable, so we * don't need to adjust for the extra bytes here (*inOutIdx is always * == 0) */ *inOutIdx -= HANDSHAKE_HEADER_SZ; } -#endif - /* reset error */ - if (ret == 0 && ssl->error == WC_PENDING_E) + /* make sure async error is cleared */ + if (ret == 0 && + (ssl->error == WC_NO_ERR_TRACE(WC_PENDING_E) || + ssl->error == WC_NO_ERR_TRACE(OCSP_WANT_READ))) { ssl->error = 0; - + } +#endif if (ret == 0 && type != client_hello && type != session_ticket && type != key_update) { - ret = HashInput(ssl, input + inIdx, size); + ret = HashInput(ssl, input + inIdx, (int)size); } alertType = TranslateErrorToAlert(ret); @@ -11206,7 +12592,7 @@ tmp = SendAlert(ssl, alert_fatal, alertType); /* propagate socket error instead of tls error to be sure the error is * not ignored by DTLS code */ - if (tmp == SOCKET_ERROR_E) + if (tmp == WC_NO_ERR_TRACE(SOCKET_ERROR_E)) ret = SOCKET_ERROR_E; } @@ -11303,7 +12689,7 @@ if (wolfSSL_connect_TLSv13(ssl) != WOLFSSL_SUCCESS) { ret = ssl->error; - if (ret != WC_PENDING_E) + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) ret = POST_HAND_AUTH_ERROR; } } @@ -11355,8 +12741,6 @@ WOLFSSL_ENTER("DoTls13HandShakeMsg"); if (ssl->arrays == NULL) { - - if (GetHandshakeHeader(ssl, input, inOutIdx, &type, &size, totalSz) != 0) { SendAlert(ssl, alert_fatal, unexpected_message); @@ -11364,6 +12748,12 @@ return PARSE_ERROR; } + ret = EarlySanityCheckMsgReceived(ssl, type, size); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + return DoTls13HandShakeMsgType(ssl, input, inOutIdx, type, size, totalSz); } @@ -11380,6 +12770,13 @@ return PARSE_ERROR; } + ret = EarlySanityCheckMsgReceived(ssl, type, + min(inputLength - HANDSHAKE_HEADER_SZ, size)); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + /* Cap the maximum size of a handshake message to something reasonable. * By default is the maximum size of a certificate message assuming * nine 2048-bit RSA certificates in the chain. */ @@ -11415,6 +12812,14 @@ inputLength = ssl->arrays->pendingMsgSz - ssl->arrays->pendingMsgOffset; } + + ret = EarlySanityCheckMsgReceived(ssl, ssl->arrays->pendingMsgType, + inputLength); + if (ret != 0) { + WOLFSSL_ERROR(ret); + return ret; + } + XMEMCPY(ssl->arrays->pendingMsg + ssl->arrays->pendingMsgOffset, input + *inOutIdx, inputLength); ssl->arrays->pendingMsgOffset += inputLength; @@ -11429,7 +12834,7 @@ ssl->arrays->pendingMsgSz - HANDSHAKE_HEADER_SZ, ssl->arrays->pendingMsgSz); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* setup to process fragment again */ ssl->arrays->pendingMsgOffset -= inputLength; *inOutIdx -= inputLength + ssl->keys.padSz; @@ -11530,7 +12935,7 @@ && ssl->error != WC_PENDING_E #endif ) { - if ((ssl->error = SendBuffered(ssl)) == 0) { + if ((ret = SendBuffered(ssl)) == 0) { if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) { if (advanceState) { #ifdef WOLFSSL_DTLS13 @@ -11602,7 +13007,7 @@ } ssl->options.connectState = CLIENT_HELLO_SENT; - WOLFSSL_MSG("connect state: CLIENT_HELLO_SENT"); + WOLFSSL_MSG("TLSv13 connect state: CLIENT_HELLO_SENT"); #ifdef WOLFSSL_EARLY_DATA if (ssl->earlyData != no_early_data) { #if defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) @@ -11623,7 +13028,7 @@ case CLIENT_HELLO_SENT: /* Get the response/s from the server. */ while (ssl->options.serverState < - SERVER_HELLO_RETRY_REQUEST_COMPLETE) { + SERVER_HELLOVERIFYREQUEST_COMPLETE) { if ((ssl->error = ProcessReply(ssl)) < 0) { WOLFSSL_ERROR(ssl->error); return WOLFSSL_FATAL_ERROR; @@ -11762,8 +13167,8 @@ case FIRST_REPLY_THIRD: #if (!defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \ defined(HAVE_ED25519) || defined(HAVE_ED448) || \ - defined(HAVE_PQC))) && (!defined(NO_WOLFSSL_SERVER) || \ - !defined(WOLFSSL_NO_CLIENT_AUTH)) + defined(HAVE_FALCON) || defined(HAVE_DILITHIUM))) && \ + (!defined(NO_WOLFSSL_SERVER) || !defined(WOLFSSL_NO_CLIENT_AUTH)) if (!ssl->options.resuming && ssl->options.sendVerify) { ssl->error = SendTls13CertificateVerify(ssl); if (ssl->error != 0) { @@ -11974,14 +13379,14 @@ #ifdef WOLFSSL_ASYNC_CRYPT ret = wolfSSL_AsyncPop(ssl, NULL); - if (ret != WC_NOT_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_NO_PENDING_E)) { /* Check for error */ if (ret < 0) return ret; } #endif -#ifdef HAVE_PQC +#if defined(WOLFSSL_HAVE_KYBER) if (WOLFSSL_NAMED_GROUP_IS_PQC(group)) { if (ssl->ctx != NULL && ssl->ctx->method != NULL && @@ -11990,10 +13395,11 @@ } if (ssl->options.side == WOLFSSL_SERVER_END) { - /* If I am the server of a KEM connection, do not do keygen because I'm - * going to encapsulate with the client's public key. Note that I might - * be the client and ssl->option.side has not been properly set yet. In - * that case the KeyGen operation will be deferred to connection time. */ + /* If I am the server of a KEM connection, do not do keygen because + * I'm going to encapsulate with the client's public key. Note that + * I might be the client and ssl->option.side has not been properly + * set yet. In that case the KeyGen operation will be deferred to + * connection time. */ return WOLFSSL_SUCCESS; } } @@ -12033,6 +13439,30 @@ } #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wolfSSL_UseCKS(WOLFSSL* ssl, byte *sigSpec, word16 sigSpecSz) +{ + if (ssl == NULL || !IsAtLeastTLSv1_3(ssl->ctx->method->version) || + sigSpec == NULL || sigSpecSz == 0) + return BAD_FUNC_ARG; + + ssl->sigSpec = sigSpec; + ssl->sigSpecSz = sigSpecSz; + return WOLFSSL_SUCCESS; +} + +int wolfSSL_CTX_UseCKS(WOLFSSL_CTX* ctx, byte *sigSpec, word16 sigSpecSz) +{ + if (ctx == NULL || !IsAtLeastTLSv1_3(ctx->method->version) || + sigSpec == NULL || sigSpecSz == 0) + return BAD_FUNC_ARG; + + ctx->sigSpec = sigSpec; + ctx->sigSpecSz = sigSpecSz; + return WOLFSSL_SUCCESS; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Do not send a ticket after TLS v1.3 handshake for resumption. * * ctx The SSL/TLS CTX object. @@ -12319,86 +13749,6 @@ } #endif -#if defined(HAVE_SUPPORTED_CURVES) -/* Sets the key exchange groups in rank order on a context. - * - * ctx SSL/TLS context object. - * groups Array of groups. - * count Number of groups in array. - * returns BAD_FUNC_ARG when ctx or groups is NULL, not using TLS v1.3 or - * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success. - */ -int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, int count) -{ - int ret, i; - - WOLFSSL_ENTER("wolfSSL_CTX_set_groups"); - if (ctx == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT) - return BAD_FUNC_ARG; - if (!IsAtLeastTLSv1_3(ctx->method->version)) - return BAD_FUNC_ARG; - - ctx->numGroups = 0; - #if !defined(NO_TLS) - TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap); - #endif /* !NO_TLS */ - for (i = 0; i < count; i++) { - /* Call to wolfSSL_CTX_UseSupportedCurve also checks if input groups - * are valid */ - if ((ret = wolfSSL_CTX_UseSupportedCurve(ctx, (word16)groups[i])) - != WOLFSSL_SUCCESS) { - #if !defined(NO_TLS) - TLSX_Remove(&ctx->extensions, TLSX_SUPPORTED_GROUPS, ctx->heap); - #endif /* !NO_TLS */ - return ret; - } - ctx->group[i] = (word16)groups[i]; - } - ctx->numGroups = (byte)count; - - return WOLFSSL_SUCCESS; -} - -/* Sets the key exchange groups in rank order. - * - * ssl SSL/TLS object. - * groups Array of groups. - * count Number of groups in array. - * returns BAD_FUNC_ARG when ssl or groups is NULL, not using TLS v1.3 or - * count is greater than WOLFSSL_MAX_GROUP_COUNT and WOLFSSL_SUCCESS on success. - */ -int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count) -{ - int ret, i; - - WOLFSSL_ENTER("wolfSSL_set_groups"); - if (ssl == NULL || groups == NULL || count > WOLFSSL_MAX_GROUP_COUNT) - return BAD_FUNC_ARG; - if (!IsAtLeastTLSv1_3(ssl->version)) - return BAD_FUNC_ARG; - - ssl->numGroups = 0; - #if !defined(NO_TLS) - TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap); - #endif /* !NO_TLS */ - for (i = 0; i < count; i++) { - /* Call to wolfSSL_UseSupportedCurve also checks if input groups - * are valid */ - if ((ret = wolfSSL_UseSupportedCurve(ssl, (word16)groups[i])) - != WOLFSSL_SUCCESS) { - #if !defined(NO_TLS) - TLSX_Remove(&ssl->extensions, TLSX_SUPPORTED_GROUPS, ssl->heap); - #endif /* !NO_TLS */ - return ret; - } - ssl->group[i] = (word16)groups[i]; - } - ssl->numGroups = (byte)count; - - return WOLFSSL_SUCCESS; -} -#endif /* HAVE_SUPPORTED_CURVES */ - #ifndef NO_PSK /* Set the PSK callback, that is passed the cipher suite, for a client to use * against context object. @@ -12450,7 +13800,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); + ssl->options.useAnon, TRUE, ssl->options.side); } /* Set the PSK callback that returns the cipher suite for a client to use @@ -12503,7 +13853,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); + ssl->options.useAnon, TRUE, ssl->options.side); } /* Set the PSK callback that returns the cipher suite for a server to use @@ -12553,7 +13903,7 @@ ssl->options.haveDH, ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE, ssl->options.haveStaticECC, ssl->options.haveFalconSig, ssl->options.haveDilithiumSig, - ssl->options.haveAnon, TRUE, ssl->options.side); + ssl->options.useAnon, TRUE, ssl->options.side); } /* Get name of first supported cipher suite that uses the hash indicated. @@ -12739,7 +14089,8 @@ && !ssl->dtls13SendingAckOrRtx; #endif /* WOLFSSL_DTLS13 */ - if ((ssl->error = SendBuffered(ssl)) == 0) { + ret = SendBuffered(ssl); + if (ret == 0) { if (ssl->fragOffset == 0 && !ssl->options.buildingMsg) { if (advanceState) { ssl->options.acceptState++; @@ -12876,17 +14227,6 @@ case TLS13_ACCEPT_SECOND_REPLY_DONE : -#ifdef WOLFSSL_DTLS - if (ssl->chGoodCb != NULL) { - int cbret = ssl->chGoodCb(ssl, ssl->chGoodCtx); - if (cbret < 0) { - ssl->error = cbret; - WOLFSSL_MSG("ClientHello Good Cb don't continue error"); - return WOLFSSL_FATAL_ERROR; - } - } -#endif - if ((ssl->error = SendTls13ServerHello(ssl, server_hello)) != 0) { WOLFSSL_ERROR(ssl->error); return WOLFSSL_FATAL_ERROR; @@ -12970,7 +14310,8 @@ case TLS13_CERT_SENT : #if !defined(NO_CERTS) && (!defined(NO_RSA) || defined(HAVE_ECC) || \ - defined(HAVE_ED25519) || defined(HAVE_ED448) || defined(HAVE_PQC)) + defined(HAVE_ED25519) || defined(HAVE_ED448) || defined(HAVE_FALCON) || \ + defined(HAVE_DILITHIUM)) if (!ssl->options.resuming && ssl->options.sendVerify) { if ((ssl->error = SendTls13CertificateVerify(ssl)) != 0) { WOLFSSL_ERROR(ssl->error); @@ -13254,7 +14595,7 @@ return SIDE_ERROR; if (ssl->options.handShakeState == NULL_STATE) { - if (ssl->error != WC_PENDING_E) + if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)) ssl->earlyData = expecting_early_data; ret = wolfSSL_connect_TLSv13(ssl); if (ret != WOLFSSL_SUCCESS) @@ -13312,12 +14653,13 @@ if (!IsAtLeastTLSv1_3(ssl->version)) return BAD_FUNC_ARG; + *outSz = 0; #ifndef NO_WOLFSSL_SERVER if (ssl->options.side == WOLFSSL_CLIENT_END) return SIDE_ERROR; if (ssl->options.handShakeState == NULL_STATE) { - if (ssl->error != WC_PENDING_E) + if (ssl->error != WC_NO_ERR_TRACE(WC_PENDING_E)) ssl->earlyData = expecting_early_data; /* this used to be: ret = wolfSSL_accept_TLSv13(ssl); * However, wolfSSL_accept_TLSv13() expects a certificate to @@ -13387,6 +14729,80 @@ return WOLFSSL_SUCCESS; } + +#if defined(SHOW_SECRETS) && defined(WOLFSSL_SSLKEYLOGFILE) +int tls13ShowSecrets(WOLFSSL* ssl, int id, const unsigned char* secret, + int secretSz, void* ctx) +{ + int i; + const char* str = NULL; + byte clientRandom[RAN_LEN]; + int clientRandomSz; + XFILE fp; + + (void) ctx; +#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT + fp = XFOPEN(WOLFSSL_SSLKEYLOGFILE_OUTPUT, "ab"); + if (fp == XBADFILE) { + return BAD_FUNC_ARG; + } +#else + fp = stderr; +#endif + + clientRandomSz = (int)wolfSSL_get_client_random(ssl, clientRandom, + sizeof(clientRandom)); + + if (clientRandomSz <= 0) { + printf("Error getting server random %d\n", clientRandomSz); + return BAD_FUNC_ARG; + } + +#if 0 + printf("TLS Server Secret CB: Rand %d, Secret %d\n", + serverRandomSz, secretSz); +#endif + + switch (id) { + case CLIENT_EARLY_TRAFFIC_SECRET: + str = "CLIENT_EARLY_TRAFFIC_SECRET"; break; + case EARLY_EXPORTER_SECRET: + str = "EARLY_EXPORTER_SECRET"; break; + case CLIENT_HANDSHAKE_TRAFFIC_SECRET: + str = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"; break; + case SERVER_HANDSHAKE_TRAFFIC_SECRET: + str = "SERVER_HANDSHAKE_TRAFFIC_SECRET"; break; + case CLIENT_TRAFFIC_SECRET: + str = "CLIENT_TRAFFIC_SECRET_0"; break; + case SERVER_TRAFFIC_SECRET: + str = "SERVER_TRAFFIC_SECRET_0"; break; + case EXPORTER_SECRET: + str = "EXPORTER_SECRET"; break; + default: +#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT + XFCLOSE(fp); +#endif + return BAD_FUNC_ARG; + break; + } + + fprintf(fp, "%s ", str); + for (i = 0; i < (int)clientRandomSz; i++) { + fprintf(fp, "%02x", clientRandom[i]); + } + fprintf(fp, " "); + for (i = 0; i < secretSz; i++) { + fprintf(fp, "%02x", secret[i]); + } + fprintf(fp, "\n"); + +#ifdef WOLFSSL_SSLKEYLOGFILE_OUTPUT + XFCLOSE(fp); +#endif + + return 0; +} +#endif #endif #undef ERROR_OUT diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/wolfio.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/wolfio.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/wolfio.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/wolfio.c 2024-08-03 07:30:00.000000000 +0000 @@ -20,6 +20,9 @@ */ +#ifndef WOLFSSL_STRERROR_BUFFER_SIZE +#define WOLFSSL_STRERROR_BUFFER_SIZE 256 +#endif #ifdef HAVE_CONFIG_H #include @@ -38,6 +41,60 @@ #include #include +#if defined(USE_WOLFSSL_IO) || defined(HAVE_HTTP_CLIENT) + #ifndef USE_WINDOWS_API + #if defined(WOLFSSL_LWIP) && !defined(WOLFSSL_APACHE_MYNEWT) + #elif defined(ARDUINO) + #elif defined(FREESCALE_MQX) + #elif defined(FREESCALE_KSDK_MQX) + #elif (defined(WOLFSSL_MDK_ARM) || defined(WOLFSSL_KEIL_TCP_NET)) + #elif defined(WOLFSSL_CMSIS_RTOS) + #elif defined(WOLFSSL_CMSIS_RTOSv2) + #elif defined(WOLFSSL_TIRTOS) + #elif defined(FREERTOS_TCP) + #elif defined(WOLFSSL_IAR_ARM) + #elif defined(HAVE_NETX_BSD) + #elif defined(WOLFSSL_VXWORKS) + #elif defined(WOLFSSL_NUCLEUS_1_2) + #elif defined(WOLFSSL_LINUXKM) + /* the requisite linux/net.h is included in wc_port.h, with incompatible warnings masked out. */ + #elif defined(WOLFSSL_ATMEL) + #elif defined(INTIME_RTOS) + #include + #elif defined(WOLFSSL_PRCONNECT_PRO) + #include + #include + #elif defined(WOLFSSL_SGX) + #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP) + #elif defined(WOLFSSL_DEOS) + #elif defined(WOLFSSL_ZEPHYR) + #elif defined(MICROCHIP_PIC32) + #elif defined(HAVE_NETX) + #elif defined(FUSION_RTOS) + #elif !defined(WOLFSSL_NO_SOCK) + #if defined(HAVE_RTP_SYS) + #elif defined(EBSNET) + #elif defined(NETOS) + #elif !defined(DEVKITPRO) && !defined(WOLFSSL_PICOTCP) \ + && !defined(WOLFSSL_CONTIKI) && !defined(WOLFSSL_WICED) \ + && !defined(WOLFSSL_GNRC) && !defined(WOLFSSL_RIOT_OS) + #ifdef HAVE_NETDB_H + #include + #endif + #ifdef __PPU + #include + #else + #ifdef HAVE_SYS_IOCTL_H + #include + #endif + #endif + #endif + #endif + + #endif /* USE_WINDOWS_API */ +#endif /* defined(USE_WOLFSSL_IO) || defined(HAVE_HTTP_CLIENT) */ + + #if defined(HAVE_HTTP_CLIENT) #include /* strtol() */ #endif @@ -96,6 +153,11 @@ if (errno == RTCSERR_TCP_TIMED_OUT) errno = SOCKET_EAGAIN; } +#elif defined(WOLFSSL_EMNET) + if (old < 0) { /* SOCKET_ERROR */ + /* Get the real socket error */ + IP_SOCK_getsockopt(sd, SOL_SOCKET, SO_ERROR, &old, (int)sizeof(old)); + } #endif return old; @@ -109,7 +171,7 @@ return WSAGetLastError(); #elif defined(EBSNET) return xn_getlasterror(); -#elif defined(WOLFSSL_LINUXKM) +#elif defined(WOLFSSL_LINUXKM) || defined(WOLFSSL_EMNET) return err; /* Return provided error value */ #elif defined(FUSION_RTOS) #include @@ -121,6 +183,12 @@ static int TranslateIoError(int err) { +#ifdef _WIN32 + size_t errstr_offset; + char errstr[WOLFSSL_STRERROR_BUFFER_SIZE]; +#endif /* _WIN32 */ + + if (err > 0) return err; @@ -151,7 +219,20 @@ return WOLFSSL_CBIO_ERR_CONN_CLOSE; } +#if defined(_WIN32) + strcpy_s(errstr, sizeof(errstr), "\tGeneral error: "); + errstr_offset = strlen(errstr); + FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + err, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)(errstr + errstr_offset), + (DWORD)(sizeof(errstr) - errstr_offset), + NULL); + WOLFSSL_MSG(errstr); +#else WOLFSSL_MSG("\tGeneral error"); +#endif return WOLFSSL_CBIO_ERR_GENERAL; } #endif /* USE_WOLFSSL_IO || HAVE_HTTP_CLIENT */ @@ -396,12 +477,12 @@ static int isDGramSock(int sfd) { - char type = 0; + int type = 0; /* optvalue 'type' is of size int */ - XSOCKLENT length = (XSOCKLENT)sizeof(char); + XSOCKLENT length = (XSOCKLENT)sizeof(type); - if (getsockopt(sfd, SOL_SOCKET, SO_TYPE, &type, &length) == 0 && - type != SOCK_DGRAM) { + if (getsockopt(sfd, SOL_SOCKET, SO_TYPE, (XSOCKOPT_TYPE_OPTVAL_TYPE)&type, + &length) == 0 && type != SOCK_DGRAM) { return 0; } else { @@ -482,7 +563,7 @@ start = LowResTimer(); } else { - dtls_timeout -= LowResTimer() - start; + dtls_timeout -= (int) (LowResTimer() - start); start = LowResTimer(); if (dtls_timeout < 0 || dtls_timeout > DTLS_TIMEOUT_MAX) return WOLFSSL_CBIO_ERR_TIMEOUT; @@ -532,7 +613,7 @@ } #endif /* !NO_ASN_TIME */ - recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, sz, ssl->rflags, + recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, (size_t)sz, ssl->rflags, (SOCKADDR*)peer, peer != NULL ? &peerSz : NULL); /* From the RECV(2) man page @@ -634,13 +715,13 @@ peerSz = dtlsCtx->peer.sz; #ifndef WOLFSSL_IPV6 if (PeerIsIpv6(peer, peerSz)) { - WOLFSSL_MSG("ipv6 dtls peer setted but no ipv6 support compiled"); + WOLFSSL_MSG("ipv6 dtls peer set but no ipv6 support compiled"); return NOT_COMPILED_IN; } #endif } - sent = (int)DTLS_SENDTO_FUNCTION(sd, buf, sz, ssl->wflags, + sent = (int)DTLS_SENDTO_FUNCTION(sd, buf, (size_t)sz, ssl->wflags, (const SOCKADDR*)peer, peerSz); sent = TranslateReturnCode(sent, sd); @@ -667,7 +748,7 @@ WOLFSSL_ENTER("EmbedReceiveFromMcast"); - recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, sz, ssl->rflags, NULL, NULL); + recvd = (int)DTLS_RECVFROM_FUNCTION(sd, buf, (size_t)sz, ssl->rflags, NULL, NULL); recvd = TranslateReturnCode(recvd, sd); @@ -711,7 +792,7 @@ if (sz > WC_SHA256_DIGEST_SIZE) sz = WC_SHA256_DIGEST_SIZE; - XMEMCPY(buf, digest, sz); + XMEMCPY(buf, digest, (size_t)sz); return sz; } @@ -905,7 +986,7 @@ { int recvd; - recvd = (int)RECV_FUNCTION(sd, buf, sz, rdFlags); + recvd = (int)RECV_FUNCTION(sd, buf, (size_t)sz, rdFlags); recvd = TranslateReturnCode(recvd, (int)sd); return recvd; @@ -915,7 +996,7 @@ { int sent; - sent = (int)SEND_FUNCTION(sd, buf, sz, wrFlags); + sent = (int)SEND_FUNCTION(sd, buf, (size_t)sz, wrFlags); sent = TranslateReturnCode(sent, (int)sd); return sent; @@ -1007,9 +1088,9 @@ } #endif /* HAVE_IO_TIMEOUT */ -static int wolfIO_Word16ToString(char* d, word16 number) +static word32 wolfIO_Word16ToString(char* d, word16 number) { - int i = 0; + word32 i = 0; word16 order = 10000; word16 digit; @@ -1024,7 +1105,7 @@ if (i > 0 || digit != 0) d[i++] = (char)digit + '0'; if (digit != 0) - number %= digit * order; + number = (word16) (number % (digit * order)); order = (order > 1) ? order / 10 : 0; } @@ -1039,7 +1120,7 @@ #ifdef HAVE_SOCKADDR int ret = 0; SOCKADDR_S addr; - int sockaddr_len; + socklen_t sockaddr_len; #if defined(HAVE_GETADDRINFO) /* use getaddrinfo */ ADDRINFO hints; @@ -1084,7 +1165,11 @@ /* use gethostbyname for c99 */ #if defined(HAVE_GETADDRINFO) XMEMSET(&hints, 0, sizeof(hints)); +#ifdef WOLFSSL_IPV6 hints.ai_family = AF_UNSPEC; /* detect IPv4 or IPv6 */ +#else + hints.ai_family = AF_INET; /* detect only IPv4 */ +#endif hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; @@ -1099,7 +1184,7 @@ } sockaddr_len = answer->ai_addrlen; - XMEMCPY(&addr, answer->ai_addr, sockaddr_len); + XMEMCPY(&addr, answer->ai_addr, (size_t)sockaddr_len); freeaddrinfo(answer); #elif defined(WOLFSSL_USE_POPEN_HOST) && !defined(WOLFSSL_IPV6) { @@ -1262,7 +1347,7 @@ #ifdef HAVE_SOCKADDR int ret = 0; SOCKADDR_S addr; - int sockaddr_len = sizeof(SOCKADDR_IN); + socklen_t sockaddr_len = sizeof(SOCKADDR_IN); SOCKADDR_IN *sin = (SOCKADDR_IN *)&addr; if (sockfd == NULL || port < 1) { @@ -1383,6 +1468,9 @@ word32 bigPort = 0; i = 0; cur++; + + XMEMSET(port, 0, sizeof(port)); + while (i < 6 && cur < urlSz && url[cur] != 0 && url[cur] != '/') { port[i] = url[cur]; i++; cur++; @@ -1390,7 +1478,7 @@ for (j = 0; j < i; j++) { if (port[j] < '0' || port[j] > '9') return -1; - bigPort = (bigPort * 10) + (port[j] - '0'); + bigPort = (bigPort * 10) + (word32)(port[j] - '0'); } if (outPort) *outPort = (word16)bigPort; @@ -1445,7 +1533,7 @@ return MEMORY_E; } - newRecvBuf = (byte*)XMALLOC(newRecvSz, heap, dynType); + newRecvBuf = (byte*)XMALLOC((size_t)newRecvSz, heap, dynType); if (newRecvBuf == NULL) { WOLFSSL_MSG("wolfIO_HttpProcessResponseBuf malloc failed"); return MEMORY_E; @@ -1453,7 +1541,7 @@ /* if buffer already exists, then we are growing it */ if (*recvBuf) { - XMEMCPY(&newRecvBuf[pos], *recvBuf, *recvBufSz); + XMEMCPY(&newRecvBuf[pos], *recvBuf, (size_t) *recvBufSz); XFREE(*recvBuf, heap, dynType); pos += *recvBufSz; *recvBuf = NULL; @@ -1462,7 +1550,7 @@ /* copy the remainder of the httpBuf into the respBuf */ if (len != 0) { if (pos + len <= newRecvSz) { - XMEMCPY(&newRecvBuf[pos], start, len); + XMEMCPY(&newRecvBuf[pos], start, (size_t)len); pos += len; } else { @@ -1524,6 +1612,11 @@ /* read data if no \r\n or first time */ if ((start == NULL) || (end == NULL)) { + if (httpBufSz < len + 1) { + return BUFFER_ERROR; /* can't happen, but Coverity thinks it + * can. + */ + } result = wolfIO_Recv(sfd, (char*)httpBuf+len, httpBufSz-len-1, 0); if (result > 0) { len += result; @@ -1546,7 +1639,7 @@ /* handle incomplete rx */ if (end == NULL) { if (len != 0) - XMEMMOVE(httpBuf, start, len); + XMEMMOVE(httpBuf, start, (size_t)len); start = end = NULL; } /* when start is "\r\n" */ @@ -1672,7 +1765,7 @@ return wolfIO_HttpBuildRequest_ex(reqType, domainName, path, pathLen, reqSz, contentType, "", buf, bufSize); } - int wolfIO_HttpBuildRequest_ex(const char *reqType, const char *domainName, +int wolfIO_HttpBuildRequest_ex(const char *reqType, const char *domainName, const char *path, int pathLen, int reqSz, const char *contentType, const char *exHdrs, byte *buf, int bufSize) { @@ -1714,7 +1807,7 @@ maxLen = reqTypeLen + blankStrLen + - pathLen + + (word32)pathLen + http11StrLen + hostStrLen + domainNameLen + @@ -1725,46 +1818,46 @@ singleCrLfStrLen + exHdrsLen + doubleCrLfStrLen + - 1 /* null term */; + (word32)1 /* null term */; if (maxLen > (word32)bufSize) return 0; - XSTRNCPY((char*)buf, reqType, bufSize); - buf += reqTypeLen; bufSize -= reqTypeLen; - XSTRNCPY((char*)buf, blankStr, bufSize); - buf += blankStrLen; bufSize -= blankStrLen; - XSTRNCPY((char*)buf, path, bufSize); - buf += pathLen; bufSize -= pathLen; - XSTRNCPY((char*)buf, http11Str, bufSize); - buf += http11StrLen; bufSize -= http11StrLen; + XSTRNCPY((char*)buf, reqType, (size_t)bufSize); + buf += reqTypeLen; bufSize -= (int)reqTypeLen; + XSTRNCPY((char*)buf, blankStr, (size_t)bufSize); + buf += blankStrLen; bufSize -= (int)blankStrLen; + XSTRNCPY((char*)buf, path, (size_t)bufSize); + buf += pathLen; bufSize -= (int)pathLen; + XSTRNCPY((char*)buf, http11Str, (size_t)bufSize); + buf += http11StrLen; bufSize -= (int)http11StrLen; if (domainNameLen > 0) { - XSTRNCPY((char*)buf, hostStr, bufSize); - buf += hostStrLen; bufSize -= hostStrLen; - XSTRNCPY((char*)buf, domainName, bufSize); - buf += domainNameLen; bufSize -= domainNameLen; + XSTRNCPY((char*)buf, hostStr, (size_t)bufSize); + buf += hostStrLen; bufSize -= (int)hostStrLen; + XSTRNCPY((char*)buf, domainName, (size_t)bufSize); + buf += domainNameLen; bufSize -= (int)domainNameLen; } if (reqSz > 0 && reqSzStrLen > 0) { - XSTRNCPY((char*)buf, contentLenStr, bufSize); - buf += contentLenStrLen; bufSize -= contentLenStrLen; - XSTRNCPY((char*)buf, reqSzStr, bufSize); - buf += reqSzStrLen; bufSize -= reqSzStrLen; + XSTRNCPY((char*)buf, contentLenStr, (size_t)bufSize); + buf += contentLenStrLen; bufSize -= (int)contentLenStrLen; + XSTRNCPY((char*)buf, reqSzStr, (size_t)bufSize); + buf += reqSzStrLen; bufSize -= (int)reqSzStrLen; } if (contentTypeLen > 0) { - XSTRNCPY((char*)buf, contentTypeStr, bufSize); - buf += contentTypeStrLen; bufSize -= contentTypeStrLen; - XSTRNCPY((char*)buf, contentType, bufSize); - buf += contentTypeLen; bufSize -= contentTypeLen; + XSTRNCPY((char*)buf, contentTypeStr, (size_t)bufSize); + buf += contentTypeStrLen; bufSize -= (int)contentTypeStrLen; + XSTRNCPY((char*)buf, contentType, (size_t)bufSize); + buf += contentTypeLen; bufSize -= (int)contentTypeLen; } if (exHdrsLen > 0) { - XSTRNCPY((char *)buf, singleCrLfStr, bufSize); + XSTRNCPY((char *)buf, singleCrLfStr, (size_t)bufSize); buf += singleCrLfStrLen; - bufSize -= singleCrLfStrLen; - XSTRNCPY((char *)buf, exHdrs, bufSize); + bufSize -= (int)singleCrLfStrLen; + XSTRNCPY((char *)buf, exHdrs, (size_t)bufSize); buf += exHdrsLen; - bufSize -= exHdrsLen; + bufSize -= (int)exHdrsLen; } - XSTRNCPY((char*)buf, doubleCrLfStr, bufSize); + XSTRNCPY((char*)buf, doubleCrLfStr, (size_t)bufSize); buf += doubleCrLfStrLen; #ifdef WOLFIO_DEBUG @@ -1841,7 +1934,7 @@ /* Note, the library uses the EmbedOcspRespFree() callback to * free this buffer. */ int httpBufSz = HTTP_SCRATCH_BUFFER_SIZE; - byte* httpBuf = (byte*)XMALLOC(httpBufSz, ctx, DYNAMIC_TYPE_OCSP); + byte* httpBuf = (byte*)XMALLOC((size_t)httpBufSz, ctx, DYNAMIC_TYPE_OCSP); if (httpBuf == NULL) { WOLFSSL_MSG("Unable to create OCSP response buffer"); @@ -1948,7 +2041,7 @@ } else { int httpBufSz = HTTP_SCRATCH_BUFFER_SIZE; - byte* httpBuf = (byte*)XMALLOC(httpBufSz, crl->heap, + byte* httpBuf = (byte*)XMALLOC((size_t)httpBufSz, crl->heap, DYNAMIC_TYPE_CRL); if (httpBuf == NULL) { WOLFSSL_MSG("Unable to create CRL response buffer"); @@ -2463,11 +2556,18 @@ /* Micrium DTLS Generate Cookie callback * return : number of bytes copied into buf, or error */ +#if defined(NO_SHA) && !defined(NO_SHA256) + #define MICRIUM_COOKIE_DIGEST_SIZE WC_SHA256_DIGEST_SIZE +#elif !defined(NO_SHA) + #define MICRIUM_COOKIE_DIGEST_SIZE WC_SHA_DIGEST_SIZE +#else + #error Must enable either SHA-1 or SHA256 (or both) for Micrium. +#endif int MicriumGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *ctx) { NET_SOCK_ADDR peer; NET_SOCK_ADDR_LEN peerSz = sizeof(peer); - byte digest[WC_SHA_DIGEST_SIZE]; + byte digest[MICRIUM_COOKIE_DIGEST_SIZE]; int ret = 0; (void)ctx; @@ -2479,12 +2579,16 @@ return GEN_COOKIE_E; } +#if defined(NO_SHA) && !defined(NO_SHA256) + ret = wc_Sha256Hash((byte*)&peer, peerSz, digest); +#else ret = wc_ShaHash((byte*)&peer, peerSz, digest); +#endif if (ret != 0) return ret; - if (sz > WC_SHA_DIGEST_SIZE) - sz = WC_SHA_DIGEST_SIZE; + if (sz > MICRIUM_COOKIE_DIGEST_SIZE) + sz = MICRIUM_COOKIE_DIGEST_SIZE; XMEMCPY(buf, digest, sz); return sz; @@ -2778,20 +2882,31 @@ /* uIP DTLS Generate Cookie callback * return : number of bytes copied into buf, or error */ +#if defined(NO_SHA) && !defined(NO_SHA256) + #define UIP_COOKIE_DIGEST_SIZE WC_SHA256_DIGEST_SIZE +#elif !defined(NO_SHA) + #define UIP_COOKIE_DIGEST_SIZE WC_SHA_DIGEST_SIZE +#else + #error Must enable either SHA-1 or SHA256 (or both) for uIP. +#endif int uIPGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *_ctx) { uip_wolfssl_ctx *ctx = (uip_wolfssl_ctx *)_ctx; byte token[32]; - byte digest[WC_SHA_DIGEST_SIZE]; + byte digest[UIP_COOKIE_DIGEST_SIZE]; int ret = 0; XMEMSET(token, 0, sizeof(token)); XMEMCPY(token, &ctx->peer_addr, sizeof(uip_ipaddr_t)); XMEMCPY(token + sizeof(uip_ipaddr_t), &ctx->peer_port, sizeof(word16)); +#if defined(NO_SHA) && !defined(NO_SHA256) + ret = wc_Sha256Hash(token, sizeof(uip_ipaddr_t) + sizeof(word16), digest); +#else ret = wc_ShaHash(token, sizeof(uip_ipaddr_t) + sizeof(word16), digest); +#endif if (ret != 0) return ret; - if (sz > WC_SHA_DIGEST_SIZE) - sz = WC_SHA_DIGEST_SIZE; + if (sz > UIP_COOKIE_DIGEST_SIZE) + sz = UIP_COOKIE_DIGEST_SIZE; XMEMCPY(buf, digest, sz); return sz; } @@ -2855,13 +2970,20 @@ * return : number of bytes copied into buf, or error */ #define GNRC_MAX_TOKEN_SIZE (32) +#if defined(NO_SHA) && !defined(NO_SHA256) + #define GNRC_COOKIE_DIGEST_SIZE WC_SHA256_DIGEST_SIZE +#elif !defined(NO_SHA) + #define GNRC_COOKIE_DIGEST_SIZE WC_SHA_DIGEST_SIZE +#else + #error Must enable either SHA-1 or SHA256 (or both) for GNRC. +#endif int GNRC_GenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *_ctx) { sock_tls_t *ctx = (sock_tls_t *)_ctx; if (!ctx) return WOLFSSL_CBIO_ERR_GENERAL; byte token[GNRC_MAX_TOKEN_SIZE]; - byte digest[WC_SHA_DIGEST_SIZE]; + byte digest[GNRC_COOKIE_DIGEST_SIZE]; int ret = 0; size_t token_size = sizeof(sock_udp_ep_t); (void)ssl; @@ -2869,11 +2991,15 @@ token_size = GNRC_MAX_TOKEN_SIZE; XMEMSET(token, 0, GNRC_MAX_TOKEN_SIZE); XMEMCPY(token, &ctx->peer_addr, token_size); +#if defined(NO_SHA) && !defined(NO_SHA256) + ret = wc_Sha256Hash(token, token_size, digest); +#else ret = wc_ShaHash(token, token_size, digest); +#endif if (ret != 0) return ret; - if (sz > WC_SHA_DIGEST_SIZE) - sz = WC_SHA_DIGEST_SIZE; + if (sz > GNRC_COOKIE_DIGEST_SIZE) + sz = GNRC_COOKIE_DIGEST_SIZE; XMEMCPY(buf, digest, sz); return sz; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/x509.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/x509.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/x509.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/x509.c 2024-08-03 07:30:00.000000000 +0000 @@ -177,19 +177,19 @@ goto out; } - if (GetLength(input, &idx, &length, sz) < 0) { + if (GetLength(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: invalid length"); goto out; } } - if (GetSequence(input, &idx, &length, sz) < 0) { + if (GetSequence(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)"); goto out; } while (idx < (word32)sz) { - if (GetSequence(input, &idx, &length, sz) < 0) { + if (GetSequence(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: should be a SEQUENCE"); FreeDecodedCert(cert); return WOLFSSL_FAILURE; @@ -541,6 +541,10 @@ return -1; } +#endif /* OPENSSL_ALL || OPENSSL_EXTRA */ + +#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \ + defined(WOLFSSL_WPAS_SMALL) /* Set a general name from the DNS entry data. * * @param [in] dns DNS entry. @@ -565,6 +569,10 @@ static const unsigned char upn_oid[] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x03 }; + /* FASCN OID: 2.16.840.1.101.3.6.6 */ + static const unsigned char fascn_oid[] = { + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x06, 0x06 + }; const unsigned char* oid; word32 oidSz; @@ -574,6 +582,10 @@ oid = upn_oid; oidSz = (word32)sizeof(upn_oid); } + else if (dns->oidSum == FASCN_OID) { + oid = fascn_oid; + oidSz = (word32)sizeof(fascn_oid); + } else { goto err; } @@ -631,7 +643,7 @@ wolfSSL_ASN1_OBJECT_free(obj); goto err; } - wolfSSL_ASN1_STRING_set(str, p, (word32)len); + wolfSSL_ASN1_STRING_set(str, p, (int)len); /* Wrap string in a WOLFSSL_ASN1_TYPE. */ type = wolfSSL_ASN1_TYPE_new(); @@ -650,7 +662,9 @@ err: return ret; } +#endif /* OPENSSL_ALL || WOLFSSL_WPAS_SMALL */ +#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) static int wolfssl_x509_alt_names_to_gn(WOLFSSL_X509* x509, WOLFSSL_X509_EXTENSION* ext) { @@ -825,7 +839,7 @@ return NULL; } - if (GetLength(input, &idx, &length, sz) < 0) { + if (GetLength(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: invalid length"); wolfSSL_X509_EXTENSION_free(ext); FreeDecodedCert(cert); @@ -836,7 +850,7 @@ } } - if (GetSequence(input, &idx, &length, sz) < 0) { + if (GetSequence(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)"); wolfSSL_X509_EXTENSION_free(ext); FreeDecodedCert(cert); @@ -849,7 +863,7 @@ while (idx < (word32)sz) { oid = 0; - if (GetSequence(input, &idx, &length, sz) < 0) { + if (GetSequence(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: should be a SEQUENCE"); wolfSSL_X509_EXTENSION_free(ext); FreeDecodedCert(cert); @@ -860,7 +874,7 @@ } tmpIdx = idx; - ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz); + ret = GetObjectId(input, &idx, &oid, oidCertExtType, (word32)sz); if (ret < 0) { WOLFSSL_MSG("\tfail: OBJECT ID"); wolfSSL_X509_EXTENSION_free(ext); @@ -881,11 +895,11 @@ } /* extCount == loc. Now get the extension. */ /* Check if extension has been set */ - isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, nid); + isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, (int)nid); - if (wolfSSL_OBJ_nid2ln(nid) != NULL) { + if (wolfSSL_OBJ_nid2ln((int)nid) != NULL) { /* This is NOT an unknown OID. */ - ext->obj = wolfSSL_OBJ_nid2obj(nid); + ext->obj = wolfSSL_OBJ_nid2obj((int)nid); if (ext->obj == NULL) { WOLFSSL_MSG("\tfail: Invalid OBJECT"); wolfSSL_X509_EXTENSION_free(ext); @@ -898,7 +912,7 @@ } if (ext->obj) { - ext->obj->nid = nid; + ext->obj->nid = (int)nid; } switch (oid) { @@ -915,7 +929,7 @@ #endif return NULL; } - a->length = x509->pathLength; + a->length = (int)x509->pathLength; /* Save ASN1_INTEGER in x509 extension */ ext->obj->pathlen = a; @@ -958,7 +972,7 @@ return NULL; } obj->obj = (byte*)x509->authInfoCaIssuer; - obj->objSz = x509->authInfoCaIssuerSz; + obj->objSz = (unsigned int)x509->authInfoCaIssuerSz; obj->grp = oidCertAuthInfoType; obj->nid = NID_ad_ca_issuers; @@ -993,7 +1007,7 @@ return NULL; } obj->obj = x509->authInfo; - obj->objSz = x509->authInfoSz; + obj->objSz = (unsigned int)x509->authInfoSz; obj->grp = oidCertAuthInfoType; obj->nid = NID_ad_OCSP; @@ -1118,7 +1132,7 @@ * parsed oid for access in later function calls */ /* Get OID from input */ - if (GetASNObjectId(input, &idx, &length, sz) != 0) { + if (GetASNObjectId(input, &idx, &length, (word32)sz) != 0) { WOLFSSL_MSG("Failed to Get ASN Object Id"); wolfSSL_X509_EXTENSION_free(ext); FreeDecodedCert(cert); @@ -1157,7 +1171,7 @@ } } - ext->obj->objSz = objSz; + ext->obj->objSz = (unsigned int)objSz; if(((ext->obj->dynamic & WOLFSSL_ASN1_DYNAMIC_DATA) != 0) || (ext->obj->obj == NULL)) { ext->obj->obj =(byte*)XREALLOC((byte*)ext->obj->obj, @@ -1186,7 +1200,9 @@ /* Get extension data and copy as ASN1_STRING */ tmpIdx = idx + length; - if ((tmpIdx >= (word32)sz) || (input[tmpIdx++] != ASN_OCTET_STRING)) { + if ((tmpIdx >= (word32)sz) || + (input[tmpIdx] != ASN_OCTET_STRING)) + { WOLFSSL_MSG("Error decoding unknown extension data"); wolfSSL_ASN1_OBJECT_free(ext->obj); wolfSSL_X509_EXTENSION_free(ext); @@ -1197,7 +1213,9 @@ return NULL; } - if (GetLength(input, &tmpIdx, &length, sz) <= 0) { + tmpIdx++; + + if (GetLength(input, &tmpIdx, &length, (word32)sz) <= 0) { WOLFSSL_MSG("Error: Invalid Input Length."); wolfSSL_ASN1_OBJECT_free(ext->obj); wolfSSL_X509_EXTENSION_free(ext); @@ -1265,7 +1283,7 @@ WOLFSSL_MSG("malloc error"); return WOLFSSL_FAILURE; } - *len = str->length; + *len = (word32)str->length; XMEMCPY(*buf, str->data, str->length); } @@ -1354,11 +1372,45 @@ break; } case NID_key_usage: - if (ext && ext->value.data && - ext->value.length == sizeof(word16)) { - x509->keyUsage = *(word16*)ext->value.data; - x509->keyUsageCrit = (byte)ext->crit; - x509->keyUsageSet = 1; + if (ext && ext->value.data) { + if (ext->value.length == sizeof(word16)) { + /* if ext->value is already word16, set directly */ + x509->keyUsage = *(word16*)ext->value.data; + x509->keyUsageCrit = (byte)ext->crit; + x509->keyUsageSet = 1; + } + else if (ext->value.length > 0) { + /* ext->value is comma-delimited string, convert to word16 */ + if (ParseKeyUsageStr(ext->value.data, &x509->keyUsage, + x509->heap) != 0) { + return WOLFSSL_FAILURE; + } + x509->keyUsageCrit = (byte)ext->crit; + x509->keyUsageSet = 1; + } + else { + return WOLFSSL_FAILURE; + } + } + break; + case NID_ext_key_usage: + if (ext && ext->value.data) { + if (ext->value.length == sizeof(byte)) { + /* if ext->value is already word16, set directly */ + x509->extKeyUsage = *(byte*)ext->value.data; + x509->extKeyUsageCrit = (byte)ext->crit; + } + else if (ext->value.length > 0) { + /* ext->value is comma-delimited string, convert to word16 */ + if (ParseExtKeyUsageStr(ext->value.data, &x509->extKeyUsage, + x509->heap) != 0) { + return WOLFSSL_FAILURE; + } + x509->extKeyUsageCrit = (byte)ext->crit; + } + else { + return WOLFSSL_FAILURE; + } } break; case NID_basic_constraints: @@ -1366,7 +1418,7 @@ x509->isCa = (byte)ext->obj->ca; x509->basicConstCrit = (byte)ext->crit; if (ext->obj->pathlen) - x509->pathLength = ext->obj->pathlen->length; + x509->pathLength = (word32)ext->obj->pathlen->length; x509->basicConstSet = 1; } break; @@ -1493,18 +1545,10 @@ WOLFSSL_MSG("Memory error"); return rc; } - if (sk->next) { - if ((valLen = XSNPRINTF(val, len, "%*s%s,", - indent, "", str->strData)) - >= len) - return rc; - } else { - if ((valLen = XSNPRINTF(val, len, "%*s%s", - indent, "", str->strData)) - >= len) - return rc; - } - if (tmpLen + valLen > tmpSz) { + valLen = XSNPRINTF(val, (size_t)len, "%*s%s", indent, "", + str->strData); + if ((valLen < 0) || (valLen >= len) + || ((tmpLen + valLen) >= tmpSz)) { XFREE(val, NULL, DYNAMIC_TYPE_TMP_BUFFER); return rc; } @@ -1521,11 +1565,9 @@ { char* asn1str; asn1str = wolfSSL_i2s_ASN1_STRING(NULL, str); - if ((tmpLen = XSNPRINTF( - tmp, tmpSz, "%*s%s", indent, "", asn1str)) - >= tmpSz) - return rc; + tmpLen = XSNPRINTF(tmp, tmpSz, "%*s%s", indent, "", asn1str); XFREE(asn1str, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (tmpLen >= tmpSz) return rc; break; } case AUTH_INFO_OID: @@ -2066,13 +2108,13 @@ goto out; } - if (GetLength(input, &idx, &length, sz) < 0) { + if (GetLength(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: invalid length"); goto out; } } - if (GetSequence(input, &idx, &length, sz) < 0) { + if (GetSequence(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: should be a SEQUENCE (1)"); goto out; } @@ -2080,13 +2122,13 @@ while (idx < (word32)sz) { oid = 0; - if (GetSequence(input, &idx, &length, sz) < 0) { + if (GetSequence(input, &idx, &length, (word32)sz) < 0) { WOLFSSL_MSG("\tfail: should be a SEQUENCE"); goto out; } tmpIdx = idx; - ret = GetObjectId(input, &idx, &oid, oidCertExtType, sz); + ret = GetObjectId(input, &idx, &oid, oidCertExtType, (word32)sz); if (ret < 0) { WOLFSSL_MSG("\tfail: OBJECT ID"); goto out; @@ -2096,7 +2138,7 @@ if (extCount >= loc) { /* extCount >= loc. Now check if extension has been set */ - isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, foundNID); + isSet = wolfSSL_X509_ext_isSet_by_NID((WOLFSSL_X509*)x509, (int)foundNID); if (isSet && ((word32)nid == foundNID)) { found = 1; @@ -2118,7 +2160,7 @@ return found ? extCount : WOLFSSL_FATAL_ERROR; } -#endif /* OPENSSL_ALL */ +#endif /* OPENSSL_ALL || OPENSSL_EXTRA */ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) /* Looks for the extension matching the passed in nid @@ -2176,7 +2218,7 @@ wolfSSL_BASIC_CONSTRAINTS_free(bc); return NULL; } - a->length = x509->pathLength; + a->length = (int)x509->pathLength; #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \ defined(WOLFSSL_APACHE_HTTPD) @@ -2353,7 +2395,7 @@ obj->type = AUTH_INFO_OID; obj->grp = oidCertExtType; obj->obj = x509->authInfo; - obj->objSz = x509->authInfoSz; + obj->objSz = (unsigned int)x509->authInfoSz; } else { WOLFSSL_MSG("No Auth Info set"); @@ -2642,7 +2684,7 @@ newAltName->next = x509->altNames; newAltName->type = type; - newAltName->len = nameSz; + newAltName->len = (int)nameSz; newAltName->name = nameCopy; x509->altNames = newAltName; @@ -2775,6 +2817,14 @@ } ext->value.type = KEY_USAGE_OID; break; + case NID_ext_key_usage: + if (wolfSSL_ASN1_STRING_set(&ext->value, value, -1) + != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("wolfSSL_ASN1_STRING_set error"); + goto err_cleanup; + } + ext->value.type = EXT_KEY_USAGE_OID; + break; default: WOLFSSL_MSG("invalid or unsupported NID"); goto err_cleanup; @@ -3246,7 +3296,7 @@ return NULL; } - copySz = min(sz, name->sz); + copySz = (int)min((word32)sz, (word32)name->sz); WOLFSSL_ENTER("wolfSSL_X509_NAME_oneline"); if (!name->sz) return in; @@ -3312,7 +3362,7 @@ ((unsigned long)digest[1] << 8) | ((unsigned long)digest[0])); } - else if (rc == HASH_TYPE_E) { + else if (rc == WC_NO_ERR_TRACE(HASH_TYPE_E)) { WOLFSSL_ERROR_MSG("Hash function not compiled in"); } else { @@ -3450,7 +3500,7 @@ WOLFSSL_MSG("Memory error"); return NULL; } - if ((strLen = XSNPRINTF(str, strSz, "%s=%s, ", sn, buf)) + if ((strLen = XSNPRINTF(str, (size_t)strSz, "%s=%s, ", sn, buf)) >= strSz) { WOLFSSL_MSG("buffer overrun"); @@ -3468,7 +3518,7 @@ WOLFSSL_MSG("Memory error"); return NULL; } - if ((strLen = XSNPRINTF(str, strSz, "%s=%s", sn, buf)) >= strSz) { + if ((strLen = XSNPRINTF(str, (size_t)strSz, "%s=%s", sn, buf)) >= strSz) { WOLFSSL_MSG("buffer overrun"); XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER); return NULL; @@ -3531,7 +3581,7 @@ } static WOLFSSL_X509* d2i_X509orX509REQ(WOLFSSL_X509** x509, - const byte* in, int len, int req) + const byte* in, int len, int req, void* heap) { WOLFSSL_X509 *newX509 = NULL; int type = req ? CERTREQ_TYPE : CERT_TYPE; @@ -3558,12 +3608,12 @@ return NULL; #endif - InitDecodedCert(cert, (byte*)in, len, NULL); + InitDecodedCert(cert, (byte*)in, (word32)len, heap); #ifdef WOLFSSL_CERT_REQ cert->isCSR = (byte)req; #endif - if (ParseCertRelative(cert, type, 0, NULL) == 0) { - newX509 = wolfSSL_X509_new(); + if (ParseCertRelative(cert, type, 0, NULL, NULL) == 0) { + newX509 = wolfSSL_X509_new_ex(heap); if (newX509 != NULL) { if (CopyDecodedToX509(newX509, cert) != 0) { wolfSSL_X509_free(newX509); @@ -3597,16 +3647,22 @@ return isCA; } +WOLFSSL_X509* wolfSSL_X509_d2i_ex(WOLFSSL_X509** x509, const byte* in, int len, + void* heap) +{ + return d2i_X509orX509REQ(x509, in, len, 0, heap); +} + WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const byte* in, int len) { - return d2i_X509orX509REQ(x509, in, len, 0); + return wolfSSL_X509_d2i_ex(x509, in, len, NULL); } #ifdef WOLFSSL_CERT_REQ WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509, const unsigned char* in, int len) { - return d2i_X509orX509REQ(x509, in, len, 1); + return d2i_X509orX509REQ(x509, in, len, 1, NULL); } #endif @@ -3676,7 +3732,7 @@ if (buf != NULL) XMEMCPY(buf, x509->sig.buffer, x509->sig.length); - *bufSz = x509->sig.length; + *bufSz = (int)x509->sig.length; return WOLFSSL_SUCCESS; } @@ -3724,7 +3780,7 @@ der = wolfSSL_X509_get_der(x509, &derSz); if (der != NULL) { - InitDecodedCert(cert, der, derSz, NULL); + InitDecodedCert(cert, der, (word32)derSz, NULL); ret = wc_GetPubX509(cert, 0, &badDate); if (ret >= 0) { word32 idx = cert->srcIdx; @@ -3882,12 +3938,12 @@ return NULL; } - if (GetSequence(der, &idx, &len, sz) < 0) { + if (GetSequence(der, &idx, &len, (word32)sz) < 0) { return NULL; } tbs = der + idx; tmpIdx = idx; - if (GetSequence(der, &idx, &len, sz) < 0) { + if (GetSequence(der, &idx, &len, (word32)sz) < 0) { return NULL; } *outSz = len + (idx - tmpIdx); @@ -4378,8 +4434,9 @@ * @return WOLFSSL_FAILURE on invalid parameter or memory error, * WOLFSSL_SUCCESS otherwise. */ -int wolfSSL_GENERAL_NAME_set0_othername(GENERAL_NAME* gen, ASN1_OBJECT* oid, - ASN1_TYPE* value) { +int wolfSSL_GENERAL_NAME_set0_othername(WOLFSSL_GENERAL_NAME* gen, + ASN1_OBJECT* oid, ASN1_TYPE* value) +{ WOLFSSL_ASN1_OBJECT *x = NULL; if ((gen == NULL) || (oid == NULL) || (value == NULL)) { @@ -4782,6 +4839,39 @@ return ret; } +/* Set the value in a general name. This is a compat layer API. + * + * @param [out] a Pointer to the GENERAL_NAME where the othername is set. + * @param [in] type The type of this general name. + * @param [in] value The ASN.1 string that is the value. + * @return none + * @note the set0 indicates we take ownership so the user does NOT free value. + */ +void wolfSSL_GENERAL_NAME_set0_value(WOLFSSL_GENERAL_NAME *a, int type, + void *value) +{ + WOLFSSL_ASN1_STRING *val = (WOLFSSL_ASN1_STRING *)value; + if (a == NULL) { + WOLFSSL_MSG("a is NULL"); + return; + } + + if (val == NULL) { + WOLFSSL_MSG("value is NULL"); + return; + } + + if (type != GEN_DNS) { + WOLFSSL_MSG("Only GEN_DNS is supported"); + return; + } + + wolfSSL_GENERAL_NAME_type_free(a); + a->type = type; + if (type == GEN_DNS) { + a->d.dNSName = val; + } +} /* Frees GENERAL_NAME objects. */ @@ -4807,6 +4897,17 @@ wolfSSL_sk_GENERAL_NAME_free(gens); } +void wolfSSL_EXTENDED_KEY_USAGE_free(WOLFSSL_STACK * sk) +{ + WOLFSSL_ENTER("wolfSSL_EXTENDED_KEY_USAGE_free"); + + if (sk == NULL) { + return; + } + + wolfSSL_sk_X509_pop_free(sk, NULL); +} + #if defined(OPENSSL_ALL) && !defined(NO_BIO) /* Outputs name string of the given WOLFSSL_GENERAL_NAME_OBJECT to WOLFSSL_BIO. * Can handle following GENERAL_NAME_OBJECT types: @@ -5018,7 +5119,7 @@ fileBuffer = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE); if (fileBuffer != NULL) { - int ret = (int)XFREAD(fileBuffer, 1, sz, file); + int ret = (int)XFREAD(fileBuffer, 1, (size_t)sz, file); if (ret == sz) { newX509 = wolfSSL_X509_d2i(NULL, fileBuffer, (int)sz); } @@ -5088,7 +5189,7 @@ dynamic = 1; } - ret = (int)XFREAD(fileBuffer, 1, sz, file); + ret = (int)XFREAD(fileBuffer, 1, (size_t)sz, file); if (ret != sz) { XFCLOSE(file); if (dynamic) @@ -5111,7 +5212,7 @@ const unsigned char* buf, int sz, int format, int type) { - int ret; + int ret = 0; WOLFSSL_X509* x509 = NULL; DerBuffer* der = NULL; @@ -5119,7 +5220,8 @@ if (format == WOLFSSL_FILETYPE_PEM) { #ifdef WOLFSSL_PEM_TO_DER - if (PemToDer(buf, sz, type, &der, NULL, NULL, NULL) != 0) { + ret = PemToDer(buf, sz, type, &der, NULL, NULL, NULL); + if (ret != 0) { FreeDer(&der); } #else @@ -5145,20 +5247,28 @@ #ifdef WOLFSSL_SMALL_STACK cert = (DecodedCert*)XMALLOC(sizeof(DecodedCert), NULL, DYNAMIC_TYPE_DCERT); - if (cert != NULL) + if (cert == NULL) { + ret = MEMORY_ERROR; + } + else #endif { InitDecodedCert(cert, der->buffer, der->length, NULL); - if (ParseCertRelative(cert, type, 0, NULL) == 0) { + ret = ParseCertRelative(cert, type, 0, NULL, NULL); + if (ret == 0) { x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, DYNAMIC_TYPE_X509); if (x509 != NULL) { InitX509(x509, 1, NULL); - if (CopyDecodedToX509(x509, cert) != 0) { + ret = CopyDecodedToX509(x509, cert); + if (ret != 0) { wolfSSL_X509_free(x509); x509 = NULL; } } + else { + ret = MEMORY_ERROR; + } } FreeDecodedCert(cert); @@ -5170,6 +5280,10 @@ FreeDer(&der); } + if (ret != 0) { + WOLFSSL_ERROR(ret); + } + return x509; } @@ -5199,19 +5313,24 @@ /* returns a pointer to a new WOLFSSL_X509 structure on success and NULL on * fail */ -WOLFSSL_X509* wolfSSL_X509_new(void) +WOLFSSL_X509* wolfSSL_X509_new_ex(void* heap) { WOLFSSL_X509* x509; - x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), NULL, + x509 = (WOLFSSL_X509*)XMALLOC(sizeof(WOLFSSL_X509), heap, DYNAMIC_TYPE_X509); if (x509 != NULL) { - InitX509(x509, 1, NULL); + InitX509(x509, 1, heap); } return x509; } +WOLFSSL_X509* wolfSSL_X509_new(void) +{ + return wolfSSL_X509_new_ex(NULL); +} + WOLFSSL_ABI WOLFSSL_X509_NAME* wolfSSL_X509_get_subject_name(WOLFSSL_X509* cert) { @@ -5332,7 +5451,7 @@ /* buf is not NULL from above */ if (text != NULL) { - textSz = min(textSz + 1, len); /* + 1 to account for null char */ + textSz = (int)min((word32)textSz + 1, (word32)len); /* + 1 to account for null char */ if (textSz > 0) { XMEMCPY(buf, text, textSz - 1); buf[textSz - 1] = '\0'; @@ -5376,7 +5495,7 @@ return NULL; } XMEMCPY(key->pkey.ptr, x509->pubKey.buffer, x509->pubKey.length); - key->pkey_sz = x509->pubKey.length; + key->pkey_sz = (int)x509->pubKey.length; #ifdef HAVE_ECC key->pkey_curve = (int)x509->pkCurveOID; @@ -5616,8 +5735,8 @@ if (x509 != NULL) { if (x509->authKeyIdSet) { - copySz = min(dstLen != NULL ? *dstLen : 0, - (int)x509->authKeyIdSz); + copySz = (int)min(dstLen != NULL ? (word32)*dstLen : 0, + x509->authKeyIdSz); id = x509->authKeyId; } @@ -5643,8 +5762,8 @@ if (x509 != NULL) { if (x509->subjKeyIdSet) { - copySz = min(dstLen != NULL ? *dstLen : 0, - (int)x509->subjKeyIdSz); + copySz = (int)min(dstLen != NULL ? (word32) *dstLen : 0, + x509->subjKeyIdSz); id = x509->subjKeyId; } @@ -5784,11 +5903,21 @@ else if (entry->type == ASN_URI_TYPE) { len = XSNPRINTF(scratch, MAX_WIDTH, "URI:%s", entry->name); + if (len >= MAX_WIDTH) { + ret = WOLFSSL_FAILURE; + break; + } + } + #if defined(OPENSSL_ALL) + else if (entry->type == ASN_RID_TYPE) { + len = XSNPRINTF(scratch, MAX_WIDTH, "Registered ID:%s", + entry->ridString); if (len >= MAX_WIDTH) { ret = WOLFSSL_FAILURE; break; } } + #endif else if (entry->type == ASN_OTHER_TYPE) { len = XSNPRINTF(scratch, MAX_WIDTH, "othername "); @@ -6378,7 +6507,8 @@ break; } } - if (valLen >= (int)sizeof(tmp) - tmpLen - 1) { + if ((tmpLen < 0) || (valLen < 0) || + (valLen >= ((int)sizeof(tmp) - tmpLen - 1))) { ret = WOLFSSL_FAILURE; break; } @@ -6949,7 +7079,7 @@ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) const char* wolfSSL_X509_verify_cert_error_string(long err) { - return wolfSSL_ERR_reason_error_string(err); + return wolfSSL_ERR_reason_error_string((unsigned long)err); } #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ @@ -7022,7 +7152,8 @@ WOLFSSL_CERT_MANAGER* cm = lookup->store->cm; if (cm->crl == NULL) { - if (wolfSSL_CertManagerEnableCRL(cm, 0) != WOLFSSL_SUCCESS) { + if (wolfSSL_CertManagerEnableCRL(cm, WOLFSSL_CRL_CHECK) + != WOLFSSL_SUCCESS) { WOLFSSL_MSG("Enable CRL failed"); goto end; } @@ -7357,6 +7488,7 @@ { const unsigned char* der; int derSz = 0; + int advance = 1; WOLFSSL_ENTER("wolfSSL_i2d_X509"); @@ -7377,15 +7509,77 @@ WOLFSSL_LEAVE("wolfSSL_i2d_X509", MEMORY_E); return MEMORY_E; } + advance = 0; } - if (out != NULL) + if (out != NULL) { XMEMCPY(*out, der, derSz); + if (advance) + *out += derSz; + } WOLFSSL_LEAVE("wolfSSL_i2d_X509", derSz); return derSz; } +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wc_GeneratePreTBS(DecodedCert* cert, byte *der, int derSz) { + int ret = 0; + WOLFSSL_X509 *x = NULL; + byte certOwnsAltNames = 0; + byte certIsCSR = 0; + + if ((cert == NULL) || (der == NULL) || (derSz <= 0)) { + return BAD_FUNC_ARG; + } + + /* The call to CopyDecodedToX509() transfers ownership of the altNames in + * the DecodedCert to the temporary X509 object, causing the list to be + * freed in wolfSSL_X509_free(). As this is an unintended side-effect, we + * have to save the ownerFlag here and transfer ownership back to the + * DecodedCert prior to freeing the X509 object. */ + certOwnsAltNames = cert->weOwnAltNames; + +#ifdef WOLFSSL_CERT_REQ + certIsCSR = cert->isCSR; +#endif + + x = wolfSSL_X509_new(); + if (x == NULL) { + ret = MEMORY_E; + } + else { + ret = CopyDecodedToX509(x, cert); + } + + /* CopyDecodedToX509() clears cert->weOwnAltNames. Restore it. */ + cert->weOwnAltNames = certOwnsAltNames; + + if (ret == 0) { + /* Remove the altsigval extension. */ + XFREE(x->altSigValDer, x->heap, DYNAMIC_TYPE_X509_EXT); + x->altSigValDer = NULL; + x->altSigValLen = 0; + /* Remove sigOID so it won't be encoded. */ + x->sigOID = 0; + /* We now have a PreTBS. Encode it. */ + ret = wolfssl_x509_make_der(x, certIsCSR, der, &derSz, 0); + if (ret == WOLFSSL_SUCCESS) { + ret = derSz; + } + } + + if (x != NULL) { + /* Safe the altNames list from being freed unitentionally. */ + x->altNames = NULL; + + wolfSSL_X509_free(x); + } + + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + #ifndef NO_BIO /** * Converts the DER from bio and creates a WOLFSSL_X509 structure from it. @@ -7434,7 +7628,7 @@ #endif } else { - localX509 = wolfSSL_X509_d2i(NULL, mem, size); + localX509 = wolfSSL_X509_d2i_ex(NULL, mem, size, bio->heap); } if (localX509 == NULL) { WOLFSSL_MSG("wolfSSL_X509_d2i error"); @@ -7508,11 +7702,11 @@ #ifdef WOLFSSL_CERT_REQ if (req) - ret = CheckCSRSignaturePubKey(der, derSz, x509->heap, + ret = CheckCSRSignaturePubKey(der, (word32)derSz, x509->heap, (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type); else #endif - ret = CheckCertSignaturePubKey(der, derSz, x509->heap, + ret = CheckCertSignaturePubKey(der, (word32)derSz, x509->heap, (unsigned char*)pkey->pkey.ptr, pkey->pkey_sz, type); if (ret == 0) { return WOLFSSL_SUCCESS; @@ -7564,7 +7758,7 @@ fileBuffer = (byte *)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE); if (fileBuffer != NULL) { - if ((long)XFREAD(fileBuffer, 1, sz, file) != sz) { + if ((long)XFREAD(fileBuffer, 1, (size_t)sz, file) != sz) { WOLFSSL_MSG("File read failed"); goto err_exit; } @@ -7586,7 +7780,7 @@ if ((newx509 = wc_PKCS12_new()) == NULL) { goto err_exit; } - if (wc_d2i_PKCS12(fileBuffer, (int)sz, (WC_PKCS12*)newx509) < 0) { + if (wc_d2i_PKCS12(fileBuffer, (word32)sz, (WC_PKCS12*)newx509) < 0) { goto err_exit; } } @@ -7797,7 +7991,7 @@ } #endif -#ifndef NO_FILESYSTEM +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) WOLFSSL_X509_CRL *wolfSSL_d2i_X509_CRL_fp(XFILE fp, WOLFSSL_X509_CRL **crl) { WOLFSSL_ENTER("wolfSSL_d2i_X509_CRL_fp"); @@ -8042,7 +8236,8 @@ { WOLFSSL_ENTER("wolfSSL_X509_CRL_get_signature"); - if (crl == NULL || crl->crlList == NULL || bufSz == NULL) + if (crl == NULL || crl->crlList == NULL || + crl->crlList->signature == NULL || bufSz == NULL) return BAD_FUNC_ARG; if (buf != NULL) @@ -8233,7 +8428,7 @@ } tmp[0] = '\0'; } - if (XSNPRINTF(val, valSz, ":%02X", crl->crlList->extAuthKeyId[i]) + if (XSNPRINTF(val, (size_t)valSz, ":%02X", crl->crlList->extAuthKeyId[i]) >= valSz) { WOLFSSL_MSG("buffer overrun"); @@ -8619,7 +8814,7 @@ if (isOverWrite || (from->hostName[0] != 0 && (to->hostName[0] == 0 || isDefault))) { if (!(ret = wolfSSL_X509_VERIFY_PARAM_set1_host(to, from->hostName, - (int)XSTRLEN(from->hostName)))) + (unsigned int)XSTRLEN(from->hostName)))) return ret; to->hostFlags = from->hostFlags; } @@ -9021,7 +9216,7 @@ wolfSSL_ASN1_INTEGER_free(a); return NULL; } - a->dataMax = x509->serialSz + 2; + a->dataMax = (unsigned int)x509->serialSz + 2; a->isDynamic = 1; } else { /* Use array instead of dynamic memory */ @@ -9470,7 +9665,9 @@ { WOLFSSL_ENTER("wolfSSL_X509_NAME_free"); FreeX509Name(name); - XFREE(name, NULL, DYNAMIC_TYPE_X509); + if (name != NULL) { + XFREE(name, name->heap, DYNAMIC_TYPE_X509); + } } @@ -9478,20 +9675,24 @@ * * returns NULL on failure, otherwise returns a new structure. */ - WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void) + WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new_ex(void *heap) { WOLFSSL_X509_NAME* name; - WOLFSSL_ENTER("wolfSSL_X509_NAME_new"); + WOLFSSL_ENTER("wolfSSL_X509_NAME_new_ex"); - name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), NULL, + name = (WOLFSSL_X509_NAME*)XMALLOC(sizeof(WOLFSSL_X509_NAME), heap, DYNAMIC_TYPE_X509); if (name != NULL) { - InitX509Name(name, 1, NULL); + InitX509Name(name, 1, heap); } return name; } + WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void) { + return wolfSSL_X509_NAME_new_ex(NULL); + } + /* Creates a duplicate of a WOLFSSL_X509_NAME structure. Returns a new WOLFSSL_X509_NAME structure or NULL on failure */ WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME *name) @@ -9505,7 +9706,7 @@ return NULL; } - if (!(copy = wolfSSL_X509_NAME_new())) { + if (!(copy = wolfSSL_X509_NAME_new_ex(name->heap))) { return NULL; } @@ -9541,7 +9742,7 @@ if (ret > 0) { /* strip off sequence, this gets added on certificate creation */ - ret = GetSequence(der, &idx, &length, ret); + ret = GetSequence(der, &idx, &length, (word32)ret); } if (ret > 0) { @@ -9584,11 +9785,12 @@ #ifdef WOLFSSL_CERT_EXT if (req->subjKeyIdSz != 0) { XMEMCPY(cert->skid, req->subjKeyId, req->subjKeyIdSz); - cert->skidSz = req->subjKeyIdSz; + cert->skidSz = (int)req->subjKeyIdSz; } if (req->keyUsageSet) cert->keyUsage = req->keyUsage; - /* Extended Key Usage not supported. */ + + cert->extKeyUsage = req->extKeyUsage; #endif XMEMCPY(cert->challengePw, req->challengePw, CTC_NAME_SIZE); @@ -9665,7 +9867,7 @@ } out[0] = (byte) t->type; - sz = SetLength(t->length, out + 1) + 1; /* gen tag */ + sz = (int)SetLength((word32)t->length, out + 1) + 1; /* gen tag */ for (i = 0; i < t->length; i++) { out[sz + i] = t->data[i]; } @@ -9784,6 +9986,16 @@ XMEMCPY(cert->crlInfo, x509->rawCRLInfo, x509->rawCRLInfoSz); cert->crlInfoSz = x509->rawCRLInfoSz; } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + /* We point to instance in x509 so DON'T need to be free'd. */ + cert->sapkiDer = x509->sapkiDer; + cert->sapkiLen = x509->sapkiLen; + cert->altSigAlgDer = x509->altSigAlgDer; + cert->altSigAlgLen = x509->altSigAlgLen; + cert->altSigValDer = x509->altSigValDer; + cert->altSigValLen = x509->altSigValLen; + #endif /* WOLFSSL_DUAL_ALG_CERTS */ #endif /* WOLFSSL_CERT_EXT */ #ifdef WOLFSSL_CERT_REQ @@ -9980,6 +10192,15 @@ #ifndef NO_DSA DsaKey* dsa = NULL; #endif + #if defined(HAVE_FALCON) + falcon_key* falcon = NULL; + #endif + #if defined(HAVE_DILITHIUM) + dilithium_key* dilithium = NULL; + #endif + #if defined(HAVE_SPHINCS) + sphincs_key* sphincs = NULL; + #endif WC_RNG rng; word32 idx = 0; @@ -10106,6 +10327,148 @@ key = (void*)dsa; } #endif + #if defined(HAVE_FALCON) + if ((x509->pubKeyOID == FALCON_LEVEL1k) || + (x509->pubKeyOID == FALCON_LEVEL5k)) { + falcon = (falcon_key*)XMALLOC(sizeof(falcon_key), NULL, + DYNAMIC_TYPE_FALCON); + if (falcon == NULL) { + WOLFSSL_MSG("Failed to allocate memory for falcon_key"); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return WOLFSSL_FAILURE; + } + + ret = wc_falcon_init(falcon); + if (ret != 0) { + XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return ret; + } + + if (x509->pubKeyOID == FALCON_LEVEL1k) { + type = FALCON_LEVEL1_TYPE; + wc_falcon_set_level(falcon, 1); + } + else if (x509->pubKeyOID == FALCON_LEVEL5k) { + type = FALCON_LEVEL5_TYPE; + wc_falcon_set_level(falcon, 5); + } + + ret = wc_Falcon_PublicKeyDecode(x509->pubKey.buffer, &idx, falcon, + x509->pubKey.length); + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + wc_falcon_free(falcon); + XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return ret; + } + key = (void*)falcon; + } + #endif + #if defined(HAVE_DILITHIUM) + if ((x509->pubKeyOID == DILITHIUM_LEVEL2k) || + (x509->pubKeyOID == DILITHIUM_LEVEL3k) || + (x509->pubKeyOID == DILITHIUM_LEVEL5k)) { + dilithium = (dilithium_key*)XMALLOC(sizeof(dilithium_key), NULL, + DYNAMIC_TYPE_DILITHIUM); + if (dilithium == NULL) { + WOLFSSL_MSG("Failed to allocate memory for dilithium_key"); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return WOLFSSL_FAILURE; + } + + ret = wc_dilithium_init(dilithium); + if (ret != 0) { + XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return ret; + } + + if (x509->pubKeyOID == DILITHIUM_LEVEL2k) { + type = DILITHIUM_LEVEL2_TYPE; + wc_dilithium_set_level(dilithium, 2); + } + else if (x509->pubKeyOID == DILITHIUM_LEVEL3k) { + type = DILITHIUM_LEVEL3_TYPE; + wc_dilithium_set_level(dilithium, 3); + } + else if (x509->pubKeyOID == DILITHIUM_LEVEL5k) { + type = DILITHIUM_LEVEL5_TYPE; + wc_dilithium_set_level(dilithium, 5); + } + + ret = wc_Dilithium_PublicKeyDecode(x509->pubKey.buffer, &idx, + dilithium, x509->pubKey.length); + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + wc_dilithium_free(dilithium); + XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return ret; + } + key = (void*)dilithium; + } + #endif + #if defined(HAVE_SPHINCS) + if ((x509->pubKeyOID == SPHINCS_FAST_LEVEL1k) || + (x509->pubKeyOID == SPHINCS_FAST_LEVEL3k) || + (x509->pubKeyOID == SPHINCS_FAST_LEVEL5k) || + (x509->pubKeyOID == SPHINCS_SMALL_LEVEL1k) || + (x509->pubKeyOID == SPHINCS_SMALL_LEVEL3k) || + (x509->pubKeyOID == SPHINCS_SMALL_LEVEL5k)) { + sphincs = (sphincs_key*)XMALLOC(sizeof(sphincs_key), NULL, + DYNAMIC_TYPE_SPHINCS); + if (sphincs == NULL) { + WOLFSSL_MSG("Failed to allocate memory for sphincs_key"); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return WOLFSSL_FAILURE; + } + + ret = wc_sphincs_init(sphincs); + if (ret != 0) { + XFREE(sphincs, NULL, DYNAMIC_TYPE_SPHINCS); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return ret; + } + + if (x509->pubKeyOID == SPHINCS_FAST_LEVEL1k) { + type = SPHINCS_FAST_LEVEL1_TYPE; + wc_sphincs_set_level_and_optim(sphincs, 1, FAST_VARIANT); + } + else if (x509->pubKeyOID == SPHINCS_FAST_LEVEL3k) { + type = SPHINCS_FAST_LEVEL3_TYPE; + wc_sphincs_set_level_and_optim(sphincs, 3, FAST_VARIANT); + } + else if (x509->pubKeyOID == SPHINCS_FAST_LEVEL3k) { + type = SPHINCS_FAST_LEVEL5_TYPE; + wc_sphincs_set_level_and_optim(sphincs, 5, FAST_VARIANT); + } + else if (x509->pubKeyOID == SPHINCS_SMALL_LEVEL1k) { + type = SPHINCS_SMALL_LEVEL1_TYPE; + wc_sphincs_set_level_and_optim(sphincs, 1, SMALL_VARIANT); + } + else if (x509->pubKeyOID == SPHINCS_SMALL_LEVEL3k) { + type = SPHINCS_SMALL_LEVEL3_TYPE; + wc_sphincs_set_level_and_optim(sphincs, 3, SMALL_VARIANT); + } + else if (x509->pubKeyOID == SPHINCS_SMALL_LEVEL3k) { + type = SPHINCS_SMALL_LEVEL5_TYPE; + wc_sphincs_set_level_and_optim(sphincs, 5, SMALL_VARIANT); + } + + ret = wc_Sphincs_PublicKeyDecode(x509->pubKey.buffer, &idx, sphincs, + x509->pubKey.length); + if (ret != 0) { + WOLFSSL_ERROR_VERBOSE(ret); + wc_sphincs_free(sphincs); + XFREE(sphincs, NULL, DYNAMIC_TYPE_SPHINCS); + XFREE(cert, NULL, DYNAMIC_TYPE_CERT); + return ret; + } + key = (void*)sphincs; + } + #endif if (key == NULL) { WOLFSSL_MSG("No public key found for certificate"); XFREE(cert, NULL, DYNAMIC_TYPE_CERT); @@ -10206,6 +10569,32 @@ XFREE(dsa, NULL, DYNAMIC_TYPE_DSA); } #endif + #if defined(HAVE_FALCON) + if ((x509->pubKeyOID == FALCON_LEVEL1k) || + (x509->pubKeyOID == FALCON_LEVEL5k)) { + wc_falcon_free(falcon); + XFREE(falcon, NULL, DYNAMIC_TYPE_FALCON); + } + #endif + #if defined(HAVE_DILITHIUM) + if ((x509->pubKeyOID == DILITHIUM_LEVEL2k) || + (x509->pubKeyOID == DILITHIUM_LEVEL3k) || + (x509->pubKeyOID == DILITHIUM_LEVEL5k)) { + wc_dilithium_free(dilithium); + XFREE(dilithium, NULL, DYNAMIC_TYPE_DILITHIUM); + } + #endif + #if defined(HAVE_SPHINCS) + if ((x509->pubKeyOID == SPHINCS_FAST_LEVEL1k) || + (x509->pubKeyOID == SPHINCS_FAST_LEVEL3k) || + (x509->pubKeyOID == SPHINCS_FAST_LEVEL5k) || + (x509->pubKeyOID == SPHINCS_SMALL_LEVEL1k) || + (x509->pubKeyOID == SPHINCS_SMALL_LEVEL3k) || + (x509->pubKeyOID == SPHINCS_SMALL_LEVEL5k)) { + wc_sphincs_free(sphincs); + XFREE(sphincs, NULL, DYNAMIC_TYPE_SPHINCS); + } + #endif XFREE(cert, NULL, DYNAMIC_TYPE_CERT); return ret; @@ -10257,7 +10646,7 @@ ret = wc_InitRng(&rng); if (ret != 0) return ret; - ret = wc_SignCert_ex(certBodySz, sigType, der, derSz, type, key, &rng); + ret = wc_SignCert_ex(certBodySz, sigType, der, (word32)derSz, type, key, &rng); wc_FreeRng(&rng); if (ret < 0) { WOLFSSL_LEAVE("wolfSSL_X509_resign_cert", ret); @@ -10271,20 +10660,20 @@ int len = 0; /* Read top level sequence */ - if (GetSequence(der, &idx, &len, derSz) < 0) { + if (GetSequence(der, &idx, &len, (word32)derSz) < 0) { WOLFSSL_MSG("GetSequence error"); return WOLFSSL_FATAL_ERROR; } /* Move idx to signature */ idx += certBodySz; /* Read signature algo sequence */ - if (GetSequence(der, &idx, &len, derSz) < 0) { + if (GetSequence(der, &idx, &len, (word32)derSz) < 0) { WOLFSSL_MSG("GetSequence error"); return WOLFSSL_FATAL_ERROR; } idx += len; /* Read signature bit string */ - if (CheckBitString(der, &idx, &len, derSz, 0, NULL) != 0) { + if (CheckBitString(der, &idx, &len, (word32)derSz, 0, NULL) != 0) { WOLFSSL_MSG("CheckBitString error"); return WOLFSSL_FATAL_ERROR; } @@ -10303,7 +10692,7 @@ return WOLFSSL_FATAL_ERROR; } XMEMCPY(x509->sig.buffer, der + idx, len); - x509->sig.length = len; + x509->sig.length = (unsigned int)len; } /* Put in the new certificate encoding into the x509 object. */ @@ -10314,10 +10703,10 @@ type = CERTREQ_TYPE; } #endif - if (AllocDer(&x509->derCert, derSz, type, NULL) != 0) + if (AllocDer(&x509->derCert, (word32)derSz, type, NULL) != 0) return WOLFSSL_FATAL_ERROR; XMEMCPY(x509->derCert->buffer, der, derSz); - x509->derCert->length = derSz; + x509->derCert->length = (word32)derSz; return ret; } @@ -10411,6 +10800,7 @@ case NID_organizationName: return ASN_ORG_NAME; case NID_organizationalUnitName: return ASN_ORGUNIT_NAME; case NID_emailAddress: return ASN_EMAIL_NAME; + case NID_pkcs9_contentType: return ASN_CONTENT_TYPE; case NID_serialNumber: return ASN_SERIAL_NUMBER; case NID_userId: return ASN_USER_ID; case NID_businessCategory: return ASN_BUS_CAT; @@ -10618,6 +11008,7 @@ case MBSTRING_UTF8: type = CTC_UTF8; break; + case MBSTRING_ASC: case V_ASN1_PRINTABLESTRING: type = CTC_PRINTABLE; break; @@ -10639,7 +11030,7 @@ } /* header */ - idx = SetSequence(totalBytes, temp); + idx = (int)SetSequence((word32)totalBytes, temp); if (totalBytes + idx > ASN_NAME_MAX) { #ifdef WOLFSSL_SMALL_STACK XFREE(names, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -10667,7 +11058,7 @@ } output = *out; - idx = SetSequence(totalBytes, output); + idx = (int)SetSequence((word32)totalBytes, output); totalBytes += idx; for (i = 0; i < MAX_NAME_ENTRIES; i++) { if (names[i].used) { @@ -10727,8 +11118,8 @@ goto cleanup; } - if (!(tmp = wolfSSL_X509_NAME_new())) { - WOLFSSL_MSG("wolfSSL_X509_NAME_new error"); + if (!(tmp = wolfSSL_X509_NAME_new_ex(cert->heap))) { + WOLFSSL_MSG("wolfSSL_X509_NAME_new_ex error"); goto cleanup; } @@ -10788,7 +11179,7 @@ _x = (x->name && *x->name) ? x->name : x->staticName; _y = (y->name && *y->name) ? y->name : y->staticName; - return XSTRNCMP(_x, _y, x->sz); /* y sz is the same */ + return XSTRNCASECMP(_x, _y, x->sz); /* y sz is the same */ } #ifndef NO_BIO @@ -10891,6 +11282,27 @@ return loadX509orX509REQFromPemBio(bp, x, cb, u, CERT_TYPE); } + /* + * bp : bio to read X509 from + * x : x509 to write to + * cb : password call back for reading PEM + * u : password + * _AUX is for working with a trusted X509 certificate + */ + WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_AUX(WOLFSSL_BIO *bp, + WOLFSSL_X509 **x, wc_pem_password_cb *cb, + void *u) + { + WOLFSSL_ENTER("wolfSSL_PEM_read_bio_X509"); + + /* AUX info is; trusted/rejected uses, friendly name, private key id, + * and potentially a stack of "other" info. wolfSSL does not store + * friendly name or private key id yet in WOLFSSL_X509 for human + * readability and does not support extra trusted/rejected uses for + * root CA. */ + return wolfSSL_PEM_read_bio_X509(bp, x, cb, u); + } + #ifdef WOLFSSL_CERT_REQ WOLFSSL_X509 *wolfSSL_PEM_read_bio_X509_REQ(WOLFSSL_BIO *bp, WOLFSSL_X509 **x, wc_pem_password_cb *cb, void *u) @@ -10964,7 +11376,7 @@ if((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) { goto err; } - derSz = der->length; + derSz = (int)der->length; if((crl = wolfSSL_d2i_X509_CRL(x, der->buffer, derSz)) == NULL) { goto err; } @@ -11027,7 +11439,7 @@ pemSz = (int)(l - i); /* check calculated length */ - if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz < 0) { + if (pemSz > MAX_WOLFSSL_FILE_SIZE || pemSz <= 0) { WOLFSSL_MSG("PEM_read_X509_ex file size error"); return NULL; } @@ -11037,7 +11449,7 @@ if (pem == NULL) return NULL; - if ((int)XFREAD((char *)pem, 1, pemSz, fp) != pemSz) + if ((int)XFREAD((char *)pem, 1, (size_t)pemSz, fp) != pemSz) goto err_exit; switch (type) { @@ -11050,7 +11462,7 @@ case CRL_TYPE: if ((PemToDer(pem, pemSz, CRL_TYPE, &der, NULL, NULL, NULL)) < 0) goto err_exit; - derSz = der->length; + derSz = (int)der->length; newx509 = (void*)wolfSSL_d2i_X509_CRL((WOLFSSL_X509_CRL **)x, (const unsigned char *)der->buffer, derSz); if (newx509 == NULL) @@ -11286,8 +11698,9 @@ "-----BEGIN X509 CRL-----")) { /* We have a crl */ WOLFSSL_MSG("Parsing crl"); - if((PemToDer((const unsigned char*) header, footerEnd - header, - CRL_TYPE, &der, NULL, NULL, NULL)) < 0) { + if((PemToDer((const unsigned char*) header, + (long)(footerEnd - header), CRL_TYPE, &der, NULL, NULL, + NULL)) < 0) { WOLFSSL_MSG("PemToDer error"); goto err; } @@ -11701,7 +12114,6 @@ static int RebuildFullName(WOLFSSL_X509_NAME* name) { int totalLen = 0, i, idx, entryCount = 0; - char* fullName; if (name == NULL) return BAD_FUNC_ARG; @@ -11721,23 +12133,26 @@ } } - fullName = (char*)XMALLOC(totalLen + 1, name->heap, DYNAMIC_TYPE_X509); - if (fullName == NULL) - return MEMORY_E; + if (name->dynamicName) { + XFREE(name->name, name->heap, DYNAMIC_TYPE_X509); + name->name = name->staticName; + name->dynamicName = 0; + } + + if (totalLen >= ASN_NAME_MAX) { + name->name = (char*)XMALLOC(totalLen + 1, name->heap, + DYNAMIC_TYPE_X509); + if (name->name == NULL) + return MEMORY_E; + name->dynamicName = 1; + } idx = 0; - entryCount = AddAllEntry(name, fullName, totalLen, &idx); - if (entryCount < 0) { - XFREE(fullName, name->heap, DYNAMIC_TYPE_X509); + entryCount = AddAllEntry(name, name->name, totalLen, &idx); + if (entryCount < 0) return entryCount; - } - if (name->dynamicName) { - XFREE(name->name, name->heap, DYNAMIC_TYPE_X509); - } - fullName[idx] = '\0'; - name->name = fullName; - name->dynamicName = 1; + name->name[idx] = '\0'; name->sz = idx + 1; /* size includes null terminator */ name->entrySz = entryCount; @@ -12014,7 +12429,7 @@ } /* get PEM size */ - pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERTREQ_TYPE); + pemSz = wc_DerToPemEx(der, (word32)derSz, NULL, 0, NULL, CERTREQ_TYPE); if (pemSz < 0) { return WOLFSSL_FAILURE; } @@ -12024,7 +12439,7 @@ if (pem == NULL) { return WOLFSSL_FAILURE; } - if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) { + if (wc_DerToPemEx(der, (word32)derSz, pem, pemSz, NULL, CERTREQ_TYPE) < 0) { XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_FAILURE; } @@ -12064,7 +12479,7 @@ } /* get PEM size */ - pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE); + pemSz = wc_DerToPemEx(der, (word32)derSz, NULL, 0, NULL, CERT_TYPE); if (pemSz < 0) { return WOLFSSL_FAILURE; } @@ -12074,7 +12489,7 @@ if (pem == NULL) { return WOLFSSL_FAILURE; } - if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) { + if (wc_DerToPemEx(der, (word32)derSz, pem, pemSz, NULL, CERT_TYPE) < 0) { XFREE(pem, NULL, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_FAILURE; } @@ -12112,7 +12527,7 @@ } /* get PEM size */ - pemSz = wc_DerToPemEx(der, derSz, NULL, 0, NULL, CERT_TYPE); + pemSz = wc_DerToPemEx(der, (word32)derSz, NULL, 0, NULL, CERT_TYPE); if (pemSz < 0) { goto error; } @@ -12122,7 +12537,7 @@ if (pem == NULL) { goto error; } - if (wc_DerToPemEx(der, derSz, pem, pemSz, NULL, CERT_TYPE) < 0) { + if (wc_DerToPemEx(der, (word32)derSz, pem, pemSz, NULL, CERT_TYPE) < 0) { goto error; } @@ -12434,9 +12849,10 @@ for (i = 0; i < num; i++) { name = wolfSSL_X509_NAME_dup(wolfSSL_sk_X509_NAME_value(sk, i)); - if (name == NULL || 0 != wolfSSL_sk_X509_NAME_push(copy, name)) { + if (name == NULL || WOLFSSL_SUCCESS != wolfSSL_sk_X509_NAME_push(copy, name)) { WOLFSSL_MSG("Memory error"); wolfSSL_sk_X509_NAME_pop_free(copy, wolfSSL_X509_NAME_free); + wolfSSL_X509_NAME_free(name); return NULL; } } @@ -12506,6 +12922,10 @@ str = "ST"; len = 2; break; + case NID_streetAddress: + str = "street"; + len = 6; + break; case NID_organizationName: str = "O"; len = 1; @@ -12514,6 +12934,10 @@ str = "OU"; len = 2; break; + case NID_postalCode: + str = "postalCode"; + len = 10; + break; case NID_emailAddress: str = "emailAddress"; len = 12; @@ -12542,6 +12966,22 @@ str = "DC"; len = 2; break; + case NID_pkcs9_contentType: + str = "contentType"; + len = 11; + break; + case NID_userId: + str = "UID"; + len = 3; + break; + case NID_serialNumber: + str = "serialNumber"; + len = 12; + break; + case NID_title: + str = "title"; + len = 5; + break; default: WOLFSSL_MSG("Attribute type not found"); str = NULL; @@ -12606,7 +13046,7 @@ } out[outIdx] = '\0'; - return outIdx; + return (int)outIdx; } /* @@ -12621,6 +13061,7 @@ * RFC22523 currently implemented. * XN_FLAG_DN_REV - print name reversed. Automatically done by * XN_FLAG_RFC2253. + * XN_FLAG_SPC_EQ - spaces before and after '=' character * * Returns WOLFSSL_SUCCESS (1) on success, WOLFSSL_FAILURE (0) on failure. */ @@ -12628,6 +13069,8 @@ int indent, unsigned long flags) { int i, count = 0, nameStrSz = 0, escapeSz = 0; + int eqSpace = 0; + char eqStr[4]; char* tmp = NULL; char* nameStr = NULL; const char *buf = NULL; @@ -12640,6 +13083,15 @@ if ((name == NULL) || (name->sz == 0) || (bio == NULL)) return WOLFSSL_FAILURE; + XMEMSET(eqStr, 0, sizeof(eqStr)); + if (flags & XN_FLAG_SPC_EQ) { + eqSpace = 2; + XSTRNCPY(eqStr, " = ", 4); + } + else { + XSTRNCPY(eqStr, "=", 4); + } + for (i = 0; i < indent; i++) { if (wolfSSL_BIO_write(bio, " ", 1) != 1) return WOLFSSL_FAILURE; @@ -12684,30 +13136,33 @@ if (len == 0 || buf == NULL) return WOLFSSL_FAILURE; - tmpSz = nameStrSz + len + 4; /* + 4 for '=', comma space and '\0'*/ + /* + 4 for '=', comma space and '\0'*/ + tmpSz = nameStrSz + len + 4 + eqSpace; tmp = (char*)XMALLOC(tmpSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (tmp == NULL) { return WOLFSSL_FAILURE; } if (i < count - 1) { - if (XSNPRINTF(tmp, tmpSz, "%s=%s, ", buf, nameStr) + if (XSNPRINTF(tmp, (size_t)tmpSz, "%s%s%s, ", buf, eqStr, nameStr) >= tmpSz) { WOLFSSL_MSG("buffer overrun"); + XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_FAILURE; } - tmpSz = len + nameStrSz + 3; /* 3 for '=', comma space */ + tmpSz = len + nameStrSz + 3 + eqSpace; /* 3 for '=', comma space */ } else { - if (XSNPRINTF(tmp, tmpSz, "%s=%s", buf, nameStr) + if (XSNPRINTF(tmp, (size_t)tmpSz, "%s%s%s", buf, eqStr, nameStr) >= tmpSz) { WOLFSSL_MSG("buffer overrun"); + XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_FAILURE; } - tmpSz = len + nameStrSz + 1; /* 1 for '=' */ + tmpSz = len + nameStrSz + 1 + eqSpace; /* 1 for '=' */ if (bio->type != WOLFSSL_BIO_FILE && bio->type != WOLFSSL_BIO_MEMORY) ++tmpSz; /* include the terminating null when not writing to a * file. @@ -12911,6 +13366,7 @@ unsigned int flags, char **peername) { int ret; + size_t i; #ifdef WOLFSSL_SMALL_STACK DecodedCert *dCert; #else @@ -12947,11 +13403,27 @@ #endif InitDecodedCert(dCert, x->derCert->buffer, x->derCert->length, NULL); - ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL); + ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL, NULL); if (ret != 0) { goto out; } + /* Replicate openssl behavior for checklen */ + if (chklen == 0) { + chklen = (size_t)(XSTRLEN(chk)); + } + else { + for (i = 0; i < (chklen > 1 ? chklen - 1 : chklen); i++) { + if (chk[i] == '\0') { + ret = -1; + goto out; + } + } + } + if (chklen > 1 && (chk[chklen - 1] == '\0')) { + chklen--; + } + ret = CheckHostName(dCert, (char *)chk, chklen); out: @@ -13002,7 +13474,7 @@ if (ret == WOLFSSL_SUCCESS) { InitDecodedCert(dCert, x->derCert->buffer, x->derCert->length, NULL); - ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL); + ret = ParseCertRelative(dCert, CERT_TYPE, 0, NULL, NULL); if (ret != 0) { ret = WOLFSSL_FAILURE; } @@ -13140,8 +13612,8 @@ #endif /* Use existing CA retrieval APIs that use DecodedCert. */ - InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, NULL); - if (ParseCertRelative(cert, CERT_TYPE, 0, NULL) == 0 + InitDecodedCert(cert, x->derCert->buffer, x->derCert->length, cm->heap); + if (ParseCertRelative(cert, CERT_TYPE, 0, NULL, NULL) == 0 && !cert->selfSigned) { #ifndef NO_SKID if (cert->extAuthKeyIdSet) @@ -13162,8 +13634,8 @@ #ifdef WOLFSSL_SIGNER_DER_CERT /* populate issuer with Signer DER */ - if (wolfSSL_X509_d2i(issuer, ca->derCert->buffer, - ca->derCert->length) == NULL) + if (wolfSSL_X509_d2i_ex(issuer, ca->derCert->buffer, + ca->derCert->length, cm->heap) == NULL) return WOLFSSL_FAILURE; #else /* Create an empty certificate as CA doesn't have a certificate. */ @@ -13258,7 +13730,8 @@ return NULL; } - return wolfSSL_X509_d2i(NULL, x->derCert->buffer, x->derCert->length); + return wolfSSL_X509_d2i_ex(NULL, x->derCert->buffer, x->derCert->length, + x->heap); } #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ @@ -13303,7 +13776,7 @@ if (x == NULL) return 0; - return oid2nid(x->sigOID, oidSigType); + return oid2nid((word32)x->sigOID, oidSigType); } #endif /* OPENSSL_EXTRA */ @@ -13487,10 +13960,20 @@ return WOLFSSL_SUCCESS; } +int wolfSSL_X509_set1_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME *t) +{ + return wolfSSL_X509_set_notAfter(x509, t); +} + +int wolfSSL_X509_set1_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME *t) +{ + return wolfSSL_X509_set_notBefore(x509, t); +} + int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, WOLFSSL_ASN1_INTEGER* s) { WOLFSSL_ENTER("wolfSSL_X509_set_serialNumber"); - if (!x509 || !s || s->length >= EXTERNAL_SERIAL_SIZE) + if (x509 == NULL || s == NULL || s->length >= EXTERNAL_SERIAL_SIZE) return WOLFSSL_FAILURE; /* WOLFSSL_ASN1_INTEGER has type | size | data @@ -13535,7 +14018,7 @@ if (p == NULL) return WOLFSSL_FAILURE; - if ((derSz = wc_RsaKeyToPublicDer(rsa, p, derSz)) <= 0) { + if ((derSz = wc_RsaKeyToPublicDer(rsa, p, (word32)derSz)) <= 0) { XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY); return WOLFSSL_FAILURE; } @@ -13559,7 +14042,7 @@ if (p == NULL) return WOLFSSL_FAILURE; - if ((derSz = wc_DsaKeyToPublicDer(dsa, p, derSz)) <= 0) { + if ((derSz = wc_DsaKeyToPublicDer(dsa, p, (word32)derSz)) <= 0) { XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY); return WOLFSSL_FAILURE; } @@ -13584,7 +14067,7 @@ if (p == NULL) return WOLFSSL_FAILURE; - if ((derSz = wc_EccPublicKeyToDer(ecc, p, derSz, 1)) <= 0) { + if ((derSz = wc_EccPublicKeyToDer(ecc, p, (word32)derSz, 1)) <= 0) { XFREE(p, cert->heap, DYNAMIC_TYPE_PUBLIC_KEY); return WOLFSSL_FAILURE; } @@ -13596,7 +14079,7 @@ return WOLFSSL_FAILURE; } cert->pubKey.buffer = p; - cert->pubKey.length = derSz; + cert->pubKey.length = (unsigned int)derSz; return WOLFSSL_SUCCESS; } @@ -13623,35 +14106,50 @@ { int ret = WOLFSSL_SUCCESS; WOLFSSL_ENTER("wolfSSL_X509V3_set_ctx"); - if (!ctx) - return; + if (!ctx) { + ret = WOLFSSL_FAILURE; + WOLFSSL_MSG("wolfSSL_X509V3_set_ctx() called with null ctx."); + } - /* not checking ctx->x509 for null first since app won't have initialized - * this X509V3_CTX before this function call */ - ctx->x509 = wolfSSL_X509_new(); - if (!ctx->x509) - return; + if (ret == WOLFSSL_SUCCESS && (ctx->x509 != NULL)) { + ret = WOLFSSL_FAILURE; + WOLFSSL_MSG("wolfSSL_X509V3_set_ctx() called " + "with ctx->x509 already allocated."); + } + + if (ret == WOLFSSL_SUCCESS) { + ctx->x509 = wolfSSL_X509_new_ex( + (issuer && issuer->heap) ? issuer->heap : + (subject && subject->heap) ? subject->heap : + (req && req->heap) ? req->heap : + NULL); + if (!ctx->x509) { + ret = WOLFSSL_FAILURE; + WOLFSSL_MSG("wolfSSL_X509_new_ex() failed " + "in wolfSSL_X509V3_set_ctx()."); + } + } /* Set parameters in ctx as long as ret == WOLFSSL_SUCCESS */ - if (issuer) + if (ret == WOLFSSL_SUCCESS && issuer) ret = wolfSSL_X509_set_issuer_name(ctx->x509,&issuer->issuer); - if (subject && ret == WOLFSSL_SUCCESS) + if (ret == WOLFSSL_SUCCESS && subject) ret = wolfSSL_X509_set_subject_name(ctx->x509,&subject->subject); - if (req && ret == WOLFSSL_SUCCESS) { + if (ret == WOLFSSL_SUCCESS && req) { WOLFSSL_MSG("req not implemented."); } - if (crl && ret == WOLFSSL_SUCCESS) { + if (ret == WOLFSSL_SUCCESS && crl) { WOLFSSL_MSG("crl not implemented."); } - if (flag && ret == WOLFSSL_SUCCESS) { + if (ret == WOLFSSL_SUCCESS && flag) { WOLFSSL_MSG("flag not implemented."); } - if (!ret) { + if (ret != WOLFSSL_SUCCESS) { WOLFSSL_MSG("Error setting WOLFSSL_X509V3_CTX parameters."); } } @@ -13786,7 +14284,7 @@ if (wolfssl_x509_make_der(x509, 1, der, &derSz, 0) == WOLFSSL_SUCCESS) { FreeDer(&x509->derCert); - if (AllocDer(&x509->derCert, derSz, CERT_TYPE, x509->heap) == 0) { + if (AllocDer(&x509->derCert, (word32)derSz, CERT_TYPE, x509->heap) == 0) { XMEMCPY(x509->derCert->buffer, der, derSz); ret = WOLFSSL_SUCCESS; } @@ -13970,6 +14468,10 @@ } } ret = wolfSSL_sk_push(req->reqAttributes, attr); + if ((ret != WOLFSSL_SUCCESS) || (req->reqAttributes->type == STACK_TYPE_CIPHER)) { + /* CIPHER type makes a copy */ + wolfSSL_X509_ATTRIBUTE_free(attr); + } } return ret; @@ -14121,7 +14623,7 @@ } #endif -#endif /* !NO_CERT */ +#endif /* !NO_CERTS */ #endif /* !WOLFCRYPT_ONLY */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/src/x509_str.c mariadb-10.11.9/extra/wolfssl/wolfssl/src/x509_str.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/src/x509_str.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/src/x509_str.c 2024-08-03 07:30:00.000000000 +0000 @@ -40,30 +40,63 @@ * START OF X509_STORE_CTX APIs ******************************************************************************/ -#ifdef OPENSSL_EXTRA - -WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void) +/* This API is necessary outside of OPENSSL_EXTRA because it is used in + * SetupStoreCtxCallback */ +WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new_ex(void* heap) { WOLFSSL_X509_STORE_CTX* ctx; - WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_new"); + WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_new_ex"); - ctx = (WOLFSSL_X509_STORE_CTX*)XMALLOC(sizeof(WOLFSSL_X509_STORE_CTX), NULL, + ctx = (WOLFSSL_X509_STORE_CTX*)XMALLOC(sizeof(WOLFSSL_X509_STORE_CTX), heap, DYNAMIC_TYPE_X509_CTX); if (ctx != NULL) { - ctx->param = NULL; + XMEMSET(ctx, 0, sizeof(WOLFSSL_X509_STORE_CTX)); + ctx->heap = heap; +#ifdef OPENSSL_EXTRA if (wolfSSL_X509_STORE_CTX_init(ctx, NULL, NULL, NULL) != WOLFSSL_SUCCESS) { - XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX); + XFREE(ctx, heap, DYNAMIC_TYPE_X509_CTX); ctx = NULL; } +#endif } return ctx; } +/* This API is necessary outside of OPENSSL_EXTRA because it is used in + * SetupStoreCtxCallback */ +/* free's extra data */ +void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx) +{ + WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_free"); + if (ctx != NULL) { +#ifdef HAVE_EX_DATA_CLEANUP_HOOKS + wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data); +#endif + +#ifdef OPENSSL_EXTRA + if (ctx->param != NULL) { + XFREE(ctx->param, ctx->heap, DYNAMIC_TYPE_OPENSSL); + ctx->param = NULL; + } +#endif + + XFREE(ctx, ctx->heap, DYNAMIC_TYPE_X509_CTX); + } +} + +#ifdef OPENSSL_EXTRA + +WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void) +{ + WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_new"); + return wolfSSL_X509_STORE_CTX_new_ex(NULL); +} int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx, - WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)* sk) + WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, + WOLF_STACK_OF(WOLFSSL_X509)* sk) { int ret = 0; (void)sk; @@ -75,8 +108,8 @@ ctx->current_cert = x509; #else if(x509 != NULL){ - ctx->current_cert = wolfSSL_X509_d2i(NULL, x509->derCert->buffer, - x509->derCert->length); + ctx->current_cert = wolfSSL_X509_d2i_ex(NULL, x509->derCert->buffer, + x509->derCert->length, x509->heap); if(ctx->current_cert == NULL) return WOLFSSL_FAILURE; } else @@ -84,16 +117,40 @@ #endif ctx->chain = sk; - /* Add intermediate certificates from stack to store */ - while (sk != NULL) { - WOLFSSL_X509* x509_cert = sk->data.x509; - if (x509_cert != NULL && x509_cert->isCa) { - ret = wolfSSL_X509_STORE_add_cert(store, x509_cert); - if (ret < 0) { - return WOLFSSL_FAILURE; + /* Add intermediate certs, that verify to a loaded CA, to the store */ + if (sk != NULL) { + byte addedAtLeastOne = 1; + WOLF_STACK_OF(WOLFSSL_X509)* head = wolfSSL_shallow_sk_dup(sk); + if (head == NULL) + return WOLFSSL_FAILURE; + while (addedAtLeastOne) { + WOLF_STACK_OF(WOLFSSL_X509)* cur = head; + WOLF_STACK_OF(WOLFSSL_X509)** prev = &head; + addedAtLeastOne = 0; + while (cur) { + WOLFSSL_X509* cert = cur->data.x509; + if (cert != NULL && cert->derCert != NULL && + wolfSSL_CertManagerVerifyBuffer(store->cm, + cert->derCert->buffer, + cert->derCert->length, + WOLFSSL_FILETYPE_ASN1) == WOLFSSL_SUCCESS) { + ret = wolfSSL_X509_STORE_add_cert(store, cert); + if (ret < 0) { + wolfSSL_sk_free(head); + return WOLFSSL_FAILURE; + } + addedAtLeastOne = 1; + *prev = cur->next; + wolfSSL_sk_free_node(cur); + cur = *prev; + } + else { + prev = &cur->next; + cur = cur->next; + } } } - sk = sk->next; + wolfSSL_sk_free(head); } ctx->sesChain = NULL; @@ -109,11 +166,12 @@ if (ctx->param == NULL) { ctx->param = (WOLFSSL_X509_VERIFY_PARAM*)XMALLOC( sizeof(WOLFSSL_X509_VERIFY_PARAM), - NULL, DYNAMIC_TYPE_OPENSSL); + ctx->heap, DYNAMIC_TYPE_OPENSSL); if (ctx->param == NULL){ WOLFSSL_MSG("wolfSSL_X509_STORE_CTX_init failed"); return WOLFSSL_FAILURE; } + XMEMSET(ctx->param, 0, sizeof(*ctx->param)); } return WOLFSSL_SUCCESS; @@ -121,32 +179,15 @@ return WOLFSSL_FAILURE; } - -/* free's extra data */ -void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx) -{ - WOLFSSL_ENTER("wolfSSL_X509_STORE_CTX_free"); - if (ctx != NULL) { -#ifdef HAVE_EX_DATA_CLEANUP_HOOKS - wolfSSL_CRYPTO_cleanup_ex_data(&ctx->ex_data); -#endif - - if (ctx->param != NULL) { - XFREE(ctx->param, NULL, DYNAMIC_TYPE_OPENSSL); - ctx->param = NULL; - } - - XFREE(ctx, NULL, DYNAMIC_TYPE_X509_CTX); - } -} - - +/* Its recommended to use a full free -> init cycle of all the objects + * because wolfSSL_X509_STORE_CTX_init may modify the store too which doesn't + * get reset here. */ void wolfSSL_X509_STORE_CTX_cleanup(WOLFSSL_X509_STORE_CTX* ctx) { if (ctx != NULL) { if (ctx->param != NULL) { - XFREE(ctx->param, NULL, DYNAMIC_TYPE_OPENSSL); + XFREE(ctx->param, ctx->heap, DYNAMIC_TYPE_OPENSSL); ctx->param = NULL; } @@ -167,22 +208,30 @@ int GetX509Error(int e) { switch (e) { - case ASN_BEFORE_DATE_E: - return WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD; - case ASN_AFTER_DATE_E: - return WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD; - case ASN_NO_SIGNER_E: /* get issuer error if no CA found locally */ + case WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E): + return WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID; + case WC_NO_ERR_TRACE(ASN_AFTER_DATE_E): + return WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED; + case WC_NO_ERR_TRACE(ASN_NO_SIGNER_E): + /* get issuer error if no CA found locally */ return WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY; - case ASN_SELF_SIGNED_E: + case WC_NO_ERR_TRACE(ASN_SELF_SIGNED_E): return WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT; - case ASN_PATHLEN_INV_E: - case ASN_PATHLEN_SIZE_E: + case WC_NO_ERR_TRACE(ASN_PATHLEN_INV_E): + case WC_NO_ERR_TRACE(ASN_PATHLEN_SIZE_E): return WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED; - case ASN_SIG_OID_E: - case ASN_SIG_CONFIRM_E: - case ASN_SIG_HASH_E: - case ASN_SIG_KEY_E: + case WC_NO_ERR_TRACE(ASN_SIG_OID_E): + case WC_NO_ERR_TRACE(ASN_SIG_CONFIRM_E): + case WC_NO_ERR_TRACE(ASN_SIG_HASH_E): + case WC_NO_ERR_TRACE(ASN_SIG_KEY_E): return WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE; + case WC_NO_ERR_TRACE(CRL_CERT_REVOKED): + return WOLFSSL_X509_V_ERR_CERT_REVOKED; + case WC_NO_ERR_TRACE(CRL_MISSING): + return X509_V_ERR_UNABLE_TO_GET_CRL; + case 0: + case 1: + return 0; default: #ifdef HAVE_WOLFSSL_MSG_EX WOLFSSL_MSG_EX("Error not configured or implemented yet: %d", e); @@ -193,6 +242,19 @@ } } +static void SetupStoreCtxError(WOLFSSL_X509_STORE_CTX* ctx, int ret) +{ + int depth = 0; + int error = GetX509Error(ret); + + /* Set error depth */ + if (ctx->chain) + depth = (int)ctx->chain->num; + + wolfSSL_X509_STORE_CTX_set_error(ctx, error); + wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth); +} + /* Verifies certificate chain using WOLFSSL_X509_STORE_CTX * returns 0 on success or < 0 on failure. */ @@ -202,66 +264,40 @@ if (ctx != NULL && ctx->store != NULL && ctx->store->cm != NULL && ctx->current_cert != NULL && ctx->current_cert->derCert != NULL) { - int ret = 0; - int depth = 0; - int error; - #ifndef NO_ASN_TIME - byte *afterDate, *beforeDate; - #endif - - ret = wolfSSL_CertManagerVerifyBuffer(ctx->store->cm, + int ret = wolfSSL_CertManagerVerifyBuffer(ctx->store->cm, ctx->current_cert->derCert->buffer, ctx->current_cert->derCert->length, WOLFSSL_FILETYPE_ASN1); - /* If there was an error, process it and add it to CTX */ - if (ret < 0) { - /* Get corresponding X509 error */ - error = GetX509Error(ret); - /* Set error depth */ - if (ctx->chain) - depth = (int)ctx->chain->num; - - wolfSSL_X509_STORE_CTX_set_error(ctx, error); - wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth); - #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - if (ctx->store && ctx->store->verify_cb) - ctx->store->verify_cb(0, ctx); - #endif - } + SetupStoreCtxError(ctx, ret); #ifndef NO_ASN_TIME - error = 0; - /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or - ASN_BEFORE_DATE_E if there are no additional errors found in the - cert. Therefore, check if the cert is expired or not yet valid - in order to return the correct expected error. */ - afterDate = ctx->current_cert->notAfter.data; - beforeDate = ctx->current_cert->notBefore.data; - - if (XVALIDATE_DATE(afterDate, (byte)ctx->current_cert->notAfter.type, - AFTER) < 1) { - error = WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED; - } - else if (XVALIDATE_DATE(beforeDate, - (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) { - error = WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID; - } - - if (error != 0 ) { - wolfSSL_X509_STORE_CTX_set_error(ctx, error); - wolfSSL_X509_STORE_CTX_set_error_depth(ctx, depth); - #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - if (ctx->store && ctx->store->verify_cb) - ctx->store->verify_cb(0, ctx); - #endif + if (ret != WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E) && + ret != WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) { + /* wolfSSL_CertManagerVerifyBuffer only returns ASN_AFTER_DATE_E or + ASN_BEFORE_DATE_E if there are no additional errors found in the + cert. Therefore, check if the cert is expired or not yet valid + in order to return the correct expected error. */ + byte *afterDate = ctx->current_cert->notAfter.data; + byte *beforeDate = ctx->current_cert->notBefore.data; + + if (XVALIDATE_DATE(afterDate, + (byte)ctx->current_cert->notAfter.type, AFTER) < 1) { + ret = ASN_AFTER_DATE_E; + } + else if (XVALIDATE_DATE(beforeDate, + (byte)ctx->current_cert->notBefore.type, BEFORE) < 1) { + ret = ASN_BEFORE_DATE_E; + } + SetupStoreCtxError(ctx, ret); } #endif - /* OpenSSL returns 0 when a chain can't be built */ - if (ret == ASN_NO_SIGNER_E) - return WOLFSSL_FAILURE; - else - return ret; + #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) + if (ctx->store && ctx->store->verify_cb) + ret = ctx->store->verify_cb(ret >= 0 ? 1 : 0, ctx) == 1 ? 0 : -1; + #endif + + return ret >= 0 ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; } return WOLFSSL_FATAL_ERROR; } @@ -486,39 +522,19 @@ /* if chain is null but sesChain is available then populate stack */ if (ctx->chain == NULL && ctx->sesChain != NULL) { int i; + int error = 0; WOLFSSL_X509_CHAIN* c = ctx->sesChain; - WOLFSSL_STACK* sk = (WOLFSSL_STACK*)XMALLOC(sizeof(WOLFSSL_STACK), - NULL, DYNAMIC_TYPE_X509); + WOLFSSL_STACK* sk = wolfSSL_sk_new_node(ctx->heap); - if (sk == NULL) { + if (sk == NULL) return NULL; - } - - XMEMSET(sk, 0, sizeof(WOLFSSL_STACK)); - - for (i = 0; i < c->count && i < MAX_CHAIN_DEPTH; i++) { - WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, i); - - if (x509 == NULL) { - WOLFSSL_MSG("Unable to get x509 from chain"); - wolfSSL_sk_X509_pop_free(sk, NULL); - return NULL; - } - - if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Unable to load x509 into stack"); - wolfSSL_sk_X509_pop_free(sk, NULL); - wolfSSL_X509_free(x509); - return NULL; - } - } #if defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) /* add CA used to verify top of chain to the list */ if (c->count > 0) { WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, c->count - 1); + WOLFSSL_X509* issuer = NULL; if (x509 != NULL) { - WOLFSSL_X509* issuer = NULL; if (wolfSSL_X509_STORE_CTX_get1_issuer(&issuer, ctx, x509) == WOLFSSL_SUCCESS) { /* check that the certificate being looked up is not self @@ -527,23 +543,47 @@ &x509->subject) != 0) { if (wolfSSL_sk_X509_push(sk, issuer) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("Unable to load CA x509 into stack"); - wolfSSL_sk_X509_pop_free(sk, NULL); - wolfSSL_X509_free(issuer); - return NULL; + error = 1; } } else { WOLFSSL_MSG("Certificate is self signed"); - if (issuer != NULL) - wolfSSL_X509_free(issuer); + wolfSSL_X509_free(issuer); } } else { WOLFSSL_MSG("Could not find CA for certificate"); } } + wolfSSL_X509_free(x509); + if (error) { + wolfSSL_sk_X509_pop_free(sk, NULL); + wolfSSL_X509_free(issuer); + return NULL; + } } #endif + + for (i = c->count - 1; i >= 0; i--) { + WOLFSSL_X509* x509 = wolfSSL_get_chain_X509(c, i); + + if (x509 == NULL) { + WOLFSSL_MSG("Unable to get x509 from chain"); + error = 1; + break; + } + + if (wolfSSL_sk_X509_push(sk, x509) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Unable to load x509 into stack"); + wolfSSL_X509_free(x509); + error = 1; + break; + } + } + if (error) { + wolfSSL_sk_X509_pop_free(sk, NULL); + return NULL; + } ctx->chain = sk; } #endif /* SESSION_CERTS */ @@ -592,6 +632,14 @@ } #endif +WOLFSSL_X509_VERIFY_PARAM *wolfSSL_X509_STORE_CTX_get0_param( + WOLFSSL_X509_STORE_CTX *ctx) +{ + if (ctx == NULL) + return NULL; + + return ctx->param; +} #endif /* OPENSSL_EXTRA */ @@ -916,14 +964,33 @@ #ifdef OPENSSL_EXTRA #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) - void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st, - WOLFSSL_X509_STORE_CTX_verify_cb verify_cb) - { - WOLFSSL_ENTER("wolfSSL_X509_STORE_set_verify_cb"); - if (st != NULL) { - st->verify_cb = verify_cb; - } +void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st, + WOLFSSL_X509_STORE_CTX_verify_cb verify_cb) +{ + WOLFSSL_ENTER("wolfSSL_X509_STORE_set_verify_cb"); + if (st != NULL) { + st->verify_cb = verify_cb; + } +} + +void wolfSSL_X509_STORE_set_get_crl(WOLFSSL_X509_STORE *st, + WOLFSSL_X509_STORE_CTX_get_crl_cb get_cb) +{ + WOLFSSL_ENTER("wolfSSL_X509_STORE_set_get_crl"); + if (st != NULL) { + st->get_crl_cb = get_cb; } +} + +#ifndef NO_WOLFSSL_STUB +void wolfSSL_X509_STORE_set_check_crl(WOLFSSL_X509_STORE *st, + WOLFSSL_X509_STORE_CTX_check_crl_cb check_crl) +{ + (void)st; + (void)check_crl; + WOLFSSL_STUB("wolfSSL_X509_STORE_set_check_crl (not implemented)"); +} +#endif #endif /* WOLFSSL_QT || OPENSSL_ALL */ WOLFSSL_X509_LOOKUP* wolfSSL_X509_STORE_add_lookup(WOLFSSL_X509_STORE* store, @@ -980,7 +1047,11 @@ if ((flag & WOLFSSL_CRL_CHECKALL) || (flag & WOLFSSL_CRL_CHECK)) { ret = wolfSSL_CertManagerEnableCRL(store->cm, (int)flag); } - +#if defined(OPENSSL_COMPATIBLE_DEFAULTS) + else if (flag == 0) { + ret = wolfSSL_CertManagerDisableCRL(store->cm); + } +#endif return ret; } @@ -1014,7 +1085,7 @@ return WOLFSSL_FAILURE; /* tmp ctx for setting our cert manager */ - ctx = wolfSSL_CTX_new(cm_pick_method()); + ctx = wolfSSL_CTX_new_ex(cm_pick_method(str->cm->heap), str->cm->heap); if (ctx == NULL) return WOLFSSL_FAILURE; @@ -1023,7 +1094,11 @@ #ifdef HAVE_CRL if (str->cm->crl == NULL) { - if (wolfSSL_CertManagerEnableCRL(str->cm, 0) != WOLFSSL_SUCCESS) { + /* Workaround to allocate the internals to load CRL's but don't enable + * CRL checking by default */ + if (wolfSSL_CertManagerEnableCRL(str->cm, WOLFSSL_CRL_CHECK) + != WOLFSSL_SUCCESS || + wolfSSL_CertManagerDisableCRL(str->cm) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("Enable CRL failed"); wolfSSL_CTX_free(ctx); return WOLFSSL_FAILURE; @@ -1301,6 +1376,17 @@ } #endif /* OPENSSL_ALL */ +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) || \ + defined(WOLFSSL_WPAS_SMALL) +WOLFSSL_X509_VERIFY_PARAM *wolfSSL_X509_STORE_get0_param( + const WOLFSSL_X509_STORE *ctx) +{ + if (ctx == NULL) + return NULL; + return ctx->param; +} +#endif + /******************************************************************************* * END OF X509_STORE APIs ******************************************************************************/ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -39,13 +39,17 @@ `./configure --enable-sniffer CPPFLAGS=-DSTARTTLS_ALLOWED` +The SSL Keylog file option enables the sniffer to decrypt TLS traffic using the master secret obtained from a [NSS keylog file](https://web.archive.org/web/20220531072242/https://firefox-source-docs.mozilla.org/security/nss/legacy/key_log_format/index.html). This allows the sniffer to decrypt all TLS traffic, even for TLS connections using ephemeral cipher suites. Keylog file sniffing is supported for TLS versions 1.2 and 1.3. WolfSSL can be configured to export a keylog file using the `--enable-keylog-export` configure option, independently from the sniffer feature (NOTE: never do this in a production environment, as it is inherently insecure). To enable sniffer support for keylog files, use the following configure command line and build as before: + +`./configure --enable-sniffer CPPFLAGS=-DWOLFSSL_SNIFFER_KEYLOGFILE` + All options may be enabled with the following configure command line: ```sh ./configure --enable-sniffer \ CPPFLAGS="-DWOLFSSL_SNIFFER_STATS -DWOLFSSL_SNIFFER_WATCH \ -DWOLFSSL_SNIFFER_STORE_DATA_CB -DWOLFSSL_SNIFFER_CHAIN_INPUT \ - -DSTARTTLS_ALLOWED" + -DSTARTTLS_ALLOWED -DWOLFSSL_SNIFFER_KEYLOGFILE" ``` To add some other cipher support to the sniffer, you can add options like: @@ -88,7 +92,11 @@ ## Command Line Options -The wolfSSL sniffer includes a test application `snifftest` in the `sslSniffer/sslSnifferTest/` directory. The command line application has several options that can be passed in at runtime to change the default behavior of the application. To execute a “live†sniff just run the application without any parameters and then pick an interface to sniff on followed by the port. +The wolfSSL sniffer includes a test application `snifftest` in the `sslSniffer/sslSnifferTest/` directory. The command line application has two sniffing modes: "live" mode and "offline" mode. In "live" mode, the application will prompt the user for network information and other parameters and then actively sniff real network traffic on an interface. In "offline" mode, the user provides the application with a pcap file and other network information via command line arguments, and the sniffer +will then decrypt the relevant TLS traffic captured in the pcap file. + +### Live Sniff Mode +To execute a “live†sniff just run the application without any parameters and then pick an interface to sniff on followed by the port. An example startup may look like this: @@ -116,41 +124,50 @@ Trace output will be written to a file named `tracefile.txt`. -To decode a previously saved pcap file you will need to enter a few parameters. +### Offline Sniff Mode + +Offline mode allows traffic to be decoded from a previously saved pcap file. To run the sniffer in offline mode, you will need to provide the application with some command line arguments, some of which are mandatory and some of which are optional -The following table lists the accepted inputs in saved file mode. +The following table lists the accepted inputs in offline mode. Synopsis: -`snifftest dumpFile pemKey [server] [port] [password] [threads]` +`snifftest -pcap pcap_arg -key key_arg [-password password_arg] [-server server_arg] [-port port_arg] [-keylogfile keylogfile_arg] [-threads threads_arg]` `snifftest` Options Summary: ``` -Option Description Default Value -dumpFile A previously saved pcap file NA -pemKey The server’s private key in PEM format NA -server The server’s IP address (v4 or v6) 127.0.0.1 -port The server port to sniff 443 -password Private Key Password if required NA -threads The number of threads to run with 5 +Option Description Default Value Mandatory +pcap_arg A previously saved pcap file NA Y +key_arg The server’s private key in PEM format NA Y +password_arg Private Key Password if required NA N +server_arg The server’s IP address (v4 or v6) 127.0.0.1 N +port_arg The server port to sniff 443 N +threads The number of threads to run with 5 N +keylogfile_arg Keylog file containing decryption secrets NA N ``` To decode a pcap file named test.pcap with a server key file called myKey.pem that was generated on the localhost with a server at port 443 just use: -`./snifftest test.pcap myKey.pem` +`./snifftest -pcap test.pcap -key myKey.pem` If the server was on 10.0.1.2 and on port 12345 you could instead use: -`./snifftest test.pcap myKey.pem 10.0.1.2 12345` +`./snifftest -pcap test.pcap -key myKey.pem -server 10.0.1.2 -port 12345` If the server was on localhost using IPv6 and on port 12345 you could instead use: -`./snifftest test.pcap myKey.pem ::1 12345` +`./snifftest -pcap test.pcap -key myKey.pem -server ::1 -port 12345` If you wanted to use 15 threads to decode `test.pcap` and your key does not require a password, you could use a dummy password and run: -`./snifftest test.pcap myKey.pem 10.0.1.2 12345 pass 15` +`./snifftest -pcap test.pcap -key myKey.pem -server 10.0.1.2 -port 12345 -password pass -threads 15` + +If the server exported its secrets in a [NSS keylog file](https://web.archive.org/web/20220531072242/https://firefox-source-docs.mozilla.org/security/nss/legacy/key_log_format/index.html) +named "sslkeylog.log", you could decrypt the traffic using: + +`./snifftest -pcap test.pcap -key myKey.pem -server 10.0.1.2 -port 12345 -keylogfile /path/to/sslkeylog.log` + ## API Usage @@ -164,7 +181,7 @@ void ssl_InitSniffer(void); ``` -Initializes the wolfSSL sniffer for use and should be called once per application. +Initializes the wolfSSL sniffer for use and should be called once per application. ### ssl_FreeSniffer @@ -285,8 +302,8 @@ ### ssl_SetEphemeralKey ```c -int ssl_SetEphemeralKey(const char* address, int port, - const char* keyFile, int typeKey, +int ssl_SetEphemeralKey(const char* address, int port, + const char* keyFile, int typeKey, const char* password, char* error) ``` Creates a sniffer session based on the `serverAddress` and `port` inputs using ECC or DH static ephemeral key. @@ -300,6 +317,35 @@ * 0 on success * -1 if a problem occurred, the string error will hold a message describing the problem +### ssl_LoadSecretsFromKeyLogFile + +```c +int ssl_LoadSecretsFromKeyLogFile(const char* keylogfile, char* error) +``` + +Loads secrets to decrypt TLS traffic from a keylog file. Only sniffer servers registered with `ssl_createKeyLogSnifferServer()` will be able to decrypt using these secrets + +This function requires that sniffer keylog file support (`WOLFSSL_SNIFFER_KEYLOGFILE`) is enabled in the build. Keylog file sniffing is supported for TLS versions 1.2 and 1.3. + +Return Values: +* 0 on success +* -1 if a problem occurred, the string error will hold a message describing the problem + +### ssl_CreateKeyLogSnifferServer + +```c +int ssl_CreateKeyLogSnifferServer(const char* address, int port, char* error) +``` + +Creates a sniffer session based on `serverAddress` and `port`, and uses secrets obtained from a keylog file to decrypt traffic. Keylog files should be loaded using `ssl_LoadSecretsFromKeyLogFile()`. + +This function requires that sniffer keylog file support (`WOLFSSL_SNIFFER_KEYLOGFILE`) is enabled in the build. Keylog file sniffing is supported for TLS versions 1.2 and 1.3. + +Return Values: +* 0 on success +* -1 if a problem occurred, the string error will hold a message describing the problem + + ### ssl_DecodePacket ```c @@ -525,7 +571,7 @@ ### ssl_SetWatchKey_buffer ```c -int ssl_SetWatchKey_buffer(void* vSniffer, const unsigned char* key, +int ssl_SetWatchKey_buffer(void* vSniffer, const unsigned char* key, unsigned int keySz, int keyType, char* error); ``` @@ -633,7 +679,7 @@ ### Cipher Suite Limitations -As a passive sniffer the wolfSSL sniffer will not be able to decode any SSL session that uses DHE (Ephemeral Diffie-Hellman) because it will not have access to the temporary key that the server generates. You may need to disable DHE cipher suites on the server and/or client to prevent these cipher suites from being used. +As a passive sniffer the wolfSSL sniffer will not be able to decode any SSL session that uses DHE (Ephemeral Diffie-Hellman) because it will not have access to the temporary key that the server generates. You may need to disable DHE cipher suites on the server and/or client to prevent these cipher suites from being used. The notable exception to this is if the sniffer session uses the keylog file feature, in which case any session using TLS 1.2 or 1.3 can be decoded. ### Thread Safety diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcproj 2024-08-03 07:30:00.000000000 +0000 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../;../IDE/WIN" - PreprocessorDefinitions="WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -118,7 +118,7 @@ Optimization="2" EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="../;../IDE/WIN" - PreprocessorDefinitions="WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSniffer.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -89,7 +89,7 @@ Disabled ../;../IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -109,7 +109,7 @@ Disabled ../;../IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -128,7 +128,7 @@ MaxSpeed true ../;../IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -150,7 +150,7 @@ MaxSpeed true ../;../IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;SSL_SNIFFER_EXPORTS;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/sslSnifferTest/snifftest.c mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSnifferTest/snifftest.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/sslSniffer/sslSnifferTest/snifftest.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/sslSniffer/sslSnifferTest/snifftest.c 2024-08-03 07:30:00.000000000 +0000 @@ -76,7 +76,7 @@ #include /* signal */ #include /* isprint */ -#include +#include #ifndef _WIN32 @@ -144,6 +144,8 @@ #endif #endif +#define DEFAULT_SERVER_IP "127.0.0.1" +#define DEFAULT_SERVER_PORT (443) #ifdef WOLFSSL_SNIFFER_WATCH static const byte rsaHash[] = { @@ -470,20 +472,12 @@ #ifdef WOLFSSL_STATIC_DH "dh_static " #endif + #ifdef WOLFSSL_SNIFFER_KEYLOGFILE + "ssl_keylog_file " + #endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ "\n\n" ); } -static void show_usage(void) -{ - printf("usage:\n"); - printf("\t./snifftest\n"); - printf("\t\tprompts for options\n"); -#ifdef THREADED_SNIFFTEST - printf("\t./snifftest dump pemKey [server] [port] [password] [threads]\n"); -#else - printf("\t./snifftest dump pemKey [server] [port] [password]\n"); -#endif -} typedef struct SnifferPacket { byte* packet; @@ -955,7 +949,6 @@ int ret = 0; int hadBadPacket = 0; int inum = 0; - int port = 0; int saveFile = 0; int i = 0, defDev = 0; int packetNumber = 0; @@ -963,9 +956,13 @@ char err[PCAP_ERRBUF_SIZE]; char filter[32]; const char *keyFilesSrc = NULL; +#ifdef WOLFSSL_SNIFFER_KEYLOGFILE + const char *sslKeyLogFile = NULL; +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ char keyFilesBuf[MAX_FILENAME_SZ]; char keyFilesUser[MAX_FILENAME_SZ]; - const char *server = NULL; + const char *server = DEFAULT_SERVER_IP; + int port = DEFAULT_SERVER_PORT; const char *sniName = NULL; const char *passwd = NULL; pcap_if_t *d; @@ -977,18 +974,13 @@ workerThreadCount = 1; #else workerThreadCount = 5; - if (argc >= 7) - workerThreadCount = XATOI(argv[6]); #endif - SnifferWorker workers[workerThreadCount]; - int used[workerThreadCount]; #endif show_appinfo(); signal(SIGINT, sig_handler); - #ifndef THREADED_SNIFFTEST #ifndef _WIN32 ssl_InitSniffer(); /* dll load on Windows */ @@ -1140,51 +1132,117 @@ } } } - else if (argc >= 3) { - saveFile = 1; - pcap = pcap_open_offline(argv[1], err); - if (pcap == NULL) { - printf("pcap_open_offline failed %s\n", err); - ret = -1; + else { + char *pcapFile = NULL; + + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-pcap") == 0 && i + 1 < argc) { + pcapFile = argv[++i]; + } + else if (strcmp(argv[i], "-key") == 0 && i + 1 < argc) { + keyFilesSrc = argv[++i]; + } + else if (strcmp(argv[i], "-server") == 0 && i + 1 < argc) { + server = argv[++i]; + } + else if (strcmp(argv[i], "-port") == 0 && i + 1 < argc) { + port = XATOI(argv[++i]); + } + else if (strcmp(argv[i], "-password") == 0 && i + 1 < argc) { + passwd = argv[++i]; + } +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + else if (strcmp(argv[i], "-keylogfile") == 0 && i + 1 < argc) { + sslKeyLogFile = argv[++i]; + } +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ +#if defined(THREADED_SNIFFTEST) + else if (strcmp(argv[i], "-threads") == 0 && i + 1 < argc) { + workerThreadCount = XATOI(argv[++i]); + } +#endif /* THREADED_SNIFFTEST */ + else { + fprintf(stderr, "Invalid option or missing argument: %s\n", argv[i]); + fprintf(stderr, "Usage: %s -pcap pcap_arg -key key_arg" + " [-password password_arg] [-server server_arg] [-port port_arg]" +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + " [-keylogfile keylogfile_arg]" +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ +#if defined(THREADED_SNIFFTEST) + " [-threads threads_arg]" +#endif /* THREADED_SNIFFTEST */ + "\n", argv[0]); + exit(EXIT_FAILURE); + } } - else { - /* defaults for server and port */ - port = 443; - server = "127.0.0.1"; - keyFilesSrc = argv[2]; - if (argc >= 4) - server = argv[3]; + if (!pcapFile) { + fprintf(stderr, "Error: -pcap option is required.\n"); + exit(EXIT_FAILURE); + } - if (argc >= 5) - port = XATOI(argv[4]); +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + /* If we offer keylog support, then user must provide EITHER a pubkey + * OR a keylog file but NOT both */ + if ((!keyFilesSrc && !sslKeyLogFile) || (keyFilesSrc && sslKeyLogFile)) { + fprintf(stderr, "Error: either -key OR -keylogfile option required but NOT both.\n"); + exit(EXIT_FAILURE); + } +#else + if (!keyFilesSrc) { + fprintf(stderr, "Error: -key option is required.\n"); + exit(EXIT_FAILURE); + } +#endif - if (argc >= 6) - passwd = argv[5]; + saveFile = 1; + pcap = pcap_open_offline(pcapFile , err); + if (pcap == NULL) { + fprintf(stderr, "pcap_open_offline failed %s\n", err); + err_sys(err); + } + else { +#if defined(WOLFSSL_SNIFFER_KEYLOGFILE) + if (sslKeyLogFile != NULL) { + ret = ssl_LoadSecretsFromKeyLogFile(sslKeyLogFile, err); + if (ret != 0) { + fprintf(stderr, "ERROR=%d, unable to load secrets from keylog file\n",ret); + err_sys(err); + } - ret = load_key(NULL, server, port, keyFilesSrc, passwd, err); - if (ret != 0) { - exit(EXIT_FAILURE); + ret = ssl_CreateKeyLogSnifferServer(server, port, err); + if (ret != 0) { + fprintf(stderr, "ERROR=%d, unable to create keylog sniffer server\n",ret); + err_sys(err); + } + } + else +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ + { + ret = load_key(NULL, server, port, keyFilesSrc, passwd, err); + if (ret != 0) { + fprintf(stderr, "Failed to load key\n"); + err_sys(err); + } } + /* Only let through TCP/IP packets */ ret = pcap_compile(pcap, &pcap_fp, "(ip6 or ip) and tcp", 0, 0); if (ret != 0) { - printf("pcap_compile failed %s\n", pcap_geterr(pcap)); + fprintf(stderr, "pcap_compile failed %s\n", pcap_geterr(pcap)); exit(EXIT_FAILURE); } ret = pcap_setfilter(pcap, &pcap_fp); if (ret != 0) { - printf("pcap_setfilter failed %s\n", pcap_geterr(pcap)); + fprintf(stderr, "pcap_setfilter failed %s\n", pcap_geterr(pcap)); exit(EXIT_FAILURE); } + + } } - else { - show_usage(); - exit(EXIT_FAILURE); - } if (ret != 0) err_sys(err); @@ -1193,6 +1251,9 @@ frame = NULL_IF_FRAME_LEN; #ifdef THREADED_SNIFFTEST + SnifferWorker workers[workerThreadCount]; + int used[workerThreadCount]; + XMEMSET(used, 0, sizeof(used)); XMEMSET(&workers, 0, sizeof(workers)); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/support/gen-debug-trace-error-codes.sh mariadb-10.11.9/extra/wolfssl/wolfssl/support/gen-debug-trace-error-codes.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/support/gen-debug-trace-error-codes.sh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/support/gen-debug-trace-error-codes.sh 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,32 @@ +#!/bin/sh + +awk ' +BEGIN { + print("/* automatically generated, do not edit */") > "wolfssl/debug-trace-error-codes.h"; + print("#ifndef WOLFSSL_DEBUG_TRACE_ERROR_CODES_H") >> "wolfssl/debug-trace-error-codes.h"; + print("#define WOLFSSL_DEBUG_TRACE_ERROR_CODES_H") >> "wolfssl/debug-trace-error-codes.h"; + print("") >> "wolfssl/debug-trace-error-codes.h"; + + print("/* automatically generated, do not edit */") > "wolfssl/debug-untrace-error-codes.h"; + print("#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES_H") >> "wolfssl/debug-untrace-error-codes.h"; + print("#undef WOLFSSL_DEBUG_TRACE_ERROR_CODES_H") >> "wolfssl/debug-untrace-error-codes.h"; +} +{ + if (match($0, "^[[:space:]]+([A-Z][A-Z0-9_]+)[[:space:]]*=[[:space:]]*(-[0-9]+)[,[:space:]]", errcode_a)) { + if ((errcode_a[1] == "MIN_CODE_E") || + (errcode_a[1] == "WC_LAST_E") || + (errcode_a[1] == "MAX_CODE_E")) + { + next; + } + printf("#define %s WC_ERR_TRACE(%s)\n#define CONST_NUM_ERR_%s (%s)\n", errcode_a[1], errcode_a[1], errcode_a[1], errcode_a[2]) >> "wolfssl/debug-trace-error-codes.h"; + printf("#undef %s\n#undef CONST_NUM_ERR_%s\n", errcode_a[1], errcode_a[1]) >> "wolfssl/debug-untrace-error-codes.h"; + } +} +END { + print("") >> "wolfssl/debug-trace-error-codes.h"; + print("#endif /* WOLFSSL_DEBUG_TRACE_ERROR_CODES_H */") >> "wolfssl/debug-trace-error-codes.h"; + + print("") >> "wolfssl/debug-untrace-error-codes.h"; + print("#endif /* WOLFSSL_DEBUG_TRACE_ERROR_CODES_H */") >> "wolfssl/debug-untrace-error-codes.h"; +}' wolfssl/wolfcrypt/error-crypt.h wolfssl/error-ssl.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/support/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/support/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/support/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/support/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -2,7 +2,8 @@ # All paths should be given relative to the root # -EXTRA_DIST += support/wolfssl.pc +EXTRA_DIST += support/wolfssl.pc \ + support/gen-debug-trace-error-codes.sh pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = support/wolfssl.pc diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/support/wolfssl.pc.in mariadb-10.11.9/extra/wolfssl/wolfssl/support/wolfssl.pc.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/support/wolfssl.pc.in 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/support/wolfssl.pc.in 2024-08-03 07:30:00.000000000 +0000 @@ -7,4 +7,5 @@ Description: wolfssl C library. Version: @VERSION@ Libs: -L${libdir} -lwolfssl +Libs.private: @LIBM@ Cflags: -I${includedir} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/api.c mariadb-10.11.9/extra/wolfssl/wolfssl/tests/api.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/api.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/api.c 2024-08-03 07:30:00.000000000 +0000 @@ -47,6 +47,20 @@ #endif #if defined(WOLFSSL_STATIC_MEMORY) #include + +#if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFCRYPT_ONLY) + #if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) || \ + defined(SESSION_CERTS) + #ifdef OPENSSL_EXTRA + #define TEST_TLS_STATIC_MEMSZ (400000) + #else + #define TEST_TLS_STATIC_MEMSZ (320000) + #endif + #else + #define TEST_TLS_STATIC_MEMSZ (80000) + #endif +#endif + #endif /* WOLFSSL_STATIC_MEMORY */ #ifndef HEAP_HINT #define HEAP_HINT NULL @@ -123,6 +137,9 @@ #if !defined(DER_SZ) #define DER_SZ(ks) ((ks) * 2 + 1) #endif + #ifdef WOLFSSL_SM2 + #include + #endif #endif #ifndef NO_ASN #include @@ -159,12 +176,19 @@ #endif #endif +#ifdef WOLFSSL_SM3 + #include +#endif + #ifndef NO_AES #include #ifdef HAVE_AES_DECRYPT #include #endif #endif +#ifdef WOLFSSL_SM4 + #include +#endif #ifdef WOLFSSL_RIPEMD #include #endif @@ -210,10 +234,6 @@ #define FOURK_BUF 4096 #define GEN_BUF 294 - - #ifndef USER_CRYPTO_ERROR - #define USER_CRYPTO_ERROR (-101) /* error returned by IPP lib. */ - #endif #endif #ifndef NO_SIG_WRAPPER @@ -273,6 +293,16 @@ #include #endif +#ifdef WOLFSSL_HAVE_KYBER + #include +#ifdef WOLFSSL_WC_KYBER + #include +#endif +#endif +#ifdef HAVE_DILITHIUM + #include +#endif + #ifdef HAVE_PKCS12 #include #endif @@ -319,15 +349,24 @@ #ifndef NO_DES3 #include #endif +#ifndef NO_RC4 + #include +#endif #ifdef HAVE_ECC #include #endif #ifdef HAVE_PKCS7 #include #endif +#ifdef HAVE_CURVE25519 + #include +#endif #ifdef HAVE_ED25519 #include #endif +#ifdef HAVE_CURVE448 + #include +#endif #ifdef HAVE_ED448 #include #endif @@ -342,7 +381,8 @@ defined(HAVE_SESSION_TICKET) || (defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)) || \ defined(WOLFSSL_TEST_STATIC_BUILD) || defined(WOLFSSL_DTLS) || \ - defined(HAVE_ECH) || defined(HAVE_EX_DATA) + defined(HAVE_ECH) || defined(HAVE_EX_DATA) || !defined(NO_SESSION_CACHE) \ + || !defined(WOLFSSL_NO_TLS12) || defined(WOLFSSL_TLS13) /* for testing SSL_get_peer_cert_chain, or SESSION_TICKET_HINT_DEFAULT, * for setting authKeyIdSrc in WOLFSSL_X509, or testing DTLS sequence * number tracking */ @@ -358,6 +398,15 @@ #endif #include +#include "tests/utils.h" + +/* include misc.c here regardless of NO_INLINE, because misc.c implementations + * have default (hidden) visibility, and in the absence of visibility, it's + * benign to mask out the library implementation. + */ +#define WOLFSSL_MISC_INCLUDED +#include + #ifndef WOLFSSL_HAVE_ECC_KEY_GET_PRIV /* FIPS build has replaced ecc.h. */ #define wc_ecc_key_get_priv(key) (&((key)->k)) @@ -401,13 +450,16 @@ typedef int (*ctx_cb)(WOLFSSL_CTX* ctx); typedef int (*ssl_cb)(WOLFSSL* ssl); typedef int (*test_cbType)(WOLFSSL_CTX *ctx, WOLFSSL *ssl); +typedef int (*hs_cb)(WOLFSSL_CTX **ctx, WOLFSSL **ssl); typedef struct test_ssl_cbf { method_provider method; ctx_cb ctx_ready; ssl_cb ssl_ready; ssl_cb on_result; + ctx_cb on_ctx_cleanup; ssl_cb on_cleanup; + hs_cb on_handshake; WOLFSSL_CTX* ctx; const char* caPemFile; const char* certPemFile; @@ -454,6 +506,12 @@ int test_wolfSSL_client_server_nofail_memio(test_ssl_cbf* client_cb, test_ssl_cbf* server_cb, test_cbType client_on_handshake); +#ifdef WOLFSSL_DUMP_MEMIO_STREAM +const char* currentTestName; +char tmpDirName[16]; +int tmpDirNameSet = 0; +#endif + /*----------------------------------------------------------------------------* | Constants *----------------------------------------------------------------------------*/ @@ -529,7 +587,8 @@ #endif #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ - !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) + !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && \ + !defined(WOLFSSL_TIRTOS) #define HAVE_SSL_MEMIO_TESTS_DEPENDENCIES #endif @@ -592,23 +651,17 @@ static int test_wolfSSL_Init(void) { - int result; - - result = wolfSSL_Init(); - - result = TEST_RES_CHECK(result == WOLFSSL_SUCCESS); - return result; + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_Init(), WOLFSSL_SUCCESS); + return EXPECT_RESULT(); } static int test_wolfSSL_Cleanup(void) { - int result; - - result = wolfSSL_Cleanup(); - - result = TEST_RES_CHECK(result == WOLFSSL_SUCCESS); - return result; + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_Cleanup(), WOLFSSL_SUCCESS); + return EXPECT_RESULT(); } @@ -617,33 +670,132 @@ */ static int test_wolfCrypt_Init(void) { - int result; - - result = wolfCrypt_Init(); - - result = TEST_RES_CHECK(result == 0); - return result; + EXPECT_DECLS; + ExpectIntEQ(wolfCrypt_Init(), 0); + return EXPECT_RESULT(); } /* END test_wolfCrypt_Init */ static int test_wolfCrypt_Cleanup(void) { - int result; + EXPECT_DECLS; + ExpectIntEQ(wolfCrypt_Cleanup(), 0); + return EXPECT_RESULT(); +} - result = wolfCrypt_Cleanup(); - result = TEST_RES_CHECK(result == 0); - return result; +#ifdef WOLFSSL_STATIC_MEMORY + #define TEST_LSM_STATIC_SIZE 440000 + /* Create new bucket list, using the default list, adding + * one dang large buffer size. */ + #define TEST_LSM_DEF_BUCKETS (WOLFMEM_DEF_BUCKETS+1) + #define TEST_LSM_BUCKETS WOLFMEM_BUCKETS,(LARGEST_MEM_BUCKET*2) + #define TEST_LSM_DIST WOLFMEM_DIST,1 +#endif + +static int test_wc_LoadStaticMemory_ex(void) +{ + EXPECT_DECLS; +#ifdef WOLFSSL_STATIC_MEMORY + byte staticMemory[TEST_LSM_STATIC_SIZE]; + word32 sizeList[TEST_LSM_DEF_BUCKETS] = { TEST_LSM_BUCKETS }; + word32 distList[TEST_LSM_DEF_BUCKETS] = { TEST_LSM_DIST }; + WOLFSSL_HEAP_HINT* heap; + + /* For this test, the size and dist lists will be the ones configured + * for the build, or default. The value of WOLFMEM_DEF_BUCKETS is 9, + * so these lists are 10 long. For most tests, the value of + * WOLFMEM_DEF_BUCKETS is used. There's a test case where one is added + * to that, to make sure the list size is larger than + * WOLFMEM_MAX_BUCKETS. */ + + /* Pass in zero everything. */ + ExpectIntEQ(wc_LoadStaticMemory_ex(NULL, 0, NULL, NULL, NULL, 0, 0, 0), + BAD_FUNC_ARG); + + /* Set the heap pointer to NULL. */ + ExpectIntEQ(wc_LoadStaticMemory_ex(NULL, + WOLFMEM_DEF_BUCKETS, sizeList, distList, + staticMemory, (word32)sizeof(staticMemory), + 0, 1), + BAD_FUNC_ARG); + + /* Set other pointer values to NULL one at a time. */ + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS, NULL, distList, + staticMemory, (word32)sizeof(staticMemory), + 0, 1), + BAD_FUNC_ARG); + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS, sizeList, NULL, + staticMemory, (word32)sizeof(staticMemory), + 0, 1), + BAD_FUNC_ARG); + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS, sizeList, distList, + NULL, (word32)sizeof(staticMemory), + 0, 1), + BAD_FUNC_ARG); + + /* Set the size of the static buffer to 0. */ + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS, sizeList, distList, + staticMemory, 0, + 0, 1), + BUFFER_E); + + /* Set the size of the static buffer to one less than minimum allowed. */ + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS, sizeList, distList, + staticMemory, + (word32)(sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT)) - 1, + 0, 1), + BUFFER_E); + + /* Set the size of the static buffer to exactly the minimum size. */ + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS, sizeList, distList, + staticMemory, + (word32)(sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT)), + 0, 1), + 0); + wc_UnloadStaticMemory(heap); + + /* Use more buckets than able. Success case. */ + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS*2, sizeList, distList, + staticMemory, (word32)sizeof(staticMemory), + 0, 1), + 0); + wc_UnloadStaticMemory(heap); + + /* Success case. */ + heap = NULL; + ExpectIntEQ(wc_LoadStaticMemory_ex(&heap, + WOLFMEM_DEF_BUCKETS, sizeList, distList, + staticMemory, (word32)sizeof(staticMemory), + 0, 1), + 0); + wc_UnloadStaticMemory(heap); +#endif /* WOLFSSL_STATIC_MEMORY */ + return EXPECT_RESULT(); } + /*----------------------------------------------------------------------------* | Platform dependent function test *----------------------------------------------------------------------------*/ static int test_fileAccess(void) { - int res = TEST_SKIPPED; -#if defined(WOLFSSL_TEST_PLATFORMDEPEND) && !defined(NO_FILESYSTEM) EXPECT_DECLS; +#if defined(WOLFSSL_TEST_PLATFORMDEPEND) && !defined(NO_FILESYSTEM) const char *fname[] = { svrCertFile, svrKeyFile, caCertFile, eccCertFile, eccKeyFile, eccRsaCertFile, @@ -660,7 +812,7 @@ int i; ExpectTrue(XFOPEN("badfilename", "rb") == XBADFILE); - for (i=0; fname[i] != NULL ; i++) { + for (i=0; EXPECT_SUCCESS() && fname[i] != NULL ; i++) { ExpectTrue((f = XFOPEN(fname[i], "rb")) != XBADFILE); XFCLOSE(f); } @@ -674,10 +826,8 @@ ExpectIntEQ(XMEMCMP(server_cert_der_2048, buff, sz), 0); XFREE(buff, NULL, DYNAMIC_TYPE_FILE); XFCLOSE(f); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /*----------------------------------------------------------------------------* @@ -809,6 +959,402 @@ return EXPECT_RESULT(); } +#if defined(WOLFSSL_DUAL_ALG_CERTS) && !defined(NO_FILESYSTEM) +/*----------------------------------------------------------------------------* + | Dual algorithm Certificate Tests + *----------------------------------------------------------------------------*/ +#define LARGE_TEMP_SZ 4096 + +/* To better understand this, please see the X9.146 example in wolfssl-examples + * repo. */ +static int do_dual_alg_root_certgen(byte **out, char *caKeyFile, + char *sapkiFile, char *altPrivFile) +{ + EXPECT_DECLS; + FILE* file = NULL; + Cert newCert; + DecodedCert preTBS; + + byte caKeyBuf[LARGE_TEMP_SZ]; + word32 caKeySz = LARGE_TEMP_SZ; + byte sapkiBuf[LARGE_TEMP_SZ]; + word32 sapkiSz = LARGE_TEMP_SZ; + byte altPrivBuf[LARGE_TEMP_SZ]; + word32 altPrivSz = LARGE_TEMP_SZ; + byte altSigAlgBuf[LARGE_TEMP_SZ]; + word32 altSigAlgSz = LARGE_TEMP_SZ; + byte scratchBuf[LARGE_TEMP_SZ]; + word32 scratchSz = LARGE_TEMP_SZ; + byte preTbsBuf[LARGE_TEMP_SZ]; + word32 preTbsSz = LARGE_TEMP_SZ; + byte altSigValBuf[LARGE_TEMP_SZ]; + word32 altSigValSz = LARGE_TEMP_SZ; + byte *outBuf = NULL; + word32 outSz = LARGE_TEMP_SZ; + WC_RNG rng; + RsaKey caKey; + ecc_key altCaKey; + word32 idx = 0; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(&caKey, 0, sizeof(RsaKey)); + XMEMSET(&altCaKey, 0, sizeof(ecc_key)); + + ExpectNotNull(outBuf = (byte*)XMALLOC(outSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(wc_InitRng(&rng), 0); + XMEMSET(caKeyBuf, 0, caKeySz); + ExpectNotNull(file = fopen(caKeyFile, "rb")); + ExpectIntGT(caKeySz = (word32)fread(caKeyBuf, 1, caKeySz, file), 0); + if (file) { + fclose(file); + file = NULL; + } + ExpectIntEQ(wc_InitRsaKey_ex(&caKey, NULL, INVALID_DEVID), 0); + idx = 0; + ExpectIntEQ(wc_RsaPrivateKeyDecode(caKeyBuf, &idx, &caKey, caKeySz), + 0); + XMEMSET(sapkiBuf, 0, sapkiSz); + ExpectNotNull(file = fopen(sapkiFile, "rb")); + ExpectIntGT(sapkiSz = (word32)fread(sapkiBuf, 1, sapkiSz, file), 0); + if (file) { + fclose(file); + file = NULL; + } + XMEMSET(altPrivBuf, 0, altPrivSz); + ExpectNotNull(file = fopen(altPrivFile, "rb")); + ExpectIntGT(altPrivSz = (word32)fread(altPrivBuf, 1, altPrivSz, file), 0); + if (file) { + fclose(file); + file = NULL; + } + wc_ecc_init(&altCaKey); + idx = 0; + ExpectIntEQ(wc_EccPrivateKeyDecode(altPrivBuf, &idx, &altCaKey, + (word32)altPrivSz), 0); + XMEMSET(altSigAlgBuf, 0, altSigAlgSz); + ExpectIntGT(altSigAlgSz = SetAlgoID(CTC_SHA256wECDSA, altSigAlgBuf, + oidSigType, 0), 0); + wc_InitCert(&newCert); + strncpy(newCert.subject.country, "US", CTC_NAME_SIZE); + strncpy(newCert.subject.state, "MT", CTC_NAME_SIZE); + strncpy(newCert.subject.locality, "Bozeman", CTC_NAME_SIZE); + strncpy(newCert.subject.org, "wolfSSL", CTC_NAME_SIZE); + strncpy(newCert.subject.unit, "Engineering", CTC_NAME_SIZE); + strncpy(newCert.subject.commonName, "www.wolfssl.com", CTC_NAME_SIZE); + strncpy(newCert.subject.email, "root@wolfssl.com", CTC_NAME_SIZE); + newCert.sigType = CTC_SHA256wRSA; + newCert.isCA = 1; + + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "1.2.3.4.5", + (const byte *)"This is NOT a critical extension", 32), 0); + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "2.5.29.72", sapkiBuf, + sapkiSz), 0); + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "2.5.29.73", altSigAlgBuf, + altSigAlgSz), 0); + + XMEMSET(scratchBuf, 0, scratchSz); + ExpectIntGT(scratchSz = wc_MakeSelfCert(&newCert, scratchBuf, scratchSz, + &caKey, &rng), 0); + wc_InitDecodedCert(&preTBS, scratchBuf, scratchSz, 0); + ExpectIntEQ(wc_ParseCert(&preTBS, CERT_TYPE, NO_VERIFY, NULL), 0); + + XMEMSET(preTbsBuf, 0, preTbsSz); + ExpectIntGT(preTbsSz = wc_GeneratePreTBS(&preTBS, preTbsBuf, preTbsSz), 0); + XMEMSET(altSigValBuf, 0, altSigValSz); + ExpectIntGT(altSigValSz = wc_MakeSigWithBitStr(altSigValBuf, altSigValSz, + CTC_SHA256wECDSA, preTbsBuf, preTbsSz, ECC_TYPE, &altCaKey, + &rng), 0); + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "2.5.29.74", altSigValBuf, + altSigValSz), 0); + + /* Finally, generate the new certificate. */ + if (outBuf != NULL) { + XMEMSET(outBuf, 0, outSz); + } + ExpectIntGT(outSz = wc_MakeSelfCert(&newCert, outBuf, outSz, &caKey, &rng), + 0); + *out = outBuf; + wc_FreeRsaKey(&caKey); + wc_FreeRng(&rng); + wc_FreeDecodedCert(&preTBS); + return outSz; +} + +static int do_dual_alg_server_certgen(byte **out, char *caKeyFile, + char *sapkiFile, char *altPrivFile, + char *serverKeyFile, + byte *caCertBuf, int caCertSz) +{ + EXPECT_DECLS; + FILE* file = NULL; + Cert newCert; + DecodedCert preTBS; + + byte serverKeyBuf[LARGE_TEMP_SZ]; + word32 serverKeySz = LARGE_TEMP_SZ; + byte caKeyBuf[LARGE_TEMP_SZ]; + word32 caKeySz = LARGE_TEMP_SZ; + byte sapkiBuf[LARGE_TEMP_SZ]; + word32 sapkiSz = LARGE_TEMP_SZ; + byte altPrivBuf[LARGE_TEMP_SZ]; + word32 altPrivSz = LARGE_TEMP_SZ; + byte altSigAlgBuf[LARGE_TEMP_SZ]; + word32 altSigAlgSz = LARGE_TEMP_SZ; + byte scratchBuf[LARGE_TEMP_SZ]; + word32 scratchSz = LARGE_TEMP_SZ; + byte preTbsBuf[LARGE_TEMP_SZ]; + word32 preTbsSz = LARGE_TEMP_SZ; + byte altSigValBuf[LARGE_TEMP_SZ]; + word32 altSigValSz = LARGE_TEMP_SZ; + byte *outBuf = NULL; + word32 outSz = LARGE_TEMP_SZ; + WC_RNG rng; + RsaKey caKey; + RsaKey serverKey; + ecc_key altCaKey; + word32 idx = 0; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(&caKey, 0, sizeof(RsaKey)); + XMEMSET(&serverKey, 0, sizeof(RsaKey)); + XMEMSET(&altCaKey, 0, sizeof(ecc_key)); + + ExpectNotNull(outBuf = (byte*)XMALLOC(outSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(wc_InitRng(&rng), 0); + XMEMSET(serverKeyBuf, 0, serverKeySz); + ExpectNotNull(file = fopen(serverKeyFile, "rb")); + ExpectIntGT(serverKeySz = (word32)fread(serverKeyBuf, 1, serverKeySz, file), + 0); + if (file) { + fclose(file); + file = NULL; + } + ExpectIntEQ(wc_InitRsaKey_ex(&serverKey, NULL, INVALID_DEVID), 0); + idx = 0; + ExpectIntEQ(wc_RsaPrivateKeyDecode(serverKeyBuf, &idx, &serverKey, + (word32)serverKeySz), 0); + XMEMSET(caKeyBuf, 0, caKeySz); + ExpectNotNull(file = fopen(caKeyFile, "rb")); + ExpectIntGT(caKeySz = (word32)fread(caKeyBuf, 1, caKeySz, file), 0); + if (file) { + fclose(file); + file = NULL; + } + ExpectIntEQ(wc_InitRsaKey_ex(&caKey, NULL, INVALID_DEVID), 0); + idx = 0; + ExpectIntEQ(wc_RsaPrivateKeyDecode(caKeyBuf, &idx, &caKey, + (word32)caKeySz), 0); + XMEMSET(sapkiBuf, 0, sapkiSz); + ExpectNotNull(file = fopen(sapkiFile, "rb")); + ExpectIntGT(sapkiSz = (word32)fread(sapkiBuf, 1, sapkiSz, file), 0); + if (file) { + fclose(file); + file = NULL; + } + XMEMSET(altPrivBuf, 0, altPrivSz); + ExpectNotNull(file = fopen(altPrivFile, "rb")); + ExpectIntGT(altPrivSz = (word32)fread(altPrivBuf, 1, altPrivSz, file), 0); + if (file) { + fclose(file); + file = NULL; + } + wc_ecc_init(&altCaKey); + idx = 0; + ExpectIntEQ(wc_EccPrivateKeyDecode(altPrivBuf, &idx, &altCaKey, + (word32)altPrivSz), 0); + XMEMSET(altSigAlgBuf, 0, altSigAlgSz); + ExpectIntGT(altSigAlgSz = SetAlgoID(CTC_SHA256wECDSA, altSigAlgBuf, + oidSigType, 0), 0); + wc_InitCert(&newCert); + strncpy(newCert.subject.country, "US", CTC_NAME_SIZE); + strncpy(newCert.subject.state, "MT", CTC_NAME_SIZE); + strncpy(newCert.subject.locality, "Bozeman", CTC_NAME_SIZE); + strncpy(newCert.subject.org, "wolfSSL", CTC_NAME_SIZE); + strncpy(newCert.subject.unit, "Engineering", CTC_NAME_SIZE); + strncpy(newCert.subject.commonName, "www.wolfssl.com", CTC_NAME_SIZE); + strncpy(newCert.subject.email, "server@wolfssl.com", CTC_NAME_SIZE); + + newCert.sigType = CTC_SHA256wRSA; + newCert.isCA = 0; + ExpectIntEQ(wc_SetIssuerBuffer(&newCert, caCertBuf, caCertSz), 0); + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "1.2.3.4.5", + (const byte *)"This is NOT a critical extension", 32), 0); + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "2.5.29.72", sapkiBuf, + sapkiSz), 0); + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "2.5.29.73", altSigAlgBuf, + altSigAlgSz), 0); + XMEMSET(scratchBuf, 0, scratchSz); + ExpectIntGT(wc_MakeCert(&newCert, scratchBuf, scratchSz, &serverKey, NULL, + &rng), 0); + ExpectIntGT(scratchSz = wc_SignCert(newCert.bodySz, newCert.sigType, + scratchBuf, scratchSz, &caKey, NULL, &rng), 0); + wc_InitDecodedCert(&preTBS, scratchBuf, scratchSz, 0); + ExpectIntEQ(wc_ParseCert(&preTBS, CERT_TYPE, NO_VERIFY, NULL), 0); + XMEMSET(preTbsBuf, 0, preTbsSz); + ExpectIntGT(preTbsSz = wc_GeneratePreTBS(&preTBS, preTbsBuf, preTbsSz), 0); + XMEMSET(altSigValBuf, 0, altSigValSz); + ExpectIntGT(altSigValSz = wc_MakeSigWithBitStr(altSigValBuf, altSigValSz, + CTC_SHA256wECDSA, preTbsBuf, preTbsSz, ECC_TYPE, &altCaKey, + &rng), 0); + ExpectIntEQ(wc_SetCustomExtension(&newCert, 0, "2.5.29.74", + altSigValBuf, altSigValSz), 0); + /* Finally, generate the new certificate. */ + if (outBuf != NULL) { + XMEMSET(outBuf, 0, outSz); + } + ExpectIntGT(wc_MakeCert(&newCert, outBuf, outSz, &serverKey, NULL, &rng), + 0); + ExpectIntGT(outSz = wc_SignCert(newCert.bodySz, newCert.sigType, outBuf, + outSz, &caKey, NULL, &rng), 0); + *out = outBuf; + wc_FreeRsaKey(&caKey); + wc_FreeRsaKey(&serverKey); + wc_FreeRng(&rng); + wc_FreeDecodedCert(&preTBS); + return outSz; +} + +static int do_dual_alg_tls13_connection(byte *caCert, word32 caCertSz, + byte *serverCert, word32 serverCertSz, + byte *serverKey, word32 serverKeySz, + int negative_test) +{ + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup_ex(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + caCert, caCertSz, serverCert, serverCertSz, + serverKey, serverKeySz), 0); + if (negative_test) { + ExpectTrue(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL) != 0); + } + else { + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + } + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + return EXPECT_RESULT(); +} + +static int extCount = 0; +static int myUnknownExtCallback(const word16* oid, word32 oidSz, int crit, + const unsigned char* der, word32 derSz) +{ + (void) oid; + (void) oidSz; + (void) crit; + (void) der; + (void) derSz; + extCount ++; + /* Accept all extensions. This is only a test. Normally we would be much more + * careful about critical extensions. */ + return 1; +} + +static int test_dual_alg_support(void) +{ + EXPECT_DECLS; + /* Root CA and server keys will be the same. This is only appropriate for + * testing. */ + char keyFile[] = "./certs/ca-key.der"; + char sapkiFile[] = "./certs/ecc-keyPub.der"; + char altPrivFile[] = "./certs/ecc-key.der"; + char wrongPrivFile[] = "./certs/ecc-client-key.der"; + byte *serverKey = NULL; + size_t serverKeySz = 0; + byte *root = NULL; + int rootSz = 0; + byte *server = NULL; + int serverSz = 0; + WOLFSSL_CERT_MANAGER* cm = NULL; + + ExpectIntEQ(load_file(keyFile, &serverKey, &serverKeySz), 0); + + /* Base normal case. */ + if (EXPECT_SUCCESS()) { + rootSz = do_dual_alg_root_certgen(&root, keyFile, sapkiFile, + altPrivFile); + } + ExpectNotNull(root); + ExpectIntGT(rootSz, 0); + if (EXPECT_SUCCESS()) { + serverSz = do_dual_alg_server_certgen(&server, keyFile, sapkiFile, + altPrivFile, keyFile, root, rootSz); + } + ExpectNotNull(server); + ExpectIntGT(serverSz, 0); + ExpectIntEQ(do_dual_alg_tls13_connection(root, rootSz, + server, serverSz, serverKey, (word32)serverKeySz, 0), + TEST_SUCCESS); + XFREE(root, NULL, DYNAMIC_TYPE_TMP_BUFFER); + root = NULL; + XFREE(server, NULL, DYNAMIC_TYPE_TMP_BUFFER); + server = NULL; + + /* Now we try a negative case. Note that we use wrongPrivFile to generate + * the alternative signature and then set negative_test to true for the + * call to do_dual_alg_tls13_connection(). Its expecting a failed connection + * because the signature won't verify. The exception is if + * WOLFSSL_TRUST_PEER_CERT is defined. In that case, no verfication happens + * and this is no longer a negative test. */ + if (EXPECT_SUCCESS()) { + rootSz = do_dual_alg_root_certgen(&root, keyFile, sapkiFile, + wrongPrivFile); + } + ExpectNotNull(root); + ExpectIntGT(rootSz, 0); + if (EXPECT_SUCCESS()) { + serverSz = do_dual_alg_server_certgen(&server, keyFile, sapkiFile, + wrongPrivFile, keyFile, root, rootSz); + } + ExpectNotNull(server); + ExpectIntGT(serverSz, 0); +#ifdef WOLFSSL_TRUST_PEER_CERT + ExpectIntEQ(do_dual_alg_tls13_connection(root, rootSz, + server, serverSz, serverKey, (word32)serverKeySz, 0), + TEST_SUCCESS); +#else + ExpectIntEQ(do_dual_alg_tls13_connection(root, rootSz, + server, serverSz, serverKey, (word32)serverKeySz, 1), + TEST_SUCCESS); +#endif + + /* Lets see if CertManager can find the new extensions */ + extCount = 0; + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + wolfSSL_CertManagerSetUnknownExtCallback(cm, myUnknownExtCallback); + ExpectIntEQ(wolfSSL_CertManagerLoadCABuffer(cm, root, rootSz, + SSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(cm, server, serverSz, + SSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); + /* There is only 1 unknown extension (1.2.3.4.5). The other ones are known + * because they are for the dual alg extensions. */ + ExpectIntEQ(extCount, 1); + wolfSSL_CertManagerFree(cm); + + XFREE(root, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(server, NULL, DYNAMIC_TYPE_TMP_BUFFER); + + free(serverKey); + + return EXPECT_RESULT(); +} +#else +static int test_dual_alg_support(void) +{ + return TEST_SKIPPED; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS && !NO_FILESYSTEM */ /*----------------------------------------------------------------------------* | Context @@ -989,11 +1535,10 @@ static int test_wolfSSL_CTX_set_cipher_list_bytes(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES)) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && \ - (!defined(NO_RSA) || defined(HAVE_ECC)) - EXPECT_DECLS; + (!defined(NO_RSA) || defined(HAVE_ECC)) && !defined(NO_FILESYSTEM) const char* testCertFile; const char* testKeyFile; WOLFSSL_CTX* ctx = NULL; @@ -1179,20 +1724,17 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* (OPENSSL_EXTRA || WOLFSSL_SET_CIPHER_BYTES) && (!NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER) && (!NO_RSA || HAVE_ECC) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_use_certificate_file(void) { - int res = TEST_SKIPPED; -#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_WOLFSSL_SERVER) WOLFSSL_CTX *ctx = NULL; ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); @@ -1217,31 +1759,26 @@ #endif wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO)) && !defined(NO_RSA) static int test_wolfSSL_CTX_use_certificate_ASN1(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_WOLFSSL_SERVER) && !defined(NO_ASN) - WOLFSSL_CTX* ctx; - int ret; + WOLFSSL_CTX* ctx = NULL; - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); - ret = SSL_CTX_use_certificate_ASN1(ctx, sizeof_server_cert_der_2048, - server_cert_der_2048); + ExpectIntEQ(SSL_CTX_use_certificate_ASN1(ctx, sizeof_server_cert_der_2048, + server_cert_der_2048), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = TEST_RES_CHECK(ret == WOLFSSL_SUCCESS); #endif - return res; + return EXPECT_RESULT(); } #endif /* (OPENSSL_ALL || WOLFSSL_ASIO) && !NO_RSA */ @@ -1252,10 +1789,9 @@ */ static int test_wolfSSL_CTX_use_certificate_buffer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && defined(USE_CERT_BUFFERS_2048) && \ !defined(NO_RSA) && !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; int ret; @@ -1266,18 +1802,15 @@ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); -} /*END test_wolfSSL_CTX_use_certificate_buffer*/ +} /* END test_wolfSSL_CTX_use_certificate_buffer */ static int test_wolfSSL_CTX_use_PrivateKey_file(void) { - int res = TEST_SKIPPED; -#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_WOLFSSL_SERVER) WOLFSSL_CTX *ctx = NULL; ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); @@ -1303,21 +1836,18 @@ #endif wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* test both file and buffer versions along with unloading trusted peer certs */ static int test_wolfSSL_CTX_trust_peer_cert(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && defined(WOLFSSL_TRUST_PEER_CERT) && \ !defined(NO_WOLFSSL_CLIENT) && !defined(NO_RSA) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; WOLFSSL* ssl = NULL; @@ -1382,24 +1912,28 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } - static int test_wolfSSL_CTX_load_verify_locations(void) { - int res = TEST_SKIPPED; -#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_WOLFSSL_CLIENT) EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_WOLFSSL_CLIENT) WOLFSSL_CTX *ctx = NULL; #ifndef NO_RSA WOLFSSL_CERT_MANAGER* cm = NULL; #ifdef PERSIST_CERT_CACHE - int cacheSz; + int cacheSz = 0; + unsigned char* cache = NULL; + int used = 0; +#ifndef NO_FILESYSTEM + const char* cacheFile = "./tests/cert_cache.tmp"; +#endif + int i; + int t; + int* p; #endif #endif #if !defined(NO_WOLFSSL_DIR) && !defined(WOLFSSL_TIRTOS) @@ -1422,12 +1956,17 @@ #if !defined(NO_WOLFSSL_DIR) && !defined(WOLFSSL_TIRTOS) && \ - (defined(WOLFSSL_QT) && \ + ((defined(WOLFSSL_QT) || defined(WOLFSSL_IGNORE_BAD_CERT_PATH)) && \ !(WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS & WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR)) /* invalid path */ ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx, NULL, bogusFile), WS_RETURN_CODE(BAD_PATH_ERROR,WOLFSSL_FAILURE)); #endif +#if defined(WOLFSSL_QT) || defined(WOLFSSL_IGNORE_BAD_CERT_PATH) + /* test ignoring the invalid path */ + ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx, NULL, bogusFile, + WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR), WOLFSSL_SUCCESS); +#endif /* load ca cert */ #ifdef NO_RSA @@ -1440,6 +1979,99 @@ #ifdef PERSIST_CERT_CACHE /* Get cert cache size */ ExpectIntGT(cacheSz = wolfSSL_CTX_get_cert_cache_memsize(ctx), 0); + + ExpectNotNull(cache = (byte*)XMALLOC(cacheSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(NULL, NULL, -1, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(ctx, NULL, -1, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(NULL, cache, -1, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(NULL, NULL, cacheSz, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(NULL, NULL, -1, &used), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(NULL, cache, cacheSz, &used), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(ctx, NULL, cacheSz, &used), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(ctx, cache, -1, &used), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(ctx, cache, cacheSz, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(ctx, cache, cacheSz - 10, &used), + BUFFER_E); + ExpectIntEQ(wolfSSL_CTX_memsave_cert_cache(ctx, cache, cacheSz, &used), 1); + ExpectIntEQ(cacheSz, used); + + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(NULL, NULL, -1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, NULL, -1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(NULL, cache, -1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(NULL, NULL, cacheSz), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(NULL, cache, cacheSz), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, NULL, cacheSz), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, -1), + BAD_FUNC_ARG); + /* Smaller than header. */ + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, 1), BUFFER_E); + for (i = 1; i < cacheSz; i++) { + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, cacheSz - i), + BUFFER_E); + } + if (EXPECT_SUCCESS()) { + /* Modify header for bad results! */ + p = (int*)cache; + /* version */ + t = p[0]; p[0] = 0xff; + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, cacheSz), + CACHE_MATCH_ERROR); + p[0] = t; p++; + /* rows */ + t = p[0]; p[0] = 0xff; + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, cacheSz), + CACHE_MATCH_ERROR); + p[0] = t; p++; + /* columns[0] */ + t = p[0]; p[0] = -1; + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, cacheSz), + PARSE_ERROR); + p[0] = t; p += CA_TABLE_SIZE; + /* signerSz*/ + t = p[0]; p[0] = 0xff; + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, cacheSz), + CACHE_MATCH_ERROR); + p[0] = t; + } + + ExpectIntEQ(wolfSSL_CTX_memrestore_cert_cache(ctx, cache, cacheSz), 1); + ExpectIntEQ(cacheSz = wolfSSL_CTX_get_cert_cache_memsize(ctx), used); + +#ifndef NO_FILESYSTEM + ExpectIntEQ(wolfSSL_CTX_save_cert_cache(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_save_cert_cache(ctx, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_save_cert_cache(NULL, cacheFile), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_save_cert_cache(ctx, cacheFile), 1); + + ExpectIntEQ(wolfSSL_CTX_restore_cert_cache(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_restore_cert_cache(ctx, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_restore_cert_cache(NULL, cacheFile), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_restore_cert_cache(ctx, "no-file"), + WOLFSSL_BAD_FILE); + ExpectIntEQ(wolfSSL_CTX_restore_cert_cache(ctx, cacheFile), 1); + /* File contents is not a cache. */ + ExpectIntEQ(wolfSSL_CTX_restore_cert_cache(ctx, "./certs/ca-cert.pem"), + CACHE_MATCH_ERROR); +#endif + + XFREE(cache, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif /* Test unloading CA's */ ExpectIntEQ(wolfSSL_CTX_UnloadCAs(ctx), WOLFSSL_SUCCESS); @@ -1504,11 +2136,9 @@ #endif wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_load_system_CA_certs(void) @@ -1578,7 +2208,8 @@ } #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) -static int test_cm_load_ca_buffer(const byte* cert_buf, size_t cert_sz, int file_type) +static int test_cm_load_ca_buffer(const byte* cert_buf, size_t cert_sz, + int file_type) { int ret; WOLFSSL_CERT_MANAGER* cm; @@ -1715,390 +2346,187 @@ #endif /* !NO_FILESYSTEM && !NO_CERTS */ -static int test_wolfSSL_CertManagerCheckOCSPResponse(void) +static int test_wolfSSL_CertManagerAPI(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_OCSP) && !defined(NO_RSA) -/* Need one of these for wolfSSL_OCSP_REQUEST_new. */ -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ - defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_APACHE_HTTPD) || \ - defined(HAVE_LIGHTY) EXPECT_DECLS; +#ifndef NO_CERTS WOLFSSL_CERT_MANAGER* cm = NULL; - /* Raw OCSP response bytes captured using the following setup: - * - Run responder with - * openssl ocsp -port 9999 -ndays 9999 - * -index certs/ocsp/index-intermediate1-ca-issued-certs.txt - * -rsigner certs/ocsp/ocsp-responder-cert.pem - * -rkey certs/ocsp/ocsp-responder-key.pem - * -CA certs/ocsp/intermediate1-ca-cert.pem - * - Run client with - * openssl ocsp -host 127.0.0.1:9999 -respout resp.out - * -issuer certs/ocsp/intermediate1-ca-cert.pem - * -cert certs/ocsp/server1-cert.pem - * -CAfile certs/ocsp/root-ca-cert.pem -noverify - * - Copy raw response from Wireshark. - */ - byte response[] = { - 0x30, 0x82, 0x07, 0x40, 0x0a, 0x01, 0x00, 0xa0, 0x82, 0x07, 0x39, 0x30, 0x82, 0x07, 0x35, 0x06, - 0x09, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x01, 0x04, 0x82, 0x07, 0x26, 0x30, 0x82, - 0x07, 0x22, 0x30, 0x82, 0x01, 0x40, 0xa1, 0x81, 0xa1, 0x30, 0x81, 0x9e, 0x31, 0x0b, 0x30, 0x09, - 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, - 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, - 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6c, 0x65, - 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x07, 0x77, 0x6f, 0x6c, 0x66, 0x53, - 0x53, 0x4c, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x45, 0x6e, 0x67, - 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0c, 0x16, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, 0x4f, 0x43, 0x53, 0x50, 0x20, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x77, - 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x18, 0x0f, 0x32, 0x30, 0x32, 0x31, - 0x30, 0x35, 0x30, 0x33, 0x32, 0x31, 0x34, 0x37, 0x31, 0x30, 0x5a, 0x30, 0x64, 0x30, 0x62, 0x30, - 0x3a, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x71, 0x4d, - 0x82, 0x23, 0x40, 0x59, 0xc0, 0x96, 0xa1, 0x37, 0x43, 0xfa, 0x31, 0xdb, 0xba, 0xb1, 0x43, 0x18, - 0xda, 0x04, 0x04, 0x14, 0x83, 0xc6, 0x3a, 0x89, 0x2c, 0x81, 0xf4, 0x02, 0xd7, 0x9d, 0x4c, 0xe2, - 0x2a, 0xc0, 0x71, 0x82, 0x64, 0x44, 0xda, 0x0e, 0x02, 0x01, 0x05, 0x80, 0x00, 0x18, 0x0f, 0x32, - 0x30, 0x32, 0x31, 0x30, 0x35, 0x30, 0x33, 0x32, 0x31, 0x34, 0x37, 0x31, 0x30, 0x5a, 0xa0, 0x11, - 0x18, 0x0f, 0x32, 0x30, 0x34, 0x38, 0x30, 0x39, 0x31, 0x37, 0x32, 0x31, 0x34, 0x37, 0x31, 0x30, - 0x5a, 0xa1, 0x23, 0x30, 0x21, 0x30, 0x1f, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, - 0x01, 0x02, 0x04, 0x12, 0x04, 0x10, 0x38, 0x31, 0x60, 0x99, 0xc8, 0x05, 0x09, 0x68, 0x1c, 0x33, - 0x49, 0xea, 0x45, 0x26, 0x2f, 0x6d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x4d, 0x58, 0xcc, 0x69, 0x42, 0xe2, - 0x9e, 0x64, 0xf6, 0x57, 0xce, 0xcb, 0x5f, 0x14, 0xaf, 0x08, 0x6c, 0xc1, 0x52, 0x7a, 0x40, 0x0a, - 0xfd, 0xb6, 0xce, 0xbb, 0x40, 0xf4, 0xb9, 0xa5, 0x88, 0xc7, 0xf3, 0x42, 0x9f, 0xa9, 0x94, 0xbe, - 0x6e, 0x7e, 0x09, 0x30, 0x9d, 0x0e, 0x10, 0x6f, 0x9c, 0xd9, 0x4c, 0x71, 0x81, 0x41, 0x64, 0x95, - 0xf5, 0x85, 0x77, 0x94, 0x81, 0x61, 0x88, 0xc8, 0x0b, 0x50, 0xbb, 0x37, 0xc8, 0x86, 0x76, 0xd8, - 0xa2, 0xed, 0x66, 0x34, 0xfb, 0xe4, 0xe7, 0x09, 0x8c, 0xf5, 0xb5, 0x85, 0xd0, 0x4b, 0xb5, 0xe6, - 0x23, 0x62, 0xc3, 0xd0, 0xef, 0xf7, 0x42, 0x89, 0x02, 0x80, 0x64, 0xc9, 0xed, 0xdd, 0x7c, 0x8f, - 0x0d, 0xe7, 0x43, 0x9b, 0x88, 0x1f, 0xb0, 0xfd, 0x24, 0x01, 0xc7, 0x55, 0xc3, 0x73, 0x12, 0x84, - 0x09, 0x7c, 0x57, 0xa8, 0x5d, 0xab, 0x75, 0x29, 0x5c, 0x36, 0x97, 0x64, 0x40, 0x0b, 0x55, 0x34, - 0x0a, 0x5d, 0xb1, 0x1b, 0x61, 0x1b, 0xdc, 0xe5, 0x89, 0xdd, 0x92, 0x62, 0x57, 0xa7, 0x52, 0xb4, - 0x38, 0x9a, 0x48, 0xc8, 0x3a, 0x14, 0xde, 0x69, 0x42, 0xe9, 0x37, 0xa4, 0xe7, 0x2d, 0x00, 0xa7, - 0x0b, 0x29, 0x18, 0xd5, 0xce, 0xd9, 0x0d, 0xdd, 0xfe, 0xae, 0x86, 0xb3, 0x32, 0x1c, 0xc9, 0x33, - 0xb0, 0x2b, 0xb7, 0x3c, 0x0d, 0x43, 0xd8, 0x6c, 0xf2, 0xb7, 0xcd, 0x7b, 0xd5, 0x7d, 0xf0, 0xde, - 0x34, 0x9f, 0x6d, 0x83, 0xb9, 0xd5, 0xed, 0xe3, 0xda, 0x96, 0x40, 0x9e, 0xd6, 0xa6, 0xfd, 0x70, - 0x80, 0x70, 0x87, 0x61, 0x0f, 0xc5, 0x9f, 0x75, 0xfe, 0x11, 0x78, 0x34, 0xc9, 0x42, 0x16, 0x73, - 0x46, 0x7b, 0x05, 0x53, 0x28, 0x43, 0xbe, 0xee, 0x88, 0x67, 0x1d, 0xcc, 0x74, 0xa7, 0xb6, 0x58, - 0x7b, 0x29, 0x68, 0x40, 0xcf, 0xce, 0x7b, 0x19, 0x33, 0x68, 0xa0, 0x82, 0x04, 0xc6, 0x30, 0x82, - 0x04, 0xc2, 0x30, 0x82, 0x04, 0xbe, 0x30, 0x82, 0x03, 0xa6, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, - 0x00, 0x30, 0x81, 0x97, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, - 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, - 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x0c, 0x07, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, - 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, - 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x77, 0x6f, 0x6c, 0x66, 0x53, - 0x53, 0x4c, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, - 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x32, - 0x31, 0x30, 0x32, 0x31, 0x30, 0x31, 0x39, 0x34, 0x39, 0x35, 0x34, 0x5a, 0x17, 0x0d, 0x32, 0x33, - 0x31, 0x31, 0x30, 0x37, 0x31, 0x39, 0x34, 0x39, 0x35, 0x34, 0x5a, 0x30, 0x81, 0x9e, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, - 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, - 0x6c, 0x65, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x07, 0x77, 0x6f, 0x6c, - 0x66, 0x53, 0x53, 0x4c, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x45, - 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0c, 0x16, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, 0x4f, 0x43, 0x53, - 0x50, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x31, 0x1f, 0x30, 0x1d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, 0x66, 0x6f, - 0x40, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb8, 0xba, 0x23, - 0xb4, 0xf6, 0xc3, 0x7b, 0x14, 0xc3, 0xa4, 0xf5, 0x1d, 0x61, 0xa1, 0xf5, 0x1e, 0x63, 0xb9, 0x85, - 0x23, 0x34, 0x50, 0x6d, 0xf8, 0x7c, 0xa2, 0x8a, 0x04, 0x8b, 0xd5, 0x75, 0x5c, 0x2d, 0xf7, 0x63, - 0x88, 0xd1, 0x07, 0x7a, 0xea, 0x0b, 0x45, 0x35, 0x2b, 0xeb, 0x1f, 0xb1, 0x22, 0xb4, 0x94, 0x41, - 0x38, 0xe2, 0x9d, 0x74, 0xd6, 0x8b, 0x30, 0x22, 0x10, 0x51, 0xc5, 0xdb, 0xca, 0x3f, 0x46, 0x2b, - 0xfe, 0xe5, 0x5a, 0x3f, 0x41, 0x74, 0x67, 0x75, 0x95, 0xa9, 0x94, 0xd5, 0xc3, 0xee, 0x42, 0xf8, - 0x8d, 0xeb, 0x92, 0x95, 0xe1, 0xd9, 0x65, 0xb7, 0x43, 0xc4, 0x18, 0xde, 0x16, 0x80, 0x90, 0xce, - 0x24, 0x35, 0x21, 0xc4, 0x55, 0xac, 0x5a, 0x51, 0xe0, 0x2e, 0x2d, 0xb3, 0x0a, 0x5a, 0x4f, 0x4a, - 0x73, 0x31, 0x50, 0xee, 0x4a, 0x16, 0xbd, 0x39, 0x8b, 0xad, 0x05, 0x48, 0x87, 0xb1, 0x99, 0xe2, - 0x10, 0xa7, 0x06, 0x72, 0x67, 0xca, 0x5c, 0xd1, 0x97, 0xbd, 0xc8, 0xf1, 0x76, 0xf8, 0xe0, 0x4a, - 0xec, 0xbc, 0x93, 0xf4, 0x66, 0x4c, 0x28, 0x71, 0xd1, 0xd8, 0x66, 0x03, 0xb4, 0x90, 0x30, 0xbb, - 0x17, 0xb0, 0xfe, 0x97, 0xf5, 0x1e, 0xe8, 0xc7, 0x5d, 0x9b, 0x8b, 0x11, 0x19, 0x12, 0x3c, 0xab, - 0x82, 0x71, 0x78, 0xff, 0xae, 0x3f, 0x32, 0xb2, 0x08, 0x71, 0xb2, 0x1b, 0x8c, 0x27, 0xac, 0x11, - 0xb8, 0xd8, 0x43, 0x49, 0xcf, 0xb0, 0x70, 0xb1, 0xf0, 0x8c, 0xae, 0xda, 0x24, 0x87, 0x17, 0x3b, - 0xd8, 0x04, 0x65, 0x6c, 0x00, 0x76, 0x50, 0xef, 0x15, 0x08, 0xd7, 0xb4, 0x73, 0x68, 0x26, 0x14, - 0x87, 0x95, 0xc3, 0x5f, 0x6e, 0x61, 0xb8, 0x87, 0x84, 0xfa, 0x80, 0x1a, 0x0a, 0x8b, 0x98, 0xf3, - 0xe3, 0xff, 0x4e, 0x44, 0x1c, 0x65, 0x74, 0x7c, 0x71, 0x54, 0x65, 0xe5, 0x39, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x82, 0x01, 0x0a, 0x30, 0x82, 0x01, 0x06, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, - 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0x32, 0x67, 0xe1, 0xb1, 0x79, 0xd2, 0x81, 0xfc, 0x9f, 0x23, 0x0c, 0x70, 0x40, 0x50, 0xb5, 0x46, - 0x56, 0xb8, 0x30, 0x36, 0x30, 0x81, 0xc4, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xbc, 0x30, - 0x81, 0xb9, 0x80, 0x14, 0x73, 0xb0, 0x1c, 0xa4, 0x2f, 0x82, 0xcb, 0xcf, 0x47, 0xa5, 0x38, 0xd7, - 0xb0, 0x04, 0x82, 0x3a, 0x7e, 0x72, 0x15, 0x21, 0xa1, 0x81, 0x9d, 0xa4, 0x81, 0x9a, 0x30, 0x81, - 0x97, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, - 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, - 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x65, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x07, - 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, - 0x0c, 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x18, 0x30, - 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, - 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x77, 0x6f, 0x6c, - 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x82, 0x01, 0x63, 0x30, 0x13, 0x06, 0x03, 0x55, - 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x09, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x07, 0xca, 0xa6, 0xa1, 0x9f, 0xbf, 0xaf, 0x92, 0x41, 0x35, 0x66, 0x51, - 0xac, 0xbc, 0x2c, 0xec, 0xe7, 0x8d, 0x65, 0x7e, 0xe9, 0x40, 0xfe, 0x5a, 0xab, 0x8a, 0x1d, 0x3d, - 0x13, 0xdb, 0xb4, 0x43, 0x2c, 0x9a, 0x36, 0x98, 0x21, 0xa5, 0xe8, 0xca, 0xa9, 0x4d, 0xfc, 0xe3, - 0xf7, 0x45, 0x88, 0xcd, 0x33, 0xbf, 0x8a, 0x62, 0x10, 0x2f, 0xb2, 0xb7, 0x04, 0xef, 0x26, 0x43, - 0x51, 0x1d, 0x43, 0x62, 0x7d, 0x1e, 0x50, 0xc8, 0xd5, 0x98, 0x94, 0x71, 0x8f, 0x3b, 0x23, 0x26, - 0xf1, 0x71, 0x8e, 0x1e, 0x3d, 0x3f, 0x21, 0xfd, 0xb7, 0x2d, 0x65, 0xe4, 0x07, 0x65, 0xac, 0x3c, - 0xfc, 0xc0, 0x47, 0xa9, 0x32, 0xf6, 0xda, 0x26, 0x93, 0x10, 0xb2, 0xd1, 0x6d, 0xc8, 0x81, 0x31, - 0x7c, 0xb0, 0x6b, 0xc5, 0x22, 0x8d, 0xb3, 0xfa, 0xbe, 0x82, 0xea, 0x41, 0x42, 0xc4, 0xc0, 0xef, - 0xe3, 0x84, 0x0f, 0x6f, 0x9a, 0x03, 0x63, 0xb3, 0x30, 0xe0, 0x31, 0x81, 0x2a, 0x16, 0xb3, 0x47, - 0xd9, 0x5b, 0x38, 0x93, 0x07, 0xd0, 0x6e, 0x79, 0x52, 0x2c, 0xe5, 0x50, 0x84, 0x79, 0x10, 0xe7, - 0xf6, 0x31, 0x7a, 0x3e, 0x48, 0xa2, 0x38, 0x21, 0x90, 0x7a, 0xf2, 0x5f, 0x48, 0xa4, 0x46, 0x93, - 0x87, 0xdd, 0x5c, 0x83, 0x64, 0xea, 0xb5, 0x99, 0xa2, 0xe9, 0x01, 0x40, 0xfe, 0xf0, 0x48, 0x66, - 0x4f, 0x96, 0xf7, 0x83, 0x52, 0xf8, 0x6d, 0xf8, 0x5f, 0xed, 0x0c, 0xbb, 0xbe, 0xd0, 0x69, 0x10, - 0x4b, 0x99, 0x8f, 0xf8, 0x61, 0x53, 0x9d, 0x12, 0xca, 0x86, 0xaa, 0xb1, 0x80, 0xb4, 0xa6, 0xc1, - 0xcb, 0xb7, 0x48, 0xf7, 0x9f, 0x55, 0xb4, 0x6e, 0xab, 0xd3, 0xa1, 0xaa, 0x4b, 0xa7, 0x21, 0x6e, - 0x16, 0x7f, 0xad, 0xbb, 0xea, 0x0f, 0x41, 0x80, 0x9b, 0x7f, 0xd6, 0x46, 0xa2, 0xc0, 0x61, 0x72, - 0x59, 0x59, 0xa0, 0x07 - }; - OcspEntry entry[1]; - CertStatus status[1]; - OcspRequest* request = NULL; - - byte serial[] = {0x05}; - byte issuerHash[] = {0x71, 0x4d, 0x82, 0x23, 0x40, 0x59, 0xc0, 0x96, 0xa1, 0x37, 0x43, 0xfa, 0x31, 0xdb, 0xba, 0xb1, 0x43, 0x18, 0xda, 0x04}; - byte issuerKeyHash[] = {0x83, 0xc6, 0x3a, 0x89, 0x2c, 0x81, 0xf4, 0x02, 0xd7, 0x9d, 0x4c, 0xe2, 0x2a, 0xc0, 0x71, 0x82, 0x64, 0x44, 0xda, 0x0e}; - - - XMEMSET(entry, 0, sizeof(OcspEntry)); - XMEMSET(status, 0, sizeof(CertStatus)); - - ExpectNotNull(request = wolfSSL_OCSP_REQUEST_new()); - ExpectNotNull(request->serial = (byte*)XMALLOC(sizeof(serial), NULL, - DYNAMIC_TYPE_OCSP_REQUEST)); - - if ((request != NULL) && (request->serial != NULL)) { - request->serialSz = sizeof(serial); - XMEMCPY(request->serial, serial, sizeof(serial)); - XMEMCPY(request->issuerHash, issuerHash, sizeof(issuerHash)); - XMEMCPY(request->issuerKeyHash, issuerKeyHash, sizeof(issuerKeyHash)); - } + unsigned char c; ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); - ExpectIntEQ(wolfSSL_CertManagerEnableOCSP(cm, 0), WOLFSSL_SUCCESS); - ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, - "./certs/ocsp/intermediate1-ca-cert.pem", NULL), WOLFSSL_SUCCESS); - - /* Response should be valid. */ - ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, response, - sizeof(response), NULL, status, entry, request), WOLFSSL_SUCCESS); - - /* Flip a byte in the request serial number, response should be invalid - * now. */ - if ((request != NULL) && (request->serial != NULL)) - request->serial[0] ^= request->serial[0]; - ExpectIntNE(wolfSSL_CertManagerCheckOCSPResponse(cm, response, - sizeof(response), NULL, status, entry, request), WOLFSSL_SUCCESS); - - - wolfSSL_OCSP_REQUEST_free(request); - wolfSSL_CertManagerFree(cm); - - res = EXPECT_RESULT(); -#endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || - * WOLFSSL_APACHE_HTTPD || HAVE_LIGHTY */ -#endif /* HAVE_OCSP */ - return res; -} - -static int test_wolfSSL_CheckOCSPResponse(void) -{ - int result = TEST_SKIPPED; -#if defined(HAVE_OCSP) && !defined(NO_RSA) && defined(OPENSSL_ALL) - EXPECT_DECLS; - const char* responseFile = "./certs/ocsp/test-response.der"; - const char* responseMultiFile = "./certs/ocsp/test-multi-response.der"; - const char* responseNoInternFile = - "./certs/ocsp/test-response-nointern.der"; - const char* caFile = "./certs/ocsp/root-ca-cert.pem"; - OcspResponse* res = NULL; - byte data[4096]; - const unsigned char* pt; - int dataSz = 0; /* initialize to mitigate spurious maybe-uninitialized from - * gcc sanitizer with --enable-heapmath. - */ - XFILE f = XBADFILE; - WOLFSSL_OCSP_BASICRESP* bs = NULL; - WOLFSSL_X509_STORE* st = NULL; - WOLFSSL_X509* issuer = NULL; - - - ExpectTrue((f = XFOPEN(responseFile, "rb")) != XBADFILE); - ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); - XFCLOSE(f); - f = XBADFILE; - - pt = data; - ExpectNotNull(res = wolfSSL_d2i_OCSP_RESPONSE(NULL, &pt, dataSz)); - ExpectNotNull(issuer = wolfSSL_X509_load_certificate_file(caFile, - SSL_FILETYPE_PEM)); - ExpectNotNull(st = wolfSSL_X509_STORE_new()); - ExpectIntEQ(wolfSSL_X509_STORE_add_cert(st, issuer), WOLFSSL_SUCCESS); - ExpectNotNull(bs = wolfSSL_OCSP_response_get1_basic(res)); - ExpectIntEQ(wolfSSL_OCSP_basic_verify(bs, NULL, st, 0), WOLFSSL_SUCCESS); - wolfSSL_OCSP_BASICRESP_free(bs); - bs = NULL; - wolfSSL_OCSP_RESPONSE_free(res); - res = NULL; - wolfSSL_X509_STORE_free(st); - st = NULL; - wolfSSL_X509_free(issuer); - issuer = NULL; - /* check loading a response with optional certs */ - ExpectTrue((f = XFOPEN(responseNoInternFile, "rb")) != XBADFILE); - ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); - if (f != XBADFILE) - XFCLOSE(f); - f = XBADFILE; - - pt = data; - ExpectNotNull(res = wolfSSL_d2i_OCSP_RESPONSE(NULL, &pt, dataSz)); - wolfSSL_OCSP_RESPONSE_free(res); - res = NULL; + wolfSSL_CertManagerFree(NULL); + ExpectIntEQ(wolfSSL_CertManager_up_ref(NULL), 0); + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(NULL), BAD_FUNC_ARG); +#ifdef WOLFSSL_TRUST_PEER_CERT + ExpectIntEQ(wolfSSL_CertManagerUnload_trust_peers(NULL), BAD_FUNC_ARG); +#endif + + ExpectIntEQ(wolfSSL_CertManagerLoadCABuffer_ex(NULL, &c, 1, + WOLFSSL_FILETYPE_ASN1, 0, 0), WOLFSSL_FATAL_ERROR); + +#if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(NULL, NULL, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(cm, NULL, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(NULL, &c, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(NULL, NULL, 1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(NULL, &c, 1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(cm, NULL, 1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(cm, &c, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(cm, &c, 1, -1), + WOLFSSL_BAD_FILETYPE); +#endif - /* check loading a response with multiple certs */ +#if !defined(NO_FILESYSTEM) { - WOLFSSL_CERT_MANAGER* cm = NULL; - OcspEntry *entry = NULL; - CertStatus* status = NULL; - OcspRequest* request = NULL; - - byte serial1[] = {0x01}; - byte serial[] = {0x02}; - - byte issuerHash[] = { - 0x44, 0xA8, 0xDB, 0xD1, 0xBC, 0x97, 0x0A, 0x83, - 0x3B, 0x5B, 0x31, 0x9A, 0x4C, 0xB8, 0xD2, 0x52, - 0x37, 0x15, 0x8A, 0x88 - }; - byte issuerKeyHash[] = { - 0x73, 0xB0, 0x1C, 0xA4, 0x2F, 0x82, 0xCB, 0xCF, - 0x47, 0xA5, 0x38, 0xD7, 0xB0, 0x04, 0x82, 0x3A, - 0x7E, 0x72, 0x15, 0x21 - }; - - ExpectNotNull(entry = (OcspEntry*)XMALLOC(sizeof(OcspEntry), NULL, - DYNAMIC_TYPE_OPENSSL)); - - ExpectNotNull(status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL, - DYNAMIC_TYPE_OPENSSL)); - - if (entry != NULL) - XMEMSET(entry, 0, sizeof(OcspEntry)); - if (status != NULL) - XMEMSET(status, 0, sizeof(CertStatus)); - - ExpectNotNull(request = wolfSSL_OCSP_REQUEST_new()); - ExpectNotNull(request->serial = (byte*)XMALLOC(sizeof(serial), NULL, - DYNAMIC_TYPE_OCSP_REQUEST)); - - if (request != NULL && request->serial != NULL) { - request->serialSz = sizeof(serial); - XMEMCPY(request->serial, serial, sizeof(serial)); - XMEMCPY(request->issuerHash, issuerHash, sizeof(issuerHash)); - XMEMCPY(request->issuerKeyHash, issuerKeyHash, - sizeof(issuerKeyHash)); - } + const char* ca_cert = "./certs/ca-cert.pem"; + #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) + const char* ca_cert_der = "./certs/ca-cert.der"; + #endif + const char* ca_path = "./certs"; - ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); - ExpectIntEQ(wolfSSL_CertManagerEnableOCSP(cm, 0), WOLFSSL_SUCCESS); - ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, caFile, NULL), - WOLFSSL_SUCCESS); + #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) + ExpectIntEQ(wolfSSL_CertManagerVerify(NULL, NULL, -1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, NULL, WOLFSSL_FILETYPE_ASN1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerify(NULL, ca_cert, + WOLFSSL_FILETYPE_PEM), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, ca_cert, -1), + WOLFSSL_BAD_FILETYPE); + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, "no-file", + WOLFSSL_FILETYPE_ASN1), WOLFSSL_BAD_FILE); + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, ca_cert_der, + WOLFSSL_FILETYPE_PEM), ASN_NO_PEM_HEADER); + #endif + + ExpectIntEQ(wolfSSL_CertManagerLoadCA(NULL, NULL, NULL), + WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_CertManagerLoadCA(NULL, ca_cert, NULL), + WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_CertManagerLoadCA(NULL, NULL, ca_path), + WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_CertManagerLoadCA(NULL, ca_cert, ca_path), + WOLFSSL_FATAL_ERROR); + } +#endif - ExpectTrue((f = XFOPEN(responseMultiFile, "rb")) != XBADFILE); - ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); - if (f != XBADFILE) - XFCLOSE(f); - f = XBADFILE; +#ifdef OPENSSL_COMPATIBLE_DEFAULTS + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(cm, 0), 1); +#elif !defined(HAVE_CRL) + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(cm, 0), NOT_COMPILED_IN); +#endif - ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, - dataSz, NULL, status, entry, request), WOLFSSL_SUCCESS); - ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, - dataSz, NULL, entry->status, entry, request), WOLFSSL_SUCCESS); - ExpectNotNull(entry->status); + ExpectIntEQ(wolfSSL_CertManagerDisableCRL(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerDisableCRL(cm), 1); +#ifdef HAVE_CRL + /* Test APIs when CRL is disabled. */ +#ifdef HAVE_CRL_IO + ExpectIntEQ(wolfSSL_CertManagerSetCRL_IOCb(cm, NULL), 1); +#endif + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(cm, server_cert_der_2048, + sizeof_server_cert_der_2048), 1); + ExpectIntEQ(wolfSSL_CertManagerFreeCRL(cm), 1); +#endif + + /* OCSP */ + ExpectIntEQ(wolfSSL_CertManagerEnableOCSP(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerDisableOCSP(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSPStapling(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerDisableOCSPStapling(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSPMustStaple(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerDisableOCSPMustStaple(NULL), BAD_FUNC_ARG); +#if !defined(HAVE_CERTIFICATE_STATUS_REQUEST) && \ + !defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + ExpectIntEQ(wolfSSL_CertManagerDisableOCSPStapling(cm), NOT_COMPILED_IN); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSPMustStaple(cm), NOT_COMPILED_IN); + ExpectIntEQ(wolfSSL_CertManagerDisableOCSPMustStaple(cm), NOT_COMPILED_IN); +#endif + +#ifdef HAVE_OCSP + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(NULL, NULL, -1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(cm, NULL, -1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(NULL, &c, -1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(NULL, &c, 1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(cm, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(cm, &c, -1), BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(NULL, NULL, 0, + NULL, NULL, NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, NULL, 1, + NULL, NULL, NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(NULL, &c, 1, + NULL, NULL, NULL, NULL), BAD_FUNC_ARG); - if (request != NULL && request->serial != NULL) - XMEMCPY(request->serial, serial1, sizeof(serial1)); - ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, - dataSz, NULL, status, entry, request), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerSetOCSPOverrideURL(NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerSetOCSPOverrideURL(NULL, ""), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerSetOCSPOverrideURL(cm, NULL), 1); - /* store both status's in the entry to check that "next" is not - * overwritten */ - if (EXPECT_SUCCESS() && status != NULL && entry != NULL) { - status->next = entry->status; - entry->status = status; - } + ExpectIntEQ(wolfSSL_CertManagerSetOCSP_Cb(NULL, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerSetOCSP_Cb(cm, NULL, NULL, NULL), 1); - if (request != NULL && request->serial != NULL) - XMEMCPY(request->serial, serial, sizeof(serial)); - ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, - dataSz, NULL, entry->status, entry, request), WOLFSSL_SUCCESS); - ExpectNotNull(entry->status->next); + ExpectIntEQ(wolfSSL_CertManagerDisableOCSP(cm), 1); + /* Test APIs when OCSP is disabled. */ + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, &c, 1, + NULL, NULL, NULL, NULL), 1); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(cm, &c, 1), 1); - /* compare the status found */ - ExpectIntEQ(status->serialSz, entry->status->serialSz); - ExpectIntEQ(XMEMCMP(status->serial, entry->status->serial, - status->serialSz), 0); +#endif - if (status != NULL && entry != NULL && entry->status != status) { - XFREE(status, NULL, DYNAMIC_TYPE_OPENSSL); - } - wolfSSL_OCSP_CERTID_free(entry); - wolfSSL_OCSP_REQUEST_free(request); + ExpectIntEQ(wolfSSL_CertManager_up_ref(cm), 1); + if (EXPECT_SUCCESS()) { wolfSSL_CertManagerFree(cm); } + wolfSSL_CertManagerFree(cm); + cm = NULL; -#if defined(WC_RSA_PSS) - { - const char* responsePssFile = "./certs/ocsp/test-response-rsapss.der"; - - /* check loading a response with RSA-PSS signature */ - ExpectTrue((f = XFOPEN(responsePssFile, "rb")) != XBADFILE); - ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); - if (f != XBADFILE) - XFCLOSE(f); + ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); - pt = data; - ExpectNotNull(res = wolfSSL_d2i_OCSP_RESPONSE(NULL, &pt, dataSz)); +#ifdef HAVE_OCSP + ExpectIntEQ(wolfSSL_CertManagerEnableOCSP(cm, WOLFSSL_OCSP_URL_OVERRIDE | + WOLFSSL_OCSP_CHECKALL), 1); +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) || \ + defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + ExpectIntEQ(wolfSSL_CertManagerEnableOCSPStapling(cm), 1); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSPStapling(cm), 1); + ExpectIntEQ(wolfSSL_CertManagerDisableOCSPStapling(cm), 1); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSPStapling(cm), 1); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSPMustStaple(cm), 1); + ExpectIntEQ(wolfSSL_CertManagerDisableOCSPMustStaple(cm), 1); +#endif - /* try to verify the response */ - ExpectNotNull(issuer = wolfSSL_X509_load_certificate_file(caFile, - SSL_FILETYPE_PEM)); - ExpectNotNull(st = wolfSSL_X509_STORE_new()); - ExpectIntEQ(wolfSSL_X509_STORE_add_cert(st, issuer), WOLFSSL_SUCCESS); - ExpectNotNull(bs = wolfSSL_OCSP_response_get1_basic(res)); - ExpectIntEQ(wolfSSL_OCSP_basic_verify(bs, NULL, st, 0), - WOLFSSL_SUCCESS); - wolfSSL_OCSP_BASICRESP_free(bs); - wolfSSL_OCSP_RESPONSE_free(res); - wolfSSL_X509_STORE_free(st); - wolfSSL_X509_free(issuer); - } + ExpectIntEQ(wolfSSL_CertManagerSetOCSPOverrideURL(cm, ""), 1); + ExpectIntEQ(wolfSSL_CertManagerSetOCSPOverrideURL(cm, ""), 1); #endif - result = EXPECT_RESULT(); -#endif /* HAVE_OCSP */ - return result; +#ifdef WOLFSSL_TRUST_PEER_CERT + ExpectIntEQ(wolfSSL_CertManagerUnload_trust_peers(cm), 1); +#endif + wolfSSL_CertManagerFree(cm); +#endif + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerLoadCABuffer(void) { - int res = TEST_SKIPPED; -#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) const char* ca_cert = "./certs/ca-cert.pem"; const char* ca_expired_cert = "./certs/test/expired/expired-ca.pem"; int ret; - ret = test_cm_load_ca_file(ca_cert); + ExpectIntLE(ret = test_cm_load_ca_file(ca_cert), 1); #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) ExpectIntEQ(ret, WOLFSSL_FATAL_ERROR); #elif defined(NO_RSA) @@ -2107,33 +2535,31 @@ ExpectIntEQ(ret, WOLFSSL_SUCCESS); #endif - ret = test_cm_load_ca_file(ca_expired_cert); + ExpectIntLE(ret = test_cm_load_ca_file(ca_expired_cert), 1); #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) ExpectIntEQ(ret, WOLFSSL_FATAL_ERROR); #elif defined(NO_RSA) ExpectIntEQ(ret, ASN_UNKNOWN_OID_E); #elif !(WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY) && \ - !defined(OPENSSL_COMPATIBLE_DEFAULTS) && !defined(NO_ASN_TIME) + !defined(NO_ASN_TIME) ExpectIntEQ(ret, ASN_AFTER_DATE_E); #else ExpectIntEQ(ret, WOLFSSL_SUCCESS); #endif - res = EXPECT_RESULT(); #endif - - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerLoadCABuffer_ex(void) { - int res = TEST_SKIPPED; -#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) const char* ca_cert = "./certs/ca-cert.pem"; const char* ca_expired_cert = "./certs/test/expired/expired-ca.pem"; int ret; - ret = test_cm_load_ca_file_ex(ca_cert, WOLFSSL_LOAD_FLAG_NONE); + ExpectIntLE(ret = test_cm_load_ca_file_ex(ca_cert, WOLFSSL_LOAD_FLAG_NONE), + 1); #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) ExpectIntEQ(ret, WOLFSSL_FATAL_ERROR); #elif defined(NO_RSA) @@ -2142,30 +2568,32 @@ ExpectIntEQ(ret, WOLFSSL_SUCCESS); #endif - ret = test_cm_load_ca_file_ex(ca_expired_cert, - WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY); + ExpectIntLE(ret = test_cm_load_ca_file_ex(ca_expired_cert, + WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY), 1); #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) ExpectIntEQ(ret, WOLFSSL_FATAL_ERROR); #elif defined(NO_RSA) ExpectIntEQ(ret, ASN_UNKNOWN_OID_E); +#elif !(WOLFSSL_LOAD_VERIFY_DEFAULT_FLAGS & WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY) && \ + !defined(NO_ASN_TIME) && defined(WOLFSSL_TRUST_PEER_CERT) && \ + defined(OPENSSL_COMPATIBLE_DEFAULTS) + ExpectIntEQ(ret, ASN_AFTER_DATE_E); #else ExpectIntEQ(ret, WOLFSSL_SUCCESS); #endif - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerGetCerts(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && \ defined(WOLFSSL_SIGNER_DER_CERT) - EXPECT_DECLS; WOLFSSL_CERT_MANAGER* cm = NULL; WOLFSSL_STACK* sk = NULL; X509* x509 = NULL; @@ -2176,7 +2604,7 @@ #endif int i = 0; int ret = 0; - const byte* der; + const byte* der = NULL; int derSz = 0; ExpectNotNull(file1 = fopen("./certs/ca-cert.pem", "rb")); @@ -2186,6 +2614,7 @@ fclose(file1); } + ExpectNull(sk = wolfSSL_CertManagerGetCerts(NULL)); ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); ExpectNull(sk = wolfSSL_CertManagerGetCerts(cm)); @@ -2205,7 +2634,7 @@ ExpectNotNull(sk = wolfSSL_CertManagerGetCerts(cm)); - for (i = 0; i < sk_X509_num(sk); i++) { + for (i = 0; EXPECT_SUCCESS() && i < sk_X509_num(sk); i++) { ExpectNotNull(x509 = sk_X509_value(sk, i)); ExpectIntEQ(0, wolfSSL_X509_cmp(x509, cert1)); @@ -2221,62 +2650,59 @@ wolfSSL_X509_free(cert1); sk_X509_pop_free(sk, NULL); wolfSSL_CertManagerFree(cm); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && \ defined(WOLFSSL_SIGNER_DER_CERT) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerSetVerify(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)) - EXPECT_DECLS; - int ret = 0; WOLFSSL_CERT_MANAGER* cm = NULL; int tmp = myVerifyAction; const char* ca_cert = "./certs/ca-cert.pem"; const char* expiredCert = "./certs/test/expired/expired-cert.pem"; + wolfSSL_CertManagerSetVerify(NULL, NULL); + wolfSSL_CertManagerSetVerify(NULL, myVerify); + ExpectNotNull(cm = wolfSSL_CertManagerNew()); wolfSSL_CertManagerSetVerify(cm, myVerify); - #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) - ExpectIntEQ(ret = wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL), -1); - #else - ExpectIntEQ(ret = wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL), +#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) + ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL), -1); +#else + ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL), WOLFSSL_SUCCESS); - #endif +#endif /* Use the test CB that always accepts certs */ myVerifyAction = VERIFY_OVERRIDE_ERROR; - ExpectIntEQ(ret = wolfSSL_CertManagerVerify(cm, expiredCert, + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, expiredCert, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); #ifdef WOLFSSL_ALWAYS_VERIFY_CB { - const char* verifyCert = "./certs/server-cert.pem"; + const char* verifyCert = "./certs/server-cert.der"; /* Use the test CB that always fails certs */ myVerifyAction = VERIFY_FORCE_FAIL; - ExpectIntEQ(ret = wolfSSL_CertManagerVerify(cm, verifyCert, - WOLFSSL_FILETYPE_PEM), VERIFY_CERT_ERROR); + ExpectIntEQ(wolfSSL_CertManagerVerify(cm, verifyCert, + WOLFSSL_FILETYPE_ASN1), VERIFY_CERT_ERROR); } #endif wolfSSL_CertManagerFree(cm); myVerifyAction = tmp; - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && \ @@ -2300,20 +2726,19 @@ } } #else -#define DEBUG_WRITE_CERT_X509(x509, fileName) -#define DEBUG_WRITE_DER(der, derSz, fileName) +#define DEBUG_WRITE_CERT_X509(x509, fileName) WC_DO_NOTHING +#define DEBUG_WRITE_DER(der, derSz, fileName) WC_DO_NOTHING #endif static int test_wolfSSL_CertManagerNameConstraint(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) && \ defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_ALT_NAMES) && \ !defined(NO_SHA256) - EXPECT_DECLS; WOLFSSL_CERT_MANAGER* cm = NULL; WOLFSSL_EVP_PKEY *priv = NULL; WOLFSSL_X509_NAME* name = NULL; @@ -2458,22 +2883,19 @@ wolfSSL_X509_free(x509); wolfSSL_X509_free(ca); wolfSSL_EVP_PKEY_free(priv); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerNameConstraint2(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) && \ defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_ALT_NAMES) - EXPECT_DECLS; const char* ca_cert = "./certs/test/cert-ext-ndir.der"; const char* ca_cert2 = "./certs/test/cert-ext-ndir-exc.der"; const char* server_cert = "./certs/server-cert.pem"; @@ -2660,22 +3082,19 @@ wolfSSL_X509_free(x509); wolfSSL_X509_free(ca); wolfSSL_EVP_PKEY_free(priv); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerNameConstraint3(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) && \ defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_ALT_NAMES) && \ !defined(NO_SHA256) - EXPECT_DECLS; WOLFSSL_CERT_MANAGER* cm = NULL; WOLFSSL_EVP_PKEY *priv = NULL; WOLFSSL_X509_NAME* name = NULL; @@ -2789,22 +3208,19 @@ wolfSSL_X509_free(x509); wolfSSL_X509_free(ca); wolfSSL_EVP_PKEY_free(priv); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerNameConstraint4(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) && \ defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_ALT_NAMES) && \ !defined(NO_SHA256) - EXPECT_DECLS; WOLFSSL_CERT_MANAGER* cm = NULL; WOLFSSL_EVP_PKEY *priv = NULL; WOLFSSL_X509_NAME* name = NULL; @@ -2965,22 +3381,19 @@ wolfSSL_X509_free(x509); wolfSSL_X509_free(ca); wolfSSL_EVP_PKEY_free(priv); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertManagerNameConstraint5(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CM_VERIFY) && !defined(NO_RSA) && \ defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_ALT_NAMES) && \ !defined(NO_SHA256) - EXPECT_DECLS; WOLFSSL_CERT_MANAGER* cm = NULL; WOLFSSL_EVP_PKEY *priv = NULL; WOLFSSL_X509_NAME* name = NULL; @@ -3137,18 +3550,700 @@ wolfSSL_CertManagerFree(cm); wolfSSL_X509_free(ca); wolfSSL_EVP_PKEY_free(priv); +#endif + return EXPECT_RESULT(); +} - res = TEST_RES_CHECK(1); +static int test_wolfSSL_CertManagerCRL(void) +{ + EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && defined(HAVE_CRL) && \ + !defined(NO_RSA) + const char* ca_cert = "./certs/ca-cert.pem"; + const char* crl1 = "./certs/crl/crl.pem"; + const char* crl2 = "./certs/crl/crl2.pem"; +#ifdef WC_RSA_PSS + const char* crl_rsapss = "./certs/crl/crl_rsapss.pem"; + const char* ca_rsapss = "./certs/rsapss/ca-rsapss.pem"; +#endif + const unsigned char crl_buff[] = { + 0x30, 0x82, 0x02, 0x04, 0x30, 0x81, 0xed, 0x02, + 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x81, 0x94, 0x31, 0x0b, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0c, 0x07, 0x4d, 0x6f, 0x6e, 0x74, + 0x61, 0x6e, 0x61, 0x31, 0x10, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x42, 0x6f, + 0x7a, 0x65, 0x6d, 0x61, 0x6e, 0x31, 0x11, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x08, + 0x53, 0x61, 0x77, 0x74, 0x6f, 0x6f, 0x74, 0x68, + 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x0c, 0x0a, 0x43, 0x6f, 0x6e, 0x73, 0x75, + 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x31, 0x18, 0x30, + 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, + 0x77, 0x77, 0x77, 0x2e, 0x77, 0x6f, 0x6c, 0x66, + 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x31, + 0x1f, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, + 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x77, 0x6f, 0x6c, + 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x17, 0x0d, 0x32, 0x32, 0x31, 0x32, 0x31, 0x36, + 0x32, 0x31, 0x31, 0x37, 0x35, 0x30, 0x5a, 0x17, + 0x0d, 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, + 0x31, 0x31, 0x37, 0x35, 0x30, 0x5a, 0x30, 0x14, + 0x30, 0x12, 0x02, 0x01, 0x02, 0x17, 0x0d, 0x32, + 0x32, 0x31, 0x32, 0x31, 0x36, 0x32, 0x31, 0x31, + 0x37, 0x35, 0x30, 0x5a, 0xa0, 0x0e, 0x30, 0x0c, + 0x30, 0x0a, 0x06, 0x03, 0x55, 0x1d, 0x14, 0x04, + 0x03, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x39, 0x44, 0xff, 0x39, 0xf4, 0x04, 0x45, 0x79, + 0x7e, 0x73, 0xe2, 0x42, 0x48, 0xdb, 0x85, 0x66, + 0xfd, 0x99, 0x76, 0x94, 0x7c, 0xb5, 0x79, 0x5d, + 0x15, 0x71, 0x36, 0xa9, 0x87, 0xf0, 0x73, 0x05, + 0x50, 0x08, 0x6b, 0x1c, 0x6e, 0xde, 0x96, 0x45, + 0x31, 0xc3, 0xc0, 0xba, 0xba, 0xf5, 0x08, 0x1d, + 0x05, 0x4a, 0x52, 0x39, 0xe9, 0x03, 0xef, 0x59, + 0xc8, 0x1d, 0x4a, 0xf2, 0x86, 0x05, 0x99, 0x7b, + 0x4b, 0x74, 0xf6, 0xd3, 0x75, 0x8d, 0xb2, 0x57, + 0xba, 0xac, 0xa7, 0x11, 0x14, 0xd6, 0x6c, 0x71, + 0xc4, 0x4c, 0x1c, 0x68, 0xbc, 0x49, 0x78, 0xf0, + 0xc9, 0x52, 0x8a, 0xe7, 0x8b, 0x54, 0xe6, 0x20, + 0x58, 0x20, 0x60, 0x66, 0xf5, 0x14, 0xd8, 0xcb, + 0xff, 0xe0, 0xa0, 0x45, 0xbc, 0xb4, 0x81, 0xad, + 0x1d, 0xbc, 0xcf, 0xf8, 0x8e, 0xa8, 0x87, 0x24, + 0x55, 0x99, 0xd9, 0xce, 0x47, 0xf7, 0x5b, 0x4a, + 0x33, 0x6d, 0xdb, 0xbf, 0x93, 0x64, 0x1a, 0xa6, + 0x46, 0x5f, 0x27, 0xdc, 0xd8, 0xd4, 0xf9, 0xc2, + 0x42, 0x2a, 0x7e, 0xb2, 0x7c, 0xdd, 0x98, 0x77, + 0xf5, 0x88, 0x7d, 0x15, 0x25, 0x08, 0xbc, 0xe0, + 0xd0, 0x8d, 0xf4, 0xc3, 0xc3, 0x04, 0x41, 0xa4, + 0xd1, 0xb1, 0x39, 0x4a, 0x6b, 0x2c, 0xb5, 0x2e, + 0x9a, 0x65, 0x43, 0x0d, 0x0e, 0x73, 0xf4, 0x06, + 0xe1, 0xb3, 0x49, 0x34, 0x94, 0xb0, 0xb7, 0xff, + 0xc0, 0x27, 0xc1, 0xb5, 0xea, 0x06, 0xf7, 0x71, + 0x71, 0x97, 0xbb, 0xbc, 0xc7, 0x1a, 0x9f, 0xeb, + 0xf6, 0x3d, 0xa5, 0x7b, 0x55, 0xa7, 0xbf, 0xdd, + 0xd7, 0xee, 0x97, 0xb8, 0x9d, 0xdc, 0xcd, 0xe3, + 0x06, 0xdb, 0x9a, 0x2c, 0x60, 0xbf, 0x70, 0x84, + 0xfa, 0x6b, 0x8d, 0x70, 0x7d, 0xde, 0xe8, 0xb7, + 0xab, 0xb0, 0x38, 0x68, 0x6c, 0xc0, 0xb1, 0xe1, + 0xba, 0x45, 0xe0, 0xd7, 0x12, 0x3d, 0x71, 0x5b + }; + + WOLFSSL_CERT_MANAGER* cm = NULL; + + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(cm, WOLFSSL_CRL_CHECKALL), 1); + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(cm, WOLFSSL_CRL_CHECK), 1); + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(cm, + WOLFSSL_CRL_CHECK | WOLFSSL_CRL_CHECKALL), 1); + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(cm, 16), 1); + ExpectIntEQ(wolfSSL_CertManagerEnableCRL(cm, WOLFSSL_CRL_CHECKALL), 1); + + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(NULL, NULL, -1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(cm, NULL, -1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(NULL, server_cert_der_2048, -1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(NULL, server_cert_der_2048, 1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(cm, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(cm, server_cert_der_2048, -1), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(cm, server_cert_der_2048, + sizeof_server_cert_der_2048), ASN_NO_SIGNER_E); + + ExpectIntEQ(wolfSSL_CertManagerSetCRL_Cb(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerSetCRL_Cb(cm, NULL), 1); +#ifdef HAVE_CRL_IO + ExpectIntEQ(wolfSSL_CertManagerSetCRL_IOCb(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerSetCRL_IOCb(cm, NULL), 1); #endif - return res; +#ifndef NO_FILESYSTEM + ExpectIntEQ(wolfSSL_CertManagerLoadCRL(NULL, NULL, WOLFSSL_FILETYPE_ASN1, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRL(cm, NULL, WOLFSSL_FILETYPE_ASN1, + 0), BAD_FUNC_ARG); + /* -1 seen as !WOLFSSL_FILETYPE_PEM */ + ExpectIntEQ(wolfSSL_CertManagerLoadCRL(cm, "./certs/crl", -1, 0), 1); + + ExpectIntEQ(wolfSSL_CertManagerLoadCRLFile(NULL, NULL, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLFile(cm, NULL, WOLFSSL_FILETYPE_ASN1), + BAD_FUNC_ARG); + /* -1 seen as !WOLFSSL_FILETYPE_PEM */ + ExpectIntEQ(wolfSSL_CertManagerLoadCRLFile(cm, "./certs/crl/crl.pem", -1), + ASN_PARSE_E); +#endif + + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(NULL, NULL, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(cm, NULL, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(NULL, crl_buff, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(NULL, NULL, 1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(NULL, crl_buff, 1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(cm, NULL, 1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(cm, crl_buff, -1, + WOLFSSL_FILETYPE_ASN1), BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_CertManagerFreeCRL(NULL), BAD_FUNC_ARG); + DoExpectIntEQ(wolfSSL_CertManagerFreeCRL(cm), 1); + + ExpectIntEQ(WOLFSSL_SUCCESS, + wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL)); + ExpectIntEQ(WOLFSSL_SUCCESS, + wolfSSL_CertManagerLoadCRL(cm, crl1, WOLFSSL_FILETYPE_PEM, 0)); + ExpectIntEQ(WOLFSSL_SUCCESS, + wolfSSL_CertManagerLoadCRL(cm, crl2, WOLFSSL_FILETYPE_PEM, 0)); + wolfSSL_CertManagerFreeCRL(cm); + + ExpectIntEQ(WOLFSSL_SUCCESS, + wolfSSL_CertManagerLoadCRL(cm, crl1, WOLFSSL_FILETYPE_PEM, 0)); + ExpectIntEQ(WOLFSSL_SUCCESS, + wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL)); + ExpectIntEQ(wolfSSL_CertManagerCheckCRL(cm, server_cert_der_2048, + sizeof_server_cert_der_2048), CRL_MISSING); + ExpectIntEQ(wolfSSL_CertManagerVerifyBuffer(cm, server_cert_der_2048, + sizeof_server_cert_der_2048, WOLFSSL_FILETYPE_ASN1), CRL_MISSING); + + ExpectIntEQ(wolfSSL_CertManagerLoadCRLBuffer(cm, crl_buff, sizeof(crl_buff), + WOLFSSL_FILETYPE_ASN1), 1); + +#if !defined(NO_FILESYSTEM) && defined(WC_RSA_PSS) + /* loading should fail without the CA set */ + ExpectIntEQ(wolfSSL_CertManagerLoadCRLFile(cm, crl_rsapss, + WOLFSSL_FILETYPE_PEM), ASN_CRL_NO_SIGNER_E); + + /* now successfully load the RSA-PSS crl once loading in it's CA */ + ExpectIntEQ(WOLFSSL_SUCCESS, + wolfSSL_CertManagerLoadCA(cm, ca_rsapss, NULL)); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLFile(cm, crl_rsapss, + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); +#endif + + wolfSSL_CertManagerFree(cm); +#endif + + return EXPECT_RESULT(); +} + +static int test_wolfSSL_CertManagerCheckOCSPResponse(void) +{ + EXPECT_DECLS; +#if defined(HAVE_OCSP) && !defined(NO_RSA) && !defined(NO_SHA) +/* Need one of these for wolfSSL_OCSP_REQUEST_new. */ +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_APACHE_HTTPD) || \ + defined(HAVE_LIGHTY) + WOLFSSL_CERT_MANAGER* cm = NULL; + /* Raw OCSP response bytes captured using the following setup: + * - Run responder with + * openssl ocsp -port 9999 -ndays 9999 + * -index certs/ocsp/index-intermediate1-ca-issued-certs.txt + * -rsigner certs/ocsp/ocsp-responder-cert.pem + * -rkey certs/ocsp/ocsp-responder-key.pem + * -CA certs/ocsp/intermediate1-ca-cert.pem + * - Run client with + * openssl ocsp -host 127.0.0.1:9999 -respout resp.out + * -issuer certs/ocsp/intermediate1-ca-cert.pem + * -cert certs/ocsp/server1-cert.pem + * -CAfile certs/ocsp/root-ca-cert.pem -noverify + * - Select the response packet in Wireshark, and export it using + * "File->Export Packet Dissection->As "C" Arrays". Select "Selected + * packets only". After importing into the editor, remove the initial + * ~148 bytes of header, ending with the Content-Length and the \r\n\r\n. + */ + static const byte response[] = { + 0x30, 0x82, 0x07, 0x40, /* ....0..@ */ + 0x0a, 0x01, 0x00, 0xa0, 0x82, 0x07, 0x39, 0x30, /* ......90 */ + 0x82, 0x07, 0x35, 0x06, 0x09, 0x2b, 0x06, 0x01, /* ..5..+.. */ + 0x05, 0x05, 0x07, 0x30, 0x01, 0x01, 0x04, 0x82, /* ...0.... */ + 0x07, 0x26, 0x30, 0x82, 0x07, 0x22, 0x30, 0x82, /* .&0.."0. */ + 0x01, 0x40, 0xa1, 0x81, 0xa1, 0x30, 0x81, 0x9e, /* .@...0.. */ + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, /* 1.0...U. */ + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, /* ...US1.0 */ + 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, /* ...U.... */ + 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, /* Washingt */ + 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, /* on1.0... */ + 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x65, 0x61, /* U....Sea */ + 0x74, 0x74, 0x6c, 0x65, 0x31, 0x10, 0x30, 0x0e, /* ttle1.0. */ + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x07, 0x77, /* ..U....w */ + 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x31, 0x14, /* olfSSL1. */ + 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, /* 0...U... */ + 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, /* .Enginee */ + 0x72, 0x69, 0x6e, 0x67, 0x31, 0x1f, 0x30, 0x1d, /* ring1.0. */ + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x77, /* ..U....w */ + 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, 0x4f, /* olfSSL O */ + 0x43, 0x53, 0x50, 0x20, 0x52, 0x65, 0x73, 0x70, /* CSP Resp */ + 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x31, 0x1f, 0x30, /* onder1.0 */ + 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, /* ...*.H.. */ + 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, /* ......in */ + 0x66, 0x6f, 0x40, 0x77, 0x6f, 0x6c, 0x66, 0x73, /* fo@wolfs */ + 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x18, 0x0f, /* sl.com.. */ + 0x32, 0x30, 0x32, 0x33, 0x31, 0x31, 0x30, 0x38, /* 20231108 */ + 0x30, 0x30, 0x32, 0x36, 0x33, 0x37, 0x5a, 0x30, /* 002637Z0 */ + 0x64, 0x30, 0x62, 0x30, 0x3a, 0x30, 0x09, 0x06, /* d0b0:0.. */ + 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, /* .+...... */ + 0x04, 0x14, 0x71, 0x4d, 0x82, 0x23, 0x40, 0x59, /* ..qM.#@Y */ + 0xc0, 0x96, 0xa1, 0x37, 0x43, 0xfa, 0x31, 0xdb, /* ...7C.1. */ + 0xba, 0xb1, 0x43, 0x18, 0xda, 0x04, 0x04, 0x14, /* ..C..... */ + 0x83, 0xc6, 0x3a, 0x89, 0x2c, 0x81, 0xf4, 0x02, /* ..:.,... */ + 0xd7, 0x9d, 0x4c, 0xe2, 0x2a, 0xc0, 0x71, 0x82, /* ..L.*.q. */ + 0x64, 0x44, 0xda, 0x0e, 0x02, 0x01, 0x05, 0x80, /* dD...... */ + 0x00, 0x18, 0x0f, 0x32, 0x30, 0x32, 0x33, 0x31, /* ...20231 */ + 0x31, 0x30, 0x38, 0x30, 0x30, 0x32, 0x36, 0x33, /* 10800263 */ + 0x37, 0x5a, 0xa0, 0x11, 0x18, 0x0f, 0x32, 0x30, /* 7Z....20 */ + 0x35, 0x31, 0x30, 0x33, 0x32, 0x35, 0x30, 0x30, /* 51032500 */ + 0x32, 0x36, 0x33, 0x37, 0x5a, 0xa1, 0x23, 0x30, /* 2637Z.#0 */ + 0x21, 0x30, 0x1f, 0x06, 0x09, 0x2b, 0x06, 0x01, /* !0...+.. */ + 0x05, 0x05, 0x07, 0x30, 0x01, 0x02, 0x04, 0x12, /* ...0.... */ + 0x04, 0x10, 0xdb, 0xbc, 0x2a, 0x76, 0xa0, 0xb4, /* ....*v.. */ + 0x1e, 0x5d, 0xf6, 0x2b, 0x8e, 0x38, 0x62, 0xdb, /* .].+.8b. */ + 0x90, 0xed, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, /* ..0...*. */ + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, /* H....... */ + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x87, 0xde, /* ........ */ + 0xfb, 0xf9, 0x3a, 0x90, 0x1f, 0x90, 0xde, 0xcf, /* ..:..... */ + 0xfe, 0xad, 0x64, 0x19, 0x34, 0x17, 0xf8, 0x15, /* ..d.4... */ + 0x01, 0x22, 0x5f, 0x67, 0x41, 0xa4, 0x18, 0xf7, /* ."_gA... */ + 0x16, 0xb7, 0xc9, 0xf3, 0xe1, 0x9f, 0xcd, 0x40, /* .......@ */ + 0x56, 0x77, 0x6e, 0x6a, 0xfb, 0x92, 0x6a, 0x6f, /* Vwnj..jo */ + 0x28, 0x3e, 0x22, 0x48, 0xa1, 0xc2, 0xd8, 0x1d, /* (>"H.... */ + 0xc7, 0xe6, 0x78, 0x7f, 0xb6, 0x09, 0xfe, 0x2c, /* ..x...., */ + 0xb5, 0xef, 0x29, 0x7c, 0xc5, 0x51, 0x16, 0x7b, /* ..)|.Q.{ */ + 0x8f, 0xfb, 0x44, 0xa8, 0xcd, 0xf5, 0x5c, 0x0f, /* ..D...\. */ + 0x46, 0x0e, 0xb1, 0xa4, 0xeb, 0x5b, 0xf5, 0x86, /* F....[.. */ + 0x11, 0x0f, 0xcd, 0xe2, 0xe5, 0x3c, 0x91, 0x72, /* .....<.r */ + 0x0d, 0x6a, 0xcb, 0x95, 0x99, 0x39, 0x91, 0x48, /* .j...9.H */ + 0x65, 0x97, 0xb9, 0x78, 0xb5, 0x88, 0x7f, 0x76, /* e..x...v */ + 0xa1, 0x43, 0x2f, 0xf6, 0x1f, 0x49, 0xb7, 0x08, /* .C/..I.. */ + 0x36, 0xe4, 0x2e, 0x34, 0x25, 0xda, 0x16, 0x74, /* 6..4%..t */ + 0x47, 0x62, 0x56, 0xff, 0x2f, 0x02, 0x03, 0x44, /* GbV./..D */ + 0x89, 0x04, 0xe7, 0xb8, 0xde, 0x0a, 0x35, 0x43, /* ......5C */ + 0xae, 0xd7, 0x54, 0xbe, 0xc3, 0x7c, 0x95, 0xa5, /* ..T..|.. */ + 0xc8, 0xe0, 0x2e, 0x52, 0xb6, 0xea, 0x99, 0x45, /* ...R...E */ + 0xfd, 0xda, 0x4b, 0xd5, 0x79, 0x07, 0x64, 0xca, /* ..K.y.d. */ + 0x64, 0xba, 0x52, 0x12, 0x62, 0x8c, 0x08, 0x9a, /* d.R.b... */ + 0x32, 0xeb, 0x85, 0x65, 0x05, 0x39, 0x07, 0x5d, /* 2..e.9.] */ + 0x39, 0x4a, 0xcf, 0xa5, 0x30, 0xf6, 0xd1, 0xf7, /* 9J..0... */ + 0x29, 0xaa, 0x23, 0x42, 0xc6, 0x85, 0x16, 0x7f, /* ).#B.... */ + 0x64, 0x16, 0xb1, 0xb0, 0x5d, 0xcd, 0x88, 0x2d, /* d...]..- */ + 0x06, 0xb0, 0xa9, 0xdf, 0xa3, 0x9f, 0x25, 0x41, /* ......%A */ + 0x89, 0x9a, 0x19, 0xe1, 0xaa, 0xcd, 0xdf, 0x51, /* .......Q */ + 0xcb, 0xa9, 0xc3, 0x7e, 0x27, 0xbc, 0x7d, 0x9b, /* ...~'.}. */ + 0x6f, 0x4d, 0x79, 0x87, 0x09, 0x3f, 0xac, 0xd2, /* oMy..?.. */ + 0x4a, 0x3b, 0xbe, 0xf8, 0x7a, 0xa4, 0x93, 0x45, /* J;..z..E */ + 0x11, 0x64, 0x40, 0xc5, 0x03, 0xc9, 0x24, 0x5b, /* .d@...$[ */ + 0xe9, 0x6d, 0xfc, 0x94, 0x08, 0xbe, 0xa0, 0x82, /* .m...... */ + 0x04, 0xc6, 0x30, 0x82, 0x04, 0xc2, 0x30, 0x82, /* ..0...0. */ + 0x04, 0xbe, 0x30, 0x82, 0x03, 0xa6, 0xa0, 0x03, /* ..0..... */ + 0x02, 0x01, 0x02, 0x02, 0x01, 0x04, 0x30, 0x0d, /* ......0. */ + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, /* ..*.H... */ + 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, 0x97, /* .....0.. */ + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, /* 1.0...U. */ + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, /* ...US1.0 */ + 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, /* ...U.... */ + 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, /* Washingt */ + 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, /* on1.0... */ + 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, 0x65, 0x61, /* U....Sea */ + 0x74, 0x74, 0x6c, 0x65, 0x31, 0x10, 0x30, 0x0e, /* ttle1.0. */ + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x07, 0x77, /* ..U....w */ + 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x31, 0x14, /* olfSSL1. */ + 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, /* 0...U... */ + 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, /* .Enginee */ + 0x72, 0x69, 0x6e, 0x67, 0x31, 0x18, 0x30, 0x16, /* ring1.0. */ + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x77, /* ..U....w */ + 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, 0x72, /* olfSSL r */ + 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x31, 0x1f, /* oot CA1. */ + 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, /* 0...*.H. */ + 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, /* .......i */ + 0x6e, 0x66, 0x6f, 0x40, 0x77, 0x6f, 0x6c, 0x66, /* nfo@wolf */ + 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x30, /* ssl.com0 */ + 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x31, 0x32, 0x31, /* ...22121 */ + 0x36, 0x32, 0x31, 0x31, 0x37, 0x35, 0x30, 0x5a, /* 6211750Z */ + 0x17, 0x0d, 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, /* ..250911 */ + 0x32, 0x31, 0x31, 0x37, 0x35, 0x30, 0x5a, 0x30, /* 211750Z0 */ + 0x81, 0x9e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, /* ..1.0... */ + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, /* U....US1 */ + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, /* .0...U.. */ + 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, /* ..Washin */ + 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x10, 0x30, 0x0e, /* gton1.0. */ + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x53, /* ..U....S */ + 0x65, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x31, 0x10, /* eattle1. */ + 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, /* 0...U... */ + 0x07, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, /* .wolfSSL */ + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, /* 1.0...U. */ + 0x0b, 0x0c, 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, /* ...Engin */ + 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x1f, /* eering1. */ + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, /* 0...U... */ + 0x16, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, /* .wolfSSL */ + 0x20, 0x4f, 0x43, 0x53, 0x50, 0x20, 0x52, 0x65, /* OCSP Re */ + 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x31, /* sponder1 */ + 0x1f, 0x30, 0x1d, 0x06, 0x09, 0x2a, 0x86, 0x48, /* .0...*.H */ + 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x10, /* ........ */ + 0x69, 0x6e, 0x66, 0x6f, 0x40, 0x77, 0x6f, 0x6c, /* info@wol */ + 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, /* fssl.com */ + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, /* 0.."0... */ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, /* *.H..... */ + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, /* ........ */ + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, /* 0....... */ + 0x00, 0xb8, 0xba, 0x23, 0xb4, 0xf6, 0xc3, 0x7b, /* ...#...{ */ + 0x14, 0xc3, 0xa4, 0xf5, 0x1d, 0x61, 0xa1, 0xf5, /* .....a.. */ + 0x1e, 0x63, 0xb9, 0x85, 0x23, 0x34, 0x50, 0x6d, /* .c..#4Pm */ + 0xf8, 0x7c, 0xa2, 0x8a, 0x04, 0x8b, 0xd5, 0x75, /* .|.....u */ + 0x5c, 0x2d, 0xf7, 0x63, 0x88, 0xd1, 0x07, 0x7a, /* \-.c...z */ + 0xea, 0x0b, 0x45, 0x35, 0x2b, 0xeb, 0x1f, 0xb1, /* ..E5+... */ + 0x22, 0xb4, 0x94, 0x41, 0x38, 0xe2, 0x9d, 0x74, /* "..A8..t */ + 0xd6, 0x8b, 0x30, 0x22, 0x10, 0x51, 0xc5, 0xdb, /* ..0".Q.. */ + 0xca, 0x3f, 0x46, 0x2b, 0xfe, 0xe5, 0x5a, 0x3f, /* .?F+..Z? */ + 0x41, 0x74, 0x67, 0x75, 0x95, 0xa9, 0x94, 0xd5, /* Atgu.... */ + 0xc3, 0xee, 0x42, 0xf8, 0x8d, 0xeb, 0x92, 0x95, /* ..B..... */ + 0xe1, 0xd9, 0x65, 0xb7, 0x43, 0xc4, 0x18, 0xde, /* ..e.C... */ + 0x16, 0x80, 0x90, 0xce, 0x24, 0x35, 0x21, 0xc4, /* ....$5!. */ + 0x55, 0xac, 0x5a, 0x51, 0xe0, 0x2e, 0x2d, 0xb3, /* U.ZQ..-. */ + 0x0a, 0x5a, 0x4f, 0x4a, 0x73, 0x31, 0x50, 0xee, /* .ZOJs1P. */ + 0x4a, 0x16, 0xbd, 0x39, 0x8b, 0xad, 0x05, 0x48, /* J..9...H */ + 0x87, 0xb1, 0x99, 0xe2, 0x10, 0xa7, 0x06, 0x72, /* .......r */ + 0x67, 0xca, 0x5c, 0xd1, 0x97, 0xbd, 0xc8, 0xf1, /* g.\..... */ + 0x76, 0xf8, 0xe0, 0x4a, 0xec, 0xbc, 0x93, 0xf4, /* v..J.... */ + 0x66, 0x4c, 0x28, 0x71, 0xd1, 0xd8, 0x66, 0x03, /* fL(q..f. */ + 0xb4, 0x90, 0x30, 0xbb, 0x17, 0xb0, 0xfe, 0x97, /* ..0..... */ + 0xf5, 0x1e, 0xe8, 0xc7, 0x5d, 0x9b, 0x8b, 0x11, /* ....]... */ + 0x19, 0x12, 0x3c, 0xab, 0x82, 0x71, 0x78, 0xff, /* ..<..qx. */ + 0xae, 0x3f, 0x32, 0xb2, 0x08, 0x71, 0xb2, 0x1b, /* .?2..q.. */ + 0x8c, 0x27, 0xac, 0x11, 0xb8, 0xd8, 0x43, 0x49, /* .'....CI */ + 0xcf, 0xb0, 0x70, 0xb1, 0xf0, 0x8c, 0xae, 0xda, /* ..p..... */ + 0x24, 0x87, 0x17, 0x3b, 0xd8, 0x04, 0x65, 0x6c, /* $..;..el */ + 0x00, 0x76, 0x50, 0xef, 0x15, 0x08, 0xd7, 0xb4, /* .vP..... */ + 0x73, 0x68, 0x26, 0x14, 0x87, 0x95, 0xc3, 0x5f, /* sh&...._ */ + 0x6e, 0x61, 0xb8, 0x87, 0x84, 0xfa, 0x80, 0x1a, /* na...... */ + 0x0a, 0x8b, 0x98, 0xf3, 0xe3, 0xff, 0x4e, 0x44, /* ......ND */ + 0x1c, 0x65, 0x74, 0x7c, 0x71, 0x54, 0x65, 0xe5, /* .et|qTe. */ + 0x39, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, /* 9....... */ + 0x01, 0x0a, 0x30, 0x82, 0x01, 0x06, 0x30, 0x09, /* ..0...0. */ + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, /* ..U....0 */ + 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, /* .0...U.. */ + 0x04, 0x16, 0x04, 0x14, 0x32, 0x67, 0xe1, 0xb1, /* ....2g.. */ + 0x79, 0xd2, 0x81, 0xfc, 0x9f, 0x23, 0x0c, 0x70, /* y....#.p */ + 0x40, 0x50, 0xb5, 0x46, 0x56, 0xb8, 0x30, 0x36, /* @P.FV.06 */ + 0x30, 0x81, 0xc4, 0x06, 0x03, 0x55, 0x1d, 0x23, /* 0....U.# */ + 0x04, 0x81, 0xbc, 0x30, 0x81, 0xb9, 0x80, 0x14, /* ...0.... */ + 0x73, 0xb0, 0x1c, 0xa4, 0x2f, 0x82, 0xcb, 0xcf, /* s.../... */ + 0x47, 0xa5, 0x38, 0xd7, 0xb0, 0x04, 0x82, 0x3a, /* G.8....: */ + 0x7e, 0x72, 0x15, 0x21, 0xa1, 0x81, 0x9d, 0xa4, /* ~r.!.... */ + 0x81, 0x9a, 0x30, 0x81, 0x97, 0x31, 0x0b, 0x30, /* ..0..1.0 */ + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, /* ...U.... */ + 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, /* US1.0... */ + 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, /* U....Was */ + 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, /* hington1 */ + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, /* .0...U.. */ + 0x0c, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6c, /* ..Seattl */ + 0x65, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, /* e1.0...U */ + 0x04, 0x0a, 0x0c, 0x07, 0x77, 0x6f, 0x6c, 0x66, /* ....wolf */ + 0x53, 0x53, 0x4c, 0x31, 0x14, 0x30, 0x12, 0x06, /* SSL1.0.. */ + 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x45, 0x6e, /* .U....En */ + 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, /* gineerin */ + 0x67, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, /* g1.0...U */ + 0x04, 0x03, 0x0c, 0x0f, 0x77, 0x6f, 0x6c, 0x66, /* ....wolf */ + 0x53, 0x53, 0x4c, 0x20, 0x72, 0x6f, 0x6f, 0x74, /* SSL root */ + 0x20, 0x43, 0x41, 0x31, 0x1f, 0x30, 0x1d, 0x06, /* CA1.0.. */ + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, /* .*.H.... */ + 0x09, 0x01, 0x16, 0x10, 0x69, 0x6e, 0x66, 0x6f, /* ....info */ + 0x40, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, /* @wolfssl */ + 0x2e, 0x63, 0x6f, 0x6d, 0x82, 0x01, 0x63, 0x30, /* .com..c0 */ + 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, /* ...U.%.. */ + 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, /* 0...+... */ + 0x05, 0x07, 0x03, 0x09, 0x30, 0x0d, 0x06, 0x09, /* ....0... */ + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, /* *.H..... */ + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, /* ........ */ + 0x2f, 0xb7, 0x6b, 0xec, 0xb7, 0x12, 0x63, 0xb9, /* /.k...c. */ + 0x57, 0xdc, 0x04, 0x4d, 0x9c, 0x67, 0x74, 0x98, /* W..M.gt. */ + 0x06, 0x28, 0x68, 0x37, 0x34, 0xc2, 0x50, 0xe9, /* .(h74.P. */ + 0x2a, 0xd4, 0x1a, 0xb2, 0x32, 0x1a, 0x9d, 0x2b, /* *...2..+ */ + 0x4f, 0x23, 0x50, 0xea, 0xb4, 0x95, 0x86, 0xc3, /* O#P..... */ + 0xb9, 0x5f, 0x34, 0x3e, 0x99, 0x91, 0xa7, 0x80, /* ._4>.... */ + 0x5f, 0x6e, 0x1b, 0x6e, 0xdb, 0xe9, 0x02, 0x38, /* _n.n...8 */ + 0x6f, 0xdf, 0xc5, 0x9b, 0x0d, 0xa3, 0x1c, 0xa9, /* o....... */ + 0x15, 0x76, 0x16, 0x66, 0xa8, 0x4e, 0xfb, 0xd3, /* .v.f.N.. */ + 0x43, 0x76, 0xf1, 0x72, 0xb7, 0xd1, 0xfa, 0xee, /* Cv.r.... */ + 0x39, 0xa6, 0x96, 0xc1, 0xa2, 0x93, 0xa4, 0x9b, /* 9....... */ + 0x1e, 0x9f, 0xba, 0x71, 0x8f, 0xba, 0xbd, 0x67, /* ...q...g */ + 0x6a, 0xf2, 0x15, 0x5f, 0xf1, 0x64, 0xe7, 0xcf, /* j.._.d.. */ + 0x26, 0xb8, 0x4c, 0xc0, 0xeb, 0x85, 0x04, 0x58, /* &.L....X */ + 0xd9, 0x4a, 0x6b, 0xd9, 0x86, 0xf5, 0x80, 0x21, /* .Jk....! */ + 0xbf, 0x91, 0xc8, 0x4b, 0x9f, 0x04, 0xed, 0x57, /* ...K...W */ + 0x7a, 0xd2, 0x58, 0xac, 0x5b, 0x47, 0xaf, 0x4d, /* z.X.[G.M */ + 0x7f, 0x5b, 0x1d, 0x6d, 0x68, 0x9b, 0x84, 0x98, /* .[.mh... */ + 0x2a, 0x31, 0x02, 0x2c, 0xe9, 0x1b, 0xaf, 0x11, /* *1.,.... */ + 0x0b, 0x78, 0x49, 0xbe, 0x68, 0x68, 0xcb, 0x9c, /* .xI.hh.. */ + 0x41, 0x56, 0xe8, 0xb5, 0x59, 0xda, 0xff, 0xca, /* AV..Y... */ + 0x59, 0x99, 0x17, 0x3e, 0x11, 0x0a, 0x8f, 0x49, /* Y..>...I */ + 0x24, 0x0b, 0x81, 0x42, 0x63, 0xcd, 0x4f, 0xf6, /* $..Bc.O. */ + 0x2b, 0x9d, 0xd1, 0x79, 0x75, 0xd7, 0x4a, 0xcc, /* +..yu.J. */ + 0x4c, 0xb7, 0x2b, 0xd7, 0xe8, 0xe7, 0xd4, 0x48, /* L.+....H */ + 0x3c, 0x14, 0x3b, 0x1c, 0x28, 0xe8, 0x46, 0x7a, /* <.;.(.Fz */ + 0xdc, 0x11, 0x9d, 0x7f, 0x1c, 0xab, 0x10, 0x95, /* ........ */ + 0x17, 0xb2, 0xc7, 0x7a, 0xbb, 0x17, 0x44, 0x59, /* ...z..DY */ + 0x69, 0x8e, 0x16, 0x05, 0x94, 0x8c, 0x88, 0xd9, /* i....... */ + 0xdc, 0x9a, 0xfd, 0xf2, 0x93, 0xbe, 0x68, 0xba, /* ......h. */ + 0x3c, 0xd6, 0x2b, 0x61, 0x3a, 0x8b, 0xf7, 0x66, /* <.+a:..f */ + 0xcb, 0x54, 0xe8, 0xe4, 0xdb, 0x9f, 0xcc, 0x9e /* .T...... */ + }; + OcspEntry entry[1]; + CertStatus status[1]; + OcspRequest* request = NULL; +#ifndef NO_FILESYSTEM + const char* ca_cert = "./certs/ca-cert.pem"; +#endif + + byte serial[] = {0x05}; + byte issuerHash[] = {0x71, 0x4d, 0x82, 0x23, 0x40, 0x59, 0xc0, 0x96, 0xa1, 0x37, 0x43, 0xfa, 0x31, 0xdb, 0xba, 0xb1, 0x43, 0x18, 0xda, 0x04}; + byte issuerKeyHash[] = {0x83, 0xc6, 0x3a, 0x89, 0x2c, 0x81, 0xf4, 0x02, 0xd7, 0x9d, 0x4c, 0xe2, 0x2a, 0xc0, 0x71, 0x82, 0x64, 0x44, 0xda, 0x0e}; + + + XMEMSET(entry, 0, sizeof(OcspEntry)); + XMEMSET(status, 0, sizeof(CertStatus)); + + ExpectNotNull(request = wolfSSL_OCSP_REQUEST_new()); + ExpectNotNull(request->serial = (byte*)XMALLOC(sizeof(serial), NULL, + DYNAMIC_TYPE_OCSP_REQUEST)); + + if ((request != NULL) && (request->serial != NULL)) { + request->serialSz = sizeof(serial); + XMEMCPY(request->serial, serial, sizeof(serial)); + XMEMCPY(request->issuerHash, issuerHash, sizeof(issuerHash)); + XMEMCPY(request->issuerKeyHash, issuerKeyHash, sizeof(issuerKeyHash)); + } + + ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSP(cm, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, + "./certs/ocsp/intermediate1-ca-cert.pem", NULL), WOLFSSL_SUCCESS); + + /* Response should be valid. */ + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, (byte *)response, + sizeof(response), NULL, status, entry, request), WOLFSSL_SUCCESS); + + /* Flip a byte in the request serial number, response should be invalid + * now. */ + if ((request != NULL) && (request->serial != NULL)) + request->serial[0] ^= request->serial[0]; + ExpectIntNE(wolfSSL_CertManagerCheckOCSPResponse(cm, (byte *)response, + sizeof(response), NULL, status, entry, request), WOLFSSL_SUCCESS); + +#ifndef NO_FILESYSTEM + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(cm, server_cert_der_2048, + sizeof(server_cert_der_2048)), ASN_NO_SIGNER_E); + ExpectIntEQ(WOLFSSL_SUCCESS, + wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL)); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSP(cm, server_cert_der_2048, + sizeof(server_cert_der_2048)), 1); +#endif + + wolfSSL_OCSP_REQUEST_free(request); + wolfSSL_CertManagerFree(cm); +#endif /* OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || + * WOLFSSL_APACHE_HTTPD || HAVE_LIGHTY */ +#endif /* HAVE_OCSP */ + return EXPECT_RESULT(); +} + +static int test_wolfSSL_CheckOCSPResponse(void) +{ + EXPECT_DECLS; +#if defined(HAVE_OCSP) && !defined(NO_RSA) && !defined(NO_SHA) && \ + defined(OPENSSL_ALL) + const char* responseFile = "./certs/ocsp/test-response.der"; + const char* responseMultiFile = "./certs/ocsp/test-multi-response.der"; + const char* responseNoInternFile = + "./certs/ocsp/test-response-nointern.der"; + const char* caFile = "./certs/ocsp/root-ca-cert.pem"; + OcspResponse* res = NULL; + byte data[4096]; + const unsigned char* pt; + int dataSz = 0; /* initialize to mitigate spurious maybe-uninitialized from + * gcc sanitizer with --enable-heapmath. + */ + XFILE f = XBADFILE; + WOLFSSL_OCSP_BASICRESP* bs = NULL; + WOLFSSL_X509_STORE* st = NULL; + WOLFSSL_X509* issuer = NULL; + + + ExpectTrue((f = XFOPEN(responseFile, "rb")) != XBADFILE); + ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } + + pt = data; + ExpectNotNull(res = wolfSSL_d2i_OCSP_RESPONSE(NULL, &pt, dataSz)); + ExpectNotNull(issuer = wolfSSL_X509_load_certificate_file(caFile, + SSL_FILETYPE_PEM)); + ExpectNotNull(st = wolfSSL_X509_STORE_new()); + ExpectIntEQ(wolfSSL_X509_STORE_add_cert(st, issuer), WOLFSSL_SUCCESS); + ExpectNotNull(bs = wolfSSL_OCSP_response_get1_basic(res)); + ExpectIntEQ(wolfSSL_OCSP_basic_verify(bs, NULL, st, 0), WOLFSSL_SUCCESS); + wolfSSL_OCSP_BASICRESP_free(bs); + bs = NULL; + wolfSSL_OCSP_RESPONSE_free(res); + res = NULL; + wolfSSL_X509_STORE_free(st); + st = NULL; + wolfSSL_X509_free(issuer); + issuer = NULL; + + /* check loading a response with optional certs */ + ExpectTrue((f = XFOPEN(responseNoInternFile, "rb")) != XBADFILE); + ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); + if (f != XBADFILE) + XFCLOSE(f); + f = XBADFILE; + + pt = data; + ExpectNotNull(res = wolfSSL_d2i_OCSP_RESPONSE(NULL, &pt, dataSz)); + wolfSSL_OCSP_RESPONSE_free(res); + res = NULL; + + /* check loading a response with multiple certs */ + { + WOLFSSL_CERT_MANAGER* cm = NULL; + OcspEntry *entry = NULL; + CertStatus* status = NULL; + OcspRequest* request = NULL; + + byte serial1[] = {0x01}; + byte serial[] = {0x02}; + + byte issuerHash[] = { + 0x44, 0xA8, 0xDB, 0xD1, 0xBC, 0x97, 0x0A, 0x83, + 0x3B, 0x5B, 0x31, 0x9A, 0x4C, 0xB8, 0xD2, 0x52, + 0x37, 0x15, 0x8A, 0x88 + }; + byte issuerKeyHash[] = { + 0x73, 0xB0, 0x1C, 0xA4, 0x2F, 0x82, 0xCB, 0xCF, + 0x47, 0xA5, 0x38, 0xD7, 0xB0, 0x04, 0x82, 0x3A, + 0x7E, 0x72, 0x15, 0x21 + }; + + ExpectNotNull(entry = (OcspEntry*)XMALLOC(sizeof(OcspEntry), NULL, + DYNAMIC_TYPE_OPENSSL)); + + ExpectNotNull(status = (CertStatus*)XMALLOC(sizeof(CertStatus), NULL, + DYNAMIC_TYPE_OPENSSL)); + + if (entry != NULL) + XMEMSET(entry, 0, sizeof(OcspEntry)); + if (status != NULL) + XMEMSET(status, 0, sizeof(CertStatus)); + + ExpectNotNull(request = wolfSSL_OCSP_REQUEST_new()); + ExpectNotNull(request->serial = (byte*)XMALLOC(sizeof(serial), NULL, + DYNAMIC_TYPE_OCSP_REQUEST)); + + if (request != NULL && request->serial != NULL) { + request->serialSz = sizeof(serial); + XMEMCPY(request->serial, serial, sizeof(serial)); + XMEMCPY(request->issuerHash, issuerHash, sizeof(issuerHash)); + XMEMCPY(request->issuerKeyHash, issuerKeyHash, + sizeof(issuerKeyHash)); + } + + ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); + ExpectIntEQ(wolfSSL_CertManagerEnableOCSP(cm, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, caFile, NULL), + WOLFSSL_SUCCESS); + + ExpectTrue((f = XFOPEN(responseMultiFile, "rb")) != XBADFILE); + ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); + if (f != XBADFILE) + XFCLOSE(f); + f = XBADFILE; + + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, + dataSz, NULL, status, entry, request), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, + dataSz, NULL, entry->status, entry, request), WOLFSSL_SUCCESS); + ExpectNotNull(entry->status); + + if (request != NULL && request->serial != NULL) + XMEMCPY(request->serial, serial1, sizeof(serial1)); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, + dataSz, NULL, status, entry, request), WOLFSSL_SUCCESS); + + /* store both status's in the entry to check that "next" is not + * overwritten */ + if (EXPECT_SUCCESS() && status != NULL && entry != NULL) { + status->next = entry->status; + entry->status = status; + } + + if (request != NULL && request->serial != NULL) + XMEMCPY(request->serial, serial, sizeof(serial)); + ExpectIntEQ(wolfSSL_CertManagerCheckOCSPResponse(cm, data, + dataSz, NULL, entry->status, entry, request), WOLFSSL_SUCCESS); + ExpectNotNull(entry->status->next); + + /* compare the status found */ + ExpectIntEQ(status->serialSz, entry->status->serialSz); + ExpectIntEQ(XMEMCMP(status->serial, entry->status->serial, + status->serialSz), 0); + + if (status != NULL && entry != NULL && entry->status != status) { + XFREE(status, NULL, DYNAMIC_TYPE_OPENSSL); + } + wolfSSL_OCSP_CERTID_free(entry); + wolfSSL_OCSP_REQUEST_free(request); + wolfSSL_CertManagerFree(cm); + } + +#if defined(WC_RSA_PSS) + { + const char* responsePssFile = "./certs/ocsp/test-response-rsapss.der"; + + /* check loading a response with RSA-PSS signature */ + ExpectTrue((f = XFOPEN(responsePssFile, "rb")) != XBADFILE); + ExpectIntGT(dataSz = (word32)XFREAD(data, 1, sizeof(data), f), 0); + if (f != XBADFILE) + XFCLOSE(f); + + pt = data; + ExpectNotNull(res = wolfSSL_d2i_OCSP_RESPONSE(NULL, &pt, dataSz)); + + /* try to verify the response */ + ExpectNotNull(issuer = wolfSSL_X509_load_certificate_file(caFile, + SSL_FILETYPE_PEM)); + ExpectNotNull(st = wolfSSL_X509_STORE_new()); + ExpectIntEQ(wolfSSL_X509_STORE_add_cert(st, issuer), WOLFSSL_SUCCESS); + ExpectNotNull(bs = wolfSSL_OCSP_response_get1_basic(res)); + ExpectIntEQ(wolfSSL_OCSP_basic_verify(bs, NULL, st, 0), + WOLFSSL_SUCCESS); + wolfSSL_OCSP_BASICRESP_free(bs); + wolfSSL_OCSP_RESPONSE_free(res); + wolfSSL_X509_STORE_free(st); + wolfSSL_X509_free(issuer); + } +#endif +#endif /* HAVE_OCSP */ + return EXPECT_RESULT(); } static int test_wolfSSL_FPKI(void) { - int res = TEST_SKIPPED; -#if defined(WOLFSSL_FPKI) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) EXPECT_DECLS; +#if defined(WOLFSSL_FPKI) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) XFILE f = XBADFILE; const char* fpkiCert = "./certs/fpki-cert.der"; DecodedCert cert; @@ -3164,7 +4259,7 @@ if (f != XBADFILE) XFCLOSE(f); - wc_InitDecodedCert(&cert, buf, bytes, NULL); + wc_InitDecodedCert(&cert, buf, (word32)bytes, NULL); ExpectIntEQ(wc_ParseCert(&cert, CERT_TYPE, 0, NULL), 0); ExpectIntEQ(wc_GetFASCNFromCert(&cert, NULL, &fascnSz), LENGTH_ONLY_E) ; ExpectNotNull(fascn = (byte*)XMALLOC(fascnSz, NULL, @@ -3177,20 +4272,17 @@ ExpectIntEQ(wc_GetUUIDFromCert(&cert, uuid, &uuidSz), 0); XFREE(uuid, NULL, DYNAMIC_TYPE_TMP_BUFFER); wc_FreeDecodedCert(&cert); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* use RID in confuncture with other names to test parsing of unknown other * names */ static int test_wolfSSL_OtherName(void) { - int res = TEST_SKIPPED; -#if !defined(NO_RSA) && !defined(NO_FILESYSTEM) EXPECT_DECLS; +#if !defined(NO_RSA) && !defined(NO_FILESYSTEM) XFILE f = XBADFILE; const char* ridCert = "./certs/rid-cert.der"; DecodedCert cert; @@ -3202,25 +4294,22 @@ if (f != XBADFILE) XFCLOSE(f); - wc_InitDecodedCert(&cert, buf, bytes, NULL); + wc_InitDecodedCert(&cert, buf, (word32)bytes, NULL); ExpectIntEQ(wc_ParseCert(&cert, CERT_TYPE, 0, NULL), 0); wc_FreeDecodedCert(&cert); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CertRsaPss(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; /* FIPS v2 and below don't support long salts. */ #if !defined(NO_RSA) && defined(WC_RSA_PSS) && !defined(NO_FILESYSTEM) && \ (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ (HAVE_FIPS_VERSION > 2))) && (!defined(HAVE_SELFTEST) || \ (defined(HAVE_SELFTEST_VERSION) && (HAVE_SELFTEST_VERSION > 2))) - EXPECT_DECLS; XFILE f = XBADFILE; const char* rsaPssSha256Cert = "./certs/rsapss/ca-rsapss.der"; const char* rsaPssRootSha256Cert = "./certs/rsapss/root-rsapss.pem"; @@ -3250,7 +4339,7 @@ XFCLOSE(f); f = XBADFILE; } - wc_InitDecodedCert(&cert, buf, bytes, NULL); + wc_InitDecodedCert(&cert, buf, (word32)bytes, NULL); ExpectIntEQ(wc_ParseCert(&cert, CERT_TYPE, VERIFY, cm), 0); wc_FreeDecodedCert(&cert); @@ -3260,58 +4349,22 @@ ExpectIntGT(bytes = (int)XFREAD(buf, 1, sizeof(buf), f), 0); if (f != XBADFILE) XFCLOSE(f); - wc_InitDecodedCert(&cert, buf, bytes, NULL); + wc_InitDecodedCert(&cert, buf, (word32)bytes, NULL); ExpectIntEQ(wc_ParseCert(&cert, CERT_TYPE, VERIFY, cm), 0); wc_FreeDecodedCert(&cert); #endif wolfSSL_CertManagerFree(cm); - - res = EXPECT_RESULT(); -#endif - - return res; -} - -static int test_wolfSSL_CertManagerCRL(void) -{ - int res = TEST_SKIPPED; -#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && defined(HAVE_CRL) && \ - !defined(NO_RSA) - EXPECT_DECLS; - const char* ca_cert = "./certs/ca-cert.pem"; - const char* crl1 = "./certs/crl/crl.pem"; - const char* crl2 = "./certs/crl/crl2.pem"; - - WOLFSSL_CERT_MANAGER* cm = NULL; - - ExpectNotNull(cm = wolfSSL_CertManagerNew()); - ExpectIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL)); - ExpectIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CertManagerLoadCRL(cm, crl1, WOLFSSL_FILETYPE_PEM, 0)); - ExpectIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CertManagerLoadCRL(cm, crl2, WOLFSSL_FILETYPE_PEM, 0)); - wolfSSL_CertManagerFreeCRL(cm); - - ExpectIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CertManagerLoadCRL(cm, crl1, WOLFSSL_FILETYPE_PEM, 0)); - ExpectIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CertManagerLoadCA(cm, ca_cert, NULL)); - wolfSSL_CertManagerFree(cm); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_load_verify_locations_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; const char* ca_cert = "./certs/ca-cert.pem"; const char* ca_expired_cert = "./certs/test/expired/expired-ca.pem"; @@ -3335,24 +4388,21 @@ WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_load_verify_buffer_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ defined(USE_CERT_BUFFERS_2048) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; WOLFSSL_CTX* ctx; const char* ca_expired_cert_file = "./certs/test/expired/expired-ca.der"; byte ca_expired_cert[TWOK_BUF]; - word32 sizeof_ca_expired_cert; + word32 sizeof_ca_expired_cert = 0; XFILE fp = XBADFILE; #ifndef NO_WOLFSSL_CLIENT @@ -3395,20 +4445,17 @@ wolfSSL_CTX_free(ctx); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_load_verify_chain_buffer_format(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_RSA) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_GEN) && defined(USE_CERT_BUFFERS_2048) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; #ifndef NO_WOLFSSL_CLIENT @@ -3422,19 +4469,16 @@ WOLFSSL_FILETYPE_ASN1)); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_add1_chain_cert(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && defined(OPENSSL_EXTRA) && \ defined(KEEP_OUR_CERT) && !defined(NO_RSA) && !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX* ctx; WOLFSSL* ssl = NULL; const char *certChain[] = { @@ -3451,14 +4495,14 @@ ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); ExpectNotNull(ssl = wolfSSL_new(ctx)); - for (cert = certChain; *cert != NULL; cert++) { + for (cert = certChain; EXPECT_SUCCESS() && *cert != NULL; cert++) { ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(*cert, WOLFSSL_FILETYPE_PEM)); ExpectIntEQ(SSL_CTX_add1_chain_cert(ctx, x509), 1); X509_free(x509); x509 = NULL; } - for (cert = certChain; *cert != NULL; cert++) { + for (cert = certChain; EXPECT_SUCCESS() && *cert != NULL; cert++) { ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(*cert, WOLFSSL_FILETYPE_PEM)); ExpectIntEQ(SSL_add1_chain_cert(ssl, x509), 1); @@ -3473,18 +4517,15 @@ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_use_certificate_chain_file_format(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) - EXPECT_DECLS; const char* server_chain_der = "./certs/server-cert-chain.der"; const char* client_single_pem = "./certs/client-cert.pem"; WOLFSSL_CTX* ctx; @@ -3506,18 +4547,15 @@ client_single_pem, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_SetTmpDH_file(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_DH) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; (void)ctx; @@ -3544,18 +4582,15 @@ WOLFSSL_FILETYPE_PEM)); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_SetTmpDH_buffer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_DH) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; #ifndef NO_WOLFSSL_CLIENT @@ -3583,18 +4618,15 @@ WOLFSSL_FILETYPE_ASN1)); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_SetMinMaxDhKey_Sz(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_DH) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) - EXPECT_DECLS; WOLFSSL_CTX *ctx; (void)ctx; @@ -3630,18 +4662,15 @@ WOLFSSL_FILETYPE_ASN1)); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_der_load_verify_locations(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_DER_LOAD) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; const char* derCert = "./certs/server-cert.der"; const char* nullPath = NULL; @@ -3677,18 +4706,15 @@ #endif wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_enable_disable(void) { - int res = TEST_SKIPPED; -#ifndef NO_CERTS EXPECT_DECLS; +#ifndef NO_CERTS WOLFSSL_CTX* ctx = NULL; #ifdef HAVE_CRL @@ -3750,18 +4776,15 @@ #endif wolfSSL_CTX_free(ctx); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ - - res = EXPECT_RESULT(); #endif /* NO_CERTS */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_ticket_API(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) WOLFSSL_CTX* ctx = NULL; void *userCtx = (void*)"this is my ctx"; @@ -3774,17 +4797,14 @@ ExpectIntNE(WOLFSSL_SUCCESS, wolfSSL_CTX_set_TicketEncCtx(NULL, userCtx)); ExpectNull(wolfSSL_CTX_get_TicketEncCtx(NULL)); - - res = EXPECT_RESULT(); #endif /* HAVE_SESSION_TICKET && !NO_WOLFSSL_SERVER */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_set_minmax_proto_version(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_EXTRA EXPECT_DECLS; +#ifdef OPENSSL_EXTRA WOLFSSL_CTX *ctx = NULL; WOLFSSL *ssl = NULL; @@ -3818,11 +4838,9 @@ wolfSSL_CTX_free(ctx); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12) && \ @@ -3880,10 +4898,9 @@ static int test_server_wolfSSL_new(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; WOLFSSL_CTX *ctx_nocert = NULL; WOLFSSL *ssl = NULL; @@ -3899,7 +4916,7 @@ /* invalid context */ ExpectNull(ssl = wolfSSL_new(NULL)); #if !defined(WOLFSSL_SESSION_EXPORT) && !defined(WOLFSSL_QT) && \ - !defined(OPENSSL_EXTRA) + !defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_INIT_CTX_KEY) ExpectNull(ssl = wolfSSL_new(ctx_nocert)); #endif @@ -3909,20 +4926,17 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); wolfSSL_CTX_free(ctx_nocert); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_client_wolfSSL_new(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; WOLFSSL_CTX *ctx_nocert = NULL; WOLFSSL *ssl = NULL; @@ -3946,19 +4960,16 @@ wolfSSL_CTX_free(ctx); wolfSSL_CTX_free(ctx_nocert); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_SetTmpDH_file(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_DH) && \ !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; WOLFSSL *ssl = NULL; @@ -4002,18 +5013,15 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_SetTmpDH_buffer(void) { - int res = TEST_SKIPPED; -#if !defined(NO_CERTS) && !defined(NO_DH) && !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if !defined(NO_CERTS) && !defined(NO_DH) && !defined(NO_WOLFSSL_SERVER) WOLFSSL_CTX *ctx = NULL; WOLFSSL *ssl = NULL; @@ -4040,18 +5048,15 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_SetMinMaxDhKey_Sz(void) { - int res = TEST_SKIPPED; -#if !defined(NO_CERTS) && !defined(NO_DH) && !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if !defined(NO_CERTS) && !defined(NO_DH) && !defined(NO_WOLFSSL_SERVER) WOLFSSL_CTX *ctx = NULL; WOLFSSL_CTX *ctx2 = NULL; WOLFSSL *ssl = NULL; @@ -4098,10 +5103,8 @@ wolfSSL_CTX_free(ctx2); wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } @@ -4151,9 +5154,93 @@ #ifdef OPENSSL_EXTRA +static int test_EC25519(void) +{ + EXPECT_DECLS; +#if defined(HAVE_CURVE25519) && defined(WOLFSSL_KEY_GEN) + byte priv[CURVE25519_KEYSIZE]; + unsigned int privSz = CURVE25519_KEYSIZE; + byte pub[CURVE25519_KEYSIZE]; + unsigned int pubSz = CURVE25519_KEYSIZE; + byte priv2[CURVE25519_KEYSIZE]; + unsigned int priv2Sz = CURVE25519_KEYSIZE; + byte pub2[CURVE25519_KEYSIZE]; + unsigned int pub2Sz = CURVE25519_KEYSIZE; + byte shared[CURVE25519_KEYSIZE]; + unsigned int sharedSz = CURVE25519_KEYSIZE; + byte shared2[CURVE25519_KEYSIZE]; + unsigned int shared2Sz = CURVE25519_KEYSIZE; + + /* Bad parameter testing of key generation. */ + ExpectIntEQ(wolfSSL_EC25519_generate_key(NULL, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_EC25519_generate_key(NULL, &privSz, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_generate_key(NULL, &privSz, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_generate_key(priv, NULL, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_generate_key(priv, &privSz, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_generate_key(priv, &privSz, pub, NULL), 0); + /* Bad length */ + privSz = 1; + ExpectIntEQ(wolfSSL_EC25519_generate_key(priv, &privSz, pub, &pubSz), 0); + privSz = CURVE25519_KEYSIZE; + pubSz = 1; + ExpectIntEQ(wolfSSL_EC25519_generate_key(priv, &privSz, pub, &pubSz), 0); + pubSz = CURVE25519_KEYSIZE; + + /* Good case of generating key. */ + ExpectIntEQ(wolfSSL_EC25519_generate_key(priv, &privSz, pub, &pubSz), 1); + ExpectIntEQ(wolfSSL_EC25519_generate_key(priv2, &priv2Sz, pub2, &pub2Sz), + 1); + ExpectIntEQ(privSz, CURVE25519_KEYSIZE); + ExpectIntEQ(pubSz, CURVE25519_KEYSIZE); + + /* Bad parameter testing of shared key. */ + ExpectIntEQ(wolfSSL_EC25519_shared_key( NULL, NULL, NULL, privSz, + NULL, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key( NULL, &sharedSz, NULL, privSz, + NULL, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key( NULL, &sharedSz, priv, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, NULL, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, priv, privSz, + NULL, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key( NULL, &sharedSz, priv, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, NULL, priv, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, NULL, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, priv, privSz, + NULL, pubSz), 0); + /* Bad length. */ + sharedSz = 1; + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, priv, privSz, + pub, pubSz), 0); + sharedSz = CURVE25519_KEYSIZE; + privSz = 1; + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, priv, privSz, + pub, pubSz), 0); + privSz = CURVE25519_KEYSIZE; + pubSz = 1; + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, priv, privSz, + pub, pubSz), 0); + pubSz = CURVE25519_KEYSIZE; + + /* Good case of shared key. */ + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared, &sharedSz, priv, privSz, + pub2, pub2Sz), 1); + ExpectIntEQ(wolfSSL_EC25519_shared_key(shared2, &shared2Sz, priv2, priv2Sz, + pub, pubSz), 1); + ExpectIntEQ(sharedSz, CURVE25519_KEYSIZE); + ExpectIntEQ(shared2Sz, CURVE25519_KEYSIZE); + ExpectIntEQ(XMEMCMP(shared, shared2, sharedSz), 0); +#endif /* HAVE_CURVE25519 && WOLFSSL_KEY_GEN */ + return EXPECT_RESULT(); +} + static int test_ED25519(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) && \ defined(WOLFSSL_KEY_GEN) byte priv[ED25519_PRV_KEY_SIZE]; @@ -4167,30 +5254,192 @@ unsigned int sigSz = (unsigned int)sizeof(sig); #endif /* HAVE_ED25519_SIGN && HAVE_ED25519_KEY_IMPORT */ - AssertIntEQ(wolfSSL_ED25519_generate_key(priv, &privSz, pub, &pubSz), - WOLFSSL_SUCCESS); - AssertIntEQ(privSz, ED25519_PRV_KEY_SIZE); - AssertIntEQ(pubSz, ED25519_PUB_KEY_SIZE); + /* Bad parameter testing of key generation. */ + ExpectIntEQ(wolfSSL_ED25519_generate_key(NULL, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(priv, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(NULL, &privSz, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(NULL, NULL, pub, NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(NULL, NULL, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(NULL, &privSz, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(priv, NULL, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(priv, &privSz, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED25519_generate_key(priv, &privSz, pub, NULL), 0); + /* Bad length. */ + privSz = 1; + ExpectIntEQ(wolfSSL_ED25519_generate_key(priv, &privSz, pub, &pubSz), 0); + privSz = ED25519_PRV_KEY_SIZE; + pubSz = 1; + ExpectIntEQ(wolfSSL_ED25519_generate_key(priv, &privSz, pub, &pubSz), 0); + pubSz = ED25519_PUB_KEY_SIZE; + + /* Good case of generating key. */ + ExpectIntEQ(wolfSSL_ED25519_generate_key(priv, &privSz, pub, &pubSz), + 1); + ExpectIntEQ(privSz, ED25519_PRV_KEY_SIZE); + ExpectIntEQ(pubSz, ED25519_PUB_KEY_SIZE); #if defined(HAVE_ED25519_SIGN) && defined(HAVE_ED25519_KEY_IMPORT) - AssertIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, priv, privSz, sig, - &sigSz), WOLFSSL_SUCCESS); - AssertIntEQ(sigSz, ED25519_SIG_SIZE); + /* Bad parameter testing of signing. */ + ExpectIntEQ(wolfSSL_ED25519_sign( NULL, msglen, NULL, privSz, NULL, + NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, NULL, privSz, NULL, + NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_sign( NULL, msglen, priv, privSz, NULL, + NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_sign( NULL, msglen, NULL, privSz, sig, + NULL), 0); + ExpectIntEQ(wolfSSL_ED25519_sign( NULL, msglen, NULL, privSz, NULL, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_sign( NULL, msglen, priv, privSz, sig, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, NULL, privSz, sig, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, priv, privSz, NULL, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, priv, privSz, sig, + NULL), 0); + /* Bad length. */ + privSz = 1; + ExpectIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), 0); + privSz = ED25519_PRV_KEY_SIZE; + sigSz = 1; + ExpectIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), 0); + sigSz = ED25519_SIG_SIZE; + + /* Good case of signing. */ + ExpectIntEQ(wolfSSL_ED25519_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), 1); + ExpectIntEQ(sigSz, ED25519_SIG_SIZE); #ifdef HAVE_ED25519_VERIFY - AssertIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, pub, pubSz, sig, - sigSz), WOLFSSL_SUCCESS); + /* Bad parameter testing of verification. */ + ExpectIntEQ(wolfSSL_ED25519_verify( NULL, msglen, NULL, pubSz, NULL, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, NULL, pubSz, NULL, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_verify( NULL, msglen, pub, pubSz, NULL, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_verify( NULL, msglen, NULL, pubSz, sig, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_verify( NULL, msglen, pub, pubSz, sig, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, NULL, pubSz, sig, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, pub, pubSz, NULL, + sigSz), 0); + /* Bad length. */ + pubSz = 1; + ExpectIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 0); + pubSz = ED25519_PUB_KEY_SIZE; + sigSz = 1; + ExpectIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 0); + sigSz = ED25519_SIG_SIZE; + + /* Good case of verification. */ + ExpectIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 1); + /* Bad signature. */ + if (EXPECT_SUCCESS()) { + sig[1] ^= 0x80; + } + ExpectIntEQ(wolfSSL_ED25519_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 0); #endif /* HAVE_ED25519_VERIFY */ #endif /* HAVE_ED25519_SIGN && HAVE_ED25519_KEY_IMPORT */ - - res = TEST_RES_CHECK(1); #endif /* HAVE_ED25519 && HAVE_ED25519_KEY_EXPORT && WOLFSSL_KEY_GEN */ - return res; + return EXPECT_RESULT(); +} + +static int test_EC448(void) +{ + EXPECT_DECLS; +#if defined(HAVE_CURVE448) && defined(WOLFSSL_KEY_GEN) + byte priv[CURVE448_KEY_SIZE]; + unsigned int privSz = CURVE448_KEY_SIZE; + byte pub[CURVE448_KEY_SIZE]; + unsigned int pubSz = CURVE448_KEY_SIZE; + byte priv2[CURVE448_KEY_SIZE]; + unsigned int priv2Sz = CURVE448_KEY_SIZE; + byte pub2[CURVE448_KEY_SIZE]; + unsigned int pub2Sz = CURVE448_KEY_SIZE; + byte shared[CURVE448_KEY_SIZE]; + unsigned int sharedSz = CURVE448_KEY_SIZE; + byte shared2[CURVE448_KEY_SIZE]; + unsigned int shared2Sz = CURVE448_KEY_SIZE; + + /* Bad parameter testing of key generation. */ + ExpectIntEQ(wolfSSL_EC448_generate_key(NULL, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_EC448_generate_key(NULL, &privSz, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_generate_key(NULL, &privSz, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_generate_key(priv, NULL, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_generate_key(priv, &privSz, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_generate_key(priv, &privSz, pub, NULL), 0); + /* Bad length. */ + privSz = 1; + ExpectIntEQ(wolfSSL_EC448_generate_key(priv, &privSz, pub, &pubSz), 0); + privSz = CURVE448_KEY_SIZE; + pubSz = 1; + ExpectIntEQ(wolfSSL_EC448_generate_key(priv, &privSz, pub, &pubSz), 0); + pubSz = CURVE448_KEY_SIZE; + + /* Good case of generating key. */ + ExpectIntEQ(wolfSSL_EC448_generate_key(priv, &privSz, pub, &pubSz), 1); + ExpectIntEQ(wolfSSL_EC448_generate_key(priv2, &priv2Sz, pub2, &pub2Sz), 1); + ExpectIntEQ(privSz, CURVE448_KEY_SIZE); + ExpectIntEQ(pubSz, CURVE448_KEY_SIZE); + + /* Bad parameter testing of shared key. */ + ExpectIntEQ(wolfSSL_EC448_shared_key( NULL, NULL, NULL, privSz, + NULL, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key( NULL, &sharedSz, NULL, privSz, + NULL, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key( NULL, &sharedSz, priv, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, NULL, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, priv, privSz, + NULL, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key( NULL, &sharedSz, priv, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, NULL, priv, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, NULL, privSz, + pub, pubSz), 0); + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, priv, privSz, + NULL, pubSz), 0); + /* Bad length. */ + sharedSz = 1; + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, priv, privSz, + pub, pubSz), 0); + sharedSz = CURVE448_KEY_SIZE; + privSz = 1; + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, priv, privSz, + pub, pubSz), 0); + privSz = CURVE448_KEY_SIZE; + pubSz = 1; + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, priv, privSz, + pub, pubSz), 0); + pubSz = CURVE448_KEY_SIZE; + + /* Good case of shared key. */ + ExpectIntEQ(wolfSSL_EC448_shared_key(shared, &sharedSz, priv, privSz, + pub2, pub2Sz), 1); + ExpectIntEQ(wolfSSL_EC448_shared_key(shared2, &shared2Sz, priv2, priv2Sz, + pub, pubSz), 1); + ExpectIntEQ(sharedSz, CURVE448_KEY_SIZE); + ExpectIntEQ(shared2Sz, CURVE448_KEY_SIZE); + ExpectIntEQ(XMEMCMP(shared, shared2, sharedSz), 0); +#endif /* HAVE_CURVE448 && WOLFSSL_KEY_GEN */ + return EXPECT_RESULT(); } static int test_ED448(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) && \ defined(WOLFSSL_KEY_GEN) byte priv[ED448_PRV_KEY_SIZE]; @@ -4204,25 +5453,103 @@ unsigned int sigSz = (unsigned int)sizeof(sig); #endif /* HAVE_ED448_SIGN && HAVE_ED448_KEY_IMPORT */ - AssertIntEQ(wolfSSL_ED448_generate_key(priv, &privSz, pub, &pubSz), - WOLFSSL_SUCCESS); - AssertIntEQ(privSz, ED448_PRV_KEY_SIZE); - AssertIntEQ(pubSz, ED448_PUB_KEY_SIZE); + /* Bad parameter testing of key generation. */ + ExpectIntEQ(wolfSSL_ED448_generate_key(NULL, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(priv, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(NULL, &privSz, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(NULL, NULL, pub, NULL), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(NULL, NULL, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(NULL, &privSz, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(priv, NULL, pub, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(priv, &privSz, NULL, &pubSz), 0); + ExpectIntEQ(wolfSSL_ED448_generate_key(priv, &privSz, pub, NULL), 0); + /* Bad length. */ + privSz = 1; + ExpectIntEQ(wolfSSL_ED448_generate_key(priv, &privSz, pub, &pubSz), 0); + privSz = ED448_PRV_KEY_SIZE; + pubSz = 1; + ExpectIntEQ(wolfSSL_ED448_generate_key(priv, &privSz, pub, &pubSz), 0); + pubSz = ED448_PUB_KEY_SIZE; + + /* Good case of generating key. */ + ExpectIntEQ(wolfSSL_ED448_generate_key(priv, &privSz, pub, &pubSz), 1); + ExpectIntEQ(privSz, ED448_PRV_KEY_SIZE); + ExpectIntEQ(pubSz, ED448_PUB_KEY_SIZE); #if defined(HAVE_ED448_SIGN) && defined(HAVE_ED448_KEY_IMPORT) - AssertIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, priv, privSz, sig, - &sigSz), WOLFSSL_SUCCESS); - AssertIntEQ(sigSz, ED448_SIG_SIZE); + /* Bad parameter testing of signing. */ + ExpectIntEQ(wolfSSL_ED448_sign( NULL, msglen, NULL, privSz, NULL, + NULL), 0); + ExpectIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, NULL, privSz, NULL, + NULL), 0); + ExpectIntEQ(wolfSSL_ED448_sign( NULL, msglen, priv, privSz, NULL, + NULL), 0); + ExpectIntEQ(wolfSSL_ED448_sign( NULL, msglen, NULL, privSz, sig, + NULL), 0); + ExpectIntEQ(wolfSSL_ED448_sign( NULL, msglen, NULL, privSz, NULL, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_sign( NULL, msglen, priv, privSz, sig, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, NULL, privSz, sig, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, priv, privSz, NULL, + &sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, priv, privSz, sig, + NULL), 0); + /* Bad length. */ + privSz = 1; + ExpectIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), 0); + privSz = ED448_PRV_KEY_SIZE; + sigSz = 1; + ExpectIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), 0); + sigSz = ED448_SIG_SIZE; + + /* Good case of signing. */ + ExpectIntEQ(wolfSSL_ED448_sign((byte*)msg, msglen, priv, privSz, sig, + &sigSz), 1); + ExpectIntEQ(sigSz, ED448_SIG_SIZE); #ifdef HAVE_ED448_VERIFY - AssertIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, pub, pubSz, sig, - sigSz), WOLFSSL_SUCCESS); + /* Bad parameter testing of verification. */ + ExpectIntEQ(wolfSSL_ED448_verify( NULL, msglen, NULL, pubSz, NULL, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, NULL, pubSz, NULL, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_verify( NULL, msglen, pub, pubSz, NULL, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_verify( NULL, msglen, NULL, pubSz, sig, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_verify( NULL, msglen, pub, pubSz, sig, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, NULL, pubSz, sig, + sigSz), 0); + ExpectIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, pub, pubSz, NULL, + sigSz), 0); + /* Bad length. */ + pubSz = 1; + ExpectIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 0); + pubSz = ED448_PUB_KEY_SIZE; + sigSz = 1; + ExpectIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 0); + sigSz = ED448_SIG_SIZE; + + /* Good case of verification. */ + ExpectIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 1); + /* Bad signature. */ + if (EXPECT_SUCCESS()) { + sig[1] ^= 0x80; + } + ExpectIntEQ(wolfSSL_ED448_verify((byte*)msg, msglen, pub, pubSz, sig, + sigSz), 0); #endif /* HAVE_ED448_VERIFY */ #endif /* HAVE_ED448_SIGN && HAVE_ED448_KEY_IMPORT */ - - res = TEST_RES_CHECK(1); #endif /* HAVE_ED448 && HAVE_ED448_KEY_EXPORT && WOLFSSL_KEY_GEN */ - return res; + return EXPECT_RESULT(); } #endif /* OPENSSL_EXTRA */ @@ -4233,15 +5560,14 @@ static int test_wolfSSL_EVP_PKEY_print_public(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_BIO) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_BIO) WOLFSSL_BIO* rbio = NULL; WOLFSSL_BIO* wbio = NULL; WOLFSSL_EVP_PKEY* pkey = NULL; char line[256] = { 0 }; char line1[256] = { 0 }; - int i; + int i = 0; /* test error cases */ ExpectIntEQ( EVP_PKEY_print_public(NULL,NULL,0,NULL),0L); @@ -4486,18 +5812,15 @@ (void)line; (void)line1; (void)i; - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } /* Test functions for base64 encode/decode */ static int test_wolfSSL_EVP_ENCODE_CTX_new(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && \ ( defined(WOLFSSL_BASE64_ENCODE) || defined(WOLFSSL_BASE64_DECODE)) - EXPECT_DECLS; EVP_ENCODE_CTX* ctx = NULL; ExpectNotNull(ctx = EVP_ENCODE_CTX_new()); @@ -4505,32 +5828,26 @@ ExpectIntEQ(ctx->data[0],0); ExpectIntEQ(ctx->data[sizeof(ctx->data) -1],0); EVP_ENCODE_CTX_free(ctx); - - res = EXPECT_RESULT(); -#endif /* OPENSSL_EXTRA && (WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE)*/ - return res; +#endif /* OPENSSL_EXTRA && (WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE) */ + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_ENCODE_CTX_free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && \ ( defined(WOLFSSL_BASE64_ENCODE) || defined(WOLFSSL_BASE64_DECODE)) - EXPECT_DECLS; EVP_ENCODE_CTX* ctx = NULL; ExpectNotNull(ctx = EVP_ENCODE_CTX_new()); EVP_ENCODE_CTX_free(ctx); - - res = EXPECT_RESULT(); -#endif /*OPENSSL_EXTRA && (WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE)*/ - return res; +#endif /* OPENSSL_EXTRA && (WOLFSSL_BASE64_ENCODE || WOLFSSL_BASE64_DECODE) */ + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_EncodeInit(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE) EVP_ENCODE_CTX* ctx = NULL; ExpectNotNull(ctx = EVP_ENCODE_CTX_new()); @@ -4551,16 +5868,13 @@ ExpectIntEQ(ctx->data[sizeof(ctx->data) -1], 0); EVP_ENCODE_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && WOLFSSL_BASE64_ENCODE*/ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_EncodeUpdate(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE) int outl; int total; @@ -4568,6 +5882,7 @@ const unsigned char plain1[] = {"This is a base64 encodeing test."}; const unsigned char plain2[] = {"This is additional data."}; + const unsigned char encBlock0[] = {"VGg="}; const unsigned char enc0[] = {"VGg=\n"}; /* expected encoded result for the first output 64 chars plus trailing LF*/ const unsigned char enc1[] = {"VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVpbmcgdGVzdC5UaGlzIGlzIGFkZGl0aW9u\n"}; @@ -4669,12 +5984,8 @@ XMEMSET( encOutBuff,0, sizeof(encOutBuff)); ExpectIntEQ(EVP_EncodeBlock(encOutBuff, plain0, sizeof(plain0)-1), - sizeof(enc0)-1); - ExpectIntEQ( - XSTRNCMP( - (const char*)encOutBuff, - (const char*)enc0,sizeof(enc0) ), - 0); + sizeof(encBlock0)-1); + ExpectStrEQ(encOutBuff, encBlock0); /* pass small size( < 48bytes ) input, then make sure they are not * encoded and just stored in ctx @@ -4748,10 +6059,8 @@ EVP_EncodeFinal(NULL, NULL, NULL); EVP_ENCODE_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && WOLFSSL_BASE64_ENCODE*/ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_EncodeFinal(void) { @@ -4768,9 +6077,8 @@ static int test_wolfSSL_EVP_DecodeInit(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_DECODE) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_DECODE) EVP_ENCODE_CTX* ctx = NULL; ExpectNotNull( ctx = EVP_ENCODE_CTX_new()); @@ -4791,16 +6099,13 @@ ExpectIntEQ( ctx->data[sizeof(ctx->data) -1],0); EVP_ENCODE_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL && WOLFSSL_BASE_DECODE */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_DecodeUpdate(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_DECODE) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_DECODE) int outl; unsigned char decOutBuff[300]; @@ -4907,7 +6212,7 @@ &outl), 1 /* expected result code 1: success */ ); - ExpectIntEQ(outl, 0); /* expected DecodeFinal outout no data */ + ExpectIntEQ(outl, 0); /* expected DecodeFinal output no data */ ExpectIntEQ(XSTRNCMP( (const char*)plain2,(const char*)decOutBuff, sizeof(plain2) -1 ),0); @@ -5033,10 +6338,8 @@ } EVP_ENCODE_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL && WOLFSSL_BASE_DECODE */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_DecodeFinal(void) { @@ -5056,109 +6359,110 @@ #ifdef OPENSSL_EXTRA static int test_wolfSSL_EVP_get_cipherbynid(void) { + EXPECT_DECLS; #ifndef NO_AES const WOLFSSL_EVP_CIPHER* c; c = wolfSSL_EVP_get_cipherbynid(419); #if (defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)) && \ defined(WOLFSSL_AES_128) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_128_CBC", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_128_CBC", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(423); #if (defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)) && \ defined(WOLFSSL_AES_192) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_192_CBC", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_192_CBC", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(427); #if (defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT)) && \ defined(WOLFSSL_AES_256) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_256_CBC", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_256_CBC", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(904); #if defined(WOLFSSL_AES_COUNTER) && defined(WOLFSSL_AES_128) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_128_CTR", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_128_CTR", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(905); #if defined(WOLFSSL_AES_COUNTER) && defined(WOLFSSL_AES_192) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_192_CTR", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_192_CTR", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(906); #if defined(WOLFSSL_AES_COUNTER) && defined(WOLFSSL_AES_256) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_256_CTR", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_256_CTR", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(418); #if defined(HAVE_AES_ECB) && defined(WOLFSSL_AES_128) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_128_ECB", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_128_ECB", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(422); #if defined(HAVE_AES_ECB) && defined(WOLFSSL_AES_192) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_192_ECB", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_192_ECB", c)); #else - AssertNull(c); + ExpectNull(c); #endif c = wolfSSL_EVP_get_cipherbynid(426); #if defined(HAVE_AES_ECB) && defined(WOLFSSL_AES_256) - AssertNotNull(c); - AssertNotNull(strcmp("EVP_AES_256_ECB", c)); + ExpectNotNull(c); + ExpectNotNull(XSTRCMP("EVP_AES_256_ECB", c)); #else - AssertNull(c); + ExpectNull(c); #endif #endif /* !NO_AES */ #ifndef NO_DES3 - AssertNotNull(strcmp("EVP_DES_CBC", wolfSSL_EVP_get_cipherbynid(31))); + ExpectNotNull(XSTRCMP("EVP_DES_CBC", wolfSSL_EVP_get_cipherbynid(31))); #ifdef WOLFSSL_DES_ECB - AssertNotNull(strcmp("EVP_DES_ECB", wolfSSL_EVP_get_cipherbynid(29))); + ExpectNotNull(XSTRCMP("EVP_DES_ECB", wolfSSL_EVP_get_cipherbynid(29))); #endif - AssertNotNull(strcmp("EVP_DES_EDE3_CBC", wolfSSL_EVP_get_cipherbynid(44))); + ExpectNotNull(XSTRCMP("EVP_DES_EDE3_CBC", wolfSSL_EVP_get_cipherbynid(44))); #ifdef WOLFSSL_DES_ECB - AssertNotNull(strcmp("EVP_DES_EDE3_ECB", wolfSSL_EVP_get_cipherbynid(33))); + ExpectNotNull(XSTRCMP("EVP_DES_EDE3_ECB", wolfSSL_EVP_get_cipherbynid(33))); #endif #endif /* !NO_DES3 */ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) - AssertNotNull(strcmp("EVP_CHACHA20_POLY13O5", EVP_get_cipherbynid(1018))); + ExpectNotNull(XSTRCMP("EVP_CHACHA20_POLY13O5", EVP_get_cipherbynid(1018))); #endif /* test for nid is out of range */ - AssertNull(wolfSSL_EVP_get_cipherbynid(1)); + ExpectNull(wolfSSL_EVP_get_cipherbynid(1)); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_CIPHER_CTX(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); const EVP_CIPHER *init = EVP_aes_128_cbc(); @@ -5166,23 +6470,21 @@ byte key[AES_BLOCK_SIZE] = {0}; byte iv[AES_BLOCK_SIZE] = {0}; - AssertNotNull(ctx); + ExpectNotNull(ctx); wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); test = EVP_CIPHER_CTX_cipher(ctx); - AssertTrue(init == test); - AssertIntEQ(EVP_CIPHER_nid(test), NID_aes_128_cbc); + ExpectTrue(init == test); + ExpectIntEQ(EVP_CIPHER_nid(test), NID_aes_128_cbc); - AssertIntEQ(EVP_CIPHER_CTX_reset(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_CIPHER_CTX_reset(NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_CIPHER_CTX_reset(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_CIPHER_CTX_reset(NULL), WOLFSSL_FAILURE); EVP_CIPHER_CTX_free(ctx); /* test EVP_CIPHER_CTX_cleanup with NULL */ - AssertIntEQ(EVP_CIPHER_CTX_cleanup(NULL), WOLFSSL_SUCCESS); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(EVP_CIPHER_CTX_cleanup(NULL), WOLFSSL_SUCCESS); #endif /* !NO_AES && HAVE_AES_CBC && WOLFSSL_AES_128 */ - return res; + return EXPECT_RESULT(); } #endif /* OPENSSL_EXTRA */ @@ -5242,7 +6544,7 @@ return 0; } - static WC_INLINE int myTicketEncCbOpenSSL(WOLFSSL* ssl, + static int myTicketEncCbOpenSSL(WOLFSSL* ssl, byte name[WOLFSSL_TICKET_NAME_SZ], byte iv[WOLFSSL_TICKET_IV_SZ], WOLFSSL_EVP_CIPHER_CTX *ectx, @@ -5294,11 +6596,29 @@ } if ((unsigned)(*len + sz) > TEST_SSL_MEMIO_BUF_SZ) - return WOLFSSL_CBIO_ERR_WANT_READ; + return WOLFSSL_CBIO_ERR_WANT_WRITE; XMEMCPY(buf + *len, data, sz); *len += sz; +#ifdef WOLFSSL_DUMP_MEMIO_STREAM + { + /* This can be imported into Wireshark by transforming the file with + * od -Ax -tx1 -v test_output.dump > test_output.dump.hex + * And then loading test_output.dump.hex into Wireshark using the + * "Import from Hex Dump..." option ion and selecting the TCP + * encapsulation option. */ + char dump_file_name[64]; + WOLFSSL_BIO *dump_file; + sprintf(dump_file_name, "%s/%s.dump", tmpDirName, currentTestName); + dump_file = wolfSSL_BIO_new_file(dump_file_name, "a"); + if (dump_file != NULL) { + (void)wolfSSL_BIO_write(dump_file, data, sz); + wolfSSL_BIO_free(dump_file); + } + } +#endif + return sz; } @@ -5341,8 +6661,10 @@ int c_sharedCtx = 0; int s_sharedCtx = 0; #endif - const char* certFile = svrCertFile; - const char* keyFile = svrKeyFile; + const char* clientCertFile = cliCertFile; + const char* clientKeyFile = cliKeyFile; + const char* serverCertFile = svrCertFile; + const char* serverKeyFile = svrKeyFile; /******************************** * Create WOLFSSL_CTX for client. @@ -5368,15 +6690,25 @@ #ifdef WOLFSSL_ENCRYPTED_KEYS wolfSSL_CTX_set_default_passwd_cb(ctx->c_ctx, PasswordCallBack); #endif - ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx->c_ctx, caCertFile, 0), - WOLFSSL_SUCCESS); + if (ctx->c_cb.caPemFile != NULL) + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx->c_ctx, + ctx->c_cb.caPemFile, 0), WOLFSSL_SUCCESS); + else + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx->c_ctx, + caCertFile, 0), WOLFSSL_SUCCESS); + if (ctx->c_cb.certPemFile != NULL) { + clientCertFile = ctx->c_cb.certPemFile; + } + if (ctx->c_cb.keyPemFile != NULL) { + clientKeyFile = ctx->c_cb.keyPemFile; + } #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (!c_sharedCtx) #endif { - ExpectIntEQ(wolfSSL_CTX_use_certificate_file(ctx->c_ctx, cliCertFile, - WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); - ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_file(ctx->c_ctx, cliKeyFile, + ExpectIntEQ(wolfSSL_CTX_use_certificate_chain_file(ctx->c_ctx, + clientCertFile), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_file(ctx->c_ctx, clientKeyFile, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); } #ifdef HAVE_CRL @@ -5415,9 +6747,6 @@ method = wolfSSLv23_server_method(); } ExpectNotNull(ctx->s_ctx = wolfSSL_CTX_new(method)); - if (EXPECT_FAIL()) { - XFREE(method, NULL, DYNAMIC_TYPE_METHOD); - } ctx->s_cb.isSharedCtx = 0; } if (!ctx->s_cb.ticNoInit && (ctx->s_ctx != NULL)) { @@ -5436,29 +6765,33 @@ wolfSSL_SetIOSend(ctx->s_ctx, test_ssl_memio_write_cb); wolfSSL_CTX_set_verify(ctx->s_ctx, WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); - ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx->s_ctx, cliCertFile, 0), - WOLFSSL_SUCCESS); + if (ctx->s_cb.caPemFile != NULL) + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx->s_ctx, + ctx->s_cb.caPemFile, 0), WOLFSSL_SUCCESS); + else + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx->s_ctx, + cliCertFile, 0), WOLFSSL_SUCCESS); #ifdef WOLFSSL_ENCRYPTED_KEYS wolfSSL_CTX_set_default_passwd_cb(ctx->s_ctx, PasswordCallBack); #endif if (ctx->s_cb.certPemFile != NULL) { - certFile = ctx->s_cb.certPemFile; + serverCertFile = ctx->s_cb.certPemFile; } #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (!s_sharedCtx) #endif { - ExpectIntEQ(wolfSSL_CTX_use_certificate_file(ctx->s_ctx, certFile, - WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_use_certificate_chain_file(ctx->s_ctx, + serverCertFile), WOLFSSL_SUCCESS); } if (ctx->s_cb.keyPemFile != NULL) { - keyFile = ctx->s_cb.keyPemFile; + serverKeyFile = ctx->s_cb.keyPemFile; } #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE) if (!s_sharedCtx) #endif { - ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_file(ctx->s_ctx, keyFile, + ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_file(ctx->s_ctx, serverKeyFile, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); } if (ctx->s_ciphers != NULL) { @@ -5482,9 +6815,9 @@ #endif ) { - ExpectIntEQ(wolfSSL_use_certificate_file(ctx->c_ssl, cliCertFile, - WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); - ExpectIntEQ(wolfSSL_use_PrivateKey_file(ctx->c_ssl, cliKeyFile, + ExpectIntEQ(wolfSSL_use_certificate_chain_file(ctx->c_ssl, + clientCertFile), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_use_PrivateKey_file(ctx->c_ssl, clientKeyFile, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); } if (ctx->c_cb.ssl_ready != NULL) { @@ -5503,9 +6836,9 @@ #endif ) { - ExpectIntEQ(wolfSSL_use_certificate_file(ctx->s_ssl, certFile, - WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); - ExpectIntEQ(wolfSSL_use_PrivateKey_file(ctx->s_ssl, keyFile, + ExpectIntEQ(wolfSSL_use_certificate_chain_file(ctx->s_ssl, + serverCertFile), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_use_PrivateKey_file(ctx->s_ssl, serverKeyFile, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); } #if !defined(NO_FILESYSTEM) && !defined(NO_DH) @@ -5537,7 +6870,9 @@ } while ((!handshake_complete) && (max_rounds > 0)) { if (!hs_c) { + wolfSSL_SetLoggingPrefix("client"); ret = wolfSSL_connect(ctx->c_ssl); + wolfSSL_SetLoggingPrefix(NULL); if (ret == WOLFSSL_SUCCESS) { hs_c = 1; } @@ -5545,6 +6880,9 @@ err = wolfSSL_get_error(ctx->c_ssl, ret); if (err != WOLFSSL_ERROR_WANT_READ && err != WOLFSSL_ERROR_WANT_WRITE) { + char buff[WOLFSSL_MAX_ERROR_SZ]; + fprintf(stderr, "error = %d, %s\n", err, + wolfSSL_ERR_error_string(err, buff)); failing_c = 1; hs_c = 1; if (failing_c && failing_s) { @@ -5554,7 +6892,9 @@ } } if (!hs_s) { + wolfSSL_SetLoggingPrefix("server"); ret = wolfSSL_accept(ctx->s_ssl); + wolfSSL_SetLoggingPrefix(NULL); if (ret == WOLFSSL_SUCCESS) { hs_s = 1; } @@ -5562,6 +6902,9 @@ err = wolfSSL_get_error(ctx->s_ssl, ret); if (err != WOLFSSL_ERROR_WANT_READ && err != WOLFSSL_ERROR_WANT_WRITE) { + char buff[WOLFSSL_MAX_ERROR_SZ]; + fprintf(stderr, "error = %d, %s\n", err, + wolfSSL_ERR_error_string(err, buff)); failing_s = 1; hs_s = 1; if (failing_c && failing_s) { @@ -5577,7 +6920,7 @@ } } - if (!handshake_complete) { + if (!handshake_complete || failing_c || failing_s) { return TEST_FAIL; } @@ -5603,7 +6946,9 @@ msglen_s = ctx->s_msglen; } + wolfSSL_SetLoggingPrefix("client"); ExpectIntEQ(wolfSSL_write(ctx->c_ssl, msg_c, msglen_c), msglen_c); + wolfSSL_SetLoggingPrefix("server"); ExpectIntGT(idx = wolfSSL_read(ctx->s_ssl, input, sizeof(input) - 1), 0); if (idx >= 0) { input[idx] = '\0'; @@ -5611,7 +6956,9 @@ ExpectIntGT(fprintf(stderr, "Client message: %s\n", input), 0); ExpectIntEQ(wolfSSL_write(ctx->s_ssl, msg_s, msglen_s), msglen_s); ctx->s_cb.return_code = EXPECT_RESULT(); + wolfSSL_SetLoggingPrefix("client"); ExpectIntGT(idx = wolfSSL_read(ctx->c_ssl, input, sizeof(input) - 1), 0); + wolfSSL_SetLoggingPrefix(NULL); if (idx >= 0) { input[idx] = '\0'; } @@ -5641,14 +6988,20 @@ wolfSSL_shutdown(ctx->c_ssl); wolfSSL_free(ctx->s_ssl); wolfSSL_free(ctx->c_ssl); - if (!ctx->s_cb.isSharedCtx) { - wolfSSL_CTX_free(ctx->s_ctx); - ctx->s_ctx = NULL; + if (ctx->c_cb.on_ctx_cleanup != NULL) { + ctx->c_cb.on_ctx_cleanup(ctx->c_ctx); } if (!ctx->c_cb.isSharedCtx) { wolfSSL_CTX_free(ctx->c_ctx); ctx->c_ctx = NULL; } + if (ctx->s_cb.on_ctx_cleanup != NULL) { + ctx->s_cb.on_ctx_cleanup(ctx->s_ctx); + } + if (!ctx->s_cb.isSharedCtx) { + wolfSSL_CTX_free(ctx->s_ctx); + ctx->s_ctx = NULL; + } if (!ctx->s_cb.ticNoInit) { #if defined(HAVE_SESSION_TICKET) && \ @@ -5687,6 +7040,14 @@ ExpectIntEQ(client_on_handshake(test_ctx.c_ctx, test_ctx.c_ssl), TEST_SUCCESS); } + if (client_cb->on_handshake != NULL) { + ExpectIntEQ(client_cb->on_handshake(&test_ctx.c_ctx, &test_ctx.c_ssl), + TEST_SUCCESS); + } + if (server_cb->on_handshake != NULL) { + ExpectIntEQ(server_cb->on_handshake(&test_ctx.s_ctx, &test_ctx.s_ssl), + TEST_SUCCESS); + } #ifdef WOLFSSL_HAVE_TLS_UNIQUE XMEMSET(server_side_msg2, 0, MD_MAX_SIZE); msg_len = wolfSSL_get_peer_finished(test_ctx.s_ssl, server_side_msg2, @@ -5703,7 +7064,9 @@ test_ssl_memio_cleanup(&test_ctx); client_cb->return_code = test_ctx.c_cb.return_code; + client_cb->last_err = test_ctx.c_cb.last_err; server_cb->return_code = test_ctx.s_cb.return_code; + server_cb->last_err = test_ctx.s_cb.last_err; return EXPECT_RESULT(); } @@ -5814,8 +7177,8 @@ word16 port; callback_functions* cbf; - WOLFSSL_CTX* ctx = 0; - WOLFSSL* ssl = 0; + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; func_args* opts = (func_args*)args; char msg[] = "I hear you fa shizzle!"; @@ -5833,6 +7196,8 @@ size_t msg_len = 0; #endif + wolfSSL_SetLoggingPrefix("server"); + #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); #endif @@ -5858,10 +7223,7 @@ } if (ctx == NULL) { /* Release the wait for TCP ready. */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&opts->signal->mutex)); - opts->signal->ready = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&opts->signal->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&opts->signal->mutex)); + signal_ready(opts->signal); goto done; } @@ -6046,7 +7408,7 @@ if (ret < 0) { break; } else if (ret == 0) { continue; } } #endif - ret = wolfSSL_accept(ssl); + ret = wolfSSL_negotiate(ssl); err = wolfSSL_get_error(ssl, 0); } while (err == WC_PENDING_E); if (ret != WOLFSSL_SUCCESS) { @@ -6123,17 +7485,17 @@ #endif } -#ifndef WOLFSSL_TIRTOS - return 0; -#endif + wolfSSL_SetLoggingPrefix(NULL); + + WOLFSSL_RETURN_FROM_THREAD(0); } #if defined(OPENSSL_EXTRA) && !defined(NO_SESSION_CACHE) && \ !defined(WOLFSSL_NO_TLS12) static THREAD_RETURN WOLFSSL_THREAD test_server_loop(void* args) { - SOCKET_T sockfd = 0; - SOCKET_T clientfd = 0; + SOCKET_T sockfd; + SOCKET_T clientfd = -1; word16 port; callback_functions* cbf; @@ -6196,10 +7558,7 @@ != WOLFSSL_SUCCESS) { /*err_sys("can't load ca file, Please run from wolfSSL home dir");*/ /* Release the wait for TCP ready. */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&opts->signal->mutex)); - opts->signal->ready = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&opts->signal->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&opts->signal->mutex)); + signal_ready(opts->signal); goto done; } if (!sharedCtx && wolfSSL_CTX_use_certificate_file(ctx, svrCertFile, @@ -6207,10 +7566,7 @@ /*err_sys("can't load server cert chain file, " "Please run from wolfSSL home dir");*/ /* Release the wait for TCP ready. */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&opts->signal->mutex)); - opts->signal->ready = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&opts->signal->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&opts->signal->mutex)); + signal_ready(opts->signal); goto done; } if (!sharedCtx && wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, @@ -6218,10 +7574,7 @@ /*err_sys("can't load server key file, " "Please run from wolfSSL home dir");*/ /* Release the wait for TCP ready. */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&opts->signal->mutex)); - opts->signal->ready = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&opts->signal->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&opts->signal->mutex)); + signal_ready(opts->signal); goto done; } /* call ctx setup callback */ @@ -6232,33 +7585,23 @@ while (count != loop_count) { ssl = wolfSSL_new(ctx); if (ssl == NULL) { - /* Release the wait for TCP ready. */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&opts->signal->mutex)); - opts->signal->ready = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&opts->signal->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&opts->signal->mutex)); + signal_ready(opts->signal); goto done; } if (sharedCtx && wolfSSL_use_certificate_file(ssl, svrCertFile, - WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { /*err_sys("can't load server cert chain file, " "Please run from wolfSSL home dir");*/ /* Release the wait for TCP ready. */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&opts->signal->mutex)); - opts->signal->ready = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&opts->signal->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&opts->signal->mutex)); + signal_ready(opts->signal); goto done; } if (sharedCtx && wolfSSL_use_PrivateKey_file(ssl, svrKeyFile, - WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) { /*err_sys("can't load server key file, " "Please run from wolfSSL home dir");*/ /* Release the wait for TCP ready. */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&opts->signal->mutex)); - opts->signal->ready = 1; - PTHREAD_CHECK_RET(pthread_cond_signal(&opts->signal->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&opts->signal->mutex)); + signal_ready(opts->signal); goto done; } @@ -6272,7 +7615,8 @@ cbf->ssl_ready(ssl); } /* do it here to detect failure */ - tcp_accept(&sockfd, &clientfd, (func_args*)args, port, 0, 0, 0, 0, 1, 0, 0); + tcp_accept(&sockfd, &clientfd, (func_args*)args, port, 0, 0, 0, 0, 1, 0, + 0); CloseSocket(sockfd); if (wolfSSL_set_fd(ssl, clientfd) != WOLFSSL_SUCCESS) { /*err_sys("SSL_set_fd failed");*/ @@ -6314,6 +7658,7 @@ wolfSSL_shutdown(ssl); wolfSSL_free(ssl); ssl = NULL; CloseSocket(clientfd); + clientfd = -1; count++; } @@ -6331,7 +7676,8 @@ if (!sharedCtx) wolfSSL_CTX_free(ctx); - CloseSocket(clientfd); + if (clientfd >= 0) + CloseSocket(clientfd); #ifdef WOLFSSL_TIRTOS fdCloseSession(Task_self()); @@ -6342,9 +7688,7 @@ wc_ecc_fp_free(); /* free per thread cache */ #endif -#ifndef WOLFSSL_TIRTOS - return 0; -#endif + WOLFSSL_RETURN_FROM_THREAD(0); } #endif /* defined(OPENSSL_EXTRA) && !defined(NO_SESSION_CACHE) && !defined(WOLFSSL_TLS13) */ @@ -6368,6 +7712,8 @@ int doUdp = 0; const char* cipherName1, *cipherName2; + wolfSSL_SetLoggingPrefix("client"); + #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); #endif @@ -6510,7 +7856,7 @@ if (ret < 0) { break; } else if (ret == 0) { continue; } } #endif - ret = wolfSSL_connect(ssl); + ret = wolfSSL_negotiate(ssl); err = wolfSSL_get_error(ssl, 0); } while (err == WC_PENDING_E); if (ret != WOLFSSL_SUCCESS) { @@ -6587,6 +7933,9 @@ (void)args; (void)cb; #endif /* !NO_WOLFSSL_CLIENT */ + + wolfSSL_SetLoggingPrefix(NULL); + return 0; } @@ -6692,8 +8041,8 @@ tcp_connect(&sockfd, wolfSSLIP, ((func_args*)args)->signal->port, 0, 0, NULL); - if (wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0) != WOLFSSL_SUCCESS) - { + if (wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0) != + WOLFSSL_SUCCESS) { /* err_sys("can't load ca file, Please run from wolfSSL home dir");*/ goto done; } @@ -6719,7 +8068,7 @@ if (ssl == NULL) { goto done; } - /* keep handshakre resources for re-using WOLFSSL obj */ + /* keep handshake resources for re-using WOLFSSL obj */ wolfSSL_KeepArrays(ssl); if (wolfSSL_KeepHandshakeResources(ssl)) { /* err_sys("SSL_KeepHandshakeResources failed"); */ @@ -6956,11 +8305,11 @@ } #else ctx = wolfSSL_CTX_new(callbacks->method()); +#endif if (ctx == NULL) { fprintf(stderr, "CTX new failed\n"); goto cleanup; } -#endif /* set defaults */ if (callbacks->caPemFile == NULL) @@ -7169,9 +8518,7 @@ wc_ecc_fp_free(); /* free per thread cache */ #endif -#ifndef WOLFSSL_TIRTOS - return 0; -#endif + WOLFSSL_RETURN_FROM_THREAD(0); } /* TLS Client for API unit testing - generic */ @@ -7209,14 +8556,12 @@ } } #else - if (ctx == NULL) { - ctx = wolfSSL_CTX_new(callbacks->method()); - } + ctx = wolfSSL_CTX_new(callbacks->method()); +#endif if (ctx == NULL) { fprintf(stderr, "CTX new failed\n"); goto cleanup; } -#endif #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); @@ -7424,11 +8769,11 @@ static int test_wolfSSL_reuse_WOLFSSLobj(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_SESSION_CACHE) && \ !defined(WOLFSSL_NO_TLS12) /* The unit test for session resumption by re-using WOLFSSL object. - * WOLFSSL object is not cleared after first session. It re-use the obeject + * WOLFSSL object is not cleared after first session. It reuse the object * for second connection. */ tcp_ready ready; @@ -7437,7 +8782,6 @@ THREAD_TYPE serverThread; callback_functions client_cbf; callback_functions server_cbf; - EXPECT_DECLS; XMEMSET(&client_args, 0, sizeof(func_args)); XMEMSET(&server_args, 0, sizeof(func_args)); @@ -7478,14 +8822,12 @@ #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); #endif - - res = EXPECT_RESULT(); -#endif /* defined(OPENSSL_EXTRA) && !defined(NO_SESSION_CACHE) && !defined(WOLFSSL_TLS13) */ - return res; +#endif /* defined(OPENSSL_EXTRA) && !defined(NO_SESSION_CACHE) && + * !defined(WOLFSSL_TLS13) */ + return EXPECT_RESULT(); } -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_TIRTOS) && \ - defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) static int test_wolfSSL_CTX_verifyDepth_ServerClient_1_ctx_ready( WOLFSSL_CTX* ctx) { @@ -7498,15 +8840,13 @@ static int test_wolfSSL_CTX_verifyDepth_ServerClient_1(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_TIRTOS) && \ - defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) test_ssl_cbf client_cbf; test_ssl_cbf server_cbf; - XMEMSET(&client_cbf, 0, sizeof(callback_functions)); - XMEMSET(&server_cbf, 0, sizeof(callback_functions)); + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); #ifdef WOLFSSL_TLS13 client_cbf.method = wolfTLSv1_3_client_method; @@ -7520,37 +8860,31 @@ ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); +#endif /* OPENSSL_EXTRA && HAVE_SSL_MEMIO_TESTS_DEPENDENCIES */ - res = EXPECT_RESULT(); -#endif /* OPENSSL_EXTRA && !WOLFSSL_TIRTOS && - * HAVE_SSL_MEMIO_TESTS_DEPENDENCIES */ - - return res; + return EXPECT_RESULT(); } -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_TIRTOS) && \ - defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) static int test_wolfSSL_CTX_verifyDepth_ServerClient_2_ctx_ready( WOLFSSL_CTX* ctx) { wolfSSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, myVerify); - myVerifyAction = VERIFY_USE_PREVERFIY; - wolfSSL_CTX_set_verify_depth(ctx, 1); + myVerifyAction = VERIFY_OVERRIDE_ERROR; + wolfSSL_CTX_set_verify_depth(ctx, 0); return TEST_SUCCESS; } #endif static int test_wolfSSL_CTX_verifyDepth_ServerClient_2(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_TIRTOS) && \ - defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) test_ssl_cbf client_cbf; test_ssl_cbf server_cbf; - XMEMSET(&client_cbf, 0, sizeof(callback_functions)); - XMEMSET(&server_cbf, 0, sizeof(callback_functions)); + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); #ifdef WOLFSSL_TLS13 client_cbf.method = wolfTLSv1_3_client_method; @@ -7568,16 +8902,12 @@ ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); +#endif /* OPENSSL_EXTRA && HAVE_SSL_MEMIO_TESTS_DEPENDENCIES */ - res = EXPECT_RESULT(); -#endif /* OPENSSL_EXTRA && !WOLFSSL_TIRTOS && - * HAVE_SSL_MEMIO_TESTS_DEPENDENCIES */ - - return res; + return EXPECT_RESULT(); } -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_TIRTOS) && \ - defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) static int test_wolfSSL_CTX_verifyDepth_ServerClient_3_ctx_ready( WOLFSSL_CTX* ctx) { @@ -7590,15 +8920,13 @@ static int test_wolfSSL_CTX_verifyDepth_ServerClient_3(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_TIRTOS) && \ - defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) test_ssl_cbf client_cbf; test_ssl_cbf server_cbf; - XMEMSET(&client_cbf, 0, sizeof(callback_functions)); - XMEMSET(&server_cbf, 0, sizeof(callback_functions)); + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); #ifdef WOLFSSL_TLS13 client_cbf.method = wolfTLSv1_3_client_method; @@ -7612,21 +8940,20 @@ * therefore, handshake becomes failure. */ ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, - &server_cbf, NULL), TEST_SUCCESS); - - ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); - ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + &server_cbf, NULL), TEST_FAIL); - res = EXPECT_RESULT(); -#endif /* OPENSSL_EXTRA && !WOLFSSL_TIRTOS && - * HAVE_SSL_MEMIO_TESTS_DEPENDENCIES */ + ExpectIntEQ(client_cbf.return_code, TEST_FAIL); + ExpectIntEQ(server_cbf.return_code, TEST_FAIL); + ExpectIntEQ(client_cbf.last_err, MAX_CHAIN_ERROR); + ExpectIntEQ(server_cbf.last_err, FATAL_ERROR); +#endif /* OPENSSL_EXTRA && HAVE_SSL_MEMIO_TESTS_DEPENDENCIES */ - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_ALL) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ - !defined(WOLFSSL_TIRTOS) && !defined(NO_AES) && !defined(WOLFSSL_NO_TLS12) \ - && !defined(NO_SHA256) && defined(HAVE_ECC) + !defined(WOLFSSL_NO_TLS12) && \ + defined(HAVE_ECC) && !defined(NO_AES) && !defined(NO_SHA256) static int test_wolfSSL_CTX_set_cipher_list_server_ctx_ready(WOLFSSL_CTX* ctx) { EXPECT_DECLS; @@ -7644,12 +8971,11 @@ static int test_wolfSSL_CTX_set_cipher_list(void) { - int res = TEST_SKIPPED; - -#if defined(OPENSSL_ALL) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ - !defined(WOLFSSL_TIRTOS) && !defined(NO_AES) && !defined(WOLFSSL_NO_TLS12) \ - && !defined(NO_SHA256) && defined(HAVE_ECC) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ + defined(HAVE_ECC) && !defined(NO_AES) && !defined(NO_SHA256) + + #if !defined(WOLFSSL_NO_TLS12) WOLFSSL_CTX* ctxClient = NULL; WOLFSSL* sslClient = NULL; test_ssl_cbf client_cbf; @@ -7671,10 +8997,11 @@ /* check with cipher string that has '+' */ ExpectNotNull((ctxClient = wolfSSL_CTX_new(wolfTLSv1_2_client_method()))); - ExpectTrue(wolfSSL_CTX_set_cipher_list(ctxClient, "ECDHE+AESGCM")); + /* Use trailing : with nothing to test for ASAN */ + ExpectTrue(wolfSSL_CTX_set_cipher_list(ctxClient, "ECDHE+AESGCM:")); ExpectNotNull((sslClient = wolfSSL_new(ctxClient))); - /* check for the existance of an ECDHE ECDSA cipher suite */ + /* check for the existence of an ECDHE ECDSA cipher suite */ if (EXPECT_SUCCESS()) { int i = 0; int found = 0; @@ -7700,9 +9027,9 @@ wolfSSL_free(sslClient); wolfSSL_CTX_free(ctxClient); - res = EXPECT_RESULT(); + #endif /* !WOLFSSL_NO_TLS12 */ #endif - return res; + return EXPECT_RESULT(); } #if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ @@ -7724,16 +9051,16 @@ XMEMSET(client_side_msg2, 0, MD_MAX_SIZE); msg_len = wolfSSL_get_peer_finished(ssl, client_side_msg2, MD_MAX_SIZE); ExpectIntGE(msg_len, 0); + return EXPECT_RESULT(); } #endif static int test_wolfSSL_get_finished(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ defined(WOLFSSL_HAVE_TLS_UNIQUE) - EXPECT_DECLS; test_ssl_cbf client_cbf; test_ssl_cbf server_cbf; @@ -7747,11 +9074,9 @@ /* test received msg vs sent msg */ ExpectIntEQ(0, XMEMCMP(client_side_msg1, server_side_msg2, MD_MAX_SIZE)); ExpectIntEQ(0, XMEMCMP(client_side_msg2, server_side_msg1, MD_MAX_SIZE)); - - res = EXPECT_RESULT(); #endif /* HAVE_SSL_MEMIO_TESTS_DEPENDENCIES && WOLFSSL_HAVE_TLS_UNIQUE */ - return res; + return EXPECT_RESULT(); } #if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ @@ -7852,11 +9177,10 @@ static int test_wolfSSL_CTX_add_session(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ !defined(SINGLE_THREADED) && defined(WOLFSSL_TLS13) && \ !defined(NO_SESSION_CACHE) - EXPECT_DECLS; tcp_ready ready; func_args client_args; func_args server_args; @@ -7952,11 +9276,9 @@ if (EXPECT_FAIL()) break; } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ @@ -7996,7 +9318,9 @@ static int twcase_new_sessionCb(WOLFSSL *ssl, WOLFSSL_SESSION *sess) { int i; + unsigned int len; (void)ssl; + /* * This example uses a hash table. * Steps you should take for a non-demo code: @@ -8018,11 +9342,7 @@ } for (i = 0; i < SESSION_CACHE_SIZE; i++) { if (server_sessionCache.entries[i].value == NULL) { - if (sess->haveAltSessionID == 1) - server_sessionCache.entries[i].key = sess->altSessionID; - else - server_sessionCache.entries[i].key = sess->sessionID; - + server_sessionCache.entries[i].key = SSL_SESSION_get_id(sess, &len); server_sessionCache.entries[i].value = sess; server_sessionCache.length++; break; @@ -8134,7 +9454,7 @@ WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE, WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE); #endif - /* off - Donot setup external cache */ + /* off - Do not setup external cache */ /* Require both peers to provide certs */ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL); @@ -8143,12 +9463,11 @@ static int twcase_cache_intOn_extOff(WOLFSSL_CTX* ctx) { - EXPECT_DECLS; - /* on - internal cache is on by default*/ - /* off - Donot setup external cache */ + /* on - internal cache is on by default */ + /* off - Do not setup external cache */ /* Require both peers to provide certs */ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL); - return EXPECT_RESULT(); + return TEST_SUCCESS; } static int twcase_cache_intOff_extOn(WOLFSSL_CTX* ctx) @@ -8174,7 +9493,6 @@ static int twcase_cache_intOn_extOn(WOLFSSL_CTX* ctx) { - EXPECT_DECLS; /* on - internal cache is on by default */ /* on - Enable external cache */ wolfSSL_CTX_sess_set_new_cb(ctx, twcase_new_sessionCb); @@ -8183,11 +9501,10 @@ /* Require both peers to provide certs */ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL); - return EXPECT_RESULT(); + return TEST_SUCCESS; } static int twcase_cache_intOn_extOn_noTicket(WOLFSSL_CTX* ctx) { - EXPECT_DECLS; /* on - internal cache is on by default */ /* on - Enable external cache */ wolfSSL_CTX_sess_set_new_cb(ctx, twcase_new_sessionCb); @@ -8197,7 +9514,7 @@ wolfSSL_CTX_set_options(ctx, WOLFSSL_OP_NO_TICKET); /* Require both peers to provide certs */ wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL); - return EXPECT_RESULT(); + return TEST_SUCCESS; } static int twcase_server_sess_ctx_pre_shutdown(WOLFSSL* ssl) { @@ -8291,51 +9608,19 @@ WOLFSSL_SUCCESS); return EXPECT_RESULT(); } -#endif -static int test_wolfSSL_CTX_add_session_ext(void) +struct test_add_session_ext_params { + method_provider client_meth; + method_provider server_meth; + const char* tls_version; +}; + +static int test_wolfSSL_CTX_add_session_ext( + struct test_add_session_ext_params* param) { - int res = TEST_SKIPPED; -#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ - defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ - defined(OPENSSL_EXTRA) && defined(SESSION_CERTS) && \ - defined(HAVE_SESSION_TICKET) && \ - !defined(TITAN_SESSION_CACHE) && \ - !defined(HUGE_SESSION_CACHE) && \ - !defined(BIG_SESSION_CACHE) && \ - !defined(MEDIUM_SESSION_CACHE) EXPECT_DECLS; /* Test the default 33 sessions */ - - struct test_params { - method_provider client_meth; - method_provider server_meth; - const char* tls_version; - } params[] = { -#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ - defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TICKET_HAVE_ID) - { wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3" }, -#ifdef WOLFSSL_DTLS13 - { wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3" }, -#endif -#endif -#ifndef WOLFSSL_NO_TLS12 - { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLSv1_2" }, -#ifdef WOLFSSL_DTLS - { wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, "DTLSv1_2" }, -#endif -#endif -#if !defined(NO_OLD_TLS) && ((!defined(NO_AES) && !defined(NO_AES_CBC)) || \ - !defined(NO_DES3)) - { wolfTLSv1_1_client_method, wolfTLSv1_1_server_method, "TLSv1_1" }, -#ifdef WOLFSSL_DTLS - { wolfDTLSv1_client_method, wolfDTLSv1_server_method, "DTLSv1_0" }, -#endif -#endif - }; - - const int paramsLen = sizeof(params)/sizeof(*params); - int i, j; + int j; /* Clear cache before starting */ wolfSSL_CTX_flush_sessions(NULL, -1); @@ -8345,234 +9630,358 @@ return BAD_MUTEX_E; server_sessionCache.capacity = SESSION_CACHE_SIZE; - for (i = 0; i < paramsLen; i++) { - fprintf(stderr, "\tBegin %s\n", params[i].tls_version); - for (j = 0; j < 5; j++) { - int tls13 = XSTRSTR(params[i].tls_version, "TLSv1_3") != NULL; - int dtls = XSTRSTR(params[i].tls_version, "DTLS") != NULL; - test_ssl_cbf client_cb; - test_ssl_cbf server_cb; - - (void)dtls; - - /* Test five cache configurations */ - twcase_client_first_session_ptr = NULL; - twcase_server_first_session_ptr = NULL; - twcase_server_current_ctx_ptr = NULL; - twcase_new_session_called = 0; - twcase_remove_session_called = 0; - twcase_get_session_called = 0; - - /* connection 1 - first connection */ - fprintf(stderr, "\tconnect: %s: j=%d, methodsLen=%d\n", - params[i].tls_version, j, paramsLen); - - XMEMSET(&client_cb, 0, sizeof(callback_functions)); - XMEMSET(&server_cb, 0, sizeof(callback_functions)); - client_cb.method = params[i].client_meth; - server_cb.method = params[i].server_meth; - - if (dtls) - client_cb.doUdp = server_cb.doUdp = 1; - - /* Setup internal and external cache */ - switch (j) { - case 0: - /* SSL_OP_NO_TICKET stateful ticket case */ - server_cb.ctx_ready = twcase_cache_intOn_extOn_noTicket; - break; - case 1: - server_cb.ctx_ready = twcase_cache_intOn_extOn; - break; - case 2: - server_cb.ctx_ready = twcase_cache_intOff_extOn; - break; - case 3: - server_cb.ctx_ready = twcase_cache_intOn_extOff; - break; - case 4: - server_cb.ctx_ready = twcase_cache_intOff_extOff; - break; - } - client_cb.ctx_ready = twcase_cache_intOff_extOff; - - /* Add session to internal cache and save SSL session for testing */ - server_cb.on_result = twcase_server_sess_ctx_pre_shutdown; - /* Save client SSL session for testing */ - client_cb.on_result = twcase_client_sess_ctx_pre_shutdown; - server_cb.ticNoInit = 1; /* Use default builtin */ - /* Don't free/release ctx */ - server_cb.ctx = twcase_server_current_ctx_ptr; - server_cb.isSharedCtx = 1; - - ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cb, - &server_cb, NULL), TEST_SUCCESS); - - ExpectIntEQ(twcase_get_session_called, 0); - if (EXPECT_FAIL()) { - wolfSSL_SESSION_free(twcase_client_first_session_ptr); - wolfSSL_SESSION_free(twcase_server_first_session_ptr); - wolfSSL_CTX_free(twcase_server_current_ctx_ptr); + fprintf(stderr, "\tBegin %s\n", param->tls_version); + for (j = 0; j < 5; j++) { + int tls13 = XSTRSTR(param->tls_version, "TLSv1_3") != NULL; + int dtls = XSTRSTR(param->tls_version, "DTLS") != NULL; + test_ssl_cbf client_cb; + test_ssl_cbf server_cb; + + (void)dtls; + + /* Test five cache configurations */ + twcase_client_first_session_ptr = NULL; + twcase_server_first_session_ptr = NULL; + twcase_server_current_ctx_ptr = NULL; + twcase_new_session_called = 0; + twcase_remove_session_called = 0; + twcase_get_session_called = 0; + + /* connection 1 - first connection */ + fprintf(stderr, "\tconnect: %s: j=%d\n", param->tls_version, j); + + XMEMSET(&client_cb, 0, sizeof(client_cb)); + XMEMSET(&server_cb, 0, sizeof(server_cb)); + client_cb.method = param->client_meth; + server_cb.method = param->server_meth; + + if (dtls) + client_cb.doUdp = server_cb.doUdp = 1; + + /* Setup internal and external cache */ + switch (j) { + case 0: + /* SSL_OP_NO_TICKET stateful ticket case */ + server_cb.ctx_ready = twcase_cache_intOn_extOn_noTicket; break; - } + case 1: + server_cb.ctx_ready = twcase_cache_intOn_extOn; + break; + case 2: + server_cb.ctx_ready = twcase_cache_intOff_extOn; + break; + case 3: + server_cb.ctx_ready = twcase_cache_intOn_extOff; + break; + case 4: + server_cb.ctx_ready = twcase_cache_intOff_extOff; + break; + } + client_cb.ctx_ready = twcase_cache_intOff_extOff; - switch (j) { - case 0: - case 1: - case 2: - /* cache cannot be searched with out a connection */ - /* Add a new session */ - ExpectIntEQ(twcase_new_session_called, 1); - /* In twcase_server_sess_ctx_pre_shutdown - * wolfSSL_CTX_add_session which evicts the existing session - * in cache and adds it back in */ - ExpectIntLE(twcase_remove_session_called, 1); - break; - case 3: - case 4: - /* no external cache */ - ExpectIntEQ(twcase_new_session_called, 0); - ExpectIntEQ(twcase_remove_session_called, 0); - break; - } + /* Add session to internal cache and save SSL session for testing */ + server_cb.on_result = twcase_server_sess_ctx_pre_shutdown; + /* Save client SSL session for testing */ + client_cb.on_result = twcase_client_sess_ctx_pre_shutdown; + server_cb.ticNoInit = 1; /* Use default builtin */ + /* Don't free/release ctx */ + server_cb.ctx = twcase_server_current_ctx_ptr; + server_cb.isSharedCtx = 1; - /* connection 2 - session resume */ - fprintf(stderr, "\tresume: %s: j=%d, methodsLen=%d\n", - params[i].tls_version, j, paramsLen); - twcase_new_session_called = 0; - twcase_remove_session_called = 0; - twcase_get_session_called = 0; - server_cb.on_result = 0; - client_cb.on_result = 0; - server_cb.ticNoInit = 1; /* Use default builtin */ + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cb, + &server_cb, NULL), TEST_SUCCESS); - server_cb.ctx = twcase_server_current_ctx_ptr; + ExpectIntEQ(twcase_get_session_called, 0); + if (EXPECT_FAIL()) { + wolfSSL_SESSION_free(twcase_client_first_session_ptr); + wolfSSL_SESSION_free(twcase_server_first_session_ptr); + wolfSSL_CTX_free(twcase_server_current_ctx_ptr); + break; + } - /* try session resumption */ - client_cb.ssl_ready = twcase_client_set_sess_ssl_ready; + switch (j) { + case 0: + case 1: + case 2: + /* cache cannot be searched with out a connection */ + /* Add a new session */ + ExpectIntEQ(twcase_new_session_called, 1); + /* In twcase_server_sess_ctx_pre_shutdown + * wolfSSL_CTX_add_session which evicts the existing session + * in cache and adds it back in */ + ExpectIntLE(twcase_remove_session_called, 1); + break; + case 3: + case 4: + /* no external cache */ + ExpectIntEQ(twcase_new_session_called, 0); + ExpectIntEQ(twcase_remove_session_called, 0); + break; + } - ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cb, - &server_cb, NULL), TEST_SUCCESS); + /* connection 2 - session resume */ + fprintf(stderr, "\tresume: %s: j=%d\n", param->tls_version, j); + twcase_new_session_called = 0; + twcase_remove_session_called = 0; + twcase_get_session_called = 0; + server_cb.on_result = 0; + client_cb.on_result = 0; + server_cb.ticNoInit = 1; /* Use default builtin */ + + server_cb.ctx = twcase_server_current_ctx_ptr; + + /* try session resumption */ + client_cb.ssl_ready = twcase_client_set_sess_ssl_ready; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cb, + &server_cb, NULL), TEST_SUCCESS); + + /* Clear cache before checking */ + wolfSSL_CTX_flush_sessions(NULL, -1); + + switch (j) { + case 0: + if (tls13) { + /* (D)TLSv1.3 stateful case */ + /* cache hit */ + /* DTLS accesses cache once for stateless parsing and + * once for stateful parsing */ + ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); - /* Clear cache before checking */ - wolfSSL_CTX_flush_sessions(NULL, -1); - - switch (j) { - case 0: - if (tls13) { - /* (D)TLSv1.3 stateful case */ - /* cache hit */ - /* DTLS accesses cache once for stateless parsing and - * once for stateful parsing */ - ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); - - /* (D)TLSv1.3 creates a new ticket, - * updates both internal and external cache */ - ExpectIntEQ(twcase_new_session_called, 1); - ExpectIntEQ(twcase_remove_session_called, 1); + /* (D)TLSv1.3 creates a new ticket, + * updates both internal and external cache */ + ExpectIntEQ(twcase_new_session_called, 1); + /* A new session ID is created for a new ticket */ + ExpectIntEQ(twcase_remove_session_called, 2); - } - else { - /* non (D)TLSv1.3 case, no update */ - /* DTLS accesses cache once for stateless parsing and - * once for stateful parsing */ + } + else { + /* non (D)TLSv1.3 case, no update */ + /* DTLS accesses cache once for stateless parsing and + * once for stateful parsing */ #ifdef WOLFSSL_DTLS_NO_HVR_ON_RESUME - ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); + ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); #else - ExpectIntEQ(twcase_get_session_called, 1); + ExpectIntEQ(twcase_get_session_called, 1); #endif - ExpectIntEQ(twcase_new_session_called, 0); - /* Called on session added in - * twcase_server_sess_ctx_pre_shutdown */ - ExpectIntEQ(twcase_remove_session_called, 1); - } - break; - case 1: - if (tls13) { - /* (D)TLSv1.3 case */ - /* cache hit */ - ExpectIntEQ(twcase_get_session_called, 1); - /* (D)TLSv1.3 creates a new ticket, - * updates both internal and external cache */ - ExpectIntEQ(twcase_new_session_called, 1); - /* Called on session added in - * twcase_server_sess_ctx_pre_shutdown and by wolfSSL */ - ExpectIntEQ(twcase_remove_session_called, 1); - } - else { - /* non (D)TLSv1.3 case */ - /* cache hit */ - /* DTLS accesses cache once for stateless parsing and - * once for stateful parsing */ + ExpectIntEQ(twcase_new_session_called, 0); + /* Called on session added in + * twcase_server_sess_ctx_pre_shutdown */ + ExpectIntEQ(twcase_remove_session_called, 1); + } + break; + case 1: + if (tls13) { + /* (D)TLSv1.3 case */ + /* cache hit */ + ExpectIntEQ(twcase_get_session_called, 1); + /* (D)TLSv1.3 creates a new ticket, + * updates both internal and external cache */ + ExpectIntEQ(twcase_new_session_called, 1); + /* Called on session added in + * twcase_server_sess_ctx_pre_shutdown and by wolfSSL */ + ExpectIntEQ(twcase_remove_session_called, 1); + } + else { + /* non (D)TLSv1.3 case */ + /* cache hit */ + /* DTLS accesses cache once for stateless parsing and + * once for stateful parsing */ #ifdef WOLFSSL_DTLS_NO_HVR_ON_RESUME - ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); + ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); #else - ExpectIntEQ(twcase_get_session_called, 1); + ExpectIntEQ(twcase_get_session_called, 1); #endif - ExpectIntEQ(twcase_new_session_called, 0); - /* Called on session added in - * twcase_server_sess_ctx_pre_shutdown */ - ExpectIntEQ(twcase_remove_session_called, 1); - } - break; - case 2: - if (tls13) { - /* (D)TLSv1.3 case */ - /* cache hit */ - ExpectIntEQ(twcase_get_session_called, 1); - /* (D)TLSv1.3 creates a new ticket, - * updates both internal and external cache */ - ExpectIntEQ(twcase_new_session_called, 1); - /* Called on session added in - * twcase_server_sess_ctx_pre_shutdown and by wolfSSL */ - ExpectIntEQ(twcase_remove_session_called, 1); - } - else { - /* non (D)TLSv1.3 case */ - /* cache hit */ - /* DTLS accesses cache once for stateless parsing and - * once for stateful parsing */ + ExpectIntEQ(twcase_new_session_called, 0); + /* Called on session added in + * twcase_server_sess_ctx_pre_shutdown */ + ExpectIntEQ(twcase_remove_session_called, 1); + } + break; + case 2: + if (tls13) { + /* (D)TLSv1.3 case */ + /* cache hit */ + ExpectIntEQ(twcase_get_session_called, 1); + /* (D)TLSv1.3 creates a new ticket, + * updates both internal and external cache */ + ExpectIntEQ(twcase_new_session_called, 1); + /* Called on session added in + * twcase_server_sess_ctx_pre_shutdown and by wolfSSL */ + ExpectIntEQ(twcase_remove_session_called, 1); + } + else { + /* non (D)TLSv1.3 case */ + /* cache hit */ + /* DTLS accesses cache once for stateless parsing and + * once for stateful parsing */ #ifdef WOLFSSL_DTLS_NO_HVR_ON_RESUME - ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); + ExpectIntEQ(twcase_get_session_called, !dtls ? 1 : 2); #else - ExpectIntEQ(twcase_get_session_called, 1); + ExpectIntEQ(twcase_get_session_called, 1); #endif - ExpectIntEQ(twcase_new_session_called, 0); - /* Called on session added in - * twcase_server_sess_ctx_pre_shutdown */ - ExpectIntEQ(twcase_remove_session_called, 1); - } - break; - case 3: - case 4: - /* no external cache */ - ExpectIntEQ(twcase_get_session_called, 0); ExpectIntEQ(twcase_new_session_called, 0); - ExpectIntEQ(twcase_remove_session_called, 0); - break; - } - wolfSSL_SESSION_free(twcase_client_first_session_ptr); - wolfSSL_SESSION_free(twcase_server_first_session_ptr); - wolfSSL_CTX_free(twcase_server_current_ctx_ptr); - - if (EXPECT_FAIL()) + /* Called on session added in + * twcase_server_sess_ctx_pre_shutdown */ + ExpectIntEQ(twcase_remove_session_called, 1); + } + break; + case 3: + case 4: + /* no external cache */ + ExpectIntEQ(twcase_get_session_called, 0); + ExpectIntEQ(twcase_new_session_called, 0); + ExpectIntEQ(twcase_remove_session_called, 0); break; } - twcase_get_sessionCb_cleanup(); - XMEMSET(&server_sessionCache.entries, 0, - sizeof(server_sessionCache.entries)); - fprintf(stderr, "\tEnd %s\n", params[i].tls_version); + wolfSSL_SESSION_free(twcase_client_first_session_ptr); + wolfSSL_SESSION_free(twcase_server_first_session_ptr); + wolfSSL_CTX_free(twcase_server_current_ctx_ptr); if (EXPECT_FAIL()) break; } + twcase_get_sessionCb_cleanup(); + XMEMSET(&server_sessionCache.entries, 0, + sizeof(server_sessionCache.entries)); + fprintf(stderr, "\tEnd %s\n", param->tls_version); + wc_FreeMutex(&server_sessionCache.htLock); - res = EXPECT_RESULT(); -#endif - return res; + return EXPECT_RESULT(); } +#endif +static int test_wolfSSL_CTX_add_session_ext_tls13(void) +{ + EXPECT_DECLS; +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ + defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ + defined(OPENSSL_EXTRA) && defined(SESSION_CERTS) && \ + defined(HAVE_SESSION_TICKET) && \ + !defined(TITAN_SESSION_CACHE) && \ + !defined(HUGE_SESSION_CACHE) && \ + !defined(BIG_SESSION_CACHE) && \ + !defined(MEDIUM_SESSION_CACHE) +#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ + defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TICKET_HAVE_ID) + struct test_add_session_ext_params param[1] = { + { wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3" } + }; + ExpectIntEQ(test_wolfSSL_CTX_add_session_ext(param), TEST_SUCCESS); +#endif +#endif + return EXPECT_RESULT(); +} +static int test_wolfSSL_CTX_add_session_ext_dtls13(void) +{ + EXPECT_DECLS; +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ + defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ + defined(OPENSSL_EXTRA) && defined(SESSION_CERTS) && \ + defined(HAVE_SESSION_TICKET) && \ + !defined(TITAN_SESSION_CACHE) && \ + !defined(HUGE_SESSION_CACHE) && \ + !defined(BIG_SESSION_CACHE) && \ + !defined(MEDIUM_SESSION_CACHE) +#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ + defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TICKET_HAVE_ID) +#ifdef WOLFSSL_DTLS13 + struct test_add_session_ext_params param[1] = { + { wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3" } + }; + ExpectIntEQ(test_wolfSSL_CTX_add_session_ext(param), TEST_SUCCESS); +#endif +#endif +#endif + return EXPECT_RESULT(); +} +static int test_wolfSSL_CTX_add_session_ext_tls12(void) +{ + EXPECT_DECLS; +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ + defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ + defined(OPENSSL_EXTRA) && defined(SESSION_CERTS) && \ + defined(HAVE_SESSION_TICKET) && \ + !defined(TITAN_SESSION_CACHE) && \ + !defined(HUGE_SESSION_CACHE) && \ + !defined(BIG_SESSION_CACHE) && \ + !defined(MEDIUM_SESSION_CACHE) +#ifndef WOLFSSL_NO_TLS12 + struct test_add_session_ext_params param[1] = { + { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLSv1_2" } + }; + ExpectIntEQ(test_wolfSSL_CTX_add_session_ext(param), TEST_SUCCESS); +#endif +#endif + return EXPECT_RESULT(); +} +static int test_wolfSSL_CTX_add_session_ext_dtls12(void) +{ + EXPECT_DECLS; +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ + defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ + defined(OPENSSL_EXTRA) && defined(SESSION_CERTS) && \ + defined(HAVE_SESSION_TICKET) && \ + !defined(TITAN_SESSION_CACHE) && \ + !defined(HUGE_SESSION_CACHE) && \ + !defined(BIG_SESSION_CACHE) && \ + !defined(MEDIUM_SESSION_CACHE) +#ifndef WOLFSSL_NO_TLS12 +#ifdef WOLFSSL_DTLS + struct test_add_session_ext_params param[1] = { + { wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, "DTLSv1_2" } + }; + ExpectIntEQ(test_wolfSSL_CTX_add_session_ext(param), TEST_SUCCESS); +#endif +#endif +#endif + return EXPECT_RESULT(); +} +static int test_wolfSSL_CTX_add_session_ext_tls11(void) +{ + EXPECT_DECLS; +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ + defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ + defined(OPENSSL_EXTRA) && defined(SESSION_CERTS) && \ + defined(HAVE_SESSION_TICKET) && \ + !defined(TITAN_SESSION_CACHE) && \ + !defined(HUGE_SESSION_CACHE) && \ + !defined(BIG_SESSION_CACHE) && \ + !defined(MEDIUM_SESSION_CACHE) +#if !defined(NO_OLD_TLS) && ((!defined(NO_AES) && !defined(NO_AES_CBC)) || \ + !defined(NO_DES3)) + struct test_add_session_ext_params param[1] = { + { wolfTLSv1_1_client_method, wolfTLSv1_1_server_method, "TLSv1_1" } + }; + ExpectIntEQ(test_wolfSSL_CTX_add_session_ext(param), TEST_SUCCESS); +#endif +#endif + return EXPECT_RESULT(); +} +static int test_wolfSSL_CTX_add_session_ext_dtls1(void) +{ + EXPECT_DECLS; +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_EXT_CACHE) && \ + defined(WOLFSSL_TLS13) && !defined(NO_SESSION_CACHE) && \ + defined(OPENSSL_EXTRA) && defined(SESSION_CERTS) && \ + defined(HAVE_SESSION_TICKET) && \ + !defined(TITAN_SESSION_CACHE) && \ + !defined(HUGE_SESSION_CACHE) && \ + !defined(BIG_SESSION_CACHE) && \ + !defined(MEDIUM_SESSION_CACHE) +#if !defined(NO_OLD_TLS) && ((!defined(NO_AES) && !defined(NO_AES_CBC)) || \ + !defined(NO_DES3)) +#ifdef WOLFSSL_DTLS + struct test_add_session_ext_params param[1] = { + { wolfDTLSv1_client_method, wolfDTLSv1_server_method, "DTLSv1_0" } + }; + ExpectIntEQ(test_wolfSSL_CTX_add_session_ext(param), TEST_SUCCESS); +#endif +#endif +#endif + return EXPECT_RESULT(); +} #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SESSION_EXPORT) /* canned export of a session using older version 3 */ @@ -8632,9 +10041,8 @@ static int test_wolfSSL_dtls_export(void) { - int res = TEST_SKIPPED; -#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SESSION_EXPORT) EXPECT_DECLS; +#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SESSION_EXPORT) tcp_ready ready; func_args client_args; func_args server_args; @@ -8779,7 +10187,7 @@ ExpectIntGT(wolfSSL_dtls_export_state_only(ssl, window, &windowSz), 0); wolfSSL_free(ssl); - for (i = 1; i < server_args.argc; i++) { + for (i = 1; EXPECT_SUCCESS() && i < server_args.argc; i++) { /* restore state */ ExpectNotNull(ssl = wolfSSL_new(ctx)); ExpectIntGT(wolfSSL_dtls_import(ssl, session, sessionSz), 0); @@ -8806,14 +10214,11 @@ fdOpenSession(Task_self()); #endif } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } - #if defined(WOLFSSL_SESSION_EXPORT) && !defined(WOLFSSL_NO_TLS12) #ifdef WOLFSSL_TLS13 static const byte canned_client_tls13_session[] = { @@ -9064,11 +10469,7 @@ if (wolfSSL_write(ssl, msg, sizeof(msg)) != sizeof(msg)) { /*err_sys("SSL_write failed");*/ -#ifdef WOLFSSL_TIRTOS - return; -#else - return 0; -#endif + WOLFSSL_RETURN_FROM_THREAD(0); } #ifdef WOLFSSL_TIRTOS @@ -9102,9 +10503,7 @@ #endif #endif -#ifndef WOLFSSL_TIRTOS - return 0; -#endif + WOLFSSL_RETURN_FROM_THREAD(0); } @@ -9308,9 +10707,8 @@ #ifdef HAVE_SNI static int test_wolfSSL_UseSNI_params(void) { - int res = TEST_SKIPPED; -#if !defined(NO_WOLFSSL_CLIENT) EXPECT_DECLS; +#if !defined(NO_WOLFSSL_CLIENT) WOLFSSL_CTX *ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); WOLFSSL *ssl = wolfSSL_new(ctx); @@ -9332,11 +10730,9 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT */ - return res; + return EXPECT_RESULT(); } /* BEGIN of connection tests callbacks */ @@ -9449,89 +10845,117 @@ callback_functions client_cb; callback_functions server_cb; size_t i; - +#ifdef WOLFSSL_STATIC_MEMORY + byte cliMem[TEST_TLS_STATIC_MEMSZ]; + byte svrMem[TEST_TLS_STATIC_MEMSZ]; +#endif struct { method_provider client_meth; method_provider server_meth; + #ifdef WOLFSSL_STATIC_MEMORY + wolfSSL_method_func client_meth_ex; + wolfSSL_method_func server_meth_ex; + #endif } methods[] = { #if defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_TLS13) - {wolfSSLv23_client_method, wolfSSLv23_server_method}, + {wolfSSLv23_client_method, wolfSSLv23_server_method + #ifdef WOLFSSL_STATIC_MEMORY + ,wolfSSLv23_client_method_ex, wolfSSLv23_server_method_ex + #endif + }, #endif #ifndef WOLFSSL_NO_TLS12 - {wolfTLSv1_2_client_method, wolfTLSv1_2_server_method}, + {wolfTLSv1_2_client_method, wolfTLSv1_2_server_method + #ifdef WOLFSSL_STATIC_MEMORY + ,wolfTLSv1_2_client_method_ex, wolfTLSv1_2_server_method_ex + #endif + }, #endif #ifdef WOLFSSL_TLS13 - {wolfTLSv1_3_client_method, wolfTLSv1_3_server_method}, + {wolfTLSv1_3_client_method, wolfTLSv1_3_server_method + #ifdef WOLFSSL_STATIC_MEMORY + ,wolfTLSv1_3_client_method_ex, wolfTLSv1_3_server_method_ex + #endif + }, #endif }; + size_t methodsSz = sizeof(methods) / sizeof(*methods); - for (i = 0; i < (sizeof(methods)/sizeof(*methods)); i++) { - XMEMSET(&client_cb, 0, sizeof(callback_functions)); - XMEMSET(&server_cb, 0, sizeof(callback_functions)); - client_cb.method = methods[i].client_meth; - server_cb.method = methods[i].server_meth; - client_cb.devId = testDevId; - server_cb.devId = testDevId; - - /* success case at ctx */ - printf("success case at ctx\n"); - client_cb.ctx_ready = use_SNI_at_ctx; client_cb.ssl_ready = NULL; client_cb.on_result = NULL; - server_cb.ctx_ready = use_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_real_matching; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* success case at ssl */ - printf("success case at ssl\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = use_SNI_at_ssl; client_cb.on_result = verify_SNI_real_matching; - server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_at_ssl; server_cb.on_result = verify_SNI_real_matching; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* default mismatch behavior */ - printf("default mismatch behavior\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = verify_FATAL_ERROR_on_client; - server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_at_ssl; server_cb.on_result = verify_UNKNOWN_SNI_on_server; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* continue on mismatch */ - printf("continue on mismatch\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = NULL; - server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_WITH_CONTINUE_at_ssl; server_cb.on_result = verify_SNI_no_matching; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* fake answer on mismatch */ - printf("fake answer on mismatch\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = NULL; - server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_WITH_FAKE_ANSWER_at_ssl; server_cb.on_result = verify_SNI_fake_matching; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* sni abort - success */ - printf("sni abort - success\n"); - client_cb.ctx_ready = use_SNI_at_ctx; client_cb.ssl_ready = NULL; client_cb.on_result = NULL; - server_cb.ctx_ready = use_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_real_matching; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* sni abort - abort when absent (ctx) */ - printf("sni abort - abort when absent (ctx)\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = NULL; client_cb.on_result = verify_FATAL_ERROR_on_client; - server_cb.ctx_ready = use_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_ABSENT_on_server; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* sni abort - abort when absent (ssl) */ - printf("sni abort - abort when absent (ssl)\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = NULL; client_cb.on_result = verify_FATAL_ERROR_on_client; - server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_MANDATORY_SNI_at_ssl; server_cb.on_result = verify_SNI_ABSENT_on_server; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* sni abort - success when overwritten */ - printf("sni abort - success when overwritten\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = NULL; client_cb.on_result = NULL; - server_cb.ctx_ready = use_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = use_SNI_at_ssl; server_cb.on_result = verify_SNI_no_matching; - test_wolfSSL_client_server(&client_cb, &server_cb); - - /* sni abort - success when allowing mismatches */ - printf("sni abort - success when allowing mismatches\n"); - client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = NULL; - server_cb.ctx_ready = use_PSEUDO_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_fake_matching; - test_wolfSSL_client_server(&client_cb, &server_cb); + for (i = 0; i < methodsSz; i++) { + XMEMSET(&client_cb, 0, sizeof(callback_functions)); + XMEMSET(&server_cb, 0, sizeof(callback_functions)); + client_cb.method = methods[i].client_meth; + server_cb.method = methods[i].server_meth; + client_cb.devId = testDevId; + server_cb.devId = testDevId; + #ifdef WOLFSSL_STATIC_MEMORY + client_cb.method_ex = methods[i].client_meth_ex; + server_cb.method_ex = methods[i].server_meth_ex; + client_cb.mem = cliMem; + client_cb.memSz = (word32)sizeof(cliMem); + server_cb.mem = svrMem; + server_cb.memSz = (word32)sizeof(svrMem);; + #endif + + /* success case at ctx */ + fprintf(stderr, "\n\tsuccess case at ctx\n"); + client_cb.ctx_ready = use_SNI_at_ctx; client_cb.ssl_ready = NULL; client_cb.on_result = NULL; + server_cb.ctx_ready = use_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_real_matching; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* success case at ssl */ + fprintf(stderr, "\tsuccess case at ssl\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = use_SNI_at_ssl; client_cb.on_result = verify_SNI_real_matching; + server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_at_ssl; server_cb.on_result = verify_SNI_real_matching; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* default mismatch behavior */ + fprintf(stderr, "\tdefault mismatch behavior\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = verify_FATAL_ERROR_on_client; + server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_at_ssl; server_cb.on_result = verify_UNKNOWN_SNI_on_server; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* continue on mismatch */ + fprintf(stderr, "\tcontinue on mismatch\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = NULL; + server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_WITH_CONTINUE_at_ssl; server_cb.on_result = verify_SNI_no_matching; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* fake answer on mismatch */ + fprintf(stderr, "\tfake answer on mismatch\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = NULL; + server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_SNI_WITH_FAKE_ANSWER_at_ssl; server_cb.on_result = verify_SNI_fake_matching; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* sni abort - success */ + fprintf(stderr, "\tsni abort - success\n"); + client_cb.ctx_ready = use_SNI_at_ctx; client_cb.ssl_ready = NULL; client_cb.on_result = NULL; + server_cb.ctx_ready = use_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_real_matching; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* sni abort - abort when absent (ctx) */ + fprintf(stderr, "\tsni abort - abort when absent (ctx)\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = NULL; client_cb.on_result = verify_FATAL_ERROR_on_client; + server_cb.ctx_ready = use_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_ABSENT_on_server; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* sni abort - abort when absent (ssl) */ + fprintf(stderr, "\tsni abort - abort when absent (ssl)\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = NULL; client_cb.on_result = verify_FATAL_ERROR_on_client; + server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_MANDATORY_SNI_at_ssl; server_cb.on_result = verify_SNI_ABSENT_on_server; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* sni abort - success when overwritten */ + fprintf(stderr, "\tsni abort - success when overwritten\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = NULL; client_cb.on_result = NULL; + server_cb.ctx_ready = use_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = use_SNI_at_ssl; server_cb.on_result = verify_SNI_no_matching; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* sni abort - success when allowing mismatches */ + fprintf(stderr, "\tsni abort - success when allowing mismatches\n"); + client_cb.ctx_ready = NULL; client_cb.ssl_ready = different_SNI_at_ssl; client_cb.on_result = NULL; + server_cb.ctx_ready = use_PSEUDO_MANDATORY_SNI_at_ctx; server_cb.ssl_ready = NULL; server_cb.on_result = verify_SNI_fake_matching; + test_wolfSSL_client_server(&client_cb, &server_cb); } res = TEST_RES_CHECK(1); @@ -9607,7 +11031,7 @@ byte buff5[] = { /* SSL v2.0 client hello */ 0x00, 0x2b, 0x01, 0x03, 0x01, 0x00, 0x09, 0x00, 0x00, - /* dummy bytes bellow, just to pass size check */ + /* dummy bytes below, just to pass size check */ 0xb6, 0x03, 0x03, 0x83, 0xa3, 0xe6, 0xdc, 0x16, 0xa1, 0x43, 0xe9, 0x45, 0x15, 0xbd, 0x64, 0xa9, 0xb6, 0x07, 0xb4, 0x50, 0xc6, 0xdd, 0xff, 0xc2, 0xd3, 0x0d, 0x4f, 0x36, 0xb4, 0x41, 0x51, 0x61, 0xc1, 0xa5, 0x9e, 0x00, @@ -9678,13 +11102,120 @@ #endif /* HAVE_IO_TESTS_DEPENDENCIES */ + +#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SESSION_EXPORT) && \ + defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) +/* Dummy peer functions to satisfy the exporter/importer */ +static int test_wolfSSL_dtls_export_peers_get_peer(WOLFSSL* ssl, char* ip, + int* ipSz, unsigned short* port, int* fam) +{ + (void)ssl; + ip[0] = -1; + *ipSz = 1; + *port = 1; + *fam = 2; + return 1; +} + +static int test_wolfSSL_dtls_export_peers_set_peer(WOLFSSL* ssl, char* ip, + int ipSz, unsigned short port, int fam) +{ + (void)ssl; + if (ip[0] != -1 || ipSz != 1 || port != 1 || fam != 2) + return 0; + return 1; +} + +static int test_wolfSSL_dtls_export_peers_on_handshake(WOLFSSL_CTX **ctx, + WOLFSSL **ssl) +{ + EXPECT_DECLS; + unsigned char* sessionBuf = NULL; + unsigned int sessionSz = 0; + void* ioWriteCtx = wolfSSL_GetIOWriteCtx(*ssl); + void* ioReadCtx = wolfSSL_GetIOReadCtx(*ssl); + + wolfSSL_CTX_SetIOGetPeer(*ctx, test_wolfSSL_dtls_export_peers_get_peer); + wolfSSL_CTX_SetIOSetPeer(*ctx, test_wolfSSL_dtls_export_peers_set_peer); + ExpectIntGE(wolfSSL_dtls_export(*ssl, NULL, &sessionSz), 0); + ExpectNotNull(sessionBuf = + (unsigned char*)XMALLOC(sessionSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntGE(wolfSSL_dtls_export(*ssl, sessionBuf, &sessionSz), 0); + wolfSSL_free(*ssl); + *ssl = NULL; + ExpectNotNull(*ssl = wolfSSL_new(*ctx)); + ExpectIntGE(wolfSSL_dtls_import(*ssl, sessionBuf, sessionSz), 0); + wolfSSL_SetIOWriteCtx(*ssl, ioWriteCtx); + wolfSSL_SetIOReadCtx(*ssl, ioReadCtx); + + XFREE(sessionBuf, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + return EXPECT_RESULT(); +} +#endif + +static int test_wolfSSL_dtls_export_peers(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SESSION_EXPORT) && \ + defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) + test_ssl_cbf client_cbf; + test_ssl_cbf server_cbf; + size_t i, j; + struct test_params { + method_provider client_meth; + method_provider server_meth; + const char* dtls_version; + } params[] = { +#ifndef NO_OLD_TLS + {wolfDTLSv1_client_method, wolfDTLSv1_server_method, "1.0"}, +#endif + {wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, "1.2"}, + /* TODO DTLS 1.3 exporting not supported +#ifdef WOLFSSL_DTLS13 + {wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "1.3"}, +#endif + */ + }; + + for (i = 0; i < sizeof(params)/sizeof(*params); i++) { + for (j = 0; j <= 0b11; j++) { + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + + printf("\n\tTesting DTLS %s connection;", params[i].dtls_version); + + client_cbf.method = params[i].client_meth; + server_cbf.method = params[i].server_meth; + + if (j & 0b01) { + client_cbf.on_handshake = + test_wolfSSL_dtls_export_peers_on_handshake; + printf(" With client export;"); + } + if (j & 0b10) { + server_cbf.on_handshake = + test_wolfSSL_dtls_export_peers_on_handshake; + printf(" With server export;"); + } + + printf("\n"); + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, + &server_cbf, NULL), TEST_SUCCESS); + if (!EXPECT_SUCCESS()) + break; + } + } +#endif + return EXPECT_RESULT(); +} + static int test_wolfSSL_UseTrustedCA(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_TRUSTED_CA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) \ && !defined(NO_RSA) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; WOLFSSL *ssl = NULL; byte id[20]; @@ -9726,21 +11257,18 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif /* HAVE_TRUSTED_CA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_UseMaxFragment(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_MAX_FRAGMENT) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; #ifndef NO_WOLFSSL_SERVER WOLFSSL_CTX* ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); #else @@ -9748,8 +11276,8 @@ #endif WOLFSSL *ssl = NULL; #ifdef OPENSSL_EXTRA - int (*UseMaxFragment)(SSL *s, uint8_t mode); - int (*CTX_UseMaxFragment)(SSL_CTX *c, uint8_t mode); + int (*UseMaxFragment)(SSL *s, unsigned char mode); + int (*CTX_UseMaxFragment)(SSL_CTX *c, unsigned char mode); #else int (*UseMaxFragment)(WOLFSSL *s, unsigned char mode); int (*CTX_UseMaxFragment)(WOLFSSL_CTX *c, unsigned char mode); @@ -9813,19 +11341,44 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - res = EXPECT_RESULT(); +#if defined(OPENSSL_EXTRA) && defined(HAVE_MAX_FRAGMENT) && \ + defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) + /* check negotiated max fragment size */ + { + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, wolfTLSv1_2_server_method), 0); + ExpectIntEQ(wolfSSL_UseMaxFragment(ssl_c, WOLFSSL_MFL_2_8), + WOLFSSL_SUCCESS); + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); +#ifndef NO_SESSION_CACHE + ExpectIntEQ(SSL_SESSION_get_max_fragment_length( + wolfSSL_get_session(ssl_c)), WOLFSSL_MFL_2_8); +#endif + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + } +#endif #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_UseTruncatedHMAC(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_TRUNCATED_HMAC) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; #ifndef NO_WOLFSSL_SERVER WOLFSSL_CTX* ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); #else @@ -9852,19 +11405,16 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_UseSupportedCurve(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_SUPPORTED_CURVES) && !defined(NO_WOLFSSL_CLIENT) && \ !defined(NO_TLS) - EXPECT_DECLS; WOLFSSL_CTX* ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); WOLFSSL *ssl = wolfSSL_new(ctx); @@ -9888,11 +11438,9 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(HAVE_ALPN) && defined(HAVE_IO_TESTS_DEPENDENCIES) @@ -10029,6 +11577,60 @@ AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_ALPN_FreePeerProtocol(ssl, &clist)); } +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY) + +/* ALPN select callback, success with spdy/2 */ +static int select_ALPN_spdy2(WOLFSSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) +{ + /* spdy/2 */ + const char proto[] = {0x73, 0x70, 0x64, 0x79, 0x2f, 0x32}; + + (void)ssl; + (void)arg; + + /* adding +1 since LEN byte comes first */ + if (inlen < sizeof(proto) + 1) { + return SSL_TLSEXT_ERR_ALERT_FATAL; + } + + if (XMEMCMP(in + 1, proto, sizeof(proto)) == 0) { + *out = in + 1; + *outlen = (unsigned char)sizeof(proto); + return SSL_TLSEXT_ERR_OK; + } + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} + +/* ALPN select callback, force failure */ +static int select_ALPN_failure(WOLFSSL *ssl, const unsigned char **out, + unsigned char *outlen, const unsigned char *in, + unsigned int inlen, void *arg) +{ + (void)ssl; + (void)out; + (void)outlen; + (void)in; + (void)inlen; + (void)arg; + + return SSL_TLSEXT_ERR_ALERT_FATAL; +} + +static void use_ALPN_spdy2_callback(WOLFSSL* ssl) +{ + wolfSSL_set_alpn_select_cb(ssl, select_ALPN_spdy2, NULL); +} + +static void use_ALPN_failure_callback(WOLFSSL* ssl) +{ + wolfSSL_set_alpn_select_cb(ssl, select_ALPN_failure, NULL); +} +#endif /* OPENSSL_ALL | NGINX | HAPROXY | LIGHTY | QUIC */ + static int test_wolfSSL_UseALPN_connection(void) { int res = TEST_SKIPPED; @@ -10084,6 +11686,30 @@ server_cb.ctx_ready = NULL; server_cb.ssl_ready = use_ALPN_unknown; server_cb.on_result = verify_ALPN_FATAL_ERROR_on_client; test_wolfSSL_client_server(&client_cb, &server_cb); +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_HAPROXY) || defined(HAVE_LIGHTY) + + /* WOLFSSL-level ALPN select callback tests */ + /* Callback: success (one protocol, spdy/2) */ + client_cb.ctx_ready = NULL; + client_cb.ssl_ready = use_ALPN_one; + client_cb.on_result = verify_ALPN_matching_spdy2; + server_cb.ctx_ready = NULL; + server_cb.ssl_ready = use_ALPN_spdy2_callback; + server_cb.on_result = verify_ALPN_matching_spdy2; + test_wolfSSL_client_server(&client_cb, &server_cb); + + /* Callback: failure (one client protocol, spdy/2) */ + client_cb.ctx_ready = NULL; + client_cb.ssl_ready = use_ALPN_one; + client_cb.on_result = NULL; + server_cb.ctx_ready = NULL; + server_cb.ssl_ready = use_ALPN_failure_callback; + server_cb.on_result = verify_ALPN_FATAL_ERROR_on_client; + test_wolfSSL_client_server(&client_cb, &server_cb); + +#endif /* OPENSSL_ALL | NGINX | HAPROXY | LIGHTY */ + res = TEST_RES_CHECK(1); #endif /* !NO_WOLFSSL_CLIENT && !NO_WOLFSSL_SERVER */ return res; @@ -10091,9 +11717,8 @@ static int test_wolfSSL_UseALPN_params(void) { - int res = TEST_SKIPPED; -#ifndef NO_WOLFSSL_CLIENT EXPECT_DECLS; +#ifndef NO_WOLFSSL_CLIENT /* "http/1.1" */ char http1[] = {0x68, 0x74, 0x74, 0x70, 0x2f, 0x31, 0x2e, 0x31}; /* "spdy/1" */ @@ -10162,10 +11787,8 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #endif /* HAVE_ALPN */ @@ -10273,9 +11896,8 @@ static int test_wolfSSL_DisableExtendedMasterSecret(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT) EXPECT_DECLS; +#if defined(HAVE_EXTENDED_MASTER) && !defined(NO_WOLFSSL_CLIENT) WOLFSSL_CTX *ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); WOLFSSL *ssl = wolfSSL_new(ctx); @@ -10292,17 +11914,14 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_wolfSSL_UseSecureRenegotiation(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_SECURE_RENEGOTIATION) && !defined(NO_WOLFSSL_CLIENT) EXPECT_DECLS; +#if defined(HAVE_SECURE_RENEGOTIATION) && !defined(NO_WOLFSSL_CLIENT) WOLFSSL_CTX *ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); WOLFSSL *ssl = wolfSSL_new(ctx); @@ -10319,21 +11938,18 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* Test reconnecting with a different ciphersuite after a renegotiation. */ static int test_wolfSSL_SCR_Reconnect(void) { - int res = TEST_SKIPPED; - + EXPECT_DECLS; #if defined(HAVE_SECURE_RENEGOTIATION) && \ defined(BUILD_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) && \ - defined(BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256) - EXPECT_DECLS; + defined(BUILD_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256) && \ + defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) struct test_memio_ctx test_ctx; WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; WOLFSSL *ssl_c = NULL, *ssl_s = NULL; @@ -10372,10 +11988,8 @@ wolfSSL_free(ssl_c); wolfSSL_CTX_free(ctx_s); wolfSSL_CTX_free(ctx_c); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_SERVER) && \ @@ -10418,10 +12032,9 @@ */ static int test_tls_ext_duplicate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_WOLFSSL_SERVER) && (!defined(NO_RSA) || defined(HAVE_ECC)) && \ !defined(NO_FILESYSTEM) - EXPECT_DECLS; const unsigned char clientHelloDupTlsExt[] = { 0x16, 0x03, 0x03, 0x00, 0x6a, 0x01, 0x00, 0x00, 0x66, 0x03, 0x03, 0xf4, 0x65, 0xbd, 0x22, 0xfe, @@ -10484,10 +12097,8 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /*----------------------------------------------------------------------------* @@ -10495,21 +12106,20 @@ *----------------------------------------------------------------------------*/ static int test_wolfSSL_X509_NAME_get_entry(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_RSA) #if defined(OPENSSL_ALL) || \ (defined(OPENSSL_EXTRA) && \ (defined(KEEP_PEER_CERT) || defined(SESSION_CERTS))) - EXPECT_DECLS; /* use openssl like name to test mapping */ - X509_NAME_ENTRY* ne; - X509_NAME* name; + X509_NAME_ENTRY* ne = NULL; + X509_NAME* name = NULL; X509* x509 = NULL; #ifndef NO_FILESYSTEM - ASN1_STRING* asn; + ASN1_STRING* asn = NULL; char* subCN = NULL; #endif - int idx; + int idx = 0; ASN1_OBJECT *object = NULL; #if defined(WOLFSSL_APACHE_HTTPD) || defined(OPENSSL_ALL) || \ defined(WOLFSSL_NGINX) @@ -10550,27 +12160,25 @@ ExpectNotNull(ne = X509_NAME_get_entry(name, idx)); ExpectNotNull(object = X509_NAME_ENTRY_get_object(ne)); wolfSSL_FreeX509(x509); - - res = EXPECT_RESULT(); #endif /* OPENSSL_ALL || (OPENSSL_EXTRA && (KEEP_PEER_CERT || SESSION_CERTS) */ #endif /* !NO_CERTS && !NO_RSA */ - return res; + return EXPECT_RESULT(); } /* Testing functions dealing with PKCS12 parsing out X509 certs */ static int test_wolfSSL_PKCS12(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; /* .p12 file is encrypted with DES3 */ #ifndef HAVE_FIPS /* Password used in cert "wolfSSL test" is only 12-bytes * (96-bit) FIPS mode requires Minimum of 14-byte (112-bit) * Password Key */ #if defined(OPENSSL_EXTRA) && !defined(NO_DES3) && !defined(NO_FILESYSTEM) && \ + !defined(NO_STDIO_FILESYSTEM) && \ !defined(NO_ASN) && !defined(NO_PWDBASED) && !defined(NO_RSA) && \ !defined(NO_SHA) && defined(HAVE_PKCS12) && !defined(NO_BIO) - EXPECT_DECLS; byte buf[6000]; char file[] = "./certs/test-servercert.p12"; char order[] = "./certs/ecc-rsa-server.p12"; @@ -10585,7 +12193,7 @@ WOLFSSL_X509 *x509 = NULL; #endif XFILE f = XBADFILE; - int bytes, ret, goodPswLen, badPswLen; + int bytes = 0, ret = 0, goodPswLen = 0, badPswLen = 0; WOLFSSL_BIO *bio = NULL; WOLFSSL_EVP_PKEY *pkey = NULL; WC_PKCS12 *pkcs12 = NULL; @@ -10827,6 +12435,16 @@ ExpectIntEQ(wolfSSL_X509_NAME_cmp((const WOLFSSL_X509_NAME*)subject, (const WOLFSSL_X509_NAME*)wolfSSL_X509_get_subject_name(x509)), 0); + /* modify case and compare subject from certificate in ca to expected. + * The first bit of the name is: + * /C=US/ST=Washington + * So we'll change subject->name[1] to 'c' (lower case) */ + if (subject != NULL) { + subject->name[1] = 'c'; + ExpectIntEQ(wolfSSL_X509_NAME_cmp((const WOLFSSL_X509_NAME*)subject, + (const WOLFSSL_X509_NAME*)wolfSSL_X509_get_subject_name(x509)), 0); + } + EVP_PKEY_free(pkey); pkey = NULL; X509_free(x509); @@ -10899,7 +12517,7 @@ ExpectNull(pkey); ExpectNull(cert); - /* check parse iwth not extra certs kept */ + /* check parse with not extra certs kept */ ExpectIntEQ(ret = PKCS12_parse(pkcs12, "wolfSSL test", &pkey, &cert, NULL), WOLFSSL_SUCCESS); ExpectNotNull(pkey); @@ -10912,7 +12530,7 @@ /* check parse with extra certs kept */ ExpectIntEQ(ret = PKCS12_parse(pkcs12, "wolfSSL test", &pkey, &cert, &ca), - WOLFSSL_SUCCESS);; + WOLFSSL_SUCCESS); ExpectNotNull(pkey); ExpectNotNull(cert); ExpectNotNull(ca); @@ -10945,11 +12563,9 @@ BIO_free(bio); (void)order; - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ #endif /* HAVE_FIPS */ - return res; + return EXPECT_RESULT(); } @@ -10981,16 +12597,15 @@ static int test_wolfSSL_no_password_cb(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_ASN) && defined(HAVE_PKCS8) \ && defined(HAVE_ECC) && defined(WOLFSSL_ENCRYPTED_KEYS) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; byte buff[FOURK_BUF]; const char eccPkcs8PrivKeyDerFile[] = "./certs/ecc-privkeyPkcs8.der"; const char eccPkcs8PrivKeyPemFile[] = "./certs/ecc-privkeyPkcs8.pem"; XFILE f = XBADFILE; - int bytes; + int bytes = 0; #ifndef NO_WOLFSSL_CLIENT ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLS_client_method())); @@ -11021,10 +12636,8 @@ /* Password callback should not be called by default */ ExpectIntEQ(failTestCallbackCalled, 0); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #ifdef TEST_PKCS8_ENC @@ -11054,11 +12667,10 @@ /* Testing functions dealing with PKCS8 */ static int test_wolfSSL_PKCS8(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_ASN) && defined(HAVE_PKCS8) && \ !defined(WOLFCRYPT_ONLY) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; byte buff[FOURK_BUF]; byte der[FOURK_BUF]; #ifndef NO_RSA @@ -11072,7 +12684,7 @@ XFILE f = XBADFILE; int bytes = 0; WOLFSSL_CTX* ctx = NULL; -#if defined(HAVE_ECC) && !defined(NO_CODING) +#if defined(HAVE_ECC) && !defined(NO_CODING) && !defined(WOLFSSL_NO_PEM) int ret; ecc_key key; word32 x = 0; @@ -11232,13 +12844,13 @@ ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_buffer(ctx, buff, bytes, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); -#ifndef NO_CODING +#if !defined(NO_CODING) && !defined(WOLFSSL_NO_PEM) /* decrypt PKCS8 PEM to key in DER format */ ExpectIntGT((bytes = wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), NULL)), 0); ret = wc_ecc_init(&key); if (ret == 0) { - ret = wc_EccPrivateKeyDecode(der, &x, &key, bytes); + ret = wc_EccPrivateKeyDecode(der, &x, &key, (word32)bytes); wc_ecc_free(&key); } ExpectIntEQ(ret, 0); @@ -11260,20 +12872,17 @@ #endif /* HAVE_ECC */ wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif /* !NO_FILESYSTEM && !NO_ASN && HAVE_PKCS8 */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PKCS8_ED25519(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && defined(HAVE_PKCS8) && defined(HAVE_AES_CBC) && \ defined(WOLFSSL_ENCRYPTED_KEYS) && defined(HAVE_ED25519) && \ defined(HAVE_ED25519_KEY_IMPORT) - EXPECT_DECLS; const byte encPrivKey[] = \ "-----BEGIN ENCRYPTED PRIVATE KEY-----\n" "MIGbMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAheCGLmWGh7+AICCAAw\n" @@ -11299,20 +12908,17 @@ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PKCS8_ED448(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && defined(HAVE_PKCS8) && defined(HAVE_AES_CBC) && \ defined(WOLFSSL_ENCRYPTED_KEYS) && defined(HAVE_ED448) && \ defined(HAVE_ED448_KEY_IMPORT) - EXPECT_DECLS; const byte encPrivKey[] = \ "-----BEGIN ENCRYPTED PRIVATE KEY-----\n" "MIGrMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAjSbZKnG4EPggICCAAw\n" @@ -11338,19 +12944,16 @@ WOLFSSL_FILETYPE_ASN1), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif - return res; + return EXPECT_RESULT(); } /* Testing functions dealing with PKCS5 */ static int test_wolfSSL_PKCS5(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA) && !defined(NO_PWDBASED) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA) && !defined(NO_PWDBASED) #ifdef HAVE_FIPS /* Password minimum length is 14 (112-bit) in FIPS MODE */ const char* passwd = "myfipsPa$$W0rd"; #else @@ -11373,20 +12976,17 @@ #endif XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_SHA) */ - return res; + return EXPECT_RESULT(); } /* test parsing URI from certificate */ static int test_wolfSSL_URI(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) \ && (defined(KEEP_PEER_CERT) || defined(SESSION_CERTS) || \ defined(OPENSSL_EXTRA)) - EXPECT_DECLS; WOLFSSL_X509* x509 = NULL; const char uri[] = "./certs/client-uri-cert.pem"; const char urn[] = "./certs/client-absolute-urn.pem"; @@ -11411,19 +13011,16 @@ WOLFSSL_FILETYPE_PEM)); #endif wolfSSL_FreeX509(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_TBS(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) \ && defined(OPENSSL_EXTRA) - EXPECT_DECLS; WOLFSSL_X509* x509 = NULL; const unsigned char* tbs; int tbsSz; @@ -11437,18 +13034,15 @@ ExpectIntEQ(tbsSz, 1003); wolfSSL_FreeX509(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_verify(void) { - int res = TEST_SKIPPED; -#if !defined(NO_CERTS) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) \ - && defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if !defined(NO_CERTS) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) && \ + defined(OPENSSL_EXTRA) WOLFSSL_X509* ca = NULL; WOLFSSL_X509* serv = NULL; WOLFSSL_EVP_PKEY* pkey = NULL; @@ -11456,24 +13050,24 @@ const unsigned char* pt = NULL; int bufSz; - ExpectNotNull(ca = - wolfSSL_X509_load_certificate_file(caCertFile, WOLFSSL_FILETYPE_PEM)); + ExpectNotNull(ca = wolfSSL_X509_load_certificate_file(caCertFile, + WOLFSSL_FILETYPE_PEM)); ExpectIntNE(wolfSSL_X509_get_pubkey_buffer(NULL, buf, &bufSz), - WOLFSSL_SUCCESS); + WOLFSSL_SUCCESS); ExpectIntEQ(wolfSSL_X509_get_pubkey_buffer(ca, NULL, &bufSz), - WOLFSSL_SUCCESS); + WOLFSSL_SUCCESS); ExpectIntEQ(bufSz, 294); bufSz = 2048; ExpectIntEQ(wolfSSL_X509_get_pubkey_buffer(ca, buf, &bufSz), - WOLFSSL_SUCCESS); + WOLFSSL_SUCCESS); ExpectIntEQ(wolfSSL_X509_get_pubkey_type(NULL), WOLFSSL_FAILURE); ExpectIntEQ(wolfSSL_X509_get_pubkey_type(ca), RSAk); - ExpectNotNull(serv = - wolfSSL_X509_load_certificate_file(svrCertFile, WOLFSSL_FILETYPE_PEM)); + ExpectNotNull(serv = wolfSSL_X509_load_certificate_file(svrCertFile, + WOLFSSL_FILETYPE_PEM)); /* success case */ pt = buf; @@ -11488,7 +13082,7 @@ /* fail case */ bufSz = 2048; ExpectIntEQ(wolfSSL_X509_get_pubkey_buffer(serv, buf, &bufSz), - WOLFSSL_SUCCESS); + WOLFSSL_SUCCESS); pt = buf; ExpectNotNull(pkey = wolfSSL_d2i_PUBKEY(NULL, &pt, bufSz)); ExpectIntEQ(wolfSSL_X509_verify(serv, pkey), WOLFSSL_FAILURE); @@ -11499,10 +13093,8 @@ wolfSSL_FreeX509(ca); wolfSSL_FreeX509(serv); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } @@ -11600,11 +13192,10 @@ static int test_wolfSSL_X509_TLS_version_test_1(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DH) && !defined(NO_AES) && defined(WOLFSSL_CERT_GEN) && \ defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) - EXPECT_DECLS; test_ssl_cbf func_cb_client; test_ssl_cbf func_cb_server; @@ -11632,25 +13223,22 @@ ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, &func_cb_server, NULL), TEST_SUCCESS); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_TLS_version_test_2(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DH) && !defined(NO_AES) && defined(WOLFSSL_CERT_GEN) && \ defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) - EXPECT_DECLS; test_ssl_cbf func_cb_client; test_ssl_cbf func_cb_server; - XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); - XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); func_cb_client.ctx_ready = &test_set_x509_badversion; func_cb_server.ctx_ready = &test_set_override_x509; @@ -11668,11 +13256,9 @@ ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, &func_cb_server, NULL), TEST_SUCCESS); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* Testing function wolfSSL_CTX_SetMinVersion; sets the minimum downgrade @@ -11732,10 +13318,9 @@ */ static int test_wolfSSL_UseOCSPStapling(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) && defined(HAVE_OCSP) && \ !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; @@ -11766,11 +13351,9 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; -} /*END test_wolfSSL_UseOCSPStapling */ + return EXPECT_RESULT(); +} /* END test_wolfSSL_UseOCSPStapling */ /* Testing OCSP stapling version 2, wolfSSL_UseOCSPStaplingV2 function. OCSP @@ -11780,10 +13363,9 @@ */ static int test_wolfSSL_UseOCSPStaplingV2(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) && defined(HAVE_OCSP) && \ !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; @@ -11814,10 +13396,8 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* END test_wolfSSL_UseOCSPStaplingV2 */ @@ -11826,10 +13406,9 @@ *----------------------------------------------------------------------------*/ static int test_wolfSSL_mcast(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_DTLS) && defined(WOLFSSL_MULTICAST) && \ (defined(WOLFSSL_TLS13) || defined(WOLFSSL_SNIFFER)) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; byte preMasterSecret[512]; @@ -11857,11 +13436,9 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* WOLFSSL_DTLS && WOLFSSL_MULTICAST && (WOLFSSL_TLS13 || * WOLFSSL_SNIFFER) */ - return res; + return EXPECT_RESULT(); } @@ -11874,186 +13451,89 @@ */ static int test_wc_InitBlake2b(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_BLAKE2 Blake2b blake; - int ret = 0; /* Test good arg. */ - ret = wc_InitBlake2b(&blake, 64); - if (ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitBlake2b(&blake, 64), 0); /* Test bad arg. */ - if (!ret) { - ret = wc_InitBlake2b(NULL, 64); - if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } - - if (!ret) { - ret = wc_InitBlake2b(NULL, 128); - if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } - - if (!ret) { - ret = wc_InitBlake2b(&blake, 128); - if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } - - if (!ret) { - ret = wc_InitBlake2b(NULL, 0); - if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } - - if (!ret) { - ret = wc_InitBlake2b(&blake, 0); - if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } - - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_InitBlake2b(NULL, 64), BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2b(NULL, 128), BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2b(&blake, 128), BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2b(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2b(&blake, 0), BAD_FUNC_ARG); #endif - return res; -} /*END test_wc_InitBlake2b*/ + return EXPECT_RESULT(); +} /* END test_wc_InitBlake2b*/ /* * Unit test for the wc_InitBlake2b_WithKey() */ static int test_wc_InitBlake2b_WithKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_BLAKE2 Blake2b blake; word32 digestSz = BLAKE2B_KEYBYTES; byte key[BLAKE2B_KEYBYTES]; word32 keylen = BLAKE2B_KEYBYTES; - int ret = 0; XMEMSET(key, 0, sizeof(key)); /* Test good arg. */ - ret = wc_InitBlake2b_WithKey(&blake, digestSz, key, keylen); - if (ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_InitBlake2b_WithKey(&blake, digestSz, key, keylen), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_InitBlake2b_WithKey(NULL, digestSz, key, keylen); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_InitBlake2b_WithKey(&blake, digestSz, key, 256); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_InitBlake2b_WithKey(&blake, digestSz, NULL, keylen); - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_InitBlake2b_WithKey(NULL, digestSz, key, keylen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2b_WithKey(&blake, digestSz, key, 256), + BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2b_WithKey(&blake, digestSz, NULL, keylen), 0); #endif - return res; -} /*END wc_InitBlake2b_WithKey*/ + return EXPECT_RESULT(); +} /* END wc_InitBlake2b_WithKey*/ /* * Unit test for the wc_InitBlake2s_WithKey() */ static int test_wc_InitBlake2s_WithKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_BLAKE2S Blake2s blake; word32 digestSz = BLAKE2S_KEYBYTES; byte *key = (byte*)"01234567890123456789012345678901"; word32 keylen = BLAKE2S_KEYBYTES; - int ret = 0; /* Test good arg. */ - ret = wc_InitBlake2s_WithKey(&blake, digestSz, key, keylen); - if (ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_InitBlake2s_WithKey(&blake, digestSz, key, keylen), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_InitBlake2s_WithKey(NULL, digestSz, key, keylen); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_InitBlake2s_WithKey(&blake, digestSz, key, 256); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_InitBlake2s_WithKey(&blake, digestSz, NULL, keylen); - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_InitBlake2s_WithKey(NULL, digestSz, key, keylen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2s_WithKey(&blake, digestSz, key, 256), + BAD_FUNC_ARG); + ExpectIntEQ(wc_InitBlake2s_WithKey(&blake, digestSz, NULL, keylen), 0); #endif - return res; -} /*END wc_InitBlake2s_WithKey*/ + return EXPECT_RESULT(); +} /* END wc_InitBlake2s_WithKey*/ /* * Unit test for the wc_InitMd5() */ static int test_wc_InitMd5(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_MD5 wc_Md5 md5; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitMd5(&md5); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitMd5(&md5), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitMd5(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitMd5(NULL), BAD_FUNC_ARG); wc_Md5Free(&md5); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_InitMd5 */ @@ -12062,97 +13542,44 @@ */ static int test_wc_Md5Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_MD5 wc_Md5 md5; byte hash[WC_MD5_DIGEST_SIZE]; testVector a, b, c; - int ret; - int flag = 0; - ret = wc_InitMd5(&md5); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitMd5(&md5), 0); /* Input */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_Md5Update(&md5, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Md5Final(&md5, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_Md5Update(&md5, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Md5Final(&md5, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\x90\x01\x50\x98\x3c\xd2\x4f\xb0\xd6\x96\x3f\x7d\x28\xe1\x7f" - "\x72"; - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_Md5Update(&md5, (byte*) a.input, (word32) a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Md5Final(&md5, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_MD5_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - /*Pass in bad values. */ - if (!flag) { - b.input = NULL; - b.inLen = 0; - - ret = wc_Md5Update(&md5, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_MD5_DIGEST_SIZE; - - ret = wc_Md5Update(&md5, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + a.input = "abc"; + a.output = "\x90\x01\x50\x98\x3c\xd2\x4f\xb0\xd6\x96\x3f\x7d\x28\xe1\x7f" + "\x72"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_Md5Update(&md5, (byte*) a.input, (word32) a.inLen), 0); + ExpectIntEQ(wc_Md5Final(&md5, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_MD5_DIGEST_SIZE), 0); - if (!flag) { - ret = wc_Md5Update(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + /* Pass in bad values. */ + b.input = NULL; + b.inLen = 0; + ExpectIntEQ(wc_Md5Update(&md5, (byte*)b.input, (word32)b.inLen), 0); + c.input = NULL; + c.inLen = WC_MD5_DIGEST_SIZE; + ExpectIntEQ(wc_Md5Update(&md5, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Md5Update(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_Md5Free(&md5); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Md5Update() */ @@ -12161,7 +13588,7 @@ */ static int test_wc_Md5Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_MD5 /* Instantiate */ wc_Md5 md5; @@ -12169,59 +13596,27 @@ byte hash1[WC_MD5_DIGEST_SIZE]; byte hash2[2*WC_MD5_DIGEST_SIZE]; byte hash3[5*WC_MD5_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitMd5(&md5); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitMd5(&md5), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test)/sizeof(byte*); - for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Md5Final(&md5, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Md5Final(&md5, hash_test[i]), 0); } /* Test bad args. */ - if (!flag) { - ret = wc_Md5Final(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Md5Final(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Md5Final(&md5, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Md5Final(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Md5Final(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Md5Final(&md5, NULL), BAD_FUNC_ARG); wc_Md5Free(&md5); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* @@ -12229,32 +13624,18 @@ */ static int test_wc_InitSha(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA wc_Sha sha; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitSha(&sha); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitSha(&sha), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitSha(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitSha(NULL), BAD_FUNC_ARG); wc_ShaFree(&sha); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_InitSha */ /* @@ -12262,108 +13643,48 @@ */ static int test_wc_ShaUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA wc_Sha sha; byte hash[WC_SHA_DIGEST_SIZE]; testVector a, b, c; - int flag = 0; - int ret; - ret = wc_InitSha(&sha); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitSha(&sha), 0); /* Input. */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_ShaUpdate(&sha, NULL, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_ShaUpdate(&sha, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_ShaUpdate(&sha, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); - if (!flag) { - ret = wc_ShaFinal(&sha, hash); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_ShaUpdate(&sha, NULL, 0), 0); + ExpectIntEQ(wc_ShaUpdate(&sha, (byte*)a.input, 0), 0); + ExpectIntEQ(wc_ShaUpdate(&sha, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_ShaFinal(&sha, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2" - "\x6C\x9C\xD0\xD8\x9D"; - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_ShaUpdate(&sha, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_ShaFinal(&sha, hash); - if (ret !=0) { - flag = ret; - } - } + a.input = "abc"; + a.output = "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E\x25\x71\x78\x50\xC2" + "\x6C\x9C\xD0\xD8\x9D"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ShaUpdate(&sha, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_ShaFinal(&sha, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA_DIGEST_SIZE), 0); /* Try passing in bad values. */ - if (!flag) { - b.input = NULL; - b.inLen = 0; - - ret = wc_ShaUpdate(&sha, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_SHA_DIGEST_SIZE; - - ret = wc_ShaUpdate(&sha, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_ShaUpdate(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + b.input = NULL; + b.inLen = 0; + ExpectIntEQ(wc_ShaUpdate(&sha, (byte*)b.input, (word32)b.inLen), 0); + c.input = NULL; + c.inLen = WC_SHA_DIGEST_SIZE; + ExpectIntEQ(wc_ShaUpdate(&sha, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ShaUpdate(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_ShaFree(&sha); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_ShaUpdate() */ @@ -12372,66 +13693,34 @@ */ static int test_wc_ShaFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA wc_Sha sha; byte* hash_test[3]; byte hash1[WC_SHA_DIGEST_SIZE]; byte hash2[2*WC_SHA_DIGEST_SIZE]; byte hash3[5*WC_SHA_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; - - /*Initialize*/ - ret = wc_InitSha(&sha); - if (ret) { - flag = ret; - } + int times, i; - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + /* Initialize*/ + ExpectIntEQ(wc_InitSha(&sha), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test)/sizeof(byte*); - for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_ShaFinal(&sha, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ShaFinal(&sha, hash_test[i]), 0); } /* Test bad args. */ - if (!flag) { - ret = wc_ShaFinal(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_ShaFinal(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_ShaFinal(&sha, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ShaFinal(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ShaFinal(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_ShaFinal(&sha, NULL), BAD_FUNC_ARG); wc_ShaFree(&sha); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ShaFinal */ @@ -12440,31 +13729,18 @@ */ static int test_wc_InitSha256(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA256 wc_Sha256 sha256; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitSha256(&sha256); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitSha256(&sha256), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitSha256(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitSha256(NULL), BAD_FUNC_ARG); wc_Sha256Free(&sha256); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_InitSha256 */ @@ -12473,109 +13749,53 @@ */ static int test_wc_Sha256Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA256 wc_Sha256 sha256; byte hash[WC_SHA256_DIGEST_SIZE]; + byte hash_unaligned[WC_SHA256_DIGEST_SIZE+1]; testVector a, b, c; - int ret; - int flag = 0; - ret = wc_InitSha256(&sha256); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitSha256(&sha256), 0); /* Input. */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_Sha256Update(&sha256, NULL, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha256Update(&sha256, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha256Update(&sha256, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha256Final(&sha256, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_Sha256Update(&sha256, NULL, 0), 0); + ExpectIntEQ(wc_Sha256Update(&sha256, (byte*)a.input, 0), 0); + ExpectIntEQ(wc_Sha256Update(&sha256, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Sha256Final(&sha256, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22" - "\x23\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00" - "\x15\xAD"; - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_Sha256Update(&sha256, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha256Final(&sha256, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "abc"; + a.output = "\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22" + "\x23\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00" + "\x15\xAD"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_Sha256Update(&sha256, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Sha256Final(&sha256, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA256_DIGEST_SIZE), 0); - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA256_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + /* Unaligned check. */ + ExpectIntEQ(wc_Sha256Update(&sha256, (byte*)a.input+1, (word32)a.inLen-1), + 0); + ExpectIntEQ(wc_Sha256Final(&sha256, hash_unaligned + 1), 0); /* Try passing in bad values */ - if (!flag) { - b.input = NULL; - b.inLen = 0; - - ret = wc_Sha256Update(&sha256, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_SHA256_DIGEST_SIZE; - - ret = wc_Sha256Update(&sha256, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha256Update(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + b.input = NULL; + b.inLen = 0; + ExpectIntEQ(wc_Sha256Update(&sha256, (byte*)b.input, (word32)b.inLen), 0); + c.input = NULL; + c.inLen = WC_SHA256_DIGEST_SIZE; + ExpectIntEQ(wc_Sha256Update(&sha256, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256Update(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_Sha256Free(&sha256); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha256Update */ @@ -12584,74 +13804,41 @@ */ static int test_wc_Sha256Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA256 wc_Sha256 sha256; byte* hash_test[3]; byte hash1[WC_SHA256_DIGEST_SIZE]; byte hash2[2*WC_SHA256_DIGEST_SIZE]; byte hash3[5*WC_SHA256_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitSha256(&sha256); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitSha256(&sha256), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte*); - for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Sha256Final(&sha256, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha256Final(&sha256, hash_test[i]), 0); } /* Test bad args. */ - if (!flag ) { - ret = wc_Sha256Final(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha256Final(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha256Final(&sha256, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha256Final(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256Final(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256Final(&sha256, NULL), BAD_FUNC_ARG); wc_Sha256Free(&sha256); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha256Final */ /* * Unit test function for wc_Sha256FinalRaw() */ static int test_wc_Sha256FinalRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_SHA256) && !defined(HAVE_SELFTEST) && !defined(WOLFSSL_DEVCRYPTO) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 3))) && \ !defined(WOLFSSL_NO_HASH_RAW) @@ -12660,59 +13847,27 @@ byte hash1[WC_SHA256_DIGEST_SIZE]; byte hash2[2*WC_SHA256_DIGEST_SIZE]; byte hash3[5*WC_SHA256_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitSha256(&sha256); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitSha256(&sha256), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte*); - for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Sha256FinalRaw(&sha256, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha256FinalRaw(&sha256, hash_test[i]), 0); } /* Test bad args. */ - if (!flag) { - ret = wc_Sha256FinalRaw(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha256FinalRaw(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha256FinalRaw(&sha256, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha256FinalRaw(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256FinalRaw(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256FinalRaw(&sha256, NULL), BAD_FUNC_ARG); wc_Sha256Free(&sha256); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha256FinalRaw */ /* @@ -12720,28 +13875,20 @@ */ static int test_wc_Sha256GetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_SHA256) && defined(WOLFSSL_HASH_FLAGS) wc_Sha256 sha256; word32 flags = 0; - int flag = 0; /* Initialize */ - flag = wc_InitSha256(&sha256); - if (flag == 0) { - flag = wc_Sha256GetFlags(&sha256, &flags); - } - if (flag == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha256(&sha256), 0); - wc_Sha256Free(&sha256); + ExpectIntEQ(wc_Sha256GetFlags(&sha256, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); - res = TEST_RES_CHECK(flag == 0); + wc_Sha256Free(&sha256); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha256GetFlags */ /* @@ -12749,136 +13896,84 @@ */ static int test_wc_Sha256Free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA256 wc_Sha256Free(NULL); - - res = TEST_RES_CHECK(1); + /* Set result to SUCCESS. */ + ExpectTrue(1); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha256Free */ /* * Unit test function for wc_Sha256GetHash() */ static int test_wc_Sha256GetHash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA256 wc_Sha256 sha256; byte hash1[WC_SHA256_DIGEST_SIZE]; - int flag = 0; /* Initialize */ - flag = wc_InitSha256(&sha256); + ExpectIntEQ(wc_InitSha256(&sha256), 0); - if (flag == 0) { - flag = wc_Sha256GetHash(&sha256, hash1); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha256GetHash(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha256GetHash(NULL, hash1); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha256GetHash(&sha256, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_Sha256GetHash(&sha256, hash1), 0); - wc_Sha256Free(&sha256); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha256GetHash(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256GetHash(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256GetHash(&sha256, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(flag == 0); + wc_Sha256Free(&sha256); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha256GetHash */ /* * Unit test function for wc_Sha256Copy() */ static int test_wc_Sha256Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_SHA256 wc_Sha256 sha256; wc_Sha256 temp; - int flag = 0; + + XMEMSET(&sha256, 0, sizeof(sha256)); + XMEMSET(&temp, 0, sizeof(temp)); /* Initialize */ - flag = wc_InitSha256(&sha256); - if (flag == 0) { - flag = wc_InitSha256(&temp); - } - if (flag == 0) { - flag = wc_Sha256Copy(&sha256, &temp); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha256Copy(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha256Copy(NULL, &temp); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha256Copy(&sha256, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha256(&sha256), 0); + ExpectIntEQ(wc_InitSha256(&temp), 0); + + ExpectIntEQ(wc_Sha256Copy(&sha256, &temp), 0); + + /* test bad arguments*/ + ExpectIntEQ(wc_Sha256Copy(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256Copy(NULL, &temp), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256Copy(&sha256, NULL), BAD_FUNC_ARG); wc_Sha256Free(&sha256); wc_Sha256Free(&temp); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha256Copy */ /* * Testing wc_InitSha512() */ static int test_wc_InitSha512(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA512 wc_Sha512 sha512; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitSha512(&sha512); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitSha512(&sha512), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitSha512(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitSha512(NULL), BAD_FUNC_ARG); wc_Sha512Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_InitSha512 */ @@ -12887,115 +13982,63 @@ */ static int test_wc_Sha512Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA512 wc_Sha512 sha512; byte hash[WC_SHA512_DIGEST_SIZE]; + byte hash_unaligned[WC_SHA512_DIGEST_SIZE + 1]; testVector a, b, c; - int ret; - int flag = 0; - ret = wc_InitSha512(&sha512); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitSha512(&sha512), 0); /* Input. */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_Sha512Update(&sha512, NULL, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512Update(&sha512,(byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512Update(&sha512, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512Final(&sha512, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_Sha512Update(&sha512, NULL, 0), 0); + ExpectIntEQ(wc_Sha512Update(&sha512,(byte*)a.input, 0), 0); + ExpectIntEQ(wc_Sha512Update(&sha512, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Sha512Final(&sha512, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41" - "\x31\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b" - "\x55\xd3\x9a\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c" - "\x23\xa3\xfe\xeb\xbd\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a" - "\x9a\xc9\x4f\xa5\x4c\xa4\x9f"; - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_Sha512Update(&sha512, (byte*) a.input, (word32) a.inLen); - if (ret != 0) { - flag = ret; - } - } + a.input = "abc"; + a.output = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41" + "\x31\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b" + "\x55\xd3\x9a\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c" + "\x23\xa3\xfe\xeb\xbd\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a" + "\x9a\xc9\x4f\xa5\x4c\xa4\x9f"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_Sha512Update(&sha512, (byte*) a.input, (word32) a.inLen), 0); + ExpectIntEQ(wc_Sha512Final(&sha512, hash), 0); - if (!flag) { - ret = wc_Sha512Final(&sha512, hash); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA512_DIGEST_SIZE), 0); - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA512_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + /* Unaligned check. */ + ExpectIntEQ(wc_Sha512Update(&sha512, (byte*)a.input+1, (word32)a.inLen-1), + 0); + ExpectIntEQ(wc_Sha512Final(&sha512, hash_unaligned+1), 0); /* Try passing in bad values */ - if (!flag) { - b.input = NULL; - b.inLen = 0; - - ret = wc_Sha512Update(&sha512, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_SHA512_DIGEST_SIZE; - - ret = wc_Sha512Update(&sha512, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha512Update(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + b.input = NULL; + b.inLen = 0; + ExpectIntEQ(wc_Sha512Update(&sha512, (byte*)b.input, (word32)b.inLen), 0); + c.input = NULL; + c.inLen = WC_SHA512_DIGEST_SIZE; + ExpectIntEQ(wc_Sha512Update(&sha512, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512Update(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_Sha512Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha512Update */ #ifdef WOLFSSL_SHA512 #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \ (!defined(WOLFSSL_NOSHA512_224) || !defined(WOLFSSL_NOSHA512_256)) -/* Perfoms test for +/* Performs test for * - wc_Sha512Final/wc_Sha512FinalRaw * - wc_Sha512_224Final/wc_Sha512_224Final * - wc_Sha512_256Final/wc_Sha512_256Final @@ -13007,12 +14050,13 @@ */ static int test_Sha512_Family_Final(int type, int isRaw) { + EXPECT_DECLS; wc_Sha512 sha512; byte* hash_test[3]; byte hash1[WC_SHA512_DIGEST_SIZE]; byte hash2[2*WC_SHA512_DIGEST_SIZE]; byte hash3[5*WC_SHA512_DIGEST_SIZE]; - int times, i, ret; + int times, i; int(*initFp)(wc_Sha512*); int(*finalFp)(wc_Sha512*, byte*); @@ -13056,41 +14100,25 @@ return TEST_FAIL; /* Initialize */ - ret = initFp(&sha512); - - if (!ret) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(initFp(&sha512), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte *); /* Good test args. */ - for (i = 0; i < times && ret == 0; i++) { - ret = finalFp(&sha512, hash_test[i]); + for (i = 0; i < times; i++) { + ExpectIntEQ(finalFp(&sha512, hash_test[i]), 0); } /* Test bad args. */ - if (!ret) { - if (finalFp(NULL, NULL) != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (!ret) { - if (finalFp(NULL, hash1) != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (!ret) { - if (finalFp(&sha512, NULL) != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(finalFp(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(finalFp(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(finalFp(&sha512, NULL), BAD_FUNC_ARG); freeFp(&sha512); - return ret; + return EXPECT_RESULT(); } #endif /* !HAVE_FIPS && !HAVE_SELFTEST && (!WOLFSSL_NOSHA512_224 || !WOLFSSL_NOSHA512_256) */ @@ -13100,100 +14128,61 @@ */ static int test_wc_Sha512Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA512 wc_Sha512 sha512; byte* hash_test[3]; byte hash1[WC_SHA512_DIGEST_SIZE]; byte hash2[2*WC_SHA512_DIGEST_SIZE]; byte hash3[5*WC_SHA512_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitSha512(&sha512); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitSha512(&sha512), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte *); - for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Sha512Final(&sha512, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } - } - /* Test bad args. */ - if (!flag) { - ret = wc_Sha512Final(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha512Final(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_Sha512Final(&sha512, hash_test[i]), 0); } - if (!flag) { - ret = wc_Sha512Final(&sha512, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + /* Test bad args. */ + ExpectIntEQ(wc_Sha512Final(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512Final(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512Final(&sha512, NULL), BAD_FUNC_ARG); wc_Sha512Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha512Final */ /* * Unit test function for wc_Sha512GetFlags() */ static int test_wc_Sha512GetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA512) && defined(WOLFSSL_HASH_FLAGS) wc_Sha512 sha512; word32 flags = 0; - int flag = 0; /* Initialize */ - flag = wc_InitSha512(&sha512); - if (flag == 0) { - flag = wc_Sha512GetFlags(&sha512, &flags); - } - if (flag == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha512(&sha512), 0); - wc_Sha512Free(&sha512); + ExpectIntEQ(wc_Sha512GetFlags(&sha512, &flags), 0); + ExpectIntEQ((flags & WC_HASH_FLAG_ISCOPY), 0); - res = TEST_RES_CHECK(flag == 0); + wc_Sha512Free(&sha512); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha512GetFlags */ /* * Unit test function for wc_Sha512FinalRaw() */ static int test_wc_Sha512FinalRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(WOLFSSL_SHA512) && !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 3)))) && \ !defined(WOLFSSL_NO_HASH_RAW) @@ -13202,60 +14191,28 @@ byte hash1[WC_SHA512_DIGEST_SIZE]; byte hash2[2*WC_SHA512_DIGEST_SIZE]; byte hash3[5*WC_SHA512_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitSha512(&sha512); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitSha512(&sha512), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte*); - /* Good test args. */ for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Sha512FinalRaw(&sha512, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha512FinalRaw(&sha512, hash_test[i]), 0); } /* Test bad args. */ - if (!flag ) { - ret = wc_Sha512FinalRaw(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha512FinalRaw(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha512FinalRaw(&sha512, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha512FinalRaw(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512FinalRaw(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512FinalRaw(&sha512, NULL), BAD_FUNC_ARG); wc_Sha512Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha512FinalRaw */ /* @@ -13263,13 +14220,13 @@ */ static int test_wc_Sha512Free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA512 wc_Sha512Free(NULL); - - res = TEST_RES_CHECK(1); + /* Set result to SUCCESS. */ + ExpectTrue(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha512Free */ #ifdef WOLFSSL_SHA512 @@ -13277,7 +14234,7 @@ (!defined(WOLFSSL_NOSHA512_224) || !defined(WOLFSSL_NOSHA512_256)) static int test_Sha512_Family_GetHash(int type ) { - int flag = 0; + EXPECT_DECLS; int(*initFp)(wc_Sha512*); int(*ghashFp)(wc_Sha512*, byte*); wc_Sha512 sha512; @@ -13309,32 +14266,16 @@ if (initFp == NULL || ghashFp == NULL) return TEST_FAIL; - if (!flag) { - flag = initFp(&sha512); - } - - if (!flag) { - flag = ghashFp(&sha512, hash1); - } - - /*test bad arguments*/ - if (!flag) { - if (ghashFp(NULL, NULL) != BAD_FUNC_ARG ) - flag = WOLFSSL_FATAL_ERROR; - } - - if (!flag) { - if (ghashFp(NULL, hash1) != BAD_FUNC_ARG ) - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(initFp(&sha512), 0); + ExpectIntEQ(ghashFp(&sha512, hash1), 0); - if (!flag) { - if (ghashFp(&sha512, NULL) != BAD_FUNC_ARG ) - flag = WOLFSSL_FATAL_ERROR; - } + /* test bad arguments*/ + ExpectIntEQ(ghashFp(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(ghashFp(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(ghashFp(&sha512, NULL), BAD_FUNC_ARG); wc_Sha512Free(&sha512); - return flag; + return EXPECT_RESULT(); } #endif /* !HAVE_FIPS && !HAVE_SELFTEST && (!WOLFSSL_NOSHA512_224 || !WOLFSSL_NOSHA512_256) */ @@ -13344,43 +14285,24 @@ */ static int test_wc_Sha512GetHash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA512 wc_Sha512 sha512; byte hash1[WC_SHA512_DIGEST_SIZE]; - int flag = 0; /* Initialize */ - flag = wc_InitSha512(&sha512); + ExpectIntEQ(wc_InitSha512(&sha512), 0); - if (flag == 0) { - flag = wc_Sha512GetHash(&sha512, hash1); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha512GetHash(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha512GetHash(NULL, hash1); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha512GetHash(&sha512, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_Sha512GetHash(&sha512, hash1), 0); - wc_Sha512Free(&sha512); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha512GetHash(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512GetHash(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512GetHash(&sha512, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(flag == 0); + wc_Sha512Free(&sha512); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha512GetHash */ /* @@ -13388,552 +14310,365 @@ */ static int test_wc_Sha512Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA512 wc_Sha512 sha512; wc_Sha512 temp; - int flag; + + XMEMSET(&sha512, 0, sizeof(wc_Sha512)); + XMEMSET(&temp, 0, sizeof(wc_Sha512)); /* Initialize */ - flag = wc_InitSha512(&sha512); - if (flag == 0) { - flag = wc_InitSha512(&temp); - } - if (flag == 0) { - flag = wc_Sha512Copy(&sha512, &temp); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha512Copy(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha512Copy(NULL, &temp); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha512Copy(&sha512, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha512(&sha512), 0); + ExpectIntEQ(wc_InitSha512(&temp), 0); + + ExpectIntEQ(wc_Sha512Copy(&sha512, &temp), 0); + + /* test bad arguments*/ + ExpectIntEQ(wc_Sha512Copy(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512Copy(NULL, &temp), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512Copy(&sha512, NULL), BAD_FUNC_ARG); wc_Sha512Free(&sha512); wc_Sha512Free(&temp); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha512Copy */ static int test_wc_InitSha512_224(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) wc_Sha512 sha512; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitSha512_224(&sha512); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitSha512_224(&sha512), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitSha512_224(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitSha512_224(NULL), BAD_FUNC_ARG); wc_Sha512_224Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_224 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_224Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) wc_Sha512 sha512; byte hash[WC_SHA512_DIGEST_SIZE]; testVector a, c; - int ret; - int flag = 0; - ret = wc_InitSha512_224(&sha512); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitSha512_224(&sha512), 0); /* Input. */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_Sha512_224Update(&sha512, NULL, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512_224Update(&sha512,(byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512_224Update(&sha512, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512_224Final(&sha512, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_Sha512_224Update(&sha512, NULL, 0), 0); + ExpectIntEQ(wc_Sha512_224Update(&sha512,(byte*)a.input, 0), 0); + ExpectIntEQ(wc_Sha512_224Update(&sha512, (byte*)a.input, (word32)a.inLen), + 0); + ExpectIntEQ(wc_Sha512_224Final(&sha512, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\x46\x34\x27\x0f\x70\x7b\x6a\x54\xda\xae\x75\x30\x46\x08" - "\x42\xe2\x0e\x37\xed\x26\x5c\xee\xe9\xa4\x3e\x89\x24\xaa"; - - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_Sha512_224Update(&sha512, (byte*) a.input, (word32) a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha512_224Final(&sha512, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA512_224_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_SHA512_224_DIGEST_SIZE; - - ret = wc_Sha512_224Update(&sha512, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + a.input = "abc"; + a.output = "\x46\x34\x27\x0f\x70\x7b\x6a\x54\xda\xae\x75\x30\x46\x08" + "\x42\xe2\x0e\x37\xed\x26\x5c\xee\xe9\xa4\x3e\x89\x24\xaa"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_Sha512_224Update(&sha512, (byte*) a.input, (word32) a.inLen), + 0); + ExpectIntEQ(wc_Sha512_224Final(&sha512, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA512_224_DIGEST_SIZE), 0); - if (!flag) { - ret = wc_Sha512_224Update(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + c.input = NULL; + c.inLen = WC_SHA512_224_DIGEST_SIZE; + ExpectIntEQ(wc_Sha512_224Update(&sha512, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_224Update(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_Sha512_224Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_224 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_224Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) - int ret = test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_224, 0); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_224, 0), + TEST_SUCCESS); #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_224 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_224GetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) && defined(WOLFSSL_HASH_FLAGS) - wc_Sha512 sha512, copy; + wc_Sha512 sha512; + wc_Sha512 copy; word32 flags = 0; - int flag = 0; + + XMEMSET(&sha512, 0, sizeof(wc_Sha512)); + XMEMSET(©, 0, sizeof(wc_Sha512)); /* Initialize */ - flag = wc_InitSha512_224(&sha512); - if (!flag) { - flag = wc_InitSha512_224(©); - } - if (!flag) { - flag = wc_Sha512_224Copy(&sha512, ©); - } - if (!flag) { - flag = wc_Sha512_224GetFlags(©, &flags); - } - if (!flag) { - if (flags & WC_HASH_FLAG_ISCOPY) - flag = 0; - else - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_InitSha512_224(&sha512), 0); + ExpectIntEQ(wc_InitSha512_224(©), 0); + + ExpectIntEQ(wc_Sha512_224GetFlags(&sha512, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); + + ExpectIntEQ(wc_Sha512_224Copy(&sha512, ©), 0); + ExpectIntEQ(wc_Sha512_224GetFlags(©, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == WC_HASH_FLAG_ISCOPY); + wc_Sha512_224Free(©); wc_Sha512_224Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_224FinalRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \ defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) && \ !defined(WOLFSSL_NO_HASH_RAW) - int ret = test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_224, 1); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_224, 1), + TEST_SUCCESS); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_224Free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) wc_Sha512_224Free(NULL); - - res = TEST_RES_CHECK(1); + /* Set result to SUCCESS. */ + ExpectTrue(1); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_224GetHash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) - int ret = test_Sha512_Family_GetHash(WC_HASH_TYPE_SHA512_224); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(test_Sha512_Family_GetHash(WC_HASH_TYPE_SHA512_224), + TEST_SUCCESS); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_224Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) wc_Sha512 sha512; wc_Sha512 temp; - int flag = 0; + + XMEMSET(&sha512, 0, sizeof(wc_Sha512)); + XMEMSET(&temp, 0, sizeof(wc_Sha512)); /* Initialize */ - flag = wc_InitSha512_224(&sha512); - if (flag == 0) { - flag = wc_InitSha512_224(&temp); - } - if (flag == 0) { - flag = wc_Sha512_224Copy(&sha512, &temp); - } - /*test bad arguments*/ - if (flag == 0) { - if (wc_Sha512_224Copy(NULL, NULL) != BAD_FUNC_ARG) - flag = WOLFSSL_FATAL_ERROR; - } - if (flag == 0) { - if (wc_Sha512_224Copy(NULL, &temp) != BAD_FUNC_ARG) - flag = WOLFSSL_FATAL_ERROR; - } - if (flag == 0) { - if (wc_Sha512_224Copy(&sha512, NULL) != BAD_FUNC_ARG) - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_InitSha512_224(&sha512), 0); + ExpectIntEQ(wc_InitSha512_224(&temp), 0); + + ExpectIntEQ(wc_Sha512_224Copy(&sha512, &temp), 0); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha512_224Copy(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_224Copy(NULL, &temp), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_224Copy(&sha512, NULL), BAD_FUNC_ARG); wc_Sha512_224Free(&sha512); wc_Sha512_224Free(&temp); - - res = TEST_RES_CHECK(flag == 0); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_InitSha512_256(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) wc_Sha512 sha512; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitSha512_256(&sha512); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitSha512_256(&sha512), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitSha512_256(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitSha512_256(NULL), BAD_FUNC_ARG); wc_Sha512_256Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_256 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_256Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) wc_Sha512 sha512; byte hash[WC_SHA512_DIGEST_SIZE]; testVector a, c; - int ret; - int flag = 0; - ret = wc_InitSha512_256(&sha512); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitSha512_256(&sha512), 0); /* Input. */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_Sha512_256Update(&sha512, NULL, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512_256Update(&sha512,(byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512_256Update(&sha512, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha512_256Final(&sha512, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_Sha512_256Update(&sha512, NULL, 0), 0); + ExpectIntEQ(wc_Sha512_256Update(&sha512,(byte*)a.input, 0), 0); + ExpectIntEQ(wc_Sha512_256Update(&sha512, (byte*)a.input, (word32)a.inLen), + 0); + ExpectIntEQ(wc_Sha512_256Final(&sha512, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\x53\x04\x8e\x26\x81\x94\x1e\xf9\x9b\x2e\x29\xb7\x6b\x4c" - "\x7d\xab\xe4\xc2\xd0\xc6\x34\xfc\x6d\x46\xe0\xe2\xf1\x31" - "\x07\xe7\xaf\x23"; - - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_Sha512_256Update(&sha512, (byte*) a.input, (word32) a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha512_256Final(&sha512, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA512_256_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_SHA512_256_DIGEST_SIZE; - - ret = wc_Sha512_256Update(&sha512, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + a.input = "abc"; + a.output = "\x53\x04\x8e\x26\x81\x94\x1e\xf9\x9b\x2e\x29\xb7\x6b\x4c" + "\x7d\xab\xe4\xc2\xd0\xc6\x34\xfc\x6d\x46\xe0\xe2\xf1\x31" + "\x07\xe7\xaf\x23"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_Sha512_256Update(&sha512, (byte*) a.input, (word32) a.inLen), + 0); + ExpectIntEQ(wc_Sha512_256Final(&sha512, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA512_256_DIGEST_SIZE), 0); - if (!flag) { - ret = wc_Sha512_256Update(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + c.input = NULL; + c.inLen = WC_SHA512_256_DIGEST_SIZE; + ExpectIntEQ(wc_Sha512_256Update(&sha512, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_256Update(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_Sha512_256Free(&sha512); - - res = TEST_RES_CHECK(flag == 0); #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_256 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_256Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) - int ret = test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_256, 0); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_256, 0), + TEST_SUCCESS); #endif /* WOLFSSL_SHA512 && !WOLFSSL_NOSHA512_256 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_256GetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) && defined(WOLFSSL_HASH_FLAGS) wc_Sha512 sha512, copy; word32 flags = 0; - int flag = 0; + + XMEMSET(&sha512, 0, sizeof(wc_Sha512)); + XMEMSET(©, 0, sizeof(wc_Sha512)); /* Initialize */ - flag = wc_InitSha512_256(&sha512); - if (!flag ) { - flag = wc_InitSha512_256(©); - } - if (!flag ) { - flag = wc_Sha512_256Copy(&sha512, ©); - } - if (!flag ) { - flag = wc_Sha512_256GetFlags(©, &flags); - } - if (!flag) { - if (flags & WC_HASH_FLAG_ISCOPY) - flag = 0; - else - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_InitSha512_256(&sha512), 0); + ExpectIntEQ(wc_InitSha512_256(©), 0); - wc_Sha512_256Free(&sha512); + ExpectIntEQ(wc_Sha512_256GetFlags(&sha512, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); + + ExpectIntEQ(wc_Sha512_256Copy(&sha512, ©), 0); + ExpectIntEQ(wc_Sha512_256GetFlags(©, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == WC_HASH_FLAG_ISCOPY); - res = TEST_RES_CHECK(flag == 0); + wc_Sha512_256Free(&sha512); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_256FinalRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && \ defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) && \ !defined(WOLFSSL_NO_HASH_RAW) - int ret = test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_256, 1); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(test_Sha512_Family_Final(WC_HASH_TYPE_SHA512_256, 1), + TEST_SUCCESS); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_256Free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) wc_Sha512_256Free(NULL); - - res = TEST_RES_CHECK(1); + /* Set result to SUCCESS. */ + ExpectTrue(1); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_256GetHash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) - int ret = test_Sha512_Family_GetHash(WC_HASH_TYPE_SHA512_256); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(test_Sha512_Family_GetHash(WC_HASH_TYPE_SHA512_256), + TEST_SUCCESS); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wc_Sha512_256Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_256) wc_Sha512 sha512; wc_Sha512 temp; - int flag = 0; + + XMEMSET(&sha512, 0, sizeof(wc_Sha512)); + XMEMSET(&temp, 0, sizeof(wc_Sha512)); /* Initialize */ - flag = wc_InitSha512_256(&sha512); - if (flag == 0) { - flag = wc_InitSha512_256(&temp); - } - if (flag == 0) { - flag = wc_Sha512_256Copy(&sha512, &temp); - } - /*test bad arguments*/ - if (flag == 0) { - if (wc_Sha512_256Copy(NULL, NULL) != BAD_FUNC_ARG) - flag = WOLFSSL_FATAL_ERROR; - } - if (flag == 0) { - if (wc_Sha512_256Copy(NULL, &temp) != BAD_FUNC_ARG) - flag = WOLFSSL_FATAL_ERROR; - } - if (flag == 0) { - if (wc_Sha512_256Copy(&sha512, NULL) != BAD_FUNC_ARG) - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_InitSha512_256(&sha512), 0); + ExpectIntEQ(wc_InitSha512_256(&temp), 0); + + ExpectIntEQ(wc_Sha512_256Copy(&sha512, &temp), 0); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha512_256Copy(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_256Copy(NULL, &temp), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_256Copy(&sha512, NULL), BAD_FUNC_ARG); wc_Sha512_256Free(&sha512); wc_Sha512_256Free(&temp); - - res = TEST_RES_CHECK(flag == 0); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } @@ -13943,31 +14678,18 @@ */ static int test_wc_InitSha384(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA384 wc_Sha384 sha384; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitSha384(&sha384); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitSha384(&sha384), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitSha384(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitSha384(NULL), BAD_FUNC_ARG); wc_Sha384Free(&sha384); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_InitSha384 */ @@ -13976,109 +14698,48 @@ */ static int test_wc_Sha384Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA384 wc_Sha384 sha384; byte hash[WC_SHA384_DIGEST_SIZE]; testVector a, b, c; - int ret; - int flag = 0; - ret = wc_InitSha384(&sha384); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitSha384(&sha384), 0); /* Input */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_Sha384Update(&sha384, NULL, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha384Update(&sha384, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha384Update(&sha384, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha384Final(&sha384, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_Sha384Update(&sha384, NULL, 0), 0); + ExpectIntEQ(wc_Sha384Update(&sha384, (byte*)a.input, 0), 0); + ExpectIntEQ(wc_Sha384Update(&sha384, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Sha384Final(&sha384, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50" - "\x07\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff" - "\x5b\xed\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34" - "\xc8\x25\xa7"; - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_Sha384Update(&sha384, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha384Final(&sha384, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA384_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + a.input = "abc"; + a.output = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50" + "\x07\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff" + "\x5b\xed\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34" + "\xc8\x25\xa7"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_Sha384Update(&sha384, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Sha384Final(&sha384, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA384_DIGEST_SIZE), 0); /* Pass in bad values. */ - if (!flag) { - b.input = NULL; - b.inLen = 0; - - ret = wc_Sha384Update(&sha384, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_SHA384_DIGEST_SIZE; - - ret = wc_Sha384Update(&sha384, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha384Update(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + b.input = NULL; + b.inLen = 0; + ExpectIntEQ(wc_Sha384Update(&sha384, (byte*)b.input, (word32)b.inLen), 0); + c.input = NULL; + c.inLen = WC_SHA384_DIGEST_SIZE; + ExpectIntEQ( wc_Sha384Update(&sha384, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384Update(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_Sha384Free(&sha384); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha384Update */ /* @@ -14086,96 +14747,54 @@ */ static int test_wc_Sha384Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA384 wc_Sha384 sha384; byte* hash_test[3]; byte hash1[WC_SHA384_DIGEST_SIZE]; byte hash2[2*WC_SHA384_DIGEST_SIZE]; byte hash3[5*WC_SHA384_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitSha384(&sha384); - if (ret) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitSha384(&sha384), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte*); - /* Good test args. */ for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Sha384Final(&sha384, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha384Final(&sha384, hash_test[i]), 0); } /* Test bad args. */ - if (!flag) { - ret = wc_Sha384Final(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha384Final(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha384Final(&sha384, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha384Final(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384Final(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384Final(&sha384, NULL), BAD_FUNC_ARG); wc_Sha384Free(&sha384); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha384Final */ /* * Unit test function for wc_Sha384GetFlags() */ static int test_wc_Sha384GetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA384) && defined(WOLFSSL_HASH_FLAGS) wc_Sha384 sha384; word32 flags = 0; - int flag = 0; /* Initialize */ - flag = wc_InitSha384(&sha384); - if (flag == 0) { - flag = wc_Sha384GetFlags(&sha384, &flags); - } - if (flag == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha384(&sha384), 0); + ExpectIntEQ(wc_Sha384GetFlags(&sha384, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); wc_Sha384Free(&sha384); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha384GetFlags */ /* @@ -14183,7 +14802,7 @@ */ static int test_wc_Sha384FinalRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(WOLFSSL_SHA384) && !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 3)))) && \ !defined(WOLFSSL_NO_HASH_RAW) @@ -14192,74 +14811,41 @@ byte hash1[WC_SHA384_DIGEST_SIZE]; byte hash2[2*WC_SHA384_DIGEST_SIZE]; byte hash3[5*WC_SHA384_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitSha384(&sha384); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitSha384(&sha384), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte*); - /* Good test args. */ for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Sha384FinalRaw(&sha384, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha384FinalRaw(&sha384, hash_test[i]), 0); } /* Test bad args. */ - if (!flag ) { - ret = wc_Sha384FinalRaw(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha384FinalRaw(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha384FinalRaw(&sha384, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha384FinalRaw(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384FinalRaw(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384FinalRaw(&sha384, NULL), BAD_FUNC_ARG); wc_Sha384Free(&sha384); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha384FinalRaw */ /* * Unit test function for wc_Sha384Free() */ static int test_wc_Sha384Free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA384 wc_Sha384Free(NULL); - - res = TEST_RES_CHECK(1); + /* Set result to SUCCESS. */ + ExpectTrue(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha384Free */ /* @@ -14267,91 +14853,51 @@ */ static int test_wc_Sha384GetHash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA384 wc_Sha384 sha384; byte hash1[WC_SHA384_DIGEST_SIZE]; - int flag = 0; /* Initialize */ - flag = wc_InitSha384(&sha384); + ExpectIntEQ(wc_InitSha384(&sha384), 0); - if (flag == 0) { - flag = wc_Sha384GetHash(&sha384, hash1); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha384GetHash(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha384GetHash(NULL, hash1); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha384GetHash(&sha384, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_Sha384GetHash(&sha384, hash1), 0); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha384GetHash(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384GetHash(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384GetHash(&sha384, NULL), BAD_FUNC_ARG); wc_Sha384Free(&sha384); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha384GetHash */ /* * Unit test function for wc_Sha384Copy() */ static int test_wc_Sha384Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA384 wc_Sha384 sha384; wc_Sha384 temp; - int flag = 0; + + XMEMSET(&sha384, 0, sizeof(wc_Sha384)); + XMEMSET(&temp, 0, sizeof(wc_Sha384)); /* Initialize */ - flag = wc_InitSha384(&sha384); - if (flag == 0) { - flag = wc_InitSha384(&temp); - } - if (flag == 0) { - flag = wc_Sha384Copy(&sha384, &temp); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha384Copy(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha384Copy(NULL, &temp); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha384Copy(&sha384, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha384(&sha384), 0); + ExpectIntEQ(wc_InitSha384(&temp), 0); + + ExpectIntEQ(wc_Sha384Copy(&sha384, &temp), 0); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha384Copy(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384Copy(NULL, &temp), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha384Copy(&sha384, NULL), BAD_FUNC_ARG); wc_Sha384Free(&sha384); wc_Sha384Free(&temp); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha384Copy */ /* @@ -14359,31 +14905,18 @@ */ static int test_wc_InitSha224(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA224 wc_Sha224 sha224; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitSha224(&sha224); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitSha224(&sha224), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitSha224(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitSha224(NULL), BAD_FUNC_ARG); wc_Sha224Free(&sha224); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_InitSha224 */ /* @@ -14391,108 +14924,46 @@ */ static int test_wc_Sha224Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA224 wc_Sha224 sha224; byte hash[WC_SHA224_DIGEST_SIZE]; testVector a, b, c; - int ret; - int flag = 0; - ret = wc_InitSha224(&sha224); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitSha224(&sha224), 0); /* Input. */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_Sha224Update(&sha224, NULL, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha224Update(&sha224, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - - ret = wc_Sha224Update(&sha224, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha224Final(&sha224, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_Sha224Update(&sha224, NULL, 0), 0); + ExpectIntEQ(wc_Sha224Update(&sha224, (byte*)a.input, 0), 0); + ExpectIntEQ(wc_Sha224Update(&sha224, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Sha224Final(&sha224, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\x23\x09\x7d\x22\x34\x05\xd8\x22\x86\x42\xa4\x77\xbd\xa2" - "\x55\xb3\x2a\xad\xbc\xe4\xbd\xa0\xb3\xf7\xe3\x6c\x9d\xa7"; - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_Sha224Update(&sha224, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_Sha224Final(&sha224, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA224_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - /* Pass in bad values. */ - if (!flag) { - b.input = NULL; - b.inLen = 0; - - ret = wc_Sha224Update(&sha224, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = WC_SHA224_DIGEST_SIZE; - - ret = wc_Sha224Update(&sha224, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + a.input = "abc"; + a.output = "\x23\x09\x7d\x22\x34\x05\xd8\x22\x86\x42\xa4\x77\xbd\xa2" + "\x55\xb3\x2a\xad\xbc\xe4\xbd\xa0\xb3\xf7\xe3\x6c\x9d\xa7"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_Sha224Update(&sha224, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_Sha224Final(&sha224, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA224_DIGEST_SIZE), 0); - if (!flag) { - ret = wc_Sha224Update(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + /* Pass in bad values. */ + b.input = NULL; + b.inLen = 0; + ExpectIntEQ(wc_Sha224Update(&sha224, (byte*)b.input, (word32)b.inLen), 0); + c.input = NULL; + c.inLen = WC_SHA224_DIGEST_SIZE; + ExpectIntEQ(wc_Sha224Update(&sha224, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha224Update(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); wc_Sha224Free(&sha224); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha224Update */ /* @@ -14500,68 +14971,36 @@ */ static int test_wc_Sha224Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA224 wc_Sha224 sha224; byte* hash_test[3]; byte hash1[WC_SHA224_DIGEST_SIZE]; byte hash2[2*WC_SHA224_DIGEST_SIZE]; byte hash3[5*WC_SHA224_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitSha224(&sha224); - if (ret) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitSha224(&sha224), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte*); - /* Good test args. */ /* Testing oversized buffers. */ for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_Sha224Final(&sha224, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha224Final(&sha224, hash_test[i]), 0); } /* Test bad args. */ - if (!flag) { - ret = wc_Sha224Final(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha224Final(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_Sha224Final(&sha224, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha224Final(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha224Final(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha224Final(&sha224, NULL), BAD_FUNC_ARG); wc_Sha224Free(&sha224); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224Final */ /* @@ -14569,28 +15008,22 @@ */ static int test_wc_Sha224SetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA224) && defined(WOLFSSL_HASH_FLAGS) wc_Sha224 sha224; - word32 flags = 0; - int flag = 0; + word32 flags = WC_HASH_FLAG_WILLCOPY; /* Initialize */ - flag = wc_InitSha224(&sha224); - if (flag == 0) { - flag = wc_Sha224SetFlags(&sha224, flags); - } - if (flag == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha224(&sha224), 0); - wc_Sha224Free(&sha224); + ExpectIntEQ(wc_Sha224SetFlags(&sha224, flags), 0); + flags = 0; + ExpectIntEQ(wc_Sha224GetFlags(&sha224, &flags), 0); + ExpectTrue(flags == WC_HASH_FLAG_WILLCOPY); - res = TEST_RES_CHECK(flag == 0); + wc_Sha224Free(&sha224); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224SetFlags */ /* @@ -14598,42 +15031,33 @@ */ static int test_wc_Sha224GetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA224) && defined(WOLFSSL_HASH_FLAGS) wc_Sha224 sha224; word32 flags = 0; - int flag = 0; /* Initialize */ - flag = wc_InitSha224(&sha224); - if (flag == 0) { - flag = wc_Sha224GetFlags(&sha224, &flags); - } - if (flag == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha224(&sha224), 0); - wc_Sha224Free(&sha224); + ExpectIntEQ(wc_Sha224GetFlags(&sha224, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); - res = TEST_RES_CHECK(flag == 0); + wc_Sha224Free(&sha224); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha224GetFlags */ /* * Unit test function for wc_Sha224Free() */ static int test_wc_Sha224Free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA224 wc_Sha224Free(NULL); - - res = TEST_RES_CHECK(1); + /* Set result to SUCCESS. */ + ExpectTrue(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224Free */ @@ -14642,43 +15066,23 @@ */ static int test_wc_Sha224GetHash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA224 wc_Sha224 sha224; byte hash1[WC_SHA224_DIGEST_SIZE]; - int flag = 0; /* Initialize */ - flag = wc_InitSha224(&sha224); + ExpectIntEQ(wc_InitSha224(&sha224), 0); - if (flag == 0) { - flag = wc_Sha224GetHash(&sha224, hash1); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha224GetHash(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha224GetHash(NULL, hash1); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha224GetHash(&sha224, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_Sha224GetHash(&sha224, hash1), 0); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha224GetHash(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha224GetHash(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha224GetHash(&sha224, NULL), BAD_FUNC_ARG); wc_Sha224Free(&sha224); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224GetHash */ /* @@ -14686,47 +15090,28 @@ */ static int test_wc_Sha224Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHA224 wc_Sha224 sha224; wc_Sha224 temp; - int flag = 0; + + XMEMSET(&sha224, 0, sizeof(wc_Sha224)); + XMEMSET(&temp, 0, sizeof(wc_Sha224)); /* Initialize */ - flag = wc_InitSha224(&sha224); - if (flag == 0) { - flag = wc_InitSha224(&temp); - } - if (flag == 0) { - flag = wc_Sha224Copy(&sha224, &temp); - } - /*test bad arguments*/ - if (flag == 0) { - flag = wc_Sha224Copy(NULL, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha224Copy(NULL, &temp); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } - if (flag == 0) { - flag = wc_Sha224Copy(&sha224, NULL); - if (flag == BAD_FUNC_ARG) { - flag = 0; - } - } + ExpectIntEQ(wc_InitSha224(&sha224), 0); + ExpectIntEQ(wc_InitSha224(&temp), 0); + ExpectIntEQ(wc_Sha224Copy(&sha224, &temp), 0); + /* test bad arguments*/ + ExpectIntEQ(wc_Sha224Copy(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha224Copy(NULL, &temp), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha224Copy(&sha224, NULL), BAD_FUNC_ARG); wc_Sha224Free(&sha224); wc_Sha224Free(&temp); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224Copy */ @@ -14735,29 +15120,16 @@ */ static int test_wc_InitRipeMd(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_RIPEMD RipeMd ripemd; - int ret; - int flag = 0; /* Test good arg. */ - ret = wc_InitRipeMd(&ripemd); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - + ExpectIntEQ(wc_InitRipeMd(&ripemd), 0); /* Test bad arg. */ - if (!flag) { - ret = wc_InitRipeMd(NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - res = TEST_RES_CHECK(flag == 0); + ExpectIntEQ(wc_InitRipeMd(NULL), BAD_FUNC_ARG); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_InitRipeMd */ @@ -14766,96 +15138,42 @@ */ static int test_wc_RipeMdUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_RIPEMD RipeMd ripemd; byte hash[RIPEMD_DIGEST_SIZE]; testVector a, b, c; - int ret; - int flag = 0; - ret = wc_InitRipeMd(&ripemd); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_InitRipeMd(&ripemd), 0); /* Input */ - if (!flag) { - a.input = "a"; - a.inLen = XSTRLEN(a.input); - - ret = wc_RipeMdUpdate(&ripemd, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_RipeMdFinal(&ripemd, hash); - if (ret != 0) { - flag = ret; - } - } + a.input = "a"; + a.inLen = XSTRLEN(a.input); + ExpectIntEQ(wc_RipeMdUpdate(&ripemd, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_RipeMdFinal(&ripemd, hash), 0); /* Update input. */ - if (!flag) { - a.input = "abc"; - a.output = "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6" - "\xb0\x87\xf1\x5a\x0b\xfc"; - a.inLen = XSTRLEN(a.input); - a.outLen = XSTRLEN(a.output); - - ret = wc_RipeMdUpdate(&ripemd, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_RipeMdFinal(&ripemd, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, RIPEMD_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + a.input = "abc"; + a.output = "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6" + "\xb0\x87\xf1\x5a\x0b\xfc"; + a.inLen = XSTRLEN(a.input); + a.outLen = XSTRLEN(a.output); + ExpectIntEQ(wc_RipeMdUpdate(&ripemd, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_RipeMdFinal(&ripemd, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, RIPEMD_DIGEST_SIZE), 0); /* Pass in bad values. */ - if (!flag) { - b.input = NULL; - b.inLen = 0; - - ret = wc_RipeMdUpdate(&ripemd, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - c.input = NULL; - c.inLen = RIPEMD_DIGEST_SIZE; - - ret = wc_RipeMdUpdate(&ripemd, (byte*)c.input, (word32)c.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_RipeMdUpdate(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - res = TEST_RES_CHECK(flag == 0); + b.input = NULL; + b.inLen = 0; + ExpectIntEQ(wc_RipeMdUpdate(&ripemd, (byte*)b.input, (word32)b.inLen), 0); + c.input = NULL; + c.inLen = RIPEMD_DIGEST_SIZE; + ExpectIntEQ(wc_RipeMdUpdate(&ripemd, (byte*)c.input, (word32)c.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RipeMdUpdate(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_RipeMdUdpate */ /* @@ -14863,65 +15181,33 @@ */ static int test_wc_RipeMdFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_RIPEMD RipeMd ripemd; byte* hash_test[3]; byte hash1[RIPEMD_DIGEST_SIZE]; byte hash2[2*RIPEMD_DIGEST_SIZE]; byte hash3[5*RIPEMD_DIGEST_SIZE]; - int times, i, ret; - int flag = 0; + int times, i; /* Initialize */ - ret = wc_InitRipeMd(&ripemd); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - hash_test[0] = hash1; - hash_test[1] = hash2; - hash_test[2] = hash3; - } + ExpectIntEQ(wc_InitRipeMd(&ripemd), 0); + hash_test[0] = hash1; + hash_test[1] = hash2; + hash_test[2] = hash3; times = sizeof(hash_test) / sizeof(byte*); - /* Testing oversized buffers. */ for (i = 0; i < times; i++) { - if (!flag) { - ret = wc_RipeMdFinal(&ripemd, hash_test[i]); - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_RipeMdFinal(&ripemd, hash_test[i]), 0); } /* Test bad args. */ - if (!flag) { - ret = wc_RipeMdFinal(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_RipeMdFinal(NULL, hash1); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_RipeMdFinal(&ripemd, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - res = TEST_RES_CHECK(flag == 0); + ExpectIntEQ(wc_RipeMdFinal(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_RipeMdFinal(NULL, hash1), BAD_FUNC_ARG); + ExpectIntEQ(wc_RipeMdFinal(&ripemd, NULL), BAD_FUNC_ARG); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RipeMdFinal */ @@ -14931,81 +15217,38 @@ */ static int test_wc_InitSha3(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) wc_Sha3 sha3; - int ret = 0; (void)sha3; - #if !defined(WOLFSSL_NOSHA3_224) - ret = wc_InitSha3_224(&sha3, HEAP_HINT, testDevId); - - /* Test bad args. */ - if (ret == 0) { - ret = wc_InitSha3_224(NULL, HEAP_HINT, testDevId); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_Sha3_224_Free(&sha3); - #endif /* NOSHA3_224 */ - #if !defined(WOLFSSL_NOSHA3_256) - if (ret == 0) { - ret = wc_InitSha3_256(&sha3, HEAP_HINT, testDevId); - /* Test bad args. */ - if (ret == 0) { - ret = wc_InitSha3_256(NULL, HEAP_HINT, testDevId); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_Sha3_256_Free(&sha3); - } /* END sha3_256 */ - #endif /* NOSHA3_256 */ - #if !defined(WOLFSSL_NOSHA3_384) - if (ret == 0) { - ret = wc_InitSha3_384(&sha3, HEAP_HINT, testDevId); - /* Test bad args. */ - if (ret == 0) { - ret = wc_InitSha3_384(NULL, HEAP_HINT, testDevId); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_Sha3_384_Free(&sha3); - } /* END sha3_384 */ - #endif /* NOSHA3_384 */ - #if !defined(WOLFSSL_NOSHA3_512) - if (ret == 0) { - ret = wc_InitSha3_512(&sha3, HEAP_HINT, testDevId); - /* Test bad args. */ - if (ret == 0) { - ret = wc_InitSha3_512(NULL, HEAP_HINT, testDevId); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_Sha3_512_Free(&sha3); - } /* END sha3_512 */ - #endif /* NOSHA3_512 */ - - res = TEST_RES_CHECK(ret == 0); +#if !defined(WOLFSSL_NOSHA3_224) + ExpectIntEQ(wc_InitSha3_224(&sha3, HEAP_HINT, testDevId), 0); + /* Test bad args. */ + ExpectIntEQ(wc_InitSha3_224(NULL, HEAP_HINT, testDevId), BAD_FUNC_ARG); + wc_Sha3_224_Free(&sha3); +#endif /* NOSHA3_224 */ +#if !defined(WOLFSSL_NOSHA3_256) + ExpectIntEQ(wc_InitSha3_256(&sha3, HEAP_HINT, testDevId), 0); + /* Test bad args. */ + ExpectIntEQ(wc_InitSha3_256(NULL, HEAP_HINT, testDevId), BAD_FUNC_ARG); + wc_Sha3_256_Free(&sha3); +#endif /* NOSHA3_256 */ +#if !defined(WOLFSSL_NOSHA3_384) + ExpectIntEQ(wc_InitSha3_384(&sha3, HEAP_HINT, testDevId), 0); + /* Test bad args. */ + ExpectIntEQ(wc_InitSha3_384(NULL, HEAP_HINT, testDevId), BAD_FUNC_ARG); + wc_Sha3_384_Free(&sha3); +#endif /* NOSHA3_384 */ +#if !defined(WOLFSSL_NOSHA3_512) + ExpectIntEQ(wc_InitSha3_512(&sha3, HEAP_HINT, testDevId), 0); + /* Test bad args. */ + ExpectIntEQ(wc_InitSha3_512(NULL, HEAP_HINT, testDevId), BAD_FUNC_ARG); + wc_Sha3_512_Free(&sha3); +#endif /* NOSHA3_512 */ #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_InitSha3 */ @@ -15014,7 +15257,7 @@ */ static int testing_wc_Sha3_Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_XILINX_CRYPT) && \ !defined(WOLFSSL_AFALG_XILINX) wc_Sha3 sha3; @@ -15028,171 +15271,92 @@ word32 msglen = sizeof(msg) - 1; word32 msg2len = sizeof(msg2); word32 msgCmplen = sizeof(msgCmp); - int ret = 0; #if !defined(WOLFSSL_NOSHA3_224) - ret = wc_InitSha3_224(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_InitSha3_224(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_224_Update(&sha3, msg, msglen), 0); + ExpectIntEQ(XMEMCMP(msg, sha3.t, msglen), 0); + ExpectTrue(sha3.i == msglen); + + ExpectIntEQ(wc_Sha3_224_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(sha3.t, msgCmp, msgCmplen), 0); - ret = wc_Sha3_224_Update(&sha3, msg, msglen); - if (XMEMCMP(msg, sha3.t, msglen) || sha3.i != msglen) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_Sha3_224_Update(&sha3, msg2, msg2len); - if (ret == 0 && XMEMCMP(sha3.t, msgCmp, msgCmplen) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Pass bad args. */ - if (ret == 0) { - ret = wc_Sha3_224_Update(NULL, msg2, msg2len); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_224_Update(&sha3, NULL, 5); - } - if (ret == BAD_FUNC_ARG) { - wc_Sha3_224_Free(&sha3); - if (wc_InitSha3_224(&sha3, HEAP_HINT, testDevId)) { - return TEST_FAIL; - } - ret = wc_Sha3_224_Update(&sha3, NULL, 0); - if (ret == 0) { - ret = wc_Sha3_224_Update(&sha3, msg2, msg2len); - } - if (ret == 0 && XMEMCMP(msg2, sha3.t, msg2len) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_Sha3_224_Update(NULL, msg2, msg2len), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_224_Update(&sha3, NULL, 5), BAD_FUNC_ARG); + wc_Sha3_224_Free(&sha3); + + ExpectIntEQ(wc_InitSha3_224(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_224_Update(&sha3, NULL, 0), 0); + ExpectIntEQ(wc_Sha3_224_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(msg2, sha3.t, msg2len), 0); wc_Sha3_224_Free(&sha3); #endif /* SHA3_224 */ #if !defined(WOLFSSL_NOSHA3_256) - if (ret == 0) { - ret = wc_InitSha3_256(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_Sha3_256_Update(&sha3, msg, msglen); - if (XMEMCMP(msg, sha3.t, msglen) || sha3.i != msglen) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_Sha3_256_Update(&sha3, msg2, msg2len); - if (XMEMCMP(sha3.t, msgCmp, msgCmplen) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - /* Pass bad args. */ - if (ret == 0) { - ret = wc_Sha3_256_Update(NULL, msg2, msg2len); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_256_Update(&sha3, NULL, 5); - } - if (ret == BAD_FUNC_ARG) { - wc_Sha3_256_Free(&sha3); - if (wc_InitSha3_256(&sha3, HEAP_HINT, testDevId)) { - return TEST_FAIL; - } - ret = wc_Sha3_256_Update(&sha3, NULL, 0); - if (ret == 0) { - ret = wc_Sha3_256_Update(&sha3, msg2, msg2len); - } - if (ret == 0 && XMEMCMP(msg2, sha3.t, msg2len) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } - wc_Sha3_256_Free(&sha3); - } + ExpectIntEQ(wc_InitSha3_256(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_256_Update(&sha3, msg, msglen), 0); + ExpectIntEQ(XMEMCMP(msg, sha3.t, msglen), 0); + ExpectTrue(sha3.i == msglen); + + ExpectIntEQ(wc_Sha3_256_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(sha3.t, msgCmp, msgCmplen), 0); + + /* Pass bad args. */ + ExpectIntEQ(wc_Sha3_256_Update(NULL, msg2, msg2len), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_256_Update(&sha3, NULL, 5), BAD_FUNC_ARG); + wc_Sha3_256_Free(&sha3); + + ExpectIntEQ(wc_InitSha3_256(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_256_Update(&sha3, NULL, 0), 0); + ExpectIntEQ(wc_Sha3_256_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(msg2, sha3.t, msg2len), 0); + wc_Sha3_256_Free(&sha3); #endif /* SHA3_256 */ #if !defined(WOLFSSL_NOSHA3_384) - if (ret == 0) { - ret = wc_InitSha3_384(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_Sha3_384_Update(&sha3, msg, msglen); - if (XMEMCMP(msg, sha3.t, msglen) || sha3.i != msglen) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_Sha3_384_Update(&sha3, msg2, msg2len); - if (XMEMCMP(sha3.t, msgCmp, msgCmplen) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - /* Pass bad args. */ - if (ret == 0) { - ret = wc_Sha3_384_Update(NULL, msg2, msg2len); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_384_Update(&sha3, NULL, 5); - } - if (ret == BAD_FUNC_ARG) { - wc_Sha3_384_Free(&sha3); - if (wc_InitSha3_384(&sha3, HEAP_HINT, testDevId)) { - return TEST_FAIL; - } - ret = wc_Sha3_384_Update(&sha3, NULL, 0); - if (ret == 0) { - ret = wc_Sha3_384_Update(&sha3, msg2, msg2len); - } - if (ret == 0 && XMEMCMP(msg2, sha3.t, msg2len) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } - wc_Sha3_384_Free(&sha3); - } + ExpectIntEQ(wc_InitSha3_384(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_384_Update(&sha3, msg, msglen), 0); + ExpectIntEQ(XMEMCMP(msg, sha3.t, msglen), 0); + ExpectTrue(sha3.i == msglen); + + ExpectIntEQ(wc_Sha3_384_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(sha3.t, msgCmp, msgCmplen), 0); + + /* Pass bad args. */ + ExpectIntEQ(wc_Sha3_384_Update(NULL, msg2, msg2len), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_384_Update(&sha3, NULL, 5), BAD_FUNC_ARG); + wc_Sha3_384_Free(&sha3); + + ExpectIntEQ(wc_InitSha3_384(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_384_Update(&sha3, NULL, 0), 0); + ExpectIntEQ(wc_Sha3_384_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(msg2, sha3.t, msg2len), 0); + wc_Sha3_384_Free(&sha3); #endif /* SHA3_384 */ #if !defined(WOLFSSL_NOSHA3_512) - if (ret == 0) { - ret = wc_InitSha3_512(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_Sha3_512_Update(&sha3, msg, msglen); - if (XMEMCMP(msg, sha3.t, msglen) || sha3.i != msglen) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_Sha3_512_Update(&sha3, msg2, msg2len); - if (XMEMCMP(sha3.t, msgCmp, msgCmplen) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - /* Pass bad args. */ - if (ret == 0) { - ret = wc_Sha3_512_Update(NULL, msg2, msg2len); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_512_Update(&sha3, NULL, 5); - } - if (ret == BAD_FUNC_ARG) { - wc_Sha3_512_Free(&sha3); - if (wc_InitSha3_512(&sha3, HEAP_HINT, testDevId)) { - return TEST_FAIL; - } - ret = wc_Sha3_512_Update(&sha3, NULL, 0); - if (ret == 0) { - ret = wc_Sha3_512_Update(&sha3, msg2, msg2len); - } - if (ret == 0 && XMEMCMP(msg2, sha3.t, msg2len) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } - wc_Sha3_512_Free(&sha3); - } - #endif /* SHA3_512 */ + ExpectIntEQ(wc_InitSha3_512(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_512_Update(&sha3, msg, msglen), 0); + ExpectIntEQ(XMEMCMP(msg, sha3.t, msglen), 0); + ExpectTrue(sha3.i == msglen); - res = TEST_RES_CHECK(ret == 0); -#endif /* WOLFSSL_SHA3 */ - return res; + ExpectIntEQ(wc_Sha3_512_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(sha3.t, msgCmp, msgCmplen), 0); + /* Pass bad args. */ + ExpectIntEQ(wc_Sha3_512_Update(NULL, msg2, msg2len), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_512_Update(&sha3, NULL, 5), BAD_FUNC_ARG); + wc_Sha3_512_Free(&sha3); + + ExpectIntEQ(wc_InitSha3_512(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_512_Update(&sha3, NULL, 0), 0); + ExpectIntEQ(wc_Sha3_512_Update(&sha3, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(msg2, sha3.t, msg2len), 0); + wc_Sha3_512_Free(&sha3); + #endif /* SHA3_512 */ +#endif /* WOLFSSL_SHA3 */ + return EXPECT_RESULT(); } /* END testing_wc_Sha3_Update */ /* @@ -15200,7 +15364,7 @@ */ static int test_wc_Sha3_224_Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) wc_Sha3 sha3; const char* msg = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnom" @@ -15210,79 +15374,36 @@ "\x64\xea\xd0\xfc\xce\x33"; byte hash[WC_SHA3_224_DIGEST_SIZE]; byte hashRet[WC_SHA3_224_DIGEST_SIZE]; - int ret = 0; /* Init stack variables. */ XMEMSET(hash, 0, sizeof(hash)); - ret = wc_InitSha3_224(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_InitSha3_224(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_224_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_224_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(expOut, hash, WC_SHA3_224_DIGEST_SIZE), 0); - ret= wc_Sha3_224_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_224_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(expOut, hash, WC_SHA3_224_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_224_Final(NULL, hash); - if (ret == 0) { - ret = wc_Sha3_224_Final(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_224_Final(NULL, hash), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_224_Final(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_224_Free(&sha3); - if (ret == 0) { - ret = wc_InitSha3_224(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - - /* Init stack variables. */ - XMEMSET(hash, 0, sizeof(hash)); - XMEMSET(hashRet, 0, sizeof(hashRet)); - - ret= wc_Sha3_224_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_224_GetHash(&sha3, hashRet); - } + ExpectIntEQ(wc_InitSha3_224(&sha3, HEAP_HINT, testDevId), 0); + /* Init stack variables. */ + XMEMSET(hash, 0, sizeof(hash)); + XMEMSET(hashRet, 0, sizeof(hashRet)); + ExpectIntEQ(wc_Sha3_224_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_224_GetHash(&sha3, hashRet), 0); + ExpectIntEQ(wc_Sha3_224_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(hash, hashRet, WC_SHA3_224_DIGEST_SIZE), 0); - if (ret == 0) { - ret = wc_Sha3_224_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(hash, hashRet, WC_SHA3_224_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - /* Test bad args. */ - ret = wc_Sha3_224_GetHash(NULL, hashRet); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_224_GetHash(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + /* Test bad args. */ + ExpectIntEQ(wc_Sha3_224_GetHash(NULL, hashRet), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_224_GetHash(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_224_Free(&sha3); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha3_224_Final */ @@ -15291,7 +15412,7 @@ */ static int test_wc_Sha3_256_Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) wc_Sha3 sha3; const char* msg = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnom" @@ -15301,77 +15422,36 @@ "\xdd\x97\x49\x6d\x33\x76"; byte hash[WC_SHA3_256_DIGEST_SIZE]; byte hashRet[WC_SHA3_256_DIGEST_SIZE]; - int ret = 0; /* Init stack variables. */ XMEMSET(hash, 0, sizeof(hash)); - ret = wc_InitSha3_256(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_InitSha3_256(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_256_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_256_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(expOut, hash, WC_SHA3_256_DIGEST_SIZE), 0); - ret= wc_Sha3_256_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_256_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(expOut, hash, WC_SHA3_256_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_256_Final(NULL, hash); - if (ret == 0) { - ret = wc_Sha3_256_Final(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_256_Final(NULL, hash), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_256_Final(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_256_Free(&sha3); - if (ret == 0) { - ret = wc_InitSha3_256(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - /* Init stack variables. */ - XMEMSET(hash, 0, sizeof(hash)); - XMEMSET(hashRet, 0, sizeof(hashRet)); + ExpectIntEQ(wc_InitSha3_256(&sha3, HEAP_HINT, testDevId), 0); + /* Init stack variables. */ + XMEMSET(hash, 0, sizeof(hash)); + XMEMSET(hashRet, 0, sizeof(hashRet)); + ExpectIntEQ(wc_Sha3_256_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_256_GetHash(&sha3, hashRet), 0); + ExpectIntEQ(wc_Sha3_256_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(hash, hashRet, WC_SHA3_256_DIGEST_SIZE), 0); - ret= wc_Sha3_256_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_256_GetHash(&sha3, hashRet); - } - if (ret == 0) { - ret = wc_Sha3_256_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(hash, hashRet, WC_SHA3_256_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - /* Test bad args. */ - ret = wc_Sha3_256_GetHash(NULL, hashRet); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_256_GetHash(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + /* Test bad args. */ + ExpectIntEQ(wc_Sha3_256_GetHash(NULL, hashRet), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_256_GetHash(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_256_Free(&sha3); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha3_256_Final */ @@ -15380,7 +15460,7 @@ */ static int test_wc_Sha3_384_Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384) wc_Sha3 sha3; const char* msg = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnom" @@ -15391,77 +15471,36 @@ "\xa1\x9e\xef\x51\xac\xd0\x65\x7c\x22"; byte hash[WC_SHA3_384_DIGEST_SIZE]; byte hashRet[WC_SHA3_384_DIGEST_SIZE]; - int ret = 0; /* Init stack variables. */ XMEMSET(hash, 0, sizeof(hash)); - ret = wc_InitSha3_384(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_InitSha3_384(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_384_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_384_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(expOut, hash, WC_SHA3_384_DIGEST_SIZE), 0); - ret= wc_Sha3_384_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_384_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(expOut, hash, WC_SHA3_384_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_384_Final(NULL, hash); - if (ret == 0) { - ret = wc_Sha3_384_Final(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_384_Final(NULL, hash), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_384_Final(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_384_Free(&sha3); - if (ret == 0) { - ret = wc_InitSha3_384(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - /* Init stack variables. */ - XMEMSET(hash, 0, sizeof(hash)); - XMEMSET(hashRet, 0, sizeof(hashRet)); + ExpectIntEQ(wc_InitSha3_384(&sha3, HEAP_HINT, testDevId), 0); + /* Init stack variables. */ + XMEMSET(hash, 0, sizeof(hash)); + XMEMSET(hashRet, 0, sizeof(hashRet)); + ExpectIntEQ(wc_Sha3_384_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_384_GetHash(&sha3, hashRet), 0); + ExpectIntEQ(wc_Sha3_384_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(hash, hashRet, WC_SHA3_384_DIGEST_SIZE), 0); - ret= wc_Sha3_384_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_384_GetHash(&sha3, hashRet); - } - if (ret == 0) { - ret = wc_Sha3_384_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(hash, hashRet, WC_SHA3_384_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - /* Test bad args. */ - ret = wc_Sha3_384_GetHash(NULL, hashRet); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_384_GetHash(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + /* Test bad args. */ + ExpectIntEQ(wc_Sha3_384_GetHash(NULL, hashRet), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_384_GetHash(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_384_Free(&sha3); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha3_384_Final */ @@ -15471,7 +15510,7 @@ */ static int test_wc_Sha3_512_Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) && \ !defined(WOLFSSL_NOSHA3_384) wc_Sha3 sha3; @@ -15484,77 +15523,36 @@ "\x9c\x03\x0d\x99\xa2\x7d\xaf\x11\x39\xd6\xe7\x5e"; byte hash[WC_SHA3_512_DIGEST_SIZE]; byte hashRet[WC_SHA3_512_DIGEST_SIZE]; - int ret = 0; /* Init stack variables. */ XMEMSET(hash, 0, sizeof(hash)); - ret = wc_InitSha3_512(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_InitSha3_512(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_512_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_512_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(expOut, hash, WC_SHA3_512_DIGEST_SIZE), 0); - ret= wc_Sha3_512_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_512_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(expOut, hash, WC_SHA3_512_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_512_Final(NULL, hash); - if (ret == 0) { - ret = wc_Sha3_384_Final(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_512_Final(NULL, hash), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_512_Final(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_512_Free(&sha3); - if (ret == 0) { - ret = wc_InitSha3_512(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - /* Init stack variables. */ - XMEMSET(hash, 0, sizeof(hash)); - XMEMSET(hashRet, 0, sizeof(hashRet)); + ExpectIntEQ(wc_InitSha3_512(&sha3, HEAP_HINT, testDevId), 0); + /* Init stack variables. */ + XMEMSET(hash, 0, sizeof(hash)); + XMEMSET(hashRet, 0, sizeof(hashRet)); + ExpectIntEQ(wc_Sha3_512_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)), 0); + ExpectIntEQ(wc_Sha3_512_GetHash(&sha3, hashRet), 0); + ExpectIntEQ(wc_Sha3_512_Final(&sha3, hash), 0); + ExpectIntEQ(XMEMCMP(hash, hashRet, WC_SHA3_512_DIGEST_SIZE), 0); - ret= wc_Sha3_512_Update(&sha3, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Sha3_512_GetHash(&sha3, hashRet); - } - if (ret == 0) { - ret = wc_Sha3_512_Final(&sha3, hash); - if (ret == 0 && XMEMCMP(hash, hashRet, WC_SHA3_512_DIGEST_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - /* Test bad args. */ - ret = wc_Sha3_512_GetHash(NULL, hashRet); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_512_GetHash(&sha3, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + /* Test bad args. */ + ExpectIntEQ(wc_Sha3_512_GetHash(NULL, hashRet), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_512_GetHash(&sha3, NULL), BAD_FUNC_ARG); wc_Sha3_512_Free(&sha3); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha3_512_Final */ @@ -15563,61 +15561,35 @@ */ static int test_wc_Sha3_224_Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) wc_Sha3 sha3, sha3Cpy; const char* msg = TEST_STRING; word32 msglen = (word32)TEST_STRING_SZ; byte hash[WC_SHA3_224_DIGEST_SIZE]; byte hashCpy[WC_SHA3_224_DIGEST_SIZE]; - int ret = 0; XMEMSET(hash, 0, sizeof(hash)); XMEMSET(hashCpy, 0, sizeof(hashCpy)); + XMEMSET(&sha3, 0, sizeof(wc_Sha3)); + XMEMSET(&sha3Cpy, 0, sizeof(wc_Sha3)); - ret = wc_InitSha3_224(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - - ret = wc_InitSha3_224(&sha3Cpy, HEAP_HINT, testDevId); - if (ret != 0) { - wc_Sha3_224_Free(&sha3); - return TEST_FAIL; - } - - ret = wc_Sha3_224_Update(&sha3, (byte*)msg, msglen); + ExpectIntEQ(wc_InitSha3_224(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_InitSha3_224(&sha3Cpy, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_224_Update(&sha3, (byte*)msg, msglen), 0); + ExpectIntEQ(wc_Sha3_224_Copy(&sha3Cpy, &sha3), 0); + ExpectIntEQ(wc_Sha3_224_Final(&sha3, hash), 0); + ExpectIntEQ(wc_Sha3_224_Final(&sha3Cpy, hashCpy), 0); + ExpectIntEQ(XMEMCMP(hash, hashCpy, sizeof(hash)), 0); - if (ret == 0) { - ret = wc_Sha3_224_Copy(&sha3Cpy, &sha3); - if (ret == 0) { - ret = wc_Sha3_224_Final(&sha3, hash); - if (ret == 0) { - ret = wc_Sha3_224_Final(&sha3Cpy, hashCpy); - } - } - if (ret == 0 && XMEMCMP(hash, hashCpy, sizeof(hash)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_224_Copy(NULL, &sha3); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_224_Copy(&sha3Cpy, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_224_Copy(NULL, &sha3), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_224_Copy(&sha3Cpy, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + wc_Sha3_224_Free(&sha3); + wc_Sha3_224_Free(&sha3Cpy); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha3_224_Copy */ @@ -15627,61 +15599,35 @@ */ static int test_wc_Sha3_256_Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) wc_Sha3 sha3, sha3Cpy; const char* msg = TEST_STRING; word32 msglen = (word32)TEST_STRING_SZ; byte hash[WC_SHA3_256_DIGEST_SIZE]; byte hashCpy[WC_SHA3_256_DIGEST_SIZE]; - int ret = 0; XMEMSET(hash, 0, sizeof(hash)); XMEMSET(hashCpy, 0, sizeof(hashCpy)); + XMEMSET(&sha3, 0, sizeof(wc_Sha3)); + XMEMSET(&sha3Cpy, 0, sizeof(wc_Sha3)); - ret = wc_InitSha3_256(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - - ret = wc_InitSha3_256(&sha3Cpy, HEAP_HINT, testDevId); - if (ret != 0) { - wc_Sha3_256_Free(&sha3); - return TEST_FAIL; - } - - ret = wc_Sha3_256_Update(&sha3, (byte*)msg, msglen); + ExpectIntEQ(wc_InitSha3_256(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_InitSha3_256(&sha3Cpy, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_256_Update(&sha3, (byte*)msg, msglen), 0); + ExpectIntEQ(wc_Sha3_256_Copy(&sha3Cpy, &sha3), 0); + ExpectIntEQ(wc_Sha3_256_Final(&sha3, hash), 0); + ExpectIntEQ(wc_Sha3_256_Final(&sha3Cpy, hashCpy), 0); + ExpectIntEQ(XMEMCMP(hash, hashCpy, sizeof(hash)), 0); - if (ret == 0) { - ret = wc_Sha3_256_Copy(&sha3Cpy, &sha3); - if (ret == 0) { - ret = wc_Sha3_256_Final(&sha3, hash); - if (ret == 0) { - ret = wc_Sha3_256_Final(&sha3Cpy, hashCpy); - } - } - if (ret == 0 && XMEMCMP(hash, hashCpy, sizeof(hash)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_256_Copy(NULL, &sha3); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_256_Copy(&sha3Cpy, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_256_Copy(NULL, &sha3), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_256_Copy(&sha3Cpy, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + wc_Sha3_256_Free(&sha3); + wc_Sha3_256_Free(&sha3Cpy); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha3_256_Copy */ @@ -15691,61 +15637,35 @@ */ static int test_wc_Sha3_384_Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384) wc_Sha3 sha3, sha3Cpy; const char* msg = TEST_STRING; word32 msglen = (word32)TEST_STRING_SZ; byte hash[WC_SHA3_384_DIGEST_SIZE]; byte hashCpy[WC_SHA3_384_DIGEST_SIZE]; - int ret = 0; XMEMSET(hash, 0, sizeof(hash)); XMEMSET(hashCpy, 0, sizeof(hashCpy)); + XMEMSET(&sha3, 0, sizeof(wc_Sha3)); + XMEMSET(&sha3Cpy, 0, sizeof(wc_Sha3)); - ret = wc_InitSha3_384(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - - ret = wc_InitSha3_384(&sha3Cpy, HEAP_HINT, testDevId); - if (ret != 0) { - wc_Sha3_384_Free(&sha3); - return TEST_FAIL; - } - - ret = wc_Sha3_384_Update(&sha3, (byte*)msg, msglen); + ExpectIntEQ(wc_InitSha3_384(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_InitSha3_384(&sha3Cpy, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_384_Update(&sha3, (byte*)msg, msglen), 0); + ExpectIntEQ(wc_Sha3_384_Copy(&sha3Cpy, &sha3), 0); + ExpectIntEQ(wc_Sha3_384_Final(&sha3, hash), 0); + ExpectIntEQ(wc_Sha3_384_Final(&sha3Cpy, hashCpy), 0); + ExpectIntEQ(XMEMCMP(hash, hashCpy, sizeof(hash)), 0); - if (ret == 0) { - ret = wc_Sha3_384_Copy(&sha3Cpy, &sha3); - if (ret == 0) { - ret = wc_Sha3_384_Final(&sha3, hash); - if (ret == 0) { - ret = wc_Sha3_384_Final(&sha3Cpy, hashCpy); - } - } - if (ret == 0 && XMEMCMP(hash, hashCpy, sizeof(hash)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_384_Copy(NULL, &sha3); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_384_Copy(&sha3Cpy, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_384_Copy(NULL, &sha3), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_384_Copy(&sha3Cpy, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + wc_Sha3_384_Free(&sha3); + wc_Sha3_384_Free(&sha3Cpy); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha3_384_Copy */ @@ -15754,125 +15674,75 @@ */ static int test_wc_Sha3_512_Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) wc_Sha3 sha3, sha3Cpy; const char* msg = TEST_STRING; word32 msglen = (word32)TEST_STRING_SZ; byte hash[WC_SHA3_512_DIGEST_SIZE]; byte hashCpy[WC_SHA3_512_DIGEST_SIZE]; - int ret = 0; XMEMSET(hash, 0, sizeof(hash)); XMEMSET(hashCpy, 0, sizeof(hashCpy)); + XMEMSET(&sha3, 0, sizeof(wc_Sha3)); + XMEMSET(&sha3Cpy, 0, sizeof(wc_Sha3)); - ret = wc_InitSha3_512(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - - ret = wc_InitSha3_512(&sha3Cpy, HEAP_HINT, testDevId); - if (ret != 0) { - wc_Sha3_512_Free(&sha3); - return TEST_FAIL; - } - - ret = wc_Sha3_512_Update(&sha3, (byte*)msg, msglen); + ExpectIntEQ(wc_InitSha3_512(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_InitSha3_512(&sha3Cpy, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_512_Update(&sha3, (byte*)msg, msglen), 0); + ExpectIntEQ(wc_Sha3_512_Copy(&sha3Cpy, &sha3), 0); + ExpectIntEQ(wc_Sha3_512_Final(&sha3, hash), 0); + ExpectIntEQ(wc_Sha3_512_Final(&sha3Cpy, hashCpy), 0); + ExpectIntEQ(XMEMCMP(hash, hashCpy, sizeof(hash)), 0); - if (ret == 0) { - ret = wc_Sha3_512_Copy(&sha3Cpy, &sha3); - if (ret == 0) { - ret = wc_Sha3_512_Final(&sha3, hash); - if (ret == 0) { - ret = wc_Sha3_512_Final(&sha3Cpy, hashCpy); - } - } - if (ret == 0 && XMEMCMP(hash, hashCpy, sizeof(hash)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Sha3_512_Copy(NULL, &sha3); - if (ret == BAD_FUNC_ARG) { - ret = wc_Sha3_512_Copy(&sha3Cpy, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Sha3_512_Copy(NULL, &sha3), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha3_512_Copy(&sha3Cpy, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + wc_Sha3_512_Free(&sha3); + wc_Sha3_512_Free(&sha3Cpy); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha3_512_Copy */ /* * Unit test function for wc_Sha3_GetFlags() */ static int test_wc_Sha3_GetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_HASH_FLAGS) wc_Sha3 sha3; word32 flags = 0; - int ret = 0; /* Initialize */ - ret = wc_InitSha3_224(&sha3, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - if (ret == 0) { - ret = wc_Sha3_GetFlags(&sha3, &flags); - } - if (ret == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - ret = 0; - } - } + ExpectIntEQ(wc_InitSha3_224(&sha3, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Sha3_GetFlags(&sha3, &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); wc_Sha3_224_Free(&sha3); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Sha3_GetFlags */ static int test_wc_InitShake256(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHAKE256 wc_Shake shake; - int ret = 0; - ret = wc_InitShake256(&shake, HEAP_HINT, testDevId); + ExpectIntEQ(wc_InitShake256(&shake, HEAP_HINT, testDevId), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_InitShake256(NULL, HEAP_HINT, testDevId); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_Shake256_Free(&shake); + ExpectIntEQ(wc_InitShake256(NULL, HEAP_HINT, testDevId), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + wc_Shake256_Free(&shake); #endif - return res; - -} /* END test_wc_InitSha3 */ + return EXPECT_RESULT(); +} static int testing_wc_Shake256_Update(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHAKE256 wc_Shake shake; byte msg[] = "Everybody's working for the weekend."; @@ -15885,52 +15755,32 @@ word32 msglen = sizeof(msg) - 1; word32 msg2len = sizeof(msg2); word32 msgCmplen = sizeof(msgCmp); - int ret = 0; - ret = wc_InitShake256(&shake, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_Shake256_Update(&shake, msg, msglen); - if (XMEMCMP(msg, shake.t, msglen) || shake.i != msglen) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_Shake256_Update(&shake, msg2, msg2len); - if (XMEMCMP(shake.t, msgCmp, msgCmplen) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitShake256(&shake, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Shake256_Update(&shake, msg, msglen), 0); + ExpectIntEQ(XMEMCMP(msg, shake.t, msglen), 0); + ExpectTrue(shake.i == msglen); + + ExpectIntEQ(wc_Shake256_Update(&shake, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(shake.t, msgCmp, msgCmplen), 0); + /* Pass bad args. */ - if (ret == 0) { - ret = wc_Shake256_Update(NULL, msg2, msg2len); - if (ret == BAD_FUNC_ARG) { - ret = wc_Shake256_Update(&shake, NULL, 5); - } - if (ret == BAD_FUNC_ARG) { - wc_Shake256_Free(&shake); - if (wc_InitShake256(&shake, HEAP_HINT, testDevId)) { - return TEST_FAIL; - } - ret = wc_Shake256_Update(&shake, NULL, 0); - if (ret == 0) { - ret = wc_Shake256_Update(&shake, msg2, msg2len); - } - if (ret == 0 && XMEMCMP(msg2, shake.t, msg2len) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_Shake256_Update(NULL, msg2, msg2len), BAD_FUNC_ARG); + ExpectIntEQ(wc_Shake256_Update(&shake, NULL, 5), BAD_FUNC_ARG); wc_Shake256_Free(&shake); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_InitShake256(&shake, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Shake256_Update(&shake, NULL, 0), 0); + ExpectIntEQ(wc_Shake256_Update(&shake, msg2, msg2len), 0); + ExpectIntEQ(XMEMCMP(msg2, shake.t, msg2len), 0); + wc_Shake256_Free(&shake); #endif /* WOLFSSL_SHAKE256 */ - return res; + return EXPECT_RESULT(); } static int test_wc_Shake256_Final(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHAKE256 wc_Shake shake; const char* msg = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnom" @@ -15945,48 +15795,32 @@ "\x08\xba\xf1\x9b\xe2\x12\x33\xf3\xde\xbe\x78\xd0\x67" "\x60\xcf\xa5\x51\xee\x1e\x07\x91\x41\xd4"; byte hash[114]; - int ret = 0; /* Init stack variables. */ XMEMSET(hash, 0, sizeof(hash)); - ret = wc_InitShake256(&shake, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_InitShake256(&shake, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_Shake256_Update(&shake, (byte*)msg, (word32)XSTRLEN(msg)), + 0); + ExpectIntEQ(wc_Shake256_Final(&shake, hash, (word32)sizeof(hash)), 0); + ExpectIntEQ(XMEMCMP(expOut, hash, (word32)sizeof(hash)), 0); - ret= wc_Shake256_Update(&shake, (byte*)msg, (word32)XSTRLEN(msg)); - if (ret == 0) { - ret = wc_Shake256_Final(&shake, hash, (word32)sizeof(hash)); - if (ret == 0 && XMEMCMP(expOut, hash, (word32)sizeof(hash)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Shake256_Final(NULL, hash, (word32)sizeof(hash)); - if (ret == 0) { - ret = wc_Shake256_Final(&shake, NULL, (word32)sizeof(hash)); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_Shake256_Free(&shake); + ExpectIntEQ(wc_Shake256_Final(NULL, hash, (word32)sizeof(hash)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Shake256_Final(&shake, NULL, (word32)sizeof(hash)), + BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + wc_Shake256_Free(&shake); #endif - return res; + return EXPECT_RESULT(); } /* * Testing wc_Shake256_Copy() */ static int test_wc_Shake256_Copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHAKE256 wc_Shake shake, shakeCpy; const char* msg = TEST_STRING; @@ -15995,61 +15829,34 @@ byte hashCpy[144]; word32 hashLen = sizeof(hash); word32 hashLenCpy = sizeof(hashCpy); - int ret; XMEMSET(hash, 0, sizeof(hash)); XMEMSET(hashCpy, 0, sizeof(hashCpy)); - ret = wc_InitShake256(&shake, HEAP_HINT, testDevId); - if (ret != 0) { - return TEST_FAIL; - } - - ret = wc_InitShake256(&shakeCpy, HEAP_HINT, testDevId); - if (ret != 0) { - wc_Shake256_Free(&shake); - return TEST_FAIL; - } + ExpectIntEQ(wc_InitShake256(&shake, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_InitShake256(&shakeCpy, HEAP_HINT, testDevId), 0); - ret = wc_Shake256_Update(&shake, (byte*)msg, msglen); + ExpectIntEQ(wc_Shake256_Update(&shake, (byte*)msg, msglen), 0); + ExpectIntEQ(wc_Shake256_Copy(&shakeCpy, &shake), 0); + ExpectIntEQ(wc_Shake256_Final(&shake, hash, hashLen), 0); + ExpectIntEQ(wc_Shake256_Final(&shakeCpy, hashCpy, hashLenCpy), 0); + ExpectIntEQ(XMEMCMP(hash, hashCpy, sizeof(hash)), 0); - if (ret == 0) { - ret = wc_Shake256_Copy(&shakeCpy, &shake); - if (ret == 0) { - ret = wc_Shake256_Final(&shake, hash, hashLen); - if (ret == 0) { - ret = wc_Shake256_Final(&shakeCpy, hashCpy, hashLenCpy); - } - } - if (ret == 0 && XMEMCMP(hash, hashCpy, sizeof(hash)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* Test bad args. */ - if (ret == 0) { - ret = wc_Shake256_Copy(NULL, &shake); - if (ret == BAD_FUNC_ARG) { - ret = wc_Shake256_Copy(&shakeCpy, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_Shake256_Free(&shake); + ExpectIntEQ(wc_Shake256_Copy(NULL, &shake), BAD_FUNC_ARG); + ExpectIntEQ(wc_Shake256_Copy(&shakeCpy, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + wc_Shake256_Free(&shake); + wc_Shake256_Free(&shakeCpy); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Shake256_Copy */ /* * Unit test function for wc_Shake256Hash() */ static int test_wc_Shake256Hash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_SHAKE256 const byte data[] = { /* Hello World */ 0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f, @@ -16058,25 +15865,284 @@ word32 len = sizeof(data); byte hash[144]; word32 hashLen = sizeof(hash); - int ret; - ret = wc_Shake256Hash(data, len, hash, hashLen); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_Shake256Hash(data, len, hash, hashLen), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Shake256Hash */ + +/* + * Testing wc_InitSm3(), wc_Sm3Free() + */ +static int test_wc_InitSm3Free(void) +{ + EXPECT_DECLS; +#ifdef WOLFSSL_SM3 + wc_Sm3 sm3; + + /* Invalid Parameters */ + ExpectIntEQ(wc_InitSm3(NULL, NULL, INVALID_DEVID), BAD_FUNC_ARG); + + /* Valid Parameters */ + ExpectIntEQ(wc_InitSm3(&sm3, NULL, INVALID_DEVID), 0); + + wc_Sm3Free(NULL); + wc_Sm3Free(&sm3); +#endif + return EXPECT_RESULT(); +} /* END test_wc_InitSm3 */ + +/* + * Testing wc_Sm3Update(), wc_Sm3Final() + */ +static int test_wc_Sm3UpdateFinal(void) +{ + EXPECT_DECLS; +#ifdef WOLFSSL_SM3 + wc_Sm3 sm3; + byte data[WC_SM3_BLOCK_SIZE * 4]; + byte hash[WC_SM3_DIGEST_SIZE]; + byte calcHash[WC_SM3_DIGEST_SIZE]; + byte expHash[WC_SM3_DIGEST_SIZE] = { + 0x38, 0x48, 0x15, 0xa7, 0x0e, 0xae, 0x0b, 0x27, + 0x5c, 0xde, 0x9d, 0xa5, 0xd1, 0xa4, 0x30, 0xa1, + 0xca, 0xd4, 0x54, 0x58, 0x44, 0xa2, 0x96, 0x1b, + 0xd7, 0x14, 0x80, 0x3f, 0x80, 0x1a, 0x07, 0xb6 + }; + word32 chunk; + word32 i; + + XMEMSET(data, 0, sizeof(data)); + + ExpectIntEQ(wc_InitSm3(&sm3, NULL, INVALID_DEVID), 0); + + /* Invalid Parameters */ + ExpectIntEQ(wc_Sm3Update(NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3Update(&sm3, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3Update(NULL, data, 1), BAD_FUNC_ARG); + + /* Valid Parameters */ + ExpectIntEQ(wc_Sm3Update(&sm3, NULL, 0), 0); + ExpectIntEQ(wc_Sm3Update(&sm3, data, 1), 0); + ExpectIntEQ(wc_Sm3Update(&sm3, data, 1), 0); + ExpectIntEQ(wc_Sm3Update(&sm3, data, WC_SM3_BLOCK_SIZE), 0); + ExpectIntEQ(wc_Sm3Update(&sm3, data, WC_SM3_BLOCK_SIZE - 2), 0); + ExpectIntEQ(wc_Sm3Update(&sm3, data, WC_SM3_BLOCK_SIZE * 2), 0); + /* Ensure too many bytes for lengths. */ + ExpectIntEQ(wc_Sm3Update(&sm3, data, WC_SM3_PAD_SIZE), 0); + + /* Invalid Parameters */ + ExpectIntEQ(wc_Sm3Final(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3Final(&sm3, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3Final(NULL, hash), BAD_FUNC_ARG); + + /* Valid Parameters */ + ExpectIntEQ(wc_Sm3Final(&sm3, hash), 0); + ExpectBufEQ(hash, expHash, WC_SM3_DIGEST_SIZE); + + /* Chunk tests. */ + ExpectIntEQ(wc_Sm3Update(&sm3, data, sizeof(data)), 0); + ExpectIntEQ(wc_Sm3Final(&sm3, calcHash), 0); + for (chunk = 1; chunk <= WC_SM3_BLOCK_SIZE + 1; chunk++) { + for (i = 0; i + chunk <= (word32)sizeof(data); i += chunk) { + ExpectIntEQ(wc_Sm3Update(&sm3, data + i, chunk), 0); + } + if (i < (word32)sizeof(data)) { + ExpectIntEQ(wc_Sm3Update(&sm3, data + i, (word32)sizeof(data) - i), + 0); + } + ExpectIntEQ(wc_Sm3Final(&sm3, hash), 0); + ExpectBufEQ(hash, calcHash, WC_SM3_DIGEST_SIZE); + } + + /* Not testing when the low 32-bit length overflows. */ + + wc_Sm3Free(&sm3); +#endif + return EXPECT_RESULT(); +} /* END test_wc_Sm3Update */ + +/* + * Testing wc_Sm3GetHash() + */ +static int test_wc_Sm3GetHash(void) +{ + EXPECT_DECLS; +#ifdef WOLFSSL_SM3 + wc_Sm3 sm3; + byte hash[WC_SM3_DIGEST_SIZE]; + byte calcHash[WC_SM3_DIGEST_SIZE]; + byte data[WC_SM3_BLOCK_SIZE]; + + XMEMSET(data, 0, sizeof(data)); + + ExpectIntEQ(wc_InitSm3(&sm3, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Sm3Final(&sm3, calcHash), 0); + + /* Invalid Parameters */ + ExpectIntEQ(wc_Sm3GetHash(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3GetHash(&sm3, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3GetHash(NULL, hash), BAD_FUNC_ARG); + + /* Valid Parameters */ + ExpectIntEQ(wc_Sm3GetHash(&sm3, hash), 0); + ExpectBufEQ(hash, calcHash, WC_SM3_DIGEST_SIZE); + + /* With update. */ + ExpectIntEQ(wc_Sm3Update(&sm3, data, sizeof(data)), 0); + ExpectIntEQ(wc_Sm3GetHash(&sm3, hash), 0); + ExpectIntEQ(wc_Sm3Final(&sm3, calcHash), 0); + ExpectBufEQ(hash, calcHash, WC_SM3_DIGEST_SIZE); + + wc_Sm3Free(&sm3); +#endif + return EXPECT_RESULT(); +} /* END test_wc_Sm3Update */ + +/* + * Testing wc_Sm3Copy() + */ +static int test_wc_Sm3Copy(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_SM3) && defined(WOLFSSL_HASH_FLAGS) + wc_Sm3 sm3; + wc_Sm3 sm3Copy; + byte hash[WC_SM3_DIGEST_SIZE]; + byte hashCopy[WC_SM3_DIGEST_SIZE]; + byte data[WC_SM3_BLOCK_SIZE + 1]; + int i; + + ExpectIntEQ(wc_InitSm3(&sm3, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_InitSm3(&sm3Copy, NULL, INVALID_DEVID), 0); + + /* Invalid Parameters */ + ExpectIntEQ(wc_Sm3Copy(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3Copy(&sm3, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3Copy(NULL, &sm3Copy), BAD_FUNC_ARG); + + /* Valid Parameters */ + ExpectIntEQ(wc_Sm3Copy(&sm3, &sm3Copy), 0); + + /* Ensure all parts of data updated during hashing are copied. */ + for (i = 0; i < WC_SM3_BLOCK_SIZE + 1; i++) { + ExpectIntEQ(wc_Sm3Update(&sm3, data, i), 0); + ExpectIntEQ(wc_Sm3Copy(&sm3, &sm3Copy), 0); + ExpectIntEQ(wc_Sm3Update(&sm3, data, 1), 0); + ExpectIntEQ(wc_Sm3Update(&sm3Copy, data, 1), 0); + ExpectIntEQ(wc_Sm3Final(&sm3, hash), 0); + ExpectIntEQ(wc_Sm3Final(&sm3Copy, hashCopy), 0); + ExpectBufEQ(hash, hashCopy, WC_SM3_DIGEST_SIZE); + } + + wc_Sm3Free(&sm3Copy); + wc_Sm3Free(&sm3); +#endif + return EXPECT_RESULT(); +} /* END test_wc_Sm3Copy */ + +/* + * Testing wc_Sm3FinalRaw() + */ +static int test_wc_Sm3FinalRaw(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_SM3) && !defined(HAVE_SELFTEST) && \ + !defined(WOLFSSL_DEVCRYPTO) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 3))) && \ + !defined(WOLFSSL_NO_HASH_RAW) + wc_Sm3 sm3; + byte hash1[WC_SM3_DIGEST_SIZE]; + byte hash2[WC_SM3_DIGEST_SIZE]; + byte hash3[WC_SM3_DIGEST_SIZE]; + byte* hash_test[3] = { hash1, hash2, hash3 }; + int times; + int i; + + XMEMSET(&sm3, 0, sizeof(sm3)); + + /* Initialize */ + ExpectIntEQ(wc_InitSm3(&sm3, NULL, INVALID_DEVID), 0); + + /* Invalid Parameters */ + ExpectIntEQ(wc_Sm3FinalRaw(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3FinalRaw(&sm3, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3FinalRaw(NULL, hash1), BAD_FUNC_ARG); + + times = sizeof(hash_test) / sizeof(byte*); + for (i = 0; i < times; i++) { + ExpectIntEQ(wc_Sm3FinalRaw(&sm3, hash_test[i]), 0); + } + + wc_Sm3Free(&sm3); +#endif + return EXPECT_RESULT(); +} /* END test_wc_Sm3FinalRaw */ +/* + * Testing wc_Sm3GetFlags, wc_Sm3SetFlags() + */ +static int test_wc_Sm3GetSetFlags(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_SM3) && defined(WOLFSSL_HASH_FLAGS) + wc_Sm3 sm3; + wc_Sm3 sm3Copy; + word32 flags = 0; + + ExpectIntEQ(wc_InitSm3(&sm3, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_InitSm3(&sm3Copy, NULL, INVALID_DEVID), 0); + + ExpectIntEQ(wc_Sm3GetFlags(NULL, &flags), 0); + ExpectIntEQ(flags, 0); + ExpectIntEQ(wc_Sm3SetFlags(NULL, WC_HASH_FLAG_WILLCOPY), 0); + ExpectIntEQ(wc_Sm3GetFlags(NULL, &flags), 0); + ExpectIntEQ(flags, 0); + ExpectIntEQ(wc_Sm3GetFlags(&sm3, &flags), 0); + ExpectIntEQ(flags, 0); + ExpectIntEQ(wc_Sm3SetFlags(&sm3, WC_HASH_FLAG_WILLCOPY), 0); + ExpectIntEQ(wc_Sm3GetFlags(&sm3, &flags), 0); + ExpectIntEQ(flags, WC_HASH_FLAG_WILLCOPY); + + ExpectIntEQ(wc_Sm3Copy(&sm3, &sm3Copy), 0); + ExpectIntEQ(wc_Sm3GetFlags(&sm3Copy, &flags), 0); + ExpectIntEQ(flags, WC_HASH_FLAG_ISCOPY | WC_HASH_FLAG_WILLCOPY); + + wc_Sm3Free(&sm3Copy); + wc_Sm3Free(&sm3); +#endif + return EXPECT_RESULT(); +} /* END test_wc_Sm3Update */ + +/* + * Testing wc_Sm3Hash() + */ +static int test_wc_Sm3Hash(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_SM3) && defined(WOLFSSL_HASH_FLAGS) + byte data[WC_SM3_BLOCK_SIZE]; + byte hash[WC_SM3_DIGEST_SIZE]; + + /* Invalid parameters. */ + ExpectIntEQ(wc_Sm3Hash(NULL, sizeof(data), hash), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm3Hash(data, sizeof(data), NULL), BAD_FUNC_ARG); + + /* Valid parameters. */ + ExpectIntEQ(wc_Sm3Hash(data, sizeof(data), hash), 0); +#endif + return EXPECT_RESULT(); +} /* END test_wc_Sm3Hash */ + /* * Test function for wc_HmacSetKey */ static int test_wc_Md5HmacSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_MD5) Hmac hmac; int ret, times, itr; - int flag = 0; const char* keys[]= { @@ -16086,74 +16152,40 @@ #endif "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" }; - times = sizeof(keys) / sizeof(char*); - flag = 0; - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return TEST_FAIL; + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); for (itr = 0; itr < times; itr++) { ret = wc_HmacSetKey(&hmac, WC_MD5, (byte*)keys[itr], - (word32)XSTRLEN(keys[itr])); + (word32)XSTRLEN(keys[itr])); #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 5) wc_HmacFree(&hmac); - if (ret == BAD_FUNC_ARG) { - return TEST_SUCCESS; - } - else { - return TEST_FAIL; - } + ExpectIntEQ(ret, BAD_FUNC_ARG); #else - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(ret, 0); #endif } /* Bad args. */ - if (!flag) { - ret = wc_HmacSetKey(NULL, WC_MD5, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_MD5, NULL, (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, 20, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_MD5, (byte*)keys[0], 0); -#ifdef HAVE_FIPS - if (ret != HMAC_MIN_KEYLEN_E) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_HmacSetKey(NULL, WC_MD5, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_MD5, NULL, (word32)XSTRLEN(keys[0])), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, 21, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ret = wc_HmacSetKey(&hmac, WC_MD5, (byte*)keys[0], 0); +#if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 5) + ExpectIntEQ(ret, BAD_FUNC_ARG); +#elif defined(HAVE_FIPS) + ExpectIntEQ(ret, HMAC_MIN_KEYLEN_E); #else - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, 0); #endif - } wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Md5HmacSetKey */ @@ -16162,11 +16194,10 @@ */ static int test_wc_ShaHmacSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_SHA) Hmac hmac; int ret, times, itr; - int flag = 0; const char* keys[]= { @@ -16180,62 +16211,32 @@ }; times = sizeof(keys) / sizeof(char*); - flag = 0; - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); for (itr = 0; itr < times; itr++) { - ret = wc_HmacSetKey(&hmac, WC_SHA, (byte*)keys[itr], - (word32)XSTRLEN(keys[itr])); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA, (byte*)keys[itr], + (word32)XSTRLEN(keys[itr])), 0); } /* Bad args. */ - if (!flag) { - ret = wc_HmacSetKey(NULL, WC_SHA, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA, NULL, (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, 20, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacSetKey(NULL, WC_SHA, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA, NULL, (word32)XSTRLEN(keys[0])), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, 21, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA, (byte*)keys[0], 0); + ret = wc_HmacSetKey(&hmac, WC_SHA, (byte*)keys[0], 0); #ifdef HAVE_FIPS - if (ret != HMAC_MIN_KEYLEN_E) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, HMAC_MIN_KEYLEN_E); #else - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, 0); #endif - } wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ShaHmacSetKey() */ /* @@ -16243,11 +16244,10 @@ */ static int test_wc_Sha224HmacSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && defined(WOLFSSL_SHA224) Hmac hmac; int ret, times, itr; - int flag = 0; const char* keys[]= { @@ -16259,64 +16259,32 @@ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" "\xAA\xAA\xAA" }; - times = sizeof(keys) / sizeof(char*); - flag = 0; - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); for (itr = 0; itr < times; itr++) { - ret = wc_HmacSetKey(&hmac, WC_SHA224, (byte*)keys[itr], - (word32)XSTRLEN(keys[itr])); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA224, (byte*)keys[itr], + (word32)XSTRLEN(keys[itr])), 0); } /* Bad args. */ - if (!flag) { - ret = wc_HmacSetKey(NULL, WC_SHA224, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA224, NULL, (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, 20, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA224, (byte*)keys[0], 0); + ExpectIntEQ(wc_HmacSetKey(NULL, WC_SHA224, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA224, NULL, (word32)XSTRLEN(keys[0])), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, 21, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ret = wc_HmacSetKey(&hmac, WC_SHA224, (byte*)keys[0], 0); #ifdef HAVE_FIPS - if (ret != HMAC_MIN_KEYLEN_E) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, HMAC_MIN_KEYLEN_E); #else - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, 0); #endif - } wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224HmacSetKey() */ /* @@ -16324,11 +16292,10 @@ */ static int test_wc_Sha256HmacSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_SHA256) Hmac hmac; int ret, times, itr; - int flag = 0; const char* keys[]= { @@ -16340,64 +16307,32 @@ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" "\xAA\xAA\xAA" }; - times = sizeof(keys) / sizeof(char*); - flag = 0; - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); for (itr = 0; itr < times; itr++) { - ret = wc_HmacSetKey(&hmac, WC_SHA256, (byte*)keys[itr], - (word32)XSTRLEN(keys[itr])); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA256, (byte*)keys[itr], + (word32)XSTRLEN(keys[itr])), 0); } /* Bad args. */ - if (!flag) { - ret = wc_HmacSetKey(NULL, WC_SHA256, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA256, NULL, (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, 20, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA256, (byte*)keys[0], 0); + ExpectIntEQ(wc_HmacSetKey(NULL, WC_SHA256, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA256, NULL, (word32)XSTRLEN(keys[0])), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, 21, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ret = wc_HmacSetKey(&hmac, WC_SHA256, (byte*)keys[0], 0); #ifdef HAVE_FIPS - if (ret != HMAC_MIN_KEYLEN_E) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, HMAC_MIN_KEYLEN_E); #else - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, 0); #endif - } wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha256HmacSetKey() */ @@ -16406,11 +16341,10 @@ */ static int test_wc_Sha384HmacSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && defined(WOLFSSL_SHA384) Hmac hmac; int ret, times, itr; - int flag = 0; const char* keys[]= { @@ -16422,64 +16356,32 @@ "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" "\xAA\xAA\xAA" }; - times = sizeof(keys) / sizeof(char*); - flag = 0; - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); for (itr = 0; itr < times; itr++) { - ret = wc_HmacSetKey(&hmac, WC_SHA384, (byte*)keys[itr], - (word32)XSTRLEN(keys[itr])); - if (ret != 0) { - flag = ret; - } + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA384, (byte*)keys[itr], + (word32)XSTRLEN(keys[itr])), 0); } /* Bad args. */ - if (!flag) { - ret = wc_HmacSetKey(NULL, WC_SHA384, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA384, NULL, (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, 20, (byte*)keys[0], - (word32)XSTRLEN(keys[0])); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacSetKey(&hmac, WC_SHA384, (byte*)keys[0], 0); + ExpectIntEQ(wc_HmacSetKey(NULL, WC_SHA384, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA384, NULL, (word32)XSTRLEN(keys[0])), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacSetKey(&hmac, 21, (byte*)keys[0], + (word32)XSTRLEN(keys[0])), BAD_FUNC_ARG); + ret = wc_HmacSetKey(&hmac, WC_SHA384, (byte*)keys[0], 0); #ifdef HAVE_FIPS - if (ret != HMAC_MIN_KEYLEN_E) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, HMAC_MIN_KEYLEN_E); #else - if (ret != 0) { - flag = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(ret, 0); #endif - } wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha384HmacSetKey() */ @@ -16488,12 +16390,10 @@ */ static int test_wc_Md5HmacUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_MD5) && !(defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 5)) Hmac hmac; testVector a, b; - int ret; - int flag = 0; #ifdef HAVE_FIPS const char* keys = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; @@ -16503,62 +16403,26 @@ a.input = "what do ya want for nothing?"; a.inLen = XSTRLEN(a.input); - b.input = "Hi There"; b.inLen = XSTRLEN(b.input); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_MD5, (byte*)keys, (word32)XSTRLEN(keys)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_MD5, (byte*)keys, + (word32)XSTRLEN(keys)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen), 0); /* Update Hmac. */ - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); /* Test bad args. */ - if (!flag) { - ret = wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, NULL, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacUpdate(&hmac, NULL, (word32)a.inLen), BAD_FUNC_ARG); - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, 0), 0); wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Md5HmacUpdate */ /* @@ -16566,12 +16430,10 @@ */ static int test_wc_ShaHmacUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_SHA) Hmac hmac; testVector a, b; - int ret; - int flag = 0; #ifdef HAVE_FIPS const char* keys = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; @@ -16581,62 +16443,26 @@ a.input = "what do ya want for nothing?"; a.inLen = XSTRLEN(a.input); - b.input = "Hi There"; b.inLen = XSTRLEN(b.input); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_SHA, (byte*)keys, (word32)XSTRLEN(keys)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA, (byte*)keys, + (word32)XSTRLEN(keys)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen), 0); /* Update Hmac. */ - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); /* Test bad args. */ - if (!flag) { - ret = wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, NULL, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacUpdate(&hmac, NULL, (word32)a.inLen), BAD_FUNC_ARG); - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, 0), 0); wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ShaHmacUpdate */ /* @@ -16644,12 +16470,10 @@ */ static int test_wc_Sha224HmacUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && defined(WOLFSSL_SHA224) Hmac hmac; testVector a, b; - int ret; - int flag = 0; #ifdef HAVE_FIPS const char* keys = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; @@ -16659,62 +16483,26 @@ a.input = "what do ya want for nothing?"; a.inLen = XSTRLEN(a.input); - b.input = "Hi There"; b.inLen = XSTRLEN(b.input); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_SHA224, (byte*)keys, (word32)XSTRLEN(keys)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA224, (byte*)keys, + (word32)XSTRLEN(keys)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen), 0); /* Update Hmac. */ - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); /* Test bad args. */ - if (!flag) { - ret = wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, NULL, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacUpdate(&hmac, NULL, (word32)a.inLen), BAD_FUNC_ARG); - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, 0), 0); wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224HmacUpdate */ /* @@ -16722,12 +16510,10 @@ */ static int test_wc_Sha256HmacUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_SHA256) Hmac hmac; testVector a, b; - int ret; - int flag = 0; #ifdef HAVE_FIPS const char* keys = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; @@ -16737,62 +16523,26 @@ a.input = "what do ya want for nothing?"; a.inLen = XSTRLEN(a.input); - b.input = "Hi There"; b.inLen = XSTRLEN(b.input); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_SHA256, (byte*)keys, (word32)XSTRLEN(keys)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA256, (byte*)keys, + (word32)XSTRLEN(keys)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen), 0); /* Update Hmac. */ - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); /* Test bad args. */ - if (!flag) { - ret = wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, NULL, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacUpdate(&hmac, NULL, (word32)a.inLen), BAD_FUNC_ARG); - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, 0), 0); wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha256HmacUpdate */ /* @@ -16800,12 +16550,10 @@ */ static int test_wc_Sha384HmacUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && defined(WOLFSSL_SHA384) Hmac hmac; testVector a, b; - int ret; - int flag = 0; #ifdef HAVE_FIPS const char* keys = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; @@ -16815,62 +16563,26 @@ a.input = "what do ya want for nothing?"; a.inLen = XSTRLEN(a.input); - b.input = "Hi There"; b.inLen = XSTRLEN(b.input); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_SHA384, (byte*)keys, (word32)XSTRLEN(keys)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA384, (byte*)keys, + (word32)XSTRLEN(keys)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)b.input, (word32)b.inLen), 0); /* Update Hmac. */ - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); /* Test bad args. */ - if (!flag) { - ret = wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, NULL, (word32)a.inLen); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacUpdate(NULL, (byte*)a.input, (word32)a.inLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HmacUpdate(&hmac, NULL, (word32)a.inLen), BAD_FUNC_ARG); - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, 0); - if (ret != 0) { - flag = ret; - } - } + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, 0), 0); wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha384HmacUpdate */ /* @@ -16879,14 +16591,12 @@ static int test_wc_Md5HmacFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_MD5) && !(defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 5)) Hmac hmac; byte hash[WC_MD5_DIGEST_SIZE]; testVector a; - int ret; const char* key; - int flag = 0; key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; a.input = "Hi There"; @@ -16895,60 +16605,22 @@ a.inLen = XSTRLEN(a.input); a.outLen = XSTRLEN(a.output); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_MD5, (byte*)key, (word32)XSTRLEN(key)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_HmacFinal(&hmac, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_MD5_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_MD5, (byte*)key, (word32)XSTRLEN(key)), + 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_HmacFinal(&hmac, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_MD5_DIGEST_SIZE), 0); /* Try bad parameters. */ - if (!flag) { - ret = wc_HmacFinal(NULL, hash); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - + ExpectIntEQ(wc_HmacFinal(NULL, hash), BAD_FUNC_ARG); #ifndef HAVE_FIPS - if (!flag) { - ret = wc_HmacFinal(&hmac, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacFinal(&hmac, NULL), BAD_FUNC_ARG); #endif wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_Md5HmacFinal */ /* @@ -16956,13 +16628,11 @@ */ static int test_wc_ShaHmacFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_SHA) Hmac hmac; byte hash[WC_SHA_DIGEST_SIZE]; testVector a; - int ret; - int flag = 0; const char* key; key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b" @@ -16973,60 +16643,22 @@ a.inLen = XSTRLEN(a.input); a.outLen = XSTRLEN(a.output); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_SHA, (byte*)key, (word32)XSTRLEN(key)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_HmacFinal(&hmac, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA, (byte*)key, (word32)XSTRLEN(key)), + 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_HmacFinal(&hmac, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA_DIGEST_SIZE), 0); /* Try bad parameters. */ - if (!flag) { - ret = wc_HmacFinal(NULL, hash); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - + ExpectIntEQ(wc_HmacFinal(NULL, hash), BAD_FUNC_ARG); #ifndef HAVE_FIPS - if (!flag) { - ret = wc_HmacFinal(&hmac, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacFinal(&hmac, NULL), BAD_FUNC_ARG); #endif wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_ShaHmacFinal */ @@ -17035,13 +16667,11 @@ */ static int test_wc_Sha224HmacFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && defined(WOLFSSL_SHA224) Hmac hmac; byte hash[WC_SHA224_DIGEST_SIZE]; testVector a; - int ret; - int flag = 0; const char* key; key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b" @@ -17052,59 +16682,22 @@ a.inLen = XSTRLEN(a.input); a.outLen = XSTRLEN(a.output); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_SHA224, (byte*)key, (word32)XSTRLEN(key)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_HmacFinal(&hmac, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA224_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA224, (byte*)key, + (word32)XSTRLEN(key)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_HmacFinal(&hmac, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA224_DIGEST_SIZE), 0); /* Try bad parameters. */ - if (!flag) { - ret = wc_HmacFinal(NULL, hash); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - + ExpectIntEQ(wc_HmacFinal(NULL, hash), BAD_FUNC_ARG); #ifndef HAVE_FIPS - if (!flag) { - ret = wc_HmacFinal(&hmac, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacFinal(&hmac, NULL), BAD_FUNC_ARG); #endif wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha224HmacFinal */ /* @@ -17112,13 +16705,11 @@ */ static int test_wc_Sha256HmacFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && !defined(NO_SHA256) Hmac hmac; byte hash[WC_SHA256_DIGEST_SIZE]; testVector a; - int ret; - int flag = 0; const char* key; key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b" @@ -17130,59 +16721,22 @@ a.inLen = XSTRLEN(a.input); a.outLen = XSTRLEN(a.output); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return TEST_FAIL; - - ret = wc_HmacSetKey(&hmac, WC_SHA256, (byte*)key, (word32)XSTRLEN(key)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_HmacFinal(&hmac, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA256_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA256, (byte*)key, + (word32)XSTRLEN(key)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_HmacFinal(&hmac, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA256_DIGEST_SIZE), 0); /* Try bad parameters. */ - if (!flag) { - ret = wc_HmacFinal(NULL, hash); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } - + ExpectIntEQ(wc_HmacFinal(NULL, hash), BAD_FUNC_ARG); #ifndef HAVE_FIPS - if (!flag) { - ret = wc_HmacFinal(&hmac, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacFinal(&hmac, NULL), BAD_FUNC_ARG); #endif wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha256HmacFinal */ /* @@ -17190,13 +16744,11 @@ */ static int test_wc_Sha384HmacFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_HMAC) && defined(WOLFSSL_SHA384) Hmac hmac; byte hash[WC_SHA384_DIGEST_SIZE]; testVector a; - int ret; - int flag = 0; const char* key; key = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b" @@ -17209,58 +16761,22 @@ a.inLen = XSTRLEN(a.input); a.outLen = XSTRLEN(a.output); - flag = 0; - - ret = wc_HmacInit(&hmac, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_HmacSetKey(&hmac, WC_SHA384, (byte*)key, (word32)XSTRLEN(key)); - if (ret != 0) { - flag = ret; - } - - if (!flag) { - ret = wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - ret = wc_HmacFinal(&hmac, hash); - if (ret != 0) { - flag = ret; - } - } - - if (!flag) { - if (XMEMCMP(hash, a.output, WC_SHA384_DIGEST_SIZE) != 0) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacInit(&hmac, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_HmacSetKey(&hmac, WC_SHA384, (byte*)key, + (word32)XSTRLEN(key)), 0); + ExpectIntEQ(wc_HmacUpdate(&hmac, (byte*)a.input, (word32)a.inLen), 0); + ExpectIntEQ(wc_HmacFinal(&hmac, hash), 0); + ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA384_DIGEST_SIZE), 0); /* Try bad parameters. */ - if (!flag) { - ret = wc_HmacFinal(NULL, hash); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacFinal(NULL, hash), BAD_FUNC_ARG); #ifndef HAVE_FIPS - if (!flag) { - ret = wc_HmacFinal(&hmac, NULL); - if (ret != BAD_FUNC_ARG) { - flag = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_HmacFinal(&hmac, NULL), BAD_FUNC_ARG); #endif wc_HmacFree(&hmac); - - res = TEST_RES_CHECK(flag == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Sha384HmacFinal */ @@ -17270,9 +16786,11 @@ */ static int test_wc_InitCmac(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CMAC) && !defined(NO_AES) - Cmac cmac1, cmac2, cmac3; + Cmac cmac1; + Cmac cmac2; + Cmac cmac3; /* AES 128 key. */ byte key1[] = "\x01\x02\x03\x04\x05\x06\x07\x08" "\x09\x10\x11\x12\x13\x14\x15\x16"; @@ -17280,67 +16798,45 @@ byte key2[] = "\x01\x02\x03\x04\x05\x06\x07\x08" "\x09\x01\x11\x12\x13\x14\x15\x16" "\x01\x02\x03\x04\x05\x06\x07\x08"; - /* AES 256 key. */ byte key3[] = "\x01\x02\x03\x04\x05\x06\x07\x08" "\x09\x01\x11\x12\x13\x14\x15\x16" "\x01\x02\x03\x04\x05\x06\x07\x08" "\x09\x01\x11\x12\x13\x14\x15\x16"; - word32 key1Sz = (word32)sizeof(key1) - 1; word32 key2Sz = (word32)sizeof(key2) - 1; word32 key3Sz = (word32)sizeof(key3) - 1; int type = WC_CMAC_AES; - int ret = 0; + + (void)key1; + (void)key1Sz; + (void)key2; + (void)key2Sz; + + XMEMSET(&cmac1, 0, sizeof(Cmac)); + XMEMSET(&cmac2, 0, sizeof(Cmac)); + XMEMSET(&cmac3, 0, sizeof(Cmac)); #ifdef WOLFSSL_AES_128 - ret = wc_InitCmac(&cmac1, key1, key1Sz, type, NULL); + ExpectIntEQ(wc_InitCmac(&cmac1, key1, key1Sz, type, NULL), 0); #endif #ifdef WOLFSSL_AES_192 - if (ret == 0) { - wc_AesFree(&cmac1.aes); - ret = wc_InitCmac(&cmac2, key2, key2Sz, type, NULL); - } + wc_AesFree(&cmac1.aes); + ExpectIntEQ(wc_InitCmac(&cmac2, key2, key2Sz, type, NULL), 0); #endif #ifdef WOLFSSL_AES_256 - if (ret == 0) { - wc_AesFree(&cmac2.aes); - ret = wc_InitCmac(&cmac3, key3, key3Sz, type, NULL); - } + wc_AesFree(&cmac2.aes); + ExpectIntEQ(wc_InitCmac(&cmac3, key3, key3Sz, type, NULL), 0); #endif + wc_AesFree(&cmac3.aes); /* Test bad args. */ - if (ret == 0) { - wc_AesFree(&cmac3.aes); - ret = wc_InitCmac(NULL, key3, key3Sz, type, NULL); - if (ret == BAD_FUNC_ARG) { - ret = wc_InitCmac(&cmac3, NULL, key3Sz, type, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_InitCmac(&cmac3, key3, 0, type, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_InitCmac(&cmac3, key3, key3Sz, 0, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - (void)key1; - (void)key1Sz; - (void)key2; - (void)key2Sz; - (void)cmac1; - (void)cmac2; - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_InitCmac(NULL, key3, key3Sz, type, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_InitCmac(&cmac3, NULL, key3Sz, type, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_InitCmac(&cmac3, key3, 0, type, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_InitCmac(&cmac3, key3, key3Sz, 0, NULL), BAD_FUNC_ARG); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_InitCmac */ @@ -17349,11 +16845,10 @@ */ static int test_wc_CmacUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_128) Cmac cmac; - byte key[] = - { + byte key[] = { 0x64, 0x4c, 0xbf, 0x12, 0x85, 0x9d, 0xf0, 0x55, 0x7e, 0xa9, 0x1f, 0x08, 0xe0, 0x51, 0xff, 0x27 }; @@ -17362,38 +16857,21 @@ "\xb3\x78\xcf\x85\x22\x41\x74\xd9" "\xa0\x97\x39\x71\x62\xf1\x8e\x8f" "\xf4"; - word32 inSz = (word32)sizeof(in) - 1; word32 keySz = (word32)sizeof(key); int type = WC_CMAC_AES; - int ret = 0; - ret = wc_InitCmac(&cmac, key, keySz, type, NULL); - if (ret != 0) { - return ret; - } + XMEMSET(&cmac, 0, sizeof(Cmac)); - ret = wc_CmacUpdate(&cmac, in, inSz); + ExpectIntEQ(wc_InitCmac(&cmac, key, keySz, type, NULL), 0); + ExpectIntEQ(wc_CmacUpdate(&cmac, in, inSz), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_CmacUpdate(NULL, in, inSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_CmacUpdate(&cmac, NULL, 30); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - wc_AesFree(&cmac.aes); - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_CmacUpdate(NULL, in, inSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_CmacUpdate(&cmac, NULL, 30), BAD_FUNC_ARG); + wc_AesFree(&cmac.aes); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_CmacUpdate */ @@ -17402,16 +16880,14 @@ */ static int test_wc_CmacFinal(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_128) Cmac cmac; - byte key[] = - { + byte key[] = { 0x64, 0x4c, 0xbf, 0x12, 0x85, 0x9d, 0xf0, 0x55, 0x7e, 0xa9, 0x1f, 0x08, 0xe0, 0x51, 0xff, 0x27 }; - byte msg[] = - { + byte msg[] = { 0xe2, 0xb4, 0xb6, 0xf9, 0x48, 0x44, 0x02, 0x64, 0x5c, 0x47, 0x80, 0x9e, 0xd5, 0xa8, 0x3a, 0x17, 0xb3, 0x78, 0xcf, 0x85, 0x22, 0x41, 0x74, 0xd9, @@ -17422,8 +16898,7 @@ * http://csrc.nist.gov/groups/STM/cavp/block-cipher-modes.html#cmac * Per RFC4493 truncation of lsb is possible. */ - byte expMac[] = - { + byte expMac[] = { 0x4e, 0x6e, 0xc5, 0x6f, 0xf9, 0x5d, 0x0e, 0xae, 0x1c, 0xf8, 0x3e, 0xfc, 0xf4, 0x4b, 0xeb }; @@ -17434,43 +16909,33 @@ word32 badMacSz = 17; int expMacSz = sizeof(expMac); int type = WC_CMAC_AES; - int ret = 0; + XMEMSET(&cmac, 0, sizeof(Cmac)); XMEMSET(mac, 0, macSz); - ret = wc_InitCmac(&cmac, key, keySz, type, NULL); - if (ret != 0) { - return ret; - } - ret = wc_CmacUpdate(&cmac, msg, msgSz); + ExpectIntEQ(wc_InitCmac(&cmac, key, keySz, type, NULL), 0); + ExpectIntEQ(wc_CmacUpdate(&cmac, msg, msgSz), 0); - if (ret == 0) { - ret = wc_CmacFinal(&cmac, mac, &macSz); - if (ret == 0 && XMEMCMP(mac, expMac, expMacSz) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - /* Pass in bad args. */ - if (ret == 0) { - ret = wc_CmacFinal(NULL, mac, &macSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_CmacFinal(&cmac, NULL, &macSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_CmacFinal(&cmac, mac, &badMacSz); - if (ret == BUFFER_E) { - ret = 0; - } - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } +#if (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + /* Pass in bad args. */ + ExpectIntEQ(wc_CmacFinalNoFree(NULL, mac, &macSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_CmacFinalNoFree(&cmac, NULL, &macSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_CmacFinalNoFree(&cmac, mac, &badMacSz), BUFFER_E); + + /* For the last call, use the API with implicit wc_CmacFree(). */ + ExpectIntEQ(wc_CmacFinal(&cmac, mac, &macSz), 0); + ExpectIntEQ(XMEMCMP(mac, expMac, expMacSz), 0); +#else /* !HAVE_FIPS || FIPS>=5.3 */ + ExpectIntEQ(wc_CmacFinal(&cmac, mac, &macSz), 0); + ExpectIntEQ(XMEMCMP(mac, expMac, expMacSz), 0); - res = TEST_RES_CHECK(ret == 0); + /* Pass in bad args. */ + ExpectIntEQ(wc_CmacFinal(NULL, mac, &macSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_CmacFinal(&cmac, NULL, &macSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_CmacFinal(&cmac, mac, &badMacSz), BUFFER_E); +#endif /* !HAVE_FIPS || FIPS>=5.3 */ #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_CmacFinal */ @@ -17479,11 +16944,9 @@ */ static int test_wc_AesCmacGenerate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_128) - Cmac cmac; - byte key[] = - { + byte key[] = { 0x26, 0xef, 0x8b, 0x40, 0x34, 0x11, 0x7d, 0x9e, 0xbe, 0xc0, 0xc7, 0xfc, 0x31, 0x08, 0x54, 0x69 }; @@ -17496,77 +16959,36 @@ word32 macSz = sizeof(mac); word32 msgSz = sizeof(msg) - 1; word32 expMacSz = sizeof(expMac) - 1; - int type = WC_CMAC_AES; - int ret = 0; XMEMSET(mac, 0, macSz); - ret = wc_InitCmac(&cmac, key, keySz, type, NULL); - if (ret != 0) { - return ret; - } - - ret = wc_CmacUpdate(&cmac, msg, msgSz); - if (ret != 0) { - return ret; - } - else { - wc_AesFree(&cmac.aes); - } + ExpectIntEQ(wc_AesCmacGenerate(mac, &macSz, msg, msgSz, key, keySz), 0); + ExpectIntEQ(XMEMCMP(mac, expMac, expMacSz), 0); - ret = wc_AesCmacGenerate(mac, &macSz, msg, msgSz, key, keySz); - if (ret == 0 && XMEMCMP(mac, expMac, expMacSz) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } /* Pass in bad args. */ - if (ret == 0) { - ret = wc_AesCmacGenerate(NULL, &macSz, msg, msgSz, key, keySz); - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCmacGenerate(mac, &macSz, msg, msgSz, NULL, keySz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCmacGenerate(mac, &macSz, msg, msgSz, key, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCmacGenerate(mac, &macSz, NULL, msgSz, key, keySz); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (ret == 0) { - ret = wc_AesCmacVerify(mac, macSz, msg, msgSz, key, keySz); - /* Test bad args. */ - if (ret == 0) { - ret = wc_AesCmacVerify(NULL, macSz, msg, msgSz, key, keySz); - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCmacVerify(mac, 0, msg, msgSz, key, keySz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCmacVerify(mac, macSz, msg, msgSz, NULL, keySz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCmacVerify(mac, macSz, msg, msgSz, key, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCmacVerify(mac, macSz, NULL, msgSz, key, keySz); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_AesCmacGenerate(NULL, &macSz, msg, msgSz, key, keySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCmacGenerate(mac, &macSz, msg, msgSz, NULL, keySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCmacGenerate(mac, &macSz, msg, msgSz, key, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCmacGenerate(mac, &macSz, NULL, msgSz, key, keySz), + BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_AesCmacVerify(mac, macSz, msg, msgSz, key, keySz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_AesCmacVerify(NULL, macSz, msg, msgSz, key, keySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCmacVerify(mac, 0, msg, msgSz, key, keySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCmacVerify(mac, macSz, msg, msgSz, NULL, keySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCmacVerify(mac, macSz, msg, msgSz, key, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCmacVerify(mac, macSz, NULL, msgSz, key, keySz), + BAD_FUNC_ARG); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_AesCmacGenerate */ @@ -17576,10 +16998,9 @@ */ static int test_wc_AesGcmStream(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(WOLFSSL_AES_128) && defined(HAVE_AESGCM) && \ defined(WOLFSSL_AESGCM_STREAM) - int ret = 0; int i; WC_RNG rng[1]; Aes aesEnc[1]; @@ -17605,179 +17026,884 @@ 0xe0, 0x31, 0x57, 0x60, 0xb7, 0x92, 0xa3, 0x6d }; + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(&aesEnc, 0, sizeof(Aes)); + XMEMSET(&aesDec, 0, sizeof(Aes)); + /* Create a random for generating IV/nonce. */ - AssertIntEQ(wc_InitRng(rng), 0); + ExpectIntEQ(wc_InitRng(rng), 0); /* Initialize data structures. */ - AssertIntEQ(wc_AesInit(aesEnc, NULL, INVALID_DEVID), 0); - AssertIntEQ(wc_AesInit(aesDec, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesInit(aesEnc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesInit(aesDec, NULL, INVALID_DEVID), 0); /* BadParameters to streaming init. */ - AssertIntEQ(wc_AesGcmEncryptInit(NULL, NULL, 0, NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptInit(NULL, NULL, 0, NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptInit(aesEnc, NULL, AES_128_KEY_SIZE, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptInit(aesEnc, NULL, 0, NULL, GCM_NONCE_MID_SZ), - BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptInit(NULL, NULL, 0, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptInit(NULL, NULL, 0, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptInit(aesEnc, NULL, AES_128_KEY_SIZE, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptInit(aesEnc, NULL, 0, NULL, GCM_NONCE_MID_SZ), + BAD_FUNC_ARG); /* Bad parameters to encrypt update. */ - AssertIntEQ(wc_AesGcmEncryptUpdate(NULL, NULL, NULL, 0, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 1, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, in, 1, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, NULL, 1, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, NULL, 1), - BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptUpdate(NULL, NULL, NULL, 0, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 1, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, in, 1, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, NULL, 1, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, NULL, 1), + BAD_FUNC_ARG); /* Bad parameters to decrypt update. */ - AssertIntEQ(wc_AesGcmDecryptUpdate(NULL, NULL, NULL, 0, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 1, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, in, 1, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, out, NULL, 1, NULL, 0), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, NULL, 1), - BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptUpdate(NULL, NULL, NULL, 0, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 1, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, in, 1, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, out, NULL, 1, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, NULL, 1), + BAD_FUNC_ARG); /* Bad parameters to encrypt final. */ - AssertIntEQ(wc_AesGcmEncryptFinal(NULL, NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptFinal(NULL, tag, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptFinal(NULL, NULL, AES_BLOCK_SIZE), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, NULL, AES_BLOCK_SIZE), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE + 1), - BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptFinal(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptFinal(NULL, tag, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptFinal(NULL, NULL, AES_BLOCK_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, NULL, AES_BLOCK_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE + 1), + BAD_FUNC_ARG); /* Bad parameters to decrypt final. */ - AssertIntEQ(wc_AesGcmDecryptFinal(NULL, NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptFinal(NULL, tag, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptFinal(NULL, NULL, AES_BLOCK_SIZE), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, NULL, AES_BLOCK_SIZE), - BAD_FUNC_ARG); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE + 1), - BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptFinal(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptFinal(NULL, tag, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptFinal(NULL, NULL, AES_BLOCK_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, NULL, AES_BLOCK_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE + 1), + BAD_FUNC_ARG); /* Check calling final before setting key fails. */ - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, sizeof(tag)), MISSING_KEY); - AssertIntEQ(wc_AesGcmEncryptFinal(aesDec, tag, sizeof(tag)), MISSING_KEY); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, sizeof(tag)), MISSING_KEY); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesDec, tag, sizeof(tag)), MISSING_KEY); /* Check calling update before setting key else fails. */ - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad, 1), - MISSING_KEY); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad, 1), - MISSING_KEY); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad, 1), + MISSING_KEY); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad, 1), + MISSING_KEY); /* Set key but not IV. */ - AssertIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), NULL, 0), 0); - AssertIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), NULL, 0), 0); + ExpectIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), NULL, 0), 0); + ExpectIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), NULL, 0), 0); /* Check calling final before setting IV fails. */ - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, sizeof(tag)), MISSING_IV); - AssertIntEQ(wc_AesGcmEncryptFinal(aesDec, tag, sizeof(tag)), MISSING_IV); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, sizeof(tag)), MISSING_IV); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesDec, tag, sizeof(tag)), MISSING_IV); /* Check calling update before setting IV else fails. */ - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad, 1), - MISSING_IV); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad, 1), - MISSING_IV); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad, 1), + MISSING_IV); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad, 1), + MISSING_IV); /* Set IV using fixed part IV and external IV APIs. */ - AssertIntEQ(wc_AesGcmSetIV(aesEnc, GCM_NONCE_MID_SZ, iv, AES_IV_FIXED_SZ, - rng), 0); - AssertIntEQ(wc_AesGcmEncryptInit_ex(aesEnc, NULL, 0, ivOut, - GCM_NONCE_MID_SZ), 0); - AssertIntEQ(wc_AesGcmSetExtIV(aesDec, ivOut, GCM_NONCE_MID_SZ), 0); - AssertIntEQ(wc_AesGcmInit(aesDec, NULL, 0, NULL, 0), 0); + ExpectIntEQ(wc_AesGcmSetIV(aesEnc, GCM_NONCE_MID_SZ, iv, AES_IV_FIXED_SZ, + rng), 0); + ExpectIntEQ(wc_AesGcmEncryptInit_ex(aesEnc, NULL, 0, ivOut, + GCM_NONCE_MID_SZ), 0); + ExpectIntEQ(wc_AesGcmSetExtIV(aesDec, ivOut, GCM_NONCE_MID_SZ), 0); + ExpectIntEQ(wc_AesGcmInit(aesDec, NULL, 0, NULL, 0), 0); /* Encrypt and decrypt data. */ - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, in, 1, aad, 1), 0); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain, out, 1, aad, 1), 0); - AssertIntEQ(XMEMCMP(plain, in, 1), 0); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, in, 1, aad, 1), 0); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain, out, 1, aad, 1), 0); + ExpectIntEQ(XMEMCMP(plain, in, 1), 0); /* Finalize and check tag matches. */ - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); /* Set key and IV through streaming init API. */ - AssertIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); - AssertIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); + wc_AesFree(aesEnc); + wc_AesFree(aesDec); + ExpectIntEQ(wc_AesInit(aesEnc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesInit(aesDec, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); + ExpectIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); /* Encrypt/decrypt one block and AAD of one block. */ - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, in, AES_BLOCK_SIZE, aad, - AES_BLOCK_SIZE), 0); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain, out, AES_BLOCK_SIZE, aad, - AES_BLOCK_SIZE), 0); - AssertIntEQ(XMEMCMP(plain, in, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, in, AES_BLOCK_SIZE, aad, + AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain, out, AES_BLOCK_SIZE, aad, + AES_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(plain, in, AES_BLOCK_SIZE), 0); /* Finalize and check tag matches. */ - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); /* Set key and IV through streaming init API. */ - AssertIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); - AssertIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); + wc_AesFree(aesEnc); + wc_AesFree(aesDec); + ExpectIntEQ(wc_AesInit(aesEnc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesInit(aesDec, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); + ExpectIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); /* No data to encrypt/decrypt one byte of AAD. */ - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad, 1), 0); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad, 1), 0); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad, 1), 0); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad, 1), 0); /* Finalize and check tag matches. */ - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); - AssertIntEQ(XMEMCMP(tag, expTagAAD1, AES_BLOCK_SIZE), 0); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(tag, expTagAAD1, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); /* Set key and IV through streaming init API. */ - AssertIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); - AssertIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); + wc_AesFree(aesEnc); + wc_AesFree(aesDec); + ExpectIntEQ(wc_AesInit(aesEnc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesInit(aesDec, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); + ExpectIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); /* Encrypt/decrypt one byte and no AAD. */ - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, in, 1, NULL, 0), 0); - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain, out, 1, NULL, 0), 0); - AssertIntEQ(XMEMCMP(plain, in, 1), 0); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out, in, 1, NULL, 0), 0); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain, out, 1, NULL, 0), 0); + ExpectIntEQ(XMEMCMP(plain, in, 1), 0); /* Finalize and check tag matches. */ - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); - AssertIntEQ(XMEMCMP(tag, expTagPlain1, AES_BLOCK_SIZE), 0); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(tag, expTagPlain1, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); /* Set key and IV through streaming init API. */ - AssertIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); - AssertIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); + wc_AesFree(aesEnc); + wc_AesFree(aesDec); + ExpectIntEQ(wc_AesInit(aesEnc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesInit(aesDec, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesGcmInit(aesEnc, key, sizeof(key), iv, AES_IV_SIZE), 0); + ExpectIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); /* Encryption AES is one byte at a time */ for (i = 0; i < (int)sizeof(aad); i++) { - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad + i, 1), + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, NULL, NULL, 0, aad + i, 1), 0); } for (i = 0; i < (int)sizeof(in); i++) { - AssertIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out + i, in + i, 1, NULL, 0), - 0); + ExpectIntEQ(wc_AesGcmEncryptUpdate(aesEnc, out + i, in + i, 1, NULL, 0), + 0); } /* Decryption AES is two bytes at a time */ for (i = 0; i < (int)sizeof(aad); i += 2) { - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad + i, 2), + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, NULL, NULL, 0, aad + i, 2), 0); } for (i = 0; i < (int)sizeof(aad); i += 2) { - AssertIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain + i, out + i, 2, NULL, - 0), 0); + ExpectIntEQ(wc_AesGcmDecryptUpdate(aesDec, plain + i, out + i, 2, NULL, + 0), 0); } - AssertIntEQ(XMEMCMP(plain, in, sizeof(in)), 0); + ExpectIntEQ(XMEMCMP(plain, in, sizeof(in)), 0); /* Finalize and check tag matches. */ - AssertIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); - AssertIntEQ(XMEMCMP(tag, expTag, AES_BLOCK_SIZE), 0); - AssertIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmEncryptFinal(aesEnc, tag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(tag, expTag, AES_BLOCK_SIZE), 0); + ExpectIntEQ(wc_AesGcmDecryptFinal(aesDec, tag, AES_BLOCK_SIZE), 0); /* Check streaming encryption can be decrypted with one shot. */ - AssertIntEQ(wc_AesGcmSetKey(aesDec, key, sizeof(key)), 0); - AssertIntEQ(wc_AesGcmDecrypt(aesDec, plain, out, sizeof(in), iv, + wc_AesFree(aesDec); + ExpectIntEQ(wc_AesInit(aesDec, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesGcmInit(aesDec, key, sizeof(key), iv, AES_IV_SIZE), 0); + ExpectIntEQ(wc_AesGcmSetKey(aesDec, key, sizeof(key)), 0); + ExpectIntEQ(wc_AesGcmDecrypt(aesDec, plain, out, sizeof(in), iv, AES_IV_SIZE, tag, AES_BLOCK_SIZE, aad, sizeof(aad)), 0); - AssertIntEQ(XMEMCMP(plain, in, sizeof(in)), 0); + ExpectIntEQ(XMEMCMP(plain, in, sizeof(in)), 0); wc_AesFree(aesEnc); wc_AesFree(aesDec); wc_FreeRng(rng); +#endif + return EXPECT_RESULT(); +} /* END test_wc_AesGcmStream */ - res = TEST_RES_CHECK(ret == 0); + +/* + * Testing streaming SM4 API. + */ +static int test_wc_Sm4(void) +{ + int res = TEST_SKIPPED; +#ifdef WOLFSSL_SM4 + EXPECT_DECLS; + wc_Sm4 sm4; +#if defined(WOLFSSL_SM4_ECB) || defined(WOLFSSL_SM4_CBC) || \ + defined(WOLFSSL_SM4_CTR) || defined(WOLFSSL_SM4_CCM) + unsigned char key[SM4_KEY_SIZE]; +#endif +#if defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_CTR) + unsigned char iv[SM4_IV_SIZE]; +#endif + + /* Invalid parameters - wc_Sm4Init */ + ExpectIntEQ(wc_Sm4Init(NULL, NULL, INVALID_DEVID), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4Init */ + ExpectIntEQ(wc_Sm4Init(&sm4, NULL, INVALID_DEVID), 0); + +#if defined(WOLFSSL_SM4_ECB) || defined(WOLFSSL_SM4_CBC) || \ + defined(WOLFSSL_SM4_CTR) || defined(WOLFSSL_SM4_CCM) + XMEMSET(key, 0, sizeof(key)); + + /* Invalid parameters - wc_Sm4SetKey. */ + ExpectIntEQ(wc_Sm4SetKey(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(&sm4, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(NULL, key, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(NULL, NULL, SM4_KEY_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(&sm4, NULL, SM4_KEY_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(NULL, key, SM4_KEY_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, SM4_KEY_SIZE-1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, SM4_KEY_SIZE+1), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4SetKey. */ + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, SM4_KEY_SIZE), 0); +#endif + +#if defined(WOLFSSL_SM4_CBC) || defined(WOLFSSL_SM4_CTR) + XMEMSET(iv, 0, sizeof(iv)); + + /* Invalid parameters - wc_Sm4SetIV. */ + ExpectIntEQ(wc_Sm4SetIV(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetIV(&sm4, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4SetIV(NULL, iv), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4SetIV. */ + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); +#endif + + /* Valid cases - wc_Sm4Free */ + wc_Sm4Free(NULL); + wc_Sm4Free(&sm4); + + res = EXPECT_RESULT(); #endif return res; +} /* END test_wc_Sm4 */ -} /* END test_wc_AesGcmStream */ +/* + * Testing block based SM4-ECB API. + */ +static int test_wc_Sm4Ecb(void) +{ + int res = TEST_SKIPPED; +#ifdef WOLFSSL_SM4_ECB + EXPECT_DECLS; + wc_Sm4 sm4; + unsigned char key[SM4_KEY_SIZE]; + unsigned char in[SM4_BLOCK_SIZE * 2]; + unsigned char out[SM4_BLOCK_SIZE * 2]; + unsigned char out2[SM4_BLOCK_SIZE]; + + XMEMSET(key, 0, sizeof(key)); + XMEMSET(in, 0, sizeof(in)); + + ExpectIntEQ(wc_Sm4Init(&sm4, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, out, in, 0), MISSING_KEY); + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, out, in, 0), MISSING_KEY); + + /* Tested in test_wc_Sm4. */ + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, SM4_KEY_SIZE), 0); + + /* Invalid parameters - wc_Sm4EcbEncrypt. */ + ExpectIntEQ(wc_Sm4EcbEncrypt(NULL, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(NULL, out, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(NULL, NULL, in, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(NULL, NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(NULL, out, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, NULL, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, out, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, out, in, 1), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4EcbEncrypt. */ + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, out, in, 0), 0); + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, out2, in, SM4_BLOCK_SIZE), 0); + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(out, out2, SM4_BLOCK_SIZE), 0); + /* In and out are same pointer. */ + ExpectIntEQ(wc_Sm4EcbEncrypt(&sm4, in, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(in, out, SM4_BLOCK_SIZE * 2), 0); + + /* Invalid parameters - wc_Sm4EcbDecrypt. */ + ExpectIntEQ(wc_Sm4EcbDecrypt(NULL, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(NULL, out, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(NULL, NULL, in, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(NULL, NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(NULL, out, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, NULL, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, out, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, out, in, 1), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4EcbDecrypt. */ + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, out, in, 0), 0); + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, out2, in, SM4_BLOCK_SIZE), 0); + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(out, out2, SM4_BLOCK_SIZE), 0); + /* In and out are same pointer. */ + ExpectIntEQ(wc_Sm4EcbDecrypt(&sm4, in, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(in, out, SM4_BLOCK_SIZE * 2), 0); + + wc_Sm4Free(&sm4); + + res = EXPECT_RESULT(); +#endif + return res; +} /* END test_wc_Sm4Ecb */ + +/* + * Testing block based SM4-CBC API. + */ +static int test_wc_Sm4Cbc(void) +{ + int res = TEST_SKIPPED; +#ifdef WOLFSSL_SM4_CBC + EXPECT_DECLS; + wc_Sm4 sm4; + unsigned char key[SM4_KEY_SIZE]; + unsigned char iv[SM4_IV_SIZE]; + unsigned char in[SM4_BLOCK_SIZE * 2]; + unsigned char out[SM4_BLOCK_SIZE * 2]; + unsigned char out2[SM4_BLOCK_SIZE]; + + XMEMSET(key, 0, sizeof(key)); + XMEMSET(iv, 0, sizeof(iv)); + XMEMSET(in, 0, sizeof(in)); + + ExpectIntEQ(wc_Sm4Init(&sm4, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, out, in, 0), MISSING_KEY); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, out, in, 0), MISSING_KEY); + /* Tested in test_wc_Sm4. */ + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, SM4_KEY_SIZE), 0); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, out, in, 0), MISSING_IV); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, out, in, 0), MISSING_IV); + /* Tested in test_wc_Sm4. */ + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + + /* Invalid parameters - wc_Sm4CbcEncrypt. */ + ExpectIntEQ(wc_Sm4CbcEncrypt(NULL, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(NULL, out, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(NULL, NULL, in, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(NULL, NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(NULL, out, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, NULL, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, out, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, out, in, 1), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4CbcEncrypt. */ + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, out, in, 0), 0); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, out2, in, SM4_BLOCK_SIZE), 0); + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(out, out2, SM4_BLOCK_SIZE), 0); + /* In and out are same pointer. */ + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CbcEncrypt(&sm4, in, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(in, out, SM4_BLOCK_SIZE * 2), 0); + + /* Invalid parameters - wc_Sm4CbcDecrypt. */ + ExpectIntEQ(wc_Sm4CbcDecrypt(NULL, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, NULL, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(NULL, out, NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(NULL, NULL, in, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(NULL, NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(NULL, out, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, NULL, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, out, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, out, in, 1), BAD_FUNC_ARG); + + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + /* Valid cases - wc_Sm4CbcDecrypt. */ + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, out, in, 0), 0); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, out2, in, SM4_BLOCK_SIZE), 0); + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(out, out2, SM4_BLOCK_SIZE), 0); + /* In and out are same pointer. */ + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CbcDecrypt(&sm4, in, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(in, out, SM4_BLOCK_SIZE * 2), 0); + + wc_Sm4Free(&sm4); + + res = EXPECT_RESULT(); +#endif + return res; +} /* END test_wc_Sm4Cbc */ + +/* + * Testing streaming SM4-CTR API. + */ +static int test_wc_Sm4Ctr(void) +{ + int res = TEST_SKIPPED; +#ifdef WOLFSSL_SM4_CTR + EXPECT_DECLS; + wc_Sm4 sm4; + unsigned char key[SM4_KEY_SIZE]; + unsigned char iv[SM4_IV_SIZE]; + unsigned char in[SM4_BLOCK_SIZE * 4]; + unsigned char out[SM4_BLOCK_SIZE * 4]; + unsigned char out2[SM4_BLOCK_SIZE * 4]; + word32 chunk; + word32 i; + + XMEMSET(key, 0, sizeof(key)); + XMEMSET(iv, 0, sizeof(iv)); + XMEMSET(in, 0, sizeof(in)); + + ExpectIntEQ(wc_Sm4Init(&sm4, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, in, 0), MISSING_KEY); + /* Tested in test_wc_Sm4. */ + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, SM4_KEY_SIZE), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, in, 0), MISSING_IV); + /* Tested in test_wc_Sm4. */ + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + + /* Invalid parameters - wc_Sm4CtrEncrypt. */ + ExpectIntEQ(wc_Sm4CtrEncrypt(NULL, NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CtrEncrypt(NULL, out, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CtrEncrypt(NULL, NULL, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, NULL, in, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CtrEncrypt(NULL, out, in, 0), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4CtrEncrypt. */ + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, in, 0), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out2, in, 1), 0); + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, in, 2), 0); + ExpectIntEQ(XMEMCMP(out, out2, 1), 0); + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out2, in, SM4_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(out2, out, 2), 0); + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(out, out2, SM4_BLOCK_SIZE), 0); + /* In and out are same pointer. Also check encrypt of cipher text produces + * plaintext. + */ + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, out, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(in, out, SM4_BLOCK_SIZE * 2), 0); + + /* Chunking tests. */ + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out2, in, (word32)sizeof(in)), 0); + for (chunk = 1; chunk <= SM4_BLOCK_SIZE + 1; chunk++) { + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + for (i = 0; i + chunk <= (word32)sizeof(in); i += chunk) { + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out + i, in + i, chunk), 0); + } + if (i < (word32)sizeof(in)) { + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out + i, in + i, + (word32)sizeof(in) - i), 0); + } + ExpectIntEQ(XMEMCMP(out, out2, (word32)sizeof(out)), 0); + } + + for (i = 0; i < (word32)sizeof(iv); i++) { + iv[i] = 0xff; + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(wc_Sm4SetIV(&sm4, iv), 0); + ExpectIntEQ(wc_Sm4CtrEncrypt(&sm4, out2, out, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(XMEMCMP(out2, in, SM4_BLOCK_SIZE * 2), 0); + } + + wc_Sm4Free(&sm4); + + res = EXPECT_RESULT(); +#endif + return res; +} /* END test_wc_Sm4Ctr */ + +/* + * Testing stream SM4-GCM API. + */ +static int test_wc_Sm4Gcm(void) +{ + int res = TEST_SKIPPED; +#ifdef WOLFSSL_SM4_GCM + EXPECT_DECLS; + wc_Sm4 sm4; + unsigned char key[SM4_KEY_SIZE]; + unsigned char nonce[GCM_NONCE_MAX_SZ]; + unsigned char in[SM4_BLOCK_SIZE * 2]; + unsigned char in2[SM4_BLOCK_SIZE * 2]; + unsigned char out[SM4_BLOCK_SIZE * 2]; + unsigned char out2[SM4_BLOCK_SIZE * 2]; + unsigned char dec[SM4_BLOCK_SIZE * 2]; + unsigned char tag[SM4_BLOCK_SIZE]; + unsigned char aad[SM4_BLOCK_SIZE * 2]; + word32 i; + + XMEMSET(key, 0, sizeof(key)); + XMEMSET(nonce, 0, sizeof(nonce)); + XMEMSET(in, 0, sizeof(in)); + XMEMSET(in2, 0, sizeof(in2)); + XMEMSET(aad, 0, sizeof(aad)); + + ExpectIntEQ(wc_Sm4Init(&sm4, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 0, nonce, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), MISSING_KEY); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, in, 0, nonce, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), MISSING_KEY); + + /* Invalid parameters - wc_Sm4GcmSetKey. */ + ExpectIntEQ(wc_Sm4GcmSetKey(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmSetKey(&sm4, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmSetKey(NULL, key, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmSetKey(NULL, NULL, SM4_KEY_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmSetKey(&sm4, key, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmSetKey(&sm4, NULL, SM4_KEY_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmSetKey(NULL, key, SM4_KEY_SIZE), BAD_FUNC_ARG); + + /* Valid parameters - wc_Sm4GcmSetKey. */ + ExpectIntEQ(wc_Sm4GcmSetKey(&sm4, key, SM4_KEY_SIZE), 0); + + /* Invalid parameters - wc_Sm4GcmEncrypt. */ + ExpectIntEQ(wc_Sm4GcmEncrypt(NULL, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(NULL, out, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(NULL, NULL, in, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(NULL, NULL, NULL, 1, nonce, GCM_NONCE_MID_SZ, + NULL, 0, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(NULL, NULL, NULL, 1, NULL, 0, tag, + SM4_BLOCK_SIZE, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(NULL, out, in, 1, nonce, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, NULL, in, 1, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, NULL, 1, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 1, NULL, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 1, nonce, 0, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 1, nonce, GCM_NONCE_MID_SZ, + NULL, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 1, nonce, GCM_NONCE_MID_SZ, tag, + WOLFSSL_MIN_AUTH_TAG_SZ-1, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 1, nonce, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE+1, aad, sizeof(aad)), BAD_FUNC_ARG); + + /* Invalid parameters - wc_Sm4GcmDecrypt. */ + ExpectIntEQ(wc_Sm4GcmDecrypt(NULL, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(NULL, out, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(NULL, NULL, in, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(NULL, NULL, NULL, 1, nonce, GCM_NONCE_MID_SZ, + NULL, 0, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(NULL, NULL, NULL, 1, NULL, 0, tag, + SM4_BLOCK_SIZE, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(NULL, out, in, 1, nonce, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, NULL, in, 1, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, NULL, 1, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, in, 1, NULL, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, in, 1, nonce, 0, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, in, 1, nonce, GCM_NONCE_MID_SZ, + NULL, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, in, 1, nonce, GCM_NONCE_MID_SZ, tag, + WOLFSSL_MIN_AUTH_TAG_SZ-1, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, in, 1, nonce, GCM_NONCE_MID_SZ, tag, + SM4_BLOCK_SIZE+1, aad, sizeof(aad)), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4GcmEncrypt/wc_Sm4GcmDecrypt. */ + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, NULL, NULL, 0, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, NULL, NULL, 0, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, NULL, NULL, 0, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, NULL, NULL, 0, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, NULL, 1), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, NULL, 1), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE * 2, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, in2, in2, SM4_BLOCK_SIZE * 2, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(in2, out, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in2, in2, SM4_BLOCK_SIZE * 2, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(in2, in, SM4_BLOCK_SIZE * 2), 0); + + /* Check vald values of nonce - wc_Sm4GcmEncrypt/wc_Sm4GcmDecrypt. */ + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2, nonce, + GCM_NONCE_MIN_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE * 2, nonce, + GCM_NONCE_MIN_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE * 2, nonce, + GCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), + SM4_GCM_AUTH_E); + + /* Check valid values of tag size - wc_Sm4GcmEncrypt/wc_Sm4GcmDecrypt. */ + for (i = WOLFSSL_MIN_AUTH_TAG_SZ; i < SM4_BLOCK_SIZE; i++) { + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MID_SZ, tag, i, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + GCM_NONCE_MID_SZ, tag, i, aad, sizeof(aad)), 0); + } + + /* Check different in/out sizes. */ + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 0, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, out, in, 0, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, 1, nonce, + GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + for (i = 2; i <= SM4_BLOCK_SIZE * 2; i++) { + XMEMCPY(out2, out, i - 1); + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, out, in, i, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(out, out2, i - 1), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, dec, out, i, nonce, GCM_NONCE_MID_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(in, dec, i), 0); + } + + /* Force the counter to roll over in first byte. */ + { + static unsigned char largeIn[256 * SM4_BLOCK_SIZE]; + static unsigned char largeOut[256 * SM4_BLOCK_SIZE]; + + ExpectIntEQ(wc_Sm4GcmEncrypt(&sm4, largeOut, largeIn, sizeof(largeIn), + nonce, GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4GcmDecrypt(&sm4, largeOut, largeOut, sizeof(largeIn), + nonce, GCM_NONCE_MID_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(largeOut, largeIn, sizeof(largeIn)), 0); + } + + wc_Sm4Free(&sm4); + + res = EXPECT_RESULT(); +#endif + return res; +} /* END test_wc_Sm4Gcm */ + +/* + * Testing stream SM4-CCM API. + */ +static int test_wc_Sm4Ccm(void) +{ + int res = TEST_SKIPPED; +#ifdef WOLFSSL_SM4_CCM + EXPECT_DECLS; + wc_Sm4 sm4; + unsigned char key[SM4_KEY_SIZE]; + unsigned char nonce[CCM_NONCE_MAX_SZ]; + unsigned char in[SM4_BLOCK_SIZE * 2]; + unsigned char in2[SM4_BLOCK_SIZE * 2]; + unsigned char out[SM4_BLOCK_SIZE * 2]; + unsigned char out2[SM4_BLOCK_SIZE * 2]; + unsigned char dec[SM4_BLOCK_SIZE * 2]; + unsigned char tag[SM4_BLOCK_SIZE]; + unsigned char aad[SM4_BLOCK_SIZE * 2]; + word32 i; + + XMEMSET(key, 0, sizeof(key)); + XMEMSET(nonce, 0, sizeof(nonce)); + XMEMSET(in, 0, sizeof(in)); + XMEMSET(in2, 0, sizeof(in2)); + XMEMSET(aad, 0, sizeof(aad)); + + ExpectIntEQ(wc_Sm4Init(&sm4, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 0, nonce, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), MISSING_KEY); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, in, 0, nonce, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), MISSING_KEY); + ExpectIntEQ(wc_Sm4SetKey(&sm4, key, SM4_KEY_SIZE), 0); + + /* Invalid parameters - wc_Sm4CcmEncrypt. */ + ExpectIntEQ(wc_Sm4CcmEncrypt(NULL, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(NULL, out, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(NULL, NULL, in, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(NULL, NULL, NULL, 1, nonce, CCM_NONCE_MAX_SZ, + NULL, 0, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(NULL, NULL, NULL, 1, NULL, 0, tag, + SM4_BLOCK_SIZE, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(NULL, out, in, 1, nonce, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, NULL, in, 1, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, NULL, 1, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 1, NULL, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 1, nonce, 0, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 1, nonce, CCM_NONCE_MAX_SZ, + NULL, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 1, nonce, CCM_NONCE_MAX_SZ, tag, + WOLFSSL_MIN_AUTH_TAG_SZ-1, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 1, nonce, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE+1, aad, sizeof(aad)), BAD_FUNC_ARG); + + /* Invalid parameters - wc_Sm4CcmDecrypt. */ + ExpectIntEQ(wc_Sm4CcmDecrypt(NULL, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, NULL, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(NULL, out, NULL, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(NULL, NULL, in, 1, NULL, 0, NULL, 0, NULL, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(NULL, NULL, NULL, 1, nonce, CCM_NONCE_MAX_SZ, + NULL, 0, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(NULL, NULL, NULL, 1, NULL, 0, tag, + SM4_BLOCK_SIZE, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(NULL, out, in, 1, nonce, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, NULL, in, 1, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, NULL, 1, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, in, 1, NULL, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, in, 1, nonce, 0, tag, + SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, in, 1, nonce, CCM_NONCE_MAX_SZ, + NULL, SM4_BLOCK_SIZE, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, in, 1, nonce, CCM_NONCE_MAX_SZ, tag, + WOLFSSL_MIN_AUTH_TAG_SZ - 1, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, in, 1, nonce, CCM_NONCE_MAX_SZ, tag, + SM4_BLOCK_SIZE + 1, aad, sizeof(aad)), BAD_FUNC_ARG); + + /* Valid cases - wc_Sm4CcmEncrypt/wc_Sm4CcmDecrypt. */ + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, NULL, NULL, 0, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, NULL, NULL, 0, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, NULL, NULL, 0, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, NULL, NULL, 0, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, NULL, 1), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, NULL, 1), 0); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE * 2, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE * 2, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, in2, in2, SM4_BLOCK_SIZE * 2, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(in2, out, SM4_BLOCK_SIZE * 2), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in2, in2, SM4_BLOCK_SIZE * 2, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(in2, in, SM4_BLOCK_SIZE * 2), 0); + + /* Check vald values of nonce - wc_Sm4CcmEncrypt/wc_Sm4CcmDecrypt. */ + for (i = CCM_NONCE_MIN_SZ; i <= CCM_NONCE_MAX_SZ; i++) { + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + i, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + i, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + } + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MIN_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), + SM4_CCM_AUTH_E); + + /* Check invalid values of tag size - wc_Sm4CcmEncrypt/wc_Sm4CcmDecrypt. */ + for (i = 0; i < 4; i++) { + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, i * 2 + 1, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, i * 2 + 1, aad, sizeof(aad)), BAD_FUNC_ARG); + } + /* Odd values in range 4..SM4_BLOCK_SIZE. */ + for (i = 2; i < SM4_BLOCK_SIZE / 2; i++) { + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, i * 2 + 1, aad, sizeof(aad)), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, i * 2 + 1, aad, sizeof(aad)), BAD_FUNC_ARG); + } + /* Check valid values of tag size - wc_Sm4CcmEncrypt/wc_Sm4CcmDecrypt. + * Even values in range 4..SM4_BLOCK_SIZE. + */ + for (i = 2; i < SM4_BLOCK_SIZE / 2; i++) { + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, i * 2, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, in, out, SM4_BLOCK_SIZE, nonce, + CCM_NONCE_MAX_SZ, tag, i * 2, aad, sizeof(aad)), 0); + } + + /* Check different in/out sizes. */ + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 0, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, out, in, 0, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, 1, nonce, + CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, NULL, 0), 0); + for (i = 2; i <= SM4_BLOCK_SIZE * 2; i++) { + XMEMCPY(out2, out, i - 1); + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, out, in, i, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(out, out2, i - 1), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, dec, out, i, nonce, CCM_NONCE_MAX_SZ, + tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(in, dec, i), 0); + } + + /* Force the counter to roll over in first byte. */ + { + static unsigned char largeIn[256 * SM4_BLOCK_SIZE]; + static unsigned char largeOut[256 * SM4_BLOCK_SIZE]; + + ExpectIntEQ(wc_Sm4CcmEncrypt(&sm4, largeOut, largeIn, sizeof(largeIn), + nonce, CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(wc_Sm4CcmDecrypt(&sm4, largeOut, largeOut, sizeof(largeIn), + nonce, CCM_NONCE_MAX_SZ, tag, SM4_BLOCK_SIZE, aad, sizeof(aad)), 0); + ExpectIntEQ(XMEMCMP(largeOut, largeIn, sizeof(largeIn)), 0); + } + + wc_Sm4Free(&sm4); + + res = EXPECT_RESULT(); +#endif + return res; +} /* END test_wc_Sm4Ccm */ /* @@ -17785,55 +17911,36 @@ */ static int test_wc_Des3_SetIV(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_DES3 Des3 des; - int ret = 0; - const byte key[] = - { + const byte key[] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xde,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; - - const byte iv[] = - { + const byte iv[] = { 0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81 }; - ret = wc_Des3Init(&des, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + XMEMSET(&des, 0, sizeof(Des3)); - /* DES_ENCRYPTION or DES_DECRYPTION */ - ret = wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION); + ExpectIntEQ(wc_Des3Init(&des, NULL, INVALID_DEVID), 0); - if (ret == 0) { - if (XMEMCMP(iv, des.reg, DES_BLOCK_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + /* DES_ENCRYPTION or DES_DECRYPTION */ + ExpectIntEQ(wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION), 0); + ExpectIntEQ(XMEMCMP(iv, des.reg, DES_BLOCK_SIZE), 0); #ifndef HAVE_FIPS /* no sanity checks with FIPS wrapper */ /* Test explicitly wc_Des3_SetIV() */ - if (ret == 0) { - ret = wc_Des3_SetIV(NULL, iv); - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_SetIV(&des, NULL); - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Des3_SetIV(NULL, iv), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_SetIV(&des, NULL), 0); #endif - wc_Des3Free(&des); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Des3_SetIV */ @@ -17842,56 +17949,38 @@ */ static int test_wc_Des3_SetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_DES3 Des3 des; - int ret = 0; - const byte key[] = - { + const byte key[] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xde,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; - - const byte iv[] = - { + const byte iv[] = { 0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81 }; - ret = wc_Des3Init(&des, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + XMEMSET(&des, 0, sizeof(Des3)); + + ExpectIntEQ(wc_Des3Init(&des, NULL, INVALID_DEVID), 0); /* DES_ENCRYPTION or DES_DECRYPTION */ - ret = wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION); - if (ret == 0) { - if (XMEMCMP(iv, des.reg, DES_BLOCK_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION), 0); + ExpectIntEQ(XMEMCMP(iv, des.reg, DES_BLOCK_SIZE), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_Des3_SetKey(NULL, key, iv, DES_ENCRYPTION); - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_SetKey(&des, NULL, iv, DES_ENCRYPTION); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_SetKey(&des, key, iv, -1); - } - if (ret == BAD_FUNC_ARG) { - /* Default case. Should return 0. */ - ret = wc_Des3_SetKey(&des, key, NULL, DES_ENCRYPTION); - } - } /* END if ret != 0 */ + ExpectIntEQ(wc_Des3_SetKey(NULL, key, iv, DES_ENCRYPTION), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_SetKey(&des, NULL, iv, DES_ENCRYPTION), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_SetKey(&des, key, iv, -1), BAD_FUNC_ARG); + /* Default case. Should return 0. */ + ExpectIntEQ(wc_Des3_SetKey(&des, key, NULL, DES_ENCRYPTION), 0); wc_Des3Free(&des); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Des3_SetKey */ @@ -17901,94 +17990,50 @@ */ static int test_wc_Des3_CbcEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_DES3 Des3 des; - int ret = 0; byte cipher[24]; byte plain[24]; - - const byte key[] = - { + const byte key[] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xde,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; - - const byte iv[] = - { + const byte iv[] = { 0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81 }; - const byte vector[] = { /* "Now is the time for all " w/o trailing 0 */ 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 }; - ret = wc_Des3Init(&des, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION); + XMEMSET(&des, 0, sizeof(Des3)); - if (ret == 0) { - ret = wc_Des3_CbcEncrypt(&des, cipher, vector, 24); + ExpectIntEQ(wc_Des3Init(&des, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION), 0); - if (ret == 0) { - ret = wc_Des3_SetKey(&des, key, iv, DES_DECRYPTION); - } - if (ret == 0) { - ret = wc_Des3_CbcDecrypt(&des, plain, cipher, 24); - } - } - - if (ret == 0) { - if (XMEMCMP(plain, vector, 24) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Des3_CbcEncrypt(&des, cipher, vector, 24), 0); + ExpectIntEQ(wc_Des3_SetKey(&des, key, iv, DES_DECRYPTION), 0); + ExpectIntEQ(wc_Des3_CbcDecrypt(&des, plain, cipher, 24), 0); + ExpectIntEQ(XMEMCMP(plain, vector, 24), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_Des3_CbcEncrypt(NULL, cipher, vector, 24); - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcEncrypt(&des, NULL, vector, 24); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcEncrypt(&des, cipher, NULL, sizeof(vector)); - } - if (ret != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } + ExpectIntEQ(wc_Des3_CbcEncrypt(NULL, cipher, vector, 24), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcEncrypt(&des, NULL, vector, 24), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcEncrypt(&des, cipher, NULL, sizeof(vector)), + BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_Des3_CbcDecrypt(NULL, plain, cipher, 24); - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcDecrypt(&des, NULL, cipher, 24); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcDecrypt(&des, plain, NULL, 24); - } - if (ret != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } + ExpectIntEQ(wc_Des3_CbcDecrypt(NULL, plain, cipher, 24), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcDecrypt(&des, NULL, cipher, 24), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcDecrypt(&des, plain, NULL, 24), BAD_FUNC_ARG); wc_Des3Free(&des); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END wc_Des3_CbcEncrypt */ @@ -17997,166 +18042,101 @@ */ static int test_wc_Des3_CbcEncryptDecryptWithKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_DES3 - int ret = 0; word32 vectorSz, cipherSz; byte cipher[24]; byte plain[24]; - - byte vector[] = /* Now is the time for all w/o trailing 0 */ - { + byte vector[] = { /* Now is the time for all w/o trailing 0 */ 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 }; - - byte key[] = - { + byte key[] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xde,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; - - byte iv[] = - { + byte iv[] = { 0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81 }; - vectorSz = sizeof(byte) * 24; cipherSz = sizeof(byte) * 24; - ret = wc_Des3_CbcEncryptWithKey(cipher, vector, vectorSz, key, iv); - if (ret == 0) { - ret = wc_Des3_CbcDecryptWithKey(plain, cipher, cipherSz, key, iv); - if (ret == 0) { - if (XMEMCMP(plain, vector, 24) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_Des3_CbcEncryptWithKey(cipher, vector, vectorSz, key, iv), + 0); + ExpectIntEQ(wc_Des3_CbcDecryptWithKey(plain, cipher, cipherSz, key, iv), 0); + ExpectIntEQ(XMEMCMP(plain, vector, 24), 0); /* pass in bad args. */ - if (ret == 0) { - ret = wc_Des3_CbcEncryptWithKey(NULL, vector, vectorSz, key, iv); - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcEncryptWithKey(cipher, NULL, vectorSz, key, iv); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcEncryptWithKey(cipher, vector, vectorSz, NULL, iv); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcEncryptWithKey(cipher, vector, vectorSz, - key, NULL); - } - else { - /* Return code catch. */ - ret = WOLFSSL_FAILURE; - } - } - - if (ret == 0) { - ret = wc_Des3_CbcDecryptWithKey(NULL, cipher, cipherSz, key, iv); - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcDecryptWithKey(plain, NULL, cipherSz, key, iv); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcDecryptWithKey(plain, cipher, cipherSz, NULL, iv); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Des3_CbcDecryptWithKey(plain, cipher, cipherSz, key, NULL); - } - else { - ret = WOLFSSL_FAILURE; - } - } + ExpectIntEQ(wc_Des3_CbcEncryptWithKey(NULL, vector, vectorSz, key, iv), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcEncryptWithKey(cipher, NULL, vectorSz, key, iv), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcEncryptWithKey(cipher, vector, vectorSz, NULL, iv), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcEncryptWithKey(cipher, vector, vectorSz, key, NULL), + 0); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_Des3_CbcDecryptWithKey(NULL, cipher, cipherSz, key, iv), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcDecryptWithKey(plain, NULL, cipherSz, key, iv), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcDecryptWithKey(plain, cipher, cipherSz, NULL, iv), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_CbcDecryptWithKey(plain, cipher, cipherSz, key, NULL), + 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Des3_CbcEncryptDecryptWithKey */ /* * Unit test for wc_Des3_EcbEncrypt */ static int test_wc_Des3_EcbEncrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DES3) && defined(WOLFSSL_DES_ECB) Des3 des; - int ret = 0; byte cipher[24]; word32 cipherSz = sizeof(cipher); - - const byte key[] = - { + const byte key[] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xde,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; - - const byte iv[] = - { + const byte iv[] = { 0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81 }; - const byte vector[] = { /* "Now is the time for all " w/o trailing 0 */ 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 }; - ret = wc_Des3Init(&des, NULL, INVALID_DEVID); - if (ret != 0) { - return ret; - } - if (ret == 0 ) { - ret = wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION); - } + XMEMSET(&des, 0, sizeof(Des3)); + + ExpectIntEQ(wc_Des3Init(&des, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Des3_SetKey(&des, key, iv, DES_ENCRYPTION), 0); + /* Bad Cases */ - if (ret == 0) { - ret = wc_Des3_EcbEncrypt(NULL, cipher, vector, cipherSz); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Des3_EcbEncrypt(&des, 0, vector, cipherSz); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Des3_EcbEncrypt(&des, cipher, NULL, cipherSz); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Des3_EcbEncrypt(&des, cipher, vector, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Des3_EcbEncrypt(NULL, 0, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_Des3_EcbEncrypt(NULL, 0, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_EcbEncrypt(NULL, cipher, vector, cipherSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_EcbEncrypt(&des, 0, vector, cipherSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_EcbEncrypt(&des, cipher, NULL, cipherSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_Des3_EcbEncrypt(&des, cipher, vector, 0), 0); + /* Good Cases */ - if (ret == 0) { - ret = wc_Des3_EcbEncrypt(&des, cipher, vector, cipherSz); - } - wc_Des3Free(&des); + ExpectIntEQ(wc_Des3_EcbEncrypt(&des, cipher, vector, cipherSz), 0); - res = TEST_RES_CHECK(ret == 0); + wc_Des3Free(&des); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Des3_EcbEncrypt */ /* @@ -18164,51 +18144,29 @@ */ static int test_wc_Chacha_SetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_CHACHA - ChaCha ctx; - const byte key[] = - { + ChaCha ctx; + const byte key[] = { 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 }; - byte cipher[128]; - int ret = 0; + word32 keySz = (word32)(sizeof(key)/sizeof(byte)); + byte cipher[128]; - ret = wc_Chacha_SetKey(&ctx, key, (word32)(sizeof(key)/sizeof(byte))); + XMEMSET(cipher, 0, sizeof(cipher)); + ExpectIntEQ(wc_Chacha_SetKey(&ctx, key, keySz), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_Chacha_SetKey(NULL, key, (word32)(sizeof(key)/sizeof(byte))); - if (ret == BAD_FUNC_ARG) { - ret = wc_Chacha_SetKey(&ctx, key, 18); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (ret == 0) { - ret = wc_Chacha_SetIV(&ctx, cipher, 0); - } - if (ret == 0) { - /* Test bad args. */ - ret = wc_Chacha_SetIV(NULL, cipher, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FAILURE; - } - } + ExpectIntEQ(wc_Chacha_SetKey(NULL, key, keySz), BAD_FUNC_ARG); + ExpectIntEQ(wc_Chacha_SetKey(&ctx, key, 18), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_Chacha_SetIV(&ctx, cipher, 0), 0); + /* Test bad args. */ + ExpectIntEQ(wc_Chacha_SetIV(NULL, cipher, 0), BAD_FUNC_ARG); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Chacha_SetKey */ /* @@ -18216,9 +18174,9 @@ */ static int test_wc_Poly1305SetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_POLY1305 - Poly1305 ctx; + Poly1305 ctx; const byte key[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, @@ -18226,29 +18184,16 @@ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01 }; - int ret = 0; + word32 keySz = (word32)(sizeof(key)/sizeof(byte)); - ret = wc_Poly1305SetKey(&ctx, key, (word32)(sizeof(key)/sizeof(byte))); - /* Test bad args. */ - if (ret == 0) { - ret = wc_Poly1305SetKey(NULL, key, (word32)(sizeof(key)/sizeof(byte))); - if (ret == BAD_FUNC_ARG) { - ret = wc_Poly1305SetKey(&ctx, NULL, (word32)(sizeof(key)/sizeof(byte))); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Poly1305SetKey(&ctx, key, 18); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Poly1305SetKey(&ctx, key, keySz), 0); - res = TEST_RES_CHECK(ret == 0); + /* Test bad args. */ + ExpectIntEQ(wc_Poly1305SetKey(NULL, key,keySz), BAD_FUNC_ARG); + ExpectIntEQ(wc_Poly1305SetKey(&ctx, NULL, keySz), BAD_FUNC_ARG); + ExpectIntEQ(wc_Poly1305SetKey(&ctx, key, 18), BAD_FUNC_ARG); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Poly1305_SetKey() */ /* @@ -18256,7 +18201,7 @@ */ static int test_wc_Chacha_Process(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_CHACHA ChaCha enc, dec; byte cipher[128]; @@ -18271,47 +18216,35 @@ const char* input = "Everybody gets Friday off."; word32 keySz = sizeof(key)/sizeof(byte); unsigned long int inlen = XSTRLEN(input); - int ret = 0; - /*Initialize stack varialbes.*/ + /* Initialize stack variables. */ XMEMSET(cipher, 0, 128); XMEMSET(plain, 0, 128); - ret = wc_Chacha_SetKey(&enc, key, keySz); - AssertIntEQ(ret, 0); - ret = wc_Chacha_SetKey(&dec, key, keySz); - AssertIntEQ(ret, 0); - ret = wc_Chacha_SetIV(&enc, cipher, 0); - AssertIntEQ(ret, 0); - ret = wc_Chacha_SetIV(&dec, cipher, 0); - AssertIntEQ(ret, 0); + ExpectIntEQ(wc_Chacha_SetKey(&enc, key, keySz), 0); + ExpectIntEQ(wc_Chacha_SetKey(&dec, key, keySz), 0); + ExpectIntEQ(wc_Chacha_SetIV(&enc, cipher, 0), 0); + ExpectIntEQ(wc_Chacha_SetIV(&dec, cipher, 0), 0); - ret = wc_Chacha_Process(&enc, cipher, (byte*)input, (word32)inlen); - AssertIntEQ(ret, 0); - ret = wc_Chacha_Process(&dec, plain, cipher, (word32)inlen); - AssertIntEQ(ret, 0); - ret = XMEMCMP(input, plain, (int)inlen); - AssertIntEQ(ret, 0); + ExpectIntEQ(wc_Chacha_Process(&enc, cipher, (byte*)input, (word32)inlen), + 0); + ExpectIntEQ(wc_Chacha_Process(&dec, plain, cipher, (word32)inlen), 0); + ExpectIntEQ(XMEMCMP(input, plain, (int)inlen), 0); #if !defined(USE_INTEL_CHACHA_SPEEDUP) && !defined(WOLFSSL_ARMASM) /* test checking and using leftovers, currently just in C code */ - ret = wc_Chacha_SetIV(&enc, cipher, 0); - AssertIntEQ(ret, 0); - ret = wc_Chacha_SetIV(&dec, cipher, 0); - AssertIntEQ(ret, 0); + ExpectIntEQ(wc_Chacha_SetIV(&enc, cipher, 0), 0); + ExpectIntEQ(wc_Chacha_SetIV(&dec, cipher, 0), 0); - ret = wc_Chacha_Process(&enc, cipher, (byte*)input, (word32)inlen - 2); - AssertIntEQ(ret, 0); - ret = wc_Chacha_Process(&enc, cipher + (inlen - 2), - (byte*)input + (inlen - 2), 2); - AssertIntEQ(ret, 0); - ret = wc_Chacha_Process(&dec, plain, (byte*)cipher, (word32)inlen - 2); - AssertIntEQ(ret, 0); - ret = wc_Chacha_Process(&dec, cipher + (inlen - 2), - (byte*)input + (inlen - 2), 2); - AssertIntEQ(ret, 0); - ret = XMEMCMP(input, plain, (int)inlen); - AssertIntEQ(ret, 0); + ExpectIntEQ(wc_Chacha_Process(&enc, cipher, (byte*)input, + (word32)inlen - 2), 0); + ExpectIntEQ(wc_Chacha_Process(&enc, cipher + (inlen - 2), + (byte*)input + (inlen - 2), 2), 0); + ExpectIntEQ(wc_Chacha_Process(&dec, plain, (byte*)cipher, + (word32)inlen - 2), 0); + ExpectIntEQ(wc_Chacha_Process(&dec, cipher + (inlen - 2), + (byte*)input + (inlen - 2), 2), 0); + ExpectIntEQ(XMEMCMP(input, plain, (int)inlen), 0); /* check edge cases with counter increment */ { @@ -18360,38 +18293,28 @@ for (i = 0; i < 256; i++) input2[i] = i; - ret = wc_Chacha_SetIV(&enc, iv2, 0); - AssertIntEQ(ret, 0); + ExpectIntEQ(wc_Chacha_SetIV(&enc, iv2, 0), 0); + + ExpectIntEQ(wc_Chacha_Process(&enc, cipher, input2, 64), 0); + ExpectIntEQ(XMEMCMP(expected, cipher, 64), 0); - ret = wc_Chacha_Process(&enc, cipher, input2, 64); - AssertIntEQ(ret, 0); - AssertIntEQ(XMEMCMP(expected, cipher, 64), 0); - - ret = wc_Chacha_Process(&enc, cipher, input2 + 64, 128); - AssertIntEQ(ret, 0); - AssertIntEQ(XMEMCMP(expected + 64, cipher, 128), 0); + ExpectIntEQ(wc_Chacha_Process(&enc, cipher, input2 + 64, 128), 0); + ExpectIntEQ(XMEMCMP(expected + 64, cipher, 128), 0); /* partial */ - ret = wc_Chacha_Process(&enc, cipher, input2 + 192, 32); - AssertIntEQ(ret, 0); - AssertIntEQ(XMEMCMP(expected + 192, cipher, 32), 0); - - ret = wc_Chacha_Process(&enc, cipher, input2 + 224, 32); - AssertIntEQ(ret, 0); - AssertIntEQ(XMEMCMP(expected + 224, cipher, 32), 0); + ExpectIntEQ(wc_Chacha_Process(&enc, cipher, input2 + 192, 32), 0); + ExpectIntEQ(XMEMCMP(expected + 192, cipher, 32), 0); + + ExpectIntEQ(wc_Chacha_Process(&enc, cipher, input2 + 224, 32), 0); + ExpectIntEQ(XMEMCMP(expected + 224, cipher, 32), 0); } #endif /* Test bad args. */ - ret = wc_Chacha_Process(NULL, cipher, (byte*)input, (word32)inlen); - AssertIntEQ(ret, BAD_FUNC_ARG); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_Chacha_Process(NULL, cipher, (byte*)input, (word32)inlen), + BAD_FUNC_ARG); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Chacha_Process */ /* @@ -18399,7 +18322,7 @@ */ static int test_wc_ChaCha20Poly1305_aead(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) const byte key[] = { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, @@ -18407,7 +18330,6 @@ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f }; - const byte plaintext[] = { 0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c, @@ -18425,12 +18347,10 @@ 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69, 0x74, 0x2e }; - const byte iv[] = { 0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47 }; - const byte aad[] = { /* additional data */ 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7 @@ -18459,78 +18379,57 @@ byte generatedCiphertext[272]; byte generatedPlaintext[272]; byte generatedAuthTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; - int ret = 0; /* Initialize stack variables. */ XMEMSET(generatedCiphertext, 0, 272); XMEMSET(generatedPlaintext, 0, 272); /* Test Encrypt */ - ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), plaintext, - sizeof(plaintext), generatedCiphertext, generatedAuthTag); - AssertIntEQ(ret, 0); - ret = XMEMCMP(generatedCiphertext, cipher, sizeof(cipher)/sizeof(byte)); - AssertIntEQ(ret, 0); + ExpectIntEQ(wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), + plaintext, sizeof(plaintext), generatedCiphertext, generatedAuthTag), + 0); + ExpectIntEQ(XMEMCMP(generatedCiphertext, cipher, + sizeof(cipher)/sizeof(byte)), 0); /* Test bad args. */ - ret = wc_ChaCha20Poly1305_Encrypt(NULL, iv, aad, sizeof(aad), plaintext, - sizeof(plaintext), generatedCiphertext, generatedAuthTag); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Encrypt(key, NULL, aad, sizeof(aad), - plaintext, sizeof(plaintext), - generatedCiphertext, generatedAuthTag); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), NULL, - sizeof(plaintext), generatedCiphertext, generatedAuthTag); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), - NULL, sizeof(plaintext), generatedCiphertext, generatedAuthTag); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), - plaintext, sizeof(plaintext), NULL, generatedAuthTag); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), - plaintext, sizeof(plaintext), generatedCiphertext, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - (void)ret; /* suppress never read */ - } - - ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), cipher, - sizeof(cipher), authTag, generatedPlaintext); - AssertIntEQ(ret, 0); - ret = XMEMCMP(generatedPlaintext, plaintext, - sizeof(plaintext)/sizeof(byte)); - AssertIntEQ(ret, 0); + ExpectIntEQ(wc_ChaCha20Poly1305_Encrypt(NULL, iv, aad, sizeof(aad), + plaintext, sizeof(plaintext), generatedCiphertext, generatedAuthTag), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Encrypt(key, NULL, aad, sizeof(aad), + plaintext, sizeof(plaintext), generatedCiphertext, generatedAuthTag), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), NULL, + sizeof(plaintext), generatedCiphertext, generatedAuthTag), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), + NULL, sizeof(plaintext), generatedCiphertext, generatedAuthTag), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), + plaintext, sizeof(plaintext), NULL, generatedAuthTag), BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Encrypt(key, iv, aad, sizeof(aad), + plaintext, sizeof(plaintext), generatedCiphertext, NULL), BAD_FUNC_ARG); + + ExpectIntEQ(wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), cipher, + sizeof(cipher), authTag, generatedPlaintext), 0); + ExpectIntEQ(XMEMCMP(generatedPlaintext, plaintext, + sizeof(plaintext)/sizeof(byte)), 0); /* Test bad args. */ - ret = wc_ChaCha20Poly1305_Decrypt(NULL, iv, aad, sizeof(aad), cipher, - sizeof(cipher), authTag, generatedPlaintext); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Decrypt(key, NULL, aad, sizeof(aad), - cipher, sizeof(cipher), authTag, generatedPlaintext); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), NULL, - sizeof(cipher), authTag, generatedPlaintext); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), cipher, - sizeof(cipher), NULL, generatedPlaintext); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), cipher, - sizeof(cipher), authTag, NULL); - AssertIntEQ(ret, BAD_FUNC_ARG); - ret = wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), NULL, - sizeof(cipher), authTag, generatedPlaintext); - AssertIntEQ(ret, BAD_FUNC_ARG); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_ChaCha20Poly1305_Decrypt(NULL, iv, aad, sizeof(aad), cipher, + sizeof(cipher), authTag, generatedPlaintext), BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Decrypt(key, NULL, aad, sizeof(aad), + cipher, sizeof(cipher), authTag, generatedPlaintext), BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), NULL, + sizeof(cipher), authTag, generatedPlaintext), BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), cipher, + sizeof(cipher), NULL, generatedPlaintext), BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), cipher, + sizeof(cipher), authTag, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ChaCha20Poly1305_Decrypt(key, iv, aad, sizeof(aad), NULL, + sizeof(cipher), authTag, generatedPlaintext), BAD_FUNC_ARG); #endif - return res; - -} /* END test-wc_ChaCha20Poly1305_EncryptDecrypt */ + return EXPECT_RESULT(); +} /* END test_wc_ChaCha20Poly1305_aead */ /* @@ -18538,78 +18437,38 @@ */ static int test_wc_Rc2SetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WC_RC2 - Rc2 rc2; - byte key40[] = { 0x01, 0x02, 0x03, 0x04, 0x05 }; - byte iv[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; - int ret = 0; + Rc2 rc2; + byte key40[] = { 0x01, 0x02, 0x03, 0x04, 0x05 }; + byte iv[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; /* valid key and IV */ - ret = wc_Rc2SetKey(&rc2, key40, (word32) sizeof(key40) / sizeof(byte), - iv, 40); - if (ret == 0) { - /* valid key, no IV */ - ret = wc_Rc2SetKey(&rc2, key40, (word32) sizeof(key40) / sizeof(byte), - NULL, 40); - } + ExpectIntEQ(wc_Rc2SetKey(&rc2, key40, (word32) sizeof(key40) / sizeof(byte), + iv, 40), 0); + /* valid key, no IV */ + ExpectIntEQ(wc_Rc2SetKey(&rc2, key40, (word32) sizeof(key40) / sizeof(byte), + NULL, 40), 0); /* bad arguments */ - if (ret == 0) { - /* null Rc2 struct */ - ret = wc_Rc2SetKey(NULL, key40, (word32) sizeof(key40) / sizeof(byte), - iv, 40); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null key */ - ret = wc_Rc2SetKey(&rc2, NULL, (word32) sizeof(key40) / sizeof(byte), - iv, 40); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* key size == 0 */ - ret = wc_Rc2SetKey(&rc2, key40, 0, iv, 40); - if (ret == WC_KEY_SIZE_E) { - ret = 0; - } - } - - if (ret == 0) { - /* key size > 128 */ - ret = wc_Rc2SetKey(&rc2, key40, 129, iv, 40); - if (ret == WC_KEY_SIZE_E) { - ret = 0; - } - } - - if (ret == 0) { - /* effective bits == 0 */ - ret = wc_Rc2SetKey(&rc2, key40, (word32)sizeof(key40) / sizeof(byte), - iv, 0); - if (ret == WC_KEY_SIZE_E) { - ret = 0; - } - } - - if (ret == 0) { - /* effective bits > 1024 */ - ret = wc_Rc2SetKey(&rc2, key40, (word32)sizeof(key40) / sizeof(byte), - iv, 1025); - if (ret == WC_KEY_SIZE_E) { - ret = 0; - } - } - - res = TEST_RES_CHECK(ret == 0); + /* null Rc2 struct */ + ExpectIntEQ(wc_Rc2SetKey(NULL, key40, (word32) sizeof(key40) / sizeof(byte), + iv, 40), BAD_FUNC_ARG); + /* null key */ + ExpectIntEQ(wc_Rc2SetKey(&rc2, NULL, (word32) sizeof(key40) / sizeof(byte), + iv, 40), BAD_FUNC_ARG); + /* key size == 0 */ + ExpectIntEQ(wc_Rc2SetKey(&rc2, key40, 0, iv, 40), WC_KEY_SIZE_E); + /* key size > 128 */ + ExpectIntEQ(wc_Rc2SetKey(&rc2, key40, 129, iv, 40), WC_KEY_SIZE_E); + /* effective bits == 0 */ + ExpectIntEQ(wc_Rc2SetKey(&rc2, key40, (word32)sizeof(key40) / sizeof(byte), + iv, 0), WC_KEY_SIZE_E); + /* effective bits > 1024 */ + ExpectIntEQ(wc_Rc2SetKey(&rc2, key40, (word32)sizeof(key40) / sizeof(byte), + iv, 1025), WC_KEY_SIZE_E); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Rc2SetKey */ /* @@ -18617,46 +18476,34 @@ */ static int test_wc_Rc2SetIV(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WC_RC2 - Rc2 rc2; - byte iv[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; - int ret = 0; + Rc2 rc2; + byte iv[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }; /* valid IV */ - ret = wc_Rc2SetIV(&rc2, iv); - if (ret == 0) { - /* valid NULL IV */ - ret = wc_Rc2SetIV(&rc2, NULL); - } + ExpectIntEQ(wc_Rc2SetIV(&rc2, iv), 0); + /* valid NULL IV */ + ExpectIntEQ(wc_Rc2SetIV(&rc2, NULL), 0); /* bad arguments */ - if (ret == 0) { - ret = wc_Rc2SetIV(NULL, iv); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_Rc2SetIV(NULL, iv), BAD_FUNC_ARG); + ExpectIntEQ(wc_Rc2SetIV(NULL, NULL), BAD_FUNC_ARG); #endif - return res; -} /* END test_wc_Rc2SetKey */ + return EXPECT_RESULT(); +} /* END test_wc_Rc2SetIV */ /* - * Testing function for wc_Rc2EcbEncrypt(). + * Testing function for wc_Rc2EcbEncrypt() and wc_Rc2EcbDecrypt(). */ static int test_wc_Rc2EcbEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WC_RC2 - Rc2 rc2; - int ret = 0; + Rc2 rc2; int effectiveKeyBits = 63; - byte cipher[RC2_BLOCK_SIZE]; byte plain[RC2_BLOCK_SIZE]; - byte key[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; byte input[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; byte output[] = { 0xeb, 0xb7, 0x73, 0xf9, 0x93, 0x27, 0x8e, 0xff }; @@ -18664,115 +18511,62 @@ XMEMSET(cipher, 0, sizeof(cipher)); XMEMSET(plain, 0, sizeof(plain)); - ret = wc_Rc2SetKey(&rc2, key, (word32) sizeof(key) / sizeof(byte), - NULL, effectiveKeyBits); - if (ret == 0) { - ret = wc_Rc2EcbEncrypt(&rc2, cipher, input, RC2_BLOCK_SIZE); - if (ret != 0 || XMEMCMP(cipher, output, RC2_BLOCK_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_Rc2SetKey(&rc2, key, (word32) sizeof(key) / sizeof(byte), + NULL, effectiveKeyBits), 0); + ExpectIntEQ(wc_Rc2EcbEncrypt(&rc2, cipher, input, RC2_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(cipher, output, RC2_BLOCK_SIZE), 0); - if (ret == 0) { - ret = wc_Rc2EcbDecrypt(&rc2, plain, cipher, RC2_BLOCK_SIZE); - if (ret != 0 || XMEMCMP(plain, input, RC2_BLOCK_SIZE) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_Rc2EcbDecrypt(&rc2, plain, cipher, RC2_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(plain, input, RC2_BLOCK_SIZE), 0); /* Rc2EcbEncrypt bad arguments */ - if (ret == 0) { - /* null Rc2 struct */ - ret = wc_Rc2EcbEncrypt(NULL, cipher, input, RC2_BLOCK_SIZE); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null out buffer */ - ret = wc_Rc2EcbEncrypt(&rc2, NULL, input, RC2_BLOCK_SIZE); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null input buffer */ - ret = wc_Rc2EcbEncrypt(&rc2, cipher, NULL, RC2_BLOCK_SIZE); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* output buffer sz != RC2_BLOCK_SIZE (8) */ - ret = wc_Rc2EcbEncrypt(&rc2, cipher, input, 7); - if (ret == BUFFER_E) { - ret = 0; - } - } + /* null Rc2 struct */ + ExpectIntEQ(wc_Rc2EcbEncrypt(NULL, cipher, input, RC2_BLOCK_SIZE), + BAD_FUNC_ARG); + /* null out buffer */ + ExpectIntEQ(wc_Rc2EcbEncrypt(&rc2, NULL, input, RC2_BLOCK_SIZE), + BAD_FUNC_ARG); + /* null input buffer */ + ExpectIntEQ(wc_Rc2EcbEncrypt(&rc2, cipher, NULL, RC2_BLOCK_SIZE), + BAD_FUNC_ARG); + /* output buffer sz != RC2_BLOCK_SIZE (8) */ + ExpectIntEQ(wc_Rc2EcbEncrypt(&rc2, cipher, input, 7), BUFFER_E); /* Rc2EcbDecrypt bad arguments */ - if (ret == 0) { - /* null Rc2 struct */ - ret = wc_Rc2EcbDecrypt(NULL, plain, output, RC2_BLOCK_SIZE); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null out buffer */ - ret = wc_Rc2EcbDecrypt(&rc2, NULL, output, RC2_BLOCK_SIZE); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null input buffer */ - ret = wc_Rc2EcbDecrypt(&rc2, plain, NULL, RC2_BLOCK_SIZE); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* output buffer sz != RC2_BLOCK_SIZE (8) */ - ret = wc_Rc2EcbDecrypt(&rc2, plain, output, 7); - if (ret == BUFFER_E) { - ret = 0; - } - } - - res = TEST_RES_CHECK(ret == 0); + /* null Rc2 struct */ + ExpectIntEQ(wc_Rc2EcbDecrypt(NULL, plain, output, RC2_BLOCK_SIZE), + BAD_FUNC_ARG); + /* null out buffer */ + ExpectIntEQ(wc_Rc2EcbDecrypt(&rc2, NULL, output, RC2_BLOCK_SIZE), + BAD_FUNC_ARG); + /* null input buffer */ + ExpectIntEQ(wc_Rc2EcbDecrypt(&rc2, plain, NULL, RC2_BLOCK_SIZE), + BAD_FUNC_ARG); + /* output buffer sz != RC2_BLOCK_SIZE (8) */ + ExpectIntEQ(wc_Rc2EcbDecrypt(&rc2, plain, output, 7), BUFFER_E); #endif - return res; -} /* END test_wc_Rc2SetKey */ + return EXPECT_RESULT(); +} /* END test_wc_Rc2EcbEncryptDecrypt */ /* - * Testing function for wc_Rc2CbcEncrypt(). + * Testing function for wc_Rc2CbcEncrypt() and wc_Rc2CbcDecrypt(). */ static int test_wc_Rc2CbcEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WC_RC2 - Rc2 rc2; - int ret = 0; + Rc2 rc2; int effectiveKeyBits = 63; - byte cipher[RC2_BLOCK_SIZE*2]; byte plain[RC2_BLOCK_SIZE*2]; - /* vector taken from test.c */ - byte key[] = { + byte key[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; byte iv[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - byte input[] = { + byte input[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -18784,88 +18578,42 @@ XMEMSET(cipher, 0, sizeof(cipher)); XMEMSET(plain, 0, sizeof(plain)); - ret = wc_Rc2SetKey(&rc2, key, (word32) sizeof(key) / sizeof(byte), - iv, effectiveKeyBits); - if (ret == 0) { - ret = wc_Rc2CbcEncrypt(&rc2, cipher, input, sizeof(input)); - if (ret != 0 || XMEMCMP(cipher, output, sizeof(output)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - /* reset IV for decrypt */ - ret = wc_Rc2SetIV(&rc2, iv); - } - - if (ret == 0) { - ret = wc_Rc2CbcDecrypt(&rc2, plain, cipher, sizeof(cipher)); - if (ret != 0 || XMEMCMP(plain, input, sizeof(input)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_Rc2SetKey(&rc2, key, (word32) sizeof(key) / sizeof(byte), + iv, effectiveKeyBits), 0); + ExpectIntEQ(wc_Rc2CbcEncrypt(&rc2, cipher, input, sizeof(input)), 0); + ExpectIntEQ(XMEMCMP(cipher, output, sizeof(output)), 0); + + /* reset IV for decrypt */ + ExpectIntEQ(wc_Rc2SetIV(&rc2, iv), 0); + ExpectIntEQ(wc_Rc2CbcDecrypt(&rc2, plain, cipher, sizeof(cipher)), 0); + ExpectIntEQ(XMEMCMP(plain, input, sizeof(input)), 0); /* Rc2CbcEncrypt bad arguments */ - if (ret == 0) { - /* null Rc2 struct */ - ret = wc_Rc2CbcEncrypt(NULL, cipher, input, sizeof(input)); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null out buffer */ - ret = wc_Rc2CbcEncrypt(&rc2, NULL, input, sizeof(input)); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null input buffer */ - ret = wc_Rc2CbcEncrypt(&rc2, cipher, NULL, sizeof(input)); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + /* null Rc2 struct */ + ExpectIntEQ(wc_Rc2CbcEncrypt(NULL, cipher, input, sizeof(input)), + BAD_FUNC_ARG); + /* null out buffer */ + ExpectIntEQ(wc_Rc2CbcEncrypt(&rc2, NULL, input, sizeof(input)), + BAD_FUNC_ARG); + /* null input buffer */ + ExpectIntEQ(wc_Rc2CbcEncrypt(&rc2, cipher, NULL, sizeof(input)), + BAD_FUNC_ARG); /* Rc2CbcDecrypt bad arguments */ - if (ret == 0) { - /* in size is 0 */ - ret = wc_Rc2CbcDecrypt(&rc2, plain, output, 0); - if (ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (ret == 0) { - /* null Rc2 struct */ - ret = wc_Rc2CbcDecrypt(NULL, plain, output, sizeof(output)); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null out buffer */ - ret = wc_Rc2CbcDecrypt(&rc2, NULL, output, sizeof(output)); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - if (ret == 0) { - /* null input buffer */ - ret = wc_Rc2CbcDecrypt(&rc2, plain, NULL, sizeof(output)); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - - res = TEST_RES_CHECK(ret == 0); + /* in size is 0 */ + ExpectIntEQ(wc_Rc2CbcDecrypt(&rc2, plain, output, 0), 0); + /* null Rc2 struct */ + ExpectIntEQ(wc_Rc2CbcDecrypt(NULL, plain, output, sizeof(output)), + BAD_FUNC_ARG); + /* null out buffer */ + ExpectIntEQ(wc_Rc2CbcDecrypt(&rc2, NULL, output, sizeof(output)), + BAD_FUNC_ARG); + /* null input buffer */ + ExpectIntEQ(wc_Rc2CbcDecrypt(&rc2, plain, NULL, sizeof(output)), + BAD_FUNC_ARG); #endif - return res; -} /* END test_wc_Rc2SetKey */ + return EXPECT_RESULT(); +} /* END test_wc_Rc2CbcEncryptDecrypt */ /* @@ -18919,82 +18667,61 @@ */ static int test_wc_AesSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_AES - Aes aes; - int ret = 0; - byte key16[] = - { + Aes aes; + byte key16[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; #ifdef WOLFSSL_AES_192 - byte key24[] = - { + byte key24[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 }; #endif #ifdef WOLFSSL_AES_256 - byte key32[] = - { + byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; #endif - byte badKey16[] = - { + byte badKey16[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65 }; - byte iv[] = "1234567890abcdef"; + byte iv[] = "1234567890abcdef"; - ret = wc_AesInit(&aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + XMEMSET(&aes, 0, sizeof(Aes)); + + ExpectIntEQ(wc_AesInit(&aes, NULL, INVALID_DEVID), 0); #ifdef WOLFSSL_AES_128 - ret = wc_AesSetKey(&aes, key16, (word32) sizeof(key16) / sizeof(byte), - iv, AES_ENCRYPTION); + ExpectIntEQ(wc_AesSetKey(&aes, key16, (word32)sizeof(key16) / sizeof(byte), + iv, AES_ENCRYPTION), 0); #endif #ifdef WOLFSSL_AES_192 - if (ret == 0) { - ret = wc_AesSetKey (&aes, key24, (word32) sizeof(key24) / sizeof(byte), - iv, AES_ENCRYPTION); - } + ExpectIntEQ(wc_AesSetKey(&aes, key24, (word32)sizeof(key24) / sizeof(byte), + iv, AES_ENCRYPTION), 0); #endif #ifdef WOLFSSL_AES_256 - if (ret == 0) { - ret = wc_AesSetKey (&aes, key32, (word32) sizeof(key32) / sizeof(byte), - iv, AES_ENCRYPTION); - } + ExpectIntEQ(wc_AesSetKey(&aes, key32, (word32)sizeof(key32) / sizeof(byte), + iv, AES_ENCRYPTION), 0); #endif /* Pass in bad args. */ - if (ret == 0) { - ret = wc_AesSetKey (NULL, key16, (word32) sizeof(key16) / sizeof(byte), - iv, AES_ENCRYPTION); - if (ret == BAD_FUNC_ARG) { - ret = wc_AesSetKey(&aes, badKey16, - (word32) sizeof(badKey16) / sizeof(byte), - iv, AES_ENCRYPTION); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_AesSetKey(NULL, key16, (word32)sizeof(key16) / sizeof(byte), + iv, AES_ENCRYPTION), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesSetKey(&aes, badKey16, + (word32)sizeof(badKey16) / sizeof(byte), iv, AES_ENCRYPTION), + BAD_FUNC_ARG); wc_AesFree(&aes); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_AesSetKey */ @@ -19005,192 +18732,110 @@ */ static int test_wc_AesCbcEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(HAVE_AES_DECRYPT)&& \ defined(WOLFSSL_AES_256) - Aes aes; - int ret = 0; - byte key32[] = - { + Aes aes; + byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; - byte vector[] = /* Now is the time for all good men w/o trailing 0 */ - { - 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, - 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, - 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20, - 0x67,0x6f,0x6f,0x64,0x20,0x6d,0x65,0x6e + byte vector[] = { /* Now is the time for all good men w/o trailing 0 */ + 0x4e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x67, 0x6f, 0x6f, 0x64, 0x20, 0x6d, 0x65, 0x6e }; - byte iv[] = "1234567890abcdef"; + byte iv[] = "1234567890abcdef"; byte enc[sizeof(vector)]; byte dec[sizeof(vector)]; - int cbcE = WOLFSSL_FATAL_ERROR; - int cbcD = WOLFSSL_FATAL_ERROR; - int cbcDWK = WOLFSSL_FATAL_ERROR; byte dec2[sizeof(vector)]; /* Init stack variables. */ + XMEMSET(&aes, 0, sizeof(Aes)); XMEMSET(enc, 0, sizeof(enc)); XMEMSET(dec, 0, sizeof(vector)); XMEMSET(dec2, 0, sizeof(vector)); - ret = wc_AesInit(&aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - - ret = wc_AesSetKey(&aes, key32, AES_BLOCK_SIZE * 2, iv, AES_ENCRYPTION); - if (ret == 0) { - ret = wc_AesCbcEncrypt(&aes, enc, vector, sizeof(vector)); - if (ret == 0) { - /* Re init for decrypt and set flag. */ - cbcE = 0; - wc_AesFree(&aes); - ret = wc_AesSetKey(&aes, key32, AES_BLOCK_SIZE * 2, - iv, AES_DECRYPTION); - } - if (ret == 0) { - ret = wc_AesCbcDecrypt(&aes, dec, enc, sizeof(vector)); - if (ret != 0 || XMEMCMP(vector, dec, sizeof(vector)) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - /* Set flag. */ - cbcD = 0; - } - } - } - /* If encrypt succeeds but cbc decrypt fails, we can still test. */ - if (ret == 0 || cbcE == 0) { - ret = wc_AesCbcDecryptWithKey(dec2, enc, AES_BLOCK_SIZE, - key32, sizeof(key32)/sizeof(byte), iv); - if (ret == 0 || XMEMCMP(vector, dec2, AES_BLOCK_SIZE) == 0) { - cbcDWK = 0; - } - } + ExpectIntEQ(wc_AesInit(&aes, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesSetKey(&aes, key32, AES_BLOCK_SIZE * 2, iv, + AES_ENCRYPTION), 0); + ExpectIntEQ(wc_AesCbcEncrypt(&aes, enc, vector, sizeof(vector)), 0); + + /* Re init for decrypt and set flag. */ + ExpectIntEQ(wc_AesSetKey(&aes, key32, AES_BLOCK_SIZE * 2, iv, + AES_DECRYPTION), 0); + ExpectIntEQ(wc_AesCbcDecrypt(&aes, dec, enc, sizeof(vector)), 0); + ExpectIntEQ(XMEMCMP(vector, dec, sizeof(vector)), 0); + + ExpectIntEQ(wc_AesCbcDecryptWithKey(dec2, enc, AES_BLOCK_SIZE, key32, + sizeof(key32)/sizeof(byte), iv), 0); + ExpectIntEQ(XMEMCMP(vector, dec2, AES_BLOCK_SIZE), 0); /* Pass in bad args */ - if (cbcE == 0) { - cbcE = wc_AesCbcEncrypt(NULL, enc, vector, sizeof(vector)); - if (cbcE == BAD_FUNC_ARG) { - cbcE = wc_AesCbcEncrypt(&aes, NULL, vector, sizeof(vector)); - } - if (cbcE == BAD_FUNC_ARG) { - cbcE = wc_AesCbcEncrypt(&aes, enc, NULL, sizeof(vector)); - } - if (cbcE == BAD_FUNC_ARG) { - cbcE = 0; - } - else { - cbcE = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_AesCbcEncrypt(NULL, enc, vector, sizeof(vector)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCbcEncrypt(&aes, NULL, vector, sizeof(vector)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCbcEncrypt(&aes, enc, NULL, sizeof(vector)), + BAD_FUNC_ARG); #ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS - if (cbcE == 0) { - cbcE = wc_AesCbcEncrypt(&aes, enc, vector, sizeof(vector) - 1); - } - if (cbcE == BAD_LENGTH_E) { - cbcE = 0; - } - else { - cbcE = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_AesCbcEncrypt(&aes, enc, vector, sizeof(vector) - 1), + BAD_LENGTH_E); #endif +#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION == 2) && defined(WOLFSSL_AESNI) + fprintf(stderr, "Zero length inputs not supported with AESNI in FIPS " + "mode (v2), skip test"); +#else + /* Test passing in size of 0 */ + XMEMSET(enc, 0, sizeof(enc)); + ExpectIntEQ(wc_AesCbcEncrypt(&aes, enc, vector, 0), 0); + /* Check enc was not modified */ + { + int i; + for (i = 0; i < (int)sizeof(enc); i++) + ExpectIntEQ(enc[i], 0); } - if (cbcE == 0) { - #if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION == 2) && defined(WOLFSSL_AESNI) - fprintf(stderr, "Zero length inputs not supported with AESNI in FIPS " - "mode (v2), skip test"); - #else - /* Test passing in size of 0 */ - XMEMSET(enc, 0, sizeof(enc)); - cbcE = wc_AesCbcEncrypt(&aes, enc, vector, 0); - if (cbcE == 0) { - /* Check enc was not modified */ - int i; - for (i = 0; i < (int)sizeof(enc); i++) - cbcE |= enc[i]; - } - #endif - } - if (cbcE != 0) { - wc_AesFree(&aes); - return TEST_FAIL; - } +#endif - if (cbcD == 0) { - cbcD = wc_AesCbcDecrypt(NULL, dec, enc, AES_BLOCK_SIZE); - if (cbcD == BAD_FUNC_ARG) { - cbcD = wc_AesCbcDecrypt(&aes, NULL, enc, AES_BLOCK_SIZE); - } - if (cbcD == BAD_FUNC_ARG) { - cbcD = wc_AesCbcDecrypt(&aes, dec, NULL, AES_BLOCK_SIZE); - } - if (cbcD == BAD_FUNC_ARG) { - cbcD = wc_AesCbcDecrypt(&aes, dec, enc, AES_BLOCK_SIZE * 2 - 1); - } + ExpectIntEQ(wc_AesCbcDecrypt(NULL, dec, enc, AES_BLOCK_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCbcDecrypt(&aes, NULL, enc, AES_BLOCK_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCbcDecrypt(&aes, dec, NULL, AES_BLOCK_SIZE), + BAD_FUNC_ARG); #ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS - if (cbcD == BAD_LENGTH_E) { - cbcD = 0; - } - else { - cbcD = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_AesCbcDecrypt(&aes, dec, enc, AES_BLOCK_SIZE * 2 - 1), + BAD_LENGTH_E); #else - if (cbcD == BAD_FUNC_ARG) { - cbcD = 0; - } - else { - cbcD = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_AesCbcDecrypt(&aes, dec, enc, AES_BLOCK_SIZE * 2 - 1), + BAD_FUNC_ARG); #endif - } - if (cbcD == 0) { - /* Test passing in size of 0 */ - XMEMSET(dec, 0, sizeof(dec)); - cbcD = wc_AesCbcDecrypt(&aes, dec, enc, 0); - if (cbcD == 0) { - /* Check dec was not modified */ - int i; - for (i = 0; i < (int)sizeof(dec); i++) - cbcD |= dec[i]; - } - } - if (cbcD != 0) { - wc_AesFree(&aes); - return TEST_FAIL; - } - if (cbcDWK == 0) { - cbcDWK = wc_AesCbcDecryptWithKey(NULL, enc, AES_BLOCK_SIZE, - key32, sizeof(key32)/sizeof(byte), iv); - if (cbcDWK == BAD_FUNC_ARG) { - cbcDWK = wc_AesCbcDecryptWithKey(dec2, NULL, AES_BLOCK_SIZE, - key32, sizeof(key32)/sizeof(byte), iv); - } - if (cbcDWK == BAD_FUNC_ARG) { - cbcDWK = wc_AesCbcDecryptWithKey(dec2, enc, AES_BLOCK_SIZE, - NULL, sizeof(key32)/sizeof(byte), iv); - } - if (cbcDWK == BAD_FUNC_ARG) { - cbcDWK = wc_AesCbcDecryptWithKey(dec2, enc, AES_BLOCK_SIZE, - key32, sizeof(key32)/sizeof(byte), NULL); - } - if (cbcDWK == BAD_FUNC_ARG) { - cbcDWK = 0; - } - else { - cbcDWK = WOLFSSL_FATAL_ERROR; - } + /* Test passing in size of 0 */ + XMEMSET(dec, 0, sizeof(dec)); + ExpectIntEQ(wc_AesCbcDecrypt(&aes, dec, enc, 0), 0); + /* Check dec was not modified */ + { + int i; + for (i = 0; i < (int)sizeof(dec); i++) + ExpectIntEQ(dec[i], 0); } - wc_AesFree(&aes); + ExpectIntEQ(wc_AesCbcDecryptWithKey(NULL, enc, AES_BLOCK_SIZE, + key32, sizeof(key32)/sizeof(byte), iv), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCbcDecryptWithKey(dec2, NULL, AES_BLOCK_SIZE, + key32, sizeof(key32)/sizeof(byte), iv), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCbcDecryptWithKey(dec2, enc, AES_BLOCK_SIZE, + NULL, sizeof(key32)/sizeof(byte), iv), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCbcDecryptWithKey(dec2, enc, AES_BLOCK_SIZE, + key32, sizeof(key32)/sizeof(byte), NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(cbcDWK == 0); + wc_AesFree(&aes); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_AesCbcEncryptDecrypt */ /* @@ -19198,82 +18843,57 @@ */ static int test_wc_AesCtrEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(WOLFSSL_AES_COUNTER) && defined(WOLFSSL_AES_256) - Aes aesEnc, aesDec; - int ret = 0; - byte key32[] = - { + Aes aesEnc; + Aes aesDec; + byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; - byte vector[] = /* Now is the time for all w/o trailing 0 */ - { + byte vector[] = { /* Now is the time for all w/o trailing 0 */ 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 }; - byte iv[] = "1234567890abcdef"; - byte enc[AES_BLOCK_SIZE * 2]; - byte dec[AES_BLOCK_SIZE * 2]; + byte iv[] = "1234567890abcdef"; + byte enc[AES_BLOCK_SIZE * 2]; + byte dec[AES_BLOCK_SIZE * 2]; /* Init stack variables. */ + XMEMSET(&aesEnc, 0, sizeof(Aes)); + XMEMSET(&aesDec, 0, sizeof(Aes)); XMEMSET(enc, 0, AES_BLOCK_SIZE * 2); XMEMSET(dec, 0, AES_BLOCK_SIZE * 2); - ret = wc_AesInit(&aesEnc, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - ret = wc_AesInit(&aesDec, NULL, INVALID_DEVID); - if (ret != 0) { - wc_AesFree(&aesEnc); - return ret; - } + ExpectIntEQ(wc_AesInit(&aesEnc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesInit(&aesDec, NULL, INVALID_DEVID), 0); - ret = wc_AesSetKey(&aesEnc, key32, AES_BLOCK_SIZE * 2, - iv, AES_ENCRYPTION); - if (ret == 0) { - ret = wc_AesCtrEncrypt(&aesEnc, enc, vector, - sizeof(vector)/sizeof(byte)); - if (ret == 0) { - /* Decrypt with wc_AesCtrEncrypt() */ - ret = wc_AesSetKey(&aesDec, key32, AES_BLOCK_SIZE * 2, - iv, AES_ENCRYPTION); - } - if (ret == 0) { - ret = wc_AesCtrEncrypt(&aesDec, dec, enc, sizeof(enc)/sizeof(byte)); - if (ret != 0 || XMEMCMP(vector, dec, sizeof(vector))) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_AesSetKey(&aesEnc, key32, AES_BLOCK_SIZE * 2, iv, + AES_ENCRYPTION), 0); + ExpectIntEQ(wc_AesCtrEncrypt(&aesEnc, enc, vector, + sizeof(vector)/sizeof(byte)), 0); + /* Decrypt with wc_AesCtrEncrypt() */ + ExpectIntEQ(wc_AesSetKey(&aesDec, key32, AES_BLOCK_SIZE * 2, iv, + AES_ENCRYPTION), 0); + ExpectIntEQ(wc_AesCtrEncrypt(&aesDec, dec, enc, sizeof(enc)/sizeof(byte)), + 0); + ExpectIntEQ(XMEMCMP(vector, dec, sizeof(vector)), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_AesCtrEncrypt(NULL, dec, enc, sizeof(enc)/sizeof(byte)); - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCtrEncrypt(&aesDec, NULL, enc, sizeof(enc)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCtrEncrypt(&aesDec, dec, NULL, sizeof(enc)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_AesCtrEncrypt(NULL, dec, enc, sizeof(enc)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCtrEncrypt(&aesDec, NULL, enc, sizeof(enc)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCtrEncrypt(&aesDec, dec, NULL, sizeof(enc)/sizeof(byte)), + BAD_FUNC_ARG); wc_AesFree(&aesEnc); wc_AesFree(&aesDec); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_AesCtrEncryptDecrypt */ /* @@ -19281,93 +18901,69 @@ */ static int test_wc_AesGcmSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(HAVE_AESGCM) - Aes aes; - int ret = 0; + Aes aes; #ifdef WOLFSSL_AES_128 - byte key16[] = - { + byte key16[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; #endif #ifdef WOLFSSL_AES_192 - byte key24[] = - { + byte key24[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 }; #endif #ifdef WOLFSSL_AES_256 - byte key32[] = - { + byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; #endif - byte badKey16[] = - { + byte badKey16[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65 }; - byte badKey24[] = - { + byte badKey24[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36 }; - byte badKey32[] = - { + byte badKey32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x37, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65 }; - ret = wc_AesInit(&aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + ExpectIntEQ(wc_AesInit(&aes, NULL, INVALID_DEVID), 0); #ifdef WOLFSSL_AES_128 - ret = wc_AesGcmSetKey(&aes, key16, sizeof(key16)/sizeof(byte)); + ExpectIntEQ(wc_AesGcmSetKey(&aes, key16, sizeof(key16)/sizeof(byte)), 0); #endif #ifdef WOLFSSL_AES_192 - if (ret == 0) { - ret = wc_AesGcmSetKey(&aes, key24, sizeof(key24)/sizeof(byte)); - } + ExpectIntEQ(wc_AesGcmSetKey(&aes, key24, sizeof(key24)/sizeof(byte)), 0); #endif #ifdef WOLFSSL_AES_256 - if (ret == 0) { - ret = wc_AesGcmSetKey(&aes, key32, sizeof(key32)/sizeof(byte)); - } + ExpectIntEQ(wc_AesGcmSetKey(&aes, key32, sizeof(key32)/sizeof(byte)), 0); #endif /* Pass in bad args. */ - if (ret == 0) { - ret = wc_AesGcmSetKey(&aes, badKey16, sizeof(badKey16)/sizeof(byte)); - if (ret == BAD_FUNC_ARG) { - ret = wc_AesGcmSetKey(&aes, badKey24, sizeof(badKey24)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesGcmSetKey(&aes, badKey32, sizeof(badKey32)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_AesGcmSetKey(&aes, badKey16, sizeof(badKey16)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmSetKey(&aes, badKey24, sizeof(badKey24)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmSetKey(&aes, badKey32, sizeof(badKey32)/sizeof(byte)), + BAD_FUNC_ARG); wc_AesFree(&aes); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_AesGcmSetKey */ /* @@ -19375,97 +18971,67 @@ */ static int test_wc_AesGcmEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; /* WOLFSSL_AFALG requires 12 byte IV */ #if !defined(NO_AES) && defined(HAVE_AESGCM) && defined(WOLFSSL_AES_256) && \ !defined(WOLFSSL_AFALG) && !defined(WOLFSSL_DEVCRYPTO_AES) - - Aes aes; - byte key32[] = - { + Aes aes; + byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; - byte vector[] = /* Now is the time for all w/o trailing 0 */ - { + byte vector[] = { /* Now is the time for all w/o trailing 0 */ 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 }; - const byte a[] = - { + const byte a[] = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2 }; - byte iv[] = "1234567890a"; - byte longIV[] = "1234567890abcdefghij"; - byte enc[sizeof(vector)]; - byte resultT[AES_BLOCK_SIZE]; - byte dec[sizeof(vector)]; - int gcmD = WOLFSSL_FATAL_ERROR; - int gcmE = WOLFSSL_FATAL_ERROR; - int ret = 0; + byte iv[] = "1234567890a"; + byte longIV[] = "1234567890abcdefghij"; + byte enc[sizeof(vector)]; + byte resultT[AES_BLOCK_SIZE]; + byte dec[sizeof(vector)]; /* Init stack variables. */ + XMEMSET(&aes, 0, sizeof(Aes)); XMEMSET(enc, 0, sizeof(vector)); XMEMSET(dec, 0, sizeof(vector)); XMEMSET(resultT, 0, AES_BLOCK_SIZE); - ret = wc_AesInit(&aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + ExpectIntEQ(wc_AesInit(&aes, NULL, INVALID_DEVID), 0); - ret = wc_AesGcmSetKey(&aes, key32, sizeof(key32)/sizeof(byte)); - if (ret == 0) { - gcmE = wc_AesGcmEncrypt(&aes, enc, vector, sizeof(vector), - iv, sizeof(iv)/sizeof(byte), resultT, - sizeof(resultT), a, sizeof(a)); - } - if (gcmE == 0) { /* If encrypt fails, no decrypt. */ - gcmD = wc_AesGcmDecrypt(&aes, dec, enc, sizeof(vector), - iv, sizeof(iv)/sizeof(byte), resultT, - sizeof(resultT), a, sizeof(a)); - if (gcmD == 0 && (XMEMCMP(vector, dec, sizeof(vector)) != 0)) { - gcmD = WOLFSSL_FATAL_ERROR; - } - } - /*Test bad args for wc_AesGcmEncrypt and wc_AesGcmDecrypt */ - if (gcmE == 0) { - gcmE = wc_AesGcmEncrypt(NULL, enc, vector, sizeof(vector), - iv, sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), - a, sizeof(a)); - if (gcmE == BAD_FUNC_ARG) { - gcmE = wc_AesGcmEncrypt(&aes, enc, vector, - sizeof(vector), iv, sizeof(iv)/sizeof(byte), - resultT, sizeof(resultT) + 1, a, sizeof(a)); - } - if (gcmE == BAD_FUNC_ARG) { - gcmE = wc_AesGcmEncrypt(&aes, enc, vector, - sizeof(vector), iv, sizeof(iv)/sizeof(byte), - resultT, sizeof(resultT) - 5, a, sizeof(a)); - } + ExpectIntEQ(wc_AesGcmSetKey(&aes, key32, sizeof(key32)/sizeof(byte)), 0); + ExpectIntEQ(wc_AesGcmEncrypt(&aes, enc, vector, sizeof(vector), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), 0); + ExpectIntEQ(wc_AesGcmDecrypt(&aes, dec, enc, sizeof(vector), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), 0); + ExpectIntEQ(XMEMCMP(vector, dec, sizeof(vector)), 0); + + /* Test bad args for wc_AesGcmEncrypt and wc_AesGcmDecrypt */ + ExpectIntEQ(wc_AesGcmEncrypt(NULL, enc, vector, sizeof(vector), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncrypt(&aes, enc, vector, sizeof(vector), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT) + 1, a, sizeof(a)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmEncrypt(&aes, enc, vector, sizeof(vector), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT) - 5, a, sizeof(a)), + BAD_FUNC_ARG); #if (defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \ (HAVE_FIPS_VERSION == 2)) || defined(HAVE_SELFTEST) || \ defined(WOLFSSL_AES_GCM_FIXED_IV_AAD) /* FIPS does not check the lower bound of ivSz */ #else - if (gcmE == BAD_FUNC_ARG) { - gcmE = wc_AesGcmEncrypt(&aes, enc, vector, - sizeof(vector), iv, 0, - resultT, sizeof(resultT), a, sizeof(a)); - } + ExpectIntEQ(wc_AesGcmEncrypt(&aes, enc, vector, sizeof(vector), iv, 0, + resultT, sizeof(resultT), a, sizeof(a)), BAD_FUNC_ARG); #endif - if (gcmE == BAD_FUNC_ARG) { - gcmE = 0; - } - else { - gcmE = WOLFSSL_FATAL_ERROR; - } - } /* This case is now considered good. Long IVs are now allowed. * Except for the original FIPS release, it still has an upper @@ -19473,76 +19039,52 @@ #if (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))) && \ !defined(WOLFSSL_AES_GCM_FIXED_IV_AAD) - if (gcmE == 0) { - gcmE = wc_AesGcmEncrypt(&aes, enc, vector, sizeof(vector), longIV, - sizeof(longIV)/sizeof(byte), resultT, sizeof(resultT), - a, sizeof(a)); - } + ExpectIntEQ(wc_AesGcmEncrypt(&aes, enc, vector, sizeof(vector), longIV, + sizeof(longIV)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), + 0); #else (void)longIV; #endif /* Old FIPS */ /* END wc_AesGcmEncrypt */ - if (gcmE != 0) { - wc_AesFree(&aes); - return TEST_FAIL; - } - - #ifdef HAVE_AES_DECRYPT - if (gcmD == 0) { - gcmD = wc_AesGcmDecrypt(NULL, dec, enc, sizeof(enc)/sizeof(byte), - iv, sizeof(iv)/sizeof(byte), resultT, - sizeof(resultT), a, sizeof(a)); - if (gcmD == BAD_FUNC_ARG) { - gcmD = wc_AesGcmDecrypt(&aes, NULL, enc, sizeof(enc)/sizeof(byte), - iv, sizeof(iv)/sizeof(byte), resultT, - sizeof(resultT), a, sizeof(a)); - } - if (gcmD == BAD_FUNC_ARG) { - gcmD = wc_AesGcmDecrypt(&aes, dec, NULL, sizeof(enc)/sizeof(byte), - iv, sizeof(iv)/sizeof(byte), resultT, - sizeof(resultT), a, sizeof(a)); - } - if (gcmD == BAD_FUNC_ARG) { - gcmD = wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), - NULL, sizeof(iv)/sizeof(byte), resultT, - sizeof(resultT), a, sizeof(a)); - } - if (gcmD == BAD_FUNC_ARG) { - gcmD = wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), - iv, sizeof(iv)/sizeof(byte), NULL, - sizeof(resultT), a, sizeof(a)); - } - if (gcmD == BAD_FUNC_ARG) { - gcmD = wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), - iv, sizeof(iv)/sizeof(byte), resultT, - sizeof(resultT) + 1, a, sizeof(a)); - } - #if ((defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \ - (HAVE_FIPS_VERSION == 2)) || defined(HAVE_SELFTEST)) && \ - !defined(WOLFSSL_AES_GCM_FIXED_IV_AAD) - /* FIPS does not check the lower bound of ivSz */ - #else - if (gcmD == BAD_FUNC_ARG) { - gcmD = wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), - iv, 0, resultT, - sizeof(resultT), a, sizeof(a)); - } - #endif - if (gcmD == BAD_FUNC_ARG) { - gcmD = 0; - } - else { - gcmD = WOLFSSL_FATAL_ERROR; - } - - res = TEST_RES_CHECK(gcmD == 0); - } /* END wc_AesGcmDecrypt */ - #endif /* HAVE_AES_DECRYPT */ +#ifdef HAVE_AES_DECRYPT + ExpectIntEQ(wc_AesGcmDecrypt(NULL, dec, enc, sizeof(enc)/sizeof(byte), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecrypt(&aes, NULL, enc, sizeof(enc)/sizeof(byte), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecrypt(&aes, dec, NULL, sizeof(enc)/sizeof(byte), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), NULL, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT), a, sizeof(a)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), iv, + sizeof(iv)/sizeof(byte), NULL, sizeof(resultT), a, sizeof(a)), + BAD_FUNC_ARG); + #if (defined(HAVE_FIPS) && FIPS_VERSION_LE(2,0) && defined(WOLFSSL_ARMASM)) + ExpectIntEQ(wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT) + 1, a, sizeof(a)), + AES_GCM_AUTH_E); + #else + ExpectIntEQ(wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), iv, + sizeof(iv)/sizeof(byte), resultT, sizeof(resultT) + 1, a, sizeof(a)), + BAD_FUNC_ARG); + #endif + #if ((defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION == 2)) || defined(HAVE_SELFTEST)) && \ + !defined(WOLFSSL_AES_GCM_FIXED_IV_AAD) + /* FIPS does not check the lower bound of ivSz */ + #else + ExpectIntEQ(wc_AesGcmDecrypt(&aes, dec, enc, sizeof(enc)/sizeof(byte), + iv, 0, resultT, sizeof(resultT), a, sizeof(a)), BAD_FUNC_ARG); + #endif +#endif /* HAVE_AES_DECRYPT */ wc_AesFree(&aes); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_AesGcmEncryptDecrypt */ @@ -19552,64 +19094,58 @@ */ static int test_wc_AesGcmMixedEncDecLongIV(void) { - int ret = TEST_SKIPPED; - + EXPECT_DECLS; #if (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))) && \ !defined(NO_AES) && defined(HAVE_AESGCM) && defined(WOLFSSL_AESGCM_STREAM) - const byte key[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; - const byte in[] = { 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, 0x66,0x6f,0x72,0x20,0x61,0x6c,0x6c,0x20 }; - const byte aad[] = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2 }; + Aes aesEnc; + Aes aesDec; + byte iv[] = "1234567890abcdefghij"; + byte out[sizeof(in)]; + byte plain[sizeof(in)]; + byte tag[AES_BLOCK_SIZE]; - Aes aesEnc, aesDec; - byte iv[] = "1234567890abcdefghij"; - byte out[sizeof(in)]; - byte plain[sizeof(in)]; - byte tag[AES_BLOCK_SIZE]; - + XMEMSET(&aesEnc, 0, sizeof(Aes)); + XMEMSET(&aesDec, 0, sizeof(Aes)); XMEMSET(out, 0, sizeof(out)); XMEMSET(plain, 0, sizeof(plain)); XMEMSET(tag, 0, sizeof(tag)); /* Perform one-shot encryption using long IV */ - AssertIntEQ(wc_AesInit(&aesEnc, NULL, INVALID_DEVID), 0); - AssertIntEQ(wc_AesGcmSetKey(&aesEnc, key, sizeof(key)), 0); - AssertIntEQ(wc_AesGcmEncrypt(&aesEnc, out, in, sizeof(in), iv, sizeof(iv), - tag, sizeof(tag), aad, sizeof(aad)), 0); + ExpectIntEQ(wc_AesInit(&aesEnc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesGcmSetKey(&aesEnc, key, sizeof(key)), 0); + ExpectIntEQ(wc_AesGcmEncrypt(&aesEnc, out, in, sizeof(in), iv, sizeof(iv), + tag, sizeof(tag), aad, sizeof(aad)), 0); /* Perform streaming decryption using long IV */ - AssertIntEQ(wc_AesInit(&aesDec, NULL, INVALID_DEVID), 0); - AssertIntEQ(wc_AesGcmInit(&aesDec, key, sizeof(key), iv, sizeof(iv)), 0); - AssertIntEQ(wc_AesGcmDecryptUpdate(&aesDec, plain, out, sizeof(out), aad, - sizeof(aad)), 0); - AssertIntEQ(wc_AesGcmDecryptFinal(&aesDec, tag, sizeof(tag)), 0); - AssertIntEQ(XMEMCMP(plain, in, sizeof(in)), 0); + ExpectIntEQ(wc_AesInit(&aesDec, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesGcmInit(&aesDec, key, sizeof(key), iv, sizeof(iv)), 0); + ExpectIntEQ(wc_AesGcmDecryptUpdate(&aesDec, plain, out, sizeof(out), aad, + sizeof(aad)), 0); + ExpectIntEQ(wc_AesGcmDecryptFinal(&aesDec, tag, sizeof(tag)), 0); + ExpectIntEQ(XMEMCMP(plain, in, sizeof(in)), 0); /* Free resources */ wc_AesFree(&aesEnc); wc_AesFree(&aesDec); - - ret = TEST_SUCCESS; - #endif - - return ret; + return EXPECT_RESULT(); } /* END wc_AesGcmMixedEncDecLongIV */ @@ -19618,98 +19154,73 @@ */ static int test_wc_GmacSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(HAVE_AESGCM) - Gmac gmac; - byte key16[] = - { + Gmac gmac; + byte key16[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; #ifdef WOLFSSL_AES_192 - byte key24[] = - { + byte key24[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 }; #endif #ifdef WOLFSSL_AES_256 - byte key32[] = - { + byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; #endif - byte badKey16[] = - { + byte badKey16[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x66 }; - byte badKey24[] = - { + byte badKey24[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 }; - byte badKey32[] = - { + byte badKey32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; - int ret = 0; - ret = wc_AesInit(&gmac.aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + XMEMSET(&gmac, 0, sizeof(Gmac)); + + ExpectIntEQ(wc_AesInit(&gmac.aes, NULL, INVALID_DEVID), 0); #ifdef WOLFSSL_AES_128 - ret = wc_GmacSetKey(&gmac, key16, sizeof(key16)/sizeof(byte)); + ExpectIntEQ(wc_GmacSetKey(&gmac, key16, sizeof(key16)/sizeof(byte)), 0); #endif #ifdef WOLFSSL_AES_192 - if (ret == 0) { - ret = wc_GmacSetKey(&gmac, key24, sizeof(key24)/sizeof(byte)); - } + ExpectIntEQ(wc_GmacSetKey(&gmac, key24, sizeof(key24)/sizeof(byte)), 0); #endif #ifdef WOLFSSL_AES_256 - if (ret == 0) { - ret = wc_GmacSetKey(&gmac, key32, sizeof(key32)/sizeof(byte)); - } + ExpectIntEQ(wc_GmacSetKey(&gmac, key32, sizeof(key32)/sizeof(byte)), 0); #endif /* Pass in bad args. */ - if (ret == 0) { - ret = wc_GmacSetKey(NULL, key16, sizeof(key16)/sizeof(byte)); - if (ret == BAD_FUNC_ARG) { - ret = wc_GmacSetKey(&gmac, NULL, sizeof(key16)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_GmacSetKey(&gmac, badKey16, sizeof(badKey16)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_GmacSetKey(&gmac, badKey24, sizeof(badKey24)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_GmacSetKey(&gmac, badKey32, sizeof(badKey32)/sizeof(byte)); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_GmacSetKey(NULL, key16, sizeof(key16)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_GmacSetKey(&gmac, NULL, sizeof(key16)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_GmacSetKey(&gmac, badKey16, sizeof(badKey16)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_GmacSetKey(&gmac, badKey24, sizeof(badKey24)/sizeof(byte)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_GmacSetKey(&gmac, badKey32, sizeof(badKey32)/sizeof(byte)), + BAD_FUNC_ARG); wc_AesFree(&gmac.aes); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_GmacSetKey */ /* @@ -19717,27 +19228,24 @@ */ static int test_wc_GmacUpdate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(HAVE_AESGCM) - Gmac gmac; + Gmac gmac; #ifdef WOLFSSL_AES_128 - const byte key16[] = - { + const byte key16[] = { 0x89, 0xc9, 0x49, 0xe9, 0xc8, 0x04, 0xaf, 0x01, 0x4d, 0x56, 0x04, 0xb3, 0x94, 0x59, 0xf2, 0xc8 }; #endif #ifdef WOLFSSL_AES_192 - byte key24[] = - { + byte key24[] = { 0x41, 0xc5, 0xda, 0x86, 0x67, 0xef, 0x72, 0x52, 0x20, 0xff, 0xe3, 0x9a, 0xe0, 0xac, 0x59, 0x0a, 0xc9, 0xfc, 0xa7, 0x29, 0xab, 0x60, 0xad, 0xa0 }; #endif #ifdef WOLFSSL_AES_256 - byte key32[] = - { + byte key32[] = { 0x78, 0xdc, 0x4e, 0x0a, 0xaf, 0x52, 0xd9, 0x35, 0xc3, 0xc0, 0x1e, 0xea, 0x57, 0x42, 0x8f, 0x00, 0xca, 0x1f, 0xd4, 0x75, 0xf5, 0xda, 0x86, 0xa4, @@ -19745,144 +19253,104 @@ }; #endif #ifdef WOLFSSL_AES_128 - const byte authIn[] = - { + const byte authIn[] = { 0x82, 0xad, 0xcd, 0x63, 0x8d, 0x3f, 0xa9, 0xd9, 0xf3, 0xe8, 0x41, 0x00, 0xd6, 0x1e, 0x07, 0x77 }; #endif #ifdef WOLFSSL_AES_192 - const byte authIn2[] = - { + const byte authIn2[] = { 0x8b, 0x5c, 0x12, 0x4b, 0xef, 0x6e, 0x2f, 0x0f, 0xe4, 0xd8, 0xc9, 0x5c, 0xd5, 0xfa, 0x4c, 0xf1 }; #endif - const byte authIn3[] = - { + const byte authIn3[] = { 0xb9, 0x6b, 0xaa, 0x8c, 0x1c, 0x75, 0xa6, 0x71, 0xbf, 0xb2, 0xd0, 0x8d, 0x06, 0xbe, 0x5f, 0x36 }; #ifdef WOLFSSL_AES_128 - const byte tag1[] = /* Known. */ - { + const byte tag1[] = { /* Known. */ 0x88, 0xdb, 0x9d, 0x62, 0x17, 0x2e, 0xd0, 0x43, 0xaa, 0x10, 0xf1, 0x6d, 0x22, 0x7d, 0xc4, 0x1b }; #endif #ifdef WOLFSSL_AES_192 - const byte tag2[] = /* Known */ - { + const byte tag2[] = { /* Known */ 0x20, 0x4b, 0xdb, 0x1b, 0xd6, 0x21, 0x54, 0xbf, 0x08, 0x92, 0x2a, 0xaa, 0x54, 0xee, 0xd7, 0x05 }; #endif - const byte tag3[] = /* Known */ - { + const byte tag3[] = { /* Known */ 0x3e, 0x5d, 0x48, 0x6a, 0xa2, 0xe3, 0x0b, 0x22, 0xe0, 0x40, 0xb8, 0x57, 0x23, 0xa0, 0x6e, 0x76 }; #ifdef WOLFSSL_AES_128 - const byte iv[] = - { + const byte iv[] = { 0xd1, 0xb1, 0x04, 0xc8, 0x15, 0xbf, 0x1e, 0x94, 0xe2, 0x8c, 0x8f, 0x16 }; #endif #ifdef WOLFSSL_AES_192 - const byte iv2[] = - { + const byte iv2[] = { 0x05, 0xad, 0x13, 0xa5, 0xe2, 0xc2, 0xab, 0x66, 0x7e, 0x1a, 0x6f, 0xbc }; #endif - const byte iv3[] = - { + const byte iv3[] = { 0xd7, 0x9c, 0xf2, 0x2d, 0x50, 0x4c, 0xc7, 0x93, 0xc3, 0xfb, 0x6c, 0x8a }; - byte tagOut[16]; - byte tagOut2[24]; - byte tagOut3[32]; - int ret = 0; + byte tagOut[16]; + byte tagOut2[24]; + byte tagOut3[32]; /* Init stack variables. */ + XMEMSET(&gmac, 0, sizeof(Gmac)); XMEMSET(tagOut, 0, sizeof(tagOut)); XMEMSET(tagOut2, 0, sizeof(tagOut2)); XMEMSET(tagOut3, 0, sizeof(tagOut3)); - ret = wc_AesInit(&gmac.aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; - #ifdef WOLFSSL_AES_128 - ret = wc_GmacSetKey(&gmac, key16, sizeof(key16)); - if (ret == 0) { - ret = wc_GmacUpdate(&gmac, iv, sizeof(iv), authIn, sizeof(authIn), - tagOut, sizeof(tag1)); - if (ret == 0) { - ret = XMEMCMP(tag1, tagOut, sizeof(tag1)); - } - wc_AesFree(&gmac.aes); - } - + ExpectIntEQ(wc_AesInit(&gmac.aes, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_GmacSetKey(&gmac, key16, sizeof(key16)), 0); + ExpectIntEQ(wc_GmacUpdate(&gmac, iv, sizeof(iv), authIn, sizeof(authIn), + tagOut, sizeof(tag1)), 0); + ExpectIntEQ(XMEMCMP(tag1, tagOut, sizeof(tag1)), 0); + wc_AesFree(&gmac.aes); #endif #ifdef WOLFSSL_AES_192 - if (ret == 0) { - XMEMSET(&gmac, 0, sizeof(Gmac)); - ret = wc_GmacSetKey(&gmac, key24, sizeof(key24)/sizeof(byte)); - } - if (ret == 0) { - ret = wc_GmacUpdate(&gmac, iv2, sizeof(iv2), authIn2, - sizeof(authIn2), tagOut2, sizeof(tag2)); - } - if (ret == 0) { - ret = XMEMCMP(tagOut2, tag2, sizeof(tag2)); - wc_AesFree(&gmac.aes); - } + ExpectNotNull(XMEMSET(&gmac, 0, sizeof(Gmac))); + ExpectIntEQ(wc_AesInit(&gmac.aes, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_GmacSetKey(&gmac, key24, sizeof(key24)/sizeof(byte)), 0); + ExpectIntEQ(wc_GmacUpdate(&gmac, iv2, sizeof(iv2), authIn2, sizeof(authIn2), + tagOut2, sizeof(tag2)), 0); + ExpectIntEQ(XMEMCMP(tagOut2, tag2, sizeof(tag2)), 0); + wc_AesFree(&gmac.aes); #endif #ifdef WOLFSSL_AES_256 - if (ret == 0) { - XMEMSET(&gmac, 0, sizeof(Gmac)); - ret = wc_GmacSetKey(&gmac, key32, sizeof(key32)/sizeof(byte)); - } - if (ret == 0) { - ret = wc_GmacUpdate(&gmac, iv3, sizeof(iv3), authIn3, - sizeof(authIn3), tagOut3, sizeof(tag3)); - } - if (ret == 0) { - ret = XMEMCMP(tag3, tagOut3, sizeof(tag3)); - } + ExpectNotNull(XMEMSET(&gmac, 0, sizeof(Gmac))); + ExpectIntEQ(wc_AesInit(&gmac.aes, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_GmacSetKey(&gmac, key32, sizeof(key32)/sizeof(byte)), 0); + ExpectIntEQ(wc_GmacUpdate(&gmac, iv3, sizeof(iv3), authIn3, sizeof(authIn3), + tagOut3, sizeof(tag3)), 0); + ExpectIntEQ(XMEMCMP(tag3, tagOut3, sizeof(tag3)), 0); + wc_AesFree(&gmac.aes); #endif - /*Pass bad args. */ - if (ret == 0) { - ret = wc_GmacUpdate(NULL, iv3, sizeof(iv3), authIn3, - sizeof(authIn3), tagOut3, sizeof(tag3)); - if (ret == BAD_FUNC_ARG) { - ret = wc_GmacUpdate(&gmac, iv3, sizeof(iv3), authIn3, - sizeof(authIn3), tagOut3, sizeof(tag3) - 5); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_GmacUpdate(&gmac, iv3, sizeof(iv3), authIn3, - sizeof(authIn3), tagOut3, sizeof(tag3) + 1); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - + /* Pass bad args. */ + ExpectIntEQ(wc_AesInit(&gmac.aes, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_GmacUpdate(NULL, iv3, sizeof(iv3), authIn3, sizeof(authIn3), + tagOut3, sizeof(tag3)), BAD_FUNC_ARG); + ExpectIntEQ(wc_GmacUpdate(&gmac, iv3, sizeof(iv3), authIn3, sizeof(authIn3), + tagOut3, sizeof(tag3) - 5), BAD_FUNC_ARG); + ExpectIntEQ(wc_GmacUpdate(&gmac, iv3, sizeof(iv3), authIn3, sizeof(authIn3), + tagOut3, sizeof(tag3) + 1), BAD_FUNC_ARG); wc_AesFree(&gmac.aes); - res = TEST_RES_CHECK(ret == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_GmacUpdate */ @@ -19891,73 +19359,50 @@ */ static int test_wc_CamelliaSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_CAMELLIA Camellia camellia; /*128-bit key*/ - static const byte key16[] = - { + static const byte key16[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 }; /* 192-bit key */ - static const byte key24[] = - { + static const byte key24[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }; /* 256-bit key */ - static const byte key32[] = - { + static const byte key32[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; - static const byte iv[] = - { + static const byte iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; - int ret = 0; - ret = wc_CamelliaSetKey(&camellia, key16, (word32)sizeof(key16), iv); - if (ret == 0) { - ret = wc_CamelliaSetKey(&camellia, key16, - (word32)sizeof(key16), NULL); - if (ret == 0) { - ret = wc_CamelliaSetKey(&camellia, key24, - (word32)sizeof(key24), iv); - } - if (ret == 0) { - ret = wc_CamelliaSetKey(&camellia, key24, - (word32)sizeof(key24), NULL); - } - if (ret == 0) { - ret = wc_CamelliaSetKey(&camellia, key32, - (word32)sizeof(key32), iv); - } - if (ret == 0) { - ret = wc_CamelliaSetKey(&camellia, key32, - (word32)sizeof(key32), NULL); - } - } - /* Bad args. */ - if (ret == 0) { - ret = wc_CamelliaSetKey(NULL, key32, (word32)sizeof(key32), iv); - if (ret != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } /* END bad args. */ + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key16, (word32)sizeof(key16), iv), + 0); + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key16, (word32)sizeof(key16), + NULL), 0); + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), iv), + 0); + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), + NULL), 0); + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key32, (word32)sizeof(key32), iv), + 0); + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key32, (word32)sizeof(key32), + NULL), 0); - res = TEST_RES_CHECK(ret == 0); + /* Bad args. */ + ExpectIntEQ(wc_CamelliaSetKey(NULL, key32, (word32)sizeof(key32), iv), + BAD_FUNC_ARG); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_CammeliaSetKey */ /* @@ -19965,121 +19410,69 @@ */ static int test_wc_CamelliaSetIV(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_CAMELLIA Camellia camellia; - static const byte iv[] = - { + static const byte iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; - int ret = 0; - ret = wc_CamelliaSetIV(&camellia, iv); - if (ret == 0) { - ret = wc_CamelliaSetIV(&camellia, NULL); - } - /* Bad args. */ - if (ret == 0) { - ret = wc_CamelliaSetIV(NULL, NULL); - if (ret != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } + ExpectIntEQ(wc_CamelliaSetIV(&camellia, iv), 0); + ExpectIntEQ(wc_CamelliaSetIV(&camellia, NULL), 0); - res = TEST_RES_CHECK(ret == 0); + /* Bad args. */ + ExpectIntEQ(wc_CamelliaSetIV(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaSetIV(NULL, iv), BAD_FUNC_ARG); #endif - return res; -} /*END test_wc_CamelliaSetIV*/ + return EXPECT_RESULT(); +} /* END test_wc_CamelliaSetIV*/ /* * Test wc_CamelliaEncryptDirect and wc_CamelliaDecryptDirect */ static int test_wc_CamelliaEncryptDecryptDirect(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_CAMELLIA Camellia camellia; - static const byte key24[] = - { + static const byte key24[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }; - static const byte iv[] = - { + static const byte iv[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }; - static const byte plainT[] = - { + static const byte plainT[] = { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A }; byte enc[sizeof(plainT)]; byte dec[sizeof(enc)]; - int camE = WOLFSSL_FATAL_ERROR; - int camD = WOLFSSL_FATAL_ERROR; - int ret = 0; - /*Init stack variables.*/ + /* Init stack variables.*/ XMEMSET(enc, 0, 16); XMEMSET(enc, 0, 16); - ret = wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), iv); - if (ret == 0) { - ret = wc_CamelliaEncryptDirect(&camellia, enc, plainT); - if (ret == 0) { - ret = wc_CamelliaDecryptDirect(&camellia, dec, enc); - if (XMEMCMP(plainT, dec, CAMELLIA_BLOCK_SIZE)) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } - /* Pass bad args. */ - if (ret == 0) { - camE = wc_CamelliaEncryptDirect(NULL, enc, plainT); - if (camE == BAD_FUNC_ARG) { - camE = wc_CamelliaEncryptDirect(&camellia, NULL, plainT); - } - if (camE == BAD_FUNC_ARG) { - camE = wc_CamelliaEncryptDirect(&camellia, enc, NULL); - } - if (camE == BAD_FUNC_ARG) { - camE = 0; - } - else { - camE = WOLFSSL_FATAL_ERROR; - } - } - - if (camE != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), iv), + 0); + ExpectIntEQ(wc_CamelliaEncryptDirect(&camellia, enc, plainT), 0); + ExpectIntEQ(wc_CamelliaDecryptDirect(&camellia, dec, enc), 0); + ExpectIntEQ(XMEMCMP(plainT, dec, CAMELLIA_BLOCK_SIZE), 0); - if (ret == 0) { - camD = wc_CamelliaDecryptDirect(NULL, dec, enc); - if (camD == BAD_FUNC_ARG) { - camD = wc_CamelliaDecryptDirect(&camellia, NULL, enc); - } - if (camD == BAD_FUNC_ARG) { - camD = wc_CamelliaDecryptDirect(&camellia, dec, NULL); - } - if (camD == BAD_FUNC_ARG) { - camD = 0; - } - else { - camD = WOLFSSL_FATAL_ERROR; - } - } + /* Pass bad args. */ + ExpectIntEQ(wc_CamelliaEncryptDirect(NULL, enc, plainT), BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaEncryptDirect(&camellia, NULL, plainT), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaEncryptDirect(&camellia, enc, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(camD == 0); + ExpectIntEQ(wc_CamelliaDecryptDirect(NULL, dec, enc), BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaDecryptDirect(&camellia, NULL, enc), BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaDecryptDirect(&camellia, dec, NULL), BAD_FUNC_ARG); #endif - return res; - + return EXPECT_RESULT(); } /* END test-wc_CamelliaEncryptDecryptDirect */ /* @@ -20087,92 +19480,52 @@ */ static int test_wc_CamelliaCbcEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_CAMELLIA Camellia camellia; - static const byte key24[] = - { + static const byte key24[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 }; - static const byte plainT[] = - { + static const byte plainT[] = { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96, 0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A }; byte enc[CAMELLIA_BLOCK_SIZE]; byte dec[CAMELLIA_BLOCK_SIZE]; - int camCbcE = WOLFSSL_FATAL_ERROR; - int camCbcD = WOLFSSL_FATAL_ERROR; - int ret = 0; /* Init stack variables. */ XMEMSET(enc, 0, CAMELLIA_BLOCK_SIZE); XMEMSET(enc, 0, CAMELLIA_BLOCK_SIZE); - ret = wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), NULL); - if (ret == 0) { - ret = wc_CamelliaCbcEncrypt(&camellia, enc, plainT, CAMELLIA_BLOCK_SIZE); - if (ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - ret = wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), NULL); - if (ret == 0) { - ret = wc_CamelliaCbcDecrypt(&camellia, dec, enc, CAMELLIA_BLOCK_SIZE); - if (XMEMCMP(plainT, dec, CAMELLIA_BLOCK_SIZE)) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } - - /* Pass in bad args. */ - if (ret == 0) { - camCbcE = wc_CamelliaCbcEncrypt(NULL, enc, plainT, CAMELLIA_BLOCK_SIZE); - if (camCbcE == BAD_FUNC_ARG) { - camCbcE = wc_CamelliaCbcEncrypt(&camellia, NULL, plainT, - CAMELLIA_BLOCK_SIZE); - } - if (camCbcE == BAD_FUNC_ARG) { - camCbcE = wc_CamelliaCbcEncrypt(&camellia, enc, NULL, - CAMELLIA_BLOCK_SIZE); - } - if (camCbcE == BAD_FUNC_ARG) { - camCbcE = 0; - } - else { - camCbcE = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), + NULL), 0); + ExpectIntEQ(wc_CamelliaCbcEncrypt(&camellia, enc, plainT, + CAMELLIA_BLOCK_SIZE), 0); - if (camCbcE != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_CamelliaSetKey(&camellia, key24, (word32)sizeof(key24), + NULL), 0); + ExpectIntEQ(wc_CamelliaCbcDecrypt(&camellia, dec, enc, CAMELLIA_BLOCK_SIZE), + 0); + ExpectIntEQ(XMEMCMP(plainT, dec, CAMELLIA_BLOCK_SIZE), 0); - if (ret == 0) { - camCbcD = wc_CamelliaCbcDecrypt(NULL, dec, enc, CAMELLIA_BLOCK_SIZE); - if (camCbcD == BAD_FUNC_ARG) { - camCbcD = wc_CamelliaCbcDecrypt(&camellia, NULL, enc, - CAMELLIA_BLOCK_SIZE); - } - if (camCbcD == BAD_FUNC_ARG) { - camCbcD = wc_CamelliaCbcDecrypt(&camellia, dec, NULL, - CAMELLIA_BLOCK_SIZE); - } - if (camCbcD == BAD_FUNC_ARG) { - camCbcD = 0; - } - else { - camCbcD = WOLFSSL_FATAL_ERROR; - } - } /* END bad args. */ + /* Pass in bad args. */ + ExpectIntEQ(wc_CamelliaCbcEncrypt(NULL, enc, plainT, CAMELLIA_BLOCK_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaCbcEncrypt(&camellia, NULL, plainT, + CAMELLIA_BLOCK_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaCbcEncrypt(&camellia, enc, NULL, + CAMELLIA_BLOCK_SIZE), BAD_FUNC_ARG); - res = TEST_RES_CHECK(camCbcD == 0); + ExpectIntEQ(wc_CamelliaCbcDecrypt(NULL, dec, enc, CAMELLIA_BLOCK_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaCbcDecrypt(&camellia, NULL, enc, + CAMELLIA_BLOCK_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_CamelliaCbcDecrypt(&camellia, dec, NULL, + CAMELLIA_BLOCK_SIZE), BAD_FUNC_ARG); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_CamelliaCbcEncryptDecrypt */ @@ -20181,30 +19534,19 @@ */ static int test_wc_Arc4SetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_RC4 Arc4 arc; const char* key = "\x01\x23\x45\x67\x89\xab\xcd\xef"; int keyLen = 8; - int ret = 0; - ret = wc_Arc4SetKey(&arc, (byte*)key, keyLen); + ExpectIntEQ(wc_Arc4SetKey(&arc, (byte*)key, (word32)keyLen), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_Arc4SetKey(NULL, (byte*)key, keyLen); - if (ret == BAD_FUNC_ARG) - ret = wc_Arc4SetKey(&arc, NULL, keyLen); /* NULL key */ - if (ret == BAD_FUNC_ARG) - ret = wc_Arc4SetKey(&arc, (byte*)key, 0); /* length == 0 */ - if (ret == BAD_FUNC_ARG) - ret = WOLFSSL_ERROR_NONE; - else - ret = WOLFSSL_FATAL_ERROR; - } /* END test bad args. */ - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_Arc4SetKey(NULL, (byte*)key, (word32)keyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Arc4SetKey(&arc, NULL , (word32)keyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Arc4SetKey(&arc, (byte*)key, 0 ), BAD_FUNC_ARG); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_Arc4SetKey */ @@ -20213,70 +19555,44 @@ */ static int test_wc_Arc4Process(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_RC4 - Arc4 enc, dec; + Arc4 enc; + Arc4 dec; const char* key = "\x01\x23\x45\x67\x89\xab\xcd\xef"; int keyLen = 8; const char* input = "\x01\x23\x45\x67\x89\xab\xcd\xef"; byte cipher[8]; byte plain[8]; - int ret; /* Init stack variables */ + XMEMSET(&enc, 0, sizeof(Arc4)); + XMEMSET(&dec, 0, sizeof(Arc4)); XMEMSET(cipher, 0, sizeof(cipher)); XMEMSET(plain, 0, sizeof(plain)); /* Use for async. */ - ret = wc_Arc4Init(&enc, NULL, INVALID_DEVID); - if (ret == 0) { - ret = wc_Arc4Init(&dec, NULL, INVALID_DEVID); - } + ExpectIntEQ(wc_Arc4Init(&enc, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_Arc4Init(&dec, NULL, INVALID_DEVID), 0); - if (ret == 0) { - ret = wc_Arc4SetKey(&enc, (byte*)key, keyLen); - } - if (ret == 0) { - ret = wc_Arc4SetKey(&dec, (byte*)key, keyLen); - } - if (ret == 0) { - ret = wc_Arc4Process(&enc, cipher, (byte*)input, keyLen); - } - if (ret == 0) { - ret = wc_Arc4Process(&dec, plain, cipher, keyLen); - if (ret != 0 || XMEMCMP(plain, input, keyLen)) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } + ExpectIntEQ(wc_Arc4SetKey(&enc, (byte*)key, (word32)keyLen), 0); + ExpectIntEQ(wc_Arc4SetKey(&dec, (byte*)key, (word32)keyLen), 0); + + ExpectIntEQ(wc_Arc4Process(&enc, cipher, (byte*)input, (word32)keyLen), 0); + ExpectIntEQ(wc_Arc4Process(&dec, plain, cipher, (word32)keyLen), 0); + ExpectIntEQ(XMEMCMP(plain, input, keyLen), 0); /* Bad args. */ - if (ret == 0) { - ret = wc_Arc4Process(NULL, plain, cipher, keyLen); - if (ret == BAD_FUNC_ARG) { - ret = wc_Arc4Process(&dec, NULL, cipher, keyLen); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_Arc4Process(&dec, plain, NULL, keyLen); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_Arc4Process(NULL, plain, cipher, (word32)keyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Arc4Process(&dec, NULL, cipher, (word32)keyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Arc4Process(&dec, plain, NULL, (word32)keyLen), BAD_FUNC_ARG); wc_Arc4Free(&enc); wc_Arc4Free(&dec); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); -}/* END test_wc_Arc4Process */ +} /* END test_wc_Arc4Process */ /* @@ -20284,38 +19600,20 @@ */ static int test_wc_InitRsaKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_RSA - RsaKey key; - int ret = 0; + RsaKey key; - ret = wc_InitRsaKey(&key, HEAP_HINT); + XMEMSET(&key, 0, sizeof(RsaKey)); - /* Test bad args. */ - if (ret == 0) { - ret = wc_InitRsaKey(NULL, HEAP_HINT); - #ifndef HAVE_USER_RSA - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - #else - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - #endif - ret = WOLFSSL_FATAL_ERROR; - } - } /* end if */ + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + /* Test bad args. */ + ExpectIntEQ(wc_InitRsaKey(NULL, HEAP_HINT), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_InitRsaKey */ @@ -20324,79 +19622,43 @@ */ static int test_wc_RsaPrivateKeyDecode(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && (defined(USE_CERT_BUFFERS_1024)\ || defined(USE_CERT_BUFFERS_2048)) && !defined(HAVE_FIPS) - RsaKey key; - byte* tmp; - word32 idx = 0; - int bytes = 0; - int ret = 0; - - tmp = (byte*)XMALLOC(FOURK_BUF, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (tmp == NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_InitRsaKey(&key, HEAP_HINT); - } - if (ret == 0) { - #ifdef USE_CERT_BUFFERS_1024 - XMEMCPY(tmp, client_key_der_1024, sizeof_client_key_der_1024); - bytes = sizeof_client_key_der_1024; - #else - XMEMCPY(tmp, client_key_der_2048, sizeof_client_key_der_2048); - bytes = sizeof_client_key_der_2048; - #endif /* Use cert buffers. */ + RsaKey key; + byte* tmp = NULL; + word32 idx = 0; + int bytes = 0; - ret = wc_RsaPrivateKeyDecode(tmp, &idx, &key, (word32)bytes); - } - #ifndef HAVE_USER_RSA - /* Test bad args. */ - if (ret == 0) { - ret = wc_RsaPrivateKeyDecode(NULL, &idx, &key, (word32)bytes); - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaPrivateKeyDecode(tmp, NULL, &key, (word32)bytes); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaPrivateKeyDecode(tmp, &idx, NULL, (word32)bytes); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #else - /* Test bad args. User RSA. */ - if (ret == 0) { - ret = wc_RsaPrivateKeyDecode(NULL, &idx, &key, (word32)bytes); - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaPrivateKeyDecode(tmp, NULL, &key, (word32)bytes); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaPrivateKeyDecode(tmp, &idx, NULL, (word32)bytes); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #endif + XMEMSET(&key, 0, sizeof(RsaKey)); + ExpectNotNull(tmp = (byte*)XMALLOC(FOURK_BUF, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); if (tmp != NULL) { - XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; + #ifdef USE_CERT_BUFFERS_1024 + XMEMCPY(tmp, client_key_der_1024, sizeof_client_key_der_1024); + bytes = sizeof_client_key_der_1024; + #else + XMEMCPY(tmp, client_key_der_2048, sizeof_client_key_der_2048); + bytes = sizeof_client_key_der_2048; + #endif /* Use cert buffers. */ } - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_RsaPrivateKeyDecode(tmp, &idx, &key, (word32)bytes), 0); + + /* Test bad args. */ + ExpectIntEQ(wc_RsaPrivateKeyDecode(NULL, &idx, &key, (word32)bytes), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecode(tmp, NULL, &key, (word32)bytes), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecode(tmp, &idx, NULL, (word32)bytes), + BAD_FUNC_ARG); + + XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaPrivateKeyDecode */ @@ -20405,115 +19667,78 @@ */ static int test_wc_RsaPublicKeyDecode(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && (defined(USE_CERT_BUFFERS_1024)\ || defined(USE_CERT_BUFFERS_2048)) && !defined(HAVE_FIPS) - RsaKey keyPub; - byte* tmp; - word32 idx = 0; - int bytes = 0; - word32 keySz = 0; - word32 tstKeySz = 0; - int ret = 0; + RsaKey keyPub; + byte* tmp = NULL; + word32 idx = 0; + int bytes = 0; + word32 keySz = 0; + word32 tstKeySz = 0; #if defined(WC_RSA_PSS) && !defined(NO_FILESYSTEM) - XFILE f; + XFILE f = XBADFILE; const char* rsaPssPubKey = "./certs/rsapss/ca-rsapss-key.der"; const char* rsaPssPubKeyNoParams = "./certs/rsapss/ca-3072-rsapss-key.der"; byte buf[4096]; #endif - tmp = (byte*)XMALLOC(GEN_BUF, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (tmp == NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_InitRsaKey(&keyPub, HEAP_HINT); - } - if (ret == 0) { - #ifdef USE_CERT_BUFFERS_1024 - XMEMCPY(tmp, client_keypub_der_1024, sizeof_client_keypub_der_1024); - bytes = sizeof_client_keypub_der_1024; - keySz = 1024; - #else - XMEMCPY(tmp, client_keypub_der_2048, sizeof_client_keypub_der_2048); - bytes = sizeof_client_keypub_der_2048; - keySz = 2048; - #endif + XMEMSET(&keyPub, 0, sizeof(RsaKey)); - ret = wc_RsaPublicKeyDecode(tmp, &idx, &keyPub, (word32)bytes); - } - #ifndef HAVE_USER_RSA - /* Pass in bad args. */ - if (ret == 0) { - ret = wc_RsaPublicKeyDecode(NULL, &idx, &keyPub, (word32)bytes); - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaPublicKeyDecode(tmp, NULL, &keyPub, (word32)bytes); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaPublicKeyDecode(tmp, &idx, NULL, (word32)bytes); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectNotNull(tmp = (byte*)XMALLOC(GEN_BUF, NULL, DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(wc_InitRsaKey(&keyPub, HEAP_HINT), 0); + if (tmp != NULL) { + #ifdef USE_CERT_BUFFERS_1024 + XMEMCPY(tmp, client_keypub_der_1024, sizeof_client_keypub_der_1024); + bytes = sizeof_client_keypub_der_1024; + keySz = 1024; #else - /* Pass in bad args. */ - if (ret == 0) { - ret = wc_RsaPublicKeyDecode(NULL, &idx, &keyPub, (word32)bytes); - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaPublicKeyDecode(tmp, NULL, &keyPub, (word32)bytes); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaPublicKeyDecode(tmp, &idx, NULL, (word32)bytes); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + XMEMCPY(tmp, client_keypub_der_2048, sizeof_client_keypub_der_2048); + bytes = sizeof_client_keypub_der_2048; + keySz = 2048; #endif - - if (wc_FreeRsaKey(&keyPub) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; } - if (ret == 0) { - /* Test for getting modulus key size */ - idx = 0; - ret = wc_RsaPublicKeyDecode_ex(tmp, &idx, (word32)bytes, NULL, - &tstKeySz, NULL, NULL); - ret = (ret == 0 && tstKeySz == keySz/8) ? 0 : WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_RsaPublicKeyDecode(tmp, &idx, &keyPub, (word32)bytes), 0); + + /* Pass in bad args. */ + ExpectIntEQ(wc_RsaPublicKeyDecode(NULL, &idx, &keyPub, (word32)bytes), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPublicKeyDecode(tmp, NULL, &keyPub, (word32)bytes), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPublicKeyDecode(tmp, &idx, NULL, (word32)bytes), + BAD_FUNC_ARG); + + DoExpectIntEQ(wc_FreeRsaKey(&keyPub), 0); + + /* Test for getting modulus key size */ + idx = 0; + ExpectIntEQ(wc_RsaPublicKeyDecode_ex(tmp, &idx, (word32)bytes, NULL, + &tstKeySz, NULL, NULL), 0); + ExpectIntEQ(tstKeySz, keySz/8); #if defined(WC_RSA_PSS) && !defined(NO_FILESYSTEM) - f = XFOPEN(rsaPssPubKey, "rb"); - AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(rsaPssPubKey, "rb")) != XBADFILE); + ExpectIntGT(bytes = (int)XFREAD(buf, 1, sizeof(buf), f), 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } idx = 0; - AssertIntEQ(wc_RsaPublicKeyDecode_ex(buf, &idx, bytes, NULL, NULL, NULL, - NULL), 0); - f = XFOPEN(rsaPssPubKeyNoParams, "rb"); - AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectIntEQ(wc_RsaPublicKeyDecode_ex(buf, &idx, (word32)bytes, NULL, NULL, NULL, + NULL), 0); + ExpectTrue((f = XFOPEN(rsaPssPubKeyNoParams, "rb")) != XBADFILE); + ExpectIntGT(bytes = (int)XFREAD(buf, 1, sizeof(buf), f), 0); + if (f != XBADFILE) + XFCLOSE(f); idx = 0; - AssertIntEQ(wc_RsaPublicKeyDecode_ex(buf, &idx, bytes, NULL, NULL, NULL, - NULL), 0); + ExpectIntEQ(wc_RsaPublicKeyDecode_ex(buf, &idx, (word32)bytes, NULL, NULL, NULL, + NULL), 0); #endif - if (tmp != NULL) { - XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - - res = TEST_RES_CHECK(ret == 0); + XFREE(tmp, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaPublicKeyDecode */ /* @@ -20521,67 +19746,132 @@ */ static int test_wc_RsaPublicKeyDecodeRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) - RsaKey key; - const byte n = 0x23; - const byte e = 0x03; - int nSz = sizeof(n); - int eSz = sizeof(e); - int ret; + RsaKey key; + const byte n = 0x23; + const byte e = 0x03; + int nSz = sizeof(n); + int eSz = sizeof(e); + + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_RsaPublicKeyDecodeRaw(&n, nSz, &e, eSz, &key), 0); - ret = wc_InitRsaKey(&key, HEAP_HINT); - if (ret == 0) { - ret = wc_RsaPublicKeyDecodeRaw(&n, nSz, &e, eSz, &key); - } -#ifndef HAVE_USER_RSA /* Pass in bad args. */ - if (ret == 0) { - ret = wc_RsaPublicKeyDecodeRaw(NULL, nSz, &e, eSz, &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaPublicKeyDecodeRaw(&n, nSz, NULL, eSz, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaPublicKeyDecodeRaw(&n, nSz, &e, eSz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } -#else - /* Pass in bad args. User RSA. */ - if (ret == 0) { - ret = wc_RsaPublicKeyDecodeRaw(NULL, nSz, &e, eSz, &key); - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaPublicKeyDecodeRaw(&n, nSz, NULL, eSz, &key); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaPublicKeyDecodeRaw(&n, nSz, &e, eSz, NULL); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } -#endif + ExpectIntEQ(wc_RsaPublicKeyDecodeRaw(NULL, nSz, &e, eSz, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPublicKeyDecodeRaw(&n, nSz, NULL, eSz, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPublicKeyDecodeRaw(&n, nSz, &e, eSz, NULL), + BAD_FUNC_ARG); - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaPublicKeyDecodeRaw */ -#if (!defined(NO_RSA) || !defined(HAVE_FAST_RSA)) && defined(WOLFSSL_KEY_GEN) +/* + * Testing wc_RsaPrivateKeyDecodeRaw() + */ +static int test_wc_RsaPrivateKeyDecodeRaw(void) +{ + EXPECT_DECLS; +#if !defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) \ + && !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) + RsaKey key; + const byte n = 33; + const byte e = 3; + const byte d = 7; + const byte u = 2; + const byte p = 3; + const byte q = 11; + const byte dp = 1; + const byte dq = 7; + + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), NULL, 0, + NULL, 0, &key), 0); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + NULL, 0, &key), 0); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), NULL, 0, + &dq, sizeof(dq), &key), 0); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), 0); + + /* Pass in bad args. */ + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(NULL, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, 0, + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + NULL, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, 0, &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), NULL, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, 0, &u, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + NULL, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, 0, &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), NULL, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, sizeof(u), + &p, sizeof(p), &q, 0, &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); +#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, 0, + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), NULL, sizeof(u), + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n), + &e, sizeof(e), &d, sizeof(d), &u, 0, + &p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp), + &dq, sizeof(dq), &key), BAD_FUNC_ARG); +#endif + + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); +#endif + return EXPECT_RESULT(); +} /* END test_wc_RsaPrivateKeyDecodeRaw */ + + +#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) /* In FIPS builds, wc_MakeRsaKey() will return an error if it cannot find * a probable prime in 5*(modLen/2) attempts. In non-FIPS builds, it keeps * trying until it gets a probable prime. */ @@ -20611,83 +19901,38 @@ */ static int test_wc_MakeRsaKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - RsaKey genKey; - WC_RNG rng; - #if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) - int bits = 1024; - #else - int bits = 2048; - #endif - int ret = 0; + RsaKey genKey; + WC_RNG rng; +#if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ + (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) + int bits = 1024; +#else + int bits = 2048; +#endif - ret = wc_InitRsaKey(&genKey, HEAP_HINT); - if (ret == 0) { - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = MAKE_RSA_KEY(&genKey, bits, WC_RSA_EXPONENT, &rng); - if (ret == 0 && wc_FreeRsaKey(&genKey) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } - #ifndef HAVE_USER_RSA - /* Test bad args. */ - if (ret == 0) { - ret = MAKE_RSA_KEY(NULL, bits, WC_RSA_EXPONENT, &rng); - if (ret == BAD_FUNC_ARG) { - ret = MAKE_RSA_KEY(&genKey, bits, WC_RSA_EXPONENT, NULL); - } - if (ret == BAD_FUNC_ARG) { - /* e < 3 */ - ret = MAKE_RSA_KEY(&genKey, bits, 2, &rng); - } - if (ret == BAD_FUNC_ARG) { - /* e & 1 == 0 */ - ret = MAKE_RSA_KEY(&genKey, bits, 6, &rng); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #else - /* Test bad args. */ - if (ret == 0) { - ret = MAKE_RSA_KEY(NULL, bits, WC_RSA_EXPONENT, &rng); - if (ret == USER_CRYPTO_ERROR) { - ret = MAKE_RSA_KEY(&genKey, bits, WC_RSA_EXPONENT, NULL); - } - if (ret == USER_CRYPTO_ERROR) { - /* e < 3 */ - ret = MAKE_RSA_KEY(&genKey, bits, 2, &rng); - } - if (ret == USER_CRYPTO_ERROR) { - /* e & 1 == 0 */ - ret = MAKE_RSA_KEY(&genKey, bits, 6, &rng); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #endif + XMEMSET(&genKey, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_InitRsaKey(&genKey, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(MAKE_RSA_KEY(&genKey, bits, WC_RSA_EXPONENT, &rng), 0); + DoExpectIntEQ(wc_FreeRsaKey(&genKey), 0); - res = TEST_RES_CHECK(ret == 0); -#endif - return res; + /* Test bad args. */ + ExpectIntEQ(MAKE_RSA_KEY(NULL, bits, WC_RSA_EXPONENT, &rng), BAD_FUNC_ARG); + ExpectIntEQ(MAKE_RSA_KEY(&genKey, bits, WC_RSA_EXPONENT, NULL), + BAD_FUNC_ARG); + /* e < 3 */ + ExpectIntEQ(MAKE_RSA_KEY(&genKey, bits, 2, &rng), BAD_FUNC_ARG); + /* e & 1 == 0 */ + ExpectIntEQ(MAKE_RSA_KEY(&genKey, bits, 6, &rng), BAD_FUNC_ARG); + DoExpectIntEQ(wc_FreeRng(&rng), 0); +#endif + return EXPECT_RESULT(); } /* END test_wc_MakeRsaKey */ /* @@ -20701,7 +19946,7 @@ */ static int test_RsaDecryptBoundsCheck(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WC_RSA_NO_PADDING) && \ (defined(USE_CERT_BUFFERS_1024) || defined(USE_CERT_BUFFERS_2048)) && \ defined(WOLFSSL_PUBLIC_MP) && !defined(NO_RSA_BOUNDS_CHECK) @@ -20711,16 +19956,14 @@ word32 flatCSz; byte out[256]; word32 outSz = sizeof(out); - int ret; - XMEMSET(&rng, 0, sizeof(rng)); - - ret = wc_InitRng(&rng); + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) - ret = wc_InitRsaKey(&key, HEAP_HINT); + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); - if (ret == 0) { + if (EXPECT_SUCCESS()) { const byte* derKey; word32 derKeySz; word32 idx = 0; @@ -20735,37 +19978,30 @@ flatCSz = 256; #endif - ret = wc_RsaPrivateKeyDecode(derKey, &idx, &key, derKeySz); + ExpectIntEQ(wc_RsaPrivateKeyDecode(derKey, &idx, &key, derKeySz), 0); } - if (ret == 0) { + if (EXPECT_SUCCESS()) { XMEMSET(flatC, 0, flatCSz); flatC[flatCSz-1] = 1; - ret = wc_RsaDirect(flatC, flatCSz, out, &outSz, &key, - RSA_PRIVATE_DECRYPT, &rng); - - if (ret == RSA_OUT_OF_RANGE_E) { + ExpectIntEQ(wc_RsaDirect(flatC, flatCSz, out, &outSz, &key, + RSA_PRIVATE_DECRYPT, &rng), RSA_OUT_OF_RANGE_E); + if (EXPECT_SUCCESS()) { mp_int c; - mp_init_copy(&c, &key.n); - mp_sub_d(&c, 1, &c); - mp_to_unsigned_bin(&c, flatC); - ret = wc_RsaDirect(flatC, flatCSz, out, &outSz, &key, - RSA_PRIVATE_DECRYPT, NULL); + ExpectIntEQ(mp_init_copy(&c, &key.n), 0); + ExpectIntEQ(mp_sub_d(&c, 1, &c), 0); + ExpectIntEQ(mp_to_unsigned_bin(&c, flatC), 0); + ExpectIntEQ(wc_RsaDirect(flatC, flatCSz, out, &outSz, &key, + RSA_PRIVATE_DECRYPT, NULL), RSA_OUT_OF_RANGE_E); mp_clear(&c); } - if (ret == RSA_OUT_OF_RANGE_E) - ret = 0; - else - ret = WOLFSSL_FATAL_ERROR; } - if (wc_FreeRsaKey(&key) || wc_FreeRng(&rng) || ret != 0) - ret = WOLFSSL_FATAL_ERROR; - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaDecryptBoundsCheck */ /* @@ -20773,67 +20009,38 @@ */ static int test_wc_SetKeyUsage(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN) && !defined(HAVE_FIPS) - Cert myCert; - int ret = 0; + Cert myCert; - ret = wc_InitCert(&myCert); + ExpectIntEQ(wc_InitCert(&myCert), 0); - if (ret == 0) { - ret = wc_SetKeyUsage(&myCert, "keyEncipherment,keyAgreement"); - if (ret == 0) { - ret = wc_SetKeyUsage(&myCert, "digitalSignature,nonRepudiation"); - } - if (ret == 0) { - ret = wc_SetKeyUsage(&myCert, "contentCommitment,encipherOnly"); - } - if (ret == 0) { - ret = wc_SetKeyUsage(&myCert, "decipherOnly"); - } - if (ret == 0) { - ret = wc_SetKeyUsage(&myCert, "cRLSign,keyCertSign"); - } - } - /* Test bad args. */ - if (ret == 0) { - ret = wc_SetKeyUsage(NULL, "decipherOnly"); - if (ret == BAD_FUNC_ARG) { - ret = wc_SetKeyUsage(&myCert, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_SetKeyUsage(&myCert, ""); - } - if (ret == KEYUSAGE_E) { - ret = wc_SetKeyUsage(&myCert, ","); - } - if (ret == KEYUSAGE_E) { - ret = wc_SetKeyUsage(&myCert, "digitalSignature, cRLSign"); - } - if (ret == KEYUSAGE_E) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_SetKeyUsage(&myCert, "keyEncipherment,keyAgreement"), 0); + ExpectIntEQ(wc_SetKeyUsage(&myCert, "digitalSignature,nonRepudiation"), 0); + ExpectIntEQ(wc_SetKeyUsage(&myCert, "contentCommitment,encipherOnly"), 0); + ExpectIntEQ(wc_SetKeyUsage(&myCert, "decipherOnly"), 0); + ExpectIntEQ(wc_SetKeyUsage(&myCert, "cRLSign,keyCertSign"), 0); - res = TEST_RES_CHECK(ret == 0); + /* Test bad args. */ + ExpectIntEQ(wc_SetKeyUsage(NULL, "decipherOnly"), BAD_FUNC_ARG); + ExpectIntEQ(wc_SetKeyUsage(&myCert, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_SetKeyUsage(&myCert, ""), KEYUSAGE_E); + ExpectIntEQ(wc_SetKeyUsage(&myCert, ","), KEYUSAGE_E); + ExpectIntEQ(wc_SetKeyUsage(&myCert, "digitalSignature, cRLSign"), + KEYUSAGE_E); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_SetKeyUsage */ + /* * Testing wc_CheckProbablePrime() */ static int test_wc_CheckProbablePrime(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && !defined(HAVE_SELFTEST) && \ !defined(HAVE_FIPS) && defined(WC_RSA_BLINDING) - #define CHECK_PROBABLE_PRIME_KEY_BITS 2048 - RsaKey key; WC_RNG rng; byte e[3]; @@ -20847,360 +20054,204 @@ byte q[CHECK_PROBABLE_PRIME_KEY_BITS / 8 / 2]; word32 qSz = (word32)sizeof(q); int nlen = CHECK_PROBABLE_PRIME_KEY_BITS; - int ret = 0; int* isPrime; int test[5]; isPrime = test; - ret = wc_InitRsaKey(&key, HEAP_HINT); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = wc_RsaSetRNG(&key, &rng); - } - if (ret == 0) { - ret = wc_MakeRsaKey(&key, CHECK_PROBABLE_PRIME_KEY_BITS, WC_RSA_EXPONENT, &rng); - } - if (ret == 0) { - PRIVATE_KEY_UNLOCK(); - ret = wc_RsaExportKey(&key, e, &eSz, n, &nSz, d, &dSz, - p, &pSz, q, &qSz); - PRIVATE_KEY_LOCK(); - } + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_RsaSetRNG(&key, &rng), 0); + ExpectIntEQ(wc_MakeRsaKey(&key, CHECK_PROBABLE_PRIME_KEY_BITS, + WC_RSA_EXPONENT, &rng), 0); + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_RsaExportKey(&key, e, &eSz, n, &nSz, d, &dSz, p, &pSz, q, + &qSz), 0); + PRIVATE_KEY_LOCK(); + /* Bad cases */ - if (ret == 0) { - ret = wc_CheckProbablePrime(NULL, pSz, q, qSz, e, eSz, - nlen, isPrime); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_CheckProbablePrime(p, 0, q, qSz, e, eSz, - nlen, isPrime); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_CheckProbablePrime(p, pSz, NULL, qSz, e, eSz, - nlen, isPrime); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_CheckProbablePrime(p, pSz, q, 0, e, eSz, - nlen, isPrime); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_CheckProbablePrime(p, pSz, q, qSz, NULL, eSz, - nlen, isPrime); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_CheckProbablePrime(p, pSz, q, qSz, e, 0, - nlen, isPrime); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_CheckProbablePrime(NULL, 0, NULL, 0, NULL, 0, - nlen, isPrime); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_CheckProbablePrime(NULL, pSz, q, qSz, e, eSz, nlen, isPrime), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CheckProbablePrime(p, 0, q, qSz, e, eSz, nlen, isPrime), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CheckProbablePrime(p, pSz, NULL, qSz, e, eSz, nlen, isPrime), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CheckProbablePrime(p, pSz, q, 0, e, eSz, nlen, isPrime), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CheckProbablePrime(p, pSz, q, qSz, NULL, eSz, nlen, isPrime), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CheckProbablePrime(p, pSz, q, qSz, e, 0, nlen, isPrime), + BAD_FUNC_ARG); + ExpectIntEQ(wc_CheckProbablePrime(NULL, 0, NULL, 0, NULL, 0, nlen, isPrime), + BAD_FUNC_ARG); /* Good case */ - if (ret == 0) { - ret = wc_CheckProbablePrime(p, pSz, q, qSz, e, eSz, - nlen, isPrime); - } - wc_FreeRsaKey(&key); - wc_FreeRng(&rng); + ExpectIntEQ(wc_CheckProbablePrime(p, pSz, q, qSz, e, eSz, nlen, isPrime), + 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + wc_FreeRng(&rng); #undef CHECK_PROBABLE_PRIME_KEY_BITS - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_CheckProbablePrime */ /* * Testing wc_RsaPSS_Verify() */ static int test_wc_RsaPSS_Verify(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && !defined(HAVE_SELFTEST) && \ !defined(HAVE_FIPS) && defined(WC_RSA_BLINDING) && defined(WC_RSA_PSS) RsaKey key; WC_RNG rng; int sz = 256; - byte* pt; const char* szMessage = "This is the string to be signed"; unsigned char pSignature[2048/8]; /* 2048 is RSA_KEY_SIZE */ unsigned char pDecrypted[2048/8]; + byte* pt = pDecrypted; word32 outLen = sizeof(pDecrypted); - int ret = 0; - pt = pDecrypted; - ret = wc_InitRsaKey(&key, HEAP_HINT); + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = wc_RsaSetRNG(&key, &rng); - } - if (ret == 0) { - ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng); - } + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_RsaSetRNG(&key, &rng), 0); + ExpectIntEQ(wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng), 0); + + ExpectIntGT(sz = wc_RsaPSS_Sign((byte*)szMessage, + (word32)XSTRLEN(szMessage)+1, pSignature, sizeof(pSignature), + WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng), 0); - if (ret == 0) { - ret = wc_RsaPSS_Sign((byte*)szMessage, (word32)XSTRLEN(szMessage)+1, - pSignature, sizeof(pSignature), - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng); - if (ret > 0) { - sz = ret; - ret = 0; - } - } /* Bad cases */ - if (ret == 0) { - ret = wc_RsaPSS_Verify(NULL, sz, pt, outLen, - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_Verify(pSignature, 0, pt, outLen, - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_Verify(pSignature, sz, NULL, outLen, - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_Verify(NULL, 0, NULL, outLen, - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_RsaPSS_Verify(NULL, (word32)sz, pt, outLen, + WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_Verify(pSignature, 0, pt, outLen, + WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_Verify(pSignature, (word32)sz, NULL, outLen, + WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_Verify(NULL, 0, NULL, outLen, + WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + /* Good case */ - if (ret == 0) { - ret = wc_RsaPSS_Verify(pSignature, sz, pt, outLen, - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret > 0) { - ret = 0; - } - } - wc_FreeRsaKey(&key); - wc_FreeRng(&rng); + ExpectIntGT(wc_RsaPSS_Verify(pSignature, (word32)sz, pt, outLen, + WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), 0); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + wc_FreeRng(&rng); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaPSS_Verify */ /* * Testing wc_RsaPSS_VerifyCheck() */ static int test_wc_RsaPSS_VerifyCheck(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && !defined(HAVE_SELFTEST) && \ !defined(HAVE_FIPS) && defined(WC_RSA_BLINDING) && defined(WC_RSA_PSS) RsaKey key; WC_RNG rng; int sz = 256; /* 2048/8 */ - byte* pt; byte digest[32]; word32 digestSz = sizeof(digest); unsigned char pSignature[2048/8]; /* 2048 is RSA_KEY_SIZE */ word32 pSignatureSz = sizeof(pSignature); unsigned char pDecrypted[2048/8]; + byte* pt = pDecrypted; word32 outLen = sizeof(pDecrypted); - int ret = 0; - pt = pDecrypted; + + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(digest, 0, sizeof(digest)); XMEMSET(pSignature, 0, sizeof(pSignature)); - ret = wc_InitRsaKey(&key, HEAP_HINT); - - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = wc_RsaSetRNG(&key, &rng); - } - if (ret == 0) { - ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng); - } - if (ret == 0) { - digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256); - ret = wc_Hash(WC_HASH_TYPE_SHA256, pSignature, sz, digest, digestSz); + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_RsaSetRNG(&key, &rng), 0); + ExpectIntEQ(wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng), 0); + ExpectTrue((digestSz = (word32)wc_HashGetDigestSize(WC_HASH_TYPE_SHA256)) > 0); + ExpectIntEQ(wc_Hash(WC_HASH_TYPE_SHA256, pSignature, (word32)sz, digest, digestSz), + 0); - } + ExpectIntGT(sz = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz, + WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng), 0); - if (ret == 0) { - ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, pSignatureSz, - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng); - if (ret > 0) { - sz = ret; - ret = 0; - } - } /* Bad cases */ - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheck(NULL, sz, pt, outLen, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheck(pSignature, 0, pt, outLen, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheck(pSignature, sz, NULL, outLen, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheck(NULL, 0, NULL, outLen, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_RsaPSS_VerifyCheck(NULL, (word32)sz, pt, outLen, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_VerifyCheck(pSignature, 0, pt, outLen, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_VerifyCheck(pSignature, (word32)sz, NULL, outLen, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_VerifyCheck(NULL, 0, NULL, outLen, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); /* Good case */ - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheck(pSignature, sz, pt, outLen, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret > 0) { - ret = 0; - } - } - wc_FreeRsaKey(&key); - wc_FreeRng(&rng); + ExpectIntGT(wc_RsaPSS_VerifyCheck(pSignature, (word32)sz, pt, outLen, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), 0); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_FreeRsaKey(&key), 0); + wc_FreeRng(&rng); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaPSS_VerifyCheck */ /* * Testing wc_RsaPSS_VerifyCheckInline() */ static int test_wc_RsaPSS_VerifyCheckInline(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && !defined(HAVE_SELFTEST) && \ !defined(HAVE_FIPS) && defined(WC_RSA_BLINDING) && defined(WC_RSA_PSS) - RsaKey key; - WC_RNG rng; - int sz = 256; - byte* pt; - byte digest[32]; - word32 digestSz = sizeof(digest); - unsigned char pSignature[2048/8]; /* 2048 is RSA_KEY_SIZE */ - unsigned char pDecrypted[2048/8]; - int ret; - pt = pDecrypted; + RsaKey key; + WC_RNG rng; + int sz = 256; + byte digest[32]; + word32 digestSz = sizeof(digest); + unsigned char pSignature[2048/8]; /* 2048 is RSA_KEY_SIZE */ + unsigned char pDecrypted[2048/8]; + byte* pt = pDecrypted; - ret = wc_InitRsaKey(&key, HEAP_HINT); + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(digest, 0, sizeof(digest)); XMEMSET(pSignature, 0, sizeof(pSignature)); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = wc_RsaSetRNG(&key, &rng); - } - if (ret == 0) { - ret = wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng); - } - if (ret == 0) { - digestSz = wc_HashGetDigestSize(WC_HASH_TYPE_SHA256); - ret = wc_Hash(WC_HASH_TYPE_SHA256, pSignature, sz, digest, digestSz); + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_RsaSetRNG(&key, &rng), 0); + ExpectIntEQ(wc_MakeRsaKey(&key, 2048, WC_RSA_EXPONENT, &rng), 0); + ExpectTrue((digestSz = (word32)wc_HashGetDigestSize(WC_HASH_TYPE_SHA256)) > 0); + ExpectIntEQ(wc_Hash(WC_HASH_TYPE_SHA256, pSignature, (word32)sz, digest, digestSz), + 0); - } + ExpectIntGT(sz = wc_RsaPSS_Sign(digest, digestSz, pSignature, + sizeof(pSignature), WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng), 0); - if (ret == 0) { - ret = wc_RsaPSS_Sign(digest, digestSz, pSignature, sizeof(pSignature), - WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key, &rng); - if (ret > 0) { - sz = ret; - ret = 0; - } - } /* Bad Cases */ - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheckInline(NULL, sz, &pt, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheckInline(pSignature, 0, NULL, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheckInline(NULL, 0, &pt, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheckInline(pSignature, sz, &pt, - digest, digestSz, WC_HASH_TYPE_SHA, WC_MGF1SHA256, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_RsaPSS_VerifyCheckInline(NULL, (word32)sz, &pt, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_VerifyCheckInline(pSignature, 0, NULL, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_VerifyCheckInline(NULL, 0, &pt, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaPSS_VerifyCheckInline(pSignature, (word32)sz, &pt, digest, + digestSz, WC_HASH_TYPE_SHA, WC_MGF1SHA256, &key), BAD_FUNC_ARG); + /* Good case */ - if (ret == 0) { - ret = wc_RsaPSS_VerifyCheckInline(pSignature, sz, &pt, - digest, digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key); - if (ret > 0) { - ret = 0; - } - } - wc_FreeRsaKey(&key); - wc_FreeRng(&rng); + ExpectIntGT(wc_RsaPSS_VerifyCheckInline(pSignature, (word32)sz, &pt, digest, + digestSz, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, &key), 0); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + wc_FreeRng(&rng); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaPSS_VerifyCheckInline */ #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) @@ -21217,162 +20268,87 @@ */ static int test_wc_LockMutex_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) - int ret = 0; int flag = CRYPTO_LOCK; int type = 0; const char* file = "./test-LockMutex_ex.txt"; int line = 0; /* without SetMutexCb */ - ret = wc_LockMutex_ex(flag, type, file, line); - if (ret == BAD_STATE_E) { - ret = 0; - } + ExpectIntEQ(wc_LockMutex_ex(flag, type, file, line), BAD_STATE_E); /* with SetMutexCb */ - if (ret == 0) { - ret = wc_SetMutexCb(sample_mutex_cb); - if (ret == 0) { - ret = wc_LockMutex_ex(flag, type, file, line); - } - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_SetMutexCb(sample_mutex_cb), 0); + ExpectIntEQ(wc_LockMutex_ex(flag, type, file, line), 0); + ExpectIntEQ(wc_SetMutexCb(NULL), 0); #endif - return res; -}/*End test_wc_LockMutex_ex*/ + return EXPECT_RESULT(); +} /* End test_wc_LockMutex_ex*/ /* * Testing wc_SetMutexCb */ static int test_wc_SetMutexCb(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) - int ret = wc_SetMutexCb(sample_mutex_cb); - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_SetMutexCb(sample_mutex_cb), 0); + ExpectIntEQ(wc_SetMutexCb(NULL), 0); #endif - return res; -}/*End test_wc_SetMutexCb*/ + return EXPECT_RESULT(); +} /* End test_wc_SetMutexCb*/ /* * Testing wc_RsaKeyToDer() */ static int test_wc_RsaKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - RsaKey genKey; - WC_RNG rng; - byte* der; - int ret = 0; - #if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) + RsaKey genKey; + WC_RNG rng; + byte* der = NULL; +#if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ + (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) int bits = 1024; word32 derSz = 611; /* (2 x 128) + 2 (possible leading 00) + (5 x 64) + 5 (possible leading 00) + 3 (e) + 8 (ASN tag) + 10 (ASN length) + 4 seqSz + 3 version */ - #else +#else int bits = 2048; word32 derSz = 1196; /* (2 x 256) + 2 (possible leading 00) + (5 x 128) + 5 (possible leading 00) + 3 (e) + 8 (ASN tag) + 17 (ASN length) + 4 seqSz + 3 version */ - #endif +#endif + XMEMSET(&rng, 0, sizeof(rng)); XMEMSET(&genKey, 0, sizeof(genKey)); - der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (der == NULL) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectNotNull(der = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER)); /* Init structures. */ - if (ret == 0) { - ret = wc_InitRsaKey(&genKey, HEAP_HINT); - } - if (ret == 0) { - ret = wc_InitRng(&rng); - } + ExpectIntEQ(wc_InitRsaKey(&genKey, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); /* Make key. */ - if (ret == 0) { - ret = MAKE_RSA_KEY(&genKey, bits, WC_RSA_EXPONENT, &rng); - if (ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(MAKE_RSA_KEY(&genKey, bits, WC_RSA_EXPONENT, &rng), 0); - if (ret == 0) { - ret = wc_RsaKeyToDer(&genKey, der, derSz); - if (ret > 0) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #ifndef HAVE_USER_RSA - /* Pass good/bad args. */ - if (ret == 0) { - ret = wc_RsaKeyToDer(NULL, der, FOURK_BUF); - if (ret == BAD_FUNC_ARG) { - /* Get just the output length */ - ret = wc_RsaKeyToDer(&genKey, NULL, 0); - } - if (ret > 0) { - /* Try Public Key. */ - genKey.type = 0; - ret = wc_RsaKeyToDer(&genKey, der, FOURK_BUF); - #ifdef WOLFSSL_CHECK_MEM_ZERO - /* Put back to Private Key */ - genKey.type = 1; - #endif - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #else - /* Pass good/bad args. */ - if (ret == 0) { - ret = wc_RsaKeyToDer(NULL, der, FOURK_BUF); - if (ret == USER_CRYPTO_ERROR) { - /* Get just the output length */ - ret = wc_RsaKeyToDer(&genKey, NULL, 0); - } - if (ret > 0) { - /* Try Public Key. */ - genKey.type = 0; - ret = wc_RsaKeyToDer(&genKey, der, FOURK_BUF); - #ifdef WOLFSSL_CHECK_MEM_ZERO - /* Put back to Private Key */ - genKey.type = 1; - #endif - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #endif + ExpectIntGT(wc_RsaKeyToDer(&genKey, der, derSz), 0); - if (der != NULL) { - XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - if (wc_FreeRsaKey(&genKey) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + /* Pass good/bad args. */ + ExpectIntEQ(wc_RsaKeyToDer(NULL, der, FOURK_BUF), BAD_FUNC_ARG); + /* Get just the output length */ + ExpectIntGT(wc_RsaKeyToDer(&genKey, NULL, 0), 0); + /* Try Public Key. */ + genKey.type = 0; + ExpectIntEQ(wc_RsaKeyToDer(&genKey, der, FOURK_BUF), BAD_FUNC_ARG); + #ifdef WOLFSSL_CHECK_MEM_ZERO + /* Put back to Private Key */ + genKey.type = 1; + #endif - res = TEST_RES_CHECK(ret == 0); + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); + DoExpectIntEQ(wc_FreeRsaKey(&genKey), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaKeyToDer */ /* @@ -21380,113 +20356,47 @@ */ static int test_wc_RsaKeyToPublicDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - RsaKey key; - WC_RNG rng; - byte* der; - int ret = 0; - #if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) - int bits = 1024; - word32 derLen = 162; - #else - int bits = 2048; - word32 derLen = 294; - #endif + RsaKey key; + WC_RNG rng; + byte* der = NULL; +#if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ + (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) + int bits = 1024; + word32 derLen = 162; +#else + int bits = 2048; + word32 derLen = 294; +#endif + int ret; XMEMSET(&rng, 0, sizeof(rng)); XMEMSET(&key, 0, sizeof(key)); - der = (byte*)XMALLOC(derLen, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (der == NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_InitRsaKey(&key, HEAP_HINT); - } - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng); - } - - if (ret == 0) { - /* test getting size only */ - ret = wc_RsaKeyToPublicDer(&key, NULL, derLen); - if (ret >= 0) - ret = 0; - } - if (ret == 0) { - ret = wc_RsaKeyToPublicDer(&key, der, derLen); - if (ret >= 0) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (ret == 0) { - /* test getting size only */ - ret = wc_RsaKeyToPublicDer_ex(&key, NULL, derLen, 0); - if (ret >= 0) - ret = 0; - } - if (ret == 0) { - ret = wc_RsaKeyToPublicDer_ex(&key, der, derLen, 0); - if (ret >= 0) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectNotNull(der = (byte*)XMALLOC(derLen, NULL, DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng), 0); + + /* test getting size only */ + ExpectIntGT(wc_RsaKeyToPublicDer(&key, NULL, derLen), 0); + ExpectIntGT(wc_RsaKeyToPublicDer(&key, der, derLen), 0); + + /* test getting size only */ + ExpectIntGT(wc_RsaKeyToPublicDer_ex(&key, NULL, derLen, 0), 0); + ExpectIntGT(wc_RsaKeyToPublicDer_ex(&key, der, derLen, 0), 0); - #ifndef HAVE_USER_RSA - /* Pass in bad args. */ - if (ret == 0) { - ret = wc_RsaKeyToPublicDer(NULL, der, derLen); - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaKeyToPublicDer(&key, der, -1); - } - if (ret == BUFFER_E || ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #else - /* Pass in bad args. */ - if (ret == 0) { - ret = wc_RsaKeyToPublicDer(NULL, der, derLen); - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaKeyToPublicDer(&key, der, -1); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #endif - - if (der != NULL) { - XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + /* Pass in bad args. */ + ExpectIntEQ(wc_RsaKeyToPublicDer(NULL, der, derLen), BAD_FUNC_ARG); + ExpectIntLT(ret = wc_RsaKeyToPublicDer(&key, der, -1), 0); + ExpectTrue((ret == BUFFER_E) || (ret == BAD_FUNC_ARG)); - res = TEST_RES_CHECK(ret == 0); + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaKeyToPublicDer */ @@ -21495,86 +20405,61 @@ */ static int test_wc_RsaPublicEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - RsaKey key; - WC_RNG rng; - int ret = 0; + RsaKey key; + WC_RNG rng; const char inStr[] = TEST_STRING; const word32 plainLen = (word32)TEST_STRING_SZ; const word32 inLen = (word32)TEST_STRING_SZ; int bits = TEST_RSA_BITS; const word32 cipherLen = TEST_RSA_BYTES; word32 cipherLenResult = cipherLen; - WC_DECLARE_VAR(in, byte, TEST_STRING_SZ, NULL); WC_DECLARE_VAR(plain, byte, TEST_STRING_SZ, NULL); WC_DECLARE_VAR(cipher, byte, TEST_RSA_BYTES, NULL); + WC_ALLOC_VAR(in, byte, TEST_STRING_SZ, NULL); + WC_ALLOC_VAR(plain, byte, TEST_STRING_SZ, NULL); + WC_ALLOC_VAR(cipher, byte, TEST_RSA_BYTES, NULL); + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (in == NULL || plain == NULL || cipher == NULL) { - fprintf(stderr, "test_wc_RsaPublicEncryptDecrypt malloc failed\n"); - return MEMORY_E; -} + ExpectNotNull(in); + ExpectNotNull(plain); + ExpectNotNull(cipher); #endif - XMEMCPY(in, inStr, inLen); + ExpectNotNull(XMEMCPY(in, inStr, inLen)); - ret = wc_InitRsaKey(&key, HEAP_HINT); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng); - } - /* Encrypt. */ + /* Initialize stack structures. */ + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_RsaPublicEncrypt(in, inLen, cipher, cipherLen, &key, &rng); - if (ret >= 0) { - cipherLenResult = ret; - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng), 0); - /* Pass bad args. */ - /* Tests PsaPublicEncryptEx() which, is tested by another fn. No need dup.*/ - if (ret != 0) { - return TEST_FAIL; - } + /* Encrypt. */ + ExpectIntGT(cipherLenResult = (word32)wc_RsaPublicEncrypt(in, inLen, cipher, + cipherLen, &key, &rng), 0); + /* Pass bad args - tested in another testing function.*/ /* Decrypt */ - #if defined(WC_RSA_BLINDING) && !defined(HAVE_FIPS) - /* Bind rng */ - if (ret == 0) { - ret = wc_RsaSetRNG(&key, &rng); - } - #endif - if (ret == 0) { - ret = wc_RsaPrivateDecrypt(cipher, cipherLenResult, plain, plainLen, &key); - } - if (ret >= 0) { - ret = XMEMCMP(plain, inStr, plainLen); - } - - /* Pass in bad args. */ - /* Tests RsaPrivateDecryptEx() which, is tested by another fn. No need dup.*/ +#if defined(WC_RSA_BLINDING) && !defined(HAVE_FIPS) + /* Bind rng */ + ExpectIntEQ(wc_RsaSetRNG(&key, &rng), 0); +#endif + ExpectIntGE(wc_RsaPrivateDecrypt(cipher, cipherLenResult, plain, plainLen, + &key), 0); + ExpectIntEQ(XMEMCMP(plain, inStr, plainLen), 0); + /* Pass bad args - tested in another testing function.*/ WC_FREE_VAR(in, NULL); WC_FREE_VAR(plain, NULL); WC_FREE_VAR(cipher, NULL); - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaPublicEncryptDecrypt */ @@ -21583,13 +20468,11 @@ */ static int test_wc_RsaPublicEncryptDecrypt_ex(void) { - int result = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && !defined(HAVE_FIPS)\ - && !defined(WC_NO_RSA_OAEP) && !defined(HAVE_USER_RSA)\ - && !defined(NO_SHA256) + && !defined(WC_NO_RSA_OAEP) && !defined(NO_SHA256) RsaKey key; WC_RNG rng; - int ret; const char inStr[] = TEST_STRING; const word32 inLen = (word32)TEST_STRING_SZ; const word32 plainSz = (word32)TEST_STRING_SZ; @@ -21602,100 +20485,52 @@ WC_DECLARE_VAR(plain, byte, TEST_STRING_SZ, NULL); WC_DECLARE_VAR(cipher, byte, TEST_RSA_BYTES, NULL); + WC_ALLOC_VAR(in, byte, TEST_STRING_SZ, NULL); + WC_ALLOC_VAR(plain, byte, TEST_STRING_SZ, NULL); + WC_ALLOC_VAR(cipher, byte, TEST_RSA_BYTES, NULL); + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (in == NULL || plain == NULL || cipher == NULL) { - fprintf(stderr, "test_wc_RsaPublicEncryptDecrypt_exmalloc failed\n"); - return TEST_FAIL; - } + ExpectNotNull(in); + ExpectNotNull(plain); + ExpectNotNull(cipher); #endif - XMEMCPY(in, inStr, inLen); + ExpectNotNull(XMEMCPY(in, inStr, inLen)); /* Initialize stack structures. */ - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_InitRsaKey_ex(&key, HEAP_HINT, INVALID_DEVID); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng); - } - /* Encrypt */ - if (ret == 0) { - ret = wc_RsaPublicEncrypt_ex(in, inLen, cipher, cipherSz, &key, &rng, - WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, NULL, 0); - if (ret >= 0) { - idx = ret; - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitRsaKey_ex(&key, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng), 0); - /* Pass bad args. */ - /* Tests RsaPublicEncryptEx again. No need duplicate. */ - if (ret != 0) { - return TEST_FAIL; - } + /* Encrypt */ + ExpectIntGE(idx = wc_RsaPublicEncrypt_ex(in, inLen, cipher, cipherSz, &key, + &rng, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, NULL, 0), 0); + /* Pass bad args - tested in another testing function.*/ #ifndef WOLFSSL_RSA_PUBLIC_ONLY /* Decrypt */ #if defined(WC_RSA_BLINDING) && !defined(HAVE_FIPS) - if (ret == 0) { - ret = wc_RsaSetRNG(&key, &rng); - } + ExpectIntEQ(wc_RsaSetRNG(&key, &rng), 0); #endif - if (ret == 0) { - ret = wc_RsaPrivateDecrypt_ex(cipher, (word32)idx, - plain, plainSz, &key, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA256, - WC_MGF1SHA256, NULL, 0); - } - if (ret >= 0) { - if (!XMEMCMP(plain, inStr, plainSz)) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - /*Pass bad args.*/ - /* Tests RsaPrivateDecryptEx() again. No need duplicate. */ - if (ret != 0) { - return TEST_FAIL; - } - - if (ret == 0) { - ret = wc_RsaPrivateDecryptInline_ex(cipher, (word32)idx, - &res, &key, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA256, - WC_MGF1SHA256, NULL, 0); - - if (ret >= 0) { - if (!XMEMCMP(inStr, res, plainSz)) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntGE(wc_RsaPrivateDecrypt_ex(cipher, (word32)idx, plain, plainSz, + &key, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, NULL, 0), 0); + ExpectIntEQ(XMEMCMP(plain, inStr, plainSz), 0); + /* Pass bad args - tested in another testing function.*/ + + ExpectIntGE(wc_RsaPrivateDecryptInline_ex(cipher, (word32)idx, &res, &key, + WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA256, WC_MGF1SHA256, NULL, 0), 0); + ExpectIntEQ(XMEMCMP(inStr, res, plainSz), 0); #endif WC_FREE_VAR(in, NULL); WC_FREE_VAR(plain, NULL); WC_FREE_VAR(cipher, NULL); - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - - result = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return result; + return EXPECT_RESULT(); } /* END test_wc_RsaPublicEncryptDecrypt_ex */ @@ -21704,159 +20539,73 @@ */ static int test_wc_RsaSSL_SignVerify(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - RsaKey key; - WC_RNG rng; - int ret = 0; + RsaKey key; + WC_RNG rng; const char inStr[] = TEST_STRING; const word32 plainSz = (word32)TEST_STRING_SZ; const word32 inLen = (word32)TEST_STRING_SZ; - word32 idx = 0; - int bits = TEST_RSA_BITS; + word32 idx = 0; + int bits = TEST_RSA_BITS; const word32 outSz = TEST_RSA_BYTES; WC_DECLARE_VAR(in, byte, TEST_STRING_SZ, NULL); WC_DECLARE_VAR(out, byte, TEST_RSA_BYTES, NULL); WC_DECLARE_VAR(plain, byte, TEST_STRING_SZ, NULL); + WC_ALLOC_VAR(in, byte, TEST_STRING_SZ, NULL); + WC_ALLOC_VAR(out, byte, TEST_RSA_BYTES, NULL); + WC_ALLOC_VAR(plain, byte, TEST_STRING_SZ, NULL); + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (in == NULL || out == NULL || plain == NULL) { - fprintf(stderr, "test_wc_RsaSSL_SignVerify failed\n"); - return TEST_FAIL; - } + ExpectNotNull(in); + ExpectNotNull(out); + ExpectNotNull(plain); #endif - XMEMCPY(in, inStr, inLen); + ExpectNotNull(XMEMCPY(in, inStr, inLen)); - ret = wc_InitRsaKey(&key, HEAP_HINT); + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_InitRng(&rng); - } + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng), 0); - if (ret == 0) { - ret = MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng); - } /* Sign. */ + ExpectIntEQ(wc_RsaSSL_Sign(in, inLen, out, outSz, &key, &rng), (int)outSz); + idx = (int)outSz; - if (ret == 0) { - ret = wc_RsaSSL_Sign(in, inLen, out, outSz, &key, &rng); - if (ret == (int)outSz) { - idx = ret; - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } -#ifndef HAVE_USER_RSA - /* Test bad args. */ - if (ret == 0) { - ret = wc_RsaSSL_Sign(NULL, inLen, out, outSz, &key, &rng); - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaSSL_Sign(in, 0, out, outSz, &key, &rng); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaSSL_Sign(in, inLen, NULL, outSz, &key, &rng); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaSSL_Sign(in, inLen, out, outSz, NULL, &rng); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } -#else /* Test bad args. */ - if (ret == 0) { - ret = wc_RsaSSL_Sign(NULL, inLen, out, outSz, &key, &rng); - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaSSL_Sign(in, 0, out, outSz, &key, &rng); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaSSL_Sign(in, inLen, NULL, outSz, &key, &rng); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaSSL_Sign(in, inLen, out, outSz, NULL, &rng); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } -#endif - if (ret != 0) { - return TEST_FAIL; - } + ExpectIntEQ(wc_RsaSSL_Sign(NULL, inLen, out, outSz, &key, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaSSL_Sign(in, 0, out, outSz, &key, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaSSL_Sign(in, inLen, NULL, outSz, &key, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaSSL_Sign(in, inLen, out, outSz, NULL, &rng), + BAD_FUNC_ARG); /* Verify. */ - ret = wc_RsaSSL_Verify(out, idx, plain, plainSz, &key); - if (ret == (int)inLen) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - #ifndef HAVE_USER_RSA - /* Pass bad args. */ - if (ret == 0) { - ret = wc_RsaSSL_Verify(NULL, idx, plain, plainSz, &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaSSL_Verify(out, 0, plain, plainSz, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaSSL_Verify(out, idx, NULL, plainSz, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaSSL_Verify(out, idx, plain, plainSz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #else - /* Pass bad args. */ - if (ret == 0) { - ret = wc_RsaSSL_Verify(NULL, idx, plain, plainSz, &key); - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaSSL_Verify(out, 0, plain, plainSz, &key); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaSSL_Verify(out, idx, NULL, plainSz, &key); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaSSL_Verify(out, idx, plain, plainSz, NULL); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #endif + ExpectIntEQ(wc_RsaSSL_Verify(out, idx, plain, plainSz, &key), (int)inLen); + + /* Pass bad args. */ + ExpectIntEQ(wc_RsaSSL_Verify(NULL, idx, plain, plainSz, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaSSL_Verify(out, 0, plain, plainSz, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaSSL_Verify(out, idx, NULL, plainSz, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaSSL_Verify(out, idx, plain, plainSz, NULL), + BAD_FUNC_ARG); WC_FREE_VAR(in, NULL); WC_FREE_VAR(out, NULL); WC_FREE_VAR(plain, NULL); - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaSSL_SignVerify */ @@ -21865,76 +20614,35 @@ */ static int test_wc_RsaEncryptSize(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - RsaKey key; - WC_RNG rng; - int ret; + RsaKey key; + WC_RNG rng; - ret = wc_InitRsaKey(&key, HEAP_HINT); + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_InitRng(&rng); - } + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); #if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) - if (ret == 0) { - ret = MAKE_RSA_KEY(&key, 1024, WC_RSA_EXPONENT, &rng); - if (ret == 0) { - ret = wc_RsaEncryptSize(&key); - } - if (ret == 128) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } + ExpectIntEQ(MAKE_RSA_KEY(&key, 1024, WC_RSA_EXPONENT, &rng), 0); + + ExpectIntEQ(wc_RsaEncryptSize(&key), 128); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); #endif - if (ret == 0) { - ret = MAKE_RSA_KEY(&key, 2048, WC_RSA_EXPONENT, &rng); - if (ret == 0) { - ret = wc_RsaEncryptSize(&key); - } - if (ret == 256) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(MAKE_RSA_KEY(&key, 2048, WC_RSA_EXPONENT, &rng), 0); + ExpectIntEQ(wc_RsaEncryptSize(&key), 256); /* Pass in bad arg. */ - if (ret == 0) { - ret = wc_RsaEncryptSize(NULL); - #ifndef HAVE_USER_RSA - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - #endif - } + ExpectIntEQ(wc_RsaEncryptSize(NULL), BAD_FUNC_ARG); - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaEncryptSize*/ @@ -21943,97 +20651,46 @@ */ static int test_wc_RsaFlattenPublicKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - RsaKey key; - WC_RNG rng; - int ret = 0; - byte e[256]; - byte n[256]; - word32 eSz = sizeof(e); - word32 nSz = sizeof(n); + RsaKey key; + WC_RNG rng; + byte e[256]; + byte n[256]; + word32 eSz = sizeof(e); + word32 nSz = sizeof(n); #if (!defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 4)) - int bits = 1024; + int bits = 1024; #else - int bits = 2048; + int bits = 2048; #endif - ret = wc_InitRsaKey(&key, HEAP_HINT); - if (ret == 0) { - ret = wc_InitRng(&rng); - } + XMEMSET(&key, 0, sizeof(RsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng); - if (ret >= 0) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(MAKE_RSA_KEY(&key, bits, WC_RSA_EXPONENT, &rng), 0); - if (ret == 0) { - ret = wc_RsaFlattenPublicKey(&key, e, &eSz, n, &nSz); - } - #ifndef HAVE_USER_RSA - /* Pass bad args. */ - if (ret == 0) { - ret = wc_RsaFlattenPublicKey(NULL, e, &eSz, n, &nSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaFlattenPublicKey(&key, NULL, &eSz, n, &nSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaFlattenPublicKey(&key, e, NULL, n, &nSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaFlattenPublicKey(&key, e, &eSz, NULL, &nSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_RsaFlattenPublicKey(&key, e, &eSz, n, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #else - /* Pass bad args. */ - if (ret == 0) { - ret = wc_RsaFlattenPublicKey(NULL, e, &eSz, n, &nSz); - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaFlattenPublicKey(&key, NULL, &eSz, n, &nSz); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaFlattenPublicKey(&key, e, NULL, n, &nSz); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaFlattenPublicKey(&key, e, &eSz, NULL, &nSz); - } - if (ret == USER_CRYPTO_ERROR) { - ret = wc_RsaFlattenPublicKey(&key, e, &eSz, n, NULL); - } - if (ret == USER_CRYPTO_ERROR) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #endif - if (wc_FreeRsaKey(&key) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - if (wc_FreeRng(&rng) || ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_RsaFlattenPublicKey(&key, e, &eSz, n, &nSz), 0); - res = TEST_RES_CHECK(ret == 0); + /* Pass bad args. */ + ExpectIntEQ(wc_RsaFlattenPublicKey(NULL, e, &eSz, n, &nSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaFlattenPublicKey(&key, NULL, &eSz, n, &nSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaFlattenPublicKey(&key, e, NULL, n, &nSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaFlattenPublicKey(&key, e, &eSz, NULL, &nSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_RsaFlattenPublicKey(&key, e, &eSz, n, NULL), + BAD_FUNC_ARG); + + DoExpectIntEQ(wc_FreeRsaKey(&key), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_RsaFlattenPublicKey */ @@ -22044,69 +20701,47 @@ */ static int test_wc_AesCcmSetKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_AESCCM Aes aes; - int ret = 0; - const byte key16[] = - { + const byte key16[] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }; - const byte key24[] = - { + const byte key24[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37 }; - const byte key32[] = - { + const byte key32[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 }; - ret = wc_AesInit(&aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + XMEMSET(&aes, 0, sizeof(Aes)); + + ExpectIntEQ(wc_AesInit(&aes, NULL, INVALID_DEVID), 0); #ifdef WOLFSSL_AES_128 - ret = wc_AesCcmSetKey(&aes, key16, sizeof(key16)); + ExpectIntEQ(wc_AesCcmSetKey(&aes, key16, sizeof(key16)), 0); #endif #ifdef WOLFSSL_AES_192 - if (ret == 0) { - ret = wc_AesCcmSetKey(&aes, key24, sizeof(key24)); - } + ExpectIntEQ(wc_AesCcmSetKey(&aes, key24, sizeof(key24)), 0); #endif #ifdef WOLFSSL_AES_256 - if (ret == 0) { - ret = wc_AesCcmSetKey(&aes, key32, sizeof(key32)); - } + ExpectIntEQ(wc_AesCcmSetKey(&aes, key32, sizeof(key32)), 0); #endif /* Test bad args. */ - if (ret == 0) { - ret = wc_AesCcmSetKey(&aes, key16, sizeof(key16) - 1); - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCcmSetKey(&aes, key24, sizeof(key24) - 1); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_AesCcmSetKey(&aes, key32, sizeof(key32) - 1); - } - if (ret != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } + ExpectIntEQ(wc_AesCcmSetKey(&aes, key16, sizeof(key16) - 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmSetKey(&aes, key24, sizeof(key24) - 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmSetKey(&aes, key32, sizeof(key32) - 1), BAD_FUNC_ARG); wc_AesFree(&aes); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_AesCcmSetKey */ @@ -22115,209 +20750,1606 @@ */ static int test_wc_AesCcmEncryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_AESCCM) && defined(WOLFSSL_AES_128) Aes aes; - int ret = 0; - const byte key16[] = - { + const byte key16[] = { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf }; /* plaintext */ - const byte plainT[] = - { + const byte plainT[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e }; /* nonce */ - const byte iv[] = - { + const byte iv[] = { 0x00, 0x00, 0x00, 0x03, 0x02, 0x01, 0x00, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5 }; - const byte c[] = /* cipher text. */ - { + const byte c[] = { /* cipher text. */ 0x58, 0x8c, 0x97, 0x9a, 0x61, 0xc6, 0x63, 0xd2, 0xf0, 0x66, 0xd0, 0xc2, 0xc0, 0xf9, 0x89, 0x80, 0x6d, 0x5f, 0x6b, 0x61, 0xda, 0xc3, 0x84 }; - const byte t[] = /* Auth tag */ - { + const byte t[] = { /* Auth tag */ 0x17, 0xe8, 0xd1, 0x2c, 0xfd, 0xf9, 0x26, 0xe0 }; - const byte authIn[] = - { + const byte authIn[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; byte cipherOut[sizeof(plainT)]; byte authTag[sizeof(t)]; - int ccmE = WOLFSSL_FATAL_ERROR; - #ifdef HAVE_AES_DECRYPT - int ccmD = WOLFSSL_FATAL_ERROR; - byte plainOut[sizeof(cipherOut)]; +#ifdef HAVE_AES_DECRYPT + byte plainOut[sizeof(cipherOut)]; +#endif + + XMEMSET(&aes, 0, sizeof(Aes)); + + ExpectIntEQ(wc_AesInit(&aes, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_AesCcmSetKey(&aes, key16, sizeof(key16)), 0); + + ExpectIntEQ(wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn , sizeof(authIn)), 0); + ExpectIntEQ(XMEMCMP(cipherOut, c, sizeof(c)), 0); + ExpectIntEQ(XMEMCMP(t, authTag, sizeof(t)), 0); +#ifdef HAVE_AES_DECRYPT + ExpectIntEQ(wc_AesCcmDecrypt(&aes, plainOut, cipherOut, sizeof(plainOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn, sizeof(authIn)), 0); + ExpectIntEQ(XMEMCMP(plainOut, plainT, sizeof(plainT)), 0); +#endif + + /* Pass in bad args. Encrypt*/ + ExpectIntEQ(wc_AesCcmEncrypt(NULL, cipherOut, plainT, sizeof(cipherOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn , sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmEncrypt(&aes, NULL, plainT, sizeof(cipherOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn , sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmEncrypt(&aes, cipherOut, NULL, sizeof(cipherOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn , sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), + NULL, sizeof(iv), authTag, sizeof(authTag), authIn , sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), + iv, sizeof(iv), NULL, sizeof(authTag), authIn , sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), + iv, sizeof(iv) + 1, authTag, sizeof(authTag), authIn , sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), + iv, sizeof(iv) - 7, authTag, sizeof(authTag), authIn , sizeof(authIn)), + BAD_FUNC_ARG); + +#ifdef HAVE_AES_DECRYPT + /* Pass in bad args. Decrypt*/ + ExpectIntEQ(wc_AesCcmDecrypt(NULL, plainOut, cipherOut, sizeof(plainOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn, sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmDecrypt(&aes, NULL, cipherOut, sizeof(plainOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn, sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmDecrypt(&aes, plainOut, NULL, sizeof(plainOut), + iv, sizeof(iv), authTag, sizeof(authTag), authIn, sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmDecrypt(&aes, plainOut, cipherOut, sizeof(plainOut), + NULL, sizeof(iv), authTag, sizeof(authTag), authIn, sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmDecrypt(&aes, plainOut, cipherOut, sizeof(plainOut), + iv, sizeof(iv), NULL, sizeof(authTag), authIn, sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmDecrypt(&aes, plainOut, cipherOut, sizeof(plainOut), + iv, sizeof(iv) + 1, authTag, sizeof(authTag), authIn, sizeof(authIn)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesCcmDecrypt(&aes, plainOut, cipherOut, sizeof(plainOut), + iv, sizeof(iv) - 7, authTag, sizeof(authTag), authIn, sizeof(authIn)), + BAD_FUNC_ARG); #endif - ret = wc_AesInit(&aes, NULL, INVALID_DEVID); - if (ret != 0) - return ret; + wc_AesFree(&aes); +#endif /* HAVE_AESCCM */ + return EXPECT_RESULT(); +} /* END test_wc_AesCcmEncryptDecrypt */ - ret = wc_AesCcmSetKey(&aes, key16, sizeof(key16)); - if (ret == 0) { - ccmE = wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), - iv, sizeof(iv), authTag, sizeof(authTag), - authIn , sizeof(authIn)); - if ((XMEMCMP(cipherOut, c, sizeof(c)) && ccmE == 0) || - XMEMCMP(t, authTag, sizeof(t))) { - ccmE = WOLFSSL_FATAL_ERROR; - ret = WOLFSSL_FATAL_ERROR; + +#if defined(WOLFSSL_AES_EAX) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + +/* + * Testing test_wc_AesEaxVectors() + */ +static int test_wc_AesEaxVectors(void) +{ + EXPECT_DECLS; + + typedef struct { + byte key[AES_256_KEY_SIZE]; + int key_length; + byte iv[AES_BLOCK_SIZE]; + int iv_length; + byte aad[AES_BLOCK_SIZE * 2]; + int aad_length; + byte msg[AES_BLOCK_SIZE * 5]; + int msg_length; + byte ct[AES_BLOCK_SIZE * 5]; + int ct_length; + byte tag[AES_BLOCK_SIZE]; + int tag_length; + int valid; + } AadVector; + + /* Test vectors obtained from Google wycheproof project + * https://github.com/google/wycheproof + * from testvectors/aes_eax_test.json + */ + const AadVector vectors[] = { + { + /* key, key length */ + {0x23, 0x39, 0x52, 0xde, 0xe4, 0xd5, 0xed, 0x5f, + 0x9b, 0x9c, 0x6d, 0x6f, 0xf8, 0x0f, 0xf4, 0x78}, 16, + /* iv, iv length */ + {0x62, 0xec, 0x67, 0xf9, 0xc3, 0xa4, 0xa4, 0x07, + 0xfc, 0xb2, 0xa8, 0xc4, 0x90, 0x31, 0xa8, 0xb3}, 16, + /* aad, aad length */ + {0x6b, 0xfb, 0x91, 0x4f, 0xd0, 0x7e, 0xae, 0x6b}, 8, + /* msg, msg length */ + {0x00}, 0, + /* ct, ct length */ + {0x00}, 0, + /* tag, tag length */ + {0xe0, 0x37, 0x83, 0x0e, 0x83, 0x89, 0xf2, 0x7b, + 0x02, 0x5a, 0x2d, 0x65, 0x27, 0xe7, 0x9d, 0x01}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x91, 0x94, 0x5d, 0x3f, 0x4d, 0xcb, 0xee, 0x0b, + 0xf4, 0x5e, 0xf5, 0x22, 0x55, 0xf0, 0x95, 0xa4}, 16, + /* iv, iv length */ + {0xbe, 0xca, 0xf0, 0x43, 0xb0, 0xa2, 0x3d, 0x84, + 0x31, 0x94, 0xba, 0x97, 0x2c, 0x66, 0xde, 0xbd}, 16, + /* aad, aad length */ + {0xfa, 0x3b, 0xfd, 0x48, 0x06, 0xeb, 0x53, 0xfa}, 8, + /* msg, msg length */ + {0xf7, 0xfb}, 2, + /* ct, ct length */ + {0x19, 0xdd}, 2, + /* tag, tag length */ + {0x5c, 0x4c, 0x93, 0x31, 0x04, 0x9d, 0x0b, 0xda, + 0xb0, 0x27, 0x74, 0x08, 0xf6, 0x79, 0x67, 0xe5}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x01, 0xf7, 0x4a, 0xd6, 0x40, 0x77, 0xf2, 0xe7, + 0x04, 0xc0, 0xf6, 0x0a, 0xda, 0x3d, 0xd5, 0x23}, 16, + /* iv, iv length */ + {0x70, 0xc3, 0xdb, 0x4f, 0x0d, 0x26, 0x36, 0x84, + 0x00, 0xa1, 0x0e, 0xd0, 0x5d, 0x2b, 0xff, 0x5e}, 16, + /* aad, aad length */ + {0x23, 0x4a, 0x34, 0x63, 0xc1, 0x26, 0x4a, 0xc6}, 8, + /* msg, msg length */ + {0x1a, 0x47, 0xcb, 0x49, 0x33}, 5, + /* ct, ct length */ + {0xd8, 0x51, 0xd5, 0xba, 0xe0}, 5, + /* tag, tag length */ + {0x3a, 0x59, 0xf2, 0x38, 0xa2, 0x3e, 0x39, 0x19, + 0x9d, 0xc9, 0x26, 0x66, 0x26, 0xc4, 0x0f, 0x80}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0xd0, 0x7c, 0xf6, 0xcb, 0xb7, 0xf3, 0x13, 0xbd, + 0xde, 0x66, 0xb7, 0x27, 0xaf, 0xd3, 0xc5, 0xe8}, 16, + /* iv, iv length */ + {0x84, 0x08, 0xdf, 0xff, 0x3c, 0x1a, 0x2b, 0x12, + 0x92, 0xdc, 0x19, 0x9e, 0x46, 0xb7, 0xd6, 0x17}, 16, + /* aad, aad length */ + {0x33, 0xcc, 0xe2, 0xea, 0xbf, 0xf5, 0xa7, 0x9d}, 8, + /* msg, msg length */ + {0x48, 0x1c, 0x9e, 0x39, 0xb1}, 5, + /* ct, ct length */ + {0x63, 0x2a, 0x9d, 0x13, 0x1a}, 5, + /* tag, tag length */ + {0xd4, 0xc1, 0x68, 0xa4, 0x22, 0x5d, 0x8e, 0x1f, + 0xf7, 0x55, 0x93, 0x99, 0x74, 0xa7, 0xbe, 0xde}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x35, 0xb6, 0xd0, 0x58, 0x00, 0x05, 0xbb, 0xc1, + 0x2b, 0x05, 0x87, 0x12, 0x45, 0x57, 0xd2, 0xc2}, 16, + /* iv, iv length */ + {0xfd, 0xb6, 0xb0, 0x66, 0x76, 0xee, 0xdc, 0x5c, + 0x61, 0xd7, 0x42, 0x76, 0xe1, 0xf8, 0xe8, 0x16}, 16, + /* aad, aad length */ + {0xae, 0xb9, 0x6e, 0xae, 0xbe, 0x29, 0x70, 0xe9}, 8, + /* msg, msg length */ + {0x40, 0xd0, 0xc0, 0x7d, 0xa5, 0xe4}, 6, + /* ct, ct length */ + {0x07, 0x1d, 0xfe, 0x16, 0xc6, 0x75}, 6, + /* tag, tag length */ + {0xcb, 0x06, 0x77, 0xe5, 0x36, 0xf7, 0x3a, 0xfe, + 0x6a, 0x14, 0xb7, 0x4e, 0xe4, 0x98, 0x44, 0xdd}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0xbd, 0x8e, 0x6e, 0x11, 0x47, 0x5e, 0x60, 0xb2, + 0x68, 0x78, 0x4c, 0x38, 0xc6, 0x2f, 0xeb, 0x22}, 16, + /* iv, iv length */ + {0x6e, 0xac, 0x5c, 0x93, 0x07, 0x2d, 0x8e, 0x85, + 0x13, 0xf7, 0x50, 0x93, 0x5e, 0x46, 0xda, 0x1b}, 16, + /* aad, aad length */ + {0xd4, 0x48, 0x2d, 0x1c, 0xa7, 0x8d, 0xce, 0x0f}, 8, + /* msg, msg length */ + {0x4d, 0xe3, 0xb3, 0x5c, 0x3f, 0xc0, 0x39, 0x24, + 0x5b, 0xd1, 0xfb, 0x7d}, 12, + /* ct, ct length */ + {0x83, 0x5b, 0xb4, 0xf1, 0x5d, 0x74, 0x3e, 0x35, + 0x0e, 0x72, 0x84, 0x14}, 12, + /* tag, tag length */ + {0xab, 0xb8, 0x64, 0x4f, 0xd6, 0xcc, 0xb8, 0x69, + 0x47, 0xc5, 0xe1, 0x05, 0x90, 0x21, 0x0a, 0x4f}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x7c, 0x77, 0xd6, 0xe8, 0x13, 0xbe, 0xd5, 0xac, + 0x98, 0xba, 0xa4, 0x17, 0x47, 0x7a, 0x2e, 0x7d}, 16, + /* iv, iv length */ + {0x1a, 0x8c, 0x98, 0xdc, 0xd7, 0x3d, 0x38, 0x39, + 0x3b, 0x2b, 0xf1, 0x56, 0x9d, 0xee, 0xfc, 0x19}, 16, + /* aad, aad length */ + {0x65, 0xd2, 0x01, 0x79, 0x90, 0xd6, 0x25, 0x28}, 8, + /* msg, msg length */ + {0x8b, 0x0a, 0x79, 0x30, 0x6c, 0x9c, 0xe7, 0xed, + 0x99, 0xda, 0xe4, 0xf8, 0x7f, 0x8d, 0xd6, 0x16, + 0x36}, 17, + /* ct, ct length */ + {0x02, 0x08, 0x3e, 0x39, 0x79, 0xda, 0x01, 0x48, + 0x12, 0xf5, 0x9f, 0x11, 0xd5, 0x26, 0x30, 0xda, + 0x30}, 17, + /* tag, tag length */ + {0x13, 0x73, 0x27, 0xd1, 0x06, 0x49, 0xb0, 0xaa, + 0x6e, 0x1c, 0x18, 0x1d, 0xb6, 0x17, 0xd7, 0xf2}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x5f, 0xff, 0x20, 0xca, 0xfa, 0xb1, 0x19, 0xca, + 0x2f, 0xc7, 0x35, 0x49, 0xe2, 0x0f, 0x5b, 0x0d}, 16, + /* iv, iv length */ + {0xdd, 0xe5, 0x9b, 0x97, 0xd7, 0x22, 0x15, 0x6d, + 0x4d, 0x9a, 0xff, 0x2b, 0xc7, 0x55, 0x98, 0x26}, 16, + /* aad, aad length */ + {0x54, 0xb9, 0xf0, 0x4e, 0x6a, 0x09, 0x18, 0x9a}, 8, + /* msg, msg length */ + {0x1b, 0xda, 0x12, 0x2b, 0xce, 0x8a, 0x8d, 0xba, + 0xf1, 0x87, 0x7d, 0x96, 0x2b, 0x85, 0x92, 0xdd, + 0x2d, 0x56}, 18, + /* ct, ct length */ + {0x2e, 0xc4, 0x7b, 0x2c, 0x49, 0x54, 0xa4, 0x89, + 0xaf, 0xc7, 0xba, 0x48, 0x97, 0xed, 0xcd, 0xae, + 0x8c, 0xc3}, 18, + /* tag, tag length */ + {0x3b, 0x60, 0x45, 0x05, 0x99, 0xbd, 0x02, 0xc9, + 0x63, 0x82, 0x90, 0x2a, 0xef, 0x7f, 0x83, 0x2a}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0xa4, 0xa4, 0x78, 0x2b, 0xcf, 0xfd, 0x3e, 0xc5, + 0xe7, 0xef, 0x6d, 0x8c, 0x34, 0xa5, 0x61, 0x23}, 16, + /* iv, iv length */ + {0xb7, 0x81, 0xfc, 0xf2, 0xf7, 0x5f, 0xa5, 0xa8, + 0xde, 0x97, 0xa9, 0xca, 0x48, 0xe5, 0x22, 0xec}, 16, + /* aad, aad length */ + {0x89, 0x9a, 0x17, 0x58, 0x97, 0x56, 0x1d, 0x7e}, 8, + /* msg, msg length */ + {0x6c, 0xf3, 0x67, 0x20, 0x87, 0x2b, 0x85, 0x13, + 0xf6, 0xea, 0xb1, 0xa8, 0xa4, 0x44, 0x38, 0xd5, + 0xef, 0x11}, 18, + /* ct, ct length */ + {0x0d, 0xe1, 0x8f, 0xd0, 0xfd, 0xd9, 0x1e, 0x7a, + 0xf1, 0x9f, 0x1d, 0x8e, 0xe8, 0x73, 0x39, 0x38, + 0xb1, 0xe8}, 18, + /* tag, tag length */ + {0xe7, 0xf6, 0xd2, 0x23, 0x16, 0x18, 0x10, 0x2f, + 0xdb, 0x7f, 0xe5, 0x5f, 0xf1, 0x99, 0x17, 0x00}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x83, 0x95, 0xfc, 0xf1, 0xe9, 0x5b, 0xeb, 0xd6, + 0x97, 0xbd, 0x01, 0x0b, 0xc7, 0x66, 0xaa, 0xc3}, 16, + /* iv, iv length */ + {0x22, 0xe7, 0xad, 0xd9, 0x3c, 0xfc, 0x63, 0x93, + 0xc5, 0x7e, 0xc0, 0xb3, 0xc1, 0x7d, 0x6b, 0x44}, 16, + /* aad, aad length */ + {0x12, 0x67, 0x35, 0xfc, 0xc3, 0x20, 0xd2, 0x5a}, 8, + /* msg, msg length */ + {0xca, 0x40, 0xd7, 0x44, 0x6e, 0x54, 0x5f, 0xfa, + 0xed, 0x3b, 0xd1, 0x2a, 0x74, 0x0a, 0x65, 0x9f, + 0xfb, 0xbb, 0x3c, 0xea, 0xb7}, 21, + /* ct, ct length */ + {0xcb, 0x89, 0x20, 0xf8, 0x7a, 0x6c, 0x75, 0xcf, + 0xf3, 0x96, 0x27, 0xb5, 0x6e, 0x3e, 0xd1, 0x97, + 0xc5, 0x52, 0xd2, 0x95, 0xa7}, 21, + /* tag, tag length */ + {0xcf, 0xc4, 0x6a, 0xfc, 0x25, 0x3b, 0x46, 0x52, + 0xb1, 0xaf, 0x37, 0x95, 0xb1, 0x24, 0xab, 0x6e}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x3c, 0x8c, 0xc2, 0x97, 0x0a, 0x00, 0x8f, 0x75, + 0xcc, 0x5b, 0xea, 0xe2, 0x84, 0x72, 0x58, 0xc2}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 32, + /* ct, ct length */ + {0x3c, 0x44, 0x1f, 0x32, 0xce, 0x07, 0x82, 0x23, + 0x64, 0xd7, 0xa2, 0x99, 0x0e, 0x50, 0xbb, 0x13, + 0xd7, 0xb0, 0x2a, 0x26, 0x96, 0x9e, 0x4a, 0x93, + 0x7e, 0x5e, 0x90, 0x73, 0xb0, 0xd9, 0xc9, 0x68}, 32, + /* tag, tag length */ + {0xdb, 0x90, 0xbd, 0xb3, 0xda, 0x3d, 0x00, 0xaf, + 0xd0, 0xfc, 0x6a, 0x83, 0x55, 0x1d, 0xa9, 0x5e}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0xae, 0xf0, 0x3d, 0x00, 0x59, 0x84, 0x94, 0xe9, + 0xfb, 0x03, 0xcd, 0x7d, 0x8b, 0x59, 0x08, 0x66}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 32, + /* ct, ct length */ + {0xd1, 0x9a, 0xc5, 0x98, 0x49, 0x02, 0x6a, 0x91, + 0xaa, 0x1b, 0x9a, 0xec, 0x29, 0xb1, 0x1a, 0x20, + 0x2a, 0x4d, 0x73, 0x9f, 0xd8, 0x6c, 0x28, 0xe3, + 0xae, 0x3d, 0x58, 0x8e, 0xa2, 0x1d, 0x70, 0xc6}, 32, + /* tag, tag length */ + {0xc3, 0x0f, 0x6c, 0xd9, 0x20, 0x20, 0x74, 0xed, + 0x6e, 0x2a, 0x2a, 0x36, 0x0e, 0xac, 0x8c, 0x47}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x55, 0xd1, 0x25, 0x11, 0xc6, 0x96, 0xa8, 0x0d, + 0x05, 0x14, 0xd1, 0xff, 0xba, 0x49, 0xca, 0xda}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 32, + /* ct, ct length */ + {0x21, 0x08, 0x55, 0x8a, 0xc4, 0xb2, 0xc2, 0xd5, + 0xcc, 0x66, 0xce, 0xa5, 0x1d, 0x62, 0x10, 0xe0, + 0x46, 0x17, 0x7a, 0x67, 0x63, 0x1c, 0xd2, 0xdd, + 0x8f, 0x09, 0x46, 0x97, 0x33, 0xac, 0xb5, 0x17}, 32, + /* tag, tag length */ + {0xfc, 0x35, 0x5e, 0x87, 0xa2, 0x67, 0xbe, 0x3a, + 0xe3, 0xe4, 0x4c, 0x0b, 0xf3, 0xf9, 0x9b, 0x2b}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x79, 0x42, 0x2d, 0xdd, 0x91, 0xc4, 0xee, 0xe2, + 0xde, 0xae, 0xf1, 0xf9, 0x68, 0x30, 0x53, 0x04}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 32, + /* ct, ct length */ + {0x4d, 0x2c, 0x15, 0x24, 0xca, 0x4b, 0xaa, 0x4e, + 0xef, 0xcc, 0xe6, 0xb9, 0x1b, 0x22, 0x7e, 0xe8, + 0x3a, 0xba, 0xff, 0x81, 0x05, 0xdc, 0xaf, 0xa2, + 0xab, 0x19, 0x1f, 0x5d, 0xf2, 0x57, 0x50, 0x35}, 32, + /* tag, tag length */ + {0xe2, 0xc8, 0x65, 0xce, 0x2d, 0x7a, 0xbd, 0xac, + 0x02, 0x4c, 0x6f, 0x99, 0x1a, 0x84, 0x83, 0x90}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x0a, 0xf5, 0xaa, 0x7a, 0x76, 0x76, 0xe2, 0x83, + 0x06, 0x30, 0x6b, 0xcd, 0x9b, 0xf2, 0x00, 0x3a}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 32, + /* ct, ct length */ + {0x8e, 0xb0, 0x1e, 0x62, 0x18, 0x5d, 0x78, 0x2e, + 0xb9, 0x28, 0x7a, 0x34, 0x1a, 0x68, 0x62, 0xac, + 0x52, 0x57, 0xd6, 0xf9, 0xad, 0xc9, 0x9e, 0xe0, + 0xa2, 0x4d, 0x9c, 0x22, 0xb3, 0xe9, 0xb3, 0x8a}, 32, + /* tag, tag length */ + {0x39, 0xc3, 0x39, 0xbc, 0x8a, 0x74, 0xc7, 0x5e, + 0x2c, 0x65, 0xc6, 0x11, 0x95, 0x44, 0xd6, 0x1e}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0xaf, 0x5a, 0x03, 0xae, 0x7e, 0xdd, 0x73, 0x47, + 0x1b, 0xdc, 0xdf, 0xac, 0x5e, 0x19, 0x4a, 0x60}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 32, + /* ct, ct length */ + {0x94, 0xc5, 0xd2, 0xac, 0xa6, 0xdb, 0xbc, 0xe8, + 0xc2, 0x45, 0x13, 0xa2, 0x5e, 0x09, 0x5c, 0x0e, + 0x54, 0xa9, 0x42, 0x86, 0x0d, 0x32, 0x7a, 0x22, + 0x2a, 0x81, 0x5c, 0xc7, 0x13, 0xb1, 0x63, 0xb4}, 32, + /* tag, tag length */ + {0xf5, 0x0b, 0x30, 0x30, 0x4e, 0x45, 0xc9, 0xd4, + 0x11, 0xe8, 0xdf, 0x45, 0x08, 0xa9, 0x86, 0x12}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0xb3, 0x70, 0x87, 0x68, 0x0f, 0x0e, 0xdd, 0x5a, + 0x52, 0x22, 0x8b, 0x8c, 0x7a, 0xae, 0xa6, 0x64}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33}, 64, + /* ct, ct length */ + {0x3b, 0xb6, 0x17, 0x3e, 0x37, 0x72, 0xd4, 0xb6, + 0x2e, 0xef, 0x37, 0xf9, 0xef, 0x07, 0x81, 0xf3, + 0x60, 0xb6, 0xc7, 0x4b, 0xe3, 0xbf, 0x6b, 0x37, + 0x10, 0x67, 0xbc, 0x1b, 0x09, 0x0d, 0x9d, 0x66, + 0x22, 0xa1, 0xfb, 0xec, 0x6a, 0xc4, 0x71, 0xb3, + 0x34, 0x9c, 0xd4, 0x27, 0x7a, 0x10, 0x1d, 0x40, + 0x89, 0x0f, 0xbf, 0x27, 0xdf, 0xdc, 0xd0, 0xb4, + 0xe3, 0x78, 0x1f, 0x98, 0x06, 0xda, 0xab, 0xb6}, 64, + /* tag, tag length */ + {0xa0, 0x49, 0x87, 0x45, 0xe5, 0x99, 0x99, 0xdd, + 0xc3, 0x2d, 0x5b, 0x14, 0x02, 0x41, 0x12, 0x4e}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x4f, 0x80, 0x2d, 0xa6, 0x2a, 0x38, 0x45, 0x55, + 0xa1, 0x9b, 0xc2, 0xb3, 0x82, 0xeb, 0x25, 0xaf}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44}, 80, + /* ct, ct length */ + {0xe9, 0xb0, 0xbb, 0x88, 0x57, 0x81, 0x8c, 0xe3, + 0x20, 0x1c, 0x36, 0x90, 0xd2, 0x1d, 0xaa, 0x7f, + 0x26, 0x4f, 0xb8, 0xee, 0x93, 0xcc, 0x7a, 0x46, + 0x74, 0xea, 0x2f, 0xc3, 0x2b, 0xf1, 0x82, 0xfb, + 0x2a, 0x7e, 0x8a, 0xd5, 0x15, 0x07, 0xad, 0x4f, + 0x31, 0xce, 0xfc, 0x23, 0x56, 0xfe, 0x79, 0x36, + 0xa7, 0xf6, 0xe1, 0x9f, 0x95, 0xe8, 0x8f, 0xdb, + 0xf1, 0x76, 0x20, 0x91, 0x6d, 0x3a, 0x6f, 0x3d, + 0x01, 0xfc, 0x17, 0xd3, 0x58, 0x67, 0x2f, 0x77, + 0x7f, 0xd4, 0x09, 0x92, 0x46, 0xe4, 0x36, 0xe1}, 80, + /* tag, tag length */ + {0x67, 0x91, 0x0b, 0xe7, 0x44, 0xb8, 0x31, 0x5a, + 0xe0, 0xeb, 0x61, 0x24, 0x59, 0x0c, 0x5d, 0x8b}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0xb6, 0x7b, 0x1a, 0x6e, 0xfd, 0xd4, 0x0d, 0x37, + 0x08, 0x0f, 0xbe, 0x8f, 0x80, 0x47, 0xae, 0xb9}, 16, + /* iv, iv length */ + {0xfa, 0x29, 0x4b, 0x12, 0x99, 0x72, 0xf7, 0xfc, + 0x5b, 0xbd, 0x5b, 0x96, 0xbb, 0xa8, 0x37, 0xc9}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x00}, 0, + /* ct, ct length */ + {0x00}, 0, + /* tag, tag length */ + {0xb1, 0x4b, 0x64, 0xfb, 0x58, 0x98, 0x99, 0x69, + 0x95, 0x70, 0xcc, 0x91, 0x60, 0xe3, 0x98, 0x96}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x20, 0x9e, 0x6d, 0xbf, 0x2a, 0xd2, 0x6a, 0x10, + 0x54, 0x45, 0xfc, 0x02, 0x07, 0xcd, 0x9e, 0x9a}, 16, + /* iv, iv length */ + {0x94, 0x77, 0x84, 0x9d, 0x6c, 0xcd, 0xfc, 0xa1, + 0x12, 0xd9, 0x2e, 0x53, 0xfa, 0xe4, 0xa7, 0xca}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x01}, 1, + /* ct, ct length */ + {0x1d}, 1, + /* tag, tag length */ + {0x52, 0xa5, 0xf6, 0x00, 0xfe, 0x53, 0x38, 0x02, + 0x6a, 0x7c, 0xb0, 0x9c, 0x11, 0x64, 0x00, 0x82}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0xa5, 0x49, 0x44, 0x2e, 0x35, 0x15, 0x40, 0x32, + 0xd0, 0x7c, 0x86, 0x66, 0x00, 0x6a, 0xa6, 0xa2}, 16, + /* iv, iv length */ + {0x51, 0x71, 0x52, 0x45, 0x68, 0xe8, 0x1d, 0x97, + 0xe8, 0xc4, 0xde, 0x4b, 0xa5, 0x6c, 0x10, 0xa0}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x11, 0x82, 0xe9, 0x35, 0x96, 0xca, 0xc5, 0x60, + 0x89, 0x46, 0x40, 0x0b, 0xc7, 0x3f, 0x3a}, 15, + /* ct, ct length */ + {0xd7, 0xb8, 0xa6, 0xb4, 0x3d, 0x2e, 0x9f, 0x98, + 0xc2, 0xb4, 0x4c, 0xe5, 0xe3, 0xcf, 0xdb}, 15, + /* tag, tag length */ + {0x1b, 0xdd, 0x52, 0xfc, 0x98, 0x7d, 0xaf, 0x0e, + 0xe1, 0x92, 0x34, 0xc9, 0x05, 0xea, 0x64, 0x5f}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x95, 0x8b, 0xcd, 0xb6, 0x6a, 0x39, 0x52, 0xb5, + 0x37, 0x01, 0x58, 0x2a, 0x68, 0xa0, 0xe4, 0x74}, 16, + /* iv, iv length */ + {0x0e, 0x6e, 0xc8, 0x79, 0xb0, 0x2c, 0x6f, 0x51, + 0x69, 0x76, 0xe3, 0x58, 0x98, 0x42, 0x8d, 0xa7}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x14, 0x04, 0x15, 0x82, 0x3e, 0xcc, 0x89, 0x32, + 0xa0, 0x58, 0x38, 0x4b, 0x73, 0x8e, 0xa6, 0xea, + 0x6d, 0x4d, 0xfe, 0x3b, 0xbe, 0xee}, 22, + /* ct, ct length */ + {0x73, 0xe5, 0xc6, 0xf0, 0xe7, 0x03, 0xa5, 0x2d, + 0x02, 0xf7, 0xf7, 0xfa, 0xeb, 0x1b, 0x77, 0xfd, + 0x4f, 0xd0, 0xcb, 0x42, 0x1e, 0xaf}, 22, + /* tag, tag length */ + {0x6c, 0x15, 0x4a, 0x85, 0x96, 0x8e, 0xdd, 0x74, + 0x77, 0x65, 0x75, 0xa4, 0x45, 0x0b, 0xd8, 0x97}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x96, 0x5b, 0x75, 0x7b, 0xa5, 0x01, 0x8a, 0x8d, + 0x66, 0xed, 0xc7, 0x8e, 0x0c, 0xee, 0xe8, 0x6b}, 16, + /* iv, iv length */ + {0x2e, 0x35, 0x90, 0x1a, 0xe7, 0xd4, 0x91, 0xee, + 0xcc, 0x88, 0x38, 0xfe, 0xdd, 0x63, 0x14, 0x05}, 16, + /* aad, aad length */ + {0xdf, 0x10, 0xd0, 0xd2, 0x12, 0x24, 0x24, 0x50}, 8, + /* msg, msg length */ + {0x36, 0xe5, 0x7a, 0x76, 0x39, 0x58, 0xb0, 0x2c, + 0xea, 0x9d, 0x6a, 0x67, 0x6e, 0xbc, 0xe8, 0x1f}, 16, + /* ct, ct length */ + {0x93, 0x6b, 0x69, 0xb6, 0xc9, 0x55, 0xad, 0xfd, + 0x15, 0x53, 0x9b, 0x9b, 0xe4, 0x98, 0x9c, 0xb6}, 16, + /* tag, tag length */ + {0xee, 0x15, 0xa1, 0x45, 0x4e, 0x88, 0xfa, 0xad, + 0x8e, 0x48, 0xa8, 0xdf, 0x29, 0x83, 0xb4, 0x25}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x88, 0xd0, 0x20, 0x33, 0x78, 0x1c, 0x7b, 0x41, + 0x64, 0x71, 0x1a, 0x05, 0x42, 0x0f, 0x25, 0x6e}, 16, + /* iv, iv length */ + {0x7f, 0x29, 0x85, 0x29, 0x63, 0x15, 0x50, 0x7a, + 0xa4, 0xc0, 0xa9, 0x3d, 0x5c, 0x12, 0xbd, 0x77}, 16, + /* aad, aad length */ + {0x7c, 0x57, 0x1d, 0x2f, 0xbb, 0x5f, 0x62, 0x52, + 0x3c, 0x0e, 0xb3, 0x38, 0xbe, 0xf9, 0xa9}, 15, + /* msg, msg length */ + {0xd9, 0x8a, 0xdc, 0x03, 0xd9, 0xd5, 0x82, 0x73, + 0x2e, 0xb0, 0x7d, 0xf2, 0x3d, 0x7b, 0x9f, 0x74}, 16, + /* ct, ct length */ + {0x67, 0xca, 0xac, 0x35, 0x44, 0x3a, 0x31, 0x38, + 0xd2, 0xcb, 0x81, 0x1f, 0x0c, 0xe0, 0x4d, 0xd2}, 16, + /* tag, tag length */ + {0xb7, 0x96, 0x8e, 0x0b, 0x56, 0x40, 0xe3, 0xb2, + 0x36, 0x56, 0x96, 0x53, 0x20, 0x8b, 0x9d, 0xeb}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x51, 0x58, 0x40, 0xcf, 0x67, 0xd2, 0xe4, 0x0e, + 0xb6, 0x5e, 0x54, 0xa2, 0x4c, 0x72, 0xcb, 0xf2}, 16, + /* iv, iv length */ + {0xbf, 0x47, 0xaf, 0xdf, 0xd4, 0x92, 0x13, 0x7a, + 0x24, 0x23, 0x6b, 0xc3, 0x67, 0x97, 0xa8, 0x8e}, 16, + /* aad, aad length */ + {0x16, 0x84, 0x3c, 0x09, 0x1d, 0x43, 0xb0, 0xa1, + 0x91, 0xd0, 0xc7, 0x3d, 0x15, 0x60, 0x1b, 0xe9}, 16, + /* msg, msg length */ + {0xc8, 0x34, 0x58, 0x8c, 0xb6, 0xda, 0xf9, 0xf0, + 0x6d, 0xd2, 0x35, 0x19, 0xf4, 0xbe, 0x9f, 0x56}, 16, + /* ct, ct length */ + {0x20, 0x0a, 0xc4, 0x51, 0xfb, 0xeb, 0x0f, 0x61, + 0x51, 0xd6, 0x15, 0x83, 0xa4, 0x3b, 0x73, 0x43}, 16, + /* tag, tag length */ + {0x2a, 0xd4, 0x3e, 0x4c, 0xaa, 0x51, 0x98, 0x3a, + 0x9d, 0x4d, 0x24, 0x48, 0x1b, 0xf4, 0xc8, 0x39}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x2e, 0x44, 0x92, 0xd4, 0x44, 0xe5, 0xb6, 0xf4, + 0xce, 0xc8, 0xc2, 0xd3, 0x61, 0x5a, 0xc8, 0x58}, 16, + /* iv, iv length */ + {0xd0, 0x2b, 0xf0, 0x76, 0x3a, 0x9f, 0xef, 0xbf, + 0x70, 0xc3, 0x3a, 0xee, 0x1e, 0x9d, 0xa1, 0xd6}, 16, + /* aad, aad length */ + {0x90, 0x4d, 0x86, 0xf1, 0x33, 0xce, 0xc1, 0x5a, + 0x0c, 0x3c, 0xaf, 0x14, 0xd7, 0xe0, 0x29, 0xc8, + 0x2a, 0x07, 0x70, 0x5a, 0x23, 0xf0, 0xd0, 0x80}, 24, + /* msg, msg length */ + {0x9e, 0x62, 0xd6, 0x51, 0x1b, 0x0b, 0xda, 0x7d, + 0xd7, 0x74, 0x0b, 0x61, 0x4d, 0x97, 0xba, 0xe0}, 16, + /* ct, ct length */ + {0x27, 0xc6, 0xe9, 0xa6, 0x53, 0xc5, 0x25, 0x3c, + 0xa1, 0xc5, 0x67, 0x3f, 0x97, 0xb9, 0xb3, 0x3e}, 16, + /* tag, tag length */ + {0x2d, 0x58, 0x12, 0x71, 0xe1, 0xfa, 0x9e, 0x36, + 0x86, 0x13, 0x6c, 0xaa, 0x8f, 0x4d, 0x6c, 0x8e}, 16, + /* valid */ + 1, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe7, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe4, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0x66, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0f, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0xd0, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x12, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x11, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0x72, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x53, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0xd2, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0xb8, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb0, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9a, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x99, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x1b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa6}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa5}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xe7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0x27}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe7, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x53, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0xd0, 0x13, 0xa6, 0xdb, 0x72, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe6, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0x72, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0x27}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0x19, 0xf1, 0x83, 0xaf, 0xec, 0x59, 0x24, 0x0d, + 0xad, 0x67, 0x4e, 0x6d, 0x64, 0x3c, 0xa9, 0x58}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0x66, 0x8e, 0xfc, 0xd0, 0x93, 0x26, 0x5b, 0x72, + 0xd2, 0x18, 0x31, 0x12, 0x1b, 0x43, 0xd6, 0x27}, 16, + /* valid */ + 0, + }, + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0x00}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct, ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe7, 0x0f, 0x7d, 0x51, 0x12, 0xa7, 0xda, 0xf3, + 0x53, 0x99, 0xb0, 0x93, 0x9a, 0xc2, 0x57, 0xa6}, 16, + /* valid */ + 0, + }, + }; + + byte ciphertext[sizeof(vectors[0].ct)]; + byte authtag[sizeof(vectors[0].tag)]; + int i; + int len; + int ret; + + + for (i = 0; i < (int)(sizeof(vectors)/sizeof(vectors[0])); i++) { + + XMEMSET(ciphertext, 0, sizeof(ciphertext)); + + len = sizeof(authtag); + ExpectIntEQ(wc_AesEaxEncryptAuth(vectors[i].key, vectors[i].key_length, + ciphertext, + vectors[i].msg, vectors[i].msg_length, + vectors[i].iv, vectors[i].iv_length, + authtag, len, + vectors[i].aad, vectors[i].aad_length), + 0); + + /* check ciphertext matches vector */ + ExpectIntEQ(XMEMCMP(ciphertext, vectors[i].ct, vectors[i].ct_length), + 0); + + /* check that computed tag matches vector only for vectors marked as valid */ + ret = XMEMCMP(authtag, vectors[i].tag, len); + if (vectors[i].valid) { + ExpectIntEQ(ret, 0); } - #ifdef HAVE_AES_DECRYPT - if (ret == 0) { - ccmD = wc_AesCcmDecrypt(&aes, plainOut, cipherOut, - sizeof(plainOut), iv, sizeof(iv), - authTag, sizeof(authTag), - authIn, sizeof(authIn)); - if (XMEMCMP(plainOut, plainT, sizeof(plainT)) && ccmD == 0) { - ccmD = WOLFSSL_FATAL_ERROR; - } - } - #endif + else { + ExpectIntNE(ret, 0); + } + + XMEMSET(ciphertext, 0, sizeof(ciphertext)); + + /* Decrypt, checking that the computed auth tags match */ + ExpectIntEQ(wc_AesEaxDecryptAuth(vectors[i].key, vectors[i].key_length, + ciphertext, + vectors[i].ct, vectors[i].ct_length, + vectors[i].iv, vectors[i].iv_length, + authtag, len, + vectors[i].aad, vectors[i].aad_length), + 0); + + /* check decrypted ciphertext matches vector plaintext */ + ExpectIntEQ(XMEMCMP(ciphertext, vectors[i].msg, vectors[i].msg_length), + 0); } + return EXPECT_RESULT(); +} /* END test_wc_AesEaxVectors */ - /* Pass in bad args. Encrypt*/ - if (ret == 0 && ccmE == 0) { - ccmE = wc_AesCcmEncrypt(NULL, cipherOut, plainT, sizeof(cipherOut), - iv, sizeof(iv), authTag, sizeof(authTag), - authIn , sizeof(authIn)); - if (ccmE == BAD_FUNC_ARG) { - ccmE = wc_AesCcmEncrypt(&aes, NULL, plainT, sizeof(cipherOut), - iv, sizeof(iv), authTag, sizeof(authTag), - authIn , sizeof(authIn)); - } - if (ccmE == BAD_FUNC_ARG) { - ccmE = wc_AesCcmEncrypt(&aes, cipherOut, NULL, sizeof(cipherOut), - iv, sizeof(iv), authTag, sizeof(authTag), - authIn , sizeof(authIn)); - } - if (ccmE == BAD_FUNC_ARG) { - ccmE = wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), - NULL, sizeof(iv), authTag, sizeof(authTag), - authIn , sizeof(authIn)); - } - if (ccmE == BAD_FUNC_ARG) { - ccmE = wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), - iv, sizeof(iv), NULL, sizeof(authTag), - authIn , sizeof(authIn)); - } - if (ccmE == BAD_FUNC_ARG) { - ccmE = wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), - iv, sizeof(iv) + 1, authTag, sizeof(authTag), - authIn , sizeof(authIn)); - } - if (ccmE == BAD_FUNC_ARG) { - ccmE = wc_AesCcmEncrypt(&aes, cipherOut, plainT, sizeof(cipherOut), - iv, sizeof(iv) - 7, authTag, sizeof(authTag), - authIn , sizeof(authIn)); + +/* + * Testing test_wc_AesEaxEncryptAuth() + */ +static int test_wc_AesEaxEncryptAuth(void) +{ + EXPECT_DECLS; + + const byte key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F}; + const byte iv[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F}; + const byte aad[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; + const byte msg[] = {0x00, 0x01, 0x02, 0x03, 0x04}; + + byte ciphertext[sizeof(msg)]; + byte authtag[AES_BLOCK_SIZE]; + int i; + int len; + + len = sizeof(authtag); + ExpectIntEQ(wc_AesEaxEncryptAuth(key, sizeof(key), + ciphertext, + msg, sizeof(msg), + iv, sizeof(iv), + authtag, (word32)len, + aad, sizeof(aad)), + 0); + + /* Test null checking */ + ExpectIntEQ(wc_AesEaxEncryptAuth(NULL, sizeof(key), + ciphertext, + msg, sizeof(msg), + iv, sizeof(iv), + authtag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxEncryptAuth(key, sizeof(key), + NULL, + msg, sizeof(msg), + iv, sizeof(iv), + authtag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxEncryptAuth(key, sizeof(key), + ciphertext, + NULL, sizeof(msg), + iv, sizeof(iv), + authtag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxEncryptAuth(key, sizeof(key), + ciphertext, + msg, sizeof(msg), + NULL, sizeof(iv), + authtag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxEncryptAuth(key, sizeof(key), + ciphertext, + msg, sizeof(msg), + iv, sizeof(iv), + NULL, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxEncryptAuth(key, sizeof(key), + ciphertext, + msg, sizeof(msg), + iv, sizeof(iv), + authtag, (word32)len, + NULL, sizeof(aad)), + BAD_FUNC_ARG); + + /* Test bad key lengths */ + for (i = 0; i <= 32; i++) { + int exp_ret; + if (i == AES_128_KEY_SIZE || i == AES_192_KEY_SIZE + || i == AES_256_KEY_SIZE) { + exp_ret = 0; } + else { + exp_ret = BAD_FUNC_ARG; + } + + ExpectIntEQ(wc_AesEaxEncryptAuth(key, (word32)i, + ciphertext, + msg, sizeof(msg), + iv, sizeof(iv), + authtag, (word32)len, + aad, sizeof(aad)), + exp_ret); + } + + + /* Test auth tag size out of range */ + len = AES_BLOCK_SIZE + 1; + ExpectIntEQ(wc_AesEaxEncryptAuth(key, sizeof(key), + ciphertext, + msg, sizeof(msg), + iv, sizeof(iv), + authtag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + + return EXPECT_RESULT(); +} /* END test_wc_AesEaxEncryptAuth() */ + + +/* + * Testing test_wc_AesEaxDecryptAuth() + */ +static int test_wc_AesEaxDecryptAuth(void) +{ + EXPECT_DECLS; - if (ccmE != BAD_FUNC_ARG) { - ccmE = WOLFSSL_FATAL_ERROR; + const byte key[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F}; + const byte iv[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F}; + const byte aad[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; + const byte ct[] = {0x00, 0x01, 0x02, 0x03, 0x04}; + /* Garbage tag that should always fail for above aad */ + const byte tag[] = {0xFE, 0xED, 0xBE, 0xEF, 0xDE, 0xAD, 0xC0, 0xDE, + 0xCA, 0xFE, 0xBE, 0xEF, 0xDE, 0xAF, 0xBE, 0xEF}; + + byte plaintext[sizeof(ct)]; + int i; + int len; + + len = sizeof(tag); + ExpectIntEQ(wc_AesEaxDecryptAuth(key, sizeof(key), + plaintext, + ct, sizeof(ct), + iv, sizeof(iv), + tag, (word32)len, + aad, sizeof(aad)), + AES_EAX_AUTH_E); + + /* Test null checking */ + ExpectIntEQ(wc_AesEaxDecryptAuth(NULL, sizeof(key), + plaintext, + ct, sizeof(ct), + iv, sizeof(iv), + tag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxDecryptAuth(key, sizeof(key), + NULL, + ct, sizeof(ct), + iv, sizeof(iv), + tag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxDecryptAuth(key, sizeof(key), + plaintext, + NULL, sizeof(ct), + iv, sizeof(iv), + tag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxDecryptAuth(key, sizeof(key), + plaintext, + ct, sizeof(ct), + NULL, sizeof(iv), + tag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxDecryptAuth(key, sizeof(key), + plaintext, + ct, sizeof(ct), + iv, sizeof(iv), + NULL, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_AesEaxDecryptAuth(key, sizeof(key), + plaintext, + ct, sizeof(ct), + iv, sizeof(iv), + tag, (word32)len, + NULL, sizeof(aad)), + BAD_FUNC_ARG); + + /* Test bad key lengths */ + for (i = 0; i <= 32; i++) { + int exp_ret; + if (i == AES_128_KEY_SIZE || i == AES_192_KEY_SIZE + || i == AES_256_KEY_SIZE) { + exp_ret = AES_EAX_AUTH_E; } else { - ccmE = 0; + exp_ret = BAD_FUNC_ARG; } - } /* End Encrypt */ - if (ccmE != 0) { - wc_AesFree(&aes); - return TEST_FAIL; + ExpectIntEQ(wc_AesEaxDecryptAuth(key, (word32)i, + plaintext, + ct, sizeof(ct), + iv, sizeof(iv), + tag, (word32)len, + aad, sizeof(aad)), + exp_ret); } - #ifdef HAVE_AES_DECRYPT - /* Pass in bad args. Decrypt*/ - if (ret == 0 && ccmD == 0) { - ccmD = wc_AesCcmDecrypt(NULL, plainOut, cipherOut, sizeof(plainOut), - iv, sizeof(iv), authTag, sizeof(authTag), - authIn, sizeof(authIn)); - if (ccmD == BAD_FUNC_ARG) { - ccmD = wc_AesCcmDecrypt(&aes, NULL, cipherOut, sizeof(plainOut), - iv, sizeof(iv), authTag, sizeof(authTag), - authIn, sizeof(authIn)); - } - if (ccmD == BAD_FUNC_ARG) { - ccmD = wc_AesCcmDecrypt(&aes, plainOut, NULL, sizeof(plainOut), - iv, sizeof(iv), authTag, sizeof(authTag), - authIn, sizeof(authIn)); - } - if (ccmD == BAD_FUNC_ARG) { - ccmD = wc_AesCcmDecrypt(&aes, plainOut, cipherOut, - sizeof(plainOut), NULL, sizeof(iv), - authTag, sizeof(authTag), - authIn, sizeof(authIn)); - } - if (ccmD == BAD_FUNC_ARG) { - ccmD = wc_AesCcmDecrypt(&aes, plainOut, cipherOut, - sizeof(plainOut), iv, sizeof(iv), NULL, - sizeof(authTag), authIn, sizeof(authIn)); - } - if (ccmD == BAD_FUNC_ARG) { - ccmD = wc_AesCcmDecrypt(&aes, plainOut, cipherOut, - sizeof(plainOut), iv, sizeof(iv) + 1, - authTag, sizeof(authTag), - authIn, sizeof(authIn)); - } - if (ccmD == BAD_FUNC_ARG) { - ccmD = wc_AesCcmDecrypt(&aes, plainOut, cipherOut, - sizeof(plainOut), iv, sizeof(iv) - 7, - authTag, sizeof(authTag), - authIn, sizeof(authIn)); - } - if (ccmD != BAD_FUNC_ARG) { - ccmD = WOLFSSL_FATAL_ERROR; - } - else { - ccmD = 0; - } - } /* END Decrypt */ - res = TEST_RES_CHECK(ccmD == 0); - #endif - wc_AesFree(&aes); -#endif /* HAVE_AESCCM */ - return res; -} /* END test_wc_AesCcmEncryptDecrypt */ + /* Test auth tag size out of range */ + len = AES_BLOCK_SIZE + 1; + ExpectIntEQ(wc_AesEaxDecryptAuth(key, sizeof(key), + plaintext, + ct, sizeof(ct), + iv, sizeof(iv), + tag, (word32)len, + aad, sizeof(aad)), + BAD_FUNC_ARG); + return EXPECT_RESULT(); +} /* END test_wc_AesEaxDecryptAuth() */ + +#endif /* WOLFSSL_AES_EAX && + * (!HAVE_FIPS || FIPS_VERSION_GE(5, 3)) && !HAVE_SELFTEST + */ /* * Testing wc_InitDsaKey() */ static int test_wc_InitDsaKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_DSA - DsaKey key; - int ret = 0; + DsaKey key; + + XMEMSET(&key, 0, sizeof(DsaKey)); - ret = wc_InitDsaKey(&key); + ExpectIntEQ(wc_InitDsaKey(&key), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_InitDsaKey(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitDsaKey(NULL), BAD_FUNC_ARG); wc_FreeDsaKey(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_InitDsaKey */ @@ -22326,131 +22358,78 @@ */ static int test_wc_DsaSignVerify(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) - DsaKey key; - WC_RNG rng; - wc_Sha sha; - int ret = 0; - byte signature[DSA_SIG_SIZE]; - byte hash[WC_SHA_DIGEST_SIZE]; - word32 idx = 0; - word32 bytes; - int answer; + DsaKey key; + WC_RNG rng; + wc_Sha sha; + byte signature[DSA_SIG_SIZE]; + byte hash[WC_SHA_DIGEST_SIZE]; + word32 idx = 0; + word32 bytes; + int answer; #ifdef USE_CERT_BUFFERS_1024 - byte tmp[ONEK_BUF]; + byte tmp[ONEK_BUF]; + XMEMSET(tmp, 0, sizeof(tmp)); XMEMCPY(tmp, dsa_key_der_1024, sizeof_dsa_key_der_1024); bytes = sizeof_dsa_key_der_1024; #elif defined(USE_CERT_BUFFERS_2048) - byte tmp[TWOK_BUF]; + byte tmp[TWOK_BUF]; + XMEMSET(tmp, 0, sizeof(tmp)); XMEMCPY(tmp, dsa_key_der_2048, sizeof_dsa_key_der_2048); bytes = sizeof_dsa_key_der_2048; #else - byte tmp[TWOK_BUF]; + byte tmp[TWOK_BUF]; + XFILE fp = XBADFILE; + XMEMSET(tmp, 0, sizeof(tmp)); - XFILE fp = XFOPEN("./certs/dsa2048.der", "rb"); - if (fp == XBADFILE) { - return WOLFSSL_BAD_FILE; - } - bytes = (word32) XFREAD(tmp, 1, sizeof(tmp), fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/dsa2048.der", "rb")) != XBADFILE); + ExpectTrue((bytes = (word32)XFREAD(tmp, 1, sizeof(tmp), fp)) > 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif /* END USE_CERT_BUFFERS_1024 */ - ret = wc_InitSha(&sha); - if (ret == 0) { - ret = wc_ShaUpdate(&sha, tmp, bytes); - if (ret == 0) { - ret = wc_ShaFinal(&sha, hash); - } - if (ret == 0) { - ret = wc_InitDsaKey(&key); - } - if (ret == 0) { - ret = wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes); - } - if (ret == 0) { - ret = wc_InitRng(&rng); - } - } + ExpectIntEQ(wc_InitSha(&sha), 0); + ExpectIntEQ(wc_ShaUpdate(&sha, tmp, bytes), 0); + ExpectIntEQ(wc_ShaFinal(&sha, hash), 0); + ExpectIntEQ(wc_InitDsaKey(&key), 0); + ExpectIntEQ(wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); /* Sign. */ - if (ret == 0) { - ret = wc_DsaSign(hash, signature, &key, &rng); - } - + ExpectIntEQ(wc_DsaSign(hash, signature, &key, &rng), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_DsaSign(NULL, signature, &key, &rng); - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaSign(hash, NULL, &key, &rng); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaSign(hash, signature, NULL, &rng); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaSign(hash, signature, &key, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (ret == 0) { - /* Verify. */ - ret = wc_DsaVerify(hash, signature, &key, &answer); - if (ret != 0 || answer != 1) { - ret = WOLFSSL_FATAL_ERROR; - } - else { - ret = 0; - } - } + ExpectIntEQ(wc_DsaSign(NULL, signature, &key, &rng), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaSign(hash, NULL, &key, &rng), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaSign(hash, signature, NULL, &rng), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaSign(hash, signature, &key, NULL), BAD_FUNC_ARG); + /* Verify. */ + ExpectIntEQ(wc_DsaVerify(hash, signature, &key, &answer), 0); + ExpectIntEQ(answer, 1); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_DsaVerify(NULL, signature, &key, &answer); - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaVerify(hash, NULL, &key, &answer); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaVerify(hash, signature, NULL, &answer); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaVerify(hash, signature, &key, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_DsaVerify(NULL, signature, &key, &answer), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaVerify(hash, NULL, &key, &answer), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaVerify(hash, signature, NULL, &answer), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaVerify(hash, signature, &key, NULL), BAD_FUNC_ARG); #if !defined(HAVE_FIPS) && defined(WOLFSSL_PUBLIC_MP) /* hard set q to 0 and test fail case */ mp_free(&key.q); mp_init(&key.q); - AssertIntEQ(wc_DsaSign(hash, signature, &key, &rng), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaSign(hash, signature, &key, &rng), BAD_FUNC_ARG); mp_set(&key.q, 1); - AssertIntEQ(wc_DsaSign(hash, signature, &key, &rng), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaSign(hash, signature, &key, &rng), BAD_FUNC_ARG); #endif - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - + DoExpectIntEQ(wc_FreeRng(&rng),0); wc_FreeDsaKey(&key); wc_ShaFree(&sha); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaSign */ @@ -22459,95 +22438,55 @@ */ static int test_wc_DsaPublicPrivateKeyDecode(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) - DsaKey key; - word32 bytes; - word32 idx = 0; - int priv = 0; - int pub = 0; - int ret = 0; - + DsaKey key; + word32 bytes = 0; + word32 idx = 0; + int ret = 0; #ifdef USE_CERT_BUFFERS_1024 - byte tmp[ONEK_BUF]; + byte tmp[ONEK_BUF]; + XMEMCPY(tmp, dsa_key_der_1024, sizeof_dsa_key_der_1024); bytes = sizeof_dsa_key_der_1024; #elif defined(USE_CERT_BUFFERS_2048) - byte tmp[TWOK_BUF]; + byte tmp[TWOK_BUF]; + XMEMCPY(tmp, dsa_key_der_2048, sizeof_dsa_key_der_2048); bytes = sizeof_dsa_key_der_2048; #else - byte tmp[TWOK_BUF]; + byte tmp[TWOK_BUF]; + XFILE fp = XBADFILE; + XMEMSET(tmp, 0, sizeof(tmp)); - XFILE fp = XFOPEN("./certs/dsa2048.der", "rb"); - if (fp == XBADFILE) - { - return WOLFSSL_BAD_FILE; - } - bytes = (word32) XFREAD(tmp, 1, sizeof(tmp), fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/dsa2048.der", "rb")) != XBADFILE); + ExpectTrue((bytes = (word32) XFREAD(tmp, 1, sizeof(tmp), fp)) > 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif /* END USE_CERT_BUFFERS_1024 */ - ret = wc_InitDsaKey(&key); - - if (ret == 0) { - priv = wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes); - - /* Test bad args. */ - if (priv == 0) { - priv = wc_DsaPrivateKeyDecode(NULL, &idx, &key, bytes); - if (priv == BAD_FUNC_ARG) { - priv = wc_DsaPrivateKeyDecode(tmp, NULL, &key, bytes); - } - if (priv == BAD_FUNC_ARG) { - priv = wc_DsaPrivateKeyDecode(tmp, &idx, NULL, bytes); - } - if (priv == BAD_FUNC_ARG) { - priv = wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes); - } - if (priv == ASN_PARSE_E || priv == BUFFER_E) { - priv = 0; - } - else { - priv = WOLFSSL_FATAL_ERROR; - } - } - - wc_FreeDsaKey(&key); - ret = wc_InitDsaKey(&key); - } - - if (ret == 0) { - idx = 0; /* Reset */ - pub = wc_DsaPublicKeyDecode(tmp, &idx, &key, bytes); - - /* Test bad args. */ - if (pub == 0) { - pub = wc_DsaPublicKeyDecode(NULL, &idx, &key, bytes); - if (pub == BAD_FUNC_ARG) { - pub = wc_DsaPublicKeyDecode(tmp, NULL, &key, bytes); - } - if (pub == BAD_FUNC_ARG) { - pub = wc_DsaPublicKeyDecode(tmp, &idx, NULL, bytes); - } - if (pub == BAD_FUNC_ARG) { - pub = wc_DsaPublicKeyDecode(tmp, &idx, &key, bytes); - } - if (pub == ASN_PARSE_E || pub == BUFFER_E) { - pub = 0; - } - else { - pub = WOLFSSL_FATAL_ERROR; - } - } - - } /* END Public Key */ - + ExpectIntEQ(wc_InitDsaKey(&key), 0); + ExpectIntEQ(wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes), 0); + /* Test bad args. */ + ExpectIntEQ(wc_DsaPrivateKeyDecode(NULL, &idx, &key, bytes), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaPrivateKeyDecode(tmp, NULL, &key, bytes), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaPrivateKeyDecode(tmp, &idx, NULL, bytes), BAD_FUNC_ARG); + ExpectIntLT(ret = wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes), 0); + ExpectTrue((ret == ASN_PARSE_E) || (ret == BUFFER_E)); wc_FreeDsaKey(&key); - res = TEST_RES_CHECK(ret == 0 && pub == 0 && priv == 0); + ExpectIntEQ(wc_InitDsaKey(&key), 0); + idx = 0; /* Reset */ + ExpectIntEQ(wc_DsaPublicKeyDecode(tmp, &idx, &key, bytes), 0); + /* Test bad args. */ + ExpectIntEQ(wc_DsaPublicKeyDecode(NULL, &idx, &key, bytes), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaPublicKeyDecode(tmp, NULL, &key, bytes), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaPublicKeyDecode(tmp, &idx, NULL, bytes), BAD_FUNC_ARG); + ExpectIntLT(ret = wc_DsaPublicKeyDecode(tmp, &idx, &key, bytes), 0); + ExpectTrue((ret == ASN_PARSE_E) || (ret == BUFFER_E)); + wc_FreeDsaKey(&key); #endif /* !NO_DSA */ - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaPublicPrivateKeyDecode */ @@ -22557,67 +22496,33 @@ */ static int test_wc_MakeDsaKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN) - DsaKey genKey; - WC_RNG rng; - int ret = 0; + DsaKey genKey; + WC_RNG rng; - XMEMSET(&rng, 0, sizeof(rng)); XMEMSET(&genKey, 0, sizeof(genKey)); + XMEMSET(&rng, 0, sizeof(rng)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_InitDsaKey(&genKey); - } + ExpectIntEQ(wc_InitDsaKey(&genKey), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); - if (ret == 0) { - ret = wc_MakeDsaParameters(&rng, ONEK_BUF, &genKey); - } + ExpectIntEQ(wc_MakeDsaParameters(&rng, ONEK_BUF, &genKey), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_MakeDsaParameters(NULL, ONEK_BUF, &genKey); - if (ret == BAD_FUNC_ARG) { - ret = wc_MakeDsaParameters(&rng, ONEK_BUF, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_MakeDsaParameters(&rng, ONEK_BUF + 1, &genKey); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (ret == 0) { - ret = wc_MakeDsaKey(&rng, &genKey); - } + ExpectIntEQ(wc_MakeDsaParameters(NULL, ONEK_BUF, &genKey), BAD_FUNC_ARG); + ExpectIntEQ(wc_MakeDsaParameters(&rng, ONEK_BUF, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_MakeDsaParameters(&rng, ONEK_BUF + 1, &genKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_MakeDsaKey(&rng, &genKey), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_MakeDsaKey(NULL, &genKey); - if (ret == BAD_FUNC_ARG) { - ret = wc_MakeDsaKey(&rng, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FAILURE; - } + ExpectIntEQ(wc_MakeDsaKey(NULL, &genKey), BAD_FUNC_ARG); + ExpectIntEQ(wc_MakeDsaKey(&rng, NULL), BAD_FUNC_ARG); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_FreeDsaKey(&genKey); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_MakeDsaKey */ /* @@ -22625,88 +22530,54 @@ */ static int test_wc_DsaKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN) - DsaKey genKey; - WC_RNG rng; - word32 bytes; - word32 idx = 0; - int ret = 0; + DsaKey key; + word32 bytes; + word32 idx = 0; #ifdef USE_CERT_BUFFERS_1024 - byte tmp[ONEK_BUF]; - byte der[ONEK_BUF]; + byte tmp[ONEK_BUF]; + byte der[ONEK_BUF]; + XMEMSET(tmp, 0, sizeof(tmp)); XMEMSET(der, 0, sizeof(der)); XMEMCPY(tmp, dsa_key_der_1024, sizeof_dsa_key_der_1024); bytes = sizeof_dsa_key_der_1024; #elif defined(USE_CERT_BUFFERS_2048) - byte tmp[TWOK_BUF]; - byte der[TWOK_BUF]; + byte tmp[TWOK_BUF]; + byte der[TWOK_BUF]; + XMEMSET(tmp, 0, sizeof(tmp)); XMEMSET(der, 0, sizeof(der)); XMEMCPY(tmp, dsa_key_der_2048, sizeof_dsa_key_der_2048); bytes = sizeof_dsa_key_der_2048; #else - byte tmp[TWOK_BUF]; - byte der[TWOK_BUF]; + byte tmp[TWOK_BUF]; + byte der[TWOK_BUF]; + XFILE fp = XBADFILE; + XMEMSET(tmp, 0, sizeof(tmp)); XMEMSET(der, 0, sizeof(der)); - XFILE fp = XFOPEN("./certs/dsa2048.der", "rb"); - if (fp == XBADFILE) { - return WOLFSSL_BAD_FILE; - } - bytes = (word32) XFREAD(tmp, 1, sizeof(tmp), fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/dsa2048.der", "rb")) != XBADFILE); + ExpectTrue((bytes = (word32) XFREAD(tmp, 1, sizeof(tmp), fp)) > 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif /* END USE_CERT_BUFFERS_1024 */ - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&genKey, 0, sizeof(genKey)); - - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_InitDsaKey(&genKey); - } - if (ret == 0) { - ret = wc_MakeDsaParameters(&rng, sizeof(tmp), &genKey); - if (ret == 0) { - wc_FreeDsaKey(&genKey); - ret = wc_InitDsaKey(&genKey); - } - } - if (ret == 0) { - ret = wc_DsaPrivateKeyDecode(tmp, &idx, &genKey, bytes); - } + XMEMSET(&key, 0, sizeof(DsaKey)); - if (ret == 0) { - ret = wc_DsaKeyToDer(&genKey, der, bytes); - if ( ret >= 0 && ( ret = XMEMCMP(der, tmp, bytes) ) == 0 ) { - ret = 0; - } - } + ExpectIntEQ(wc_InitDsaKey(&key), 0); + ExpectIntEQ(wc_DsaPrivateKeyDecode(tmp, &idx, &key, bytes), 0); + ExpectIntGE(wc_DsaKeyToDer(&key, der, bytes), 0); + ExpectIntEQ(XMEMCMP(der, tmp, bytes), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_DsaKeyToDer(NULL, der, FOURK_BUF); - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaKeyToDer(&genKey, NULL, FOURK_BUF); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_DsaKeyToDer(NULL, der, FOURK_BUF), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaKeyToDer(&key, NULL, FOURK_BUF), BAD_FUNC_ARG); - wc_FreeDsaKey(&genKey); - - res = TEST_RES_CHECK(ret == 0); + wc_FreeDsaKey(&key); #endif /* !NO_DSA && WOLFSSL_KEY_GEN */ - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaKeyToDer */ @@ -22716,89 +22587,47 @@ */ static int test_wc_DsaKeyToPublicDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef HAVE_SELFTEST #if !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN) - DsaKey genKey; - WC_RNG rng; - byte* der; - word32 sz; - int ret = 0; + DsaKey key; + WC_RNG rng; + byte* der = NULL; + word32 sz = 0; + word32 idx = 0; - der = (byte*)XMALLOC(ONEK_BUF, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (der == NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_InitDsaKey(&genKey); - } - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = wc_MakeDsaParameters(&rng, ONEK_BUF, &genKey); - } - if (ret == 0) { - ret = wc_MakeDsaKey(&rng, &genKey); - } + XMEMSET(&key, 0, sizeof(DsaKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectNotNull(der = (byte*)XMALLOC(ONEK_BUF, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(wc_InitDsaKey(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_MakeDsaParameters(&rng, ONEK_BUF, &key), 0); + ExpectIntEQ(wc_MakeDsaKey(&rng, &key), 0); + + ExpectIntGE(sz = (word32)wc_DsaKeyToPublicDer(&key, der, ONEK_BUF), 0); + wc_FreeDsaKey(&key); + + idx = 0; + ExpectIntEQ(wc_DsaPublicKeyDecode(der, &idx, &key, sz), 0); - if (ret == 0) { - ret = wc_DsaKeyToPublicDer(&genKey, der, ONEK_BUF); - if (ret >= 0) { - sz = ret; - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - word32 idx = 0; - wc_FreeDsaKey(&genKey); - ret = wc_DsaPublicKeyDecode(der, &idx, &genKey, sz); - } /* Test without the SubjectPublicKeyInfo header */ - if (ret == 0) { - ret = wc_SetDsaPublicKey(der, &genKey, ONEK_BUF, 0); - if (ret >= 0) { - sz = ret; - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - word32 idx = 0; - wc_FreeDsaKey(&genKey); - ret = wc_DsaPublicKeyDecode(der, &idx, &genKey, sz); - } + ExpectIntGE(sz = (word32)wc_SetDsaPublicKey(der, &key, ONEK_BUF, 0), 0); + wc_FreeDsaKey(&key); + idx = 0; + ExpectIntEQ(wc_DsaPublicKeyDecode(der, &idx, &key, sz), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_DsaKeyToPublicDer(NULL, der, FOURK_BUF); - if (ret == BAD_FUNC_ARG) { - ret = wc_DsaKeyToPublicDer(&genKey, NULL, FOURK_BUF); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_DsaKeyToPublicDer(NULL, der, FOURK_BUF), BAD_FUNC_ARG); + ExpectIntEQ(wc_DsaKeyToPublicDer(&key, NULL, FOURK_BUF), BAD_FUNC_ARG); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_FreeDsaKey(&key); XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); - wc_FreeDsaKey(&genKey); - - res = TEST_RES_CHECK(ret == 0); #endif /* !NO_DSA && WOLFSSL_KEY_GEN */ #endif /* !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaKeyToPublicDer */ @@ -22807,11 +22636,9 @@ */ static int test_wc_DsaImportParamsRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) - DsaKey key; - int ret = 0; - + DsaKey key; /* [mod = L=1024, N=160], from CAVP KeyPair */ const char* p = "d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d" "4b725ef341eabb47cf8a7a8a41e792a156b7ce97206c4f9c" @@ -22826,44 +22653,28 @@ "07610fcc9ee68491dbc1e34cd12615474e52b18bc934fb00c" "61d39e7da8902291c4434a4e2224c3f4fd9f93cd6f4f17fc0" "76341a7e7d9"; - /* invalid p and q parameters */ const char* invalidP = "d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d"; const char* invalidQ = "96c5390a"; - ret = wc_InitDsaKey(&key); - if (ret == 0) { - ret = wc_DsaImportParamsRaw(&key, p, q, g); - } - - /* test bad args */ - if (ret == 0) { - /* null key struct */ - ret = wc_DsaImportParamsRaw(NULL, p, q, g); - if (ret == BAD_FUNC_ARG) { - /* null param pointers */ - ret = wc_DsaImportParamsRaw(&key, NULL, NULL, NULL); - } - - if (ret == BAD_FUNC_ARG) { - /* illegal p length */ - ret = wc_DsaImportParamsRaw(&key, invalidP, q, g); - } + XMEMSET(&key, 0, sizeof(DsaKey)); - if (ret == BAD_FUNC_ARG) { - /* illegal q length */ - ret = wc_DsaImportParamsRaw(&key, p, invalidQ, g); - if (ret == BAD_FUNC_ARG) - ret = 0; - } + ExpectIntEQ(wc_InitDsaKey(&key), 0); + ExpectIntEQ(wc_DsaImportParamsRaw(&key, p, q, g), 0); - } + /* test bad args */ + /* null key struct */ + ExpectIntEQ(wc_DsaImportParamsRaw(NULL, p, q, g), BAD_FUNC_ARG); + /* null param pointers */ + ExpectIntEQ(wc_DsaImportParamsRaw(&key, NULL, NULL, NULL), BAD_FUNC_ARG); + /* illegal p length */ + ExpectIntEQ(wc_DsaImportParamsRaw(&key, invalidP, q, g), BAD_FUNC_ARG); + /* illegal q length */ + ExpectIntEQ(wc_DsaImportParamsRaw(&key, p, invalidQ, g), BAD_FUNC_ARG); wc_FreeDsaKey(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaImportParamsRaw */ @@ -22872,11 +22683,10 @@ */ static int test_wc_DsaImportParamsRawCheck(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) - DsaKey key; - int ret = 0; - int trusted = 0; + DsaKey key; + int trusted = 0; /* [mod = L=1024, N=160], from CAVP KeyPair */ const char* p = "d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d" "4b725ef341eabb47cf8a7a8a41e792a156b7ce97206c4f9c" @@ -22891,44 +22701,30 @@ "07610fcc9ee68491dbc1e34cd12615474e52b18bc934fb00c" "61d39e7da8902291c4434a4e2224c3f4fd9f93cd6f4f17fc0" "76341a7e7d9"; - /* invalid p and q parameters */ const char* invalidP = "d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d"; const char* invalidQ = "96c5390a"; - ret = wc_InitDsaKey(&key); - if (ret == 0) { - ret = wc_DsaImportParamsRawCheck(&key, p, q, g, trusted, NULL); - } + ExpectIntEQ(wc_InitDsaKey(&key), 0); + ExpectIntEQ(wc_DsaImportParamsRawCheck(&key, p, q, g, trusted, NULL), 0); /* test bad args */ - if (ret == 0) { - /* null key struct */ - ret = wc_DsaImportParamsRawCheck(NULL, p, q, g, trusted, NULL); - if (ret == BAD_FUNC_ARG) { - /* null param pointers */ - ret = wc_DsaImportParamsRawCheck(&key, NULL, NULL, NULL, trusted, NULL); - } - - if (ret == BAD_FUNC_ARG) { - /* illegal p length */ - ret = wc_DsaImportParamsRawCheck(&key, invalidP, q, g, trusted, NULL); - } - - if (ret == BAD_FUNC_ARG) { - /* illegal q length */ - ret = wc_DsaImportParamsRawCheck(&key, p, invalidQ, g, trusted, NULL); - if (ret == BAD_FUNC_ARG) - ret = 0; - } - - } + /* null key struct */ + ExpectIntEQ(wc_DsaImportParamsRawCheck(NULL, p, q, g, trusted, NULL), + BAD_FUNC_ARG); + /* null param pointers */ + ExpectIntEQ(wc_DsaImportParamsRawCheck(&key, NULL, NULL, NULL, trusted, + NULL), BAD_FUNC_ARG); + /* illegal p length */ + ExpectIntEQ(wc_DsaImportParamsRawCheck(&key, invalidP, q, g, trusted, NULL), + BAD_FUNC_ARG); + /* illegal q length */ + ExpectIntEQ(wc_DsaImportParamsRawCheck(&key, p, invalidQ, g, trusted, NULL), + BAD_FUNC_ARG); wc_FreeDsaKey(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaImportParamsRawCheck */ /* @@ -22936,11 +22732,9 @@ */ static int test_wc_DsaExportParamsRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) - DsaKey key; - int ret = 0; - + DsaKey key; /* [mod = L=1024, N=160], from CAVP KeyPair */ const char* p = "d38311e2cd388c3ed698e82fdf88eb92b5a9a483dc88005d" "4b725ef341eabb47cf8a7a8a41e792a156b7ce97206c4f9c" @@ -22955,7 +22749,6 @@ "07610fcc9ee68491dbc1e34cd12615474e52b18bc934fb00c" "61d39e7da8902291c4434a4e2224c3f4fd9f93cd6f4f17fc0" "76341a7e7d9"; - const char* pCompare = "\xd3\x83\x11\xe2\xcd\x38\x8c\x3e\xd6\x98\xe8\x2f" "\xdf\x88\xeb\x92\xb5\xa9\xa4\x83\xdc\x88\x00\x5d" "\x4b\x72\x5e\xf3\x41\xea\xbb\x47\xcf\x8a\x7a\x8a" @@ -22980,84 +22773,56 @@ "\xb0\x0c\x61\xd3\x9e\x7d\xa8\x90\x22\x91\xc4\x43" "\x4a\x4e\x22\x24\xc3\xf4\xfd\x9f\x93\xcd\x6f\x4f" "\x17\xfc\x07\x63\x41\xa7\xe7\xd9"; - byte pOut[MAX_DSA_PARAM_SIZE]; byte qOut[MAX_DSA_PARAM_SIZE]; byte gOut[MAX_DSA_PARAM_SIZE]; - word32 pOutSz, qOutSz, gOutSz; - - ret = wc_InitDsaKey(&key); - if (ret == 0) { - /* first test using imported raw parameters, for expected */ - ret = wc_DsaImportParamsRaw(&key, p, q, g); - } - - if (ret == 0) { - pOutSz = sizeof(pOut); - qOutSz = sizeof(qOut); - gOutSz = sizeof(gOut); - ret = wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, - gOut, &gOutSz); - } - - if (ret == 0) { - /* validate exported parameters are correct */ - if ((XMEMCMP(pOut, pCompare, pOutSz) != 0) || - (XMEMCMP(qOut, qCompare, qOutSz) != 0) || - (XMEMCMP(gOut, gCompare, gOutSz) != 0) ) { - ret = -1; - } - } + word32 pOutSz; + word32 qOutSz; + word32 gOutSz; + + XMEMSET(&key, 0, sizeof(DsaKey)); + + ExpectIntEQ(wc_InitDsaKey(&key), 0); + /* first test using imported raw parameters, for expected */ + ExpectIntEQ(wc_DsaImportParamsRaw(&key, p, q, g), 0); + pOutSz = sizeof(pOut); + qOutSz = sizeof(qOut); + gOutSz = sizeof(gOut); + ExpectIntEQ(wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, gOut, + &gOutSz), 0); + /* validate exported parameters are correct */ + ExpectIntEQ(XMEMCMP(pOut, pCompare, pOutSz), 0); + ExpectIntEQ(XMEMCMP(qOut, qCompare, qOutSz), 0); + ExpectIntEQ(XMEMCMP(gOut, gCompare, gOutSz), 0); /* test bad args */ - if (ret == 0) { - /* null key struct */ - ret = wc_DsaExportParamsRaw(NULL, pOut, &pOutSz, qOut, &qOutSz, - gOut, &gOutSz); - - if (ret == BAD_FUNC_ARG) { - /* null output pointers */ - ret = wc_DsaExportParamsRaw(&key, NULL, &pOutSz, NULL, &qOutSz, - NULL, &gOutSz); - } - - if (ret == LENGTH_ONLY_E) { - /* null output size pointers */ - ret = wc_DsaExportParamsRaw(&key, pOut, NULL, qOut, NULL, - gOut, NULL); - } - - if (ret == BAD_FUNC_ARG) { - /* p output buffer size too small */ - pOutSz = 1; - ret = wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, - gOut, &gOutSz); - pOutSz = sizeof(pOut); - } - - if (ret == BUFFER_E) { - /* q output buffer size too small */ - qOutSz = 1; - ret = wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, - gOut, &gOutSz); - qOutSz = sizeof(qOut); - } - - if (ret == BUFFER_E) { - /* g output buffer size too small */ - gOutSz = 1; - ret = wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, - gOut, &gOutSz); - if (ret == BUFFER_E) - ret = 0; - } - } + /* null key struct */ + ExpectIntEQ(wc_DsaExportParamsRaw(NULL, pOut, &pOutSz, qOut, &qOutSz, gOut, + &gOutSz), BAD_FUNC_ARG); + /* null output pointers */ + ExpectIntEQ(wc_DsaExportParamsRaw(&key, NULL, &pOutSz, NULL, &qOutSz, NULL, + &gOutSz), LENGTH_ONLY_E); + /* null output size pointers */ + ExpectIntEQ( wc_DsaExportParamsRaw(&key, pOut, NULL, qOut, NULL, gOut, + NULL), BAD_FUNC_ARG); + /* p output buffer size too small */ + pOutSz = 1; + ExpectIntEQ(wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, gOut, + &gOutSz), BUFFER_E); + pOutSz = sizeof(pOut); + /* q output buffer size too small */ + qOutSz = 1; + ExpectIntEQ(wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, gOut, + &gOutSz), BUFFER_E); + qOutSz = sizeof(qOut); + /* g output buffer size too small */ + gOutSz = 1; + ExpectIntEQ(wc_DsaExportParamsRaw(&key, pOut, &pOutSz, qOut, &qOutSz, gOut, + &gOutSz), BUFFER_E); wc_FreeDsaKey(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaExportParamsRaw */ /* @@ -23065,77 +22830,51 @@ */ static int test_wc_DsaExportKeyRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) && defined(WOLFSSL_KEY_GEN) - DsaKey key; - WC_RNG rng; - int ret = 0; - + DsaKey key; + WC_RNG rng; byte xOut[MAX_DSA_PARAM_SIZE]; byte yOut[MAX_DSA_PARAM_SIZE]; word32 xOutSz, yOutSz; - XMEMSET(&rng, 0, sizeof(rng)); XMEMSET(&key, 0, sizeof(key)); + XMEMSET(&rng, 0, sizeof(rng)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_InitDsaKey(&key); - } - - if (ret == 0) { - ret = wc_MakeDsaParameters(&rng, 1024, &key); - - if (ret == 0) { - ret = wc_MakeDsaKey(&rng, &key); - } - } + ExpectIntEQ(wc_InitDsaKey(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_MakeDsaParameters(&rng, 1024, &key), 0); + ExpectIntEQ(wc_MakeDsaKey(&rng, &key), 0); /* try successful export */ - if (ret == 0) { - xOutSz = sizeof(xOut); - yOutSz = sizeof(yOut); - ret = wc_DsaExportKeyRaw(&key, xOut, &xOutSz, yOut, &yOutSz); - } + xOutSz = sizeof(xOut); + yOutSz = sizeof(yOut); + ExpectIntEQ(wc_DsaExportKeyRaw(&key, xOut, &xOutSz, yOut, &yOutSz), 0); /* test bad args */ - if (ret == 0) { - /* null key struct */ - ret = wc_DsaExportKeyRaw(NULL, xOut, &xOutSz, yOut, &yOutSz); - - if (ret == BAD_FUNC_ARG) { - /* null output pointers */ - ret = wc_DsaExportKeyRaw(&key, NULL, &xOutSz, NULL, &yOutSz); - } - - if (ret == LENGTH_ONLY_E) { - /* null output size pointers */ - ret = wc_DsaExportKeyRaw(&key, xOut, NULL, yOut, NULL); - } - - if (ret == BAD_FUNC_ARG) { - /* x output buffer size too small */ - xOutSz = 1; - ret = wc_DsaExportKeyRaw(&key, xOut, &xOutSz, yOut, &yOutSz); - xOutSz = sizeof(xOut); - } - - if (ret == BUFFER_E) { - /* y output buffer size too small */ - yOutSz = 1; - ret = wc_DsaExportKeyRaw(&key, xOut, &xOutSz, yOut, &yOutSz); - - if (ret == BUFFER_E) - ret = 0; - } - } + /* null key struct */ + ExpectIntEQ(wc_DsaExportKeyRaw(NULL, xOut, &xOutSz, yOut, &yOutSz), + BAD_FUNC_ARG); + /* null output pointers */ + ExpectIntEQ(wc_DsaExportKeyRaw(&key, NULL, &xOutSz, NULL, &yOutSz), + LENGTH_ONLY_E); + /* null output size pointers */ + ExpectIntEQ(wc_DsaExportKeyRaw(&key, xOut, NULL, yOut, NULL), + BAD_FUNC_ARG); + /* x output buffer size too small */ + xOutSz = 1; + ExpectIntEQ(wc_DsaExportKeyRaw(&key, xOut, &xOutSz, yOut, &yOutSz), + BUFFER_E); + xOutSz = sizeof(xOut); + /* y output buffer size too small */ + yOutSz = 1; + ExpectIntEQ(wc_DsaExportKeyRaw(&key, xOut, &xOutSz, yOut, &yOutSz), + BUFFER_E); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_FreeDsaKey(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_DsaExportParamsRaw */ @@ -23144,89 +22883,59 @@ */ static int test_wc_ed25519_make_key(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_ED25519) - ed25519_key key; - WC_RNG rng; - unsigned char pubkey[ED25519_PUB_KEY_SIZE]; - int ret = 0; + EXPECT_DECLS; +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_MAKE_KEY) + ed25519_key key; + WC_RNG rng; + unsigned char pubkey[ED25519_PUB_KEY_SIZE+1]; + int pubkey_sz = ED25519_PUB_KEY_SIZE; - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ed25519_init(&key); - } - if (ret == 0) { - ret = wc_ed25519_make_public(&key, pubkey, sizeof(pubkey)); - if (ret == ECC_PRIV_KEY_E) { - ret = 0; - } - else if (ret == 0) { - ret = -1; - } - } - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); - } - /* Test bad args. */ - if (ret == 0) { - ret = wc_ed25519_make_key(NULL, ED25519_KEY_SIZE, &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE - 1, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE + 1, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + XMEMSET(&key, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - wc_ed25519_free(&key); + ExpectIntEQ(wc_ed25519_make_public(&key, pubkey, (word32)pubkey_sz), + ECC_PRIV_KEY_E); + ExpectIntEQ(wc_ed25519_make_public(&key, pubkey+1, (word32)pubkey_sz), + ECC_PRIV_KEY_E); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); - res = TEST_RES_CHECK(ret == 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_make_key(NULL, ED25519_KEY_SIZE, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE - 1, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE + 1, &key), + BAD_FUNC_ARG); + + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_ed25519_free(&key); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed25519_make_key */ - /* * Testing wc_ed25519_init() */ static int test_wc_ed25519_init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) - ed25519_key key; - int ret = 0; + ed25519_key key; - ret = wc_ed25519_init(&key); + XMEMSET(&key, 0, sizeof(ed25519_key)); + ExpectIntEQ(wc_ed25519_init(&key), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ed25519_init(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ed25519_init(NULL), BAD_FUNC_ARG); wc_ed25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed25519_init */ /* @@ -23234,116 +22943,74 @@ */ static int test_wc_ed25519_sign_msg(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_SIGN) - WC_RNG rng; - ed25519_key key; - int ret = 0; - byte msg[] = "Everybody gets Friday off.\n"; - byte sig[ED25519_SIG_SIZE]; - word32 msglen = sizeof(msg); - word32 siglen = sizeof(sig); - word32 badSigLen = sizeof(sig) - 1; + WC_RNG rng; + ed25519_key key; + byte msg[] = "Everybody gets Friday off.\n"; + byte sig[ED25519_SIG_SIZE+1]; + word32 msglen = sizeof(msg); + word32 siglen = ED25519_SIG_SIZE; + word32 badSigLen = ED25519_SIG_SIZE - 1; #ifdef HAVE_ED25519_VERIFY - int verify_ok = 0; /*1 = Verify success.*/ + int verify_ok = 0; /*1 = Verify success.*/ #endif /* Initialize stack variables. */ - XMEMSET(sig, 0, siglen); + XMEMSET(&key, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(sig, 0, sizeof(sig)); /* Initialize key. */ - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ed25519_init(&key); - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); - } - } + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); + + ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, sig, &siglen, &key), 0); + ExpectIntEQ(siglen, ED25519_SIG_SIZE); + ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, sig+1, &siglen, &key), 0); + ExpectIntEQ(siglen, ED25519_SIG_SIZE); - if (ret == 0) { - ret = wc_ed25519_sign_msg(msg, msglen, sig, &siglen, &key); - } /* Test bad args. */ - if (ret == 0 && siglen == ED25519_SIG_SIZE) { - ret = wc_ed25519_sign_msg(NULL, msglen, sig, &siglen, &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_sign_msg(msg, msglen, NULL, &siglen, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_sign_msg(msg, msglen, sig, NULL, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_sign_msg(msg, msglen, sig, &siglen, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_sign_msg(msg, msglen, sig, &badSigLen, &key); - } - if (ret == BUFFER_E && badSigLen == ED25519_SIG_SIZE) { - badSigLen -= 1; - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* END sign */ + ExpectIntEQ(wc_ed25519_sign_msg(NULL, msglen, sig, &siglen, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, NULL, &siglen, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, sig, NULL, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, sig, &siglen, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, sig, &badSigLen, &key), + BUFFER_E); + ExpectIntEQ(badSigLen, ED25519_SIG_SIZE); + badSigLen -= 1; #ifdef HAVE_ED25519_VERIFY - if (ret == 0) { + ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, msg, msglen, &verify_ok, + &key), 0); + ExpectIntEQ(verify_ok, 1); - ret = wc_ed25519_verify_msg(sig, siglen, msg, msglen, &verify_ok, &key); - if (ret == 0 && verify_ok == 1) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - - /* Test bad args. */ - if (ret == 0) { - AssertIntEQ(wc_ed25519_verify_msg(sig, siglen - 1, msg, - msglen, &verify_ok, &key), - BAD_FUNC_ARG); - AssertIntEQ(wc_ed25519_verify_msg(sig, siglen + 1, msg, - msglen, &verify_ok, &key), - BAD_FUNC_ARG); - - ret = wc_ed25519_verify_msg(NULL, siglen, msg, msglen, &verify_ok, - &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_verify_msg(sig, siglen, NULL, msglen, - &verify_ok, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_verify_msg(sig, siglen, msg, msglen, - NULL, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_verify_msg(sig, siglen, msg, msglen, - &verify_ok, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_verify_msg(sig, badSigLen, msg, msglen, - &verify_ok, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - - } /* END verify. */ + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen - 1, msg, msglen, + &verify_ok, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen + 1, msg, msglen, + &verify_ok, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_verify_msg(NULL, siglen, msg, msglen, &verify_ok, + &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, NULL, msglen, &verify_ok, + &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, msg, msglen, NULL, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, msg, msglen, &verify_ok, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_verify_msg(sig+1, badSigLen, msg, msglen, &verify_ok, + &key), BAD_FUNC_ARG); #endif /* Verify. */ - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed25519_sign_msg */ @@ -23352,58 +23019,34 @@ */ static int test_wc_ed25519_import_public(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) - WC_RNG rng; - ed25519_key pubKey; - const byte in[] = "Ed25519PublicKeyUnitTest......\n"; - word32 inlen = sizeof(in); - int ret = 0; + ed25519_key pubKey; + WC_RNG rng; + const byte in[] = "Ed25519PublicKeyUnitTest......\n"; + word32 inlen = sizeof(in); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ed25519_init(&pubKey); - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &pubKey); - } - } + XMEMSET(&pubKey, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_ed25519_import_public_ex(in, inlen, &pubKey, 1); + ExpectIntEQ(wc_ed25519_init(&pubKey), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); +#ifdef HAVE_ED25519_MAKE_KEY + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &pubKey), 0); +#endif - if (ret == 0 && XMEMCMP(in, pubKey.p, inlen) == 0) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_ed25519_import_public_ex(in, inlen, &pubKey, 1), 0); + ExpectIntEQ(XMEMCMP(in, pubKey.p, inlen), 0); - /* Test bad args. */ - if (ret == 0) { - ret = wc_ed25519_import_public(NULL, inlen, &pubKey); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_import_public(in, inlen, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_import_public(in, inlen - 1, &pubKey); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_import_public(NULL, inlen, &pubKey), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_import_public(in, inlen, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_import_public(in, inlen - 1, &pubKey), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&pubKey); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END wc_ed25519_import_public */ /* @@ -23411,11 +23054,10 @@ */ static int test_wc_ed25519_import_private_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) - WC_RNG rng; ed25519_key key; - int ret; + WC_RNG rng; const byte privKey[] = "Ed25519PrivateKeyUnitTest.....\n"; const byte pubKey[] = "Ed25519PublicKeyUnitTest......\n"; word32 privKeySz = sizeof(privKey); @@ -23425,80 +23067,48 @@ word32 bothKeysSz = sizeof(bothKeys); #endif - ret = wc_InitRng(&rng); - if (ret != 0) { - return ret; - } - ret = wc_ed25519_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return ret; - } - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); + XMEMSET(&key, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_ed25519_import_private_key_ex(privKey, privKeySz, pubKey, - pubKeySz, &key, 1); - if (ret == 0 && (XMEMCMP(pubKey, key.p, privKeySz) != 0 - || XMEMCMP(privKey, key.k, pubKeySz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); +#ifdef HAVE_ED25519_MAKE_KEY + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); +#endif -#ifdef HAVE_ED25519_KEY_EXPORT - if (ret == 0) - ret = wc_ed25519_export_private(&key, bothKeys, &bothKeysSz); + ExpectIntEQ(wc_ed25519_import_private_key_ex(privKey, privKeySz, pubKey, + pubKeySz, &key, 1), 0); + ExpectIntEQ(XMEMCMP(pubKey, key.p, privKeySz), 0); + ExpectIntEQ(XMEMCMP(privKey, key.k, pubKeySz), 0); - if (ret == 0) { - ret = wc_ed25519_import_private_key_ex(bothKeys, bothKeysSz, NULL, 0, - &key, 1); - if (ret == 0 && (XMEMCMP(pubKey, key.p, privKeySz) != 0 - || XMEMCMP(privKey, key.k, pubKeySz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - } +#ifdef HAVE_ED25519_KEY_EXPORT + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed25519_export_private(&key, bothKeys, &bothKeysSz), 0); + PRIVATE_KEY_LOCK(); + ExpectIntEQ(wc_ed25519_import_private_key_ex(bothKeys, bothKeysSz, NULL, 0, + &key, 1), 0); + ExpectIntEQ(XMEMCMP(pubKey, key.p, privKeySz), 0); + ExpectIntEQ(XMEMCMP(privKey, key.k, pubKeySz), 0); #endif /* Test bad args. */ - if (ret == 0) { - ret = wc_ed25519_import_private_key(NULL, privKeySz, pubKey, pubKeySz, - &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_import_private_key(privKey, privKeySz, NULL, - pubKeySz, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_import_private_key(privKey, privKeySz, pubKey, - pubKeySz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_import_private_key(privKey, privKeySz - 1, pubKey, - pubKeySz, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_import_private_key(privKey, privKeySz, pubKey, - pubKeySz - 1, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_import_private_key(privKey, privKeySz, NULL, - 0, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ed25519_import_private_key(NULL, privKeySz, pubKey, pubKeySz, + &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_import_private_key(privKey, privKeySz, NULL, + pubKeySz, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_import_private_key(privKey, privKeySz, pubKey, + pubKeySz, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_import_private_key(privKey, privKeySz - 1, pubKey, + pubKeySz, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_import_private_key(privKey, privKeySz, pubKey, + pubKeySz - 1, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_import_private_key(privKey, privKeySz, NULL, 0, + &key), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed25519_import_private_key */ /* @@ -23506,85 +23116,66 @@ */ static int test_wc_ed25519_export(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) - WC_RNG rng; - ed25519_key key; - int ret = 0; - byte priv[ED25519_PRV_KEY_SIZE]; - byte pub[ED25519_PUB_KEY_SIZE]; - word32 privSz = sizeof(priv); - word32 pubSz = sizeof(pub); - - ret = wc_InitRng(&rng); - if (ret != 0) { - return ret; - } - - ret = wc_ed25519_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return ret; - } - - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); - } + ed25519_key key; + WC_RNG rng; + byte priv[ED25519_PRV_KEY_SIZE]; + byte pub[ED25519_PUB_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); +#ifndef HAVE_ED25519_MAKE_KEY + const byte privKey[] = { + 0xf8, 0x55, 0xb7, 0xb6, 0x49, 0x3f, 0x99, 0x9c, + 0x88, 0xe3, 0xc5, 0x42, 0x6a, 0xa4, 0x47, 0x4a, + 0xe4, 0x95, 0xda, 0xdb, 0xbf, 0xf8, 0xa7, 0x42, + 0x9d, 0x0e, 0xe7, 0xd0, 0x57, 0x8f, 0x16, 0x69 + }; + const byte pubKey[] = { + 0x42, 0x3b, 0x7a, 0xf9, 0x82, 0xcf, 0xf9, 0xdf, + 0x19, 0xdd, 0xf3, 0xf0, 0x32, 0x29, 0x6d, 0xfa, + 0xfd, 0x76, 0x4f, 0x68, 0xc2, 0xc2, 0xe0, 0x6c, + 0x47, 0xae, 0xc2, 0x55, 0x68, 0xac, 0x0d, 0x4d + }; +#endif - if (ret == 0) { - ret = wc_ed25519_export_public(&key, pub, &pubSz); - if (ret == 0 && (pubSz != ED25519_KEY_SIZE - || XMEMCMP(key.p, pub, pubSz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_ed25519_export_public(NULL, pub, &pubSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_public(&key, NULL, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_public(&key, pub, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + XMEMSET(&key, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); +#ifdef HAVE_ED25519_MAKE_KEY + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); +#else + ExpectIntEQ(wc_ed25519_import_private_key_ex(privKey, sizeof(privKey), + pubKey, sizeof(pubKey), &key, 1), 0); +#endif - if (ret == 0) { - ret = wc_ed25519_export_private_only(&key, priv, &privSz); - if (ret == 0 && (privSz != ED25519_KEY_SIZE - || XMEMCMP(key.k, priv, privSz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_ed25519_export_private_only(NULL, priv, &privSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_private_only(&key, NULL, &privSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_private_only(&key, priv, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed25519_export_public(&key, pub, &pubSz), 0); + ExpectIntEQ(pubSz, ED25519_KEY_SIZE); + ExpectIntEQ(XMEMCMP(key.p, pub, pubSz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_export_public(NULL, pub, &pubSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_public(&key, NULL, &pubSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_public(&key, pub, NULL), BAD_FUNC_ARG); + + ExpectIntEQ(wc_ed25519_export_private_only(&key, priv, &privSz), 0); + ExpectIntEQ(privSz, ED25519_KEY_SIZE); + ExpectIntEQ(XMEMCMP(key.k, priv, privSz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_export_private_only(NULL, priv, &privSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_private_only(&key, NULL, &privSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_private_only(&key, priv, NULL), + BAD_FUNC_ARG); + PRIVATE_KEY_LOCK(); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed25519_export */ /* @@ -23592,86 +23183,57 @@ */ static int test_wc_ed25519_size(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) - WC_RNG rng; - ed25519_key key; - int ret; + ed25519_key key; + WC_RNG rng; +#ifndef HAVE_ED25519_MAKE_KEY + const byte privKey[] = { + 0xf8, 0x55, 0xb7, 0xb6, 0x49, 0x3f, 0x99, 0x9c, + 0x88, 0xe3, 0xc5, 0x42, 0x6a, 0xa4, 0x47, 0x4a, + 0xe4, 0x95, 0xda, 0xdb, 0xbf, 0xf8, 0xa7, 0x42, + 0x9d, 0x0e, 0xe7, 0xd0, 0x57, 0x8f, 0x16, 0x69 + }; + const byte pubKey[] = { + 0x42, 0x3b, 0x7a, 0xf9, 0x82, 0xcf, 0xf9, 0xdf, + 0x19, 0xdd, 0xf3, 0xf0, 0x32, 0x29, 0x6d, 0xfa, + 0xfd, 0x76, 0x4f, 0x68, 0xc2, 0xc2, 0xe0, 0x6c, + 0x47, 0xae, 0xc2, 0x55, 0x68, 0xac, 0x0d, 0x4d + }; +#endif - ret = wc_InitRng(&rng); - if (ret != 0) { - return ret; - } - ret = wc_ed25519_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return ret; - } + XMEMSET(&key, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); - if (ret != 0) { - wc_FreeRng(&rng); - wc_ed25519_free(&key); - return ret; - } + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); +#ifdef HAVE_ED25519_MAKE_KEY + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); +#else + ExpectIntEQ(wc_ed25519_import_private_key_ex(privKey, sizeof(privKey), + pubKey, sizeof(pubKey), &key, 1), 0); +#endif - ret = wc_ed25519_size(&key); + ExpectIntEQ(wc_ed25519_size(&key), ED25519_KEY_SIZE); /* Test bad args. */ - if (ret == ED25519_KEY_SIZE) { - ret = wc_ed25519_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_ed25519_size(NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed25519_sig_size(&key); - if (ret == ED25519_SIG_SIZE) { - ret = 0; - } - /* Test bad args. */ - if (ret == 0) { - ret = wc_ed25519_sig_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - } /* END wc_ed25519_sig_size() */ + ExpectIntEQ(wc_ed25519_sig_size(&key), ED25519_SIG_SIZE); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_sig_size(NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed25519_pub_size(&key); - if (ret == ED25519_PUB_KEY_SIZE) { - ret = 0; - } - if (ret == 0) { - ret = wc_ed25519_pub_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - } /* END wc_ed25519_pub_size */ + ExpectIntEQ(wc_ed25519_pub_size(&key), ED25519_PUB_KEY_SIZE); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_pub_size(NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed25519_priv_size(&key); - if (ret == ED25519_PRV_KEY_SIZE) { - ret = 0; - } - if (ret == 0) { - ret = wc_ed25519_priv_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - } /* END wc_ed25519_pub_size */ + ExpectIntEQ(wc_ed25519_priv_size(&key), ED25519_PRV_KEY_SIZE); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_priv_size(NULL), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed25519_size */ /* @@ -23679,90 +23241,73 @@ */ static int test_wc_ed25519_exportKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) - WC_RNG rng; - ed25519_key key; - int ret = 0; - byte priv[ED25519_PRV_KEY_SIZE]; - byte pub[ED25519_PUB_KEY_SIZE]; - byte privOnly[ED25519_PRV_KEY_SIZE]; - word32 privSz = sizeof(priv); - word32 pubSz = sizeof(pub); - word32 privOnlySz = sizeof(privOnly); - - ret = wc_InitRng(&rng); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_ed25519_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return TEST_FAIL; - } + WC_RNG rng; + ed25519_key key; + byte priv[ED25519_PRV_KEY_SIZE]; + byte pub[ED25519_PUB_KEY_SIZE]; + byte privOnly[ED25519_PRV_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + word32 privOnlySz = sizeof(privOnly); +#ifndef HAVE_ED25519_MAKE_KEY + const byte privKey[] = { + 0xf8, 0x55, 0xb7, 0xb6, 0x49, 0x3f, 0x99, 0x9c, + 0x88, 0xe3, 0xc5, 0x42, 0x6a, 0xa4, 0x47, 0x4a, + 0xe4, 0x95, 0xda, 0xdb, 0xbf, 0xf8, 0xa7, 0x42, + 0x9d, 0x0e, 0xe7, 0xd0, 0x57, 0x8f, 0x16, 0x69 + }; + const byte pubKey[] = { + 0x42, 0x3b, 0x7a, 0xf9, 0x82, 0xcf, 0xf9, 0xdf, + 0x19, 0xdd, 0xf3, 0xf0, 0x32, 0x29, 0x6d, 0xfa, + 0xfd, 0x76, 0x4f, 0x68, 0xc2, 0xc2, 0xe0, 0x6c, + 0x47, 0xae, 0xc2, 0x55, 0x68, 0xac, 0x0d, 0x4d + }; +#endif - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); - if (ret != 0) { - wc_FreeRng(&rng); - wc_ed25519_free(&key); - return TEST_FAIL; - } + XMEMSET(&key, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); +#ifdef HAVE_ED25519_MAKE_KEY + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); +#else + ExpectIntEQ(wc_ed25519_import_private_key_ex(privKey, sizeof(privKey), + pubKey, sizeof(pubKey), &key, 1), 0); +#endif - ret = wc_ed25519_export_private(&key, privOnly, &privOnlySz); - if (ret == 0) { - ret = wc_ed25519_export_private(NULL, privOnly, &privOnlySz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_private(&key, NULL, &privOnlySz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_private(&key, privOnly, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed25519_export_private(&key, privOnly, &privOnlySz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_export_private(NULL, privOnly, &privOnlySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_private(&key, NULL, &privOnlySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_private(&key, privOnly, NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed25519_export_key(&key, priv, &privSz, pub, &pubSz); - if (ret == 0) { - ret = wc_ed25519_export_key(NULL, priv, &privSz, pub, &pubSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_key(&key, NULL, &privSz, pub, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_key(&key, priv, NULL, pub, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_key(&key, priv, &privSz, NULL, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed25519_export_key(&key, priv, &privSz, pub, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } /* END wc_ed25519_export_key() */ + ExpectIntEQ(wc_ed25519_export_key(&key, priv, &privSz, pub, &pubSz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed25519_export_key(NULL, priv, &privSz, pub, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_key(&key, NULL, &privSz, pub, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_key(&key, priv, NULL, pub, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_key(&key, priv, &privSz, NULL, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_export_key(&key, priv, &privSz, pub, NULL), + BAD_FUNC_ARG); + PRIVATE_KEY_LOCK(); /* Cross check output. */ - if (ret == 0 && XMEMCMP(priv, privOnly, privSz) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(XMEMCMP(priv, privOnly, privSz), 0); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed25519_exportKey */ /* @@ -23770,61 +23315,36 @@ */ static int test_wc_Ed25519PublicKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN)) - int tmp; ed25519_key key; - byte derBuf[1024]; - int ret = 0; + byte derBuf[1024]; - /* Test bad args */ - tmp = wc_Ed25519PublicKeyToDer(NULL, NULL, 0, 0); - if (tmp != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } + XMEMSET(&key, 0, sizeof(ed25519_key)); - if (ret == 0) { - wc_ed25519_init(&key); - tmp = wc_Ed25519PublicKeyToDer(&key, derBuf, 0, 0); - if (tmp != BUFFER_E) { - ret = WOLFSSL_FATAL_ERROR; - } - wc_ed25519_free(&key); - } + /* Test bad args */ + ExpectIntEQ(wc_Ed25519PublicKeyToDer(NULL, NULL, 0, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_Ed25519PublicKeyToDer(&key, derBuf, 0, 0), BUFFER_E); + wc_ed25519_free(&key); /* Test good args */ - if (ret == 0) { - WC_RNG rng; - ret = wc_InitRng(&rng); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_ed25519_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return TEST_FAIL; - } + if (EXPECT_SUCCESS()) { + WC_RNG rng; - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); - if (ret != 0) { - wc_FreeRng(&rng); - wc_ed25519_free(&key); - return TEST_FAIL; - } + XMEMSET(&rng, 0, sizeof(WC_RNG)); - tmp = wc_Ed25519PublicKeyToDer(&key, derBuf, 1024, 1); - if (tmp <= 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_ed25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0); + ExpectIntGT(wc_Ed25519PublicKeyToDer(&key, derBuf, 1024, 1), 0); - wc_FreeRng(&rng); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed25519_free(&key); } - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END testing wc_Ed25519PublicKeyToDer */ /* @@ -23832,59 +23352,40 @@ */ static int test_wc_curve25519_init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - curve25519_key key; - int ret = 0; + curve25519_key key; - ret = wc_curve25519_init(&key); + ExpectIntEQ(wc_curve25519_init(&key), 0); /* Test bad args for wc_curve25519_init */ - if (ret == 0) { - ret = wc_curve25519_init(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_curve25519_init(NULL), BAD_FUNC_ARG); - /* Test good args for wc_curve_25519_free */ + /* Test good args for wc_curve_25519_free */ wc_curve25519_free(&key); - + /* Test bad args for wc_curve25519 free. */ wc_curve25519_free(NULL); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_curve25519_init and wc_curve_25519_free*/ /* * Testing test_wc_curve25519_size. */ static int test_wc_curve25519_size(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - curve25519_key key; - int ret = 0; - - ret = wc_curve25519_init(&key); + curve25519_key key; - /* Test good args for wc_curve25519_size */ - if (ret == 0) { - ret = wc_curve25519_size(&key); - } + ExpectIntEQ(wc_curve25519_init(&key), 0); + /* Test good args for wc_curve25519_size */ + ExpectIntEQ(wc_curve25519_size(&key), CURVE25519_KEYSIZE); /* Test bad args for wc_curve25519_size */ - if (ret != 0) { - ret = wc_curve25519_size(NULL); - } + ExpectIntEQ(wc_curve25519_size(NULL), 0); wc_curve25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_curve25519_size*/ /* @@ -23892,120 +23393,67 @@ */ static int test_wc_curve25519_export_key_raw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) - curve25519_key key; - WC_RNG rng; - int ret = 0; - - byte privateKey[CURVE25519_KEYSIZE]; - byte publicKey[CURVE25519_KEYSIZE]; - word32 prvkSz; - word32 pubkSz; - - byte prik[CURVE25519_KEYSIZE]; - byte pubk[CURVE25519_KEYSIZE]; - word32 prksz; - word32 pbksz; - - if (0 != wc_InitRng(&rng)) { - return TEST_FAIL; - } - if (0 != wc_curve25519_init(&key)) { - wc_FreeRng(&rng); - return TEST_FAIL; - } - - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); - - /* - bad-argument-test cases - target function sould return BAD_FUNC_ARG - */ - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw( - NULL, privateKey, &prvkSz, publicKey, &pubkSz)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key, NULL, &prvkSz, publicKey, &pubkSz)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key, privateKey, NULL, publicKey, &pubkSz)) { - ret = -1; - } - } - - if (ret == 0) { - /* prvkSz = CURVE25519_KEYSIZE; */ - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key, privateKey, &prvkSz, NULL, &pubkSz)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw( - &key, privateKey, &prvkSz, publicKey, NULL )) { - ret = -1; - } - } - - /* - cross-testing - */ - if (ret == 0) { - prksz = CURVE25519_KEYSIZE; - ret = wc_curve25519_export_private_raw(&key, prik, &prksz); - } - - if (ret == 0) { - pbksz = CURVE25519_KEYSIZE; - ret = wc_curve25519_export_public(&key, pubk, &pbksz); - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - /* pubkSz = CURVE25519_KEYSIZE; */ - ret = wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, - publicKey, &pubkSz); - } - - if (ret == 0) { - if ((prksz == CURVE25519_KEYSIZE) && - (pbksz == CURVE25519_KEYSIZE) && - (prvkSz == CURVE25519_KEYSIZE) && - (pubkSz == CURVE25519_KEYSIZE)) { - - if (0 != XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) || - 0 != XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE)) { - ret = -1; - } - } - } + curve25519_key key; + WC_RNG rng; + byte privateKey[CURVE25519_KEYSIZE]; + byte publicKey[CURVE25519_KEYSIZE]; + word32 prvkSz; + word32 pubkSz; + byte prik[CURVE25519_KEYSIZE]; + byte pubk[CURVE25519_KEYSIZE]; + word32 prksz; + word32 pbksz; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); + + /* bad-argument-test cases - target function should return BAD_FUNC_ARG */ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw(NULL, privateKey, &prvkSz, + publicKey, &pubkSz), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw(&key, NULL, &prvkSz, publicKey, + &pubkSz), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw(&key, privateKey, NULL, + publicKey, &pubkSz), BAD_FUNC_ARG); + /* prvkSz = CURVE25519_KEYSIZE; */ + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, + NULL, &pubkSz), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, + publicKey, NULL), BAD_FUNC_ARG); + + /* cross-testing */ + prksz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_private_raw(&key, prik, &prksz), 0); + pbksz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_public(&key, pubk, &pbksz), 0); + prvkSz = CURVE25519_KEYSIZE; + /* pubkSz = CURVE25519_KEYSIZE; */ + ExpectIntEQ(wc_curve25519_export_key_raw(&key, privateKey, &prvkSz, + publicKey, &pubkSz), 0); + ExpectIntEQ(prksz, CURVE25519_KEYSIZE); + ExpectIntEQ(pbksz, CURVE25519_KEYSIZE); + ExpectIntEQ(prvkSz, CURVE25519_KEYSIZE); + ExpectIntEQ(pubkSz, CURVE25519_KEYSIZE); + ExpectIntEQ(XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE), 0); + ExpectIntEQ(XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* end of test_wc_curve25519_export_key_raw */ /* @@ -24013,198 +23461,105 @@ */ static int test_wc_curve25519_export_key_raw_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT) - curve25519_key key; - WC_RNG rng; - int ret; - - byte privateKey[CURVE25519_KEYSIZE]; - byte publicKey[CURVE25519_KEYSIZE]; - word32 prvkSz; - word32 pubkSz; - - byte prik[CURVE25519_KEYSIZE]; - byte pubk[CURVE25519_KEYSIZE]; - word32 prksz; - word32 pbksz; - - if (0 != wc_InitRng(&rng)) { - return TEST_FAIL; - } - if (0 != wc_curve25519_init(&key)) { - wc_FreeRng(&rng); - return TEST_FAIL; - } - - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); - - /* - bad-argument-test cases - target function sould return BAD_FUNC_ARG - */ - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL , privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key , NULL, - &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key,privateKey, - NULL, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - /* prvkSz = CURVE25519_KEYSIZE; */ - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, NULL, &pubkSz, EC25519_LITTLE_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, NULL, EC25519_LITTLE_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - /* pubkSz = CURVE25519_KEYSIZE; */ - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( NULL, privateKey, - &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, NULL, - &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - /* prvkSz = CURVE25519_KEYSIZE; */ - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, NULL, &pubkSz, EC25519_BIG_ENDIAN)) { - ret = -1; - } - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex( &key, privateKey, - &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN)) { - ret = -1; - } - } - - /* illegal value for endien */ - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - /* pubkSz = CURVE25519_KEYSIZE; */ - if (BAD_FUNC_ARG != wc_curve25519_export_key_raw_ex(&key, privateKey, - &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN + 10)) { - ret = -1; - } - } - - /* - cross-testing - */ - if (ret == 0) { - prksz = CURVE25519_KEYSIZE; - ret = wc_curve25519_export_private_raw( &key, prik, &prksz); - } - - if (ret == 0) { - pbksz = CURVE25519_KEYSIZE; - ret = wc_curve25519_export_public( &key, pubk, &pbksz); - } - - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - /* pubkSz = CURVE25519_KEYSIZE; */ - ret = wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, - publicKey, &pubkSz, EC25519_BIG_ENDIAN); - } - - if (ret == 0 && (prksz != CURVE25519_KEYSIZE || - pbksz != CURVE25519_KEYSIZE || - prvkSz != CURVE25519_KEYSIZE || - pubkSz != CURVE25519_KEYSIZE)) { - ret = -1; - } - - if (ret == 0 && (0 != XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE) || - 0 != XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE))) { - ret = -1; - } - - if (ret == 0) { - ret = wc_curve25519_export_key_raw_ex(&key, privateKey, &prvkSz, - publicKey, &pubkSz, EC25519_LITTLE_ENDIAN); - } - if (ret == 0 && (prvkSz != CURVE25519_KEYSIZE || - pubkSz != CURVE25519_KEYSIZE)) { - ret = -1; - } - - /* - try once with another endian - */ - if (ret == 0) { - prvkSz = CURVE25519_KEYSIZE; - pubkSz = CURVE25519_KEYSIZE; - ret = wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, - publicKey, &pubkSz, EC25519_BIG_ENDIAN); - } - if (ret == 0 && (prvkSz != CURVE25519_KEYSIZE || - pubkSz != CURVE25519_KEYSIZE)) { - ret = -1; - } + curve25519_key key; + WC_RNG rng; + byte privateKey[CURVE25519_KEYSIZE]; + byte publicKey[CURVE25519_KEYSIZE]; + word32 prvkSz; + word32 pubkSz; + byte prik[CURVE25519_KEYSIZE]; + byte pubk[CURVE25519_KEYSIZE]; + word32 prksz; + word32 pbksz; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); + + /* bad-argument-test cases - target function should return BAD_FUNC_ARG */ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(NULL, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, NULL, + &prvkSz, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, + NULL, publicKey, &pubkSz, EC25519_LITTLE_ENDIAN), BAD_FUNC_ARG); + /* prvkSz = CURVE25519_KEYSIZE; */ + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, + &prvkSz, NULL, &pubkSz, EC25519_LITTLE_ENDIAN), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, + &prvkSz, publicKey, NULL, EC25519_LITTLE_ENDIAN), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + /* pubkSz = CURVE25519_KEYSIZE; */ + ExpectIntEQ(wc_curve25519_export_key_raw_ex(NULL, privateKey, + &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, NULL, + &prvkSz, publicKey, &pubkSz, EC25519_BIG_ENDIAN), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, + NULL, publicKey, &pubkSz, EC25519_BIG_ENDIAN), BAD_FUNC_ARG); + /* prvkSz = CURVE25519_KEYSIZE; */ + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, + &prvkSz, NULL, &pubkSz, EC25519_BIG_ENDIAN), BAD_FUNC_ARG); + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, + &prvkSz, publicKey, NULL, EC25519_BIG_ENDIAN), BAD_FUNC_ARG); + + /* illegal value for endian */ + prvkSz = CURVE25519_KEYSIZE; + /* pubkSz = CURVE25519_KEYSIZE; */ + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, &prvkSz, + publicKey, NULL, EC25519_BIG_ENDIAN + 10), BAD_FUNC_ARG); + + /* cross-testing */ + prksz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_private_raw( &key, prik, &prksz), 0); + pbksz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_public( &key, pubk, &pbksz), 0); + prvkSz = CURVE25519_KEYSIZE; + /* pubkSz = CURVE25519_KEYSIZE; */ + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN), 0); + ExpectIntEQ(prksz, CURVE25519_KEYSIZE); + ExpectIntEQ(pbksz, CURVE25519_KEYSIZE); + ExpectIntEQ(prvkSz, CURVE25519_KEYSIZE); + ExpectIntEQ(pubkSz, CURVE25519_KEYSIZE); + ExpectIntEQ(XMEMCMP(privateKey, prik, CURVE25519_KEYSIZE), 0); + ExpectIntEQ(XMEMCMP(publicKey, pubk, CURVE25519_KEYSIZE), 0); + ExpectIntEQ(wc_curve25519_export_key_raw_ex(&key, privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_LITTLE_ENDIAN), 0); + ExpectIntEQ(prvkSz, CURVE25519_KEYSIZE); + ExpectIntEQ(pubkSz, CURVE25519_KEYSIZE); + + /* try once with another endian */ + prvkSz = CURVE25519_KEYSIZE; + pubkSz = CURVE25519_KEYSIZE; + ExpectIntEQ(wc_curve25519_export_key_raw_ex( &key, privateKey, &prvkSz, + publicKey, &pubkSz, EC25519_BIG_ENDIAN), 0); + ExpectIntEQ(prvkSz, CURVE25519_KEYSIZE); + ExpectIntEQ(pubkSz, CURVE25519_KEYSIZE); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* end of test_wc_curve25519_export_key_raw_ex */ /* @@ -24212,559 +23567,312 @@ */ static int test_wc_curve25519_make_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - WC_RNG rng; - curve25519_key key; - int keysize; - int ret; + curve25519_key key; + WC_RNG rng; + int keysize; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); + ExpectIntEQ(keysize = wc_curve25519_size(&key), CURVE25519_KEYSIZE); + ExpectIntEQ(wc_curve25519_make_key(&rng, keysize, &key), 0); + /* test bad cases*/ + ExpectIntEQ(wc_curve25519_make_key(NULL, 0, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_make_key(&rng, keysize, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_make_key(NULL, keysize, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_make_key(&rng, 0, &key), ECC_BAD_ARG_E); - ret = wc_curve25519_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); - if (ret == 0) { - keysize = wc_curve25519_size(&key); - if (keysize != CURVE25519_KEYSIZE) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - ret = wc_curve25519_make_key(&rng, keysize, &key); - } - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve25519_make_key(NULL, 0, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_make_key(&rng, keysize, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_make_key(NULL, keysize, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_make_key(&rng, 0, &key); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /*END test_wc_curve25519_make_key*/ + return EXPECT_RESULT(); +} /* END test_wc_curve25519_make_key*/ + /* * Testing wc_curve25519_shared_secret_ex */ static int test_wc_curve25519_shared_secret_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - WC_RNG rng; - curve25519_key private_key, public_key; - byte out[CURVE25519_KEYSIZE]; - word32 outLen = sizeof(out); - int endian = EC25519_BIG_ENDIAN; - int ret; + curve25519_key private_key; + curve25519_key public_key; + WC_RNG rng; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; + + ExpectIntEQ(wc_curve25519_init(&private_key), 0); + ExpectIntEQ(wc_curve25519_init(&public_key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); - ret = wc_curve25519_init(&private_key); - if (ret == 0) { - ret = wc_curve25519_init(&public_key); - } - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &private_key); - } - if (ret == 0) { - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &public_key); - } - if (ret == 0) { - ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, - &outLen, endian); - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve25519_shared_secret_ex(NULL, NULL, NULL, - 0, endian); - if (ret == 0) { - ret = -1; - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_shared_secret_ex(NULL, &public_key, out, - &outLen, endian); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_shared_secret_ex(&private_key, NULL, out, - &outLen, endian); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, NULL, - &outLen, endian); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, - NULL, endian); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &private_key), + 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &public_key), + 0); - if (ret == 0) { - /*curve25519.c is checking for public_key size less than or equal to 0x7f, - *increasing to 0x8f checks for error being returned*/ - public_key.p.point[CURVE25519_KEYSIZE-1] = 0x8F; - ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, - &outLen, endian); - if (ret == 0) { - ret = -1; - } - else if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } + ExpectIntEQ(wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian), 0); + + /* test bad cases*/ + ExpectIntEQ(wc_curve25519_shared_secret_ex(NULL, NULL, NULL, 0, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_shared_secret_ex(NULL, &public_key, out, &outLen, + endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_shared_secret_ex(&private_key, NULL, out, &outLen, + endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_shared_secret_ex(&private_key, &public_key, NULL, + &outLen, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + NULL, endian), BAD_FUNC_ARG); + + /* curve25519.c is checking for public_key size less than or equal to 0x7f, + * increasing to 0x8f checks for error being returned*/ + public_key.p.point[CURVE25519_KEYSIZE-1] = 0x8F; + ExpectIntEQ(wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian), ECC_BAD_ARG_E); outLen = outLen - 2; - if (ret == 0) { - ret = wc_curve25519_shared_secret_ex(&private_key, &public_key, out, - &outLen, endian); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_curve25519_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian), BAD_FUNC_ARG); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&private_key); wc_curve25519_free(&public_key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /*END test_wc_curve25519_shared_secret_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve25519_shared_secret_ex*/ + /* * Testing wc_curve25519_make_pub */ static int test_wc_curve25519_make_pub(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_CURVE25519 - WC_RNG rng; - curve25519_key key; - byte out[CURVE25519_KEYSIZE]; - int ret; - - ret = wc_curve25519_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); - } - } - if (ret == 0) { - ret = wc_curve25519_make_pub((int)sizeof(out), out, (int)sizeof(key.k), key.k); - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve25519_make_pub((int)sizeof(key.k) - 1, key.k, (int)sizeof out, out); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_make_pub((int)sizeof out, out, (int)sizeof(key.k), NULL); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_make_pub((int)sizeof out - 1, out, (int)sizeof(key.k), key.k); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_make_pub((int)sizeof out, NULL, (int)sizeof(key.k), key.k); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - /* verify clamping test */ - key.k[0] |= ~248; - ret = wc_curve25519_make_pub((int)sizeof out, out, (int)sizeof(key.k), key.k); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - key.k[0] &= 248; - } + curve25519_key key; + WC_RNG rng; + byte out[CURVE25519_KEYSIZE]; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); + + ExpectIntEQ(wc_curve25519_make_pub((int)sizeof(out), out, + (int)sizeof(key.k), key.k), 0); + /* test bad cases*/ + ExpectIntEQ(wc_curve25519_make_pub((int)sizeof(key.k) - 1, key.k, + (int)sizeof out, out), ECC_BAD_ARG_E); + ExpectIntEQ(wc_curve25519_make_pub((int)sizeof out, out, (int)sizeof(key.k), + NULL), ECC_BAD_ARG_E); + ExpectIntEQ(wc_curve25519_make_pub((int)sizeof out - 1, out, + (int)sizeof(key.k), key.k), ECC_BAD_ARG_E); + ExpectIntEQ(wc_curve25519_make_pub((int)sizeof out, NULL, + (int)sizeof(key.k), key.k), ECC_BAD_ARG_E); + /* verify clamping test */ + key.k[0] |= ~248; + ExpectIntEQ(wc_curve25519_make_pub((int)sizeof out, out, (int)sizeof(key.k), + key.k), ECC_BAD_ARG_E); + key.k[0] &= 248; /* repeat the expected-to-succeed test. */ - if (ret == 0) { - ret = wc_curve25519_make_pub((int)sizeof out, out, (int)sizeof(key.k), key.k); - } + ExpectIntEQ(wc_curve25519_make_pub((int)sizeof out, out, (int)sizeof(key.k), + key.k), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /*END test_wc_curve25519_make_pub */ + return EXPECT_RESULT(); +} /* END test_wc_curve25519_make_pub */ + /* * Testing test_wc_curve25519_export_public_ex */ static int test_wc_curve25519_export_public_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - WC_RNG rng; - curve25519_key key; - byte out[CURVE25519_KEYSIZE]; - word32 outLen = sizeof(out); - int endian = EC25519_BIG_ENDIAN; - int ret; - - ret = wc_curve25519_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); - if (ret == 0) { - ret = wc_curve25519_export_public(&key, out, &outLen); - } - if (ret == 0) { - ret = wc_curve25519_export_public_ex(&key, out, &outLen, endian); - } - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve25519_export_public_ex(NULL, NULL, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_export_public_ex(NULL, out, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_export_public_ex(&key, NULL, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_export_public_ex(&key, out, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + curve25519_key key; + WC_RNG rng; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); + + ExpectIntEQ(wc_curve25519_export_public(&key, out, &outLen), 0); + ExpectIntEQ(wc_curve25519_export_public_ex(&key, out, &outLen, endian), 0); + /* test bad cases*/ + ExpectIntEQ(wc_curve25519_export_public_ex(NULL, NULL, NULL, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_export_public_ex(NULL, out, &outLen, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_export_public_ex(&key, NULL, &outLen, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_export_public_ex(&key, out, NULL, endian), + BAD_FUNC_ARG); outLen = outLen - 2; - if (ret == 0) { - ret = wc_curve25519_export_public_ex(&key, out, &outLen, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } + ExpectIntEQ(wc_curve25519_export_public_ex(&key, out, &outLen, endian), + ECC_BAD_ARG_E); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; - -} /*END test_wc_curve25519_export_public_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve25519_export_public_ex*/ /* * Testing test_wc_curve25519_import_private_raw_ex */ static int test_wc_curve25519_import_private_raw_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - WC_RNG rng; - curve25519_key key; - byte priv[CURVE25519_KEYSIZE]; - byte pub[CURVE25519_KEYSIZE]; - word32 privSz = sizeof(priv); - word32 pubSz = sizeof(pub); - int endian = EC25519_BIG_ENDIAN; - int ret; - - ret = wc_curve25519_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(&key, priv, &privSz, endian); - } - if (ret == 0) { - ret = wc_curve25519_export_public(&key, pub, &pubSz); - } - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, - &key, endian); - } - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(NULL, 0, NULL, 0, NULL, - endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(NULL, privSz, pub, pubSz, - &key, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(priv, privSz, NULL, pubSz, - &key, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, - NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(priv, 0, pub, pubSz, - &key, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, 0, - &key, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, - &key, EC25519_LITTLE_ENDIAN); - - } + curve25519_key key; + WC_RNG rng; + byte priv[CURVE25519_KEYSIZE]; + byte pub[CURVE25519_KEYSIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + int endian = EC25519_BIG_ENDIAN; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); + + ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, priv, &privSz, + endian), 0); + ExpectIntEQ(wc_curve25519_export_public(&key, pub, &pubSz), 0); + ExpectIntEQ(wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, endian), 0); + /* test bad cases*/ + ExpectIntEQ(wc_curve25519_import_private_raw_ex(NULL, 0, NULL, 0, NULL, + endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_import_private_raw_ex(NULL, privSz, pub, pubSz, + &key, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_import_private_raw_ex(priv, privSz, NULL, pubSz, + &key, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, + NULL, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_import_private_raw_ex(priv, 0, pub, pubSz, + &key, endian), ECC_BAD_ARG_E); + ExpectIntEQ(wc_curve25519_import_private_raw_ex(priv, privSz, pub, 0, + &key, endian), ECC_BAD_ARG_E); + ExpectIntEQ(wc_curve25519_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, EC25519_LITTLE_ENDIAN), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve25519_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /*END test_wc_curve25519_import_private_raw_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve25519_import_private_raw_ex*/ /* * Testing test_wc_curve25519_import_private */ static int test_wc_curve25519_import_private(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - curve25519_key key; - WC_RNG rng; - byte priv[CURVE25519_KEYSIZE]; - word32 privSz = sizeof(priv); - int ret; + curve25519_key key; + WC_RNG rng; + byte priv[CURVE25519_KEYSIZE]; + word32 privSz = sizeof(priv); - ret = wc_curve25519_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key); - if (ret == 0) { - ret = wc_curve25519_export_private_raw(&key, priv, &privSz); - } - } - if (ret == 0) { - ret = wc_curve25519_import_private(priv, privSz, &key); - } - wc_curve25519_free(&key); - wc_FreeRng(&rng); + ExpectIntEQ(wc_curve25519_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve25519_make_key(&rng, CURVE25519_KEYSIZE, &key), 0); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_curve25519_export_private_raw(&key, priv, &privSz), 0); + ExpectIntEQ(wc_curve25519_import_private(priv, privSz, &key), 0); + + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_curve25519_free(&key); #endif - return res; -} /*END test_wc_curve25519_import*/ + return EXPECT_RESULT(); +} /* END test_wc_curve25519_import*/ /* * Testing test_wc_curve25519_export_private_raw_ex */ static int test_wc_curve25519_export_private_raw_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE25519) - curve25519_key key; - byte out[CURVE25519_KEYSIZE]; - word32 outLen = sizeof(out); - int endian = EC25519_BIG_ENDIAN; - int ret; + curve25519_key key; + byte out[CURVE25519_KEYSIZE]; + word32 outLen = sizeof(out); + int endian = EC25519_BIG_ENDIAN; - ret = wc_curve25519_init(&key); - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian); - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(NULL, NULL, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(NULL, out, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(&key, NULL, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(&key, out, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(&key, out, &outLen, - EC25519_LITTLE_ENDIAN); - } + ExpectIntEQ(wc_curve25519_init(&key), 0); + + ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian), + 0); + /* test bad cases*/ + ExpectIntEQ(wc_curve25519_export_private_raw_ex(NULL, NULL, NULL, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_export_private_raw_ex(NULL, out, &outLen, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, NULL, &outLen, + endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, NULL, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, &outLen, + EC25519_LITTLE_ENDIAN), 0); outLen = outLen - 2; - if (ret == 0) { - ret = wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } + ExpectIntEQ(wc_curve25519_export_private_raw_ex(&key, out, &outLen, endian), + ECC_BAD_ARG_E); wc_curve25519_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -}/*END test_wc_curve25519_export_private_raw_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve25519_export_private_raw_ex*/ /* * Testing wc_ed448_make_key(). */ static int test_wc_ed448_make_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) ed448_key key; WC_RNG rng; unsigned char pubkey[ED448_PUB_KEY_SIZE]; - int ret; - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ed448_init(&key); - } - if (ret == 0) { - ret = wc_ed448_make_public(&key, pubkey, sizeof(pubkey)); - if (ret == ECC_PRIV_KEY_E) { - ret = 0; - } - else if (ret == 0) { - ret = -1; - } - } - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key); - } + XMEMSET(&key, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + + ExpectIntEQ(wc_ed448_make_public(&key, pubkey, sizeof(pubkey)), + ECC_PRIV_KEY_E); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ed448_make_key(NULL, ED448_KEY_SIZE, &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE - 1, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE + 1, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ed448_make_key(NULL, ED448_KEY_SIZE, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE - 1, &key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE + 1, &key), + BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed448_make_key */ @@ -24773,29 +23881,19 @@ */ static int test_wc_ed448_init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) - ed448_key key; - int ret; + ed448_key key; - ret = wc_ed448_init(&key); + XMEMSET(&key, 0, sizeof(ed448_key)); + ExpectIntEQ(wc_ed448_init(&key), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ed448_init(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ed448_init(NULL), BAD_FUNC_ARG); wc_ed448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed448_init */ /* @@ -24803,116 +23901,70 @@ */ static int test_wc_ed448_sign_msg(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_SIGN) - WC_RNG rng; - ed448_key key; - byte msg[] = "Everybody gets Friday off.\n"; - byte sig[ED448_SIG_SIZE]; - word32 msglen = sizeof(msg); - word32 siglen = sizeof(sig); - word32 badSigLen = sizeof(sig) - 1; + ed448_key key; + WC_RNG rng; + byte msg[] = "Everybody gets Friday off.\n"; + byte sig[ED448_SIG_SIZE]; + word32 msglen = sizeof(msg); + word32 siglen = sizeof(sig); + word32 badSigLen = sizeof(sig) - 1; #ifdef HAVE_ED448_VERIFY - int verify_ok = 0; /*1 = Verify success.*/ + int verify_ok = 0; /*1 = Verify success.*/ #endif - int ret; /* Initialize stack variables. */ + XMEMSET(&key, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(sig, 0, siglen); /* Initialize key. */ - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ed448_init(&key); - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key); - } - } + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); - if (ret == 0) { - ret = wc_ed448_sign_msg(msg, msglen, sig, &siglen, &key, NULL, 0); - } + ExpectIntEQ(wc_ed448_sign_msg(msg, msglen, sig, &siglen, &key, NULL, 0), 0); + ExpectIntEQ(siglen, ED448_SIG_SIZE); /* Test bad args. */ - if (ret == 0 && siglen == ED448_SIG_SIZE) { - ret = wc_ed448_sign_msg(NULL, msglen, sig, &siglen, &key, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_sign_msg(msg, msglen, NULL, &siglen, &key, NULL, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_sign_msg(msg, msglen, sig, NULL, &key, NULL, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_sign_msg(msg, msglen, sig, &siglen, NULL, NULL, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_sign_msg(msg, msglen, sig, &badSigLen, &key, - NULL, 0); - } - if (ret == BUFFER_E && badSigLen == ED448_SIG_SIZE) { - badSigLen -= 1; - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } /* END sign */ + ExpectIntEQ(wc_ed448_sign_msg(NULL, msglen, sig, &siglen, &key, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_sign_msg(msg, msglen, NULL, &siglen, &key, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_sign_msg(msg, msglen, sig, NULL, &key, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_sign_msg(msg, msglen, sig, &siglen, NULL, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_sign_msg(msg, msglen, sig, &badSigLen, &key, NULL, 0), + BUFFER_E); + ExpectIntEQ(badSigLen, ED448_SIG_SIZE); + badSigLen -= 1; #ifdef HAVE_ED448_VERIFY - if (ret == 0) { - - ret = wc_ed448_verify_msg(sig, siglen, msg, msglen, &verify_ok, - &key, NULL, 0); - if (ret == 0 && verify_ok == 1) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - - /* Test bad args. */ - if (ret == 0) { - AssertIntEQ(wc_ed448_verify_msg(sig, siglen - 1, msg, - msglen, &verify_ok, &key, NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_ed448_verify_msg(sig, siglen + 1, msg, - msglen, &verify_ok, &key, NULL, 0), BAD_FUNC_ARG); - - ret = wc_ed448_verify_msg(NULL, siglen, msg, msglen, &verify_ok, - &key, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_verify_msg(sig, siglen, NULL, msglen, - &verify_ok, &key, NULL, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_verify_msg(sig, siglen, msg, msglen, - NULL, &key, NULL, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_verify_msg(sig, siglen, msg, msglen, - &verify_ok, NULL, NULL, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_verify_msg(sig, badSigLen, msg, msglen, - &verify_ok, &key, NULL, 0); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - - } /* END verify. */ + ExpectIntEQ(wc_ed448_verify_msg(sig, siglen, msg, msglen, &verify_ok, &key, + NULL, 0), 0); + ExpectIntEQ(verify_ok, 1); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_verify_msg(sig, siglen - 1, msg, msglen, &verify_ok, + &key, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_verify_msg(sig, siglen + 1, msg, msglen, &verify_ok, + &key, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_verify_msg(NULL, siglen, msg, msglen, &verify_ok, + &key, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_verify_msg(sig, siglen, NULL, msglen, &verify_ok, + &key, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_verify_msg(sig, siglen, msg, msglen, NULL, + &key, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_verify_msg(sig, siglen, msg, msglen, &verify_ok, + NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_verify_msg(sig, badSigLen, msg, msglen, &verify_ok, + &key, NULL, 0), BAD_FUNC_ARG); #endif /* Verify. */ - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed448_sign_msg */ /* @@ -24920,59 +23972,32 @@ */ static int test_wc_ed448_import_public(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT) - WC_RNG rng; - ed448_key pubKey; - const byte in[] = + ed448_key pubKey; + WC_RNG rng; + const byte in[] = "Ed448PublicKeyUnitTest.................................\n"; - word32 inlen = sizeof(in); - int ret = 0; + word32 inlen = sizeof(in); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ed448_init(&pubKey); - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &pubKey); - } - } - - if (ret == 0) { - ret = wc_ed448_import_public_ex(in, inlen, &pubKey, 1); + XMEMSET(&pubKey, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0 && XMEMCMP(in, pubKey.p, inlen) == 0) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_ed448_init(&pubKey), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &pubKey), 0); - /* Test bad args. */ - if (ret == 0) { - ret = wc_ed448_import_public(NULL, inlen, &pubKey); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_import_public(in, inlen, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_import_public(in, inlen - 1, &pubKey); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_ed448_import_public_ex(in, inlen, &pubKey, 1), 0); + ExpectIntEQ(XMEMCMP(in, pubKey.p, inlen), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_import_public(NULL, inlen, &pubKey), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_import_public(in, inlen, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_import_public(in, inlen - 1, &pubKey), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&pubKey); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END wc_ed448_import_public */ /* @@ -24980,97 +24005,61 @@ */ static int test_wc_ed448_import_private_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT) - WC_RNG rng; - ed448_key key; - const byte privKey[] = - "Ed448PrivateKeyUnitTest................................\n"; - const byte pubKey[] = - "Ed448PublicKeyUnitTest.................................\n"; - word32 privKeySz = sizeof(privKey); - word32 pubKeySz = sizeof(pubKey); + ed448_key key; + WC_RNG rng; + const byte privKey[] = + "Ed448PrivateKeyUnitTest................................\n"; + const byte pubKey[] = + "Ed448PublicKeyUnitTest.................................\n"; + word32 privKeySz = sizeof(privKey); + word32 pubKeySz = sizeof(pubKey); #ifdef HAVE_ED448_KEY_EXPORT - byte bothKeys[sizeof(privKey) + sizeof(pubKey)]; - word32 bothKeysSz = sizeof(bothKeys); + byte bothKeys[sizeof(privKey) + sizeof(pubKey)]; + word32 bothKeysSz = sizeof(bothKeys); #endif - int ret; - ret = wc_InitRng(&rng); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_ed448_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return TEST_FAIL; - } - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key); + XMEMSET(&key, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_ed448_import_private_key_ex(privKey, privKeySz, pubKey, - pubKeySz, &key, 1); - if (ret == 0 && (XMEMCMP(pubKey, key.p, privKeySz) != 0 || - XMEMCMP(privKey, key.k, pubKeySz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); -#ifdef HAVE_ED448_KEY_EXPORT - if (ret == 0) - ret = wc_ed448_export_private(&key, bothKeys, &bothKeysSz); + ExpectIntEQ(wc_ed448_import_private_key_ex(privKey, privKeySz, pubKey, + pubKeySz, &key, 1), 0); + ExpectIntEQ(XMEMCMP(pubKey, key.p, privKeySz), 0); + ExpectIntEQ(XMEMCMP(privKey, key.k, pubKeySz), 0); - if (ret == 0) { - ret = wc_ed448_import_private_key_ex(bothKeys, bothKeysSz, NULL, 0, - &key, 1); - if (ret == 0 && (XMEMCMP(pubKey, key.p, privKeySz) != 0 || - XMEMCMP(privKey, key.k, pubKeySz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - } +#ifdef HAVE_ED448_KEY_EXPORT + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed448_export_private(&key, bothKeys, &bothKeysSz), 0); + PRIVATE_KEY_LOCK(); + ExpectIntEQ(wc_ed448_import_private_key_ex(bothKeys, bothKeysSz, NULL, 0, + &key, 1), 0); + ExpectIntEQ(XMEMCMP(pubKey, key.p, privKeySz), 0); + ExpectIntEQ(XMEMCMP(privKey, key.k, pubKeySz), 0); #endif /* Test bad args. */ - if (ret == 0) { - ret = wc_ed448_import_private_key(NULL, privKeySz, pubKey, pubKeySz, - &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_import_private_key(privKey, privKeySz, NULL, - pubKeySz, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_import_private_key(privKey, privKeySz, pubKey, - pubKeySz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_import_private_key(privKey, privKeySz - 1, pubKey, - pubKeySz, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_import_private_key(privKey, privKeySz, pubKey, - pubKeySz - 1, &key); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_import_private_key(privKey, privKeySz, NULL, - 0, &key); - } - - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ed448_import_private_key(NULL, privKeySz, pubKey, pubKeySz, + &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_import_private_key(privKey, privKeySz, NULL, pubKeySz, + &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_import_private_key(privKey, privKeySz, pubKey, + pubKeySz, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_import_private_key(privKey, privKeySz - 1, pubKey, + pubKeySz, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_import_private_key(privKey, privKeySz, pubKey, + pubKeySz - 1, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_import_private_key(privKey, privKeySz, NULL, 0, &key), + BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed448_import_private_key */ /* @@ -25078,86 +24067,46 @@ */ static int test_wc_ed448_export(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) - WC_RNG rng; - ed448_key key; - byte priv[ED448_PRV_KEY_SIZE]; - byte pub[ED448_PUB_KEY_SIZE]; - word32 privSz = sizeof(priv); - word32 pubSz = sizeof(pub); - int ret; - - ret = wc_InitRng(&rng); - if (ret != 0) { - return TEST_FAIL; - } - - ret = wc_ed448_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return TEST_FAIL; - } - - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key); - } - - if (ret == 0) { - ret = wc_ed448_export_public(&key, pub, &pubSz); - if (ret == 0 && (pubSz != ED448_KEY_SIZE || - XMEMCMP(key.p, pub, pubSz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_ed448_export_public(NULL, pub, &pubSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_public(&key, NULL, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_public(&key, pub, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ed448_key key; + WC_RNG rng; + byte priv[ED448_PRV_KEY_SIZE]; + byte pub[ED448_PUB_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + + XMEMSET(&key, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); + + ExpectIntEQ(wc_ed448_export_public(&key, pub, &pubSz), 0); + ExpectIntEQ(pubSz, ED448_KEY_SIZE); + ExpectIntEQ(XMEMCMP(key.p, pub, pubSz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_export_public(NULL, pub, &pubSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_public(&key, NULL, &pubSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_public(&key, pub, NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed448_export_private_only(&key, priv, &privSz); - if (ret == 0 && (privSz != ED448_KEY_SIZE || - XMEMCMP(key.k, priv, privSz) != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - if (ret == 0) { - ret = wc_ed448_export_private_only(NULL, priv, &privSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_private_only(&key, NULL, &privSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_private_only(&key, priv, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed448_export_private_only(&key, priv, &privSz), 0); + ExpectIntEQ(privSz, ED448_KEY_SIZE); + ExpectIntEQ(XMEMCMP(key.k, priv, privSz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_export_private_only(NULL, priv, &privSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_private_only(&key, NULL, &privSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_private_only(&key, priv, NULL), BAD_FUNC_ARG); + PRIVATE_KEY_LOCK(); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_ed448_export */ /* @@ -25165,86 +24114,38 @@ */ static int test_wc_ed448_size(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) - WC_RNG rng; - ed448_key key; - int ret = 0; + ed448_key key; + WC_RNG rng; - ret = wc_InitRng(&rng); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_ed448_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return TEST_FAIL; - } + XMEMSET(&key, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key); - if (ret != 0) { - wc_FreeRng(&rng); - wc_ed448_free(&key); - return TEST_FAIL; - } + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); - ret = wc_ed448_size(&key); + ExpectIntEQ(wc_ed448_size(&key), ED448_KEY_SIZE); /* Test bad args. */ - if (ret == ED448_KEY_SIZE) { - ret = wc_ed448_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_ed448_size(NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed448_sig_size(&key); - if (ret == ED448_SIG_SIZE) { - ret = 0; - } - /* Test bad args. */ - if (ret == 0) { - ret = wc_ed448_sig_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - } /* END wc_ed448_sig_size() */ + ExpectIntEQ(wc_ed448_sig_size(&key), ED448_SIG_SIZE); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_sig_size(NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed448_pub_size(&key); - if (ret == ED448_PUB_KEY_SIZE) { - ret = 0; - } - if (ret == 0) { - ret = wc_ed448_pub_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - } /* END wc_ed448_pub_size */ + ExpectIntEQ(wc_ed448_pub_size(&key), ED448_PUB_KEY_SIZE); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_pub_size(NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed448_priv_size(&key); - if (ret == ED448_PRV_KEY_SIZE) { - ret = 0; - } - if (ret == 0) { - ret = wc_ed448_priv_size(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - } /* END wc_ed448_pub_size */ + ExpectIntEQ(wc_ed448_priv_size(&key), ED448_PRV_KEY_SIZE); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_priv_size(NULL), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed448_size */ /* @@ -25252,90 +24153,53 @@ */ static int test_wc_ed448_exportKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) - WC_RNG rng; - ed448_key key; - byte priv[ED448_PRV_KEY_SIZE]; - byte pub[ED448_PUB_KEY_SIZE]; - byte privOnly[ED448_PRV_KEY_SIZE]; - word32 privSz = sizeof(priv); - word32 pubSz = sizeof(pub); - word32 privOnlySz = sizeof(privOnly); - int ret; - - ret = wc_InitRng(&rng); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_ed448_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return TEST_FAIL; - } - - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key); - if (ret != 0) { - wc_FreeRng(&rng); - wc_ed448_free(&key); - return TEST_FAIL; - } + ed448_key key; + WC_RNG rng; + byte priv[ED448_PRV_KEY_SIZE]; + byte pub[ED448_PUB_KEY_SIZE]; + byte privOnly[ED448_PRV_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + word32 privOnlySz = sizeof(privOnly); + + XMEMSET(&key, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); - ret = wc_ed448_export_private(&key, privOnly, &privOnlySz); - if (ret == 0) { - ret = wc_ed448_export_private(NULL, privOnly, &privOnlySz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_private(&key, NULL, &privOnlySz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_private(&key, privOnly, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ed448_export_private(&key, privOnly, &privOnlySz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_export_private(NULL, privOnly, &privOnlySz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_private(&key, NULL, &privOnlySz), BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_private(&key, privOnly, NULL), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_ed448_export_key(&key, priv, &privSz, pub, &pubSz); - if (ret == 0) { - ret = wc_ed448_export_key(NULL, priv, &privSz, pub, &pubSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_key(&key, NULL, &privSz, pub, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_key(&key, priv, NULL, pub, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_key(&key, priv, &privSz, NULL, &pubSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ed448_export_key(&key, priv, &privSz, pub, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } /* END wc_ed448_export_key() */ + ExpectIntEQ(wc_ed448_export_key(&key, priv, &privSz, pub, &pubSz), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ed448_export_key(NULL, priv, &privSz, pub, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_key(&key, NULL, &privSz, pub, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_key(&key, priv, NULL, pub, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_key(&key, priv, &privSz, NULL, &pubSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ed448_export_key(&key, priv, &privSz, pub, NULL), + BAD_FUNC_ARG); + PRIVATE_KEY_LOCK(); /* Cross check output. */ - if (ret == 0 && XMEMCMP(priv, privOnly, privSz) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(XMEMCMP(priv, privOnly, privSz), 0); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ed448_exportKey */ /* @@ -25343,61 +24207,38 @@ */ static int test_wc_Ed448PublicKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN)) - int tmp; ed448_key key; byte derBuf[1024]; - int ret = 0; + + XMEMSET(&key, 0, sizeof(ed448_key)); /* Test bad args */ - tmp = wc_Ed448PublicKeyToDer(NULL, NULL, 0, 0); - if (tmp != BAD_FUNC_ARG) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_Ed448PublicKeyToDer(NULL, NULL, 0, 0), BAD_FUNC_ARG); - if (ret == 0) { - wc_ed448_init(&key); - tmp = wc_Ed448PublicKeyToDer(&key, derBuf, 0, 0); - if (tmp != BUFFER_E) { - ret = WOLFSSL_FATAL_ERROR; - } - wc_ed448_free(&key); - } + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_Ed448PublicKeyToDer(&key, derBuf, 0, 0), BUFFER_E); + wc_ed448_free(&key); /* Test good args */ - if (ret == 0) { - WC_RNG rng; - ret = wc_InitRng(&rng); - if (ret != 0) { - return TEST_FAIL; - } - ret = wc_ed448_init(&key); - if (ret != 0) { - wc_FreeRng(&rng); - return TEST_FAIL; - } + if (EXPECT_SUCCESS()) { + WC_RNG rng; - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key); - if (ret != 0) { - wc_FreeRng(&rng); - wc_ed448_free(&key); - return TEST_FAIL; - } + XMEMSET(&rng, 0, sizeof(WC_RNG)); - tmp = wc_Ed448PublicKeyToDer(&key, derBuf, 1024, 1); - if (tmp <= 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_ed448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &key), 0); - wc_FreeRng(&rng); + ExpectIntGT(wc_Ed448PublicKeyToDer(&key, derBuf, 1024, 1), 0); + + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ed448_free(&key); } - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END testing wc_Ed448PublicKeyToDer */ /* @@ -25405,32 +24246,21 @@ */ static int test_wc_curve448_init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - curve448_key key; - int ret = 0; - - ret = wc_curve448_init(&key); + curve448_key key; /* Test bad args for wc_curve448_init */ - if (ret == 0) { - ret = wc_curve448_init(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_curve448_init(&key), 0); + /* Test bad args for wc_curve448_init */ + ExpectIntEQ(wc_curve448_init(NULL), BAD_FUNC_ARG); - /* Test good args for wc_curve_448_free */ + /* Test good args for wc_curve_448_free */ wc_curve448_free(&key); - + /* Test bad args for wc_curve448_free */ wc_curve448_free(NULL); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_curve448_init and wc_curve_448_free*/ /* @@ -25438,479 +24268,276 @@ */ static int test_wc_curve448_make_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - WC_RNG rng; - curve448_key key; - int keysize; - int ret; + curve448_key key; + WC_RNG rng; + int keysize; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key), 0); + ExpectIntEQ(keysize = wc_curve448_size(&key), CURVE448_KEY_SIZE); + ExpectIntEQ(wc_curve448_make_key(&rng, keysize, &key), 0); - ret = wc_curve448_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); - if (ret == 0) { - keysize = wc_curve448_size(&key); - if (keysize != CURVE448_KEY_SIZE) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - ret = wc_curve448_make_key(&rng, keysize, &key); - } - } /* test bad cases */ - if (ret == 0) { - ret = wc_curve448_make_key(NULL, 0, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_make_key(&rng, keysize, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_make_key(NULL, keysize, &key); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_make_key(&rng, 0, &key); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - - if (wc_FreeRng(&rng) != 0 && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_curve448_make_key(NULL, 0, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_make_key(&rng, keysize, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_make_key(NULL, keysize, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_make_key(&rng, 0, &key), ECC_BAD_ARG_E); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /*END test_wc_curve448_make_key*/ + return EXPECT_RESULT(); +} /* END test_wc_curve448_make_key*/ /* * Testing test_wc_curve448_shared_secret_ex */ static int test_wc_curve448_shared_secret_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - WC_RNG rng; - curve448_key private_key, public_key; - byte out[CURVE448_KEY_SIZE]; - word32 outLen = sizeof(out); - int endian = EC448_BIG_ENDIAN; - int ret; + curve448_key private_key; + curve448_key public_key; + WC_RNG rng; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve448_init(&private_key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &private_key), 0); + + ExpectIntEQ(wc_curve448_init(&public_key), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &public_key), 0); + ExpectIntEQ(wc_curve448_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian), 0); - ret = wc_curve448_init(&private_key); - if (ret == 0) { - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &private_key); - } - } - if (ret == 0) { - ret = wc_curve448_init(&public_key); - } - if (ret == 0) { - if (ret == 0) { - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &public_key); - } - } - - if (ret == 0) { - ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, - &outLen, endian); - } /* test bad cases */ - if (ret == 0) { - ret = wc_curve448_shared_secret_ex(NULL, NULL, NULL, 0, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_shared_secret_ex(NULL, &public_key, out, - &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_shared_secret_ex(&private_key, NULL, out, - &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_shared_secret_ex(&private_key, &public_key, NULL, - &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, - NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_curve448_shared_secret_ex(NULL, NULL, NULL, 0, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_shared_secret_ex(NULL, &public_key, out, &outLen, + endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_shared_secret_ex(&private_key, NULL, out, &outLen, + endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_shared_secret_ex(&private_key, &public_key, NULL, + &outLen, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_shared_secret_ex(&private_key, &public_key, out, + NULL, endian), BAD_FUNC_ARG); outLen = outLen - 2; - if (ret == 0) { - ret = wc_curve448_shared_secret_ex(&private_key, &public_key, out, - &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_curve448_shared_secret_ex(&private_key, &public_key, out, + &outLen, endian), BAD_FUNC_ARG); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve448_free(&private_key); wc_curve448_free(&public_key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /*END test_wc_curve448_shared_secret_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve448_shared_secret_ex*/ /* * Testing test_wc_curve448_export_public_ex */ static int test_wc_curve448_export_public_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) WC_RNG rng; curve448_key key; byte out[CURVE448_KEY_SIZE]; word32 outLen = sizeof(out); int endian = EC448_BIG_ENDIAN; - int ret; - ret = wc_curve448_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); - if (ret == 0) { - ret = wc_curve448_export_public(&key, out, &outLen); - } - if (ret == 0) { - ret = wc_curve448_export_public_ex(&key, out, &outLen, endian); - } - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve448_export_public_ex(NULL, NULL, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_export_public_ex(NULL, out, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_export_public_ex(&key, NULL, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_export_public_ex(&key, out, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_curve448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key), 0); + + ExpectIntEQ(wc_curve448_export_public(&key, out, &outLen), 0); + ExpectIntEQ(wc_curve448_export_public_ex(&key, out, &outLen, endian), 0); + /* test bad cases*/ + ExpectIntEQ(wc_curve448_export_public_ex(NULL, NULL, NULL, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_export_public_ex(NULL, out, &outLen, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_export_public_ex(&key, NULL, &outLen, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_export_public_ex(&key, out, NULL, endian), + BAD_FUNC_ARG); outLen = outLen - 2; - if (ret == 0) { - ret = wc_curve448_export_public_ex(&key, out, &outLen, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } + ExpectIntEQ(wc_curve448_export_public_ex(&key, out, &outLen, endian), + ECC_BAD_ARG_E); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve448_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; - -} /*END test_wc_curve448_export_public_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve448_export_public_ex*/ /* * Testing test_wc_curve448_export_private_raw_ex */ static int test_wc_curve448_export_private_raw_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - curve448_key key; - byte out[CURVE448_KEY_SIZE]; - word32 outLen = sizeof(out); - int endian = EC448_BIG_ENDIAN; - int ret; + curve448_key key; + byte out[CURVE448_KEY_SIZE]; + word32 outLen = sizeof(out); + int endian = EC448_BIG_ENDIAN; - ret = wc_curve448_init(&key); - if (ret == 0) { - ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); - } - /*test bad cases*/ - if (ret == 0) { - ret = wc_curve448_export_private_raw_ex(NULL, NULL, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_export_private_raw_ex(NULL, out, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_export_private_raw_ex(&key, NULL, &outLen, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_export_private_raw_ex(&key, out, NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, - EC448_LITTLE_ENDIAN); - } + ExpectIntEQ(wc_curve448_init(&key), 0); + ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, &outLen, endian), + 0); + /* test bad cases*/ + ExpectIntEQ(wc_curve448_export_private_raw_ex(NULL, NULL, NULL, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_export_private_raw_ex(NULL, out, &outLen, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, NULL, &outLen, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, NULL, endian), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, &outLen, + EC448_LITTLE_ENDIAN), 0); outLen = outLen - 2; - if (ret == 0) { - ret = wc_curve448_export_private_raw_ex(&key, out, &outLen, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } + ExpectIntEQ(wc_curve448_export_private_raw_ex(&key, out, &outLen, endian), + ECC_BAD_ARG_E); wc_curve448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -}/*END test_wc_curve448_export_private_raw_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve448_export_private_raw_ex*/ /* * Testing test_wc_curve448_import_private_raw_ex */ static int test_wc_curve448_import_private_raw_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - WC_RNG rng; - curve448_key key; - byte priv[CURVE448_KEY_SIZE]; - byte pub[CURVE448_KEY_SIZE]; - word32 privSz = sizeof(priv); - word32 pubSz = sizeof(pub); - int endian = EC448_BIG_ENDIAN; - int ret; - - ret = wc_curve448_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); - if (ret == 0) { - ret = wc_curve448_export_private_raw(&key, priv, &privSz); - } - if (ret == 0) { - ret = wc_curve448_export_public(&key, pub, &pubSz); - } - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, - &key, endian); - } - } + curve448_key key; + WC_RNG rng; + byte priv[CURVE448_KEY_SIZE]; + byte pub[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + int endian = EC448_BIG_ENDIAN; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key), 0); + + ExpectIntEQ(wc_curve448_export_private_raw(&key, priv, &privSz), 0); + ExpectIntEQ(wc_curve448_export_public(&key, pub, &pubSz), 0); + ExpectIntEQ(wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, endian), 0); /* test bad cases */ - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(NULL, 0, NULL, 0, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(NULL, privSz, pub, pubSz, - &key, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(priv, privSz, NULL, pubSz, - &key, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, - NULL, endian); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(priv, 0, pub, pubSz, - &key, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, 0, - &key, endian); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, - &key, EC448_LITTLE_ENDIAN); - - } - - if (wc_FreeRng(&rng) != 0 && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_curve448_import_private_raw_ex(NULL, 0, NULL, 0, NULL, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_import_private_raw_ex(NULL, privSz, pub, pubSz, + &key, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_import_private_raw_ex(priv, privSz, NULL, pubSz, + &key, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, + NULL, endian), BAD_FUNC_ARG); + ExpectIntEQ(wc_curve448_import_private_raw_ex(priv, 0, pub, pubSz, + &key, endian), ECC_BAD_ARG_E); + ExpectIntEQ(wc_curve448_import_private_raw_ex(priv, privSz, pub, 0, + &key, endian), ECC_BAD_ARG_E); + ExpectIntEQ(wc_curve448_import_private_raw_ex(priv, privSz, pub, pubSz, + &key, EC448_LITTLE_ENDIAN), 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /*END test_wc_curve448_import_private_raw_ex*/ + return EXPECT_RESULT(); +} /* END test_wc_curve448_import_private_raw_ex*/ /* * Testing test_curve448_export_key_raw */ static int test_wc_curve448_export_key_raw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - WC_RNG rng; - curve448_key key; - byte priv[CURVE448_KEY_SIZE]; - byte pub[CURVE448_KEY_SIZE]; - word32 privSz = sizeof(priv); - word32 pubSz = sizeof(pub); - int ret; - - ret = wc_curve448_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { - - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); - if (ret == 0) { - ret = wc_curve448_export_private_raw(&key, priv, &privSz); - } - if (ret == 0) { - ret = wc_curve448_export_public(&key, pub, &pubSz); - } - if (ret == 0) { - ret = wc_curve448_export_key_raw(&key, priv, &privSz, pub, &pubSz); - } - } + curve448_key key; + WC_RNG rng; + byte priv[CURVE448_KEY_SIZE]; + byte pub[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); + word32 pubSz = sizeof(pub); + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key), 0); + + ExpectIntEQ(wc_curve448_export_private_raw(&key, priv, &privSz), 0); + ExpectIntEQ(wc_curve448_export_public(&key, pub, &pubSz), 0); + ExpectIntEQ(wc_curve448_export_key_raw(&key, priv, &privSz, pub, &pubSz), + 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_curve448_free(&key); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -}/*END test_wc_curve448_import_private_raw_ex*/ - + return EXPECT_RESULT(); +} /* END test_wc_curve448_import_private_raw_ex*/ /* * Testing test_wc_curve448_import_private */ static int test_wc_curve448_import_private(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - curve448_key key; - WC_RNG rng; - byte priv[CURVE448_KEY_SIZE]; - word32 privSz = sizeof(priv); - int ret; + curve448_key key; + WC_RNG rng; + byte priv[CURVE448_KEY_SIZE]; + word32 privSz = sizeof(priv); - ret = wc_curve448_init(&key); - if (ret == 0) { - ret = wc_InitRng(&rng); - } - if (ret == 0) { + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key); - if (ret == 0) { - ret = wc_curve448_export_private_raw(&key, priv, &privSz); - } - } - if (ret == 0) { - ret = wc_curve448_import_private(priv, privSz, &key); - } - wc_curve448_free(&key); - wc_FreeRng(&rng); + ExpectIntEQ(wc_curve448_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &key), 0); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_curve448_export_private_raw(&key, priv, &privSz), 0); + ExpectIntEQ(wc_curve448_import_private(priv, privSz, &key), 0); + + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_curve448_free(&key); #endif - return res; -} /*END test_wc_curve448_import*/ + return EXPECT_RESULT(); +} /* END test_wc_curve448_import*/ /* * Testing test_wc_curve448_size. */ static int test_wc_curve448_size(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_CURVE448) - curve448_key key; - int ret = 0; + curve448_key key; - ret = wc_curve448_init(&key); + ExpectIntEQ(wc_curve448_init(&key), 0); /* Test good args for wc_curve448_size */ - if (ret == 0) { - ret = wc_curve448_size(&key); - } - + ExpectIntEQ(wc_curve448_size(&key), CURVE448_KEY_SIZE); /* Test bad args for wc_curve448_size */ - if (ret != 0) { - ret = wc_curve448_size(NULL); - } + ExpectIntEQ(wc_curve448_size(NULL), 0); wc_curve448_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_curve448_size*/ /* @@ -25918,50 +24545,35 @@ */ static int test_wc_ecc_make_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) - WC_RNG rng; ecc_key key; + WC_RNG rng; int ret; - ret = wc_InitRng(&rng); - if (ret != 0) - return TEST_FAIL; + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY14, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY14, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - /* Pass in bad args. */ - if (ret == 0) { - ret = wc_ecc_make_key(NULL, KEY14, &key); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_make_key(&rng, KEY14, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - wc_ecc_free(&key); - } + /* Pass in bad args. */ + ExpectIntEQ(wc_ecc_make_key(NULL, KEY14, &key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_make_key(&rng, KEY14, NULL), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) != 0 && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_ecc_free(&key); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_make_key */ @@ -25970,28 +24582,19 @@ */ static int test_wc_ecc_init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_ECC - ecc_key key; - int ret; + ecc_key key; - ret = wc_ecc_init(&key); + XMEMSET(&key, 0, sizeof(ecc_key)); + + ExpectIntEQ(wc_ecc_init(&key), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_ecc_init(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_init(NULL), BAD_FUNC_ARG); wc_ecc_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_init */ /* @@ -25999,53 +24602,36 @@ */ static int test_wc_ecc_check_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) - WC_RNG rng; - ecc_key key; - int ret; + ecc_key key; + WC_RNG rng; + int ret; XMEMSET(&rng, 0, sizeof(rng)); XMEMSET(&key, 0, sizeof(key)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY14, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY14, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - if (ret == 0) { - ret = wc_ecc_check_key(&key); - } + ExpectIntEQ(wc_ecc_check_key(&key), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_ecc_check_key(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_check_key(NULL), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_check_key */ /* @@ -26053,40 +24639,28 @@ */ static int test_wc_ecc_get_generator(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) && !defined(HAVE_SELFTEST) && \ !defined(HAVE_FIPS) && defined(OPENSSL_EXTRA) - ecc_point* pt; - int ret = 0; + ecc_point* pt = NULL; - pt = wc_ecc_new_point(); - if (!pt) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectNotNull(pt = wc_ecc_new_point()); - if (ret == 0) { - ret = wc_ecc_get_generator(pt, wc_ecc_get_curve_idx(ECC_SECP256R1)); - } + ExpectIntEQ(wc_ecc_get_generator(pt, wc_ecc_get_curve_idx(ECC_SECP256R1)), + MP_OKAY); /* Test bad args. */ - if (ret == MP_OKAY) { - /* Returns Zero for bad arg. */ - ret = wc_ecc_get_generator(pt, -1); - if (ret != MP_OKAY) - wc_ecc_get_generator(NULL, wc_ecc_get_curve_idx(ECC_SECP256R1)); - if (ret != MP_OKAY) - wc_ecc_get_generator(pt, 1000); /* If we ever get to 1000 curves - * increase this number */ - if (ret != MP_OKAY) - wc_ecc_get_generator(NULL, -1); - ret = (ret == MP_OKAY) ? WOLFSSL_FATAL_ERROR : 0; - } + /* Returns Zero for bad arg. */ + ExpectIntNE(wc_ecc_get_generator(pt, -1), MP_OKAY); + ExpectIntNE(wc_ecc_get_generator(NULL, wc_ecc_get_curve_idx(ECC_SECP256R1)), + MP_OKAY); + /* If we ever get to 1000 curves increase this number */ + ExpectIntNE(wc_ecc_get_generator(pt, 1000), MP_OKAY); + ExpectIntNE(wc_ecc_get_generator(NULL, -1), MP_OKAY); wc_ecc_del_point(pt); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_get_generator */ /* @@ -26094,54 +24668,37 @@ */ static int test_wc_ecc_size(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) WC_RNG rng; ecc_key key; int ret; - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY14, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY14, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - if (ret == 0) { - ret = wc_ecc_size(&key); - if (ret == KEY14) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_size(&key), KEY14); /* Test bad args. */ - if (ret == 0) { - /* Returns Zero for bad arg. */ - ret = wc_ecc_size(NULL); - } + /* Returns Zero for bad arg. */ + ExpectIntEQ(wc_ecc_size(NULL), 0); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_size */ static int test_wc_ecc_params(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; /* FIPS/CAVP self-test modules do not have `wc_ecc_get_curve_params`. It was added after certifications */ #if defined(HAVE_ECC) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) @@ -26149,20 +24706,17 @@ #if !defined(NO_ECC256) && !defined(NO_ECC_SECP) /* Test for SECP256R1 curve */ int curve_id = ECC_SECP256R1; - int curve_idx = wc_ecc_get_curve_idx(curve_id); - AssertIntNE(curve_idx, ECC_CURVE_INVALID); - ecc_set = wc_ecc_get_curve_params(curve_idx); - AssertNotNull(ecc_set); - AssertIntEQ(ecc_set->id, curve_id); + int curve_idx; + + ExpectIntNE(curve_idx = wc_ecc_get_curve_idx(curve_id), ECC_CURVE_INVALID); + ExpectNotNull(ecc_set = wc_ecc_get_curve_params(curve_idx)); + ExpectIntEQ(ecc_set->id, curve_id); #endif /* Test case when SECP256R1 is not enabled */ /* Test that we get curve params for index 0 */ - ecc_set = wc_ecc_get_curve_params(0); - AssertNotNull(ecc_set); - - res = TEST_RES_CHECK(1); + ExpectNotNull(ecc_set = wc_ecc_get_curve_params(0)); #endif /* HAVE_ECC && !HAVE_FIPS && !HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } /* @@ -26170,127 +24724,87 @@ */ static int test_wc_ecc_signVerify_hash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_SIGN) && !defined(NO_ASN) && !defined(WC_NO_RNG) - WC_RNG rng; - ecc_key key; - int ret; - int signH = WOLFSSL_FATAL_ERROR; - #ifdef HAVE_ECC_VERIFY - int verifyH = WOLFSSL_FATAL_ERROR; - int verify = 0; - #endif - word32 siglen = ECC_BUFSIZE; - byte sig[ECC_BUFSIZE]; - byte adjustedSig[ECC_BUFSIZE+1]; - byte digest[] = TEST_STRING; - word32 digestlen = (word32)TEST_STRING_SZ; + ecc_key key; + WC_RNG rng; + int ret; +#ifdef HAVE_ECC_VERIFY + int verify = 0; +#endif + word32 siglen = ECC_BUFSIZE; + byte sig[ECC_BUFSIZE]; + byte adjustedSig[ECC_BUFSIZE+1]; + byte digest[] = TEST_STRING; + word32 digestlen = (word32)TEST_STRING_SZ; /* Init stack var */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(sig, 0, siglen); - XMEMSET(&key, 0, sizeof(key)); XMEMSET(adjustedSig, 0, ECC_BUFSIZE+1); /* Init structs. */ - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY14, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY14, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - if (ret == 0) { - ret = wc_ecc_sign_hash(digest, digestlen, sig, &siglen, &rng, &key); - } + ExpectIntEQ(wc_ecc_sign_hash(digest, digestlen, sig, &siglen, &rng, &key), + 0); /* Check bad args. */ - if (ret == 0) { - signH = wc_ecc_sign_hash(NULL, digestlen, sig, &siglen, &rng, &key); - if (signH == ECC_BAD_ARG_E) { - signH = wc_ecc_sign_hash(digest, digestlen, NULL, &siglen, - &rng, &key); - } - if (signH == ECC_BAD_ARG_E) { - signH = wc_ecc_sign_hash(digest, digestlen, sig, NULL, - &rng, &key); - } - if (signH == ECC_BAD_ARG_E) { - signH = wc_ecc_sign_hash(digest, digestlen, sig, &siglen, - NULL, &key); - } - if (signH == ECC_BAD_ARG_E) { - signH = wc_ecc_sign_hash(digest, digestlen, sig, &siglen, - &rng, NULL); - } - if (signH == ECC_BAD_ARG_E) { - signH = 0; - } - else { - signH = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_sign_hash(NULL, digestlen, sig, &siglen, &rng, &key), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash(digest, digestlen, NULL, &siglen, &rng, &key), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash(digest, digestlen, sig, NULL, &rng, &key), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash(digest, digestlen, sig, &siglen, NULL, &key), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash(digest, digestlen, sig, &siglen, &rng, NULL), + ECC_BAD_ARG_E); #ifdef HAVE_ECC_VERIFY - ret = wc_ecc_verify_hash(sig, siglen, digest, digestlen, &verify, &key); - if (verify != 1 && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(wc_ecc_verify_hash(sig, siglen, digest, digestlen, &verify, + &key), 0); + ExpectIntEQ(verify, 1); /* test check on length of signature passed in */ XMEMCPY(adjustedSig, sig, siglen); adjustedSig[1] = adjustedSig[1] + 1; /* add 1 to length for extra byte*/ #ifndef NO_STRICT_ECDSA_LEN - AssertIntNE(wc_ecc_verify_hash(adjustedSig, siglen+1, digest, digestlen, - &verify, &key), 0); + ExpectIntNE(wc_ecc_verify_hash(adjustedSig, siglen+1, digest, digestlen, + &verify, &key), 0); #else /* if NO_STRICT_ECDSA_LEN is set then extra bytes after the signature * is allowed */ - AssertIntEQ(wc_ecc_verify_hash(adjustedSig, siglen+1, digest, digestlen, - &verify, &key), 0); + ExpectIntEQ(wc_ecc_verify_hash(adjustedSig, siglen+1, digest, digestlen, + &verify, &key), 0); #endif /* Test bad args. */ - if (ret == 0) { - verifyH = wc_ecc_verify_hash(NULL, siglen, digest, digestlen, - &verify, &key); - if (verifyH == ECC_BAD_ARG_E) { - verifyH = wc_ecc_verify_hash(sig, siglen, NULL, digestlen, - &verify, &key); - } - if (verifyH == ECC_BAD_ARG_E) { - verifyH = wc_ecc_verify_hash(sig, siglen, digest, digestlen, - NULL, &key); - } - if (verifyH == ECC_BAD_ARG_E) { - verifyH = wc_ecc_verify_hash(sig, siglen, digest, digestlen, - &verify, NULL); - } - if (verifyH == ECC_BAD_ARG_E) { - verifyH = 0; - } - else { - verifyH = WOLFSSL_FATAL_ERROR; - } - } - + ExpectIntEQ(wc_ecc_verify_hash(NULL, siglen, digest, digestlen, &verify, + &key), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_verify_hash(sig, siglen, NULL, digestlen, &verify, &key), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_verify_hash(sig, siglen, digest, digestlen, NULL, &key), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_verify_hash(sig, siglen, digest, digestlen, &verify, + NULL), ECC_BAD_ARG_E); #endif /* HAVE_ECC_VERIFY */ - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0 && signH == 0 && verifyH == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_sign_hash */ @@ -26299,11 +24813,14 @@ */ static int test_wc_ecc_shared_secret(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_DHE) && !defined(WC_NO_RNG) - ecc_key key, pubKey; + ecc_key key; + ecc_key pubKey; WC_RNG rng; +#if defined(NO_ECC256) int ret; +#endif byte out[KEY32]; int keySz = sizeof(out); word32 outlen = (word32)sizeof(out); @@ -26328,102 +24845,68 @@ PRIVATE_KEY_UNLOCK(); /* Initialize variables. */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&pubKey, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(out, 0, keySz); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); - XMEMSET(&pubKey, 0, sizeof(pubKey)); - - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_init(&pubKey); - } - } -#if defined(HAVE_ECC) && !defined(NO_ECC256) - if (ret == 0) { - ret = wc_ecc_import_raw(&key, qx, qy, d, curveName); - } - if (ret == 0) { - ret = wc_ecc_import_raw(&pubKey, qx, qy, NULL, curveName); - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_ecc_init(&pubKey), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + +#if !defined(NO_ECC256) + ExpectIntEQ(wc_ecc_import_raw(&key, qx, qy, d, curveName), 0); + ExpectIntEQ(wc_ecc_import_raw(&pubKey, qx, qy, NULL, curveName), 0); #else - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &pubKey); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &pubKey.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } + ret = wc_ecc_make_key(&rng, keySz, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); + ret = wc_ecc_make_key(&rng, keySz, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); #endif #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \ !defined(HAVE_SELFTEST) - if (ret == 0) { - ret = wc_ecc_set_rng(&key, &rng); - } + ExpectIntEQ(wc_ecc_set_rng(&key, &rng), 0); #endif - if (ret == 0) { - ret = wc_ecc_shared_secret(&key, &pubKey, out, &outlen); + ExpectIntEQ(wc_ecc_shared_secret(&key, &pubKey, out, &outlen), 0); -#if defined(HAVE_ECC) && !defined(NO_ECC256) - if (ret == 0) { - if (0 != XMEMCMP(out, expected_shared_secret, outlen)) { - ret = WOLFSSL_FATAL_ERROR; - } - } +#if !defined(NO_ECC256) + ExpectIntEQ(XMEMCMP(out, expected_shared_secret, outlen), 0); #endif - /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_shared_secret(NULL, &pubKey, out, &outlen); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_shared_secret(&key, NULL, out, &outlen); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_shared_secret(&key, &pubKey, NULL, &outlen); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_shared_secret(&key, &pubKey, out, NULL); - } - if (ret == BAD_FUNC_ARG) { - /* Invalid length */ - outlen = 1; - ret = wc_ecc_shared_secret(&key, &pubKey, out, &outlen); - } - - if (ret == BUFFER_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + /* Test bad args. */ + ExpectIntEQ(wc_ecc_shared_secret(NULL, &pubKey, out, &outlen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_shared_secret(&key, NULL, out, &outlen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_shared_secret(&key, &pubKey, NULL, &outlen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_shared_secret(&key, &pubKey, out, NULL), + BAD_FUNC_ARG); + /* Invalid length */ + outlen = 1; + ExpectIntEQ(wc_ecc_shared_secret(&key, &pubKey, out, &outlen), + BUFFER_E); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - wc_ecc_free(&key); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&pubKey); + wc_ecc_free(&key); #ifdef FP_ECC wc_ecc_fp_free(); #endif PRIVATE_KEY_LOCK(); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END tests_wc_ecc_shared_secret */ /* @@ -26431,59 +24914,39 @@ */ static int test_wc_ecc_export_x963(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) ecc_key key; WC_RNG rng; byte out[ECC_ASN963_MAX_BUF_SZ]; word32 outlen = sizeof(out); - int ret = 0; + int ret; PRIVATE_KEY_UNLOCK(); /* Initialize variables. */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(out, 0, outlen); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY20, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } - if (ret == 0) { - ret = wc_ecc_export_x963(&key, out, &outlen); - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY20, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); + + ExpectIntEQ(wc_ecc_export_x963(&key, out, &outlen), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_export_x963(NULL, out, &outlen); - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_export_x963(&key, NULL, &outlen); - } - if (ret == LENGTH_ONLY_E) { - ret = wc_ecc_export_x963(&key, out, NULL); - } - if (ret == ECC_BAD_ARG_E) { - key.idx = -4; - ret = wc_ecc_export_x963(&key, out, &outlen); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_export_x963(NULL, out, &outlen), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_export_x963(&key, NULL, &outlen), LENGTH_ONLY_E); + ExpectIntEQ(wc_ecc_export_x963(&key, out, NULL), ECC_BAD_ARG_E); + key.idx = -4; + ExpectIntEQ(wc_ecc_export_x963(&key, out, &outlen), ECC_BAD_ARG_E); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); #ifdef FP_ECC @@ -26491,10 +24954,8 @@ #endif PRIVATE_KEY_LOCK(); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_export_x963 */ /* @@ -26503,11 +24964,11 @@ */ static int test_wc_ecc_export_x963_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) ecc_key key; WC_RNG rng; - int ret = 0; + int ret; byte out[ECC_ASN963_MAX_BUF_SZ]; word32 outlen = sizeof(out); #ifdef HAVE_COMP_KEY @@ -26515,97 +24976,60 @@ #endif /* Init stack variables. */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(out, 0, outlen); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); + PRIVATE_KEY_UNLOCK(); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY64, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY64, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - #ifdef HAVE_COMP_KEY - if (ret == 0) { - ret = wc_ecc_export_x963_ex(&key, out, &outlen, COMP); - } - #else - if (ret == 0) { - ret = wc_ecc_export_x963_ex(&key, out, &outlen, NOCOMP); - } - #endif +#ifdef HAVE_COMP_KEY + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, &outlen, COMP), 0); +#else + ExpectIntEQ(ret = wc_ecc_export_x963_ex(&key, out, &outlen, NOCOMP), 0); +#endif /* Test bad args. */ - #ifdef HAVE_COMP_KEY - if (ret == 0) { - ret = wc_ecc_export_x963_ex(NULL, out, &outlen, COMP); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_export_x963_ex(&key, NULL, &outlen, COMP); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_export_x963_ex(&key, out, NULL, COMP); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_export_x963_ex(&key, out, &badOutLen, COMP); - } +#ifdef HAVE_COMP_KEY + ExpectIntEQ(wc_ecc_export_x963_ex(NULL, out, &outlen, COMP), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_export_x963_ex(&key, NULL, &outlen, COMP), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, NULL, COMP), BAD_FUNC_ARG); #if defined(HAVE_FIPS) && (!defined(FIPS_VERSION_LT) || FIPS_VERSION_LT(5,3)) - if (ret == BUFFER_E) + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, &badOutLen, COMP), BUFFER_E); #else - if (ret == LENGTH_ONLY_E) + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, &badOutLen, COMP), + LENGTH_ONLY_E); #endif - { - key.idx = -4; - ret = wc_ecc_export_x963_ex(&key, out, &outlen, COMP); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } - #else - if (ret == 0) { - ret = wc_ecc_export_x963_ex(NULL, out, &outlen, NOCOMP); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_export_x963_ex(&key, NULL, &outlen, NOCOMP); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_export_x963_ex(&key, out, &outlen, 1); - } - if (ret == NOT_COMPILED_IN) { - ret = wc_ecc_export_x963_ex(&key, out, NULL, NOCOMP); - } - if (ret == BAD_FUNC_ARG) { - key.idx = -4; - ret = wc_ecc_export_x963_ex(&key, out, &outlen, NOCOMP); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - #endif + key.idx = -4; + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, &outlen, COMP), ECC_BAD_ARG_E); +#else + ExpectIntEQ(wc_ecc_export_x963_ex(NULL, out, &outlen, NOCOMP), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_export_x963_ex(&key, NULL, &outlen, NOCOMP), + LENGTH_ONLY_E); + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, &outlen, 1), NOT_COMPILED_IN); + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, NULL, NOCOMP), + ECC_BAD_ARG_E); + key.idx = -4; + ExpectIntEQ(wc_ecc_export_x963_ex(&key, out, &outlen, NOCOMP), + ECC_BAD_ARG_E); +#endif + PRIVATE_KEY_LOCK(); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_export_x963_ex */ /* @@ -26613,85 +25037,68 @@ */ static int test_wc_ecc_import_x963(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_IMPORT) && \ defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) - ecc_key pubKey, key; + ecc_key pubKey; + ecc_key key; WC_RNG rng; byte x963[ECC_ASN963_MAX_BUF_SZ]; word32 x963Len = (word32)sizeof(x963); int ret; /* Init stack variables. */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&pubKey, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(x963, 0, x963Len); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); - XMEMSET(&pubKey, 0, sizeof(pubKey)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&pubKey); - if (ret == 0) { - ret = wc_ecc_init(&key); - } - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY24, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (ret == 0) { - PRIVATE_KEY_UNLOCK(); - ret = wc_ecc_export_x963(&key, x963, &x963Len); - PRIVATE_KEY_LOCK(); - } - } + ExpectIntEQ(wc_ecc_init(&pubKey), 0); + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); +#if FIPS_VERSION3_GE(6,0,0) + ret = wc_ecc_make_key(&rng, KEY32, &key); +#else + ret = wc_ecc_make_key(&rng, KEY24, &key); +#endif +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif - if (ret == 0) { - ret = wc_ecc_import_x963(x963, x963Len, &pubKey); - } + ExpectIntEQ(ret, 0); + + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ecc_export_x963(&key, x963, &x963Len), 0); + PRIVATE_KEY_LOCK(); + + ExpectIntEQ(wc_ecc_import_x963(x963, x963Len, &pubKey), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_import_x963(NULL, x963Len, &pubKey); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_x963(x963, x963Len, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_x963(x963, x963Len + 1, &pubKey); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_import_x963(NULL, x963Len, &pubKey), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_x963(x963, x963Len, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_x963(x963, x963Len + 1, &pubKey), ECC_BAD_ARG_E); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); wc_ecc_free(&pubKey); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END wc_ecc_import_x963 */ /* * testing wc_ecc_import_private_key() */ -static int ecc_import_private_key(void) +static int test_wc_ecc_import_private_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_IMPORT) && \ defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) - ecc_key key, keyImp; + ecc_key key; + ecc_key keyImp; WC_RNG rng; byte privKey[ECC_PRIV_KEY_BUF]; /* Raw private key.*/ byte x963Key[ECC_ASN963_MAX_BUF_SZ]; @@ -26700,68 +25107,46 @@ int ret; /* Init stack variables. */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&keyImp, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(privKey, 0, privKeySz); XMEMSET(x963Key, 0, x963KeySz); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); - XMEMSET(&keyImp, 0, sizeof(keyImp)); + PRIVATE_KEY_UNLOCK(); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_init(&keyImp); - } - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY48, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (ret == 0) { - PRIVATE_KEY_UNLOCK(); - ret = wc_ecc_export_x963(&key, x963Key, &x963KeySz); - PRIVATE_KEY_LOCK(); - } - if (ret == 0) { - ret = wc_ecc_export_private_only(&key, privKey, &privKeySz); - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_ecc_init(&keyImp), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY48, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - if (ret == 0) { - ret = wc_ecc_import_private_key(privKey, privKeySz, x963Key, - x963KeySz, &keyImp); - } + PRIVATE_KEY_UNLOCK(); + ExpectIntEQ(wc_ecc_export_x963(&key, x963Key, &x963KeySz), 0); + PRIVATE_KEY_LOCK(); + ExpectIntEQ(wc_ecc_export_private_only(&key, privKey, &privKeySz), 0); + + ExpectIntEQ(wc_ecc_import_private_key(privKey, privKeySz, x963Key, + x963KeySz, &keyImp), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_ecc_import_private_key(privKey, privKeySz, x963Key, - x963KeySz, NULL); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_private_key(NULL, privKeySz, x963Key, - x963KeySz, &keyImp); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_import_private_key(privKey, privKeySz, x963Key, + x963KeySz, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_private_key(NULL, privKeySz, x963Key, x963KeySz, + &keyImp), BAD_FUNC_ARG); + PRIVATE_KEY_LOCK(); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - wc_ecc_free(&key); + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&keyImp); + wc_ecc_free(&key); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -} /* END wc_ecc_import_private_key */ + return EXPECT_RESULT(); +} /* END test_wc_ecc_import_private_key */ /* @@ -26769,7 +25154,7 @@ */ static int test_wc_ecc_export_private_only(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) ecc_key key; WC_RNG rng; @@ -26778,52 +25163,34 @@ int ret; /* Init stack variables. */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(out, 0, outlen); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); + PRIVATE_KEY_UNLOCK(); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY32, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } - if (ret == 0) { - ret = wc_ecc_export_private_only(&key, out, &outlen); - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY32, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); + + ExpectIntEQ(wc_ecc_export_private_only(&key, out, &outlen), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_ecc_export_private_only(NULL, out, &outlen); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_export_private_only(&key, NULL, &outlen); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_export_private_only(&key, out, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_export_private_only(NULL, out, &outlen), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_export_private_only(&key, NULL, &outlen), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_export_private_only(&key, out, NULL), BAD_FUNC_ARG); + PRIVATE_KEY_LOCK(); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_export_private_only */ @@ -26832,183 +25199,136 @@ */ static int test_wc_ecc_rs_to_sig(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(NO_ASN) /* first [P-192,SHA-1] vector from FIPS 186-3 NIST vectors */ - const char* R = "6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e"; - const char* S = "02ba6465a234903744ab02bc8521405b73cf5fc00e1a9f41"; - const char* zeroStr = "0"; - byte sig[ECC_MAX_SIG_SIZE]; - word32 siglen = (word32)sizeof(sig); - /*R and S max size is the order of curve. 2^192.*/ - int keySz = KEY24; - byte r[KEY24]; - byte s[KEY24]; - word32 rlen = (word32)sizeof(r); - word32 slen = (word32)sizeof(s); - int ret; + const char* R = "6994d962bdd0d793ffddf855ec5bf2f91a9698b46258a63e"; + const char* S = "02ba6465a234903744ab02bc8521405b73cf5fc00e1a9f41"; + const char* zeroStr = "0"; + byte sig[ECC_MAX_SIG_SIZE]; + word32 siglen = (word32)sizeof(sig); + /* R and S max size is the order of curve. 2^192.*/ + int keySz = KEY24; + byte r[KEY24]; + byte s[KEY24]; + word32 rlen = (word32)sizeof(r); + word32 slen = (word32)sizeof(s); /* Init stack variables. */ XMEMSET(sig, 0, ECC_MAX_SIG_SIZE); XMEMSET(r, 0, keySz); XMEMSET(s, 0, keySz); - ret = wc_ecc_rs_to_sig(R, S, sig, &siglen); - if (ret == 0) { - ret = wc_ecc_sig_to_rs(sig, siglen, r, &rlen, s, &slen); - #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) - if (ret == ASN_PARSE_E) { - ret = 0; - } - #endif - } + ExpectIntEQ(wc_ecc_rs_to_sig(R, S, sig, &siglen), 0); + ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, r, &rlen, s, &slen), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_rs_to_sig(NULL, S, sig, &siglen); - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_rs_to_sig(R, NULL, sig, &siglen); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_rs_to_sig(R, S, sig, NULL); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_rs_to_sig(R, S, NULL, &siglen); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_rs_to_sig(R, zeroStr, sig, &siglen); - } - if (ret == MP_ZERO_E) { - ret = wc_ecc_rs_to_sig(zeroStr, S, sig, &siglen); - } - if (ret == MP_ZERO_E) { - ret = wc_ecc_sig_to_rs(NULL, siglen, r, &rlen, s, &slen); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_sig_to_rs(sig, siglen, NULL, &rlen, s, &slen); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_sig_to_rs(sig, siglen, r, NULL, s, &slen); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_sig_to_rs(sig, siglen, r, &rlen, NULL, &slen); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_sig_to_rs(sig, siglen, r, &rlen, s, NULL); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_ecc_rs_to_sig(NULL, S, sig, &siglen), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_rs_to_sig(R, NULL, sig, &siglen), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_rs_to_sig(R, S, sig, NULL), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_rs_to_sig(R, S, NULL, &siglen), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_rs_to_sig(R, zeroStr, sig, &siglen), MP_ZERO_E); + ExpectIntEQ(wc_ecc_rs_to_sig(zeroStr, S, sig, &siglen), MP_ZERO_E); + ExpectIntEQ(wc_ecc_sig_to_rs(NULL, siglen, r, &rlen, s, &slen), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, NULL, &rlen, s, &slen), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, r, NULL, s, &slen), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, r, &rlen, NULL, &slen), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sig_to_rs(sig, siglen, r, &rlen, s, NULL), + ECC_BAD_ARG_E); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_rs_to_sig */ static int test_wc_ecc_import_raw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(NO_ECC256) ecc_key key; - int ret = 0; const char* qx = - "bb33ac4c27504ac64aa504c33cde9f36db722dce94ea2bfacb2009392c16e861"; + "bb33ac4c27504ac64aa504c33cde9f36db722dce94ea2bfacb2009392c16e861"; const char* qy = - "02e9af4dd302939a315b9792217ff0cf18da9111023486e82058330b803489d8"; + "02e9af4dd302939a315b9792217ff0cf18da9111023486e82058330b803489d8"; const char* d = - "45b66902739c6c85a1385b72e8e8c7acc4038d533504fa6c28dc348de1a8098c"; + "45b66902739c6c85a1385b72e8e8c7acc4038d533504fa6c28dc348de1a8098c"; const char* curveName = "SECP256R1"; #ifdef WOLFSSL_VALIDATE_ECC_IMPORT const char* kNullStr = ""; + int ret; #endif - ret = wc_ecc_init(&key); + XMEMSET(&key, 0, sizeof(ecc_key)); + + ExpectIntEQ(wc_ecc_init(&key), 0); /* Test good import */ - if (ret == 0) { - ret = wc_ecc_import_raw(&key, qx, qy, d, curveName); - } + ExpectIntEQ(wc_ecc_import_raw(&key, qx, qy, d, curveName), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_import_raw(NULL, qx, qy, d, curveName); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_raw(&key, NULL, qy, d, curveName); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_raw(&key, qx, NULL, d, curveName); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_raw(&key, qx, qy, d, NULL); - } - #ifdef WOLFSSL_VALIDATE_ECC_IMPORT - if (ret == BAD_FUNC_ARG) { - #if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH) - wc_ecc_free(&key); - #endif - ret = wc_ecc_import_raw(&key, kNullStr, kNullStr, kNullStr, curveName); - if (ret == ECC_INF_E) - ret = BAD_FUNC_ARG; /* This is expected by other tests */ - } + ExpectIntEQ(wc_ecc_import_raw(NULL, qx, qy, d, curveName), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_raw(&key, NULL, qy, d, curveName), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_raw(&key, qx, NULL, d, curveName), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_raw(&key, qx, qy, d, NULL), BAD_FUNC_ARG); +#ifdef WOLFSSL_VALIDATE_ECC_IMPORT + #if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH) + wc_ecc_free(&key); #endif - #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) - if (ret == BAD_FUNC_ARG) { - #if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH) - wc_ecc_free(&key); - #endif - ret = wc_ecc_import_raw(&key, "0", qy, d, curveName); - /* Note: SP math "is point" failure returns MP_VAL */ - if (ret == ECC_INF_E || ret == MP_VAL) { - ret = BAD_FUNC_ARG; /* This is expected by other tests */ - } - } - if (ret == BAD_FUNC_ARG) { - #if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH) - wc_ecc_free(&key); - #endif - ret = wc_ecc_import_raw(&key, qx, "0", d, curveName); - /* Note: SP math "is point" failure returns MP_VAL */ - if (ret == ECC_INF_E || ret == MP_VAL) { - ret = BAD_FUNC_ARG; /* This is expected by other tests */ - } - } + ExpectIntLT(ret = wc_ecc_import_raw(&key, kNullStr, kNullStr, kNullStr, + curveName), 0); + ExpectTrue((ret == ECC_INF_E) || (ret == BAD_FUNC_ARG)); +#endif +#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) + #if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH) + wc_ecc_free(&key); #endif - - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } +#ifdef WOLFSSL_VALIDATE_ECC_IMPORT + ExpectIntLT(ret = wc_ecc_import_raw(&key, "0", qy, d, curveName), 0); + ExpectTrue((ret == BAD_FUNC_ARG) || (ret == MP_VAL)); +#else + ExpectIntEQ(wc_ecc_import_raw(&key, "0", qy, d, curveName), 0); +#endif + #if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH) + wc_ecc_free(&key); + #endif +#ifdef WOLFSSL_VALIDATE_ECC_IMPORT + ExpectIntLT(ret = wc_ecc_import_raw(&key, qx, "0", d, curveName), 0); + ExpectTrue((ret == BAD_FUNC_ARG) || (ret == MP_VAL)); +#else + ExpectIntEQ(wc_ecc_import_raw(&key, qx, "0", d, curveName), 0); +#endif + #if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH) + wc_ecc_free(&key); + #endif + ExpectIntEQ(wc_ecc_import_raw(&key, "0", "0", d, curveName), ECC_INF_E); +#endif wc_ecc_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_import_raw */ static int test_wc_ecc_import_unsigned(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(NO_ECC256) && !defined(HAVE_SELFTEST) && \ - (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION >= 2)) - ecc_key key; - const byte qx[] = { + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + HAVE_FIPS_VERSION >= 2)) + ecc_key key; + const byte qx[] = { 0xbb, 0x33, 0xac, 0x4c, 0x27, 0x50, 0x4a, 0xc6, 0x4a, 0xa5, 0x04, 0xc3, 0x3c, 0xde, 0x9f, 0x36, 0xdb, 0x72, 0x2d, 0xce, 0x94, 0xea, 0x2b, 0xfa, 0xcb, 0x20, 0x09, 0x39, 0x2c, 0x16, 0xe8, 0x61 }; - const byte qy[] = { + const byte qy[] = { 0x02, 0xe9, 0xaf, 0x4d, 0xd3, 0x02, 0x93, 0x9a, 0x31, 0x5b, 0x97, 0x92, 0x21, 0x7f, 0xf0, 0xcf, 0x18, 0xda, 0x91, 0x11, 0x02, 0x34, 0x86, 0xe8, 0x20, 0x58, 0x33, 0x0b, 0x80, 0x34, 0x89, 0xd8 }; - const byte d[] = { + const byte d[] = { 0x45, 0xb6, 0x69, 0x02, 0x73, 0x9c, 0x6c, 0x85, 0xa1, 0x38, 0x5b, 0x72, 0xe8, 0xe8, 0xc7, 0xac, 0xc4, 0x03, 0x8d, 0x53, 0x35, 0x04, 0xfa, 0x6c, @@ -27016,48 +25336,34 @@ }; #ifdef WOLFSSL_VALIDATE_ECC_IMPORT const byte nullBytes[32] = {0}; -#endif - int curveId = ECC_SECP256R1; int ret; +#endif + int curveId = ECC_SECP256R1; - ret = wc_ecc_init(&key); + XMEMSET(&key, 0, sizeof(ecc_key)); - if (ret == 0) { - ret = wc_ecc_import_unsigned(&key, (byte*)qx, (byte*)qy, (byte*)d, - curveId); - } + ExpectIntEQ(wc_ecc_init(&key), 0); + + ExpectIntEQ(wc_ecc_import_unsigned(&key, (byte*)qx, (byte*)qy, (byte*)d, + curveId), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_import_unsigned(NULL, (byte*)qx, (byte*)qy, (byte*)d, - curveId); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_unsigned(&key, NULL, (byte*)qy, (byte*)d, - curveId); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_unsigned(&key, (byte*)qx, NULL, (byte*)d, - curveId); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_unsigned(&key, (byte*)qx, (byte*)qy, (byte*)d, - ECC_CURVE_INVALID); - } - #ifdef WOLFSSL_VALIDATE_ECC_IMPORT - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_import_unsigned(&key, (byte*)nullBytes, - (byte*)nullBytes, (byte*)nullBytes, curveId); - } - #endif - if (ret == BAD_FUNC_ARG || ret == ECC_INF_E) { - ret = 0; - } - } + ExpectIntEQ(wc_ecc_import_unsigned(NULL, (byte*)qx, (byte*)qy, (byte*)d, + curveId), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_unsigned(&key, NULL, (byte*)qy, (byte*)d, + curveId), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_unsigned(&key, (byte*)qx, NULL, (byte*)d, + curveId), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_import_unsigned(&key, (byte*)qx, (byte*)qy, (byte*)d, + ECC_CURVE_INVALID), BAD_FUNC_ARG); +#ifdef WOLFSSL_VALIDATE_ECC_IMPORT + ExpectIntLT(ret = wc_ecc_import_unsigned(&key, (byte*)nullBytes, + (byte*)nullBytes, (byte*)nullBytes, curveId), 0); + ExpectTrue((ret == ECC_INF_E) || (ret == BAD_FUNC_ARG)); +#endif wc_ecc_free(&key); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_import_unsigned */ @@ -27066,41 +25372,31 @@ */ static int test_wc_ecc_sig_size(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) - ecc_key key; - WC_RNG rng; - int keySz = KEY16; - int ret = 0; + ecc_key key; + WC_RNG rng; + int keySz = KEY16; + int ret; XMEMSET(&rng, 0, sizeof(rng)); XMEMSET(&key, 0, sizeof(key)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } - if (ret == 0) { - ret = wc_ecc_sig_size(&key); - if (ret <= (2 * keySz + SIG_HEADER_SZ + ECC_MAX_PAD_SZ)) { - ret = 0; - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, keySz, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - wc_ecc_free(&key); + ExpectIntLE(wc_ecc_sig_size(&key), + (2 * keySz + SIG_HEADER_SZ + ECC_MAX_PAD_SZ)); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_ecc_free(&key); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_sig_size */ /* @@ -27108,47 +25404,30 @@ */ static int test_wc_ecc_ctx_new(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_ENCRYPT) && !defined(WC_NO_RNG) - WC_RNG rng; - int ret = 0; - ecEncCtx* cli = NULL; - ecEncCtx* srv = NULL; - - ret = wc_InitRng(&rng); - - if (ret == 0) { - cli = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng); - srv = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng); - } - if (ret == 0 && (cli == NULL || srv == NULL)) { - ret = WOLFSSL_FATAL_ERROR; - } - + WC_RNG rng; + ecEncCtx* cli = NULL; + ecEncCtx* srv = NULL; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectNotNull(cli = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng)); + ExpectNotNull(srv = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng)); wc_ecc_ctx_free(cli); + cli = NULL; wc_ecc_ctx_free(srv); /* Test bad args. */ - if (ret == 0) { - /* wc_ecc_ctx_new_ex() will free if returned NULL. */ - cli = wc_ecc_ctx_new(0, &rng); - if (cli != NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - cli = wc_ecc_ctx_new(REQ_RESP_CLIENT, NULL); - if (cli != NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - } + /* wc_ecc_ctx_new_ex() will free if returned NULL. */ + ExpectNull(cli = wc_ecc_ctx_new(0, &rng)); + ExpectNull(cli = wc_ecc_ctx_new(REQ_RESP_CLIENT, NULL)); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_ctx_free(cli); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_ctx_new */ /* @@ -27156,45 +25435,26 @@ */ static int test_wc_ecc_ctx_reset(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_ENCRYPT) && !defined(WC_NO_RNG) - ecEncCtx* ctx = NULL; - WC_RNG rng; - int ret = 0; + ecEncCtx* ctx = NULL; + WC_RNG rng; - ret = wc_InitRng(&rng); - if (ret == 0) { - if ( (ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng)) == NULL ) { - ret = WOLFSSL_FATAL_ERROR; - } - } + XMEMSET(&rng, 0, sizeof(rng)); - if (ret == 0) { - ret = wc_ecc_ctx_reset(ctx, &rng); - } + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectNotNull(ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng)); + + ExpectIntEQ(wc_ecc_ctx_reset(ctx, &rng), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_ecc_ctx_reset(NULL, &rng); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_ctx_reset(ctx, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_ctx_reset(NULL, &rng), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_ctx_reset(ctx, NULL), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } wc_ecc_ctx_free(ctx); - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_ctx_reset */ /* @@ -27202,65 +25462,36 @@ */ static int test_wc_ecc_ctx_set_peer_salt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_ENCRYPT) && !defined(WC_NO_RNG) - WC_RNG rng; - ecEncCtx* cliCtx = NULL; - ecEncCtx* servCtx = NULL; - const byte* cliSalt = NULL; - const byte* servSalt = NULL; - int ret = 0; + WC_RNG rng; + ecEncCtx* cliCtx = NULL; + ecEncCtx* servCtx = NULL; + const byte* cliSalt = NULL; + const byte* servSalt = NULL; - ret = wc_InitRng(&rng); - if (ret == 0) { - if ( ( (cliCtx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng)) == NULL ) || - ( (servCtx = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng)) == NULL) ) { - ret = WOLFSSL_FATAL_ERROR; - } - } + XMEMSET(&rng, 0, sizeof(rng)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectNotNull(cliCtx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng)); + ExpectNotNull(servCtx = wc_ecc_ctx_new(REQ_RESP_SERVER, &rng)); /* Test bad args. */ - if (ret == 0) { - cliSalt = wc_ecc_ctx_get_own_salt(NULL); - if (cliSalt != NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectNull(cliSalt = wc_ecc_ctx_get_own_salt(NULL)); - if (ret == 0) { - cliSalt = wc_ecc_ctx_get_own_salt(cliCtx); - servSalt = wc_ecc_ctx_get_own_salt(servCtx); - if (cliSalt == NULL || servSalt == NULL) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectNotNull(cliSalt = wc_ecc_ctx_get_own_salt(cliCtx)); + ExpectNotNull(servSalt = wc_ecc_ctx_get_own_salt(servCtx)); - if (ret == 0) { - ret = wc_ecc_ctx_set_peer_salt(cliCtx, servSalt); - } + ExpectIntEQ(wc_ecc_ctx_set_peer_salt(cliCtx, servSalt), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_ctx_set_peer_salt(NULL, servSalt); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_ctx_set_peer_salt(cliCtx, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_ctx_set_peer_salt(NULL, servSalt), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_ctx_set_peer_salt(cliCtx, NULL), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } wc_ecc_ctx_free(cliCtx); wc_ecc_ctx_free(servCtx); - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_ctx_set_peer_salt */ @@ -27269,48 +25500,31 @@ */ static int test_wc_ecc_ctx_set_info(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_ENCRYPT) && !defined(WC_NO_RNG) ecEncCtx* ctx = NULL; WC_RNG rng; - int ret; const char* optInfo = "Optional Test Info."; int optInfoSz = (int)XSTRLEN(optInfo); const char* badOptInfo = NULL; - ret = wc_InitRng(&rng); - if ( (ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng)) == NULL || ret != 0 ) { - ret = WOLFSSL_FATAL_ERROR; - } + XMEMSET(&rng, 0, sizeof(rng)); - if (ret == 0) { - ret = wc_ecc_ctx_set_info(ctx, (byte*)optInfo, optInfoSz); - } + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectNotNull(ctx = wc_ecc_ctx_new(REQ_RESP_CLIENT, &rng)); + + ExpectIntEQ(wc_ecc_ctx_set_info(ctx, (byte*)optInfo, optInfoSz), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_ctx_set_info(NULL, (byte*)optInfo, optInfoSz); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_ctx_set_info(ctx, (byte*)badOptInfo, optInfoSz); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_ctx_set_info(ctx, (byte*)optInfo, -1); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_ctx_set_info(NULL, (byte*)optInfo, optInfoSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_ctx_set_info(ctx, (byte*)badOptInfo, optInfoSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_ctx_set_info(ctx, (byte*)optInfo, -1), BAD_FUNC_ARG); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } wc_ecc_ctx_free(ctx); - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_ctx_set_info */ /* @@ -27318,10 +25532,12 @@ */ static int test_wc_ecc_encryptDecrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_ENCRYPT) && !defined(WC_NO_RNG) && \ defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) - ecc_key srvKey, cliKey, tmpKey; + ecc_key srvKey; + ecc_key cliKey; + ecc_key tmpKey; WC_RNG rng; int ret; const char* msg = "EccBlock Size 16"; @@ -27332,7 +25548,8 @@ byte out[KEY20 * 2 + 1 + AES_BLOCK_SIZE + (sizeof("EccBlock Size 16") - 1) + WC_SHA256_DIGEST_SIZE]; #else - byte out[KEY20 * 2 + 1 + (sizeof("EccBlock Size 16") - 1) + WC_SHA256_DIGEST_SIZE]; + byte out[KEY20 * 2 + 1 + (sizeof("EccBlock Size 16") - 1) + + WC_SHA256_DIGEST_SIZE]; #endif word32 outSz = (word32)sizeof(out); byte plain[sizeof("EccBlock Size 16")]; @@ -27343,130 +25560,78 @@ XMEMSET(out, 0, outSz); XMEMSET(plain, 0, plainSz); XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&srvKey, 0, sizeof(srvKey)); - XMEMSET(&cliKey, 0, sizeof(cliKey)); + XMEMSET(&srvKey, 0, sizeof(ecc_key)); + XMEMSET(&cliKey, 0, sizeof(ecc_key)); + XMEMSET(&tmpKey, 0, sizeof(ecc_key)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ecc_init(&cliKey), 0); + ret = wc_ecc_make_key(&rng, keySz, &cliKey); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &cliKey.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&cliKey); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &cliKey); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &cliKey.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (ret == 0) { - ret = wc_ecc_init(&srvKey); - } - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &srvKey); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &srvKey.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (ret == 0) { - ret = wc_ecc_init(&tmpKey); - } - } + ExpectIntEQ(wc_ecc_init(&srvKey), 0); + ret = wc_ecc_make_key(&rng, keySz, &srvKey); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &srvKey.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); + + ExpectIntEQ(wc_ecc_init(&tmpKey), 0); #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \ !defined(HAVE_SELFTEST) - if (ret == 0) { - ret = wc_ecc_set_rng(&srvKey, &rng); - } - if (ret == 0) { - ret = wc_ecc_set_rng(&cliKey, &rng); - } + ExpectIntEQ(wc_ecc_set_rng(&srvKey, &rng), 0); + ExpectIntEQ(wc_ecc_set_rng(&cliKey, &rng), 0); #endif - if (ret == 0) { - ret = wc_ecc_encrypt(&cliKey, &srvKey, (byte*)msg, msgSz, out, - &outSz, NULL); - } - if (ret == 0) { - ret = wc_ecc_encrypt(NULL, &srvKey, (byte*)msg, msgSz, out, - &outSz, NULL); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_encrypt(&cliKey, NULL, (byte*)msg, msgSz, out, - &outSz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_encrypt(&cliKey, &srvKey, NULL, msgSz, out, - &outSz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_encrypt(&cliKey, &srvKey, (byte*)msg, msgSz, NULL, - &outSz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_encrypt(&cliKey, &srvKey, (byte*)msg, msgSz, out, - NULL, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_encrypt(&cliKey, &srvKey, (byte*)msg, msgSz, out, + &outSz, NULL), 0); + /* Test bad args. */ + ExpectIntEQ(wc_ecc_encrypt(NULL, &srvKey, (byte*)msg, msgSz, out, &outSz, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_encrypt(&cliKey, NULL, (byte*)msg, msgSz, out, &outSz, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_encrypt(&cliKey, &srvKey, NULL, msgSz, out, &outSz, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_encrypt(&cliKey, &srvKey, (byte*)msg, msgSz, NULL, + &outSz, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_encrypt(&cliKey, &srvKey, (byte*)msg, msgSz, out, NULL, + NULL), BAD_FUNC_ARG); #ifdef WOLFSSL_ECIES_OLD - if (ret == 0) { - tmpKey.dp = cliKey.dp; - ret = wc_ecc_copy_point(&cliKey.pubkey, &tmpKey.pubkey); - } + tmpKey.dp = cliKey.dp; + ExpectIntEQ(wc_ecc_copy_point(&cliKey.pubkey, &tmpKey.pubkey), 0); #endif - if (ret == 0) { - ret = wc_ecc_decrypt(&srvKey, &tmpKey, out, outSz, plain, - &plainSz, NULL); - } - if (ret == 0) { - ret = wc_ecc_decrypt(NULL, &tmpKey, out, outSz, plain, - &plainSz, NULL); - #ifdef WOLFSSL_ECIES_OLD - /* NULL parameter allowed in new implementations - public key comes from - * the message. */ - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_decrypt(&srvKey, NULL, out, outSz, plain, - &plainSz, NULL); - } - #endif - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_decrypt(&srvKey, &tmpKey, NULL, outSz, plain, - &plainSz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_decrypt(&srvKey, &tmpKey, out, outSz, NULL, - &plainSz, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_decrypt(&srvKey, &tmpKey, out, outSz, - plain, NULL, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_decrypt(&srvKey, &tmpKey, out, outSz, plain, &plainSz, + NULL), 0); + ExpectIntEQ(wc_ecc_decrypt(NULL, &tmpKey, out, outSz, plain, &plainSz, + NULL), BAD_FUNC_ARG); +#ifdef WOLFSSL_ECIES_OLD + /* NULL parameter allowed in new implementations - public key comes from + * the message. */ + ExpectIntEQ(wc_ecc_decrypt(&srvKey, NULL, out, outSz, plain, &plainSz, + NULL), BAD_FUNC_ARG); +#endif + ExpectIntEQ(wc_ecc_decrypt(&srvKey, &tmpKey, NULL, outSz, plain, &plainSz, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_decrypt(&srvKey, &tmpKey, out, outSz, NULL, &plainSz, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_decrypt(&srvKey, &tmpKey, out, outSz, plain, NULL, NULL), + BAD_FUNC_ARG); - if (XMEMCMP(msg, plain, msgSz) != 0) { - ret = WOLFSSL_FATAL_ERROR; - } + ExpectIntEQ(XMEMCMP(msg, plain, msgSz), 0); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } wc_ecc_free(&tmpKey); - wc_ecc_free(&cliKey); wc_ecc_free(&srvKey); - - res = TEST_RES_CHECK(ret == 0); + wc_ecc_free(&cliKey); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_encryptDecrypt */ /* @@ -27474,17 +25639,14 @@ */ static int test_wc_ecc_del_point(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) - ecc_point* pt; + ecc_point* pt = NULL; - pt = wc_ecc_new_point(); + ExpectNotNull(pt = wc_ecc_new_point()); wc_ecc_del_point(pt); - - res = TEST_RES_CHECK(pt != NULL); #endif - return res; - + return EXPECT_RESULT(); } /* END test_wc_ecc_del_point */ /* @@ -27494,179 +25656,88 @@ */ static int test_wc_ecc_pointFns(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && \ !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) && \ !defined(WOLFSSL_ATECC608A) - ecc_key key; - WC_RNG rng; - int ret; - ecc_point* point = NULL; - ecc_point* cpypt = NULL; - int idx = 0; - int keySz = KEY32; - byte der[DER_SZ(KEY32)]; - word32 derlenChk = 0; - word32 derSz = DER_SZ(KEY32); + ecc_key key; + WC_RNG rng; + int ret; + ecc_point* point = NULL; + ecc_point* cpypt = NULL; + int idx = 0; + int keySz = KEY32; + byte der[DER_SZ(KEY32)]; + word32 derlenChk = 0; + word32 derSz = DER_SZ(KEY32); /* Init stack variables. */ XMEMSET(der, 0, derSz); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); - - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - point = wc_ecc_new_point(); - if (!point) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ecc_init(&key), 0); + ret = wc_ecc_make_key(&rng, keySz, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - if (ret == 0) { - cpypt = wc_ecc_new_point(); - if (!cpypt) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectNotNull(point = wc_ecc_new_point()); + ExpectNotNull(cpypt = wc_ecc_new_point()); /* Export */ - if (ret == 0) { - ret = wc_ecc_export_point_der((idx = key.idx), &key.pubkey, - NULL, &derlenChk); - /* Check length value. */ - if (derSz == derlenChk && ret == LENGTH_ONLY_E) { - ret = wc_ecc_export_point_der((idx = key.idx), &key.pubkey, - der, &derSz); - } - } + ExpectIntEQ(wc_ecc_export_point_der((idx = key.idx), &key.pubkey, NULL, + &derlenChk), LENGTH_ONLY_E); + /* Check length value. */ + ExpectIntEQ(derSz, derlenChk); + ExpectIntEQ(wc_ecc_export_point_der((idx = key.idx), &key.pubkey, der, + &derSz), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_export_point_der(-2, &key.pubkey, der, &derSz); - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_export_point_der((idx = key.idx), NULL, der, &derSz); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_export_point_der((idx = key.idx), &key.pubkey, - der, NULL); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_export_point_der(-2, &key.pubkey, der, &derSz), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_export_point_der((idx = key.idx), NULL, der, &derSz), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_export_point_der((idx = key.idx), &key.pubkey, der, + NULL), ECC_BAD_ARG_E); /* Import */ - if (ret == 0) { - ret = wc_ecc_import_point_der(der, derSz, idx, point); - /* Condition double checks wc_ecc_cmp_point(). */ - if (ret == 0 && - XMEMCMP((void *)&key.pubkey, (void *)point, sizeof(key.pubkey))) { - ret = wc_ecc_cmp_point(&key.pubkey, point); - } - } + ExpectIntEQ(wc_ecc_import_point_der(der, derSz, idx, point), 0); + ExpectIntEQ(wc_ecc_cmp_point(&key.pubkey, point), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_import_point_der(NULL, derSz, idx, point); - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_import_point_der(der, derSz, idx, NULL); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_import_point_der(der, derSz, -1, point); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_import_point_der(der, derSz + 1, idx, point); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ( wc_ecc_import_point_der(NULL, derSz, idx, point), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_import_point_der(der, derSz, idx, NULL), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_import_point_der(der, derSz, -1, point), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_import_point_der(der, derSz + 1, idx, point), + ECC_BAD_ARG_E); /* Copy */ - if (ret == 0) { - ret = wc_ecc_copy_point(point, cpypt); - } + ExpectIntEQ(wc_ecc_copy_point(point, cpypt), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_copy_point(NULL, cpypt); - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_copy_point(point, NULL); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_copy_point(NULL, cpypt), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_copy_point(point, NULL), ECC_BAD_ARG_E); /* Compare point */ - if (ret == 0) { - ret = wc_ecc_cmp_point(point, cpypt); - } + ExpectIntEQ(wc_ecc_cmp_point(point, cpypt), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_cmp_point(NULL, cpypt); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_cmp_point(point, NULL); - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_cmp_point(NULL, cpypt), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_cmp_point(point, NULL), BAD_FUNC_ARG); /* At infinity if return == 1, otherwise return == 0. */ - if (ret == 0) { - ret = wc_ecc_point_is_at_infinity(point); - } + ExpectIntEQ(wc_ecc_point_is_at_infinity(point), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_point_is_at_infinity(NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_point_is_at_infinity(NULL), BAD_FUNC_ARG); #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))) #ifdef USE_ECC_B_PARAM /* On curve if ret == 0 */ - if (ret == 0) { - ret = wc_ecc_point_is_on_curve(point, idx); - } + ExpectIntEQ(wc_ecc_point_is_on_curve(point, idx), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_point_is_on_curve(NULL, idx); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_point_is_on_curve(point, 1000); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_point_is_on_curve(NULL, idx), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_point_is_on_curve(point, 1000), ECC_BAD_ARG_E); #endif /* USE_ECC_B_PARAM */ #endif /* !HAVE_SELFTEST && (!HAVE_FIPS || HAVE_FIPS_VERSION > 2) */ @@ -27674,116 +25745,91 @@ wc_ecc_del_point(point); wc_ecc_del_point(cpypt); wc_ecc_free(&key); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_pointFns */ /* - * Testing wc_ecc_sahred_secret_ssh() + * Testing wc_ecc_shared_secret_ssh() */ static int test_wc_ecc_shared_secret_ssh(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_DHE) && \ !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) && \ - !defined(WOLFSSL_ATECC608A) - ecc_key key, key2; - WC_RNG rng; - int ret; - int keySz = KEY32; - int key2Sz = KEY24; - byte secret[KEY32]; - word32 secretLen = keySz; + !defined(WOLFSSL_ATECC608A) && !defined(PLUTON_CRYPTO_ECC) && \ + !defined(WOLFSSL_CRYPTOCELL) + ecc_key key; + ecc_key key2; + WC_RNG rng; + int ret; + int keySz = KEY32; +#if FIPS_VERSION3_GE(6,0,0) + int key2Sz = KEY28; +#else + int key2Sz = KEY24; +#endif + byte secret[KEY32]; + word32 secretLen = (word32)keySz; /* Init stack variables. */ + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&key2, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); XMEMSET(secret, 0, secretLen); - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); - XMEMSET(&key2, 0, sizeof(key2)); + PRIVATE_KEY_UNLOCK(); + /* Make keys */ - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key2); - } - if (ret == 0) { - ret = wc_ecc_make_key(&rng, key2Sz, &key2); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key2.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, keySz, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + + ExpectIntEQ(wc_ecc_init(&key2), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, key2Sz, &key2); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key2.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \ !defined(HAVE_SELFTEST) - if (ret == 0) { - ret = wc_ecc_set_rng(&key, &rng); - } + ExpectIntEQ(wc_ecc_set_rng(&key, &rng), 0); #endif - if (ret == 0) { - ret = wc_ecc_shared_secret_ssh(&key, &key2.pubkey, secret, &secretLen); - } + ExpectIntEQ(wc_ecc_shared_secret_ssh(&key, &key2.pubkey, secret, + &secretLen), 0); /* Pass in bad args. */ - if (ret == 0) { - ret = wc_ecc_shared_secret_ssh(NULL, &key2.pubkey, secret, &secretLen); - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_shared_secret_ssh(&key, NULL, secret, &secretLen); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_shared_secret_ssh(&key, &key2.pubkey, NULL, &secretLen); - } - if (ret == BAD_FUNC_ARG) { - ret = wc_ecc_shared_secret_ssh(&key, &key2.pubkey, secret, NULL); - } - if (ret == BAD_FUNC_ARG) { - key.type = ECC_PUBLICKEY; - ret = wc_ecc_shared_secret_ssh(&key, &key2.pubkey, secret, &secretLen); - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_shared_secret_ssh(NULL, &key2.pubkey, secret, + &secretLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_shared_secret_ssh(&key, NULL, secret, &secretLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_shared_secret_ssh(&key, &key2.pubkey, NULL, &secretLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_shared_secret_ssh(&key, &key2.pubkey, secret, NULL), + BAD_FUNC_ARG); + key.type = ECC_PUBLICKEY; + ExpectIntEQ(wc_ecc_shared_secret_ssh(&key, &key2.pubkey, secret, + &secretLen), ECC_BAD_ARG_E); + PRIVATE_KEY_LOCK(); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); wc_ecc_free(&key2); #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_shared_secret_ssh */ /* @@ -27791,142 +25837,93 @@ */ static int test_wc_ecc_verify_hash_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_SIGN) && defined(WOLFSSL_PUBLIC_MP) \ && !defined(WC_NO_RNG) && !defined(WOLFSSL_ATECC508A) && \ !defined(WOLFSSL_ATECC608A) && !defined(WOLFSSL_KCAPI_ECC) - ecc_key key; - WC_RNG rng; - int ret; - mp_int r; - mp_int s; - mp_int z; - unsigned char hash[] = "Everyone gets Friday off.EccSig"; - unsigned char iHash[] = "Everyone gets Friday off......."; - unsigned char shortHash[] = TEST_STRING; - word32 hashlen = sizeof(hash); - word32 iHashLen = sizeof(iHash); - word32 shortHashLen = sizeof(shortHash); - int keySz = KEY32; - int sig = WOLFSSL_FATAL_ERROR; - int ver = WOLFSSL_FATAL_ERROR; - int verify_ok = 0; - - /* Initialize r and s. */ - ret = mp_init_multi(&r, &s, &z, NULL, NULL, NULL); - if (ret != MP_OKAY) { - return MP_INIT_E; - } + ecc_key key; + WC_RNG rng; + int ret; + mp_int r; + mp_int s; + mp_int z; + unsigned char hash[] = "Everyone gets Friday off.EccSig"; + unsigned char iHash[] = "Everyone gets Friday off......."; + unsigned char shortHash[] = TEST_STRING; + word32 hashlen = sizeof(hash); + word32 iHashLen = sizeof(iHash); + word32 shortHashLen = sizeof(shortHash); + int keySz = KEY32; + int verify_ok = 0; + + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(&r, 0, sizeof(mp_int)); + XMEMSET(&s, 0, sizeof(mp_int)); + XMEMSET(&z, 0, sizeof(mp_int)); + + /* Initialize r, s and z. */ + ExpectIntEQ(mp_init_multi(&r, &s, &z, NULL, NULL, NULL), MP_OKAY); + + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, keySz, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, keySz, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } - if (ret == 0) { - ret = wc_ecc_sign_hash_ex(hash, hashlen, &rng, &key, &r, &s); - if (ret == 0) { - /* verify_ok should be 1. */ - ret = wc_ecc_verify_hash_ex(&r, &s, hash, hashlen, &verify_ok, &key); - if (verify_ok != 1 && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - /* verify_ok should be 0 */ - ret = wc_ecc_verify_hash_ex(&r, &s, iHash, iHashLen, - &verify_ok, &key); - if (verify_ok != 0 && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - if (ret == 0) { - /* verify_ok should be 0. */ - ret = wc_ecc_verify_hash_ex(&r, &s, shortHash, shortHashLen, - &verify_ok, &key); - if (verify_ok != 0 && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } - } + ExpectIntEQ(wc_ecc_sign_hash_ex(hash, hashlen, &rng, &key, &r, &s), 0); + /* verify_ok should be 1. */ + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, &s, hash, hashlen, &verify_ok, &key), + 0); + ExpectIntEQ(verify_ok, 1); + + /* verify_ok should be 0 */ + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, &s, iHash, iHashLen, &verify_ok, + &key), 0); + ExpectIntEQ(verify_ok, 0); + + /* verify_ok should be 0. */ + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, &s, shortHash, shortHashLen, + &verify_ok, &key), 0); + ExpectIntEQ(verify_ok, 0); /* Test bad args. */ - if (ret == 0) { - if (wc_ecc_sign_hash_ex(NULL, hashlen, &rng, &key, &r, &s) - == ECC_BAD_ARG_E) { - sig = 0; - } - if (sig == 0 && wc_ecc_sign_hash_ex(hash, hashlen, NULL, &key, &r, &s) - != ECC_BAD_ARG_E) { - sig = WOLFSSL_FATAL_ERROR; - } - if (sig == 0 && wc_ecc_sign_hash_ex(hash, hashlen, &rng, NULL, &r, &s) - != ECC_BAD_ARG_E) { - sig = WOLFSSL_FATAL_ERROR; - } - if (sig == 0 && wc_ecc_sign_hash_ex(hash, hashlen, &rng, &key, NULL, &s) - != ECC_BAD_ARG_E) { - sig = WOLFSSL_FATAL_ERROR; - } - if (sig == 0 && wc_ecc_sign_hash_ex(hash, hashlen, &rng, &key, &r, NULL) - != ECC_BAD_ARG_E) { - sig = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_sign_hash_ex(NULL, hashlen, &rng, &key, &r, &s), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash_ex(hash, hashlen, NULL, &key, &r, &s), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash_ex(hash, hashlen, &rng, NULL, &r, &s), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash_ex(hash, hashlen, &rng, &key, NULL, &s), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_sign_hash_ex(hash, hashlen, &rng, &key, &r, NULL), + ECC_BAD_ARG_E); /* Test bad args. */ - if (ret == 0) { - if (wc_ecc_verify_hash_ex(NULL, &s, shortHash, shortHashLen, &verify_ok, &key) - == ECC_BAD_ARG_E) { - ver = 0; - } - if (ver == 0 && wc_ecc_verify_hash_ex(&r, NULL, shortHash, shortHashLen, - &verify_ok, &key) != ECC_BAD_ARG_E) { - ver = WOLFSSL_FATAL_ERROR; - } - if (wc_ecc_verify_hash_ex(&z, &s, shortHash, shortHashLen, &verify_ok, &key) - != MP_ZERO_E) { - ver = WOLFSSL_FATAL_ERROR; - } - if (wc_ecc_verify_hash_ex(&r, &z, shortHash, shortHashLen, &verify_ok, &key) - != MP_ZERO_E) { - ver = WOLFSSL_FATAL_ERROR; - } - if (wc_ecc_verify_hash_ex(&z, &z, shortHash, shortHashLen, &verify_ok, &key) - != MP_ZERO_E) { - ver = WOLFSSL_FATAL_ERROR; - } - if (ver == 0 && wc_ecc_verify_hash_ex(&r, &s, NULL, shortHashLen, &verify_ok, - &key) != ECC_BAD_ARG_E) { - ver = WOLFSSL_FATAL_ERROR; - } - if (ver == 0 && wc_ecc_verify_hash_ex(&r, &s, shortHash, shortHashLen, - NULL, &key) != ECC_BAD_ARG_E) { - ver = WOLFSSL_FATAL_ERROR; - } - if (ver == 0 && wc_ecc_verify_hash_ex(&r, &s, shortHash, shortHashLen, - &verify_ok, NULL) != ECC_BAD_ARG_E) { - ver = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_verify_hash_ex(NULL, &s, shortHash, shortHashLen, + &verify_ok, &key), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, NULL, shortHash, shortHashLen, + &verify_ok, &key), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_verify_hash_ex(&z, &s, shortHash, shortHashLen, + &verify_ok, &key), MP_ZERO_E); + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, &z, shortHash, shortHashLen, + &verify_ok, &key), MP_ZERO_E); + ExpectIntEQ(wc_ecc_verify_hash_ex(&z, &z, shortHash, shortHashLen, + &verify_ok, &key), MP_ZERO_E); + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, &s, NULL, shortHashLen, &verify_ok, + &key), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, &s, shortHash, shortHashLen, NULL, + &key), ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_verify_hash_ex(&r, &s, shortHash, shortHashLen, + &verify_ok, NULL), ECC_BAD_ARG_E); wc_ecc_free(&key); mp_free(&r); mp_free(&s); - if (wc_FreeRng(&rng)) { - return WOLFSSL_FATAL_ERROR; - } - if (ret == 0 && (sig != 0 || ver != 0)) { - ret = WOLFSSL_FATAL_ERROR; - } - - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_verify_hash_ex */ /* @@ -27935,73 +25932,53 @@ static int test_wc_ecc_mulmod(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) && \ !(defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ defined(WOLFSSL_VALIDATE_ECC_IMPORT)) - ecc_key key1, key2, key3; + ecc_key key1; + ecc_key key2; + ecc_key key3; WC_RNG rng; - int ret = 0; + int ret; - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key1); - if (ret == 0) { - ret = wc_ecc_init(&key2); - } - if (ret == 0) { - ret = wc_ecc_init(&key3); - } - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY32, &key1); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key1.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - wc_FreeRng(&rng); - } - if (ret == 0) { - ret = wc_ecc_import_raw_ex(&key2, key1.dp->Gx, key1.dp->Gy, key1.dp->Af, - ECC_SECP256R1); - if (ret == 0) { - ret = wc_ecc_import_raw_ex(&key3, key1.dp->Gx, key1.dp->Gy, - key1.dp->prime, ECC_SECP256R1); - } - } + XMEMSET(&key1, 0, sizeof(ecc_key)); + XMEMSET(&key2, 0, sizeof(ecc_key)); + XMEMSET(&key3, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ecc_init(&key1), 0); + ExpectIntEQ(wc_ecc_init(&key2), 0); + ExpectIntEQ(wc_ecc_init(&key3), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, KEY32, &key1); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key1.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); - if (ret == 0) { - ret = wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), &key2.pubkey, - &key3.pubkey, wc_ecc_key_get_priv(&key2), - wc_ecc_key_get_priv(&key3), 1); - } + ExpectIntEQ(wc_ecc_import_raw_ex(&key2, key1.dp->Gx, key1.dp->Gy, + key1.dp->Af, ECC_SECP256R1), 0); + ExpectIntEQ(wc_ecc_import_raw_ex(&key3, key1.dp->Gx, key1.dp->Gy, + key1.dp->prime, ECC_SECP256R1), 0); + + ExpectIntEQ(wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), &key2.pubkey, + &key3.pubkey, wc_ecc_key_get_priv(&key2), wc_ecc_key_get_priv(&key3), + 1), 0); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_mulmod(NULL, &key2.pubkey, &key3.pubkey, - wc_ecc_key_get_priv(&key2), - wc_ecc_key_get_priv(&key3), 1); - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), NULL, &key3.pubkey, - wc_ecc_key_get_priv(&key2), - wc_ecc_key_get_priv(&key3), 1); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), &key2.pubkey, NULL, - wc_ecc_key_get_priv(&key2), - wc_ecc_key_get_priv(&key3), 1); - } - if (ret == ECC_BAD_ARG_E) { - ret = wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), &key2.pubkey, - &key3.pubkey, wc_ecc_key_get_priv(&key2), NULL, - 1); - } - if (ret == ECC_BAD_ARG_E) { - ret = 0; - } - else if (ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(ret = wc_ecc_mulmod(NULL, &key2.pubkey, &key3.pubkey, + wc_ecc_key_get_priv(&key2), wc_ecc_key_get_priv(&key3), 1), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), NULL, &key3.pubkey, + wc_ecc_key_get_priv(&key2), wc_ecc_key_get_priv(&key3), 1), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), &key2.pubkey, NULL, + wc_ecc_key_get_priv(&key2), wc_ecc_key_get_priv(&key3), 1), + ECC_BAD_ARG_E); + ExpectIntEQ(wc_ecc_mulmod(wc_ecc_key_get_priv(&key1), &key2.pubkey, + &key3.pubkey, wc_ecc_key_get_priv(&key2), NULL, 1), ECC_BAD_ARG_E); wc_ecc_free(&key1); wc_ecc_free(&key2); @@ -28010,10 +25987,8 @@ #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif /* HAVE_ECC && !WOLFSSL_ATECC508A */ - return res; + return EXPECT_RESULT(); } /* END test_wc_ecc_mulmod */ /* @@ -28021,300 +25996,842 @@ */ static int test_wc_ecc_is_valid_idx(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) - ecc_key key; - WC_RNG rng; - int ret; - int iVal = -2; - int iVal2 = 3000; + ecc_key key; + WC_RNG rng; + int ret; + int iVal = -2; + int iVal2 = 3000; - XMEMSET(&rng, 0, sizeof(rng)); - XMEMSET(&key, 0, sizeof(key)); + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, 32, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - } + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, 32, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); - if (ret == 0) { - ret = wc_ecc_is_valid_idx(key.idx); - if (ret == 1) { - ret = 0; - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_is_valid_idx(key.idx), 1); /* Test bad args. */ - if (ret == 0) { - ret = wc_ecc_is_valid_idx(iVal); /* should return 0 */ - if (ret == 0) { - ret = wc_ecc_is_valid_idx(iVal2); - } - if (ret != 0) { - ret = WOLFSSL_FATAL_ERROR; - } - } + ExpectIntEQ(wc_ecc_is_valid_idx(iVal), 0); + ExpectIntEQ(wc_ecc_is_valid_idx(iVal2), 0); - if (wc_FreeRng(&rng) && ret == 0) { - ret = WOLFSSL_FATAL_ERROR; - } + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); + #ifdef FP_ECC wc_ecc_fp_free(); #endif - - res = TEST_RES_CHECK(ret == 0); #endif - return res; - - + return EXPECT_RESULT(); } /* END test_wc_ecc_is_valid_idx */ + /* * Testing wc_ecc_get_curve_id_from_oid() */ static int test_wc_ecc_get_curve_id_from_oid(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(NO_ECC256) && !defined(HAVE_SELFTEST) && \ !defined(HAVE_FIPS) const byte oid[] = {0x2A,0x86,0x48,0xCE,0x3D,0x03,0x01,0x07}; word32 len = sizeof(oid); - int ret; /* Bad Cases */ - ret = wc_ecc_get_curve_id_from_oid(NULL, len); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - if (ret == 0) { - ret = wc_ecc_get_curve_id_from_oid(oid, 0); - if (ret == ECC_CURVE_INVALID) { - ret = 0; - } - } + ExpectIntEQ(wc_ecc_get_curve_id_from_oid(NULL, len), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_get_curve_id_from_oid(oid, 0), ECC_CURVE_INVALID); /* Good Case */ - if (ret == 0) { - ret = wc_ecc_get_curve_id_from_oid(oid, len); - if (ret == ECC_SECP256R1) { - ret = 0; - } - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_ecc_get_curve_id_from_oid(oid, len), ECC_SECP256R1); #endif - return res; -}/* END test_wc_ecc_get_curve_id_from_oid */ + return EXPECT_RESULT(); +} /* END test_wc_ecc_get_curve_id_from_oid */ + /* * Testing wc_ecc_sig_size_calc() */ static int test_wc_ecc_sig_size_calc(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(WC_NO_RNG) && !defined(HAVE_SELFTEST) - ecc_key key; - WC_RNG rng; - int sz = 0; - int ret = 0; + ecc_key key; + WC_RNG rng; + int sz = 0; + int ret; - ret = wc_InitRng(&rng); - if (ret == 0) { - ret = wc_ecc_init(&key); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, 16, &key); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - sz = key.dp->size; - } - if (ret == 0) { - ret = wc_ecc_sig_size_calc(sz); - if (ret > 0) { - ret = 0; - } - } + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ret = wc_ecc_make_key(&rng, 16, &key); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_NONE); +#endif +#if FIPS_VERSION3_GE(6,0,0) + ExpectIntEQ(ret, BAD_FUNC_ARG); +#else + ExpectIntEQ(ret, 0); +#endif +#if FIPS_VERSION3_LT(6,0,0) + sz = key.dp->size; + ExpectIntGT(wc_ecc_sig_size_calc(sz), 0); +#else + (void) sz; +#endif + + DoExpectIntEQ(wc_FreeRng(&rng), 0); wc_ecc_free(&key); - wc_FreeRng(&rng); +#endif + return EXPECT_RESULT(); +} /* END test_wc_ecc_sig_size_calc */ - res = TEST_RES_CHECK(ret == 0); +/* + * Testing wc_ecc_sm2_make_key() + */ +static int test_wc_ecc_sm2_make_key(void) +{ + int res = TEST_SKIPPED; +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) + EXPECT_DECLS; + WC_RNG rng[1]; + ecc_key key[1]; + + XMEMSET(rng, 0, sizeof(*rng)); + XMEMSET(key, 0, sizeof(*key)); + + ExpectIntEQ(wc_InitRng(rng), 0); + ExpectIntEQ(wc_ecc_init(key), 0); + + /* Test invalid parameters. */ + ExpectIntEQ(wc_ecc_sm2_make_key(NULL, NULL, WC_ECC_FLAG_NONE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_make_key(rng, NULL, WC_ECC_FLAG_NONE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_make_key(NULL, key, WC_ECC_FLAG_NONE), + BAD_FUNC_ARG); + + /* Test valid parameters. */ + ExpectIntEQ(wc_ecc_sm2_make_key(rng, key, WC_ECC_FLAG_NONE), 0); + ExpectIntEQ(key->dp->id, ECC_SM2P256V1); + + wc_ecc_free(key); + wc_FreeRng(rng); +#ifdef FP_ECC + wc_ecc_fp_free(); +#endif + + res = EXPECT_RESULT(); #endif return res; -} /* END test_wc_ecc_sig_size_calc */ +} + +/* + * Testing wc_ecc_sm2_shared_secret() + */ +static int test_wc_ecc_sm2_shared_secret(void) +{ + int res = TEST_SKIPPED; +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) + EXPECT_DECLS; + WC_RNG rng[1]; + ecc_key keyA[1]; + ecc_key keyB[1]; + byte outA[32]; + byte outB[32]; + word32 outALen = 32; + word32 outBLen = 32; + + XMEMSET(rng, 0, sizeof(*rng)); + XMEMSET(keyA, 0, sizeof(*keyA)); + XMEMSET(keyB, 0, sizeof(*keyB)); + + ExpectIntEQ(wc_InitRng(rng), 0); + ExpectIntEQ(wc_ecc_init(keyA), 0); + ExpectIntEQ(wc_ecc_init(keyB), 0); + ExpectIntEQ(wc_ecc_sm2_make_key(rng, keyA, WC_ECC_FLAG_NONE), 0); + ExpectIntEQ(wc_ecc_sm2_make_key(rng, keyB, WC_ECC_FLAG_NONE), 0); + +#ifdef ECC_TIMING_RESISTANT + ExpectIntEQ(wc_ecc_set_rng(keyA, rng), 0); + ExpectIntEQ(wc_ecc_set_rng(keyB, rng), 0); +#endif + + /* Test invalid parameters. */ + ExpectIntEQ(wc_ecc_sm2_shared_secret(NULL, NULL, NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(keyA, NULL, NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(NULL, keyB, NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(NULL, NULL, outA, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(NULL, NULL, NULL, &outALen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(NULL, keyB, outA, &outALen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(keyA, NULL, outA, &outALen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(keyA, keyB, NULL, &outALen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_shared_secret(keyA, keyB, outA, NULL), BAD_FUNC_ARG); + + /* Test valid parameters. */ + ExpectIntEQ(wc_ecc_sm2_shared_secret(keyA, keyB, outA, &outALen), 0); + ExpectIntLE(outALen, 32); + ExpectIntEQ(wc_ecc_sm2_shared_secret(keyB, keyA, outB, &outBLen), 0); + ExpectIntLE(outBLen, 32); + ExpectIntEQ(outALen, outBLen); + ExpectBufEQ(outA, outB, outALen); + + wc_ecc_free(keyB); + wc_ecc_free(keyA); + wc_FreeRng(rng); +#ifdef FP_ECC + wc_ecc_fp_free(); +#endif + + res = EXPECT_RESULT(); +#endif + return res; +} + +/* + * Testing wc_ecc_sm2_create_digest() + */ +static int test_wc_ecc_sm2_create_digest(void) +{ + int res = TEST_SKIPPED; +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && !defined(NO_HASH_WRAPPER) && \ + (defined(WOLFSSL_SM3) || !defined(NO_SHA256)) + EXPECT_DECLS; + ecc_key key[1]; + enum wc_HashType hashType; + unsigned char pub[] = { + 0x04, + 0x63, 0x7F, 0x1B, 0x13, 0x50, 0x36, 0xC9, 0x33, + 0xDC, 0x3F, 0x7A, 0x8E, 0xBB, 0x1B, 0x7B, 0x2F, + 0xD1, 0xDF, 0xBD, 0x26, 0x8D, 0x4F, 0x89, 0x4B, + 0x5A, 0xD4, 0x7D, 0xBD, 0xBE, 0xCD, 0x55, 0x8F, + 0xE8, 0x81, 0x01, 0xD0, 0x80, 0x48, 0xE3, 0x6C, + 0xCB, 0xF6, 0x1C, 0xA3, 0x8D, 0xDF, 0x7A, 0xBA, + 0x54, 0x2B, 0x44, 0x86, 0xE9, 0x9E, 0x49, 0xF3, + 0xA7, 0x47, 0x0A, 0x85, 0x7A, 0x09, 0x64, 0x33 + }; + unsigned char id[] = { + 0x01, 0x02, 0x03, + }; + unsigned char msg[] = { + 0x01, 0x02, 0x03, + }; + unsigned char hash[32]; +#ifdef WOLFSSL_SM3 + unsigned char expHash[32] = { + 0xc1, 0xdd, 0x92, 0xc5, 0x60, 0xd3, 0x94, 0x28, + 0xeb, 0x0f, 0x57, 0x79, 0x3f, 0xc9, 0x96, 0xc5, + 0xfa, 0xf5, 0x90, 0xb2, 0x64, 0x2f, 0xaf, 0x9c, + 0xc8, 0x57, 0x21, 0x6a, 0x52, 0x7e, 0xf1, 0x95 + }; +#else + unsigned char expHash[32] = { + 0xea, 0x41, 0x55, 0x21, 0x61, 0x00, 0x5c, 0x9a, + 0x57, 0x35, 0x6b, 0x49, 0xca, 0x8f, 0x65, 0xc2, + 0x0e, 0x29, 0x0c, 0xa0, 0x1d, 0xa7, 0xc4, 0xed, + 0xdd, 0x51, 0x12, 0xf6, 0xe7, 0x55, 0xc5, 0xf4 + }; +#endif + +#ifdef WOLFSSL_SM3 + hashType = WC_HASH_TYPE_SM3; +#else + hashType = WC_HASH_TYPE_SHA256; +#endif + + XMEMSET(key, 0, sizeof(*key)); + + ExpectIntEQ(wc_ecc_init(key), 0); + + /* Test with no curve set. */ + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), msg, sizeof(msg), + hashType, hash, sizeof(hash), key), BAD_FUNC_ARG); + + ExpectIntEQ(wc_ecc_import_x963_ex(pub, sizeof(pub), key, ECC_SM2P256V1), 0); + + /* Test invalid parameters. */ + ExpectIntEQ(wc_ecc_sm2_create_digest(NULL, sizeof(id), NULL, sizeof(msg), + hashType, NULL, sizeof(hash), NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), NULL, sizeof(msg), + hashType, NULL, sizeof(hash), NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(NULL, sizeof(id), msg, sizeof(msg), + hashType, NULL, sizeof(hash), NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(NULL, sizeof(id), NULL, sizeof(msg), + hashType, hash, sizeof(hash), NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(NULL, sizeof(id), NULL, sizeof(msg), + hashType, NULL, sizeof(hash), key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(NULL, sizeof(id), msg, sizeof(msg), + hashType, hash, sizeof(hash), key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), NULL, sizeof(msg), + hashType, hash, sizeof(hash), key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), msg, sizeof(msg), + hashType, NULL, sizeof(hash), key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), msg, sizeof(msg), + hashType, hash, sizeof(hash), NULL), BAD_FUNC_ARG); + + /* Bad hash type. */ + /* // NOLINTBEGIN(clang-analyzer-optin.core.EnumCastOutOfRange) */ + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), msg, sizeof(msg), + -1, hash, 0, key), BAD_FUNC_ARG); + /* // NOLINTEND(clang-analyzer-optin.core.EnumCastOutOfRange) */ + /* Bad hash size. */ + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), msg, sizeof(msg), + hashType, hash, 0, key), BUFFER_E); + + /* Test valid parameters. */ + ExpectIntEQ(wc_ecc_sm2_create_digest(id, sizeof(id), msg, sizeof(msg), + hashType, hash, sizeof(hash), key), 0); + ExpectBufEQ(hash, expHash, sizeof(expHash)); + + wc_ecc_free(key); + + res = EXPECT_RESULT(); +#endif + return res; +} +/* + * Testing wc_ecc_sm2_verify_hash_ex() + */ +static int test_wc_ecc_sm2_verify_hash_ex(void) +{ + int res = TEST_SKIPPED; +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(HAVE_ECC_VERIFY) && \ + defined(WOLFSSL_PUBLIC_MP) + EXPECT_DECLS; + ecc_key key[1]; + mp_int r[1]; + mp_int s[1]; + int verified; + unsigned char pub[] = { + 0x04, + 0x63, 0x7F, 0x1B, 0x13, 0x50, 0x36, 0xC9, 0x33, + 0xDC, 0x3F, 0x7A, 0x8E, 0xBB, 0x1B, 0x7B, 0x2F, + 0xD1, 0xDF, 0xBD, 0x26, 0x8D, 0x4F, 0x89, 0x4B, + 0x5A, 0xD4, 0x7D, 0xBD, 0xBE, 0xCD, 0x55, 0x8F, + 0xE8, 0x81, 0x01, 0xD0, 0x80, 0x48, 0xE3, 0x6C, + 0xCB, 0xF6, 0x1C, 0xA3, 0x8D, 0xDF, 0x7A, 0xBA, + 0x54, 0x2B, 0x44, 0x86, 0xE9, 0x9E, 0x49, 0xF3, + 0xA7, 0x47, 0x0A, 0x85, 0x7A, 0x09, 0x64, 0x33 + }; + unsigned char hash[] = { + 0x3B, 0xFA, 0x5F, 0xFB, 0xC4, 0x27, 0x8C, 0x9D, + 0x02, 0x3A, 0x19, 0xCB, 0x1E, 0xAA, 0xD2, 0xF1, + 0x50, 0x69, 0x5B, 0x20 + }; + unsigned char rData[] = { + 0xD2, 0xFC, 0xA3, 0x88, 0xE3, 0xDF, 0xA3, 0x00, + 0x73, 0x9B, 0x3C, 0x2A, 0x0D, 0xAD, 0x44, 0xA2, + 0xFC, 0x62, 0xD5, 0x6B, 0x84, 0x54, 0xD8, 0x40, + 0x22, 0x62, 0x3D, 0x5C, 0xA6, 0x61, 0x9B, 0xE7, + }; + unsigned char sData[] = { + 0x1D, + 0xB5, 0xB5, 0xD9, 0xD8, 0xF1, 0x20, 0xDD, 0x97, + 0x92, 0xBF, 0x7E, 0x9B, 0x3F, 0xE6, 0x3C, 0x4B, + 0x03, 0xD8, 0x80, 0xBD, 0xB7, 0x27, 0x7E, 0x6A, + 0x84, 0x23, 0xDE, 0x61, 0x7C, 0x8D, 0xDC + }; + unsigned char rBadData[] = { + 0xD2, 0xFC, 0xA3, 0x88, 0xE3, 0xDF, 0xA3, 0x00, + 0x73, 0x9B, 0x3C, 0x2A, 0x0D, 0xAD, 0x44, 0xA2, + 0xFC, 0x62, 0xD5, 0x6B, 0x84, 0x54, 0xD8, 0x40, + 0x22, 0x62, 0x3D, 0x5C, 0xA6, 0x61, 0x9B, 0xE8, + }; + + XMEMSET(key, 0, sizeof(*key)); + XMEMSET(r, 0, sizeof(*r)); + XMEMSET(s, 0, sizeof(*s)); + + ExpectIntEQ(mp_init(r), 0); + ExpectIntEQ(mp_init(s), 0); + ExpectIntEQ(mp_read_unsigned_bin(r, rData, sizeof(rData)), 0); + ExpectIntEQ(mp_read_unsigned_bin(s, sData, sizeof(sData)), 0); + + ExpectIntEQ(wc_ecc_init(key), 0); + + /* Test with no curve set. */ + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, hash, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + + ExpectIntEQ(wc_ecc_import_x963_ex(pub, sizeof(pub), key, ECC_SM2P256V1), 0); + + /* Test invalid parameters. */ + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(NULL, NULL, NULL, sizeof(hash), + NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, NULL, NULL, sizeof(hash), + NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(NULL, s, NULL, sizeof(hash), + NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(NULL, NULL, hash, sizeof(hash), + NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(NULL, NULL, NULL, sizeof(hash), + &verified, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(NULL, NULL, NULL, sizeof(hash), + NULL, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(NULL, s, hash, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, NULL, hash, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, NULL, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, hash, sizeof(hash), + NULL, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, hash, sizeof(hash), + &verified, NULL), BAD_FUNC_ARG); + + /* Make key not on the SM2 curve. */ + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SECP256R1), 0); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, hash, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SM2P256V1), 0); + + /* Test valid parameters. */ + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, hash, sizeof(hash), + &verified, key), 0); + ExpectIntEQ(verified, 1); + + ExpectIntEQ(mp_read_unsigned_bin(r, rBadData, sizeof(rBadData)), 0); + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, hash, sizeof(hash), + &verified, key), 0); + ExpectIntEQ(verified, 0); + + mp_free(s); + mp_free(r); + wc_ecc_free(key); +#ifdef FP_ECC + wc_ecc_fp_free(); +#endif + + res = EXPECT_RESULT(); +#endif + return res; +} + +/* + * Testing wc_ecc_sm2_verify_hash() + */ +static int test_wc_ecc_sm2_verify_hash(void) +{ + int res = TEST_SKIPPED; +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(HAVE_ECC_VERIFY) + EXPECT_DECLS; + ecc_key key[1]; + int verified; + unsigned char pub[] = { + 0x04, + 0x63, 0x7F, 0x1B, 0x13, 0x50, 0x36, 0xC9, 0x33, + 0xDC, 0x3F, 0x7A, 0x8E, 0xBB, 0x1B, 0x7B, 0x2F, + 0xD1, 0xDF, 0xBD, 0x26, 0x8D, 0x4F, 0x89, 0x4B, + 0x5A, 0xD4, 0x7D, 0xBD, 0xBE, 0xCD, 0x55, 0x8F, + 0xE8, 0x81, 0x01, 0xD0, 0x80, 0x48, 0xE3, 0x6C, + 0xCB, 0xF6, 0x1C, 0xA3, 0x8D, 0xDF, 0x7A, 0xBA, + 0x54, 0x2B, 0x44, 0x86, 0xE9, 0x9E, 0x49, 0xF3, + 0xA7, 0x47, 0x0A, 0x85, 0x7A, 0x09, 0x64, 0x33 + }; + unsigned char hash[] = { + 0x3B, 0xFA, 0x5F, 0xFB, 0xC4, 0x27, 0x8C, 0x9D, + 0x02, 0x3A, 0x19, 0xCB, 0x1E, 0xAA, 0xD2, 0xF1, + 0x50, 0x69, 0x5B, 0x20 + }; + unsigned char sig[] = { + 0x30, 0x45, 0x02, 0x21, 0x00, 0xD2, 0xFC, 0xA3, + 0x88, 0xE3, 0xDF, 0xA3, 0x00, 0x73, 0x9B, 0x3C, + 0x2A, 0x0D, 0xAD, 0x44, 0xA2, 0xFC, 0x62, 0xD5, + 0x6B, 0x84, 0x54, 0xD8, 0x40, 0x22, 0x62, 0x3D, + 0x5C, 0xA6, 0x61, 0x9B, 0xE7, 0x02, 0x20, 0x1D, + 0xB5, 0xB5, 0xD9, 0xD8, 0xF1, 0x20, 0xDD, 0x97, + 0x92, 0xBF, 0x7E, 0x9B, 0x3F, 0xE6, 0x3C, 0x4B, + 0x03, 0xD8, 0x80, 0xBD, 0xB7, 0x27, 0x7E, 0x6A, + 0x84, 0x23, 0xDE, 0x61, 0x7C, 0x8D, 0xDC + }; + unsigned char sigBad[] = { + 0x30, 0x45, 0x02, 0x21, 0x00, 0xD2, 0xFC, 0xA3, + 0x88, 0xE3, 0xDF, 0xA3, 0x00, 0x73, 0x9B, 0x3C, + 0x2A, 0x0D, 0xAD, 0x44, 0xA2, 0xFC, 0x62, 0xD5, + 0x6B, 0x84, 0x54, 0xD8, 0x40, 0x22, 0x62, 0x3D, + 0x5C, 0xA6, 0x61, 0x9B, 0xE7, 0x02, 0x20, 0x1D, + 0xB5, 0xB5, 0xD9, 0xD8, 0xF1, 0x20, 0xDD, 0x97, + 0x92, 0xBF, 0x7E, 0x9B, 0x3F, 0xE6, 0x3C, 0x4B, + 0x03, 0xD8, 0x80, 0xBD, 0xB7, 0x27, 0x7E, 0x6A, + 0x84, 0x23, 0xDE, 0x61, 0x7C, 0x8D, 0xDD + }; + + + XMEMSET(key, 0, sizeof(*key)); + ExpectIntEQ(wc_ecc_init(key), 0); + + /* Test with no curve set. */ + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sizeof(sig), hash, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + + ExpectIntEQ(wc_ecc_import_x963_ex(pub, sizeof(pub), key, ECC_SM2P256V1), 0); + + /* Test invalid parameters. */ + ExpectIntEQ(wc_ecc_sm2_verify_hash(NULL, sizeof(sig), NULL, sizeof(hash), + NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sizeof(sig), NULL, sizeof(hash), + NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(NULL, sizeof(sig), hash, sizeof(hash), + NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(NULL, sizeof(sig), NULL, sizeof(hash), + &verified, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(NULL, sizeof(sig), NULL, sizeof(hash), + NULL, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(NULL, sizeof(sig), hash, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sizeof(sig), NULL, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sizeof(sig), hash, sizeof(hash), + NULL, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sizeof(sig), hash, sizeof(hash), + &verified, NULL), BAD_FUNC_ARG); + + /* Make key not on the SM2 curve. */ + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SECP256R1), 0); + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sizeof(sig), hash, sizeof(hash), + &verified, key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SM2P256V1), 0); + + /* Test valid parameters. */ + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sizeof(sig), hash, sizeof(hash), + &verified, key), 0); + ExpectIntEQ(verified, 1); + + ExpectIntEQ(wc_ecc_sm2_verify_hash(sigBad, sizeof(sigBad), hash, + sizeof(hash), &verified, key), 0); + ExpectIntEQ(verified, 0); + + wc_ecc_free(key); +#ifdef FP_ECC + wc_ecc_fp_free(); +#endif + + res = EXPECT_RESULT(); +#endif + return res; +} + +/* + * Testing wc_ecc_sm2_verify_hash_ex() + */ +static int test_wc_ecc_sm2_sign_hash_ex(void) +{ + int res = TEST_SKIPPED; +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(HAVE_ECC_SIGN) && \ + defined(WOLFSSL_PUBLIC_MP) + EXPECT_DECLS; + WC_RNG rng[1]; + ecc_key key[1]; + mp_int r[1]; + mp_int s[1]; + unsigned char hash[32]; +#ifdef HAVE_ECC_VERIFY + int verified; +#endif + + XMEMSET(rng, 0, sizeof(*rng)); + XMEMSET(key, 0, sizeof(*key)); + XMEMSET(r, 0, sizeof(*r)); + XMEMSET(s, 0, sizeof(*s)); + + ExpectIntEQ(wc_InitRng(rng), 0); + ExpectIntEQ(mp_init(r), 0); + ExpectIntEQ(mp_init(s), 0); + ExpectIntEQ(wc_RNG_GenerateBlock(rng, hash, sizeof(hash)), 0); + + ExpectIntEQ(wc_ecc_init(key), 0); + + /* Test with no curve set. */ + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), rng, key, r, s), + BAD_FUNC_ARG); + + ExpectIntEQ(wc_ecc_sm2_make_key(rng, key, WC_ECC_FLAG_NONE), 0); + + /* Test invalid parameters. */ + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(NULL, sizeof(hash), NULL, NULL, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), NULL, NULL, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(NULL, sizeof(hash), rng, NULL, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(NULL, sizeof(hash), NULL, key, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(NULL, sizeof(hash), NULL, NULL, r, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(NULL, sizeof(hash), NULL, NULL, NULL, + s), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(NULL, sizeof(hash), rng, key, r, s), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), NULL, key, r, s), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), rng, NULL, r, s), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), rng, key, NULL, s), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), rng, key, r, NULL), + BAD_FUNC_ARG); + + /* Make key not on the SM2 curve. */ + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SECP256R1), 0); + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), rng, key, r, s), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SM2P256V1), 0); + +#ifdef WOLFSSL_SP_MATH_ALL + { + mp_int smallR[1]; + sp_init_size(smallR, 1); + /* Force failure in _ecc_sm2_calc_r_s by r being too small. */ + ExpectIntLT(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), rng, key, + smallR, s), 0); + } +#endif + + /* Test valid parameters. */ + ExpectIntEQ(wc_ecc_sm2_sign_hash_ex(hash, sizeof(hash), rng, key, r, s), + 0); +#ifdef HAVE_ECC_VERIFY + ExpectIntEQ(wc_ecc_sm2_verify_hash_ex(r, s, hash, sizeof(hash), &verified, + key), 0); + ExpectIntEQ(verified, 1); +#endif + + mp_free(s); + mp_free(r); + wc_ecc_free(key); + wc_FreeRng(rng); +#ifdef FP_ECC + wc_ecc_fp_free(); +#endif + + res = EXPECT_RESULT(); +#endif + return res; +} + + +/* + * Testing wc_ecc_sm2_verify_hash() + */ +static int test_wc_ecc_sm2_sign_hash(void) +{ + int res = TEST_SKIPPED; +#if defined(HAVE_ECC) && defined(WOLFSSL_SM2) && defined(HAVE_ECC_SIGN) + EXPECT_DECLS; + WC_RNG rng[1]; + ecc_key key[1]; + unsigned char hash[32]; + unsigned char sig[72]; + word32 sigSz = sizeof(sig); +#ifdef HAVE_ECC_VERIFY + int verified; +#endif + + XMEMSET(rng, 0, sizeof(*rng)); + XMEMSET(key, 0, sizeof(*key)); + + ExpectIntEQ(wc_InitRng(rng), 0); + ExpectIntEQ(wc_RNG_GenerateBlock(rng, hash, sizeof(hash)), 0); + + ExpectIntEQ(wc_ecc_init(key), 0); + + /* Test with no curve set. */ + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), sig, &sigSz, rng, key), + BAD_FUNC_ARG); + + ExpectIntEQ(wc_ecc_sm2_make_key(rng, key, WC_ECC_FLAG_NONE), 0); + + /* Test invalid parameters. */ + ExpectIntEQ(wc_ecc_sm2_sign_hash(NULL, sizeof(hash), NULL, NULL, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), NULL, NULL, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(NULL, sizeof(hash), sig, NULL, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(NULL, sizeof(hash), NULL, &sigSz, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(NULL, sizeof(hash), NULL, NULL, rng, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(NULL, sizeof(hash), NULL, NULL, NULL, + key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(NULL, sizeof(hash), sig, &sigSz, rng, + key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), NULL, &sigSz, rng, + key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), sig, NULL, rng, + key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), sig, &sigSz, NULL, + key), BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), sig, &sigSz, rng, + NULL), BAD_FUNC_ARG); + + /* Make key not on the SM2 curve. */ + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SECP256R1), 0); + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), sig, &sigSz, rng, key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_set_curve(key, 32, ECC_SM2P256V1), 0); + + /* Test valid parameters. */ + ExpectIntEQ(wc_ecc_sm2_sign_hash(hash, sizeof(hash), sig, &sigSz, rng, key), + 0); +#ifdef HAVE_ECC_VERIFY + ExpectIntEQ(wc_ecc_sm2_verify_hash(sig, sigSz, hash, sizeof(hash), + &verified, key), 0); + ExpectIntEQ(verified, 1); +#endif + + wc_ecc_free(key); + wc_FreeRng(rng); +#ifdef FP_ECC + wc_ecc_fp_free(); +#endif + + res = EXPECT_RESULT(); +#endif + return res; +} + + /* * Testing ToTraditional */ static int test_ToTraditional(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && (defined(HAVE_PKCS8) || defined(HAVE_PKCS12)) && \ (defined(WOLFSSL_TEST_CERT) || defined(OPENSSL_EXTRA) || \ - defined(OPENSSL_EXTRA_X509_SMALL)) + defined(OPENSSL_EXTRA_X509_SMALL)) && !defined(NO_FILESYSTEM) + XFILE f = XBADFILE; + byte input[TWOK_BUF]; + word32 sz = 0; - XFILE f; - byte input[TWOK_BUF]; - word32 sz; - int ret; - - f = XFOPEN("./certs/server-keyPkcs8.der", "rb"); - AssertTrue((f != XBADFILE)); - sz = (word32)XFREAD(input, 1, sizeof(input), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN("./certs/server-keyPkcs8.der", "rb")) != XBADFILE); + ExpectTrue((sz = (word32)XFREAD(input, 1, sizeof(input), f)) > 0); + if (f != XBADFILE) + XFCLOSE(f); /* Good case */ - ret = ToTraditional(input, sz); - if (ret > 0) { - ret = 0; - } + ExpectIntGT(ToTraditional(input, sz), 0); /* Bad cases */ - if (ret == 0) { - ret = ToTraditional(NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = ToTraditional(NULL, sz); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = ToTraditional(input, 0); - if (ret == ASN_PARSE_E || ret == BUFFER_E) { - ret = 0; - } - } - - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(ToTraditional(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(ToTraditional(NULL, sz), BAD_FUNC_ARG); +#ifdef WOLFSSL_ASN_TEMPLATE + ExpectIntEQ(ToTraditional(input, 0), BUFFER_E); +#else + ExpectIntEQ(ToTraditional(input, 0), ASN_PARSE_E); #endif - return res; -}/* End test_ToTraditional*/ +#endif + return EXPECT_RESULT(); +} /* End test_ToTraditional*/ /* * Testing wc_EccPrivateKeyToDer */ static int test_wc_EccPrivateKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) - byte output[ONEK_BUF]; - ecc_key eccKey; - WC_RNG rng; - word32 inLen; - int ret; + byte output[ONEK_BUF]; + ecc_key eccKey; + WC_RNG rng; + word32 inLen; + word32 outLen = 0; + int ret; - ret = wc_InitRng(&rng); + XMEMSET(&eccKey, 0, sizeof(ecc_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + PRIVATE_KEY_UNLOCK(); - if (ret == 0) { - ret = wc_ecc_init(&eccKey); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY14, &eccKey); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &eccKey.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - inLen = (word32)sizeof(output); - /* Bad Cases */ - if (ret == 0) { - ret = wc_EccPrivateKeyToDer(NULL, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_EccPrivateKeyToDer(NULL, output, inLen); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_EccPrivateKeyToDer(&eccKey, NULL, inLen); - if (ret == LENGTH_ONLY_E) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_EccPrivateKeyToDer(&eccKey, output, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - /*Good Case */ - if (ret == 0) { - ret = wc_EccPrivateKeyToDer(&eccKey, output, inLen); - if (ret > 0) { - #if defined(OPENSSL_EXTRA) && defined(HAVE_ALL_CURVES) - /* test importing private only into a PKEY struct */ - EC_KEY* ec; - EVP_PKEY* pkey; - const unsigned char* der = output; - - pkey = d2i_PrivateKey(EVP_PKEY_EC, NULL, &der, ret); - AssertNotNull(pkey); - - der = output; - ec = d2i_ECPrivateKey(NULL, &der, ret); - AssertNotNull(ec); - AssertIntEQ(EVP_PKEY_assign_EC_KEY(pkey, ec), SSL_SUCCESS); - EVP_PKEY_free(pkey); /* EC_KEY should be free'd by free'ing pkey */ - #endif - ret = 0; - } + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ecc_init(&eccKey), 0); + ret = wc_ecc_make_key(&rng, KEY14, &eccKey); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &eccKey.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + ExpectIntEQ(ret, 0); + + inLen = (word32)sizeof(output); + /* Bad Cases */ + ExpectIntEQ(wc_EccPrivateKeyToDer(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_EccPrivateKeyToDer(NULL, output, inLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_EccPrivateKeyToDer(&eccKey, NULL, inLen), LENGTH_ONLY_E); + ExpectIntEQ(wc_EccPrivateKeyToDer(&eccKey, output, 0), BAD_FUNC_ARG); + /* Good Case */ + ExpectIntGT(outLen = (word32)wc_EccPrivateKeyToDer(&eccKey, output, inLen), 0); + + wc_ecc_free(&eccKey); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + +#if defined(OPENSSL_EXTRA) && defined(HAVE_ALL_CURVES) + { + /* test importing private only into a PKEY struct */ + EC_KEY* ec = NULL; + EVP_PKEY* pkey = NULL; + const unsigned char* der; + + der = output; + ExpectNotNull(pkey = d2i_PrivateKey(EVP_PKEY_EC, NULL, &der, outLen)); + + der = output; + ExpectNotNull(ec = d2i_ECPrivateKey(NULL, &der, outLen)); + ExpectIntEQ(EVP_PKEY_assign_EC_KEY(pkey, ec), SSL_SUCCESS); + if (EXPECT_FAIL()) { + EC_KEY_free(ec); } - wc_ecc_free(&eccKey); + EVP_PKEY_free(pkey); /* EC_KEY should be free'd by free'ing pkey */ } - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -}/* End test_wc_EccPrivateKeyToDer*/ + PRIVATE_KEY_LOCK(); +#endif + return EXPECT_RESULT(); +} /* End test_wc_EccPrivateKeyToDer*/ /* * Testing wc_DhPublicKeyDecode */ static int test_wc_DhPublicKeyDecode(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_DH #if defined(WOLFSSL_DH_EXTRA) && defined(USE_CERT_BUFFERS_2048) DhKey key; word32 inOutIdx; - AssertIntEQ(wc_InitDhKey(&key), 0); + XMEMSET(&key, 0, sizeof(DhKey)); - AssertIntEQ(wc_DhPublicKeyDecode(NULL,NULL,NULL,0), - BAD_FUNC_ARG); - AssertIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,NULL,NULL,0), - BAD_FUNC_ARG); - AssertIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,NULL,NULL,0), - BAD_FUNC_ARG); + ExpectIntEQ(wc_InitDhKey(&key), 0); + + ExpectIntEQ(wc_DhPublicKeyDecode(NULL,NULL,NULL,0), BAD_FUNC_ARG); + ExpectIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,NULL,NULL,0), + BAD_FUNC_ARG); + ExpectIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,NULL,NULL,0), + BAD_FUNC_ARG); inOutIdx = 0; - AssertIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,&inOutIdx,NULL, 0), - BAD_FUNC_ARG); + ExpectIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,&inOutIdx,NULL, 0), + BAD_FUNC_ARG); inOutIdx = 0; - AssertIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,&inOutIdx,&key, 0), - BAD_FUNC_ARG); + ExpectIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,&inOutIdx,&key, 0), + BAD_FUNC_ARG); inOutIdx = 0; - AssertIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,&inOutIdx,&key, - sizeof_dh_pub_key_der_2048), 0); - AssertTrue(key.p.used != 0 && key.g.used != 0 && key.q.used == 0 && - key.pub.used != 0 && key.priv.used == 0); - - wc_FreeDhKey(&key); + ExpectIntEQ(wc_DhPublicKeyDecode(dh_pub_key_der_2048,&inOutIdx,&key, + sizeof_dh_pub_key_der_2048), 0); + ExpectIntNE(key.p.used, 0); + ExpectIntNE(key.g.used, 0); + ExpectIntEQ(key.q.used, 0); + ExpectIntNE(key.pub.used, 0); + ExpectIntEQ(key.priv.used, 0); - res = TEST_RES_CHECK(1); + DoExpectIntEQ(wc_FreeDhKey(&key), 0); #endif #endif /* !NO_DH */ - return res; + return EXPECT_RESULT(); } /* @@ -28322,505 +26839,10085 @@ */ static int test_wc_Ed25519KeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN)) - byte output[ONEK_BUF]; - ed25519_key ed25519Key; - WC_RNG rng; - word32 inLen; - int ret; + byte output[ONEK_BUF]; + ed25519_key ed25519Key; + WC_RNG rng; + word32 inLen; - ret = wc_InitRng(&rng); + XMEMSET(&ed25519Key, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_ed25519_init(&ed25519Key); - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519Key); - } - inLen = (word32)sizeof(output); + ExpectIntEQ(wc_ed25519_init(&ed25519Key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519Key), 0); + inLen = (word32)sizeof(output); - /* Bad Cases */ - if (ret == 0) { - ret = wc_Ed25519KeyToDer(NULL, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed25519KeyToDer(NULL, output, inLen); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed25519KeyToDer(&ed25519Key, output, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - /* Good Cases */ - if (ret == 0) { - /* length only */ - ret = wc_Ed25519KeyToDer(&ed25519Key, NULL, inLen); - if (ret > 0) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed25519KeyToDer(&ed25519Key, output, inLen); - if (ret > 0) { - ret = 0; - } - } - wc_ed25519_free(&ed25519Key); - } - wc_FreeRng(&rng); + /* Bad Cases */ + ExpectIntEQ(wc_Ed25519KeyToDer(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed25519KeyToDer(NULL, output, inLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed25519KeyToDer(&ed25519Key, output, 0), BAD_FUNC_ARG); + /* Good Cases */ + /* length only */ + ExpectIntGT(wc_Ed25519KeyToDer(&ed25519Key, NULL, inLen), 0); + ExpectIntGT(wc_Ed25519KeyToDer(&ed25519Key, output, inLen), 0); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_ed25519_free(&ed25519Key); #endif - return res; -}/* End test_wc_Ed25519KeyToDer*/ + return EXPECT_RESULT(); +} /* End test_wc_Ed25519KeyToDer*/ + /* * Testing wc_Ed25519PrivateKeyToDer */ static int test_wc_Ed25519PrivateKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN)) - byte output[ONEK_BUF]; - ed25519_key ed25519PrivKey; - WC_RNG rng; - word32 inLen; - int ret; + byte output[ONEK_BUF]; + ed25519_key ed25519PrivKey; + WC_RNG rng; + word32 inLen; - ret = wc_InitRng(&rng); + XMEMSET(&ed25519PrivKey, 0, sizeof(ed25519_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = wc_ed25519_init(&ed25519PrivKey); - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519PrivKey); - } - inLen = (word32)sizeof(output); + ExpectIntEQ(wc_ed25519_init(&ed25519PrivKey), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519PrivKey), + 0); + inLen = (word32)sizeof(output); - /* Bad Cases */ - if (ret == 0) { - ret = wc_Ed25519PrivateKeyToDer(NULL, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed25519PrivateKeyToDer(NULL, output, inLen); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed25519PrivateKeyToDer(&ed25519PrivKey, output, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - /* Good Cases */ - if (ret == 0) { - /* length only */ - ret = wc_Ed25519PrivateKeyToDer(&ed25519PrivKey, NULL, inLen); - if (ret > 0) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed25519PrivateKeyToDer(&ed25519PrivKey, output, inLen); - if (ret > 0) { - ret = 0; - } - } - wc_ed25519_free(&ed25519PrivKey); - } - wc_FreeRng(&rng); + /* Bad Cases */ + ExpectIntEQ(wc_Ed25519PrivateKeyToDer(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed25519PrivateKeyToDer(NULL, output, inLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed25519PrivateKeyToDer(&ed25519PrivKey, output, 0), + BAD_FUNC_ARG); + /* Good Cases */ + /* length only */ + ExpectIntGT(wc_Ed25519PrivateKeyToDer(&ed25519PrivKey, NULL, inLen), 0); + ExpectIntGT(wc_Ed25519PrivateKeyToDer(&ed25519PrivKey, output, inLen), 0); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_ed25519_free(&ed25519PrivKey); #endif - return res; -}/* End test_wc_Ed25519PrivateKeyToDer*/ + return EXPECT_RESULT(); +} /* End test_wc_Ed25519PrivateKeyToDer*/ + /* * Testing wc_Ed448KeyToDer */ static int test_wc_Ed448KeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN)) - byte output[ONEK_BUF]; - ed448_key ed448Key; - WC_RNG rng; - word32 inLen; - int ret; - - ret = wc_InitRng(&rng); + byte output[ONEK_BUF]; + ed448_key ed448Key; + WC_RNG rng; + word32 inLen; + + XMEMSET(&ed448Key, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ed448_init(&ed448Key), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448Key), 0); + inLen = (word32)sizeof(output); - if (ret == 0) { - ret = wc_ed448_init(&ed448Key); - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448Key); - } - inLen = sizeof(output); - - /* Bad Cases */ - if (ret == 0) { - ret = wc_Ed448KeyToDer(NULL, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed448KeyToDer(NULL, output, inLen); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed448KeyToDer(&ed448Key, output, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - /* Good Cases */ - if (ret == 0) { - /* length only */ - ret = wc_Ed448KeyToDer(&ed448Key, NULL, inLen); - if (ret > 0) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed448KeyToDer(&ed448Key, output, inLen); - if (ret > 0) { - ret = 0; - } - } - wc_ed448_free(&ed448Key); - } - wc_FreeRng(&rng); + /* Bad Cases */ + ExpectIntEQ(wc_Ed448KeyToDer(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed448KeyToDer(NULL, output, inLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed448KeyToDer(&ed448Key, output, 0), BAD_FUNC_ARG); + /* Good Cases */ + /* length only */ + ExpectIntGT(wc_Ed448KeyToDer(&ed448Key, NULL, inLen), 0); + ExpectIntGT(wc_Ed448KeyToDer(&ed448Key, output, inLen), 0); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_ed448_free(&ed448Key); #endif - return res; -}/* End test_wc_Ed448KeyToDer*/ + return EXPECT_RESULT(); +} /* End test_wc_Ed448KeyToDer*/ + /* * Testing wc_Ed448PrivateKeyToDer */ static int test_wc_Ed448PrivateKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN)) - byte output[ONEK_BUF]; - ed448_key ed448PrivKey; - WC_RNG rng; - word32 inLen; - int ret; + byte output[ONEK_BUF]; + ed448_key ed448PrivKey; + WC_RNG rng; + word32 inLen; + + XMEMSET(&ed448PrivKey, 0, sizeof(ed448_key)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_ed448_init(&ed448PrivKey), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448PrivKey), + 0); + inLen = (word32)sizeof(output); - ret = wc_InitRng(&rng); + /* Bad Cases */ + ExpectIntEQ(wc_Ed448PrivateKeyToDer(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed448PrivateKeyToDer(NULL, output, inLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Ed448PrivateKeyToDer(&ed448PrivKey, output, 0), + BAD_FUNC_ARG); + /* Good cases */ + /* length only */ + ExpectIntGT(wc_Ed448PrivateKeyToDer(&ed448PrivKey, NULL, inLen), 0); + ExpectIntGT(wc_Ed448PrivateKeyToDer(&ed448PrivKey, output, inLen), 0); - if (ret == 0) { - ret = wc_ed448_init(&ed448PrivKey); - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448PrivKey); - } - inLen = sizeof(output); + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_ed448_free(&ed448PrivKey); +#endif + return EXPECT_RESULT(); +} /* End test_wc_Ed448PrivateKeyToDer*/ - /* Bad Cases */ - if (ret == 0) { - ret = wc_Ed448PrivateKeyToDer(NULL, NULL, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed448PrivateKeyToDer(NULL, output, inLen); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed448PrivateKeyToDer(&ed448PrivKey, output, 0); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - /* Good cases */ - if (ret == 0) { - /* length only */ - ret = wc_Ed448PrivateKeyToDer(&ed448PrivKey, NULL, inLen); - if (ret > 0) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_Ed448PrivateKeyToDer(&ed448PrivKey, output, inLen); - if (ret > 0) { - ret = 0; - } +/* + * Testing wc_Curve448PrivateKeyToDer + */ +static int test_wc_Curve448PrivateKeyToDer(void) +{ + EXPECT_DECLS; +#if defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_EXPORT) && \ + (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN)) + byte output[ONEK_BUF]; + curve448_key curve448PrivKey; + WC_RNG rng; + word32 inLen; + + XMEMSET(&curve448PrivKey, 0, sizeof(curve448PrivKey)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_curve448_init(&curve448PrivKey), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_curve448_make_key(&rng, CURVE448_KEY_SIZE, &curve448PrivKey), + 0); + inLen = (word32)sizeof(output); + + /* Bad Cases */ + ExpectIntEQ(wc_Curve448PrivateKeyToDer(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Curve448PrivateKeyToDer(NULL, output, inLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_Curve448PrivateKeyToDer(&curve448PrivKey, output, 0), + BAD_FUNC_ARG); + /* Good cases */ + /* length only */ + ExpectIntGT(wc_Curve448PrivateKeyToDer(&curve448PrivKey, NULL, inLen), 0); + ExpectIntGT(wc_Curve448PrivateKeyToDer(&curve448PrivKey, output, inLen), 0); + + /* Bad Cases */ + ExpectIntEQ(wc_Curve448PublicKeyToDer(NULL, NULL, 0, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Curve448PublicKeyToDer(NULL, output, inLen, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Curve448PublicKeyToDer(&curve448PrivKey, output, 0, 0), + BUFFER_E); + ExpectIntEQ(wc_Curve448PublicKeyToDer(&curve448PrivKey, output, 0, 1), + BUFFER_E); + /* Good cases */ + /* length only */ + ExpectIntGT(wc_Curve448PublicKeyToDer(&curve448PrivKey, NULL, inLen, 0), 0); + ExpectIntGT(wc_Curve448PublicKeyToDer(&curve448PrivKey, NULL, inLen, 1), 0); + ExpectIntGT(wc_Curve448PublicKeyToDer(&curve448PrivKey, output, inLen, 0), 0); + ExpectIntGT(wc_Curve448PublicKeyToDer(&curve448PrivKey, output, inLen, 1), 0); + + DoExpectIntEQ(wc_FreeRng(&rng), 0); + wc_curve448_free(&curve448PrivKey); +#endif + return EXPECT_RESULT(); +} /* End wc_Curve448PrivateKeyToDer*/ + +static int test_wc_kyber_make_key_kats(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_KYBER) && defined(WOLFSSL_WC_KYBER) && \ + defined(WOLFSSL_ML_KEM) + KyberKey* key; +#ifndef WOLFSSL_NO_KYBER512 + static const byte seed_512[KYBER_MAKEKEY_RAND_SZ] = { + 0xCD, 0x11, 0x9A, 0xFD, 0xC8, 0x55, 0x94, 0x42, + 0x42, 0x4A, 0x87, 0xC1, 0x3E, 0xA1, 0x01, 0xE2, + 0x9F, 0xCA, 0x11, 0x88, 0x18, 0x69, 0x07, 0x7E, + 0x40, 0x92, 0xE7, 0x51, 0xBE, 0xDC, 0xA8, 0xBC, + 0xCD, 0x11, 0x9A, 0xFD, 0xC8, 0x55, 0x94, 0x42, + 0x42, 0x4A, 0x87, 0xC1, 0x3E, 0xA1, 0x01, 0xE2, + 0x9F, 0xCA, 0x11, 0x88, 0x18, 0x69, 0x07, 0x7E, + 0x40, 0x92, 0xE7, 0x51, 0xBE, 0xDC, 0xA8, 0xBC + }; + static const byte ek_512[KYBER512_PUBLIC_KEY_SIZE] = { + 0xC6, 0x5A, 0x1D, 0x9D, 0x47, 0x97, 0x77, 0xE6, + 0x90, 0x5A, 0x91, 0xA5, 0xCB, 0x24, 0x55, 0x1C, + 0x8B, 0x1E, 0x52, 0xA3, 0xC7, 0x7B, 0x63, 0x31, + 0x3F, 0xFC, 0x8B, 0x58, 0x17, 0x81, 0x52, 0x59, + 0xA6, 0xAD, 0xB5, 0x96, 0x45, 0xDC, 0x4B, 0xB1, + 0x43, 0x6D, 0x51, 0xE6, 0x2A, 0x09, 0x68, 0x34, + 0xAF, 0x43, 0x77, 0x25, 0x10, 0xC4, 0xED, 0xF3, + 0x4C, 0xDE, 0x0A, 0x5B, 0x57, 0xC1, 0x45, 0xE6, + 0x87, 0xCB, 0x87, 0x16, 0x2F, 0x00, 0x1C, 0x21, + 0xC9, 0xE1, 0x93, 0x4A, 0xC1, 0x1A, 0xAF, 0xA7, + 0x0F, 0xF8, 0x10, 0x73, 0x26, 0x50, 0xB3, 0x2A, + 0x30, 0x18, 0xA7, 0xC5, 0x0C, 0xD7, 0x36, 0x79, + 0x62, 0x22, 0xC8, 0xAB, 0x82, 0x1A, 0x92, 0x83, + 0xBE, 0x1C, 0xC2, 0x04, 0xC3, 0xF1, 0x63, 0x0D, + 0x3C, 0xCC, 0xDB, 0x0A, 0x9A, 0x3D, 0x17, 0x55, + 0x2B, 0x91, 0x58, 0xC0, 0x66, 0x4E, 0x5D, 0x6A, + 0x04, 0xB0, 0xFA, 0x36, 0xDE, 0x45, 0x86, 0x2A, + 0x46, 0xA3, 0x9E, 0xC5, 0x97, 0xAE, 0x42, 0xC3, + 0x11, 0xC4, 0xAC, 0x22, 0x4A, 0x72, 0xD6, 0xF2, + 0x53, 0xBB, 0x52, 0x35, 0xF7, 0xA2, 0xB8, 0xB0, + 0xF2, 0x4D, 0x13, 0x76, 0xAF, 0x58, 0x87, 0x46, + 0xF3, 0xBB, 0x8E, 0x03, 0x65, 0x07, 0x87, 0x61, + 0xCA, 0xB9, 0x83, 0xA4, 0xA6, 0xA9, 0x40, 0xA3, + 0xD9, 0x97, 0x04, 0x7A, 0x8F, 0x36, 0xA7, 0x31, + 0xE8, 0x96, 0x52, 0x36, 0xC3, 0x7B, 0xF2, 0x00, + 0x08, 0x2F, 0x82, 0x1D, 0xCA, 0x77, 0x16, 0xC4, + 0x44, 0xA9, 0x0B, 0xEC, 0x53, 0x07, 0x4B, 0xBA, + 0x58, 0xC1, 0x32, 0xBF, 0xB9, 0xA2, 0xAC, 0xE2, + 0xCE, 0xC9, 0xAA, 0x65, 0x8E, 0xAC, 0x12, 0x32, + 0xCC, 0xCA, 0x3C, 0x81, 0x7A, 0x92, 0xC1, 0x19, + 0x5C, 0x05, 0xC0, 0xE1, 0xD6, 0x63, 0x9F, 0xD2, + 0xAD, 0xE5, 0x31, 0x60, 0x7D, 0x48, 0x8B, 0x74, + 0xA7, 0x47, 0xCF, 0xF4, 0x7F, 0xCA, 0x5C, 0x8B, + 0x21, 0x63, 0xCA, 0x03, 0xC5, 0x45, 0xED, 0x10, + 0x32, 0x78, 0x43, 0x0C, 0x60, 0xB2, 0x38, 0x1A, + 0x09, 0x42, 0x7F, 0xD1, 0x30, 0xF8, 0x59, 0xBF, + 0x5D, 0xB7, 0x76, 0xDA, 0x09, 0x5D, 0xCA, 0x58, + 0x04, 0xFA, 0x63, 0xB0, 0xD7, 0xD8, 0x7F, 0xA9, + 0x41, 0x5C, 0x72, 0xFB, 0x51, 0x87, 0x2A, 0x98, + 0x9F, 0x46, 0x6C, 0x98, 0x4B, 0xC7, 0x4C, 0x29, + 0xB8, 0x63, 0x20, 0x19, 0xCA, 0x04, 0x0C, 0x9C, + 0xA3, 0x5E, 0x22, 0x60, 0x8D, 0xAA, 0x70, 0x35, + 0x7A, 0xE2, 0xC3, 0xAD, 0x83, 0x63, 0x1F, 0xAA, + 0x17, 0x4E, 0x0A, 0xCD, 0xF5, 0xDB, 0xBF, 0x3C, + 0xF6, 0x8A, 0x05, 0xB6, 0x54, 0x3A, 0xB6, 0x26, + 0x8E, 0x1A, 0x51, 0xB0, 0x93, 0x2C, 0x17, 0xB0, + 0x0A, 0x13, 0x71, 0xB2, 0xDA, 0xB2, 0x41, 0xF9, + 0x2A, 0x43, 0xFF, 0xB4, 0x56, 0xD0, 0xA8, 0xC8, + 0x86, 0x0A, 0x8E, 0x28, 0xA6, 0x1A, 0x21, 0x30, + 0x7C, 0xC0, 0x45, 0x6D, 0xA4, 0x24, 0x29, 0x05, + 0xCB, 0x1D, 0x3D, 0x0B, 0xBD, 0x81, 0xBB, 0x8E, + 0xE2, 0x74, 0xA4, 0x3C, 0x76, 0xC3, 0x10, 0x01, + 0x95, 0x15, 0xFC, 0xC1, 0x40, 0x46, 0x7C, 0x33, + 0x37, 0x0C, 0x86, 0x80, 0x8E, 0xCA, 0xA5, 0x8E, + 0x3B, 0xA9, 0x3A, 0x2C, 0x11, 0x90, 0x46, 0x1C, + 0x1D, 0xFA, 0x11, 0x30, 0x20, 0x01, 0xBB, 0xAB, + 0x4C, 0xB1, 0xE3, 0x64, 0x2E, 0xF8, 0xCB, 0x26, + 0x30, 0x9B, 0x60, 0x52, 0x3B, 0xC2, 0x18, 0x87, + 0xB0, 0x7F, 0x89, 0x8C, 0xE5, 0x62, 0xA6, 0xCA, + 0x77, 0x8E, 0xA0, 0x15, 0x05, 0x85, 0x13, 0x78, + 0xCE, 0xA8, 0xBB, 0x7F, 0xC0, 0x9D, 0x11, 0x96, + 0x1B, 0x6C, 0x59, 0x6F, 0x93, 0x54, 0x2A, 0x99, + 0x04, 0x86, 0x4E, 0xB1, 0x0C, 0xD0, 0xA7, 0x03, + 0xDB, 0xA9, 0x89, 0x21, 0x86, 0x1A, 0x87, 0xB0, + 0x56, 0x52, 0x5C, 0x71, 0xA8, 0x43, 0x55, 0x3E, + 0x64, 0x00, 0x77, 0x74, 0x37, 0xC9, 0x5C, 0xCC, + 0x80, 0x85, 0xCC, 0x0C, 0x47, 0x7D, 0x66, 0x5A, + 0x44, 0x79, 0x01, 0x9D, 0x4C, 0xD4, 0x42, 0xF7, + 0x4A, 0x3C, 0xD8, 0x16, 0x9F, 0x42, 0x62, 0xB8, + 0x27, 0x1B, 0x5D, 0x5A, 0x67, 0xC8, 0xC1, 0x61, + 0x1A, 0xAE, 0x7B, 0x3D, 0x05, 0x34, 0xC0, 0x85, + 0x97, 0x16, 0xFD, 0xF0, 0xBB, 0x68, 0x94, 0x90, + 0x94, 0xC0, 0x6A, 0x1B, 0x73, 0xC9, 0xAA, 0x1C, + 0xBD, 0xF3, 0x31, 0x54, 0x3D, 0xE0, 0x02, 0xA8, + 0xC0, 0x6F, 0x94, 0xE8, 0x81, 0x0A, 0x5C, 0xB3, + 0x73, 0x83, 0x27, 0x45, 0xD7, 0x20, 0x68, 0x3B, + 0x57, 0x48, 0x75, 0xA6, 0x66, 0x94, 0x6D, 0x02, + 0x96, 0x89, 0x3F, 0x2B, 0x59, 0xE9, 0x07, 0x48, + 0x8D, 0x8C, 0x84, 0x89, 0xD4, 0x74, 0xD9, 0x29, + 0xA0, 0x5A, 0x57, 0x3E, 0xD6, 0x67, 0x49, 0x03, + 0x71, 0xA4, 0x6D, 0x45, 0x56, 0xCB, 0xB6, 0x8A, + 0xAA, 0x79, 0xCC, 0x3E, 0xC6, 0x65, 0x34, 0x13, + 0x57, 0x6C, 0x22, 0x8E, 0x37, 0x9A, 0x14, 0xCB, + 0x90, 0xB7, 0xB7, 0x59, 0x1B, 0x19, 0xA7, 0xBD, + 0x37, 0xA1, 0xC4, 0xD3, 0x78, 0x59, 0x89, 0x22, + 0x19, 0x44, 0x2B, 0xB0, 0xB9, 0xB9, 0xBA, 0x67, + 0xBA, 0x3B, 0xC0, 0xD0, 0x95, 0xC8, 0x80, 0x3C, + 0xEB, 0xE9, 0x7A, 0xFF, 0x0B, 0x1C, 0x15, 0x35, + 0x78, 0xA1, 0x30, 0xCD, 0x81, 0x57, 0xCF, 0x74, + 0x59, 0x46, 0xC2, 0xF5, 0x72, 0x6D, 0x9C, 0x11, + 0x27, 0x35, 0x75, 0x50, 0x52, 0x91, 0x34, 0x65, + 0x28, 0xEE, 0x0B, 0xAC, 0x04, 0x7C, 0xC9, 0x84, + 0x53, 0x8B, 0x97, 0xBB, 0xAB, 0xFC, 0xC3, 0x57, + 0xDC, 0xB8, 0xA9, 0x8F, 0xB8, 0x57, 0xC9, 0xC5, + 0x2D, 0x1B, 0x78, 0x67, 0x49, 0xCA, 0x61, 0x89, + 0x2B, 0x09, 0x75, 0x99, 0x80, 0x52, 0x00, 0x91, + 0xB9, 0xB4, 0x77, 0xC7, 0x0E, 0x6C, 0x46, 0x58, + 0x6B, 0x1C, 0xCE, 0xBE, 0x87, 0xBC, 0xF6, 0xDF, + 0x03, 0xC2, 0xB2, 0x7C, 0xB0, 0x9F, 0xA0, 0x3F, + 0x63, 0x16, 0x09, 0x58, 0x38, 0x3B, 0xE6, 0x36 + }; + static const byte dk_512[KYBER512_PRIVATE_KEY_SIZE] = { + 0x37, 0xEC, 0x47, 0x7E, 0x21, 0x7B, 0xFB, 0x40, + 0x38, 0x4C, 0x85, 0x0E, 0x51, 0xC1, 0x83, 0x71, + 0x58, 0xBD, 0xBC, 0x23, 0xA3, 0x18, 0x32, 0xBC, + 0x25, 0xC9, 0x1B, 0x31, 0x21, 0x44, 0x4A, 0xD4, + 0x53, 0x37, 0x33, 0xBA, 0xFF, 0x07, 0xCA, 0x81, + 0x7B, 0x64, 0xB2, 0xCA, 0x42, 0x99, 0xAA, 0x26, + 0x45, 0x4C, 0xBA, 0xFB, 0x35, 0xB6, 0xAB, 0xE1, + 0x18, 0x5C, 0xB4, 0x7C, 0x4C, 0xD6, 0x1A, 0xF9, + 0x83, 0x83, 0xC4, 0x81, 0x4B, 0x20, 0xAB, 0x87, + 0x54, 0xFC, 0x51, 0x4F, 0x23, 0x07, 0x41, 0x14, + 0xC3, 0xE5, 0xA8, 0x10, 0xA4, 0x53, 0xB8, 0x55, + 0xAA, 0x7F, 0x13, 0x10, 0xC7, 0x4B, 0x0B, 0x01, + 0xE5, 0xAA, 0xB2, 0xE8, 0x71, 0x73, 0x8F, 0xAC, + 0x27, 0x86, 0xC7, 0xA0, 0x5D, 0x6B, 0x3B, 0x32, + 0xA0, 0x50, 0xD0, 0xFB, 0x22, 0x39, 0x56, 0xC9, + 0x5C, 0xA0, 0xC2, 0xC1, 0xD5, 0x41, 0x54, 0xA7, + 0x7B, 0xD3, 0x37, 0x37, 0xA4, 0x9A, 0x00, 0x65, + 0xD1, 0x42, 0x4A, 0x2A, 0xBA, 0xFD, 0x52, 0xAA, + 0x93, 0x4C, 0x98, 0x04, 0x93, 0x92, 0x08, 0xF0, + 0x5C, 0xCF, 0x8B, 0x8B, 0x80, 0x86, 0x31, 0x6E, + 0x09, 0x43, 0xA0, 0x87, 0x10, 0x50, 0x0C, 0x91, + 0x8A, 0x2B, 0x21, 0x8D, 0x37, 0xB8, 0x5A, 0xE2, + 0x80, 0x22, 0xCB, 0x01, 0x34, 0xFB, 0x49, 0xF5, + 0xC4, 0x5D, 0x98, 0xD3, 0xC0, 0x4B, 0x75, 0x5A, + 0x60, 0x88, 0x04, 0x22, 0x66, 0x8E, 0x2B, 0x30, + 0x1B, 0x18, 0xD5, 0x19, 0x4D, 0xE9, 0x91, 0xB2, + 0x65, 0xBF, 0x94, 0x69, 0x7E, 0x6A, 0x4B, 0x81, + 0x50, 0xC8, 0xB8, 0x52, 0x03, 0x39, 0x15, 0x63, + 0x5E, 0x30, 0x66, 0x5B, 0xDA, 0x21, 0x91, 0xDA, + 0xA5, 0x05, 0xD4, 0x33, 0x44, 0xFD, 0x29, 0xC9, + 0xFC, 0xC1, 0xC5, 0x07, 0x69, 0x1D, 0x47, 0x5B, + 0x61, 0x7C, 0x94, 0x8F, 0xCC, 0x84, 0xB1, 0xB0, + 0x8A, 0x1C, 0x63, 0x8C, 0x3E, 0x13, 0x58, 0x0C, + 0xE3, 0x59, 0x78, 0x9A, 0x98, 0x60, 0xE5, 0x46, + 0x9C, 0xC7, 0x54, 0xB0, 0x8E, 0xE3, 0x3F, 0x09, + 0x21, 0xBD, 0xEF, 0x15, 0xA9, 0x06, 0x96, 0x9F, + 0x2D, 0xC5, 0x7A, 0x25, 0xE8, 0x0C, 0xE4, 0xC4, + 0x5F, 0x11, 0xE0, 0x4A, 0x51, 0x9A, 0xB0, 0x8B, + 0x9B, 0x92, 0x7C, 0x3A, 0x13, 0xA0, 0x81, 0xCF, + 0xFA, 0x11, 0x0F, 0xAC, 0xCC, 0x5E, 0x8D, 0xC2, + 0x94, 0x95, 0x97, 0x8B, 0x55, 0x53, 0x10, 0x4D, + 0x47, 0x3A, 0x17, 0x59, 0x18, 0xAD, 0x5B, 0x54, + 0x87, 0xBB, 0xA6, 0x97, 0x12, 0xAE, 0x93, 0xF6, + 0x15, 0xC6, 0x0A, 0x8D, 0x38, 0x7B, 0xCE, 0x3F, + 0x65, 0x1E, 0x56, 0x88, 0x0A, 0x52, 0x2B, 0x2D, + 0xB8, 0x63, 0x51, 0xCA, 0xB6, 0x5D, 0x13, 0xB4, + 0x69, 0x3D, 0xB0, 0xB2, 0xC8, 0x09, 0x36, 0xFA, + 0xD1, 0xCE, 0x67, 0x92, 0x5E, 0x6B, 0xB7, 0xC1, + 0x10, 0xC4, 0x3E, 0x83, 0x24, 0x7D, 0x22, 0x60, + 0x8D, 0x8C, 0x10, 0x23, 0x43, 0x1C, 0xB6, 0x92, + 0x90, 0xA4, 0xF8, 0xA9, 0x59, 0x3B, 0xF1, 0x24, + 0x1D, 0x73, 0x7C, 0x0C, 0xD1, 0x6D, 0x75, 0xEB, + 0x50, 0xC6, 0x84, 0x2C, 0xE0, 0xA2, 0x1D, 0xCE, + 0x49, 0x40, 0x36, 0x82, 0x4C, 0xE6, 0x32, 0x52, + 0xE9, 0x32, 0x5F, 0x05, 0xB7, 0x34, 0x45, 0x2B, + 0x12, 0x91, 0x32, 0xB1, 0x96, 0x08, 0x4A, 0x37, + 0x88, 0xBB, 0xB1, 0xF2, 0x0A, 0x37, 0xD2, 0xC2, + 0xB3, 0xF9, 0x0E, 0x0D, 0xD7, 0xA2, 0x74, 0xC9, + 0xB1, 0xA9, 0xF0, 0x2E, 0xC7, 0xE7, 0x21, 0xF4, + 0xA4, 0x3D, 0x40, 0x9A, 0x25, 0xFB, 0xC9, 0x9A, + 0x44, 0xD4, 0x76, 0x31, 0x07, 0xC7, 0x87, 0x62, + 0x09, 0x41, 0x76, 0x1E, 0xD4, 0x8C, 0x93, 0x29, + 0x24, 0xBA, 0x62, 0x09, 0x86, 0xCF, 0x27, 0x7A, + 0x23, 0x47, 0x1C, 0x7B, 0x13, 0x33, 0x3D, 0x93, + 0x6C, 0x0D, 0xD4, 0x9E, 0x0F, 0xF3, 0x4C, 0xA3, + 0xAB, 0x82, 0x34, 0xC4, 0x2A, 0xEB, 0xE4, 0x59, + 0xC6, 0x12, 0x05, 0x2B, 0x97, 0x16, 0xE9, 0x6B, + 0x20, 0xBE, 0xC7, 0x18, 0x12, 0x60, 0x40, 0xA9, + 0x09, 0x1F, 0x6B, 0xA9, 0x44, 0x5F, 0x45, 0x80, + 0x6A, 0xEB, 0x6E, 0x38, 0x16, 0x71, 0x0F, 0x7C, + 0xBF, 0xED, 0x11, 0x01, 0x46, 0x12, 0x84, 0xDD, + 0x96, 0x2B, 0x7B, 0x12, 0x04, 0x7C, 0x0A, 0x0A, + 0x90, 0x6A, 0x05, 0x89, 0xB4, 0xA9, 0xA4, 0x26, + 0x46, 0x9B, 0xDA, 0x39, 0x46, 0x09, 0x1A, 0x37, + 0x5B, 0x19, 0x52, 0xA9, 0x1C, 0x23, 0x1C, 0x0F, + 0xE6, 0xB5, 0x7F, 0x7C, 0xC9, 0x7E, 0xFE, 0xD0, + 0xBC, 0x10, 0x01, 0x36, 0x78, 0x23, 0xBE, 0x18, + 0x86, 0x30, 0x8B, 0x3A, 0x21, 0x45, 0x2B, 0x7E, + 0x45, 0x50, 0x66, 0x71, 0x9C, 0xCC, 0xEA, 0xF6, + 0xA7, 0x26, 0xFC, 0x22, 0xBC, 0x83, 0x99, 0xF5, + 0x4B, 0xBF, 0xCA, 0xF7, 0xCA, 0x63, 0xBA, 0x73, + 0x17, 0x3C, 0x7A, 0xA8, 0x61, 0x9A, 0x3F, 0x48, + 0x5C, 0x3E, 0x33, 0x04, 0x21, 0x00, 0x67, 0x66, + 0x74, 0x6F, 0x4E, 0xF6, 0x65, 0x3E, 0x44, 0x0E, + 0x5C, 0xDC, 0x59, 0x53, 0x40, 0x18, 0xC3, 0x52, + 0xC0, 0x23, 0x58, 0x4C, 0xBB, 0x37, 0x4E, 0xB7, + 0xA9, 0xB7, 0x83, 0x68, 0x32, 0xBE, 0x53, 0xAF, + 0x27, 0x2A, 0x06, 0x97, 0x55, 0xCE, 0x2F, 0xF2, + 0x9C, 0xD8, 0xB3, 0x94, 0xC5, 0x24, 0x22, 0xB3, + 0x47, 0x0E, 0x27, 0x41, 0x5F, 0x41, 0xB3, 0x97, + 0x53, 0x59, 0x59, 0xF1, 0x60, 0x00, 0x3B, 0x45, + 0x2C, 0xF4, 0x96, 0x97, 0xB7, 0xA5, 0x36, 0x89, + 0x85, 0x2B, 0xBE, 0x6C, 0xCF, 0xDF, 0xB4, 0x0B, + 0x48, 0xE9, 0x32, 0x8D, 0xE1, 0x15, 0x22, 0xD0, + 0xA4, 0x31, 0xB1, 0x15, 0xA5, 0xC0, 0xC2, 0xF4, + 0x30, 0x7D, 0x98, 0x62, 0xC0, 0xDD, 0x1B, 0x40, + 0xC6, 0x5A, 0x1D, 0x9D, 0x47, 0x97, 0x77, 0xE6, + 0x90, 0x5A, 0x91, 0xA5, 0xCB, 0x24, 0x55, 0x1C, + 0x8B, 0x1E, 0x52, 0xA3, 0xC7, 0x7B, 0x63, 0x31, + 0x3F, 0xFC, 0x8B, 0x58, 0x17, 0x81, 0x52, 0x59, + 0xA6, 0xAD, 0xB5, 0x96, 0x45, 0xDC, 0x4B, 0xB1, + 0x43, 0x6D, 0x51, 0xE6, 0x2A, 0x09, 0x68, 0x34, + 0xAF, 0x43, 0x77, 0x25, 0x10, 0xC4, 0xED, 0xF3, + 0x4C, 0xDE, 0x0A, 0x5B, 0x57, 0xC1, 0x45, 0xE6, + 0x87, 0xCB, 0x87, 0x16, 0x2F, 0x00, 0x1C, 0x21, + 0xC9, 0xE1, 0x93, 0x4A, 0xC1, 0x1A, 0xAF, 0xA7, + 0x0F, 0xF8, 0x10, 0x73, 0x26, 0x50, 0xB3, 0x2A, + 0x30, 0x18, 0xA7, 0xC5, 0x0C, 0xD7, 0x36, 0x79, + 0x62, 0x22, 0xC8, 0xAB, 0x82, 0x1A, 0x92, 0x83, + 0xBE, 0x1C, 0xC2, 0x04, 0xC3, 0xF1, 0x63, 0x0D, + 0x3C, 0xCC, 0xDB, 0x0A, 0x9A, 0x3D, 0x17, 0x55, + 0x2B, 0x91, 0x58, 0xC0, 0x66, 0x4E, 0x5D, 0x6A, + 0x04, 0xB0, 0xFA, 0x36, 0xDE, 0x45, 0x86, 0x2A, + 0x46, 0xA3, 0x9E, 0xC5, 0x97, 0xAE, 0x42, 0xC3, + 0x11, 0xC4, 0xAC, 0x22, 0x4A, 0x72, 0xD6, 0xF2, + 0x53, 0xBB, 0x52, 0x35, 0xF7, 0xA2, 0xB8, 0xB0, + 0xF2, 0x4D, 0x13, 0x76, 0xAF, 0x58, 0x87, 0x46, + 0xF3, 0xBB, 0x8E, 0x03, 0x65, 0x07, 0x87, 0x61, + 0xCA, 0xB9, 0x83, 0xA4, 0xA6, 0xA9, 0x40, 0xA3, + 0xD9, 0x97, 0x04, 0x7A, 0x8F, 0x36, 0xA7, 0x31, + 0xE8, 0x96, 0x52, 0x36, 0xC3, 0x7B, 0xF2, 0x00, + 0x08, 0x2F, 0x82, 0x1D, 0xCA, 0x77, 0x16, 0xC4, + 0x44, 0xA9, 0x0B, 0xEC, 0x53, 0x07, 0x4B, 0xBA, + 0x58, 0xC1, 0x32, 0xBF, 0xB9, 0xA2, 0xAC, 0xE2, + 0xCE, 0xC9, 0xAA, 0x65, 0x8E, 0xAC, 0x12, 0x32, + 0xCC, 0xCA, 0x3C, 0x81, 0x7A, 0x92, 0xC1, 0x19, + 0x5C, 0x05, 0xC0, 0xE1, 0xD6, 0x63, 0x9F, 0xD2, + 0xAD, 0xE5, 0x31, 0x60, 0x7D, 0x48, 0x8B, 0x74, + 0xA7, 0x47, 0xCF, 0xF4, 0x7F, 0xCA, 0x5C, 0x8B, + 0x21, 0x63, 0xCA, 0x03, 0xC5, 0x45, 0xED, 0x10, + 0x32, 0x78, 0x43, 0x0C, 0x60, 0xB2, 0x38, 0x1A, + 0x09, 0x42, 0x7F, 0xD1, 0x30, 0xF8, 0x59, 0xBF, + 0x5D, 0xB7, 0x76, 0xDA, 0x09, 0x5D, 0xCA, 0x58, + 0x04, 0xFA, 0x63, 0xB0, 0xD7, 0xD8, 0x7F, 0xA9, + 0x41, 0x5C, 0x72, 0xFB, 0x51, 0x87, 0x2A, 0x98, + 0x9F, 0x46, 0x6C, 0x98, 0x4B, 0xC7, 0x4C, 0x29, + 0xB8, 0x63, 0x20, 0x19, 0xCA, 0x04, 0x0C, 0x9C, + 0xA3, 0x5E, 0x22, 0x60, 0x8D, 0xAA, 0x70, 0x35, + 0x7A, 0xE2, 0xC3, 0xAD, 0x83, 0x63, 0x1F, 0xAA, + 0x17, 0x4E, 0x0A, 0xCD, 0xF5, 0xDB, 0xBF, 0x3C, + 0xF6, 0x8A, 0x05, 0xB6, 0x54, 0x3A, 0xB6, 0x26, + 0x8E, 0x1A, 0x51, 0xB0, 0x93, 0x2C, 0x17, 0xB0, + 0x0A, 0x13, 0x71, 0xB2, 0xDA, 0xB2, 0x41, 0xF9, + 0x2A, 0x43, 0xFF, 0xB4, 0x56, 0xD0, 0xA8, 0xC8, + 0x86, 0x0A, 0x8E, 0x28, 0xA6, 0x1A, 0x21, 0x30, + 0x7C, 0xC0, 0x45, 0x6D, 0xA4, 0x24, 0x29, 0x05, + 0xCB, 0x1D, 0x3D, 0x0B, 0xBD, 0x81, 0xBB, 0x8E, + 0xE2, 0x74, 0xA4, 0x3C, 0x76, 0xC3, 0x10, 0x01, + 0x95, 0x15, 0xFC, 0xC1, 0x40, 0x46, 0x7C, 0x33, + 0x37, 0x0C, 0x86, 0x80, 0x8E, 0xCA, 0xA5, 0x8E, + 0x3B, 0xA9, 0x3A, 0x2C, 0x11, 0x90, 0x46, 0x1C, + 0x1D, 0xFA, 0x11, 0x30, 0x20, 0x01, 0xBB, 0xAB, + 0x4C, 0xB1, 0xE3, 0x64, 0x2E, 0xF8, 0xCB, 0x26, + 0x30, 0x9B, 0x60, 0x52, 0x3B, 0xC2, 0x18, 0x87, + 0xB0, 0x7F, 0x89, 0x8C, 0xE5, 0x62, 0xA6, 0xCA, + 0x77, 0x8E, 0xA0, 0x15, 0x05, 0x85, 0x13, 0x78, + 0xCE, 0xA8, 0xBB, 0x7F, 0xC0, 0x9D, 0x11, 0x96, + 0x1B, 0x6C, 0x59, 0x6F, 0x93, 0x54, 0x2A, 0x99, + 0x04, 0x86, 0x4E, 0xB1, 0x0C, 0xD0, 0xA7, 0x03, + 0xDB, 0xA9, 0x89, 0x21, 0x86, 0x1A, 0x87, 0xB0, + 0x56, 0x52, 0x5C, 0x71, 0xA8, 0x43, 0x55, 0x3E, + 0x64, 0x00, 0x77, 0x74, 0x37, 0xC9, 0x5C, 0xCC, + 0x80, 0x85, 0xCC, 0x0C, 0x47, 0x7D, 0x66, 0x5A, + 0x44, 0x79, 0x01, 0x9D, 0x4C, 0xD4, 0x42, 0xF7, + 0x4A, 0x3C, 0xD8, 0x16, 0x9F, 0x42, 0x62, 0xB8, + 0x27, 0x1B, 0x5D, 0x5A, 0x67, 0xC8, 0xC1, 0x61, + 0x1A, 0xAE, 0x7B, 0x3D, 0x05, 0x34, 0xC0, 0x85, + 0x97, 0x16, 0xFD, 0xF0, 0xBB, 0x68, 0x94, 0x90, + 0x94, 0xC0, 0x6A, 0x1B, 0x73, 0xC9, 0xAA, 0x1C, + 0xBD, 0xF3, 0x31, 0x54, 0x3D, 0xE0, 0x02, 0xA8, + 0xC0, 0x6F, 0x94, 0xE8, 0x81, 0x0A, 0x5C, 0xB3, + 0x73, 0x83, 0x27, 0x45, 0xD7, 0x20, 0x68, 0x3B, + 0x57, 0x48, 0x75, 0xA6, 0x66, 0x94, 0x6D, 0x02, + 0x96, 0x89, 0x3F, 0x2B, 0x59, 0xE9, 0x07, 0x48, + 0x8D, 0x8C, 0x84, 0x89, 0xD4, 0x74, 0xD9, 0x29, + 0xA0, 0x5A, 0x57, 0x3E, 0xD6, 0x67, 0x49, 0x03, + 0x71, 0xA4, 0x6D, 0x45, 0x56, 0xCB, 0xB6, 0x8A, + 0xAA, 0x79, 0xCC, 0x3E, 0xC6, 0x65, 0x34, 0x13, + 0x57, 0x6C, 0x22, 0x8E, 0x37, 0x9A, 0x14, 0xCB, + 0x90, 0xB7, 0xB7, 0x59, 0x1B, 0x19, 0xA7, 0xBD, + 0x37, 0xA1, 0xC4, 0xD3, 0x78, 0x59, 0x89, 0x22, + 0x19, 0x44, 0x2B, 0xB0, 0xB9, 0xB9, 0xBA, 0x67, + 0xBA, 0x3B, 0xC0, 0xD0, 0x95, 0xC8, 0x80, 0x3C, + 0xEB, 0xE9, 0x7A, 0xFF, 0x0B, 0x1C, 0x15, 0x35, + 0x78, 0xA1, 0x30, 0xCD, 0x81, 0x57, 0xCF, 0x74, + 0x59, 0x46, 0xC2, 0xF5, 0x72, 0x6D, 0x9C, 0x11, + 0x27, 0x35, 0x75, 0x50, 0x52, 0x91, 0x34, 0x65, + 0x28, 0xEE, 0x0B, 0xAC, 0x04, 0x7C, 0xC9, 0x84, + 0x53, 0x8B, 0x97, 0xBB, 0xAB, 0xFC, 0xC3, 0x57, + 0xDC, 0xB8, 0xA9, 0x8F, 0xB8, 0x57, 0xC9, 0xC5, + 0x2D, 0x1B, 0x78, 0x67, 0x49, 0xCA, 0x61, 0x89, + 0x2B, 0x09, 0x75, 0x99, 0x80, 0x52, 0x00, 0x91, + 0xB9, 0xB4, 0x77, 0xC7, 0x0E, 0x6C, 0x46, 0x58, + 0x6B, 0x1C, 0xCE, 0xBE, 0x87, 0xBC, 0xF6, 0xDF, + 0x03, 0xC2, 0xB2, 0x7C, 0xB0, 0x9F, 0xA0, 0x3F, + 0x63, 0x16, 0x09, 0x58, 0x38, 0x3B, 0xE6, 0x36, + 0xC0, 0xEC, 0xC8, 0xDD, 0xAE, 0x8B, 0x59, 0x4A, + 0x14, 0x03, 0x78, 0x68, 0xBE, 0xC0, 0xB2, 0x23, + 0x00, 0xDE, 0xFD, 0xFA, 0xA1, 0xD9, 0x73, 0xAC, + 0x5C, 0xEC, 0x84, 0xAE, 0x43, 0x86, 0xB8, 0xFB, + 0xCD, 0x11, 0x9A, 0xFD, 0xC8, 0x55, 0x94, 0x42, + 0x42, 0x4A, 0x87, 0xC1, 0x3E, 0xA1, 0x01, 0xE2, + 0x9F, 0xCA, 0x11, 0x88, 0x18, 0x69, 0x07, 0x7E, + 0x40, 0x92, 0xE7, 0x51, 0xBE, 0xDC, 0xA8, 0xBC + }; +#endif +#ifndef WOLFSSL_NO_KYBER768 + static const byte seed_768[KYBER_MAKEKEY_RAND_SZ] = { + 0x92, 0xAC, 0x7D, 0x1F, 0x83, 0xBA, 0xFA, 0xE6, + 0xEE, 0x86, 0xFE, 0x00, 0xF9, 0x5D, 0x81, 0x33, + 0x75, 0x77, 0x24, 0x34, 0x86, 0x0F, 0x5F, 0xF7, + 0xD5, 0x4F, 0xFC, 0x37, 0x39, 0x9B, 0xC4, 0xCC, + 0x92, 0xAC, 0x7D, 0x1F, 0x83, 0xBA, 0xFA, 0xE6, + 0xEE, 0x86, 0xFE, 0x00, 0xF9, 0x5D, 0x81, 0x33, + 0x75, 0x77, 0x24, 0x34, 0x86, 0x0F, 0x5F, 0xF7, + 0xD5, 0x4F, 0xFC, 0x37, 0x39, 0x9B, 0xC4, 0xCC + }; + static const byte ek_768[KYBER768_PUBLIC_KEY_SIZE] = { + 0xD2, 0xE6, 0x9A, 0x05, 0x53, 0x4A, 0x72, 0x32, + 0xC5, 0xF1, 0xB7, 0x66, 0xE9, 0x3A, 0x5E, 0xE2, + 0xEA, 0x1B, 0x26, 0xE8, 0x60, 0xA3, 0x44, 0x1A, + 0xDE, 0xA9, 0x1E, 0xDB, 0x78, 0x2C, 0xAB, 0xC8, + 0xA5, 0xD0, 0x11, 0xA2, 0x1B, 0xC3, 0x88, 0xE7, + 0xF4, 0x86, 0xF0, 0xB7, 0x99, 0x30, 0x79, 0xAE, + 0x3F, 0x1A, 0x7C, 0x85, 0xD2, 0x7D, 0x0F, 0x49, + 0x21, 0x84, 0xD5, 0x90, 0x62, 0x14, 0x2B, 0x76, + 0xA4, 0x37, 0x34, 0xA9, 0x0D, 0x55, 0x6A, 0x95, + 0xDC, 0x48, 0x3D, 0xD8, 0x21, 0x04, 0xED, 0x58, + 0xCA, 0x15, 0x71, 0xC3, 0x96, 0x85, 0x82, 0x79, + 0x51, 0x43, 0x4C, 0xC1, 0x00, 0x1A, 0xA4, 0xC8, + 0x13, 0x26, 0x1E, 0x4F, 0x93, 0x02, 0x8E, 0x14, + 0xCD, 0x08, 0xF7, 0x68, 0xA4, 0x54, 0x31, 0x0C, + 0x3B, 0x01, 0x0C, 0x83, 0xB7, 0x4D, 0x04, 0xA5, + 0x7B, 0xB9, 0x77, 0xB3, 0xD8, 0xBC, 0xF3, 0xAA, + 0xA7, 0x8C, 0xA1, 0x2B, 0x78, 0xF0, 0x10, 0xD9, + 0x51, 0x34, 0x92, 0x8A, 0x5E, 0x5D, 0x96, 0xA0, + 0x29, 0xB4, 0x42, 0xA4, 0x18, 0x88, 0x03, 0x8B, + 0x29, 0xC2, 0xF1, 0x22, 0xB0, 0xB6, 0xB3, 0xAF, + 0x12, 0x1A, 0xEA, 0x29, 0xA0, 0x55, 0x53, 0xBD, + 0xF1, 0xDB, 0x60, 0x7A, 0xFB, 0x17, 0x00, 0x18, + 0x60, 0xAF, 0x18, 0x23, 0xBC, 0xF0, 0x3D, 0xB3, + 0xB4, 0x41, 0xDA, 0x16, 0x3A, 0x28, 0xC5, 0x23, + 0xA5, 0xFB, 0x46, 0x69, 0xA6, 0x42, 0x34, 0xA4, + 0xBC, 0xD1, 0x21, 0x7F, 0xF2, 0x63, 0x5B, 0xD9, + 0x76, 0x80, 0xFF, 0x93, 0x8D, 0xBC, 0xF1, 0x0E, + 0x95, 0x32, 0xA9, 0xA7, 0x9A, 0x5B, 0x07, 0x3A, + 0x9E, 0x8D, 0xB2, 0x12, 0x3D, 0x21, 0x0F, 0xAE, + 0xA2, 0x00, 0xB6, 0x64, 0x83, 0x8E, 0x80, 0x07, + 0x1F, 0x2B, 0xA2, 0x54, 0xAA, 0xC8, 0x90, 0xA4, + 0x6E, 0x28, 0xEC, 0x34, 0x2D, 0x92, 0x81, 0x2B, + 0x01, 0x59, 0x30, 0x71, 0x65, 0x7E, 0x7A, 0x3A, + 0x4A, 0x75, 0xCB, 0x3D, 0x52, 0x79, 0xCE, 0x88, + 0x40, 0x5A, 0xC5, 0xAD, 0xAC, 0xB2, 0x05, 0x1E, + 0x02, 0x2E, 0xE0, 0xAC, 0x9B, 0xBF, 0xE3, 0x2D, + 0xEF, 0x98, 0x66, 0x7E, 0xD3, 0x47, 0xAD, 0xCB, + 0x39, 0x30, 0xF3, 0xCA, 0xD0, 0x31, 0x39, 0x1B, + 0x70, 0x9A, 0x4E, 0x61, 0xB8, 0xDD, 0x4B, 0x3F, + 0xB7, 0x41, 0xB5, 0xBD, 0x60, 0xBF, 0x30, 0x40, + 0x15, 0xEE, 0x75, 0x46, 0xA2, 0x4B, 0x59, 0xEA, + 0xDC, 0xA1, 0x37, 0xC7, 0x12, 0x50, 0x74, 0x72, + 0x6B, 0x76, 0x86, 0xEC, 0x55, 0x1B, 0x7B, 0xC2, + 0x6B, 0xBD, 0xB2, 0x0F, 0xC3, 0x78, 0x35, 0x34, + 0xE3, 0x4E, 0xE1, 0xF1, 0xBC, 0x6B, 0x77, 0xAB, + 0x49, 0xA6, 0x66, 0x78, 0x46, 0x97, 0x57, 0x78, + 0xC3, 0xC5, 0x36, 0x83, 0x04, 0x50, 0xA3, 0xFA, + 0x91, 0x02, 0x59, 0x72, 0x2F, 0x3F, 0x80, 0x6E, + 0x6E, 0xB4, 0xB9, 0x34, 0x67, 0x63, 0xFE, 0xF0, + 0x92, 0x2B, 0xC4, 0xB6, 0xEB, 0x38, 0x26, 0xAF, + 0xF2, 0x4E, 0xAD, 0xC6, 0xCF, 0x6E, 0x47, 0x7C, + 0x2E, 0x05, 0x5C, 0xFB, 0x7A, 0x90, 0xA5, 0x5C, + 0x06, 0xD0, 0xB2, 0xA2, 0xF5, 0x11, 0x60, 0x69, + 0xE6, 0x4A, 0x5B, 0x50, 0x78, 0xC0, 0x57, 0x7B, + 0xC8, 0xE7, 0x90, 0x0E, 0xA7, 0x1C, 0x34, 0x1C, + 0x02, 0xAD, 0x85, 0x4E, 0xA5, 0xA0, 0x1A, 0xF2, + 0xA6, 0x05, 0xCB, 0x20, 0x68, 0xD5, 0x24, 0x38, + 0xCD, 0xDC, 0x60, 0xB0, 0x38, 0x82, 0xCC, 0x02, + 0x4D, 0x13, 0x04, 0x5F, 0x2B, 0xA6, 0xB0, 0xF4, + 0x46, 0xAA, 0xA5, 0x95, 0x87, 0x60, 0x61, 0x79, + 0x45, 0x37, 0x1F, 0xD7, 0x8C, 0x28, 0xA4, 0x06, + 0x77, 0xA6, 0xE7, 0x2F, 0x51, 0x3B, 0x9E, 0x06, + 0x67, 0xA9, 0xBA, 0xF4, 0x46, 0xC1, 0xBA, 0x93, + 0x1B, 0xA8, 0x18, 0x34, 0x23, 0x47, 0x92, 0xA2, + 0xA2, 0xB2, 0xB3, 0x70, 0x1F, 0x31, 0xB7, 0xCF, + 0x46, 0x7C, 0x80, 0xF1, 0x98, 0x11, 0x41, 0xBB, + 0x45, 0x77, 0x93, 0xE1, 0x30, 0x70, 0x91, 0xC4, + 0x8B, 0x59, 0x14, 0x64, 0x6A, 0x60, 0xCE, 0x1A, + 0x30, 0x15, 0x43, 0x77, 0x9D, 0x7C, 0x33, 0x42, + 0xAD, 0x17, 0x97, 0x96, 0xC2, 0xC4, 0x40, 0xD9, + 0x9D, 0xF9, 0xD4, 0x1B, 0x52, 0xE3, 0x26, 0x25, + 0xA8, 0x2A, 0xA5, 0xF5, 0x79, 0xA9, 0x92, 0x0B, + 0xFF, 0xBA, 0x96, 0x4F, 0xA7, 0x0D, 0xB2, 0x59, + 0xC8, 0x5E, 0x68, 0xC8, 0x13, 0x81, 0x7B, 0x13, + 0x47, 0xBF, 0x19, 0x81, 0x4D, 0xA5, 0xE9, 0x36, + 0x4A, 0x46, 0x45, 0xE6, 0x21, 0x92, 0x3D, 0x95, + 0x5C, 0x21, 0x1A, 0x55, 0xD3, 0x55, 0xC8, 0x16, + 0xDA, 0x04, 0x73, 0x0A, 0xA3, 0x24, 0x08, 0x5E, + 0x62, 0x2B, 0x51, 0xD6, 0x10, 0x9B, 0x49, 0xF6, + 0x73, 0xAD, 0xD0, 0x0E, 0x41, 0x47, 0x55, 0xC8, + 0x02, 0x4A, 0xA0, 0x16, 0x4F, 0x24, 0x55, 0x6D, + 0xED, 0x96, 0x3D, 0x61, 0x14, 0x38, 0x56, 0xCB, + 0x4F, 0xF0, 0x56, 0x7E, 0x33, 0x20, 0x73, 0x0D, + 0xBC, 0xBF, 0x12, 0xF6, 0x6E, 0x2B, 0x70, 0xB2, + 0x00, 0x54, 0xA6, 0xDE, 0xA4, 0x26, 0x14, 0xB5, + 0x0E, 0xF7, 0x2B, 0x15, 0x6F, 0x51, 0x49, 0xFC, + 0x26, 0x3D, 0xD7, 0xE0, 0x39, 0xC5, 0x5A, 0x3E, + 0xE9, 0x82, 0x7D, 0xF9, 0x2C, 0x56, 0x5D, 0x24, + 0xC5, 0x5E, 0x0A, 0x81, 0xC6, 0x49, 0x46, 0x95, + 0x34, 0x4D, 0x94, 0x87, 0x48, 0xAF, 0xBA, 0x9F, + 0x76, 0x2C, 0x0E, 0xA9, 0x0B, 0xB7, 0x24, 0x89, + 0x79, 0x02, 0x00, 0x07, 0x75, 0x61, 0x39, 0x49, + 0x60, 0x2C, 0x48, 0xC7, 0x8A, 0x94, 0x40, 0x67, + 0x8C, 0x24, 0x08, 0x6D, 0x32, 0x6D, 0x79, 0x64, + 0x3B, 0xAF, 0x70, 0x36, 0xC6, 0x6C, 0x7E, 0x02, + 0x6A, 0xAE, 0xFD, 0xA2, 0x80, 0x7A, 0x60, 0xBD, + 0x7F, 0xC9, 0x13, 0x63, 0xBB, 0x02, 0x34, 0xA5, + 0x90, 0x98, 0x4A, 0xA0, 0x11, 0xF1, 0x1D, 0x40, + 0x26, 0x82, 0x18, 0xA1, 0x58, 0x83, 0x77, 0xB3, + 0xD7, 0x67, 0x1B, 0x8B, 0x99, 0x78, 0x99, 0x19, + 0xB8, 0x6E, 0xE8, 0x2B, 0x18, 0xEC, 0x22, 0xD4, + 0xE8, 0x0A, 0x1F, 0x27, 0x85, 0x3D, 0x88, 0x94, + 0x19, 0xD4, 0x60, 0xDE, 0xF7, 0x56, 0x7A, 0xA4, + 0x56, 0x79, 0x69, 0xC4, 0x30, 0x48, 0xC3, 0x2B, + 0x84, 0x62, 0xA9, 0xC9, 0x38, 0x6E, 0xB3, 0x15, + 0x2A, 0x69, 0x76, 0xAA, 0x78, 0x3C, 0xDD, 0x1A, + 0x8C, 0x57, 0xA9, 0xB6, 0xBB, 0xD8, 0x37, 0xA0, + 0x06, 0x24, 0xB5, 0x8B, 0x4B, 0xA3, 0xDB, 0xB6, + 0x3B, 0xB8, 0x20, 0x0E, 0x7B, 0xC8, 0x88, 0x81, + 0xBE, 0xBD, 0xA9, 0x25, 0xBC, 0xA0, 0x28, 0xE2, + 0x91, 0xAA, 0x1C, 0x22, 0x53, 0x9C, 0xD0, 0x4F, + 0x90, 0x09, 0x0D, 0x7F, 0x74, 0x10, 0x8C, 0x32, + 0xB8, 0x02, 0x2C, 0x15, 0x91, 0xC8, 0x81, 0xE7, + 0x63, 0x04, 0xE2, 0x40, 0x81, 0x90, 0xE2, 0x0F, + 0x09, 0xA5, 0x4F, 0xC2, 0x34, 0x20, 0xE2, 0x62, + 0x0E, 0x9D, 0x87, 0xA3, 0x10, 0x8A, 0x94, 0xFE, + 0xEA, 0x72, 0xD5, 0xAB, 0x7F, 0xCF, 0xB9, 0x72, + 0xE6, 0x56, 0x1B, 0x1A, 0x7B, 0x06, 0x2F, 0x1A, + 0x68, 0x2E, 0x02, 0x0A, 0xA2, 0x56, 0x28, 0x12, + 0xB2, 0x96, 0x54, 0x7B, 0x91, 0x78, 0x24, 0xCD, + 0xB8, 0x8C, 0x58, 0x2B, 0x5A, 0x68, 0x90, 0x17, + 0x7B, 0xC7, 0x0C, 0x91, 0xAC, 0xAC, 0x9A, 0xBE, + 0x29, 0x0A, 0xEB, 0x2C, 0x34, 0xA7, 0xE2, 0x36, + 0x89, 0x55, 0xCB, 0x45, 0x6A, 0x34, 0x53, 0x68, + 0xAB, 0xE3, 0xB9, 0x1B, 0x47, 0xFC, 0x30, 0xB0, + 0x23, 0x3A, 0x09, 0xBA, 0x79, 0xFB, 0x11, 0x23, + 0x8A, 0xC5, 0x08, 0xCC, 0xE6, 0x10, 0x95, 0xF8, + 0x54, 0xC2, 0x32, 0x04, 0xA8, 0xD3, 0x6B, 0xFC, + 0x2C, 0x6E, 0x05, 0xA7, 0x2A, 0xF5, 0x24, 0x4B, + 0x17, 0xC1, 0x21, 0x01, 0xE0, 0x14, 0x51, 0x57, + 0x0E, 0xB1, 0x10, 0x56, 0x7E, 0x85, 0x0E, 0x79, + 0xC0, 0x00, 0x14, 0x24, 0x41, 0xFE, 0x41, 0x60, + 0x02, 0x75, 0x45, 0xF6, 0x29, 0x0E, 0x85, 0x45, + 0x1B, 0x80, 0x23, 0x4A, 0x94, 0x06, 0xC3, 0x90, + 0xB0, 0xCE, 0xA3, 0xC8, 0x33, 0x5D, 0x4C, 0x6F, + 0x85, 0x50, 0xB5, 0x44, 0xC9, 0x34, 0x3E, 0x61, + 0xBA, 0x1C, 0x84, 0x89, 0xD1, 0xB0, 0x39, 0x97, + 0x39, 0x16, 0x8A, 0xF7, 0x40, 0xA4, 0x81, 0xB0, + 0xF5, 0xC3, 0x37, 0x25, 0x30, 0xCA, 0x06, 0xB5, + 0x08, 0xEC, 0xE8, 0x38, 0xAB, 0x78, 0xBE, 0xE1, + 0xE5, 0x97, 0xA9, 0xB1, 0x4F, 0x6A, 0xEC, 0x7A, + 0x3B, 0xD1, 0xAA, 0x8D, 0x10, 0xBA, 0xC2, 0x3B, + 0x98, 0x02, 0x90, 0x2C, 0xD5, 0x29, 0xAB, 0x6E, + 0xF5, 0x4D, 0xB3, 0x11, 0x0C, 0xFB, 0x56, 0x1E, + 0x7E, 0x69, 0x48, 0xE6, 0x52, 0x81, 0x25, 0x04, + 0x16, 0xC3, 0x49, 0xC8, 0x10, 0x0B, 0x3B, 0x4D, + 0x3D, 0x0F, 0x62, 0xAC, 0xAD, 0x8D, 0x16, 0x11, + 0x75, 0xB1, 0x34, 0xF7, 0x56, 0x49, 0x37, 0xCD + }; + static const byte dk_768[KYBER768_PRIVATE_KEY_SIZE] = { + 0x19, 0xD7, 0x4A, 0xD5, 0x47, 0x2A, 0x8B, 0x2B, + 0xAA, 0xD2, 0xA5, 0x67, 0x02, 0xC9, 0xB3, 0xB5, + 0x51, 0x0E, 0xF3, 0x92, 0x48, 0x58, 0x06, 0x1D, + 0x57, 0xF9, 0x0D, 0xD9, 0xA1, 0xA0, 0x1F, 0xEC, + 0x2F, 0x57, 0xC5, 0x1A, 0x88, 0x88, 0x05, 0x34, + 0x1B, 0x61, 0x7C, 0x51, 0x55, 0x39, 0x59, 0x77, + 0x50, 0x83, 0x5C, 0x3E, 0xD7, 0xA0, 0x33, 0xB0, + 0x39, 0xD7, 0x24, 0x91, 0x33, 0x2C, 0x5D, 0xF4, + 0xA6, 0x9B, 0x6D, 0xF2, 0x61, 0x71, 0x87, 0x7A, + 0xD1, 0xE5, 0x0A, 0xC5, 0x01, 0x00, 0xBE, 0x47, + 0x28, 0x78, 0x66, 0x85, 0xDA, 0x7A, 0x73, 0x9E, + 0x84, 0x3F, 0xF0, 0xD4, 0x59, 0x22, 0xD7, 0x28, + 0x1E, 0x21, 0x0D, 0x5E, 0x82, 0xB9, 0x44, 0x65, + 0x2F, 0x48, 0x62, 0xCF, 0xB3, 0xD9, 0x02, 0xDE, + 0x60, 0xAF, 0xD0, 0xA1, 0x64, 0x47, 0x1B, 0x26, + 0x14, 0x4A, 0x1D, 0x7A, 0x38, 0x09, 0x65, 0x03, + 0x09, 0x59, 0x11, 0x76, 0x2E, 0xBA, 0x79, 0x62, + 0xC4, 0x51, 0x1D, 0x05, 0xA1, 0x28, 0xF2, 0x78, + 0x1E, 0xCB, 0x3D, 0x1F, 0x5B, 0xB1, 0x24, 0x42, + 0x37, 0x61, 0x1A, 0xBA, 0xB9, 0x24, 0x99, 0x1F, + 0x8A, 0x27, 0x32, 0xE2, 0x70, 0x32, 0x35, 0x79, + 0x20, 0xF1, 0x97, 0xC7, 0x69, 0x2D, 0x60, 0xA9, + 0x44, 0x44, 0x72, 0x25, 0x8C, 0xB4, 0x57, 0xC1, + 0xB7, 0x1B, 0x77, 0x99, 0x54, 0x69, 0xF3, 0xA9, + 0x62, 0xF3, 0xAB, 0xA6, 0x69, 0x96, 0x14, 0xFC, + 0xCC, 0xEA, 0x74, 0x1E, 0x21, 0xC6, 0x00, 0xC4, + 0x35, 0x7B, 0xBF, 0xAB, 0x45, 0x29, 0x27, 0xC3, + 0xD4, 0x41, 0xBF, 0x8E, 0xD7, 0x31, 0x52, 0xF7, + 0x5C, 0x08, 0xF5, 0x40, 0xE1, 0x86, 0xAC, 0xCA, + 0x33, 0x26, 0xF4, 0x22, 0xC8, 0x4B, 0x98, 0x8D, + 0x77, 0xE6, 0x1A, 0xE6, 0x18, 0x59, 0xCF, 0x85, + 0x41, 0xF8, 0x92, 0x09, 0xE4, 0x98, 0x30, 0x40, + 0xC5, 0x61, 0x76, 0x54, 0x80, 0x88, 0x52, 0xB6, + 0x49, 0xB8, 0x99, 0xA3, 0x99, 0xAE, 0xC2, 0xC8, + 0xBB, 0xA8, 0xA5, 0x42, 0xF3, 0x45, 0xAB, 0xF2, + 0x81, 0x3F, 0x65, 0xE9, 0xA7, 0x91, 0xD3, 0x2C, + 0xC2, 0xD7, 0x60, 0x26, 0xFB, 0x8D, 0x0C, 0x94, + 0xB6, 0x57, 0x48, 0x9A, 0xBB, 0x48, 0x7D, 0xA4, + 0xA2, 0xC0, 0xE3, 0x86, 0x8D, 0x3C, 0xF4, 0x7F, + 0x1C, 0xBB, 0x2F, 0xA7, 0x9C, 0x53, 0xCF, 0xF6, + 0x26, 0x47, 0x77, 0xC0, 0x9B, 0x17, 0x7C, 0x91, + 0x31, 0x54, 0x84, 0xD2, 0xB3, 0x0B, 0x0C, 0xA2, + 0x1F, 0x55, 0xAD, 0xD2, 0x3C, 0x57, 0xE1, 0x91, + 0x1C, 0x3F, 0x08, 0x6B, 0xCA, 0xD2, 0x17, 0x98, + 0x48, 0x6E, 0xB4, 0x7B, 0x7C, 0x58, 0x57, 0x73, + 0x81, 0xC0, 0x9F, 0x52, 0x52, 0x58, 0x2D, 0x1B, + 0x27, 0xA7, 0xD5, 0xB8, 0xE0, 0x60, 0xCE, 0x78, + 0x20, 0x9C, 0xC8, 0x2B, 0xAE, 0x4D, 0xA6, 0x06, + 0x80, 0x0C, 0x8D, 0xB1, 0x26, 0x8F, 0x7A, 0xD2, + 0xB7, 0x93, 0xA4, 0x4F, 0x34, 0x61, 0x2C, 0xCE, + 0xA3, 0x1C, 0xE7, 0xD7, 0x96, 0xA6, 0x5A, 0x26, + 0x91, 0xD6, 0x15, 0x00, 0x62, 0x5F, 0x83, 0xE7, + 0xBE, 0x57, 0x07, 0x7E, 0xE9, 0xC1, 0xB8, 0xC1, + 0xCA, 0xA1, 0x37, 0xCC, 0x4B, 0x65, 0x73, 0x30, + 0x8C, 0x19, 0x66, 0x8B, 0x24, 0xB0, 0x1E, 0x96, + 0x69, 0x03, 0xAB, 0xBC, 0xB7, 0x9B, 0x67, 0xBE, + 0x0A, 0x3E, 0x3E, 0x05, 0x8A, 0xAD, 0xA1, 0x89, + 0xB9, 0xEA, 0x80, 0x35, 0x9A, 0xC2, 0x6F, 0x4C, + 0x5C, 0x53, 0x73, 0x5F, 0xE4, 0xFC, 0x35, 0x24, + 0x73, 0x37, 0x76, 0x0C, 0xCA, 0x35, 0x29, 0xB8, + 0xD2, 0x66, 0xBB, 0x6C, 0x48, 0x01, 0x06, 0x54, + 0xCD, 0xBC, 0x5A, 0x3E, 0x97, 0x57, 0x52, 0x46, + 0x75, 0xAB, 0xC4, 0x13, 0x13, 0x0C, 0xC2, 0x70, + 0x1F, 0x28, 0x93, 0x3E, 0xAB, 0xB8, 0x39, 0x2B, + 0x0D, 0x6D, 0x05, 0x9C, 0xFC, 0x3A, 0x30, 0x32, + 0x6C, 0x4F, 0xCC, 0x81, 0x0B, 0x37, 0xA4, 0x74, + 0x8C, 0x1C, 0x53, 0x92, 0x8A, 0x49, 0x13, 0xE4, + 0x8B, 0x18, 0x66, 0x97, 0x16, 0x2C, 0x33, 0xFF, + 0xFB, 0x06, 0xDD, 0x51, 0x61, 0xC8, 0x63, 0x9D, + 0xB1, 0x95, 0xC6, 0xCA, 0x64, 0x82, 0x9B, 0x2B, + 0x3A, 0x2E, 0x4C, 0x96, 0x83, 0xB6, 0x6D, 0xF7, + 0xFB, 0x19, 0x09, 0x90, 0x4E, 0x00, 0x02, 0x0D, + 0xBA, 0x13, 0x4E, 0x02, 0xA1, 0x68, 0xD7, 0x6A, + 0xC0, 0x76, 0xBB, 0x77, 0xD4, 0xDC, 0x84, 0x96, + 0xB4, 0xBB, 0xE7, 0xB4, 0x69, 0x0B, 0xA2, 0x9B, + 0x62, 0xA9, 0x1A, 0xBE, 0x72, 0xBE, 0xF3, 0x23, + 0xA4, 0x4C, 0x89, 0x03, 0xE4, 0x82, 0xB6, 0x0D, + 0x99, 0xBA, 0x61, 0xD1, 0xBB, 0xCF, 0x9C, 0xB9, + 0x67, 0x35, 0x34, 0xC1, 0xD6, 0x47, 0x66, 0x23, + 0x74, 0xEE, 0x2C, 0x7C, 0x5F, 0x00, 0x81, 0xBA, + 0xD1, 0x49, 0xF4, 0x42, 0x06, 0x71, 0x76, 0x84, + 0xD9, 0x74, 0x6B, 0x20, 0x48, 0x63, 0x3A, 0xF7, + 0xA6, 0x8C, 0x68, 0x65, 0xFB, 0x59, 0x03, 0x58, + 0xD8, 0xCF, 0x82, 0x14, 0x58, 0x36, 0x9B, 0x0C, + 0x31, 0xEB, 0x59, 0x7C, 0xF5, 0xBE, 0x78, 0xEB, + 0x48, 0x0E, 0xA0, 0x4E, 0x35, 0xFA, 0xCC, 0x38, + 0x03, 0x72, 0xC8, 0xC0, 0xA0, 0x4D, 0xE2, 0x76, + 0xB1, 0xA7, 0x21, 0x21, 0xE5, 0x96, 0xCB, 0xB2, + 0x5E, 0xF7, 0x53, 0x6A, 0xD3, 0x80, 0x41, 0x84, + 0xA8, 0x7B, 0xDF, 0xB5, 0xA7, 0x69, 0x16, 0x0B, + 0xFB, 0xB0, 0xCA, 0x3C, 0x36, 0x07, 0x90, 0xE5, + 0x56, 0x2B, 0xB7, 0x8E, 0xFE, 0x00, 0x69, 0xC7, + 0x74, 0x83, 0xAD, 0x35, 0xCA, 0xC2, 0x37, 0xC6, + 0x1D, 0xE7, 0x8A, 0x7D, 0xB4, 0x6F, 0xC9, 0x17, + 0x12, 0x4C, 0xA1, 0x75, 0x10, 0xDB, 0x7D, 0xA2, + 0x18, 0x89, 0x0F, 0x44, 0x8E, 0xF6, 0x31, 0x86, + 0x13, 0xA1, 0xC9, 0x7C, 0x92, 0x8E, 0x2B, 0x7B, + 0x6A, 0x54, 0x61, 0x7B, 0xCC, 0xB6, 0xCD, 0xF2, + 0x78, 0xAE, 0x54, 0x2B, 0x56, 0xAD, 0x7B, 0xB5, + 0xEC, 0xD8, 0xC4, 0x6A, 0x66, 0xC4, 0xFA, 0x09, + 0x50, 0xCE, 0x41, 0x35, 0x2C, 0xB8, 0x57, 0x11, + 0x89, 0x04, 0x58, 0xF2, 0x99, 0xBF, 0x40, 0xBA, + 0x6F, 0xF2, 0xC0, 0x71, 0x38, 0x62, 0x26, 0x8B, + 0x5F, 0x08, 0xE4, 0x98, 0x45, 0xB0, 0x94, 0x43, + 0x99, 0x7A, 0xB2, 0x9A, 0x62, 0x07, 0x3C, 0x0D, + 0x98, 0x18, 0xC0, 0x20, 0x16, 0x7D, 0x47, 0x49, + 0x23, 0x1C, 0x05, 0x9E, 0x6F, 0x48, 0x3F, 0x97, + 0x68, 0x17, 0xC9, 0x0C, 0x20, 0xA9, 0xC9, 0x37, + 0x07, 0x9C, 0x2D, 0x4B, 0xE3, 0x0D, 0xA9, 0x74, + 0xA9, 0x7E, 0x4B, 0xC5, 0x3E, 0xD9, 0x6A, 0x55, + 0x16, 0x9F, 0x4A, 0x23, 0xA3, 0xEA, 0x24, 0xBD, + 0x8E, 0x01, 0xB8, 0xFA, 0xEB, 0x95, 0xD4, 0xE5, + 0x3F, 0xFF, 0xEC, 0xB6, 0x08, 0x02, 0xC3, 0x88, + 0xA4, 0x0F, 0x46, 0x60, 0x54, 0x0B, 0x1B, 0x1F, + 0x81, 0x76, 0xC9, 0x81, 0x1B, 0xB2, 0x6A, 0x68, + 0x3C, 0xA7, 0x89, 0x56, 0x4A, 0x29, 0x40, 0xFC, + 0xEB, 0x2C, 0xE6, 0xA9, 0x2A, 0x1E, 0xE4, 0x5E, + 0xE4, 0xC3, 0x18, 0x57, 0xC9, 0xB9, 0xB8, 0xB5, + 0x6A, 0x79, 0xD9, 0x5A, 0x46, 0xCB, 0x39, 0x3A, + 0x31, 0xA2, 0x73, 0x7B, 0xAF, 0xEA, 0x6C, 0x81, + 0x06, 0x6A, 0x67, 0x2B, 0x34, 0xC1, 0x0A, 0xA9, + 0x89, 0x57, 0xC9, 0x17, 0x66, 0xB7, 0x30, 0x03, + 0x6A, 0x56, 0xD9, 0x40, 0xAA, 0x4E, 0xBC, 0xB7, + 0x58, 0xB0, 0x83, 0x51, 0xE2, 0xC4, 0xFD, 0x19, + 0x45, 0x3B, 0xF3, 0xA6, 0x29, 0x2A, 0x99, 0x3D, + 0x67, 0xC7, 0xEC, 0xC7, 0x2F, 0x42, 0xF7, 0x82, + 0xE9, 0xEB, 0xAA, 0x1A, 0x8B, 0x3B, 0x0F, 0x56, + 0x7A, 0xB3, 0x94, 0x21, 0xF6, 0xA6, 0x7A, 0x6B, + 0x84, 0x10, 0xFD, 0x94, 0xA7, 0x21, 0xD3, 0x65, + 0xF1, 0x63, 0x9E, 0x9D, 0xDA, 0xBF, 0xD0, 0xA6, + 0xCE, 0x1A, 0x46, 0x05, 0xBD, 0x2B, 0x1C, 0x9B, + 0x97, 0x7B, 0xD1, 0xEA, 0x32, 0x86, 0x73, 0x68, + 0xD6, 0xE6, 0x39, 0xD0, 0x19, 0xAC, 0x10, 0x18, + 0x53, 0xBC, 0x15, 0x3C, 0x86, 0xF8, 0x52, 0x80, + 0xFC, 0x76, 0x3B, 0xA2, 0x4F, 0xB5, 0x7A, 0x29, + 0x6C, 0xB1, 0x2D, 0x32, 0xE0, 0x8A, 0xB3, 0x2C, + 0x55, 0x1D, 0x5A, 0x45, 0xA4, 0xA2, 0x8F, 0x9A, + 0xDC, 0x28, 0xF7, 0xA2, 0x90, 0x0E, 0x25, 0xA4, + 0x0B, 0x51, 0x90, 0xB2, 0x2A, 0xB1, 0x9D, 0xFB, + 0x24, 0x6F, 0x42, 0xB2, 0x4F, 0x97, 0xCC, 0xA9, + 0xB0, 0x9B, 0xEA, 0xD2, 0x46, 0xE1, 0x73, 0x4F, + 0x44, 0x66, 0x77, 0xB3, 0x8B, 0x75, 0x22, 0xB7, + 0x80, 0x72, 0x7C, 0x11, 0x74, 0x40, 0xC9, 0xF1, + 0xA0, 0x24, 0x52, 0x0C, 0x14, 0x1A, 0x69, 0xCD, + 0xD2, 0xE6, 0x9A, 0x05, 0x53, 0x4A, 0x72, 0x32, + 0xC5, 0xF1, 0xB7, 0x66, 0xE9, 0x3A, 0x5E, 0xE2, + 0xEA, 0x1B, 0x26, 0xE8, 0x60, 0xA3, 0x44, 0x1A, + 0xDE, 0xA9, 0x1E, 0xDB, 0x78, 0x2C, 0xAB, 0xC8, + 0xA5, 0xD0, 0x11, 0xA2, 0x1B, 0xC3, 0x88, 0xE7, + 0xF4, 0x86, 0xF0, 0xB7, 0x99, 0x30, 0x79, 0xAE, + 0x3F, 0x1A, 0x7C, 0x85, 0xD2, 0x7D, 0x0F, 0x49, + 0x21, 0x84, 0xD5, 0x90, 0x62, 0x14, 0x2B, 0x76, + 0xA4, 0x37, 0x34, 0xA9, 0x0D, 0x55, 0x6A, 0x95, + 0xDC, 0x48, 0x3D, 0xD8, 0x21, 0x04, 0xED, 0x58, + 0xCA, 0x15, 0x71, 0xC3, 0x96, 0x85, 0x82, 0x79, + 0x51, 0x43, 0x4C, 0xC1, 0x00, 0x1A, 0xA4, 0xC8, + 0x13, 0x26, 0x1E, 0x4F, 0x93, 0x02, 0x8E, 0x14, + 0xCD, 0x08, 0xF7, 0x68, 0xA4, 0x54, 0x31, 0x0C, + 0x3B, 0x01, 0x0C, 0x83, 0xB7, 0x4D, 0x04, 0xA5, + 0x7B, 0xB9, 0x77, 0xB3, 0xD8, 0xBC, 0xF3, 0xAA, + 0xA7, 0x8C, 0xA1, 0x2B, 0x78, 0xF0, 0x10, 0xD9, + 0x51, 0x34, 0x92, 0x8A, 0x5E, 0x5D, 0x96, 0xA0, + 0x29, 0xB4, 0x42, 0xA4, 0x18, 0x88, 0x03, 0x8B, + 0x29, 0xC2, 0xF1, 0x22, 0xB0, 0xB6, 0xB3, 0xAF, + 0x12, 0x1A, 0xEA, 0x29, 0xA0, 0x55, 0x53, 0xBD, + 0xF1, 0xDB, 0x60, 0x7A, 0xFB, 0x17, 0x00, 0x18, + 0x60, 0xAF, 0x18, 0x23, 0xBC, 0xF0, 0x3D, 0xB3, + 0xB4, 0x41, 0xDA, 0x16, 0x3A, 0x28, 0xC5, 0x23, + 0xA5, 0xFB, 0x46, 0x69, 0xA6, 0x42, 0x34, 0xA4, + 0xBC, 0xD1, 0x21, 0x7F, 0xF2, 0x63, 0x5B, 0xD9, + 0x76, 0x80, 0xFF, 0x93, 0x8D, 0xBC, 0xF1, 0x0E, + 0x95, 0x32, 0xA9, 0xA7, 0x9A, 0x5B, 0x07, 0x3A, + 0x9E, 0x8D, 0xB2, 0x12, 0x3D, 0x21, 0x0F, 0xAE, + 0xA2, 0x00, 0xB6, 0x64, 0x83, 0x8E, 0x80, 0x07, + 0x1F, 0x2B, 0xA2, 0x54, 0xAA, 0xC8, 0x90, 0xA4, + 0x6E, 0x28, 0xEC, 0x34, 0x2D, 0x92, 0x81, 0x2B, + 0x01, 0x59, 0x30, 0x71, 0x65, 0x7E, 0x7A, 0x3A, + 0x4A, 0x75, 0xCB, 0x3D, 0x52, 0x79, 0xCE, 0x88, + 0x40, 0x5A, 0xC5, 0xAD, 0xAC, 0xB2, 0x05, 0x1E, + 0x02, 0x2E, 0xE0, 0xAC, 0x9B, 0xBF, 0xE3, 0x2D, + 0xEF, 0x98, 0x66, 0x7E, 0xD3, 0x47, 0xAD, 0xCB, + 0x39, 0x30, 0xF3, 0xCA, 0xD0, 0x31, 0x39, 0x1B, + 0x70, 0x9A, 0x4E, 0x61, 0xB8, 0xDD, 0x4B, 0x3F, + 0xB7, 0x41, 0xB5, 0xBD, 0x60, 0xBF, 0x30, 0x40, + 0x15, 0xEE, 0x75, 0x46, 0xA2, 0x4B, 0x59, 0xEA, + 0xDC, 0xA1, 0x37, 0xC7, 0x12, 0x50, 0x74, 0x72, + 0x6B, 0x76, 0x86, 0xEC, 0x55, 0x1B, 0x7B, 0xC2, + 0x6B, 0xBD, 0xB2, 0x0F, 0xC3, 0x78, 0x35, 0x34, + 0xE3, 0x4E, 0xE1, 0xF1, 0xBC, 0x6B, 0x77, 0xAB, + 0x49, 0xA6, 0x66, 0x78, 0x46, 0x97, 0x57, 0x78, + 0xC3, 0xC5, 0x36, 0x83, 0x04, 0x50, 0xA3, 0xFA, + 0x91, 0x02, 0x59, 0x72, 0x2F, 0x3F, 0x80, 0x6E, + 0x6E, 0xB4, 0xB9, 0x34, 0x67, 0x63, 0xFE, 0xF0, + 0x92, 0x2B, 0xC4, 0xB6, 0xEB, 0x38, 0x26, 0xAF, + 0xF2, 0x4E, 0xAD, 0xC6, 0xCF, 0x6E, 0x47, 0x7C, + 0x2E, 0x05, 0x5C, 0xFB, 0x7A, 0x90, 0xA5, 0x5C, + 0x06, 0xD0, 0xB2, 0xA2, 0xF5, 0x11, 0x60, 0x69, + 0xE6, 0x4A, 0x5B, 0x50, 0x78, 0xC0, 0x57, 0x7B, + 0xC8, 0xE7, 0x90, 0x0E, 0xA7, 0x1C, 0x34, 0x1C, + 0x02, 0xAD, 0x85, 0x4E, 0xA5, 0xA0, 0x1A, 0xF2, + 0xA6, 0x05, 0xCB, 0x20, 0x68, 0xD5, 0x24, 0x38, + 0xCD, 0xDC, 0x60, 0xB0, 0x38, 0x82, 0xCC, 0x02, + 0x4D, 0x13, 0x04, 0x5F, 0x2B, 0xA6, 0xB0, 0xF4, + 0x46, 0xAA, 0xA5, 0x95, 0x87, 0x60, 0x61, 0x79, + 0x45, 0x37, 0x1F, 0xD7, 0x8C, 0x28, 0xA4, 0x06, + 0x77, 0xA6, 0xE7, 0x2F, 0x51, 0x3B, 0x9E, 0x06, + 0x67, 0xA9, 0xBA, 0xF4, 0x46, 0xC1, 0xBA, 0x93, + 0x1B, 0xA8, 0x18, 0x34, 0x23, 0x47, 0x92, 0xA2, + 0xA2, 0xB2, 0xB3, 0x70, 0x1F, 0x31, 0xB7, 0xCF, + 0x46, 0x7C, 0x80, 0xF1, 0x98, 0x11, 0x41, 0xBB, + 0x45, 0x77, 0x93, 0xE1, 0x30, 0x70, 0x91, 0xC4, + 0x8B, 0x59, 0x14, 0x64, 0x6A, 0x60, 0xCE, 0x1A, + 0x30, 0x15, 0x43, 0x77, 0x9D, 0x7C, 0x33, 0x42, + 0xAD, 0x17, 0x97, 0x96, 0xC2, 0xC4, 0x40, 0xD9, + 0x9D, 0xF9, 0xD4, 0x1B, 0x52, 0xE3, 0x26, 0x25, + 0xA8, 0x2A, 0xA5, 0xF5, 0x79, 0xA9, 0x92, 0x0B, + 0xFF, 0xBA, 0x96, 0x4F, 0xA7, 0x0D, 0xB2, 0x59, + 0xC8, 0x5E, 0x68, 0xC8, 0x13, 0x81, 0x7B, 0x13, + 0x47, 0xBF, 0x19, 0x81, 0x4D, 0xA5, 0xE9, 0x36, + 0x4A, 0x46, 0x45, 0xE6, 0x21, 0x92, 0x3D, 0x95, + 0x5C, 0x21, 0x1A, 0x55, 0xD3, 0x55, 0xC8, 0x16, + 0xDA, 0x04, 0x73, 0x0A, 0xA3, 0x24, 0x08, 0x5E, + 0x62, 0x2B, 0x51, 0xD6, 0x10, 0x9B, 0x49, 0xF6, + 0x73, 0xAD, 0xD0, 0x0E, 0x41, 0x47, 0x55, 0xC8, + 0x02, 0x4A, 0xA0, 0x16, 0x4F, 0x24, 0x55, 0x6D, + 0xED, 0x96, 0x3D, 0x61, 0x14, 0x38, 0x56, 0xCB, + 0x4F, 0xF0, 0x56, 0x7E, 0x33, 0x20, 0x73, 0x0D, + 0xBC, 0xBF, 0x12, 0xF6, 0x6E, 0x2B, 0x70, 0xB2, + 0x00, 0x54, 0xA6, 0xDE, 0xA4, 0x26, 0x14, 0xB5, + 0x0E, 0xF7, 0x2B, 0x15, 0x6F, 0x51, 0x49, 0xFC, + 0x26, 0x3D, 0xD7, 0xE0, 0x39, 0xC5, 0x5A, 0x3E, + 0xE9, 0x82, 0x7D, 0xF9, 0x2C, 0x56, 0x5D, 0x24, + 0xC5, 0x5E, 0x0A, 0x81, 0xC6, 0x49, 0x46, 0x95, + 0x34, 0x4D, 0x94, 0x87, 0x48, 0xAF, 0xBA, 0x9F, + 0x76, 0x2C, 0x0E, 0xA9, 0x0B, 0xB7, 0x24, 0x89, + 0x79, 0x02, 0x00, 0x07, 0x75, 0x61, 0x39, 0x49, + 0x60, 0x2C, 0x48, 0xC7, 0x8A, 0x94, 0x40, 0x67, + 0x8C, 0x24, 0x08, 0x6D, 0x32, 0x6D, 0x79, 0x64, + 0x3B, 0xAF, 0x70, 0x36, 0xC6, 0x6C, 0x7E, 0x02, + 0x6A, 0xAE, 0xFD, 0xA2, 0x80, 0x7A, 0x60, 0xBD, + 0x7F, 0xC9, 0x13, 0x63, 0xBB, 0x02, 0x34, 0xA5, + 0x90, 0x98, 0x4A, 0xA0, 0x11, 0xF1, 0x1D, 0x40, + 0x26, 0x82, 0x18, 0xA1, 0x58, 0x83, 0x77, 0xB3, + 0xD7, 0x67, 0x1B, 0x8B, 0x99, 0x78, 0x99, 0x19, + 0xB8, 0x6E, 0xE8, 0x2B, 0x18, 0xEC, 0x22, 0xD4, + 0xE8, 0x0A, 0x1F, 0x27, 0x85, 0x3D, 0x88, 0x94, + 0x19, 0xD4, 0x60, 0xDE, 0xF7, 0x56, 0x7A, 0xA4, + 0x56, 0x79, 0x69, 0xC4, 0x30, 0x48, 0xC3, 0x2B, + 0x84, 0x62, 0xA9, 0xC9, 0x38, 0x6E, 0xB3, 0x15, + 0x2A, 0x69, 0x76, 0xAA, 0x78, 0x3C, 0xDD, 0x1A, + 0x8C, 0x57, 0xA9, 0xB6, 0xBB, 0xD8, 0x37, 0xA0, + 0x06, 0x24, 0xB5, 0x8B, 0x4B, 0xA3, 0xDB, 0xB6, + 0x3B, 0xB8, 0x20, 0x0E, 0x7B, 0xC8, 0x88, 0x81, + 0xBE, 0xBD, 0xA9, 0x25, 0xBC, 0xA0, 0x28, 0xE2, + 0x91, 0xAA, 0x1C, 0x22, 0x53, 0x9C, 0xD0, 0x4F, + 0x90, 0x09, 0x0D, 0x7F, 0x74, 0x10, 0x8C, 0x32, + 0xB8, 0x02, 0x2C, 0x15, 0x91, 0xC8, 0x81, 0xE7, + 0x63, 0x04, 0xE2, 0x40, 0x81, 0x90, 0xE2, 0x0F, + 0x09, 0xA5, 0x4F, 0xC2, 0x34, 0x20, 0xE2, 0x62, + 0x0E, 0x9D, 0x87, 0xA3, 0x10, 0x8A, 0x94, 0xFE, + 0xEA, 0x72, 0xD5, 0xAB, 0x7F, 0xCF, 0xB9, 0x72, + 0xE6, 0x56, 0x1B, 0x1A, 0x7B, 0x06, 0x2F, 0x1A, + 0x68, 0x2E, 0x02, 0x0A, 0xA2, 0x56, 0x28, 0x12, + 0xB2, 0x96, 0x54, 0x7B, 0x91, 0x78, 0x24, 0xCD, + 0xB8, 0x8C, 0x58, 0x2B, 0x5A, 0x68, 0x90, 0x17, + 0x7B, 0xC7, 0x0C, 0x91, 0xAC, 0xAC, 0x9A, 0xBE, + 0x29, 0x0A, 0xEB, 0x2C, 0x34, 0xA7, 0xE2, 0x36, + 0x89, 0x55, 0xCB, 0x45, 0x6A, 0x34, 0x53, 0x68, + 0xAB, 0xE3, 0xB9, 0x1B, 0x47, 0xFC, 0x30, 0xB0, + 0x23, 0x3A, 0x09, 0xBA, 0x79, 0xFB, 0x11, 0x23, + 0x8A, 0xC5, 0x08, 0xCC, 0xE6, 0x10, 0x95, 0xF8, + 0x54, 0xC2, 0x32, 0x04, 0xA8, 0xD3, 0x6B, 0xFC, + 0x2C, 0x6E, 0x05, 0xA7, 0x2A, 0xF5, 0x24, 0x4B, + 0x17, 0xC1, 0x21, 0x01, 0xE0, 0x14, 0x51, 0x57, + 0x0E, 0xB1, 0x10, 0x56, 0x7E, 0x85, 0x0E, 0x79, + 0xC0, 0x00, 0x14, 0x24, 0x41, 0xFE, 0x41, 0x60, + 0x02, 0x75, 0x45, 0xF6, 0x29, 0x0E, 0x85, 0x45, + 0x1B, 0x80, 0x23, 0x4A, 0x94, 0x06, 0xC3, 0x90, + 0xB0, 0xCE, 0xA3, 0xC8, 0x33, 0x5D, 0x4C, 0x6F, + 0x85, 0x50, 0xB5, 0x44, 0xC9, 0x34, 0x3E, 0x61, + 0xBA, 0x1C, 0x84, 0x89, 0xD1, 0xB0, 0x39, 0x97, + 0x39, 0x16, 0x8A, 0xF7, 0x40, 0xA4, 0x81, 0xB0, + 0xF5, 0xC3, 0x37, 0x25, 0x30, 0xCA, 0x06, 0xB5, + 0x08, 0xEC, 0xE8, 0x38, 0xAB, 0x78, 0xBE, 0xE1, + 0xE5, 0x97, 0xA9, 0xB1, 0x4F, 0x6A, 0xEC, 0x7A, + 0x3B, 0xD1, 0xAA, 0x8D, 0x10, 0xBA, 0xC2, 0x3B, + 0x98, 0x02, 0x90, 0x2C, 0xD5, 0x29, 0xAB, 0x6E, + 0xF5, 0x4D, 0xB3, 0x11, 0x0C, 0xFB, 0x56, 0x1E, + 0x7E, 0x69, 0x48, 0xE6, 0x52, 0x81, 0x25, 0x04, + 0x16, 0xC3, 0x49, 0xC8, 0x10, 0x0B, 0x3B, 0x4D, + 0x3D, 0x0F, 0x62, 0xAC, 0xAD, 0x8D, 0x16, 0x11, + 0x75, 0xB1, 0x34, 0xF7, 0x56, 0x49, 0x37, 0xCD, + 0xEC, 0xE9, 0xE2, 0x46, 0xAA, 0xD1, 0x10, 0x21, + 0xA6, 0x7B, 0x20, 0xEB, 0x8F, 0x77, 0x65, 0xAC, + 0x28, 0x23, 0xA9, 0xD1, 0x8C, 0x93, 0xEC, 0x28, + 0x2D, 0x6D, 0xBC, 0x53, 0xCD, 0x6D, 0xF5, 0x75, + 0x92, 0xAC, 0x7D, 0x1F, 0x83, 0xBA, 0xFA, 0xE6, + 0xEE, 0x86, 0xFE, 0x00, 0xF9, 0x5D, 0x81, 0x33, + 0x75, 0x77, 0x24, 0x34, 0x86, 0x0F, 0x5F, 0xF7, + 0xD5, 0x4F, 0xFC, 0x37, 0x39, 0x9B, 0xC4, 0xCC + }; +#endif +#ifndef WOLFSSL_NO_KYBER1024 + static const byte seed_1024[KYBER_MAKEKEY_RAND_SZ] = { + 0x7A, 0xF6, 0x50, 0x22, 0xE0, 0xA4, 0x72, 0xED, + 0x63, 0x88, 0x63, 0x8E, 0xA2, 0x9D, 0x82, 0xDA, + 0x68, 0xB4, 0xCF, 0x9F, 0xFD, 0xF2, 0xB6, 0x7C, + 0xD7, 0x08, 0xEA, 0x5A, 0x37, 0x0C, 0x6A, 0x7C, + 0x7A, 0xF6, 0x50, 0x22, 0xE0, 0xA4, 0x72, 0xED, + 0x63, 0x88, 0x63, 0x8E, 0xA2, 0x9D, 0x82, 0xDA, + 0x68, 0xB4, 0xCF, 0x9F, 0xFD, 0xF2, 0xB6, 0x7C, + 0xD7, 0x08, 0xEA, 0x5A, 0x37, 0x0C, 0x6A, 0x7C + }; + static const byte ek_1024[KYBER1024_PUBLIC_KEY_SIZE] = { + 0x70, 0xE1, 0x3F, 0x30, 0x15, 0x17, 0xB5, 0xA4, + 0x0D, 0x70, 0x36, 0x1F, 0x63, 0x09, 0x41, 0x60, + 0x67, 0x64, 0x6D, 0x2B, 0x71, 0x36, 0x62, 0x6B, + 0xCC, 0xCC, 0x17, 0x0C, 0x66, 0xCE, 0xD4, 0x90, + 0xC7, 0x35, 0x34, 0x4B, 0x62, 0x77, 0x09, 0x7C, + 0xA9, 0x14, 0x21, 0x2A, 0x29, 0x2D, 0xD1, 0x22, + 0xFB, 0xB6, 0x9F, 0xDE, 0xCA, 0x47, 0xFA, 0xB4, + 0x53, 0x2B, 0x8C, 0x80, 0xCE, 0xB7, 0x7F, 0x9C, + 0x54, 0x3E, 0x0B, 0xF1, 0x53, 0x6D, 0x1C, 0x0C, + 0xAE, 0x07, 0x7E, 0x2C, 0xA7, 0x86, 0x2B, 0x45, + 0xA4, 0x10, 0x46, 0x9C, 0xC5, 0xB7, 0x06, 0xBA, + 0xE0, 0x05, 0x1C, 0xB2, 0x96, 0x1D, 0xB7, 0x27, + 0x0B, 0x75, 0xB7, 0x11, 0x69, 0x8D, 0x2B, 0x80, + 0x70, 0x40, 0xD5, 0x62, 0x81, 0x29, 0x43, 0x6F, + 0xBB, 0x58, 0xF1, 0x20, 0x3F, 0x75, 0x56, 0x14, + 0x65, 0xF5, 0x42, 0x57, 0xE4, 0x4D, 0x33, 0xF5, + 0x12, 0xD6, 0x33, 0x43, 0x1D, 0x00, 0xA2, 0xFB, + 0x02, 0x30, 0xC9, 0xBB, 0x9C, 0xDD, 0xFC, 0x83, + 0xBD, 0x65, 0xC9, 0x74, 0x45, 0x30, 0x21, 0x86, + 0xA1, 0x72, 0x23, 0xAD, 0x21, 0x33, 0x28, 0x03, + 0xB9, 0x09, 0xE5, 0xE5, 0x67, 0x19, 0x70, 0xBB, + 0xB0, 0xF1, 0xC4, 0x83, 0x7B, 0xB8, 0x42, 0x73, + 0xBA, 0x67, 0x5A, 0xC0, 0x74, 0xC5, 0x29, 0x0B, + 0x41, 0x1C, 0x25, 0x00, 0x65, 0x70, 0x59, 0x33, + 0x9D, 0xE3, 0x92, 0xF9, 0xCA, 0x30, 0x89, 0x52, + 0xA2, 0x20, 0x1A, 0x58, 0x87, 0x67, 0xAD, 0xC0, + 0x35, 0xBD, 0xF3, 0x30, 0x24, 0xEA, 0x3B, 0x9A, + 0x83, 0xC5, 0xA0, 0xB9, 0xC5, 0x42, 0x5D, 0x14, + 0x07, 0x0C, 0x81, 0xAA, 0xDA, 0x26, 0xBA, 0xC3, + 0xFB, 0xB8, 0xD4, 0xB7, 0xCF, 0xEE, 0x03, 0x92, + 0x37, 0x5C, 0x68, 0x42, 0x73, 0x51, 0xDF, 0xEC, + 0x63, 0x60, 0x9B, 0xBB, 0x50, 0xB4, 0x63, 0xE0, + 0x40, 0x92, 0x85, 0x70, 0x09, 0xD1, 0xE5, 0xB8, + 0x1D, 0x70, 0x7D, 0x14, 0xB8, 0x33, 0xCD, 0x4A, + 0x0B, 0x55, 0x1B, 0xAA, 0x13, 0xEC, 0x48, 0x8A, + 0x15, 0x03, 0xB0, 0x46, 0x7E, 0xE4, 0x02, 0x3C, + 0x3F, 0xE0, 0x32, 0xC7, 0x82, 0x25, 0x06, 0x38, + 0x86, 0xE2, 0x46, 0x8E, 0x00, 0xF7, 0x00, 0x07, + 0x2A, 0x2E, 0xC8, 0xDA, 0x6A, 0xFB, 0x20, 0x6C, + 0x91, 0x90, 0x44, 0x33, 0xBB, 0xCC, 0xB0, 0xE7, + 0x6F, 0x42, 0x46, 0x8C, 0x40, 0xEB, 0x5F, 0x59, + 0xCB, 0x9A, 0xE1, 0xB0, 0x35, 0xE5, 0x21, 0x51, + 0x0B, 0xF2, 0x16, 0xA1, 0xAB, 0xCB, 0x19, 0x03, + 0x3B, 0x7A, 0x65, 0x88, 0x97, 0xC6, 0x58, 0x74, + 0xD5, 0x13, 0x51, 0x83, 0x14, 0x9F, 0x97, 0x9E, + 0x55, 0x3C, 0xCF, 0xBF, 0xA3, 0x90, 0x0C, 0xDA, + 0x6F, 0x01, 0x96, 0x0B, 0x75, 0x15, 0x7F, 0x54, + 0x53, 0xAA, 0x6E, 0x73, 0xB3, 0xED, 0x90, 0x2F, + 0x7D, 0x7C, 0x93, 0x05, 0x97, 0x1B, 0xDF, 0x72, + 0x2E, 0x29, 0x37, 0x16, 0x9A, 0x1B, 0xC0, 0xFA, + 0xEB, 0x6C, 0x92, 0xF7, 0x15, 0x0D, 0x23, 0x30, + 0x87, 0x7C, 0x5D, 0xC5, 0x24, 0x9A, 0xAE, 0x20, + 0x30, 0x26, 0x34, 0xC5, 0xC5, 0xB2, 0x30, 0x53, + 0x52, 0x10, 0x28, 0x12, 0x25, 0x42, 0xF4, 0x85, + 0xA0, 0xEA, 0xC8, 0x69, 0x22, 0x37, 0x20, 0x63, + 0x36, 0x51, 0xF5, 0xB2, 0x47, 0xC6, 0x62, 0xB3, + 0x1A, 0x10, 0x53, 0x8C, 0xA7, 0x49, 0x1B, 0x14, + 0x37, 0xAA, 0x74, 0xF4, 0x28, 0x2D, 0x12, 0x97, + 0x4D, 0x9C, 0x93, 0x4D, 0xF2, 0x14, 0x78, 0x5B, + 0x64, 0x18, 0x46, 0x8B, 0x92, 0xE5, 0x25, 0x28, + 0xC8, 0x44, 0x7A, 0x1C, 0xA4, 0x22, 0xFA, 0x6C, + 0xC8, 0x8E, 0x28, 0xB0, 0x59, 0xF0, 0x4B, 0x23, + 0x59, 0x73, 0x23, 0xF7, 0x2F, 0x3E, 0x23, 0x36, + 0xF8, 0x7C, 0x47, 0x90, 0x5C, 0xBA, 0x65, 0x5B, + 0xB7, 0x3F, 0xC3, 0x2E, 0x18, 0xD4, 0xB7, 0x87, + 0x05, 0xC7, 0x82, 0xEB, 0xCB, 0x43, 0xE2, 0x78, + 0x5C, 0x82, 0xC5, 0xAF, 0x24, 0xB0, 0xE1, 0x69, + 0x9C, 0xFB, 0xC0, 0x25, 0x74, 0x75, 0x79, 0x9A, + 0x53, 0x9B, 0x11, 0xA5, 0x0F, 0x4D, 0xF2, 0xB7, + 0xFA, 0xA2, 0x0B, 0xD8, 0x82, 0x75, 0x15, 0xCA, + 0x37, 0x0F, 0x89, 0xC0, 0xD4, 0xC6, 0x09, 0x02, + 0xF6, 0x56, 0x7C, 0xD6, 0x0B, 0x08, 0x60, 0xA5, + 0x5B, 0xC8, 0x57, 0x2C, 0x43, 0x6C, 0x24, 0x6A, + 0xC2, 0x76, 0x64, 0x4E, 0x7D, 0x60, 0x2A, 0xA5, + 0x7C, 0x01, 0x66, 0x20, 0x18, 0x14, 0x99, 0x1C, + 0x1B, 0xD7, 0x5C, 0x7C, 0x47, 0xC3, 0x48, 0xB6, + 0x7D, 0x77, 0x61, 0x33, 0x86, 0x90, 0x81, 0x44, + 0xEA, 0x83, 0xFF, 0x72, 0x1F, 0x9A, 0x50, 0x07, + 0x6C, 0x51, 0x01, 0x64, 0xD1, 0x8E, 0x05, 0xD0, + 0x5D, 0x98, 0x84, 0xC4, 0x41, 0x46, 0xA0, 0x7C, + 0xCA, 0xCF, 0x89, 0x04, 0x98, 0xED, 0x1A, 0x19, + 0xB2, 0xA1, 0x54, 0x31, 0x72, 0x9D, 0xC1, 0xF1, + 0x2B, 0x7E, 0xA1, 0x0F, 0x9F, 0x92, 0x80, 0x62, + 0xD1, 0x45, 0x4B, 0x4B, 0x9F, 0x68, 0xE5, 0x99, + 0x90, 0x29, 0x0B, 0xE3, 0x72, 0x8B, 0x32, 0x89, + 0x56, 0x93, 0x63, 0xAB, 0x10, 0x05, 0x13, 0x1B, + 0x23, 0x81, 0xA0, 0x8C, 0xC2, 0xBF, 0x94, 0x3E, + 0x95, 0xD5, 0xB2, 0x1B, 0xC6, 0xAA, 0xBC, 0x22, + 0x73, 0x34, 0x8B, 0xC7, 0x2B, 0xD0, 0x93, 0xB7, + 0xB5, 0x61, 0x7A, 0xE8, 0x7F, 0x60, 0x2B, 0xB9, + 0x89, 0xE6, 0xAF, 0xC4, 0x4B, 0x81, 0x51, 0x20, + 0x76, 0xA3, 0xA8, 0x76, 0xE0, 0xE2, 0x5F, 0x97, + 0x62, 0xB4, 0x62, 0x08, 0x19, 0x85, 0x50, 0x2F, + 0x26, 0xB2, 0x87, 0xA2, 0x93, 0x6D, 0x5B, 0x1A, + 0xCF, 0xFC, 0xEC, 0x4E, 0xEE, 0x77, 0xA9, 0xCB, + 0xA9, 0x80, 0xEB, 0x9B, 0x5F, 0xDE, 0x75, 0x53, + 0x9F, 0x65, 0x09, 0x04, 0x67, 0x7D, 0xBE, 0x29, + 0xAB, 0x8B, 0xB9, 0x18, 0xA3, 0x49, 0x48, 0x03, + 0xEC, 0xA5, 0x9A, 0x2C, 0x32, 0xE5, 0xB5, 0xC8, + 0x3B, 0x0B, 0x80, 0xB1, 0x10, 0x2C, 0xD7, 0xD9, + 0x48, 0x2B, 0x45, 0x9B, 0x6B, 0x74, 0x49, 0x1E, + 0xC3, 0x0C, 0x4B, 0xE7, 0x7C, 0x2B, 0x52, 0x4A, + 0xF7, 0xB3, 0xAD, 0x1F, 0x71, 0x34, 0x1D, 0xF0, + 0xA7, 0x6F, 0x25, 0x5C, 0x29, 0x03, 0xC8, 0x82, + 0x08, 0x07, 0x93, 0x79, 0x93, 0x0A, 0x95, 0x13, + 0xF3, 0x90, 0x12, 0x6E, 0x73, 0x2A, 0x2B, 0xB0, + 0x94, 0xBF, 0xA6, 0xBF, 0x0A, 0x43, 0x2B, 0xCD, + 0x65, 0x7D, 0xAF, 0xCB, 0x25, 0xC8, 0xBB, 0x15, + 0xE0, 0x95, 0x5D, 0x09, 0x9B, 0x74, 0xFF, 0x1A, + 0x4D, 0xE6, 0x55, 0x9C, 0xD6, 0x79, 0x7C, 0x38, + 0xC4, 0x8C, 0x11, 0x34, 0xCA, 0x2C, 0x97, 0x92, + 0x43, 0xF3, 0x15, 0x2A, 0xF4, 0xBB, 0xE4, 0xD7, + 0xA6, 0xBC, 0x09, 0x87, 0x21, 0x33, 0x92, 0x0C, + 0xD2, 0x3B, 0x3E, 0xF9, 0x84, 0x8C, 0xCC, 0x68, + 0x45, 0xD6, 0x47, 0xB5, 0x38, 0x75, 0x57, 0x73, + 0x65, 0x13, 0xD5, 0x85, 0x60, 0x84, 0x51, 0x92, + 0xF9, 0x26, 0x51, 0x59, 0x93, 0x2E, 0x57, 0x2A, + 0x88, 0xC4, 0x4E, 0x65, 0x66, 0x76, 0x0C, 0x06, + 0x1C, 0x67, 0xFC, 0xB5, 0xBF, 0x21, 0x00, 0x95, + 0xE2, 0x14, 0xDA, 0x74, 0x53, 0x57, 0xE3, 0x69, + 0x96, 0xD8, 0xC0, 0x66, 0x31, 0x1B, 0xBC, 0x76, + 0x1A, 0x1F, 0xD2, 0x52, 0x73, 0xD2, 0x1E, 0xAB, + 0x50, 0x01, 0x05, 0x63, 0xCD, 0x64, 0x68, 0xA4, + 0xEA, 0x83, 0x6B, 0x6D, 0x64, 0xBD, 0x2B, 0xD7, + 0x6D, 0xBE, 0x35, 0x82, 0xD5, 0x73, 0x6A, 0x60, + 0x5A, 0x55, 0x09, 0xFC, 0x28, 0x78, 0x9B, 0x56, + 0xB8, 0x84, 0xAE, 0x9A, 0x60, 0x41, 0x5F, 0x55, + 0x67, 0x4B, 0xE6, 0x01, 0x57, 0x6C, 0x7C, 0xEE, + 0x58, 0x14, 0x3B, 0xF0, 0x54, 0x80, 0x6A, 0xBC, + 0xB3, 0x45, 0xA2, 0x56, 0xCB, 0xC4, 0x54, 0xE3, + 0x43, 0xF3, 0xCC, 0x7A, 0xDE, 0x65, 0x56, 0x2F, + 0xD2, 0x9E, 0xB2, 0x59, 0x73, 0x7B, 0xB3, 0xCF, + 0x96, 0x49, 0xBD, 0xEA, 0x28, 0x3F, 0xB0, 0x72, + 0x65, 0x67, 0x7C, 0x98, 0x08, 0xD1, 0x31, 0x19, + 0xC0, 0xA2, 0xAD, 0xF7, 0x45, 0xDE, 0x69, 0x75, + 0xF4, 0x56, 0x2C, 0xD6, 0x15, 0x57, 0xB3, 0x96, + 0x5D, 0x2B, 0x07, 0x2F, 0x00, 0x0A, 0xA7, 0xE0, + 0xA3, 0x57, 0xE1, 0x25, 0x3E, 0xAF, 0xEA, 0x7F, + 0xDF, 0xCC, 0x92, 0xFA, 0x87, 0x63, 0x0D, 0xD2, + 0x27, 0x6C, 0xE4, 0x2E, 0x82, 0x0B, 0x69, 0xD1, + 0xFC, 0x2E, 0x47, 0xD5, 0xC4, 0x98, 0xA5, 0x5B, + 0x3B, 0x29, 0xC3, 0x4E, 0x64, 0x90, 0x3D, 0x04, + 0x7A, 0xB1, 0xC0, 0x40, 0x24, 0x95, 0x8F, 0x70, + 0x11, 0x95, 0xF5, 0xD1, 0x3E, 0xC6, 0x70, 0x6B, + 0x84, 0x48, 0x50, 0x3A, 0x54, 0x99, 0x22, 0xA5, + 0x8A, 0x24, 0xB6, 0x7C, 0x93, 0x63, 0x27, 0x56, + 0xB7, 0x7D, 0x22, 0x54, 0x07, 0x31, 0x61, 0x71, + 0xDE, 0xEC, 0x56, 0x71, 0x44, 0x35, 0xCF, 0x94, + 0xCC, 0xF4, 0x59, 0x9E, 0x00, 0xD1, 0x0E, 0x56, + 0x96, 0x22, 0xBA, 0xDA, 0x82, 0x0C, 0x45, 0x2F, + 0x25, 0x42, 0xAD, 0xF0, 0x87, 0x65, 0xCA, 0x93, + 0xAE, 0x38, 0xEB, 0x02, 0x5D, 0xE3, 0x1C, 0xFF, + 0x79, 0x74, 0x54, 0x9A, 0x78, 0x25, 0xA8, 0x31, + 0xDD, 0x05, 0x4E, 0x87, 0xB8, 0x4C, 0x5F, 0x25, + 0x47, 0xFF, 0x47, 0xB4, 0x6F, 0x88, 0xC9, 0x9F, + 0x15, 0x48, 0xE9, 0x33, 0xA6, 0xF4, 0xD8, 0x7F, + 0x1A, 0x4A, 0x1B, 0x00, 0xE3, 0x9E, 0x02, 0xD6, + 0x0E, 0x51, 0xEB, 0x60, 0x3C, 0x1C, 0x0D, 0x80, + 0x7A, 0xCD, 0xAB, 0x08, 0xBA, 0xA2, 0xB9, 0x98, + 0x69, 0xB7, 0x5C, 0xA2, 0xC4, 0xB9, 0x63, 0x68, + 0xB5, 0x17, 0x80, 0xBD, 0x1E, 0xC7, 0x5B, 0x11, + 0x0B, 0x9F, 0xA6, 0x65, 0x56, 0x87, 0x6C, 0x5F, + 0x48, 0x79, 0x7D, 0x09, 0x01, 0x38, 0xF7, 0x54, + 0xAE, 0x30, 0x53, 0x3D, 0x36, 0xAA, 0x44, 0xB9, + 0xB1, 0x70, 0x2A, 0x6A, 0x8A, 0x56, 0x62, 0x6B, + 0xF0, 0x45, 0x1A, 0x37, 0xA7, 0xAC, 0x1A, 0x33, + 0x70, 0x76, 0xE5, 0x1E, 0x0A, 0x6B, 0x03, 0x00, + 0xC2, 0xC7, 0x90, 0xA4, 0x43, 0x7E, 0xA2, 0x8D, + 0x7E, 0xC9, 0x8C, 0x41, 0x9B, 0x37, 0xD6, 0xAA, + 0x97, 0x04, 0x17, 0x43, 0x5F, 0x91, 0xBE, 0xDC, + 0x2B, 0x1F, 0x4B, 0xC8, 0x15, 0x8A, 0x51, 0xB1, + 0xF4, 0x71, 0x51, 0x6F, 0xE8, 0x24, 0x28, 0x7C, + 0x89, 0x6B, 0x89, 0x1B, 0x49, 0xF2, 0x54, 0xDD, + 0x36, 0x35, 0x9B, 0x89, 0xC8, 0x24, 0xEB, 0x3F, + 0x62, 0x48, 0x02, 0x7F, 0xBB, 0xAD, 0x4C, 0xF2, + 0x91, 0x18, 0xCB, 0x50, 0xEB, 0xB6, 0x25, 0xA3, + 0x7C, 0x53, 0x7A, 0x02, 0x23, 0xF0, 0xEB, 0x70, + 0x85, 0xB5, 0xC7, 0xEC, 0x60, 0x75, 0x70, 0xDB, + 0x91, 0x85, 0xD5, 0x99, 0x02, 0xBC, 0x26, 0xC6, + 0x54, 0xA2, 0x80, 0x4C, 0x0D, 0x94, 0x67, 0x93, + 0xD8, 0xA2, 0x14, 0x82, 0xAC, 0x4F, 0x05, 0xE9, + 0x01, 0x62, 0x60, 0x33, 0x1D, 0xCC, 0x58, 0xBC, + 0x66, 0xAF, 0x3C, 0xA7, 0x58, 0x54, 0x40, 0x21, + 0x6A, 0xA0, 0x26, 0x3B, 0x2A, 0x72, 0x5E, 0x08, + 0x0F, 0x6F, 0x9C, 0x5B, 0x6A, 0x9C, 0x9D, 0xA2, + 0x93, 0x55, 0x18, 0x9B, 0x4B, 0x95, 0xB1, 0x37, + 0xD1, 0x22, 0x5F, 0x25, 0x2A, 0xC7, 0x97, 0xB0, + 0x64, 0x6C, 0xAC, 0x52, 0x16, 0x4B, 0x59, 0x72, + 0xA9, 0x92, 0x65, 0xD3, 0x47, 0xFC, 0x7C, 0x35, + 0x91, 0xD1, 0x5F, 0xFE, 0x68, 0x1C, 0x06, 0xD4, + 0x38, 0xCC, 0xEB, 0x60, 0xBB, 0x63, 0x10, 0xB7, + 0x95, 0x32, 0x89, 0x72, 0x0E, 0x2C, 0x72, 0x87, + 0x30, 0x05, 0x23, 0x37, 0xAC, 0xA7, 0xC8, 0x52, + 0x1A, 0xB4, 0x4F, 0x1E, 0x2A, 0x04, 0x9B, 0x83, + 0xE0, 0x77, 0x4C, 0x96, 0xCD, 0x8C, 0x87, 0x6F, + 0xA6, 0x75, 0xD0, 0x92, 0x39, 0x77, 0x27, 0x1B + }; + static const byte dk_1024[KYBER1024_PRIVATE_KEY_SIZE] = { + 0x8A, 0xD0, 0xB5, 0xF0, 0x9A, 0x25, 0xAA, 0x93, + 0x5D, 0xD9, 0xDA, 0x34, 0xAB, 0x82, 0xCA, 0x75, + 0xA1, 0x2D, 0x66, 0xE9, 0x9C, 0xF4, 0x8B, 0xCA, + 0x45, 0xB9, 0xB2, 0xDB, 0x44, 0x1B, 0xC2, 0x97, + 0x1B, 0xDC, 0x99, 0x22, 0xB5, 0xF8, 0xBC, 0x3C, + 0x06, 0x78, 0x54, 0x67, 0x59, 0x07, 0x3C, 0xB8, + 0x8E, 0x26, 0xBA, 0xD1, 0xB1, 0xB3, 0xA4, 0x64, + 0x6A, 0x65, 0x29, 0xC6, 0x32, 0xEA, 0xA3, 0x47, + 0x73, 0x4A, 0x3B, 0xE5, 0x83, 0xD4, 0x71, 0x78, + 0x09, 0x4C, 0x4A, 0x67, 0x0C, 0xBC, 0x41, 0xEC, + 0x06, 0x89, 0x76, 0x56, 0x68, 0x54, 0x2E, 0x6F, + 0x15, 0xA7, 0xD5, 0x86, 0xC9, 0xE2, 0x6A, 0x6A, + 0x03, 0xC7, 0x14, 0x69, 0xC2, 0xC5, 0x3F, 0x7B, + 0x14, 0x1B, 0x23, 0x2D, 0x86, 0x21, 0x6A, 0x25, + 0xC7, 0xA8, 0xF3, 0x68, 0x52, 0x85, 0x8C, 0x07, + 0xA9, 0x52, 0x4E, 0xE1, 0x7B, 0xA6, 0x34, 0x0A, + 0xA2, 0xA2, 0x15, 0xC1, 0xEA, 0x85, 0x21, 0x67, + 0xB6, 0x89, 0x1C, 0xC1, 0x66, 0xC2, 0xFA, 0x13, + 0xA0, 0x27, 0x0A, 0x22, 0x98, 0x34, 0x13, 0xE0, + 0xAC, 0xC4, 0x44, 0xBF, 0x40, 0xE2, 0x8C, 0x45, + 0xE1, 0x4E, 0x07, 0x40, 0x4F, 0x62, 0x99, 0x63, + 0x69, 0x59, 0x7F, 0x10, 0xFC, 0xC1, 0x80, 0xEC, + 0xAC, 0xAD, 0x1A, 0x67, 0x19, 0xAB, 0x9F, 0x1B, + 0x44, 0x7A, 0xE1, 0x9A, 0x2C, 0xB0, 0x2A, 0x7D, + 0x04, 0x20, 0x61, 0x72, 0x16, 0x8C, 0x4F, 0x0A, + 0x99, 0xBA, 0xFA, 0x93, 0x2D, 0x66, 0x49, 0xE8, + 0x94, 0xA8, 0xF0, 0x57, 0x7B, 0x81, 0xC6, 0x64, + 0x83, 0xC5, 0xB5, 0xCF, 0x60, 0xAE, 0x75, 0xA4, + 0x44, 0x52, 0x6A, 0x9B, 0x36, 0x74, 0x32, 0x5F, + 0xBA, 0x38, 0xF5, 0x32, 0x96, 0x42, 0x1A, 0x78, + 0x50, 0x11, 0xC1, 0xDD, 0xB3, 0xA6, 0x99, 0x77, + 0x45, 0xDB, 0x83, 0xCD, 0x58, 0x3C, 0x0C, 0x41, + 0x77, 0xC7, 0x97, 0xD4, 0x0A, 0x4F, 0x69, 0x9F, + 0x1F, 0x40, 0xC5, 0x41, 0x3A, 0xC4, 0xE4, 0x23, + 0x73, 0x49, 0x2B, 0x6A, 0x2C, 0x6A, 0x40, 0x6D, + 0x43, 0x7F, 0x42, 0x57, 0x0B, 0x5E, 0x94, 0x9E, + 0xF4, 0x35, 0x0D, 0xEA, 0x79, 0x0C, 0xFE, 0xB7, + 0x2D, 0x12, 0x87, 0x51, 0x7F, 0xE3, 0x27, 0x3D, + 0x3C, 0xA6, 0x5A, 0x13, 0xCA, 0x6E, 0x23, 0xC5, + 0x7B, 0xF0, 0x7D, 0xA0, 0x4B, 0x85, 0x1C, 0xF3, + 0xAF, 0xA1, 0x8B, 0xAF, 0x5E, 0xF0, 0x20, 0x79, + 0x28, 0x57, 0xA9, 0xE7, 0x21, 0xF0, 0x1B, 0x9F, + 0xEA, 0x7B, 0x61, 0x2E, 0x4C, 0x6E, 0x29, 0x07, + 0x93, 0x66, 0xB0, 0x22, 0x86, 0x88, 0xBE, 0x2A, + 0x06, 0x7F, 0xBE, 0x92, 0x84, 0x2D, 0xD2, 0x80, + 0xB3, 0xC7, 0x4D, 0xFA, 0xB7, 0x61, 0xE6, 0x13, + 0xA8, 0x60, 0x4C, 0x47, 0x6E, 0x15, 0x46, 0x66, + 0x85, 0xC6, 0x95, 0xAC, 0x35, 0x79, 0x1A, 0x91, + 0x59, 0x94, 0x2F, 0x60, 0x17, 0x0C, 0xA2, 0x14, + 0xC7, 0xC0, 0x9B, 0x1A, 0x4B, 0x1B, 0xCC, 0x4F, + 0x4C, 0xC6, 0x0D, 0xF0, 0x1A, 0x10, 0x19, 0x15, + 0xA9, 0xA2, 0xBC, 0x55, 0x31, 0x19, 0x66, 0x50, + 0x32, 0xDC, 0xD9, 0x47, 0x6F, 0xBA, 0x7B, 0xB0, + 0x71, 0x57, 0xD3, 0x3C, 0x9C, 0x8E, 0xFA, 0x6B, + 0xD0, 0xAC, 0x38, 0xC1, 0xAC, 0x26, 0x5F, 0xB5, + 0x18, 0x57, 0xD0, 0x15, 0x17, 0x61, 0x53, 0x26, + 0xCA, 0x0E, 0x08, 0x65, 0x0B, 0xA6, 0xFA, 0x40, + 0x83, 0x2C, 0x7B, 0x4C, 0x41, 0xB6, 0x44, 0x71, + 0x60, 0x22, 0xB6, 0x52, 0xB1, 0x92, 0x7D, 0x55, + 0xC9, 0xB3, 0x7F, 0xE2, 0x5F, 0x1A, 0xB6, 0x7A, + 0x9A, 0x03, 0xC7, 0x00, 0x8C, 0x84, 0xB0, 0x7C, + 0x49, 0x26, 0xB6, 0x38, 0x1E, 0x40, 0xCF, 0xD4, + 0x41, 0x04, 0x12, 0x35, 0x18, 0x74, 0x16, 0xCE, + 0xC3, 0x66, 0xCA, 0x6F, 0xB7, 0x6F, 0xA0, 0xAB, + 0x6E, 0x32, 0x8A, 0x26, 0x41, 0xFC, 0x47, 0xDC, + 0xD7, 0x6E, 0x91, 0xCA, 0x94, 0x31, 0xE1, 0x9B, + 0xFF, 0x02, 0xCE, 0x62, 0x28, 0xC2, 0x33, 0x63, + 0x82, 0xF8, 0xA1, 0x0E, 0x9E, 0xE2, 0xC8, 0xF1, + 0x75, 0x93, 0x90, 0xA2, 0x00, 0x24, 0xA1, 0x5B, + 0x3B, 0x09, 0x0C, 0x13, 0x90, 0xCA, 0x03, 0x43, + 0x79, 0x72, 0x84, 0x24, 0x6B, 0xD8, 0x94, 0x35, + 0x07, 0xB7, 0xA6, 0xB7, 0x1F, 0xC3, 0x3A, 0x03, + 0xB7, 0xA8, 0x83, 0x66, 0xE4, 0xAF, 0xED, 0x51, + 0x57, 0x39, 0xE5, 0xC6, 0x9F, 0x8A, 0x26, 0x6E, + 0x4A, 0x1F, 0x53, 0xD7, 0x39, 0x30, 0xE9, 0x87, + 0x55, 0x69, 0x31, 0x2B, 0x27, 0x03, 0x7E, 0x5C, + 0x7F, 0x85, 0x21, 0x00, 0xC2, 0xBA, 0x36, 0x48, + 0xB1, 0xB9, 0xC1, 0xB1, 0x49, 0xF6, 0x25, 0x0E, + 0x0A, 0x6B, 0x06, 0x52, 0x13, 0x13, 0x4F, 0x30, + 0x25, 0x69, 0x75, 0x5B, 0x8C, 0x5C, 0x4F, 0xFC, + 0x68, 0x0B, 0xF7, 0x81, 0x18, 0x45, 0x34, 0x00, + 0x35, 0xF1, 0x70, 0xB0, 0x68, 0xBA, 0x67, 0xA4, + 0xC3, 0xB0, 0x16, 0x6D, 0x03, 0xCC, 0x82, 0x61, + 0x84, 0x01, 0x90, 0xA2, 0x0F, 0x9A, 0x3B, 0x1E, + 0xF4, 0x65, 0xC2, 0xF2, 0x18, 0x2D, 0xA8, 0xDA, + 0x8D, 0x3B, 0x3C, 0x8C, 0xB1, 0x29, 0x15, 0xF7, + 0xD9, 0x3E, 0x04, 0xD8, 0x84, 0x0C, 0x35, 0x67, + 0x25, 0x5A, 0x7B, 0xD6, 0xD4, 0x33, 0xCF, 0x10, + 0x68, 0xD8, 0x84, 0x52, 0xCF, 0xC1, 0x1F, 0x99, + 0x1B, 0x7C, 0xE3, 0x79, 0x27, 0xD6, 0xCA, 0xAE, + 0x88, 0x10, 0x74, 0x2F, 0x42, 0x14, 0x8B, 0x89, + 0x6E, 0xC4, 0xEB, 0xB5, 0x34, 0x03, 0x86, 0x31, + 0x5B, 0x2C, 0x1E, 0x2B, 0x43, 0x91, 0x5C, 0x04, + 0x54, 0x9C, 0xC8, 0xC1, 0x9A, 0xB4, 0x0E, 0x3B, + 0x7C, 0x31, 0x1B, 0x42, 0x61, 0x10, 0xA9, 0xBB, + 0xB1, 0x8D, 0x3B, 0x99, 0x2A, 0x42, 0xC0, 0x18, + 0x92, 0x90, 0xBE, 0x67, 0x3A, 0x39, 0x7C, 0x40, + 0x90, 0x44, 0x3B, 0x88, 0xC5, 0xD5, 0xC5, 0x65, + 0xA1, 0x0F, 0xEA, 0x05, 0x60, 0x3D, 0x36, 0x24, + 0x4A, 0x4A, 0xA8, 0xE9, 0x25, 0x5C, 0xF1, 0x84, + 0xAE, 0x69, 0x53, 0x5A, 0x83, 0x99, 0xC1, 0xC6, + 0xF7, 0x6C, 0xF2, 0x34, 0x2A, 0xDF, 0xEA, 0x6A, + 0x44, 0x7B, 0xB4, 0x50, 0x1B, 0x9A, 0x6C, 0x44, + 0x59, 0x3E, 0xB0, 0x43, 0xE7, 0xA5, 0x50, 0x2F, + 0x58, 0x6C, 0xF3, 0x40, 0x7D, 0xEB, 0x7A, 0x0F, + 0xC3, 0x2B, 0x3F, 0x46, 0xF1, 0x24, 0x5C, 0x55, + 0x96, 0xE0, 0xF1, 0xBE, 0xD9, 0x37, 0x20, 0x7C, + 0x45, 0x09, 0xE1, 0xD8, 0x98, 0x5B, 0xE7, 0x45, + 0xFD, 0x69, 0xBF, 0x44, 0x80, 0x92, 0x43, 0x30, + 0x28, 0xBE, 0x25, 0x95, 0x90, 0x33, 0x11, 0x47, + 0x95, 0x86, 0xA3, 0x4B, 0x2D, 0x49, 0x10, 0x74, + 0x10, 0xBC, 0x4B, 0xD2, 0x96, 0x53, 0x17, 0xFC, + 0x76, 0x35, 0x2B, 0x63, 0x8D, 0xF3, 0xB3, 0xA3, + 0x15, 0x32, 0x50, 0x26, 0x80, 0x9E, 0x3B, 0xC4, + 0x60, 0x8C, 0x0B, 0x2C, 0xB8, 0x4D, 0xF0, 0xC9, + 0x5B, 0xC0, 0x52, 0x70, 0x7F, 0xC1, 0xA3, 0x77, + 0xB2, 0xB4, 0x65, 0xEB, 0x7A, 0x5D, 0x64, 0x4A, + 0xB4, 0x27, 0x8D, 0xDC, 0xE5, 0xB6, 0x1E, 0x2B, + 0xB3, 0xA7, 0x10, 0x52, 0x55, 0x5C, 0xB3, 0xBA, + 0xC6, 0x93, 0xEF, 0x02, 0x5F, 0xF0, 0x03, 0x53, + 0xFB, 0x76, 0x94, 0x5B, 0x8A, 0xA3, 0xE9, 0x95, + 0x0F, 0x92, 0x73, 0x81, 0x87, 0x91, 0xCC, 0xAD, + 0x56, 0x88, 0x46, 0x58, 0x14, 0x2A, 0x2B, 0x4D, + 0xF3, 0xC5, 0x7E, 0xCA, 0x13, 0xAD, 0x44, 0xB4, + 0x9B, 0x63, 0x46, 0xC6, 0x3E, 0xE8, 0x90, 0x78, + 0x58, 0x9E, 0x9E, 0xB9, 0xA9, 0x80, 0x4A, 0x03, + 0xBF, 0x7A, 0x27, 0x6F, 0x86, 0xB9, 0x67, 0x6C, + 0x58, 0xD3, 0xE7, 0x1D, 0x2C, 0x87, 0x70, 0x80, + 0x4A, 0x61, 0x59, 0x21, 0x78, 0xB4, 0x49, 0xC7, + 0x95, 0x5B, 0xBE, 0x8C, 0xF4, 0x2F, 0x31, 0x67, + 0x25, 0xE3, 0xB1, 0x6D, 0x55, 0xB5, 0x27, 0xCF, + 0xB2, 0x32, 0x68, 0x1B, 0x21, 0xB2, 0xCB, 0x2F, + 0x30, 0xAC, 0x76, 0x01, 0x5B, 0xB5, 0x41, 0x6A, + 0x04, 0x11, 0xC1, 0x74, 0x58, 0x92, 0x41, 0x2E, + 0x68, 0x3A, 0x98, 0xD7, 0x36, 0xED, 0x1A, 0x4C, + 0xD9, 0x80, 0x61, 0x7D, 0x08, 0x21, 0xC2, 0xAB, + 0x02, 0x82, 0x07, 0x0A, 0x61, 0x1A, 0x11, 0xD1, + 0x97, 0x01, 0xFB, 0xD5, 0x5A, 0x21, 0x27, 0xB3, + 0x24, 0xE6, 0x90, 0x1D, 0x84, 0x98, 0x6C, 0x04, + 0x64, 0xDE, 0x71, 0x20, 0xAF, 0x45, 0x10, 0xAF, + 0x59, 0x1D, 0xD9, 0xBB, 0x79, 0x47, 0x9C, 0x5F, + 0xA8, 0x87, 0x14, 0xC6, 0xA9, 0x97, 0x14, 0xF7, + 0x6A, 0x1E, 0x40, 0x2C, 0x8F, 0x38, 0x4A, 0x4E, + 0xE6, 0xBC, 0xD4, 0x15, 0x00, 0x72, 0x4C, 0xC1, + 0x79, 0x3A, 0xBF, 0xD8, 0xD3, 0xC2, 0xF3, 0x20, + 0x39, 0x71, 0x34, 0xB0, 0x0F, 0x76, 0x2D, 0xBA, + 0x85, 0xA2, 0x3A, 0xF1, 0x55, 0xE6, 0xCC, 0x03, + 0x73, 0x80, 0xC1, 0xDD, 0x64, 0xA9, 0x73, 0xDB, + 0x35, 0xB7, 0x44, 0x70, 0x44, 0x8B, 0x24, 0x21, + 0x20, 0x62, 0x76, 0x47, 0x87, 0xE5, 0xA9, 0x3A, + 0x48, 0x80, 0x71, 0x71, 0xA7, 0x71, 0x5C, 0xFC, + 0x89, 0xBC, 0xBC, 0x9E, 0x14, 0x18, 0x86, 0xF8, + 0x07, 0xA1, 0xF9, 0xD6, 0x84, 0xC8, 0x42, 0x6F, + 0x01, 0x22, 0x88, 0x7D, 0x9C, 0x4C, 0x27, 0xEA, + 0x69, 0xCC, 0x15, 0x1B, 0x4D, 0x49, 0xB5, 0x1E, + 0x5A, 0x4E, 0xAA, 0xA5, 0xAD, 0x06, 0xAB, 0xA8, + 0x6D, 0xF9, 0x42, 0xE9, 0x86, 0xA5, 0xD5, 0x79, + 0x20, 0x80, 0xFC, 0x48, 0x03, 0x96, 0xB3, 0x94, + 0x86, 0x68, 0xFB, 0x38, 0x2C, 0xC8, 0xFC, 0x15, + 0x47, 0x48, 0xCB, 0x30, 0xB7, 0x64, 0x1F, 0x02, + 0x70, 0xC8, 0x34, 0x38, 0xB4, 0xFC, 0x3D, 0x19, + 0x01, 0x26, 0x58, 0x80, 0x40, 0x51, 0x77, 0xBC, + 0x7F, 0x44, 0x78, 0x82, 0x51, 0xAB, 0xC4, 0x74, + 0x27, 0x35, 0x31, 0x21, 0x2A, 0x66, 0x27, 0x9E, + 0x70, 0x33, 0x7A, 0x23, 0x09, 0xFD, 0xF4, 0x9E, + 0x05, 0x9B, 0xBD, 0xAF, 0x49, 0x73, 0xA5, 0x37, + 0x7A, 0x4D, 0x51, 0x7B, 0xA7, 0x55, 0x70, 0x2C, + 0x37, 0xCC, 0x35, 0x56, 0x85, 0x40, 0x4C, 0x95, + 0x2F, 0xB6, 0x7E, 0x04, 0x19, 0xC7, 0x8D, 0x15, + 0x84, 0xD0, 0x94, 0x92, 0x54, 0xD0, 0x49, 0x52, + 0xF7, 0x24, 0x3B, 0xF1, 0x40, 0x28, 0x03, 0xC9, + 0xFC, 0x73, 0x73, 0x25, 0x88, 0x13, 0x78, 0xCA, + 0x77, 0xEE, 0xF5, 0xC4, 0x15, 0xFB, 0x03, 0x7D, + 0x68, 0x9A, 0x58, 0x54, 0xA1, 0xD2, 0x4B, 0x65, + 0x27, 0xA5, 0x9B, 0x9B, 0x16, 0x95, 0x93, 0x84, + 0x35, 0x8C, 0x42, 0x3C, 0x79, 0x64, 0x5C, 0xCF, + 0x31, 0x33, 0xE2, 0x1B, 0x4B, 0x64, 0x95, 0x7B, + 0x14, 0xF6, 0x3F, 0x2A, 0xA2, 0x63, 0x57, 0xB1, + 0xC2, 0x62, 0xF2, 0xA9, 0x0F, 0x7C, 0xCC, 0x2A, + 0x15, 0x93, 0x69, 0x99, 0xB0, 0xA1, 0xB4, 0x98, + 0xAB, 0x3B, 0x32, 0x43, 0x30, 0x32, 0xC9, 0xCA, + 0x23, 0x08, 0x1C, 0x55, 0xD3, 0x1C, 0xAD, 0x36, + 0xE9, 0x0C, 0x1C, 0xE0, 0xB5, 0xFC, 0x24, 0x7C, + 0xE8, 0xC8, 0x43, 0xF2, 0x88, 0x35, 0x24, 0xB6, + 0x64, 0xFA, 0xC1, 0xB2, 0x0B, 0xE6, 0x02, 0xA1, + 0x0A, 0xAF, 0x65, 0x73, 0x86, 0x80, 0xBB, 0x10, + 0x25, 0x44, 0x26, 0xF9, 0xCB, 0x09, 0xA1, 0x95, + 0x4D, 0xB7, 0x65, 0x56, 0x22, 0x30, 0x8F, 0xAE, + 0xF5, 0x05, 0xAC, 0xB4, 0x97, 0x55, 0x4A, 0x8F, + 0xCF, 0xA9, 0x6A, 0x85, 0x25, 0x5A, 0xD8, 0x46, + 0x54, 0x20, 0x13, 0xB8, 0x41, 0x59, 0x51, 0xBD, + 0xD4, 0x5C, 0x01, 0x93, 0x1E, 0xBE, 0x58, 0x3E, + 0x70, 0xE1, 0x3F, 0x30, 0x15, 0x17, 0xB5, 0xA4, + 0x0D, 0x70, 0x36, 0x1F, 0x63, 0x09, 0x41, 0x60, + 0x67, 0x64, 0x6D, 0x2B, 0x71, 0x36, 0x62, 0x6B, + 0xCC, 0xCC, 0x17, 0x0C, 0x66, 0xCE, 0xD4, 0x90, + 0xC7, 0x35, 0x34, 0x4B, 0x62, 0x77, 0x09, 0x7C, + 0xA9, 0x14, 0x21, 0x2A, 0x29, 0x2D, 0xD1, 0x22, + 0xFB, 0xB6, 0x9F, 0xDE, 0xCA, 0x47, 0xFA, 0xB4, + 0x53, 0x2B, 0x8C, 0x80, 0xCE, 0xB7, 0x7F, 0x9C, + 0x54, 0x3E, 0x0B, 0xF1, 0x53, 0x6D, 0x1C, 0x0C, + 0xAE, 0x07, 0x7E, 0x2C, 0xA7, 0x86, 0x2B, 0x45, + 0xA4, 0x10, 0x46, 0x9C, 0xC5, 0xB7, 0x06, 0xBA, + 0xE0, 0x05, 0x1C, 0xB2, 0x96, 0x1D, 0xB7, 0x27, + 0x0B, 0x75, 0xB7, 0x11, 0x69, 0x8D, 0x2B, 0x80, + 0x70, 0x40, 0xD5, 0x62, 0x81, 0x29, 0x43, 0x6F, + 0xBB, 0x58, 0xF1, 0x20, 0x3F, 0x75, 0x56, 0x14, + 0x65, 0xF5, 0x42, 0x57, 0xE4, 0x4D, 0x33, 0xF5, + 0x12, 0xD6, 0x33, 0x43, 0x1D, 0x00, 0xA2, 0xFB, + 0x02, 0x30, 0xC9, 0xBB, 0x9C, 0xDD, 0xFC, 0x83, + 0xBD, 0x65, 0xC9, 0x74, 0x45, 0x30, 0x21, 0x86, + 0xA1, 0x72, 0x23, 0xAD, 0x21, 0x33, 0x28, 0x03, + 0xB9, 0x09, 0xE5, 0xE5, 0x67, 0x19, 0x70, 0xBB, + 0xB0, 0xF1, 0xC4, 0x83, 0x7B, 0xB8, 0x42, 0x73, + 0xBA, 0x67, 0x5A, 0xC0, 0x74, 0xC5, 0x29, 0x0B, + 0x41, 0x1C, 0x25, 0x00, 0x65, 0x70, 0x59, 0x33, + 0x9D, 0xE3, 0x92, 0xF9, 0xCA, 0x30, 0x89, 0x52, + 0xA2, 0x20, 0x1A, 0x58, 0x87, 0x67, 0xAD, 0xC0, + 0x35, 0xBD, 0xF3, 0x30, 0x24, 0xEA, 0x3B, 0x9A, + 0x83, 0xC5, 0xA0, 0xB9, 0xC5, 0x42, 0x5D, 0x14, + 0x07, 0x0C, 0x81, 0xAA, 0xDA, 0x26, 0xBA, 0xC3, + 0xFB, 0xB8, 0xD4, 0xB7, 0xCF, 0xEE, 0x03, 0x92, + 0x37, 0x5C, 0x68, 0x42, 0x73, 0x51, 0xDF, 0xEC, + 0x63, 0x60, 0x9B, 0xBB, 0x50, 0xB4, 0x63, 0xE0, + 0x40, 0x92, 0x85, 0x70, 0x09, 0xD1, 0xE5, 0xB8, + 0x1D, 0x70, 0x7D, 0x14, 0xB8, 0x33, 0xCD, 0x4A, + 0x0B, 0x55, 0x1B, 0xAA, 0x13, 0xEC, 0x48, 0x8A, + 0x15, 0x03, 0xB0, 0x46, 0x7E, 0xE4, 0x02, 0x3C, + 0x3F, 0xE0, 0x32, 0xC7, 0x82, 0x25, 0x06, 0x38, + 0x86, 0xE2, 0x46, 0x8E, 0x00, 0xF7, 0x00, 0x07, + 0x2A, 0x2E, 0xC8, 0xDA, 0x6A, 0xFB, 0x20, 0x6C, + 0x91, 0x90, 0x44, 0x33, 0xBB, 0xCC, 0xB0, 0xE7, + 0x6F, 0x42, 0x46, 0x8C, 0x40, 0xEB, 0x5F, 0x59, + 0xCB, 0x9A, 0xE1, 0xB0, 0x35, 0xE5, 0x21, 0x51, + 0x0B, 0xF2, 0x16, 0xA1, 0xAB, 0xCB, 0x19, 0x03, + 0x3B, 0x7A, 0x65, 0x88, 0x97, 0xC6, 0x58, 0x74, + 0xD5, 0x13, 0x51, 0x83, 0x14, 0x9F, 0x97, 0x9E, + 0x55, 0x3C, 0xCF, 0xBF, 0xA3, 0x90, 0x0C, 0xDA, + 0x6F, 0x01, 0x96, 0x0B, 0x75, 0x15, 0x7F, 0x54, + 0x53, 0xAA, 0x6E, 0x73, 0xB3, 0xED, 0x90, 0x2F, + 0x7D, 0x7C, 0x93, 0x05, 0x97, 0x1B, 0xDF, 0x72, + 0x2E, 0x29, 0x37, 0x16, 0x9A, 0x1B, 0xC0, 0xFA, + 0xEB, 0x6C, 0x92, 0xF7, 0x15, 0x0D, 0x23, 0x30, + 0x87, 0x7C, 0x5D, 0xC5, 0x24, 0x9A, 0xAE, 0x20, + 0x30, 0x26, 0x34, 0xC5, 0xC5, 0xB2, 0x30, 0x53, + 0x52, 0x10, 0x28, 0x12, 0x25, 0x42, 0xF4, 0x85, + 0xA0, 0xEA, 0xC8, 0x69, 0x22, 0x37, 0x20, 0x63, + 0x36, 0x51, 0xF5, 0xB2, 0x47, 0xC6, 0x62, 0xB3, + 0x1A, 0x10, 0x53, 0x8C, 0xA7, 0x49, 0x1B, 0x14, + 0x37, 0xAA, 0x74, 0xF4, 0x28, 0x2D, 0x12, 0x97, + 0x4D, 0x9C, 0x93, 0x4D, 0xF2, 0x14, 0x78, 0x5B, + 0x64, 0x18, 0x46, 0x8B, 0x92, 0xE5, 0x25, 0x28, + 0xC8, 0x44, 0x7A, 0x1C, 0xA4, 0x22, 0xFA, 0x6C, + 0xC8, 0x8E, 0x28, 0xB0, 0x59, 0xF0, 0x4B, 0x23, + 0x59, 0x73, 0x23, 0xF7, 0x2F, 0x3E, 0x23, 0x36, + 0xF8, 0x7C, 0x47, 0x90, 0x5C, 0xBA, 0x65, 0x5B, + 0xB7, 0x3F, 0xC3, 0x2E, 0x18, 0xD4, 0xB7, 0x87, + 0x05, 0xC7, 0x82, 0xEB, 0xCB, 0x43, 0xE2, 0x78, + 0x5C, 0x82, 0xC5, 0xAF, 0x24, 0xB0, 0xE1, 0x69, + 0x9C, 0xFB, 0xC0, 0x25, 0x74, 0x75, 0x79, 0x9A, + 0x53, 0x9B, 0x11, 0xA5, 0x0F, 0x4D, 0xF2, 0xB7, + 0xFA, 0xA2, 0x0B, 0xD8, 0x82, 0x75, 0x15, 0xCA, + 0x37, 0x0F, 0x89, 0xC0, 0xD4, 0xC6, 0x09, 0x02, + 0xF6, 0x56, 0x7C, 0xD6, 0x0B, 0x08, 0x60, 0xA5, + 0x5B, 0xC8, 0x57, 0x2C, 0x43, 0x6C, 0x24, 0x6A, + 0xC2, 0x76, 0x64, 0x4E, 0x7D, 0x60, 0x2A, 0xA5, + 0x7C, 0x01, 0x66, 0x20, 0x18, 0x14, 0x99, 0x1C, + 0x1B, 0xD7, 0x5C, 0x7C, 0x47, 0xC3, 0x48, 0xB6, + 0x7D, 0x77, 0x61, 0x33, 0x86, 0x90, 0x81, 0x44, + 0xEA, 0x83, 0xFF, 0x72, 0x1F, 0x9A, 0x50, 0x07, + 0x6C, 0x51, 0x01, 0x64, 0xD1, 0x8E, 0x05, 0xD0, + 0x5D, 0x98, 0x84, 0xC4, 0x41, 0x46, 0xA0, 0x7C, + 0xCA, 0xCF, 0x89, 0x04, 0x98, 0xED, 0x1A, 0x19, + 0xB2, 0xA1, 0x54, 0x31, 0x72, 0x9D, 0xC1, 0xF1, + 0x2B, 0x7E, 0xA1, 0x0F, 0x9F, 0x92, 0x80, 0x62, + 0xD1, 0x45, 0x4B, 0x4B, 0x9F, 0x68, 0xE5, 0x99, + 0x90, 0x29, 0x0B, 0xE3, 0x72, 0x8B, 0x32, 0x89, + 0x56, 0x93, 0x63, 0xAB, 0x10, 0x05, 0x13, 0x1B, + 0x23, 0x81, 0xA0, 0x8C, 0xC2, 0xBF, 0x94, 0x3E, + 0x95, 0xD5, 0xB2, 0x1B, 0xC6, 0xAA, 0xBC, 0x22, + 0x73, 0x34, 0x8B, 0xC7, 0x2B, 0xD0, 0x93, 0xB7, + 0xB5, 0x61, 0x7A, 0xE8, 0x7F, 0x60, 0x2B, 0xB9, + 0x89, 0xE6, 0xAF, 0xC4, 0x4B, 0x81, 0x51, 0x20, + 0x76, 0xA3, 0xA8, 0x76, 0xE0, 0xE2, 0x5F, 0x97, + 0x62, 0xB4, 0x62, 0x08, 0x19, 0x85, 0x50, 0x2F, + 0x26, 0xB2, 0x87, 0xA2, 0x93, 0x6D, 0x5B, 0x1A, + 0xCF, 0xFC, 0xEC, 0x4E, 0xEE, 0x77, 0xA9, 0xCB, + 0xA9, 0x80, 0xEB, 0x9B, 0x5F, 0xDE, 0x75, 0x53, + 0x9F, 0x65, 0x09, 0x04, 0x67, 0x7D, 0xBE, 0x29, + 0xAB, 0x8B, 0xB9, 0x18, 0xA3, 0x49, 0x48, 0x03, + 0xEC, 0xA5, 0x9A, 0x2C, 0x32, 0xE5, 0xB5, 0xC8, + 0x3B, 0x0B, 0x80, 0xB1, 0x10, 0x2C, 0xD7, 0xD9, + 0x48, 0x2B, 0x45, 0x9B, 0x6B, 0x74, 0x49, 0x1E, + 0xC3, 0x0C, 0x4B, 0xE7, 0x7C, 0x2B, 0x52, 0x4A, + 0xF7, 0xB3, 0xAD, 0x1F, 0x71, 0x34, 0x1D, 0xF0, + 0xA7, 0x6F, 0x25, 0x5C, 0x29, 0x03, 0xC8, 0x82, + 0x08, 0x07, 0x93, 0x79, 0x93, 0x0A, 0x95, 0x13, + 0xF3, 0x90, 0x12, 0x6E, 0x73, 0x2A, 0x2B, 0xB0, + 0x94, 0xBF, 0xA6, 0xBF, 0x0A, 0x43, 0x2B, 0xCD, + 0x65, 0x7D, 0xAF, 0xCB, 0x25, 0xC8, 0xBB, 0x15, + 0xE0, 0x95, 0x5D, 0x09, 0x9B, 0x74, 0xFF, 0x1A, + 0x4D, 0xE6, 0x55, 0x9C, 0xD6, 0x79, 0x7C, 0x38, + 0xC4, 0x8C, 0x11, 0x34, 0xCA, 0x2C, 0x97, 0x92, + 0x43, 0xF3, 0x15, 0x2A, 0xF4, 0xBB, 0xE4, 0xD7, + 0xA6, 0xBC, 0x09, 0x87, 0x21, 0x33, 0x92, 0x0C, + 0xD2, 0x3B, 0x3E, 0xF9, 0x84, 0x8C, 0xCC, 0x68, + 0x45, 0xD6, 0x47, 0xB5, 0x38, 0x75, 0x57, 0x73, + 0x65, 0x13, 0xD5, 0x85, 0x60, 0x84, 0x51, 0x92, + 0xF9, 0x26, 0x51, 0x59, 0x93, 0x2E, 0x57, 0x2A, + 0x88, 0xC4, 0x4E, 0x65, 0x66, 0x76, 0x0C, 0x06, + 0x1C, 0x67, 0xFC, 0xB5, 0xBF, 0x21, 0x00, 0x95, + 0xE2, 0x14, 0xDA, 0x74, 0x53, 0x57, 0xE3, 0x69, + 0x96, 0xD8, 0xC0, 0x66, 0x31, 0x1B, 0xBC, 0x76, + 0x1A, 0x1F, 0xD2, 0x52, 0x73, 0xD2, 0x1E, 0xAB, + 0x50, 0x01, 0x05, 0x63, 0xCD, 0x64, 0x68, 0xA4, + 0xEA, 0x83, 0x6B, 0x6D, 0x64, 0xBD, 0x2B, 0xD7, + 0x6D, 0xBE, 0x35, 0x82, 0xD5, 0x73, 0x6A, 0x60, + 0x5A, 0x55, 0x09, 0xFC, 0x28, 0x78, 0x9B, 0x56, + 0xB8, 0x84, 0xAE, 0x9A, 0x60, 0x41, 0x5F, 0x55, + 0x67, 0x4B, 0xE6, 0x01, 0x57, 0x6C, 0x7C, 0xEE, + 0x58, 0x14, 0x3B, 0xF0, 0x54, 0x80, 0x6A, 0xBC, + 0xB3, 0x45, 0xA2, 0x56, 0xCB, 0xC4, 0x54, 0xE3, + 0x43, 0xF3, 0xCC, 0x7A, 0xDE, 0x65, 0x56, 0x2F, + 0xD2, 0x9E, 0xB2, 0x59, 0x73, 0x7B, 0xB3, 0xCF, + 0x96, 0x49, 0xBD, 0xEA, 0x28, 0x3F, 0xB0, 0x72, + 0x65, 0x67, 0x7C, 0x98, 0x08, 0xD1, 0x31, 0x19, + 0xC0, 0xA2, 0xAD, 0xF7, 0x45, 0xDE, 0x69, 0x75, + 0xF4, 0x56, 0x2C, 0xD6, 0x15, 0x57, 0xB3, 0x96, + 0x5D, 0x2B, 0x07, 0x2F, 0x00, 0x0A, 0xA7, 0xE0, + 0xA3, 0x57, 0xE1, 0x25, 0x3E, 0xAF, 0xEA, 0x7F, + 0xDF, 0xCC, 0x92, 0xFA, 0x87, 0x63, 0x0D, 0xD2, + 0x27, 0x6C, 0xE4, 0x2E, 0x82, 0x0B, 0x69, 0xD1, + 0xFC, 0x2E, 0x47, 0xD5, 0xC4, 0x98, 0xA5, 0x5B, + 0x3B, 0x29, 0xC3, 0x4E, 0x64, 0x90, 0x3D, 0x04, + 0x7A, 0xB1, 0xC0, 0x40, 0x24, 0x95, 0x8F, 0x70, + 0x11, 0x95, 0xF5, 0xD1, 0x3E, 0xC6, 0x70, 0x6B, + 0x84, 0x48, 0x50, 0x3A, 0x54, 0x99, 0x22, 0xA5, + 0x8A, 0x24, 0xB6, 0x7C, 0x93, 0x63, 0x27, 0x56, + 0xB7, 0x7D, 0x22, 0x54, 0x07, 0x31, 0x61, 0x71, + 0xDE, 0xEC, 0x56, 0x71, 0x44, 0x35, 0xCF, 0x94, + 0xCC, 0xF4, 0x59, 0x9E, 0x00, 0xD1, 0x0E, 0x56, + 0x96, 0x22, 0xBA, 0xDA, 0x82, 0x0C, 0x45, 0x2F, + 0x25, 0x42, 0xAD, 0xF0, 0x87, 0x65, 0xCA, 0x93, + 0xAE, 0x38, 0xEB, 0x02, 0x5D, 0xE3, 0x1C, 0xFF, + 0x79, 0x74, 0x54, 0x9A, 0x78, 0x25, 0xA8, 0x31, + 0xDD, 0x05, 0x4E, 0x87, 0xB8, 0x4C, 0x5F, 0x25, + 0x47, 0xFF, 0x47, 0xB4, 0x6F, 0x88, 0xC9, 0x9F, + 0x15, 0x48, 0xE9, 0x33, 0xA6, 0xF4, 0xD8, 0x7F, + 0x1A, 0x4A, 0x1B, 0x00, 0xE3, 0x9E, 0x02, 0xD6, + 0x0E, 0x51, 0xEB, 0x60, 0x3C, 0x1C, 0x0D, 0x80, + 0x7A, 0xCD, 0xAB, 0x08, 0xBA, 0xA2, 0xB9, 0x98, + 0x69, 0xB7, 0x5C, 0xA2, 0xC4, 0xB9, 0x63, 0x68, + 0xB5, 0x17, 0x80, 0xBD, 0x1E, 0xC7, 0x5B, 0x11, + 0x0B, 0x9F, 0xA6, 0x65, 0x56, 0x87, 0x6C, 0x5F, + 0x48, 0x79, 0x7D, 0x09, 0x01, 0x38, 0xF7, 0x54, + 0xAE, 0x30, 0x53, 0x3D, 0x36, 0xAA, 0x44, 0xB9, + 0xB1, 0x70, 0x2A, 0x6A, 0x8A, 0x56, 0x62, 0x6B, + 0xF0, 0x45, 0x1A, 0x37, 0xA7, 0xAC, 0x1A, 0x33, + 0x70, 0x76, 0xE5, 0x1E, 0x0A, 0x6B, 0x03, 0x00, + 0xC2, 0xC7, 0x90, 0xA4, 0x43, 0x7E, 0xA2, 0x8D, + 0x7E, 0xC9, 0x8C, 0x41, 0x9B, 0x37, 0xD6, 0xAA, + 0x97, 0x04, 0x17, 0x43, 0x5F, 0x91, 0xBE, 0xDC, + 0x2B, 0x1F, 0x4B, 0xC8, 0x15, 0x8A, 0x51, 0xB1, + 0xF4, 0x71, 0x51, 0x6F, 0xE8, 0x24, 0x28, 0x7C, + 0x89, 0x6B, 0x89, 0x1B, 0x49, 0xF2, 0x54, 0xDD, + 0x36, 0x35, 0x9B, 0x89, 0xC8, 0x24, 0xEB, 0x3F, + 0x62, 0x48, 0x02, 0x7F, 0xBB, 0xAD, 0x4C, 0xF2, + 0x91, 0x18, 0xCB, 0x50, 0xEB, 0xB6, 0x25, 0xA3, + 0x7C, 0x53, 0x7A, 0x02, 0x23, 0xF0, 0xEB, 0x70, + 0x85, 0xB5, 0xC7, 0xEC, 0x60, 0x75, 0x70, 0xDB, + 0x91, 0x85, 0xD5, 0x99, 0x02, 0xBC, 0x26, 0xC6, + 0x54, 0xA2, 0x80, 0x4C, 0x0D, 0x94, 0x67, 0x93, + 0xD8, 0xA2, 0x14, 0x82, 0xAC, 0x4F, 0x05, 0xE9, + 0x01, 0x62, 0x60, 0x33, 0x1D, 0xCC, 0x58, 0xBC, + 0x66, 0xAF, 0x3C, 0xA7, 0x58, 0x54, 0x40, 0x21, + 0x6A, 0xA0, 0x26, 0x3B, 0x2A, 0x72, 0x5E, 0x08, + 0x0F, 0x6F, 0x9C, 0x5B, 0x6A, 0x9C, 0x9D, 0xA2, + 0x93, 0x55, 0x18, 0x9B, 0x4B, 0x95, 0xB1, 0x37, + 0xD1, 0x22, 0x5F, 0x25, 0x2A, 0xC7, 0x97, 0xB0, + 0x64, 0x6C, 0xAC, 0x52, 0x16, 0x4B, 0x59, 0x72, + 0xA9, 0x92, 0x65, 0xD3, 0x47, 0xFC, 0x7C, 0x35, + 0x91, 0xD1, 0x5F, 0xFE, 0x68, 0x1C, 0x06, 0xD4, + 0x38, 0xCC, 0xEB, 0x60, 0xBB, 0x63, 0x10, 0xB7, + 0x95, 0x32, 0x89, 0x72, 0x0E, 0x2C, 0x72, 0x87, + 0x30, 0x05, 0x23, 0x37, 0xAC, 0xA7, 0xC8, 0x52, + 0x1A, 0xB4, 0x4F, 0x1E, 0x2A, 0x04, 0x9B, 0x83, + 0xE0, 0x77, 0x4C, 0x96, 0xCD, 0x8C, 0x87, 0x6F, + 0xA6, 0x75, 0xD0, 0x92, 0x39, 0x77, 0x27, 0x1B, + 0xE6, 0xE8, 0x32, 0xF2, 0x49, 0x8C, 0xA5, 0xA3, + 0x43, 0x1F, 0x40, 0xD3, 0x18, 0x7B, 0x1E, 0xD9, + 0x65, 0xFD, 0xD6, 0x69, 0x3B, 0x37, 0xF6, 0xEB, + 0x40, 0x8A, 0x99, 0x97, 0x7A, 0xE4, 0x96, 0x44, + 0x7A, 0xF6, 0x50, 0x22, 0xE0, 0xA4, 0x72, 0xED, + 0x63, 0x88, 0x63, 0x8E, 0xA2, 0x9D, 0x82, 0xDA, + 0x68, 0xB4, 0xCF, 0x9F, 0xFD, 0xF2, 0xB6, 0x7C, + 0xD7, 0x08, 0xEA, 0x5A, 0x37, 0x0C, 0x6A, 0x7C + }; +#endif + static byte pubKey[KYBER_MAX_PUBLIC_KEY_SIZE]; + static byte privKey[KYBER_MAX_PRIVATE_KEY_SIZE]; + + key = (KyberKey*)XMALLOC(sizeof(KyberKey), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + if (key != NULL) { + XMEMSET(key, 0, sizeof(KyberKey)); + } + +#ifndef WOLFSSL_NO_KYBER512 + ExpectIntEQ(wc_KyberKey_Init(KYBER512, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_MakeKeyWithRandom(key, seed_512, sizeof(seed_512)), + 0); + ExpectIntEQ(wc_KyberKey_EncodePublicKey(key, pubKey, + KYBER512_PUBLIC_KEY_SIZE), 0); + ExpectIntEQ(wc_KyberKey_EncodePrivateKey(key, privKey, + KYBER512_PRIVATE_KEY_SIZE), 0); + ExpectIntEQ(XMEMCMP(pubKey, ek_512, KYBER512_PUBLIC_KEY_SIZE), 0); + ExpectIntEQ(XMEMCMP(privKey, dk_512, KYBER512_PRIVATE_KEY_SIZE), 0); + wc_KyberKey_Free(key); +#endif +#ifndef WOLFSSL_NO_KYBER768 + ExpectIntEQ(wc_KyberKey_Init(KYBER768, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_MakeKeyWithRandom(key, seed_768, sizeof(seed_768)), + 0); + ExpectIntEQ(wc_KyberKey_EncodePublicKey(key, pubKey, + KYBER768_PUBLIC_KEY_SIZE), 0); + ExpectIntEQ(wc_KyberKey_EncodePrivateKey(key, privKey, + KYBER768_PRIVATE_KEY_SIZE), 0); + ExpectIntEQ(XMEMCMP(pubKey, ek_768, KYBER768_PUBLIC_KEY_SIZE), 0); + ExpectIntEQ(XMEMCMP(privKey, dk_768, KYBER768_PRIVATE_KEY_SIZE), 0); + wc_KyberKey_Free(key); +#endif +#ifndef WOLFSSL_NO_KYBER1024 + ExpectIntEQ(wc_KyberKey_Init(KYBER1024, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_MakeKeyWithRandom(key, seed_1024, + sizeof(seed_1024)), 0); + ExpectIntEQ(wc_KyberKey_EncodePublicKey(key, pubKey, + KYBER1024_PUBLIC_KEY_SIZE), 0); + ExpectIntEQ(wc_KyberKey_EncodePrivateKey(key, privKey, + KYBER1024_PRIVATE_KEY_SIZE), 0); + ExpectIntEQ(XMEMCMP(pubKey, ek_1024, KYBER1024_PUBLIC_KEY_SIZE), 0); + ExpectIntEQ(XMEMCMP(privKey, dk_1024, KYBER1024_PRIVATE_KEY_SIZE), 0); + wc_KyberKey_Free(key); +#endif + + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_kyber_encapsulate_kats(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_KYBER) && defined(WOLFSSL_WC_KYBER) && \ + defined(WOLFSSL_ML_KEM) + KyberKey* key; +#ifndef WOLFSSL_NO_KYBER512 + static const byte ek_512[KYBER512_PUBLIC_KEY_SIZE] = { + 0xA5, 0x40, 0x97, 0x18, 0xCB, 0x72, 0xF2, 0x43, + 0x8A, 0x35, 0x55, 0xA3, 0xC8, 0xF1, 0x8F, 0x26, + 0x71, 0xA1, 0xF8, 0x14, 0x03, 0xDF, 0x7B, 0x5A, + 0x46, 0x59, 0xA5, 0x1F, 0x50, 0x82, 0x7B, 0xA6, + 0x57, 0x7A, 0xA7, 0x08, 0x00, 0xD7, 0x8D, 0x8B, + 0xC5, 0xAA, 0x86, 0xB8, 0x9E, 0x08, 0xB5, 0x8F, + 0x34, 0x80, 0xA8, 0x9E, 0x10, 0x4D, 0xC6, 0x92, + 0x2E, 0xDB, 0xC1, 0x2D, 0x06, 0xF8, 0x91, 0x02, + 0x7C, 0x65, 0x4E, 0x99, 0x4A, 0x22, 0xF9, 0x1A, + 0x2A, 0xF6, 0x34, 0x04, 0xCA, 0x98, 0xD7, 0xB6, + 0x7E, 0xEA, 0x25, 0x91, 0x1B, 0x24, 0xC7, 0x0D, + 0xEB, 0x81, 0x46, 0xA0, 0x82, 0x1F, 0x34, 0xA3, + 0x02, 0x55, 0x1F, 0x2D, 0x51, 0x0C, 0x05, 0x88, + 0xC8, 0xBC, 0xA7, 0x4E, 0xB4, 0xDC, 0x0C, 0xFA, + 0x46, 0x03, 0xC1, 0xC5, 0xA3, 0xC5, 0x53, 0x70, + 0x61, 0x78, 0x90, 0x68, 0x68, 0x2C, 0x4C, 0xC3, + 0x14, 0x3F, 0xBA, 0x9B, 0xB5, 0x54, 0x2F, 0x97, + 0x78, 0xBD, 0xF2, 0x3B, 0x36, 0x52, 0xF2, 0xA7, + 0x52, 0x47, 0x56, 0xFA, 0x73, 0x90, 0x9D, 0xDA, + 0xC7, 0xE5, 0x32, 0x52, 0x26, 0x59, 0x21, 0x8C, + 0xBA, 0x25, 0xF3, 0x3B, 0x6B, 0x04, 0x58, 0xCB, + 0x03, 0xDA, 0x79, 0x35, 0xBA, 0x59, 0x11, 0x19, + 0x55, 0x31, 0x2B, 0x15, 0xCC, 0xE2, 0xC0, 0xF7, + 0x34, 0x66, 0xA8, 0x00, 0x62, 0x83, 0xA2, 0xAA, + 0x7C, 0xBB, 0x61, 0x02, 0x2A, 0xBB, 0xC2, 0xD1, + 0x9F, 0x29, 0x20, 0xBC, 0x30, 0x24, 0x72, 0xDC, + 0x97, 0xC4, 0xA1, 0x78, 0x8C, 0x9B, 0xD3, 0xBB, + 0xED, 0xC9, 0x12, 0x2B, 0x82, 0x7B, 0x27, 0x9C, + 0x07, 0x4C, 0x80, 0x44, 0x31, 0x41, 0x11, 0x9F, + 0x4B, 0x16, 0x29, 0xF6, 0x2F, 0x10, 0xD4, 0xCE, + 0x2B, 0xE3, 0xBB, 0x34, 0x38, 0x16, 0xCA, 0xD1, + 0x6A, 0x1C, 0x87, 0x58, 0x2F, 0x2B, 0x70, 0xE2, + 0x66, 0x35, 0xB0, 0x8B, 0xB3, 0x90, 0xC1, 0x33, + 0x98, 0xFC, 0xCD, 0xA7, 0xE9, 0xBB, 0x3D, 0x9B, + 0x0B, 0x78, 0x03, 0x75, 0x0C, 0x95, 0x5C, 0x57, + 0xA0, 0x28, 0xA5, 0xD2, 0x6C, 0x27, 0x03, 0x16, + 0xBB, 0x2B, 0x81, 0x5C, 0x3B, 0x97, 0x2B, 0xA6, + 0x78, 0x2D, 0xAB, 0x02, 0xF3, 0x06, 0x82, 0x1E, + 0x61, 0x28, 0x5B, 0xB0, 0x72, 0xBF, 0x79, 0x78, + 0x1C, 0xAB, 0xC3, 0x86, 0x14, 0x2A, 0x50, 0xC7, + 0xAA, 0xAE, 0x66, 0xA9, 0x47, 0x58, 0x5B, 0xB0, + 0xD8, 0x28, 0x8D, 0xBC, 0xAF, 0x4B, 0x3B, 0x85, + 0xBB, 0x79, 0x26, 0x98, 0x7B, 0xAF, 0x76, 0x43, + 0xAA, 0xB5, 0xFB, 0x02, 0x21, 0x05, 0x80, 0xA0, + 0x26, 0x43, 0x52, 0xE6, 0x9C, 0x60, 0x98, 0x98, + 0x9C, 0xFB, 0x87, 0x48, 0x33, 0x95, 0x96, 0x0A, + 0x3A, 0x4F, 0x31, 0xBE, 0xFD, 0xA8, 0x0B, 0x5F, + 0x28, 0x6E, 0xCF, 0xDA, 0xA5, 0x55, 0xD4, 0x39, + 0x0A, 0xF6, 0xB5, 0x5D, 0x31, 0x39, 0x20, 0x92, + 0x90, 0x93, 0x44, 0x9C, 0xD6, 0x72, 0x9D, 0x00, + 0x21, 0x8E, 0x2D, 0x86, 0x57, 0x0A, 0xDC, 0x0C, + 0x4F, 0x65, 0x45, 0xFF, 0xB5, 0x63, 0x2E, 0xFB, + 0x3A, 0xAE, 0x26, 0x25, 0xA6, 0x98, 0x26, 0x70, + 0xFA, 0xCE, 0x8D, 0x16, 0x12, 0x6F, 0xA6, 0x07, + 0xE6, 0xD0, 0xA1, 0xFF, 0x61, 0x6A, 0x46, 0xEC, + 0xA6, 0x42, 0xCC, 0x6A, 0xAC, 0x55, 0x4D, 0xBB, + 0xC4, 0x3D, 0xFC, 0xF5, 0x7F, 0x36, 0x4C, 0x19, + 0x0C, 0xEA, 0x57, 0x76, 0xC1, 0xCE, 0xB5, 0x8B, + 0x70, 0x07, 0x50, 0x5F, 0xD7, 0x9C, 0x5F, 0x00, + 0x5A, 0x4B, 0xA2, 0x18, 0xCF, 0x06, 0x93, 0xB0, + 0x58, 0xB5, 0x10, 0xA4, 0xCA, 0x20, 0x43, 0x24, + 0x60, 0x2F, 0x59, 0xBB, 0x8F, 0x22, 0x81, 0xC4, + 0xD7, 0xB0, 0xBC, 0x86, 0x25, 0xE7, 0x88, 0x16, + 0x50, 0xF5, 0x7C, 0x89, 0xE3, 0x2C, 0xF4, 0x80, + 0x91, 0x44, 0x77, 0x5C, 0x90, 0x73, 0xB6, 0x73, + 0xE3, 0x94, 0x12, 0xA2, 0x7C, 0x91, 0x43, 0x21, + 0xCC, 0xB6, 0xA7, 0xCF, 0x7C, 0x37, 0xC5, 0xBC, + 0xBE, 0x7C, 0xA5, 0x1B, 0xE0, 0xC9, 0x28, 0x46, + 0x6A, 0x45, 0x8E, 0xB7, 0x78, 0xD6, 0x46, 0x6A, + 0x89, 0x2A, 0x0A, 0xCB, 0xC0, 0x96, 0x38, 0x78, + 0x4A, 0x27, 0x73, 0x9C, 0x97, 0x0C, 0xA5, 0x8B, + 0xC2, 0x59, 0x5A, 0xD6, 0xBF, 0xA4, 0xE5, 0x2E, + 0xB4, 0x38, 0xAC, 0x97, 0xC4, 0x16, 0x23, 0x80, + 0x22, 0x48, 0xE1, 0x10, 0xB0, 0x74, 0x83, 0x8F, + 0x31, 0xA6, 0xE7, 0x50, 0x37, 0x37, 0x70, 0x4E, + 0x7A, 0xE4, 0xAD, 0x91, 0x29, 0x95, 0x72, 0xA8, + 0xC1, 0x36, 0x03, 0x50, 0x0F, 0x36, 0x09, 0xB6, + 0x25, 0xB4, 0xE2, 0x4C, 0xAE, 0x33, 0x2B, 0x0D, + 0x7A, 0x5B, 0xB4, 0x7A, 0x03, 0x85, 0x12, 0xA0, + 0x81, 0xBC, 0x27, 0xCD, 0xF0, 0xF2, 0x92, 0x3C, + 0xD3, 0x47, 0x9F, 0x53, 0x07, 0x02, 0x0B, 0x77, + 0xF1, 0x49, 0x58, 0x45, 0x64, 0x06, 0x0E, 0x50, + 0x83, 0xCE, 0xD5, 0x53, 0x12, 0xB6, 0xA6, 0xA4, + 0x65, 0xA8, 0x2B, 0x45, 0x77, 0xD6, 0x3A, 0x4B, + 0x49, 0xC8, 0x0B, 0x07, 0xA9, 0x36, 0x7E, 0x39, + 0x77, 0x8A, 0xF7, 0x6F, 0xA8, 0xEC, 0x2C, 0xF5, + 0x28, 0x72, 0x28, 0x56, 0xCE, 0x78, 0x13, 0x40, + 0x1A, 0x83, 0x83, 0xBD, 0xB7, 0x15, 0x1B, 0x9B, + 0x6D, 0x2D, 0xD6, 0xBF, 0xF5, 0x54, 0x01, 0xD2, + 0x8A, 0xC6, 0x12, 0x81, 0x8C, 0x88, 0xC9, 0x28, + 0x73, 0x47, 0xB0, 0x98, 0xA9, 0x66, 0xEB, 0x9C, + 0x0A, 0x2D, 0xB7, 0x1F, 0x0A, 0x75, 0x55, 0x5E, + 0x17, 0x57, 0xD3, 0xAC, 0x4E, 0x3D, 0x80, 0x2C, + 0x8D, 0xC6, 0xA2, 0x61, 0x52, 0x12, 0x55, 0x18, + 0x6A, 0xBB, 0x98, 0xC2, 0x48, 0x03, 0x01, 0xB8, + 0xC6, 0xB3, 0x12, 0x28, 0xB5, 0x44, 0x61, 0xBC, + 0x44, 0xEA, 0x3C, 0x2C, 0xF9, 0x4B, 0x86, 0xC7, + 0xA5, 0xB8, 0x2C, 0x55, 0x16, 0x7A, 0x76, 0x06, + 0xCA, 0x9D, 0xC8, 0x25, 0x3B, 0x76, 0x04, 0xE4, + 0x4A, 0x07, 0xF3, 0xED, 0x55, 0xCD, 0x5B, 0x5E + }; + static const byte seed_512[KYBER_ENC_RAND_SZ] = { + 0x10, 0x9A, 0x24, 0x8F, 0xE8, 0x05, 0x2F, 0x84, + 0x27, 0x1F, 0xF5, 0x7B, 0xAC, 0x15, 0x6B, 0x1B, + 0xA6, 0xA5, 0x09, 0xCD, 0xCD, 0xBC, 0xC9, 0x6C, + 0xCD, 0xB1, 0xCC, 0xB8, 0x5C, 0xA4, 0x93, 0x15 + }; + static const byte c_512[KYBER512_CIPHER_TEXT_SIZE] = { + 0x59, 0x7A, 0x06, 0xDE, 0xB8, 0x81, 0x72, 0xBA, + 0x8D, 0x7C, 0xDE, 0x8D, 0x82, 0xCA, 0xA2, 0x34, + 0xB8, 0x11, 0x2A, 0xF8, 0xA7, 0x2F, 0x1A, 0xB4, + 0xCE, 0xA1, 0xEF, 0xCB, 0x2D, 0x86, 0x8D, 0x53, + 0xD2, 0x12, 0xE3, 0x03, 0xB7, 0x0E, 0x7E, 0x52, + 0x1A, 0xB0, 0xF4, 0xB5, 0xDB, 0x4F, 0x51, 0x15, + 0x92, 0x48, 0xBF, 0xB2, 0x75, 0x36, 0x1B, 0xEF, + 0x88, 0x37, 0x52, 0xC7, 0x8B, 0x8D, 0x47, 0x12, + 0x27, 0x53, 0x85, 0x53, 0x6A, 0x4B, 0x0A, 0x96, + 0xE3, 0xC2, 0x3E, 0xA6, 0xC1, 0x7E, 0xA9, 0x2B, + 0x60, 0x26, 0x16, 0xE5, 0x82, 0x1E, 0x57, 0x53, + 0xA4, 0x73, 0x6C, 0x40, 0x39, 0xC2, 0x0C, 0x92, + 0x3C, 0xCE, 0xCB, 0x57, 0x98, 0x05, 0x58, 0x7C, + 0x0C, 0xE7, 0x22, 0x18, 0xBB, 0x1A, 0xB1, 0x24, + 0x52, 0xF8, 0xE1, 0x54, 0xCB, 0x86, 0x43, 0x32, + 0x81, 0x42, 0xF9, 0xB3, 0x40, 0xA6, 0x41, 0xC6, + 0xF2, 0x95, 0xE5, 0xEC, 0xF2, 0xE0, 0x48, 0xBC, + 0x7F, 0xC7, 0x9B, 0xC5, 0xB9, 0x42, 0x77, 0xC8, + 0x68, 0xD8, 0xE5, 0x36, 0xB5, 0x04, 0x25, 0x80, + 0x9D, 0xCF, 0xA0, 0x24, 0xA3, 0x90, 0x5C, 0xBA, + 0x55, 0x0A, 0xD3, 0xBB, 0x52, 0xB4, 0x59, 0xAC, + 0x38, 0xFA, 0xBC, 0x9B, 0xC0, 0x0E, 0xBA, 0x03, + 0xEC, 0x09, 0x06, 0x72, 0x5B, 0x4F, 0xE4, 0xE9, + 0x76, 0xF1, 0x74, 0x32, 0x00, 0x47, 0xB3, 0x1D, + 0x15, 0x89, 0x13, 0x65, 0xBA, 0x48, 0x23, 0x88, + 0xF0, 0xFB, 0x97, 0x3B, 0x85, 0x22, 0x4F, 0xB0, + 0x0B, 0xA8, 0x65, 0xAF, 0xAB, 0x3C, 0x9A, 0x1B, + 0x7D, 0x48, 0x9F, 0x7B, 0x98, 0x2D, 0x0B, 0xD4, + 0x70, 0xEF, 0x94, 0x8E, 0xCB, 0x5B, 0x39, 0x20, + 0xAF, 0x89, 0x03, 0x59, 0x60, 0x12, 0x3B, 0x1F, + 0x86, 0x30, 0xD7, 0x63, 0x68, 0x1B, 0xFD, 0x67, + 0x15, 0x67, 0xEF, 0xBB, 0x1E, 0x62, 0x76, 0xAA, + 0x4F, 0xB2, 0xDF, 0xA9, 0xC3, 0x94, 0x8D, 0xB7, + 0xF0, 0x83, 0xF2, 0x83, 0x83, 0xB7, 0x7B, 0xC5, + 0x14, 0xAF, 0x9D, 0x68, 0xD2, 0x2E, 0x24, 0x87, + 0xC2, 0x01, 0x63, 0xC0, 0x2B, 0x0B, 0xBF, 0x23, + 0xBB, 0xCE, 0x06, 0x50, 0xF8, 0x4F, 0xF8, 0xCE, + 0x02, 0xC7, 0x4E, 0x9E, 0x11, 0xD6, 0xF3, 0x0E, + 0xC5, 0xFA, 0x8A, 0x01, 0x2A, 0xDC, 0x3B, 0x89, + 0x62, 0x7C, 0x7D, 0xE8, 0x55, 0xC1, 0xFB, 0xBE, + 0xB5, 0xDC, 0xDE, 0x84, 0xD0, 0x5E, 0x36, 0xC5, + 0x56, 0x6E, 0x55, 0x51, 0xB5, 0x87, 0x50, 0xA4, + 0x11, 0x64, 0x26, 0x39, 0xB2, 0x78, 0x64, 0xF7, + 0xE0, 0x05, 0x97, 0x8F, 0xFE, 0x25, 0x6B, 0x75, + 0x7D, 0x13, 0xDA, 0x66, 0x3F, 0xC3, 0xBB, 0x07, + 0x94, 0xA2, 0x7C, 0xF7, 0x58, 0x5D, 0x12, 0xF2, + 0x2D, 0x95, 0x3B, 0x28, 0x54, 0x59, 0xFD, 0xC9, + 0xBC, 0xDF, 0xCD, 0xCC, 0xB7, 0xBF, 0x3E, 0x4E, + 0x36, 0x2D, 0x28, 0x91, 0xD5, 0x83, 0x85, 0x5F, + 0x5D, 0x94, 0x87, 0xE6, 0xFB, 0x21, 0x7E, 0x2E, + 0x45, 0xEE, 0x0B, 0xD9, 0xAF, 0xC2, 0x89, 0xF4, + 0xD5, 0x64, 0x58, 0x12, 0x09, 0xA3, 0xAC, 0xA3, + 0x17, 0x95, 0xA1, 0x24, 0xBD, 0x1B, 0xBA, 0xEA, + 0x84, 0x67, 0x55, 0xC8, 0xEA, 0x78, 0x10, 0xEA, + 0xA7, 0x30, 0x60, 0xE8, 0x6F, 0xB5, 0xFD, 0xF3, + 0xFB, 0xE7, 0x2F, 0x80, 0x6B, 0xB1, 0xBF, 0xBF, + 0xBA, 0xC0, 0xC7, 0xB1, 0x6B, 0xFE, 0x74, 0x25, + 0x02, 0x77, 0xEC, 0xF5, 0xF5, 0x41, 0x57, 0x1B, + 0x8A, 0x97, 0x50, 0x50, 0x91, 0x7F, 0xDF, 0x78, + 0x1F, 0xEA, 0x17, 0xB5, 0x85, 0xE3, 0xC6, 0xDB, + 0xFE, 0x77, 0xB1, 0xE4, 0x8A, 0x16, 0x50, 0x4C, + 0x3A, 0x38, 0x90, 0x11, 0x56, 0x10, 0x0C, 0xAF, + 0xEC, 0x2E, 0xD9, 0x39, 0xAE, 0x9A, 0x9E, 0xDF, + 0xC9, 0xC0, 0xF8, 0xC7, 0xF5, 0x5C, 0xC9, 0x3E, + 0x5D, 0xDD, 0x0B, 0x3D, 0xE1, 0xC6, 0xED, 0xAE, + 0x2B, 0x7E, 0xE3, 0x4C, 0x61, 0x01, 0xF0, 0x11, + 0xB5, 0x90, 0x4F, 0x69, 0x3D, 0x28, 0x63, 0x56, + 0xB5, 0x4C, 0x86, 0xCE, 0x8B, 0xCF, 0xEA, 0x9D, + 0xBF, 0xEC, 0x21, 0xC1, 0xEF, 0x0E, 0xCC, 0x91, + 0x05, 0x00, 0x5B, 0xAA, 0x37, 0x7D, 0x82, 0x9D, + 0xCA, 0x2C, 0xBF, 0x5E, 0xA5, 0xF3, 0x1B, 0x71, + 0xD4, 0x46, 0xB8, 0x33, 0xE0, 0x06, 0x19, 0x81, + 0x9D, 0x7F, 0xC6, 0x02, 0x40, 0x52, 0x49, 0x97, + 0x57, 0xA2, 0x76, 0x5F, 0x19, 0xCD, 0x2B, 0x36, + 0xC2, 0x48, 0x85, 0x99, 0xDC, 0x52, 0x47, 0x49, + 0x4F, 0xAB, 0xE8, 0x1E, 0xEB, 0xEF, 0xD3, 0xBE, + 0x75, 0xC4, 0x78, 0x0E, 0x43, 0xA5, 0x04, 0x18, + 0xC5, 0xDB, 0x2F, 0xF3, 0x59, 0xC5, 0xA6, 0xDE, + 0x28, 0x6E, 0xF5, 0x95, 0x1E, 0x27, 0x09, 0x48, + 0x6E, 0xDC, 0x9C, 0xC4, 0x9D, 0x07, 0x24, 0xEC, + 0xA3, 0xF2, 0xC0, 0xB7, 0x5F, 0x8A, 0x36, 0xCE, + 0x86, 0x23, 0x88, 0xF0, 0x0B, 0x3C, 0x59, 0x3D, + 0x1C, 0x8C, 0x6A, 0xC4, 0x5D, 0x73, 0xA7, 0x2F, + 0xF6, 0xB4, 0xF8, 0x05, 0xB1, 0x31, 0xED, 0x4E, + 0xAF, 0x56, 0x01, 0xD7, 0xB7, 0x3B, 0x0E, 0x37, + 0x24, 0xE7, 0x5D, 0x58, 0xDD, 0x50, 0xF5, 0x87, + 0x1C, 0x54, 0xA3, 0x7C, 0x14, 0x81, 0x33, 0x17, + 0x59, 0xF4, 0xBE, 0x86, 0xFB, 0x58, 0xA2, 0xEE, + 0x00, 0x31, 0x30, 0xF6, 0x6E, 0x18, 0x7C, 0x8B, + 0xA5, 0x01, 0x5B, 0xE7, 0x13, 0x29, 0x65, 0x89, + 0xAC, 0xAF, 0xBF, 0x65, 0x96, 0x89, 0x7E, 0x03, + 0xD4, 0x92, 0x0C, 0x91, 0xF2, 0x63, 0x33, 0xB7, + 0xBF, 0x17, 0x98, 0xAF, 0x81, 0x5C, 0x93, 0xD4, + 0xDF, 0x55, 0xBD, 0x47, 0xA0, 0x82, 0x49, 0xBF, + 0x11, 0x30, 0x63, 0xFB, 0xB3, 0x95, 0x03, 0xE9, + 0xB6, 0xD4, 0x3E, 0xAC, 0x7B, 0x0C, 0x30, 0x5A + }; + static const byte k_512[KYBER_SS_SZ] = { + 0x4D, 0xDD, 0x30, 0x4E, 0x27, 0x48, 0x99, 0xBD, + 0x82, 0x97, 0x18, 0x56, 0x82, 0x4B, 0x58, 0x71, + 0x30, 0x92, 0x79, 0x52, 0x06, 0x01, 0x21, 0x85, + 0x8F, 0x9A, 0xDE, 0xB9, 0x6A, 0xB7, 0xF5, 0x71 + }; +#endif +#ifndef WOLFSSL_NO_KYBER768 + static const byte ek_768[KYBER768_PUBLIC_KEY_SIZE] = { + 0x14, 0x56, 0xA2, 0xEE, 0x8C, 0x35, 0x56, 0x05, + 0x4A, 0xBC, 0x79, 0xB4, 0x88, 0x2C, 0x31, 0x90, + 0xE5, 0xCA, 0x72, 0x6A, 0xB4, 0x02, 0xE5, 0xB0, + 0x97, 0x28, 0xC0, 0xF4, 0xF7, 0x9C, 0x9F, 0xC2, + 0xAD, 0xD8, 0x28, 0xAB, 0xE4, 0x32, 0xB1, 0x50, + 0x1B, 0x60, 0xF4, 0x6C, 0xCB, 0xC8, 0x6A, 0x33, + 0x78, 0xC3, 0x48, 0x95, 0x70, 0x8A, 0x13, 0x67, + 0x1B, 0x20, 0xB3, 0x89, 0x47, 0x9A, 0xAA, 0x01, + 0xC6, 0x9D, 0x6B, 0x3B, 0x7D, 0x07, 0xD1, 0xC3, + 0xAB, 0x54, 0xB9, 0x1C, 0x58, 0x0F, 0x5A, 0x33, + 0x6B, 0x30, 0x06, 0x9A, 0x4F, 0x13, 0x4F, 0xFD, + 0x37, 0x64, 0xCE, 0x73, 0xA0, 0x47, 0xE2, 0x84, + 0x47, 0x71, 0x74, 0x2B, 0xF4, 0x71, 0x0B, 0x97, + 0x2D, 0x4F, 0x65, 0x90, 0xA1, 0xC5, 0x3A, 0x97, + 0x53, 0x68, 0xC2, 0x71, 0xB6, 0x70, 0xF1, 0xA4, + 0x03, 0x64, 0x41, 0x05, 0x4A, 0x66, 0xE8, 0x81, + 0x59, 0x97, 0x51, 0x22, 0x88, 0x55, 0x2F, 0xD7, + 0x14, 0x9F, 0xFB, 0x70, 0x5A, 0xAE, 0x13, 0x3F, + 0x84, 0x14, 0x06, 0x0D, 0x00, 0x92, 0xFA, 0x8A, + 0x16, 0x27, 0xD7, 0x8A, 0xB2, 0xAB, 0xC6, 0x69, + 0x62, 0x88, 0xBA, 0xF5, 0xC6, 0x0E, 0xF3, 0x70, + 0x82, 0x7A, 0x7E, 0xFA, 0x72, 0xAE, 0x5C, 0x67, + 0x41, 0xA5, 0xDA, 0x04, 0x3D, 0x59, 0x40, 0xF1, + 0x21, 0x48, 0x53, 0x72, 0xA9, 0x8F, 0x47, 0x2D, + 0x60, 0xF0, 0x5F, 0x74, 0xD9, 0x5F, 0x01, 0xA1, + 0x99, 0x1E, 0x73, 0xA3, 0xE0, 0xA9, 0x53, 0x64, + 0x67, 0xA4, 0x73, 0x8A, 0xB4, 0xCF, 0x38, 0x5B, + 0xA7, 0x72, 0x82, 0x7E, 0xB8, 0xCC, 0x05, 0x8B, + 0x35, 0x72, 0xE4, 0x0B, 0x59, 0x84, 0x44, 0xC1, + 0x81, 0xC7, 0xF6, 0xD9, 0xB7, 0x60, 0xA7, 0xB9, + 0x07, 0x09, 0x2E, 0x9C, 0x33, 0x51, 0xEA, 0x23, + 0x4E, 0x44, 0x49, 0xBD, 0x9B, 0x61, 0xA1, 0x34, + 0x65, 0x4E, 0x2D, 0xA1, 0x91, 0xFF, 0x07, 0x93, + 0x96, 0x15, 0x69, 0xD3, 0x59, 0x44, 0x48, 0xBB, + 0xC2, 0x58, 0x69, 0x99, 0xA6, 0x67, 0x1E, 0xFC, + 0xA9, 0x57, 0xF3, 0xA6, 0x69, 0x9A, 0x4A, 0x1B, + 0x2F, 0x47, 0x07, 0xAB, 0xA0, 0xB2, 0xDB, 0x20, + 0x11, 0x4F, 0xE6, 0x8A, 0x4E, 0x28, 0x15, 0xAF, + 0x3A, 0xAC, 0x4B, 0x8C, 0x6B, 0xE5, 0x64, 0x8C, + 0x50, 0xCC, 0x35, 0xC2, 0x7C, 0x57, 0x28, 0x80, + 0x28, 0xD3, 0x61, 0x70, 0x8D, 0x30, 0x2E, 0xEB, + 0xB8, 0x60, 0xBE, 0xE6, 0x91, 0xF6, 0x56, 0xA2, + 0x55, 0x0C, 0xB3, 0x21, 0xE9, 0x29, 0x3D, 0x75, + 0x16, 0xC5, 0x99, 0x81, 0x7B, 0x76, 0x6B, 0xA9, + 0x28, 0xB1, 0x08, 0x77, 0x9A, 0x1C, 0x87, 0x12, + 0xE7, 0x4C, 0x76, 0x84, 0x1A, 0xC5, 0x8B, 0x8C, + 0x51, 0x5B, 0xF4, 0x74, 0x9B, 0xF7, 0x15, 0x98, + 0x44, 0x45, 0xB2, 0xB5, 0x30, 0x63, 0x38, 0x40, + 0x01, 0xE5, 0x5F, 0x68, 0x86, 0x7B, 0x1A, 0xF4, + 0x6C, 0xA7, 0x0C, 0xA8, 0xEA, 0x74, 0x17, 0x2D, + 0xB8, 0x0B, 0x52, 0x18, 0xBD, 0xE4, 0xF0, 0x0A, + 0x0E, 0x65, 0x8D, 0xB5, 0xA1, 0x8D, 0x94, 0xE1, + 0x42, 0x7A, 0xF7, 0xAE, 0x35, 0x8C, 0xCE, 0xB2, + 0x38, 0x77, 0x2F, 0xCC, 0x83, 0xF1, 0x08, 0x28, + 0xA4, 0xA3, 0x67, 0xD4, 0x2C, 0x4C, 0xB6, 0x93, + 0x3F, 0xDD, 0x1C, 0x1C, 0x7B, 0x86, 0xAD, 0x8B, + 0x00, 0x96, 0x57, 0xA9, 0x62, 0x22, 0xD7, 0xBA, + 0x92, 0xF5, 0x27, 0xAF, 0x87, 0x79, 0x70, 0xA8, + 0x32, 0x47, 0xF4, 0x7A, 0x23, 0xFC, 0x22, 0x85, + 0x11, 0x8B, 0x57, 0x71, 0x77, 0x15, 0x20, 0x46, + 0x74, 0xDA, 0x9C, 0x94, 0xB6, 0x2B, 0xC7, 0x83, + 0x8C, 0xF8, 0x72, 0x00, 0x15, 0x6B, 0x26, 0xBA, + 0x46, 0x71, 0x15, 0x99, 0x31, 0xC4, 0x93, 0x22, + 0xD8, 0x06, 0x71, 0xA0, 0xF3, 0x32, 0xEA, 0xA2, + 0xBB, 0xF8, 0x93, 0xBE, 0x40, 0x8B, 0x9E, 0xAC, + 0x6A, 0x50, 0x54, 0x83, 0xAA, 0x90, 0x75, 0xBD, + 0x13, 0x68, 0xB5, 0x1F, 0x99, 0x21, 0x1F, 0x48, + 0x0A, 0x9C, 0x54, 0x2A, 0x75, 0xB5, 0xBE, 0x08, + 0xE4, 0x3A, 0xDA, 0xF3, 0x01, 0xDD, 0x72, 0x9A, + 0x85, 0x95, 0x40, 0x10, 0xE6, 0x48, 0x92, 0xA2, + 0xAA, 0x4F, 0x15, 0xC0, 0xBD, 0x70, 0xB3, 0xD8, + 0x56, 0x49, 0x4F, 0xF9, 0xBA, 0x0F, 0xE4, 0xCE, + 0x12, 0x99, 0x1C, 0xA0, 0x6B, 0x5E, 0x3D, 0x0B, + 0x2A, 0xF1, 0xF7, 0x97, 0xB7, 0xA2, 0xB7, 0x60, + 0x91, 0x0A, 0xE9, 0xF8, 0x33, 0xD0, 0xD4, 0x26, + 0x7A, 0x58, 0x05, 0x2C, 0x29, 0x90, 0xF1, 0x61, + 0xB8, 0x86, 0xE2, 0x51, 0x71, 0x1C, 0x09, 0xD0, + 0x85, 0xC3, 0xD9, 0x58, 0xB1, 0x44, 0x19, 0x2C, + 0x9C, 0xC3, 0x22, 0x4A, 0x46, 0x07, 0x15, 0xB6, + 0x78, 0x4E, 0xB0, 0xB2, 0x6F, 0x23, 0x71, 0x87, + 0x50, 0x7D, 0x85, 0xC5, 0x11, 0x0A, 0xCC, 0x71, + 0xCE, 0x47, 0x19, 0x8F, 0x25, 0x45, 0x53, 0x35, + 0x6D, 0xAB, 0x44, 0x8C, 0x38, 0xD2, 0x43, 0xA7, + 0xC0, 0x2B, 0xE4, 0x0C, 0x90, 0x8C, 0x82, 0x8D, + 0x05, 0xC0, 0x81, 0xDF, 0xAB, 0x8F, 0xC6, 0xB5, + 0xCF, 0xE7, 0xD5, 0x6E, 0x73, 0x17, 0x15, 0x7D, + 0xC0, 0x53, 0xB2, 0xB3, 0x48, 0x99, 0x86, 0xB0, + 0x81, 0x28, 0x88, 0x71, 0x81, 0x85, 0x85, 0xE0, + 0x99, 0x31, 0x09, 0x5E, 0x32, 0x74, 0xA0, 0x84, + 0x11, 0x5B, 0xE2, 0x76, 0x43, 0x82, 0x54, 0xA7, + 0x96, 0x27, 0x0A, 0x7B, 0x43, 0x06, 0xF0, 0x8B, + 0x98, 0xD9, 0xC2, 0xAA, 0xEC, 0xF7, 0x06, 0x5E, + 0x74, 0x44, 0x6B, 0x7C, 0x69, 0x6D, 0xBA, 0xAF, + 0x8B, 0x46, 0x25, 0xA1, 0x0B, 0x07, 0x82, 0x7B, + 0x4A, 0x8B, 0xAB, 0xAB, 0x09, 0xB6, 0x4A, 0xE1, + 0xC3, 0x75, 0xBB, 0x78, 0x54, 0x41, 0xF3, 0x19, + 0xFB, 0x9A, 0xC2, 0xF1, 0x4C, 0x95, 0xFF, 0xB2, + 0x52, 0xAB, 0xBB, 0x80, 0x9C, 0x69, 0x09, 0xCD, + 0x97, 0x70, 0x6E, 0x40, 0x69, 0x1C, 0xBA, 0x61, + 0xC9, 0x25, 0x2B, 0xD3, 0x8A, 0x04, 0x31, 0x1C, + 0xA5, 0xBB, 0x2C, 0xA7, 0x95, 0x78, 0x34, 0x75, + 0x05, 0xD0, 0x88, 0x88, 0x51, 0xE0, 0x82, 0x64, + 0x8B, 0xD0, 0x03, 0xBE, 0x97, 0xC0, 0xF8, 0xF6, + 0x67, 0x59, 0xEC, 0x96, 0xA9, 0x6A, 0x08, 0x1C, + 0x68, 0x22, 0xC4, 0x51, 0x05, 0x59, 0x53, 0x70, + 0x42, 0xFC, 0x15, 0xF0, 0x69, 0xA6, 0x49, 0xB7, + 0x4A, 0x10, 0x96, 0x1B, 0x35, 0x4A, 0x1F, 0x62, + 0x5B, 0x04, 0xE2, 0x5B, 0x29, 0x3C, 0xF6, 0x5F, + 0xB4, 0xF5, 0x3A, 0x80, 0xCC, 0x73, 0x3D, 0x7A, + 0x17, 0x57, 0x75, 0xBF, 0x8A, 0x9A, 0xBB, 0x92, + 0x01, 0x62, 0x0E, 0x83, 0xA7, 0xF3, 0xE7, 0x24, + 0xD1, 0x28, 0x7D, 0xBC, 0x44, 0xBD, 0xD5, 0xD8, + 0x5F, 0xC7, 0x15, 0x45, 0xA9, 0x27, 0xBE, 0xED, + 0xE5, 0x37, 0xA7, 0x76, 0x87, 0x35, 0xCC, 0x14, + 0x86, 0xC7, 0xC3, 0xF3, 0x11, 0x04, 0xDB, 0x67, + 0x34, 0x3F, 0x43, 0x5D, 0x2D, 0x45, 0x55, 0x4B, + 0xAA, 0xC9, 0xCD, 0xB5, 0x82, 0x2E, 0x84, 0x22, + 0xAE, 0x83, 0x21, 0xC7, 0x8A, 0xBE, 0x9F, 0x26, + 0x1F, 0xD4, 0x81, 0x0A, 0x79, 0xE3, 0x3E, 0x94, + 0xE6, 0x3B, 0x33, 0x41, 0x87, 0x2C, 0x92, 0x25, + 0x35, 0x21, 0x99, 0x7C, 0x08, 0x4F, 0xBC, 0x06, + 0x0B, 0x8B, 0x12, 0x5C, 0xCC, 0x88, 0xAC, 0x85, + 0xAC, 0x5F, 0xE3, 0x16, 0x8A, 0xCB, 0x05, 0x9B, + 0x3F, 0x11, 0x9C, 0x4E, 0x05, 0x0A, 0x20, 0x73, + 0x2F, 0x50, 0x1B, 0xB9, 0xB3, 0xE6, 0x87, 0xC8, + 0x46, 0xB5, 0xC2, 0x65, 0x3F, 0x88, 0x86, 0x37, + 0x3E, 0x10, 0x04, 0xA2, 0xAB, 0x8D, 0x1B, 0xB9, + 0x70, 0xA7, 0xE5, 0x71, 0xD8, 0xA4, 0x6E, 0xE8, + 0x1B, 0x78, 0x2F, 0x26, 0x94, 0x2D, 0xD3, 0x94, + 0xFD, 0xD9, 0xA5, 0xE4, 0xC5, 0x63, 0x1D, 0x98, + 0x55, 0x28, 0x60, 0x4B, 0x1C, 0xC9, 0x76, 0x27, + 0x5B, 0x6A, 0xC8, 0xA6, 0x7C, 0xEE, 0xC1, 0x0F, + 0xFA, 0xCB, 0xBA, 0x3D, 0x3B, 0xB1, 0x41, 0x32, + 0x1D, 0xFC, 0x3C, 0x92, 0x31, 0xFC, 0x96, 0xE4, + 0x48, 0xB9, 0xAB, 0x84, 0x70, 0x21, 0xE2, 0xC8, + 0xD9, 0x0C, 0x6B, 0xCA, 0xF2, 0xB1, 0x24, 0x07, + 0x83, 0xB6, 0x2C, 0x79, 0xDE, 0xDC, 0x07, 0x2A, + 0x57, 0x63, 0xE6, 0x60, 0xAF, 0x2C, 0x27, 0xC3, + 0xF0, 0xC3, 0xC0, 0x92, 0x07, 0xCA, 0xD9, 0x90, + 0xBB, 0x41, 0xA7, 0xBF, 0xCE, 0xC9, 0x9F, 0x51, + 0x59, 0x6A, 0x0E, 0x83, 0x77, 0x8F, 0x85, 0xC0, + 0x06, 0xAC, 0x6D, 0x1F, 0xE9, 0x81, 0xB4, 0xC4, + 0xBA, 0x1C, 0xB5, 0x75, 0xA7, 0xD0, 0x7A, 0xE2, + 0xD3, 0x1B, 0xA7, 0x60, 0x09, 0x5F, 0x74, 0xBC, + 0x16, 0x38, 0x41, 0xCF, 0x8F, 0xF7, 0x7F, 0x89, + 0x4A, 0xBC, 0x6D, 0x26, 0x1E, 0xD8, 0x7A, 0x45, + 0x30, 0x36, 0x3B, 0x94, 0x9C, 0x4A, 0xD2, 0x4E, + 0xFB, 0x3A, 0x56, 0x80, 0x94, 0x78, 0xDD, 0xA2 + }; + static const byte seed_768[KYBER_ENC_RAND_SZ] = { + 0x40, 0xBE, 0x9D, 0xCA, 0xC1, 0x6E, 0x9C, 0xA7, + 0x3D, 0x49, 0xD0, 0xC8, 0x3F, 0x9D, 0x3D, 0x89, + 0xBB, 0x71, 0x57, 0x4A, 0x42, 0x19, 0xA0, 0xF3, + 0x93, 0xDF, 0xEC, 0xE2, 0x98, 0x83, 0x94, 0xC4 + }; + static const byte c_768[KYBER768_CIPHER_TEXT_SIZE] = { + 0x77, 0x8D, 0x6B, 0x03, 0x79, 0x1A, 0xCA, 0xF5, + 0x6C, 0xAA, 0xFC, 0xC7, 0x8C, 0xEE, 0x5C, 0xBC, + 0xA1, 0xDE, 0x87, 0x37, 0xE9, 0xC7, 0xFF, 0x4A, + 0xE5, 0xF3, 0x84, 0xD3, 0x44, 0xE0, 0x82, 0x23, + 0xC7, 0x4C, 0x82, 0x4C, 0xB5, 0x84, 0x85, 0x20, + 0x51, 0x7C, 0x7F, 0x0E, 0xA0, 0x64, 0x5E, 0xB6, + 0xF8, 0x89, 0x51, 0x7A, 0xE5, 0x21, 0x6B, 0x0C, + 0xF4, 0x1D, 0xDC, 0x3F, 0x0D, 0x1D, 0xF9, 0xBC, + 0x6E, 0x4D, 0xEC, 0xB2, 0x36, 0xA5, 0xEA, 0x8B, + 0x21, 0x4F, 0x64, 0x26, 0x6D, 0x3C, 0xDE, 0x08, + 0xE0, 0xCB, 0x00, 0xE5, 0xD9, 0x1F, 0x58, 0x67, + 0x06, 0xB1, 0xEE, 0x53, 0x3D, 0x20, 0x47, 0x6F, + 0x44, 0x23, 0xB7, 0x8F, 0x91, 0x6B, 0x17, 0x26, + 0xEE, 0xEA, 0x95, 0x9F, 0xFB, 0x9A, 0xC6, 0x34, + 0xD0, 0x4A, 0x94, 0xD0, 0x99, 0x23, 0xCB, 0x0D, + 0x4E, 0x73, 0x0C, 0xCA, 0x41, 0x44, 0xE7, 0xC4, + 0x88, 0x49, 0x21, 0x65, 0x2D, 0xA4, 0x92, 0x8C, + 0x68, 0xE6, 0x44, 0xF6, 0x73, 0xCF, 0xC5, 0x7D, + 0x3E, 0x87, 0xCF, 0x5B, 0xE5, 0x81, 0xA8, 0x9F, + 0x9C, 0xB8, 0xF0, 0xFC, 0xE2, 0x78, 0x2D, 0x68, + 0x1E, 0x5C, 0xE8, 0x8A, 0xF5, 0x84, 0x58, 0xC3, + 0xD6, 0x3D, 0x80, 0x75, 0x72, 0xDE, 0x5A, 0xA8, + 0xE1, 0xFA, 0xF2, 0xDC, 0xD1, 0x4E, 0xDB, 0x73, + 0x49, 0x56, 0x5B, 0x7D, 0x32, 0x71, 0xDD, 0xBE, + 0xB0, 0xB6, 0xCC, 0x7A, 0xFE, 0x08, 0x63, 0x57, + 0x84, 0x31, 0x11, 0x59, 0x73, 0x3C, 0x46, 0xE5, + 0xFD, 0xC5, 0xE0, 0xCD, 0x36, 0xCE, 0x56, 0x85, + 0xAC, 0xFB, 0x1A, 0xFE, 0x50, 0xAB, 0xB4, 0x6F, + 0x44, 0x75, 0x21, 0xE6, 0x0D, 0x9C, 0x8F, 0x0E, + 0x4C, 0xA2, 0x8C, 0x19, 0x0A, 0xBB, 0x40, 0xC3, + 0x65, 0xF4, 0x12, 0x47, 0x1E, 0x95, 0xA8, 0xEA, + 0x39, 0x6D, 0x4B, 0xD8, 0x07, 0x0E, 0xEB, 0x1F, + 0x02, 0xB0, 0x7C, 0x82, 0x53, 0x67, 0xAA, 0x1E, + 0xC0, 0xF1, 0x0C, 0x38, 0x62, 0x41, 0x6B, 0xB2, + 0x1A, 0xD6, 0xCA, 0x74, 0x8A, 0x86, 0xE9, 0x82, + 0x9E, 0xFC, 0x1A, 0x04, 0x99, 0x09, 0x3C, 0x85, + 0x17, 0x6D, 0x37, 0xF5, 0x74, 0xC7, 0x5C, 0xF5, + 0xED, 0xFA, 0x8D, 0x92, 0x0D, 0x32, 0x68, 0xCB, + 0x34, 0xC6, 0xA4, 0xBB, 0x00, 0x02, 0x86, 0x9B, + 0xC0, 0x5D, 0x7C, 0x8F, 0xCC, 0x06, 0x58, 0xD4, + 0xA0, 0x1E, 0xAC, 0xD7, 0x45, 0x57, 0xA3, 0x7D, + 0x98, 0xA7, 0x63, 0x07, 0x47, 0x52, 0xDF, 0xDD, + 0x64, 0x29, 0x88, 0x1C, 0xAF, 0xF5, 0x77, 0xD3, + 0xA0, 0x48, 0x03, 0x1B, 0xD5, 0x2C, 0x4E, 0x97, + 0x26, 0x39, 0x85, 0x90, 0xF9, 0x51, 0x9F, 0xD5, + 0x94, 0x05, 0xD6, 0xB3, 0xC3, 0x07, 0xAF, 0xCB, + 0x16, 0x8A, 0x98, 0x57, 0x85, 0xD9, 0x54, 0xA6, + 0xD1, 0xDC, 0x1E, 0xA9, 0x2E, 0x1E, 0xB6, 0xF9, + 0x46, 0xA4, 0xD9, 0x9D, 0xD6, 0xCA, 0x30, 0x7A, + 0xBF, 0xD8, 0x36, 0x2F, 0xAB, 0xA9, 0x8B, 0xB2, + 0x64, 0xC6, 0x9C, 0x5F, 0x55, 0x5D, 0x60, 0x88, + 0x3C, 0xC5, 0x60, 0x19, 0xFE, 0xB4, 0xE8, 0x00, + 0x0C, 0x48, 0xB7, 0xE6, 0x8C, 0xD6, 0x67, 0xF0, + 0x0B, 0x52, 0x50, 0xCE, 0xF2, 0x93, 0xA4, 0xA9, + 0xE7, 0x78, 0x72, 0x6E, 0x62, 0xF1, 0x20, 0x36, + 0x1E, 0x21, 0xAB, 0x31, 0x40, 0x46, 0x4C, 0xDC, + 0x6A, 0xBD, 0xE9, 0xEA, 0x05, 0x19, 0x8D, 0x8B, + 0x3B, 0xB6, 0x71, 0xB9, 0x11, 0x1A, 0x2F, 0x31, + 0x75, 0x82, 0x84, 0x7C, 0xA5, 0x01, 0x56, 0x64, + 0xF2, 0x2C, 0xDB, 0x08, 0xC1, 0x43, 0x18, 0x7B, + 0xDE, 0x21, 0x29, 0xB5, 0x4F, 0x34, 0x16, 0x02, + 0x95, 0xD7, 0x5F, 0xE9, 0xA4, 0x94, 0xFD, 0x7E, + 0x67, 0xAA, 0xA7, 0x6B, 0x57, 0xAA, 0xFF, 0xD8, + 0x9D, 0x01, 0xA7, 0x1D, 0xF5, 0xC8, 0x15, 0x86, + 0x20, 0x29, 0x8D, 0x58, 0x2B, 0xBE, 0xFA, 0x6D, + 0x09, 0xAC, 0x41, 0x2A, 0x99, 0xAA, 0x3B, 0xE9, + 0xC3, 0x83, 0x50, 0x49, 0x48, 0xC4, 0x3D, 0xD5, + 0xAF, 0x41, 0x27, 0xB1, 0x43, 0x58, 0x04, 0xF4, + 0x4B, 0xAF, 0xA1, 0x42, 0xBF, 0xC2, 0xA9, 0x5D, + 0x95, 0xFB, 0x2E, 0xF0, 0x64, 0x1A, 0xBE, 0x71, + 0x06, 0x4D, 0xE5, 0x1D, 0x6B, 0x9E, 0xC5, 0x08, + 0x57, 0xB8, 0xEE, 0xF7, 0xF4, 0x80, 0x36, 0x31, + 0x3D, 0x0E, 0x93, 0x67, 0x63, 0xB8, 0xF7, 0xBD, + 0xE6, 0x9B, 0x06, 0x4D, 0xD5, 0x76, 0x1D, 0x80, + 0xEA, 0x6F, 0x1A, 0x8B, 0x37, 0x56, 0x57, 0x53, + 0xC5, 0x79, 0xBB, 0xB8, 0x95, 0xEF, 0xB9, 0xFC, + 0xB3, 0xFC, 0x5F, 0xA3, 0x36, 0x2E, 0x37, 0x74, + 0xF0, 0xF7, 0x71, 0x40, 0xB9, 0x73, 0xCA, 0xE5, + 0x87, 0xBA, 0xD2, 0xF3, 0xB5, 0x66, 0xA9, 0xC2, + 0x5A, 0x96, 0x93, 0x47, 0xE5, 0xC5, 0x4F, 0x87, + 0xF1, 0x10, 0x5E, 0x9C, 0x07, 0x48, 0x67, 0xD9, + 0x40, 0x77, 0xCC, 0xAE, 0x3A, 0xBE, 0xA5, 0x45, + 0x20, 0xED, 0xB5, 0x1D, 0x9D, 0xAA, 0xBE, 0x78, + 0x48, 0xE7, 0x8F, 0xDF, 0x66, 0xE0, 0x7E, 0x2E, + 0x22, 0xB3, 0x02, 0x51, 0x93, 0x1E, 0x89, 0x0B, + 0xAF, 0x1F, 0x5E, 0x17, 0x7D, 0x4D, 0x9C, 0xEC, + 0x9E, 0x49, 0x69, 0x48, 0x1F, 0xD7, 0xC1, 0x33, + 0x5A, 0x0E, 0xD5, 0x87, 0x9F, 0x34, 0xEF, 0x4B, + 0xB4, 0xF6, 0x6C, 0x28, 0x80, 0x3C, 0xEA, 0x16, + 0x2B, 0xA4, 0x61, 0x50, 0x6D, 0x52, 0xEB, 0x3A, + 0xE1, 0x69, 0x51, 0x92, 0x2B, 0x06, 0x82, 0x51, + 0x86, 0xC3, 0xD4, 0xCE, 0x1B, 0x51, 0xF3, 0xC9, + 0x2F, 0x3C, 0x52, 0xF2, 0xD0, 0x4D, 0x1F, 0x13, + 0xB2, 0xB1, 0x7C, 0x9E, 0xEB, 0x88, 0x2C, 0xCE, + 0x0E, 0xB8, 0x8B, 0x7E, 0xA9, 0xA1, 0xCE, 0x4E, + 0x37, 0x41, 0x5C, 0xC8, 0x4C, 0x7B, 0xC4, 0x36, + 0xA4, 0x62, 0x83, 0x86, 0xCC, 0x77, 0xD9, 0xAF, + 0xD2, 0x07, 0x91, 0x1B, 0xD9, 0xBF, 0xD8, 0xA7, + 0xFA, 0x05, 0xC2, 0x75, 0xBE, 0x0C, 0x4C, 0x6A, + 0x8F, 0xC0, 0xA6, 0x1B, 0xDA, 0x1D, 0x67, 0xAE, + 0x33, 0xB5, 0x31, 0x0B, 0xE1, 0x29, 0x0D, 0xC7, + 0x1C, 0x14, 0x18, 0xEB, 0x57, 0x44, 0xBF, 0x28, + 0x42, 0xC1, 0x65, 0x21, 0x73, 0xA4, 0x9A, 0x69, + 0x2E, 0x71, 0xFE, 0x43, 0x25, 0x8A, 0x20, 0x5B, + 0x3C, 0xAA, 0xB9, 0x0C, 0x03, 0x04, 0xA5, 0x1E, + 0x77, 0xD0, 0x1B, 0x40, 0x4A, 0x01, 0xFA, 0xE2, + 0xF8, 0x3A, 0xB8, 0x0C, 0x5D, 0xBF, 0x6C, 0xF5, + 0x18, 0xC0, 0x01, 0xF4, 0x6A, 0x63, 0x3F, 0xA1, + 0x69, 0xB1, 0xBD, 0xB7, 0x7A, 0x9D, 0x0B, 0x1E, + 0x0C, 0x00, 0x78, 0x35, 0xC0, 0x9F, 0x6A, 0xBB, + 0xA9, 0x6F, 0x3F, 0x53, 0x56, 0x4D, 0xA5, 0x08, + 0xEE, 0x88, 0x61, 0xA4, 0x83, 0xA8, 0x17, 0x49, + 0xD4, 0xA4, 0x46, 0x72, 0xB1, 0xEF, 0x16, 0x05, + 0xF2, 0x9D, 0x16, 0x8B, 0x74, 0xB7, 0x36, 0xB4, + 0xF1, 0x35, 0x01, 0xD7, 0xAD, 0x12, 0x13, 0x11, + 0x8A, 0x78, 0x32, 0xE6, 0x66, 0xA5, 0x0B, 0xE8, + 0x01, 0x0D, 0x54, 0x32, 0x2A, 0x52, 0x6C, 0xF7, + 0xA4, 0xE5, 0x43, 0xA7, 0x9D, 0x0D, 0x98, 0xE0, + 0x04, 0xFB, 0xEC, 0x76, 0xEA, 0x3F, 0x7E, 0x88, + 0x7B, 0xDB, 0xAF, 0x50, 0xDA, 0xDF, 0xDD, 0xDF, + 0x3F, 0xFE, 0xCF, 0x6D, 0x3F, 0x77, 0xEA, 0x4B, + 0x9B, 0x16, 0xDC, 0x75, 0x4F, 0x4A, 0x68, 0xE5, + 0xEF, 0x32, 0xF6, 0xA1, 0x37, 0xE7, 0xC9, 0xE3, + 0xC3, 0xE8, 0xC2, 0xE2, 0x36, 0xC7, 0xEB, 0xC4, + 0x5D, 0x46, 0xEC, 0x16, 0x77, 0xA5, 0xA8, 0xBB, + 0x26, 0x68, 0x44, 0x3B, 0x0B, 0xE8, 0x69, 0x3D, + 0xC2, 0x57, 0xF1, 0x3D, 0x8B, 0x9A, 0x90, 0x10, + 0x0B, 0x92, 0xB4, 0xD1, 0x76, 0x1B, 0x81, 0x96, + 0x73, 0x83, 0x2C, 0x32, 0x02, 0x06, 0x71, 0xBF, + 0xB3, 0xD0, 0x22, 0x0A, 0x36, 0x3E, 0x4B, 0xED, + 0x6D, 0x64, 0x9D, 0x3F, 0x73, 0x68, 0xCF, 0xE0, + 0x81, 0xE1, 0x96, 0xA4, 0x3D, 0x47, 0x08, 0x79, + 0x8E, 0x31, 0xBB, 0x2A, 0x2F, 0x61, 0x82, 0x46, + 0x74, 0xAB, 0xA2, 0xFC, 0x9D, 0xCD, 0x05, 0xDB, + 0x84, 0xB8, 0x62, 0x7A, 0xE1, 0x14, 0x88, 0x88, + 0x6F, 0x92, 0x1B, 0xC7, 0x9A, 0xE1, 0xFD, 0x03 + }; + static const byte k_768[KYBER_SS_SZ] = { + 0x61, 0x6E, 0x0B, 0x75, 0x3A, 0x3B, 0x7F, 0x40, + 0xFE, 0xF9, 0xA3, 0x89, 0xF5, 0x8F, 0x16, 0xBF, + 0xBB, 0x04, 0x62, 0x29, 0x41, 0xD2, 0x46, 0x4B, + 0xDA, 0xE7, 0x67, 0x82, 0x0D, 0xFA, 0xC3, 0x8E + }; +#endif +#ifndef WOLFSSL_NO_KYBER1024 + static const byte ek_1024[KYBER1024_PUBLIC_KEY_SIZE] = { + 0x27, 0x66, 0x9A, 0x66, 0x76, 0x67, 0xB8, 0xD5, + 0x46, 0x68, 0x58, 0x60, 0x22, 0x60, 0x11, 0x5B, + 0x62, 0x09, 0xBC, 0x2C, 0x45, 0xDF, 0x7A, 0x4E, + 0x64, 0x93, 0x2B, 0x75, 0xC7, 0x8B, 0x9F, 0x70, + 0x83, 0xF1, 0x31, 0xBC, 0xD4, 0xE2, 0x0E, 0xFF, + 0x8C, 0xCF, 0x69, 0x73, 0x6B, 0xDB, 0xC8, 0x84, + 0x06, 0xF9, 0xB6, 0x9A, 0xD3, 0xCE, 0x35, 0x6A, + 0x0F, 0x5E, 0x67, 0x6D, 0xD0, 0xA7, 0xC4, 0xAB, + 0xB1, 0xA1, 0xC9, 0xD6, 0x20, 0x21, 0xBB, 0x38, + 0x4A, 0x40, 0x14, 0xFB, 0x04, 0xCD, 0x2F, 0x82, + 0x18, 0x90, 0xD9, 0x04, 0x27, 0xC4, 0x9F, 0x4A, + 0x62, 0x8E, 0xCE, 0xC2, 0x73, 0x1F, 0xAC, 0x02, + 0x52, 0x37, 0x36, 0x0D, 0x58, 0x2C, 0xD0, 0x66, + 0x47, 0xB1, 0x10, 0x9A, 0xA6, 0xC2, 0xAC, 0x5D, + 0x43, 0x37, 0x58, 0xC1, 0xCA, 0xA5, 0x35, 0x55, + 0xFF, 0xF5, 0x77, 0xEB, 0xB5, 0x21, 0xFB, 0xE3, + 0x2D, 0x10, 0xF7, 0x90, 0x60, 0x4C, 0x53, 0xC2, + 0xF8, 0x2C, 0x17, 0xB0, 0x8E, 0xF3, 0x62, 0x56, + 0x74, 0x21, 0x48, 0x44, 0x90, 0x6D, 0xB3, 0xFB, + 0x95, 0x20, 0x03, 0x14, 0x22, 0xA1, 0x3B, 0xD7, + 0x61, 0x2D, 0x42, 0x01, 0xC2, 0x7D, 0x15, 0xB9, + 0xD1, 0x94, 0x83, 0x0C, 0xC3, 0x66, 0x9B, 0xB8, + 0xBA, 0x34, 0xC2, 0x52, 0x37, 0x64, 0x41, 0x39, + 0x71, 0xC4, 0x0D, 0x84, 0xAE, 0xE6, 0x56, 0x75, + 0xD5, 0x21, 0x53, 0x09, 0xDA, 0x83, 0x67, 0xF0, + 0x01, 0x49, 0x75, 0x46, 0xEC, 0xE0, 0x7C, 0xBF, + 0x00, 0x2D, 0x78, 0x1B, 0x83, 0x06, 0x82, 0x48, + 0x40, 0x80, 0xAD, 0x6F, 0x95, 0x58, 0xB3, 0x6B, + 0x6B, 0xF6, 0x10, 0x91, 0x71, 0x30, 0xB7, 0x41, + 0x9B, 0x39, 0xF8, 0x50, 0x29, 0x62, 0x12, 0x64, + 0xCF, 0x2C, 0x8A, 0xE4, 0xD8, 0x08, 0x38, 0x7B, + 0x20, 0xCC, 0x5A, 0xA0, 0xB9, 0x69, 0xC3, 0x9B, + 0xC8, 0x0E, 0x6C, 0xB9, 0xCA, 0x03, 0x51, 0xA3, + 0xF6, 0x0A, 0xCE, 0xAF, 0x12, 0xBD, 0x41, 0xFA, + 0x09, 0x96, 0xE3, 0x99, 0x06, 0xA9, 0xB6, 0x16, + 0x97, 0xB7, 0x47, 0xC2, 0x03, 0x1C, 0x76, 0x02, + 0x88, 0x36, 0x44, 0x57, 0x42, 0x5B, 0xBB, 0xB4, + 0x0F, 0x48, 0x98, 0xAD, 0x08, 0x58, 0x76, 0x60, + 0x8A, 0x77, 0xA5, 0xEB, 0x9D, 0x12, 0x4B, 0xC9, + 0x92, 0x26, 0x51, 0xB7, 0x63, 0x95, 0x88, 0x15, + 0x58, 0xCA, 0xD0, 0x6F, 0x3C, 0x4B, 0xCF, 0x08, + 0xE4, 0x5B, 0x67, 0xBA, 0x51, 0x60, 0x38, 0xA3, + 0x64, 0xB7, 0x74, 0x0E, 0x97, 0x40, 0xEE, 0x2B, + 0x93, 0xC5, 0xC6, 0x5F, 0x49, 0x02, 0x0A, 0xD4, + 0x2B, 0x3C, 0x0A, 0xEA, 0x5B, 0xF2, 0x42, 0xA4, + 0xF1, 0xB0, 0x89, 0xB5, 0xA3, 0x45, 0x8B, 0xE8, + 0xA3, 0x71, 0xCA, 0x1F, 0x29, 0x3C, 0x53, 0xF2, + 0x78, 0x0E, 0xCE, 0x28, 0x12, 0x93, 0xD9, 0x91, + 0xE6, 0xE5, 0x79, 0x04, 0x2B, 0xAB, 0xC1, 0x69, + 0x72, 0x4F, 0x10, 0x68, 0x1F, 0xD1, 0xC7, 0xD2, + 0xFB, 0x16, 0x48, 0xB0, 0xBF, 0x80, 0x81, 0x8A, + 0x7D, 0xD3, 0xB7, 0x09, 0x73, 0x4D, 0x38, 0x97, + 0x2E, 0x3E, 0x44, 0x87, 0x5A, 0xF0, 0x92, 0x7A, + 0x9A, 0xAD, 0xE8, 0x26, 0x13, 0xFC, 0xA0, 0x5E, + 0xE5, 0xB3, 0x21, 0x06, 0x47, 0xA5, 0x63, 0x2A, + 0xA1, 0x70, 0xD0, 0x9E, 0x70, 0xB5, 0x6A, 0x2F, + 0x04, 0x33, 0x7A, 0x33, 0x7E, 0xE9, 0x52, 0x38, + 0x3A, 0x1A, 0x8A, 0xEE, 0xA6, 0xCD, 0xB9, 0x0C, + 0xCD, 0x86, 0xA8, 0x18, 0xD1, 0xBB, 0x39, 0x46, + 0x5B, 0xA3, 0x13, 0xD2, 0x66, 0xBB, 0xB1, 0x05, + 0x81, 0xFA, 0x18, 0x7D, 0x92, 0x6A, 0xC3, 0xA8, + 0xB7, 0x49, 0xF6, 0x44, 0x45, 0xFA, 0xB5, 0x6C, + 0x99, 0x27, 0x55, 0x57, 0x93, 0xFB, 0x4A, 0xCF, + 0xB0, 0x39, 0xB1, 0xAA, 0x54, 0x3B, 0x1B, 0x87, + 0xAE, 0x6A, 0x49, 0xAB, 0x56, 0x29, 0x33, 0xC4, + 0xC9, 0x7B, 0xD7, 0x4C, 0x07, 0xBF, 0x29, 0x85, + 0x1A, 0x46, 0x98, 0x51, 0xA9, 0x82, 0x59, 0x55, + 0x96, 0xFE, 0x7A, 0xCA, 0xE0, 0xDB, 0x23, 0x53, + 0x30, 0x28, 0xAA, 0x34, 0x67, 0x6F, 0x7A, 0x9B, + 0x29, 0x26, 0x3E, 0x7A, 0xA2, 0x79, 0x00, 0x10, + 0x4B, 0x1B, 0xA1, 0xB5, 0x67, 0x47, 0x39, 0xB2, + 0xFC, 0x4E, 0xD8, 0xA3, 0x30, 0xBB, 0xA5, 0xA0, + 0xB6, 0x24, 0x7C, 0x63, 0xF1, 0x15, 0x3D, 0xA0, + 0x1D, 0xC8, 0xF6, 0x16, 0xF1, 0x04, 0x83, 0xA6, + 0x93, 0xA6, 0x34, 0xC1, 0xBA, 0x6A, 0xE1, 0xAB, + 0x2F, 0x16, 0x34, 0x00, 0xBB, 0x57, 0x71, 0xE7, + 0x01, 0x71, 0xFC, 0xB5, 0x41, 0x55, 0xAB, 0xFC, + 0xB2, 0x04, 0x4F, 0xCB, 0x30, 0xBA, 0xD6, 0x7F, + 0x74, 0x21, 0x83, 0x86, 0x18, 0x19, 0xED, 0xB1, + 0xAA, 0x6C, 0x77, 0x1F, 0xC8, 0xE1, 0x1A, 0x92, + 0xE0, 0x8B, 0x71, 0xF4, 0x0D, 0x03, 0x6C, 0x15, + 0xD2, 0x89, 0x6A, 0x20, 0x47, 0x25, 0xBA, 0x90, + 0xA0, 0x3B, 0x47, 0x8D, 0x98, 0xC4, 0x90, 0x84, + 0x38, 0x2F, 0x1D, 0x22, 0x3F, 0xE1, 0x29, 0x80, + 0xE9, 0x47, 0xA4, 0x15, 0xE5, 0x5F, 0xE6, 0x7B, + 0x85, 0xDA, 0x40, 0x44, 0x13, 0x42, 0x44, 0x5B, + 0x46, 0xC2, 0xFC, 0x42, 0x02, 0x0D, 0x04, 0x76, + 0x9A, 0x2A, 0x1C, 0x64, 0x64, 0x1F, 0x0C, 0x36, + 0x63, 0x6B, 0xA6, 0xC4, 0x65, 0x2B, 0x26, 0x7A, + 0x4B, 0x92, 0x19, 0xE3, 0x33, 0xA0, 0x68, 0x17, + 0xB5, 0x81, 0x7B, 0x6E, 0x6C, 0xC4, 0x85, 0xE3, + 0x52, 0x61, 0x41, 0x69, 0xAB, 0xC2, 0x0E, 0x18, + 0x91, 0xB7, 0xA0, 0x00, 0xC5, 0x2A, 0xF1, 0x5A, + 0x7B, 0x90, 0x4C, 0x97, 0x6C, 0x1B, 0xFD, 0x3A, + 0x23, 0x77, 0xEB, 0x76, 0xB5, 0x50, 0x33, 0xC7, + 0xC4, 0xC6, 0x9E, 0x71, 0x74, 0xAA, 0xF2, 0x77, + 0x15, 0x75, 0x63, 0x16, 0xCA, 0xCC, 0xCE, 0x63, + 0xA5, 0xA2, 0x24, 0x35, 0xC7, 0xD1, 0x02, 0x04, + 0x43, 0xAA, 0x71, 0x69, 0x3B, 0xF0, 0x62, 0x30, + 0x3D, 0x13, 0x33, 0x1F, 0x79, 0x54, 0x24, 0xC2, + 0x0D, 0x26, 0x6C, 0x1D, 0x90, 0x30, 0x5F, 0xC8, + 0xC2, 0x53, 0x66, 0x84, 0xA9, 0x3D, 0x50, 0x6D, + 0xE6, 0x32, 0x9B, 0x61, 0x62, 0x40, 0x59, 0x99, + 0xBD, 0x5C, 0xAA, 0x7D, 0xDB, 0x96, 0x13, 0xC8, + 0x23, 0x8C, 0xC6, 0xD3, 0x35, 0xA1, 0xEB, 0x40, + 0x82, 0xE7, 0x71, 0x0D, 0x07, 0x9F, 0x87, 0xA4, + 0xBF, 0xF6, 0x47, 0x8B, 0x5F, 0x0C, 0x58, 0x77, + 0x86, 0xAF, 0x42, 0x71, 0x92, 0xD9, 0xA3, 0x4A, + 0x4F, 0xA3, 0x3B, 0xF0, 0xD3, 0xCC, 0x58, 0xFB, + 0x46, 0x3B, 0x48, 0x38, 0xCA, 0x2C, 0x33, 0x7E, + 0x65, 0x39, 0x7D, 0xA1, 0x56, 0x90, 0xC5, 0x2A, + 0xC0, 0xE5, 0x46, 0x8B, 0xDC, 0x03, 0xDF, 0x5A, + 0x62, 0xF7, 0x02, 0x09, 0x34, 0xE2, 0x67, 0xE0, + 0xF7, 0xCF, 0x95, 0x59, 0x94, 0x35, 0xF9, 0x52, + 0xFA, 0xB7, 0x4C, 0xFE, 0xB4, 0x30, 0x8B, 0x17, + 0x3F, 0x12, 0xE0, 0x73, 0xF7, 0xF0, 0x40, 0xDB, + 0x4C, 0x63, 0xC1, 0xC4, 0x8A, 0x7B, 0x7A, 0x41, + 0xF4, 0x77, 0x9A, 0x6B, 0x57, 0xA9, 0x22, 0xC9, + 0x70, 0x77, 0x11, 0x80, 0x00, 0x84, 0x93, 0xD4, + 0xC7, 0x68, 0x05, 0x40, 0x0B, 0x7C, 0x66, 0x4D, + 0x0B, 0x92, 0xB2, 0x2C, 0x49, 0x55, 0x1B, 0x12, + 0x47, 0xE6, 0x2C, 0x85, 0xE1, 0xE5, 0x40, 0xC8, + 0x20, 0x93, 0x37, 0x10, 0x13, 0xC4, 0x67, 0x6C, + 0xEA, 0xD7, 0x7C, 0x5F, 0x30, 0x64, 0xA3, 0x73, + 0x49, 0xC7, 0x16, 0x5E, 0xB3, 0xAA, 0x7D, 0xEF, + 0x87, 0x31, 0xE9, 0xD6, 0x6A, 0x56, 0x36, 0x8F, + 0x19, 0x5C, 0x04, 0x5B, 0x2A, 0x50, 0xE5, 0x97, + 0x86, 0x16, 0x1A, 0x63, 0x0D, 0x28, 0x00, 0x89, + 0x80, 0x12, 0x98, 0xC1, 0x30, 0xE4, 0x48, 0x31, + 0x50, 0xCA, 0x91, 0x52, 0xC2, 0xA0, 0xF2, 0x47, + 0x75, 0x0C, 0x06, 0x22, 0x59, 0xB8, 0x4C, 0x28, + 0x23, 0x6C, 0x3F, 0xB5, 0x46, 0x25, 0xD5, 0xCD, + 0xBE, 0xCC, 0x68, 0xDB, 0xA2, 0x2F, 0xB1, 0x55, + 0x80, 0x55, 0xFB, 0x9B, 0x24, 0x35, 0x01, 0xC7, + 0x58, 0x51, 0xE7, 0x6A, 0xBE, 0x48, 0x47, 0xB9, + 0xB9, 0x72, 0xA7, 0x34, 0x11, 0xA6, 0xB4, 0x28, + 0x2B, 0xF5, 0x98, 0x3A, 0x82, 0xDA, 0x74, 0x13, + 0xE5, 0x4B, 0xA3, 0x5B, 0xAB, 0x37, 0xA9, 0xB3, + 0xC6, 0x28, 0x84, 0xB6, 0x43, 0xC1, 0x34, 0x16, + 0x5C, 0x98, 0x70, 0xC6, 0xBB, 0x39, 0x0F, 0x6B, + 0x7A, 0x1E, 0x57, 0x45, 0x15, 0x8F, 0xB2, 0x51, + 0xD6, 0x90, 0x94, 0x33, 0x55, 0x1F, 0xEB, 0xD3, + 0x0B, 0xA5, 0x75, 0xA1, 0xE2, 0xF1, 0x09, 0x58, + 0x49, 0x8D, 0x9F, 0x14, 0x7E, 0xD9, 0x53, 0x13, + 0x22, 0xA1, 0x60, 0x97, 0xF5, 0x5D, 0x81, 0x17, + 0x95, 0x45, 0x79, 0x12, 0x91, 0x2B, 0x1C, 0x65, + 0xF3, 0x80, 0x25, 0x42, 0x9B, 0x3E, 0x76, 0x4A, + 0x2E, 0x1A, 0xBC, 0x4E, 0x30, 0xC2, 0x88, 0x08, + 0x27, 0x42, 0x99, 0x55, 0x90, 0x98, 0x1C, 0x43, + 0xDB, 0xB3, 0x65, 0x96, 0x6B, 0xCB, 0x97, 0x20, + 0xB1, 0x78, 0xC5, 0xEB, 0x96, 0x3B, 0x82, 0x93, + 0x4C, 0x02, 0x81, 0x4B, 0x75, 0x25, 0x54, 0x6D, + 0xB7, 0xC9, 0x6D, 0x65, 0x82, 0x2E, 0x49, 0x42, + 0xE4, 0xA4, 0xAC, 0x13, 0xC9, 0x94, 0x90, 0xE7, + 0xAB, 0x4A, 0x70, 0x23, 0x71, 0xF2, 0x13, 0x16, + 0xA5, 0x79, 0x06, 0xB1, 0x92, 0x58, 0x42, 0x88, + 0x01, 0x19, 0x25, 0x67, 0xC2, 0x04, 0x5B, 0xF8, + 0x77, 0x5C, 0xF5, 0x8C, 0x5D, 0xB2, 0x8B, 0xA1, + 0xB0, 0x5E, 0x04, 0x2A, 0x18, 0x59, 0xE6, 0x42, + 0x86, 0xB5, 0xB1, 0x14, 0xF3, 0x9F, 0xCA, 0xCC, + 0x12, 0x7B, 0xE6, 0x3D, 0xFF, 0x59, 0x0B, 0xC1, + 0x84, 0xB8, 0x3B, 0x16, 0x8C, 0x30, 0x19, 0x98, + 0x90, 0x37, 0x41, 0x00, 0xE4, 0x0D, 0x2F, 0xC7, + 0x75, 0x2B, 0x14, 0x30, 0x35, 0x50, 0x22, 0xF3, + 0xD5, 0x89, 0x25, 0xD1, 0x99, 0x1B, 0xF3, 0xB9, + 0x8A, 0x90, 0x39, 0x5F, 0x85, 0x79, 0x64, 0x6C, + 0x84, 0x13, 0xBA, 0xB3, 0xC0, 0xC0, 0x70, 0x7A, + 0x23, 0x8A, 0x27, 0xD0, 0x9F, 0xA5, 0x7A, 0x32, + 0xFF, 0x85, 0x39, 0x2F, 0xD0, 0x8C, 0x2F, 0x22, + 0x86, 0xAB, 0xDB, 0x2B, 0x69, 0x36, 0xB9, 0xD3, + 0x50, 0x38, 0x02, 0xC6, 0xB5, 0x1E, 0x41, 0x5B, + 0x81, 0x67, 0x3C, 0xC7, 0x80, 0x54, 0xF1, 0xB2, + 0xC4, 0xBD, 0xFA, 0x73, 0x3E, 0x52, 0x64, 0xC5, + 0x5A, 0x7C, 0x4D, 0xA5, 0xB7, 0x39, 0x44, 0x40, + 0x24, 0x62, 0x03, 0x3D, 0x08, 0xAE, 0x62, 0x0B, + 0xD0, 0x56, 0x44, 0xB4, 0x77, 0xAB, 0x31, 0x5E, + 0x93, 0x6D, 0x3F, 0x25, 0xB5, 0xBA, 0x7A, 0xC1, + 0x9E, 0xB5, 0x59, 0xA5, 0xC1, 0x19, 0x5F, 0x56, + 0x8B, 0x31, 0x3C, 0x26, 0x75, 0x09, 0x2E, 0x6D, + 0xF5, 0x8F, 0xF3, 0x99, 0xC4, 0x2C, 0xAB, 0x63, + 0x63, 0xAA, 0x03, 0x36, 0x91, 0xCB, 0x8C, 0xE0, + 0x66, 0x99, 0xE7, 0x01, 0xF2, 0xB9, 0x25, 0x97, + 0xCB, 0x8F, 0xC2, 0x35, 0x16, 0xE9, 0xF4, 0x0C, + 0xE7, 0x5B, 0x7B, 0xC1, 0xE0, 0x52, 0x0A, 0x5A, + 0x38, 0x95, 0xEB, 0x7D, 0x8D, 0x47, 0x40, 0x09, + 0xA0, 0xCB, 0x0A, 0xDC, 0x2D, 0xF4, 0x76, 0xB5, + 0x16, 0x41, 0x12, 0xC3, 0xB6, 0x00, 0xB6, 0x77, + 0x6D, 0xAB, 0x49, 0xB2, 0x03, 0x81, 0xA4, 0x01, + 0x46, 0x91, 0x65, 0x2A, 0x3C, 0x31, 0x61, 0xAA, + 0xC6, 0x61, 0x6C, 0xFA, 0xA2, 0x65, 0x63, 0x8C, + 0x6C, 0x66, 0x5A, 0x84, 0x54, 0xF3, 0x67, 0x80, + 0xB7, 0x89, 0xCF, 0xA3, 0x5D, 0x2A, 0xF4, 0x9E, + 0x6D, 0x5F, 0x48, 0x2B, 0xFA, 0x3C, 0x86, 0x4B, + 0x0E, 0xF2, 0x9E, 0x18, 0xD2, 0xEF, 0xFF, 0x92, + 0xDB, 0x18, 0x76, 0xA2, 0x20, 0x76, 0xAB, 0x1A, + 0xAC, 0x0A, 0x73, 0x93, 0xED, 0x9E, 0x5A, 0x48 + }; + static const byte seed_1024[KYBER_ENC_RAND_SZ] = { + 0x03, 0x4F, 0xF1, 0x4A, 0x56, 0x24, 0x9C, 0x25, + 0x21, 0xD4, 0x27, 0x9E, 0xBA, 0x3D, 0x04, 0x93, + 0x1C, 0xC8, 0x92, 0xBB, 0xC4, 0x50, 0x02, 0xB5, + 0xB3, 0x3D, 0x9F, 0x01, 0x88, 0xAC, 0xBA, 0xF6 + }; + static const byte c_1024[KYBER1024_CIPHER_TEXT_SIZE] = { + 0x8D, 0x4E, 0x2C, 0xB3, 0x9F, 0xFD, 0xE4, 0x31, + 0x1A, 0xEE, 0xDB, 0x23, 0x38, 0xBF, 0x58, 0xCE, + 0x11, 0xFA, 0xDA, 0xBD, 0xC9, 0x81, 0x3A, 0x32, + 0x19, 0x30, 0xF4, 0x67, 0x56, 0xDD, 0x13, 0xA8, + 0xE7, 0x91, 0x9F, 0xAC, 0x4F, 0x59, 0xCC, 0x9F, + 0x8B, 0x91, 0xC8, 0x33, 0xB3, 0xB3, 0xF9, 0x1A, + 0xDC, 0x6F, 0x9F, 0xBD, 0xBD, 0xE2, 0xF7, 0xDA, + 0xE8, 0x84, 0x1B, 0xE5, 0x23, 0x8B, 0x98, 0x50, + 0xA5, 0xEE, 0xBE, 0x67, 0x5D, 0xDE, 0xF4, 0x2A, + 0x93, 0x14, 0xF6, 0x90, 0x59, 0x5D, 0x51, 0x52, + 0x3E, 0x81, 0x17, 0xF2, 0x22, 0x66, 0x03, 0x4F, + 0x09, 0xB7, 0x7D, 0x99, 0x1E, 0xE5, 0x75, 0x80, + 0x2A, 0xFE, 0x44, 0x63, 0x74, 0xEB, 0x3D, 0x9E, + 0x1B, 0xEB, 0x8F, 0x25, 0x04, 0x9C, 0x6E, 0xFA, + 0x96, 0x32, 0x73, 0x66, 0xC0, 0x24, 0xCD, 0xFB, + 0xE8, 0xDC, 0x27, 0xEF, 0x56, 0x49, 0x2C, 0x90, + 0x40, 0x9E, 0x87, 0x13, 0x9C, 0x60, 0x88, 0x48, + 0x8E, 0x17, 0xB8, 0x2D, 0x15, 0x56, 0xC2, 0x51, + 0x31, 0xAC, 0xEE, 0x7D, 0xAF, 0xFE, 0x2D, 0x43, + 0x7C, 0xEC, 0x34, 0x41, 0xBB, 0xBB, 0xAB, 0x80, + 0xC4, 0xBF, 0x17, 0x7E, 0x65, 0x3A, 0xE0, 0x83, + 0x1C, 0x9B, 0x4C, 0xEB, 0x70, 0x50, 0x57, 0x27, + 0xD6, 0x3C, 0x4D, 0x47, 0x4F, 0xED, 0xC5, 0x20, + 0x19, 0xBE, 0x41, 0x1C, 0x9A, 0x43, 0xB8, 0x71, + 0x70, 0xF5, 0x89, 0x3F, 0x06, 0xEC, 0xD8, 0xD7, + 0x82, 0x06, 0x3D, 0xF8, 0x93, 0xA1, 0xB6, 0x82, + 0x24, 0x6D, 0x1C, 0x64, 0xF8, 0xF5, 0xA8, 0xC6, + 0xFC, 0xDF, 0x07, 0x92, 0x7F, 0x4D, 0x5B, 0x7A, + 0x39, 0x7F, 0xBC, 0xBD, 0x07, 0x50, 0x45, 0xDF, + 0x2C, 0x4A, 0x36, 0xF5, 0x30, 0x4C, 0x95, 0xF4, + 0x4A, 0xF9, 0x27, 0xAE, 0x91, 0x66, 0x42, 0x0B, + 0x39, 0x44, 0x87, 0x94, 0xF5, 0xB3, 0xC3, 0x52, + 0x27, 0xC3, 0xC9, 0xDF, 0x92, 0x56, 0x02, 0xA1, + 0xAC, 0x98, 0xF8, 0x51, 0xAA, 0xDB, 0x65, 0xC9, + 0x3F, 0xDD, 0x63, 0x27, 0xAE, 0xD8, 0xAE, 0x41, + 0x29, 0x72, 0x44, 0x36, 0xA3, 0x3A, 0xA0, 0x8A, + 0xA5, 0x66, 0x08, 0x85, 0x5F, 0xF8, 0x0A, 0xAA, + 0x42, 0xAC, 0xA4, 0x56, 0x2B, 0x2D, 0x78, 0xDB, + 0xBD, 0x2F, 0x91, 0xAE, 0xF2, 0x51, 0x56, 0x6B, + 0x8C, 0x6F, 0x98, 0x21, 0x37, 0x84, 0xC9, 0x9D, + 0xD7, 0xD7, 0x1F, 0x49, 0x55, 0x64, 0xC9, 0x08, + 0x50, 0x1E, 0x35, 0xE3, 0xBF, 0xBB, 0x67, 0x5C, + 0xCB, 0x66, 0x63, 0x52, 0x87, 0xCB, 0x64, 0x66, + 0xE6, 0xE3, 0x8E, 0xA8, 0xAB, 0x11, 0xCE, 0x7E, + 0xC6, 0x0B, 0xED, 0x86, 0x20, 0xB3, 0xDC, 0xD6, + 0x94, 0x3D, 0x12, 0x79, 0xA4, 0x1F, 0x93, 0xA8, + 0x7F, 0xA3, 0x59, 0xE5, 0x13, 0xC8, 0x1D, 0xE9, + 0x18, 0xDA, 0x88, 0x32, 0x2B, 0x1B, 0x08, 0x81, + 0x40, 0xE0, 0x74, 0xBE, 0x39, 0xBC, 0x17, 0xE3, + 0xC5, 0x1A, 0xB7, 0x19, 0xDF, 0x6E, 0x42, 0x6D, + 0x64, 0xFF, 0x94, 0xB8, 0x66, 0x2B, 0x9D, 0xD2, + 0x6A, 0x32, 0xA3, 0xC3, 0x68, 0x7B, 0xF9, 0x29, + 0x4C, 0x53, 0x7A, 0x22, 0x68, 0xF9, 0xDE, 0xD3, + 0x80, 0xCC, 0x8A, 0x0F, 0x11, 0x27, 0xEE, 0x5A, + 0x32, 0x2B, 0x4D, 0xF2, 0x4D, 0x87, 0xFB, 0xCE, + 0x76, 0xF5, 0x60, 0xB0, 0x37, 0xC6, 0x59, 0xB6, + 0xFB, 0x15, 0xC1, 0x56, 0x07, 0x1A, 0xED, 0xC2, + 0x6E, 0xF1, 0x11, 0x40, 0xDE, 0x88, 0xD0, 0x8D, + 0x46, 0x3E, 0xA0, 0xEA, 0xF0, 0x80, 0xA0, 0xB2, + 0xE6, 0x27, 0xD9, 0xFF, 0x1D, 0x56, 0xC5, 0x02, + 0x33, 0x55, 0x24, 0x26, 0x97, 0x27, 0xA0, 0x32, + 0xDA, 0xCD, 0x16, 0x54, 0x3A, 0xDA, 0x83, 0x42, + 0xCD, 0x6C, 0xB4, 0x0E, 0x72, 0x28, 0x59, 0x2C, + 0x35, 0x74, 0xD9, 0x82, 0xE0, 0xB9, 0x14, 0x5E, + 0xB8, 0x65, 0xDB, 0x2E, 0xE7, 0x81, 0x07, 0x26, + 0xA9, 0x16, 0xB8, 0x37, 0xCA, 0x4F, 0x14, 0xC2, + 0xCB, 0x9E, 0x95, 0x1B, 0xDE, 0x76, 0xBE, 0x16, + 0xB8, 0xB1, 0xCD, 0xC2, 0xEE, 0xCD, 0xC0, 0x69, + 0x49, 0xB8, 0xBE, 0xB1, 0x17, 0x86, 0xB8, 0xF2, + 0x5F, 0x4C, 0x9A, 0xFA, 0x55, 0x97, 0xCE, 0xB1, + 0xD8, 0x5F, 0xC9, 0xB9, 0xC9, 0x1D, 0xC6, 0x19, + 0x66, 0xF3, 0x96, 0x09, 0x1E, 0x54, 0xC9, 0x6C, + 0x97, 0xA4, 0x30, 0x0E, 0x99, 0xFD, 0x9F, 0x75, + 0x2C, 0x0B, 0xEF, 0x5D, 0x88, 0xCA, 0xFB, 0xDC, + 0xB3, 0x99, 0x3F, 0xCF, 0x6C, 0x7A, 0x8C, 0x55, + 0x19, 0xFC, 0xEC, 0xB6, 0xA7, 0x91, 0x17, 0xE9, + 0xB5, 0x21, 0x68, 0x01, 0x97, 0xD8, 0xA9, 0x1A, + 0xB7, 0x5F, 0x18, 0x14, 0xDB, 0xC5, 0x80, 0x75, + 0xEF, 0x4F, 0x07, 0x98, 0x7A, 0xBC, 0x56, 0xA7, + 0x5D, 0xA4, 0x41, 0x6E, 0xDB, 0x9D, 0x6F, 0x3D, + 0x77, 0x1A, 0xD3, 0x40, 0xD5, 0xCB, 0xCF, 0xC0, + 0xE5, 0x71, 0xFA, 0x70, 0xAA, 0xC1, 0xC7, 0xDB, + 0xBB, 0x5F, 0x5C, 0x5E, 0x1D, 0x8B, 0x10, 0x36, + 0xF5, 0xA6, 0xFC, 0xFD, 0x06, 0x25, 0xAB, 0x5B, + 0xBD, 0xA5, 0x71, 0x83, 0x9C, 0x58, 0x35, 0xDD, + 0x69, 0x79, 0x77, 0x8F, 0x59, 0xD3, 0x48, 0x68, + 0x4F, 0xA6, 0xCF, 0xC2, 0xA6, 0x25, 0x35, 0xB4, + 0x7F, 0xAD, 0x7F, 0x97, 0xB5, 0x21, 0x88, 0x72, + 0xD5, 0x2D, 0xCA, 0xCE, 0x9D, 0x3C, 0x1B, 0x11, + 0x62, 0x8D, 0x35, 0x2A, 0xD8, 0x21, 0x90, 0x0F, + 0x44, 0xE1, 0x4B, 0x64, 0x7F, 0x6B, 0xFA, 0x70, + 0xF6, 0x46, 0xB5, 0xC7, 0xAF, 0x53, 0x13, 0x17, + 0x7A, 0x10, 0x95, 0x49, 0x44, 0x22, 0x91, 0x53, + 0xA4, 0x49, 0xFC, 0xF8, 0x9A, 0x62, 0x63, 0xBD, + 0xBF, 0x85, 0x56, 0xE9, 0x81, 0xE5, 0xD6, 0x25, + 0x13, 0x40, 0xF9, 0xF4, 0x3C, 0x66, 0x92, 0x03, + 0x0F, 0xB9, 0x60, 0x5B, 0xB9, 0x9F, 0x33, 0xE9, + 0x6F, 0x06, 0xD1, 0xE4, 0xE6, 0xAB, 0xBE, 0x65, + 0xE1, 0x46, 0x96, 0xD5, 0x30, 0xF1, 0xB5, 0x25, + 0xFF, 0xF8, 0x7D, 0x54, 0xC1, 0xAC, 0x2F, 0x5E, + 0x96, 0x4D, 0x46, 0xEE, 0x37, 0xF4, 0x04, 0x5B, + 0x54, 0xE6, 0x09, 0x8F, 0x76, 0xB2, 0x8E, 0xAF, + 0x69, 0xE9, 0x98, 0x88, 0x8D, 0x25, 0xE0, 0x21, + 0xA5, 0x38, 0xFD, 0x19, 0x56, 0xA7, 0xFC, 0x30, + 0xAE, 0x83, 0xF8, 0xBA, 0x99, 0x47, 0xF8, 0x64, + 0xFD, 0x59, 0x73, 0x1A, 0x6F, 0xBB, 0x40, 0x2A, + 0xF2, 0x99, 0x0E, 0x1E, 0xD2, 0xD5, 0x6B, 0xF6, + 0x2A, 0xA6, 0xCE, 0xAE, 0x6F, 0x76, 0x9D, 0x2D, + 0x0C, 0x6C, 0x31, 0x3D, 0x7A, 0xAF, 0x97, 0x4E, + 0x69, 0xDC, 0x02, 0xCC, 0x43, 0x18, 0xB9, 0x45, + 0x7B, 0x8C, 0xC4, 0x06, 0x56, 0xAB, 0x7B, 0x61, + 0x34, 0xDE, 0x3F, 0x98, 0x01, 0xCE, 0x01, 0x96, + 0x99, 0xCE, 0x85, 0x5E, 0xBE, 0x9C, 0x6C, 0x02, + 0xFD, 0x08, 0x50, 0x6F, 0x00, 0x4A, 0x4E, 0xED, + 0x2C, 0xA1, 0x66, 0xC9, 0x54, 0xC7, 0xDB, 0x88, + 0x10, 0x70, 0x0C, 0xA6, 0x71, 0xEF, 0x37, 0x2A, + 0x29, 0x0B, 0x00, 0xE1, 0xBF, 0xBB, 0x97, 0xE3, + 0xE6, 0x74, 0xD3, 0xDC, 0xCC, 0x57, 0xCE, 0x59, + 0xF4, 0x65, 0xB1, 0x48, 0x8F, 0xF7, 0x6F, 0x62, + 0x39, 0x00, 0x8B, 0xE3, 0xE7, 0x61, 0xEF, 0x9C, + 0x11, 0x3D, 0xF0, 0x10, 0x7B, 0x8E, 0xEA, 0xE3, + 0xFE, 0xBA, 0x55, 0xB3, 0x5E, 0x4C, 0x1D, 0xA3, + 0xB6, 0xC8, 0x7A, 0x8D, 0x20, 0x11, 0x0E, 0x1C, + 0xD7, 0x71, 0xCC, 0xBC, 0x30, 0xDF, 0xF7, 0x61, + 0xE6, 0x03, 0xD4, 0x88, 0xE5, 0x5B, 0x85, 0x3A, + 0xAE, 0x7D, 0xAA, 0xDF, 0x2A, 0x00, 0x7B, 0x83, + 0x93, 0xDF, 0x08, 0xAF, 0x53, 0x4F, 0x9F, 0x53, + 0xA7, 0x37, 0x57, 0xBA, 0xBE, 0x21, 0xC8, 0x64, + 0x26, 0xCF, 0x05, 0x8E, 0xCA, 0x81, 0x7E, 0xF2, + 0x37, 0xBF, 0xC5, 0x8A, 0xC2, 0x98, 0xFB, 0xF2, + 0xA1, 0x48, 0x1C, 0x4D, 0x12, 0xDC, 0xF1, 0xB7, + 0x37, 0xFD, 0x63, 0x97, 0x69, 0xA2, 0x53, 0x1E, + 0xF9, 0x31, 0xA3, 0x62, 0xA4, 0x44, 0x56, 0xEE, + 0x2C, 0xA4, 0x85, 0x98, 0xB4, 0x62, 0x59, 0xFC, + 0xC9, 0x77, 0x07, 0x6C, 0x59, 0xFA, 0x4E, 0x29, + 0x54, 0xE9, 0x96, 0x7D, 0xA4, 0x5D, 0xA7, 0xCB, + 0xF7, 0x86, 0x33, 0xEC, 0x59, 0xC4, 0x63, 0xFE, + 0x48, 0xA8, 0x3B, 0x80, 0x1A, 0x54, 0xDB, 0x3F, + 0xEA, 0xB4, 0x45, 0xA3, 0x57, 0xE4, 0x18, 0xB0, + 0x65, 0x3F, 0x29, 0x40, 0xB2, 0xB7, 0x13, 0x81, + 0xB2, 0xDF, 0x9E, 0xCF, 0x81, 0x00, 0x84, 0x8E, + 0x29, 0x12, 0xF4, 0xBD, 0x50, 0x3A, 0xF0, 0x75, + 0xAA, 0xAF, 0x36, 0xC1, 0x36, 0xA4, 0x13, 0xC9, + 0x5B, 0xE2, 0xF2, 0x5A, 0x6D, 0x29, 0x19, 0x76, + 0xCD, 0x66, 0xA2, 0x76, 0x43, 0x53, 0x7E, 0x35, + 0xE1, 0xDF, 0x89, 0xB1, 0xE4, 0x94, 0xB3, 0x6B, + 0x08, 0xF3, 0xD0, 0x19, 0x6C, 0xD7, 0xE9, 0x0B, + 0xA5, 0xBB, 0x21, 0x00, 0x9F, 0x37, 0xA8, 0x43, + 0x19, 0x9E, 0x08, 0xDD, 0x95, 0xCA, 0x49, 0x48, + 0xC5, 0x33, 0xCB, 0x26, 0x3B, 0x5D, 0x40, 0x5A, + 0xF2, 0xFA, 0x11, 0x99, 0x81, 0xA8, 0x53, 0x6E, + 0xB7, 0x1C, 0x88, 0x22, 0x6C, 0x41, 0x53, 0x4C, + 0x26, 0x87, 0xBF, 0x1E, 0xED, 0x34, 0x75, 0xE8, + 0x48, 0x8B, 0xDE, 0x90, 0x9A, 0x93, 0xD4, 0xDB, + 0x55, 0xB6, 0xE8, 0x34, 0xB5, 0xE7, 0x86, 0x0A, + 0xA9, 0x8F, 0xD8, 0xBC, 0xB1, 0x3A, 0xB0, 0x77, + 0xB7, 0xBF, 0xD7, 0x5B, 0x35, 0xFA, 0x39, 0x3E, + 0x93, 0xE3, 0xBF, 0xB4, 0xB9, 0xBA, 0x1D, 0xAA, + 0x74, 0x65, 0xFD, 0x5B, 0x23, 0xA5, 0xB4, 0xCD, + 0x17, 0x16, 0xD4, 0xBD, 0xF7, 0xB8, 0xD5, 0x57, + 0x4B, 0x15, 0x6D, 0xB8, 0x7D, 0x8D, 0xE1, 0xE5, + 0x26, 0xC9, 0x7F, 0x8E, 0xB2, 0x87, 0xBD, 0x97, + 0xEE, 0xEE, 0xEF, 0x07, 0x4D, 0xBC, 0xB2, 0xC4, + 0xDB, 0x51, 0xA4, 0xEF, 0xF1, 0xFA, 0x7F, 0xFF, + 0x32, 0x8A, 0x57, 0x2D, 0x72, 0x70, 0x01, 0x71, + 0x08, 0xAC, 0xE2, 0xED, 0x25, 0x09, 0x3D, 0xA5, + 0x35, 0xC7, 0xA2, 0x6D, 0x3B, 0x91, 0x2A, 0xA5, + 0x7F, 0xB3, 0x22, 0xE5, 0x3B, 0xB2, 0x22, 0xE9, + 0x4E, 0x7C, 0xF6, 0x8C, 0xD8, 0xA2, 0x1A, 0xD7, + 0xC0, 0x6A, 0x4A, 0xF9, 0x78, 0xED, 0x1D, 0xEB, + 0x10, 0xE3, 0xF2, 0x41, 0x2A, 0xC6, 0x54, 0x3C, + 0x18, 0x20, 0x68, 0xEF, 0xFB, 0xD8, 0x7F, 0x31, + 0x76, 0x5F, 0x5A, 0xE6, 0x81, 0xEE, 0x8B, 0x2E, + 0x9A, 0xEB, 0x5B, 0xC9, 0x40, 0xA9, 0x4E, 0xC0, + 0xEE, 0xF5, 0xBE, 0xF7, 0x48, 0x74, 0x16, 0x9E, + 0xAB, 0xEC, 0xF1, 0x51, 0x25, 0x65, 0xC5, 0x1E, + 0xA5, 0x87, 0x21, 0xDD, 0x3A, 0xF1, 0x69, 0x03, + 0x65, 0xDB, 0x22, 0xE1, 0x87, 0x7F, 0x2A, 0x5C, + 0x01, 0x72, 0x3F, 0x69, 0xB7, 0x72, 0x52, 0x77, + 0xAE, 0x4E, 0x9E, 0xFA, 0xCD, 0x3A, 0xFA, 0x5A, + 0xDC, 0xAF, 0x38, 0x57, 0x77, 0xE7, 0xCE, 0x10, + 0xF9, 0x56, 0xB4, 0x64, 0x2C, 0x6F, 0xC1, 0xC9, + 0x78, 0x08, 0x99, 0x3E, 0xFD, 0x99, 0x4C, 0xA6, + 0x5C, 0x75, 0xF4, 0x59, 0xAC, 0x58, 0x72, 0xF8, + 0x24, 0x88, 0xC5, 0x7F, 0xB7, 0xAF, 0x9A, 0xB9, + 0x69, 0xD5, 0xE3, 0x69, 0xC1, 0x6D, 0x0B, 0x2B, + 0xF7, 0x80, 0x0B, 0x93, 0x8D, 0x67, 0x84, 0xC7, + 0xF6, 0x4D, 0x0C, 0x55, 0xCA, 0x77, 0x94, 0x65, + 0x49, 0x38, 0x94, 0x9E, 0x14, 0x21, 0x70, 0x55, + 0xD3, 0x41, 0x01, 0xF9, 0x41, 0x7D, 0x37, 0x0A, + 0x8A, 0xDD, 0x72, 0xFC, 0x0B, 0x57, 0x66, 0xEC, + 0x1D, 0x8A, 0xDD, 0xD7, 0x02, 0x33, 0x4A, 0x2A, + 0xC2, 0x77, 0x09, 0xC5, 0xAC, 0x5A, 0xE5, 0x60, + 0x1D, 0xBA, 0x95, 0x2B, 0xE2, 0x58, 0xD9, 0x33, + 0x6D, 0xF3, 0xE0, 0xF6, 0x58, 0x78, 0xA8, 0x58, + 0x61, 0x32, 0x58, 0xFB, 0x5E, 0x47, 0x94, 0x1B + }; + static const byte k_1024[KYBER_SS_SZ] = { + 0x46, 0xC2, 0x00, 0xF3, 0xF6, 0xEE, 0x8E, 0x11, + 0xD4, 0x76, 0x53, 0x80, 0x1E, 0x34, 0x82, 0x24, + 0x1C, 0xB7, 0x83, 0xB9, 0xD7, 0x94, 0xEB, 0x11, + 0x6A, 0x4B, 0xDA, 0x08, 0x5A, 0xEB, 0x6B, 0xB7 + }; +#endif + static byte ct[KYBER_MAX_CIPHER_TEXT_SIZE]; + static byte ss[KYBER_SS_SZ]; + + key = (KyberKey*)XMALLOC(sizeof(KyberKey), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + if (key != NULL) { + XMEMSET(key, 0, sizeof(KyberKey)); + } + +#ifndef WOLFSSL_NO_KYBER512 + ExpectIntEQ(wc_KyberKey_Init(KYBER512, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_DecodePublicKey(key, ek_512, sizeof(ek_512)), 0); + ExpectIntEQ(wc_KyberKey_EncapsulateWithRandom(key, ct, ss, seed_512, + sizeof(seed_512)), 0); + ExpectIntEQ(XMEMCMP(ct, c_512, KYBER512_CIPHER_TEXT_SIZE), 0); + ExpectIntEQ(XMEMCMP(ss, k_512, KYBER_SS_SZ), 0); + wc_KyberKey_Free(key); +#endif +#ifndef WOLFSSL_NO_KYBER768 + ExpectIntEQ(wc_KyberKey_Init(KYBER768, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_DecodePublicKey(key, ek_768, sizeof(ek_768)), 0); + ExpectIntEQ(wc_KyberKey_EncapsulateWithRandom(key, ct, ss, seed_768, + sizeof(seed_768)), 0); + ExpectIntEQ(XMEMCMP(ct, c_768, KYBER768_CIPHER_TEXT_SIZE), 0); + ExpectIntEQ(XMEMCMP(ss, k_768, KYBER_SS_SZ), 0); + wc_KyberKey_Free(key); +#endif +#ifndef WOLFSSL_NO_KYBER1024 + ExpectIntEQ(wc_KyberKey_Init(KYBER1024, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_DecodePublicKey(key, ek_1024, sizeof(ek_1024)), 0); + ExpectIntEQ(wc_KyberKey_EncapsulateWithRandom(key, ct, ss, seed_1024, + sizeof(seed_1024)), 0); + ExpectIntEQ(XMEMCMP(ct, c_1024, KYBER1024_CIPHER_TEXT_SIZE), 0); + ExpectIntEQ(XMEMCMP(ss, k_1024, KYBER_SS_SZ), 0); + wc_KyberKey_Free(key); +#endif + + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_kyber_decapsulate_kats(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_KYBER) && defined(WOLFSSL_WC_KYBER) && \ + defined(WOLFSSL_ML_KEM) + KyberKey* key; +#ifndef WOLFSSL_NO_KYBER512 + static const byte dk_512[KYBER512_PRIVATE_KEY_SIZE] = { + 0x17, 0x43, 0x13, 0xEF, 0xA9, 0x35, 0x20, 0xE2, + 0x8A, 0x70, 0x76, 0xC8, 0x88, 0x09, 0x6E, 0x02, + 0xB0, 0xBD, 0xD8, 0x68, 0x30, 0x49, 0x7B, 0x61, + 0xFD, 0xEA, 0xB6, 0x20, 0x9C, 0x6C, 0xF7, 0x1C, + 0x62, 0x5C, 0x46, 0x80, 0x77, 0x5C, 0x34, 0x77, + 0x58, 0x1C, 0x42, 0x7A, 0x6F, 0xE1, 0xB0, 0x35, + 0x6E, 0xAB, 0x04, 0x8B, 0xCA, 0x43, 0x4F, 0x83, + 0xB5, 0x42, 0xC8, 0xB8, 0x60, 0x01, 0x06, 0x96, + 0xA5, 0x72, 0x99, 0xBB, 0x26, 0x22, 0x68, 0x89, + 0x1F, 0xFC, 0x72, 0x14, 0x2C, 0xA1, 0xA8, 0x66, + 0x18, 0x5C, 0xA8, 0x2D, 0x05, 0x40, 0x66, 0x95, + 0xBA, 0x57, 0xD4, 0xC9, 0x30, 0xF9, 0xC1, 0x7D, + 0x62, 0x23, 0x52, 0x3C, 0xF5, 0xA4, 0xF2, 0xA4, + 0x33, 0xA3, 0x64, 0x45, 0x9A, 0xC0, 0xAC, 0xDE, + 0x72, 0x54, 0x48, 0x13, 0x29, 0x28, 0x8B, 0x1B, + 0xE1, 0x87, 0xCC, 0x25, 0x21, 0x9F, 0x48, 0xC2, + 0x44, 0x3C, 0x53, 0x21, 0x99, 0x85, 0x93, 0x55, + 0x32, 0x0D, 0x04, 0xF0, 0xB8, 0x0D, 0xE9, 0x69, + 0xF1, 0x69, 0xA3, 0xD2, 0xBA, 0x34, 0x11, 0xB4, + 0xAD, 0xBC, 0x01, 0xB6, 0x62, 0x71, 0x82, 0x4C, + 0xD9, 0x54, 0x3C, 0x78, 0xBA, 0x48, 0x04, 0xAE, + 0x81, 0xF3, 0xAF, 0x00, 0x33, 0x6C, 0x5C, 0xC3, + 0x69, 0x83, 0x54, 0xC0, 0xE0, 0x18, 0x73, 0xA2, + 0xA1, 0x7D, 0x6A, 0x95, 0xA3, 0x12, 0x68, 0x9A, + 0x99, 0xDC, 0x89, 0x08, 0x41, 0x50, 0xA8, 0xD5, + 0x2B, 0xB3, 0x1C, 0x3F, 0xF3, 0xD4, 0x21, 0x5F, + 0xA3, 0xC4, 0x11, 0x1B, 0x40, 0x19, 0x92, 0x86, + 0x6E, 0x51, 0x3E, 0x51, 0x28, 0xA2, 0x0E, 0xD9, + 0x5F, 0xDE, 0xE6, 0x14, 0x85, 0xDC, 0x93, 0x7E, + 0x09, 0x9D, 0x76, 0xF7, 0x9B, 0x92, 0x73, 0x4D, + 0xC4, 0xCB, 0xB9, 0xA7, 0xA4, 0x13, 0xFE, 0xA6, + 0x28, 0x5B, 0xC0, 0xC2, 0x7C, 0x96, 0x1E, 0x47, + 0xD1, 0x98, 0x36, 0x44, 0xC4, 0xBF, 0x91, 0x3D, + 0x72, 0xF4, 0xB0, 0x30, 0xD3, 0x47, 0x38, 0x42, + 0x72, 0x63, 0xE8, 0x7A, 0xB4, 0xC0, 0xB7, 0xDF, + 0x0B, 0x72, 0xCA, 0x8A, 0xA0, 0xBA, 0xA6, 0x7B, + 0x07, 0x99, 0x39, 0xD5, 0x87, 0x80, 0x1D, 0x60, + 0xC8, 0x7A, 0x20, 0x40, 0x5E, 0x5C, 0x52, 0x60, + 0x3C, 0x07, 0x2F, 0xDB, 0x63, 0xE2, 0xE1, 0xC2, + 0xA9, 0x5C, 0xC2, 0x6F, 0x5A, 0xBE, 0xF6, 0x08, + 0x83, 0x33, 0x80, 0x08, 0x86, 0xD0, 0x93, 0xCA, + 0x01, 0xA7, 0x6F, 0x57, 0x00, 0x5E, 0x05, 0x35, + 0x69, 0x54, 0x2E, 0x0A, 0x07, 0x6B, 0x98, 0x73, + 0x6D, 0x4D, 0x39, 0xB0, 0x0F, 0xC1, 0x65, 0x3F, + 0xBC, 0x2D, 0x12, 0xEA, 0x32, 0xA9, 0x4B, 0x9B, + 0x92, 0xC6, 0x8B, 0xA4, 0xB6, 0x8A, 0x4E, 0x7B, + 0x37, 0x0A, 0x23, 0xB0, 0x3F, 0xE8, 0x22, 0x16, + 0x39, 0xB0, 0x12, 0x44, 0x80, 0x6C, 0x27, 0x06, + 0x7A, 0x58, 0x03, 0x1D, 0xB8, 0x0D, 0x2D, 0x03, + 0x66, 0x1A, 0x01, 0x7B, 0xB4, 0x6B, 0xB3, 0x71, + 0x1A, 0xCB, 0x56, 0x8A, 0x4F, 0xAB, 0xEB, 0xAF, + 0xC5, 0xFA, 0x06, 0xF7, 0xCA, 0x0E, 0x4D, 0x96, + 0x2E, 0x31, 0x70, 0xCB, 0x11, 0xC0, 0xA8, 0xD1, + 0x8A, 0x09, 0xCE, 0x27, 0xA6, 0xA9, 0x76, 0x3E, + 0x12, 0x38, 0x85, 0x45, 0x02, 0x24, 0xDE, 0x07, + 0xCC, 0x17, 0x54, 0x6C, 0x17, 0x95, 0x1F, 0xDE, + 0x47, 0x6E, 0x08, 0x35, 0x83, 0xEF, 0x10, 0xBF, + 0x76, 0xA9, 0x8A, 0xFF, 0xF9, 0xB1, 0x2D, 0xB5, + 0x40, 0x1C, 0xD3, 0x67, 0x34, 0x95, 0x39, 0x2D, + 0x74, 0x12, 0x91, 0xC3, 0xAA, 0x78, 0x42, 0x0C, + 0x8A, 0x7C, 0xB5, 0xFF, 0xE6, 0x50, 0x12, 0x99, + 0x7C, 0x4D, 0xA4, 0x32, 0x2E, 0xA9, 0x0B, 0x50, + 0x14, 0xB5, 0xB4, 0xD0, 0x18, 0x01, 0x00, 0x24, + 0x70, 0x47, 0x34, 0x1E, 0x4C, 0x24, 0xB9, 0x6B, + 0x8D, 0x7C, 0x00, 0x20, 0x52, 0x4B, 0x7C, 0x1D, + 0x66, 0xC3, 0xE0, 0x8C, 0xB2, 0x99, 0xEB, 0x4E, + 0xC6, 0xFA, 0x0E, 0xE8, 0xEA, 0x05, 0xFD, 0x43, + 0x0F, 0x57, 0x60, 0x5E, 0x89, 0x2B, 0x23, 0x2D, + 0x20, 0x47, 0xCA, 0x9B, 0x4E, 0xCA, 0xD9, 0xBD, + 0xD0, 0x9C, 0x99, 0x51, 0x19, 0x69, 0x16, 0x52, + 0x5D, 0x1E, 0xC9, 0x21, 0xB6, 0xE3, 0xCE, 0x0E, + 0xE6, 0x92, 0xEB, 0xA7, 0x28, 0xB4, 0xDB, 0x10, + 0xF3, 0x38, 0x1F, 0xBF, 0x58, 0x4A, 0xBB, 0x7B, + 0x6A, 0x92, 0x10, 0xC7, 0xC4, 0x24, 0xCE, 0x4A, + 0x36, 0x93, 0x70, 0xCB, 0x48, 0xD6, 0x08, 0x63, + 0x4A, 0xBA, 0x0B, 0xFF, 0x91, 0xC5, 0x62, 0x0A, + 0x11, 0x89, 0xD0, 0xCA, 0x97, 0x42, 0x1D, 0x42, + 0x34, 0x29, 0xFB, 0x66, 0x39, 0x52, 0xDC, 0x12, + 0x31, 0xB4, 0x36, 0x2B, 0x71, 0x62, 0xFE, 0x3A, + 0x42, 0x11, 0x1C, 0x91, 0xD7, 0x6A, 0x96, 0x4C, + 0xB4, 0x15, 0x41, 0x94, 0x20, 0x9E, 0xDB, 0xAA, + 0x1F, 0x48, 0x1B, 0xD1, 0x26, 0xC3, 0x25, 0xD1, + 0x56, 0x78, 0xE3, 0x9B, 0xCC, 0xE4, 0xC7, 0x04, + 0xEA, 0x48, 0x72, 0x46, 0x64, 0x8A, 0x6C, 0x6C, + 0x25, 0x40, 0xB5, 0xF6, 0x80, 0xA3, 0x5E, 0xE2, + 0x82, 0x42, 0x46, 0x45, 0x0A, 0x72, 0x93, 0xF2, + 0x1A, 0x90, 0xCF, 0xD1, 0x4E, 0xFA, 0xF7, 0x8F, + 0xA3, 0xD7, 0x32, 0x22, 0x51, 0xC6, 0x41, 0xA5, + 0x0E, 0x95, 0xBB, 0x5E, 0xC5, 0xCA, 0x0B, 0x60, + 0xE8, 0x9D, 0x7C, 0x18, 0xB7, 0xA4, 0x4A, 0x0F, + 0xAF, 0xB4, 0xBC, 0xAD, 0xE9, 0xB5, 0x88, 0xD1, + 0xB7, 0xFC, 0xF1, 0x2B, 0xA1, 0xE1, 0x08, 0x4D, + 0x56, 0xB1, 0x97, 0xEA, 0x90, 0xA7, 0x9A, 0x3D, + 0x83, 0x92, 0x7A, 0x23, 0x07, 0x60, 0x3B, 0xC2, + 0x11, 0xC0, 0x83, 0x0C, 0xB7, 0x06, 0x2C, 0x04, + 0x25, 0x48, 0x24, 0x57, 0x5B, 0x22, 0x6C, 0xAD, + 0x9A, 0x27, 0xC2, 0xA4, 0x55, 0x19, 0xAE, 0x39, + 0x54, 0x64, 0x67, 0x69, 0x04, 0x85, 0x49, 0x8A, + 0x32, 0x0A, 0xD5, 0x69, 0x93, 0xB1, 0x5A, 0x9D, + 0x22, 0xC6, 0x19, 0x14, 0x46, 0xCB, 0x40, 0xAA, + 0x75, 0x47, 0x40, 0x16, 0x81, 0xDC, 0xC7, 0xE3, + 0x65, 0x96, 0xB1, 0x0C, 0x07, 0xFA, 0x2A, 0x20, + 0xB4, 0x3C, 0x4B, 0x01, 0x24, 0x40, 0x1F, 0x8A, + 0x0E, 0x74, 0x48, 0x78, 0xC7, 0x29, 0x66, 0x23, + 0xC7, 0x39, 0x5B, 0x69, 0x94, 0xD1, 0x8C, 0x47, + 0x87, 0xA2, 0x89, 0xDB, 0xB0, 0x5C, 0xB1, 0x82, + 0x74, 0x51, 0xD8, 0x3F, 0x07, 0x29, 0x04, 0x53, + 0x75, 0x94, 0xF5, 0x15, 0xCA, 0x10, 0x17, 0x99, + 0x16, 0x20, 0xA3, 0x3E, 0x09, 0x6E, 0xE0, 0xDC, + 0x09, 0x1A, 0xE4, 0xCA, 0x96, 0x06, 0x03, 0xB1, + 0x01, 0xB5, 0xB4, 0xE2, 0x3E, 0x9A, 0x5B, 0x65, + 0xE1, 0xF6, 0xC2, 0xA8, 0xCC, 0x89, 0x34, 0x13, + 0x83, 0xB7, 0x06, 0x72, 0x5E, 0xD5, 0xB3, 0x48, + 0x57, 0x69, 0x18, 0x1B, 0x8F, 0x76, 0x43, 0x9C, + 0x05, 0x63, 0x6A, 0x0C, 0x34, 0x36, 0xFF, 0xBA, + 0x8B, 0x86, 0xA5, 0x30, 0x6F, 0xA1, 0x11, 0xF6, + 0xFC, 0x71, 0xEB, 0x77, 0x9B, 0x25, 0x70, 0x7C, + 0xFA, 0xE0, 0xA6, 0xDA, 0x7B, 0x0A, 0xD5, 0xD9, + 0x4B, 0x10, 0xF2, 0x1E, 0x4F, 0xCA, 0x92, 0x89, + 0x3B, 0x9F, 0xFE, 0x73, 0x21, 0x07, 0x63, 0x40, + 0x13, 0x77, 0x83, 0x7A, 0x10, 0xCA, 0x96, 0x25, + 0x34, 0x6C, 0x42, 0xAD, 0xC7, 0x05, 0xBD, 0x92, + 0xDB, 0x34, 0x26, 0xD9, 0x26, 0xCE, 0x4B, 0x5E, + 0xC2, 0x4A, 0x5C, 0xDF, 0x27, 0xCB, 0x91, 0xE5, + 0xA7, 0xE7, 0x16, 0x4D, 0x1B, 0xDC, 0x99, 0xD7, + 0x56, 0x79, 0xFB, 0xC9, 0x3A, 0x58, 0xF6, 0x47, + 0xDA, 0xC1, 0x08, 0x6C, 0xE9, 0x31, 0xBC, 0x08, + 0x92, 0x33, 0xE9, 0x48, 0x7E, 0x08, 0x67, 0xBC, + 0x58, 0x47, 0x2B, 0x01, 0xBF, 0x28, 0x95, 0xC3, + 0x23, 0xB6, 0x4D, 0xBE, 0x4A, 0x17, 0xA9, 0xE8, + 0x41, 0xB0, 0x53, 0xCA, 0xDB, 0x5C, 0x76, 0xD0, + 0x35, 0x72, 0x4C, 0x32, 0x1B, 0xBC, 0x13, 0x66, + 0x6F, 0x0A, 0x35, 0xDF, 0xDA, 0x07, 0x21, 0xE8, + 0x98, 0x76, 0x23, 0x25, 0x6A, 0x99, 0x4D, 0x95, + 0xFA, 0x1C, 0x05, 0xF5, 0x7C, 0x1E, 0x15, 0xA3, + 0x0C, 0x4A, 0x0C, 0x83, 0x18, 0xA0, 0xD8, 0x3C, + 0x41, 0x0C, 0x36, 0x28, 0x62, 0xE8, 0x17, 0xDD, + 0x6A, 0xBB, 0xAA, 0x4B, 0xBE, 0x75, 0xB7, 0x36, + 0xCC, 0xCB, 0xB4, 0xAF, 0x2A, 0x18, 0x84, 0x02, + 0xBD, 0x4C, 0xE5, 0x97, 0x93, 0x20, 0x08, 0x86, + 0x28, 0x65, 0x33, 0x25, 0x62, 0xF3, 0x24, 0xC7, + 0xA4, 0x24, 0x15, 0x1F, 0xB5, 0x9D, 0x0A, 0xE1, + 0x82, 0x1F, 0x28, 0x64, 0xC7, 0xE6, 0x98, 0x12, + 0x7A, 0xAD, 0x92, 0xC3, 0x3B, 0x31, 0x39, 0x88, + 0xC2, 0x9A, 0x09, 0xE2, 0x60, 0x44, 0x9B, 0xCA, + 0x7B, 0xEE, 0x36, 0x08, 0x62, 0x31, 0x4E, 0x47, + 0x51, 0x9E, 0xF3, 0x91, 0x8D, 0xDD, 0xE4, 0x03, + 0xE7, 0xB9, 0x2A, 0xC9, 0x90, 0x8F, 0x93, 0xC6, + 0x36, 0x9C, 0xC5, 0xC4, 0x7B, 0x8C, 0xB1, 0xDC, + 0x3A, 0x34, 0x79, 0xC7, 0x62, 0xF6, 0x2A, 0x18, + 0xFE, 0x05, 0xA9, 0xB0, 0x64, 0x5A, 0x53, 0x11, + 0xA0, 0x18, 0x28, 0x72, 0x3A, 0xEB, 0x51, 0xFA, + 0x50, 0x5E, 0x96, 0xB2, 0x9E, 0x3D, 0x2B, 0x6E, + 0x5B, 0x13, 0x27, 0xDE, 0x3A, 0x61, 0xAB, 0x0C, + 0x50, 0xBE, 0x01, 0x24, 0xB6, 0x4B, 0x33, 0x31, + 0x4B, 0x32, 0xD6, 0x12, 0x25, 0x10, 0xE4, 0x64, + 0x45, 0x85, 0x7A, 0xA0, 0xE2, 0xC4, 0xB0, 0xD2, + 0x56, 0x95, 0x56, 0x20, 0xA8, 0x68, 0x1D, 0x1E, + 0x55, 0x51, 0x26, 0xD0, 0x05, 0x09, 0xE3, 0x5B, + 0xF5, 0x96, 0x83, 0xDD, 0xAA, 0x40, 0xE8, 0x2C, + 0x51, 0x9B, 0x85, 0x58, 0x52, 0xC3, 0x66, 0xCB, + 0x54, 0x45, 0x2B, 0xF9, 0x10, 0xB0, 0x01, 0x69, + 0x23, 0x30, 0x34, 0x57, 0x08, 0x65, 0x3F, 0x51, + 0x18, 0x00, 0xB1, 0x0E, 0x00, 0x9D, 0x9F, 0x7D, + 0x10, 0xA5, 0x3B, 0x8B, 0x30, 0xBF, 0x13, 0xB0, + 0x6F, 0x25, 0x4E, 0xC8, 0xA6, 0xBA, 0x53, 0x97, + 0x00, 0xF6, 0x35, 0x8D, 0xE0, 0x46, 0x3A, 0x01, + 0x95, 0x40, 0xC9, 0x87, 0x3F, 0x3F, 0x46, 0x80, + 0xE2, 0x11, 0x3A, 0x7C, 0xCC, 0x55, 0xFF, 0x75, + 0x4D, 0x85, 0xAA, 0x67, 0xE9, 0xE5, 0x5F, 0x88, + 0x74, 0x24, 0xE0, 0xB2, 0x62, 0x56, 0x82, 0xA5, + 0xDD, 0xA2, 0x18, 0xF0, 0x3C, 0x3C, 0x10, 0xA2, + 0x46, 0xCD, 0xB0, 0xCC, 0x91, 0xD1, 0x9D, 0x8F, + 0x02, 0x4D, 0xB9, 0xB1, 0x41, 0x5F, 0x50, 0xAC, + 0xD8, 0xF6, 0x5D, 0xE2, 0x78, 0x7B, 0x91, 0x03, + 0xC5, 0x75, 0xB6, 0x87, 0x76, 0x55, 0x72, 0xCF, + 0xFA, 0x59, 0x02, 0x6C, 0x2B, 0xCE, 0xE7, 0x74, + 0x23, 0xBC, 0xAF, 0xD3, 0x05, 0x4B, 0xF8, 0xE2, + 0x71, 0x3F, 0xB8, 0x5B, 0x0B, 0xF6, 0xA4, 0x6E, + 0x71, 0x61, 0x52, 0xF5, 0xC9, 0xA3, 0x01, 0x1E, + 0xC9, 0x01, 0x14, 0xC7, 0x6B, 0x01, 0x51, 0x67, + 0x99, 0xBD, 0x59, 0x11, 0x41, 0x5B, 0x70, 0x45, + 0x44, 0x07, 0x7F, 0x18, 0x88, 0x06, 0x75, 0x5E, + 0xEC, 0x41, 0x31, 0xE5, 0x55, 0x56, 0xDB, 0x90, + 0x3F, 0x42, 0x84, 0xC1, 0xF9, 0x00, 0x86, 0xFF, + 0x43, 0x1B, 0x68, 0xF5, 0x1F, 0x62, 0x98, 0x12, + 0xF3, 0x20, 0xB5, 0x5F, 0x21, 0x9D, 0x72, 0xA1, + 0x92, 0x8F, 0x38, 0xC9, 0xA1, 0xEC, 0x82, 0x3B, + 0xA1, 0x98, 0xBA, 0x9A, 0xBB, 0xAC, 0xF6, 0x29, + 0x02, 0xB3, 0xCA, 0x0A, 0xFC, 0x95, 0xEA, 0x8A, + 0xC3, 0x03, 0xFB, 0x8B, 0xDD, 0x29, 0xBB, 0x9D, + 0x18, 0xA0, 0x3B, 0xA4, 0x4E, 0x58, 0xB1, 0xB0, + 0xB8, 0x5A, 0x2A, 0x16, 0x62, 0xE6, 0xA3, 0x1D, + 0xA7, 0x54, 0x55, 0x11, 0xA4, 0x78, 0xA1, 0x81, + 0x77, 0x88, 0x90, 0x61, 0xEF, 0x76, 0x63, 0x12, + 0x64, 0x23, 0x9A, 0xDE, 0xBD, 0x04, 0xA8, 0xC5, + 0x2B, 0x72, 0xE2, 0xB1, 0xF3, 0xA2, 0xDF, 0xBB, + 0xD8, 0xC0, 0x54, 0xE7, 0x0C, 0xC2, 0xA7, 0x42, + 0xE7, 0xB7, 0xD4, 0x17, 0xDF, 0xED, 0x31, 0x44, + 0x22, 0x18, 0x7D, 0xE1, 0xB2, 0x95, 0x44, 0x81, + 0x19, 0x57, 0x55, 0xEC, 0x04, 0xBB, 0x76, 0x71, + 0xC4, 0x33, 0x14, 0x46, 0xBB, 0xE8, 0x95, 0x25, + 0x14, 0x90, 0x53, 0x21, 0xA2, 0x17, 0x6E, 0x93, + 0x5B, 0x54, 0x20, 0xC0, 0xD5, 0xEA, 0x44, 0x65 + }; + static const byte c_512[KYBER512_CIPHER_TEXT_SIZE] = { + 0x84, 0xA1, 0x88, 0xA0, 0x72, 0xE4, 0xD4, 0xF4, + 0x49, 0xA4, 0xBE, 0x17, 0x02, 0x74, 0xDD, 0x2A, + 0x5F, 0x3E, 0x35, 0x6E, 0x95, 0xB9, 0x6E, 0x40, + 0xAD, 0x3F, 0xF1, 0x45, 0x5E, 0x36, 0xC6, 0xA7, + 0x1E, 0x90, 0x9D, 0xD2, 0xC0, 0xDF, 0xF8, 0xAD, + 0x2C, 0x9F, 0x50, 0x3B, 0xAC, 0x90, 0x65, 0x71, + 0x62, 0x48, 0x08, 0x3B, 0xDA, 0x40, 0xCE, 0xCB, + 0x38, 0xE3, 0xB3, 0x05, 0x8B, 0xAF, 0x51, 0xA7, + 0x57, 0x23, 0x84, 0xFF, 0x84, 0x06, 0xA8, 0x13, + 0x6A, 0x4F, 0xC6, 0xD9, 0x12, 0xA5, 0x4B, 0x2E, + 0xB5, 0xB9, 0xD5, 0x98, 0xFB, 0x68, 0x9E, 0x72, + 0xED, 0x3D, 0xEF, 0xD2, 0xFF, 0x83, 0x55, 0xED, + 0x9E, 0x9C, 0xCA, 0x53, 0xE8, 0x2C, 0x08, 0x86, + 0xE0, 0x94, 0xC5, 0x92, 0xC3, 0x92, 0x31, 0x1F, + 0x04, 0xFE, 0xC6, 0x8F, 0x9A, 0x1C, 0x53, 0x1C, + 0xF3, 0x41, 0x90, 0x30, 0x89, 0x2B, 0x5B, 0xDC, + 0xAC, 0xEE, 0xF6, 0xA0, 0xE7, 0xF1, 0xBD, 0x44, + 0x90, 0x3F, 0x49, 0xDE, 0x8E, 0x37, 0xB0, 0x2B, + 0xA3, 0xFC, 0x51, 0x21, 0xD9, 0x9F, 0x8C, 0xC3, + 0x04, 0x0F, 0x66, 0x83, 0x2F, 0x77, 0x02, 0x1B, + 0x4C, 0xA3, 0x5F, 0x7A, 0x48, 0x25, 0x03, 0x89, + 0x36, 0x56, 0x4C, 0xA2, 0xE6, 0x73, 0xFF, 0x9C, + 0xC0, 0x51, 0x9C, 0x25, 0xF6, 0xA5, 0x2D, 0x87, + 0xED, 0xD9, 0x65, 0xB2, 0x46, 0x4A, 0xA3, 0x65, + 0xD2, 0xBF, 0x06, 0x8B, 0x72, 0xFC, 0x68, 0xB6, + 0x5E, 0x88, 0x51, 0x5E, 0x2C, 0x83, 0x2B, 0xBD, + 0xB2, 0x7D, 0x61, 0xBF, 0x51, 0x2B, 0x5F, 0xC2, + 0xD8, 0x59, 0x0F, 0xB3, 0x5F, 0x49, 0x50, 0x0C, + 0xAF, 0xE7, 0x0E, 0x7D, 0x07, 0x76, 0xB5, 0xC4, + 0xE4, 0x50, 0x3A, 0x71, 0x89, 0xAD, 0xBA, 0xFF, + 0x5D, 0x5B, 0x51, 0x5C, 0xC6, 0x8B, 0x2F, 0x81, + 0xD9, 0x93, 0xC6, 0xD7, 0xFA, 0x7D, 0x3D, 0x1D, + 0x90, 0xEB, 0xFF, 0x51, 0xDA, 0x3F, 0xBB, 0xB4, + 0x43, 0x0E, 0x5B, 0xBE, 0xDB, 0xCA, 0x8D, 0xA0, + 0x78, 0xDC, 0xE8, 0xEC, 0x81, 0x5B, 0x16, 0x8B, + 0xFC, 0x09, 0xAB, 0x4A, 0x20, 0x67, 0x88, 0x70, + 0xF4, 0x86, 0x8B, 0x1F, 0xAE, 0x28, 0xD2, 0x09, + 0xC7, 0x53, 0x68, 0xA7, 0x99, 0x31, 0x7D, 0xFA, + 0x08, 0xC2, 0xB6, 0x51, 0xFA, 0xC7, 0x2D, 0xCA, + 0x2A, 0x1B, 0x4C, 0xBB, 0x75, 0xE8, 0x73, 0xF1, + 0x5C, 0x51, 0xB6, 0xD0, 0xB5, 0xE6, 0xF5, 0xE6, + 0x0E, 0x2A, 0xF6, 0xC4, 0x0D, 0x2C, 0xAB, 0xCB, + 0xF3, 0x58, 0x8F, 0x44, 0xBC, 0xEA, 0x6D, 0x72, + 0xD3, 0x59, 0xF4, 0x0F, 0x9C, 0xF5, 0xE0, 0xEC, + 0x40, 0xA5, 0x21, 0x5E, 0x5A, 0xCE, 0xEA, 0xF0, + 0xDA, 0x00, 0xD9, 0x23, 0xD4, 0xCE, 0xFF, 0x5C, + 0x3A, 0x3A, 0xB1, 0xE4, 0x6C, 0x75, 0x4F, 0x4A, + 0xE0, 0x52, 0xC2, 0xBC, 0x49, 0xFD, 0xB4, 0x52, + 0x1A, 0xE4, 0x4D, 0xF6, 0x34, 0xD5, 0x6E, 0x43, + 0x3D, 0xAD, 0x3D, 0xF3, 0xC0, 0x71, 0x15, 0x40, + 0x6F, 0xF8, 0xBF, 0xD0, 0xD7, 0xC9, 0x3B, 0x49, + 0x41, 0xD0, 0xF0, 0x92, 0x13, 0xC1, 0x68, 0x1C, + 0xFD, 0x5C, 0x86, 0x63, 0xDF, 0x02, 0x04, 0x1A, + 0x3C, 0xBD, 0x16, 0x2F, 0x5C, 0x4D, 0x80, 0xCB, + 0x1D, 0xC7, 0xD4, 0xA5, 0x01, 0xAD, 0x06, 0xFE, + 0x96, 0xEB, 0x34, 0x8B, 0x6E, 0x33, 0x1C, 0x82, + 0x96, 0xFE, 0x90, 0x4E, 0xB9, 0x7C, 0x08, 0x74, + 0x56, 0x32, 0x8D, 0x70, 0x3B, 0x85, 0xBD, 0xAC, + 0x2F, 0xB4, 0x3C, 0x72, 0x8D, 0x0B, 0x05, 0xFC, + 0x54, 0xB8, 0xC1, 0x55, 0xC0, 0x10, 0xEF, 0x0D, + 0xB1, 0x4C, 0xC6, 0x68, 0xD1, 0xB1, 0xBC, 0x72, + 0x7A, 0xF8, 0x86, 0x40, 0x76, 0x73, 0x6B, 0x89, + 0x8B, 0xAB, 0xA1, 0xC8, 0x1D, 0xCA, 0x20, 0x53, + 0xF5, 0x85, 0x87, 0xD3, 0xC4, 0xE3, 0x3C, 0x69, + 0x4A, 0x26, 0x4B, 0xE2, 0x89, 0x7E, 0x7D, 0x2E, + 0xEF, 0xAD, 0xDA, 0x9F, 0xF8, 0x8D, 0x70, 0xBF, + 0x37, 0x31, 0xF1, 0x22, 0x8C, 0xB3, 0xE1, 0x31, + 0xEB, 0x0C, 0xB7, 0x6F, 0xDB, 0xD2, 0xCC, 0xB1, + 0xCB, 0xC1, 0x8D, 0x14, 0x50, 0xAC, 0x7A, 0x16, + 0x34, 0x9E, 0x71, 0x29, 0xCA, 0xB7, 0x20, 0xD5, + 0xCB, 0x70, 0xB5, 0x6E, 0x85, 0x5E, 0x83, 0x05, + 0xDC, 0xDA, 0x73, 0x0B, 0xBD, 0x0E, 0xA3, 0x3E, + 0xF0, 0x81, 0x5D, 0x02, 0x19, 0x0B, 0xB9, 0x8E, + 0x30, 0xF7, 0x3B, 0xF7, 0x78, 0x9C, 0xDD, 0x67, + 0x3C, 0x61, 0x3B, 0x0C, 0x57, 0xCB, 0x2E, 0xF3, + 0x2E, 0x67, 0x0A, 0x98, 0xD2, 0xD6, 0x30, 0x67, + 0x07, 0x73, 0xC5, 0x9D, 0x8A, 0x6A, 0x2C, 0xFC, + 0xFF, 0x1C, 0x7C, 0xA1, 0xBB, 0x55, 0xC1, 0x7A, + 0x32, 0xCB, 0x65, 0xA2, 0xEA, 0x19, 0xC7, 0xB8, + 0xE2, 0x95, 0xC6, 0x89, 0x8C, 0xF3, 0x2F, 0xEE, + 0x1D, 0xEB, 0x01, 0x47, 0x2B, 0xE7, 0x6C, 0x3A, + 0x78, 0xCB, 0x24, 0x2E, 0xDF, 0xE2, 0x1D, 0x96, + 0x1F, 0xCB, 0x85, 0xC3, 0xCF, 0x6C, 0xEE, 0x21, + 0x89, 0x86, 0xC1, 0xBD, 0x93, 0x2B, 0xF9, 0x7B, + 0xC6, 0xDE, 0xCA, 0xAB, 0xF8, 0xC6, 0x29, 0x40, + 0xC0, 0xA5, 0x8E, 0x87, 0xC6, 0xED, 0xDC, 0xD7, + 0x4B, 0x7F, 0x71, 0x5D, 0x8C, 0x22, 0x52, 0x05, + 0x46, 0x23, 0x9F, 0x3A, 0xAA, 0x10, 0xA4, 0x35, + 0x82, 0x01, 0x03, 0xB4, 0xE3, 0x29, 0x53, 0x11, + 0xD9, 0x92, 0xC9, 0xC8, 0x77, 0x1A, 0x3C, 0xE8, + 0x49, 0x86, 0x8F, 0x36, 0xF3, 0x12, 0x14, 0xF9, + 0x63, 0x9C, 0x02, 0x8F, 0x4A, 0x5F, 0x49, 0x45, + 0xF2, 0xBE, 0xC9, 0x58, 0x50, 0x77, 0xBF, 0x2F, + 0x63, 0x7D, 0x25, 0x49, 0xF8, 0x34, 0x8C, 0x00, + 0xEC, 0xBF, 0x19, 0xC4, 0x70, 0xDF, 0x25, 0x5E, + 0xFF, 0x62, 0x32, 0x81, 0x34, 0x29, 0xF8, 0x53 + }; + static const byte kprime_512[KYBER_SS_SZ] = { + 0x22, 0x4B, 0x9C, 0x05, 0x12, 0x13, 0xEF, 0x46, + 0x54, 0x92, 0x43, 0x79, 0x65, 0x32, 0x28, 0x29, + 0x73, 0xFA, 0x7C, 0xF9, 0x7E, 0x89, 0x13, 0xC3, + 0x39, 0xC1, 0x94, 0x0A, 0xC1, 0x7E, 0x05, 0xE0 + }; +#endif +#ifndef WOLFSSL_NO_KYBER768 + static const byte dk_768[KYBER768_PRIVATE_KEY_SIZE] = { + 0x34, 0x56, 0x85, 0x9B, 0xF7, 0x07, 0xE6, 0x72, + 0xAC, 0x71, 0x2B, 0x7E, 0x70, 0xF5, 0x42, 0x75, + 0x74, 0x59, 0x75, 0x02, 0xB8, 0x1D, 0xE8, 0x93, + 0x1C, 0x92, 0xA9, 0xC0, 0xD2, 0x2A, 0x8E, 0x17, + 0x73, 0xCB, 0x87, 0x47, 0x22, 0x05, 0xA3, 0x1C, + 0x32, 0x20, 0x6B, 0xA4, 0xBC, 0xF4, 0x22, 0x59, + 0x53, 0x3C, 0xB3, 0xA1, 0x9C, 0x02, 0x00, 0x86, + 0x02, 0x44, 0xA6, 0xC3, 0xF6, 0x92, 0x18, 0x45, + 0xB0, 0xA0, 0x58, 0x50, 0x18, 0x7A, 0x43, 0x10, + 0xB3, 0xD5, 0x22, 0x3A, 0xAA, 0xA0, 0xC7, 0x9B, + 0x9B, 0xBC, 0xFC, 0xCB, 0x3F, 0x75, 0x12, 0x14, + 0xEB, 0x0C, 0xFA, 0xC1, 0xA2, 0x9E, 0xD8, 0x84, + 0x8A, 0x5A, 0x49, 0xBA, 0x84, 0xBA, 0x68, 0xE6, + 0xB6, 0xF5, 0x05, 0x7D, 0x49, 0x31, 0x05, 0xFF, + 0x38, 0xA9, 0xF4, 0x4B, 0x4E, 0x7F, 0x6C, 0xBE, + 0x7D, 0x21, 0x64, 0x08, 0xF7, 0xB4, 0x86, 0x05, + 0xB2, 0x70, 0xB2, 0x53, 0xB0, 0x01, 0xA5, 0x40, + 0x1C, 0x0C, 0x91, 0x27, 0xCC, 0x18, 0x5B, 0x1B, + 0x0C, 0xF9, 0x2B, 0x99, 0xFB, 0xA0, 0xD9, 0x5A, + 0x29, 0x5F, 0x87, 0x35, 0x15, 0x52, 0x0C, 0x86, + 0x32, 0x1B, 0x8C, 0x96, 0x6C, 0x83, 0x7A, 0xAB, + 0x34, 0xB2, 0xBF, 0xFA, 0xB2, 0xA2, 0xA4, 0x30, + 0x1B, 0x35, 0x6B, 0x26, 0xCD, 0xC4, 0x56, 0x38, + 0x02, 0x90, 0x1B, 0x47, 0x62, 0xF2, 0x84, 0x28, + 0x1A, 0x38, 0x2E, 0x5F, 0x76, 0x2B, 0xEF, 0x47, + 0xB5, 0x19, 0xA8, 0x1A, 0x10, 0x86, 0x57, 0xEB, + 0xE9, 0x62, 0xBE, 0x12, 0x0B, 0x5F, 0xB3, 0xB9, + 0xED, 0x33, 0x8C, 0xCF, 0x47, 0xB3, 0xA0, 0x39, + 0x52, 0xA1, 0x66, 0x33, 0xF6, 0xE6, 0xB5, 0x34, + 0xE6, 0xB6, 0x3D, 0x05, 0x70, 0x6E, 0xFA, 0x0F, + 0x94, 0xC0, 0x3A, 0x2B, 0x85, 0x6A, 0xE5, 0x51, + 0x42, 0x2F, 0x90, 0x11, 0xF2, 0x58, 0x9A, 0x41, + 0xB9, 0x6A, 0x2C, 0xD2, 0x13, 0xC6, 0x99, 0x9B, + 0x09, 0xE9, 0x1F, 0xF4, 0x23, 0xCB, 0x10, 0x6A, + 0x1A, 0x92, 0x0B, 0x84, 0xB8, 0x11, 0x46, 0x94, + 0x97, 0x15, 0x42, 0x23, 0x98, 0x7F, 0x00, 0x5C, + 0x72, 0xF8, 0xAF, 0x38, 0x8B, 0x09, 0x0C, 0x63, + 0x9F, 0x8C, 0x77, 0x4F, 0xC5, 0xA2, 0x94, 0xC7, + 0x4A, 0x21, 0x2C, 0x91, 0xA8, 0x6C, 0x32, 0x8A, + 0xEB, 0xEA, 0x55, 0x8A, 0xB4, 0x3F, 0x8B, 0x87, + 0x35, 0x34, 0xFA, 0x2E, 0xF9, 0xE6, 0x6C, 0xEF, + 0x3C, 0x52, 0xCD, 0x47, 0x1A, 0xB7, 0x83, 0x75, + 0xE7, 0x45, 0xB9, 0xD0, 0xAA, 0x65, 0xD2, 0x27, + 0x8B, 0x92, 0x75, 0xAE, 0x53, 0x48, 0xB1, 0x6C, + 0xF6, 0x2A, 0xC8, 0x06, 0x57, 0x34, 0xE4, 0xBD, + 0x77, 0xB8, 0x0C, 0xCF, 0x89, 0x76, 0x05, 0xEB, + 0x76, 0xF4, 0x85, 0xAF, 0x8A, 0x0B, 0x46, 0x65, + 0x57, 0xA8, 0x3C, 0x02, 0x92, 0xCC, 0xF9, 0x03, + 0xEE, 0x7A, 0xA5, 0x7C, 0x3B, 0x51, 0xAD, 0x66, + 0x01, 0x89, 0xB8, 0x61, 0x39, 0xE3, 0x80, 0x42, + 0x5B, 0x31, 0xA9, 0x26, 0x89, 0xDF, 0x24, 0x31, + 0xBF, 0xA7, 0xB6, 0x9E, 0xAB, 0x17, 0x27, 0x45, + 0x1B, 0x29, 0xDA, 0x8B, 0x8B, 0xF8, 0x51, 0xE1, + 0xBC, 0x2D, 0x3A, 0x63, 0x13, 0x4C, 0xA9, 0x66, + 0x3C, 0x57, 0xAE, 0xC6, 0x98, 0x5C, 0xEB, 0xD5, + 0x6D, 0xB0, 0x44, 0x7B, 0x13, 0x6B, 0x01, 0x7A, + 0x97, 0x47, 0x61, 0xC3, 0xC6, 0x7D, 0x33, 0x77, + 0x2F, 0x99, 0x64, 0xE5, 0x43, 0x4D, 0x64, 0x35, + 0x04, 0x33, 0x2A, 0x30, 0x27, 0x29, 0x4A, 0x07, + 0x8C, 0x59, 0x9C, 0xB2, 0x91, 0x63, 0x10, 0x9C, + 0xE3, 0xB5, 0x6C, 0xE6, 0x98, 0xB4, 0xD3, 0xF5, + 0x9E, 0x29, 0x56, 0xA1, 0xF0, 0x3A, 0x4B, 0x95, + 0x55, 0x93, 0xF2, 0xD2, 0x45, 0x7F, 0xFA, 0xAE, + 0x96, 0x24, 0xA0, 0x71, 0x10, 0x45, 0xB3, 0xF5, + 0x52, 0x92, 0xF2, 0x0C, 0xC9, 0xD0, 0xCD, 0x79, + 0x1A, 0x21, 0x59, 0x7B, 0x0F, 0x2C, 0xD9, 0x80, + 0xF3, 0x51, 0x0F, 0x0B, 0x02, 0x39, 0x02, 0x20, + 0x00, 0xD7, 0x35, 0x58, 0x6E, 0xE6, 0xA7, 0x3F, + 0x3A, 0x3D, 0xCB, 0xD6, 0xBD, 0x1A, 0x85, 0xC8, + 0x65, 0x12, 0xAB, 0xF3, 0xC5, 0x1C, 0xE0, 0x0A, + 0x03, 0x31, 0xF6, 0x53, 0x60, 0x46, 0x2C, 0x02, + 0x23, 0x29, 0x59, 0x7A, 0x81, 0xC3, 0xF9, 0x2F, + 0xC1, 0x79, 0x38, 0xC9, 0x13, 0x8F, 0x41, 0x11, + 0x38, 0x79, 0x79, 0xC2, 0x8F, 0x03, 0x34, 0xF9, + 0x01, 0x19, 0x22, 0x13, 0x74, 0xDA, 0xB0, 0x45, + 0x92, 0x9B, 0x49, 0xE4, 0x3A, 0x96, 0x46, 0xA2, + 0x43, 0xF4, 0x46, 0x4D, 0xAF, 0x81, 0x1A, 0xB0, + 0x06, 0x30, 0xC7, 0x59, 0x61, 0xBC, 0xD4, 0xAF, + 0x5D, 0x99, 0x11, 0x5A, 0x37, 0x49, 0x19, 0x1B, + 0xA8, 0xFD, 0x41, 0xCE, 0x0B, 0x3C, 0x89, 0xA6, + 0x95, 0xB4, 0xBB, 0x85, 0x06, 0x4F, 0xD3, 0xAF, + 0x95, 0xC9, 0xB4, 0xAE, 0xE0, 0x9A, 0xC7, 0xB0, + 0xCC, 0x69, 0xEC, 0xA3, 0x6A, 0x00, 0x4B, 0x6C, + 0xD6, 0x62, 0xA6, 0xD3, 0x27, 0x95, 0x05, 0x3E, + 0xF0, 0xA0, 0x3A, 0xDA, 0x3B, 0x98, 0xBF, 0xE3, + 0xB4, 0x6A, 0x79, 0x72, 0x3E, 0x3A, 0x45, 0xAB, + 0x3C, 0x31, 0x95, 0x06, 0x69, 0xAD, 0x77, 0x07, + 0x20, 0x62, 0xCC, 0x3B, 0x50, 0x4D, 0xF1, 0x33, + 0x4F, 0xD6, 0x90, 0x9E, 0xAC, 0x79, 0x15, 0xF1, + 0xD5, 0xAD, 0x16, 0x63, 0x9F, 0x5F, 0xB5, 0x64, + 0x41, 0x64, 0x54, 0x25, 0x91, 0x34, 0xD5, 0x65, + 0x88, 0x2C, 0xB3, 0x81, 0xCB, 0xA5, 0x8B, 0x76, + 0x88, 0x07, 0x67, 0xB5, 0x0A, 0xC1, 0xB8, 0x57, + 0x95, 0xD7, 0x26, 0x84, 0x33, 0xB3, 0x71, 0x23, + 0x0E, 0xD4, 0xC7, 0x2F, 0x99, 0xAB, 0x1A, 0xD1, + 0xE5, 0x95, 0xA4, 0x59, 0xCF, 0x0A, 0x23, 0x34, + 0xAA, 0x14, 0x63, 0xAD, 0xE4, 0xBD, 0xC9, 0x24, + 0x96, 0x05, 0x38, 0x18, 0x57, 0xBB, 0x98, 0x09, + 0x5B, 0x41, 0x13, 0x29, 0x46, 0xCA, 0x24, 0x57, + 0xDF, 0xAA, 0x91, 0x49, 0x58, 0x2A, 0xA1, 0x99, + 0x27, 0xB6, 0x36, 0x89, 0xE2, 0x92, 0x9A, 0xA4, + 0x10, 0x27, 0xBE, 0xF4, 0x92, 0x19, 0x70, 0xBA, + 0xD4, 0xA5, 0x54, 0x90, 0xD9, 0x1A, 0xBE, 0x25, + 0x1D, 0xEF, 0x45, 0x52, 0xCA, 0x88, 0x03, 0x41, + 0x06, 0xA0, 0x2C, 0xE4, 0xB0, 0x58, 0xF8, 0xB5, + 0x96, 0x24, 0xB6, 0x7E, 0x06, 0x3B, 0xF1, 0x78, + 0xB0, 0x15, 0xE4, 0x28, 0x1E, 0xB1, 0x14, 0xA2, + 0xBC, 0x24, 0x54, 0x94, 0x3A, 0x4B, 0x46, 0x47, + 0x12, 0x2C, 0x42, 0xCB, 0xEA, 0x4E, 0x94, 0x15, + 0x4F, 0xD3, 0xE4, 0xB7, 0x91, 0xF6, 0x29, 0x0B, + 0x78, 0x29, 0x94, 0x20, 0x68, 0x53, 0xD6, 0x70, + 0x00, 0xA6, 0x33, 0xF3, 0x20, 0xA8, 0xA3, 0x74, + 0xCA, 0x5D, 0x40, 0x38, 0xF9, 0xCA, 0x42, 0x44, + 0xDC, 0xB0, 0x2E, 0x9A, 0x84, 0xE1, 0xF7, 0xC8, + 0xA8, 0x21, 0x13, 0x2B, 0x32, 0xB9, 0xA8, 0x40, + 0x55, 0x7B, 0x34, 0x78, 0x06, 0x65, 0x30, 0x17, + 0x24, 0xBA, 0x26, 0x06, 0x68, 0x1D, 0x94, 0x5E, + 0x34, 0xD7, 0xCF, 0x94, 0x1B, 0x89, 0x63, 0xCA, + 0xA1, 0x00, 0x1A, 0x49, 0x1B, 0x8B, 0x2E, 0x43, + 0x57, 0x0E, 0x9A, 0xB9, 0x5C, 0x0A, 0x57, 0xC5, + 0x03, 0xF0, 0xAB, 0x96, 0x0B, 0x48, 0x56, 0xD0, + 0x25, 0x15, 0x74, 0x71, 0x0F, 0xE5, 0xCB, 0x47, + 0x42, 0x84, 0xFC, 0x10, 0x49, 0xAA, 0x2A, 0x7B, + 0x03, 0x69, 0x4A, 0x1C, 0x76, 0x3E, 0x99, 0xDA, + 0xC6, 0xAD, 0x0B, 0xA8, 0x03, 0x8B, 0x13, 0x8A, + 0x64, 0x43, 0x2E, 0x34, 0x91, 0x16, 0xA0, 0x31, + 0xE8, 0xC7, 0x92, 0x78, 0x17, 0x51, 0xBA, 0x47, + 0x3C, 0xBD, 0xF5, 0x57, 0x20, 0x00, 0x5A, 0xBD, + 0xAA, 0x13, 0xD5, 0x01, 0x82, 0xF0, 0xE6, 0x33, + 0x77, 0x6B, 0xB0, 0x67, 0x5C, 0x40, 0x47, 0x2B, + 0xAD, 0x1F, 0x96, 0x72, 0x76, 0x91, 0x83, 0xD0, + 0xCC, 0xC8, 0x10, 0xBC, 0x25, 0xA8, 0x57, 0x32, + 0x20, 0x56, 0x9F, 0x6A, 0xC4, 0xBA, 0xC2, 0x2A, + 0x13, 0x54, 0xD8, 0xB3, 0x6C, 0x05, 0x80, 0xD0, + 0xE5, 0x29, 0x9E, 0x62, 0x9C, 0x50, 0x6C, 0xC7, + 0x65, 0x55, 0x46, 0xFF, 0x27, 0x81, 0x0C, 0x97, + 0xB5, 0x1B, 0xA0, 0x56, 0xBB, 0xF8, 0x6E, 0xD9, + 0xCB, 0x7C, 0x0A, 0x53, 0x7F, 0x72, 0xD0, 0xCF, + 0x9A, 0xD2, 0xC2, 0x31, 0xE2, 0x9E, 0xBF, 0x55, + 0x3F, 0x61, 0x3C, 0xBB, 0x15, 0xB3, 0x72, 0x1A, + 0x20, 0x07, 0x7E, 0x50, 0x5F, 0xD3, 0x90, 0xCB, + 0x19, 0xF6, 0x48, 0x8A, 0x10, 0x7D, 0xEE, 0x1C, + 0xAC, 0x58, 0xAB, 0x70, 0x34, 0xBA, 0x69, 0x03, + 0x00, 0x21, 0x95, 0x95, 0xB3, 0x69, 0x5C, 0x12, + 0x34, 0xE8, 0xB5, 0x7E, 0x33, 0xC8, 0xD3, 0xA0, + 0x48, 0x45, 0x4A, 0x61, 0x6D, 0xF3, 0xC9, 0xB5, + 0x6A, 0x6F, 0xF2, 0x02, 0x6A, 0xF9, 0x97, 0x72, + 0x5F, 0xC9, 0x55, 0x79, 0x04, 0x3B, 0xAE, 0x93, + 0x99, 0xB6, 0x79, 0x0D, 0x63, 0x7B, 0x4F, 0xA8, + 0x20, 0xB0, 0xB2, 0xD2, 0xCA, 0xB6, 0x07, 0xBA, + 0xF6, 0xA3, 0x72, 0x73, 0x4C, 0x31, 0xEE, 0x00, + 0x26, 0xF3, 0xC0, 0x76, 0xD1, 0x4A, 0x8E, 0x3E, + 0xE6, 0x6A, 0xAD, 0x8B, 0xBB, 0xCC, 0xEB, 0x9D, + 0xC7, 0x0C, 0x7B, 0x6B, 0xB0, 0xBB, 0x76, 0xC2, + 0x00, 0xC2, 0x31, 0x60, 0x1C, 0xA0, 0x87, 0x3E, + 0xC8, 0x71, 0x0F, 0x4B, 0x18, 0xD5, 0x72, 0x90, + 0xB0, 0x33, 0x72, 0x7C, 0x60, 0x1E, 0xDB, 0x71, + 0xC2, 0xB0, 0xF0, 0xC2, 0x1D, 0x55, 0x3E, 0x0E, + 0x7A, 0x4F, 0x77, 0x71, 0x68, 0x39, 0xC7, 0xC8, + 0x44, 0x8A, 0xBB, 0x9F, 0x66, 0xA5, 0x4E, 0x8A, + 0x4B, 0x08, 0xA7, 0x9D, 0x9A, 0x39, 0x2C, 0xA1, + 0x27, 0x00, 0x31, 0x38, 0x8B, 0xAD, 0x56, 0x21, + 0x7E, 0x32, 0xAE, 0xF5, 0x54, 0x11, 0x97, 0x49, + 0x06, 0xA2, 0x45, 0xC0, 0x07, 0x12, 0xB3, 0xCB, + 0xB1, 0x17, 0x06, 0x85, 0x19, 0x3F, 0xE2, 0x5A, + 0xCD, 0x7A, 0xC1, 0x3D, 0x32, 0x07, 0x3F, 0x38, + 0x79, 0xA5, 0xD7, 0x83, 0x75, 0xF0, 0x05, 0x2C, + 0xF7, 0x91, 0x75, 0xBA, 0xB4, 0x6D, 0x22, 0x37, + 0x05, 0x97, 0xBD, 0x06, 0x78, 0x9E, 0xDD, 0x07, + 0x11, 0xCC, 0x42, 0x43, 0x50, 0x7A, 0x02, 0xB4, + 0xFA, 0xAD, 0xBB, 0x62, 0x25, 0x0C, 0xC9, 0x97, + 0xAE, 0x03, 0x27, 0xAE, 0xB0, 0x0D, 0xEB, 0x52, + 0x91, 0x92, 0xA6, 0x4B, 0x10, 0x96, 0xA8, 0x6B, + 0x19, 0x67, 0x4D, 0x0B, 0x0A, 0xF0, 0x5C, 0x4A, + 0xAE, 0x17, 0x8C, 0x2C, 0x9A, 0x64, 0x42, 0xE9, + 0x4E, 0xD0, 0xA5, 0x60, 0x33, 0xA1, 0x1E, 0xE4, + 0x26, 0x32, 0xC0, 0xB4, 0xAA, 0x51, 0xD4, 0x21, + 0x50, 0x79, 0x0F, 0x41, 0x06, 0x2B, 0x77, 0x25, + 0x3C, 0x25, 0xBA, 0x4D, 0xE5, 0x59, 0x76, 0x1F, + 0x0A, 0x90, 0x06, 0x83, 0x89, 0x72, 0x8B, 0xC9, + 0x77, 0xF7, 0x0C, 0xF7, 0xBC, 0xCF, 0xBD, 0x88, + 0x3D, 0xF1, 0x3C, 0x79, 0xF5, 0xF2, 0xC3, 0x43, + 0x12, 0xCB, 0x1D, 0x5A, 0x55, 0xD7, 0x8C, 0x1B, + 0x24, 0x20, 0x96, 0xA8, 0xC0, 0x59, 0x3C, 0xFB, + 0x27, 0x53, 0x46, 0x0B, 0xD3, 0x0A, 0xBA, 0x30, + 0x6C, 0x74, 0x17, 0x39, 0x95, 0x74, 0x83, 0x85, + 0xD0, 0x0B, 0x36, 0x70, 0xE6, 0x13, 0x24, 0xD8, + 0x7D, 0xE8, 0xA1, 0x44, 0x50, 0xDC, 0x49, 0x37, + 0x68, 0x77, 0x7F, 0xF0, 0xCE, 0x68, 0x10, 0x93, + 0x7A, 0x71, 0x12, 0x29, 0x56, 0x1A, 0x5E, 0xF2, + 0xBB, 0x69, 0x86, 0x10, 0x74, 0xE0, 0x0B, 0xD9, + 0x32, 0x66, 0xE4, 0xB8, 0x62, 0x69, 0xE1, 0x8E, + 0xEA, 0x2C, 0xAA, 0xCB, 0x60, 0xA1, 0x35, 0x86, + 0x36, 0xCD, 0x7A, 0x7C, 0xA6, 0xBB, 0x68, 0x21, + 0x30, 0x24, 0x17, 0x84, 0xB1, 0x01, 0xEA, 0x5B, + 0xFD, 0x6C, 0x3A, 0x07, 0x15, 0x86, 0x21, 0x61, + 0x47, 0x36, 0xF6, 0x99, 0x6D, 0x5A, 0x4E, 0x14, + 0x96, 0x3A, 0x12, 0xD8, 0x36, 0xE5, 0x33, 0xA0, + 0xC8, 0x91, 0x2D, 0xB7, 0xE1, 0x16, 0x85, 0xA4, + 0xA5, 0x3D, 0x82, 0x85, 0xF0, 0x87, 0x50, 0xDF, + 0xF6, 0x6D, 0xA2, 0x7C, 0x23, 0xB9, 0x75, 0x42, + 0xDE, 0xFB, 0x99, 0xE4, 0x70, 0xAC, 0xD5, 0xE6, + 0x47, 0xC9, 0x40, 0xCB, 0x57, 0x30, 0x1B, 0x43, + 0xCC, 0x3E, 0x68, 0xE6, 0x4E, 0x28, 0xB0, 0x67, + 0x70, 0x69, 0x5E, 0xF6, 0x09, 0x26, 0x5E, 0x06, + 0xC6, 0x0F, 0x22, 0xCB, 0x87, 0x58, 0x49, 0xE6, + 0x2B, 0xAB, 0x88, 0xCC, 0x10, 0xEC, 0xF6, 0x22, + 0xC3, 0x79, 0xCB, 0x54, 0xF1, 0x3D, 0x8B, 0x2B, + 0xAC, 0x90, 0x2B, 0x9A, 0xB0, 0x2B, 0xB3, 0x30, + 0xB4, 0x5A, 0xC8, 0xB7, 0x41, 0xC2, 0x64, 0x7A, + 0xC4, 0x5B, 0x5B, 0xF4, 0x8A, 0x6D, 0x3F, 0xE0, + 0x39, 0x98, 0x6C, 0xC9, 0x40, 0xC6, 0x0A, 0x94, + 0xE6, 0x6C, 0xF6, 0x44, 0x53, 0x10, 0x16, 0xA5, + 0x27, 0x24, 0x50, 0x82, 0x43, 0x14, 0xB5, 0x66, + 0x2A, 0x0A, 0x90, 0x9A, 0xBF, 0xB4, 0x6F, 0xD2, + 0x7B, 0xAE, 0xD3, 0xAB, 0xA8, 0x25, 0x93, 0x61, + 0x59, 0x68, 0x82, 0xB0, 0x8B, 0x2A, 0xC7, 0x23, + 0x39, 0x30, 0xFC, 0x37, 0x86, 0x73, 0x8E, 0xD2, + 0xF8, 0x1E, 0xE6, 0x38, 0xC4, 0x5C, 0x3B, 0x9C, + 0xFD, 0x19, 0x51, 0xDB, 0x5B, 0xCC, 0x14, 0x45, + 0xC2, 0xC1, 0x62, 0x5D, 0x57, 0xD5, 0x7B, 0x53, + 0x90, 0x4B, 0x6A, 0x1A, 0xB6, 0x81, 0x58, 0x07, + 0x55, 0xE8, 0x9F, 0xA7, 0x97, 0x75, 0xA6, 0x57, + 0xCD, 0x62, 0xB4, 0x42, 0x63, 0x04, 0xBC, 0x0C, + 0x71, 0x1E, 0x28, 0x07, 0xA2, 0xC9, 0xE8, 0x52, + 0xD4, 0xB4, 0x35, 0x9E, 0xE6, 0xB5, 0x3E, 0x46, + 0x75, 0xF5, 0x23, 0xC9, 0x07, 0x82, 0x57, 0x2D, + 0xC7, 0x36, 0x8F, 0xB4, 0x00, 0xC3, 0x28, 0xC7, + 0x0F, 0xC8, 0x46, 0xB5, 0xE9, 0x8A, 0x43, 0x30, + 0xBB, 0xB6, 0x27, 0xBD, 0xD7, 0x84, 0xB4, 0xDA, + 0xF0, 0xB1, 0xF6, 0x45, 0x94, 0x49, 0x42, 0xB4, + 0xC2, 0xB6, 0x22, 0x5C, 0x8B, 0x31, 0xE9, 0x89, + 0x54, 0x55, 0x22, 0xBA, 0x6F, 0x10, 0x39, 0x60, + 0x34, 0xCB, 0x1C, 0xA7, 0x45, 0x97, 0x78, 0x44, + 0xD5, 0x70, 0x89, 0x4C, 0x61, 0x1A, 0x56, 0x08, + 0xA7, 0x57, 0x41, 0x6D, 0x6D, 0xE5, 0x99, 0x63, + 0xC3, 0x27, 0x98, 0xC4, 0x93, 0xEF, 0xD2, 0x26, + 0x4C, 0x23, 0x19, 0x10, 0xE9, 0xA3, 0x00, 0x90, + 0xCA, 0x7B, 0x53, 0x84, 0xF2, 0x31, 0xB8, 0x9B, + 0xA6, 0x8A, 0x23, 0x81, 0x90, 0xEF, 0x1A, 0x2A, + 0x43, 0xCB, 0x01, 0x70, 0x34, 0x70, 0xA0, 0xF0, + 0x61, 0xA7, 0x07, 0x38, 0x94, 0x4B, 0xCD, 0x9B, + 0x70, 0x04, 0xF2, 0x47, 0x97, 0xAE, 0xCB, 0x88, + 0xB1, 0x09, 0x1C, 0xFE, 0xD0, 0x59, 0x0B, 0x04, + 0x15, 0x45, 0x3C, 0x39, 0xB6, 0xEC, 0x45, 0xB6, + 0x63, 0x05, 0xFA, 0xEA, 0x6B, 0x55, 0xA4, 0xB7, + 0x96, 0x75, 0x05, 0xFE, 0x38, 0x62, 0xA2, 0x67, + 0xAD, 0xBF, 0xE0, 0x5B, 0x91, 0x81, 0xA0, 0x65, + 0x01, 0x89, 0x33, 0x91, 0x65, 0x0E, 0xAA, 0xA4, + 0xA6, 0xD1, 0x68, 0x53, 0x34, 0x92, 0x76, 0xF9, + 0x8E, 0x0F, 0x44, 0xCD, 0x72, 0x66, 0x15, 0xC6, + 0x1C, 0x16, 0x71, 0x30, 0x94, 0xD8, 0xAB, 0x09, + 0x3C, 0xAC, 0x71, 0xF2, 0x80, 0x3E, 0x7D, 0x39, + 0x10, 0x9E, 0xF5, 0x00, 0x9C, 0x9C, 0x2C, 0xDA, + 0xF7, 0xB7, 0xA6, 0xB3, 0x7A, 0x33, 0xA4, 0x98, + 0x81, 0xF4, 0xBB, 0x5D, 0x72, 0x45, 0xA1, 0x4C, + 0x50, 0x42, 0x28, 0x0C, 0x76, 0xA8, 0x4E, 0x63, + 0xF4, 0x9D, 0x0D, 0x61, 0x9D, 0x46, 0xD7, 0x23, + 0xBA, 0xA7, 0x47, 0xA3, 0xBA, 0x90, 0xA6, 0xFB, + 0x63, 0x7A, 0x9A, 0x1D, 0xC0, 0x22, 0x68, 0xFD, + 0x5C, 0x04, 0x3D, 0x18, 0xCB, 0xA1, 0x52, 0x8A, + 0xC8, 0xE2, 0x25, 0xC1, 0xF9, 0x23, 0xD1, 0xCC, + 0x84, 0xF2, 0xE7, 0x8E, 0x25, 0xDC, 0x3C, 0xCE, + 0x93, 0x53, 0xC9, 0xDA, 0xC2, 0xAD, 0x72, 0x6A, + 0x79, 0xF6, 0x49, 0x40, 0x80, 0x1D, 0xD5, 0x70, + 0x1E, 0xFB, 0xDC, 0xB8, 0x0A, 0x98, 0xA2, 0x59, + 0x93, 0xCD, 0x7F, 0x80, 0x59, 0x13, 0x20, 0xB6, + 0x31, 0x72, 0x71, 0x86, 0x47, 0xB9, 0x76, 0xA9, + 0x8A, 0x77, 0x16, 0x86, 0xF0, 0x12, 0x0A, 0x05, + 0x3B, 0x0C, 0x44, 0x74, 0x60, 0x43, 0x05, 0x89, + 0x0F, 0xEC, 0xAF, 0x23, 0x47, 0x5D, 0xDC, 0xC1, + 0x1B, 0xC0, 0x8A, 0x9C, 0x5F, 0x59, 0x2A, 0xBB, + 0x1A, 0x15, 0x3D, 0xB1, 0xB8, 0x83, 0xC0, 0x50, + 0x7E, 0xB6, 0x8F, 0x78, 0xE0, 0xA1, 0x4D, 0xEB, + 0xBF, 0xEE, 0xC6, 0x21, 0xE1, 0x0A, 0x69, 0xB6, + 0xDA, 0xAF, 0xAA, 0x91, 0x6B, 0x53, 0x95, 0x33, + 0xE5, 0x08, 0x00, 0x7C, 0x41, 0x88, 0xCE, 0x05, + 0xC8, 0x62, 0xD1, 0x01, 0xD4, 0xDB, 0x1D, 0xF3, + 0xC4, 0x50, 0x2B, 0x8C, 0x8A, 0xE1, 0x45, 0x74, + 0x88, 0xA3, 0x6E, 0xAD, 0x26, 0x65, 0xBF, 0xAC, + 0xB3, 0x21, 0x76, 0x02, 0x81, 0xDB, 0x9C, 0xA7, + 0x2C, 0x76, 0x14, 0x36, 0x34, 0x04, 0xA0, 0xA8, + 0xEA, 0xBC, 0x05, 0x8A, 0x23, 0xA3, 0x46, 0x87, + 0x5F, 0xA9, 0x6B, 0xB1, 0x8A, 0xC2, 0xCC, 0xF0, + 0x93, 0xB8, 0xA8, 0x55, 0x67, 0x38, 0x11, 0xCE, + 0xD4, 0x7C, 0xBE, 0x1E, 0xE8, 0x1D, 0x2C, 0xF0, + 0x7E, 0x43, 0xFC, 0x48, 0x72, 0x09, 0x08, 0x53, + 0x74, 0x31, 0x08, 0x86, 0x5F, 0x02, 0xC5, 0x61, + 0x2A, 0xA8, 0x71, 0x66, 0x70, 0x7E, 0xE9, 0x0F, + 0xFD, 0x5B, 0x80, 0x21, 0xF0, 0xAA, 0x01, 0x6E, + 0x5D, 0xBC, 0xD9, 0x1F, 0x57, 0xB3, 0x56, 0x2D, + 0x3A, 0x2B, 0xCF, 0xA2, 0x0A, 0x4C, 0x03, 0x01, + 0x0B, 0x8A, 0xA1, 0x44, 0xE6, 0x48, 0x28, 0x04, + 0xB4, 0x74, 0xFE, 0xC1, 0xF5, 0xE1, 0x38, 0xBE, + 0x63, 0x2A, 0x3B, 0x9C, 0x82, 0x48, 0x3D, 0xC6, + 0x89, 0x0A, 0x13, 0xB1, 0xE8, 0xEE, 0x6A, 0xF7, + 0x14, 0xEC, 0x5E, 0xFA, 0xC3, 0xB1, 0x97, 0x6B, + 0x29, 0xDA, 0xDB, 0x60, 0x5B, 0x14, 0xD3, 0x73, + 0x2B, 0x5D, 0xE1, 0x18, 0x59, 0x65, 0x16, 0x85, + 0x81, 0x17, 0xE2, 0x63, 0x4C, 0x4E, 0xA0, 0xCC + }; + static const byte c_768[KYBER768_CIPHER_TEXT_SIZE] = { + 0xDF, 0xA6, 0xB9, 0xD7, 0x2A, 0x63, 0xB4, 0x20, + 0xB8, 0x9D, 0xDE, 0x50, 0xF7, 0xE0, 0xD5, 0x6E, + 0xCF, 0x87, 0x6B, 0xFE, 0xF9, 0x91, 0xFC, 0xE9, + 0x1C, 0x8D, 0x28, 0x6F, 0xA6, 0xEA, 0xBA, 0xC1, + 0x73, 0x0F, 0xD8, 0x77, 0x41, 0xFE, 0x4A, 0xD7, + 0x17, 0xB2, 0x82, 0xA2, 0x1E, 0x23, 0x5A, 0x55, + 0xC3, 0x75, 0x7D, 0x88, 0xD4, 0xCE, 0x62, 0xF4, + 0x14, 0xEB, 0x77, 0xEB, 0x9D, 0x35, 0x7E, 0xE2, + 0x9D, 0x00, 0x08, 0x7B, 0xF8, 0x11, 0x0E, 0x5B, + 0xBB, 0xC7, 0xC9, 0x04, 0x19, 0x07, 0x2E, 0xAE, + 0x04, 0x4B, 0xF7, 0xE1, 0x83, 0xD4, 0x3A, 0x94, + 0xB2, 0x63, 0x2A, 0xA1, 0x46, 0x49, 0x61, 0x9B, + 0x70, 0x64, 0x95, 0x21, 0xBC, 0x19, 0x37, 0x09, + 0x42, 0xEF, 0x70, 0xF3, 0x6C, 0x34, 0xC8, 0xC2, + 0x35, 0x91, 0xEE, 0x0C, 0xA7, 0x1A, 0x12, 0xD2, + 0x79, 0xE0, 0xF5, 0x2D, 0x39, 0xED, 0x0F, 0x91, + 0x3F, 0x8C, 0x26, 0x26, 0x21, 0xFB, 0x24, 0x2E, + 0x68, 0x0D, 0xEB, 0x30, 0x7B, 0x07, 0x49, 0xC6, + 0xB3, 0x93, 0xA8, 0xEF, 0x66, 0xF8, 0xB0, 0x4A, + 0xAF, 0xA8, 0x77, 0xB9, 0x51, 0xAB, 0x93, 0xF5, + 0x98, 0xB4, 0xB2, 0xFA, 0xB0, 0x4F, 0x88, 0xAC, + 0x80, 0x39, 0x84, 0xFF, 0x37, 0xE3, 0xFE, 0x74, + 0xF3, 0xA6, 0x16, 0xD5, 0x31, 0x4E, 0xB3, 0xA8, + 0x26, 0xF8, 0x74, 0xF8, 0xEC, 0xD3, 0xA5, 0x64, + 0x7D, 0x04, 0x94, 0x2A, 0x57, 0xEF, 0xC0, 0x96, + 0x38, 0x47, 0x0D, 0xC0, 0xA9, 0xDF, 0x40, 0xB3, + 0x17, 0x57, 0x1D, 0x39, 0x84, 0xA7, 0x8C, 0xF7, + 0xD1, 0x17, 0x51, 0x09, 0x07, 0x22, 0xB3, 0x05, + 0x9E, 0x07, 0x59, 0x1C, 0xC4, 0xA2, 0xED, 0x9B, + 0xA0, 0xDC, 0xE9, 0x9B, 0xE9, 0xE5, 0xEE, 0x5D, + 0xB8, 0xD6, 0x98, 0xCD, 0xEB, 0x58, 0x14, 0x75, + 0x9B, 0xA9, 0x77, 0xC9, 0x00, 0x79, 0xCF, 0x2A, + 0xFD, 0xE4, 0x78, 0x06, 0x9C, 0x51, 0x3A, 0x60, + 0x09, 0x1A, 0x3A, 0x5D, 0x01, 0x11, 0xE2, 0x2D, + 0xE0, 0x6C, 0xB1, 0x45, 0xC1, 0x4E, 0x22, 0xA2, + 0x14, 0xCB, 0x27, 0x8C, 0x81, 0x52, 0xB0, 0x68, + 0x1B, 0xCA, 0xFF, 0x54, 0xD5, 0x52, 0xB5, 0x4A, + 0x67, 0x1C, 0x0D, 0xFE, 0xF7, 0x75, 0xE7, 0xC5, + 0x4F, 0xEF, 0xC4, 0x85, 0x38, 0x68, 0xC9, 0x55, + 0x97, 0x1A, 0xBD, 0xAC, 0x2A, 0x76, 0x29, 0x2C, + 0xCC, 0xD4, 0xFD, 0x1C, 0x70, 0x6B, 0x7D, 0x36, + 0x14, 0x15, 0x96, 0x73, 0xE9, 0xD7, 0xB2, 0x9A, + 0x2D, 0x3F, 0x63, 0x36, 0x31, 0x29, 0xE7, 0xA2, + 0x1E, 0x80, 0x3A, 0x46, 0x0F, 0x27, 0x14, 0xE3, + 0xE2, 0x59, 0x22, 0x78, 0x0A, 0xF3, 0x82, 0x57, + 0xCD, 0x14, 0x95, 0xAC, 0xD1, 0xE0, 0x19, 0x80, + 0x63, 0x8D, 0xF5, 0x8A, 0x15, 0x3D, 0xAB, 0x07, + 0xEF, 0xB5, 0xC7, 0xE7, 0x8A, 0xDA, 0xCF, 0x63, + 0x19, 0x56, 0xD6, 0x9C, 0xCD, 0xA0, 0x70, 0x45, + 0x95, 0x68, 0xBD, 0x9D, 0x11, 0xA2, 0x93, 0x4B, + 0xCF, 0x16, 0x43, 0xBC, 0x99, 0x46, 0x82, 0x38, + 0x91, 0x0B, 0x1F, 0x74, 0x2E, 0xBB, 0x3C, 0x03, + 0xD3, 0x9F, 0xD4, 0x5C, 0xFB, 0x85, 0xBA, 0x30, + 0x9E, 0x29, 0xDD, 0x9B, 0x5C, 0xD5, 0x60, 0x81, + 0x9E, 0xC7, 0x29, 0xFC, 0xAC, 0x8B, 0x9D, 0x72, + 0x5E, 0x3E, 0x8A, 0xBE, 0xDE, 0x4B, 0x52, 0x98, + 0xA8, 0x65, 0x8E, 0xE3, 0xF7, 0x81, 0xB0, 0xCE, + 0x68, 0x3C, 0xBB, 0x73, 0x35, 0xCD, 0x57, 0xEF, + 0xE2, 0x20, 0x4A, 0x8F, 0x19, 0x74, 0x46, 0xD7, + 0x31, 0x4C, 0xDB, 0xF4, 0xC5, 0xD0, 0x8C, 0xCC, + 0x41, 0xF8, 0x08, 0x57, 0xCC, 0x95, 0x71, 0xFB, + 0xFB, 0x90, 0x60, 0x60, 0xF7, 0xE1, 0x7C, 0x8C, + 0xEF, 0x0F, 0x27, 0x4A, 0xFF, 0x83, 0xE3, 0x93, + 0xB1, 0x5F, 0x2F, 0x95, 0x89, 0xA1, 0x3A, 0xF4, + 0xBC, 0x78, 0xE1, 0x6C, 0xDD, 0xE6, 0x23, 0x61, + 0xD6, 0x3B, 0x8D, 0xC9, 0x03, 0xB7, 0x0C, 0x01, + 0xA4, 0x34, 0x19, 0xCD, 0x20, 0x52, 0x15, 0x0B, + 0xD2, 0x87, 0x19, 0xF6, 0x1F, 0xF3, 0x1F, 0x4A, + 0x9B, 0xEC, 0x4D, 0xDB, 0xCE, 0xC1, 0xF8, 0xFB, + 0x2E, 0xFB, 0xF3, 0x7D, 0xFF, 0xFA, 0x4C, 0x7F, + 0xEC, 0xA8, 0xCE, 0x6D, 0x62, 0x6B, 0xFD, 0xA1, + 0x6E, 0xE7, 0x08, 0xD9, 0x20, 0x68, 0x14, 0xA2, + 0xEF, 0x98, 0x85, 0x25, 0x61, 0x5D, 0x4A, 0xC9, + 0xBE, 0x60, 0x8C, 0x4B, 0x03, 0xAB, 0xEE, 0x95, + 0xB3, 0x2A, 0x5D, 0xB7, 0x4A, 0x96, 0x11, 0x9A, + 0x7E, 0x15, 0x9A, 0xF9, 0x9C, 0xD9, 0x8E, 0x88, + 0xEA, 0xF0, 0x9F, 0x0D, 0x78, 0x0E, 0x7C, 0x7E, + 0x81, 0x4B, 0x8E, 0x88, 0xB4, 0xF4, 0xE1, 0x5F, + 0xA5, 0x49, 0x95, 0xD0, 0xEC, 0xBA, 0xD3, 0xEF, + 0x04, 0x6A, 0x49, 0x47, 0xF3, 0xE8, 0xB9, 0xE7, + 0x44, 0x24, 0x14, 0x89, 0xB8, 0x06, 0xFE, 0x94, + 0x01, 0xE7, 0x8B, 0xAF, 0xC8, 0xE8, 0x82, 0xE9, + 0xD6, 0xD0, 0x70, 0x0F, 0x72, 0x0C, 0x00, 0x24, + 0xE7, 0xDA, 0x49, 0x06, 0x1C, 0x5D, 0x18, 0xA6, + 0x20, 0x74, 0x04, 0x0A, 0xBC, 0x00, 0x03, 0x20, + 0x0E, 0xD4, 0x65, 0x23, 0x17, 0x97, 0x93, 0x0A, + 0x2E, 0x2A, 0xA5, 0x01, 0xF6, 0x48, 0x62, 0xDD, + 0xA1, 0x30, 0x14, 0xA9, 0x9F, 0x9D, 0x32, 0x70, + 0xAA, 0x90, 0x7E, 0xEB, 0x3F, 0xDB, 0xFF, 0x29, + 0x16, 0x00, 0xDF, 0x1F, 0x6B, 0x39, 0x68, 0x4B, + 0x11, 0xE3, 0x96, 0xB7, 0x0D, 0x86, 0xF9, 0x04, + 0x92, 0xE8, 0x2B, 0x09, 0xBA, 0x25, 0x60, 0x7B, + 0x0C, 0x28, 0x6F, 0xBC, 0x07, 0x01, 0x82, 0xAC, + 0x76, 0xFA, 0x7C, 0x85, 0x9A, 0xAF, 0xEA, 0x87, + 0x01, 0x6A, 0xED, 0x22, 0xC3, 0x60, 0x5A, 0x27, + 0x89, 0xA1, 0xD4, 0x39, 0xFD, 0x8D, 0x93, 0x33, + 0x42, 0xDA, 0xB7, 0x45, 0xA3, 0xE5, 0x50, 0xE7, + 0xD7, 0x7C, 0x01, 0xA6, 0x23, 0x4B, 0xDA, 0x7D, + 0x6B, 0xB1, 0x9D, 0x49, 0x5E, 0x65, 0x60, 0xFC, + 0xE8, 0x39, 0x6F, 0xC3, 0xC6, 0xE0, 0x88, 0xED, + 0x60, 0xF5, 0xF2, 0x77, 0x14, 0x16, 0xEA, 0x3B, + 0xE5, 0xBE, 0x47, 0x2B, 0x64, 0x04, 0x90, 0x6C, + 0x91, 0xE7, 0x1D, 0x9A, 0x86, 0x72, 0xF3, 0x90, + 0x08, 0x36, 0x55, 0xAB, 0x7D, 0x0E, 0xC6, 0xED, + 0xFE, 0x86, 0x78, 0x9C, 0xE2, 0x0B, 0xE2, 0xEA, + 0x90, 0xCA, 0x5C, 0xC3, 0x14, 0x16, 0xFB, 0x24, + 0xCB, 0xAF, 0x94, 0xDA, 0x14, 0x68, 0xFE, 0x69, + 0x6B, 0xCD, 0xF5, 0x24, 0x7C, 0xF1, 0x17, 0xCB, + 0xE9, 0x33, 0x40, 0x76, 0xCA, 0x68, 0x96, 0xB2, + 0xF6, 0xA0, 0x16, 0xB1, 0xF7, 0xC7, 0x37, 0x28, + 0x80, 0x78, 0x98, 0xD8, 0xB1, 0x99, 0x75, 0x6C, + 0x2B, 0x0A, 0xA2, 0x45, 0x7E, 0x1B, 0x4F, 0x77, + 0x54, 0xC4, 0x57, 0x6C, 0xE5, 0x64, 0x56, 0x14, + 0xEA, 0x15, 0xC1, 0xAE, 0x28, 0xB0, 0x94, 0xEB, + 0x21, 0x7C, 0x7A, 0x7A, 0x41, 0x23, 0x95, 0x76, + 0xCB, 0xDA, 0x38, 0x0E, 0xE6, 0x87, 0x83, 0x43, + 0x27, 0x30, 0xAD, 0x5E, 0xBE, 0x7F, 0x51, 0xD6, + 0xBE, 0x7F, 0xB0, 0x2A, 0xB3, 0x7B, 0xE0, 0xC9, + 0x6A, 0xAC, 0x9F, 0x3C, 0x79, 0x0A, 0x18, 0xD1, + 0x59, 0xE6, 0xBA, 0xBA, 0x71, 0xEC, 0x88, 0xC1, + 0x10, 0xFD, 0x84, 0xC3, 0x36, 0xDF, 0x63, 0x0F, + 0x27, 0x1C, 0xF7, 0x93, 0x28, 0xB6, 0xC8, 0x79, + 0xDF, 0x7C, 0xDE, 0x0F, 0x70, 0x71, 0x22, 0x20, + 0xB1, 0xFB, 0xB9, 0xAC, 0xB4, 0x82, 0x48, 0xD9, + 0x1F, 0x0E, 0x2B, 0x6E, 0x3B, 0xE4, 0x0C, 0x2B, + 0x22, 0x1E, 0x62, 0x6E, 0x7E, 0x33, 0x0D, 0x9D, + 0x83, 0xCC, 0x06, 0x68, 0xF7, 0x30, 0x85, 0x91, + 0xE1, 0x4C, 0x7D, 0x72, 0xB8, 0x41, 0xA6, 0xF0, + 0x5F, 0x3F, 0xDC, 0x13, 0x9E, 0xEC, 0xC1, 0x53, + 0x67, 0x65, 0x65, 0x0B, 0x55, 0xA9, 0xCE, 0xC6, + 0xBB, 0xF5, 0x4C, 0xCE, 0xC5, 0xC3, 0xAC, 0x9A, + 0x0E, 0x39, 0xF4, 0x8F, 0x23, 0x7B, 0xD4, 0xC6, + 0x60, 0xCB, 0x1A, 0x8D, 0x25, 0x0B, 0xB6, 0xC8, + 0xC0, 0x10, 0xFE, 0xC3, 0x4C, 0xC3, 0xD9, 0x15, + 0x99, 0x27, 0x1C, 0x75, 0x31, 0x33, 0x0F, 0x12, + 0xA3, 0xE4, 0x4F, 0xAF, 0xD9, 0x05, 0xD2, 0xC6 + }; + static const byte kprime_768[KYBER_SS_SZ] = { + 0xBD, 0x72, 0x56, 0xB2, 0x42, 0xF4, 0x04, 0x86, + 0x9D, 0x66, 0x2F, 0x80, 0xBF, 0x67, 0x7A, 0x16, + 0xC0, 0xC6, 0xFC, 0x15, 0x68, 0xCC, 0xA5, 0xB6, + 0x45, 0x82, 0xA0, 0x1A, 0x6A, 0x14, 0x2D, 0x71 + }; +#endif +#ifndef WOLFSSL_NO_KYBER1024 + static const byte dk_1024[KYBER1024_PRIVATE_KEY_SIZE] = { + 0x0F, 0xEA, 0x26, 0xC4, 0xA5, 0x44, 0xA5, 0x14, + 0x44, 0x4A, 0x97, 0x1B, 0x5C, 0x5A, 0x82, 0x58, + 0x27, 0xC0, 0x9D, 0x42, 0x46, 0x9E, 0x59, 0x34, + 0x4C, 0xF2, 0xAC, 0x06, 0xA2, 0x8D, 0x33, 0xE9, + 0xA0, 0x12, 0xCA, 0xA3, 0x71, 0x7B, 0x2C, 0x3B, + 0x29, 0x0A, 0x07, 0x15, 0x82, 0x11, 0x09, 0xC4, + 0xCC, 0xEA, 0xC4, 0x9F, 0x34, 0x1D, 0xAD, 0xD3, + 0x77, 0xD4, 0x2A, 0x37, 0x26, 0x19, 0x16, 0xAC, + 0x7B, 0xB9, 0xE4, 0x1C, 0x09, 0x6C, 0xA8, 0x18, + 0x1C, 0xF5, 0x83, 0x50, 0x57, 0x3F, 0x60, 0x56, + 0x84, 0xA1, 0xBC, 0xA5, 0x3D, 0x88, 0x25, 0x74, + 0x53, 0xC5, 0x35, 0x16, 0x5C, 0x4E, 0xD7, 0x2A, + 0x9F, 0xF0, 0x56, 0x45, 0x71, 0x29, 0x01, 0xF6, + 0x6C, 0x10, 0xD0, 0x4F, 0x5E, 0xB4, 0xA2, 0xEC, + 0x37, 0x72, 0xE9, 0x49, 0x8E, 0x9D, 0xC4, 0x4B, + 0xBD, 0xAB, 0x71, 0xBB, 0xDB, 0xBC, 0xFC, 0x85, + 0xB8, 0x01, 0x36, 0x30, 0x89, 0xEA, 0x60, 0xEF, + 0xE5, 0x86, 0xE1, 0xE2, 0x18, 0x0C, 0x38, 0xB2, + 0xE7, 0xB4, 0xA6, 0x3E, 0xD6, 0x07, 0x49, 0x0B, + 0xC5, 0xBA, 0x7A, 0x58, 0xAC, 0x3B, 0x1C, 0x0E, + 0x43, 0x96, 0x72, 0x00, 0xC7, 0x98, 0x02, 0x90, + 0xEB, 0xF4, 0x11, 0x82, 0x84, 0x39, 0xEE, 0x8C, + 0x8E, 0x61, 0x29, 0xB2, 0x58, 0xE1, 0x3D, 0x12, + 0x7C, 0xB1, 0x5A, 0x00, 0xCB, 0x7B, 0x46, 0x8D, + 0x40, 0x23, 0xB5, 0x09, 0x7B, 0x9B, 0x2E, 0x50, + 0x9B, 0x50, 0xE8, 0x90, 0xB6, 0x3B, 0x47, 0x07, + 0x48, 0x79, 0x61, 0xA2, 0x9E, 0x18, 0x65, 0x6D, + 0xD2, 0xD0, 0x9E, 0x6A, 0x3B, 0x88, 0x43, 0xE2, + 0x84, 0x3C, 0xB4, 0x85, 0x4F, 0x18, 0x11, 0x6E, + 0x71, 0x7D, 0xDB, 0x03, 0x55, 0xA7, 0x51, 0x35, + 0xB2, 0x02, 0x6A, 0x75, 0x2C, 0x8E, 0x7F, 0xF1, + 0x8E, 0x0F, 0x4A, 0x39, 0x1C, 0xA3, 0x7F, 0x5B, + 0x2B, 0xCC, 0x88, 0xC9, 0x99, 0xB4, 0xE4, 0x77, + 0x50, 0xC4, 0x65, 0x47, 0xEC, 0x07, 0x6A, 0xC2, + 0x15, 0x30, 0x72, 0x2C, 0xFA, 0xF9, 0x67, 0x99, + 0x61, 0xC9, 0x86, 0x88, 0xC3, 0x56, 0x2B, 0x17, + 0xCC, 0x80, 0x81, 0x46, 0xA1, 0x25, 0x72, 0xC9, + 0xB5, 0xFF, 0x15, 0x1A, 0xAB, 0x54, 0x41, 0x09, + 0x01, 0x84, 0x0E, 0x26, 0x42, 0x39, 0x87, 0xC5, + 0xE0, 0xD2, 0x8E, 0xF2, 0xEA, 0x53, 0xEA, 0xE5, + 0x95, 0x1E, 0x62, 0xAC, 0x7B, 0xD5, 0x18, 0xB9, + 0x83, 0x0A, 0x4D, 0xBC, 0xCE, 0x6A, 0x93, 0x65, + 0x91, 0xEA, 0x8E, 0xF2, 0x75, 0x07, 0x8A, 0x09, + 0x73, 0x85, 0x2A, 0x4D, 0x13, 0x04, 0x95, 0xD0, + 0x0B, 0x3F, 0x21, 0x85, 0x15, 0x99, 0x90, 0x1C, + 0xFD, 0xF9, 0x36, 0x83, 0x44, 0xC8, 0x10, 0x42, + 0x2F, 0xFE, 0xA0, 0x8A, 0xED, 0xCB, 0x1A, 0x7F, + 0xD3, 0x62, 0x5F, 0x26, 0xB0, 0x34, 0x81, 0x2F, + 0xA3, 0x07, 0xAB, 0x2C, 0x20, 0x94, 0x54, 0x65, + 0x54, 0x6D, 0x31, 0xA3, 0x41, 0xA4, 0x01, 0x3D, + 0x81, 0x89, 0xB4, 0xF5, 0x0F, 0xE8, 0x60, 0xA6, + 0x68, 0xDA, 0xC7, 0xB1, 0x03, 0x44, 0x1E, 0x96, + 0x1F, 0xCE, 0xB0, 0xC5, 0xB1, 0xF3, 0x4D, 0xF2, + 0xE5, 0x98, 0xC6, 0xD8, 0xCF, 0x60, 0xB8, 0x64, + 0x15, 0x0C, 0x70, 0x3D, 0x2B, 0xBE, 0xAC, 0x9B, + 0x00, 0x1A, 0xA2, 0x10, 0x81, 0x47, 0xAE, 0x6B, + 0x8A, 0xAE, 0x2C, 0x77, 0x91, 0xDB, 0xE9, 0x56, + 0xC1, 0xF9, 0xB2, 0x04, 0x7A, 0x15, 0x76, 0x09, + 0x43, 0x87, 0x06, 0x4C, 0x3A, 0x80, 0x1B, 0x0D, + 0x89, 0xC9, 0x96, 0xA5, 0xCF, 0xA3, 0xB0, 0x12, + 0xC1, 0x44, 0x38, 0xB9, 0xF3, 0x53, 0x0C, 0x0C, + 0x5F, 0xA9, 0x38, 0x9F, 0x10, 0xFB, 0x3E, 0xF1, + 0xE2, 0x01, 0x33, 0x38, 0x41, 0x5F, 0x7B, 0x1D, + 0xB4, 0x11, 0xAD, 0xF9, 0x1C, 0x73, 0xB6, 0x45, + 0x6B, 0x68, 0xAB, 0x7C, 0xFC, 0x7B, 0xC9, 0x29, + 0xE4, 0x4E, 0x58, 0xEB, 0x34, 0xCA, 0x10, 0xAE, + 0x31, 0xF0, 0x3B, 0x2C, 0x3B, 0xA6, 0xCC, 0xA2, + 0x7E, 0xB3, 0x5C, 0xB1, 0x37, 0x9A, 0x13, 0x0A, + 0xAC, 0x87, 0xE3, 0xB8, 0x75, 0xCF, 0xE2, 0x53, + 0xAF, 0x03, 0xC4, 0xBD, 0x78, 0x3F, 0x18, 0xC5, + 0xA2, 0xF8, 0x49, 0x2B, 0xBF, 0x7C, 0x56, 0x87, + 0x55, 0x98, 0xB1, 0xB6, 0x3F, 0xE6, 0xCB, 0x06, + 0x94, 0xD0, 0x48, 0x0C, 0xA1, 0xC8, 0xF8, 0x86, + 0x7C, 0x11, 0xB8, 0xBF, 0x33, 0xA3, 0x2C, 0x20, + 0xB7, 0x9F, 0x9C, 0xA4, 0x86, 0x85, 0x86, 0x10, + 0xB1, 0x97, 0x83, 0xBE, 0xF7, 0x84, 0xBF, 0x6B, + 0x0F, 0x85, 0x8C, 0x1A, 0x79, 0x11, 0x30, 0xDA, + 0x69, 0x57, 0xF2, 0x12, 0x23, 0x4E, 0xC9, 0x86, + 0x79, 0x81, 0x4B, 0xE8, 0x39, 0xBF, 0x11, 0x0B, + 0x45, 0xC1, 0xC8, 0x83, 0xEC, 0xDC, 0x3D, 0xB3, + 0xF8, 0x22, 0xA4, 0xF7, 0xC1, 0x25, 0x56, 0x6E, + 0xD1, 0x66, 0x35, 0x68, 0xC8, 0x41, 0x3C, 0xD0, + 0x1C, 0x22, 0x46, 0x7A, 0xD5, 0x20, 0x1A, 0x0A, + 0xDC, 0x76, 0x34, 0x35, 0xA2, 0xCB, 0x05, 0xCD, + 0xC4, 0x70, 0x72, 0xA9, 0x43, 0x70, 0xF5, 0xB4, + 0x34, 0xF7, 0x5C, 0x07, 0x8B, 0x41, 0x59, 0x93, + 0xE8, 0x54, 0xDD, 0xE1, 0x7B, 0xBF, 0x86, 0xC0, + 0xC6, 0xC9, 0xA3, 0x24, 0x85, 0x32, 0xD9, 0xC2, + 0x13, 0x9E, 0xF3, 0xC7, 0x5A, 0x9B, 0xC6, 0x93, + 0x78, 0x10, 0x60, 0xDC, 0xAE, 0x2F, 0xFA, 0x58, + 0xD9, 0xCC, 0x54, 0x8F, 0x19, 0xC1, 0xCE, 0x53, + 0x64, 0x88, 0x0C, 0x7F, 0xB5, 0x0C, 0xC7, 0xBE, + 0x40, 0x53, 0x12, 0xD6, 0xCC, 0x94, 0x03, 0x76, + 0x18, 0xF3, 0x88, 0xC4, 0x90, 0xAF, 0x8F, 0x61, + 0xB9, 0xB4, 0x04, 0x4C, 0xF7, 0x5A, 0x5C, 0xD7, + 0x1A, 0x15, 0x85, 0x3B, 0x5F, 0xD6, 0x22, 0x4C, + 0x6B, 0x95, 0x90, 0xE5, 0x85, 0x01, 0xD2, 0x81, + 0x42, 0x00, 0xC9, 0x19, 0xF2, 0x83, 0xCC, 0x2B, + 0x49, 0xAD, 0x8B, 0xFA, 0x5B, 0xAA, 0xA2, 0x97, + 0x7F, 0x03, 0x82, 0x3F, 0x60, 0x9E, 0xFB, 0x24, + 0x26, 0xF9, 0x36, 0xC3, 0x02, 0x87, 0x09, 0x7B, + 0xD6, 0xB7, 0xBD, 0xC6, 0x78, 0x62, 0x85, 0x88, + 0x83, 0xDB, 0x59, 0x54, 0x08, 0x04, 0x29, 0xB9, + 0xCD, 0x02, 0xCA, 0x96, 0xBC, 0x1C, 0xCB, 0xDB, + 0x51, 0x21, 0xDF, 0xF8, 0x05, 0xB0, 0x82, 0x4A, + 0xEE, 0x99, 0x9E, 0x2B, 0xBB, 0x2D, 0x82, 0x35, + 0x3E, 0x6D, 0x3A, 0x30, 0x07, 0x92, 0x78, 0x10, + 0x58, 0xC5, 0x6E, 0xF7, 0x09, 0x8A, 0xB3, 0x58, + 0x4E, 0xA0, 0x62, 0x1E, 0x20, 0x33, 0x7D, 0x3A, + 0x97, 0x5D, 0x93, 0xCF, 0x32, 0x58, 0x6D, 0x6A, + 0x71, 0xA2, 0xC4, 0xBB, 0xB2, 0x02, 0xB8, 0x53, + 0xFF, 0x09, 0xC4, 0x07, 0xB4, 0x3B, 0x1C, 0x19, + 0xB1, 0xC4, 0xCC, 0xB8, 0x21, 0x48, 0x2D, 0xDD, + 0x27, 0x37, 0x81, 0x77, 0xAA, 0x7F, 0x61, 0x78, + 0x49, 0x7C, 0x3F, 0xBA, 0x79, 0x71, 0x53, 0x84, + 0x8C, 0x5D, 0x0B, 0x1F, 0x40, 0xB5, 0x4E, 0x9D, + 0x51, 0x93, 0x90, 0x4A, 0x30, 0x3F, 0x72, 0x5F, + 0x0C, 0xCC, 0x66, 0xC6, 0xCC, 0xB1, 0x58, 0x85, + 0x06, 0x05, 0x34, 0x6D, 0xB4, 0x2B, 0x87, 0x7D, + 0xD9, 0xCE, 0xA5, 0xF6, 0x9C, 0x12, 0xB2, 0x21, + 0xC7, 0xEC, 0x51, 0x00, 0xF7, 0x65, 0x87, 0xB9, + 0x83, 0x4B, 0xC0, 0xC6, 0x41, 0x53, 0x8F, 0x83, + 0xE8, 0x5B, 0xB3, 0x09, 0x0D, 0xBA, 0xFB, 0xCB, + 0x0B, 0x71, 0x18, 0xFF, 0x7C, 0x97, 0xE9, 0x52, + 0x63, 0x15, 0x70, 0x41, 0xF8, 0xAC, 0x40, 0x52, + 0xD0, 0x40, 0x35, 0x00, 0xCC, 0x4F, 0x68, 0x94, + 0x55, 0x97, 0x4C, 0xEB, 0x5B, 0x07, 0x67, 0x90, + 0xA0, 0x50, 0xE0, 0xB3, 0xF6, 0x77, 0x2A, 0x77, + 0x67, 0x54, 0x1F, 0xF6, 0xB6, 0x7B, 0x2A, 0x1D, + 0x54, 0x07, 0x82, 0x06, 0x47, 0x68, 0x8F, 0x36, + 0x0A, 0x2B, 0x01, 0x47, 0x37, 0x67, 0x71, 0x29, + 0x09, 0xB2, 0x27, 0x65, 0x8B, 0xE6, 0x45, 0x78, + 0x48, 0xC4, 0x40, 0x75, 0x71, 0x68, 0x06, 0x18, + 0x88, 0x58, 0x9C, 0xB0, 0x5A, 0x99, 0x9E, 0x55, + 0x49, 0x67, 0x91, 0xB1, 0x1A, 0xF2, 0x06, 0x6B, + 0xB8, 0xCA, 0x74, 0x60, 0x51, 0xC4, 0x68, 0x0A, + 0x0B, 0xC0, 0x73, 0x82, 0x41, 0x2A, 0xB8, 0xB8, + 0xA3, 0x19, 0xDB, 0xC7, 0x94, 0xDD, 0xC6, 0x94, + 0xBF, 0xDB, 0x81, 0x3F, 0x80, 0xB5, 0x8B, 0x72, + 0x21, 0x8D, 0xD6, 0x4D, 0xFC, 0xDB, 0xA1, 0xAB, + 0x48, 0xA9, 0x4F, 0x7A, 0x8D, 0xCA, 0x92, 0x66, + 0xCD, 0x15, 0xA4, 0x2D, 0x9B, 0xA5, 0xFB, 0x67, + 0x67, 0xA9, 0x55, 0x52, 0x6C, 0x05, 0x0D, 0xE2, + 0x59, 0x8B, 0x11, 0x2A, 0x2B, 0x10, 0x3A, 0xA2, + 0xD1, 0xF0, 0x60, 0x6F, 0xE6, 0x8A, 0x55, 0x19, + 0x1E, 0xF5, 0x3B, 0x30, 0x2F, 0x7C, 0x19, 0x22, + 0xC3, 0x01, 0xCE, 0xEA, 0x98, 0x9A, 0x62, 0x13, + 0x40, 0x90, 0xA8, 0x60, 0x76, 0x77, 0x6F, 0xA4, + 0x46, 0x27, 0xB7, 0x31, 0x63, 0x86, 0x57, 0x6A, + 0x67, 0x81, 0x75, 0xB2, 0x18, 0xE6, 0xF4, 0x82, + 0xB5, 0x2B, 0xC6, 0x02, 0x7B, 0xBE, 0xB3, 0x46, + 0x98, 0xB9, 0x80, 0x2F, 0xD6, 0x76, 0x34, 0xC1, + 0xA9, 0x4D, 0xD4, 0xC5, 0xCD, 0x49, 0xEC, 0x6E, + 0x2D, 0x66, 0x5F, 0x72, 0x77, 0x81, 0xD1, 0xEC, + 0x10, 0xAA, 0xF6, 0x6A, 0xD8, 0x27, 0x9B, 0x9B, + 0xF2, 0x4C, 0x99, 0xE8, 0x75, 0xEC, 0x94, 0x35, + 0x2D, 0x96, 0x05, 0xFA, 0x30, 0xCB, 0x3D, 0x8B, + 0x26, 0x86, 0xB0, 0x39, 0x71, 0xA7, 0x60, 0xB3, + 0x05, 0x3B, 0x34, 0x34, 0x6D, 0x0D, 0x71, 0xB4, + 0x4D, 0x8B, 0x7D, 0x2E, 0xA6, 0x1A, 0x5C, 0x10, + 0xA9, 0x33, 0xD3, 0x8B, 0xA4, 0x83, 0x36, 0x71, + 0x11, 0x74, 0x54, 0x61, 0x47, 0xD4, 0x4B, 0x29, + 0x14, 0xF8, 0x56, 0x89, 0xD9, 0xC1, 0xBF, 0x00, + 0x37, 0xC7, 0xF7, 0x37, 0x7C, 0xD9, 0x30, 0xCF, + 0xF6, 0x0F, 0x84, 0xB0, 0xA2, 0x00, 0x5D, 0x3E, + 0xFE, 0x55, 0xC7, 0x31, 0x1B, 0x1B, 0x61, 0x32, + 0x76, 0x8B, 0x52, 0x90, 0xD8, 0x36, 0xB8, 0x2B, + 0xC4, 0x43, 0xC3, 0x2B, 0x4F, 0xEC, 0x96, 0x02, + 0x19, 0xDB, 0x21, 0x32, 0xF7, 0x99, 0x0A, 0xD6, + 0x84, 0xA3, 0x72, 0x9F, 0x3D, 0x1A, 0x2C, 0xEA, + 0x3A, 0x1F, 0xE4, 0xB1, 0x26, 0x75, 0xC4, 0x89, + 0xEF, 0x33, 0x19, 0x8F, 0x01, 0xA1, 0x06, 0x80, + 0x6E, 0xFC, 0xE8, 0x92, 0x1D, 0xC4, 0x6E, 0x97, + 0x1C, 0x0A, 0x0A, 0x56, 0x4A, 0xF9, 0xE5, 0x6C, + 0xA7, 0x27, 0xA7, 0x64, 0x1C, 0x56, 0x8C, 0x95, + 0xAA, 0x59, 0x56, 0x91, 0x0B, 0x28, 0x84, 0x29, + 0xF8, 0x0E, 0xE7, 0x22, 0x6E, 0x9D, 0xC4, 0x06, + 0x7E, 0x34, 0x94, 0x4F, 0x06, 0x92, 0x6D, 0x44, + 0xB2, 0xCF, 0x87, 0x64, 0xF7, 0x13, 0x59, 0x3B, + 0x44, 0x29, 0xF8, 0x2B, 0x8F, 0xCC, 0x60, 0x77, + 0x98, 0x91, 0x6B, 0x81, 0x5B, 0x90, 0x98, 0x33, + 0x0E, 0xC3, 0x34, 0x29, 0x0D, 0xB8, 0xC0, 0x4B, + 0x08, 0x3D, 0xF3, 0xCA, 0x10, 0xCE, 0x35, 0x75, + 0x07, 0x30, 0x28, 0xE9, 0x94, 0xA2, 0x5B, 0xE7, + 0x28, 0x78, 0x49, 0x2F, 0xE1, 0xB6, 0x96, 0xBA, + 0x5C, 0xB1, 0xA7, 0x73, 0x19, 0x3A, 0x3B, 0x28, + 0xA4, 0xF4, 0x40, 0xAE, 0x58, 0x2D, 0xC7, 0xC2, + 0x4F, 0xE7, 0x45, 0x1D, 0x66, 0x76, 0x23, 0x2B, + 0xB9, 0x61, 0xC5, 0x04, 0x0C, 0x9E, 0x52, 0x01, + 0xAA, 0xF3, 0xCD, 0x4D, 0xE4, 0x0A, 0xD5, 0xA9, + 0x57, 0x8A, 0xF5, 0x28, 0x10, 0xB5, 0x93, 0xE9, + 0x81, 0x5E, 0x23, 0xF6, 0x3F, 0x56, 0x40, 0x61, + 0xA4, 0x84, 0x07, 0x21, 0x3A, 0xA1, 0xB0, 0x90, + 0x8F, 0x4B, 0x17, 0x4F, 0x86, 0xD5, 0x73, 0xFA, + 0x04, 0x38, 0x64, 0x98, 0xBE, 0x68, 0x39, 0x8E, + 0x8D, 0x72, 0x0D, 0x27, 0x81, 0x11, 0xD8, 0xB1, + 0x73, 0x03, 0x60, 0x2A, 0x96, 0xE3, 0x5F, 0x56, + 0xFB, 0x25, 0x17, 0x3C, 0x4F, 0x4A, 0x03, 0xCA, + 0x2A, 0xC9, 0xBF, 0x79, 0xDC, 0xAB, 0x76, 0x4B, + 0xCE, 0x44, 0x10, 0x40, 0x1E, 0x10, 0x13, 0xE6, + 0x52, 0x8C, 0xCC, 0x51, 0x13, 0x35, 0x85, 0x77, + 0xDA, 0x83, 0x75, 0xE0, 0x23, 0x43, 0x10, 0x8C, + 0x29, 0x24, 0xD2, 0x55, 0x1E, 0x5C, 0xC5, 0xA1, + 0xB0, 0x4D, 0xEF, 0x88, 0x32, 0x4D, 0x85, 0x4F, + 0xC9, 0x2C, 0x4A, 0xDF, 0x7C, 0x23, 0x01, 0x33, + 0x7E, 0x45, 0x20, 0xBF, 0xC3, 0x65, 0x56, 0x6F, + 0x66, 0x09, 0x2E, 0x36, 0x7A, 0xE6, 0x06, 0x12, + 0x74, 0x46, 0x53, 0xC1, 0xEB, 0x47, 0xF0, 0x82, + 0x09, 0x51, 0xA2, 0xA1, 0x4C, 0x42, 0x59, 0x09, + 0x34, 0x0D, 0x87, 0x27, 0x18, 0x8E, 0xAA, 0x08, + 0xE4, 0x86, 0x78, 0x98, 0x48, 0x76, 0xD0, 0x00, + 0x8D, 0xAE, 0x99, 0x01, 0x5B, 0x36, 0x63, 0xFD, + 0xCB, 0x72, 0x57, 0x41, 0x53, 0x0B, 0xC3, 0x89, + 0x5B, 0x11, 0x62, 0x0C, 0xE3, 0xB4, 0x17, 0xA3, + 0x20, 0xE1, 0x88, 0x13, 0xB9, 0x9C, 0x23, 0x5A, + 0xC0, 0x6F, 0x55, 0x60, 0x0F, 0x98, 0x38, 0x82, + 0xBF, 0xF0, 0x02, 0x36, 0x10, 0x7B, 0x50, 0x42, + 0x54, 0x5B, 0x6B, 0x77, 0x58, 0x68, 0xAE, 0xFB, + 0x79, 0xB5, 0x95, 0x59, 0x69, 0x02, 0xC6, 0x9B, + 0x9E, 0xCA, 0x3D, 0x35, 0x8C, 0x61, 0xFE, 0xE0, + 0x36, 0xD2, 0x18, 0xAC, 0x43, 0xBA, 0x3F, 0x52, + 0xC0, 0x6A, 0x8F, 0x88, 0x1A, 0x7E, 0xD7, 0x03, + 0x86, 0x14, 0x2C, 0xBA, 0xC5, 0xCC, 0x04, 0xFC, + 0xC3, 0x1E, 0x16, 0x27, 0x76, 0x51, 0xCE, 0x2D, + 0xCC, 0x50, 0x14, 0xF6, 0xBA, 0x5A, 0x91, 0x5C, + 0x13, 0x38, 0x83, 0x4E, 0xF4, 0x74, 0xB6, 0x71, + 0x59, 0x13, 0xBC, 0x7A, 0x4E, 0x59, 0x3C, 0x68, + 0x87, 0x66, 0xAD, 0xD7, 0x06, 0x98, 0xB3, 0x7E, + 0x06, 0xE5, 0x39, 0x15, 0xF3, 0x85, 0x38, 0x8C, + 0x25, 0xC4, 0x26, 0x5E, 0x1C, 0xB4, 0x4F, 0xE3, + 0xD0, 0x19, 0xD1, 0x21, 0xAE, 0x4C, 0x32, 0x43, + 0x4F, 0x37, 0xB0, 0xA4, 0xCB, 0x69, 0xC7, 0xCC, + 0x95, 0x70, 0x73, 0x50, 0xC3, 0x49, 0x3D, 0x0F, + 0xB1, 0x1C, 0xD4, 0xD0, 0x9F, 0x29, 0xDC, 0x56, + 0xC0, 0x7B, 0xC8, 0xEB, 0x0B, 0xD0, 0x08, 0x2B, + 0x41, 0x44, 0x21, 0x45, 0x66, 0x3C, 0x21, 0xAB, + 0x43, 0x34, 0x67, 0xB9, 0x5E, 0xC2, 0x47, 0x84, + 0x23, 0xC1, 0x8B, 0xF2, 0xEC, 0x70, 0x3E, 0xFB, + 0xA2, 0x8C, 0xDA, 0xBD, 0x42, 0xB7, 0xB8, 0x33, + 0x15, 0x0D, 0x6D, 0xA2, 0x5E, 0xB0, 0x0A, 0x83, + 0x28, 0x90, 0x2E, 0x2D, 0x08, 0x9B, 0x55, 0xD6, + 0x9A, 0xAD, 0x9A, 0x94, 0xD8, 0x18, 0x26, 0x4C, + 0x54, 0xB0, 0x4D, 0x61, 0x4D, 0x14, 0x7A, 0x30, + 0xAB, 0xFC, 0x03, 0xD9, 0x92, 0x9D, 0x96, 0xBA, + 0x7F, 0x81, 0x86, 0x5D, 0xA3, 0x53, 0xC4, 0x54, + 0xBA, 0x7A, 0xA7, 0x88, 0x1A, 0xB9, 0x74, 0xC1, + 0xB8, 0xF0, 0x83, 0x1E, 0x79, 0xC4, 0x41, 0x86, + 0x64, 0xE9, 0x53, 0xA5, 0x4D, 0xE9, 0x32, 0x13, + 0x69, 0x72, 0x81, 0x34, 0x1D, 0x37, 0xF5, 0x08, + 0xE8, 0xCB, 0xAE, 0x3D, 0x81, 0x85, 0x05, 0x45, + 0x67, 0xDE, 0xFC, 0x8E, 0x3B, 0xBC, 0xAA, 0x42, + 0x47, 0x90, 0x7C, 0x48, 0x3B, 0x8F, 0x1B, 0x84, + 0xB3, 0x24, 0xC1, 0xA7, 0xCA, 0x84, 0x42, 0xDB, + 0x6B, 0x7B, 0x12, 0x8C, 0x83, 0x13, 0xBE, 0x1F, + 0xE2, 0x57, 0x91, 0x20, 0x9B, 0x86, 0x4A, 0x3E, + 0x1A, 0x61, 0x8D, 0x56, 0xD7, 0x10, 0xD6, 0xF3, + 0xBF, 0x55, 0x95, 0x10, 0x16, 0x7C, 0x46, 0x4C, + 0x6B, 0x9B, 0x8B, 0xC4, 0x90, 0xB8, 0xE0, 0x39, + 0x25, 0xD0, 0x3D, 0x0E, 0xEB, 0x5D, 0x78, 0x17, + 0x94, 0x28, 0xBB, 0x80, 0xD3, 0xFB, 0x14, 0x88, + 0x40, 0x70, 0x9C, 0x41, 0x14, 0x7A, 0x68, 0x6F, + 0xC9, 0xBC, 0xBD, 0xCD, 0xF7, 0xC7, 0xEA, 0x7C, + 0x30, 0xFB, 0x64, 0x0F, 0xF0, 0x5B, 0x75, 0x39, + 0xAB, 0xAB, 0x70, 0x89, 0x29, 0x08, 0xE9, 0x3C, + 0xC9, 0xC3, 0x47, 0xF8, 0xAC, 0x88, 0x9E, 0x56, + 0x46, 0x8A, 0x13, 0x5B, 0x99, 0x75, 0x47, 0x38, + 0xE1, 0x5F, 0x4E, 0x67, 0x7D, 0xF3, 0x75, 0xBF, + 0x1B, 0x43, 0x60, 0x6A, 0x2C, 0x47, 0x38, 0x0B, + 0x10, 0xA0, 0xC1, 0x4C, 0x28, 0x58, 0x3C, 0x83, + 0x31, 0x1A, 0x28, 0x54, 0xB2, 0xA9, 0x93, 0x1F, + 0xD6, 0x60, 0x86, 0xC1, 0x07, 0x49, 0xF3, 0x34, + 0x57, 0x7F, 0xD7, 0x0B, 0x51, 0xB9, 0x50, 0x60, + 0x07, 0x51, 0x99, 0x31, 0x9B, 0x3F, 0x7C, 0xB5, + 0xB2, 0x37, 0x30, 0x2C, 0x37, 0x0A, 0x23, 0x17, + 0x5E, 0x4E, 0x01, 0x3C, 0x56, 0x28, 0x1B, 0xAF, + 0xE2, 0xBE, 0x9F, 0x82, 0x5A, 0x30, 0x66, 0xAB, + 0x8B, 0xBA, 0x57, 0x93, 0xE2, 0x1E, 0x7A, 0x48, + 0x97, 0x8C, 0xF6, 0x0C, 0x09, 0x1B, 0x1F, 0x80, + 0xC0, 0xC2, 0x38, 0x14, 0xA3, 0x0F, 0x77, 0x60, + 0x60, 0x1A, 0xCE, 0xAB, 0xB1, 0x21, 0x52, 0x00, + 0x94, 0x0F, 0xFA, 0x15, 0x22, 0x72, 0x09, 0x6D, + 0x45, 0x8D, 0x00, 0xDD, 0x03, 0x9F, 0x23, 0x6B, + 0x27, 0x27, 0xB5, 0x88, 0xC6, 0x22, 0x04, 0xE7, + 0x9C, 0x45, 0x16, 0x81, 0xDF, 0xE4, 0x10, 0xEE, + 0xC4, 0x2B, 0x74, 0x94, 0x5A, 0xEC, 0x03, 0x13, + 0xA3, 0x91, 0x94, 0x2A, 0xE1, 0xB1, 0x22, 0x17, + 0x4D, 0xBE, 0x59, 0xAB, 0x1E, 0x39, 0x0C, 0xD6, + 0x49, 0x41, 0x43, 0x6C, 0x75, 0xA9, 0x32, 0x3C, + 0x69, 0xA6, 0x41, 0x88, 0x08, 0x70, 0xFB, 0xB2, + 0x80, 0xB3, 0xB3, 0x7B, 0x3B, 0xD9, 0x82, 0xB8, + 0x29, 0x55, 0x62, 0x0B, 0x07, 0x83, 0xB8, 0x2E, + 0x89, 0x61, 0xA4, 0x04, 0x3B, 0xC7, 0xF6, 0x6C, + 0x0E, 0xF2, 0x5A, 0x5E, 0xD1, 0x53, 0x26, 0xF8, + 0x81, 0x6E, 0x5E, 0xA4, 0x16, 0x7E, 0xE8, 0xBF, + 0x66, 0x66, 0x45, 0x1D, 0x31, 0x5B, 0x2C, 0x75, + 0x14, 0x41, 0x17, 0x2C, 0x27, 0x83, 0x00, 0x26, + 0x82, 0x61, 0xC7, 0x8C, 0x6F, 0x0C, 0x46, 0x56, + 0x27, 0x79, 0xB3, 0xA1, 0x19, 0x6F, 0x87, 0x83, + 0x5F, 0x79, 0xFC, 0xB7, 0xE0, 0xCB, 0xA1, 0x53, + 0x36, 0xCC, 0x83, 0xE1, 0x56, 0xC5, 0x02, 0x28, + 0x87, 0xA8, 0x09, 0x86, 0xB4, 0x9C, 0x1B, 0x57, + 0x65, 0x94, 0xA2, 0x31, 0x42, 0x62, 0x4A, 0xBF, + 0x52, 0x48, 0x22, 0x41, 0x8C, 0x61, 0x01, 0x90, + 0x52, 0x62, 0x80, 0x65, 0x72, 0x49, 0x4D, 0x37, + 0x53, 0xC0, 0x62, 0x81, 0xE7, 0xF1, 0x7E, 0x0D, + 0x79, 0x6C, 0xD7, 0x76, 0x7F, 0xDC, 0xE9, 0x01, + 0xFE, 0x17, 0x12, 0xA0, 0x0A, 0x3D, 0x36, 0xEB, + 0x42, 0x3E, 0x29, 0x86, 0x88, 0x46, 0x93, 0x2A, + 0x94, 0x31, 0xB8, 0xCA, 0x66, 0x0F, 0xC1, 0x97, + 0x5E, 0x23, 0xA7, 0x5B, 0x4A, 0x51, 0xDE, 0x10, + 0x69, 0xD3, 0xA5, 0x9F, 0x6E, 0xEB, 0x2A, 0x5C, + 0xE7, 0x2A, 0x89, 0x16, 0xB5, 0xE8, 0x63, 0x47, + 0x6E, 0x6A, 0xC5, 0x72, 0x92, 0x9F, 0x2C, 0x29, + 0xBC, 0x56, 0x27, 0xBA, 0x99, 0x41, 0x63, 0xCE, + 0xD3, 0x5A, 0xB7, 0x03, 0x1C, 0x00, 0x49, 0x07, + 0x24, 0x55, 0x5A, 0xCD, 0xE6, 0x13, 0xAE, 0xB4, + 0xC3, 0xE9, 0x99, 0x81, 0xC6, 0x2B, 0x5D, 0xC6, + 0xA9, 0xB3, 0x5B, 0xA7, 0x92, 0x20, 0x24, 0x36, + 0x89, 0xE0, 0x59, 0x49, 0x96, 0x85, 0x7C, 0x04, + 0x5D, 0x67, 0x19, 0x3D, 0x9E, 0x41, 0x1B, 0x4F, + 0xF3, 0x9D, 0x0F, 0x8C, 0x3C, 0x0A, 0x70, 0xAD, + 0xB7, 0x2A, 0x70, 0x21, 0xE3, 0x6D, 0x64, 0xFB, + 0x29, 0x4D, 0x93, 0x2B, 0x24, 0xE1, 0xA2, 0xBC, + 0x0B, 0xC4, 0x1C, 0x4A, 0xA3, 0xB5, 0xEC, 0x3C, + 0xF0, 0xE6, 0x72, 0xDE, 0x14, 0x0F, 0x48, 0x47, + 0x33, 0xFD, 0x82, 0xBF, 0x08, 0x29, 0x34, 0xB5, + 0x40, 0xA6, 0x35, 0xC4, 0x48, 0x98, 0xE8, 0xAB, + 0x8E, 0x06, 0x45, 0x70, 0x5A, 0xA5, 0x81, 0x71, + 0x8B, 0x41, 0x32, 0xC4, 0x27, 0x92, 0x7F, 0xAE, + 0x75, 0xBF, 0x96, 0x16, 0xA5, 0x42, 0x4C, 0x20, + 0x20, 0xEB, 0xC5, 0xCF, 0xC1, 0xBC, 0x0E, 0xD1, + 0x65, 0x3A, 0xE5, 0x00, 0x5A, 0x17, 0x54, 0x18, + 0x16, 0x20, 0xB7, 0xF0, 0x6D, 0x71, 0x63, 0x13, + 0x03, 0x3B, 0xB7, 0x2A, 0x40, 0x64, 0x7A, 0xDB, + 0x2E, 0x66, 0x73, 0x70, 0xF2, 0xC7, 0x4F, 0xDB, + 0x94, 0x42, 0x0D, 0xA4, 0x8D, 0xD1, 0x37, 0x9D, + 0xBA, 0x59, 0xAA, 0x22, 0xF8, 0x57, 0xE2, 0x31, + 0xC5, 0xC0, 0x83, 0x29, 0x00, 0x66, 0xC5, 0x48, + 0x76, 0x1B, 0xDF, 0x38, 0x5F, 0x2F, 0x85, 0x81, + 0x7B, 0x21, 0x20, 0x66, 0xD3, 0x9F, 0x03, 0xB7, + 0x7F, 0x8E, 0xF4, 0x12, 0x19, 0xE4, 0xBF, 0xB9, + 0xC1, 0x2E, 0x4F, 0xC9, 0x88, 0x00, 0x57, 0x1D, + 0x22, 0x3A, 0xA9, 0x2A, 0x32, 0xC7, 0xA3, 0xC2, + 0xA7, 0xCF, 0x9C, 0x99, 0x5A, 0xE0, 0xA7, 0xB5, + 0x93, 0x91, 0xFE, 0x9A, 0x4F, 0x0D, 0x63, 0x3B, + 0xFB, 0x79, 0x8C, 0x34, 0xB7, 0x2B, 0xBA, 0x6A, + 0x9F, 0x16, 0xC4, 0x13, 0x2E, 0x88, 0xB5, 0x70, + 0x75, 0x8B, 0xD5, 0x51, 0xC9, 0x1B, 0xD2, 0xAD, + 0xEB, 0x53, 0xA7, 0x2A, 0xC6, 0xAA, 0x03, 0x68, + 0x9D, 0xD6, 0x4B, 0x03, 0x57, 0x09, 0xA8, 0xAF, + 0x46, 0x85, 0x43, 0xCB, 0x17, 0x36, 0xDB, 0xC9, + 0xC7, 0x2B, 0x52, 0x9E, 0x70, 0x59, 0x6D, 0x18, + 0xB1, 0x9C, 0xA6, 0x8E, 0x61, 0x7A, 0x14, 0x7C, + 0x18, 0x9D, 0x28, 0x3A, 0x77, 0x68, 0x8C, 0xAF, + 0x94, 0xDA, 0x5A, 0x0E, 0x9B, 0x63, 0x18, 0x1A, + 0x40, 0xBB, 0xE7, 0xBD, 0x41, 0x68, 0xA2, 0x4D, + 0x27, 0x43, 0x19, 0xA9, 0x93, 0xBC, 0xEA, 0x8A, + 0xBF, 0x50, 0x5F, 0xE8, 0x62, 0x12, 0x96, 0x92, + 0xB5, 0xBD, 0xE8, 0x49, 0xF3, 0x6A, 0xC9, 0x2F, + 0x71, 0x71, 0xE5, 0x38, 0x59, 0x31, 0x36, 0x04, + 0xEA, 0xC1, 0x0B, 0xE2, 0x78, 0x6F, 0xF3, 0x85, + 0xB9, 0xC7, 0x18, 0x15, 0x48, 0x18, 0x77, 0x2F, + 0xA7, 0xB8, 0x99, 0xC0, 0x4E, 0xFD, 0x18, 0xA8, + 0x01, 0x9A, 0x79, 0xB6, 0xF6, 0x4D, 0x5B, 0x9A, + 0x2C, 0x55, 0xE7, 0x84, 0xCB, 0x47, 0xCA, 0x29, + 0x48, 0x56, 0x68, 0x9A, 0xA6, 0xA7, 0x0C, 0xC2, + 0x7B, 0x6C, 0x20, 0xD4, 0xD1, 0xC7, 0x29, 0xC4, + 0x09, 0xD0, 0xB9, 0x25, 0xC4, 0x0C, 0x30, 0xC0, + 0x77, 0x78, 0x15, 0x07, 0x77, 0x49, 0x48, 0x8B, + 0x8D, 0xF0, 0x39, 0x06, 0x95, 0xAB, 0xDB, 0x04, + 0x8C, 0x7C, 0xE1, 0x85, 0x36, 0x02, 0xA5, 0x4D, + 0x15, 0x3C, 0xF2, 0xA5, 0x16, 0x17, 0x84, 0x7B, + 0x11, 0xE6, 0x3C, 0x4C, 0x76, 0x19, 0x66, 0xD5, + 0xAD, 0x93, 0x35, 0x0D, 0xBA, 0xDA, 0x4A, 0x15, + 0xC1, 0x24, 0xBD, 0x80, 0x88, 0x71, 0x99, 0x3F, + 0xC7, 0x75, 0xB6, 0xE4, 0x10, 0xC3, 0x86, 0x59, + 0x0F, 0x73, 0x0A, 0x8E, 0xC9, 0x47, 0x5E, 0xEE, + 0x91, 0x50, 0x39, 0xE9, 0x1B, 0x6F, 0xE4, 0x25, + 0xB9, 0x06, 0x68, 0xC6, 0xAC, 0x52, 0x58, 0xB7, + 0xAF, 0x10, 0x3B, 0x9F, 0x5E, 0x23, 0x0B, 0x71, + 0x9B, 0xBB, 0x09, 0x87, 0x1D, 0xC1, 0x62, 0x15, + 0x17, 0xBA, 0x2A, 0x83, 0x9C, 0x96, 0xAA, 0xA6, + 0x44, 0x0A, 0x87, 0x5E, 0xAC, 0x90, 0xB2, 0x98, + 0xD6, 0x1B, 0xD3, 0xF3, 0xAC, 0x89, 0xB4, 0x05, + 0xDB, 0x39, 0x42, 0x32, 0x68, 0x6A, 0x2B, 0xE0, + 0xF3, 0xC7, 0x5F, 0x15, 0xE6, 0x4E, 0x61, 0xF0, + 0x70, 0x79, 0x1E, 0xB4, 0xBB, 0x97, 0xB7, 0x01, + 0x98, 0x25, 0xF1, 0x17, 0xC7, 0xD7, 0x3A, 0x12, + 0xFD, 0x3D, 0xCC, 0x22, 0xD5, 0x81, 0xB0, 0xE4, + 0x1B, 0x78, 0x63, 0x74, 0xA4, 0x61, 0xEA, 0x0D, + 0x88, 0xDA, 0xA8, 0x9B, 0x65, 0x9F, 0x0D, 0xC8, + 0x24, 0x43, 0x42, 0x35, 0x15, 0xB6, 0x33, 0xB0, + 0x05, 0xC9, 0x58, 0xEC, 0x26, 0x56, 0x1B, 0x6D, + 0xB8, 0x18, 0xF4, 0xB8, 0xCB, 0x2E, 0x28, 0x99, + 0x0E, 0x74, 0x84, 0x17, 0x58, 0x7F, 0xEC, 0x38, + 0xA1, 0x28, 0x4B, 0xBB, 0x4F, 0xF9, 0xE4, 0x78 + }; + static const byte c_1024[KYBER1024_CIPHER_TEXT_SIZE] = { + 0x61, 0xFF, 0x1A, 0x8B, 0x61, 0x17, 0xEF, 0x11, + 0x83, 0x28, 0xE8, 0x8B, 0x32, 0x27, 0x99, 0x30, + 0x14, 0xDC, 0xD0, 0x75, 0xB8, 0xA1, 0xA7, 0xF9, + 0x80, 0x18, 0x93, 0xEE, 0xE6, 0x40, 0x5B, 0xB9, + 0x60, 0xB6, 0xB7, 0xF6, 0xA1, 0xA2, 0x75, 0x18, + 0xA3, 0x40, 0x91, 0x39, 0xA4, 0x8B, 0x85, 0x96, + 0x81, 0xCC, 0x75, 0x8F, 0x2B, 0xCC, 0x3E, 0xEF, + 0xB0, 0x43, 0x94, 0xA3, 0x75, 0xA5, 0xCD, 0x71, + 0x31, 0x64, 0x90, 0x93, 0x8A, 0xBF, 0xD1, 0x94, + 0xB2, 0x0B, 0xCD, 0x31, 0xB3, 0x98, 0x02, 0x61, + 0xC9, 0xED, 0x69, 0xBF, 0x9B, 0x1D, 0x7D, 0x76, + 0x59, 0xA8, 0x04, 0x0D, 0xB1, 0xE2, 0x5D, 0x2B, + 0xA6, 0xF7, 0x03, 0x48, 0x66, 0x24, 0xB7, 0x3C, + 0xAC, 0xDC, 0xA2, 0x7D, 0xB0, 0xF7, 0xE2, 0x40, + 0x8C, 0x94, 0x48, 0xE3, 0x88, 0x73, 0x28, 0x0F, + 0x5E, 0x99, 0x50, 0xD7, 0xCC, 0xE2, 0x52, 0xA6, + 0x47, 0x58, 0x0C, 0x19, 0x90, 0x4F, 0xAD, 0x62, + 0xAE, 0xC3, 0x00, 0xBC, 0x8E, 0x38, 0xF0, 0x59, + 0x48, 0xB6, 0x3B, 0xAD, 0x5C, 0xE7, 0xC9, 0x0E, + 0x40, 0xC4, 0xBC, 0x65, 0x11, 0x77, 0x61, 0xF5, + 0xF8, 0x86, 0x8F, 0x80, 0x25, 0xD6, 0xCE, 0xB2, + 0xC5, 0xDF, 0x60, 0xDE, 0x38, 0xC3, 0x23, 0x29, + 0x22, 0x08, 0x7E, 0xFC, 0xF2, 0xCD, 0x95, 0xDE, + 0x5E, 0x87, 0xB6, 0x88, 0x8B, 0x88, 0xC8, 0x6C, + 0xC7, 0x83, 0x15, 0x58, 0x5B, 0x2C, 0xC6, 0x88, + 0xA7, 0x1B, 0x47, 0x7B, 0xFA, 0x38, 0x8D, 0xC2, + 0x33, 0x4D, 0xFA, 0x8A, 0xA9, 0x55, 0x03, 0xD5, + 0x39, 0x7E, 0x2A, 0xE0, 0x35, 0x29, 0x03, 0xEA, + 0x6A, 0x0A, 0xE8, 0xB6, 0x49, 0xA9, 0x14, 0xB3, + 0x52, 0x5F, 0xE5, 0x8F, 0x56, 0x4B, 0xF1, 0x9C, + 0xC0, 0x9F, 0x54, 0xE1, 0x05, 0xD1, 0x9B, 0xD8, + 0x10, 0x54, 0xE5, 0x70, 0x01, 0xF7, 0x0B, 0xBD, + 0xD7, 0x71, 0x94, 0x49, 0x68, 0x7E, 0x9A, 0x53, + 0xB1, 0x6C, 0xA5, 0x36, 0x6A, 0x19, 0x10, 0x5A, + 0x8B, 0xA0, 0x85, 0x89, 0xAD, 0x08, 0xDF, 0x13, + 0x00, 0xEF, 0x4F, 0x92, 0x3B, 0xA9, 0xE7, 0x62, + 0xA8, 0x2F, 0xB0, 0x9B, 0x76, 0xE1, 0x25, 0xF2, + 0xF2, 0x74, 0xD6, 0x17, 0xBF, 0x30, 0xEA, 0xB4, + 0x65, 0xEC, 0xF2, 0x4D, 0x37, 0x07, 0xAD, 0x30, + 0x0D, 0x9A, 0xFC, 0x1C, 0xF1, 0xDC, 0x40, 0xEE, + 0x7D, 0x4E, 0xEA, 0x6D, 0x15, 0x0E, 0x6F, 0x0A, + 0x31, 0xDB, 0x9F, 0x8F, 0x92, 0xBA, 0x8E, 0xEE, + 0xB3, 0x5D, 0x74, 0x45, 0x58, 0x9B, 0x04, 0x6B, + 0xA7, 0x9E, 0xFE, 0x23, 0x11, 0x06, 0xCF, 0x0A, + 0x75, 0x71, 0x2A, 0xB3, 0x92, 0x72, 0x4C, 0x53, + 0xEF, 0xF9, 0xF5, 0x73, 0x3B, 0xEE, 0x0D, 0x6A, + 0x44, 0xD0, 0xB6, 0xF5, 0x15, 0xD0, 0xF5, 0xE4, + 0x0B, 0x1B, 0x1E, 0x17, 0xE6, 0x7A, 0xED, 0x3C, + 0x81, 0xD0, 0x0A, 0xC4, 0x68, 0xA2, 0x8F, 0x84, + 0x53, 0xD4, 0xB0, 0xDA, 0x80, 0x9E, 0x57, 0xD8, + 0x23, 0xF2, 0x8D, 0x61, 0xED, 0x0B, 0x59, 0xA0, + 0x8C, 0x62, 0x29, 0x72, 0xD9, 0x91, 0x79, 0xDA, + 0x86, 0x36, 0xC4, 0x5F, 0x1C, 0xE8, 0xF6, 0x25, + 0x2A, 0xC8, 0x6D, 0x91, 0xB5, 0xE9, 0x29, 0x97, + 0x01, 0x4E, 0x3F, 0x50, 0x89, 0xE6, 0x8B, 0xC5, + 0x2C, 0xED, 0x5D, 0xAE, 0x6D, 0x5B, 0x17, 0x5F, + 0xE2, 0xD6, 0x19, 0x28, 0x46, 0x50, 0x59, 0x72, + 0x4C, 0x83, 0x59, 0x02, 0xD7, 0x61, 0x2C, 0xDB, + 0x69, 0xCD, 0xAC, 0x66, 0x4F, 0xC1, 0xC9, 0xCB, + 0x11, 0x20, 0x3A, 0x8C, 0x7B, 0x71, 0x48, 0x6E, + 0x97, 0xB7, 0xD1, 0xBC, 0x6A, 0x98, 0xF4, 0x93, + 0xDC, 0xBE, 0xC8, 0xE6, 0x29, 0x55, 0x8E, 0xD3, + 0x61, 0x09, 0x12, 0x93, 0xD1, 0xB5, 0xD2, 0x09, + 0x6C, 0xEB, 0x9F, 0xC7, 0xAF, 0xEE, 0x71, 0xDB, + 0x7C, 0xCF, 0xE4, 0x82, 0xB6, 0x8A, 0x19, 0x64, + 0x29, 0xFF, 0x04, 0xD1, 0x59, 0x03, 0xE7, 0xA7, + 0x5C, 0x7B, 0xB5, 0xF6, 0x22, 0xC3, 0x69, 0x71, + 0x69, 0x45, 0x59, 0xFF, 0x07, 0xDF, 0xAA, 0x79, + 0xE4, 0x1C, 0x36, 0x2B, 0x22, 0x64, 0x3C, 0xD3, + 0x9B, 0xD9, 0xE1, 0xD3, 0xD6, 0xC2, 0xA3, 0x06, + 0xB5, 0xF1, 0x10, 0x2C, 0x26, 0x6E, 0xEE, 0x67, + 0xDC, 0xDA, 0xCF, 0x36, 0x69, 0x7A, 0x83, 0x6F, + 0x20, 0x38, 0x38, 0xEC, 0x11, 0x03, 0x08, 0xC9, + 0x0A, 0x3D, 0x01, 0x57, 0x0C, 0xB3, 0x66, 0x8A, + 0xBA, 0x50, 0x34, 0x0E, 0x40, 0xF5, 0x4C, 0xFA, + 0x6A, 0x9E, 0x88, 0x62, 0x53, 0x2F, 0x5F, 0x19, + 0x84, 0x8A, 0xA1, 0x1F, 0xD3, 0x4F, 0xC8, 0x6B, + 0x7F, 0xCB, 0x16, 0x37, 0xF4, 0xE5, 0xA1, 0xD0, + 0x3A, 0xFC, 0xE4, 0x41, 0x24, 0xE4, 0xE4, 0x60, + 0xB8, 0x4C, 0x63, 0x49, 0x6A, 0xDE, 0xD5, 0x58, + 0x01, 0xDF, 0x25, 0x17, 0xA9, 0x0A, 0xB0, 0x61, + 0xC8, 0xE6, 0x3A, 0xB6, 0xB1, 0x4B, 0xE1, 0x69, + 0x4D, 0x6F, 0x38, 0x9D, 0xD8, 0x5F, 0x56, 0x39, + 0xC5, 0x78, 0x3A, 0xFC, 0xA0, 0x14, 0x6E, 0x6A, + 0x1E, 0xB0, 0xC4, 0x05, 0x63, 0xC1, 0x37, 0x01, + 0x0D, 0xB6, 0x0B, 0xBC, 0x3D, 0x63, 0x74, 0xD6, + 0xF3, 0xA8, 0x92, 0xDE, 0xBC, 0x06, 0x47, 0x01, + 0xC6, 0x4B, 0xEC, 0xCB, 0x8E, 0x2C, 0x33, 0xB7, + 0x40, 0xCC, 0x7E, 0xD4, 0x9D, 0x10, 0x8A, 0x8C, + 0x46, 0x56, 0x81, 0x8D, 0xF5, 0xF7, 0xD9, 0x1E, + 0xAA, 0xA4, 0x46, 0xAC, 0x6C, 0xCD, 0xE3, 0x0C, + 0x6D, 0x3D, 0x1B, 0xF6, 0x6E, 0x4E, 0x3B, 0x7B, + 0x6B, 0x81, 0xE3, 0xCB, 0x17, 0x22, 0x7F, 0x80, + 0xDB, 0x00, 0x96, 0xE6, 0xBE, 0x7D, 0x85, 0x9C, + 0x09, 0x71, 0x37, 0x49, 0xFC, 0xA2, 0x15, 0x30, + 0xFE, 0x1A, 0x71, 0x6E, 0xBE, 0x32, 0x55, 0x04, + 0x31, 0x9B, 0xD0, 0xEA, 0x2A, 0x7D, 0x77, 0x13, + 0x60, 0x7C, 0xB6, 0x79, 0xB0, 0xA0, 0xB2, 0x26, + 0x8D, 0x49, 0x3B, 0x67, 0xC0, 0x48, 0x18, 0x72, + 0x17, 0x7F, 0xFD, 0x25, 0x93, 0xF3, 0xAC, 0xF6, + 0x91, 0xCE, 0xE9, 0x9A, 0x36, 0xEC, 0xA7, 0x22, + 0x57, 0x9E, 0xFA, 0xA5, 0x9A, 0xCC, 0x59, 0xEF, + 0x8C, 0xEA, 0x91, 0x08, 0xE6, 0x20, 0xB0, 0x60, + 0x56, 0xC1, 0x9D, 0x3C, 0x1E, 0xB9, 0x1E, 0x86, + 0x34, 0xDE, 0x49, 0x57, 0x70, 0x6D, 0xFA, 0x8F, + 0x9D, 0x0A, 0x9E, 0x0C, 0xD4, 0x09, 0x4F, 0x6B, + 0x95, 0xA8, 0x3F, 0x11, 0x8A, 0x51, 0x3E, 0xBF, + 0xE5, 0xE9, 0x9A, 0xEB, 0x88, 0xA2, 0x68, 0xE0, + 0x09, 0x7F, 0xCC, 0x3C, 0x7A, 0xE2, 0x50, 0xB6, + 0x81, 0x93, 0x3B, 0xBC, 0x2A, 0x8F, 0x53, 0x81, + 0xF9, 0x4D, 0x15, 0x64, 0x34, 0xA8, 0x7E, 0x9E, + 0xE3, 0x7E, 0x78, 0xC2, 0x7A, 0x0C, 0xDA, 0xEE, + 0xA9, 0x81, 0x4B, 0xCB, 0x43, 0xDF, 0x53, 0x8D, + 0xBE, 0x62, 0x8C, 0x80, 0x2C, 0x1A, 0x94, 0xE0, + 0xCD, 0xDC, 0xD0, 0xCD, 0x5A, 0x0F, 0x82, 0x20, + 0xDA, 0x97, 0xC2, 0x38, 0x39, 0x36, 0xA3, 0x39, + 0x19, 0xFC, 0xDC, 0x11, 0xD7, 0x0E, 0xD4, 0x43, + 0x7D, 0xD2, 0xD7, 0xC7, 0x3C, 0xD0, 0xC3, 0xBB, + 0x90, 0xCA, 0x70, 0x70, 0x22, 0x8F, 0xE8, 0xD6, + 0x4A, 0x1C, 0x9D, 0x56, 0xE6, 0xB3, 0x48, 0x30, + 0xEF, 0x30, 0x0B, 0x5A, 0xA6, 0xEC, 0x6C, 0x78, + 0xA5, 0x42, 0x5A, 0xE6, 0xF7, 0xAD, 0x0E, 0xFD, + 0xD5, 0x27, 0xCF, 0x0A, 0xF8, 0xE0, 0x9B, 0x56, + 0xE4, 0x95, 0xBE, 0x66, 0xF6, 0x65, 0xC6, 0x4B, + 0x0A, 0x42, 0xC5, 0xC4, 0xB2, 0x46, 0x80, 0x48, + 0x0A, 0xD2, 0xE5, 0xC1, 0x1D, 0x99, 0x1F, 0x7E, + 0x3D, 0xA7, 0x59, 0xAE, 0xC8, 0x02, 0xF1, 0x76, + 0xDD, 0xF1, 0x1E, 0xF7, 0x14, 0x69, 0xDC, 0x13, + 0xB3, 0xA3, 0xE0, 0x36, 0x99, 0x51, 0x98, 0x58, + 0xAC, 0x6F, 0xC6, 0x5C, 0x27, 0xFA, 0x4C, 0xEF, + 0xDA, 0x09, 0xC8, 0x2E, 0x8F, 0x95, 0x8E, 0x01, + 0x8D, 0xD5, 0x25, 0x5C, 0xA2, 0xF6, 0x28, 0xE0, + 0xDA, 0x73, 0x91, 0xAB, 0xED, 0x6D, 0x37, 0x70, + 0x55, 0x28, 0xAB, 0x22, 0xEC, 0x71, 0xDC, 0x88, + 0x36, 0xD7, 0xFD, 0x46, 0x45, 0x94, 0x47, 0x03, + 0xA5, 0x1C, 0xC7, 0x4D, 0x29, 0x70, 0x92, 0xFC, + 0xE1, 0x39, 0xE8, 0x97, 0x6F, 0x8B, 0xE9, 0xC5, + 0xF8, 0x63, 0x90, 0xB7, 0x4D, 0x40, 0x1A, 0x8C, + 0x81, 0x53, 0x11, 0x22, 0x01, 0x13, 0x3D, 0x0C, + 0x51, 0x7C, 0x6C, 0xE7, 0xA3, 0x8C, 0x08, 0x60, + 0x69, 0xCE, 0x39, 0x71, 0xF1, 0xAD, 0x28, 0xF3, + 0xE5, 0xD0, 0x1B, 0x56, 0xA4, 0x80, 0xB4, 0x17, + 0xA0, 0x16, 0xAE, 0xA4, 0x63, 0x94, 0xCD, 0xF7, + 0x64, 0x81, 0x29, 0x18, 0xD8, 0xAB, 0x05, 0x01, + 0xD5, 0xD1, 0x8C, 0xE1, 0x3F, 0xBD, 0x3D, 0xE9, + 0x1F, 0x50, 0x42, 0x15, 0xCC, 0xD0, 0xE2, 0xD1, + 0x7B, 0x7E, 0x96, 0x3C, 0x86, 0x7F, 0x6F, 0x13, + 0x21, 0x14, 0xE3, 0x64, 0x59, 0xFC, 0x5A, 0xF7, + 0xCE, 0xE9, 0x9B, 0x78, 0x96, 0x73, 0xE5, 0x24, + 0x13, 0x1F, 0x7D, 0xC7, 0x13, 0x60, 0x95, 0x1A, + 0x99, 0x7A, 0x9C, 0xE5, 0x0D, 0xD5, 0xFA, 0xFC, + 0x45, 0x21, 0x14, 0x44, 0x41, 0xC0, 0x6B, 0xB4, + 0x1C, 0x79, 0xE8, 0xED, 0x53, 0x28, 0x5D, 0x13, + 0x7D, 0x54, 0xF3, 0x25, 0xA6, 0xC2, 0xF2, 0xEF, + 0x74, 0xE3, 0x4C, 0x0F, 0x87, 0x7A, 0x61, 0x4C, + 0xE4, 0x5D, 0xC0, 0xAE, 0xDD, 0xF9, 0x5A, 0x0E, + 0x2E, 0x4E, 0xDA, 0xE2, 0x9A, 0xF4, 0x11, 0xC9, + 0xCC, 0x2A, 0xF9, 0x5C, 0x9E, 0xA9, 0xA9, 0x4A, + 0x79, 0x61, 0xC8, 0x24, 0x6E, 0x65, 0x4F, 0xA2, + 0x8F, 0x3D, 0x56, 0x8D, 0x5F, 0xEE, 0x93, 0x35, + 0x2C, 0x2E, 0x0D, 0x60, 0xCC, 0xAF, 0x5B, 0x00, + 0x09, 0x0A, 0xB6, 0xE7, 0xA5, 0x3A, 0xA0, 0x6A, + 0x8C, 0xD3, 0x73, 0x7E, 0xBF, 0x1B, 0x65, 0xD6, + 0x25, 0xBC, 0xF2, 0x20, 0xF7, 0x4D, 0xE2, 0x2D, + 0x98, 0x71, 0xEF, 0xC3, 0x76, 0xBF, 0x08, 0x2D, + 0x4B, 0x87, 0x2A, 0x30, 0x3C, 0x32, 0x42, 0x7A, + 0x0C, 0x98, 0xBE, 0xCF, 0x58, 0x95, 0x9C, 0x9F, + 0x9E, 0x2E, 0x88, 0x7D, 0xBC, 0x42, 0xAA, 0xB1, + 0x65, 0x6A, 0xD1, 0x56, 0x37, 0xA6, 0xA8, 0xF4, + 0xBF, 0x96, 0x34, 0x09, 0x54, 0x91, 0xF8, 0xC9, + 0x92, 0x42, 0x91, 0x38, 0x91, 0x43, 0x7E, 0x6C, + 0x5B, 0x50, 0xA2, 0x13, 0xDD, 0xE8, 0x0D, 0x21, + 0x96, 0xBE, 0x12, 0xC3, 0x93, 0x7F, 0xE3, 0x23, + 0x9B, 0xF6, 0x75, 0x9A, 0xBB, 0x8C, 0x1C, 0x94, + 0x66, 0xF4, 0x2F, 0xBD, 0x53, 0x89, 0x4A, 0xE5, + 0x2F, 0xB5, 0x33, 0x32, 0x14, 0x29, 0xFC, 0xE4, + 0xFE, 0xC1, 0xDB, 0x35, 0x2C, 0x49, 0x58, 0x3A, + 0x7D, 0x81, 0x7E, 0xAF, 0x62, 0x00, 0x08, 0x88, + 0xEC, 0xB0, 0xEB, 0xFF, 0xEF, 0x69, 0xFF, 0x8E, + 0x59, 0x0C, 0xFA, 0x25, 0xBE, 0xAB, 0x21, 0x60, + 0x5B, 0x63, 0x5A, 0xBC, 0x2C, 0xA2, 0x36, 0x80, + 0x78, 0x97, 0x25, 0xCF, 0x70, 0x0F, 0x55, 0x3C, + 0x88, 0x35, 0x2F, 0x31, 0x61, 0x61, 0x54, 0x87, + 0x3D, 0x18, 0xB6, 0xC6, 0xEB, 0x51, 0x9F, 0xC6, + 0x39, 0xB0, 0x70, 0xFD, 0x67, 0xF8, 0x6A, 0xAB, + 0x62, 0x34, 0x9D, 0xBF, 0xFA, 0x89, 0xF9, 0x30, + 0x51, 0xA7, 0xC7, 0xB7, 0xBD, 0x16, 0x1F, 0xCD, + 0x73, 0x67, 0x2C, 0xEE, 0xF5, 0x9A, 0x9B, 0xB7, + 0xF5, 0x71, 0xEA, 0xBE, 0x25, 0x70, 0xC5, 0xBF, + 0x31, 0xEC, 0xAA, 0x1F, 0x9C, 0xA7, 0xA9, 0xC6, + 0xD3, 0x1E, 0xA5, 0xFB, 0x7C, 0x97, 0x9C, 0xDD, + 0x26, 0x13, 0x89, 0x7E, 0x7D, 0x15, 0x03, 0xFB, + 0x0C, 0x19, 0xAD, 0xDC, 0xFB, 0x3A, 0x63, 0xE2, + 0x18, 0x5F, 0xC4, 0x10, 0x18, 0x38, 0xDA, 0x66, + 0xCC, 0xE2, 0xD3, 0xD9, 0xFF, 0xB4, 0x77, 0x46, + 0xC2, 0x00, 0x3E, 0xDD, 0x86, 0xC2, 0xF8, 0xC3 + }; + static const byte kprime_1024[KYBER_SS_SZ] = { + 0xC6, 0x1F, 0x73, 0xD2, 0xBF, 0xB1, 0x85, 0x94, + 0xE1, 0xBA, 0x5D, 0x3B, 0x58, 0xB4, 0xC9, 0x34, + 0x20, 0x6D, 0x3A, 0x6F, 0x8E, 0xC9, 0x13, 0x95, + 0xAB, 0x77, 0x79, 0xC6, 0x1F, 0xA1, 0xDD, 0x6F + }; +#endif + static byte ss[KYBER_SS_SZ]; + + key = (KyberKey*)XMALLOC(sizeof(KyberKey), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + if (key != NULL) { + XMEMSET(key, 0, sizeof(KyberKey)); + } + +#ifndef WOLFSSL_NO_KYBER512 + ExpectIntEQ(wc_KyberKey_Init(KYBER512, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_DecodePrivateKey(key, dk_512, sizeof(dk_512)), 0); + ExpectIntEQ(wc_KyberKey_Decapsulate(key, ss, c_512, sizeof(c_512)), 0); + ExpectIntEQ(XMEMCMP(ss, kprime_512, KYBER_SS_SZ), 0); + wc_KyberKey_Free(key); +#endif +#ifndef WOLFSSL_NO_KYBER768 + ExpectIntEQ(wc_KyberKey_Init(KYBER768, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_DecodePrivateKey(key, dk_768, sizeof(dk_768)), 0); + ExpectIntEQ(wc_KyberKey_Decapsulate(key, ss, c_768, sizeof(c_768)), 0); + ExpectIntEQ(XMEMCMP(ss, kprime_768, KYBER_SS_SZ), 0); + wc_KyberKey_Free(key); +#endif +#ifndef WOLFSSL_NO_KYBER1024 + ExpectIntEQ(wc_KyberKey_Init(KYBER1024, key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_KyberKey_DecodePrivateKey(key, dk_1024, sizeof(dk_1024)), 0); + ExpectIntEQ(wc_KyberKey_Decapsulate(key, ss, c_1024, sizeof(c_1024)), 0); + ExpectIntEQ(XMEMCMP(ss, kprime_1024, KYBER_SS_SZ), 0); + wc_KyberKey_Free(key); +#endif + + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && !defined(WOLFSSL_NO_ML_DSA_44) +static const byte ml_dsa_44_pub_key[] = { + 0xf1, 0xdf, 0x1e, 0xfc, 0x6b, 0x41, 0xe7, + 0x5e, 0xcb, 0xb5, 0xb5, 0xd2, 0x3c, 0xc8, + 0xd3, 0x99, 0x73, 0x36, 0x9a, 0x0b, 0x32, + 0x71, 0x7a, 0x9f, 0x6d, 0x66, 0x07, 0xb8, + 0x31, 0x5f, 0x25, 0xb6, 0x2e, 0xee, 0x4f, + 0x63, 0x13, 0x02, 0x45, 0x3c, 0xd1, 0x3d, + 0x79, 0x6b, 0x3c, 0xfe, 0xd9, 0x2f, 0x39, + 0xe8, 0x62, 0x60, 0xf0, 0x04, 0x83, 0x28, + 0xaa, 0xdc, 0x15, 0x90, 0xef, 0x55, 0x48, + 0xf9, 0xd2, 0xcd, 0x53, 0x87, 0x0e, 0x42, + 0xba, 0x16, 0x87, 0x7b, 0x32, 0xa8, 0xbf, + 0xed, 0x32, 0xa1, 0x19, 0x66, 0x44, 0xfe, + 0x57, 0xec, 0x26, 0xed, 0x9e, 0x73, 0xa0, + 0x87, 0xe8, 0x8a, 0x93, 0x3c, 0xec, 0x1d, + 0xa0, 0xcc, 0x2e, 0x0d, 0x37, 0x5b, 0xb1, + 0x74, 0x77, 0x18, 0x4b, 0xde, 0x4b, 0xc9, + 0xac, 0xf8, 0xda, 0x23, 0x7a, 0x2a, 0x39, + 0xfa, 0x96, 0x01, 0xff, 0xf0, 0xc7, 0xa7, + 0x34, 0xca, 0x9d, 0xe9, 0xda, 0x4d, 0x85, + 0x00, 0xc9, 0xe9, 0xcf, 0xb0, 0x3e, 0x21, + 0xe6, 0xae, 0x52, 0x67, 0x4f, 0xe3, 0x93, + 0x2f, 0x50, 0x47, 0xdd, 0x89, 0xa2, 0x48, + 0xf8, 0xfe, 0x93, 0xfe, 0xce, 0x68, 0x9c, + 0xe9, 0x4d, 0xdd, 0xbd, 0x9f, 0xeb, 0x14, + 0x8d, 0x38, 0x7a, 0xc6, 0xf2, 0x50, 0x00, + 0x91, 0x65, 0xd0, 0xd1, 0xeb, 0x51, 0xab, + 0x3a, 0x0e, 0x45, 0x5c, 0xbd, 0x65, 0xf5, + 0x78, 0xc6, 0xa0, 0xaa, 0xae, 0x50, 0xf2, + 0x19, 0x1f, 0x90, 0x1a, 0x9f, 0x34, 0xa0, + 0xa1, 0x95, 0x94, 0x86, 0x30, 0xc2, 0xb2, + 0x95, 0x82, 0x13, 0xf6, 0x73, 0xe2, 0x03, + 0xe3, 0x7c, 0x09, 0x8e, 0x5d, 0x07, 0xd6, + 0x33, 0x93, 0x8a, 0x1b, 0x67, 0xc9, 0xb1, + 0x76, 0x74, 0x1c, 0x22, 0x58, 0x05, 0x5a, + 0xa8, 0x83, 0x68, 0xce, 0x64, 0xfc, 0x52, + 0x7f, 0x35, 0x80, 0x6e, 0xdf, 0xf5, 0x2d, + 0xd2, 0xd1, 0x17, 0xdc, 0xce, 0x95, 0xe8, + 0xe6, 0x42, 0xb1, 0xb1, 0x61, 0xc1, 0x24, + 0x79, 0x1c, 0x51, 0xfc, 0x3c, 0xba, 0x40, + 0xf7, 0x70, 0x35, 0x22, 0x73, 0x31, 0x53, + 0x21, 0xea, 0x09, 0xf7, 0xaa, 0x07, 0xb8, + 0xfa, 0x0b, 0xa0, 0xa9, 0xb4, 0x8c, 0x83, + 0xbb, 0x25, 0xfe, 0x39, 0x29, 0xef, 0x34, + 0xd5, 0xe2, 0xc7, 0x9e, 0x87, 0xbd, 0x50, + 0x86, 0x71, 0x12, 0x3e, 0x8a, 0x78, 0xe2, + 0xb3, 0xe1, 0xfa, 0x5b, 0x73, 0x3b, 0x34, + 0x9f, 0x4e, 0x7d, 0xd5, 0x1b, 0xb9, 0x8e, + 0x43, 0x76, 0xef, 0x3e, 0x37, 0x70, 0x33, + 0x36, 0xd1, 0xa1, 0xba, 0x1b, 0xb1, 0x79, + 0xfb, 0x2c, 0xb1, 0x9b, 0xc3, 0x1b, 0x26, + 0x83, 0x89, 0x4d, 0x53, 0x40, 0xa5, 0xf9, + 0x8b, 0xe2, 0xec, 0x30, 0x1f, 0xf6, 0x16, + 0xd6, 0x55, 0xce, 0x0e, 0x1b, 0xed, 0xe0, + 0xeb, 0xc9, 0x7a, 0x2e, 0x1a, 0x85, 0x81, + 0xa4, 0xe2, 0xa8, 0xbe, 0x9f, 0xac, 0x0b, + 0x23, 0xb4, 0xbb, 0xc2, 0x0f, 0x66, 0x43, + 0x45, 0x93, 0x20, 0x37, 0x4d, 0x47, 0x23, + 0x7f, 0x4a, 0x5e, 0x8b, 0x19, 0xec, 0xd9, + 0x57, 0x69, 0xc4, 0x91, 0xb0, 0xcd, 0x25, + 0x2a, 0x7d, 0x52, 0xdb, 0x59, 0x18, 0x8b, + 0x96, 0xad, 0x75, 0x21, 0x81, 0x1a, 0x2c, + 0xb3, 0x26, 0x30, 0x78, 0x19, 0x2b, 0x22, + 0x74, 0x6e, 0x92, 0x57, 0xec, 0x3c, 0x75, + 0x8b, 0xd8, 0x4b, 0x7c, 0xd1, 0x72, 0x1b, + 0x1f, 0xed, 0xae, 0x15, 0x82, 0xd3, 0xf6, + 0xaf, 0x01, 0x31, 0xec, 0x1b, 0xca, 0xa5, + 0xf8, 0x78, 0x7f, 0x8a, 0x8a, 0x03, 0xbd, + 0x03, 0x0a, 0xc5, 0x4e, 0x15, 0xab, 0xa4, + 0x76, 0x56, 0x5b, 0xf8, 0x50, 0xa9, 0xee, + 0x61, 0xbd, 0x05, 0xe0, 0xdf, 0xc6, 0xbe, + 0x4a, 0xaf, 0xdb, 0x96, 0x0a, 0x7e, 0xcb, + 0x2e, 0xb0, 0x68, 0x4e, 0x2d, 0x88, 0x32, + 0x1e, 0xe1, 0xbc, 0x08, 0x15, 0x15, 0x71, + 0xe6, 0x77, 0x2b, 0xeb, 0x47, 0x81, 0xb7, + 0xe8, 0x82, 0x9f, 0x5f, 0x94, 0xd2, 0xac, + 0xa5, 0x89, 0x52, 0xe1, 0x3c, 0x59, 0xe0, + 0x06, 0xe6, 0x66, 0xe1, 0xf9, 0x9d, 0x32, + 0x42, 0x9d, 0x77, 0xfe, 0x6a, 0x12, 0x4a, + 0xa3, 0xd2, 0x49, 0xbb, 0x39, 0xad, 0x42, + 0xb7, 0x37, 0xfb, 0xde, 0x9d, 0xaf, 0x1b, + 0xd5, 0x5a, 0x3b, 0x06, 0xa6, 0x51, 0x7d, + 0x6a, 0x5c, 0x32, 0xdb, 0xde, 0x5d, 0x0d, + 0x20, 0x88, 0xee, 0x8b, 0xa8, 0x49, 0x5b, + 0x6c, 0x50, 0x72, 0xdb, 0x68, 0x44, 0x17, + 0x28, 0xd4, 0xbb, 0x43, 0x8e, 0x00, 0xa5, + 0xc8, 0x27, 0x00, 0xaa, 0x2b, 0xa4, 0xc2, + 0x16, 0xcd, 0x2d, 0x59, 0xdc, 0x1a, 0xa2, + 0x66, 0xe2, 0x96, 0x6b, 0xcc, 0x39, 0xc6, + 0xe9, 0x2b, 0x14, 0xa7, 0x7d, 0x67, 0x5d, + 0x54, 0xfc, 0x93, 0x73, 0x52, 0x47, 0xc7, + 0x24, 0x1e, 0x7e, 0xc9, 0x2d, 0x87, 0x60, + 0xd3, 0xd8, 0x76, 0xf0, 0x51, 0x04, 0xc7, + 0xcb, 0x68, 0x0f, 0xd8, 0x4b, 0x22, 0xb2, + 0x51, 0x87, 0xe9, 0x1e, 0x05, 0x3d, 0xe2, + 0x8a, 0x6b, 0xb8, 0x96, 0xd6, 0xe0, 0x6e, + 0x38, 0x74, 0x96, 0xad, 0x7e, 0x4f, 0x52, + 0x35, 0xcf, 0x4a, 0x50, 0xe7, 0x60, 0x2e, + 0x58, 0xcf, 0xdc, 0x7a, 0x9a, 0x21, 0x76, + 0x1d, 0x2c, 0xd1, 0x98, 0xab, 0xab, 0xed, + 0xf9, 0xec, 0xd5, 0x7b, 0x09, 0xad, 0x2e, + 0xad, 0x5a, 0xdc, 0xad, 0xd6, 0x46, 0xba, + 0x2d, 0x55, 0xf7, 0x0c, 0x9a, 0x23, 0x10, + 0x50, 0x3e, 0x4f, 0xe1, 0xeb, 0x58, 0x8a, + 0xc0, 0x17, 0x48, 0x41, 0x40, 0x65, 0x0b, + 0xfb, 0x43, 0x9e, 0xf0, 0x37, 0x4a, 0x89, + 0x4e, 0x71, 0xad, 0x44, 0x19, 0x13, 0xbb, + 0x4a, 0x63, 0x83, 0x9e, 0x6a, 0x49, 0x1b, + 0x28, 0xb0, 0x8e, 0x9c, 0x7b, 0xaf, 0xf9, + 0x57, 0x5d, 0x35, 0x16, 0x5c, 0xa7, 0x5e, + 0xd1, 0x0d, 0x83, 0xdc, 0x49, 0xdd, 0x40, + 0x58, 0x9c, 0x97, 0x91, 0xa6, 0xb0, 0x68, + 0xb0, 0xfa, 0x9e, 0xc0, 0x3f, 0x81, 0xc6, + 0xce, 0x58, 0xc5, 0x87, 0xc6, 0xf4, 0x06, + 0xec, 0x91, 0x57, 0x81, 0xce, 0x3a, 0xe8, + 0xf1, 0x29, 0x3f, 0x01, 0x93, 0xf0, 0x74, + 0x22, 0xea, 0x6b, 0x06, 0xd8, 0x65, 0xdb, + 0xd7, 0x41, 0xd9, 0x60, 0x23, 0xe7, 0x83, + 0xc8, 0x69, 0x6b, 0x90, 0xc5, 0xc7, 0xb9, + 0xd5, 0xba, 0x79, 0xc9, 0x4a, 0x87, 0x23, + 0x1c, 0x95, 0x78, 0xf3, 0x73, 0x10, 0xbe, + 0xb2, 0x0f, 0x32, 0xec, 0xff, 0x15, 0x51, + 0x4d, 0xb5, 0x48, 0x3c, 0xca, 0x4c, 0x5b, + 0x32, 0x29, 0x47, 0x21, 0xba, 0x2a, 0x5d, + 0xc9, 0x59, 0xfa, 0x8f, 0x33, 0x10, 0x83, + 0x40, 0x80, 0xf3, 0xce, 0xee, 0x6d, 0xcd, + 0x9c, 0xbb, 0x23, 0x0b, 0x45, 0xba, 0x7a, + 0x07, 0xdc, 0x4d, 0x57, 0x97, 0xb4, 0xa4, + 0xef, 0x94, 0xe8, 0x43, 0xfe, 0x18, 0x47, + 0x1a, 0xb0, 0xf6, 0xb6, 0x0b, 0x55, 0x05, + 0xbd, 0x67, 0x2d, 0x37, 0x27, 0x17, 0x13, + 0x65, 0x22, 0xf2, 0x7c, 0xf7, 0x47, 0xd2, + 0x85, 0x63, 0x98, 0x83, 0xd2, 0xc1, 0xbf, + 0x8f, 0x4c, 0xda, 0xbf, 0xa4, 0x10, 0x6b, + 0x4e, 0x6b, 0x78, 0x5e, 0x3f, 0x7a, 0xec, + 0x15, 0x84, 0xbe, 0x1a, 0x94, 0xa2, 0x2b, + 0xb5, 0x3e, 0x55, 0x86, 0x51, 0xec, 0x2e, + 0x62, 0xcb, 0xd6, 0x9f, 0xe5, 0xa4, 0xb8, + 0xc0, 0xaa, 0x4e, 0x6d, 0x8a, 0xb1, 0xd6, + 0xf7, 0x8d, 0x1c, 0x04, 0x32, 0x8b, 0x20, + 0xf5, 0x80, 0x33, 0xbd, 0xcc, 0x3e, 0x4c, + 0x16, 0x04, 0xab, 0xd8, 0x64, 0x6d, 0xf9, + 0xc9, 0x15, 0x7d, 0x4b, 0x00, 0x86, 0xb2, + 0x70, 0x1d, 0x20, 0xcb, 0x7a, 0xed, 0x7e, + 0x81, 0x7f, 0x41, 0x33, 0xb8, 0x7b, 0xc0, + 0xa3, 0xbd, 0x12, 0xd1, 0x67, 0x48, 0xa0, + 0xb9, 0xeb, 0xd5, 0x29, 0xab, 0x91, 0x9c, + 0xa2, 0x2f, 0x8e, 0x01, 0x1c, 0x88, 0xc1, + 0x3e, 0x34, 0x47, 0x36, 0x8a, 0x35, 0x6c, + 0x2f, 0xc1, 0x8a, 0xb6, 0xd0, 0xa5, 0x01, + 0x82, 0xee, 0x4f, 0x44, 0xb9, 0xcd, 0x16, + 0x9c, 0x3a, 0xf8, 0xe9, 0x2a, 0xd2, 0xb6, + 0x1d, 0xfd, 0x3c, 0x06, 0xdc, 0x42, 0xdd, + 0x2d, 0x60, 0x6a, 0x44, 0x21, 0xc3, 0x37, + 0x75, 0x79, 0xc5, 0x29, 0x5c, 0x7e, 0xf5, + 0x86, 0xbb, 0x56, 0x05, 0x21, 0x46, 0xaf, + 0x6d, 0x3a, 0xa2, 0x9e, 0x11, 0x6d, 0x9e, + 0x05, 0x74, 0x8a, 0xfe, 0x84, 0x88, 0x3e, + 0x76, 0xb4, 0xef, 0x2f, 0xeb, 0x52, 0xcd, + 0x97, 0x82, 0xba, 0x0c, 0xcc, 0xcb, 0x72, + 0x8d, 0x8d, 0xd2, 0x32, 0x7c, 0x41, 0x39, + 0xa6, 0x22, 0xb7, 0xdc, 0x3f, 0x39, 0x43, + 0xf5, 0xee, 0x0c, 0xfc, 0xbb, 0x2b, 0x43, + 0xe8, 0xce, 0xae, 0x0c, 0xd9, 0x15, 0x22, + 0x32, 0xbd, 0x69, 0xad, 0x76, 0xd9, 0xdf, + 0x81, 0xdf, 0x24, 0x76, 0x7b, 0x53, 0x0b, + 0xe6, 0xc7, 0x6c, 0x38, 0x2c, 0xbf, 0x28, + 0x95, 0x03, 0x18, 0xef, 0x98, 0x88, 0xc2, + 0x6b, 0x1a, 0xf5, 0xb4, 0xf9, 0x19, 0x76, + 0x25, 0x1d, 0xcf, 0x9b, 0xcd, 0x4c, 0x00, + 0x06, 0xde, 0x55, 0x58, 0x95, 0x9a, 0x06, + 0xfb, 0xf9, 0x88, 0x20, 0x85, 0x80, 0xe3, + 0x27, 0xdf, 0xc5, 0x20, 0x29, 0x7c, 0x58, + 0x02, 0x07, 0x2e, 0xd2, 0xeb, 0xdc, 0x68, + 0x58, 0x91, 0x08, 0x71, 0x16, 0xb3, 0x82, + 0x2f, 0x6c, 0x45, 0xcd, 0xbe, 0xe5, 0x0c, + 0x07, 0x77, 0x95, 0x3b, 0x2c, 0x59, 0x8e, + 0xba, 0x07, 0xa8, 0xa1, 0xc6, 0xe5, 0x6a, + 0x49, 0xb5, 0x85, 0xf2, 0x70, 0x05, 0x22, + 0xc4, 0x2f, 0x8d, 0xdd, 0x48, 0x8d, 0x87, + 0xfa, 0xb6, 0xf8, 0x59, 0xc8, 0xb1, 0x18, + 0x03, 0x5f, 0xce, 0x53, 0x28, 0x96, 0x15, + 0xd4, 0xb4, 0x10, 0x2c, 0xe2, 0x22, 0x9e, + 0x88, 0xe5, 0xcd, 0xda, 0xfc, 0xf9, 0x64, + 0xa4, 0x7b, 0xfb, 0xeb, 0xa8, 0x6a, 0xb6, + 0xf6, 0x17, 0x84, 0x26, 0x3d, 0xe4, 0x66, + 0x7e, 0x5c, 0x85, 0x01, 0xaf, 0xdc, 0xdb, + 0x48, 0x33, 0x4a, 0x20, 0x7c, 0x22, 0x1b, + 0xd5, 0xeb, 0x2d, +}; +static const byte ml_dsa_44_good_sig[] = { + 0xfc, 0x2d, 0xa0, 0x06, 0x85, 0xc2, 0xfc, + 0x92, 0x47, 0x77, 0x0b, 0x39, 0xbf, 0xe5, + 0xba, 0xd4, 0x44, 0xbf, 0xde, 0xce, 0x1f, + 0x04, 0xa2, 0x87, 0xed, 0x4a, 0xce, 0x0e, + 0xf3, 0x95, 0x61, 0x1e, 0x66, 0x4e, 0x9a, + 0x5d, 0x00, 0x31, 0x32, 0xf0, 0x90, 0x3d, + 0x7e, 0xf2, 0x9d, 0xe2, 0x93, 0xa1, 0xc8, + 0x64, 0x36, 0xf2, 0x59, 0xc7, 0x9e, 0xb6, + 0xb3, 0x6f, 0xe5, 0x80, 0x8d, 0x92, 0x77, + 0xd6, 0xb6, 0xe4, 0xc5, 0x5e, 0x79, 0x45, + 0x4b, 0xd0, 0xfe, 0x53, 0x55, 0xb6, 0x66, + 0x88, 0xfe, 0x95, 0x40, 0x07, 0xfd, 0xdb, + 0x40, 0x33, 0x39, 0x67, 0x03, 0x30, 0x8e, + 0x80, 0x4e, 0xa7, 0x0e, 0xe4, 0x05, 0x04, + 0xc5, 0x33, 0x72, 0x47, 0x5b, 0x85, 0x0f, + 0xe1, 0xeb, 0x98, 0x1a, 0x76, 0x79, 0x84, + 0xce, 0x26, 0x66, 0xe8, 0x92, 0xc9, 0x1f, + 0x40, 0x96, 0x72, 0xfe, 0x61, 0xae, 0xba, + 0x84, 0x70, 0xb7, 0x92, 0x2f, 0x7e, 0xc8, + 0xe8, 0xe4, 0x34, 0x73, 0xd4, 0x69, 0x57, + 0x3e, 0x28, 0x2b, 0x18, 0x0f, 0xef, 0xb1, + 0x06, 0xe2, 0xf8, 0x79, 0x70, 0x5a, 0x84, + 0x84, 0x6c, 0xb3, 0x57, 0x5b, 0x18, 0x42, + 0xdf, 0xd5, 0xdb, 0xf8, 0x35, 0x5f, 0x7b, + 0x23, 0x25, 0x2f, 0x0f, 0x17, 0x0b, 0x9a, + 0xb6, 0xe8, 0x31, 0x30, 0x6b, 0x90, 0x06, + 0x2c, 0xfd, 0xca, 0xaa, 0xa6, 0xc3, 0xdc, + 0x88, 0xa7, 0x31, 0x74, 0x67, 0xe2, 0x64, + 0x8f, 0x5c, 0xc4, 0xc0, 0x4d, 0x34, 0x15, + 0x0d, 0xd2, 0x23, 0x69, 0xfc, 0x6e, 0xbb, + 0x82, 0xca, 0xc4, 0xee, 0xf1, 0x14, 0xc1, + 0xd4, 0x5a, 0x71, 0x78, 0x9b, 0x40, 0x01, + 0xb9, 0xe4, 0x6e, 0x68, 0xf6, 0x13, 0xca, + 0xc1, 0xea, 0x70, 0x71, 0x3d, 0xc9, 0x1a, + 0x62, 0xb9, 0xa9, 0xe0, 0x1e, 0xe2, 0x34, + 0xf2, 0x9a, 0xf7, 0x23, 0xb3, 0xc1, 0xca, + 0x35, 0x0e, 0x5e, 0xa7, 0xd1, 0x3d, 0xea, + 0x51, 0xdc, 0xe2, 0x0e, 0xfc, 0x7d, 0x26, + 0x75, 0xec, 0x9a, 0x6e, 0x40, 0x1f, 0x60, + 0x06, 0xd7, 0x56, 0xf8, 0xa4, 0x2a, 0x82, + 0x9c, 0xef, 0x51, 0x4a, 0xe1, 0x01, 0x2b, + 0xb0, 0x8b, 0x34, 0x7b, 0xe1, 0x63, 0xa4, + 0xcc, 0x72, 0x81, 0xd9, 0xb4, 0x20, 0xcc, + 0x60, 0xe2, 0x15, 0x6d, 0xc7, 0x6c, 0x75, + 0x65, 0x4d, 0xb6, 0xc0, 0x36, 0x49, 0x87, + 0x06, 0x3e, 0xca, 0x1c, 0x32, 0x36, 0x2f, + 0xe3, 0xf6, 0x06, 0x0a, 0xb1, 0xd2, 0xfb, + 0xee, 0x4e, 0xd7, 0xce, 0x65, 0xcc, 0x89, + 0xf2, 0x77, 0x14, 0x27, 0x27, 0x84, 0x52, + 0x97, 0x1b, 0x89, 0x17, 0x31, 0x8d, 0xc4, + 0x0f, 0xc7, 0xc6, 0x45, 0x44, 0x9a, 0x97, + 0xd3, 0x88, 0x71, 0x73, 0x97, 0x64, 0xa6, + 0xe6, 0x3d, 0xf2, 0xd3, 0x7f, 0x7f, 0xfa, + 0x4f, 0xf4, 0xe9, 0x76, 0x8a, 0x2a, 0xfe, + 0x28, 0x8e, 0xa5, 0xb3, 0x46, 0x2b, 0xad, + 0x50, 0x5e, 0x12, 0xcd, 0xf8, 0x46, 0xe4, + 0x06, 0x12, 0xc2, 0xb8, 0xcd, 0x04, 0x76, + 0x07, 0x7c, 0xed, 0x2f, 0x0f, 0xd6, 0x97, + 0x31, 0xa4, 0x0c, 0x18, 0x85, 0x75, 0xd3, + 0x55, 0xfd, 0xe3, 0x1a, 0xbf, 0x43, 0xde, + 0x20, 0xa9, 0x19, 0xcd, 0x03, 0x01, 0xdf, + 0x04, 0x71, 0x09, 0x94, 0x99, 0x51, 0xb0, + 0x8e, 0x32, 0x80, 0xe6, 0x64, 0x4b, 0xdf, + 0xa5, 0xec, 0xfa, 0xce, 0xf6, 0xf3, 0xce, + 0x51, 0xe8, 0x6d, 0x03, 0x1e, 0x69, 0x59, + 0xef, 0x20, 0x98, 0x71, 0xe2, 0xc3, 0xec, + 0x19, 0x03, 0xa9, 0x2d, 0x12, 0x21, 0x79, + 0x7e, 0xb0, 0xcb, 0x76, 0x68, 0x2f, 0x11, + 0x01, 0x2b, 0x11, 0xef, 0xd6, 0xb7, 0x8b, + 0x5e, 0x31, 0x78, 0x7b, 0x2d, 0xe6, 0x4a, + 0xfb, 0xc1, 0xbb, 0x78, 0x92, 0x11, 0xcb, + 0x91, 0x97, 0x52, 0x1b, 0x8e, 0xfb, 0x59, + 0x02, 0x22, 0xbe, 0xf7, 0x33, 0xaa, 0x7b, + 0xfd, 0x93, 0xf7, 0xa8, 0x9b, 0xfc, 0x99, + 0x36, 0x22, 0x04, 0x1e, 0xdc, 0xa3, 0x2b, + 0xe6, 0xac, 0x2e, 0x4b, 0x38, 0x0a, 0x25, + 0xde, 0x3d, 0x8e, 0x0b, 0x95, 0x04, 0x48, + 0x3d, 0x66, 0x52, 0x99, 0x79, 0xe1, 0x8d, + 0xe0, 0xa7, 0xd5, 0x23, 0x0d, 0x45, 0x89, + 0x88, 0xa9, 0x59, 0x4e, 0xc7, 0x64, 0x39, + 0x93, 0xdd, 0xcb, 0xfe, 0x97, 0xe7, 0x7d, + 0xab, 0x61, 0x08, 0xf7, 0x7a, 0xff, 0x10, + 0x1d, 0x8d, 0x11, 0xa9, 0x97, 0xbd, 0x16, + 0xb5, 0x6c, 0x84, 0x71, 0x61, 0x72, 0x36, + 0x51, 0xe7, 0x43, 0x8b, 0x15, 0xb2, 0x48, + 0x6a, 0x14, 0x8a, 0xbe, 0x92, 0xa7, 0xfa, + 0xce, 0x02, 0x1a, 0x7f, 0xc5, 0xdb, 0x76, + 0x0a, 0x4c, 0xc7, 0x20, 0x2a, 0x34, 0xf4, + 0x92, 0x3b, 0x34, 0x69, 0x71, 0x3d, 0xe1, + 0xf2, 0x2f, 0x52, 0xe1, 0x48, 0xbe, 0x27, + 0x47, 0x1d, 0x55, 0x96, 0x6e, 0xa3, 0x39, + 0xc6, 0xd8, 0x12, 0xe0, 0xb2, 0x93, 0x56, + 0xef, 0x10, 0xf4, 0xa6, 0xf4, 0x5f, 0xa9, + 0xfd, 0x5d, 0x01, 0x87, 0xb8, 0xe5, 0x4f, + 0x86, 0x2c, 0xa5, 0x09, 0xfc, 0x29, 0x84, + 0x5b, 0x44, 0xf9, 0x8d, 0x9c, 0xbb, 0x19, + 0x97, 0x52, 0xbb, 0xac, 0x19, 0x57, 0x68, + 0x7d, 0x74, 0xb5, 0x4f, 0xda, 0x8a, 0x9c, + 0xcf, 0x5d, 0x7b, 0xd9, 0xf0, 0xb3, 0x11, + 0x76, 0x50, 0x03, 0x06, 0x44, 0xe7, 0x68, + 0x35, 0xe9, 0x14, 0x20, 0xbd, 0x0d, 0x90, + 0x96, 0x21, 0xa1, 0x17, 0x8f, 0xf7, 0x50, + 0x6c, 0xc0, 0x76, 0x3d, 0x34, 0x8d, 0xf2, + 0x75, 0xf0, 0xa2, 0x6c, 0x8a, 0xc1, 0x56, + 0x95, 0xb2, 0xd9, 0x87, 0xf2, 0xe4, 0x80, + 0x25, 0xc7, 0x97, 0xd2, 0xd2, 0xf8, 0x1c, + 0x7a, 0x48, 0x70, 0x99, 0x6b, 0xf2, 0x50, + 0x83, 0xf3, 0x10, 0xb1, 0x9b, 0x6d, 0x75, + 0x53, 0x86, 0x23, 0xc9, 0x60, 0x4d, 0x73, + 0xc7, 0x52, 0x90, 0x12, 0x6b, 0x92, 0x2d, + 0x35, 0xbc, 0x4d, 0x86, 0x67, 0xfe, 0x35, + 0x11, 0x6c, 0xbb, 0x9b, 0x76, 0xaf, 0x26, + 0xae, 0x50, 0x23, 0x76, 0x68, 0x16, 0x80, + 0xf0, 0xa4, 0xcc, 0x76, 0x6b, 0xf3, 0x99, + 0x04, 0x8b, 0x39, 0xf2, 0xa6, 0xa9, 0x72, + 0x6f, 0xbe, 0xa8, 0xdb, 0x53, 0xf3, 0x93, + 0x00, 0xac, 0x3e, 0x8f, 0xdd, 0x68, 0x9e, + 0x2f, 0xe3, 0x48, 0x0b, 0x11, 0xe2, 0x9a, + 0xfa, 0x98, 0x32, 0x40, 0x26, 0xf8, 0x83, + 0xc6, 0x00, 0x02, 0x7d, 0xb5, 0xd2, 0xd4, + 0xdd, 0xc6, 0x02, 0xec, 0xb3, 0x98, 0xd6, + 0x8e, 0xab, 0x75, 0x06, 0x37, 0x97, 0x4c, + 0x50, 0xc5, 0xe1, 0x43, 0x34, 0xd6, 0xbd, + 0xb6, 0xfc, 0xb7, 0x04, 0x0d, 0xd8, 0x35, + 0xb4, 0x3e, 0x0e, 0x43, 0x22, 0x83, 0xf5, + 0x5d, 0x2e, 0x0a, 0x8f, 0xa0, 0xec, 0x17, + 0xd9, 0xa1, 0x84, 0x98, 0x32, 0x5c, 0x99, + 0x66, 0x05, 0x70, 0x9a, 0xa4, 0x9b, 0xbe, + 0xd3, 0x3d, 0x2a, 0x13, 0xb1, 0x96, 0x37, + 0x4f, 0xe7, 0x6f, 0x6b, 0x5e, 0x80, 0xe4, + 0xb6, 0x98, 0x56, 0xed, 0xff, 0x5b, 0x21, + 0x5f, 0x79, 0x9a, 0x0f, 0x53, 0x69, 0x76, + 0xdb, 0xc0, 0x12, 0x9c, 0xed, 0xd4, 0x00, + 0x64, 0xca, 0xf4, 0xc3, 0x17, 0x49, 0xbb, + 0xef, 0xbc, 0x7b, 0x73, 0x24, 0x4f, 0x6e, + 0xcf, 0x25, 0x49, 0x30, 0x4f, 0x9a, 0xb7, + 0x2a, 0x2f, 0xc2, 0x69, 0x74, 0xe5, 0xa6, + 0xd7, 0x29, 0x4d, 0x80, 0xe6, 0xf6, 0x66, + 0x4b, 0xdf, 0xef, 0xfd, 0xb5, 0xaa, 0x53, + 0x75, 0x0e, 0xf5, 0x92, 0xb3, 0x30, 0x3d, + 0x5d, 0xa8, 0x49, 0x74, 0xa2, 0x13, 0xb3, + 0x99, 0x7e, 0xf9, 0x34, 0x08, 0xc2, 0xa6, + 0xc9, 0xd1, 0xb7, 0x65, 0xf4, 0xa9, 0xda, + 0x11, 0x07, 0x89, 0x08, 0x92, 0xdf, 0x1a, + 0x8d, 0xd7, 0x1e, 0xe9, 0xa3, 0x5c, 0x66, + 0x79, 0xa0, 0x2d, 0xd1, 0xd9, 0x65, 0xa2, + 0xd3, 0x47, 0xb1, 0xa1, 0xf4, 0xa1, 0x18, + 0x7f, 0xb0, 0xd1, 0x20, 0x05, 0x06, 0x6f, + 0xda, 0xe3, 0xef, 0xee, 0x47, 0xdf, 0x80, + 0x22, 0x14, 0x4b, 0xc2, 0xe4, 0xea, 0x02, + 0xe7, 0x06, 0xc8, 0x2d, 0x2d, 0xbd, 0xd2, + 0xef, 0xd3, 0x3b, 0xf0, 0xc8, 0xc1, 0x04, + 0x53, 0x81, 0x27, 0xb2, 0xf2, 0xf8, 0x5d, + 0xe1, 0x27, 0xd6, 0xd8, 0x2e, 0x0d, 0x43, + 0xf4, 0xf0, 0x7a, 0x8c, 0x78, 0x3f, 0x23, + 0x4d, 0x05, 0xf6, 0xc6, 0x9a, 0xc1, 0x19, + 0x58, 0x48, 0x02, 0x71, 0xc4, 0xf1, 0x16, + 0xc2, 0xbf, 0xc2, 0xf5, 0xa6, 0x70, 0x25, + 0x8b, 0x6c, 0x31, 0xa6, 0x2b, 0x6a, 0x1f, + 0x26, 0x4a, 0x6b, 0x05, 0x67, 0xa9, 0x5e, + 0xa6, 0xc7, 0x19, 0xf0, 0x6f, 0xc2, 0xa4, + 0x07, 0xe1, 0xf8, 0xb6, 0x70, 0x79, 0x85, + 0x97, 0x1f, 0xc2, 0x97, 0xf3, 0x57, 0x3d, + 0xd1, 0x70, 0xb1, 0xe8, 0x43, 0x11, 0xe6, + 0x2f, 0x8a, 0x12, 0x97, 0xe1, 0x1f, 0x86, + 0x33, 0xa1, 0x30, 0xb3, 0x8e, 0xd7, 0x43, + 0x99, 0x35, 0xd3, 0x48, 0x04, 0x29, 0xa3, + 0xf3, 0x2c, 0x0e, 0xda, 0x66, 0xc8, 0xa9, + 0xd3, 0x28, 0x7f, 0xf0, 0xaa, 0x53, 0xc8, + 0x4b, 0xa3, 0xde, 0xcc, 0x5f, 0xae, 0x9b, + 0x2f, 0x20, 0xf7, 0x9a, 0x41, 0xb7, 0xdb, + 0x7a, 0x92, 0xa1, 0x45, 0x2c, 0x49, 0xb7, + 0x2d, 0xe5, 0x6e, 0x84, 0xb1, 0xa4, 0x6e, + 0xea, 0xf9, 0xca, 0xc6, 0x0f, 0xd3, 0xdc, + 0xad, 0x79, 0xf4, 0x3b, 0xc0, 0x8c, 0x8c, + 0x6f, 0xdf, 0x2c, 0xbb, 0x2a, 0x9f, 0x74, + 0x2f, 0x31, 0x7b, 0x05, 0xc5, 0xc4, 0x22, + 0xfd, 0xfc, 0xdf, 0x95, 0x3b, 0x21, 0x41, + 0xab, 0x5b, 0xe9, 0x37, 0xdf, 0xd3, 0x4c, + 0x97, 0x73, 0xac, 0xbd, 0x82, 0x97, 0xd0, + 0x00, 0x55, 0x47, 0xa4, 0x67, 0x12, 0xcd, + 0xe3, 0x01, 0x31, 0xe6, 0x1c, 0x61, 0xf8, + 0xa4, 0xce, 0x23, 0xed, 0xeb, 0x8f, 0x57, + 0xbf, 0x97, 0x4b, 0x26, 0x75, 0xa0, 0x4b, + 0xf6, 0x7e, 0xda, 0x1c, 0x90, 0x8a, 0xc4, + 0xf4, 0x60, 0xfc, 0x65, 0x45, 0x8c, 0x1b, + 0x5c, 0x65, 0xc4, 0x5d, 0x99, 0x9a, 0xed, + 0x62, 0xd6, 0x74, 0x43, 0xac, 0x5e, 0x0c, + 0xfd, 0x7d, 0xf2, 0x4f, 0xc3, 0x02, 0xc8, + 0x24, 0xa7, 0x17, 0x49, 0xf9, 0xdd, 0xc9, + 0x64, 0x71, 0x08, 0xb9, 0xac, 0x47, 0x3d, + 0x6a, 0x4f, 0xdc, 0xa6, 0x56, 0x00, 0x01, + 0x53, 0x2d, 0xca, 0x32, 0x4e, 0x40, 0xec, + 0x14, 0x03, 0x69, 0x75, 0xfa, 0x93, 0x49, + 0x98, 0x04, 0x25, 0x29, 0xe5, 0x78, 0x6e, + 0x3e, 0x99, 0x58, 0x18, 0x48, 0xf3, 0x29, + 0x56, 0x8d, 0x23, 0xd1, 0x5d, 0xb2, 0x2a, + 0x74, 0xa7, 0x53, 0xc5, 0xc6, 0xc4, 0x12, + 0xfe, 0x65, 0x6c, 0xde, 0xc3, 0x6c, 0x18, + 0xde, 0xc3, 0x97, 0xaa, 0xed, 0x69, 0x3c, + 0x4d, 0xc9, 0xa9, 0x63, 0xa9, 0x4d, 0x91, + 0x63, 0xa3, 0x1c, 0x87, 0x36, 0x19, 0x4a, + 0xc5, 0xd1, 0xcb, 0xf4, 0x88, 0xfd, 0xa0, + 0x9b, 0x37, 0x9a, 0x7e, 0xcc, 0x09, 0xac, + 0x3b, 0xf0, 0xf5, 0xb5, 0x15, 0x72, 0x47, + 0xb0, 0x42, 0x0d, 0xed, 0x19, 0x42, 0x93, + 0x5a, 0x56, 0xbf, 0x2c, 0x4b, 0xec, 0xf4, + 0x13, 0x30, 0x0b, 0xdf, 0x0e, 0xc1, 0x22, + 0xa5, 0x6c, 0xf4, 0xcf, 0x09, 0x83, 0xe2, + 0xd0, 0x05, 0x62, 0x8d, 0xda, 0xea, 0x79, + 0xa9, 0x6c, 0xe1, 0x90, 0xc0, 0xe7, 0x6d, + 0x63, 0x8e, 0xe5, 0xe0, 0xa9, 0x67, 0x80, + 0xb7, 0x80, 0x43, 0xfc, 0xa1, 0x11, 0x6d, + 0xc9, 0x91, 0xa3, 0xcb, 0x1a, 0x6e, 0xf8, + 0x6e, 0xdb, 0xf0, 0x7d, 0xeb, 0x45, 0x6a, + 0xee, 0xd8, 0x3e, 0x6b, 0x9a, 0xc4, 0xcd, + 0x7b, 0x35, 0x19, 0x73, 0x14, 0x22, 0x47, + 0x86, 0x54, 0x34, 0xc9, 0x02, 0x49, 0xe6, + 0xb9, 0x45, 0xf7, 0x2c, 0xf7, 0xa4, 0x12, + 0xc4, 0x7a, 0x95, 0x41, 0x54, 0x8d, 0x51, + 0xc5, 0x1a, 0x19, 0x75, 0x0c, 0x11, 0x03, + 0xd0, 0x6f, 0x56, 0x04, 0xb2, 0x87, 0x21, + 0xdb, 0x47, 0xed, 0x9b, 0xe8, 0xec, 0xa3, + 0xe1, 0x74, 0x3e, 0x21, 0x50, 0xf2, 0x09, + 0x2c, 0x5e, 0x3d, 0xca, 0xa7, 0x31, 0x7c, + 0xbd, 0xe4, 0xf1, 0x15, 0x0d, 0xe6, 0x3d, + 0x4c, 0x8e, 0x36, 0x45, 0xf7, 0x08, 0x3d, + 0x56, 0x63, 0xb6, 0x99, 0x46, 0x34, 0x48, + 0xfa, 0xcf, 0x88, 0xe5, 0x43, 0xf7, 0x88, + 0xd5, 0x55, 0x13, 0xfe, 0x79, 0x02, 0x49, + 0x1e, 0x82, 0x45, 0x45, 0x29, 0x8e, 0x0a, + 0x7c, 0x77, 0x51, 0x1b, 0x8e, 0x75, 0xd5, + 0xd6, 0x61, 0xff, 0xa5, 0xfe, 0x59, 0x48, + 0xbf, 0xfc, 0xf2, 0xcd, 0x37, 0x09, 0x4c, + 0xb6, 0xfc, 0xb0, 0x20, 0x5f, 0x12, 0x7a, + 0x3f, 0x64, 0x96, 0xdb, 0xc8, 0xe8, 0xd0, + 0x11, 0x19, 0x47, 0x95, 0x2d, 0x3d, 0xbf, + 0x56, 0x9c, 0x23, 0x30, 0x07, 0x1f, 0x2c, + 0x04, 0x5c, 0x7e, 0x4e, 0x2e, 0xa6, 0x20, + 0x38, 0xa0, 0x88, 0x47, 0x8a, 0x3f, 0x8f, + 0x8a, 0xe7, 0x6d, 0x0a, 0xf1, 0x2d, 0xd6, + 0x10, 0x23, 0x01, 0x62, 0x71, 0x5a, 0xbb, + 0x51, 0x98, 0xa1, 0x27, 0x7d, 0xba, 0x5f, + 0xe4, 0xdc, 0xd6, 0xd7, 0x4c, 0x1a, 0xe0, + 0x4d, 0xe1, 0xee, 0x61, 0xb7, 0xc5, 0x50, + 0x92, 0x99, 0xc7, 0x7b, 0x18, 0xf9, 0x89, + 0x2b, 0x57, 0xf9, 0xe9, 0xac, 0x23, 0x6e, + 0xff, 0xbd, 0x5a, 0x93, 0xdf, 0x15, 0x74, + 0x92, 0x0b, 0x76, 0x84, 0x96, 0x94, 0x1b, + 0x8f, 0xe4, 0x6e, 0x2b, 0xd7, 0x47, 0xfd, + 0x24, 0x3b, 0xe4, 0xe4, 0x99, 0xf9, 0x0b, + 0xf9, 0x29, 0x25, 0x25, 0x6a, 0xc0, 0x1e, + 0xb8, 0x8c, 0xd6, 0xd0, 0x6e, 0x13, 0x86, + 0xa8, 0x7c, 0xc3, 0x31, 0x30, 0x2e, 0x9b, + 0x51, 0xc1, 0x21, 0xea, 0x15, 0x8e, 0xd8, + 0x06, 0xa2, 0xe9, 0x12, 0x9f, 0xcb, 0x6b, + 0x24, 0xef, 0x4e, 0x19, 0x6c, 0xa5, 0x98, + 0x47, 0x8b, 0x4d, 0xbe, 0x00, 0x0c, 0x04, + 0xe3, 0x4d, 0x84, 0x64, 0x36, 0x20, 0x9f, + 0xde, 0xe2, 0x55, 0x89, 0x3e, 0x40, 0xe1, + 0xe3, 0x63, 0x0a, 0xe7, 0x15, 0x4c, 0xcd, + 0x4b, 0x63, 0x6f, 0x70, 0xc2, 0x84, 0x30, + 0x5d, 0x22, 0xd0, 0xe4, 0x65, 0xfb, 0x8a, + 0x07, 0x1a, 0x54, 0xf5, 0x4b, 0x65, 0xad, + 0x64, 0x91, 0x6e, 0x23, 0x98, 0x31, 0x26, + 0x79, 0x70, 0x94, 0xff, 0xc0, 0x65, 0x70, + 0xb4, 0x9d, 0x74, 0x8e, 0x76, 0x6b, 0x9a, + 0x24, 0x28, 0x0d, 0x8a, 0x93, 0x87, 0x18, + 0x04, 0x10, 0xfd, 0x0b, 0xaf, 0xd3, 0x92, + 0xbb, 0xb5, 0x41, 0xd2, 0x87, 0xc7, 0x69, + 0x89, 0x0c, 0x52, 0xf8, 0x46, 0x70, 0x8e, + 0xf0, 0x99, 0x96, 0x57, 0x40, 0x9c, 0xef, + 0x9a, 0xc2, 0x63, 0x47, 0x13, 0x11, 0x68, + 0x40, 0xab, 0x36, 0x16, 0x53, 0xd6, 0x8f, + 0x58, 0x5a, 0xdd, 0x0c, 0xd7, 0x17, 0x6a, + 0x39, 0x34, 0xf1, 0xe7, 0x75, 0x3b, 0x41, + 0x7e, 0x5a, 0x70, 0xfe, 0x5b, 0x08, 0x30, + 0xf4, 0x7b, 0x1d, 0xd0, 0x70, 0xae, 0x18, + 0xad, 0xd4, 0xff, 0xbb, 0xa4, 0x31, 0xec, + 0x28, 0x72, 0x64, 0x9a, 0x24, 0x16, 0x30, + 0xe4, 0xc5, 0x3c, 0xb0, 0x3c, 0x81, 0x4f, + 0xb9, 0xfc, 0xe1, 0x3a, 0x05, 0x17, 0xb2, + 0x18, 0x4c, 0x98, 0x3b, 0xfc, 0x93, 0xf0, + 0x0d, 0xb6, 0x3c, 0x54, 0x7b, 0x10, 0xfd, + 0x7f, 0x63, 0xfe, 0xa5, 0xc6, 0xb5, 0x24, + 0xb4, 0xf2, 0x2f, 0xb2, 0x6f, 0x7f, 0xdb, + 0x01, 0xdb, 0xaf, 0x57, 0xdc, 0xdb, 0xf4, + 0xc8, 0x31, 0xb0, 0xdd, 0x05, 0x8b, 0x9b, + 0x6e, 0x7c, 0x5e, 0x5e, 0x31, 0x2c, 0x7f, + 0xbb, 0xa4, 0x26, 0x88, 0xe1, 0x55, 0x3d, + 0x8d, 0x36, 0x69, 0xb7, 0xc8, 0xcc, 0x05, + 0xfe, 0x6e, 0xcc, 0xcb, 0xfd, 0x81, 0x14, + 0x8b, 0xbc, 0x0c, 0xd4, 0x7e, 0xb4, 0x13, + 0xc0, 0xe2, 0x51, 0xf4, 0x07, 0xde, 0xc4, + 0x1c, 0xf0, 0xc8, 0x92, 0xd4, 0x38, 0xd7, + 0x1e, 0x57, 0xa7, 0x4b, 0xc7, 0xf8, 0xca, + 0xcc, 0x61, 0x86, 0x96, 0x50, 0x4e, 0x6a, + 0x71, 0xbd, 0x5f, 0xc6, 0x48, 0x8b, 0x6f, + 0xeb, 0x53, 0x50, 0xea, 0x35, 0x39, 0x79, + 0xcc, 0xee, 0xae, 0x81, 0x0f, 0xe2, 0xd2, + 0xbb, 0x81, 0x03, 0x8a, 0xeb, 0x98, 0xc2, + 0xad, 0xb7, 0xc0, 0x14, 0x68, 0xb9, 0x7e, + 0x8e, 0x30, 0x11, 0x43, 0x59, 0x8f, 0x04, + 0x2f, 0x7a, 0x99, 0x36, 0xd0, 0x75, 0x07, + 0x6b, 0x8e, 0xc2, 0x10, 0xac, 0xc6, 0x4d, + 0x30, 0x91, 0x9f, 0xde, 0x33, 0x0e, 0xe7, + 0xbc, 0xe5, 0x94, 0xbf, 0x80, 0xdb, 0xb7, + 0xe0, 0x8f, 0xb7, 0x74, 0xc3, 0x77, 0x18, + 0x76, 0x33, 0x34, 0xb8, 0xe4, 0x81, 0xa5, + 0xd9, 0xf7, 0x78, 0xba, 0xec, 0x62, 0x34, + 0xcb, 0x54, 0xbe, 0x90, 0xc1, 0x56, 0x59, + 0x22, 0x94, 0x5b, 0x1a, 0x8f, 0xc6, 0x8f, + 0xf2, 0x84, 0x1f, 0x61, 0x4e, 0xeb, 0x98, + 0x72, 0xdd, 0xde, 0xc9, 0xc6, 0xab, 0xd1, + 0xad, 0xd1, 0x02, 0x60, 0x82, 0x89, 0xba, + 0xf5, 0x1a, 0x6b, 0xde, 0x96, 0x19, 0x64, + 0x44, 0x0a, 0xd6, 0x27, 0x9f, 0x67, 0x96, + 0x44, 0xcc, 0x4b, 0xfd, 0x8f, 0x9e, 0xa1, + 0x1f, 0x06, 0xac, 0x2e, 0xcf, 0xdb, 0xc7, + 0x08, 0x5e, 0xe3, 0xa2, 0x59, 0xa2, 0x22, + 0xf1, 0x7a, 0xce, 0xf5, 0x30, 0x53, 0xc0, + 0xbb, 0x36, 0x13, 0x95, 0x69, 0xe2, 0x28, + 0x47, 0xad, 0xb1, 0x82, 0xfd, 0x14, 0xf6, + 0x6e, 0xed, 0x5b, 0xe0, 0xeb, 0x13, 0x5c, + 0xc6, 0x72, 0xd5, 0x2c, 0xd0, 0xae, 0xc3, + 0xad, 0xa9, 0x60, 0x2a, 0x68, 0x7b, 0x03, + 0x54, 0xc5, 0xd1, 0x71, 0xc4, 0x99, 0x48, + 0x75, 0x18, 0x1e, 0xda, 0x0a, 0x8b, 0xe1, + 0x2d, 0x67, 0x1f, 0xae, 0x91, 0xc0, 0x37, + 0x39, 0x8c, 0x7c, 0x9e, 0x42, 0xd3, 0x6e, + 0xaf, 0x7e, 0x8e, 0xa0, 0x01, 0x45, 0xc1, + 0xc6, 0xef, 0xc6, 0x2e, 0x87, 0x7b, 0x5a, + 0x60, 0xe0, 0xec, 0x3b, 0x76, 0x8e, 0xb3, + 0x0d, 0x57, 0x86, 0xa2, 0xc9, 0x1a, 0x1b, + 0x38, 0x6b, 0x75, 0x7a, 0x81, 0x8b, 0x97, + 0x99, 0xa1, 0xbb, 0xd8, 0xda, 0xdf, 0xea, + 0xef, 0xf0, 0xf9, 0x01, 0x08, 0x11, 0x18, + 0x26, 0x36, 0x4b, 0x52, 0x56, 0x68, 0x7b, + 0x98, 0xca, 0xd3, 0xd6, 0xef, 0xf6, 0x05, + 0x07, 0x09, 0x10, 0x1f, 0x21, 0x28, 0x32, + 0x39, 0x3a, 0x3c, 0x54, 0x77, 0x7b, 0x81, + 0x99, 0xa9, 0xb0, 0xb2, 0xce, 0xe5, 0xe7, + 0x1f, 0x23, 0x3f, 0x4e, 0x50, 0x5d, 0x71, + 0x7a, 0x7c, 0x91, 0xa7, 0xab, 0xae, 0xd0, + 0xd6, 0xe1, 0xe6, 0xf1, 0xf3, 0xfa, 0x00, + 0x00, 0x13, 0x24, 0x3a, 0x4e, +}; +#endif + +static int test_wc_dilithium(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) + dilithium_key* key; + byte level; +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + !defined(WOLFSSL_DILITHIUM_NO_SIGN) + WC_RNG rng; +#endif + byte* privKey = NULL; +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + word32 privKeyLen = DILITHIUM_MAX_KEY_SIZE; +#endif + byte* pubKey = NULL; +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + word32 pubKeyLen = DILITHIUM_MAX_PUB_KEY_SIZE; +#endif + + key = (dilithium_key*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + privKey = (byte*)XMALLOC(DILITHIUM_MAX_KEY_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(privKey); + pubKey = (byte*)XMALLOC(DILITHIUM_MAX_PUB_KEY_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(pubKey); + + if (key != NULL) { + XMEMSET(key, 0, sizeof(*key)); + } +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + !defined(WOLFSSL_DILITHIUM_NO_SIGN) + XMEMSET(&rng, 0, sizeof(WC_RNG)); +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + !defined(WOLFSSL_DILITHIUM_NO_SIGN) + ExpectIntEQ(wc_InitRng(&rng), 0); +#endif + + ExpectIntEQ(wc_dilithium_init(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_init_ex(NULL, NULL, INVALID_DEVID), BAD_FUNC_ARG); + wc_dilithium_free(NULL); + + ExpectIntEQ(wc_dilithium_init(key), 0); + wc_dilithium_free(key); + ExpectIntEQ(wc_dilithium_init_ex(key, NULL, INVALID_DEVID), 0); + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + ExpectIntEQ(wc_dilithium_export_public(key, pubKey, &pubKeyLen), + BAD_FUNC_ARG); +#endif +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + ExpectIntEQ(wc_dilithium_export_private(key, privKey, &privKeyLen), + BAD_FUNC_ARG); +#endif + +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY + ExpectIntEQ(wc_dilithium_size(NULL), BAD_FUNC_ARG); +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_priv_size(NULL), BAD_FUNC_ARG); +#endif +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_pub_size(NULL), BAD_FUNC_ARG); +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + ExpectIntEQ(wc_dilithium_sig_size(NULL), BAD_FUNC_ARG); +#endif +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY + ExpectIntEQ(wc_dilithium_size(key), BAD_FUNC_ARG); +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_priv_size(key), BAD_FUNC_ARG); +#endif +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_pub_size(key), BAD_FUNC_ARG); +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + ExpectIntEQ(wc_dilithium_sig_size(key), BAD_FUNC_ARG); +#endif + + ExpectIntEQ(wc_dilithium_set_level(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_set_level(key, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_set_level(NULL, WC_ML_DSA_44), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_set_level(key, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_set_level(key, 4), BAD_FUNC_ARG); + + ExpectIntEQ(wc_dilithium_get_level(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_get_level(key, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_get_level(NULL, &level), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_get_level(key, &level), BAD_FUNC_ARG); + +#ifndef WOLFSSL_NO_ML_DSA_87 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), 0); + ExpectIntEQ(wc_dilithium_get_level(key, &level), 0); + ExpectIntEQ(level, WC_ML_DSA_87); +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY + ExpectIntEQ(wc_dilithium_size(key), DILITHIUM_LEVEL5_KEY_SIZE); +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_priv_size(key), DILITHIUM_LEVEL5_PRV_KEY_SIZE); +#endif +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_pub_size(key), DILITHIUM_LEVEL5_PUB_KEY_SIZE); +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + ExpectIntEQ(wc_dilithium_sig_size(key), DILITHIUM_LEVEL5_SIG_SIZE); +#endif +#else + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), NOT_COMPILED_IN); +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), 0); + ExpectIntEQ(wc_dilithium_get_level(key, &level), 0); + ExpectIntEQ(level, WC_ML_DSA_65); +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY + ExpectIntEQ(wc_dilithium_size(key), DILITHIUM_LEVEL3_KEY_SIZE); +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_priv_size(key), DILITHIUM_LEVEL3_PRV_KEY_SIZE); +#endif +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_pub_size(key), DILITHIUM_LEVEL3_PUB_KEY_SIZE); +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + ExpectIntEQ(wc_dilithium_sig_size(key), DILITHIUM_LEVEL3_SIG_SIZE); +#endif +#else + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), NOT_COMPILED_IN); +#endif +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), 0); + ExpectIntEQ(wc_dilithium_get_level(key, &level), 0); + ExpectIntEQ(level, WC_ML_DSA_44); +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY + ExpectIntEQ(wc_dilithium_size(key), DILITHIUM_LEVEL2_KEY_SIZE); +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_priv_size(key), DILITHIUM_LEVEL2_PRV_KEY_SIZE); +#endif +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + ExpectIntEQ(wc_dilithium_pub_size(key), DILITHIUM_LEVEL2_PUB_KEY_SIZE); +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + ExpectIntEQ(wc_dilithium_sig_size(key), DILITHIUM_LEVEL2_SIG_SIZE); +#endif +#else + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), NOT_COMPILED_IN); +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + ExpectIntEQ(wc_dilithium_export_public(key, pubKey, &pubKeyLen), + BAD_FUNC_ARG); +#endif +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + ExpectIntEQ(wc_dilithium_export_private(key, privKey, &privKeyLen), + BAD_FUNC_ARG); +#endif + + wc_dilithium_free(key); +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + !defined(WOLFSSL_DILITHIUM_NO_SIGN) + wc_FreeRng(&rng); +#endif + XFREE(pubKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(privKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_dilithium_make_key(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) + dilithium_key* key; + WC_RNG rng; + + key = (dilithium_key*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + + if (key != NULL) { + XMEMSET(key, 0, sizeof(*key)); + } + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_dilithium_init(key), 0); + + ExpectIntEQ(wc_dilithium_make_key(key, &rng), BAD_STATE_E); + +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), 0); +#else + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), 0); +#endif + + ExpectIntEQ(wc_dilithium_make_key(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_make_key(key, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_make_key(NULL, &rng), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_make_key(key, &rng), 0); + + wc_dilithium_free(key); + wc_FreeRng(&rng); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_dilithium_sign(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_SIGN) + dilithium_key* key; + dilithium_key* importKey = NULL; + WC_RNG rng; + byte* privKey = NULL; + word32 privKeyLen = DILITHIUM_MAX_KEY_SIZE; + word32 badKeyLen; + byte msg[32]; + byte* sig = NULL; + word32 sigLen = DILITHIUM_MAX_SIG_SIZE; + + key = (dilithium_key*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + importKey = (dilithium_key*)XMALLOC(sizeof(*key), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(importKey); + privKey = (byte*)XMALLOC(DILITHIUM_MAX_KEY_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(privKey); + sig = (byte*)XMALLOC(DILITHIUM_MAX_SIG_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(sig); + + if (key != NULL) { + XMEMSET(key, 0, sizeof(*key)); + } + if (importKey != NULL) { + XMEMSET(importKey, 0, sizeof(*importKey)); + } + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(msg, 0x55, sizeof(msg)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_dilithium_init(key), 0); + +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), 0); +#else + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), 0); +#endif + +#ifdef WOLFSSL_DILITHIUM_NO_MAKE_KEY +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_import_private(bench_dilithium_level2_key, + sizeof_bench_dilithium_level2_key, key), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_import_private(bench_dilithium_level3_key, + sizeof_bench_dilithium_level3_key, key), 0); +#else + ExpectIntEQ(wc_dilithium_import_private(bench_dilithium_level5_key, + sizeof_bench_dilithium_level5_key, key), 0); +#endif +#else + ExpectIntEQ(wc_dilithium_make_key(key, &rng), 0); +#endif + + ExpectIntEQ(wc_dilithium_sign_msg(NULL, 32, NULL, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, NULL, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(NULL, 32, sig, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(NULL, 32, NULL, &sigLen, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(NULL, 32, NULL, NULL, key, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(NULL, 32, NULL, NULL, NULL, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(NULL, 32, sig, &sigLen, key, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, NULL, &sigLen, key, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, sig, NULL, key, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, sig, &sigLen, NULL, &rng), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, sig, &sigLen, key, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, sig, &sigLen, key, &rng), 0); + + ExpectIntEQ(wc_dilithium_export_private(NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_private(key, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_private(NULL, privKey, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_private(NULL, NULL, &privKeyLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_private(NULL, privKey, &privKeyLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_private(key, NULL, &privKeyLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_private(key, privKey, NULL), + BAD_FUNC_ARG); + badKeyLen = 0; + ExpectIntEQ(wc_dilithium_export_private(key, privKey, &badKeyLen), + BUFFER_E); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(badKeyLen, DILITHIUM_LEVEL2_KEY_SIZE); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(badKeyLen, DILITHIUM_LEVEL3_KEY_SIZE); +#else + ExpectIntEQ(badKeyLen, DILITHIUM_LEVEL5_KEY_SIZE); +#endif + ExpectIntEQ(wc_dilithium_export_private(key, privKey, &privKeyLen), + 0); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(privKeyLen, DILITHIUM_LEVEL2_KEY_SIZE); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(privKeyLen, DILITHIUM_LEVEL3_KEY_SIZE); +#else + ExpectIntEQ(privKeyLen, DILITHIUM_LEVEL5_KEY_SIZE); +#endif + + ExpectIntEQ(wc_dilithium_init(importKey), 0); + ExpectIntEQ(wc_dilithium_import_private(privKey, privKeyLen, importKey), + BAD_FUNC_ARG); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(importKey, WC_ML_DSA_44), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_set_level(importKey, WC_ML_DSA_65), 0); +#else + ExpectIntEQ(wc_dilithium_set_level(importKey, WC_ML_DSA_87), 0); +#endif + ExpectIntEQ(wc_dilithium_import_private(NULL, 0, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_private(privKey, 0, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_private(NULL, privKeyLen, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_private(NULL, 0, importKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_private(NULL, privKeyLen, importKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_private(privKey, 0, importKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_private(privKey, privKeyLen, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_private(privKey, privKeyLen, importKey), + 0); + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, sig, &sigLen, key, &rng), 0); +#ifdef WOLFSSL_DILITHIUM_CHECK_KEY + ExpectIntEQ(wc_dilithium_check_key(importKey), PUBLIC_KEY_E); +#endif + wc_dilithium_free(importKey); + + wc_dilithium_free(key); + wc_FreeRng(&rng); + + XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(privKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(importKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_dilithium_verify(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + (!defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_DILITHIUM_NO_SIGN)) + dilithium_key* key; + dilithium_key* importKey = NULL; + WC_RNG rng; + byte* pubKey = NULL; + word32 pubKeyLen = DILITHIUM_MAX_PUB_KEY_SIZE; + word32 badKeyLen; + byte msg[32]; + byte* sig = NULL; + word32 sigLen = DILITHIUM_MAX_SIG_SIZE; + int res; +#ifndef WOLFSSL_NO_ML_DSA_44 + byte b; +#endif + + key = (dilithium_key*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + importKey = (dilithium_key*)XMALLOC(sizeof(*key), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(importKey); + pubKey = (byte*)XMALLOC(DILITHIUM_MAX_PUB_KEY_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(pubKey); + sig = (byte*)XMALLOC(DILITHIUM_MAX_SIG_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(sig); + + if (key != NULL) { + XMEMSET(key, 0, sizeof(*key)); + } + if (importKey != NULL) { + XMEMSET(importKey, 0, sizeof(*importKey)); + } + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(msg, 0x55, sizeof(msg)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_dilithium_init(key), 0); + +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), 0); +#else + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), 0); +#endif + +#if !defined(WOLFSSL_NO_ML_DSA_44) + ExpectIntEQ(wc_dilithium_import_public(ml_dsa_44_pub_key, + (word32)sizeof(ml_dsa_44_pub_key), key), 0); + if (sig != NULL) { + XMEMCPY(sig, ml_dsa_44_good_sig, sizeof(ml_dsa_44_good_sig)); + } + sigLen = (word32)sizeof(ml_dsa_44_good_sig); +#else +#ifdef WOLFSSL_DILITHIUM_NO_MAKE_KEY +#ifndef WOLFSSL_NO_ML_DSA_65 + ExpectIntEQ(wc_dilithium_import_public(bench_dilithium_level3_pub_key, + sizeof_bench_dilithium_level3_pub_key, key), 0); +#else + ExpectIntEQ(wc_dilithium_import_public(bench_dilithium_level5_pub_key, + sizeof_bench_dilithium_level5_pub_key, key), 0); +#endif /* !WOLFSSL_NO_ML_DSA_65 */ +#else + ExpectIntEQ(wc_dilithium_make_key(key, &rng), 0); +#endif /* WOLFSSL_DILITHIUM_NO_MAKE_KEY */ + + ExpectIntEQ(wc_dilithium_sign_msg(msg, 32, sig, &sigLen, key, &rng), 0); +#endif /* !WOLFSSL_NO_ML_DSA_44 */ + + ExpectIntEQ(wc_dilithium_export_public(NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_public(key, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_public(NULL, pubKey, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_public(NULL, NULL, &pubKeyLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_public(NULL, pubKey, &pubKeyLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_public(key, NULL, &pubKeyLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_public(key, pubKey, NULL), + BAD_FUNC_ARG); + badKeyLen = 0; + ExpectIntEQ(wc_dilithium_export_public(key, pubKey, &badKeyLen), + BUFFER_E); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(badKeyLen, DILITHIUM_LEVEL2_PUB_KEY_SIZE); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(badKeyLen, DILITHIUM_LEVEL3_PUB_KEY_SIZE); +#else + ExpectIntEQ(badKeyLen, DILITHIUM_LEVEL5_PUB_KEY_SIZE); +#endif + ExpectIntEQ(wc_dilithium_export_public(key, pubKey, &pubKeyLen), 0); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(pubKeyLen, DILITHIUM_LEVEL2_PUB_KEY_SIZE); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(pubKeyLen, DILITHIUM_LEVEL3_PUB_KEY_SIZE); +#else + ExpectIntEQ(pubKeyLen, DILITHIUM_LEVEL5_PUB_KEY_SIZE); +#endif + + ExpectIntEQ(wc_dilithium_verify_msg(NULL, 0, NULL, 32, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(sig, 0, NULL, 32, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(NULL, 0, msg, 32, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(NULL, 0, NULL, 32, &res, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(NULL, 0, NULL, 32, NULL, key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(NULL, sigLen, msg, 32, &res, key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(sig, 0, msg, 32, &res, key), + BUFFER_E); + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, NULL, 32, &res, key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, NULL, key), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, NULL), + BAD_FUNC_ARG); + res = 0; + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, key), 0); + ExpectIntEQ(res, 1); + + ExpectIntEQ(wc_dilithium_init(importKey), 0); + ExpectIntEQ(wc_dilithium_import_public(pubKey, pubKeyLen, importKey), + BAD_FUNC_ARG); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(importKey, WC_ML_DSA_44), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_set_level(importKey, WC_ML_DSA_65), 0); +#else + ExpectIntEQ(wc_dilithium_set_level(importKey, WC_ML_DSA_87), 0); +#endif + ExpectIntEQ(wc_dilithium_import_public(NULL, 0, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_public(pubKey, 0, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_public(NULL, pubKeyLen, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_public(NULL, 0, importKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_public(NULL, pubKeyLen, importKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_public(pubKey, 0, importKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_public(pubKey, pubKeyLen, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_public(pubKey, pubKeyLen, importKey), 0); + res = 0; + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, importKey), + 0); + ExpectIntEQ(res, 1); +#ifdef WOLFSSL_DILITHIUM_CHECK_KEY + ExpectIntEQ(wc_dilithium_check_key(importKey), BAD_FUNC_ARG); +#endif + wc_dilithium_free(importKey); + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (sig != NULL) { + if (sig[sigLen - 5] == 0) { + /* Unused hints meant to be 0. */ + sig[sigLen - 5] = 0xff; + res = 1; + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, + key), SIG_VERIFY_E); + ExpectIntEQ(res, 0); + sig[sigLen - 5] = 0x00; + } + + /* Last count of hints must be less than PARAMS_ML_DSA_44_OMEGA == 80 */ + b = sig[sigLen - 1]; + sig[sigLen - 1] = 0xff; + res = 1; + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, key), + SIG_VERIFY_E); + ExpectIntEQ(res, 0); + sig[sigLen - 1] = b; + + if (sig[sigLen - 4] > 1) { + /* Index must be less than previous. */ + b = sig[sigLen - 84]; + sig[sigLen - 84] = 0xff; + res = 1; + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, + key), SIG_VERIFY_E); + ExpectIntEQ(res, 0); + sig[sigLen - 84] = b; } - wc_ed448_free(&ed448PrivKey); + + /* Mess up commit hash. */ + sig[0] ^= 0x80; + res = 1; + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, key), + 0); + ExpectIntEQ(res, 0); + sig[0] ^= 0x80; + + /* Mess up z. */ + sig[100] ^= 0x80; + res = 1; + ExpectIntEQ(wc_dilithium_verify_msg(sig, sigLen, msg, 32, &res, key), + 0); + ExpectIntEQ(res, 0); + sig[100] ^= 0x80; } +#endif + + wc_dilithium_free(key); wc_FreeRng(&rng); - res = TEST_RES_CHECK(ret == 0); + XFREE(sig, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(pubKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(importKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif - return res; -}/* End test_wc_Ed448PrivateKeyToDer*/ + return EXPECT_RESULT(); +} + +static int test_wc_dilithium_check_key(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) && \ + !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) + dilithium_key* checkKey; + WC_RNG rng; + byte* privCheckKey = NULL; + word32 privCheckKeyLen = DILITHIUM_MAX_KEY_SIZE; + byte* pubCheckKey = NULL; + word32 pubCheckKeyLen = DILITHIUM_MAX_PUB_KEY_SIZE; + + checkKey = (dilithium_key*)XMALLOC(sizeof(*checkKey), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(checkKey); + privCheckKey = (byte*)XMALLOC(DILITHIUM_MAX_KEY_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(privCheckKey); + pubCheckKey = (byte*)XMALLOC(DILITHIUM_MAX_PUB_KEY_SIZE, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(pubCheckKey); + + if (checkKey != NULL) { + XMEMSET(checkKey, 0, sizeof(*checkKey)); + } + XMEMSET(&rng, 0, sizeof(WC_RNG)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + + ExpectIntEQ(wc_dilithium_check_key(NULL), BAD_FUNC_ARG); + + ExpectIntEQ(wc_dilithium_init(checkKey), 0); + + ExpectIntEQ(wc_dilithium_export_key(NULL, privCheckKey, + &privCheckKeyLen, pubCheckKey, &pubCheckKeyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + privCheckKeyLen, pubCheckKey, pubCheckKeyLen, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(checkKey, privCheckKey, + &privCheckKeyLen, pubCheckKey, &pubCheckKeyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + privCheckKeyLen, pubCheckKey, pubCheckKeyLen, checkKey), BAD_FUNC_ARG); + +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(checkKey, WC_ML_DSA_44), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_set_level(checkKey, WC_ML_DSA_65), 0); +#else + ExpectIntEQ(wc_dilithium_set_level(checkKey, WC_ML_DSA_87), 0); +#endif + ExpectIntEQ(wc_dilithium_make_key(checkKey, &rng), 0); + + ExpectIntEQ(wc_dilithium_export_key(NULL, NULL, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(checkKey, NULL, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(NULL, privCheckKey, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(NULL, NULL, &privCheckKeyLen, NULL, + NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(NULL, NULL, NULL, pubCheckKey, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(NULL, NULL, NULL, NULL, + &pubCheckKeyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(NULL , privCheckKey, + &privCheckKeyLen, pubCheckKey, &pubCheckKeyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(checkKey, NULL , + &privCheckKeyLen, pubCheckKey, &pubCheckKeyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(checkKey, privCheckKey, + NULL , pubCheckKey, &pubCheckKeyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(checkKey, privCheckKey, + &privCheckKeyLen, NULL , &pubCheckKeyLen), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(checkKey, privCheckKey, + &privCheckKeyLen, pubCheckKey, NULL ), BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_export_key(checkKey, privCheckKey, + &privCheckKeyLen, pubCheckKey, &pubCheckKeyLen), 0); + + /* Modify hash. */ + if (pubCheckKey != NULL) { + pubCheckKey[0] ^= 0x80; + ExpectIntEQ(wc_dilithium_import_key(NULL, 0, NULL, 0, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, 0, NULL, 0, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(NULL, 0, pubCheckKey, 0, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(NULL, 0, NULL, 0, checkKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(NULL , + privCheckKeyLen, pubCheckKey, pubCheckKeyLen, checkKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + 0 , pubCheckKey, pubCheckKeyLen, checkKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + privCheckKeyLen, NULL , pubCheckKeyLen, checkKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + privCheckKeyLen, pubCheckKey, 0 , checkKey), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + privCheckKeyLen, pubCheckKey, pubCheckKeyLen, NULL ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + privCheckKeyLen, pubCheckKey, pubCheckKeyLen, checkKey), 0); + ExpectIntEQ(wc_dilithium_check_key(checkKey), PUBLIC_KEY_E); + pubCheckKey[0] ^= 0x80; + + /* Modify encoded t1. */ + pubCheckKey[48] ^= 0x80; + ExpectIntEQ(wc_dilithium_import_key(privCheckKey, + privCheckKeyLen,pubCheckKey, pubCheckKeyLen, checkKey), 0); + ExpectIntEQ(wc_dilithium_check_key(checkKey), PUBLIC_KEY_E); + pubCheckKey[48] ^= 0x80; + } + + wc_dilithium_free(checkKey); + wc_FreeRng(&rng); + + XFREE(pubCheckKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(privCheckKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(checkKey, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_dilithium_der(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) && \ + !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) +#define DILITHIUM_MAX_DER_SIZE 8192 + dilithium_key* key; + WC_RNG rng; + byte* der = NULL; + int len; + int pubLen; + int pubDerLen; + int privDerLen; + int keyDerLen; + word32 idx; + +#ifndef WOLFSSL_NO_ML_DSA_44 + pubLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE; + pubDerLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE + 24; + privDerLen = DILITHIUM_LEVEL2_KEY_SIZE + 30; + keyDerLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE + DILITHIUM_LEVEL2_KEY_SIZE + 34; +#elif !defined(WOLFSSL_NO_ML_DSA_65) + pubLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE; + pubDerLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE + 24; + privDerLen = DILITHIUM_LEVEL3_KEY_SIZE + 30; + keyDerLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE + DILITHIUM_LEVEL3_KEY_SIZE + 34; +#else + pubLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE; + pubDerLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE + 24; + privDerLen = DILITHIUM_LEVEL5_KEY_SIZE + 30; + keyDerLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE + DILITHIUM_LEVEL5_KEY_SIZE + 34; +#endif + + key = (dilithium_key*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + der = (byte*)XMALLOC(DILITHIUM_MAX_DER_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(der); + + if (key != NULL) { + XMEMSET(key, 0, sizeof(*key)); + } + XMEMSET(&rng, 0, sizeof(WC_RNG)); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_dilithium_init(key), 0); + + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE, + 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der, &idx, key, pubDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, privDerLen), + BAD_FUNC_ARG); + +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), 0); +#elif !defined(WOLFSSL_NO_ML_DSA_65) + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), 0); +#else + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), 0); +#endif + + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE, + 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), + BAD_FUNC_ARG); + + ExpectIntEQ(wc_dilithium_make_key(key, &rng), 0); + + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(NULL, NULL, 0 , + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(NULL, der , 0 , + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(NULL, NULL, DILITHIUM_MAX_DER_SIZE, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(NULL, der , DILITHIUM_MAX_DER_SIZE, + 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key , der , 0 , + 0), BUFFER_E); + /* Get length only. */ + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key , NULL, 0 , + 0), pubLen); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE, + 0), pubLen); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key , NULL, 0 , + 1), pubDerLen); + ExpectIntEQ(wc_Dilithium_PublicKeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE, + 1), pubDerLen); + + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, NULL, + 0 ), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, + 0 ), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, der , + 0 ), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, NULL, + DILITHIUM_MAX_DER_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(NULL, der , + DILITHIUM_MAX_DER_SIZE), BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , der , + 0 ), BAD_FUNC_ARG); + /* Get length only. */ + ExpectIntEQ(wc_Dilithium_PrivateKeyToDer(key , NULL, + DILITHIUM_MAX_DER_SIZE), privDerLen); + + ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, der , 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, NULL, DILITHIUM_MAX_DER_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_KeyToDer(NULL, der , DILITHIUM_MAX_DER_SIZE), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_KeyToDer(key , der , 0 ), + BAD_FUNC_ARG); + /* Get length only. */ + ExpectIntEQ(wc_Dilithium_KeyToDer(key , NULL, DILITHIUM_MAX_DER_SIZE), + keyDerLen); + + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(NULL, NULL, NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der , NULL, NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(NULL, &idx, NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(NULL, NULL, key , 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(NULL, NULL, NULL, pubDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(NULL, &idx, key , pubDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der , NULL, key , pubDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der , &idx, NULL, pubDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der , &idx, key , 0 ), + BAD_FUNC_ARG); + + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(NULL, NULL, NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der , NULL, NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(NULL, &idx, NULL, 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(NULL, NULL, key , 0 ), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(NULL, NULL, NULL, privDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(NULL, &idx, key , privDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der , NULL, key , privDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der , &idx, NULL, privDerLen), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der , &idx, key , 0 ), + BAD_FUNC_ARG); + + ExpectIntEQ(len = wc_Dilithium_PublicKeyToDer(key, der, + DILITHIUM_MAX_DER_SIZE, 0), pubLen); + ExpectIntEQ(wc_dilithium_import_public(der, len, key), 0); + + ExpectIntEQ(len = wc_Dilithium_PublicKeyToDer(key, der, + DILITHIUM_MAX_DER_SIZE, 1), pubDerLen); + idx = 0; + ExpectIntEQ(wc_Dilithium_PublicKeyDecode(der, &idx, key, len), 0); + + ExpectIntEQ(len = wc_Dilithium_PrivateKeyToDer(key, der, + DILITHIUM_MAX_DER_SIZE), privDerLen); + idx = 0; + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, len), 0); + + ExpectIntEQ(len = wc_Dilithium_KeyToDer(key, der, DILITHIUM_MAX_DER_SIZE), + keyDerLen); + idx = 0; + ExpectIntEQ(wc_Dilithium_PrivateKeyDecode(der, &idx, key, len), 0); + + + wc_dilithium_free(key); + wc_FreeRng(&rng); + + XFREE(der, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_dilithium_make_key_from_seed(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && defined(WOLFSSL_WC_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) + dilithium_key* key; +#ifndef WOLFSSL_NO_ML_DSA_44 + static const byte seed_44[] = { + 0xBA, 0xC0, 0x59, 0x52, 0x75, 0x5B, 0x26, 0x47, + 0x01, 0xCA, 0x7D, 0x80, 0x6D, 0xFA, 0x08, 0x35, + 0x10, 0x28, 0xF6, 0x7B, 0x0E, 0x83, 0xC4, 0x24, + 0x01, 0x6F, 0x66, 0xCC, 0x83, 0x87, 0xD4, 0x69 + }; + static const byte pk_44[] = { + 0x86, 0xF0, 0x0C, 0x20, 0xE0, 0xDA, 0xEE, 0x5E, + 0x1E, 0xDE, 0x71, 0x39, 0x49, 0x0C, 0xC8, 0xCF, + 0xEF, 0xC9, 0xAB, 0x62, 0x3B, 0x8D, 0xEF, 0x0B, + 0xD8, 0x03, 0x12, 0x5B, 0x4A, 0xB2, 0x83, 0x61, + 0xED, 0x7E, 0xA9, 0xED, 0x2D, 0xED, 0x5A, 0x71, + 0xDD, 0xAE, 0x4A, 0x06, 0xE0, 0x2A, 0x5A, 0xAF, + 0x99, 0x69, 0x89, 0xC6, 0xAF, 0xE3, 0x2A, 0xFE, + 0x3D, 0x6E, 0x0A, 0x46, 0x71, 0x48, 0xD7, 0x17, + 0x99, 0x20, 0x01, 0x78, 0xD5, 0x8B, 0x40, 0xCB, + 0x81, 0xA0, 0x33, 0x38, 0xAE, 0x2B, 0x83, 0x4A, + 0xFD, 0x5F, 0xE0, 0xB7, 0xEE, 0xA0, 0xC4, 0x3D, + 0xB6, 0xA4, 0xD5, 0x59, 0x4B, 0xDD, 0x87, 0x1A, + 0xFC, 0x03, 0x30, 0xA0, 0xB3, 0xAD, 0x75, 0x3C, + 0xD4, 0x47, 0x72, 0x59, 0xCE, 0xB7, 0x80, 0xFD, + 0x34, 0x35, 0x5E, 0x96, 0xC8, 0x42, 0xD9, 0xDD, + 0x6C, 0xF1, 0xAB, 0xEF, 0x48, 0xD1, 0xA8, 0x02, + 0x02, 0x0F, 0x5B, 0x71, 0x4D, 0x36, 0x1E, 0x0D, + 0xC2, 0x09, 0x46, 0x7B, 0xF9, 0xEA, 0x24, 0x8F, + 0x7C, 0xCF, 0xB8, 0x9C, 0xF7, 0x49, 0x15, 0x8E, + 0x16, 0x49, 0x7E, 0xC5, 0x54, 0xF5, 0x03, 0x1D, + 0x16, 0x12, 0x02, 0x72, 0x1B, 0x38, 0x2D, 0x58, + 0x53, 0x15, 0x5E, 0xB6, 0x72, 0xCC, 0xA1, 0x09, + 0xB0, 0x2F, 0x10, 0xFA, 0x21, 0x45, 0x46, 0x37, + 0xD4, 0xFA, 0x7F, 0xFB, 0xB0, 0xD9, 0x20, 0xE2, + 0xCB, 0x56, 0xB3, 0x1E, 0xDF, 0x82, 0x67, 0x25, + 0x09, 0xD1, 0x8F, 0xFF, 0xE0, 0x43, 0xBD, 0x37, + 0x2B, 0x73, 0x0E, 0x13, 0x08, 0xC9, 0x49, 0x88, + 0x69, 0x69, 0xD9, 0x8C, 0x86, 0xE4, 0x7E, 0x63, + 0x35, 0xC5, 0xE1, 0xD0, 0x14, 0x9A, 0x89, 0x27, + 0x28, 0x17, 0xB0, 0x5B, 0x7A, 0x8F, 0xDD, 0x72, + 0x8B, 0x0A, 0x0D, 0x49, 0x58, 0x59, 0x2F, 0x0D, + 0x8F, 0x3D, 0x16, 0xCE, 0x7B, 0x11, 0xC7, 0x06, + 0x5D, 0xD5, 0x6D, 0x7B, 0x96, 0xED, 0x1E, 0x1A, + 0xF4, 0x10, 0x85, 0xDA, 0xDE, 0x84, 0x2F, 0x2B, + 0xBA, 0xFB, 0xA2, 0x5F, 0x33, 0x7D, 0x7C, 0x18, + 0x6B, 0xDF, 0x43, 0x3C, 0xE9, 0xEB, 0xB4, 0xC5, + 0x8E, 0x52, 0xF5, 0x7E, 0x4C, 0x3E, 0x6A, 0x33, + 0x41, 0x4C, 0x14, 0x05, 0x8E, 0x2C, 0x19, 0x0E, + 0x86, 0x91, 0x66, 0xDE, 0xF6, 0x4B, 0x35, 0xC2, + 0xDF, 0x3D, 0x4C, 0x7B, 0xC5, 0x58, 0x5E, 0x86, + 0x89, 0x6A, 0xFC, 0x86, 0x48, 0x75, 0xD1, 0x18, + 0xD1, 0xCB, 0x41, 0xC0, 0xF6, 0xD8, 0x87, 0x79, + 0xD9, 0xA2, 0x56, 0x2E, 0x83, 0x26, 0x11, 0xC1, + 0x4B, 0x53, 0x37, 0x85, 0x62, 0xFF, 0x6A, 0x67, + 0xFD, 0x18, 0x79, 0xD7, 0x55, 0x9B, 0xF7, 0x64, + 0xA9, 0x21, 0xB6, 0x1B, 0xF6, 0x11, 0x85, 0xF8, + 0xC0, 0x68, 0xDE, 0x61, 0x0C, 0x61, 0x7E, 0x8E, + 0xED, 0x9E, 0x58, 0x84, 0x16, 0x1A, 0x28, 0xC5, + 0x41, 0x63, 0xB3, 0xF0, 0x82, 0xAA, 0xE8, 0x36, + 0x81, 0x5C, 0xD3, 0xB7, 0xFB, 0x92, 0xF4, 0x7A, + 0x1E, 0x85, 0xA2, 0xB7, 0x21, 0xD5, 0xFA, 0xC8, + 0xE8, 0x02, 0x43, 0x5B, 0x56, 0x42, 0x03, 0x17, + 0x67, 0xEE, 0x3E, 0x31, 0x23, 0x63, 0xC7, 0x33, + 0x95, 0xDE, 0x07, 0xF6, 0x11, 0x3A, 0x2C, 0x3F, + 0x7B, 0xBB, 0x2D, 0x5C, 0x23, 0xF9, 0x2F, 0x9C, + 0x51, 0x19, 0x9F, 0x35, 0xC3, 0x18, 0x9F, 0x83, + 0x6E, 0xA8, 0x03, 0xF1, 0x79, 0x1F, 0xB0, 0xC8, + 0x2F, 0xF4, 0x2E, 0x9A, 0x26, 0xF3, 0x44, 0x02, + 0x8F, 0x45, 0x8B, 0xB0, 0x25, 0x1D, 0xF2, 0xD4, + 0x55, 0xB7, 0x65, 0xEF, 0xDB, 0x3D, 0x8E, 0x92, + 0xC8, 0xA0, 0x63, 0x4C, 0x38, 0xA3, 0x54, 0xD3, + 0xC2, 0x5A, 0x2A, 0x6A, 0x15, 0x27, 0x2A, 0xE2, + 0xFC, 0x25, 0xB6, 0xC8, 0x68, 0xEB, 0xED, 0x2D, + 0x23, 0xE8, 0x6D, 0x5C, 0xDD, 0x3F, 0x18, 0xB4, + 0x6E, 0x79, 0x36, 0xC9, 0x1C, 0xB4, 0x92, 0x41, + 0xAD, 0x35, 0xD4, 0x15, 0xE4, 0x64, 0x1C, 0x51, + 0xCB, 0x0C, 0x41, 0xB7, 0xFD, 0xC1, 0x09, 0x3E, + 0xD2, 0x4D, 0x38, 0x88, 0x77, 0x1C, 0x71, 0x91, + 0x74, 0xD3, 0x28, 0xE0, 0xCE, 0x9A, 0x11, 0x8D, + 0xBF, 0x4D, 0x8D, 0xF0, 0x44, 0xF6, 0x79, 0xFC, + 0x4C, 0xAD, 0x17, 0x88, 0xC0, 0x8C, 0x0B, 0x7A, + 0x90, 0x01, 0x53, 0x6C, 0x6B, 0x44, 0xF6, 0xE5, + 0x2E, 0xEC, 0x44, 0x4F, 0xB8, 0x9B, 0x10, 0xBE, + 0xCF, 0x55, 0x55, 0x29, 0x83, 0xB8, 0xD0, 0x25, + 0x5B, 0xCE, 0x8F, 0xA5, 0xB7, 0x6C, 0xA7, 0x47, + 0x65, 0xA9, 0xE9, 0x9B, 0xA5, 0xBC, 0x28, 0x1D, + 0x9F, 0x1F, 0x5E, 0x97, 0x42, 0x10, 0x84, 0x92, + 0xFB, 0x38, 0x0B, 0x2E, 0xAC, 0x79, 0x0A, 0x7D, + 0x00, 0x2C, 0x35, 0xD0, 0x54, 0x0D, 0x28, 0xE7, + 0xAB, 0x06, 0x02, 0xDA, 0x89, 0xA3, 0x06, 0x8E, + 0x13, 0x9A, 0xA7, 0xCA, 0x48, 0x09, 0xB0, 0x48, + 0x37, 0x08, 0xA7, 0x7D, 0xDA, 0xEB, 0x58, 0x64, + 0x39, 0xB3, 0xF3, 0xB2, 0x4C, 0x00, 0x4B, 0xCB, + 0x94, 0x36, 0xD4, 0x7C, 0x73, 0x45, 0xC8, 0x93, + 0xE5, 0x2A, 0x11, 0xF0, 0xEF, 0x0C, 0xED, 0x5F, + 0x8B, 0x0C, 0x86, 0xAD, 0x3A, 0x01, 0x07, 0x1A, + 0xC0, 0x34, 0xE8, 0x74, 0x21, 0x27, 0x73, 0x56, + 0x93, 0x76, 0x5D, 0x80, 0x59, 0xB4, 0xA4, 0xDC, + 0x80, 0xE7, 0xCE, 0x70, 0x0E, 0x0F, 0xEC, 0x56, + 0x42, 0x6E, 0x9C, 0x76, 0x3D, 0xF6, 0xB4, 0x41, + 0xE2, 0x3E, 0xAC, 0x25, 0xE7, 0x86, 0xA7, 0xA7, + 0x0A, 0x0D, 0x5D, 0x04, 0x1F, 0x45, 0xD4, 0x5B, + 0x42, 0x38, 0x4C, 0x60, 0xE7, 0xB7, 0x0D, 0xC7, + 0x28, 0x4F, 0xA5, 0x4E, 0x0C, 0x1B, 0xC4, 0xDA, + 0x50, 0x1A, 0xA0, 0x93, 0xAE, 0x10, 0x9A, 0x1A, + 0xC8, 0xC6, 0x56, 0xFC, 0x0A, 0xEA, 0x89, 0x3A, + 0x28, 0x21, 0xE9, 0x52, 0x9D, 0xEB, 0x07, 0x68, + 0xC1, 0x57, 0x32, 0x25, 0x1F, 0x93, 0x5D, 0x35, + 0xB2, 0x4B, 0x58, 0x30, 0xAF, 0x51, 0xC6, 0x7D, + 0x47, 0xD1, 0xA2, 0xAD, 0xDE, 0x75, 0x48, 0x84, + 0x74, 0x19, 0x74, 0x18, 0xA0, 0x2C, 0xD8, 0xB2, + 0xFE, 0x44, 0x78, 0x95, 0x6A, 0xBF, 0x56, 0x4D, + 0x20, 0x79, 0xE7, 0xE2, 0xE3, 0x56, 0x69, 0xB3, + 0xFA, 0xE1, 0xEB, 0xE6, 0x11, 0xAC, 0x18, 0xB3, + 0x98, 0xC1, 0x04, 0x20, 0x96, 0x4B, 0xAD, 0xDE, + 0x5B, 0x18, 0xEB, 0x7B, 0xBC, 0x15, 0x11, 0x57, + 0x29, 0x10, 0xE5, 0x80, 0x78, 0x4A, 0xF0, 0x87, + 0xF6, 0xD1, 0x3C, 0x23, 0xC5, 0xF4, 0x2D, 0xD7, + 0xAB, 0xA4, 0xD7, 0xB8, 0x45, 0x8E, 0x04, 0x1B, + 0x78, 0x59, 0x9F, 0x81, 0xE6, 0x04, 0xDF, 0x70, + 0x2B, 0x14, 0x74, 0x16, 0x49, 0xDA, 0xF0, 0xE1, + 0xC8, 0x29, 0xCC, 0x87, 0x8C, 0x2F, 0xFB, 0x18, + 0x3B, 0x47, 0xFC, 0x79, 0x04, 0x84, 0xCB, 0x0A, + 0xD2, 0x64, 0xBF, 0x86, 0xEA, 0x01, 0xAC, 0xE0, + 0xBD, 0xEC, 0x3B, 0xE1, 0xA7, 0x6C, 0xDE, 0x1D, + 0x58, 0x76, 0xCC, 0x53, 0x9E, 0xF6, 0xC6, 0xD4, + 0x2C, 0x87, 0x92, 0xA2, 0x89, 0x27, 0x31, 0x33, + 0x01, 0xA5, 0xA2, 0xE8, 0x8F, 0x13, 0x19, 0x0F, + 0xFD, 0x73, 0xB9, 0x91, 0xBD, 0xB8, 0x80, 0x9A, + 0xA3, 0xB1, 0x21, 0x6C, 0x91, 0x13, 0x8A, 0xAE, + 0xC7, 0xCB, 0x67, 0x14, 0xD1, 0xC0, 0x28, 0x89, + 0x04, 0x8C, 0x9F, 0xDE, 0xA0, 0x9A, 0x99, 0xA8, + 0x61, 0xE6, 0x8F, 0x8E, 0x39, 0xEF, 0x6B, 0x5E, + 0x84, 0x5F, 0x5D, 0x24, 0x37, 0x73, 0x9D, 0x75, + 0xC4, 0xEF, 0xE2, 0xA1, 0xF2, 0xBC, 0x0D, 0xE1, + 0x0D, 0xEC, 0xFA, 0xEE, 0xC1, 0x63, 0xC8, 0x2E, + 0x7D, 0x85, 0x65, 0xC3, 0xF2, 0x0D, 0x8B, 0x73, + 0xF9, 0x3B, 0x0B, 0x3D, 0x49, 0x8B, 0xFB, 0x16, + 0x5B, 0x75, 0x48, 0x9B, 0x56, 0x0A, 0x83, 0x4C, + 0x0D, 0x13, 0xB2, 0xB4, 0x25, 0xC7, 0x2C, 0xCB, + 0xA7, 0x9E, 0xCA, 0x41, 0x44, 0x14, 0x9A, 0x03, + 0xD3, 0x01, 0x8C, 0xB0, 0xD5, 0xA9, 0x36, 0xA4, + 0x16, 0x21, 0x49, 0x0A, 0x99, 0xA1, 0x89, 0xA5, + 0x91, 0x10, 0xA2, 0x1B, 0x3F, 0x98, 0x1E, 0x1C, + 0x43, 0xAA, 0x9C, 0x16, 0x5A, 0xF0, 0x18, 0x64, + 0x0F, 0x6A, 0xE3, 0x97, 0x83, 0x31, 0x4E, 0x84, + 0xC9, 0xEA, 0xD8, 0x9F, 0xEA, 0x9E, 0xD6, 0xF2, + 0x0E, 0x15, 0xA5, 0x48, 0x15, 0x8B, 0x10, 0x1D, + 0x77, 0x78, 0x1B, 0x54, 0x03, 0xC1, 0x2C, 0xB1, + 0xC8, 0x22, 0x11, 0x9D, 0xB8, 0x82, 0x94, 0x26, + 0xA0, 0xED, 0x6C, 0xAD, 0xA8, 0x03, 0xC2, 0xED, + 0x02, 0x74, 0x3E, 0x54, 0xBD, 0x77, 0xA6, 0x0B, + 0x37, 0xFE, 0x04, 0xCD, 0x25, 0x10, 0x2D, 0x52, + 0xC2, 0xD4, 0x5B, 0x9B, 0xAE, 0xFE, 0x35, 0x73, + 0x16, 0x61, 0x84, 0x25, 0x1D, 0xBE, 0x95, 0x34, + 0xA4, 0xF6, 0xB9, 0xA4, 0xF9, 0xAA, 0x5D, 0x1E, + 0x49, 0xBB, 0x19, 0xD9, 0x64, 0xD7, 0x48, 0x1A, + 0x0A, 0x93, 0xC3, 0x69, 0x13, 0x12, 0x68, 0xBB, + 0x97, 0x97, 0xBD, 0x99, 0x69, 0xCE, 0xE6, 0xF5, + 0x84, 0x7B, 0xCC, 0xE4, 0x7D, 0xD3, 0xCD, 0x8A, + 0x7A, 0x4B, 0x98, 0xF4, 0x09, 0x9D, 0xEA, 0x5D, + 0x4E, 0x1F, 0xE1, 0x1E, 0x6C, 0x48, 0xD3, 0x5E, + 0x67, 0xD9, 0xFF, 0x64, 0x4D, 0xA7, 0x64, 0x7A, + 0x01, 0xB2, 0xE9, 0x63, 0x14, 0x10, 0xB7, 0x08, + 0x0C, 0xF9, 0x4D, 0x66, 0x48, 0x46, 0xE3, 0xC2, + 0x48, 0x6B, 0x47, 0xCE, 0x00, 0x98, 0x92, 0x83, + 0xF7, 0xE0, 0x1F, 0x96, 0xFA, 0x53, 0xD5, 0x49, + 0x1C, 0xC7, 0x89, 0xB4, 0xA5, 0x4B, 0x63, 0xBF, + 0xD2, 0x00, 0x79, 0xDD, 0xC1, 0x60, 0xAA, 0xF2, + 0x0F, 0x47, 0xB9, 0x4F, 0x8A, 0x66, 0x05, 0x3D, + 0x96, 0x36, 0x64, 0x48, 0x5F, 0x7E, 0x56, 0x2B, + 0xB3, 0x47, 0xE2, 0x76, 0x64, 0x21, 0x65, 0x34, + 0xFC, 0xDD, 0x2D, 0x4C, 0xE2, 0x99, 0x33, 0x04, + 0xE4, 0x26, 0x15, 0x37, 0x6C, 0x32, 0xB9, 0x17 + }; + static const byte sk_44[] = { + 0x86, 0xF0, 0x0C, 0x20, 0xE0, 0xDA, 0xEE, 0x5E, + 0x1E, 0xDE, 0x71, 0x39, 0x49, 0x0C, 0xC8, 0xCF, + 0xEF, 0xC9, 0xAB, 0x62, 0x3B, 0x8D, 0xEF, 0x0B, + 0xD8, 0x03, 0x12, 0x5B, 0x4A, 0xB2, 0x83, 0x61, + 0x73, 0x61, 0x49, 0x01, 0x0F, 0x94, 0x08, 0x30, + 0x26, 0x02, 0x12, 0x63, 0x64, 0x15, 0x7A, 0x4D, + 0xBA, 0xF5, 0x25, 0xA7, 0xAA, 0x0B, 0x7C, 0x3D, + 0xCE, 0x05, 0x91, 0x95, 0xEF, 0x17, 0x2F, 0xE2, + 0x5A, 0x03, 0x5E, 0x2E, 0x4D, 0xFA, 0xE7, 0x5F, + 0xCD, 0x61, 0x34, 0xFB, 0x3D, 0x3C, 0x5C, 0x60, + 0x1A, 0x6F, 0x09, 0xB5, 0x9D, 0xDD, 0x90, 0x53, + 0xF6, 0x89, 0x50, 0xC2, 0xE1, 0xED, 0x0A, 0x61, + 0x8F, 0xFA, 0xDC, 0x2D, 0xB2, 0x8B, 0xA1, 0x56, + 0xAC, 0x5E, 0x0E, 0xF1, 0x3B, 0x1E, 0x22, 0x9F, + 0xAA, 0x05, 0x96, 0xA3, 0x5E, 0x44, 0x86, 0xA8, + 0xBA, 0x15, 0xD1, 0x11, 0x7D, 0xAA, 0xD0, 0xAA, + 0x01, 0x27, 0x25, 0x04, 0x82, 0x89, 0xA4, 0x22, + 0x2E, 0xDB, 0x80, 0x45, 0xD2, 0x30, 0x45, 0x59, + 0x16, 0x64, 0xE2, 0x08, 0x86, 0x50, 0x00, 0x8E, + 0xCA, 0x08, 0x51, 0x5A, 0x06, 0x01, 0x54, 0x82, + 0x20, 0xC4, 0x92, 0x30, 0x02, 0x21, 0x4E, 0x0A, + 0x93, 0x89, 0x84, 0xB8, 0x70, 0x24, 0x40, 0x51, + 0x24, 0xB3, 0x44, 0xDB, 0x08, 0x40, 0x1B, 0x37, + 0x44, 0x21, 0x22, 0x8E, 0x8C, 0x16, 0x42, 0x10, + 0x22, 0x0E, 0xA1, 0xB2, 0x8D, 0x18, 0x49, 0x30, + 0xC1, 0x32, 0x69, 0x21, 0x03, 0x8E, 0x49, 0x44, + 0x08, 0xD3, 0x16, 0x89, 0x10, 0xA4, 0x25, 0x5C, + 0x22, 0x8A, 0xC0, 0xC8, 0x08, 0xC1, 0x04, 0x6A, + 0xD2, 0xA0, 0x50, 0x8A, 0x02, 0x52, 0x92, 0x16, + 0x44, 0x54, 0x30, 0x4A, 0x92, 0x32, 0x0C, 0x4C, + 0x44, 0x2D, 0x04, 0x15, 0x2A, 0x99, 0x24, 0x42, + 0x52, 0xA8, 0x30, 0x53, 0x24, 0x85, 0x9A, 0xB8, + 0x01, 0xE2, 0x08, 0x09, 0x23, 0x28, 0x08, 0xC4, + 0x98, 0x85, 0x0B, 0xB9, 0x40, 0x60, 0x26, 0x28, + 0x0A, 0x45, 0x12, 0x0C, 0x43, 0x84, 0x82, 0x16, + 0x89, 0xC4, 0x48, 0x28, 0x58, 0x18, 0x2A, 0x20, + 0x07, 0x02, 0xD3, 0x82, 0x45, 0x50, 0xB0, 0x50, + 0x64, 0x36, 0x91, 0x52, 0x02, 0x45, 0x5A, 0x42, + 0x26, 0x01, 0x28, 0x71, 0xD4, 0x86, 0x10, 0x19, + 0xC4, 0x68, 0xC4, 0x30, 0x66, 0xE0, 0x02, 0x49, + 0x18, 0x34, 0x05, 0x04, 0x02, 0x04, 0x90, 0x94, + 0x4C, 0x01, 0xA7, 0x80, 0x12, 0x97, 0x08, 0x19, + 0xC5, 0x41, 0x24, 0xC1, 0x61, 0x08, 0xB0, 0x0C, + 0x21, 0xC1, 0x49, 0x9B, 0x42, 0x51, 0x62, 0x18, + 0x22, 0x54, 0x06, 0x06, 0x93, 0x26, 0x70, 0x49, + 0x86, 0x91, 0x00, 0x28, 0x6C, 0x02, 0xC9, 0x60, + 0x13, 0xC3, 0x09, 0xCB, 0x14, 0x66, 0x09, 0x17, + 0x25, 0x1C, 0x16, 0x89, 0x01, 0xB6, 0x01, 0x60, + 0x86, 0x71, 0x58, 0x96, 0x04, 0x82, 0x38, 0x61, + 0x43, 0x40, 0x72, 0xCC, 0x46, 0x71, 0x81, 0x20, + 0x2C, 0x18, 0x20, 0x6E, 0x03, 0x91, 0x11, 0x9A, + 0x08, 0x89, 0x43, 0x06, 0x48, 0x64, 0x02, 0x6C, + 0x21, 0x33, 0x8D, 0x48, 0x16, 0x66, 0x9B, 0xA4, + 0x2D, 0x01, 0x10, 0x66, 0xDC, 0xB0, 0x25, 0x40, + 0xA0, 0x24, 0xA2, 0xB4, 0x44, 0xC8, 0x26, 0x61, + 0x0A, 0x10, 0x4E, 0xD0, 0x04, 0x11, 0x4A, 0x82, + 0x51, 0x03, 0x04, 0x6C, 0x18, 0x88, 0x6C, 0xE0, + 0x98, 0x41, 0x11, 0x29, 0x06, 0x62, 0x12, 0x8E, + 0xDA, 0x42, 0x91, 0x09, 0x48, 0x60, 0xD1, 0xB4, + 0x80, 0x10, 0x30, 0x30, 0x80, 0x38, 0x82, 0xD0, + 0x84, 0x0D, 0x08, 0x14, 0x92, 0x24, 0x41, 0x40, + 0x0C, 0x10, 0x89, 0xCC, 0x38, 0x8A, 0x13, 0xB6, + 0x89, 0x1A, 0xA7, 0x24, 0x5C, 0x10, 0x12, 0x1B, + 0x21, 0x50, 0x91, 0xB4, 0x29, 0x99, 0xB6, 0x51, + 0x04, 0xB1, 0x91, 0x59, 0xA6, 0x05, 0x19, 0x08, + 0x4A, 0x4A, 0x84, 0x6C, 0x1C, 0x49, 0x02, 0x44, + 0x20, 0x85, 0x14, 0xB1, 0x89, 0x09, 0x44, 0x2C, + 0x10, 0x02, 0x22, 0xE1, 0xB4, 0x25, 0x01, 0x21, + 0x71, 0x53, 0xC2, 0x85, 0x82, 0x88, 0x28, 0xC0, + 0x02, 0x52, 0x19, 0xC5, 0x51, 0x19, 0xA5, 0x09, + 0xC0, 0x82, 0x91, 0x21, 0x47, 0x0D, 0x1C, 0x30, + 0x69, 0xDC, 0xB8, 0x6C, 0x04, 0x41, 0x6A, 0x91, + 0x16, 0x40, 0xA0, 0xC8, 0x24, 0x1A, 0x10, 0x01, + 0x04, 0x39, 0x25, 0x80, 0x16, 0x02, 0x63, 0x36, + 0x71, 0x90, 0xB0, 0x8D, 0x44, 0x16, 0x8E, 0xDA, + 0x16, 0x2E, 0xCB, 0x44, 0x20, 0x54, 0x38, 0x06, + 0x54, 0xC4, 0x01, 0x51, 0x40, 0x86, 0x52, 0x44, + 0x0E, 0x82, 0x02, 0x32, 0x21, 0x38, 0x89, 0x19, + 0x04, 0x40, 0xD8, 0x12, 0x68, 0x21, 0x98, 0x11, + 0x03, 0x33, 0x8A, 0x18, 0x00, 0x45, 0xCB, 0x22, + 0x32, 0xC3, 0x04, 0x46, 0x09, 0x18, 0x51, 0x22, + 0x44, 0x89, 0x13, 0x16, 0x6E, 0xDA, 0x46, 0x45, + 0x09, 0x19, 0x41, 0x81, 0x10, 0x01, 0xDC, 0x18, + 0x8E, 0xC8, 0x44, 0x4C, 0x00, 0x17, 0x82, 0x9C, + 0xA6, 0x4D, 0xC8, 0x08, 0x10, 0x24, 0x42, 0x6D, + 0x91, 0x38, 0x89, 0x8C, 0x40, 0x6E, 0x00, 0x35, + 0x11, 0xD3, 0x24, 0x09, 0x1A, 0x01, 0x65, 0x88, + 0x48, 0x45, 0x09, 0x01, 0x71, 0x43, 0xB8, 0x80, + 0x11, 0x82, 0x2C, 0x84, 0xB8, 0x49, 0x58, 0x14, + 0x28, 0x92, 0x20, 0x32, 0x09, 0x12, 0x05, 0x20, + 0x81, 0x2D, 0x5B, 0x86, 0x11, 0x04, 0x90, 0x45, + 0x49, 0x80, 0x40, 0xD1, 0xC8, 0x24, 0x98, 0xC2, + 0x2C, 0x99, 0xA2, 0x30, 0x04, 0x98, 0x8C, 0x53, + 0x24, 0x02, 0x8A, 0x04, 0x01, 0x4C, 0x28, 0x71, + 0xC3, 0x86, 0x6C, 0x24, 0x49, 0x81, 0x04, 0x02, + 0x28, 0x62, 0x44, 0x32, 0x61, 0x20, 0x28, 0x01, + 0x04, 0x11, 0x0C, 0x09, 0x08, 0x90, 0x98, 0x84, + 0x63, 0xB2, 0x45, 0x63, 0x38, 0x2E, 0x04, 0xA4, + 0x0C, 0x18, 0x05, 0x4E, 0xCC, 0x86, 0x90, 0x43, + 0x40, 0x91, 0x54, 0x02, 0x21, 0x43, 0x28, 0x42, + 0x23, 0x94, 0x29, 0xC8, 0xA6, 0x91, 0x02, 0x09, + 0x80, 0xE3, 0x82, 0x00, 0xC1, 0x34, 0x08, 0xD1, + 0x34, 0x84, 0x12, 0x45, 0x8C, 0x02, 0xC6, 0x81, + 0x41, 0xC6, 0x6C, 0x1B, 0x12, 0x24, 0x04, 0x08, + 0x0D, 0x02, 0x00, 0x0C, 0x9C, 0xA2, 0x05, 0x49, + 0x34, 0x65, 0x00, 0x06, 0x89, 0x88, 0x34, 0x00, + 0xD8, 0x82, 0x29, 0x92, 0x12, 0x91, 0xE3, 0x36, + 0x86, 0xD1, 0x80, 0x71, 0x98, 0xB0, 0x50, 0x48, + 0xC6, 0x11, 0x14, 0x80, 0x0D, 0xA0, 0x12, 0x4D, + 0x9B, 0xB2, 0x40, 0x21, 0x41, 0x50, 0x4B, 0x36, + 0x05, 0x52, 0x10, 0x26, 0x19, 0xB2, 0x60, 0x92, + 0xA2, 0x24, 0xCB, 0x08, 0x00, 0x14, 0x22, 0x49, + 0x5A, 0xD0, 0x55, 0xBD, 0x2B, 0x45, 0xE4, 0x31, + 0x41, 0xA8, 0xC3, 0xA3, 0xAD, 0xBD, 0xB6, 0x37, + 0x92, 0x06, 0x95, 0x6B, 0x3D, 0xD8, 0xE5, 0x33, + 0x71, 0xB6, 0x62, 0xB7, 0x67, 0x6C, 0x77, 0x84, + 0x63, 0x2F, 0x41, 0x1D, 0xBA, 0x51, 0x27, 0xE1, + 0x24, 0x5D, 0xC2, 0x38, 0x71, 0x65, 0x9E, 0x8E, + 0xE4, 0xEB, 0xBB, 0x1D, 0x89, 0xEB, 0x18, 0xCA, + 0x0C, 0xA6, 0x86, 0xA3, 0x4D, 0x7C, 0x7A, 0x02, + 0xAC, 0xDD, 0x34, 0xCE, 0x05, 0x3B, 0x1B, 0x49, + 0xF4, 0x6D, 0x12, 0x33, 0xBC, 0x52, 0x70, 0x59, + 0xDF, 0xBC, 0x5D, 0x49, 0x42, 0x6A, 0xED, 0xC7, + 0xF1, 0x8C, 0xF5, 0x6D, 0x1F, 0xBC, 0xE4, 0xBD, + 0x45, 0x5D, 0x59, 0xF8, 0xCE, 0x9A, 0x39, 0xB5, + 0x96, 0x32, 0xFD, 0x93, 0x65, 0x8E, 0x92, 0xF1, + 0x8F, 0xB0, 0x99, 0xF3, 0x80, 0x0F, 0x66, 0x14, + 0xFE, 0xEB, 0x23, 0x17, 0x2D, 0x4C, 0x8F, 0x41, + 0x9A, 0x9B, 0xD1, 0x5B, 0x5B, 0xC0, 0x3D, 0xA6, + 0x0E, 0xF3, 0xE0, 0xA1, 0x04, 0xDC, 0x24, 0x18, + 0x9D, 0x90, 0xC6, 0x89, 0x5A, 0x7F, 0x10, 0x1E, + 0x4B, 0x21, 0xEC, 0x91, 0xD8, 0x5D, 0x65, 0xDB, + 0xCF, 0x90, 0x62, 0x85, 0xE9, 0x58, 0xA3, 0x47, + 0x92, 0x1C, 0xD0, 0x0C, 0xA3, 0xF3, 0x3E, 0x36, + 0xDB, 0x24, 0xA6, 0x98, 0xAB, 0xA7, 0x89, 0x2B, + 0x71, 0x6C, 0x4D, 0x00, 0xB0, 0xD5, 0xA0, 0xCA, + 0x1A, 0x76, 0x8E, 0x80, 0xB7, 0xAE, 0x83, 0x89, + 0x50, 0xF8, 0xA7, 0x52, 0x8B, 0x94, 0xD2, 0x2B, + 0x9F, 0x49, 0x92, 0x3D, 0x54, 0x0D, 0xB8, 0xD1, + 0x19, 0x49, 0xAC, 0x91, 0xAF, 0xDB, 0xE9, 0x24, + 0x4D, 0xD8, 0xE1, 0xD5, 0x16, 0x0E, 0xB1, 0x39, + 0x40, 0x7D, 0x5F, 0xF5, 0x92, 0xB4, 0xAF, 0xC3, + 0x76, 0x2B, 0xDB, 0x7D, 0x52, 0x97, 0x62, 0x9F, + 0xCF, 0x32, 0x19, 0x5F, 0xE6, 0x32, 0xFB, 0x8E, + 0x39, 0x24, 0xB4, 0xEB, 0xE9, 0x17, 0x9E, 0x47, + 0x69, 0x4D, 0x92, 0x82, 0x96, 0x88, 0x38, 0x11, + 0xCE, 0xD6, 0xBF, 0x18, 0xE3, 0x51, 0x40, 0x81, + 0x11, 0xA0, 0x74, 0xDA, 0x0D, 0x5E, 0xEC, 0xD8, + 0x5D, 0x33, 0x22, 0x1E, 0xB9, 0x5D, 0xBF, 0x79, + 0xB0, 0xA1, 0xEF, 0xD1, 0x2D, 0xA0, 0x5F, 0xA1, + 0xC7, 0x6E, 0xD5, 0x08, 0xB8, 0xD0, 0xC1, 0x95, + 0x51, 0x9B, 0x07, 0xC3, 0x4A, 0x0A, 0xB5, 0xA1, + 0x28, 0xFE, 0x95, 0x95, 0x0A, 0xCF, 0x83, 0xA8, + 0xEB, 0x8F, 0xFB, 0x18, 0xD5, 0xBD, 0x69, 0x50, + 0xF1, 0xDF, 0x06, 0xFA, 0x9A, 0x65, 0x47, 0xBB, + 0x56, 0xE9, 0xCB, 0x8F, 0x69, 0x5F, 0xE0, 0xAD, + 0x19, 0x3A, 0x70, 0xE5, 0x66, 0x42, 0xD7, 0x1C, + 0x0C, 0xB4, 0x03, 0x89, 0x7D, 0x47, 0x4D, 0x29, + 0x67, 0x8C, 0x41, 0x73, 0xAB, 0x7D, 0xFD, 0x69, + 0x15, 0xAD, 0xE3, 0xB7, 0xF8, 0x98, 0x3B, 0xCA, + 0x8F, 0x27, 0x37, 0x7B, 0x72, 0x2C, 0x5F, 0x23, + 0x73, 0x15, 0xE2, 0xB6, 0xBD, 0xDE, 0x84, 0xF8, + 0x7E, 0x22, 0xB9, 0xFD, 0xD3, 0x4D, 0x62, 0x80, + 0xBA, 0xC5, 0x57, 0x29, 0x30, 0x1B, 0x06, 0x4D, + 0x20, 0xB1, 0x53, 0x86, 0xCB, 0x6A, 0x4A, 0xE3, + 0xC1, 0xA9, 0x88, 0xCF, 0xEB, 0x15, 0x2F, 0xA8, + 0xA8, 0x6F, 0xFC, 0x2A, 0xA8, 0x0E, 0xD9, 0xFA, + 0xEA, 0xD7, 0x3B, 0xCE, 0xF8, 0x5B, 0xD8, 0x92, + 0x22, 0x6A, 0x1A, 0x8E, 0x5E, 0x91, 0x37, 0x2C, + 0x21, 0x05, 0xC4, 0xAC, 0xF7, 0x62, 0x83, 0xBA, + 0x55, 0xD5, 0x2C, 0xCE, 0xA1, 0x19, 0x93, 0x0E, + 0xDE, 0xB6, 0xB8, 0x78, 0x0F, 0xBF, 0x4C, 0xA4, + 0x66, 0xAD, 0x97, 0x2F, 0xEE, 0x34, 0xE9, 0xA2, + 0xB6, 0x1D, 0x3C, 0x60, 0xFB, 0xB8, 0x7F, 0xF8, + 0xFD, 0x34, 0x8C, 0xC5, 0xC7, 0x38, 0x72, 0x74, + 0x19, 0xA9, 0xCF, 0x54, 0x49, 0x5B, 0xBA, 0x70, + 0x12, 0xC1, 0x61, 0xDC, 0x32, 0x61, 0x49, 0x66, + 0xF3, 0x57, 0xAA, 0x0F, 0xE6, 0x44, 0x9E, 0x8A, + 0x19, 0x9C, 0x6B, 0x63, 0x2C, 0x14, 0x1E, 0xDD, + 0x00, 0x27, 0xE3, 0x95, 0xE3, 0xE7, 0xD9, 0xFF, + 0x30, 0x2D, 0x14, 0x19, 0x4F, 0x49, 0x20, 0x0B, + 0x58, 0x2A, 0x23, 0x1C, 0xE2, 0xAD, 0x6B, 0x9C, + 0x7B, 0xB6, 0x20, 0x63, 0x08, 0x24, 0x55, 0x04, + 0x58, 0x1F, 0x0E, 0xBE, 0x2A, 0x6F, 0x79, 0x90, + 0x9E, 0x15, 0x8F, 0x4B, 0xDB, 0xE2, 0xBE, 0xBC, + 0x28, 0xB1, 0xC8, 0xFE, 0x00, 0x6D, 0x71, 0xCC, + 0x91, 0x6A, 0xCC, 0xF8, 0x12, 0x8B, 0xEC, 0xF3, + 0x46, 0x53, 0xB1, 0x7F, 0xB3, 0x79, 0xF0, 0xC7, + 0xD7, 0xA5, 0xCF, 0x2C, 0xC3, 0x09, 0x66, 0x82, + 0x53, 0x43, 0xFD, 0xAC, 0xDE, 0xD5, 0x85, 0xB3, + 0x79, 0x74, 0x55, 0xE8, 0xF6, 0xE5, 0xFB, 0xF0, + 0x63, 0x0C, 0x36, 0x63, 0x65, 0x10, 0x43, 0xC9, + 0x60, 0x99, 0xD6, 0x0C, 0xB9, 0x66, 0x1C, 0xA9, + 0x97, 0x4D, 0xDB, 0xA8, 0x13, 0x9E, 0xAE, 0xCA, + 0x7A, 0x5F, 0xE3, 0x24, 0xA0, 0xEE, 0x8A, 0x9D, + 0x7F, 0x03, 0x53, 0x21, 0x6B, 0xAF, 0x3D, 0xF9, + 0x38, 0xF3, 0x7A, 0x1D, 0xDA, 0xE2, 0xEF, 0xBA, + 0x86, 0x21, 0x85, 0x1F, 0x36, 0x08, 0x0B, 0xDA, + 0x37, 0x5A, 0x0A, 0xD7, 0x55, 0x41, 0xD5, 0x84, + 0x1B, 0x36, 0xA2, 0x50, 0x65, 0xD7, 0xF3, 0xA3, + 0xEB, 0xE1, 0xDE, 0x0F, 0x85, 0xAA, 0xF6, 0x2F, + 0xAB, 0xBB, 0xC8, 0xF1, 0x2A, 0xD1, 0x0A, 0x9B, + 0xE4, 0x7B, 0xBC, 0x4D, 0x42, 0xD8, 0xA3, 0x4C, + 0x07, 0x6A, 0x60, 0x3E, 0xE2, 0xDA, 0xE7, 0x00, + 0xDF, 0x27, 0x94, 0xEF, 0x90, 0x99, 0x88, 0x2C, + 0xCF, 0xAA, 0xE1, 0x71, 0x2D, 0xFD, 0x00, 0x9C, + 0x55, 0xBF, 0xC4, 0x7A, 0x55, 0xE9, 0xE0, 0xB4, + 0x7F, 0x3D, 0xE9, 0xB0, 0x01, 0xA7, 0x27, 0x23, + 0x27, 0x58, 0x31, 0x0E, 0x8E, 0x80, 0xD8, 0xEB, + 0x64, 0xA0, 0xC3, 0xC9, 0xEA, 0x69, 0x9C, 0x74, + 0x5E, 0xAF, 0xD5, 0xEF, 0x5C, 0x4E, 0x40, 0x71, + 0xD6, 0x57, 0x77, 0xE2, 0xAF, 0x0E, 0x1D, 0xB8, + 0x5A, 0x91, 0x20, 0x4C, 0x33, 0x4D, 0xD8, 0x4F, + 0x98, 0xE0, 0x86, 0x1D, 0x02, 0xA0, 0xDA, 0x06, + 0x17, 0xC4, 0x5D, 0x2E, 0x49, 0x31, 0xE6, 0xE4, + 0xDC, 0x18, 0x23, 0x26, 0xF3, 0x61, 0xF5, 0x8D, + 0x26, 0x2C, 0x18, 0x4C, 0xDF, 0x71, 0x90, 0x24, + 0x96, 0xD3, 0xD4, 0x1A, 0x6F, 0x08, 0xAB, 0x29, + 0x7D, 0xFF, 0x4E, 0x27, 0x6D, 0x39, 0x83, 0x17, + 0x90, 0xA4, 0x07, 0x8A, 0xDE, 0x79, 0x53, 0xF6, + 0x99, 0x2E, 0xA6, 0x39, 0x47, 0xC3, 0xBE, 0x12, + 0xC7, 0xA5, 0x7E, 0xA2, 0x19, 0x57, 0x04, 0x45, + 0xBE, 0x44, 0x62, 0x92, 0xCA, 0x56, 0xE1, 0xF0, + 0x45, 0x3B, 0xA4, 0xF8, 0xF5, 0xCD, 0xC7, 0xD2, + 0xB2, 0x46, 0x57, 0x51, 0x0B, 0x06, 0xDA, 0x54, + 0x03, 0x9E, 0x52, 0xA2, 0x78, 0x69, 0x25, 0x2E, + 0x75, 0x83, 0x25, 0x3F, 0xA3, 0x62, 0x27, 0xB9, + 0xA6, 0x59, 0x7A, 0xB1, 0xB6, 0xE9, 0xC1, 0xDD, + 0x2F, 0x22, 0x2D, 0x3B, 0xA3, 0x22, 0xD6, 0x11, + 0x7B, 0x08, 0x27, 0x92, 0x83, 0x7A, 0x5D, 0x0D, + 0x6B, 0x9D, 0x5B, 0xEB, 0xE9, 0xC0, 0x88, 0xDE, + 0x44, 0x55, 0xBA, 0x69, 0xC1, 0x7A, 0x4D, 0xE6, + 0x35, 0x67, 0x6F, 0x99, 0x9B, 0x07, 0xD8, 0x04, + 0xAA, 0xEA, 0x7D, 0xFF, 0x8E, 0xB8, 0xAA, 0x4C, + 0x79, 0xE2, 0x88, 0xA8, 0x1D, 0xE8, 0xA6, 0x77, + 0xCA, 0x06, 0xC0, 0xDF, 0x0E, 0x2B, 0xCB, 0xFF, + 0x9F, 0x64, 0x67, 0x11, 0xF1, 0xB9, 0x38, 0x83, + 0x19, 0x05, 0x30, 0x9B, 0x01, 0x11, 0x55, 0x03, + 0xAD, 0x44, 0x7D, 0x3C, 0x07, 0xEF, 0x88, 0x19, + 0x92, 0xC0, 0xFE, 0xE1, 0xAB, 0xDB, 0x24, 0x18, + 0x17, 0xD0, 0x03, 0x5C, 0x91, 0xD4, 0xA6, 0x2A, + 0xF1, 0xE9, 0x72, 0x62, 0x58, 0x22, 0x7D, 0x55, + 0x15, 0xE2, 0xA1, 0x70, 0x14, 0x5E, 0x34, 0xB9, + 0x5A, 0xB7, 0x5D, 0x3F, 0xB8, 0xB5, 0x45, 0x44, + 0xD2, 0x50, 0xD1, 0xC6, 0x7E, 0xE7, 0x3D, 0xF4, + 0xD3, 0xEC, 0xFB, 0x97, 0x32, 0x11, 0x72, 0x51, + 0xB7, 0x4A, 0xC8, 0x38, 0x96, 0xFC, 0x6F, 0x69, + 0xC2, 0xD5, 0xD3, 0x28, 0xE9, 0x63, 0x14, 0x14, + 0xFE, 0xB1, 0xA4, 0x02, 0x80, 0x65, 0x73, 0xD3, + 0x57, 0x07, 0x95, 0x21, 0x40, 0x00, 0x77, 0xA7, + 0x6D, 0x44, 0x2B, 0x0D, 0x77, 0x07, 0x92, 0x64, + 0xD4, 0x3A, 0xE2, 0x7F, 0xF2, 0x1C, 0x14, 0x08, + 0x60, 0x74, 0x8F, 0xFC, 0x0B, 0xE8, 0xEC, 0xA9, + 0xB7, 0x97, 0xA7, 0x85, 0x8A, 0xEF, 0xD7, 0x7E, + 0xD5, 0x15, 0xF7, 0x45, 0x8D, 0x9C, 0xBF, 0x23, + 0xEB, 0x8C, 0x4D, 0xD2, 0x28, 0x7E, 0x0A, 0x61, + 0x2E, 0xBA, 0xBE, 0x89, 0x1D, 0x64, 0x45, 0x22, + 0x70, 0x9D, 0x48, 0xEB, 0x2F, 0x96, 0xF1, 0xA7, + 0xDE, 0xD3, 0x28, 0x4C, 0xC9, 0xFB, 0xF2, 0x9C, + 0x5B, 0xFC, 0xBE, 0xBE, 0xF4, 0x38, 0xC9, 0x43, + 0xC3, 0x66, 0x53, 0xA9, 0x06, 0xE5, 0x71, 0x16, + 0xA4, 0xBB, 0x3B, 0x50, 0x53, 0xCF, 0xF4, 0x1F, + 0xD6, 0x00, 0x07, 0x46, 0xFB, 0x97, 0x0B, 0xF9, + 0x3D, 0xF4, 0xC6, 0x60, 0xD0, 0x37, 0x70, 0xC0, + 0x2D, 0xD1, 0x9F, 0xA5, 0x78, 0xF3, 0x1F, 0x03, + 0x81, 0xB1, 0x93, 0xBA, 0xE5, 0x82, 0xE6, 0xD1, + 0x66, 0x93, 0x83, 0x5B, 0xB9, 0xAD, 0xD9, 0x01, + 0xA5, 0xB6, 0x5C, 0x69, 0x82, 0xD7, 0x2F, 0x35, + 0x35, 0x98, 0xEE, 0xE9, 0xA0, 0x74, 0xC1, 0x91, + 0x44, 0x0A, 0x04, 0xCD, 0x97, 0xBE, 0x6B, 0x60, + 0x90, 0x9A, 0x48, 0x7B, 0x83, 0xA2, 0x28, 0x97, + 0xB5, 0xBA, 0xB1, 0x4D, 0x35, 0x8B, 0x34, 0x0A, + 0xA1, 0xCB, 0xA5, 0xC2, 0xA4, 0x6A, 0x36, 0xB3, + 0x12, 0x46, 0x59, 0xDB, 0x63, 0xE5, 0xF9, 0xF1, + 0x7F, 0xAD, 0x42, 0xF4, 0x24, 0xF0, 0x02, 0x3D, + 0x1E, 0x6C, 0xD5, 0xB3, 0x06, 0x8F, 0x1F, 0x59, + 0x79, 0xCC, 0xF9, 0x5B, 0x4F, 0x8B, 0xD6, 0x03, + 0xC7, 0x53, 0xE6, 0xCE, 0xBB, 0xD8, 0x52, 0x89, + 0x70, 0x5D, 0x98, 0x86, 0xA5, 0x9E, 0x44, 0xA9, + 0xC8, 0x17, 0xA2, 0x6F, 0x43, 0x2D, 0x8D, 0xA7, + 0xDE, 0x3E, 0xFA, 0xE7, 0x98, 0x7B, 0xB5, 0xBE, + 0x7B, 0x10, 0xB8, 0xB8, 0xA5, 0x3D, 0x3E, 0xCD, + 0x94, 0x19, 0x5E, 0x06, 0x51, 0xB8, 0x58, 0x1E, + 0x0E, 0xCF, 0xFE, 0xE5, 0xED, 0x84, 0xB5, 0xF5, + 0x0F, 0x34, 0x32, 0xAC, 0x0A, 0x7F, 0x03, 0xF0, + 0xF8, 0xFC, 0x69, 0xA0, 0x26, 0x0D, 0x2E, 0xFA, + 0x62, 0x49, 0x5C, 0xC4, 0xE5, 0xF6, 0x8B, 0xC5, + 0x26, 0x21, 0x23, 0x3B, 0xBD, 0x9A, 0x23, 0x95, + 0x69, 0xA7, 0x48, 0x94, 0x30, 0x1E, 0xC3, 0x82, + 0xB6, 0x75, 0x30, 0xA6, 0xF3, 0x1E, 0xBB, 0xBC, + 0xF7, 0x21, 0x27, 0x12, 0x2C, 0x51, 0x50, 0x55, + 0x87, 0x0D, 0xF1, 0xCC, 0x6C, 0xFF, 0xEA, 0x7E, + 0x2C, 0xDA, 0x8B, 0x9B, 0x20, 0xF4, 0x75, 0xFB, + 0xC2, 0x3F, 0xBE, 0x09, 0xA6, 0xC9, 0x26, 0xE7, + 0xB5, 0xC7, 0xE6, 0xB9, 0x35, 0x8C, 0xAF, 0xFA, + 0xC0, 0x8D, 0x43, 0x33, 0x25, 0xBA, 0xAA, 0xDC, + 0xCF, 0xBC, 0xE4, 0xC4, 0xC6, 0x26, 0x4A, 0x0D, + 0x9D, 0xCC, 0x2A, 0xE0, 0x5B, 0x1E, 0xC9, 0x78, + 0xF8, 0xA2, 0xB5, 0x46, 0xE5, 0x49, 0xB8, 0x4C, + 0xC2, 0x22, 0x40, 0xCE, 0x97, 0x9A, 0x95, 0x40, + 0xF7, 0xD6, 0x52, 0x54, 0x3B, 0xBB, 0x42, 0xC5, + 0x6F, 0x00, 0x7F, 0x83, 0xDD, 0x88, 0x71, 0xF7, + 0xD4, 0x1B, 0x3D, 0x81, 0xC4, 0xB1, 0x49, 0x9B, + 0xF3, 0x68, 0x15, 0xC5, 0x15, 0x97, 0x0F, 0xC5, + 0x43, 0xDD, 0x07, 0xBE, 0x98, 0x43, 0x2C, 0xB3, + 0xEF, 0x08, 0xCA, 0xDC, 0x9C, 0x27, 0x58, 0xFE, + 0x49, 0xE9, 0x77, 0xD9, 0x1C, 0x62, 0xA4, 0xA2, + 0xF9, 0x78, 0xCC, 0xB3, 0x21, 0x06, 0x10, 0xDE, + 0x5A, 0x52, 0xA3, 0x67, 0xBD, 0x5E, 0xBC, 0x9B, + 0x4E, 0x40, 0x87, 0x93, 0xCF, 0x0E, 0x27, 0x0E, + 0xE3, 0x11, 0x4B, 0xB3, 0xE0, 0xCE, 0x24, 0xB6, + 0x0A, 0x53, 0x03, 0xF8, 0x01, 0x6A, 0x7E, 0xFE, + 0xC8, 0x66, 0x9F, 0x29, 0xF3, 0x45, 0x94, 0xD6, + 0x0E, 0x30, 0xB5, 0x61, 0xA9, 0xEC, 0x8F, 0x71, + 0xF7, 0x36, 0xD6, 0x43, 0x4B, 0x0C, 0xCD, 0x45, + 0xBB, 0xA4, 0xBD, 0xE9, 0xA9, 0xC3, 0xC1, 0x95, + 0x1E, 0xF9, 0x42, 0x07, 0x18, 0xEA, 0xF5, 0x0B, + 0x27, 0xB6, 0xDE, 0xEF, 0x67, 0x33, 0x83, 0x0D, + 0xD9, 0x5E, 0x3A, 0x93, 0xD2, 0xD0, 0xDB, 0xB9, + 0x98, 0xF0, 0x25, 0x21, 0xF3, 0xDF, 0x0B, 0x1E + }; +#endif /* !WOLFSSL_NO_ML_DSA_44 */ +#ifndef WOLFSSL_NO_ML_DSA_65 + static const byte seed_65[] = { + 0x41, 0xAF, 0x98, 0x7B, 0x02, 0x6E, 0x47, 0x5F, + 0x37, 0x91, 0x7F, 0x2A, 0x6A, 0x9A, 0x87, 0xE7, + 0x51, 0xAD, 0xF9, 0x5B, 0x92, 0x7F, 0x2D, 0xCE, + 0xF0, 0xD4, 0xF3, 0xDA, 0x8F, 0x8C, 0x86, 0x6B + }; + static const byte pk_65[] = { + 0xDC, 0x38, 0xE5, 0x5F, 0xDF, 0x2E, 0x9D, 0xD4, + 0x34, 0x5C, 0xAE, 0x1A, 0x7D, 0xF4, 0x2E, 0x2E, + 0xBC, 0x58, 0x57, 0x80, 0x55, 0x02, 0xE4, 0x3F, + 0xA5, 0x19, 0x41, 0xE4, 0x44, 0x58, 0x66, 0x41, + 0x39, 0x5D, 0xF9, 0x20, 0x6C, 0x36, 0x0D, 0x4F, + 0x83, 0x43, 0xBE, 0x86, 0xEF, 0x6C, 0x43, 0xD0, + 0x3E, 0xD0, 0x63, 0x0A, 0x5B, 0x92, 0x8D, 0x31, + 0x19, 0x1D, 0xA9, 0x51, 0x61, 0x48, 0xE6, 0x26, + 0x50, 0x07, 0x54, 0x9B, 0xB0, 0xB7, 0x62, 0x54, + 0xDB, 0x80, 0x4E, 0x48, 0x7F, 0x48, 0xC5, 0x11, + 0x91, 0xFC, 0xA9, 0x26, 0x25, 0x08, 0xA5, 0x99, + 0xA0, 0x3C, 0xB9, 0x0C, 0xCF, 0x6C, 0xCD, 0x83, + 0x9A, 0x38, 0x6D, 0x22, 0xDE, 0x0A, 0xC3, 0x8F, + 0xF7, 0xD0, 0x57, 0x40, 0x53, 0xE9, 0xE9, 0x4E, + 0x73, 0xFA, 0x58, 0x40, 0x9F, 0x6D, 0x8A, 0xD3, + 0x6F, 0x86, 0x84, 0x4D, 0x18, 0xD7, 0x4C, 0x76, + 0x39, 0x57, 0x9E, 0xC0, 0xC7, 0xE4, 0xEE, 0x54, + 0xF4, 0xAD, 0x10, 0xC5, 0x69, 0x59, 0xE0, 0xBC, + 0x9B, 0xF4, 0x20, 0x8F, 0xBA, 0x0A, 0x94, 0x10, + 0x55, 0x07, 0x7E, 0xD1, 0xF9, 0x20, 0xCC, 0x2F, + 0xA9, 0xAE, 0x9D, 0xF5, 0xE4, 0x29, 0x40, 0x7E, + 0x44, 0xA4, 0xDF, 0xB2, 0xE9, 0x25, 0xE0, 0xBA, + 0x8D, 0x6C, 0x33, 0x88, 0x9C, 0xEE, 0x27, 0xDB, + 0xC7, 0x0A, 0x6E, 0x5A, 0x08, 0x92, 0x9B, 0x53, + 0xF8, 0xFD, 0xF9, 0x5B, 0xEB, 0x03, 0x8E, 0x45, + 0xCB, 0x91, 0x19, 0x4E, 0x6B, 0x1E, 0xA0, 0xA4, + 0xF0, 0x43, 0xC9, 0x8F, 0xDF, 0x93, 0x5E, 0x86, + 0xB0, 0x09, 0xD3, 0x47, 0x38, 0x7C, 0x8E, 0x78, + 0x85, 0x71, 0x3D, 0x07, 0x2E, 0x2E, 0x12, 0x6F, + 0x06, 0x97, 0x0E, 0x54, 0xAD, 0x71, 0x09, 0xEF, + 0xA5, 0x55, 0x0A, 0x39, 0x86, 0xE6, 0x17, 0x17, + 0x70, 0x9A, 0xA7, 0xA7, 0x1B, 0xCE, 0x78, 0x06, + 0x2C, 0x61, 0x1A, 0xB9, 0x48, 0x22, 0x41, 0x45, + 0x15, 0xEB, 0x10, 0x3C, 0x6E, 0x24, 0x37, 0xA4, + 0xB5, 0xE8, 0x82, 0x4D, 0x6D, 0xCC, 0x44, 0xC6, + 0xB0, 0x5D, 0xBE, 0x46, 0xDA, 0x5F, 0x00, 0x36, + 0x5B, 0xBD, 0x87, 0x65, 0x3A, 0x96, 0x21, 0x58, + 0x45, 0x65, 0xDB, 0xD8, 0x77, 0x76, 0x7B, 0x25, + 0xC3, 0x78, 0x6E, 0xD9, 0x14, 0xA7, 0x19, 0x69, + 0x4F, 0xBB, 0x1B, 0xDB, 0x37, 0xCE, 0xAF, 0x8C, + 0x88, 0x2E, 0x9E, 0x30, 0xF6, 0xAE, 0x43, 0xCC, + 0x59, 0x0F, 0x67, 0x8A, 0xCB, 0x4F, 0x08, 0x20, + 0x6D, 0x99, 0xD7, 0xA9, 0xDE, 0xE5, 0xE5, 0xB3, + 0xFF, 0xAA, 0x45, 0x3C, 0xF1, 0xE3, 0x02, 0x7D, + 0x2F, 0xEE, 0x69, 0x04, 0x81, 0x73, 0x01, 0x37, + 0x51, 0x68, 0xC8, 0x0B, 0x51, 0xFD, 0x05, 0xB4, + 0x05, 0xBB, 0xA1, 0xDB, 0x1D, 0xF6, 0x5F, 0x70, + 0xD3, 0x0A, 0x37, 0x4B, 0x9C, 0xC4, 0x45, 0x30, + 0x11, 0x36, 0xE2, 0x48, 0x9F, 0xC4, 0x2E, 0x4E, + 0x0C, 0x0C, 0xA1, 0x04, 0x41, 0x75, 0x95, 0xAA, + 0xED, 0xAC, 0xD4, 0xB2, 0xE7, 0x85, 0x7E, 0xE1, + 0xA6, 0xFE, 0x2A, 0x09, 0x19, 0x09, 0x3D, 0x7C, + 0x20, 0x1E, 0x98, 0x3D, 0x6E, 0x02, 0xC1, 0xCA, + 0xBB, 0x24, 0x82, 0x9F, 0x45, 0x1D, 0x26, 0x99, + 0xAE, 0x02, 0x82, 0xF9, 0x86, 0x3B, 0x67, 0x8C, + 0xBD, 0xFE, 0xF1, 0xD0, 0xB6, 0xB8, 0xAB, 0x00, + 0x0F, 0xEC, 0x30, 0xDC, 0x27, 0x58, 0xE2, 0x29, + 0x18, 0x05, 0x5A, 0x66, 0xA5, 0x88, 0x39, 0x8E, + 0x49, 0x5B, 0xB9, 0x52, 0x43, 0x84, 0xDC, 0xA9, + 0x50, 0x2B, 0x83, 0x3C, 0x84, 0x81, 0x37, 0x52, + 0x30, 0x79, 0xBD, 0x04, 0xB8, 0xDD, 0x47, 0xC1, + 0x02, 0x2E, 0xEC, 0x24, 0xD0, 0x56, 0x23, 0xE1, + 0x92, 0xD0, 0x65, 0x7F, 0xC7, 0xC2, 0xF7, 0x60, + 0x73, 0xB8, 0xAF, 0x0A, 0xF4, 0xEF, 0xFC, 0x1B, + 0xC2, 0xB9, 0x76, 0x87, 0x8A, 0xA6, 0xC2, 0x3F, + 0xD3, 0x9F, 0x1F, 0x2D, 0x94, 0xBC, 0x89, 0x4E, + 0x31, 0x8D, 0x28, 0xD0, 0x90, 0xB5, 0x5B, 0x60, + 0x30, 0xC6, 0x0B, 0x37, 0x63, 0x5D, 0xDC, 0xC6, + 0xE0, 0x1A, 0xBA, 0x6B, 0x23, 0xCD, 0x2E, 0x09, + 0x2D, 0x6A, 0x7E, 0x0C, 0xD9, 0x4F, 0xB1, 0xE2, + 0x89, 0x67, 0xE7, 0xB1, 0x54, 0x08, 0xB2, 0xFA, + 0x83, 0x43, 0x7C, 0x77, 0x06, 0xED, 0xE2, 0x29, + 0x53, 0xB7, 0x09, 0xC4, 0x1B, 0x81, 0x55, 0x12, + 0x41, 0x8E, 0x8B, 0x03, 0x36, 0xEE, 0x45, 0x70, + 0x57, 0xA8, 0x73, 0xEF, 0x70, 0x7B, 0x1F, 0x63, + 0xB0, 0xE8, 0x00, 0xBD, 0x1E, 0xE6, 0xA9, 0x93, + 0x9D, 0x03, 0x19, 0x22, 0xDF, 0xE1, 0x01, 0xF2, + 0xA9, 0x6B, 0x90, 0x5C, 0xD2, 0xC1, 0xAC, 0x9F, + 0xB2, 0x21, 0x1C, 0x2D, 0xC6, 0x80, 0x9A, 0xB5, + 0x1E, 0x46, 0x95, 0x6C, 0xCE, 0x47, 0x3E, 0x67, + 0xCD, 0xD6, 0xC9, 0xB9, 0x81, 0x74, 0x7F, 0x17, + 0xA3, 0xF7, 0x48, 0x99, 0xF3, 0x36, 0x84, 0xF3, + 0x16, 0x41, 0x55, 0x5F, 0xA7, 0xBF, 0x4B, 0x69, + 0x8D, 0xA3, 0x3D, 0x1E, 0xEA, 0xF5, 0x1E, 0xC6, + 0xB8, 0x1C, 0xD6, 0x89, 0x45, 0x68, 0xFA, 0xE7, + 0xCA, 0x86, 0xE4, 0xB1, 0xC9, 0x9C, 0xB2, 0xAB, + 0x89, 0x03, 0xE7, 0x19, 0x7B, 0xA9, 0xF2, 0x6B, + 0x4A, 0x43, 0x1D, 0x90, 0xAF, 0xA4, 0xE3, 0xBC, + 0xEF, 0xD4, 0x37, 0xC5, 0x55, 0x5C, 0x9E, 0x14, + 0xC6, 0x18, 0xDD, 0x45, 0x3F, 0x80, 0x49, 0x1C, + 0x93, 0xFF, 0xBD, 0xDD, 0x75, 0x54, 0x0B, 0xD1, + 0xA9, 0xF6, 0xBC, 0x89, 0x98, 0x7D, 0x6F, 0x03, + 0x7B, 0x06, 0xD5, 0x40, 0x7D, 0x85, 0x48, 0x2E, + 0x11, 0x3E, 0xF0, 0x47, 0x77, 0xD0, 0xBA, 0x03, + 0x33, 0x58, 0xC4, 0x8F, 0x76, 0xF8, 0x72, 0x47, + 0x04, 0x21, 0x5E, 0x85, 0x5A, 0x0F, 0x35, 0x77, + 0xFB, 0x96, 0x29, 0x81, 0x2D, 0x55, 0x6E, 0x53, + 0xC6, 0x13, 0x1E, 0xFA, 0x4D, 0xCE, 0xA9, 0x36, + 0x1D, 0x8F, 0xAB, 0xAC, 0x13, 0x19, 0x94, 0xFC, + 0x4B, 0xCD, 0x36, 0x4C, 0x6E, 0x21, 0xAE, 0xF1, + 0x13, 0xA4, 0xF7, 0x64, 0x8E, 0xE1, 0xAF, 0x50, + 0x6A, 0x63, 0x0E, 0xCA, 0x2F, 0xE9, 0x0C, 0x8A, + 0xE7, 0xF2, 0xE3, 0x68, 0x03, 0xE0, 0x40, 0x1C, + 0x64, 0xAB, 0xC3, 0xEC, 0xC0, 0x92, 0xE9, 0x57, + 0x3E, 0x66, 0x72, 0x36, 0x39, 0x22, 0x4E, 0xCD, + 0x13, 0x08, 0xBA, 0xF8, 0x2B, 0xA1, 0xF2, 0x69, + 0x44, 0x7E, 0x90, 0x5C, 0xC8, 0xEC, 0xB6, 0xBE, + 0x8C, 0x30, 0xE0, 0x69, 0xB7, 0x97, 0xA1, 0x1C, + 0x18, 0xE5, 0x54, 0x62, 0xC3, 0x29, 0x99, 0x21, + 0x16, 0xD9, 0x78, 0x1C, 0x4C, 0x9C, 0x88, 0x4C, + 0xA5, 0xE1, 0x11, 0x66, 0x5B, 0x6E, 0x71, 0xE7, + 0xE2, 0xE7, 0xE4, 0x02, 0xDD, 0x1A, 0x8D, 0x0C, + 0xF5, 0x32, 0xFD, 0x41, 0x28, 0x35, 0x75, 0xD0, + 0x0C, 0x5F, 0x06, 0x6A, 0x5A, 0x61, 0x49, 0x59, + 0xC1, 0x0C, 0xD4, 0x9E, 0xD6, 0x29, 0xE2, 0x37, + 0xDF, 0x2B, 0x3D, 0xE8, 0x98, 0xB9, 0xDF, 0x8E, + 0xA0, 0xC4, 0xE2, 0xFC, 0x45, 0x70, 0xE8, 0x1B, + 0xF4, 0xFA, 0xC5, 0xE6, 0xA7, 0xCF, 0x4F, 0xA2, + 0xDA, 0x3D, 0x90, 0x49, 0x24, 0x8F, 0x61, 0x54, + 0xD5, 0x50, 0x8E, 0xE8, 0x0C, 0x14, 0xAD, 0x6F, + 0x65, 0x88, 0x3A, 0xF6, 0x92, 0xDB, 0x35, 0x5D, + 0xFF, 0x21, 0x20, 0xAC, 0x01, 0x16, 0x0B, 0xEC, + 0x84, 0x15, 0x3B, 0xA9, 0x93, 0x92, 0x75, 0xB3, + 0x73, 0xF1, 0x23, 0x69, 0x94, 0x10, 0xF5, 0xFE, + 0x20, 0xA8, 0xAF, 0x05, 0x87, 0x49, 0x4E, 0x9C, + 0xEB, 0x21, 0x0A, 0xCF, 0x0B, 0xA1, 0x65, 0x38, + 0xA6, 0x18, 0x4D, 0xF7, 0xD8, 0xC1, 0x2C, 0x14, + 0x4C, 0xD9, 0x40, 0xC2, 0xF7, 0xBF, 0xE3, 0x07, + 0x79, 0x55, 0xAE, 0xB9, 0xB6, 0x50, 0x06, 0x92, + 0x94, 0x8C, 0x6A, 0x0E, 0x22, 0x14, 0xE2, 0xCC, + 0x65, 0xBA, 0x0C, 0x4D, 0xB6, 0x5C, 0x4A, 0xE9, + 0x0A, 0x08, 0x0C, 0xF9, 0x26, 0xA2, 0x51, 0x85, + 0x36, 0xE2, 0xC1, 0xF1, 0x0A, 0x66, 0x51, 0x66, + 0x7A, 0x98, 0x9B, 0x2C, 0x30, 0x1A, 0x0D, 0x49, + 0x3C, 0x1E, 0xEC, 0x63, 0x53, 0x5E, 0xD9, 0xDD, + 0x84, 0x69, 0xCD, 0x7E, 0x79, 0x58, 0x3D, 0x6E, + 0xD9, 0x98, 0x58, 0xD8, 0x0A, 0x48, 0xB5, 0x13, + 0x3F, 0x72, 0x4C, 0x11, 0x90, 0x15, 0x12, 0x74, + 0xFF, 0x5C, 0x0D, 0xC6, 0x20, 0x8C, 0xC1, 0x99, + 0xCA, 0x8E, 0xFC, 0xA2, 0xE8, 0xB8, 0xEE, 0xAA, + 0x27, 0xC2, 0x97, 0x8D, 0xFA, 0xBE, 0xE0, 0x43, + 0x99, 0xB6, 0x90, 0x60, 0x00, 0x7C, 0x33, 0xD4, + 0x87, 0x71, 0x7B, 0x56, 0x6C, 0xAA, 0xE0, 0xAC, + 0x9D, 0x7E, 0x7E, 0xA3, 0xCF, 0xBB, 0xB3, 0xA0, + 0x5F, 0xD4, 0xC4, 0x3A, 0xA7, 0xB9, 0x0C, 0xCE, + 0xF3, 0x05, 0x09, 0x91, 0xA7, 0xE9, 0x11, 0x55, + 0x32, 0x45, 0xA6, 0x08, 0x0E, 0x10, 0x37, 0x91, + 0xF3, 0xBF, 0xED, 0x64, 0x26, 0xEB, 0x39, 0xC2, + 0x57, 0xAE, 0x64, 0x79, 0x33, 0x7C, 0x51, 0xB2, + 0xC8, 0x85, 0xE0, 0xF9, 0x6D, 0x10, 0x52, 0x9F, + 0x72, 0xF4, 0xD1, 0x5B, 0x54, 0x5B, 0x93, 0x28, + 0x36, 0xA8, 0xCD, 0xB3, 0x30, 0x5B, 0x7A, 0xB0, + 0xB6, 0xF0, 0xD8, 0xA0, 0xBA, 0x24, 0x59, 0x5F, + 0x43, 0x02, 0x01, 0x57, 0x91, 0x7B, 0x94, 0x07, + 0x63, 0x23, 0x12, 0x94, 0xFB, 0x9F, 0xF2, 0xC1, + 0xD6, 0x80, 0x8F, 0x4E, 0xA7, 0x9E, 0x11, 0xD8, + 0xB3, 0x08, 0xB6, 0x3B, 0x3B, 0xF2, 0xEE, 0x14, + 0xA5, 0xDB, 0xB0, 0xBB, 0x17, 0xA5, 0x96, 0x3C, + 0x2F, 0xB9, 0xE7, 0x4A, 0xD7, 0x52, 0x34, 0x98, + 0xCB, 0x0C, 0xEB, 0x42, 0x5B, 0x2D, 0x2D, 0x2B, + 0x0D, 0x94, 0x66, 0xD3, 0xAD, 0x08, 0x0A, 0x28, + 0xF6, 0x0E, 0xDA, 0xD4, 0x54, 0xFD, 0xC6, 0x48, + 0x08, 0xA1, 0x8D, 0xB0, 0x30, 0xFD, 0x18, 0xB1, + 0x50, 0xB1, 0xFD, 0xE0, 0x6E, 0x33, 0x25, 0x0D, + 0x90, 0xB1, 0xC1, 0xE7, 0x88, 0x74, 0x87, 0x05, + 0xE7, 0xBE, 0xBD, 0xAA, 0x8C, 0x6D, 0xC2, 0x3D, + 0x6F, 0x95, 0x84, 0xFA, 0x03, 0x74, 0x85, 0xE1, + 0xED, 0xE5, 0xF4, 0xE8, 0x26, 0x4A, 0x0B, 0x20, + 0x87, 0xB6, 0xE1, 0x10, 0x75, 0x6D, 0x9F, 0x95, + 0x39, 0x4C, 0x0F, 0x50, 0x1B, 0xA8, 0x69, 0x82, + 0xBB, 0xE2, 0xD6, 0x11, 0xD7, 0xBE, 0xFB, 0x4F, + 0x60, 0xD3, 0x16, 0xC6, 0x04, 0x3A, 0x5A, 0xF5, + 0x78, 0x9B, 0x0B, 0x21, 0xA1, 0x00, 0x96, 0xCD, + 0x63, 0x78, 0x1D, 0x2D, 0x4F, 0x6E, 0x50, 0xEE, + 0x62, 0x2D, 0x88, 0x62, 0x01, 0xF6, 0xB4, 0x17, + 0x4F, 0x8C, 0xAD, 0xCB, 0x4B, 0xF9, 0xF6, 0x9D, + 0xC7, 0xD8, 0xCC, 0xBF, 0x96, 0x1B, 0x1B, 0x79, + 0xF3, 0x25, 0x85, 0x23, 0x10, 0x63, 0x30, 0x8D, + 0xA8, 0x3A, 0x4B, 0x92, 0x1B, 0x88, 0x53, 0x24, + 0x2D, 0x29, 0xA5, 0x2E, 0x7A, 0xD5, 0x58, 0xEB, + 0x1B, 0x1C, 0xE6, 0xB8, 0x94, 0x0C, 0x58, 0x96, + 0x5B, 0xA0, 0x2C, 0xBF, 0xE2, 0x99, 0xA0, 0x1F, + 0x0C, 0xCC, 0xBD, 0x83, 0x72, 0x56, 0xBB, 0x13, + 0x61, 0x5A, 0xC2, 0x04, 0x27, 0x29, 0x1F, 0xD4, + 0xE4, 0x3D, 0x8A, 0x87, 0xE3, 0x81, 0x91, 0x07, + 0xD3, 0x9B, 0xBC, 0xA9, 0xB3, 0xBA, 0xF5, 0x8B, + 0x6A, 0xAD, 0xDE, 0xB0, 0x54, 0x3E, 0xFE, 0xCC, + 0xD3, 0xCB, 0x2C, 0x69, 0xF0, 0x58, 0xD7, 0xEF, + 0xA9, 0xC0, 0x15, 0x9B, 0x5A, 0xDF, 0x71, 0x25, + 0x38, 0x44, 0xEC, 0xA9, 0x18, 0x47, 0x41, 0xCE, + 0x3D, 0x53, 0x10, 0x12, 0xC3, 0x1B, 0x59, 0x9A, + 0x93, 0xA1, 0xEA, 0xBE, 0x3E, 0xBA, 0x74, 0xF6, + 0x2D, 0x40, 0x9D, 0xCB, 0x9E, 0xA1, 0xA5, 0x85, + 0xFF, 0xDC, 0xC5, 0x60, 0x6F, 0x61, 0xE8, 0x17, + 0x6C, 0x36, 0x9F, 0x7A, 0x48, 0x47, 0xDD, 0xF1, + 0xF4, 0x43, 0x21, 0xCB, 0xB3, 0x55, 0x86, 0xD0, + 0xE9, 0x46, 0x7D, 0xB5, 0x3D, 0x90, 0x34, 0x1E, + 0xBB, 0x40, 0xD3, 0x2A, 0xEB, 0xE6, 0x4C, 0x46, + 0x42, 0xA2, 0x8A, 0xBF, 0x90, 0xE7, 0x4B, 0x6D, + 0x5C, 0x94, 0x97, 0xD2, 0xF0, 0x97, 0x74, 0x4C, + 0x76, 0x03, 0xAC, 0x3D, 0xDE, 0x15, 0x96, 0x0C, + 0xEF, 0x18, 0x9D, 0xBD, 0x1A, 0x20, 0x35, 0x7E, + 0x2A, 0x70, 0x9D, 0xEA, 0x2E, 0x11, 0xDF, 0xF3, + 0x2F, 0xFE, 0x23, 0xA9, 0xB6, 0xCF, 0xB7, 0xB9, + 0x3F, 0x4F, 0x30, 0x6B, 0x3B, 0x0D, 0x3B, 0xED, + 0xCD, 0x77, 0xD4, 0xBF, 0xEE, 0xDD, 0xB6, 0x56, + 0x24, 0xD4, 0x29, 0x83, 0xDE, 0xDB, 0xC1, 0xFB, + 0x6A, 0xCE, 0x7F, 0x47, 0xD2, 0xC5, 0xF1, 0x78, + 0x5C, 0x2C, 0x5A, 0x28, 0x3E, 0x05, 0x50, 0x2E, + 0xD9, 0xAE, 0x9B, 0x95, 0x64, 0xC7, 0xD2, 0x7B, + 0xCB, 0xC5, 0x91, 0x80, 0xEB, 0x79, 0xC7, 0xCC, + 0xA8, 0x06, 0xC8, 0xF9, 0xDF, 0x2A, 0x49, 0x4A, + 0xF8, 0xFE, 0xBA, 0xA5, 0x85, 0x67, 0x1B, 0xDA, + 0x51, 0x3B, 0xC2, 0x04, 0xA6, 0xA3, 0xFF, 0x99, + 0x21, 0xE8, 0x17, 0x91, 0x33, 0x9B, 0x83, 0x75, + 0x20, 0x5E, 0x95, 0xBE, 0x49, 0xDF, 0x53, 0xFC, + 0x05, 0xA2, 0x3C, 0xAA, 0x5A, 0x22, 0x15, 0xA5, + 0x56, 0xE0, 0x51, 0x30, 0x4E, 0x32, 0x14, 0xF2, + 0x9F, 0x03, 0x51, 0x8E, 0xDD, 0x8B, 0x39, 0x19, + 0x1E, 0x39, 0xC5, 0xA7, 0x1C, 0xC6, 0xA4, 0xE1, + 0x77, 0xCA, 0x8C, 0x9D, 0x27, 0xBC, 0xCC, 0x16, + 0xD6, 0xFC, 0x59, 0x10, 0x23, 0xFF, 0x64, 0x90, + 0x9C, 0x23, 0x5A, 0xFF, 0x7E, 0x27, 0x1B, 0xC7, + 0x7F, 0x21, 0x3B, 0x41, 0xDB, 0xBC, 0x96, 0x60, + 0x0B, 0x35, 0xA1, 0xF3, 0xF8, 0x51, 0x0A, 0x65, + 0xCF, 0xDF, 0x7A, 0xB8, 0x04, 0x56, 0x49, 0xD7, + 0xD3, 0xC5, 0x0B, 0x4A, 0x1F, 0x60, 0xE1, 0x86, + 0x36, 0x53, 0x8E, 0x6C, 0x3E, 0xAF, 0x5B, 0xC1, + 0xCA, 0xCB, 0x22, 0x1A, 0x07, 0xDA, 0x54, 0xEC, + 0xAA, 0x06, 0x72, 0x17, 0xCF, 0x80, 0xC4, 0x89, + 0x56, 0x24, 0x1B, 0xD4, 0xFF, 0x50, 0x6B, 0x51, + 0x55, 0x4D, 0x6E, 0x79, 0x7E, 0xEC, 0x61, 0xC6, + 0xE4, 0x21, 0xC8, 0x0E, 0x10, 0x3F, 0x8C, 0x85, + 0x3A, 0x27, 0xEA, 0x91, 0x07, 0xCB, 0x37, 0x18, + 0x14, 0xB5, 0x63, 0x6E, 0x00, 0xBC, 0x0F, 0x36, + 0xF9, 0x54, 0x75, 0xE7, 0x0B, 0xDC, 0xE7, 0xA0, + 0x59, 0xF0, 0x64, 0xFB, 0x73, 0x07, 0x0E, 0xFE, + 0x57, 0x7F, 0x0D, 0x12, 0xBC, 0xB0, 0xBF, 0xA2, + 0x3A, 0x18, 0x08, 0x7E, 0xD5, 0x6C, 0xF0, 0x6F, + 0xF8, 0x98, 0xFB, 0xA5, 0x10, 0x7B, 0x10, 0x5F, + 0x6B, 0xC8, 0x6D, 0xDE, 0x2F, 0x1F, 0xE0, 0xC8, + 0x19, 0xEE, 0xC2, 0x03, 0x39, 0x49, 0x70, 0x3E, + 0x36, 0xE3, 0x3C, 0x70, 0xE3, 0xEA, 0xAC, 0x34, + 0x32, 0xB7, 0x0D, 0xBA, 0x7C, 0xAB, 0xE6, 0x18 + }; + static const byte sk_65[] = { + 0xDC, 0x38, 0xE5, 0x5F, 0xDF, 0x2E, 0x9D, 0xD4, + 0x34, 0x5C, 0xAE, 0x1A, 0x7D, 0xF4, 0x2E, 0x2E, + 0xBC, 0x58, 0x57, 0x80, 0x55, 0x02, 0xE4, 0x3F, + 0xA5, 0x19, 0x41, 0xE4, 0x44, 0x58, 0x66, 0x41, + 0x52, 0x8D, 0xA0, 0xC7, 0xD2, 0x80, 0xDD, 0x49, + 0x0D, 0x5E, 0xB7, 0x65, 0xDB, 0x32, 0x33, 0x15, + 0x0F, 0x9E, 0xC8, 0xEB, 0xC9, 0x6E, 0xE8, 0xE8, + 0x5C, 0xBD, 0x18, 0x4F, 0xDC, 0xF8, 0xA8, 0xD9, + 0xC5, 0x33, 0x84, 0x79, 0x5A, 0x5E, 0xB7, 0x3C, + 0x6D, 0x82, 0xCA, 0xB9, 0xBA, 0x94, 0xB6, 0x46, + 0xAE, 0x3A, 0xD9, 0x19, 0x6C, 0xB4, 0xDA, 0xE2, + 0xF1, 0x4B, 0xB6, 0x43, 0xF0, 0x24, 0x08, 0xE5, + 0xF7, 0x9A, 0x41, 0xF1, 0x15, 0x9C, 0xA8, 0x08, + 0x79, 0x9F, 0xB8, 0x26, 0xD4, 0x08, 0x32, 0x47, + 0xC8, 0xF0, 0xD5, 0x31, 0xA1, 0xC1, 0x19, 0x04, + 0x02, 0x06, 0x2B, 0x4D, 0x46, 0xAE, 0x43, 0x6A, + 0x25, 0x82, 0x75, 0x41, 0x70, 0x36, 0x42, 0x48, + 0x78, 0x06, 0x36, 0x50, 0x23, 0x84, 0x68, 0x10, + 0x87, 0x08, 0x62, 0x00, 0x08, 0x34, 0x20, 0x73, + 0x32, 0x13, 0x36, 0x61, 0x87, 0x61, 0x43, 0x50, + 0x30, 0x02, 0x26, 0x07, 0x65, 0x45, 0x32, 0x00, + 0x25, 0x75, 0x01, 0x04, 0x88, 0x81, 0x58, 0x64, + 0x52, 0x40, 0x84, 0x22, 0x88, 0x42, 0x82, 0x56, + 0x47, 0x50, 0x05, 0x21, 0x88, 0x25, 0x32, 0x25, + 0x12, 0x85, 0x14, 0x52, 0x87, 0x77, 0x67, 0x18, + 0x46, 0x54, 0x63, 0x07, 0x88, 0x67, 0x37, 0x26, + 0x72, 0x62, 0x41, 0x02, 0x00, 0x01, 0x17, 0x84, + 0x33, 0x64, 0x32, 0x57, 0x06, 0x20, 0x05, 0x44, + 0x88, 0x57, 0x33, 0x45, 0x70, 0x55, 0x14, 0x43, + 0x12, 0x54, 0x04, 0x38, 0x37, 0x08, 0x42, 0x57, + 0x36, 0x05, 0x30, 0x03, 0x86, 0x53, 0x02, 0x53, + 0x75, 0x22, 0x62, 0x13, 0x38, 0x82, 0x48, 0x30, + 0x83, 0x83, 0x64, 0x83, 0x13, 0x74, 0x57, 0x32, + 0x46, 0x70, 0x06, 0x05, 0x82, 0x52, 0x73, 0x55, + 0x25, 0x77, 0x21, 0x78, 0x57, 0x83, 0x66, 0x20, + 0x38, 0x53, 0x21, 0x41, 0x77, 0x56, 0x77, 0x46, + 0x34, 0x42, 0x58, 0x31, 0x08, 0x06, 0x03, 0x62, + 0x20, 0x35, 0x11, 0x42, 0x35, 0x38, 0x63, 0x86, + 0x64, 0x13, 0x13, 0x75, 0x40, 0x01, 0x53, 0x74, + 0x41, 0x31, 0x56, 0x64, 0x38, 0x17, 0x14, 0x16, + 0x62, 0x33, 0x22, 0x12, 0x64, 0x40, 0x67, 0x11, + 0x62, 0x42, 0x25, 0x60, 0x38, 0x05, 0x83, 0x13, + 0x51, 0x00, 0x28, 0x36, 0x62, 0x56, 0x41, 0x43, + 0x58, 0x37, 0x51, 0x22, 0x70, 0x25, 0x82, 0x82, + 0x35, 0x24, 0x06, 0x83, 0x48, 0x58, 0x81, 0x78, + 0x07, 0x86, 0x23, 0x15, 0x75, 0x32, 0x46, 0x75, + 0x35, 0x40, 0x08, 0x43, 0x10, 0x66, 0x74, 0x05, + 0x13, 0x72, 0x74, 0x08, 0x83, 0x41, 0x81, 0x08, + 0x75, 0x87, 0x83, 0x28, 0x56, 0x66, 0x20, 0x01, + 0x18, 0x83, 0x57, 0x22, 0x14, 0x64, 0x18, 0x05, + 0x27, 0x75, 0x22, 0x84, 0x12, 0x38, 0x87, 0x52, + 0x32, 0x25, 0x28, 0x08, 0x14, 0x41, 0x81, 0x14, + 0x03, 0x24, 0x54, 0x23, 0x04, 0x81, 0x40, 0x36, + 0x38, 0x38, 0x64, 0x42, 0x46, 0x36, 0x68, 0x11, + 0x55, 0x00, 0x11, 0x25, 0x76, 0x16, 0x43, 0x07, + 0x23, 0x03, 0x34, 0x10, 0x46, 0x41, 0x14, 0x02, + 0x26, 0x10, 0x74, 0x38, 0x38, 0x72, 0x07, 0x87, + 0x54, 0x11, 0x12, 0x83, 0x75, 0x05, 0x82, 0x17, + 0x45, 0x20, 0x38, 0x41, 0x37, 0x20, 0x00, 0x08, + 0x32, 0x18, 0x16, 0x25, 0x58, 0x85, 0x16, 0x88, + 0x71, 0x82, 0x45, 0x60, 0x33, 0x11, 0x13, 0x42, + 0x43, 0x37, 0x68, 0x11, 0x16, 0x54, 0x04, 0x08, + 0x52, 0x78, 0x13, 0x56, 0x83, 0x52, 0x15, 0x24, + 0x03, 0x61, 0x78, 0x44, 0x13, 0x70, 0x67, 0x36, + 0x74, 0x86, 0x52, 0x50, 0x15, 0x41, 0x88, 0x74, + 0x53, 0x00, 0x05, 0x18, 0x65, 0x62, 0x14, 0x84, + 0x12, 0x32, 0x01, 0x88, 0x40, 0x42, 0x34, 0x05, + 0x32, 0x80, 0x72, 0x55, 0x20, 0x68, 0x16, 0x43, + 0x14, 0x15, 0x15, 0x38, 0x43, 0x85, 0x27, 0x60, + 0x70, 0x18, 0x27, 0x35, 0x53, 0x01, 0x28, 0x73, + 0x27, 0x84, 0x10, 0x53, 0x67, 0x10, 0x45, 0x40, + 0x81, 0x52, 0x86, 0x06, 0x11, 0x18, 0x04, 0x31, + 0x57, 0x25, 0x22, 0x44, 0x47, 0x81, 0x45, 0x44, + 0x55, 0x04, 0x72, 0x57, 0x06, 0x46, 0x76, 0x23, + 0x38, 0x85, 0x65, 0x30, 0x08, 0x48, 0x20, 0x13, + 0x22, 0x77, 0x44, 0x60, 0x43, 0x14, 0x15, 0x27, + 0x86, 0x22, 0x37, 0x37, 0x27, 0x04, 0x27, 0x50, + 0x74, 0x31, 0x10, 0x82, 0x00, 0x75, 0x80, 0x44, + 0x38, 0x10, 0x58, 0x40, 0x86, 0x60, 0x63, 0x13, + 0x65, 0x18, 0x33, 0x70, 0x57, 0x68, 0x05, 0x10, + 0x81, 0x03, 0x42, 0x05, 0x25, 0x65, 0x33, 0x57, + 0x38, 0x05, 0x65, 0x34, 0x46, 0x53, 0x68, 0x11, + 0x75, 0x10, 0x04, 0x54, 0x18, 0x47, 0x52, 0x24, + 0x63, 0x23, 0x74, 0x45, 0x11, 0x34, 0x68, 0x32, + 0x35, 0x38, 0x52, 0x85, 0x28, 0x08, 0x71, 0x78, + 0x37, 0x38, 0x27, 0x10, 0x80, 0x54, 0x26, 0x33, + 0x31, 0x82, 0x44, 0x88, 0x33, 0x24, 0x62, 0x86, + 0x32, 0x82, 0x73, 0x31, 0x28, 0x14, 0x73, 0x87, + 0x06, 0x35, 0x80, 0x36, 0x67, 0x02, 0x33, 0x75, + 0x27, 0x36, 0x38, 0x16, 0x35, 0x70, 0x52, 0x16, + 0x87, 0x58, 0x85, 0x17, 0x22, 0x13, 0x54, 0x85, + 0x07, 0x53, 0x31, 0x26, 0x78, 0x01, 0x85, 0x18, + 0x08, 0x68, 0x38, 0x52, 0x11, 0x73, 0x32, 0x25, + 0x58, 0x82, 0x70, 0x70, 0x36, 0x30, 0x50, 0x38, + 0x65, 0x12, 0x78, 0x31, 0x77, 0x72, 0x18, 0x41, + 0x05, 0x42, 0x32, 0x26, 0x26, 0x50, 0x52, 0x86, + 0x15, 0x76, 0x28, 0x66, 0x88, 0x03, 0x78, 0x28, + 0x70, 0x33, 0x36, 0x27, 0x16, 0x61, 0x43, 0x56, + 0x62, 0x81, 0x85, 0x75, 0x47, 0x60, 0x63, 0x38, + 0x66, 0x81, 0x51, 0x78, 0x03, 0x42, 0x60, 0x38, + 0x01, 0x24, 0x73, 0x63, 0x81, 0x12, 0x01, 0x27, + 0x63, 0x13, 0x11, 0x78, 0x36, 0x37, 0x15, 0x03, + 0x84, 0x58, 0x17, 0x25, 0x67, 0x87, 0x57, 0x83, + 0x71, 0x85, 0x37, 0x53, 0x86, 0x22, 0x33, 0x28, + 0x77, 0x30, 0x18, 0x15, 0x01, 0x37, 0x85, 0x40, + 0x15, 0x38, 0x51, 0x33, 0x17, 0x42, 0x64, 0x04, + 0x56, 0x27, 0x50, 0x45, 0x11, 0x27, 0x20, 0x17, + 0x76, 0x55, 0x33, 0x37, 0x58, 0x88, 0x88, 0x45, + 0x16, 0x55, 0x08, 0x53, 0x52, 0x48, 0x72, 0x85, + 0x30, 0x15, 0x23, 0x44, 0x22, 0x02, 0x43, 0x45, + 0x41, 0x10, 0x00, 0x52, 0x32, 0x73, 0x05, 0x75, + 0x72, 0x16, 0x08, 0x11, 0x51, 0x36, 0x20, 0x04, + 0x76, 0x48, 0x78, 0x56, 0x60, 0x88, 0x07, 0x47, + 0x70, 0x20, 0x46, 0x40, 0x43, 0x26, 0x04, 0x37, + 0x17, 0x51, 0x58, 0x46, 0x72, 0x44, 0x50, 0x23, + 0x67, 0x63, 0x60, 0x84, 0x30, 0x51, 0x52, 0x53, + 0x21, 0x74, 0x85, 0x45, 0x74, 0x43, 0x11, 0x72, + 0x52, 0x65, 0x76, 0x08, 0x78, 0x63, 0x14, 0x27, + 0x41, 0x34, 0x67, 0x07, 0x45, 0x15, 0x10, 0x83, + 0x24, 0x02, 0x80, 0x53, 0x07, 0x21, 0x58, 0x10, + 0x34, 0x20, 0x54, 0x12, 0x58, 0x44, 0x25, 0x53, + 0x33, 0x46, 0x02, 0x38, 0x60, 0x17, 0x70, 0x64, + 0x18, 0x52, 0x62, 0x26, 0x65, 0x61, 0x42, 0x31, + 0x22, 0x57, 0x34, 0x57, 0x02, 0x34, 0x62, 0x76, + 0x74, 0x38, 0x73, 0x21, 0x68, 0x71, 0x07, 0x21, + 0x61, 0x05, 0x20, 0x20, 0x86, 0x83, 0x30, 0x25, + 0x50, 0x50, 0x83, 0x30, 0x31, 0x56, 0x30, 0x31, + 0x76, 0x04, 0x54, 0x80, 0x75, 0x18, 0x82, 0x23, + 0x61, 0x87, 0x58, 0x25, 0x13, 0x63, 0x21, 0x51, + 0x48, 0x02, 0x67, 0x37, 0x12, 0x88, 0x70, 0x60, + 0x07, 0x36, 0x18, 0x15, 0x87, 0x74, 0x55, 0x60, + 0x00, 0x54, 0x37, 0x11, 0x01, 0x37, 0x14, 0x17, + 0x11, 0x72, 0x14, 0x55, 0x31, 0x75, 0x77, 0x48, + 0x10, 0x23, 0x83, 0x20, 0x00, 0x04, 0x32, 0x64, + 0x66, 0x61, 0x71, 0x31, 0x03, 0x15, 0x44, 0x32, + 0x57, 0x25, 0x64, 0x31, 0x28, 0x15, 0x33, 0x67, + 0x86, 0x87, 0x37, 0x03, 0x12, 0x78, 0x86, 0x13, + 0x47, 0x80, 0x61, 0x42, 0x50, 0x40, 0x23, 0x37, + 0x01, 0x01, 0x66, 0x24, 0x06, 0x57, 0x82, 0x02, + 0x22, 0x42, 0x41, 0x02, 0x26, 0x06, 0x41, 0x35, + 0x64, 0x16, 0x44, 0x42, 0x38, 0x30, 0x86, 0x88, + 0x47, 0x71, 0x62, 0x33, 0x24, 0x02, 0x12, 0x37, + 0x42, 0x33, 0x20, 0x81, 0x80, 0x53, 0x07, 0x65, + 0x71, 0x27, 0x13, 0x53, 0x15, 0x43, 0x76, 0x38, + 0x71, 0x30, 0x07, 0x87, 0x25, 0x63, 0x03, 0x33, + 0x70, 0x56, 0x18, 0x13, 0x83, 0x51, 0x44, 0x40, + 0x04, 0x80, 0x62, 0x24, 0x20, 0x64, 0x54, 0x40, + 0x20, 0x73, 0x61, 0x45, 0x01, 0x24, 0x47, 0x78, + 0x23, 0x34, 0x56, 0x10, 0x25, 0x32, 0x02, 0x70, + 0x08, 0x02, 0x23, 0x24, 0x80, 0x43, 0x04, 0x02, + 0x81, 0x11, 0x23, 0x82, 0x03, 0x61, 0x30, 0x33, + 0x15, 0x36, 0x25, 0x32, 0x14, 0x73, 0x22, 0x46, + 0x81, 0x25, 0x16, 0x13, 0x52, 0x58, 0x71, 0x61, + 0x67, 0x08, 0x38, 0x76, 0x71, 0x15, 0x88, 0x47, + 0x31, 0x25, 0x27, 0x18, 0x31, 0x50, 0x40, 0x71, + 0x06, 0x87, 0x37, 0x30, 0x85, 0x64, 0x62, 0x78, + 0x32, 0x74, 0x18, 0x83, 0x67, 0x40, 0x37, 0x44, + 0x56, 0x02, 0x72, 0x61, 0x27, 0x28, 0x38, 0x38, + 0x67, 0x17, 0x58, 0x04, 0x61, 0x28, 0x67, 0x37, + 0x46, 0x50, 0x38, 0x15, 0x45, 0x12, 0x71, 0x44, + 0x22, 0x02, 0x34, 0x83, 0x40, 0x70, 0x55, 0x75, + 0x54, 0x26, 0x88, 0x07, 0x25, 0x58, 0x73, 0x60, + 0x58, 0x61, 0x45, 0x63, 0x35, 0x05, 0x48, 0x63, + 0x48, 0x57, 0x03, 0x31, 0x28, 0x14, 0x05, 0x01, + 0x57, 0x34, 0x64, 0x50, 0x23, 0x86, 0x75, 0x85, + 0x18, 0x75, 0x56, 0x88, 0x08, 0x26, 0x01, 0x34, + 0x01, 0x57, 0x05, 0x28, 0x35, 0x48, 0x17, 0x57, + 0x71, 0x81, 0x41, 0x33, 0x77, 0x86, 0x07, 0x77, + 0x02, 0x25, 0x71, 0x74, 0x37, 0x31, 0x20, 0x14, + 0x32, 0x54, 0x20, 0x35, 0x54, 0x76, 0x83, 0x15, + 0x80, 0x73, 0x27, 0x23, 0x00, 0x58, 0x22, 0x84, + 0x64, 0x56, 0x14, 0x84, 0x38, 0x34, 0x16, 0x21, + 0x77, 0x07, 0x34, 0x81, 0x66, 0x87, 0x40, 0x11, + 0x62, 0x46, 0x45, 0x01, 0x20, 0x53, 0x21, 0x73, + 0x07, 0x76, 0x44, 0x15, 0x61, 0x50, 0x83, 0x48, + 0x58, 0x58, 0x45, 0x33, 0x25, 0x36, 0x07, 0x42, + 0x70, 0x24, 0x07, 0x41, 0x08, 0x35, 0x00, 0x78, + 0x41, 0x47, 0x02, 0x56, 0x07, 0x14, 0x68, 0x33, + 0x55, 0x77, 0x32, 0x40, 0x55, 0x24, 0x50, 0x26, + 0x47, 0x12, 0x65, 0x58, 0x43, 0x05, 0x52, 0x55, + 0x75, 0x50, 0x18, 0x46, 0x65, 0x48, 0x03, 0x32, + 0x85, 0x31, 0x16, 0x52, 0x71, 0x57, 0x87, 0x46, + 0x76, 0x14, 0x42, 0x81, 0x28, 0x74, 0x60, 0x34, + 0x35, 0x55, 0x52, 0x16, 0x58, 0x48, 0x61, 0x75, + 0x80, 0x88, 0x15, 0x32, 0x72, 0x26, 0x31, 0x03, + 0x05, 0x03, 0x16, 0x04, 0x07, 0x37, 0x37, 0x73, + 0x43, 0x81, 0x57, 0x31, 0x88, 0x04, 0x72, 0x76, + 0x01, 0x61, 0x81, 0x17, 0x37, 0x65, 0x44, 0x38, + 0x61, 0x23, 0x16, 0x26, 0x52, 0x45, 0x00, 0x73, + 0x83, 0x63, 0x64, 0x62, 0x26, 0x74, 0x60, 0x11, + 0x81, 0x08, 0x06, 0x30, 0x36, 0x05, 0x10, 0x48, + 0x47, 0x35, 0x10, 0x85, 0x30, 0x86, 0x71, 0x38, + 0x16, 0x37, 0x6F, 0x3B, 0x1C, 0x18, 0xB1, 0xE3, + 0xE8, 0xEE, 0x83, 0x3E, 0x8D, 0x38, 0x43, 0x9E, + 0x78, 0x1C, 0xA3, 0xB8, 0x94, 0x06, 0x54, 0xEF, + 0x44, 0x6C, 0x9A, 0xAC, 0xC3, 0xF1, 0xD3, 0x0E, + 0xE0, 0x10, 0x5B, 0x8F, 0x63, 0xEB, 0x89, 0x74, + 0x6E, 0xF4, 0xBE, 0xB5, 0x4C, 0xFC, 0xE8, 0x81, + 0x2C, 0xF9, 0x47, 0xCF, 0x54, 0x54, 0xFB, 0x1C, + 0xA5, 0x5F, 0x25, 0xA0, 0xFE, 0x57, 0xF5, 0xFC, + 0xFD, 0x73, 0xB0, 0xDA, 0x04, 0xB0, 0xBF, 0x28, + 0x92, 0x92, 0xAF, 0x39, 0x74, 0x72, 0x56, 0x69, + 0xC3, 0x00, 0x03, 0xE0, 0x50, 0x9F, 0xED, 0xC8, + 0x0F, 0x6C, 0x89, 0x4B, 0xB0, 0x47, 0xC2, 0xE2, + 0xAF, 0x48, 0x5C, 0xAD, 0x68, 0xC2, 0x1D, 0x80, + 0xEF, 0x33, 0xB0, 0xC4, 0xFD, 0xA6, 0x7B, 0x85, + 0x31, 0xA1, 0x58, 0x87, 0x67, 0x54, 0x71, 0x3F, + 0xF8, 0xA8, 0xA6, 0x8D, 0x9A, 0xBD, 0xC4, 0x81, + 0x6B, 0x24, 0xB4, 0xA3, 0x6A, 0x8A, 0x2B, 0xB1, + 0xFD, 0x1C, 0x2C, 0x25, 0xC3, 0x72, 0xC4, 0xB7, + 0x75, 0xF8, 0xCC, 0x17, 0x39, 0xCF, 0x2C, 0xE9, + 0xA4, 0x54, 0x58, 0xE4, 0x1A, 0xAE, 0xC6, 0x4A, + 0xEE, 0xDE, 0x75, 0x7C, 0xE7, 0x38, 0xBC, 0xDF, + 0x4D, 0xA0, 0xEE, 0x2B, 0xDD, 0x5F, 0x80, 0x5C, + 0xCF, 0xF7, 0x2A, 0x5F, 0x73, 0x8B, 0xAC, 0x12, + 0x34, 0x2E, 0xE3, 0xF1, 0x4C, 0xB7, 0x22, 0x68, + 0xC2, 0xD6, 0x36, 0x7D, 0xF1, 0x7F, 0x20, 0x46, + 0xA2, 0x4B, 0x47, 0x4B, 0x32, 0x58, 0xF7, 0xB0, + 0x88, 0x54, 0x6C, 0x99, 0x3B, 0x0D, 0xA1, 0xE2, + 0x92, 0x92, 0xEB, 0x72, 0x1E, 0xE7, 0xE5, 0xA1, + 0xF8, 0x6E, 0x14, 0xA5, 0x39, 0xB0, 0x63, 0x6F, + 0x78, 0x82, 0xA1, 0x9C, 0x8D, 0x79, 0x02, 0x85, + 0xA6, 0xDF, 0x7D, 0xEE, 0xCE, 0x17, 0x4D, 0x63, + 0xCF, 0xF3, 0xB2, 0xFF, 0x85, 0x68, 0x81, 0xCB, + 0x38, 0x6B, 0x1B, 0x38, 0xA2, 0xE0, 0xF2, 0x4C, + 0x31, 0xE0, 0x91, 0x93, 0xDD, 0xF3, 0x71, 0x47, + 0xF2, 0x69, 0xD9, 0x4C, 0xDE, 0xF9, 0x90, 0x61, + 0x34, 0x62, 0x07, 0x71, 0x79, 0xD0, 0xDD, 0x09, + 0x32, 0x64, 0x39, 0x49, 0x93, 0x1A, 0x02, 0xBA, + 0xFA, 0x80, 0x17, 0x6E, 0xDF, 0x97, 0xB6, 0xA2, + 0x31, 0x34, 0x71, 0xF0, 0xB1, 0x9B, 0x3B, 0x59, + 0xF4, 0x3B, 0xD2, 0x2A, 0x05, 0x49, 0x3E, 0xFB, + 0x0C, 0xF8, 0xB5, 0xD7, 0xB6, 0x25, 0x2B, 0x09, + 0x8B, 0x4B, 0xFA, 0x39, 0x5B, 0xF9, 0xA2, 0x09, + 0xE9, 0xBB, 0x46, 0x01, 0x30, 0x00, 0x90, 0x32, + 0x58, 0xA6, 0x9B, 0x67, 0xF5, 0x94, 0x11, 0xC8, + 0x35, 0x95, 0xFA, 0x6E, 0x67, 0x42, 0x8D, 0x96, + 0x6D, 0x20, 0xFC, 0xD3, 0x09, 0x61, 0x11, 0x86, + 0x77, 0xC0, 0x86, 0xA3, 0x54, 0xAE, 0x6D, 0x41, + 0xEE, 0x17, 0xDC, 0xA1, 0xB0, 0xB7, 0x50, 0x43, + 0xD6, 0xCE, 0x23, 0xBD, 0xB0, 0x1E, 0x02, 0xE5, + 0x9E, 0xCF, 0xC6, 0x2E, 0x8C, 0x39, 0x71, 0xB1, + 0x45, 0x02, 0x75, 0xBA, 0x7F, 0x60, 0xB0, 0x8B, + 0x1C, 0x33, 0xBA, 0x0C, 0xFF, 0x54, 0x63, 0xE3, + 0x47, 0x5B, 0x07, 0x77, 0x77, 0xC5, 0x72, 0x24, + 0x60, 0xFA, 0xDB, 0x0B, 0xF6, 0x41, 0x82, 0x69, + 0x3C, 0x68, 0x37, 0xF5, 0xFD, 0x45, 0x4A, 0x66, + 0x6C, 0xD7, 0x01, 0x10, 0x78, 0x4A, 0xED, 0x09, + 0xAE, 0x49, 0x0A, 0x60, 0xC7, 0x78, 0x56, 0x51, + 0x15, 0xE3, 0x4A, 0xB5, 0xAE, 0xAD, 0x09, 0xD1, + 0x71, 0xA8, 0xCA, 0x3C, 0x8A, 0xE6, 0xCA, 0x39, + 0x43, 0x60, 0x56, 0x83, 0x3C, 0x58, 0x04, 0xD4, + 0xB4, 0x62, 0xDD, 0x53, 0x05, 0xC8, 0x51, 0xAF, + 0x59, 0xF6, 0x4F, 0x04, 0xC3, 0x1E, 0x69, 0xFF, + 0x82, 0xBF, 0xD7, 0x89, 0xD2, 0x30, 0x9F, 0xF2, + 0xE6, 0x38, 0x05, 0x9C, 0xD5, 0x08, 0xB8, 0x25, + 0xF3, 0x3B, 0x99, 0x85, 0x4E, 0x40, 0xF8, 0x40, + 0xF2, 0x4B, 0x5C, 0x3A, 0xA8, 0x64, 0x41, 0x92, + 0xEA, 0xCA, 0x9A, 0x7B, 0xCF, 0xBA, 0x1F, 0xDE, + 0xE0, 0x9D, 0xCA, 0xAD, 0xB4, 0x0C, 0x90, 0xFF, + 0xE1, 0x6C, 0xEC, 0xDD, 0x32, 0x38, 0x2A, 0xF7, + 0x19, 0x20, 0x39, 0xCB, 0x29, 0x67, 0x2F, 0x70, + 0x71, 0x12, 0x10, 0xB6, 0xB8, 0x3E, 0x8D, 0xFD, + 0xB5, 0xFB, 0xBD, 0xBF, 0xA8, 0xCA, 0x19, 0xC4, + 0xC6, 0xAC, 0x37, 0x31, 0xFC, 0x33, 0xC2, 0x7F, + 0xA2, 0xA2, 0x6D, 0xEB, 0x15, 0x2E, 0xA1, 0x90, + 0xF8, 0x29, 0xC6, 0x34, 0xD1, 0x39, 0x30, 0x24, + 0x1C, 0xB9, 0x26, 0xAC, 0xDD, 0xE5, 0x24, 0x9C, + 0xDD, 0x35, 0x60, 0x7E, 0x38, 0x0C, 0xC1, 0x2A, + 0x7D, 0x1E, 0xA9, 0xBA, 0xA5, 0x58, 0x4C, 0xDD, + 0x26, 0x86, 0x09, 0xDC, 0xC3, 0xB0, 0x1F, 0xCD, + 0xC9, 0xAD, 0xCB, 0x4A, 0x7E, 0x51, 0x67, 0xE5, + 0xED, 0x5A, 0xD2, 0x21, 0xDB, 0x2E, 0xAB, 0xD9, + 0x0A, 0xEC, 0xAE, 0x71, 0xFA, 0x23, 0x7A, 0xEF, + 0x98, 0xDF, 0x53, 0x89, 0x93, 0xE8, 0x71, 0xD7, + 0x35, 0xDA, 0x6B, 0x88, 0x31, 0xAF, 0x67, 0xF2, + 0x97, 0x29, 0x1C, 0x39, 0x67, 0xEB, 0xAF, 0x60, + 0xD9, 0x53, 0xC4, 0x0F, 0x7A, 0x46, 0x4E, 0xF3, + 0x2F, 0x8E, 0xAE, 0xFA, 0x64, 0x2E, 0x37, 0xDE, + 0xA9, 0x74, 0x73, 0x5D, 0xDD, 0xBB, 0x83, 0x54, + 0x27, 0xB9, 0x7A, 0x63, 0x2B, 0x19, 0x8B, 0x26, + 0x22, 0x28, 0x84, 0xA0, 0x58, 0x00, 0x2D, 0x55, + 0xEA, 0x2A, 0x80, 0x0D, 0x6C, 0x97, 0x0E, 0x8B, + 0xF7, 0x67, 0xB2, 0x8B, 0x2D, 0xDE, 0x8F, 0x58, + 0xFE, 0x97, 0x81, 0xE7, 0xE2, 0x58, 0x8D, 0x7E, + 0x1B, 0xAB, 0xE5, 0x15, 0x9D, 0x54, 0xF4, 0x00, + 0x34, 0x1D, 0x12, 0x1B, 0x03, 0x23, 0x2B, 0x06, + 0x2E, 0x8C, 0xD0, 0x0A, 0xDC, 0x19, 0xA1, 0x69, + 0x1D, 0x72, 0x91, 0xB4, 0xED, 0x0E, 0x81, 0xF7, + 0x05, 0x99, 0x84, 0xFC, 0x74, 0x0F, 0x7D, 0xF8, + 0x9B, 0x3E, 0x7F, 0x63, 0x7C, 0x73, 0xEB, 0xF5, + 0x36, 0xB3, 0x24, 0x22, 0xAA, 0x33, 0x0C, 0x30, + 0x42, 0xC3, 0xE2, 0x04, 0x6B, 0x3F, 0x2A, 0x0D, + 0xAB, 0xE8, 0x5A, 0x9A, 0x09, 0xD7, 0xB6, 0xAA, + 0x9C, 0x3E, 0xD0, 0x9E, 0xB5, 0x9B, 0x52, 0x7B, + 0xAF, 0x2D, 0x6B, 0xE0, 0x40, 0x12, 0x34, 0xBE, + 0x49, 0xAB, 0xD2, 0xC8, 0xB5, 0x89, 0x1B, 0x79, + 0xEC, 0xAE, 0x88, 0x89, 0x3C, 0x05, 0xC7, 0x75, + 0xC5, 0x84, 0xF7, 0x10, 0x49, 0x48, 0x92, 0x69, + 0x9E, 0xD5, 0x56, 0xB2, 0x1E, 0x81, 0x18, 0x78, + 0xCB, 0x93, 0x5D, 0x70, 0x3A, 0xB2, 0x67, 0xD1, + 0xCC, 0x8F, 0x83, 0x03, 0xB9, 0x64, 0x46, 0x22, + 0x78, 0x0D, 0x55, 0x67, 0x22, 0x58, 0x0E, 0x22, + 0x6B, 0xBA, 0x01, 0xD4, 0x77, 0x05, 0xA7, 0xAC, + 0xB7, 0xE5, 0xFC, 0xE6, 0x11, 0xCC, 0x92, 0x5A, + 0x8C, 0xC0, 0x08, 0x24, 0xAF, 0xCC, 0x4D, 0xBD, + 0x79, 0xD3, 0x5C, 0x52, 0x2C, 0xFF, 0x1A, 0x48, + 0xBB, 0x91, 0x59, 0x6A, 0x80, 0x32, 0x8C, 0x75, + 0x7C, 0xD2, 0xC1, 0x94, 0x94, 0xA8, 0x55, 0x4B, + 0xF2, 0x96, 0xF7, 0x86, 0xF7, 0x53, 0x4F, 0x54, + 0x74, 0x05, 0x5C, 0xEF, 0x02, 0xA0, 0x8A, 0xD1, + 0x88, 0x72, 0xEB, 0x1B, 0x82, 0xF9, 0xFB, 0xDA, + 0xBC, 0xB9, 0x90, 0x98, 0xF2, 0x4B, 0x9A, 0xA6, + 0x89, 0xD5, 0xB3, 0xD8, 0x7B, 0x94, 0xE3, 0x1F, + 0x17, 0x4F, 0xEB, 0x24, 0x06, 0x2B, 0xAB, 0x5F, + 0x27, 0x9B, 0xCD, 0xCE, 0x50, 0x06, 0x40, 0xDD, + 0x7A, 0x8C, 0x67, 0xF0, 0x8E, 0x07, 0xB4, 0x1C, + 0x3C, 0x13, 0xB2, 0x07, 0x6A, 0x38, 0x59, 0x94, + 0x2C, 0xB1, 0x72, 0xA8, 0x77, 0x5B, 0x15, 0x8F, + 0x88, 0xC4, 0x5C, 0xDC, 0x92, 0xCA, 0xC0, 0xED, + 0x02, 0xFF, 0x1D, 0x57, 0x25, 0xBE, 0x67, 0x3E, + 0x4C, 0xE8, 0x95, 0x2A, 0x80, 0xB2, 0x5D, 0xBC, + 0xFA, 0x17, 0xA9, 0x35, 0x0A, 0x6B, 0x07, 0xC8, + 0x8F, 0x88, 0x8D, 0xBC, 0x97, 0x84, 0xE2, 0x07, + 0x57, 0x92, 0x99, 0x4B, 0xE8, 0xDD, 0xD7, 0xA4, + 0x58, 0xCB, 0x61, 0xCE, 0x16, 0xFC, 0x22, 0xCD, + 0x4B, 0x1A, 0x08, 0xC9, 0xAD, 0x3D, 0xB1, 0xF2, + 0xA9, 0x1B, 0x8E, 0xD0, 0xC7, 0xBC, 0xCE, 0xF9, + 0x0A, 0x7A, 0x4D, 0xBE, 0x82, 0x0A, 0xBD, 0x6C, + 0x42, 0x99, 0xBF, 0x86, 0x65, 0x53, 0xAA, 0x04, + 0x79, 0xD6, 0x6D, 0x7E, 0x0F, 0x40, 0xFA, 0xEE, + 0xCE, 0x38, 0x3B, 0x1C, 0x2F, 0xA4, 0x45, 0xA3, + 0x78, 0x2B, 0xA0, 0x29, 0xC5, 0xAA, 0xA9, 0x09, + 0x29, 0x51, 0xDC, 0x5B, 0xB5, 0x95, 0xE4, 0xCE, + 0xC8, 0x50, 0x71, 0x2D, 0xE9, 0x32, 0x12, 0xA0, + 0x7C, 0x88, 0x6B, 0xED, 0xE4, 0x38, 0xB7, 0x92, + 0xCA, 0xE4, 0xDC, 0xD4, 0x05, 0x3B, 0x2B, 0x84, + 0x95, 0x07, 0xFF, 0xF4, 0x79, 0xFF, 0x1E, 0x73, + 0x1B, 0x8E, 0xDF, 0xA3, 0x15, 0xBD, 0x56, 0xAC, + 0xDA, 0xAD, 0x73, 0x95, 0xC2, 0xD3, 0x72, 0xA8, + 0xF0, 0x8E, 0x6C, 0xE3, 0x7D, 0xBE, 0x4C, 0x87, + 0xFC, 0x0F, 0xA6, 0x3B, 0xED, 0xA4, 0x0F, 0x4F, + 0xF1, 0x5D, 0xF2, 0x56, 0x54, 0xD1, 0xCE, 0x6C, + 0xCA, 0x1C, 0xCB, 0xC2, 0x45, 0x7F, 0x90, 0x61, + 0x0E, 0x3D, 0xCE, 0xBB, 0x5E, 0x41, 0x38, 0x2B, + 0xD4, 0x41, 0x7C, 0x67, 0x7C, 0x71, 0x95, 0x34, + 0xD7, 0xED, 0x4D, 0xAC, 0x6E, 0xF1, 0x46, 0xEA, + 0x7D, 0xA4, 0x4C, 0x69, 0x0B, 0x9C, 0x2F, 0xAA, + 0xF1, 0x17, 0x90, 0x1B, 0xF4, 0x4C, 0x03, 0xBE, + 0x9D, 0x56, 0xCE, 0x0C, 0xCF, 0xE0, 0x87, 0x44, + 0xBE, 0x2C, 0x52, 0xD3, 0xBC, 0xAE, 0x02, 0x30, + 0xC7, 0x26, 0x06, 0x88, 0xA6, 0xAA, 0x9D, 0x50, + 0xF1, 0x94, 0x58, 0xC7, 0x60, 0xF3, 0xA0, 0x6F, + 0x53, 0x66, 0x53, 0xCD, 0x1D, 0xBE, 0xD1, 0xF2, + 0x39, 0xBA, 0x1F, 0xE8, 0x40, 0x84, 0xCD, 0x1C, + 0x8F, 0x3D, 0xB7, 0xD1, 0x51, 0x00, 0xDE, 0xB8, + 0x11, 0xD9, 0x66, 0xAD, 0xD5, 0xE9, 0x33, 0x09, + 0xE1, 0xA8, 0x00, 0x58, 0x65, 0xF1, 0xC1, 0x67, + 0xB4, 0x3A, 0xA7, 0x98, 0x90, 0x6A, 0xDB, 0x91, + 0xDB, 0x4A, 0x16, 0x35, 0xDC, 0x3D, 0x69, 0xEB, + 0x7B, 0xDE, 0xCC, 0x91, 0x1B, 0x8D, 0xE6, 0x46, + 0x61, 0x8E, 0x3F, 0x4C, 0x88, 0x81, 0x85, 0x4A, + 0x73, 0x08, 0x56, 0x52, 0xAE, 0xE6, 0x4A, 0x60, + 0x4A, 0x2E, 0x0C, 0x9A, 0x93, 0x76, 0x35, 0xC9, + 0x36, 0x28, 0x0C, 0x72, 0x19, 0xAD, 0x33, 0xCF, + 0x2B, 0xFB, 0xCE, 0x1A, 0x7D, 0xAC, 0xAA, 0x75, + 0x15, 0x76, 0x81, 0x52, 0x55, 0xCC, 0xB9, 0x39, + 0x07, 0xA3, 0x39, 0x12, 0x8D, 0x6F, 0x53, 0xAF, + 0xC7, 0x14, 0x7F, 0xC7, 0x96, 0x5A, 0x49, 0x3C, + 0x5C, 0xB0, 0x26, 0x47, 0xF4, 0x9D, 0xCA, 0x23, + 0xA6, 0x7D, 0xA6, 0x61, 0xC4, 0xA3, 0x26, 0x40, + 0x0F, 0xA7, 0x27, 0x09, 0xBC, 0x39, 0xFD, 0xA7, + 0x75, 0x38, 0x74, 0xD0, 0x9D, 0x29, 0x15, 0x97, + 0xDE, 0x25, 0x60, 0x4D, 0x19, 0x36, 0x04, 0xFB, + 0xA5, 0x2C, 0xB0, 0xC8, 0xB5, 0xFE, 0xE5, 0x94, + 0x7C, 0xE2, 0x1F, 0x84, 0xBB, 0xFB, 0x78, 0x9E, + 0xA5, 0x7C, 0x5D, 0x4A, 0xB2, 0x48, 0x6F, 0x6E, + 0x67, 0x95, 0x16, 0x5F, 0x01, 0x2A, 0xF8, 0x70, + 0x95, 0xCB, 0x06, 0x93, 0x26, 0x6E, 0x7A, 0x75, + 0xB5, 0xE5, 0x4E, 0x27, 0x1D, 0x8B, 0x30, 0xA6, + 0x67, 0x67, 0xD6, 0xE2, 0xD6, 0xD1, 0x99, 0xA4, + 0x55, 0x73, 0x19, 0x32, 0xF6, 0x0B, 0x6B, 0x4A, + 0xEE, 0x23, 0x33, 0x38, 0x30, 0x68, 0x6F, 0x8E, + 0x60, 0xA9, 0x60, 0x97, 0x3E, 0xEA, 0x5D, 0xE1, + 0x40, 0x6F, 0x0C, 0x76, 0x84, 0xCF, 0xAF, 0x86, + 0x8D, 0x36, 0xE5, 0x7D, 0xAE, 0x9A, 0x13, 0x70, + 0x22, 0x2A, 0x31, 0xFE, 0xC2, 0xFB, 0xE1, 0x58, + 0xA5, 0x4E, 0xEF, 0x10, 0x5B, 0x5E, 0xD4, 0x39, + 0xFC, 0xF9, 0x15, 0x64, 0x78, 0x43, 0x7D, 0x03, + 0x9F, 0x5B, 0xCB, 0x86, 0xD2, 0xEF, 0x28, 0xBD, + 0x14, 0xCB, 0x8A, 0x04, 0x1D, 0x59, 0x23, 0x53, + 0x4D, 0x13, 0xF9, 0x93, 0xFE, 0x19, 0x9C, 0xC3, + 0x3F, 0xD9, 0xC1, 0x12, 0x94, 0x84, 0x13, 0x95, + 0x8F, 0xD9, 0x10, 0xAB, 0x37, 0x69, 0x08, 0x04, + 0x4A, 0x97, 0x82, 0x28, 0x75, 0xBB, 0xC9, 0xF4, + 0x3F, 0x19, 0x6B, 0x00, 0x4C, 0x56, 0x16, 0x1F, + 0x50, 0x82, 0xD1, 0x45, 0xFF, 0x0C, 0x37, 0x28, + 0x04, 0xBB, 0x6C, 0x00, 0x97, 0x3A, 0x79, 0x2D, + 0x9A, 0xB9, 0xA5, 0x16, 0x52, 0x02, 0xA3, 0x86, + 0x81, 0xAA, 0x3A, 0x31, 0xE5, 0xB5, 0x44, 0x2D, + 0x34, 0xE2, 0x7A, 0xD8, 0xFE, 0xA1, 0x36, 0xC0, + 0x36, 0x65, 0x73, 0x12, 0x9F, 0x61, 0x3F, 0x59, + 0xC9, 0x68, 0xB6, 0x34, 0x41, 0x40, 0x25, 0xD6, + 0xE7, 0xAD, 0x25, 0x7D, 0xCB, 0xF1, 0x2A, 0xD8, + 0x53, 0x48, 0x9D, 0xBF, 0xB5, 0xD5, 0x61, 0x18, + 0x0E, 0x2A, 0x21, 0x3E, 0x61, 0x18, 0x07, 0x8E, + 0x6F, 0x9A, 0x96, 0xA8, 0x61, 0xFE, 0x8D, 0x66, + 0x1A, 0x21, 0x99, 0xD9, 0x60, 0x8B, 0xAC, 0x85, + 0x84, 0x3D, 0x41, 0xF9, 0x93, 0x35, 0x24, 0x32, + 0xFF, 0xC0, 0x8A, 0xFA, 0xBC, 0xA7, 0x85, 0x57, + 0x3C, 0x16, 0x83, 0xAE, 0x90, 0xDE, 0x40, 0x12, + 0xE4, 0x2B, 0xA2, 0x47, 0xA4, 0x92, 0x73, 0x54, + 0x6C, 0xA5, 0xB7, 0xEE, 0x62, 0xEA, 0x62, 0x37, + 0xD9, 0xD7, 0x73, 0x58, 0x43, 0xDB, 0x20, 0x60, + 0x8C, 0x4F, 0x87, 0x58, 0xB2, 0x2B, 0xC3, 0x40, + 0xB0, 0xC1, 0xB6, 0xB6, 0xA9, 0xCD, 0xCC, 0x05, + 0x4F, 0x38, 0x5F, 0x08, 0xB3, 0x3B, 0x08, 0x4D, + 0x78, 0x6B, 0x0D, 0x40, 0x46, 0xB9, 0x20, 0xDE, + 0x29, 0x6F, 0x23, 0x96, 0xDA, 0x02, 0xF5, 0x1C, + 0x1A, 0x1A, 0x36, 0xA3, 0x3A, 0xFA, 0x1D, 0x80, + 0x36, 0x3C, 0xF6, 0xB4, 0xDC, 0x2C, 0x88, 0x54, + 0xF7, 0x86, 0xC6, 0xF2, 0x15, 0xF8, 0x85, 0x33, + 0xFB, 0x21, 0x20, 0x59, 0xCE, 0x60, 0x4B, 0xE8, + 0xF1, 0xB7, 0x54, 0x17, 0x1E, 0x83, 0xCD, 0x82, + 0x39, 0x40, 0x14, 0x31, 0xEC, 0x89, 0xC8, 0xE2, + 0x6A, 0xAE, 0x3F, 0x49, 0x5B, 0x38, 0xE7, 0xCD, + 0xE2, 0xF6, 0xEF, 0x90, 0x51, 0x10, 0x83, 0x79, + 0x27, 0x80, 0x2F, 0x45, 0x78, 0x67, 0xAF, 0xF4, + 0x65, 0x95, 0x2D, 0xFE, 0x00, 0xF3, 0x2A, 0x60, + 0x00, 0xF7, 0x26, 0xFA, 0x3C, 0xAD, 0xA9, 0xAF, + 0xCA, 0xF6, 0x69, 0x48, 0x03, 0xBE, 0x18, 0x73, + 0x54, 0x06, 0x06, 0x3E, 0x4E, 0xAD, 0xFC, 0x8B, + 0xC3, 0x43, 0x24, 0x5D, 0xE9, 0xDE, 0x78, 0xDC, + 0xD0, 0xA7, 0x04, 0x77, 0xF0, 0x0D, 0xA3, 0x37, + 0x8C, 0x5F, 0x8B, 0xDF, 0xBE, 0x90, 0x1F, 0xA6, + 0xB3, 0x17, 0x9D, 0x68, 0x36, 0x45, 0x11, 0x60, + 0xFF, 0xF9, 0xBA, 0xDA, 0x80, 0xAA, 0x37, 0x57, + 0xDD, 0x34, 0x30, 0x42, 0x7A, 0x9C, 0x86, 0xB4, + 0x91, 0x30, 0xB8, 0xC0, 0xC4, 0x29, 0x15, 0x31, + 0xF3, 0x9A, 0xB0, 0xCD, 0xAC, 0x8C, 0x7C, 0x8C, + 0x4A, 0xDC, 0x76, 0xB6, 0x31, 0x30, 0xDE, 0x2D, + 0x81, 0x04, 0xC7, 0x48, 0x73, 0x69, 0x02, 0x40, + 0x30, 0x19, 0x66, 0x94, 0x21, 0x65, 0x13, 0x18, + 0xC2, 0x09, 0x14, 0x5F, 0xC4, 0x2F, 0xC4, 0xD6, + 0xA6, 0x05, 0x37, 0xAF, 0x72, 0x0C, 0x47, 0x02, + 0x29, 0x95, 0x08, 0x9D, 0xC9, 0x07, 0x31, 0x38, + 0xA9, 0xB5, 0xDA, 0x21, 0x76, 0x1D, 0x84, 0xD0, + 0x15, 0xAF, 0x2A, 0xA3, 0x69, 0x0A, 0xE9, 0x4F, + 0x75, 0x8A, 0x50, 0xA5, 0x11, 0xD4, 0x5F, 0xAF, + 0x70, 0x43, 0xCB, 0xD7, 0x03, 0x9E, 0xB0, 0xBD, + 0x19, 0x47, 0x94, 0x58, 0x22, 0x86, 0xC6, 0xE3, + 0x62, 0xD8, 0x63, 0x05, 0xD9, 0xE2, 0xE5, 0x4A, + 0x04, 0x54, 0x5A, 0x55, 0x25, 0xAD, 0x15, 0x5C, + 0x4B, 0x71, 0x25, 0xE1, 0x50, 0xE3, 0x62, 0x1B, + 0xD2, 0x43, 0x28, 0xD2, 0x84, 0xE4, 0xE2, 0x05, + 0xE3, 0x01, 0x4C, 0x8F, 0x38, 0x17, 0x49, 0xFD, + 0x3B, 0x52, 0x1A, 0x55, 0xB3, 0x1D, 0x69, 0x83, + 0xAB, 0x9E, 0xC4, 0x73, 0xEE, 0x64, 0x7A, 0x73, + 0x19, 0xEF, 0xCD, 0x7D, 0xB7, 0xF4, 0x2E, 0xCB, + 0x55, 0x2A, 0x8A, 0xCC, 0x8F, 0xF8, 0x4E, 0xFB, + 0xD2, 0x63, 0x8F, 0xF1, 0x10, 0x89, 0x02, 0x93, + 0x3E, 0xAC, 0xA4, 0xB4, 0x89, 0xC7, 0xF7, 0x8B, + 0x3E, 0xE1, 0xE8, 0x93, 0xB9, 0x8E, 0x36, 0x25, + 0xC1, 0xC0, 0xD9, 0x44, 0x81, 0xC0, 0x99, 0x3C, + 0x2B, 0x89, 0xF7, 0xDF, 0xDB, 0xD8, 0xCC, 0x84, + 0xE6, 0xFF, 0xFE, 0xAC, 0x21, 0x16, 0xF1, 0xE2, + 0xEF, 0x0A, 0x32, 0xA7, 0xDE, 0x87, 0x51, 0xEC, + 0xB1, 0x0C, 0x0B, 0xC7, 0x07, 0xD9, 0x9A, 0xF8, + 0xE8, 0xB0, 0xFE, 0xA5, 0x67, 0xAF, 0x53, 0x9F, + 0xEF, 0x23, 0xEF, 0x7D, 0xFF, 0xA8, 0x8E, 0xDE, + 0x97, 0x93, 0x32, 0xA6, 0x7C, 0xCF, 0x49, 0xBC, + 0x36, 0x0D, 0x88, 0x90, 0x89, 0x39, 0x76, 0xA8, + 0x82, 0x19, 0x02, 0xB6, 0x02, 0x82, 0xFE, 0xED, + 0x9C, 0x28, 0x8D, 0xB0, 0x1E, 0x2B, 0x2A, 0xCF, + 0xF3, 0x94, 0xFF, 0x66, 0x33, 0x93, 0x31, 0xD6, + 0xFC, 0xAF, 0xE7, 0xC5, 0x98, 0x01, 0x46, 0xCD, + 0xCB, 0xC4, 0x41, 0x13, 0x6D, 0x42, 0xF5, 0x13, + 0xDF, 0xF9, 0x97, 0x65, 0xD4, 0x7B, 0x6E, 0x10, + 0x79, 0x5D, 0x5A, 0x82, 0xA2, 0x49, 0x53, 0xA7, + 0x6D, 0x9C, 0xDD, 0x0A, 0x80, 0x98, 0x58, 0x07, + 0x30, 0xBF, 0x0B, 0x30, 0xAC, 0x24, 0x9E, 0xA0, + 0xE8, 0xE4, 0x7A, 0x0D, 0xD0, 0x50, 0x82, 0xAE, + 0xBB, 0xEC, 0x15, 0x30, 0x2A, 0xF2, 0xA7, 0xA6, + 0x6A, 0xC8, 0xAE, 0x1E, 0x14, 0x80, 0x7C, 0x18, + 0xE7, 0x2B, 0x88, 0x65, 0xB7, 0x93, 0x12, 0xB3, + 0xC1, 0x2A, 0x20, 0xAD, 0x3B, 0x2E, 0x84, 0xC4, + 0x0D, 0xA7, 0x62, 0x5C, 0x79, 0x52, 0x5D, 0x59, + 0xA4, 0x69, 0x5C, 0x26, 0xFD, 0x4F, 0x80, 0xCC, + 0xFE, 0x8E, 0x70, 0x72, 0xB1, 0x41, 0xE1, 0x75, + 0x53, 0x51, 0xCF, 0x4C, 0x0B, 0x57, 0xF2, 0xB8, + 0x59, 0x76, 0xE6, 0xEF, 0x6D, 0x74, 0xA6, 0x73, + 0x69, 0x7F, 0x7C, 0xB2, 0x35, 0xFE, 0x8A, 0x02, + 0x2F, 0xBE, 0x7C, 0x4D, 0x02, 0xBE, 0x8F, 0xFB, + 0x7A, 0x58, 0x45, 0xEC, 0xBA, 0x1B, 0xC6, 0xB9, + 0x8D, 0xF5, 0xB0, 0x82, 0xD1, 0xB4, 0x97, 0x86, + 0x9B, 0x33, 0x54, 0x49, 0x5B, 0x88, 0xD9, 0xB5, + 0xD0, 0x93, 0x8A, 0x00, 0x5D, 0x0F, 0x37, 0x88, + 0x57, 0xE3, 0xFA, 0x7E, 0x7B, 0xFA, 0x43, 0x74, + 0x8D, 0x64, 0x07, 0xD7, 0x07, 0x85, 0x4D, 0x49, + 0xBC, 0x83, 0xF5, 0xD4, 0x95, 0x3E, 0x3E, 0x09, + 0x65, 0xF3, 0xFC, 0x88, 0xA7, 0xF0, 0x46, 0x61, + 0x44, 0x7D, 0x76, 0xED, 0xC9, 0x8D, 0x0F, 0x8D, + 0xDA, 0x0D, 0x01, 0xC8, 0xB1, 0xA8, 0x9B, 0x4A, + 0xF0, 0xA3, 0x88, 0x54, 0xC1, 0xD6, 0x52, 0x97 + }; +#endif /* WOLFSSL_NO_ML_DSA_65 */ +#ifndef WOLFSSL_NO_ML_DSA_87 + static const byte seed_87[] = { + 0x22, 0x5F, 0x77, 0x07, 0x5E, 0x66, 0xCE, 0x1C, + 0x99, 0xBA, 0x95, 0xB4, 0xFC, 0xDF, 0x25, 0x8B, + 0xBB, 0x6F, 0xA5, 0xFE, 0x9C, 0x34, 0x9F, 0x0F, + 0xDE, 0x3F, 0x71, 0xD5, 0x33, 0x9F, 0x6F, 0xD8 + }; + static const byte pk_87[] = { + 0x8C, 0x52, 0x4B, 0xD9, 0xAC, 0x48, 0x5C, 0xC6, + 0x9A, 0xA0, 0x75, 0x64, 0xE1, 0x4F, 0x0F, 0x60, + 0x13, 0x0E, 0xDE, 0x34, 0x08, 0xA5, 0xD4, 0x81, + 0xFD, 0x76, 0xC2, 0x51, 0x74, 0x75, 0xA8, 0xFB, + 0x24, 0xBF, 0x9E, 0x97, 0x9C, 0xD2, 0x3E, 0xDA, + 0x8A, 0x1B, 0xB6, 0x76, 0xDA, 0x7D, 0x7F, 0x44, + 0xAD, 0x6B, 0xB9, 0xB0, 0x70, 0xD3, 0xD6, 0x44, + 0x7F, 0xBE, 0x6C, 0x0C, 0x71, 0x37, 0xC6, 0xFB, + 0x7B, 0x39, 0x83, 0x63, 0x9C, 0x41, 0x5C, 0xF2, + 0xC9, 0x15, 0xFF, 0xD4, 0x18, 0xEA, 0xA1, 0x4D, + 0xA9, 0xD1, 0xAD, 0x3C, 0x09, 0x8E, 0xA9, 0x05, + 0x34, 0x6C, 0xAA, 0x75, 0x78, 0xF8, 0x6B, 0x6E, + 0x52, 0xE6, 0x57, 0x55, 0x16, 0xF4, 0x92, 0x3E, + 0x74, 0x3F, 0x96, 0xA3, 0x2A, 0xD0, 0x0E, 0xEE, + 0xA1, 0xCE, 0x8A, 0x33, 0xF4, 0x87, 0xB9, 0xF3, + 0x22, 0x5D, 0x2D, 0x84, 0xCD, 0x27, 0x57, 0xCC, + 0xCF, 0xE6, 0xA3, 0x66, 0x24, 0x53, 0x0E, 0x52, + 0x8A, 0x2F, 0x64, 0xFC, 0xE7, 0x04, 0xE7, 0xA7, + 0x6C, 0x2E, 0x6A, 0xDC, 0x00, 0xEF, 0x9B, 0xEC, + 0x91, 0x07, 0xB9, 0x69, 0x8F, 0x11, 0x59, 0xFC, + 0x52, 0xEF, 0x4C, 0x36, 0x5A, 0xFD, 0xB1, 0x50, + 0xED, 0xC3, 0x43, 0x5E, 0x03, 0xBB, 0x70, 0x26, + 0x00, 0x6E, 0x5A, 0x55, 0x13, 0x51, 0xA4, 0xB1, + 0x5F, 0xB8, 0x9F, 0xD2, 0xE9, 0x98, 0x38, 0xE8, + 0xCF, 0x41, 0x73, 0xFD, 0x0D, 0xF1, 0xF6, 0x80, + 0x89, 0xE1, 0x51, 0x8D, 0xD4, 0xB5, 0x79, 0x27, + 0x76, 0xBD, 0xD9, 0x2F, 0xC7, 0xC7, 0x9B, 0xC7, + 0x99, 0x7F, 0x78, 0x84, 0xD2, 0xB8, 0x80, 0xC5, + 0xD2, 0xB7, 0xEE, 0xC8, 0x0A, 0xFE, 0x35, 0x59, + 0x84, 0x5D, 0x39, 0x08, 0x39, 0xBE, 0x5E, 0xBF, + 0x95, 0x93, 0xA7, 0x3E, 0xD0, 0x1E, 0xF6, 0x7D, + 0x50, 0x3F, 0xFB, 0x74, 0x47, 0x04, 0xA2, 0xDC, + 0x49, 0x48, 0x76, 0x2B, 0xC8, 0x43, 0x45, 0x75, + 0x72, 0x84, 0x4D, 0x15, 0x74, 0xE3, 0xEB, 0x37, + 0x83, 0x0A, 0x3B, 0x7C, 0xD4, 0x02, 0xC7, 0x6E, + 0xD5, 0xB4, 0xFC, 0x15, 0xF0, 0x5E, 0x76, 0x03, + 0x4C, 0xBB, 0x6A, 0x29, 0xDE, 0xBC, 0x7E, 0x2B, + 0x34, 0xB2, 0x14, 0x2A, 0x57, 0xCF, 0x1B, 0x39, + 0x73, 0xE5, 0x8B, 0xFF, 0x47, 0x50, 0x42, 0xDC, + 0x22, 0x6C, 0x7E, 0x13, 0x71, 0xF3, 0x37, 0x51, + 0x40, 0xF2, 0x90, 0x57, 0xAC, 0xB4, 0x64, 0x7C, + 0x5F, 0x92, 0x6D, 0x3F, 0xDC, 0xCC, 0xC8, 0xD2, + 0xE1, 0x6B, 0x81, 0xA9, 0xED, 0xCD, 0x0C, 0x8B, + 0x5B, 0x2E, 0x11, 0x89, 0x87, 0x42, 0x4B, 0xEC, + 0xAD, 0x40, 0xA5, 0xE5, 0xB4, 0x6D, 0x1C, 0xB4, + 0x01, 0x0A, 0x8E, 0x9F, 0x6F, 0x25, 0x92, 0x5D, + 0xFE, 0x6B, 0x6F, 0x24, 0x64, 0x5F, 0x9C, 0x88, + 0x86, 0x96, 0xE8, 0x79, 0x64, 0x5B, 0x6A, 0x3A, + 0x76, 0x21, 0x90, 0xCC, 0xB7, 0xD6, 0x26, 0x9D, + 0x35, 0x54, 0x79, 0xDF, 0x71, 0x90, 0x55, 0x2A, + 0x38, 0x52, 0xD1, 0xE9, 0x56, 0x73, 0xE7, 0x19, + 0x44, 0x6A, 0xD3, 0x10, 0x24, 0xB9, 0x4B, 0xF8, + 0xBB, 0xC9, 0x7B, 0x04, 0x66, 0x39, 0xCE, 0x12, + 0x3F, 0xDE, 0xC3, 0x75, 0xAF, 0x9F, 0x8D, 0x4C, + 0xF7, 0x16, 0x9B, 0xEB, 0x5F, 0xE5, 0x1B, 0xBF, + 0x82, 0x2C, 0x53, 0xBA, 0x2D, 0x98, 0xA4, 0xA0, + 0x14, 0xA2, 0xDE, 0x69, 0x7F, 0x03, 0x3C, 0x9E, + 0x4A, 0x57, 0xC6, 0xED, 0xF6, 0x10, 0x6A, 0x76, + 0x2A, 0x81, 0x92, 0x9F, 0x3E, 0xF0, 0xFD, 0xE9, + 0xB7, 0xB3, 0x8A, 0xF6, 0x1A, 0x19, 0x9A, 0x16, + 0x0F, 0x09, 0x45, 0xBD, 0xBB, 0x96, 0x7C, 0x72, + 0x40, 0xFE, 0x94, 0xBD, 0xE1, 0x60, 0x50, 0x53, + 0x13, 0xC9, 0x2B, 0xFA, 0x52, 0x40, 0xA2, 0xA7, + 0xF0, 0x8C, 0x85, 0x78, 0xDB, 0xD6, 0x7F, 0x21, + 0x39, 0xB5, 0x06, 0x72, 0xEE, 0x99, 0xA1, 0xBD, + 0x78, 0x1F, 0xA4, 0xE9, 0x54, 0xF4, 0xFA, 0xDF, + 0xA7, 0x9E, 0xDD, 0x8E, 0xB1, 0xCF, 0xA8, 0x48, + 0x84, 0x5D, 0x70, 0xCB, 0x2D, 0xA9, 0x66, 0x09, + 0x0B, 0x75, 0x75, 0xA2, 0x32, 0xFE, 0xDF, 0x96, + 0x33, 0x84, 0xA7, 0x84, 0x48, 0x1A, 0xFA, 0x82, + 0x79, 0x0A, 0x87, 0xE1, 0x1F, 0x11, 0x74, 0xD4, + 0x3C, 0xC0, 0x8D, 0x4F, 0xD2, 0x5D, 0xBB, 0x40, + 0x10, 0xB2, 0x6F, 0x23, 0xD2, 0xD6, 0xF4, 0xA5, + 0x87, 0xEF, 0x7D, 0xE8, 0xC6, 0xF7, 0xC6, 0x0F, + 0xF9, 0x6F, 0xF8, 0x4C, 0x39, 0xE4, 0x82, 0x1E, + 0x1E, 0x6A, 0x80, 0x2F, 0xEC, 0x22, 0xD6, 0xA0, + 0xAA, 0xB6, 0x2C, 0xCB, 0x16, 0x43, 0x68, 0xC2, + 0x27, 0xF6, 0xA2, 0x31, 0x62, 0x66, 0xEC, 0x2F, + 0xFF, 0x8D, 0xB4, 0x19, 0x51, 0x19, 0xA0, 0x8C, + 0x67, 0xE2, 0x04, 0x04, 0xB9, 0x1F, 0x08, 0x70, + 0x9E, 0xAA, 0xC2, 0xDE, 0xCB, 0x96, 0x19, 0x8F, + 0x02, 0x74, 0x10, 0xCC, 0x1B, 0x82, 0x5D, 0x9C, + 0x07, 0x00, 0xE5, 0xD7, 0x04, 0x51, 0xBA, 0x7F, + 0x67, 0xF9, 0x64, 0x0C, 0xA3, 0x6B, 0xF3, 0x12, + 0x21, 0x80, 0x68, 0xD6, 0xA2, 0xCA, 0xFF, 0x59, + 0x33, 0x43, 0x7D, 0x67, 0xBF, 0xD4, 0x88, 0x4A, + 0x6E, 0x92, 0xBA, 0x41, 0xE1, 0x28, 0xDA, 0xEB, + 0xE1, 0xEA, 0x25, 0x60, 0xE1, 0x2F, 0xED, 0x2C, + 0xD4, 0x4B, 0xC9, 0x4E, 0x9E, 0x9D, 0xFA, 0xBB, + 0xF9, 0x61, 0x41, 0x4C, 0x24, 0x24, 0xFC, 0x9B, + 0x62, 0xFE, 0x73, 0x74, 0xF6, 0xB8, 0x9B, 0xA9, + 0x02, 0x96, 0xF4, 0x90, 0x18, 0xA7, 0xF5, 0x49, + 0xC1, 0xA3, 0x94, 0xB8, 0xED, 0xBD, 0x0B, 0xF3, + 0xDB, 0xF3, 0xBC, 0x10, 0x6A, 0x6B, 0x3F, 0x79, + 0x07, 0xF2, 0x11, 0x09, 0xD5, 0x42, 0x8F, 0xA9, + 0x09, 0x94, 0xBE, 0xF2, 0x0D, 0x3A, 0x91, 0x33, + 0x01, 0x31, 0x34, 0xBF, 0x0A, 0xCA, 0xF1, 0x3E, + 0x66, 0x18, 0xA6, 0x69, 0xEC, 0xEA, 0xC5, 0xE9, + 0x8B, 0x80, 0xFE, 0x4D, 0x93, 0x7B, 0xD4, 0xE5, + 0x74, 0x90, 0xFA, 0xFD, 0xCE, 0x45, 0xE8, 0xD7, + 0xD8, 0x8F, 0x08, 0x8B, 0x3A, 0xA8, 0x01, 0xA2, + 0xB4, 0xE5, 0xF2, 0x29, 0x41, 0x02, 0xBD, 0xCB, + 0xF9, 0x4A, 0x62, 0x54, 0x99, 0x94, 0x61, 0xB7, + 0x8F, 0xA5, 0x8A, 0x7F, 0xDC, 0xAD, 0xD2, 0xF2, + 0x28, 0x1E, 0xF3, 0x18, 0xAE, 0x21, 0x81, 0xF7, + 0xE9, 0xE5, 0xBF, 0x2B, 0xC2, 0x98, 0x24, 0xB1, + 0x45, 0x56, 0x57, 0x31, 0xA1, 0x48, 0xAB, 0x39, + 0xC2, 0x04, 0x29, 0x1B, 0x5B, 0xD3, 0x23, 0x35, + 0xCC, 0x5A, 0x58, 0x10, 0x11, 0x5B, 0xD5, 0x88, + 0xC2, 0x60, 0x37, 0x3D, 0x1C, 0x1C, 0x7B, 0x09, + 0x95, 0xB5, 0x05, 0x12, 0xD8, 0x52, 0x8D, 0xF5, + 0xBD, 0x4A, 0xA5, 0x45, 0x6F, 0x3D, 0x55, 0x9D, + 0x90, 0xAD, 0xD7, 0xA9, 0xD0, 0x25, 0x0B, 0xD7, + 0x55, 0x11, 0x5C, 0x60, 0xBF, 0xBD, 0xFB, 0x9D, + 0x2A, 0xCE, 0x4F, 0xE6, 0xB8, 0x36, 0x3A, 0x4D, + 0xE7, 0xB6, 0xFF, 0x6B, 0xD8, 0xBA, 0xD4, 0xEE, + 0x95, 0x9A, 0x0A, 0x47, 0xD4, 0x76, 0xE0, 0xF7, + 0xAC, 0x02, 0xB6, 0xA8, 0x10, 0x1E, 0xA5, 0x98, + 0xC0, 0xF4, 0x68, 0x5E, 0x55, 0xC1, 0x67, 0xCD, + 0x16, 0x31, 0xBD, 0xA2, 0x86, 0xF3, 0xF8, 0xC0, + 0xED, 0x4A, 0xFF, 0xE8, 0xF5, 0x2C, 0xFA, 0xD2, + 0x06, 0x78, 0x6D, 0x34, 0xBE, 0xF9, 0x15, 0x84, + 0x6D, 0xE5, 0x5F, 0xA4, 0xAC, 0x84, 0x3B, 0x3A, + 0xA6, 0x2D, 0xC2, 0x01, 0xE0, 0x63, 0x92, 0xC7, + 0x77, 0xB5, 0x4E, 0x2C, 0x40, 0x90, 0x48, 0xAF, + 0x8B, 0xE9, 0x6C, 0x1E, 0xEE, 0x16, 0x8F, 0x4E, + 0x4F, 0xFF, 0x35, 0x15, 0xE5, 0x51, 0xF4, 0xB2, + 0x23, 0x1C, 0x6A, 0xCE, 0x05, 0xDC, 0xDC, 0xAD, + 0x7F, 0x9D, 0xDA, 0xB3, 0x0C, 0xAD, 0x9C, 0x62, + 0x68, 0xD6, 0x84, 0x00, 0x76, 0xFF, 0xD3, 0x01, + 0x18, 0xB0, 0xC4, 0xE5, 0xE5, 0x0D, 0x87, 0x8E, + 0xAF, 0x77, 0xEE, 0xCB, 0x56, 0x88, 0x7F, 0xED, + 0xC5, 0x7C, 0x54, 0xD6, 0x28, 0x46, 0xE0, 0x8C, + 0xE6, 0x87, 0xF2, 0x4D, 0x0D, 0x2F, 0x12, 0x62, + 0x06, 0xDF, 0xB2, 0x4E, 0x03, 0x04, 0x78, 0x0B, + 0x03, 0x4C, 0xCE, 0x86, 0xD1, 0xCD, 0x53, 0x00, + 0xED, 0xC6, 0xF8, 0x9A, 0xCB, 0x59, 0x14, 0xA6, + 0x0C, 0x87, 0x35, 0x92, 0x66, 0x0D, 0x02, 0xA9, + 0xEF, 0x0D, 0x7D, 0xC6, 0x45, 0xF3, 0x11, 0xEF, + 0x1F, 0x55, 0x72, 0x1F, 0x1B, 0x45, 0xD2, 0xE4, + 0x8F, 0x3F, 0x9F, 0xEB, 0x27, 0x02, 0xD8, 0x2C, + 0xEF, 0xAD, 0x7E, 0x7E, 0x10, 0xDD, 0x91, 0x5E, + 0x39, 0x06, 0x7C, 0x39, 0xEA, 0x61, 0xB9, 0xCC, + 0xF1, 0x45, 0x56, 0x81, 0x53, 0x55, 0x42, 0xD4, + 0x37, 0x0F, 0x53, 0xF0, 0x7F, 0xA0, 0xC6, 0x50, + 0x9B, 0x1D, 0xC6, 0x7E, 0x9F, 0x1D, 0x89, 0x3B, + 0xEB, 0x85, 0x59, 0x6D, 0x9C, 0x12, 0xEE, 0xAC, + 0xFC, 0xAE, 0xC0, 0xAE, 0x5F, 0xD4, 0x9C, 0x62, + 0xE7, 0x09, 0x8C, 0xFA, 0x80, 0x1A, 0x19, 0x09, + 0x0F, 0x8D, 0x68, 0x9E, 0x45, 0x33, 0xE2, 0x58, + 0x7B, 0xEF, 0xC7, 0x6A, 0xDC, 0x38, 0x33, 0x3E, + 0x5C, 0x53, 0xB5, 0x99, 0xDB, 0x04, 0xA7, 0xEA, + 0xFB, 0x07, 0x9B, 0x25, 0x47, 0xED, 0xAC, 0x5A, + 0xAA, 0x1E, 0xE5, 0x23, 0xDE, 0x64, 0xE5, 0x87, + 0x46, 0x8C, 0x41, 0x52, 0xC9, 0x4F, 0x90, 0x48, + 0x1C, 0xAA, 0xA6, 0xB0, 0x3A, 0x1E, 0xC9, 0x08, + 0xF7, 0x82, 0x71, 0x13, 0x76, 0x6B, 0x9E, 0x52, + 0x22, 0x32, 0xE0, 0xC6, 0xF7, 0xD7, 0x4C, 0xBD, + 0xC3, 0x1C, 0x18, 0xAF, 0xA0, 0x12, 0xD3, 0x22, + 0x6A, 0xFC, 0x71, 0x8A, 0x64, 0x24, 0xAC, 0x19, + 0x4E, 0x85, 0x3C, 0x51, 0xE6, 0xA3, 0xAD, 0xA9, + 0x59, 0x94, 0xD2, 0x7F, 0xC4, 0x9D, 0x93, 0x5B, + 0x51, 0xD7, 0xF3, 0x03, 0xE7, 0x7D, 0x5B, 0x13, + 0x0E, 0xCD, 0x7D, 0x0F, 0x77, 0x3E, 0x84, 0xD7, + 0x4E, 0x69, 0x57, 0x1B, 0x73, 0x99, 0xC9, 0x4D, + 0xC0, 0x19, 0x6B, 0x9D, 0x5F, 0xBA, 0x69, 0xEE, + 0x11, 0xBD, 0x7C, 0x45, 0xD9, 0xA9, 0x65, 0x88, + 0xA7, 0x0E, 0x16, 0xBF, 0xB3, 0x82, 0x5E, 0x5E, + 0x56, 0x13, 0x02, 0x7D, 0xB1, 0xDC, 0xF5, 0x4A, + 0x82, 0x73, 0x72, 0x35, 0x9B, 0x91, 0xAC, 0x04, + 0x69, 0xE9, 0xEA, 0x19, 0xC9, 0xD8, 0x59, 0xEB, + 0x8F, 0x22, 0x5F, 0x43, 0x11, 0x0C, 0xCF, 0xB4, + 0x16, 0x6C, 0x7D, 0x60, 0xCE, 0x14, 0x24, 0xAD, + 0xD7, 0x07, 0xC2, 0x4E, 0x98, 0xA0, 0xDE, 0x9E, + 0xE6, 0x31, 0xED, 0xF8, 0x5B, 0x9C, 0xAF, 0xF7, + 0x57, 0x59, 0x10, 0xA9, 0x92, 0xDC, 0x4F, 0x0C, + 0x2B, 0x88, 0x75, 0x19, 0x1D, 0xB3, 0xBF, 0x70, + 0x23, 0x17, 0xD5, 0x1A, 0x50, 0x30, 0x18, 0x14, + 0x1A, 0x14, 0xE6, 0x1D, 0x4F, 0x8A, 0x96, 0x3E, + 0xD8, 0x6E, 0xD9, 0xBF, 0x94, 0x4E, 0xDE, 0xB8, + 0xFF, 0xE1, 0x6F, 0xFD, 0x31, 0xE8, 0xFE, 0x43, + 0xC2, 0x40, 0x82, 0x45, 0x50, 0xFE, 0x1B, 0xBC, + 0x77, 0x4B, 0xB4, 0x30, 0xA7, 0xD4, 0x46, 0x32, + 0x6A, 0xF7, 0xC5, 0x92, 0xDA, 0x70, 0xB1, 0xB7, + 0xA1, 0x5A, 0x5D, 0x17, 0x3B, 0xDB, 0x2F, 0x28, + 0x8A, 0x6E, 0xEC, 0xDA, 0xC4, 0xF7, 0x2E, 0xCB, + 0xEB, 0x96, 0x60, 0x92, 0x1B, 0xDD, 0xD6, 0x13, + 0x7C, 0x85, 0x9F, 0x8A, 0x9A, 0xE9, 0x5F, 0xC4, + 0x24, 0xFD, 0x33, 0xDF, 0xB3, 0x98, 0x66, 0xF7, + 0xA1, 0x5A, 0xDC, 0x01, 0xC9, 0xFA, 0x37, 0xF1, + 0x7B, 0xD0, 0xF6, 0x66, 0x8A, 0x26, 0x7C, 0xC2, + 0x1B, 0xFF, 0x62, 0xBC, 0xFD, 0xCD, 0x47, 0xDA, + 0xEE, 0x75, 0xF2, 0xAC, 0x60, 0x69, 0x87, 0x26, + 0xCC, 0x92, 0x10, 0x1C, 0x92, 0xC1, 0x43, 0x09, + 0xE9, 0xCE, 0x7D, 0x05, 0x5C, 0x64, 0x55, 0xCB, + 0xBB, 0x7A, 0xAE, 0x05, 0xDB, 0x38, 0xD3, 0xD5, + 0xBB, 0xD9, 0x9F, 0xCB, 0xCF, 0xB7, 0x9C, 0xEF, + 0x7E, 0x7B, 0x2A, 0x6F, 0x84, 0x4E, 0x6A, 0x7F, + 0xD3, 0x5F, 0xF3, 0xB3, 0xC1, 0xF0, 0x02, 0x9C, + 0xA2, 0x4C, 0x86, 0x0E, 0x6B, 0xE2, 0x2B, 0x1D, + 0x1D, 0xB4, 0x55, 0x7F, 0x85, 0x54, 0x2D, 0x85, + 0x64, 0x89, 0x92, 0x19, 0x65, 0x44, 0xD7, 0x95, + 0x48, 0x2C, 0x46, 0x8D, 0x0E, 0xBA, 0xFB, 0x13, + 0x63, 0x52, 0x2E, 0x22, 0x19, 0x3F, 0x7F, 0xFB, + 0x54, 0x4D, 0x73, 0xA1, 0x3C, 0x22, 0xD6, 0x5D, + 0x2B, 0x4A, 0xBD, 0xD7, 0xBB, 0x72, 0x55, 0x80, + 0xD4, 0x57, 0x4E, 0xDC, 0xF2, 0x8B, 0xB3, 0x09, + 0x6A, 0xF9, 0x1A, 0xD3, 0x41, 0x0E, 0x72, 0x95, + 0x49, 0xE7, 0xD1, 0xDC, 0x05, 0x22, 0xC3, 0x3E, + 0x26, 0x95, 0x00, 0x01, 0x8C, 0xE1, 0x54, 0x47, + 0x84, 0x10, 0xA7, 0x67, 0x45, 0xBB, 0xB9, 0x7B, + 0x0B, 0xB4, 0x74, 0x82, 0xED, 0x6C, 0x26, 0x6E, + 0xF2, 0x56, 0xCA, 0x1A, 0xD1, 0x10, 0x68, 0x40, + 0x28, 0x23, 0xD5, 0x98, 0xB3, 0x6B, 0x75, 0x16, + 0x13, 0x87, 0xE1, 0xF2, 0x3F, 0xAB, 0xC0, 0x2A, + 0xF0, 0x16, 0x59, 0x85, 0x1A, 0x5B, 0x41, 0xB7, + 0x52, 0xB1, 0x79, 0x46, 0x20, 0xDF, 0x59, 0xFB, + 0x33, 0xB3, 0x05, 0xF1, 0x12, 0x8B, 0xDB, 0x7C, + 0x51, 0x90, 0xC9, 0x8A, 0xC9, 0x48, 0x10, 0x54, + 0xF4, 0x0F, 0x88, 0x1D, 0xDB, 0x40, 0x1B, 0x3A, + 0xD7, 0x62, 0xD1, 0x75, 0x73, 0xD6, 0xCA, 0x23, + 0x26, 0xB2, 0xBF, 0x4C, 0xCA, 0x22, 0xDD, 0xF6, + 0xAF, 0x22, 0xB8, 0x4F, 0xC2, 0xC3, 0xB3, 0xD3, + 0xED, 0xFA, 0xBA, 0x2E, 0x38, 0x28, 0x6A, 0xAE, + 0x60, 0xE9, 0x2D, 0x11, 0x33, 0xED, 0x7E, 0xE9, + 0x29, 0x8E, 0x01, 0xB0, 0x0F, 0x13, 0x83, 0x44, + 0x17, 0xFA, 0xB6, 0x54, 0x7C, 0xAC, 0x1F, 0xED, + 0xC9, 0x22, 0xF2, 0x4F, 0x69, 0x24, 0x04, 0xFE, + 0xC2, 0x6A, 0xEB, 0xB0, 0xE4, 0xF5, 0x03, 0xCB, + 0xB3, 0x99, 0x50, 0x66, 0x1F, 0x6B, 0xF3, 0xFE, + 0xB7, 0xBF, 0x8D, 0xBA, 0x59, 0x75, 0x75, 0x51, + 0xB0, 0xA5, 0xB9, 0x66, 0xC8, 0xDD, 0x35, 0xAE, + 0x20, 0x66, 0x21, 0x9B, 0x04, 0x3F, 0xC6, 0x90, + 0x6F, 0x2B, 0x5C, 0x78, 0x49, 0x3C, 0x40, 0xE6, + 0xF9, 0x6B, 0x1A, 0xEF, 0xCE, 0x5A, 0xC1, 0x68, + 0xD3, 0x34, 0x05, 0xD0, 0x21, 0x6C, 0xF8, 0xA8, + 0x55, 0xE4, 0x6E, 0x80, 0x9B, 0xAD, 0xA5, 0xC3, + 0x55, 0x0B, 0x28, 0xBB, 0x54, 0x02, 0xD4, 0xF6, + 0x82, 0x73, 0xAB, 0x56, 0x0B, 0xB1, 0x5F, 0x94, + 0xC3, 0xDA, 0x24, 0x1E, 0x7F, 0x62, 0x6B, 0x98, + 0x6B, 0x2A, 0xF3, 0x92, 0x37, 0x3A, 0xB9, 0xE6, + 0x27, 0xC4, 0xBB, 0xAB, 0xE4, 0x9A, 0x60, 0xD2, + 0xAE, 0xCE, 0xFD, 0x44, 0xEB, 0x1C, 0xCF, 0x74, + 0x54, 0xFC, 0xEC, 0x4F, 0xC2, 0xBA, 0xF4, 0x3B, + 0xAC, 0x03, 0xC7, 0x2E, 0xE6, 0x62, 0x44, 0x61, + 0x42, 0xC8, 0xAE, 0xF1, 0xB2, 0xA9, 0xAC, 0xE0, + 0xCE, 0x23, 0xAF, 0xCC, 0x86, 0x61, 0xFE, 0xC5, + 0xCB, 0xAC, 0x4A, 0x1B, 0x5C, 0xC7, 0x2B, 0xFF, + 0x8A, 0x20, 0x62, 0x0E, 0xB9, 0x1D, 0xDD, 0x93, + 0x19, 0x29, 0xE4, 0xD9, 0x13, 0x1D, 0x28, 0x32, + 0x03, 0x5A, 0xA6, 0x8E, 0x20, 0xC7, 0xD6, 0xC6, + 0x4D, 0x19, 0x17, 0xCC, 0x65, 0xB8, 0x84, 0x0C, + 0x38, 0xB4, 0xA9, 0x45, 0x2B, 0x91, 0x61, 0x79, + 0x87, 0x08, 0xA6, 0xBD, 0x28, 0x9A, 0x58, 0x48, + 0xD5, 0x58, 0xC6, 0xCE, 0xC2, 0xC5, 0x72, 0x16, + 0xD9, 0xF4, 0xED, 0x66, 0xAC, 0xFA, 0x93, 0xE8, + 0x26, 0x10, 0x3B, 0x3D, 0x8F, 0xEA, 0x51, 0xCC, + 0x82, 0xC0, 0xDB, 0xDF, 0xA7, 0x13, 0xFB, 0x1B, + 0x77, 0x7E, 0x6F, 0x9E, 0x3C, 0xC5, 0x86, 0x35, + 0x92, 0x5B, 0x6F, 0x76, 0xA1, 0x71, 0x0D, 0x8C, + 0xDC, 0x95, 0x9F, 0xAC, 0x2C, 0x8E, 0x21, 0x01, + 0x37, 0x06, 0x28, 0x64, 0x4C, 0x23, 0xE2, 0x75, + 0x0B, 0xA7, 0xA4, 0xF5, 0x90, 0x87, 0xD2, 0x43, + 0x71, 0x59, 0x7C, 0x8C, 0xCA, 0x77, 0x3B, 0xC5, + 0x36, 0x46, 0xF7, 0x2F, 0xD3, 0x47, 0x18, 0xD7, + 0xC9, 0x4E, 0x56, 0x2D, 0x49, 0x82, 0xAC, 0x7D, + 0xD7, 0x3D, 0xF1, 0xDD, 0x73, 0x8B, 0xE4, 0xA1, + 0x10, 0x85, 0xB6, 0x94, 0xBE, 0x6A, 0x5E, 0xEE, + 0xBD, 0x60, 0xEB, 0x95, 0x76, 0xA8, 0x52, 0xE1, + 0x47, 0x57, 0xA1, 0x9C, 0xEC, 0x44, 0xE5, 0x6F, + 0x68, 0x34, 0x7E, 0x19, 0xBE, 0xCE, 0x56, 0xC9, + 0xBE, 0xCE, 0xFC, 0xB8, 0x32, 0x6D, 0xCB, 0x84, + 0x59, 0xBF, 0x4D, 0xF6, 0xE1, 0x53, 0x41, 0x61, + 0x5C, 0xFB, 0xD2, 0x48, 0xA6, 0x7F, 0x05, 0xB2, + 0xFC, 0xE8, 0xB2, 0x8A, 0x55, 0x7D, 0x19, 0xC0, + 0x69, 0x3B, 0x91, 0x5D, 0x71, 0xE7, 0xBB, 0x72, + 0x7D, 0xB9, 0x64, 0x6E, 0x8B, 0x5B, 0x70, 0x51, + 0xB5, 0x69, 0x8C, 0xC0, 0xFC, 0x95, 0xB2, 0x43, + 0x08, 0xF8, 0x70, 0xE4, 0x6F, 0x87, 0xA7, 0xDF, + 0x23, 0x84, 0xEE, 0xCF, 0x73, 0x38, 0xDE, 0x99, + 0x4C, 0xF8, 0xF1, 0x2D, 0xA2, 0x68, 0x99, 0xE3, + 0x9B, 0xB8, 0xF6, 0xC1, 0x5C, 0x83, 0x07, 0xE9, + 0xB9, 0xE2, 0x51, 0x62, 0xC8, 0x53, 0xF1, 0xC2, + 0xF7, 0x57, 0x8A, 0xA0, 0x42, 0x3C, 0x18, 0x36, + 0xF3, 0x99, 0xFD, 0x34, 0xB2, 0xF0, 0x1D, 0xBA, + 0x43, 0xEA, 0x72, 0x1C, 0x0B, 0x37, 0x47, 0xBC, + 0xAF, 0xDA, 0x22, 0x1F, 0x1C, 0x08, 0x16, 0x13, + 0xBD, 0xAA, 0x07, 0xFD, 0x7E, 0xCA, 0x70, 0x57, + 0x74, 0xDF, 0x68, 0x6B, 0x9F, 0x2D, 0x56, 0xBD, + 0x21, 0x89, 0xFA, 0x09, 0x04, 0xCA, 0x09, 0xBD, + 0x4F, 0xE6, 0x15, 0xF5, 0x89, 0xAB, 0xAC, 0xB2, + 0xC9, 0xBF, 0xC8, 0xBB, 0x87, 0x83, 0xB4, 0xD3, + 0xDC, 0xB1, 0x25, 0x9B, 0xAE, 0xC5, 0x75, 0x0C, + 0x9E, 0x6A, 0x83, 0x41, 0x85, 0x9D, 0x4B, 0xBF, + 0x62, 0x0C, 0x7D, 0x77, 0xC9, 0x89, 0xA6, 0xE1, + 0x28, 0xBD, 0x13, 0x5D, 0x41, 0x26, 0x80, 0x75, + 0x23, 0x57, 0xE7, 0x4F, 0x4D, 0x02, 0x8E, 0x0F, + 0x43, 0x67, 0xF6, 0xA6, 0xE6, 0xB6, 0x84, 0x8D, + 0xF5, 0x7B, 0x6A, 0x95, 0x73, 0x27, 0x86, 0x02, + 0x72, 0xCB, 0xDF, 0x77, 0x1C, 0x6C, 0x5E, 0xD3, + 0xF0, 0x1C, 0x82, 0x7A, 0x0D, 0xBB, 0x70, 0xA3, + 0x98, 0x8B, 0x7B, 0x4A, 0xFE, 0x2D, 0xB1, 0x5C, + 0x61, 0x89, 0x34, 0x4C, 0x81, 0x4B, 0x52, 0x17, + 0x03, 0x81, 0x54, 0x4F, 0x9E, 0x9E, 0x07, 0x16, + 0xF3, 0xD9, 0x18, 0x01, 0x11, 0xFD, 0x67, 0x18, + 0xA2, 0x64, 0x35, 0x42, 0x81, 0x80, 0x4A, 0xBA, + 0xCB, 0xD5, 0xF5, 0x4A, 0x10, 0x7F, 0xE2, 0xCF, + 0xA5, 0x1E, 0xCB, 0x0C, 0xAB, 0x3E, 0x03, 0x98, + 0x73, 0x89, 0xA4, 0x10, 0x75, 0xD5, 0xAC, 0x3D, + 0xCF, 0x56, 0x75, 0xD8, 0x86, 0xC2, 0x21, 0x42, + 0x99, 0x8D, 0x1B, 0x49, 0x09, 0xFE, 0x86, 0x41, + 0xC9, 0xDC, 0x87, 0x8D, 0x5A, 0xF0, 0xF5, 0xBE, + 0xF5, 0x49, 0x64, 0x5A, 0x7A, 0xC3, 0x5D, 0xE4, + 0xD6, 0xB7, 0x30, 0x92, 0x2A, 0x15, 0x86, 0x02, + 0xBE, 0xBA, 0x6E, 0xF6, 0x3D, 0x2D, 0x70, 0x89, + 0xFB, 0xB5, 0x1E, 0xBA, 0xDA, 0x20, 0x12, 0x49, + 0x22, 0xA0, 0xD8, 0x33, 0x9E, 0x4C, 0xC0, 0x27, + 0x0F, 0x9C, 0x1F, 0xD2, 0xA9, 0xF4, 0xD2, 0xA9, + 0x6D, 0xC5, 0x32, 0x16, 0x35, 0x9F, 0x19, 0x88, + 0xC1, 0xAA, 0xA4, 0x66, 0x33, 0xE6, 0x2C, 0x6A, + 0x6E, 0xA2, 0x1B, 0x33, 0xCB, 0xC3, 0x7E, 0xC5, + 0x31, 0x4D, 0x5C, 0x17, 0x4C, 0x33, 0x7F, 0x09, + 0x01, 0x33, 0x82, 0x84, 0x37, 0x03, 0xEB, 0x0E, + 0xB1, 0x5F, 0x1B, 0x60, 0x8A, 0x2C, 0x9F, 0x39 + }; + static const byte sk_87[] = { + 0x8C, 0x52, 0x4B, 0xD9, 0xAC, 0x48, 0x5C, 0xC6, + 0x9A, 0xA0, 0x75, 0x64, 0xE1, 0x4F, 0x0F, 0x60, + 0x13, 0x0E, 0xDE, 0x34, 0x08, 0xA5, 0xD4, 0x81, + 0xFD, 0x76, 0xC2, 0x51, 0x74, 0x75, 0xA8, 0xFB, + 0x9A, 0xFE, 0xF5, 0x92, 0x58, 0xBB, 0x3C, 0xEB, + 0x4C, 0x5E, 0x83, 0xF9, 0xFF, 0xBC, 0x3B, 0x49, + 0xAE, 0xE1, 0xFC, 0x4B, 0x94, 0x4B, 0x8C, 0x75, + 0xD4, 0x67, 0x75, 0x66, 0x7D, 0x6B, 0xA4, 0xF2, + 0xDA, 0xC2, 0xB7, 0xC4, 0xD8, 0x50, 0x25, 0xCB, + 0x5A, 0xDB, 0xA4, 0xAD, 0xBB, 0x44, 0x20, 0x24, + 0x90, 0xEA, 0xA5, 0x2C, 0xAE, 0x80, 0x22, 0xC9, + 0x59, 0x02, 0xB7, 0x10, 0xB0, 0x5E, 0x1E, 0x5F, + 0x52, 0x7D, 0x88, 0xDA, 0xE2, 0x04, 0xBF, 0x45, + 0xA7, 0xA8, 0x49, 0x97, 0x7D, 0xAD, 0x7C, 0x7C, + 0x9E, 0x9C, 0x4A, 0xCC, 0x36, 0x33, 0x0F, 0x30, + 0xFA, 0xDE, 0x52, 0xE9, 0xAE, 0x23, 0x29, 0x13, + 0x10, 0x17, 0x8A, 0xD0, 0x08, 0x8E, 0xE1, 0x10, + 0x30, 0xD0, 0x84, 0x65, 0x92, 0x12, 0x2A, 0x81, + 0x26, 0x2E, 0x11, 0x14, 0x30, 0x61, 0x38, 0x61, + 0x64, 0x42, 0x05, 0x08, 0x91, 0x90, 0x4C, 0x06, + 0x82, 0xCC, 0x90, 0x45, 0x10, 0x39, 0x90, 0x22, + 0x40, 0x2A, 0x9B, 0x16, 0x26, 0x9A, 0xA8, 0x50, + 0x91, 0x12, 0x70, 0x91, 0x20, 0x4D, 0xC0, 0x34, + 0x90, 0x18, 0x28, 0x31, 0x10, 0x02, 0x11, 0x22, + 0xB3, 0x6C, 0x8B, 0xB8, 0x2C, 0x22, 0xB0, 0x69, + 0x53, 0x36, 0x31, 0x61, 0x42, 0x6C, 0xD9, 0x06, + 0x6A, 0xD9, 0x04, 0x45, 0xDB, 0x18, 0x05, 0x12, + 0x37, 0x4A, 0xD4, 0x06, 0x64, 0xD3, 0xA2, 0x85, + 0xA0, 0x38, 0x8A, 0x14, 0xA5, 0x85, 0x50, 0x20, + 0x85, 0xE4, 0xA8, 0x24, 0xC3, 0xC6, 0x31, 0xC9, + 0x34, 0x4E, 0xD2, 0x14, 0x68, 0x82, 0x90, 0x85, + 0xC4, 0x02, 0x61, 0x24, 0x38, 0x05, 0x01, 0xA3, + 0x50, 0x48, 0x08, 0x62, 0x20, 0xB0, 0x25, 0x5B, + 0xA6, 0x4D, 0x98, 0x92, 0x11, 0xC2, 0x06, 0x00, + 0xD1, 0xB0, 0x4D, 0x21, 0xA4, 0x8C, 0x01, 0x16, + 0x72, 0x11, 0xA6, 0x20, 0xD0, 0x16, 0x45, 0x10, + 0x31, 0x8E, 0xCB, 0xC2, 0x69, 0x02, 0x08, 0x91, + 0xD4, 0x30, 0x89, 0x03, 0x41, 0x05, 0x93, 0x16, + 0x8E, 0x5A, 0x18, 0x04, 0x41, 0x10, 0x6D, 0x18, + 0x42, 0x70, 0x53, 0x16, 0x31, 0x52, 0x30, 0x8E, + 0x0C, 0x49, 0x66, 0x0C, 0x90, 0x0C, 0xA4, 0x08, + 0x2E, 0x41, 0x92, 0x05, 0x24, 0x07, 0x30, 0x12, + 0x46, 0x72, 0x13, 0x99, 0x20, 0xE0, 0xA2, 0x4C, + 0x1B, 0x14, 0x52, 0x5A, 0x90, 0x05, 0x08, 0x82, + 0x31, 0x53, 0xC2, 0x90, 0xCC, 0x42, 0x68, 0x18, + 0xB0, 0x2C, 0x00, 0x80, 0x65, 0x58, 0x12, 0x84, + 0x19, 0x90, 0x08, 0x44, 0x26, 0x4A, 0x10, 0xA9, + 0x0C, 0x12, 0x25, 0x0C, 0x9C, 0x10, 0x25, 0x0C, + 0x28, 0x25, 0xD8, 0x46, 0x84, 0x1A, 0x22, 0x71, + 0x5B, 0x28, 0x6E, 0x98, 0x02, 0x51, 0x61, 0xB4, + 0x51, 0x01, 0xA1, 0x21, 0x24, 0x39, 0x12, 0xC8, + 0x08, 0x85, 0xD1, 0x34, 0x64, 0xA4, 0xA8, 0x04, + 0xA2, 0xC0, 0x09, 0x44, 0x48, 0x48, 0x03, 0x37, + 0x00, 0x20, 0x05, 0x4D, 0x20, 0xA4, 0x05, 0x11, + 0x18, 0x82, 0x42, 0x94, 0x4D, 0x24, 0x16, 0x01, + 0x02, 0x93, 0x4C, 0x00, 0x16, 0x06, 0xC1, 0xC0, + 0x0C, 0x8B, 0xC0, 0x41, 0x41, 0x06, 0x42, 0xA3, + 0xC6, 0x64, 0x1A, 0x85, 0x91, 0x41, 0x06, 0x49, + 0x04, 0xA7, 0x44, 0x82, 0x22, 0x6A, 0x50, 0x08, + 0x0E, 0x14, 0x18, 0x20, 0x4B, 0x88, 0x91, 0x01, + 0xA0, 0x49, 0x1A, 0x85, 0x4D, 0x94, 0x18, 0x10, + 0x0A, 0x05, 0x44, 0x94, 0x38, 0x05, 0x93, 0x40, + 0x68, 0x23, 0x07, 0x85, 0xE2, 0x12, 0x22, 0x9B, + 0xB8, 0x08, 0xD2, 0x10, 0x2A, 0x08, 0xA8, 0x10, + 0x92, 0x40, 0x2D, 0xD8, 0x44, 0x4C, 0xCC, 0x94, + 0x05, 0x24, 0x43, 0x4C, 0xD3, 0xC2, 0x48, 0x10, + 0x21, 0x2D, 0xC9, 0xB6, 0x08, 0xC9, 0x06, 0x4D, + 0xE1, 0x90, 0x20, 0x14, 0x24, 0x70, 0x5C, 0x84, + 0x28, 0xC0, 0xC2, 0x81, 0x22, 0x13, 0x50, 0x44, + 0x84, 0x91, 0xCA, 0xA2, 0x48, 0x12, 0x91, 0x05, + 0x5B, 0x92, 0x8D, 0x92, 0x92, 0x24, 0x82, 0x42, + 0x48, 0x03, 0x37, 0x46, 0xD8, 0x44, 0x86, 0x44, + 0x20, 0x89, 0xE4, 0xC2, 0x84, 0xC2, 0x04, 0x65, + 0x49, 0xA8, 0x4D, 0xA4, 0x38, 0x28, 0xDB, 0xA4, + 0x64, 0x24, 0x00, 0x51, 0xC8, 0x12, 0x6D, 0x19, + 0x82, 0x24, 0xCB, 0x00, 0x44, 0x4B, 0x20, 0x20, + 0x9B, 0x82, 0x4C, 0x5C, 0xA8, 0x08, 0xD2, 0xB6, + 0x8C, 0x08, 0x35, 0x20, 0xC0, 0x92, 0x45, 0xE3, + 0xB4, 0x2C, 0x50, 0x32, 0x0E, 0xD1, 0x82, 0x11, + 0x4A, 0x96, 0x08, 0x1C, 0x86, 0x29, 0x02, 0x19, + 0x71, 0x12, 0x03, 0x6E, 0x94, 0x08, 0x50, 0x12, + 0x27, 0x20, 0x0B, 0x10, 0x12, 0xA1, 0x18, 0x06, + 0x5A, 0x36, 0x4C, 0x93, 0xB4, 0x68, 0x21, 0xA7, + 0x28, 0x09, 0x34, 0x91, 0x18, 0x93, 0x49, 0x4A, + 0x32, 0x60, 0x00, 0x29, 0x2D, 0x94, 0x48, 0x44, + 0x09, 0x94, 0x2C, 0x21, 0x07, 0x6C, 0x41, 0x38, + 0x60, 0x8C, 0x10, 0x46, 0x11, 0x19, 0x65, 0x01, + 0x46, 0x60, 0x1A, 0x29, 0x42, 0x23, 0x30, 0x29, + 0x40, 0x96, 0x85, 0x81, 0xC6, 0x6C, 0x09, 0xA2, + 0x31, 0x23, 0xC9, 0x84, 0x18, 0x27, 0x61, 0x02, + 0xA6, 0x05, 0x1B, 0x11, 0x32, 0xD1, 0x80, 0x24, + 0x59, 0x22, 0x52, 0x21, 0x34, 0x64, 0x0A, 0x21, + 0x52, 0x10, 0xC2, 0x80, 0x5C, 0x98, 0x0D, 0x81, + 0xA0, 0x84, 0x14, 0x97, 0x04, 0xCC, 0xC2, 0x04, + 0x1A, 0x81, 0x45, 0x23, 0x44, 0x6C, 0x13, 0xC0, + 0x44, 0x59, 0xC2, 0x68, 0x64, 0x08, 0x52, 0x51, + 0x30, 0x71, 0x12, 0x49, 0x70, 0x12, 0x94, 0x84, + 0x80, 0x12, 0x12, 0x1B, 0x00, 0x50, 0x84, 0x10, + 0x45, 0x4A, 0x30, 0x10, 0x22, 0x95, 0x49, 0xC9, + 0x82, 0x24, 0x03, 0x35, 0x21, 0x18, 0x16, 0x72, + 0x09, 0x89, 0x65, 0x88, 0xB2, 0x89, 0x41, 0xB4, + 0x90, 0x92, 0x38, 0x8C, 0x08, 0x23, 0x26, 0x0B, + 0x80, 0x61, 0x84, 0x28, 0x6A, 0x4C, 0x98, 0x44, + 0x10, 0xB9, 0x30, 0x93, 0x02, 0x49, 0x22, 0x13, + 0x80, 0x1C, 0xC3, 0x48, 0x50, 0xA8, 0x20, 0x1C, + 0x05, 0x00, 0x5B, 0x02, 0x41, 0xD2, 0x84, 0x61, + 0x4B, 0x40, 0x46, 0x20, 0x21, 0x44, 0xD9, 0xC4, + 0x21, 0xD3, 0xA4, 0x4D, 0xC0, 0xC0, 0x09, 0x5B, + 0x28, 0x91, 0x18, 0x15, 0x41, 0x18, 0xC5, 0x4C, + 0x14, 0xB7, 0x61, 0xDB, 0x34, 0x25, 0x02, 0x06, + 0x41, 0x14, 0xA9, 0x65, 0x0B, 0x10, 0x04, 0x23, + 0xC7, 0x49, 0x13, 0x47, 0x0A, 0xD0, 0x30, 0x80, + 0x99, 0x32, 0x68, 0x50, 0x18, 0x06, 0xA2, 0x28, + 0x65, 0x13, 0x35, 0x82, 0xD3, 0x06, 0x81, 0x22, + 0x49, 0x4D, 0x48, 0x44, 0x30, 0xCA, 0x96, 0x2C, + 0x12, 0xC8, 0x08, 0xA1, 0x24, 0x2C, 0x52, 0xA8, + 0x28, 0x23, 0x14, 0x0A, 0xD4, 0x20, 0x4D, 0x18, + 0x12, 0x72, 0xD4, 0x80, 0x44, 0xDC, 0x26, 0x2C, + 0x88, 0x10, 0x0A, 0x04, 0x14, 0x51, 0xC1, 0x96, + 0x00, 0xA3, 0x40, 0x30, 0x99, 0x48, 0x92, 0x9B, + 0x08, 0x86, 0x81, 0x04, 0x20, 0x4C, 0xB2, 0x29, + 0x18, 0x31, 0x08, 0x09, 0x23, 0x8C, 0x4C, 0x02, + 0x6A, 0xCA, 0x00, 0x62, 0x09, 0x22, 0x2D, 0x21, + 0x00, 0x02, 0x0A, 0x39, 0x41, 0x04, 0xA3, 0x50, + 0x90, 0x80, 0x2D, 0x59, 0xB4, 0x71, 0x13, 0x16, + 0x31, 0x11, 0x90, 0x4C, 0xC3, 0x14, 0x20, 0x60, + 0xB2, 0x30, 0x0A, 0xB6, 0x24, 0x21, 0xA9, 0x10, + 0x89, 0x80, 0x88, 0x44, 0x06, 0x8A, 0x91, 0x22, + 0x8E, 0xD9, 0x36, 0x86, 0x10, 0x46, 0x0A, 0xE1, + 0x16, 0x85, 0x42, 0x40, 0x6C, 0x09, 0x49, 0x11, + 0xE0, 0x88, 0x68, 0x12, 0x08, 0x68, 0x5C, 0x26, + 0x24, 0x04, 0xA8, 0x70, 0xC8, 0x08, 0x05, 0x13, + 0x87, 0x41, 0x23, 0x29, 0x72, 0xC9, 0xB8, 0x88, + 0x1B, 0x22, 0x66, 0x11, 0xA5, 0x2D, 0x11, 0x29, + 0x12, 0x50, 0x12, 0x70, 0x03, 0x09, 0x6A, 0x4B, + 0x88, 0x4C, 0xD2, 0xC8, 0x31, 0x40, 0x26, 0x40, + 0x4C, 0x04, 0x50, 0x58, 0x16, 0x71, 0x90, 0xC2, + 0x00, 0x0A, 0x30, 0x8A, 0xDC, 0x24, 0x85, 0x19, + 0xB0, 0x65, 0x1A, 0xA3, 0x64, 0x13, 0xA3, 0x45, + 0xC8, 0x48, 0x91, 0x91, 0x12, 0x20, 0xDC, 0x42, + 0x40, 0x24, 0xC0, 0x4D, 0xA3, 0x98, 0x10, 0x40, + 0x26, 0x25, 0xDC, 0xB4, 0x68, 0x4B, 0xC2, 0x45, + 0x13, 0x06, 0x91, 0xC8, 0x92, 0x24, 0x82, 0xA8, + 0x20, 0x4C, 0x30, 0x48, 0x52, 0x06, 0x01, 0x0B, + 0x24, 0x51, 0x41, 0x36, 0x40, 0x93, 0xC4, 0x70, + 0x44, 0x40, 0x2C, 0x24, 0x28, 0x22, 0x81, 0xA4, + 0x4C, 0x43, 0x84, 0x60, 0x20, 0x23, 0x90, 0x01, + 0x94, 0x6C, 0xDB, 0x28, 0x21, 0x93, 0x30, 0x80, + 0x93, 0xC0, 0x25, 0xC8, 0xA6, 0x50, 0xCA, 0x24, + 0x26, 0xD1, 0x40, 0x31, 0x04, 0xC4, 0x8D, 0xE2, + 0xC0, 0x04, 0x08, 0x33, 0x8C, 0x18, 0x87, 0x91, + 0xC8, 0xC8, 0x71, 0x40, 0x46, 0x06, 0x00, 0x44, + 0x20, 0x22, 0x49, 0x70, 0x11, 0x45, 0x90, 0x02, + 0xC3, 0x61, 0x60, 0xB4, 0x25, 0x80, 0x16, 0x21, + 0x11, 0x09, 0x04, 0x88, 0x04, 0x05, 0xCC, 0x36, + 0x20, 0x01, 0xB1, 0x2C, 0x64, 0xB6, 0x50, 0x54, + 0x32, 0x42, 0x0B, 0x08, 0x8D, 0x12, 0x39, 0x0D, + 0x10, 0x29, 0x52, 0x88, 0xB0, 0x04, 0x11, 0x38, + 0x44, 0xD2, 0xA6, 0x71, 0x0B, 0x45, 0x48, 0x9C, + 0x34, 0x72, 0xA0, 0x28, 0x49, 0x82, 0x16, 0x86, + 0x12, 0x18, 0x61, 0x04, 0x41, 0x0D, 0x8A, 0xA6, + 0x41, 0x80, 0xA8, 0x61, 0xDA, 0x30, 0x65, 0x82, + 0x84, 0x30, 0x08, 0xA3, 0x29, 0x04, 0x33, 0x8E, + 0x02, 0x24, 0x0D, 0x9C, 0x44, 0x10, 0xC9, 0x02, + 0x81, 0x53, 0x06, 0x66, 0x8B, 0x06, 0x90, 0x03, + 0x87, 0x69, 0x21, 0xC9, 0x69, 0x83, 0x46, 0x4E, + 0x14, 0x24, 0x89, 0x8C, 0xA0, 0x6C, 0x99, 0xA2, + 0x2C, 0x11, 0x37, 0x66, 0x0C, 0xA6, 0x4D, 0xD3, + 0xC8, 0x70, 0x03, 0x02, 0x61, 0xC3, 0xB6, 0x65, + 0x23, 0xC1, 0x6C, 0x10, 0x34, 0x8D, 0x1A, 0xC1, + 0x31, 0x43, 0x40, 0x44, 0xD4, 0x08, 0x02, 0x0A, + 0x36, 0x20, 0xE3, 0x26, 0x42, 0x0A, 0x48, 0x26, + 0x1A, 0x13, 0x44, 0x0C, 0x18, 0x61, 0x91, 0x96, + 0x84, 0x02, 0x17, 0x46, 0x9C, 0x20, 0x40, 0x41, + 0xC6, 0x2D, 0x1B, 0x16, 0x0C, 0x98, 0xB2, 0x90, + 0x1A, 0x20, 0x84, 0xE2, 0x34, 0x2D, 0xCB, 0x14, + 0x44, 0x93, 0xC6, 0x8D, 0x58, 0xB2, 0x69, 0x22, + 0xB2, 0x88, 0xC0, 0xB8, 0x2D, 0xA2, 0xC2, 0x31, + 0x20, 0xA3, 0x24, 0x11, 0x46, 0x48, 0x4A, 0xA6, + 0x50, 0x24, 0x09, 0x21, 0x1A, 0x01, 0x0D, 0x20, + 0x36, 0x01, 0xC4, 0x34, 0x70, 0xDA, 0x16, 0x68, + 0x84, 0x22, 0x4C, 0x11, 0x14, 0x09, 0x13, 0xC4, + 0x68, 0x11, 0x41, 0x2D, 0x1C, 0x10, 0x31, 0xDC, + 0xB2, 0x64, 0x42, 0x36, 0x08, 0x5C, 0x10, 0x88, + 0x04, 0x91, 0x25, 0xE1, 0xA0, 0x20, 0x14, 0x18, + 0x12, 0x14, 0x94, 0x91, 0x4C, 0xC2, 0x24, 0xD4, + 0x06, 0x71, 0x21, 0x02, 0x8D, 0xD4, 0x88, 0x30, + 0xC9, 0x36, 0x0E, 0xE4, 0x82, 0x81, 0xC0, 0x04, + 0x6D, 0x24, 0x23, 0x09, 0x21, 0x45, 0x45, 0x20, + 0x06, 0x65, 0xC2, 0x30, 0x2A, 0x18, 0x30, 0x8E, + 0x24, 0x83, 0x89, 0x93, 0x32, 0x66, 0xC1, 0x48, + 0x45, 0x62, 0x48, 0x0A, 0x52, 0xB8, 0x80, 0x11, + 0x86, 0x21, 0x04, 0x34, 0x11, 0x24, 0xB5, 0x6C, + 0x50, 0x36, 0x0A, 0x19, 0xA7, 0x8C, 0x14, 0x90, + 0x0D, 0x1A, 0xA5, 0x68, 0x0B, 0xB1, 0x11, 0x50, + 0x40, 0x08, 0x48, 0xB6, 0x31, 0x14, 0x28, 0x8D, + 0xE3, 0x47, 0xB4, 0xA1, 0x44, 0x94, 0xCC, 0x9F, + 0x0B, 0x94, 0x9F, 0x25, 0x49, 0xD9, 0xB3, 0x8F, + 0x71, 0xF4, 0x17, 0xA4, 0xA6, 0xAC, 0x24, 0x58, + 0x14, 0x25, 0x03, 0xC8, 0x63, 0x3E, 0x10, 0xA8, + 0xD4, 0x10, 0xD7, 0x90, 0x4A, 0x28, 0x37, 0x90, + 0x70, 0x27, 0xE3, 0x56, 0x5F, 0x04, 0x67, 0x76, + 0xC3, 0x67, 0x3F, 0xF5, 0xA5, 0x11, 0xA2, 0x2C, + 0x11, 0x01, 0x5D, 0x63, 0x71, 0x1A, 0xE6, 0x70, + 0x86, 0x46, 0xAB, 0xCE, 0x03, 0xB6, 0x82, 0xAF, + 0x51, 0xBA, 0x81, 0x94, 0x9C, 0x82, 0x36, 0xA9, + 0x49, 0xA5, 0xA3, 0x11, 0x08, 0x8C, 0x4B, 0x13, + 0x41, 0xF0, 0x08, 0xFD, 0xB2, 0x99, 0xED, 0xA8, + 0x07, 0x61, 0x3C, 0x2E, 0xBC, 0x49, 0x7B, 0x1C, + 0xBC, 0x87, 0xBC, 0xAE, 0x5F, 0x5E, 0x8F, 0x5D, + 0xE7, 0xB9, 0x0C, 0x70, 0x36, 0x25, 0x61, 0xFD, + 0x95, 0x9F, 0xAE, 0x0F, 0x8D, 0xF3, 0xA2, 0x45, + 0x24, 0xA7, 0xDE, 0x60, 0xD1, 0x4E, 0x6D, 0xAC, + 0xC7, 0x6A, 0x32, 0x42, 0xC0, 0x73, 0xEB, 0x78, + 0x50, 0xF4, 0x49, 0x52, 0x5E, 0x6F, 0x81, 0x42, + 0x54, 0xF8, 0x82, 0x05, 0xC9, 0x64, 0x74, 0x6A, + 0x60, 0x5E, 0x36, 0x59, 0x40, 0x50, 0xA3, 0xFE, + 0xDA, 0xE2, 0x6D, 0x8D, 0x6E, 0xE4, 0x5A, 0x27, + 0x73, 0x89, 0xDB, 0x0C, 0x5B, 0x14, 0xD9, 0xED, + 0xB2, 0xC7, 0x1D, 0x71, 0x93, 0x91, 0x0A, 0x72, + 0x32, 0xBE, 0xA3, 0xD8, 0x95, 0x8C, 0x94, 0x7E, + 0x63, 0xEB, 0xCE, 0x8B, 0xFC, 0xB0, 0x3F, 0x77, + 0x5C, 0x43, 0x48, 0x18, 0x83, 0xFE, 0xC8, 0xDA, + 0x89, 0xF2, 0x3B, 0x54, 0x82, 0x44, 0xC6, 0x9C, + 0xCC, 0x77, 0x0A, 0xC1, 0x6F, 0xB9, 0x98, 0x10, + 0xD5, 0xF2, 0x60, 0xFF, 0x38, 0xD2, 0x0D, 0xD6, + 0x8C, 0x38, 0x54, 0x5B, 0xD8, 0x38, 0x84, 0x50, + 0x36, 0xF4, 0x02, 0xC1, 0x06, 0x0F, 0x15, 0x1B, + 0xC8, 0x90, 0x9B, 0x6E, 0x36, 0xC8, 0x3F, 0xE9, + 0x8B, 0x62, 0x15, 0x6F, 0xF0, 0xC2, 0x86, 0x7F, + 0xD1, 0xB5, 0x97, 0x53, 0xAE, 0x41, 0xAE, 0x21, + 0x84, 0xAC, 0x57, 0xA5, 0x1F, 0xA7, 0xC7, 0x24, + 0xDF, 0xDE, 0x2F, 0x3C, 0xCD, 0xA2, 0x7E, 0x1D, + 0x97, 0xE1, 0x96, 0xC5, 0xB4, 0x7D, 0xF9, 0x5F, + 0x7E, 0xEF, 0x09, 0xC4, 0xF3, 0x57, 0xF0, 0x51, + 0x73, 0xAB, 0x0E, 0x6A, 0xCA, 0x64, 0xE4, 0x99, + 0x0F, 0xD2, 0x20, 0xAC, 0x72, 0xF1, 0xA8, 0x23, + 0x8F, 0x94, 0x63, 0xDC, 0xB3, 0xBB, 0x62, 0x2C, + 0xEA, 0xA6, 0x27, 0x5A, 0x93, 0xC6, 0xCD, 0xCE, + 0x1E, 0x09, 0xAF, 0x89, 0xEC, 0x22, 0xE4, 0x30, + 0x2D, 0xB9, 0xCD, 0x08, 0x2E, 0x12, 0x76, 0x79, + 0x99, 0xBC, 0xA0, 0x34, 0x0B, 0xDA, 0x89, 0x08, + 0x14, 0x60, 0x7B, 0x98, 0xE6, 0xAF, 0xD2, 0xE1, + 0x87, 0xC8, 0xDA, 0x50, 0xF7, 0x10, 0x2C, 0x72, + 0x74, 0x50, 0xD0, 0x3C, 0x98, 0x06, 0xFE, 0xEB, + 0xC6, 0xC5, 0x69, 0x31, 0x06, 0xE2, 0x2E, 0x7E, + 0x7D, 0x3D, 0x2B, 0x1F, 0x48, 0x43, 0xC5, 0x95, + 0xDA, 0x84, 0x08, 0x1E, 0x2B, 0x50, 0x6D, 0x91, + 0xA6, 0x2B, 0xCD, 0x08, 0x43, 0x7B, 0xA2, 0xD8, + 0x60, 0x6E, 0xF7, 0x80, 0x08, 0xC3, 0x3F, 0x35, + 0xF3, 0x70, 0xA5, 0xC7, 0x56, 0xFC, 0xBD, 0x34, + 0x46, 0x7B, 0xBF, 0x63, 0x19, 0xAC, 0xB6, 0xC3, + 0x1B, 0x81, 0x84, 0x9F, 0xBB, 0x54, 0x05, 0x99, + 0xAE, 0x43, 0xE2, 0xA5, 0x20, 0xFD, 0x5C, 0xC7, + 0x25, 0x47, 0xB1, 0xFD, 0x80, 0xB5, 0x78, 0xC2, + 0x00, 0x98, 0x02, 0xB9, 0x61, 0x2A, 0xBA, 0x39, + 0xC7, 0x20, 0xB8, 0x7D, 0x7A, 0x03, 0x68, 0xE5, + 0x37, 0x71, 0x1F, 0x72, 0xAA, 0x41, 0x61, 0xB4, + 0xC0, 0xC2, 0xD3, 0x7A, 0xCD, 0xD2, 0xED, 0xC2, + 0xC5, 0x99, 0x8C, 0x62, 0xA3, 0x7D, 0xC8, 0x9C, + 0xD2, 0x50, 0x02, 0x0D, 0xCB, 0x68, 0x15, 0xB0, + 0xD6, 0x19, 0x03, 0xC8, 0x01, 0x12, 0x72, 0xA1, + 0x3A, 0xC2, 0xA6, 0x63, 0x51, 0x26, 0x03, 0x5D, + 0x3F, 0x1D, 0x3B, 0x0E, 0x30, 0x6B, 0xB7, 0xEC, + 0xB6, 0x8E, 0x2D, 0x76, 0xC8, 0xD7, 0xAE, 0x59, + 0x81, 0xFC, 0x5F, 0x57, 0x5E, 0xAD, 0xA0, 0x20, + 0xC8, 0xB4, 0x91, 0x2D, 0xEC, 0x03, 0xC4, 0xC6, + 0x55, 0x05, 0x87, 0xA4, 0xA2, 0x21, 0x09, 0x25, + 0x97, 0x21, 0xA4, 0x46, 0x45, 0x46, 0x40, 0x3B, + 0xDC, 0x6F, 0xCD, 0xFB, 0xFB, 0xD9, 0xF4, 0x2C, + 0xEC, 0xF1, 0xC4, 0x73, 0x41, 0x30, 0x60, 0x63, + 0x9A, 0xF2, 0xA5, 0x26, 0x78, 0x9A, 0x5E, 0x70, + 0x98, 0xDE, 0x35, 0x10, 0xA0, 0x5D, 0x45, 0xD5, + 0x95, 0xF7, 0x11, 0xBC, 0x99, 0xD3, 0x00, 0x67, + 0x9A, 0x30, 0x85, 0x36, 0x50, 0xDB, 0x18, 0xEA, + 0x6D, 0xB2, 0xF3, 0x14, 0xDA, 0x23, 0xE2, 0x8A, + 0x44, 0x21, 0x25, 0xD4, 0xA3, 0x28, 0x43, 0xA0, + 0xC6, 0x5C, 0x99, 0xB0, 0x72, 0x6B, 0xC2, 0x1A, + 0x30, 0xBE, 0x6B, 0x7B, 0xE0, 0x31, 0x54, 0x8C, + 0x29, 0xE5, 0xC6, 0x69, 0x53, 0xDE, 0x05, 0x1E, + 0x43, 0xCC, 0x7E, 0x9A, 0x82, 0x4A, 0xC4, 0x0A, + 0x50, 0x65, 0xDC, 0xD8, 0xF9, 0x01, 0x32, 0x65, + 0x1E, 0xF9, 0xA4, 0xCC, 0x07, 0xB9, 0x55, 0x97, + 0x45, 0xA9, 0x61, 0xF8, 0xBE, 0x99, 0x00, 0x12, + 0xD8, 0x17, 0x62, 0xFB, 0x89, 0xE7, 0x05, 0x5E, + 0x1B, 0xCD, 0x2B, 0x09, 0x6C, 0x5A, 0x5C, 0xA3, + 0x66, 0x4D, 0x02, 0x78, 0x0C, 0xC3, 0x63, 0x30, + 0xD0, 0xFA, 0x7B, 0x11, 0x00, 0x40, 0xDD, 0xF0, + 0x8C, 0x7C, 0xBA, 0x4C, 0x63, 0x78, 0xDA, 0xBB, + 0xDF, 0xF9, 0xC9, 0xA4, 0x40, 0x25, 0x86, 0xD1, + 0xBA, 0x22, 0xD7, 0x69, 0x98, 0x4E, 0x9D, 0x15, + 0x21, 0xA8, 0x56, 0xC0, 0xFF, 0x52, 0xE4, 0xB4, + 0x0F, 0xB2, 0x53, 0xE7, 0xA1, 0x34, 0x18, 0xEA, + 0x5B, 0x25, 0x42, 0x13, 0xE3, 0x13, 0xE7, 0xDF, + 0x54, 0x2B, 0x8D, 0x70, 0x51, 0xC7, 0x60, 0xB1, + 0x1E, 0x4D, 0x3A, 0x46, 0x04, 0xA1, 0x11, 0x43, + 0xAD, 0x24, 0x29, 0x90, 0xC9, 0x04, 0x15, 0xC5, + 0x07, 0xE5, 0x46, 0xB8, 0x50, 0x16, 0x6B, 0x66, + 0xFE, 0x1C, 0x8B, 0xFC, 0x20, 0x9C, 0xC4, 0x88, + 0x10, 0x36, 0x5E, 0x56, 0xE8, 0x45, 0x75, 0x89, + 0xFB, 0xD6, 0xD0, 0x8D, 0x9D, 0x53, 0xAE, 0x89, + 0x19, 0x54, 0xCF, 0xE1, 0xFF, 0x12, 0x13, 0xF2, + 0xC7, 0xBE, 0x4C, 0x1E, 0xB0, 0x70, 0x6E, 0xDC, + 0x0A, 0x64, 0x3B, 0x60, 0x3A, 0xEA, 0x0D, 0x41, + 0xDD, 0x8E, 0x09, 0xB9, 0x96, 0x8F, 0x6A, 0x49, + 0x50, 0xEF, 0xDF, 0xD7, 0x73, 0x8D, 0x16, 0x32, + 0xA8, 0x5C, 0x0A, 0x90, 0x18, 0xA1, 0xEB, 0x19, + 0xCC, 0x50, 0xD5, 0x59, 0xD7, 0x35, 0x3F, 0xBA, + 0x38, 0x1B, 0x5F, 0x71, 0x56, 0x70, 0xB3, 0x20, + 0x4D, 0x9E, 0x16, 0xA8, 0xF7, 0x35, 0x19, 0xD2, + 0x09, 0x0A, 0x22, 0x28, 0x81, 0x61, 0x26, 0x5B, + 0x9C, 0xEC, 0x9D, 0x4A, 0x61, 0xCF, 0x0D, 0x3C, + 0x88, 0xEA, 0x0B, 0x7A, 0xA7, 0xC6, 0xAE, 0x31, + 0xBE, 0xC2, 0xBA, 0x48, 0xBB, 0x9D, 0x06, 0xE1, + 0x32, 0x6D, 0x80, 0xCE, 0x27, 0x5C, 0x6F, 0x13, + 0x79, 0x35, 0x9F, 0x9C, 0x11, 0xEA, 0xDB, 0xF5, + 0x49, 0x15, 0xB6, 0x51, 0x86, 0xFC, 0x62, 0x34, + 0x3D, 0x58, 0x6B, 0x0E, 0xF8, 0x3B, 0xBB, 0x42, + 0xF6, 0x2D, 0x5C, 0xE2, 0xF3, 0xAA, 0x9F, 0x03, + 0x43, 0xE9, 0x9E, 0x90, 0xB9, 0xFF, 0x55, 0x93, + 0x60, 0xF8, 0x10, 0x2F, 0xFC, 0xBD, 0x40, 0x23, + 0xB8, 0x4F, 0x4C, 0x7A, 0x74, 0x9F, 0xDC, 0x55, + 0xDF, 0x5E, 0xCD, 0x23, 0xEB, 0xAC, 0x47, 0x4E, + 0x0D, 0x0F, 0xBE, 0xDE, 0x02, 0x64, 0x61, 0x7E, + 0x73, 0x78, 0x8E, 0x25, 0xE9, 0x7D, 0x66, 0xE5, + 0x82, 0xBF, 0x98, 0x5B, 0x36, 0xCE, 0x17, 0x72, + 0x56, 0x9C, 0xDA, 0x63, 0x77, 0x55, 0x8B, 0xA9, + 0x75, 0xF5, 0x28, 0xC3, 0x78, 0x6D, 0x8F, 0xC2, + 0x75, 0x5F, 0x28, 0x9E, 0x3F, 0xFB, 0xF1, 0xFD, + 0xB7, 0xDE, 0x05, 0x3C, 0xD3, 0xE8, 0xD7, 0x7A, + 0x7D, 0xC9, 0xF7, 0x9D, 0x58, 0xB4, 0xA6, 0x21, + 0x25, 0xFC, 0x52, 0x84, 0x21, 0xF6, 0x0B, 0x6D, + 0xA6, 0x62, 0x51, 0x97, 0xCD, 0xA9, 0xA1, 0x0C, + 0x88, 0x21, 0x67, 0xA5, 0xFB, 0x8C, 0x8A, 0x50, + 0xC5, 0x21, 0x91, 0x3A, 0xAB, 0x95, 0x96, 0xF3, + 0x30, 0x6D, 0x08, 0x42, 0x07, 0x4B, 0x78, 0x1F, + 0xC1, 0xD3, 0x41, 0x15, 0x68, 0xED, 0x93, 0x09, + 0xC7, 0x8B, 0xF9, 0x77, 0x25, 0xD3, 0xCE, 0x2B, + 0xA2, 0x0D, 0xB4, 0xC6, 0x84, 0x7F, 0x8E, 0xE5, + 0x24, 0x46, 0x59, 0x8D, 0x6F, 0x0F, 0x0C, 0xA8, + 0xFC, 0x04, 0x9B, 0x4D, 0x2B, 0xA7, 0x70, 0x1F, + 0x46, 0x7E, 0x76, 0x03, 0xC6, 0x7E, 0xA5, 0x3D, + 0x79, 0xE2, 0xF1, 0xAC, 0xBC, 0xDD, 0xF6, 0x91, + 0x69, 0x4C, 0x44, 0x1F, 0xC3, 0xBF, 0x9F, 0xFC, + 0x4E, 0xB0, 0x79, 0x30, 0x68, 0x89, 0xAC, 0xF2, + 0xD7, 0xC6, 0xE1, 0x6C, 0x37, 0xFB, 0xB3, 0x38, + 0x44, 0x2C, 0x97, 0xAB, 0xDA, 0x2C, 0x88, 0xC7, + 0xF2, 0x80, 0x08, 0x00, 0x4E, 0x44, 0xED, 0xBE, + 0xA4, 0x28, 0x3D, 0xC1, 0xCF, 0x9E, 0x83, 0xE7, + 0x2E, 0x7F, 0xF5, 0x08, 0x47, 0x26, 0xE0, 0xBD, + 0x1A, 0x17, 0xDB, 0x2F, 0xED, 0x19, 0x2E, 0x65, + 0x1B, 0x62, 0x5F, 0x08, 0x82, 0x10, 0x61, 0xCB, + 0xAA, 0xA7, 0xF8, 0x59, 0x4B, 0x46, 0xCB, 0xA2, + 0xCB, 0x41, 0x34, 0x30, 0x51, 0x58, 0x2A, 0xEE, + 0xE1, 0x5E, 0xAC, 0xCA, 0xBF, 0x37, 0x45, 0x98, + 0xBD, 0x93, 0x1B, 0x5A, 0x5E, 0x92, 0x14, 0x05, + 0x75, 0x2D, 0xFB, 0x8F, 0xBD, 0x24, 0x9B, 0x81, + 0xCD, 0xDD, 0xF5, 0xBE, 0x05, 0x0D, 0xBD, 0x4B, + 0x2B, 0x8C, 0x0A, 0xF0, 0x3A, 0x85, 0xD6, 0x74, + 0x65, 0x7F, 0x98, 0xF8, 0x57, 0xA2, 0x36, 0xA2, + 0xFE, 0xE4, 0xB4, 0xA4, 0x0D, 0xEA, 0x9A, 0xBE, + 0x41, 0x79, 0x68, 0x63, 0x70, 0x3F, 0x3E, 0x38, + 0x60, 0xC3, 0x40, 0x81, 0x72, 0xDD, 0x25, 0x34, + 0xB4, 0xFE, 0xAC, 0x41, 0x6E, 0x4A, 0xE7, 0xBF, + 0xE3, 0x87, 0xFA, 0x20, 0x8B, 0xBD, 0x68, 0x9E, + 0x06, 0xA9, 0x15, 0x23, 0x07, 0x04, 0x4B, 0xFA, + 0x45, 0x45, 0xB7, 0x75, 0xD3, 0x3E, 0x16, 0x70, + 0xF6, 0x26, 0xF2, 0x3A, 0x9D, 0xFB, 0xEA, 0xEB, + 0x47, 0xCE, 0x99, 0x6B, 0x0E, 0xB2, 0xE8, 0x2B, + 0x18, 0x15, 0x14, 0x2E, 0xF2, 0x14, 0x0D, 0x44, + 0x47, 0x1E, 0x63, 0x84, 0x5B, 0x3F, 0xA8, 0xEF, + 0x5F, 0xEB, 0xA0, 0x41, 0x77, 0xC1, 0xF4, 0x4F, + 0x8E, 0x2E, 0x29, 0xCD, 0xDB, 0xF2, 0x75, 0x24, + 0x24, 0x46, 0x73, 0xC3, 0x46, 0xB5, 0xCA, 0x13, + 0x35, 0x12, 0x0A, 0x8D, 0x88, 0x89, 0x17, 0x99, + 0x13, 0xCA, 0x66, 0x07, 0x67, 0x6B, 0x7B, 0x3B, + 0x20, 0xD3, 0x5F, 0x78, 0x1C, 0xC0, 0x99, 0x59, + 0x0A, 0xBA, 0x8F, 0xA0, 0xDB, 0xDF, 0xCC, 0x03, + 0xC4, 0xA6, 0xC7, 0x08, 0xB9, 0xFD, 0x95, 0xC2, + 0x45, 0xF9, 0xF3, 0x11, 0x62, 0xF7, 0x14, 0xB9, + 0xEB, 0x09, 0xB3, 0x7C, 0xF8, 0xF6, 0x67, 0xCC, + 0x03, 0xB3, 0x06, 0x6F, 0x60, 0xAC, 0x72, 0xF2, + 0xD3, 0x71, 0x6C, 0x4D, 0xAD, 0x3A, 0x99, 0x75, + 0x5C, 0x52, 0x2D, 0x87, 0x69, 0x3E, 0xD6, 0x7E, + 0x12, 0x96, 0xD3, 0x88, 0x8D, 0x11, 0x85, 0xAA, + 0x0A, 0xA5, 0x32, 0x90, 0x51, 0xC5, 0x65, 0x64, + 0xE0, 0xA9, 0x73, 0xA4, 0xF3, 0x8A, 0x32, 0x83, + 0xE5, 0x08, 0x09, 0x39, 0x6A, 0x90, 0x2C, 0xC3, + 0xFC, 0x92, 0x29, 0x7A, 0x45, 0xBE, 0x02, 0x79, + 0x15, 0x1B, 0xBB, 0x60, 0xBB, 0xD9, 0x42, 0xF1, + 0xE5, 0x14, 0xB4, 0xA5, 0xFF, 0x12, 0x42, 0x30, + 0xB0, 0xCB, 0xD0, 0x1D, 0xB4, 0x62, 0x49, 0xC5, + 0xB7, 0xDA, 0x37, 0x47, 0x2C, 0x8B, 0x16, 0xCA, + 0xD2, 0x2C, 0xA1, 0x24, 0xE6, 0x57, 0xFA, 0xEB, + 0x2C, 0x62, 0x2E, 0x12, 0x74, 0x37, 0x2B, 0x3F, + 0x56, 0x23, 0x9C, 0xED, 0x90, 0xDE, 0x0D, 0x6E, + 0x9E, 0x11, 0x78, 0xA4, 0x9C, 0xB3, 0xA1, 0x37, + 0xF7, 0x4B, 0x09, 0x61, 0xD8, 0x33, 0x1D, 0x80, + 0x68, 0x5C, 0xDD, 0xBD, 0x3E, 0xAE, 0x9D, 0xB8, + 0xBA, 0x42, 0x41, 0xDC, 0xC9, 0x93, 0xF1, 0x92, + 0x2F, 0x7A, 0xF9, 0xFE, 0x67, 0x13, 0x87, 0xBD, + 0x7D, 0x04, 0x17, 0x91, 0xB6, 0x03, 0x5E, 0xA0, + 0x5B, 0x23, 0xEA, 0x0C, 0xFA, 0x45, 0xCB, 0x1A, + 0xC5, 0x7F, 0x63, 0xD6, 0x3D, 0x3C, 0x66, 0x4A, + 0x83, 0x4E, 0x4E, 0x90, 0xA6, 0x63, 0xB0, 0x8A, + 0xD7, 0x0D, 0xB4, 0xB7, 0xA9, 0x0F, 0xC6, 0xC7, + 0x3B, 0xAD, 0x07, 0xA6, 0x94, 0x47, 0xDB, 0x63, + 0x26, 0x00, 0x18, 0x5E, 0x27, 0xB5, 0xE2, 0xE3, + 0xED, 0x8D, 0x97, 0x95, 0x38, 0x20, 0x24, 0x9F, + 0x40, 0x84, 0x44, 0x7E, 0x8C, 0x05, 0xAB, 0xB1, + 0x89, 0x26, 0x7D, 0x46, 0x2C, 0x9F, 0xE5, 0xC1, + 0x27, 0xCE, 0x1D, 0x5A, 0x9F, 0xF1, 0xF8, 0x57, + 0x8F, 0xCF, 0xB7, 0x4E, 0x07, 0xF3, 0xBA, 0x56, + 0xCF, 0xE9, 0x87, 0x21, 0x61, 0xD6, 0x97, 0x7B, + 0x26, 0x97, 0x07, 0xB4, 0x87, 0xFE, 0x25, 0x9C, + 0xA9, 0x8E, 0x06, 0x90, 0x17, 0x2C, 0x98, 0x26, + 0x23, 0xEE, 0xBB, 0x91, 0x8A, 0x15, 0x38, 0xA1, + 0x38, 0xCB, 0x8B, 0xA0, 0xF3, 0x4A, 0xF2, 0x12, + 0xA7, 0xB7, 0x05, 0xB6, 0x09, 0xD0, 0xEC, 0xDD, + 0x21, 0xB6, 0xFA, 0x29, 0x95, 0xB4, 0x08, 0xD5, + 0x95, 0xB7, 0xB8, 0x2E, 0x23, 0xAA, 0x89, 0x81, + 0xE2, 0xD0, 0xFD, 0x9C, 0x8D, 0xF0, 0xCA, 0x61, + 0xE3, 0x1E, 0x73, 0x9E, 0xD1, 0x72, 0x5C, 0x63, + 0xB8, 0x74, 0x0E, 0x2C, 0x27, 0x3A, 0x71, 0xF9, + 0xFE, 0x66, 0x33, 0xE9, 0x41, 0x27, 0x61, 0xA3, + 0xFA, 0xD8, 0x66, 0x2A, 0x52, 0x6D, 0xAB, 0xBF, + 0x32, 0xC2, 0x8E, 0x8F, 0xB0, 0x60, 0x52, 0xE1, + 0x96, 0xC8, 0x1E, 0x9A, 0x3E, 0x07, 0xFA, 0x34, + 0xFA, 0x9C, 0x4C, 0x0D, 0x29, 0x0F, 0x68, 0xA6, + 0x59, 0x28, 0x22, 0xB1, 0x99, 0x56, 0x2C, 0x01, + 0x04, 0x2F, 0x34, 0x65, 0xFD, 0xD4, 0xD0, 0xD5, + 0x17, 0x7C, 0x14, 0x92, 0x73, 0x6C, 0x31, 0xCE, + 0xD4, 0xB3, 0x59, 0x83, 0x6B, 0x34, 0x7C, 0x76, + 0x8C, 0xED, 0xD5, 0xE2, 0x4F, 0x39, 0x44, 0xBF, + 0x90, 0x53, 0x9A, 0xC7, 0xD4, 0x6A, 0x86, 0xA3, + 0xE2, 0x15, 0x59, 0xD0, 0x0F, 0x32, 0x92, 0xC2, + 0x9B, 0x9E, 0xE3, 0xF6, 0x94, 0x96, 0xFD, 0x0B, + 0xB6, 0x06, 0x8F, 0x0D, 0x1F, 0x38, 0xFC, 0x6F, + 0xA2, 0x78, 0xAC, 0xC5, 0xB5, 0x6A, 0x6B, 0xEC, + 0x78, 0x8A, 0x6F, 0xD8, 0x21, 0xB7, 0xCF, 0x66, + 0x73, 0x03, 0xCA, 0x2E, 0x3C, 0x7F, 0x2F, 0x29, + 0x41, 0xC9, 0x88, 0xFD, 0x0E, 0xA0, 0x43, 0xD6, + 0x9E, 0xB1, 0xE7, 0x13, 0x9C, 0xF0, 0x9C, 0xCF, + 0x33, 0x22, 0x57, 0xEF, 0xE5, 0xCE, 0xD9, 0xAC, + 0x7D, 0x34, 0x75, 0xBD, 0xAE, 0x84, 0xEE, 0xE8, + 0x5D, 0x8C, 0x55, 0x86, 0xBA, 0x19, 0xE5, 0x9D, + 0x35, 0x6D, 0xD8, 0x70, 0xC5, 0xE0, 0xEA, 0x77, + 0x3A, 0xE5, 0xB5, 0x2C, 0xD2, 0x28, 0xB5, 0xE8, + 0xAF, 0xB1, 0xD2, 0xC4, 0xE5, 0x59, 0x06, 0xB8, + 0x2E, 0xA6, 0x8F, 0xC4, 0x9B, 0x30, 0xF9, 0x37, + 0xDB, 0x29, 0xA1, 0x44, 0x0B, 0xB7, 0xB5, 0xB4, + 0x12, 0xD3, 0x4E, 0xB3, 0xB7, 0xD8, 0x2F, 0x19, + 0xDE, 0x3B, 0xC3, 0x53, 0xCE, 0x1C, 0x34, 0x4C, + 0xA4, 0x6A, 0xE2, 0xD0, 0x04, 0xDF, 0x3C, 0x53, + 0x8B, 0x06, 0x8F, 0x36, 0xE5, 0x77, 0xB2, 0x7A, + 0x1A, 0xC0, 0x0C, 0xBD, 0xA3, 0xA0, 0xEE, 0xB6, + 0x40, 0xAD, 0x5C, 0x04, 0xAE, 0xCF, 0x64, 0x2B, + 0x8A, 0x18, 0x58, 0x86, 0xDE, 0xC9, 0x3D, 0x7D, + 0x15, 0xBC, 0xEE, 0x4C, 0x22, 0xF4, 0x98, 0xD9, + 0x37, 0xEE, 0xE2, 0x40, 0x43, 0xFF, 0xB2, 0x6F, + 0x05, 0xC0, 0x0E, 0x30, 0xDE, 0xD8, 0x0C, 0x0B, + 0xAD, 0xED, 0xCC, 0xBC, 0x29, 0x95, 0x07, 0x40, + 0x10, 0x99, 0xA0, 0xD1, 0x08, 0xF7, 0xD5, 0xF1, + 0xAD, 0xC9, 0xDD, 0xC8, 0x6A, 0x1E, 0x9E, 0x06, + 0xDF, 0x12, 0xFF, 0x66, 0x33, 0x5E, 0x21, 0x47, + 0xC3, 0xDE, 0x36, 0x98, 0x5B, 0xBF, 0x42, 0x9E, + 0x30, 0xA0, 0x81, 0x5C, 0x28, 0x34, 0x1B, 0x3A, + 0x32, 0xBC, 0xDE, 0x52, 0x53, 0x25, 0x1E, 0xF6, + 0xE2, 0x99, 0x12, 0x92, 0x07, 0x1D, 0xEB, 0x08, + 0x36, 0xA7, 0xD5, 0x18, 0x1F, 0xDB, 0x44, 0xA7, + 0xE1, 0x13, 0x06, 0xB0, 0xDF, 0x63, 0x82, 0x68, + 0xEF, 0xF5, 0x2B, 0x04, 0x0B, 0x93, 0xE8, 0xB0, + 0x92, 0x7B, 0xDE, 0x1F, 0xC9, 0x39, 0x8F, 0x42, + 0x9D, 0x06, 0x22, 0x13, 0xC9, 0x97, 0x2F, 0x43, + 0x8A, 0xBA, 0xAF, 0xF9, 0x71, 0xE3, 0x55, 0x5D, + 0x06, 0x77, 0x38, 0x39, 0xA3, 0xED, 0x41, 0x63, + 0xFE, 0x2A, 0xB3, 0x23, 0x43, 0x0C, 0xF3, 0x17, + 0x3B, 0x69, 0xED, 0x32, 0x0A, 0x54, 0xF3, 0x8D, + 0x76, 0xC6, 0x09, 0xDD, 0x88, 0x5B, 0x23, 0x57, + 0x72, 0xC4, 0x87, 0xB8, 0x9D, 0xF7, 0xCA, 0xFB, + 0x7C, 0x61, 0x67, 0x5C, 0x65, 0xF8, 0xD6, 0xD7, + 0x1E, 0x95, 0xB9, 0x73, 0x4D, 0x2E, 0x1F, 0x43, + 0x3E, 0x2B, 0x58, 0x92, 0x15, 0x2E, 0xAA, 0x51, + 0xF0, 0xD4, 0xF2, 0xA6, 0xCD, 0x12, 0x21, 0xD6, + 0xCA, 0x46, 0x2A, 0xFF, 0xCB, 0x1B, 0x6B, 0xB4, + 0x09, 0x17, 0x3B, 0xA2, 0x94, 0xDF, 0x1D, 0x68, + 0x8B, 0x75, 0xEA, 0x11, 0xD6, 0x99, 0x04, 0xD1, + 0x00, 0xDB, 0x61, 0xBC, 0xF2, 0x3B, 0x88, 0x4B, + 0x33, 0xDF, 0x0F, 0xD4, 0xFB, 0x14, 0x0C, 0x6A, + 0x53, 0x61, 0x1F, 0xBD, 0x28, 0xB2, 0x11, 0x19, + 0x38, 0x71, 0x17, 0x76, 0x4D, 0xEE, 0x01, 0xC4, + 0x77, 0x53, 0x2A, 0xAF, 0xD3, 0x78, 0xFF, 0x45, + 0x7F, 0x97, 0x9D, 0x26, 0x92, 0x0E, 0xD9, 0x4E, + 0x34, 0x1D, 0xE8, 0xDD, 0xBF, 0x5F, 0x87, 0xE6, + 0x35, 0x9A, 0x39, 0x71, 0x59, 0x20, 0x01, 0xFB, + 0x53, 0x2C, 0x61, 0x38, 0x0C, 0x8C, 0x02, 0xD3, + 0xA0, 0x53, 0x95, 0x02, 0xED, 0x5C, 0xFE, 0x9B, + 0xD3, 0x6A, 0xF3, 0x3F, 0x92, 0x6F, 0x33, 0x37, + 0x19, 0x97, 0x81, 0x3A, 0x50, 0xE1, 0xD9, 0x27, + 0x7E, 0x64, 0xF8, 0x01, 0x52, 0x26, 0x51, 0xD1, + 0x06, 0xAF, 0x20, 0xA0, 0x28, 0x0F, 0x3F, 0xCB, + 0x21, 0xB7, 0x55, 0x1A, 0x76, 0xB8, 0x9B, 0x4D, + 0xED, 0x2A, 0x05, 0x0E, 0x6E, 0xAF, 0xCC, 0xA1, + 0x08, 0x9C, 0xBE, 0x3F, 0x98, 0xE6, 0xB4, 0xB9, + 0x83, 0xC9, 0x08, 0x41, 0x96, 0xDD, 0xD9, 0x0D, + 0x52, 0x66, 0x94, 0xA4, 0xEA, 0xFC, 0xE5, 0x48, + 0x04, 0x73, 0x64, 0x79, 0x68, 0xC9, 0x4A, 0x81, + 0xA8, 0x07, 0xF8, 0xD9, 0x4E, 0x07, 0x1E, 0xC1, + 0x8F, 0x62, 0xAB, 0xA6, 0xD7, 0x68, 0xFC, 0x57, + 0x5E, 0x75, 0x1B, 0xBF, 0x3D, 0xA6, 0x91, 0xC5, + 0x08, 0x14, 0x5E, 0xF2, 0x4C, 0x22, 0x8B, 0x4E, + 0x29, 0x2D, 0xC0, 0x46, 0x3A, 0x9C, 0x9D, 0x86, + 0xCF, 0x51, 0x85, 0x9D, 0x93, 0x23, 0xA1, 0xA1, + 0xF3, 0x76, 0xB1, 0x56, 0xB0, 0xF4, 0x1F, 0x39, + 0xDA, 0xDB, 0x13, 0x70, 0x29, 0x89, 0x95, 0xD2, + 0xC5, 0xF3, 0x76, 0xFE, 0xEE, 0x99, 0xCF, 0xA0, + 0x84, 0xEC, 0x70, 0xF0, 0xD3, 0xFA, 0x42, 0xDB, + 0xFD, 0x99, 0x65, 0x2F, 0x84, 0x11, 0x99, 0xCD, + 0x38, 0xB3, 0x1B, 0xAB, 0x8C, 0x2D, 0x33, 0x04, + 0xCA, 0xE1, 0xB3, 0x05, 0x9A, 0x20, 0x80, 0xDB, + 0xED, 0x59, 0x42, 0x30, 0x48, 0x37, 0xB3, 0x85, + 0x5C, 0xEE, 0x54, 0x06, 0x92, 0x97, 0x4E, 0xFC, + 0xFA, 0xF7, 0x25, 0xE0, 0x4E, 0x57, 0xC4, 0x72, + 0x38, 0x59, 0xCA, 0x3C, 0x4A, 0x3F, 0x09, 0xD6, + 0x09, 0x15, 0x83, 0xEF, 0x24, 0x21, 0xDD, 0xFD, + 0x66, 0x9E, 0xBF, 0xEE, 0xCC, 0xBF, 0x86, 0x20, + 0x29, 0x40, 0x5E, 0x42, 0xD2, 0xC0, 0x24, 0x2D, + 0x76, 0xE6, 0x64, 0xF9, 0x5D, 0xC2, 0x85, 0xB6, + 0x09, 0x41, 0x04, 0x62, 0x17, 0xDC, 0xF8, 0xFA, + 0x2A, 0x4C, 0xD1, 0x82, 0x31, 0x57, 0xB7, 0x2B, + 0x49, 0xE8, 0x40, 0x13, 0x2A, 0xA1, 0x86, 0xD2, + 0x9A, 0xB8, 0xA9, 0xBE, 0x39, 0xBE, 0xE9, 0xA5, + 0x35, 0x12, 0x08, 0xF1, 0xA9, 0x9E, 0x57, 0x46, + 0x3A, 0x55, 0x16, 0xA7, 0x41, 0xD9, 0x25, 0xB8, + 0x2F, 0xAF, 0xA8, 0x81, 0x5F, 0x5F, 0x46, 0xA4, + 0x3B, 0xB3, 0xE9, 0x1B, 0x74, 0xEF, 0x5D, 0x57, + 0x48, 0x4A, 0x72, 0x08, 0xDA, 0xFE, 0x1D, 0x55, + 0x6B, 0xAB, 0x8B, 0x13, 0x18, 0xBF, 0xDD, 0xF4, + 0x4E, 0x01, 0x5F, 0x4B, 0xF6, 0x80, 0xD4, 0x16, + 0x4B, 0x2F, 0x03, 0x4B, 0xF8, 0x93, 0x20, 0x21, + 0x55, 0x52, 0x49, 0x4A, 0x6C, 0x1F, 0x7D, 0xAD, + 0x04, 0xEF, 0xB3, 0x74, 0xEE, 0xC5, 0xB6, 0xBC, + 0x33, 0x7A, 0xCF, 0x64, 0xB9, 0xF9, 0x41, 0x70, + 0xAF, 0xE9, 0xC7, 0xD6, 0x25, 0x18, 0x17, 0xAB, + 0xBA, 0xC9, 0x05, 0xEF, 0x40, 0x89, 0xD5, 0x69, + 0x76, 0xAA, 0xA0, 0x3E, 0x4D, 0x1C, 0xE7, 0x9D, + 0x9E, 0x74, 0xF4, 0xF2, 0x7B, 0x40, 0xF6, 0x57, + 0x78, 0x66, 0xFC, 0xDA, 0xE3, 0x6B, 0xD2, 0x6E, + 0xC7, 0x9D, 0x65, 0x84, 0xAF, 0x7A, 0x1F, 0xE4, + 0x34, 0xD4, 0x1A, 0x17, 0xA2, 0x72, 0xB0, 0xEE, + 0x5A, 0x0C, 0xF4, 0x02, 0xAC, 0x1D, 0x6F, 0x4A, + 0xD0, 0xB2, 0x02, 0x3A, 0x7D, 0x2C, 0xF1, 0x43, + 0x0E, 0x1E, 0x96, 0xEB, 0x42, 0xF8, 0x3A, 0xF5, + 0x0B, 0x5D, 0xA9, 0x23, 0x02, 0x28, 0xE5, 0x26, + 0x5E, 0x69, 0x38, 0x2F, 0x85, 0x34, 0x32, 0x5E, + 0x5E, 0x29, 0x33, 0x94, 0x05, 0xBD, 0x58, 0xF8, + 0xE8, 0x9C, 0xBF, 0xB1, 0x5A, 0x05, 0xC6, 0x23, + 0x9B, 0xBB, 0x57, 0x69, 0x8C, 0xE6, 0x41, 0x97, + 0x48, 0x01, 0x95, 0xAF, 0xE9, 0x62, 0x8C, 0x6F, + 0x09, 0x43, 0xF3, 0x64, 0x50, 0x90, 0x2F, 0x14, + 0xF7, 0x30, 0x07, 0xE0, 0x4B, 0xA8, 0x39, 0xAC, + 0x21, 0xC4, 0x07, 0x45, 0x5F, 0xD9, 0x87, 0xB1, + 0x57, 0x47, 0x07, 0x66, 0xFF, 0xC7, 0xAB, 0xEE, + 0x1F, 0x55, 0x71, 0x50, 0x63, 0xCF, 0x58, 0x3B, + 0xC8, 0x1B, 0xEA, 0xA5, 0xE2, 0xF1, 0x57, 0xB3, + 0x77, 0x65, 0xA9, 0xBD, 0x23, 0xC8, 0x30, 0x86, + 0xC3, 0x5F, 0xBF, 0x16, 0x3F, 0x42, 0x28, 0x0A, + 0xC6, 0x5A, 0x57, 0x15, 0x2F, 0xA1, 0x96, 0xA9, + 0x25, 0xC5, 0x8E, 0x32, 0x11, 0x62, 0xB3, 0x54, + 0x18, 0x00, 0xA4, 0xA6, 0xD4, 0x0F, 0x68, 0x27, + 0x8F, 0x21, 0x78, 0x02, 0x37, 0x98, 0xBD, 0xCE, + 0x3F, 0xBC, 0xF2, 0x9C, 0x66, 0x8E, 0x79, 0xA1, + 0x54, 0x12, 0x55, 0x2E, 0xC0, 0x59, 0xC7, 0x18, + 0x18, 0x22, 0x4D, 0x27, 0x8B, 0x8D, 0xF3, 0x08, + 0x99, 0xE6, 0x35, 0x14, 0xB1, 0xE3, 0xB8, 0x7A, + 0x40, 0x7B, 0x68, 0x7B, 0xFF, 0xDC, 0x54, 0x41, + 0x06, 0xCA, 0x91, 0xFE, 0xDB, 0x2B, 0xDA, 0x9E, + 0xC5, 0x20, 0xD8, 0xBF, 0x42, 0xBC, 0xE6, 0x39, + 0xC4, 0x26, 0x9E, 0xF3, 0x82, 0xD9, 0xF1, 0xA0, + 0x04, 0xAF, 0xFB, 0x77, 0x13, 0x36, 0xAF, 0xD7, + 0x91, 0x9B, 0x3A, 0x57, 0x98, 0xFE, 0xAD, 0xCD, + 0x46, 0xF8, 0xF8, 0xF1, 0x87, 0x53, 0xBD, 0x57, + 0x3F, 0x99, 0xBC, 0xA6, 0xBD, 0x9B, 0x6E, 0xF4, + 0x17, 0x7A, 0x78, 0x30, 0x70, 0xA3, 0x43, 0xFF, + 0x92, 0xCD, 0x99, 0x73, 0xAE, 0x65, 0x6A, 0x10, + 0xFF, 0x70, 0x47, 0x0F, 0x16, 0x4C, 0x4A, 0x90, + 0xF4, 0x52, 0x05, 0x79, 0x33, 0x63, 0xDE, 0x14, + 0x65, 0xAF, 0x8A, 0x5E, 0x67, 0x20, 0x03, 0x9F, + 0xE6, 0x70, 0x13, 0x6B, 0xE0, 0xF3, 0x6A, 0x4C, + 0x6B, 0x5B, 0xCB, 0xE1, 0x7C, 0x5D, 0x7D, 0xE3, + 0x23, 0xFD, 0xB8, 0x6A, 0xDA, 0x56, 0x1E, 0xA8, + 0x36, 0xC4, 0x29, 0x2D, 0x70, 0x41, 0x03, 0x18, + 0x31, 0x40, 0x79, 0x2E, 0xC8, 0x22, 0x98, 0x5E, + 0x11, 0xED, 0xA6, 0xDD, 0xB9, 0xAF, 0x8C, 0x27, + 0x5C, 0x1B, 0x2E, 0xEA, 0xB8, 0xC6, 0x2F, 0xA0, + 0x40, 0xB2, 0x64, 0x61, 0xFC, 0x0A, 0x3A, 0x10, + 0x88, 0xC2, 0x58, 0xEC, 0xA5, 0x8D, 0x14, 0xE9, + 0x9D, 0x21, 0xAF, 0x64, 0xD6, 0xC2, 0x5D, 0xAA, + 0x0B, 0x8A, 0x57, 0x0F, 0x84, 0x3E, 0x60, 0x8D, + 0xED, 0x05, 0x1D, 0x98, 0xED, 0xAE, 0x11, 0xD9, + 0x27, 0x03, 0x55, 0xED, 0xF5, 0x34, 0x92, 0x52, + 0xF2, 0x6F, 0x30, 0x3E, 0x69, 0xA5, 0x54, 0xA7, + 0x2E, 0x1B, 0x85, 0xAB, 0xA2, 0x3B, 0xEC, 0xC8, + 0x9D, 0xA9, 0xA3, 0xE4, 0xEF, 0x58, 0xB5, 0x33, + 0x88, 0x55, 0x16, 0x5E, 0x7D, 0x7E, 0x69, 0xFC, + 0xCA, 0xBD, 0x9C, 0x65, 0xFA, 0x0B, 0xBD, 0x7B, + 0x16, 0xC4, 0xE2, 0x9C, 0xB4, 0xF1, 0x6A, 0x25, + 0x70, 0x30, 0x32, 0xED, 0xEA, 0xD3, 0x1D, 0xDB, + 0x6F, 0x29, 0x2E, 0x42, 0x14, 0xBE, 0x03, 0x29, + 0x0A, 0x8A, 0x98, 0x9A, 0xD7, 0xB7, 0x0C, 0xF8, + 0xB9, 0xCF, 0x37, 0xC6, 0xAC, 0xAC, 0x6D, 0xCC, + 0x03, 0x23, 0x9F, 0x66, 0x85, 0x4B, 0x70, 0x45 + }; +#endif /* WOLFSSL_NO_ML_DSA_87 */ + + key = (dilithium_key*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + + if (key != NULL) { + XMEMSET(key, 0, sizeof(*key)); + } + + ExpectIntEQ(wc_dilithium_init_ex(key, NULL, INVALID_DEVID), 0); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), 0); + ExpectIntEQ(wc_dilithium_make_key_from_seed(key, seed_44), 0); + ExpectIntEQ(XMEMCMP(key->p, pk_44, sizeof(pk_44)), 0); + ExpectIntEQ(XMEMCMP(key->k, sk_44, sizeof(sk_44)), 0); +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), 0); + ExpectIntEQ(wc_dilithium_make_key_from_seed(key, seed_65), 0); + ExpectIntEQ(XMEMCMP(key->p, pk_65, sizeof(pk_65)), 0); + ExpectIntEQ(XMEMCMP(key->k, sk_65, sizeof(sk_65)), 0); +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), 0); + ExpectIntEQ(wc_dilithium_make_key_from_seed(key, seed_87), 0); + ExpectIntEQ(XMEMCMP(key->p, pk_87, sizeof(pk_87)), 0); + ExpectIntEQ(XMEMCMP(key->k, sk_87, sizeof(sk_87)), 0); +#endif + + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + +static int test_wc_dilithium_verify_kats(void) +{ + EXPECT_DECLS; +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + dilithium_key* key; + int res; +#ifndef WOLFSSL_NO_ML_DSA_44 + static const byte pk_44[] = { + 0x35, 0x07, 0x31, 0x3A, 0xE3, 0x7A, 0xF6, 0x96, + 0x6C, 0x11, 0xA9, 0xE4, 0x0B, 0xEB, 0xEC, 0xE9, + 0x2B, 0x67, 0x3F, 0xD2, 0x67, 0x3C, 0x1C, 0x4C, + 0x08, 0xF0, 0x45, 0xA9, 0xDD, 0x5A, 0xB8, 0x8C, + 0x0A, 0x51, 0xA9, 0xBA, 0x89, 0x0F, 0x4C, 0xCB, + 0x9D, 0x0A, 0x41, 0x3F, 0x9C, 0xF4, 0x13, 0x36, + 0x79, 0x49, 0x00, 0x90, 0xBB, 0x57, 0x3B, 0xBD, + 0x2E, 0x18, 0xB3, 0xD0, 0xA5, 0x0E, 0x6B, 0x67, + 0xFF, 0x98, 0x8C, 0xDD, 0x07, 0xE8, 0xA7, 0xA1, + 0x3F, 0xAE, 0xFB, 0xD6, 0xC0, 0xF8, 0xF3, 0x34, + 0xA5, 0x17, 0xC2, 0x34, 0x88, 0x92, 0x65, 0xA6, + 0xE8, 0x66, 0x57, 0xFE, 0x86, 0x08, 0xF7, 0xDF, + 0xA0, 0x5B, 0x70, 0x3E, 0x91, 0x6C, 0x63, 0xA0, + 0xA3, 0x75, 0x55, 0xF8, 0xB6, 0xAA, 0xD4, 0x1B, + 0x78, 0x5E, 0x42, 0x9F, 0x96, 0xE4, 0xA0, 0x50, + 0xB6, 0x94, 0x2D, 0xC3, 0xE3, 0x36, 0x2B, 0x9D, + 0x6B, 0x7A, 0xEF, 0xF5, 0x68, 0xF2, 0x11, 0xDF, + 0x87, 0xA0, 0x9A, 0xC4, 0x61, 0xFB, 0xA4, 0x1C, + 0x98, 0x3F, 0xC9, 0x52, 0x59, 0x3B, 0x47, 0x4D, + 0xF5, 0x24, 0xA3, 0xD8, 0x63, 0xE1, 0xED, 0xDC, + 0xFD, 0xEB, 0x96, 0xFB, 0xF3, 0xE7, 0x50, 0x9C, + 0x72, 0x61, 0xC7, 0x3C, 0xCE, 0xF2, 0xEB, 0x22, + 0x55, 0x6B, 0x9F, 0x25, 0xE4, 0x45, 0xE1, 0xFB, + 0x3E, 0x2E, 0x4E, 0x92, 0x4F, 0x8A, 0x85, 0xEB, + 0x63, 0x2C, 0x05, 0x0F, 0x9A, 0xEC, 0x0E, 0x9D, + 0x05, 0x81, 0x46, 0x82, 0xEA, 0x74, 0x91, 0xD5, + 0x2A, 0xBC, 0xCC, 0xBB, 0xD6, 0x7F, 0x5F, 0x9A, + 0xD3, 0xBD, 0xEB, 0x14, 0xBA, 0x84, 0x27, 0x13, + 0x32, 0xB5, 0xF3, 0x71, 0xAC, 0x47, 0x19, 0x6B, + 0x5E, 0x43, 0x50, 0xC2, 0xA8, 0x82, 0xF5, 0x97, + 0x9B, 0x27, 0x62, 0xFB, 0xB7, 0xFF, 0x6B, 0xC8, + 0x52, 0x1E, 0xFB, 0x97, 0x39, 0x1E, 0x7F, 0x01, + 0xF8, 0x34, 0x47, 0xAA, 0xB2, 0x64, 0xB5, 0x9E, + 0x28, 0x18, 0xCB, 0x4A, 0x94, 0xBE, 0x6A, 0x43, + 0x5B, 0xAE, 0x21, 0xA4, 0x63, 0x64, 0x46, 0x0C, + 0x6B, 0x36, 0x1C, 0x2A, 0x3B, 0x64, 0xFA, 0xA0, + 0xAB, 0xE3, 0x3B, 0x7D, 0xB0, 0x23, 0x99, 0x21, + 0x55, 0x59, 0xBF, 0xD6, 0xDB, 0xB8, 0xDB, 0x09, + 0x5E, 0xBC, 0x32, 0x3C, 0xAC, 0xAB, 0x1A, 0x63, + 0x32, 0x21, 0x10, 0xD5, 0x8D, 0x7A, 0x5F, 0xCE, + 0x72, 0x8D, 0x2A, 0xED, 0x1D, 0x30, 0x38, 0x5D, + 0x3E, 0x62, 0xC2, 0x8E, 0xC9, 0x9F, 0x8C, 0x50, + 0x3F, 0xC6, 0xCE, 0x86, 0x4D, 0x67, 0x3D, 0x09, + 0xB6, 0x27, 0x14, 0x57, 0x14, 0xED, 0xC9, 0x8F, + 0xAC, 0x9E, 0xAC, 0x6F, 0xB5, 0xB2, 0xE6, 0x8D, + 0x9D, 0x5E, 0xE6, 0x78, 0x77, 0x09, 0x94, 0x35, + 0x5E, 0x3B, 0x64, 0x04, 0x38, 0xD4, 0x5B, 0x04, + 0xB8, 0x6C, 0x33, 0x97, 0xE1, 0x58, 0x54, 0x32, + 0xB3, 0x0F, 0x37, 0x69, 0x39, 0xCE, 0x57, 0x31, + 0x5C, 0x75, 0xA8, 0x94, 0xD0, 0x39, 0x2D, 0xB4, + 0x73, 0xA7, 0xA4, 0x7C, 0xBE, 0x34, 0x03, 0x2D, + 0x99, 0x1D, 0xDF, 0x32, 0x26, 0xB7, 0x45, 0x1B, + 0x03, 0xCD, 0xEE, 0x9D, 0x58, 0xA8, 0xA7, 0x76, + 0x1B, 0x17, 0x42, 0xD9, 0x69, 0x0F, 0x26, 0x3A, + 0x9D, 0x70, 0x9B, 0x4E, 0x81, 0xEB, 0x96, 0x02, + 0xB5, 0xB3, 0x92, 0x31, 0xFE, 0xBC, 0x38, 0x11, + 0x5A, 0x47, 0xED, 0x0A, 0x2A, 0xE2, 0xB8, 0x47, + 0x13, 0x5E, 0x43, 0x97, 0xD5, 0xFA, 0x31, 0x02, + 0x58, 0xE9, 0x9E, 0xB5, 0x3F, 0x85, 0x92, 0x0E, + 0xB9, 0xDB, 0xE0, 0xEE, 0x56, 0x76, 0x64, 0x8F, + 0xF2, 0xE2, 0x47, 0x81, 0xD4, 0xA4, 0x82, 0x43, + 0x69, 0xAE, 0x8E, 0x48, 0x50, 0x84, 0x93, 0x3B, + 0x9C, 0x65, 0xD3, 0x6F, 0xCD, 0x90, 0xA0, 0xD8, + 0xA0, 0xE1, 0x79, 0xCC, 0xD5, 0x1F, 0x71, 0x73, + 0x93, 0xE7, 0xB2, 0xB0, 0x78, 0x17, 0xD7, 0x79, + 0xDE, 0xCC, 0x83, 0x7D, 0x5A, 0xF2, 0x0E, 0xA6, + 0xB1, 0x76, 0x61, 0x15, 0x88, 0x8E, 0xD7, 0xA6, + 0x51, 0xBF, 0x9C, 0xD1, 0x0A, 0xFC, 0xDA, 0x65, + 0xA5, 0x65, 0xFE, 0xB2, 0xED, 0x07, 0x74, 0x42, + 0x4C, 0xF5, 0x42, 0x3D, 0xAF, 0x5F, 0x4D, 0x72, + 0x51, 0xE6, 0x3F, 0x68, 0xCC, 0xC5, 0x2D, 0x89, + 0x01, 0xD8, 0x80, 0xB4, 0xFC, 0xEB, 0x3B, 0xBE, + 0x7C, 0xFA, 0x24, 0x27, 0xE1, 0x05, 0x94, 0x67, + 0xAD, 0xB3, 0x47, 0x7D, 0x28, 0x18, 0xC1, 0xC9, + 0xB8, 0xA1, 0x2A, 0x95, 0xBB, 0x5D, 0xC9, 0x42, + 0x4F, 0x64, 0x94, 0x07, 0x5F, 0x65, 0xD3, 0xA5, + 0x65, 0xEE, 0x67, 0x2C, 0x10, 0x65, 0x81, 0x4D, + 0x7F, 0xAF, 0x2E, 0x97, 0x9E, 0x11, 0xA3, 0xF5, + 0x3E, 0xDE, 0xB1, 0x1D, 0x44, 0x72, 0x90, 0x74, + 0xFD, 0x47, 0x82, 0xA6, 0x04, 0x3E, 0x28, 0x3C, + 0x15, 0xDF, 0xC4, 0x7A, 0x7C, 0xF5, 0x5A, 0xC6, + 0xFB, 0xE4, 0xC2, 0xE0, 0x6E, 0x4C, 0x09, 0x2E, + 0xE3, 0xE6, 0x3A, 0xEF, 0xF6, 0x54, 0xDC, 0x92, + 0xBE, 0x8F, 0x24, 0x8E, 0x70, 0x53, 0x90, 0x3D, + 0x06, 0xA5, 0x0A, 0x72, 0xA0, 0x7B, 0x22, 0x14, + 0x80, 0x43, 0xAD, 0xDC, 0x11, 0xFC, 0xFF, 0xCF, + 0x5E, 0xA4, 0x69, 0x1C, 0x09, 0x09, 0xC3, 0x3D, + 0xF5, 0xE7, 0x05, 0x6F, 0x16, 0x33, 0x75, 0xB4, + 0x9B, 0x7B, 0x26, 0xDB, 0xE7, 0x27, 0x56, 0xD3, + 0x91, 0x82, 0x9D, 0xEB, 0x96, 0x3E, 0xE8, 0x40, + 0xAB, 0x5D, 0x6C, 0xB7, 0xA6, 0x36, 0x07, 0xD4, + 0xE7, 0x7C, 0xD4, 0x5C, 0x36, 0xE4, 0xFC, 0x7C, + 0x8A, 0x36, 0x8D, 0x53, 0x43, 0xD4, 0xAC, 0x0B, + 0x1B, 0xBA, 0x32, 0x88, 0xFA, 0xCE, 0xC1, 0xB9, + 0x34, 0x3C, 0xAC, 0xA0, 0xF4, 0xF2, 0x83, 0xA8, + 0xBB, 0x6F, 0x12, 0xC6, 0xB5, 0x3C, 0xDE, 0xA8, + 0x49, 0x66, 0x97, 0xD7, 0x7E, 0x37, 0xF7, 0xCE, + 0x7C, 0xF8, 0xC8, 0xBB, 0x8C, 0xB5, 0x3B, 0x3F, + 0xB9, 0x51, 0x68, 0x00, 0xD7, 0x2E, 0x1C, 0x10, + 0xAF, 0x9F, 0x3C, 0xD2, 0xAC, 0xE5, 0xBE, 0x94, + 0xB9, 0x60, 0xF5, 0xB2, 0x70, 0x24, 0xE8, 0x8A, + 0x2C, 0xD8, 0x95, 0xAF, 0xAA, 0xA9, 0xA5, 0x2B, + 0xCA, 0xE0, 0x58, 0x44, 0x02, 0x3F, 0xF8, 0x21, + 0x0C, 0x29, 0xB7, 0xD5, 0x08, 0x9E, 0x69, 0x81, + 0xD4, 0x6C, 0xC5, 0x0B, 0xF6, 0xEF, 0xAB, 0x01, + 0xEA, 0xDF, 0x36, 0x2C, 0x5C, 0xFB, 0xEB, 0xC8, + 0x4F, 0x71, 0x80, 0xD7, 0x00, 0xC9, 0x32, 0x5D, + 0x02, 0x4F, 0x96, 0x94, 0x71, 0xCD, 0x98, 0xC4, + 0x25, 0x7A, 0x92, 0xF1, 0x9B, 0xA0, 0x34, 0x30, + 0x6C, 0x41, 0x59, 0xD5, 0x01, 0x5D, 0xD6, 0x56, + 0xEA, 0x05, 0xF2, 0xFC, 0xF8, 0x58, 0xFA, 0x12, + 0x9C, 0x5A, 0x5C, 0xD5, 0x3D, 0xC7, 0x5D, 0x1B, + 0x99, 0x2A, 0x6A, 0x4C, 0xF9, 0xEA, 0x9D, 0x70, + 0x53, 0xBC, 0xBE, 0xAD, 0x61, 0xC7, 0x2D, 0x77, + 0xEF, 0x61, 0xC7, 0xBE, 0x9C, 0x73, 0xC1, 0xD5, + 0xD4, 0x5C, 0x5F, 0x21, 0x6A, 0x5C, 0xEE, 0x78, + 0xAA, 0xC6, 0x6C, 0x56, 0xDB, 0x38, 0x5A, 0x94, + 0x12, 0xB8, 0x73, 0x7C, 0xDF, 0x9A, 0x27, 0xCD, + 0xC5, 0xD1, 0xD3, 0xCA, 0x0E, 0x37, 0x0A, 0xC1, + 0x6F, 0xAD, 0xE3, 0x32, 0x94, 0x6C, 0x20, 0xB5, + 0xED, 0xE6, 0x2D, 0x34, 0x39, 0x58, 0xD2, 0x1E, + 0x63, 0x8D, 0xFA, 0xFF, 0xB5, 0xE8, 0x40, 0xC8, + 0x42, 0x38, 0x7A, 0x01, 0x80, 0xFF, 0x52, 0x3F, + 0xE9, 0x89, 0x63, 0xAD, 0x91, 0x5F, 0xCE, 0x0A, + 0x47, 0x87, 0xF9, 0x6D, 0xD7, 0x79, 0xEF, 0xCE, + 0x10, 0x7B, 0x73, 0x43, 0xBE, 0x51, 0xA0, 0xDF, + 0xE5, 0xEC, 0xA9, 0x63, 0xF6, 0x5E, 0x72, 0x36, + 0x22, 0x86, 0xEE, 0x4E, 0x4A, 0x76, 0xFD, 0x86, + 0xBA, 0xE6, 0xD6, 0xC4, 0xD2, 0xE6, 0xFF, 0xB2, + 0x5B, 0x39, 0xF9, 0xC3, 0x29, 0xA8, 0x61, 0x3A, + 0x33, 0x34, 0x89, 0xC9, 0x83, 0xF9, 0xB2, 0x70, + 0x21, 0x54, 0x44, 0x94, 0x70, 0xAD, 0x70, 0x18, + 0x84, 0x38, 0x91, 0xFB, 0xDE, 0x5E, 0x3D, 0xE3, + 0xB2, 0xA7, 0x3C, 0x1D, 0x49, 0xA6, 0x66, 0x7C, + 0x4B, 0xEB, 0xB0, 0xA7, 0x7C, 0xC5, 0xAE, 0x45, + 0x1F, 0xBE, 0x0E, 0x2F, 0x11, 0xDC, 0x92, 0x08, + 0xAA, 0x18, 0x38, 0xFE, 0x61, 0xBE, 0x9D, 0xC3, + 0x3A, 0x1F, 0x2F, 0xB6, 0x6E, 0xB6, 0x54, 0x97, + 0x74, 0x06, 0xBC, 0x12, 0x2D, 0x64, 0x18, 0x14, + 0x25, 0x5A, 0xCB, 0x7B, 0xD7, 0x9D, 0xC3, 0x2C, + 0xC2, 0x0B, 0x19, 0x10, 0xD2, 0x57, 0xF0, 0xDF, + 0xA4, 0x95, 0xA4, 0x5A, 0xA0, 0x2D, 0x0F, 0xA0, + 0xBC, 0xF7, 0x60, 0x7F, 0x38, 0xE1, 0x17, 0x0D, + 0x36, 0x08, 0xF5, 0xF9, 0x75, 0x28, 0x75, 0xAC, + 0xA9, 0x2B, 0x75, 0xC4, 0x41, 0xE0, 0x0D, 0x5C, + 0xBC, 0x5F, 0x49, 0x16, 0x25, 0x38, 0x16, 0xE1, + 0x0C, 0x2C, 0x9C, 0x63, 0xA8, 0x5F, 0x70, 0xF4, + 0x64, 0xC7, 0x10, 0x19, 0x52, 0x19, 0x6E, 0x9B, + 0x5C, 0x09, 0x4F, 0xEE, 0xB6, 0x7C, 0x85, 0xC9, + 0x6E, 0xCB, 0x33, 0x32, 0x42, 0x9D, 0x57, 0x18, + 0xE6, 0x55, 0x94, 0x74, 0x02, 0xEE, 0xEB, 0xAA, + 0xF7, 0xD3, 0x45, 0x7A, 0x49, 0x6F, 0x83, 0x89, + 0x00, 0xE4, 0xAA, 0x20, 0x87, 0x10, 0xAD, 0xC0, + 0x0E, 0xF5, 0x93, 0x57, 0xE5, 0x45, 0x7A, 0xBD, + 0x82, 0x87, 0x50, 0x0F, 0xE1, 0x2C, 0x0C, 0x6D, + 0xEE, 0xC8, 0x94, 0xB8, 0x39, 0xF3, 0x3C, 0xFE, + 0x7E, 0xC1, 0x0F, 0xB4, 0x67, 0xA2, 0xDF, 0xC6, + 0x9D, 0xB5, 0x9D, 0xB8, 0x72, 0x50, 0xBD, 0xB3, + 0xDB, 0xF6, 0x87, 0x5E, 0x26, 0x93, 0xF0, 0xD4, + 0x0D, 0x68, 0xA4, 0x8B, 0xBD, 0x2C, 0x6E, 0xD8, + 0x4F, 0x81, 0x5D, 0x0D, 0xAC, 0x72, 0x65, 0xEC, + 0x4E, 0xF2, 0x4E, 0x5F, 0x67, 0x04, 0xF3, 0x08, + 0x29, 0x4D, 0xB2, 0xE2, 0xD5, 0x9F, 0xD4, 0xB9, + 0x13, 0xB4, 0x33, 0x80, 0x27, 0x84, 0x7E, 0xF4 + }; + static const byte msg_44[] = { + 0x5C, 0x70, 0x7F, 0xBF, 0xF4, 0xFF, 0xE5, 0x9B, + 0x09, 0xAA, 0xF8, 0xDB, 0x21, 0xAD, 0xBE, 0xBA, + 0xC6, 0xB2, 0x65, 0x37, 0x9A, 0x9A, 0x43, 0x3A, + 0xA8, 0x23, 0x2B, 0x13, 0x9B, 0xBD, 0x46, 0x37, + 0x30, 0x60, 0xA7, 0x5B, 0xC4, 0x48, 0x63, 0x5F, + 0x41, 0x35, 0x38, 0x69, 0xF9, 0x6F, 0xB5, 0x65, + 0x26, 0xDB, 0xAE, 0xB7, 0x5C, 0xFE, 0x2C, 0x03, + 0xCB, 0x43, 0x08, 0x58, 0x5E, 0x27, 0xD1, 0x42, + 0x14, 0xF2, 0x4B, 0xD7, 0x13, 0xE4, 0x96, 0x74, + 0x6A, 0xC1, 0x36, 0xC7, 0x9D, 0x0F, 0x7D, 0xB0, + 0x7B, 0x8A, 0x3A, 0x6D, 0x00, 0x5B, 0x29, 0x7B, + 0x37, 0xBA, 0x3F, 0x5B, 0xBD, 0xCE, 0x21, 0x77, + 0xFD, 0xD6, 0x78, 0x77, 0x20, 0x31, 0xF0, 0x60, + 0x49, 0xAE, 0x12, 0x86, 0x7A, 0x64, 0xBD, 0x0B, + 0x9E, 0xC6, 0x26, 0x80, 0x9E, 0xCE, 0x19, 0x8D, + 0x6A, 0x6B, 0x09, 0x03, 0x45, 0xDF, 0x22, 0x7D + }; + static const byte sig_44[] = { + 0x08, 0xF0, 0x10, 0xFA, 0x63, 0x3F, 0x2B, 0xA1, + 0x46, 0x81, 0x34, 0xC4, 0xBC, 0xAB, 0x62, 0x17, + 0x0B, 0x64, 0xEA, 0x00, 0x2D, 0xD6, 0x8A, 0xE5, + 0xC2, 0x45, 0x29, 0xB9, 0xEC, 0x6F, 0x3B, 0xF2, + 0xDC, 0x2F, 0xC7, 0x34, 0x5A, 0x1E, 0xFE, 0x0C, + 0xCA, 0xB9, 0x6A, 0xD8, 0xDA, 0xBA, 0xAA, 0x80, + 0x90, 0xDC, 0x8C, 0x6C, 0x22, 0xFF, 0xC4, 0x90, + 0x9E, 0xE9, 0xA5, 0x45, 0xFC, 0xE8, 0x64, 0x53, + 0x9E, 0xC4, 0x17, 0xE1, 0xB2, 0x1A, 0x31, 0x40, + 0x26, 0x9D, 0x5E, 0x03, 0x6A, 0xC6, 0x09, 0x19, + 0xDD, 0xB3, 0x63, 0xE0, 0x35, 0xCD, 0xB4, 0x2E, + 0x25, 0x38, 0x6E, 0x6C, 0x76, 0xA9, 0x19, 0x75, + 0x68, 0x6E, 0xB7, 0xAB, 0xAD, 0x8F, 0x63, 0x64, + 0x97, 0x4E, 0x56, 0x82, 0x30, 0x45, 0x86, 0x22, + 0x64, 0xDA, 0xD2, 0xAE, 0x54, 0x70, 0x5C, 0xF1, + 0xEB, 0xD1, 0x84, 0x8D, 0xFF, 0x86, 0x15, 0xE6, + 0x20, 0xCE, 0x14, 0x89, 0xEF, 0xFA, 0x2E, 0xF8, + 0x60, 0xCA, 0x53, 0x52, 0xE4, 0xD5, 0xC8, 0x2E, + 0x50, 0xD5, 0x9D, 0x90, 0xA6, 0x12, 0xC7, 0xF1, + 0x70, 0x0D, 0xE2, 0x89, 0x5B, 0x31, 0x6A, 0x21, + 0x79, 0x9C, 0xBE, 0x77, 0x6E, 0xA6, 0xBF, 0x51, + 0x05, 0x2A, 0x83, 0x50, 0x7E, 0x86, 0x14, 0xD1, + 0x50, 0x53, 0x1F, 0x1C, 0x5E, 0x50, 0x24, 0x69, + 0x6C, 0x91, 0x55, 0x35, 0x19, 0x6F, 0xE0, 0xDC, + 0xB5, 0xD6, 0x48, 0x7E, 0x78, 0x61, 0x59, 0x2C, + 0xD0, 0x1B, 0x42, 0x58, 0xAF, 0x7A, 0x39, 0xCA, + 0x02, 0x1C, 0x50, 0xEF, 0xE9, 0xE1, 0xDE, 0x31, + 0x8D, 0x09, 0x51, 0xC9, 0xDB, 0x16, 0xF9, 0xB9, + 0x45, 0x54, 0x81, 0x16, 0xD7, 0x14, 0xD8, 0xBE, + 0x9C, 0xCA, 0x53, 0xFE, 0x8F, 0x24, 0x99, 0x0D, + 0xBA, 0x7F, 0x99, 0x42, 0x11, 0x9B, 0x32, 0xDD, + 0x93, 0x5C, 0xBA, 0x2D, 0xD3, 0xB3, 0xF2, 0x48, + 0x13, 0x9C, 0x80, 0xBB, 0x8D, 0xF4, 0xC7, 0xAA, + 0xEB, 0xC6, 0xFD, 0xB8, 0x35, 0x95, 0x87, 0x2B, + 0x9E, 0xCF, 0x48, 0xF3, 0x2D, 0xFF, 0x70, 0xF4, + 0xCE, 0x35, 0x68, 0x7E, 0x9D, 0xDF, 0xD5, 0x0C, + 0xCD, 0xE3, 0x51, 0xB0, 0x90, 0x86, 0xE5, 0xD1, + 0xF1, 0x3B, 0x72, 0x42, 0x73, 0x07, 0x03, 0xE2, + 0xFB, 0x40, 0x3F, 0xD4, 0xC8, 0x30, 0xB6, 0x86, + 0x49, 0x8A, 0x17, 0xDB, 0x8F, 0x46, 0x6C, 0x3A, + 0xC3, 0x49, 0xCD, 0x59, 0x68, 0x81, 0x66, 0x03, + 0xD7, 0x24, 0xAF, 0x1F, 0x77, 0xC7, 0xFB, 0xF7, + 0x83, 0xCD, 0xA2, 0x6D, 0x35, 0x0C, 0x8B, 0xBC, + 0x29, 0x3A, 0x7F, 0xAC, 0xB9, 0xF9, 0x78, 0x50, + 0x6A, 0x67, 0xFC, 0xDC, 0x6F, 0x01, 0x65, 0x06, + 0x82, 0x81, 0xB0, 0x7D, 0x25, 0x5D, 0x74, 0x0B, + 0x68, 0x5F, 0x51, 0x2C, 0x82, 0xF3, 0x1D, 0x92, + 0xF6, 0xA9, 0xA9, 0x6A, 0x77, 0x57, 0x58, 0xAA, + 0x7C, 0xBE, 0x35, 0xF4, 0x56, 0xDE, 0x42, 0x01, + 0x2D, 0xB8, 0x28, 0x83, 0x7B, 0xA0, 0xA9, 0x7D, + 0xC3, 0x30, 0x13, 0x52, 0xD0, 0xA1, 0xC8, 0xA1, + 0x2C, 0x51, 0x49, 0xAE, 0xA8, 0x04, 0xCB, 0xA8, + 0x66, 0x01, 0x26, 0xDF, 0x2D, 0x1C, 0x21, 0xA2, + 0x4E, 0xBD, 0xA5, 0x48, 0x2A, 0x2D, 0x56, 0x60, + 0x20, 0x98, 0x4D, 0x15, 0x7D, 0x02, 0xB6, 0x3A, + 0xE4, 0x11, 0xAE, 0xF7, 0x3E, 0x5D, 0x56, 0x4F, + 0x6A, 0xA3, 0x0A, 0xEA, 0xCC, 0x35, 0x8A, 0xB7, + 0xC4, 0x8F, 0x25, 0x3E, 0x42, 0x41, 0x2B, 0xA5, + 0x1F, 0xA7, 0x3B, 0x87, 0x22, 0x86, 0x79, 0xD5, + 0xE5, 0x2A, 0xA2, 0xCD, 0x68, 0xCE, 0xB8, 0x18, + 0x6D, 0xEF, 0x1C, 0x36, 0x7F, 0x75, 0x50, 0x36, + 0x1B, 0x58, 0xEB, 0x32, 0xA1, 0xC8, 0xAF, 0x47, + 0xE1, 0x26, 0x73, 0x1F, 0x5D, 0x73, 0x30, 0x13, + 0x2F, 0xC7, 0x8B, 0xA3, 0x03, 0xB4, 0xA8, 0x86, + 0x25, 0x29, 0xD1, 0x75, 0x10, 0xEE, 0x7F, 0x56, + 0xBC, 0x0D, 0x59, 0xB4, 0xAE, 0xC9, 0x44, 0x0A, + 0xF7, 0x0D, 0xBF, 0x17, 0x6A, 0x22, 0x9C, 0x75, + 0x2B, 0x3E, 0x22, 0xB8, 0x2F, 0x4B, 0x68, 0xF1, + 0x07, 0xE3, 0x47, 0x47, 0x21, 0x9C, 0xA3, 0x5B, + 0x31, 0x0A, 0x14, 0xD9, 0x7C, 0xA8, 0xC0, 0xC6, + 0x5C, 0xAD, 0x05, 0xD6, 0x15, 0xD3, 0xEC, 0xEC, + 0x32, 0xC2, 0xFF, 0xF4, 0x96, 0x9C, 0xC8, 0x65, + 0xA0, 0xB2, 0xD6, 0xF4, 0x98, 0xBB, 0xB1, 0x4E, + 0xA5, 0x11, 0x3B, 0x4E, 0xA8, 0xEB, 0x90, 0xAB, + 0xD8, 0x25, 0x10, 0xE3, 0x66, 0xB5, 0xA5, 0x11, + 0x60, 0xA0, 0xCB, 0xDF, 0x77, 0x8A, 0x80, 0x4C, + 0x07, 0x9B, 0x1B, 0x45, 0x95, 0x29, 0x1D, 0x88, + 0x85, 0xAC, 0x32, 0x94, 0x26, 0x87, 0x12, 0x0A, + 0x2F, 0x9E, 0xAE, 0x69, 0x79, 0x25, 0x5A, 0x50, + 0xF4, 0xDB, 0x15, 0x20, 0x9F, 0x7A, 0x7A, 0xF2, + 0xE5, 0x8A, 0x63, 0x6A, 0xDD, 0xBD, 0x06, 0xCB, + 0x42, 0xF0, 0x20, 0xA9, 0x3B, 0x52, 0xD8, 0x68, + 0x37, 0x71, 0x07, 0xB8, 0x5B, 0xFE, 0xA0, 0xEC, + 0xBD, 0x75, 0xFF, 0x9C, 0x89, 0xDF, 0x01, 0xE7, + 0x17, 0x7D, 0xA7, 0xE8, 0x27, 0x9E, 0xA2, 0x41, + 0x66, 0xE6, 0xDB, 0x8B, 0x5A, 0x3F, 0x6C, 0xC9, + 0xE3, 0x4F, 0x0D, 0xD0, 0x92, 0x1E, 0x27, 0x41, + 0xF2, 0xB3, 0x08, 0x32, 0x03, 0x6D, 0x2C, 0x4F, + 0x78, 0xEC, 0x99, 0xB3, 0x94, 0x6C, 0xC1, 0x89, + 0xD9, 0x34, 0x0F, 0xEF, 0x10, 0xF0, 0xDA, 0xCE, + 0x09, 0x69, 0x7A, 0x93, 0xC6, 0xFF, 0x19, 0x4F, + 0xBD, 0xDE, 0xA6, 0x54, 0x8A, 0xE5, 0x81, 0x3F, + 0x96, 0xD3, 0xA0, 0x77, 0x7C, 0xF2, 0x4B, 0xF1, + 0x68, 0xA2, 0x23, 0x3D, 0xD4, 0x16, 0xC1, 0x66, + 0xDA, 0x13, 0x53, 0xE1, 0x9F, 0x9A, 0x36, 0x09, + 0x4D, 0x72, 0x08, 0x09, 0xEB, 0x87, 0x74, 0x9A, + 0xB2, 0x8C, 0x60, 0x7F, 0xFB, 0x70, 0x17, 0x51, + 0xB1, 0xAC, 0x18, 0xDF, 0xCB, 0x43, 0x2A, 0xD3, + 0x89, 0xDA, 0x78, 0xAE, 0xDC, 0xEA, 0xB2, 0x22, + 0xCA, 0x2F, 0xF1, 0xE4, 0xA7, 0xCC, 0xAF, 0xB1, + 0x63, 0x1B, 0x5D, 0xDD, 0xD1, 0x49, 0xB8, 0x90, + 0x2E, 0xC9, 0xC0, 0x83, 0x0D, 0xAB, 0x88, 0x88, + 0x4C, 0x74, 0x72, 0x00, 0x7D, 0xFE, 0xF2, 0x46, + 0x73, 0xFD, 0x99, 0xEC, 0x89, 0x8B, 0x3B, 0x0F, + 0xCE, 0x35, 0x5A, 0xEA, 0x13, 0x4F, 0x67, 0x67, + 0xFD, 0x0D, 0x87, 0xFC, 0xB1, 0x36, 0x48, 0x07, + 0x33, 0x0B, 0xCA, 0xD4, 0xD7, 0xD0, 0xCC, 0xA1, + 0x8F, 0xF0, 0x3F, 0x01, 0x8B, 0x6B, 0x74, 0x44, + 0x2F, 0x1B, 0xE0, 0x65, 0x31, 0x1B, 0x4E, 0xDB, + 0x67, 0x65, 0xA9, 0x34, 0xE8, 0x4D, 0x0C, 0xF3, + 0x29, 0xED, 0x53, 0xAB, 0x8A, 0x98, 0x07, 0x2B, + 0xE0, 0xCD, 0xC0, 0x08, 0x82, 0x4A, 0x72, 0x28, + 0x72, 0xA2, 0xAC, 0xFE, 0xF7, 0xBF, 0x6E, 0x8E, + 0xF8, 0x3E, 0x04, 0x58, 0xA4, 0x36, 0x46, 0x33, + 0xAB, 0xDD, 0x0E, 0xBF, 0x01, 0xD2, 0xEF, 0x19, + 0x5B, 0x78, 0x2B, 0x30, 0x51, 0x25, 0x50, 0xD0, + 0xB5, 0x82, 0xC7, 0x20, 0x0D, 0xA1, 0x2C, 0x38, + 0xAF, 0x44, 0xFC, 0xBD, 0x49, 0xB8, 0x7F, 0x89, + 0xEF, 0xBE, 0x37, 0x5C, 0xCB, 0xA2, 0x11, 0x75, + 0x7D, 0xDA, 0xA8, 0x7B, 0x3A, 0x3C, 0x10, 0x11, + 0x4D, 0x9F, 0x99, 0xAB, 0x4B, 0xA2, 0x20, 0x7A, + 0x5F, 0x96, 0xEF, 0x1C, 0x00, 0xD7, 0x27, 0x17, + 0x77, 0x7C, 0x51, 0x58, 0x4B, 0x13, 0x97, 0x53, + 0x2A, 0xC6, 0x86, 0x4D, 0x3B, 0x8E, 0xBB, 0x4F, + 0xB8, 0xA0, 0x84, 0x87, 0xF6, 0xEF, 0x55, 0x12, + 0x2B, 0xCF, 0x9E, 0x5C, 0xD0, 0x0E, 0xBC, 0x1E, + 0x79, 0x53, 0xE7, 0x8C, 0x4D, 0x8B, 0xCB, 0x20, + 0xF6, 0xEA, 0x72, 0x0A, 0x63, 0x2F, 0x0C, 0xCF, + 0x57, 0x27, 0x26, 0xF4, 0x3A, 0x95, 0xCA, 0xBE, + 0xB5, 0x7C, 0x47, 0x60, 0x10, 0xCD, 0x28, 0x9E, + 0x02, 0x64, 0xC9, 0x8D, 0x82, 0x49, 0xD0, 0xD6, + 0x60, 0xF8, 0xDC, 0xC8, 0x4B, 0x7D, 0xB5, 0xEF, + 0x11, 0x17, 0xC7, 0x94, 0x5F, 0x0D, 0x99, 0xBE, + 0x75, 0x48, 0x49, 0xC6, 0x58, 0x43, 0x64, 0x99, + 0x1A, 0x5A, 0x41, 0xBA, 0xC2, 0x31, 0xB3, 0xE0, + 0x45, 0x1B, 0x81, 0xD2, 0x12, 0xBE, 0x90, 0xDB, + 0xFF, 0xBC, 0xCB, 0x99, 0xA3, 0xF0, 0x74, 0xE8, + 0x2C, 0x48, 0x58, 0xB3, 0x17, 0xA4, 0x9A, 0xD2, + 0x22, 0x46, 0xFB, 0xF5, 0x85, 0x8D, 0x07, 0xDF, + 0xDB, 0x78, 0x07, 0xF4, 0x99, 0xA8, 0x6C, 0xEE, + 0x6E, 0x96, 0x20, 0xB8, 0xC2, 0xA9, 0xFA, 0x8B, + 0x6E, 0xA6, 0x79, 0x6D, 0xF9, 0xC3, 0x0C, 0x77, + 0x74, 0xAE, 0xB0, 0x40, 0xA9, 0xE5, 0xA7, 0x0B, + 0x30, 0x40, 0x4B, 0x4F, 0xB1, 0x0A, 0x0B, 0x7B, + 0xEE, 0x1F, 0x69, 0xFA, 0xD0, 0xF0, 0x2D, 0x5D, + 0x00, 0xB5, 0x4D, 0xEB, 0x32, 0x84, 0xB2, 0xB7, + 0x60, 0xAA, 0x6C, 0xF9, 0x98, 0x18, 0xB3, 0xD9, + 0xC1, 0x54, 0x8D, 0xAC, 0x12, 0xB0, 0x3A, 0x26, + 0xB2, 0x23, 0x2D, 0x9B, 0xF8, 0x20, 0xEE, 0x90, + 0xE0, 0x6D, 0x31, 0xDE, 0xF5, 0xCA, 0xBA, 0x6A, + 0x53, 0x40, 0x29, 0x6C, 0x18, 0x62, 0xA5, 0x8A, + 0xB8, 0x17, 0xA0, 0xAB, 0xCB, 0xDC, 0xE1, 0x3B, + 0xD6, 0xC6, 0x29, 0xA3, 0x1C, 0x5F, 0x8D, 0x6E, + 0x73, 0xF6, 0x98, 0x10, 0x0F, 0x9F, 0x7E, 0xCA, + 0x4C, 0xD8, 0xEB, 0xE4, 0xB8, 0xDF, 0x72, 0x78, + 0x65, 0xAF, 0x4A, 0x20, 0xFE, 0x7C, 0xB4, 0xCA, + 0x07, 0x81, 0xFD, 0xC5, 0xC5, 0xFD, 0x33, 0x4D, + 0xB8, 0x37, 0x37, 0xC4, 0x21, 0x81, 0x66, 0x45, + 0xAE, 0x81, 0x34, 0x13, 0xA6, 0x40, 0x81, 0x39, + 0x55, 0x90, 0xE6, 0xF1, 0x42, 0x56, 0x74, 0xFF, + 0x06, 0x9B, 0x50, 0x1F, 0x0F, 0xDA, 0x6B, 0x31, + 0xC6, 0x4B, 0xC5, 0xC2, 0x14, 0xE7, 0x01, 0x5E, + 0xA9, 0xDA, 0x12, 0x2D, 0x6C, 0xE0, 0x8C, 0xEB, + 0x2D, 0xF6, 0x2C, 0x45, 0xBC, 0x01, 0x73, 0x34, + 0x6D, 0xAB, 0xBC, 0x15, 0x4C, 0x16, 0x03, 0x35, + 0x9D, 0xD4, 0xF0, 0xAC, 0x49, 0x84, 0x4A, 0xEE, + 0x46, 0x47, 0x64, 0x93, 0xF2, 0x49, 0x59, 0x86, + 0x26, 0xFB, 0x24, 0x6B, 0x99, 0xB3, 0x9A, 0xCB, + 0xB4, 0x2B, 0x28, 0x4E, 0x0C, 0x2D, 0x3F, 0x9E, + 0xCE, 0x32, 0x71, 0xC4, 0xD5, 0xE0, 0x6C, 0x48, + 0x25, 0xEA, 0x1A, 0x8F, 0x08, 0x57, 0x23, 0x85, + 0x89, 0xCD, 0xC5, 0x48, 0x37, 0x19, 0x8E, 0xD4, + 0x23, 0x4D, 0xD0, 0x31, 0x73, 0xA8, 0x8E, 0x43, + 0xEE, 0x95, 0x67, 0xF5, 0x7A, 0x93, 0x27, 0xD3, + 0x90, 0x36, 0x30, 0x4C, 0xA1, 0xCD, 0xB5, 0xF8, + 0x65, 0xC5, 0x89, 0x54, 0x57, 0x2C, 0xAE, 0xF8, + 0x75, 0xF1, 0x2E, 0x14, 0x14, 0x14, 0x0D, 0x97, + 0x5B, 0x24, 0x52, 0x46, 0x7A, 0x57, 0x6D, 0x9C, + 0x4C, 0x79, 0xDB, 0x0A, 0xE0, 0x23, 0x69, 0x52, + 0x9B, 0xF8, 0x1B, 0x54, 0x40, 0x18, 0xDF, 0xE0, + 0x1E, 0xF0, 0x61, 0xE4, 0x79, 0x81, 0xF9, 0x98, + 0x9A, 0x8C, 0x48, 0xFF, 0x86, 0x93, 0x0B, 0x68, + 0x96, 0x78, 0x2F, 0xF1, 0x2D, 0xDC, 0x60, 0x1F, + 0x8B, 0x1C, 0x04, 0x43, 0x4E, 0x60, 0x96, 0x5B, + 0x8A, 0xF6, 0x89, 0xCC, 0xC8, 0xB2, 0x9B, 0xBF, + 0x87, 0x16, 0x2E, 0xA8, 0x6F, 0x9B, 0x4B, 0xFD, + 0x74, 0x4E, 0x8F, 0x36, 0x33, 0x23, 0xDE, 0x94, + 0xD2, 0xA1, 0x72, 0x4F, 0xB2, 0xE6, 0x75, 0x3D, + 0x6E, 0x47, 0x9B, 0xDB, 0x58, 0xE5, 0x4A, 0x0C, + 0x09, 0x8F, 0x9C, 0x83, 0x63, 0x98, 0x8B, 0xA4, + 0xF7, 0x3D, 0x01, 0xA6, 0x8B, 0x93, 0x97, 0x48, + 0x84, 0x75, 0x32, 0xC7, 0xD7, 0x03, 0xDF, 0x7E, + 0x94, 0x8C, 0x8A, 0xA6, 0x78, 0x1A, 0xAE, 0xDE, + 0x36, 0x8A, 0xAD, 0x13, 0x7E, 0xF0, 0x16, 0xC2, + 0x3B, 0xAF, 0xF9, 0xD8, 0x66, 0x12, 0x30, 0x72, + 0x76, 0x6D, 0x21, 0x4C, 0xF3, 0xEF, 0x0D, 0x8C, + 0x11, 0xA4, 0x12, 0xBE, 0xF5, 0x7E, 0x8E, 0x6A, + 0x11, 0x13, 0x48, 0x8D, 0xC2, 0x62, 0xCF, 0x45, + 0x7C, 0xE3, 0x91, 0x88, 0x59, 0xFF, 0xB0, 0xF1, + 0xC3, 0xBC, 0x1D, 0x2A, 0x3E, 0x9B, 0x78, 0xF3, + 0xB1, 0x2E, 0xB0, 0x27, 0xD8, 0x16, 0xF8, 0x9B, + 0x2A, 0xAF, 0xF1, 0xAB, 0xB0, 0xF1, 0x8C, 0x7F, + 0x94, 0x31, 0x97, 0x85, 0xDA, 0xF0, 0xF4, 0x27, + 0x51, 0x3E, 0x5A, 0xE1, 0xDD, 0x6D, 0x9E, 0x98, + 0x39, 0xBB, 0xDF, 0xA2, 0xBA, 0x2C, 0x08, 0xAD, + 0x1D, 0x3F, 0x86, 0xF6, 0xC2, 0x1A, 0x8C, 0xAD, + 0xE0, 0xDC, 0xDD, 0x02, 0x47, 0x4C, 0x7E, 0x2D, + 0xDA, 0x1D, 0x70, 0x92, 0x39, 0xAA, 0x4E, 0xBA, + 0x14, 0xC7, 0xEC, 0x26, 0xBD, 0x9D, 0x1F, 0x6D, + 0x91, 0x58, 0x3C, 0xB5, 0xEF, 0x37, 0xB9, 0x66, + 0x4E, 0x04, 0x7C, 0x29, 0xCF, 0xD7, 0x8E, 0x47, + 0x84, 0xF3, 0xD2, 0x21, 0x84, 0xC5, 0xF8, 0xDC, + 0xC9, 0xF2, 0x52, 0xD5, 0x6A, 0xBF, 0xF1, 0xF1, + 0xDE, 0x9E, 0x7A, 0xF1, 0xD5, 0x5A, 0xF6, 0xEF, + 0x94, 0x66, 0xF9, 0x25, 0x44, 0x7F, 0x8D, 0x92, + 0xA2, 0x25, 0x1C, 0x72, 0x92, 0x30, 0x2A, 0xB7, + 0xEF, 0x18, 0xF3, 0x8C, 0xEF, 0x69, 0xA5, 0x5C, + 0x19, 0x3E, 0xC5, 0xBD, 0xEE, 0x2C, 0x2D, 0x71, + 0xDB, 0x89, 0xD4, 0x11, 0xA6, 0x27, 0x80, 0x8F, + 0x5A, 0x39, 0x9A, 0x04, 0x28, 0x4F, 0x9F, 0x00, + 0xBE, 0xF9, 0xF7, 0x9B, 0x46, 0x69, 0xD6, 0xAC, + 0x12, 0xE9, 0xA7, 0xC2, 0xD1, 0xC8, 0xAD, 0x5D, + 0xF7, 0xCB, 0x0C, 0x98, 0x78, 0x2D, 0x04, 0x4D, + 0x2D, 0x41, 0xAB, 0xC6, 0x3F, 0x81, 0x1D, 0xB9, + 0x2C, 0x1F, 0x3F, 0x59, 0x11, 0xF4, 0x80, 0x4F, + 0x0B, 0xCA, 0x9F, 0x81, 0x6E, 0x9C, 0xD1, 0xB4, + 0x74, 0x06, 0x48, 0x0A, 0x87, 0x2C, 0xFD, 0x4D, + 0x85, 0xD4, 0x21, 0x65, 0x7C, 0x96, 0x69, 0x53, + 0x51, 0xC0, 0xC4, 0xB0, 0xEB, 0x20, 0xDB, 0xE0, + 0x41, 0x09, 0xA7, 0x62, 0xB2, 0xF3, 0xC7, 0x6A, + 0x1D, 0x53, 0xA0, 0x39, 0xBA, 0xCF, 0x78, 0x9E, + 0xBF, 0x1D, 0xA5, 0x98, 0x09, 0x8E, 0xA7, 0x1A, + 0xE7, 0x95, 0xFF, 0x10, 0x38, 0xCC, 0x8F, 0x44, + 0xCB, 0xE7, 0xF6, 0xD6, 0x2C, 0xFF, 0xA8, 0x1C, + 0xFF, 0xA3, 0x65, 0xE8, 0x4E, 0xAE, 0xC7, 0xEF, + 0x61, 0xE1, 0x16, 0x4B, 0x8C, 0xA8, 0xC8, 0xFB, + 0xA5, 0x2C, 0xD1, 0x0A, 0x39, 0xAB, 0x4A, 0xF9, + 0xEE, 0x0B, 0x9B, 0xB4, 0x33, 0x5E, 0x25, 0x15, + 0xD0, 0xAA, 0x93, 0xC4, 0x53, 0x42, 0x91, 0xC5, + 0x98, 0x15, 0x34, 0x9A, 0x22, 0x1D, 0x9A, 0xE7, + 0x0E, 0x81, 0xF6, 0x99, 0x55, 0xB3, 0xD6, 0x49, + 0x1B, 0xB8, 0xA8, 0xBE, 0xDF, 0x54, 0xF0, 0x78, + 0xF7, 0x02, 0x97, 0x74, 0x84, 0x67, 0x6B, 0xAE, + 0x2F, 0xEC, 0x6E, 0x59, 0x20, 0x68, 0xD8, 0xE3, + 0x5A, 0x07, 0x48, 0xE1, 0x99, 0x90, 0xEE, 0xCD, + 0x17, 0x2B, 0xB6, 0xD6, 0xAA, 0x1A, 0xF8, 0x97, + 0x4E, 0xE0, 0x67, 0x9E, 0x4C, 0x35, 0xFE, 0x68, + 0x71, 0x54, 0x43, 0x5D, 0x43, 0x59, 0x19, 0xEB, + 0x58, 0x8E, 0x9A, 0xF6, 0xBD, 0x88, 0x71, 0xEE, + 0x89, 0xC6, 0xF2, 0x10, 0x04, 0x33, 0x13, 0x88, + 0xCD, 0x08, 0xB5, 0xE3, 0x5D, 0xA8, 0xBC, 0x43, + 0xB3, 0x84, 0x5F, 0x70, 0x94, 0xD9, 0xAC, 0xAE, + 0x74, 0x70, 0x13, 0x1E, 0x21, 0xFB, 0xD5, 0x7F, + 0xEC, 0x66, 0x2F, 0xA0, 0xB1, 0x1D, 0xE3, 0xF8, + 0xB9, 0x36, 0x48, 0x25, 0x3D, 0xBA, 0x7D, 0x44, + 0x08, 0xC5, 0x71, 0x74, 0xDA, 0xD3, 0x4F, 0x97, + 0x86, 0xF1, 0x16, 0x38, 0xD8, 0xC9, 0xE3, 0x3A, + 0xA7, 0x2E, 0x06, 0x4D, 0x9D, 0xE8, 0xFC, 0x38, + 0x58, 0x2A, 0x8D, 0x2D, 0x07, 0x99, 0xEA, 0xDF, + 0xF3, 0x00, 0x3B, 0xBC, 0x5F, 0x67, 0x1E, 0x4B, + 0x6C, 0xF1, 0x4A, 0x47, 0xB0, 0x71, 0x90, 0x5A, + 0x3B, 0x75, 0x93, 0x75, 0x56, 0x50, 0x4C, 0x70, + 0xF3, 0xC7, 0x95, 0xD5, 0xEA, 0xCB, 0x4C, 0x92, + 0x4F, 0x22, 0x4F, 0xD9, 0x34, 0x46, 0x76, 0xFB, + 0x79, 0xD6, 0xBD, 0x4E, 0x84, 0xEE, 0xE7, 0x78, + 0x7C, 0xB8, 0x92, 0x9F, 0xAD, 0xF2, 0x17, 0x5D, + 0x38, 0xB1, 0x88, 0x2E, 0xE9, 0x65, 0xAC, 0x4C, + 0x24, 0x27, 0x1D, 0x7B, 0xA3, 0x69, 0x96, 0x55, + 0x5C, 0x26, 0x40, 0xAF, 0x04, 0xB1, 0xCE, 0xA8, + 0x5D, 0x1E, 0x1F, 0xE5, 0x5A, 0xC3, 0xAE, 0xF9, + 0x14, 0x03, 0x58, 0x10, 0x1C, 0x8B, 0x1F, 0xDB, + 0x6C, 0x71, 0x68, 0x60, 0x13, 0x32, 0xF1, 0xA9, + 0x69, 0x45, 0x28, 0x69, 0x7C, 0xE3, 0xC9, 0x56, + 0xAF, 0xF3, 0xBD, 0x4B, 0x9E, 0x0A, 0x06, 0x6A, + 0x62, 0x20, 0x40, 0x65, 0xBD, 0xBC, 0xBF, 0xC7, + 0x0A, 0x2A, 0xCF, 0x56, 0x7C, 0x0E, 0x64, 0xBB, + 0x64, 0x71, 0x2D, 0x90, 0xBB, 0x32, 0x00, 0x0A, + 0x4A, 0x45, 0x44, 0x08, 0x75, 0x2C, 0x86, 0x13, + 0x86, 0x52, 0x8D, 0x3D, 0xFC, 0xF3, 0x5E, 0x5B, + 0x3F, 0x7A, 0xAA, 0x98, 0x84, 0xCF, 0x92, 0xF9, + 0x0B, 0x40, 0x8F, 0xC0, 0xA3, 0x71, 0x84, 0xAD, + 0xEE, 0xDF, 0xC4, 0x91, 0x7E, 0x87, 0x7D, 0x06, + 0xCA, 0x65, 0x8C, 0xE4, 0x8E, 0x03, 0xF0, 0x59, + 0x3E, 0xB4, 0x90, 0x4C, 0xEE, 0x88, 0x29, 0xE4, + 0x26, 0x7D, 0xA6, 0x54, 0x82, 0x49, 0xC1, 0x9D, + 0x80, 0xAB, 0x6B, 0xD7, 0xBE, 0x7D, 0x09, 0x80, + 0x5E, 0xB6, 0xD1, 0x1E, 0xD1, 0x1B, 0xE9, 0x8D, + 0xFC, 0x6E, 0x9C, 0x14, 0x0C, 0x15, 0x02, 0x87, + 0xF3, 0x9D, 0x21, 0xF8, 0xCB, 0xC8, 0xB9, 0xBD, + 0xE1, 0x70, 0xEA, 0xE4, 0x86, 0x4C, 0x97, 0xC1, + 0xEE, 0x4C, 0x18, 0x95, 0xEC, 0xD2, 0x4D, 0x35, + 0x9F, 0xC6, 0x56, 0x10, 0x3E, 0xC0, 0xB9, 0x7B, + 0x13, 0x1A, 0x37, 0x3D, 0x40, 0x4C, 0x88, 0x8B, + 0x9A, 0xA5, 0xB2, 0xB8, 0xB9, 0xC3, 0xEC, 0xF1, + 0x14, 0x33, 0x63, 0x67, 0x84, 0x98, 0xC8, 0xF4, + 0x06, 0x0C, 0x0E, 0x0F, 0x10, 0x12, 0x15, 0x16, + 0x45, 0x4E, 0x55, 0x5A, 0x5F, 0x8A, 0x94, 0x97, + 0xA8, 0xAF, 0xB2, 0xCC, 0xD4, 0xDC, 0xE7, 0xF1, + 0xFE, 0xFF, 0x11, 0x24, 0x53, 0x62, 0x94, 0xB7, + 0xB9, 0xD3, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x18, 0x32, 0x3B + }; +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + static const byte pk_65[] = { + 0x6C, 0x84, 0x14, 0x38, 0x08, 0x56, 0xCB, 0x52, + 0xD7, 0x9C, 0x4B, 0x29, 0x13, 0x9F, 0xB1, 0x83, + 0x9B, 0x86, 0x06, 0xF5, 0x94, 0x8B, 0x9D, 0x72, + 0xA9, 0x56, 0xDC, 0xF1, 0x01, 0x16, 0xDA, 0x9E, + 0x2D, 0x79, 0x77, 0x01, 0x86, 0xFC, 0x74, 0xD9, + 0x42, 0xC0, 0xF4, 0xA3, 0xB5, 0x95, 0xFF, 0x6C, + 0x19, 0x80, 0x4B, 0x49, 0x90, 0x1C, 0x6A, 0xD5, + 0xFA, 0xF7, 0x16, 0x01, 0xC2, 0xB6, 0x00, 0x31, + 0x5E, 0x1F, 0x40, 0xC2, 0x05, 0x47, 0x67, 0xB0, + 0x09, 0x25, 0xDF, 0x3A, 0xA4, 0x90, 0xE8, 0xC7, + 0x6F, 0x05, 0xFB, 0xFB, 0x74, 0x91, 0x10, 0x75, + 0xE6, 0x51, 0x8C, 0x5F, 0x1D, 0x91, 0xB8, 0xA0, + 0xE5, 0xB5, 0x98, 0x30, 0xD3, 0xDF, 0x39, 0x94, + 0x76, 0x04, 0x11, 0xEB, 0xB9, 0x11, 0xED, 0x4C, + 0xC2, 0xC1, 0x60, 0xE3, 0x84, 0x9A, 0x93, 0x76, + 0x2D, 0xFC, 0xA7, 0xB9, 0x81, 0x2B, 0xC7, 0xAE, + 0xB2, 0xDD, 0xB2, 0x76, 0x7B, 0xEF, 0x36, 0x50, + 0x56, 0x05, 0xAE, 0x06, 0x92, 0x60, 0xBC, 0xC8, + 0xDC, 0x47, 0x87, 0xC4, 0x28, 0xCB, 0x3C, 0x07, + 0x6E, 0xF2, 0xA6, 0xB9, 0x35, 0x61, 0xD8, 0x94, + 0x3F, 0x45, 0xCA, 0xBE, 0x8F, 0x05, 0x53, 0xFF, + 0x2E, 0xA1, 0xAC, 0x95, 0xC1, 0xCE, 0x21, 0x59, + 0x3A, 0x17, 0x54, 0x59, 0xD7, 0xDF, 0x12, 0xC4, + 0x07, 0x0A, 0xDB, 0x0E, 0xEE, 0x55, 0xB4, 0xAB, + 0xAE, 0x59, 0xBE, 0x69, 0xC3, 0xFF, 0x0D, 0xE5, + 0xA9, 0xB0, 0x27, 0xFC, 0x7D, 0x8E, 0x6E, 0x05, + 0x7B, 0x71, 0x52, 0xEE, 0x6A, 0xB4, 0x80, 0xD1, + 0x05, 0xD3, 0x0B, 0x0F, 0x50, 0x51, 0xB6, 0x0C, + 0x79, 0x01, 0xC5, 0x25, 0xC4, 0x63, 0x5F, 0xE6, + 0x68, 0xCC, 0x00, 0xE9, 0xD3, 0x09, 0x7D, 0xB9, + 0x9D, 0x66, 0x32, 0x37, 0x15, 0xCE, 0x4F, 0x0B, + 0x79, 0xB4, 0x26, 0xB4, 0x54, 0x5E, 0x09, 0xF4, + 0xDE, 0x39, 0x32, 0x3D, 0xD1, 0x4C, 0xCB, 0x0D, + 0x17, 0x10, 0x8C, 0xD4, 0x6D, 0xEC, 0x61, 0x38, + 0xCD, 0xFA, 0x28, 0x72, 0xC1, 0xC4, 0xC8, 0xAE, + 0xAD, 0x5C, 0x8C, 0xE0, 0x41, 0x57, 0xE5, 0x53, + 0xA3, 0x75, 0x58, 0xC2, 0x34, 0x6A, 0x06, 0x19, + 0x4C, 0xB5, 0x0B, 0x49, 0x81, 0xBF, 0x4D, 0x09, + 0x0C, 0xE4, 0xE8, 0x60, 0x12, 0x6A, 0x82, 0x54, + 0xA4, 0xD4, 0xC0, 0x84, 0xC3, 0xE2, 0x02, 0x0B, + 0xC0, 0x75, 0x35, 0x21, 0x04, 0x9B, 0x0F, 0xD8, + 0x89, 0x97, 0xE0, 0x27, 0xAC, 0x51, 0xE7, 0x5C, + 0xF1, 0x35, 0x0C, 0x3F, 0x30, 0x3A, 0x0E, 0xCE, + 0x42, 0x64, 0x87, 0x15, 0x3D, 0xAF, 0x1F, 0xAA, + 0xD6, 0x80, 0x8B, 0x9D, 0x99, 0x07, 0xDA, 0x9F, + 0x35, 0x18, 0x5B, 0xD3, 0xBE, 0x8D, 0x9C, 0xEB, + 0xE9, 0x16, 0xCE, 0xD1, 0xFA, 0x29, 0x28, 0xD8, + 0x85, 0xA9, 0xCB, 0xA8, 0x81, 0x49, 0x70, 0x3F, + 0x5E, 0x47, 0x72, 0xE4, 0x85, 0x23, 0x12, 0x5D, + 0xDD, 0x02, 0x6E, 0x71, 0x4C, 0x49, 0xF4, 0xFB, + 0x4E, 0x54, 0x4B, 0xBF, 0x61, 0x7A, 0x40, 0xB0, + 0x0B, 0x68, 0xDF, 0x8F, 0x15, 0x5F, 0x58, 0x80, + 0xD4, 0x11, 0x87, 0x7E, 0x25, 0xB4, 0x2B, 0x24, + 0x48, 0xB3, 0x6B, 0xEC, 0x2F, 0x1F, 0x8F, 0x9A, + 0x77, 0x0C, 0x54, 0x51, 0x50, 0xA0, 0x27, 0x8E, + 0x9B, 0x72, 0x45, 0x00, 0xAE, 0xAA, 0xEA, 0x47, + 0x1C, 0x11, 0xCF, 0xF0, 0x4E, 0x30, 0xEA, 0xB2, + 0xF4, 0x73, 0xBC, 0x04, 0x8E, 0x32, 0xCD, 0x31, + 0xAE, 0xF2, 0x15, 0x79, 0xB6, 0x99, 0x22, 0x5B, + 0xF9, 0xE1, 0xB6, 0x70, 0x0C, 0x57, 0xE5, 0x09, + 0xFC, 0xA1, 0xF2, 0x36, 0x29, 0x4A, 0x59, 0x74, + 0xDA, 0xA1, 0x5F, 0xBC, 0xAD, 0x62, 0xD4, 0xBD, + 0xDC, 0x45, 0x32, 0xB2, 0x61, 0x41, 0x44, 0xDB, + 0xE2, 0x88, 0x07, 0x36, 0x8C, 0x28, 0x1A, 0x77, + 0x0E, 0xA2, 0x2B, 0x1E, 0x5A, 0x3F, 0xA5, 0xBA, + 0x14, 0x92, 0x6D, 0xC5, 0x5A, 0x54, 0xF8, 0x4A, + 0x2A, 0x77, 0xC5, 0xA7, 0x08, 0x41, 0xF0, 0x7B, + 0xC1, 0xDE, 0xEF, 0x74, 0x03, 0xB2, 0x47, 0xAB, + 0x42, 0xB8, 0x4A, 0xDF, 0x14, 0x1E, 0x03, 0x0C, + 0x98, 0x46, 0x84, 0x24, 0xDA, 0xAE, 0xB9, 0x9D, + 0x25, 0x77, 0xF9, 0x50, 0xC2, 0x37, 0x3C, 0xCA, + 0x1E, 0x2D, 0xC2, 0x76, 0x1B, 0x8E, 0xDD, 0x6D, + 0x08, 0xFF, 0x79, 0xE5, 0x28, 0x88, 0x0F, 0xFB, + 0x51, 0xC3, 0x6E, 0xD4, 0x20, 0xAC, 0x5D, 0x50, + 0xF2, 0x58, 0x2A, 0xA6, 0x64, 0xE5, 0x4E, 0xA5, + 0xF4, 0x18, 0x9E, 0xA0, 0x17, 0x6D, 0xAA, 0x61, + 0x22, 0xF6, 0x23, 0x5A, 0x70, 0xB1, 0x5C, 0xEB, + 0x4D, 0xDD, 0x65, 0xD3, 0xBE, 0x6E, 0xBF, 0x3D, + 0xC4, 0x31, 0x89, 0xEE, 0x0A, 0x2E, 0x31, 0x05, + 0x63, 0x8F, 0x23, 0x87, 0x36, 0x95, 0x28, 0x0F, + 0x1B, 0x74, 0x27, 0x43, 0x52, 0xD6, 0x0A, 0x48, + 0xE5, 0xD3, 0xDD, 0x02, 0xFB, 0x7A, 0x5E, 0xD8, + 0x3F, 0xE2, 0x7A, 0x69, 0x82, 0x51, 0x42, 0x1C, + 0x8E, 0x9C, 0x98, 0x80, 0x61, 0x02, 0x39, 0x6E, + 0x53, 0x73, 0x90, 0xAC, 0xFD, 0x8C, 0x1D, 0x0B, + 0x4F, 0x99, 0xB7, 0x02, 0xA9, 0xEA, 0x65, 0x98, + 0x78, 0x58, 0x3D, 0x92, 0x75, 0x89, 0x41, 0xB3, + 0x0E, 0xCE, 0x50, 0x7C, 0x10, 0x4B, 0x2C, 0xE4, + 0x87, 0x67, 0x9E, 0xCF, 0x68, 0xB4, 0xD8, 0xB9, + 0x80, 0x69, 0x8A, 0xCF, 0x6A, 0xA6, 0xA5, 0x7E, + 0x8E, 0xD6, 0xAF, 0x3F, 0xF1, 0x8D, 0x26, 0x68, + 0x95, 0x04, 0x28, 0xB5, 0x7D, 0x18, 0x2F, 0x73, + 0xBB, 0x49, 0xB9, 0xB0, 0x38, 0xCC, 0xC8, 0x2D, + 0x56, 0x12, 0x78, 0xA3, 0x86, 0xD5, 0x66, 0x45, + 0xEC, 0x3F, 0xAF, 0xFB, 0x41, 0x25, 0xE0, 0xE7, + 0xF3, 0x6B, 0x48, 0xB1, 0x4B, 0x45, 0x25, 0x47, + 0xA0, 0xB4, 0x81, 0xAA, 0x6B, 0x33, 0x42, 0x29, + 0x24, 0x91, 0x53, 0xE4, 0x2E, 0xDF, 0x7E, 0x49, + 0xDD, 0x6E, 0x76, 0x36, 0xBF, 0xC6, 0x15, 0xA2, + 0x3A, 0x40, 0x1E, 0xFD, 0x40, 0x34, 0xC8, 0x1B, + 0x4D, 0xCE, 0xF0, 0x27, 0xD3, 0x44, 0xDD, 0xCC, + 0xE0, 0xA7, 0x16, 0x18, 0xEB, 0x59, 0x10, 0xCE, + 0xC6, 0x22, 0x28, 0x81, 0x93, 0x85, 0x03, 0x3E, + 0x8D, 0x0A, 0xBD, 0x49, 0x3D, 0x98, 0x3E, 0x4F, + 0xC0, 0x87, 0xD7, 0x2B, 0x45, 0x5E, 0x4D, 0xB6, + 0x3A, 0x2F, 0x82, 0xCE, 0xFF, 0x65, 0xC1, 0xE6, + 0x28, 0xEA, 0xE6, 0x30, 0x59, 0x6D, 0xEC, 0x27, + 0xFB, 0x98, 0xB8, 0x4D, 0xBF, 0xDC, 0xDF, 0xAB, + 0x40, 0xE4, 0x72, 0x24, 0x49, 0x14, 0xAF, 0xF1, + 0x79, 0x32, 0x6D, 0x54, 0x2D, 0x40, 0x1A, 0x3C, + 0xBB, 0x86, 0xE5, 0xFF, 0x83, 0x51, 0xEF, 0xE5, + 0x3A, 0x73, 0xC5, 0x1A, 0xBB, 0x63, 0xFF, 0x55, + 0x3E, 0x7D, 0x79, 0x57, 0xEF, 0x89, 0x13, 0x5E, + 0x0F, 0x5B, 0xB1, 0xBD, 0x0C, 0x24, 0xF9, 0xE4, + 0x5E, 0x32, 0x36, 0x41, 0x3C, 0x60, 0xE1, 0x39, + 0x6A, 0x47, 0x56, 0x7C, 0x94, 0x39, 0x51, 0x0F, + 0x00, 0xD4, 0xA4, 0x3C, 0x14, 0x9A, 0x5C, 0xCC, + 0x04, 0xF3, 0xD4, 0x7E, 0x67, 0xA8, 0xE2, 0x94, + 0xA4, 0x61, 0xA5, 0xF6, 0x93, 0xDB, 0x0C, 0xAE, + 0x22, 0xCF, 0xAC, 0x61, 0xE8, 0x53, 0x47, 0x7D, + 0x33, 0x9A, 0x4E, 0x45, 0xF7, 0xB1, 0x7C, 0x3C, + 0x11, 0x6D, 0x56, 0xF3, 0xA0, 0x68, 0xFC, 0x5A, + 0xDF, 0xEF, 0x38, 0xFF, 0x85, 0x33, 0x2B, 0xD5, + 0x15, 0x3C, 0x4D, 0x8F, 0xB8, 0xF1, 0x48, 0xF1, + 0x17, 0x65, 0x9C, 0x2E, 0xA9, 0x4D, 0xB4, 0x2A, + 0xA0, 0xB0, 0xBE, 0xBB, 0x47, 0x5A, 0x11, 0x04, + 0x12, 0xF3, 0xCD, 0x33, 0x49, 0xFC, 0x1A, 0xD0, + 0x41, 0xB7, 0xD5, 0x30, 0x4A, 0x85, 0x93, 0x14, + 0x4E, 0xFA, 0x3A, 0x36, 0x1D, 0x1B, 0x0C, 0x76, + 0x13, 0xB8, 0x2C, 0x08, 0x6E, 0xA7, 0x12, 0x6E, + 0x43, 0xC6, 0x16, 0xCE, 0xE8, 0xF1, 0x44, 0x4E, + 0x99, 0x56, 0xE8, 0x7F, 0x5C, 0xAB, 0x95, 0xC7, + 0xC7, 0xFB, 0x17, 0x58, 0xEC, 0x7D, 0x97, 0x01, + 0x9E, 0x5B, 0xA9, 0x35, 0x43, 0xEF, 0x3B, 0xAC, + 0x1A, 0x17, 0x42, 0x99, 0xCA, 0x48, 0xBF, 0x78, + 0x59, 0xDB, 0xFB, 0xDF, 0xF2, 0x43, 0xB1, 0x14, + 0xF6, 0xBF, 0x42, 0x3C, 0xE9, 0x8B, 0x4D, 0x4D, + 0x09, 0x1D, 0xA4, 0x4F, 0x32, 0x74, 0xD5, 0x73, + 0xFD, 0xC9, 0x04, 0xBD, 0x88, 0x5E, 0x35, 0xC9, + 0x15, 0x2A, 0x65, 0x35, 0x48, 0x88, 0xF1, 0x1E, + 0xD4, 0xF3, 0xD6, 0x3F, 0x26, 0xA7, 0xBE, 0x2F, + 0x57, 0x26, 0xEA, 0xDA, 0xF4, 0x85, 0x86, 0x59, + 0x2B, 0xBD, 0xF6, 0xCE, 0xE2, 0x46, 0x76, 0x9E, + 0x0E, 0xDA, 0x2A, 0x80, 0x77, 0x1F, 0xED, 0x34, + 0x7D, 0x67, 0xAF, 0xEE, 0xC6, 0x8B, 0x89, 0x46, + 0x3F, 0xA0, 0x49, 0x6D, 0xBC, 0x15, 0xC8, 0x9E, + 0x8D, 0x56, 0x99, 0x83, 0xD1, 0xD6, 0x74, 0x73, + 0x3F, 0x2B, 0xF9, 0xDF, 0x4A, 0x98, 0x0E, 0xA8, + 0xC5, 0xE3, 0xAF, 0x15, 0x56, 0x0A, 0x0E, 0x28, + 0xD6, 0x72, 0xB5, 0x80, 0xAB, 0x65, 0x52, 0xED, + 0x76, 0xAA, 0xCB, 0x5F, 0x80, 0x26, 0x0B, 0x97, + 0x03, 0x76, 0x9D, 0x33, 0xF4, 0x13, 0x8A, 0xBC, + 0x10, 0xBF, 0x5B, 0x05, 0x82, 0xDC, 0xC6, 0x2D, + 0xBE, 0x58, 0xC8, 0x90, 0xF5, 0x1B, 0x41, 0x00, + 0x12, 0x77, 0x34, 0xFB, 0x7D, 0xB7, 0x44, 0x7A, + 0x72, 0x0A, 0xAE, 0x00, 0x9D, 0x00, 0xBE, 0x8C, + 0x61, 0x07, 0x92, 0xC6, 0x4F, 0x13, 0x1F, 0x2D, + 0x72, 0x11, 0x5C, 0x7E, 0x05, 0x8E, 0x48, 0xB9, + 0xDE, 0x64, 0xF5, 0x5B, 0x4D, 0x61, 0x0C, 0x36, + 0xD1, 0x12, 0x71, 0x6A, 0x31, 0xA3, 0xDF, 0xE2, + 0x66, 0x99, 0xE9, 0xC2, 0xAB, 0xA0, 0x56, 0x58, + 0xCE, 0xF1, 0xB2, 0xB0, 0x86, 0x7C, 0xF8, 0xD5, + 0x23, 0x3D, 0xB7, 0x4F, 0xA8, 0xDC, 0x3A, 0xD1, + 0x45, 0xF5, 0xD2, 0x85, 0x74, 0x36, 0x0A, 0x85, + 0xE3, 0xB0, 0xB1, 0x0A, 0xC0, 0xA6, 0x46, 0x7A, + 0x7B, 0x05, 0x98, 0x46, 0x28, 0xEC, 0xA1, 0x04, + 0x63, 0xF3, 0x48, 0xA3, 0x11, 0x1E, 0x00, 0x57, + 0x8D, 0x3C, 0xE5, 0x48, 0x0F, 0x53, 0x75, 0xA1, + 0xEE, 0x23, 0xEE, 0x82, 0x08, 0x7B, 0xAC, 0x41, + 0x23, 0x3A, 0x14, 0xAA, 0xA7, 0x24, 0x73, 0x4B, + 0x18, 0x74, 0xA4, 0xAC, 0xE1, 0x13, 0x37, 0x06, + 0x25, 0x8F, 0x5F, 0xEA, 0x3A, 0x0C, 0x16, 0x09, + 0xE3, 0x0C, 0x7F, 0xD2, 0x10, 0xDA, 0x0C, 0x4F, + 0xDE, 0x91, 0x62, 0xDF, 0x66, 0xFB, 0xAF, 0x79, + 0x2F, 0xA2, 0xAE, 0xAA, 0x51, 0x2F, 0x0F, 0xF7, + 0x83, 0x7B, 0x9C, 0xC0, 0x2E, 0xE9, 0xBD, 0x95, + 0x53, 0x9F, 0x00, 0x1B, 0xBD, 0x60, 0xDD, 0x8B, + 0x42, 0xD6, 0x16, 0xB2, 0xCA, 0x95, 0xF3, 0x83, + 0x5F, 0x5E, 0x47, 0xD4, 0x3B, 0x14, 0x34, 0xC4, + 0x56, 0x3F, 0xD8, 0x1C, 0x15, 0xBE, 0xFA, 0x20, + 0x2C, 0xF3, 0xD9, 0x54, 0x08, 0x73, 0xF6, 0x84, + 0xAF, 0xE1, 0x9A, 0xB5, 0xC0, 0x1F, 0xA9, 0x2E, + 0x95, 0xA8, 0xCD, 0x6F, 0x36, 0x07, 0x30, 0x85, + 0x6E, 0x59, 0xC9, 0xC6, 0xAB, 0x77, 0x0D, 0x65, + 0x75, 0x96, 0x2A, 0xF7, 0x58, 0x78, 0x57, 0x2A, + 0x2A, 0x26, 0x41, 0x3D, 0x01, 0xAB, 0x31, 0x8C, + 0x10, 0x0D, 0xFC, 0x34, 0xDC, 0x1D, 0xEF, 0xA5, + 0x92, 0x7C, 0x4B, 0x45, 0x99, 0x25, 0xD7, 0x3E, + 0x1E, 0xB9, 0x14, 0x70, 0xE3, 0x7A, 0x58, 0x45, + 0x5C, 0x22, 0xA9, 0x61, 0xFD, 0x53, 0xF7, 0xD9, + 0x90, 0x26, 0xFF, 0x88, 0x4B, 0xF4, 0xA2, 0x57, + 0x9F, 0x70, 0x63, 0x35, 0xEF, 0xB6, 0xFB, 0x22, + 0x50, 0xD5, 0x2A, 0xE5, 0x61, 0x89, 0x8B, 0xA1, + 0x60, 0x6E, 0x51, 0xE9, 0x6D, 0x37, 0xC9, 0xED, + 0x3E, 0xC6, 0xCF, 0xCB, 0x33, 0xBF, 0xBE, 0x9C, + 0x31, 0x43, 0xFD, 0x3B, 0x6B, 0x33, 0x4D, 0x5F, + 0x61, 0x92, 0x2B, 0x36, 0x9A, 0xFB, 0xB3, 0x1C, + 0x3E, 0x6E, 0x9B, 0x5F, 0x3A, 0xEB, 0xF9, 0x5C, + 0xB7, 0x08, 0x34, 0x6F, 0xEC, 0xF7, 0x15, 0x9C, + 0xAD, 0x94, 0xA9, 0x3D, 0x8C, 0xD4, 0xB8, 0xC4, + 0x89, 0x41, 0x92, 0xDF, 0xE5, 0x3E, 0xA4, 0x36, + 0xFB, 0xF3, 0xAF, 0x4E, 0x86, 0x4E, 0x8C, 0x39, + 0x91, 0xEA, 0x02, 0x0A, 0x81, 0x1F, 0x0A, 0xF5, + 0x0B, 0x42, 0x57, 0x43, 0x6A, 0x3F, 0xF5, 0x22, + 0xBE, 0x73, 0x67, 0x39, 0x1D, 0x0F, 0x95, 0x0B, + 0xA6, 0x45, 0x2F, 0xBF, 0xD8, 0xFD, 0x87, 0x28, + 0xF4, 0x0B, 0xD2, 0xFC, 0xB8, 0x94, 0x52, 0x99, + 0x85, 0xB4, 0x32, 0xDF, 0xEF, 0x62, 0x30, 0xEB, + 0x4D, 0xEE, 0x73, 0x7A, 0x8D, 0x10, 0xA3, 0xBC, + 0xDF, 0xB7, 0x63, 0xE0, 0x86, 0x9B, 0x22, 0x5C, + 0x1A, 0x8D, 0x0E, 0x1F, 0xBF, 0x2D, 0x16, 0x1C, + 0x2C, 0x65, 0xD6, 0xDF, 0xB9, 0x58, 0xE9, 0x82, + 0xD1, 0x17, 0x77, 0xAC, 0xBE, 0xAD, 0x8D, 0xFB, + 0x6B, 0x1F, 0x5E, 0xB2, 0x1E, 0xA9, 0x42, 0xF7, + 0xC4, 0x0D, 0xC2, 0x0D, 0x2E, 0x4E, 0xB3, 0xE7, + 0x29, 0xB4, 0xE2, 0x9F, 0x75, 0x01, 0xDA, 0x34, + 0x23, 0x45, 0x61, 0xF6, 0x28, 0x88, 0x12, 0xD6, + 0x12, 0xD4, 0x1D, 0xFA, 0x83, 0xC5, 0xB8, 0xD9, + 0x0F, 0xF3, 0x8B, 0xA5, 0x48, 0x20, 0x1B, 0x57, + 0x5B, 0x52, 0x93, 0xAD, 0x78, 0x12, 0x0D, 0x91, + 0xCE, 0xC0, 0x59, 0xCA, 0xE2, 0xE7, 0x6A, 0x9A, + 0xB4, 0x3E, 0xF1, 0x28, 0x1E, 0x2B, 0xEF, 0x3E, + 0x34, 0x8D, 0x28, 0xF2, 0x19, 0x47, 0xC8, 0x88, + 0x48, 0x96, 0x04, 0x59, 0x48, 0x97, 0x75, 0x17, + 0x6F, 0x8E, 0x40, 0xEE, 0x06, 0x42, 0x79, 0x53, + 0x68, 0x7F, 0xB6, 0x3E, 0x47, 0x0F, 0x7D, 0x59, + 0xFB, 0x60, 0xDF, 0x56, 0x9F, 0x8A, 0x11, 0xE2, + 0x8E, 0x09, 0x37, 0x16, 0x2C, 0x46, 0xAF, 0xC7, + 0xD2, 0x21, 0x0A, 0x88, 0x5F, 0xFA, 0x21, 0xB3, + 0xDB, 0xF5, 0x35, 0x4B, 0x29, 0x41, 0xF4, 0xED, + 0x5D, 0x50, 0x79, 0x08, 0x90, 0x84, 0x0C, 0xC3, + 0xB9, 0x73, 0xD2, 0xC3, 0xD0, 0x26, 0x02, 0xB2, + 0x9B, 0xAC, 0xCB, 0x6C, 0xE1, 0x7C, 0xED, 0xB9, + 0x7B, 0x08, 0x5A, 0x2A, 0xB3, 0x10, 0x57, 0x2B, + 0xA7, 0x37, 0x1D, 0x1F, 0x81, 0x20, 0xFF, 0xE3, + 0x7D, 0x0B, 0x0F, 0xCA, 0x35, 0xAF, 0xC5, 0xB5, + 0x62, 0xAA, 0x84, 0x99, 0x71, 0x5A, 0x29, 0x9C, + 0xE0, 0x59, 0xCC, 0xE3, 0xB0, 0xD1, 0x1C, 0xEF, + 0x0D, 0x92, 0x38, 0x96, 0x1A, 0xD4, 0xBE, 0x11, + 0xE9, 0xA6, 0xD1, 0xA4, 0x69, 0x21, 0x77, 0xC8, + 0xB0, 0xC5, 0x3F, 0x11, 0xA8, 0xED, 0x26, 0x50, + 0x21, 0x2E, 0x7A, 0x2F, 0x80, 0xEB, 0xFF, 0x6D, + 0xCF, 0xE4, 0x67, 0x21, 0x03, 0x65, 0x84, 0x34, + 0xD0, 0x32, 0x7A, 0xDD, 0xCD, 0x66, 0xBC, 0xB6 + }; + static const byte msg_65[] = { + 0xDB, 0x84, 0x94, 0xBA, 0x19, 0xC4, 0x11, 0x8F, + 0xB1, 0x5D, 0x0A, 0xCF, 0x42, 0x54, 0xFD, 0x37, + 0x48, 0x3F, 0xCF, 0x47, 0x48, 0xFD, 0x18, 0x44, + 0xF7, 0x17, 0xCE, 0x6F, 0x69, 0x58, 0x9E, 0x61, + 0x77, 0x2C, 0xFE, 0xFA, 0x7F, 0x97, 0x58, 0x65, + 0x34, 0x09, 0xD4, 0xEE, 0x5A, 0x26, 0x4B, 0x83, + 0x4E, 0x60, 0xD6, 0xBB, 0x96, 0x49, 0x9E, 0xBE, + 0xB2, 0xB0, 0x6B, 0x0B, 0xA8, 0x74, 0xBF, 0x31, + 0xE6, 0x41, 0x39, 0x4C, 0xFA, 0xA6, 0xA2, 0xD3, + 0x0D, 0xDB, 0x8F, 0x04, 0x58, 0x76, 0x20, 0x8D, + 0x2F, 0x51, 0xDE, 0x15, 0xE2, 0x05, 0xE8, 0xC9, + 0x1B, 0x87, 0xEC, 0xEB, 0x05, 0xFF, 0x31, 0x83, + 0x27, 0x1B, 0x26, 0x49, 0x66, 0x5D, 0xD3, 0xCC, + 0x49, 0xBF, 0xDB, 0x99, 0x8D, 0x53, 0x9D, 0xA8, + 0x09, 0x30, 0x55, 0x16, 0xBB, 0xBE, 0x9C, 0x90, + 0x60, 0x21, 0x19, 0x1C, 0x52, 0x23, 0xE5, 0x25, + 0xA8, 0xFC, 0x36, 0x16, 0xA1, 0x76, 0x5E, 0xC3, + 0xF9, 0xC5, 0xDB, 0x53, 0xCC, 0x33, 0x7E, 0x03, + 0x9F, 0x18, 0x6A, 0xCF, 0xEA, 0x91, 0x14, 0x8E, + 0xE2, 0xA7, 0x9C, 0xCA, 0x36, 0x89, 0xED, 0xB6, + 0x2A, 0xAF, 0x28, 0xB5, 0xD7, 0x52, 0xFD, 0xE2, + 0x65, 0xEE, 0x52, 0x80, 0xB5, 0x19, 0x72, 0x6C, + 0x1C, 0xA9, 0x80, 0x32, 0x95, 0xC6, 0x74, 0xB7, + 0xEF, 0xAF, 0xA4, 0xD6, 0x1B, 0x30, 0x6A, 0x79, + 0xE3, 0xF6, 0xE7, 0xA8, 0x87, 0xC2, 0xFB, 0x53, + 0x5B, 0x3B, 0x0F, 0xB3, 0xD9, 0xEB, 0xC8, 0x76, + 0x03, 0xEA, 0xFE, 0xF1, 0x70, 0xC1, 0xF1, 0xD2, + 0x8E, 0x99, 0xBB + }; + static const byte sig_65[] = { + 0xF7, 0x78, 0x9A, 0x45, 0xA3, 0x58, 0x73, 0x30, + 0xE7, 0xFC, 0xF7, 0x06, 0x95, 0xF7, 0xF6, 0x96, + 0x88, 0xA2, 0xB8, 0xD0, 0xCE, 0x54, 0xF0, 0x90, + 0x21, 0x4F, 0x10, 0x9F, 0x56, 0x48, 0x4F, 0x98, + 0xC3, 0xAD, 0x1A, 0x53, 0xA5, 0x44, 0x1C, 0x2C, + 0xA7, 0x2A, 0x3B, 0x31, 0x91, 0xBC, 0x04, 0x6F, + 0x46, 0x37, 0x30, 0x45, 0xB9, 0xE5, 0x40, 0xC7, + 0x3D, 0xFE, 0x91, 0xB6, 0x1F, 0x05, 0x88, 0xD6, + 0x13, 0x59, 0x3F, 0xCE, 0x1B, 0x00, 0xEE, 0xF1, + 0xB2, 0x27, 0x03, 0x4C, 0x6F, 0xD3, 0xB1, 0x8B, + 0x3F, 0x22, 0x11, 0x10, 0xFB, 0x34, 0x5A, 0xA7, + 0x86, 0x31, 0xB8, 0xB5, 0x9F, 0xBD, 0xFD, 0xCC, + 0xDA, 0xE6, 0xA2, 0x4D, 0x25, 0x9D, 0x34, 0xAA, + 0xBA, 0xD2, 0x18, 0xB3, 0xAE, 0x4E, 0x77, 0x18, + 0x66, 0x53, 0xB8, 0x56, 0x3A, 0xA6, 0x12, 0x0A, + 0x0A, 0x53, 0x1A, 0x4E, 0x91, 0x37, 0x30, 0xDC, + 0x91, 0x4F, 0xE5, 0xE0, 0x08, 0xBE, 0xCE, 0x68, + 0x69, 0xB0, 0x2B, 0x07, 0xFD, 0xC1, 0x62, 0x14, + 0x54, 0x0D, 0x31, 0x6C, 0x43, 0xFA, 0x0C, 0x21, + 0x1B, 0x41, 0xAC, 0x7E, 0x52, 0x65, 0x67, 0x29, + 0xC7, 0x73, 0xE4, 0xC4, 0xB8, 0x8E, 0xD3, 0x11, + 0x88, 0x6D, 0xD4, 0xD2, 0x75, 0x41, 0x7D, 0x70, + 0x19, 0x66, 0x44, 0xEE, 0xD1, 0x5F, 0xA3, 0x15, + 0x06, 0x60, 0x03, 0xE3, 0x09, 0xF8, 0x32, 0xAF, + 0x91, 0x26, 0x2C, 0x94, 0x90, 0x11, 0xFC, 0xB0, + 0xAD, 0x2C, 0xCE, 0x65, 0xDD, 0x9E, 0xFF, 0x56, + 0x7E, 0xE2, 0x9C, 0xC4, 0x0A, 0x6F, 0xE0, 0x66, + 0x4E, 0x7D, 0x9F, 0x23, 0x65, 0x68, 0xFC, 0x94, + 0x29, 0x5D, 0xBB, 0x34, 0x28, 0x82, 0x33, 0xE8, + 0xC5, 0x11, 0xD2, 0x88, 0x15, 0xEC, 0x72, 0x10, + 0x32, 0x29, 0x6E, 0x1E, 0xDE, 0xCA, 0x7F, 0x72, + 0x6A, 0x6E, 0xB0, 0xF7, 0x6C, 0xC5, 0x82, 0x80, + 0x11, 0xC0, 0xE4, 0x01, 0x3C, 0xC7, 0xEE, 0x43, + 0x29, 0xB8, 0x1E, 0xCC, 0x0D, 0x52, 0xED, 0x1E, + 0x49, 0x1D, 0xD6, 0xD5, 0x5C, 0x52, 0x65, 0x66, + 0x5E, 0xD8, 0xAD, 0x21, 0x9B, 0x89, 0x4F, 0x31, + 0xC6, 0x8C, 0x61, 0x9A, 0xFC, 0xDB, 0x73, 0x58, + 0xE5, 0x55, 0x4C, 0x49, 0x5B, 0x8B, 0x6E, 0x33, + 0x25, 0x68, 0x8F, 0xB8, 0xC1, 0xA2, 0x53, 0x31, + 0xD5, 0x7B, 0xD3, 0x48, 0xA2, 0x7D, 0x39, 0x09, + 0x29, 0xBC, 0x46, 0xA1, 0x49, 0x6A, 0xB3, 0x5B, + 0x46, 0xBA, 0x61, 0xB6, 0xB9, 0xD2, 0x3C, 0xD0, + 0x63, 0x15, 0xFB, 0x72, 0xC2, 0x47, 0x76, 0x01, + 0x61, 0x30, 0xAD, 0xB1, 0xCF, 0x2D, 0xC7, 0x29, + 0x59, 0xEA, 0x9C, 0xAD, 0x96, 0xAF, 0x5D, 0xA9, + 0x96, 0x12, 0x6C, 0xDD, 0x85, 0xB1, 0x34, 0xCC, + 0x92, 0x7A, 0x51, 0xFD, 0x23, 0xF8, 0x47, 0x91, + 0xA3, 0xFC, 0xDA, 0x07, 0x7E, 0x15, 0x99, 0x17, + 0x48, 0xA0, 0x39, 0x4F, 0x33, 0x4E, 0xB8, 0xBC, + 0x48, 0xA9, 0x9A, 0xB9, 0xDF, 0xBB, 0x0F, 0x2A, + 0xAD, 0x6F, 0xBE, 0x48, 0x49, 0x61, 0xD3, 0xA4, + 0xE8, 0xF8, 0xB2, 0x1A, 0x6A, 0xC0, 0x92, 0xB2, + 0x26, 0xD6, 0xE1, 0x19, 0xFA, 0xD4, 0x4D, 0x8E, + 0x57, 0x6F, 0xE9, 0x6C, 0x6C, 0xDB, 0x68, 0x40, + 0xEA, 0x61, 0x4B, 0xAF, 0xC7, 0x07, 0x86, 0xC5, + 0x19, 0xE1, 0xD5, 0xDC, 0x0F, 0x98, 0x44, 0x43, + 0xC8, 0xB1, 0xE5, 0x4F, 0x8E, 0xE1, 0x76, 0xD9, + 0x8B, 0x2C, 0x70, 0x27, 0xF5, 0x7D, 0x7E, 0x3D, + 0xE9, 0xB2, 0xA0, 0xA3, 0x69, 0x11, 0xB8, 0xE4, + 0x71, 0x21, 0xDE, 0x0C, 0x07, 0xEB, 0xBA, 0x5D, + 0x7B, 0x59, 0x4E, 0xF2, 0x44, 0xC6, 0x83, 0x27, + 0xEC, 0x6C, 0x6D, 0x1D, 0xD5, 0x01, 0xF4, 0x83, + 0xFE, 0x9B, 0x95, 0x70, 0x59, 0x7E, 0x70, 0xDF, + 0x41, 0x3E, 0x7A, 0xF0, 0x38, 0x47, 0xF4, 0x09, + 0xED, 0x61, 0xE2, 0x84, 0x6E, 0x6C, 0x64, 0x1E, + 0x6A, 0x7F, 0xFA, 0x79, 0xDE, 0x6B, 0xFA, 0x37, + 0x3A, 0x06, 0x44, 0xB0, 0x0B, 0xF4, 0x1A, 0x03, + 0x49, 0x92, 0xA7, 0x94, 0xDA, 0x17, 0xC8, 0x88, + 0x85, 0x23, 0x90, 0x32, 0xC8, 0x51, 0x76, 0x4E, + 0x3E, 0x4D, 0xBD, 0xE7, 0xF1, 0x2A, 0x16, 0xC5, + 0xA2, 0x63, 0xE9, 0x64, 0xC1, 0xE7, 0xFD, 0xD3, + 0xCC, 0xE5, 0x76, 0xDD, 0x6D, 0x56, 0xB1, 0x81, + 0x82, 0x84, 0x8B, 0x75, 0x63, 0x64, 0x5D, 0x4E, + 0x42, 0xFF, 0x22, 0x74, 0x2A, 0x99, 0x67, 0x85, + 0x16, 0x9D, 0x7F, 0x50, 0x3B, 0x48, 0xA7, 0x15, + 0x8B, 0x3C, 0xBD, 0x29, 0x93, 0x5E, 0xD3, 0x20, + 0x49, 0xBE, 0xA1, 0xAD, 0x95, 0x3E, 0xF7, 0x07, + 0x32, 0x7B, 0x77, 0x8B, 0xFD, 0xDD, 0xFC, 0x60, + 0x51, 0x1D, 0xA1, 0x13, 0xA3, 0x4F, 0x65, 0x57, + 0x12, 0xE4, 0xE5, 0x9D, 0x6C, 0xCE, 0x40, 0x4E, + 0x94, 0xAB, 0xA6, 0x1E, 0x81, 0x35, 0x38, 0x8F, + 0xC2, 0x1C, 0x8E, 0x41, 0x34, 0x4F, 0x32, 0x4B, + 0x01, 0xAC, 0x8C, 0x06, 0x9F, 0x92, 0x57, 0x5D, + 0x34, 0xF8, 0x8B, 0xCA, 0x22, 0xCB, 0x30, 0x7E, + 0x37, 0x07, 0x00, 0x63, 0x32, 0x02, 0x56, 0xB8, + 0xBA, 0xD6, 0xEB, 0x7A, 0x81, 0xAF, 0xE9, 0xA2, + 0x54, 0x01, 0x6E, 0x1C, 0x8A, 0x12, 0x50, 0x89, + 0xAA, 0xA3, 0xED, 0xE8, 0x4E, 0x5B, 0x6C, 0x2E, + 0xCF, 0xAE, 0xFA, 0xA5, 0x2B, 0x9F, 0x57, 0x09, + 0x60, 0x2C, 0x06, 0xAE, 0xA4, 0xA0, 0x38, 0x4E, + 0x9B, 0x09, 0xE5, 0xB8, 0x81, 0x64, 0xB2, 0x74, + 0xEA, 0x32, 0x65, 0xFB, 0x51, 0x52, 0x39, 0x7D, + 0xFF, 0x5A, 0x3A, 0x08, 0x61, 0xE2, 0xBC, 0x12, + 0xD2, 0x10, 0x92, 0x89, 0x72, 0x97, 0x47, 0xE8, + 0x3F, 0xDF, 0x24, 0x3A, 0x1D, 0x17, 0xB9, 0x83, + 0x48, 0x37, 0x98, 0x45, 0xA9, 0xE9, 0x55, 0xE2, + 0xD6, 0xF9, 0x38, 0xDA, 0xA5, 0x91, 0x8E, 0x2A, + 0x14, 0xF9, 0x7B, 0xA2, 0xBE, 0x50, 0x1C, 0xCC, + 0xAF, 0xD6, 0x81, 0x91, 0x0F, 0x4A, 0x4F, 0x06, + 0x71, 0x5C, 0xE8, 0x40, 0x96, 0xF3, 0x7A, 0x91, + 0xDC, 0xCA, 0x2A, 0x8A, 0x4B, 0xE8, 0xDA, 0x79, + 0x21, 0xDB, 0xF8, 0xD3, 0xF4, 0xEF, 0xB9, 0x8C, + 0x6B, 0x4F, 0x94, 0x0E, 0xCE, 0xF8, 0x32, 0xB5, + 0x49, 0xD0, 0x68, 0x94, 0x7C, 0x3D, 0xFB, 0x58, + 0x09, 0xCB, 0x7B, 0x06, 0x0A, 0x3A, 0x0E, 0xF3, + 0xB2, 0x1C, 0x01, 0x64, 0x50, 0x1D, 0xDE, 0xA7, + 0xC9, 0xE5, 0xE7, 0x89, 0x7C, 0x6B, 0x1C, 0x46, + 0x34, 0x8B, 0x2C, 0x3E, 0x80, 0x5F, 0x6F, 0x22, + 0x87, 0xBA, 0x15, 0x8C, 0xF9, 0x25, 0xA7, 0xBA, + 0x7F, 0x08, 0x25, 0x49, 0x89, 0xC8, 0x7D, 0x24, + 0x97, 0x9A, 0xD9, 0x86, 0xAA, 0x97, 0xC5, 0x1B, + 0x01, 0xF4, 0x5D, 0x4A, 0x1F, 0x24, 0x75, 0x29, + 0x91, 0xF0, 0x42, 0x05, 0xEB, 0x55, 0x1F, 0xD0, + 0x2D, 0x41, 0x5F, 0x2D, 0xD1, 0xEF, 0xF1, 0x42, + 0xB0, 0xD7, 0x04, 0x16, 0xC6, 0xD8, 0x15, 0xEB, + 0x91, 0x73, 0x2B, 0x26, 0x8F, 0xB2, 0x0D, 0x08, + 0x67, 0x44, 0x2D, 0x71, 0xDE, 0xC0, 0x57, 0xB2, + 0x86, 0xCD, 0x93, 0x81, 0x1F, 0xF3, 0xF6, 0x46, + 0xEB, 0xD5, 0x65, 0xD5, 0x1D, 0x09, 0xA4, 0x2D, + 0x3A, 0xBA, 0xAC, 0x0F, 0x34, 0xCC, 0x81, 0x7B, + 0x18, 0x93, 0x8E, 0xCC, 0xBB, 0x1F, 0xEF, 0x05, + 0xBD, 0x3C, 0x2B, 0x49, 0x4F, 0xA5, 0x29, 0xED, + 0x4C, 0x63, 0x4C, 0x93, 0x25, 0xA4, 0x81, 0x73, + 0xF2, 0x0F, 0xFA, 0xC3, 0x2D, 0xC1, 0x01, 0xE6, + 0xEE, 0x03, 0xB2, 0xFC, 0xBE, 0xC2, 0x46, 0x8D, + 0xBC, 0x8F, 0x76, 0x75, 0x8C, 0x32, 0x15, 0x47, + 0x4F, 0x7E, 0xF2, 0x40, 0x65, 0xF7, 0x90, 0x60, + 0xAC, 0xA3, 0xC8, 0xD5, 0xD7, 0x4A, 0xF7, 0x0F, + 0x48, 0x30, 0x1D, 0xDB, 0x30, 0xC0, 0x5D, 0xB3, + 0xEF, 0xA7, 0x26, 0xCF, 0x88, 0x55, 0x59, 0x01, + 0x84, 0x12, 0x82, 0xAA, 0x08, 0xF6, 0x66, 0xA6, + 0x53, 0x51, 0xA6, 0xA2, 0x4E, 0xED, 0x6B, 0xE2, + 0x11, 0x77, 0x31, 0x07, 0xE1, 0x85, 0xE1, 0xB4, + 0x88, 0xA2, 0xE4, 0x91, 0xB6, 0xC1, 0x41, 0x52, + 0x84, 0x62, 0xA8, 0x64, 0x94, 0xB5, 0x4F, 0xDC, + 0xCE, 0xCC, 0xB6, 0xAA, 0x21, 0x25, 0x36, 0x86, + 0x69, 0x3A, 0xE7, 0x98, 0xC9, 0xCE, 0x9E, 0x0B, + 0xDD, 0xC6, 0xAE, 0x53, 0xD9, 0xB7, 0x06, 0xDC, + 0x4F, 0x4D, 0x81, 0xB9, 0xC7, 0x3C, 0x46, 0x1E, + 0xCD, 0x70, 0x35, 0xC5, 0x17, 0x2E, 0xFA, 0xE5, + 0x60, 0x2C, 0xAF, 0x88, 0xC6, 0x4E, 0x79, 0xE5, + 0x32, 0x40, 0x30, 0x55, 0x5D, 0xE2, 0x11, 0xF8, + 0x9F, 0xD4, 0x24, 0xC3, 0x38, 0xC3, 0x88, 0x3C, + 0x83, 0xCA, 0x94, 0x05, 0xC2, 0xB5, 0xD1, 0x44, + 0x5F, 0x7C, 0x98, 0xC4, 0x3E, 0xD3, 0xD2, 0xBE, + 0xCB, 0xE2, 0x5F, 0x5F, 0x3F, 0x54, 0x4C, 0xCC, + 0x5B, 0x5A, 0xEA, 0xE4, 0x7D, 0xDF, 0x3F, 0xB5, + 0x64, 0x9F, 0xF5, 0xD6, 0x1E, 0xAA, 0x02, 0xED, + 0xEB, 0xC7, 0x5C, 0xE4, 0x78, 0xBA, 0x00, 0x42, + 0x6C, 0xAF, 0x47, 0x4F, 0xA7, 0x9E, 0x5B, 0x08, + 0x9E, 0xB1, 0xA8, 0x82, 0xF1, 0x53, 0x54, 0x59, + 0x26, 0x95, 0x95, 0x2B, 0xA0, 0xA8, 0xEE, 0x91, + 0xE6, 0x49, 0xE3, 0xF2, 0xC3, 0x82, 0x26, 0x4D, + 0xAA, 0x30, 0xF6, 0xA6, 0xD2, 0x17, 0xF6, 0x12, + 0x9C, 0x19, 0x39, 0xB6, 0xDC, 0xAC, 0xCD, 0xA5, + 0xB6, 0x37, 0x32, 0x6E, 0x8A, 0x83, 0x61, 0xC3, + 0xB5, 0x6F, 0xCF, 0xFC, 0x48, 0x50, 0x36, 0x86, + 0x58, 0x22, 0xB9, 0xBB, 0x87, 0xB4, 0x35, 0x10, + 0xBC, 0xDD, 0x55, 0xBC, 0x35, 0x0D, 0xE7, 0xB2, + 0xAE, 0x90, 0xA2, 0x1E, 0x9E, 0x19, 0x97, 0x8E, + 0xDA, 0x10, 0xDF, 0x66, 0x76, 0x14, 0xA4, 0x4F, + 0xE2, 0xA8, 0x4D, 0x16, 0xBE, 0x04, 0x3E, 0xA8, + 0x77, 0x36, 0x33, 0xEA, 0x6B, 0xAD, 0xF6, 0x57, + 0x10, 0x05, 0x2F, 0x34, 0x1F, 0x65, 0xCB, 0xE9, + 0x28, 0xD3, 0x96, 0x2A, 0x5A, 0x2F, 0xE6, 0x4E, + 0x46, 0xD6, 0xBF, 0xB8, 0xFD, 0x0D, 0x99, 0x78, + 0xF0, 0x42, 0x3C, 0xBD, 0x19, 0x5F, 0x72, 0xF3, + 0xCB, 0x19, 0xD7, 0xEF, 0xD9, 0xEB, 0xE3, 0x3C, + 0xD2, 0xF5, 0x70, 0x9A, 0x57, 0x80, 0x7D, 0xF9, + 0x44, 0xEC, 0xE5, 0x68, 0xAA, 0xCA, 0x43, 0x36, + 0x42, 0x20, 0x83, 0xB0, 0x69, 0x7B, 0x6A, 0xA0, + 0x05, 0x86, 0xE4, 0xBF, 0x7D, 0xD6, 0x73, 0xA3, + 0xD5, 0x96, 0xB8, 0x61, 0x8A, 0xC3, 0xB4, 0x06, + 0x17, 0x50, 0xC6, 0xBE, 0x97, 0xCB, 0x53, 0x75, + 0x3D, 0x02, 0x39, 0x55, 0x56, 0x07, 0x5A, 0x26, + 0xF1, 0x40, 0xB9, 0x3F, 0x57, 0x7D, 0xAD, 0x50, + 0x5E, 0x1C, 0xF2, 0xB5, 0x51, 0xA0, 0x4C, 0x98, + 0xC7, 0xF0, 0x90, 0x18, 0x31, 0xB3, 0xCA, 0x61, + 0xD7, 0x5D, 0xA7, 0x93, 0xAC, 0x72, 0xA4, 0x4C, + 0x7A, 0x07, 0xF7, 0xDB, 0xBA, 0xD6, 0x0A, 0x55, + 0xF4, 0x9C, 0xBD, 0x79, 0xDE, 0xE4, 0x73, 0x9F, + 0xFD, 0x36, 0x77, 0x8E, 0xBD, 0x08, 0xEB, 0xDB, + 0x79, 0xEC, 0x07, 0xA1, 0x62, 0x39, 0xC5, 0xB9, + 0x21, 0x59, 0x9F, 0xEB, 0xFE, 0xA4, 0x6D, 0xDF, + 0x96, 0x6A, 0xA4, 0xA0, 0x15, 0x12, 0xE6, 0x10, + 0x94, 0x3F, 0x5D, 0xC5, 0x4B, 0x4C, 0x76, 0xB7, + 0x64, 0xB3, 0x80, 0xBF, 0x2F, 0x84, 0xED, 0xE3, + 0x21, 0x24, 0x91, 0x2F, 0x54, 0xF7, 0xB6, 0xE2, + 0x07, 0xB7, 0x38, 0x1F, 0x67, 0x0F, 0x7A, 0xA0, + 0xF3, 0xC3, 0xED, 0x10, 0x15, 0x74, 0x03, 0x84, + 0xDD, 0x61, 0xA9, 0x76, 0x5E, 0xE4, 0x69, 0x6E, + 0xAC, 0xF8, 0x2E, 0xA4, 0x10, 0x69, 0x18, 0x05, + 0xCB, 0x68, 0x89, 0x03, 0x53, 0x5D, 0x70, 0x46, + 0x10, 0x0D, 0xCC, 0x2B, 0xA7, 0xD8, 0x30, 0x2A, + 0xCB, 0x04, 0x30, 0xD5, 0x06, 0xCC, 0xC1, 0xC0, + 0xDD, 0xEA, 0x71, 0x11, 0xA7, 0x6F, 0x45, 0xB4, + 0x54, 0xE2, 0x5C, 0xDD, 0xFB, 0x63, 0x9B, 0x3D, + 0x66, 0x4C, 0x36, 0xD8, 0x84, 0x35, 0x13, 0xA3, + 0xFC, 0xAF, 0x9E, 0x60, 0x57, 0xE9, 0xBC, 0x06, + 0x82, 0x37, 0xFE, 0x24, 0x19, 0xA2, 0xD2, 0xD9, + 0x0B, 0x4A, 0x1F, 0xC2, 0xA7, 0x1A, 0x14, 0x6D, + 0x2B, 0xD0, 0x43, 0x64, 0xC7, 0x9B, 0x8E, 0xBA, + 0x8E, 0x3E, 0x88, 0xCE, 0x11, 0xE9, 0x16, 0xE4, + 0xA7, 0x52, 0x84, 0x21, 0x32, 0x8C, 0xF5, 0x4F, + 0xAA, 0xB2, 0xB1, 0x9F, 0x44, 0x46, 0x87, 0x81, + 0xF8, 0xAB, 0x84, 0xB7, 0xDD, 0x97, 0x2F, 0xF5, + 0x61, 0x50, 0x71, 0x43, 0x0A, 0x43, 0x74, 0xDA, + 0xFC, 0xAE, 0x1E, 0x60, 0x44, 0xAA, 0x98, 0xE9, + 0x85, 0x94, 0x1B, 0xA6, 0xB9, 0xDB, 0x8C, 0x02, + 0xF5, 0x89, 0x60, 0x3E, 0xEB, 0x8B, 0xE9, 0x0A, + 0x70, 0xEF, 0xC0, 0x88, 0xD7, 0x95, 0xE6, 0xDA, + 0x1F, 0x1F, 0x2E, 0x6E, 0xCE, 0xDD, 0x03, 0x1D, + 0x81, 0x99, 0xE6, 0x59, 0x12, 0xD4, 0x34, 0xD0, + 0x9B, 0xFB, 0xE5, 0x94, 0x40, 0x6D, 0xC1, 0x15, + 0x0E, 0x99, 0x35, 0x8C, 0xEA, 0x7F, 0xAD, 0x2E, + 0x7C, 0x44, 0xC3, 0x8B, 0x6E, 0x0C, 0xEE, 0xAB, + 0x9B, 0xDE, 0x0D, 0xB9, 0x7B, 0xCF, 0x5A, 0xC9, + 0x94, 0x10, 0xC9, 0x47, 0x0E, 0x26, 0x6B, 0x8B, + 0xE4, 0x5F, 0x66, 0x90, 0x83, 0x1F, 0x41, 0x45, + 0xE2, 0x63, 0x79, 0xDB, 0x80, 0x7C, 0x26, 0xDD, + 0xF9, 0x1E, 0x30, 0x9D, 0x4F, 0x4A, 0x3E, 0x7E, + 0xCA, 0xB7, 0x36, 0x2F, 0x15, 0xD2, 0x0E, 0xA4, + 0x33, 0xB7, 0xE7, 0x0A, 0x7D, 0xDE, 0x74, 0x16, + 0xCE, 0xA8, 0x71, 0x49, 0x8B, 0x2C, 0xE3, 0xF5, + 0x8D, 0x29, 0xD8, 0x62, 0x8C, 0x53, 0x18, 0x40, + 0xF0, 0x22, 0xDD, 0x3B, 0xD2, 0xF3, 0x80, 0x9B, + 0x11, 0x68, 0xD3, 0x8E, 0x63, 0xC7, 0xF6, 0x93, + 0x08, 0xA3, 0x1A, 0x2D, 0x4D, 0x5E, 0xEB, 0x97, + 0x42, 0x39, 0xB3, 0x4A, 0x62, 0xBC, 0x85, 0xE4, + 0xEC, 0xF9, 0x0C, 0x33, 0x6A, 0x0C, 0x37, 0xBD, + 0x9E, 0x0E, 0xF4, 0x26, 0x6B, 0x83, 0x5A, 0xC8, + 0x90, 0x6A, 0x83, 0xCF, 0x0B, 0x35, 0x13, 0x8A, + 0x65, 0xE5, 0xD9, 0xA6, 0x1F, 0xCC, 0x9B, 0x2D, + 0x5A, 0x33, 0x7B, 0x8A, 0xBE, 0xF8, 0x8A, 0x7F, + 0xB3, 0xC0, 0x94, 0x5D, 0x7C, 0xAF, 0x35, 0x61, + 0x1A, 0xE0, 0xE4, 0x46, 0x93, 0xA5, 0xBC, 0xE0, + 0xA6, 0xE2, 0xFE, 0xCA, 0xE9, 0xBD, 0xF4, 0xE3, + 0x56, 0xD6, 0x53, 0x6B, 0x58, 0x1A, 0x18, 0xF0, + 0x3A, 0x59, 0x16, 0x4E, 0xD5, 0x44, 0x7C, 0x7E, + 0xC8, 0xBD, 0x99, 0x7B, 0xE9, 0x53, 0xDE, 0xD9, + 0x32, 0x53, 0x5B, 0x5F, 0x43, 0x8A, 0x04, 0x31, + 0x9F, 0x5E, 0x0D, 0x8B, 0x0F, 0xEB, 0xC8, 0xDE, + 0x81, 0x46, 0x65, 0x8E, 0x52, 0xB9, 0x75, 0x9C, + 0x73, 0x93, 0x5B, 0x12, 0x0D, 0xC9, 0xB8, 0x54, + 0xF3, 0xC8, 0xF9, 0x4E, 0xC9, 0x33, 0x90, 0x57, + 0xD7, 0xD7, 0xCD, 0x91, 0xF7, 0xE0, 0xB9, 0x8D, + 0x84, 0xEC, 0x7B, 0x2F, 0x92, 0x32, 0x8D, 0x73, + 0x60, 0x18, 0xB0, 0x31, 0x65, 0xA8, 0x74, 0x5F, + 0x8E, 0x77, 0xEB, 0x80, 0x29, 0xF9, 0x78, 0x26, + 0x70, 0xCB, 0xD8, 0x6B, 0x43, 0x16, 0xC7, 0xBE, + 0x4A, 0x88, 0x03, 0x38, 0xBA, 0xCF, 0xB0, 0x15, + 0x69, 0x9B, 0xF3, 0x0D, 0x3A, 0x4B, 0x05, 0x32, + 0x54, 0x35, 0xBA, 0x5F, 0xA3, 0xB9, 0xD2, 0xB2, + 0xFE, 0x0B, 0x51, 0x9C, 0x2C, 0xB2, 0x46, 0xE5, + 0x3D, 0x1A, 0x34, 0x3D, 0x66, 0x1A, 0x66, 0x14, + 0x3C, 0x6F, 0x46, 0x8C, 0x55, 0x38, 0x64, 0x5C, + 0xC2, 0x6D, 0x4E, 0x2A, 0x87, 0x03, 0xEC, 0x9B, + 0x10, 0xFC, 0x89, 0xBE, 0x6F, 0x85, 0x99, 0x97, + 0x70, 0x8F, 0x31, 0x19, 0x4F, 0x0D, 0xFE, 0xE9, + 0x29, 0x98, 0xB2, 0x5E, 0x93, 0xB9, 0x70, 0x70, + 0xDE, 0x14, 0x40, 0x9D, 0x5B, 0xA4, 0x3D, 0xF8, + 0x8D, 0x15, 0xC2, 0xFB, 0xA9, 0x7B, 0xDD, 0xE6, + 0x18, 0xCC, 0x3F, 0xC0, 0x42, 0xF7, 0x74, 0x81, + 0x84, 0xBA, 0x9E, 0xC9, 0xCB, 0xA1, 0xB2, 0x00, + 0x68, 0x81, 0xD0, 0x51, 0x42, 0x64, 0x19, 0x8F, + 0xB6, 0x91, 0xC5, 0xC0, 0x38, 0xE0, 0x49, 0x50, + 0xCF, 0x69, 0x09, 0x93, 0x77, 0xFE, 0x66, 0xBA, + 0x64, 0xE2, 0x19, 0x52, 0xA4, 0x45, 0x81, 0x71, + 0x96, 0x64, 0xF5, 0xD9, 0x23, 0x97, 0xD2, 0x2A, + 0xA7, 0x03, 0x2B, 0xF5, 0x89, 0xAF, 0x8A, 0xCA, + 0x48, 0xDF, 0x6D, 0x14, 0xEB, 0x43, 0xCE, 0xF0, + 0xA9, 0xC8, 0xA8, 0xF9, 0xAD, 0x32, 0x95, 0x25, + 0xEF, 0x0A, 0xAA, 0x4F, 0x9E, 0x09, 0xC3, 0x51, + 0x3C, 0xF0, 0x29, 0xF3, 0xDE, 0xFC, 0xBB, 0x41, + 0x14, 0xFA, 0x0F, 0x66, 0x8D, 0xB4, 0x72, 0x2F, + 0xCC, 0xD9, 0xC2, 0x07, 0xB6, 0x6F, 0x10, 0x9E, + 0xD9, 0x5B, 0x45, 0x4B, 0xB6, 0x19, 0x5D, 0x59, + 0xC4, 0xA6, 0x78, 0xBA, 0x6F, 0x5A, 0x9B, 0x23, + 0x41, 0x21, 0xAD, 0x05, 0x16, 0xA1, 0xD4, 0x12, + 0x3D, 0x38, 0x26, 0xD9, 0x2A, 0x61, 0xB3, 0x5D, + 0xEB, 0x29, 0x5B, 0xAA, 0x2F, 0xE1, 0xB5, 0xEE, + 0x25, 0x02, 0x1D, 0xAE, 0xF8, 0x57, 0xB5, 0xDF, + 0x19, 0x2E, 0x17, 0x5E, 0x3A, 0x2A, 0x0D, 0x3F, + 0x08, 0x2F, 0x21, 0x1C, 0xB5, 0xBD, 0xC2, 0x36, + 0x27, 0x4F, 0x86, 0xC5, 0xDC, 0x74, 0xC3, 0x9B, + 0xE9, 0x7C, 0xCF, 0x5F, 0x57, 0x94, 0xEB, 0x64, + 0xEC, 0x64, 0x55, 0x45, 0x21, 0x0F, 0xC6, 0x67, + 0xD1, 0xE0, 0x74, 0x0E, 0x66, 0xCB, 0xED, 0xC2, + 0x06, 0x48, 0xCA, 0x1F, 0xA7, 0x34, 0x14, 0x59, + 0x6B, 0xA0, 0x89, 0x17, 0xA1, 0x9A, 0x46, 0x3A, + 0xD3, 0x02, 0x7C, 0x81, 0x83, 0x6B, 0x8F, 0x4F, + 0x02, 0xB9, 0x9F, 0xC5, 0x08, 0x3F, 0x06, 0xF3, + 0x4B, 0xD2, 0x30, 0x9C, 0x23, 0x42, 0xAD, 0x88, + 0xA8, 0x4F, 0xA9, 0x6E, 0x20, 0x7C, 0x01, 0x08, + 0xF6, 0x82, 0x54, 0x14, 0x94, 0x4F, 0x26, 0x4E, + 0xD6, 0xC4, 0x66, 0x7C, 0x78, 0x8D, 0x61, 0xA6, + 0xBC, 0x2C, 0x45, 0x6A, 0xF6, 0x6C, 0x2F, 0x76, + 0x9E, 0x16, 0x90, 0x17, 0x06, 0x91, 0x2C, 0xC9, + 0x0D, 0x4B, 0x6C, 0x90, 0xDC, 0xA1, 0x6C, 0xAC, + 0x8F, 0xFE, 0xD8, 0x39, 0x70, 0x20, 0xE2, 0x97, + 0x5E, 0x24, 0xFF, 0x4C, 0x80, 0x7C, 0x8A, 0xB7, + 0x31, 0xC8, 0x1D, 0x36, 0xCA, 0x84, 0xC9, 0x12, + 0x1A, 0x85, 0x13, 0xE0, 0xC9, 0xD0, 0xF4, 0x1B, + 0xC6, 0x8F, 0x88, 0xEA, 0xCA, 0xA3, 0x55, 0x99, + 0xFA, 0xE3, 0xBB, 0xA6, 0xFC, 0xC6, 0x52, 0x8D, + 0x47, 0xE4, 0x0C, 0x07, 0x64, 0xCF, 0x9C, 0x83, + 0x83, 0xB3, 0xA4, 0x45, 0x15, 0xE6, 0x1D, 0x92, + 0xCD, 0xAE, 0xC9, 0xCB, 0x90, 0x82, 0xB5, 0xA0, + 0xC0, 0x37, 0x94, 0x60, 0xD9, 0x17, 0x9A, 0x7D, + 0x9D, 0xF2, 0x9E, 0x0B, 0x4B, 0x6A, 0x41, 0x18, + 0x28, 0x52, 0x15, 0xE8, 0x7B, 0x6F, 0x11, 0x8E, + 0x97, 0x31, 0xE4, 0x66, 0xFB, 0x3F, 0xEB, 0xD1, + 0x95, 0xE1, 0x44, 0xFD, 0x20, 0x37, 0xD1, 0x16, + 0x62, 0x75, 0x79, 0xAC, 0x55, 0xFE, 0xD5, 0xE3, + 0x25, 0x85, 0xEC, 0x66, 0x38, 0xA0, 0xDF, 0xBE, + 0x6E, 0xD6, 0xC5, 0x87, 0x6C, 0xF8, 0x11, 0x4C, + 0x90, 0x2A, 0xEF, 0xA3, 0x63, 0xF4, 0xC9, 0xB7, + 0x2E, 0x7D, 0x5C, 0x85, 0x2D, 0xCC, 0x1A, 0xF2, + 0xB8, 0x85, 0x2A, 0x9D, 0x0F, 0x99, 0x59, 0x38, + 0x86, 0x50, 0x84, 0xCE, 0x52, 0x13, 0xB3, 0x08, + 0xA9, 0xCB, 0x37, 0xF6, 0x81, 0x96, 0x0D, 0x84, + 0xEF, 0xE1, 0xDF, 0x51, 0x34, 0xA5, 0x91, 0x5A, + 0xE5, 0x87, 0x8B, 0x10, 0xDA, 0x0F, 0xD4, 0xD9, + 0xAC, 0x2A, 0xEF, 0x0C, 0x7E, 0x01, 0xC2, 0xE9, + 0xE7, 0xC0, 0x17, 0xE7, 0xBA, 0x74, 0x0C, 0xEE, + 0x1A, 0x89, 0x94, 0x59, 0xBB, 0x75, 0x03, 0x3E, + 0xEA, 0xF3, 0x19, 0x0D, 0x67, 0x79, 0xED, 0x9E, + 0xDD, 0x84, 0x6A, 0x74, 0xE3, 0x21, 0x52, 0x8C, + 0x03, 0x08, 0x4A, 0x5D, 0x30, 0x87, 0x48, 0x39, + 0x71, 0x8A, 0x53, 0x54, 0x9B, 0x2E, 0xC6, 0xB2, + 0xB7, 0x30, 0xAA, 0x93, 0x5C, 0xA6, 0xE1, 0xC4, + 0xFD, 0x8B, 0xE0, 0x35, 0x7D, 0x93, 0xF6, 0x21, + 0x74, 0xEE, 0xED, 0xF8, 0xDA, 0xB7, 0x75, 0x5B, + 0x46, 0x65, 0x7E, 0x59, 0xD7, 0xAA, 0x00, 0xB9, + 0xF2, 0xF8, 0x5E, 0x4C, 0x0F, 0x77, 0xFA, 0x11, + 0xA5, 0xD6, 0x9A, 0x23, 0xB1, 0xEF, 0x3A, 0x09, + 0xF2, 0x19, 0xD8, 0x3B, 0x1F, 0x39, 0x1F, 0x84, + 0x13, 0x18, 0xEE, 0xF3, 0x5A, 0x32, 0x63, 0x67, + 0xBF, 0xA2, 0xB1, 0x5F, 0xD7, 0x14, 0x03, 0x20, + 0x92, 0xB9, 0xD0, 0x2B, 0xF6, 0x13, 0xAF, 0xF7, + 0x69, 0x6F, 0xAD, 0xF1, 0xDE, 0x2C, 0x81, 0x70, + 0x77, 0xCB, 0x7C, 0x99, 0x67, 0x76, 0xD6, 0x9E, + 0xC2, 0x41, 0xA2, 0x42, 0x54, 0xDA, 0x2D, 0x13, + 0x98, 0x76, 0x91, 0xEA, 0xC7, 0xEB, 0xA8, 0xCD, + 0x8D, 0xCF, 0xB3, 0x94, 0x7B, 0x1D, 0x99, 0xED, + 0xF9, 0x62, 0xD2, 0x15, 0xB3, 0x18, 0xBB, 0x5F, + 0x9A, 0xA0, 0x4D, 0x1C, 0x82, 0x62, 0x6A, 0x41, + 0x73, 0xD0, 0x2D, 0x41, 0x0C, 0x58, 0x6B, 0xCA, + 0x4E, 0x51, 0xCA, 0x4F, 0x3E, 0x15, 0x1B, 0x54, + 0xF1, 0x7A, 0x6B, 0xC9, 0x67, 0x76, 0x09, 0xBB, + 0xAF, 0x6C, 0x30, 0x38, 0xA6, 0x7C, 0xAD, 0xA6, + 0x6B, 0x4F, 0xDF, 0xB5, 0x10, 0x29, 0xE0, 0x78, + 0x07, 0xD7, 0x05, 0x96, 0x9D, 0x96, 0xC9, 0xAB, + 0xFB, 0x71, 0x62, 0xE4, 0x58, 0x10, 0xA1, 0xDC, + 0x4B, 0x56, 0xDA, 0x14, 0x77, 0xED, 0x90, 0x0A, + 0x89, 0xCC, 0xAC, 0x29, 0x8E, 0x17, 0x88, 0x42, + 0x69, 0xC3, 0x9E, 0x8D, 0x7A, 0xB9, 0x66, 0xF3, + 0x3D, 0xDA, 0xDB, 0xE5, 0x6A, 0x38, 0x4C, 0xA2, + 0x0A, 0x7B, 0x18, 0x99, 0xEC, 0x18, 0xE2, 0xAE, + 0x54, 0x70, 0x00, 0xB9, 0x04, 0xE3, 0x4E, 0x46, + 0x80, 0x1D, 0x85, 0x74, 0xDB, 0x00, 0x84, 0x17, + 0xBC, 0xFD, 0xD1, 0xA7, 0x4D, 0xC0, 0x18, 0xE5, + 0x07, 0xB7, 0x6B, 0x0F, 0xA0, 0x86, 0x26, 0x23, + 0x5B, 0x1C, 0xE2, 0x4B, 0xCF, 0xC3, 0x20, 0xFA, + 0xE3, 0x55, 0x1C, 0x1C, 0x92, 0x9B, 0x94, 0xC7, + 0xC4, 0x96, 0x53, 0x41, 0x82, 0x9D, 0x8A, 0x13, + 0x47, 0xD6, 0xA7, 0x38, 0x58, 0x03, 0xB0, 0x8B, + 0xCD, 0xA8, 0x4A, 0x27, 0xEA, 0x5E, 0x49, 0xCA, + 0x1E, 0x60, 0x06, 0xEA, 0x23, 0x2A, 0x53, 0xEE, + 0x41, 0x7E, 0xC8, 0x81, 0xD3, 0x32, 0x8A, 0x15, + 0x63, 0x82, 0xA6, 0xB2, 0x93, 0x89, 0x4D, 0xDF, + 0x9B, 0x36, 0x9C, 0xDE, 0x6B, 0x2F, 0xF5, 0x9C, + 0xB6, 0xA5, 0x64, 0xE2, 0x1C, 0x92, 0x79, 0xEC, + 0xA0, 0x31, 0x1F, 0x5D, 0x80, 0xCE, 0x39, 0xB9, + 0x8B, 0xF9, 0x0D, 0xB3, 0x27, 0xF7, 0x4D, 0x3F, + 0x76, 0x2D, 0x11, 0x7D, 0xF5, 0xF9, 0x13, 0x20, + 0x84, 0xFF, 0xB5, 0x55, 0xA5, 0xD1, 0x47, 0x22, + 0x1A, 0xF8, 0x63, 0xAB, 0xF7, 0x87, 0x15, 0xB7, + 0x21, 0x94, 0x52, 0x9A, 0x0E, 0x33, 0x4D, 0x4A, + 0x19, 0x1D, 0x42, 0xA9, 0x9B, 0xEA, 0x52, 0xAD, + 0xA2, 0xC7, 0xCC, 0x4A, 0x97, 0x74, 0xD5, 0xCB, + 0x28, 0xD4, 0xED, 0x82, 0xB6, 0x1F, 0x94, 0xE8, + 0x9F, 0x60, 0xF0, 0xC8, 0xEA, 0x52, 0xDC, 0x07, + 0x9D, 0x46, 0x58, 0xBF, 0x8C, 0x85, 0x6D, 0x61, + 0x52, 0xD9, 0x22, 0x51, 0x94, 0x8B, 0x3B, 0xA0, + 0x14, 0xD8, 0xBA, 0xF3, 0xDC, 0xD3, 0x6B, 0xC7, + 0x1F, 0x8E, 0x5B, 0x2C, 0xE6, 0xF5, 0x35, 0xB7, + 0xB9, 0xAE, 0x13, 0xDA, 0x4A, 0x1E, 0xAF, 0xFC, + 0x25, 0x3B, 0xE4, 0x3A, 0x9F, 0x60, 0x8E, 0xAC, + 0xE7, 0x33, 0xCF, 0xCE, 0x52, 0xEA, 0x5C, 0xDA, + 0x83, 0x59, 0xDB, 0x53, 0xFF, 0x3A, 0xF2, 0xCE, + 0xFE, 0x87, 0x79, 0xBC, 0xC5, 0x3C, 0x24, 0xA4, + 0xB1, 0x8D, 0x5E, 0x0D, 0x78, 0x1B, 0xEC, 0xF7, + 0x5B, 0x54, 0x77, 0x47, 0x3A, 0x20, 0x24, 0xAD, + 0x56, 0xC5, 0x4A, 0x7F, 0x99, 0x0E, 0xF6, 0xB1, + 0xDF, 0xAC, 0x50, 0x10, 0x88, 0x50, 0x9D, 0x3A, + 0x37, 0xF1, 0xC8, 0xD5, 0xC2, 0x64, 0x87, 0xE4, + 0x20, 0xB7, 0xF4, 0x35, 0x8E, 0x92, 0x69, 0x76, + 0x1F, 0xF1, 0xFA, 0x3A, 0xFC, 0xBE, 0xCA, 0xEB, + 0x68, 0xF5, 0xDD, 0xDE, 0x3A, 0xA8, 0xFD, 0x07, + 0x8C, 0xC4, 0x22, 0x4C, 0xEA, 0x67, 0x13, 0x2D, + 0x7E, 0xBF, 0x5D, 0x23, 0x2E, 0x43, 0xBA, 0xDD, + 0x21, 0x8C, 0x0B, 0x4D, 0xBE, 0x1E, 0x16, 0x52, + 0x98, 0x66, 0xB9, 0xAB, 0x93, 0x58, 0x85, 0xAC, + 0xB4, 0x15, 0xFB, 0xB1, 0xEE, 0xE6, 0x94, 0x08, + 0xA5, 0x21, 0xB4, 0x62, 0xEC, 0x59, 0xCD, 0x0D, + 0x3C, 0x54, 0x96, 0xD9, 0x85, 0xAE, 0xB0, 0xCE, + 0x37, 0x4F, 0x67, 0x72, 0xA4, 0xE6, 0x39, 0x3A, + 0x4E, 0xF0, 0x07, 0x43, 0x80, 0x90, 0xA8, 0xA9, + 0xE5, 0x2D, 0x2F, 0x55, 0x66, 0x6D, 0x70, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x08, 0x0E, 0x12, 0x19, 0x20 + }; +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 + static const byte pk_87[] = { + 0x2D, 0x1E, 0x6B, 0xED, 0x84, 0x52, 0xEB, 0xF1, + 0x26, 0xED, 0xE7, 0x0C, 0xA0, 0xA2, 0xB5, 0x0D, + 0x03, 0x34, 0x2D, 0x5B, 0x13, 0xB2, 0xAE, 0x21, + 0x0F, 0x45, 0x62, 0xA3, 0xBF, 0x67, 0x0C, 0xB1, + 0x5C, 0xE9, 0x25, 0xFD, 0x22, 0xF2, 0x62, 0x42, + 0xBA, 0xE3, 0x10, 0xB3, 0xAA, 0x41, 0x3B, 0x6E, + 0x78, 0xD4, 0x42, 0xD9, 0x35, 0xD1, 0x72, 0x8A, + 0x32, 0x48, 0xCC, 0x20, 0x5C, 0xCD, 0x8D, 0x3F, + 0xD8, 0x34, 0x95, 0x55, 0x20, 0xCD, 0xFB, 0x2C, + 0x73, 0xE9, 0x0E, 0x60, 0x8B, 0x2C, 0x3F, 0xA8, + 0xB7, 0xD1, 0x79, 0xFD, 0xDC, 0xC8, 0x81, 0x11, + 0xC9, 0xE8, 0x41, 0x71, 0xE9, 0x70, 0x9B, 0x53, + 0x59, 0x33, 0xE4, 0x92, 0xB6, 0x81, 0x9C, 0x6A, + 0x92, 0xED, 0xA2, 0x5A, 0xC4, 0x07, 0x77, 0x1A, + 0x8F, 0xED, 0xB4, 0xE7, 0x11, 0xFB, 0x89, 0xEB, + 0x7B, 0xDF, 0xCC, 0xEA, 0xC5, 0x3B, 0x4E, 0xF4, + 0x6B, 0x6F, 0xBE, 0xE1, 0x32, 0xA9, 0xD7, 0xAD, + 0xB4, 0x36, 0xE7, 0x4A, 0x6D, 0x67, 0x11, 0x83, + 0xAF, 0x31, 0x1A, 0x7A, 0x31, 0x42, 0x9B, 0x01, + 0x21, 0x17, 0x52, 0x75, 0x85, 0xF7, 0x92, 0x0F, + 0x34, 0x8A, 0x69, 0x11, 0x88, 0x5A, 0x02, 0x08, + 0xB6, 0x6D, 0xE3, 0x07, 0x93, 0xB1, 0x3F, 0xE1, + 0xD5, 0x7B, 0xD9, 0x51, 0xF7, 0xAA, 0xC0, 0x34, + 0x9A, 0x78, 0x5D, 0x26, 0xDB, 0xF1, 0xF0, 0xA9, + 0x1E, 0x5C, 0x9F, 0x4F, 0xA7, 0x43, 0x5C, 0x44, + 0xA9, 0x43, 0xF1, 0x38, 0x11, 0x45, 0xED, 0xEB, + 0x1C, 0x8A, 0x05, 0xEE, 0xFF, 0xAB, 0x20, 0x2C, + 0xF6, 0x2C, 0xEE, 0x77, 0x42, 0x36, 0x3E, 0xE6, + 0x9D, 0x8E, 0x45, 0x0F, 0xF6, 0x7C, 0x39, 0x62, + 0xD6, 0xFF, 0x97, 0xBC, 0x3D, 0x02, 0xD6, 0xDF, + 0x4A, 0x35, 0xDA, 0x3F, 0x89, 0xA4, 0x88, 0x33, + 0xCD, 0xF2, 0x90, 0xF0, 0xE9, 0x37, 0x2F, 0x65, + 0xA5, 0x88, 0x65, 0xFD, 0x40, 0x44, 0xAD, 0x09, + 0x09, 0x92, 0xAA, 0x15, 0x9E, 0xEE, 0xF7, 0x2B, + 0x0D, 0xA7, 0xCB, 0x3A, 0x5E, 0x0A, 0xED, 0xD6, + 0x7D, 0x82, 0x8B, 0xBA, 0xCF, 0xE5, 0x9E, 0xE4, + 0x62, 0xAB, 0x69, 0x6B, 0xBA, 0xD0, 0xE5, 0xA9, + 0xBB, 0x1F, 0x5A, 0x51, 0xE0, 0xFA, 0x5D, 0xD4, + 0x4D, 0x8E, 0xC0, 0xDC, 0x43, 0x06, 0xDF, 0x23, + 0x67, 0xB2, 0x4A, 0xA2, 0xFB, 0x75, 0x2F, 0x82, + 0xD8, 0x44, 0xE4, 0xC0, 0xCE, 0x15, 0x9E, 0x3F, + 0xD6, 0xB4, 0x70, 0x5F, 0x3B, 0xD0, 0x56, 0x3E, + 0x0A, 0x7A, 0x4B, 0x94, 0xBF, 0xBA, 0x01, 0x2B, + 0x9C, 0x8B, 0x91, 0x35, 0xF2, 0xDB, 0x4C, 0x8C, + 0x8D, 0xD6, 0xEE, 0xC8, 0x65, 0x8D, 0xF3, 0x05, + 0x59, 0xBE, 0x3A, 0x17, 0xA7, 0x72, 0x10, 0x56, + 0x14, 0xEF, 0xB8, 0xC1, 0xBE, 0x18, 0x11, 0x0B, + 0xE6, 0x70, 0xF8, 0x39, 0xA5, 0x72, 0x7D, 0xF9, + 0x47, 0xFB, 0xAC, 0xFD, 0x1F, 0xC3, 0x71, 0x33, + 0x58, 0x44, 0x15, 0xD3, 0x7C, 0x93, 0x2E, 0x70, + 0x92, 0xFA, 0xBB, 0xF2, 0xD0, 0x9D, 0x25, 0xC4, + 0xCF, 0x4A, 0xB8, 0xEC, 0xBE, 0x5D, 0x8B, 0x7F, + 0xA4, 0x7C, 0xAB, 0xAD, 0xE7, 0x1E, 0x93, 0x83, + 0x92, 0x86, 0x1E, 0x8D, 0x15, 0xA4, 0x1C, 0x5B, + 0x42, 0x25, 0xDA, 0x3D, 0x16, 0xD3, 0x93, 0xF2, + 0x85, 0x50, 0x86, 0x0A, 0x86, 0x35, 0x6B, 0x14, + 0xAB, 0x5F, 0x22, 0xD0, 0xCF, 0x03, 0x7C, 0xEB, + 0xB4, 0x0E, 0xAC, 0x87, 0xA2, 0x41, 0x42, 0xA0, + 0x21, 0x93, 0x00, 0xB6, 0x47, 0x6F, 0x96, 0xD0, + 0x41, 0xD1, 0xC3, 0x0E, 0x3C, 0x52, 0xD2, 0x45, + 0xAB, 0x6A, 0xE7, 0xA1, 0xE5, 0xFD, 0x73, 0xC5, + 0x82, 0x9D, 0x60, 0x62, 0x8B, 0x6D, 0x87, 0xFC, + 0x88, 0x9C, 0x3E, 0xEF, 0xAE, 0xAA, 0xB6, 0x1C, + 0x18, 0xEE, 0xD7, 0x51, 0x1A, 0x96, 0xC4, 0x93, + 0x25, 0x05, 0xD3, 0x83, 0x3D, 0xD8, 0x33, 0x16, + 0x14, 0x44, 0x88, 0xE2, 0xAF, 0xC4, 0xEC, 0x59, + 0x18, 0x12, 0xB9, 0x99, 0xC1, 0xC9, 0x5F, 0x31, + 0x79, 0x00, 0x03, 0xF6, 0xC9, 0x55, 0x14, 0xAA, + 0x29, 0x08, 0x78, 0x24, 0xAF, 0x1D, 0x99, 0x12, + 0x36, 0xD9, 0x4A, 0xD9, 0x50, 0xEF, 0x66, 0xFC, + 0x7F, 0xF4, 0xBC, 0x3B, 0xA0, 0xF6, 0xFD, 0xF2, + 0x62, 0xCA, 0xA5, 0x9D, 0x2B, 0x55, 0xB8, 0x33, + 0xBC, 0xA6, 0x7A, 0xA5, 0x1E, 0xE1, 0x14, 0x5F, + 0x94, 0xE2, 0xDC, 0xF0, 0x5B, 0xBD, 0x43, 0x07, + 0xD8, 0xB1, 0xE0, 0x81, 0x3F, 0x84, 0x54, 0x90, + 0xBF, 0x23, 0x59, 0x92, 0x3C, 0xA5, 0x98, 0xAB, + 0x7D, 0x99, 0xD2, 0xF0, 0xED, 0x8E, 0x0B, 0xC9, + 0x9F, 0xAF, 0xB0, 0x13, 0xED, 0xC7, 0xDD, 0xB8, + 0x61, 0x72, 0x07, 0x3D, 0xCC, 0x35, 0x73, 0xA0, + 0xCF, 0x0C, 0xD9, 0x7E, 0x93, 0xDC, 0x63, 0xB8, + 0x82, 0xEC, 0xF4, 0x30, 0xCE, 0x43, 0x92, 0xEA, + 0x5E, 0xD8, 0xC8, 0xA1, 0xEC, 0x79, 0xDC, 0xAE, + 0x64, 0xD4, 0x33, 0xEB, 0x53, 0x8C, 0xFC, 0x49, + 0x79, 0xBF, 0x7A, 0x28, 0x65, 0x1E, 0x8C, 0xD5, + 0x21, 0xB0, 0x8E, 0xCA, 0xAD, 0xF8, 0x96, 0x9A, + 0x98, 0x10, 0x00, 0x35, 0x6D, 0x58, 0x9A, 0xEF, + 0x84, 0x84, 0x86, 0x72, 0xBA, 0xCD, 0x38, 0x66, + 0x96, 0x9B, 0xC2, 0x83, 0xB0, 0x65, 0xC1, 0xAB, + 0xCF, 0x63, 0x8C, 0x2D, 0xC3, 0x42, 0xB2, 0x7D, + 0xF6, 0xB8, 0xF0, 0x3D, 0x26, 0x21, 0x8F, 0xAE, + 0x4E, 0x96, 0xF2, 0x55, 0x66, 0xBC, 0x6F, 0xED, + 0xE7, 0x19, 0xD3, 0x8D, 0xC0, 0xCD, 0x55, 0x20, + 0x5F, 0x10, 0xCA, 0xDA, 0x09, 0xED, 0x91, 0x4A, + 0x43, 0x33, 0xD3, 0x82, 0x11, 0x5C, 0x2F, 0x5D, + 0xEC, 0xCD, 0x54, 0xF9, 0x6C, 0xE4, 0xE5, 0xF2, + 0x68, 0xBC, 0xE9, 0x27, 0xB2, 0x1D, 0xCA, 0xB5, + 0xCD, 0x04, 0x01, 0x1E, 0x92, 0xF5, 0xF6, 0x01, + 0x86, 0x2B, 0x20, 0x20, 0x9B, 0xB0, 0xF9, 0x56, + 0xD9, 0x33, 0xD5, 0x0A, 0xEC, 0x1B, 0xF4, 0xCE, + 0xD2, 0xB2, 0xC2, 0xD4, 0x3F, 0x9A, 0x25, 0x76, + 0x8E, 0x29, 0x87, 0x52, 0x64, 0x86, 0x4A, 0xA5, + 0x7B, 0x5A, 0x91, 0x72, 0x6E, 0xBE, 0x6D, 0x73, + 0x0A, 0x8D, 0x89, 0x53, 0x82, 0x33, 0x70, 0x44, + 0x20, 0xBE, 0xE0, 0xB0, 0x1B, 0x76, 0x30, 0x43, + 0xA5, 0x5B, 0x8F, 0xAB, 0x7E, 0xB8, 0x61, 0x5F, + 0x43, 0x70, 0x1B, 0x1A, 0x71, 0x61, 0x56, 0xF9, + 0x13, 0x31, 0x2A, 0x64, 0x33, 0x14, 0x00, 0x98, + 0x72, 0xEC, 0x32, 0x88, 0x09, 0xFB, 0x64, 0x46, + 0x3D, 0x56, 0x02, 0xD9, 0x76, 0xD3, 0xAA, 0x90, + 0x0F, 0xBD, 0xF0, 0xF9, 0x96, 0x43, 0x7B, 0x62, + 0x19, 0x26, 0x22, 0x6A, 0x93, 0x91, 0xEC, 0x07, + 0x34, 0xF5, 0x22, 0x32, 0xB3, 0x65, 0x66, 0xE0, + 0x6B, 0x11, 0x7F, 0x97, 0x9F, 0x1A, 0x89, 0x46, + 0xCE, 0x8F, 0xBD, 0xFD, 0x2F, 0xCC, 0x3D, 0xBF, + 0xF2, 0x83, 0xA4, 0x30, 0xE1, 0x02, 0x72, 0xF8, + 0x74, 0xE6, 0x21, 0x96, 0x77, 0xE1, 0x57, 0x8A, + 0xF7, 0x9E, 0xB3, 0x31, 0xAF, 0xD8, 0xC5, 0xD7, + 0x20, 0xDC, 0xFD, 0xCF, 0x79, 0x06, 0x0F, 0x1F, + 0xE5, 0x84, 0x3D, 0x0B, 0x9C, 0xB3, 0xC7, 0xAB, + 0xB8, 0xF1, 0xC0, 0xD0, 0xB5, 0xC7, 0x01, 0xE2, + 0x0E, 0x3B, 0xAF, 0x7E, 0xAC, 0x44, 0x5A, 0x75, + 0x50, 0x0A, 0x76, 0x1C, 0x13, 0xDB, 0x25, 0xD4, + 0x0D, 0x19, 0x75, 0x4C, 0x02, 0xD9, 0xF3, 0xDF, + 0x6D, 0xBB, 0xCF, 0x47, 0xA6, 0xAE, 0xF6, 0xD1, + 0xFB, 0xF4, 0xB4, 0x55, 0xD3, 0xA5, 0x87, 0xA1, + 0x55, 0xFB, 0xBF, 0xCD, 0xF6, 0xA1, 0x64, 0x57, + 0x12, 0x75, 0x9A, 0x11, 0xA3, 0xCE, 0x42, 0x70, + 0x84, 0x54, 0x93, 0x12, 0xE1, 0x3A, 0x0F, 0xFA, + 0xCA, 0xF2, 0x25, 0x91, 0xF1, 0x4D, 0x8F, 0x84, + 0xB1, 0xB5, 0x35, 0xAC, 0xE9, 0x81, 0x77, 0x34, + 0x4D, 0x6F, 0x5D, 0x14, 0x9D, 0xB9, 0xE1, 0xF0, + 0x3F, 0x3C, 0xE7, 0xAD, 0x48, 0xE6, 0x8C, 0x51, + 0x86, 0xF4, 0x4A, 0xB4, 0xD0, 0x98, 0xEC, 0x3A, + 0x4E, 0xAB, 0x58, 0x2F, 0x08, 0x9E, 0x5A, 0x9D, + 0x45, 0x30, 0xB0, 0x85, 0xDF, 0x4A, 0xE7, 0x92, + 0xC6, 0xC8, 0x18, 0x93, 0x08, 0xCE, 0x9A, 0x8C, + 0xE2, 0x91, 0x8D, 0x91, 0x57, 0x7B, 0x37, 0xC8, + 0x80, 0xA2, 0x31, 0x10, 0x0D, 0x4E, 0xEF, 0x51, + 0x07, 0x94, 0x8E, 0xF8, 0x3C, 0x3C, 0x2E, 0xD5, + 0x03, 0x26, 0xB8, 0x72, 0x7F, 0xB9, 0xBC, 0xD7, + 0x95, 0xC4, 0x31, 0x08, 0xEC, 0x6F, 0xEE, 0x11, + 0xAF, 0xC0, 0xA2, 0xEC, 0xD7, 0xC8, 0x0B, 0xBE, + 0x15, 0xAE, 0xC9, 0x17, 0xBE, 0x37, 0xE2, 0x40, + 0x83, 0x65, 0xDE, 0xB3, 0x4E, 0xB4, 0x15, 0xB3, + 0x5C, 0x14, 0xF6, 0x5F, 0xA9, 0x1F, 0x70, 0xB5, + 0x23, 0x93, 0x78, 0xB9, 0x47, 0xF9, 0x1D, 0x2B, + 0x1E, 0x8D, 0xB1, 0x25, 0x7E, 0xE5, 0x85, 0x3C, + 0x16, 0x9F, 0xD0, 0xC2, 0x67, 0x8B, 0x0D, 0xD2, + 0x72, 0x4E, 0x74, 0x30, 0xE1, 0xAF, 0xB8, 0x66, + 0xCB, 0x53, 0xDF, 0xC4, 0xFB, 0xA5, 0x6D, 0x03, + 0xF2, 0xAE, 0xEE, 0x90, 0xFE, 0xD7, 0x30, 0xAF, + 0x33, 0x98, 0x09, 0xEB, 0x75, 0xC7, 0x3E, 0xC8, + 0x2F, 0xE7, 0x22, 0x5F, 0x2F, 0x0A, 0xBD, 0xA4, + 0x22, 0x88, 0x28, 0x19, 0x35, 0x83, 0x12, 0x86, + 0xEE, 0x72, 0xB4, 0x26, 0x89, 0x2F, 0xC7, 0x11, + 0x6E, 0xDD, 0x14, 0x98, 0x22, 0xE7, 0x73, 0x3E, + 0xFA, 0x46, 0x75, 0xF9, 0x40, 0xC1, 0x84, 0x22, + 0xBC, 0x75, 0x36, 0xC7, 0x82, 0xD3, 0xAE, 0x6E, + 0x0D, 0xBF, 0x6F, 0xC3, 0x4B, 0x67, 0x49, 0x19, + 0xF3, 0x4B, 0x12, 0xF2, 0x83, 0xFD, 0x39, 0x56, + 0x44, 0x05, 0x3A, 0x24, 0x6A, 0x35, 0x69, 0x12, + 0xCF, 0xE4, 0x93, 0xFE, 0x26, 0xCC, 0xD6, 0x01, + 0xA0, 0x4A, 0x84, 0xA8, 0x1D, 0x85, 0xE6, 0x83, + 0x0F, 0x3C, 0xE6, 0x6D, 0xD2, 0xCB, 0xB1, 0x14, + 0x8C, 0xEC, 0x10, 0xB3, 0x63, 0x4B, 0x9C, 0xF5, + 0x11, 0xE0, 0xF9, 0x86, 0x6F, 0xA7, 0xC0, 0x3B, + 0x9D, 0x25, 0xD7, 0x54, 0xCA, 0x40, 0x4D, 0x26, + 0xBA, 0x71, 0x8E, 0x25, 0xF5, 0xA7, 0xE3, 0x9B, + 0x25, 0x20, 0x7F, 0x29, 0x05, 0xB6, 0x27, 0x14, + 0x17, 0x67, 0x26, 0x10, 0xAD, 0xA3, 0x06, 0x03, + 0xFE, 0x82, 0x85, 0x5D, 0x01, 0x04, 0x4D, 0xE0, + 0x64, 0x38, 0x38, 0x5E, 0x83, 0x1E, 0x21, 0x9A, + 0x39, 0x02, 0xF8, 0xF9, 0x69, 0x85, 0x52, 0xE5, + 0xEC, 0x6A, 0xAC, 0x96, 0x86, 0xA7, 0x88, 0x69, + 0xB5, 0xB5, 0x7E, 0x03, 0x1D, 0xA9, 0x68, 0xCA, + 0x45, 0x0F, 0xF9, 0x14, 0xD6, 0x7B, 0xCF, 0x9C, + 0x03, 0x6F, 0xD1, 0xD9, 0x6F, 0x01, 0x3D, 0xF8, + 0xF3, 0x11, 0xF3, 0x29, 0x17, 0x90, 0xE8, 0x9B, + 0xED, 0x58, 0x9B, 0xF0, 0xBC, 0xC7, 0xBA, 0xF4, + 0x60, 0xC8, 0xAA, 0x30, 0xB4, 0x2F, 0x22, 0x8F, + 0xD3, 0xAC, 0x18, 0xC2, 0xB7, 0xC4, 0x7B, 0x31, + 0x9E, 0x0F, 0x7E, 0x9D, 0xBF, 0xD4, 0x63, 0xC2, + 0x8B, 0x1B, 0x58, 0x50, 0x33, 0x53, 0x6D, 0x79, + 0xBB, 0xF8, 0x0D, 0x91, 0x33, 0xD9, 0x07, 0xE7, + 0xB0, 0x81, 0xD4, 0xB4, 0x47, 0x61, 0x93, 0xF0, + 0xFB, 0x68, 0xBC, 0x1B, 0x41, 0xC2, 0xF5, 0x43, + 0x30, 0x7E, 0x76, 0xF9, 0xB1, 0xA3, 0xD6, 0xD4, + 0x26, 0xEA, 0x77, 0x75, 0x12, 0x7A, 0xC8, 0x30, + 0x9B, 0xCF, 0x45, 0xBE, 0x74, 0x7D, 0x8A, 0x8B, + 0xEC, 0xED, 0x11, 0xE6, 0xA1, 0xD1, 0xB8, 0xF1, + 0x90, 0xAD, 0x6D, 0x6A, 0xC6, 0x54, 0xE9, 0xDB, + 0xAD, 0x4C, 0x97, 0x39, 0xC8, 0xD8, 0x44, 0xA9, + 0x1A, 0x37, 0x16, 0x7E, 0x68, 0x45, 0x0C, 0xBB, + 0x10, 0xF4, 0xAE, 0x8E, 0x2B, 0x69, 0xFA, 0x95, + 0x3E, 0xA5, 0xC9, 0x91, 0xD3, 0xF1, 0xA3, 0x89, + 0x3F, 0x90, 0x86, 0x93, 0x1B, 0xF1, 0xA0, 0x89, + 0xC7, 0xF2, 0x23, 0x57, 0xD4, 0x8E, 0x2F, 0xD5, + 0x71, 0xCD, 0x36, 0xF1, 0x90, 0xB3, 0x98, 0x3E, + 0x19, 0xEA, 0xC8, 0x0F, 0x12, 0x9D, 0xBF, 0x58, + 0xED, 0xDC, 0x6B, 0x9A, 0x79, 0x84, 0xFC, 0xF0, + 0x4C, 0xC3, 0xB4, 0x0D, 0xB8, 0x7A, 0x8D, 0xAD, + 0x75, 0x40, 0xD5, 0xD5, 0xDE, 0xC8, 0xCA, 0x39, + 0x3E, 0x45, 0xE4, 0xBC, 0xF4, 0x33, 0xEA, 0x64, + 0xE1, 0x5E, 0x94, 0x42, 0x91, 0xAB, 0xBC, 0x42, + 0x2A, 0xB3, 0xD0, 0x60, 0x23, 0xCE, 0x57, 0x8E, + 0xFF, 0xAD, 0xA2, 0x2B, 0x64, 0xD9, 0x94, 0xA0, + 0x80, 0x0F, 0x8E, 0x50, 0x17, 0x08, 0x1D, 0x16, + 0xCF, 0x51, 0xD0, 0xB9, 0x28, 0xB6, 0x59, 0xEF, + 0x78, 0xCC, 0xC9, 0x96, 0xF9, 0xCA, 0x87, 0x7A, + 0xEE, 0xD9, 0x15, 0x5E, 0xDF, 0x5D, 0xBC, 0xC2, + 0x58, 0xE6, 0x04, 0xEE, 0x17, 0xDC, 0xB3, 0xF9, + 0x90, 0xF9, 0x88, 0x32, 0x9E, 0xA1, 0xDB, 0x1C, + 0x38, 0x56, 0x53, 0x90, 0x30, 0x69, 0x2E, 0x52, + 0x00, 0x2C, 0xF3, 0x0F, 0xD5, 0x80, 0x2E, 0x02, + 0x5B, 0x99, 0xBF, 0xCD, 0x11, 0x12, 0x64, 0x5B, + 0x56, 0xC6, 0x0A, 0xE6, 0x38, 0xE7, 0x4D, 0x21, + 0xE5, 0x98, 0x78, 0x9D, 0xE6, 0xCB, 0x60, 0xB4, + 0x2E, 0xE4, 0x98, 0x56, 0xCB, 0xAD, 0xE6, 0xDD, + 0x53, 0xF4, 0xC5, 0x67, 0xA2, 0x9F, 0xA0, 0x5C, + 0x7C, 0xFB, 0x24, 0x5A, 0xA7, 0x72, 0xD0, 0xE7, + 0x63, 0xF2, 0x5D, 0xBF, 0xD8, 0xE9, 0xF1, 0x6B, + 0xB4, 0x29, 0xA6, 0x28, 0xE6, 0x93, 0xD3, 0x87, + 0xB6, 0xD9, 0x3C, 0x39, 0x8D, 0xEA, 0x28, 0xC0, + 0x96, 0x3D, 0xF5, 0xC2, 0x3C, 0x29, 0xF2, 0x80, + 0x21, 0x8A, 0x03, 0x9D, 0x64, 0xF8, 0xBA, 0x81, + 0xC1, 0xDD, 0xA2, 0x88, 0x2A, 0x84, 0x2E, 0x3C, + 0xB5, 0x03, 0x95, 0xED, 0xAA, 0x6E, 0xE2, 0x6F, + 0x5E, 0x99, 0x3C, 0x63, 0xEE, 0xB8, 0x4F, 0x66, + 0x32, 0x77, 0x42, 0x23, 0x36, 0x29, 0x89, 0xB0, + 0xED, 0x5F, 0xF2, 0x5A, 0x65, 0x66, 0x3F, 0xD2, + 0x8B, 0x48, 0x68, 0x65, 0xDC, 0xE0, 0xB0, 0xC2, + 0x72, 0x73, 0xF1, 0xA4, 0xC6, 0x56, 0x2C, 0x5D, + 0xD8, 0xC6, 0x5C, 0x41, 0xCE, 0x30, 0x89, 0x59, + 0xA9, 0xD6, 0x45, 0x96, 0xD0, 0x8E, 0x7B, 0x25, + 0xE0, 0x13, 0xFB, 0xFE, 0x7C, 0xEA, 0xF3, 0x67, + 0x0D, 0xB2, 0x9A, 0x21, 0x3C, 0xCE, 0x99, 0x75, + 0xA9, 0x13, 0xCE, 0xF4, 0x23, 0x6E, 0x64, 0x00, + 0x30, 0x87, 0x70, 0x9C, 0xAD, 0x61, 0x81, 0x71, + 0x0E, 0x95, 0x19, 0x26, 0xCA, 0x55, 0x29, 0x71, + 0x99, 0xA6, 0x08, 0xAE, 0x54, 0x58, 0x75, 0xCD, + 0xC3, 0x8F, 0xE3, 0x83, 0xC1, 0x45, 0x62, 0xB4, + 0x8D, 0xCA, 0x66, 0x02, 0xEA, 0x34, 0x05, 0x5D, + 0x98, 0x3F, 0x38, 0xE6, 0x1C, 0xCE, 0x53, 0x1A, + 0xD9, 0x3F, 0x58, 0xEC, 0x16, 0x28, 0x45, 0xF5, + 0x38, 0xCE, 0x48, 0x43, 0x87, 0x1D, 0x3C, 0x4A, + 0xDF, 0x05, 0xF3, 0x5E, 0x29, 0x7E, 0xA6, 0x2E, + 0xFC, 0xDD, 0x5E, 0xF9, 0x40, 0x1B, 0xA0, 0x42, + 0xA2, 0x35, 0x15, 0x0A, 0x09, 0xD9, 0x47, 0x4A, + 0x3F, 0xB0, 0x3A, 0xAA, 0x19, 0xE7, 0xE3, 0x7A, + 0x22, 0x8D, 0x5F, 0x5B, 0x07, 0x41, 0x4C, 0x3D, + 0xA2, 0xAD, 0x2E, 0x5C, 0x75, 0xEC, 0xF0, 0x4C, + 0x11, 0x2B, 0x90, 0x76, 0x9E, 0x19, 0x96, 0x0E, + 0x97, 0x5E, 0x8D, 0x19, 0x17, 0xB3, 0xBF, 0xDA, + 0x84, 0xFD, 0xC6, 0xD2, 0x32, 0x6F, 0xB8, 0xA3, + 0xB0, 0x0F, 0x95, 0xD9, 0xC5, 0x26, 0x50, 0x11, + 0x15, 0x72, 0xBE, 0xC2, 0x1B, 0x12, 0x12, 0x7C, + 0xA5, 0x70, 0xD8, 0xA9, 0x8A, 0xB9, 0x77, 0xEB, + 0xD8, 0xD7, 0x9A, 0x59, 0x37, 0x5E, 0xE1, 0x4F, + 0x64, 0xB5, 0xB0, 0x4F, 0xD9, 0x69, 0xFE, 0xB0, + 0x3D, 0x0A, 0xF7, 0x34, 0x89, 0xE3, 0xBA, 0xEF, + 0xE7, 0xC7, 0xBC, 0x8D, 0xC7, 0xE8, 0x54, 0x83, + 0xEE, 0x62, 0xF0, 0x23, 0x98, 0x58, 0x0F, 0x83, + 0xB9, 0x6D, 0xD8, 0x44, 0x77, 0xB9, 0xC4, 0x8F, + 0x0B, 0xB3, 0x9F, 0x54, 0x06, 0xA3, 0x70, 0x36, + 0xD6, 0xF3, 0x6E, 0x2B, 0x1B, 0x6B, 0x53, 0xFE, + 0x6F, 0xF6, 0x1C, 0x32, 0x7B, 0x29, 0xD4, 0xE0, + 0x5D, 0xD2, 0xB8, 0x11, 0x74, 0xC6, 0x0B, 0x59, + 0xC7, 0x9C, 0xB1, 0x97, 0x6B, 0xC0, 0x6E, 0x7A, + 0xC3, 0x4D, 0xF3, 0xE3, 0x8F, 0x7D, 0x2C, 0x1C, + 0x0E, 0x31, 0x51, 0xB7, 0x14, 0x7A, 0xB8, 0x31, + 0x77, 0x47, 0x70, 0x14, 0x3B, 0x92, 0x7B, 0x5F, + 0xEC, 0x5D, 0xF7, 0x76, 0xC1, 0xD7, 0x2D, 0xB6, + 0xBC, 0x99, 0x81, 0xD6, 0x58, 0x67, 0x71, 0x3C, + 0xF2, 0x97, 0xC8, 0xB0, 0xF1, 0xE9, 0x8D, 0x0E, + 0x16, 0xF0, 0xCC, 0x22, 0x7A, 0x39, 0xE4, 0x7E, + 0x50, 0xBA, 0x01, 0x16, 0x15, 0x6D, 0x5B, 0x54, + 0x67, 0x53, 0x66, 0x04, 0xBE, 0x05, 0xCC, 0x2E, + 0xF4, 0x0A, 0xBC, 0xE8, 0x52, 0xF1, 0x5D, 0xFA, + 0x2C, 0xAC, 0xF8, 0x6A, 0x78, 0x9E, 0x5B, 0x7B, + 0x0E, 0x5B, 0xB4, 0xB7, 0x77, 0xCD, 0x7C, 0xC9, + 0xF6, 0x54, 0x77, 0x9B, 0x10, 0x2F, 0x78, 0xB5, + 0xAA, 0x4B, 0x94, 0xC3, 0xB4, 0xFD, 0xE5, 0x5F, + 0xA7, 0xF7, 0xBF, 0x54, 0xAC, 0x22, 0x5E, 0x1F, + 0x26, 0x16, 0x5B, 0x65, 0xF1, 0x6D, 0x03, 0x21, + 0x66, 0x9F, 0xD9, 0xF6, 0xE4, 0x7F, 0xCA, 0x1D, + 0xD3, 0x47, 0x09, 0x6D, 0xF5, 0xDD, 0xA8, 0x64, + 0x66, 0xA5, 0x7C, 0x5B, 0x06, 0x8D, 0x9C, 0x67, + 0xB7, 0x32, 0x03, 0x66, 0xEA, 0x19, 0xC8, 0x99, + 0x3F, 0xF9, 0x0B, 0xD8, 0xFB, 0x06, 0x93, 0xFB, + 0xA3, 0x70, 0xE6, 0x6D, 0x2B, 0x20, 0x3B, 0x99, + 0x70, 0x11, 0xB0, 0xD1, 0x5B, 0x94, 0xE2, 0x8B, + 0xAA, 0x2E, 0xBF, 0x01, 0x77, 0x4F, 0x7A, 0xE7, + 0x8F, 0x84, 0xED, 0xBD, 0xAD, 0x9F, 0x65, 0xA4, + 0x50, 0x42, 0x7A, 0x47, 0x74, 0xC6, 0x0C, 0xC8, + 0x9A, 0x02, 0x0B, 0x37, 0xDA, 0x21, 0xC7, 0x91, + 0xDA, 0xC8, 0xF7, 0xA7, 0x45, 0x7E, 0x30, 0xD0, + 0x8B, 0x01, 0x37, 0x51, 0x60, 0x03, 0x9C, 0x30, + 0x1B, 0x60, 0x51, 0xA9, 0x65, 0xE8, 0xA7, 0xCC, + 0xA2, 0xAE, 0xF9, 0x3B, 0xD5, 0x2F, 0x82, 0xC0, + 0x20, 0xBE, 0xCE, 0x90, 0xA1, 0x29, 0x02, 0x4E, + 0xFE, 0xA4, 0xB2, 0xFA, 0x21, 0x27, 0x0F, 0x8E, + 0xB5, 0xED, 0x6A, 0xAA, 0xE5, 0x59, 0x29, 0xAA, + 0xC5, 0x99, 0xA5, 0x77, 0x97, 0x29, 0x57, 0x66, + 0x0C, 0xC4, 0x7A, 0xC4, 0xE3, 0xCE, 0x77, 0x2B, + 0xBF, 0x10, 0x05, 0x2D, 0xE7, 0xED, 0xB1, 0xB8, + 0xA4, 0x49, 0x41, 0xF8, 0x84, 0xC9, 0xF8, 0xBE, + 0x13, 0x17, 0x46, 0x69, 0x94, 0x56, 0x29, 0xF4, + 0x6D, 0xE2, 0x46, 0x74, 0x44, 0xF3, 0x10, 0x6A, + 0x73, 0xFA, 0x27, 0x9C, 0xF0, 0x2A, 0x80, 0x0A, + 0x04, 0x7E, 0x20, 0xBD, 0x4D, 0x82, 0x0B, 0x38, + 0x9C, 0x3B, 0xB6, 0xA8, 0x68, 0xA5, 0x38, 0x4C, + 0xF5, 0x72, 0x4C, 0x20, 0x4C, 0xEF, 0xB1, 0xA6, + 0xA1, 0xBE, 0xB9, 0x72, 0x3E, 0x36, 0xDD, 0xDD, + 0xD9, 0xC7, 0x07, 0xC8, 0xF6, 0x3E, 0x8B, 0xC2, + 0x66, 0x83, 0xCC, 0x8B, 0x43, 0xC7, 0xDF, 0xDA, + 0xA4, 0x08, 0xAC, 0x4D, 0xD2, 0xBA, 0x9A, 0xEC, + 0xBC, 0x3B, 0x6D, 0xDA, 0xED, 0xCE, 0x09, 0x4A, + 0xAB, 0x58, 0xFF, 0x73, 0x2B, 0x19, 0x66, 0x38, + 0xD8, 0xB8, 0xEF, 0xC4, 0x28, 0xBB, 0xA9, 0x61, + 0x57, 0x93, 0xC4, 0xDD, 0x9F, 0x00, 0xF9, 0x0D, + 0x62, 0xC6, 0x76, 0xD1, 0x27, 0xA0, 0xE1, 0x8C, + 0x14, 0xC6, 0xEE, 0x9C, 0x99, 0x05, 0x10, 0xB0, + 0x54, 0xAD, 0xB4, 0xB4, 0x17, 0x0A, 0xC7, 0x12, + 0x7F, 0x93, 0x17, 0x5C, 0x1E, 0xB2, 0x25, 0x12 + }; + static const byte msg_87[] = { + 0x14, 0x42, 0x63, 0x34, 0x94, 0x09, 0x60, 0x77, + 0x3B, 0xFF, 0x65, 0xF0, 0x8D, 0x1D, 0xE4, 0x89, + 0xC4, 0xC3, 0xED, 0x36 + }; + static const byte sig_87[] = { + 0x13, 0xE8, 0x99, 0xEE, 0xDC, 0xCC, 0x0F, 0xBA, + 0x62, 0x91, 0x44, 0xE4, 0xAC, 0x06, 0x79, 0x06, + 0xB5, 0x32, 0x6B, 0x8F, 0x9A, 0x6C, 0xCB, 0xAB, + 0xE1, 0x44, 0x4A, 0xDD, 0x46, 0x45, 0x16, 0x0D, + 0x22, 0x57, 0x82, 0x87, 0x10, 0xD1, 0xEE, 0x10, + 0x60, 0x21, 0xB5, 0x64, 0x1E, 0x78, 0x81, 0x55, + 0x75, 0xD4, 0xF0, 0x95, 0xD0, 0x15, 0xD8, 0x46, + 0x5C, 0x92, 0xD2, 0xDD, 0xF4, 0xAB, 0xDF, 0xBE, + 0xB1, 0x1E, 0xE5, 0xE0, 0x70, 0xE6, 0xDA, 0x52, + 0xE5, 0x48, 0xDC, 0x04, 0xFD, 0xEF, 0x54, 0x72, + 0xE7, 0xE5, 0xF1, 0x82, 0x10, 0xAA, 0xCB, 0xA0, + 0x4F, 0x4F, 0x18, 0xAE, 0x66, 0x86, 0xB9, 0xAF, + 0x96, 0x57, 0xE3, 0x8E, 0x3B, 0x9B, 0xDD, 0xB4, + 0xAA, 0x84, 0xE6, 0x7B, 0x4D, 0x81, 0x92, 0xD0, + 0x03, 0x87, 0x3D, 0xD3, 0xEE, 0xE7, 0x47, 0x00, + 0xFB, 0xD8, 0x1E, 0x38, 0x1C, 0x21, 0x98, 0xB7, + 0xCC, 0xC1, 0x37, 0xC1, 0x71, 0xB2, 0x2F, 0x93, + 0x53, 0x41, 0x9C, 0x48, 0xC1, 0x4B, 0x8D, 0x63, + 0x0F, 0x99, 0x63, 0x40, 0x27, 0x5F, 0x6E, 0x60, + 0x4B, 0x95, 0xC4, 0x35, 0x20, 0x8A, 0xED, 0x2B, + 0xCA, 0x1B, 0x41, 0x9F, 0x83, 0x63, 0xF0, 0x95, + 0x0E, 0x24, 0x0D, 0x6F, 0x9E, 0xAB, 0x11, 0x8E, + 0x4B, 0xD3, 0xDA, 0x0E, 0xC3, 0xA2, 0xBE, 0x26, + 0xA8, 0xA0, 0x98, 0x57, 0x71, 0x3C, 0x36, 0xDD, + 0x69, 0xC3, 0x4E, 0xDD, 0x2C, 0x61, 0x9E, 0x88, + 0x26, 0x70, 0x71, 0xCF, 0x9E, 0xE5, 0xA6, 0x0C, + 0xA3, 0x14, 0x2D, 0xF1, 0x63, 0xF0, 0x1D, 0x8D, + 0x79, 0x6A, 0xC8, 0x50, 0xCF, 0xF3, 0x66, 0x60, + 0x78, 0xB3, 0x18, 0xFB, 0x5B, 0xD1, 0x73, 0x60, + 0xC8, 0x76, 0xC9, 0xC9, 0x0D, 0x8A, 0x7F, 0x41, + 0x2C, 0x8A, 0x31, 0x61, 0x6B, 0xE7, 0xA3, 0x74, + 0x58, 0x71, 0x54, 0x84, 0x86, 0x71, 0x5C, 0x94, + 0x26, 0x3A, 0x17, 0xB3, 0x6C, 0xA4, 0x99, 0x25, + 0x45, 0x0C, 0x57, 0x8A, 0xD9, 0xD4, 0xB1, 0xC2, + 0x00, 0x43, 0xF4, 0x5E, 0x84, 0x31, 0x99, 0x4F, + 0xA6, 0xD2, 0x6A, 0x14, 0x1B, 0xAD, 0x9E, 0x49, + 0x6E, 0x00, 0x9E, 0x91, 0x46, 0x16, 0xCA, 0x57, + 0x0C, 0x09, 0xF6, 0x38, 0xD0, 0x62, 0xBE, 0xC6, + 0x87, 0x33, 0x3A, 0xC7, 0x28, 0x38, 0x34, 0x53, + 0x7E, 0xFB, 0x60, 0x42, 0xF3, 0x7D, 0x83, 0xF7, + 0x29, 0x5D, 0xEA, 0x30, 0xD5, 0x00, 0x90, 0xB6, + 0x38, 0x4C, 0x17, 0x29, 0xEF, 0x17, 0xA0, 0xD5, + 0x87, 0x50, 0xC0, 0x03, 0x75, 0x14, 0xE5, 0xE1, + 0x22, 0x78, 0x53, 0xBC, 0x5A, 0xA3, 0x1E, 0x95, + 0xBE, 0xEC, 0x37, 0xB1, 0x51, 0x82, 0x69, 0x26, + 0x2E, 0xA3, 0x5A, 0xDA, 0x4F, 0xDA, 0x77, 0x62, + 0x7E, 0xED, 0xDA, 0xAF, 0x57, 0x97, 0x1B, 0xA3, + 0x6D, 0x46, 0x7B, 0x19, 0xA9, 0x0B, 0x99, 0x1C, + 0xD2, 0x55, 0xDB, 0x79, 0xB0, 0x15, 0x48, 0x86, + 0x52, 0x30, 0x31, 0xD6, 0xC5, 0xB1, 0xAE, 0x8F, + 0xCF, 0x9A, 0x43, 0x10, 0xBB, 0xC8, 0x19, 0x74, + 0x84, 0xB2, 0x92, 0x3B, 0xFE, 0x0B, 0x12, 0x15, + 0xA1, 0xC4, 0xD8, 0xC6, 0x83, 0x90, 0x89, 0x8A, + 0xD5, 0x3E, 0x33, 0x69, 0xB7, 0x05, 0x3F, 0xB1, + 0x8B, 0x0D, 0x87, 0x40, 0x70, 0x90, 0x2A, 0x5D, + 0x3B, 0x3D, 0x91, 0xD8, 0x1D, 0x4D, 0xF1, 0x08, + 0x7E, 0xF7, 0xDC, 0x05, 0x84, 0xEB, 0xDC, 0x63, + 0xD7, 0xBA, 0x3C, 0x0D, 0x31, 0xF8, 0x6D, 0xA6, + 0xC0, 0xFD, 0x08, 0x11, 0x5C, 0x53, 0xF6, 0xAE, + 0xFE, 0xC0, 0x82, 0x9A, 0x68, 0xD2, 0xA3, 0x44, + 0x2E, 0xEE, 0x47, 0x36, 0x70, 0x2D, 0x66, 0x81, + 0x0D, 0x62, 0x30, 0x8A, 0x8C, 0xC8, 0x2A, 0xA6, + 0x21, 0x82, 0xF5, 0x98, 0xF4, 0x4E, 0x25, 0x37, + 0x11, 0xB5, 0xD6, 0x07, 0x88, 0xBD, 0x0D, 0x69, + 0x0E, 0xF9, 0x8F, 0x9A, 0xD5, 0x93, 0xE0, 0x3C, + 0xEF, 0x38, 0xB9, 0xC9, 0x77, 0x98, 0x3F, 0x69, + 0x11, 0xBA, 0x1A, 0xB9, 0xF7, 0x35, 0xE9, 0x28, + 0xCD, 0xA3, 0x8C, 0x03, 0xE6, 0xAD, 0x83, 0x62, + 0xF4, 0x60, 0xAE, 0x4C, 0xD0, 0xF4, 0x6E, 0x00, + 0xEE, 0xEC, 0x74, 0xB6, 0x12, 0x34, 0x98, 0xAB, + 0x31, 0xE7, 0xA7, 0x9D, 0x33, 0x4D, 0x72, 0xA7, + 0xA7, 0xEE, 0xF3, 0xB5, 0x51, 0xE7, 0x8D, 0x31, + 0xBC, 0x2C, 0xAF, 0xFB, 0x13, 0x9C, 0xAC, 0xA4, + 0xD7, 0x9C, 0x8B, 0xBD, 0x52, 0xBD, 0x78, 0xF4, + 0x90, 0x65, 0x09, 0xBE, 0x42, 0xE7, 0x76, 0x3A, + 0xE6, 0xAC, 0xB8, 0x98, 0x28, 0x5E, 0xC9, 0x32, + 0x3E, 0x68, 0x67, 0x6A, 0x8C, 0xC7, 0x4A, 0x58, + 0xC8, 0xDA, 0x8B, 0xE9, 0x11, 0xED, 0x6F, 0x51, + 0x3B, 0x66, 0x08, 0x70, 0x73, 0x10, 0xFB, 0x45, + 0xCB, 0xD9, 0x7D, 0x5F, 0xF0, 0xD2, 0xAB, 0xA3, + 0x6F, 0xCE, 0xF7, 0x3D, 0x46, 0xCB, 0x7F, 0x01, + 0xC2, 0xCF, 0xE3, 0x8E, 0x68, 0xE8, 0x4F, 0x4A, + 0x30, 0x19, 0x16, 0xD2, 0xF5, 0x10, 0xD8, 0x2B, + 0x49, 0x69, 0xBE, 0x7A, 0x0E, 0x9C, 0xC6, 0x0E, + 0xFF, 0x5C, 0x0A, 0x87, 0x17, 0xB8, 0x22, 0x83, + 0x8C, 0x77, 0xAF, 0x42, 0x06, 0xB1, 0x25, 0x45, + 0x08, 0x9B, 0xB2, 0xDD, 0x6A, 0x3F, 0xF0, 0x12, + 0xC8, 0x64, 0x15, 0xBB, 0xA0, 0x4F, 0xD7, 0xD4, + 0xEC, 0x70, 0x7A, 0xF3, 0xB1, 0x7F, 0x25, 0x57, + 0x47, 0x66, 0xF1, 0xE9, 0x27, 0x38, 0xE0, 0x62, + 0x10, 0xF4, 0x8A, 0x5E, 0xF2, 0x55, 0x0E, 0xBD, + 0xF8, 0x5A, 0x5C, 0xA3, 0x44, 0x97, 0xCF, 0x1D, + 0x4D, 0x3A, 0x75, 0x86, 0x48, 0xEC, 0x41, 0x17, + 0x24, 0x43, 0x83, 0x5E, 0x50, 0x91, 0xBE, 0x8F, + 0x04, 0x78, 0x23, 0xD9, 0x62, 0x0C, 0x2A, 0xD5, + 0x1C, 0x96, 0x11, 0xAA, 0xEE, 0x39, 0xB2, 0x1E, + 0x6D, 0x6A, 0xEC, 0x87, 0x0C, 0x89, 0x15, 0xE2, + 0x66, 0x47, 0x6A, 0x50, 0xEE, 0xCA, 0x59, 0x96, + 0x22, 0xF7, 0x09, 0x1A, 0x34, 0xC2, 0x3F, 0x14, + 0xB4, 0x04, 0x29, 0xD9, 0x5E, 0x3E, 0xF9, 0x8F, + 0xED, 0x3E, 0x74, 0x94, 0x37, 0xF0, 0x4B, 0xB4, + 0xA3, 0x37, 0x52, 0x2E, 0x68, 0x09, 0xFC, 0x10, + 0x45, 0x03, 0xE2, 0x53, 0xB4, 0x1C, 0x4F, 0x03, + 0x01, 0xAF, 0x46, 0x7F, 0x74, 0xD3, 0x31, 0x25, + 0xFA, 0x83, 0xEF, 0x71, 0x24, 0x45, 0xA1, 0x71, + 0xFA, 0x40, 0xEB, 0xF4, 0xE6, 0x55, 0x3E, 0x45, + 0x4A, 0xFE, 0x25, 0x68, 0x02, 0x1D, 0x2B, 0x2A, + 0x19, 0x8D, 0xEC, 0x9B, 0xF7, 0x20, 0xF9, 0xD7, + 0x2F, 0x81, 0x52, 0x0B, 0xE8, 0x74, 0x66, 0xAF, + 0x70, 0xD0, 0x0E, 0x0E, 0x86, 0x0F, 0xF9, 0xAB, + 0xD0, 0x39, 0x78, 0xC3, 0xE4, 0x29, 0xB5, 0xAA, + 0x17, 0xB9, 0x7F, 0x9A, 0xE9, 0x34, 0x48, 0x85, + 0x3D, 0x6E, 0xFD, 0x16, 0x8A, 0x30, 0xC6, 0xCB, + 0xE8, 0xDE, 0x2D, 0x28, 0x8D, 0x9A, 0x24, 0xEA, + 0x5D, 0x2A, 0x58, 0x23, 0x33, 0x2B, 0x84, 0xFD, + 0x2C, 0xE7, 0x93, 0xA2, 0x2B, 0xEC, 0x43, 0x98, + 0x48, 0xD4, 0xE6, 0x0F, 0x3B, 0xB9, 0xC7, 0x5D, + 0x7E, 0xB0, 0x87, 0x1E, 0x80, 0x3D, 0x61, 0xB0, + 0x7E, 0x74, 0x9E, 0xD7, 0x60, 0x72, 0xB2, 0x7C, + 0x87, 0xB6, 0x9D, 0x6C, 0x01, 0x42, 0x61, 0xF6, + 0x47, 0xAF, 0xA8, 0x8C, 0x4F, 0x1E, 0xC5, 0x5A, + 0x75, 0xA5, 0x0F, 0xB4, 0xC7, 0x9D, 0x2C, 0x94, + 0xC0, 0x50, 0x3D, 0xB2, 0x0D, 0xFD, 0xF7, 0x1F, + 0x62, 0x88, 0x74, 0x18, 0x8C, 0xDD, 0x73, 0x85, + 0xC0, 0x33, 0x81, 0xDA, 0xBB, 0x85, 0x4D, 0x4A, + 0xA9, 0xF4, 0x7B, 0x66, 0x43, 0x8C, 0x43, 0xFF, + 0x53, 0xEF, 0x5E, 0x78, 0xAB, 0x45, 0x0B, 0x45, + 0x01, 0x91, 0x27, 0x8A, 0xF6, 0xE2, 0x6A, 0x7B, + 0x5E, 0x64, 0x61, 0xF5, 0x77, 0xF9, 0x85, 0x2F, + 0x81, 0xC9, 0x02, 0x03, 0xC7, 0x13, 0xF5, 0xB1, + 0xF6, 0xC3, 0xEF, 0x55, 0x8C, 0x90, 0x32, 0x51, + 0x6D, 0x8D, 0x62, 0xFD, 0x5E, 0x24, 0xE4, 0xF0, + 0xF5, 0x07, 0x18, 0xF5, 0x6B, 0x5A, 0x59, 0xA0, + 0x09, 0xD5, 0x93, 0x8D, 0xAD, 0x55, 0x91, 0xF6, + 0x1F, 0x4C, 0x65, 0x9A, 0x76, 0x05, 0x26, 0xEF, + 0x41, 0x20, 0x2F, 0xA7, 0xE5, 0xF6, 0xC7, 0xD5, + 0xE0, 0xB0, 0xC0, 0xC4, 0x3B, 0x52, 0x4B, 0x66, + 0x71, 0x2C, 0x5A, 0x7C, 0x53, 0xC8, 0x4C, 0x50, + 0xB8, 0x3E, 0xB9, 0xC9, 0x8D, 0x2F, 0xD0, 0x84, + 0xC9, 0xC5, 0xF2, 0x1F, 0xEE, 0x77, 0x42, 0xE6, + 0xEF, 0xC8, 0xCB, 0xBE, 0x57, 0x18, 0xB7, 0x0C, + 0x06, 0x2D, 0x82, 0xE2, 0xF9, 0x86, 0xF3, 0x8D, + 0xF1, 0xE7, 0x15, 0x89, 0xDC, 0x79, 0x87, 0x24, + 0x35, 0x62, 0xA2, 0x31, 0x9D, 0x7C, 0x00, 0xB2, + 0x6E, 0x53, 0x1E, 0x93, 0xC3, 0x84, 0x44, 0x61, + 0x8C, 0xE7, 0x58, 0x73, 0x4F, 0xDE, 0xCF, 0xD0, + 0xC6, 0x85, 0x37, 0x28, 0xC6, 0x10, 0x00, 0x78, + 0x4E, 0xDF, 0xFE, 0xD7, 0xB3, 0x30, 0x86, 0xE1, + 0x68, 0xD6, 0xCB, 0x63, 0xE3, 0xDA, 0xCA, 0xF3, + 0x55, 0x2F, 0x88, 0x5B, 0x47, 0x82, 0x62, 0xDE, + 0x5E, 0x1E, 0x63, 0xCE, 0x7A, 0x4C, 0x66, 0x95, + 0xD1, 0x19, 0x38, 0x35, 0xE4, 0x5A, 0x67, 0x91, + 0x8C, 0x42, 0xD3, 0x9B, 0xF8, 0x80, 0x38, 0x53, + 0x30, 0x31, 0x0F, 0x2C, 0x7B, 0xF9, 0x1E, 0x6C, + 0x3E, 0x29, 0xB7, 0x81, 0xD0, 0x98, 0x70, 0xC2, + 0x6D, 0x76, 0xBD, 0x8A, 0xE2, 0x09, 0xC4, 0x2B, + 0xC7, 0x43, 0x2D, 0xBB, 0x4C, 0x16, 0x52, 0x63, + 0x57, 0xA5, 0x63, 0x4E, 0xEC, 0xDE, 0x93, 0xC5, + 0x1D, 0xD4, 0xD6, 0xF0, 0x06, 0x5B, 0x2E, 0xC5, + 0x7A, 0xD3, 0xB5, 0x82, 0x66, 0x53, 0x95, 0x97, + 0xC8, 0xF4, 0x2B, 0x55, 0x27, 0x1D, 0x6F, 0x90, + 0xE9, 0x86, 0xF6, 0x82, 0x8D, 0x95, 0x9E, 0xE8, + 0x00, 0xDB, 0xEB, 0xCF, 0x48, 0x23, 0x6B, 0xA3, + 0xDE, 0x25, 0x27, 0xE0, 0xEC, 0xA4, 0xA3, 0xC2, + 0xA3, 0x4B, 0xBC, 0xDD, 0x6C, 0xBB, 0x3A, 0x9C, + 0x96, 0xDC, 0x3B, 0xE1, 0x10, 0xD3, 0x49, 0x94, + 0x66, 0xE2, 0x85, 0x7F, 0xBA, 0x98, 0x12, 0x3A, + 0x6D, 0xBA, 0x90, 0x14, 0x87, 0x7E, 0x24, 0xEA, + 0xDC, 0xCA, 0x40, 0xF8, 0xAE, 0x94, 0xB2, 0xFE, + 0xD2, 0x36, 0xCB, 0xE5, 0xBC, 0xA9, 0xDF, 0xE0, + 0xCB, 0xA9, 0xA0, 0xF8, 0x62, 0x41, 0x33, 0x18, + 0x59, 0xF9, 0xD6, 0xC0, 0x87, 0xB2, 0x76, 0xDE, + 0xC9, 0x35, 0x6F, 0x1F, 0xEF, 0x69, 0xB3, 0x59, + 0xF9, 0xFB, 0x38, 0x4A, 0x84, 0x02, 0x2D, 0xEC, + 0xB7, 0x01, 0x08, 0xDA, 0xC8, 0xE9, 0x3B, 0xB6, + 0xC3, 0x00, 0xC0, 0x34, 0x5F, 0xC6, 0x40, 0xC0, + 0x06, 0xEA, 0xEB, 0xC1, 0x51, 0x13, 0x81, 0x2F, + 0xB3, 0x7D, 0xD9, 0x6E, 0x2A, 0x06, 0xA4, 0x63, + 0xAF, 0xCE, 0x66, 0xC5, 0x9F, 0x8D, 0x71, 0x4A, + 0xA1, 0xFF, 0x49, 0x4F, 0x08, 0x6F, 0xB9, 0xEA, + 0xDA, 0x18, 0x45, 0x63, 0xCA, 0x9D, 0x88, 0x08, + 0xB1, 0x6C, 0x19, 0xA8, 0x24, 0xAD, 0x85, 0x7D, + 0xDE, 0x51, 0xE5, 0x08, 0xB7, 0x04, 0x12, 0x35, + 0xF3, 0x00, 0xED, 0x2C, 0x79, 0x9C, 0x18, 0x23, + 0x05, 0x38, 0x95, 0x76, 0xCF, 0x39, 0x3C, 0xAE, + 0xB0, 0xD3, 0xBA, 0x3E, 0x4E, 0xE4, 0xB5, 0x77, + 0xA3, 0xE3, 0x7B, 0x27, 0x5F, 0xD8, 0x05, 0x19, + 0x42, 0xAE, 0x91, 0x54, 0xE5, 0xBD, 0x7C, 0x35, + 0xE0, 0xF8, 0x95, 0x52, 0x3A, 0x29, 0xB0, 0xE6, + 0xB7, 0xAE, 0x20, 0xBE, 0x21, 0xDF, 0xF5, 0x67, + 0xEC, 0x82, 0x52, 0xFF, 0x5B, 0xD0, 0xAA, 0x14, + 0x50, 0x15, 0xE1, 0x1C, 0x6A, 0x1B, 0x94, 0x1B, + 0xCC, 0x76, 0x01, 0xBF, 0x03, 0x94, 0x42, 0xF2, + 0x00, 0x61, 0x96, 0x58, 0xD9, 0xD0, 0x40, 0x21, + 0xFA, 0xCE, 0x6B, 0xAB, 0x5D, 0x49, 0xD8, 0xD7, + 0xBC, 0x9A, 0x66, 0xC2, 0xBA, 0x3F, 0xDC, 0x49, + 0x0D, 0xA5, 0x5C, 0xB4, 0x67, 0x08, 0x38, 0xEB, + 0x2D, 0x07, 0x24, 0x5B, 0xB1, 0x22, 0x7B, 0x02, + 0x4A, 0x8A, 0x53, 0x38, 0xE9, 0x42, 0x8E, 0xA5, + 0x57, 0x41, 0xD6, 0x71, 0xA7, 0x9D, 0x6A, 0x14, + 0xD2, 0x7D, 0x13, 0xFB, 0x59, 0xD0, 0xDA, 0xE5, + 0x23, 0x9E, 0x1B, 0xC4, 0x21, 0x87, 0xBB, 0x78, + 0xE0, 0x38, 0x01, 0x1D, 0xA0, 0xD1, 0x36, 0x3F, + 0xD0, 0xA7, 0x8F, 0x86, 0x26, 0x1E, 0xB0, 0x26, + 0xDE, 0x7E, 0x17, 0x3A, 0x90, 0xFC, 0xC0, 0x17, + 0xDD, 0x78, 0xF5, 0xA3, 0x2D, 0x3E, 0x29, 0xCE, + 0x38, 0x45, 0x76, 0xA9, 0x55, 0x11, 0xB6, 0xB4, + 0xE5, 0x6E, 0xDD, 0x01, 0x4B, 0x16, 0x07, 0x99, + 0xBD, 0x19, 0x77, 0xF5, 0xD7, 0x9E, 0x39, 0x9E, + 0xAA, 0x8E, 0x2B, 0x75, 0xC5, 0xEB, 0x33, 0x56, + 0x6C, 0xD8, 0xB6, 0x3F, 0x3F, 0x4E, 0x81, 0x7E, + 0x29, 0x0A, 0x68, 0xED, 0x1E, 0x9F, 0xDC, 0x6B, + 0xFA, 0x18, 0xE3, 0xE5, 0x7D, 0x05, 0x7F, 0x22, + 0xFA, 0xA2, 0xF6, 0x0F, 0xB6, 0x34, 0x56, 0x72, + 0x55, 0x16, 0x5E, 0xF4, 0x18, 0xD1, 0x82, 0xFA, + 0xDD, 0xF7, 0xB8, 0x9F, 0x7D, 0x30, 0x10, 0x69, + 0xC4, 0x85, 0xD8, 0xE8, 0x34, 0x89, 0xD4, 0x93, + 0xBE, 0x56, 0xEE, 0xDC, 0x43, 0xD4, 0x82, 0x00, + 0xFD, 0x1E, 0x2B, 0x06, 0x69, 0x07, 0x1B, 0xBF, + 0x33, 0x61, 0x39, 0x28, 0xCA, 0x31, 0x91, 0x0B, + 0xF2, 0xEA, 0x32, 0x8E, 0xA8, 0x64, 0x13, 0x9A, + 0xEF, 0x79, 0x1A, 0x9A, 0xBE, 0x52, 0x13, 0x32, + 0x49, 0x93, 0x7D, 0xA8, 0x8C, 0x48, 0xD4, 0xC0, + 0x1D, 0x10, 0x8A, 0x46, 0x85, 0xAD, 0x29, 0xDF, + 0x2E, 0xCD, 0x41, 0x83, 0x82, 0x01, 0x28, 0x44, + 0x0E, 0xE5, 0x37, 0x8D, 0x6B, 0xCA, 0x61, 0x98, + 0xDE, 0x89, 0xA9, 0x7B, 0xBB, 0x44, 0x48, 0xA2, + 0x8D, 0x82, 0x3A, 0x57, 0x40, 0x60, 0x7C, 0x6E, + 0x69, 0x98, 0x98, 0x93, 0xFA, 0x7E, 0x29, 0x9A, + 0x74, 0x53, 0xD8, 0xDC, 0xB3, 0x4B, 0xDB, 0x7E, + 0xFE, 0x95, 0xB0, 0xC7, 0x23, 0x14, 0xEF, 0xCB, + 0x49, 0x3C, 0x09, 0xD7, 0x7B, 0xD0, 0x11, 0x9B, + 0xAC, 0xF2, 0xC2, 0x2E, 0x7C, 0xCB, 0xCD, 0x59, + 0x7F, 0x6A, 0x09, 0xFE, 0xFE, 0xDF, 0xA0, 0xA7, + 0xAC, 0x3C, 0x90, 0xBA, 0x75, 0x19, 0xF4, 0x01, + 0x60, 0x56, 0xD5, 0xFB, 0x41, 0x2B, 0xA0, 0x2D, + 0x0D, 0x45, 0xCF, 0xF3, 0xA6, 0x3D, 0x36, 0xEE, + 0xE1, 0xE4, 0x68, 0xE6, 0xEA, 0x2F, 0x67, 0x3A, + 0x7A, 0x02, 0x92, 0x6B, 0xB3, 0x18, 0xBA, 0x73, + 0xEE, 0x1B, 0x2C, 0x13, 0x7D, 0xEF, 0x4A, 0x39, + 0xE8, 0x03, 0xFF, 0x57, 0x35, 0x53, 0xE9, 0xA5, + 0xC6, 0xAA, 0x1A, 0x17, 0x21, 0xCA, 0x54, 0x38, + 0x7C, 0xB1, 0xDF, 0xB8, 0xFA, 0x7D, 0xA7, 0x26, + 0xB2, 0xAE, 0x7A, 0x05, 0x45, 0x3B, 0x40, 0x0A, + 0x19, 0xE5, 0x32, 0x52, 0x78, 0x9D, 0xC3, 0x20, + 0x63, 0x24, 0xB2, 0x58, 0x4B, 0x86, 0x1F, 0x00, + 0xA2, 0x50, 0xF9, 0x9F, 0xD9, 0xDC, 0x7D, 0x51, + 0x3D, 0xD7, 0xA6, 0x5A, 0x04, 0x03, 0x4E, 0xB3, + 0x3D, 0x2D, 0x56, 0xA4, 0x96, 0xB3, 0x6A, 0xBA, + 0x0A, 0x30, 0x08, 0xE3, 0x0F, 0xC1, 0x38, 0x24, + 0x88, 0x5D, 0x9E, 0x6F, 0x68, 0x1A, 0x7D, 0xB6, + 0x2D, 0xDD, 0xE3, 0x50, 0x1B, 0xD4, 0x07, 0x75, + 0xE2, 0xE2, 0xCC, 0x09, 0xCC, 0x8E, 0x4E, 0x67, + 0x02, 0x72, 0x02, 0xA8, 0x11, 0x70, 0xA5, 0x7F, + 0x4A, 0xC1, 0x98, 0xC1, 0x7F, 0xBF, 0x95, 0xBB, + 0xCE, 0xD3, 0x6D, 0x49, 0x30, 0xB9, 0x50, 0x8C, + 0xFA, 0x3E, 0x8B, 0xF6, 0xE5, 0x54, 0xE9, 0x1B, + 0xD7, 0xD6, 0xE5, 0x32, 0x33, 0xBB, 0x91, 0xAD, + 0xC8, 0x15, 0x76, 0x1A, 0x04, 0x35, 0xDE, 0xCC, + 0xE1, 0x67, 0x26, 0x4C, 0x2F, 0x4E, 0x34, 0x34, + 0x3D, 0x1E, 0x5A, 0xF7, 0xBC, 0xE6, 0x0C, 0x9B, + 0x7B, 0x7E, 0xE5, 0xDF, 0x72, 0x9A, 0x0D, 0xDD, + 0x4B, 0xE6, 0x6F, 0x82, 0xFB, 0x5E, 0x2C, 0xC0, + 0x7B, 0x03, 0x85, 0x76, 0x11, 0x0E, 0xFD, 0xC7, + 0xD5, 0x50, 0x26, 0xBE, 0x75, 0x5E, 0xC1, 0xF0, + 0x2E, 0x47, 0x62, 0xD6, 0xF1, 0xDA, 0xDF, 0xF4, + 0x1C, 0xEE, 0x63, 0x52, 0xC4, 0x45, 0x37, 0xE6, + 0x85, 0xA5, 0x0A, 0x07, 0x54, 0x63, 0x21, 0x7B, + 0x92, 0xF7, 0x33, 0x0C, 0xD9, 0x29, 0xCF, 0xE3, + 0xAB, 0xB5, 0xFC, 0xAA, 0x26, 0x20, 0x93, 0x55, + 0x8A, 0x07, 0x33, 0xB2, 0x7D, 0x95, 0x02, 0x7A, + 0x76, 0x9E, 0x7D, 0xBB, 0xC1, 0xF3, 0x6E, 0x84, + 0x10, 0x30, 0x4B, 0x5D, 0x59, 0x73, 0x68, 0xEC, + 0x2A, 0x63, 0x2D, 0x46, 0xE8, 0xC2, 0xF8, 0xEA, + 0x2B, 0xC4, 0x4F, 0xA7, 0x6E, 0xF4, 0x74, 0xEB, + 0x96, 0xA3, 0x64, 0x40, 0x9B, 0x23, 0x63, 0x42, + 0x4B, 0x8F, 0x85, 0x00, 0x43, 0x04, 0xAD, 0x61, + 0x76, 0x93, 0xBD, 0xC3, 0x88, 0xC3, 0xFC, 0x29, + 0x61, 0xBD, 0xB1, 0x5A, 0x1F, 0x5B, 0x20, 0xEF, + 0x95, 0xED, 0x99, 0x84, 0x96, 0xB2, 0x93, 0x81, + 0x82, 0xFF, 0xE3, 0xB9, 0x27, 0xEA, 0x9A, 0x23, + 0xF6, 0x42, 0x8D, 0xD3, 0x5C, 0x86, 0x11, 0xC8, + 0x39, 0xE3, 0x16, 0xE9, 0xA5, 0x32, 0x7C, 0xC9, + 0xEA, 0x82, 0x50, 0x9B, 0x21, 0x5C, 0xC9, 0x66, + 0xBE, 0x1C, 0x78, 0x48, 0xEF, 0x39, 0x2D, 0xA1, + 0xC6, 0xF3, 0x69, 0xA3, 0x36, 0x25, 0x3A, 0xA1, + 0x15, 0x2B, 0x6D, 0xCF, 0xDA, 0xA7, 0xCA, 0xDD, + 0x4D, 0x9A, 0x1D, 0x58, 0x9F, 0x73, 0xD3, 0xEF, + 0x0F, 0xBF, 0x03, 0x88, 0x2F, 0xDE, 0xB9, 0x44, + 0xB5, 0xB6, 0xCF, 0xE2, 0x6F, 0x6A, 0xB5, 0x12, + 0x38, 0x29, 0x55, 0x8C, 0x4C, 0x73, 0x6F, 0x0B, + 0x68, 0x7A, 0xC7, 0x06, 0x83, 0x80, 0xFE, 0x7F, + 0x61, 0xBE, 0x6B, 0x40, 0xE3, 0xF0, 0x4D, 0x7B, + 0x36, 0x82, 0x0F, 0xD8, 0x63, 0x29, 0xB3, 0x10, + 0x9D, 0x02, 0xEC, 0x63, 0x90, 0xEA, 0xFC, 0x8C, + 0xA7, 0x30, 0x56, 0x2B, 0x68, 0x08, 0x24, 0x24, + 0xFD, 0xA9, 0x8D, 0x0B, 0x64, 0xBC, 0x97, 0x34, + 0xB4, 0x0B, 0x63, 0xF7, 0xE3, 0x7A, 0xF6, 0x89, + 0x0A, 0xF7, 0xC2, 0xD9, 0x2F, 0x79, 0xEE, 0xA3, + 0xCC, 0xEA, 0xC6, 0x0A, 0x6F, 0x38, 0x06, 0x92, + 0xF8, 0x02, 0xB1, 0x55, 0x6A, 0x78, 0xFE, 0x55, + 0x83, 0xFF, 0x20, 0xA9, 0xC6, 0xA7, 0xBF, 0xCC, + 0x86, 0x3A, 0x9E, 0x7B, 0x62, 0x01, 0x4D, 0x16, + 0x05, 0xDE, 0x89, 0x4F, 0xB5, 0x85, 0xE2, 0xD4, + 0xF9, 0x41, 0x15, 0xE0, 0x29, 0xE5, 0x85, 0x7E, + 0x6A, 0x0A, 0x73, 0x89, 0x27, 0x5F, 0x53, 0x0D, + 0x3D, 0x80, 0xCF, 0xAB, 0x1F, 0x22, 0x5D, 0x38, + 0x33, 0x5D, 0x24, 0x67, 0x91, 0x97, 0xD4, 0x8A, + 0x01, 0x8A, 0x34, 0x18, 0x7D, 0xE3, 0xBC, 0xCE, + 0xDE, 0x94, 0xFF, 0x8E, 0xC5, 0x34, 0xC0, 0x2D, + 0xA7, 0x24, 0xD4, 0x59, 0x8D, 0x66, 0x9E, 0x85, + 0xA9, 0xC6, 0x0E, 0x45, 0x21, 0x4F, 0xAA, 0x65, + 0x44, 0xD6, 0xA4, 0x7D, 0x1C, 0x4E, 0xD7, 0x40, + 0x9D, 0x55, 0xB1, 0xA7, 0xF1, 0x15, 0xAE, 0x15, + 0x44, 0x3A, 0x1C, 0x31, 0x06, 0x40, 0xD1, 0x16, + 0x23, 0x84, 0x93, 0xEF, 0x3E, 0xE2, 0x87, 0x9B, + 0xB8, 0x46, 0x1F, 0x7D, 0x68, 0x73, 0x64, 0x70, + 0xD4, 0xB5, 0x73, 0xAE, 0x45, 0x49, 0x93, 0xF5, + 0x32, 0x30, 0x1E, 0x35, 0xCB, 0x9E, 0xEE, 0xDF, + 0xFE, 0xA8, 0x2F, 0xAC, 0x49, 0x77, 0x53, 0xF7, + 0x50, 0x19, 0xF2, 0xB3, 0xB0, 0x2C, 0x70, 0xB6, + 0x4A, 0x57, 0x95, 0x31, 0xC3, 0x26, 0x07, 0x2A, + 0xCF, 0x1B, 0xD0, 0xAA, 0xA0, 0x9F, 0x0A, 0x97, + 0x8B, 0x78, 0xAB, 0x22, 0xBD, 0x61, 0x19, 0xF8, + 0x8D, 0xD2, 0xD5, 0x72, 0xF8, 0x91, 0x9D, 0x47, + 0x4F, 0x59, 0x1D, 0xAE, 0x9F, 0xCE, 0x47, 0x53, + 0xC9, 0x85, 0xFB, 0x25, 0x04, 0x25, 0xF2, 0x65, + 0x61, 0xFF, 0xA9, 0x44, 0x3F, 0x23, 0x76, 0x68, + 0x9F, 0xEB, 0x48, 0xC4, 0xCE, 0x51, 0x46, 0x04, + 0x52, 0x6A, 0x10, 0x0A, 0xF3, 0x3F, 0x0D, 0x43, + 0x37, 0xD1, 0x60, 0x42, 0x22, 0xC4, 0xD9, 0xF9, + 0x3A, 0x8E, 0x69, 0xE4, 0xCC, 0xD3, 0x66, 0x69, + 0x09, 0x0C, 0x5D, 0xFB, 0x0E, 0x95, 0x49, 0x42, + 0x29, 0xFF, 0x9B, 0x20, 0xCC, 0xB1, 0xAC, 0x81, + 0xB8, 0x1A, 0x36, 0xD6, 0x3A, 0x85, 0x0D, 0xDB, + 0x33, 0x33, 0x4D, 0xAA, 0x51, 0x46, 0xBF, 0x36, + 0xFE, 0x18, 0x80, 0x1E, 0x3B, 0xEB, 0xD0, 0xE9, + 0x1B, 0x5E, 0x1C, 0xFE, 0x7A, 0x98, 0x26, 0x85, + 0x0A, 0xF4, 0x39, 0x7D, 0x1B, 0x07, 0xD3, 0xB7, + 0x19, 0xE5, 0x7B, 0xB8, 0x32, 0xAF, 0x42, 0x34, + 0xC0, 0xCD, 0x9F, 0xD4, 0x0B, 0x88, 0x2F, 0xCE, + 0xDA, 0x93, 0x7E, 0xF9, 0xA2, 0xDA, 0x24, 0x59, + 0x2B, 0xCB, 0x5D, 0x1B, 0xE8, 0x3E, 0xC5, 0xF0, + 0x3D, 0xBD, 0xFB, 0xCB, 0x33, 0x5D, 0x90, 0xD5, + 0xC8, 0xA0, 0x2E, 0xE5, 0x3D, 0x50, 0x8E, 0xB5, + 0xDE, 0x4A, 0x96, 0x1B, 0x95, 0x8F, 0x75, 0x1E, + 0x5F, 0x89, 0xA1, 0xD2, 0x88, 0x95, 0xA3, 0xDB, + 0x7B, 0x62, 0xEF, 0x4A, 0xE1, 0x6D, 0x28, 0xFB, + 0x78, 0x9B, 0x32, 0x03, 0xAD, 0x24, 0x63, 0xD6, + 0xEA, 0xB8, 0x3A, 0x6D, 0x20, 0xCE, 0xA1, 0x31, + 0x4A, 0xE0, 0x2A, 0x3F, 0xF6, 0xF6, 0x53, 0x15, + 0x4A, 0xE1, 0x44, 0x23, 0x81, 0x86, 0x21, 0x47, + 0x41, 0xC2, 0x36, 0x14, 0x81, 0x83, 0xBC, 0x39, + 0xAE, 0xDF, 0x44, 0xDA, 0x97, 0xF7, 0x31, 0xCE, + 0x3D, 0xCB, 0x61, 0xA4, 0xCF, 0xE1, 0x4F, 0x9E, + 0x84, 0xAA, 0x05, 0xAB, 0x1C, 0x1B, 0x95, 0x1D, + 0x20, 0x15, 0x52, 0x33, 0xFA, 0xFA, 0xF1, 0x6C, + 0xF1, 0xBD, 0x0B, 0xAF, 0xE1, 0x99, 0xE6, 0x5D, + 0x56, 0x34, 0x53, 0xBF, 0xE5, 0x5D, 0x5F, 0x47, + 0x4A, 0xB1, 0x05, 0x94, 0xD7, 0x38, 0xA8, 0xC1, + 0x06, 0x28, 0x8D, 0x69, 0xD0, 0x7A, 0x16, 0x88, + 0x60, 0x14, 0x63, 0xF3, 0xBD, 0x21, 0x46, 0x81, + 0x9C, 0x83, 0x72, 0x6D, 0x14, 0xC6, 0xA8, 0x08, + 0x39, 0xB8, 0x79, 0x0B, 0x57, 0x16, 0xE7, 0x72, + 0xF6, 0xC2, 0x4C, 0x2B, 0xEB, 0x7E, 0x2C, 0xF3, + 0x7B, 0x3F, 0x42, 0xAC, 0xDD, 0x47, 0x3E, 0x8C, + 0xCD, 0xBE, 0x48, 0x4D, 0x6E, 0x07, 0xB0, 0x73, + 0xDE, 0xCB, 0x17, 0x4A, 0xC3, 0xB8, 0xBB, 0x2E, + 0xF5, 0x4E, 0x6D, 0xF9, 0xE0, 0x20, 0x71, 0xFA, + 0x60, 0x0A, 0xE5, 0x59, 0x67, 0xEB, 0x6F, 0x70, + 0x2F, 0x71, 0x91, 0x59, 0xF0, 0xEB, 0x06, 0x5C, + 0xC4, 0x60, 0x48, 0xE8, 0x75, 0xE7, 0xCF, 0x42, + 0x71, 0xAD, 0x2E, 0xDA, 0xF9, 0x10, 0x82, 0x9A, + 0xF6, 0x13, 0xBA, 0x89, 0xFC, 0x61, 0x2A, 0x00, + 0xFD, 0xAE, 0x53, 0x7B, 0x09, 0x3A, 0xE8, 0xCB, + 0xE6, 0xB7, 0x0D, 0x03, 0x01, 0xFA, 0x2E, 0x13, + 0xA9, 0x16, 0x38, 0x1C, 0x92, 0xEC, 0xB4, 0x51, + 0xA3, 0x6E, 0x3F, 0xA8, 0xB7, 0x37, 0x36, 0x20, + 0xC0, 0x71, 0xA3, 0x05, 0x34, 0xED, 0xCB, 0x4A, + 0x3F, 0x11, 0x31, 0x17, 0xA5, 0x02, 0xD6, 0xA7, + 0x2D, 0xE6, 0xC7, 0x7B, 0xBB, 0xF6, 0xAE, 0x99, + 0x85, 0x9A, 0xAC, 0xE6, 0x4A, 0x92, 0x8C, 0x37, + 0x4B, 0xD2, 0xC4, 0x65, 0x2A, 0xC9, 0x7E, 0xB7, + 0x44, 0xD2, 0x9A, 0x70, 0xCE, 0xA9, 0xA1, 0x9D, + 0x70, 0x13, 0x49, 0x7B, 0xCA, 0xB6, 0x96, 0x31, + 0x43, 0x3F, 0x9E, 0xD1, 0xFE, 0x20, 0xF8, 0x0B, + 0x59, 0x83, 0xE1, 0x28, 0x8B, 0xB6, 0xA2, 0xBE, + 0x91, 0x54, 0x3E, 0xD4, 0x79, 0x28, 0xBB, 0x5E, + 0x46, 0x2D, 0x01, 0xE9, 0xC0, 0xB7, 0xFF, 0xFA, + 0xC0, 0x6C, 0x10, 0xF1, 0x52, 0xF4, 0x3C, 0x32, + 0x9E, 0x89, 0xDF, 0x8A, 0x79, 0x99, 0x6A, 0x09, + 0x79, 0x8A, 0x36, 0x76, 0x40, 0xBE, 0x9F, 0xB5, + 0x3D, 0xCE, 0x27, 0xBD, 0x0B, 0xAA, 0x9B, 0xF0, + 0x21, 0xBF, 0x10, 0xD2, 0xFC, 0xFE, 0x5B, 0x13, + 0xFD, 0x7D, 0x84, 0xD1, 0xC1, 0xEB, 0xC0, 0xBC, + 0xEC, 0x26, 0xD0, 0x87, 0x80, 0xD1, 0x3B, 0x99, + 0x47, 0x67, 0x26, 0x61, 0xE0, 0xFA, 0x5F, 0xAE, + 0x6F, 0x31, 0x5B, 0x6D, 0xE4, 0x01, 0x68, 0xC2, + 0x35, 0x1D, 0xE3, 0x1F, 0x41, 0xFF, 0x6C, 0x53, + 0x32, 0x26, 0xE1, 0xBC, 0xE3, 0xF8, 0xE2, 0x16, + 0xAF, 0x3B, 0xE6, 0x4C, 0x69, 0x33, 0x72, 0xA0, + 0x66, 0xB1, 0x75, 0xF7, 0x26, 0xCF, 0xCD, 0x64, + 0x2B, 0xAE, 0x98, 0x02, 0x92, 0xC1, 0xCB, 0x65, + 0xE0, 0x1F, 0x07, 0x29, 0x64, 0x0A, 0xB0, 0x09, + 0xCB, 0x98, 0x89, 0x2D, 0x6C, 0xFE, 0x40, 0x03, + 0x34, 0x55, 0xDE, 0xE7, 0x30, 0x33, 0xB6, 0xD5, + 0xE1, 0x9C, 0x59, 0x9F, 0x8A, 0x40, 0x0E, 0xB1, + 0x41, 0x52, 0x7D, 0xF2, 0xBB, 0xDD, 0xEF, 0x50, + 0xBB, 0xD5, 0xFB, 0x55, 0xAA, 0x5E, 0xFD, 0xB3, + 0x5D, 0x08, 0x56, 0x9B, 0x02, 0x97, 0xE2, 0x48, + 0x14, 0x69, 0xF1, 0x7B, 0x87, 0xB5, 0x08, 0x93, + 0x6A, 0x9C, 0x5C, 0x11, 0x08, 0x9A, 0xE9, 0xE4, + 0xB0, 0xCA, 0xC5, 0x74, 0x93, 0x93, 0xC8, 0x03, + 0xE4, 0x70, 0x39, 0xF5, 0x1B, 0x5C, 0xBD, 0x42, + 0xA6, 0xC9, 0xE1, 0x9E, 0xC3, 0xF6, 0x3C, 0x23, + 0x32, 0xE8, 0x77, 0x68, 0xA9, 0x60, 0xFA, 0x02, + 0x18, 0x6B, 0x7A, 0x2B, 0x02, 0x92, 0x65, 0x09, + 0x11, 0x46, 0x73, 0x04, 0x63, 0xDF, 0x8B, 0x37, + 0x5F, 0x24, 0xAA, 0x83, 0xBD, 0xD4, 0x1D, 0x13, + 0x04, 0xFC, 0x2F, 0xB5, 0x2D, 0xA1, 0x0F, 0x1F, + 0xED, 0x65, 0x29, 0x08, 0xCF, 0x8C, 0x52, 0x8F, + 0xB2, 0x62, 0x5F, 0x39, 0x3F, 0xC8, 0xC7, 0xB3, + 0x3F, 0xAD, 0x45, 0xBA, 0xD4, 0x7D, 0x38, 0x3D, + 0x2C, 0x04, 0xCF, 0x32, 0xE8, 0x07, 0x42, 0x5F, + 0x93, 0xD2, 0x35, 0x07, 0x21, 0xB7, 0xB2, 0xF5, + 0x96, 0x64, 0x8E, 0xB5, 0xE1, 0x38, 0x6B, 0x43, + 0xD1, 0x2E, 0xFD, 0xDB, 0x8F, 0xE2, 0x43, 0x6A, + 0xEC, 0x27, 0x8E, 0xE7, 0x68, 0x75, 0xB5, 0x23, + 0xC5, 0x43, 0x1D, 0x99, 0x48, 0x57, 0x73, 0xD9, + 0xAD, 0xBC, 0xD0, 0x14, 0xDD, 0x87, 0xBC, 0x68, + 0xFB, 0x82, 0xEE, 0x47, 0x4B, 0x22, 0xA5, 0x43, + 0x3A, 0xF9, 0xF9, 0x91, 0xFC, 0x34, 0xB2, 0x58, + 0x34, 0xDF, 0x13, 0x09, 0x9A, 0x46, 0xF5, 0x68, + 0xAF, 0xD1, 0x15, 0x5F, 0x32, 0x1B, 0x9D, 0xA9, + 0xE9, 0xC0, 0x63, 0x47, 0xAB, 0x3C, 0x1F, 0x59, + 0xF7, 0xEA, 0x0E, 0xD6, 0xCF, 0x47, 0xB3, 0xE9, + 0xAF, 0x65, 0x7A, 0xA7, 0xAE, 0x9B, 0xF8, 0x26, + 0x0B, 0x96, 0x9D, 0xE4, 0xAD, 0x24, 0xD3, 0xA8, + 0xCE, 0x95, 0xE5, 0x77, 0xD0, 0x44, 0x13, 0x05, + 0x06, 0x4E, 0x07, 0xB9, 0xA2, 0xC7, 0x5C, 0x3C, + 0x43, 0x80, 0x1F, 0xCE, 0xB7, 0x36, 0xFE, 0x3D, + 0x27, 0x1B, 0xE1, 0xF3, 0x6B, 0xFF, 0xC8, 0xE4, + 0x3D, 0xB1, 0x4A, 0x16, 0x24, 0x76, 0xBA, 0xEA, + 0x9D, 0x34, 0x6B, 0x52, 0x11, 0xAB, 0xD0, 0x06, + 0x08, 0xB1, 0x5A, 0xF3, 0xB5, 0xE6, 0x3A, 0x00, + 0xFF, 0x92, 0x8D, 0x1E, 0xA1, 0xA1, 0x8D, 0x75, + 0xFA, 0x7C, 0x6C, 0x1B, 0x0F, 0xB6, 0x27, 0x2E, + 0x55, 0xC3, 0xFE, 0x7E, 0x4D, 0x42, 0x05, 0xE5, + 0xCF, 0x0A, 0x1F, 0x87, 0x18, 0x30, 0x4E, 0x14, + 0xF2, 0xB4, 0xCC, 0x54, 0x3D, 0x04, 0x37, 0x34, + 0x1A, 0x4A, 0x31, 0x16, 0x01, 0xA9, 0x2E, 0x92, + 0x56, 0x6B, 0x7D, 0xFB, 0x42, 0x64, 0xE8, 0x70, + 0xE1, 0xB3, 0xA8, 0x75, 0xED, 0xBC, 0x00, 0x3A, + 0x56, 0x19, 0x70, 0xCF, 0x8A, 0x66, 0x9F, 0x3D, + 0x1B, 0x69, 0x28, 0x8C, 0xC6, 0xE3, 0x59, 0xCE, + 0x28, 0xCA, 0x65, 0xF9, 0xDA, 0xE8, 0xCE, 0xCA, + 0x74, 0x3C, 0x1C, 0x8D, 0x9F, 0xFB, 0x55, 0x08, + 0x82, 0x4A, 0x83, 0x61, 0xE3, 0x3B, 0x43, 0x1A, + 0x2E, 0x9E, 0x9A, 0x99, 0x78, 0x47, 0xD2, 0xE6, + 0xE4, 0x3C, 0x83, 0xF0, 0x22, 0x62, 0xE2, 0x94, + 0x6D, 0xF7, 0x72, 0x6D, 0x54, 0xE3, 0xE6, 0xC9, + 0xCC, 0xDB, 0x6D, 0x3F, 0x13, 0x63, 0x46, 0xC1, + 0x1E, 0x59, 0x42, 0xE7, 0xA1, 0xBF, 0x85, 0x0C, + 0x2E, 0x99, 0xB4, 0xFA, 0xCE, 0x75, 0xFD, 0x40, + 0x88, 0x69, 0x33, 0x90, 0x7C, 0xCD, 0xFC, 0x0D, + 0xE1, 0x17, 0x70, 0x20, 0x31, 0x94, 0x1D, 0x00, + 0x1E, 0x2A, 0x68, 0x3C, 0x55, 0x78, 0xFD, 0x33, + 0x54, 0x21, 0x2C, 0xEA, 0xD9, 0x69, 0xBF, 0x1C, + 0x81, 0x23, 0x9E, 0xEC, 0xC7, 0x74, 0xFD, 0x0B, + 0x88, 0x3D, 0x0E, 0xEE, 0x82, 0x4B, 0x10, 0xB8, + 0x79, 0xCF, 0x70, 0x7C, 0xB2, 0x68, 0x47, 0x45, + 0x22, 0x06, 0x1E, 0x92, 0x7B, 0x12, 0x43, 0x24, + 0x41, 0x15, 0xC6, 0x69, 0xE9, 0xEB, 0x27, 0x2B, + 0x60, 0xA6, 0x44, 0xF5, 0x19, 0xEF, 0xEC, 0x06, + 0x34, 0x08, 0xB6, 0x58, 0x47, 0x2E, 0x91, 0x61, + 0xA1, 0xF7, 0x44, 0xFD, 0x66, 0x16, 0x9F, 0x0C, + 0xAE, 0x36, 0xB4, 0x2E, 0x23, 0x79, 0xCB, 0xE8, + 0x1E, 0x6E, 0x51, 0xA0, 0xF5, 0x34, 0x15, 0x18, + 0x4E, 0xA0, 0x06, 0xB2, 0x27, 0x0B, 0x33, 0xE2, + 0xCA, 0x36, 0x4C, 0xDB, 0x33, 0xAA, 0xAE, 0x77, + 0xFF, 0xD9, 0x53, 0xDB, 0x39, 0x70, 0x4D, 0x49, + 0x0C, 0xE9, 0xAC, 0x6F, 0x2D, 0xD1, 0xC7, 0xA1, + 0x8E, 0x61, 0x74, 0x19, 0xA9, 0xAA, 0xFB, 0x37, + 0xE7, 0x23, 0x9B, 0x23, 0x6A, 0x4B, 0x74, 0xCE, + 0x63, 0xE4, 0xA0, 0xAD, 0xFF, 0x85, 0x5D, 0xCD, + 0x78, 0xF6, 0x45, 0x8E, 0x76, 0x0B, 0xFD, 0x1D, + 0x2A, 0xB9, 0x5E, 0x83, 0xC0, 0x3B, 0x6F, 0xAE, + 0x0C, 0xD3, 0xC5, 0xCE, 0xEE, 0xEE, 0x1C, 0x69, + 0x51, 0x59, 0x65, 0xA3, 0x35, 0xFC, 0xF7, 0x8E, + 0x80, 0xAA, 0x73, 0x93, 0x39, 0x54, 0x21, 0x27, + 0x17, 0x0B, 0x2C, 0x3E, 0xE1, 0x0B, 0x0E, 0xAA, + 0x09, 0x9A, 0xC7, 0xAD, 0x4C, 0xD7, 0x6E, 0x7F, + 0xE4, 0xC1, 0x16, 0x4E, 0x62, 0xF4, 0xE5, 0x80, + 0x7D, 0xC0, 0x06, 0x1F, 0x77, 0xE4, 0xA8, 0xA5, + 0x28, 0xD7, 0x10, 0x37, 0x59, 0x30, 0xCB, 0x75, + 0x5B, 0x28, 0xBF, 0xFD, 0x92, 0x8C, 0xB0, 0x7B, + 0xB4, 0xA1, 0x07, 0xCD, 0xCA, 0xBB, 0x30, 0x8A, + 0x48, 0x65, 0x0D, 0xA4, 0xE5, 0x74, 0xD9, 0xBF, + 0x56, 0x07, 0xF5, 0x83, 0xDA, 0xC3, 0x40, 0xD7, + 0x20, 0x93, 0xEF, 0xB1, 0x2B, 0xBF, 0x93, 0x41, + 0x0F, 0x1E, 0xF5, 0xC9, 0x51, 0x6C, 0x74, 0x4D, + 0x23, 0x15, 0xEC, 0x9E, 0x00, 0x0A, 0x8D, 0xC5, + 0xD1, 0x7A, 0x7B, 0x6F, 0x0D, 0x07, 0x9D, 0x78, + 0x4B, 0x6D, 0x90, 0x19, 0x3F, 0x6E, 0x3E, 0xE7, + 0xEA, 0x0E, 0xAB, 0xFC, 0x6F, 0x68, 0xC5, 0x2B, + 0x37, 0xCB, 0xCE, 0x82, 0x18, 0xAF, 0xA3, 0x67, + 0x0A, 0x80, 0xBC, 0x17, 0xB9, 0x5D, 0x7B, 0x40, + 0x53, 0x62, 0x26, 0x35, 0x8F, 0x04, 0xAC, 0xD9, + 0x2A, 0x1B, 0xE1, 0x5B, 0x26, 0xA4, 0xE5, 0x81, + 0x7E, 0x62, 0x8B, 0xA6, 0x79, 0xB3, 0x52, 0x72, + 0x03, 0xCD, 0x36, 0x32, 0x62, 0x8E, 0xC8, 0x3A, + 0xA4, 0xF2, 0x18, 0x6D, 0x2F, 0x00, 0x5D, 0x5D, + 0xFE, 0x6F, 0x7F, 0xDB, 0x4F, 0xED, 0xAC, 0x9E, + 0x89, 0xD6, 0x66, 0xE3, 0x03, 0xBB, 0x56, 0x83, + 0x06, 0x15, 0x6C, 0x56, 0xF0, 0x95, 0x34, 0xE2, + 0x5C, 0x61, 0x9A, 0xB3, 0xB9, 0x50, 0x18, 0xF4, + 0x89, 0x6B, 0xAC, 0xAA, 0x48, 0x34, 0xF6, 0xD2, + 0xD8, 0xFE, 0x14, 0xA9, 0x38, 0xAA, 0x10, 0xE5, + 0x30, 0x54, 0xF0, 0x00, 0x84, 0x44, 0xAC, 0x2E, + 0xEA, 0x25, 0x38, 0xC1, 0x23, 0x0E, 0x6A, 0x18, + 0xC9, 0x2B, 0x01, 0xD9, 0x14, 0x7F, 0xDC, 0xEF, + 0xC9, 0xC8, 0xDA, 0xC1, 0xD4, 0xEC, 0xC8, 0xCF, + 0x1F, 0x96, 0x2E, 0xFA, 0x1B, 0x8C, 0xD3, 0xC9, + 0x69, 0x00, 0x0B, 0x7E, 0xBA, 0xC5, 0x98, 0xDC, + 0xA4, 0x5E, 0xB4, 0x0B, 0xCF, 0xB1, 0x98, 0x51, + 0x48, 0x38, 0x51, 0xCF, 0x34, 0x0F, 0x3E, 0x8C, + 0x23, 0x7A, 0x9E, 0xFF, 0x1C, 0x9F, 0x21, 0xE4, + 0x97, 0x55, 0x41, 0xC6, 0x1A, 0x8F, 0xEF, 0x2A, + 0xC6, 0x05, 0x7F, 0x59, 0xDC, 0xB2, 0x3A, 0x80, + 0xE8, 0x06, 0x10, 0xCD, 0x85, 0xDB, 0x20, 0x3C, + 0x35, 0xD2, 0x4B, 0xC8, 0x2B, 0x9C, 0xD7, 0x82, + 0x46, 0xF5, 0x9F, 0xEB, 0xB2, 0x48, 0x32, 0xD7, + 0xCD, 0x66, 0x4C, 0x99, 0x51, 0x88, 0xE0, 0x28, + 0x1C, 0xD7, 0x86, 0x79, 0x00, 0xDC, 0x0D, 0xF4, + 0x4D, 0x40, 0x90, 0x80, 0x26, 0x8B, 0x79, 0xE9, + 0x56, 0x82, 0x88, 0x5F, 0x22, 0x87, 0x70, 0x73, + 0x4F, 0xA5, 0x35, 0x18, 0xEC, 0x80, 0xCE, 0x23, + 0x06, 0xCE, 0x14, 0x48, 0x52, 0x4E, 0xF0, 0x18, + 0x43, 0x03, 0xD4, 0x50, 0xC7, 0x6E, 0xA6, 0x3B, + 0x73, 0x3E, 0xB0, 0xC8, 0xDC, 0x48, 0xBF, 0x12, + 0x42, 0x3A, 0xD2, 0x38, 0x89, 0xCF, 0xCD, 0xD8, + 0x91, 0xE5, 0x95, 0x00, 0x47, 0x24, 0x0D, 0xC0, + 0xC3, 0x8A, 0xB2, 0xDB, 0xC1, 0x65, 0xB8, 0x1E, + 0x63, 0x10, 0x02, 0xEA, 0x6F, 0x74, 0x11, 0x9E, + 0x27, 0xF9, 0xF8, 0x60, 0x73, 0xBF, 0x2D, 0xF7, + 0x10, 0x81, 0x86, 0x76, 0x98, 0x0C, 0x4C, 0xB6, + 0xBD, 0x53, 0xF9, 0xA5, 0x72, 0x17, 0x78, 0xB8, + 0x9F, 0x59, 0xC6, 0x8C, 0x89, 0x35, 0xF5, 0x03, + 0x1C, 0x8A, 0x93, 0x36, 0x7D, 0x71, 0x70, 0x57, + 0xFD, 0x4D, 0x5E, 0xFA, 0xBE, 0xDE, 0x70, 0x2C, + 0xC6, 0x45, 0xEF, 0xB6, 0xD7, 0xF4, 0x4C, 0x86, + 0x0F, 0xFF, 0x76, 0x37, 0xAA, 0xD9, 0x72, 0x24, + 0x8C, 0x84, 0x4D, 0x15, 0x13, 0x39, 0x20, 0x07, + 0x38, 0x91, 0xC3, 0x13, 0x5D, 0x29, 0x78, 0x68, + 0xB7, 0xDA, 0x86, 0xF0, 0x97, 0xD8, 0xFB, 0x39, + 0xC1, 0x3B, 0xA1, 0x4C, 0x4F, 0x24, 0x75, 0x16, + 0xAB, 0xA4, 0xC5, 0xF8, 0xCE, 0x38, 0x18, 0x48, + 0x2C, 0x8F, 0xF6, 0x0C, 0xCA, 0x51, 0xFD, 0xB2, + 0xCE, 0xE9, 0x6B, 0xC1, 0x13, 0x8D, 0xC0, 0x4A, + 0x86, 0xF8, 0x57, 0x72, 0x75, 0x91, 0xAA, 0xE6, + 0xF8, 0x7C, 0x30, 0x05, 0x9B, 0x3E, 0x81, 0xB6, + 0x80, 0x55, 0xB2, 0x4E, 0xA2, 0xFA, 0x98, 0x36, + 0x86, 0x49, 0x8B, 0xFC, 0x9D, 0x9E, 0x7D, 0x59, + 0x50, 0x79, 0xEB, 0x64, 0x6E, 0x85, 0xB2, 0x12, + 0xCE, 0xDD, 0x21, 0xD0, 0x08, 0x7E, 0x0F, 0x2A, + 0xF6, 0x63, 0xEB, 0x77, 0x2A, 0x98, 0x47, 0xB1, + 0xDF, 0x21, 0x97, 0xAF, 0x13, 0x62, 0x6B, 0x89, + 0x7C, 0x24, 0x63, 0x7A, 0xF5, 0xBF, 0xE8, 0x18, + 0x16, 0xA8, 0xC9, 0x0D, 0x30, 0x48, 0x37, 0x5B, + 0x69, 0x94, 0x97, 0x14, 0x3E, 0x57, 0x71, 0x85, + 0xA7, 0x0E, 0x11, 0x50, 0x58, 0xA3, 0xA9, 0x11, + 0x2B, 0x2C, 0x43, 0x51, 0xB6, 0xCA, 0xD0, 0x09, + 0x28, 0x2B, 0x4F, 0x7C, 0xB8, 0xBD, 0xFC, 0x28, + 0x57, 0x77, 0xD7, 0xDF, 0xE8, 0xF5, 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, 0x03, 0x06, 0x0B, 0x11, 0x17, + 0x1F, 0x27, 0x2E + + }; +#endif + + key = (dilithium_key*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(key); + + if (key != NULL) { + XMEMSET(key, 0, sizeof(*key)); + } + + ExpectIntEQ(wc_dilithium_init_ex(key, NULL, INVALID_DEVID), 0); +#ifndef WOLFSSL_NO_ML_DSA_44 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_44), 0); + ExpectIntEQ(wc_dilithium_import_public(pk_44, (word32)sizeof(pk_44), key), + 0); + ExpectIntEQ(wc_dilithium_verify_msg(sig_44, (word32)sizeof(sig_44), msg_44, + (word32)sizeof(msg_44), &res, key), 0); + ExpectIntEQ(res, 1); +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_65), 0); + ExpectIntEQ(wc_dilithium_import_public(pk_65, (word32)sizeof(pk_65), key), + 0); + ExpectIntEQ(wc_dilithium_verify_msg(sig_65, (word32)sizeof(sig_65), msg_65, + (word32)sizeof(msg_65), &res, key), 0); + ExpectIntEQ(res, 1); +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 + ExpectIntEQ(wc_dilithium_set_level(key, WC_ML_DSA_87), 0); + ExpectIntEQ(wc_dilithium_import_public(pk_87, (word32)sizeof(pk_87), key), + 0); + ExpectIntEQ(wc_dilithium_verify_msg(sig_87, (word32)sizeof(sig_87), msg_87, + (word32)sizeof(msg_87), &res, key), 0); + ExpectIntEQ(res, 1); +#endif + + XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return EXPECT_RESULT(); +} + /* * Testing wc_SetSubjectBuffer */ static int test_wc_SetSubjectBuffer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) - Cert cert; - FILE* file; - byte* der; - word32 derSz; - int ret = 0; + Cert cert; + XFILE file = XBADFILE; + byte* der = NULL; + word32 derSz; derSz = FOURK_BUF; - der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (der == NULL) { - ret = -1; - } - if (ret == 0) { - file = XFOPEN("./certs/ca-cert.der", "rb"); - if (file != NULL) { - derSz = (word32)XFREAD(der, 1, FOURK_BUF, file); - XFCLOSE(file); - } - else { - ret = -1; - } - } - if (ret == 0) { - ret = wc_InitCert(&cert); - } + ExpectNotNull(der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectTrue((file = XFOPEN("./certs/ca-cert.der", "rb")) != XBADFILE); + ExpectTrue((derSz = (word32)XFREAD(der, 1, FOURK_BUF, file)) > 0); + if (file != XBADFILE) + XFCLOSE(file); - if (ret == 0) { - ret = wc_SetSubjectBuffer(&cert, der, derSz); - } + ExpectIntEQ(wc_InitCert(&cert), 0); + ExpectIntEQ(wc_SetSubjectBuffer(&cert, der, (int)derSz), 0); + ExpectIntEQ(wc_SetSubjectBuffer(NULL, der, (int)derSz), BAD_FUNC_ARG); - if (ret == 0) { - ret = wc_SetSubjectBuffer(NULL, der, derSz); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; -}/* End test_wc_SetSubjectBuffer*/ + return EXPECT_RESULT(); +} /* End test_wc_SetSubjectBuffer*/ /* * Testing wc_SetSubjectKeyIdFromPublicKey_ex */ static int test_wc_SetSubjectKeyIdFromPublicKey_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN) - WC_RNG rng; - Cert cert; -#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) - ed25519_key ed25519Key; -#endif + WC_RNG rng; + Cert cert; #if !defined(NO_RSA) && defined(HAVE_RSA) - RsaKey rsaKey; - int bits = 2048; + RsaKey rsaKey; + int bits = 2048; #endif #if defined(HAVE_ECC) - ecc_key eccKey; + ecc_key eccKey; + int ret; +#endif +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) + ed25519_key ed25519Key; #endif #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) - ed448_key ed448Key; + ed448_key ed448Key; #endif - int ret = 0; #ifndef HAVE_FIPS - ret = wc_InitRng_ex(&rng, HEAP_HINT, testDevId); + ExpectIntEQ(wc_InitRng_ex(&rng, HEAP_HINT, testDevId), 0); #else - ret = wc_InitRng(&rng); + ExpectIntEQ(wc_InitRng(&rng), 0); #endif - wc_InitCert(&cert); -#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) - if (ret == 0) { /*ED25519*/ - ret = wc_ed25519_init(&ed25519Key); - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519Key); - } - if (ret == 0) { - ret = wc_SetSubjectKeyIdFromPublicKey_ex(&cert, ED25519_TYPE, - &ed25519Key); - } - wc_ed25519_free(&ed25519Key); - } -#endif + ExpectIntEQ(wc_InitCert(&cert), 0); + #if !defined(NO_RSA) && defined(HAVE_RSA) && defined(WOLFSSL_KEY_GEN) - if (ret == 0) { /*RSA*/ - ret = wc_InitRsaKey(&rsaKey, HEAP_HINT); - if (ret == 0) { - MAKE_RSA_KEY(&rsaKey, bits, WC_RSA_EXPONENT, &rng); - } - if (ret == 0) { - ret = wc_SetSubjectKeyIdFromPublicKey_ex(&cert, RSA_TYPE, &rsaKey); - } - wc_FreeRsaKey(&rsaKey); - } + /* RSA */ + XMEMSET(&rsaKey, 0, sizeof(RsaKey)); + ExpectIntEQ(wc_InitRsaKey(&rsaKey, HEAP_HINT), 0); + ExpectIntEQ(MAKE_RSA_KEY(&rsaKey, bits, WC_RSA_EXPONENT, &rng), 0); + ExpectIntEQ(wc_SetSubjectKeyIdFromPublicKey_ex(&cert, RSA_TYPE, &rsaKey), + 0); + DoExpectIntEQ(wc_FreeRsaKey(&rsaKey), 0); #endif + #if defined(HAVE_ECC) - if (ret == 0) { /*ECC*/ - ret = wc_ecc_init(&eccKey); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY14, &eccKey); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &eccKey.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (ret == 0) { - ret = wc_SetSubjectKeyIdFromPublicKey_ex(&cert, ECC_TYPE, &eccKey); - } - wc_ecc_free(&eccKey); - } + /* ECC */ + XMEMSET(&eccKey, 0, sizeof(ecc_key)); + ExpectIntEQ(wc_ecc_init(&eccKey), 0); + ret = wc_ecc_make_key(&rng, KEY14, &eccKey); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &eccKey.asyncDev, WC_ASYNC_FLAG_NONE); #endif -#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) - if (ret == 0) { /*ED448*/ - ret = wc_ed448_init(&ed448Key); - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448Key); - } - if (ret == 0) { - ret = wc_SetSubjectKeyIdFromPublicKey_ex(&cert, ED448_TYPE, - &ed448Key); - } - wc_ed448_free(&ed448Key); - } + ExpectIntEQ(ret, 0); + ExpectIntEQ(wc_SetSubjectKeyIdFromPublicKey_ex(&cert, ECC_TYPE, &eccKey), + 0); + DoExpectIntEQ(wc_ecc_free(&eccKey), 0); #endif - wc_FreeRng(&rng); +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) + /* ED25519 */ + XMEMSET(&ed25519Key, 0, sizeof(ed25519_key)); + ExpectIntEQ(wc_ed25519_init(&ed25519Key), 0); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519Key), 0); + ExpectIntEQ(wc_SetSubjectKeyIdFromPublicKey_ex(&cert, ED25519_TYPE, + &ed25519Key), 0); + wc_ed25519_free(&ed25519Key); +#endif - res = TEST_RES_CHECK(ret == 0); +#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) + /* ED448 */ + XMEMSET(&ed448Key, 0, sizeof(ed448_key)); + ExpectIntEQ(wc_ed448_init(&ed448Key), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448Key), 0); + ExpectIntEQ(wc_SetSubjectKeyIdFromPublicKey_ex(&cert, ED448_TYPE, + &ed448Key), 0); + wc_ed448_free(&ed448Key); #endif - return res; -}/* End test_wc_SetSubjectKeyIdFromPublicKey_ex*/ + + wc_FreeRng(&rng); + DoExpectIntEQ(wc_FreeRng(&rng), 0); +#endif /* WOLFSSL_CERT_EXT && WOLFSSL_CERT_GEN */ + return EXPECT_RESULT(); +} /* End test_wc_SetSubjectKeyIdFromPublicKey_ex*/ /* * Testing wc_SetAuthKeyIdFromPublicKey_ex */ static int test_wc_SetAuthKeyIdFromPublicKey_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN) - WC_RNG rng; - Cert cert; -#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) - ed25519_key ed25519Key; -#endif + WC_RNG rng; + Cert cert; #if !defined(NO_RSA) && defined(HAVE_RSA) - RsaKey rsaKey; - int bits = 2048; + RsaKey rsaKey; + int bits = 2048; #endif #if defined(HAVE_ECC) - ecc_key eccKey; + ecc_key eccKey; + int ret; +#endif +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) + ed25519_key ed25519Key; #endif #if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) - ed448_key ed448Key; + ed448_key ed448Key; #endif - int ret = 0; #ifndef HAVE_FIPS - ret = wc_InitRng_ex(&rng, HEAP_HINT, testDevId); + ExpectIntEQ(wc_InitRng_ex(&rng, HEAP_HINT, testDevId), 0); #else - ret = wc_InitRng(&rng); + ExpectIntEQ(wc_InitRng(&rng), 0); #endif - wc_InitCert(&cert); -#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) - if (ret == 0) { /*ED25519*/ - ret = wc_ed25519_init(&ed25519Key); - if (ret == 0) { - ret = wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519Key); - } - if (ret == 0) { - ret = wc_SetAuthKeyIdFromPublicKey_ex(&cert, ED25519_TYPE, - &ed25519Key); - } - wc_ed25519_free(&ed25519Key); - } -#endif + ExpectIntEQ(wc_InitCert(&cert), 0); + #if !defined(NO_RSA) && defined(HAVE_RSA) && defined(WOLFSSL_KEY_GEN) - if (ret == 0) { /*RSA*/ - ret = wc_InitRsaKey(&rsaKey, HEAP_HINT); - if (ret == 0) { - MAKE_RSA_KEY(&rsaKey, bits, WC_RSA_EXPONENT, &rng); - } - if (ret == 0) { - ret = wc_SetAuthKeyIdFromPublicKey_ex(&cert, RSA_TYPE, &rsaKey); - } - wc_FreeRsaKey(&rsaKey); - } + /* RSA */ + XMEMSET(&rsaKey, 0, sizeof(RsaKey)); + ExpectIntEQ(wc_InitRsaKey(&rsaKey, HEAP_HINT), 0); + ExpectIntEQ(MAKE_RSA_KEY(&rsaKey, bits, WC_RSA_EXPONENT, &rng), 0); + ExpectIntEQ(wc_SetAuthKeyIdFromPublicKey_ex(&cert, RSA_TYPE, &rsaKey), 0); + DoExpectIntEQ(wc_FreeRsaKey(&rsaKey), 0); #endif + #if defined(HAVE_ECC) - if (ret == 0) { /*ECC*/ - ret = wc_ecc_init(&eccKey); - if (ret == 0) { - ret = wc_ecc_make_key(&rng, KEY14, &eccKey); - #if defined(WOLFSSL_ASYNC_CRYPT) - ret = wc_AsyncWait(ret, &eccKey.asyncDev, WC_ASYNC_FLAG_NONE); - #endif - } - if (ret == 0) { - ret = wc_SetAuthKeyIdFromPublicKey_ex(&cert, ECC_TYPE, &eccKey); - } - wc_ecc_free(&eccKey); - } + /* ECC */ + XMEMSET(&eccKey, 0, sizeof(ecc_key)); + ExpectIntEQ(wc_ecc_init(&eccKey), 0); + ret = wc_ecc_make_key(&rng, KEY14, &eccKey); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &eccKey.asyncDev, WC_ASYNC_FLAG_NONE); #endif -#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) - if (ret == 0) { /*ED448*/ - ret = wc_ed448_init(&ed448Key); - if (ret == 0) { - ret = wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448Key); - } - if (ret == 0) { - ret = wc_SetAuthKeyIdFromPublicKey_ex(&cert, ED448_TYPE, - &ed448Key); - } - wc_ed448_free(&ed448Key); - } + ExpectIntEQ(ret, 0); + ExpectIntEQ(wc_SetAuthKeyIdFromPublicKey_ex(&cert, ECC_TYPE, &eccKey), 0); + DoExpectIntEQ(wc_ecc_free(&eccKey), 0); #endif - wc_FreeRng(&rng); +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) + /* ED25519 */ + XMEMSET(&ed25519Key, 0, sizeof(ed25519_key)); + ExpectIntEQ(wc_ed25519_init(&ed25519Key), 0); + ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &ed25519Key), 0); + ExpectIntEQ(wc_SetAuthKeyIdFromPublicKey_ex(&cert, ED25519_TYPE, + &ed25519Key), 0); + wc_ed25519_free(&ed25519Key); +#endif - res = TEST_RES_CHECK(ret == 0); -#endif /*defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)*/ - return res; -}/* End test_wc_SetAuthKeyIdFromPublicKey_ex*/ +#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) + /* ED448 */ + XMEMSET(&ed448Key, 0, sizeof(ed448_key)); + ExpectIntEQ(wc_ed448_init(&ed448Key), 0); + ExpectIntEQ(wc_ed448_make_key(&rng, ED448_KEY_SIZE, &ed448Key), 0); + ExpectIntEQ(wc_SetAuthKeyIdFromPublicKey_ex(&cert, ED448_TYPE, &ed448Key), + 0); + wc_ed448_free(&ed448Key); +#endif + + DoExpectIntEQ(wc_FreeRng(&rng), 0); +#endif /* defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)*/ + return EXPECT_RESULT(); +} /* End test_wc_SetAuthKeyIdFromPublicKey_ex*/ /* * Testing wc_PKCS7_New() */ static int test_wc_PKCS7_New(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) - PKCS7* pkcs7; + PKCS7* pkcs7 = NULL; - pkcs7 = wc_PKCS7_New(NULL, testDevId); + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, testDevId)); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(pkcs7 != NULL); #endif - return res; + return EXPECT_RESULT(); } /* END test-wc_PKCS7_New */ /* @@ -28828,24 +36925,20 @@ */ static int test_wc_PKCS7_Init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) - PKCS7* pkcs7; - void* heap = NULL; - - pkcs7 = wc_PKCS7_New(heap, testDevId); - AssertNotNull(pkcs7); + PKCS7* pkcs7 = NULL; + void* heap = NULL; - AssertIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(heap, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); /* Pass in bad args. */ - AssertIntEQ(wc_PKCS7_Init(NULL, heap, testDevId), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_Init(NULL, heap, testDevId), BAD_FUNC_ARG); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* END test-wc_PKCS7_Init */ @@ -28854,47 +36947,53 @@ */ static int test_wc_PKCS7_InitWithCert(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) - PKCS7* pkcs7; + PKCS7* pkcs7 = NULL; #ifndef NO_RSA #if defined(USE_CERT_BUFFERS_2048) unsigned char cert[sizeof(client_cert_der_2048)]; int certSz = (int)sizeof(cert); + XMEMSET(cert, 0, certSz); XMEMCPY(cert, client_cert_der_2048, sizeof(client_cert_der_2048)); #elif defined(USE_CERT_BUFFERS_1024) unsigned char cert[sizeof(client_cert_der_1024)]; int certSz = (int)sizeof(cert); + XMEMSET(cert, 0, certSz); XMEMCPY(cert, client_cert_der_1024, sizeof_client_cert_der_1024); #else unsigned char cert[ONEK_BUF]; - XFILE fp; + XFILE fp = XBADFILE; int certSz; - fp = XFOPEN("./certs/1024/client-cert.der", "rb"); - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, + fp), 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #elif defined(HAVE_ECC) #if defined(USE_CERT_BUFFERS_256) unsigned char cert[sizeof(cliecc_cert_der_256)]; int certSz = (int)sizeof(cert); + XMEMSET(cert, 0, certSz); XMEMCPY(cert, cliecc_cert_der_256, sizeof(cliecc_cert_der_256)); #else unsigned char cert[ONEK_BUF]; - XFILE fp; + XFILE fp = XBADFILE; int certSz; - fp = XFOPEN("./certs/client-ecc-cert.der", "rb"); - - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, sizeof(cliecc_cert_der_256), fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof(cliecc_cert_der_256), + fp), 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #else #error PKCS7 requires ECC or RSA @@ -28976,35 +37075,35 @@ 0x64, 0xAB, 0xA6, 0xBE, 0x02, 0x21, 0x00, 0xAA, 0xC5, 0xA3, 0x50, 0xF6, 0xF1, 0xA5, 0xDB, 0x05, 0xE0, 0x75, 0xD2, 0xF7, 0xBA, 0x49, 0x5F, 0x8F, 0x7D, 0x1C, 0x44, 0xB1, 0x6E, 0xDF, 0xC8, 0xDA, 0x10, 0x48, 0x2D, 0x53, - 0x08, 0xA8, 0xB4}; + 0x08, 0xA8, 0xB4 + }; #endif - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); /* If initialization is not successful, it's free'd in init func. */ - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)cert, (word32)certSz), 0); - + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)cert, (word32)certSz), + 0); wc_PKCS7_Free(pkcs7); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); /* Valid initialization usage. */ - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); /* Pass in bad args. No need free for null checks, free at end.*/ - AssertIntEQ(wc_PKCS7_InitWithCert(NULL, (byte*)cert, (word32)certSz), - BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, (word32)certSz), - BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_InitWithCert(NULL, (byte*)cert, (word32)certSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, (word32)certSz), + BAD_FUNC_ARG); #ifdef HAVE_ECC - AssertIntLT(wc_PKCS7_InitWithCert(pkcs7, certWithInvalidEccKey, - sizeof(certWithInvalidEccKey)), 0); + ExpectIntLT(wc_PKCS7_InitWithCert(pkcs7, certWithInvalidEccKey, + sizeof(certWithInvalidEccKey)), 0); } #endif wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_PKCS7_InitWithCert */ @@ -29013,11 +37112,11 @@ */ static int test_wc_PKCS7_EncodeData(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) - PKCS7* pkcs7; - byte output[FOURK_BUF]; - byte data[] = "My encoded DER cert."; + PKCS7* pkcs7 = NULL; + byte output[FOURK_BUF]; + byte data[] = "My encoded DER cert."; #ifndef NO_RSA #if defined(USE_CERT_BUFFERS_2048) @@ -29025,36 +37124,43 @@ unsigned char key[sizeof(client_key_der_2048)]; int certSz = (int)sizeof(cert); int keySz = (int)sizeof(key); + XMEMSET(cert, 0, certSz); XMEMSET(key, 0, keySz); XMEMCPY(cert, client_cert_der_2048, certSz); XMEMCPY(key, client_key_der_2048, keySz); - #elif defined(USE_CERT_BUFFERS_1024) unsigned char cert[sizeof(sizeof_client_cert_der_1024)]; unsigned char key[sizeof_client_key_der_1024]; int certSz = (int)sizeof(cert); int keySz = (int)sizeof(key); + XMEMSET(cert, 0, certSz); XMEMSET(key, 0, keySz); XMEMCPY(cert, client_cert_der_1024, certSz); XMEMCPY(key, client_key_der_1024, keySz); #else - unsigned char cert[ONEK_BUF]; - unsigned char key[ONEK_BUF]; - XFILE fp; - int certSz; - int keySz; + unsigned char cert[ONEK_BUF]; + unsigned char key[ONEK_BUF]; + XFILE fp = XBADFILE; + int certSz; + int keySz; - fp = XFOPEN("./certs/1024/client-cert.der", "rb"); - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/1024/client-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp), + 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #elif defined(HAVE_ECC) #if defined(USE_CERT_BUFFERS_256) @@ -29069,46 +37175,52 @@ #else unsigned char cert[ONEK_BUF]; unsigned char key[ONEK_BUF]; - XFILE fp; + XFILE fp = XBADFILE; int certSz, keySz; - fp = XFOPEN("./certs/client-ecc-cert.der", "rb"); - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, sizeof_cliecc_cert_der_256, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_cliecc_cert_der_256, + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/client-ecc-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, sizeof_ecc_clikey_der_256, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, sizeof_ecc_clikey_der_256, fp), + 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #endif XMEMSET(output, 0, sizeof(output)); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)cert, certSz), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)cert, (word32)certSz), 0); - pkcs7->content = data; - pkcs7->contentSz = sizeof(data); - pkcs7->privateKey = key; - pkcs7->privateKeySz = keySz; - AssertIntGT(wc_PKCS7_EncodeData(pkcs7, output, (word32)sizeof(output)), 0); + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = sizeof(data); + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)keySz; + } + ExpectIntGT(wc_PKCS7_EncodeData(pkcs7, output, (word32)sizeof(output)), 0); /* Test bad args. */ - AssertIntEQ(wc_PKCS7_EncodeData(NULL, output, (word32)sizeof(output)), + ExpectIntEQ(wc_PKCS7_EncodeData(NULL, output, (word32)sizeof(output)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeData(pkcs7, NULL, (word32)sizeof(output)), + ExpectIntEQ(wc_PKCS7_EncodeData(pkcs7, NULL, (word32)sizeof(output)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeData(pkcs7, output, 5), BUFFER_E); + ExpectIntEQ(wc_PKCS7_EncodeData(pkcs7, output, 5), BUFFER_E); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_PKCS7_EncodeData */ @@ -29177,22 +37289,58 @@ } #endif +#if defined(HAVE_PKCS7) && defined(ASN_BER_TO_DER) +typedef struct encodeSignedDataStream { + byte out[FOURK_BUF*3]; + int idx; + word32 outIdx; +} encodeSignedDataStream; + + +/* content is 8k of partially created bundle */ +static int GetContentCB(PKCS7* pkcs7, byte** content, void* ctx) +{ + int ret = 0; + encodeSignedDataStream* strm = (encodeSignedDataStream*)ctx; + + if (strm->outIdx < pkcs7->contentSz) { + ret = (pkcs7->contentSz > strm->outIdx + FOURK_BUF)? + FOURK_BUF : pkcs7->contentSz - strm->outIdx; + *content = strm->out + strm->outIdx; + strm->outIdx += ret; + } + + (void)pkcs7; + return ret; +} + +static int StreamOutputCB(PKCS7* pkcs7, const byte* output, word32 outputSz, + void* ctx) +{ + encodeSignedDataStream* strm = (encodeSignedDataStream*)ctx; + + XMEMCPY(strm->out + strm->idx, output, outputSz); + strm->idx += outputSz; + (void)pkcs7; + return 0; +} +#endif + /* * Testing wc_PKCS7_EncodeSignedData() */ static int test_wc_PKCS7_EncodeSignedData(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) - PKCS7* pkcs7; - WC_RNG rng; - byte output[FOURK_BUF]; - byte badOut[1]; - word32 outputSz = (word32)sizeof(output); - word32 badOutSz = 0; - byte data[] = "Test data to encode."; - + PKCS7* pkcs7 = NULL; + WC_RNG rng; + byte output[FOURK_BUF]; + byte badOut[1]; + word32 outputSz = (word32)sizeof(output); + word32 badOutSz = 0; + byte data[] = "Test data to encode."; #ifndef NO_RSA #if defined(USE_CERT_BUFFERS_2048) byte key[sizeof(client_key_der_2048)]; @@ -29215,19 +37363,25 @@ #else unsigned char cert[ONEK_BUF]; unsigned char key[ONEK_BUF]; - XFILE fp; + XFILE fp = XBADFILE; int certSz; int keySz; - fp = XFOPEN("./certs/1024/client-cert.der", "rb"); - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/1024/client-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp), + 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #elif defined(HAVE_ECC) #if defined(USE_CERT_BUFFERS_256) @@ -29242,83 +37396,202 @@ #else unsigned char cert[ONEK_BUF]; unsigned char key[ONEK_BUF]; - XFILE fp; - int certSz, keySz; + XFILE fp = XBADFILE; + int certSz; + int keySz; - fp = XOPEN("./certs/client-ecc-cert.der", "rb"); - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, ONEK_BUF, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, ONEK_BUF, fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/client-ecc-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, ONEK_BUF, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, ONEK_BUF, fp), 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #endif + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(output, 0, outputSz); - AssertIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); - pkcs7->content = data; - pkcs7->contentSz = (word32)sizeof(data); - pkcs7->privateKey = key; - pkcs7->privateKeySz = (word32)sizeof(key); - pkcs7->encryptOID = RSAk; -#ifdef NO_SHA - pkcs7->hashOID = SHA256h; -#else - pkcs7->hashOID = SHAh; -#endif - pkcs7->rng = &rng; + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = (word32)sizeof(data); + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + pkcs7->encryptOID = RSAk; + #ifdef NO_SHA + pkcs7->hashOID = SHA256h; + #else + pkcs7->hashOID = SHAh; + #endif + pkcs7->rng = &rng; + } + + ExpectIntGT(wc_PKCS7_EncodeSignedData(pkcs7, output, outputSz), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + +#ifdef ASN_BER_TO_DER + wc_PKCS7_Free(pkcs7); + + /* reinitialize and test setting stream mode */ + { + int signedSz = 0; + encodeSignedDataStream strm; + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); + + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = (word32)sizeof(data); + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + pkcs7->encryptOID = RSAk; + #ifdef NO_SHA + pkcs7->hashOID = SHA256h; + #else + pkcs7->hashOID = SHAh; + #endif + pkcs7->rng = &rng; + } + ExpectIntEQ(wc_PKCS7_GetStreamMode(pkcs7), 0); + ExpectIntEQ(wc_PKCS7_SetStreamMode(pkcs7, 1, NULL, NULL, NULL), 0); + ExpectIntEQ(wc_PKCS7_SetStreamMode(NULL, 1, NULL, NULL, NULL), + BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_GetStreamMode(pkcs7), 1); + + ExpectIntGT(signedSz = wc_PKCS7_EncodeSignedData(pkcs7, output, + outputSz), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; - AssertIntGT(wc_PKCS7_EncodeSignedData(pkcs7, output, outputSz), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + /* use exact signed buffer size since BER encoded */ + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, (word32)signedSz), 0); + wc_PKCS7_Free(pkcs7); + + /* now try with using callbacks for IO */ + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); + + if (pkcs7 != NULL) { + pkcs7->contentSz = FOURK_BUF*2; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + pkcs7->encryptOID = RSAk; + #ifdef NO_SHA + pkcs7->hashOID = SHA256h; + #else + pkcs7->hashOID = SHAh; + #endif + pkcs7->rng = &rng; + } + XMEMSET(&strm, 0, sizeof(strm)); + ExpectIntEQ(wc_PKCS7_SetStreamMode(pkcs7, 1, GetContentCB, + StreamOutputCB, (void*)&strm), 0); + + ExpectIntGT(signedSz = wc_PKCS7_EncodeSignedData(pkcs7, NULL, 0), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* use exact signed buffer size since BER encoded */ + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, strm.out, (word32)signedSz), 0); + } +#endif +#ifndef NO_PKCS7_STREAM wc_PKCS7_Free(pkcs7); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + pkcs7 = NULL; + + { + word32 z; + int ret; + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming mode */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); + } +#endif /* !NO_PKCS7_STREAM */ + /* Pass in bad args. */ - AssertIntEQ(wc_PKCS7_EncodeSignedData(NULL, output, outputSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData(pkcs7, NULL, outputSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData(pkcs7, badOut, + ExpectIntEQ(wc_PKCS7_EncodeSignedData(NULL, output, outputSz), + BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_EncodeSignedData(pkcs7, NULL, outputSz), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_EncodeSignedData(pkcs7, badOut, badOutSz), BAD_FUNC_ARG); - pkcs7->hashOID = 0; /* bad hashOID */ - AssertIntEQ(wc_PKCS7_EncodeSignedData(pkcs7, output, outputSz), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->hashOID = 0; /* bad hashOID */ + } + ExpectIntEQ(wc_PKCS7_EncodeSignedData(pkcs7, output, outputSz), + BAD_FUNC_ARG); #if defined(HAVE_PKCS7) && defined(HAVE_PKCS7_RSA_RAW_SIGN_CALLBACK) && \ !defined(NO_RSA) && !defined(NO_SHA256) /* test RSA sign raw digest callback, if using RSA and compiled in. * Example callback assumes SHA-256, so only run test if compiled in. */ wc_PKCS7_Free(pkcs7); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); - pkcs7->content = data; - pkcs7->contentSz = (word32)sizeof(data); - pkcs7->privateKey = key; - pkcs7->privateKeySz = (word32)sizeof(key); - pkcs7->encryptOID = RSAk; - pkcs7->hashOID = SHA256h; - pkcs7->rng = &rng; + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = (word32)sizeof(data); + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + pkcs7->encryptOID = RSAk; + pkcs7->hashOID = SHA256h; + pkcs7->rng = &rng; + } - AssertIntEQ(wc_PKCS7_SetRsaSignRawDigestCb(pkcs7, rsaSignRawDigestCb), 0); + ExpectIntEQ(wc_PKCS7_SetRsaSignRawDigestCb(pkcs7, rsaSignRawDigestCb), 0); - AssertIntGT(wc_PKCS7_EncodeSignedData(pkcs7, output, outputSz), 0); + ExpectIntGT(wc_PKCS7_EncodeSignedData(pkcs7, output, outputSz), 0); #endif wc_PKCS7_Free(pkcs7); - wc_FreeRng(&rng); + DoExpectIntEQ(wc_FreeRng(&rng), 0); - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_PKCS7_EncodeSignedData */ @@ -29327,24 +37600,24 @@ */ static int test_wc_PKCS7_EncodeSignedData_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) - int ret, i; - PKCS7* pkcs7; - WC_RNG rng; - byte outputHead[FOURK_BUF/2]; - byte outputFoot[FOURK_BUF/2]; - word32 outputHeadSz = (word32)sizeof(outputHead); - word32 outputFootSz = (word32)sizeof(outputFoot); - byte data[FOURK_BUF]; - wc_HashAlg hash; + int i; + PKCS7* pkcs7 = NULL; + WC_RNG rng; + byte outputHead[FOURK_BUF/2]; + byte outputFoot[FOURK_BUF/2]; + word32 outputHeadSz = (word32)sizeof(outputHead); + word32 outputFootSz = (word32)sizeof(outputFoot); + byte data[FOURK_BUF]; + wc_HashAlg hash; #ifdef NO_SHA enum wc_HashType hashType = WC_HASH_TYPE_SHA256; #else enum wc_HashType hashType = WC_HASH_TYPE_SHA; #endif byte hashBuf[WC_MAX_DIGEST_SIZE]; - word32 hashSz = wc_HashGetDigestSize(hashType); + word32 hashSz = (word32)wc_HashGetDigestSize(hashType); #ifndef NO_RSA #if defined(USE_CERT_BUFFERS_2048) @@ -29366,181 +37639,232 @@ XMEMCPY(key, client_key_der_1024, keySz); XMEMCPY(cert, client_cert_der_1024, certSz); #else - unsigned char cert[ONEK_BUF]; - unsigned char key[ONEK_BUF]; - XFILE fp; - int certSz; - int keySz; + unsigned char cert[ONEK_BUF]; + unsigned char key[ONEK_BUF]; + XFILE fp = XBADFILE; + int certSz; + int keySz; - fp = XFOPEN("./certs/1024/client-cert.der", "rb"); - AssertTrue((fp != XBADFILE)); - certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, fp); - XFCLOSE(fp); + ExpectTure((fp = XFOPEN("./certs/1024/client-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/1024/client-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp), + 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #elif defined(HAVE_ECC) #if defined(USE_CERT_BUFFERS_256) - unsigned char cert[sizeof(cliecc_cert_der_256)]; - unsigned char key[sizeof(ecc_clikey_der_256)]; - int certSz = (int)sizeof(cert); - int keySz = (int)sizeof(key); + unsigned char cert[sizeof(cliecc_cert_der_256)]; + unsigned char key[sizeof(ecc_clikey_der_256)]; + int certSz = (int)sizeof(cert); + int keySz = (int)sizeof(key); + XMEMSET(cert, 0, certSz); XMEMSET(key, 0, keySz); XMEMCPY(cert, cliecc_cert_der_256, sizeof_cliecc_cert_der_256); XMEMCPY(key, ecc_clikey_der_256, sizeof_ecc_clikey_der_256); #else - unsigned char cert[ONEK_BUF]; - unsigned char key[ONEK_BUF]; - XFILE fp; - int certSz, keySz; + unsigned char cert[ONEK_BUF]; + unsigned char key[ONEK_BUF]; + XFILE fp = XBADFILE; + int certSz; + int keySz; - fp = XFOPEN("./certs/client-ecc-cert.der", "rb"); - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, sizeof_cliecc_cert_der_256, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_cliecc_cert_der_256, + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/client-ecc-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, sizeof_ecc_clikey_der_256, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, sizeof_ecc_clikey_der_256, fp), + 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif #endif + XMEMSET(&rng, 0, sizeof(WC_RNG)); + /* initialize large data with sequence */ for (i=0; i<(int)sizeof(data); i++) data[i] = i & 0xff; XMEMSET(outputHead, 0, outputHeadSz); XMEMSET(outputFoot, 0, outputFootSz); - AssertIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); - pkcs7->content = NULL; /* not used for ex */ - pkcs7->contentSz = (word32)sizeof(data); - pkcs7->privateKey = key; - pkcs7->privateKeySz = (word32)sizeof(key); - pkcs7->encryptOID = RSAk; -#ifdef NO_SHA - pkcs7->hashOID = SHA256h; -#else - pkcs7->hashOID = SHAh; -#endif - pkcs7->rng = &rng; + if (pkcs7 != NULL) { + pkcs7->content = NULL; /* not used for ex */ + pkcs7->contentSz = (word32)sizeof(data); + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + pkcs7->encryptOID = RSAk; + #ifdef NO_SHA + pkcs7->hashOID = SHA256h; + #else + pkcs7->hashOID = SHAh; + #endif + pkcs7->rng = &rng; + } /* calculate hash for content */ - ret = wc_HashInit(&hash, hashType); - if (ret == 0) { - ret = wc_HashUpdate(&hash, hashType, data, sizeof(data)); - if (ret == 0) { - ret = wc_HashFinal(&hash, hashType, hashBuf); - } - wc_HashFree(&hash, hashType); - } - AssertIntEQ(ret, 0); + XMEMSET(&hash, 0, sizeof(wc_HashAlg)); + ExpectIntEQ(wc_HashInit(&hash, hashType), 0); + ExpectIntEQ(wc_HashUpdate(&hash, hashType, data, sizeof(data)), 0); + ExpectIntEQ(wc_HashFinal(&hash, hashType, hashBuf), 0); + DoExpectIntEQ(wc_HashFree(&hash, hashType), 0); /* Perform PKCS7 sign using hash directly */ - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, outputHead, &outputHeadSz, outputFoot, &outputFootSz), 0); - AssertIntGT(outputHeadSz, 0); - AssertIntGT(outputFootSz, 0); + ExpectIntGT(outputHeadSz, 0); + ExpectIntGT(outputFootSz, 0); wc_PKCS7_Free(pkcs7); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); /* required parameter even on verify when using _ex, if using outputHead * and outputFoot */ - pkcs7->contentSz = (word32)sizeof(data); - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + if (pkcs7 != NULL) { + pkcs7->contentSz = (word32)sizeof(data); + } + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, outputHead, outputHeadSz, outputFoot, outputFootSz), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; /* assembly complete PKCS7 sign and use normal verify */ { - byte* output = (byte*)XMALLOC( - outputHeadSz + sizeof(data) + outputFootSz, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + byte* output = NULL; word32 outputSz = 0; - AssertNotNull(output); - XMEMCPY(&output[outputSz], outputHead, outputHeadSz); - outputSz += outputHeadSz; - XMEMCPY(&output[outputSz], data, sizeof(data)); - outputSz += sizeof(data); - XMEMCPY(&output[outputSz], outputFoot, outputFootSz); - outputSz += outputFootSz; - - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + #ifndef NO_PKCS7_STREAM + word32 z; + int ret; + #endif /* !NO_PKCS7_STREAM */ + + ExpectNotNull(output = (byte*)XMALLOC( + outputHeadSz + sizeof(data) + outputFootSz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (output != NULL) { + XMEMCPY(&output[outputSz], outputHead, outputHeadSz); + outputSz += outputHeadSz; + XMEMCPY(&output[outputSz], data, sizeof(data)); + outputSz += sizeof(data); + XMEMCPY(&output[outputSz], outputFoot, outputFootSz); + outputSz += outputFootSz; + } + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + + #ifndef NO_PKCS7_STREAM + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming mode */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); + + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + #endif /* !NO_PKCS7_STREAM */ + XFREE(output, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } /* Pass in bad args. */ - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(NULL, hashBuf, hashSz, outputHead, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(NULL, hashBuf, hashSz, outputHead, &outputHeadSz, outputFoot, &outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, NULL, hashSz, outputHead, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, NULL, hashSz, outputHead, &outputHeadSz, outputFoot, &outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, 0, outputHead, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, 0, outputHead, &outputHeadSz, outputFoot, &outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, NULL, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, NULL, &outputHeadSz, outputFoot, &outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, outputHead, NULL, outputFoot, &outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, outputHead, &outputHeadSz, NULL, &outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, outputHead, &outputHeadSz, outputFoot, NULL), BAD_FUNC_ARG); - pkcs7->hashOID = 0; /* bad hashOID */ - AssertIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, + if (pkcs7 != NULL) { + pkcs7->hashOID = 0; /* bad hashOID */ + } + ExpectIntEQ(wc_PKCS7_EncodeSignedData_ex(pkcs7, hashBuf, hashSz, outputHead, &outputHeadSz, outputFoot, &outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(NULL, hashBuf, hashSz, outputHead, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(NULL, hashBuf, hashSz, outputHead, outputHeadSz, outputFoot, outputFootSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, NULL, hashSz, outputHead, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, NULL, hashSz, outputHead, outputHeadSz, outputFoot, outputFootSz), BAD_FUNC_ARG); #ifndef NO_PKCS7_STREAM - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, 0, outputHead, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, 0, outputHead, outputHeadSz, outputFoot, outputFootSz), WC_PKCS7_WANT_READ_E); #else - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, 0, outputHead, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, 0, outputHead, outputHeadSz, outputFoot, outputFootSz), BUFFER_E); #endif - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, NULL, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, NULL, outputHeadSz, outputFoot, outputFootSz), BAD_FUNC_ARG); #ifndef NO_PKCS7_STREAM /* can pass in 0 buffer length with streaming API */ - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, outputHead, 0, outputFoot, outputFootSz), WC_PKCS7_WANT_READ_E); #else - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, outputHead, 0, outputFoot, outputFootSz), BAD_FUNC_ARG); #endif - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, outputHead, outputHeadSz, NULL, outputFootSz), BAD_FUNC_ARG); #ifndef NO_PKCS7_STREAM - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, outputHead, outputHeadSz, outputFoot, 0), WC_PKCS7_WANT_READ_E); #else - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, outputHead, outputHeadSz, outputFoot, 0), BUFFER_E); #endif wc_PKCS7_Free(pkcs7); - wc_FreeRng(&rng); - - res = TEST_RES_CHECK(1); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_PKCS7_EncodeSignedData_ex */ @@ -29560,8 +37884,9 @@ byte* cert, word32* certSz, byte* key, word32* keySz) { + EXPECT_DECLS; int ret = 0; - FILE* fp = NULL; + XFILE fp = XBADFILE; #ifndef NO_RSA const char* intCARootRSA = "./certs/ca-cert.der"; @@ -29600,35 +37925,45 @@ #ifndef NO_RSA case RSA_TYPE: if (useIntermediateCertChain == 1) { - fp = XFOPEN(intCARootRSA, "rb"); - AssertNotNull(fp); + ExpectTrue((fp = XFOPEN(intCARootRSA, "rb")) != XBADFILE); *intCARootSz = (word32)XFREAD(intCARoot, 1, *intCARootSz, fp); - XFCLOSE(fp); - AssertIntGT(*intCARootSz, 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*intCARootSz, 0); - fp = XFOPEN(intCA1RSA, "rb"); - AssertNotNull(fp); - *intCA1Sz = (word32)XFREAD(intCA1, 1, *intCA1Sz, fp); - XFCLOSE(fp); - AssertIntGT(*intCA1Sz, 0); + ExpectTrue((fp = XFOPEN(intCA1RSA, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *intCA1Sz = (word32)XFREAD(intCA1, 1, *intCA1Sz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*intCA1Sz, 0); - fp = XFOPEN(intCA2RSA, "rb"); - AssertNotNull(fp); - *intCA2Sz = (word32)XFREAD(intCA2, 1, *intCA2Sz, fp); - XFCLOSE(fp); - AssertIntGT(*intCA2Sz, 0); + ExpectTrue((fp = XFOPEN(intCA2RSA, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *intCA2Sz = (word32)XFREAD(intCA2, 1, *intCA2Sz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*intCA2Sz, 0); - fp = XFOPEN(intServCertRSA, "rb"); - AssertNotNull(fp); - *certSz = (word32)XFREAD(cert, 1, *certSz, fp); - XFCLOSE(fp); - AssertIntGT(*certSz, 0); + ExpectTrue((fp = XFOPEN(intServCertRSA, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *certSz = (word32)XFREAD(cert, 1, *certSz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*certSz, 0); - fp = XFOPEN(intServKeyRSA, "rb"); - AssertNotNull(fp); - *keySz = (word32)XFREAD(key, 1, *keySz, fp); - XFCLOSE(fp); - AssertIntGT(*keySz, 0); + ExpectTrue((fp = XFOPEN(intServKeyRSA, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *keySz = (word32)XFREAD(key, 1, *keySz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*keySz, 0); } else { #if defined(USE_CERT_BUFFERS_2048) @@ -29642,17 +37977,21 @@ XMEMCPY(key, client_key_der_1024, *keySz); XMEMCPY(cert, client_cert_der_1024, *certSz); #else - fp = XFOPEN(cli1024Key, "rb"); - AssertNotNull(fp); - *keySz = (word32)XFREAD(key, 1, *keySz, fp); - XFCLOSE(fp); - AssertIntGT(*keySz, 0); + ExpectTrue((fp = XFOPEN(cli1024Key, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *keySz = (word32)XFREAD(key, 1, *keySz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*keySz, 0); - fp = XFOPEN(cli1024Cert, "rb"); - AssertNotNull(fp); - *certSz = (word32)XFREAD(cert, 1, *certSz, fp); - XFCLOSE(fp); - AssertIntGT(*certSz, 0); + ExpectTrue((fp = XFOPEN(cli1024Cert, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *certSz = (word32)XFREAD(cert, 1, *certSz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*certSz, 0); #endif /* USE_CERT_BUFFERS_2048 */ } break; @@ -29660,35 +37999,46 @@ #ifdef HAVE_ECC case ECC_TYPE: if (useIntermediateCertChain == 1) { - fp = XFOPEN(intCARootECC, "rb"); - AssertNotNull(fp); - *intCARootSz = (word32)XFREAD(intCARoot, 1, *intCARootSz, fp); - XFCLOSE(fp); - AssertIntGT(*intCARootSz, 0); + ExpectTrue((fp = XFOPEN(intCARootECC, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *intCARootSz = (word32)XFREAD(intCARoot, 1, *intCARootSz, + fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*intCARootSz, 0); - fp = XFOPEN(intCA1ECC, "rb"); - AssertNotNull(fp); - *intCA1Sz = (word32)XFREAD(intCA1, 1, *intCA1Sz, fp); - XFCLOSE(fp); - AssertIntGT(*intCA1Sz, 0); + ExpectTrue((fp = XFOPEN(intCA1ECC, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *intCA1Sz = (word32)XFREAD(intCA1, 1, *intCA1Sz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*intCA1Sz, 0); - fp = XFOPEN(intCA2ECC, "rb"); - AssertNotNull(fp); - *intCA2Sz = (word32)XFREAD(intCA2, 1, *intCA2Sz, fp); - XFCLOSE(fp); - AssertIntGT(*intCA2Sz, 0); + ExpectTrue((fp = XFOPEN(intCA2ECC, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *intCA2Sz = (word32)XFREAD(intCA2, 1, *intCA2Sz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*intCA2Sz, 0); - fp = XFOPEN(intServCertECC, "rb"); - AssertNotNull(fp); - *certSz = (word32)XFREAD(cert, 1, *certSz, fp); - XFCLOSE(fp); - AssertIntGT(*certSz, 0); + ExpectTrue((fp = XFOPEN(intServCertECC, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *certSz = (word32)XFREAD(cert, 1, *certSz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*certSz, 0); - fp = XFOPEN(intServKeyECC, "rb"); - AssertNotNull(fp); - *keySz = (word32)XFREAD(key, 1, *keySz, fp); - XFCLOSE(fp); - AssertIntGT(*keySz, 0); + ExpectTrue((fp = XFOPEN(intServKeyECC, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *keySz = (word32)XFREAD(key, 1, *keySz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*keySz, 0); } else { #if defined(USE_CERT_BUFFERS_256) @@ -29697,17 +38047,21 @@ XMEMCPY(key, ecc_clikey_der_256, *keySz); XMEMCPY(cert, cliecc_cert_der_256, *certSz); #else - fp = XFOPEN(cliEccKey, "rb"); - AssertNotNull(fp); - *keySz = (word32)XFREAD(key, 1, *keySz, fp); - XFCLOSE(fp); - AssertIntGT(*keySz, 0); + ExpectTrue((fp = XFOPEN(cliEccKey, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *keySz = (word32)XFREAD(key, 1, *keySz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*keySz, 0); - fp = XFOPEN(cliEccCert, "rb"); - AssertNotNull(fp); - *certSz = (word32)XFREAD(cert, 1, *certSz, fp); - XFCLOSE(fp); - AssertIntGT(*certSz, 0); + ExpectTrue((fp = XFOPEN(cliEccCert, "rb")) != XBADFILE); + if (fp != XBADFILE) { + *certSz = (word32)XFREAD(cert, 1, *certSz, fp); + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntGT(*certSz, 0); #endif /* USE_CERT_BUFFERS_256 */ } break; @@ -29718,6 +38072,9 @@ break; } + if (EXPECT_FAIL() && (ret == 0)) { + ret = BAD_FUNC_ARG; + } return ret; } @@ -29741,6 +38098,7 @@ int useIntermediateCertChain, int pkAlgoType) { + EXPECT_DECLS; int ret = 0; WC_RNG rng; PKCS7* pkcs7 = NULL; @@ -29777,62 +38135,68 @@ ret = LoadPKCS7SignedDataCerts(useIntermediateCertChain, pkAlgoType, intCARoot, &intCARootSz, intCA1, &intCA1Sz, intCA2, &intCA2Sz, cert, &certSz, key, &keySz); - AssertIntEQ(ret, 0); + ExpectIntEQ(ret, 0); XMEMSET(output, 0, outputSz); - AssertIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); if (useIntermediateCertChain == 1) { /* Add intermediate and root CA certs into SignedData Certs SET */ - AssertIntEQ(wc_PKCS7_AddCertificate(pkcs7, intCA2, intCA2Sz), 0); - AssertIntEQ(wc_PKCS7_AddCertificate(pkcs7, intCA1, intCA1Sz), 0); - AssertIntEQ(wc_PKCS7_AddCertificate(pkcs7, intCARoot, intCARootSz), 0); + ExpectIntEQ(wc_PKCS7_AddCertificate(pkcs7, intCA2, intCA2Sz), 0); + ExpectIntEQ(wc_PKCS7_AddCertificate(pkcs7, intCA1, intCA1Sz), 0); + ExpectIntEQ(wc_PKCS7_AddCertificate(pkcs7, intCARoot, intCARootSz), 0); } - pkcs7->content = data; - pkcs7->contentSz = dataSz; - pkcs7->privateKey = key; - pkcs7->privateKeySz = (word32)sizeof(key); - if (pkAlgoType == RSA_TYPE) { - pkcs7->encryptOID = RSAk; - } - else { - pkcs7->encryptOID = ECDSAk; - } -#ifdef NO_SHA - pkcs7->hashOID = SHA256h; -#else - pkcs7->hashOID = SHAh; -#endif - pkcs7->rng = &rng; - if (withAttribs) { - /* include a signed attribute */ - pkcs7->signedAttribs = attribs; - pkcs7->signedAttribsSz = (sizeof(attribs)/sizeof(PKCS7Attrib)); + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = dataSz; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + if (pkAlgoType == RSA_TYPE) { + pkcs7->encryptOID = RSAk; + } + else { + pkcs7->encryptOID = ECDSAk; + } + #ifdef NO_SHA + pkcs7->hashOID = SHA256h; + #else + pkcs7->hashOID = SHAh; + #endif + pkcs7->rng = &rng; + if (withAttribs) { + /* include a signed attribute */ + pkcs7->signedAttribs = attribs; + pkcs7->signedAttribsSz = (sizeof(attribs)/sizeof(PKCS7Attrib)); + } } if (detachedSig) { - AssertIntEQ(wc_PKCS7_SetDetached(pkcs7, 1), 0); + ExpectIntEQ(wc_PKCS7_SetDetached(pkcs7, 1), 0); } - outputSz = wc_PKCS7_EncodeSignedData(pkcs7, output, outputSz); - AssertIntGT(outputSz, 0); + outputSz = wc_PKCS7_EncodeSignedData(pkcs7, output, (word32)outputSz); + ExpectIntGT(outputSz, 0); wc_PKCS7_Free(pkcs7); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - if (detachedSig) { + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (detachedSig && (pkcs7 != NULL)) { pkcs7->content = data; pkcs7->contentSz = dataSz; } - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, (word32)outputSz), 0); wc_PKCS7_Free(pkcs7); wc_FreeRng(&rng); + if (EXPECT_FAIL()) { + outputSz = 0; + } return outputSz; } #endif @@ -29840,31 +38204,27 @@ /* * Testing wc_PKCS_VerifySignedData() */ -static int test_wc_PKCS7_VerifySignedData(void) +static int test_wc_PKCS7_VerifySignedData_RSA(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) - PKCS7* pkcs7; + EXPECT_DECLS; +#if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) + PKCS7* pkcs7 = NULL; byte output[6000]; /* Large size needed for bundles with int CA certs */ word32 outputSz = sizeof(output); byte data[] = "Test data to encode."; byte badOut[1]; word32 badOutSz = 0; byte badContent[] = "This is different content than was signed"; - - int ret; - wc_HashAlg hash; + wc_HashAlg hash; #ifdef NO_SHA enum wc_HashType hashType = WC_HASH_TYPE_SHA256; #else enum wc_HashType hashType = WC_HASH_TYPE_SHA; #endif byte hashBuf[WC_MAX_DIGEST_SIZE]; - word32 hashSz = wc_HashGetDigestSize(hashType); - + word32 hashSz = (word32)wc_HashGetDigestSize(hashType); #ifndef NO_RSA PKCS7DecodedAttrib* decodedAttrib = NULL; - /* contentType OID (1.2.840.113549.1.9.3) */ static const byte contentTypeOid[] = { 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xF7, 0x0d, 0x01, 0x09, 0x03 }; @@ -29876,13 +38236,11 @@ /* messageDigest OID (1.2.840.113549.1.9.4) */ static const byte messageDigestOid[] = { 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x04 }; - #ifndef NO_ASN_TIME /* signingTime OID () */ static const byte signingTimeOid[] = { 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05}; #endif - #if !defined(NO_ASN) && !defined(NO_ASN_TIME) int dateLength = 0; byte dateFormat; @@ -29895,228 +38253,521 @@ struct tm* tmpTime = &tmpTimeStorage; #endif #endif /* !NO_ASN && !NO_ASN_TIME */ +#ifndef NO_PKCS7_STREAM + word32 z; + int ret; +#endif /* !NO_PKCS7_STREAM */ + + XMEMSET(&hash, 0, sizeof(wc_HashAlg)); /* Success test with RSA certs/key */ - AssertIntGT((outputSz = CreatePKCS7SignedData(output, outputSz, data, - (word32)sizeof(data), - 0, 0, 0, RSA_TYPE)), 0); + ExpectIntGT((outputSz = (word32)CreatePKCS7SignedData(output, (int)outputSz, data, + (word32)sizeof(data), 0, 0, 0, RSA_TYPE)), 0); /* calculate hash for content, used later */ - ret = wc_HashInit(&hash, hashType); - if (ret == 0) { - ret = wc_HashUpdate(&hash, hashType, data, sizeof(data)); - if (ret == 0) { - ret = wc_HashFinal(&hash, hashType, hashBuf); + ExpectIntEQ(wc_HashInit(&hash, hashType), 0); + ExpectIntEQ(wc_HashUpdate(&hash, hashType, data, sizeof(data)), 0); + ExpectIntEQ(wc_HashFinal(&hash, hashType, hashBuf), 0); + DoExpectIntEQ(wc_HashFree(&hash, hashType), 0); + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + +#ifndef NO_PKCS7_STREAM + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); } - wc_HashFree(&hash, hashType); } - AssertIntEQ(ret, 0); - - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); +#endif /* !NO_PKCS7_STREAM */ /* Check that decoded signed attributes are correct */ /* messageDigest should be first */ - decodedAttrib = pkcs7->decodedAttrib; - AssertNotNull(decodedAttrib); - AssertIntEQ(decodedAttrib->oidSz, (word32)sizeof(messageDigestOid)); - AssertIntEQ(XMEMCMP(decodedAttrib->oid, messageDigestOid, - decodedAttrib->oidSz), 0); + if (pkcs7 != NULL) { + decodedAttrib = pkcs7->decodedAttrib; + } + ExpectNotNull(decodedAttrib); + ExpectIntEQ(decodedAttrib->oidSz, (word32)sizeof(messageDigestOid)); + ExpectIntEQ(XMEMCMP(decodedAttrib->oid, messageDigestOid, + decodedAttrib->oidSz), 0); /* + 2 for OCTET STRING and length bytes */ - AssertIntEQ(decodedAttrib->valueSz, hashSz + 2); - AssertNotNull(decodedAttrib->value); - AssertIntEQ(XMEMCMP(decodedAttrib->value + 2, hashBuf, hashSz), 0); + ExpectIntEQ(decodedAttrib->valueSz, hashSz + 2); + ExpectNotNull(decodedAttrib->value); + ExpectIntEQ(XMEMCMP(decodedAttrib->value + 2, hashBuf, hashSz), 0); #ifndef NO_ASN_TIME /* signingTime should be second */ - decodedAttrib = decodedAttrib->next; - AssertNotNull(decodedAttrib); - AssertIntEQ(decodedAttrib->oidSz, (word32)sizeof(signingTimeOid)); - AssertIntEQ(XMEMCMP(decodedAttrib->oid, signingTimeOid, - decodedAttrib->oidSz), 0); + if (decodedAttrib != NULL) { + decodedAttrib = decodedAttrib->next; + } + ExpectNotNull(decodedAttrib); + ExpectIntEQ(decodedAttrib->oidSz, (word32)sizeof(signingTimeOid)); + ExpectIntEQ(XMEMCMP(decodedAttrib->oid, signingTimeOid, + decodedAttrib->oidSz), 0); - AssertIntGT(decodedAttrib->valueSz, 0); - AssertNotNull(decodedAttrib->value); + ExpectIntGT(decodedAttrib->valueSz, 0); + ExpectNotNull(decodedAttrib->value); #endif /* Verify signingTime if ASN and time are available */ #if !defined(NO_ASN) && !defined(NO_ASN_TIME) - AssertIntEQ(wc_GetDateInfo(decodedAttrib->value, decodedAttrib->valueSz, - &datePart, &dateFormat, &dateLength), 0); - AssertNotNull(datePart); - AssertIntGT(dateLength, 0); + ExpectIntEQ(wc_GetDateInfo(decodedAttrib->value, decodedAttrib->valueSz, + &datePart, &dateFormat, &dateLength), 0); + ExpectNotNull(datePart); + ExpectIntGT(dateLength, 0); XMEMSET(&timearg, 0, sizeof(timearg)); - AssertIntEQ(wc_GetDateAsCalendarTime(datePart, dateLength, dateFormat, - &timearg), 0); + ExpectIntEQ(wc_GetDateAsCalendarTime(datePart, dateLength, dateFormat, + &timearg), 0); /* Get current time and compare year/month/day against attribute value */ - AssertIntEQ(wc_GetTime(&now, sizeof(now)), 0); + ExpectIntEQ(wc_GetTime(&now, sizeof(now)), 0); nowTm = (struct tm*)XGMTIME((time_t*)&now, tmpTime); - AssertNotNull(nowTm); + ExpectNotNull(nowTm); - AssertIntEQ(timearg.tm_year, nowTm->tm_year); - AssertIntEQ(timearg.tm_mon, nowTm->tm_mon); - AssertIntEQ(timearg.tm_mday, nowTm->tm_mday); + ExpectIntEQ(timearg.tm_year, nowTm->tm_year); + ExpectIntEQ(timearg.tm_mon, nowTm->tm_mon); + ExpectIntEQ(timearg.tm_mday, nowTm->tm_mday); #endif /* !NO_ASN && !NO_ASN_TIME */ /* contentType should be third */ - decodedAttrib = decodedAttrib->next; - AssertNotNull(decodedAttrib); - AssertIntEQ(decodedAttrib->oidSz, (word32)sizeof(contentTypeOid)); - AssertIntEQ(XMEMCMP(decodedAttrib->oid, contentTypeOid, - decodedAttrib->oidSz), 0); - AssertIntEQ(decodedAttrib->valueSz, (int)sizeof(dataType) + 2); - AssertNotNull(decodedAttrib->value); - AssertIntEQ(XMEMCMP(decodedAttrib->value + 2, dataType, - sizeof(dataType)), 0); + if (decodedAttrib != NULL) { + decodedAttrib = decodedAttrib->next; + } + ExpectNotNull(decodedAttrib); + ExpectIntEQ(decodedAttrib->oidSz, (word32)sizeof(contentTypeOid)); + ExpectIntEQ(XMEMCMP(decodedAttrib->oid, contentTypeOid, + decodedAttrib->oidSz), 0); + ExpectIntEQ(decodedAttrib->valueSz, (int)sizeof(dataType) + 2); + ExpectNotNull(decodedAttrib->value); + ExpectIntEQ(XMEMCMP(decodedAttrib->value + 2, dataType, sizeof(dataType)), + 0); #endif /* !NO_RSA */ -#ifdef HAVE_ECC - #ifndef NO_RSA - wc_PKCS7_Free(pkcs7); - #endif - - /* Success test with ECC certs/key */ - outputSz = sizeof(output); - XMEMSET(output, 0, outputSz); - AssertIntGT((outputSz = CreatePKCS7SignedData(output, outputSz, data, - (word32)sizeof(data), - 0, 0, 0, ECC_TYPE)), 0); - - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); -#endif /* HAVE_ECC */ - /* Test bad args. */ -#if !defined(NO_RSA) || defined(HAVE_ECC) - AssertIntEQ(wc_PKCS7_VerifySignedData(NULL, output, outputSz), + ExpectIntEQ(wc_PKCS7_VerifySignedData(NULL, output, outputSz), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, NULL, outputSz), + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, NULL, outputSz), BAD_FUNC_ARG); #ifndef NO_PKCS7_STREAM /* can pass in 0 buffer length with streaming API */ - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, badOut, + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, badOut, badOutSz), WC_PKCS7_WANT_READ_E); #else - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, badOut, + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, badOut, badOutSz), BAD_FUNC_ARG); #endif wc_PKCS7_Free(pkcs7); -#endif /* !NO_RSA || HAVE_ECC */ + pkcs7 = NULL; - /* Invalid content should error, use detached signature so we can - * easily change content */ #ifndef NO_RSA /* Try RSA certs/key/sig first */ outputSz = sizeof(output); XMEMSET(output, 0, outputSz); - AssertIntGT((outputSz = CreatePKCS7SignedData(output, outputSz, data, + ExpectIntGT((outputSz = (word32)CreatePKCS7SignedData(output, (int)outputSz, data, (word32)sizeof(data), 1, 1, 0, RSA_TYPE)), 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - pkcs7->content = badContent; - pkcs7->contentSz = sizeof(badContent); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = badContent; + pkcs7->contentSz = sizeof(badContent); + } + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), SIG_VERIFY_E); + + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = badContent; + pkcs7->contentSz = sizeof(badContent); + } + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret == WC_PKCS7_WANT_READ_E){ + continue; + } + else if (ret < 0) { + break; + } + } + ExpectIntEQ(ret, SIG_VERIFY_E); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ + /* Test success case with detached signature and valid content */ - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - pkcs7->content = data; - pkcs7->contentSz = sizeof(data); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = sizeof(data); + } + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = sizeof(data); + } + + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ /* verify using pre-computed content digest only (no content) */ { - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, - output, outputSz, - NULL, 0), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + output, outputSz, NULL, 0), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; } #endif /* !NO_RSA */ -#ifdef HAVE_ECC - /* Try ECC certs/key/sig next */ + + /* Test verify on signedData containing intermediate/root CA certs */ +#ifndef NO_RSA outputSz = sizeof(output); XMEMSET(output, 0, outputSz); - AssertIntGT((outputSz = CreatePKCS7SignedData(output, outputSz, data, + ExpectIntGT((outputSz = (word32)CreatePKCS7SignedData(output, (int)outputSz, data, (word32)sizeof(data), - 1, 1, 0, ECC_TYPE)), 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - pkcs7->content = badContent; - pkcs7->contentSz = sizeof(badContent); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), - SIG_VERIFY_E); + 0, 0, 1, RSA_TYPE)), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); - /* Test success case with detached signature and valid content */ - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - pkcs7->content = data; - pkcs7->contentSz = sizeof(data); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ - /* verify using pre-computed content digest only (no content) */ +#endif /* !NO_RSA */ +#if defined(ASN_BER_TO_DER) && !defined(NO_PKCS7_STREAM) && \ + !defined(NO_FILESYSTEM) { - /* calculate hash for content */ - ret = wc_HashInit(&hash, hashType); - if (ret == 0) { - ret = wc_HashUpdate(&hash, hashType, data, sizeof(data)); - if (ret == 0) { - ret = wc_HashFinal(&hash, hashType, hashBuf); + XFILE signedBundle = XBADFILE; + int signedBundleSz = 0; + int chunkSz = 1; + int i, rc = 0; + byte* buf = NULL; + + ExpectTrue((signedBundle = XFOPEN("./certs/test-stream-sign.p7b", + "rb")) != XBADFILE); + ExpectTrue(XFSEEK(signedBundle, 0, XSEEK_END) == 0); + ExpectIntGT(signedBundleSz = (int)XFTELL(signedBundle), 0); + ExpectTrue(XFSEEK(signedBundle, 0, XSEEK_SET) == 0); + ExpectNotNull(buf = (byte*)XMALLOC(signedBundleSz, HEAP_HINT, + DYNAMIC_TYPE_FILE)); + if (buf != NULL) { + ExpectIntEQ(XFREAD(buf, 1, (size_t)signedBundleSz, signedBundle), + signedBundleSz); + } + if (signedBundle != XBADFILE) { + XFCLOSE(signedBundle); + signedBundle = XBADFILE; + } + + if (buf != NULL) { + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + for (i = 0; i < signedBundleSz;) { + int sz = (i + chunkSz > signedBundleSz)? signedBundleSz - i : + chunkSz; + rc = wc_PKCS7_VerifySignedData(pkcs7, buf + i, (word32)sz); + if (rc < 0 ) { + if (rc == WC_PKCS7_WANT_READ_E) { + i += sz; + continue; + } + break; + } + else { + break; + } } - wc_HashFree(&hash, hashType); + ExpectIntEQ(rc, PKCS7_SIGNEEDS_CHECK); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; } - AssertIntEQ(ret, 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, - output, outputSz, - NULL, 0), 0); - wc_PKCS7_Free(pkcs7); + /* now try with malformed bundle */ + if (buf != NULL) { + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + buf[signedBundleSz - 2] = buf[signedBundleSz - 2] + 1; + for (i = 0; i < signedBundleSz;) { + int sz = (i + chunkSz > signedBundleSz)? signedBundleSz - i : + chunkSz; + rc = wc_PKCS7_VerifySignedData(pkcs7, buf + i, (word32)sz); + if (rc < 0 ) { + if (rc == WC_PKCS7_WANT_READ_E) { + i += sz; + continue; + } + break; + } + else { + break; + } + } + ExpectIntEQ(rc, ASN_PARSE_E); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + } + + if (buf != NULL) + XFREE(buf, HEAP_HINT, DYNAMIC_TYPE_FILE); } +#endif /* BER and stream */ #endif + return EXPECT_RESULT(); +} /* END test_wc_PKCS7_VerifySignedData()_RSA */ - /* Test verify on signedData containing intermediate/root CA certs */ -#ifndef NO_RSA +/* + * Testing wc_PKCS_VerifySignedData() + */ +static int test_wc_PKCS7_VerifySignedData_ECC(void) +{ + EXPECT_DECLS; +#if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && defined(HAVE_ECC) + PKCS7* pkcs7 = NULL; + byte output[6000]; /* Large size needed for bundles with int CA certs */ + word32 outputSz = sizeof(output); + byte data[] = "Test data to encode."; + byte badContent[] = "This is different content than was signed"; + wc_HashAlg hash; +#ifndef NO_PKCS7_STREAM + word32 z; + int ret; +#endif /* !NO_PKCS7_STREAM */ +#ifdef NO_SHA + enum wc_HashType hashType = WC_HASH_TYPE_SHA256; +#else + enum wc_HashType hashType = WC_HASH_TYPE_SHA; +#endif + byte hashBuf[WC_MAX_DIGEST_SIZE]; + word32 hashSz = (word32)wc_HashGetDigestSize(hashType); + + XMEMSET(&hash, 0, sizeof(wc_HashAlg)); + + /* Success test with ECC certs/key */ outputSz = sizeof(output); XMEMSET(output, 0, outputSz); - AssertIntGT((outputSz = CreatePKCS7SignedData(output, outputSz, data, - (word32)sizeof(data), - 0, 0, 1, RSA_TYPE)), 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + ExpectIntGT((outputSz = (word32)CreatePKCS7SignedData(output, (int)outputSz, data, + (word32)sizeof(data), 0, 0, 0, ECC_TYPE)), 0); + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); wc_PKCS7_Free(pkcs7); -#endif /* !NO_RSA */ -#ifdef HAVE_ECC + pkcs7 = NULL; + +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ + + /* Invalid content should error, use detached signature so we can + * easily change content */ outputSz = sizeof(output); XMEMSET(output, 0, outputSz); - AssertIntGT((outputSz = CreatePKCS7SignedData(output, outputSz, data, - (word32)sizeof(data), - 0, 0, 1, ECC_TYPE)), 0); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + ExpectIntGT((outputSz = (word32)CreatePKCS7SignedData(output, (int)outputSz, data, + (word32)sizeof(data), 1, 1, 0, ECC_TYPE)), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = badContent; + pkcs7->contentSz = sizeof(badContent); + } + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), + SIG_VERIFY_E); wc_PKCS7_Free(pkcs7); -#endif /* HAVE_ECC */ + pkcs7 = NULL; + +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = badContent; + pkcs7->contentSz = sizeof(badContent); + } + + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret == WC_PKCS7_WANT_READ_E){ + continue; + } + else if (ret < 0) { + break; + } + } + ExpectIntEQ(ret, SIG_VERIFY_E); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ + + + /* Test success case with detached signature and valid content */ + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = sizeof(data); + } + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + if (pkcs7 != NULL) { + pkcs7->content = data; + pkcs7->contentSz = sizeof(data); + } + + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); + + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ + + /* verify using pre-computed content digest only (no content) */ + { + /* calculate hash for content */ + ExpectIntEQ(wc_HashInit(&hash, hashType), 0); + ExpectIntEQ(wc_HashUpdate(&hash, hashType, data, sizeof(data)), 0); + ExpectIntEQ(wc_HashFinal(&hash, hashType, hashBuf), 0); + ExpectIntEQ(wc_HashFree(&hash, hashType), 0); + + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData_ex(pkcs7, hashBuf, hashSz, + output, outputSz, NULL, 0), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + } + + /* Test verify on signedData containing intermediate/root CA certs */ + outputSz = sizeof(output); + XMEMSET(output, 0, outputSz); + ExpectIntGT((outputSz = (word32)CreatePKCS7SignedData(output, (int)outputSz, data, + (word32)sizeof(data), 0, 0, 1, ECC_TYPE)), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, output, outputSz), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming */ + ret = -1; + for (z = 0; z < outputSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, output + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectIntNE(pkcs7->contentSz, 0); + ExpectNotNull(pkcs7->contentDynamic); + + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ - res = TEST_RES_CHECK(1); #endif - return res; -} /* END test_wc_PKCS7_VerifySignedData() */ + return EXPECT_RESULT(); +} /* END test_wc_PKCS7_VerifySignedData_ECC() */ #if defined(HAVE_PKCS7) && !defined(NO_AES) && defined(HAVE_AES_CBC) && \ @@ -30158,7 +38809,7 @@ if (ret == 0) { ret = wc_AesSetKey(&aes, (byte*)usrCtx, 32, iv, AES_DECRYPTION); if (ret == 0) - ret = wc_AesCbcDecrypt(&aes, out, in, inSz); + ret = wc_AesCbcDecrypt(&aes, out, in, (word32)inSz); wc_AesFree(&aes); } @@ -30178,6 +38829,14 @@ { int ret = -1; + (void)cekSz; + (void)cek; + (void)outSz; + (void)keyIdSz; + (void)direction; + (void)orginKey; /* used with KAKRI */ + (void)orginKeySz; + if (out == NULL) return BAD_FUNC_ARG; @@ -30209,15 +38868,6 @@ WOLFSSL_MSG("Unsupported key wrap algorithm in example"); return BAD_KEYWRAP_ALG_E; }; - - (void)cekSz; - (void)cek; - (void)outSz; - (void)keyIdSz; - (void)direction; - (void)orginKey; /* used with KAKRI */ - (void)orginKeySz; - return ret; } #endif /* HAVE_PKCS7 && !NO_AES && HAVE_AES_CBC && !NO_AES_256 */ @@ -30227,9 +38877,12 @@ */ static int test_wc_PKCS7_EncodeDecodeEnvelopedData(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) - PKCS7* pkcs7; + PKCS7* pkcs7 = NULL; +#ifdef ASN_BER_TO_DER + int encodedSz = 0; +#endif #ifdef ECC_TIMING_RESISTANT WC_RNG rng; #endif @@ -30240,7 +38893,6 @@ int testSz = 0; #if !defined(NO_RSA) && (!defined(NO_AES) || (!defined(NO_SHA) || \ !defined(NO_SHA256) || defined(WOLFSSL_SHA512))) - byte* rsaCert = NULL; byte* rsaPrivKey = NULL; word32 rsaCertSz; @@ -30255,7 +38907,6 @@ #endif #if defined(HAVE_ECC) && (!defined(NO_AES) || (!defined(NO_SHA) ||\ !defined(NO_SHA256) || defined(WOLFSSL_SHA512))) - byte* eccCert = NULL; byte* eccPrivKey = NULL; word32 eccCertSz; @@ -30270,8 +38921,12 @@ byte decoded[sizeof(input)/sizeof(char)]; int decodedSz = 0; #ifndef NO_FILESYSTEM - XFILE certFile; - XFILE keyFile; + XFILE certFile = XBADFILE; + XFILE keyFile = XBADFILE; +#endif + +#ifdef ECC_TIMING_RESISTANT + XMEMSET(&rng, 0, sizeof(WC_RNG)); #endif #if !defined(NO_RSA) && (!defined(NO_AES) || (!defined(NO_SHA) ||\ @@ -30280,43 +38935,51 @@ #if defined(USE_CERT_BUFFERS_1024) rsaCertSz = (word32)sizeof_client_cert_der_1024; /* Allocate buffer space. */ - AssertNotNull(rsaCert = - (byte*)XMALLOC(rsaCertSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); + ExpectNotNull(rsaCert = (byte*)XMALLOC(rsaCertSz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); /* Init buffer. */ - XMEMCPY(rsaCert, client_cert_der_1024, rsaCertSz); + if (rsaCert != NULL) { + XMEMCPY(rsaCert, client_cert_der_1024, rsaCertSz); + } rsaPrivKeySz = (word32)sizeof_client_key_der_1024; - AssertNotNull(rsaPrivKey = (byte*)XMALLOC(rsaPrivKeySz, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER)); - XMEMCPY(rsaPrivKey, client_key_der_1024, rsaPrivKeySz); - + ExpectNotNull(rsaPrivKey = (byte*)XMALLOC(rsaPrivKeySz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (rsaPrivKey != NULL) { + XMEMCPY(rsaPrivKey, client_key_der_1024, rsaPrivKeySz); + } #elif defined(USE_CERT_BUFFERS_2048) rsaCertSz = (word32)sizeof_client_cert_der_2048; /* Allocate buffer */ - AssertNotNull(rsaCert = - (byte*)XMALLOC(rsaCertSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); + ExpectNotNull(rsaCert = (byte*)XMALLOC(rsaCertSz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); /* Init buffer. */ - XMEMCPY(rsaCert, client_cert_der_2048, rsaCertSz); + if (rsaCert != NULL) { + XMEMCPY(rsaCert, client_cert_der_2048, rsaCertSz); + } rsaPrivKeySz = (word32)sizeof_client_key_der_2048; - AssertNotNull(rsaPrivKey = (byte*)XMALLOC(rsaPrivKeySz, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER)); - XMEMCPY(rsaPrivKey, client_key_der_2048, rsaPrivKeySz); - + ExpectNotNull(rsaPrivKey = (byte*)XMALLOC(rsaPrivKeySz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (rsaPrivKey != NULL) { + XMEMCPY(rsaPrivKey, client_key_der_2048, rsaPrivKeySz); + } #else /* File system. */ - certFile = XFOPEN(rsaClientCert, "rb"); - AssertTrue(certFile != XBADFILE); + ExpectTrue((certFile = XFOPEN(rsaClientCert, "rb")) != XBADFILE); rsaCertSz = (word32)FOURK_BUF; - AssertNotNull(rsaCert = - (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - rsaCertSz = (word32)XFREAD(rsaCert, 1, rsaCertSz, certFile); - XFCLOSE(certFile); - keyFile = XFOPEN(rsaClientKey, "rb"); - AssertTrue(keyFile != XBADFILE); - AssertNotNull(rsaPrivKey = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER)); + ExpectNotNull(rsaCert = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectTrue((rsaCertSz = (word32)XFREAD(rsaCert, 1, rsaCertSz, + certFile)) > 0); + if (certFile != XBADFILE) + XFCLOSE(certFile); + ExpectTrue((keyFile = XFOPEN(rsaClientKey, "rb")) != XBADFILE); + ExpectNotNull(rsaPrivKey = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); rsaPrivKeySz = (word32)FOURK_BUF; - rsaPrivKeySz = (word32)XFREAD(rsaPrivKey, 1, rsaPrivKeySz, keyFile); - XFCLOSE(keyFile); + ExpectTrue((rsaPrivKeySz = (word32)XFREAD(rsaPrivKey, 1, rsaPrivKeySz, + keyFile)) > 0); + if (keyFile != XBADFILE) + XFCLOSE(keyFile); #endif /* USE_CERT_BUFFERS */ #endif /* NO_RSA */ @@ -30325,30 +38988,38 @@ !defined(NO_SHA256) || defined(WOLFSSL_SHA512))) #ifdef USE_CERT_BUFFERS_256 - AssertNotNull(eccCert = - (byte*)XMALLOC(TWOK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); + ExpectNotNull(eccCert = (byte*)XMALLOC(TWOK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); /* Init buffer. */ eccCertSz = (word32)sizeof_cliecc_cert_der_256; - XMEMCPY(eccCert, cliecc_cert_der_256, eccCertSz); - AssertNotNull(eccPrivKey = (byte*)XMALLOC(TWOK_BUF, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER)); + if (eccCert != NULL) { + XMEMCPY(eccCert, cliecc_cert_der_256, eccCertSz); + } + ExpectNotNull(eccPrivKey = (byte*)XMALLOC(TWOK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); eccPrivKeySz = (word32)sizeof_ecc_clikey_der_256; - XMEMCPY(eccPrivKey, ecc_clikey_der_256, eccPrivKeySz); + if (eccPrivKey != NULL) { + XMEMCPY(eccPrivKey, ecc_clikey_der_256, eccPrivKeySz); + } #else /* File system. */ - certFile = XFOPEN(eccClientCert, "rb"); - AssertTrue(certFile != XBADFILE); + ExpectTrue((certFile = XFOPEN(eccClientCert, "rb")) != XBADFILE); eccCertSz = (word32)FOURK_BUF; - AssertNotNull(eccCert = - (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - eccCertSz = (word32)XFREAD(eccCert, 1, eccCertSz, certFile); - XFCLOSE(certFile); - keyFile = XFOPEN(eccClientKey, "rb"); - AssertTrue(keyFile != XBADFILE); + ExpectNotNull(eccCert = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectTrue((eccCertSz = (word32)XFREAD(eccCert, 1, eccCertSz, + certFile)) > 0); + if (certFile != XBADFILE) { + XFCLOSE(certFile); + } + ExpectTrue((keyFile = XFOPEN(eccClientKey, "rb")) != XBADFILE); eccPrivKeySz = (word32)FOURK_BUF; - AssertNotNull(eccPrivKey = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER)); - eccPrivKeySz = (word32)XFREAD(eccPrivKey, 1, eccPrivKeySz, keyFile); - XFCLOSE(keyFile); + ExpectNotNull(eccPrivKey = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectTrue((eccPrivKeySz = (word32)XFREAD(eccPrivKey, 1, eccPrivKeySz, + keyFile)) > 0); + if (keyFile != XBADFILE) { + XFCLOSE(keyFile); + } #endif /* USE_CERT_BUFFERS_256 */ #endif /* END HAVE_ECC */ @@ -30385,198 +39056,321 @@ #if defined(HAVE_ECC) #if !defined(NO_AES) && defined(HAVE_AES_CBC) #if !defined(NO_SHA) && !defined(NO_AES_128) - {(byte*)input, (word32)(sizeof(input)/sizeof(char)), DATA, AES128CBCb, - AES128_WRAP, dhSinglePass_stdDH_sha1kdf_scheme, eccCert, - eccCertSz, eccPrivKey, eccPrivKeySz}, + {(byte*)input, (word32)(sizeof(input)/sizeof(char)), DATA, + AES128CBCb, AES128_WRAP, dhSinglePass_stdDH_sha1kdf_scheme, + eccCert, eccCertSz, eccPrivKey, eccPrivKeySz}, #endif #if !defined(NO_SHA256) && !defined(NO_AES_256) - {(byte*)input, (word32)(sizeof(input)/sizeof(char)), DATA, AES256CBCb, - AES256_WRAP, dhSinglePass_stdDH_sha256kdf_scheme, eccCert, - eccCertSz, eccPrivKey, eccPrivKeySz}, + {(byte*)input, (word32)(sizeof(input)/sizeof(char)), DATA, + AES256CBCb, AES256_WRAP, dhSinglePass_stdDH_sha256kdf_scheme, + eccCert, eccCertSz, eccPrivKey, eccPrivKeySz}, #endif #if defined(WOLFSSL_SHA512) && !defined(NO_AES_256) - {(byte*)input, (word32)(sizeof(input)/sizeof(char)), DATA, AES256CBCb, - AES256_WRAP, dhSinglePass_stdDH_sha512kdf_scheme, eccCert, - eccCertSz, eccPrivKey, eccPrivKeySz}, + {(byte*)input, (word32)(sizeof(input)/sizeof(char)), DATA, + AES256CBCb, AES256_WRAP, dhSinglePass_stdDH_sha512kdf_scheme, + eccCert, eccCertSz, eccPrivKey, eccPrivKeySz}, #endif #endif /* NO_AES && HAVE_AES_CBC*/ #endif /* END HAVE_ECC */ }; /* END pkcs7EnvelopedVector */ #ifdef ECC_TIMING_RESISTANT - AssertIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); #endif - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); testSz = (int)sizeof(testVectors)/(int)sizeof(pkcs7EnvelopedVector); for (i = 0; i < testSz; i++) { - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, (testVectors + i)->cert, + #ifdef ASN_BER_TO_DER + encodeSignedDataStream strm; + + /* test setting stream mode, the first one using IO callbacks */ + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (testVectors + i)->cert, + (word32)(testVectors + i)->certSz), 0); + if (pkcs7 != NULL) { + #ifdef ECC_TIMING_RESISTANT + pkcs7->rng = &rng; + #endif + + if (i != 0) + pkcs7->content = (byte*)(testVectors + i)->content; + pkcs7->contentSz = (testVectors + i)->contentSz; + pkcs7->contentOID = (testVectors + i)->contentOID; + pkcs7->encryptOID = (testVectors + i)->encryptOID; + pkcs7->keyWrapOID = (testVectors + i)->keyWrapOID; + pkcs7->keyAgreeOID = (testVectors + i)->keyAgreeOID; + pkcs7->privateKey = (testVectors + i)->privateKey; + pkcs7->privateKeySz = (testVectors + i)->privateKeySz; + } + + if (i == 0) { + XMEMSET(&strm, 0, sizeof(strm)); + ExpectIntEQ(wc_PKCS7_SetStreamMode(pkcs7, 1, GetContentCB, + StreamOutputCB, (void*)&strm), 0); + encodedSz = wc_PKCS7_EncodeEnvelopedData(pkcs7, NULL, 0); + } + else { + ExpectIntEQ(wc_PKCS7_SetStreamMode(pkcs7, 1, NULL, NULL, NULL), 0); + encodedSz = wc_PKCS7_EncodeEnvelopedData(pkcs7, output, + (word32)sizeof(output)); + } + + switch ((testVectors + i)->encryptOID) { + #ifndef NO_DES3 + case DES3b: + case DESb: + ExpectIntEQ(encodedSz, BAD_FUNC_ARG); + break; + #endif + #ifdef HAVE_AESCCM + #ifdef WOLFSSL_AES_128 + case AES128CCMb: + ExpectIntEQ(encodedSz, BAD_FUNC_ARG); + break; + #endif + #ifdef WOLFSSL_AES_192 + case AES192CCMb: + ExpectIntEQ(encodedSz, BAD_FUNC_ARG); + break; + #endif + #ifdef WOLFSSL_AES_256 + case AES256CCMb: + ExpectIntEQ(encodedSz, BAD_FUNC_ARG); + break; + #endif + #endif + default: + ExpectIntGE(encodedSz, 0); + } + + if (encodedSz > 0) { + if (i == 0) { + decodedSz = wc_PKCS7_DecodeEnvelopedData(pkcs7, + strm.out, (word32)encodedSz, decoded, + (word32)sizeof(decoded)); + } + else { + decodedSz = wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)encodedSz, decoded, (word32)sizeof(decoded)); + } + ExpectIntGE(decodedSz, 0); + /* Verify the size of each buffer. */ + ExpectIntEQ((word32)sizeof(input)/sizeof(char), decodedSz); + } + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + #endif + + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (testVectors + i)->cert, (word32)(testVectors + i)->certSz), 0); + if (pkcs7 != NULL) { #ifdef ECC_TIMING_RESISTANT - pkcs7->rng = &rng; + pkcs7->rng = &rng; #endif - pkcs7->content = (byte*)(testVectors + i)->content; - pkcs7->contentSz = (testVectors + i)->contentSz; - pkcs7->contentOID = (testVectors + i)->contentOID; - pkcs7->encryptOID = (testVectors + i)->encryptOID; - pkcs7->keyWrapOID = (testVectors + i)->keyWrapOID; - pkcs7->keyAgreeOID = (testVectors + i)->keyAgreeOID; - pkcs7->privateKey = (testVectors + i)->privateKey; - pkcs7->privateKeySz = (testVectors + i)->privateKeySz; + pkcs7->content = (byte*)(testVectors + i)->content; + pkcs7->contentSz = (testVectors + i)->contentSz; + pkcs7->contentOID = (testVectors + i)->contentOID; + pkcs7->encryptOID = (testVectors + i)->encryptOID; + pkcs7->keyWrapOID = (testVectors + i)->keyWrapOID; + pkcs7->keyAgreeOID = (testVectors + i)->keyAgreeOID; + pkcs7->privateKey = (testVectors + i)->privateKey; + pkcs7->privateKeySz = (testVectors + i)->privateKeySz; + } + + #ifdef ASN_BER_TO_DER + /* test without setting stream mode */ + ExpectIntEQ(wc_PKCS7_GetStreamMode(pkcs7), 0); + #endif - AssertIntGE(wc_PKCS7_EncodeEnvelopedData(pkcs7, output, - (word32)sizeof(output)), 0); + ExpectIntGE(wc_PKCS7_EncodeEnvelopedData(pkcs7, output, + (word32)sizeof(output)), 0); decodedSz = wc_PKCS7_DecodeEnvelopedData(pkcs7, output, - (word32)sizeof(output), decoded, (word32)sizeof(decoded)); - AssertIntGE(decodedSz, 0); + (word32)sizeof(output), decoded, (word32)sizeof(decoded)); + ExpectIntGE(decodedSz, 0); /* Verify the size of each buffer. */ - AssertIntEQ((word32)sizeof(input)/sizeof(char), decodedSz); + ExpectIntEQ((word32)sizeof(input)/sizeof(char), decodedSz); + /* Don't free the last time through the loop. */ if (i < testSz - 1) { wc_PKCS7_Free(pkcs7); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); } } /* END test loop. */ } /* Test bad args. */ - AssertIntEQ(wc_PKCS7_EncodeEnvelopedData(NULL, output, + ExpectIntEQ(wc_PKCS7_EncodeEnvelopedData(NULL, output, (word32)sizeof(output)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeEnvelopedData(pkcs7, NULL, + ExpectIntEQ(wc_PKCS7_EncodeEnvelopedData(pkcs7, NULL, (word32)sizeof(output)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeEnvelopedData(pkcs7, output, 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_EncodeEnvelopedData(pkcs7, output, 0), BAD_FUNC_ARG); /* Decode. */ - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(NULL, output, - (word32)sizeof(output), decoded, (word32)sizeof(decoded)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(NULL, output, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, (word32)sizeof(output), NULL, (word32)sizeof(decoded)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, (word32)sizeof(output), decoded, 0), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, NULL, - (word32)sizeof(output), decoded, (word32)sizeof(decoded)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, 0, decoded, + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, NULL, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, 0, decoded, (word32)sizeof(decoded)), BAD_FUNC_ARG); /* Should get a return of BAD_FUNC_ARG with structure data. Order matters.*/ #if defined(HAVE_ECC) && !defined(NO_AES) && defined(HAVE_AES_CBC) /* only a failure for KARI test cases */ - tempWrd32 = pkcs7->singleCertSz; - pkcs7->singleCertSz = 0; - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, - (word32)sizeof(output), decoded, (word32)sizeof(decoded)), BAD_FUNC_ARG); - pkcs7->singleCertSz = tempWrd32; - - tmpBytePtr = pkcs7->singleCert; - pkcs7->singleCert = NULL; - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, - (word32)sizeof(output), decoded, (word32)sizeof(decoded)), BAD_FUNC_ARG); - pkcs7->singleCert = tmpBytePtr; -#endif - tempWrd32 = pkcs7->privateKeySz; - pkcs7->privateKeySz = 0; - - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, - (word32)sizeof(output), decoded, (word32)sizeof(decoded)), BAD_FUNC_ARG); - pkcs7->privateKeySz = tempWrd32; - - tmpBytePtr = pkcs7->privateKey; - pkcs7->privateKey = NULL; - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, - (word32)sizeof(output), decoded, (word32)sizeof(decoded)), BAD_FUNC_ARG); - pkcs7->privateKey = tmpBytePtr; + if (pkcs7 != NULL) { + tempWrd32 = pkcs7->singleCertSz; + pkcs7->singleCertSz = 0; + } + #if defined(WOLFSSL_ASN_TEMPLATE) + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + BUFFER_E); + #else + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + ASN_PARSE_E); + #endif + if (pkcs7 != NULL) { + pkcs7->singleCertSz = tempWrd32; + + tmpBytePtr = pkcs7->singleCert; + pkcs7->singleCert = NULL; + } + #ifndef NO_RSA + #if defined(NO_PKCS7_STREAM) + /* when none streaming mode is used and PKCS7 is in bad state buffer error + * is returned from kari parse which gets set to bad func arg */ + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + BAD_FUNC_ARG); + #else + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + ASN_PARSE_E); + #endif + #endif /* !NO_RSA */ + if (pkcs7 != NULL) { + pkcs7->singleCert = tmpBytePtr; + } +#endif + if (pkcs7 != NULL) { + tempWrd32 = pkcs7->privateKeySz; + pkcs7->privateKeySz = 0; + } + + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->privateKeySz = tempWrd32; + + tmpBytePtr = pkcs7->privateKey; + pkcs7->privateKey = NULL; + } + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)sizeof(output), decoded, (word32)sizeof(decoded)), + BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->privateKey = tmpBytePtr; + } wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; #if !defined(NO_AES) && defined(HAVE_AES_CBC) && !defined(NO_AES_256) /* test of decrypt callback with KEKRI enveloped data */ { - int envelopedSz; + int envelopedSz = 0; const byte keyId[] = { 0x00 }; - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - pkcs7->content = (byte*)input; - pkcs7->contentSz = (word32)(sizeof(input)/sizeof(char)); - pkcs7->contentOID = DATA; - pkcs7->encryptOID = AES256CBCb; - AssertIntGT(wc_PKCS7_AddRecipient_KEKRI(pkcs7, AES256_WRAP, + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + if (pkcs7 != NULL) { + pkcs7->content = (byte*)input; + pkcs7->contentSz = (word32)(sizeof(input)/sizeof(char)); + pkcs7->contentOID = DATA; + pkcs7->encryptOID = AES256CBCb; + } + ExpectIntGT(wc_PKCS7_AddRecipient_KEKRI(pkcs7, AES256_WRAP, (byte*)defKey, sizeof(defKey), (byte*)keyId, sizeof(keyId), NULL, NULL, 0, NULL, 0, 0), 0); - AssertIntEQ(wc_PKCS7_SetSignerIdentifierType(pkcs7, CMS_SKID), 0); - AssertIntGT((envelopedSz = wc_PKCS7_EncodeEnvelopedData(pkcs7, output, + ExpectIntEQ(wc_PKCS7_SetSignerIdentifierType(pkcs7, CMS_SKID), 0); + ExpectIntGT((envelopedSz = wc_PKCS7_EncodeEnvelopedData(pkcs7, output, (word32)sizeof(output))), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; /* decode envelopedData */ - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_SetWrapCEKCb(pkcs7, myCEKwrapFunc), 0); - AssertIntEQ(wc_PKCS7_SetDecodeEncryptedCb(pkcs7, myDecryptionFunc), 0); - AssertIntGT((decodedSz = wc_PKCS7_DecodeEnvelopedData(pkcs7, output, - envelopedSz, decoded, sizeof(decoded))), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_SetWrapCEKCb(pkcs7, myCEKwrapFunc), 0); + ExpectIntEQ(wc_PKCS7_SetDecodeEncryptedCb(pkcs7, myDecryptionFunc), 0); + ExpectIntGT((decodedSz = wc_PKCS7_DecodeEnvelopedData(pkcs7, output, + (word32)envelopedSz, decoded, sizeof(decoded))), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; } #endif /* !NO_AES && !NO_AES_256 */ #ifndef NO_RSA - if (rsaCert) { - XFREE(rsaCert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - } - if (rsaPrivKey) { - XFREE(rsaPrivKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - } -#endif /*NO_RSA */ + XFREE(rsaCert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(rsaPrivKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif /* NO_RSA */ #ifdef HAVE_ECC - if (eccCert) { - XFREE(eccCert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - } - if (eccPrivKey) { - XFREE(eccPrivKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - } + XFREE(eccCert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(eccPrivKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #endif /* HAVE_ECC */ #ifdef ECC_TIMING_RESISTANT - wc_FreeRng(&rng); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif #if defined(USE_CERT_BUFFERS_2048) && !defined(NO_DES3) && \ !defined(NO_RSA) && !defined(NO_SHA) { byte out[7]; - byte *cms; + byte *cms = NULL; word32 cmsSz; - XFILE cmsFile; + XFILE cmsFile = XBADFILE; XMEMSET(out, 0, sizeof(out)); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - cmsFile = XFOPEN("./certs/test/ktri-keyid-cms.msg", "rb"); - AssertTrue(cmsFile != XBADFILE); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectTrue((cmsFile = XFOPEN("./certs/test/ktri-keyid-cms.msg", "rb")) + != XBADFILE); cmsSz = (word32)FOURK_BUF; - AssertNotNull(cms = - (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - cmsSz = (word32)XFREAD(cms, 1, cmsSz, cmsFile); - XFCLOSE(cmsFile); - - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)client_cert_der_2048, - sizeof_client_cert_der_2048), 0); - pkcs7->privateKey = (byte*)client_key_der_2048; - pkcs7->privateKeySz = sizeof_client_key_der_2048; - AssertIntLT(wc_PKCS7_DecodeEnvelopedData(pkcs7, cms, cmsSz, out, - 2), 0); - AssertIntGT(wc_PKCS7_DecodeEnvelopedData(pkcs7, cms, cmsSz, out, - sizeof(out)), 0); + ExpectNotNull(cms = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectTrue((cmsSz = (word32)XFREAD(cms, 1, cmsSz, cmsFile)) > 0); + if (cmsFile != XBADFILE) + XFCLOSE(cmsFile); + + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)client_cert_der_2048, + sizeof_client_cert_der_2048), 0); + if (pkcs7 != NULL) { + pkcs7->privateKey = (byte*)client_key_der_2048; + pkcs7->privateKeySz = sizeof_client_key_der_2048; + } + ExpectIntLT(wc_PKCS7_DecodeEnvelopedData(pkcs7, cms, cmsSz, out, + 2), 0); + ExpectIntGT(wc_PKCS7_DecodeEnvelopedData(pkcs7, cms, cmsSz, out, + sizeof(out)), 0); XFREE(cms, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - AssertIntEQ(XMEMCMP(out, "test", 4), 0); + ExpectIntEQ(XMEMCMP(out, "test", 4), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; } #endif /* USE_CERT_BUFFERS_2048 && !NO_DES3 && !NO_RSA && !NO_SHA */ - - res = TEST_RES_CHECK(1); #endif /* HAVE_PKCS7 */ - return res; -} /* END test_wc_PKCS7_EncodeEnvelopedData() */ + return EXPECT_RESULT(); +} /* END test_wc_PKCS7_EncodeDecodeEnvelopedData() */ /* @@ -30584,7 +39378,7 @@ */ static int test_wc_PKCS7_EncodeEncryptedData(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_PKCS7_ENCRYPTED_DATA) PKCS7* pkcs7 = NULL; byte* tmpBytePtr = NULL; @@ -30592,16 +39386,14 @@ byte decoded[TWOK_BUF]; word32 tmpWrd32 = 0; int tmpInt = 0; - int decodedSz; - int encryptedSz; - int testSz; - int i; - + int decodedSz = 0; + int encryptedSz = 0; + int testSz = 0; + int i = 0; const byte data[] = { /* Hello World */ 0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f, 0x72,0x6c,0x64 }; - #ifndef NO_DES3 byte desKey[] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef @@ -30612,7 +39404,6 @@ 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; #endif - #if !defined(NO_AES) && defined(HAVE_AES_CBC) #ifndef NO_AES_128 byte aes128Key[] = { @@ -30665,95 +39456,111 @@ testSz = sizeof(testVectors) / sizeof(pkcs7EncryptedVector); for (i = 0; i < testSz; i++) { - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); - pkcs7->content = (byte*)testVectors[i].content; - pkcs7->contentSz = testVectors[i].contentSz; - pkcs7->contentOID = testVectors[i].contentOID; - pkcs7->encryptOID = testVectors[i].encryptOID; - pkcs7->encryptionKey = testVectors[i].encryptionKey; - pkcs7->encryptionKeySz = testVectors[i].encryptionKeySz; - pkcs7->heap = HEAP_HINT; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); + if (pkcs7 != NULL) { + pkcs7->content = (byte*)testVectors[i].content; + pkcs7->contentSz = testVectors[i].contentSz; + pkcs7->contentOID = testVectors[i].contentOID; + pkcs7->encryptOID = testVectors[i].encryptOID; + pkcs7->encryptionKey = testVectors[i].encryptionKey; + pkcs7->encryptionKeySz = testVectors[i].encryptionKeySz; + pkcs7->heap = HEAP_HINT; + } /* encode encryptedData */ - encryptedSz = wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, - sizeof(encrypted)); - AssertIntGT(encryptedSz, 0); + ExpectIntGT(encryptedSz = wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, + sizeof(encrypted)), 0); /* Decode encryptedData */ - decodedSz = wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, encryptedSz, - decoded, sizeof(decoded)); + ExpectIntGT(decodedSz = wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, + (word32)encryptedSz, decoded, sizeof(decoded)), 0); - AssertIntEQ(XMEMCMP(decoded, data, decodedSz), 0); + ExpectIntEQ(XMEMCMP(decoded, data, decodedSz), 0); /* Keep values for last itr. */ if (i < testSz - 1) { wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; } } if (pkcs7 == NULL || testSz == 0) { - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); } - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(NULL, encrypted, - sizeof(encrypted)),BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, NULL, - sizeof(encrypted)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, - 0), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(NULL, encrypted, + sizeof(encrypted)),BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, NULL, + sizeof(encrypted)), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, + 0), BAD_FUNC_ARG); /* Testing the struct. */ - tmpBytePtr = pkcs7->content; - pkcs7->content = NULL; - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, - sizeof(encrypted)), BAD_FUNC_ARG); - pkcs7->content = tmpBytePtr; - tmpWrd32 = pkcs7->contentSz; - pkcs7->contentSz = 0; - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, - sizeof(encrypted)), BAD_FUNC_ARG); - pkcs7->contentSz = tmpWrd32; - tmpInt = pkcs7->encryptOID; - pkcs7->encryptOID = 0; - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, - sizeof(encrypted)), BAD_FUNC_ARG); - pkcs7->encryptOID = tmpInt; - tmpBytePtr = pkcs7->encryptionKey; - pkcs7->encryptionKey = NULL; - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, - sizeof(encrypted)), BAD_FUNC_ARG); - pkcs7->encryptionKey = tmpBytePtr; - tmpWrd32 = pkcs7->encryptionKeySz; - pkcs7->encryptionKeySz = 0; - AssertIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, - sizeof(encrypted)), BAD_FUNC_ARG); - pkcs7->encryptionKeySz = tmpWrd32; - - AssertIntEQ(wc_PKCS7_DecodeEncryptedData(NULL, encrypted, encryptedSz, - decoded, sizeof(decoded)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, NULL, encryptedSz, - decoded, sizeof(decoded)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, 0, - decoded, sizeof(decoded)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, encryptedSz, - NULL, sizeof(decoded)), BAD_FUNC_ARG); - AssertIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, encryptedSz, - decoded, 0), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + tmpBytePtr = pkcs7->content; + pkcs7->content = NULL; + } + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, + sizeof(encrypted)), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->content = tmpBytePtr; + tmpWrd32 = pkcs7->contentSz; + pkcs7->contentSz = 0; + } + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, + sizeof(encrypted)), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->contentSz = tmpWrd32; + tmpInt = pkcs7->encryptOID; + pkcs7->encryptOID = 0; + } + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, + sizeof(encrypted)), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->encryptOID = tmpInt; + tmpBytePtr = pkcs7->encryptionKey; + pkcs7->encryptionKey = NULL; + } + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, + sizeof(encrypted)), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->encryptionKey = tmpBytePtr; + tmpWrd32 = pkcs7->encryptionKeySz; + pkcs7->encryptionKeySz = 0; + } + ExpectIntEQ(wc_PKCS7_EncodeEncryptedData(pkcs7, encrypted, + sizeof(encrypted)), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->encryptionKeySz = tmpWrd32; + } + + ExpectIntEQ(wc_PKCS7_DecodeEncryptedData(NULL, encrypted, (word32)encryptedSz, + decoded, sizeof(decoded)), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, NULL, (word32)encryptedSz, + decoded, sizeof(decoded)), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, 0, + decoded, sizeof(decoded)), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, (word32)encryptedSz, + NULL, sizeof(decoded)), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, (word32)encryptedSz, + decoded, 0), BAD_FUNC_ARG); /* Test struct fields */ - tmpBytePtr = pkcs7->encryptionKey; - pkcs7->encryptionKey = NULL; - AssertIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, encryptedSz, - decoded, sizeof(decoded)), BAD_FUNC_ARG); - pkcs7->encryptionKey = tmpBytePtr; - pkcs7->encryptionKeySz = 0; - AssertIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, encryptedSz, - decoded, sizeof(decoded)), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + tmpBytePtr = pkcs7->encryptionKey; + pkcs7->encryptionKey = NULL; + } + ExpectIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, (word32)encryptedSz, + decoded, sizeof(decoded)), BAD_FUNC_ARG); + if (pkcs7 != NULL) { + pkcs7->encryptionKey = tmpBytePtr; + pkcs7->encryptionKeySz = 0; + } + ExpectIntEQ(wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, (word32)encryptedSz, + decoded, sizeof(decoded)), BAD_FUNC_ARG); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_PKCS7_EncodeEncryptedData() */ /* @@ -30761,42 +39568,84 @@ */ static int test_wc_PKCS7_Degenerate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) - PKCS7* pkcs7; + PKCS7* pkcs7 = NULL; char fName[] = "./certs/test-degenerate.p7b"; - XFILE f; + XFILE f = XBADFILE; byte der[4096]; - word32 derSz; - int ret; - - AssertNotNull(f = XFOPEN(fName, "rb")); - AssertIntGT((ret = (int)fread(der, 1, sizeof(der), f)), 0); - derSz = (word32)ret; - XFCLOSE(f); + word32 derSz = 0; +#ifndef NO_PKCS7_STREAM + word32 z; + int ret; +#endif /* !NO_PKCS7_STREAM */ + ExpectTrue((f = XFOPEN(fName, "rb")) != XBADFILE); + ExpectTrue((derSz = (word32)XFREAD(der, 1, sizeof(der), f)) > 0); + if (f != XBADFILE) + XFCLOSE(f); /* test degenerate success */ - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); #ifndef NO_RSA - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); + + #ifndef NO_PKCS7_STREAM + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming */ + ret = -1; + for (z = 0; z < derSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, der + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + #endif /* !NO_PKCS7_STREAM */ #else - AssertIntNE(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); -#endif + ExpectIntNE(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); +#endif /* NO_RSA */ wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; /* test with turning off degenerate cases */ - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); wc_PKCS7_AllowDegenerate(pkcs7, 0); /* override allowing degenerate case */ - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), PKCS7_NO_SIGNER_E); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), + PKCS7_NO_SIGNER_E); + + #ifndef NO_PKCS7_STREAM wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + wc_PKCS7_AllowDegenerate(pkcs7, 0); /* override allowing degenerate case */ - res = TEST_RES_CHECK(1); + /* test for streaming */ + ret = -1; + for (z = 0; z < derSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, der + z, 1); + if (ret == WC_PKCS7_WANT_READ_E){ + continue; + } + else + break; + } + ExpectIntEQ(ret, PKCS7_NO_SIGNER_E); + #endif /* !NO_PKCS7_STREAM */ + + wc_PKCS7_Free(pkcs7); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_PKCS7_Degenerate() */ #if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && \ @@ -30999,167 +39848,215 @@ */ static int test_wc_PKCS7_BER(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && \ !defined(NO_SHA) && defined(ASN_BER_TO_DER) - PKCS7* pkcs7; + PKCS7* pkcs7 = NULL; char fName[] = "./certs/test-ber-exp02-05-2022.p7b"; - XFILE f; + XFILE f = XBADFILE; byte der[4096]; #ifndef NO_DES3 byte decoded[2048]; #endif - word32 derSz; - int ret; + word32 derSz = 0; +#ifndef NO_PKCS7_STREAM + word32 z; + int ret; +#endif /* !NO_PKCS7_STREAM */ - AssertNotNull(f = XFOPEN(fName, "rb")); - AssertIntGT((ret = (int)fread(der, 1, sizeof(der), f)), 0); - derSz = (word32)ret; - XFCLOSE(f); + ExpectTrue((f = XFOPEN(fName, "rb")) != XBADFILE); + ExpectTrue((derSz = (word32)XFREAD(der, 1, sizeof(der), f)) > 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); #ifndef NO_RSA - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); + + #ifndef NO_PKCS7_STREAM + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + + /* test for streaming */ + ret = -1; + for (z = 0; z < derSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, der + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + #endif /* !NO_PKCS7_STREAM */ #else - AssertIntNE(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); + ExpectIntNE(wc_PKCS7_VerifySignedData(pkcs7, der, derSz), 0); #endif wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; #ifndef NO_DES3 /* decode BER content */ - AssertNotNull(f = XFOPEN("./certs/1024/client-cert.der", "rb")); - AssertIntGT((ret = (int)fread(der, 1, sizeof(der), f)), 0); - derSz = (word32)ret; - XFCLOSE(f); - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectTrue((f = XFOPEN("./certs/1024/client-cert.der", "rb")) != XBADFILE); + ExpectTrue((derSz = (word32)XFREAD(der, 1, sizeof(der), f)) > 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); #ifndef NO_RSA - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, der, derSz), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, der, derSz), 0); #else - AssertIntNE(wc_PKCS7_InitWithCert(pkcs7, der, derSz), 0); + ExpectIntNE(wc_PKCS7_InitWithCert(pkcs7, der, derSz), 0); #endif - AssertNotNull(f = XFOPEN("./certs/1024/client-key.der", "rb")); - AssertIntGT((ret = (int)fread(der, 1, sizeof(der), f)), 0); - derSz = (word32)ret; - XFCLOSE(f); - pkcs7->privateKey = der; - pkcs7->privateKeySz = derSz; + ExpectTrue((f = XFOPEN("./certs/1024/client-key.der", "rb")) != XBADFILE); + ExpectTrue((derSz = (word32)XFREAD(der, 1, sizeof(der), f)) > 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } + if (pkcs7 != NULL) { + pkcs7->privateKey = der; + pkcs7->privateKeySz = derSz; + } #ifndef NO_RSA #ifdef WOLFSSL_SP_MATH - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, berContent, + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, berContent, sizeof(berContent), decoded, sizeof(decoded)), WC_KEY_SIZE_E); #else - AssertIntGT(wc_PKCS7_DecodeEnvelopedData(pkcs7, berContent, + ExpectIntGT(wc_PKCS7_DecodeEnvelopedData(pkcs7, berContent, sizeof(berContent), decoded, sizeof(decoded)), 0); #endif #else - AssertIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, berContent, + ExpectIntEQ(wc_PKCS7_DecodeEnvelopedData(pkcs7, berContent, sizeof(berContent), decoded, sizeof(decoded)), NOT_COMPILED_IN); #endif wc_PKCS7_Free(pkcs7); #endif /* !NO_DES3 */ - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_PKCS7_BER() */ -static int test_PKCS7_signed_enveloped(void) +static int test_wc_PKCS7_signed_enveloped(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_RSA) && !defined(NO_AES) && \ !defined(NO_FILESYSTEM) - XFILE f; - PKCS7* pkcs7; + XFILE f = XBADFILE; + PKCS7* pkcs7 = NULL; #ifdef HAVE_AES_CBC - PKCS7* inner; + PKCS7* inner = NULL; #endif - void* pt; WC_RNG rng; unsigned char key[FOURK_BUF/2]; unsigned char cert[FOURK_BUF/2]; unsigned char env[FOURK_BUF]; int envSz = FOURK_BUF; - int keySz; - int certSz; - + int keySz = 0; + int certSz = 0; unsigned char sig[FOURK_BUF * 2]; int sigSz = FOURK_BUF * 2; #ifdef HAVE_AES_CBC unsigned char decoded[FOURK_BUF]; int decodedSz = FOURK_BUF; #endif +#ifndef NO_PKCS7_STREAM + int z; + int ret; +#endif /* !NO_PKCS7_STREAM */ + + XMEMSET(&rng, 0, sizeof(WC_RNG)); /* load cert */ - AssertNotNull(f = XFOPEN(cliCertDerFile, "rb")); - AssertIntGT((certSz = (int)XFREAD(cert, 1, sizeof(cert), f)), 0); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(cliCertDerFile, "rb")) != XBADFILE); + ExpectIntGT((certSz = (int)XFREAD(cert, 1, sizeof(cert), f)), 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } /* load key */ - AssertNotNull(f = XFOPEN(cliKeyFile, "rb")); - AssertIntGT((keySz = (int)XFREAD(key, 1, sizeof(key), f)), 0); - XFCLOSE(f); - keySz = wolfSSL_KeyPemToDer(key, keySz, key, keySz, NULL); + ExpectTrue((f = XFOPEN(cliKeyFile, "rb")) != XBADFILE); + ExpectIntGT((keySz = (int)XFREAD(key, 1, sizeof(key), f)), 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } + ExpectIntGT(keySz = wolfSSL_KeyPemToDer(key, keySz, key, keySz, NULL), 0); /* sign cert for envelope */ - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_InitRng(&rng), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); - pkcs7->content = cert; - pkcs7->contentSz = certSz; - pkcs7->contentOID = DATA; - pkcs7->privateKey = key; - pkcs7->privateKeySz = keySz; - pkcs7->encryptOID = RSAk; - pkcs7->hashOID = SHA256h; - pkcs7->rng = &rng; - AssertIntGT((sigSz = wc_PKCS7_EncodeSignedData(pkcs7, sig, sigSz)), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, (word32)certSz), 0); + if (pkcs7 != NULL) { + pkcs7->content = cert; + pkcs7->contentSz = (word32)certSz; + pkcs7->contentOID = DATA; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)keySz; + pkcs7->encryptOID = RSAk; + pkcs7->hashOID = SHA256h; + pkcs7->rng = &rng; + } + ExpectIntGT((sigSz = wc_PKCS7_EncodeSignedData(pkcs7, sig, (word32)sigSz)), 0); wc_PKCS7_Free(pkcs7); - wc_FreeRng(&rng); + pkcs7 = NULL; + DoExpectIntEQ(wc_FreeRng(&rng), 0); #ifdef HAVE_AES_CBC /* create envelope */ - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); - pkcs7->content = sig; - pkcs7->contentSz = sigSz; - pkcs7->contentOID = DATA; - pkcs7->encryptOID = AES256CBCb; - pkcs7->privateKey = key; - pkcs7->privateKeySz = keySz; - AssertIntGT((envSz = wc_PKCS7_EncodeEnvelopedData(pkcs7, env, envSz)), 0); - AssertIntLT(wc_PKCS7_EncodeEnvelopedData(pkcs7, env, 2), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, (word32)certSz), 0); + if (pkcs7 != NULL) { + pkcs7->content = sig; + pkcs7->contentSz = (word32)sigSz; + pkcs7->contentOID = DATA; + pkcs7->encryptOID = AES256CBCb; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)keySz; + } + ExpectIntGT((envSz = wc_PKCS7_EncodeEnvelopedData(pkcs7, env, (word32)envSz)), 0); + ExpectIntLT(wc_PKCS7_EncodeEnvelopedData(pkcs7, env, 2), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; #endif /* create bad signed enveloped data */ sigSz = FOURK_BUF * 2; - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_InitRng(&rng), 0); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); - pkcs7->content = env; - pkcs7->contentSz = envSz; - pkcs7->contentOID = DATA; - pkcs7->privateKey = key; - pkcs7->privateKeySz = keySz; - pkcs7->encryptOID = RSAk; - pkcs7->hashOID = SHA256h; - pkcs7->rng = &rng; - - /* Set no certs in bundle for this test. Hang on to the pointer though to - * free it later. */ - pt = (void*)pkcs7->certList; - pkcs7->certList = NULL; /* no certs in bundle */ - AssertIntGT((sigSz = wc_PKCS7_EncodeSignedData(pkcs7, sig, sigSz)), 0); - pkcs7->certList = (Pkcs7Cert*)pt; /* restore pointer for PKCS7 free call */ + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, (word32)certSz), 0); + if (pkcs7 != NULL) { + pkcs7->content = env; + pkcs7->contentSz = (word32)envSz; + pkcs7->contentOID = DATA; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)keySz; + pkcs7->encryptOID = RSAk; + pkcs7->hashOID = SHA256h; + pkcs7->rng = &rng; + } + + /* Set no certs in bundle for this test. */ + if (pkcs7 != NULL) { + ExpectIntEQ(wc_PKCS7_SetNoCerts(pkcs7, 1), 0); + ExpectIntEQ(wc_PKCS7_SetNoCerts(NULL, 1), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_GetNoCerts(pkcs7), 1); + } + ExpectIntGT((sigSz = wc_PKCS7_EncodeSignedData(pkcs7, sig, (word32)sigSz)), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; /* check verify fails */ - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, sig, sigSz), + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, sig, (word32)sigSz), PKCS7_SIGNEEDS_CHECK); /* try verifying the signature manually */ @@ -31168,446 +40065,457 @@ word32 idx = 0; byte digest[MAX_SEQ_SZ + MAX_ALGO_SZ + MAX_OCTET_STR_SZ + WC_MAX_DIGEST_SIZE]; - int digestSz; + int digestSz = 0; - AssertIntEQ(wc_InitRsaKey(&rKey, HEAP_HINT), 0); - AssertIntEQ(wc_RsaPrivateKeyDecode(key, &idx, &rKey, keySz), 0); - digestSz = wc_RsaSSL_Verify(pkcs7->signature, pkcs7->signatureSz, - digest, sizeof(digest), &rKey); - AssertIntGT(digestSz, 0); - AssertIntEQ(digestSz, pkcs7->pkcs7DigestSz); - AssertIntEQ(XMEMCMP(digest, pkcs7->pkcs7Digest, digestSz), 0); - AssertIntEQ(wc_FreeRsaKey(&rKey), 0); + ExpectIntEQ(wc_InitRsaKey(&rKey, HEAP_HINT), 0); + ExpectIntEQ(wc_RsaPrivateKeyDecode(key, &idx, &rKey, (word32)keySz), 0); + ExpectIntGT(digestSz = wc_RsaSSL_Verify(pkcs7->signature, + pkcs7->signatureSz, digest, sizeof(digest), &rKey), 0); + ExpectIntEQ(digestSz, pkcs7->pkcs7DigestSz); + ExpectIntEQ(XMEMCMP(digest, pkcs7->pkcs7Digest, digestSz), 0); + ExpectIntEQ(wc_FreeRsaKey(&rKey), 0); /* verify was success */ } wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; /* initializing the PKCS7 struct with the signing certificate should pass */ - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, certSz), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, sig, sigSz), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, (word32)certSz), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, sig, (word32)sigSz), 0); + +#ifndef NO_PKCS7_STREAM wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, cert, (word32)certSz), 0); + + /* test for streaming */ + ret = -1; + for (z = 0; z < sigSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, sig + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); +#endif /* !NO_PKCS7_STREAM */ + + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; /* create valid degenerate bundle */ sigSz = FOURK_BUF * 2; - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - pkcs7->content = env; - pkcs7->contentSz = envSz; - pkcs7->contentOID = DATA; - pkcs7->privateKey = key; - pkcs7->privateKeySz = keySz; - pkcs7->encryptOID = RSAk; - pkcs7->hashOID = SHA256h; - pkcs7->rng = &rng; - AssertIntEQ(wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID), 0); - AssertIntGT((sigSz = wc_PKCS7_EncodeSignedData(pkcs7, sig, sigSz)), 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + if (pkcs7 != NULL) { + pkcs7->content = env; + pkcs7->contentSz = (word32)envSz; + pkcs7->contentOID = DATA; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)keySz; + pkcs7->encryptOID = RSAk; + pkcs7->hashOID = SHA256h; + pkcs7->rng = &rng; + } + ExpectIntEQ(wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID), 0); + ExpectIntGT((sigSz = wc_PKCS7_EncodeSignedData(pkcs7, sig, (word32)sigSz)), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; wc_FreeRng(&rng); /* check verify */ - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, sig, sigSz), 0); - AssertNotNull(pkcs7->content); + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, sig, (word32)sigSz), 0); + ExpectNotNull(pkcs7->content); + +#ifndef NO_PKCS7_STREAM + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + + /* create valid degenerate bundle */ + sigSz = FOURK_BUF * 2; + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + if (pkcs7 != NULL) { + pkcs7->content = env; + pkcs7->contentSz = (word32)envSz; + pkcs7->contentOID = DATA; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)keySz; + pkcs7->encryptOID = RSAk; + pkcs7->hashOID = SHA256h; + pkcs7->rng = &rng; + } + ExpectIntEQ(wc_PKCS7_SetSignerIdentifierType(pkcs7, DEGENERATE_SID), 0); + ExpectIntGT((sigSz = wc_PKCS7_EncodeSignedData(pkcs7, sig, (word32)sigSz)), 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; + wc_FreeRng(&rng); + + /* check verify */ + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, HEAP_HINT, testDevId), 0); + /* test for streaming */ + ret = -1; + for (z = 0; z < sigSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, sig + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); +#endif /* !NO_PKCS7_STREAM */ #ifdef HAVE_AES_CBC /* check decode */ - AssertNotNull(inner = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_PKCS7_InitWithCert(inner, cert, certSz), 0); - inner->privateKey = key; - inner->privateKeySz = keySz; - AssertIntGT((decodedSz = wc_PKCS7_DecodeEnvelopedData(inner, pkcs7->content, - pkcs7->contentSz, decoded, decodedSz)), 0); + ExpectNotNull(inner = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_InitWithCert(inner, cert, (word32)certSz), 0); + if (inner != NULL) { + inner->privateKey = key; + inner->privateKeySz = (word32)keySz; + } + ExpectIntGT((decodedSz = wc_PKCS7_DecodeEnvelopedData(inner, pkcs7->content, + pkcs7->contentSz, decoded, (word32)decodedSz)), 0); wc_PKCS7_Free(inner); + inner = NULL; #endif wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; #ifdef HAVE_AES_CBC /* check cert set */ - AssertNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(pkcs7, decoded, decodedSz), 0); - AssertNotNull(pkcs7->singleCert); - AssertIntNE(pkcs7->singleCertSz, 0); + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(pkcs7, decoded, (word32)decodedSz), 0); + ExpectNotNull(pkcs7->singleCert); + ExpectIntNE(pkcs7->singleCertSz, 0); wc_PKCS7_Free(pkcs7); -#endif + pkcs7 = NULL; - res = TEST_RES_CHECK(1); +#ifndef NO_PKCS7_STREAM + ExpectNotNull(pkcs7 = wc_PKCS7_New(NULL, 0)); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, NULL, 0), 0); + /* test for streaming */ + ret = -1; + for (z = 0; z < decodedSz && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(pkcs7, decoded + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectNotNull(pkcs7->singleCert); + ExpectIntNE(pkcs7->singleCertSz, 0); + wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; +#endif /* !NO_PKCS7_STREAM */ +#endif #endif /* HAVE_PKCS7 && !NO_RSA && !NO_AES */ - return res; + return EXPECT_RESULT(); } static int test_wc_PKCS7_NoDefaultSignedAttribs(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) \ && !defined(NO_AES) - PKCS7* pkcs7; - void* heap = NULL; - - pkcs7 = wc_PKCS7_New(heap, testDevId); - AssertNotNull(pkcs7); - AssertIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); + PKCS7* pkcs7 = NULL; + void* heap = NULL; - AssertIntEQ(wc_PKCS7_NoDefaultSignedAttribs(NULL), BAD_FUNC_ARG); + ExpectNotNull(pkcs7 = wc_PKCS7_New(heap, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); - AssertIntEQ(wc_PKCS7_NoDefaultSignedAttribs(pkcs7), 0); + ExpectIntEQ(wc_PKCS7_NoDefaultSignedAttribs(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_NoDefaultSignedAttribs(pkcs7), 0); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_PKCS7_SetOriEncryptCtx(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) \ && !defined(NO_AES) - PKCS7* pkcs7; - void* heap = NULL; - WOLFSSL_CTX* ctx; - ctx = NULL; - - pkcs7 = wc_PKCS7_New(heap, testDevId); - AssertNotNull(pkcs7); - AssertIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); + PKCS7* pkcs7 = NULL; + void* heap = NULL; + WOLFSSL_CTX* ctx = NULL; - AssertIntEQ(wc_PKCS7_SetOriEncryptCtx(NULL, ctx), BAD_FUNC_ARG); + ExpectNotNull(pkcs7 = wc_PKCS7_New(heap, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); - AssertIntEQ(wc_PKCS7_SetOriEncryptCtx(pkcs7, ctx), 0); + ExpectIntEQ(wc_PKCS7_SetOriEncryptCtx(NULL, ctx), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_SetOriEncryptCtx(pkcs7, ctx), 0); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_PKCS7_SetOriDecryptCtx(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) \ && !defined(NO_AES) - PKCS7* pkcs7; - void* heap = NULL; - WOLFSSL_CTX* ctx; - ctx = NULL; - - pkcs7 = wc_PKCS7_New(heap, testDevId); - AssertNotNull(pkcs7); - AssertIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); + PKCS7* pkcs7 = NULL; + void* heap = NULL; + WOLFSSL_CTX* ctx = NULL; - AssertIntEQ(wc_PKCS7_SetOriDecryptCtx(NULL, ctx), BAD_FUNC_ARG); + ExpectNotNull(pkcs7 = wc_PKCS7_New(heap, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(pkcs7, heap, testDevId), 0); - AssertIntEQ(wc_PKCS7_SetOriDecryptCtx(pkcs7, ctx), 0); + ExpectIntEQ(wc_PKCS7_SetOriDecryptCtx(NULL, ctx), BAD_FUNC_ARG); + ExpectIntEQ(wc_PKCS7_SetOriDecryptCtx(pkcs7, ctx), 0); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_PKCS7_DecodeCompressedData(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) \ && !defined(NO_AES) && defined(HAVE_LIBZ) - PKCS7* pkcs7; + PKCS7* pkcs7 = NULL; void* heap = NULL; byte out[4096]; - byte *decompressed; - int outSz, decompressedSz; - + byte* decompressed = NULL; + int outSz; + int decompressedSz; const char* cert = "./certs/client-cert.pem"; byte* cert_buf = NULL; size_t cert_sz = 0; - AssertIntEQ(load_file(cert, &cert_buf, &cert_sz), 0); - AssertNotNull((decompressed = - (byte*)XMALLOC(cert_sz, heap, DYNAMIC_TYPE_TMP_BUFFER))); + ExpectIntEQ(load_file(cert, &cert_buf, &cert_sz), 0); + ExpectNotNull((decompressed = (byte*)XMALLOC(cert_sz, heap, + DYNAMIC_TYPE_TMP_BUFFER))); decompressedSz = (int)cert_sz; - AssertNotNull((pkcs7 = wc_PKCS7_New(heap, testDevId))); + ExpectNotNull((pkcs7 = wc_PKCS7_New(heap, testDevId))); - pkcs7->content = (byte*)cert_buf; - pkcs7->contentSz = (word32)cert_sz; - pkcs7->contentOID = DATA; + if (pkcs7 != NULL) { + pkcs7->content = (byte*)cert_buf; + pkcs7->contentSz = (word32)cert_sz; + pkcs7->contentOID = DATA; + } - AssertIntGT((outSz = wc_PKCS7_EncodeCompressedData(pkcs7, out, - sizeof(out))), 0); + ExpectIntGT((outSz = wc_PKCS7_EncodeCompressedData(pkcs7, out, + sizeof(out))), 0); wc_PKCS7_Free(pkcs7); + pkcs7 = NULL; /* compressed key should be smaller than when started */ - AssertIntLT(outSz, cert_sz); + ExpectIntLT(outSz, cert_sz); /* test decompression */ - AssertNotNull((pkcs7 = wc_PKCS7_New(heap, testDevId))); - AssertIntEQ(pkcs7->contentOID, 0); + ExpectNotNull((pkcs7 = wc_PKCS7_New(heap, testDevId))); + ExpectIntEQ(pkcs7->contentOID, 0); /* fail case with out buffer too small */ - AssertIntLT(wc_PKCS7_DecodeCompressedData(pkcs7, out, outSz, - decompressed, outSz), 0); + ExpectIntLT(wc_PKCS7_DecodeCompressedData(pkcs7, out, outSz, + decompressed, outSz), 0); /* success case */ - AssertIntEQ(wc_PKCS7_DecodeCompressedData(pkcs7, out, outSz, - decompressed, decompressedSz), cert_sz); - AssertIntEQ(pkcs7->contentOID, DATA); - AssertIntEQ(XMEMCMP(decompressed, cert_buf, cert_sz), 0); + ExpectIntEQ(wc_PKCS7_DecodeCompressedData(pkcs7, out, outSz, + decompressed, decompressedSz), cert_sz); + ExpectIntEQ(pkcs7->contentOID, DATA); + ExpectIntEQ(XMEMCMP(decompressed, cert_buf, cert_sz), 0); XFREE(decompressed, heap, DYNAMIC_TYPE_TMP_BUFFER); decompressed = NULL; /* test decompression function with different 'max' inputs */ outSz = sizeof(out); - AssertIntGT((outSz = wc_Compress(out, outSz, cert_buf, (word32)cert_sz, 0)), - 0); - AssertIntLT(wc_DeCompressDynamic(&decompressed, 1, DYNAMIC_TYPE_TMP_BUFFER, - out, outSz, 0, heap), 0); - AssertNull(decompressed); - AssertIntGT(wc_DeCompressDynamic(&decompressed, -1, DYNAMIC_TYPE_TMP_BUFFER, - out, outSz, 0, heap), 0); - AssertNotNull(decompressed); - AssertIntEQ(XMEMCMP(decompressed, cert_buf, cert_sz), 0); + ExpectIntGT((outSz = wc_Compress(out, outSz, cert_buf, (word32)cert_sz, 0)), + 0); + ExpectIntLT(wc_DeCompressDynamic(&decompressed, 1, DYNAMIC_TYPE_TMP_BUFFER, + out, outSz, 0, heap), 0); + ExpectNull(decompressed); + ExpectIntGT(wc_DeCompressDynamic(&decompressed, -1, DYNAMIC_TYPE_TMP_BUFFER, + out, outSz, 0, heap), 0); + ExpectNotNull(decompressed); + ExpectIntEQ(XMEMCMP(decompressed, cert_buf, cert_sz), 0); XFREE(decompressed, heap, DYNAMIC_TYPE_TMP_BUFFER); decompressed = NULL; - AssertIntGT(wc_DeCompressDynamic(&decompressed, DYNAMIC_TYPE_TMP_BUFFER, 5, - out, outSz, 0, heap), 0); - AssertNotNull(decompressed); - AssertIntEQ(XMEMCMP(decompressed, cert_buf, cert_sz), 0); + ExpectIntGT(wc_DeCompressDynamic(&decompressed, DYNAMIC_TYPE_TMP_BUFFER, 5, + out, outSz, 0, heap), 0); + ExpectNotNull(decompressed); + ExpectIntEQ(XMEMCMP(decompressed, cert_buf, cert_sz), 0); XFREE(decompressed, heap, DYNAMIC_TYPE_TMP_BUFFER); - if (cert_buf) + if (cert_buf != NULL) free(cert_buf); wc_PKCS7_Free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_i2d_PKCS12(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_PWDBASED) && defined(HAVE_PKCS12) \ && !defined(NO_FILESYSTEM) && !defined(NO_RSA) \ - && !defined(NO_AES) && !defined(NO_DES3) && !defined(NO_SHA) + && !defined(NO_AES) && !defined(NO_SHA) WC_PKCS12* pkcs12 = NULL; unsigned char der[FOURK_BUF * 2]; unsigned char* pt; - int derSz; + int derSz = 0; unsigned char out[FOURK_BUF * 2]; int outSz = FOURK_BUF * 2; - const char p12_f[] = "./certs/test-servercert.p12"; - XFILE f; + XFILE f = XBADFILE; - f = XFOPEN(p12_f, "rb"); - AssertNotNull(f); - derSz = (int)XFREAD(der, 1, sizeof(der), f); - AssertIntGT(derSz, 0); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(p12_f, "rb")) != XBADFILE); + ExpectIntGT(derSz = (int)XFREAD(der, 1, sizeof(der), f), 0); + if (f != XBADFILE) + XFCLOSE(f); - AssertNotNull(pkcs12 = wc_PKCS12_new()); - AssertIntEQ(wc_d2i_PKCS12(der, derSz, pkcs12), 0); - AssertIntEQ(wc_i2d_PKCS12(pkcs12, NULL, &outSz), LENGTH_ONLY_E); - AssertIntEQ(outSz, derSz); + ExpectNotNull(pkcs12 = wc_PKCS12_new()); + ExpectIntEQ(wc_d2i_PKCS12(der, (word32)derSz, pkcs12), 0); + ExpectIntEQ(wc_i2d_PKCS12(pkcs12, NULL, &outSz), LENGTH_ONLY_E); + ExpectIntEQ(outSz, derSz); outSz = derSz - 1; pt = out; - AssertIntLE(wc_i2d_PKCS12(pkcs12, &pt, &outSz), 0); + ExpectIntLE(wc_i2d_PKCS12(pkcs12, &pt, &outSz), 0); outSz = derSz; - AssertIntEQ(wc_i2d_PKCS12(pkcs12, &pt, &outSz), derSz); - AssertIntEQ((pt == out), 0); + ExpectIntEQ(wc_i2d_PKCS12(pkcs12, &pt, &outSz), derSz); + ExpectIntEQ((pt == out), 0); pt = NULL; - AssertIntEQ(wc_i2d_PKCS12(pkcs12, &pt, NULL), derSz); + ExpectIntEQ(wc_i2d_PKCS12(pkcs12, &pt, NULL), derSz); XFREE(pt, NULL, DYNAMIC_TYPE_PKCS); wc_PKCS12_free(pkcs12); + pkcs12 = NULL; /* Run the same test but use wc_d2i_PKCS12_fp. */ - AssertNotNull(pkcs12 = wc_PKCS12_new()); - AssertIntEQ(wc_d2i_PKCS12_fp("./certs/test-servercert.p12", &pkcs12), 0); - AssertIntEQ(wc_i2d_PKCS12(pkcs12, NULL, &outSz), LENGTH_ONLY_E); - AssertIntEQ(outSz, derSz); + ExpectNotNull(pkcs12 = wc_PKCS12_new()); + ExpectIntEQ(wc_d2i_PKCS12_fp("./certs/test-servercert.p12", &pkcs12), 0); + ExpectIntEQ(wc_i2d_PKCS12(pkcs12, NULL, &outSz), LENGTH_ONLY_E); + ExpectIntEQ(outSz, derSz); wc_PKCS12_free(pkcs12); + pkcs12 = NULL; /* wc_d2i_PKCS12_fp can also allocate the PKCS12 object for the caller. */ - pkcs12 = NULL; - AssertIntEQ(wc_d2i_PKCS12_fp("./certs/test-servercert.p12", &pkcs12), 0); - AssertIntEQ(wc_i2d_PKCS12(pkcs12, NULL, &outSz), LENGTH_ONLY_E); - AssertIntEQ(outSz, derSz); + ExpectIntEQ(wc_d2i_PKCS12_fp("./certs/test-servercert.p12", &pkcs12), 0); + ExpectIntEQ(wc_i2d_PKCS12(pkcs12, NULL, &outSz), LENGTH_ONLY_E); + ExpectIntEQ(outSz, derSz); wc_PKCS12_free(pkcs12); - - res = TEST_RES_CHECK(1); + pkcs12 = NULL; #endif - return res; + return EXPECT_RESULT(); } /* Testing wc_SignatureGetSize() for signature type ECC */ static int test_wc_SignatureGetSize_ecc(void) { - int res = TEST_SKIPPED; -#ifndef NO_SIG_WRAPPER - int ret; - #if defined(HAVE_ECC) && !defined(NO_ECC256) - enum wc_SignatureType sig_type; - word32 key_len; - - /* Initialize ECC Key */ - ecc_key ecc; - const char* qx = - "fa2737fb93488d19caef11ae7faf6b7f4bcd67b286e3fc54e8a65c2b74aeccb0"; - const char* qy = - "d4ccd6dae698208aa8c3a6f39e45510d03be09b2f124bfc067856c324f9b4d09"; - const char* d = - "be34baa8d040a3b991f9075b56ba292f755b90e4b6dc10dad36715c33cfdac25"; - - ret = wc_ecc_init(&ecc); - if (ret == 0) { - ret = wc_ecc_import_raw(&ecc, qx, qy, d, "SECP256R1"); - } - if (ret == 0) { - /* Input for signature type ECC */ - sig_type = WC_SIGNATURE_TYPE_ECC; - key_len = sizeof(ecc_key); - ret = wc_SignatureGetSize(sig_type, &ecc, key_len); + EXPECT_DECLS; +#if !defined(NO_SIG_WRAPPER) && defined(HAVE_ECC) && !defined(NO_ECC256) + enum wc_SignatureType sig_type; + word32 key_len; + ecc_key ecc; + const char* qx = + "fa2737fb93488d19caef11ae7faf6b7f4bcd67b286e3fc54e8a65c2b74aeccb0"; + const char* qy = + "d4ccd6dae698208aa8c3a6f39e45510d03be09b2f124bfc067856c324f9b4d09"; + const char* d = + "be34baa8d040a3b991f9075b56ba292f755b90e4b6dc10dad36715c33cfdac25"; + + XMEMSET(&ecc, 0, sizeof(ecc_key)); + + ExpectIntEQ(wc_ecc_init(&ecc), 0); + ExpectIntEQ(wc_ecc_import_raw(&ecc, qx, qy, d, "SECP256R1"), 0); + /* Input for signature type ECC */ + sig_type = WC_SIGNATURE_TYPE_ECC; + key_len = sizeof(ecc_key); + ExpectIntGT(wc_SignatureGetSize(sig_type, &ecc, key_len), 0); - /* Test bad args */ - if (ret > 0) { - sig_type = (enum wc_SignatureType) 100; - ret = wc_SignatureGetSize(sig_type, &ecc, key_len); - if (ret == BAD_FUNC_ARG) { - sig_type = WC_SIGNATURE_TYPE_ECC; - ret = wc_SignatureGetSize(sig_type, NULL, key_len); - } - if (ret >= 0) { - key_len = (word32) 0; - ret = wc_SignatureGetSize(sig_type, &ecc, key_len); - } - if (ret == BAD_FUNC_ARG) { - ret = SIG_TYPE_E; - } - } - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - wc_ecc_free(&ecc); - #else - ret = SIG_TYPE_E; - #endif + /* Test bad args */ + /* // NOLINTBEGIN(clang-analyzer-optin.core.EnumCastOutOfRange) */ + sig_type = (enum wc_SignatureType) 100; + /* // NOLINTEND(clang-analyzer-optin.core.EnumCastOutOfRange) */ + ExpectIntEQ(wc_SignatureGetSize(sig_type, &ecc, key_len), BAD_FUNC_ARG); + sig_type = WC_SIGNATURE_TYPE_ECC; + ExpectIntEQ(wc_SignatureGetSize(sig_type, NULL, key_len), 0); + key_len = (word32)0; + ExpectIntEQ(wc_SignatureGetSize(sig_type, &ecc, key_len), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == SIG_TYPE_E); -#endif /* NO_SIG_WRAPPER */ - return res; -}/* END test_wc_SignatureGetSize_ecc() */ + DoExpectIntEQ(wc_ecc_free(&ecc), 0); +#endif /* !NO_SIG_WRAPPER && HAVE_ECC && !NO_ECC256 */ + return EXPECT_RESULT(); +} /* END test_wc_SignatureGetSize_ecc() */ /* Testing wc_SignatureGetSize() for signature type rsa */ static int test_wc_SignatureGetSize_rsa(void) { - int res = TEST_SKIPPED; -#ifndef NO_SIG_WRAPPER - int ret = 0; - #ifndef NO_RSA - enum wc_SignatureType sig_type; - word32 key_len; - word32 idx = 0; - - /* Initialize RSA Key */ - RsaKey rsa_key; - byte* tmp = NULL; - size_t bytes; - - #ifdef USE_CERT_BUFFERS_1024 - bytes = (size_t)sizeof_client_key_der_1024; - if (bytes < (size_t)sizeof_client_key_der_1024) - bytes = (size_t)sizeof_client_cert_der_1024; - #elif defined(USE_CERT_BUFFERS_2048) - bytes = (size_t)sizeof_client_key_der_2048; - if (bytes < (size_t)sizeof_client_cert_der_2048) - bytes = (size_t)sizeof_client_cert_der_2048; - #else - bytes = FOURK_BUF; - #endif - - tmp = (byte*)XMALLOC(bytes, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (tmp != NULL) { - #ifdef USE_CERT_BUFFERS_1024 - XMEMCPY(tmp, client_key_der_1024, - (size_t)sizeof_client_key_der_1024); - #elif defined(USE_CERT_BUFFERS_2048) - XMEMCPY(tmp, client_key_der_2048, - (size_t)sizeof_client_key_der_2048); - #elif !defined(NO_FILESYSTEM) - file = XFOPEN(clientKey, "rb"); - if (file != XBADFILE) { - bytes = (size_t)XFREAD(tmp, 1, FOURK_BUF, file); - XFCLOSE(file); - } - else { - ret = WOLFSSL_FATAL_ERROR; - } - #else - ret = WOLFSSL_FATAL_ERROR; - #endif - } - else { - ret = WOLFSSL_FATAL_ERROR; - } + EXPECT_DECLS; +#if !defined(NO_SIG_WRAPPER) && !defined(NO_RSA) + enum wc_SignatureType sig_type; + word32 key_len; + word32 idx = 0; + RsaKey rsa_key; + byte* tmp = NULL; + size_t bytes; - if (ret == 0) { - ret = wc_InitRsaKey_ex(&rsa_key, HEAP_HINT, testDevId); - } - if (ret == 0) { - ret = wc_RsaPrivateKeyDecode(tmp, &idx, &rsa_key, (word32)bytes); - } + XMEMSET(&rsa_key, 0, sizeof(RsaKey)); - if (ret == 0) { - /* Input for signature type RSA */ - sig_type = WC_SIGNATURE_TYPE_RSA; - key_len = sizeof(RsaKey); - ret = wc_SignatureGetSize(sig_type, &rsa_key, key_len); + #ifdef USE_CERT_BUFFERS_1024 + bytes = (size_t)sizeof_client_key_der_1024; + if (bytes < (size_t)sizeof_client_key_der_1024) + bytes = (size_t)sizeof_client_cert_der_1024; + #elif defined(USE_CERT_BUFFERS_2048) + bytes = (size_t)sizeof_client_key_der_2048; + if (bytes < (size_t)sizeof_client_cert_der_2048) + bytes = (size_t)sizeof_client_cert_der_2048; + #else + bytes = FOURK_BUF; + #endif - /* Test bad args */ - if (ret > 0) { - sig_type = (enum wc_SignatureType) 100; - ret = wc_SignatureGetSize(sig_type, &rsa_key, key_len); - if (ret == BAD_FUNC_ARG) { - sig_type = WC_SIGNATURE_TYPE_RSA; - ret = wc_SignatureGetSize(sig_type, NULL, key_len); - } - #ifndef HAVE_USER_RSA - if (ret == BAD_FUNC_ARG) - #else - if (ret == 0) - #endif - { - key_len = (word32)0; - ret = wc_SignatureGetSize(sig_type, &rsa_key, key_len); - } - if (ret == BAD_FUNC_ARG) { - ret = SIG_TYPE_E; - } - } - } - else { - ret = WOLFSSL_FATAL_ERROR; + ExpectNotNull(tmp = (byte*)XMALLOC(bytes, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (tmp != NULL) { + #ifdef USE_CERT_BUFFERS_1024 + XMEMCPY(tmp, client_key_der_1024, (size_t)sizeof_client_key_der_1024); + #elif defined(USE_CERT_BUFFERS_2048) + XMEMCPY(tmp, client_key_der_2048, (size_t)sizeof_client_key_der_2048); + #elif !defined(NO_FILESYSTEM) + XFILE file = XBADFILE; + ExpectTrue((file = XFOPEN(clientKey, "rb")) != XBADFILE); + ExpectIntGT(bytes = (size_t)XFREAD(tmp, 1, FOURK_BUF, file), 0); + if (file != XBADFILE) + XFCLOSE(file); } - wc_FreeRsaKey(&rsa_key); - XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #else - ret = SIG_TYPE_E; + ExpectFail(); #endif + } - res = TEST_RES_CHECK(ret == SIG_TYPE_E); -#endif /* NO_SIG_WRAPPER */ - return res; -}/* END test_wc_SignatureGetSize_rsa(void) */ + ExpectIntEQ(wc_InitRsaKey_ex(&rsa_key, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_RsaPrivateKeyDecode(tmp, &idx, &rsa_key, (word32)bytes), 0); + /* Input for signature type RSA */ + sig_type = WC_SIGNATURE_TYPE_RSA; + key_len = sizeof(RsaKey); + ExpectIntGT(wc_SignatureGetSize(sig_type, &rsa_key, key_len), 0); + + /* Test bad args */ + /* // NOLINTBEGIN(clang-analyzer-optin.core.EnumCastOutOfRange) */ + sig_type = (enum wc_SignatureType)100; + /* // NOLINTEND(clang-analyzer-optin.core.EnumCastOutOfRange) */ + ExpectIntEQ(wc_SignatureGetSize(sig_type, &rsa_key, key_len), BAD_FUNC_ARG); + sig_type = WC_SIGNATURE_TYPE_RSA; + ExpectIntEQ(wc_SignatureGetSize(sig_type, NULL, key_len), BAD_FUNC_ARG); + key_len = (word32)0; + ExpectIntEQ(wc_SignatureGetSize(sig_type, &rsa_key, key_len), BAD_FUNC_ARG); + + DoExpectIntEQ(wc_FreeRsaKey(&rsa_key), 0); + XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif /* !NO_SIG_WRAPPER && !NO_RSA */ + return EXPECT_RESULT(); +} /* END test_wc_SignatureGetSize_rsa(void) */ /*----------------------------------------------------------------------------* | hash.h Tests @@ -31615,29 +40523,30 @@ static int test_wc_HashInit(void) { - int ret = 0, i; /* 0 indicates tests passed, 1 indicates failure */ + EXPECT_DECLS; + int i; /* 0 indicates tests passed, 1 indicates failure */ wc_HashAlg hash; /* enum for holding supported algorithms, #ifndef's restrict if disabled */ enum wc_HashType enumArray[] = { #ifndef NO_MD5 - WC_HASH_TYPE_MD5, + WC_HASH_TYPE_MD5, #endif #ifndef NO_SHA - WC_HASH_TYPE_SHA, + WC_HASH_TYPE_SHA, #endif - #ifndef WOLFSSL_SHA224 - WC_HASH_TYPE_SHA224, + #ifdef WOLFSSL_SHA224 + WC_HASH_TYPE_SHA224, #endif #ifndef NO_SHA256 - WC_HASH_TYPE_SHA256, + WC_HASH_TYPE_SHA256, #endif - #ifndef WOLFSSL_SHA384 - WC_HASH_TYPE_SHA384, + #ifdef WOLFSSL_SHA384 + WC_HASH_TYPE_SHA384, #endif - #ifndef WOLFSSL_SHA512 - WC_HASH_TYPE_SHA512, + #ifdef WOLFSSL_SHA512 + WC_HASH_TYPE_SHA512, #endif }; /* dynamically finds the length */ @@ -31646,31 +40555,24 @@ /* For loop to test various arguments... */ for (i = 0; i < enumlen; i++) { /* check for bad args */ - if (wc_HashInit(&hash, enumArray[i]) == BAD_FUNC_ARG) { - ret = 1; - break; - } + ExpectIntEQ(wc_HashInit(&hash, enumArray[i]), 0); wc_HashFree(&hash, enumArray[i]); /* check for null ptr */ - if (wc_HashInit(NULL, enumArray[i]) != BAD_FUNC_ARG) { - ret = 1; - break; - } + ExpectIntEQ(wc_HashInit(NULL, enumArray[i]), BAD_FUNC_ARG); } /* end of for loop */ - return TEST_RES_CHECK(ret == 0); + return EXPECT_RESULT(); } /* end of test_wc_HashInit */ /* * Unit test function for wc_HashSetFlags() */ static int test_wc_HashSetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_HASH_FLAGS wc_HashAlg hash; - int ret = 0; word32 flags = 0; int i, j; int notSupportedLen; @@ -31713,65 +40615,32 @@ /* For loop to test various arguments... */ for (i = 0; i < enumlen; i++) { - ret = wc_HashInit(&hash, enumArray[i]); - if (ret == 0) { - ret = wc_HashSetFlags(&hash, enumArray[i], flags); - } - if (ret == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_HashSetFlags(NULL, enumArray[i], flags); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - + ExpectIntEQ(wc_HashInit(&hash, enumArray[i]), 0); + ExpectIntEQ(wc_HashSetFlags(&hash, enumArray[i], flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); + ExpectIntEQ(wc_HashSetFlags(NULL, enumArray[i], flags), BAD_FUNC_ARG); wc_HashFree(&hash, enumArray[i]); } /* For loop to test not supported cases */ notSupportedLen = (sizeof(notSupported)/sizeof(enum wc_HashType)); - for (j = 0; ret == 0 && j < notSupportedLen; j++) { - ret = wc_HashInit(&hash, notSupported[j]); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = wc_HashSetFlags(&hash, notSupported[j], flags); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_HashFree(&hash, notSupported[j]); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + for (j = 0; j < notSupportedLen; j++) { + ExpectIntEQ(wc_HashInit(&hash, notSupported[j]), BAD_FUNC_ARG); + ExpectIntEQ(wc_HashSetFlags(&hash, notSupported[j], flags), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HashFree(&hash, notSupported[j]), BAD_FUNC_ARG); } - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_HashSetFlags */ /* * Unit test function for wc_HashGetFlags() */ static int test_wc_HashGetFlags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_HASH_FLAGS wc_HashAlg hash; - int ret = 0; word32 flags = 0; int i, j; @@ -31812,56 +40681,22 @@ /* For loop to test various arguments... */ for (i = 0; i < enumlen; i++) { - ret = wc_HashInit(&hash, enumArray[i]); - if (ret == 0) { - ret = wc_HashGetFlags(&hash, enumArray[i], &flags); - } - if (ret == 0) { - if (flags & WC_HASH_FLAG_ISCOPY) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_HashGetFlags(NULL, enumArray[i], &flags); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_HashInit(&hash, enumArray[i]), 0); + ExpectIntEQ(wc_HashGetFlags(&hash, enumArray[i], &flags), 0); + ExpectTrue((flags & WC_HASH_FLAG_ISCOPY) == 0); + ExpectIntEQ(wc_HashGetFlags(NULL, enumArray[i], &flags), BAD_FUNC_ARG); wc_HashFree(&hash, enumArray[i]); - if (ret != 0) { - break; - } } /* For loop to test not supported cases */ notSupportedLen = (sizeof(notSupported)/sizeof(enum wc_HashType)); - for (j = 0; ret == 0 && j < notSupportedLen; j++) { - ret = wc_HashInit(&hash, notSupported[j]); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = wc_HashGetFlags(&hash, notSupported[j], &flags); - if (ret == 0) { - ret = -1; - } - else if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = wc_HashFree(&hash, notSupported[j]); - if (ret == 0) { - ret = -1; - } - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + for (j = 0; j < notSupportedLen; j++) { + ExpectIntEQ(wc_HashInit(&hash, notSupported[j]), BAD_FUNC_ARG); + ExpectIntEQ(wc_HashGetFlags(&hash, notSupported[j], &flags), + BAD_FUNC_ARG); + ExpectIntEQ(wc_HashFree(&hash, notSupported[j]), BAD_FUNC_ARG); } - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_HashGetFlags */ /*----------------------------------------------------------------------------* @@ -31874,9 +40709,8 @@ static int test_wolfSSL_ASN1_BIT_STRING(void) { - int res = TEST_SKIPPED; -#if !defined(NO_CERTS) && defined(OPENSSL_ALL) EXPECT_DECLS; +#if !defined(NO_CERTS) && defined(OPENSSL_ALL) ASN1_BIT_STRING* str = NULL; ExpectNotNull(str = ASN1_BIT_STRING_new()); @@ -31915,17 +40749,14 @@ ASN1_BIT_STRING_free(str); ASN1_BIT_STRING_free(NULL); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_INTEGER(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) ASN1_INTEGER* a = NULL; ASN1_INTEGER* dup = NULL; const unsigned char invalidLenDer[] = { @@ -31960,17 +40791,14 @@ ExpectNotNull(dup = wolfSSL_ASN1_INTEGER_dup(a)); ASN1_INTEGER_free(dup); ASN1_INTEGER_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_INTEGER_cmp(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) ASN1_INTEGER* a = NULL; ASN1_INTEGER* b = NULL; @@ -31998,17 +40826,14 @@ ASN1_INTEGER_free(b); ASN1_INTEGER_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_INTEGER_BN(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) ASN1_INTEGER* ai = NULL; ASN1_INTEGER* ai2 = NULL; BIGNUM* bn = NULL; @@ -32103,17 +40928,14 @@ BN_free(bn); ASN1_INTEGER_free(ai2); ASN1_INTEGER_free(ai); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_INTEGER_get_set(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) ASN1_INTEGER *a = NULL; long val; @@ -32204,10 +41026,8 @@ ExpectIntEQ(ASN1_INTEGER_set(a, val), 1); ExpectTrue(ASN1_INTEGER_get(a) == val); ASN1_INTEGER_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) @@ -32219,9 +41039,8 @@ #endif static int test_wolfSSL_d2i_ASN1_INTEGER(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) size_t i; WOLFSSL_ASN1_INTEGER* a = NULL; WOLFSSL_ASN1_INTEGER* b = NULL; @@ -32229,7 +41048,7 @@ const byte* p = NULL; byte* p2 = NULL; byte* reEncoded = NULL; - int reEncodedSz; + int reEncodedSz = 0; static const byte zeroDer[] = { 0x02, 0x01, 0x00 @@ -32355,17 +41174,14 @@ wolfSSL_ASN1_INTEGER_free(a); a = NULL; } - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_a2i_ASN1_INTEGER(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_BIO) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_BIO) BIO* bio = NULL; BIO* out = NULL; BIO* fixed = NULL; @@ -32444,7 +41260,7 @@ ExpectNotNull(fixed = BIO_new(wolfSSL_BIO_s_fixed_mem())); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(fixed, tmp, 1), 1); ExpectIntEQ(i2a_ASN1_INTEGER(fixed, ai), 0); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); @@ -32452,20 +41268,17 @@ BIO_free(fixed); ASN1_INTEGER_free(ai); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_i2c_ASN1_INTEGER(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) ASN1_INTEGER *a = NULL; - unsigned char *pp,*tpp; - int ret; + unsigned char *pp = NULL,*tpp = NULL; + int ret = 0; ExpectNotNull(a = wolfSSL_ASN1_INTEGER_new()); @@ -32680,17 +41493,14 @@ XFREE(pp, NULL, DYNAMIC_TYPE_TMP_BUFFER); wolfSSL_ASN1_INTEGER_free(a); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && !NO_ASN */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_OBJECT(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) ASN1_OBJECT* a = NULL; ASN1_OBJECT s; const unsigned char der[] = { 0x06, 0x01, 0x00 }; @@ -32710,17 +41520,14 @@ ExpectNotNull(a = wolfSSL_ASN1_OBJECT_dup(&s)); ASN1_OBJECT_free(a); ASN1_OBJECT_free(&s); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_get_object(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) const unsigned char* derBuf = cliecc_cert_der_256; const unsigned char* nullPtr = NULL; const unsigned char objDerInvalidLen[] = { 0x30, 0x81 }; @@ -32754,7 +41561,7 @@ /* SEQUENCE */ ExpectIntEQ(ASN1_get_object(&derBuf, &asnLen, &tag, &cls, len) & 0x80, 0); - ExpectIntEQ(asnLen, 862); + ExpectIntEQ(asnLen, 861); ExpectIntEQ(tag, 0x10); ExpectIntEQ(cls, 0); @@ -32852,17 +41659,14 @@ XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL); ASN1_OBJECT_free(a); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && HAVE_ECC && USE_CERT_BUFFERS_256 */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_i2a_ASN1_OBJECT(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(NO_BIO) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(NO_BIO) ASN1_OBJECT* obj = NULL; ASN1_OBJECT* a = NULL; BIO *bio = NULL; @@ -32904,18 +41708,15 @@ BIO_free(bio); ASN1_OBJECT_free(obj); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_i2t_ASN1_OBJECT(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN) - EXPECT_DECLS; char buf[50] = {0}; ASN1_OBJECT* obj; const char* oid = "2.5.29.19"; @@ -32931,17 +41732,14 @@ ExpectIntEQ(i2t_ASN1_OBJECT(buf, sizeof(buf), obj), XSTRLEN(ln)); ExpectIntEQ(XSTRNCMP(buf, ln, XSTRLEN(ln)), 0); ASN1_OBJECT_free(obj); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && WOLFSSL_CERT_EXT && WOLFSSL_CERT_GEN */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_sk_ASN1_OBJECT(void) { - int res = TEST_SKIPPED; -#if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) EXPECT_DECLS; +#if !defined(NO_ASN) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) WOLFSSL_STACK* sk = NULL; WOLFSSL_ASN1_OBJECT* obj; @@ -32966,17 +41764,14 @@ ExpectPtrEq(obj, wolfSSL_sk_ASN1_OBJECT_pop(sk)); wolfSSL_sk_ASN1_OBJECT_free(sk); wolfSSL_ASN1_OBJECT_free(obj); - - res = EXPECT_RESULT(); #endif /* !NO_ASN && (OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_STRING(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) ASN1_STRING* str = NULL; ASN1_STRING* c = NULL; const char data[] = "hello wolfSSL"; @@ -33032,18 +41827,15 @@ #ifndef NO_WOLFSSL_STUB ExpectNull(d2i_DISPLAYTEXT(NULL, NULL, 0)); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_STRING_to_UTF8(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_ASN) && !defined(NO_RSA) && \ !defined(NO_FILESYSTEM) - EXPECT_DECLS; WOLFSSL_X509* x509 = NULL; WOLFSSL_X509_NAME* subject = NULL; WOLFSSL_X509_NAME_ENTRY* e = NULL; @@ -33066,7 +41858,7 @@ ExpectNotNull(e = wolfSSL_X509_NAME_get_entry(subject, idx)); ExpectNotNull(a = wolfSSL_X509_NAME_ENTRY_get_data(e)); ExpectIntEQ((len = wolfSSL_ASN1_STRING_to_UTF8(&actual_output, a)), 15); - ExpectIntEQ(strncmp((const char*)actual_output, targetOutput, len), 0); + ExpectIntEQ(strncmp((const char*)actual_output, targetOutput, (size_t)len), 0); a = NULL; /* wolfSSL_ASN1_STRING_to_UTF8(NULL, valid) */ @@ -33084,17 +41876,14 @@ ExpectNotNull(a = ASN1_STRING_new()); ExpectIntEQ(wolfSSL_ASN1_STRING_to_UTF8(&actual_output, a), -1); ASN1_STRING_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_i2s_ASN1_STRING(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) WOLFSSL_ASN1_STRING* str = NULL; const char* data = "test_wolfSSL_i2s_ASN1_STRING"; char* ret = NULL; @@ -33120,19 +41909,16 @@ XFREE(ret, NULL, DYNAMIC_TYPE_TMP_BUFFER); ASN1_STRING_free(str); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_STRING_canon(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_TEST_STATIC_BUILD) #if !defined(NO_CERTS) && (defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || \ defined(OPENSSL_EXTRA_X509_SMALL)) - EXPECT_DECLS; WOLFSSL_ASN1_STRING* orig = NULL; WOLFSSL_ASN1_STRING* canon = NULL; const char* data = "test_wolfSSL_ASN1_STRING_canon"; @@ -33182,19 +41968,16 @@ ASN1_STRING_free(orig); ASN1_STRING_free(canon); - - res = EXPECT_RESULT(); #endif #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_STRING_print(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_ASN) && !defined(NO_CERTS) && \ !defined(NO_BIO) - EXPECT_DECLS; ASN1_STRING* asnStr = NULL; const char HELLO_DATA[]= \ {'H','e','l','l','o',' ','w','o','l','f','S','S','L','!'}; @@ -33210,8 +41993,8 @@ /* setup */ for (i = 0; i < (int)sizeof(HELLO_DATA); i++) { - unprintableData[i] = HELLO_DATA[i]; - expected[i] = HELLO_DATA[i]; + unprintableData[i] = (unsigned char)HELLO_DATA[i]; + expected[i] = (unsigned char)HELLO_DATA[i]; } for (i = 0; i < (int)MAX_UNPRINTABLE_CHAR; i++) { @@ -33247,7 +42030,7 @@ ExpectNotNull(bio = BIO_new(wolfSSL_BIO_s_fixed_mem())); ExpectIntEQ(BIO_set_write_buf_size(bio, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(bio, rbuf, 1), 1); ExpectIntEQ(wolfSSL_ASN1_STRING_print(bio, asnStr), 0); ExpectIntEQ(BIO_set_write_buf_size(bio, 1), 1); @@ -33257,17 +42040,14 @@ BIO_free(bio); ASN1_STRING_free(asnStr); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && !NO_ASN && !NO_CERTS && !NO_BIO */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_STRING_print_ex(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(NO_BIO) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(NO_BIO) ASN1_STRING* asn_str = NULL; const char data[] = "Hello wolfSSL!"; ASN1_STRING* esc_str = NULL; @@ -33312,7 +42092,7 @@ ExpectIntEQ(BIO_read(bio, (void*)rbuf, 15), 15); ExpectStrEQ((char*)rbuf, "Hello wolfSSL!"); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(fixed, rbuf, 1), 1); ExpectIntEQ(wolfSSL_ASN1_STRING_print_ex(fixed, asn_str, flags), 0); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); @@ -33327,7 +42107,7 @@ ExpectIntEQ(BIO_read(bio, (void*)rbuf, 9), 9); ExpectStrEQ((char*)rbuf, "a\\+\\;\\<\\>"); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(fixed, rbuf, 1), 1); ExpectIntEQ(wolfSSL_ASN1_STRING_print_ex(fixed, esc_str, flags), 0); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); @@ -33342,7 +42122,7 @@ ExpectIntEQ(BIO_read(bio, (void*)rbuf, 28), 28); ExpectStrEQ((char*)rbuf, "OCTET STRING:Hello wolfSSL!"); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(fixed, rbuf, 1), 1); ExpectIntEQ(wolfSSL_ASN1_STRING_print_ex(fixed, asn_str, flags), 0); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); @@ -33359,7 +42139,7 @@ ExpectIntEQ(BIO_read(bio, (void*)rbuf, 31), 31); ExpectStrEQ((char*)rbuf, "#48656C6C6F20776F6C6653534C2100"); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(fixed, rbuf, 1), 1); ExpectIntEQ(wolfSSL_ASN1_STRING_print_ex(fixed, asn_str, flags), 0); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); @@ -33374,7 +42154,7 @@ ExpectIntEQ(BIO_read(bio, (void*)rbuf, 35), 35); ExpectStrEQ((char*)rbuf, "#040F48656C6C6F20776F6C6653534C2100"); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(fixed, rbuf, 1), 1); ExpectIntEQ(wolfSSL_ASN1_STRING_print_ex(fixed, asn_str, flags), 0); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); @@ -33414,17 +42194,14 @@ ExpectStrEQ(wolfSSL_ASN1_tag2str(-1), "(unknown)"); ExpectStrEQ(wolfSSL_ASN1_tag2str(31), "(unknown)"); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_UNIVERSALSTRING_to_string(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_ASN) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(NO_ASN) ASN1_STRING* asn1str_test = NULL; ASN1_STRING* asn1str_answer = NULL; /* Each character is encoded using 4 bytes */ @@ -33472,44 +42249,29 @@ ASN1_STRING_free(asn1str_test); ASN1_STRING_free(asn1str_answer); - - res = EXPECT_RESULT(); #endif /* OPENSSL_ALL && !NO_ASN */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_GENERALIZEDTIME_free(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) WOLFSSL_ASN1_GENERALIZEDTIME* asn1_gtime = NULL; - unsigned char nullstr[32]; - - XMEMSET(nullstr, 0, 32); - ExpectNotNull(asn1_gtime = (WOLFSSL_ASN1_GENERALIZEDTIME*)XMALLOC( - sizeof(WOLFSSL_ASN1_GENERALIZEDTIME), NULL, DYNAMIC_TYPE_TMP_BUFFER)); - if (asn1_gtime != NULL) { - XMEMCPY(asn1_gtime->data,"20180504123500Z",ASN_GENERALIZED_TIME_SIZE); - - wolfSSL_ASN1_GENERALIZEDTIME_free(asn1_gtime); - ExpectIntEQ(0, XMEMCMP(asn1_gtime->data, nullstr, 32)); - - XFREE(asn1_gtime, NULL, DYNAMIC_TYPE_TMP_BUFFER); - } - wolfSSL_ASN1_GENERALIZEDTIME_free(NULL); - res = EXPECT_RESULT(); -#endif /* OPENSSL_EXTRA */ - return res; + ExpectNotNull(asn1_gtime = ASN1_GENERALIZEDTIME_new()); + if (asn1_gtime != NULL) + XMEMCPY(asn1_gtime->data, "20180504123500Z", ASN_GENERALIZED_TIME_SIZE); + ASN1_GENERALIZEDTIME_free(asn1_gtime); +#endif /* OPENSSL_EXTRA && !NO_ASN_TIME */ + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_GENERALIZEDTIME_print(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_BIO) EXPECT_DECLS; - WOLFSSL_ASN1_GENERALIZEDTIME gtime; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && !defined(NO_BIO) + WOLFSSL_ASN1_GENERALIZEDTIME* gtime = NULL; BIO* bio = NULL; unsigned char buf[24]; int i; @@ -33517,19 +42279,17 @@ ExpectNotNull(bio = BIO_new(BIO_s_mem())); BIO_set_write_buf_size(bio, 24); - XMEMSET(>ime, 0, sizeof(WOLFSSL_ASN1_GENERALIZEDTIME)); - XMEMCPY(gtime.data, "20180504123500Z", ASN_GENERALIZED_TIME_SIZE); - gtime.length = ASN_GENERALIZED_TIME_SIZE; + ExpectNotNull(gtime = ASN1_GENERALIZEDTIME_new()); /* Type not set. */ - ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, >ime), 0); - gtime.type = V_ASN1_GENERALIZEDTIME; + ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, gtime), 0); + ExpectIntEQ(wolfSSL_ASN1_TIME_set_string(gtime, "20180504123500Z"), 1); /* Invalid parameters testing. */ ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(NULL, NULL), BAD_FUNC_ARG); ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, NULL), BAD_FUNC_ARG); - ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(NULL, >ime), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(NULL, gtime), BAD_FUNC_ARG); - ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, >ime), 1); + ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, gtime), 1); ExpectIntEQ(BIO_read(bio, buf, sizeof(buf)), 20); ExpectIntEQ(XMEMCMP(buf, "May 04 12:35:00 2018", 20), 0); @@ -33538,27 +42298,24 @@ ExpectNotNull(bio = BIO_new(wolfSSL_BIO_s_fixed_mem())); ExpectIntEQ(BIO_set_write_buf_size(bio, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(bio, buf, 1), 1); - ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, >ime), 0); + ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, gtime), 0); for (i = 1; i < 20; i++) { ExpectIntEQ(BIO_set_write_buf_size(bio, i), 1); - ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, >ime), 0); + ExpectIntEQ(wolfSSL_ASN1_GENERALIZEDTIME_print(bio, gtime), 0); } BIO_free(bio); - wolfSSL_ASN1_GENERALIZEDTIME_free(>ime); - - res = EXPECT_RESULT(); -#endif /* OPENSSL_EXTRA */ - return res; + wolfSSL_ASN1_GENERALIZEDTIME_free(gtime); +#endif /* OPENSSL_EXTRA && !NO_ASN_TIME && !NO_BIO */ + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TIME(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) WOLFSSL_ASN1_TIME* asn_time = NULL; unsigned char *data; @@ -33585,19 +42342,16 @@ ASN1_TIME_free(asn_time); ASN1_TIME_free(NULL); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TIME_to_string(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef NO_ASN_TIME #if defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \ defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) - EXPECT_DECLS; WOLFSSL_ASN1_TIME* t = NULL; char buf[ASN_GENERALIZED_TIME_SIZE]; @@ -33616,24 +42370,21 @@ ExpectNull(ASN1_TIME_to_string(t, buf, 5)); ASN1_TIME_free(t); - - res = EXPECT_RESULT(); #endif #endif /* NO_ASN_TIME */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TIME_diff_compare(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) ASN1_TIME* fromTime = NULL; ASN1_TIME* closeToTime = NULL; ASN1_TIME* toTime = NULL; ASN1_TIME* invalidTime = NULL; - int daysDiff; - int secsDiff; + int daysDiff = 0; + int secsDiff = 0; ExpectNotNull((fromTime = ASN1_TIME_new())); /* Feb 22, 2003, 21:15:15 */ @@ -33712,18 +42463,15 @@ ASN1_TIME_free(closeToTime); ASN1_TIME_free(toTime); ASN1_TIME_free(invalidTime); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TIME_adj(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) \ -&& !defined(USER_TIME) && !defined(TIME_OVERRIDES) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && \ + !defined(USER_TIME) && !defined(TIME_OVERRIDES) const int year = 365*24*60*60; const int day = 24*60*60; const int hour = 60*60; @@ -33814,23 +42562,22 @@ date_str[CTC_DATE_SIZE] = '\0'; ExpectIntEQ(0, XMEMCMP(date_str, "000222211515Z", 13)); XFREE(asn_time, NULL, DYNAMIC_TYPE_OPENSSL); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TIME_to_tm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \ defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \ defined(OPENSSL_ALL)) && !defined(NO_ASN_TIME) - EXPECT_DECLS; ASN1_TIME asnTime; struct tm tm; time_t testTime = 1683926567; /* Fri May 12 09:22:47 PM UTC 2023 */ + XMEMSET(&tm, 0, sizeof(struct tm)); + XMEMSET(&asnTime, 0, sizeof(ASN1_TIME)); ExpectIntEQ(ASN1_TIME_set_string(&asnTime, "000222211515Z"), 1); ExpectIntEQ(ASN1_TIME_to_tm(&asnTime, NULL), 1); @@ -33890,17 +42637,14 @@ fields are zeroed out as expected. */ ExpectIntEQ(tm.tm_isdst, 0); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TIME_to_generalizedtime(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) WOLFSSL_ASN1_TIME *t = NULL; WOLFSSL_ASN1_TIME *out = NULL; WOLFSSL_ASN1_TIME *gtime = NULL; @@ -33988,27 +42732,24 @@ XFREE(gtime, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TIME_print(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_RSA) && !defined(NO_BIO) && \ (defined(WOLFSSL_MYSQL_COMPATIBLE) || defined(WOLFSSL_NGINX) || \ defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || \ defined(OPENSSL_ALL)) && defined(USE_CERT_BUFFERS_2048) && \ !defined(NO_ASN_TIME) - EXPECT_DECLS; BIO* bio = NULL; BIO* fixed = NULL; X509* x509 = NULL; const unsigned char* der = client_cert_der_2048; - ASN1_TIME* notAfter; - ASN1_TIME* notBefore; + ASN1_TIME* notAfter = NULL; + ASN1_TIME* notBefore = NULL; unsigned char buf[25]; ExpectNotNull(bio = BIO_new(BIO_s_mem())); @@ -34023,11 +42764,11 @@ ExpectIntEQ(ASN1_TIME_print(bio, notBefore), 1); ExpectIntEQ(BIO_read(bio, buf, sizeof(buf)), 24); - ExpectIntEQ(XMEMCMP(buf, "Dec 16 21:17:49 2022 GMT", sizeof(buf) - 1), 0); + ExpectIntEQ(XMEMCMP(buf, "Dec 13 22:19:28 2023 GMT", sizeof(buf) - 1), 0); /* Test BIO_write fails. */ ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); - /* Ensure there is 0 bytes avaialble to write into. */ + /* Ensure there is 0 bytes available to write into. */ ExpectIntEQ(BIO_write(fixed, buf, 1), 1); ExpectIntEQ(ASN1_TIME_print(fixed, notBefore), 0); ExpectIntEQ(BIO_set_write_buf_size(fixed, 1), 1); @@ -34050,17 +42791,14 @@ BIO_free(bio); BIO_free(fixed); X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_UTCTIME_print(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && !defined(NO_BIO) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && !defined(NO_BIO) BIO* bio = NULL; ASN1_UTCTIME* utc = NULL; unsigned char buf[25]; @@ -34111,18 +42849,15 @@ XFREE(utc, NULL, DYNAMIC_TYPE_ASN1); BIO_free(bio); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && !NO_ASN_TIME && !NO_BIO */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ASN1_TYPE(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD) || \ defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_WPAS) - EXPECT_DECLS; WOLFSSL_ASN1_TYPE* t = NULL; WOLFSSL_ASN1_OBJECT* obj = NULL; #ifndef NO_ASN_TIME @@ -34199,10 +42934,8 @@ ASN1_TYPE_set(t, V_ASN1_SEQUENCE, str); wolfSSL_ASN1_TYPE_free(t); t = NULL; - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* Testing code used in dpp.c in hostap */ @@ -34246,14 +42979,13 @@ static int test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; /* Testing code used in dpp.c in hostap */ #if defined(OPENSSL_ALL) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - EXPECT_DECLS; EC_KEY *eckey = NULL; EVP_PKEY *key = NULL; - size_t len; + size_t len = 0; unsigned char *der = NULL; DPP_BOOTSTRAPPING_KEY *bootstrap = NULL; const unsigned char *in = ecc_clikey_der_256; @@ -34393,19 +43125,16 @@ TEST_FAIL_ASN1_free(NULL); XMEMSET(&test_fail_asn1, 0, sizeof(TEST_FAIL_ASN1)); ExpectIntEQ(i2d_TEST_FAIL_ASN1(&test_fail_asn1, &der), 0); - - res = EXPECT_RESULT(); #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* OPENSSL_ALL && HAVE_ECC && USE_CERT_BUFFERS_256 */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_lhash(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_ALL EXPECT_DECLS; +#ifdef OPENSSL_ALL const char testStr[] = "Like a true nature's child\n" "We were born\n" "Born to be wild"; @@ -34415,31 +43144,28 @@ #else ExpectIntEQ(lh_strhash(testStr), 0x5b7541dc); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_NAME(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) && defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT) || \ defined(OPENSSL_EXTRA)) - EXPECT_DECLS; X509* x509 = NULL; - const unsigned char* c; + const unsigned char* c = NULL; unsigned char buf[4096]; - int bytes; + int bytes = 0; XFILE f = XBADFILE; const X509_NAME* a = NULL; const X509_NAME* b = NULL; X509_NAME* d2i_name = NULL; int sz = 0; - unsigned char* tmp; + unsigned char* tmp = NULL; char file[] = "./certs/ca-cert.der"; #ifndef OPENSSL_EXTRA_X509_SMALL byte empty[] = { /* CN=empty emailAddress= */ @@ -34466,7 +43192,7 @@ XFCLOSE(f); c = buf; - ExpectNotNull(x509 = wolfSSL_X509_d2i(NULL, c, bytes)); + ExpectNotNull(x509 = wolfSSL_X509_d2i_ex(NULL, c, bytes, HEAP_HINT)); /* test cmp function */ ExpectNotNull(a = X509_get_issuer_name(x509)); @@ -34552,18 +43278,15 @@ (char*)tmp, sizeof(buf)), -1); X509_NAME_free(d2i_name); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_NAME_hash(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) \ - && !defined(NO_RSA) && !defined(NO_SHA) && !defined(NO_BIO) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && \ + !defined(NO_RSA) && !defined(NO_SHA) && !defined(NO_BIO) BIO* bio = NULL; X509* x509 = NULL; @@ -34574,22 +43297,19 @@ ExpectIntEQ(X509_NAME_hash(X509_get_issuer_name(x509)), 0xFDB2DA4); X509_free(x509); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_NAME_print_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB)))) && \ !defined(NO_BIO) && !defined(NO_RSA) - EXPECT_DECLS; - int memSz; + int memSz = 0; byte* mem = NULL; BIO* bio = NULL; BIO* membio = NULL; @@ -34597,6 +43317,7 @@ X509_NAME* name = NULL; const char* expNormal = "C=US, CN=wolfssl.com"; + const char* expEqSpace = "C = US, CN = wolfssl.com"; const char* expReverse = "CN=wolfssl.com, C=US"; const char* expNotEscaped = "C= US,+\"\\ , CN=#wolfssl.com<>;"; @@ -34654,6 +43375,17 @@ BIO_free(membio); membio = NULL; + /* Test with XN_FLAG_ONELINE which should enable XN_FLAG_SPC_EQ for + spaces aroun '=' */ + ExpectNotNull(membio = BIO_new(BIO_s_mem())); + ExpectIntEQ(X509_NAME_print_ex(membio, name, 0, XN_FLAG_ONELINE), + WOLFSSL_SUCCESS); + ExpectIntGE((memSz = BIO_get_mem_data(membio, &mem)), 0); + ExpectIntEQ(memSz, XSTRLEN(expEqSpace)); + ExpectIntEQ(XSTRNCMP((char*)mem, expEqSpace, XSTRLEN(expEqSpace)), 0); + BIO_free(membio); + membio = NULL; + /* Test flags: XN_FLAG_RFC2253 - should be reversed */ ExpectNotNull(membio = BIO_new(BIO_s_mem())); ExpectIntEQ(X509_NAME_print_ex(membio, name, 0, @@ -34721,18 +43453,15 @@ X509_NAME_free(name); } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_X509_INFO_multiple_info(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_RSA) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(NO_RSA) STACK_OF(X509_INFO) *info_stack = NULL; X509_INFO *info = NULL; int len; @@ -34754,14 +43483,16 @@ /* concatenate the cert and the key file to force PEM_X509_INFO_read_bio * to group objects together. */ ExpectNotNull(concatBIO = BIO_new(BIO_s_mem())); - for (curFile = files; *curFile != NULL; curFile++) { - int fileLen; + for (curFile = files; EXPECT_SUCCESS() && *curFile != NULL; curFile++) { + int fileLen = 0; ExpectNotNull(fileBIO = BIO_new_file(*curFile, "rb")); ExpectIntGT(fileLen = wolfSSL_BIO_get_len(fileBIO), 0); if (EXPECT_SUCCESS()) { while ((len = BIO_read(fileBIO, tmp, sizeof(tmp))) > 0) { ExpectIntEQ(BIO_write(concatBIO, tmp, len), len); fileLen -= len; + if (EXPECT_FAIL()) + break; } /* Make sure we read the entire file */ ExpectIntEQ(fileLen, 0); @@ -34789,19 +43520,16 @@ sk_X509_INFO_pop_free(info_stack, X509_INFO_free); BIO_free(concatBIO); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #endif #ifndef NO_BIO static int test_wolfSSL_X509_INFO(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_RSA) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(NO_RSA) STACK_OF(X509_INFO) *info_stack = NULL; X509_INFO *info = NULL; BIO *cert = NULL; @@ -34858,19 +43586,16 @@ ExpectNull(info_stack = PEM_X509_INFO_read_bio(cert, NULL, NULL, NULL)); sk_X509_INFO_pop_free(info_stack, X509_INFO_free); BIO_free(cert); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #endif static int test_wolfSSL_X509_subject_name_hash(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) \ - && !defined(NO_RSA) && (!defined(NO_SHA) || !defined(NO_SHA256)) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ + !defined(NO_RSA) && (!defined(NO_SHA) || !defined(NO_SHA256)) X509* x509 = NULL; X509_NAME* subjectName = NULL; unsigned long ret1 = 0; @@ -34898,18 +43623,15 @@ #endif X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_issuer_name_hash(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) \ && !defined(NO_RSA) && (!defined(NO_SHA) || !defined(NO_SHA256)) - EXPECT_DECLS; X509* x509 = NULL; X509_NAME* issuertName = NULL; unsigned long ret1 = 0; @@ -34937,18 +43659,15 @@ #endif X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_check_host(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) \ && !defined(NO_SHA) && !defined(NO_RSA) - EXPECT_DECLS; X509* x509 = NULL; const char altName[] = "example.com"; @@ -34965,17 +43684,14 @@ ExpectIntEQ(X509_check_host(NULL, altName, XSTRLEN(altName), 0, NULL), WOLFSSL_FAILURE); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_check_email(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) X509* x509 = NULL; const char goodEmail[] = "info@wolfssl.com"; const char badEmail[] = "disinfo@wolfssl.com"; @@ -35001,86 +43717,14 @@ /* Should fail when x509 is NULL */ ExpectIntEQ(wolfSSL_X509_check_email(NULL, goodEmail, 0, 0), WOLFSSL_FAILURE); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && WOLFSSL_CERT_GEN */ - return res; -} - -static int test_wolfSSL_DES(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_DES3) - EXPECT_DECLS; - const_DES_cblock myDes; - DES_cblock iv; - DES_key_schedule key; - word32 i; - DES_LONG dl; - unsigned char msg[] = "hello wolfssl"; - - DES_check_key(1); - DES_set_key(&myDes, &key); - - /* check, check of odd parity */ - XMEMSET(myDes, 4, sizeof(const_DES_cblock)); - myDes[0] = 6; /*set even parity*/ - XMEMSET(key, 5, sizeof(DES_key_schedule)); - ExpectIntEQ(DES_set_key_checked(&myDes, &key), -1); - ExpectIntNE(key[0], myDes[0]); /* should not have copied over key */ - - /* set odd parity for success case */ - DES_set_odd_parity(&myDes); - ExpectIntEQ(DES_check_key_parity(&myDes), 1); - fprintf(stderr, "%02x %02x %02x %02x", myDes[0], myDes[1], myDes[2], - myDes[3]); - ExpectIntEQ(DES_set_key_checked(&myDes, &key), 0); - for (i = 0; i < sizeof(DES_key_schedule); i++) { - ExpectIntEQ(key[i], myDes[i]); - } - ExpectIntEQ(DES_is_weak_key(&myDes), 0); - - /* check weak key */ - XMEMSET(myDes, 1, sizeof(const_DES_cblock)); - XMEMSET(key, 5, sizeof(DES_key_schedule)); - ExpectIntEQ(DES_set_key_checked(&myDes, &key), -2); - ExpectIntNE(key[0], myDes[0]); /* should not have copied over key */ - - /* now do unchecked copy of a weak key over */ - DES_set_key_unchecked(&myDes, &key); - /* compare arrays, should be the same */ - for (i = 0; i < sizeof(DES_key_schedule); i++) { - ExpectIntEQ(key[i], myDes[i]); - } - ExpectIntEQ(DES_is_weak_key(&myDes), 1); - - /* check DES_key_sched API */ - XMEMSET(key, 1, sizeof(DES_key_schedule)); - ExpectIntEQ(DES_key_sched(&myDes, NULL), 0); - ExpectIntEQ(DES_key_sched(NULL, &key), 0); - ExpectIntEQ(DES_key_sched(&myDes, &key), 0); - /* compare arrays, should be the same */ - for (i = 0; i < sizeof(DES_key_schedule); i++) { - ExpectIntEQ(key[i], myDes[i]); - } - - /* DES_cbc_cksum should return the last 4 of the last 8 bytes after - * DES_cbc_encrypt on the input */ - XMEMSET(iv, 0, sizeof(DES_cblock)); - XMEMSET(myDes, 5, sizeof(DES_key_schedule)); - ExpectIntGT((dl = DES_cbc_cksum(msg, &key, sizeof(msg), &myDes, &iv)), 0); - ExpectIntEQ(dl, 480052723); - - res = EXPECT_RESULT(); -#endif /* defined(OPENSSL_EXTRA) && !defined(NO_DES3) */ - return res; + return EXPECT_RESULT(); } static int test_wc_PemToDer(void) { - int res = TEST_SKIPPED; -#if !defined(NO_CERTS) && defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) EXPECT_DECLS; +#if !defined(NO_CERTS) && defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) int ret; DerBuffer* pDer = NULL; const char* ca_cert = "./certs/server-cert.pem"; @@ -35092,7 +43736,7 @@ XMEMSET(&info, 0, sizeof(info)); ExpectIntEQ(ret = load_file(ca_cert, &cert_buf, &cert_sz), 0); - ExpectIntEQ(ret = wc_PemToDer(cert_buf, cert_sz, CERT_TYPE, &pDer, NULL, + ExpectIntEQ(ret = wc_PemToDer(cert_buf, (long int)cert_sz, CERT_TYPE, &pDer, NULL, &info, &eccKey), 0); wc_FreeDer(&pDer); pDer = NULL; @@ -35123,17 +43767,14 @@ free(cert_buf); } #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_AllocDer(void) { - int res = TEST_SKIPPED; -#if !defined(NO_CERTS) EXPECT_DECLS; +#if !defined(NO_CERTS) DerBuffer* pDer = NULL; word32 testSize = 1024; @@ -35142,17 +43783,14 @@ ExpectIntEQ(wc_AllocDer(&pDer, testSize, CERT_TYPE, HEAP_HINT), 0); ExpectNotNull(pDer); wc_FreeDer(&pDer); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_CertPemToDer(void) { - int res = TEST_SKIPPED; -#if !defined(NO_CERTS) && defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) EXPECT_DECLS; +#if !defined(NO_CERTS) && defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) const char* ca_cert = "./certs/ca-cert.pem"; byte* cert_buf = NULL; size_t cert_sz = 0; @@ -35184,18 +43822,15 @@ free(cert_der); if (cert_buf != NULL) free(cert_buf); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_KeyPemToDer(void) { - int res = TEST_SKIPPED; -#if defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) EXPECT_DECLS; - int ret; +#if defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) + int ret = 0; const byte cert_buf[] = \ "-----BEGIN PRIVATE KEY-----\n" "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMG5KgWxP002pA\n" @@ -35240,7 +43875,7 @@ /* Test normal operation */ cert_dersz = cert_sz; /* DER will be smaller than PEM */ - ExpectNotNull(cert_der = (byte*)malloc(cert_dersz)); + ExpectNotNull(cert_der = (byte*)malloc((size_t)cert_dersz)); ExpectIntGE(ret = wc_KeyPemToDer(cert_buf, cert_sz, cert_der, cert_dersz, cert_pw), 0); ExpectIntLE(ret, cert_sz); @@ -35254,24 +43889,21 @@ ExpectIntLE(ret, cert_sz); if (EXPECT_SUCCESS()) cert_dersz = ret; - ExpectNotNull(cert_der = (byte*)malloc(cert_dersz)); + ExpectNotNull(cert_der = (byte*)malloc((size_t)cert_dersz)); ExpectIntGE(ret = wc_KeyPemToDer(cert_buf, cert_sz, cert_der, cert_dersz, cert_pw), 0); ExpectIntLE(ret, cert_sz); if (cert_der != NULL) free(cert_der); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_PubKeyPemToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_PEM_TO_DER) && !defined(NO_FILESYSTEM) && \ (defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_PUB_PEM_TO_DER)) - EXPECT_DECLS; int ret = 0; const char* key = "./certs/ecc-client-keyPub.pem"; byte* cert_buf = NULL; @@ -35294,7 +43926,7 @@ /* Test NULL for DER buffer to return needed DER buffer size */ ExpectIntGT(ret = wc_PubKeyPemToDer(cert_buf, (int)cert_sz, NULL, 0), 0); ExpectIntLE(ret, cert_sz); - cert_dersz = ret; + cert_dersz = (size_t)ret; ExpectNotNull(cert_der = (byte*)malloc(cert_dersz)); ExpectIntGE(wc_PubKeyPemToDer(cert_buf, (int)cert_sz, cert_der, (int)cert_dersz), 0); @@ -35305,18 +43937,15 @@ if (cert_buf != NULL) { free(cert_buf); } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_PemPubKeyToDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && \ (defined(WOLFSSL_CERT_EXT) || defined(WOLFSSL_PUB_PEM_TO_DER)) - EXPECT_DECLS; const char* key = "./certs/ecc-client-keyPub.pem"; size_t cert_dersz = 1024; byte* cert_der = NULL; @@ -35329,17 +43958,14 @@ if (cert_der != NULL) { free(cert_der); } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_GetPubKeyDerFromCert(void) { - int res = TEST_SKIPPED; -#if !defined(NO_RSA) || defined(HAVE_ECC) EXPECT_DECLS; +#if !defined(NO_RSA) || defined(HAVE_ECC) int ret; word32 idx = 0; byte keyDer[TWOK_BUF]; /* large enough for up to RSA 2048 */ @@ -35493,19 +44119,16 @@ wc_FreeDecodedCert(&decoded); #endif - - res = EXPECT_RESULT(); #endif /* !NO_RSA || HAVE_ECC */ - return res; + return EXPECT_RESULT(); } static int test_wc_CheckCertSigPubKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) && defined(WOLFSSL_PEM_TO_DER) && defined(HAVE_ECC) - EXPECT_DECLS; - int ret; + int ret = 0; const char* ca_cert = "./certs/ca-cert.pem"; byte* cert_buf = NULL; size_t cert_sz = 0; @@ -35557,18 +44180,15 @@ free(cert_der); if (cert_buf != NULL) free(cert_buf); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_certs(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) - EXPECT_DECLS; X509* x509ext = NULL; #ifdef OPENSSL_ALL X509* x509 = NULL; @@ -35581,7 +44201,7 @@ ASN1_STRING* asn1_str = NULL; AUTHORITY_KEYID* akey = NULL; BASIC_CONSTRAINTS* bc = NULL; - int crit; + int crit = 0; #ifndef NO_WOLFSSL_SERVER ExpectNotNull(ctx = SSL_CTX_new(SSLv23_server_method())); @@ -35591,16 +44211,16 @@ ExpectTrue(SSL_CTX_use_certificate_file(ctx, svrCertFile, SSL_FILETYPE_PEM)); ExpectTrue(SSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, SSL_FILETYPE_PEM)); ExpectTrue(SSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, SSL_FILETYPE_PEM)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(SSL_CTX_check_private_key(ctx), SSL_FAILURE); #endif ExpectTrue(SSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, SSL_FILETYPE_PEM)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(SSL_CTX_check_private_key(ctx), SSL_SUCCESS); #endif ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif @@ -35617,7 +44237,7 @@ WOLFSSL_FILETYPE_PEM)); ExpectIntEQ(SSL_use_certificate(ssl, x509ext), WOLFSSL_SUCCESS); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) /* with loading in a new cert the check on private key should now fail */ ExpectIntNE(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif @@ -35699,7 +44319,7 @@ ExpectNotNull(ext = X509V3_EXT_i2d(NID_ext_key_usage, crit, sk)); X509_EXTENSION_free(ext); ext = NULL; - sk_ASN1_OBJECT_pop_free(sk, NULL); + EXTENDED_KEY_USAGE_free(sk); sk = NULL; #else sk = (STACK_OF(ASN1_OBJECT)*)X509_get_ext_d2i(x509ext, NID_ext_key_usage, @@ -35815,18 +44435,15 @@ X509_free(x509ext); SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && !NO_CERTS */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_check_private_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) && \ defined(USE_CERT_BUFFERS_2048) && !defined(NO_CHECK_PRIVATE_KEY) - EXPECT_DECLS; X509* x509 = NULL; EVP_PKEY* pkey = NULL; const byte* key; @@ -35854,21 +44471,17 @@ EVP_PKEY_free(pkey); X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } - static int test_wolfSSL_private_keys(void) { - int res = TEST_SKIPPED; - #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - !defined(NO_FILESYSTEM) -#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ + !defined(NO_FILESYSTEM) +#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) WOLFSSL* ssl = NULL; WOLFSSL_CTX* ctx = NULL; EVP_PKEY* pkey = NULL; @@ -35885,16 +44498,16 @@ ExpectTrue(SSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, WOLFSSL_FILETYPE_PEM)); /* Have to load a cert before you can check the private key against that * certificates public key! */ - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(wolfSSL_CTX_check_private_key(ctx), WOLFSSL_FAILURE); #endif ExpectTrue(SSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(wolfSSL_CTX_check_private_key(ctx), WOLFSSL_SUCCESS); #endif ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif @@ -35907,7 +44520,7 @@ ExpectIntEQ(SSL_use_RSAPrivateKey_ASN1(ssl, (unsigned char*)client_key_der_2048, sizeof_client_key_der_2048), WOLFSSL_SUCCESS); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) /* Should mismatch now that a different private key loaded */ ExpectIntNE(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif @@ -35915,7 +44528,7 @@ ExpectIntEQ(SSL_use_PrivateKey_ASN1(0, ssl, (unsigned char*)server_key, sizeof_server_key_der_2048), WOLFSSL_SUCCESS); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) /* After loading back in DER format of original key, should match */ ExpectIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif @@ -35925,7 +44538,7 @@ (unsigned char*)client_key_der_2048, sizeof_client_key_der_2048), WOLFSSL_SUCCESS); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) /* Should mismatch now that a different private key loaded */ ExpectIntNE(wolfSSL_CTX_check_private_key(ctx), WOLFSSL_SUCCESS); #endif @@ -35933,7 +44546,7 @@ ExpectIntEQ(SSL_CTX_use_PrivateKey_ASN1(0, ctx, (unsigned char*)server_key, sizeof_server_key_der_2048), WOLFSSL_SUCCESS); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) /* After loading back in DER format of original key, should match */ ExpectIntEQ(wolfSSL_CTX_check_private_key(ctx), WOLFSSL_SUCCESS); #endif @@ -35956,7 +44569,7 @@ /* check striping PKCS8 header with wolfSSL_d2i_PrivateKey */ bufSz = FOURK_BUF; - ExpectIntGT((bufSz = wc_CreatePKCS8Key(buf, &bufSz, + ExpectIntGT((bufSz = (word32)wc_CreatePKCS8Key(buf, &bufSz, (byte*)server_key_der_2048, sizeof_server_key_der_2048, RSAk, NULL, 0)), 0); server_key = (const unsigned char*)buf; @@ -35987,7 +44600,7 @@ WOLFSSL_FILETYPE_PEM)); ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif SSL_free(ssl); @@ -36020,7 +44633,7 @@ WOLFSSL_FILETYPE_PEM)); ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif SSL_free(ssl); @@ -36031,7 +44644,7 @@ WOLFSSL_FILETYPE_PEM)); ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntNE(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif @@ -36053,7 +44666,7 @@ WOLFSSL_FILETYPE_PEM)); ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntEQ(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif SSL_free(ssl); @@ -36064,7 +44677,7 @@ WOLFSSL_FILETYPE_PEM)); ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(HAVE_USER_RSA) && !defined(NO_CHECK_PRIVATE_KEY) + #if !defined(NO_CHECK_PRIVATE_KEY) ExpectIntNE(wolfSSL_check_private_key(ssl), WOLFSSL_SUCCESS); #endif @@ -36084,37 +44697,84 @@ (void)ssl; (void)ctx; (void)pkey; - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ - #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) */ - return res; +#endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) */ + return EXPECT_RESULT(); +} + +static int test_wolfSSL_PEM_def_callback(void) +{ + EXPECT_DECLS; +#ifdef OPENSSL_EXTRA + char buf[10]; + const char* defpwd = "DEF PWD"; + int defpwdLen = (int)XSTRLEN(defpwd); + int smallLen = 1; + + /* Bad parameters. */ + ExpectIntEQ(wolfSSL_PEM_def_callback(NULL, sizeof(buf), 0, NULL), 0); + ExpectIntEQ(wolfSSL_PEM_def_callback(NULL, sizeof(buf), 0, (void*)defpwd), + 0); + ExpectIntEQ(wolfSSL_PEM_def_callback(buf, sizeof(buf), 0, NULL), 0); + + XMEMSET(buf, 0, sizeof(buf)); + ExpectIntEQ(wolfSSL_PEM_def_callback(buf, sizeof(buf), 0, (void*)defpwd), + defpwdLen); + ExpectIntEQ(XMEMCMP(buf, defpwd, defpwdLen), 0); + ExpectIntEQ(buf[defpwdLen], 0); + /* Size of buffer is smaller than default password. */ + XMEMSET(buf, 0, sizeof(buf)); + ExpectIntEQ(wolfSSL_PEM_def_callback(buf, smallLen, 0, (void*)defpwd), + smallLen); + ExpectIntEQ(XMEMCMP(buf, defpwd, smallLen), 0); + ExpectIntEQ(buf[smallLen], 0); +#endif /* OPENSSL_EXTRA */ + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_read_PrivateKey(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) \ - && !defined(NO_FILESYSTEM) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && (!defined(NO_RSA) || \ + !defined(NO_DSA) || defined(HAVE_ECC) || !defined(NO_DH)) XFILE file = XBADFILE; - const char* fname = "./certs/server-key.pem"; - EVP_PKEY* pkey = NULL; +#if !defined(NO_RSA) + const char* fname_rsa = "./certs/server-key.pem"; RSA* rsa = NULL; WOLFSSL_EVP_PKEY_CTX* ctx = NULL; unsigned char* sig = NULL; - size_t sigLen; + size_t sigLen = 0; const unsigned char tbs[] = {0, 1, 2, 3, 4, 5, 6, 7}; size_t tbsLen = sizeof(tbs); +#endif +#if !defined(NO_DSA) + const char* fname_dsa = "./certs/dsa2048.pem"; +#endif +#if defined(HAVE_ECC) + const char* fname_ec = "./certs/ecc-key.pem"; +#endif +#if !defined(NO_DH) + const char* fname_dh = "./certs/dh-priv-2048.pem"; +#endif + EVP_PKEY* pkey = NULL; /* Check error case. */ ExpectNull(pkey = PEM_read_PrivateKey(NULL, NULL, NULL, NULL)); + /* not a PEM key. */ + ExpectTrue((file = XFOPEN("./certs/ecc-key.der", "rb")) != XBADFILE); + ExpectNull(PEM_read_PrivateKey(file, NULL, NULL, NULL)); + if (file != XBADFILE) + XFCLOSE(file); + file = XBADFILE; + +#ifndef NO_RSA /* Read in an RSA key. */ - ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); + ExpectTrue((file = XFOPEN(fname_rsa, "rb")) != XBADFILE); ExpectNotNull(pkey = PEM_read_PrivateKey(file, NULL, NULL, NULL)); if (file != XBADFILE) XFCLOSE(file); + file = XBADFILE; /* Make sure the key is usable by signing some data with it. */ ExpectNotNull(rsa = EVP_PKEY_get0_RSA(pkey)); @@ -36129,18 +44789,61 @@ XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); + pkey = NULL; +#endif - res = EXPECT_RESULT(); +#ifndef NO_DSA + /* Read in a DSA key. */ + ExpectTrue((file = XFOPEN(fname_dsa, "rb")) != XBADFILE); +#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH) + ExpectNotNull(pkey = PEM_read_PrivateKey(file, NULL, NULL, NULL)); + EVP_PKEY_free(pkey); + pkey = NULL; +#else + ExpectNull(PEM_read_PrivateKey(file, NULL, NULL, NULL)); #endif - return res; + if (file != XBADFILE) + XFCLOSE(file); + file = XBADFILE; +#endif + +#ifdef HAVE_ECC + /* Read in an EC key. */ + ExpectTrue((file = XFOPEN(fname_ec, "rb")) != XBADFILE); + ExpectNotNull(pkey = EVP_PKEY_new()); + ExpectPtrEq(PEM_read_PrivateKey(file, &pkey, NULL, NULL), pkey); + if (file != XBADFILE) + XFCLOSE(file); + file = XBADFILE; + EVP_PKEY_free(pkey); + pkey = NULL; +#endif + +#ifndef NO_DH + /* Read in a DH key. */ + ExpectTrue((file = XFOPEN(fname_dh, "rb")) != XBADFILE); +#if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || \ + defined(WOLFSSL_OPENSSH)) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) + ExpectNotNull(pkey = PEM_read_PrivateKey(file, NULL, NULL, NULL)); + EVP_PKEY_free(pkey); + pkey = NULL; +#else + ExpectNull(PEM_read_PrivateKey(file, NULL, NULL, NULL)); +#endif + if (file != XBADFILE) + XFCLOSE(file); + file = XBADFILE; +#endif +#endif + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_read_PUBKEY(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) \ && !defined(NO_FILESYSTEM) - EXPECT_DECLS; XFILE file = XBADFILE; const char* fname = "./certs/client-keyPub.pem"; EVP_PKEY* pkey = NULL; @@ -36152,289 +44855,445 @@ ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); ExpectNotNull(pkey = PEM_read_PUBKEY(file, NULL, NULL, NULL)); EVP_PKEY_free(pkey); + pkey = NULL; + if (file != XBADFILE) + XFCLOSE(file); + file = XBADFILE; + ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); + ExpectNotNull(pkey = EVP_PKEY_new()); + ExpectPtrEq(PEM_read_PUBKEY(file, &pkey, NULL, NULL), pkey); + EVP_PKEY_free(pkey); if (file != XBADFILE) XFCLOSE(file); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } -static int test_wolfSSL_PEM_PrivateKey(void) +/* test loading RSA key using BIO */ +static int test_wolfSSL_PEM_PrivateKey_rsa(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - (!defined(NO_RSA) || defined(HAVE_ECC)) && defined(USE_CERT_BUFFERS_2048) EXPECT_DECLS; -#ifndef NO_BIO +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) && \ + defined(USE_CERT_BUFFERS_2048) && !defined(NO_FILESYSTEM) && \ + !defined(NO_BIO) BIO* bio = NULL; -#endif + XFILE file = XBADFILE; + const char* fname = "./certs/server-key.pem"; + const char* fname_rsa_p8 = "./certs/server-keyPkcs8.pem"; EVP_PKEY* pkey = NULL; + size_t sz = 0; + byte* buf = NULL; + EVP_PKEY* pkey2 = NULL; + EVP_PKEY* pkey3 = NULL; + RSA* rsa_key = NULL; +#if defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN) + unsigned char extra[10]; + int i; + BIO* pub_bio = NULL; const unsigned char* server_key = (const unsigned char*)server_key_der_2048; +#endif -#ifndef NO_BIO + ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); + ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); + ExpectIntGT(sz = XFTELL(file), 0); + ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); + ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); + if (buf != NULL) { + ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); + } + if (file != XBADFILE) { + XFCLOSE(file); + file = XBADFILE; + } - /* test creating new EVP_PKEY with bad arg */ - ExpectNull((pkey = PEM_read_bio_PrivateKey(NULL, NULL, NULL, NULL))); + /* Test using BIO new mem and loading PEM private key */ + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); + XFREE(buf, NULL, DYNAMIC_TYPE_FILE); + buf = NULL; + BIO_free(bio); + bio = NULL; - /* test loading RSA key using BIO */ -#if !defined(NO_RSA) && !defined(NO_FILESYSTEM) - { - XFILE file = XBADFILE; - const char* fname = "./certs/server-key.pem"; - const char* fname_rsa_p8 = "./certs/server-keyPkcs8.pem"; + /* New empty EVP_PKEY */ + ExpectNotNull(pkey2 = EVP_PKEY_new()); + if (pkey2 != NULL) { + pkey2->type = EVP_PKEY_RSA; + } + /* Test parameter copy */ + ExpectIntEQ(EVP_PKEY_copy_parameters(pkey2, pkey), 0); + EVP_PKEY_free(pkey2); + EVP_PKEY_free(pkey); + pkey = NULL; - size_t sz; - byte* buf = NULL; - EVP_PKEY* pkey2 = NULL; - EVP_PKEY* pkey3 = NULL; - RSA* rsa_key = NULL; + /* Qt unit test case : rsa pkcs8 key */ + ExpectTrue((file = XFOPEN(fname_rsa_p8, "rb")) != XBADFILE); + ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); + ExpectIntGT(sz = XFTELL(file), 0); + ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); + ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); + if (buf) { + ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); + } + if (file != XBADFILE) { + XFCLOSE(file); + file = XBADFILE; + } - ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); - ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); - ExpectIntGT(sz = XFTELL(file), 0); - ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); - ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); - if (buf != NULL) { - ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); - } - if (file != XBADFILE) { - XFCLOSE(file); - file = XBADFILE; - } + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); + XFREE(buf, NULL, DYNAMIC_TYPE_FILE); + buf = NULL; + BIO_free(bio); + bio = NULL; + ExpectNotNull(pkey3 = EVP_PKEY_new()); - /* Test using BIO new mem and loading PEM private key */ - ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); - ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); - XFREE(buf, NULL, DYNAMIC_TYPE_FILE); - buf = NULL; - BIO_free(bio); - bio = NULL; - ExpectNotNull(pkey2 = EVP_PKEY_new()); - if (pkey2 != NULL) { - pkey2->type = EVP_PKEY_RSA; - } - /* Test parameter copy */ - ExpectIntEQ(EVP_PKEY_copy_parameters(pkey2, pkey), 0); - EVP_PKEY_free(pkey2); - EVP_PKEY_free(pkey); - pkey = NULL; + ExpectNotNull(rsa_key = EVP_PKEY_get1_RSA(pkey)); + ExpectIntEQ(EVP_PKEY_set1_RSA(pkey3, rsa_key), WOLFSSL_SUCCESS); - /* Qt unit test case : rsa pkcs8 key */ - ExpectTrue((file = XFOPEN(fname_rsa_p8, "rb")) != XBADFILE); - ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); - ExpectIntGT(sz = XFTELL(file), 0); - ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); - ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); - if (buf) { - ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); - } - if (file != XBADFILE) { - XFCLOSE(file); - file = XBADFILE; - } +#ifdef WOLFSSL_ERROR_CODE_OPENSSL + ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 1/* match */); +#else + ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 0); +#endif - ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); - ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); - XFREE(buf, NULL, DYNAMIC_TYPE_FILE); - buf = NULL; - BIO_free(bio); - bio = NULL; - ExpectNotNull(pkey3 = EVP_PKEY_new()); + RSA_free(rsa_key); + EVP_PKEY_free(pkey3); + EVP_PKEY_free(pkey); + pkey = NULL; + pkey2 = NULL; - ExpectNotNull(rsa_key = EVP_PKEY_get1_RSA(pkey)); - ExpectIntEQ(EVP_PKEY_set1_RSA(pkey3, rsa_key), WOLFSSL_SUCCESS); +#if defined(WOLFSSL_KEY_GEN) || defined(WOLFSSL_CERT_GEN) + #define BIO_PEM_TEST_CHAR 'a' + XMEMSET(extra, BIO_PEM_TEST_CHAR, sizeof(extra)); - #ifdef WOLFSSL_ERROR_CODE_OPENSSL - ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 1/* match */); - #else - ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 0); - #endif + ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + ExpectIntEQ(BIO_set_write_buf_size(bio, 4096), SSL_FAILURE); + ExpectNotNull(pub_bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + ExpectIntEQ(BIO_set_write_buf_size(pub_bio, 4096), SSL_FAILURE); - RSA_free(rsa_key); - EVP_PKEY_free(pkey3); - EVP_PKEY_free(pkey); - pkey = NULL; + ExpectNull(d2i_PrivateKey(EVP_PKEY_EC, &pkey, &server_key, + (long)sizeof_server_key_der_2048)); + ExpectNull(pkey); + + ExpectNotNull(wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, &pkey, &server_key, + (long)sizeof_server_key_der_2048)); + ExpectIntEQ(PEM_write_bio_PrivateKey(NULL, pkey, NULL, NULL, 0, NULL, NULL), + WOLFSSL_FAILURE); + ExpectIntEQ(PEM_write_bio_PrivateKey(bio, NULL, NULL, NULL, 0, NULL, NULL), + WOLFSSL_FAILURE); + ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), + WOLFSSL_SUCCESS); + ExpectIntGT(BIO_pending(bio), 0); + ExpectIntEQ(BIO_pending(bio), 1679); + /* Check if the pubkey API writes only the public key */ +#ifdef WOLFSSL_KEY_GEN + ExpectIntEQ(PEM_write_bio_PUBKEY(NULL, pkey), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_write_bio_PUBKEY(pub_bio, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_write_bio_PUBKEY(pub_bio, pkey), WOLFSSL_SUCCESS); + ExpectIntGT(BIO_pending(pub_bio), 0); + /* Previously both the private key and the pubkey calls would write + * out the private key and the PEM header was the only difference. + * The public PEM should be significantly shorter than the + * private key versison. */ + ExpectIntEQ(BIO_pending(pub_bio), 451); +#else + /* Not supported. */ + ExpectIntEQ(PEM_write_bio_PUBKEY(pub_bio, pkey), 0); +#endif + + /* test creating new EVP_PKEY with good args */ + ExpectNotNull((pkey2 = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); + if (pkey && pkey->pkey.ptr && pkey2 && pkey2->pkey.ptr) { + ExpectIntEQ((int)XMEMCMP(pkey->pkey.ptr, pkey2->pkey.ptr, + pkey->pkey_sz), 0); } -#endif - /* test loading ECC key using BIO */ -#if defined(HAVE_ECC) && !defined(NO_FILESYSTEM) - { - XFILE file = XBADFILE; - const char* fname = "./certs/ecc-key.pem"; - const char* fname_ecc_p8 = "./certs/ecc-keyPkcs8.pem"; + /* test of reuse of EVP_PKEY */ + ExpectNull(PEM_read_bio_PrivateKey(bio, &pkey, NULL, NULL)); + ExpectIntEQ(BIO_pending(bio), 0); + ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), + SSL_SUCCESS); + /* add 10 extra bytes after PEM */ + ExpectIntEQ(BIO_write(bio, extra, 10), 10); + ExpectNotNull(PEM_read_bio_PrivateKey(bio, &pkey, NULL, NULL)); + ExpectNotNull(pkey); + if (pkey && pkey->pkey.ptr && pkey2 && pkey2->pkey.ptr) { + ExpectIntEQ((int)XMEMCMP(pkey->pkey.ptr, pkey2->pkey.ptr, + pkey->pkey_sz), 0); + } + /* check 10 extra bytes still there */ + ExpectIntEQ(BIO_pending(bio), 10); + ExpectIntEQ(BIO_read(bio, extra, 10), 10); + for (i = 0; i < 10; i++) { + ExpectIntEQ(extra[i], BIO_PEM_TEST_CHAR); + } - size_t sz = 0; - byte* buf = NULL; - EVP_PKEY* pkey2 = NULL; - EVP_PKEY* pkey3 = NULL; - EC_KEY* ec_key = NULL; - int nid = 0; + BIO_free(pub_bio); + BIO_free(bio); + bio = NULL; + EVP_PKEY_free(pkey); + pkey = NULL; + EVP_PKEY_free(pkey2); +#endif /* WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN */ +#endif /* OPENSSL_EXTRA && !NO_CERTS && !NO_RSA && USE_CERT_BUFFERS_2048 && + * !NO_FILESYSTEM && !NO_BIO */ + return EXPECT_RESULT(); +} - ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); - ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); - ExpectIntGT(sz = XFTELL(file), 0); - ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); - ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); - if (buf) { - ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); - } - if (file != XBADFILE) { - XFCLOSE(file); - file = XBADFILE; - } +/* test loading ECC key using BIO */ +static int test_wolfSSL_PEM_PrivateKey_ecc(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && defined(HAVE_ECC) && \ + !defined(NO_FILESYSTEM) && !defined(NO_BIO) + BIO* bio = NULL; + EVP_PKEY* pkey = NULL; + XFILE file = XBADFILE; + const char* fname = "./certs/ecc-key.pem"; + const char* fname_ecc_p8 = "./certs/ecc-keyPkcs8.pem"; - /* Test using BIO new mem and loading PEM private key */ - ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); - ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); - XFREE(buf, NULL, DYNAMIC_TYPE_FILE); - buf = NULL; - BIO_free(bio); - bio = NULL; - ExpectNotNull(pkey2 = EVP_PKEY_new()); - ExpectNotNull(pkey3 = EVP_PKEY_new()); - if (pkey2 != NULL) { - pkey2->type = EVP_PKEY_EC; - } - /* Test parameter copy */ - ExpectIntEQ(EVP_PKEY_copy_parameters(pkey2, pkey), 1); - /* Qt unit test case 1*/ - ExpectNotNull(ec_key = EVP_PKEY_get1_EC_KEY(pkey)); - ExpectIntEQ(EVP_PKEY_set1_EC_KEY(pkey3, ec_key), WOLFSSL_SUCCESS); - #ifdef WOLFSSL_ERROR_CODE_OPENSSL - ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 1/* match */); - #else - ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 0); - #endif - /* Test default digest */ - ExpectIntEQ(EVP_PKEY_get_default_digest_nid(pkey, &nid), 1); - ExpectIntEQ(nid, NID_sha256); - EC_KEY_free(ec_key); - ec_key = NULL; - EVP_PKEY_free(pkey3); - pkey3 = NULL; - EVP_PKEY_free(pkey2); - pkey2 = NULL; - EVP_PKEY_free(pkey); - pkey = NULL; + size_t sz = 0; + byte* buf = NULL; + EVP_PKEY* pkey2 = NULL; + EVP_PKEY* pkey3 = NULL; + EC_KEY* ec_key = NULL; + int nid = 0; + BIO* pub_bio = NULL; - /* Qt unit test case ec pkcs8 key */ - ExpectTrue((file = XFOPEN(fname_ecc_p8, "rb")) != XBADFILE); - ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); - ExpectIntGT(sz = XFTELL(file), 0); - ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); - ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); - if (buf) { - ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); - } - if (file != XBADFILE) { - XFCLOSE(file); - file = XBADFILE; - } + ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); + ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); + ExpectIntGT(sz = XFTELL(file), 0); + ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); + ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); + if (buf) { + ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); + } + if (file != XBADFILE) { + XFCLOSE(file); + file = XBADFILE; + } - ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); - ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); - XFREE(buf, NULL, DYNAMIC_TYPE_FILE); - buf = NULL; - BIO_free(bio); - bio = NULL; - ExpectNotNull(pkey3 = EVP_PKEY_new()); - /* Qt unit test case */ - ExpectNotNull(ec_key = EVP_PKEY_get1_EC_KEY(pkey)); - ExpectIntEQ(EVP_PKEY_set1_EC_KEY(pkey3, ec_key), WOLFSSL_SUCCESS); - #ifdef WOLFSSL_ERROR_CODE_OPENSSL - ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 1/* match */); - #else - ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 0); - #endif - EC_KEY_free(ec_key); - EVP_PKEY_free(pkey3); - EVP_PKEY_free(pkey); - pkey = NULL; + /* Test using BIO new mem and loading PEM private key */ + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); + BIO_free(bio); + bio = NULL; + XFREE(buf, NULL, DYNAMIC_TYPE_FILE); + buf = NULL; + ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + ExpectNotNull(pub_bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), + WOLFSSL_SUCCESS); + ExpectIntGT(BIO_pending(bio), 0); + /* No parmeters. */ + ExpectIntEQ(BIO_pending(bio), 227); + /* Check if the pubkey API writes only the public key */ +#ifdef WOLFSSL_KEY_GEN + ExpectIntEQ(PEM_write_bio_PUBKEY(pub_bio, pkey), WOLFSSL_SUCCESS); + ExpectIntGT(BIO_pending(pub_bio), 0); + /* Previously both the private key and the pubkey calls would write + * out the private key and the PEM header was the only difference. + * The public PEM should be significantly shorter than the + * private key versison. */ + ExpectIntEQ(BIO_pending(pub_bio), 178); +#endif + BIO_free(pub_bio); + BIO_free(bio); + bio = NULL; + ExpectNotNull(pkey2 = EVP_PKEY_new()); + ExpectNotNull(pkey3 = EVP_PKEY_new()); + if (pkey2 != NULL) { + pkey2->type = EVP_PKEY_EC; + } + /* Test parameter copy */ + ExpectIntEQ(EVP_PKEY_copy_parameters(pkey2, pkey), 1); + + + /* Qt unit test case 1*/ + ExpectNotNull(ec_key = EVP_PKEY_get1_EC_KEY(pkey)); + ExpectIntEQ(EVP_PKEY_set1_EC_KEY(pkey3, ec_key), WOLFSSL_SUCCESS); + #ifdef WOLFSSL_ERROR_CODE_OPENSSL + ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 1/* match */); + #else + ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 0); + #endif + /* Test default digest */ + ExpectIntEQ(EVP_PKEY_get_default_digest_nid(pkey, &nid), 1); + ExpectIntEQ(nid, NID_sha256); + EC_KEY_free(ec_key); + ec_key = NULL; + EVP_PKEY_free(pkey3); + pkey3 = NULL; + EVP_PKEY_free(pkey2); + pkey2 = NULL; + EVP_PKEY_free(pkey); + pkey = NULL; + + /* Qt unit test case ec pkcs8 key */ + ExpectTrue((file = XFOPEN(fname_ecc_p8, "rb")) != XBADFILE); + ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); + ExpectIntGT(sz = XFTELL(file), 0); + ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); + ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); + if (buf) { + ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); + } + if (file != XBADFILE) { + XFCLOSE(file); + file = XBADFILE; } + + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull((pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); + XFREE(buf, NULL, DYNAMIC_TYPE_FILE); + buf = NULL; + BIO_free(bio); + bio = NULL; + ExpectNotNull(pkey3 = EVP_PKEY_new()); + /* Qt unit test case */ + ExpectNotNull(ec_key = EVP_PKEY_get1_EC_KEY(pkey)); + ExpectIntEQ(EVP_PKEY_set1_EC_KEY(pkey3, ec_key), WOLFSSL_SUCCESS); +#ifdef WOLFSSL_ERROR_CODE_OPENSSL + ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 1/* match */); +#else + ExpectIntEQ(EVP_PKEY_cmp(pkey, pkey3), 0); +#endif + EC_KEY_free(ec_key); + EVP_PKEY_free(pkey3); + EVP_PKEY_free(pkey); + pkey = NULL; #endif + return EXPECT_RESULT(); +} -#if !defined(NO_BIO) && !defined(NO_RSA) && (defined(WOLFSSL_KEY_GEN) || \ - defined(WOLFSSL_CERT_GEN)) - { - #define BIO_PEM_TEST_CHAR 'a' - EVP_PKEY* pkey2 = NULL; - unsigned char extra[10]; - int i; - BIO* pub_bio = NULL; +/* test loading DSA key using BIO */ +static int test_wolfSSL_PEM_PrivateKey_dsa(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_DSA) && \ + !defined(NO_FILESYSTEM) && !defined(NO_BIO) +#if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) + BIO* bio = NULL; + EVP_PKEY* pkey = NULL; - XMEMSET(extra, BIO_PEM_TEST_CHAR, sizeof(extra)); + ExpectNotNull(bio = BIO_new_file("./certs/dsa2048.pem", "rb")); + /* Private DSA EVP_PKEY */ + ExpectNotNull(pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, NULL, + NULL)); + BIO_free(bio); + bio = NULL; - ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); - ExpectIntEQ(BIO_set_write_buf_size(bio, 4096), SSL_FAILURE); - ExpectNotNull(pub_bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); - ExpectIntEQ(BIO_set_write_buf_size(pub_bio, 4096), SSL_FAILURE); + ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); +#if defined(OPENSSL_ALL) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8) + ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, NULL, NULL, 0, NULL, + NULL), 0); +#endif - ExpectNull(d2i_PrivateKey(EVP_PKEY_EC, &pkey, - &server_key, (long)sizeof_server_key_der_2048)); - ExpectNull(pkey); +#ifdef WOLFSSL_KEY_GEN + ExpectIntEQ(PEM_write_bio_PUBKEY(bio, pkey), 1); + ExpectIntEQ(BIO_pending(bio), 1178); + BIO_reset(bio); +#endif - ExpectNotNull(wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, &pkey, - &server_key, (long)sizeof_server_key_der_2048)); - ExpectIntEQ(PEM_write_bio_PrivateKey(NULL, pkey, NULL, NULL, 0, NULL, - NULL), WOLFSSL_FAILURE); - ExpectIntEQ(PEM_write_bio_PrivateKey(bio, NULL, NULL, NULL, 0, NULL, - NULL), WOLFSSL_FAILURE); - ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, - NULL), WOLFSSL_SUCCESS); - ExpectIntGT(BIO_pending(bio), 0); - ExpectIntEQ(BIO_pending(bio), 1679); - /* Check if the pubkey API writes only the public key */ + ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), + 1); + ExpectIntEQ(BIO_pending(bio), 1196); + + BIO_free(bio); + bio = NULL; + + EVP_PKEY_free(pkey); + pkey = NULL; +#endif +#endif + return EXPECT_RESULT(); +} + +/* test loading DH key using BIO */ +static int test_wolfSSL_PEM_PrivateKey_dh(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_DH) && \ + !defined(NO_FILESYSTEM) && !defined(NO_BIO) +#if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || \ + defined(WOLFSSL_OPENSSH)) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) + BIO* bio = NULL; + EVP_PKEY* pkey = NULL; + + ExpectNotNull(bio = BIO_new_file("./certs/dh-priv-2048.pem", "rb")); + /* Private DH EVP_PKEY */ + ExpectNotNull(pkey = wolfSSL_PEM_read_bio_PrivateKey(bio, NULL, NULL, + NULL)); + BIO_free(bio); + bio = NULL; + + ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + +#if defined(OPENSSL_ALL) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8) + ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, NULL, NULL, 0, NULL, + NULL), 0); +#endif #ifdef WOLFSSL_KEY_GEN - ExpectIntEQ(PEM_write_bio_PUBKEY(NULL, pkey), WOLFSSL_FAILURE); - ExpectIntEQ(PEM_write_bio_PUBKEY(pub_bio, NULL), WOLFSSL_FAILURE); - ExpectIntEQ(PEM_write_bio_PUBKEY(pub_bio, pkey), WOLFSSL_SUCCESS); - ExpectIntGT(BIO_pending(pub_bio), 0); - /* Previously both the private key and the pubkey calls would write - * out the private key and the PEM header was the only difference. - * The public PEM should be significantly shorter than the - * private key versison. */ - ExpectIntEQ(BIO_pending(pub_bio), 451); + ExpectIntEQ(PEM_write_bio_PUBKEY(bio, pkey), 0); #endif + ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), + 1); + ExpectIntEQ(BIO_pending(bio), 806); - /* test creating new EVP_PKEY with good args */ - ExpectNotNull((pkey2 = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL))); - if (pkey && pkey->pkey.ptr && pkey2 && pkey2->pkey.ptr) - ExpectIntEQ((int)XMEMCMP(pkey->pkey.ptr, pkey2->pkey.ptr, pkey->pkey_sz), 0); - - /* test of reuse of EVP_PKEY */ - ExpectNull(PEM_read_bio_PrivateKey(bio, &pkey, NULL, NULL)); - ExpectIntEQ(BIO_pending(bio), 0); - ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), - SSL_SUCCESS); - ExpectIntEQ(BIO_write(bio, extra, 10), 10); /* add 10 extra bytes after PEM */ - ExpectNotNull(PEM_read_bio_PrivateKey(bio, &pkey, NULL, NULL)); - ExpectNotNull(pkey); - if (pkey && pkey->pkey.ptr && pkey2 && pkey2->pkey.ptr) { - ExpectIntEQ((int)XMEMCMP(pkey->pkey.ptr, pkey2->pkey.ptr, pkey->pkey_sz),0); - } - ExpectIntEQ(BIO_pending(bio), 10); /* check 10 extra bytes still there */ - ExpectIntEQ(BIO_read(bio, extra, 10), 10); - for (i = 0; i < 10; i++) { - ExpectIntEQ(extra[i], BIO_PEM_TEST_CHAR); - } + BIO_free(bio); + bio = NULL; - BIO_free(pub_bio); - BIO_free(bio); - bio = NULL; - EVP_PKEY_free(pkey); - pkey = NULL; - EVP_PKEY_free(pkey2); + EVP_PKEY_free(pkey); + pkey = NULL; +#endif +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_PEM_PrivateKey(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ + (!defined(NO_RSA) || defined(HAVE_ECC)) && defined(USE_CERT_BUFFERS_2048) +#ifndef NO_BIO + BIO* bio = NULL; +#endif + EVP_PKEY* pkey = NULL; + const unsigned char* server_key = (const unsigned char*)server_key_der_2048; + +#ifndef NO_BIO + + /* test creating new EVP_PKEY with bad arg */ + ExpectNull((pkey = PEM_read_bio_PrivateKey(NULL, NULL, NULL, NULL))); + + /* Test bad EVP_PKEY type. */ + /* New HMAC EVP_PKEY */ + ExpectNotNull(bio = BIO_new_mem_buf("", 1)); + ExpectNotNull(pkey = EVP_PKEY_new()); + if (pkey != NULL) { + pkey->type = EVP_PKEY_HMAC; } - #endif + ExpectIntEQ(PEM_write_bio_PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), + 0); +#if defined(OPENSSL_ALL) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8) + ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, NULL, NULL, 0, NULL, + NULL), 0); +#endif +#ifdef WOLFSSL_KEY_GEN + ExpectIntEQ(PEM_write_bio_PUBKEY(bio, pkey), WOLFSSL_FAILURE); +#endif + EVP_PKEY_free(pkey); + pkey = NULL; + BIO_free(bio); + bio = NULL; + /* key is DES encrypted */ #if !defined(NO_DES3) && defined(WOLFSSL_ENCRYPTED_KEYS) && \ !defined(NO_RSA) && !defined(NO_BIO) && !defined(NO_FILESYSTEM) && \ - !defined(NO_MD5) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_USER_RSA) && !defined(NO_RSA) + !defined(NO_MD5) && defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) { XFILE f = XBADFILE; wc_pem_password_cb* passwd_cb = NULL; @@ -36521,9 +45380,9 @@ server_key = buf; pkey = NULL; - ExpectNull(d2i_PrivateKey(EVP_PKEY_RSA, &pkey, &server_key, bytes)); + ExpectNull(d2i_PrivateKey(EVP_PKEY_RSA, &pkey, &server_key, (long int)bytes)); ExpectNull(pkey); - ExpectNotNull(d2i_PrivateKey(EVP_PKEY_EC, &pkey, &server_key, bytes)); + ExpectNotNull(d2i_PrivateKey(EVP_PKEY_EC, &pkey, &server_key, (long int)bytes)); ExpectIntEQ(SSL_CTX_use_PrivateKey(ctx, pkey), SSL_SUCCESS); EVP_PKEY_free(pkey); @@ -36533,25 +45392,21 @@ } #endif - res = EXPECT_RESULT(); - #ifndef NO_BIO (void)bio; #endif (void)pkey; (void)server_key; - #endif /* OPENSSL_EXTRA && !NO_CERTS && !NO_RSA && USE_CERT_BUFFERS_2048 */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_file_RSAKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && \ defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && \ - !defined(HAVE_USER_RSA) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) - EXPECT_DECLS; + !defined(NO_FILESYSTEM) && !defined(NO_CERTS) RSA* rsa = NULL; XFILE fp = XBADFILE; @@ -36570,21 +45425,18 @@ ExpectIntEQ(PEM_write_RSA_PUBKEY(stderr, rsa), WOLFSSL_SUCCESS); RSA_free(rsa); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && \ (defined(WOLFSSL_KEY_GEN) || WOLFSSL_CERT_GEN) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && !defined(NO_CERTS) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_file_RSAPrivateKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_USER_RSA) && !defined(NO_FILESYSTEM) && \ + !defined(NO_FILESYSTEM) && \ (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)) - EXPECT_DECLS; RSA* rsa = NULL; XFILE f = NULL; @@ -36611,18 +45463,15 @@ if (f != XBADFILE) XFCLOSE(f); #endif /* HAVE_ECC */ - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_read_RSA_PUBKEY(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) - EXPECT_DECLS; XFILE file = XBADFILE; const char* fname = "./certs/client-keyPub.pem"; RSA *rsa = NULL; @@ -36635,20 +45484,17 @@ RSA_free(rsa); if (file != XBADFILE) XFCLOSE(file); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) */ - return res; + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_PEM_bio_RSAKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && \ defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && \ - !defined(HAVE_USER_RSA) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) - EXPECT_DECLS; + !defined(NO_FILESYSTEM) && !defined(NO_CERTS) RSA* rsa = NULL; BIO* bio = NULL; @@ -36704,20 +45550,17 @@ RSA_free(rsa); rsa = NULL; #endif /* HAVE_ECC */ - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && \ (defined(WOLFSSL_KEY_GEN) || WOLFSSL_CERT_GEN) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && !defined(NO_CERTS) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_bio_RSAPrivateKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) - EXPECT_DECLS; RSA* rsa = NULL; RSA* rsa_dup = NULL; BIO* bio = NULL; @@ -36726,7 +45569,7 @@ ExpectNotNull((rsa = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL))); ExpectIntEQ(RSA_size(rsa), 256); -#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) ExpectNull(rsa_dup = RSAPublicKey_dup(NULL)); /* Test duplicating empty key. */ ExpectNotNull(rsa_dup = RSA_new()); @@ -36754,19 +45597,16 @@ BIO_free(bio); #endif /* HAVE_ECC */ - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_bio_DSAKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifndef HAVE_SELFTEST #if (defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) && !defined(NO_CERTS) && \ defined(WOLFSSL_KEY_GEN) && !defined(NO_FILESYSTEM) && !defined(NO_DSA) - EXPECT_DECLS; DSA* dsa = NULL; BIO* bio = NULL; @@ -36812,21 +45652,18 @@ DSA_free(dsa); dsa = NULL; #endif /* HAVE_ECC */ - - res = TEST_RES_CHECK(1); #endif /* defined(WOLFSSL_QT) || defined(OPENSSL_ALL)) && \ !defined(NO_CERTS) && defined(WOLFSSL_KEY_GEN) && \ !defined(NO_FILESYSTEM) && !defined(NO_DSA) */ #endif /* HAVE_SELFTEST */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_bio_ECKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && \ defined(WOLFSSL_KEY_GEN) && !defined(NO_FILESYSTEM) && defined(HAVE_ECC) - EXPECT_DECLS; EC_KEY* ec = NULL; EC_KEY* ec2; BIO* bio = NULL; @@ -36952,17 +45789,14 @@ ExpectNull(PEM_read_bio_ECPrivateKey(bio, NULL, NULL, NULL)); BIO_free(bio); bio = NULL; - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_PUBKEY(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) BIO* bio = NULL; EVP_PKEY* pkey = NULL; @@ -36974,7 +45808,7 @@ { XFILE file = XBADFILE; const char* fname = "./certs/ecc-client-keyPub.pem"; - size_t sz; + size_t sz = 0; byte* buf = NULL; EVP_PKEY* pkey2 = NULL; @@ -36995,6 +45829,13 @@ /* Test using BIO new mem and loading PEM private key */ ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); ExpectNotNull((pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL))); + BIO_free(bio); + bio = NULL; + EVP_PKEY_free(pkey); + pkey = NULL; + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull(pkey = EVP_PKEY_new()); + ExpectPtrEq(PEM_read_bio_PUBKEY(bio, &pkey, NULL, NULL), pkey); XFREE(buf, NULL, DYNAMIC_TYPE_FILE); BIO_free(bio); bio = NULL; @@ -37012,27 +45853,24 @@ EC_KEY_free(ec_key); EVP_PKEY_free(pkey2); EVP_PKEY_free(pkey); - pkey = NULL; + pkey = NULL; } #endif (void)bio; (void)pkey; - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #endif /* !NO_BIO */ static int test_DSA_do_sign_verify(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && \ !defined(NO_DSA) - EXPECT_DECLS; unsigned char digest[WC_SHA_DIGEST_SIZE]; DSA_SIG* sig = NULL; DSA* dsa = NULL; @@ -37066,7 +45904,7 @@ XMEMSET(digest, 202, sizeof(digest)); ExpectNotNull(dsa = DSA_new()); - ExpectIntEQ(DSA_LoadDer(dsa, tmp, bytes), 1); + ExpectIntEQ(DSA_LoadDer(dsa, tmp, (int)bytes), 1); ExpectIntEQ(wolfSSL_DSA_do_sign(digest, sigBin, dsa), 1); ExpectIntEQ(wolfSSL_DSA_do_verify(digest, sigBin, dsa, &dsacheck), 1); @@ -37076,20 +45914,17 @@ DSA_SIG_free(sig); DSA_free(dsa); - - res = EXPECT_RESULT(); #endif #endif /* !HAVE_SELFTEST && !HAVE_FIPS */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_tmp_dh(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_DSA) && !defined(NO_RSA) && !defined(NO_DH) && !defined(NO_BIO) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; byte buff[6000]; char file[] = "./certs/dsaparams.pem"; XFILE f = XBADFILE; @@ -37142,24 +45977,23 @@ BIO_free(bio); DSA_free(dsa); DH_free(dh); + dh = NULL; #if defined(WOLFSSL_DH_EXTRA) && \ (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH)) DH_free(dh2); + dh2 = NULL; #endif SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ctrl(void) { - int res = TEST_SKIPPED; -#if defined (OPENSSL_EXTRA) && !defined(NO_BIO) EXPECT_DECLS; +#if defined (OPENSSL_EXTRA) && !defined(NO_BIO) byte buff[6000]; BIO* bio = NULL; int bytes; @@ -37179,18 +46013,15 @@ */ BIO_free(bio); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_BIO) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_new_mac_key(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_EXTRA EXPECT_DECLS; +#ifdef OPENSSL_EXTRA static const unsigned char pw[] = "password"; static const int pwSz = sizeof(pw) - 1; size_t checkPwSz = 0; @@ -37237,19 +46068,16 @@ ExpectIntEQ((int)checkPwSz, 0); wolfSSL_EVP_PKEY_free(key); key = NULL; - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_new_CMAC_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_EXTRA #if defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT) - EXPECT_DECLS; const char *priv = "ABCDEFGHIJKLMNOP"; const WOLFSSL_EVP_CIPHER* cipher = EVP_aes_128_cbc(); WOLFSSL_EVP_PKEY* key = NULL; @@ -37264,40 +46092,36 @@ ExpectNotNull(key = wolfSSL_EVP_PKEY_new_CMAC_key( NULL, (const unsigned char *)priv, AES_128_KEY_SIZE, cipher)); wolfSSL_EVP_PKEY_free(key); - - res = EXPECT_RESULT(); -#endif /* defined(WOLFSSL_CMAC) && !defined(NO_AES) && defined(WOLFSSL_AES_DIRECT) */ +#endif /* WOLFSSL_CMAC && !NO_AES && WOLFSSL_AES_DIRECT */ #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_Digest(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && !defined(NO_PWDBASED) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && !defined(NO_PWDBASED) const char* in = "abc"; int inLen = (int)XSTRLEN(in); byte out[WC_SHA256_DIGEST_SIZE]; unsigned int outLen; - const char* expOut = "\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22" - "\x23\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00" - "\x15\xAD"; + const char* expOut = + "\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22" + "\x23\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00" + "\x15\xAD"; - ExpectIntEQ(wolfSSL_EVP_Digest((unsigned char*)in, inLen, out, &outLen, "SHA256", NULL), 1); + ExpectIntEQ(wolfSSL_EVP_Digest((unsigned char*)in, inLen, out, &outLen, + "SHA256", NULL), 1); ExpectIntEQ(outLen, WC_SHA256_DIGEST_SIZE); ExpectIntEQ(XMEMCMP(out, expOut, WC_SHA256_DIGEST_SIZE), 0); - - res = EXPECT_RESULT(); #endif /* OPEN_EXTRA && ! NO_SHA256 */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_Digest_all(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_EXTRA EXPECT_DECLS; +#ifdef OPENSSL_EXTRA const char* digests[] = { #ifndef NO_MD5 "MD5", @@ -37348,17 +46172,14 @@ ExpectIntGT(outLen, 0); ExpectIntEQ(EVP_MD_size(*d), outLen); } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_MD_size(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_EXTRA EXPECT_DECLS; +#ifdef OPENSSL_EXTRA WOLFSSL_EVP_MD_CTX mdCtx; #ifdef WOLFSSL_SHA3 @@ -37496,17 +46317,14 @@ ExpectIntEQ(wolfSSL_EVP_MD_CTX_block_size(&mdCtx), BAD_FUNC_ARG); /* Cleanup is valid on uninit'ed struct */ ExpectIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), 1); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_MD_pkey_type(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_EXTRA EXPECT_DECLS; +#ifdef OPENSSL_EXTRA const WOLFSSL_EVP_MD* md; #ifndef NO_MD5 @@ -37531,10 +46349,8 @@ ExpectNotNull(md = EVP_sha512()); ExpectIntEQ(EVP_MD_pkey_type(md), NID_sha512WithRSAEncryption); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #ifdef OPENSSL_EXTRA @@ -37597,9 +46413,8 @@ static int test_wolfSSL_EVP_MD_hmac_signing(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_EXTRA EXPECT_DECLS; +#ifdef OPENSSL_EXTRA static const unsigned char testKey[] = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, @@ -37736,19 +46551,15 @@ sizeof(testResultSha3_512)), TEST_SUCCESS); #endif #endif - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_MD_rsa_signing(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_USER_RSA) && \ - defined(USE_CERT_BUFFERS_2048) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(USE_CERT_BUFFERS_2048) WOLFSSL_EVP_PKEY* privKey = NULL; WOLFSSL_EVP_PKEY* pubKey = NULL; WOLFSSL_EVP_PKEY_CTX* keyCtx = NULL; @@ -37860,18 +46671,15 @@ wolfSSL_EVP_PKEY_free(pubKey); wolfSSL_EVP_PKEY_free(privKey); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_MD_ecc_signing(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) WOLFSSL_EVP_PKEY* privKey = NULL; WOLFSSL_EVP_PKEY* pubKey = NULL; const char testData[] = "Hi There"; @@ -37934,20 +46742,17 @@ wolfSSL_EVP_PKEY_free(pubKey); wolfSSL_EVP_PKEY_free(privKey); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_add_extra_chain_cert(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && !defined(NO_BIO) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; char caFile[] = "./certs/client-ca.pem"; char clientFile[] = "./certs/client-cert.pem"; SSL_CTX* ctx = NULL; @@ -37971,7 +46776,6 @@ ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(clientFile, WOLFSSL_FILETYPE_PEM)); -#if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) /* additional test of getting EVP_PKEY key size from X509 * Do not run with user RSA because wolfSSL_RSA_size is not currently * allowed with user RSA */ @@ -38008,7 +46812,6 @@ pkey = NULL; #endif /* HAVE_ECC */ } -#endif /* !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) */ ExpectIntEQ((int)SSL_CTX_add_extra_chain_cert(ctx, x509), SSL_SUCCESS); if (EXPECT_SUCCESS()) { @@ -38052,24 +46855,21 @@ sk_X509_pop_free(chain, X509_free); sk_X509_pop_free(chain2, X509_free); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ - #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - !defined(NO_FILESYSTEM) && !defined(NO_RSA) && !defined (NO_BIO) */ - return res; +#endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ + !defined(NO_FILESYSTEM) && !defined(NO_RSA) && !defined (NO_BIO) */ + return EXPECT_RESULT(); } #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) static int test_wolfSSL_ERR_peek_last_error_line(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && defined(DEBUG_WOLFSSL) && \ !defined(NO_OLD_TLS) && !defined(WOLFSSL_NO_TLS12) && \ defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(NO_ERROR_QUEUE) - EXPECT_DECLS; callback_functions client_cb; callback_functions server_cb; int line = 0; @@ -38114,11 +46914,9 @@ fprintf(stderr, "\nTesting error print out\n"); ERR_print_errors_fp(stderr); fprintf(stderr, "Done testing print out\n\n"); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && * !defined(NO_FILESYSTEM) && !defined(DEBUG_WOLFSSL) */ - return res; + return EXPECT_RESULT(); } #endif /* !NO_WOLFSSL_CLIENT && !NO_WOLFSSL_SERVER */ @@ -38135,12 +46933,11 @@ static int test_wolfSSL_X509_Name_canon(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_SHA) && \ defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && !defined(NO_RSA) - EXPECT_DECLS; const long ex_hash1 = 0x0fdb2da4; const long ex_hash2 = 0x9f3e8c9e; X509_NAME *name = NULL; @@ -38159,7 +46956,7 @@ /* When output buffer is NULL, should return necessary output buffer * length.*/ ExpectIntGT(wolfSSL_i2d_X509_NAME_canon(name, NULL), 0); - ExpectIntGT((len = wolfSSL_i2d_X509_NAME_canon(name, &pbuf)), 0); + ExpectIntGT((len = (word32)wolfSSL_i2d_X509_NAME_canon(name, &pbuf)), 0); ExpectIntEQ(wc_ShaHash((const byte*)pbuf, (word32)len, digest), 0); hash = (((unsigned long)digest[3] << 24) | @@ -38181,7 +46978,7 @@ ExpectNotNull(x509 = PEM_read_X509(file, NULL, NULL, NULL)); ExpectNotNull(name = X509_get_issuer_name(x509)); - ExpectIntGT((len = wolfSSL_i2d_X509_NAME_canon(name, &pbuf)), 0); + ExpectIntGT((len = (word32)wolfSSL_i2d_X509_NAME_canon(name, &pbuf)), 0); ExpectIntEQ(wc_ShaHash((const byte*)pbuf, (word32)len, digest), 0); hash = (((unsigned long)digest[3] << 24) | @@ -38195,17 +46992,14 @@ XFCLOSE(file); X509_free(x509); XFREE(pbuf, NULL, DYNAMIC_TYPE_OPENSSL); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_LOOKUP_ctrl_hash_dir(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) const int MAX_DIR = 4; const char paths[][32] = { "./certs/ed25519", @@ -38270,19 +47064,16 @@ #endif X509_STORE_free(str); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_LOOKUP_ctrl_file(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && \ defined(WOLFSSL_SIGNER_DER_CERT) - EXPECT_DECLS; X509_STORE_CTX* ctx = NULL; X509_STORE* str = NULL; X509_LOOKUP* lookup = NULL; @@ -38411,10 +47202,8 @@ ExpectIntEQ(X509_LOOKUP_ctrl(NULL, 0, NULL, 0, NULL), 0); X509_STORE_free(str); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE_CTX_trusted_stack_cleanup(void) @@ -38431,9 +47220,8 @@ static int test_wolfSSL_X509_STORE_CTX_get0_current_issuer(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) X509_STORE_CTX* ctx = NULL; X509_STORE* str = NULL; X509* x509Ca = NULL; @@ -38466,18 +47254,15 @@ X509_free(x509Svr); X509_STORE_free(str); X509_free(x509Ca); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PKCS7_certs(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && !defined(NO_BIO) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && defined(HAVE_PKCS7) - EXPECT_DECLS; STACK_OF(X509)* sk = NULL; STACK_OF(X509_INFO)* info_sk = NULL; PKCS7 *p7 = NULL; @@ -38542,19 +47327,16 @@ PKCS7_free(p7); p7 = NULL; } - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && defined(HAVE_PKCS7) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE_CTX(void) { - int res = TEST_SKIPPED; - #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - !defined(NO_FILESYSTEM) && !defined(NO_RSA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ + !defined(NO_FILESYSTEM) && !defined(NO_RSA) X509_STORE_CTX* ctx = NULL; X509_STORE* str = NULL; X509* x509 = NULL; @@ -38679,19 +47461,129 @@ str = NULL; } - res = EXPECT_RESULT(); - #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ +#endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ + * !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ - return res; + return EXPECT_RESULT(); +} + +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) +static int test_X509_STORE_untrusted_load_cert_to_stack(const char* filename, + STACK_OF(X509)* chain) +{ + EXPECT_DECLS; + XFILE fp = XBADFILE; + X509* cert = NULL; + + ExpectTrue((fp = XFOPEN(filename, "rb")) + != XBADFILE); + ExpectNotNull(cert = PEM_read_X509(fp, 0, 0, 0 )); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntEQ(sk_X509_push(chain, cert), 1); + if (EXPECT_FAIL()) + X509_free(cert); + + return EXPECT_RESULT(); +} + +static int test_X509_STORE_untrusted_certs(const char** filenames, int ret, + int err, int loadCA) +{ + EXPECT_DECLS; + X509_STORE_CTX* ctx = NULL; + X509_STORE* str = NULL; + XFILE fp = XBADFILE; + X509* cert = NULL; + STACK_OF(X509)* untrusted = NULL; + + ExpectTrue((fp = XFOPEN("./certs/intermediate/server-int-cert.pem", "rb")) + != XBADFILE); + ExpectNotNull(cert = PEM_read_X509(fp, 0, 0, 0 )); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + + ExpectNotNull(str = X509_STORE_new()); + ExpectNotNull(ctx = X509_STORE_CTX_new()); + ExpectNotNull(untrusted = sk_X509_new_null()); + + ExpectIntEQ(X509_STORE_set_flags(str, 0), 1); + if (loadCA) { + ExpectIntEQ(X509_STORE_load_locations(str, "./certs/ca-cert.pem", NULL), + 1); + } + for (; *filenames; filenames++) { + ExpectIntEQ(test_X509_STORE_untrusted_load_cert_to_stack(*filenames, + untrusted), TEST_SUCCESS); + } + + ExpectIntEQ(X509_STORE_CTX_init(ctx, str, cert, untrusted), 1); + ExpectIntEQ(X509_verify_cert(ctx), ret); + ExpectIntEQ(X509_STORE_CTX_get_error(ctx), err); + + X509_free(cert); + X509_STORE_free(str); + X509_STORE_CTX_free(ctx); + sk_X509_pop_free(untrusted, NULL); + + return EXPECT_RESULT(); +} +#endif + +static int test_X509_STORE_untrusted(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) + const char* untrusted1[] = { + "./certs/intermediate/ca-int2-cert.pem", + NULL + }; + const char* untrusted2[] = { + "./certs/intermediate/ca-int-cert.pem", + "./certs/intermediate/ca-int2-cert.pem", + NULL + }; + const char* untrusted3[] = { + "./certs/intermediate/ca-int-cert.pem", + "./certs/intermediate/ca-int2-cert.pem", + "./certs/ca-cert.pem", + NULL + }; + /* Adding unrelated certs that should be ignored */ + const char* untrusted4[] = { + "./certs/client-ca.pem", + "./certs/intermediate/ca-int-cert.pem", + "./certs/server-cert.pem", + "./certs/intermediate/ca-int2-cert.pem", + NULL + }; + + /* Only immediate issuer in untrusted chain. Fails since can't build chain + * to loaded CA. */ + ExpectIntEQ(test_X509_STORE_untrusted_certs(untrusted1, 0, + X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, 1), TEST_SUCCESS); + /* Succeeds because path to loaded CA is available. */ + ExpectIntEQ(test_X509_STORE_untrusted_certs(untrusted2, 1, 0, 1), + TEST_SUCCESS); + /* Fails because root CA is in the untrusted stack */ + ExpectIntEQ(test_X509_STORE_untrusted_certs(untrusted3, 0, + X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, 0), TEST_SUCCESS); + /* Succeeds because path to loaded CA is available. */ + ExpectIntEQ(test_X509_STORE_untrusted_certs(untrusted4, 1, 0, 1), + TEST_SUCCESS); +#endif + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE_set_flags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) - EXPECT_DECLS; X509_STORE* store = NULL; X509* x509 = NULL; @@ -38710,20 +47602,17 @@ wolfSSL_X509_free(x509); wolfSSL_X509_STORE_free(store); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && * !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_LOOKUP_load_file(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) && \ (!defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH)) - EXPECT_DECLS; WOLFSSL_X509_STORE* store = NULL; WOLFSSL_X509_LOOKUP* lookup = NULL; @@ -38748,18 +47637,15 @@ } wolfSSL_X509_STORE_free(store); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && defined(HAVE_CRL) && * !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE_CTX_set_time(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) WOLFSSL_X509_STORE_CTX* ctx = NULL; time_t c_time; @@ -38770,18 +47656,15 @@ WOLFSSL_USE_CHECK_TIME); ExpectTrue(ctx->param->check_time == c_time); wolfSSL_X509_STORE_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_get0_set1_param(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; SSL_CTX* ctx = NULL; WOLFSSL_X509_VERIFY_PARAM* pParam = NULL; WOLFSSL_X509_VERIFY_PARAM* pvpm = NULL; @@ -38813,7 +47696,7 @@ ExpectIntEQ(0x01, pParam->hostFlags); ExpectIntEQ(0, XSTRNCMP(pParam->ipasc, testIPv4, WOLFSSL_MAX_IPSTR)); - /* test for incorrect patameter */ + /* test for incorrect parameter */ ExpectIntEQ(1,SSL_CTX_set1_param(ctx, NULL)); ExpectIntEQ(1,SSL_CTX_set1_param(NULL, pvpm)); ExpectIntEQ(1,SSL_CTX_set1_param(NULL, NULL)); @@ -38821,19 +47704,16 @@ SSL_CTX_free(ctx); XFREE(pvpm, NULL, DYNAMIC_TYPE_OPENSSL); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif /* OPENSSL_EXTRA && !defined(NO_RSA)*/ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_get0_param(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; SSL_CTX* ctx = NULL; SSL* ssl = NULL; @@ -38851,18 +47731,15 @@ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif /* OPENSSL_EXTRA && !defined(NO_RSA)*/ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_VERIFY_PARAM_set1_host(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) const char host[] = "www.example.com"; WOLFSSL_X509_VERIFY_PARAM* pParam = NULL; @@ -38881,18 +47758,15 @@ XFREE(pParam, HEAP_HINT, DYNAMIC_TYPE_OPENSSL); } - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_set1_host(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; const char host[] = "www.test_wolfSSL_set1_host.com"; const char emptyStr[] = ""; SSL_CTX* ctx = NULL; @@ -38929,18 +47803,15 @@ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_VERIFY_PARAM_set1_ip(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) unsigned char buf[16] = {0}; WOLFSSL_X509_VERIFY_PARAM* param = NULL; @@ -38997,17 +47868,14 @@ sizeof(param->ipasc)), 0); XFREE(param, HEAP_HINT, DYNAMIC_TYPE_OPENSSL); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE_CTX_get0_store(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) X509_STORE* store = NULL; X509_STORE_CTX* ctx = NULL; X509_STORE_CTX* ctx_no_init = NULL; @@ -39025,18 +47893,15 @@ wolfSSL_X509_STORE_CTX_free(ctx); wolfSSL_X509_STORE_CTX_free(ctx_no_init); X509_STORE_free(store); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_set_client_CA_list(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_RSA) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CLIENT) && !defined(NO_BIO) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; X509_NAME* name = NULL; @@ -39156,19 +48021,16 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && !NO_RSA && !NO_CERTS && !NO_WOLFSSL_CLIENT && * !NO_BIO */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_add_client_CA(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_CERTS) && \ !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; WOLFSSL_X509* x509 = NULL; WOLFSSL_X509* x509_a = NULL; @@ -39193,12 +48055,11 @@ X509_free(x509); X509_free(x509_a); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && !NO_RSA && !NO_CERTS && !NO_WOLFSSL_CLIENT */ - return res; + return EXPECT_RESULT(); } -#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) +#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) static THREAD_RETURN WOLFSSL_THREAD server_task_ech(void* args) { callback_functions* callbacks = ((func_args*)args)->callbacks; @@ -39252,12 +48113,12 @@ if (ret != WOLFSSL_SUCCESS) { char buff[WOLFSSL_MAX_ERROR_SZ]; - printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buff)); + fprintf(stderr, "error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buff)); } else { if (0 < (idx = wolfSSL_read(ssl, input, sizeof(input)-1))) { input[idx] = 0; - printf("Client message: %s\n", input); + fprintf(stderr, "Client message: %s\n", input); } AssertIntEQ(privateNameLen, wolfSSL_write(ssl, privateName, @@ -39277,7 +48138,7 @@ wc_ecc_fp_free(); #endif - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); } #endif /* HAVE_ECH && WOLFSSL_TLS13 */ @@ -39293,33 +48154,30 @@ fp = XFOPEN("./MyKeyLog.txt", "a"); XFWRITE( line, 1, strlen(line),fp); XFWRITE( (void*)&lf,1,1,fp); + XFFLUSH(fp); XFCLOSE(fp); } #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */ static int test_wolfSSL_CTX_set_keylog_callback(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK) && \ !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; SSL_CTX* ctx = NULL; ExpectNotNull(ctx = SSL_CTX_new(wolfSSLv23_client_method())); SSL_CTX_set_keylog_callback(ctx, keyLog_callback ); SSL_CTX_free(ctx); SSL_CTX_set_keylog_callback(NULL, NULL); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK && !NO_WOLFSSL_CLIENT */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_get_keylog_callback(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK) && \ !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; SSL_CTX* ctx = NULL; ExpectNotNull(ctx = SSL_CTX_new(wolfSSLv23_client_method())); @@ -39329,10 +48187,8 @@ SSL_CTX_set_keylog_callback(ctx, NULL ); ExpectPtrEq(SSL_CTX_get_keylog_callback(ctx),NULL); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK && !NO_WOLFSSL_CLIENT */ - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK) @@ -39346,12 +48202,11 @@ static int test_wolfSSL_Tls12_Key_Logging_test(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK) /* This test is intended for checking whether keylog callback is called * in client during TLS handshake between the client and a server. */ - EXPECT_DECLS; test_ssl_cbf server_cbf; test_ssl_cbf client_cbf; XFILE fp = XBADFILE; @@ -39364,12 +48219,14 @@ /* clean up keylog file */ ExpectTrue((fp = XFOPEN("./MyKeyLog.txt", "w")) != XBADFILE); if (fp != XBADFILE) { + XFFLUSH(fp); XFCLOSE(fp); fp = XBADFILE; } ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, &server_cbf, NULL), TEST_SUCCESS); + XSLEEP_MS(100); /* check if the keylog file exists */ @@ -39377,6 +48234,7 @@ int found = 0; ExpectTrue((fp = XFOPEN("./MyKeyLog.txt", "r")) != XBADFILE); + XFFLUSH(fp); /* Just to make sure any buffers get flushed */ while (EXPECT_SUCCESS() && XFGETS(buff, (int)sizeof(buff), fp) != NULL) { if (0 == strncmp(buff,"CLIENT_RANDOM ", sizeof("CLIENT_RANDOM ")-1)) { @@ -39389,10 +48247,10 @@ } /* a log starting with "CLIENT_RANDOM " should exit in the file */ ExpectIntEQ(found, 1); - - res = EXPECT_RESULT(); + /* clean up */ + ExpectIntEQ(rem_file("./MyKeyLog.txt"), 0); #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */ - return res; + return EXPECT_RESULT(); } #if defined(WOLFSSL_TLS13) && defined(OPENSSL_EXTRA) && \ @@ -39407,13 +48265,12 @@ static int test_wolfSSL_Tls13_Key_Logging_test(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_TLS13) && defined(OPENSSL_EXTRA) && \ defined(HAVE_SECRET_CALLBACK) /* This test is intended for checking whether keylog callback is called * in client during TLS handshake between the client and a server. */ - EXPECT_DECLS; test_ssl_cbf server_cbf; test_ssl_cbf client_cbf; XFILE fp = XBADFILE; @@ -39473,12 +48330,11 @@ } ExpectIntEQ(numfnd, 4); } - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK && WOLFSSL_TLS13 */ - return res; + return EXPECT_RESULT(); } -#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) +#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) static int test_wolfSSL_Tls13_ECH_params(void) { EXPECT_DECLS; @@ -39676,30 +48532,28 @@ static int set_post_auth_cb(WOLFSSL* ssl) { - EXPECT_DECLS; if (!wolfSSL_is_server(ssl)) { + EXPECT_DECLS; ExpectIntEQ(wolfSSL_allow_post_handshake_auth(ssl), 0); + return EXPECT_RESULT(); } - else { - wolfSSL_set_verify(ssl, WOLFSSL_VERIFY_POST_HANDSHAKE, NULL); - } - return EXPECT_RESULT(); + wolfSSL_set_verify(ssl, WOLFSSL_VERIFY_POST_HANDSHAKE, NULL); + return TEST_SUCCESS; } #endif static int test_wolfSSL_Tls13_postauth(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_IO_TESTS_DEPENDENCIES) && \ defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) - EXPECT_DECLS; test_ssl_cbf server_cbf; test_ssl_cbf client_cbf; /* test version failure doing post auth with TLS 1.2 connection */ - XMEMSET(&server_cbf, 0, sizeof(callback_functions)); - XMEMSET(&client_cbf, 0, sizeof(callback_functions)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); server_cbf.method = wolfTLSv1_2_server_method; server_cbf.ssl_ready = set_post_auth_cb; server_cbf.on_result = post_auth_version_cb; @@ -39710,8 +48564,8 @@ &server_cbf, NULL), TEST_SUCCESS); /* tests on post auth with TLS 1.3 */ - XMEMSET(&server_cbf, 0, sizeof(callback_functions)); - XMEMSET(&client_cbf, 0, sizeof(callback_functions)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); server_cbf.method = wolfTLSv1_3_server_method; server_cbf.ssl_ready = set_post_auth_cb; client_cbf.ssl_ready = set_post_auth_cb; @@ -39720,19 +48574,16 @@ ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, &server_cbf, NULL), TEST_SUCCESS); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_NID(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(NO_RSA) && defined(USE_CERT_BUFFERS_2048) && !defined(NO_ASN) - EXPECT_DECLS; int sigType; int nameSz; @@ -39750,8 +48601,8 @@ /* ------ PARSE ORIGINAL SELF-SIGNED CERTIFICATE ------ */ /* convert cert from DER to internal WOLFSSL_X509 struct */ - ExpectNotNull(cert = wolfSSL_X509_d2i(&cert, client_cert_der_2048, - sizeof_client_cert_der_2048)); + ExpectNotNull(cert = wolfSSL_X509_d2i_ex(&cert, client_cert_der_2048, + sizeof_client_cert_der_2048, HEAP_HINT)); /* ------ EXTRACT CERTIFICATE ELEMENTS ------ */ @@ -39798,18 +48649,15 @@ EVP_PKEY_free(pubKeyTmp); X509_free(cert); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_set_srp_username(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) \ && !defined(NO_SHA256) && !defined(WC_NO_RNG) && !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; const char *username = "TESTUSER"; @@ -39833,19 +48681,16 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && WOLFCRYPT_HAVE_SRP */ /* && !NO_SHA256 && !WC_NO_RNG && !NO_WOLFSSL_CLIENT */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_set_srp_password(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(WOLFCRYPT_HAVE_SRP) && \ !defined(NO_SHA256) && !defined(WC_NO_RNG) && !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; WOLFSSL_CTX* ctx = NULL; const char *username = "TESTUSER"; const char *password = "TESTPASSWORD"; @@ -39862,18 +48707,15 @@ ExpectIntEQ(wolfSSL_CTX_set_srp_password(ctx, (char *)password), SSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && WOLFCRYPT_HAVE_SRP */ /* && !NO_SHA256 && !WC_NO_RNG && !NO_WOLFSSL_CLIENT */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) X509_STORE *store = NULL; #ifdef HAVE_CRL @@ -39921,7 +48763,8 @@ SSL_FILETYPE_PEM))); ExpectIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); ExpectIntNE(X509_verify_cert(storeCtx), SSL_SUCCESS); - ExpectIntEQ(X509_STORE_CTX_get_error(storeCtx), CRL_CERT_REVOKED); + ExpectIntEQ(X509_STORE_CTX_get_error(storeCtx), + WOLFSSL_X509_V_ERR_CERT_REVOKED); X509_CRL_free(crl); crl = NULL; X509_STORE_free(store); @@ -39963,8 +48806,10 @@ SSL_SUCCESS); } else { - ExpectIntEQ(SSL_set1_verify_cert_store(ssl, store), - SSL_SUCCESS); + ExpectIntEQ(SSL_set1_verify_cert_store(ssl, store), SSL_SUCCESS); + #ifdef OPENSSL_ALL + ExpectIntEQ(SSL_CTX_set1_verify_cert_store(ctx, store), SSL_SUCCESS); + #endif } if (EXPECT_FAIL() || (i == 1)) { X509_STORE_free(store); @@ -39978,18 +48823,15 @@ #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ } #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE_load_locations(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && \ !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && !defined(NO_RSA) - EXPECT_DECLS; SSL_CTX *ctx = NULL; X509_STORE *store = NULL; @@ -40048,18 +48890,15 @@ #endif SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_X509_STORE_get0_objects(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && \ !defined(NO_WOLFSSL_DIR) && !defined(NO_RSA) - EXPECT_DECLS; X509_STORE *store = NULL; X509_STORE *store_cpy = NULL; SSL_CTX *ctx = NULL; @@ -40131,18 +48970,15 @@ X509_STORE_free(store_cpy); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_CTX(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) - EXPECT_DECLS; WOLFSSL_BN_CTX* bn_ctx = NULL; WOLFSSL_BIGNUM* t = NULL; @@ -40164,18 +49000,15 @@ BN_CTX_free(NULL); BN_CTX_free(bn_ctx); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) - EXPECT_DECLS; BIGNUM* a = NULL; BIGNUM* b = NULL; BIGNUM* c = NULL; @@ -40275,6 +49108,7 @@ ExpectIntLT(BN_cmp(a, c), 0); ExpectIntGT(BN_cmp(c, b), 0); +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) ExpectIntEQ(BN_print_fp(XBADFILE, NULL), 0); ExpectIntEQ(BN_print_fp(XBADFILE, &emptyBN), 0); ExpectIntEQ(BN_print_fp(stderr, NULL), 0); @@ -40282,6 +49116,7 @@ ExpectIntEQ(BN_print_fp(XBADFILE, a), 0); ExpectIntEQ(BN_print_fp(stderr, a), 1); +#endif BN_clear(a); @@ -40289,19 +49124,16 @@ BN_free(b); BN_free(c); BN_clear_free(d); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) #if !defined(USE_INTEGER_HEAP_MATH) && !defined(HAVE_WOLF_BIGINT) - EXPECT_DECLS; BIGNUM* ap = NULL; BIGNUM bv; BIGNUM cv; @@ -40336,18 +49168,15 @@ ExpectIntEQ(BN_get_word(&dv), 1); BN_free(ap); - - res = EXPECT_RESULT(); #endif #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_enc_dec(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(WOLFSSL_SP_MATH) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(WOLFSSL_SP_MATH) BIGNUM* a = NULL; BIGNUM* b = NULL; BIGNUM* c = NULL; @@ -40437,17 +49266,14 @@ BN_free(b); BN_free(a); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_word(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(WOLFSSL_SP_MATH) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(WOLFSSL_SP_MATH) BIGNUM* a = NULL; BIGNUM* b = NULL; BIGNUM* c = NULL; @@ -40525,18 +49351,15 @@ BN_free(c); BN_free(b); BN_free(a); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_bits(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) - EXPECT_DECLS; BIGNUM* a = NULL; BIGNUM emptyBN; @@ -40581,18 +49404,15 @@ #endif BN_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_shift(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) - EXPECT_DECLS; BIGNUM* a = NULL; BIGNUM* b = NULL; BIGNUM emptyBN; @@ -40633,18 +49453,15 @@ BN_free(b); BN_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_math(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) - EXPECT_DECLS; BIGNUM* a = NULL; BIGNUM* b = NULL; BIGNUM* r = NULL; @@ -40766,18 +49583,15 @@ BN_free(r); BN_free(b); BN_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_math_mod(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) - EXPECT_DECLS; BIGNUM* a = NULL; BIGNUM* b = NULL; BIGNUM* m = NULL; @@ -40904,19 +49718,16 @@ BN_free(m); BN_free(b); BN_free(a); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_math_other(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) - EXPECT_DECLS; BIGNUM* a = NULL; BIGNUM* b = NULL; BIGNUM* r = NULL; @@ -40946,7 +49757,7 @@ ExpectIntEQ(BN_gcd(r, a, &emptyBN, NULL), 0); /* END Invalid parameters. */ - /* No comman factors between 2 and 3. */ + /* No common factors between 2 and 3. */ ExpectIntEQ(BN_set_word(a, 2), 1); ExpectIntEQ(BN_set_word(b, 3), 1); ExpectIntEQ(BN_gcd(r, a, b, NULL), 1); @@ -40965,18 +49776,15 @@ BN_free(r); BN_free(b); BN_free(a); - - res = EXPECT_RESULT(); #endif #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_rand(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(OPENSSL_EXTRA_NO_BN) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(OPENSSL_EXTRA_NO_BN) BIGNUM* bn = NULL; BIGNUM* range = NULL; BIGNUM emptyBN; @@ -41115,19 +49923,16 @@ BN_free(bn); BN_free(range); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BN_prime(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(OPENSSL_EXTRA_NO_BN) && !defined(WOLFSSL_SP_MATH) #if defined(WOLFSSL_KEY_GEN) && (!defined(NO_RSA) || !defined(NO_DH) || !defined(NO_DSA)) - EXPECT_DECLS; BIGNUM* a = NULL; BIGNUM* add = NULL; BIGNUM* rem = NULL; @@ -41183,11 +49988,9 @@ BN_free(rem); BN_free(add); BN_free(a); - - res = EXPECT_RESULT(); #endif #endif /* defined(OPENSSL_EXTRA) && !defined(NO_ASN) */ - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ @@ -41221,14 +50024,15 @@ int i, num; BIO* bio = NULL; #endif - (void) ctx; + + ExpectNotNull(ctx); + ExpectNotNull(ssl); + fprintf(stderr, "\n===== msgcb called ====\n"); #if defined(SESSION_CERTS) && defined(TEST_PEER_CERT_CHAIN) ExpectTrue(SSL_get_peer_cert_chain(ssl) != NULL); ExpectIntEQ(((WOLFSSL_X509_CHAIN *)SSL_get_peer_cert_chain(ssl))->count, 2); ExpectNotNull(SSL_get0_verified_chain(ssl)); -#else - (void) ssl; #endif #if defined(OPENSSL_ALL) && defined(SESSION_CERTS) && !defined(NO_BIO) @@ -41256,15 +50060,14 @@ static int test_wolfSSL_msgCb(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(DEBUG_WOLFSSL) && \ defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) - EXPECT_DECLS; test_ssl_cbf client_cb; test_ssl_cbf server_cb; - XMEMSET(&client_cb, 0, sizeof(callback_functions)); - XMEMSET(&server_cb, 0, sizeof(callback_functions)); + XMEMSET(&client_cb, 0, sizeof(client_cb)); + XMEMSET(&server_cb, 0, sizeof(server_cb)); #ifndef WOLFSSL_NO_TLS12 client_cb.method = wolfTLSv1_2_client_method; server_cb.method = wolfTLSv1_2_server_method; @@ -41275,18 +50078,15 @@ ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cb, &server_cb, msgCb), TEST_SUCCESS); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_either_side(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)) && \ defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) - EXPECT_DECLS; test_ssl_cbf client_cb; test_ssl_cbf server_cb; @@ -41306,18 +50106,15 @@ wolfSSL_CTX_free(client_cb.ctx); wolfSSL_CTX_free(server_cb.ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DTLS_either_side(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(WOLFSSL_EITHER_SIDE)) && \ defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) - EXPECT_DECLS; test_ssl_cbf client_cb; test_ssl_cbf server_cb; @@ -41337,17 +50134,14 @@ wolfSSL_CTX_free(client_cb.ctx); wolfSSL_CTX_free(server_cb.ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_generate_cookie(void) { - int res = TEST_SKIPPED; -#if defined(WOLFSSL_DTLS) && defined(OPENSSL_EXTRA) && defined(USE_WOLFSSL_IO) EXPECT_DECLS; +#if defined(WOLFSSL_DTLS) && defined(OPENSSL_EXTRA) && defined(USE_WOLFSSL_IO) SSL_CTX* ctx = NULL; SSL* ssl = NULL; byte buf[FOURK_BUF] = {0}; @@ -41368,18 +50162,15 @@ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_set_options(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; WOLFSSL* ssl = NULL; WOLFSSL_CTX* ctx = NULL; #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) @@ -41499,20 +50290,17 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif /* !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_sk_SSL_CIPHER(void) { - int res = TEST_SKIPPED; - #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ - !defined(NO_FILESYSTEM) && !defined(NO_RSA) -#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ + !defined(NO_FILESYSTEM) && !defined(NO_RSA) +#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) SSL* ssl = NULL; SSL_CTX* ctx = NULL; STACK_OF(SSL_CIPHER) *sk = NULL; @@ -41538,20 +50326,17 @@ /* sk is pointer to internal struct that should be free'd in SSL_free */ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ - #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ - return res; +#endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ + !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ + return EXPECT_RESULT(); } static int test_wolfSSL_set1_curves_list(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) #if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; SSL* ssl = NULL; SSL_CTX* ctx = NULL; @@ -41600,19 +50385,99 @@ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ #endif - return res; + return EXPECT_RESULT(); +} + +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ + (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) && defined(HAVE_ECC) +static int test_wolfSSL_curves_mismatch_ctx_ready(WOLFSSL_CTX* ctx) +{ + static int counter = 0; + EXPECT_DECLS; + + if (counter % 2) { + ExpectIntEQ(wolfSSL_CTX_set1_curves_list(ctx, "P-256"), + WOLFSSL_SUCCESS); + } + else { + ExpectIntEQ(wolfSSL_CTX_set1_curves_list(ctx, "P-384"), + WOLFSSL_SUCCESS); + } + + /* Ciphersuites that require curves */ + wolfSSL_CTX_set_cipher_list(ctx, "TLS13-AES256-GCM-SHA384:" + "TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES128-GCM-SHA256:" + "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:" + "ECDHE-ECDSA-AES128-GCM-SHA256:" + "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:" + "ECDHE-ECDSA-CHACHA20-POLY1305"); + + counter++; + return EXPECT_RESULT(); +} +#endif + +static int test_wolfSSL_curves_mismatch(void) +{ + EXPECT_DECLS; +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ + (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) && defined(HAVE_ECC) + test_ssl_cbf func_cb_client; + test_ssl_cbf func_cb_server; + size_t i; + struct { + method_provider client_meth; + method_provider server_meth; + const char* desc; + int client_last_err; + int server_last_err; + } test_params[] = { +#ifdef WOLFSSL_TLS13 + {wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLS 1.3", + FATAL_ERROR, BAD_KEY_SHARE_DATA}, +#endif +#ifndef WOLFSSL_NO_TLS12 + {wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLS 1.2", + FATAL_ERROR, MATCH_SUITE_ERROR}, +#endif +#ifndef NO_OLD_TLS + {wolfTLSv1_1_client_method, wolfTLSv1_1_server_method, "TLS 1.1", + FATAL_ERROR, MATCH_SUITE_ERROR}, +#endif + }; + + for (i = 0; i < XELEM_CNT(test_params) && !EXPECT_FAIL(); i++) { + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + + printf("\tTesting with %s...\n", test_params[i].desc); + + func_cb_client.ctx_ready = &test_wolfSSL_curves_mismatch_ctx_ready; + func_cb_server.ctx_ready = &test_wolfSSL_curves_mismatch_ctx_ready; + + func_cb_client.method = test_params[i].client_meth; + func_cb_server.method = test_params[i].server_meth; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, + &func_cb_server, NULL), TEST_FAIL); + ExpectIntEQ(func_cb_client.last_err, test_params[i].client_last_err); + ExpectIntEQ(func_cb_server.last_err, test_params[i].server_last_err); + + if (!EXPECT_SUCCESS()) + break; + printf("\t%s passed\n", test_params[i].desc); + } +#endif + return EXPECT_RESULT(); } static int test_wolfSSL_set1_sigalgs_list(void) { - int res = TEST_SKIPPED; - #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) -#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) +#if !defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER) SSL* ssl = NULL; SSL_CTX* ctx = NULL; @@ -41728,11 +50593,9 @@ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* !NO_WOLFSSL_CLIENT || !NO_WOLFSSL_SERVER */ - #endif - return res; +#endif + return EXPECT_RESULT(); } /* Testing wolfSSL_set_tlsext_status_type function. @@ -41740,10 +50603,9 @@ */ static int test_wolfSSL_set_tlsext_status_type(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_CERTIFICATE_STATUS_REQUEST) && \ !defined(NO_RSA) && !defined(NO_WOLFSSL_SERVER) - EXPECT_DECLS; SSL* ssl = NULL; SSL_CTX* ctx = NULL; @@ -41757,20 +50619,17 @@ ExpectIntEQ(SSL_get_tlsext_status_type(ssl), TLSEXT_STATUSTYPE_ocsp); SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && HAVE_CERTIFICATE_STATUS_REQUEST && !NO_RSA */ - return res; + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_PEM_read_bio(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) - EXPECT_DECLS; byte buff[6000]; XFILE f = XBADFILE; int bytes; @@ -41797,11 +50656,9 @@ BIO_free(bio); BUF_MEM_free(buf); X509_free(x509); - - res = EXPECT_RESULT(); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && * !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ - return res; + return EXPECT_RESULT(); } @@ -41821,9 +50678,8 @@ static int test_wolfSSL_BIO(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) const unsigned char* p = NULL; byte buff[20]; BIO* bio1 = NULL; @@ -41879,12 +50735,12 @@ for (i = 0; i < 20; i++) { ExpectIntEQ((int)bufPt[i], i); } - ExpectIntEQ(BIO_nread(bio2, &bufPt, 1), WOLFSSL_BIO_ERROR); + ExpectIntEQ(BIO_nread(bio2, &bufPt, 1), 0); ExpectIntEQ(BIO_nread(bio1, &bufPt, (int)BIO_ctrl_pending(bio1)), 8); for (i = 0; i < 8; i++) { ExpectIntEQ((int)bufPt[i], i); } - ExpectIntEQ(BIO_nread(bio1, &bufPt, 1), WOLFSSL_BIO_ERROR); + ExpectIntEQ(BIO_nread(bio1, &bufPt, 1), 0); ExpectIntEQ(BIO_ctrl_reset_read_request(bio1), 1); /* new pair */ @@ -41893,7 +50749,7 @@ bio2 = NULL; ExpectIntEQ(BIO_make_bio_pair(bio1, bio3), WOLFSSL_SUCCESS); ExpectIntEQ((int)BIO_ctrl_pending(bio3), 0); - ExpectIntEQ(BIO_nread(bio3, &bufPt, 10), WOLFSSL_BIO_ERROR); + ExpectIntEQ(BIO_nread(bio3, &bufPt, 10), 0); /* test wrap around... */ ExpectIntEQ(BIO_reset(bio1), 0); @@ -41941,7 +50797,7 @@ /* test reset on data in bio1 write buffer */ ExpectIntEQ(BIO_reset(bio1), 0); ExpectIntEQ((int)BIO_ctrl_pending(bio3), 0); - ExpectIntEQ(BIO_nread(bio3, &bufPt, 3), WOLFSSL_BIO_ERROR); + ExpectIntEQ(BIO_nread(bio3, &bufPt, 3), 0); ExpectIntEQ(BIO_nwrite(bio1, &bufPt, 20), 20); ExpectIntEQ((int)BIO_ctrl(bio1, BIO_CTRL_INFO, 0, &p), 20); ExpectNotNull(p); @@ -42052,10 +50908,37 @@ ExpectNotNull(bio1 = BIO_new(BIO_s_bio())); BIO_vfree(NULL); BIO_vfree(bio1); +#endif + return EXPECT_RESULT(); +} - res = EXPECT_RESULT(); +static int test_wolfSSL_BIO_BIO_ring_read(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_ALL) + BIO* bio1 = NULL; + BIO* bio2 = NULL; + byte data[50]; + byte tmp[50]; + + XMEMSET(data, 42, sizeof(data)); + + + ExpectIntEQ(BIO_new_bio_pair(&bio1, sizeof(data), &bio2, sizeof(data)), + SSL_SUCCESS); + + ExpectIntEQ(BIO_write(bio1, data, 40), 40); + ExpectIntEQ(BIO_read(bio1, tmp, 20), -1); + ExpectIntEQ(BIO_read(bio2, tmp, 20), 20); + ExpectBufEQ(tmp, data, 20); + ExpectIntEQ(BIO_write(bio1, data, 20), 20); + ExpectIntEQ(BIO_read(bio2, tmp, 40), 40); + ExpectBufEQ(tmp, data, 40); + + BIO_free(bio1); + BIO_free(bio2); #endif - return res; + return EXPECT_RESULT(); } #endif /* !NO_BIO */ @@ -42063,9 +50946,8 @@ static int test_wolfSSL_a2i_IPADDRESS(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(WOLFSSL_USER_IO) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(WOLFSSL_USER_IO) const unsigned char* data = NULL; int dataSz = 0; ASN1_OCTET_STRING *st = NULL; @@ -42100,55 +50982,16 @@ ExpectIntEQ(dataSz = ASN1_STRING_length(st), WOLFSSL_IP6_ADDR_LEN); ExpectIntEQ(XMEMCMP(data, ipv6_exp, dataSz), 0); ASN1_STRING_free(st); - - res = EXPECT_RESULT(); #endif - return res; -} - -static int test_wolfSSL_DES_ecb_encrypt(void) -{ - int res = TEST_SKIPPED; - #if defined(OPENSSL_EXTRA) && !defined(NO_DES3) && defined(WOLFSSL_DES_ECB) - WOLFSSL_DES_cblock input1,input2,output1,output2,back1,back2; - WOLFSSL_DES_key_schedule key; - - XMEMCPY(key,"12345678",sizeof(WOLFSSL_DES_key_schedule)); - XMEMCPY(input1, "Iamhuman",sizeof(WOLFSSL_DES_cblock)); - XMEMCPY(input2, "Whoisit?",sizeof(WOLFSSL_DES_cblock)); - XMEMSET(output1, 0, sizeof(WOLFSSL_DES_cblock)); - XMEMSET(output2, 0, sizeof(WOLFSSL_DES_cblock)); - XMEMSET(back1, 0, sizeof(WOLFSSL_DES_cblock)); - XMEMSET(back2, 0, sizeof(WOLFSSL_DES_cblock)); - - /* Encrypt messages */ - wolfSSL_DES_ecb_encrypt(&input1,&output1,&key,DES_ENCRYPT); - wolfSSL_DES_ecb_encrypt(&input2,&output2,&key,DES_ENCRYPT); - - { - /* Decrypt messages */ - int ret1 = 0; - int ret2 = 0; - wolfSSL_DES_ecb_encrypt(&output1,&back1,&key,DES_DECRYPT); - ret1 = XMEMCMP((unsigned char *) back1,(unsigned char *) input1,sizeof(WOLFSSL_DES_cblock)); - AssertIntEQ(ret1,0); - wolfSSL_DES_ecb_encrypt(&output2,&back2,&key,DES_DECRYPT); - ret2 = XMEMCMP((unsigned char *) back2,(unsigned char *) input2,sizeof(WOLFSSL_DES_cblock)); - AssertIntEQ(ret2,0); - } - - res = TEST_RES_CHECK(1); - #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_cmp_time(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) \ && !defined(USER_TIME) && !defined(TIME_OVERRIDES) - EXPECT_DECLS; WOLFSSL_ASN1_TIME asn_time; time_t t; @@ -42158,20 +51001,17 @@ ExpectIntEQ(ASN1_TIME_set_string(&asn_time, "000222211515Z"), 1); ExpectIntEQ(-1, wolfSSL_X509_cmp_time(&asn_time, NULL)); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_time_adj(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ASN_TIME) && \ !defined(USER_TIME) && !defined(TIME_OVERRIDES) && \ defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA) && \ !defined(NO_ASN_TIME) - EXPECT_DECLS; X509* x509 = NULL; time_t t; time_t not_before; @@ -42190,19 +51030,526 @@ ExpectNotNull(X509_gmtime_adj(X509_get_notAfter(x509), not_after)); X509_free(x509); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_X509_bad_altname(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) + const unsigned char malformed_alt_name_cert[] = { + 0x30, 0x82, 0x02, 0xf9, 0x30, 0x82, 0x01, 0xe1, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x02, 0x10, 0x21, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x0f, 0x31, 0x0d, + 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x04, 0x61, 0x61, 0x31, + 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x36, 0x30, 0x32, 0x30, 0x37, 0x31, + 0x37, 0x32, 0x34, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x34, 0x30, 0x32, + 0x31, 0x34, 0x30, 0x36, 0x32, 0x36, 0x35, 0x33, 0x5a, 0x30, 0x0f, 0x31, + 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x04, 0x61, 0x61, + 0x61, 0x61, 0x30, 0x82, 0x01, 0x20, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0d, 0x00, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa8, + 0x8a, 0x5e, 0x26, 0x23, 0x1b, 0x31, 0xd3, 0x37, 0x1a, 0x70, 0xb2, 0xec, + 0x3f, 0x74, 0xd4, 0xb4, 0x44, 0xe3, 0x7a, 0xa5, 0xc0, 0xf5, 0xaa, 0x97, + 0x26, 0x9a, 0x04, 0xff, 0xda, 0xbe, 0xe5, 0x09, 0x03, 0x98, 0x3d, 0xb5, + 0xbf, 0x01, 0x2c, 0x9a, 0x0a, 0x3a, 0xfb, 0xbc, 0x3c, 0xe7, 0xbe, 0x83, + 0x5c, 0xb3, 0x70, 0xe8, 0x5c, 0xe3, 0xd1, 0x83, 0xc3, 0x94, 0x08, 0xcd, + 0x1a, 0x87, 0xe5, 0xe0, 0x5b, 0x9c, 0x5c, 0x6e, 0xb0, 0x7d, 0xe2, 0x58, + 0x6c, 0xc3, 0xb5, 0xc8, 0x9d, 0x11, 0xf1, 0x5d, 0x96, 0x0d, 0x66, 0x1e, + 0x56, 0x7f, 0x8f, 0x59, 0xa7, 0xa5, 0xe1, 0xc5, 0xe7, 0x81, 0x4c, 0x09, + 0x9d, 0x5e, 0x96, 0xf0, 0x9a, 0xc2, 0x8b, 0x70, 0xd5, 0xab, 0x79, 0x58, + 0x5d, 0xb7, 0x58, 0xaa, 0xfd, 0x75, 0x52, 0xaa, 0x4b, 0xa7, 0x25, 0x68, + 0x76, 0x59, 0x00, 0xee, 0x78, 0x2b, 0x91, 0xc6, 0x59, 0x91, 0x99, 0x38, + 0x3e, 0xa1, 0x76, 0xc3, 0xf5, 0x23, 0x6b, 0xe6, 0x07, 0xea, 0x63, 0x1c, + 0x97, 0x49, 0xef, 0xa0, 0xfe, 0xfd, 0x13, 0xc9, 0xa9, 0x9f, 0xc2, 0x0b, + 0xe6, 0x87, 0x92, 0x5b, 0xcc, 0xf5, 0x42, 0x95, 0x4a, 0xa4, 0x6d, 0x64, + 0xba, 0x7d, 0xce, 0xcb, 0x04, 0xd0, 0xf8, 0xe7, 0xe3, 0xda, 0x75, 0x60, + 0xd3, 0x8b, 0x6a, 0x64, 0xfc, 0x78, 0x56, 0x21, 0x69, 0x5a, 0xe8, 0xa7, + 0x8f, 0xfb, 0x8f, 0x82, 0xe3, 0xae, 0x36, 0xa2, 0x93, 0x66, 0x92, 0xcb, + 0x82, 0xa3, 0xbe, 0x84, 0x00, 0x86, 0xdc, 0x7e, 0x6d, 0x53, 0x77, 0x84, + 0x17, 0xb9, 0x55, 0x43, 0x0d, 0xf1, 0x16, 0x1f, 0xd5, 0x43, 0x75, 0x99, + 0x66, 0x19, 0x52, 0xd0, 0xac, 0x5f, 0x74, 0xad, 0xb2, 0x90, 0x15, 0x50, + 0x04, 0x74, 0x43, 0xdf, 0x6c, 0x35, 0xd0, 0xfd, 0x32, 0x37, 0xb3, 0x8d, + 0xf5, 0xe5, 0x09, 0x02, 0x01, 0x03, 0xa3, 0x61, 0x30, 0x5f, 0x30, 0x0c, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x08, 0x30, 0x06, 0x82, + 0x04, 0x61, 0x2a, 0x00, 0x2a, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x92, 0x6a, 0x1e, 0x52, 0x3a, 0x1a, 0x57, 0x9f, + 0xc9, 0x82, 0x9a, 0xce, 0xc8, 0xc0, 0xa9, 0x51, 0x9d, 0x2f, 0xc7, 0x72, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0x6b, 0xf9, 0xa4, 0x2d, 0xa5, 0xe9, 0x39, 0x89, 0xa8, 0x24, 0x58, + 0x79, 0x87, 0x11, 0xfc, 0x6f, 0x07, 0x91, 0xef, 0xa6, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x3f, 0xd5, 0x37, 0x2f, 0xc7, 0xf8, 0x8b, + 0x39, 0x1c, 0xe3, 0xdf, 0x77, 0xee, 0xc6, 0x4b, 0x5f, 0x84, 0xcf, 0xfa, + 0x33, 0x2c, 0xb2, 0xb5, 0x4b, 0x09, 0xee, 0x56, 0xc0, 0xf2, 0xf0, 0xeb, + 0xad, 0x1c, 0x02, 0xef, 0xae, 0x09, 0x53, 0xc0, 0x06, 0xad, 0x4e, 0xfd, + 0x3e, 0x8c, 0x13, 0xb3, 0xbf, 0x80, 0x05, 0x36, 0xb5, 0x3f, 0x2b, 0xc7, + 0x60, 0x53, 0x14, 0xbf, 0x33, 0x63, 0x47, 0xc3, 0xc6, 0x28, 0xda, 0x10, + 0x12, 0xe2, 0xc4, 0xeb, 0xc5, 0x64, 0x66, 0xc0, 0xcc, 0x6b, 0x84, 0xda, + 0x0c, 0xe9, 0xf6, 0xe3, 0xf8, 0x8e, 0x3d, 0x95, 0x5f, 0xba, 0x9f, 0xe1, + 0xc7, 0xed, 0x6e, 0x97, 0xcc, 0xbd, 0x7d, 0xe5, 0x4e, 0xab, 0xbc, 0x1b, + 0xf1, 0x3a, 0x09, 0x33, 0x09, 0xe1, 0xcc, 0xec, 0x21, 0x16, 0x8e, 0xb1, + 0x74, 0x9e, 0xc8, 0x13, 0x7c, 0xdf, 0x07, 0xaa, 0xeb, 0x70, 0xd7, 0x91, + 0x5c, 0xc4, 0xef, 0x83, 0x88, 0xc3, 0xe4, 0x97, 0xfa, 0xe4, 0xdf, 0xd7, + 0x0d, 0xff, 0xba, 0x78, 0x22, 0xfc, 0x3f, 0xdc, 0xd8, 0x02, 0x8d, 0x93, + 0x57, 0xf9, 0x9e, 0x39, 0x3a, 0x77, 0x00, 0xd9, 0x19, 0xaa, 0x68, 0xa1, + 0xe6, 0x9e, 0x13, 0xeb, 0x37, 0x16, 0xf5, 0x77, 0xa4, 0x0b, 0x40, 0x04, + 0xd3, 0xa5, 0x49, 0x78, 0x35, 0xfa, 0x3b, 0xf6, 0x02, 0xab, 0x85, 0xee, + 0xcb, 0x9b, 0x62, 0xda, 0x05, 0x00, 0x22, 0x2f, 0xf8, 0xbd, 0x0b, 0xe5, + 0x2c, 0xb2, 0x53, 0x78, 0x0a, 0xcb, 0x69, 0xc0, 0xb6, 0x9f, 0x96, 0xff, + 0x58, 0x22, 0x70, 0x9c, 0x01, 0x2e, 0x56, 0x60, 0x5d, 0x37, 0xe3, 0x40, + 0x25, 0xc9, 0x90, 0xc8, 0x0f, 0x41, 0x68, 0xb4, 0xfd, 0x10, 0xe2, 0x09, + 0x99, 0x08, 0x5d, 0x7b, 0xc9, 0xe3, 0x29, 0xd4, 0x5a, 0xcf, 0xc9, 0x34, + 0x55, 0xa1, 0x40, 0x44, 0xd6, 0x88, 0x16, 0xbb, 0xdd + }; + + X509* x509 = NULL; + int certSize = (int)sizeof(malformed_alt_name_cert) / sizeof(unsigned char); + const char *name = "aaaaa"; + int nameLen = (int)XSTRLEN(name); + + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_buffer( + malformed_alt_name_cert, certSize, SSL_FILETYPE_ASN1)); + + /* malformed_alt_name_cert has a malformed alternative + * name of "a*\0*". Ensure that it does not match "aaaaa" */ + ExpectIntNE(wolfSSL_X509_check_host(x509, name, nameLen, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), 1); + X509_free(x509); - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); +} + +static int test_wolfSSL_X509_name_match(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) + /* A certificate with the subject alternative name a* */ + const unsigned char cert_der[] = { + 0x30, 0x82, 0x03, 0xac, 0x30, 0x82, 0x02, 0x94, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x0f, 0xa5, 0x10, 0x85, 0xef, 0x58, 0x10, 0x59, 0xfc, + 0x0f, 0x20, 0x1f, 0x53, 0xf5, 0x30, 0x39, 0x34, 0x49, 0x54, 0x05, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x77, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0c, 0x07, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x42, 0x6f, + 0x7a, 0x65, 0x6d, 0x61, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x0b, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, + 0x49, 0x6e, 0x63, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x0c, 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, + 0x77, 0x77, 0x77, 0x2e, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x34, 0x30, 0x35, 0x33, + 0x30, 0x32, 0x30, 0x31, 0x35, 0x35, 0x38, 0x5a, 0x17, 0x0d, 0x33, 0x34, + 0x30, 0x35, 0x32, 0x38, 0x32, 0x30, 0x31, 0x35, 0x35, 0x38, 0x5a, 0x30, + 0x77, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, + 0x07, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x42, 0x6f, 0x7a, 0x65, 0x6d, + 0x61, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x0b, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x45, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x77, 0x77, 0x77, + 0x2e, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf4, 0xca, 0x3d, + 0xd4, 0xbc, 0x9b, 0xea, 0x74, 0xfe, 0x73, 0xf4, 0x16, 0x23, 0x0b, 0x4a, + 0x09, 0x54, 0xf6, 0x7b, 0x10, 0x99, 0x11, 0x93, 0xb2, 0xdb, 0x4d, 0x7d, + 0x23, 0xab, 0xf9, 0xcd, 0xf6, 0x54, 0xd4, 0xf6, 0x39, 0x57, 0xee, 0x97, + 0xb2, 0xb9, 0xfc, 0x7e, 0x9c, 0xb3, 0xfb, 0x56, 0xb6, 0x84, 0xd6, 0x2d, + 0x59, 0x1c, 0xed, 0xda, 0x9b, 0x19, 0xf5, 0x8a, 0xa7, 0x8a, 0x89, 0xd6, + 0xa1, 0xc0, 0xe6, 0x16, 0xad, 0x04, 0xcf, 0x5a, 0x1f, 0xdf, 0x62, 0x6c, + 0x68, 0x45, 0xe9, 0x55, 0x2e, 0x42, 0xa3, 0x1b, 0x3b, 0x86, 0x23, 0x22, + 0xa1, 0x20, 0x48, 0xd1, 0x52, 0xc0, 0x8b, 0xab, 0xe2, 0x8a, 0x15, 0x68, + 0xbd, 0x89, 0x6f, 0x9f, 0x45, 0x75, 0xb4, 0x27, 0xc1, 0x72, 0x41, 0xfd, + 0x79, 0x89, 0xb0, 0x74, 0xa2, 0xe9, 0x61, 0x48, 0x4c, 0x54, 0xad, 0x6b, + 0x61, 0xbf, 0x0e, 0x27, 0x58, 0xb4, 0xf6, 0x9c, 0x2c, 0x9f, 0xc2, 0x3e, + 0x3b, 0xb3, 0x90, 0x41, 0xbc, 0x61, 0xcd, 0x01, 0x57, 0x90, 0x82, 0xec, + 0x46, 0xba, 0x4f, 0x89, 0x8e, 0x7f, 0x49, 0x4f, 0x46, 0x69, 0x37, 0x8b, + 0xa0, 0xba, 0x85, 0xe8, 0x42, 0xff, 0x9a, 0xa1, 0x53, 0x81, 0x5c, 0xf3, + 0x8e, 0x85, 0x1c, 0xd4, 0x90, 0x60, 0xa0, 0x37, 0x59, 0x04, 0x65, 0xa6, + 0xb5, 0x12, 0x00, 0xc3, 0x04, 0x51, 0xa7, 0x83, 0x96, 0x62, 0x3d, 0x49, + 0x97, 0xe8, 0x6b, 0x9a, 0x5d, 0x51, 0x24, 0xee, 0xad, 0x45, 0x18, 0x0f, + 0x3f, 0x97, 0xec, 0xdf, 0xcf, 0x42, 0x8a, 0x96, 0xc7, 0xd8, 0x82, 0x87, + 0x7f, 0x57, 0x70, 0x22, 0xfb, 0x29, 0x3e, 0x3c, 0xa3, 0xc1, 0xd5, 0x71, + 0xb3, 0x84, 0x06, 0x53, 0xa3, 0x86, 0x20, 0x35, 0xe3, 0x41, 0xb9, 0xd8, + 0x00, 0x22, 0x4f, 0x6d, 0xe6, 0xfd, 0xf0, 0xf4, 0xa2, 0x39, 0x0a, 0x1a, + 0x23, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x30, 0x30, 0x2e, 0x30, 0x0d, + 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x06, 0x30, 0x04, 0x82, 0x02, 0x61, + 0x2a, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x45, 0x05, 0xf3, 0x4d, 0x3e, 0x7e, 0x9c, 0xf5, 0x08, 0xee, 0x2c, 0x13, + 0x32, 0xe3, 0xf2, 0x14, 0xe8, 0x0e, 0x71, 0x21, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x01, 0x00, 0xa8, 0x28, 0xe5, 0x22, 0x65, 0xcf, 0x47, 0xfe, + 0x82, 0x17, 0x99, 0x20, 0xdb, 0xb1, 0x57, 0xd4, 0x91, 0x1a, 0x83, 0xde, + 0xc1, 0xaf, 0xc4, 0x1f, 0xfb, 0xa4, 0x6a, 0xad, 0xdc, 0x58, 0x72, 0xd9, + 0x9b, 0xab, 0xa5, 0xbb, 0xf4, 0x98, 0xd4, 0xdf, 0x36, 0xcb, 0xb5, 0x78, + 0xce, 0x4b, 0x25, 0x5b, 0x24, 0x92, 0xfe, 0xe8, 0xd4, 0xe4, 0xbd, 0x6f, + 0x71, 0x1a, 0x81, 0x2a, 0x6f, 0x35, 0x93, 0xf7, 0xcc, 0xed, 0xe5, 0x06, + 0xd2, 0x96, 0x41, 0xb5, 0xa9, 0x8a, 0xc0, 0xc9, 0x17, 0xe3, 0x13, 0x5e, + 0x94, 0x5e, 0xfa, 0xfc, 0xf0, 0x00, 0x2e, 0xe1, 0xd8, 0x1b, 0x23, 0x3f, + 0x7c, 0x4d, 0x9f, 0xfb, 0xb7, 0x95, 0xc1, 0x94, 0x7f, 0x7f, 0xb5, 0x4f, + 0x93, 0x6d, 0xc3, 0x2b, 0xb2, 0x28, 0x36, 0xd2, 0x7c, 0x01, 0x3c, 0xae, + 0x35, 0xdb, 0xc8, 0x95, 0x1b, 0x5f, 0x6c, 0x0f, 0x57, 0xb3, 0xcc, 0x97, + 0x98, 0x80, 0x06, 0xaa, 0xe4, 0x93, 0x1f, 0xb7, 0xa0, 0x54, 0xf1, 0x4f, + 0x6f, 0x11, 0xdf, 0xab, 0xd3, 0xbf, 0xf0, 0x3a, 0x81, 0x60, 0xaf, 0x7a, + 0xf7, 0x09, 0xd5, 0xae, 0x0c, 0x7d, 0xae, 0x8d, 0x47, 0x06, 0xbe, 0x11, + 0x6e, 0xf8, 0x7e, 0x49, 0xf8, 0xac, 0x24, 0x0a, 0x4b, 0xc2, 0xf6, 0xe8, + 0x2c, 0xec, 0x35, 0xef, 0xa9, 0x13, 0xb8, 0xd2, 0x9c, 0x92, 0x61, 0x91, + 0xec, 0x7b, 0x0c, 0xea, 0x9a, 0x71, 0x36, 0x15, 0x34, 0x2b, 0x7a, 0x25, + 0xac, 0xfe, 0xc7, 0x26, 0x89, 0x70, 0x3e, 0x64, 0x68, 0x97, 0x4b, 0xaa, + 0xc1, 0x24, 0x14, 0xbd, 0x45, 0x2f, 0xe0, 0xfe, 0xf4, 0x2b, 0x8e, 0x08, + 0x3e, 0xe4, 0xb5, 0x3d, 0x5d, 0xf4, 0xc3, 0xd6, 0x9c, 0xb5, 0x33, 0x1b, + 0x3b, 0xda, 0x6e, 0x99, 0x7b, 0x09, 0xd1, 0x30, 0x97, 0x23, 0x52, 0x6d, + 0x1b, 0x71, 0x3a, 0xf4, 0x54, 0xf0, 0xe5, 0x9e + }; + + WOLFSSL_X509* x509 = NULL; + int certSize = (int)(sizeof(cert_der) / sizeof(unsigned char)); + const char *name1 = "aaaaa"; + int nameLen1 = (int)(XSTRLEN(name1)); + const char *name2 = "a"; + int nameLen2 = (int)(XSTRLEN(name2)); + const char *name3 = "abbbb"; + int nameLen3 = (int)(XSTRLEN(name3)); + const char *name4 = "bbb"; + int nameLen4 = (int)(XSTRLEN(name4)); + + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_buffer( + cert_der, certSize, WOLFSSL_FILETYPE_ASN1)); + + /* Ensure that "a*" matches "aaaaa" */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name1, nameLen1, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that "a*" matches "a" */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name2, nameLen2, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that "a*" matches "abbbb" */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name3, nameLen3, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that "a*" does not match "bbb" */ + ExpectIntNE(wolfSSL_X509_check_host(x509, name4, nameLen4, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), 1); + + wolfSSL_X509_free(x509); + +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_X509_name_match2(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) + /* A certificate with the subject alternative name a*b* */ + const unsigned char cert_der[] = { + 0x30, 0x82, 0x03, 0xae, 0x30, 0x82, 0x02, 0x96, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x41, 0x8c, 0x8b, 0xaa, 0x0e, 0xd8, 0x5a, 0xc0, 0x52, + 0x46, 0x0e, 0xe5, 0xd8, 0xb9, 0x48, 0x93, 0x7e, 0x8a, 0x7c, 0x65, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x77, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0c, 0x07, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x42, 0x6f, + 0x7a, 0x65, 0x6d, 0x61, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x0b, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, + 0x49, 0x6e, 0x63, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x0c, 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, + 0x77, 0x77, 0x77, 0x2e, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x34, 0x30, 0x35, 0x33, + 0x30, 0x32, 0x30, 0x34, 0x33, 0x34, 0x30, 0x5a, 0x17, 0x0d, 0x33, 0x34, + 0x30, 0x35, 0x32, 0x38, 0x32, 0x30, 0x34, 0x33, 0x34, 0x30, 0x5a, 0x30, + 0x77, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, + 0x07, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x42, 0x6f, 0x7a, 0x65, 0x6d, + 0x61, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x0b, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x45, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x77, 0x77, 0x77, + 0x2e, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x60, 0x80, + 0xf3, 0xee, 0x19, 0xd2, 0xe4, 0x15, 0x94, 0x54, 0x12, 0x88, 0xee, 0xda, + 0x11, 0x11, 0x87, 0x99, 0x88, 0xb3, 0x71, 0xc7, 0x97, 0x78, 0x1b, 0x57, + 0x37, 0x1d, 0x0b, 0x1f, 0x2f, 0x2c, 0x35, 0x13, 0x75, 0xd3, 0x31, 0x3e, + 0x6f, 0x80, 0x21, 0xa5, 0xa3, 0xad, 0x10, 0x81, 0xb6, 0x37, 0xd4, 0x55, + 0x2e, 0xc1, 0xb8, 0x37, 0xa3, 0x3c, 0xe8, 0x81, 0x03, 0x3c, 0xda, 0x5f, + 0x6f, 0x45, 0x32, 0x2b, 0x0e, 0x99, 0x27, 0xfd, 0xe5, 0x6c, 0x07, 0xd9, + 0x4e, 0x0a, 0x8b, 0x23, 0x74, 0x96, 0x25, 0x97, 0xae, 0x6d, 0x19, 0xba, + 0xbf, 0x0f, 0xc8, 0xa1, 0xe5, 0xea, 0xa8, 0x00, 0x09, 0xc3, 0x9a, 0xef, + 0x09, 0x33, 0xc1, 0x33, 0x2e, 0x7b, 0x6d, 0xa7, 0x66, 0x87, 0xb6, 0x3a, + 0xb9, 0xdb, 0x4c, 0x5e, 0xb5, 0x55, 0x69, 0x37, 0x17, 0x92, 0x1f, 0xe3, + 0x53, 0x1a, 0x2d, 0x25, 0xd0, 0xcf, 0x72, 0x37, 0xc2, 0x89, 0x83, 0x78, + 0xcf, 0xac, 0x2e, 0x46, 0x92, 0x5c, 0x4a, 0xba, 0x7d, 0xa0, 0x22, 0x34, + 0xb1, 0x22, 0x26, 0x99, 0xda, 0xe8, 0x97, 0xe2, 0x0c, 0xd3, 0xbc, 0x97, + 0x7e, 0xa8, 0xb9, 0xe3, 0xe2, 0x7f, 0x56, 0xef, 0x22, 0xee, 0x15, 0x95, + 0xa6, 0xd1, 0xf4, 0xa7, 0xac, 0x4a, 0xab, 0xc1, 0x1a, 0xda, 0xc5, 0x5f, + 0xa5, 0x5e, 0x2f, 0x15, 0x9c, 0x36, 0xbe, 0xd3, 0x47, 0xb6, 0x86, 0xb9, + 0xc6, 0x59, 0x39, 0x36, 0xad, 0x84, 0x53, 0x95, 0x72, 0x91, 0x89, 0x51, + 0x32, 0x77, 0xf1, 0xa5, 0x93, 0xfe, 0xf0, 0x41, 0x7c, 0x64, 0xf1, 0xb0, + 0x8b, 0x81, 0x8d, 0x3a, 0x2c, 0x9e, 0xbe, 0x2e, 0x8b, 0xf7, 0x80, 0x63, + 0x35, 0x32, 0xfa, 0x26, 0xe0, 0x63, 0xbf, 0x5e, 0xaf, 0xf0, 0x08, 0xe0, + 0x80, 0x65, 0x38, 0xfa, 0x21, 0xaa, 0x91, 0x34, 0x48, 0x3d, 0x32, 0x5c, + 0xbf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x32, 0x30, 0x30, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x08, 0x30, 0x06, 0x82, 0x04, 0x61, + 0x2a, 0x62, 0x2a, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x3d, 0x55, 0x74, 0xf8, 0x3a, 0x26, 0x03, 0x8c, 0x6a, 0x2e, + 0x91, 0x0e, 0x18, 0x70, 0xb4, 0xa4, 0xcc, 0x04, 0x00, 0xd3, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x8f, 0x3b, 0xff, 0x46, 0x0c, 0xb5, + 0x21, 0xdc, 0xcf, 0x61, 0x9a, 0x25, 0x93, 0x99, 0x68, 0x2f, 0x16, 0x71, + 0x15, 0x00, 0x5f, 0xb0, 0x9b, 0x43, 0x5c, 0x47, 0xe2, 0x8e, 0xc8, 0xea, + 0xb3, 0x30, 0x4d, 0x87, 0x90, 0xcf, 0x24, 0x37, 0x5c, 0xfd, 0xc8, 0xc6, + 0x09, 0x36, 0xb2, 0xfb, 0xfd, 0xc1, 0x82, 0x92, 0x77, 0x5b, 0x9d, 0xeb, + 0xac, 0x47, 0xbc, 0xda, 0x7c, 0x89, 0x19, 0x03, 0x9e, 0xcd, 0x96, 0x2a, + 0x90, 0x55, 0x23, 0x19, 0xac, 0x9d, 0x49, 0xfb, 0xa0, 0x31, 0x7d, 0x6b, + 0x1a, 0x16, 0x13, 0xb1, 0xa9, 0xc9, 0xc4, 0xaf, 0xf1, 0xb4, 0xa7, 0x9b, + 0x08, 0x64, 0x6a, 0x09, 0xcd, 0x4a, 0x03, 0x4c, 0x93, 0xb6, 0xcf, 0x29, + 0xdb, 0x56, 0x88, 0x8e, 0xed, 0x08, 0x6d, 0x8d, 0x76, 0xa3, 0xd7, 0xc6, + 0x69, 0xa1, 0xf5, 0xd2, 0xd0, 0x0a, 0x4b, 0xfa, 0x88, 0x66, 0x6c, 0xe5, + 0x4a, 0xee, 0x13, 0xad, 0xad, 0x22, 0x25, 0x73, 0x39, 0x56, 0x74, 0x0e, + 0xda, 0xcd, 0x35, 0x67, 0xe3, 0x81, 0x5c, 0xc5, 0xae, 0x3c, 0x4f, 0x47, + 0x3e, 0x97, 0xde, 0xac, 0xf6, 0xe1, 0x26, 0xe2, 0xe0, 0x66, 0x48, 0x20, + 0x7c, 0x02, 0x81, 0x3e, 0x7d, 0x34, 0xb7, 0x73, 0x3e, 0x2e, 0xd6, 0x20, + 0x1c, 0xdf, 0xf1, 0xae, 0x86, 0x8b, 0xb2, 0xc2, 0x9b, 0x68, 0x9c, 0xf6, + 0x1a, 0x5e, 0x30, 0x06, 0x39, 0x0a, 0x1f, 0x7b, 0xd7, 0x18, 0x4b, 0x06, + 0x9d, 0xff, 0x84, 0x57, 0xcc, 0x92, 0xad, 0x81, 0x0a, 0x19, 0x11, 0xc4, + 0xac, 0x59, 0x00, 0xe8, 0x5a, 0x70, 0x78, 0xd6, 0x9f, 0xe0, 0x82, 0x2a, + 0x1f, 0x09, 0x36, 0x1c, 0x52, 0x98, 0xf7, 0x95, 0x8f, 0xf9, 0x48, 0x4f, + 0x30, 0x52, 0xb5, 0xf3, 0x8d, 0x13, 0x93, 0x27, 0xbe, 0xb4, 0x75, 0x39, + 0x65, 0xc6, 0x48, 0x4e, 0x32, 0xd7, 0xf4, 0xc3, 0x26, 0x8d + }; + + WOLFSSL_X509* x509 = NULL; + int certSize = (int)(sizeof(cert_der) / sizeof(unsigned char)); + const char *name1 = "ab"; + int nameLen1 = (int)(XSTRLEN(name1)); + const char *name2 = "acccbccc"; + int nameLen2 = (int)(XSTRLEN(name2)); + const char *name3 = "accb"; + int nameLen3 = (int)(XSTRLEN(name3)); + const char *name4 = "accda"; + int nameLen4 = (int)(XSTRLEN(name4)); + const char *name5 = "acc\0bcc"; + int nameLen5 = 7; + + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_buffer( + cert_der, certSize, WOLFSSL_FILETYPE_ASN1)); + + /* Ensure that "a*b*" matches "ab" */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name1, nameLen1, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that "a*b*" matches "acccbccc" */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name2, nameLen2, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that "a*b*" matches "accb" */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name3, nameLen3, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that "a*b*" does not match "accda" */ + ExpectIntNE(wolfSSL_X509_check_host(x509, name4, nameLen4, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + + /* Ensure that "a*b*" matches "ab", testing openssl behavior replication + * on check len input handling, 0 for len is OK as it should then use + * strlen(name1) */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name1, 0, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Openssl also allows for len to include NULL terminator */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name1, nameLen1 + 1, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that check string with NULL terminator in middle is + * rejected */ + ExpectIntNE(wolfSSL_X509_check_host(x509, name5, nameLen5, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + + wolfSSL_X509_free(x509); + +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_X509_name_match3(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) + /* A certificate with the subject alternative name *.example.com */ + const unsigned char cert_der[] = { + 0x30, 0x82, 0x03, 0xb7, 0x30, 0x82, 0x02, 0x9f, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x59, 0xbb, 0xf6, 0xde, 0xb8, 0x3d, 0x0e, 0x8c, 0xe4, + 0xbd, 0x98, 0xa3, 0xbe, 0x3e, 0x8f, 0xdc, 0xbd, 0x7f, 0xcc, 0xae, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x77, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0c, 0x07, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x31, + 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x42, 0x6f, + 0x7a, 0x65, 0x6d, 0x61, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x0b, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, + 0x49, 0x6e, 0x63, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, + 0x0c, 0x0b, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, + 0x77, 0x77, 0x77, 0x2e, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x34, 0x30, 0x35, 0x33, + 0x31, 0x30, 0x30, 0x33, 0x37, 0x34, 0x39, 0x5a, 0x17, 0x0d, 0x33, 0x34, + 0x30, 0x35, 0x32, 0x39, 0x30, 0x30, 0x33, 0x37, 0x34, 0x39, 0x5a, 0x30, + 0x77, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, + 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, + 0x07, 0x4d, 0x6f, 0x6e, 0x74, 0x61, 0x6e, 0x61, 0x31, 0x10, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x07, 0x42, 0x6f, 0x7a, 0x65, 0x6d, + 0x61, 0x6e, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x0b, 0x77, 0x6f, 0x6c, 0x66, 0x53, 0x53, 0x4c, 0x20, 0x49, 0x6e, 0x63, + 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x45, + 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x31, 0x18, + 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0f, 0x77, 0x77, 0x77, + 0x2e, 0x77, 0x6f, 0x6c, 0x66, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xda, 0x78, 0x16, + 0x05, 0x65, 0xf2, 0x85, 0xf2, 0x61, 0x7f, 0xb1, 0x4d, 0x73, 0xe2, 0x82, + 0xb5, 0x3d, 0xf7, 0x9d, 0x05, 0x65, 0xed, 0x9d, 0xc3, 0x29, 0x7a, 0x92, + 0x2c, 0x06, 0x5f, 0xc8, 0x13, 0x55, 0x42, 0x4e, 0xbd, 0xe2, 0x56, 0x2a, + 0x4b, 0xac, 0xe6, 0x1b, 0x10, 0xc9, 0xdb, 0x9a, 0x45, 0x36, 0xed, 0xf3, + 0x26, 0x8c, 0x22, 0x88, 0x1e, 0x6d, 0x2b, 0x41, 0xfa, 0x0d, 0x43, 0x88, + 0x88, 0xde, 0x8d, 0x2e, 0xca, 0x6e, 0x7c, 0x62, 0x66, 0x3e, 0xfa, 0x4e, + 0x71, 0xea, 0x7d, 0x3b, 0x32, 0x33, 0x5c, 0x7a, 0x7e, 0xea, 0x74, 0xbd, + 0xb6, 0x8f, 0x4c, 0x1c, 0x7a, 0x79, 0x94, 0xf1, 0xe8, 0x02, 0x67, 0x98, + 0x25, 0xb4, 0x31, 0x80, 0xc1, 0xae, 0xbf, 0xef, 0xf2, 0x6c, 0x78, 0x42, + 0xef, 0xb5, 0xc6, 0x01, 0x47, 0x79, 0x8d, 0x92, 0xce, 0xc1, 0xb5, 0x98, + 0x76, 0xf0, 0x84, 0xa2, 0x53, 0x90, 0xe5, 0x39, 0xc7, 0xbd, 0xf2, 0xbb, + 0xe3, 0x3f, 0x00, 0xf6, 0xf0, 0x46, 0x86, 0xee, 0x55, 0xbd, 0x2c, 0x1f, + 0x97, 0x24, 0x7c, 0xbc, 0xda, 0x2f, 0x1b, 0x53, 0xef, 0x26, 0x56, 0xcc, + 0xb7, 0xd8, 0xca, 0x17, 0x20, 0x4e, 0x62, 0x03, 0x66, 0x32, 0xb3, 0xd1, + 0x71, 0x26, 0x6c, 0xff, 0xd1, 0x9e, 0x44, 0x86, 0x2a, 0xae, 0xba, 0x43, + 0x00, 0x13, 0x7e, 0x50, 0xdd, 0x3e, 0x27, 0x39, 0x70, 0x1c, 0x0c, 0x0b, + 0xe8, 0xa2, 0xae, 0x03, 0x09, 0x2e, 0xd8, 0x71, 0xee, 0x7b, 0x1a, 0x09, + 0x2d, 0xe1, 0xd5, 0xde, 0xf5, 0xa3, 0x36, 0x77, 0x90, 0x97, 0x99, 0xd7, + 0x6c, 0xb7, 0x5c, 0x9d, 0xf7, 0x7e, 0x41, 0x89, 0xfe, 0xe4, 0x08, 0xc6, + 0x0b, 0xe4, 0x9b, 0x5f, 0x51, 0xa6, 0x08, 0xb8, 0x99, 0x81, 0xe9, 0xce, + 0xb4, 0x2d, 0xb2, 0x92, 0x9f, 0xe5, 0x1a, 0x98, 0x76, 0x20, 0x70, 0x54, + 0x93, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x3b, 0x30, 0x39, 0x30, 0x18, + 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x11, 0x30, 0x0f, 0x82, 0x0d, 0x2a, + 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x60, + 0xd4, 0x26, 0xbb, 0xcc, 0x7c, 0x29, 0xa2, 0x88, 0x3c, 0x76, 0x7d, 0xb4, + 0x86, 0x8b, 0x47, 0x64, 0x5b, 0x87, 0xe0, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0xc3, 0x0d, 0x03, 0x67, 0xbb, 0x47, 0x8b, 0xf3, 0x20, + 0xdc, 0x7d, 0x2e, 0xe1, 0xd9, 0xf0, 0x01, 0xc4, 0x66, 0xc2, 0xe1, 0xcd, + 0xc3, 0x4a, 0x72, 0xf0, 0x6e, 0x38, 0xcf, 0x63, 0x01, 0x96, 0x9e, 0x84, + 0xb9, 0xce, 0x1d, 0xba, 0x4b, 0xe0, 0x70, 0x86, 0x2b, 0x5a, 0xab, 0xec, + 0xbf, 0xc2, 0xaa, 0x64, 0xa2, 0x6c, 0xd2, 0x42, 0x52, 0xd4, 0xbe, 0x8a, + 0xca, 0x9c, 0x03, 0xf3, 0xd6, 0x5f, 0xcd, 0x23, 0x9f, 0xf5, 0xa9, 0x04, + 0x40, 0x5b, 0x66, 0x78, 0xc0, 0xac, 0xa1, 0xdb, 0x5d, 0xd1, 0x94, 0xfc, + 0x47, 0x94, 0xf5, 0x45, 0xe3, 0x70, 0x13, 0x3f, 0x66, 0x6d, 0xdd, 0x73, + 0x68, 0x68, 0xe2, 0xd2, 0x89, 0xcb, 0x7f, 0xc6, 0xca, 0xd6, 0x96, 0x0b, + 0xcc, 0xdd, 0xa1, 0x74, 0xda, 0x33, 0xe8, 0x9e, 0xda, 0xb7, 0xd9, 0x12, + 0xab, 0x85, 0x9d, 0x0c, 0xde, 0xa0, 0x7d, 0x7e, 0xa1, 0x91, 0xed, 0xe5, + 0x32, 0x7c, 0xc5, 0xea, 0x1d, 0x4a, 0xb5, 0x38, 0x63, 0x17, 0xf3, 0x4f, + 0x2c, 0x4a, 0x58, 0x86, 0x09, 0x33, 0x86, 0xc4, 0xe7, 0x56, 0x6f, 0x32, + 0x71, 0xb7, 0xd0, 0x83, 0x12, 0x9e, 0x26, 0x0a, 0x3a, 0x45, 0xcb, 0xd7, + 0x4e, 0xab, 0xa4, 0xc3, 0xee, 0x4c, 0xc0, 0x38, 0xa1, 0xfa, 0xba, 0xfa, + 0xb7, 0x80, 0x69, 0x67, 0xa3, 0xef, 0x89, 0xba, 0xce, 0x89, 0x91, 0x3d, + 0x6a, 0x76, 0xe9, 0x3b, 0x32, 0x86, 0x76, 0x85, 0x6b, 0x4f, 0x7f, 0xbc, + 0x7a, 0x5b, 0x31, 0x92, 0x79, 0x35, 0xf8, 0xb9, 0xb1, 0xd7, 0xdb, 0xa9, + 0x6a, 0x8a, 0x91, 0x60, 0x65, 0xd4, 0x76, 0x54, 0x55, 0x57, 0xb9, 0x35, + 0xe0, 0xf5, 0xbb, 0x8f, 0xd4, 0x40, 0x75, 0xbb, 0x47, 0xa8, 0xf9, 0x0f, + 0xea, 0xc9, 0x6e, 0x84, 0xd5, 0xf5, 0x58, 0x2d, 0xe5, 0x76, 0x7b, 0xdf, + 0x97, 0x05, 0x5e, 0xaf, 0x50, 0xf5, 0x48 + }; + + WOLFSSL_X509* x509 = NULL; + int certSize = (int)(sizeof(cert_der) / sizeof(unsigned char)); + const char *name1 = "foo.example.com"; + int nameLen1 = (int)(XSTRLEN(name1)); + const char *name2 = "x.y.example.com"; + int nameLen2 = (int)(XSTRLEN(name2)); + + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_buffer( + cert_der, certSize, WOLFSSL_FILETYPE_ASN1)); + + /* Ensure that "*.example.com" matches "foo.example.com" */ + ExpectIntEQ(wolfSSL_X509_check_host(x509, name1, nameLen1, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + /* Ensure that "*.example.com" does NOT match "x.y.example.com" */ + ExpectIntNE(wolfSSL_X509_check_host(x509, name2, nameLen2, + WOLFSSL_ALWAYS_CHECK_SUBJECT, NULL), WOLFSSL_SUCCESS); + + wolfSSL_X509_free(x509); + +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_X509_max_altnames(void) +{ + EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) + + /* Only test if max alt names has not been modified */ +#if WOLFSSL_MAX_ALT_NAMES == 128 + + WOLFSSL_CTX* ctx = NULL; + /* File contains a certificate encoded with 130 subject alternative names */ + const char* over_max_altnames_cert = \ + "./certs/test/cert-over-max-altnames.pem"; + +#ifndef NO_WOLFSSL_SERVER + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); +#else + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); +#endif + + ExpectIntNE(wolfSSL_CTX_load_verify_locations_ex(ctx, + over_max_altnames_cert, NULL, WOLFSSL_LOAD_FLAG_NONE), + WOLFSSL_SUCCESS); + wolfSSL_CTX_free(ctx); +#endif +#endif + return EXPECT_RESULT(); } +static int test_wolfSSL_X509_max_name_constraints(void) +{ + EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ + !defined(IGNORE_NAME_CONSTRAINTS) + + /* Only test if max name constraints has not been modified */ +#if WOLFSSL_MAX_NAME_CONSTRAINTS == 128 + + WOLFSSL_CTX* ctx = NULL; + /* File contains a certificate with 130 name constraints */ + const char* over_max_nc = "./certs/test/cert-over-max-nc.pem"; + +#ifndef NO_WOLFSSL_SERVER + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); +#else + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); +#endif + + ExpectIntNE(wolfSSL_CTX_load_verify_locations_ex(ctx, over_max_nc, + NULL, WOLFSSL_LOAD_FLAG_NONE), WOLFSSL_SUCCESS); + wolfSSL_CTX_free(ctx); +#endif + +#endif + return EXPECT_RESULT(); +} static int test_wolfSSL_X509(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) - EXPECT_DECLS; X509* x509 = NULL; #ifndef NO_BIO BIO* bio = NULL; @@ -42268,62 +51615,58 @@ X509_free(x509); /* refCount = 2 */ X509_free(x509); /* refCount = 1 */ X509_free(x509); /* refCount = 0, free */ - - res = EXPECT_RESULT(); - #endif - return res; +#endif + return EXPECT_RESULT(); } static int test_wolfSSL_X509_get_ext_count(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) int ret = 0; - WOLFSSL_X509* x509; + WOLFSSL_X509* x509 = NULL; const char ocspRootCaFile[] = "./certs/ocsp/root-ca-cert.pem"; - FILE* f; + XFILE f = XBADFILE; /* NULL parameter check */ - AssertIntEQ(X509_get_ext_count(NULL), WOLFSSL_FAILURE); + ExpectIntEQ(X509_get_ext_count(NULL), WOLFSSL_FAILURE); - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, - SSL_FILETYPE_PEM)); - AssertIntEQ(X509_get_ext_count(x509), 5); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, + SSL_FILETYPE_PEM)); + ExpectIntEQ(X509_get_ext_count(x509), 5); wolfSSL_X509_free(x509); - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(ocspRootCaFile, - SSL_FILETYPE_PEM)); - AssertIntEQ(X509_get_ext_count(x509), 5); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(ocspRootCaFile, + SSL_FILETYPE_PEM)); + ExpectIntEQ(X509_get_ext_count(x509), 5); wolfSSL_X509_free(x509); - AssertNotNull(f = fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); - fclose(f); + ExpectTrue((f = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + XFCLOSE(f); /* wolfSSL_X509_get_ext_count() valid input */ - AssertIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 5); + ExpectIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 5); /* wolfSSL_X509_get_ext_count() NULL argument */ - AssertIntEQ((ret = wolfSSL_X509_get_ext_count(NULL)), WOLFSSL_FAILURE); + ExpectIntEQ((ret = wolfSSL_X509_get_ext_count(NULL)), WOLFSSL_FAILURE); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_sign2(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; /* test requires WOLFSSL_AKID_NAME to match expected output */ #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_CERTS) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_ALT_NAMES) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_AKID_NAME) && \ (defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || \ defined(WOLFSSL_IP_ALT_NAME)) - EXPECT_DECLS; WOLFSSL_X509 *x509 = NULL; WOLFSSL_X509 *ca = NULL; const unsigned char *der = NULL; @@ -42344,8 +51687,8 @@ const unsigned char expected[] = { 0x30, 0x82, 0x05, 0x13, 0x30, 0x82, 0x03, 0xFB, 0xA0, 0x03, 0x02, 0x01, - 0x02, 0x02, 0x14, 0x73, 0xFB, 0x54, 0xD6, 0x03, 0x7D, 0x4C, 0x07, 0x84, - 0xE2, 0x00, 0x11, 0x8C, 0xDD, 0x90, 0xDC, 0x48, 0x8D, 0xEA, 0x53, 0x30, + 0x02, 0x02, 0x14, 0x08, 0xB0, 0x54, 0x7A, 0x03, 0x5A, 0xEC, 0x55, 0x8A, + 0x12, 0xE8, 0xF9, 0x8E, 0x34, 0xB6, 0x13, 0xD9, 0x59, 0xB8, 0xE8, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, @@ -42424,34 +51767,34 @@ 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x82, 0x14, 0x73, 0xFB, 0x54, 0xD6, 0x03, 0x7D, 0x4C, 0x07, - 0x84, 0xE2, 0x00, 0x11, 0x8C, 0xDD, 0x90, 0xDC, 0x48, 0x8D, 0xEA, 0x53, + 0x6F, 0x6D, 0x82, 0x14, 0x08, 0xB0, 0x54, 0x7A, 0x03, 0x5A, 0xEC, 0x55, + 0x8A, 0x12, 0xE8, 0xF9, 0x8E, 0x34, 0xB6, 0x13, 0xD9, 0x59, 0xB8, 0xE8, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, - 0x01, 0x01, 0x00, 0x4A, 0xFD, 0x81, 0xC9, 0xE9, 0xE6, 0x2D, 0xC7, 0x1F, - 0xFA, 0x0A, 0xDC, 0x80, 0x21, 0xCE, 0xD9, 0x27, 0xD4, 0xA4, 0xA1, 0xEC, - 0x87, 0x50, 0xA9, 0xE4, 0x6D, 0xF6, 0x04, 0x93, 0x5A, 0x1E, 0x51, 0xF4, - 0x8F, 0x92, 0x3E, 0x58, 0x90, 0xD7, 0xE5, 0xD7, 0x4A, 0x3D, 0xF3, 0xC6, - 0x1E, 0xE4, 0x78, 0x57, 0xCB, 0xE7, 0xED, 0x3F, 0x6A, 0x7D, 0x1E, 0xE2, - 0xF1, 0x9F, 0xAA, 0x18, 0x0A, 0xC9, 0x1A, 0xD6, 0x78, 0x71, 0xB3, 0xB6, - 0xE9, 0x55, 0x84, 0x27, 0x36, 0xA0, 0x89, 0x5C, 0x5A, 0x0A, 0x97, 0x53, - 0x95, 0x36, 0x68, 0x39, 0xA9, 0x17, 0x51, 0x84, 0x2A, 0x68, 0x5F, 0xAE, - 0xF3, 0x26, 0x32, 0x57, 0x99, 0x4A, 0x65, 0xE2, 0x14, 0x1E, 0xD8, 0x00, - 0x24, 0xC1, 0xD1, 0x75, 0x56, 0xD3, 0x99, 0xD3, 0x55, 0x10, 0x88, 0xEC, - 0x13, 0x05, 0x89, 0x18, 0x58, 0x55, 0x86, 0xFF, 0xA1, 0x2C, 0xB1, 0x96, - 0xE5, 0x63, 0x1C, 0x83, 0xCA, 0xF6, 0x58, 0x0C, 0xD5, 0xD2, 0x27, 0x70, - 0x61, 0x87, 0xCC, 0x17, 0x36, 0x6A, 0x75, 0x55, 0xB1, 0x13, 0xB6, 0xC8, - 0x94, 0x0B, 0x1F, 0xE0, 0x32, 0xCA, 0x94, 0xA2, 0x46, 0x95, 0xBC, 0xA2, - 0xA0, 0x2A, 0x4C, 0xEB, 0xFE, 0x14, 0xA3, 0x1D, 0x38, 0x13, 0x07, 0xB9, - 0x98, 0x62, 0x88, 0xF1, 0x8F, 0xBC, 0xD7, 0x3F, 0x72, 0xD4, 0x2F, 0x77, - 0xF2, 0x48, 0x0E, 0x9C, 0xAC, 0xE1, 0x44, 0x88, 0x58, 0x9A, 0x8E, 0x81, - 0xBD, 0xB8, 0x6E, 0xF4, 0x64, 0x9B, 0x3A, 0xF1, 0x1D, 0x13, 0xE3, 0x51, - 0xB9, 0xD1, 0x4D, 0xA3, 0xB5, 0x5D, 0x7B, 0x18, 0xBD, 0xDE, 0xAB, 0x1F, - 0x82, 0x23, 0xAE, 0x6E, 0xB7, 0xE9, 0xEA, 0x54, 0xE6, 0xF5, 0x3E, 0x10, - 0x80, 0x25, 0x36, 0x83, 0x46, 0xB2, 0x97, 0x8D, 0x3A, 0x06, 0xB6, 0xCC, - 0x8D, 0xBE, 0xB4, 0xE6, 0x5E, 0xCA, 0x7B + 0x01, 0x01, 0x00, 0x14, 0xFB, 0xD0, 0xCE, 0x31, 0x7F, 0xA5, 0x59, 0xFA, + 0x7C, 0x68, 0x26, 0xA7, 0xE8, 0x0D, 0x9F, 0x50, 0x57, 0xFA, 0x1C, 0x7C, + 0x5E, 0x43, 0xA4, 0x97, 0x47, 0xB6, 0x41, 0xAC, 0x63, 0xD3, 0x61, 0x8C, + 0x1F, 0x42, 0xEF, 0x53, 0xD0, 0xBA, 0x31, 0x4D, 0x99, 0x74, 0xA4, 0x60, + 0xDC, 0xC6, 0x6F, 0xCC, 0x1E, 0x25, 0x98, 0xE1, 0xA4, 0xA0, 0x67, 0x69, + 0x97, 0xE3, 0x97, 0x7C, 0x83, 0x28, 0xF1, 0xF4, 0x7D, 0x03, 0xA8, 0x31, + 0x77, 0xCC, 0xD1, 0x37, 0xEF, 0x7B, 0x4A, 0x71, 0x2D, 0x11, 0x7E, 0x92, + 0xF5, 0x67, 0xB7, 0x56, 0xBA, 0x28, 0xF8, 0xD6, 0xCE, 0x2A, 0x71, 0xE3, + 0x70, 0x6B, 0x09, 0x0F, 0x67, 0x6F, 0x7A, 0xE0, 0x89, 0xF6, 0x5E, 0x23, + 0x0C, 0x0A, 0x44, 0x4E, 0x65, 0x8E, 0x7B, 0x68, 0xD0, 0xAD, 0x76, 0x3E, + 0x2A, 0x0E, 0xA2, 0x05, 0x11, 0x74, 0x24, 0x08, 0x60, 0xED, 0x9F, 0x98, + 0x18, 0xE9, 0x91, 0x58, 0x36, 0xEC, 0xEC, 0x25, 0x6B, 0xBA, 0x9C, 0x87, + 0x38, 0x68, 0xDC, 0xDC, 0x15, 0x6F, 0x20, 0x68, 0xC4, 0xBF, 0x05, 0x5B, + 0x4A, 0x0C, 0x44, 0x2B, 0x92, 0x3F, 0x10, 0x99, 0xDC, 0xF6, 0x6C, 0x0E, + 0x34, 0x26, 0x6E, 0x6D, 0x4E, 0x12, 0xBC, 0x60, 0x8F, 0x27, 0x1D, 0x7A, + 0x00, 0x50, 0xBE, 0x23, 0xDE, 0x48, 0x47, 0x9F, 0xAD, 0x2F, 0x94, 0x3D, + 0x16, 0x73, 0x48, 0x6B, 0xC8, 0x97, 0xE6, 0xB4, 0xB3, 0x4B, 0xE1, 0x68, + 0x08, 0xC3, 0xE5, 0x34, 0x5F, 0x9B, 0xDA, 0xAB, 0xCA, 0x6D, 0x55, 0x32, + 0xEF, 0x6C, 0xEF, 0x9B, 0x8B, 0x5B, 0xC7, 0xF0, 0xC2, 0x0F, 0x8E, 0x93, + 0x09, 0x60, 0x3C, 0x0B, 0xDC, 0xBD, 0xDB, 0x4A, 0x2D, 0xD0, 0x98, 0xAA, + 0xAB, 0x6C, 0x6F, 0x6D, 0x6B, 0x6A, 0x5C, 0x33, 0xAC, 0xAD, 0xA8, 0x1B, + 0x38, 0x5D, 0x9F, 0xDA, 0xE7, 0x70, 0x07 }; pt = ca_key_der_2048; @@ -42492,22 +51835,19 @@ wolfSSL_ASN1_TIME_free(notBefore); wolfSSL_ASN1_TIME_free(notAfter); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_sign(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_ASN_TIME) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) && !defined(NO_RSA) - EXPECT_DECLS; - int ret; + int ret = 0; char *cn = NULL; - word32 cnSz; + word32 cnSz = 0; X509_NAME *name = NULL; X509 *x509 = NULL; X509 *ca = NULL; @@ -42584,6 +51924,13 @@ #endif #endif /* WOLFSSL_ALT_NAMES */ + { + ASN1_UTCTIME* infinite_past = NULL; + ExpectNotNull(infinite_past = ASN1_UTCTIME_set(NULL, 0)); + ExpectIntEQ(X509_set1_notBefore(x509, infinite_past), 1); + ASN1_UTCTIME_free(infinite_past); + } + /* test valid sign case */ ExpectIntGT(ret = X509_sign(x509, priv, EVP_sha256()), 0); @@ -42638,7 +51985,7 @@ ExpectNotNull(name = X509_get_subject_name(ca)); cnSz = X509_NAME_get_sz(name); ExpectNotNull(cn = (char*)XMALLOC(cnSz, HEAP_HINT, DYNAMIC_TYPE_OPENSSL)); - ExpectNotNull(cn = X509_NAME_oneline(name, cn, cnSz)); + ExpectNotNull(cn = X509_NAME_oneline(name, cn, (int)cnSz)); ExpectIntEQ(0, XSTRNCMP(cn, dCert.subject, XSTRLEN(cn))); XFREE(cn, HEAP_HINT, DYNAMIC_TYPE_OPENSSL); cn = NULL; @@ -42660,7 +52007,7 @@ ExpectNotNull(name = X509_get_issuer_name(x509)); cnSz = X509_NAME_get_sz(name); ExpectNotNull(cn = (char*)XMALLOC(cnSz, HEAP_HINT, DYNAMIC_TYPE_OPENSSL)); - ExpectNotNull(cn = X509_NAME_oneline(name, cn, cnSz)); + ExpectNotNull(cn = X509_NAME_oneline(name, cn, (int)cnSz)); /* compare and don't include the multi-attrib "/OU=OU1/OU=OU2" above */ ExpectIntEQ(0, XSTRNCMP(cn, dCert.issuer, XSTRLEN(dCert.issuer))); XFREE(cn, HEAP_HINT, DYNAMIC_TYPE_OPENSSL); @@ -42694,17 +52041,14 @@ EVP_PKEY_free(pub); X509_free(x509); X509_free(ca); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_get0_tbs_sigalg(void) { - int res = TEST_SKIPPED; -#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) EXPECT_DECLS; +#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) X509* x509 = NULL; const X509_ALGOR* alg; @@ -42714,18 +52058,15 @@ ExpectNotNull(alg = X509_get0_tbs_sigalg(x509)); X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_ALGOR_get0(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && \ !defined(NO_SHA256) && !defined(NO_RSA) - EXPECT_DECLS; X509* x509 = NULL; const ASN1_OBJECT* obj = NULL; const X509_ALGOR* alg = NULL; @@ -42749,18 +52090,15 @@ ExpectIntEQ(OBJ_obj2nid(obj), NID_sha256WithRSAEncryption); X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_VERIFY_PARAM(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) X509_VERIFY_PARAM *paramTo = NULL; X509_VERIFY_PARAM *paramFrom = NULL; char testIPv4[] = "127.0.0.1"; @@ -42878,13 +52216,12 @@ X509_VERIFY_PARAM_free(paramTo); X509_VERIFY_PARAM_free(paramFrom); X509_VERIFY_PARAM_free(NULL); /* to confirm NULL parameter gives no harm */ - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } -#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ + !defined(WOLFSSL_HOSTNAME_VERIFY_ALT_NAME_ONLY) static int test_wolfSSL_check_domain_verify_count = 0; @@ -42895,7 +52232,7 @@ ExpectIntEQ(X509_STORE_CTX_get_error(store), 0); ExpectIntEQ(preverify, 1); ExpectIntGT(++test_wolfSSL_check_domain_verify_count, 0); - return EXPECT_RESULT() == TEST_SUCCESS; + return EXPECT_SUCCESS(); } static int test_wolfSSL_check_domain_client_cb(WOLFSSL* ssl) @@ -42949,13 +52286,20 @@ return EXPECT_RESULT(); } +#else + +static int test_wolfSSL_check_domain(void) +{ + EXPECT_DECLS; + return EXPECT_RESULT(); +} + #endif /* OPENSSL_EXTRA && HAVE_SSL_MEMIO_TESTS_DEPENDENCIES */ static int test_wolfSSL_X509_get_X509_PUBKEY(void) { - int res = TEST_SKIPPED; -#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) EXPECT_DECLS; +#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) X509* x509 = NULL; X509_PUBKEY* pubKey; @@ -42965,18 +52309,15 @@ ExpectNotNull(pubKey = wolfSSL_X509_get_X509_PUBKEY(x509)); X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_PUBKEY_RSA(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && \ !defined(NO_SHA256) && !defined(NO_RSA) - EXPECT_DECLS; X509* x509 = NULL; ASN1_OBJECT* obj = NULL; const ASN1_OBJECT* pa_oid = NULL; @@ -43018,17 +52359,14 @@ X509_PUBKEY_free(pubKey2); X509_free(x509); EVP_PKEY_free(evpKey); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_PUBKEY_EC(void) { - int res = TEST_SKIPPED; -#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && defined(HAVE_ECC) EXPECT_DECLS; +#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && defined(HAVE_ECC) X509* x509 = NULL; ASN1_OBJECT* obj = NULL; ASN1_OBJECT* poid = NULL; @@ -43066,17 +52404,14 @@ X509_PUBKEY_free(pubKey2); X509_free(x509); EVP_PKEY_free(evpKey); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_PUBKEY_DSA(void) { - int res = TEST_SKIPPED; -#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && !defined(NO_DSA) EXPECT_DECLS; +#if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && !defined(NO_DSA) word32 bytes; #ifdef USE_CERT_BUFFERS_1024 byte tmp[ONEK_BUF]; @@ -43141,26 +52476,21 @@ X509_PUBKEY_free(pubKey); EVP_PKEY_free(evpKey); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BUF(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) BUF_MEM* buf = NULL; ExpectNotNull(buf = BUF_MEM_new()); ExpectIntEQ(BUF_MEM_grow(buf, 10), 10); ExpectIntEQ(BUF_MEM_grow(buf, -1), 0); BUF_MEM_free(buf); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB) @@ -43232,9 +52562,8 @@ static int test_wolfSSL_RAND_set_rand_method(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_NO_OPENSSL_RAND_CB) RAND_METHOD rand_methods = {NULL, NULL, NULL, NULL, NULL, NULL}; unsigned char* buf = NULL; int num = 0; @@ -43287,17 +52616,14 @@ RAND_set_rand_method(NULL); XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA && !WOLFSSL_NO_OPENSSL_RAND_CB */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RAND_bytes(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) const int size1 = RNG_MAX_BLOCK_LEN; /* in bytes */ const int size2 = RNG_MAX_BLOCK_LEN + 1; /* in bytes */ const int size3 = RNG_MAX_BLOCK_LEN * 2; /* in bytes */ @@ -43324,17 +52650,14 @@ ExpectIntEQ(RAND_bytes(my_buf, size4), 1); XFREE(my_buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RAND(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) byte seed[16]; XMEMSET(seed, 0, sizeof(seed)); @@ -43353,19 +52676,16 @@ ExpectIntEQ(RAND_write_file(NULL), 0); } #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PKCS8_Compat(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && defined(HAVE_ECC) && \ !defined(NO_BIO) - EXPECT_DECLS; PKCS8_PRIV_KEY_INFO* pt = NULL; BIO* bio = NULL; XFILE f = XBADFILE; @@ -43396,25 +52716,34 @@ BIO_free(bio); PKCS8_PRIV_KEY_INFO_free(pt); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); +} + +#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_BIO) +static int NoPasswordCallBack(char* passwd, int sz, int rw, void* userdata) +{ + (void)passwd; + (void)sz; + (void)rw; + (void)userdata; + + return -1; } +#endif static int test_wolfSSL_PKCS8_d2i(void) { - int res = TEST_SKIPPED; -#if !defined(HAVE_FIPS) && defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if !defined(HAVE_FIPS) && defined(OPENSSL_EXTRA) /* This test ends up using HMAC as a part of PBKDF2, and HMAC * requires a 12 byte password in FIPS mode. This test ends up * trying to use an 8 byte password. */ #ifndef NO_FILESYSTEM unsigned char pkcs8_buffer[2048]; - const unsigned char* p; - int bytes; + const unsigned char* p = NULL; + int bytes = 0; XFILE file = XBADFILE; WOLFSSL_EVP_PKEY* pkey = NULL; #ifndef NO_BIO @@ -43485,6 +52814,13 @@ #endif /* OPENSSL_ALL */ #ifndef NO_FILESYSTEM +#if defined(OPENSSL_ALL) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8) + ExpectIntEQ(PEM_write_PKCS8PrivateKey(XBADFILE, pkey, NULL, NULL, 0, NULL, + NULL), 0); + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, NULL, NULL, NULL, 0, NULL, + NULL), 0); +#endif + #ifndef NO_RSA /* Get DER encoded RSA PKCS#8 data. */ ExpectTrue((file = XFOPEN(rsaDerPkcs8File, "rb")) != XBADFILE); @@ -43515,20 +52851,33 @@ #if defined(OPENSSL_ALL) && \ !defined(NO_BIO) && !defined(NO_PWDBASED) && defined(HAVE_PKCS8) ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(NULL, pkey, NULL, NULL, 0, NULL, + NULL), 0); + ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, NULL, NULL, NULL, 0, NULL, + NULL), 0); /* Write PKCS#8 PEM to BIO. */ ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), bytes); + /* Write PKCS#8 PEM to stderr. */ + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, pkey, NULL, NULL, 0, NULL, + NULL), bytes); /* Compare file and written data */ ExpectIntEQ(BIO_get_mem_data(bio, &p), bytes); ExpectIntEQ(XMEMCMP(p, pkcs8_buffer, bytes), 0); BIO_free(bio); bio = NULL; +#if !defined(NO_AES) && defined(HAVE_AESGCM) + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, pkey, EVP_aes_128_gcm(), + NULL, 0, PasswordCallBack, (void*)"yassl123"), 0); +#endif #if !defined(NO_DES3) && !defined(NO_SHA) ExpectNotNull(bio = BIO_new(BIO_s_mem())); /* Write Encrypted PKCS#8 PEM to BIO. */ bytes = 1834; ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, EVP_des_ede3_cbc(), NULL, 0, PasswordCallBack, (void*)"yassl123"), bytes); + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, pkey, EVP_des_ede3_cbc(), + NULL, 0, PasswordCallBack, (void*)"yassl123"), bytes); ExpectNotNull(evpPkey = PEM_read_bio_PrivateKey(bio, NULL, PasswordCallBack, (void*)"yassl123")); EVP_PKEY_free(evpPkey); @@ -43598,6 +52947,8 @@ /* Write PKCS#8 PEM to BIO. */ ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, NULL, NULL, 0, NULL, NULL), bytes); + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, pkey, NULL, NULL, 0, NULL, + NULL), bytes); /* Compare file and written data */ ExpectIntEQ(BIO_get_mem_data(bio, &p), bytes); ExpectIntEQ(XMEMCMP(p, pkcs8_buffer, bytes), 0); @@ -43607,6 +52958,14 @@ /* Write Encrypted PKCS#8 PEM to BIO. */ bytes = 379; ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, EVP_aes_256_cbc(), + NULL, 0, NoPasswordCallBack, (void*)"yassl123"), 0); + ExpectIntEQ(PEM_write_bio_PKCS8PrivateKey(bio, pkey, EVP_aes_256_cbc(), + NULL, 0, PasswordCallBack, (void*)"yassl123"), bytes); + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, pkey, EVP_aes_128_cbc(), + NULL, 0, PasswordCallBack, (void*)"yassl123"), bytes); + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, pkey, EVP_aes_128_cbc(), + (char*)"yassl123", 8, PasswordCallBack, NULL), bytes); + ExpectIntEQ(PEM_write_PKCS8PrivateKey(stderr, pkey, EVP_aes_256_cbc(), NULL, 0, PasswordCallBack, (void*)"yassl123"), bytes); ExpectNotNull(evpPkey = PEM_read_bio_PrivateKey(bio, NULL, PasswordCallBack, (void*)"yassl123")); @@ -43642,10 +53001,8 @@ #endif /* HAVE_ECC */ #endif /* !NO_FILESYSTEM */ - - res = EXPECT_RESULT(); #endif /* HAVE_FIPS && OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } #if defined(ERROR_QUEUE_PER_THREAD) && !defined(NO_ERROR_QUEUE) && \ @@ -43697,7 +53054,7 @@ /* test that the 3 errors over the max were dropped */ AssertIntEQ(errorCount, ERROR_QUEUE_MAX); - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); } #endif @@ -43725,10 +53082,9 @@ static int test_wolfSSL_ERR_put_error(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ERROR_QUEUE) && defined(OPENSSL_EXTRA) && \ defined(DEBUG_WOLFSSL) - EXPECT_DECLS; const char* file; int line; @@ -43792,10 +53148,8 @@ ERR_put_error(0,SYS_F_ACCEPT, 0, "this file", 0); ERR_clear_error(); ExpectIntEQ(ERR_get_error_line(&file, &line), 0); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* @@ -43804,10 +53158,8 @@ */ static int test_wolfSSL_ERR_get_error_order(void) { - int res = TEST_SKIPPED; -#ifdef WOLFSSL_HAVE_ERROR_QUEUE EXPECT_DECLS; - +#if defined(WOLFSSL_HAVE_ERROR_QUEUE) && defined(OPENSSL_EXTRA) /* Empty the queue. */ wolfSSL_ERR_clear_error(); @@ -43818,28 +53170,25 @@ ExpectIntEQ(wolfSSL_ERR_get_error(), -ASN_NO_SIGNER_E); ExpectIntEQ(wolfSSL_ERR_peek_error(), -ASN_SELF_SIGNED_E); ExpectIntEQ(wolfSSL_ERR_get_error(), -ASN_SELF_SIGNED_E); - - res = EXPECT_RESULT(); -#endif /* WOLFSSL_HAVE_ERROR_QUEUE */ - return res; +#endif /* WOLFSSL_HAVE_ERROR_QUEUE && OPENSSL_EXTRA */ + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_ERR_print_errors(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ERROR_QUEUE) && defined(OPENSSL_EXTRA) && \ defined(DEBUG_WOLFSSL) && !defined(NO_ERROR_STRINGS) - EXPECT_DECLS; BIO* bio = NULL; char buf[1024]; ExpectNotNull(bio = BIO_new(BIO_s_mem())); ERR_clear_error(); /* clear out any error nodes */ ERR_put_error(0,SYS_F_ACCEPT, -173, "ssl.c", 0); - /* Choosing -299 as an unused errno between MIN_CODE_E < x < WC_LAST_E. */ - ERR_put_error(0,SYS_F_BIND, -299, "asn.c", 100); + /* Choosing -600 as an unused errno. */ + ERR_put_error(0,SYS_F_BIND, -600, "asn.c", 100); ERR_print_errors(bio); ExpectIntEQ(BIO_gets(bio, buf, sizeof(buf)), 56); @@ -43848,17 +53197,15 @@ buf, 55), 0); ExpectIntEQ(BIO_gets(bio, buf, sizeof(buf)), 57); ExpectIntEQ(XSTRNCMP( - "error:299:wolfSSL library:unknown error number:asn.c:100", + "error:600:wolfSSL library:unknown error number:asn.c:100", buf, 56), 0); ExpectIntEQ(BIO_gets(bio, buf, sizeof(buf)), 1); ExpectIntEQ(buf[0], '\0'); ExpectIntEQ(ERR_get_error_line(NULL, NULL), 0); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if !defined(NO_ERROR_QUEUE) && defined(OPENSSL_EXTRA) && \ @@ -43872,10 +53219,9 @@ static int test_wolfSSL_ERR_print_errors_cb(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ERROR_QUEUE) && defined(OPENSSL_EXTRA) && \ defined(DEBUG_WOLFSSL) - EXPECT_DECLS; BIO* bio = NULL; char buf[1024]; @@ -43895,11 +53241,9 @@ ExpectIntEQ(BIO_gets(bio, buf, sizeof(buf)), 0); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } /* * Testing WOLFSSL_ERROR_MSG @@ -43916,7 +53260,7 @@ res = TEST_SUCCESS; #endif return res; -}/*End test_WOLFSSL_ERROR_MSG*/ +} /* End test_WOLFSSL_ERROR_MSG */ /* * Testing wc_ERR_remove_state */ @@ -43929,16 +53273,15 @@ res = TEST_SUCCESS; #endif return res; -}/*End test_wc_ERR_remove_state*/ +} /* End test_wc_ERR_remove_state */ /* * Testing wc_ERR_print_errors_fp */ static int test_wc_ERR_print_errors_fp(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE)) && \ (!defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)) - EXPECT_DECLS; long sz; XFILE fp = XBADFILE; @@ -43957,11 +53300,9 @@ if (fp != XBADFILE) XFCLOSE(fp); (void)sz; - - res = EXPECT_RESULT(); #endif - return res; -}/*End test_wc_ERR_print_errors_fp*/ + return EXPECT_RESULT(); +} /* End test_wc_ERR_print_errors_fp */ #ifdef DEBUG_WOLFSSL static void Logging_cb(const int logLevel, const char *const logMessage) { @@ -43986,10 +53327,972 @@ ExpectNull(wolfSSL_GetLoggingCb()); return EXPECT_RESULT(); -}/*End test_wolfSSL_GetLoggingCb*/ +} /* End test_wolfSSL_GetLoggingCb */ #endif /* !NO_BIO */ +static int test_wolfSSL_MD4(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_MD4) + MD4_CTX md4; + unsigned char out[16]; /* MD4_DIGEST_SIZE */ + const char* msg = "12345678901234567890123456789012345678901234567890123456" + "789012345678901234567890"; + const char* test = "\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19\x9c\x3e\x7b\x16\x4f" + "\xcc\x05\x36"; + int msgSz = (int)XSTRLEN(msg); + + + XMEMSET(out, 0, sizeof(out)); + MD4_Init(&md4); + MD4_Update(&md4, (const void*)msg, (unsigned long)msgSz); + MD4_Final(out, &md4); + ExpectIntEQ(XMEMCMP(out, test, sizeof(out)), 0); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_MD5(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_MD5) + byte input1[] = ""; + byte input2[] = "message digest"; + byte hash[WC_MD5_DIGEST_SIZE]; + unsigned char output1[] = + "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e"; + unsigned char output2[] = + "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d\x52\x5a\x2f\x31\xaa\xf1\x61\xd0"; + WOLFSSL_MD5_CTX md5; + + XMEMSET(&md5, 0, sizeof(md5)); + + /* Test cases for illegal parameters */ + ExpectIntEQ(MD5_Init(NULL), 0); + ExpectIntEQ(MD5_Init(&md5), 1); + ExpectIntEQ(MD5_Update(NULL, input1, 0), 0); + ExpectIntEQ(MD5_Update(NULL, NULL, 0), 0); + ExpectIntEQ(MD5_Update(&md5, NULL, 1), 0); + ExpectIntEQ(MD5_Final(NULL, &md5), 0); + ExpectIntEQ(MD5_Final(hash, NULL), 0); + ExpectIntEQ(MD5_Final(NULL, NULL), 0); + + /* Init MD5 CTX */ + ExpectIntEQ(wolfSSL_MD5_Init(&md5), 1); + ExpectIntEQ(wolfSSL_MD5_Update(&md5, input1, XSTRLEN((const char*)&input1)), + 1); + ExpectIntEQ(wolfSSL_MD5_Final(hash, &md5), 1); + ExpectIntEQ(XMEMCMP(&hash, output1, WC_MD5_DIGEST_SIZE), 0); + + /* Init MD5 CTX */ + ExpectIntEQ(wolfSSL_MD5_Init(&md5), 1); + ExpectIntEQ(wolfSSL_MD5_Update(&md5, input2, + (int)XSTRLEN((const char*)input2)), 1); + ExpectIntEQ(wolfSSL_MD5_Final(hash, &md5), 1); + ExpectIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); +#if !defined(NO_OLD_NAMES) && \ + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))) + ExpectPtrNE(MD5(NULL, 1, (byte*)&hash), &hash); + ExpectPtrEq(MD5(input1, 0, (byte*)&hash), &hash); + ExpectPtrNE(MD5(input1, 1, NULL), NULL); + ExpectPtrNE(MD5(NULL, 0, NULL), NULL); + + ExpectPtrEq(MD5(input1, (int)XSTRLEN((const char*)&input1), (byte*)&hash), + &hash); + ExpectIntEQ(XMEMCMP(&hash, output1, WC_MD5_DIGEST_SIZE), 0); + + ExpectPtrEq(MD5(input2, (int)XSTRLEN((const char*)&input2), (byte*)&hash), + &hash); + ExpectIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); + { + byte data[] = "Data to be hashed."; + XMEMSET(hash, 0, WC_MD5_DIGEST_SIZE); + + ExpectNotNull(MD5(data, sizeof(data), NULL)); + ExpectNotNull(MD5(data, sizeof(data), hash)); + ExpectNotNull(MD5(NULL, 0, hash)); + ExpectNull(MD5(NULL, sizeof(data), hash)); + } +#endif +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_MD5_Transform(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_MD5) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_MD5_BLOCK_SIZE]; + word32 sLen = 0; +#ifdef BIG_ENDIAN_ORDER + unsigned char output1[] = + "\x03\x1f\x1d\xac\x6e\xa5\x8e\xd0\x1f\xab\x67\xb7\x74\x31\x77\x91"; + unsigned char output2[] = + "\xef\xd3\x79\x8d\x67\x17\x25\x90\xa4\x13\x79\xc7\xe3\xa7\x7b\xbc"; +#else + unsigned char output1[] = + "\xac\x1d\x1f\x03\xd0\x8e\xa5\x6e\xb7\x67\xab\x1f\x91\x77\x31\x74"; + unsigned char output2[] = + "\x8d\x79\xd3\xef\x90\x25\x17\x67\xc7\x79\x13\xa4\xbc\x7b\xa7\xe3"; +#endif + + union { + wc_Md5 native; + MD5_CTX compat; + } md5; + + XMEMSET(&md5.compat, 0, sizeof(md5.compat)); + XMEMSET(&local, 0, sizeof(local)); + + /* sanity check */ + ExpectIntEQ(MD5_Transform(NULL, NULL), 0); + ExpectIntEQ(MD5_Transform(NULL, (const byte*)&input1), 0); + ExpectIntEQ(MD5_Transform(&md5.compat, NULL), 0); + ExpectIntEQ(wc_Md5Transform(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Md5Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Md5Transform(&md5.native, NULL), BAD_FUNC_ARG); + + /* Init MD5 CTX */ + ExpectIntEQ(wolfSSL_MD5_Init(&md5.compat), 1); + /* Do Transform*/ + sLen = (word32)XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + ExpectIntEQ(MD5_Transform(&md5.compat, (const byte*)&local[0]), 1); + + ExpectIntEQ(XMEMCMP(md5.native.digest, output1, WC_MD5_DIGEST_SIZE), 0); + + /* Init MD5 CTX */ + ExpectIntEQ(MD5_Init(&md5.compat), 1); + sLen = (word32)XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_MD5_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + ExpectIntEQ(MD5_Transform(&md5.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(md5.native.digest, output2, WC_MD5_DIGEST_SIZE), 0); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(HAVE_SELFTEST) + #if !defined(NO_SHA) && defined(NO_OLD_SHA_NAMES) && \ + (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) + { + const unsigned char in[] = "abc"; + unsigned char expected[] = "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E" + "\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D"; + unsigned char out[WC_SHA_DIGEST_SIZE]; + unsigned char* p = NULL; + WOLFSSL_SHA_CTX sha; + + XMEMSET(out, 0, WC_SHA_DIGEST_SIZE); + ExpectNotNull(SHA1(in, XSTRLEN((char*)in), out)); + ExpectIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); + + /* SHA interface test */ + XMEMSET(out, 0, WC_SHA_DIGEST_SIZE); + + ExpectNull(SHA(NULL, XSTRLEN((char*)in), out)); + ExpectNotNull(SHA(in, 0, out)); + ExpectNotNull(SHA(in, XSTRLEN((char*)in), NULL)); + ExpectNotNull(SHA(NULL, 0, out)); + ExpectNotNull(SHA(NULL, 0, NULL)); + + ExpectNotNull(SHA(in, XSTRLEN((char*)in), out)); + ExpectIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); + ExpectNotNull(p = SHA(in, XSTRLEN((char*)in), NULL)); + ExpectIntEQ(XMEMCMP(p, expected, WC_SHA_DIGEST_SIZE), 0); + + ExpectIntEQ(wolfSSL_SHA_Init(&sha), 1); + ExpectIntEQ(wolfSSL_SHA_Update(&sha, in, XSTRLEN((char*)in)), 1); + ExpectIntEQ(wolfSSL_SHA_Final(out, &sha), 1); + ExpectIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); + + ExpectIntEQ(wolfSSL_SHA1_Init(&sha), 1); + ExpectIntEQ(wolfSSL_SHA1_Update(&sha, in, XSTRLEN((char*)in)), 1); + ExpectIntEQ(wolfSSL_SHA1_Final(out, &sha), 1); + ExpectIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); + } + #endif + + #if !defined(NO_SHA256) + { + const unsigned char in[] = "abc"; + unsigned char expected[] = + "\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22" + "\x23\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00" + "\x15\xAD"; + unsigned char out[WC_SHA256_DIGEST_SIZE]; + unsigned char* p = NULL; + + XMEMSET(out, 0, WC_SHA256_DIGEST_SIZE); +#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) + ExpectNotNull(SHA256(in, XSTRLEN((char*)in), out)); +#else + ExpectNotNull(wolfSSL_SHA256(in, XSTRLEN((char*)in), out)); +#endif + ExpectIntEQ(XMEMCMP(out, expected, WC_SHA256_DIGEST_SIZE), 0); +#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) + ExpectNotNull(p = SHA256(in, XSTRLEN((char*)in), NULL)); +#else + ExpectNotNull(p = wolfSSL_SHA256(in, XSTRLEN((char*)in), NULL)); +#endif + ExpectIntEQ(XMEMCMP(p, expected, WC_SHA256_DIGEST_SIZE), 0); + } + #endif + + #if defined(WOLFSSL_SHA384) + { + const unsigned char in[] = "abc"; + unsigned char expected[] = + "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50" + "\x07\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff" + "\x5b\xed\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34" + "\xc8\x25\xa7"; + unsigned char out[WC_SHA384_DIGEST_SIZE]; + unsigned char* p = NULL; + + XMEMSET(out, 0, WC_SHA384_DIGEST_SIZE); +#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) + ExpectNotNull(SHA384(in, XSTRLEN((char*)in), out)); +#else + ExpectNotNull(wolfSSL_SHA384(in, XSTRLEN((char*)in), out)); +#endif + ExpectIntEQ(XMEMCMP(out, expected, WC_SHA384_DIGEST_SIZE), 0); +#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) + ExpectNotNull(p = SHA384(in, XSTRLEN((char*)in), NULL)); +#else + ExpectNotNull(p = wolfSSL_SHA384(in, XSTRLEN((char*)in), NULL)); +#endif + ExpectIntEQ(XMEMCMP(p, expected, WC_SHA384_DIGEST_SIZE), 0); + } + #endif + + #if defined(WOLFSSL_SHA512) + { + const unsigned char in[] = "abc"; + unsigned char expected[] = + "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41" + "\x31\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55" + "\xd3\x9a\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3" + "\xfe\xeb\xbd\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f" + "\xa5\x4c\xa4\x9f"; + unsigned char out[WC_SHA512_DIGEST_SIZE]; + unsigned char* p = NULL; + + XMEMSET(out, 0, WC_SHA512_DIGEST_SIZE); +#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) + ExpectNotNull(SHA512(in, XSTRLEN((char*)in), out)); +#else + ExpectNotNull(wolfSSL_SHA512(in, XSTRLEN((char*)in), out)); +#endif + ExpectIntEQ(XMEMCMP(out, expected, WC_SHA512_DIGEST_SIZE), 0); +#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) + ExpectNotNull(p = SHA512(in, XSTRLEN((char*)in), NULL)); +#else + ExpectNotNull(p = wolfSSL_SHA512(in, XSTRLEN((char*)in), NULL)); +#endif + ExpectIntEQ(XMEMCMP(p, expected, WC_SHA512_DIGEST_SIZE), 0); + } + #endif +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA_Transform(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA_BLOCK_SIZE]; + word32 sLen = 0; +#ifdef BIG_ENDIAN_ORDER + unsigned char output1[] = + "\x92\xb4\x04\xe5\x56\x58\x8c\xed\x6c\x1a\xcd\x4e\xbf\x05\x3f\x68" + "\x09\xf7\x3a\x93"; + unsigned char output2[] = + "\x97\xb2\x74\x8b\x4f\x5b\xbc\xca\x5b\xc0\xe6\xea\x2d\x40\xb4\xa0" + "\x7c\x6e\x08\xb8"; +#else + unsigned char output1[] = + "\xe5\x04\xb4\x92\xed\x8c\x58\x56\x4e\xcd\x1a\x6c\x68\x3f\x05\xbf" + "\x93\x3a\xf7\x09"; + unsigned char output2[] = + "\x8b\x74\xb2\x97\xca\xbc\x5b\x4f\xea\xe6\xc0\x5b\xa0\xb4\x40\x2d" + "\xb8\x08\x6e\x7c"; +#endif + + union { + wc_Sha native; + SHA_CTX compat; + } sha; + union { + wc_Sha native; + SHA_CTX compat; + } sha1; + + XMEMSET(&sha.compat, 0, sizeof(sha.compat)); + XMEMSET(&local, 0, sizeof(local)); + + /* sanity check */ + ExpectIntEQ(SHA_Transform(NULL, NULL), 0); + ExpectIntEQ(SHA_Transform(NULL, (const byte*)&input1), 0); + ExpectIntEQ(SHA_Transform(&sha.compat, NULL), 0); + ExpectIntEQ(SHA1_Transform(NULL, NULL), 0); + ExpectIntEQ(SHA1_Transform(NULL, (const byte*)&input1), 0); + ExpectIntEQ(SHA1_Transform(&sha.compat, NULL), 0); + ExpectIntEQ(wc_ShaTransform(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_ShaTransform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + ExpectIntEQ(wc_ShaTransform(&sha.native, NULL), BAD_FUNC_ARG); + + /* Init SHA CTX */ + ExpectIntEQ(SHA_Init(&sha.compat), 1); + /* Do Transform*/ + sLen = (word32)XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + ExpectIntEQ(SHA_Transform(&sha.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha.native.digest, output1, WC_SHA_DIGEST_SIZE), 0); + ExpectIntEQ(SHA_Final(local, &sha.compat), 1); /* frees resources */ + + /* Init SHA CTX */ + ExpectIntEQ(SHA_Init(&sha.compat), 1); + sLen = (word32)XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + ExpectIntEQ(SHA_Transform(&sha.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha.native.digest, output2, WC_SHA_DIGEST_SIZE), 0); + ExpectIntEQ(SHA_Final(local, &sha.compat), 1); /* frees resources */ + + /* SHA1 */ + XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); + /* Init SHA CTX */ + ExpectIntEQ(SHA1_Init(&sha1.compat), 1); + /* Do Transform*/ + sLen = (word32)XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + ExpectIntEQ(SHA1_Transform(&sha1.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha1.native.digest, output1, WC_SHA_DIGEST_SIZE), 0); + ExpectIntEQ(SHA1_Final(local, &sha1.compat), 1); /* frees resources */ + + /* Init SHA CTX */ + ExpectIntEQ(SHA1_Init(&sha1.compat), 1); + sLen = (word32)XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + ExpectIntEQ(SHA1_Transform(&sha1.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha1.native.digest, output2, WC_SHA_DIGEST_SIZE), 0); + ExpectIntEQ(SHA_Final(local, &sha1.compat), 1); /* frees resources */ +#endif +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA224(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA224) && \ + !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) + unsigned char input[] = + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + unsigned char output[] = + "\x75\x38\x8b\x16\x51\x27\x76\xcc\x5d\xba\x5d\xa1\xfd\x89\x01" + "\x50\xb0\xc6\x45\x5c\xb4\xf5\x8b\x19\x52\x52\x25\x25"; + size_t inLen; + byte hash[WC_SHA224_DIGEST_SIZE]; + unsigned char* p; + + inLen = XSTRLEN((char*)input); + + XMEMSET(hash, 0, WC_SHA224_DIGEST_SIZE); + + ExpectNull(SHA224(NULL, inLen, hash)); + ExpectNotNull(SHA224(input, 0, hash)); + ExpectNotNull(SHA224(input, inLen, NULL)); + ExpectNotNull(SHA224(NULL, 0, hash)); + ExpectNotNull(SHA224(NULL, 0, NULL)); + + ExpectNotNull(SHA224(input, inLen, hash)); + ExpectIntEQ(XMEMCMP(hash, output, WC_SHA224_DIGEST_SIZE), 0); + ExpectNotNull(p = SHA224(input, inLen, NULL)); + ExpectIntEQ(XMEMCMP(p, output, WC_SHA224_DIGEST_SIZE), 0); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA256(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ + defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) + unsigned char input[] = + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + unsigned char output[] = + "\x24\x8D\x6A\x61\xD2\x06\x38\xB8\xE5\xC0\x26\x93\x0C\x3E\x60" + "\x39\xA3\x3C\xE4\x59\x64\xFF\x21\x67\xF6\xEC\xED\xD4\x19\xDB" + "\x06\xC1"; + size_t inLen; + byte hash[WC_SHA256_DIGEST_SIZE]; + + inLen = XSTRLEN((char*)input); + + XMEMSET(hash, 0, WC_SHA256_DIGEST_SIZE); + ExpectNotNull(SHA256(input, inLen, hash)); + ExpectIntEQ(XMEMCMP(hash, output, WC_SHA256_DIGEST_SIZE), 0); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA256_Transform(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ + !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH) && \ + !defined(WOLFSSL_KCAPI_HASH) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA256_BLOCK_SIZE]; + word32 sLen = 0; +#ifdef BIG_ENDIAN_ORDER + unsigned char output1[] = + "\xda\x56\x98\xbe\x17\xb9\xb4\x69\x62\x33\x57\x99\x77\x9f\xbe\xca" + "\x8c\xe5\xd4\x91\xc0\xd2\x62\x43\xba\xfe\xf9\xea\x18\x37\xa9\xd8"; + unsigned char output2[] = + "\x1d\x4e\xd4\x67\x67\x7c\x61\x67\x44\x10\x76\x26\x78\x10\xff\xb8" + "\x40\xc8\x9a\x39\x73\x16\x60\x8c\xa6\x61\xd6\x05\x91\xf2\x8c\x35"; +#else + unsigned char output1[] = + "\xbe\x98\x56\xda\x69\xb4\xb9\x17\x99\x57\x33\x62\xca\xbe\x9f\x77" + "\x91\xd4\xe5\x8c\x43\x62\xd2\xc0\xea\xf9\xfe\xba\xd8\xa9\x37\x18"; + unsigned char output2[] = + "\x67\xd4\x4e\x1d\x67\x61\x7c\x67\x26\x76\x10\x44\xb8\xff\x10\x78" + "\x39\x9a\xc8\x40\x8c\x60\x16\x73\x05\xd6\x61\xa6\x35\x8c\xf2\x91"; +#endif + union { + wc_Sha256 native; + SHA256_CTX compat; + } sha256; + + XMEMSET(&sha256.compat, 0, sizeof(sha256.compat)); + XMEMSET(&local, 0, sizeof(local)); + + /* sanity check */ + ExpectIntEQ(SHA256_Transform(NULL, NULL), 0); + ExpectIntEQ(SHA256_Transform(NULL, (const byte*)&input1), 0); + ExpectIntEQ(SHA256_Transform(&sha256.compat, NULL), 0); + ExpectIntEQ(wc_Sha256Transform(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha256Transform(&sha256.native, NULL), BAD_FUNC_ARG); + + /* Init SHA256 CTX */ + ExpectIntEQ(SHA256_Init(&sha256.compat), 1); + /* Do Transform*/ + sLen = (word32)XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + ExpectIntEQ(SHA256_Transform(&sha256.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha256.native.digest, output1, WC_SHA256_DIGEST_SIZE), + 0); + ExpectIntEQ(SHA256_Final(local, &sha256.compat), 1); /* frees resources */ + + /* Init SHA256 CTX */ + ExpectIntEQ(SHA256_Init(&sha256.compat), 1); + sLen = (word32)XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA256_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + ExpectIntEQ(SHA256_Transform(&sha256.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha256.native.digest, output2, WC_SHA256_DIGEST_SIZE), + 0); + ExpectIntEQ(SHA256_Final(local, &sha256.compat), 1); /* frees resources */ +#endif +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA512_Transform(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ + !defined(WOLFSSL_KCAPI_HASH) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA512_BLOCK_SIZE]; + word32 sLen = 0; +#ifdef BIG_ENDIAN_ORDER + unsigned char output1[] = + "\xcf\x78\x81\xd5\x77\x4a\xcb\xe8\x53\x33\x62\xe0\xfb\xc7\x80\x70" + "\x02\x67\x63\x9d\x87\x46\x0e\xda\x30\x86\xcb\x40\xe8\x59\x31\xb0" + "\x71\x7d\xc9\x52\x88\xa0\x23\xa3\x96\xba\xb2\xc1\x4c\xe0\xb5\xe0" + "\x6f\xc4\xfe\x04\xea\xe3\x3e\x0b\x91\xf4\xd8\x0c\xbd\x66\x8b\xee"; + unsigned char output2[] = + "\x11\x10\x93\x4e\xeb\xa0\xcc\x0d\xfd\x33\x43\x9c\xfb\x04\xc8\x21" + "\xa9\xb4\x26\x3d\xca\xab\x31\x41\xe2\xc6\xaa\xaf\xe1\x67\xd7\xab" + "\x31\x8f\x2e\x54\x2c\xba\x4e\x83\xbe\x88\xec\x9d\x8f\x2b\x38\x98" + "\x14\xd2\x4e\x9d\x53\x8b\x5e\x4d\xde\x68\x6c\x69\xaf\x20\x96\xf0"; +#else + unsigned char output1[] = + "\xe8\xcb\x4a\x77\xd5\x81\x78\xcf\x70\x80\xc7\xfb\xe0\x62\x33\x53" + "\xda\x0e\x46\x87\x9d\x63\x67\x02\xb0\x31\x59\xe8\x40\xcb\x86\x30" + "\xa3\x23\xa0\x88\x52\xc9\x7d\x71\xe0\xb5\xe0\x4c\xc1\xb2\xba\x96" + "\x0b\x3e\xe3\xea\x04\xfe\xc4\x6f\xee\x8b\x66\xbd\x0c\xd8\xf4\x91"; + unsigned char output2[] = + "\x0d\xcc\xa0\xeb\x4e\x93\x10\x11\x21\xc8\x04\xfb\x9c\x43\x33\xfd" + "\x41\x31\xab\xca\x3d\x26\xb4\xa9\xab\xd7\x67\xe1\xaf\xaa\xc6\xe2" + "\x83\x4e\xba\x2c\x54\x2e\x8f\x31\x98\x38\x2b\x8f\x9d\xec\x88\xbe" + "\x4d\x5e\x8b\x53\x9d\x4e\xd2\x14\xf0\x96\x20\xaf\x69\x6c\x68\xde"; +#endif + union { + wc_Sha512 native; + SHA512_CTX compat; + } sha512; + + XMEMSET(&sha512.compat, 0, sizeof(sha512.compat)); + XMEMSET(&local, 0, sizeof(local)); + + /* sanity check */ + ExpectIntEQ(SHA512_Transform(NULL, NULL), 0); + ExpectIntEQ(SHA512_Transform(NULL, (const byte*)&input1), 0); + ExpectIntEQ(SHA512_Transform(&sha512.compat, NULL), 0); + ExpectIntEQ(wc_Sha512Transform(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512Transform(&sha512.native, NULL), BAD_FUNC_ARG); + + /* Init SHA512 CTX */ + ExpectIntEQ(wolfSSL_SHA512_Init(&sha512.compat), 1); + + /* Do Transform*/ + sLen = (word32)XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + ExpectIntEQ(SHA512_Transform(&sha512.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha512.native.digest, output1, + WC_SHA512_DIGEST_SIZE), 0); + ExpectIntEQ(SHA512_Final(local, &sha512.compat), 1); /* frees resources */ + + /* Init SHA512 CTX */ + ExpectIntEQ(SHA512_Init(&sha512.compat), 1); + sLen = (word32)XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA512_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + ExpectIntEQ(SHA512_Transform(&sha512.compat, (const byte*)&local[0]), 1); + ExpectIntEQ(XMEMCMP(sha512.native.digest, output2, + WC_SHA512_DIGEST_SIZE), 0); + ExpectIntEQ(SHA512_Final(local, &sha512.compat), 1); /* frees resources */ + + (void)input1; +#endif +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA512_224_Transform(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) && \ + !defined(WOLFSSL_NOSHA512_224) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ + !defined(WOLFSSL_KCAPI_HASH) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA512_BLOCK_SIZE]; + word32 sLen = 0; + unsigned char output1[] = + "\x94\x24\x66\xd4\x60\x3a\xeb\x23\x1d\xa8\x69\x31\x3c\xd2\xde\x11" + "\x48\x0f\x4a\x5a\xdf\x3a\x8d\x87\xcf\xcd\xbf\xa5\x03\x21\x50\xf1" + "\x8a\x0d\x0f\x0d\x3c\x07\xba\x52\xe0\xaa\x3c\xbb\xf1\xd3\x3f\xca" + "\x12\xa7\x61\xf8\x47\xda\x0d\x1b\x79\xc2\x65\x13\x92\xc1\x9c\xa5"; + unsigned char output2[] = + "\x51\x28\xe7\x0b\xca\x1e\xbc\x5f\xd7\x34\x0b\x48\x30\xd7\xc2\x75" + "\x6d\x8d\x48\x2c\x1f\xc7\x9e\x2b\x20\x5e\xbb\x0f\x0e\x4d\xb7\x61" + "\x31\x76\x33\xa0\xb4\x3d\x5f\x93\xc1\x73\xac\xf7\x21\xff\x69\x17" + "\xce\x66\xe5\x1e\x31\xe7\xf3\x22\x0f\x0b\x34\xd7\x5a\x57\xeb\xbf"; + union { + wc_Sha512 native; + SHA512_CTX compat; + } sha512; + +#ifdef BIG_ENDIAN_ORDER + ByteReverseWords64((word64*)output1, (word64*)output1, sizeof(output1)); + ByteReverseWords64((word64*)output2, (word64*)output2, sizeof(output2)); +#endif + + XMEMSET(&sha512.compat, 0, sizeof(sha512.compat)); + XMEMSET(&local, 0, sizeof(local)); + + /* sanity check */ + ExpectIntEQ(SHA512_224_Transform(NULL, NULL), 0); + ExpectIntEQ(SHA512_224_Transform(NULL, (const byte*)&input1), 0); + ExpectIntEQ(SHA512_224_Transform(&sha512.compat, NULL), 0); + ExpectIntEQ(wc_Sha512_224Transform(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_224Transform(NULL, (const byte*)&input1), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_224Transform(&sha512.native, NULL), BAD_FUNC_ARG); + + /* Init SHA512 CTX */ + ExpectIntEQ(wolfSSL_SHA512_224_Init(&sha512.compat), 1); + + /* Do Transform*/ + sLen = (word32)XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + ExpectIntEQ(SHA512_224_Transform(&sha512.compat, (const byte*)&local[0]), + 1); + ExpectIntEQ(XMEMCMP(sha512.native.digest, output1, + WC_SHA512_DIGEST_SIZE), 0); + /* frees resources */ + ExpectIntEQ(SHA512_224_Final(local, &sha512.compat), 1); + + /* Init SHA512 CTX */ + ExpectIntEQ(SHA512_224_Init(&sha512.compat), 1); + sLen = (word32)XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA512_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + ExpectIntEQ(SHA512_224_Transform(&sha512.compat, (const byte*)&local[0]), + 1); + ExpectIntEQ(XMEMCMP(sha512.native.digest, output2, + WC_SHA512_DIGEST_SIZE), 0); + /* frees resources */ + ExpectIntEQ(SHA512_224_Final(local, &sha512.compat), 1); +#endif +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SHA512_256_Transform(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) && \ + !defined(WOLFSSL_NOSHA512_256) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ + !defined(WOLFSSL_KCAPI_HASH) + byte input1[] = ""; + byte input2[] = "abc"; + byte local[WC_SHA512_BLOCK_SIZE]; + word32 sLen = 0; + unsigned char output1[] = + "\xf8\x37\x37\x5a\xd7\x2e\x56\xec\xe2\x51\xa8\x31\x3a\xa0\x63\x2b" + "\x7e\x7c\x64\xcc\xd9\xff\x2b\x6b\xeb\xc3\xd4\x4d\x7f\x8a\x3a\xb5" + "\x61\x85\x0b\x37\x30\x9f\x3b\x08\x5e\x7b\xd3\xbc\x6d\x00\x61\xc0" + "\x65\x9a\xd7\x73\xda\x40\xbe\xc1\xe5\x2f\xc6\x5d\xb7\x9f\xbe\x60"; + unsigned char output2[] = + "\x22\xad\xc0\x30\xee\xd4\x6a\xef\x13\xee\x5a\x95\x8b\x1f\xb7\xb6" + "\xb6\xba\xc0\x44\xb8\x18\x3b\xf0\xf6\x4b\x70\x9f\x03\xba\x64\xa1" + "\xe1\xe3\x45\x15\x91\x7d\xcb\x0b\x9a\xf0\xd2\x8e\x47\x8b\x37\x78" + "\x91\x41\xa6\xc4\xb0\x29\x8f\x8b\xdd\x78\x5c\xf2\x73\x3f\x21\x31"; + union { + wc_Sha512 native; + SHA512_CTX compat; + } sha512; + +#ifdef BIG_ENDIAN_ORDER + ByteReverseWords64((word64*)output1, (word64*)output1, sizeof(output1)); + ByteReverseWords64((word64*)output2, (word64*)output2, sizeof(output2)); +#endif + + XMEMSET(&sha512.compat, 0, sizeof(sha512.compat)); + XMEMSET(&local, 0, sizeof(local)); + + /* sanity check */ + ExpectIntEQ(SHA512_256_Transform(NULL, NULL), 0); + ExpectIntEQ(SHA512_256_Transform(NULL, (const byte*)&input1), 0); + ExpectIntEQ(SHA512_256_Transform(&sha512.compat, NULL), 0); + ExpectIntEQ(wc_Sha512_256Transform(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_256Transform(NULL, (const byte*)&input1), + BAD_FUNC_ARG); + ExpectIntEQ(wc_Sha512_256Transform(&sha512.native, NULL), BAD_FUNC_ARG); + + /* Init SHA512 CTX */ + ExpectIntEQ(wolfSSL_SHA512_256_Init(&sha512.compat), 1); + + /* Do Transform*/ + sLen = (word32)XSTRLEN((char*)input1); + XMEMCPY(local, input1, sLen); + ExpectIntEQ(SHA512_256_Transform(&sha512.compat, (const byte*)&local[0]), + 1); + ExpectIntEQ(XMEMCMP(sha512.native.digest, output1, + WC_SHA512_DIGEST_SIZE), 0); + /* frees resources */ + ExpectIntEQ(SHA512_256_Final(local, &sha512.compat), 1); + + /* Init SHA512 CTX */ + ExpectIntEQ(SHA512_256_Init(&sha512.compat), 1); + sLen = (word32)XSTRLEN((char*)input2); + XMEMSET(local, 0, WC_SHA512_BLOCK_SIZE); + XMEMCPY(local, input2, sLen); + ExpectIntEQ(SHA512_256_Transform(&sha512.compat, (const byte*)&local[0]), + 1); + ExpectIntEQ(XMEMCMP(sha512.native.digest, output2, + WC_SHA512_DIGEST_SIZE), 0); + /* frees resources */ + ExpectIntEQ(SHA512_256_Final(local, &sha512.compat), 1); +#endif +#endif + return EXPECT_RESULT(); +} + +#if defined(OPENSSL_EXTRA) && !defined(NO_HMAC) +/* helper function for test_wolfSSL_HMAC_CTX, digest size is expected to be a + * buffer of 64 bytes. + * + * returns the size of the digest buffer on success and a negative value on + * failure. + */ +static int test_HMAC_CTX_helper(const EVP_MD* type, unsigned char* digest, + int* sz) +{ + EXPECT_DECLS; + HMAC_CTX ctx1; + HMAC_CTX ctx2; + + unsigned char key[] = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b" + "\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; + unsigned char long_key[] = + "0123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789" + "0123456789012345678901234567890123456789"; + + unsigned char msg[] = "message to hash"; + unsigned int digestSz = 64; + int keySz = sizeof(key); + int long_keySz = sizeof(long_key); + int msgSz = sizeof(msg); + + unsigned char digest2[64]; + unsigned int digestSz2 = 64; + + HMAC_CTX_init(&ctx1); + + ExpectIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); + + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx1); + + ExpectIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx2, digest2, &digestSz2), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx2); + + ExpectIntEQ(digestSz, digestSz2); + ExpectIntEQ(XMEMCMP(digest, digest2, digestSz), 0); + + /* test HMAC_Init with NULL key */ + + /* init after copy */ + HMAC_CTX_init(&ctx1); + ExpectIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); + + ExpectIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx1); + + ExpectIntEQ(HMAC_Init(&ctx2, NULL, 0, NULL), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx2, digest2, &digestSz), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx2); + + ExpectIntEQ(digestSz, digestSz2); + ExpectIntEQ(XMEMCMP(digest, digest2, digestSz), 0); + + /* long key */ + HMAC_CTX_init(&ctx1); + ExpectIntEQ(HMAC_Init(&ctx1, (const void*)long_key, long_keySz, type), + SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); + + ExpectIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx1); + + ExpectIntEQ(HMAC_Init(&ctx2, NULL, 0, NULL), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx2, digest2, &digestSz), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx2); + + ExpectIntEQ(digestSz, digestSz2); + ExpectIntEQ(XMEMCMP(digest, digest2, digestSz), 0); + + /* init before copy */ + HMAC_CTX_init(&ctx1); + ExpectIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); + ExpectIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); + + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx1); + + ExpectIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); + ExpectIntEQ(HMAC_Final(&ctx2, digest2, &digestSz), SSL_SUCCESS); + HMAC_CTX_cleanup(&ctx2); + + ExpectIntEQ(digestSz, digestSz2); + ExpectIntEQ(XMEMCMP(digest, digest2, digestSz), 0); + + *sz = (int)digestSz; + return EXPECT_RESULT(); +} +#endif /* defined(OPENSSL_EXTRA) && !defined(NO_HMAC) */ + +static int test_wolfSSL_HMAC_CTX(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_HMAC) + unsigned char digest[64]; + int digestSz; + WOLFSSL_HMAC_CTX* hmac_ctx = NULL; + WOLFSSL_HMAC_CTX ctx1; + WOLFSSL_HMAC_CTX ctx2; + + ExpectNotNull(hmac_ctx = wolfSSL_HMAC_CTX_new()); + ExpectIntEQ(wolfSSL_HMAC_CTX_Init(NULL), 1); + ExpectIntEQ(wolfSSL_HMAC_CTX_Init(hmac_ctx), 1); + wolfSSL_HMAC_CTX_free(NULL); + wolfSSL_HMAC_CTX_free(hmac_ctx); + + XMEMSET(&ctx2, 0, sizeof(WOLFSSL_HMAC_CTX)); + ExpectIntEQ(HMAC_CTX_init(NULL), 1); + ExpectIntEQ(HMAC_CTX_init(&ctx2), 1); + ExpectIntEQ(HMAC_CTX_copy(NULL, NULL), 0); + ExpectIntEQ(HMAC_CTX_copy(NULL, &ctx2), 0); + ExpectIntEQ(HMAC_CTX_copy(&ctx2, NULL), 0); +#if defined(HAVE_SELFTEST) || (defined(HAVE_FIPS) && \ + ((! defined(HAVE_FIPS_VERSION)) || \ + defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION <= 2))) + /* Copy object that hasn't had a digest set - MD5. */ + ExpectIntEQ(HMAC_CTX_copy(&ctx1, &ctx2), 1); +#else + /* Copy object that hasn't had a digest set. */ + ExpectIntEQ(HMAC_CTX_copy(&ctx1, &ctx2), 0); +#endif + HMAC_CTX_cleanup(NULL); + HMAC_CTX_cleanup(&ctx2); + + ExpectNull(HMAC_CTX_get_md(NULL)); + + #ifndef NO_SHA + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha1(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 20); + ExpectIntEQ(XMEMCMP("\xD9\x68\x77\x23\x70\xFB\x53\x70\x53\xBA\x0E\xDC\xDA" + "\xBF\x03\x98\x31\x19\xB2\xCC", digest, digestSz), 0); + #endif /* !NO_SHA */ + #ifdef WOLFSSL_SHA224 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha224(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 28); + ExpectIntEQ(XMEMCMP("\x57\xFD\xF4\xE1\x2D\xB0\x79\xD7\x4B\x25\x7E\xB1\x95" + "\x9C\x11\xAC\x2D\x1E\x78\x94\x4F\x3A\x0F\xED\xF8\xAD" + "\x02\x0E", digest, digestSz), 0); + #endif /* WOLFSSL_SHA224 */ + #ifndef NO_SHA256 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha256(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 32); + ExpectIntEQ(XMEMCMP("\x13\xAB\x76\x91\x0C\x37\x86\x8D\xB3\x7E\x30\x0C\xFC" + "\xB0\x2E\x8E\x4A\xD7\xD4\x25\xCC\x3A\xA9\x0F\xA2\xF2" + "\x47\x1E\x62\x6F\x5D\xF2", digest, digestSz), 0); + #endif /* !NO_SHA256 */ + + #ifdef WOLFSSL_SHA384 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha384(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 48); + ExpectIntEQ(XMEMCMP("\x9E\xCB\x07\x0C\x11\x76\x3F\x23\xC3\x25\x0E\xC4\xB7" + "\x28\x77\x95\x99\xD5\x9D\x7A\xBB\x1A\x9F\xB7\xFD\x25" + "\xC9\x72\x47\x9F\x8F\x86\x76\xD6\x20\x57\x87\xB7\xE7" + "\xCD\xFB\xC2\xCC\x9F\x2B\xC5\x41\xAB", + digest, digestSz), 0); + #endif /* WOLFSSL_SHA384 */ + #ifdef WOLFSSL_SHA512 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha512(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 64); + ExpectIntEQ(XMEMCMP("\xD4\x21\x0C\x8B\x60\x6F\xF4\xBF\x07\x2F\x26\xCC\xAD" + "\xBC\x06\x0B\x34\x78\x8B\x4F\xD6\xC0\x42\xF1\x33\x10" + "\x6C\x4F\x1E\x55\x59\xDD\x2A\x9F\x15\x88\x62\xF8\x60" + "\xA3\x99\x91\xE2\x08\x7B\xF7\x95\x3A\xB0\x92\x48\x60" + "\x88\x8B\x5B\xB8\x5F\xE9\xB6\xB1\x96\xE3\xB5\xF0", + digest, digestSz), 0); + #endif /* WOLFSSL_SHA512 */ + +#ifdef WOLFSSL_SHA3 + #ifndef WOLFSSL_NOSHA3_224 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha3_224(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 28); + ExpectIntEQ(XMEMCMP("\xdc\x53\x25\x3f\xc0\x9d\x2b\x0c\x7f\x59\x11\x17\x08" + "\x5c\xe8\x43\x31\x01\x5a\xb3\xe3\x08\x37\x71\x26\x0b" + "\x29\x0f", digest, digestSz), 0); + #endif + #ifndef WOLFSSL_NOSHA3_256 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha3_256(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 32); + ExpectIntEQ(XMEMCMP("\x0f\x00\x89\x82\x15\xce\xd6\x45\x01\x83\xce\xc8\x35" + "\xab\x71\x07\xc9\xfe\x61\x22\x38\xf9\x09\xad\x35\x65" + "\x43\x77\x24\xd4\x1e\xf4", digest, digestSz), 0); + #endif + #ifndef WOLFSSL_NOSHA3_384 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha3_384(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 48); + ExpectIntEQ(XMEMCMP("\x0f\x6a\xc0\xfb\xc3\xf2\x80\xb1\xb4\x04\xb6\xc8\x45" + "\x23\x3b\xb4\xbe\xc6\xea\x85\x07\xca\x8c\x71\xbb\x6e" + "\x79\xf6\xf9\x2b\x98\xf5\xef\x11\x39\xd4\x5d\xd3\xca" + "\xc0\xe6\x81\xf7\x73\xf9\x85\x5d\x4f", + digest, digestSz), 0); + #endif + #ifndef WOLFSSL_NOSHA3_512 + ExpectIntEQ((test_HMAC_CTX_helper(EVP_sha3_512(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 64); + ExpectIntEQ(XMEMCMP("\x3e\x77\xe3\x59\x42\x89\xed\xc3\xa4\x26\x3d\xa4\x75" + "\xd2\x84\x8c\xb2\xf3\x25\x04\x47\x61\xce\x1c\x42\x86" + "\xcd\xf4\x56\xaa\x2f\x84\xb1\x3b\x18\xed\xe6\xd6\x48" + "\x15\xb0\x29\xc5\x9d\x32\xef\xdd\x3e\x09\xf6\xed\x9e" + "\x70\xbc\x1c\x63\xf7\x3b\x3e\xe1\xdc\x84\x9c\x1c", + digest, digestSz), 0); + #endif +#endif + + #if !defined(NO_MD5) && (!defined(HAVE_FIPS_VERSION) || \ + HAVE_FIPS_VERSION <= 2) + ExpectIntEQ((test_HMAC_CTX_helper(EVP_md5(), digest, &digestSz)), + TEST_SUCCESS); + ExpectIntEQ(digestSz, 16); + ExpectIntEQ(XMEMCMP("\xB7\x27\xC4\x41\xE5\x2E\x62\xBA\x54\xED\x72\x70\x9F" + "\xE4\x98\xDD", digest, digestSz), 0); + #endif /* !NO_MD5 */ +#endif + return EXPECT_RESULT(); +} + #if defined(OPENSSL_EXTRA) && (!defined(NO_SHA256) || \ defined(WOLFSSL_SHA224) || defined(WOLFSSL_SHA384) || \ defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA3)) @@ -44004,23 +54307,58 @@ ExpectNotNull(hmac = HMAC_CTX_new()); HMAC_CTX_init(hmac); - ExpectIntEQ(HMAC_Init_ex(hmac, (void*)key, (int)sizeof(key), md, e), - SSL_SUCCESS); +#if defined(HAVE_SELFTEST) || (defined(HAVE_FIPS) && \ + ((! defined(HAVE_FIPS_VERSION)) || \ + defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION <= 2))) + /* Get size on object that hasn't had a digest set - MD5. */ + ExpectIntEQ(HMAC_size(hmac), 16); + ExpectIntEQ(HMAC_Init(hmac, NULL, 0, NULL), 1); + ExpectIntEQ(HMAC_Init(hmac, (void*)key, (int)sizeof(key), NULL), 1); + ExpectIntEQ(HMAC_Init(hmac, NULL, 0, md), 1); +#else + ExpectIntEQ(HMAC_size(hmac), BAD_FUNC_ARG); + ExpectIntEQ(HMAC_Init(hmac, NULL, 0, NULL), 0); + ExpectIntEQ(HMAC_Init(hmac, (void*)key, (int)sizeof(key), NULL), 0); + ExpectIntEQ(HMAC_Init(hmac, NULL, 0, md), 0); +#endif + ExpectIntEQ(HMAC_Init_ex(NULL, (void*)key, (int)sizeof(key), md, e), 0); + ExpectIntEQ(HMAC_Init_ex(hmac, (void*)key, (int)sizeof(key), md, e), 1); /* re-using test key as data to hash */ - ExpectIntEQ(HMAC_Update(hmac, key, (int)sizeof(key)), SSL_SUCCESS); - ExpectIntEQ(HMAC_Update(hmac, NULL, 0), SSL_SUCCESS); - ExpectIntEQ(HMAC_Final(hmac, hash, &len), SSL_SUCCESS); + ExpectIntEQ(HMAC_Update(NULL, key, (int)sizeof(key)), 0); + ExpectIntEQ(HMAC_Update(hmac, key, (int)sizeof(key)), 1); + ExpectIntEQ(HMAC_Update(hmac, key, 0), 1); + ExpectIntEQ(HMAC_Update(hmac, NULL, 0), 1); + ExpectIntEQ(HMAC_Update(hmac, NULL, (int)sizeof(key)), 1); + ExpectIntEQ(HMAC_Final(NULL, NULL, &len), 0); + ExpectIntEQ(HMAC_Final(hmac, NULL, &len), 0); + ExpectIntEQ(HMAC_Final(NULL, hash, &len), 0); + ExpectIntEQ(HMAC_Final(hmac, hash, &len), 1); + ExpectIntEQ(HMAC_Final(hmac, hash, NULL), 1); ExpectIntEQ(len, md_len); + ExpectIntEQ(HMAC_size(NULL), 0); ExpectIntEQ(HMAC_size(hmac), md_len); ExpectStrEQ(HMAC_CTX_get_md(hmac), md); + HMAC_cleanup(NULL); HMAC_cleanup(hmac); HMAC_CTX_free(hmac); len = 0; + ExpectNull(HMAC(NULL, key, (int)sizeof(key), NULL, 0, hash, &len)); + ExpectNull(HMAC(md, NULL, (int)sizeof(key), NULL, 0, hash, &len)); + ExpectNull(HMAC(md, key, (int)sizeof(key), NULL, 0, NULL, &len)); ExpectNotNull(HMAC(md, key, (int)sizeof(key), NULL, 0, hash, &len)); ExpectIntEQ(len, md_len); + ExpectNotNull(HMAC(md, key, (int)sizeof(key), NULL, 0, hash, NULL)); + /* With data. */ + ExpectNotNull(HMAC(md, key, (int)sizeof(key), key, (int)sizeof(key), hash, + &len)); + /* With NULL data. */ + ExpectNull(HMAC(md, key, (int)sizeof(key), NULL, (int)sizeof(key), hash, + &len)); + /* With zero length data. */ + ExpectNotNull(HMAC(md, key, (int)sizeof(key), key, 0, hash, &len)); return EXPECT_RESULT(); } @@ -44028,11 +54366,10 @@ static int test_wolfSSL_HMAC(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && (!defined(NO_SHA256) || \ defined(WOLFSSL_SHA224) || defined(WOLFSSL_SHA384) || \ defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA3)) - EXPECT_DECLS; #ifndef NO_SHA256 ExpectIntEQ(test_openssl_hmac(EVP_sha256(), (int)WC_SHA256_DIGEST_SIZE), TEST_SUCCESS); @@ -44071,63 +54408,1036 @@ ExpectIntEQ(test_openssl_hmac(EVP_sha1(), (int)WC_SHA_DIGEST_SIZE), TEST_SUCCESS); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CMAC(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CMAC) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_AES_DIRECT) - EXPECT_DECLS; int i; - byte key[AES_128_KEY_SIZE]; + byte key[AES_256_KEY_SIZE]; CMAC_CTX* cmacCtx = NULL; byte out[AES_BLOCK_SIZE]; size_t outLen = AES_BLOCK_SIZE; - for (i=0; i < AES_128_KEY_SIZE; ++i) { + for (i=0; i < AES_256_KEY_SIZE; ++i) { key[i] = i; } ExpectNotNull(cmacCtx = CMAC_CTX_new()); /* Check CMAC_CTX_get0_cipher_ctx; return value not used. */ ExpectNotNull(CMAC_CTX_get0_cipher_ctx(cmacCtx)); ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_128_KEY_SIZE, EVP_aes_128_cbc(), - NULL), SSL_SUCCESS); + NULL), 1); /* re-using test key as data to hash */ - ExpectIntEQ(CMAC_Update(cmacCtx, key, AES_128_KEY_SIZE), SSL_SUCCESS); - ExpectIntEQ(CMAC_Update(cmacCtx, NULL, 0), SSL_SUCCESS); - ExpectIntEQ(CMAC_Final(cmacCtx, out, &outLen), SSL_SUCCESS); + ExpectIntEQ(CMAC_Update(cmacCtx, key, AES_128_KEY_SIZE), 1); + ExpectIntEQ(CMAC_Update(cmacCtx, NULL, 0), 1); + ExpectIntEQ(CMAC_Final(cmacCtx, out, &outLen), 1); ExpectIntEQ(outLen, AES_BLOCK_SIZE); + + /* No Update works. */ + ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_128_KEY_SIZE, EVP_aes_128_cbc(), + NULL), 1); + ExpectIntEQ(CMAC_Final(cmacCtx, out, NULL), 1); + + ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_128_KEY_SIZE, EVP_aes_128_cbc(), + NULL), 1); + /* Test parameters with CMAC_Update. */ + ExpectIntEQ(CMAC_Update(NULL, NULL, 0), 0); + ExpectIntEQ(CMAC_Update(NULL, key, 0), 0); + ExpectIntEQ(CMAC_Update(NULL, NULL, AES_128_KEY_SIZE), 0); + ExpectIntEQ(CMAC_Update(NULL, key, AES_128_KEY_SIZE), 0); + ExpectIntEQ(CMAC_Update(cmacCtx, key, 0), 1); + ExpectIntEQ(CMAC_Update(cmacCtx, NULL, 0), 1); + ExpectIntEQ(CMAC_Update(cmacCtx, NULL, AES_128_KEY_SIZE), 1); + /* Test parameters with CMAC_Final. */ + ExpectIntEQ(CMAC_Final(NULL, NULL, NULL), 0); + ExpectIntEQ(CMAC_Final(NULL, out, NULL), 0); + ExpectIntEQ(CMAC_Final(NULL, NULL, &outLen), 0); + ExpectIntEQ(CMAC_Final(NULL, out, &outLen), 0); + ExpectIntEQ(CMAC_Final(cmacCtx, NULL, NULL), 1); + ExpectIntEQ(CMAC_Final(cmacCtx, NULL, &outLen), 1); + ExpectIntEQ(CMAC_Final(cmacCtx, out, NULL), 1); CMAC_CTX_free(cmacCtx); - /* give a key too small for the cipher, verify we get failure */ + /* Test parameters with CMAC Init. */ cmacCtx = NULL; ExpectNotNull(cmacCtx = CMAC_CTX_new()); ExpectNotNull(CMAC_CTX_get0_cipher_ctx(cmacCtx)); + ExpectIntEQ(CMAC_Init(NULL, NULL, 0, NULL, NULL), 0); + ExpectIntEQ(CMAC_Init(NULL, key, AES_192_KEY_SIZE, EVP_aes_192_cbc(), + NULL), 0); + ExpectIntEQ(CMAC_Init(cmacCtx, NULL, AES_192_KEY_SIZE, EVP_aes_192_cbc(), + NULL), 0); + /* give a key too small for the cipher, verify we get failure */ ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_128_KEY_SIZE, EVP_aes_192_cbc(), - NULL), SSL_FAILURE); + NULL), 0); + ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_192_KEY_SIZE, NULL, NULL), 0); + #if defined(HAVE_AESGCM) && defined(WOLFSSL_AES_128) + /* Only AES-CBC supported. */ + ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_128_KEY_SIZE, EVP_aes_128_gcm(), + NULL), 0); + #endif CMAC_CTX_free(cmacCtx); - res = EXPECT_RESULT(); + ExpectNull(CMAC_CTX_get0_cipher_ctx(NULL)); + cmacCtx = NULL; + ExpectNotNull(cmacCtx = CMAC_CTX_new()); + /* No Init. */ + ExpectIntEQ(CMAC_Final(cmacCtx, out, &outLen), 0); + CMAC_CTX_free(cmacCtx); + + /* Test AES-256-CBC */ + cmacCtx = NULL; + ExpectNotNull(cmacCtx = CMAC_CTX_new()); + ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_256_KEY_SIZE, EVP_aes_256_cbc(), + NULL), 1); + ExpectIntEQ(CMAC_Update(cmacCtx, key, AES_128_KEY_SIZE), 1); + ExpectIntEQ(CMAC_Final(cmacCtx, out, NULL), 1); + CMAC_CTX_free(cmacCtx); + + /* Test AES-192-CBC */ + cmacCtx = NULL; + ExpectNotNull(cmacCtx = CMAC_CTX_new()); + ExpectIntEQ(CMAC_Init(cmacCtx, key, AES_192_KEY_SIZE, EVP_aes_192_cbc(), + NULL), 1); + ExpectIntEQ(CMAC_Update(cmacCtx, key, AES_128_KEY_SIZE), 1); + ExpectIntEQ(CMAC_Final(cmacCtx, out, NULL), 1); + CMAC_CTX_free(cmacCtx); + + cmacCtx = NULL; + ExpectNotNull(cmacCtx = CMAC_CTX_new()); + CMAC_CTX_free(cmacCtx); #endif /* WOLFSSL_CMAC && OPENSSL_EXTRA && WOLFSSL_AES_DIRECT */ - return res; + return EXPECT_RESULT(); +} + +static int test_wolfSSL_DES(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_DES3) + const_DES_cblock myDes; + DES_cblock iv; + DES_key_schedule key; + word32 i = 0; + DES_LONG dl = 0; + unsigned char msg[] = "hello wolfssl"; + unsigned char weakKey[][8] = { + { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE }, + { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 }, + { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E } + }; + unsigned char semiWeakKey[][8] = { + { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E }, + { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 }, + { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 }, + { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 }, + { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE }, + { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 }, + { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 }, + { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E }, + { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE }, + { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E }, + { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE }, + { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 } + }; + + DES_check_key(1); + DES_set_key(&myDes, &key); + + /* check, check of odd parity */ + XMEMSET(myDes, 4, sizeof(const_DES_cblock)); + myDes[0] = 6; /* set even parity */ + XMEMSET(key, 5, sizeof(DES_key_schedule)); + ExpectIntEQ(DES_set_key_checked(&myDes, &key), -1); + ExpectIntNE(key[0], myDes[0]); /* should not have copied over key */ + ExpectIntEQ(DES_set_key_checked(NULL, NULL), -2); + ExpectIntEQ(DES_set_key_checked(&myDes, NULL), -2); + ExpectIntEQ(DES_set_key_checked(NULL, &key), -2); + + /* set odd parity for success case */ + DES_set_odd_parity(&myDes); + ExpectIntEQ(DES_check_key_parity(&myDes), 1); + fprintf(stderr, "%02x %02x %02x %02x", myDes[0], myDes[1], myDes[2], + myDes[3]); + ExpectIntEQ(DES_set_key_checked(&myDes, &key), 0); + for (i = 0; i < sizeof(DES_key_schedule); i++) { + ExpectIntEQ(key[i], myDes[i]); + } + ExpectIntEQ(DES_is_weak_key(&myDes), 0); + + /* check weak key */ + XMEMSET(myDes, 1, sizeof(const_DES_cblock)); + XMEMSET(key, 5, sizeof(DES_key_schedule)); + ExpectIntEQ(DES_set_key_checked(&myDes, &key), -2); + ExpectIntNE(key[0], myDes[0]); /* should not have copied over key */ + + DES_set_key_unchecked(NULL, NULL); + DES_set_key_unchecked(&myDes, NULL); + DES_set_key_unchecked(NULL, &key); + /* compare arrays, should be the same */ + /* now do unchecked copy of a weak key over */ + DES_set_key_unchecked(&myDes, &key); + /* compare arrays, should be the same */ + for (i = 0; i < sizeof(DES_key_schedule); i++) { + ExpectIntEQ(key[i], myDes[i]); + } + ExpectIntEQ(DES_is_weak_key(&myDes), 1); + + myDes[7] = 2; + ExpectIntEQ(DES_set_key_checked(&myDes, &key), 0); + ExpectIntEQ(DES_is_weak_key(&myDes), 0); + ExpectIntEQ(DES_is_weak_key(NULL), 1); + + /* Test all weak keys. */ + for (i = 0; i < sizeof(weakKey) / sizeof(*weakKey); i++) { + ExpectIntEQ(DES_set_key_checked(&weakKey[i], &key), -2); + } + /* Test all semi-weak keys. */ + for (i = 0; i < sizeof(semiWeakKey) / sizeof(*semiWeakKey); i++) { + ExpectIntEQ(DES_set_key_checked(&semiWeakKey[i], &key), -2); + } + + /* check DES_key_sched API */ + XMEMSET(key, 1, sizeof(DES_key_schedule)); + ExpectIntEQ(DES_key_sched(&myDes, NULL), 0); + ExpectIntEQ(DES_key_sched(NULL, &key), 0); + ExpectIntEQ(DES_key_sched(&myDes, &key), 0); + /* compare arrays, should be the same */ + for (i = 0; i < sizeof(DES_key_schedule); i++) { + ExpectIntEQ(key[i], myDes[i]); + } + + + ExpectIntEQ((DES_cbc_cksum(NULL, NULL, 0, NULL, NULL)), 0); + ExpectIntEQ((DES_cbc_cksum(msg, NULL, 0, NULL, NULL)), 0); + ExpectIntEQ((DES_cbc_cksum(NULL, &key, 0, NULL, NULL)), 0); + ExpectIntEQ((DES_cbc_cksum(NULL, NULL, 0, &myDes, NULL)), 0); + ExpectIntEQ((DES_cbc_cksum(NULL, NULL, 0, NULL, &iv)), 0); + ExpectIntEQ((DES_cbc_cksum(NULL, &key, sizeof(msg), &myDes, &iv)), 0); + ExpectIntEQ((DES_cbc_cksum(msg, NULL, sizeof(msg), &myDes, &iv)), 0); + ExpectIntEQ((DES_cbc_cksum(msg, &key, sizeof(msg), NULL, &iv)), 0); + ExpectIntEQ((DES_cbc_cksum(msg, &key, sizeof(msg), &myDes, NULL)), 0); + /* DES_cbc_cksum should return the last 4 of the last 8 bytes after + * DES_cbc_encrypt on the input */ + XMEMSET(iv, 0, sizeof(DES_cblock)); + XMEMSET(myDes, 5, sizeof(DES_key_schedule)); + ExpectIntGT((dl = DES_cbc_cksum(msg, &key, sizeof(msg), &myDes, &iv)), 0); + ExpectIntEQ(dl, 480052723); +#endif /* defined(OPENSSL_EXTRA) && !defined(NO_DES3) */ + return EXPECT_RESULT(); +} + +static int test_wolfSSL_DES_ncbc(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_DES3) + const_DES_cblock myDes; + DES_cblock iv = {1}; + DES_key_schedule key = {0}; + unsigned char msg[] = "hello wolfssl"; + unsigned char out[DES_BLOCK_SIZE * 2] = {0}; + unsigned char pln[DES_BLOCK_SIZE * 2] = {0}; + + unsigned char exp[] = {0x31, 0x98, 0x2F, 0x3A, 0x55, 0xBF, 0xD8, 0xC4}; + unsigned char exp2[] = {0xC7, 0x45, 0x8B, 0x28, 0x10, 0x53, 0xE0, 0x58}; + + /* partial block test */ + DES_set_key(&key, &myDes); + DES_ncbc_encrypt(msg, out, 3, &myDes, &iv, DES_ENCRYPT); + ExpectIntEQ(XMEMCMP(exp, out, DES_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(exp, iv, DES_BLOCK_SIZE), 0); + + DES_set_key(&key, &myDes); + XMEMSET((byte*)&iv, 0, DES_BLOCK_SIZE); + *((byte*)&iv) = 1; + DES_ncbc_encrypt(out, pln, 3, &myDes, &iv, DES_DECRYPT); + ExpectIntEQ(XMEMCMP(msg, pln, 3), 0); + ExpectIntEQ(XMEMCMP(exp, iv, DES_BLOCK_SIZE), 0); + + /* full block test */ + DES_set_key(&key, &myDes); + XMEMSET(pln, 0, DES_BLOCK_SIZE); + XMEMSET((byte*)&iv, 0, DES_BLOCK_SIZE); + *((byte*)&iv) = 1; + DES_ncbc_encrypt(msg, out, 8, &myDes, &iv, DES_ENCRYPT); + ExpectIntEQ(XMEMCMP(exp2, out, DES_BLOCK_SIZE), 0); + ExpectIntEQ(XMEMCMP(exp2, iv, DES_BLOCK_SIZE), 0); + + DES_set_key(&key, &myDes); + XMEMSET((byte*)&iv, 0, DES_BLOCK_SIZE); + *((byte*)&iv) = 1; + DES_ncbc_encrypt(out, pln, 8, &myDes, &iv, DES_DECRYPT); + ExpectIntEQ(XMEMCMP(msg, pln, 8), 0); + ExpectIntEQ(XMEMCMP(exp2, iv, DES_BLOCK_SIZE), 0); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_DES_ecb_encrypt(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_DES3) && defined(WOLFSSL_DES_ECB) + WOLFSSL_DES_cblock input1, input2, output1, output2, back1, back2; + WOLFSSL_DES_key_schedule key; + + XMEMCPY(key, "12345678", sizeof(WOLFSSL_DES_key_schedule)); + XMEMCPY(input1, "Iamhuman", sizeof(WOLFSSL_DES_cblock)); + XMEMCPY(input2, "Whoisit?", sizeof(WOLFSSL_DES_cblock)); + XMEMSET(output1, 0, sizeof(WOLFSSL_DES_cblock)); + XMEMSET(output2, 0, sizeof(WOLFSSL_DES_cblock)); + XMEMSET(back1, 0, sizeof(WOLFSSL_DES_cblock)); + XMEMSET(back2, 0, sizeof(WOLFSSL_DES_cblock)); + + wolfSSL_DES_ecb_encrypt(NULL, NULL, NULL, DES_ENCRYPT); + wolfSSL_DES_ecb_encrypt(&input1, NULL, NULL, DES_ENCRYPT); + wolfSSL_DES_ecb_encrypt(NULL, &output1, NULL, DES_ENCRYPT); + wolfSSL_DES_ecb_encrypt(NULL, NULL, &key, DES_ENCRYPT); + wolfSSL_DES_ecb_encrypt(&input1, &output1, NULL, DES_ENCRYPT); + wolfSSL_DES_ecb_encrypt(&input1, NULL, &key, DES_ENCRYPT); + wolfSSL_DES_ecb_encrypt(NULL, &output1, &key, DES_ENCRYPT); + + /* Encrypt messages */ + wolfSSL_DES_ecb_encrypt(&input1, &output1, &key, DES_ENCRYPT); + wolfSSL_DES_ecb_encrypt(&input2, &output2, &key, DES_ENCRYPT); + + { + /* Decrypt messages */ + int ret1 = 0; + int ret2 = 0; + wolfSSL_DES_ecb_encrypt(&output1, &back1, &key, DES_DECRYPT); + ExpectIntEQ(ret1 = XMEMCMP((unsigned char *)back1, + (unsigned char *)input1, sizeof(WOLFSSL_DES_cblock)), 0); + wolfSSL_DES_ecb_encrypt(&output2, &back2, &key, DES_DECRYPT); + ExpectIntEQ(ret2 = XMEMCMP((unsigned char *)back2, + (unsigned char *)input2, sizeof(WOLFSSL_DES_cblock)), 0); + } +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_DES_ede3_cbc_encrypt(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_DES3) + unsigned char input1[8], input2[8]; + unsigned char output1[8], output2[8]; + unsigned char back1[8], back2[8]; + WOLFSSL_DES_cblock iv1, iv2; + WOLFSSL_DES_key_schedule key1, key2, key3; + int i; + + XMEMCPY(key1, "12345678", sizeof(WOLFSSL_DES_key_schedule)); + XMEMCPY(key2, "23456781", sizeof(WOLFSSL_DES_key_schedule)); + XMEMCPY(key3, "34567823", sizeof(WOLFSSL_DES_key_schedule)); + XMEMCPY(input1, "Iamhuman", sizeof(input1)); + XMEMCPY(input2, "Whoisit?", sizeof(input2)); + + XMEMSET(output1, 0, sizeof(output1)); + XMEMSET(output2, 0, sizeof(output2)); + XMEMSET(back1, 0, sizeof(back1)); + XMEMSET(back2, 0, sizeof(back2)); + + XMEMCPY(iv1, "87654321", sizeof(WOLFSSL_DES_cblock)); + XMEMCPY(iv2, "98765432", sizeof(WOLFSSL_DES_cblock)); + /* Encrypt messages */ + wolfSSL_DES_ede3_cbc_encrypt(input1, output1, 8, &key1, &key2, &key3, &iv1, + DES_ENCRYPT); + wolfSSL_DES_ede3_cbc_encrypt(input2, output2, 8, &key1, &key2, &key3, &iv2, + DES_ENCRYPT); + + { + XMEMCPY(iv1, "87654321", sizeof(WOLFSSL_DES_cblock)); + XMEMCPY(iv2, "98765432", sizeof(WOLFSSL_DES_cblock)); + /* Decrypt messages */ + wolfSSL_DES_ede3_cbc_encrypt(output1, back1, 8, &key1, &key2, &key3, + &iv1, DES_DECRYPT); + ExpectIntEQ(XMEMCMP(back1, input1, sizeof(input1)), 0); + wolfSSL_DES_ede3_cbc_encrypt(output2, back2, 8, &key1, &key2, &key3, + &iv2, DES_DECRYPT); + ExpectIntEQ(XMEMCMP(back2, input2, sizeof(input2)), 0); + } + + for (i = 0; i < 8; i++) { + XMEMSET(output1, 0, sizeof(output1)); + XMEMSET(output2, 0, sizeof(output2)); + XMEMSET(back1, 0, sizeof(back1)); + XMEMSET(back2, 0, sizeof(back2)); + + XMEMCPY(iv1, "87654321", sizeof(WOLFSSL_DES_cblock)); + XMEMCPY(iv2, "98765432", sizeof(WOLFSSL_DES_cblock)); + /* Encrypt partial messages */ + wolfSSL_DES_ede3_cbc_encrypt(input1, output1, i, &key1, &key2, &key3, + &iv1, DES_ENCRYPT); + wolfSSL_DES_ede3_cbc_encrypt(input2, output2, i, &key1, &key2, &key3, + &iv2, DES_ENCRYPT); + + { + XMEMCPY(iv1, "87654321", sizeof(WOLFSSL_DES_cblock)); + XMEMCPY(iv2, "98765432", sizeof(WOLFSSL_DES_cblock)); + /* Decrypt messages */ + wolfSSL_DES_ede3_cbc_encrypt(output1, back1, i, &key1, &key2, + &key3, &iv1, DES_DECRYPT); + ExpectIntEQ(XMEMCMP(back1, input1, i), 0); + wolfSSL_DES_ede3_cbc_encrypt(output2, back2, i, &key1, &key2, + &key3, &iv2, DES_DECRYPT); + ExpectIntEQ(XMEMCMP(back2, input2, i), 0); + } + } +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_AES_encrypt(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AES_ECB) \ + && !defined(WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API) + AES_KEY enc; + AES_KEY dec; + const byte msg[] = { + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a + }; + const byte exp[] = { + 0xf3, 0xee, 0xd1, 0xbd, 0xb5, 0xd2, 0xa0, 0x3c, + 0x06, 0x4b, 0x5a, 0x7e, 0x3d, 0xb1, 0x81, 0xf8, + }; + const byte key[] = { + 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, + 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, + 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, + 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 + }; + byte eout[sizeof(msg)]; + byte dout[sizeof(msg)]; + + ExpectIntEQ(AES_set_encrypt_key(key, sizeof(key)*8, &enc), 0); + ExpectIntEQ(AES_set_decrypt_key(key, sizeof(key)*8, &dec), 0); + + wolfSSL_AES_encrypt(NULL, NULL, NULL); + wolfSSL_AES_encrypt(msg, NULL, NULL); + wolfSSL_AES_encrypt(NULL, eout, NULL); + wolfSSL_AES_encrypt(NULL, NULL, &enc); + wolfSSL_AES_encrypt(msg, eout, NULL); + wolfSSL_AES_encrypt(msg, NULL, &enc); + wolfSSL_AES_encrypt(NULL, eout, &enc); + + wolfSSL_AES_decrypt(NULL, NULL, NULL); + wolfSSL_AES_decrypt(eout, NULL, NULL); + wolfSSL_AES_decrypt(NULL, dout, NULL); + wolfSSL_AES_decrypt(NULL, NULL, &dec); + wolfSSL_AES_decrypt(eout, dout, NULL); + wolfSSL_AES_decrypt(eout, NULL, &dec); + wolfSSL_AES_decrypt(NULL, dout, &dec); + + wolfSSL_AES_encrypt(msg, eout, &enc); + ExpectIntEQ(XMEMCMP(eout, exp, AES_BLOCK_SIZE), 0); + wolfSSL_AES_decrypt(eout, dout, &dec); + ExpectIntEQ(XMEMCMP(dout, msg, AES_BLOCK_SIZE), 0); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_AES_ecb_encrypt(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AES_ECB) \ + && !defined(WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API) + AES_KEY aes; + const byte msg[] = + { + 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96, + 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a + }; + + const byte verify[] = + { + 0xf3,0xee,0xd1,0xbd,0xb5,0xd2,0xa0,0x3c, + 0x06,0x4b,0x5a,0x7e,0x3d,0xb1,0x81,0xf8 + }; + + const byte key[] = + { + 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe, + 0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, + 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7, + 0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4 + }; + + + byte out[AES_BLOCK_SIZE]; + + ExpectIntEQ(AES_set_encrypt_key(key, sizeof(key)*8, &aes), 0); + XMEMSET(out, 0, AES_BLOCK_SIZE); + AES_ecb_encrypt(msg, out, &aes, AES_ENCRYPT); + ExpectIntEQ(XMEMCMP(out, verify, AES_BLOCK_SIZE), 0); + +#ifdef HAVE_AES_DECRYPT + ExpectIntEQ(AES_set_decrypt_key(key, sizeof(key)*8, &aes), 0); + XMEMSET(out, 0, AES_BLOCK_SIZE); + AES_ecb_encrypt(verify, out, &aes, AES_DECRYPT); + ExpectIntEQ(XMEMCMP(out, msg, AES_BLOCK_SIZE), 0); +#endif + + /* test bad arguments */ + AES_ecb_encrypt(NULL, out, &aes, AES_DECRYPT); + AES_ecb_encrypt(verify, NULL, &aes, AES_DECRYPT); + AES_ecb_encrypt(verify, out, NULL, AES_DECRYPT); +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_AES_cbc_encrypt(void) +{ + EXPECT_DECLS; +#if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(OPENSSL_EXTRA) && \ + !defined(WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API) + AES_KEY aes; + AES_KEY* aesN = NULL; + size_t len = 0; + size_t lenB = 0; + int keySz0 = 0; + int keySzN = -1; + byte out[AES_BLOCK_SIZE] = {0}; + byte* outN = NULL; + + /* Test vectors retrieved from: + * + * https://csrc.nist.gov/ + * CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/ + * documents/aes/KAT_AES.zip + * + */ + const byte* pt128N = NULL; + byte* key128N = NULL; + byte* iv128N = NULL; + byte iv128tmp[AES_BLOCK_SIZE] = {0}; + + const byte pt128[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; + + const byte ct128[] = { 0x87,0x85,0xb1,0xa7,0x5b,0x0f,0x3b,0xd9, + 0x58,0xdc,0xd0,0xe2,0x93,0x18,0xc5,0x21 }; + + const byte iv128[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; + + byte key128[] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00 }; + + + len = sizeof(pt128); + + #define STRESS_T(a, b, c, d, e, f, g, h, i) \ + wolfSSL_AES_cbc_encrypt(a, b, c, d, e, f); \ + ExpectIntNE(XMEMCMP(b, g, h), i) + + #define RESET_IV(x, y) XMEMCPY(x, y, AES_BLOCK_SIZE) + + /* Stressing wolfSSL_AES_cbc_encrypt() */ + STRESS_T(pt128N, out, len, &aes, iv128tmp, 1, ct128, AES_BLOCK_SIZE, 0); + STRESS_T(pt128, out, len, &aes, iv128N, 1, ct128, AES_BLOCK_SIZE, 0); + + wolfSSL_AES_cbc_encrypt(pt128, outN, len, &aes, iv128tmp, AES_ENCRYPT); + ExpectIntNE(XMEMCMP(out, ct128, AES_BLOCK_SIZE), 0); + wolfSSL_AES_cbc_encrypt(pt128, out, len, aesN, iv128tmp, AES_ENCRYPT); + ExpectIntNE(XMEMCMP(out, ct128, AES_BLOCK_SIZE), 0); + + STRESS_T(pt128, out, lenB, &aes, iv128tmp, 1, ct128, AES_BLOCK_SIZE, 0); + + /* Stressing wolfSSL_AES_set_encrypt_key */ + ExpectIntNE(wolfSSL_AES_set_encrypt_key(key128N, sizeof(key128)*8, &aes),0); + ExpectIntNE(wolfSSL_AES_set_encrypt_key(key128, sizeof(key128)*8, aesN),0); + ExpectIntNE(wolfSSL_AES_set_encrypt_key(key128, keySz0, &aes), 0); + ExpectIntNE(wolfSSL_AES_set_encrypt_key(key128, keySzN, &aes), 0); + + /* Stressing wolfSSL_AES_set_decrypt_key */ + ExpectIntNE(wolfSSL_AES_set_decrypt_key(key128N, sizeof(key128)*8, &aes),0); + ExpectIntNE(wolfSSL_AES_set_decrypt_key(key128N, sizeof(key128)*8, aesN),0); + ExpectIntNE(wolfSSL_AES_set_decrypt_key(key128, keySz0, &aes), 0); + ExpectIntNE(wolfSSL_AES_set_decrypt_key(key128, keySzN, &aes), 0); + + #ifdef WOLFSSL_AES_128 + + /* wolfSSL_AES_cbc_encrypt() 128-bit */ + XMEMSET(out, 0, AES_BLOCK_SIZE); + RESET_IV(iv128tmp, iv128); + + ExpectIntEQ(wolfSSL_AES_set_encrypt_key(key128, sizeof(key128)*8, &aes), 0); + wolfSSL_AES_cbc_encrypt(pt128, out, len, &aes, iv128tmp, AES_ENCRYPT); + ExpectIntEQ(XMEMCMP(out, ct128, AES_BLOCK_SIZE), 0); + wc_AesFree((Aes*)&aes); + + #ifdef HAVE_AES_DECRYPT + + /* wolfSSL_AES_cbc_encrypt() 128-bit in decrypt mode */ + XMEMSET(out, 0, AES_BLOCK_SIZE); + RESET_IV(iv128tmp, iv128); + len = sizeof(ct128); + + ExpectIntEQ(wolfSSL_AES_set_decrypt_key(key128, sizeof(key128)*8, &aes), 0); + wolfSSL_AES_cbc_encrypt(ct128, out, len, &aes, iv128tmp, AES_DECRYPT); + ExpectIntEQ(XMEMCMP(out, pt128, AES_BLOCK_SIZE), 0); + wc_AesFree((Aes*)&aes); + + #endif + + #endif /* WOLFSSL_AES_128 */ + #ifdef WOLFSSL_AES_192 + { + /* Test vectors from NIST Special Publication 800-38A, 2001 Edition + * Appendix F.2.3 */ + + byte iv192tmp[AES_BLOCK_SIZE] = {0}; + + const byte pt192[] = { 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96, + 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a }; + + const byte ct192[] = { 0x4f,0x02,0x1d,0xb2,0x43,0xbc,0x63,0x3d, + 0x71,0x78,0x18,0x3a,0x9f,0xa0,0x71,0xe8 }; + + const byte iv192[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; + + byte key192[] = { 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52, + 0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, + 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b }; + + len = sizeof(pt192); + + /* wolfSSL_AES_cbc_encrypt() 192-bit */ + XMEMSET(out, 0, AES_BLOCK_SIZE); + RESET_IV(iv192tmp, iv192); + + ExpectIntEQ(wolfSSL_AES_set_encrypt_key(key192, sizeof(key192)*8, &aes), 0); + wolfSSL_AES_cbc_encrypt(pt192, out, len, &aes, iv192tmp, AES_ENCRYPT); + ExpectIntEQ(XMEMCMP(out, ct192, AES_BLOCK_SIZE), 0); + wc_AesFree((Aes*)&aes); + + #ifdef HAVE_AES_DECRYPT + + /* wolfSSL_AES_cbc_encrypt() 192-bit in decrypt mode */ + len = sizeof(ct192); + RESET_IV(iv192tmp, iv192); + XMEMSET(out, 0, AES_BLOCK_SIZE); + + ExpectIntEQ(wolfSSL_AES_set_decrypt_key(key192, sizeof(key192)*8, &aes), 0); + wolfSSL_AES_cbc_encrypt(ct192, out, len, &aes, iv192tmp, AES_DECRYPT); + ExpectIntEQ(XMEMCMP(out, pt192, AES_BLOCK_SIZE), 0); + wc_AesFree((Aes*)&aes); + + #endif + } + #endif /* WOLFSSL_AES_192 */ + #ifdef WOLFSSL_AES_256 + { + /* Test vectors from NIST Special Publication 800-38A, 2001 Edition, + * Appendix F.2.5 */ + byte iv256tmp[AES_BLOCK_SIZE] = {0}; + + const byte pt256[] = { 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96, + 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a }; + + const byte ct256[] = { 0xf5,0x8c,0x4c,0x04,0xd6,0xe5,0xf1,0xba, + 0x77,0x9e,0xab,0xfb,0x5f,0x7b,0xfb,0xd6 }; + + const byte iv256[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; + + byte key256[] = { 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe, + 0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, + 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7, + 0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4 }; + + + len = sizeof(pt256); + + /* wolfSSL_AES_cbc_encrypt() 256-bit */ + XMEMSET(out, 0, AES_BLOCK_SIZE); + RESET_IV(iv256tmp, iv256); + + ExpectIntEQ(wolfSSL_AES_set_encrypt_key(key256, sizeof(key256)*8, &aes), 0); + wolfSSL_AES_cbc_encrypt(pt256, out, len, &aes, iv256tmp, AES_ENCRYPT); + ExpectIntEQ(XMEMCMP(out, ct256, AES_BLOCK_SIZE), 0); + wc_AesFree((Aes*)&aes); + + #ifdef HAVE_AES_DECRYPT + + /* wolfSSL_AES_cbc_encrypt() 256-bit in decrypt mode */ + len = sizeof(ct256); + RESET_IV(iv256tmp, iv256); + XMEMSET(out, 0, AES_BLOCK_SIZE); + + ExpectIntEQ(wolfSSL_AES_set_decrypt_key(key256, sizeof(key256)*8, &aes), 0); + wolfSSL_AES_cbc_encrypt(ct256, out, len, &aes, iv256tmp, AES_DECRYPT); + ExpectIntEQ(XMEMCMP(out, pt256, AES_BLOCK_SIZE), 0); + wc_AesFree((Aes*)&aes); + + #endif + + #if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && \ + !defined(HAVE_SELFTEST) + { + byte wrapCipher[sizeof(key256) + KEYWRAP_BLOCK_SIZE] = { 0 }; + byte wrapPlain[sizeof(key256)] = { 0 }; + byte wrapIV[KEYWRAP_BLOCK_SIZE] = { 0 }; + + /* wolfSSL_AES_wrap_key() 256-bit NULL iv */ + ExpectIntEQ(wolfSSL_AES_set_encrypt_key(key256, sizeof(key256)*8, &aes), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, NULL, wrapCipher, key256, + 15), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, NULL, wrapCipher, key256, + sizeof(key256)), sizeof(wrapCipher)); + wc_AesFree((Aes*)&aes); + + /* wolfSSL_AES_unwrap_key() 256-bit NULL iv */ + ExpectIntEQ(wolfSSL_AES_set_decrypt_key(key256, sizeof(key256)*8, &aes), 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(&aes, NULL, wrapPlain, wrapCipher, + 23), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_AES_unwrap_key(&aes, NULL, wrapPlain, wrapCipher, + sizeof(wrapCipher)), sizeof(wrapPlain)); + ExpectIntEQ(XMEMCMP(wrapPlain, key256, sizeof(key256)), 0); + XMEMSET(wrapCipher, 0, sizeof(wrapCipher)); + XMEMSET(wrapPlain, 0, sizeof(wrapPlain)); + wc_AesFree((Aes*)&aes); + + /* wolfSSL_AES_wrap_key() 256-bit custom iv */ + ExpectIntEQ(wolfSSL_AES_set_encrypt_key(key256, sizeof(key256)*8, &aes), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, wrapIV, wrapCipher, key256, + sizeof(key256)), sizeof(wrapCipher)); + wc_AesFree((Aes*)&aes); + + /* wolfSSL_AES_unwrap_key() 256-bit custom iv */ + ExpectIntEQ(wolfSSL_AES_set_decrypt_key(key256, sizeof(key256)*8, &aes), 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(&aes, wrapIV, wrapPlain, wrapCipher, + sizeof(wrapCipher)), sizeof(wrapPlain)); + ExpectIntEQ(XMEMCMP(wrapPlain, key256, sizeof(key256)), 0); + wc_AesFree((Aes*)&aes); + + ExpectIntEQ(wolfSSL_AES_wrap_key(NULL, NULL, NULL, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, NULL, NULL, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(NULL, wrapIV, NULL, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(NULL, NULL, wrapCipher, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(NULL, NULL, NULL, key256, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(NULL, wrapIV, wrapCipher, key256, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, NULL, wrapCipher, key256, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, wrapIV, NULL, key256, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, wrapIV, wrapCipher, NULL, 0), 0); + + ExpectIntEQ(wolfSSL_AES_unwrap_key(NULL, NULL, NULL, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(&aes, NULL, NULL, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(NULL, wrapIV, NULL, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(NULL, NULL, wrapPlain, NULL, 0), 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(NULL, NULL, NULL, wrapCipher, 0), 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(NULL, wrapIV, wrapPlain, wrapCipher, 0), + 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(&aes, NULL, wrapPlain, wrapCipher, 0), + 0); + ExpectIntEQ(wolfSSL_AES_unwrap_key(&aes, wrapIV, NULL, wrapCipher, 0), 0); + ExpectIntEQ(wolfSSL_AES_wrap_key(&aes, wrapIV, wrapPlain, NULL, 0), 0); + } + #endif /* HAVE_AES_KEYWRAP */ + } + #endif /* WOLFSSL_AES_256 */ +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_AES_cfb128_encrypt(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(WOLFSSL_AES_CFB) && \ + !defined(WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API) + AES_KEY aesEnc; + AES_KEY aesDec; + const byte msg[] = { + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a + }; + const byte exp[] = { + 0x16, 0xc9, 0x90, 0x6c, 0x04, 0x0c, 0xd1, 0x2f, + 0x84, 0x7b, 0x18, 0xed, 0xed, 0x6a, 0xb5, 0xfd + }; + const byte key[] = { + 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, + 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, + 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, + 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 + }; + const byte ivData[] = { + 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, + 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, + }; + byte out[AES_BLOCK_SIZE]; + byte iv[AES_BLOCK_SIZE]; + word32 i; + int num; + + ExpectIntEQ(AES_set_encrypt_key(key, sizeof(key)*8, &aesEnc), 0); + XMEMCPY(iv, ivData, sizeof(iv)); + XMEMSET(out, 0, AES_BLOCK_SIZE); + AES_cfb128_encrypt(msg, out, sizeof(msg), &aesEnc, iv, NULL, AES_ENCRYPT); + ExpectIntEQ(XMEMCMP(out, exp, sizeof(msg)), 0); + ExpectIntNE(XMEMCMP(iv, ivData, sizeof(iv)), 0); + +#ifdef HAVE_AES_DECRYPT + ExpectIntEQ(AES_set_encrypt_key(key, sizeof(key)*8, &aesDec), 0); + XMEMCPY(iv, ivData, sizeof(iv)); + XMEMSET(out, 0, AES_BLOCK_SIZE); + AES_cfb128_encrypt(exp, out, sizeof(msg), &aesDec, iv, NULL, AES_DECRYPT); + ExpectIntEQ(XMEMCMP(out, msg, sizeof(msg)), 0); + ExpectIntNE(XMEMCMP(iv, ivData, sizeof(iv)), 0); +#endif + + for (i = 0; EXPECT_SUCCESS() && (i <= sizeof(msg)); i++) { + ExpectIntEQ(AES_set_encrypt_key(key, sizeof(key)*8, &aesEnc), 0); + XMEMCPY(iv, ivData, sizeof(iv)); + XMEMSET(out, 0, AES_BLOCK_SIZE); + AES_cfb128_encrypt(msg, out, i, &aesEnc, iv, &num, AES_ENCRYPT); + ExpectIntEQ(num, i % AES_BLOCK_SIZE); + ExpectIntEQ(XMEMCMP(out, exp, i), 0); + if (i == 0) { + ExpectIntEQ(XMEMCMP(iv, ivData, sizeof(iv)), 0); + } + else { + ExpectIntNE(XMEMCMP(iv, ivData, sizeof(iv)), 0); + } + + #ifdef HAVE_AES_DECRYPT + ExpectIntEQ(AES_set_encrypt_key(key, sizeof(key)*8, &aesDec), 0); + XMEMCPY(iv, ivData, sizeof(iv)); + XMEMSET(out, 0, AES_BLOCK_SIZE); + AES_cfb128_encrypt(exp, out, i, &aesDec, iv, &num, AES_DECRYPT); + ExpectIntEQ(num, i % AES_BLOCK_SIZE); + ExpectIntEQ(XMEMCMP(out, msg, i), 0); + if (i == 0) { + ExpectIntEQ(XMEMCMP(iv, ivData, sizeof(iv)), 0); + } + else { + ExpectIntNE(XMEMCMP(iv, ivData, sizeof(iv)), 0); + } + #endif + } + + if (EXPECT_SUCCESS()) { + /* test bad arguments */ + AES_cfb128_encrypt(NULL, NULL, 0, NULL, NULL, NULL, AES_DECRYPT); + AES_cfb128_encrypt(msg, NULL, 0, NULL, NULL, NULL, AES_DECRYPT); + AES_cfb128_encrypt(NULL, out, 0, NULL, NULL, NULL, AES_DECRYPT); + AES_cfb128_encrypt(NULL, NULL, 0, &aesDec, NULL, NULL, AES_DECRYPT); + AES_cfb128_encrypt(NULL, NULL, 0, NULL, iv, NULL, AES_DECRYPT); + AES_cfb128_encrypt(NULL, out, 0, &aesDec, iv, NULL, AES_DECRYPT); + AES_cfb128_encrypt(msg, NULL, 0, &aesDec, iv, NULL, AES_DECRYPT); + AES_cfb128_encrypt(msg, out, 0, NULL, iv, NULL, AES_DECRYPT); + AES_cfb128_encrypt(msg, out, 0, &aesDec, NULL, NULL, AES_DECRYPT); + } +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_CRYPTO_cts128(void) +{ + EXPECT_DECLS; +#if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(OPENSSL_EXTRA) && \ + defined(HAVE_CTS) && !defined(WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API) + byte tmp[64]; /* Largest vector size */ + /* Test vectors taken form RFC3962 Appendix B */ + const testVector vects[] = { + { + "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" + "\x20", + "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4\xd8\xa5\x80\x36\x2d\xa7\xff\x7f" + "\x97", + 17, 17 + }, + { + "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" + "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20", + "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1\xd4\x45\xd4\xc8\xef\xf7\xed\x22" + "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5", + 31, 31 + }, + { + "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" + "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43", + "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8" + "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84", + 32, 32 + }, + { + "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" + "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43" + "\x68\x69\x63\x6b\x65\x6e\x2c\x20\x70\x6c\x65\x61\x73\x65\x2c", + "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" + "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c\x1b\x55\x49\xd2\xf8\x38\x02\x9e" + "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5", + 47, 47 + }, + { + "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" + "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43" + "\x68\x69\x63\x6b\x65\x6e\x2c\x20\x70\x6c\x65\x61\x73\x65\x2c\x20", + "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" + "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8" + "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8", + 48, 48 + }, + { + "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" + "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43" + "\x68\x69\x63\x6b\x65\x6e\x2c\x20\x70\x6c\x65\x61\x73\x65\x2c\x20" + "\x61\x6e\x64\x20\x77\x6f\x6e\x74\x6f\x6e\x20\x73\x6f\x75\x70\x2e", + "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" + "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8" + "\x48\x07\xef\xe8\x36\xee\x89\xa5\x26\x73\x0d\xbc\x2f\x7b\xc8\x40" + "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8", + 64, 64 + } + }; + byte keyBytes[AES_128_KEY_SIZE] = { + 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20, + 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69 + }; + size_t i; + AES_KEY encKey; + byte iv[AES_IV_SIZE]; /* All-zero IV for all cases */ + + XMEMSET(tmp, 0, sizeof(tmp)); + + for (i = 0; i < sizeof(vects)/sizeof(vects[0]); i++) { + AES_KEY decKey; + + ExpectIntEQ(AES_set_encrypt_key(keyBytes, AES_128_KEY_SIZE * 8, + &encKey), 0); + ExpectIntEQ(AES_set_decrypt_key(keyBytes, AES_128_KEY_SIZE * 8, + &decKey), 0); + XMEMSET(iv, 0, sizeof(iv)); + ExpectIntEQ(CRYPTO_cts128_encrypt((const unsigned char*)vects[i].input, + tmp, vects[i].inLen, &encKey, iv, (cbc128_f)AES_cbc_encrypt), + vects[i].outLen); + ExpectIntEQ(XMEMCMP(tmp, vects[i].output, vects[i].outLen), 0); + XMEMSET(iv, 0, sizeof(iv)); + ExpectIntEQ(CRYPTO_cts128_decrypt((const unsigned char*)vects[i].output, + tmp, vects[i].outLen, &decKey, iv, (cbc128_f)AES_cbc_encrypt), + vects[i].inLen); + ExpectIntEQ(XMEMCMP(tmp, vects[i].input, vects[i].inLen), 0); + } + + ExpectIntEQ(CRYPTO_cts128_encrypt(NULL, NULL, 17, NULL, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(tmp, NULL, 17, NULL, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(NULL, tmp, 17, NULL, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(NULL, NULL, 17, &encKey, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(NULL, NULL, 17, NULL, iv, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(NULL, NULL, 17, NULL, NULL, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(NULL, tmp, 17, &encKey, iv, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(tmp, NULL, 17, &encKey, iv, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(tmp, tmp, 17, NULL, iv, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(tmp, tmp, 17, &encKey, NULL, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_encrypt(tmp, tmp, 17, &encKey, iv, NULL), 0); + /* Length too small. */ + ExpectIntEQ(CRYPTO_cts128_encrypt(tmp, tmp, 0, &encKey, iv, + (cbc128_f)AES_cbc_encrypt), 0); + + ExpectIntEQ(CRYPTO_cts128_decrypt(NULL, NULL, 17, NULL, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(tmp, NULL, 17, NULL, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(NULL, tmp, 17, NULL, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(NULL, NULL, 17, &encKey, NULL, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(NULL, NULL, 17, NULL, iv, NULL), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(NULL, NULL, 17, NULL, NULL, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(NULL, tmp, 17, &encKey, iv, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(tmp, NULL, 17, &encKey, iv, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(tmp, tmp, 17, NULL, iv, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(tmp, tmp, 17, &encKey, NULL, + (cbc128_f)AES_cbc_encrypt), 0); + ExpectIntEQ(CRYPTO_cts128_decrypt(tmp, tmp, 17, &encKey, iv, NULL), 0); + /* Length too small. */ + ExpectIntEQ(CRYPTO_cts128_decrypt(tmp, tmp, 0, &encKey, iv, + (cbc128_f)AES_cbc_encrypt), 0); +#endif /* !NO_AES && HAVE_AES_CBC && OPENSSL_EXTRA && HAVE_CTS */ + return EXPECT_RESULT(); } +static int test_wolfSSL_RC4(void) +{ + EXPECT_DECLS; +#if !defined(NO_RC4) && defined(OPENSSL_EXTRA) + WOLFSSL_RC4_KEY rc4Key; + unsigned char key[] = { + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + }; + unsigned char data[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + }; + unsigned char enc[sizeof(data)]; + unsigned char dec[sizeof(data)]; + word32 i; + word32 j; + + wolfSSL_RC4_set_key(NULL, -1, NULL); + wolfSSL_RC4_set_key(&rc4Key, -1, NULL); + wolfSSL_RC4_set_key(NULL, 0, NULL); + wolfSSL_RC4_set_key(NULL, -1, key); + wolfSSL_RC4_set_key(&rc4Key, 0, NULL); + wolfSSL_RC4_set_key(&rc4Key, -1, key); + wolfSSL_RC4_set_key(NULL, 0, key); + + wolfSSL_RC4(NULL, 0, NULL, NULL); + wolfSSL_RC4(&rc4Key, 0, NULL, NULL); + wolfSSL_RC4(NULL, 0, data, NULL); + wolfSSL_RC4(NULL, 0, NULL, enc); + wolfSSL_RC4(&rc4Key, 0, data, NULL); + wolfSSL_RC4(&rc4Key, 0, NULL, enc); + wolfSSL_RC4(NULL, 0, data, enc); + + ExpectIntEQ(1, 1); + for (i = 0; EXPECT_SUCCESS() && (i <= sizeof(key)); i++) { + for (j = 0; EXPECT_SUCCESS() && (j <= sizeof(data)); j++) { + XMEMSET(enc, 0, sizeof(enc)); + XMEMSET(dec, 0, sizeof(dec)); + + /* Encrypt */ + wolfSSL_RC4_set_key(&rc4Key, (int)i, key); + wolfSSL_RC4(&rc4Key, j, data, enc); + /* Decrypt */ + wolfSSL_RC4_set_key(&rc4Key, (int)i, key); + wolfSSL_RC4(&rc4Key, j, enc, dec); + + ExpectIntEQ(XMEMCMP(dec, data, j), 0); + } + } +#endif + return EXPECT_RESULT(); +} static int test_wolfSSL_OBJ(void) { /* Password "wolfSSL test" is only 12 (96-bit) too short for testing in FIPS * mode */ - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && !defined(NO_ASN) && \ !defined(HAVE_FIPS) && !defined(NO_SHA) && defined(WOLFSSL_CERT_EXT) && \ - defined(WOLFSSL_CERT_GEN) && !defined(NO_BIO) - EXPECT_DECLS; + defined(WOLFSSL_CERT_GEN) && !defined(NO_BIO) && \ + !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) ASN1_OBJECT *obj = NULL; ASN1_OBJECT *obj2 = NULL; char buf[50]; @@ -44266,17 +55576,14 @@ } } #endif /* HAVE_PKCS12 */ - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OBJ_cmp(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) ASN1_OBJECT *obj = NULL; ASN1_OBJECT *obj2 = NULL; @@ -44292,17 +55599,15 @@ ASN1_OBJECT_free(obj); ASN1_OBJECT_free(obj2); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OBJ_txt2nid(void) { - int res = TEST_SKIPPED; -#if !defined(NO_WOLFSSL_STUB) && defined(WOLFSSL_APACHE_HTTPD) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ + defined(WOLFSSL_APACHE_HTTPD) int i; static const struct { const char* sn; @@ -44310,11 +55615,13 @@ const char* oid; int nid; } testVals[] = { +#ifdef WOLFSSL_APACHE_HTTPD { "tlsfeature", "TLS Feature", "1.3.6.1.5.5.7.1.24", NID_tlsfeature }, { "id-on-dnsSRV", "SRVName", "1.3.6.1.5.5.7.8.7", NID_id_on_dnsSRV }, { "msUPN", "Microsoft User Principal Name", "1.3.6.1.4.1.311.20.2.3", NID_ms_upn }, +#endif { NULL, NULL, NULL, NID_undef } }; @@ -44328,18 +55635,15 @@ ExpectIntEQ(OBJ_txt2nid(testVals[i].ln), testVals[i].nid); ExpectIntEQ(OBJ_txt2nid(testVals[i].oid), testVals[i].nid); } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OBJ_txt2obj(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_APACHE_HTTPD) || (defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN)) - EXPECT_DECLS; int i; char buf[50]; ASN1_OBJECT* obj = NULL; @@ -44413,20 +55717,17 @@ ASN1_OBJECT_free(obj); obj = NULL; } - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_write_bio_X509(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(OPENSSL_ALL) && \ defined(WOLFSSL_AKID_NAME) && defined(WOLFSSL_CERT_EXT) && \ defined(WOLFSSL_CERT_GEN) && !defined(NO_BIO) && !defined(NO_RSA) && \ !defined(NO_FILESYSTEM) - EXPECT_DECLS; /* This test contains the hard coded expected * lengths. Update if necessary */ XFILE fp = XBADFILE; @@ -44565,18 +55866,15 @@ X509_free(x509b); BIO_free(input); BIO_free(output); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_NAME_ENTRY(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) && defined(WOLFSSL_CERT_GEN) - EXPECT_DECLS; X509* x509 = NULL; #ifndef NO_BIO BIO* bio = NULL; @@ -44647,6 +55945,7 @@ ExpectNotNull(subject = X509_NAME_oneline(nm, 0, 0)); ExpectNotNull(XSTRSTR(subject, "favouriteDrink=tequila")); + ExpectNotNull(XSTRSTR(subject, "contentType=Server")); #ifdef DEBUG_WOLFSSL if (subject != NULL) { fprintf(stderr, "\n\t%s\n", subject); @@ -44685,25 +55984,21 @@ BIO_free(bio); #endif X509_free(x509); /* free's nm */ - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } -/* Note the lack of wolfSSL_ prefix...this is a compatability layer test. */ +/* Note the lack of wolfSSL_ prefix...this is a compatibility layer test. */ static int test_GENERAL_NAME_set0_othername(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) && \ defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ALT_NAMES) && \ - defined(WOLFSSL_CERT_EXT) && !defined(NO_FILESYSTEM) && \ + defined(WOLFSSL_CERT_EXT) && !defined(NO_FILESYSTEM) && \ defined(WOLFSSL_FPKI) /* ./configure --enable-opensslall --enable-certgen --enable-certreq * --enable-certext --enable-debug 'CPPFLAGS=-DWOLFSSL_CUSTOM_OID * -DWOLFSSL_ALT_NAMES -DWOLFSSL_FPKI' */ - - EXPECT_DECLS; const char * cert_fname = "./certs/server-cert.der"; const char * key_fname = "./certs/server-key.der"; X509* x509 = NULL; @@ -44773,26 +56068,21 @@ X509_EXTENSION_free(ext); X509_free(x509); EVP_PKEY_free(priv); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } -/* Note the lack of wolfSSL_ prefix...this is a compatability layer test. */ +/* Note the lack of wolfSSL_ prefix...this is a compatibility layer test. */ static int test_othername_and_SID_ext(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) && \ defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ALT_NAMES) && \ defined(WOLFSSL_CERT_EXT) && !defined(NO_FILESYSTEM) && \ defined(WOLFSSL_FPKI) && defined(WOLFSSL_ASN_TEMPLATE) - /* ./configure --enable-opensslall --enable-certgen --enable-certreq * --enable-certext --enable-debug 'CPPFLAGS=-DWOLFSSL_CUSTOM_OID * -DWOLFSSL_ALT_NAMES -DWOLFSSL_FPKI' */ - - EXPECT_DECLS; const char* csr_fname = "./certs/csr.signed.der"; const char* key_fname = "./certs/server-key.der"; @@ -44813,13 +56103,13 @@ /* SID extension. SID data format explained here: * https://blog.qdsecurity.se/2022/05/27/manually-injecting-a-sid-in-a-certificate/ */ - uint8_t SidExtension[] = { + byte SidExtension[] = { 48, 64, 160, 62, 6, 10, 43, 6, 1, 4, 1, 130, 55, 25, 2, 1, 160, 48, 4, 46, 83, 45, 49, 45, 53, 45, 50, 49, 45, 50, 56, 52, 51, 57, 48, 55, 52, 49, 56, 45, 51, 57, 50, 54, 50, 55, 55, 52, 50, 49, 45, 51, 56, 49, 53, 57, 57, 51, 57, 55, 50, 45, 52, 54, 48, 49}; - uint8_t expectedAltName[] = { + byte expectedAltName[] = { 0x30, 0x27, 0xA0, 0x25, 0x06, 0x0A, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x14, 0x02, 0x03, 0xA0, 0x17, 0x0C, 0x15, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x6E, 0x61, 0x6D, 0x65, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, @@ -44938,17 +56228,15 @@ sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); X509_REQ_free(x509); - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_set_name(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) - EXPECT_DECLS; X509* x509 = NULL; X509_NAME* name = NULL; @@ -44973,22 +56261,19 @@ X509_free(x509); X509_NAME_free(name); - - res = EXPECT_RESULT(); #endif /* OPENSSL_ALL && !NO_CERTS */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_set_notAfter(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) \ && !defined(NO_ASN_TIME) && !defined(USER_TIME) && \ !defined(TIME_OVERRIDES) && !defined(NO_CERTS) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) &&\ !defined(TIME_T_NOT_64BIT) && !defined(NO_64BIT) && !defined(NO_BIO) /* Generalized time will overflow time_t if not long */ - EXPECT_DECLS; X509* x = NULL; BIO* bio = NULL; ASN1_TIME *asn_time = NULL; @@ -45036,20 +56321,17 @@ XFREE(asn_time, NULL, DYNAMIC_TYPE_OPENSSL); X509_free(x); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_set_notBefore(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) \ && !defined(NO_ASN_TIME) && !defined(USER_TIME) && \ !defined(TIME_OVERRIDES) && !defined(NO_CERTS) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) && !defined(NO_BIO) - EXPECT_DECLS; X509* x = NULL; BIO* bio = NULL; ASN1_TIME *asn_time = NULL; @@ -45100,18 +56382,15 @@ XFREE(asn_time, NULL, DYNAMIC_TYPE_OPENSSL); X509_free(x); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_set_version(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_APACHE_HTTPD)) && \ !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) - EXPECT_DECLS; X509* x509 = NULL; long v = 2L; long maxInt = INT_MAX; @@ -45129,27 +56408,32 @@ /* Cleanup */ X509_free(x509); - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_BIO_gets(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) BIO* bio = NULL; BIO* bio2 = NULL; char msg[] = "\nhello wolfSSL\n security plus\t---...**adf\na...b.c"; char emp[] = ""; char bio_buffer[20]; int bufferSz = 20; +#ifdef OPENSSL_ALL + BUF_MEM* emp_bm = NULL; + BUF_MEM* msg_bm = NULL; +#endif /* try with bad args */ ExpectNull(bio = BIO_new_mem_buf(NULL, sizeof(msg))); +#ifdef OPENSSL_ALL + ExpectIntEQ(BIO_set_mem_buf(bio, NULL, BIO_NOCLOSE), BAD_FUNC_ARG); +#endif /* try with real msg */ ExpectNotNull(bio = BIO_new_mem_buf((void*)msg, -1)); @@ -45171,6 +56455,49 @@ ExpectIntEQ(BIO_gets(bio, bio_buffer, bufferSz), 8); ExpectIntEQ(BIO_gets(bio, bio_buffer, -1), 0); +#ifdef OPENSSL_ALL + /* test setting the mem_buf manually */ + BIO_free(bio); + ExpectNotNull(bio = BIO_new_mem_buf((void*)msg, -1)); + ExpectNotNull(emp_bm = BUF_MEM_new()); + ExpectNotNull(msg_bm = BUF_MEM_new()); + ExpectIntEQ(BUF_MEM_grow(msg_bm, sizeof(msg)), sizeof(msg)); + if (EXPECT_SUCCESS()) { + XFREE(msg_bm->data, NULL, DYNAMIC_TYPE_OPENSSL); + msg_bm->data = NULL; + } + /* emp size is 1 for terminator */ + ExpectIntEQ(BUF_MEM_grow(emp_bm, sizeof(emp)), sizeof(emp)); + if (EXPECT_SUCCESS()) { + XFREE(emp_bm->data, NULL, DYNAMIC_TYPE_OPENSSL); + emp_bm->data = emp; + msg_bm->data = msg; + } + ExpectIntEQ(BIO_set_mem_buf(bio, emp_bm, BIO_CLOSE), WOLFSSL_SUCCESS); + + /* check reading an empty string */ + ExpectIntEQ(BIO_gets(bio, bio_buffer, bufferSz), 1); /* just terminator */ + ExpectStrEQ(emp, bio_buffer); + ExpectIntEQ(BIO_gets(bio, bio_buffer, bufferSz), 0); /* Nothing to read */ + + /* BIO_gets reads a line of data */ + ExpectIntEQ(BIO_set_mem_buf(bio, msg_bm, BIO_NOCLOSE), WOLFSSL_SUCCESS); + ExpectIntEQ(BIO_gets(bio, bio_buffer, -3), 0); + ExpectIntEQ(BIO_gets(bio, bio_buffer, bufferSz), 1); + ExpectIntEQ(BIO_gets(bio, bio_buffer, bufferSz), 14); + ExpectStrEQ(bio_buffer, "hello wolfSSL\n"); + ExpectIntEQ(BIO_gets(bio, bio_buffer, bufferSz), 19); + ExpectIntEQ(BIO_gets(bio, bio_buffer, bufferSz), 8); + ExpectIntEQ(BIO_gets(bio, bio_buffer, -1), 0); + + if (EXPECT_SUCCESS()) + emp_bm->data = NULL; + BUF_MEM_free(emp_bm); + if (EXPECT_SUCCESS()) + msg_bm->data = NULL; + BUF_MEM_free(msg_bm); +#endif + /* check not null terminated string */ BIO_free(bio); bio = NULL; @@ -45267,18 +56594,15 @@ BIO_free(bio); bio = NULL; - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_puts(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) BIO* bio = NULL; char input[] = "hello\0world\n.....ok\n\0"; char output[128]; @@ -45298,17 +56622,14 @@ ExpectIntEQ(BIO_puts(bio, ""), -1); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_dump(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) BIO* bio; static const unsigned char data[] = { 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, @@ -45366,9 +56687,8 @@ ExpectIntEQ(XMEMCMP(output, expectedAll, sizeof(expectedAll) - 1), 0); BIO_free(bio); - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ @@ -45386,11 +56706,10 @@ static int test_wolfSSL_BIO_should_retry(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_RSA) && defined(HAVE_EXT_CACHE) && \ defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(USE_WOLFSSL_IO) - EXPECT_DECLS; tcp_ready ready; func_args server_args; THREAD_TYPE serverThread; @@ -45434,12 +56753,11 @@ tcp_connect(&sockfd, wolfSSLIP, server_args.signal->port, 0, 0, NULL); /* force retry */ - ExpectNotNull(ssl = wolfSSL_new(ctx)); + ExpectNotNull(bio = wolfSSL_BIO_new_ssl(ctx, 1)); + ExpectIntEQ(BIO_get_ssl(bio, &ssl), 1); + ExpectNotNull(ssl); ExpectIntEQ(wolfSSL_set_fd(ssl, sockfd), WOLFSSL_SUCCESS); wolfSSL_SSLSetIORecv(ssl, forceWantRead); - - ExpectNotNull(bio = BIO_new(BIO_f_ssl())); - ExpectIntEQ(BIO_set_ssl(bio, ssl, BIO_CLOSE), 1); if (EXPECT_FAIL()) { wolfSSL_free(ssl); ssl = NULL; @@ -45447,6 +56765,8 @@ ExpectIntLE(BIO_write(bio, msg, msgSz), 0); ExpectIntNE(BIO_should_retry(bio), 0); + ExpectIntEQ(BIO_should_read(bio), 0); + ExpectIntEQ(BIO_should_write(bio), 0); /* now perform successful connection */ @@ -45456,9 +56776,21 @@ ret = wolfSSL_get_error(ssl, -1); if (ret == WOLFSSL_ERROR_WANT_READ || ret == WOLFSSL_ERROR_WANT_WRITE) { ExpectIntNE(BIO_should_retry(bio), 0); + + if (ret == WOLFSSL_ERROR_WANT_READ) + ExpectIntEQ(BIO_should_read(bio), 1); + else + ExpectIntEQ(BIO_should_read(bio), 0); + + if (ret == WOLFSSL_ERROR_WANT_WRITE) + ExpectIntEQ(BIO_should_write(bio), 1); + else + ExpectIntEQ(BIO_should_write(bio), 0); } else { ExpectIntEQ(BIO_should_retry(bio), 0); + ExpectIntEQ(BIO_should_read(bio), 0); + ExpectIntEQ(BIO_should_write(bio), 0); } ExpectIntEQ(XMEMCMP(reply, "I hear you fa shizzle!", XSTRLEN("I hear you fa shizzle!")), 0); @@ -45473,18 +56805,15 @@ #ifdef WOLFSSL_TIRTOS fdOpenSession(Task_self()); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_connect(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ defined(HAVE_HTTP_CLIENT) && !defined(NO_WOLFSSL_CLIENT) - EXPECT_DECLS; tcp_ready ready; func_args server_args; THREAD_TYPE serverThread; @@ -45584,18 +56913,15 @@ #if defined(HAVE_ECC) && defined(FP_ECC) && defined(HAVE_THREAD_LS) wc_ecc_fp_free(); /* free per thread cache */ #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_tls(void) { - int res = TEST_SKIPPED; -#if !defined(NO_BIO) && defined(OPENSSL_EXTRA) && !defined(NO_WOLFSSL_CLIENT) EXPECT_DECLS; +#if !defined(NO_BIO) && defined(OPENSSL_EXTRA) && !defined(NO_WOLFSSL_CLIENT) SSL_CTX* ctx = NULL; SSL *ssl = NULL; BIO *readBio = NULL; @@ -45633,10 +56959,8 @@ SSL_free(ssl); SSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_ALL) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ @@ -45666,16 +56990,15 @@ wc_ecc_fp_free(); /* free per thread cache */ #endif - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); } #endif static int test_wolfSSL_BIO_accept(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ defined(HAVE_HTTP_CLIENT) - EXPECT_DECLS; BIO* serverBindBio = NULL; BIO* serverAcceptBio = NULL; SSL* sslServer = NULL; @@ -45715,17 +57038,14 @@ #if defined(HAVE_ECC) && defined(FP_ECC) && defined(HAVE_THREAD_LS) wc_ecc_fp_free(); /* free per thread cache */ #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_write(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_BASE64_ENCODE) BIO* bio = NULL; BIO* bio64 = NULL; BIO* bio_mem = NULL; @@ -45811,18 +57131,15 @@ ExpectNotNull(bio = BIO_new_mem_buf(out, 0)); ExpectIntEQ(BIO_write(bio, msg, sizeof(msg)), sizeof(msg)); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_printf(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) EXPECT_DECLS; +#if defined(OPENSSL_ALL) BIO* bio = NULL; int sz = 7; char msg[] = "TLS 1.3 for the world"; @@ -45836,17 +57153,14 @@ ExpectIntEQ(BIO_read(bio, out, sizeof(out)), 30); ExpectIntEQ(XSTRNCMP(out, expected, sizeof(expected)), 0); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_f_md(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_SHA256) EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(NO_SHA256) BIO* bio = NULL; BIO* mem = NULL; char msg[] = "message to hash"; @@ -45942,17 +57256,14 @@ EVP_PKEY_free(key); BIO_free(bio); BIO_free(mem); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_up_ref(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) BIO* bio = NULL; ExpectNotNull(bio = BIO_new(BIO_f_md())); @@ -45962,16 +57273,13 @@ ExpectIntEQ(BIO_up_ref(bio), 1); BIO_free(bio); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_reset(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) BIO* bio = NULL; byte buf[16]; @@ -45990,10 +57298,8 @@ ExpectIntEQ(BIO_read(bio, buf, 16), 16); ExpectIntEQ(XMEMCMP(buf, "secure your data", 16), 0); BIO_free(bio); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #endif /* !NO_BIO */ @@ -46002,113 +57308,382 @@ /* test that the callback arg is correct */ static int certCbArg = 0; -static int clientCertCb(WOLFSSL* ssl, void* arg) +static int certCb(WOLFSSL* ssl, void* arg) { if (ssl == NULL || arg != &certCbArg) return 0; - if (wolfSSL_use_certificate_file(ssl, cliCertFile, - WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) - return 0; - if (wolfSSL_use_PrivateKey_file(ssl, cliKeyFile, - WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) - return 0; + if (wolfSSL_is_server(ssl)) { + if (wolfSSL_use_certificate_file(ssl, svrCertFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) + return 0; + if (wolfSSL_use_PrivateKey_file(ssl, svrKeyFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) + return 0; + } + else { + if (wolfSSL_use_certificate_file(ssl, cliCertFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) + return 0; + if (wolfSSL_use_PrivateKey_file(ssl, cliKeyFile, + WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) + return 0; + } return 1; } -static int clientCertSetupCb(WOLFSSL_CTX* ctx) +static int certSetupCb(WOLFSSL_CTX* ctx) { - SSL_CTX_set_cert_cb(ctx, clientCertCb, &certCbArg); + SSL_CTX_set_cert_cb(ctx, certCb, &certCbArg); return TEST_SUCCESS; } /** - * This is only done because test_client_nofail has no way to stop - * certificate and key loading + * This is only done because test_wolfSSL_client_server_nofail_memio has no way + * to stop certificate and key loading */ -static int clientCertClearCb(WOLFSSL* ssl) +static int certClearCb(WOLFSSL* ssl) { /* Clear the loaded certs to force the callbacks to set them up */ SSL_certs_clear(ssl); return TEST_SUCCESS; } -static int serverCertCb(WOLFSSL* ssl, void* arg) +#endif + +static int test_wolfSSL_cert_cb(void) { - if (ssl == NULL || arg != &certCbArg) - return 0; - if (wolfSSL_use_certificate_file(ssl, svrCertFile, - WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) + test_ssl_cbf func_cb_client; + test_ssl_cbf func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + + func_cb_client.ctx_ready = certSetupCb; + func_cb_client.ssl_ready = certClearCb; + func_cb_server.ctx_ready = certSetupCb; + func_cb_server.ssl_ready = certClearCb; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, + &func_cb_server, NULL), TEST_SUCCESS); +#endif + return EXPECT_RESULT(); +} + +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) + +static const char* test_wolfSSL_cert_cb_dyn_ciphers_client_cipher = NULL; +static const char* test_wolfSSL_cert_cb_dyn_ciphers_client_sigalgs = NULL; +static int test_wolfSSL_cert_cb_dyn_ciphers_client_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_CTX_set_cipher_list(ctx, + test_wolfSSL_cert_cb_dyn_ciphers_client_cipher), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set1_sigalgs_list(ctx, + test_wolfSSL_cert_cb_dyn_ciphers_client_sigalgs), WOLFSSL_SUCCESS); + return EXPECT_RESULT(); +} + +static int test_wolfSSL_cert_cb_dyn_ciphers_certCB(WOLFSSL* ssl, void* arg) +{ + const byte* suites = NULL; + word16 suiteSz = 0; + const byte* hashSigAlgo = NULL; + word16 hashSigAlgoSz = 0; + word16 idx = 0; + int haveRSA = 0; + int haveECC = 0; + + (void)arg; + + if (wolfSSL_get_client_suites_sigalgs(ssl, &suites, &suiteSz, &hashSigAlgo, + &hashSigAlgoSz) != WOLFSSL_SUCCESS) return 0; - if (wolfSSL_use_PrivateKey_file(ssl, svrKeyFile, - WOLFSSL_FILETYPE_PEM) != WOLFSSL_SUCCESS) + if (suites == NULL || suiteSz == 0 || hashSigAlgo == NULL || + hashSigAlgoSz == 0) return 0; + + for (idx = 0; idx < suiteSz; idx += 2) { + WOLFSSL_CIPHERSUITE_INFO info = + wolfSSL_get_ciphersuite_info(suites[idx], suites[idx+1]); + + if (info.rsaAuth) + haveRSA = 1; + else if (info.eccAuth) + haveECC = 1; + } + + if (hashSigAlgoSz > 0) { + /* sigalgs extension takes precedence over ciphersuites */ + haveRSA = 0; + haveECC = 0; + } + for (idx = 0; idx < hashSigAlgoSz; idx += 2) { + int hashAlgo = 0; + int sigAlgo = 0; + + if (wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], hashSigAlgo[idx+1], + &hashAlgo, &sigAlgo) != 0) + return 0; + + if (sigAlgo == RSAk || sigAlgo == RSAPSSk) + haveRSA = 1; + else if (sigAlgo == ECDSAk) + haveECC = 1; + } + + if (haveRSA) { + if (wolfSSL_use_certificate_file(ssl, svrCertFile, WOLFSSL_FILETYPE_PEM) + != WOLFSSL_SUCCESS) + return 0; + if (wolfSSL_use_PrivateKey_file(ssl, svrKeyFile, WOLFSSL_FILETYPE_PEM) + != WOLFSSL_SUCCESS) + return 0; + } + else if (haveECC) { + if (wolfSSL_use_certificate_file(ssl, eccCertFile, WOLFSSL_FILETYPE_PEM) + != WOLFSSL_SUCCESS) + return 0; + if (wolfSSL_use_PrivateKey_file(ssl, eccKeyFile, WOLFSSL_FILETYPE_PEM) + != WOLFSSL_SUCCESS) + return 0; + } + return 1; } -static int serverCertSetupCb(WOLFSSL_CTX* ctx) +static int test_wolfSSL_cert_cb_dyn_ciphers_server_ctx_ready(WOLFSSL_CTX* ctx) { - SSL_CTX_set_cert_cb(ctx, serverCertCb, &certCbArg); + SSL_CTX_set_cert_cb(ctx, test_wolfSSL_cert_cb_dyn_ciphers_certCB, NULL); + wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL); return TEST_SUCCESS; } -/** - * This is only done because test_server_nofail has no way to stop - * certificate and key loading - */ -static int serverCertClearCb(WOLFSSL* ssl) +#endif + +/* Testing dynamic ciphers offered by client */ +static int test_wolfSSL_cert_cb_dyn_ciphers(void) { - /* Clear the loaded certs to force the callbacks to set them up */ - SSL_certs_clear(ssl); - return TEST_SUCCESS; + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) + test_ssl_cbf func_cb_client; + test_ssl_cbf func_cb_server; + struct { + method_provider client_meth; + const char* client_ciphers; + const char* client_sigalgs; + const char* client_ca; + method_provider server_meth; + } test_params[] = { +#if !defined(NO_SHA256) && defined(HAVE_AESGCM) +#ifdef WOLFSSL_TLS13 +#if !defined(NO_RSA) && defined(WC_RSA_PSS) + {wolfTLSv1_3_client_method, + "TLS13-AES256-GCM-SHA384:TLS13-AES128-GCM-SHA256", + "RSA-PSS+SHA256", caCertFile, wolfTLSv1_3_server_method}, +#endif +#ifdef HAVE_ECC + {wolfTLSv1_3_client_method, + "TLS13-AES256-GCM-SHA384:TLS13-AES128-GCM-SHA256", + "ECDSA+SHA256", caEccCertFile, wolfTLSv1_3_server_method}, +#endif +#endif +#ifndef WOLFSSL_NO_TLS12 +#if !defined(NO_RSA) && defined(WC_RSA_PSS) && !defined(NO_DH) + {wolfTLSv1_2_client_method, + "DHE-RSA-AES128-GCM-SHA256", + "RSA-PSS+SHA256", caCertFile, wolfTLSv1_2_server_method}, +#endif +#ifdef HAVE_ECC + {wolfTLSv1_2_client_method, + "ECDHE-ECDSA-AES128-GCM-SHA256", + "ECDSA+SHA256", caEccCertFile, wolfTLSv1_2_server_method}, +#endif +#endif +#endif + }; + size_t i; + size_t testCount = sizeof(test_params)/sizeof(*test_params); + + if (testCount > 0) { + for (i = 0; i < testCount; i++) { + printf("\tTesting %s ciphers with %s sigalgs\n", + test_params[i].client_ciphers, + test_params[i].client_sigalgs); + + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + + test_wolfSSL_cert_cb_dyn_ciphers_client_cipher = + test_params[i].client_ciphers; + test_wolfSSL_cert_cb_dyn_ciphers_client_sigalgs = + test_params[i].client_sigalgs; + func_cb_client.method = test_params[i].client_meth; + func_cb_client.caPemFile = test_params[i].client_ca; + func_cb_client.ctx_ready = + test_wolfSSL_cert_cb_dyn_ciphers_client_ctx_ready; + + func_cb_server.ctx_ready = + test_wolfSSL_cert_cb_dyn_ciphers_server_ctx_ready; + func_cb_server.ssl_ready = certClearCb; /* Reuse from prev test */ + func_cb_server.method = test_params[i].server_meth; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, + &func_cb_server, NULL), TEST_SUCCESS); + } + } +#endif + return EXPECT_RESULT(); } +static int test_wolfSSL_ciphersuite_auth(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) + WOLFSSL_CIPHERSUITE_INFO info; + + (void)info; + +#ifndef WOLFSSL_NO_TLS12 +#ifdef HAVE_CHACHA + info = wolfSSL_get_ciphersuite_info(CHACHA_BYTE, + TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256); + ExpectIntEQ(info.rsaAuth, 1); + ExpectIntEQ(info.eccAuth, 0); + ExpectIntEQ(info.eccStatic, 0); + ExpectIntEQ(info.psk, 0); + + info = wolfSSL_get_ciphersuite_info(CHACHA_BYTE, + TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256); + ExpectIntEQ(info.rsaAuth, 0); + ExpectIntEQ(info.eccAuth, 1); + ExpectIntEQ(info.eccStatic, 0); + ExpectIntEQ(info.psk, 0); + + info = wolfSSL_get_ciphersuite_info(CHACHA_BYTE, + TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256); + ExpectIntEQ(info.rsaAuth, 0); + ExpectIntEQ(info.eccAuth, 0); + ExpectIntEQ(info.eccStatic, 0); + ExpectIntEQ(info.psk, 1); +#endif +#if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) +#ifndef NO_RSA + info = wolfSSL_get_ciphersuite_info(ECC_BYTE, + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA); + ExpectIntEQ(info.rsaAuth, 1); + ExpectIntEQ(info.eccAuth, 0); + ExpectIntEQ(info.eccStatic, 0); + ExpectIntEQ(info.psk, 0); + + info = wolfSSL_get_ciphersuite_info(ECC_BYTE, + TLS_ECDH_RSA_WITH_AES_128_CBC_SHA); + ExpectIntEQ(info.rsaAuth, 1); + ExpectIntEQ(info.eccAuth, 0); + ExpectIntEQ(info.eccStatic, 1); + ExpectIntEQ(info.psk, 0); + + info = wolfSSL_get_ciphersuite_info(ECC_BYTE, + TLS_ECDH_RSA_WITH_AES_256_CBC_SHA); + ExpectIntEQ(info.rsaAuth, 1); + ExpectIntEQ(info.eccAuth, 0); + ExpectIntEQ(info.eccStatic, 1); + ExpectIntEQ(info.psk, 0); +#endif + info = wolfSSL_get_ciphersuite_info(ECC_BYTE, + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA); + ExpectIntEQ(info.rsaAuth, 0); + ExpectIntEQ(info.eccAuth, 1); + ExpectIntEQ(info.eccStatic, 0); + ExpectIntEQ(info.psk, 0); + + info = wolfSSL_get_ciphersuite_info(ECC_BYTE, + TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA); + ExpectIntEQ(info.rsaAuth, 0); + ExpectIntEQ(info.eccAuth, 1); + ExpectIntEQ(info.eccStatic, 1); + ExpectIntEQ(info.psk, 0); + + info = wolfSSL_get_ciphersuite_info(ECDHE_PSK_BYTE, + TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256); + ExpectIntEQ(info.rsaAuth, 0); + ExpectIntEQ(info.eccAuth, 0); + ExpectIntEQ(info.eccStatic, 0); + ExpectIntEQ(info.psk, 1); +#endif +#endif + +#ifdef WOLFSSL_TLS13 + info = wolfSSL_get_ciphersuite_info(TLS13_BYTE, + TLS_AES_128_GCM_SHA256); + ExpectIntEQ(info.rsaAuth, 0); + ExpectIntEQ(info.eccAuth, 0); + ExpectIntEQ(info.eccStatic, 0); + ExpectIntEQ(info.psk, 0); #endif -static int test_wolfSSL_cert_cb(void) +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_sigalg_info(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) EXPECT_DECLS; - test_ssl_cbf func_cb_client; - test_ssl_cbf func_cb_server; +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) + byte hashSigAlgo[WOLFSSL_MAX_SIGALGO]; + word16 len = 0; + word16 idx = 0; + int allSigAlgs = SIG_ECDSA | SIG_RSA | SIG_SM2 | SIG_FALCON | SIG_DILITHIUM; - XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); - XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); + InitSuitesHashSigAlgo(hashSigAlgo, allSigAlgs, 1, 0xFFFFFFFF, &len); + for (idx = 0; idx < len; idx += 2) { + int hashAlgo = 0; + int sigAlgo = 0; - func_cb_client.ctx_ready = clientCertSetupCb; - func_cb_client.ssl_ready = clientCertClearCb; - func_cb_server.ctx_ready = serverCertSetupCb; - func_cb_server.ssl_ready = serverCertClearCb; + ExpectIntEQ(wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], + hashSigAlgo[idx+1], &hashAlgo, &sigAlgo), 0); - ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, - &func_cb_server, NULL), TEST_SUCCESS); + ExpectIntNE(hashAlgo, 0); + ExpectIntNE(sigAlgo, 0); + } + + InitSuitesHashSigAlgo(hashSigAlgo, allSigAlgs | SIG_ANON, 1, + 0xFFFFFFFF, &len); + for (idx = 0; idx < len; idx += 2) { + int hashAlgo = 0; + int sigAlgo = 0; + + ExpectIntEQ(wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], + hashSigAlgo[idx+1], &hashAlgo, &sigAlgo), 0); + + ExpectIntNE(hashAlgo, 0); + } - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_SESSION(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ !defined(NO_SESSION_CACHE) - - WOLFSSL* ssl; - WOLFSSL_CTX* ctx; - WOLFSSL_SESSION* sess; - WOLFSSL_SESSION* sess_copy; + WOLFSSL* ssl = NULL; + WOLFSSL_CTX* ctx = NULL; + WOLFSSL_SESSION* sess = NULL; + WOLFSSL_SESSION* sess_copy = NULL; #ifdef OPENSSL_EXTRA #ifdef HAVE_EXT_CACHE unsigned char* sessDer = NULL; unsigned char* ptr = NULL; - int sz; + int sz = 0; #endif const unsigned char context[] = "user app context"; unsigned int contextSz = (unsigned int)sizeof(context); #endif - int ret, err; + int ret = 0, err = 0; SOCKET_T sockfd; tcp_ready ready; func_args server_args; @@ -46121,23 +57696,23 @@ #if defined(WOLFSSL_TLS13) && (!defined(HAVE_SESSION_TICKET) && \ !defined(WOLFSSL_NO_TLS12) || !(defined(HAVE_CHACHA) && \ defined(HAVE_POLY1305) && !defined(HAVE_AESGCM))) - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); #endif - AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, + ExpectTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, WOLFSSL_FILETYPE_PEM)); - AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, + ExpectTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, WOLFSSL_FILETYPE_PEM)); - AssertIntEQ(wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0), + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0), WOLFSSL_SUCCESS); #ifdef WOLFSSL_ENCRYPTED_KEYS wolfSSL_CTX_set_default_passwd_cb(ctx, PasswordCallBack); #endif #ifdef HAVE_SESSION_TICKET /* Use session tickets, for ticket tests below */ - AssertIntEQ(wolfSSL_CTX_UseSessionTicket(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_UseSessionTicket(ctx), WOLFSSL_SUCCESS); #endif XMEMSET(&server_args, 0, sizeof(func_args)); @@ -46158,9 +57733,9 @@ wait_tcp_ready(&server_args); /* client connection */ - ssl = wolfSSL_new(ctx); + ExpectNotNull(ssl = wolfSSL_new(ctx)); tcp_connect(&sockfd, wolfSSLIP, ready.port, 0, 0, ssl); - AssertIntEQ(wolfSSL_set_fd(ssl, sockfd), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_fd(ssl, sockfd), WOLFSSL_SUCCESS); #ifdef WOLFSSL_ASYNC_CRYPT err = 0; /* Reset error */ @@ -46175,7 +57750,7 @@ ret = wolfSSL_connect(ssl); err = wolfSSL_get_error(ssl, 0); } while (err == WC_PENDING_E); - AssertIntEQ(ret, WOLFSSL_SUCCESS); + ExpectIntEQ(ret, WOLFSSL_SUCCESS); #ifdef WOLFSSL_ASYNC_CRYPT err = 0; /* Reset error */ @@ -46190,7 +57765,7 @@ ret = wolfSSL_write(ssl, sendGET, (int)XSTRLEN(sendGET)); err = wolfSSL_get_error(ssl, 0); } while (err == WC_PENDING_E); - AssertIntEQ(ret, (int)XSTRLEN(sendGET)); + ExpectIntEQ(ret, (int)XSTRLEN(sendGET)); #ifdef WOLFSSL_ASYNC_CRYPT err = 0; /* Reset error */ @@ -46205,12 +57780,13 @@ ret = wolfSSL_read(ssl, msg, sizeof(msg)); err = wolfSSL_get_error(ssl, 0); } while (err == WC_PENDING_E); - AssertIntEQ(ret, 23); + ExpectIntEQ(ret, 23); - AssertPtrNE((sess = wolfSSL_get1_session(ssl)), NULL); /* ref count 1 */ - AssertPtrNE((sess_copy = wolfSSL_get1_session(ssl)), NULL); /* ref count 2 */ + ExpectPtrNE((sess = wolfSSL_get1_session(ssl)), NULL); /* ref count 1 */ + ExpectPtrNE((sess_copy = wolfSSL_get1_session(ssl)), NULL); /* ref count 2 */ + ExpectIntEQ(wolfSSL_SessionIsSetup(sess), 1); #ifdef HAVE_EXT_CACHE - AssertPtrEq(sess, sess_copy); /* they should be the same pointer but without + ExpectPtrEq(sess, sess_copy); /* they should be the same pointer but without * HAVE_EXT_CACHE we get new objects each time */ #endif wolfSSL_SESSION_free(sess_copy); sess_copy = NULL; @@ -46219,27 +57795,29 @@ sess = wolfSSL_get_session(ssl); #ifdef OPENSSL_EXTRA - AssertIntEQ(SSL_SESSION_is_resumable(NULL), 0); - AssertIntEQ(SSL_SESSION_is_resumable(sess), 1); + ExpectIntEQ(SSL_SESSION_is_resumable(NULL), 0); + ExpectIntEQ(SSL_SESSION_is_resumable(sess), 1); - AssertIntEQ(wolfSSL_SESSION_has_ticket(NULL), 0); - AssertIntEQ(wolfSSL_SESSION_get_ticket_lifetime_hint(NULL), 0); + ExpectIntEQ(wolfSSL_SESSION_has_ticket(NULL), 0); + ExpectIntEQ(wolfSSL_SESSION_get_ticket_lifetime_hint(NULL), 0); #ifdef HAVE_SESSION_TICKET - AssertIntEQ(wolfSSL_SESSION_has_ticket(sess), 1); - AssertIntEQ(wolfSSL_SESSION_get_ticket_lifetime_hint(sess), + ExpectIntEQ(wolfSSL_SESSION_has_ticket(sess), 1); + ExpectIntEQ(wolfSSL_SESSION_get_ticket_lifetime_hint(sess), SESSION_TICKET_HINT_DEFAULT); #else - AssertIntEQ(wolfSSL_SESSION_has_ticket(sess), 0); + ExpectIntEQ(wolfSSL_SESSION_has_ticket(sess), 0); #endif #else (void)sess; #endif /* OPENSSL_EXTRA */ /* Retain copy of the session for later testing */ - AssertNotNull(sess = wolfSSL_get1_session(ssl)); + ExpectNotNull(sess = wolfSSL_get1_session(ssl)); wolfSSL_shutdown(ssl); - wolfSSL_free(ssl); + wolfSSL_free(ssl); ssl = NULL; + + CloseSocket(sockfd); join_thread(serverThread); @@ -46251,50 +57829,50 @@ #if defined(SESSION_CERTS) && defined(OPENSSL_EXTRA) { - X509 *x509; + X509 *x509 = NULL; char buf[30]; - int bufSz; + int bufSz = 0; - AssertNotNull(x509 = SSL_SESSION_get0_peer(sess)); - AssertIntGT((bufSz = X509_NAME_get_text_by_NID( - X509_get_subject_name(x509), NID_organizationalUnitName, - buf, sizeof(buf))), 0); - AssertIntNE((bufSz == 7 || bufSz == 16), 0); /* should be one of these*/ + ExpectNotNull(x509 = SSL_SESSION_get0_peer(sess)); + ExpectIntGT((bufSz = X509_NAME_get_text_by_NID( + X509_get_subject_name(x509), NID_organizationalUnitName, buf, + sizeof(buf))), 0); + ExpectIntNE((bufSz == 7 || bufSz == 16), 0); /* should be one of these*/ if (bufSz == 7) { - AssertIntEQ(XMEMCMP(buf, "Support", bufSz), 0); + ExpectIntEQ(XMEMCMP(buf, "Support", bufSz), 0); } if (bufSz == 16) { - AssertIntEQ(XMEMCMP(buf, "Programming-2048", bufSz), 0); + ExpectIntEQ(XMEMCMP(buf, "Programming-2048", bufSz), 0); } } #endif #ifdef HAVE_EXT_CACHE - AssertNotNull(sess_copy = wolfSSL_SESSION_dup(sess)); - wolfSSL_SESSION_free(sess_copy); + ExpectNotNull(sess_copy = wolfSSL_SESSION_dup(sess)); + wolfSSL_SESSION_free(sess_copy); sess_copy = NULL; sess_copy = NULL; #endif #if defined(OPENSSL_EXTRA) && defined(HAVE_EXT_CACHE) /* get session from DER and update the timeout */ - AssertIntEQ(wolfSSL_i2d_SSL_SESSION(NULL, &sessDer), BAD_FUNC_ARG); - AssertIntGT((sz = wolfSSL_i2d_SSL_SESSION(sess, &sessDer)), 0); - wolfSSL_SESSION_free(sess); + ExpectIntEQ(wolfSSL_i2d_SSL_SESSION(NULL, &sessDer), BAD_FUNC_ARG); + ExpectIntGT((sz = wolfSSL_i2d_SSL_SESSION(sess, &sessDer)), 0); + wolfSSL_SESSION_free(sess); sess = NULL; sess = NULL; ptr = sessDer; - AssertNull(sess = wolfSSL_d2i_SSL_SESSION(NULL, NULL, sz)); - AssertNotNull(sess = wolfSSL_d2i_SSL_SESSION(NULL, + ExpectNull(sess = wolfSSL_d2i_SSL_SESSION(NULL, NULL, sz)); + ExpectNotNull(sess = wolfSSL_d2i_SSL_SESSION(NULL, (const unsigned char**)&ptr, sz)); XFREE(sessDer, NULL, DYNAMIC_TYPE_OPENSSL); sessDer = NULL; - AssertIntGT(wolfSSL_SESSION_get_time(sess), 0); - AssertIntEQ(wolfSSL_SSL_SESSION_set_timeout(sess, 500), SSL_SUCCESS); + ExpectIntGT(wolfSSL_SESSION_get_time(sess), 0); + ExpectIntEQ(wolfSSL_SSL_SESSION_set_timeout(sess, 500), SSL_SUCCESS); #endif /* successful set session test */ - AssertNotNull(ssl = wolfSSL_new(ctx)); - AssertIntEQ(wolfSSL_set_session(ssl, sess), WOLFSSL_SUCCESS); + ExpectNotNull(ssl = wolfSSL_new(ctx)); + ExpectIntEQ(wolfSSL_set_session(ssl, sess), WOLFSSL_SUCCESS); #ifdef HAVE_SESSION_TICKET /* Test set/get session ticket */ @@ -46303,52 +57881,179 @@ char buf[64] = {0}; word32 bufSz = (word32)sizeof(buf); - AssertIntEQ(SSL_SUCCESS, + ExpectIntEQ(SSL_SUCCESS, wolfSSL_set_SessionTicket(ssl, (byte *)ticket, (word32)XSTRLEN(ticket))); - AssertIntEQ(SSL_SUCCESS, + ExpectIntEQ(SSL_SUCCESS, wolfSSL_get_SessionTicket(ssl, (byte *)buf, &bufSz)); - AssertStrEQ(ticket, buf); + ExpectStrEQ(ticket, buf); } #endif #ifdef OPENSSL_EXTRA /* session timeout case */ /* make the session to be expired */ - AssertIntEQ(SSL_SESSION_set_timeout(sess,1), SSL_SUCCESS); + ExpectIntEQ(SSL_SESSION_set_timeout(sess,1), SSL_SUCCESS); XSLEEP_MS(1200); /* SSL_set_session should reject specified session but return success * if WOLFSSL_ERROR_CODE_OPENSSL macro is defined for OpenSSL compatibility. */ #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - AssertIntEQ(wolfSSL_set_session(ssl,sess), SSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_session(ssl,sess), SSL_SUCCESS); #else - AssertIntEQ(wolfSSL_set_session(ssl,sess), SSL_FAILURE); + ExpectIntEQ(wolfSSL_set_session(ssl,sess), SSL_FAILURE); #endif - AssertIntEQ(wolfSSL_SSL_SESSION_set_timeout(sess, 500), SSL_SUCCESS); + ExpectIntEQ(wolfSSL_SSL_SESSION_set_timeout(sess, 500), SSL_SUCCESS); +#ifdef WOLFSSL_SESSION_ID_CTX /* fail case with miss match session context IDs (use compatibility API) */ - AssertIntEQ(SSL_set_session_id_context(ssl, context, contextSz), + ExpectIntEQ(SSL_set_session_id_context(ssl, context, contextSz), SSL_SUCCESS); - AssertIntEQ(wolfSSL_set_session(ssl, sess), SSL_FAILURE); - wolfSSL_free(ssl); + ExpectIntEQ(wolfSSL_set_session(ssl, sess), SSL_FAILURE); + wolfSSL_free(ssl); ssl = NULL; - AssertIntEQ(SSL_CTX_set_session_id_context(NULL, context, contextSz), + ExpectIntEQ(SSL_CTX_set_session_id_context(NULL, context, contextSz), SSL_FAILURE); - AssertIntEQ(SSL_CTX_set_session_id_context(ctx, context, contextSz), + ExpectIntEQ(SSL_CTX_set_session_id_context(ctx, context, contextSz), SSL_SUCCESS); - AssertNotNull(ssl = wolfSSL_new(ctx)); - AssertIntEQ(wolfSSL_set_session(ssl, sess), SSL_FAILURE); + ExpectNotNull(ssl = wolfSSL_new(ctx)); + ExpectIntEQ(wolfSSL_set_session(ssl, sess), SSL_FAILURE); +#endif #endif /* OPENSSL_EXTRA */ wolfSSL_free(ssl); wolfSSL_SESSION_free(sess); wolfSSL_CTX_free(ctx); +#endif + return EXPECT_RESULT(); +} - res = TEST_RES_CHECK(1); +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ + !defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ + !defined(NO_SESSION_CACHE) && defined(OPENSSL_EXTRA) && \ + !defined(WOLFSSL_NO_TLS12) +static WOLFSSL_SESSION* test_wolfSSL_SESSION_expire_sess = NULL; + +static void test_wolfSSL_SESSION_expire_downgrade_ctx_ready(WOLFSSL_CTX* ctx) +{ + #ifdef WOLFSSL_ERROR_CODE_OPENSSL + /* returns previous timeout value */ + AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 1), 500); + #else + AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 1), WOLFSSL_SUCCESS); + #endif +} + + +/* set the session to timeout in a second */ +static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready(WOLFSSL* ssl) +{ + AssertIntEQ(wolfSSL_set_timeout(ssl, 2), 1); +} + + +/* store the client side session from the first successful connection */ +static void test_wolfSSL_SESSION_expire_downgrade_ssl_result(WOLFSSL* ssl) +{ + AssertPtrNE((test_wolfSSL_SESSION_expire_sess = wolfSSL_get1_session(ssl)), + NULL); /* ref count 1 */ +} + + +/* wait till session is expired then set it in the WOLFSSL struct for use */ +static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready_wait(WOLFSSL* ssl) +{ + AssertIntEQ(wolfSSL_set_timeout(ssl, 1), 1); + AssertIntEQ(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess), + WOLFSSL_SUCCESS); + XSLEEP_MS(2000); /* wait 2 seconds for session to expire */ +} + + +/* set expired session in the WOLFSSL struct for use */ +static void test_wolfSSL_SESSION_expire_downgrade_ssl_ready_set(WOLFSSL* ssl) +{ + XSLEEP_MS(1200); /* wait a second for session to expire */ + + /* set the expired session, call to set session fails but continuing on + after failure should be handled here */ +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL) + AssertIntEQ(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess), + WOLFSSL_SUCCESS); +#else + AssertIntNE(wolfSSL_set_session(ssl, test_wolfSSL_SESSION_expire_sess), + WOLFSSL_SUCCESS); #endif - return res; +} + + +/* check that the expired session was not reused */ +static void test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse(WOLFSSL* ssl) +{ + /* since the session has expired it should not have been reused */ + AssertIntEQ(wolfSSL_session_reused(ssl), 0); +} +#endif + +static int test_wolfSSL_SESSION_expire_downgrade(void) +{ + EXPECT_DECLS; +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ + !defined(NO_RSA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ + !defined(NO_SESSION_CACHE) && defined(OPENSSL_EXTRA) && \ + !defined(WOLFSSL_NO_TLS12) + + WOLFSSL_CTX* ctx = NULL; + callback_functions server_cbf, client_cbf; + + XMEMSET(&server_cbf, 0, sizeof(callback_functions)); + XMEMSET(&client_cbf, 0, sizeof(callback_functions)); + + /* force server side to use TLS 1.2 */ + server_cbf.ctx = ctx; + server_cbf.method = wolfTLSv1_2_server_method; + + client_cbf.method = wolfSSLv23_client_method; + server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready; + client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready; + client_cbf.on_result = test_wolfSSL_SESSION_expire_downgrade_ssl_result; + + test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf); + ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + + /* set the previously created session and wait till expired */ + server_cbf.ctx = ctx; + + client_cbf.method = wolfSSLv23_client_method; + server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready; + client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready_wait; + client_cbf.on_result = + test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse; + + test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf); + ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + + /* set the previously created expired session */ + server_cbf.ctx = ctx; + + client_cbf.method = wolfSSLv23_client_method; + server_cbf.ctx_ready = test_wolfSSL_SESSION_expire_downgrade_ctx_ready; + client_cbf.ssl_ready = test_wolfSSL_SESSION_expire_downgrade_ssl_ready_set; + client_cbf.on_result = + test_wolfSSL_SESSION_expire_downgrade_ssl_result_reuse; + + test_wolfSSL_client_server_nofail(&client_cbf, &server_cbf); + ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + + wolfSSL_SESSION_free(test_wolfSSL_SESSION_expire_sess); + wolfSSL_CTX_free(ctx); + +#endif + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ @@ -46387,21 +58092,26 @@ static int SessRemCtxSetupCb(WOLFSSL_CTX* ctx) { - EXPECT_DECLS; SSL_CTX_sess_set_remove_cb(ctx, SessRemCtxCb); #if defined(WOLFSSL_TLS13) && !defined(HAVE_SESSION_TICKET) && \ !defined(NO_SESSION_CACHE_REF) - /* Allow downgrade, set min version, and disable TLS 1.3. - * Do this because without NO_SESSION_CACHE_REF we will want to return a - * reference to the session cache. But with WOLFSSL_TLS13 and without - * HAVE_SESSION_TICKET we won't have a session ID to be able to place the - * session in the cache. In this case we need to downgrade to previous - * versions to just use the legacy session ID field. */ - ExpectIntEQ(SSL_CTX_set_min_proto_version(ctx, SSL3_VERSION), SSL_SUCCESS); - ExpectIntEQ(SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION), - SSL_SUCCESS); + { + EXPECT_DECLS; + /* Allow downgrade, set min version, and disable TLS 1.3. + * Do this because without NO_SESSION_CACHE_REF we will want to return a + * reference to the session cache. But with WOLFSSL_TLS13 and without + * HAVE_SESSION_TICKET we won't have a session ID to be able to place + * the session in the cache. In this case we need to downgrade to + * previous versions to just use the legacy session ID field. */ + ExpectIntEQ(SSL_CTX_set_min_proto_version(ctx, SSL3_VERSION), + SSL_SUCCESS); + ExpectIntEQ(SSL_CTX_set_max_proto_version(ctx, TLS1_2_VERSION), + SSL_SUCCESS); + return EXPECT_RESULT(); + } +#else + return TEST_SUCCESS; #endif - return EXPECT_RESULT(); } static int SessRemSslSetupCb(WOLFSSL* ssl) @@ -46409,27 +58119,25 @@ EXPECT_DECLS; int* side; - if (EXPECT_SUCCESS()) { - if (SSL_is_server(ssl)) { - side = &sessRemCtx_Server; - serverSessRemCountMalloc++; - ExpectNotNull(serverSess = SSL_get1_session(ssl)); - ExpectIntEQ(SSL_CTX_up_ref(serverSessCtx = SSL_get_SSL_CTX(ssl)), - SSL_SUCCESS); - } - else { - side = &sessRemCtx_Client; - clientSessRemCountMalloc++; - #if (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) || \ - !defined(NO_SESSION_CACHE_REF) - ExpectNotNull(clientSess = SSL_get1_session(ssl)); - ExpectIntEQ(SSL_CTX_up_ref(clientSessCtx = SSL_get_SSL_CTX(ssl)), - SSL_SUCCESS); - #endif - } - ExpectIntEQ(SSL_SESSION_set_ex_data(SSL_get_session(ssl), - serverSessRemIdx, side), SSL_SUCCESS); + if (SSL_is_server(ssl)) { + side = &sessRemCtx_Server; + serverSessRemCountMalloc++; + ExpectNotNull(serverSess = SSL_get1_session(ssl)); + ExpectIntEQ(SSL_CTX_up_ref(serverSessCtx = SSL_get_SSL_CTX(ssl)), + SSL_SUCCESS); + } + else { + side = &sessRemCtx_Client; + clientSessRemCountMalloc++; + #if (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) || \ + !defined(NO_SESSION_CACHE_REF) + ExpectNotNull(clientSess = SSL_get1_session(ssl)); + ExpectIntEQ(SSL_CTX_up_ref(clientSessCtx = SSL_get_SSL_CTX(ssl)), + SSL_SUCCESS); +#endif } + ExpectIntEQ(SSL_SESSION_set_ex_data(SSL_get_session(ssl), + serverSessRemIdx, side), SSL_SUCCESS); return EXPECT_RESULT(); } @@ -46437,15 +58145,14 @@ static int test_wolfSSL_CTX_sess_set_remove_cb(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ defined(HAVE_EX_DATA) && !defined(NO_SESSION_CACHE) - EXPECT_DECLS; /* Check that the remove callback gets called for external data in a * session object */ test_ssl_cbf func_cb; - XMEMSET(&func_cb, 0, sizeof(callback_functions)); + XMEMSET(&func_cb, 0, sizeof(func_cb)); func_cb.ctx_ready = SessRemCtxSetupCb; func_cb.on_result = SessRemSslSetupCb; @@ -46455,6 +58162,7 @@ /* Both should have been allocated */ ExpectIntEQ(clientSessRemCountMalloc, 1); ExpectIntEQ(serverSessRemCountMalloc, 1); + /* This should not be called yet. Session wasn't evicted from cache yet. */ ExpectIntEQ(clientSessRemCountFree, 0); #if (defined(WOLFSSL_TLS13) && defined(HAVE_SESSION_TICKET)) || \ @@ -46481,7 +58189,6 @@ ExpectIntEQ(SSL_CTX_remove_session(serverSessCtx, serverSess), 0); ExpectNull(SSL_SESSION_get_ex_data(serverSess, serverSessRemIdx)); ExpectIntEQ(serverSessRemCountFree, 1); - /* Need to free the references that we kept */ SSL_CTX_free(serverSessCtx); SSL_SESSION_free(serverSess); @@ -46490,98 +58197,97 @@ SSL_CTX_free(clientSessCtx); SSL_SESSION_free(clientSess); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ticket_keys(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ !defined(NO_WOLFSSL_SERVER) - WOLFSSL_CTX* ctx; + WOLFSSL_CTX* ctx = NULL; byte keys[WOLFSSL_TICKET_KEYS_SZ]; - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, NULL, 0), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, NULL, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, NULL, 0), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, NULL, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, keys, 0), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, keys, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, keys, 0), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, keys, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, NULL, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, NULL, sizeof(keys)), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, NULL, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, NULL, sizeof(keys)), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, keys, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(NULL, keys, sizeof(keys)), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, NULL, 0), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, NULL, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, NULL, 0), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, NULL, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, keys, 0), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, keys, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, keys, 0), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, keys, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, NULL, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, NULL, sizeof(keys)), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, NULL, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, NULL, sizeof(keys)), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, keys, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(NULL, keys, sizeof(keys)), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, keys, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_get_tlsext_ticket_keys(ctx, keys, sizeof(keys)), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, keys, sizeof(keys)), + ExpectIntEQ(wolfSSL_CTX_set_tlsext_ticket_keys(ctx, keys, sizeof(keys)), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_d2i_PUBKEY(void) { - int res = TEST_SKIPPED; - #if defined(OPENSSL_EXTRA) - BIO* bio; - EVP_PKEY* pkey; + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) + BIO* bio = NULL; + EVP_PKEY* pkey = NULL; - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertNull(d2i_PUBKEY_bio(NULL, NULL)); + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectNull(d2i_PUBKEY_bio(NULL, NULL)); #if defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA) /* RSA PUBKEY test */ - AssertIntGT(BIO_write(bio, client_keypub_der_2048, - sizeof_client_keypub_der_2048), 0); - AssertNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); + ExpectIntGT(BIO_write(bio, client_keypub_der_2048, + sizeof_client_keypub_der_2048), 0); + ExpectNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); EVP_PKEY_free(pkey); + pkey = NULL; #endif #if defined(USE_CERT_BUFFERS_256) && defined(HAVE_ECC) /* ECC PUBKEY test */ - AssertIntGT(BIO_write(bio, ecc_clikeypub_der_256, - sizeof_ecc_clikeypub_der_256), 0); - AssertNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); + ExpectIntGT(BIO_write(bio, ecc_clikeypub_der_256, + sizeof_ecc_clikeypub_der_256), 0); + ExpectNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); EVP_PKEY_free(pkey); + pkey = NULL; #endif #if defined(USE_CERT_BUFFERS_2048) && !defined(NO_DSA) /* DSA PUBKEY test */ - AssertIntGT(BIO_write(bio, dsa_pub_key_der_2048, - sizeof_dsa_pub_key_der_2048), 0); - AssertNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); + ExpectIntGT(BIO_write(bio, dsa_pub_key_der_2048, + sizeof_dsa_pub_key_der_2048), 0); + ExpectNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); EVP_PKEY_free(pkey); + pkey = NULL; #endif #if defined(USE_CERT_BUFFERS_2048) && !defined(NO_DH) && \ @@ -46589,31 +58295,29 @@ #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ (HAVE_FIPS_VERSION > 2)) /* DH PUBKEY test */ - AssertIntGT(BIO_write(bio, dh_pub_key_der_2048, - sizeof_dh_pub_key_der_2048), 0); - AssertNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); + ExpectIntGT(BIO_write(bio, dh_pub_key_der_2048, + sizeof_dh_pub_key_der_2048), 0); + ExpectNotNull(pkey = d2i_PUBKEY_bio(bio, NULL)); EVP_PKEY_free(pkey); + pkey = NULL; #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* USE_CERT_BUFFERS_2048 && !NO_DH && && OPENSSL_EXTRA */ BIO_free(bio); (void)pkey; +#endif - res = TEST_RES_CHECK(1); - #endif - - return res; + return EXPECT_RESULT(); } #if (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO)) && !defined(NO_RSA) static int test_wolfSSL_d2i_PrivateKeys_bio(void) { + EXPECT_DECLS; BIO* bio = NULL; EVP_PKEY* pkey = NULL; -#ifndef NO_RSA -#endif - WOLFSSL_CTX* ctx; + WOLFSSL_CTX* ctx = NULL; #if defined(WOLFSSL_KEY_GEN) unsigned char buff[4096]; @@ -46621,28 +58325,29 @@ #endif /* test creating new EVP_PKEY with bad arg */ - AssertNull((pkey = d2i_PrivateKey_bio(NULL, NULL))); + ExpectNull((pkey = d2i_PrivateKey_bio(NULL, NULL))); /* test loading RSA key using BIO */ #if !defined(NO_RSA) && !defined(NO_FILESYSTEM) { - XFILE file; + XFILE file = XBADFILE; const char* fname = "./certs/server-key.der"; - size_t sz; - byte* buf; + size_t sz = 0; + byte* buf = NULL; - file = XFOPEN(fname, "rb"); - AssertTrue((file != XBADFILE)); - AssertTrue(XFSEEK(file, 0, XSEEK_END) == 0); - sz = XFTELL(file); - AssertTrue(XFSEEK(file, 0, XSEEK_SET) == 0); - AssertNotNull(buf = (byte*)XMALLOC(sz, HEAP_HINT, DYNAMIC_TYPE_FILE)); - AssertIntEQ(XFREAD(buf, 1, sz, file), sz); - XFCLOSE(file); + ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); + ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); + ExpectTrue((sz = XFTELL(file)) != 0); + ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); + ExpectNotNull(buf = (byte*)XMALLOC(sz, HEAP_HINT, DYNAMIC_TYPE_FILE)); + ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); + if (file != XBADFILE) { + XFCLOSE(file); + } /* Test using BIO new mem and loading DER private key */ - AssertNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); - AssertNotNull((pkey = d2i_PrivateKey_bio(bio, NULL))); + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull((pkey = d2i_PrivateKey_bio(bio, NULL))); XFREE(buf, HEAP_HINT, DYNAMIC_TYPE_FILE); BIO_free(bio); bio = NULL; @@ -46654,23 +58359,23 @@ /* test loading ECC key using BIO */ #if defined(HAVE_ECC) && !defined(NO_FILESYSTEM) { - XFILE file; + XFILE file = XBADFILE; const char* fname = "./certs/ecc-key.der"; - size_t sz; - byte* buf; + size_t sz = 0; + byte* buf = NULL; - file = XFOPEN(fname, "rb"); - AssertTrue((file != XBADFILE)); - AssertTrue(XFSEEK(file, 0, XSEEK_END) == 0); - sz = XFTELL(file); - AssertTrue(XFSEEK(file, 0, XSEEK_SET) == 0); - AssertNotNull(buf = (byte*)XMALLOC(sz, HEAP_HINT, DYNAMIC_TYPE_FILE)); - AssertIntEQ(XFREAD(buf, 1, sz, file), sz); - XFCLOSE(file); + ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); + ExpectTrue(XFSEEK(file, 0, XSEEK_END) == 0); + ExpectTrue((sz = XFTELL(file)) != 0); + ExpectTrue(XFSEEK(file, 0, XSEEK_SET) == 0); + ExpectNotNull(buf = (byte*)XMALLOC(sz, HEAP_HINT, DYNAMIC_TYPE_FILE)); + ExpectIntEQ(XFREAD(buf, 1, sz, file), sz); + if (file != XBADFILE) + XFCLOSE(file); /* Test using BIO new mem and loading DER private key */ - AssertNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); - AssertNotNull((pkey = d2i_PrivateKey_bio(bio, NULL))); + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull((pkey = d2i_PrivateKey_bio(bio, NULL))); XFREE(buf, HEAP_HINT, DYNAMIC_TYPE_FILE); BIO_free(bio); bio = NULL; @@ -46679,111 +58384,113 @@ } #endif - AssertNotNull(bio = BIO_new(BIO_s_mem())); + ExpectNotNull(bio = BIO_new(BIO_s_mem())); #ifndef NO_WOLFSSL_SERVER - AssertNotNull(ctx = SSL_CTX_new(wolfSSLv23_server_method())); + ExpectNotNull(ctx = SSL_CTX_new(wolfSSLv23_server_method())); #else - AssertNotNull(ctx = SSL_CTX_new(wolfSSLv23_client_method())); + ExpectNotNull(ctx = SSL_CTX_new(wolfSSLv23_client_method())); #endif -#if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) { RSA* rsa = NULL; /* Tests bad parameters */ - AssertNull(d2i_RSAPrivateKey_bio(NULL, NULL)); + ExpectNull(d2i_RSAPrivateKey_bio(NULL, NULL)); /* RSA not set yet, expecting to fail*/ - AssertIntEQ(SSL_CTX_use_RSAPrivateKey(ctx, rsa), BAD_FUNC_ARG); + ExpectIntEQ(SSL_CTX_use_RSAPrivateKey(ctx, rsa), BAD_FUNC_ARG); #if defined(USE_CERT_BUFFERS_2048) && defined(WOLFSSL_KEY_GEN) /* set RSA using bio*/ - AssertIntGT(BIO_write(bio, client_key_der_2048, + ExpectIntGT(BIO_write(bio, client_key_der_2048, sizeof_client_key_der_2048), 0); - AssertNotNull(d2i_RSAPrivateKey_bio(bio, &rsa)); - AssertNotNull(rsa); + ExpectNotNull(d2i_RSAPrivateKey_bio(bio, &rsa)); + ExpectNotNull(rsa); - AssertIntEQ(SSL_CTX_use_RSAPrivateKey(ctx, rsa), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CTX_use_RSAPrivateKey(ctx, rsa), WOLFSSL_SUCCESS); - /*i2d RSAprivate key tests */ - AssertIntEQ(wolfSSL_i2d_RSAPrivateKey(NULL, NULL), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, NULL), 1192); - AssertIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, &bufPtr), + /* i2d RSAprivate key tests */ + ExpectIntEQ(wolfSSL_i2d_RSAPrivateKey(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, NULL), 1192); + ExpectIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, &bufPtr), sizeof_client_key_der_2048); bufPtr -= sizeof_client_key_der_2048; - AssertIntEQ(XMEMCMP(bufPtr, client_key_der_2048, + ExpectIntEQ(XMEMCMP(bufPtr, client_key_der_2048, sizeof_client_key_der_2048), 0); bufPtr = NULL; - AssertIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, &bufPtr), + ExpectIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, &bufPtr), sizeof_client_key_der_2048); - AssertNotNull(bufPtr); - AssertIntEQ(XMEMCMP(bufPtr, client_key_der_2048, + ExpectNotNull(bufPtr); + ExpectIntEQ(XMEMCMP(bufPtr, client_key_der_2048, sizeof_client_key_der_2048), 0); XFREE(bufPtr, NULL, DYNAMIC_TYPE_OPENSSL); RSA_free(rsa); rsa = RSA_new(); - AssertIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, NULL), 0); + ExpectIntEQ(wolfSSL_i2d_RSAPrivateKey(rsa, NULL), 0); #endif /* USE_CERT_BUFFERS_2048 WOLFSSL_KEY_GEN */ RSA_free(rsa); } -#endif /* !HAVE_FAST_RSA && WOLFSSL_KEY_GEN && !NO_RSA && !HAVE_USER_RSA*/ +#endif /* WOLFSSL_KEY_GEN && !NO_RSA */ SSL_CTX_free(ctx); ctx = NULL; BIO_free(bio); bio = NULL; - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } -#endif /* OPENSSL_ALL || WOLFSSL_ASIO */ +#endif /* OPENSSL_ALL || (WOLFSSL_ASIO && !NO_RSA) */ #endif /* !NO_BIO */ static int test_wolfSSL_sk_GENERAL_NAME(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_RSA) - X509* x509; - GENERAL_NAME* gn; + X509* x509 = NULL; + GENERAL_NAME* gn = NULL; unsigned char buf[4096]; - const unsigned char* bufPt; - int bytes, i; + const unsigned char* bufPt = NULL; + int bytes = 0; + int i; int j; + XFILE f = XBADFILE; + STACK_OF(GENERAL_NAME)* sk = NULL; - XFILE f; - STACK_OF(GENERAL_NAME)* sk; - - f = XFOPEN(cliCertDerFileExt, "rb"); - AssertTrue((f != XBADFILE)); - AssertIntGT((bytes = (int)XFREAD(buf, 1, sizeof(buf), f)), 0); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(cliCertDerFileExt, "rb")) != XBADFILE); + ExpectIntGT((bytes = (int)XFREAD(buf, 1, sizeof(buf), f)), 0); + if (f != XBADFILE) + XFCLOSE(f); for (j = 0; j < 2; ++j) { bufPt = buf; - AssertNotNull(x509 = d2i_X509(NULL, &bufPt, bytes)); + ExpectNotNull(x509 = d2i_X509(NULL, &bufPt, bytes)); - AssertNotNull(sk = (STACK_OF(ASN1_OBJECT)*)X509_get_ext_d2i(x509, + ExpectNotNull(sk = (STACK_OF(ASN1_OBJECT)*)X509_get_ext_d2i(x509, NID_subject_alt_name, NULL, NULL)); - AssertIntEQ(sk_GENERAL_NAME_num(sk), 1); + ExpectIntEQ(sk_GENERAL_NAME_num(sk), 1); for (i = 0; i < sk_GENERAL_NAME_num(sk); i++) { - AssertNotNull(gn = sk_GENERAL_NAME_value(sk, i)); + ExpectNotNull(gn = sk_GENERAL_NAME_value(sk, i)); - switch (gn->type) { - case GEN_DNS: - fprintf(stderr, "found type GEN_DNS\n"); - break; - case GEN_EMAIL: - fprintf(stderr, "found type GEN_EMAIL\n"); - break; - case GEN_URI: - fprintf(stderr, "found type GEN_URI\n"); - break; + if (gn != NULL) { + switch (gn->type) { + case GEN_DNS: + fprintf(stderr, "found type GEN_DNS\n"); + break; + case GEN_EMAIL: + fprintf(stderr, "found type GEN_EMAIL\n"); + break; + case GEN_URI: + fprintf(stderr, "found type GEN_URI\n"); + break; + } } } X509_free(x509); + x509 = NULL; if (j == 0) { sk_GENERAL_NAME_pop_free(sk, GENERAL_NAME_free); } @@ -46794,30 +58501,30 @@ */ GENERAL_NAMES_free(sk); } + sk = NULL; } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_GENERAL_NAME_print(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_BIO) && !defined(NO_RSA) - X509* x509; - GENERAL_NAME* gn; + X509* x509 = NULL; + GENERAL_NAME* gn = NULL; unsigned char buf[4096]; - const unsigned char* bufPt; + const unsigned char* bufPt = NULL; int bytes; - XFILE f; - STACK_OF(GENERAL_NAME)* sk; - BIO* out; + XFILE f = XBADFILE; + STACK_OF(GENERAL_NAME)* sk = NULL; + BIO* out = NULL; unsigned char outbuf[128]; - X509_EXTENSION* ext; - AUTHORITY_INFO_ACCESS* aia; - ACCESS_DESCRIPTION* ad; + X509_EXTENSION* ext = NULL; + AUTHORITY_INFO_ACCESS* aia = NULL; + ACCESS_DESCRIPTION* ad = NULL; + ASN1_IA5STRING *dnsname = NULL; const unsigned char v4Addr[] = {192,168,53,1}; const unsigned char v6Addr[] = @@ -46837,507 +58544,378 @@ const char* ediStr = "EdiPartyName:"; /* BIO to output */ - AssertNotNull(out = BIO_new(BIO_s_mem())); + ExpectNotNull(out = BIO_new(BIO_s_mem())); /* test for NULL param */ gn = NULL; - AssertIntEQ(GENERAL_NAME_print(NULL, NULL), 0); - AssertIntEQ(GENERAL_NAME_print(NULL, gn), 0); - AssertIntEQ(GENERAL_NAME_print(out, NULL), 0); + ExpectIntEQ(GENERAL_NAME_print(NULL, NULL), 0); + ExpectIntEQ(GENERAL_NAME_print(NULL, gn), 0); + ExpectIntEQ(GENERAL_NAME_print(out, NULL), 0); /* test for GEN_DNS */ - f = XFOPEN(cliCertDerFileExt, "rb"); - AssertTrue((f != XBADFILE)); - AssertIntGT((bytes = (int)XFREAD(buf, 1, sizeof(buf), f)), 0); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(cliCertDerFileExt, "rb")) != XBADFILE); + ExpectIntGT((bytes = (int)XFREAD(buf, 1, sizeof(buf), f)), 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } bufPt = buf; - AssertNotNull(x509 = d2i_X509(NULL, &bufPt, bytes)); - AssertNotNull(sk = (STACK_OF(ASN1_OBJECT)*)X509_get_ext_d2i(x509, + ExpectNotNull(x509 = d2i_X509(NULL, &bufPt, bytes)); + ExpectNotNull(sk = (STACK_OF(ASN1_OBJECT)*)X509_get_ext_d2i(x509, NID_subject_alt_name, NULL, NULL)); - AssertNotNull(gn = sk_GENERAL_NAME_value(sk, 0)); - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + ExpectNotNull(gn = sk_GENERAL_NAME_value(sk, 0)); + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); - XMEMSET(outbuf,0,sizeof(outbuf)); - BIO_read(out, outbuf, sizeof(outbuf)); - AssertIntEQ(XSTRNCMP((const char*)outbuf, dnsStr, XSTRLEN(dnsStr)), 0); + XMEMSET(outbuf, 0, sizeof(outbuf)); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, dnsStr, XSTRLEN(dnsStr)), 0); sk_GENERAL_NAME_pop_free(sk, GENERAL_NAME_free); + gn = NULL; + sk = NULL; X509_free(x509); + x509 = NULL; + + /* Lets test for setting as well. */ + ExpectNotNull(gn = GENERAL_NAME_new()); + ExpectNotNull(dnsname = ASN1_IA5STRING_new()); + ExpectIntEQ(ASN1_STRING_set(dnsname, "example.com", -1), 1); + GENERAL_NAME_set0_value(gn, GEN_DNS, dnsname); + dnsname = NULL; + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); + XMEMSET(outbuf, 0, sizeof(outbuf)); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, dnsStr, XSTRLEN(dnsStr)), 0); + GENERAL_NAME_free(gn); /* test for GEN_URI */ - f = XFOPEN("./certs/ocsp/root-ca-cert.pem", "rb"); - AssertTrue((f != XBADFILE)); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); - XFCLOSE(f); + ExpectTrue((f = XFOPEN("./certs/ocsp/root-ca-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, 4)); - aia = (WOLFSSL_AUTHORITY_INFO_ACCESS*)wolfSSL_X509V3_EXT_d2i(ext); - AssertNotNull(aia); - ad = (WOLFSSL_ACCESS_DESCRIPTION *)wolfSSL_sk_value(aia, 0); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, 4)); + ExpectNotNull(aia = (WOLFSSL_AUTHORITY_INFO_ACCESS*)wolfSSL_X509V3_EXT_d2i( + ext)); + ExpectNotNull(ad = (WOLFSSL_ACCESS_DESCRIPTION *)wolfSSL_sk_value(aia, 0)); - gn = ad->location; - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + if (ad != NULL) { + gn = ad->location; + } + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); + gn = NULL; XMEMSET(outbuf,0,sizeof(outbuf)); - AssertIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); - AssertIntEQ(XSTRNCMP((const char*)outbuf, uriStr, XSTRLEN(uriStr)), 0); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, uriStr, XSTRLEN(uriStr)), 0); wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL); + aia = NULL; aia = (AUTHORITY_INFO_ACCESS*)wolfSSL_X509V3_EXT_d2i(ext); - AssertNotNull(aia); + ExpectNotNull(aia); AUTHORITY_INFO_ACCESS_pop_free(aia, NULL); + aia = NULL; X509_free(x509); + x509 = NULL; /* test for GEN_IPADD */ /* ip v4 address */ - AssertNotNull(gn = wolfSSL_GENERAL_NAME_new()); - gn->type = GEN_IPADD; - gn->d.iPAddress->length = sizeof(v4Addr); - AssertIntEQ(wolfSSL_ASN1_STRING_set(gn->d.iPAddress, v4Addr, - sizeof(v4Addr)), 1); + ExpectNotNull(gn = wolfSSL_GENERAL_NAME_new()); + if (gn != NULL) { + gn->type = GEN_IPADD; + if (gn->d.iPAddress != NULL) { + gn->d.iPAddress->length = sizeof(v4Addr); + } + } + ExpectIntEQ(wolfSSL_ASN1_STRING_set(gn->d.iPAddress, v4Addr, + sizeof(v4Addr)), 1); - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); XMEMSET(outbuf,0,sizeof(outbuf)); - AssertIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); - AssertIntEQ(XSTRNCMP((const char*)outbuf, v4addStr, XSTRLEN(v4addStr)), 0); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, v4addStr, XSTRLEN(v4addStr)), 0); GENERAL_NAME_free(gn); + gn = NULL; /* ip v6 address */ - AssertNotNull(gn = wolfSSL_GENERAL_NAME_new()); - gn->type = GEN_IPADD; - gn->d.iPAddress->length = sizeof(v6Addr); - AssertIntEQ(wolfSSL_ASN1_STRING_set(gn->d.iPAddress, v6Addr, - sizeof(v6Addr)), 1); + ExpectNotNull(gn = wolfSSL_GENERAL_NAME_new()); + if (gn != NULL) { + gn->type = GEN_IPADD; + if (gn->d.iPAddress != NULL) { + gn->d.iPAddress->length = sizeof(v6Addr); + } + } + ExpectIntEQ(wolfSSL_ASN1_STRING_set(gn->d.iPAddress, v6Addr, + sizeof(v6Addr)), 1); - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); XMEMSET(outbuf,0,sizeof(outbuf)); - AssertIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); - AssertIntEQ(XSTRNCMP((const char*)outbuf, v6addStr, XSTRLEN(v6addStr)), 0); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, v6addStr, XSTRLEN(v6addStr)), 0); GENERAL_NAME_free(gn); + gn = NULL; /* test for GEN_EMAIL */ - AssertNotNull(gn = wolfSSL_GENERAL_NAME_new()); - gn->type = GEN_EMAIL; - gn->d.rfc822Name->length = sizeof(email); - AssertIntEQ(wolfSSL_ASN1_STRING_set(gn->d.rfc822Name, email, - sizeof(email)), 1); + ExpectNotNull(gn = wolfSSL_GENERAL_NAME_new()); + if (gn != NULL) { + gn->type = GEN_EMAIL; + if (gn->d.rfc822Name != NULL) { + gn->d.rfc822Name->length = sizeof(email); + } + } + ExpectIntEQ(wolfSSL_ASN1_STRING_set(gn->d.rfc822Name, email, sizeof(email)), + 1); - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); XMEMSET(outbuf,0,sizeof(outbuf)); - AssertIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); - AssertIntEQ(XSTRNCMP((const char*)outbuf, emailStr, XSTRLEN(emailStr)), 0); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, emailStr, XSTRLEN(emailStr)), 0); GENERAL_NAME_free(gn); + gn = NULL; /* test for GEN_OTHERNAME */ - AssertNotNull(gn = wolfSSL_GENERAL_NAME_new()); - gn->type = GEN_OTHERNAME; + ExpectNotNull(gn = wolfSSL_GENERAL_NAME_new()); + if (gn != NULL) { + gn->type = GEN_OTHERNAME; + } - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); XMEMSET(outbuf,0,sizeof(outbuf)); - AssertIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); - AssertIntEQ(XSTRNCMP((const char*)outbuf, othrStr, XSTRLEN(othrStr)), 0); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, othrStr, XSTRLEN(othrStr)), 0); GENERAL_NAME_free(gn); + gn = NULL; /* test for GEN_X400 */ - AssertNotNull(gn = wolfSSL_GENERAL_NAME_new()); - gn->type = GEN_X400; + ExpectNotNull(gn = wolfSSL_GENERAL_NAME_new()); + if (gn != NULL) { + gn->type = GEN_X400; + } - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); XMEMSET(outbuf,0,sizeof(outbuf)); - AssertIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); - AssertIntEQ(XSTRNCMP((const char*)outbuf, x400Str, XSTRLEN(x400Str)), 0); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, x400Str, XSTRLEN(x400Str)), 0); /* Restore to GEN_IA5 (default) to avoid memory leak. */ - gn->type = GEN_IA5; + if (gn != NULL) { + gn->type = GEN_IA5; + } GENERAL_NAME_free(gn); + gn = NULL; /* test for GEN_EDIPARTY */ - AssertNotNull(gn = wolfSSL_GENERAL_NAME_new()); - gn->type = GEN_EDIPARTY; + ExpectNotNull(gn = wolfSSL_GENERAL_NAME_new()); + if (gn != NULL) { + gn->type = GEN_EDIPARTY; + } - AssertIntEQ(GENERAL_NAME_print(out, gn), 1); + ExpectIntEQ(GENERAL_NAME_print(out, gn), 1); XMEMSET(outbuf,0,sizeof(outbuf)); - AssertIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); - AssertIntEQ(XSTRNCMP((const char*)outbuf, ediStr, XSTRLEN(ediStr)), 0); + ExpectIntGT(BIO_read(out, outbuf, sizeof(outbuf)), 0); + ExpectIntEQ(XSTRNCMP((const char*)outbuf, ediStr, XSTRLEN(ediStr)), 0); /* Restore to GEN_IA5 (default) to avoid memory leak. */ - gn->type = GEN_IA5; + if (gn != NULL) { + gn->type = GEN_IA5; + } GENERAL_NAME_free(gn); + gn = NULL; BIO_free(out); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_ALL */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_sk_DIST_POINT(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ !defined(NO_RSA) - X509* x509; + X509* x509 = NULL; unsigned char buf[4096]; const unsigned char* bufPt; - int bytes, i, j; - XFILE f; - DIST_POINT* dp; - DIST_POINT_NAME* dpn; - GENERAL_NAME* gn; - ASN1_IA5STRING* uri; - STACK_OF(DIST_POINT)* dps; - STACK_OF(GENERAL_NAME)* gns; + int bytes = 0; + int i = 0; + int j = 0; + XFILE f = XBADFILE; + DIST_POINT* dp = NULL; + DIST_POINT_NAME* dpn = NULL; + GENERAL_NAME* gn = NULL; + ASN1_IA5STRING* uri = NULL; + STACK_OF(DIST_POINT)* dps = NULL; + STACK_OF(GENERAL_NAME)* gns = NULL; const char cliCertDerCrlDistPoint[] = "./certs/client-crl-dist.der"; - f = XFOPEN(cliCertDerCrlDistPoint, "rb"); - AssertTrue((f != XBADFILE)); - AssertIntGT((bytes = (int)XFREAD(buf, 1, sizeof(buf), f)), 0); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(cliCertDerCrlDistPoint, "rb")) != XBADFILE); + ExpectIntGT((bytes = (int)XFREAD(buf, 1, sizeof(buf), f)), 0); + if (f != XBADFILE) + XFCLOSE(f); bufPt = buf; - AssertNotNull(x509 = d2i_X509(NULL, &bufPt, bytes)); + ExpectNotNull(x509 = d2i_X509(NULL, &bufPt, bytes)); - AssertNotNull(dps = (STACK_OF(DIST_POINT)*)X509_get_ext_d2i(x509, - NID_crl_distribution_points, NULL, NULL)); + ExpectNotNull(dps = (STACK_OF(DIST_POINT)*)X509_get_ext_d2i(x509, + NID_crl_distribution_points, NULL, NULL)); - AssertIntEQ(sk_DIST_POINT_num(dps), 1); + ExpectIntEQ(sk_DIST_POINT_num(dps), 1); for (i = 0; i < sk_DIST_POINT_num(dps); i++) { - AssertNotNull(dp = sk_DIST_POINT_value(dps, i)); - AssertNotNull(dpn = dp->distpoint); + ExpectNotNull(dp = sk_DIST_POINT_value(dps, i)); + ExpectNotNull(dpn = dp->distpoint); /* this should be type 0, fullname */ - AssertIntEQ(dpn->type, 0); + ExpectIntEQ(dpn->type, 0); - gns = dp->distpoint->name.fullname; - AssertNotNull(gns); - AssertIntEQ(sk_GENERAL_NAME_num(gns), 1); + ExpectNotNull(gns = dp->distpoint->name.fullname); + ExpectIntEQ(sk_GENERAL_NAME_num(gns), 1); for (j = 0; j < sk_GENERAL_NAME_num(gns); j++) { - gn = sk_GENERAL_NAME_value(gns, j); - AssertIntEQ(gn->type, GEN_URI); - AssertNotNull(uri = gn->d.uniformResourceIdentifier); - AssertNotNull(uri->data); - AssertIntGT(uri->length, 0); + ExpectNotNull(gn = sk_GENERAL_NAME_value(gns, j)); + ExpectIntEQ(gn->type, GEN_URI); + ExpectNotNull(uri = gn->d.uniformResourceIdentifier); + ExpectNotNull(uri->data); + ExpectIntGT(uri->length, 0); } } X509_free(x509); CRL_DIST_POINTS_free(dps); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } -static int test_wolfSSL_MD4(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_MD4) - MD4_CTX md4; - unsigned char out[16]; /* MD4_DIGEST_SIZE */ - const char* msg = "12345678901234567890123456789012345678901234567890123456" - "789012345678901234567890"; - const char* test = "\xe3\x3b\x4d\xdc\x9c\x38\xf2\x19\x9c\x3e\x7b\x16\x4f" - "\xcc\x05\x36"; - int msgSz = (int)XSTRLEN(msg); - - - XMEMSET(out, 0, sizeof(out)); - MD4_Init(&md4); - MD4_Update(&md4, (const void*)msg, (unsigned long)msgSz); - MD4_Final(out, &md4); - AssertIntEQ(XMEMCMP(out, test, sizeof(out)), 0); - - res = TEST_RES_CHECK(1); -#endif - return res; -} static int test_wolfSSL_verify_mode(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_RSA) - WOLFSSL* ssl; - WOLFSSL_CTX* ctx; - - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + WOLFSSL* ssl = NULL; + WOLFSSL_CTX* ctx = NULL; - AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, SSL_FILETYPE_PEM)); - AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, SSL_FILETYPE_PEM)); - AssertIntEQ(wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0), SSL_SUCCESS); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); - AssertNotNull(ssl = SSL_new(ctx)); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); + ExpectNotNull(ssl = SSL_new(ctx)); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); SSL_free(ssl); + ssl = NULL; SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); - AssertNotNull(ssl = SSL_new(ctx)); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_PEER); + ExpectNotNull(ssl = SSL_new(ctx)); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_PEER); wolfSSL_set_verify(ssl, SSL_VERIFY_NONE, 0); - AssertIntEQ(SSL_CTX_get_verify_mode(ctx), SSL_VERIFY_PEER); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_NONE); + ExpectIntEQ(SSL_CTX_get_verify_mode(ctx), SSL_VERIFY_PEER); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_NONE); SSL_free(ssl); + ssl = NULL; wolfSSL_CTX_set_verify(ctx, - WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); - AssertNotNull(ssl = SSL_new(ctx)); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); - AssertIntEQ(SSL_get_verify_mode(ssl), - WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); + WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); + ExpectNotNull(ssl = SSL_new(ctx)); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_CTX_get_verify_mode(ctx)); + ExpectIntEQ(SSL_get_verify_mode(ssl), + WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); wolfSSL_set_verify(ssl, SSL_VERIFY_PEER, 0); - AssertIntEQ(SSL_CTX_get_verify_mode(ctx), - WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_PEER); + ExpectIntEQ(SSL_CTX_get_verify_mode(ctx), + WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_PEER); wolfSSL_set_verify(ssl, SSL_VERIFY_NONE, 0); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_NONE); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_NONE); wolfSSL_set_verify(ssl, SSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_FAIL_IF_NO_PEER_CERT); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_FAIL_IF_NO_PEER_CERT); wolfSSL_set_verify(ssl, SSL_VERIFY_FAIL_EXCEPT_PSK, 0); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_FAIL_EXCEPT_PSK); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_FAIL_EXCEPT_PSK); #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) wolfSSL_set_verify(ssl, SSL_VERIFY_POST_HANDSHAKE, 0); - AssertIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_POST_HANDSHAKE); + ExpectIntEQ(SSL_get_verify_mode(ssl), SSL_VERIFY_POST_HANDSHAKE); #endif - AssertIntEQ(SSL_CTX_get_verify_mode(ctx), - WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); + ExpectIntEQ(SSL_CTX_get_verify_mode(ctx), + WOLFSSL_VERIFY_PEER | WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT); SSL_free(ssl); SSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_verify_depth(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_WOLFSSL_CLIENT) - WOLFSSL* ssl; - WOLFSSL_CTX* ctx; + WOLFSSL* ssl = NULL; + WOLFSSL_CTX* ctx = NULL; long depth; - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ExpectIntGT((depth = SSL_CTX_get_verify_depth(ctx)), 0); - AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, SSL_FILETYPE_PEM)); - AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, SSL_FILETYPE_PEM)); - AssertIntEQ(wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0), SSL_SUCCESS); - - AssertIntGT((depth = SSL_CTX_get_verify_depth(ctx)), 0); - AssertNotNull(ssl = SSL_new(ctx)); - AssertIntEQ(SSL_get_verify_depth(ssl), SSL_CTX_get_verify_depth(ctx)); + ExpectNotNull(ssl = SSL_new(ctx)); + ExpectIntEQ(SSL_get_verify_depth(ssl), SSL_CTX_get_verify_depth(ctx)); SSL_free(ssl); + ssl = NULL; SSL_CTX_set_verify_depth(ctx, -1); - AssertIntEQ(depth, SSL_CTX_get_verify_depth(ctx)); + ExpectIntEQ(depth, SSL_CTX_get_verify_depth(ctx)); SSL_CTX_set_verify_depth(ctx, 2); - AssertIntEQ(2, SSL_CTX_get_verify_depth(ctx)); - AssertNotNull(ssl = SSL_new(ctx)); - AssertIntEQ(2, SSL_get_verify_depth(ssl)); + ExpectIntEQ(2, SSL_CTX_get_verify_depth(ctx)); + ExpectNotNull(ssl = SSL_new(ctx)); + ExpectIntEQ(2, SSL_get_verify_depth(ssl)); SSL_free(ssl); SSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; -} - -#if defined(OPENSSL_EXTRA) && !defined(NO_HMAC) -/* helper function for test_wolfSSL_HMAC_CTX, digest size is expected to be a - * buffer of 64 bytes. - * - * returns the size of the digest buffer on success and a negative value on - * failure. - */ -static int test_HMAC_CTX_helper(const EVP_MD* type, unsigned char* digest) -{ - HMAC_CTX ctx1; - HMAC_CTX ctx2; - - unsigned char key[] = "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b" - "\x0b\x0b\x0b\x0b\x0b\x0b\x0b"; - unsigned char long_key[] = - "0123456789012345678901234567890123456789" - "0123456789012345678901234567890123456789" - "0123456789012345678901234567890123456789" - "0123456789012345678901234567890123456789"; - - unsigned char msg[] = "message to hash"; - unsigned int digestSz = 64; - int keySz = sizeof(key); - int long_keySz = sizeof(long_key); - int msgSz = sizeof(msg); - - unsigned char digest2[64]; - unsigned int digestSz2 = 64; - - HMAC_CTX_init(&ctx1); - - AssertIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); - - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx1); - - AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx2, digest2, &digestSz2), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx2); - - AssertIntEQ(digestSz, digestSz2); - AssertIntEQ(XMEMCMP(digest, digest2, digestSz), 0); - - /* test HMAC_Init with NULL key */ - - /* init after copy */ - HMAC_CTX_init(&ctx1); - AssertIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); - - AssertIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx1); - - AssertIntEQ(HMAC_Init(&ctx2, NULL, 0, NULL), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx2, digest2, &digestSz), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx2); - - AssertIntEQ(digestSz, digestSz2); - AssertIntEQ(XMEMCMP(digest, digest2, digestSz), 0); - - /* long key */ - HMAC_CTX_init(&ctx1); - AssertIntEQ(HMAC_Init(&ctx1, (const void*)long_key, long_keySz, type), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); - - AssertIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx1); - - AssertIntEQ(HMAC_Init(&ctx2, NULL, 0, NULL), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx2, digest2, &digestSz), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx2); - - AssertIntEQ(digestSz, digestSz2); - AssertIntEQ(XMEMCMP(digest, digest2, digestSz), 0); - - /* init before copy */ - HMAC_CTX_init(&ctx1); - AssertIntEQ(HMAC_Init(&ctx1, (const void*)key, keySz, type), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Init(&ctx1, NULL, 0, NULL), SSL_SUCCESS); - AssertIntEQ(HMAC_CTX_copy(&ctx2, &ctx1), SSL_SUCCESS); - - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx1, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx1, digest, &digestSz), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx1); - - AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Update(&ctx2, msg, msgSz), SSL_SUCCESS); - AssertIntEQ(HMAC_Final(&ctx2, digest2, &digestSz), SSL_SUCCESS); - HMAC_CTX_cleanup(&ctx2); - - AssertIntEQ(digestSz, digestSz2); - AssertIntEQ(XMEMCMP(digest, digest2, digestSz), 0); - - return digestSz; + return EXPECT_RESULT(); } -#endif /* defined(OPENSSL_EXTRA) && !defined(NO_HMAC) */ -static int test_wolfSSL_HMAC_CTX(void) +static int test_wolfSSL_verify_result(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_HMAC) - unsigned char digest[64]; - int digestSz; - - #ifndef NO_SHA - AssertIntEQ((digestSz = test_HMAC_CTX_helper(EVP_sha1(), digest)), 20); - AssertIntEQ(XMEMCMP("\xD9\x68\x77\x23\x70\xFB\x53\x70\x53\xBA\x0E\xDC\xDA" - "\xBF\x03\x98\x31\x19\xB2\xCC", digest, digestSz), 0); - #endif /* !NO_SHA */ - #ifdef WOLFSSL_SHA224 - AssertIntEQ((digestSz = test_HMAC_CTX_helper(EVP_sha224(), digest)), 28); - AssertIntEQ(XMEMCMP("\x57\xFD\xF4\xE1\x2D\xB0\x79\xD7\x4B\x25\x7E\xB1\x95" - "\x9C\x11\xAC\x2D\x1E\x78\x94\x4F\x3A\x0F\xED\xF8\xAD" - "\x02\x0E", digest, digestSz), 0); - - #endif /* WOLFSSL_SHA224 */ - #ifndef NO_SHA256 - AssertIntEQ((digestSz = test_HMAC_CTX_helper(EVP_sha256(), digest)), 32); - AssertIntEQ(XMEMCMP("\x13\xAB\x76\x91\x0C\x37\x86\x8D\xB3\x7E\x30\x0C\xFC" - "\xB0\x2E\x8E\x4A\xD7\xD4\x25\xCC\x3A\xA9\x0F\xA2\xF2" - "\x47\x1E\x62\x6F\x5D\xF2", digest, digestSz), 0); + EXPECT_DECLS; +#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ + defined(OPENSSL_ALL)) && !defined(NO_WOLFSSL_CLIENT) + WOLFSSL* ssl = NULL; + WOLFSSL_CTX* ctx = NULL; + long result = 0xDEADBEEF; - #endif /* !NO_SHA256 */ + ExpectIntEQ(WOLFSSL_FAILURE, wolfSSL_get_verify_result(ssl)); - #ifdef WOLFSSL_SHA384 - AssertIntEQ((digestSz = test_HMAC_CTX_helper(EVP_sha384(), digest)), 48); - AssertIntEQ(XMEMCMP("\x9E\xCB\x07\x0C\x11\x76\x3F\x23\xC3\x25\x0E\xC4\xB7" - "\x28\x77\x95\x99\xD5\x9D\x7A\xBB\x1A\x9F\xB7\xFD\x25" - "\xC9\x72\x47\x9F\x8F\x86\x76\xD6\x20\x57\x87\xB7\xE7" - "\xCD\xFB\xC2\xCC\x9F\x2B\xC5\x41\xAB", - digest, digestSz), 0); - #endif /* WOLFSSL_SHA384 */ - #ifdef WOLFSSL_SHA512 - AssertIntEQ((digestSz = test_HMAC_CTX_helper(EVP_sha512(), digest)), 64); - AssertIntEQ(XMEMCMP("\xD4\x21\x0C\x8B\x60\x6F\xF4\xBF\x07\x2F\x26\xCC\xAD" - "\xBC\x06\x0B\x34\x78\x8B\x4F\xD6\xC0\x42\xF1\x33\x10" - "\x6C\x4F\x1E\x55\x59\xDD\x2A\x9F\x15\x88\x62\xF8\x60" - "\xA3\x99\x91\xE2\x08\x7B\xF7\x95\x3A\xB0\x92\x48\x60" - "\x88\x8B\x5B\xB8\x5F\xE9\xB6\xB1\x96\xE3\xB5\xF0", - digest, digestSz), 0); - #endif /* WOLFSSL_SHA512 */ + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ExpectNotNull(ssl = SSL_new(ctx)); - #if !defined(NO_MD5) && (!defined(HAVE_FIPS_VERSION) || HAVE_FIPS_VERSION <= 2) - AssertIntEQ((digestSz = test_HMAC_CTX_helper(EVP_md5(), digest)), 16); - AssertIntEQ(XMEMCMP("\xB7\x27\xC4\x41\xE5\x2E\x62\xBA\x54\xED\x72\x70\x9F" - "\xE4\x98\xDD", digest, digestSz), 0); - #endif /* !NO_MD5 */ + wolfSSL_set_verify_result(ssl, result); + ExpectIntEQ(result, wolfSSL_get_verify_result(ssl)); - res = TEST_RES_CHECK(1); + SSL_free(ssl); + SSL_CTX_free(ctx); #endif - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_WOLFSSL_CLIENT) @@ -47358,124 +58936,21 @@ static int test_wolfSSL_msg_callback(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_WOLFSSL_CLIENT) - WOLFSSL* ssl; - WOLFSSL_CTX* ctx; - - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); - - AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, - SSL_FILETYPE_PEM)); - AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, - SSL_FILETYPE_PEM)); - AssertIntEQ(wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0), - SSL_SUCCESS); + WOLFSSL* ssl = NULL; + WOLFSSL_CTX* ctx = NULL; - AssertNotNull(ssl = SSL_new(ctx)); - AssertIntEQ(SSL_set_msg_callback(ssl, NULL), SSL_SUCCESS); - AssertIntEQ(SSL_set_msg_callback(ssl, &sslMsgCb), SSL_SUCCESS); - AssertIntEQ(SSL_set_msg_callback(NULL, &sslMsgCb), SSL_FAILURE); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + ExpectNotNull(ssl = SSL_new(ctx)); + ExpectIntEQ(SSL_set_msg_callback(ssl, NULL), SSL_SUCCESS); + ExpectIntEQ(SSL_set_msg_callback(ssl, &sslMsgCb), SSL_SUCCESS); + ExpectIntEQ(SSL_set_msg_callback(NULL, &sslMsgCb), SSL_FAILURE); SSL_free(ssl); SSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); -#endif - return res; -} - -static int test_wolfSSL_SHA(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(HAVE_SELFTEST) - #if !defined(NO_SHA) && defined(NO_OLD_SHA_NAMES) && \ - (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) - { - const unsigned char in[] = "abc"; - unsigned char expected[] = "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E" - "\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D"; - unsigned char out[WC_SHA_DIGEST_SIZE]; - - XMEMSET(out, 0, WC_SHA_DIGEST_SIZE); - AssertNotNull(SHA1(in, XSTRLEN((char*)in), out)); - AssertIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); - - /* SHA interface test */ - XMEMSET(out, 0, WC_SHA_DIGEST_SIZE); - - AssertNull(SHA(NULL, XSTRLEN((char*)in), out)); - AssertNotNull(SHA(in, 0, out)); - AssertNotNull(SHA(in, XSTRLEN((char*)in), NULL)); - AssertNotNull(SHA(NULL, 0, out)); - AssertNotNull(SHA(NULL, 0, NULL)); - - AssertNotNull(SHA(in, XSTRLEN((char*)in), out)); - AssertIntEQ(XMEMCMP(out, expected, WC_SHA_DIGEST_SIZE), 0); - } - #endif - - #if !defined(NO_SHA256) - { - const unsigned char in[] = "abc"; - unsigned char expected[] = "\xBA\x78\x16\xBF\x8F\x01\xCF\xEA\x41\x41\x40\xDE\x5D\xAE\x22" - "\x23\xB0\x03\x61\xA3\x96\x17\x7A\x9C\xB4\x10\xFF\x61\xF2\x00" - "\x15\xAD"; - unsigned char out[WC_SHA256_DIGEST_SIZE]; - - XMEMSET(out, 0, WC_SHA256_DIGEST_SIZE); -#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) - AssertNotNull(SHA256(in, XSTRLEN((char*)in), out)); -#else - AssertNotNull(wolfSSL_SHA256(in, XSTRLEN((char*)in), out)); -#endif - AssertIntEQ(XMEMCMP(out, expected, WC_SHA256_DIGEST_SIZE), 0); - } - #endif - - #if defined(WOLFSSL_SHA384) - { - const unsigned char in[] = "abc"; - unsigned char expected[] = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50" - "\x07\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff" - "\x5b\xed\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34" - "\xc8\x25\xa7"; - unsigned char out[WC_SHA384_DIGEST_SIZE]; - - XMEMSET(out, 0, WC_SHA384_DIGEST_SIZE); -#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) - AssertNotNull(SHA384(in, XSTRLEN((char*)in), out)); -#else - AssertNotNull(wolfSSL_SHA384(in, XSTRLEN((char*)in), out)); -#endif - AssertIntEQ(XMEMCMP(out, expected, WC_SHA384_DIGEST_SIZE), 0); - } - #endif - - #if defined(WOLFSSL_SHA512) - { - const unsigned char in[] = "abc"; - unsigned char expected[] = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba\xcc\x41\x73\x49\xae\x20\x41" - "\x31\x12\xe6\xfa\x4e\x89\xa9\x7e\xa2\x0a\x9e\xee\xe6\x4b\x55" - "\xd3\x9a\x21\x92\x99\x2a\x27\x4f\xc1\xa8\x36\xba\x3c\x23\xa3" - "\xfe\xeb\xbd\x45\x4d\x44\x23\x64\x3c\xe8\x0e\x2a\x9a\xc9\x4f" - "\xa5\x4c\xa4\x9f"; - unsigned char out[WC_SHA512_DIGEST_SIZE]; - - XMEMSET(out, 0, WC_SHA512_DIGEST_SIZE); -#if !defined(NO_OLD_NAMES) && !defined(HAVE_FIPS) - AssertNotNull(SHA512(in, XSTRLEN((char*)in), out)); -#else - AssertNotNull(wolfSSL_SHA512(in, XSTRLEN((char*)in), out)); -#endif - AssertIntEQ(XMEMCMP(out, expected, WC_SHA512_DIGEST_SIZE), 0); - } - #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* test_EVP_Cipher_extra, Extra-test on EVP_CipherUpdate/Final. see also test.c */ @@ -47555,10 +59030,9 @@ static int test_wolfSSL_EVP_Cipher_extra(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) &&\ (!defined(NO_AES) && defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128)) - /* aes128-cbc, keylen=16, ivlen=16 */ byte aes128_cbc_key[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, @@ -47598,7 +59072,8 @@ byte inb[BUFFSZ]; byte outb[BUFFSZ+16]; - int outl, inl; + int outl = 0; + int inl; iv = aes128_cbc_iv; ivlen = sizeof(aes128_cbc_iv); @@ -47606,748 +59081,279 @@ keylen = sizeof(aes128_cbc_key); type = EVP_aes_128_cbc(); - set_plain(plain, BUFFSZ * RECORDS); - - SSL_library_init(); - - AssertNotNull(evp = EVP_CIPHER_CTX_new()); - AssertIntNE((ret = EVP_CipherInit(evp, type, NULL, iv, 0)), 0); - - AssertIntEQ(EVP_CIPHER_CTX_nid(evp), NID_aes_128_cbc); - - klen = EVP_CIPHER_CTX_key_length(evp); - if (klen > 0 && keylen != klen) { - AssertIntNE(EVP_CIPHER_CTX_set_key_length(evp, keylen), 0); - } - ilen = EVP_CIPHER_CTX_iv_length(evp); - if (ilen > 0 && ivlen != ilen) { - AssertIntNE(EVP_CIPHER_CTX_set_iv_length(evp, ivlen), 0); - } - - AssertIntNE((ret = EVP_CipherInit(evp, NULL, key, iv, 1)), 0); - - for (j = 0; j 0) - set_record(cipher, outb, outl); - } - - for (i = 0; test_drive[i]; i++) { - - last_val = 0x0f; - - AssertIntNE((ret = EVP_CipherInit(evp, NULL, key, iv, 0)), 0); - - init_offset(); - - for (j = 0; test_drive[i][j]; j++) { - inl = test_drive[i][j]; - get_record(cipher, inb, inl); - - AssertIntNE((ret = EVP_DecryptUpdate(evp, outb, &outl, inb, inl)), 0); - - binary_dump(outb, outl); - AssertIntEQ((ret = check_result(outb, outl)), 0); - AssertFalse(outl > ((inl/16+1)*16) && outl > 16); - } - - ret = EVP_CipherFinal(evp, outb, &outl); - binary_dump(outb, outl); - - ret = (((test_drive_len[i] % 16) != 0) && (ret == 0)) || - (((test_drive_len[i] % 16) == 0) && (ret == 1)); - AssertTrue(ret); - } - - - EVP_CIPHER_CTX_free(evp); - - /* Do an extra test to verify correct behavior with empty input. */ - - AssertNotNull(evp = EVP_CIPHER_CTX_new()); - AssertIntNE((ret = EVP_CipherInit(evp, type, NULL, iv, 0)), 0); - - AssertIntEQ(EVP_CIPHER_CTX_nid(evp), NID_aes_128_cbc); - - klen = EVP_CIPHER_CTX_key_length(evp); - if (klen > 0 && keylen != klen) { - AssertIntNE(EVP_CIPHER_CTX_set_key_length(evp, keylen), 0); - } - ilen = EVP_CIPHER_CTX_iv_length(evp); - if (ilen > 0 && ivlen != ilen) { - AssertIntNE(EVP_CIPHER_CTX_set_iv_length(evp, ivlen), 0); - } - - AssertIntNE((ret = EVP_CipherInit(evp, NULL, key, iv, 1)), 0); - - /* outl should be set to 0 after passing NULL, 0 for input args. */ - outl = -1; - AssertIntNE((ret = EVP_CipherUpdate(evp, outb, &outl, NULL, 0)), 0); - AssertIntEQ(outl, 0); - - EVP_CIPHER_CTX_free(evp); - - res = TEST_RES_CHECK(1); -#endif /* test_EVP_Cipher */ - return res; -} - -static int test_wolfSSL_PEM_read_DHparams(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && \ - !defined(NO_FILESYSTEM) - DH* dh; - XFILE fp; - unsigned char derOut[300]; - unsigned char* derOutBuf = derOut; - int derOutSz = 0; - - unsigned char derExpected[300]; - int derExpectedSz = 0; - - XMEMSET(derOut, 0, sizeof(derOut)); - XMEMSET(derExpected, 0, sizeof(derExpected)); - - /* open DH param file, read into DH struct */ - AssertNotNull(fp = XFOPEN(dhParamFile, "rb")); - - /* bad args */ - AssertNull(dh = PEM_read_DHparams(NULL, &dh, NULL, NULL)); - AssertNull(dh = PEM_read_DHparams(NULL, NULL, NULL, NULL)); - - /* good args */ - AssertNotNull(dh = PEM_read_DHparams(fp, &dh, NULL, NULL)); - XFCLOSE(fp); - - /* read in certs/dh2048.der for comparison against exported params */ - fp = XFOPEN("./certs/dh2048.der", "rb"); - AssertTrue(fp != XBADFILE); - derExpectedSz = (int)XFREAD(derExpected, 1, sizeof(derExpected), fp); - XFCLOSE(fp); - - /* export DH back to DER and compare */ - derOutSz = wolfSSL_i2d_DHparams(dh, &derOutBuf); - AssertIntEQ(derOutSz, derExpectedSz); - AssertIntEQ(XMEMCMP(derOut, derExpected, derOutSz), 0); - - DH_free(dh); - dh = NULL; - - /* Test parsing with X9.42 header */ - fp = XFOPEN("./certs/x942dh2048.pem", "rb"); - AssertNotNull(dh = PEM_read_DHparams(fp, &dh, NULL, NULL)); - XFCLOSE(fp); - - DH_free(dh); - - res = TEST_RES_CHECK(1); -#endif - return res; -} - -static int test_wolfSSL_AES_ecb_encrypt(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AES_ECB) - AES_KEY aes; - const byte msg[] = - { - 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96, - 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a - }; - - const byte verify[] = - { - 0xf3,0xee,0xd1,0xbd,0xb5,0xd2,0xa0,0x3c, - 0x06,0x4b,0x5a,0x7e,0x3d,0xb1,0x81,0xf8 - }; - - const byte key[] = - { - 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe, - 0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, - 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7, - 0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4 - }; - - - byte out[AES_BLOCK_SIZE]; - - AssertIntEQ(AES_set_encrypt_key(key, sizeof(key)*8, &aes), 0); - XMEMSET(out, 0, AES_BLOCK_SIZE); - AES_ecb_encrypt(msg, out, &aes, AES_ENCRYPT); - AssertIntEQ(XMEMCMP(out, verify, AES_BLOCK_SIZE), 0); - -#ifdef HAVE_AES_DECRYPT - AssertIntEQ(AES_set_decrypt_key(key, sizeof(key)*8, &aes), 0); - XMEMSET(out, 0, AES_BLOCK_SIZE); - AES_ecb_encrypt(verify, out, &aes, AES_DECRYPT); - AssertIntEQ(XMEMCMP(out, msg, AES_BLOCK_SIZE), 0); -#endif - - /* test bad arguments */ - AES_ecb_encrypt(NULL, out, &aes, AES_DECRYPT); - AES_ecb_encrypt(verify, NULL, &aes, AES_DECRYPT); - AES_ecb_encrypt(verify, out, NULL, AES_DECRYPT); - - res = TEST_RES_CHECK(1); -#endif - return res; -} - -static int test_wolfSSL_MD5(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_MD5) - byte input1[] = ""; - byte input2[] = "message digest"; - byte hash[WC_MD5_DIGEST_SIZE]; - unsigned char output1[] = - "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e"; - unsigned char output2[] = - "\xf9\x6b\x69\x7d\x7c\xb7\x93\x8d\x52\x5a\x2f\x31\xaa\xf1\x61\xd0"; - WOLFSSL_MD5_CTX md5; - - XMEMSET(&md5, 0, sizeof(md5)); - - /* Test cases for illegal parameters */ - AssertIntEQ(MD5_Init(NULL), 0); - AssertIntEQ(MD5_Init(&md5), 1); - AssertIntEQ(MD5_Update(NULL, input1, 0), 0); - AssertIntEQ(MD5_Update(NULL, NULL, 0), 0); - AssertIntEQ(MD5_Update(&md5, NULL, 1), 0); - AssertIntEQ(MD5_Final(NULL, &md5), 0); - AssertIntEQ(MD5_Final(hash, NULL), 0); - AssertIntEQ(MD5_Final(NULL, NULL), 0); - - /* Init MD5 CTX */ - AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); - AssertIntEQ(wolfSSL_MD5_Update(&md5, input1, - XSTRLEN((const char*)&input1)), 1); - AssertIntEQ(wolfSSL_MD5_Final(hash, &md5), 1); - AssertIntEQ(XMEMCMP(&hash, output1, WC_MD5_DIGEST_SIZE), 0); - - /* Init MD5 CTX */ - AssertIntEQ(wolfSSL_MD5_Init(&md5), 1); - AssertIntEQ(wolfSSL_MD5_Update(&md5, input2, - (int)XSTRLEN((const char*)input2)), 1); - AssertIntEQ(wolfSSL_MD5_Final(hash, &md5), 1); - AssertIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); -#if !defined(NO_OLD_NAMES) && \ - (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))) - AssertPtrNE(MD5(NULL, 1, (byte*)&hash), &hash); - AssertPtrEq(MD5(input1, 0, (byte*)&hash), &hash); - AssertPtrNE(MD5(input1, 1, NULL), NULL); - AssertPtrNE(MD5(NULL, 0, NULL), NULL); - - AssertPtrEq(MD5(input1, (int)XSTRLEN((const char*)&input1), (byte*)&hash), &hash); - AssertIntEQ(XMEMCMP(&hash, output1, WC_MD5_DIGEST_SIZE), 0); - - AssertPtrEq(MD5(input2, (int)XSTRLEN((const char*)&input2), (byte*)&hash), &hash); - AssertIntEQ(XMEMCMP(&hash, output2, WC_MD5_DIGEST_SIZE), 0); - { - byte data[] = "Data to be hashed."; - XMEMSET(hash, 0, WC_MD5_DIGEST_SIZE); - - AssertNotNull(MD5(data, sizeof(data), NULL)); - AssertNotNull(MD5(data, sizeof(data), hash)); - AssertNotNull(MD5(NULL, 0, hash)); - AssertNull(MD5(NULL, sizeof(data), hash)); - } -#endif - - res = TEST_RES_CHECK(1); -#endif - return res; -} - -static int test_wolfSSL_MD5_Transform(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_MD5) - byte input1[] = ""; - byte input2[] = "abc"; - byte local[WC_MD5_BLOCK_SIZE]; - word32 sLen = 0; -#ifdef BIG_ENDIAN_ORDER - unsigned char output1[] = - "\x03\x1f\x1d\xac\x6e\xa5\x8e\xd0\x1f\xab\x67\xb7\x74\x31\x77\x91"; - unsigned char output2[] = - "\xef\xd3\x79\x8d\x67\x17\x25\x90\xa4\x13\x79\xc7\xe3\xa7\x7b\xbc"; -#else - unsigned char output1[] = - "\xac\x1d\x1f\x03\xd0\x8e\xa5\x6e\xb7\x67\xab\x1f\x91\x77\x31\x74"; - unsigned char output2[] = - "\x8d\x79\xd3\xef\x90\x25\x17\x67\xc7\x79\x13\xa4\xbc\x7b\xa7\xe3"; -#endif + set_plain(plain, BUFFSZ * RECORDS); - union { - wc_Md5 native; - MD5_CTX compat; - } md5; + SSL_library_init(); - XMEMSET(&md5.compat, 0, sizeof(md5.compat)); - XMEMSET(&local, 0, sizeof(local)); + ExpectNotNull(evp = EVP_CIPHER_CTX_new()); + ExpectIntNE((ret = EVP_CipherInit(evp, type, NULL, iv, 0)), 0); - /* sanity check */ - AssertIntEQ(MD5_Transform(NULL, NULL), 0); - AssertIntEQ(MD5_Transform(NULL, (const byte*)&input1), 0); - AssertIntEQ(MD5_Transform(&md5.compat, NULL), 0); - AssertIntEQ(wc_Md5Transform(NULL, NULL), BAD_FUNC_ARG); - AssertIntEQ(wc_Md5Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); - AssertIntEQ(wc_Md5Transform(&md5.native, NULL), BAD_FUNC_ARG); + ExpectIntEQ(EVP_CIPHER_CTX_nid(evp), NID_aes_128_cbc); - /* Init MD5 CTX */ - AssertIntEQ(wolfSSL_MD5_Init(&md5.compat), 1); - /* Do Transform*/ - sLen = (word32)XSTRLEN((char*)input1); - XMEMCPY(local, input1, sLen); - AssertIntEQ(MD5_Transform(&md5.compat, (const byte*)&local[0]), 1); + klen = EVP_CIPHER_CTX_key_length(evp); + if (klen > 0 && keylen != klen) { + ExpectIntNE(EVP_CIPHER_CTX_set_key_length(evp, keylen), 0); + } + ilen = EVP_CIPHER_CTX_iv_length(evp); + if (ilen > 0 && ivlen != ilen) { + ExpectIntNE(EVP_CIPHER_CTX_set_iv_length(evp, ivlen), 0); + } - AssertIntEQ(XMEMCMP(md5.native.digest, output1, - WC_MD5_DIGEST_SIZE), 0); + ExpectIntNE((ret = EVP_CipherInit(evp, NULL, key, iv, 1)), 0); - /* Init MD5 CTX */ - AssertIntEQ(MD5_Init(&md5.compat), 1); - sLen = (word32)XSTRLEN((char*)input2); - XMEMSET(local, 0, WC_MD5_BLOCK_SIZE); - XMEMCPY(local, input2, sLen); - AssertIntEQ(MD5_Transform(&md5.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(md5.native.digest, output2, - WC_MD5_DIGEST_SIZE), 0); + for (j = 0; j 2)) - unsigned char input[] = - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; - unsigned char output[] = - "\x75\x38\x8b\x16\x51\x27\x76\xcc\x5d\xba\x5d\xa1\xfd\x89\x01" - "\x50\xb0\xc6\x45\x5c\xb4\xf5\x8b\x19\x52\x52\x25\x25"; - size_t inLen; - byte hash[WC_SHA224_DIGEST_SIZE]; + ExpectIntNE((ret = EVP_CipherInit(evp, NULL, key, iv, 1)), 0); - inLen = XSTRLEN((char*)input); + init_offset(); + test_drive_len[i] = 0; - XMEMSET(hash, 0, WC_SHA224_DIGEST_SIZE); + for (j = 0; test_drive[i][j]; j++) + { + inl = test_drive[i][j]; + test_drive_len[i] += inl; - AssertNull(SHA224(NULL, inLen, hash)); - AssertNotNull(SHA224(input, 0, hash)); - AssertNotNull(SHA224(input, inLen, NULL)); - AssertNotNull(SHA224(NULL, 0, hash)); - AssertNotNull(SHA224(NULL, 0, NULL)); + get_record(plain, inb, inl); + ExpectIntNE((ret = EVP_EncryptUpdate(evp, outb, &outl, inb, inl)), + 0); + /* output to cipher buffer, so that following Dec test can detect + if any error */ + set_record(cipher, outb, outl); + } - AssertNotNull(SHA224(input, inLen, hash)); - AssertIntEQ(XMEMCMP(hash, output, WC_SHA224_DIGEST_SIZE), 0); + EVP_CipherFinal(evp, outb, &outl); - res = TEST_RES_CHECK(1); -#endif - return res; -} -static int test_wolfSSL_SHA_Transform(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA) -#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) - byte input1[] = ""; - byte input2[] = "abc"; - byte local[WC_SHA_BLOCK_SIZE]; - word32 sLen = 0; -#ifdef BIG_ENDIAN_ORDER - unsigned char output1[] = - "\x92\xb4\x04\xe5\x56\x58\x8c\xed\x6c\x1a\xcd\x4e\xbf\x05\x3f\x68" - "\x09\xf7\x3a\x93"; - unsigned char output2[] = - "\x97\xb2\x74\x8b\x4f\x5b\xbc\xca\x5b\xc0\xe6\xea\x2d\x40\xb4\xa0" - "\x7c\x6e\x08\xb8"; -#else - unsigned char output1[] = - "\xe5\x04\xb4\x92\xed\x8c\x58\x56\x4e\xcd\x1a\x6c\x68\x3f\x05\xbf" - "\x93\x3a\xf7\x09"; - unsigned char output2[] = - "\x8b\x74\xb2\x97\xca\xbc\x5b\x4f\xea\xe6\xc0\x5b\xa0\xb4\x40\x2d" - "\xb8\x08\x6e\x7c"; -#endif + if (outl > 0) + set_record(cipher, outb, outl); + } - union { - wc_Sha native; - SHA_CTX compat; - } sha; - union { - wc_Sha native; - SHA_CTX compat; - } sha1; + for (i = 0; test_drive[i]; i++) { + last_val = 0x0f; - XMEMSET(&sha.compat, 0, sizeof(sha.compat)); - XMEMSET(&local, 0, sizeof(local)); + ExpectIntNE((ret = EVP_CipherInit(evp, NULL, key, iv, 0)), 0); - /* sanity check */ - AssertIntEQ(SHA_Transform(NULL, NULL), 0); - AssertIntEQ(SHA_Transform(NULL, (const byte*)&input1), 0); - AssertIntEQ(SHA_Transform(&sha.compat, NULL), 0); - AssertIntEQ(SHA1_Transform(NULL, NULL), 0); - AssertIntEQ(SHA1_Transform(NULL, (const byte*)&input1), 0); - AssertIntEQ(SHA1_Transform(&sha.compat, NULL), 0); - AssertIntEQ(wc_ShaTransform(NULL, NULL), BAD_FUNC_ARG); - AssertIntEQ(wc_ShaTransform(NULL, (const byte*)&input1), BAD_FUNC_ARG); - AssertIntEQ(wc_ShaTransform(&sha.native, NULL), BAD_FUNC_ARG); + init_offset(); - /* Init SHA CTX */ - AssertIntEQ(SHA_Init(&sha.compat), 1); - /* Do Transform*/ - sLen = (word32)XSTRLEN((char*)input1); - XMEMCPY(local, input1, sLen); - AssertIntEQ(SHA_Transform(&sha.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha.native.digest, output1, - WC_SHA_DIGEST_SIZE), 0); - AssertIntEQ(SHA_Final(local, &sha.compat), 1); /* frees resources */ + for (j = 0; test_drive[i][j]; j++) { + inl = test_drive[i][j]; + get_record(cipher, inb, inl); - /* Init SHA CTX */ - AssertIntEQ(SHA_Init(&sha.compat), 1); - sLen = (word32)XSTRLEN((char*)input2); - XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); - XMEMCPY(local, input2, sLen); - AssertIntEQ(SHA_Transform(&sha.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha.native.digest, output2, - WC_SHA_DIGEST_SIZE), 0); - AssertIntEQ(SHA_Final(local, &sha.compat), 1); /* frees resources */ + ExpectIntNE((ret = EVP_DecryptUpdate(evp, outb, &outl, inb, inl)), + 0); - /* SHA1 */ - XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); - /* Init SHA CTX */ - AssertIntEQ(SHA1_Init(&sha1.compat), 1); - /* Do Transform*/ - sLen = (word32)XSTRLEN((char*)input1); - XMEMCPY(local, input1, sLen); - AssertIntEQ(SHA1_Transform(&sha1.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha1.native.digest, output1, - WC_SHA_DIGEST_SIZE), 0); - AssertIntEQ(SHA_Final(local, &sha1.compat), 1); /* frees resources */ + binary_dump(outb, outl); + ExpectIntEQ((ret = check_result(outb, outl)), 0); + ExpectFalse(outl > ((inl/16+1)*16) && outl > 16); + } - /* Init SHA CTX */ - AssertIntEQ(SHA1_Init(&sha1.compat), 1); - sLen = (word32)XSTRLEN((char*)input2); - XMEMSET(local, 0, WC_SHA_BLOCK_SIZE); - XMEMCPY(local, input2, sLen); - AssertIntEQ(SHA1_Transform(&sha1.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha1.native.digest, output2, - WC_SHA_DIGEST_SIZE), 0); - AssertIntEQ(SHA_Final(local, &sha1.compat), 1); /* frees resources */ + ret = EVP_CipherFinal(evp, outb, &outl); - res = TEST_RES_CHECK(1); -#endif -#endif - return res; -} + binary_dump(outb, outl); -static int test_wolfSSL_SHA256_Transform(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) -#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ - !defined(WOLFSSL_DEVCRYPTO_HASH) && !defined(WOLFSSL_AFALG_HASH) && \ - !defined(WOLFSSL_KCAPI_HASH) - byte input1[] = ""; - byte input2[] = "abc"; - byte local[WC_SHA256_BLOCK_SIZE]; - word32 sLen = 0; -#ifdef BIG_ENDIAN_ORDER - unsigned char output1[] = - "\xda\x56\x98\xbe\x17\xb9\xb4\x69\x62\x33\x57\x99\x77\x9f\xbe\xca" - "\x8c\xe5\xd4\x91\xc0\xd2\x62\x43\xba\xfe\xf9\xea\x18\x37\xa9\xd8"; - unsigned char output2[] = - "\x1d\x4e\xd4\x67\x67\x7c\x61\x67\x44\x10\x76\x26\x78\x10\xff\xb8" - "\x40\xc8\x9a\x39\x73\x16\x60\x8c\xa6\x61\xd6\x05\x91\xf2\x8c\x35"; -#else - unsigned char output1[] = - "\xbe\x98\x56\xda\x69\xb4\xb9\x17\x99\x57\x33\x62\xca\xbe\x9f\x77" - "\x91\xd4\xe5\x8c\x43\x62\xd2\xc0\xea\xf9\xfe\xba\xd8\xa9\x37\x18"; - unsigned char output2[] = - "\x67\xd4\x4e\x1d\x67\x61\x7c\x67\x26\x76\x10\x44\xb8\xff\x10\x78" - "\x39\x9a\xc8\x40\x8c\x60\x16\x73\x05\xd6\x61\xa6\x35\x8c\xf2\x91"; -#endif - union { - wc_Sha256 native; - SHA256_CTX compat; - } sha256; + ret = (((test_drive_len[i] % 16) != 0) && (ret == 0)) || + (((test_drive_len[i] % 16) == 0) && (ret == 1)); + ExpectTrue(ret); + } - XMEMSET(&sha256.compat, 0, sizeof(sha256.compat)); - XMEMSET(&local, 0, sizeof(local)); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(evp), WOLFSSL_SUCCESS); - /* sanity check */ - AssertIntEQ(SHA256_Transform(NULL, NULL), 0); - AssertIntEQ(SHA256_Transform(NULL, (const byte*)&input1), 0); - AssertIntEQ(SHA256_Transform(&sha256.compat, NULL), 0); - AssertIntEQ(wc_Sha256Transform(NULL, NULL), BAD_FUNC_ARG); - AssertIntEQ(wc_Sha256Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); - AssertIntEQ(wc_Sha256Transform(&sha256.native, NULL), BAD_FUNC_ARG); + EVP_CIPHER_CTX_free(evp); + evp = NULL; - /* Init SHA256 CTX */ - AssertIntEQ(SHA256_Init(&sha256.compat), 1); - /* Do Transform*/ - sLen = (word32)XSTRLEN((char*)input1); - XMEMCPY(local, input1, sLen); - AssertIntEQ(SHA256_Transform(&sha256.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha256.native.digest, output1, - WC_SHA256_DIGEST_SIZE), 0); - AssertIntEQ(SHA256_Final(local, &sha256.compat), 1); /* frees resources */ + /* Do an extra test to verify correct behavior with empty input. */ - /* Init SHA256 CTX */ - AssertIntEQ(SHA256_Init(&sha256.compat), 1); - sLen = (word32)XSTRLEN((char*)input2); - XMEMSET(local, 0, WC_SHA256_BLOCK_SIZE); - XMEMCPY(local, input2, sLen); - AssertIntEQ(SHA256_Transform(&sha256.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha256.native.digest, output2, - WC_SHA256_DIGEST_SIZE), 0); - AssertIntEQ(SHA256_Final(local, &sha256.compat), 1); /* frees resources */ + ExpectNotNull(evp = EVP_CIPHER_CTX_new()); + ExpectIntNE((ret = EVP_CipherInit(evp, type, NULL, iv, 0)), 0); - res = TEST_RES_CHECK(1); -#endif -#endif - return res; -} + ExpectIntEQ(EVP_CIPHER_CTX_nid(evp), NID_aes_128_cbc); -static int test_wolfSSL_SHA256(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_SHA256) && \ - defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) - unsigned char input[] = - "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; - unsigned char output[] = - "\x24\x8D\x6A\x61\xD2\x06\x38\xB8\xE5\xC0\x26\x93\x0C\x3E\x60" - "\x39\xA3\x3C\xE4\x59\x64\xFF\x21\x67\xF6\xEC\xED\xD4\x19\xDB" - "\x06\xC1"; - size_t inLen; - byte hash[WC_SHA256_DIGEST_SIZE]; + klen = EVP_CIPHER_CTX_key_length(evp); + if (klen > 0 && keylen != klen) { + ExpectIntNE(EVP_CIPHER_CTX_set_key_length(evp, keylen), 0); + } + ilen = EVP_CIPHER_CTX_iv_length(evp); + if (ilen > 0 && ivlen != ilen) { + ExpectIntNE(EVP_CIPHER_CTX_set_iv_length(evp, ivlen), 0); + } - inLen = XSTRLEN((char*)input); + ExpectIntNE((ret = EVP_CipherInit(evp, NULL, key, iv, 1)), 0); - XMEMSET(hash, 0, WC_SHA256_DIGEST_SIZE); - AssertNotNull(SHA256(input, inLen, hash)); - AssertIntEQ(XMEMCMP(hash, output, WC_SHA256_DIGEST_SIZE), 0); + /* outl should be set to 0 after passing NULL, 0 for input args. */ + outl = -1; + ExpectIntNE((ret = EVP_CipherUpdate(evp, outb, &outl, NULL, 0)), 0); + ExpectIntEQ(outl, 0); - res = TEST_RES_CHECK(1); -#endif - return res; + EVP_CIPHER_CTX_free(evp); +#endif /* test_EVP_Cipher */ + return EXPECT_RESULT(); } -static int test_wolfSSL_SHA512_Transform(void) +static int test_wolfSSL_PEM_read_DHparams(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA512) -#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ - !defined(WOLFSSL_KCAPI_HASH) - byte input1[] = ""; - byte input2[] = "abc"; - byte local[WC_SHA512_BLOCK_SIZE]; - word32 sLen = 0; -#ifdef BIG_ENDIAN_ORDER - unsigned char output1[] = - "\xcf\x78\x81\xd5\x77\x4a\xcb\xe8\x53\x33\x62\xe0\xfb\xc7\x80\x70" - "\x02\x67\x63\x9d\x87\x46\x0e\xda\x30\x86\xcb\x40\xe8\x59\x31\xb0" - "\x71\x7d\xc9\x52\x88\xa0\x23\xa3\x96\xba\xb2\xc1\x4c\xe0\xb5\xe0" - "\x6f\xc4\xfe\x04\xea\xe3\x3e\x0b\x91\xf4\xd8\x0c\xbd\x66\x8b\xee"; - unsigned char output2[] = - "\x11\x10\x93\x4e\xeb\xa0\xcc\x0d\xfd\x33\x43\x9c\xfb\x04\xc8\x21" - "\xa9\xb4\x26\x3d\xca\xab\x31\x41\xe2\xc6\xaa\xaf\xe1\x67\xd7\xab" - "\x31\x8f\x2e\x54\x2c\xba\x4e\x83\xbe\x88\xec\x9d\x8f\x2b\x38\x98" - "\x14\xd2\x4e\x9d\x53\x8b\x5e\x4d\xde\x68\x6c\x69\xaf\x20\x96\xf0"; -#else - unsigned char output1[] = - "\xe8\xcb\x4a\x77\xd5\x81\x78\xcf\x70\x80\xc7\xfb\xe0\x62\x33\x53" - "\xda\x0e\x46\x87\x9d\x63\x67\x02\xb0\x31\x59\xe8\x40\xcb\x86\x30" - "\xa3\x23\xa0\x88\x52\xc9\x7d\x71\xe0\xb5\xe0\x4c\xc1\xb2\xba\x96" - "\x0b\x3e\xe3\xea\x04\xfe\xc4\x6f\xee\x8b\x66\xbd\x0c\xd8\xf4\x91"; - unsigned char output2[] = - "\x0d\xcc\xa0\xeb\x4e\x93\x10\x11\x21\xc8\x04\xfb\x9c\x43\x33\xfd" - "\x41\x31\xab\xca\x3d\x26\xb4\xa9\xab\xd7\x67\xe1\xaf\xaa\xc6\xe2" - "\x83\x4e\xba\x2c\x54\x2e\x8f\x31\x98\x38\x2b\x8f\x9d\xec\x88\xbe" - "\x4d\x5e\x8b\x53\x9d\x4e\xd2\x14\xf0\x96\x20\xaf\x69\x6c\x68\xde"; -#endif - union { - wc_Sha512 native; - SHA512_CTX compat; - } sha512; + EXPECT_DECLS; +#if defined(OPENSSL_ALL) && !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && \ + !defined(NO_FILESYSTEM) + DH* dh = NULL; + XFILE fp = XBADFILE; + unsigned char derOut[300]; + unsigned char* derOutBuf = derOut; + int derOutSz = 0; - XMEMSET(&sha512.compat, 0, sizeof(sha512.compat)); - XMEMSET(&local, 0, sizeof(local)); + unsigned char derExpected[300]; + int derExpectedSz = 0; - /* sanity check */ - AssertIntEQ(SHA512_Transform(NULL, NULL), 0); - AssertIntEQ(SHA512_Transform(NULL, (const byte*)&input1), 0); - AssertIntEQ(SHA512_Transform(&sha512.compat, NULL), 0); - AssertIntEQ(wc_Sha512Transform(NULL, NULL), BAD_FUNC_ARG); - AssertIntEQ(wc_Sha512Transform(NULL, (const byte*)&input1), BAD_FUNC_ARG); - AssertIntEQ(wc_Sha512Transform(&sha512.native, NULL), BAD_FUNC_ARG); + XMEMSET(derOut, 0, sizeof(derOut)); + XMEMSET(derExpected, 0, sizeof(derExpected)); - /* Init SHA512 CTX */ - AssertIntEQ(wolfSSL_SHA512_Init(&sha512.compat), 1); + /* open DH param file, read into DH struct */ + ExpectTrue((fp = XFOPEN(dhParamFile, "rb")) != XBADFILE); - /* Do Transform*/ - sLen = (word32)XSTRLEN((char*)input1); - XMEMCPY(local, input1, sLen); - AssertIntEQ(SHA512_Transform(&sha512.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha512.native.digest, output1, - WC_SHA512_DIGEST_SIZE), 0); - AssertIntEQ(SHA512_Final(local, &sha512.compat), 1); /* frees resources */ + /* bad args */ + ExpectNull(dh = PEM_read_DHparams(NULL, &dh, NULL, NULL)); + ExpectNull(dh = PEM_read_DHparams(NULL, NULL, NULL, NULL)); - /* Init SHA512 CTX */ - AssertIntEQ(SHA512_Init(&sha512.compat), 1); - sLen = (word32)XSTRLEN((char*)input2); - XMEMSET(local, 0, WC_SHA512_BLOCK_SIZE); - XMEMCPY(local, input2, sLen); - AssertIntEQ(SHA512_Transform(&sha512.compat, (const byte*)&local[0]), 1); - AssertIntEQ(XMEMCMP(sha512.native.digest, output2, - WC_SHA512_DIGEST_SIZE), 0); - AssertIntEQ(SHA512_Final(local, &sha512.compat), 1); /* frees resources */ + /* good args */ + ExpectNotNull(dh = PEM_read_DHparams(fp, &dh, NULL, NULL)); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - (void)input1; + /* read in certs/dh2048.der for comparison against exported params */ + ExpectTrue((fp = XFOPEN("./certs/dh2048.der", "rb")) != XBADFILE); + ExpectIntGT(derExpectedSz = (int)XFREAD(derExpected, 1, sizeof(derExpected), + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - res = TEST_RES_CHECK(1); -#endif + /* export DH back to DER and compare */ + derOutSz = wolfSSL_i2d_DHparams(dh, &derOutBuf); + ExpectIntEQ(derOutSz, derExpectedSz); + ExpectIntEQ(XMEMCMP(derOut, derExpected, derOutSz), 0); + + DH_free(dh); + dh = NULL; + + /* Test parsing with X9.42 header */ + ExpectTrue((fp = XFOPEN("./certs/x942dh2048.pem", "rb")) != XBADFILE); + ExpectNotNull(dh = PEM_read_DHparams(fp, &dh, NULL, NULL)); + if (fp != XBADFILE) + XFCLOSE(fp); + + DH_free(dh); + dh = NULL; #endif - return res; + return EXPECT_RESULT(); } + static int test_wolfSSL_X509_get_serialNumber(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_RSA) - ASN1_INTEGER* a; - BIGNUM* bn; - X509* x509; - char *serialHex; + ASN1_INTEGER* a = NULL; + BIGNUM* bn = NULL; + X509* x509 = NULL; + char *serialHex = NULL; byte serial[3]; int serialSz; - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, - SSL_FILETYPE_PEM)); - AssertNotNull(a = X509_get_serialNumber(x509)); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, + SSL_FILETYPE_PEM)); + ExpectNotNull(a = X509_get_serialNumber(x509)); /* check on value of ASN1 Integer */ - AssertNotNull(bn = ASN1_INTEGER_to_BN(a, NULL)); - + ExpectNotNull(bn = ASN1_INTEGER_to_BN(a, NULL)); + a = NULL; /* test setting serial number and then retrieving it */ - AssertNotNull(a = ASN1_INTEGER_new()); - ASN1_INTEGER_set(a, 3); - AssertIntEQ(X509_set_serialNumber(x509, a), WOLFSSL_SUCCESS); + ExpectNotNull(a = ASN1_INTEGER_new()); + ExpectIntEQ(ASN1_INTEGER_set(a, 3), 1); + ExpectIntEQ(X509_set_serialNumber(x509, a), WOLFSSL_SUCCESS); serialSz = sizeof(serial); - AssertIntEQ(wolfSSL_X509_get_serial_number(x509, serial, &serialSz), - WOLFSSL_SUCCESS); - AssertIntEQ(serialSz, 1); - AssertIntEQ(serial[0], 3); + ExpectIntEQ(wolfSSL_X509_get_serial_number(x509, serial, &serialSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(serialSz, 1); + ExpectIntEQ(serial[0], 3); ASN1_INTEGER_free(a); + a = NULL; /* test setting serial number with 0's in it */ serial[0] = 0x01; serial[1] = 0x00; serial[2] = 0x02; - AssertNotNull(a = wolfSSL_ASN1_INTEGER_new()); - a->data[0] = ASN_INTEGER; - a->data[1] = sizeof(serial); - XMEMCPY(&a->data[2], serial, sizeof(serial)); - a->length = sizeof(serial) + 2; - AssertIntEQ(X509_set_serialNumber(x509, a), WOLFSSL_SUCCESS); + ExpectNotNull(a = wolfSSL_ASN1_INTEGER_new()); + if (a != NULL) { + a->data[0] = ASN_INTEGER; + a->data[1] = sizeof(serial); + XMEMCPY(&a->data[2], serial, sizeof(serial)); + a->length = sizeof(serial) + 2; + } + ExpectIntEQ(X509_set_serialNumber(x509, a), WOLFSSL_SUCCESS); XMEMSET(serial, 0, sizeof(serial)); serialSz = sizeof(serial); - AssertIntEQ(wolfSSL_X509_get_serial_number(x509, serial, &serialSz), - WOLFSSL_SUCCESS); - AssertIntEQ(serialSz, 3); - AssertIntEQ(serial[0], 0x01); - AssertIntEQ(serial[1], 0x00); - AssertIntEQ(serial[2], 0x02); + ExpectIntEQ(wolfSSL_X509_get_serial_number(x509, serial, &serialSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(serialSz, 3); + ExpectIntEQ(serial[0], 0x01); + ExpectIntEQ(serial[1], 0x00); + ExpectIntEQ(serial[2], 0x02); ASN1_INTEGER_free(a); + a = NULL; X509_free(x509); /* free's a */ - AssertNotNull(serialHex = BN_bn2hex(bn)); + ExpectNotNull(serialHex = BN_bn2hex(bn)); #ifndef WC_DISABLE_RADIX_ZERO_PAD - AssertStrEQ(serialHex, "01"); + ExpectStrEQ(serialHex, "01"); #else - AssertStrEQ(serialHex, "1"); + ExpectStrEQ(serialHex, "1"); #endif OPENSSL_free(serialHex); - - AssertIntEQ(BN_get_word(bn), 1); - + ExpectIntEQ(BN_get_word(bn), 1); BN_free(bn); /* hard test free'ing with dynamic buffer to make sure there is no leaks */ - a = ASN1_INTEGER_new(); - if (a) { - AssertNotNull(a->data = (unsigned char*)XMALLOC(100, NULL, - DYNAMIC_TYPE_OPENSSL)); + ExpectNotNull(a = ASN1_INTEGER_new()); + if (a != NULL) { + ExpectNotNull(a->data = (unsigned char*)XMALLOC(100, NULL, + DYNAMIC_TYPE_OPENSSL)); a->isDynamic = 1; ASN1_INTEGER_free(a); } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OpenSSL_add_all_algorithms(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) - AssertIntEQ(wolfSSL_add_all_algorithms(),WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_add_all_algorithms(), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_OpenSSL_add_all_algorithms_noconf(),WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_OpenSSL_add_all_algorithms_noconf(), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_OpenSSL_add_all_algorithms_conf(),WOLFSSL_SUCCESS); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wolfSSL_OpenSSL_add_all_algorithms_conf(), WOLFSSL_SUCCESS); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OPENSSL_hexstr2buf(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) #define MAX_HEXSTR_BUFSZ 9 #define NUM_CASES 5 @@ -48375,112 +59381,107 @@ long len = 0; unsigned char* returnedBuf = NULL; - for (i = 0; i < NUM_CASES; ++i) { + for (i = 0; i < NUM_CASES && !EXPECT_FAIL(); ++i) { returnedBuf = wolfSSL_OPENSSL_hexstr2buf(inputs[i], &len); - if (returnedBuf == NULL) { - AssertIntEQ(expectedOutputs[i].ret, 0); + ExpectIntEQ(expectedOutputs[i].ret, 0); continue; } - AssertIntEQ(expectedOutputs[i].ret, len); + ExpectIntEQ(expectedOutputs[i].ret, len); for (j = 0; j < len; ++j) { - AssertIntEQ(expectedOutputs[i].buffer[j], returnedBuf[j]); + ExpectIntEQ(expectedOutputs[i].buffer[j], returnedBuf[j]); } OPENSSL_free(returnedBuf); + returnedBuf = NULL; } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_CA_num(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && !defined(NO_FILESYSTEM) && \ defined(HAVE_ECC) && !defined(NO_RSA) - WOLFSSL_X509_STORE *store; - WOLFSSL_X509 *x509_1, *x509_2; + WOLFSSL_X509_STORE *store = NULL; + WOLFSSL_X509 *x509_1 = NULL; + WOLFSSL_X509 *x509_2 = NULL; int ca_num = 0; - store = wolfSSL_X509_STORE_new(); - x509_1 = wolfSSL_X509_load_certificate_file(svrCertFile, WOLFSSL_FILETYPE_PEM); - wolfSSL_X509_STORE_add_cert(store, x509_1); - ca_num = wolfSSL_X509_CA_num(store); - AssertIntEQ(ca_num, 1); - - x509_2 = wolfSSL_X509_load_certificate_file(eccCertFile, WOLFSSL_FILETYPE_PEM); - wolfSSL_X509_STORE_add_cert(store, x509_2); - ca_num = wolfSSL_X509_CA_num(store); - AssertIntEQ(ca_num, 2); + ExpectNotNull(store = wolfSSL_X509_STORE_new()); + ExpectNotNull(x509_1 = wolfSSL_X509_load_certificate_file(svrCertFile, + WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(wolfSSL_X509_STORE_add_cert(store, x509_1), 1); + ExpectIntEQ(ca_num = wolfSSL_X509_CA_num(store), 1); + + ExpectNotNull(x509_2 = wolfSSL_X509_load_certificate_file(eccCertFile, + WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(wolfSSL_X509_STORE_add_cert(store, x509_2), 1); + ExpectIntEQ(ca_num = wolfSSL_X509_CA_num(store), 2); wolfSSL_X509_free(x509_1); wolfSSL_X509_free(x509_2); wolfSSL_X509_STORE_free(store); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_check_ca(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) - WOLFSSL_X509 *x509; + WOLFSSL_X509 *x509 = NULL; - x509 = wolfSSL_X509_load_certificate_file(svrCertFile, WOLFSSL_FILETYPE_PEM); - AssertIntEQ(wolfSSL_X509_check_ca(x509), 1); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, + WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(wolfSSL_X509_check_ca(x509), 1); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_check_ip_asc(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) - WOLFSSL_X509 *x509; + WOLFSSL_X509 *x509 = NULL; - x509 = wolfSSL_X509_load_certificate_file(cliCertFile, WOLFSSL_FILETYPE_PEM); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(cliCertFile, + WOLFSSL_FILETYPE_PEM)); #if 0 /* TODO: add cert gen for testing positive case */ - AssertIntEQ(wolfSSL_X509_check_ip_asc(x509, "127.0.0.1", 0), 1); + ExpectIntEQ(wolfSSL_X509_check_ip_asc(x509, "127.0.0.1", 0), 1); #endif - AssertIntEQ(wolfSSL_X509_check_ip_asc(x509, "0.0.0.0", 0), 0); - AssertIntEQ(wolfSSL_X509_check_ip_asc(x509, NULL, 0), 0); + ExpectIntEQ(wolfSSL_X509_check_ip_asc(x509, "0.0.0.0", 0), 0); + ExpectIntEQ(wolfSSL_X509_check_ip_asc(x509, NULL, 0), 0); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_make_cert(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && !defined(NO_ASN_TIME) && defined(WOLFSSL_CERT_GEN) && \ defined(WOLFSSL_CERT_EXT) - int ret; + int ret = 0; Cert cert; CertName name; RsaKey key; WC_RNG rng; byte der[FOURK_BUF]; - word32 idx; + word32 idx = 0; const byte mySerial[8] = {1,2,3,4,5,6,7,8}; #ifdef OPENSSL_EXTRA - const unsigned char* pt; - int certSz; - X509* x509; - X509_NAME* x509name; - X509_NAME_ENTRY* entry; - ASN1_STRING* entryValue; + const unsigned char* pt = NULL; + int certSz = 0; + X509* x509 = NULL; + X509_NAME* x509name = NULL; + X509_NAME_ENTRY* entry = NULL; + ASN1_STRING* entryValue = NULL; #endif XMEMSET(&name, 0, sizeof(CertName)); @@ -48523,20 +59524,20 @@ #endif #endif /* WOLFSSL_MULTI_ATTRIB */ - AssertIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); + ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0); #ifndef HAVE_FIPS - AssertIntEQ(wc_InitRng_ex(&rng, HEAP_HINT, testDevId), 0); + ExpectIntEQ(wc_InitRng_ex(&rng, HEAP_HINT, testDevId), 0); #else - AssertIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_InitRng(&rng), 0); #endif /* load test RSA key */ idx = 0; #if defined(USE_CERT_BUFFERS_1024) - AssertIntEQ(wc_RsaPrivateKeyDecode(server_key_der_1024, &idx, &key, + ExpectIntEQ(wc_RsaPrivateKeyDecode(server_key_der_1024, &idx, &key, sizeof_server_key_der_1024), 0); #elif defined(USE_CERT_BUFFERS_2048) - AssertIntEQ(wc_RsaPrivateKeyDecode(server_key_der_2048, &idx, &key, + ExpectIntEQ(wc_RsaPrivateKeyDecode(server_key_der_2048, &idx, &key, sizeof_server_key_der_2048), 0); #else /* error case, no RSA key loaded, happens later */ @@ -48544,7 +59545,7 @@ #endif XMEMSET(&cert, 0 , sizeof(Cert)); - AssertIntEQ(wc_InitCert(&cert), 0); + ExpectIntEQ(wc_InitCert(&cert), 0); XMEMCPY(&cert.subject, &name, sizeof(CertName)); XMEMCPY(cert.serial, mySerial, sizeof(mySerial)); @@ -48557,10 +59558,10 @@ #endif /* add SKID from the Public Key */ - AssertIntEQ(wc_SetSubjectKeyIdFromPublicKey(&cert, &key, NULL), 0); + ExpectIntEQ(wc_SetSubjectKeyIdFromPublicKey(&cert, &key, NULL), 0); /* add AKID from the Public Key */ - AssertIntEQ(wc_SetAuthKeyIdFromPublicKey(&cert, &key, NULL), 0); + ExpectIntEQ(wc_SetAuthKeyIdFromPublicKey(&cert, &key, NULL), 0); ret = 0; do { @@ -48571,463 +59572,89 @@ ret = wc_MakeSelfCert(&cert, der, FOURK_BUF, &key, &rng); } } while (ret == WC_PENDING_E); - AssertIntGT(ret, 0); + ExpectIntGT(ret, 0); #ifdef OPENSSL_EXTRA /* der holds a certificate with DC's now check X509 parsing of it */ certSz = ret; pt = der; - AssertNotNull(x509 = d2i_X509(NULL, &pt, certSz)); - AssertNotNull(x509name = X509_get_subject_name(x509)); + ExpectNotNull(x509 = d2i_X509(NULL, &pt, certSz)); + ExpectNotNull(x509name = X509_get_subject_name(x509)); #ifdef WOLFSSL_MULTI_ATTRIB - AssertIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, + ExpectIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, -1)), 5); - AssertIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, - idx)), 6); - AssertIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, - idx)), -1); + ExpectIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, + (int)idx)), 6); + ExpectIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, + (int)idx)), -1); #endif /* WOLFSSL_MULTI_ATTRIB */ /* compare DN at index 0 */ - AssertNotNull(entry = X509_NAME_get_entry(x509name, 0)); - AssertNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); - AssertIntEQ(ASN1_STRING_length(entryValue), 2); - AssertStrEQ((const char*)ASN1_STRING_data(entryValue), "US"); + ExpectNotNull(entry = X509_NAME_get_entry(x509name, 0)); + ExpectNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); + ExpectIntEQ(ASN1_STRING_length(entryValue), 2); + ExpectStrEQ((const char*)ASN1_STRING_data(entryValue), "US"); #ifndef WOLFSSL_MULTI_ATTRIB /* compare Serial Number */ - AssertIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_serialNumber, + ExpectIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_serialNumber, -1)), 7); - AssertNotNull(entry = X509_NAME_get_entry(x509name, idx)); - AssertNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); - AssertIntEQ(ASN1_STRING_length(entryValue), XSTRLEN("wolfSSL12345")); - AssertStrEQ((const char*)ASN1_STRING_data(entryValue), "wolfSSL12345"); + ExpectNotNull(entry = X509_NAME_get_entry(x509name, idx)); + ExpectNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); + ExpectIntEQ(ASN1_STRING_length(entryValue), XSTRLEN("wolfSSL12345")); + ExpectStrEQ((const char*)ASN1_STRING_data(entryValue), "wolfSSL12345"); #endif #ifdef WOLFSSL_MULTI_ATTRIB /* get first and second DC and compare result */ - AssertIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, + ExpectIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, -1)), 5); - AssertNotNull(entry = X509_NAME_get_entry(x509name, idx)); - AssertNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); - AssertStrEQ((const char *)ASN1_STRING_data(entryValue), "com"); - - AssertIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, - idx)), 6); - AssertNotNull(entry = X509_NAME_get_entry(x509name, idx)); - AssertNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); - AssertStrEQ((const char *)ASN1_STRING_data(entryValue), "wolfssl"); + ExpectNotNull(entry = X509_NAME_get_entry(x509name, (int)idx)); + ExpectNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); + ExpectStrEQ((const char *)ASN1_STRING_data(entryValue), "com"); + + ExpectIntEQ((idx = X509_NAME_get_index_by_NID(x509name, NID_domainComponent, + (int)idx)), 6); + ExpectNotNull(entry = X509_NAME_get_entry(x509name, (int)idx)); + ExpectNotNull(entryValue = X509_NAME_ENTRY_get_data(entry)); + ExpectStrEQ((const char *)ASN1_STRING_data(entryValue), "wolfssl"); #endif /* WOLFSSL_MULTI_ATTRIB */ /* try invalid index locations for regression test and sanity check */ - AssertNull(entry = X509_NAME_get_entry(x509name, 11)); - AssertNull(entry = X509_NAME_get_entry(x509name, 20)); + ExpectNull(entry = X509_NAME_get_entry(x509name, 11)); + ExpectNull(entry = X509_NAME_get_entry(x509name, 20)); X509_free(x509); #endif /* OPENSSL_EXTRA */ wc_FreeRsaKey(&key); wc_FreeRng(&rng); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_get_version(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) - WOLFSSL_X509 *x509; + WOLFSSL_X509 *x509 = NULL; - x509 = wolfSSL_X509_load_certificate_file(svrCertFile, WOLFSSL_FILETYPE_PEM); - AssertNotNull(x509); - AssertIntEQ((int)wolfSSL_X509_get_version(x509), 2); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, + WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ((int)wolfSSL_X509_get_version(x509), 2); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); -#endif - return res; -} - -static int test_wolfSSL_DES_ncbc(void) -{ - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_DES3) - const_DES_cblock myDes; - DES_cblock iv = {1}; - DES_key_schedule key = {0}; - unsigned char msg[] = "hello wolfssl"; - unsigned char out[DES_BLOCK_SIZE * 2] = {0}; - unsigned char pln[DES_BLOCK_SIZE * 2] = {0}; - - unsigned char exp[] = {0x31, 0x98, 0x2F, 0x3A, 0x55, 0xBF, 0xD8, 0xC4}; - unsigned char exp2[] = {0xC7, 0x45, 0x8B, 0x28, 0x10, 0x53, 0xE0, 0x58}; - - /* partial block test */ - DES_set_key(&key, &myDes); - DES_ncbc_encrypt(msg, out, 3, &myDes, &iv, DES_ENCRYPT); - AssertIntEQ(XMEMCMP(exp, out, DES_BLOCK_SIZE), 0); - AssertIntEQ(XMEMCMP(exp, iv, DES_BLOCK_SIZE), 0); - - DES_set_key(&key, &myDes); - XMEMSET((byte*)&iv, 0, DES_BLOCK_SIZE); - *((byte*)&iv) = 1; - DES_ncbc_encrypt(out, pln, 3, &myDes, &iv, DES_DECRYPT); - AssertIntEQ(XMEMCMP(msg, pln, 3), 0); - AssertIntEQ(XMEMCMP(exp, iv, DES_BLOCK_SIZE), 0); - - /* full block test */ - DES_set_key(&key, &myDes); - XMEMSET(pln, 0, DES_BLOCK_SIZE); - XMEMSET((byte*)&iv, 0, DES_BLOCK_SIZE); - *((byte*)&iv) = 1; - DES_ncbc_encrypt(msg, out, 8, &myDes, &iv, DES_ENCRYPT); - AssertIntEQ(XMEMCMP(exp2, out, DES_BLOCK_SIZE), 0); - AssertIntEQ(XMEMCMP(exp2, iv, DES_BLOCK_SIZE), 0); - - DES_set_key(&key, &myDes); - XMEMSET((byte*)&iv, 0, DES_BLOCK_SIZE); - *((byte*)&iv) = 1; - DES_ncbc_encrypt(out, pln, 8, &myDes, &iv, DES_DECRYPT); - AssertIntEQ(XMEMCMP(msg, pln, 8), 0); - AssertIntEQ(XMEMCMP(exp2, iv, DES_BLOCK_SIZE), 0); - - res = TEST_RES_CHECK(1); -#endif - return res; -} - -static int test_wolfSSL_AES_cbc_encrypt(void) -{ - int res = TEST_SKIPPED; -#if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(OPENSSL_EXTRA) - AES_KEY aes; - AES_KEY* aesN = NULL; - size_t len = 0; - size_t lenB = 0; - int keySz0 = 0; - int keySzN = -1; - byte out[AES_BLOCK_SIZE] = {0}; - byte* outN = NULL; - - /* Test vectors retrieved from: - * - * https://csrc.nist.gov/ - * CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/ - * documents/aes/KAT_AES.zip - * - */ - const byte* pt128N = NULL; - byte* key128N = NULL; - byte* iv128N = NULL; - byte iv128tmp[AES_BLOCK_SIZE] = {0}; - - const byte pt128[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; - - const byte ct128[] = { 0x87,0x85,0xb1,0xa7,0x5b,0x0f,0x3b,0xd9, - 0x58,0xdc,0xd0,0xe2,0x93,0x18,0xc5,0x21 }; - - const byte iv128[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; - - byte key128[] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0x00 }; - - - len = sizeof(pt128); - - #define STRESS_T(a, b, c, d, e, f, g, h, i) \ - wolfSSL_AES_cbc_encrypt(a, b, c, d, e, f); \ - AssertIntNE(XMEMCMP(b, g, h), i) - - #define RESET_IV(x, y) XMEMCPY(x, y, AES_BLOCK_SIZE) - - /* Stressing wolfSSL_AES_cbc_encrypt() */ - STRESS_T(pt128N, out, len, &aes, iv128tmp, 1, ct128, AES_BLOCK_SIZE, 0); - STRESS_T(pt128, out, len, &aes, iv128N, 1, ct128, AES_BLOCK_SIZE, 0); - - wolfSSL_AES_cbc_encrypt(pt128, outN, len, &aes, iv128tmp, AES_ENCRYPT); - AssertIntNE(XMEMCMP(out, ct128, AES_BLOCK_SIZE), 0); - wolfSSL_AES_cbc_encrypt(pt128, out, len, aesN, iv128tmp, AES_ENCRYPT); - AssertIntNE(XMEMCMP(out, ct128, AES_BLOCK_SIZE), 0); - - STRESS_T(pt128, out, lenB, &aes, iv128tmp, 1, ct128, AES_BLOCK_SIZE, 0); - - /* Stressing wolfSSL_AES_set_encrypt_key */ - AssertIntNE(wolfSSL_AES_set_encrypt_key(key128N, sizeof(key128)*8, &aes),0); - AssertIntNE(wolfSSL_AES_set_encrypt_key(key128, sizeof(key128)*8, aesN),0); - AssertIntNE(wolfSSL_AES_set_encrypt_key(key128, keySz0, &aes), 0); - AssertIntNE(wolfSSL_AES_set_encrypt_key(key128, keySzN, &aes), 0); - - /* Stressing wolfSSL_AES_set_decrypt_key */ - AssertIntNE(wolfSSL_AES_set_decrypt_key(key128N, sizeof(key128)*8, &aes),0); - AssertIntNE(wolfSSL_AES_set_decrypt_key(key128N, sizeof(key128)*8, aesN),0); - AssertIntNE(wolfSSL_AES_set_decrypt_key(key128, keySz0, &aes), 0); - AssertIntNE(wolfSSL_AES_set_decrypt_key(key128, keySzN, &aes), 0); - - #ifdef WOLFSSL_AES_128 - - /* wolfSSL_AES_cbc_encrypt() 128-bit */ - XMEMSET(out, 0, AES_BLOCK_SIZE); - RESET_IV(iv128tmp, iv128); - - AssertIntEQ(wolfSSL_AES_set_encrypt_key(key128, sizeof(key128)*8, &aes), 0); - wolfSSL_AES_cbc_encrypt(pt128, out, len, &aes, iv128tmp, AES_ENCRYPT); - AssertIntEQ(XMEMCMP(out, ct128, AES_BLOCK_SIZE), 0); - wc_AesFree((Aes*)&aes); - - #ifdef HAVE_AES_DECRYPT - - /* wolfSSL_AES_cbc_encrypt() 128-bit in decrypt mode */ - XMEMSET(out, 0, AES_BLOCK_SIZE); - RESET_IV(iv128tmp, iv128); - len = sizeof(ct128); - - AssertIntEQ(wolfSSL_AES_set_decrypt_key(key128, sizeof(key128)*8, &aes), 0); - wolfSSL_AES_cbc_encrypt(ct128, out, len, &aes, iv128tmp, AES_DECRYPT); - AssertIntEQ(XMEMCMP(out, pt128, AES_BLOCK_SIZE), 0); - wc_AesFree((Aes*)&aes); - - #endif - - #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 - { - /* Test vectors from NIST Special Publication 800-38A, 2001 Edition - * Appendix F.2.3 */ - - byte iv192tmp[AES_BLOCK_SIZE] = {0}; - - const byte pt192[] = { 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96, - 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a }; - - const byte ct192[] = { 0x4f,0x02,0x1d,0xb2,0x43,0xbc,0x63,0x3d, - 0x71,0x78,0x18,0x3a,0x9f,0xa0,0x71,0xe8 }; - - const byte iv192[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, - 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; - - byte key192[] = { 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52, - 0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, - 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b }; - - len = sizeof(pt192); - - /* wolfSSL_AES_cbc_encrypt() 192-bit */ - XMEMSET(out, 0, AES_BLOCK_SIZE); - RESET_IV(iv192tmp, iv192); - - AssertIntEQ(wolfSSL_AES_set_encrypt_key(key192, sizeof(key192)*8, &aes), 0); - wolfSSL_AES_cbc_encrypt(pt192, out, len, &aes, iv192tmp, AES_ENCRYPT); - AssertIntEQ(XMEMCMP(out, ct192, AES_BLOCK_SIZE), 0); - wc_AesFree((Aes*)&aes); - - #ifdef HAVE_AES_DECRYPT - - /* wolfSSL_AES_cbc_encrypt() 192-bit in decrypt mode */ - len = sizeof(ct192); - RESET_IV(iv192tmp, iv192); - XMEMSET(out, 0, AES_BLOCK_SIZE); - - AssertIntEQ(wolfSSL_AES_set_decrypt_key(key192, sizeof(key192)*8, &aes), 0); - wolfSSL_AES_cbc_encrypt(ct192, out, len, &aes, iv192tmp, AES_DECRYPT); - AssertIntEQ(XMEMCMP(out, pt192, AES_BLOCK_SIZE), 0); - wc_AesFree((Aes*)&aes); - - #endif - } - #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 - { - /* Test vectors from NIST Special Publication 800-38A, 2001 Edition, - * Appendix F.2.5 */ - byte iv256tmp[AES_BLOCK_SIZE] = {0}; - - const byte pt256[] = { 0x6b,0xc1,0xbe,0xe2,0x2e,0x40,0x9f,0x96, - 0xe9,0x3d,0x7e,0x11,0x73,0x93,0x17,0x2a }; - - const byte ct256[] = { 0xf5,0x8c,0x4c,0x04,0xd6,0xe5,0xf1,0xba, - 0x77,0x9e,0xab,0xfb,0x5f,0x7b,0xfb,0xd6 }; - - const byte iv256[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, - 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; - - byte key256[] = { 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe, - 0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, - 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7, - 0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4 }; - - - len = sizeof(pt256); - - /* wolfSSL_AES_cbc_encrypt() 256-bit */ - XMEMSET(out, 0, AES_BLOCK_SIZE); - RESET_IV(iv256tmp, iv256); - - AssertIntEQ(wolfSSL_AES_set_encrypt_key(key256, sizeof(key256)*8, &aes), 0); - wolfSSL_AES_cbc_encrypt(pt256, out, len, &aes, iv256tmp, AES_ENCRYPT); - AssertIntEQ(XMEMCMP(out, ct256, AES_BLOCK_SIZE), 0); - wc_AesFree((Aes*)&aes); - - #ifdef HAVE_AES_DECRYPT - - /* wolfSSL_AES_cbc_encrypt() 256-bit in decrypt mode */ - len = sizeof(ct256); - RESET_IV(iv256tmp, iv256); - XMEMSET(out, 0, AES_BLOCK_SIZE); - - AssertIntEQ(wolfSSL_AES_set_decrypt_key(key256, sizeof(key256)*8, &aes), 0); - wolfSSL_AES_cbc_encrypt(ct256, out, len, &aes, iv256tmp, AES_DECRYPT); - AssertIntEQ(XMEMCMP(out, pt256, AES_BLOCK_SIZE), 0); - wc_AesFree((Aes*)&aes); - - #endif - - #if defined(HAVE_AES_KEYWRAP) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) - { - byte wrapCipher[sizeof(key256) + KEYWRAP_BLOCK_SIZE] = { 0 }; - byte wrapPlain[sizeof(key256)] = { 0 }; - byte wrapIV[KEYWRAP_BLOCK_SIZE] = { 0 }; - - /* wolfSSL_AES_wrap_key() 256-bit NULL iv */ - AssertIntEQ(wolfSSL_AES_set_encrypt_key(key256, sizeof(key256)*8, &aes), 0); - AssertIntEQ(wolfSSL_AES_wrap_key(&aes, NULL, wrapCipher, key256, - 15), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_AES_wrap_key(&aes, NULL, wrapCipher, key256, - sizeof(key256)), sizeof(wrapCipher)); - wc_AesFree((Aes*)&aes); - - /* wolfSSL_AES_unwrap_key() 256-bit NULL iv */ - AssertIntEQ(wolfSSL_AES_set_decrypt_key(key256, sizeof(key256)*8, &aes), 0); - AssertIntEQ(wolfSSL_AES_unwrap_key(&aes, NULL, wrapPlain, wrapCipher, - 23), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_AES_unwrap_key(&aes, NULL, wrapPlain, wrapCipher, - sizeof(wrapCipher)), sizeof(wrapPlain)); - AssertIntEQ(XMEMCMP(wrapPlain, key256, sizeof(key256)), 0); - XMEMSET(wrapCipher, 0, sizeof(wrapCipher)); - XMEMSET(wrapPlain, 0, sizeof(wrapPlain)); - wc_AesFree((Aes*)&aes); - - /* wolfSSL_AES_wrap_key() 256-bit custom iv */ - AssertIntEQ(wolfSSL_AES_set_encrypt_key(key256, sizeof(key256)*8, &aes), 0); - AssertIntEQ(wolfSSL_AES_wrap_key(&aes, wrapIV, wrapCipher, key256, - sizeof(key256)), sizeof(wrapCipher)); - wc_AesFree((Aes*)&aes); - - /* wolfSSL_AES_unwrap_key() 256-bit custom iv */ - AssertIntEQ(wolfSSL_AES_set_decrypt_key(key256, sizeof(key256)*8, &aes), 0); - AssertIntEQ(wolfSSL_AES_unwrap_key(&aes, wrapIV, wrapPlain, wrapCipher, - sizeof(wrapCipher)), sizeof(wrapPlain)); - AssertIntEQ(XMEMCMP(wrapPlain, key256, sizeof(key256)), 0); - wc_AesFree((Aes*)&aes); - } - #endif /* HAVE_AES_KEYWRAP */ - } - #endif /* WOLFSSL_AES_256 */ - - res = TEST_RES_CHECK(1); #endif - return res; -} - -static int test_wolfSSL_CRYPTO_cts128(void) -{ - int res = TEST_SKIPPED; -#if !defined(NO_AES) && defined(HAVE_AES_CBC) && defined(OPENSSL_EXTRA) \ - && defined(HAVE_CTS) - byte tmp[64]; /* Largest vector size */ - /* Test vectors taken form RFC3962 Appendix B */ - const testVector vects[] = { - { - "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" - "\x20", - "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4\xd8\xa5\x80\x36\x2d\xa7\xff\x7f" - "\x97", - 17, 17 - }, - { - "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" - "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20", - "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1\xd4\x45\xd4\xc8\xef\xf7\xed\x22" - "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5", - 31, 31 - }, - { - "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" - "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43", - "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8" - "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84", - 32, 32 - }, - { - "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" - "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43" - "\x68\x69\x63\x6b\x65\x6e\x2c\x20\x70\x6c\x65\x61\x73\x65\x2c", - "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" - "\xb3\xff\xfd\x94\x0c\x16\xa1\x8c\x1b\x55\x49\xd2\xf8\x38\x02\x9e" - "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5", - 47, 47 - }, - { - "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" - "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43" - "\x68\x69\x63\x6b\x65\x6e\x2c\x20\x70\x6c\x65\x61\x73\x65\x2c\x20", - "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" - "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8" - "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8", - 48, 48 - }, - { - "\x49\x20\x77\x6f\x75\x6c\x64\x20\x6c\x69\x6b\x65\x20\x74\x68\x65" - "\x20\x47\x65\x6e\x65\x72\x61\x6c\x20\x47\x61\x75\x27\x73\x20\x43" - "\x68\x69\x63\x6b\x65\x6e\x2c\x20\x70\x6c\x65\x61\x73\x65\x2c\x20" - "\x61\x6e\x64\x20\x77\x6f\x6e\x74\x6f\x6e\x20\x73\x6f\x75\x70\x2e", - "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84" - "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8" - "\x48\x07\xef\xe8\x36\xee\x89\xa5\x26\x73\x0d\xbc\x2f\x7b\xc8\x40" - "\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8", - 64, 64 - } - }; - byte keyBytes[AES_128_KEY_SIZE] = { - 0x63, 0x68, 0x69, 0x63, 0x6b, 0x65, 0x6e, 0x20, - 0x74, 0x65, 0x72, 0x69, 0x79, 0x61, 0x6b, 0x69 - }; - size_t i; - XMEMSET(tmp, 0, sizeof(tmp)); - for (i = 0; i < sizeof(vects)/sizeof(vects[0]); i++) { - AES_KEY encKey; - AES_KEY decKey; - byte iv[AES_IV_SIZE]; /* All-zero IV for all cases */ - XMEMSET(iv, 0, sizeof(iv)); - AssertIntEQ(AES_set_encrypt_key(keyBytes, AES_128_KEY_SIZE * 8, &encKey), 0); - AssertIntEQ(AES_set_decrypt_key(keyBytes, AES_128_KEY_SIZE * 8, &decKey), 0); - AssertIntEQ(CRYPTO_cts128_encrypt((const unsigned char*)vects[i].input, - tmp, vects[i].inLen, &encKey, iv, (cbc128_f)AES_cbc_encrypt), - vects[i].outLen); - AssertIntEQ(XMEMCMP(tmp, vects[i].output, vects[i].outLen), 0); - XMEMSET(iv, 0, sizeof(iv)); - AssertIntEQ(CRYPTO_cts128_decrypt((const unsigned char*)vects[i].output, - tmp, vects[i].outLen, &decKey, iv, (cbc128_f)AES_cbc_encrypt), - vects[i].inLen); - AssertIntEQ(XMEMCMP(tmp, vects[i].input, vects[i].inLen), 0); - } - - res = TEST_RES_CHECK(1); -#endif /* !NO_AES && HAVE_AES_CBC && OPENSSL_EXTRA && HAVE_CTS */ - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_ALL) static int test_wolfSSL_sk_CIPHER_description(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_COMPRESSION; - int i,j,k; + int i; int numCiphers = 0; const SSL_METHOD *method = NULL; const SSL_CIPHER *cipher = NULL; @@ -49040,38 +59667,35 @@ const char certPath[] = "./certs/client-cert.pem"; XMEMSET(buf, 0, sizeof(buf)); - AssertNotNull(method = TLSv1_2_client_method()); - AssertNotNull(ctx = SSL_CTX_new(method)); - + ExpectNotNull(method = TLSv1_2_client_method()); + ExpectNotNull(ctx = SSL_CTX_new(method)); SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); SSL_CTX_set_verify_depth(ctx, 4); - SSL_CTX_set_options(ctx, flags); - AssertIntEQ(SSL_CTX_load_verify_locations(ctx, certPath, NULL), + ExpectIntEQ(SSL_CTX_load_verify_locations(ctx, certPath, NULL), WOLFSSL_SUCCESS); - AssertNotNull(ssl = SSL_new(ctx)); + ExpectNotNull(ssl = SSL_new(ctx)); /* SSL_get_ciphers returns a stack of all configured ciphers * A flag, getCipherAtOffset, is set to later have SSL_CIPHER_description */ - AssertNotNull(supportedCiphers = SSL_get_ciphers(ssl)); + ExpectNotNull(supportedCiphers = SSL_get_ciphers(ssl)); /* loop through the amount of supportedCiphers */ numCiphers = sk_num(supportedCiphers); for (i = 0; i < numCiphers; ++i) { - + int j; /* sk_value increments "sk->data.cipher->cipherOffset". * wolfSSL_sk_CIPHER_description sets the description for * the cipher based on the provided offset. */ - if ((cipher = (const WOLFSSL_CIPHER*)sk_value(supportedCiphers, i))) { SSL_CIPHER_description(cipher, buf, sizeof(buf)); } /* Search cipher description string for "unknown" descriptor */ for (j = 0; j < (int)XSTRLEN(buf); j++) { - k = 0; + int k = 0; while ((k < (int)XSTRLEN(badStr)) && (buf[j] == badStr[k])) { test_str[k] = badStr[k]; j++; @@ -49079,19 +59703,17 @@ } } /* Fail if test_str == badStr == "unknown" */ - AssertStrNE(test_str,badStr); + ExpectStrNE(test_str,badStr); } SSL_free(ssl); SSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_get_ciphers_compat(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) const SSL_METHOD *method = NULL; const char certPath[] = "./certs/client-cert.pem"; @@ -49100,37 +59722,32 @@ WOLFSSL *ssl = NULL; const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_COMPRESSION; - method = SSLv23_client_method(); - AssertNotNull(method); - ctx = SSL_CTX_new(method); - AssertNotNull(ctx); - + ExpectNotNull(method = SSLv23_client_method()); + ExpectNotNull(ctx = SSL_CTX_new(method)); SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, 0); SSL_CTX_set_verify_depth(ctx, 4); - SSL_CTX_set_options(ctx, flags); - AssertIntEQ(SSL_CTX_load_verify_locations(ctx, certPath, NULL), + ExpectIntEQ(SSL_CTX_load_verify_locations(ctx, certPath, NULL), WOLFSSL_SUCCESS); - AssertNotNull(ssl = SSL_new(ctx)); + ExpectNotNull(ssl = SSL_new(ctx)); /* Test Bad NULL input */ - AssertNull(supportedCiphers = SSL_get_ciphers(NULL)); + ExpectNull(supportedCiphers = SSL_get_ciphers(NULL)); /* Test for Good input */ - AssertNotNull(supportedCiphers = SSL_get_ciphers(ssl)); + ExpectNotNull(supportedCiphers = SSL_get_ciphers(ssl)); /* Further usage of SSL_get_ciphers/wolfSSL_get_ciphers_compat is * tested in test_wolfSSL_sk_CIPHER_description according to Qt usage */ SSL_free(ssl); SSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_PUBKEY_get(void) { + EXPECT_DECLS; WOLFSSL_X509_PUBKEY pubkey; WOLFSSL_X509_PUBKEY* key; WOLFSSL_EVP_PKEY evpkey ; @@ -49146,20 +59763,20 @@ evpPkey->type = WOLFSSL_SUCCESS; key->pkey = evpPkey; - AssertNotNull(retEvpPkey = wolfSSL_X509_PUBKEY_get(key)); - AssertIntEQ(retEvpPkey->type, WOLFSSL_SUCCESS); + ExpectNotNull(retEvpPkey = wolfSSL_X509_PUBKEY_get(key)); + ExpectIntEQ(retEvpPkey->type, WOLFSSL_SUCCESS); - AssertNull(retEvpPkey = wolfSSL_X509_PUBKEY_get(NULL)); + ExpectNull(retEvpPkey = wolfSSL_X509_PUBKEY_get(NULL)); key->pkey = NULL; - AssertNull(retEvpPkey = wolfSSL_X509_PUBKEY_get(key)); + ExpectNull(retEvpPkey = wolfSSL_X509_PUBKEY_get(key)); - return TEST_RES_CHECK(retEvpPkey == NULL); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_set1_get1_DSA(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) DSA *dsa = NULL; DSA *setDsa = NULL; @@ -49175,6 +59792,7 @@ const unsigned char* dsaKeyDer = dsa_key_der_1024; int dsaKeySz = sizeof_dsa_key_der_1024; byte tmp[ONEK_BUF]; + XMEMSET(tmp, 0, sizeof(tmp)); XMEMCPY(tmp, dsaKeyDer , dsaKeySz); bytes = dsaKeySz; @@ -49182,154 +59800,175 @@ const unsigned char* dsaKeyDer = dsa_key_der_2048; int dsaKeySz = sizeof_dsa_key_der_2048; byte tmp[TWOK_BUF]; + XMEMSET(tmp, 0, sizeof(tmp)); XMEMCPY(tmp, dsaKeyDer , dsaKeySz); - bytes = dsaKeySz; + bytes = (word32)dsaKeySz; #else byte tmp[TWOK_BUF]; const unsigned char* dsaKeyDer = (const unsigned char*)tmp; int dsaKeySz; + XFILE fp = XBADFILE; + XMEMSET(tmp, 0, sizeof(tmp)); - XFILE fp = XFOPEN("./certs/dsa2048.der", "rb"); - if (fp == XBADFILE) { - return WOLFSSL_BAD_FILE; - } - dsaKeySz = bytes = (word32) XFREAD(tmp, 1, sizeof(tmp), fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/dsa2048.der", "rb")) != XBADFILE); + ExpectIntGT(dsaKeySz = bytes = (word32) XFREAD(tmp, 1, sizeof(tmp), fp), 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif /* END USE_CERT_BUFFERS_1024 */ /* Create hash to later Sign and Verify */ - AssertIntEQ(SHA1_Init(&sha), WOLFSSL_SUCCESS); - AssertIntEQ(SHA1_Update(&sha, tmp, bytes), WOLFSSL_SUCCESS); - AssertIntEQ(SHA1_Final(hash,&sha), WOLFSSL_SUCCESS); + ExpectIntEQ(SHA1_Init(&sha), WOLFSSL_SUCCESS); + ExpectIntEQ(SHA1_Update(&sha, tmp, bytes), WOLFSSL_SUCCESS); + ExpectIntEQ(SHA1_Final(hash,&sha), WOLFSSL_SUCCESS); /* Initialize pkey with der format dsa key */ - AssertNotNull(d2i_PrivateKey(EVP_PKEY_DSA, &pkey, &dsaKeyDer, + ExpectNotNull(d2i_PrivateKey(EVP_PKEY_DSA, &pkey, &dsaKeyDer, (long)dsaKeySz)); /* Test wolfSSL_EVP_PKEY_get1_DSA */ /* Should Fail: NULL argument */ - AssertNull(dsa = EVP_PKEY_get0_DSA(NULL)); - AssertNull(dsa = EVP_PKEY_get1_DSA(NULL)); + ExpectNull(dsa = EVP_PKEY_get0_DSA(NULL)); + ExpectNull(dsa = EVP_PKEY_get1_DSA(NULL)); /* Should Pass: Initialized pkey argument */ - AssertNotNull(dsa = EVP_PKEY_get0_DSA(pkey)); - AssertNotNull(dsa = EVP_PKEY_get1_DSA(pkey)); + ExpectNotNull(dsa = EVP_PKEY_get0_DSA(pkey)); + ExpectNotNull(dsa = EVP_PKEY_get1_DSA(pkey)); #ifdef USE_CERT_BUFFERS_1024 - AssertIntEQ(DSA_bits(dsa), 1024); + ExpectIntEQ(DSA_bits(dsa), 1024); #else - AssertIntEQ(DSA_bits(dsa), 2048); + ExpectIntEQ(DSA_bits(dsa), 2048); #endif /* Sign */ - AssertIntEQ(wolfSSL_DSA_do_sign(hash, signature, dsa), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_DSA_do_sign(hash, signature, dsa), WOLFSSL_SUCCESS); /* Verify. */ - AssertIntEQ(wolfSSL_DSA_do_verify(hash, signature, dsa, &answer), + ExpectIntEQ(wolfSSL_DSA_do_verify(hash, signature, dsa, &answer), WOLFSSL_SUCCESS); /* Test wolfSSL_EVP_PKEY_set1_DSA */ /* Should Fail: set1Pkey not initialized */ - AssertIntNE(EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); + ExpectIntNE(EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); /* Initialize set1Pkey */ set1Pkey = EVP_PKEY_new(); /* Should Fail Verify: setDsa not initialized from set1Pkey */ - AssertIntNE(wolfSSL_DSA_do_verify(hash,signature,setDsa,&answer), + ExpectIntNE(wolfSSL_DSA_do_verify(hash,signature,setDsa,&answer), WOLFSSL_SUCCESS); /* Should Pass: set dsa into set1Pkey */ - AssertIntEQ(EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_set1_DSA(set1Pkey, dsa), WOLFSSL_SUCCESS); DSA_free(dsa); DSA_free(setDsa); EVP_PKEY_free(pkey); EVP_PKEY_free(set1Pkey); - - res = TEST_RES_CHECK(1); #endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */ - return res; + return EXPECT_RESULT(); } /* END test_EVP_PKEY_set1_get1_DSA */ +static int test_wolfSSL_DSA_generate_parameters(void) +{ + EXPECT_DECLS; +#if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) && \ + !defined(HAVE_FIPS) + DSA *dsa = NULL; + + ExpectNotNull(dsa = DSA_generate_parameters(2048, NULL, 0, NULL, NULL, NULL, + NULL)); + DSA_free(dsa); +#endif + return EXPECT_RESULT(); +} + static int test_wolfSSL_DSA_SIG(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) && \ !defined(HAVE_FIPS) - DSA *dsa = NULL; - DSA *dsa2 = NULL; - DSA_SIG *sig = NULL; - const BIGNUM *p = NULL; - const BIGNUM *q = NULL; - const BIGNUM *g = NULL; - const BIGNUM *pub = NULL; - const BIGNUM *priv = NULL; + DSA *dsa = NULL; + DSA *dsa2 = NULL; + DSA_SIG *sig = NULL; + const BIGNUM *p = NULL; + const BIGNUM *q = NULL; + const BIGNUM *g = NULL; + const BIGNUM *pub = NULL; + const BIGNUM *priv = NULL; + BIGNUM *dup_p = NULL; + BIGNUM *dup_q = NULL; + BIGNUM *dup_g = NULL; + BIGNUM *dup_pub = NULL; + BIGNUM *dup_priv = NULL; const byte digest[WC_SHA_DIGEST_SIZE] = {0}; - AssertNotNull(dsa = DSA_generate_parameters(2048, - NULL, 0, NULL, NULL, NULL, NULL)); - DSA_free(dsa); - AssertNotNull(dsa = DSA_new()); - AssertIntEQ(DSA_generate_parameters_ex(dsa, 2048, - NULL, 0, NULL, NULL, NULL), 1); - AssertIntEQ(DSA_generate_key(dsa), 1); + ExpectNotNull(dsa = DSA_new()); + ExpectIntEQ(DSA_generate_parameters_ex(dsa, 2048, NULL, 0, NULL, NULL, + NULL), 1); + ExpectIntEQ(DSA_generate_key(dsa), 1); DSA_get0_pqg(dsa, &p, &q, &g); DSA_get0_key(dsa, &pub, &priv); - AssertNotNull(p = BN_dup(p)); - AssertNotNull(q = BN_dup(q)); - AssertNotNull(g = BN_dup(g)); - AssertNotNull(pub = BN_dup(pub)); - AssertNotNull(priv = BN_dup(priv)); - - AssertNotNull(sig = DSA_do_sign(digest, sizeof(digest), dsa)); - AssertNotNull(dsa2 = DSA_new()); - AssertIntEQ(DSA_set0_pqg(dsa2, (BIGNUM*)p, (BIGNUM*)q, (BIGNUM*)g), 1); - AssertIntEQ(DSA_set0_key(dsa2, (BIGNUM*)pub, (BIGNUM*)priv), 1); - AssertIntEQ(DSA_do_verify(digest, sizeof(digest), sig, dsa2), 1); + ExpectNotNull(dup_p = BN_dup(p)); + ExpectNotNull(dup_q = BN_dup(q)); + ExpectNotNull(dup_g = BN_dup(g)); + ExpectNotNull(dup_pub = BN_dup(pub)); + ExpectNotNull(dup_priv = BN_dup(priv)); + + ExpectNotNull(sig = DSA_do_sign(digest, sizeof(digest), dsa)); + ExpectNotNull(dsa2 = DSA_new()); + ExpectIntEQ(DSA_set0_pqg(dsa2, dup_p, dup_q, dup_g), 1); + if (EXPECT_FAIL()) { + BN_free(dup_p); + BN_free(dup_q); + BN_free(dup_g); + } + ExpectIntEQ(DSA_set0_key(dsa2, dup_pub, dup_priv), 1); + if (EXPECT_FAIL()) { + BN_free(dup_pub); + BN_free(dup_priv); + } + ExpectIntEQ(DSA_do_verify(digest, sizeof(digest), sig, dsa2), 1); DSA_free(dsa); DSA_free(dsa2); DSA_SIG_free(sig); - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_set1_get1_EC_KEY (void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_ECC - WOLFSSL_EC_KEY *ecKey = NULL; - WOLFSSL_EC_KEY *ecGet1 = NULL; - EVP_PKEY *pkey = NULL; + WOLFSSL_EC_KEY* ecKey = NULL; + WOLFSSL_EC_KEY* ecGet1 = NULL; + EVP_PKEY* pkey = NULL; - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); /* Test wolfSSL_EVP_PKEY_set1_EC_KEY */ - AssertIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(NULL, ecKey), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(pkey, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(NULL, ecKey), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(pkey, NULL), WOLFSSL_FAILURE); /* Should fail since ecKey is empty */ - AssertIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(pkey, ecKey), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); - AssertIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(pkey, ecKey), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(pkey, ecKey), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); + ExpectIntEQ(wolfSSL_EVP_PKEY_set1_EC_KEY(pkey, ecKey), WOLFSSL_SUCCESS); /* Test wolfSSL_EVP_PKEY_get1_EC_KEY */ - AssertNull(wolfSSL_EVP_PKEY_get1_EC_KEY(NULL)); - AssertNotNull(ecGet1 = wolfSSL_EVP_PKEY_get1_EC_KEY(pkey)); + ExpectNull(wolfSSL_EVP_PKEY_get1_EC_KEY(NULL)); + ExpectNotNull(ecGet1 = wolfSSL_EVP_PKEY_get1_EC_KEY(pkey)); wolfSSL_EC_KEY_free(ecKey); wolfSSL_EC_KEY_free(ecGet1); EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif /* HAVE_ECC */ - return res; + return EXPECT_RESULT(); } /* END test_EVP_PKEY_set1_get1_EC_KEY */ static int test_wolfSSL_EVP_PKEY_set1_get1_DH (void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM) @@ -49337,7 +59976,7 @@ DH *setDh = NULL; EVP_PKEY *pkey = NULL; - FILE* f = NULL; + XFILE f = XBADFILE; unsigned char buf[4096]; const unsigned char* pt = buf; const char* dh2048 = "./certs/dh2048.der"; @@ -49346,356 +59985,397 @@ XMEMSET(buf, 0, sizeof(buf)); - f = XFOPEN(dh2048, "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(dh2048, "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) + XFCLOSE(f); /* Load dh2048.der into DH with internal format */ - AssertNotNull(setDh = wolfSSL_d2i_DHparams(NULL, &pt, len)); + ExpectNotNull(setDh = wolfSSL_d2i_DHparams(NULL, &pt, len)); - AssertIntEQ(wolfSSL_DH_check(setDh, &code), WOLFSSL_SUCCESS); - AssertIntEQ(code, 0); + ExpectIntEQ(wolfSSL_DH_check(setDh, &code), WOLFSSL_SUCCESS); + ExpectIntEQ(code, 0); code = -1; - pkey = wolfSSL_EVP_PKEY_new(); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); /* Set DH into PKEY */ - AssertIntEQ(wolfSSL_EVP_PKEY_set1_DH(pkey, setDh), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_PKEY_set1_DH(pkey, setDh), WOLFSSL_SUCCESS); /* Get DH from PKEY */ - AssertNotNull(dh = wolfSSL_EVP_PKEY_get1_DH(pkey)); + ExpectNotNull(dh = wolfSSL_EVP_PKEY_get1_DH(pkey)); - AssertIntEQ(wolfSSL_DH_check(dh, &code), WOLFSSL_SUCCESS); - AssertIntEQ(code, 0); + ExpectIntEQ(wolfSSL_DH_check(dh, &code), WOLFSSL_SUCCESS); + ExpectIntEQ(code, 0); EVP_PKEY_free(pkey); DH_free(setDh); + setDh = NULL; DH_free(dh); - - res = TEST_RES_CHECK(1); + dh = NULL; #endif /* !NO_DH && WOLFSSL_DH_EXTRA && !NO_FILESYSTEM */ #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* OPENSSL_ALL || WOLFSSL_QT || WOLFSSL_OPENSSH */ - return res; + return EXPECT_RESULT(); } /* END test_EVP_PKEY_set1_get1_DH */ static int test_wolfSSL_CTX_ctrl(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) char caFile[] = "./certs/client-ca.pem"; char clientFile[] = "./certs/client-cert.pem"; - SSL_CTX* ctx; + SSL_CTX* ctx = NULL; X509* x509 = NULL; #if !defined(NO_DH) && !defined(NO_DSA) && !defined(NO_BIO) byte buf[6000]; char file[] = "./certs/dsaparams.pem"; - XFILE f; - int bytes; - BIO* bio; - DSA* dsa; - DH* dh; + XFILE f = XBADFILE; + int bytes = 0; + BIO* bio = NULL; + DSA* dsa = NULL; + DH* dh = NULL; #endif #ifdef HAVE_ECC - WOLFSSL_EC_KEY* ecKey; + WOLFSSL_EC_KEY* ecKey = NULL; #endif - AssertNotNull(ctx = SSL_CTX_new(wolfSSLv23_server_method())); + ExpectNotNull(ctx = SSL_CTX_new(wolfSSLv23_server_method())); - x509 = wolfSSL_X509_load_certificate_file(caFile, WOLFSSL_FILETYPE_PEM); - AssertNotNull(x509); - AssertIntEQ((int)SSL_CTX_add_extra_chain_cert(ctx, x509), WOLFSSL_SUCCESS); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(caFile, + WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ((int)SSL_CTX_add_extra_chain_cert(ctx, x509), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_X509_free(x509); + } - x509 = wolfSSL_X509_load_certificate_file(clientFile, WOLFSSL_FILETYPE_PEM); - AssertNotNull(x509); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(clientFile, + WOLFSSL_FILETYPE_PEM)); #if !defined(NO_DH) && !defined(NO_DSA) && !defined(NO_BIO) /* Initialize DH */ - f = XFOPEN(file, "rb"); - AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(file, "rb")) != XBADFILE); + ExpectIntGT(bytes = (int)XFREAD(buf, 1, sizeof(buf), f), 0); + if (f != XBADFILE) + XFCLOSE(f); - bio = BIO_new_mem_buf((void*)buf, bytes); - AssertNotNull(bio); + ExpectNotNull(bio = BIO_new_mem_buf((void*)buf, bytes)); - dsa = wolfSSL_PEM_read_bio_DSAparams(bio, NULL, NULL, NULL); - AssertNotNull(dsa); + ExpectNotNull(dsa = wolfSSL_PEM_read_bio_DSAparams(bio, NULL, NULL, NULL)); - dh = wolfSSL_DSA_dup_DH(dsa); - AssertNotNull(dh); + ExpectNotNull(dh = wolfSSL_DSA_dup_DH(dsa)); #endif #ifdef HAVE_ECC /* Initialize WOLFSSL_EC_KEY */ - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey),1); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); #endif -#if !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) /* additional test of getting EVP_PKEY key size from X509 * Do not run with user RSA because wolfSSL_RSA_size is not currently * allowed with user RSA */ { - EVP_PKEY* pkey; + EVP_PKEY* pkey = NULL; #if defined(HAVE_ECC) - X509* ecX509; + X509* ecX509 = NULL; #endif /* HAVE_ECC */ - AssertNotNull(pkey = X509_get_pubkey(x509)); + ExpectNotNull(pkey = X509_get_pubkey(x509)); /* current RSA key is 2048 bit (256 bytes) */ - AssertIntEQ(EVP_PKEY_size(pkey), 256); + ExpectIntEQ(EVP_PKEY_size(pkey), 256); EVP_PKEY_free(pkey); + pkey = NULL; #if defined(HAVE_ECC) #if defined(USE_CERT_BUFFERS_256) - AssertNotNull(ecX509 = wolfSSL_X509_load_certificate_buffer( - cliecc_cert_der_256, sizeof_cliecc_cert_der_256, - SSL_FILETYPE_ASN1)); + ExpectNotNull(ecX509 = wolfSSL_X509_load_certificate_buffer( + cliecc_cert_der_256, sizeof_cliecc_cert_der_256, + SSL_FILETYPE_ASN1)); #else - AssertNotNull(ecX509 = wolfSSL_X509_load_certificate_file( - cliEccCertFile, SSL_FILETYPE_PEM)); + ExpectNotNull(ecX509 = wolfSSL_X509_load_certificate_file( + cliEccCertFile, SSL_FILETYPE_PEM)); #endif - AssertNotNull(pkey = X509_get_pubkey(ecX509)); + ExpectNotNull(pkey = X509_get_pubkey(ecX509)); /* current ECC key is 256 bit (32 bytes) */ - AssertIntEQ(EVP_PKEY_size(pkey), 32); + ExpectIntEQ(EVP_PKEY_size(pkey), 32); X509_free(ecX509); EVP_PKEY_free(pkey); #endif /* HAVE_ECC */ } -#endif /* !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) */ /* Tests should fail with passed in NULL pointer */ - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,NULL), - SSL_FAILURE); + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_EXTRA_CHAIN_CERT, 0, NULL), + SSL_FAILURE); #if !defined(NO_DH) && !defined(NO_DSA) - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,NULL), - SSL_FAILURE); + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_DH, 0, NULL), + SSL_FAILURE); #endif #ifdef HAVE_ECC - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,NULL), - SSL_FAILURE); + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH, 0, NULL), + SSL_FAILURE); #endif /* Test with SSL_CTRL_EXTRA_CHAIN_CERT * wolfSSL_CTX_ctrl should succesffuly call SSL_CTX_add_extra_chain_cert */ - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,x509), - SSL_SUCCESS); + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_EXTRA_CHAIN_CERT, 0, x509), + SSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_X509_free(x509); + } /* Test with SSL_CTRL_OPTIONS * wolfSSL_CTX_ctrl should succesffuly call SSL_CTX_set_options */ - AssertTrue(wolfSSL_CTX_ctrl(ctx,SSL_CTRL_OPTIONS,SSL_OP_NO_TLSv1,NULL) - == SSL_OP_NO_TLSv1); - AssertTrue(SSL_CTX_get_options(ctx) == SSL_OP_NO_TLSv1); + ExpectTrue(wolfSSL_CTX_ctrl(ctx, SSL_CTRL_OPTIONS, SSL_OP_NO_TLSv1, + NULL) == SSL_OP_NO_TLSv1); + ExpectTrue(SSL_CTX_get_options(ctx) == SSL_OP_NO_TLSv1); /* Test with SSL_CTRL_SET_TMP_DH * wolfSSL_CTX_ctrl should succesffuly call wolfSSL_SSL_CTX_set_tmp_dh */ #if !defined(NO_DH) && !defined(NO_DSA) && !defined(NO_BIO) - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,dh), - SSL_SUCCESS); + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_DH, 0, dh), + SSL_SUCCESS); #endif /* Test with SSL_CTRL_SET_TMP_ECDH * wolfSSL_CTX_ctrl should succesffuly call wolfSSL_SSL_CTX_set_tmp_ecdh */ #ifdef HAVE_ECC - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,ecKey), - SSL_SUCCESS); + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_TMP_ECDH, 0, ecKey), + SSL_SUCCESS); #endif #ifdef WOLFSSL_ENCRYPTED_KEYS - AssertNull(SSL_CTX_get_default_passwd_cb(ctx)); - AssertNull(SSL_CTX_get_default_passwd_cb_userdata(ctx)); + ExpectNull(SSL_CTX_get_default_passwd_cb(ctx)); + ExpectNull(SSL_CTX_get_default_passwd_cb_userdata(ctx)); +#endif + + /* Test for min/max proto */ +#ifndef WOLFSSL_NO_TLS12 + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, + 0, NULL), SSL_SUCCESS); + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, + TLS1_2_VERSION, NULL), SSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_2_VERSION); #endif +#ifdef WOLFSSL_TLS13 + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, + 0, NULL), SSL_SUCCESS); - /* Test for min/max proto */ - #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, - 0, NULL), SSL_SUCCESS); - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, - TLS1_2_VERSION, NULL), SSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_2_VERSION); - - #endif - #ifdef WOLFSSL_TLS13 - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, - 0, NULL), SSL_SUCCESS); - - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, - TLS1_3_VERSION, NULL), SSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_get_max_proto_version(ctx), TLS1_3_VERSION); - #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, - TLS1_2_VERSION, NULL), SSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_get_max_proto_version(ctx), TLS1_2_VERSION); - #endif - #endif + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, + TLS1_3_VERSION, NULL), SSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_get_max_proto_version(ctx), TLS1_3_VERSION); +#ifndef WOLFSSL_NO_TLS12 + ExpectIntEQ((int)wolfSSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, + TLS1_2_VERSION, NULL), SSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_get_max_proto_version(ctx), TLS1_2_VERSION); +#endif +#endif /* Cleanup and Pass */ #if !defined(NO_DH) && !defined(NO_DSA) #ifndef NO_BIO BIO_free(bio); DSA_free(dsa); DH_free(dh); + dh = NULL; #endif #endif #ifdef HAVE_ECC wolfSSL_EC_KEY_free(ecKey); #endif SSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif /* defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ - return res; + * !defined(NO_FILESYSTEM) && !defined(NO_RSA) */ + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_assign(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; +#if !defined(NO_RSA) || !defined(NO_DSA) || defined(HAVE_ECC) int type; - WOLFSSL_EVP_PKEY* pkey; + WOLFSSL_EVP_PKEY* pkey = NULL; #ifndef NO_RSA - WOLFSSL_RSA* rsa; + WOLFSSL_RSA* rsa = NULL; #endif #ifndef NO_DSA - WOLFSSL_DSA* dsa; + WOLFSSL_DSA* dsa = NULL; #endif #ifdef HAVE_ECC - WOLFSSL_EC_KEY* ecKey; + WOLFSSL_EC_KEY* ecKey = NULL; #endif - (void)pkey; - #ifndef NO_RSA - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - type = EVP_PKEY_RSA; - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertNotNull(rsa = wolfSSL_RSA_new()); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,rsa), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,rsa), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,rsa), WOLFSSL_SUCCESS); - wolfSSL_EVP_PKEY_free(pkey); - res = TEST_RES_CHECK(1); + type = EVP_PKEY_RSA; + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(rsa = wolfSSL_RSA_new()); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(NULL, type, rsa), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, type, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, -1, rsa), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, type, rsa), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_RSA_free(rsa); } + wolfSSL_EVP_PKEY_free(pkey); + pkey = NULL; #endif /* NO_RSA */ #ifndef NO_DSA - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - type = EVP_PKEY_DSA; - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertNotNull(dsa = wolfSSL_DSA_new()); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,dsa), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,dsa), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,dsa), WOLFSSL_SUCCESS); - wolfSSL_EVP_PKEY_free(pkey); - res = TEST_RES_CHECK(1); + type = EVP_PKEY_DSA; + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(dsa = wolfSSL_DSA_new()); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(NULL, type, dsa), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, type, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, -1, dsa), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, type, dsa), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_DSA_free(dsa); } + wolfSSL_EVP_PKEY_free(pkey); + pkey = NULL; #endif /* NO_DSA */ #ifdef HAVE_ECC - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - type = EVP_PKEY_EC; - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(NULL,type,ecKey), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,NULL), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,-1,ecKey), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,ecKey), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); - AssertIntEQ(wolfSSL_EVP_PKEY_assign(pkey,type,ecKey), WOLFSSL_SUCCESS); - wolfSSL_EVP_PKEY_free(pkey); - res = TEST_RES_CHECK(1); + type = EVP_PKEY_EC; + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(NULL, type, ecKey), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, type, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, -1, ecKey), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, type, ecKey), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign(pkey, type, ecKey), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_EC_KEY_free(ecKey); } + wolfSSL_EVP_PKEY_free(pkey); + pkey = NULL; #endif /* HAVE_ECC */ +#endif /* !NO_RSA || !NO_DSA || HAVE_ECC */ + return EXPECT_RESULT(); +} - (void)type; +static int test_wolfSSL_EVP_PKEY_assign_DH(void) +{ + EXPECT_DECLS; +#if !defined(NO_DH) && \ + !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) + XFILE f = XBADFILE; + unsigned char buf[4096]; + const unsigned char* pt = buf; + const char* params1 = "./certs/dh2048.der"; + long len = 0; + WOLFSSL_DH* dh = NULL; + WOLFSSL_EVP_PKEY* pkey = NULL; + XMEMSET(buf, 0, sizeof(buf)); - return res; + /* Load DH parameters DER. */ + ExpectTrue((f = XFOPEN(params1, "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) + XFCLOSE(f); + + ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); + ExpectIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS); + + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + + /* Bad cases */ + ExpectIntEQ(wolfSSL_EVP_PKEY_assign_DH(NULL, dh), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign_DH(pkey, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_PKEY_assign_DH(NULL, NULL), WOLFSSL_FAILURE); + + /* Good case */ + ExpectIntEQ(wolfSSL_EVP_PKEY_assign_DH(pkey, dh), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_DH_free(dh); + } + + EVP_PKEY_free(pkey); +#endif + return EXPECT_RESULT(); } + static int test_wolfSSL_EVP_PKEY_base_id(void) { - WOLFSSL_EVP_PKEY* pkey; + EXPECT_DECLS; + WOLFSSL_EVP_PKEY* pkey = NULL; - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertIntEQ(wolfSSL_EVP_PKEY_base_id(NULL), NID_undef); + ExpectIntEQ(wolfSSL_EVP_PKEY_base_id(NULL), NID_undef); - AssertIntEQ(wolfSSL_EVP_PKEY_base_id(pkey), EVP_PKEY_RSA); + ExpectIntEQ(wolfSSL_EVP_PKEY_base_id(pkey), EVP_PKEY_RSA); EVP_PKEY_free(pkey); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_id(void) { - WOLFSSL_EVP_PKEY* pkey; + EXPECT_DECLS; + WOLFSSL_EVP_PKEY* pkey = NULL; - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertIntEQ(wolfSSL_EVP_PKEY_id(NULL), 0); + ExpectIntEQ(wolfSSL_EVP_PKEY_id(NULL), 0); - AssertIntEQ(wolfSSL_EVP_PKEY_id(pkey), EVP_PKEY_RSA); + ExpectIntEQ(wolfSSL_EVP_PKEY_id(pkey), EVP_PKEY_RSA); EVP_PKEY_free(pkey); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_paramgen(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && \ - !defined(NO_ECC_SECP) && \ - /* This last bit is taken from ecc.c. It is the condition that - * defines ECC256 */ \ + EXPECT_DECLS; + /* ECC check taken from ecc.c. It is the condition that defines ECC256 */ +#if defined(OPENSSL_ALL) && !defined(NO_ECC_SECP) && \ ((!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \ ECC_MIN_KEY_SZ <= 256) - EVP_PKEY_CTX* ctx; - EVP_PKEY* pkey = NULL; + EVP_PKEY_CTX* ctx = NULL; + EVP_PKEY* pkey = NULL; /* Test error conditions. */ - AssertIntEQ(EVP_PKEY_paramgen(NULL, &pkey), WOLFSSL_FAILURE); - AssertNotNull(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)); - AssertIntEQ(EVP_PKEY_paramgen(ctx, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_paramgen(NULL, &pkey), WOLFSSL_FAILURE); + ExpectNotNull(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)); + ExpectIntEQ(EVP_PKEY_paramgen(ctx, NULL), WOLFSSL_FAILURE); #ifndef NO_RSA EVP_PKEY_CTX_free(ctx); /* Parameter generation for RSA not supported yet. */ - AssertNotNull(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)); - AssertIntEQ(EVP_PKEY_paramgen(ctx, &pkey), WOLFSSL_FAILURE); + ExpectNotNull(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)); + ExpectIntEQ(EVP_PKEY_paramgen(ctx, &pkey), WOLFSSL_FAILURE); #endif #ifdef HAVE_ECC EVP_PKEY_CTX_free(ctx); - AssertNotNull(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)); - AssertIntEQ(EVP_PKEY_paramgen_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, - NID_X9_62_prime256v1), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_paramgen(ctx, &pkey), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_ec_param_enc(ctx, OPENSSL_EC_NAMED_CURVE), - WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_keygen_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_keygen(ctx, &pkey), WOLFSSL_SUCCESS); + ExpectNotNull(ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)); + ExpectIntEQ(EVP_PKEY_paramgen_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, + NID_X9_62_prime256v1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_paramgen(ctx, &pkey), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_ec_param_enc(ctx, OPENSSL_EC_NAMED_CURVE), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_keygen_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_keygen(ctx, &pkey), WOLFSSL_SUCCESS); #endif EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_keygen(void) { + EXPECT_DECLS; WOLFSSL_EVP_PKEY* pkey = NULL; EVP_PKEY_CTX* ctx = NULL; #if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)) @@ -49708,93 +60388,95 @@ byte* derBuffer = NULL; #endif - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); /* Bad cases */ - AssertIntEQ(wolfSSL_EVP_PKEY_keygen(NULL, &pkey), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_EVP_PKEY_keygen(ctx, NULL), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_EVP_PKEY_keygen(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_EVP_PKEY_keygen(NULL, &pkey), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_EVP_PKEY_keygen(ctx, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_EVP_PKEY_keygen(NULL, NULL), BAD_FUNC_ARG); /* Good case */ - AssertIntEQ(wolfSSL_EVP_PKEY_keygen(ctx, &pkey), 0); + ExpectIntEQ(wolfSSL_EVP_PKEY_keygen(ctx, &pkey), 0); EVP_PKEY_CTX_free(ctx); + ctx = NULL; EVP_PKEY_free(pkey); pkey = NULL; #if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)) /* Test DH keygen */ { - AssertNotNull(params = wolfSSL_EVP_PKEY_new()); - AssertNotNull(dh = DH_get_2048_256()); - AssertIntEQ(EVP_PKEY_set1_DH(params, dh), WOLFSSL_SUCCESS); - AssertNotNull(ctx = EVP_PKEY_CTX_new(params, NULL)); - AssertIntEQ(EVP_PKEY_keygen_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_keygen(ctx, &pkey), WOLFSSL_SUCCESS); + ExpectNotNull(params = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(dh = DH_get_2048_256()); + ExpectIntEQ(EVP_PKEY_set1_DH(params, dh), WOLFSSL_SUCCESS); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(params, NULL)); + ExpectIntEQ(EVP_PKEY_keygen_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_keygen(ctx, &pkey), WOLFSSL_SUCCESS); DH_free(dh); + dh = NULL; EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(params); /* try exporting generated key to DER, to verify */ - AssertNotNull(dh = EVP_PKEY_get1_DH(pkey)); + ExpectNotNull(dh = EVP_PKEY_get1_DH(pkey)); DH_get0_key(dh, &pubkey, &privkey); - AssertNotNull(pubkey); - AssertNotNull(privkey); - AssertNotNull(asn1int = BN_to_ASN1_INTEGER(pubkey, NULL)); - AssertIntGT((length = i2d_ASN1_INTEGER(asn1int, &derBuffer)), 0); + ExpectNotNull(pubkey); + ExpectNotNull(privkey); + ExpectNotNull(asn1int = BN_to_ASN1_INTEGER(pubkey, NULL)); + ExpectIntGT((length = i2d_ASN1_INTEGER(asn1int, &derBuffer)), 0); ASN1_INTEGER_free(asn1int); DH_free(dh); + dh = NULL; XFREE(derBuffer, NULL, DYNAMIC_TYPE_TMP_BUFFER); EVP_PKEY_free(pkey); } #endif - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_keygen_init(void) { - WOLFSSL_EVP_PKEY* pkey; - EVP_PKEY_CTX *ctx; - - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + EXPECT_DECLS; + WOLFSSL_EVP_PKEY* pkey = NULL; + EVP_PKEY_CTX *ctx = NULL; - AssertIntEQ(wolfSSL_EVP_PKEY_keygen_init(ctx), WOLFSSL_SUCCESS); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectIntEQ(wolfSSL_EVP_PKEY_keygen_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_PKEY_keygen_init(NULL), WOLFSSL_SUCCESS); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_missing_parameters(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_STUB) - WOLFSSL_EVP_PKEY* pkey; + WOLFSSL_EVP_PKEY* pkey = NULL; - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertIntEQ(wolfSSL_EVP_PKEY_missing_parameters(pkey), 0); + ExpectIntEQ(wolfSSL_EVP_PKEY_missing_parameters(pkey), 0); + ExpectIntEQ(wolfSSL_EVP_PKEY_missing_parameters(NULL), 0); EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_copy_parameters(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) && defined(WOLFSSL_KEY_GEN) && \ !defined(HAVE_SELFTEST) && (defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || \ defined(WOLFSSL_OPENSSH)) && defined(WOLFSSL_DH_EXTRA) && \ !defined(NO_FILESYSTEM) - WOLFSSL_EVP_PKEY* params = NULL; WOLFSSL_EVP_PKEY* copy = NULL; DH* dh = NULL; @@ -49806,73 +60488,70 @@ BIGNUM* q2; /* create DH with DH_get_2048_256 params */ - AssertNotNull(params = wolfSSL_EVP_PKEY_new()); - AssertNotNull(dh = DH_get_2048_256()); - AssertIntEQ(EVP_PKEY_set1_DH(params, dh), WOLFSSL_SUCCESS); + ExpectNotNull(params = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(dh = DH_get_2048_256()); + ExpectIntEQ(EVP_PKEY_set1_DH(params, dh), WOLFSSL_SUCCESS); DH_get0_pqg(dh, (const BIGNUM**)&p1, (const BIGNUM**)&q1, (const BIGNUM**)&g1); DH_free(dh); + dh = NULL; /* create DH with random generated DH params */ - AssertNotNull(copy = wolfSSL_EVP_PKEY_new()); - AssertNotNull(dh = DH_generate_parameters(2048, 2, NULL, NULL)); - AssertIntEQ(EVP_PKEY_set1_DH(copy, dh), WOLFSSL_SUCCESS); + ExpectNotNull(copy = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(dh = DH_generate_parameters(2048, 2, NULL, NULL)); + ExpectIntEQ(EVP_PKEY_set1_DH(copy, dh), WOLFSSL_SUCCESS); DH_free(dh); + dh = NULL; - AssertIntEQ(EVP_PKEY_copy_parameters(copy, params), WOLFSSL_SUCCESS); - AssertNotNull(dh = EVP_PKEY_get1_DH(copy)); - AssertNotNull(dh->p); - AssertNotNull(dh->g); - AssertNotNull(dh->q); + ExpectIntEQ(EVP_PKEY_copy_parameters(copy, params), WOLFSSL_SUCCESS); + ExpectNotNull(dh = EVP_PKEY_get1_DH(copy)); + ExpectNotNull(dh->p); + ExpectNotNull(dh->g); + ExpectNotNull(dh->q); DH_get0_pqg(dh, (const BIGNUM**)&p2, (const BIGNUM**)&q2, (const BIGNUM**)&g2); - AssertIntEQ(BN_cmp(p1, p2), 0); - AssertIntEQ(BN_cmp(q1, q2), 0); - AssertIntEQ(BN_cmp(g1, g2), 0); + ExpectIntEQ(BN_cmp(p1, p2), 0); + ExpectIntEQ(BN_cmp(q1, q2), 0); + ExpectIntEQ(BN_cmp(g1, g2), 0); DH_free(dh); + dh = NULL; EVP_PKEY_free(copy); EVP_PKEY_free(params); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(void) { - WOLFSSL_EVP_PKEY* pkey; - EVP_PKEY_CTX *ctx; + EXPECT_DECLS; + WOLFSSL_EVP_PKEY* pkey = NULL; + EVP_PKEY_CTX* ctx = NULL; int bits = 2048; + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - - AssertIntEQ(wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits), - WOLFSSL_SUCCESS); - + ExpectIntEQ(wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits), + WOLFSSL_SUCCESS); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_CIPHER_CTX_iv_length(void) { + EXPECT_DECLS; /* This is large enough to be used for all key sizes */ byte key[AES_256_KEY_SIZE] = {0}; byte iv[AES_BLOCK_SIZE] = {0}; - int i, enumlen; - EVP_CIPHER_CTX *ctx; - const EVP_CIPHER *init; - - int enumArray[] = { - + int i; + int nids[] = { #ifdef HAVE_AES_CBC NID_aes_128_cbc, #endif @@ -49891,7 +60570,6 @@ #endif }; int iv_lengths[] = { - #ifdef HAVE_AES_CBC AES_BLOCK_SIZE, #endif @@ -49909,444 +60587,470 @@ DES_BLOCK_SIZE, #endif }; + int nidsLen = (sizeof(nids)/sizeof(int)); - - enumlen = (sizeof(enumArray)/sizeof(int)); - for (i = 0; i < enumlen; i++) { - ctx = EVP_CIPHER_CTX_new(); - init = wolfSSL_EVP_get_cipherbynid(enumArray[i]); - + for (i = 0; i < nidsLen; i++) { + const EVP_CIPHER* init = wolfSSL_EVP_get_cipherbynid(nids[i]); + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_iv_length(ctx), iv_lengths[i]); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_iv_length(ctx), iv_lengths[i]); EVP_CIPHER_CTX_free(ctx); } - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_CIPHER_CTX_key_length(void) { - int res = TEST_SKIPPED; -#if !defined(NO_DES3) - byte key[AES_256_KEY_SIZE] = {0}; - byte iv[AES_BLOCK_SIZE] = {0}; - EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); - const EVP_CIPHER *init = EVP_des_ede3_cbc(); - - wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); - - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_key_length(ctx), 24); - - EVP_CIPHER_CTX_free(ctx); - - res = TEST_RES_CHECK(1); -#endif - return res; -} - -static int test_wolfSSL_EVP_CIPHER_CTX_set_key_length(void) -{ - int res = TEST_SKIPPED; -#if !defined(NO_DES3) + EXPECT_DECLS; byte key[AES_256_KEY_SIZE] = {0}; byte iv[AES_BLOCK_SIZE] = {0}; - int keylen; - EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); - const EVP_CIPHER *init = EVP_des_ede3_cbc(); + int i; + int nids[] = { + #ifdef HAVE_AES_CBC + NID_aes_128_cbc, + NID_aes_256_cbc, + #endif + #if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) + #ifdef HAVE_AESGCM + NID_aes_128_gcm, + NID_aes_256_gcm, + #endif + #endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION > 2 */ + #ifdef WOLFSSL_AES_COUNTER + NID_aes_128_ctr, + NID_aes_256_ctr, + #endif + #ifndef NO_DES3 + NID_des_cbc, + NID_des_ede3_cbc, + #endif + }; + int key_lengths[] = { + #ifdef HAVE_AES_CBC + AES_128_KEY_SIZE, + AES_256_KEY_SIZE, + #endif + #if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \ + (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) + #ifdef HAVE_AESGCM + AES_128_KEY_SIZE, + AES_256_KEY_SIZE, + #endif + #endif /* (HAVE_FIPS && !HAVE_SELFTEST) || HAVE_FIPS_VERSION > 2 */ + #ifdef WOLFSSL_AES_COUNTER + AES_128_KEY_SIZE, + AES_256_KEY_SIZE, + #endif + #ifndef NO_DES3 + DES_KEY_SIZE, + DES3_KEY_SIZE, + #endif + }; + int nidsLen = (sizeof(nids)/sizeof(int)); - wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + for (i = 0; i < nidsLen; i++) { + const EVP_CIPHER *init = wolfSSL_EVP_get_cipherbynid(nids[i]); + EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); + wolfSSL_EVP_CIPHER_CTX_init(ctx); - keylen = wolfSSL_EVP_CIPHER_CTX_key_length(ctx); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_key_length(ctx), key_lengths[i]); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, keylen), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, key_lengths[i]), + WOLFSSL_SUCCESS); - EVP_CIPHER_CTX_free(ctx); + EVP_CIPHER_CTX_free(ctx); + } - res = TEST_RES_CHECK(1); -#endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_CIPHER_CTX_set_iv(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_AESGCM) && !defined(NO_DES3) - byte key[DES3_KEY_SIZE] = {0}; - byte iv[DES_BLOCK_SIZE] = {0}; int ivLen, keyLen; EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); +#ifdef HAVE_AESGCM + byte key[AES_128_KEY_SIZE] = {0}; + byte iv[AES_BLOCK_SIZE] = {0}; + const EVP_CIPHER *init = EVP_aes_128_gcm(); +#else + byte key[DES3_KEY_SIZE] = {0}; + byte iv[DES_BLOCK_SIZE] = {0}; const EVP_CIPHER *init = EVP_des_ede3_cbc(); +#endif wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); ivLen = wolfSSL_EVP_CIPHER_CTX_iv_length(ctx); keyLen = wolfSSL_EVP_CIPHER_CTX_key_length(ctx); /* Bad cases */ - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(NULL, iv, ivLen), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, NULL, ivLen), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, iv, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(NULL, NULL, 0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, iv, keyLen), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(NULL, iv, ivLen), + WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, NULL, ivLen), + WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, iv, 0), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(NULL, NULL, 0), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, iv, keyLen), + WOLFSSL_FAILURE); /* Good case */ - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, iv, ivLen), 1); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_set_iv(ctx, iv, ivLen), 1); EVP_CIPHER_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_CTX_new_id(void) { + EXPECT_DECLS; WOLFSSL_ENGINE* e = NULL; int id = 0; - EVP_PKEY_CTX *ctx; + EVP_PKEY_CTX *ctx = NULL; - AssertNotNull(ctx = wolfSSL_EVP_PKEY_CTX_new_id(id, e)); + ExpectNotNull(ctx = wolfSSL_EVP_PKEY_CTX_new_id(id, e)); EVP_PKEY_CTX_free(ctx); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_rc4(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RC4) - res = TEST_RES_CHECK(wolfSSL_EVP_rc4() != NULL); + ExpectNotNull(wolfSSL_EVP_rc4()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_enc_null(void) { - return TEST_RES_CHECK(wolfSSL_EVP_enc_null() != NULL); + EXPECT_DECLS; + ExpectNotNull(wolfSSL_EVP_enc_null()); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_rc2_cbc(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_QT) && !defined(NO_WOLFSSL_STUB) - res = TEST_RES_CHECK(wolfSSL_EVP_rc2_cbc() == NULL); + ExpectNull(wolfSSL_EVP_rc2_cbc()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_mdc2(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_WOLFSSL_STUB) - res = TEST_RES_CHECK(wolfSSL_EVP_mdc2() == NULL); + ExpectNull(wolfSSL_EVP_mdc2()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_md4(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_MD4) - res = TEST_RES_CHECK(wolfSSL_EVP_md4() != NULL); + ExpectNotNull(wolfSSL_EVP_md4()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_aes_256_gcm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_AESGCM - res = TEST_RES_CHECK(wolfSSL_EVP_aes_256_gcm() != NULL); + ExpectNotNull(wolfSSL_EVP_aes_256_gcm()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_aes_192_gcm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_AESGCM - res = TEST_RES_CHECK(wolfSSL_EVP_aes_192_gcm() != NULL); + ExpectNotNull(wolfSSL_EVP_aes_192_gcm()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_aes_256_ccm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_AESCCM - res = TEST_RES_CHECK(wolfSSL_EVP_aes_256_ccm() != NULL); + ExpectNotNull(wolfSSL_EVP_aes_256_ccm()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_aes_192_ccm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_AESCCM - res = TEST_RES_CHECK(wolfSSL_EVP_aes_192_ccm() != NULL); + ExpectNotNull(wolfSSL_EVP_aes_192_ccm()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_aes_128_ccm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_AESCCM - res = TEST_RES_CHECK(wolfSSL_EVP_aes_128_ccm() != NULL); + ExpectNotNull(wolfSSL_EVP_aes_128_ccm()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_ripemd160(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_WOLFSSL_STUB) - res = TEST_RES_CHECK(wolfSSL_EVP_ripemd160() == NULL); + ExpectNull(wolfSSL_EVP_ripemd160()); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_get_digestbynid(void) { + EXPECT_DECLS; + #ifndef NO_MD5 - AssertNotNull(wolfSSL_EVP_get_digestbynid(NID_md5)); + ExpectNotNull(wolfSSL_EVP_get_digestbynid(NID_md5)); #endif #ifndef NO_SHA - AssertNotNull(wolfSSL_EVP_get_digestbynid(NID_sha1)); + ExpectNotNull(wolfSSL_EVP_get_digestbynid(NID_sha1)); #endif #ifndef NO_SHA256 - AssertNotNull(wolfSSL_EVP_get_digestbynid(NID_sha256)); + ExpectNotNull(wolfSSL_EVP_get_digestbynid(NID_sha256)); #endif - AssertNull(wolfSSL_EVP_get_digestbynid(0)); + ExpectNull(wolfSSL_EVP_get_digestbynid(0)); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_MD_nid(void) { + EXPECT_DECLS; + #ifndef NO_MD5 - AssertIntEQ(EVP_MD_nid(EVP_md5()), NID_md5); + ExpectIntEQ(EVP_MD_nid(EVP_md5()), NID_md5); #endif #ifndef NO_SHA - AssertIntEQ(EVP_MD_nid(EVP_sha1()), NID_sha1); + ExpectIntEQ(EVP_MD_nid(EVP_sha1()), NID_sha1); #endif #ifndef NO_SHA256 - AssertIntEQ(EVP_MD_nid(EVP_sha256()), NID_sha256); + ExpectIntEQ(EVP_MD_nid(EVP_sha256()), NID_sha256); #endif - AssertIntEQ(EVP_MD_nid(NULL), NID_undef); + ExpectIntEQ(EVP_MD_nid(NULL), NID_undef); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_get0_EC_KEY(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) - WOLFSSL_EVP_PKEY* pkey; + WOLFSSL_EVP_PKEY* pkey = NULL; - AssertNotNull(pkey = EVP_PKEY_new()); - AssertNull(EVP_PKEY_get0_EC_KEY(pkey)); - EVP_PKEY_free(pkey); + ExpectNull(EVP_PKEY_get0_EC_KEY(NULL)); - res = TEST_RES_CHECK(1); + ExpectNotNull(pkey = EVP_PKEY_new()); + ExpectNull(EVP_PKEY_get0_EC_KEY(pkey)); + EVP_PKEY_free(pkey); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_X_STATE(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DES3) && !defined(NO_RC4) byte key[DES3_KEY_SIZE] = {0}; byte iv[DES_IV_SIZE] = {0}; - EVP_CIPHER_CTX *ctx; - const EVP_CIPHER *init; + EVP_CIPHER_CTX *ctx = NULL; + const EVP_CIPHER *init = NULL; /* Bad test cases */ - ctx = EVP_CIPHER_CTX_new(); - init = EVP_des_ede3_cbc(); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(init = EVP_des_ede3_cbc()); wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); - AssertNull(wolfSSL_EVP_X_STATE(NULL)); - AssertNull(wolfSSL_EVP_X_STATE(ctx)); + ExpectNull(wolfSSL_EVP_X_STATE(NULL)); + ExpectNull(wolfSSL_EVP_X_STATE(ctx)); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* Good test case */ - ctx = EVP_CIPHER_CTX_new(); - init = wolfSSL_EVP_rc4(); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(init = wolfSSL_EVP_rc4()); wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); - AssertNotNull(wolfSSL_EVP_X_STATE(ctx)); + ExpectNotNull(wolfSSL_EVP_X_STATE(ctx)); EVP_CIPHER_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_X_STATE_LEN(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DES3) && !defined(NO_RC4) byte key[DES3_KEY_SIZE] = {0}; byte iv[DES_IV_SIZE] = {0}; - EVP_CIPHER_CTX *ctx; - const EVP_CIPHER *init; + EVP_CIPHER_CTX *ctx = NULL; + const EVP_CIPHER *init = NULL; /* Bad test cases */ - ctx = EVP_CIPHER_CTX_new(); - init = EVP_des_ede3_cbc(); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(init = EVP_des_ede3_cbc()); wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_X_STATE_LEN(NULL), 0); - AssertIntEQ(wolfSSL_EVP_X_STATE_LEN(ctx), 0); + ExpectIntEQ(wolfSSL_EVP_X_STATE_LEN(NULL), 0); + ExpectIntEQ(wolfSSL_EVP_X_STATE_LEN(ctx), 0); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* Good test case */ - ctx = EVP_CIPHER_CTX_new(); - init = wolfSSL_EVP_rc4(); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(init = wolfSSL_EVP_rc4()); wolfSSL_EVP_CIPHER_CTX_init(ctx); - AssertIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_CipherInit(ctx, init, key, iv, 1), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_X_STATE_LEN(ctx), sizeof(Arc4)); + ExpectIntEQ(wolfSSL_EVP_X_STATE_LEN(ctx), sizeof(Arc4)); EVP_CIPHER_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_CIPHER_block_size(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; +#if defined(HAVE_AES_CBC) || defined(HAVE_AESGCM) || \ + defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_ECB) || \ + defined(WOLFSSL_AES_OFB) || !defined(NO_RC4) || \ + (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) #ifdef HAVE_AES_CBC - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - #ifdef WOLFSSL_AES_128 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_cbc()), AES_BLOCK_SIZE); - #endif - #ifdef WOLFSSL_AES_192 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_cbc()), AES_BLOCK_SIZE); - #endif - #ifdef WOLFSSL_AES_256 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_cbc()), AES_BLOCK_SIZE); - #endif - res = TEST_RES_CHECK(1); - } + #ifdef WOLFSSL_AES_128 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_128_cbc()), AES_BLOCK_SIZE); + #endif + #ifdef WOLFSSL_AES_192 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_192_cbc()), AES_BLOCK_SIZE); + #endif + #ifdef WOLFSSL_AES_256 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_256_cbc()), AES_BLOCK_SIZE); + #endif #endif #ifdef HAVE_AESGCM - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - #ifdef WOLFSSL_AES_128 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_gcm()), 1); - #endif - #ifdef WOLFSSL_AES_192 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_gcm()), 1); - #endif - #ifdef WOLFSSL_AES_256 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_gcm()), 1); - #endif - res = TEST_RES_CHECK(1); - } + #ifdef WOLFSSL_AES_128 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_128_gcm()), 1); + #endif + #ifdef WOLFSSL_AES_192 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_192_gcm()), 1); + #endif + #ifdef WOLFSSL_AES_256 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_256_gcm()), 1); + #endif #endif #ifdef HAVE_AESCCM - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - #ifdef WOLFSSL_AES_128 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ccm()), 1); - #endif - #ifdef WOLFSSL_AES_192 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ccm()), 1); - #endif - #ifdef WOLFSSL_AES_256 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ccm()), 1); - #endif - res = TEST_RES_CHECK(1); - } + #ifdef WOLFSSL_AES_128 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ccm()), 1); + #endif + #ifdef WOLFSSL_AES_192 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ccm()), 1); + #endif + #ifdef WOLFSSL_AES_256 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ccm()), 1); + #endif #endif #ifdef WOLFSSL_AES_COUNTER - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - #ifdef WOLFSSL_AES_128 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ctr()), 1); - #endif - #ifdef WOLFSSL_AES_192 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ctr()), 1); - #endif - #ifdef WOLFSSL_AES_256 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ctr()), 1); - #endif - res = TEST_RES_CHECK(1); - } + #ifdef WOLFSSL_AES_128 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ctr()), 1); + #endif + #ifdef WOLFSSL_AES_192 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ctr()), 1); + #endif + #ifdef WOLFSSL_AES_256 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ctr()), 1); + #endif #endif #ifdef HAVE_AES_ECB - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - #ifdef WOLFSSL_AES_128 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ecb()), AES_BLOCK_SIZE); - #endif - #ifdef WOLFSSL_AES_192 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ecb()), AES_BLOCK_SIZE); - #endif - #ifdef WOLFSSL_AES_256 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ecb()), AES_BLOCK_SIZE); - #endif - res = TEST_RES_CHECK(1); - } + #ifdef WOLFSSL_AES_128 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ecb()), AES_BLOCK_SIZE); + #endif + #ifdef WOLFSSL_AES_192 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ecb()), AES_BLOCK_SIZE); + #endif + #ifdef WOLFSSL_AES_256 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ecb()), AES_BLOCK_SIZE); + #endif #endif #ifdef WOLFSSL_AES_OFB - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - #ifdef WOLFSSL_AES_128 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ofb()), 1); - #endif - #ifdef WOLFSSL_AES_192 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ofb()), 1); - #endif - #ifdef WOLFSSL_AES_256 - AssertIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ofb()), 1); - #endif - res = TEST_RES_CHECK(1); - } + #ifdef WOLFSSL_AES_128 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_128_ofb()), 1); + #endif + #ifdef WOLFSSL_AES_192 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_192_ofb()), 1); + #endif + #ifdef WOLFSSL_AES_256 + ExpectIntEQ(EVP_CIPHER_block_size(EVP_aes_256_ofb()), 1); + #endif #endif #ifndef NO_RC4 - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - AssertIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_rc4()), 1); - res = TEST_RES_CHECK(1); - } + ExpectIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_rc4()), 1); #endif #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - AssertIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_chacha20_poly1305()), 1); - res = TEST_RES_CHECK(1); - } + ExpectIntEQ(EVP_CIPHER_block_size(wolfSSL_EVP_chacha20_poly1305()), 1); +#endif #endif - return res; +#ifdef WOLFSSL_SM4_ECB + ExpectIntEQ(EVP_CIPHER_block_size(EVP_sm4_ecb()), SM4_BLOCK_SIZE); +#endif +#ifdef WOLFSSL_SM4_CBC + ExpectIntEQ(EVP_CIPHER_block_size(EVP_sm4_cbc()), SM4_BLOCK_SIZE); +#endif +#ifdef WOLFSSL_SM4_CTR + ExpectIntEQ(EVP_CIPHER_block_size(EVP_sm4_ctr()), 1); +#endif +#ifdef WOLFSSL_SM4_GCM + ExpectIntEQ(EVP_CIPHER_block_size(EVP_sm4_gcm()), 1); +#endif +#ifdef WOLFSSL_SM4_CCM + ExpectIntEQ(EVP_CIPHER_block_size(EVP_sm4_ccm()), 1); +#endif + + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_CIPHER_iv_length(void) { - int i, enumlen; - - - int enumArray[] = { + EXPECT_DECLS; + int nids[] = { #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) #ifdef WOLFSSL_AES_128 NID_aes_128_cbc, @@ -50391,7 +61095,6 @@ NID_chacha20_poly1305, #endif }; - int iv_lengths[] = { #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) #ifdef WOLFSSL_AES_128 @@ -50437,134 +61140,89 @@ CHACHA20_POLY1305_AEAD_IV_SIZE, #endif }; + int i; + int nidsLen = (sizeof(nids)/sizeof(int)); - enumlen = (sizeof(enumArray)/sizeof(int)); - for (i = 0; i < enumlen; i++) { - const EVP_CIPHER *c = EVP_get_cipherbynid(enumArray[i]); - AssertIntEQ(EVP_CIPHER_iv_length(c), iv_lengths[i]); + for (i = 0; i < nidsLen; i++) { + const EVP_CIPHER *c = EVP_get_cipherbynid(nids[i]); + ExpectIntEQ(EVP_CIPHER_iv_length(c), iv_lengths[i]); } - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_SignInit_ex(void) { - WOLFSSL_EVP_MD_CTX mdCtx; - WOLFSSL_ENGINE* e = 0; - const EVP_MD* md; - md = "SHA256"; + EXPECT_DECLS; + WOLFSSL_EVP_MD_CTX mdCtx; + WOLFSSL_ENGINE* e = 0; + const EVP_MD* md = EVP_sha256(); wolfSSL_EVP_MD_CTX_init(&mdCtx); - AssertIntEQ(wolfSSL_EVP_SignInit_ex(&mdCtx, md, e), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_SignInit_ex(&mdCtx, md, e), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), 1); + ExpectIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), 1); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_DigestFinal_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_SHA256) - WOLFSSL_EVP_MD_CTX mdCtx; - unsigned int s = 0; - unsigned char md[WC_SHA256_DIGEST_SIZE]; - unsigned char md2[WC_SHA256_DIGEST_SIZE]; + WOLFSSL_EVP_MD_CTX mdCtx; + unsigned int s = 0; + unsigned char md[WC_SHA256_DIGEST_SIZE]; + unsigned char md2[WC_SHA256_DIGEST_SIZE]; /* Bad Case */ -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) - +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2)) wolfSSL_EVP_MD_CTX_init(&mdCtx); - AssertIntEQ(wolfSSL_EVP_DigestFinal_ex(&mdCtx, md, &s), 0); - AssertIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), 1); + ExpectIntEQ(wolfSSL_EVP_DigestFinal_ex(&mdCtx, md, &s), 0); + ExpectIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), 1); #else - wolfSSL_EVP_MD_CTX_init(&mdCtx); - AssertIntEQ(wolfSSL_EVP_DigestFinal_ex(&mdCtx, md, &s), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_DigestFinal_ex(&mdCtx, md, &s), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), WOLFSSL_SUCCESS); #endif /* Good Case */ wolfSSL_EVP_MD_CTX_init(&mdCtx); - AssertIntEQ(wolfSSL_EVP_DigestInit(&mdCtx, "SHA256"), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_DigestFinal_ex(&mdCtx, md2, &s), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), WOLFSSL_SUCCESS); - - res = TEST_RES_CHECK(1); -#endif - return res; -} -static int test_wolfSSL_EVP_PKEY_assign_DH(void) -{ - int res = TEST_SKIPPED; -#if !defined(NO_DH) && \ - !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) - FILE* f = NULL; - unsigned char buf[4096]; - const unsigned char* pt = buf; - const char* params1 = "./certs/dh2048.der"; - long len = 0; - WOLFSSL_DH* dh = NULL; - WOLFSSL_EVP_PKEY* pkey; - XMEMSET(buf, 0, sizeof(buf)); - - - f = XFOPEN(params1, "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); - - - AssertNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); - AssertIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS); - - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - - /* Bad cases */ - AssertIntEQ(wolfSSL_EVP_PKEY_assign_DH(NULL, dh), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign_DH(pkey, NULL), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EVP_PKEY_assign_DH(NULL, NULL), WOLFSSL_FAILURE); - - /* Good case */ - AssertIntEQ(wolfSSL_EVP_PKEY_assign_DH(pkey, dh), WOLFSSL_SUCCESS); - - EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wolfSSL_EVP_DigestInit(&mdCtx, EVP_sha256()), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_DigestFinal_ex(&mdCtx, md2, &s), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_MD_CTX_cleanup(&mdCtx), WOLFSSL_SUCCESS); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_QT_EVP_PKEY_CTX_free(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) - EVP_PKEY* pkey; - EVP_PKEY_CTX* ctx; + EVP_PKEY* pkey = NULL; + EVP_PKEY_CTX* ctx = NULL; - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L - /* void */ - EVP_PKEY_CTX_free(ctx); - AssertTrue(1); - #else - /* int */ - AssertIntEQ(EVP_PKEY_CTX_free(ctx), WOLFSSL_SUCCESS); - #endif +#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L + /* void */ + EVP_PKEY_CTX_free(ctx); +#else + /* int */ + ExpectIntEQ(EVP_PKEY_CTX_free(ctx), WOLFSSL_SUCCESS); +#endif EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_param_check(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM) @@ -50582,50 +61240,49 @@ XMEMSET(buf, 0, sizeof(buf)); - f = XFOPEN(dh2048, "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(dh2048, "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) + XFCLOSE(f); /* Load dh2048.der into DH with internal format */ - AssertNotNull(setDh = d2i_DHparams(NULL, &pt, len)); - AssertIntEQ(DH_check(setDh, &code), WOLFSSL_SUCCESS); - AssertIntEQ(code, 0); + ExpectNotNull(setDh = d2i_DHparams(NULL, &pt, len)); + ExpectIntEQ(DH_check(setDh, &code), WOLFSSL_SUCCESS); + ExpectIntEQ(code, 0); code = -1; pkey = wolfSSL_EVP_PKEY_new(); /* Set DH into PKEY */ - AssertIntEQ(EVP_PKEY_set1_DH(pkey, setDh), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_set1_DH(pkey, setDh), WOLFSSL_SUCCESS); /* create ctx from pkey */ - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - AssertIntEQ(EVP_PKEY_param_check(ctx), 1/* valid */); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectIntEQ(EVP_PKEY_param_check(ctx), 1/* valid */); - /* */ - /* TO DO invlaid case */ - /* */ + /* TODO: more invalid cases */ + ExpectIntEQ(EVP_PKEY_param_check(NULL), 0); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); DH_free(setDh); + setDh = NULL; DH_free(dh); - - res = TEST_RES_CHECK(1); + dh = NULL; #endif #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_BytesToKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_AES) && defined(HAVE_AES_CBC) byte key[AES_BLOCK_SIZE] = {0}; byte iv[AES_BLOCK_SIZE] = {0}; - int sz = 5; int count = 0; - const EVP_MD* md = "SHA256"; + const EVP_MD* md = EVP_sha256(); const EVP_CIPHER *type; const unsigned char *salt = (unsigned char *)"salt1234"; + int sz = 5; const byte data[] = { 0x48,0x65,0x6c,0x6c,0x6f,0x20,0x57,0x6f, 0x72,0x6c,0x64 @@ -50634,27 +61291,25 @@ type = wolfSSL_EVP_get_cipherbynid(NID_aes_128_cbc); /* Bad cases */ - AssertIntEQ(EVP_BytesToKey(NULL, md, salt, data, sz, count, key, iv), + ExpectIntEQ(EVP_BytesToKey(NULL, md, salt, data, sz, count, key, iv), 0); - AssertIntEQ(EVP_BytesToKey(type, md, salt, NULL, sz, count, key, iv), + ExpectIntEQ(EVP_BytesToKey(type, md, salt, NULL, sz, count, key, iv), 16); md = "2"; - AssertIntEQ(EVP_BytesToKey(type, md, salt, data, sz, count, key, iv), + ExpectIntEQ(EVP_BytesToKey(type, md, salt, data, sz, count, key, iv), WOLFSSL_FAILURE); /* Good case */ - md = "SHA256"; - AssertIntEQ(EVP_BytesToKey(type, md, salt, data, sz, count, key, iv), + md = EVP_sha256(); + ExpectIntEQ(EVP_BytesToKey(type, md, salt, data, sz, count, key, iv), 16); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_evp_cipher_aes_gcm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && \ !defined(HAVE_SELFTEST)) || (defined(HAVE_FIPS_VERSION) && \ (HAVE_FIPS_VERSION >= 2))) @@ -50769,8 +61424,8 @@ expCipherText2, expCipherText3 }; - byte* cipherText; - byte* calcPlainText; + byte* cipherText = NULL; + byte* calcPlainText = NULL; byte tag[AES_BLOCK_SIZE]; EVP_CIPHER_CTX* encCtx = NULL; EVP_CIPHER_CTX* decCtx = NULL; @@ -50778,12 +61433,12 @@ /****************************************************/ for (i = 0; i < 3; ++i) { - AssertNotNull(encCtx = EVP_CIPHER_CTX_new()); - AssertNotNull(decCtx = EVP_CIPHER_CTX_new()); + ExpectNotNull(encCtx = EVP_CIPHER_CTX_new()); + ExpectNotNull(decCtx = EVP_CIPHER_CTX_new()); /* First iteration, set key before IV. */ if (i == 0) { - AssertIntEQ(EVP_CipherInit(encCtx, EVP_aes_256_gcm(), key, NULL, 1), + ExpectIntEQ(EVP_CipherInit(encCtx, EVP_aes_256_gcm(), key, NULL, 1), SSL_SUCCESS); /* @@ -50792,27 +61447,27 @@ * subsequent EVP_CTRL_GCM_IV_GEN should fail. This matches OpenSSL * behavior. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_SET_IV_FIXED, -1, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_SET_IV_FIXED, -1, (void*)iv), SSL_SUCCESS); - AssertIntEQ(EVP_CipherInit(encCtx, NULL, NULL, iv, 1), + ExpectIntEQ(EVP_CipherInit(encCtx, NULL, NULL, iv, 1), SSL_SUCCESS); - AssertIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_IV_GEN, -1, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_IV_GEN, -1, currentIv), SSL_FAILURE); - AssertIntEQ(EVP_CipherInit(decCtx, EVP_aes_256_gcm(), key, NULL, 0), + ExpectIntEQ(EVP_CipherInit(decCtx, EVP_aes_256_gcm(), key, NULL, 0), SSL_SUCCESS); - AssertIntEQ(EVP_CipherInit(decCtx, NULL, NULL, iv, 0), + ExpectIntEQ(EVP_CipherInit(decCtx, NULL, NULL, iv, 0), SSL_SUCCESS); } /* Second iteration, IV before key. */ else { - AssertIntEQ(EVP_CipherInit(encCtx, EVP_aes_256_gcm(), NULL, iv, 1), + ExpectIntEQ(EVP_CipherInit(encCtx, EVP_aes_256_gcm(), NULL, iv, 1), SSL_SUCCESS); - AssertIntEQ(EVP_CipherInit(encCtx, NULL, key, NULL, 1), + ExpectIntEQ(EVP_CipherInit(encCtx, NULL, key, NULL, 1), SSL_SUCCESS); - AssertIntEQ(EVP_CipherInit(decCtx, EVP_aes_256_gcm(), NULL, iv, 0), + ExpectIntEQ(EVP_CipherInit(decCtx, EVP_aes_256_gcm(), NULL, iv, 0), SSL_SUCCESS); - AssertIntEQ(EVP_CipherInit(decCtx, NULL, key, NULL, 0), + ExpectIntEQ(EVP_CipherInit(decCtx, NULL, key, NULL, 0), SSL_SUCCESS); } @@ -50820,48 +61475,48 @@ * EVP_CTRL_GCM_IV_GEN should fail if EVP_CTRL_GCM_SET_IV_FIXED hasn't * been issued first. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_IV_GEN, -1, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_IV_GEN, -1, currentIv), SSL_FAILURE); - AssertIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_SET_IV_FIXED, -1, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_SET_IV_FIXED, -1, (void*)iv), SSL_SUCCESS); - AssertIntEQ(EVP_CIPHER_CTX_ctrl(decCtx, EVP_CTRL_GCM_SET_IV_FIXED, -1, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(decCtx, EVP_CTRL_GCM_SET_IV_FIXED, -1, (void*)iv), SSL_SUCCESS); for (j = 0; j < NUM_ENCRYPTIONS; ++j) { /*************** Encrypt ***************/ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_IV_GEN, -1, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_IV_GEN, -1, currentIv), SSL_SUCCESS); /* Check current IV against expected. */ - AssertIntEQ(XMEMCMP(currentIv, expIvs[j], GCM_NONCE_MID_SZ), 0); + ExpectIntEQ(XMEMCMP(currentIv, expIvs[j], GCM_NONCE_MID_SZ), 0); /* Add AAD. */ if (i == 2) { /* Test streaming API. */ - AssertIntEQ(EVP_CipherUpdate(encCtx, NULL, &outl, aads[j], + ExpectIntEQ(EVP_CipherUpdate(encCtx, NULL, &outl, aads[j], AAD_SIZE), SSL_SUCCESS); } else { - AssertIntEQ(EVP_Cipher(encCtx, NULL, aads[j], AAD_SIZE), + ExpectIntEQ(EVP_Cipher(encCtx, NULL, aads[j], AAD_SIZE), AAD_SIZE); } - AssertNotNull(cipherText = (byte*)XMALLOC(plainTextSzs[j], NULL, + ExpectNotNull(cipherText = (byte*)XMALLOC(plainTextSzs[j], NULL, DYNAMIC_TYPE_TMP_BUFFER)); /* Encrypt plaintext. */ if (i == 2) { - AssertIntEQ(EVP_CipherUpdate(encCtx, cipherText, &outl, + ExpectIntEQ(EVP_CipherUpdate(encCtx, cipherText, &outl, plainTexts[j], plainTextSzs[j]), SSL_SUCCESS); } else { - AssertIntEQ(EVP_Cipher(encCtx, cipherText, plainTexts[j], + ExpectIntEQ(EVP_Cipher(encCtx, cipherText, plainTexts[j], plainTextSzs[j]), plainTextSzs[j]); } if (i == 2) { - AssertIntEQ(EVP_CipherFinal(encCtx, cipherText, &outl), + ExpectIntEQ(EVP_CipherFinal(encCtx, cipherText, &outl), SSL_SUCCESS); } else { @@ -50869,79 +61524,82 @@ * Calling EVP_Cipher with NULL input and output for AES-GCM is * akin to calling EVP_CipherFinal. */ - AssertIntGE(EVP_Cipher(encCtx, NULL, NULL, 0), 0); + ExpectIntGE(EVP_Cipher(encCtx, NULL, NULL, 0), 0); } /* Check ciphertext against expected. */ - AssertIntEQ(XMEMCMP(cipherText, expCipherTexts[j], plainTextSzs[j]), + ExpectIntEQ(XMEMCMP(cipherText, expCipherTexts[j], plainTextSzs[j]), 0); /* Get and check tag against expected. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_GET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(encCtx, EVP_CTRL_GCM_GET_TAG, sizeof(tag), tag), SSL_SUCCESS); - AssertIntEQ(XMEMCMP(tag, expTags[j], sizeof(tag)), 0); + ExpectIntEQ(XMEMCMP(tag, expTags[j], sizeof(tag)), 0); /*************** Decrypt ***************/ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(decCtx, EVP_CTRL_GCM_IV_GEN, -1, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(decCtx, EVP_CTRL_GCM_IV_GEN, -1, currentIv), SSL_SUCCESS); /* Check current IV against expected. */ - AssertIntEQ(XMEMCMP(currentIv, expIvs[j], GCM_NONCE_MID_SZ), 0); + ExpectIntEQ(XMEMCMP(currentIv, expIvs[j], GCM_NONCE_MID_SZ), 0); /* Add AAD. */ if (i == 2) { /* Test streaming API. */ - AssertIntEQ(EVP_CipherUpdate(decCtx, NULL, &outl, aads[j], + ExpectIntEQ(EVP_CipherUpdate(decCtx, NULL, &outl, aads[j], AAD_SIZE), SSL_SUCCESS); } else { - AssertIntEQ(EVP_Cipher(decCtx, NULL, aads[j], AAD_SIZE), + ExpectIntEQ(EVP_Cipher(decCtx, NULL, aads[j], AAD_SIZE), AAD_SIZE); } /* Set expected tag. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(decCtx, EVP_CTRL_GCM_SET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(decCtx, EVP_CTRL_GCM_SET_TAG, sizeof(tag), tag), SSL_SUCCESS); /* Decrypt ciphertext. */ - AssertNotNull(calcPlainText = (byte*)XMALLOC(plainTextSzs[j], NULL, + ExpectNotNull(calcPlainText = (byte*)XMALLOC(plainTextSzs[j], NULL, DYNAMIC_TYPE_TMP_BUFFER)); if (i == 2) { - AssertIntEQ(EVP_CipherUpdate(decCtx, calcPlainText, &outl, + ExpectIntEQ(EVP_CipherUpdate(decCtx, calcPlainText, &outl, cipherText, plainTextSzs[j]), SSL_SUCCESS); } else { /* This first EVP_Cipher call will check the tag, too. */ - AssertIntEQ(EVP_Cipher(decCtx, calcPlainText, cipherText, + ExpectIntEQ(EVP_Cipher(decCtx, calcPlainText, cipherText, plainTextSzs[j]), plainTextSzs[j]); } if (i == 2) { - AssertIntEQ(EVP_CipherFinal(decCtx, calcPlainText, &outl), + ExpectIntEQ(EVP_CipherFinal(decCtx, calcPlainText, &outl), SSL_SUCCESS); } else { - AssertIntGE(EVP_Cipher(decCtx, NULL, NULL, 0), 0); + ExpectIntGE(EVP_Cipher(decCtx, NULL, NULL, 0), 0); } /* Check plaintext against expected. */ - AssertIntEQ(XMEMCMP(calcPlainText, plainTexts[j], plainTextSzs[j]), + ExpectIntEQ(XMEMCMP(calcPlainText, plainTexts[j], plainTextSzs[j]), 0); XFREE(cipherText, NULL, DYNAMIC_TYPE_TMP_BUFFER); + cipherText = NULL; XFREE(calcPlainText, NULL, DYNAMIC_TYPE_TMP_BUFFER); + calcPlainText = NULL; } EVP_CIPHER_CTX_free(encCtx); + encCtx = NULL; EVP_CIPHER_CTX_free(decCtx); + decCtx = NULL; } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OBJ_ln(void) { + EXPECT_DECLS; const int nid_set[] = { NID_commonName, NID_serialNumber, @@ -50972,20 +61630,20 @@ }; size_t i = 0, maxIdx = sizeof(ln_set)/sizeof(char*); - AssertIntEQ(OBJ_ln2nid(NULL), NID_undef); + ExpectIntEQ(OBJ_ln2nid(NULL), NID_undef); #ifdef HAVE_ECC #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) { EC_builtin_curve r[27]; size_t nCurves = sizeof(r) / sizeof(r[0]); - nCurves = EC_get_builtin_curves(r,nCurves); + nCurves = EC_get_builtin_curves(r, nCurves); for (i = 0; i < nCurves; i++) { /* skip ECC_CURVE_INVALID */ if (r[i].nid != ECC_CURVE_INVALID) { - AssertIntEQ(OBJ_ln2nid(r[i].comment), r[i].nid); - AssertStrEQ(OBJ_nid2ln(r[i].nid), r[i].comment); + ExpectIntEQ(OBJ_ln2nid(r[i].comment), r[i].nid); + ExpectStrEQ(OBJ_nid2ln(r[i].nid), r[i].comment); } } } @@ -50993,15 +61651,16 @@ #endif for (i = 0; i < maxIdx; i++) { - AssertIntEQ(OBJ_ln2nid(ln_set[i]), nid_set[i]); - AssertStrEQ(OBJ_nid2ln(nid_set[i]), ln_set[i]); + ExpectIntEQ(OBJ_ln2nid(ln_set[i]), nid_set[i]); + ExpectStrEQ(OBJ_nid2ln(nid_set[i]), ln_set[i]); } - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static int test_wolfSSL_OBJ_sn(void) { + EXPECT_DECLS; int i = 0, maxIdx = 7; const int nid_set[] = {NID_commonName,NID_countryName,NID_localityName, NID_stateOrProvinceName,NID_organizationName, @@ -51012,13 +61671,13 @@ WOLFSSL_ORG_NAME, WOLFSSL_ORGUNIT_NAME, WOLFSSL_EMAIL_ADDR}; - AssertIntEQ(wolfSSL_OBJ_sn2nid(NULL), NID_undef); + ExpectIntEQ(wolfSSL_OBJ_sn2nid(NULL), NID_undef); for (i = 0; i < maxIdx; i++) { - AssertIntEQ(wolfSSL_OBJ_sn2nid(sn_wolf_set[i]), nid_set[i]); - AssertStrEQ(wolfSSL_OBJ_nid2sn(nid_set[i]), sn_open_set[i]); + ExpectIntEQ(wolfSSL_OBJ_sn2nid(sn_wolf_set[i]), nid_set[i]); + ExpectStrEQ(wolfSSL_OBJ_nid2sn(nid_set[i]), sn_open_set[i]); } - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #if !defined(NO_BIO) @@ -51035,9 +61694,9 @@ static int test_wolfSSL_TXT_DB(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_BIO) - BIO *bio; + BIO *bio = NULL; TXT_DB *db = NULL; const int columns = 6; const char *fields[6] = { @@ -51048,114 +61707,116 @@ "unknown", "/CN=rsa doe", }; - char** fields_copy; + char** fields_copy = NULL; /* Test read */ - AssertNotNull(bio = BIO_new(BIO_s_file())); - AssertIntGT(BIO_read_filename(bio, "./tests/TXT_DB.txt"), 0); - AssertNotNull(db = TXT_DB_read(bio, columns)); - AssertNotNull(fields_copy = (char**)XMALLOC(sizeof(fields), NULL, - DYNAMIC_TYPE_OPENSSL)); - XMEMCPY(fields_copy, fields, sizeof(fields)); - AssertIntEQ(TXT_DB_insert(db, fields_copy), 1); + ExpectNotNull(bio = BIO_new(BIO_s_file())); + ExpectIntGT(BIO_read_filename(bio, "./tests/TXT_DB.txt"), 0); + ExpectNotNull(db = TXT_DB_read(bio, columns)); + ExpectNotNull(fields_copy = (char**)XMALLOC(sizeof(fields), NULL, + DYNAMIC_TYPE_OPENSSL)); + if (fields_copy != NULL) { + XMEMCPY(fields_copy, fields, sizeof(fields)); + } + ExpectIntEQ(TXT_DB_insert(db, fields_copy), 1); + if (EXPECT_FAIL()) { + XFREE(fields_copy, NULL, DYNAMIC_TYPE_OPENSSL); + } BIO_free(bio); + bio = NULL; /* Test write */ - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertIntEQ(TXT_DB_write(bio, db), 1484); + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectIntEQ(TXT_DB_write(bio, db), 1484); BIO_free(bio); /* Test index */ - AssertIntEQ(TXT_DB_create_index(db, 3, NULL, (wolf_sk_hash_cb)TXT_DB_hash, - (wolf_lh_compare_cb)TXT_DB_cmp), 1); - AssertNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); + ExpectIntEQ(TXT_DB_create_index(db, 3, NULL, (wolf_sk_hash_cb)TXT_DB_hash, + (wolf_lh_compare_cb)TXT_DB_cmp), 1); + ExpectNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); fields[3] = "12DA"; - AssertNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); + ExpectNotNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); fields[3] = "FFFF"; - AssertNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); + ExpectNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); fields[3] = ""; - AssertNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); + ExpectNull(TXT_DB_get_by_index(db, 3, (WOLFSSL_STRING*)fields)); TXT_DB_free(db); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_NCONF(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_BIO) const char* confFile = "./tests/NCONF_test.cnf"; CONF* conf = NULL; long eline = 0; long num = 0; - AssertNotNull(conf = NCONF_new(NULL)); + ExpectNotNull(conf = NCONF_new(NULL)); - AssertIntEQ(NCONF_load(conf, confFile, &eline), 1); - AssertIntEQ(NCONF_get_number(conf, NULL, "port", &num), 1); - AssertIntEQ(num, 1234); - AssertIntEQ(NCONF_get_number(conf, "section2", "port", &num), 1); - AssertIntEQ(num, 4321); - AssertStrEQ(NCONF_get_string(conf, NULL, "dir"), "./test-dir"); - AssertStrEQ(NCONF_get_string(conf, "section1", "file1_copy"), - "./test-dir/file1"); - AssertStrEQ(NCONF_get_string(conf, "section2", "file_list"), - "./test-dir/file1:./test-dir/file2:./section1:file2"); + ExpectIntEQ(NCONF_load(conf, confFile, &eline), 1); + ExpectIntEQ(NCONF_get_number(conf, NULL, "port", &num), 1); + ExpectIntEQ(num, 1234); + ExpectIntEQ(NCONF_get_number(conf, "section2", "port", &num), 1); + ExpectIntEQ(num, 4321); + ExpectStrEQ(NCONF_get_string(conf, NULL, "dir"), "./test-dir"); + ExpectStrEQ(NCONF_get_string(conf, "section1", "file1_copy"), + "./test-dir/file1"); + ExpectStrEQ(NCONF_get_string(conf, "section2", "file_list"), + "./test-dir/file1:./test-dir/file2:./section1:file2"); NCONF_free(conf); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #endif /* OPENSSL_ALL */ static int test_wolfSSL_X509V3_EXT_get(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_ALL) && !defined(NO_RSA) - FILE* f; + XFILE f = XBADFILE; int numOfExt =0; int extNid = 0; int i = 0; - WOLFSSL_X509* x509; - WOLFSSL_X509_EXTENSION* ext; - const WOLFSSL_v3_ext_method* method; - - AssertNotNull(f = fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); - fclose(f); + WOLFSSL_X509* x509 = NULL; + WOLFSSL_X509_EXTENSION* ext = NULL; + const WOLFSSL_v3_ext_method* method = NULL; + + ExpectTrue((f = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + XFCLOSE(f); /* wolfSSL_X509V3_EXT_get() return struct and nid test */ - AssertIntEQ((numOfExt = wolfSSL_X509_get_ext_count(x509)), 5); + ExpectIntEQ((numOfExt = wolfSSL_X509_get_ext_count(x509)), 5); for (i = 0; i < numOfExt; i++) { - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, i)); - AssertIntNE((extNid = ext->obj->nid), NID_undef); - AssertNotNull(method = wolfSSL_X509V3_EXT_get(ext)); - AssertIntEQ(method->ext_nid, extNid); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, i)); + ExpectIntNE((extNid = ext->obj->nid), NID_undef); + ExpectNotNull(method = wolfSSL_X509V3_EXT_get(ext)); + ExpectIntEQ(method->ext_nid, extNid); } /* wolfSSL_X509V3_EXT_get() NULL argument test */ - AssertNull(method = wolfSSL_X509V3_EXT_get(NULL)); + ExpectNull(method = wolfSSL_X509V3_EXT_get(NULL)); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509V3_EXT_nconf(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_ALL const char *ext_names[] = { "subjectKeyIdentifier", "authorityKeyIdentifier", "subjectAltName", "keyUsage", + "extendedKeyUsage", }; size_t ext_names_count = sizeof(ext_names)/sizeof(*ext_names); int ext_nids[] = { @@ -51163,193 +61824,244 @@ NID_authority_key_identifier, NID_subject_alt_name, NID_key_usage, + NID_ext_key_usage, }; size_t ext_nids_count = sizeof(ext_nids)/sizeof(*ext_nids); const char *ext_values[] = { "hash", "hash", "DNS:example.com, IP:127.0.0.1", - "digitalSignature,keyEncipherment,dataEncipherment", + "digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment," + "keyAgreement,keyCertSign,cRLSign,encipherOnly,decipherOnly", + "serverAuth,clientAuth,codeSigning,emailProtection,timeStamping," + "OCSPSigning", }; size_t i; - X509_EXTENSION* ext; - X509* x509 = X509_new(); + X509_EXTENSION* ext = NULL; + X509* x509 = NULL; + unsigned int keyUsageFlags; + unsigned int extKeyUsageFlags; + + ExpectNotNull(x509 = X509_new()); + + /* keyUsage / extKeyUsage should match string above */ + keyUsageFlags = KU_DIGITAL_SIGNATURE + | KU_NON_REPUDIATION + | KU_KEY_ENCIPHERMENT + | KU_DATA_ENCIPHERMENT + | KU_KEY_AGREEMENT + | KU_KEY_CERT_SIGN + | KU_CRL_SIGN + | KU_ENCIPHER_ONLY + | KU_DECIPHER_ONLY; + extKeyUsageFlags = XKU_SSL_CLIENT + | XKU_SSL_SERVER + | XKU_CODE_SIGN + | XKU_SMIME + | XKU_TIMESTAMP + | XKU_OCSP_SIGN; for (i = 0; i < ext_names_count; i++) { - ext = X509V3_EXT_nconf(NULL, NULL, ext_names[i], ext_values[i]); - AssertNotNull(ext); + ExpectNotNull(ext = X509V3_EXT_nconf(NULL, NULL, ext_names[i], + ext_values[i])); X509_EXTENSION_free(ext); + ext = NULL; } for (i = 0; i < ext_nids_count; i++) { - ext = X509V3_EXT_nconf_nid(NULL, NULL, ext_nids[i], ext_values[i]); - AssertNotNull(ext); + ExpectNotNull(ext = X509V3_EXT_nconf_nid(NULL, NULL, ext_nids[i], + ext_values[i])); X509_EXTENSION_free(ext); + ext = NULL; } /* Test adding extension to X509 */ for (i = 0; i < ext_nids_count; i++) { - ext = X509V3_EXT_nconf(NULL, NULL, ext_names[i], ext_values[i]); - AssertIntEQ(X509_add_ext(x509, ext, -1), WOLFSSL_SUCCESS); + ExpectNotNull(ext = X509V3_EXT_nconf(NULL, NULL, ext_names[i], + ext_values[i])); + ExpectIntEQ(X509_add_ext(x509, ext, -1), WOLFSSL_SUCCESS); + + if (ext_nids[i] == NID_key_usage) { + ExpectIntEQ(X509_get_key_usage(x509), keyUsageFlags); + } + else if (ext_nids[i] == NID_ext_key_usage) { + ExpectIntEQ(X509_get_extended_key_usage(x509), extKeyUsageFlags); + } X509_EXTENSION_free(ext); + ext = NULL; } X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509V3_EXT(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_ALL) && !defined(NO_RSA) - FILE* f; - int numOfExt = 0, nid = 0, i = 0, expected, actual; - char* str; - unsigned char* data; - const WOLFSSL_v3_ext_method* method; - WOLFSSL_X509* x509; - WOLFSSL_X509_EXTENSION* ext; - WOLFSSL_X509_EXTENSION* ext2; - WOLFSSL_ASN1_OBJECT *obj, *adObj; - WOLFSSL_ASN1_STRING* asn1str; - WOLFSSL_AUTHORITY_KEYID* aKeyId; - WOLFSSL_AUTHORITY_INFO_ACCESS* aia; - WOLFSSL_BASIC_CONSTRAINTS* bc; - WOLFSSL_ACCESS_DESCRIPTION* ad; - WOLFSSL_GENERAL_NAME* gn; + XFILE f = XBADFILE; + int numOfExt = 0, nid = 0, i = 0, expected, actual = 0; + char* str = NULL; + unsigned char* data = NULL; + const WOLFSSL_v3_ext_method* method = NULL; + WOLFSSL_X509* x509 = NULL; + WOLFSSL_X509_EXTENSION* ext = NULL; + WOLFSSL_X509_EXTENSION* ext2 = NULL; + WOLFSSL_ASN1_OBJECT *obj = NULL; + WOLFSSL_ASN1_OBJECT *adObj = NULL; + WOLFSSL_ASN1_STRING* asn1str = NULL; + WOLFSSL_AUTHORITY_KEYID* aKeyId = NULL; + WOLFSSL_AUTHORITY_INFO_ACCESS* aia = NULL; + WOLFSSL_BASIC_CONSTRAINTS* bc = NULL; + WOLFSSL_ACCESS_DESCRIPTION* ad = NULL; + WOLFSSL_GENERAL_NAME* gn = NULL; /* Check NULL argument */ - AssertNull(wolfSSL_X509V3_EXT_d2i(NULL)); + ExpectNull(wolfSSL_X509V3_EXT_d2i(NULL)); /* Using OCSP cert with X509V3 extensions */ - AssertNotNull(f = fopen("./certs/ocsp/root-ca-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); - fclose(f); + ExpectTrue((f = XFOPEN("./certs/ocsp/root-ca-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + XFCLOSE(f); - AssertIntEQ((numOfExt = wolfSSL_X509_get_ext_count(x509)), 5); + ExpectIntEQ((numOfExt = wolfSSL_X509_get_ext_count(x509)), 5); /* Basic Constraints */ - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, i)); - AssertNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); - AssertIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_basic_constraints); - AssertNotNull(bc = (WOLFSSL_BASIC_CONSTRAINTS*)wolfSSL_X509V3_EXT_d2i(ext)); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, i)); + ExpectNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); + ExpectIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_basic_constraints); + ExpectNotNull(bc = (WOLFSSL_BASIC_CONSTRAINTS*)wolfSSL_X509V3_EXT_d2i(ext)); - AssertIntEQ(bc->ca, 1); - AssertNull(bc->pathlen); + ExpectIntEQ(bc->ca, 1); + ExpectNull(bc->pathlen); wolfSSL_BASIC_CONSTRAINTS_free(bc); + bc = NULL; i++; /* Subject Key Identifier */ - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, i)); - AssertNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); - AssertIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_subject_key_identifier); - - AssertNotNull(asn1str = (WOLFSSL_ASN1_STRING*)wolfSSL_X509V3_EXT_d2i(ext)); - AssertNotNull(ext2 = wolfSSL_X509V3_EXT_i2d(NID_subject_key_identifier, 0, - asn1str)); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, i)); + ExpectNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); + ExpectIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_subject_key_identifier); + + ExpectNotNull(asn1str = (WOLFSSL_ASN1_STRING*)wolfSSL_X509V3_EXT_d2i(ext)); + ExpectNotNull(ext2 = wolfSSL_X509V3_EXT_i2d(NID_subject_key_identifier, 0, + asn1str)); X509_EXTENSION_free(ext2); - AssertNotNull(method = wolfSSL_X509V3_EXT_get(ext)); - AssertNotNull(method->i2s); - AssertNotNull(str = method->i2s((WOLFSSL_v3_ext_method*)method, asn1str)); + ext2 = NULL; + ExpectNotNull(method = wolfSSL_X509V3_EXT_get(ext)); + ExpectNotNull(method->i2s); + ExpectNotNull(str = method->i2s((WOLFSSL_v3_ext_method*)method, asn1str)); wolfSSL_ASN1_STRING_free(asn1str); - actual = strcmp(str, - "73:B0:1C:A4:2F:82:CB:CF:47:A5:38:D7:B0:04:82:3A:7E:72:15:21"); - AssertIntEQ(actual, 0); + asn1str = NULL; + if (str != NULL) { + actual = strcmp(str, + "73:B0:1C:A4:2F:82:CB:CF:47:A5:38:D7:B0:04:82:3A:7E:72:15:21"); + } + ExpectIntEQ(actual, 0); XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER); + str = NULL; i++; /* Authority Key Identifier */ - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, i)); - AssertNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); - AssertIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_authority_key_identifier); - - AssertNotNull(aKeyId = - (WOLFSSL_AUTHORITY_KEYID*)wolfSSL_X509V3_EXT_d2i(ext)); - AssertNotNull(method = wolfSSL_X509V3_EXT_get(ext)); - AssertNotNull(asn1str = aKeyId->keyid); - AssertNotNull(str = - wolfSSL_i2s_ASN1_STRING((WOLFSSL_v3_ext_method*)method, asn1str)); - actual = strcmp(str, - "73:B0:1C:A4:2F:82:CB:CF:47:A5:38:D7:B0:04:82:3A:7E:72:15:21"); - AssertIntEQ(actual, 0); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, i)); + ExpectNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); + ExpectIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_authority_key_identifier); + + ExpectNotNull(aKeyId = (WOLFSSL_AUTHORITY_KEYID*)wolfSSL_X509V3_EXT_d2i( + ext)); + ExpectNotNull(method = wolfSSL_X509V3_EXT_get(ext)); + ExpectNotNull(asn1str = aKeyId->keyid); + ExpectNotNull(str = wolfSSL_i2s_ASN1_STRING((WOLFSSL_v3_ext_method*)method, + asn1str)); + asn1str = NULL; + if (str != NULL) { + actual = strcmp(str, + "73:B0:1C:A4:2F:82:CB:CF:47:A5:38:D7:B0:04:82:3A:7E:72:15:21"); + } + ExpectIntEQ(actual, 0); XFREE(str, NULL, DYNAMIC_TYPE_TMP_BUFFER); + str = NULL; wolfSSL_AUTHORITY_KEYID_free(aKeyId); + aKeyId = NULL; i++; /* Key Usage */ - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, i)); - AssertNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); - AssertIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_key_usage); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, i)); + ExpectNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); + ExpectIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_key_usage); - AssertNotNull(asn1str = (WOLFSSL_ASN1_STRING*)wolfSSL_X509V3_EXT_d2i(ext)); + ExpectNotNull(asn1str = (WOLFSSL_ASN1_STRING*)wolfSSL_X509V3_EXT_d2i(ext)); #if defined(WOLFSSL_QT) - AssertNotNull(data = (unsigned char*)ASN1_STRING_get0_data(asn1str)); + ExpectNotNull(data = (unsigned char*)ASN1_STRING_get0_data(asn1str)); #else - AssertNotNull(data = wolfSSL_ASN1_STRING_data(asn1str)); + ExpectNotNull(data = wolfSSL_ASN1_STRING_data(asn1str)); #endif expected = KEYUSE_KEY_CERT_SIGN | KEYUSE_CRL_SIGN; -#ifdef BIG_ENDIAN_ORDER - actual = data[1]; -#else - actual = data[0]; -#endif - AssertIntEQ(actual, expected); + if (data != NULL) { + #ifdef BIG_ENDIAN_ORDER + actual = data[1]; + #else + actual = data[0]; + #endif + } + ExpectIntEQ(actual, expected); wolfSSL_ASN1_STRING_free(asn1str); + asn1str = NULL; #if 1 i++; /* Authority Info Access */ - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, i)); - AssertNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); - AssertIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_info_access); - AssertNotNull(aia = - (WOLFSSL_AUTHORITY_INFO_ACCESS*)wolfSSL_X509V3_EXT_d2i(ext)); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, i)); + ExpectNotNull(obj = wolfSSL_X509_EXTENSION_get_object(ext)); + ExpectIntEQ((nid = wolfSSL_OBJ_obj2nid(obj)), NID_info_access); + ExpectNotNull(aia = (WOLFSSL_AUTHORITY_INFO_ACCESS*)wolfSSL_X509V3_EXT_d2i( + ext)); #if defined(WOLFSSL_QT) - AssertIntEQ(OPENSSL_sk_num(aia), 1); /* Only one URI entry for this cert */ + ExpectIntEQ(OPENSSL_sk_num(aia), 1); /* Only one URI entry for this cert */ #else - AssertIntEQ(wolfSSL_sk_num(aia), 1); /* Only one URI entry for this cert */ + ExpectIntEQ(wolfSSL_sk_num(aia), 1); /* Only one URI entry for this cert */ #endif /* URI entry is an ACCESS_DESCRIPTION type */ #if defined(WOLFSSL_QT) - AssertNotNull(ad = (WOLFSSL_ACCESS_DESCRIPTION*)wolfSSL_sk_value(aia, 0)); + ExpectNotNull(ad = (WOLFSSL_ACCESS_DESCRIPTION*)wolfSSL_sk_value(aia, 0)); #else - AssertNotNull(ad = (WOLFSSL_ACCESS_DESCRIPTION*)OPENSSL_sk_value(aia, 0)); + ExpectNotNull(ad = (WOLFSSL_ACCESS_DESCRIPTION*)OPENSSL_sk_value(aia, 0)); #endif - AssertNotNull(adObj = ad->method); + ExpectNotNull(adObj = ad->method); /* Make sure nid is OCSP */ - AssertIntEQ(wolfSSL_OBJ_obj2nid(adObj), NID_ad_OCSP); + ExpectIntEQ(wolfSSL_OBJ_obj2nid(adObj), NID_ad_OCSP); /* GENERAL_NAME stores URI as an ASN1_STRING */ - AssertNotNull(gn = ad->location); - AssertIntEQ(gn->type, GEN_URI); /* Type should always be GEN_URI */ - AssertNotNull(asn1str = gn->d.uniformResourceIdentifier); - AssertIntEQ(wolfSSL_ASN1_STRING_length(asn1str), 22); - #if defined(WOLFSSL_QT) - str = (char*)ASN1_STRING_get0_data(asn1str); - #else - str = (char*)wolfSSL_ASN1_STRING_data(asn1str); - #endif - actual = strcmp(str, "http://127.0.0.1:22220"); - AssertIntEQ(actual, 0); + ExpectNotNull(gn = ad->location); + ExpectIntEQ(gn->type, GEN_URI); /* Type should always be GEN_URI */ + ExpectNotNull(asn1str = gn->d.uniformResourceIdentifier); + ExpectIntEQ(wolfSSL_ASN1_STRING_length(asn1str), 22); +#if defined(WOLFSSL_QT) + ExpectNotNull(str = (char*)ASN1_STRING_get0_data(asn1str)); +#else + ExpectNotNull(str = (char*)wolfSSL_ASN1_STRING_data(asn1str)); +#endif + if (str != NULL) { + actual = strcmp(str, "http://127.0.0.1:22220"); + } + ExpectIntEQ(actual, 0); wolfSSL_sk_ACCESS_DESCRIPTION_pop_free(aia, NULL); + aia = NULL; #else (void) aia; (void) ad; (void) adObj; (void) gn; #endif wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_get_extension_flags(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_RSA) - XFILE f; - X509* x509; + XFILE f = XBADFILE; + X509* x509 = NULL; unsigned int extFlags; unsigned int keyUsageFlags; unsigned int extKeyUsageFlags; @@ -51363,14 +62075,18 @@ /* and the following extended key usage flags. */ extKeyUsageFlags = XKU_SSL_CLIENT | XKU_SMIME; - f = XFOPEN("./certs/intermediate/client-int-cert.pem", "rb"); - AssertTrue(f != XBADFILE); - AssertNotNull(x509 = PEM_read_X509(f, NULL, NULL, NULL)); - XFCLOSE(f); - AssertIntEQ(X509_get_extension_flags(x509), extFlags); - AssertIntEQ(X509_get_key_usage(x509), keyUsageFlags); - AssertIntEQ(X509_get_extended_key_usage(x509), extKeyUsageFlags); + ExpectTrue((f = XFOPEN("./certs/intermediate/client-int-cert.pem", "rb")) != + XBADFILE); + ExpectNotNull(x509 = PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } + ExpectIntEQ(X509_get_extension_flags(x509), extFlags); + ExpectIntEQ(X509_get_key_usage(x509), keyUsageFlags); + ExpectIntEQ(X509_get_extended_key_usage(x509), extKeyUsageFlags); X509_free(x509); + x509 = NULL; /* client-cert-ext.pem has the following extension flags. */ extFlags = EXFLAG_KUSAGE; @@ -51379,268 +62095,258 @@ | KU_KEY_CERT_SIGN | KU_CRL_SIGN; - AssertNotNull(f = fopen("./certs/client-cert-ext.pem", "rb")); - AssertNotNull(x509 = PEM_read_X509(f, NULL, NULL, NULL)); - XFCLOSE(f); - AssertIntEQ(X509_get_extension_flags(x509), extFlags); - AssertIntEQ(X509_get_key_usage(x509), keyUsageFlags); + ExpectTrue((f = fopen("./certs/client-cert-ext.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + XFCLOSE(f); + ExpectIntEQ(X509_get_extension_flags(x509), extFlags); + ExpectIntEQ(X509_get_key_usage(x509), keyUsageFlags); X509_free(x509); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_ALL */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_get_ext(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_ALL) && !defined(NO_RSA) int ret = 0; - FILE* f; - WOLFSSL_X509* x509; + XFILE f = XBADFILE; + WOLFSSL_X509* x509 = NULL; WOLFSSL_X509_EXTENSION* foundExtension; - AssertNotNull(f = fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); - fclose(f); - AssertIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 5); + ExpectTrue((f = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + XFCLOSE(f); + ExpectIntEQ((ret = wolfSSL_X509_get_ext_count(x509)), 5); /* wolfSSL_X509_get_ext() valid input */ - AssertNotNull(foundExtension = wolfSSL_X509_get_ext(x509, 0)); + ExpectNotNull(foundExtension = wolfSSL_X509_get_ext(x509, 0)); /* wolfSSL_X509_get_ext() valid x509, idx out of bounds */ - AssertNull(foundExtension = wolfSSL_X509_get_ext(x509, -1)); - AssertNull(foundExtension = wolfSSL_X509_get_ext(x509, 100)); + ExpectNull(foundExtension = wolfSSL_X509_get_ext(x509, -1)); + ExpectNull(foundExtension = wolfSSL_X509_get_ext(x509, 100)); /* wolfSSL_X509_get_ext() NULL x509, idx out of bounds */ - AssertNull(foundExtension = wolfSSL_X509_get_ext(NULL, -1)); - AssertNull(foundExtension = wolfSSL_X509_get_ext(NULL, 100)); + ExpectNull(foundExtension = wolfSSL_X509_get_ext(NULL, -1)); + ExpectNull(foundExtension = wolfSSL_X509_get_ext(NULL, 100)); /* wolfSSL_X509_get_ext() NULL x509, valid idx */ - AssertNull(foundExtension = wolfSSL_X509_get_ext(NULL, 0)); + ExpectNull(foundExtension = wolfSSL_X509_get_ext(NULL, 0)); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_get_ext_by_NID(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_RSA) - int rc; - FILE* f; - WOLFSSL_X509* x509; + int rc = 0; + XFILE f = XBADFILE; + WOLFSSL_X509* x509 = NULL; ASN1_OBJECT* obj = NULL; - AssertNotNull(f = fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); - fclose(f); + ExpectTrue((f = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + XFCLOSE(f); - rc = wolfSSL_X509_get_ext_by_NID(x509, NID_basic_constraints, -1); - AssertIntGE(rc, 0); + ExpectIntGE(rc = wolfSSL_X509_get_ext_by_NID(x509, NID_basic_constraints, + -1), 0); /* Start search from last location (should fail) */ - rc = wolfSSL_X509_get_ext_by_NID(x509, NID_basic_constraints, rc); - AssertIntGE(rc, -1); + ExpectIntGE(rc = wolfSSL_X509_get_ext_by_NID(x509, NID_basic_constraints, + rc), -1); - rc = wolfSSL_X509_get_ext_by_NID(x509, NID_basic_constraints, -2); - AssertIntGE(rc, -1); + ExpectIntGE(rc = wolfSSL_X509_get_ext_by_NID(x509, NID_basic_constraints, + -2), -1); - rc = wolfSSL_X509_get_ext_by_NID(NULL, NID_basic_constraints, -1); - AssertIntEQ(rc, -1); + ExpectIntEQ(rc = wolfSSL_X509_get_ext_by_NID(NULL, NID_basic_constraints, + -1), -1); - rc = wolfSSL_X509_get_ext_by_NID(x509, NID_undef, -1); - AssertIntEQ(rc, -1); + ExpectIntEQ(rc = wolfSSL_X509_get_ext_by_NID(x509, NID_undef, -1), -1); /* NID_ext_key_usage, check also its nid and oid */ - rc = wolfSSL_X509_get_ext_by_NID(x509, NID_ext_key_usage, -1); - AssertIntGT(rc, -1); - AssertNotNull(obj = wolfSSL_X509_EXTENSION_get_object(wolfSSL_X509_get_ext(x509, rc))); - AssertIntEQ(obj->nid, NID_ext_key_usage); - AssertIntEQ(obj->type, EXT_KEY_USAGE_OID); + ExpectIntGT(rc = wolfSSL_X509_get_ext_by_NID(x509, NID_ext_key_usage, -1), + -1); + ExpectNotNull(obj = wolfSSL_X509_EXTENSION_get_object(wolfSSL_X509_get_ext( + x509, rc))); + ExpectIntEQ(obj->nid, NID_ext_key_usage); + ExpectIntEQ(obj->type, EXT_KEY_USAGE_OID); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_get_ext_subj_alt_name(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_RSA) - int rc; - XFILE f; - WOLFSSL_X509* x509; - WOLFSSL_X509_EXTENSION* ext; - WOLFSSL_ASN1_STRING* sanString; - byte* sanDer; + int rc = 0; + XFILE f = XBADFILE; + WOLFSSL_X509* x509 = NULL; + WOLFSSL_X509_EXTENSION* ext = NULL; + WOLFSSL_ASN1_STRING* sanString = NULL; + byte* sanDer = NULL; const byte expectedDer[] = { 0x30, 0x13, 0x82, 0x0b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x87, 0x04, 0x7f, 0x00, 0x00, 0x01}; - f = XFOPEN("./certs/server-cert.pem", "rb"); - AssertTrue(f != XBADFILE); - AssertNotNull(x509 = PEM_read_X509(f, NULL, NULL, NULL)); - fclose(f); - - rc = X509_get_ext_by_NID(x509, NID_subject_alt_name, -1); - AssertIntNE(rc, -1); - AssertNotNull(ext = X509_get_ext(x509, rc)); - AssertNotNull(sanString = X509_EXTENSION_get_data(ext)); - AssertIntEQ(ASN1_STRING_length(sanString), sizeof(expectedDer)); - AssertNotNull(sanDer = ASN1_STRING_data(sanString)); - AssertIntEQ(XMEMCMP(sanDer, expectedDer, sizeof(expectedDer)), 0); + ExpectTrue((f = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + XFCLOSE(f); + + ExpectIntNE(rc = X509_get_ext_by_NID(x509, NID_subject_alt_name, -1), -1); + ExpectNotNull(ext = X509_get_ext(x509, rc)); + ExpectNotNull(sanString = X509_EXTENSION_get_data(ext)); + ExpectIntEQ(ASN1_STRING_length(sanString), sizeof(expectedDer)); + ExpectNotNull(sanDer = ASN1_STRING_data(sanString)); + ExpectIntEQ(XMEMCMP(sanDer, expectedDer, sizeof(expectedDer)), 0); X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_EXTENSION_new(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined (OPENSSL_ALL) - WOLFSSL_X509_EXTENSION* ext; + WOLFSSL_X509_EXTENSION* ext = NULL; - AssertNotNull(ext = wolfSSL_X509_EXTENSION_new()); - AssertNotNull(ext->obj = wolfSSL_ASN1_OBJECT_new()); - ext->obj->nid = WOLFSSL_SUCCESS; - AssertIntEQ(WOLFSSL_SUCCESS, ext->obj->nid); + ExpectNotNull(ext = wolfSSL_X509_EXTENSION_new()); + ExpectNotNull(ext->obj = wolfSSL_ASN1_OBJECT_new()); wolfSSL_X509_EXTENSION_free(ext); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_EXTENSION_get_object(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_ALL) && !defined(NO_RSA) - WOLFSSL_X509* x509; - WOLFSSL_X509_EXTENSION* ext; - WOLFSSL_ASN1_OBJECT* o; - FILE* file; - - AssertNotNull(file = fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(file, NULL, NULL, NULL)); - fclose(file); + WOLFSSL_X509* x509 = NULL; + WOLFSSL_X509_EXTENSION* ext = NULL; + WOLFSSL_ASN1_OBJECT* o = NULL; + XFILE file = XBADFILE; + + ExpectTrue((file = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(file, NULL, NULL, NULL)); + if (file != XBADFILE) + XFCLOSE(file); /* wolfSSL_X509_EXTENSION_get_object() testing ext idx 0 */ - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, 0)); - AssertNotNull(o = wolfSSL_X509_EXTENSION_get_object(ext)); - AssertIntEQ(o->nid, 128); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, 0)); + ExpectNull(wolfSSL_X509_EXTENSION_get_object(NULL)); + ExpectNotNull(o = wolfSSL_X509_EXTENSION_get_object(ext)); + ExpectIntEQ(o->nid, 128); /* wolfSSL_X509_EXTENSION_get_object() NULL argument */ - AssertNull(o = wolfSSL_X509_EXTENSION_get_object(NULL)); + ExpectNull(o = wolfSSL_X509_EXTENSION_get_object(NULL)); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_EXTENSION_get_data(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_ALL) && !defined(NO_RSA) - WOLFSSL_X509* x509; - WOLFSSL_X509_EXTENSION* ext; - WOLFSSL_ASN1_STRING* str; - FILE* file; - - AssertNotNull(file = fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(file, NULL, NULL, NULL)); - fclose(file); - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, 0)); + WOLFSSL_X509* x509 = NULL; + WOLFSSL_X509_EXTENSION* ext = NULL; + WOLFSSL_ASN1_STRING* str = NULL; + XFILE file = XBADFILE; - AssertNotNull(str = wolfSSL_X509_EXTENSION_get_data(ext)); + ExpectTrue((file = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(file, NULL, NULL, NULL)); + if (file != XBADFILE) + XFCLOSE(file); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, 0)); - wolfSSL_X509_free(x509); + ExpectNull(str = wolfSSL_X509_EXTENSION_get_data(NULL)); + ExpectNotNull(str = wolfSSL_X509_EXTENSION_get_data(ext)); - res = TEST_RES_CHECK(1); + wolfSSL_X509_free(x509); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_EXTENSION_get_critical(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_ALL) && !defined(NO_RSA) - WOLFSSL_X509* x509; - WOLFSSL_X509_EXTENSION* ext; - FILE* file; - int crit; - - AssertNotNull(file = fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(file, NULL, NULL, NULL)); - fclose(file); - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, 0)); + WOLFSSL_X509* x509 = NULL; + WOLFSSL_X509_EXTENSION* ext = NULL; + XFILE file = XBADFILE; + int crit = 0; + + ExpectTrue((file = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(file, NULL, NULL, NULL)); + if (file != XBADFILE) + XFCLOSE(file); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, 0)); - crit = wolfSSL_X509_EXTENSION_get_critical(ext); - AssertIntEQ(crit, 0); + ExpectIntEQ(crit = wolfSSL_X509_EXTENSION_get_critical(NULL), BAD_FUNC_ARG); + ExpectIntEQ(crit = wolfSSL_X509_EXTENSION_get_critical(ext), 0); wolfSSL_X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509V3_EXT_print(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_ALL) && !defined(NO_BIO) && \ !defined(NO_RSA) { - FILE* f; - WOLFSSL_X509* x509; + XFILE f = XBADFILE; + WOLFSSL_X509* x509 = NULL; X509_EXTENSION * ext = NULL; - int loc; + int loc = 0; BIO *bio = NULL; - AssertNotNull(f = fopen(svrCertFile, "rb")); - AssertNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); - fclose(f); - - AssertNotNull(bio = wolfSSL_BIO_new(BIO_s_mem())); - - loc = wolfSSL_X509_get_ext_by_NID(x509, NID_basic_constraints, -1); - AssertIntGT(loc, -1); - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, loc)); - AssertIntEQ(wolfSSL_X509V3_EXT_print(bio, ext, 0, 0), WOLFSSL_SUCCESS); - - loc = wolfSSL_X509_get_ext_by_NID(x509, NID_subject_key_identifier, -1); - AssertIntGT(loc, -1); - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, loc)); - AssertIntEQ(wolfSSL_X509V3_EXT_print(bio, ext, 0, 0), WOLFSSL_SUCCESS); - - loc = wolfSSL_X509_get_ext_by_NID(x509, NID_authority_key_identifier, -1); - AssertIntGT(loc, -1); - AssertNotNull(ext = wolfSSL_X509_get_ext(x509, loc)); - AssertIntEQ(wolfSSL_X509V3_EXT_print(bio, ext, 0, 0), WOLFSSL_SUCCESS); + ExpectTrue((f = XFOPEN(svrCertFile, "rb")) != XBADFILE); + ExpectNotNull(x509 = wolfSSL_PEM_read_X509(f, NULL, NULL, NULL)); + if (f != XBADFILE) + fclose(f); + + ExpectNotNull(bio = wolfSSL_BIO_new(BIO_s_mem())); + + ExpectIntGT(loc = wolfSSL_X509_get_ext_by_NID(x509, + NID_basic_constraints, -1), -1); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, loc)); + ExpectIntEQ(wolfSSL_X509V3_EXT_print(bio, ext, 0, 0), WOLFSSL_SUCCESS); + + ExpectIntGT(loc = wolfSSL_X509_get_ext_by_NID(x509, + NID_subject_key_identifier, -1), -1); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, loc)); + ExpectIntEQ(wolfSSL_X509V3_EXT_print(bio, ext, 0, 0), WOLFSSL_SUCCESS); + + ExpectIntGT(loc = wolfSSL_X509_get_ext_by_NID(x509, + NID_authority_key_identifier, -1), -1); + ExpectNotNull(ext = wolfSSL_X509_get_ext(x509, loc)); + ExpectIntEQ(wolfSSL_X509V3_EXT_print(bio, ext, 0, 0), WOLFSSL_SUCCESS); wolfSSL_BIO_free(bio); wolfSSL_X509_free(x509); } { - X509 *x509; - BIO *bio; - X509_EXTENSION *ext; - unsigned int i; - unsigned int idx; + X509 *x509 = NULL; + BIO *bio = NULL; + X509_EXTENSION *ext = NULL; + unsigned int i = 0; + unsigned int idx = 0; /* Some NIDs to test with */ int nids[] = { /* NID_key_usage, currently X509_get_ext returns this as a bit @@ -51648,340 +62354,356 @@ /* NID_ext_key_usage, */ NID_subject_alt_name, }; - int* n; + int* n = NULL; - AssertNotNull(bio = BIO_new_fp(stderr, BIO_NOCLOSE)); + ExpectNotNull(bio = BIO_new_fp(stderr, BIO_NOCLOSE)); - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(cliCertFileExt, + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(cliCertFileExt, WOLFSSL_FILETYPE_PEM)); - fprintf(stderr, "\nPrinting extension values:\n"); + ExpectIntGT(fprintf(stderr, "\nPrinting extension values:\n"), 0); for (i = 0, n = nids; i<(sizeof(nids)/sizeof(int)); i++, n++) { /* X509_get_ext_by_NID should return 3 for now. If that changes then * update the index */ - AssertIntEQ((idx = X509_get_ext_by_NID(x509, *n, -1)), 3); - AssertNotNull(ext = X509_get_ext(x509, idx)); - AssertIntEQ(X509V3_EXT_print(bio, ext, 0, 0), 1); - fprintf(stderr, "\n"); + ExpectIntEQ((idx = X509_get_ext_by_NID(x509, *n, -1)), 3); + ExpectNotNull(ext = X509_get_ext(x509, (int)idx)); + ExpectIntEQ(X509V3_EXT_print(bio, ext, 0, 0), 1); + ExpectIntGT(fprintf(stderr, "\n"), 0); } BIO_free(bio); X509_free(x509); } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_cmp(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_RSA) - FILE* file1; - FILE* file2; - WOLFSSL_X509* cert1; - WOLFSSL_X509* cert2; - - AssertNotNull(file1=fopen("./certs/server-cert.pem", "rb")); - AssertNotNull(file2=fopen("./certs/3072/client-cert.pem", "rb")); - - AssertNotNull(cert1 = wolfSSL_PEM_read_X509(file1, NULL, NULL, NULL)); - AssertNotNull(cert2 = wolfSSL_PEM_read_X509(file2, NULL, NULL, NULL)); - fclose(file1); - fclose(file2); + XFILE file1 = XBADFILE; + XFILE file2 = XBADFILE; + WOLFSSL_X509* cert1 = NULL; + WOLFSSL_X509* cert2 = NULL; + + ExpectTrue((file1 = XFOPEN("./certs/server-cert.pem", "rb")) != XBADFILE); + ExpectTrue((file2 = XFOPEN("./certs/3072/client-cert.pem", "rb")) != + XBADFILE); + + ExpectNotNull(cert1 = wolfSSL_PEM_read_X509(file1, NULL, NULL, NULL)); + ExpectNotNull(cert2 = wolfSSL_PEM_read_X509(file2, NULL, NULL, NULL)); + if (file1 != XBADFILE) + fclose(file1); + if (file2 != XBADFILE) + fclose(file2); /* wolfSSL_X509_cmp() testing matching certs */ - AssertIntEQ(0, wolfSSL_X509_cmp(cert1, cert1)); + ExpectIntEQ(0, wolfSSL_X509_cmp(cert1, cert1)); /* wolfSSL_X509_cmp() testing mismatched certs */ - AssertIntEQ(-1, wolfSSL_X509_cmp(cert1, cert2)); + ExpectIntEQ(-1, wolfSSL_X509_cmp(cert1, cert2)); /* wolfSSL_X509_cmp() testing NULL, valid args */ - AssertIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(NULL, cert2)); + ExpectIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(NULL, cert2)); /* wolfSSL_X509_cmp() testing valid, NULL args */ - AssertIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(cert1, NULL)); + ExpectIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(cert1, NULL)); /* wolfSSL_X509_cmp() testing NULL, NULL args */ - AssertIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(NULL, NULL)); + ExpectIntEQ(BAD_FUNC_ARG, wolfSSL_X509_cmp(NULL, NULL)); wolfSSL_X509_free(cert1); wolfSSL_X509_free(cert2); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } -static int test_wolfSSL_PKEY_up_ref(void) +static int test_wolfSSL_EVP_PKEY_up_ref(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) EVP_PKEY* pkey; pkey = EVP_PKEY_new(); - AssertIntEQ(EVP_PKEY_up_ref(NULL), 0); - AssertIntEQ(EVP_PKEY_up_ref(pkey), 1); + ExpectNotNull(pkey); + ExpectIntEQ(EVP_PKEY_up_ref(NULL), 0); + ExpectIntEQ(EVP_PKEY_up_ref(pkey), 1); EVP_PKEY_free(pkey); - AssertIntEQ(EVP_PKEY_up_ref(pkey), 1); + ExpectIntEQ(EVP_PKEY_up_ref(pkey), 1); EVP_PKEY_free(pkey); EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_d2i_and_i2d_PublicKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) - EVP_PKEY* pkey; + EVP_PKEY* pkey = NULL; const unsigned char* p; - unsigned char *der = NULL, *tmp = NULL; + unsigned char *der = NULL; + unsigned char *tmp = NULL; int derLen; p = client_keypub_der_2048; /* Check that key can be successfully decoded. */ - AssertNotNull(pkey = wolfSSL_d2i_PublicKey(EVP_PKEY_RSA, NULL, &p, + ExpectNotNull(pkey = wolfSSL_d2i_PublicKey(EVP_PKEY_RSA, NULL, &p, sizeof_client_keypub_der_2048)); /* Check that key can be successfully encoded. */ - AssertIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &der)), 0); + ExpectIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &der)), 0); /* Ensure that the encoded version matches the original. */ - AssertIntEQ(derLen, sizeof_client_keypub_der_2048); - AssertIntEQ(XMEMCMP(der, client_keypub_der_2048, derLen), 0); + ExpectIntEQ(derLen, sizeof_client_keypub_der_2048); + ExpectIntEQ(XMEMCMP(der, client_keypub_der_2048, derLen), 0); /* Do same test except with pre-allocated buffer to ensure the der pointer * is advanced. */ tmp = der; - AssertIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &tmp)), 0); - AssertIntEQ(derLen, sizeof_client_keypub_der_2048); - AssertIntEQ(XMEMCMP(der, client_keypub_der_2048, derLen), 0); - AssertTrue(der + derLen == tmp); + ExpectIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &tmp)), 0); + ExpectIntEQ(derLen, sizeof_client_keypub_der_2048); + ExpectIntEQ(XMEMCMP(der, client_keypub_der_2048, derLen), 0); + ExpectTrue(der + derLen == tmp); XFREE(der, HEAP_HINT, DYNAMIC_TYPE_OPENSSL); EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_d2i_and_i2d_PublicKey_ecc(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && !defined(NO_CERTS) && \ !defined(NO_ASN) && !defined(NO_PWDBASED) - EVP_PKEY* pkey; + EVP_PKEY* pkey = NULL; const unsigned char* p; - unsigned char *der = NULL, *tmp = NULL; + unsigned char *der = NULL; + unsigned char *tmp = NULL; int derLen; unsigned char pub_buf[65]; const int pub_len = 65; - BN_CTX * ctx; - EC_GROUP * curve; - EC_KEY * ephemeral_key; - const EC_POINT * h; + BN_CTX* ctx; + EC_GROUP* curve = NULL; + EC_KEY* ephemeral_key = NULL; + const EC_POINT* h; /* Generate an x963 key pair and get public part into pub_buf */ - AssertNotNull(ctx = BN_CTX_new()); - AssertNotNull(curve = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); - AssertNotNull(ephemeral_key = EC_KEY_new_by_curve_name( - NID_X9_62_prime256v1)); - AssertIntEQ(EC_KEY_generate_key(ephemeral_key), 1); - AssertNotNull(h = EC_KEY_get0_public_key(ephemeral_key)); - AssertIntEQ(pub_len, EC_POINT_point2oct(curve, h, - POINT_CONVERSION_UNCOMPRESSED, - pub_buf, pub_len, ctx)); + ExpectNotNull(ctx = BN_CTX_new()); + ExpectNotNull(curve = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(ephemeral_key = EC_KEY_new_by_curve_name( + NID_X9_62_prime256v1)); + ExpectIntEQ(EC_KEY_generate_key(ephemeral_key), 1); + ExpectNotNull(h = EC_KEY_get0_public_key(ephemeral_key)); + ExpectIntEQ(pub_len, EC_POINT_point2oct(curve, h, + POINT_CONVERSION_UNCOMPRESSED, pub_buf, pub_len, ctx)); /* Prepare the EVP_PKEY */ - AssertNotNull(pkey = EVP_PKEY_new()); + ExpectNotNull(pkey = EVP_PKEY_new()); p = pub_buf; /* Check that key can be successfully decoded. */ - AssertNotNull(wolfSSL_d2i_PublicKey(EVP_PKEY_EC, &pkey, &p, + ExpectNotNull(wolfSSL_d2i_PublicKey(EVP_PKEY_EC, &pkey, &p, pub_len)); /* Check that key can be successfully encoded. */ - AssertIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &der)), 0); + ExpectIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &der)), 0); /* Ensure that the encoded version matches the original. */ - AssertIntEQ(derLen, pub_len); - AssertIntEQ(XMEMCMP(der, pub_buf, derLen), 0); + ExpectIntEQ(derLen, pub_len); + ExpectIntEQ(XMEMCMP(der, pub_buf, derLen), 0); /* Do same test except with pre-allocated buffer to ensure the der pointer * is advanced. */ tmp = der; - AssertIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &tmp)), 0); - AssertIntEQ(derLen, pub_len); - AssertIntEQ(XMEMCMP(der, pub_buf, derLen), 0); - AssertTrue(der + derLen == tmp); + ExpectIntGE((derLen = wolfSSL_i2d_PublicKey(pkey, &tmp)), 0); + ExpectIntEQ(derLen, pub_len); + ExpectIntEQ(XMEMCMP(der, pub_buf, derLen), 0); + ExpectTrue(der + derLen == tmp); XFREE(der, HEAP_HINT, DYNAMIC_TYPE_OPENSSL); EVP_PKEY_free(pkey); EC_KEY_free(ephemeral_key); EC_GROUP_free(curve); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_d2i_and_i2d_DSAparams(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DSA) - DSA* dsa; - char file[] = "./certs/dsaparams.der"; - XFILE f; - int derInLen; - byte* derIn; - int derOutLen; + DSA* dsa = NULL; + byte derIn[] = { + 0x30, 0x82, 0x01, 0x1f, 0x02, 0x81, 0x81, 0x00, + 0xcd, 0xde, 0x25, 0x68, 0x80, 0x53, 0x0d, 0xe5, + 0x77, 0xd6, 0xd2, 0x90, 0x39, 0x3f, 0x90, 0xa2, + 0x3f, 0x33, 0x94, 0x6e, 0xe8, 0x4f, 0x2b, 0x63, + 0xab, 0x30, 0xab, 0x15, 0xba, 0x11, 0xea, 0x8a, + 0x5d, 0x8d, 0xcc, 0xb8, 0xd4, 0xa1, 0xd5, 0xc1, + 0x47, 0x9d, 0x5a, 0x73, 0x6a, 0x62, 0x49, 0xd1, + 0x06, 0x07, 0x67, 0xf6, 0x2f, 0xa3, 0x39, 0xbd, + 0x4e, 0x0d, 0xb4, 0xd3, 0x22, 0x23, 0x84, 0xec, + 0x93, 0x26, 0x5a, 0x49, 0xee, 0x7c, 0x89, 0x48, + 0x66, 0x4d, 0xe8, 0xe8, 0xd8, 0x50, 0xfb, 0xa5, + 0x71, 0x9f, 0x22, 0x18, 0xe5, 0xe6, 0x0b, 0x46, + 0x87, 0x66, 0xee, 0x52, 0x8f, 0x46, 0x4f, 0xb5, + 0x03, 0xce, 0xed, 0xe3, 0xbe, 0xe5, 0xb5, 0x81, + 0xd2, 0x59, 0xe9, 0xc0, 0xad, 0x4d, 0xd0, 0x4d, + 0x26, 0xf7, 0xba, 0x50, 0xe8, 0xc9, 0x8f, 0xfe, + 0x24, 0x19, 0x3d, 0x2e, 0xa7, 0x52, 0x3c, 0x6d, + 0x02, 0x15, 0x00, 0xfb, 0x47, 0xfb, 0xec, 0x81, + 0x20, 0xc8, 0x1c, 0xe9, 0x4a, 0xba, 0x04, 0x6f, + 0x19, 0x9b, 0x94, 0xee, 0x82, 0x67, 0xd3, 0x02, + 0x81, 0x81, 0x00, 0x9b, 0x95, 0xbb, 0x85, 0xc5, + 0x58, 0x4a, 0x32, 0x9c, 0xaa, 0x44, 0x85, 0xd6, + 0x68, 0xdc, 0x3e, 0x14, 0xf4, 0xce, 0x6d, 0xa3, + 0x49, 0x38, 0xea, 0xd6, 0x61, 0x48, 0x92, 0x5a, + 0x40, 0x95, 0x49, 0x38, 0xaa, 0xe1, 0x39, 0x29, + 0x68, 0x58, 0x47, 0x8a, 0x4b, 0x01, 0xe1, 0x2e, + 0x8e, 0x6c, 0x63, 0x6f, 0x40, 0xca, 0x50, 0x3f, + 0x8c, 0x0b, 0x99, 0xe4, 0x72, 0x42, 0xb8, 0xb1, + 0xc2, 0x26, 0x48, 0xf1, 0x9c, 0x83, 0xc6, 0x37, + 0x2e, 0x5a, 0xae, 0x11, 0x09, 0xd9, 0xf3, 0xad, + 0x1f, 0x6f, 0xad, 0xad, 0x50, 0xe3, 0x78, 0x32, + 0xe6, 0xde, 0x8e, 0xaa, 0xbf, 0xd1, 0x00, 0x9f, + 0xb3, 0x02, 0x12, 0x19, 0xa2, 0x15, 0xec, 0x14, + 0x18, 0x5c, 0x0e, 0x26, 0xce, 0xf9, 0xae, 0xcc, + 0x7b, 0xb5, 0xd1, 0x26, 0xfc, 0x85, 0xfe, 0x14, + 0x93, 0xb6, 0x9d, 0x7d, 0x76, 0xe3, 0x35, 0x97, + 0x1e, 0xde, 0xc4 + }; + int derInLen = sizeof(derIn); byte* derOut = NULL; - - f = XFOPEN(file, "rb"); - AssertTrue(f != XBADFILE); - AssertTrue(XFSEEK(f, 0, XSEEK_END) == 0); - derInLen = (int)XFTELL(f); - AssertTrue(XFSEEK(f, 0, XSEEK_SET) == 0); - AssertNotNull(derIn = (byte*)XMALLOC(derInLen, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER)); - AssertIntEQ(XFREAD(derIn, 1, derInLen, f), derInLen); - XFCLOSE(f); + int derOutLen; + byte* p = derIn; /* Check that params can be successfully decoded. */ - AssertNotNull(dsa = d2i_DSAparams(NULL, (const byte**)&derIn, derInLen)); + ExpectNotNull(dsa = d2i_DSAparams(NULL, (const byte**)&p, derInLen)); /* Check that params can be successfully encoded. */ - AssertIntGE((derOutLen = i2d_DSAparams(dsa, &derOut)), 0); + ExpectIntGE((derOutLen = i2d_DSAparams(dsa, &derOut)), 0); /* Ensure that the encoded version matches the original. */ - AssertIntEQ(derInLen, derOutLen); - AssertIntEQ(XMEMCMP(derIn, derOut, derInLen), 0); + ExpectIntEQ(derInLen, derOutLen); + ExpectIntEQ(XMEMCMP(derIn, derOut, derInLen), 0); - XFREE(derIn, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(derOut, HEAP_HINT, DYNAMIC_TYPE_OPENSSL); DSA_free(dsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_i2d_PrivateKey(void) { - int res = TEST_SKIPPED; -#if (!defined(NO_RSA) || defined(HAVE_ECC)) && defined(OPENSSL_EXTRA) && !defined(NO_ASN) && !defined(NO_PWDBASED) + EXPECT_DECLS; +#if (!defined(NO_RSA) || defined(HAVE_ECC)) && defined(OPENSSL_EXTRA) && \ + !defined(NO_ASN) && !defined(NO_PWDBASED) #if !defined(NO_RSA) && defined(USE_CERT_BUFFERS_2048) { - EVP_PKEY* pkey; - const unsigned char* server_key = (const unsigned char*)server_key_der_2048; + EVP_PKEY* pkey = NULL; + const unsigned char* server_key = + (const unsigned char*)server_key_der_2048; unsigned char buf[FOURK_BUF]; unsigned char* pt = NULL; - int bufSz; + int bufSz = 0; - AssertNotNull(pkey = d2i_PrivateKey(EVP_PKEY_RSA, NULL, &server_key, - (long)sizeof_server_key_der_2048)); - AssertIntEQ(i2d_PrivateKey(pkey, NULL), 1193); + ExpectNotNull(pkey = d2i_PrivateKey(EVP_PKEY_RSA, NULL, &server_key, + (long)sizeof_server_key_der_2048)); + ExpectIntEQ(i2d_PrivateKey(pkey, NULL), 1193); pt = buf; - AssertIntEQ((bufSz = i2d_PrivateKey(pkey, &pt)), 1193); - AssertIntNE((pt - buf), 0); - AssertIntEQ(XMEMCMP(buf, server_key_der_2048, bufSz), 0); + ExpectIntEQ((bufSz = i2d_PrivateKey(pkey, &pt)), 1193); + ExpectIntNE((pt - buf), 0); + ExpectIntEQ(XMEMCMP(buf, server_key_der_2048, bufSz), 0); EVP_PKEY_free(pkey); } #endif #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) { - EVP_PKEY* pkey; + EVP_PKEY* pkey = NULL; const unsigned char* client_key = (const unsigned char*)ecc_clikey_der_256; unsigned char buf[FOURK_BUF]; unsigned char* pt = NULL; - int bufSz; + int bufSz = 0; - AssertNotNull((pkey = d2i_PrivateKey(EVP_PKEY_EC, NULL, &client_key, - sizeof_ecc_clikey_der_256))); - AssertIntEQ(i2d_PrivateKey(pkey, NULL), 121); + ExpectNotNull((pkey = d2i_PrivateKey(EVP_PKEY_EC, NULL, &client_key, + (long)sizeof_ecc_clikey_der_256))); + ExpectIntEQ(i2d_PrivateKey(pkey, NULL), 121); pt = buf; - AssertIntEQ((bufSz = i2d_PrivateKey(pkey, &pt)), 121); - AssertIntNE((pt - buf), 0); - AssertIntEQ(XMEMCMP(buf, ecc_clikey_der_256, bufSz), 0); + ExpectIntEQ((bufSz = i2d_PrivateKey(pkey, &pt)), 121); + ExpectIntNE((pt - buf), 0); + ExpectIntEQ(XMEMCMP(buf, ecc_clikey_der_256, bufSz), 0); EVP_PKEY_free(pkey); } #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OCSP_id_get0_info(void) { - int res = TEST_SKIPPED; -#if (defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)) && defined(HAVE_OCSP) && \ - !defined(NO_FILESYSTEM) && !defined(NO_RSA) - X509* cert; - X509* issuer; - OCSP_CERTID* id; - OCSP_CERTID* id2; + EXPECT_DECLS; +#if (defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)) && \ + defined(HAVE_OCSP) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) + X509* cert = NULL; + X509* issuer = NULL; + OCSP_CERTID* id = NULL; + OCSP_CERTID* id2 = NULL; ASN1_STRING* name = NULL; ASN1_OBJECT* pmd = NULL; ASN1_STRING* keyHash = NULL; ASN1_INTEGER* serial = NULL; - ASN1_INTEGER* x509Int; + ASN1_INTEGER* x509Int = NULL; + + ExpectNotNull(cert = wolfSSL_X509_load_certificate_file(svrCertFile, + SSL_FILETYPE_PEM)); + ExpectNotNull(issuer = wolfSSL_X509_load_certificate_file(caCertFile, + SSL_FILETYPE_PEM)); - AssertNotNull(cert = - wolfSSL_X509_load_certificate_file(svrCertFile, SSL_FILETYPE_PEM)); - AssertNotNull(issuer = - wolfSSL_X509_load_certificate_file(caCertFile, SSL_FILETYPE_PEM)); - - id = OCSP_cert_to_id(NULL, cert, issuer); - AssertNotNull(id); - id2 = OCSP_cert_to_id(NULL, cert, issuer); - AssertNotNull(id2); + ExpectNotNull(id = OCSP_cert_to_id(NULL, cert, issuer)); + ExpectNotNull(id2 = OCSP_cert_to_id(NULL, cert, issuer)); - AssertIntEQ(OCSP_id_get0_info(NULL, NULL, NULL, NULL, NULL), 0); - AssertIntEQ(OCSP_id_get0_info(NULL, NULL, NULL, NULL, id), 1); + ExpectIntEQ(OCSP_id_get0_info(NULL, NULL, NULL, NULL, NULL), 0); + ExpectIntEQ(OCSP_id_get0_info(NULL, NULL, NULL, NULL, id), 1); /* name, pmd, keyHash not supported yet, expect failure if not NULL */ - AssertIntEQ(OCSP_id_get0_info(&name, NULL, NULL, NULL, id), 0); - AssertIntEQ(OCSP_id_get0_info(NULL, &pmd, NULL, NULL, id), 0); - AssertIntEQ(OCSP_id_get0_info(NULL, NULL, &keyHash, NULL, id), 0); + ExpectIntEQ(OCSP_id_get0_info(&name, NULL, NULL, NULL, id), 0); + ExpectIntEQ(OCSP_id_get0_info(NULL, &pmd, NULL, NULL, id), 0); + ExpectIntEQ(OCSP_id_get0_info(NULL, NULL, &keyHash, NULL, id), 0); - AssertIntEQ(OCSP_id_get0_info(NULL, NULL, NULL, &serial, id), 1); - AssertNotNull(serial); + ExpectIntEQ(OCSP_id_get0_info(NULL, NULL, NULL, &serial, id), 1); + ExpectNotNull(serial); /* compare serial number to one in cert, should be equal */ - x509Int = X509_get_serialNumber(cert); - AssertNotNull(x509Int); - AssertIntEQ(x509Int->length, serial->length); - AssertIntEQ(XMEMCMP(x509Int->data, serial->data, serial->length), 0); + ExpectNotNull(x509Int = X509_get_serialNumber(cert)); + ExpectIntEQ(x509Int->length, serial->length); + ExpectIntEQ(XMEMCMP(x509Int->data, serial->data, serial->length), 0); /* test OCSP_id_cmp */ - AssertIntNE(OCSP_id_cmp(NULL, NULL), 0); - AssertIntNE(OCSP_id_cmp(id, NULL), 0); - AssertIntNE(OCSP_id_cmp(NULL, id2), 0); - AssertIntEQ(OCSP_id_cmp(id, id2), 0); - id->issuerHash[0] = ~id->issuerHash[0]; - AssertIntNE(OCSP_id_cmp(id, id2), 0); + ExpectIntNE(OCSP_id_cmp(NULL, NULL), 0); + ExpectIntNE(OCSP_id_cmp(id, NULL), 0); + ExpectIntNE(OCSP_id_cmp(NULL, id2), 0); + ExpectIntEQ(OCSP_id_cmp(id, id2), 0); + if (id != NULL) { + id->issuerHash[0] = ~id->issuerHash[0]; + } + ExpectIntNE(OCSP_id_cmp(id, id2), 0); OCSP_CERTID_free(id); OCSP_CERTID_free(id2); X509_free(cert); /* free's x509Int */ X509_free(issuer); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_i2d_OCSP_CERTID(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)) && defined(HAVE_OCSP) WOLFSSL_OCSP_CERTID certId; - byte* targetBuffer; - byte* beginTargetBuffer; + byte* targetBuffer = NULL; + byte* p; /* OCSP CertID bytes taken from PCAP */ byte rawCertId[] = { 0x30, 0x49, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, @@ -51992,49 +62714,46 @@ 0xfd, 0xa3, 0xeb, 0x6e, 0xca, 0x75, 0xc8, 0x88, 0x43, 0x8b, 0x72, 0x4b, 0xcf, 0xbc, 0x91 }; - int ret, i; + int ret = 0; + int i; XMEMSET(&certId, 0, sizeof(WOLFSSL_OCSP_CERTID)); certId.rawCertId = rawCertId; certId.rawCertIdSize = sizeof(rawCertId); - targetBuffer = (byte*)XMALLOC(sizeof(rawCertId), NULL, DYNAMIC_TYPE_TMP_BUFFER); - beginTargetBuffer = targetBuffer; - ret = wolfSSL_i2d_OCSP_CERTID(&certId, &targetBuffer); - /* If target buffer is not null, function increments targetBuffer to point - just past the end of the encoded data. */ - AssertPtrEq(targetBuffer, (beginTargetBuffer + sizeof(rawCertId))); + ExpectNotNull(targetBuffer = (byte*)XMALLOC(sizeof(rawCertId), NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + p = targetBuffer; /* Function returns the size of the encoded data. */ - AssertIntEQ(ret, sizeof(rawCertId)); - for (i = 0; i < ret; ++i) - { - AssertIntEQ(beginTargetBuffer[i], rawCertId[i]); + ExpectIntEQ(ret = wolfSSL_i2d_OCSP_CERTID(&certId, &p), sizeof(rawCertId)); + /* If target buffer is not null, function increments targetBuffer to point + * just past the end of the encoded data. */ + ExpectPtrEq(p, (targetBuffer + sizeof(rawCertId))); + for (i = 0; EXPECT_SUCCESS() && i < ret; ++i) { + ExpectIntEQ(targetBuffer[i], rawCertId[i]); } - - XFREE(beginTargetBuffer, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(targetBuffer, NULL, DYNAMIC_TYPE_TMP_BUFFER); targetBuffer = NULL; - ret = wolfSSL_i2d_OCSP_CERTID(&certId, &targetBuffer); + /* If target buffer is null, function allocates memory for a buffer and - copies the encoded data into it. targetBuffer then points to the start of - this newly allocate buffer. */ - AssertIntEQ(ret, sizeof(rawCertId)); - for (i = 0; i < ret; ++i) - { - AssertIntEQ(targetBuffer[i], rawCertId[i]); + * copies the encoded data into it. targetBuffer then points to the start of + * this newly allocate buffer. */ + ExpectIntEQ(ret = wolfSSL_i2d_OCSP_CERTID(&certId, &targetBuffer), + sizeof(rawCertId)); + for (i = 0; EXPECT_SUCCESS() && i < ret; ++i) { + ExpectIntEQ(targetBuffer[i], rawCertId[i]); } - XFREE(targetBuffer, NULL, DYNAMIC_TYPE_OPENSSL); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_d2i_OCSP_CERTID(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_ALL) || defined(WOLFSSL_HAPROXY)) && defined(HAVE_OCSP) WOLFSSL_OCSP_CERTID* certId; + WOLFSSL_OCSP_CERTID* certIdGood; WOLFSSL_OCSP_CERTID* certIdBad; const unsigned char* rawCertIdPtr; @@ -52053,82 +62772,80 @@ /* If the cert ID is NULL the function should allocate it and copy the * data to it. */ certId = NULL; - certId = wolfSSL_d2i_OCSP_CERTID(&certId, &rawCertIdPtr, sizeof(rawCertId)); - - AssertNotNull(certId); - AssertIntEQ(certId->rawCertIdSize, sizeof(rawCertId)); - - XFREE(certId->rawCertId, NULL, DYNAMIC_TYPE_OPENSSL); - XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL); + ExpectNotNull(certId = wolfSSL_d2i_OCSP_CERTID(&certId, &rawCertIdPtr, + sizeof(rawCertId))); + ExpectIntEQ(certId->rawCertIdSize, sizeof(rawCertId)); + if (certId != NULL) { + XFREE(certId->rawCertId, NULL, DYNAMIC_TYPE_OPENSSL); + XFREE(certId, NULL, DYNAMIC_TYPE_OPENSSL); + } /* If the cert ID is not NULL the function will just copy the data to it. */ - certId = (WOLFSSL_OCSP_CERTID*)XMALLOC(sizeof(*certId), NULL, - DYNAMIC_TYPE_TMP_BUFFER); - AssertNotNull(certId); - XMEMSET(certId, 0, sizeof(*certId)); + ExpectNotNull(certId = (WOLFSSL_OCSP_CERTID*)XMALLOC(sizeof(*certId), NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectNotNull(certId); + ExpectNotNull(XMEMSET(certId, 0, sizeof(*certId))); /* Reset rawCertIdPtr since it was push forward in the previous call. */ rawCertIdPtr = &rawCertId[0]; - certId = wolfSSL_d2i_OCSP_CERTID(&certId, &rawCertIdPtr, sizeof(rawCertId)); - - AssertNotNull(certId); - AssertIntEQ(certId->rawCertIdSize, sizeof(rawCertId)); - - XFREE(certId->rawCertId, NULL, DYNAMIC_TYPE_OPENSSL); - XFREE(certId, NULL, DYNAMIC_TYPE_TMP_BUFFER); + ExpectNotNull(certIdGood = wolfSSL_d2i_OCSP_CERTID(&certId, &rawCertIdPtr, + sizeof(rawCertId))); + ExpectPtrEq(certIdGood, certId); + ExpectIntEQ(certId->rawCertIdSize, sizeof(rawCertId)); + if (certId != NULL) { + XFREE(certId->rawCertId, NULL, DYNAMIC_TYPE_OPENSSL); + XFREE(certId, NULL, DYNAMIC_TYPE_TMP_BUFFER); + certId = NULL; + } /* The below tests should fail when passed bad parameters. NULL should * always be returned. */ - certIdBad = wolfSSL_d2i_OCSP_CERTID(NULL, &rawCertIdPtr, sizeof(rawCertId)); - AssertNull(certIdBad); - - certIdBad = wolfSSL_d2i_OCSP_CERTID(&certId, NULL, sizeof(rawCertId)); - AssertNull(certIdBad); - - certIdBad = wolfSSL_d2i_OCSP_CERTID(&certId, &rawCertIdPtr, 0); - AssertNull(certIdBad); - - res = TEST_RES_CHECK(1); + ExpectNull(certIdBad = wolfSSL_d2i_OCSP_CERTID(NULL, &rawCertIdPtr, + sizeof(rawCertId))); + ExpectNull(certIdBad = wolfSSL_d2i_OCSP_CERTID(&certId, NULL, + sizeof(rawCertId))); + ExpectNull(certIdBad = wolfSSL_d2i_OCSP_CERTID(&certId, &rawCertIdPtr, 0)); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OCSP_id_cmp(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_OCSP) OCSP_CERTID id1; OCSP_CERTID id2; XMEMSET(&id1, 0, sizeof(id1)); XMEMSET(&id2, 0, sizeof(id2)); - AssertIntEQ(OCSP_id_cmp(&id1, &id2), 0); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(OCSP_id_cmp(&id1, &id2), 0); + ExpectIntNE(OCSP_id_cmp(NULL, NULL), 0); + ExpectIntNE(OCSP_id_cmp(&id1, NULL), 0); + ExpectIntNE(OCSP_id_cmp(NULL, &id2), 0); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OCSP_SINGLERESP_get0_id(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_OCSP) WOLFSSL_OCSP_SINGLERESP single; const WOLFSSL_OCSP_CERTID* certId; XMEMSET(&single, 0, sizeof(single)); - certId = wolfSSL_OCSP_SINGLERESP_get0_id(&single); - AssertPtrEq(&single, certId); + certId = wolfSSL_OCSP_SINGLERESP_get0_id(&single); + ExpectPtrEq(&single, certId); - res = TEST_RES_CHECK(1); + ExpectNull(wolfSSL_OCSP_SINGLERESP_get0_id(NULL)); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OCSP_single_get0_status(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_OCSP) WOLFSSL_OCSP_SINGLERESP single; CertStatus certStatus; @@ -52149,52 +62866,46 @@ ret = wolfSSL_OCSP_single_get0_status(&single, NULL, NULL, &thisDate, &nextDate); - AssertIntEQ(ret, CERT_GOOD); - AssertPtrEq(thisDate, &certStatus.thisDateParsed); - AssertPtrEq(nextDate, &certStatus.nextDateParsed); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(ret, CERT_GOOD); + ExpectPtrEq(thisDate, &certStatus.thisDateParsed); + ExpectPtrEq(nextDate, &certStatus.nextDateParsed); + + ExpectIntEQ(wolfSSL_OCSP_single_get0_status(NULL, NULL, NULL, NULL, NULL), + CERT_GOOD); + ExpectIntEQ(wolfSSL_OCSP_single_get0_status(&single, NULL, NULL, NULL, + NULL), CERT_GOOD); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OCSP_resp_count(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_OCSP) WOLFSSL_OCSP_BASICRESP basicResp; WOLFSSL_OCSP_SINGLERESP singleRespOne; WOLFSSL_OCSP_SINGLERESP singleRespTwo; - int count; XMEMSET(&basicResp, 0, sizeof(WOLFSSL_OCSP_BASICRESP)); XMEMSET(&singleRespOne, 0, sizeof(WOLFSSL_OCSP_SINGLERESP)); XMEMSET(&singleRespTwo, 0, sizeof(WOLFSSL_OCSP_SINGLERESP)); - count = wolfSSL_OCSP_resp_count(&basicResp); - AssertIntEQ(count, 0); - + ExpectIntEQ(wolfSSL_OCSP_resp_count(&basicResp), 0); basicResp.single = &singleRespOne; - count = wolfSSL_OCSP_resp_count(&basicResp); - AssertIntEQ(count, 1); - + ExpectIntEQ(wolfSSL_OCSP_resp_count(&basicResp), 1); singleRespOne.next = &singleRespTwo; - count = wolfSSL_OCSP_resp_count(&basicResp); - AssertIntEQ(count, 2); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wolfSSL_OCSP_resp_count(&basicResp), 2); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OCSP_resp_get0(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_OCSP) WOLFSSL_OCSP_BASICRESP basicResp; WOLFSSL_OCSP_SINGLERESP singleRespOne; WOLFSSL_OCSP_SINGLERESP singleRespTwo; - WOLFSSL_OCSP_SINGLERESP* ret; XMEMSET(&basicResp, 0, sizeof(WOLFSSL_OCSP_BASICRESP)); XMEMSET(&singleRespOne, 0, sizeof(WOLFSSL_OCSP_SINGLERESP)); @@ -52202,87 +62913,84 @@ basicResp.single = &singleRespOne; singleRespOne.next = &singleRespTwo; - - ret = wolfSSL_OCSP_resp_get0(&basicResp, 0); - AssertPtrEq(ret, &singleRespOne); - - ret = wolfSSL_OCSP_resp_get0(&basicResp, 1); - AssertPtrEq(ret, &singleRespTwo); - - res = TEST_RES_CHECK(1); + ExpectPtrEq(wolfSSL_OCSP_resp_get0(&basicResp, 0), &singleRespOne); + ExpectPtrEq(wolfSSL_OCSP_resp_get0(&basicResp, 1), &singleRespTwo); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_derive(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) || defined(WOLFSSL_OPENSSH) #if (!defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)) || defined(HAVE_ECC) - - EVP_PKEY_CTX *ctx; - unsigned char *skey; + EVP_PKEY_CTX *ctx = NULL; + unsigned char *skey = NULL; size_t skeylen; - EVP_PKEY *pkey, *peerkey; + EVP_PKEY *pkey = NULL; + EVP_PKEY *peerkey = NULL; const unsigned char* key; #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) /* DH */ key = dh_key_der_2048; - AssertNotNull((pkey = d2i_PrivateKey(EVP_PKEY_DH, NULL, &key, - sizeof_dh_key_der_2048))); - AssertIntEQ(DH_generate_key(EVP_PKEY_get0_DH(pkey)), 1); + ExpectNotNull((pkey = d2i_PrivateKey(EVP_PKEY_DH, NULL, &key, + sizeof_dh_key_der_2048))); + ExpectIntEQ(DH_generate_key(EVP_PKEY_get0_DH(pkey)), 1); key = dh_key_der_2048; - AssertNotNull((peerkey = d2i_PrivateKey(EVP_PKEY_DH, NULL, &key, - sizeof_dh_key_der_2048))); - AssertIntEQ(DH_generate_key(EVP_PKEY_get0_DH(peerkey)), 1); - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - AssertIntEQ(EVP_PKEY_derive_init(ctx), 1); - AssertIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); - AssertIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); - AssertNotNull(skey = (unsigned char*)XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); - AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); + ExpectNotNull((peerkey = d2i_PrivateKey(EVP_PKEY_DH, NULL, &key, + sizeof_dh_key_der_2048))); + ExpectIntEQ(DH_generate_key(EVP_PKEY_get0_DH(peerkey)), 1); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectIntEQ(EVP_PKEY_derive_init(ctx), 1); + ExpectIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); + ExpectIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); + ExpectNotNull(skey = (unsigned char*)XMALLOC(skeylen, NULL, + DYNAMIC_TYPE_OPENSSL)); + ExpectIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); EVP_PKEY_CTX_free(ctx); + ctx = NULL; EVP_PKEY_free(peerkey); + peerkey = NULL; EVP_PKEY_free(pkey); + pkey = NULL; XFREE(skey, NULL, DYNAMIC_TYPE_OPENSSL); + skey = NULL; #endif #ifdef HAVE_ECC /* ECDH */ key = ecc_clikey_der_256; - AssertNotNull((pkey = d2i_PrivateKey(EVP_PKEY_EC, NULL, &key, - sizeof_ecc_clikey_der_256))); + ExpectNotNull((pkey = d2i_PrivateKey(EVP_PKEY_EC, NULL, &key, + sizeof_ecc_clikey_der_256))); key = ecc_clikeypub_der_256; - AssertNotNull((peerkey = d2i_PUBKEY(NULL, &key, - sizeof_ecc_clikeypub_der_256))); - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - AssertIntEQ(EVP_PKEY_derive_init(ctx), 1); - AssertIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); - AssertIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); - AssertNotNull(skey = (unsigned char*)XMALLOC(skeylen, NULL, DYNAMIC_TYPE_OPENSSL)); - AssertIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); + ExpectNotNull((peerkey = d2i_PUBKEY(NULL, &key, + sizeof_ecc_clikeypub_der_256))); + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectIntEQ(EVP_PKEY_derive_init(ctx), 1); + ExpectIntEQ(EVP_PKEY_derive_set_peer(ctx, peerkey), 1); + ExpectIntEQ(EVP_PKEY_derive(ctx, NULL, &skeylen), 1); + ExpectNotNull(skey = (unsigned char*)XMALLOC(skeylen, NULL, + DYNAMIC_TYPE_OPENSSL)); + ExpectIntEQ(EVP_PKEY_derive(ctx, skey, &skeylen), 1); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(peerkey); EVP_PKEY_free(pkey); XFREE(skey, NULL, DYNAMIC_TYPE_OPENSSL); #endif /* HAVE_ECC */ - - res = TEST_RES_CHECK(1); #endif /* (!NO_DH && WOLFSSL_DH_EXTRA) || HAVE_ECC */ #endif /* OPENSSL_ALL || WOLFSSL_QT || WOLFSSL_OPENSSH */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PBE_scrypt(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_SCRYPT) && defined(HAVE_PBKDF2) && \ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 5)) #if !defined(NO_PWDBASED) && !defined(NO_SHA256) - int ret; const char pwd[] = {'p','a','s','s','w','o','r','d'}; @@ -52304,82 +63012,78 @@ /* N r p mx key keylen */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 0, 1, 1, 0, key, 64); - AssertIntEQ(ret, 0); /* N must be greater than 1 */ + ExpectIntEQ(ret, 0); /* N must be greater than 1 */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 3, 1, 1, 0, key, 64); - AssertIntEQ(ret, 0); /* N must be power of 2 */ + ExpectIntEQ(ret, 0); /* N must be power of 2 */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, 0, 1, 0, key, 64); - AssertIntEQ(ret, 0); /* r must be greater than 0 */ + ExpectIntEQ(ret, 0); /* r must be greater than 0 */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, 1, 0, 0, key, 64); - AssertIntEQ(ret, 0); /* p must be greater than 0 */ + ExpectIntEQ(ret, 0); /* p must be greater than 0 */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, 1, 1, 0, key, 0); - AssertIntEQ(ret, 0); /* keylen must be greater than 0 */ + ExpectIntEQ(ret, 0); /* keylen must be greater than 0 */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, 9, 1, 0, key, 64); - AssertIntEQ(ret, 0); /* r must be smaller than 9 */ + ExpectIntEQ(ret, 0); /* r must be smaller than 9 */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, 1, 1, 0, NULL, 64); - AssertIntEQ(ret, 1); /* should succeed if key is NULL */ + ExpectIntEQ(ret, 1); /* should succeed if key is NULL */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, 1, 1, 0, key, 64); - AssertIntEQ(ret, 1); /* should succeed */ + ExpectIntEQ(ret, 1); /* should succeed */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, numOvr32, 1, 0, key, 64); - AssertIntEQ(ret, 0); /* should fail since r is greater than INT32_MAC */ + ExpectIntEQ(ret, 0); /* should fail since r is greater than INT32_MAC */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 2, 1, numOvr32, 0, key, 64); - AssertIntEQ(ret, 0); /* should fail since p is greater than INT32_MAC */ + ExpectIntEQ(ret, 0); /* should fail since p is greater than INT32_MAC */ ret = EVP_PBE_scrypt(pwd, pwdlen, NULL, 0, 2, 1, 1, 0, key, 64); - AssertIntEQ(ret, 1); /* should succeed even if salt is NULL */ + ExpectIntEQ(ret, 1); /* should succeed even if salt is NULL */ ret = EVP_PBE_scrypt(pwd, pwdlen, NULL, 4, 2, 1, 1, 0, key, 64); - AssertIntEQ(ret, 0); /* if salt is NULL, saltlen must be 0, otherwise fail*/ + ExpectIntEQ(ret, 0); /* if salt is NULL, saltlen must be 0, otherwise fail*/ ret = EVP_PBE_scrypt(NULL, 0, salt, saltlen, 2, 1, 1, 0, key, 64); - AssertIntEQ(ret, 1); /* should succeed if pwd is NULL and pwdlen is 0*/ + ExpectIntEQ(ret, 1); /* should succeed if pwd is NULL and pwdlen is 0*/ ret = EVP_PBE_scrypt(NULL, 4, salt, saltlen, 2, 1, 1, 0, key, 64); - AssertIntEQ(ret, 0); /* if pwd is NULL, pwdlen must be 0 */ + ExpectIntEQ(ret, 0); /* if pwd is NULL, pwdlen must be 0 */ ret = EVP_PBE_scrypt(NULL, 0, NULL, 0, 2, 1, 1, 0, key, 64); - AssertIntEQ(ret, 1); /* should succeed even both pwd and salt are NULL */ + ExpectIntEQ(ret, 1); /* should succeed even both pwd and salt are NULL */ ret = EVP_PBE_scrypt(pwd, pwdlen, salt, saltlen, 16, 1, 1, 0, key, 64); - AssertIntEQ(ret, 1); + ExpectIntEQ(ret, 1); ret = XMEMCMP(expectedKey, key, sizeof(expectedKey)); - AssertIntEQ(ret, 0); /* derived key must be the same as expected-key */ - - res = TEST_RES_CHECK(1); + ExpectIntEQ(ret, 0); /* derived key must be the same as expected-key */ #endif /* !NO_PWDBASED && !NO_SHA256 */ #endif /* OPENSSL_EXTRA && HAVE_SCRYPT && HAVE_PBKDF2 */ - return res; + return EXPECT_RESULT(); } static int test_no_op_functions(void) { - int res = TEST_SKIPPED; - #if defined(OPENSSL_EXTRA) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) /* this makes sure wolfSSL can compile and run these no-op functions */ SSL_load_error_strings(); ENGINE_load_builtin_engines(); OpenSSL_add_all_ciphers(); - AssertIntEQ(CRYPTO_malloc_init(), 0); - - res = TEST_RES_CHECK(1); - #endif - return res; + ExpectIntEQ(CRYPTO_malloc_init(), 0); +#endif + return EXPECT_RESULT(); } static int test_wolfSSL_CRYPTO_memcmp(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_EXTRA char a[] = "wolfSSL (formerly CyaSSL) is a small, fast, portable " "implementation of TLS/SSL for embedded devices to the cloud."; @@ -52388,12 +63092,10 @@ char c[] = "wolfSSL (formerly CyaSSL) is a small, fast, portable " "implementation of TLS/SSL for embedded devices to the cloud!"; - AssertIntEQ(CRYPTO_memcmp(a, b, sizeof(a)), 0); - AssertIntNE(CRYPTO_memcmp(a, c, sizeof(a)), 0); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(CRYPTO_memcmp(a, b, sizeof(a)), 0); + ExpectIntNE(CRYPTO_memcmp(a, c, sizeof(a)), 0); #endif - return res; + return EXPECT_RESULT(); } /*----------------------------------------------------------------------------* @@ -52402,7 +63104,7 @@ static int test_wc_CreateEncryptedPKCS8Key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_PKCS8) && !defined(NO_PWDBASED) && defined(WOLFSSL_AES_256) \ && !defined(NO_AES_CBC) && !defined(NO_RSA) && !defined(NO_SHA) WC_RNG rng; @@ -52413,170 +63115,164 @@ word32 passwordSz = (word32)XSTRLEN(password); word32 tradIdx = 0; - AssertIntEQ(wc_InitRng(&rng), 0); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + ExpectIntEQ(wc_InitRng(&rng), 0); + PRIVATE_KEY_UNLOCK(); /* Call with NULL for out buffer to get necessary length. */ - AssertIntEQ(wc_CreateEncryptedPKCS8Key((byte*)server_key_der_2048, - sizeof_server_key_der_2048, NULL, &encKeySz, password, passwordSz, + ExpectIntEQ(wc_CreateEncryptedPKCS8Key((byte*)server_key_der_2048, + sizeof_server_key_der_2048, NULL, &encKeySz, password, (int)passwordSz, PKCS5, PBES2, AES256CBCb, NULL, 0, WC_PKCS12_ITT_DEFAULT, &rng, NULL), LENGTH_ONLY_E); - AssertNotNull(encKey = (byte*)XMALLOC(encKeySz, HEAP_HINT, + ExpectNotNull(encKey = (byte*)XMALLOC(encKeySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); /* Call with the allocated out buffer. */ - AssertIntGT(wc_CreateEncryptedPKCS8Key((byte*)server_key_der_2048, - sizeof_server_key_der_2048, encKey, &encKeySz, password, passwordSz, + ExpectIntGT(wc_CreateEncryptedPKCS8Key((byte*)server_key_der_2048, + sizeof_server_key_der_2048, encKey, &encKeySz, password, (int)passwordSz, PKCS5, PBES2, AES256CBCb, NULL, 0, WC_PKCS12_ITT_DEFAULT, &rng, NULL), 0); /* Decrypt the encrypted PKCS8 key we just made. */ - AssertIntGT((decKeySz = wc_DecryptPKCS8Key(encKey, encKeySz, password, - passwordSz)), 0); + ExpectIntGT((decKeySz = (word32)wc_DecryptPKCS8Key(encKey, encKeySz, password, + (int)passwordSz)), 0); /* encKey now holds the decrypted key (decrypted in place). */ - AssertIntGT(wc_GetPkcs8TraditionalOffset(encKey, &tradIdx, decKeySz), 0); + ExpectIntGT(wc_GetPkcs8TraditionalOffset(encKey, &tradIdx, decKeySz), 0); /* Check that the decrypted key matches the key prior to encryption. */ - AssertIntEQ(XMEMCMP(encKey + tradIdx, server_key_der_2048, + ExpectIntEQ(XMEMCMP(encKey + tradIdx, server_key_der_2048, sizeof_server_key_der_2048), 0); + PRIVATE_KEY_LOCK(); - if (encKey != NULL) - XFREE(encKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(encKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); wc_FreeRng(&rng); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_GetPkcs8TraditionalOffset(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_FILESYSTEM) && defined(HAVE_PKCS8) - int length, derSz; + int length; + int derSz = 0; word32 inOutIdx; const char* path = "./certs/server-keyPkcs8.der"; - XFILE file; + XFILE file = XBADFILE; byte der[2048]; - file = XFOPEN(path, "rb"); - AssertTrue(file != XBADFILE); - derSz = (int)XFREAD(der, 1, sizeof(der), file); - XFCLOSE(file); + ExpectTrue((file = XFOPEN(path, "rb")) != XBADFILE); + ExpectIntGT(derSz = (int)XFREAD(der, 1, sizeof(der), file), 0); + if (file != XBADFILE) + XFCLOSE(file); /* valid case */ inOutIdx = 0; - length = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, derSz); - AssertIntGT(length, 0); + ExpectIntGT(length = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, (word32)derSz), + 0); /* inOutIdx > sz */ inOutIdx = 4000; - length = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, derSz); - AssertIntEQ(length, BAD_FUNC_ARG); + ExpectIntEQ(length = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, (word32)derSz), + BAD_FUNC_ARG); /* null input */ inOutIdx = 0; - length = wc_GetPkcs8TraditionalOffset(NULL, &inOutIdx, 0); - AssertIntEQ(length, BAD_FUNC_ARG); + ExpectIntEQ(length = wc_GetPkcs8TraditionalOffset(NULL, &inOutIdx, 0), + BAD_FUNC_ARG); /* invalid input, fill buffer with 1's */ XMEMSET(der, 1, sizeof(der)); inOutIdx = 0; - length = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, derSz); - AssertIntEQ(length, ASN_PARSE_E); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(length = wc_GetPkcs8TraditionalOffset(der, &inOutIdx, (word32)derSz), + ASN_PARSE_E); #endif /* NO_ASN */ - return res; + return EXPECT_RESULT(); } static int test_wc_SetSubjectRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT) && !defined(NO_RSA) const char* joiCertFile = "./certs/test/cert-ext-joi.der"; - WOLFSSL_X509* x509; + WOLFSSL_X509* x509 = NULL; int peerCertSz; - const byte* peerCertBuf; + const byte* peerCertBuf = NULL; Cert forgedCert; - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(joiCertFile, WOLFSSL_FILETYPE_ASN1)); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(joiCertFile, + WOLFSSL_FILETYPE_ASN1)); - AssertNotNull(peerCertBuf = wolfSSL_X509_get_der(x509, &peerCertSz)); + ExpectNotNull(peerCertBuf = wolfSSL_X509_get_der(x509, &peerCertSz)); - AssertIntEQ(0, wc_InitCert(&forgedCert)); + ExpectIntEQ(0, wc_InitCert(&forgedCert)); - AssertIntEQ(0, wc_SetSubjectRaw(&forgedCert, peerCertBuf, peerCertSz)); + ExpectIntEQ(0, wc_SetSubjectRaw(&forgedCert, peerCertBuf, peerCertSz)); wolfSSL_FreeX509(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_GetSubjectRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT) Cert cert; byte *subjectRaw; - AssertIntEQ(0, wc_InitCert(&cert)); - AssertIntEQ(0, wc_GetSubjectRaw(&subjectRaw, &cert)); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(0, wc_InitCert(&cert)); + ExpectIntEQ(0, wc_GetSubjectRaw(&subjectRaw, &cert)); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_SetIssuerRaw(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT) && !defined(NO_RSA) const char* joiCertFile = "./certs/test/cert-ext-joi.der"; - WOLFSSL_X509* x509; + WOLFSSL_X509* x509 = NULL; int peerCertSz; const byte* peerCertBuf; Cert forgedCert; - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(joiCertFile, WOLFSSL_FILETYPE_ASN1)); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(joiCertFile, + WOLFSSL_FILETYPE_ASN1)); - AssertNotNull(peerCertBuf = wolfSSL_X509_get_der(x509, &peerCertSz)); + ExpectNotNull(peerCertBuf = wolfSSL_X509_get_der(x509, &peerCertSz)); - AssertIntEQ(0, wc_InitCert(&forgedCert)); + ExpectIntEQ(0, wc_InitCert(&forgedCert)); - AssertIntEQ(0, wc_SetIssuerRaw(&forgedCert, peerCertBuf, peerCertSz)); + ExpectIntEQ(0, wc_SetIssuerRaw(&forgedCert, peerCertBuf, peerCertSz)); wolfSSL_FreeX509(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_SetIssueBuffer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT) && !defined(NO_RSA) const char* joiCertFile = "./certs/test/cert-ext-joi.der"; - WOLFSSL_X509* x509; + WOLFSSL_X509* x509 = NULL; int peerCertSz; const byte* peerCertBuf; Cert forgedCert; - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(joiCertFile, WOLFSSL_FILETYPE_ASN1)); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(joiCertFile, + WOLFSSL_FILETYPE_ASN1)); - AssertNotNull(peerCertBuf = wolfSSL_X509_get_der(x509, &peerCertSz)); + ExpectNotNull(peerCertBuf = wolfSSL_X509_get_der(x509, &peerCertSz)); - AssertIntEQ(0, wc_InitCert(&forgedCert)); + ExpectIntEQ(0, wc_InitCert(&forgedCert)); - AssertIntEQ(0, wc_SetIssuerBuffer(&forgedCert, peerCertBuf, peerCertSz)); + ExpectIntEQ(0, wc_SetIssuerBuffer(&forgedCert, peerCertBuf, peerCertSz)); wolfSSL_FreeX509(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* @@ -52584,21 +63280,19 @@ */ static int test_wc_SetSubjectKeyId(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT) && defined(HAVE_ECC) Cert cert; const char* file = "certs/ecc-client-keyPub.pem"; - AssertIntEQ(0, wc_InitCert(&cert)); - AssertIntEQ(0, wc_SetSubjectKeyId(&cert, file)); + ExpectIntEQ(0, wc_InitCert(&cert)); + ExpectIntEQ(0, wc_SetSubjectKeyId(&cert, file)); - AssertIntEQ(BAD_FUNC_ARG, wc_SetSubjectKeyId(NULL, file)); - AssertIntGT(0, wc_SetSubjectKeyId(&cert, "badfile.name")); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(BAD_FUNC_ARG, wc_SetSubjectKeyId(NULL, file)); + ExpectIntGT(0, wc_SetSubjectKeyId(&cert, "badfile.name")); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_SetSubjectKeyId */ /* @@ -52606,89 +63300,94 @@ */ static int test_wc_SetSubject(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ASN) && !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT) && defined(HAVE_ECC) Cert cert; const char* file = "./certs/ca-ecc-cert.pem"; - AssertIntEQ(0, wc_InitCert(&cert)); - AssertIntEQ(0, wc_SetSubject(&cert, file)); + ExpectIntEQ(0, wc_InitCert(&cert)); + ExpectIntEQ(0, wc_SetSubject(&cert, file)); - AssertIntEQ(BAD_FUNC_ARG, wc_SetSubject(NULL, file)); - AssertIntGT(0, wc_SetSubject(&cert, "badfile.name")); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(BAD_FUNC_ARG, wc_SetSubject(NULL, file)); + ExpectIntGT(0, wc_SetSubject(&cert, "badfile.name")); #endif - return res; + return EXPECT_RESULT(); } /* END test_wc_SetSubject */ static int test_CheckCertSignature(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && defined(WOLFSSL_SMALL_CERT_VERIFY) WOLFSSL_CERT_MANAGER* cm = NULL; #if !defined(NO_FILESYSTEM) && (!defined(NO_RSA) || defined(HAVE_ECC)) - FILE* fp; + XFILE fp = XBADFILE; byte cert[4096]; int certSz; #endif - AssertIntEQ(BAD_FUNC_ARG, CheckCertSignature(NULL, 0, NULL, NULL)); - AssertNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); - AssertIntEQ(BAD_FUNC_ARG, CheckCertSignature(NULL, 0, NULL, cm)); + ExpectIntEQ(BAD_FUNC_ARG, wc_CheckCertSignature(NULL, 0, NULL, NULL)); + ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); + ExpectIntEQ(BAD_FUNC_ARG, wc_CheckCertSignature(NULL, 0, NULL, cm)); #ifndef NO_RSA #ifdef USE_CERT_BUFFERS_1024 - AssertIntEQ(ASN_NO_SIGNER_E, CheckCertSignature(server_cert_der_1024, + ExpectIntEQ(ASN_NO_SIGNER_E, wc_CheckCertSignature(server_cert_der_1024, sizeof_server_cert_der_1024, NULL, cm)); - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCABuffer(cm, + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCABuffer(cm, ca_cert_der_1024, sizeof_ca_cert_der_1024, WOLFSSL_FILETYPE_ASN1)); - AssertIntEQ(0, CheckCertSignature(server_cert_der_1024, + ExpectIntEQ(0, wc_CheckCertSignature(server_cert_der_1024, sizeof_server_cert_der_1024, NULL, cm)); #elif defined(USE_CERT_BUFFERS_2048) - AssertIntEQ(ASN_NO_SIGNER_E, CheckCertSignature(server_cert_der_2048, + ExpectIntEQ(ASN_NO_SIGNER_E, wc_CheckCertSignature(server_cert_der_2048, sizeof_server_cert_der_2048, NULL, cm)); - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCABuffer(cm, + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCABuffer(cm, ca_cert_der_2048, sizeof_ca_cert_der_2048, WOLFSSL_FILETYPE_ASN1)); - AssertIntEQ(0, CheckCertSignature(server_cert_der_2048, + ExpectIntEQ(0, wc_CheckCertSignature(server_cert_der_2048, sizeof_server_cert_der_2048, NULL, cm)); #endif #endif #if defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) - AssertIntEQ(ASN_NO_SIGNER_E, CheckCertSignature(serv_ecc_der_256, + ExpectIntEQ(ASN_NO_SIGNER_E, wc_CheckCertSignature(serv_ecc_der_256, sizeof_serv_ecc_der_256, NULL, cm)); - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCABuffer(cm, + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCABuffer(cm, ca_ecc_cert_der_256, sizeof_ca_ecc_cert_der_256, WOLFSSL_FILETYPE_ASN1)); - AssertIntEQ(0, CheckCertSignature(serv_ecc_der_256, sizeof_serv_ecc_der_256, + ExpectIntEQ(0, wc_CheckCertSignature(serv_ecc_der_256, sizeof_serv_ecc_der_256, NULL, cm)); #endif #if !defined(NO_FILESYSTEM) wolfSSL_CertManagerFree(cm); - AssertNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); + cm = NULL; + ExpectNotNull(cm = wolfSSL_CertManagerNew_ex(NULL)); #ifndef NO_RSA - AssertNotNull(fp = XFOPEN("./certs/server-cert.der", "rb")); - AssertIntGT((certSz = (int)XFREAD(cert, 1, sizeof(cert), fp)), 0); - XFCLOSE(fp); - AssertIntEQ(ASN_NO_SIGNER_E, CheckCertSignature(cert, certSz, NULL, cm)); - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCA(cm, + ExpectTrue((fp = XFOPEN("./certs/server-cert.der", "rb")) != XBADFILE); + ExpectIntGT((certSz = (int)XFREAD(cert, 1, sizeof(cert), fp)), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntEQ(ASN_NO_SIGNER_E, wc_CheckCertSignature(cert, certSz, NULL, cm)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCA(cm, "./certs/ca-cert.pem", NULL)); - AssertIntEQ(0, CheckCertSignature(cert, certSz, NULL, cm)); + ExpectIntEQ(0, wc_CheckCertSignature(cert, certSz, NULL, cm)); #endif #ifdef HAVE_ECC - AssertNotNull(fp = XFOPEN("./certs/server-ecc.der", "rb")); - AssertIntGT((certSz = (int)XFREAD(cert, 1, sizeof(cert), fp)), 0); - XFCLOSE(fp); - AssertIntEQ(ASN_NO_SIGNER_E, CheckCertSignature(cert, certSz, NULL, cm)); - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCA(cm, + ExpectTrue((fp = XFOPEN("./certs/server-ecc.der", "rb")) != XBADFILE); + ExpectIntGT((certSz = (int)XFREAD(cert, 1, sizeof(cert), fp)), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntEQ(ASN_NO_SIGNER_E, wc_CheckCertSignature(cert, certSz, NULL, cm)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CertManagerLoadCA(cm, "./certs/ca-ecc-cert.pem", NULL)); - AssertIntEQ(0, CheckCertSignature(cert, certSz, NULL, cm)); + ExpectIntEQ(0, wc_CheckCertSignature(cert, certSz, NULL, cm)); #endif #endif @@ -52699,32 +63398,28 @@ #endif wolfSSL_CertManagerFree(cm); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wc_ParseCert(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_RSA) DecodedCert decodedCert; const byte* rawCert = client_cert_der_2048; const int rawCertSize = sizeof_client_cert_der_2048; wc_InitDecodedCert(&decodedCert, rawCert, rawCertSize, NULL); - AssertIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0); + ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0); #ifndef IGNORE_NAME_CONSTRAINTS /* check that the subjects emailAddress was not put in the alt name list */ - AssertNotNull(decodedCert.subjectEmail); - AssertNull(decodedCert.altEmailNames); + ExpectNotNull(decodedCert.subjectEmail); + ExpectNull(decodedCert.altEmailNames); #endif wc_FreeDecodedCert(&decodedCert); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* Test wc_ParseCert decoding of various encodings and scenarios ensuring that @@ -52733,7 +63428,7 @@ */ static int test_wc_ParseCert_Error(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_CERTS) && !defined(NO_RSA) && !defined(HAVE_SELFTEST) && \ (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) @@ -52764,18 +63459,16 @@ for (i = 0; i < tSz; i++) { WOLFSSL_MSG_EX("i == %d", i); wc_InitDecodedCert(&decodedCert, t[i].c, t[i].cSz, NULL); - AssertIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), t[i].expRet); + ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), t[i].expRet); wc_FreeDecodedCert(&decodedCert); } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_MakeCertWithPathLen(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) && \ defined(WOLFSSL_CERT_GEN) && defined(HAVE_ECC) const byte expectedPathLen = 7; @@ -52785,19 +63478,27 @@ int derSize = 0; WC_RNG rng; ecc_key key; + int ret; - AssertIntEQ(wc_InitRng(&rng), 0); - AssertIntEQ(wc_ecc_init(&key), 0); - AssertIntEQ(wc_ecc_make_key(&rng, 32, &key), 0); - AssertIntEQ(wc_InitCert(&cert), 0); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&cert, 0, sizeof(Cert)); + XMEMSET(&decodedCert, 0, sizeof(DecodedCert)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_ecc_make_key(&rng, 32, &key), 0); + ExpectIntEQ(wc_InitCert(&cert), 0); (void)XSTRNCPY(cert.subject.country, "US", CTC_NAME_SIZE); (void)XSTRNCPY(cert.subject.state, "state", CTC_NAME_SIZE); (void)XSTRNCPY(cert.subject.locality, "Bozeman", CTC_NAME_SIZE); (void)XSTRNCPY(cert.subject.org, "yourOrgNameHere", CTC_NAME_SIZE); (void)XSTRNCPY(cert.subject.unit, "yourUnitNameHere", CTC_NAME_SIZE); - (void)XSTRNCPY(cert.subject.commonName, "www.yourDomain.com", CTC_NAME_SIZE); - (void)XSTRNCPY(cert.subject.email, "yourEmail@yourDomain.com", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.commonName, "www.yourDomain.com", + CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.email, "yourEmail@yourDomain.com", + CTC_NAME_SIZE); cert.selfSigned = 1; cert.isCA = 1; @@ -52809,22 +63510,145 @@ cert.keyUsage |= KEYUSE_KEY_CERT_SIGN; #endif - AssertIntGE(wc_MakeCert(&cert, der, FOURK_BUF, NULL, &key, &rng), 0); - derSize = wc_SignCert(cert.bodySz, cert.sigType, der, FOURK_BUF, NULL, - &key, &rng); - AssertIntGE(derSize, 0); + ExpectIntGE(wc_MakeCert(&cert, der, FOURK_BUF, NULL, &key, &rng), 0); + ExpectIntGE(derSize = wc_SignCert(cert.bodySz, cert.sigType, der, + FOURK_BUF, NULL, &key, &rng), 0); + + wc_InitDecodedCert(&decodedCert, der, (word32)derSize, NULL); + ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0); + ExpectIntEQ(decodedCert.pathLength, expectedPathLen); - wc_InitDecodedCert(&decodedCert, der, derSize, NULL); - AssertIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0); - AssertIntEQ(decodedCert.pathLength, expectedPathLen); + wc_FreeDecodedCert(&decodedCert); + ret = wc_ecc_free(&key); + ExpectIntEQ(ret, 0); + ret = wc_FreeRng(&rng); + ExpectIntEQ(ret, 0); +#endif + return EXPECT_RESULT(); +} + +static int test_MakeCertWith0Ser(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) && \ + defined(WOLFSSL_CERT_GEN) && defined(HAVE_ECC) && \ + defined(WOLFSSL_ASN_TEMPLATE) + Cert cert; + DecodedCert decodedCert; + byte der[FOURK_BUF]; + int derSize = 0; + WC_RNG rng; + ecc_key key; + int ret; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&cert, 0, sizeof(Cert)); + XMEMSET(&decodedCert, 0, sizeof(DecodedCert)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_ecc_make_key(&rng, 32, &key), 0); + ExpectIntEQ(wc_InitCert(&cert), 0); + + (void)XSTRNCPY(cert.subject.country, "US", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.state, "state", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.locality, "Bozeman", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.org, "yourOrgNameHere", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.unit, "yourUnitNameHere", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.commonName, "www.yourDomain.com", + CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.email, "yourEmail@yourDomain.com", + CTC_NAME_SIZE); + + cert.selfSigned = 1; + cert.isCA = 1; + cert.sigType = CTC_SHA256wECDSA; + +#ifdef WOLFSSL_CERT_EXT + cert.keyUsage |= KEYUSE_KEY_CERT_SIGN; +#endif + + /* set serial number to 0 */ + cert.serialSz = 1; + cert.serial[0] = 0; + + ExpectIntGE(wc_MakeCert(&cert, der, FOURK_BUF, NULL, &key, &rng), 0); + ExpectIntGE(derSize = wc_SignCert(cert.bodySz, cert.sigType, der, + FOURK_BUF, NULL, &key, &rng), 0); + + wc_InitDecodedCert(&decodedCert, der, (word32)derSize, NULL); + +#if !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) + ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), + ASN_PARSE_E); +#else + ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0); +#endif wc_FreeDecodedCert(&decodedCert); - AssertIntEQ(wc_ecc_free(&key), 0); - AssertIntEQ(wc_FreeRng(&rng), 0); + ret = wc_ecc_free(&key); + ExpectIntEQ(ret, 0); + ret = wc_FreeRng(&rng); + ExpectIntEQ(ret, 0); +#endif + return EXPECT_RESULT(); +} - res = TEST_RES_CHECK(1); +static int test_MakeCertWithCaFalse(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_ALLOW_ENCODING_CA_FALSE) && defined(WOLFSSL_CERT_REQ) && \ + !defined(NO_ASN_TIME) && defined(WOLFSSL_CERT_GEN) && defined(HAVE_ECC) + const byte expectedIsCa = 0; + Cert cert; + DecodedCert decodedCert; + byte der[FOURK_BUF]; + int derSize = 0; + WC_RNG rng; + ecc_key key; + int ret; + + XMEMSET(&rng, 0, sizeof(WC_RNG)); + XMEMSET(&key, 0, sizeof(ecc_key)); + XMEMSET(&cert, 0, sizeof(Cert)); + XMEMSET(&decodedCert, 0, sizeof(DecodedCert)); + + ExpectIntEQ(wc_InitRng(&rng), 0); + ExpectIntEQ(wc_ecc_init(&key), 0); + ExpectIntEQ(wc_ecc_make_key(&rng, 32, &key), 0); + ExpectIntEQ(wc_InitCert(&cert), 0); + + (void)XSTRNCPY(cert.subject.country, "US", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.state, "state", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.locality, "Bozeman", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.org, "yourOrgNameHere", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.unit, "yourUnitNameHere", CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.commonName, "www.yourDomain.com", + CTC_NAME_SIZE); + (void)XSTRNCPY(cert.subject.email, "yourEmail@yourDomain.com", + CTC_NAME_SIZE); + + cert.selfSigned = 1; + cert.isCA = expectedIsCa; + cert.isCaSet = 1; + cert.sigType = CTC_SHA256wECDSA; + + ExpectIntGE(wc_MakeCert(&cert, der, FOURK_BUF, NULL, &key, &rng), 0); + ExpectIntGE(derSize = wc_SignCert(cert.bodySz, cert.sigType, der, + FOURK_BUF, NULL, &key, &rng), 0); + + wc_InitDecodedCert(&decodedCert, der, derSize, NULL); + ExpectIntEQ(wc_ParseCert(&decodedCert, CERT_TYPE, NO_VERIFY, NULL), 0); + ExpectIntEQ(decodedCert.isCA, expectedIsCa); + + wc_FreeDecodedCert(&decodedCert); + ret = wc_ecc_free(&key); + ExpectIntEQ(ret, 0); + ret = wc_FreeRng(&rng); + ExpectIntEQ(ret, 0); #endif - return res; + return EXPECT_RESULT(); } /*----------------------------------------------------------------------------* @@ -52833,101 +63657,81 @@ static int test_wc_ecc_get_curve_size_from_name(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_ECC - int ret; - #if !defined(NO_ECC256) && !defined(NO_ECC_SECP) - ret = wc_ecc_get_curve_size_from_name("SECP256R1"); - AssertIntEQ(ret, 32); + ExpectIntEQ(wc_ecc_get_curve_size_from_name("SECP256R1"), 32); #endif - /* invalid case */ - ret = wc_ecc_get_curve_size_from_name("BADCURVE"); - AssertIntEQ(ret, -1); - + ExpectIntEQ(wc_ecc_get_curve_size_from_name("BADCURVE"), -1); /* NULL input */ - ret = wc_ecc_get_curve_size_from_name(NULL); - AssertIntEQ(ret, BAD_FUNC_ARG); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wc_ecc_get_curve_size_from_name(NULL), BAD_FUNC_ARG); #endif /* HAVE_ECC */ - return res; + return EXPECT_RESULT(); } static int test_wc_ecc_get_curve_id_from_name(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_ECC - int id; - #if !defined(NO_ECC256) && !defined(NO_ECC_SECP) - id = wc_ecc_get_curve_id_from_name("SECP256R1"); - AssertIntEQ(id, ECC_SECP256R1); + ExpectIntEQ(wc_ecc_get_curve_id_from_name("SECP256R1"), + ECC_SECP256R1); #endif - /* invalid case */ - id = wc_ecc_get_curve_id_from_name("BADCURVE"); - AssertIntEQ(id, -1); - + ExpectIntEQ(wc_ecc_get_curve_id_from_name("BADCURVE"), -1); /* NULL input */ - id = wc_ecc_get_curve_id_from_name(NULL); - AssertIntEQ(id, BAD_FUNC_ARG); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wc_ecc_get_curve_id_from_name(NULL), BAD_FUNC_ARG); #endif /* HAVE_ECC */ - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && \ !defined(HAVE_SELFTEST) && \ !(defined(HAVE_FIPS) || defined(HAVE_FIPS_VERSION)) - static int test_wc_ecc_get_curve_id_from_dp_params(void) { - int id; + EXPECT_DECLS; #if !defined(NO_ECC256) && !defined(NO_ECC_SECP) - int curve_id; ecc_key* key; - const ecc_set_type* params; + const ecc_set_type* params = NULL; int ret; #endif WOLFSSL_EC_KEY *ecKey = NULL; #if !defined(NO_ECC256) && !defined(NO_ECC_SECP) - id = wc_ecc_get_curve_id_from_name("SECP256R1"); - AssertIntEQ(id, ECC_SECP256R1); + ExpectIntEQ(wc_ecc_get_curve_id_from_name("SECP256R1"), ECC_SECP256R1); + ExpectNotNull(ecKey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - ecKey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - AssertNotNull(ecKey); - - ret = EC_KEY_generate_key(ecKey); + if (EXPECT_SUCCESS()) { + ret = EC_KEY_generate_key(ecKey); + } else + ret = 0; - if (ret == 0) { + if (ret == 1) { /* normal test */ key = (ecc_key*)ecKey->internal; - params = key->dp; + if (key != NULL) { + params = key->dp; + } - curve_id = wc_ecc_get_curve_id_from_dp_params(params); - AssertIntEQ(curve_id, id); + ExpectIntEQ(wc_ecc_get_curve_id_from_dp_params(params), + ECC_SECP256R1); } #endif /* invalid case, NULL input*/ + ExpectIntEQ(wc_ecc_get_curve_id_from_dp_params(NULL), BAD_FUNC_ARG); - id = wc_ecc_get_curve_id_from_dp_params(NULL); - AssertIntEQ(id, BAD_FUNC_ARG); wolfSSL_EC_KEY_free(ecKey); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #endif /* defined(OPENSSL_EXTRA) && defined(HAVE_ECC) */ static int test_wc_ecc_get_curve_id_from_params(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_ECC - int id; - const byte prime[] = { 0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x01, @@ -52988,40 +63792,34 @@ int fieldSize = 256; #if !defined(NO_ECC256) && !defined(NO_ECC_SECP) - id = wc_ecc_get_curve_id_from_params(fieldSize, prime, sizeof(prime), - Af, sizeof(Af), Bf, sizeof(Bf), order, sizeof(order), - Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor); - AssertIntEQ(id, ECC_SECP256R1); + ExpectIntEQ(wc_ecc_get_curve_id_from_params(fieldSize, + prime, sizeof(prime), Af, sizeof(Af), Bf, sizeof(Bf), + order, sizeof(order), Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor), + ECC_SECP256R1); #endif /* invalid case, fieldSize = 0 */ - id = wc_ecc_get_curve_id_from_params(0, prime, sizeof(prime), - Af, sizeof(Af), Bf, sizeof(Bf), order, sizeof(order), - Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor); - AssertIntEQ(id, ECC_CURVE_INVALID); + ExpectIntEQ(wc_ecc_get_curve_id_from_params(0, prime, sizeof(prime), + Af, sizeof(Af), Bf, sizeof(Bf), order, sizeof(order), + Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor), ECC_CURVE_INVALID); /* invalid case, NULL prime */ - id = wc_ecc_get_curve_id_from_params(fieldSize, NULL, sizeof(prime), - Af, sizeof(Af), Bf, sizeof(Bf), order, sizeof(order), - Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor); - AssertIntEQ(id, BAD_FUNC_ARG); + ExpectIntEQ(wc_ecc_get_curve_id_from_params(fieldSize, NULL, sizeof(prime), + Af, sizeof(Af), Bf, sizeof(Bf), order, sizeof(order), + Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor), BAD_FUNC_ARG); /* invalid case, invalid prime */ - id = wc_ecc_get_curve_id_from_params(fieldSize, - primeInvalid, sizeof(primeInvalid), - Af, sizeof(Af), Bf, sizeof(Bf), order, sizeof(order), - Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor); - AssertIntEQ(id, ECC_CURVE_INVALID); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wc_ecc_get_curve_id_from_params(fieldSize, + primeInvalid, sizeof(primeInvalid), + Af, sizeof(Af), Bf, sizeof(Bf), order, sizeof(order), + Gx, sizeof(Gx), Gy, sizeof(Gy), cofactor), ECC_CURVE_INVALID); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_PKEY_encrypt(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) WOLFSSL_RSA* rsa = NULL; WOLFSSL_EVP_PKEY* pkey = NULL; WOLFSSL_EVP_PKEY_CTX* ctx = NULL; @@ -53038,65 +63836,83 @@ byte* outDecTmp = NULL; #endif - AssertNotNull(outEnc = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - XMEMSET(outEnc, 0, rsaKeySz); - AssertNotNull(outDec = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - XMEMSET(outDec, 0, rsaKeySz); - - AssertNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertIntEQ(EVP_PKEY_assign_RSA(pkey, rsa), WOLFSSL_SUCCESS); - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - AssertIntEQ(EVP_PKEY_encrypt_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING), - WOLFSSL_SUCCESS); + ExpectNotNull(outEnc = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (outEnc != NULL) { + XMEMSET(outEnc, 0, rsaKeySz); + } + ExpectNotNull(outDec = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (outDec != NULL) { + XMEMSET(outDec, 0, rsaKeySz); + } + + ExpectNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectIntEQ(EVP_PKEY_assign_RSA(pkey, rsa), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + RSA_free(rsa); + } + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectIntEQ(EVP_PKEY_encrypt_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING), + WOLFSSL_SUCCESS); /* Test pkey references count is decremented. pkey shouldn't be destroyed since ctx uses it.*/ - AssertIntEQ(pkey->ref.count, 2); + ExpectIntEQ(pkey->ref.count, 2); EVP_PKEY_free(pkey); - AssertIntEQ(pkey->ref.count, 1); + ExpectIntEQ(pkey->ref.count, 1); /* Encrypt data */ /* Check that we can get the required output buffer length by passing in a * NULL output buffer. */ - AssertIntEQ(EVP_PKEY_encrypt(ctx, NULL, &outEncLen, + ExpectIntEQ(EVP_PKEY_encrypt(ctx, NULL, &outEncLen, (const unsigned char*)in, inlen), WOLFSSL_SUCCESS); - AssertIntEQ(rsaKeySz, outEncLen); + ExpectIntEQ(rsaKeySz, outEncLen); /* Now do the actual encryption. */ - AssertIntEQ(EVP_PKEY_encrypt(ctx, outEnc, &outEncLen, + ExpectIntEQ(EVP_PKEY_encrypt(ctx, outEnc, &outEncLen, (const unsigned char*)in, inlen), WOLFSSL_SUCCESS); /* Decrypt data */ - AssertIntEQ(EVP_PKEY_decrypt_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_decrypt_init(ctx), WOLFSSL_SUCCESS); /* Check that we can get the required output buffer length by passing in a * NULL output buffer. */ - AssertIntEQ(EVP_PKEY_decrypt(ctx, NULL, &outDecLen, outEnc, outEncLen), + ExpectIntEQ(EVP_PKEY_decrypt(ctx, NULL, &outDecLen, outEnc, outEncLen), WOLFSSL_SUCCESS); - AssertIntEQ(rsaKeySz, outDecLen); + ExpectIntEQ(rsaKeySz, outDecLen); /* Now do the actual decryption. */ - AssertIntEQ(EVP_PKEY_decrypt(ctx, outDec, &outDecLen, outEnc, outEncLen), + ExpectIntEQ(EVP_PKEY_decrypt(ctx, outDec, &outDecLen, outEnc, outEncLen), WOLFSSL_SUCCESS); - AssertIntEQ(XMEMCMP(in, outDec, outDecLen), 0); + ExpectIntEQ(XMEMCMP(in, outDec, outDecLen), 0); #if !defined(HAVE_FIPS) && defined(WC_RSA_NO_PADDING) /* The input length must be the same size as the RSA key.*/ - AssertNotNull(inTmp = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - XMEMSET(inTmp, 9, rsaKeySz); - AssertNotNull(outEncTmp = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - XMEMSET(outEncTmp, 0, rsaKeySz); - AssertNotNull(outDecTmp = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - XMEMSET(outDecTmp, 0, rsaKeySz); - AssertIntEQ(EVP_PKEY_encrypt_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING), - WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_encrypt(ctx, outEncTmp, &outEncLen, inTmp, rsaKeySz), - WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_decrypt_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_decrypt(ctx, outDecTmp, &outDecLen, outEncTmp, outEncLen), - WOLFSSL_SUCCESS); - AssertIntEQ(XMEMCMP(inTmp, outDecTmp, outDecLen), 0); + ExpectNotNull(inTmp = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (inTmp != NULL) { + XMEMSET(inTmp, 9, rsaKeySz); + } + ExpectNotNull(outEncTmp = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (outEncTmp != NULL) { + XMEMSET(outEncTmp, 0, rsaKeySz); + } + ExpectNotNull(outDecTmp = (byte*)XMALLOC(rsaKeySz, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER)); + if (outDecTmp != NULL) { + XMEMSET(outDecTmp, 0, rsaKeySz); + } + ExpectIntEQ(EVP_PKEY_encrypt_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_encrypt(ctx, outEncTmp, &outEncLen, inTmp, rsaKeySz), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_decrypt_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_decrypt(ctx, outDecTmp, &outDecLen, outEncTmp, + outEncLen), WOLFSSL_SUCCESS); + ExpectIntEQ(XMEMCMP(inTmp, outDecTmp, outDecLen), 0); #endif EVP_PKEY_CTX_free(ctx); XFREE(outEnc, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -53106,18 +63922,52 @@ XFREE(outEncTmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(outDecTmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } -static int test_wolfSSL_EVP_PKEY_sign_verify(void) + +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ + !defined(HAVE_SELFTEST) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) + #ifndef TEST_WOLFSSL_EVP_PKEY_SIGN_VERIFY + #define TEST_WOLFSSL_EVP_PKEY_SIGN_VERIFY + #endif +#endif +#endif +#if defined(OPENSSL_EXTRA) +#if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) + #ifndef TEST_WOLFSSL_EVP_PKEY_SIGN_VERIFY + #define TEST_WOLFSSL_EVP_PKEY_SIGN_VERIFY + #endif +#endif +#endif +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) + #ifndef TEST_WOLFSSL_EVP_PKEY_SIGN_VERIFY + #define TEST_WOLFSSL_EVP_PKEY_SIGN_VERIFY + #endif +#endif +#endif + +#ifdef TEST_WOLFSSL_EVP_PKEY_SIGN_VERIFY +static int test_wolfSSL_EVP_PKEY_sign_verify(int keyType) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ + !defined(HAVE_SELFTEST) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) + WOLFSSL_RSA* rsa = NULL; +#endif +#endif #if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) WOLFSSL_DSA* dsa = NULL; #endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */ +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) + WOLFSSL_EC_KEY* ecKey = NULL; +#endif +#endif WOLFSSL_EVP_PKEY* pkey = NULL; WOLFSSL_EVP_PKEY_CTX* ctx = NULL; WOLFSSL_EVP_PKEY_CTX* ctx_verify = NULL; @@ -53131,275 +63981,295 @@ size_t siglen; size_t siglenOnlyLen; size_t keySz = 2048/8; /* Bytes */ - int i; - int encs[3] = {0}; - -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - encs[0] = EVP_PKEY_RSA; -#endif -#endif -#if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) - encs[1] = EVP_PKEY_DSA; -#endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */ -#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) -#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - encs[2] = EVP_PKEY_EC; -#endif -#endif - AssertNotNull(sig = + ExpectNotNull(sig = (byte*)XMALLOC(keySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - AssertNotNull(sigVerify = + ExpectNotNull(sigVerify = (byte*)XMALLOC(keySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)); - for (i = 0; i < 3; i++) { - if (encs[i] == 0) - continue; + siglen = keySz; + ExpectNotNull(XMEMSET(sig, 0, keySz)); + ExpectNotNull(XMEMSET(sigVerify, 0, keySz)); - siglen = keySz; - XMEMSET(sig, 0, keySz); - XMEMSET(sigVerify, 0, keySz); - - /* Generate hash */ - SHA256_Init(&c); - SHA256_Update(&c, in, inlen); - SHA256_Final(hash, &c); + /* Generate hash */ + SHA256_Init(&c); + SHA256_Update(&c, in, inlen); + SHA256_Final(hash, &c); #ifdef WOLFSSL_SMALL_STACK_CACHE - /* workaround for small stack cache case */ - wc_Sha256Free((wc_Sha256*)&c); + /* workaround for small stack cache case */ + wc_Sha256Free((wc_Sha256*)&c); #endif - /* Generate key */ - AssertNotNull(pkey = EVP_PKEY_new()); - switch (encs[i]) { - case EVP_PKEY_RSA: + /* Generate key */ + ExpectNotNull(pkey = EVP_PKEY_new()); + switch (keyType) { + case EVP_PKEY_RSA: #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) + !defined(HAVE_SELFTEST) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - { - WOLFSSL_RSA* rsa = NULL; - AssertNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); - AssertIntEQ(EVP_PKEY_assign_RSA(pkey, rsa), WOLFSSL_SUCCESS); - } + { + ExpectNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); + ExpectIntEQ(EVP_PKEY_assign_RSA(pkey, rsa), WOLFSSL_SUCCESS); + } #endif #endif - break; - case EVP_PKEY_DSA: + break; + case EVP_PKEY_DSA: #if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) - AssertNotNull(dsa = DSA_new()); - AssertIntEQ(DSA_generate_parameters_ex(dsa, 2048, - NULL, 0, NULL, NULL, NULL), 1); - AssertIntEQ(DSA_generate_key(dsa), 1); - AssertIntEQ(EVP_PKEY_set1_DSA(pkey, dsa), WOLFSSL_SUCCESS); + ExpectNotNull(dsa = DSA_new()); + ExpectIntEQ(DSA_generate_parameters_ex(dsa, 2048, + NULL, 0, NULL, NULL, NULL), 1); + ExpectIntEQ(DSA_generate_key(dsa), 1); + ExpectIntEQ(EVP_PKEY_set1_DSA(pkey, dsa), WOLFSSL_SUCCESS); #endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */ - break; - case EVP_PKEY_EC: + break; + case EVP_PKEY_EC: #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - { - WOLFSSL_EC_KEY* ecKey = NULL; - AssertNotNull(ecKey = EC_KEY_new()); - AssertIntEQ(EC_KEY_generate_key(ecKey), 1); - AssertIntEQ( - EVP_PKEY_assign_EC_KEY(pkey, ecKey), WOLFSSL_SUCCESS); + { + ExpectNotNull(ecKey = EC_KEY_new()); + ExpectIntEQ(EC_KEY_generate_key(ecKey), 1); + ExpectIntEQ( + EVP_PKEY_assign_EC_KEY(pkey, ecKey), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + EC_KEY_free(ecKey); } + } #endif #endif - break; - } - AssertNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); - AssertIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); + break; + } + ExpectNotNull(ctx = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) + !defined(HAVE_SELFTEST) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - if (encs[i] == EVP_PKEY_RSA) - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING), - WOLFSSL_SUCCESS); + if (keyType == EVP_PKEY_RSA) + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING), + WOLFSSL_SUCCESS); #endif #endif - /* Check returning only length */ - AssertIntEQ(EVP_PKEY_sign(ctx, NULL, &siglenOnlyLen, hash, - SHA256_DIGEST_LENGTH), WOLFSSL_SUCCESS); - AssertIntGT(siglenOnlyLen, 0); - /* Sign data */ - AssertIntEQ(EVP_PKEY_sign(ctx, sig, &siglen, hash, - SHA256_DIGEST_LENGTH), WOLFSSL_SUCCESS); - AssertIntGE(siglenOnlyLen, siglen); - - /* Verify signature */ - AssertNotNull(ctx_verify = EVP_PKEY_CTX_new(pkey, NULL)); - AssertIntEQ(EVP_PKEY_verify_init(ctx_verify), WOLFSSL_SUCCESS); + /* Check returning only length */ + ExpectIntEQ(EVP_PKEY_sign(ctx, NULL, &siglenOnlyLen, hash, + SHA256_DIGEST_LENGTH), WOLFSSL_SUCCESS); + ExpectIntGT(siglenOnlyLen, 0); + /* Sign data */ + ExpectIntEQ(EVP_PKEY_sign(ctx, sig, &siglen, hash, + SHA256_DIGEST_LENGTH), WOLFSSL_SUCCESS); + ExpectIntGE(siglenOnlyLen, siglen); + + /* Verify signature */ + ExpectNotNull(ctx_verify = EVP_PKEY_CTX_new(pkey, NULL)); + ExpectIntEQ(EVP_PKEY_verify_init(ctx_verify), WOLFSSL_SUCCESS); #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) + !defined(HAVE_SELFTEST) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - if (encs[i] == EVP_PKEY_RSA) - AssertIntEQ( - EVP_PKEY_CTX_set_rsa_padding(ctx_verify, RSA_PKCS1_PADDING), - WOLFSSL_SUCCESS); + if (keyType == EVP_PKEY_RSA) + ExpectIntEQ( + EVP_PKEY_CTX_set_rsa_padding(ctx_verify, RSA_PKCS1_PADDING), + WOLFSSL_SUCCESS); #endif #endif - AssertIntEQ(EVP_PKEY_verify( - ctx_verify, sig, siglen, hash, SHA256_DIGEST_LENGTH), - WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_verify( - ctx_verify, sig, siglen, zero, SHA256_DIGEST_LENGTH), - WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_verify( + ctx_verify, sig, siglen, hash, SHA256_DIGEST_LENGTH), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_verify( + ctx_verify, sig, siglen, zero, SHA256_DIGEST_LENGTH), + WOLFSSL_FAILURE); #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) && !defined(HAVE_SELFTEST) + !defined(HAVE_SELFTEST) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - if (encs[i] == EVP_PKEY_RSA) { - #if defined(WC_RSA_NO_PADDING) || defined(WC_RSA_DIRECT) - /* Try RSA sign/verify with no padding. */ - AssertIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING), - WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_sign(ctx, sigVerify, &siglen, sig, - siglen), WOLFSSL_SUCCESS); - AssertIntGE(siglenOnlyLen, siglen); - AssertIntEQ(EVP_PKEY_verify_init(ctx_verify), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx_verify, - RSA_NO_PADDING), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_verify(ctx_verify, sigVerify, siglen, sig, - siglen), WOLFSSL_SUCCESS); - #endif - - /* Wrong padding schemes. */ - AssertIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, - RSA_PKCS1_OAEP_PADDING), WOLFSSL_SUCCESS); - AssertIntNE(EVP_PKEY_sign(ctx, sigVerify, &siglen, sig, - siglen), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_verify_init(ctx_verify), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx_verify, - RSA_PKCS1_OAEP_PADDING), WOLFSSL_SUCCESS); - AssertIntNE(EVP_PKEY_verify(ctx_verify, sigVerify, siglen, sig, - siglen), WOLFSSL_SUCCESS); + if (keyType == EVP_PKEY_RSA) { + #if defined(WC_RSA_NO_PADDING) || defined(WC_RSA_DIRECT) + /* Try RSA sign/verify with no padding. */ + ExpectIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_sign(ctx, sigVerify, &siglen, sig, + siglen), WOLFSSL_SUCCESS); + ExpectIntGE(siglenOnlyLen, siglen); + ExpectIntEQ(EVP_PKEY_verify_init(ctx_verify), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx_verify, + RSA_NO_PADDING), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_verify(ctx_verify, sigVerify, siglen, sig, + siglen), WOLFSSL_SUCCESS); + #endif + + /* Wrong padding schemes. */ + ExpectIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, + RSA_PKCS1_OAEP_PADDING), WOLFSSL_SUCCESS); + ExpectIntNE(EVP_PKEY_sign(ctx, sigVerify, &siglen, sig, + siglen), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_verify_init(ctx_verify), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx_verify, + RSA_PKCS1_OAEP_PADDING), WOLFSSL_SUCCESS); + ExpectIntNE(EVP_PKEY_verify(ctx_verify, sigVerify, siglen, sig, + siglen), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING), - WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx_verify, - RSA_PKCS1_PADDING), WOLFSSL_SUCCESS); - } + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_rsa_padding(ctx_verify, + RSA_PKCS1_PADDING), WOLFSSL_SUCCESS); + } #endif #endif - /* error cases */ - siglen = keySz; /* Reset because sig size may vary slightly */ - AssertIntNE(EVP_PKEY_sign_init(NULL), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); - AssertIntNE(EVP_PKEY_sign(NULL, sig, &siglen, (byte*)in, inlen), - WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_sign(ctx, sig, &siglen, (byte*)in, inlen), - WOLFSSL_SUCCESS); + /* error cases */ + siglen = keySz; /* Reset because sig size may vary slightly */ + ExpectIntNE(EVP_PKEY_sign_init(NULL), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_sign_init(ctx), WOLFSSL_SUCCESS); + ExpectIntNE(EVP_PKEY_sign(NULL, sig, &siglen, (byte*)in, inlen), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_sign(ctx, sig, &siglen, (byte*)in, inlen), + WOLFSSL_SUCCESS); - EVP_PKEY_free(pkey); + EVP_PKEY_free(pkey); + pkey = NULL; #if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) - DSA_free(dsa); - dsa = NULL; + DSA_free(dsa); + dsa = NULL; #endif /* !NO_DSA && !HAVE_SELFTEST && WOLFSSL_KEY_GEN */ - EVP_PKEY_CTX_free(ctx_verify); - EVP_PKEY_CTX_free(ctx); - } + EVP_PKEY_CTX_free(ctx_verify); + ctx_verify = NULL; + EVP_PKEY_CTX_free(ctx); + ctx = NULL; XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(sigVerify, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); +} +#endif + +static int test_wolfSSL_EVP_PKEY_sign_verify_rsa(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ + !defined(HAVE_SELFTEST) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) + ExpectIntEQ(test_wolfSSL_EVP_PKEY_sign_verify(EVP_PKEY_RSA), TEST_SUCCESS); +#endif +#endif + return EXPECT_RESULT(); +} +static int test_wolfSSL_EVP_PKEY_sign_verify_dsa(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) +#if !defined (NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN) + ExpectIntEQ(test_wolfSSL_EVP_PKEY_sign_verify(EVP_PKEY_DSA), TEST_SUCCESS); +#endif +#endif + return EXPECT_RESULT(); +} +static int test_wolfSSL_EVP_PKEY_sign_verify_ec(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) +#if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) + ExpectIntEQ(test_wolfSSL_EVP_PKEY_sign_verify(EVP_PKEY_EC), TEST_SUCCESS); +#endif +#endif + return EXPECT_RESULT(); } static int test_EVP_PKEY_rsa(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) - WOLFSSL_RSA* rsa; - WOLFSSL_EVP_PKEY* pkey; + WOLFSSL_RSA* rsa = NULL; + WOLFSSL_EVP_PKEY* pkey = NULL; - AssertNotNull(rsa = wolfSSL_RSA_new()); - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertIntEQ(EVP_PKEY_assign_RSA(NULL, rsa), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_assign_RSA(pkey, NULL), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_assign_RSA(pkey, rsa), WOLFSSL_SUCCESS); - AssertPtrEq(EVP_PKEY_get0_RSA(pkey), rsa); + ExpectNotNull(rsa = wolfSSL_RSA_new()); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectIntEQ(EVP_PKEY_assign_RSA(NULL, rsa), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_assign_RSA(pkey, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_assign_RSA(pkey, rsa), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_RSA_free(rsa); + } + ExpectPtrEq(EVP_PKEY_get0_RSA(pkey), rsa); wolfSSL_EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_EVP_PKEY_ec(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - WOLFSSL_EC_KEY* ecKey; - WOLFSSL_EVP_PKEY* pkey; + WOLFSSL_EC_KEY* ecKey = NULL; + WOLFSSL_EVP_PKEY* pkey = NULL; - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertNotNull(pkey = wolfSSL_EVP_PKEY_new()); - AssertIntEQ(EVP_PKEY_assign_EC_KEY(NULL, ecKey), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_assign_EC_KEY(pkey, NULL), WOLFSSL_FAILURE); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectNotNull(pkey = wolfSSL_EVP_PKEY_new()); + ExpectIntEQ(EVP_PKEY_assign_EC_KEY(NULL, ecKey), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_assign_EC_KEY(pkey, NULL), WOLFSSL_FAILURE); /* Should fail since ecKey is empty */ - AssertIntEQ(EVP_PKEY_assign_EC_KEY(pkey, ecKey), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); - AssertIntEQ(EVP_PKEY_assign_EC_KEY(pkey, ecKey), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_assign_EC_KEY(pkey, ecKey), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); + ExpectIntEQ(EVP_PKEY_assign_EC_KEY(pkey, ecKey), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + wolfSSL_EC_KEY_free(ecKey); + } wolfSSL_EVP_PKEY_free(pkey); - - res = TEST_RES_CHECK(1); #endif #endif - return res; + return EXPECT_RESULT(); } static int test_EVP_PKEY_cmp(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) - EVP_PKEY *a, *b; + EVP_PKEY *a = NULL; + EVP_PKEY *b = NULL; const unsigned char *in; #if !defined(NO_RSA) && defined(USE_CERT_BUFFERS_2048) in = client_key_der_2048; - AssertNotNull(a = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, + ExpectNotNull(a = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, &in, (long)sizeof_client_key_der_2048)); in = client_key_der_2048; - AssertNotNull(b = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, + ExpectNotNull(b = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, &in, (long)sizeof_client_key_der_2048)); /* Test success case RSA */ #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - AssertIntEQ(EVP_PKEY_cmp(a, b), 1); + ExpectIntEQ(EVP_PKEY_cmp(a, b), 1); #else - AssertIntEQ(EVP_PKEY_cmp(a, b), 0); + ExpectIntEQ(EVP_PKEY_cmp(a, b), 0); #endif /* WOLFSSL_ERROR_CODE_OPENSSL */ EVP_PKEY_free(b); + b = NULL; EVP_PKEY_free(a); + a = NULL; #endif #if defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) in = ecc_clikey_der_256; - AssertNotNull(a = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, + ExpectNotNull(a = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, &in, (long)sizeof_ecc_clikey_der_256)); in = ecc_clikey_der_256; - AssertNotNull(b = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, + ExpectNotNull(b = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, &in, (long)sizeof_ecc_clikey_der_256)); /* Test success case ECC */ #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - AssertIntEQ(EVP_PKEY_cmp(a, b), 1); + ExpectIntEQ(EVP_PKEY_cmp(a, b), 1); #else - AssertIntEQ(EVP_PKEY_cmp(a, b), 0); + ExpectIntEQ(EVP_PKEY_cmp(a, b), 0); #endif /* WOLFSSL_ERROR_CODE_OPENSSL */ EVP_PKEY_free(b); + b = NULL; EVP_PKEY_free(a); + a = NULL; #endif /* Test failure cases */ @@ -53407,59 +64277,58 @@ defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) in = client_key_der_2048; - AssertNotNull(a = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, + ExpectNotNull(a = wolfSSL_d2i_PrivateKey(EVP_PKEY_RSA, NULL, &in, (long)sizeof_client_key_der_2048)); in = ecc_clikey_der_256; - AssertNotNull(b = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, + ExpectNotNull(b = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, &in, (long)sizeof_ecc_clikey_der_256)); #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - AssertIntEQ(EVP_PKEY_cmp(a, b), -1); + ExpectIntEQ(EVP_PKEY_cmp(a, b), -1); #else - AssertIntNE(EVP_PKEY_cmp(a, b), 0); + ExpectIntNE(EVP_PKEY_cmp(a, b), 0); #endif /* WOLFSSL_ERROR_CODE_OPENSSL */ EVP_PKEY_free(b); + b = NULL; EVP_PKEY_free(a); + a = NULL; #endif /* invalid or empty failure cases */ a = EVP_PKEY_new(); b = EVP_PKEY_new(); #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - AssertIntEQ(EVP_PKEY_cmp(NULL, NULL), 0); - AssertIntEQ(EVP_PKEY_cmp(a, NULL), 0); - AssertIntEQ(EVP_PKEY_cmp(NULL, b), 0); + ExpectIntEQ(EVP_PKEY_cmp(NULL, NULL), 0); + ExpectIntEQ(EVP_PKEY_cmp(a, NULL), 0); + ExpectIntEQ(EVP_PKEY_cmp(NULL, b), 0); #ifdef NO_RSA /* Type check will fail since RSA is the default EVP key type */ - AssertIntEQ(EVP_PKEY_cmp(a, b), -2); + ExpectIntEQ(EVP_PKEY_cmp(a, b), -2); #else - AssertIntEQ(EVP_PKEY_cmp(a, b), 0); + ExpectIntEQ(EVP_PKEY_cmp(a, b), 0); #endif #else - AssertIntNE(EVP_PKEY_cmp(NULL, NULL), 0); - AssertIntNE(EVP_PKEY_cmp(a, NULL), 0); - AssertIntNE(EVP_PKEY_cmp(NULL, b), 0); - AssertIntNE(EVP_PKEY_cmp(a, b), 0); + ExpectIntNE(EVP_PKEY_cmp(NULL, NULL), 0); + ExpectIntNE(EVP_PKEY_cmp(a, NULL), 0); + ExpectIntNE(EVP_PKEY_cmp(NULL, b), 0); + ExpectIntNE(EVP_PKEY_cmp(a, b), 0); #endif EVP_PKEY_free(b); EVP_PKEY_free(a); (void)in; - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_ERR_load_crypto_strings(void) { - int res = TEST_SKIPPED; #if defined(OPENSSL_ALL) ERR_load_crypto_strings(); - - res = TEST_RES_CHECK(1); + return TEST_SUCCESS; +#else + return TEST_SKIPPED; #endif - return res; } #if defined(OPENSSL_ALL) && !defined(NO_CERTS) @@ -53471,27 +64340,27 @@ static int test_sk_X509(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) { - STACK_OF(X509)* s; + STACK_OF(X509)* s = NULL; - AssertNotNull(s = sk_X509_new_null()); - AssertIntEQ(sk_X509_num(s), 0); + ExpectNotNull(s = sk_X509_new_null()); + ExpectIntEQ(sk_X509_num(s), 0); sk_X509_pop_free(s, NULL); - AssertNotNull(s = sk_X509_new_null()); - AssertIntEQ(sk_X509_num(s), 0); + ExpectNotNull(s = sk_X509_new_null()); + ExpectIntEQ(sk_X509_num(s), 0); sk_X509_pop_free(s, NULL); - AssertNotNull(s = sk_X509_new_null()); + ExpectNotNull(s = sk_X509_new_null()); sk_X509_push(s, (X509*)1); - AssertIntEQ(sk_X509_num(s), 1); - AssertIntEQ((sk_X509_value(s, 0) == (X509*)1), 1); + ExpectIntEQ(sk_X509_num(s), 1); + ExpectIntEQ((sk_X509_value(s, 0) == (X509*)1), 1); sk_X509_push(s, (X509*)2); - AssertIntEQ(sk_X509_num(s), 2); - AssertIntEQ((sk_X509_value(s, 0) == (X509*)2), 1); - AssertIntEQ((sk_X509_value(s, 1) == (X509*)1), 1); + ExpectIntEQ(sk_X509_num(s), 2); + ExpectIntEQ((sk_X509_value(s, 0) == (X509*)2), 1); + ExpectIntEQ((sk_X509_value(s, 1) == (X509*)1), 1); sk_X509_push(s, (X509*)2); sk_X509_pop_free(s, free_x509); } @@ -53499,22 +64368,24 @@ { /* Push a list of 10 X509s onto stack, then verify that * value(), push(), shift(), and pop() behave as expected. */ - STACK_OF(X509)* s; + STACK_OF(X509)* s = NULL; X509* xList[10]; int i = 0; const int len = (sizeof(xList) / sizeof(xList[0])); - for (i = 0; i < len; ++i) - AssertNotNull(xList[i] = X509_new()); + for (i = 0; i < len; ++i) { + xList[i] = NULL; + ExpectNotNull(xList[i] = X509_new()); + } /* test push, pop, and free */ - AssertNotNull(s = sk_X509_new_null()); + ExpectNotNull(s = sk_X509_new_null()); for (i = 0; i < len; ++i) { sk_X509_push(s, xList[i]); - AssertIntEQ(sk_X509_num(s), i + 1); - AssertIntEQ((sk_X509_value(s, 0) == xList[i]), 1); - AssertIntEQ((sk_X509_value(s, i) == xList[0]), 1); + ExpectIntEQ(sk_X509_num(s), i + 1); + ExpectIntEQ((sk_X509_value(s, 0) == xList[i]), 1); + ExpectIntEQ((sk_X509_value(s, i) == xList[0]), 1); } /* pop returns and removes last pushed on stack, which is index 0 @@ -53524,21 +64395,22 @@ X509 * y = sk_X509_pop(s); X509 * z = xList[len - 1 - i]; - AssertIntEQ((x == y), 1); - AssertIntEQ((x == z), 1); - AssertIntEQ(sk_X509_num(s), len - 1 - i); + ExpectIntEQ((x == y), 1); + ExpectIntEQ((x == z), 1); + ExpectIntEQ(sk_X509_num(s), len - 1 - i); } sk_free(s); + s = NULL; /* test push, shift, and free */ - AssertNotNull(s = sk_X509_new_null()); + ExpectNotNull(s = sk_X509_new_null()); for (i = 0; i < len; ++i) { sk_X509_push(s, xList[i]); - AssertIntEQ(sk_X509_num(s), i + 1); - AssertIntEQ((sk_X509_value(s, 0) == xList[i]), 1); - AssertIntEQ((sk_X509_value(s, i) == xList[0]), 1); + ExpectIntEQ(sk_X509_num(s), i + 1); + ExpectIntEQ((sk_X509_value(s, 0) == xList[i]), 1); + ExpectIntEQ((sk_X509_value(s, i) == xList[0]), 1); } /* shift returns and removes first pushed on stack, which is index i @@ -53548,9 +64420,9 @@ X509 * y = sk_X509_shift(s); X509 * z = xList[i]; - AssertIntEQ((x == y), 1); - AssertIntEQ((x == z), 1); - AssertIntEQ(sk_X509_num(s), len - 1 - i); + ExpectIntEQ((x == y), 1); + ExpectIntEQ((x == z), 1); + ExpectIntEQ(sk_X509_num(s), len - 1 - i); } sk_free(s); @@ -53558,67 +64430,65 @@ for (i = 0; i < len; ++i) X509_free(xList[i]); } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_sk_X509_CRL(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && defined(HAVE_CRL) - X509_CRL* crl; - XFILE fp; - STACK_OF(X509_CRL)* s; + X509_CRL* crl = NULL; + XFILE fp = XBADFILE; + STACK_OF(X509_CRL)* s = NULL; - fp = XFOPEN("./certs/crl/crl.pem", "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL*)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, NULL, NULL)); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/crl/crl.pem", "rb")) != XBADFILE); + ExpectNotNull(crl = (X509_CRL*)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, + NULL, NULL)); + if (fp != XBADFILE) + XFCLOSE(fp); - AssertNotNull(s = sk_X509_CRL_new()); - AssertIntEQ(sk_X509_CRL_num(s), 0); - AssertIntEQ(sk_X509_CRL_push(s, crl), 1); - AssertIntEQ(sk_X509_CRL_num(s), 1); - AssertPtrEq(sk_X509_CRL_value(s, 0), crl); + ExpectNotNull(s = sk_X509_CRL_new()); + ExpectIntEQ(sk_X509_CRL_num(s), 0); + ExpectIntEQ(sk_X509_CRL_push(s, crl), 1); + if (EXPECT_FAIL()) { + X509_CRL_free(crl); + } + ExpectIntEQ(sk_X509_CRL_num(s), 1); + ExpectPtrEq(sk_X509_CRL_value(s, 0), crl); sk_X509_CRL_free(s); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_X509_get_signature_nid(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) - X509* x509; + X509* x509 = NULL; - AssertIntEQ(X509_get_signature_nid(NULL), 0); - AssertNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, - SSL_FILETYPE_PEM)); - AssertIntEQ(X509_get_signature_nid(x509), NID_sha256WithRSAEncryption); + ExpectIntEQ(X509_get_signature_nid(NULL), 0); + ExpectNotNull(x509 = wolfSSL_X509_load_certificate_file(svrCertFile, + SSL_FILETYPE_PEM)); + ExpectIntEQ(X509_get_signature_nid(x509), NID_sha256WithRSAEncryption); X509_free(x509); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_X509_REQ(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) && !defined(NO_BIO) - X509_NAME* name; + X509_NAME* name = NULL; #ifndef NO_RSA - X509_NAME* subject; + X509_NAME* subject = NULL; #endif #if !defined(NO_RSA) || defined(HAVE_ECC) - X509_REQ* req; - EVP_PKEY* priv; - EVP_PKEY* pub; + X509_REQ* req = NULL; + EVP_PKEY* priv = NULL; + EVP_PKEY* pub = NULL; unsigned char* der = NULL; int len; #endif @@ -53638,91 +64508,95 @@ const unsigned char* ecPub = (unsigned char*)ecc_clikeypub_der_256; #endif - AssertNotNull(name = X509_NAME_new()); - AssertIntEQ(X509_NAME_add_entry_by_txt(name, "commonName", MBSTRING_UTF8, - (byte*)"wolfssl.com", 11, 0, 1), - WOLFSSL_SUCCESS); - AssertIntEQ(X509_NAME_add_entry_by_txt(name, "emailAddress", MBSTRING_UTF8, - (byte*)"support@wolfssl.com", 19, -1, - 1), WOLFSSL_SUCCESS); + ExpectNotNull(name = X509_NAME_new()); + ExpectIntEQ(X509_NAME_add_entry_by_txt(name, "commonName", MBSTRING_UTF8, + (byte*)"wolfssl.com", 11, 0, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(X509_NAME_add_entry_by_txt(name, "emailAddress", MBSTRING_UTF8, + (byte*)"support@wolfssl.com", 19, -1, 1), WOLFSSL_SUCCESS); #ifndef NO_RSA - AssertNotNull(priv = d2i_PrivateKey(EVP_PKEY_RSA, NULL, &rsaPriv, - (long)sizeof_client_key_der_2048)); - AssertNotNull(pub = d2i_PUBKEY(NULL, &rsaPub, - (long)sizeof_client_keypub_der_2048)); - AssertNotNull(req = X509_REQ_new()); - AssertIntEQ(X509_REQ_set_subject_name(NULL, name), WOLFSSL_FAILURE); - AssertIntEQ(X509_REQ_set_subject_name(req, NULL), WOLFSSL_FAILURE); - AssertIntEQ(X509_REQ_set_subject_name(req, name), WOLFSSL_SUCCESS); - AssertIntEQ(X509_REQ_set_pubkey(NULL, pub), WOLFSSL_FAILURE); - AssertIntEQ(X509_REQ_set_pubkey(req, NULL), WOLFSSL_FAILURE); - AssertIntEQ(X509_REQ_set_pubkey(req, pub), WOLFSSL_SUCCESS); - AssertIntEQ(X509_REQ_sign(NULL, priv, EVP_sha256()), WOLFSSL_FAILURE); - AssertIntEQ(X509_REQ_sign(req, NULL, EVP_sha256()), WOLFSSL_FAILURE); - AssertIntEQ(X509_REQ_sign(req, priv, NULL), WOLFSSL_FAILURE); - AssertIntEQ(X509_REQ_sign(req, priv, EVP_sha256()), WOLFSSL_SUCCESS); + ExpectNotNull(priv = d2i_PrivateKey(EVP_PKEY_RSA, NULL, &rsaPriv, + (long)sizeof_client_key_der_2048)); + ExpectNotNull(pub = d2i_PUBKEY(NULL, &rsaPub, + (long)sizeof_client_keypub_der_2048)); + ExpectNotNull(req = X509_REQ_new()); + ExpectIntEQ(X509_REQ_set_subject_name(NULL, name), WOLFSSL_FAILURE); + ExpectIntEQ(X509_REQ_set_subject_name(req, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(X509_REQ_set_subject_name(req, name), WOLFSSL_SUCCESS); + ExpectIntEQ(X509_REQ_set_pubkey(NULL, pub), WOLFSSL_FAILURE); + ExpectIntEQ(X509_REQ_set_pubkey(req, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(X509_REQ_set_pubkey(req, pub), WOLFSSL_SUCCESS); + ExpectIntEQ(X509_REQ_sign(NULL, priv, EVP_sha256()), WOLFSSL_FAILURE); + ExpectIntEQ(X509_REQ_sign(req, NULL, EVP_sha256()), WOLFSSL_FAILURE); + ExpectIntEQ(X509_REQ_sign(req, priv, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(X509_REQ_sign(req, priv, EVP_sha256()), WOLFSSL_SUCCESS); len = i2d_X509_REQ(req, &der); DEBUG_WRITE_DER(der, len, "req.der"); #ifdef USE_CERT_BUFFERS_1024 - AssertIntEQ(len, 381); + ExpectIntEQ(len, 381); #else - AssertIntEQ(len, 643); + ExpectIntEQ(len, 643); #endif XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL); der = NULL; mctx = EVP_MD_CTX_new(); - AssertIntEQ(EVP_DigestSignInit(mctx, &pkctx, EVP_sha256(), NULL, priv), WOLFSSL_SUCCESS); - AssertIntEQ(X509_REQ_sign_ctx(req, mctx), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DigestSignInit(mctx, &pkctx, EVP_sha256(), NULL, priv), + WOLFSSL_SUCCESS); + ExpectIntEQ(X509_REQ_sign_ctx(req, mctx), WOLFSSL_SUCCESS); EVP_MD_CTX_free(mctx); + mctx = NULL; X509_REQ_free(NULL); X509_REQ_free(req); + req = NULL; /* Test getting the subject from a newly created X509_REQ */ - AssertNotNull(req = X509_REQ_new()); - AssertNotNull(subject = X509_REQ_get_subject_name(req)); - AssertIntEQ(X509_NAME_add_entry_by_NID(subject, NID_commonName, - MBSTRING_UTF8, (unsigned char*)"www.wolfssl.com", -1, -1, 0), 1); - AssertIntEQ(X509_NAME_add_entry_by_NID(subject, NID_countryName, - MBSTRING_UTF8, (unsigned char*)"US", -1, -1, 0), 1); - AssertIntEQ(X509_NAME_add_entry_by_NID(subject, NID_localityName, - MBSTRING_UTF8, (unsigned char*)"Bozeman", -1, -1, 0), 1); - AssertIntEQ(X509_NAME_add_entry_by_NID(subject, NID_stateOrProvinceName, - MBSTRING_UTF8, (unsigned char*)"Montana", -1, -1, 0), 1); - AssertIntEQ(X509_NAME_add_entry_by_NID(subject, NID_organizationName, - MBSTRING_UTF8, (unsigned char*)"wolfSSL", -1, -1, 0), 1); - AssertIntEQ(X509_NAME_add_entry_by_NID(subject, NID_organizationalUnitName, - MBSTRING_UTF8, (unsigned char*)"Testing", -1, -1, 0), 1); - AssertIntEQ(X509_REQ_set_pubkey(req, pub), WOLFSSL_SUCCESS); - AssertIntEQ(X509_REQ_sign(req, priv, EVP_sha256()), WOLFSSL_SUCCESS); + ExpectNotNull(req = X509_REQ_new()); + ExpectNotNull(subject = X509_REQ_get_subject_name(req)); + ExpectIntEQ(X509_NAME_add_entry_by_NID(subject, NID_commonName, + MBSTRING_UTF8, (unsigned char*)"www.wolfssl.com", -1, -1, 0), 1); + ExpectIntEQ(X509_NAME_add_entry_by_NID(subject, NID_countryName, + MBSTRING_UTF8, (unsigned char*)"US", -1, -1, 0), 1); + ExpectIntEQ(X509_NAME_add_entry_by_NID(subject, NID_localityName, + MBSTRING_UTF8, (unsigned char*)"Bozeman", -1, -1, 0), 1); + ExpectIntEQ(X509_NAME_add_entry_by_NID(subject, NID_stateOrProvinceName, + MBSTRING_UTF8, (unsigned char*)"Montana", -1, -1, 0), 1); + ExpectIntEQ(X509_NAME_add_entry_by_NID(subject, NID_organizationName, + MBSTRING_UTF8, (unsigned char*)"wolfSSL", -1, -1, 0), 1); + ExpectIntEQ(X509_NAME_add_entry_by_NID(subject, NID_organizationalUnitName, + MBSTRING_UTF8, (unsigned char*)"Testing", -1, -1, 0), 1); + ExpectIntEQ(X509_REQ_set_pubkey(req, pub), WOLFSSL_SUCCESS); + ExpectIntEQ(X509_REQ_sign(req, priv, EVP_sha256()), WOLFSSL_SUCCESS); len = i2d_X509_REQ(req, &der); DEBUG_WRITE_DER(der, len, "req2.der"); #ifdef USE_CERT_BUFFERS_1024 - AssertIntEQ(len, 435); + ExpectIntEQ(len, 435); #else - AssertIntEQ(len, 696); + ExpectIntEQ(len, 696); #endif XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL); der = NULL; EVP_PKEY_free(pub); + pub = NULL; EVP_PKEY_free(priv); + priv = NULL; X509_REQ_free(req); + req = NULL; #endif #ifdef HAVE_ECC - AssertNotNull(priv = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, &ecPriv, - sizeof_ecc_clikey_der_256)); - AssertNotNull(pub = wolfSSL_d2i_PUBKEY(NULL, &ecPub, - sizeof_ecc_clikeypub_der_256)); - AssertNotNull(req = X509_REQ_new()); - AssertIntEQ(X509_REQ_set_subject_name(req, name), WOLFSSL_SUCCESS); - AssertIntEQ(X509_REQ_set_pubkey(req, pub), WOLFSSL_SUCCESS); - AssertIntEQ(X509_REQ_sign(req, priv, EVP_sha256()), WOLFSSL_SUCCESS); + ExpectNotNull(priv = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, &ecPriv, + sizeof_ecc_clikey_der_256)); + ExpectNotNull(pub = wolfSSL_d2i_PUBKEY(NULL, &ecPub, + sizeof_ecc_clikeypub_der_256)); + ExpectNotNull(req = X509_REQ_new()); + ExpectIntEQ(X509_REQ_set_subject_name(req, name), WOLFSSL_SUCCESS); + ExpectIntEQ(X509_REQ_set_pubkey(req, pub), WOLFSSL_SUCCESS); + ExpectIntEQ(X509_REQ_sign(req, priv, EVP_sha256()), WOLFSSL_SUCCESS); /* Signature is random and may be shorter or longer. */ - AssertIntGE((len = i2d_X509_REQ(req, &der)), 245); - AssertIntLE(len, 253); + ExpectIntGE((len = i2d_X509_REQ(req, &der)), 245); + ExpectIntLE(len, 253); XFREE(der, NULL, DYNAMIC_TYPE_OPENSSL); X509_REQ_free(req); EVP_PKEY_free(pub); @@ -53734,70 +64608,71 @@ #endif /* HAVE_ECC */ X509_NAME_free(name); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfssl_PKCS7(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) && !defined(NO_BIO) && \ !defined(NO_RSA) - PKCS7* pkcs7; + PKCS7* pkcs7 = NULL; byte data[FOURK_BUF]; word32 len = sizeof(data); const byte* p = data; byte content[] = "Test data to encode."; #if !defined(NO_RSA) & defined(USE_CERT_BUFFERS_2048) - BIO* bio; + BIO* bio = NULL; byte key[sizeof(client_key_der_2048)]; word32 keySz = (word32)sizeof(key); byte* out = NULL; #endif - AssertIntGT((len = CreatePKCS7SignedData(data, len, content, - (word32)sizeof(content), - 0, 0, 0, RSA_TYPE)), 0); - - AssertNull(pkcs7 = d2i_PKCS7(NULL, NULL, len)); - AssertNull(pkcs7 = d2i_PKCS7(NULL, &p, 0)); - AssertNotNull(pkcs7 = d2i_PKCS7(NULL, &p, len)); - AssertIntEQ(wolfSSL_PKCS7_verify(NULL, NULL, NULL, NULL, NULL, - PKCS7_NOVERIFY), WOLFSSL_FAILURE); + ExpectIntGT((len = (word32)CreatePKCS7SignedData(data, (int)len, content, + (word32)sizeof(content), 0, 0, 0, RSA_TYPE)), 0); + + ExpectNull(pkcs7 = d2i_PKCS7(NULL, NULL, (int)len)); + ExpectNull(pkcs7 = d2i_PKCS7(NULL, &p, 0)); + ExpectNotNull(pkcs7 = d2i_PKCS7(NULL, &p, (int)len)); + ExpectIntEQ(wolfSSL_PKCS7_verify(NULL, NULL, NULL, NULL, NULL, + PKCS7_NOVERIFY), WOLFSSL_FAILURE); PKCS7_free(pkcs7); + pkcs7 = NULL; /* fail case, without PKCS7_NOVERIFY */ p = data; - AssertNotNull(pkcs7 = d2i_PKCS7(NULL, &p, len)); - AssertIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, NULL, NULL, - 0), WOLFSSL_FAILURE); + ExpectNotNull(pkcs7 = d2i_PKCS7(NULL, &p, (int)len)); + ExpectIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, NULL, NULL, + 0), WOLFSSL_FAILURE); PKCS7_free(pkcs7); + pkcs7 = NULL; /* success case, with PKCS7_NOVERIFY */ p = data; - AssertNotNull(pkcs7 = d2i_PKCS7(NULL, &p, len)); - AssertIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, NULL, NULL, - PKCS7_NOVERIFY), WOLFSSL_SUCCESS); + ExpectNotNull(pkcs7 = d2i_PKCS7(NULL, &p, (int)len)); + ExpectIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, NULL, NULL, + PKCS7_NOVERIFY), WOLFSSL_SUCCESS); #if !defined(NO_RSA) & defined(USE_CERT_BUFFERS_2048) /* test i2d */ XMEMCPY(key, client_key_der_2048, keySz); - pkcs7->privateKey = key; - pkcs7->privateKeySz = (word32)sizeof(key); - pkcs7->encryptOID = RSAk; -#ifdef NO_SHA - pkcs7->hashOID = SHA256h; -#else - pkcs7->hashOID = SHAh; -#endif - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertIntEQ(i2d_PKCS7_bio(bio, pkcs7), 1); + if (pkcs7 != NULL) { + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + pkcs7->encryptOID = RSAk; + #ifdef NO_SHA + pkcs7->hashOID = SHA256h; + #else + pkcs7->hashOID = SHAh; + #endif + } + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectIntEQ(i2d_PKCS7_bio(bio, pkcs7), 1); #ifndef NO_ASN_TIME - AssertIntEQ(i2d_PKCS7(pkcs7, &out), 655); + ExpectIntEQ(i2d_PKCS7(pkcs7, &out), 655); #else - AssertIntEQ(i2d_PKCS7(pkcs7, &out), 625); + ExpectIntEQ(i2d_PKCS7(pkcs7, &out), 625); #endif XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); BIO_free(bio); @@ -53805,15 +64680,13 @@ PKCS7_free(NULL); PKCS7_free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PKCS7_sign(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) && !defined(NO_BIO) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) @@ -53837,65 +64710,89 @@ EVP_PKEY* signKey = NULL; X509* caCert = NULL; X509_STORE* store = NULL; +#ifndef NO_PKCS7_STREAM + int z; + int ret; +#endif /* !NO_PKCS7_STREAM */ /* read signer cert/key into BIO */ - AssertNotNull(certBio = BIO_new_file(cert, "r")); - AssertNotNull(keyBio = BIO_new_file(key, "r")); - AssertNotNull(signCert = PEM_read_bio_X509(certBio, NULL, 0, NULL)); - AssertNotNull(signKey = PEM_read_bio_PrivateKey(keyBio, NULL, 0, NULL)); + ExpectNotNull(certBio = BIO_new_file(cert, "r")); + ExpectNotNull(keyBio = BIO_new_file(key, "r")); + ExpectNotNull(signCert = PEM_read_bio_X509(certBio, NULL, 0, NULL)); + ExpectNotNull(signKey = PEM_read_bio_PrivateKey(keyBio, NULL, 0, NULL)); /* read CA cert into store (for verify) */ - AssertNotNull(caBio = BIO_new_file(ca, "r")); - AssertNotNull(caCert = PEM_read_bio_X509(caBio, NULL, 0, NULL)); - AssertNotNull(store = X509_STORE_new()); - AssertIntEQ(X509_STORE_add_cert(store, caCert), 1); + ExpectNotNull(caBio = BIO_new_file(ca, "r")); + ExpectNotNull(caCert = PEM_read_bio_X509(caBio, NULL, 0, NULL)); + ExpectNotNull(store = X509_STORE_new()); + ExpectIntEQ(X509_STORE_add_cert(store, caCert), 1); /* data to be signed into BIO */ - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); /* PKCS7_sign, bad args: signer NULL */ - AssertNull(p7 = PKCS7_sign(NULL, signKey, NULL, inBio, 0)); + ExpectNull(p7 = PKCS7_sign(NULL, signKey, NULL, inBio, 0)); /* PKCS7_sign, bad args: signer key NULL */ - AssertNull(p7 = PKCS7_sign(signCert, NULL, NULL, inBio, 0)); + ExpectNull(p7 = PKCS7_sign(signCert, NULL, NULL, inBio, 0)); /* PKCS7_sign, bad args: in data NULL without PKCS7_STREAM */ - AssertNull(p7 = PKCS7_sign(signCert, signKey, NULL, NULL, 0)); + ExpectNull(p7 = PKCS7_sign(signCert, signKey, NULL, NULL, 0)); /* PKCS7_sign, bad args: PKCS7_NOCERTS flag not supported */ - AssertNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, PKCS7_NOCERTS)); + ExpectNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, PKCS7_NOCERTS)); /* PKCS7_sign, bad args: PKCS7_PARTIAL flag not supported */ - AssertNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, PKCS7_PARTIAL)); + ExpectNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, PKCS7_PARTIAL)); /* TEST SUCCESS: Not detached, not streaming, not MIME */ { flags = PKCS7_BINARY; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertIntGT((outLen = i2d_PKCS7(p7, &out)), 0); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectIntGT((outLen = i2d_PKCS7(p7, &out)), 0); /* verify with d2i_PKCS7 */ tmpPtr = out; - AssertNotNull(p7Ver = d2i_PKCS7(NULL, (const byte**)&tmpPtr, outLen)); - AssertIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); + ExpectNotNull(p7Ver = d2i_PKCS7(NULL, (const byte**)&tmpPtr, outLen)); + ExpectIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); PKCS7_free(p7Ver); + p7Ver = NULL; /* verify with wc_PKCS7_VerifySignedData */ - AssertNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); - AssertIntEQ(wc_PKCS7_Init(p7Ver, HEAP_HINT, INVALID_DEVID), 0); - AssertIntEQ(wc_PKCS7_VerifySignedData(p7Ver, out, outLen), 0); + ExpectNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(p7Ver, HEAP_HINT, INVALID_DEVID), 0); + ExpectIntEQ(wc_PKCS7_VerifySignedData(p7Ver, out, (word32)outLen), 0); + + #ifndef NO_PKCS7_STREAM + /* verify with wc_PKCS7_VerifySignedData streaming */ + wc_PKCS7_Free(p7Ver); + p7Ver = NULL; + ExpectNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectIntEQ(wc_PKCS7_Init(p7Ver, HEAP_HINT, INVALID_DEVID), 0); + /* test for streaming */ + ret = -1; + for (z = 0; z < outLen && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(p7Ver, out + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + #endif /* !NO_PKCS7_STREAM */ /* compare the signer found to expected signer */ - AssertIntNE(p7Ver->verifyCertSz, 0); + ExpectIntNE(p7Ver->verifyCertSz, 0); tmpPtr = NULL; - AssertIntEQ(i2d_X509(signCert, &tmpPtr), p7Ver->verifyCertSz); - AssertIntEQ(XMEMCMP(tmpPtr, p7Ver->verifyCert, p7Ver->verifyCertSz), 0); + ExpectIntEQ(i2d_X509(signCert, &tmpPtr), p7Ver->verifyCertSz); + ExpectIntEQ(XMEMCMP(tmpPtr, p7Ver->verifyCert, p7Ver->verifyCertSz), 0); XFREE(tmpPtr, NULL, DYNAMIC_TYPE_OPENSSL); tmpPtr = NULL; wc_PKCS7_Free(p7Ver); + p7Ver = NULL; - AssertNotNull(out); + ExpectNotNull(out); XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); out = NULL; PKCS7_free(p7); + p7 = NULL; } /* TEST SUCCESS: Not detached, streaming, not MIME. Also bad arg @@ -53903,82 +64800,138 @@ { /* re-populate input BIO, may have been consumed */ BIO_free(inBio); - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + inBio = NULL; + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); flags = PKCS7_BINARY | PKCS7_STREAM; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertIntEQ(PKCS7_final(p7, inBio, flags), 1); - AssertIntGT((outLen = i2d_PKCS7(p7, &out)), 0); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectIntEQ(PKCS7_final(p7, inBio, flags), 1); + ExpectIntGT((outLen = i2d_PKCS7(p7, &out)), 0); /* PKCS7_final, bad args: PKCS7 null */ - AssertIntEQ(PKCS7_final(NULL, inBio, 0), 0); + ExpectIntEQ(PKCS7_final(NULL, inBio, 0), 0); /* PKCS7_final, bad args: PKCS7 null */ - AssertIntEQ(PKCS7_final(p7, NULL, 0), 0); + ExpectIntEQ(PKCS7_final(p7, NULL, 0), 0); tmpPtr = out; - AssertNotNull(p7Ver = d2i_PKCS7(NULL, (const byte**)&tmpPtr, outLen)); - AssertIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); + ExpectNotNull(p7Ver = d2i_PKCS7(NULL, (const byte**)&tmpPtr, outLen)); + ExpectIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); PKCS7_free(p7Ver); + p7Ver = NULL; - AssertNotNull(out); + ExpectNotNull(out); XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); out = NULL; PKCS7_free(p7); + p7 = NULL; } /* TEST SUCCESS: Detached, not streaming, not MIME */ { /* re-populate input BIO, may have been consumed */ BIO_free(inBio); - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + inBio = NULL; + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); flags = PKCS7_BINARY | PKCS7_DETACHED; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertIntGT((outLen = i2d_PKCS7(p7, &out)), 0); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectIntGT((outLen = i2d_PKCS7(p7, &out)), 0); /* verify with wolfCrypt, d2i_PKCS7 does not support detached content */ - AssertNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); - p7Ver->content = data; - p7Ver->contentSz = sizeof(data); - AssertIntEQ(wc_PKCS7_VerifySignedData(p7Ver, out, outLen), 0); + ExpectNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); + if (p7Ver != NULL) { + p7Ver->content = data; + p7Ver->contentSz = sizeof(data); + } + ExpectIntEQ(wc_PKCS7_VerifySignedData(p7Ver, out, (word32)outLen), 0); + wc_PKCS7_Free(p7Ver); + p7Ver = NULL; + + #ifndef NO_PKCS7_STREAM + /* verify with wc_PKCS7_VerifySignedData streaming */ + ExpectNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); + if (p7Ver != NULL) { + p7Ver->content = data; + p7Ver->contentSz = sizeof(data); + } + /* test for streaming */ + ret = -1; + for (z = 0; z < outLen && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(p7Ver, out + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); wc_PKCS7_Free(p7Ver); + p7Ver = NULL; + #endif /* !NO_PKCS7_STREAM */ /* verify expected failure (NULL return) from d2i_PKCS7, it does not * yet support detached content */ tmpPtr = out; - AssertNull(p7Ver = d2i_PKCS7(NULL, (const byte**)&tmpPtr, outLen)); + ExpectNull(p7Ver = d2i_PKCS7(NULL, (const byte**)&tmpPtr, outLen)); PKCS7_free(p7Ver); + p7Ver = NULL; - AssertNotNull(out); + ExpectNotNull(out); XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); out = NULL; PKCS7_free(p7); + p7 = NULL; } /* TEST SUCCESS: Detached, streaming, not MIME */ { /* re-populate input BIO, may have been consumed */ BIO_free(inBio); - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + inBio = NULL; + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); flags = PKCS7_BINARY | PKCS7_DETACHED | PKCS7_STREAM; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertIntEQ(PKCS7_final(p7, inBio, flags), 1); - AssertIntGT((outLen = i2d_PKCS7(p7, &out)), 0); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectIntEQ(PKCS7_final(p7, inBio, flags), 1); + ExpectIntGT((outLen = i2d_PKCS7(p7, &out)), 0); /* verify with wolfCrypt, d2i_PKCS7 does not support detached content */ - AssertNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); - p7Ver->content = data; - p7Ver->contentSz = sizeof(data); - AssertIntEQ(wc_PKCS7_VerifySignedData(p7Ver, out, outLen), 0); + ExpectNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); + if (p7Ver != NULL) { + p7Ver->content = data; + p7Ver->contentSz = sizeof(data); + } + ExpectIntEQ(wc_PKCS7_VerifySignedData(p7Ver, out, (word32)outLen), 0); + wc_PKCS7_Free(p7Ver); + p7Ver = NULL; + + ExpectNotNull(out); + + #ifndef NO_PKCS7_STREAM + /* verify with wc_PKCS7_VerifySignedData streaming */ + ExpectNotNull(p7Ver = wc_PKCS7_New(HEAP_HINT, testDevId)); + if (p7Ver != NULL) { + p7Ver->content = data; + p7Ver->contentSz = sizeof(data); + } + /* test for streaming */ + ret = -1; + for (z = 0; z < outLen && ret != 0; z++) { + ret = wc_PKCS7_VerifySignedData(p7Ver, out + z, 1); + if (ret < 0){ + ExpectIntEQ(ret, WC_PKCS7_WANT_READ_E); + } + } + ExpectIntEQ(ret, 0); + ExpectNotNull(out); wc_PKCS7_Free(p7Ver); + p7Ver = NULL; + #endif /* !NO_PKCS7_STREAM */ - AssertNotNull(out); XFREE(out, NULL, DYNAMIC_TYPE_TMP_BUFFER); PKCS7_free(p7); + p7 = NULL; } X509_STORE_free(store); @@ -53989,33 +64942,28 @@ BIO_free(keyBio); BIO_free(certBio); BIO_free(caBio); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PKCS7_SIGNED_new(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) - PKCS7_SIGNED* pkcs7; + PKCS7_SIGNED* pkcs7 = NULL; - pkcs7 = PKCS7_SIGNED_new(); - AssertNotNull(pkcs7); - AssertIntEQ(pkcs7->contentOID, SIGNED_DATA); + ExpectNotNull(pkcs7 = PKCS7_SIGNED_new()); + ExpectIntEQ(pkcs7->contentOID, SIGNED_DATA); PKCS7_SIGNED_free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_PEM_write_bio_PKCS7(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) PKCS7* pkcs7 = NULL; BIO* bio = NULL; @@ -54048,19 +64996,27 @@ #else unsigned char cert[ONEK_BUF]; unsigned char key[ONEK_BUF]; - XFILE fp; + XFILE fp = XBADFILE; int certSz; int keySz; - fp = XFOPEN("./certs/1024/client-cert.der", "rb"); - AssertTrue((fp != XBADFILE)); - certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_client_cert_der_1024, + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/1024/client-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/1024/client-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, sizeof_client_key_der_1024, fp), + 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } #endif #elif defined(HAVE_ECC) #if defined(USE_CERT_BUFFERS_256) @@ -54075,66 +65031,76 @@ #else unsigned char cert[ONEK_BUF]; unsigned char key[ONEK_BUF]; - XFILE fp; + XFILE fp = XBADFILE; int certSz, keySz; - fp = XFOPEN("./certs/client-ecc-cert.der", "rb"); - AssertTrue(fp != XBADFILE); - certSz = (int)XFREAD(cert, 1, sizeof_cliecc_cert_der_256, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-cert.der", "rb")) != + XBADFILE); + ExpectIntGT(certSz = (int)XFREAD(cert, 1, sizeof_cliecc_cert_der_256, + fp), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - fp = XFOPEN("./certs/client-ecc-key.der", "rb"); - AssertTrue(fp != XBADFILE); - keySz = (int)XFREAD(key, 1, sizeof_ecc_clikey_der_256, fp); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/client-ecc-key.der", "rb")) != + XBADFILE); + ExpectIntGT(keySz = (int)XFREAD(key, 1, sizeof_ecc_clikey_der_256, fp), + 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } #endif #else #error PKCS7 requires ECC or RSA #endif - AssertNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); + ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId)); /* initialize with DER encoded cert */ - AssertIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)cert, (word32)certSz), 0); + ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)cert, (word32)certSz), 0); /* init rng */ - AssertIntEQ(wc_InitRng(&rng), 0); + XMEMSET(&rng, 0, sizeof(WC_RNG)); + ExpectIntEQ(wc_InitRng(&rng), 0); - pkcs7->rng = &rng; - pkcs7->content = (byte*)data; /* not used for ex */ - pkcs7->contentSz = (word32)sizeof(data); - pkcs7->contentOID = SIGNED_DATA; - pkcs7->privateKey = key; - pkcs7->privateKeySz = (word32)sizeof(key); - pkcs7->encryptOID = RSAk; -#ifdef NO_SHA - pkcs7->hashOID = SHA256h; -#else - pkcs7->hashOID = SHAh; -#endif - pkcs7->signedAttribs = NULL; - pkcs7->signedAttribsSz = 0; + if (pkcs7 != NULL) { + pkcs7->rng = &rng; + pkcs7->content = (byte*)data; /* not used for ex */ + pkcs7->contentSz = (word32)sizeof(data); + pkcs7->contentOID = SIGNED_DATA; + pkcs7->privateKey = key; + pkcs7->privateKeySz = (word32)sizeof(key); + pkcs7->encryptOID = RSAk; + #ifdef NO_SHA + pkcs7->hashOID = SHA256h; + #else + pkcs7->hashOID = SHAh; + #endif + pkcs7->signedAttribs = NULL; + pkcs7->signedAttribsSz = 0; + } - AssertNotNull(bio = BIO_new(BIO_s_mem())); + ExpectNotNull(bio = BIO_new(BIO_s_mem())); /* Write PKCS#7 PEM to BIO, the function converts the DER to PEM cert*/ - AssertIntEQ(PEM_write_bio_PKCS7(bio, pkcs7), WOLFSSL_SUCCESS); + ExpectIntEQ(PEM_write_bio_PKCS7(bio, pkcs7), WOLFSSL_SUCCESS); /* Read PKCS#7 PEM from BIO */ ret = wolfSSL_BIO_get_mem_data(bio, &cert_buf); - AssertIntGE(ret, 0); + ExpectIntGE(ret, 0); BIO_free(bio); wc_PKCS7_Free(pkcs7); wc_FreeRng(&rng); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #ifdef HAVE_SMIME +/* // NOLINTBEGIN(clang-analyzer-unix.Stream) */ static int test_wolfSSL_SMIME_read_PKCS7(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) PKCS7* pkcs7 = NULL; @@ -54144,80 +65110,106 @@ const byte* outBuf = NULL; int outBufLen = 0; static const char contTypeText[] = "Content-Type: text/plain\r\n\r\n"; - XFILE smimeTestFile = XFOPEN("./certs/test/smime-test.p7s", "r"); + XFILE smimeTestFile = XBADFILE; + + ExpectTrue((smimeTestFile = XFOPEN("./certs/test/smime-test.p7s", "r")) != + XBADFILE); /* smime-test.p7s */ bio = wolfSSL_BIO_new(wolfSSL_BIO_s_file()); - AssertNotNull(bio); - AssertIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); + ExpectNotNull(bio); + ExpectIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); pkcs7 = wolfSSL_SMIME_read_PKCS7(bio, &bcont); - AssertNotNull(pkcs7); - AssertIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, - PKCS7_NOVERIFY), SSL_SUCCESS); - XFCLOSE(smimeTestFile); + ExpectNotNull(pkcs7); + ExpectIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, + PKCS7_NOVERIFY), SSL_SUCCESS); + if (smimeTestFile != XBADFILE) { + XFCLOSE(smimeTestFile); + smimeTestFile = XBADFILE; + } if (bcont) BIO_free(bcont); + bcont = NULL; wolfSSL_PKCS7_free(pkcs7); + pkcs7 = NULL; /* smime-test-multipart.p7s */ smimeTestFile = XFOPEN("./certs/test/smime-test-multipart.p7s", "r"); - AssertIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); + ExpectFalse(smimeTestFile == XBADFILE); + ExpectIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); pkcs7 = wolfSSL_SMIME_read_PKCS7(bio, &bcont); - AssertNotNull(pkcs7); - AssertIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, - PKCS7_NOVERIFY), SSL_SUCCESS); - XFCLOSE(smimeTestFile); + ExpectNotNull(pkcs7); + ExpectIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, + PKCS7_NOVERIFY), SSL_SUCCESS); + if (smimeTestFile != XBADFILE) { + XFCLOSE(smimeTestFile); + smimeTestFile = XBADFILE; + } if (bcont) BIO_free(bcont); + bcont = NULL; wolfSSL_PKCS7_free(pkcs7); + pkcs7 = NULL; /* smime-test-multipart-badsig.p7s */ smimeTestFile = XFOPEN("./certs/test/smime-test-multipart-badsig.p7s", "r"); - AssertIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); + ExpectFalse(smimeTestFile == XBADFILE); + ExpectIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); pkcs7 = wolfSSL_SMIME_read_PKCS7(bio, &bcont); - AssertNull(pkcs7); - AssertIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, - PKCS7_NOVERIFY), SSL_FAILURE); - XFCLOSE(smimeTestFile); + ExpectNotNull(pkcs7); /* can read in the unverified smime bundle */ + ExpectIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, + PKCS7_NOVERIFY), SSL_FAILURE); + if (smimeTestFile != XBADFILE) { + XFCLOSE(smimeTestFile); + smimeTestFile = XBADFILE; + } if (bcont) BIO_free(bcont); + bcont = NULL; wolfSSL_PKCS7_free(pkcs7); + pkcs7 = NULL; /* smime-test-canon.p7s */ smimeTestFile = XFOPEN("./certs/test/smime-test-canon.p7s", "r"); - AssertIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); + ExpectFalse(smimeTestFile == XBADFILE); + ExpectIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); pkcs7 = wolfSSL_SMIME_read_PKCS7(bio, &bcont); - AssertNotNull(pkcs7); - AssertIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, - PKCS7_NOVERIFY), SSL_SUCCESS); - XFCLOSE(smimeTestFile); + ExpectNotNull(pkcs7); + ExpectIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, NULL, + PKCS7_NOVERIFY), SSL_SUCCESS); + if (smimeTestFile != XBADFILE) { + XFCLOSE(smimeTestFile); + smimeTestFile = XBADFILE; + } if (bcont) BIO_free(bcont); + bcont = NULL; wolfSSL_PKCS7_free(pkcs7); + pkcs7 = NULL; /* Test PKCS7_TEXT, PKCS7_verify() should remove Content-Type: text/plain */ smimeTestFile = XFOPEN("./certs/test/smime-test-canon.p7s", "r"); - AssertIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); + ExpectFalse(smimeTestFile == XBADFILE); + ExpectIntEQ(wolfSSL_BIO_set_fp(bio, smimeTestFile, BIO_CLOSE), SSL_SUCCESS); pkcs7 = wolfSSL_SMIME_read_PKCS7(bio, &bcont); - AssertNotNull(pkcs7); + ExpectNotNull(pkcs7); out = wolfSSL_BIO_new(BIO_s_mem()); - AssertNotNull(out); - AssertIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, out, - PKCS7_NOVERIFY | PKCS7_TEXT), SSL_SUCCESS); - AssertIntGT((outBufLen = BIO_get_mem_data(out, &outBuf)), 0); + ExpectNotNull(out); + ExpectIntEQ(wolfSSL_PKCS7_verify(pkcs7, NULL, NULL, bcont, out, + PKCS7_NOVERIFY | PKCS7_TEXT), SSL_SUCCESS); + ExpectIntGT((outBufLen = BIO_get_mem_data(out, &outBuf)), 0); /* Content-Type should not show up at beginning of output buffer */ - AssertIntGT(outBufLen, XSTRLEN(contTypeText)); - AssertIntGT(XMEMCMP(outBuf, contTypeText, XSTRLEN(contTypeText)), 0); + ExpectIntGT(outBufLen, XSTRLEN(contTypeText)); + ExpectIntGT(XMEMCMP(outBuf, contTypeText, XSTRLEN(contTypeText)), 0); BIO_free(out); BIO_free(bio); if (bcont) BIO_free(bcont); wolfSSL_PKCS7_free(pkcs7); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } +/* // NOLINTEND(clang-analyzer-unix.Stream) */ static int test_wolfSSL_SMIME_write_PKCS7(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && defined(HAVE_PKCS7) && !defined(NO_RSA) PKCS7* p7 = NULL; PKCS7* p7Ver = NULL; @@ -54240,101 +65232,121 @@ X509_STORE* store = NULL; /* read signer cert/key into BIO */ - AssertNotNull(certBio = BIO_new_file(cert, "r")); - AssertNotNull(keyBio = BIO_new_file(key, "r")); - AssertNotNull(signCert = PEM_read_bio_X509(certBio, NULL, 0, NULL)); - AssertNotNull(signKey = PEM_read_bio_PrivateKey(keyBio, NULL, 0, NULL)); + ExpectNotNull(certBio = BIO_new_file(cert, "r")); + ExpectNotNull(keyBio = BIO_new_file(key, "r")); + ExpectNotNull(signCert = PEM_read_bio_X509(certBio, NULL, 0, NULL)); + ExpectNotNull(signKey = PEM_read_bio_PrivateKey(keyBio, NULL, 0, NULL)); /* read CA cert into store (for verify) */ - AssertNotNull(caBio = BIO_new_file(ca, "r")); - AssertNotNull(caCert = PEM_read_bio_X509(caBio, NULL, 0, NULL)); - AssertNotNull(store = X509_STORE_new()); - AssertIntEQ(X509_STORE_add_cert(store, caCert), 1); + ExpectNotNull(caBio = BIO_new_file(ca, "r")); + ExpectNotNull(caCert = PEM_read_bio_X509(caBio, NULL, 0, NULL)); + ExpectNotNull(store = X509_STORE_new()); + ExpectIntEQ(X509_STORE_add_cert(store, caCert), 1); /* generate and verify SMIME: not detached */ { - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); flags = PKCS7_STREAM; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertNotNull(outBio = BIO_new(BIO_s_mem())); - AssertIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectNotNull(outBio = BIO_new(BIO_s_mem())); + ExpectIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); /* bad arg: out NULL */ - AssertIntEQ(SMIME_write_PKCS7(NULL, p7, inBio, flags), 0); + ExpectIntEQ(SMIME_write_PKCS7(NULL, p7, inBio, flags), 0); /* bad arg: pkcs7 NULL */ - AssertIntEQ(SMIME_write_PKCS7(outBio, NULL, inBio, flags), 0); + ExpectIntEQ(SMIME_write_PKCS7(outBio, NULL, inBio, flags), 0); - AssertNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); - AssertIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); + ExpectNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); + ExpectIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); BIO_free(content); + content = NULL; BIO_free(inBio); + inBio = NULL; BIO_free(outBio); + outBio = NULL; PKCS7_free(p7Ver); + p7Ver = NULL; PKCS7_free(p7); + p7 = NULL; } /* generate and verify SMIME: not detached, add Content-Type */ { - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); flags = PKCS7_STREAM | PKCS7_TEXT; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertNotNull(outBio = BIO_new(BIO_s_mem())); - AssertIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectNotNull(outBio = BIO_new(BIO_s_mem())); + ExpectIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); - AssertNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); - AssertIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); + ExpectNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); + ExpectIntEQ(PKCS7_verify(p7Ver, NULL, store, NULL, NULL, flags), 1); BIO_free(content); + content = NULL; BIO_free(inBio); + inBio = NULL; BIO_free(outBio); + outBio = NULL; PKCS7_free(p7Ver); + p7Ver = NULL; PKCS7_free(p7); + p7 = NULL; } /* generate and verify SMIME: detached */ { - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); flags = PKCS7_DETACHED | PKCS7_STREAM; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertNotNull(outBio = BIO_new(BIO_s_mem())); - AssertIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectNotNull(outBio = BIO_new(BIO_s_mem())); + ExpectIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); - AssertNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); - AssertIntEQ(PKCS7_verify(p7Ver, NULL, store, content, NULL, flags), 1); + ExpectNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); + ExpectIntEQ(PKCS7_verify(p7Ver, NULL, store, content, NULL, flags), 1); BIO_free(content); + content = NULL; BIO_free(inBio); + inBio = NULL; BIO_free(outBio); + outBio = NULL; PKCS7_free(p7Ver); + p7Ver = NULL; PKCS7_free(p7); + p7 = NULL; } /* generate and verify SMIME: PKCS7_TEXT to add Content-Type header */ { - AssertNotNull(inBio = BIO_new(BIO_s_mem())); - AssertIntGT(BIO_write(inBio, data, sizeof(data)), 0); + ExpectNotNull(inBio = BIO_new(BIO_s_mem())); + ExpectIntGT(BIO_write(inBio, data, sizeof(data)), 0); flags = PKCS7_STREAM | PKCS7_DETACHED | PKCS7_TEXT; - AssertNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); - AssertNotNull(outBio = BIO_new(BIO_s_mem())); - AssertIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); + ExpectNotNull(p7 = PKCS7_sign(signCert, signKey, NULL, inBio, flags)); + ExpectNotNull(outBio = BIO_new(BIO_s_mem())); + ExpectIntEQ(SMIME_write_PKCS7(outBio, p7, inBio, flags), 1); - AssertNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); - AssertIntEQ(PKCS7_verify(p7Ver, NULL, store, content, NULL, flags), 1); + ExpectNotNull(p7Ver = SMIME_read_PKCS7(outBio, &content)); + ExpectIntEQ(PKCS7_verify(p7Ver, NULL, store, content, NULL, flags), 1); BIO_free(content); + content = NULL; BIO_free(inBio); + inBio = NULL; BIO_free(outBio); + outBio = NULL; PKCS7_free(p7Ver); + p7Ver = NULL; PKCS7_free(p7); + p7 = NULL; } X509_STORE_free(store); @@ -54344,10 +65356,8 @@ BIO_free(keyBio); BIO_free(certBio); BIO_free(caBio); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #endif /* HAVE_SMIME */ #endif /* !NO_BIO */ @@ -54356,183 +65366,190 @@ * returns 0) */ static int test_X509_STORE_No_SSL_CTX(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && \ - !defined(NO_WOLFSSL_DIR) && defined(HAVE_CRL) && \ + EXPECT_DECLS; +#if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \ + !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \ (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && \ - !defined(NO_RSA) + defined(HAVE_CRL) && !defined(NO_RSA) - X509_STORE * store; - X509_STORE_CTX * storeCtx; - X509_CRL * crl; - X509 * ca; - X509 * cert; + X509_STORE * store = NULL; + X509_STORE_CTX * storeCtx = NULL; + X509_CRL * crl = NULL; + X509 * ca = NULL; + X509 * cert = NULL; const char cliCrlPem[] = "./certs/crl/cliCrl.pem"; const char srvCert[] = "./certs/server-cert.pem"; const char caCert[] = "./certs/ca-cert.pem"; const char caDir[] = "./certs/crl/hash_pem"; - XFILE fp; - X509_LOOKUP * lookup; + XFILE fp = XBADFILE; + X509_LOOKUP * lookup = NULL; - AssertNotNull(store = (X509_STORE *)X509_STORE_new()); + ExpectNotNull(store = (X509_STORE *)X509_STORE_new()); /* Set up store with CA */ - AssertNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, - SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); + ExpectNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, + SSL_FILETYPE_PEM))); + ExpectIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); /* Add CRL lookup directory to store * NOTE: test uses ./certs/crl/hash_pem/0fdb2da4.r0, which is a copy * of crl.pem */ - AssertNotNull((lookup = X509_STORE_add_lookup(store, - X509_LOOKUP_hash_dir()))); - AssertIntEQ(X509_LOOKUP_ctrl(lookup, X509_L_ADD_DIR, caDir, - X509_FILETYPE_PEM, NULL), SSL_SUCCESS); + ExpectNotNull((lookup = X509_STORE_add_lookup(store, + X509_LOOKUP_hash_dir()))); + ExpectIntEQ(X509_LOOKUP_ctrl(lookup, X509_L_ADD_DIR, caDir, + X509_FILETYPE_PEM, NULL), SSL_SUCCESS); - AssertIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK), - SSL_SUCCESS); + ExpectIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK), + SSL_SUCCESS); /* Add CRL to store NOT containing the verified certificate, which * forces use of the CRL lookup directory */ - fp = XFOPEN(cliCrlPem, "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, - NULL, NULL)); - XFCLOSE(fp); - AssertIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); + ExpectTrue((fp = XFOPEN(cliCrlPem, "rb")) != XBADFILE); + ExpectNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, + NULL, NULL)); + if (fp != XBADFILE) + XFCLOSE(fp); + ExpectIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); /* Create verification context outside of an SSL session */ - AssertNotNull((storeCtx = X509_STORE_CTX_new())); - AssertNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, - SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); + ExpectNotNull((storeCtx = X509_STORE_CTX_new())); + ExpectNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, + SSL_FILETYPE_PEM))); + ExpectIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); /* Perform verification, which should NOT indicate CRL missing due to the * store CM's X509 store pointer being NULL */ - AssertIntNE(X509_verify_cert(storeCtx), CRL_MISSING); + ExpectIntNE(X509_verify_cert(storeCtx), CRL_MISSING); X509_CRL_free(crl); X509_STORE_free(store); X509_STORE_CTX_free(storeCtx); X509_free(cert); X509_free(ca); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } /* Test of X509 store use outside of SSL context w/ CRL lookup, but * with X509_LOOKUP_add_dir and X509_FILETYPE_ASN1. */ static int test_X509_LOOKUP_add_dir(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && \ - !defined(NO_WOLFSSL_DIR) && defined(HAVE_CRL) && \ + EXPECT_DECLS; +#if defined(OPENSSL_ALL) && defined(WOLFSSL_CERT_GEN) && \ (defined(WOLFSSL_CERT_REQ) || defined(WOLFSSL_CERT_EXT)) && \ + !defined(NO_FILESYSTEM) && !defined(NO_WOLFSSL_DIR) && \ (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) && \ - !defined(NO_RSA) + defined(HAVE_CRL) && !defined(NO_RSA) - X509_STORE * store; - X509_STORE_CTX * storeCtx; - X509_CRL * crl; - X509 * ca; - X509 * cert; + X509_STORE * store = NULL; + X509_STORE_CTX * storeCtx = NULL; + X509_CRL * crl = NULL; + X509 * ca = NULL; + X509 * cert = NULL; const char cliCrlPem[] = "./certs/crl/cliCrl.pem"; const char srvCert[] = "./certs/server-cert.pem"; const char caCert[] = "./certs/ca-cert.pem"; const char caDir[] = "./certs/crl/hash_der"; - XFILE fp; - X509_LOOKUP * lookup; + XFILE fp = XBADFILE; + X509_LOOKUP * lookup = NULL; - AssertNotNull(store = (X509_STORE *)X509_STORE_new()); + ExpectNotNull(store = (X509_STORE *)X509_STORE_new()); /* Set up store with CA */ - AssertNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, - SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); + ExpectNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, + SSL_FILETYPE_PEM))); + ExpectIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); /* Add CRL lookup directory to store. * Test uses ./certs/crl/hash_der/0fdb2da4.r0, which is a copy * of crl.der */ - AssertNotNull((lookup = X509_STORE_add_lookup(store, - X509_LOOKUP_hash_dir()))); + ExpectNotNull((lookup = X509_STORE_add_lookup(store, + X509_LOOKUP_hash_dir()))); - AssertIntEQ(X509_LOOKUP_add_dir(lookup, caDir, X509_FILETYPE_ASN1), - SSL_SUCCESS); + ExpectIntEQ(X509_LOOKUP_add_dir(lookup, caDir, X509_FILETYPE_ASN1), + SSL_SUCCESS); - AssertIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK), - SSL_SUCCESS); + ExpectIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK), + SSL_SUCCESS); /* Add CRL to store NOT containing the verified certificate, which * forces use of the CRL lookup directory */ - fp = XFOPEN(cliCrlPem, "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, - NULL, NULL)); - XFCLOSE(fp); - AssertIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); + ExpectTrue((fp = XFOPEN(cliCrlPem, "rb")) != XBADFILE); + ExpectNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, + NULL, NULL)); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); /* Create verification context outside of an SSL session */ - AssertNotNull((storeCtx = X509_STORE_CTX_new())); - AssertNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, - SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); + ExpectNotNull((storeCtx = X509_STORE_CTX_new())); + ExpectNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, + SSL_FILETYPE_PEM))); + ExpectIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); /* Perform verification, which should NOT return CRL missing */ - AssertIntNE(X509_verify_cert(storeCtx), CRL_MISSING); + ExpectIntNE(X509_verify_cert(storeCtx), CRL_MISSING); X509_CRL_free(crl); + crl = NULL; X509_STORE_free(store); + store = NULL; X509_STORE_CTX_free(storeCtx); + storeCtx = NULL; X509_free(cert); + cert = NULL; X509_free(ca); + ca = NULL; /* Now repeat the same, but look for X509_FILETYPE_PEM. * We should get CRL_MISSING at the end, because the lookup * dir has only ASN1 CRLs. */ - AssertNotNull(store = (X509_STORE *)X509_STORE_new()); + ExpectNotNull(store = (X509_STORE *)X509_STORE_new()); - AssertNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, - SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); + ExpectNotNull((ca = wolfSSL_X509_load_certificate_file(caCert, + SSL_FILETYPE_PEM))); + ExpectIntEQ(X509_STORE_add_cert(store, ca), SSL_SUCCESS); - AssertNotNull((lookup = X509_STORE_add_lookup(store, - X509_LOOKUP_hash_dir()))); + ExpectNotNull((lookup = X509_STORE_add_lookup(store, + X509_LOOKUP_hash_dir()))); - AssertIntEQ(X509_LOOKUP_add_dir(lookup, caDir, X509_FILETYPE_PEM), - SSL_SUCCESS); + ExpectIntEQ(X509_LOOKUP_add_dir(lookup, caDir, X509_FILETYPE_PEM), + SSL_SUCCESS); - AssertIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK), - SSL_SUCCESS); + ExpectIntEQ(X509_STORE_set_flags(store, X509_V_FLAG_CRL_CHECK), + SSL_SUCCESS); - fp = XFOPEN(cliCrlPem, "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, - NULL, NULL)); - XFCLOSE(fp); - AssertIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); + ExpectTrue((fp = XFOPEN(cliCrlPem, "rb")) != XBADFILE); + ExpectNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, + NULL, NULL)); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectIntEQ(X509_STORE_add_crl(store, crl), SSL_SUCCESS); - AssertNotNull((storeCtx = X509_STORE_CTX_new())); - AssertNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, - SSL_FILETYPE_PEM))); - AssertIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); + ExpectNotNull((storeCtx = X509_STORE_CTX_new())); + ExpectNotNull((cert = wolfSSL_X509_load_certificate_file(srvCert, + SSL_FILETYPE_PEM))); + ExpectIntEQ(X509_STORE_CTX_init(storeCtx, store, cert, NULL), SSL_SUCCESS); /* Now we SHOULD get CRL_MISSING, because we looked for PEM * in dir containing only ASN1/DER. */ - AssertIntEQ(X509_verify_cert(storeCtx), CRL_MISSING); + ExpectIntEQ(X509_verify_cert(storeCtx), WOLFSSL_FAILURE); + ExpectIntEQ(X509_STORE_CTX_get_error(storeCtx), + X509_V_ERR_UNABLE_TO_GET_CRL); X509_CRL_free(crl); X509_STORE_free(store); X509_STORE_CTX_free(storeCtx); X509_free(cert); X509_free(ca); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } @@ -54541,125 +65558,128 @@ | Certificate Failure Checks *----------------------------------------------------------------------------*/ #if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \ - !defined(WOLFSSL_NO_CLIENT_AUTH)) && !defined(NO_FILESYSTEM) - /* Use the Cert Manager(CM) API to generate the error ASN_SIG_CONFIRM_E */ - static int verify_sig_cm(const char* ca, byte* cert_buf, size_t cert_sz, - int type) - { - int ret; - WOLFSSL_CERT_MANAGER* cm = NULL; - - switch (type) { - case TESTING_RSA: - #ifdef NO_RSA - fprintf(stderr, "RSA disabled, skipping test\n"); - return ASN_SIG_CONFIRM_E; - #else - break; - #endif - case TESTING_ECC: - #ifndef HAVE_ECC - fprintf(stderr, "ECC disabled, skipping test\n"); - return ASN_SIG_CONFIRM_E; - #else - break; - #endif - default: - fprintf(stderr, "Bad function argument\n"); - return BAD_FUNC_ARG; - } - cm = wolfSSL_CertManagerNew(); - if (cm == NULL) { - fprintf(stderr, "wolfSSL_CertManagerNew failed\n"); - return -1; - } - - #ifndef NO_FILESYSTEM - ret = wolfSSL_CertManagerLoadCA(cm, ca, 0); - if (ret != WOLFSSL_SUCCESS) { - fprintf(stderr, "wolfSSL_CertManagerLoadCA failed\n"); - wolfSSL_CertManagerFree(cm); - return ret; - } - #else - (void)ca; - #endif + !defined(WOLFSSL_NO_CLIENT_AUTH)) && !defined(NO_FILESYSTEM) +#if !defined(NO_RSA) || defined(HAVE_ECC) +/* Use the Cert Manager(CM) API to generate the error ASN_SIG_CONFIRM_E */ +static int verify_sig_cm(const char* ca, byte* cert_buf, size_t cert_sz, + int type) +{ + int ret; + WOLFSSL_CERT_MANAGER* cm = NULL; - ret = wolfSSL_CertManagerVerifyBuffer(cm, cert_buf, cert_sz, WOLFSSL_FILETYPE_ASN1); - /* Let AssertIntEQ handle return code */ + switch (type) { + case TESTING_RSA: + #ifdef NO_RSA + fprintf(stderr, "RSA disabled, skipping test\n"); + return ASN_SIG_CONFIRM_E; + #else + break; + #endif + case TESTING_ECC: + #ifndef HAVE_ECC + fprintf(stderr, "ECC disabled, skipping test\n"); + return ASN_SIG_CONFIRM_E; + #else + break; + #endif + default: + fprintf(stderr, "Bad function argument\n"); + return BAD_FUNC_ARG; + } + cm = wolfSSL_CertManagerNew(); + if (cm == NULL) { + fprintf(stderr, "wolfSSL_CertManagerNew failed\n"); + return -1; + } +#ifndef NO_FILESYSTEM + ret = wolfSSL_CertManagerLoadCA(cm, ca, 0); + if (ret != WOLFSSL_SUCCESS) { + fprintf(stderr, "wolfSSL_CertManagerLoadCA failed\n"); wolfSSL_CertManagerFree(cm); - return ret; } +#else + (void)ca; +#endif - #if !defined(NO_FILESYSTEM) - static int test_RsaSigFailure_cm(void) - { - int ret = 0; - const char* ca_cert = "./certs/ca-cert.pem"; - const char* server_cert = "./certs/server-cert.der"; - byte* cert_buf = NULL; - size_t cert_sz = 0; + ret = wolfSSL_CertManagerVerifyBuffer(cm, cert_buf, (long int)cert_sz, + WOLFSSL_FILETYPE_ASN1); + /* Let ExpectIntEQ handle return code */ - ret = load_file(server_cert, &cert_buf, &cert_sz); - if (ret == 0) { - /* corrupt DER - invert last byte, which is signature */ - cert_buf[cert_sz-1] = ~cert_buf[cert_sz-1]; + wolfSSL_CertManagerFree(cm); - /* test bad cert */ - ret = verify_sig_cm(ca_cert, cert_buf, cert_sz, TESTING_RSA); - } + return ret; +} +#endif - if (cert_buf) - free(cert_buf); +#if !defined(NO_FILESYSTEM) +static int test_RsaSigFailure_cm(void) +{ + EXPECT_DECLS; +#ifndef NO_RSA + const char* ca_cert = "./certs/ca-cert.pem"; + const char* server_cert = "./certs/server-cert.der"; + byte* cert_buf = NULL; + size_t cert_sz = 0; + + ExpectIntEQ(load_file(server_cert, &cert_buf, &cert_sz), 0); + if (cert_buf != NULL) { + /* corrupt DER - invert last byte, which is signature */ + cert_buf[cert_sz-1] = ~cert_buf[cert_sz-1]; + /* test bad cert */ #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) - if (ret == WOLFSSL_FATAL_ERROR) { - ret = 0; - } + ExpectIntEQ(verify_sig_cm(ca_cert, cert_buf, cert_sz, TESTING_RSA), + WOLFSSL_FATAL_ERROR); #else - if (ret == ASN_SIG_CONFIRM_E) { - ret = 0; - } -#endif /* NO_WOLFSSL_CLIENT && NO_WOLFSSL_SERVER */ - return TEST_RES_CHECK(ret == 0); + ExpectIntEQ(verify_sig_cm(ca_cert, cert_buf, cert_sz, TESTING_RSA), + ASN_SIG_CONFIRM_E); +#endif } - static int test_EccSigFailure_cm(void) - { - int ret = 0; - /* self-signed ECC cert, so use server cert as CA */ - const char* ca_cert = "./certs/ca-ecc-cert.pem"; - const char* server_cert = "./certs/server-ecc.der"; - byte* cert_buf = NULL; - size_t cert_sz = 0; + /* load_file() uses malloc. */ + if (cert_buf != NULL) { + free(cert_buf); + } +#endif /* !NO_RSA */ + return EXPECT_RESULT(); +} - ret = load_file(server_cert, &cert_buf, &cert_sz); - if (ret == 0) { - /* corrupt DER - invert last byte, which is signature */ - cert_buf[cert_sz-1] = ~cert_buf[cert_sz-1]; +static int test_EccSigFailure_cm(void) +{ + EXPECT_DECLS; +#ifdef HAVE_ECC + /* self-signed ECC cert, so use server cert as CA */ + const char* ca_cert = "./certs/ca-ecc-cert.pem"; + const char* server_cert = "./certs/server-ecc.der"; + byte* cert_buf = NULL; + size_t cert_sz = 0; - /* test bad cert */ - ret = verify_sig_cm(ca_cert, cert_buf, cert_sz, TESTING_ECC); - } + ExpectIntEQ(load_file(server_cert, &cert_buf, &cert_sz), 0); + if (cert_buf != NULL && cert_sz > 0) { + /* corrupt DER - invert last byte, which is signature */ + cert_buf[cert_sz-1] = ~cert_buf[cert_sz-1]; - if (cert_buf) - free(cert_buf); + /* test bad cert */ +#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) + ExpectIntEQ(verify_sig_cm(ca_cert, cert_buf, cert_sz, TESTING_ECC), + WOLFSSL_FATAL_ERROR); +#else + ExpectIntEQ(verify_sig_cm(ca_cert, cert_buf, cert_sz, TESTING_ECC), + ASN_SIG_CONFIRM_E); +#endif + } + /* load_file() uses malloc. */ + if (cert_buf != NULL) { + free(cert_buf); + } #ifdef FP_ECC wc_ecc_fp_free(); #endif -#if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) - if (ret == WOLFSSL_FATAL_ERROR) { - ret = 0; - } -#else - if (ret == ASN_SIG_CONFIRM_E) { - ret = 0; - } -#endif /* NO_WOLFSSL_CLIENT && NO_WOLFSSL_SERVER */ - return TEST_RES_CHECK(ret == 0); - } +#endif /* HAVE_ECC */ + return EXPECT_RESULT(); +} #endif /* !NO_FILESYSTEM */ #endif /* NO_CERTS */ @@ -54679,24 +65699,25 @@ static int test_tls13_apis(void) { - int ret = 0; + EXPECT_DECLS; + int ret; #ifndef WOLFSSL_NO_TLS12 #ifndef NO_WOLFSSL_CLIENT - WOLFSSL_CTX* clientTls12Ctx; - WOLFSSL* clientTls12Ssl; + WOLFSSL_CTX* clientTls12Ctx = NULL; + WOLFSSL* clientTls12Ssl = NULL; #endif #ifndef NO_WOLFSSL_SERVER - WOLFSSL_CTX* serverTls12Ctx; - WOLFSSL* serverTls12Ssl; + WOLFSSL_CTX* serverTls12Ctx = NULL; + WOLFSSL* serverTls12Ssl = NULL; #endif #endif #ifndef NO_WOLFSSL_CLIENT - WOLFSSL_CTX* clientCtx; - WOLFSSL* clientSsl; + WOLFSSL_CTX* clientCtx = NULL; + WOLFSSL* clientSsl = NULL; #endif #ifndef NO_WOLFSSL_SERVER - WOLFSSL_CTX* serverCtx; - WOLFSSL* serverSsl; + WOLFSSL_CTX* serverCtx = NULL; + WOLFSSL* serverSsl = NULL; #if !defined(NO_CERTS) && !defined(NO_FILESYSTEM) const char* ourCert = svrCertFile; const char* ourKey = svrKeyFile; @@ -54708,7 +65729,7 @@ #endif #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES) int groups[2] = { WOLFSSL_ECC_SECP256R1, -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER WOLFSSL_KYBER_LEVEL1 #else WOLFSSL_ECC_SECP256R1 @@ -54721,21 +65742,27 @@ #endif #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) char groupList[] = +#ifdef HAVE_CURVE25519 + "X25519:" +#endif +#ifdef HAVE_CURVE448 + "X448:" +#endif #ifndef NO_ECC_SECP #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 - "P-521:" + "P-521:secp521r1:" #endif #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 - "P-384:" + "P-384:secp384r1:" #endif #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 - "P-256" -#ifdef HAVE_PQC + "P-256:secp256r1" +#if defined(WOLFSSL_HAVE_KYBER) ":P256_KYBER_LEVEL1" #endif #endif #endif /* !defined(NO_ECC_SECP) */ -#ifdef HAVE_PQC +#if defined(WOLFSSL_HAVE_KYBER) ":KYBER_LEVEL1" #endif ""; @@ -54752,7 +65779,8 @@ serverTls12Ctx = wolfSSL_CTX_new(wolfTLSv1_2_server_method()); #if !defined(NO_CERTS) && !defined(NO_FILESYSTEM) wolfSSL_CTX_use_certificate_chain_file(serverTls12Ctx, ourCert); - wolfSSL_CTX_use_PrivateKey_file(serverTls12Ctx, ourKey, WOLFSSL_FILETYPE_PEM); + wolfSSL_CTX_use_PrivateKey_file(serverTls12Ctx, ourKey, + WOLFSSL_FILETYPE_PEM); #endif serverTls12Ssl = wolfSSL_new(serverTls12Ctx); #endif @@ -54769,28 +65797,30 @@ wolfSSL_CTX_use_PrivateKey_file(serverCtx, ourKey, WOLFSSL_FILETYPE_PEM); #endif serverSsl = wolfSSL_new(serverCtx); - AssertNotNull(serverSsl); + ExpectNotNull(serverSsl); #endif #ifdef WOLFSSL_SEND_HRR_COOKIE - AssertIntEQ(wolfSSL_send_hrr_cookie(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_send_hrr_cookie(NULL, NULL, 0), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_send_hrr_cookie(clientSsl, NULL, 0), SIDE_ERROR); + ExpectIntEQ(wolfSSL_send_hrr_cookie(clientSsl, NULL, 0), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_SERVER #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_send_hrr_cookie(serverTls12Ssl, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_send_hrr_cookie(serverTls12Ssl, NULL, 0), + BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_send_hrr_cookie(serverSsl, NULL, 0), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_send_hrr_cookie(serverSsl, fixedKey, sizeof(fixedKey)), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_send_hrr_cookie(serverSsl, NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_send_hrr_cookie(serverSsl, fixedKey, sizeof(fixedKey)), + WOLFSSL_SUCCESS); #endif #endif #ifdef HAVE_SUPPORTED_CURVES #ifdef HAVE_ECC - AssertIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_SECP256R1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_SECP256R1), + BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER do { ret = wolfSSL_UseKeyShare(serverSsl, WOLFSSL_ECC_SECP256R1); @@ -54798,8 +65828,9 @@ if (ret == WC_PENDING_E) wolfSSL_AsyncPoll(serverSsl, WOLF_POLL_FLAG_CHECK_HW); #endif - } while (ret == WC_PENDING_E); - AssertIntEQ(ret, WOLFSSL_SUCCESS); + } + while (ret == WC_PENDING_E); + ExpectIntEQ(ret, WOLFSSL_SUCCESS); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 @@ -54809,8 +65840,9 @@ if (ret == WC_PENDING_E) wolfSSL_AsyncPoll(clientTls12Ssl, WOLF_POLL_FLAG_CHECK_HW); #endif - } while (ret == WC_PENDING_E); - AssertIntEQ(ret, WOLFSSL_SUCCESS); + } + while (ret == WC_PENDING_E); + ExpectIntEQ(ret, WOLFSSL_SUCCESS); #endif do { ret = wolfSSL_UseKeyShare(clientSsl, WOLFSSL_ECC_SECP256R1); @@ -54818,282 +65850,285 @@ if (ret == WC_PENDING_E) wolfSSL_AsyncPoll(clientSsl, WOLF_POLL_FLAG_CHECK_HW); #endif - } while (ret == WC_PENDING_E); - AssertIntEQ(ret, WOLFSSL_SUCCESS); + } + while (ret == WC_PENDING_E); + ExpectIntEQ(ret, WOLFSSL_SUCCESS); #endif #elif defined(HAVE_CURVE25519) - AssertIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_X25519), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_X25519), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_UseKeyShare(serverSsl, WOLFSSL_ECC_X25519), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(serverSsl, WOLFSSL_ECC_X25519), + WOLFSSL_SUCCESS); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_ECC_X25519), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_ECC_X25519), + WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_ECC_X25519), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_ECC_X25519), + WOLFSSL_SUCCESS); #endif #elif defined(HAVE_CURVE448) - AssertIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_X448), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_X448), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_UseKeyShare(serverSsl, WOLFSSL_ECC_X448), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(serverSsl, WOLFSSL_ECC_X448), + WOLFSSL_SUCCESS); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_ECC_X448), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_ECC_X448), + WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_ECC_X448), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_ECC_X448), + WOLFSSL_SUCCESS); #endif #else - AssertIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_SECP256R1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_ECC_SECP256R1), + BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_ECC_SECP256R1), - NOT_COMPILED_IN); + ExpectIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_ECC_SECP256R1), + NOT_COMPILED_IN); #endif - AssertIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_ECC_SECP256R1), - NOT_COMPILED_IN); + ExpectIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_ECC_SECP256R1), + NOT_COMPILED_IN); #endif #endif -#if defined(HAVE_PQC) - AssertIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_KYBER_LEVEL3), BAD_FUNC_ARG); +#if defined(WOLFSSL_HAVE_KYBER) + ExpectIntEQ(wolfSSL_UseKeyShare(NULL, WOLFSSL_KYBER_LEVEL3), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_UseKeyShare(serverSsl, WOLFSSL_KYBER_LEVEL3), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(serverSsl, WOLFSSL_KYBER_LEVEL3), + WOLFSSL_SUCCESS); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_KYBER_LEVEL3), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_UseKeyShare(clientTls12Ssl, WOLFSSL_KYBER_LEVEL3), + BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_KYBER_LEVEL3), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(clientSsl, WOLFSSL_KYBER_LEVEL3), + WOLFSSL_SUCCESS); #endif #endif - AssertIntEQ(wolfSSL_NoKeyShares(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_NoKeyShares(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_NoKeyShares(serverSsl), SIDE_ERROR); + ExpectIntEQ(wolfSSL_NoKeyShares(serverSsl), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_NoKeyShares(clientTls12Ssl), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_NoKeyShares(clientTls12Ssl), WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_NoKeyShares(clientSsl), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_NoKeyShares(clientSsl), WOLFSSL_SUCCESS); #endif #endif /* HAVE_SUPPORTED_CURVES */ - AssertIntEQ(wolfSSL_CTX_no_ticket_TLSv13(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_no_ticket_TLSv13(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_CTX_no_ticket_TLSv13(clientCtx), SIDE_ERROR); + ExpectIntEQ(wolfSSL_CTX_no_ticket_TLSv13(clientCtx), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_SERVER #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_CTX_no_ticket_TLSv13(serverTls12Ctx), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_no_ticket_TLSv13(serverTls12Ctx), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_CTX_no_ticket_TLSv13(serverCtx), 0); + ExpectIntEQ(wolfSSL_CTX_no_ticket_TLSv13(serverCtx), 0); #endif - AssertIntEQ(wolfSSL_no_ticket_TLSv13(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_no_ticket_TLSv13(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_no_ticket_TLSv13(clientSsl), SIDE_ERROR); + ExpectIntEQ(wolfSSL_no_ticket_TLSv13(clientSsl), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_SERVER #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_no_ticket_TLSv13(serverTls12Ssl), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_no_ticket_TLSv13(serverTls12Ssl), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_no_ticket_TLSv13(serverSsl), 0); + ExpectIntEQ(wolfSSL_no_ticket_TLSv13(serverSsl), 0); #endif - AssertIntEQ(wolfSSL_CTX_no_dhe_psk(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_no_dhe_psk(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_CTX_no_dhe_psk(clientTls12Ctx), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_no_dhe_psk(clientTls12Ctx), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_CTX_no_dhe_psk(clientCtx), 0); + ExpectIntEQ(wolfSSL_CTX_no_dhe_psk(clientCtx), 0); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_CTX_no_dhe_psk(serverCtx), 0); + ExpectIntEQ(wolfSSL_CTX_no_dhe_psk(serverCtx), 0); #endif - AssertIntEQ(wolfSSL_no_dhe_psk(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_no_dhe_psk(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_no_dhe_psk(clientTls12Ssl), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_no_dhe_psk(clientTls12Ssl), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_no_dhe_psk(clientSsl), 0); + ExpectIntEQ(wolfSSL_no_dhe_psk(clientSsl), 0); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_no_dhe_psk(serverSsl), 0); + ExpectIntEQ(wolfSSL_no_dhe_psk(serverSsl), 0); #endif - AssertIntEQ(wolfSSL_update_keys(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_update_keys(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_update_keys(clientTls12Ssl), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_update_keys(clientTls12Ssl), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_update_keys(clientSsl), BUILD_MSG_ERROR); + ExpectIntEQ(wolfSSL_update_keys(clientSsl), BUILD_MSG_ERROR); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_update_keys(serverSsl), BUILD_MSG_ERROR); + ExpectIntEQ(wolfSSL_update_keys(serverSsl), BUILD_MSG_ERROR); #endif - AssertIntEQ(wolfSSL_key_update_response(NULL, NULL), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_key_update_response(NULL, &required), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_key_update_response(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_key_update_response(NULL, &required), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_key_update_response(clientTls12Ssl, &required), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_key_update_response(clientTls12Ssl, &required), + BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_key_update_response(clientSsl, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_key_update_response(clientSsl, NULL), BAD_FUNC_ARG); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_key_update_response(serverSsl, NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_key_update_response(serverSsl, NULL), BAD_FUNC_ARG); #endif #if !defined(NO_CERTS) && defined(WOLFSSL_POST_HANDSHAKE_AUTH) - AssertIntEQ(wolfSSL_CTX_allow_post_handshake_auth(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_allow_post_handshake_auth(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_CTX_allow_post_handshake_auth(serverCtx), SIDE_ERROR); + ExpectIntEQ(wolfSSL_CTX_allow_post_handshake_auth(serverCtx), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_CTX_allow_post_handshake_auth(clientTls12Ctx), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_allow_post_handshake_auth(clientTls12Ctx), + BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_CTX_allow_post_handshake_auth(clientCtx), 0); + ExpectIntEQ(wolfSSL_CTX_allow_post_handshake_auth(clientCtx), 0); #endif - AssertIntEQ(wolfSSL_allow_post_handshake_auth(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_allow_post_handshake_auth(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_allow_post_handshake_auth(serverSsl), SIDE_ERROR); + ExpectIntEQ(wolfSSL_allow_post_handshake_auth(serverSsl), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_allow_post_handshake_auth(clientTls12Ssl), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_allow_post_handshake_auth(clientTls12Ssl), + BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_allow_post_handshake_auth(clientSsl), 0); + ExpectIntEQ(wolfSSL_allow_post_handshake_auth(clientSsl), 0); #endif - AssertIntEQ(wolfSSL_request_certificate(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_request_certificate(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_request_certificate(clientSsl), SIDE_ERROR); + ExpectIntEQ(wolfSSL_request_certificate(clientSsl), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_SERVER #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_request_certificate(serverTls12Ssl), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_request_certificate(serverTls12Ssl), + BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_request_certificate(serverSsl), NOT_READY_ERROR); + ExpectIntEQ(wolfSSL_request_certificate(serverSsl), NOT_READY_ERROR); #endif #endif #ifdef HAVE_ECC #ifndef WOLFSSL_NO_SERVER_GROUPS_EXT - AssertIntEQ(wolfSSL_preferred_group(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_preferred_group(NULL), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_preferred_group(serverSsl), SIDE_ERROR); + ExpectIntEQ(wolfSSL_preferred_group(serverSsl), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_preferred_group(clientTls12Ssl), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_preferred_group(clientTls12Ssl), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_preferred_group(clientSsl), NOT_READY_ERROR); + ExpectIntEQ(wolfSSL_preferred_group(clientSsl), NOT_READY_ERROR); #endif #endif #ifdef HAVE_SUPPORTED_CURVES - AssertIntEQ(wolfSSL_CTX_set_groups(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_groups(NULL, NULL, 0), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_CTX_set_groups(clientCtx, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_groups(clientCtx, NULL, 0), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_CTX_set_groups(NULL, groups, numGroups), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_groups(NULL, groups, numGroups), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_CTX_set_groups(clientTls12Ctx, groups, numGroups), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_groups(clientTls12Ctx, groups, numGroups), + WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_CTX_set_groups(clientCtx, groups, - WOLFSSL_MAX_GROUP_COUNT + 1), - BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_CTX_set_groups(clientCtx, groups, numGroups), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_set_groups(clientCtx, bad_groups, numGroups), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_groups(clientCtx, groups, + WOLFSSL_MAX_GROUP_COUNT + 1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_groups(clientCtx, groups, numGroups), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set_groups(clientCtx, bad_groups, numGroups), + BAD_FUNC_ARG); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_CTX_set_groups(serverCtx, groups, numGroups), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_set_groups(serverCtx, bad_groups, numGroups), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_groups(serverCtx, groups, numGroups), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set_groups(serverCtx, bad_groups, numGroups), + BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_set_groups(NULL, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_groups(NULL, NULL, 0), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_set_groups(clientSsl, NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_groups(clientSsl, NULL, 0), BAD_FUNC_ARG); #endif - AssertIntEQ(wolfSSL_set_groups(NULL, groups, numGroups), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_groups(NULL, groups, numGroups), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_set_groups(clientTls12Ssl, groups, numGroups), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_groups(clientTls12Ssl, groups, numGroups), + WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_set_groups(clientSsl, groups, - WOLFSSL_MAX_GROUP_COUNT + 1), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_set_groups(clientSsl, groups, numGroups), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_set_groups(clientSsl, bad_groups, numGroups), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_groups(clientSsl, groups, + WOLFSSL_MAX_GROUP_COUNT + 1), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_groups(clientSsl, groups, numGroups), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_groups(clientSsl, bad_groups, numGroups), + BAD_FUNC_ARG); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_set_groups(serverSsl, groups, numGroups), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_set_groups(serverSsl, bad_groups, numGroups), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_groups(serverSsl, groups, numGroups), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_groups(serverSsl, bad_groups, numGroups), + BAD_FUNC_ARG); #endif #ifdef OPENSSL_EXTRA - AssertIntEQ(wolfSSL_CTX_set1_groups_list(NULL, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_CTX_set1_groups_list(NULL, NULL), WOLFSSL_FAILURE); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_CTX_set1_groups_list(clientCtx, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_CTX_set1_groups_list(clientCtx, NULL), + WOLFSSL_FAILURE); #endif - AssertIntEQ(wolfSSL_CTX_set1_groups_list(NULL, groupList), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_CTX_set1_groups_list(NULL, groupList), + WOLFSSL_FAILURE); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_CTX_set1_groups_list(clientTls12Ctx, groupList), - WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_CTX_set1_groups_list(clientTls12Ctx, groupList), + WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_CTX_set1_groups_list(clientCtx, groupList), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set1_groups_list(clientCtx, groupList), + WOLFSSL_SUCCESS); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_CTX_set1_groups_list(serverCtx, groupList), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set1_groups_list(serverCtx, groupList), + WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_set1_groups_list(NULL, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_set1_groups_list(NULL, NULL), WOLFSSL_FAILURE); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_set1_groups_list(clientSsl, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_set1_groups_list(clientSsl, NULL), WOLFSSL_FAILURE); #endif - AssertIntEQ(wolfSSL_set1_groups_list(NULL, groupList), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_set1_groups_list(NULL, groupList), WOLFSSL_FAILURE); #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_set1_groups_list(clientTls12Ssl, groupList), - WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_set1_groups_list(clientTls12Ssl, groupList), + WOLFSSL_SUCCESS); #endif - AssertIntEQ(wolfSSL_set1_groups_list(clientSsl, groupList), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set1_groups_list(clientSsl, groupList), + WOLFSSL_SUCCESS); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_set1_groups_list(serverSsl, groupList), - WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set1_groups_list(serverSsl, groupList), + WOLFSSL_SUCCESS); #endif #endif /* OPENSSL_EXTRA */ #endif /* HAVE_SUPPORTED_CURVES */ @@ -55101,149 +66136,140 @@ #ifdef WOLFSSL_EARLY_DATA #ifndef OPENSSL_EXTRA - AssertIntEQ(wolfSSL_CTX_set_max_early_data(NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_CTX_get_max_early_data(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_max_early_data(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_get_max_early_data(NULL), BAD_FUNC_ARG); #else - AssertIntEQ(SSL_CTX_set_max_early_data(NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(SSL_CTX_get_max_early_data(NULL), BAD_FUNC_ARG); + ExpectIntEQ(SSL_CTX_set_max_early_data(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(SSL_CTX_get_max_early_data(NULL), BAD_FUNC_ARG); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef OPENSSL_EXTRA - AssertIntEQ(wolfSSL_CTX_set_max_early_data(clientCtx, 0), SIDE_ERROR); - AssertIntEQ(wolfSSL_CTX_get_max_early_data(clientCtx), SIDE_ERROR); + ExpectIntEQ(wolfSSL_CTX_set_max_early_data(clientCtx, 0), SIDE_ERROR); + ExpectIntEQ(wolfSSL_CTX_get_max_early_data(clientCtx), SIDE_ERROR); #else - AssertIntEQ(SSL_CTX_set_max_early_data(clientCtx, 0), SIDE_ERROR); - AssertIntEQ(SSL_CTX_get_max_early_data(clientCtx), SIDE_ERROR); + ExpectIntEQ(SSL_CTX_set_max_early_data(clientCtx, 0), SIDE_ERROR); + ExpectIntEQ(SSL_CTX_get_max_early_data(clientCtx), SIDE_ERROR); #endif #endif #ifndef NO_WOLFSSL_SERVER #ifndef WOLFSSL_NO_TLS12 #ifndef OPENSSL_EXTRA - AssertIntEQ(wolfSSL_CTX_set_max_early_data(serverTls12Ctx, 0), - BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_CTX_get_max_early_data(serverTls12Ctx), BAD_FUNC_ARG); -#else - AssertIntEQ(SSL_CTX_set_max_early_data(serverTls12Ctx, 0), - BAD_FUNC_ARG); - AssertIntEQ(SSL_CTX_get_max_early_data(serverTls12Ctx), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_max_early_data(serverTls12Ctx, 0), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_get_max_early_data(serverTls12Ctx), BAD_FUNC_ARG); +#else + ExpectIntEQ(SSL_CTX_set_max_early_data(serverTls12Ctx, 0), + BAD_FUNC_ARG); + ExpectIntEQ(SSL_CTX_get_max_early_data(serverTls12Ctx), BAD_FUNC_ARG); #endif #endif #ifndef OPENSSL_EXTRA #ifdef WOLFSSL_ERROR_CODE_OPENSSL - AssertIntEQ(wolfSSL_CTX_set_max_early_data(serverCtx, 32), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set_max_early_data(serverCtx, 32), + WOLFSSL_SUCCESS); #else - AssertIntEQ(wolfSSL_CTX_set_max_early_data(serverCtx, 32), 0); + ExpectIntEQ(wolfSSL_CTX_set_max_early_data(serverCtx, 32), 0); #endif - AssertIntEQ(wolfSSL_CTX_get_max_early_data(serverCtx), 32); + ExpectIntEQ(wolfSSL_CTX_get_max_early_data(serverCtx), 32); #else - AssertIntEQ(SSL_CTX_set_max_early_data(serverCtx, 32), 1); - AssertIntEQ(SSL_CTX_get_max_early_data(serverCtx), 32); + ExpectIntEQ(SSL_CTX_set_max_early_data(serverCtx, 32), 1); + ExpectIntEQ(SSL_CTX_get_max_early_data(serverCtx), 32); #endif #endif #ifndef OPENSSL_EXTRA - AssertIntEQ(wolfSSL_set_max_early_data(NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_get_max_early_data(NULL), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_max_early_data(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_get_max_early_data(NULL), BAD_FUNC_ARG); #else - AssertIntEQ(SSL_set_max_early_data(NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(SSL_get_max_early_data(NULL), BAD_FUNC_ARG); + ExpectIntEQ(SSL_set_max_early_data(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(SSL_get_max_early_data(NULL), BAD_FUNC_ARG); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef OPENSSL_EXTRA #ifdef WOLFSSL_ERROR_CODE_OPENSSL - AssertIntEQ(wolfSSL_set_max_early_data(clientSsl, 17), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_max_early_data(clientSsl, 17), WOLFSSL_SUCCESS); #else - AssertIntEQ(wolfSSL_set_max_early_data(clientSsl, 17), 0); + ExpectIntEQ(wolfSSL_set_max_early_data(clientSsl, 17), 0); #endif - AssertIntEQ(wolfSSL_get_max_early_data(clientSsl), 17); + ExpectIntEQ(wolfSSL_get_max_early_data(clientSsl), 17); #else - AssertIntEQ(SSL_set_max_early_data(clientSsl, 17), WOLFSSL_SUCCESS); - AssertIntEQ(SSL_get_max_early_data(clientSsl), 17); + ExpectIntEQ(SSL_set_max_early_data(clientSsl, 17), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_get_max_early_data(clientSsl), 17); #endif #endif #ifndef NO_WOLFSSL_SERVER #ifndef WOLFSSL_NO_TLS12 #ifndef OPENSSL_EXTRA - AssertIntEQ(wolfSSL_set_max_early_data(serverTls12Ssl, 0), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_get_max_early_data(serverTls12Ssl), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_set_max_early_data(serverTls12Ssl, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_get_max_early_data(serverTls12Ssl), BAD_FUNC_ARG); #else - AssertIntEQ(SSL_set_max_early_data(serverTls12Ssl, 0), BAD_FUNC_ARG); - AssertIntEQ(SSL_get_max_early_data(serverTls12Ssl), BAD_FUNC_ARG); + ExpectIntEQ(SSL_set_max_early_data(serverTls12Ssl, 0), BAD_FUNC_ARG); + ExpectIntEQ(SSL_get_max_early_data(serverTls12Ssl), BAD_FUNC_ARG); #endif #endif #ifndef OPENSSL_EXTRA #ifdef WOLFSSL_ERROR_CODE_OPENSSL - AssertIntEQ(wolfSSL_set_max_early_data(serverSsl, 16), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_max_early_data(serverSsl, 16), WOLFSSL_SUCCESS); #else - AssertIntEQ(wolfSSL_set_max_early_data(serverSsl, 16), 0); + ExpectIntEQ(wolfSSL_set_max_early_data(serverSsl, 16), 0); #endif - AssertIntEQ(wolfSSL_get_max_early_data(serverSsl), 16); + ExpectIntEQ(wolfSSL_get_max_early_data(serverSsl), 16); #else - AssertIntEQ(SSL_set_max_early_data(serverSsl, 16), 1); - AssertIntEQ(SSL_get_max_early_data(serverSsl), 16); + ExpectIntEQ(SSL_set_max_early_data(serverSsl, 16), 1); + ExpectIntEQ(SSL_get_max_early_data(serverSsl), 16); #endif #endif - AssertIntEQ(wolfSSL_write_early_data(NULL, earlyData, sizeof(earlyData), - &outSz), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_write_early_data(NULL, earlyData, sizeof(earlyData), + &outSz), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_write_early_data(clientSsl, NULL, sizeof(earlyData), - &outSz), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_write_early_data(clientSsl, earlyData, -1, &outSz), - BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_write_early_data(clientSsl, earlyData, - sizeof(earlyData), NULL), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_write_early_data(clientSsl, NULL, sizeof(earlyData), + &outSz), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_write_early_data(clientSsl, earlyData, -1, &outSz), + BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_write_early_data(clientSsl, earlyData, + sizeof(earlyData), NULL), BAD_FUNC_ARG); #endif #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_write_early_data(serverSsl, earlyData, - sizeof(earlyData), &outSz), - SIDE_ERROR); + ExpectIntEQ(wolfSSL_write_early_data(serverSsl, earlyData, + sizeof(earlyData), &outSz), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_CLIENT #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_write_early_data(clientTls12Ssl, earlyData, - sizeof(earlyData), &outSz), - BAD_FUNC_ARG); -#endif - AssertIntEQ(wolfSSL_write_early_data(clientSsl, earlyData, - sizeof(earlyData), &outSz), - WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_write_early_data(clientTls12Ssl, earlyData, + sizeof(earlyData), &outSz), BAD_FUNC_ARG); +#endif + ExpectIntEQ(wolfSSL_write_early_data(clientSsl, earlyData, + sizeof(earlyData), &outSz), WOLFSSL_FATAL_ERROR); #endif - AssertIntEQ(wolfSSL_read_early_data(NULL, earlyDataBuffer, - sizeof(earlyDataBuffer), &outSz), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_read_early_data(NULL, earlyDataBuffer, + sizeof(earlyDataBuffer), &outSz), BAD_FUNC_ARG); #ifndef NO_WOLFSSL_SERVER - AssertIntEQ(wolfSSL_read_early_data(serverSsl, NULL, - sizeof(earlyDataBuffer), &outSz), - BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_read_early_data(serverSsl, earlyDataBuffer, -1, &outSz), - BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_read_early_data(serverSsl, earlyDataBuffer, - sizeof(earlyDataBuffer), NULL), - BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_read_early_data(serverSsl, NULL, + sizeof(earlyDataBuffer), &outSz), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_read_early_data(serverSsl, earlyDataBuffer, -1, + &outSz), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_read_early_data(serverSsl, earlyDataBuffer, + sizeof(earlyDataBuffer), NULL), BAD_FUNC_ARG); #endif #ifndef NO_WOLFSSL_CLIENT - AssertIntEQ(wolfSSL_read_early_data(clientSsl, earlyDataBuffer, - sizeof(earlyDataBuffer), &outSz), - SIDE_ERROR); + ExpectIntEQ(wolfSSL_read_early_data(clientSsl, earlyDataBuffer, + sizeof(earlyDataBuffer), &outSz), SIDE_ERROR); #endif #ifndef NO_WOLFSSL_SERVER #ifndef WOLFSSL_NO_TLS12 - AssertIntEQ(wolfSSL_read_early_data(serverTls12Ssl, earlyDataBuffer, - sizeof(earlyDataBuffer), &outSz), - BAD_FUNC_ARG); -#endif - AssertIntEQ(wolfSSL_read_early_data(serverSsl, earlyDataBuffer, - sizeof(earlyDataBuffer), &outSz), - WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_read_early_data(serverTls12Ssl, earlyDataBuffer, + sizeof(earlyDataBuffer), &outSz), BAD_FUNC_ARG); +#endif + ExpectIntEQ(wolfSSL_read_early_data(serverSsl, earlyDataBuffer, + sizeof(earlyDataBuffer), &outSz), WOLFSSL_FATAL_ERROR); #endif #endif #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_EARLY_DATA) - AssertIntLT(SSL_get_early_data_status(NULL), 0); + ExpectIntLT(SSL_get_early_data_status(NULL), 0); #endif @@ -55267,7 +66293,7 @@ #endif #endif - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ @@ -55308,12 +66334,12 @@ static int test_tls13_cipher_suites(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_SESSION_TICKET) && !defined(NO_WOLFSSL_SERVER) && \ defined(HAVE_ECC) && defined(BUILD_TLS_AES_128_GCM_SHA256) && \ defined(BUILD_TLS_AES_256_GCM_SHA384) - WOLFSSL_CTX* ctx; - WOLFSSL *ssl; + WOLFSSL_CTX* ctx = NULL; + WOLFSSL *ssl = NULL; int i; byte clientHello[] = { 0x16, 0x03, 0x03, 0x01, 0x9b, 0x01, 0x00, 0x01, @@ -55391,10 +66417,10 @@ #endif /* Set up wolfSSL context. */ - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); - AssertTrue(wolfSSL_CTX_use_certificate_file(ctx, eccCertFile, + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); + ExpectTrue(wolfSSL_CTX_use_certificate_file(ctx, eccCertFile, WOLFSSL_FILETYPE_PEM)); - AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, eccKeyFile, + ExpectTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, eccKeyFile, WOLFSSL_FILETYPE_PEM)); /* Read from 'msg'. */ wolfSSL_SetIORecv(ctx, CsRecv); @@ -55402,13 +66428,13 @@ wolfSSL_SetIOSend(ctx, CsSend); /* Test cipher suite list with many copies of a cipher suite. */ - AssertNotNull(ssl = wolfSSL_new(ctx)); + ExpectNotNull(ssl = wolfSSL_new(ctx)); msg.buffer = clientHello; msg.length = (unsigned int)sizeof(clientHello); wolfSSL_SetIOReadCtx(ssl, &msg); /* Force server to have as many occurrences of same cipher suite as * possible. */ - { + if (ssl != NULL) { Suites* suites = (Suites*)WOLFSSL_SUITES(ssl); suites->suiteSz = WOLFSSL_MAX_SUITE_SZ; for (i = 0; i < suites->suiteSz; i += 2) { @@ -55417,8 +66443,9 @@ } } /* Test multiple occurrences of same cipher suite. */ - wolfSSL_accept_TLSv13(ssl); + ExpectIntEQ(wolfSSL_accept_TLSv13(ssl), WOLFSSL_FATAL_ERROR); wolfSSL_free(ssl); + ssl = NULL; /* Set client order opposite to server order: * TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384 */ @@ -55428,63 +66455,63 @@ clientHello[csOff + 3] = TLS_AES_256_GCM_SHA384; /* Test server order negotiation. */ - AssertNotNull(ssl = wolfSSL_new(ctx)); + ExpectNotNull(ssl = wolfSSL_new(ctx)); msg.buffer = clientHello; msg.length = (unsigned int)sizeof(clientHello); wolfSSL_SetIOReadCtx(ssl, &msg); /* Server order: TLS13-AES256-GCM-SHA384:TLS13-AES128-GCM-SHA256 */ - AssertIntEQ(wolfSSL_set_cipher_list(ssl, serverCs), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_cipher_list(ssl, serverCs), WOLFSSL_SUCCESS); /* Negotiate cipher suites in server order: TLS13-AES256-GCM-SHA384 */ - wolfSSL_accept_TLSv13(ssl); + ExpectIntEQ(wolfSSL_accept_TLSv13(ssl), WOLFSSL_FATAL_ERROR); /* Check refined order - server order. */ - AssertIntEQ(ssl->suites->suiteSz, 4); - AssertIntEQ(ssl->suites->suites[0], TLS13_BYTE); - AssertIntEQ(ssl->suites->suites[1], TLS_AES_256_GCM_SHA384); - AssertIntEQ(ssl->suites->suites[2], TLS13_BYTE); - AssertIntEQ(ssl->suites->suites[3], TLS_AES_128_GCM_SHA256); + ExpectIntEQ(ssl->suites->suiteSz, 4); + ExpectIntEQ(ssl->suites->suites[0], TLS13_BYTE); + ExpectIntEQ(ssl->suites->suites[1], TLS_AES_256_GCM_SHA384); + ExpectIntEQ(ssl->suites->suites[2], TLS13_BYTE); + ExpectIntEQ(ssl->suites->suites[3], TLS_AES_128_GCM_SHA256); wolfSSL_free(ssl); + ssl = NULL; /* Test client order negotiation. */ - AssertNotNull(ssl = wolfSSL_new(ctx)); + ExpectNotNull(ssl = wolfSSL_new(ctx)); msg.buffer = clientHello; msg.length = (unsigned int)sizeof(clientHello); wolfSSL_SetIOReadCtx(ssl, &msg); /* Server order: TLS13-AES256-GCM-SHA384:TLS13-AES128-GCM-SHA256 */ - AssertIntEQ(wolfSSL_set_cipher_list(ssl, serverCs), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_UseClientSuites(ssl), 0); + ExpectIntEQ(wolfSSL_set_cipher_list(ssl, serverCs), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseClientSuites(ssl), 0); /* Negotiate cipher suites in client order: TLS13-AES128-GCM-SHA256 */ - wolfSSL_accept_TLSv13(ssl); + ExpectIntEQ(wolfSSL_accept_TLSv13(ssl), WOLFSSL_FATAL_ERROR); /* Check refined order - client order. */ - AssertIntEQ(ssl->suites->suiteSz, 4); - AssertIntEQ(ssl->suites->suites[0], TLS13_BYTE); - AssertIntEQ(ssl->suites->suites[1], TLS_AES_128_GCM_SHA256); - AssertIntEQ(ssl->suites->suites[2], TLS13_BYTE); - AssertIntEQ(ssl->suites->suites[3], TLS_AES_256_GCM_SHA384); + ExpectIntEQ(ssl->suites->suiteSz, 4); + ExpectIntEQ(ssl->suites->suites[0], TLS13_BYTE); + ExpectIntEQ(ssl->suites->suites[1], TLS_AES_128_GCM_SHA256); + ExpectIntEQ(ssl->suites->suites[2], TLS13_BYTE); + ExpectIntEQ(ssl->suites->suites[3], TLS_AES_256_GCM_SHA384); wolfSSL_free(ssl); + ssl = NULL; /* Check duplicate detection is working. */ - AssertIntEQ(wolfSSL_CTX_set_cipher_list(ctx, dupCs), WOLFSSL_SUCCESS); - AssertIntEQ(ctx->suites->suiteSz, 4); - AssertIntEQ(ctx->suites->suites[0], TLS13_BYTE); - AssertIntEQ(ctx->suites->suites[1], TLS_AES_128_GCM_SHA256); - AssertIntEQ(ctx->suites->suites[2], TLS13_BYTE); - AssertIntEQ(ctx->suites->suites[3], TLS_AES_256_GCM_SHA384); + ExpectIntEQ(wolfSSL_CTX_set_cipher_list(ctx, dupCs), WOLFSSL_SUCCESS); + ExpectIntEQ(ctx->suites->suiteSz, 4); + ExpectIntEQ(ctx->suites->suites[0], TLS13_BYTE); + ExpectIntEQ(ctx->suites->suites[1], TLS_AES_128_GCM_SHA256); + ExpectIntEQ(ctx->suites->suites[2], TLS13_BYTE); + ExpectIntEQ(ctx->suites->suites[3], TLS_AES_256_GCM_SHA384); #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SET_CIPHER_BYTES) - AssertIntEQ(wolfSSL_CTX_set_cipher_list_bytes(ctx, dupCsBytes, + ExpectIntEQ(wolfSSL_CTX_set_cipher_list_bytes(ctx, dupCsBytes, sizeof(dupCsBytes)), WOLFSSL_SUCCESS); - AssertIntEQ(ctx->suites->suiteSz, 4); - AssertIntEQ(ctx->suites->suites[0], TLS13_BYTE); - AssertIntEQ(ctx->suites->suites[1], TLS_AES_256_GCM_SHA384); - AssertIntEQ(ctx->suites->suites[2], TLS13_BYTE); - AssertIntEQ(ctx->suites->suites[3], TLS_AES_128_GCM_SHA256); + ExpectIntEQ(ctx->suites->suiteSz, 4); + ExpectIntEQ(ctx->suites->suites[0], TLS13_BYTE); + ExpectIntEQ(ctx->suites->suites[1], TLS_AES_256_GCM_SHA384); + ExpectIntEQ(ctx->suites->suites[2], TLS13_BYTE); + ExpectIntEQ(ctx->suites->suites[3], TLS_AES_128_GCM_SHA256); #endif wolfSSL_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #endif @@ -55559,11 +66586,10 @@ static int test_DhCallbacks(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && !defined(NO_DH) && \ !defined(NO_AES) && defined(HAVE_AES_CBC) && \ defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) - EXPECT_DECLS; WOLFSSL_CTX *ctx = NULL; WOLFSSL *ssl = NULL; int test; @@ -55605,8 +66631,8 @@ &func_cb_server, NULL), TEST_SUCCESS); /* Test fail */ - XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); - XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); /* set callbacks to use DH functions */ func_cb_client.ctx_ready = &test_dh_ctx_setup; @@ -55619,10 +66645,8 @@ ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, &func_cb_server, NULL), TEST_FAIL); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #endif /* HAVE_PK_CALLBACKS */ @@ -55631,371 +66655,249 @@ #ifdef TEST_RESEED_INTERVAL static int test_wc_RNG_GenerateBlock_Reseed(void) { - int i, ret; + EXPECT_DECLS; + int i; WC_RNG rng; byte key[32]; - ret = wc_InitRng(&rng); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - for (i = 0; i < WC_RESEED_INTERVAL + 10; i++) { - ret = wc_RNG_GenerateBlock(&rng, key, sizeof(key)); - if (ret != 0) { - break; - } - } + ExpectIntEQ(wc_InitRng(&rng), 0); + for (i = 0; i < WC_RESEED_INTERVAL + 10; i++) { + ExpectIntEQ(wc_RNG_GenerateBlock(&rng, key, sizeof(key)), 0); } + DoExpectIntEQ(wc_FreeRng(&rng), 0); - wc_FreeRng(&rng); - - return TEST_RES_CHECK(ret == 0); + return EXPECT_RESULT(); } #endif /* TEST_RESEED_INTERVAL */ static int test_wc_RNG_GenerateBlock(void) { - int i, ret; + EXPECT_DECLS; + int i; WC_RNG rng; byte key[32]; - ret = wc_InitRng(&rng); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - for (i = 0; i < 10; i++) { - ret = wc_RNG_GenerateBlock(&rng, key, sizeof(key)); - if (ret != 0) { - break; - } - } + ExpectIntEQ(wc_InitRng(&rng), 0); + for (i = 0; i < 10; i++) { + ExpectIntEQ(wc_RNG_GenerateBlock(&rng, key, sizeof(key)), 0); } + DoExpectIntEQ(wc_FreeRng(&rng), 0); - wc_FreeRng(&rng); + return EXPECT_RESULT(); +} - (void)rng; /* for WC_NO_RNG case */ - (void)key; +#endif /* HAVE_HASHDRBG */ - return TEST_RES_CHECK(ret == 0); -} -#endif /* * Testing get_rand_digit */ static int test_get_rand_digit(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(WC_NO_RNG) && defined(WOLFSSL_PUBLIC_MP) - int ret = 0; WC_RNG rng; mp_digit d; - ret = wc_InitRng(&rng); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = get_rand_digit(&rng, &d); - } - if (ret == 0) { - ret = get_rand_digit(NULL, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = get_rand_digit(NULL, &d); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = get_rand_digit(&rng, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } + ExpectIntEQ(wc_InitRng(&rng), 0); - if (ret == 0) { - ret = wc_FreeRng(&rng); - } + ExpectIntEQ(get_rand_digit(&rng, &d), 0); + ExpectIntEQ(get_rand_digit(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(get_rand_digit(NULL, &d), BAD_FUNC_ARG); + ExpectIntEQ(get_rand_digit(&rng, NULL), BAD_FUNC_ARG); - res = TEST_RES_CHECK(ret == 0); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; + return EXPECT_RESULT(); +} /* End test_get_rand_digit*/ -}/* End test_get_rand_digit*/ /* * Testing get_digit_count */ static int test_get_digit_count(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(WOLFSSL_SP_MATH) && defined(WOLFSSL_PUBLIC_MP) - int ret = 0; mp_int a; - if (mp_init(&a) != MP_OKAY) { - ret = -1; - } - if (ret == 0) { - ret = get_digit_count(NULL); - } - if (ret == 0) { - ret = get_digit_count(&a); - } + XMEMSET(&a, 0, sizeof(mp_int)); - mp_clear(&a); + ExpectIntEQ(mp_init(&a), 0); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(get_digit_count(NULL), 0); + ExpectIntEQ(get_digit_count(&a), 0); + + mp_clear(&a); #endif - return res; + return EXPECT_RESULT(); +} /* End test_get_digit_count*/ -}/* End test_get_digit_count*/ /* * Testing mp_cond_copy */ static int test_mp_cond_copy(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(HAVE_ECC) || defined(WOLFSSL_MP_COND_COPY)) && \ defined(WOLFSSL_PUBLIC_MP) - int ret = 0; - mp_int a; - mp_int b; - int copy = 0; + mp_int a; + mp_int b; + int copy = 0; - if (mp_init(&a) != MP_OKAY) { - ret = -1; - } - if (ret == 0) { - if (mp_init(&b) != MP_OKAY) { - ret = -1; - } - } - if (ret == 0) { - ret = mp_cond_copy(NULL, copy, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = mp_cond_copy(NULL, copy, &b); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = mp_cond_copy(&a, copy, NULL); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = mp_cond_copy(&a, copy, &b); - } + XMEMSET(&a, 0, sizeof(mp_int)); + XMEMSET(&b, 0, sizeof(mp_int)); + + ExpectIntEQ(mp_init(&a), MP_OKAY); + ExpectIntEQ(mp_init(&b), MP_OKAY); + + ExpectIntEQ(mp_cond_copy(NULL, copy, NULL), BAD_FUNC_ARG); + ExpectIntEQ(mp_cond_copy(NULL, copy, &b), BAD_FUNC_ARG); + ExpectIntEQ(mp_cond_copy(&a, copy, NULL), BAD_FUNC_ARG); + ExpectIntEQ(mp_cond_copy(&a, copy, &b), 0); mp_clear(&a); mp_clear(&b); - - res = TEST_RES_CHECK(ret == 0); #endif - return res; + return EXPECT_RESULT(); +} /* End test_mp_cond_copy*/ -}/* End test_mp_cond_copy*/ /* * Testing mp_rand */ static int test_mp_rand(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WC_RSA_BLINDING) && defined(WOLFSSL_PUBLIC_MP) - int ret = 0; - mp_int a; - int digits = 1; - WC_RNG rng; + mp_int a; + WC_RNG rng; + int digits = 1; - if (mp_init(&a) != MP_OKAY) { - ret = -1; - } - if (ret == 0) { - ret = wc_InitRng(&rng); - } + XMEMSET(&a, 0, sizeof(mp_int)); + XMEMSET(&rng, 0, sizeof(WC_RNG)); - if (ret == 0) { - ret = mp_rand(&a, digits, NULL); - if (ret == MISSING_RNG_E) { - ret = 0; - } - } - if (ret == 0) { - ret = mp_rand(NULL, digits, &rng); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = mp_rand(&a, 0, &rng); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - ret = mp_rand(&a, digits, &rng); - } + ExpectIntEQ(mp_init(&a), MP_OKAY); + ExpectIntEQ(wc_InitRng(&rng), 0); - mp_clear(&a); - wc_FreeRng(&rng); + ExpectIntEQ(mp_rand(&a, digits, NULL), MISSING_RNG_E); + ExpectIntEQ(mp_rand(NULL, digits, &rng), BAD_FUNC_ARG); + ExpectIntEQ(mp_rand(&a, 0, &rng), BAD_FUNC_ARG); + ExpectIntEQ(mp_rand(&a, digits, &rng), 0); - res = TEST_RES_CHECK(ret == 0); + mp_clear(&a); + DoExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; -}/* End test_mp_rand*/ + return EXPECT_RESULT(); +} /* End test_mp_rand*/ + /* * Testing get_digit */ static int test_get_digit(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_PUBLIC_MP) - int ret = 0; - mp_int a; - int n = 0; + mp_int a; + int n = 0; - if (mp_init(&a) != MP_OKAY) { - ret = -1; - } - if (ret == 0) { - if (get_digit(NULL, n) != 0) { /* Should not hit this */ - ret = -1; - } - } - if (ret == 0) { - if (get_digit(NULL, n) == 0) { /* Should hit this */ - ret = 0; - } - } - if (ret == 0) { - if (get_digit(&a, n) != 0) { /* Should not hit this */ - ret = -1; - } - } - if (ret == 0) { - if (get_digit(&a, n) == 0) { /* Should hit this */ - ret = 0; - } - } + XMEMSET(&a, 0, sizeof(mp_int)); - mp_clear(&a); + ExpectIntEQ(mp_init(&a), MP_OKAY); + ExpectIntEQ(get_digit(NULL, n), 0); + ExpectIntEQ(get_digit(&a, n), 0); - res = TEST_RES_CHECK(ret == 0); + mp_clear(&a); #endif - return res; -}/* End test_get_digit*/ + return EXPECT_RESULT(); +} /* End test_get_digit*/ + /* * Testing wc_export_int */ static int test_wc_export_int(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(HAVE_ECC) || defined(WOLFSSL_EXPORT_INT)) && \ defined(WOLFSSL_PUBLIC_MP) - int ret = 0; - mp_int mp; - byte buf[32]; - word32 keySz = (word32)sizeof(buf); - word32 len = (word32)sizeof(buf); + mp_int mp; + byte buf[32]; + word32 keySz = (word32)sizeof(buf); + word32 len = (word32)sizeof(buf); - if (mp_init(&mp) != MP_OKAY) { - ret = -1; - } - if (ret == 0) { - ret = mp_set(&mp, 1234); - } - if (ret == 0) { - ret = wc_export_int(NULL, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN); - if (ret == BAD_FUNC_ARG) { - ret = 0; - } - } - if (ret == 0) { - len = sizeof(buf)-1; - ret = wc_export_int(&mp, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN); - if (ret == BUFFER_E) { - ret = 0; - } - } - if (ret == 0) { - len = sizeof(buf); - ret = wc_export_int(&mp, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN); - } - if (ret == 0) { - len = 4; /* test input too small */ - ret = wc_export_int(&mp, buf, &len, 0, WC_TYPE_HEX_STR); - if (ret == BUFFER_E) { - ret = 0; - } - } - if (ret == 0) { - len = sizeof(buf); - ret = wc_export_int(&mp, buf, &len, 0, WC_TYPE_HEX_STR); - /* hex version of 1234 is 04D2 and should be 4 digits + 1 null */ - if (ret == 0 && len != 5) { - ret = BAD_FUNC_ARG; - } - } + XMEMSET(&mp, 0, sizeof(mp_int)); - mp_clear(&mp); + ExpectIntEQ(mp_init(&mp), MP_OKAY); + ExpectIntEQ(mp_set(&mp, 1234), 0); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_export_int(NULL, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN), + BAD_FUNC_ARG); + len = sizeof(buf)-1; + ExpectIntEQ(wc_export_int(&mp, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN), + BUFFER_E); + len = sizeof(buf); + ExpectIntEQ(wc_export_int(&mp, buf, &len, keySz, WC_TYPE_UNSIGNED_BIN), 0); + len = 4; /* test input too small */ + ExpectIntEQ(wc_export_int(&mp, buf, &len, 0, WC_TYPE_HEX_STR), BUFFER_E); + len = sizeof(buf); + ExpectIntEQ(wc_export_int(&mp, buf, &len, 0, WC_TYPE_HEX_STR), 0); + /* hex version of 1234 is 04D2 and should be 4 digits + 1 null */ + ExpectIntEQ(len, 5); + + mp_clear(&mp); #endif - return res; + return EXPECT_RESULT(); + +} /* End test_wc_export_int*/ -}/* End test_wc_export_int*/ static int test_wc_InitRngNonce(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(WC_NO_RNG) && !defined(HAVE_SELFTEST) && \ - (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION >= 2)) - int ret; - WC_RNG rng; - byte nonce[] = "\x0D\x74\xDB\x42\xA9\x10\x77\xDE" - "\x45\xAC\x13\x7A\xE1\x48\xAF\x16"; - word32 nonceSz = sizeof(nonce); - - ret = wc_InitRngNonce(&rng, nonce, nonceSz); - wc_FreeRng(&rng); + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + HAVE_FIPS_VERSION >= 2)) + WC_RNG rng; + byte nonce[] = "\x0D\x74\xDB\x42\xA9\x10\x77\xDE" + "\x45\xAC\x13\x7A\xE1\x48\xAF\x16"; + word32 nonceSz = sizeof(nonce); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_InitRngNonce(&rng, nonce, nonceSz), 0); + ExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; -}/* End test_wc_InitRngNonce*/ + return EXPECT_RESULT(); +} /* End test_wc_InitRngNonce*/ + /* * Testing wc_InitRngNonce_ex */ static int test_wc_InitRngNonce_ex(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(WC_NO_RNG) && !defined(HAVE_SELFTEST) && \ - (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION >= 2)) - int ret; - WC_RNG rng; - byte nonce[] = "\x0D\x74\xDB\x42\xA9\x10\x77\xDE" - "\x45\xAC\x13\x7A\xE1\x48\xAF\x16"; - word32 nonceSz = sizeof(nonce); - - ret = wc_InitRngNonce_ex(&rng, nonce, nonceSz, HEAP_HINT, testDevId); - wc_FreeRng(&rng); + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + HAVE_FIPS_VERSION >= 2)) + WC_RNG rng; + byte nonce[] = "\x0D\x74\xDB\x42\xA9\x10\x77\xDE" + "\x45\xAC\x13\x7A\xE1\x48\xAF\x16"; + word32 nonceSz = sizeof(nonce); - res = TEST_RES_CHECK(ret == 0); + ExpectIntEQ(wc_InitRngNonce_ex(&rng, nonce, nonceSz, HEAP_HINT, testDevId), + 0); + ExpectIntEQ(wc_FreeRng(&rng), 0); #endif - return res; -}/*End test_wc_InitRngNonce_ex*/ + return EXPECT_RESULT(); +} /* End test_wc_InitRngNonce_ex */ static int test_wolfSSL_X509_CRL(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) - - X509_CRL *crl; + X509_CRL *crl = NULL; char pem[][100] = { "./certs/crl/crl.pem", "./certs/crl/crl2.pem", @@ -56005,7 +66907,7 @@ "" }; #ifndef NO_BIO - BIO *bio; + BIO *bio = NULL; #endif #ifdef HAVE_TEST_d2i_X509_CRL_fp @@ -56015,63 +66917,82 @@ ""}; #endif - XFILE fp; + XFILE fp = XBADFILE; int i; for (i = 0; pem[i][0] != '\0'; i++) { - fp = XFOPEN(pem[i], "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, NULL, NULL)); - AssertNotNull(crl); + ExpectTrue((fp = XFOPEN(pem[i], "rb")) != XBADFILE); + ExpectNotNull(crl = (X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, + NULL, NULL)); + ExpectNotNull(crl); X509_CRL_free(crl); - XFCLOSE(fp); - fp = XFOPEN(pem[i], "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull((X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)&crl, NULL, NULL)); - AssertNotNull(crl); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } + ExpectTrue((fp = XFOPEN(pem[i], "rb")) != XBADFILE); + ExpectNotNull((X509_CRL *)PEM_read_X509_CRL(fp, (X509_CRL **)&crl, NULL, + NULL)); + if (EXPECT_FAIL()) { + crl = NULL; + } + ExpectNotNull(crl); X509_CRL_free(crl); - XFCLOSE(fp); + crl = NULL; + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } } #ifndef NO_BIO for (i = 0; pem[i][0] != '\0'; i++) { - AssertNotNull(bio = BIO_new_file(pem[i], "rb")); - AssertNotNull(crl = PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL)); + ExpectNotNull(bio = BIO_new_file(pem[i], "rb")); + ExpectNotNull(crl = PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL)); X509_CRL_free(crl); + crl = NULL; BIO_free(bio); + bio = NULL; } #endif #ifdef HAVE_TEST_d2i_X509_CRL_fp for (i = 0; der[i][0] != '\0'; i++) { - fp = XFOPEN(der[i], "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL *)d2i_X509_CRL_fp((fp, X509_CRL **)NULL)); - AssertNotNull(crl); + ExpectTrue((fp = XFOPEN(der[i], "rb")) != XBADFILE); + ExpectTrue((fp != XBADFILE)); + ExpectNotNull(crl = (X509_CRL *)d2i_X509_CRL_fp((fp, X509_CRL **)NULL)); + ExpectNotNull(crl); X509_CRL_free(crl); - XFCLOSE(fp); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } fp = XFOPEN(der[i], "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull((X509_CRL *)d2i_X509_CRL_fp(fp, (X509_CRL **)&crl)); - AssertNotNull(crl); + ExpectTrue((fp != XBADFILE)); + ExpectNotNull((X509_CRL *)d2i_X509_CRL_fp(fp, (X509_CRL **)&crl)); + if (EXPECT_FAIL()) { + crl = NULL; + } + ExpectNotNull(crl); X509_CRL_free(crl); - XFCLOSE(fp); + crl = NULL; + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } } #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_load_crl_file(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) && !defined(NO_FILESYSTEM) && \ - !defined(NO_RSA) && !defined(NO_BIO) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) && !defined(NO_FILESYSTEM) && \ + !defined(NO_STDIO_FILESYSTEM) && !defined(NO_RSA) && !defined(NO_BIO) int i; char pem[][100] = { "./certs/crl/crl.pem", @@ -56079,6 +67000,9 @@ "./certs/crl/caEccCrl.pem", "./certs/crl/eccCliCRL.pem", "./certs/crl/eccSrvCRL.pem", + #ifdef WC_RSA_PSS + "./certs/crl/crl_rsapss.pem", + #endif "" }; char der[][100] = { @@ -56094,6 +67018,10 @@ ExpectIntEQ(X509_LOOKUP_load_file(lookup, "certs/ca-cert.pem", X509_FILETYPE_PEM), 1); +#ifdef WC_RSA_PSS + ExpectIntEQ(X509_LOOKUP_load_file(lookup, "certs/rsapss/ca-rsapss.pem", + X509_FILETYPE_PEM), 1); +#endif ExpectIntEQ(X509_LOOKUP_load_file(lookup, "certs/server-revoked-cert.pem", X509_FILETYPE_PEM), 1); if (store) { @@ -56114,6 +67042,11 @@ ExpectIntEQ(wolfSSL_CertManagerVerify(store->cm, "certs/server-revoked-cert.pem", WOLFSSL_FILETYPE_PEM), CRL_CERT_REVOKED); +#ifdef WC_RSA_PSS + ExpectIntEQ(wolfSSL_CertManagerVerify(store->cm, + "certs/rsapss/server-rsapss-cert.pem", WOLFSSL_FILETYPE_PEM), + CRL_CERT_REVOKED); +#endif } /* once feeing store */ X509_STORE_free(store); @@ -56153,20 +67086,43 @@ X509_STORE_free(store); store = NULL; +#endif + return EXPECT_RESULT(); +} - res = EXPECT_RESULT(); +static int test_wolfSSL_i2d_X509(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA) + const unsigned char* cert_buf = server_cert_der_2048; + unsigned char* out = NULL; + unsigned char* tmp = NULL; + X509* cert = NULL; + + ExpectNotNull(d2i_X509(&cert, &cert_buf, sizeof_server_cert_der_2048)); + /* Pointer should be advanced */ + ExpectPtrGT(cert_buf, server_cert_der_2048); + ExpectIntGT(i2d_X509(cert, &out), 0); + ExpectNotNull(out); + tmp = out; + ExpectIntGT(i2d_X509(cert, &tmp), 0); + ExpectPtrGT(tmp, out); + + if (out != NULL) + XFREE(out, NULL, DYNAMIC_TYPE_OPENSSL); + X509_free(cert); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_d2i_X509_REQ(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_CERT_REQ) && !defined(NO_RSA) && !defined(NO_BIO) && \ (defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) && \ !defined(WOLFSSL_SP_MATH) - /* ./certs/csr.signed.der, ./certs/csr.ext.der, and ./certs/csr.attr.der were - * generated by libest + /* ./certs/csr.signed.der, ./certs/csr.ext.der, and ./certs/csr.attr.der + * were generated by libest * ./certs/csr.attr.der contains sample attributes * ./certs/csr.ext.der contains sample extensions */ const char* csrFile = "./certs/csr.signed.der"; @@ -56180,235 +67136,293 @@ */ #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) const char* csrDsaFile = "./certs/csr.dsa.pem"; - XFILE f; + XFILE f = XBADFILE; #endif BIO* bio = NULL; X509* req = NULL; EVP_PKEY *pub_key = NULL; { - AssertNotNull(bio = BIO_new_file(csrFile, "rb")); - AssertNotNull(d2i_X509_REQ_bio(bio, &req)); + ExpectNotNull(bio = BIO_new_file(csrFile, "rb")); + ExpectNotNull(d2i_X509_REQ_bio(bio, &req)); /* * Extract the public key from the CSR */ - AssertNotNull(pub_key = X509_REQ_get_pubkey(req)); + ExpectNotNull(pub_key = X509_REQ_get_pubkey(req)); /* * Verify the signature in the CSR */ - AssertIntEQ(X509_REQ_verify(req, pub_key), 1); + ExpectIntEQ(X509_REQ_verify(req, pub_key), 1); X509_free(req); + req = NULL; BIO_free(bio); + bio = NULL; EVP_PKEY_free(pub_key); + pub_key = NULL; } { #ifdef OPENSSL_ALL - X509_ATTRIBUTE* attr; - ASN1_TYPE *at; + X509_ATTRIBUTE* attr = NULL; + ASN1_TYPE *at = NULL; #endif - AssertNotNull(bio = BIO_new_file(csrPopFile, "rb")); - AssertNotNull(d2i_X509_REQ_bio(bio, &req)); + ExpectNotNull(bio = BIO_new_file(csrPopFile, "rb")); + ExpectNotNull(d2i_X509_REQ_bio(bio, &req)); /* * Extract the public key from the CSR */ - AssertNotNull(pub_key = X509_REQ_get_pubkey(req)); + ExpectNotNull(pub_key = X509_REQ_get_pubkey(req)); /* * Verify the signature in the CSR */ - AssertIntEQ(X509_REQ_verify(req, pub_key), 1); + ExpectIntEQ(X509_REQ_verify(req, pub_key), 1); #ifdef OPENSSL_ALL /* * Obtain the challenge password from the CSR */ - AssertIntEQ(X509_REQ_get_attr_by_NID(req, NID_pkcs9_challengePassword, -1), - 1); - AssertNotNull(attr = X509_REQ_get_attr(req, 1)); - AssertNotNull(at = X509_ATTRIBUTE_get0_type(attr, 0)); - AssertNotNull(at->value.asn1_string); - AssertStrEQ((char*)ASN1_STRING_data(at->value.asn1_string), "2xIE+qqp/rhyTXP+"); - AssertIntEQ(X509_get_ext_by_NID(req, NID_subject_alt_name, -1), -1); + ExpectIntEQ(X509_REQ_get_attr_by_NID(req, NID_pkcs9_challengePassword, + -1), 1); + ExpectNotNull(attr = X509_REQ_get_attr(req, 1)); + ExpectNotNull(at = X509_ATTRIBUTE_get0_type(attr, 0)); + ExpectNotNull(at->value.asn1_string); + ExpectStrEQ((char*)ASN1_STRING_data(at->value.asn1_string), + "2xIE+qqp/rhyTXP+"); + ExpectIntEQ(X509_get_ext_by_NID(req, NID_subject_alt_name, -1), -1); #endif X509_free(req); + req = NULL; BIO_free(bio); + bio = NULL; EVP_PKEY_free(pub_key); + pub_key = NULL; } { #ifdef OPENSSL_ALL - X509_ATTRIBUTE* attr; - ASN1_TYPE *at; + X509_ATTRIBUTE* attr = NULL; + ASN1_TYPE *at = NULL; STACK_OF(X509_EXTENSION) *exts = NULL; #endif - AssertNotNull(bio = BIO_new_file(csrExtFile, "rb")); + ExpectNotNull(bio = BIO_new_file(csrExtFile, "rb")); /* This CSR contains an Extension Request attribute so * we test extension parsing in a CSR attribute here. */ - AssertNotNull(d2i_X509_REQ_bio(bio, &req)); + ExpectNotNull(d2i_X509_REQ_bio(bio, &req)); /* * Extract the public key from the CSR */ - AssertNotNull(pub_key = X509_REQ_get_pubkey(req)); + ExpectNotNull(pub_key = X509_REQ_get_pubkey(req)); /* * Verify the signature in the CSR */ - AssertIntEQ(X509_REQ_verify(req, pub_key), 1); + ExpectIntEQ(X509_REQ_verify(req, pub_key), 1); #ifdef OPENSSL_ALL - AssertNotNull(exts = (STACK_OF(X509_EXTENSION)*)X509_REQ_get_extensions(req)); - AssertIntEQ(sk_X509_EXTENSION_num(exts), 2); + ExpectNotNull(exts = (STACK_OF(X509_EXTENSION)*)X509_REQ_get_extensions( + req)); + ExpectIntEQ(sk_X509_EXTENSION_num(exts), 2); sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); /* * Obtain the challenge password from the CSR */ - AssertIntEQ(X509_REQ_get_attr_by_NID(req, NID_pkcs9_challengePassword, -1), - 0); - AssertNotNull(attr = X509_REQ_get_attr(req, 0)); - AssertNotNull(at = X509_ATTRIBUTE_get0_type(attr, 0)); - AssertNotNull(at->value.asn1_string); - AssertStrEQ((char*)ASN1_STRING_data(at->value.asn1_string), "IGCu/xNL4/0/wOgo"); - AssertIntGE(X509_get_ext_by_NID(req, NID_key_usage, -1), 0); - AssertIntGE(X509_get_ext_by_NID(req, NID_subject_alt_name, -1), 0); + ExpectIntEQ(X509_REQ_get_attr_by_NID(req, NID_pkcs9_challengePassword, + -1), 0); + ExpectNotNull(attr = X509_REQ_get_attr(req, 0)); + ExpectNotNull(at = X509_ATTRIBUTE_get0_type(attr, 0)); + ExpectNotNull(at->value.asn1_string); + ExpectStrEQ((char*)ASN1_STRING_data(at->value.asn1_string), "IGCu/xNL4/0/wOgo"); + ExpectIntGE(X509_get_ext_by_NID(req, NID_key_usage, -1), 0); + ExpectIntGE(X509_get_ext_by_NID(req, NID_subject_alt_name, -1), 0); #endif X509_free(req); + req = NULL; BIO_free(bio); + bio = NULL; EVP_PKEY_free(pub_key); + pub_key = NULL; } #if !defined(NO_DSA) && !defined(HAVE_SELFTEST) { - AssertNotNull(bio = BIO_new_file(csrDsaFile, "rb")); - AssertNotNull(PEM_read_bio_X509_REQ(bio, &req, NULL, NULL)); + ExpectNotNull(bio = BIO_new_file(csrDsaFile, "rb")); + ExpectNotNull(PEM_read_bio_X509_REQ(bio, &req, NULL, NULL)); /* * Extract the public key from the CSR */ - AssertNotNull(pub_key = X509_REQ_get_pubkey(req)); + ExpectNotNull(pub_key = X509_REQ_get_pubkey(req)); /* * Verify the signature in the CSR */ - AssertIntEQ(X509_REQ_verify(req, pub_key), 1); + ExpectIntEQ(X509_REQ_verify(req, pub_key), 1); X509_free(req); + req = NULL; BIO_free(bio); /* Run the same test, but with a file pointer instead of a BIO. * (PEM_read_X509_REQ)*/ - AssertTrue((f = XFOPEN(csrDsaFile, "rb")) != XBADFILE); - AssertNotNull(PEM_read_X509_REQ(f, &req, NULL, NULL)); - AssertIntEQ(X509_REQ_verify(req, pub_key), 1); + ExpectTrue((f = XFOPEN(csrDsaFile, "rb")) != XBADFILE); + ExpectNotNull(PEM_read_X509_REQ(f, &req, NULL, NULL)); + ExpectIntEQ(X509_REQ_verify(req, pub_key), 1); X509_free(req); EVP_PKEY_free(pub_key); } - - res = TEST_RES_CHECK(1); #endif /* !NO_DSA && !HAVE_SELFTEST */ #endif /* WOLFSSL_CERT_REQ && (OPENSSL_ALL || OPENSSL_EXTRA) */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_read_X509(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_CRL) && !defined(NO_FILESYSTEM) && \ !defined(NO_RSA) X509 *x509 = NULL; - XFILE fp; + XFILE fp = XBADFILE; - fp = XFOPEN(svrCertFile, "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(x509 = (X509 *)PEM_read_X509(fp, (X509 **)NULL, NULL, NULL)); + ExpectTrue((fp = XFOPEN(svrCertFile, "rb")) != XBADFILE); + ExpectNotNull(x509 = (X509 *)PEM_read_X509(fp, (X509 **)NULL, NULL, NULL)); X509_free(x509); - XFCLOSE(fp); - - res = TEST_RES_CHECK(1); + if (fp != XBADFILE) + XFCLOSE(fp); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_read(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_BIO) const char* filename = "./certs/server-keyEnc.pem"; - XFILE fp; + XFILE fp = XBADFILE; char* name = NULL; char* header = NULL; byte* data = NULL; long len; EVP_CIPHER_INFO cipher; - WOLFSSL_BIO* bio; - byte* fileData; - size_t fileDataSz; + WOLFSSL_BIO* bio = NULL; + byte* fileData = NULL; + size_t fileDataSz = 0; byte* out; - fp = XFOPEN(filename, "rb"); - AssertTrue((fp != XBADFILE)); + ExpectNotNull(bio = BIO_new_file(filename, "rb")); + ExpectIntEQ(PEM_read_bio(bio, NULL, &header, &data, &len), 0); + ExpectIntEQ(PEM_read_bio(bio, &name, NULL, &data, &len), 0); + ExpectIntEQ(PEM_read_bio(bio, &name, &header, NULL, &len), 0); + ExpectIntEQ(PEM_read_bio(bio, &name, &header, &data, NULL), 0); + + ExpectIntEQ(PEM_read_bio(bio, &name, &header, &data, &len), 1); + ExpectIntEQ(XSTRNCMP(name, "RSA PRIVATE KEY", 15), 0); + ExpectIntGT(XSTRLEN(header), 0); + ExpectIntGT(len, 0); + XFREE(name, NULL, DYNAMIC_TYPE_TMP_BUFFER); + name = NULL; + XFREE(header, NULL, DYNAMIC_TYPE_TMP_BUFFER); + header = NULL; + XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER); + data = NULL; + BIO_free(bio); + bio = NULL; + + ExpectTrue((fp = XFOPEN(filename, "rb")) != XBADFILE); /* Fail cases. */ - AssertIntEQ(PEM_read(fp, NULL, &header, &data, &len), WOLFSSL_FAILURE); - AssertIntEQ(PEM_read(fp, &name, NULL, &data, &len), WOLFSSL_FAILURE); - AssertIntEQ(PEM_read(fp, &name, &header, NULL, &len), WOLFSSL_FAILURE); - AssertIntEQ(PEM_read(fp, &name, &header, &data, NULL), WOLFSSL_FAILURE); - - AssertIntEQ(PEM_read(fp, &name, &header, &data, &len), WOLFSSL_SUCCESS); - - AssertIntEQ(XSTRNCMP(name, "RSA PRIVATE KEY", 15), 0); - AssertIntGT(XSTRLEN(header), 0); - AssertIntGT(len, 0); - - AssertIntEQ(XFSEEK(fp, 0, SEEK_END), 0); - AssertIntGT((fileDataSz = XFTELL(fp)), 0); - AssertIntEQ(XFSEEK(fp, 0, SEEK_SET), 0); - AssertNotNull(fileData = (unsigned char*)XMALLOC(fileDataSz, NULL, - DYNAMIC_TYPE_TMP_BUFFER)); - AssertIntEQ(XFREAD(fileData, 1, fileDataSz, fp), fileDataSz); - XFCLOSE(fp); + ExpectIntEQ(PEM_read(fp, NULL, &header, &data, &len), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_read(fp, &name, NULL, &data, &len), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_read(fp, &name, &header, NULL, &len), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_read(fp, &name, &header, &data, NULL), WOLFSSL_FAILURE); + + ExpectIntEQ(PEM_read(fp, &name, &header, &data, &len), WOLFSSL_SUCCESS); + + ExpectIntEQ(XSTRNCMP(name, "RSA PRIVATE KEY", 15), 0); + ExpectIntGT(XSTRLEN(header), 0); + ExpectIntGT(len, 0); + + ExpectIntEQ(XFSEEK(fp, 0, SEEK_END), 0); + ExpectIntGT((fileDataSz = XFTELL(fp)), 0); + ExpectIntEQ(XFSEEK(fp, 0, SEEK_SET), 0); + ExpectNotNull(fileData = (unsigned char*)XMALLOC(fileDataSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(XFREAD(fileData, 1, fileDataSz, fp), fileDataSz); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - AssertNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + + /* Fail cases. */ + ExpectIntEQ(PEM_write_bio(NULL, name, header, data, len), 0); + ExpectIntEQ(PEM_write_bio(bio, NULL, header, data, len), 0); + ExpectIntEQ(PEM_write_bio(bio, name, NULL, data, len), 0); + ExpectIntEQ(PEM_write_bio(bio, name, header, NULL, len), 0); + + ExpectIntEQ(PEM_write_bio(bio, name, header, data, len), fileDataSz); + ExpectIntEQ(wolfSSL_BIO_get_mem_data(bio, &out), fileDataSz); + ExpectIntEQ(XMEMCMP(out, fileData, fileDataSz), 0); /* Fail cases. */ - AssertIntEQ(PEM_write_bio(NULL, name, header, data, len), 0); - AssertIntEQ(PEM_write_bio(bio, NULL, header, data, len), 0); - AssertIntEQ(PEM_write_bio(bio, name, NULL, data, len), 0); - AssertIntEQ(PEM_write_bio(bio, name, header, NULL, len), 0); - - AssertIntEQ(PEM_write_bio(bio, name, header, data, len), fileDataSz); - AssertIntEQ(wolfSSL_BIO_get_mem_data(bio, &out), fileDataSz); - AssertIntEQ(XMEMCMP(out, fileData, fileDataSz), 0); + ExpectIntEQ(PEM_write(XBADFILE, name, header, data, len), 0); + ExpectIntEQ(PEM_write(stderr, NULL, header, data, len), 0); + ExpectIntEQ(PEM_write(stderr, name, NULL, data, len), 0); + ExpectIntEQ(PEM_write(stderr, name, header, NULL, len), 0); + /* Pass case */ + ExpectIntEQ(PEM_write(stderr, name, header, data, len), fileDataSz); + + XFREE(name, NULL, DYNAMIC_TYPE_TMP_BUFFER); + name = NULL; + XFREE(header, NULL, DYNAMIC_TYPE_TMP_BUFFER); + header = NULL; + XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER); + data = NULL; + /* Read out of a fixed buffer BIO - forces malloc in PEM_read_bio. */ + ExpectIntEQ(PEM_read_bio(bio, &name, &header, &data, &len), 1); + ExpectIntEQ(XSTRNCMP(name, "RSA PRIVATE KEY", 15), 0); + ExpectIntGT(XSTRLEN(header), 0); + ExpectIntGT(len, 0); /* Fail cases. */ - AssertIntEQ(PEM_get_EVP_CIPHER_INFO(NULL, &cipher), WOLFSSL_FAILURE); - AssertIntEQ(PEM_get_EVP_CIPHER_INFO(header, NULL), WOLFSSL_FAILURE); - AssertIntEQ(PEM_get_EVP_CIPHER_INFO((char*)"", &cipher), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_get_EVP_CIPHER_INFO(NULL, &cipher), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_get_EVP_CIPHER_INFO(header, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_get_EVP_CIPHER_INFO((char*)"", &cipher), WOLFSSL_FAILURE); #ifndef NO_DES3 - AssertIntEQ(PEM_get_EVP_CIPHER_INFO(header, &cipher), WOLFSSL_SUCCESS); + ExpectIntEQ(PEM_get_EVP_CIPHER_INFO(header, &cipher), WOLFSSL_SUCCESS); #endif /* Fail cases. */ - AssertIntEQ(PEM_do_header(&cipher, NULL, &len, PasswordCallBack, - (void*)"yassl123"), WOLFSSL_FAILURE); - AssertIntEQ(PEM_do_header(&cipher, data, NULL, PasswordCallBack, - (void*)"yassl123"), WOLFSSL_FAILURE); - AssertIntEQ(PEM_do_header(&cipher, data, &len, NULL, - (void*)"yassl123"), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_do_header(NULL, data, &len, PasswordCallBack, + (void*)"yassl123"), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_do_header(&cipher, NULL, &len, PasswordCallBack, + (void*)"yassl123"), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_do_header(&cipher, data, NULL, PasswordCallBack, + (void*)"yassl123"), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_do_header(&cipher, data, &len, NULL, + (void*)"yassl123"), WOLFSSL_FAILURE); + ExpectIntEQ(PEM_do_header(&cipher, data, &len, NoPasswordCallBack, + (void*)"yassl123"), WOLFSSL_FAILURE); #if !defined(NO_DES3) && !defined(NO_MD5) - AssertIntEQ(PEM_do_header(&cipher, data, &len, PasswordCallBack, + ExpectIntEQ(PEM_do_header(&cipher, data, &len, PasswordCallBack, (void*)"yassl123"), WOLFSSL_SUCCESS); +#else + ExpectIntEQ(PEM_do_header(&cipher, data, &len, PasswordCallBack, + (void*)"yassl123"), WOLFSSL_FAILURE); #endif BIO_free(bio); + bio = NULL; XFREE(fileData, NULL, DYNAMIC_TYPE_TMP_BUFFER); + fileData = NULL; XFREE(name, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(header, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -56416,40 +67430,38 @@ name = NULL; header = NULL; data = NULL; - fp = XFOPEN(svrKeyFile, "rb"); - AssertTrue((fp != XBADFILE)); - AssertIntEQ(PEM_read(fp, &name, &header, &data, &len), WOLFSSL_SUCCESS); - AssertIntEQ(XSTRNCMP(name, "RSA PRIVATE KEY", 15), 0); - AssertIntEQ(XSTRLEN(header), 0); - AssertIntGT(len, 0); - - AssertIntEQ(XFSEEK(fp, 0, SEEK_END), 0); - AssertIntGT((fileDataSz = XFTELL(fp)), 0); - AssertIntEQ(XFSEEK(fp, 0, SEEK_SET), 0); - AssertNotNull(fileData = (unsigned char*)XMALLOC(fileDataSz, NULL, - DYNAMIC_TYPE_TMP_BUFFER)); - AssertIntEQ(XFREAD(fileData, 1, fileDataSz, fp), fileDataSz); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN(svrKeyFile, "rb")) != XBADFILE); + ExpectIntEQ(PEM_read(fp, &name, &header, &data, &len), WOLFSSL_SUCCESS); + ExpectIntEQ(XSTRNCMP(name, "RSA PRIVATE KEY", 15), 0); + ExpectIntEQ(XSTRLEN(header), 0); + ExpectIntGT(len, 0); + + ExpectIntEQ(XFSEEK(fp, 0, SEEK_END), 0); + ExpectIntGT((fileDataSz = XFTELL(fp)), 0); + ExpectIntEQ(XFSEEK(fp, 0, SEEK_SET), 0); + ExpectNotNull(fileData = (unsigned char*)XMALLOC(fileDataSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntEQ(XFREAD(fileData, 1, fileDataSz, fp), fileDataSz); + if (fp != XBADFILE) + XFCLOSE(fp); - AssertNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); - AssertIntEQ(PEM_write_bio(bio, name, header, data, len), fileDataSz); - AssertIntEQ(wolfSSL_BIO_get_mem_data(bio, &out), fileDataSz); - AssertIntEQ(XMEMCMP(out, fileData, fileDataSz), 0); + ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + ExpectIntEQ(PEM_write_bio(bio, name, header, data, len), fileDataSz); + ExpectIntEQ(wolfSSL_BIO_get_mem_data(bio, &out), fileDataSz); + ExpectIntEQ(XMEMCMP(out, fileData, fileDataSz), 0); BIO_free(bio); XFREE(fileData, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(name, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(header, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(data, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfssl_EVP_aes_gcm_AAD_2_parts(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AESGCM) && \ !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) const byte iv[12] = { 0 }; @@ -56466,111 +67478,111 @@ byte out2Part[16]; byte outTag2Part[16]; byte decryptBuf[16]; - int len; + int len = 0; int tlen; EVP_CIPHER_CTX* ctx = NULL; /* ENCRYPT */ /* Send AAD and data in 1 part */ - AssertNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); tlen = 0; - AssertIntEQ(EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), + ExpectIntEQ(EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), 1); - AssertIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), 1); - AssertIntEQ(EVP_EncryptUpdate(ctx, NULL, &len, aad, sizeof(aad)), 1); - AssertIntEQ(EVP_EncryptUpdate(ctx, out1Part, &len, cleartext, + ExpectIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), 1); + ExpectIntEQ(EVP_EncryptUpdate(ctx, NULL, &len, aad, sizeof(aad)), 1); + ExpectIntEQ(EVP_EncryptUpdate(ctx, out1Part, &len, cleartext, sizeof(cleartext)), 1); tlen += len; - AssertIntEQ(EVP_EncryptFinal_ex(ctx, out1Part, &len), 1); + ExpectIntEQ(EVP_EncryptFinal_ex(ctx, out1Part, &len), 1); tlen += len; - AssertIntEQ(tlen, sizeof(cleartext)); - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, + ExpectIntEQ(tlen, sizeof(cleartext)); + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, outTag1Part), 1); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* DECRYPT */ /* Send AAD and data in 1 part */ - AssertNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); tlen = 0; - AssertIntEQ(EVP_DecryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), + ExpectIntEQ(EVP_DecryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), 1); - AssertIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), 1); - AssertIntEQ(EVP_DecryptUpdate(ctx, NULL, &len, aad, sizeof(aad)), 1); - AssertIntEQ(EVP_DecryptUpdate(ctx, decryptBuf, &len, out1Part, + ExpectIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), 1); + ExpectIntEQ(EVP_DecryptUpdate(ctx, NULL, &len, aad, sizeof(aad)), 1); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptBuf, &len, out1Part, sizeof(cleartext)), 1); tlen += len; - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, outTag1Part), 1); - AssertIntEQ(EVP_DecryptFinal_ex(ctx, decryptBuf, &len), 1); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptBuf, &len), 1); tlen += len; - AssertIntEQ(tlen, sizeof(cleartext)); + ExpectIntEQ(tlen, sizeof(cleartext)); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; - AssertIntEQ(XMEMCMP(decryptBuf, cleartext, len), 0); + ExpectIntEQ(XMEMCMP(decryptBuf, cleartext, len), 0); /* ENCRYPT */ /* Send AAD and data in 2 parts */ - AssertNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); tlen = 0; - AssertIntEQ(EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), + ExpectIntEQ(EVP_EncryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), 1); - AssertIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), 1); - AssertIntEQ(EVP_EncryptUpdate(ctx, NULL, &len, aad, 1), 1); - AssertIntEQ(EVP_EncryptUpdate(ctx, NULL, &len, aad + 1, sizeof(aad) - 1), + ExpectIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), 1); + ExpectIntEQ(EVP_EncryptUpdate(ctx, NULL, &len, aad, 1), 1); + ExpectIntEQ(EVP_EncryptUpdate(ctx, NULL, &len, aad + 1, sizeof(aad) - 1), 1); - AssertIntEQ(EVP_EncryptUpdate(ctx, out2Part, &len, cleartext, 1), 1); + ExpectIntEQ(EVP_EncryptUpdate(ctx, out2Part, &len, cleartext, 1), 1); tlen += len; - AssertIntEQ(EVP_EncryptUpdate(ctx, out2Part + tlen, &len, cleartext + 1, + ExpectIntEQ(EVP_EncryptUpdate(ctx, out2Part + tlen, &len, cleartext + 1, sizeof(cleartext) - 1), 1); tlen += len; - AssertIntEQ(EVP_EncryptFinal_ex(ctx, out2Part + tlen, &len), 1); + ExpectIntEQ(EVP_EncryptFinal_ex(ctx, out2Part + tlen, &len), 1); tlen += len; - AssertIntEQ(tlen, sizeof(cleartext)); - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, + ExpectIntEQ(tlen, sizeof(cleartext)); + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, 16, outTag2Part), 1); - AssertIntEQ(XMEMCMP(out1Part, out2Part, sizeof(out1Part)), 0); - AssertIntEQ(XMEMCMP(outTag1Part, outTag2Part, sizeof(outTag1Part)), 0); + ExpectIntEQ(XMEMCMP(out1Part, out2Part, sizeof(out1Part)), 0); + ExpectIntEQ(XMEMCMP(outTag1Part, outTag2Part, sizeof(outTag1Part)), 0); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* DECRYPT */ /* Send AAD and data in 2 parts */ - AssertNotNull(ctx = EVP_CIPHER_CTX_new()); + ExpectNotNull(ctx = EVP_CIPHER_CTX_new()); tlen = 0; - AssertIntEQ(EVP_DecryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), + ExpectIntEQ(EVP_DecryptInit_ex(ctx, EVP_aes_128_gcm(), NULL, NULL, NULL), 1); - AssertIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), 1); - AssertIntEQ(EVP_DecryptUpdate(ctx, NULL, &len, aad, 1), 1); - AssertIntEQ(EVP_DecryptUpdate(ctx, NULL, &len, aad + 1, sizeof(aad) - 1), + ExpectIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), 1); + ExpectIntEQ(EVP_DecryptUpdate(ctx, NULL, &len, aad, 1), 1); + ExpectIntEQ(EVP_DecryptUpdate(ctx, NULL, &len, aad + 1, sizeof(aad) - 1), 1); - AssertIntEQ(EVP_DecryptUpdate(ctx, decryptBuf, &len, out1Part, 1), 1); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptBuf, &len, out1Part, 1), 1); tlen += len; - AssertIntEQ(EVP_DecryptUpdate(ctx, decryptBuf + tlen, &len, out1Part + 1, + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptBuf + tlen, &len, out1Part + 1, sizeof(cleartext) - 1), 1); tlen += len; - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, outTag1Part), 1); - AssertIntEQ(EVP_DecryptFinal_ex(ctx, decryptBuf + tlen, &len), 1); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptBuf + tlen, &len), 1); tlen += len; - AssertIntEQ(tlen, sizeof(cleartext)); + ExpectIntEQ(tlen, sizeof(cleartext)); - AssertIntEQ(XMEMCMP(decryptBuf, cleartext, len), 0); + ExpectIntEQ(XMEMCMP(decryptBuf, cleartext, len), 0); - /* Test AAD re-use */ + /* Test AAD reuse */ EVP_CIPHER_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfssl_EVP_aes_gcm_zeroLen(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AESGCM) && \ !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) /* Zero length plain text */ - byte key[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, @@ -56584,9 +67596,10 @@ int ivSz = 12; int plaintxtSz = 0; unsigned char tag[16]; - unsigned char tag_kat[] = - {0x53,0x0f,0x8a,0xfb,0xc7,0x45,0x36,0xb9, - 0xa9,0x63,0xb4,0xf1,0xc4,0xcb,0x73,0x8b}; + unsigned char tag_kat[] = { + 0x53,0x0f,0x8a,0xfb,0xc7,0x45,0x36,0xb9, + 0xa9,0x63,0xb4,0xf1,0xc4,0xcb,0x73,0x8b + }; byte ciphertxt[AES_BLOCK_SIZE * 4] = {0}; byte decryptedtxt[AES_BLOCK_SIZE * 4] = {0}; @@ -56597,42 +67610,39 @@ EVP_CIPHER_CTX *en = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX *de = EVP_CIPHER_CTX_new(); - AssertIntEQ(1, EVP_EncryptInit_ex(en, EVP_aes_256_gcm(), NULL, key, iv)); - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_EncryptUpdate(en, ciphertxt, &ciphertxtSz , plaintxt, - plaintxtSz)); - AssertIntEQ(1, EVP_EncryptFinal_ex(en, ciphertxt, &len)); + ExpectIntEQ(1, EVP_EncryptInit_ex(en, EVP_aes_256_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptUpdate(en, ciphertxt, &ciphertxtSz , plaintxt, + plaintxtSz)); + ExpectIntEQ(1, EVP_EncryptFinal_ex(en, ciphertxt, &len)); ciphertxtSz += len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_GCM_GET_TAG, 16, tag)); - AssertIntEQ(1, EVP_CIPHER_CTX_cleanup(en)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_GCM_GET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_CIPHER_CTX_cleanup(en)); - AssertIntEQ(0, ciphertxtSz); - AssertIntEQ(0, XMEMCMP(tag, tag_kat, sizeof(tag))); + ExpectIntEQ(0, ciphertxtSz); + ExpectIntEQ(0, XMEMCMP(tag, tag_kat, sizeof(tag))); EVP_CIPHER_CTX_init(de); - AssertIntEQ(1, EVP_DecryptInit_ex(de, EVP_aes_256_gcm(), NULL, key, iv)); - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_DecryptUpdate(de, NULL, &len, ciphertxt, len)); + ExpectIntEQ(1, EVP_DecryptInit_ex(de, EVP_aes_256_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptUpdate(de, NULL, &len, ciphertxt, len)); decryptedtxtSz = len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_GCM_SET_TAG, 16, tag)); - AssertIntEQ(1, EVP_DecryptFinal_ex(de, decryptedtxt, &len)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_GCM_SET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(de, decryptedtxt, &len)); decryptedtxtSz += len; - AssertIntEQ(0, decryptedtxtSz); + ExpectIntEQ(0, decryptedtxtSz); EVP_CIPHER_CTX_free(en); EVP_CIPHER_CTX_free(de); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfssl_EVP_aes_gcm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AESGCM) && \ !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) - /* A 256 bit key, AES_128 will use the first 128 bit*/ byte *key = (byte*)"01234567890123456789012345678901"; /* A 128 bit IV */ @@ -56656,76 +67666,258 @@ EVP_CIPHER_CTX de[2]; for (i = 0; i < 2; i++) { - EVP_CIPHER_CTX_init(&en[i]); - if (i == 0) { /* Default uses 96-bits IV length */ #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_128_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_128_gcm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_192_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_192_gcm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_256_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_256_gcm(), NULL, + key, iv)); #endif } else { #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_128_gcm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_128_gcm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_192_gcm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_192_gcm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_256_gcm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_256_gcm(), NULL, + NULL, NULL)); #endif /* non-default must to set the IV length first */ - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); - } - AssertIntEQ(1, EVP_EncryptUpdate(&en[i], NULL, &len, aad, aadSz)); - AssertIntEQ(1, EVP_EncryptUpdate(&en[i], ciphertxt, &len, plaintxt, plaintxtSz)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); + } + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], ciphertxt, &len, plaintxt, + plaintxtSz)); ciphertxtSz = len; - AssertIntEQ(1, EVP_EncryptFinal_ex(&en[i], ciphertxt, &len)); + ExpectIntEQ(1, EVP_EncryptFinal_ex(&en[i], ciphertxt, &len)); ciphertxtSz += len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_GET_TAG, AES_BLOCK_SIZE, tag)); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&en[i]), 1); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_GET_TAG, + AES_BLOCK_SIZE, tag)); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&en[i]), 1); EVP_CIPHER_CTX_init(&de[i]); if (i == 0) { /* Default uses 96-bits IV length */ #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_gcm(), NULL, + key, iv)); +#elif defined(WOLFSSL_AES_192) + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_gcm(), NULL, + key, iv)); +#elif defined(WOLFSSL_AES_256) + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_gcm(), NULL, + key, iv)); +#endif + } + else { +#ifdef WOLFSSL_AES_128 + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_gcm(), NULL, + NULL, NULL)); +#elif defined(WOLFSSL_AES_192) + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_gcm(), NULL, + NULL, NULL)); +#elif defined(WOLFSSL_AES_256) + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_gcm(), NULL, + NULL, NULL)); +#endif + /* non-default must to set the IV length first */ + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + + } + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); + decryptedtxtSz = len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, + AES_BLOCK_SIZE, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); + decryptedtxtSz += len; + ExpectIntEQ(ciphertxtSz, decryptedtxtSz); + ExpectIntEQ(0, XMEMCMP(plaintxt, decryptedtxt, decryptedtxtSz)); + + /* modify tag*/ + if (i == 0) { + /* Default uses 96-bits IV length */ +#ifdef WOLFSSL_AES_128 + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_gcm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_gcm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_gcm(), NULL, + key, iv)); #endif } else { #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_gcm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_gcm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_gcm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_gcm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_gcm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_gcm(), NULL, + NULL, NULL)); #endif /* non-default must to set the IV length first */ - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + + } + tag[AES_BLOCK_SIZE-1]+=0xBB; + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, + AES_BLOCK_SIZE, tag)); + /* fail due to wrong tag */ + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); + ExpectIntEQ(0, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); + ExpectIntEQ(0, len); + + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&de[i]), 1); + } +#endif /* OPENSSL_EXTRA && !NO_AES && HAVE_AESGCM */ + return EXPECT_RESULT(); +} + +static int test_wolfssl_EVP_aria_gcm(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(HAVE_ARIA) && \ + !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) + + /* A 256 bit key, AES_128 will use the first 128 bit*/ + byte *key = (byte*)"01234567890123456789012345678901"; + /* A 128 bit IV */ + byte *iv = (byte*)"0123456789012345"; + int ivSz = ARIA_BLOCK_SIZE; + /* Message to be encrypted */ + const int plaintxtSz = 40; + byte plaintxt[WC_ARIA_GCM_GET_CIPHERTEXT_SIZE(plaintxtSz)]; + XMEMCPY(plaintxt,"for things to change you have to change",plaintxtSz); + /* Additional non-confidential data */ + byte *aad = (byte*)"Don't spend major time on minor things."; + + unsigned char tag[ARIA_BLOCK_SIZE] = {0}; + int aadSz = (int)XSTRLEN((char*)aad); + byte ciphertxt[WC_ARIA_GCM_GET_CIPHERTEXT_SIZE(plaintxtSz)]; + byte decryptedtxt[plaintxtSz]; + int ciphertxtSz = 0; + int decryptedtxtSz = 0; + int len = 0; + int i = 0; + #define TEST_ARIA_GCM_COUNT 6 + EVP_CIPHER_CTX en[TEST_ARIA_GCM_COUNT]; + EVP_CIPHER_CTX de[TEST_ARIA_GCM_COUNT]; + + for (i = 0; i < TEST_ARIA_GCM_COUNT; i++) { + EVP_CIPHER_CTX_init(&en[i]); + switch (i) { + case 0: + /* Default uses 96-bits IV length */ + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aria_128_gcm(), NULL, key, iv)); + break; + case 1: + /* Default uses 96-bits IV length */ + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aria_192_gcm(), NULL, key, iv)); + break; + case 2: + /* Default uses 96-bits IV length */ + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aria_256_gcm(), NULL, key, iv)); + break; + case 3: + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aria_128_gcm(), NULL, NULL, NULL)); + /* non-default must to set the IV length first */ + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); + break; + case 4: + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aria_192_gcm(), NULL, NULL, NULL)); + /* non-default must to set the IV length first */ + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); + break; + case 5: + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aria_256_gcm(), NULL, NULL, NULL)); + /* non-default must to set the IV length first */ + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); + break; + } + XMEMSET(ciphertxt,0,sizeof(ciphertxt)); + AssertIntEQ(1, EVP_EncryptUpdate(&en[i], NULL, &len, aad, aadSz)); + AssertIntEQ(1, EVP_EncryptUpdate(&en[i], ciphertxt, &len, plaintxt, plaintxtSz)); + ciphertxtSz = len; + AssertIntEQ(1, EVP_EncryptFinal_ex(&en[i], ciphertxt, &len)); + AssertIntNE(0, XMEMCMP(plaintxt, ciphertxt, plaintxtSz)); + ciphertxtSz += len; + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_GET_TAG, ARIA_BLOCK_SIZE, tag)); + AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&en[i]), 1); + + EVP_CIPHER_CTX_init(&de[i]); + switch (i) { + case 0: + /* Default uses 96-bits IV length */ + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aria_128_gcm(), NULL, key, iv)); + break; + case 1: + /* Default uses 96-bits IV length */ + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aria_192_gcm(), NULL, key, iv)); + break; + case 2: + /* Default uses 96-bits IV length */ + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aria_256_gcm(), NULL, key, iv)); + break; + case 3: + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aria_128_gcm(), NULL, NULL, NULL)); + /* non-default must to set the IV length first */ + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + break; + case 4: + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aria_192_gcm(), NULL, NULL, NULL)); + /* non-default must to set the IV length first */ + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + break; + case 5: + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aria_256_gcm(), NULL, NULL, NULL)); + /* non-default must to set the IV length first */ + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + break; } + XMEMSET(decryptedtxt,0,sizeof(decryptedtxt)); AssertIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); AssertIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, ciphertxtSz)); decryptedtxtSz = len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, AES_BLOCK_SIZE, tag)); + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, ARIA_BLOCK_SIZE, tag)); AssertIntEQ(1, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); decryptedtxtSz += len; - AssertIntEQ(ciphertxtSz, decryptedtxtSz); + AssertIntEQ(plaintxtSz, decryptedtxtSz); AssertIntEQ(0, XMEMCMP(plaintxt, decryptedtxt, decryptedtxtSz)); + XMEMSET(decryptedtxt,0,sizeof(decryptedtxt)); /* modify tag*/ tag[AES_BLOCK_SIZE-1]+=0xBB; AssertIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, AES_BLOCK_SIZE, tag)); + AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, ARIA_BLOCK_SIZE, tag)); /* fail due to wrong tag */ AssertIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, ciphertxtSz)); AssertIntEQ(0, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); @@ -56740,11 +67932,10 @@ static int test_wolfssl_EVP_aes_ccm_zeroLen(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AESCCM) && \ !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) /* Zero length plain text */ - byte key[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, @@ -56768,41 +67959,38 @@ EVP_CIPHER_CTX *en = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX *de = EVP_CIPHER_CTX_new(); - AssertIntEQ(1, EVP_EncryptInit_ex(en, EVP_aes_256_ccm(), NULL, key, iv)); - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_EncryptUpdate(en, ciphertxt, &ciphertxtSz , plaintxt, + ExpectIntEQ(1, EVP_EncryptInit_ex(en, EVP_aes_256_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptUpdate(en, ciphertxt, &ciphertxtSz , plaintxt, plaintxtSz)); - AssertIntEQ(1, EVP_EncryptFinal_ex(en, ciphertxt, &len)); + ExpectIntEQ(1, EVP_EncryptFinal_ex(en, ciphertxt, &len)); ciphertxtSz += len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_CCM_GET_TAG, 16, tag)); - AssertIntEQ(1, EVP_CIPHER_CTX_cleanup(en)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_CCM_GET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_CIPHER_CTX_cleanup(en)); - AssertIntEQ(0, ciphertxtSz); + ExpectIntEQ(0, ciphertxtSz); EVP_CIPHER_CTX_init(de); - AssertIntEQ(1, EVP_DecryptInit_ex(de, EVP_aes_256_ccm(), NULL, key, iv)); - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_DecryptUpdate(de, NULL, &len, ciphertxt, len)); + ExpectIntEQ(1, EVP_DecryptInit_ex(de, EVP_aes_256_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptUpdate(de, NULL, &len, ciphertxt, len)); decryptedtxtSz = len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_CCM_SET_TAG, 16, tag)); - AssertIntEQ(1, EVP_DecryptFinal_ex(de, decryptedtxt, &len)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_CCM_SET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(de, decryptedtxt, &len)); decryptedtxtSz += len; - AssertIntEQ(0, decryptedtxtSz); + ExpectIntEQ(0, decryptedtxtSz); EVP_CIPHER_CTX_free(en); EVP_CIPHER_CTX_free(de); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfssl_EVP_aes_ccm(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_AES) && defined(HAVE_AESCCM) && \ !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) - /* A 256 bit key, AES_128 will use the first 128 bit*/ byte *key = (byte*)"01234567890123456789012345678901"; /* A 128 bit IV */ @@ -56822,117 +68010,115 @@ int decryptedtxtSz = 0; int len = 0; int i = 0; + int ret; EVP_CIPHER_CTX en[2]; EVP_CIPHER_CTX de[2]; for (i = 0; i < 2; i++) { - EVP_CIPHER_CTX_init(&en[i]); if (i == 0) { /* Default uses 96-bits IV length */ #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], - EVP_aes_128_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_128_ccm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], - EVP_aes_192_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_192_ccm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], - EVP_aes_256_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_256_ccm(), NULL, + key, iv)); #endif } else { #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], - EVP_aes_128_ccm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_128_ccm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], - EVP_aes_192_ccm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_192_ccm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], - EVP_aes_256_ccm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_aes_256_ccm(), NULL, + NULL, NULL)); #endif /* non-default must to set the IV length first */ - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], - EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_EncryptInit_ex(&en[i], - NULL, NULL, key, iv)); - } - AssertIntEQ(1, EVP_EncryptUpdate(&en[i], NULL, &len, aad, aadSz)); - AssertIntEQ(1, EVP_EncryptUpdate(&en[i], - ciphertxt, &len, plaintxt, plaintxtSz)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_CCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); + } + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], ciphertxt, &len, plaintxt, + plaintxtSz)); ciphertxtSz = len; - AssertIntEQ(1, EVP_EncryptFinal_ex(&en[i], ciphertxt, &len)); + ExpectIntEQ(1, EVP_EncryptFinal_ex(&en[i], ciphertxt, &len)); ciphertxtSz += len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], - EVP_CTRL_CCM_GET_TAG, AES_BLOCK_SIZE, tag)); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&en[i]), 1); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_CCM_GET_TAG, + AES_BLOCK_SIZE, tag)); + ret = wolfSSL_EVP_CIPHER_CTX_cleanup(&en[i]); + ExpectIntEQ(ret, 1); EVP_CIPHER_CTX_init(&de[i]); if (i == 0) { /* Default uses 96-bits IV length */ #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], - EVP_aes_128_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_ccm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], - EVP_aes_192_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_ccm(), NULL, + key, iv)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], - EVP_aes_256_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_ccm(), NULL, + key, iv)); #endif } else { #ifdef WOLFSSL_AES_128 - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], - EVP_aes_128_ccm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_128_ccm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_192) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], - EVP_aes_192_ccm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_192_ccm(), NULL, + NULL, NULL)); #elif defined(WOLFSSL_AES_256) - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], - EVP_aes_256_ccm(), NULL, NULL, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_aes_256_ccm(), NULL, + NULL, NULL)); #endif /* non-default must to set the IV length first */ - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], - EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); - AssertIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_CCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); } - AssertIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); - AssertIntEQ(1, EVP_DecryptUpdate(&de[i], - decryptedtxt, &len, ciphertxt, ciphertxtSz)); + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); decryptedtxtSz = len; - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], - EVP_CTRL_CCM_SET_TAG, AES_BLOCK_SIZE, tag)); - AssertIntEQ(1, EVP_DecryptFinal_ex(&de[i], - decryptedtxt, &len)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_CCM_SET_TAG, + AES_BLOCK_SIZE, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); decryptedtxtSz += len; - AssertIntEQ(ciphertxtSz, decryptedtxtSz); - AssertIntEQ(0, XMEMCMP(plaintxt, decryptedtxt, decryptedtxtSz)); + ExpectIntEQ(ciphertxtSz, decryptedtxtSz); + ExpectIntEQ(0, XMEMCMP(plaintxt, decryptedtxt, decryptedtxtSz)); /* modify tag*/ tag[AES_BLOCK_SIZE-1]+=0xBB; - AssertIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); - AssertIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], - EVP_CTRL_CCM_SET_TAG, AES_BLOCK_SIZE, tag)); + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_CCM_SET_TAG, + AES_BLOCK_SIZE, tag)); /* fail due to wrong tag */ - AssertIntEQ(1, EVP_DecryptUpdate(&de[i], - decryptedtxt, &len, ciphertxt, ciphertxtSz)); - AssertIntEQ(0, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); - AssertIntEQ(0, len); - AssertIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&de[i]), 1); + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); + ExpectIntEQ(0, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); + ExpectIntEQ(0, len); + ret = wolfSSL_EVP_CIPHER_CTX_cleanup(&de[i]); + ExpectIntEQ(ret, 1); } - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_EXTRA && !NO_AES && HAVE_AESCCM */ - return res; + return EXPECT_RESULT(); } static int test_wolfssl_EVP_chacha20_poly1305(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_CHACHA) && defined(HAVE_POLY1305) byte key[CHACHA20_POLY1305_AEAD_KEYSIZE]; byte iv [CHACHA20_POLY1305_AEAD_IV_SIZE]; @@ -56941,150 +68127,657 @@ byte cipherText[sizeof(plainText)]; byte decryptedText[sizeof(plainText)]; byte tag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; - EVP_CIPHER_CTX* ctx; + EVP_CIPHER_CTX* ctx = NULL; int outSz; /* Encrypt. */ - AssertNotNull((ctx = EVP_CIPHER_CTX_new())); - AssertIntEQ(EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, NULL), WOLFSSL_SUCCESS); /* Invalid IV length. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, CHACHA20_POLY1305_AEAD_IV_SIZE-1, NULL), WOLFSSL_FAILURE); /* Valid IV length. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, CHACHA20_POLY1305_AEAD_IV_SIZE, NULL), WOLFSSL_SUCCESS); /* Invalid tag length. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE-1, NULL), WOLFSSL_FAILURE); /* Valid tag length. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE, NULL), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_EncryptUpdate(ctx, NULL, &outSz, aad, sizeof(aad)), + ExpectIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_EncryptUpdate(ctx, NULL, &outSz, aad, sizeof(aad)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(aad)); - AssertIntEQ(EVP_EncryptUpdate(ctx, cipherText, &outSz, plainText, + ExpectIntEQ(outSz, sizeof(aad)); + ExpectIntEQ(EVP_EncryptUpdate(ctx, cipherText, &outSz, plainText, sizeof(plainText)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(plainText)); - AssertIntEQ(EVP_EncryptFinal_ex(ctx, cipherText, &outSz), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, 0); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_EncryptFinal_ex(ctx, cipherText, &outSz), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); /* Invalid tag length. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE-1, tag), WOLFSSL_FAILURE); /* Valid tag length. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE, tag), WOLFSSL_SUCCESS); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* Decrypt. */ - AssertNotNull((ctx = EVP_CIPHER_CTX_new())); - AssertIntEQ(EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, EVP_chacha20_poly1305(), NULL, NULL, NULL), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, CHACHA20_POLY1305_AEAD_IV_SIZE, NULL), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE, tag), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_DecryptUpdate(ctx, NULL, &outSz, aad, sizeof(aad)), + ExpectIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptUpdate(ctx, NULL, &outSz, aad, sizeof(aad)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(aad)); - AssertIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + ExpectIntEQ(outSz, sizeof(aad)); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, sizeof(cipherText)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(cipherText)); - AssertIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), + ExpectIntEQ(outSz, sizeof(cipherText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, 0); + ExpectIntEQ(outSz, 0); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* Test partial Inits. CipherInit() allow setting of key and iv * in separate calls. */ - AssertNotNull((ctx = EVP_CIPHER_CTX_new())); - AssertIntEQ(wolfSSL_EVP_CipherInit(ctx, EVP_chacha20_poly1305(), + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, EVP_chacha20_poly1305(), key, NULL, 1), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, 1), + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, 1), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_CipherUpdate(ctx, NULL, &outSz, + ExpectIntEQ(wolfSSL_EVP_CipherUpdate(ctx, NULL, &outSz, aad, sizeof(aad)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(aad)); - AssertIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + ExpectIntEQ(outSz, sizeof(aad)); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, sizeof(cipherText)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(cipherText)); - AssertIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), + ExpectIntEQ(outSz, sizeof(cipherText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, 0); + ExpectIntEQ(outSz, 0); EVP_CIPHER_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfssl_EVP_chacha20(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_CHACHA) byte key[CHACHA_MAX_KEY_SZ]; byte iv [WOLFSSL_EVP_CHACHA_IV_BYTES]; byte plainText[] = {0xDE, 0xAD, 0xBE, 0xEF}; byte cipherText[sizeof(plainText)]; byte decryptedText[sizeof(plainText)]; - EVP_CIPHER_CTX* ctx; + EVP_CIPHER_CTX* ctx = NULL; int outSz; + XMEMSET(key, 0, sizeof(key)); + XMEMSET(iv, 0, sizeof(iv)); /* Encrypt. */ - AssertNotNull((ctx = EVP_CIPHER_CTX_new())); - AssertIntEQ(EVP_EncryptInit_ex(ctx, EVP_chacha20(), NULL, NULL, + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, EVP_chacha20(), NULL, NULL, NULL), WOLFSSL_SUCCESS); /* Any tag length must fail - not an AEAD cipher. */ - AssertIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, NULL), WOLFSSL_FAILURE); - AssertIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_EncryptUpdate(ctx, cipherText, &outSz, plainText, + ExpectIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_EncryptUpdate(ctx, cipherText, &outSz, plainText, sizeof(plainText)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(plainText)); - AssertIntEQ(EVP_EncryptFinal_ex(ctx, cipherText, &outSz), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, 0); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_EncryptFinal_ex(ctx, cipherText, &outSz), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* Decrypt. */ - AssertNotNull((ctx = EVP_CIPHER_CTX_new())); - AssertIntEQ(EVP_DecryptInit_ex(ctx, EVP_chacha20(), NULL, NULL, + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, EVP_chacha20(), NULL, NULL, NULL), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + ExpectIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, sizeof(cipherText)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(cipherText)); - AssertIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), + ExpectIntEQ(outSz, sizeof(cipherText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, 0); + ExpectIntEQ(outSz, 0); EVP_CIPHER_CTX_free(ctx); + ctx = NULL; /* Test partial Inits. CipherInit() allow setting of key and iv * in separate calls. */ - AssertNotNull((ctx = EVP_CIPHER_CTX_new())); - AssertIntEQ(wolfSSL_EVP_CipherInit(ctx, EVP_chacha20(), + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, EVP_chacha20(), key, NULL, 1), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, 1), + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, 1), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, sizeof(cipherText)), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, sizeof(cipherText)); - AssertIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), + ExpectIntEQ(outSz, sizeof(cipherText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), WOLFSSL_SUCCESS); - AssertIntEQ(outSz, 0); + ExpectIntEQ(outSz, 0); EVP_CIPHER_CTX_free(ctx); +#endif + return EXPECT_RESULT(); +} - res = TEST_RES_CHECK(1); +static int test_wolfssl_EVP_sm4_ecb(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM4_ECB) + EXPECT_DECLS; + byte key[SM4_KEY_SIZE]; + byte plainText[SM4_BLOCK_SIZE] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, + 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF + }; + byte cipherText[sizeof(plainText) + SM4_BLOCK_SIZE]; + byte decryptedText[sizeof(plainText) + SM4_BLOCK_SIZE]; + EVP_CIPHER_CTX* ctx; + int outSz; + + XMEMSET(key, 0, sizeof(key)); + + /* Encrypt. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, EVP_sm4_ecb(), NULL, NULL, NULL), + WOLFSSL_SUCCESS); + /* Any tag length must fail - not an AEAD cipher. */ + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, NULL), + WOLFSSL_FAILURE); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, NULL), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_EncryptUpdate(ctx, cipherText, &outSz, plainText, + sizeof(plainText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_EncryptFinal_ex(ctx, cipherText + outSz, &outSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, SM4_BLOCK_SIZE); + ExpectBufNE(cipherText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + /* Decrypt. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, EVP_sm4_ecb(), NULL, NULL, NULL), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, NULL), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + sizeof(cipherText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText + outSz, &outSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); + ExpectBufEQ(decryptedText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + res = EXPECT_RESULT(); #endif return res; } -static int test_wolfSSL_EVP_PKEY_hkdf(void) +static int test_wolfssl_EVP_sm4_cbc(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM4_CBC) + EXPECT_DECLS; + byte key[SM4_KEY_SIZE]; + byte iv[SM4_BLOCK_SIZE]; + byte plainText[SM4_BLOCK_SIZE] = { + 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, + 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF + }; + byte cipherText[sizeof(plainText) + SM4_BLOCK_SIZE]; + byte decryptedText[sizeof(plainText) + SM4_BLOCK_SIZE]; + EVP_CIPHER_CTX* ctx; + int outSz; + + XMEMSET(key, 0, sizeof(key)); + XMEMSET(iv, 0, sizeof(iv)); + + /* Encrypt. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, EVP_sm4_cbc(), NULL, NULL, NULL), + WOLFSSL_SUCCESS); + /* Any tag length must fail - not an AEAD cipher. */ + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, NULL), + WOLFSSL_FAILURE); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_EncryptUpdate(ctx, cipherText, &outSz, plainText, + sizeof(plainText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_EncryptFinal_ex(ctx, cipherText + outSz, &outSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, SM4_BLOCK_SIZE); + ExpectBufNE(cipherText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + /* Decrypt. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, EVP_sm4_cbc(), NULL, NULL, NULL), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + sizeof(cipherText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText + outSz, &outSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); + ExpectBufEQ(decryptedText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + /* Test partial Inits. CipherInit() allow setting of key and iv + * in separate calls. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, EVP_sm4_cbc(), key, NULL, 0), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, 0), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + sizeof(cipherText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText + outSz, &outSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); + ExpectBufEQ(decryptedText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + res = EXPECT_RESULT(); +#endif + return res; +} + +static int test_wolfssl_EVP_sm4_ctr(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM4_CTR) + EXPECT_DECLS; + byte key[SM4_KEY_SIZE]; + byte iv[SM4_BLOCK_SIZE]; + byte plainText[] = {0xDE, 0xAD, 0xBE, 0xEF}; + byte cipherText[sizeof(plainText)]; + byte decryptedText[sizeof(plainText)]; + EVP_CIPHER_CTX* ctx; + int outSz; + + XMEMSET(key, 0, sizeof(key)); + XMEMSET(iv, 0, sizeof(iv)); + + /* Encrypt. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, EVP_sm4_ctr(), NULL, NULL, NULL), + WOLFSSL_SUCCESS); + /* Any tag length must fail - not an AEAD cipher. */ + ExpectIntEQ(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, 16, NULL), + WOLFSSL_FAILURE); + ExpectIntEQ(EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_EncryptUpdate(ctx, cipherText, &outSz, plainText, + sizeof(plainText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(plainText)); + ExpectIntEQ(EVP_EncryptFinal_ex(ctx, cipherText, &outSz), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); + ExpectBufNE(cipherText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + /* Decrypt. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, EVP_sm4_ctr(), NULL, NULL, NULL), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + sizeof(cipherText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(cipherText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); + ExpectBufEQ(decryptedText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + /* Test partial Inits. CipherInit() allow setting of key and iv + * in separate calls. */ + ExpectNotNull((ctx = EVP_CIPHER_CTX_new())); + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, EVP_sm4_ctr(), key, NULL, 1), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EVP_CipherInit(ctx, NULL, NULL, iv, 1), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DecryptUpdate(ctx, decryptedText, &outSz, cipherText, + sizeof(cipherText)), WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, sizeof(cipherText)); + ExpectIntEQ(EVP_DecryptFinal_ex(ctx, decryptedText, &outSz), + WOLFSSL_SUCCESS); + ExpectIntEQ(outSz, 0); + ExpectBufEQ(decryptedText, plainText, sizeof(plainText)); + EVP_CIPHER_CTX_free(ctx); + + res = EXPECT_RESULT(); +#endif + return res; +} + +static int test_wolfssl_EVP_sm4_gcm_zeroLen(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM4_GCM) + /* Zero length plain text */ + EXPECT_DECLS; + byte key[] = { + 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 + }; /* align */ + byte iv[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + }; /* align */ + byte plaintxt[1]; + int ivSz = 12; + int plaintxtSz = 0; + unsigned char tag[16]; + unsigned char tag_kat[16] = { + 0x23,0x2f,0x0c,0xfe,0x30,0x8b,0x49,0xea, + 0x6f,0xc8,0x82,0x29,0xb5,0xdc,0x85,0x8d + }; + + byte ciphertxt[SM4_BLOCK_SIZE * 4] = {0}; + byte decryptedtxt[SM4_BLOCK_SIZE * 4] = {0}; + int ciphertxtSz = 0; + int decryptedtxtSz = 0; + int len = 0; + + EVP_CIPHER_CTX *en = EVP_CIPHER_CTX_new(); + EVP_CIPHER_CTX *de = EVP_CIPHER_CTX_new(); + + ExpectIntEQ(1, EVP_EncryptInit_ex(en, EVP_sm4_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptUpdate(en, ciphertxt, &ciphertxtSz , plaintxt, + plaintxtSz)); + ExpectIntEQ(1, EVP_EncryptFinal_ex(en, ciphertxt, &len)); + ciphertxtSz += len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_GCM_GET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_CIPHER_CTX_cleanup(en)); + + ExpectIntEQ(0, ciphertxtSz); + ExpectIntEQ(0, XMEMCMP(tag, tag_kat, sizeof(tag))); + + EVP_CIPHER_CTX_init(de); + ExpectIntEQ(1, EVP_DecryptInit_ex(de, EVP_sm4_gcm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_GCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptUpdate(de, NULL, &len, ciphertxt, len)); + decryptedtxtSz = len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_GCM_SET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(de, decryptedtxt, &len)); + decryptedtxtSz += len; + ExpectIntEQ(0, decryptedtxtSz); + + EVP_CIPHER_CTX_free(en); + EVP_CIPHER_CTX_free(de); + + res = EXPECT_RESULT(); +#endif /* OPENSSL_EXTRA && WOLFSSL_SM4_GCM */ + return res; +} + +static int test_wolfssl_EVP_sm4_gcm(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM4_GCM) + EXPECT_DECLS; + byte *key = (byte*)"0123456789012345"; + /* A 128 bit IV */ + byte *iv = (byte*)"0123456789012345"; + int ivSz = SM4_BLOCK_SIZE; + /* Message to be encrypted */ + byte *plaintxt = (byte*)"for things to change you have to change"; + /* Additional non-confidential data */ + byte *aad = (byte*)"Don't spend major time on minor things."; + + unsigned char tag[SM4_BLOCK_SIZE] = {0}; + int plaintxtSz = (int)XSTRLEN((char*)plaintxt); + int aadSz = (int)XSTRLEN((char*)aad); + byte ciphertxt[SM4_BLOCK_SIZE * 4] = {0}; + byte decryptedtxt[SM4_BLOCK_SIZE * 4] = {0}; + int ciphertxtSz = 0; + int decryptedtxtSz = 0; + int len = 0; + int i = 0; + EVP_CIPHER_CTX en[2]; + EVP_CIPHER_CTX de[2]; + + for (i = 0; i < 2; i++) { + EVP_CIPHER_CTX_init(&en[i]); + + if (i == 0) { + /* Default uses 96-bits IV length */ + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_sm4_gcm(), NULL, key, + iv)); + } + else { + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_sm4_gcm(), NULL, NULL, + NULL)); + /* non-default must to set the IV length first */ + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); + } + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], ciphertxt, &len, plaintxt, + plaintxtSz)); + ciphertxtSz = len; + ExpectIntEQ(1, EVP_EncryptFinal_ex(&en[i], ciphertxt, &len)); + ciphertxtSz += len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_GCM_GET_TAG, + SM4_BLOCK_SIZE, tag)); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&en[i]), 1); + + EVP_CIPHER_CTX_init(&de[i]); + if (i == 0) { + /* Default uses 96-bits IV length */ + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_sm4_gcm(), NULL, key, + iv)); + } + else { + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_sm4_gcm(), NULL, NULL, + NULL)); + /* non-default must to set the IV length first */ + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + + } + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); + decryptedtxtSz = len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, + SM4_BLOCK_SIZE, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); + decryptedtxtSz += len; + ExpectIntEQ(ciphertxtSz, decryptedtxtSz); + ExpectIntEQ(0, XMEMCMP(plaintxt, decryptedtxt, decryptedtxtSz)); + + /* modify tag*/ + tag[SM4_BLOCK_SIZE-1]+=0xBB; + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_GCM_SET_TAG, + SM4_BLOCK_SIZE, tag)); + /* fail due to wrong tag */ + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); + ExpectIntEQ(0, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); + ExpectIntEQ(0, len); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&de[i]), 1); + } + + res = EXPECT_RESULT(); +#endif /* OPENSSL_EXTRA && WOLFSSL_SM4_GCM */ + return res; +} + +static int test_wolfssl_EVP_sm4_ccm_zeroLen(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM4_CCM) + /* Zero length plain text */ + EXPECT_DECLS; + byte key[] = { + 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 + }; /* align */ + byte iv[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + }; /* align */ + byte plaintxt[1]; + int ivSz = 12; + int plaintxtSz = 0; + unsigned char tag[16]; + + byte ciphertxt[SM4_BLOCK_SIZE * 4] = {0}; + byte decryptedtxt[SM4_BLOCK_SIZE * 4] = {0}; + int ciphertxtSz = 0; + int decryptedtxtSz = 0; + int len = 0; + + EVP_CIPHER_CTX *en = EVP_CIPHER_CTX_new(); + EVP_CIPHER_CTX *de = EVP_CIPHER_CTX_new(); + + ExpectIntEQ(1, EVP_EncryptInit_ex(en, EVP_sm4_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptUpdate(en, ciphertxt, &ciphertxtSz , plaintxt, + plaintxtSz)); + ExpectIntEQ(1, EVP_EncryptFinal_ex(en, ciphertxt, &len)); + ciphertxtSz += len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(en, EVP_CTRL_CCM_GET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_CIPHER_CTX_cleanup(en)); + + ExpectIntEQ(0, ciphertxtSz); + + EVP_CIPHER_CTX_init(de); + ExpectIntEQ(1, EVP_DecryptInit_ex(de, EVP_sm4_ccm(), NULL, key, iv)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_CCM_SET_IVLEN, ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptUpdate(de, NULL, &len, ciphertxt, len)); + decryptedtxtSz = len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(de, EVP_CTRL_CCM_SET_TAG, 16, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(de, decryptedtxt, &len)); + decryptedtxtSz += len; + ExpectIntEQ(0, decryptedtxtSz); + + EVP_CIPHER_CTX_free(en); + EVP_CIPHER_CTX_free(de); + + res = EXPECT_RESULT(); +#endif /* OPENSSL_EXTRA && WOLFSSL_SM4_CCM */ + return res; +} + +static int test_wolfssl_EVP_sm4_ccm(void) { int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM4_CCM) + EXPECT_DECLS; + byte *key = (byte*)"0123456789012345"; + byte *iv = (byte*)"0123456789012"; + int ivSz = (int)XSTRLEN((char*)iv); + /* Message to be encrypted */ + byte *plaintxt = (byte*)"for things to change you have to change"; + /* Additional non-confidential data */ + byte *aad = (byte*)"Don't spend major time on minor things."; + + unsigned char tag[SM4_BLOCK_SIZE] = {0}; + int plaintxtSz = (int)XSTRLEN((char*)plaintxt); + int aadSz = (int)XSTRLEN((char*)aad); + byte ciphertxt[SM4_BLOCK_SIZE * 4] = {0}; + byte decryptedtxt[SM4_BLOCK_SIZE * 4] = {0}; + int ciphertxtSz = 0; + int decryptedtxtSz = 0; + int len = 0; + int i = 0; + EVP_CIPHER_CTX en[2]; + EVP_CIPHER_CTX de[2]; + + for (i = 0; i < 2; i++) { + EVP_CIPHER_CTX_init(&en[i]); + + if (i == 0) { + /* Default uses 96-bits IV length */ + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_sm4_ccm(), NULL, key, + iv)); + } + else { + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], EVP_sm4_ccm(), NULL, NULL, + NULL)); + /* non-default must to set the IV length first */ + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_CCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_EncryptInit_ex(&en[i], NULL, NULL, key, iv)); + } + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_EncryptUpdate(&en[i], ciphertxt, &len, plaintxt, + plaintxtSz)); + ciphertxtSz = len; + ExpectIntEQ(1, EVP_EncryptFinal_ex(&en[i], ciphertxt, &len)); + ciphertxtSz += len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&en[i], EVP_CTRL_CCM_GET_TAG, + SM4_BLOCK_SIZE, tag)); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&en[i]), 1); + + EVP_CIPHER_CTX_init(&de[i]); + if (i == 0) { + /* Default uses 96-bits IV length */ + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_sm4_ccm(), NULL, key, + iv)); + } + else { + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], EVP_sm4_ccm(), NULL, NULL, + NULL)); + /* non-default must to set the IV length first */ + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_CCM_SET_IVLEN, + ivSz, NULL)); + ExpectIntEQ(1, EVP_DecryptInit_ex(&de[i], NULL, NULL, key, iv)); + + } + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); + decryptedtxtSz = len; + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_CCM_SET_TAG, + SM4_BLOCK_SIZE, tag)); + ExpectIntEQ(1, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); + decryptedtxtSz += len; + ExpectIntEQ(ciphertxtSz, decryptedtxtSz); + ExpectIntEQ(0, XMEMCMP(plaintxt, decryptedtxt, decryptedtxtSz)); + + /* modify tag*/ + tag[SM4_BLOCK_SIZE-1]+=0xBB; + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], NULL, &len, aad, aadSz)); + ExpectIntEQ(1, EVP_CIPHER_CTX_ctrl(&de[i], EVP_CTRL_CCM_SET_TAG, + SM4_BLOCK_SIZE, tag)); + /* fail due to wrong tag */ + ExpectIntEQ(1, EVP_DecryptUpdate(&de[i], decryptedtxt, &len, ciphertxt, + ciphertxtSz)); + ExpectIntEQ(0, EVP_DecryptFinal_ex(&de[i], decryptedtxt, &len)); + ExpectIntEQ(0, len); + ExpectIntEQ(wolfSSL_EVP_CIPHER_CTX_cleanup(&de[i]), 1); + } + + res = EXPECT_RESULT(); +#endif /* OPENSSL_EXTRA && WOLFSSL_SM4_CCM */ + return res; +} + +static int test_wolfSSL_EVP_PKEY_hkdf(void) +{ + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(HAVE_HKDF) - EVP_PKEY_CTX* ctx; + EVP_PKEY_CTX* ctx = NULL; byte salt[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}; byte key[] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, @@ -57116,134 +68809,132 @@ 0xD7, 0xE2, 0x15, 0xBC, 0xB8, 0x10, 0xEF, 0x6C, 0x4D, 0x7A }; - AssertNotNull((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL))); - AssertIntEQ(EVP_PKEY_derive_init(ctx), WOLFSSL_SUCCESS); + ExpectNotNull((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL))); + ExpectIntEQ(EVP_PKEY_derive_init(ctx), WOLFSSL_SUCCESS); /* NULL ctx. */ - AssertIntEQ(EVP_PKEY_CTX_set_hkdf_md(NULL, EVP_sha256()), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_CTX_set_hkdf_md(NULL, EVP_sha256()), WOLFSSL_FAILURE); /* NULL md. */ - AssertIntEQ(EVP_PKEY_CTX_set_hkdf_md(ctx, NULL), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_CTX_set_hkdf_md(ctx, EVP_sha256()), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set_hkdf_md(ctx, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_CTX_set_hkdf_md(ctx, EVP_sha256()), WOLFSSL_SUCCESS); /* NULL ctx. */ - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(NULL, salt, sizeof(salt)), + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(NULL, salt, sizeof(salt)), WOLFSSL_FAILURE); /* NULL salt is ok. */ - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, NULL, sizeof(salt)), + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, NULL, sizeof(salt)), WOLFSSL_SUCCESS); /* Salt length <= 0. */ /* Length 0 salt is ok. */ - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, salt, 0), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, salt, -1), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, salt, sizeof(salt)), + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, salt, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, salt, -1), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_salt(ctx, salt, sizeof(salt)), WOLFSSL_SUCCESS); /* NULL ctx. */ - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_key(NULL, key, sizeof(key)), + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_key(NULL, key, sizeof(key)), WOLFSSL_FAILURE); /* NULL key. */ - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, NULL, sizeof(key)), + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, NULL, sizeof(key)), WOLFSSL_FAILURE); /* Key length <= 0 */ - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, key, 0), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, key, -1), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, key, sizeof(key)), + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, key, 0), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, key, -1), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_CTX_set1_hkdf_key(ctx, key, sizeof(key)), WOLFSSL_SUCCESS); /* NULL ctx. */ - AssertIntEQ(EVP_PKEY_CTX_add1_hkdf_info(NULL, info, sizeof(info)), + ExpectIntEQ(EVP_PKEY_CTX_add1_hkdf_info(NULL, info, sizeof(info)), WOLFSSL_FAILURE); /* NULL info is ok. */ - AssertIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, NULL, sizeof(info)), + ExpectIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, NULL, sizeof(info)), WOLFSSL_SUCCESS); /* Info length <= 0 */ /* Length 0 info is ok. */ - AssertIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info, 0), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info, -1), WOLFSSL_FAILURE); - AssertIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info, sizeof(info)), + ExpectIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info, -1), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info, sizeof(info)), WOLFSSL_SUCCESS); /* NULL ctx. */ - AssertIntEQ(EVP_PKEY_CTX_hkdf_mode(NULL, EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY), + ExpectIntEQ(EVP_PKEY_CTX_hkdf_mode(NULL, EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY), WOLFSSL_FAILURE); /* Extract and expand (default). */ - AssertIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); - AssertIntEQ(outKeySz, sizeof(extractAndExpand)); - AssertIntEQ(XMEMCMP(outKey, extractAndExpand, outKeySz), 0); + ExpectIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); + ExpectIntEQ(outKeySz, sizeof(extractAndExpand)); + ExpectIntEQ(XMEMCMP(outKey, extractAndExpand, outKeySz), 0); /* Extract only. */ - AssertIntEQ(EVP_PKEY_CTX_hkdf_mode(ctx, EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY), + ExpectIntEQ(EVP_PKEY_CTX_hkdf_mode(ctx, EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); - AssertIntEQ(outKeySz, sizeof(extractOnly)); - AssertIntEQ(XMEMCMP(outKey, extractOnly, outKeySz), 0); + ExpectIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); + ExpectIntEQ(outKeySz, sizeof(extractOnly)); + ExpectIntEQ(XMEMCMP(outKey, extractOnly, outKeySz), 0); outKeySz = sizeof(outKey); /* Expand only. */ - AssertIntEQ(EVP_PKEY_CTX_hkdf_mode(ctx, EVP_PKEY_HKDEF_MODE_EXPAND_ONLY), + ExpectIntEQ(EVP_PKEY_CTX_hkdf_mode(ctx, EVP_PKEY_HKDEF_MODE_EXPAND_ONLY), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); - AssertIntEQ(outKeySz, sizeof(expandOnly)); - AssertIntEQ(XMEMCMP(outKey, expandOnly, outKeySz), 0); + ExpectIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); + ExpectIntEQ(outKeySz, sizeof(expandOnly)); + ExpectIntEQ(XMEMCMP(outKey, expandOnly, outKeySz), 0); outKeySz = sizeof(outKey); /* Extract and expand with appended additional info. */ - AssertIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info2, sizeof(info2)), + ExpectIntEQ(EVP_PKEY_CTX_add1_hkdf_info(ctx, info2, sizeof(info2)), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_CTX_hkdf_mode(ctx, + ExpectIntEQ(EVP_PKEY_CTX_hkdf_mode(ctx, EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND), WOLFSSL_SUCCESS); - AssertIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); - AssertIntEQ(outKeySz, sizeof(extractAndExpandAddInfo)); - AssertIntEQ(XMEMCMP(outKey, extractAndExpandAddInfo, outKeySz), 0); + ExpectIntEQ(EVP_PKEY_derive(ctx, outKey, &outKeySz), WOLFSSL_SUCCESS); + ExpectIntEQ(outKeySz, sizeof(extractAndExpandAddInfo)); + ExpectIntEQ(XMEMCMP(outKey, extractAndExpandAddInfo, outKeySz), 0); EVP_PKEY_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_EXTRA && HAVE_HKDF */ - return res; + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_PEM_X509_INFO_read_bio(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) - BIO* bio; - X509_INFO* info; - STACK_OF(X509_INFO)* sk; - char* subject; - char exp1[] = "/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/CN=www.wolfssl.com/emailAddress=info@wolfssl.com"; - char exp2[] = "/C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Support/CN=www.wolfssl.com/emailAddress=info@wolfssl.com"; - - AssertNotNull(bio = BIO_new(BIO_s_file())); - AssertIntGT(BIO_read_filename(bio, svrCertFile), 0); - AssertNotNull(sk = PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL)); - AssertIntEQ(sk_X509_INFO_num(sk), 2); + BIO* bio = NULL; + X509_INFO* info = NULL; + STACK_OF(X509_INFO)* sk = NULL; + char* subject = NULL; + char exp1[] = "/C=US/ST=Montana/L=Bozeman/O=Sawtooth/OU=Consulting/" + "CN=www.wolfssl.com/emailAddress=info@wolfssl.com"; + char exp2[] = "/C=US/ST=Montana/L=Bozeman/O=wolfSSL/OU=Support/" + "CN=www.wolfssl.com/emailAddress=info@wolfssl.com"; + + ExpectNotNull(bio = BIO_new(BIO_s_file())); + ExpectIntGT(BIO_read_filename(bio, svrCertFile), 0); + ExpectNotNull(sk = PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL)); + ExpectIntEQ(sk_X509_INFO_num(sk), 2); /* using dereference to maintain testing for Apache port*/ - AssertNotNull(info = sk_X509_INFO_pop(sk)); - AssertNotNull(subject = - X509_NAME_oneline(X509_get_subject_name(info->x509), 0, 0)); + ExpectNotNull(info = sk_X509_INFO_pop(sk)); + ExpectNotNull(subject = X509_NAME_oneline(X509_get_subject_name(info->x509), + 0, 0)); - AssertIntEQ(0, XSTRNCMP(subject, exp1, sizeof(exp1))); + ExpectIntEQ(0, XSTRNCMP(subject, exp1, sizeof(exp1))); XFREE(subject, 0, DYNAMIC_TYPE_OPENSSL); X509_INFO_free(info); + info = NULL; - AssertNotNull(info = sk_X509_INFO_pop(sk)); - AssertNotNull(subject = - X509_NAME_oneline(X509_get_subject_name(info->x509), 0, 0)); + ExpectNotNull(info = sk_X509_INFO_pop(sk)); + ExpectNotNull(subject = X509_NAME_oneline(X509_get_subject_name(info->x509), + 0, 0)); - AssertIntEQ(0, XSTRNCMP(subject, exp2, sizeof(exp2))); + ExpectIntEQ(0, XSTRNCMP(subject, exp2, sizeof(exp2))); XFREE(subject, 0, DYNAMIC_TYPE_OPENSSL); X509_INFO_free(info); - AssertNull(info = sk_X509_INFO_pop(sk)); + ExpectNull(info = sk_X509_INFO_pop(sk)); sk_X509_INFO_pop_free(sk, X509_INFO_free); BIO_free(bio); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #endif /* !NO_BIO */ static int test_wolfSSL_X509_NAME_ENTRY_get_object(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && !defined(NO_RSA) X509 *x509 = NULL; X509_NAME* name = NULL; int idx = 0; @@ -57259,18 +68950,15 @@ ExpectNotNull(object = X509_NAME_ENTRY_get_object(ne)); X509_free(x509); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_STORE_get1_certs(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SIGNER_DER_CERT) && \ !defined(NO_FILESYSTEM) && !defined(NO_RSA) - EXPECT_DECLS; X509_STORE_CTX *storeCtx = NULL; X509_STORE *store = NULL; X509 *caX509 = NULL; @@ -57314,21 +69002,203 @@ X509_STORE_CTX_free(storeCtx); X509_free(svrX509); X509_free(caX509); +#endif /* OPENSSL_EXTRA && WOLFSSL_SIGNER_DER_CERT && !NO_FILESYSTEM */ + return EXPECT_RESULT(); +} + +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ + defined(WOLFSSL_LOCAL_X509_STORE) && \ + (defined(OPENSSL_ALL) || defined(WOLFSSL_QT)) && defined(HAVE_CRL) +static int test_wolfSSL_X509_STORE_set_get_crl_provider(X509_STORE_CTX* ctx, + X509_CRL** crl_out, X509* cert) { + X509_CRL *crl = NULL; + XFILE fp = XBADFILE; + char* cert_issuer = X509_NAME_oneline(X509_get_issuer_name(cert), NULL, 0); + int ret = 0; + + (void)ctx; + + if (cert_issuer == NULL) + return 0; + + if ((fp = XFOPEN("certs/crl/crl.pem", "rb")) != XBADFILE) { + PEM_read_X509_CRL(fp, &crl, NULL, NULL); + XFCLOSE(fp); + if (crl != NULL) { + char* crl_issuer = X509_NAME_oneline( + X509_CRL_get_issuer(crl), NULL, 0); + if ((crl_issuer != NULL) && + (XSTRCMP(cert_issuer, crl_issuer) == 0)) { + *crl_out = X509_CRL_dup(crl); + if (*crl_out != NULL) + ret = 1; + } + OPENSSL_free(crl_issuer); + } + } + + X509_CRL_free(crl); + OPENSSL_free(cert_issuer); + return ret; +} + +static int test_wolfSSL_X509_STORE_set_get_crl_provider2(X509_STORE_CTX* ctx, + X509_CRL** crl_out, X509* cert) { + (void)ctx; + (void)cert; + *crl_out = NULL; + return 1; +} + +#ifndef NO_WOLFSSL_STUB +static int test_wolfSSL_X509_STORE_set_get_crl_check(X509_STORE_CTX* ctx, + X509_CRL* crl) { + (void)ctx; + (void)crl; + return 1; +} +#endif + +static int test_wolfSSL_X509_STORE_set_get_crl_verify(int ok, + X509_STORE_CTX* ctx) { + int cert_error = X509_STORE_CTX_get_error(ctx); + X509_VERIFY_PARAM* param = X509_STORE_CTX_get0_param(ctx); + int flags = X509_VERIFY_PARAM_get_flags(param); + if ((flags & (X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL)) != + (X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL)) { + /* Make sure the flags are set */ + return 0; + } + /* Ignore CRL missing error */ +#ifndef OPENSSL_COMPATIBLE_DEFAULTS + if (cert_error == CRL_MISSING) +#else + if (cert_error == X509_V_ERR_UNABLE_TO_GET_CRL) +#endif + return 1; + return ok; +} + +static int test_wolfSSL_X509_STORE_set_get_crl_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + X509_STORE* cert_store = NULL; + + ExpectIntEQ(wolfSSL_CTX_EnableCRL(ctx, WOLFSSL_CRL_CHECKALL), + WOLFSSL_SUCCESS); + ExpectNotNull(cert_store = SSL_CTX_get_cert_store(ctx)); + X509_STORE_set_get_crl(cert_store, + test_wolfSSL_X509_STORE_set_get_crl_provider); +#ifndef NO_WOLFSSL_STUB + X509_STORE_set_check_crl(cert_store, + test_wolfSSL_X509_STORE_set_get_crl_check); +#endif + + return EXPECT_RESULT(); +} + +static int test_wolfSSL_X509_STORE_set_get_crl_ctx_ready2(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + X509_STORE* cert_store = NULL; + X509_VERIFY_PARAM* param = NULL; + + SSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL); + ExpectIntEQ(wolfSSL_CTX_EnableCRL(ctx, WOLFSSL_CRL_CHECKALL), + WOLFSSL_SUCCESS); + ExpectNotNull(cert_store = SSL_CTX_get_cert_store(ctx)); + X509_STORE_set_get_crl(cert_store, + test_wolfSSL_X509_STORE_set_get_crl_provider2); +#ifndef NO_WOLFSSL_STUB + X509_STORE_set_check_crl(cert_store, + test_wolfSSL_X509_STORE_set_get_crl_check); +#endif + X509_STORE_set_verify_cb(cert_store, + test_wolfSSL_X509_STORE_set_get_crl_verify); + ExpectNotNull(param = X509_STORE_get0_param(cert_store)); + ExpectIntEQ(X509_VERIFY_PARAM_set_flags( + param, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL), 1); + ExpectIntEQ(X509_STORE_set_flags(cert_store, + X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL), 1); + + return EXPECT_RESULT(); +} +#endif + +/* This test mimics the usage of the CRL provider in gRPC */ +static int test_wolfSSL_X509_STORE_set_get_crl(void) +{ + EXPECT_DECLS; +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && \ + defined(WOLFSSL_LOCAL_X509_STORE) && \ + (defined(OPENSSL_ALL) || defined(WOLFSSL_QT)) && defined(HAVE_CRL) + test_ssl_cbf func_cb_client; + test_ssl_cbf func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + + func_cb_client.ctx_ready = test_wolfSSL_X509_STORE_set_get_crl_ctx_ready; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, + &func_cb_server, NULL), TEST_SUCCESS); + + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + + func_cb_client.ctx_ready = test_wolfSSL_X509_STORE_set_get_crl_ctx_ready2; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&func_cb_client, + &func_cb_server, NULL), TEST_SUCCESS); +#endif + return EXPECT_RESULT(); +} + + +static int test_wolfSSL_dup_CA_list(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_ALL) + EXPECT_DECLS; + STACK_OF(X509_NAME) *originalStack = NULL; + STACK_OF(X509_NAME) *copyStack = NULL; + int originalCount = 0; + int copyCount = 0; + X509_NAME *name = NULL; + int i; + + originalStack = sk_X509_NAME_new_null(); + ExpectNotNull(originalStack); + + for (i = 0; i < 3; i++) { + name = X509_NAME_new(); + ExpectNotNull(name); + ExpectIntEQ(sk_X509_NAME_push(originalStack, name), WOLFSSL_SUCCESS); + if (EXPECT_FAIL()) { + X509_NAME_free(name); + } + } + + copyStack = SSL_dup_CA_list(originalStack); + ExpectNotNull(copyStack); + originalCount = sk_X509_NAME_num(originalStack); + copyCount = sk_X509_NAME_num(copyStack); + + ExpectIntEQ(originalCount, copyCount); + sk_X509_NAME_pop_free(originalStack, X509_NAME_free); + sk_X509_NAME_pop_free(copyStack, X509_NAME_free); + + originalStack = NULL; + copyStack = NULL; res = EXPECT_RESULT(); -#endif /* OPENSSL_EXTRA && WOLFSSL_SIGNER_DER_CERT && !NO_FILESYSTEM */ +#endif /* OPENSSL_ALL */ return res; } -/* include misc.c here regardless of NO_INLINE, because misc.c implementations - * have default (hidden) visibility, and in the absence of visibility, it's - * benign to mask out the library implementation. - */ -#define WOLFSSL_MISC_INCLUDED -#include - static int test_ForceZero(void) { + EXPECT_DECLS; unsigned char data[32]; unsigned int i, j, len; @@ -57345,246 +69215,267 @@ for (j = 0; j < sizeof(data); j++) { if (j < i || j >= i + len) { - if (data[j] == 0x00) - return -10200; + ExpectIntNE(data[j], 0x00); + } + else { + ExpectIntEQ(data[j], 0x00); } - else if (data[j] != 0x00) - return -10201; } } } - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #ifndef NO_BIO static int test_wolfSSL_X509_print(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && \ - !defined(NO_RSA) && !defined(HAVE_FAST_RSA) && defined(XSNPRINTF) - X509 *x509; - BIO *bio; + !defined(NO_RSA) && defined(XSNPRINTF) + X509 *x509 = NULL; + BIO *bio = NULL; #if defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_DIR) - const X509_ALGOR *cert_sig_alg; + const X509_ALGOR *cert_sig_alg = NULL; #endif - x509 = X509_load_certificate_file(svrCertFile, WOLFSSL_FILETYPE_PEM); - AssertNotNull(x509); + ExpectNotNull(x509 = X509_load_certificate_file(svrCertFile, + WOLFSSL_FILETYPE_PEM)); /* print to memory */ - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertIntEQ(X509_print(bio, x509), SSL_SUCCESS); + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectIntEQ(X509_print(bio, x509), SSL_SUCCESS); #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME) #if defined(WC_DISABLE_RADIX_ZERO_PAD) /* Will print IP address subject alt name. */ - AssertIntEQ(BIO_get_mem_data(bio, NULL), 3349); + ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3349); #elif defined(NO_ASN_TIME) /* Will print IP address subject alt name but not Validity. */ - AssertIntEQ(BIO_get_mem_data(bio, NULL), 3235); + ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3235); #else /* Will print IP address subject alt name. */ - AssertIntEQ(BIO_get_mem_data(bio, NULL), 3350); + ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3350); #endif #elif defined(NO_ASN_TIME) /* With NO_ASN_TIME defined, X509_print skips printing Validity. */ - AssertIntEQ(BIO_get_mem_data(bio, NULL), 3213); + ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3213); #else - AssertIntEQ(BIO_get_mem_data(bio, NULL), 3328); + ExpectIntEQ(BIO_get_mem_data(bio, NULL), 3328); #endif BIO_free(bio); + bio = NULL; - AssertNotNull(bio = BIO_new_fd(STDERR_FILENO, BIO_NOCLOSE)); + ExpectNotNull(bio = BIO_new_fd(STDERR_FILENO, BIO_NOCLOSE)); #if defined(OPENSSL_ALL) && !defined(NO_WOLFSSL_DIR) /* Print signature */ - AssertNotNull(cert_sig_alg = X509_get0_tbs_sigalg(x509)); - AssertIntEQ(X509_signature_print(bio, cert_sig_alg, NULL), SSL_SUCCESS); + ExpectNotNull(cert_sig_alg = X509_get0_tbs_sigalg(x509)); + ExpectIntEQ(X509_signature_print(bio, cert_sig_alg, NULL), SSL_SUCCESS); #endif /* print to stderr */ #if !defined(NO_WOLFSSL_DIR) - AssertIntEQ(X509_print(bio, x509), SSL_SUCCESS); + ExpectIntEQ(X509_print(bio, x509), SSL_SUCCESS); #endif /* print again */ - AssertIntEQ(X509_print_fp(stderr, x509), SSL_SUCCESS); + ExpectIntEQ(X509_print_fp(stderr, x509), SSL_SUCCESS); X509_free(x509); BIO_free(bio); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_X509_CRL_print(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && defined(HAVE_CRL)\ && !defined(NO_FILESYSTEM) && defined(XSNPRINTF) - X509_CRL* crl; - BIO *bio; - XFILE fp; + X509_CRL* crl = NULL; + BIO *bio = NULL; + XFILE fp = XBADFILE; - fp = XFOPEN("./certs/crl/crl.pem", "rb"); - AssertTrue((fp != XBADFILE)); - AssertNotNull(crl = (X509_CRL*)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, - NULL, NULL)); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN("./certs/crl/crl.pem", "rb")) != XBADFILE); + ExpectNotNull(crl = (X509_CRL*)PEM_read_X509_CRL(fp, (X509_CRL **)NULL, + NULL, NULL)); + if (fp != XBADFILE) + XFCLOSE(fp); - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertIntEQ(X509_CRL_print(bio, crl), SSL_SUCCESS); + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectIntEQ(X509_CRL_print(bio, crl), SSL_SUCCESS); X509_CRL_free(crl); BIO_free(bio); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_BIO_get_len(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_BIO) BIO *bio = NULL; const char txt[] = "Some example text to push to the BIO."; - AssertIntEQ(wolfSSL_BIO_get_len(bio), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_BIO_get_len(bio), BAD_FUNC_ARG); - AssertNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); + ExpectNotNull(bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem())); - AssertIntEQ(wolfSSL_BIO_write(bio, txt, sizeof(txt)), sizeof(txt)); - AssertIntEQ(wolfSSL_BIO_get_len(bio), sizeof(txt)); + ExpectIntEQ(wolfSSL_BIO_write(bio, txt, sizeof(txt)), sizeof(txt)); + ExpectIntEQ(wolfSSL_BIO_get_len(bio), sizeof(txt)); BIO_free(bio); + bio = NULL; - AssertNotNull(bio = BIO_new_fd(STDERR_FILENO, BIO_NOCLOSE)); - AssertIntEQ(wolfSSL_BIO_get_len(bio), WOLFSSL_BAD_FILE); + ExpectNotNull(bio = BIO_new_fd(STDERR_FILENO, BIO_NOCLOSE)); + ExpectIntEQ(wolfSSL_BIO_get_len(bio), WOLFSSL_BAD_FILE); BIO_free(bio); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #endif /* !NO_BIO */ static int test_wolfSSL_RSA(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_USER_RSA) && \ - defined(WOLFSSL_KEY_GEN) - RSA* rsa; - const BIGNUM *n; - const BIGNUM *e; - const BIGNUM *d; - const BIGNUM *p; - const BIGNUM *q; - const BIGNUM *dmp1; - const BIGNUM *dmq1; - const BIGNUM *iqmp; - - AssertNotNull(rsa = RSA_new()); - AssertIntEQ(RSA_size(NULL), 0); - AssertIntEQ(RSA_size(rsa), 0); - AssertIntEQ(RSA_set0_key(rsa, NULL, NULL, NULL), 0); - AssertIntEQ(RSA_set0_crt_params(rsa, NULL, NULL, NULL), 0); - AssertIntEQ(RSA_set0_factors(rsa, NULL, NULL), 0); + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) + RSA* rsa = NULL; + const BIGNUM *n = NULL; + const BIGNUM *e = NULL; + const BIGNUM *d = NULL; + const BIGNUM *p = NULL; + const BIGNUM *q = NULL; + const BIGNUM *dmp1 = NULL; + const BIGNUM *dmq1 = NULL; + const BIGNUM *iqmp = NULL; + + ExpectNotNull(rsa = RSA_new()); + ExpectIntEQ(RSA_size(NULL), 0); + ExpectIntEQ(RSA_size(rsa), 0); + ExpectIntEQ(RSA_set0_key(rsa, NULL, NULL, NULL), 0); + ExpectIntEQ(RSA_set0_crt_params(rsa, NULL, NULL, NULL), 0); + ExpectIntEQ(RSA_set0_factors(rsa, NULL, NULL), 0); #ifdef WOLFSSL_RSA_KEY_CHECK - AssertIntEQ(RSA_check_key(rsa), 0); + ExpectIntEQ(RSA_check_key(rsa), 0); #endif RSA_free(rsa); - AssertNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); - AssertIntEQ(RSA_size(rsa), 256); + rsa = NULL; + ExpectNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); + ExpectIntEQ(RSA_size(rsa), 256); #ifdef WOLFSSL_RSA_KEY_CHECK - AssertIntEQ(RSA_check_key(NULL), 0); - AssertIntEQ(RSA_check_key(rsa), 1); + ExpectIntEQ(RSA_check_key(NULL), 0); + ExpectIntEQ(RSA_check_key(rsa), 1); #endif /* sanity check */ - AssertIntEQ(RSA_bits(NULL), 0); + ExpectIntEQ(RSA_bits(NULL), 0); /* key */ - AssertIntEQ(RSA_bits(rsa), 2048); + ExpectIntEQ(RSA_bits(rsa), 2048); RSA_get0_key(rsa, &n, &e, &d); - AssertPtrEq(rsa->n, n); - AssertPtrEq(rsa->e, e); - AssertPtrEq(rsa->d, d); - AssertNotNull(n = BN_new()); - AssertNotNull(e = BN_new()); - AssertNotNull(d = BN_new()); - AssertIntEQ(RSA_set0_key(rsa, (BIGNUM*)n, (BIGNUM*)e, (BIGNUM*)d), 1); - AssertPtrEq(rsa->n, n); - AssertPtrEq(rsa->e, e); - AssertPtrEq(rsa->d, d); - AssertIntEQ(RSA_set0_key(rsa, NULL, NULL, NULL), 1); - AssertIntEQ(RSA_set0_key(NULL, (BIGNUM*)n, (BIGNUM*)e, (BIGNUM*)d), 0); + ExpectPtrEq(rsa->n, n); + ExpectPtrEq(rsa->e, e); + ExpectPtrEq(rsa->d, d); + n = NULL; + e = NULL; + d = NULL; + ExpectNotNull(n = BN_new()); + ExpectNotNull(e = BN_new()); + ExpectNotNull(d = BN_new()); + ExpectIntEQ(RSA_set0_key(rsa, (BIGNUM*)n, (BIGNUM*)e, (BIGNUM*)d), 1); + if (EXPECT_FAIL()) { + BN_free((BIGNUM*)n); + BN_free((BIGNUM*)e); + BN_free((BIGNUM*)d); + } + ExpectPtrEq(rsa->n, n); + ExpectPtrEq(rsa->e, e); + ExpectPtrEq(rsa->d, d); + ExpectIntEQ(RSA_set0_key(rsa, NULL, NULL, NULL), 1); + ExpectIntEQ(RSA_set0_key(NULL, (BIGNUM*)n, (BIGNUM*)e, (BIGNUM*)d), 0); /* crt_params */ RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp); - AssertPtrEq(rsa->dmp1, dmp1); - AssertPtrEq(rsa->dmq1, dmq1); - AssertPtrEq(rsa->iqmp, iqmp); - AssertNotNull(dmp1 = BN_new()); - AssertNotNull(dmq1 = BN_new()); - AssertNotNull(iqmp = BN_new()); - AssertIntEQ(RSA_set0_crt_params(rsa, (BIGNUM*)dmp1, (BIGNUM*)dmq1, + ExpectPtrEq(rsa->dmp1, dmp1); + ExpectPtrEq(rsa->dmq1, dmq1); + ExpectPtrEq(rsa->iqmp, iqmp); + dmp1 = NULL; + dmq1 = NULL; + iqmp = NULL; + ExpectNotNull(dmp1 = BN_new()); + ExpectNotNull(dmq1 = BN_new()); + ExpectNotNull(iqmp = BN_new()); + ExpectIntEQ(RSA_set0_crt_params(rsa, (BIGNUM*)dmp1, (BIGNUM*)dmq1, (BIGNUM*)iqmp), 1); - AssertPtrEq(rsa->dmp1, dmp1); - AssertPtrEq(rsa->dmq1, dmq1); - AssertPtrEq(rsa->iqmp, iqmp); - AssertIntEQ(RSA_set0_crt_params(rsa, NULL, NULL, NULL), 1); - AssertIntEQ(RSA_set0_crt_params(NULL, (BIGNUM*)dmp1, (BIGNUM*)dmq1, + if (EXPECT_FAIL()) { + BN_free((BIGNUM*)dmp1); + BN_free((BIGNUM*)dmq1); + BN_free((BIGNUM*)iqmp); + } + ExpectPtrEq(rsa->dmp1, dmp1); + ExpectPtrEq(rsa->dmq1, dmq1); + ExpectPtrEq(rsa->iqmp, iqmp); + ExpectIntEQ(RSA_set0_crt_params(rsa, NULL, NULL, NULL), 1); + ExpectIntEQ(RSA_set0_crt_params(NULL, (BIGNUM*)dmp1, (BIGNUM*)dmq1, (BIGNUM*)iqmp), 0); RSA_get0_crt_params(NULL, NULL, NULL, NULL); RSA_get0_crt_params(rsa, NULL, NULL, NULL); RSA_get0_crt_params(NULL, &dmp1, &dmq1, &iqmp); - AssertNull(dmp1); - AssertNull(dmq1); - AssertNull(iqmp); + ExpectNull(dmp1); + ExpectNull(dmq1); + ExpectNull(iqmp); /* factors */ RSA_get0_factors(rsa, NULL, NULL); RSA_get0_factors(rsa, &p, &q); - AssertPtrEq(rsa->p, p); - AssertPtrEq(rsa->q, q); - AssertNotNull(p = BN_new()); - AssertNotNull(q = BN_new()); - AssertIntEQ(RSA_set0_factors(rsa, (BIGNUM*)p, (BIGNUM*)q), 1); - AssertPtrEq(rsa->p, p); - AssertPtrEq(rsa->q, q); - AssertIntEQ(RSA_set0_factors(rsa, NULL, NULL), 1); - AssertIntEQ(RSA_set0_factors(NULL, (BIGNUM*)p, (BIGNUM*)q), 0); + ExpectPtrEq(rsa->p, p); + ExpectPtrEq(rsa->q, q); + p = NULL; + q = NULL; + ExpectNotNull(p = BN_new()); + ExpectNotNull(q = BN_new()); + ExpectIntEQ(RSA_set0_factors(rsa, (BIGNUM*)p, (BIGNUM*)q), 1); + if (EXPECT_FAIL()) { + BN_free((BIGNUM*)p); + BN_free((BIGNUM*)q); + } + ExpectPtrEq(rsa->p, p); + ExpectPtrEq(rsa->q, q); + ExpectIntEQ(RSA_set0_factors(rsa, NULL, NULL), 1); + ExpectIntEQ(RSA_set0_factors(NULL, (BIGNUM*)p, (BIGNUM*)q), 0); RSA_get0_factors(NULL, NULL, NULL); RSA_get0_factors(NULL, &p, &q); - AssertNull(p); - AssertNull(q); + ExpectNull(p); + ExpectNull(q); - AssertIntEQ(BN_hex2bn(&rsa->n, "1FFFFF"), 1); - AssertIntEQ(RSA_bits(rsa), 21); + ExpectIntEQ(BN_hex2bn(&rsa->n, "1FFFFF"), 1); + ExpectIntEQ(RSA_bits(rsa), 21); RSA_free(rsa); + rsa = NULL; #if !defined(USE_FAST_MATH) || (FP_MAX_BITS >= (3072*2)) - AssertNotNull(rsa = RSA_generate_key(3072, 17, NULL, NULL)); - AssertIntEQ(RSA_size(rsa), 384); - AssertIntEQ(RSA_bits(rsa), 3072); + ExpectNotNull(rsa = RSA_generate_key(3072, 17, NULL, NULL)); + ExpectIntEQ(RSA_size(rsa), 384); + ExpectIntEQ(RSA_bits(rsa), 3072); RSA_free(rsa); + rsa = NULL; #endif /* remove for now with odd key size until adjusting rsa key size check with wc_MakeRsaKey() - AssertNotNull(rsa = RSA_generate_key(2999, 65537, NULL, NULL)); + ExpectNotNull(rsa = RSA_generate_key(2999, 65537, NULL, NULL)); RSA_free(rsa); + rsa = NULL; */ - AssertNull(RSA_generate_key(-1, 3, NULL, NULL)); - AssertNull(RSA_generate_key(RSA_MIN_SIZE - 1, 3, NULL, NULL)); - AssertNull(RSA_generate_key(RSA_MAX_SIZE + 1, 3, NULL, NULL)); - AssertNull(RSA_generate_key(2048, 0, NULL, NULL)); + ExpectNull(RSA_generate_key(-1, 3, NULL, NULL)); + ExpectNull(RSA_generate_key(RSA_MIN_SIZE - 1, 3, NULL, NULL)); + ExpectNull(RSA_generate_key(RSA_MAX_SIZE + 1, 3, NULL, NULL)); + ExpectNull(RSA_generate_key(2048, 0, NULL, NULL)); #if !defined(NO_FILESYSTEM) && !defined(NO_ASN) @@ -57593,32 +69484,29 @@ byte der[FOURK_BUF]; const char PrivKeyPemFile[] = "certs/client-keyEnc.pem"; - XFILE f; - int bytes; + XFILE f = XBADFILE; + int bytes = 0; /* test loading encrypted RSA private pem w/o password */ - f = XFOPEN(PrivKeyPemFile, "rb"); - AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buff, 1, sizeof(buff), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(PrivKeyPemFile, "rb")) != XBADFILE); + ExpectIntGT(bytes = (int)XFREAD(buff, 1, sizeof(buff), f), 0); + if (f != XBADFILE) + XFCLOSE(f); XMEMSET(der, 0, sizeof(der)); /* test that error value is returned with no password */ - AssertIntLT(wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), ""), 0); + ExpectIntLT(wc_KeyPemToDer(buff, bytes, der, (word32)sizeof(der), ""), + 0); } #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_DER(void) { - int res = TEST_SKIPPED; -#if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(NO_RSA) && !defined(HAVE_USER_RSA) && defined(OPENSSL_EXTRA) - - RSA *rsa; + EXPECT_DECLS; +#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) && defined(OPENSSL_EXTRA) + RSA *rsa = NULL; int i; const unsigned char *buff = NULL; unsigned char *newBuff = NULL; @@ -57651,101 +69539,103 @@ {NULL, 0} }; - AssertNull(d2i_RSAPublicKey(&rsa, NULL, pub[0].sz)); + ExpectNull(d2i_RSAPublicKey(&rsa, NULL, pub[0].sz)); buff = pub[0].der; - AssertNull(d2i_RSAPublicKey(&rsa, &buff, 1)); - AssertNull(d2i_RSAPrivateKey(&rsa, NULL, tbl[0].sz)); + ExpectNull(d2i_RSAPublicKey(&rsa, &buff, 1)); + ExpectNull(d2i_RSAPrivateKey(&rsa, NULL, tbl[0].sz)); buff = tbl[0].der; - AssertNull(d2i_RSAPrivateKey(&rsa, &buff, 1)); + ExpectNull(d2i_RSAPrivateKey(&rsa, &buff, 1)); - AssertIntEQ(i2d_RSAPublicKey(NULL, NULL), BAD_FUNC_ARG); + ExpectIntEQ(i2d_RSAPublicKey(NULL, NULL), BAD_FUNC_ARG); rsa = RSA_new(); - AssertIntEQ(i2d_RSAPublicKey(rsa, NULL), 0); + ExpectIntEQ(i2d_RSAPublicKey(rsa, NULL), 0); RSA_free(rsa); + rsa = NULL; for (i = 0; tbl[i].der != NULL; i++) { /* Passing in pointer results in pointer moving. */ buff = tbl[i].der; - AssertNotNull(d2i_RSAPublicKey(&rsa, &buff, tbl[i].sz)); - AssertNotNull(rsa); + ExpectNotNull(d2i_RSAPublicKey(&rsa, &buff, tbl[i].sz)); + ExpectNotNull(rsa); RSA_free(rsa); + rsa = NULL; } for (i = 0; tbl[i].der != NULL; i++) { /* Passing in pointer results in pointer moving. */ buff = tbl[i].der; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &buff, tbl[i].sz)); - AssertNotNull(rsa); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &buff, tbl[i].sz)); + ExpectNotNull(rsa); RSA_free(rsa); + rsa = NULL; } for (i = 0; pub[i].der != NULL; i++) { buff = pub[i].der; - AssertNotNull(d2i_RSAPublicKey(&rsa, &buff, pub[i].sz)); - AssertNotNull(rsa); - AssertIntEQ(i2d_RSAPublicKey(rsa, NULL), pub[i].sz); + ExpectNotNull(d2i_RSAPublicKey(&rsa, &buff, pub[i].sz)); + ExpectNotNull(rsa); + ExpectIntEQ(i2d_RSAPublicKey(rsa, NULL), pub[i].sz); newBuff = NULL; - AssertIntEQ(i2d_RSAPublicKey(rsa, &newBuff), pub[i].sz); - AssertNotNull(newBuff); - AssertIntEQ(XMEMCMP((void *)newBuff, (void *)pub[i].der, pub[i].sz), 0); + ExpectIntEQ(i2d_RSAPublicKey(rsa, &newBuff), pub[i].sz); + ExpectNotNull(newBuff); + ExpectIntEQ(XMEMCMP((void *)newBuff, (void *)pub[i].der, pub[i].sz), 0); XFREE((void *)newBuff, NULL, DYNAMIC_TYPE_TMP_BUFFER); RSA_free(rsa); + rsa = NULL; } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_print(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && \ - !defined(NO_RSA) && !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_FAST_RSA) && !defined(NO_BIO) && defined(XFPRINTF) - BIO *bio; + !defined(NO_STDIO_FILESYSTEM) && \ + !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ + !defined(NO_BIO) && defined(XFPRINTF) + BIO *bio = NULL; WOLFSSL_RSA* rsa = NULL; - AssertNotNull(bio = BIO_new_fd(STDERR_FILENO, BIO_NOCLOSE)); - AssertNotNull(rsa = RSA_new()); + ExpectNotNull(bio = BIO_new_fd(STDERR_FILENO, BIO_NOCLOSE)); + ExpectNotNull(rsa = RSA_new()); - AssertIntEQ(RSA_print(NULL, rsa, 0), -1); - AssertIntEQ(RSA_print_fp(XBADFILE, rsa, 0), 0); - AssertIntEQ(RSA_print(bio, NULL, 0), -1); - AssertIntEQ(RSA_print_fp(stderr, NULL, 0), 0); + ExpectIntEQ(RSA_print(NULL, rsa, 0), -1); + ExpectIntEQ(RSA_print_fp(XBADFILE, rsa, 0), 0); + ExpectIntEQ(RSA_print(bio, NULL, 0), -1); + ExpectIntEQ(RSA_print_fp(stderr, NULL, 0), 0); /* Some very large number of indent spaces. */ - AssertIntEQ(RSA_print(bio, rsa, 128), -1); + ExpectIntEQ(RSA_print(bio, rsa, 128), -1); /* RSA is empty. */ - AssertIntEQ(RSA_print(bio, rsa, 0), 0); - AssertIntEQ(RSA_print_fp(stderr, rsa, 0), 0); + ExpectIntEQ(RSA_print(bio, rsa, 0), 0); + ExpectIntEQ(RSA_print_fp(stderr, rsa, 0), 0); RSA_free(rsa); - AssertNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); + rsa = NULL; + ExpectNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); - AssertIntEQ(RSA_print(bio, rsa, 0), 1); - AssertIntEQ(RSA_print(bio, rsa, 4), 1); - AssertIntEQ(RSA_print(bio, rsa, -1), 1); - AssertIntEQ(RSA_print_fp(stderr, rsa, 0), 1); - AssertIntEQ(RSA_print_fp(stderr, rsa, 4), 1); - AssertIntEQ(RSA_print_fp(stderr, rsa, -1), 1); + ExpectIntEQ(RSA_print(bio, rsa, 0), 1); + ExpectIntEQ(RSA_print(bio, rsa, 4), 1); + ExpectIntEQ(RSA_print(bio, rsa, -1), 1); + ExpectIntEQ(RSA_print_fp(stderr, rsa, 0), 1); + ExpectIntEQ(RSA_print_fp(stderr, rsa, 4), 1); + ExpectIntEQ(RSA_print_fp(stderr, rsa, -1), 1); BIO_free(bio); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } -#ifndef NO_RSA static int test_wolfSSL_RSA_padding_add_PKCS1_PSS(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; +#ifndef NO_RSA #if defined(OPENSSL_ALL) && defined(WC_RSA_PSS) && !defined(WC_NO_RNG) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - RSA *rsa; + RSA *rsa = NULL; const unsigned char *derBuf = client_key_der_2048; unsigned char em[256] = {0}; /* len = 2048/8 */ /* Random data simulating a hash */ @@ -57755,62 +69645,60 @@ 0x6f, 0x8a, 0x3c, 0x42, 0xab, 0x21, 0xad, 0x28 }; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &derBuf, sizeof_client_key_der_2048)); - AssertIntEQ(RSA_padding_add_PKCS1_PSS(NULL, em, mHash, EVP_sha256(), - RSA_PSS_SALTLEN_DIGEST), 0); - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, NULL, mHash, EVP_sha256(), - RSA_PSS_SALTLEN_DIGEST), 0); - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, NULL, EVP_sha256(), - RSA_PSS_SALTLEN_DIGEST), 0); - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, NULL, - RSA_PSS_SALTLEN_DIGEST), 0); - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), -5), 0); - - AssertIntEQ(RSA_verify_PKCS1_PSS(NULL, mHash, EVP_sha256(), em, - RSA_PSS_SALTLEN_MAX_SIGN), 0); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, NULL, EVP_sha256(), em, - RSA_PSS_SALTLEN_MAX_SIGN), 0); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, NULL, em, - RSA_PSS_SALTLEN_MAX_SIGN), 0); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), NULL, - RSA_PSS_SALTLEN_MAX_SIGN), 0); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, - RSA_PSS_SALTLEN_MAX_SIGN), 0); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, -5), 0); - - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), - RSA_PSS_SALTLEN_DIGEST), 1); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, - RSA_PSS_SALTLEN_DIGEST), 1); - - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), - RSA_PSS_SALTLEN_MAX_SIGN), 1); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, - RSA_PSS_SALTLEN_MAX_SIGN), 1); - - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), - RSA_PSS_SALTLEN_MAX), 1); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, - RSA_PSS_SALTLEN_MAX), 1); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &derBuf, sizeof_client_key_der_2048)); + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(NULL, em, mHash, EVP_sha256(), + RSA_PSS_SALTLEN_DIGEST), 0); + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, NULL, mHash, EVP_sha256(), + RSA_PSS_SALTLEN_DIGEST), 0); + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, NULL, EVP_sha256(), + RSA_PSS_SALTLEN_DIGEST), 0); + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, NULL, + RSA_PSS_SALTLEN_DIGEST), 0); + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), -5), 0); + + ExpectIntEQ(RSA_verify_PKCS1_PSS(NULL, mHash, EVP_sha256(), em, + RSA_PSS_SALTLEN_MAX_SIGN), 0); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, NULL, EVP_sha256(), em, + RSA_PSS_SALTLEN_MAX_SIGN), 0); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, NULL, em, + RSA_PSS_SALTLEN_MAX_SIGN), 0); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), NULL, + RSA_PSS_SALTLEN_MAX_SIGN), 0); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, + RSA_PSS_SALTLEN_MAX_SIGN), 0); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, -5), 0); + + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), + RSA_PSS_SALTLEN_DIGEST), 1); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, + RSA_PSS_SALTLEN_DIGEST), 1); + + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), + RSA_PSS_SALTLEN_MAX_SIGN), 1); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, + RSA_PSS_SALTLEN_MAX_SIGN), 1); + + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), + RSA_PSS_SALTLEN_MAX), 1); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, + RSA_PSS_SALTLEN_MAX), 1); - AssertIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), 10), 1); - AssertIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, 10), 1); + ExpectIntEQ(RSA_padding_add_PKCS1_PSS(rsa, em, mHash, EVP_sha256(), 10), 1); + ExpectIntEQ(RSA_verify_PKCS1_PSS(rsa, mHash, EVP_sha256(), em, 10), 1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* OPENSSL_ALL && WC_RSA_PSS && !WC_NO_RNG*/ - return res; -} #endif + return EXPECT_RESULT(); +} static int test_wolfSSL_RSA_sign_sha3(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) #if defined(OPENSSL_ALL) && defined(WC_RSA_PSS) && !defined(WC_NO_RNG) - RSA *rsa; + RSA* rsa = NULL; const unsigned char *derBuf = client_key_der_2048; unsigned char sigRet[256] = {0}; unsigned int sigLen = sizeof(sigRet); @@ -57821,22 +69709,20 @@ 0x6f, 0x8a, 0x3c, 0x42, 0xab, 0x21, 0xad, 0x28 }; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &derBuf, sizeof_client_key_der_2048)); - AssertIntEQ(RSA_sign(NID_sha3_256, mHash, sizeof(mHash), sigRet, - &sigLen, rsa), 1); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &derBuf, sizeof_client_key_der_2048)); + ExpectIntEQ(RSA_sign(NID_sha3_256, mHash, sizeof(mHash), sigRet, &sigLen, + rsa), 1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_ALL && WC_RSA_PSS && !WC_NO_RNG*/ #endif /* !NO_RSA && WOLFSSL_SHA3 && !WOLFSSL_NOSHA3_256*/ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_get0_key(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_USER_RSA) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) RSA *rsa = NULL; const BIGNUM* n = NULL; const BIGNUM* e = NULL; @@ -57860,115 +69746,117 @@ RSA_get0_key(NULL, NULL, NULL, NULL); RSA_get0_key(rsa, NULL, NULL, NULL); RSA_get0_key(NULL, &n, &e, &d); - AssertNull(n); - AssertNull(e); - AssertNull(d); + ExpectNull(n); + ExpectNull(e); + ExpectNull(d); - AssertNotNull(d2i_RSAPrivateKey(&rsa, &der, derSz)); - AssertNotNull(rsa); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &der, derSz)); + ExpectNotNull(rsa); RSA_get0_key(rsa, NULL, NULL, NULL); RSA_get0_key(rsa, &n, NULL, NULL); - AssertNotNull(n); + ExpectNotNull(n); RSA_get0_key(rsa, NULL, &e, NULL); - AssertNotNull(e); + ExpectNotNull(e); RSA_get0_key(rsa, NULL, NULL, &d); - AssertNotNull(d); + ExpectNotNull(d); RSA_get0_key(rsa, &n, &e, &d); - AssertNotNull(n); - AssertNotNull(e); - AssertNotNull(d); + ExpectNotNull(n); + ExpectNotNull(e); + ExpectNotNull(d); RSA_free(rsa); } - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_meth(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) - RSA *rsa; - RSA_METHOD *rsa_meth; + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) + RSA *rsa = NULL; + RSA_METHOD *rsa_meth = NULL; #ifdef WOLFSSL_KEY_GEN - AssertNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); + ExpectNotNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); RSA_free(rsa); + rsa = NULL; #else - AssertNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); + ExpectNull(rsa = RSA_generate_key(2048, 3, NULL, NULL)); #endif - AssertNotNull(RSA_get_default_method()); + ExpectNotNull(RSA_get_default_method()); wolfSSL_RSA_meth_free(NULL); - AssertNull(wolfSSL_RSA_meth_new(NULL, 0)); + ExpectNull(wolfSSL_RSA_meth_new(NULL, 0)); - AssertNotNull(rsa_meth = - RSA_meth_new("placeholder RSA method", RSA_METHOD_FLAG_NO_CHECK)); + ExpectNotNull(rsa_meth = RSA_meth_new("placeholder RSA method", + RSA_METHOD_FLAG_NO_CHECK)); #ifndef NO_WOLFSSL_STUB - AssertIntEQ(RSA_meth_set_pub_enc(rsa_meth, NULL), 1); - AssertIntEQ(RSA_meth_set_pub_dec(rsa_meth, NULL), 1); - AssertIntEQ(RSA_meth_set_priv_enc(rsa_meth, NULL), 1); - AssertIntEQ(RSA_meth_set_priv_dec(rsa_meth, NULL), 1); - AssertIntEQ(RSA_meth_set_init(rsa_meth, NULL), 1); - AssertIntEQ(RSA_meth_set_finish(rsa_meth, NULL), 1); - AssertIntEQ(RSA_meth_set0_app_data(rsa_meth, NULL), 1); + ExpectIntEQ(RSA_meth_set_pub_enc(rsa_meth, NULL), 1); + ExpectIntEQ(RSA_meth_set_pub_dec(rsa_meth, NULL), 1); + ExpectIntEQ(RSA_meth_set_priv_enc(rsa_meth, NULL), 1); + ExpectIntEQ(RSA_meth_set_priv_dec(rsa_meth, NULL), 1); + ExpectIntEQ(RSA_meth_set_init(rsa_meth, NULL), 1); + ExpectIntEQ(RSA_meth_set_finish(rsa_meth, NULL), 1); + ExpectIntEQ(RSA_meth_set0_app_data(rsa_meth, NULL), 1); #endif - AssertIntEQ(RSA_flags(NULL), 0); + ExpectIntEQ(RSA_flags(NULL), 0); RSA_set_flags(NULL, RSA_FLAG_CACHE_PUBLIC); RSA_clear_flags(NULL, RSA_FLAG_CACHE_PUBLIC); - AssertIntEQ(RSA_test_flags(NULL, RSA_FLAG_CACHE_PUBLIC), 0); + ExpectIntEQ(RSA_test_flags(NULL, RSA_FLAG_CACHE_PUBLIC), 0); - AssertNotNull(rsa = RSA_new()); + ExpectNotNull(rsa = RSA_new()); /* No method set. */ - AssertIntEQ(RSA_flags(rsa), 0); + ExpectIntEQ(RSA_flags(rsa), 0); RSA_set_flags(rsa, RSA_FLAG_CACHE_PUBLIC); RSA_clear_flags(rsa, RSA_FLAG_CACHE_PUBLIC); - AssertIntEQ(RSA_test_flags(rsa, RSA_FLAG_CACHE_PUBLIC), 0); + ExpectIntEQ(RSA_test_flags(rsa, RSA_FLAG_CACHE_PUBLIC), 0); - AssertIntEQ(RSA_set_method(NULL, rsa_meth), 1); - AssertIntEQ(RSA_set_method(rsa, rsa_meth), 1); - AssertNull(RSA_get_method(NULL)); - AssertPtrEq(RSA_get_method(rsa), rsa_meth); - AssertIntEQ(RSA_flags(rsa), RSA_METHOD_FLAG_NO_CHECK); + ExpectIntEQ(RSA_set_method(NULL, rsa_meth), 1); + ExpectIntEQ(RSA_set_method(rsa, rsa_meth), 1); + if (EXPECT_FAIL()) { + wolfSSL_RSA_meth_free(rsa_meth); + } + ExpectNull(RSA_get_method(NULL)); + ExpectPtrEq(RSA_get_method(rsa), rsa_meth); + ExpectIntEQ(RSA_flags(rsa), RSA_METHOD_FLAG_NO_CHECK); RSA_set_flags(rsa, RSA_FLAG_CACHE_PUBLIC); - AssertIntNE(RSA_test_flags(rsa, RSA_FLAG_CACHE_PUBLIC), 0); - AssertIntEQ(RSA_flags(rsa), RSA_FLAG_CACHE_PUBLIC | + ExpectIntNE(RSA_test_flags(rsa, RSA_FLAG_CACHE_PUBLIC), 0); + ExpectIntEQ(RSA_flags(rsa), RSA_FLAG_CACHE_PUBLIC | RSA_METHOD_FLAG_NO_CHECK); RSA_clear_flags(rsa, RSA_FLAG_CACHE_PUBLIC); - AssertIntEQ(RSA_test_flags(rsa, RSA_FLAG_CACHE_PUBLIC), 0); - AssertIntNE(RSA_flags(rsa), RSA_FLAG_CACHE_PUBLIC); + ExpectIntEQ(RSA_test_flags(rsa, RSA_FLAG_CACHE_PUBLIC), 0); + ExpectIntNE(RSA_flags(rsa), RSA_FLAG_CACHE_PUBLIC); /* rsa_meth is freed here */ RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_verify(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) && \ - !defined(NO_FILESYSTEM) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) #ifndef NO_BIO - XFILE fp; - RSA *pKey, *pubKey; - X509 *cert; + XFILE fp = XBADFILE; + RSA *pKey = NULL; + RSA *pubKey = NULL; + X509 *cert = NULL; const char *text = "Hello wolfSSL !"; unsigned char hash[SHA256_DIGEST_LENGTH]; unsigned char signature[2048/8]; unsigned int signatureLength; - byte *buf; - BIO *bio; + byte *buf = NULL; + BIO *bio = NULL; SHA256_CTX c; - EVP_PKEY *evpPkey, *evpPubkey; + EVP_PKEY *evpPkey = NULL; + EVP_PKEY *evpPubkey = NULL; size_t sz; /* generate hash */ @@ -57981,39 +69869,41 @@ #endif /* read privete key file */ - fp = XFOPEN(svrKeyFile, "rb"); - AssertTrue((fp != XBADFILE)); - AssertIntEQ(XFSEEK(fp, 0, XSEEK_END), 0); - sz = XFTELL(fp); - AssertIntEQ(XFSEEK(fp, 0, XSEEK_SET), 0); - AssertNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); - AssertIntEQ(XFREAD(buf, 1, sz, fp), sz); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN(svrKeyFile, "rb")) != XBADFILE); + ExpectIntEQ(XFSEEK(fp, 0, XSEEK_END), 0); + ExpectTrue((sz = XFTELL(fp)) > 0); + ExpectIntEQ(XFSEEK(fp, 0, XSEEK_SET), 0); + ExpectNotNull(buf = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_FILE)); + ExpectIntEQ(XFREAD(buf, 1, sz, fp), sz); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } /* read private key and sign hash data */ - AssertNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); - AssertNotNull(evpPkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL)); - AssertNotNull(pKey = EVP_PKEY_get1_RSA(evpPkey)); - AssertIntEQ(RSA_sign(NID_sha256, hash, SHA256_DIGEST_LENGTH, - signature, &signatureLength, pKey), SSL_SUCCESS); + ExpectNotNull(bio = BIO_new_mem_buf(buf, (int)sz)); + ExpectNotNull(evpPkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL)); + ExpectNotNull(pKey = EVP_PKEY_get1_RSA(evpPkey)); + ExpectIntEQ(RSA_sign(NID_sha256, hash, SHA256_DIGEST_LENGTH, + signature, &signatureLength, pKey), SSL_SUCCESS); /* read public key and verify signed data */ - fp = XFOPEN(svrCertFile,"rb"); - AssertTrue((fp != XBADFILE)); - cert = PEM_read_X509(fp, 0, 0, 0 ); - XFCLOSE(fp); - evpPubkey = X509_get_pubkey(cert); - pubKey = EVP_PKEY_get1_RSA(evpPubkey); - AssertIntEQ(RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, signature, - signatureLength, pubKey), SSL_SUCCESS); + ExpectTrue((fp = XFOPEN(svrCertFile,"rb")) != XBADFILE); + ExpectNotNull(cert = PEM_read_X509(fp, 0, 0, 0 )); + if (fp != XBADFILE) + XFCLOSE(fp); + ExpectNotNull(evpPubkey = X509_get_pubkey(cert)); + ExpectNotNull(pubKey = EVP_PKEY_get1_RSA(evpPubkey)); + ExpectIntEQ(RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, signature, + signatureLength, pubKey), SSL_SUCCESS); - AssertIntEQ(RSA_verify(NID_sha256, NULL, SHA256_DIGEST_LENGTH, NULL, + ExpectIntEQ(RSA_verify(NID_sha256, NULL, SHA256_DIGEST_LENGTH, NULL, signatureLength, NULL), SSL_FAILURE); - AssertIntEQ(RSA_verify(NID_sha256, NULL, SHA256_DIGEST_LENGTH, signature, + ExpectIntEQ(RSA_verify(NID_sha256, NULL, SHA256_DIGEST_LENGTH, signature, signatureLength, pubKey), SSL_FAILURE); - AssertIntEQ(RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, NULL, + ExpectIntEQ(RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, NULL, signatureLength, pubKey), SSL_FAILURE); - AssertIntEQ(RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, signature, + ExpectIntEQ(RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, signature, signatureLength, NULL), SSL_FAILURE); @@ -58024,17 +69914,15 @@ X509_free(cert); BIO_free(bio); XFREE(buf, NULL, DYNAMIC_TYPE_FILE); - - res = TEST_RES_CHECK(1); #endif #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_sign(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) RSA *rsa; unsigned char hash[SHA256_DIGEST_LENGTH]; #ifdef USE_CERT_BUFFERS_1024 @@ -58057,43 +69945,42 @@ der = privDer; rsa = NULL; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertIntEQ(RSA_sign(NID_rsaEncryption, NULL, 0, NULL, NULL, NULL), 0); - AssertIntEQ(RSA_sign(NID_rsaEncryption, hash, sizeof(hash), signature, + /* Invalid parameters. */ + ExpectIntEQ(RSA_sign(NID_rsaEncryption, NULL, 0, NULL, NULL, NULL), 0); + ExpectIntEQ(RSA_sign(NID_rsaEncryption, hash, sizeof(hash), signature, &signatureLen, rsa), 0); - AssertIntEQ(RSA_sign(NID_sha256, NULL, sizeof(hash), signature, + ExpectIntEQ(RSA_sign(NID_sha256, NULL, sizeof(hash), signature, &signatureLen, rsa), 0); - AssertIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), NULL, + ExpectIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), NULL, &signatureLen, rsa), 0); - AssertIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), signature, NULL, rsa), 0); - AssertIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), signature, &signatureLen, NULL), 0); - AssertIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(RSA_sign(NID_sha256, hash, sizeof(hash), signature, &signatureLen, rsa), 1); RSA_free(rsa); der = pubDer; rsa = NULL; - AssertNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); + ExpectNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); - AssertIntEQ(RSA_verify(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(RSA_verify(NID_sha256, hash, sizeof(hash), signature, signatureLen, rsa), 1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_sign_ex(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) - RSA *rsa; + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) + RSA *rsa = NULL; unsigned char hash[SHA256_DIGEST_LENGTH]; #ifdef USE_CERT_BUFFERS_1024 const unsigned char* privDer = client_key_der_1024; @@ -58125,64 +70012,62 @@ XMEMSET(hash, 0, sizeof(hash)); - AssertNotNull(rsa = wolfSSL_RSA_new()); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, + ExpectNotNull(rsa = wolfSSL_RSA_new()); + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, &signatureLen, rsa, 1), 0); wolfSSL_RSA_free(rsa); der = privDer; rsa = NULL; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_rsaEncryption,NULL, 0, NULL, NULL, NULL, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_rsaEncryption,NULL, 0, NULL, NULL, NULL, -1), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_rsaEncryption, hash, sizeof(hash), + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_rsaEncryption, hash, sizeof(hash), signature, &signatureLen, rsa, 1), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, NULL, sizeof(hash), signature, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, NULL, sizeof(hash), signature, &signatureLen, rsa, 1), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), NULL, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), NULL, &signatureLen, rsa, 1), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, NULL, rsa, 1), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, &signatureLen, NULL, 1), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, &signatureLen, rsa, -1), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, NULL, sizeof(hash), signature, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, NULL, sizeof(hash), signature, &signatureLen, rsa, 0), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), NULL, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), NULL, &signatureLen, rsa, 0), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, NULL, rsa, 0), 0); - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), signature, &signatureLen, rsa, 1), 1); /* Test returning encoded hash. */ - AssertIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), encodedHash, + ExpectIntEQ(wolfSSL_RSA_sign_ex(NID_sha256, hash, sizeof(hash), encodedHash, &encodedHashLen, rsa, 0), 1); - AssertIntEQ(encodedHashLen, sizeof(expEncHash)); - AssertIntEQ(XMEMCMP(encodedHash, expEncHash, sizeof(expEncHash)), 0); + ExpectIntEQ(encodedHashLen, sizeof(expEncHash)); + ExpectIntEQ(XMEMCMP(encodedHash, expEncHash, sizeof(expEncHash)), 0); RSA_free(rsa); der = pubDer; rsa = NULL; - AssertNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); + ExpectNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); - AssertIntEQ(RSA_verify(NID_sha256, hash, sizeof(hash), signature, + ExpectIntEQ(RSA_verify(NID_sha256, hash, sizeof(hash), signature, signatureLen, rsa), 1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_public_decrypt(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) RSA *rsa; unsigned char msg[SHA256_DIGEST_LENGTH]; #ifdef USE_CERT_BUFFERS_1024 @@ -58317,49 +70202,47 @@ der = pubDer; rsa = NULL; - AssertNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); + ExpectNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); - AssertIntEQ(RSA_public_decrypt(0, NULL, NULL, NULL, 0), -1); - AssertIntEQ(RSA_public_decrypt(-1, encMsg, decMsg, rsa, + ExpectIntEQ(RSA_public_decrypt(0, NULL, NULL, NULL, 0), -1); + ExpectIntEQ(RSA_public_decrypt(-1, encMsg, decMsg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_decrypt(sizeof(encMsg), NULL, decMsg, rsa, + ExpectIntEQ(RSA_public_decrypt(sizeof(encMsg), NULL, decMsg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, NULL, rsa, + ExpectIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, NULL, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, decMsg, NULL, + ExpectIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, decMsg, NULL, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, decMsg, rsa, + ExpectIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, decMsg, rsa, RSA_PKCS1_PSS_PADDING), -1); - AssertIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, decMsg, rsa, + ExpectIntEQ(RSA_public_decrypt(sizeof(encMsg), encMsg, decMsg, rsa, RSA_PKCS1_PADDING), 32); - AssertIntEQ(XMEMCMP(decMsg, msg, sizeof(msg)), 0); + ExpectIntEQ(XMEMCMP(decMsg, msg, sizeof(msg)), 0); #if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION > 2)) && \ defined(WC_RSA_NO_PADDING) - AssertIntEQ(RSA_public_decrypt(sizeof(encMsgNoPad), encMsgNoPad, decMsg, + ExpectIntEQ(RSA_public_decrypt(sizeof(encMsgNoPad), encMsgNoPad, decMsg, rsa, RSA_NO_PADDING), sizeof(decMsg)); /* Zeros before actual data. */ for (i = 0; i < (int)(sizeof(decMsg) - sizeof(msg)); i += sizeof(msg)) { - AssertIntEQ(XMEMCMP(decMsg + i, msg, sizeof(msg)), 0); + ExpectIntEQ(XMEMCMP(decMsg + i, msg, sizeof(msg)), 0); } /* Check actual data. */ XMEMSET(msg, 0x01, sizeof(msg)); - AssertIntEQ(XMEMCMP(decMsg + i, msg, sizeof(msg)), 0); + ExpectIntEQ(XMEMCMP(decMsg + i, msg, sizeof(msg)), 0); #endif RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_private_encrypt(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) RSA *rsa; unsigned char msg[SHA256_DIGEST_LENGTH]; #ifdef USE_CERT_BUFFERS_1024 @@ -58485,104 +70368,98 @@ der = privDer; rsa = NULL; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertIntEQ(RSA_private_encrypt(0, NULL, NULL, NULL, 0), -1); - AssertIntEQ(RSA_private_encrypt(0, msg, encMsg, rsa, RSA_PKCS1_PADDING), + ExpectIntEQ(RSA_private_encrypt(0, NULL, NULL, NULL, 0), -1); + ExpectIntEQ(RSA_private_encrypt(0, msg, encMsg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_encrypt(sizeof(msg), NULL, encMsg, rsa, + ExpectIntEQ(RSA_private_encrypt(sizeof(msg), NULL, encMsg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_encrypt(sizeof(msg), msg, NULL, rsa, + ExpectIntEQ(RSA_private_encrypt(sizeof(msg), msg, NULL, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, NULL, + ExpectIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, NULL, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, rsa, + ExpectIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, rsa, RSA_PKCS1_PSS_PADDING), -1); - AssertIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, rsa, + ExpectIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, rsa, RSA_PKCS1_PADDING), sizeof(encMsg)); - AssertIntEQ(XMEMCMP(encMsg, expEncMsg, sizeof(expEncMsg)), 0); + ExpectIntEQ(XMEMCMP(encMsg, expEncMsg, sizeof(expEncMsg)), 0); #ifdef WC_RSA_NO_PADDING /* Non-zero message. */ XMEMSET(msg, 0x01, sizeof(msg)); - AssertIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, rsa, + ExpectIntEQ(RSA_private_encrypt(sizeof(msg), msg, encMsg, rsa, RSA_NO_PADDING), sizeof(encMsg)); - AssertIntEQ(XMEMCMP(encMsg, expEncMsgNoPad, sizeof(expEncMsgNoPad)), 0); + ExpectIntEQ(XMEMCMP(encMsg, expEncMsgNoPad, sizeof(expEncMsgNoPad)), 0); #endif RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_public_encrypt(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) - RSA* rsa; + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) + RSA* rsa = NULL; const unsigned char msg[2048/8] = { 0 }; unsigned char encMsg[2048/8]; - AssertNotNull(rsa = RSA_new()); + ExpectNotNull(rsa = RSA_new()); - AssertIntEQ(RSA_public_encrypt(-1, msg, encMsg, rsa, + ExpectIntEQ(RSA_public_encrypt(-1, msg, encMsg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_encrypt(sizeof(msg), NULL, encMsg, rsa, + ExpectIntEQ(RSA_public_encrypt(sizeof(msg), NULL, encMsg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_encrypt(sizeof(msg), msg, NULL, rsa, + ExpectIntEQ(RSA_public_encrypt(sizeof(msg), msg, NULL, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_encrypt(sizeof(msg), msg, encMsg, NULL, + ExpectIntEQ(RSA_public_encrypt(sizeof(msg), msg, encMsg, NULL, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_public_encrypt(sizeof(msg), msg, encMsg, rsa, + ExpectIntEQ(RSA_public_encrypt(sizeof(msg), msg, encMsg, rsa, RSA_PKCS1_PSS_PADDING), -1); /* Empty RSA key. */ - AssertIntEQ(RSA_public_encrypt(sizeof(msg), msg, encMsg, rsa, + ExpectIntEQ(RSA_public_encrypt(sizeof(msg), msg, encMsg, rsa, RSA_PKCS1_PADDING), -1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_private_decrypt(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(HAVE_FAST_RSA) - RSA* rsa; + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_RSA) + RSA* rsa = NULL; unsigned char msg[2048/8]; const unsigned char encMsg[2048/8] = { 0 }; - AssertNotNull(rsa = RSA_new()); + ExpectNotNull(rsa = RSA_new()); - AssertIntEQ(RSA_private_decrypt(-1, encMsg, msg, rsa, + ExpectIntEQ(RSA_private_decrypt(-1, encMsg, msg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_decrypt(sizeof(encMsg), NULL, msg, rsa, + ExpectIntEQ(RSA_private_decrypt(sizeof(encMsg), NULL, msg, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, NULL, rsa, + ExpectIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, NULL, rsa, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, msg, NULL, + ExpectIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, msg, NULL, RSA_PKCS1_PADDING), -1); - AssertIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, msg, rsa, + ExpectIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, msg, rsa, RSA_PKCS1_PSS_PADDING), -1); /* Empty RSA key. */ - AssertIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, msg, rsa, + ExpectIntEQ(RSA_private_decrypt(sizeof(encMsg), encMsg, msg, rsa, RSA_PKCS1_PADDING), -1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_GenAdd(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) RSA *rsa; #ifdef USE_CERT_BUFFERS_1024 @@ -58600,36 +70477,34 @@ der = privDer; rsa = NULL; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertIntEQ(wolfSSL_RSA_GenAdd(NULL), -1); + ExpectIntEQ(wolfSSL_RSA_GenAdd(NULL), -1); #ifndef RSA_LOW_MEM - AssertIntEQ(wolfSSL_RSA_GenAdd(rsa), 1); + ExpectIntEQ(wolfSSL_RSA_GenAdd(rsa), 1); #else /* dmp1 and dmq1 are not set (allocated) when RSA_LOW_MEM. */ - AssertIntEQ(wolfSSL_RSA_GenAdd(rsa), -1); + ExpectIntEQ(wolfSSL_RSA_GenAdd(rsa), -1); #endif RSA_free(rsa); der = pubDer; rsa = NULL; - AssertNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); + ExpectNotNull(d2i_RSAPublicKey(&rsa, &der, pubDerSz)); /* Need private values. */ - AssertIntEQ(wolfSSL_RSA_GenAdd(rsa), -1); + ExpectIntEQ(wolfSSL_RSA_GenAdd(rsa), -1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_blinding_on(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_RSA) && !defined(NO_WOLFSSL_STUB) RSA *rsa; - WOLFSSL_BN_CTX *bnCtx; + WOLFSSL_BN_CTX *bnCtx = NULL; #ifdef USE_CERT_BUFFERS_1024 const unsigned char* privDer = client_key_der_1024; size_t privDerSz = sizeof_client_key_der_1024; @@ -58641,64 +70516,60 @@ der = privDer; rsa = NULL; - AssertNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertNotNull(bnCtx = wolfSSL_BN_CTX_new()); + ExpectNotNull(d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(bnCtx = wolfSSL_BN_CTX_new()); /* Does nothing so all parameters are valid. */ - AssertIntEQ(wolfSSL_RSA_blinding_on(NULL, NULL), 1); - AssertIntEQ(wolfSSL_RSA_blinding_on(rsa, NULL), 1); - AssertIntEQ(wolfSSL_RSA_blinding_on(NULL, bnCtx), 1); - AssertIntEQ(wolfSSL_RSA_blinding_on(rsa, bnCtx), 1); + ExpectIntEQ(wolfSSL_RSA_blinding_on(NULL, NULL), 1); + ExpectIntEQ(wolfSSL_RSA_blinding_on(rsa, NULL), 1); + ExpectIntEQ(wolfSSL_RSA_blinding_on(NULL, bnCtx), 1); + ExpectIntEQ(wolfSSL_RSA_blinding_on(rsa, bnCtx), 1); wolfSSL_BN_CTX_free(bnCtx); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_ex_data(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(OPENSSL_EXTRA) - RSA* rsa; + RSA* rsa = NULL; unsigned char data[1]; - rsa = RSA_new(); + ExpectNotNull(rsa = RSA_new()); - AssertNull(wolfSSL_RSA_get_ex_data(NULL, 0)); - AssertNull(wolfSSL_RSA_get_ex_data(rsa, 0)); + ExpectNull(wolfSSL_RSA_get_ex_data(NULL, 0)); + ExpectNull(wolfSSL_RSA_get_ex_data(rsa, 0)); #ifdef MAX_EX_DATA - AssertNull(wolfSSL_RSA_get_ex_data(rsa, MAX_EX_DATA)); - AssertIntEQ(wolfSSL_RSA_set_ex_data(rsa, MAX_EX_DATA, data), 0); + ExpectNull(wolfSSL_RSA_get_ex_data(rsa, MAX_EX_DATA)); + ExpectIntEQ(wolfSSL_RSA_set_ex_data(rsa, MAX_EX_DATA, data), 0); #endif - AssertIntEQ(wolfSSL_RSA_set_ex_data(NULL, 0, NULL), 0); - AssertIntEQ(wolfSSL_RSA_set_ex_data(NULL, 0, data), 0); + ExpectIntEQ(wolfSSL_RSA_set_ex_data(NULL, 0, NULL), 0); + ExpectIntEQ(wolfSSL_RSA_set_ex_data(NULL, 0, data), 0); #ifdef HAVE_EX_DATA - AssertIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, NULL), 1); - AssertIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, data), 1); - AssertPtrEq(wolfSSL_RSA_get_ex_data(rsa, 0), data); -#else - AssertIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, NULL), 0); - AssertIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, data), 0); - AssertNull(wolfSSL_RSA_get_ex_data(rsa, 0)); + ExpectIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, NULL), 1); + ExpectIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, data), 1); + ExpectPtrEq(wolfSSL_RSA_get_ex_data(rsa, 0), data); +#else + ExpectIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, NULL), 0); + ExpectIntEQ(wolfSSL_RSA_set_ex_data(rsa, 0, data), 0); + ExpectNull(wolfSSL_RSA_get_ex_data(rsa, 0)); #endif RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif /* !NO_RSA && OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_RSA_LoadDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && (defined(OPENSSL_EXTRA) || \ defined(OPENSSL_EXTRA_X509_SMALL)) - RSA *rsa; + RSA *rsa = NULL; #ifdef USE_CERT_BUFFERS_1024 const unsigned char* privDer = client_key_der_1024; size_t privDerSz = sizeof_client_key_der_1024; @@ -58707,29 +70578,26 @@ size_t privDerSz = sizeof_client_key_der_2048; #endif - AssertNotNull(rsa = RSA_new()); + ExpectNotNull(rsa = RSA_new()); - AssertIntEQ(wolfSSL_RSA_LoadDer(NULL, privDer, (int)privDerSz), -1); - AssertIntEQ(wolfSSL_RSA_LoadDer(rsa, NULL, (int)privDerSz), -1); - AssertIntEQ(wolfSSL_RSA_LoadDer(rsa, privDer, 0), -1); + ExpectIntEQ(wolfSSL_RSA_LoadDer(NULL, privDer, (int)privDerSz), -1); + ExpectIntEQ(wolfSSL_RSA_LoadDer(rsa, NULL, (int)privDerSz), -1); + ExpectIntEQ(wolfSSL_RSA_LoadDer(rsa, privDer, 0), -1); - AssertIntEQ(wolfSSL_RSA_LoadDer(rsa, privDer, (int)privDerSz), 1); + ExpectIntEQ(wolfSSL_RSA_LoadDer(rsa, privDer, (int)privDerSz), 1); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif /* !NO_RSA && OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } /* Local API. */ static int test_wolfSSL_RSA_To_Der(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLFSSL_TEST_STATIC_BUILD -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) && \ - defined(OPENSSL_EXTRA) && !defined(NO_RSA) - RSA* rsa; +#if defined(WOLFSSL_KEY_GEN) && defined(OPENSSL_EXTRA) && !defined(NO_RSA) + RSA* rsa; #ifdef USE_CERT_BUFFERS_1024 const unsigned char* privDer = client_key_der_1024; size_t privDerSz = sizeof_client_key_der_1024; @@ -58748,93 +70616,87 @@ der = privDer; rsa = NULL; - AssertNotNull(wolfSSL_d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(wolfSSL_d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertIntEQ(wolfSSL_RSA_To_Der(NULL, &outDer, 0, HEAP_HINT), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 2, HEAP_HINT), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_RSA_To_Der(NULL, &outDer, 0, HEAP_HINT), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 2, HEAP_HINT), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, NULL, 0, HEAP_HINT), privDerSz); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, NULL, 0, HEAP_HINT), privDerSz); outDer = out; - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), privDerSz); - AssertIntEQ(XMEMCMP(out, privDer, privDerSz), 0); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), privDerSz); + ExpectIntEQ(XMEMCMP(out, privDer, privDerSz), 0); outDer = NULL; - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), privDerSz); - AssertNotNull(outDer); - AssertIntEQ(XMEMCMP(outDer, privDer, privDerSz), 0); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), privDerSz); + ExpectNotNull(outDer); + ExpectIntEQ(XMEMCMP(outDer, privDer, privDerSz), 0); XFREE(outDer, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, NULL, 1, HEAP_HINT), pubDerSz); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, NULL, 1, HEAP_HINT), pubDerSz); outDer = out; - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 1, HEAP_HINT), pubDerSz); - AssertIntEQ(XMEMCMP(out, pubDer, pubDerSz), 0); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 1, HEAP_HINT), pubDerSz); + ExpectIntEQ(XMEMCMP(out, pubDer, pubDerSz), 0); RSA_free(rsa); - AssertNotNull(rsa = RSA_new()); - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 1, HEAP_HINT), BAD_FUNC_ARG); + ExpectNotNull(rsa = RSA_new()); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 1, HEAP_HINT), BAD_FUNC_ARG); RSA_free(rsa); der = pubDer; rsa = NULL; - AssertNotNull(wolfSSL_d2i_RSAPublicKey(&rsa, &der, pubDerSz)); - AssertIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), BAD_FUNC_ARG); + ExpectNotNull(wolfSSL_d2i_RSAPublicKey(&rsa, &der, pubDerSz)); + ExpectIntEQ(wolfSSL_RSA_To_Der(rsa, &outDer, 0, HEAP_HINT), BAD_FUNC_ARG); RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif #endif - return res; + return EXPECT_RESULT(); } /* wolfSSL_PEM_read_RSAPublicKey is a stub function. */ static int test_wolfSSL_PEM_read_RSAPublicKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) - XFILE file; + XFILE file = XBADFILE; const char* fname = "./certs/server-keyPub.pem"; - RSA *rsa; + RSA *rsa = NULL; - AssertNull(wolfSSL_PEM_read_RSAPublicKey(XBADFILE, NULL, NULL, NULL)); + ExpectNull(wolfSSL_PEM_read_RSAPublicKey(XBADFILE, NULL, NULL, NULL)); - file = XFOPEN(fname, "rb"); - AssertTrue((file != XBADFILE)); - AssertNotNull((rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL))); - AssertIntEQ(RSA_size(rsa), 256); + ExpectTrue((file = XFOPEN(fname, "rb")) != XBADFILE); + ExpectNotNull(rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL)); + ExpectIntEQ(RSA_size(rsa), 256); RSA_free(rsa); - XFCLOSE(file); - - res = TEST_RES_CHECK(1); + if (file != XBADFILE) + XFCLOSE(file); #endif - return res; + return EXPECT_RESULT(); } /* wolfSSL_PEM_read_RSAPublicKey is a stub function. */ static int test_wolfSSL_PEM_write_RSA_PUBKEY(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(OPENSSL_EXTRA) && !defined(NO_FILESYSTEM) && \ - defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) + defined(WOLFSSL_KEY_GEN) RSA* rsa = NULL; - AssertIntEQ(wolfSSL_PEM_write_RSA_PUBKEY(XBADFILE, NULL), 0); - AssertIntEQ(wolfSSL_PEM_write_RSA_PUBKEY(stderr, NULL), 0); + ExpectIntEQ(wolfSSL_PEM_write_RSA_PUBKEY(XBADFILE, NULL), 0); + ExpectIntEQ(wolfSSL_PEM_write_RSA_PUBKEY(stderr, NULL), 0); /* Valid but stub so returns 0. */ - AssertIntEQ(wolfSSL_PEM_write_RSA_PUBKEY(stderr, rsa), 0); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wolfSSL_PEM_write_RSA_PUBKEY(stderr, rsa), 0); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_write_RSAPrivateKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_USER_RSA) && (defined(WOLFSSL_PEM_TO_DER) || \ + (defined(WOLFSSL_PEM_TO_DER) || \ defined(WOLFSSL_DER_TO_PEM)) && !defined(NO_FILESYSTEM) - RSA* rsa; + RSA* rsa = NULL; #ifdef USE_CERT_BUFFERS_1024 const unsigned char* privDer = client_key_der_1024; size_t privDerSz = sizeof_client_key_der_1024; @@ -58847,42 +70709,39 @@ unsigned char passwd[] = "password"; #endif - AssertNotNull(rsa = RSA_new()); - AssertIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, NULL, NULL, 0, + ExpectNotNull(rsa = RSA_new()); + ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, NULL, NULL, 0, NULL, NULL), 0); RSA_free(rsa); der = privDer; rsa = NULL; - AssertNotNull(wolfSSL_d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(wolfSSL_d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertIntEQ(wolfSSL_PEM_write_RSAPrivateKey(XBADFILE, rsa, NULL, NULL, 0, + ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(XBADFILE, rsa, NULL, NULL, 0, NULL, NULL), 0); - AssertIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, NULL, NULL, NULL, 0, + ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, NULL, NULL, NULL, 0, NULL, NULL), 0); - AssertIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, NULL, NULL, 0, + ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, NULL, NULL, 0, NULL, NULL), 1); #ifndef NO_AES - AssertIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, EVP_aes_128_cbc(), + ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, EVP_aes_128_cbc(), NULL, 0, NULL, NULL), 1); - AssertIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, EVP_aes_128_cbc(), + ExpectIntEQ(wolfSSL_PEM_write_RSAPrivateKey(stderr, rsa, EVP_aes_128_cbc(), passwd, sizeof(passwd) - 1, NULL, NULL), 1); #endif RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_write_mem_RSAPrivateKey(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_RSA) && defined(OPENSSL_EXTRA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(HAVE_USER_RSA) && (defined(WOLFSSL_PEM_TO_DER) || \ - defined(WOLFSSL_DER_TO_PEM)) - RSA* rsa; + (defined(WOLFSSL_PEM_TO_DER) || defined(WOLFSSL_DER_TO_PEM)) + RSA* rsa = NULL; #ifdef USE_CERT_BUFFERS_1024 const unsigned char* privDer = client_key_der_1024; size_t privDerSz = sizeof_client_key_der_1024; @@ -58894,54 +70753,54 @@ #ifndef NO_AES unsigned char passwd[] = "password"; #endif - unsigned char* pem; + unsigned char* pem = NULL; int plen; - AssertNotNull(rsa = RSA_new()); - AssertIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, &pem, + ExpectNotNull(rsa = RSA_new()); + ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, &pem, &plen), 0); RSA_free(rsa); der = privDer; rsa = NULL; - AssertNotNull(wolfSSL_d2i_RSAPrivateKey(&rsa, &der, privDerSz)); + ExpectNotNull(wolfSSL_d2i_RSAPrivateKey(&rsa, &der, privDerSz)); - AssertIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(NULL, NULL, NULL, 0, &pem, + ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(NULL, NULL, NULL, 0, &pem, &plen), 0); - AssertIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, NULL, + ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, NULL, &plen), 0); - AssertIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, &pem, + ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, &pem, NULL), 0); - AssertIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, &pem, + ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, NULL, NULL, 0, &pem, &plen), 1); XFREE(pem, NULL, DYNAMIC_TYPE_KEY); + pem = NULL; #ifndef NO_AES - AssertIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, EVP_aes_128_cbc(), + ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, EVP_aes_128_cbc(), NULL, 0, &pem, &plen), 1); XFREE(pem, NULL, DYNAMIC_TYPE_KEY); - AssertIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, EVP_aes_128_cbc(), + pem = NULL; + ExpectIntEQ(wolfSSL_PEM_write_mem_RSAPrivateKey(rsa, EVP_aes_128_cbc(), passwd, sizeof(passwd) - 1, &pem, &plen), 1); XFREE(pem, NULL, DYNAMIC_TYPE_KEY); #endif RSA_free(rsa); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DH(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) DH *dh = NULL; BIGNUM* p; BIGNUM* q; BIGNUM* g; - BIGNUM* pub; - BIGNUM* priv; + BIGNUM* pub = NULL; + BIGNUM* priv = NULL; #if defined(OPENSSL_ALL) #if !defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) @@ -58953,71 +70812,99 @@ dh = NULL; XMEMSET(buf, 0, sizeof(buf)); /* Test 2048 bit parameters */ - f = XFOPEN("./certs/dh2048.der", "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN("./certs/dh2048.der", "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) + XFCLOSE(f); - AssertNotNull(dh = d2i_DHparams(NULL, &pt, len)); - AssertNotNull(dh->p); - AssertNotNull(dh->g); - AssertTrue(pt == buf); - AssertIntEQ(DH_generate_key(dh), 1); - AssertIntEQ(DH_generate_key(dh), 1); - AssertIntEQ(DH_compute_key(NULL, NULL, NULL), -1); - AssertNotNull(pub = BN_new()); - AssertIntEQ(BN_set_word(pub, 1), 1); - AssertIntEQ(DH_compute_key(buf, NULL, NULL), -1); - AssertIntEQ(DH_compute_key(NULL, pub, NULL), -1); - AssertIntEQ(DH_compute_key(NULL, NULL, dh), -1); - AssertIntEQ(DH_compute_key(buf, pub, NULL), -1); - AssertIntEQ(DH_compute_key(buf, NULL, dh), -1); - AssertIntEQ(DH_compute_key(NULL, pub, dh), -1); - AssertIntEQ(DH_compute_key(buf, pub, dh), -1); + ExpectNotNull(dh = d2i_DHparams(NULL, &pt, len)); + ExpectNotNull(dh->p); + ExpectNotNull(dh->g); + ExpectTrue(pt == buf); + ExpectIntEQ(DH_generate_key(dh), 1); + ExpectIntEQ(DH_generate_key(dh), 1); + ExpectIntEQ(DH_compute_key(NULL, NULL, NULL), -1); + ExpectNotNull(pub = BN_new()); + ExpectIntEQ(BN_set_word(pub, 1), 1); + ExpectIntEQ(DH_compute_key(buf, NULL, NULL), -1); + ExpectIntEQ(DH_compute_key(NULL, pub, NULL), -1); + ExpectIntEQ(DH_compute_key(NULL, NULL, dh), -1); + ExpectIntEQ(DH_compute_key(buf, pub, NULL), -1); + ExpectIntEQ(DH_compute_key(buf, NULL, dh), -1); + ExpectIntEQ(DH_compute_key(NULL, pub, dh), -1); + ExpectIntEQ(DH_compute_key(buf, pub, dh), -1); BN_free(pub); + pub = NULL; DH_get0_pqg(dh, (const BIGNUM**)&p, (const BIGNUM**)&q, (const BIGNUM**)&g); - AssertPtrEq(p, dh->p); - AssertPtrEq(q, dh->q); - AssertPtrEq(g, dh->g); + ExpectPtrEq(p, dh->p); + ExpectPtrEq(q, dh->q); + ExpectPtrEq(g, dh->g); DH_get0_key(NULL, (const BIGNUM**)&pub, (const BIGNUM**)&priv); DH_get0_key(dh, (const BIGNUM**)&pub, (const BIGNUM**)&priv); - AssertPtrEq(pub, dh->pub_key); - AssertPtrEq(priv, dh->priv_key); + ExpectPtrEq(pub, dh->pub_key); + ExpectPtrEq(priv, dh->priv_key); DH_get0_key(dh, (const BIGNUM**)&pub, NULL); - AssertPtrEq(pub, dh->pub_key); + ExpectPtrEq(pub, dh->pub_key); DH_get0_key(dh, NULL, (const BIGNUM**)&priv); - AssertPtrEq(priv, dh->priv_key); - AssertNotNull(pub = BN_new()); - AssertNotNull(priv = BN_new()); - AssertIntEQ(DH_set0_key(NULL, pub, priv), 0); - AssertIntEQ(DH_set0_key(dh, pub, priv), 1); - AssertNotNull(pub = BN_new()); - AssertIntEQ(DH_set0_key(dh, pub, NULL), 1); - AssertNotNull(priv = BN_new()); - AssertIntEQ(DH_set0_key(dh, NULL, priv), 1); - AssertPtrEq(pub, dh->pub_key); - AssertPtrEq(priv, dh->priv_key); + ExpectPtrEq(priv, dh->priv_key); + pub = NULL; + priv = NULL; + ExpectNotNull(pub = BN_new()); + ExpectNotNull(priv = BN_new()); + ExpectIntEQ(DH_set0_key(NULL, pub, priv), 0); + ExpectIntEQ(DH_set0_key(dh, pub, priv), 1); + if (EXPECT_FAIL()) { + BN_free(pub); + BN_free(priv); + } + pub = NULL; + priv = NULL; + ExpectNotNull(pub = BN_new()); + ExpectIntEQ(DH_set0_key(dh, pub, NULL), 1); + if (EXPECT_FAIL()) { + BN_free(pub); + } + ExpectNotNull(priv = BN_new()); + ExpectIntEQ(DH_set0_key(dh, NULL, priv), 1); + if (EXPECT_FAIL()) { + BN_free(priv); + } + ExpectPtrEq(pub, dh->pub_key); + ExpectPtrEq(priv, dh->priv_key); + pub = NULL; + priv = NULL; DH_free(dh); + dh = NULL; - AssertNotNull(dh = DH_new()); - AssertNotNull(p = BN_new()); - AssertIntEQ(BN_set_word(p, 1), 1); - AssertIntEQ(DH_compute_key(buf, p, dh), -1); - AssertNotNull(pub = BN_new()); - AssertNotNull(priv = BN_new()); - AssertIntEQ(DH_set0_key(dh, pub, priv), 1); - AssertIntEQ(DH_compute_key(buf, p, dh), -1); + ExpectNotNull(dh = DH_new()); + p = NULL; + ExpectNotNull(p = BN_new()); + ExpectIntEQ(BN_set_word(p, 1), 1); + ExpectIntEQ(DH_compute_key(buf, p, dh), -1); + ExpectNotNull(pub = BN_new()); + ExpectNotNull(priv = BN_new()); + ExpectIntEQ(DH_set0_key(dh, pub, priv), 1); + if (EXPECT_FAIL()) { + BN_free(pub); + BN_free(priv); + } + pub = NULL; + priv = NULL; + ExpectIntEQ(DH_compute_key(buf, p, dh), -1); BN_free(p); + p = NULL; DH_free(dh); + dh = NULL; #ifdef WOLFSSL_KEY_GEN - AssertNotNull(dh = DH_generate_parameters(2048, 2, NULL, NULL)); - AssertIntEQ(wolfSSL_DH_generate_parameters_ex(NULL, 2048, 2, NULL), 0); + ExpectNotNull(dh = DH_generate_parameters(2048, 2, NULL, NULL)); + ExpectIntEQ(wolfSSL_DH_generate_parameters_ex(NULL, 2048, 2, NULL), 0); DH_free(dh); + dh = NULL; #endif #endif /* !HAVE_FIPS || (HAVE_FIPS_VERSION && HAVE_FIPS_VERSION > 2) */ #endif /* OPENSSL_ALL */ @@ -59029,8 +70916,7 @@ (void)pub; (void)priv; - dh = wolfSSL_DH_new(); - AssertNotNull(dh); + ExpectNotNull(dh = wolfSSL_DH_new()); /* invalid parameters test */ DH_get0_pqg(NULL, (const BIGNUM**)&p, @@ -59044,183 +70930,225 @@ DH_get0_pqg(dh, NULL, NULL, (const BIGNUM**)&g); DH_get0_pqg(dh, NULL, NULL, NULL); - AssertTrue(1); DH_get0_pqg(dh, (const BIGNUM**)&p, (const BIGNUM**)&q, (const BIGNUM**)&g); - AssertPtrEq(p, NULL); - AssertPtrEq(q, NULL); - AssertPtrEq(g, NULL); + ExpectPtrEq(p, NULL); + ExpectPtrEq(q, NULL); + ExpectPtrEq(g, NULL); DH_free(dh); + dh = NULL; #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS) && !defined(WOLFSSL_DH_EXTRA)) \ || (defined(HAVE_FIPS_VERSION) && FIPS_VERSION_GT(2,0)) #if defined(OPENSSL_ALL) || \ defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L dh = wolfSSL_DH_new(); - AssertNotNull(dh); + ExpectNotNull(dh); p = wolfSSL_BN_new(); - AssertNotNull(p); - AssertIntEQ(BN_set_word(p, 11), 1); + ExpectNotNull(p); + ExpectIntEQ(BN_set_word(p, 11), 1); g = wolfSSL_BN_new(); - AssertNotNull(g); - AssertIntEQ(BN_set_word(g, 2), 1); + ExpectNotNull(g); + ExpectIntEQ(BN_set_word(g, 2), 1); q = wolfSSL_BN_new(); - AssertNotNull(q); - AssertIntEQ(BN_set_word(q, 5), 1); - AssertIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, NULL, NULL), 0); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, NULL), 0); - AssertIntEQ(wolfSSL_DH_set0_pqg(NULL, p, NULL, NULL), 0); - AssertIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, q, NULL), 0); - AssertIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, NULL, g), 0); - AssertIntEQ(wolfSSL_DH_set0_pqg(NULL, p, q, g), 0); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, q, g), 0); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, p, q, NULL), 0); + ExpectNotNull(q); + ExpectIntEQ(BN_set_word(q, 5), 1); + ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, p, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, q, NULL), 0); + ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, NULL, NULL, g), 0); + ExpectIntEQ(wolfSSL_DH_set0_pqg(NULL, p, q, g), 0); + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, q, g), 0); + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, q, NULL), 0); /* Don't need q. */ - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); + if (EXPECT_FAIL()) { + BN_free(p); + BN_free(g); + } + p = NULL; + g = NULL; /* Setting again will free the p and g. */ wolfSSL_BN_free(q); + q = NULL; DH_free(dh); + dh = NULL; dh = wolfSSL_DH_new(); - AssertNotNull(dh); + ExpectNotNull(dh); p = wolfSSL_BN_new(); - AssertNotNull(p); - AssertIntEQ(BN_set_word(p, 11), 1); + ExpectNotNull(p); + ExpectIntEQ(BN_set_word(p, 11), 1); g = wolfSSL_BN_new(); - AssertNotNull(g); - AssertIntEQ(BN_set_word(g, 2), 1); + ExpectNotNull(g); + ExpectIntEQ(BN_set_word(g, 2), 1); q = wolfSSL_BN_new(); - AssertNotNull(q); - AssertIntEQ(BN_set_word(q, 5), 1); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, p, q, g), 1); + ExpectNotNull(q); + ExpectIntEQ(BN_set_word(q, 5), 1); + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, q, g), 1); /* p, q and g are now owned by dh - don't free. */ + if (EXPECT_FAIL()) { + BN_free(p); + BN_free(q); + BN_free(g); + } + p = NULL; + q = NULL; + g = NULL; p = wolfSSL_BN_new(); - AssertNotNull(p); - AssertIntEQ(BN_set_word(p, 11), 1); + ExpectNotNull(p); + ExpectIntEQ(BN_set_word(p, 11), 1); g = wolfSSL_BN_new(); - AssertNotNull(g); - AssertIntEQ(BN_set_word(g, 2), 1); + ExpectNotNull(g); + ExpectIntEQ(BN_set_word(g, 2), 1); q = wolfSSL_BN_new(); - AssertNotNull(q); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, NULL), 1); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, q, NULL), 1); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, g), 1); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, NULL), 1); + ExpectNotNull(q); + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, NULL), 1); + if (EXPECT_FAIL()) { + BN_free(p); + } + p = NULL; + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, q, NULL), 1); + if (EXPECT_FAIL()) { + BN_free(q); + } + q = NULL; + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, g), 1); + if (EXPECT_FAIL()) { + BN_free(g); + } + g = NULL; + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, NULL, NULL, NULL), 1); /* p, q and g are now owned by dh - don't free. */ DH_free(dh); + dh = NULL; - AssertIntEQ(DH_generate_key(NULL), 0); - AssertNotNull(dh = DH_new()); - AssertIntEQ(DH_generate_key(dh), 0); + ExpectIntEQ(DH_generate_key(NULL), 0); + ExpectNotNull(dh = DH_new()); + ExpectIntEQ(DH_generate_key(dh), 0); p = wolfSSL_BN_new(); - AssertNotNull(p); - AssertIntEQ(BN_set_word(p, 0), 1); + ExpectNotNull(p); + ExpectIntEQ(BN_set_word(p, 0), 1); g = wolfSSL_BN_new(); - AssertNotNull(g); - AssertIntEQ(BN_set_word(g, 2), 1); - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); - AssertIntEQ(DH_generate_key(dh), 0); + ExpectNotNull(g); + ExpectIntEQ(BN_set_word(g, 2), 1); + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); + if (EXPECT_FAIL()) { + BN_free(p); + BN_free(g); + } + p = NULL; + g = NULL; + ExpectIntEQ(DH_generate_key(dh), 0); DH_free(dh); + dh = NULL; #endif #endif /* Test DH_up_ref() */ dh = wolfSSL_DH_new(); - AssertNotNull(dh); - AssertIntEQ(wolfSSL_DH_up_ref(NULL), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_DH_up_ref(dh), WOLFSSL_SUCCESS); + ExpectNotNull(dh); + ExpectIntEQ(wolfSSL_DH_up_ref(NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_DH_up_ref(dh), WOLFSSL_SUCCESS); DH_free(dh); /* decrease ref count */ DH_free(dh); /* free WOLFSSL_DH */ + dh = NULL; + q = NULL; - AssertNull((dh = DH_new_by_nid(NID_sha1))); + ExpectNull((dh = DH_new_by_nid(NID_sha1))); #if (defined(HAVE_PUBLIC_FFDHE) || (defined(HAVE_FIPS) && \ FIPS_VERSION_EQ(2,0))) || (!defined(HAVE_PUBLIC_FFDHE) && \ (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0))) #ifdef HAVE_FFDHE_2048 - AssertNotNull((dh = DH_new_by_nid(NID_ffdhe2048))); + ExpectNotNull((dh = DH_new_by_nid(NID_ffdhe2048))); DH_free(dh); + dh = NULL; + q = NULL; #endif #ifdef HAVE_FFDHE_3072 - AssertNotNull((dh = DH_new_by_nid(NID_ffdhe3072))); + ExpectNotNull((dh = DH_new_by_nid(NID_ffdhe3072))); DH_free(dh); + dh = NULL; + q = NULL; #endif #ifdef HAVE_FFDHE_4096 - AssertNotNull((dh = DH_new_by_nid(NID_ffdhe4096))); + ExpectNotNull((dh = DH_new_by_nid(NID_ffdhe4096))); DH_free(dh); + dh = NULL; + q = NULL; #endif #else - AssertNull((dh = DH_new_by_nid(NID_ffdhe2048))); + ExpectNull((dh = DH_new_by_nid(NID_ffdhe2048))); #endif /* (HAVE_PUBLIC_FFDHE || (HAVE_FIPS && HAVE_FIPS_VERSION == 2)) || * (!HAVE_PUBLIC_FFDHE && (!HAVE_FIPS || HAVE_FIPS_VERSION > 2))*/ - AssertIntEQ(wolfSSL_DH_size(NULL), -1); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(wolfSSL_DH_size(NULL), -1); #endif /* OPENSSL_EXTRA && !NO_DH */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DH_dup(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) #if defined(WOLFSSL_QT) || defined(OPENSSL_ALL) || defined(WOLFSSL_OPENSSH) || \ defined(OPENSSL_EXTRA) - DH *dh; - DH *dhDup; - WOLFSSL_BIGNUM* p; - WOLFSSL_BIGNUM* g; - - AssertNotNull(p = wolfSSL_BN_new()); - AssertNotNull(g = wolfSSL_BN_new()); - AssertIntEQ(wolfSSL_BN_set_word(p, 11), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_BN_set_word(g, 2), WOLFSSL_SUCCESS); + DH *dh = NULL; + DH *dhDup = NULL; - dhDup = wolfSSL_DH_dup(NULL); - AssertNull(dhDup); + ExpectNotNull(dh = wolfSSL_DH_new()); - dh = wolfSSL_DH_new(); - AssertNotNull(dh); + ExpectNull(dhDup = wolfSSL_DH_dup(NULL)); + ExpectNull(dhDup = wolfSSL_DH_dup(dh)); - dhDup = wolfSSL_DH_dup(dh); - AssertNull(dhDup); #if defined(OPENSSL_ALL) || \ defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L - AssertIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); - dhDup = wolfSSL_DH_dup(dh); - AssertNotNull(dhDup); - wolfSSL_DH_free(dhDup); -#else - wolfSSL_BN_free(p); - wolfSSL_BN_free(g); + { + WOLFSSL_BIGNUM* p = NULL; + WOLFSSL_BIGNUM* g = NULL; + + ExpectNotNull(p = wolfSSL_BN_new()); + ExpectNotNull(g = wolfSSL_BN_new()); + ExpectIntEQ(wolfSSL_BN_set_word(p, 11), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_BN_set_word(g, 2), WOLFSSL_SUCCESS); + + ExpectIntEQ(wolfSSL_DH_set0_pqg(dh, p, NULL, g), 1); + if (EXPECT_FAIL()) { + wolfSSL_BN_free(p); + wolfSSL_BN_free(g); + } + + ExpectNotNull(dhDup = wolfSSL_DH_dup(dh)); + wolfSSL_DH_free(dhDup); + } #endif wolfSSL_DH_free(dh); - res = TEST_RES_CHECK(1); #endif #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DH_check(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_ALL #ifndef NO_DH #ifndef NO_BIO #ifndef NO_DSA byte buf[6000]; char file[] = "./certs/dsaparams.pem"; - XFILE f; + XFILE f = XBADFILE; int bytes; - BIO* bio; - DSA* dsa; + BIO* bio = NULL; + DSA* dsa = NULL; #elif !defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0) static const byte dh2048[] = { 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, @@ -59261,37 +71189,34 @@ const byte* params; #endif DH* dh = NULL; - WOLFSSL_BIGNUM* p; - WOLFSSL_BIGNUM* g; + WOLFSSL_BIGNUM* p = NULL; + WOLFSSL_BIGNUM* g = NULL; WOLFSSL_BIGNUM* pTmp = NULL; WOLFSSL_BIGNUM* gTmp = NULL; int codes = -1; #ifndef NO_DSA /* Initialize DH */ - f = XFOPEN(file, "rb"); - AssertTrue((f != XBADFILE)); - bytes = (int)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(file, "rb")) != XBADFILE); + ExpectIntGT(bytes = (int)XFREAD(buf, 1, sizeof(buf), f), 0); + if (f != XBADFILE) + XFCLOSE(f); - bio = BIO_new_mem_buf((void*)buf, bytes); - AssertNotNull(bio); + ExpectNotNull(bio = BIO_new_mem_buf((void*)buf, bytes)); - dsa = wolfSSL_PEM_read_bio_DSAparams(bio, NULL, NULL, NULL); - AssertNotNull(dsa); + ExpectNotNull(dsa = wolfSSL_PEM_read_bio_DSAparams(bio, NULL, NULL, NULL)); - dh = wolfSSL_DSA_dup_DH(dsa); - AssertNotNull(dh); + ExpectNotNull(dh = wolfSSL_DSA_dup_DH(dsa)); + ExpectNotNull(dh); BIO_free(bio); DSA_free(dsa); #elif !defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0) params = dh2048; - dh = wolfSSL_d2i_DHparams(NULL, ¶ms, (long)sizeof(dh2048)); - AssertNotNull(dh); + ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, ¶ms, + (long)sizeof(dh2048))); #else - dh = wolfSSL_DH_new_by_nid(NID_ffdhe2048); - AssertNotNull(dh); + ExpectNotNull(dh = wolfSSL_DH_new_by_nid(NID_ffdhe2048)); #endif /* Test assumed to be valid dh. @@ -59299,131 +71224,148 @@ * codes should be 0 * Invalid codes = {DH_NOT_SUITABLE_GENERATOR, DH_CHECK_P_NOT_PRIME} */ - AssertIntEQ(wolfSSL_DH_check(dh, &codes), 1); - AssertIntEQ(codes, 0); + ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); + ExpectIntEQ(codes, 0); /* Test NULL dh: expected BAD_FUNC_ARG */ - AssertIntEQ(wolfSSL_DH_check(NULL, &codes), 0); + ExpectIntEQ(wolfSSL_DH_check(NULL, &codes), 0); /* Break dh prime to test if codes = DH_CHECK_P_NOT_PRIME */ - pTmp = dh->p; - dh->p = NULL; - AssertIntEQ(wolfSSL_DH_check(dh, &codes), 1); - AssertIntEQ(wolfSSL_DH_check(dh, NULL), 0); - AssertIntEQ(codes, DH_CHECK_P_NOT_PRIME); - /* set dh->p back to normal so it wont fail on next tests */ - dh->p = pTmp; - pTmp = NULL; + if (dh != NULL) { + pTmp = dh->p; + dh->p = NULL; + } + ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); + ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); + ExpectIntEQ(codes, DH_CHECK_P_NOT_PRIME); + /* set dh->p back to normal so it won't fail on next tests */ + if (dh != NULL) { + dh->p = pTmp; + pTmp = NULL; + } /* Break dh generator to test if codes = DH_NOT_SUITABLE_GENERATOR */ - gTmp = dh->g; - dh->g = NULL; - AssertIntEQ(wolfSSL_DH_check(dh, &codes), 1); - AssertIntEQ(wolfSSL_DH_check(dh, NULL), 0); - AssertIntEQ(codes, DH_NOT_SUITABLE_GENERATOR); - dh->g = gTmp; - gTmp = NULL; + if (dh != NULL) { + gTmp = dh->g; + dh->g = NULL; + } + ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); + ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); + ExpectIntEQ(codes, DH_NOT_SUITABLE_GENERATOR); + if (dh != NULL) { + dh->g = gTmp; + gTmp = NULL; + } /* Cleanup */ DH_free(dh); + dh = NULL; dh = DH_new(); - AssertNotNull(dh); + ExpectNotNull(dh); /* Check empty DH. */ - AssertIntEQ(wolfSSL_DH_check(dh, &codes), 1); - AssertIntEQ(wolfSSL_DH_check(dh, NULL), 0); - AssertIntEQ(codes, DH_NOT_SUITABLE_GENERATOR | DH_CHECK_P_NOT_PRIME); + ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); + ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); + ExpectIntEQ(codes, DH_NOT_SUITABLE_GENERATOR | DH_CHECK_P_NOT_PRIME); /* Check non-prime valued p. */ - AssertNotNull(p = BN_new()); - AssertIntEQ(BN_set_word(p, 4), 1); - AssertNotNull(g = BN_new()); - AssertIntEQ(BN_set_word(g, 2), 1); - AssertIntEQ(DH_set0_pqg(dh, p, NULL, g), 1); - AssertIntEQ(wolfSSL_DH_check(dh, &codes), 1); - AssertIntEQ(wolfSSL_DH_check(dh, NULL), 0); - AssertIntEQ(codes, DH_CHECK_P_NOT_PRIME); + ExpectNotNull(p = BN_new()); + ExpectIntEQ(BN_set_word(p, 4), 1); + ExpectNotNull(g = BN_new()); + ExpectIntEQ(BN_set_word(g, 2), 1); + ExpectIntEQ(DH_set0_pqg(dh, p, NULL, g), 1); + if (EXPECT_FAIL()) { + wolfSSL_BN_free(p); + wolfSSL_BN_free(g); + } + ExpectIntEQ(wolfSSL_DH_check(dh, &codes), 1); + ExpectIntEQ(wolfSSL_DH_check(dh, NULL), 0); + ExpectIntEQ(codes, DH_CHECK_P_NOT_PRIME); DH_free(dh); - - res = TEST_RES_CHECK(1); + dh = NULL; #endif #endif /* !NO_DH && !NO_DSA */ #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DH_prime(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) - WOLFSSL_BIGNUM* bn; + WOLFSSL_BIGNUM* bn = NULL; #if WOLFSSL_MAX_BN_BITS >= 768 - WOLFSSL_BIGNUM* bn2; + WOLFSSL_BIGNUM* bn2 = NULL; #endif bn = wolfSSL_DH_768_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 768 - AssertNotNull(bn); + ExpectNotNull(bn); bn2 = wolfSSL_DH_768_prime(bn); - AssertNotNull(bn2); - AssertTrue(bn == bn2); + ExpectNotNull(bn2); + ExpectTrue(bn == bn2); wolfSSL_BN_free(bn); + bn = NULL; #else - AssertNull(bn); + ExpectNull(bn); #endif bn = wolfSSL_DH_1024_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 1024 - AssertNotNull(bn); + ExpectNotNull(bn); wolfSSL_BN_free(bn); + bn = NULL; #else - AssertNull(bn); + ExpectNull(bn); #endif bn = wolfSSL_DH_2048_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 2048 - AssertNotNull(bn); + ExpectNotNull(bn); wolfSSL_BN_free(bn); + bn = NULL; #else - AssertNull(bn); + ExpectNull(bn); #endif bn = wolfSSL_DH_3072_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 3072 - AssertNotNull(bn); + ExpectNotNull(bn); wolfSSL_BN_free(bn); + bn = NULL; #else - AssertNull(bn); + ExpectNull(bn); #endif bn = wolfSSL_DH_4096_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 4096 - AssertNotNull(bn); + ExpectNotNull(bn); wolfSSL_BN_free(bn); + bn = NULL; #else - AssertNull(bn); + ExpectNull(bn); #endif bn = wolfSSL_DH_6144_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 6144 - AssertNotNull(bn); + ExpectNotNull(bn); wolfSSL_BN_free(bn); + bn = NULL; #else - AssertNull(bn); + ExpectNull(bn); #endif bn = wolfSSL_DH_8192_prime(NULL); #if WOLFSSL_MAX_BN_BITS >= 8192 - AssertNotNull(bn); + ExpectNotNull(bn); wolfSSL_BN_free(bn); + bn = NULL; #else - AssertNull(bn); + ExpectNull(bn); #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DH_1536_prime(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) - BIGNUM* bn; + BIGNUM* bn = NULL; unsigned char bits[200]; int sz = 192; /* known binary size */ const byte expected[] = { @@ -59453,22 +71395,20 @@ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, }; - bn = get_rfc3526_prime_1536(NULL); - AssertNotNull(bn); - AssertIntEQ(sz, BN_bn2bin((const BIGNUM*)bn, bits)); - AssertIntEQ(0, XMEMCMP(expected, bits, sz)); + ExpectNotNull(bn = get_rfc3526_prime_1536(NULL)); + ExpectIntEQ(sz, BN_bn2bin((const BIGNUM*)bn, bits)); + ExpectIntEQ(0, XMEMCMP(expected, bits, sz)); BN_free(bn); - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DH_get_2048_256(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_DH) - WOLFSSL_DH* dh; + WOLFSSL_DH* dh = NULL; const WOLFSSL_BIGNUM* pBn; const WOLFSSL_BIGNUM* gBn; const WOLFSSL_BIGNUM* qBn; @@ -59525,54 +71465,55 @@ 0x40, 0x12, 0x9D, 0xA2, 0x99, 0xB1, 0xA4, 0x7D, 0x1E, 0xB3, 0x75, 0x0B, 0xA3, 0x08, 0xB0, 0xFE, 0x64, 0xF5, 0xFB, 0xD3 }; - int pSz; - int qSz; - int gSz; - byte* pReturned; - byte* qReturned; - byte* gReturned; + int pSz = 0; + int qSz = 0; + int gSz = 0; + byte* pReturned = NULL; + byte* qReturned = NULL; + byte* gReturned = NULL; - AssertNotNull((dh = wolfSSL_DH_get_2048_256())); + ExpectNotNull((dh = wolfSSL_DH_get_2048_256())); wolfSSL_DH_get0_pqg(dh, &pBn, &qBn, &gBn); - AssertIntGT((pSz = wolfSSL_BN_num_bytes(pBn)), 0); - AssertNotNull(pReturned = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_TMP_BUFFER)); - AssertIntGT((pSz = wolfSSL_BN_bn2bin(pBn, pReturned)), 0); - AssertIntEQ(pSz, sizeof(pExpected)); - AssertIntEQ(XMEMCMP(pExpected, pReturned, pSz), 0); - - AssertIntGT((qSz = wolfSSL_BN_num_bytes(qBn)), 0); - AssertNotNull(qReturned = (byte*)XMALLOC(qSz, NULL, DYNAMIC_TYPE_TMP_BUFFER)); - AssertIntGT((qSz = wolfSSL_BN_bn2bin(qBn, qReturned)), 0); - AssertIntEQ(qSz, sizeof(qExpected)); - AssertIntEQ(XMEMCMP(qExpected, qReturned, qSz), 0); - - AssertIntGT((gSz = wolfSSL_BN_num_bytes(gBn)), 0); - AssertNotNull(gReturned = (byte*)XMALLOC(gSz, NULL, DYNAMIC_TYPE_TMP_BUFFER)); - AssertIntGT((gSz = wolfSSL_BN_bn2bin(gBn, gReturned)), 0); - AssertIntEQ(gSz, sizeof(gExpected)); - AssertIntEQ(XMEMCMP(gExpected, gReturned, gSz), 0); + ExpectIntGT((pSz = wolfSSL_BN_num_bytes(pBn)), 0); + ExpectNotNull(pReturned = (byte*)XMALLOC(pSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntGT((pSz = wolfSSL_BN_bn2bin(pBn, pReturned)), 0); + ExpectIntEQ(pSz, sizeof(pExpected)); + ExpectIntEQ(XMEMCMP(pExpected, pReturned, pSz), 0); + + ExpectIntGT((qSz = wolfSSL_BN_num_bytes(qBn)), 0); + ExpectNotNull(qReturned = (byte*)XMALLOC(qSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntGT((qSz = wolfSSL_BN_bn2bin(qBn, qReturned)), 0); + ExpectIntEQ(qSz, sizeof(qExpected)); + ExpectIntEQ(XMEMCMP(qExpected, qReturned, qSz), 0); + + ExpectIntGT((gSz = wolfSSL_BN_num_bytes(gBn)), 0); + ExpectNotNull(gReturned = (byte*)XMALLOC(gSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER)); + ExpectIntGT((gSz = wolfSSL_BN_bn2bin(gBn, gReturned)), 0); + ExpectIntEQ(gSz, sizeof(gExpected)); + ExpectIntEQ(XMEMCMP(gExpected, gReturned, gSz), 0); wolfSSL_DH_free(dh); XFREE(pReturned, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(gReturned, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(qReturned, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_write_DHparams(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_BIO) && \ !defined(NO_DH) && defined(WOLFSSL_DH_EXTRA) && !defined(NO_FILESYSTEM) - DH* dh; - BIO* bio; - XFILE fp; + DH* dh = NULL; + BIO* bio = NULL; + XFILE fp = XBADFILE; byte pem[2048]; - int pemSz; + int pemSz = 0; const char expected[] = "-----BEGIN DH PARAMETERS-----\n" "MIIBCAKCAQEAsKEIBpwIE7pZBjy8MNX1AMFPRKfW70rGJScc6NKWUwpckd2iwpSE\n" @@ -59590,60 +71531,70 @@ "MAA=\n" "-----END DH PARAMETERS-----\n"; - AssertNotNull(fp = XFOPEN(dhParamFile, "rb")); - AssertIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); - XFCLOSE(fp); + ExpectTrue((fp = XFOPEN(dhParamFile, "rb")) != XBADFILE); + ExpectIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } - AssertNull(PEM_read_bio_DHparams(NULL, NULL, NULL, NULL)); + ExpectNull(PEM_read_bio_DHparams(NULL, NULL, NULL, NULL)); - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); - AssertIntEQ(BIO_write(bio, badPem, (int)sizeof(badPem)), + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); + ExpectIntEQ(BIO_write(bio, badPem, (int)sizeof(badPem)), (int)sizeof(badPem)); - AssertNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); + ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); BIO_free(bio); + bio = NULL; - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); - AssertIntEQ(BIO_write(bio, emptySeqPem, (int)sizeof(emptySeqPem)), + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); + ExpectIntEQ(BIO_write(bio, emptySeqPem, (int)sizeof(emptySeqPem)), (int)sizeof(emptySeqPem)); - AssertNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); + ExpectNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); BIO_free(bio); + bio = NULL; - AssertNotNull(bio = BIO_new(BIO_s_mem())); - AssertIntEQ(BIO_write(bio, pem, pemSz), pemSz); - AssertNotNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); + ExpectNotNull(bio = BIO_new(BIO_s_mem())); + ExpectIntEQ(BIO_write(bio, pem, pemSz), pemSz); + ExpectNotNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); BIO_free(bio); + bio = NULL; - AssertNotNull(fp = XFOPEN("./test-write-dhparams.pem", "wb")); - AssertIntEQ(PEM_write_DHparams(fp, dh), WOLFSSL_SUCCESS); - AssertIntEQ(PEM_write_DHparams(fp, NULL), WOLFSSL_FAILURE); + ExpectNotNull(fp = XFOPEN("./test-write-dhparams.pem", "wb")); + ExpectIntEQ(PEM_write_DHparams(fp, dh), WOLFSSL_SUCCESS); + ExpectIntEQ(PEM_write_DHparams(fp, NULL), WOLFSSL_FAILURE); DH_free(dh); + dh = NULL; dh = wolfSSL_DH_new(); - AssertIntEQ(PEM_write_DHparams(fp, dh), WOLFSSL_FAILURE); - XFCLOSE(fp); + ExpectIntEQ(PEM_write_DHparams(fp, dh), WOLFSSL_FAILURE); + if (fp != XBADFILE) { + XFCLOSE(fp); + fp = XBADFILE; + } wolfSSL_DH_free(dh); + dh = NULL; /* check results */ XMEMSET(pem, 0, sizeof(pem)); - AssertNotNull(fp = XFOPEN("./test-write-dhparams.pem", "rb")); - AssertIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); - AssertIntEQ(XMEMCMP(pem, expected, pemSz), 0); - XFCLOSE(fp); - - res = TEST_RES_CHECK(1); + ExpectTrue((fp = XFOPEN("./test-write-dhparams.pem", "rb")) != XBADFILE); + ExpectIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); + ExpectIntEQ(XMEMCMP(pem, expected, pemSz), 0); + if (fp != XBADFILE) + XFCLOSE(fp); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_d2i_DHparams(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_ALL #if !defined(NO_DH) && (defined(HAVE_FFDHE_2048) || defined(HAVE_FFDHE_3072)) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - FILE* f = NULL; + XFILE f = XBADFILE; unsigned char buf[4096]; const unsigned char* pt = buf; #ifdef HAVE_FFDHE_2048 @@ -59658,67 +71609,67 @@ /* Test 2048 bit parameters */ #ifdef HAVE_FFDHE_2048 - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - f = XFOPEN(params1, "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); + ExpectTrue((f = XFOPEN(params1, "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) { XFCLOSE(f); + f = XBADFILE; + } - /* Valid case */ - AssertNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); - AssertNotNull(dh->p); - AssertNotNull(dh->g); - AssertTrue(pt == buf); - AssertIntEQ(DH_set_length(NULL, BN_num_bits(dh->p)), 0); - AssertIntEQ(DH_set_length(dh, BN_num_bits(dh->p)), 1); - AssertIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS); - - /* Invalid cases */ - AssertNull(wolfSSL_d2i_DHparams(NULL, NULL, len)); - AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, -1)); - AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, 10)); + /* Valid case */ + ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); + ExpectNotNull(dh->p); + ExpectNotNull(dh->g); + ExpectTrue(pt == buf); + ExpectIntEQ(DH_set_length(NULL, BN_num_bits(dh->p)), 0); + ExpectIntEQ(DH_set_length(dh, BN_num_bits(dh->p)), 1); + ExpectIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS); - DH_free(dh); + /* Invalid cases */ + ExpectNull(wolfSSL_d2i_DHparams(NULL, NULL, len)); + ExpectNull(wolfSSL_d2i_DHparams(NULL, &pt, -1)); + ExpectNull(wolfSSL_d2i_DHparams(NULL, &pt, 10)); - *buf = 0; - pt = buf; - res = TEST_RES_CHECK(1); - } + DH_free(dh); + dh = NULL; + + *buf = 0; + pt = buf; #endif /* HAVE_FFDHE_2048 */ /* Test 3072 bit parameters */ #ifdef HAVE_FFDHE_3072 - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - f = XFOPEN(params2, "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); + ExpectTrue((f = XFOPEN(params2, "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) { XFCLOSE(f); + f = XBADFILE; + } - /* Valid case */ - AssertNotNull(dh = wolfSSL_d2i_DHparams(&dh, &pt, len)); - AssertNotNull(dh->p); - AssertNotNull(dh->g); - AssertTrue(pt != buf); - AssertIntEQ(DH_generate_key(dh), 1); - - /* Invalid cases */ - AssertNull(wolfSSL_d2i_DHparams(NULL, NULL, len)); - AssertNull(wolfSSL_d2i_DHparams(NULL, &pt, -1)); + /* Valid case */ + ExpectNotNull(dh = wolfSSL_d2i_DHparams(&dh, &pt, len)); + ExpectNotNull(dh->p); + ExpectNotNull(dh->g); + ExpectTrue(pt != buf); + ExpectIntEQ(DH_generate_key(dh), 1); - DH_free(dh); - res = TEST_RES_CHECK(1); - } + /* Invalid cases */ + ExpectNull(wolfSSL_d2i_DHparams(NULL, NULL, len)); + ExpectNull(wolfSSL_d2i_DHparams(NULL, &pt, -1)); + + DH_free(dh); + dh = NULL; #endif /* HAVE_FFDHE_3072 */ #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !NO_DH */ #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_DH_LoadDer(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_DH) && (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)) && \ defined(OPENSSL_EXTRA) static const byte dh2048[] = { @@ -59757,31 +71708,28 @@ 0xfa, 0xc8, 0xe2, 0x1e, 0x7e, 0xaf, 0x00, 0x3f, 0x93, 0x02, 0x01, 0x02 }; - WOLFSSL_DH* dh; + WOLFSSL_DH* dh = NULL; - dh = wolfSSL_DH_new(); - AssertNotNull(dh); + ExpectNotNull(dh = wolfSSL_DH_new()); - AssertIntEQ(wolfSSL_DH_LoadDer(NULL, NULL, 0), -1); - AssertIntEQ(wolfSSL_DH_LoadDer(dh, NULL, 0), -1); - AssertIntEQ(wolfSSL_DH_LoadDer(NULL, dh2048, sizeof(dh2048)), -1); + ExpectIntEQ(wolfSSL_DH_LoadDer(NULL, NULL, 0), -1); + ExpectIntEQ(wolfSSL_DH_LoadDer(dh, NULL, 0), -1); + ExpectIntEQ(wolfSSL_DH_LoadDer(NULL, dh2048, sizeof(dh2048)), -1); - AssertIntEQ(wolfSSL_DH_LoadDer(dh, dh2048, sizeof(dh2048)), 1); + ExpectIntEQ(wolfSSL_DH_LoadDer(dh, dh2048, sizeof(dh2048)), 1); wolfSSL_DH_free(dh); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_i2d_DHparams(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_ALL #if !defined(NO_DH) && (defined(HAVE_FFDHE_2048) || defined(HAVE_FFDHE_3072)) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) - FILE* f; + XFILE f = XBADFILE; unsigned char buf[4096]; const unsigned char* pt; unsigned char* pt2; @@ -59791,32 +71739,35 @@ #ifdef HAVE_FFDHE_3072 const char* params2 = "./certs/dh3072.der"; #endif - long len; - WOLFSSL_DH* dh; + long len = 0; + WOLFSSL_DH* dh = NULL; /* Test 2048 bit parameters */ #ifdef HAVE_FFDHE_2048 pt = buf; pt2 = buf; - f = XFOPEN(params1, "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(params1, "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } /* Valid case */ - AssertNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); - AssertTrue(pt == buf); - AssertIntEQ(DH_generate_key(dh), 1); - AssertIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 268); + ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); + ExpectTrue(pt == buf); + ExpectIntEQ(DH_generate_key(dh), 1); + ExpectIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 268); /* Invalid case */ - AssertIntEQ(wolfSSL_i2d_DHparams(NULL, &pt2), 0); + ExpectIntEQ(wolfSSL_i2d_DHparams(NULL, &pt2), 0); /* Return length only */ - AssertIntEQ(wolfSSL_i2d_DHparams(dh, NULL), 268); + ExpectIntEQ(wolfSSL_i2d_DHparams(dh, NULL), 268); DH_free(dh); + dh = NULL; *buf = 0; #endif @@ -59826,37 +71777,39 @@ pt = buf; pt2 = buf; - f = XFOPEN(params2, "rb"); - AssertTrue(f != XBADFILE); - len = (long)XFREAD(buf, 1, sizeof(buf), f); - XFCLOSE(f); + ExpectTrue((f = XFOPEN(params2, "rb")) != XBADFILE); + ExpectTrue((len = (long)XFREAD(buf, 1, sizeof(buf), f)) > 0); + if (f != XBADFILE) { + XFCLOSE(f); + f = XBADFILE; + } /* Valid case */ - AssertNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); - AssertTrue(pt == buf); - AssertIntEQ(DH_generate_key(dh), 1); - AssertIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 396); + ExpectNotNull(dh = wolfSSL_d2i_DHparams(NULL, &pt, len)); + ExpectTrue(pt == buf); + ExpectIntEQ(DH_generate_key(dh), 1); + ExpectIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 396); /* Invalid case */ - AssertIntEQ(wolfSSL_i2d_DHparams(NULL, &pt2), 0); + ExpectIntEQ(wolfSSL_i2d_DHparams(NULL, &pt2), 0); /* Return length only */ - AssertIntEQ(wolfSSL_i2d_DHparams(dh, NULL), 396); + ExpectIntEQ(wolfSSL_i2d_DHparams(dh, NULL), 396); DH_free(dh); + dh = NULL; #endif dh = DH_new(); - AssertNotNull(dh); + ExpectNotNull(dh); pt2 = buf; - AssertIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 0); + ExpectIntEQ(wolfSSL_i2d_DHparams(dh, &pt2), 0); DH_free(dh); - - res = TEST_RES_CHECK(1); + dh = NULL; #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* !NO_DH && (HAVE_FFDHE_2048 || HAVE_FFDHE_3072) */ #endif - return res; + return EXPECT_RESULT(); } #if defined(HAVE_ECC) && !defined(OPENSSL_NO_PK) @@ -59867,15 +71820,15 @@ static int test_wolfSSL_EC_GROUP(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_EXTRA - EC_GROUP *group; - EC_GROUP *group2; - EC_GROUP *group3; + EC_GROUP *group = NULL; + EC_GROUP *group2 = NULL; + EC_GROUP *group3 = NULL; #ifndef HAVE_ECC_BRAINPOOL - EC_GROUP *group4; + EC_GROUP *group4 = NULL; #endif - WOLFSSL_BIGNUM* order; + WOLFSSL_BIGNUM* order = NULL; int group_bits; int i; static const int knownEccNids[] = { @@ -59939,45 +71892,45 @@ }; int knowEccEnumsLen = (int)(sizeof(knownEccEnums) / sizeof(*knownEccEnums)); - AssertNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); - AssertNotNull(group2 = EC_GROUP_dup(group)); - AssertNotNull(group3 = wolfSSL_EC_GROUP_new_by_curve_name(NID_secp384r1)); + ExpectNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(group2 = EC_GROUP_dup(group)); + ExpectNotNull(group3 = wolfSSL_EC_GROUP_new_by_curve_name(NID_secp384r1)); #ifndef HAVE_ECC_BRAINPOOL - AssertNotNull(group4 = wolfSSL_EC_GROUP_new_by_curve_name( + ExpectNotNull(group4 = wolfSSL_EC_GROUP_new_by_curve_name( NID_brainpoolP256r1)); #endif - AssertNull(EC_GROUP_dup(NULL)); + ExpectNull(EC_GROUP_dup(NULL)); - AssertIntEQ(wolfSSL_EC_GROUP_get_curve_name(NULL), 0); - AssertIntEQ(wolfSSL_EC_GROUP_get_curve_name(group), NID_X9_62_prime256v1); + ExpectIntEQ(wolfSSL_EC_GROUP_get_curve_name(NULL), 0); + ExpectIntEQ(wolfSSL_EC_GROUP_get_curve_name(group), NID_X9_62_prime256v1); - AssertIntEQ((group_bits = EC_GROUP_order_bits(NULL)), 0); - AssertIntEQ((group_bits = EC_GROUP_order_bits(group)), 256); + ExpectIntEQ((group_bits = EC_GROUP_order_bits(NULL)), 0); + ExpectIntEQ((group_bits = EC_GROUP_order_bits(group)), 256); #ifndef HAVE_ECC_BRAINPOOL - AssertIntEQ((group_bits = EC_GROUP_order_bits(group4)), 0); + ExpectIntEQ((group_bits = EC_GROUP_order_bits(group4)), 0); #endif - AssertIntEQ(wolfSSL_EC_GROUP_get_degree(NULL), 0); - AssertIntEQ(wolfSSL_EC_GROUP_get_degree(group), 256); + ExpectIntEQ(wolfSSL_EC_GROUP_get_degree(NULL), 0); + ExpectIntEQ(wolfSSL_EC_GROUP_get_degree(group), 256); - AssertNotNull(order = BN_new()); - AssertIntEQ(wolfSSL_EC_GROUP_get_order(NULL, NULL, NULL), 0); - AssertIntEQ(wolfSSL_EC_GROUP_get_order(group, NULL, NULL), 0); - AssertIntEQ(wolfSSL_EC_GROUP_get_order(NULL, order, NULL), 0); - AssertIntEQ(wolfSSL_EC_GROUP_get_order(group, order, NULL), 1); + ExpectNotNull(order = BN_new()); + ExpectIntEQ(wolfSSL_EC_GROUP_get_order(NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_EC_GROUP_get_order(group, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_EC_GROUP_get_order(NULL, order, NULL), 0); + ExpectIntEQ(wolfSSL_EC_GROUP_get_order(group, order, NULL), 1); wolfSSL_BN_free(order); - AssertNotNull(EC_GROUP_method_of(group)); + ExpectNotNull(EC_GROUP_method_of(group)); - AssertIntEQ(EC_METHOD_get_field_type(NULL), 0); - AssertIntEQ(EC_METHOD_get_field_type(EC_GROUP_method_of(group)), + ExpectIntEQ(EC_METHOD_get_field_type(NULL), 0); + ExpectIntEQ(EC_METHOD_get_field_type(EC_GROUP_method_of(group)), NID_X9_62_prime_field); - AssertIntEQ(wolfSSL_EC_GROUP_cmp(NULL, NULL, NULL), -1); - AssertIntEQ(wolfSSL_EC_GROUP_cmp(group, NULL, NULL), -1); - AssertIntEQ(wolfSSL_EC_GROUP_cmp(NULL, group, NULL), -1); - AssertIntEQ(wolfSSL_EC_GROUP_cmp(group, group3, NULL), 1); + ExpectIntEQ(wolfSSL_EC_GROUP_cmp(NULL, NULL, NULL), -1); + ExpectIntEQ(wolfSSL_EC_GROUP_cmp(group, NULL, NULL), -1); + ExpectIntEQ(wolfSSL_EC_GROUP_cmp(NULL, group, NULL), -1); + ExpectIntEQ(wolfSSL_EC_GROUP_cmp(group, group3, NULL), 1); #ifndef NO_WOLFSSL_STUB wolfSSL_EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); @@ -59991,30 +71944,30 @@ EC_GROUP_free(group); for (i = 0; i < knowEccNidsLen; i++) { - AssertNotNull(group = EC_GROUP_new_by_curve_name(knownEccNids[i])); - AssertIntGT(wolfSSL_EC_GROUP_get_degree(group), 0); + group = NULL; + ExpectNotNull(group = EC_GROUP_new_by_curve_name(knownEccNids[i])); + ExpectIntGT(wolfSSL_EC_GROUP_get_degree(group), 0); EC_GROUP_free(group); } for (i = 0; i < knowEccEnumsLen; i++) { - AssertNotNull(group = EC_GROUP_new_by_curve_name(knownEccEnums[i])); - AssertIntEQ(wolfSSL_EC_GROUP_get_curve_name(group), knownEccNids[i]); + group = NULL; + ExpectNotNull(group = EC_GROUP_new_by_curve_name(knownEccEnums[i])); + ExpectIntEQ(wolfSSL_EC_GROUP_get_curve_name(group), knownEccNids[i]); EC_GROUP_free(group); } - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_PEM_read_bio_ECPKParameters(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_FILESYSTEM) && defined(OPENSSL_EXTRA) && !defined(NO_BIO) - EC_GROUP *group; - BIO* bio; + EC_GROUP *group = NULL; + BIO* bio = NULL; #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \ ECC_MIN_KEY_SZ <= 384 && !defined(NO_ECC_SECP) - EC_GROUP *ret; + EC_GROUP *ret = NULL; static char ec_nc_p384[] = "-----BEGIN EC PARAMETERS-----\n" "BgUrgQQAIg==\n" "-----END EC PARAMETERS-----"; @@ -60033,89 +71986,97 @@ "-----END EC PARAMETERS-----"; /* Test that first parameter, bio, being NULL fails. */ - AssertNull(PEM_read_bio_ECPKParameters(NULL, NULL, NULL, NULL)); + ExpectNull(PEM_read_bio_ECPKParameters(NULL, NULL, NULL, NULL)); /* Test that reading named parameters works. */ - AssertNotNull(bio = BIO_new(BIO_s_file())); - AssertIntEQ(BIO_read_filename(bio, eccKeyFile), WOLFSSL_SUCCESS); - AssertNotNull(group = PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); - AssertIntEQ(EC_GROUP_get_curve_name(group), NID_X9_62_prime256v1); + ExpectNotNull(bio = BIO_new(BIO_s_file())); + ExpectIntEQ(BIO_read_filename(bio, eccKeyFile), WOLFSSL_SUCCESS); + ExpectNotNull(group = PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); + ExpectIntEQ(EC_GROUP_get_curve_name(group), NID_X9_62_prime256v1); BIO_free(bio); + bio = NULL; + EC_GROUP_free(group); + group = NULL; #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \ ECC_MIN_KEY_SZ <= 384 && !defined(NO_ECC_SECP) /* Test that reusing group works. */ - AssertNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_p384, + ExpectNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_p384, sizeof(ec_nc_p384))); - AssertNotNull(group = PEM_read_bio_ECPKParameters(bio, &group, NULL, NULL)); - AssertIntEQ(EC_GROUP_get_curve_name(group), NID_secp384r1); + ExpectNotNull(group = PEM_read_bio_ECPKParameters(bio, &group, NULL, NULL)); + ExpectIntEQ(EC_GROUP_get_curve_name(group), NID_secp384r1); BIO_free(bio); + bio = NULL; EC_GROUP_free(group); group = NULL; /* Test that returning through group works. */ - AssertNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_p384, + ExpectNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_p384, sizeof(ec_nc_p384))); - AssertNotNull(ret = PEM_read_bio_ECPKParameters(bio, &group, NULL, NULL)); - AssertIntEQ(group == ret, 1); - AssertIntEQ(EC_GROUP_get_curve_name(group), NID_secp384r1); + ExpectNotNull(ret = PEM_read_bio_ECPKParameters(bio, &group, NULL, NULL)); + ExpectIntEQ(group == ret, 1); + ExpectIntEQ(EC_GROUP_get_curve_name(group), NID_secp384r1); BIO_free(bio); -#endif + bio = NULL; EC_GROUP_free(group); + group = NULL; +#endif /* Test 0x30, 0x00 (not and object id) fails. */ - AssertNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_1, + ExpectNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_1, sizeof(ec_nc_bad_1))); - AssertNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); + ExpectNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); BIO_free(bio); + bio = NULL; /* Test 0x06, 0x00 (empty object id) fails. */ - AssertNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_2, + ExpectNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_2, sizeof(ec_nc_bad_2))); - AssertNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); + ExpectNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); BIO_free(bio); + bio = NULL; /* Test 0x06, 0x01 (badly formed object id) fails. */ - AssertNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_3, + ExpectNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_3, sizeof(ec_nc_bad_3))); - AssertNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); + ExpectNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); BIO_free(bio); + bio = NULL; /* Test invalid PEM encoding - invalid character. */ - AssertNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_4, + ExpectNotNull(bio = BIO_new_mem_buf((unsigned char*)ec_nc_bad_4, sizeof(ec_nc_bad_4))); - AssertNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); + ExpectNull(PEM_read_bio_ECPKParameters(bio, NULL, NULL, NULL)); BIO_free(bio); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_POINT(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(WOLFSSL_SP_MATH) && \ (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2))) #ifdef OPENSSL_EXTRA - BN_CTX* ctx; - EC_GROUP* group; + BN_CTX* ctx = NULL; + EC_GROUP* group = NULL; #ifndef HAVE_ECC_BRAINPOOL - EC_GROUP* group2; + EC_GROUP* group2 = NULL; #endif - EC_POINT* Gxy; - EC_POINT* new_point; - EC_POINT* set_point; - EC_POINT* infinity; + EC_POINT* Gxy = NULL; + EC_POINT* new_point = NULL; + EC_POINT* set_point = NULL; + EC_POINT* get_point = NULL; + EC_POINT* infinity = NULL; BIGNUM* k = NULL; BIGNUM* Gx = NULL; BIGNUM* Gy = NULL; BIGNUM* Gz = NULL; - BIGNUM* X; - BIGNUM* Y; - BIGNUM* set_point_bn; - char* hexStr; + BIGNUM* X = NULL; + BIGNUM* Y = NULL; + BIGNUM* set_point_bn = NULL; + char* hexStr = NULL; const char* kTest = "F4F8338AFCC562C5C3F3E1E46A7EFECD" "17AF381913FF7A96314EA47055EA0FD0"; @@ -60124,18 +72085,22 @@ "77037D812DEB33A0F4A13945D898C296"; const char* kGy = "4FE342E2FE1A7F9B8EE7EB4A7C0F9E16" "2BCE33576B315ECECBB6406837BF51F5"; + const char* uncompG + = "046B17D1F2E12C4247F8BCE6E563A440F2" + "77037D812DEB33A0F4A13945D898C296" + "4FE342E2FE1A7F9B8EE7EB4A7C0F9E16" + "2BCE33576B315ECECBB6406837BF51F5"; + const char* compG + = "036B17D1F2E12C4247F8BCE6E563A440F2" + "77037D812DEB33A0F4A13945D898C296"; #ifndef HAVE_SELFTEST - EC_POINT *tmp; + EC_POINT *tmp = NULL; size_t bin_len; - unsigned int blen; + unsigned int blen = 0; unsigned char* buf = NULL; unsigned char bufInf[1] = { 0x00 }; - const char* uncompG = "046B17D1F2E12C4247F8BCE6E563A440F2" - "77037D812DEB33A0F4A13945D898C296" - "4FE342E2FE1A7F9B8EE7EB4A7C0F9E16" - "2BCE33576B315ECECBB6406837BF51F5"; const unsigned char binUncompG[] = { 0x04, 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2, 0x77, 0x03, 0x7d, 0x81, 0x2d, @@ -60153,8 +72118,6 @@ 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5, }; - const char* compG = "036B17D1F2E12C4247F8BCE6E563A440F2" - "77037D812DEB33A0F4A13945D898C296"; #ifdef HAVE_COMP_KEY const unsigned char binCompG[] = { 0x03, 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, @@ -60164,357 +72127,396 @@ #endif #endif - AssertNotNull(ctx = BN_CTX_new()); - AssertNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(ctx = BN_CTX_new()); + ExpectNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); #ifndef HAVE_ECC_BRAINPOOL /* Used to make groups curve_idx == -1. */ - AssertNotNull(group2 = EC_GROUP_new_by_curve_name(NID_brainpoolP256r1)); + ExpectNotNull(group2 = EC_GROUP_new_by_curve_name(NID_brainpoolP256r1)); #endif - AssertNull(EC_POINT_new(NULL)); - AssertNotNull(Gxy = EC_POINT_new(group)); - AssertNotNull(new_point = EC_POINT_new(group)); - AssertNotNull(set_point = EC_POINT_new(group)); - AssertNotNull(X = BN_new()); - AssertNotNull(Y = BN_new()); - AssertNotNull(set_point_bn = BN_new()); + ExpectNull(EC_POINT_new(NULL)); + ExpectNotNull(Gxy = EC_POINT_new(group)); + ExpectNotNull(new_point = EC_POINT_new(group)); + ExpectNotNull(set_point = EC_POINT_new(group)); + ExpectNotNull(X = BN_new()); + ExpectNotNull(Y = BN_new()); + ExpectNotNull(set_point_bn = BN_new()); - AssertNotNull(infinity = EC_POINT_new(group)); + ExpectNotNull(infinity = EC_POINT_new(group)); /* load test values */ - AssertIntEQ(BN_hex2bn(&k, kTest), WOLFSSL_SUCCESS); - AssertIntEQ(BN_hex2bn(&Gx, kGx), WOLFSSL_SUCCESS); - AssertIntEQ(BN_hex2bn(&Gy, kGy), WOLFSSL_SUCCESS); - AssertIntEQ(BN_hex2bn(&Gz, "1"), WOLFSSL_SUCCESS); + ExpectIntEQ(BN_hex2bn(&k, kTest), WOLFSSL_SUCCESS); + ExpectIntEQ(BN_hex2bn(&Gx, kGx), WOLFSSL_SUCCESS); + ExpectIntEQ(BN_hex2bn(&Gy, kGy), WOLFSSL_SUCCESS); + ExpectIntEQ(BN_hex2bn(&Gz, "1"), WOLFSSL_SUCCESS); /* populate coordinates for input point */ - Gxy->X = Gx; - Gxy->Y = Gy; - Gxy->Z = Gz; + if (Gxy != NULL) { + Gxy->X = Gx; + Gxy->Y = Gy; + Gxy->Z = Gz; + } /* Test handling of NULL point. */ EC_POINT_clear_free(NULL); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, NULL, NULL, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, NULL, NULL, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, Gxy, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, Gxy, NULL, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, NULL, X, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, NULL, NULL, Y, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, Gxy, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(NULL, Gxy, X, Y, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, NULL, X, Y, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, Gxy, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, Gxy, NULL, Y, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, Gxy, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, Gxy, X, NULL, ctx), 0); /* Getting point at infinity returns an error. */ - AssertIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, infinity, + ExpectIntEQ(wolfSSL_EC_POINT_get_affine_coordinates_GFp(group, infinity, X, Y, ctx), 0); #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ !defined(HAVE_SELFTEST) && !defined(WOLFSSL_SP_MATH) && \ !defined(WOLF_CRYPTO_CB_ONLY_ECC) - AssertIntEQ(EC_POINT_add(NULL, NULL, NULL, NULL, ctx), 0); - AssertIntEQ(EC_POINT_add(group, NULL, NULL, NULL, ctx), 0); - AssertIntEQ(EC_POINT_add(NULL, new_point, NULL, NULL, ctx), 0); - AssertIntEQ(EC_POINT_add(NULL, NULL, new_point, NULL, ctx), 0); - AssertIntEQ(EC_POINT_add(NULL, NULL, NULL, Gxy, ctx), 0); - AssertIntEQ(EC_POINT_add(NULL, new_point, new_point, Gxy, ctx), 0); - AssertIntEQ(EC_POINT_add(group, NULL, new_point, Gxy, ctx), 0); - AssertIntEQ(EC_POINT_add(group, new_point, NULL, Gxy, ctx), 0); - AssertIntEQ(EC_POINT_add(group, new_point, new_point, NULL, ctx), 0); - - AssertIntEQ(EC_POINT_mul(NULL, NULL, Gx, Gxy, k, ctx), 0); - AssertIntEQ(EC_POINT_mul(NULL, new_point, Gx, Gxy, k, ctx), 0); - AssertIntEQ(EC_POINT_mul(group, NULL, Gx, Gxy, k, ctx), 0); + ExpectIntEQ(EC_POINT_add(NULL, NULL, NULL, NULL, ctx), 0); + ExpectIntEQ(EC_POINT_add(group, NULL, NULL, NULL, ctx), 0); + ExpectIntEQ(EC_POINT_add(NULL, new_point, NULL, NULL, ctx), 0); + ExpectIntEQ(EC_POINT_add(NULL, NULL, new_point, NULL, ctx), 0); + ExpectIntEQ(EC_POINT_add(NULL, NULL, NULL, Gxy, ctx), 0); + ExpectIntEQ(EC_POINT_add(NULL, new_point, new_point, Gxy, ctx), 0); + ExpectIntEQ(EC_POINT_add(group, NULL, new_point, Gxy, ctx), 0); + ExpectIntEQ(EC_POINT_add(group, new_point, NULL, Gxy, ctx), 0); + ExpectIntEQ(EC_POINT_add(group, new_point, new_point, NULL, ctx), 0); + + ExpectIntEQ(EC_POINT_mul(NULL, NULL, Gx, Gxy, k, ctx), 0); + ExpectIntEQ(EC_POINT_mul(NULL, new_point, Gx, Gxy, k, ctx), 0); + ExpectIntEQ(EC_POINT_mul(group, NULL, Gx, Gxy, k, ctx), 0); - AssertIntEQ(EC_POINT_add(group, new_point, new_point, Gxy, ctx), 1); + ExpectIntEQ(EC_POINT_add(group, new_point, new_point, Gxy, ctx), 1); /* perform point multiplication */ - AssertIntEQ(EC_POINT_mul(group, new_point, Gx, Gxy, k, ctx), 1); - AssertIntEQ(BN_is_zero(new_point->X), 0); - AssertIntEQ(BN_is_zero(new_point->Y), 0); - AssertIntEQ(BN_is_zero(new_point->Z), 0); - AssertIntEQ(EC_POINT_mul(group, new_point, NULL, Gxy, k, ctx), 1); - AssertIntEQ(BN_is_zero(new_point->X), 0); - AssertIntEQ(BN_is_zero(new_point->Y), 0); - AssertIntEQ(BN_is_zero(new_point->Z), 0); - AssertIntEQ(EC_POINT_mul(group, new_point, Gx, NULL, NULL, ctx), 1); - AssertIntEQ(BN_is_zero(new_point->X), 0); - AssertIntEQ(BN_is_zero(new_point->Y), 0); - AssertIntEQ(BN_is_zero(new_point->Z), 0); - AssertIntEQ(EC_POINT_mul(group, new_point, NULL, NULL, NULL, ctx), 1); - AssertIntEQ(BN_is_zero(new_point->X), 1); - AssertIntEQ(BN_is_zero(new_point->Y), 1); - AssertIntEQ(BN_is_zero(new_point->Z), 1); + ExpectIntEQ(EC_POINT_mul(group, new_point, Gx, Gxy, k, ctx), 1); + ExpectIntEQ(BN_is_zero(new_point->X), 0); + ExpectIntEQ(BN_is_zero(new_point->Y), 0); + ExpectIntEQ(BN_is_zero(new_point->Z), 0); + ExpectIntEQ(EC_POINT_mul(group, new_point, NULL, Gxy, k, ctx), 1); + ExpectIntEQ(BN_is_zero(new_point->X), 0); + ExpectIntEQ(BN_is_zero(new_point->Y), 0); + ExpectIntEQ(BN_is_zero(new_point->Z), 0); + ExpectIntEQ(EC_POINT_mul(group, new_point, Gx, NULL, NULL, ctx), 1); + ExpectIntEQ(BN_is_zero(new_point->X), 0); + ExpectIntEQ(BN_is_zero(new_point->Y), 0); + ExpectIntEQ(BN_is_zero(new_point->Z), 0); + ExpectIntEQ(EC_POINT_mul(group, new_point, NULL, NULL, NULL, ctx), 1); + ExpectIntEQ(BN_is_zero(new_point->X), 1); + ExpectIntEQ(BN_is_zero(new_point->Y), 1); + ExpectIntEQ(BN_is_zero(new_point->Z), 1); /* Set point to something. */ - AssertIntEQ(EC_POINT_add(group, new_point, Gxy, Gxy, ctx), 1); + ExpectIntEQ(EC_POINT_add(group, new_point, Gxy, Gxy, ctx), 1); #else - AssertIntEQ(EC_POINT_set_affine_coordinates_GFp(group, new_point, Gx, Gy, + ExpectIntEQ(EC_POINT_set_affine_coordinates_GFp(group, new_point, Gx, Gy, ctx), 1); - AssertIntEQ(BN_is_zero(new_point->X), 0); - AssertIntEQ(BN_is_zero(new_point->Y), 0); - AssertIntEQ(BN_is_zero(new_point->Z), 0); + ExpectIntEQ(BN_is_zero(new_point->X), 0); + ExpectIntEQ(BN_is_zero(new_point->Y), 0); + ExpectIntEQ(BN_is_zero(new_point->Z), 0); #endif /* check if point X coordinate is zero */ - AssertIntEQ(BN_is_zero(new_point->X), 0); + ExpectIntEQ(BN_is_zero(new_point->X), 0); #if defined(USE_ECC_B_PARAM) && !defined(HAVE_SELFTEST) && \ (!defined(HAVE_FIPS) || FIPS_VERSION_GT(2,0)) - AssertIntEQ(EC_POINT_is_on_curve(group, new_point, ctx), 1); + ExpectIntEQ(EC_POINT_is_on_curve(group, new_point, ctx), 1); #endif /* extract the coordinates from point */ - AssertIntEQ(EC_POINT_get_affine_coordinates_GFp(group, new_point, X, Y, + ExpectIntEQ(EC_POINT_get_affine_coordinates_GFp(group, new_point, X, Y, ctx), WOLFSSL_SUCCESS); /* check if point X coordinate is zero */ - AssertIntEQ(BN_is_zero(X), WOLFSSL_FAILURE); + ExpectIntEQ(BN_is_zero(X), WOLFSSL_FAILURE); /* set the same X and Y points in another object */ - AssertIntEQ(EC_POINT_set_affine_coordinates_GFp(group, set_point, X, Y, + ExpectIntEQ(EC_POINT_set_affine_coordinates_GFp(group, set_point, X, Y, ctx), WOLFSSL_SUCCESS); /* compare points as they should be the same */ - AssertIntEQ(EC_POINT_cmp(NULL, NULL, NULL, ctx), -1); - AssertIntEQ(EC_POINT_cmp(group, NULL, NULL, ctx), -1); - AssertIntEQ(EC_POINT_cmp(NULL, new_point, NULL, ctx), -1); - AssertIntEQ(EC_POINT_cmp(NULL, NULL, set_point, ctx), -1); - AssertIntEQ(EC_POINT_cmp(NULL, new_point, set_point, ctx), -1); - AssertIntEQ(EC_POINT_cmp(group, NULL, set_point, ctx), -1); - AssertIntEQ(EC_POINT_cmp(group, new_point, NULL, ctx), -1); - AssertIntEQ(EC_POINT_cmp(group, new_point, set_point, ctx), 0); + ExpectIntEQ(EC_POINT_cmp(NULL, NULL, NULL, ctx), -1); + ExpectIntEQ(EC_POINT_cmp(group, NULL, NULL, ctx), -1); + ExpectIntEQ(EC_POINT_cmp(NULL, new_point, NULL, ctx), -1); + ExpectIntEQ(EC_POINT_cmp(NULL, NULL, set_point, ctx), -1); + ExpectIntEQ(EC_POINT_cmp(NULL, new_point, set_point, ctx), -1); + ExpectIntEQ(EC_POINT_cmp(group, NULL, set_point, ctx), -1); + ExpectIntEQ(EC_POINT_cmp(group, new_point, NULL, ctx), -1); + ExpectIntEQ(EC_POINT_cmp(group, new_point, set_point, ctx), 0); /* Test copying */ - AssertIntEQ(EC_POINT_copy(NULL, NULL), 0); - AssertIntEQ(EC_POINT_copy(NULL, set_point), 0); - AssertIntEQ(EC_POINT_copy(new_point, NULL), 0); - AssertIntEQ(EC_POINT_copy(new_point, set_point), 1); + ExpectIntEQ(EC_POINT_copy(NULL, NULL), 0); + ExpectIntEQ(EC_POINT_copy(NULL, set_point), 0); + ExpectIntEQ(EC_POINT_copy(new_point, NULL), 0); + ExpectIntEQ(EC_POINT_copy(new_point, set_point), 1); /* Test inverting */ - AssertIntEQ(EC_POINT_invert(NULL, NULL, ctx), 0); - AssertIntEQ(EC_POINT_invert(NULL, new_point, ctx), 0); - AssertIntEQ(EC_POINT_invert(group, NULL, ctx), 0); - AssertIntEQ(EC_POINT_invert(group, new_point, ctx), 1); + ExpectIntEQ(EC_POINT_invert(NULL, NULL, ctx), 0); + ExpectIntEQ(EC_POINT_invert(NULL, new_point, ctx), 0); + ExpectIntEQ(EC_POINT_invert(group, NULL, ctx), 0); + ExpectIntEQ(EC_POINT_invert(group, new_point, ctx), 1); + +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(HAVE_SELFTEST) && !defined(WOLFSSL_SP_MATH) && \ + !defined(WOLF_CRYPTO_CB_ONLY_ECC) + { + EC_POINT* orig_point = NULL; + ExpectNotNull(orig_point = EC_POINT_new(group)); + ExpectIntEQ(EC_POINT_add(group, orig_point, set_point, set_point, NULL), + 1); + /* new_point should be set_point inverted so adding it will revert + * the point back to set_point */ + ExpectIntEQ(EC_POINT_add(group, orig_point, orig_point, new_point, + NULL), 1); + ExpectIntEQ(EC_POINT_cmp(group, orig_point, set_point, NULL), 0); + EC_POINT_free(orig_point); + } +#endif /* Test getting affine converts from projective. */ - AssertIntEQ(EC_POINT_copy(set_point, new_point), 1); + ExpectIntEQ(EC_POINT_copy(set_point, new_point), 1); /* Force non-affine coordinates */ - AssertIntEQ(BN_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), + ExpectIntEQ(BN_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), (WOLFSSL_BIGNUM*)BN_value_one()), 1); - new_point->inSet = 0; + if (new_point != NULL) { + new_point->inSet = 0; + } /* extract the coordinates from point */ - AssertIntEQ(EC_POINT_get_affine_coordinates_GFp(group, new_point, X, Y, + ExpectIntEQ(EC_POINT_get_affine_coordinates_GFp(group, new_point, X, Y, ctx), WOLFSSL_SUCCESS); /* check if point ordinates have changed. */ - AssertIntNE(BN_cmp(X, set_point->X), 0); - AssertIntNE(BN_cmp(Y, set_point->Y), 0); + ExpectIntNE(BN_cmp(X, set_point->X), 0); + ExpectIntNE(BN_cmp(Y, set_point->Y), 0); /* Test check for infinity */ #ifndef WOLF_CRYPTO_CB_ONLY_ECC - AssertIntEQ(EC_POINT_is_at_infinity(NULL, NULL), 0); - AssertIntEQ(EC_POINT_is_at_infinity(NULL, infinity), 0); - AssertIntEQ(EC_POINT_is_at_infinity(group, NULL), 0); - AssertIntEQ(EC_POINT_is_at_infinity(group, infinity), 1); - AssertIntEQ(EC_POINT_is_at_infinity(group, Gxy), 0); + ExpectIntEQ(EC_POINT_is_at_infinity(NULL, NULL), 0); + ExpectIntEQ(EC_POINT_is_at_infinity(NULL, infinity), 0); + ExpectIntEQ(EC_POINT_is_at_infinity(group, NULL), 0); + ExpectIntEQ(EC_POINT_is_at_infinity(group, infinity), 1); + ExpectIntEQ(EC_POINT_is_at_infinity(group, Gxy), 0); #else - AssertIntEQ(EC_POINT_is_at_infinity(group, infinity), 0); + ExpectIntEQ(EC_POINT_is_at_infinity(group, infinity), 0); #endif - AssertPtrEq(EC_POINT_point2bn(group, set_point, + ExpectPtrEq(EC_POINT_point2bn(group, set_point, POINT_CONVERSION_UNCOMPRESSED, set_point_bn, ctx), set_point_bn); /* check bn2hex */ hexStr = BN_bn2hex(k); - AssertStrEQ(hexStr, kTest); -#if !defined(NO_FILESYSTEM) && defined(XFPRINTF) + ExpectStrEQ(hexStr, kTest); +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) && \ + defined(XFPRINTF) BN_print_fp(stderr, k); fprintf(stderr, "\n"); #endif XFREE(hexStr, NULL, DYNAMIC_TYPE_ECC); hexStr = BN_bn2hex(Gx); - AssertStrEQ(hexStr, kGx); -#if !defined(NO_FILESYSTEM) && defined(XFPRINTF) + ExpectStrEQ(hexStr, kGx); +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) && \ + defined(XFPRINTF) BN_print_fp(stderr, Gx); fprintf(stderr, "\n"); #endif XFREE(hexStr, NULL, DYNAMIC_TYPE_ECC); hexStr = BN_bn2hex(Gy); - AssertStrEQ(hexStr, kGy); -#if !defined(NO_FILESYSTEM) && defined(XFPRINTF) + ExpectStrEQ(hexStr, kGy); +#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) && \ + defined(XFPRINTF) BN_print_fp(stderr, Gy); fprintf(stderr, "\n"); #endif XFREE(hexStr, NULL, DYNAMIC_TYPE_ECC); -#ifndef HAVE_SELFTEST /* Test point to hex */ - AssertNull(EC_POINT_point2hex(NULL, NULL, POINT_CONVERSION_UNCOMPRESSED, + ExpectNull(EC_POINT_point2hex(NULL, NULL, POINT_CONVERSION_UNCOMPRESSED, ctx)); - AssertNull(EC_POINT_point2hex(NULL, Gxy, POINT_CONVERSION_UNCOMPRESSED, + ExpectNull(EC_POINT_point2hex(NULL, Gxy, POINT_CONVERSION_UNCOMPRESSED, ctx)); - AssertNull(EC_POINT_point2hex(group, NULL, POINT_CONVERSION_UNCOMPRESSED, + ExpectNull(EC_POINT_point2hex(group, NULL, POINT_CONVERSION_UNCOMPRESSED, ctx)); #ifndef HAVE_ECC_BRAINPOOL /* Group not supported in wolfCrypt. */ - AssertNull(EC_POINT_point2hex(group2, Gxy, POINT_CONVERSION_UNCOMPRESSED, + ExpectNull(EC_POINT_point2hex(group2, Gxy, POINT_CONVERSION_UNCOMPRESSED, ctx)); #endif hexStr = EC_POINT_point2hex(group, Gxy, POINT_CONVERSION_UNCOMPRESSED, ctx); - AssertStrEQ(hexStr, uncompG); + ExpectNotNull(hexStr); + ExpectStrEQ(hexStr, uncompG); + ExpectNotNull(get_point = EC_POINT_hex2point(group, hexStr, NULL, ctx)); + ExpectIntEQ(EC_POINT_cmp(group, Gxy, get_point, ctx), 0); XFREE(hexStr, NULL, DYNAMIC_TYPE_ECC); hexStr = EC_POINT_point2hex(group, Gxy, POINT_CONVERSION_COMPRESSED, ctx); - AssertStrEQ(hexStr, compG); + ExpectNotNull(hexStr); + ExpectStrEQ(hexStr, compG); + #ifdef HAVE_COMP_KEY + ExpectNotNull(get_point = EC_POINT_hex2point + (group, hexStr, get_point, ctx)); + ExpectIntEQ(EC_POINT_cmp(group, Gxy, get_point, ctx), 0); + #endif XFREE(hexStr, NULL, DYNAMIC_TYPE_ECC); + EC_POINT_free(get_point); +#ifndef HAVE_SELFTEST /* Test point to oct */ - AssertIntEQ(EC_POINT_point2oct(NULL, NULL, POINT_CONVERSION_UNCOMPRESSED, + ExpectIntEQ(EC_POINT_point2oct(NULL, NULL, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, ctx), 0); - AssertIntEQ(EC_POINT_point2oct(NULL, Gxy, POINT_CONVERSION_UNCOMPRESSED, + ExpectIntEQ(EC_POINT_point2oct(NULL, Gxy, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, ctx), 0); - AssertIntEQ(EC_POINT_point2oct(group, NULL, POINT_CONVERSION_UNCOMPRESSED, + ExpectIntEQ(EC_POINT_point2oct(group, NULL, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, ctx), 0); bin_len = EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, ctx); - AssertIntEQ(bin_len, sizeof(binUncompG)); - AssertNotNull(buf = (unsigned char*)XMALLOC(bin_len, NULL, + ExpectIntEQ(bin_len, sizeof(binUncompG)); + ExpectNotNull(buf = (unsigned char*)XMALLOC(bin_len, NULL, DYNAMIC_TYPE_ECC)); - AssertIntEQ(EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_UNCOMPRESSED, + ExpectIntEQ(EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_UNCOMPRESSED, buf, bin_len, ctx), bin_len); - AssertIntEQ(XMEMCMP(buf, binUncompG, sizeof(binUncompG)), 0); + ExpectIntEQ(XMEMCMP(buf, binUncompG, sizeof(binUncompG)), 0); XFREE(buf, NULL, DYNAMIC_TYPE_ECC); /* Infinity (x=0, y=0) encodes as '0x00'. */ - AssertIntEQ(EC_POINT_point2oct(group, infinity, + ExpectIntEQ(EC_POINT_point2oct(group, infinity, POINT_CONVERSION_UNCOMPRESSED, NULL, 0, ctx), 1); - AssertIntEQ(EC_POINT_point2oct(group, infinity, + ExpectIntEQ(EC_POINT_point2oct(group, infinity, POINT_CONVERSION_UNCOMPRESSED, bufInf, 0, ctx), 0); - AssertIntEQ(EC_POINT_point2oct(group, infinity, + ExpectIntEQ(EC_POINT_point2oct(group, infinity, POINT_CONVERSION_UNCOMPRESSED, bufInf, 1, ctx), 1); - AssertIntEQ(bufInf[0], 0); + ExpectIntEQ(bufInf[0], 0); wolfSSL_EC_POINT_dump(NULL, NULL); /* Test point i2d */ - AssertIntEQ(ECPoint_i2d(NULL, NULL, NULL, &blen), 0); - AssertIntEQ(ECPoint_i2d(NULL, Gxy, NULL, &blen), 0); - AssertIntEQ(ECPoint_i2d(group, NULL, NULL, &blen), 0); - AssertIntEQ(ECPoint_i2d(group, Gxy, NULL, NULL), 0); - AssertIntEQ(ECPoint_i2d(group, Gxy, NULL, &blen), 1); - AssertIntEQ(blen, sizeof(binUncompG)); - AssertNotNull(buf = (unsigned char*)XMALLOC(blen, NULL, DYNAMIC_TYPE_ECC)); + ExpectIntEQ(ECPoint_i2d(NULL, NULL, NULL, &blen), 0); + ExpectIntEQ(ECPoint_i2d(NULL, Gxy, NULL, &blen), 0); + ExpectIntEQ(ECPoint_i2d(group, NULL, NULL, &blen), 0); + ExpectIntEQ(ECPoint_i2d(group, Gxy, NULL, NULL), 0); + ExpectIntEQ(ECPoint_i2d(group, Gxy, NULL, &blen), 1); + ExpectIntEQ(blen, sizeof(binUncompG)); + ExpectNotNull(buf = (unsigned char*)XMALLOC(blen, NULL, DYNAMIC_TYPE_ECC)); blen -= 1; - AssertIntEQ(ECPoint_i2d(group, Gxy, buf, &blen), 0); + ExpectIntEQ(ECPoint_i2d(group, Gxy, buf, &blen), 0); blen += 1; - AssertIntEQ(ECPoint_i2d(group, Gxy, buf, &blen), 1); - AssertIntEQ(XMEMCMP(buf, binUncompG, sizeof(binUncompG)), 0); + ExpectIntEQ(ECPoint_i2d(group, Gxy, buf, &blen), 1); + ExpectIntEQ(XMEMCMP(buf, binUncompG, sizeof(binUncompG)), 0); XFREE(buf, NULL, DYNAMIC_TYPE_ECC); #ifdef HAVE_COMP_KEY /* Test point to oct compressed */ bin_len = EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_COMPRESSED, NULL, 0, ctx); - AssertIntEQ(bin_len, sizeof(binCompG)); - AssertNotNull(buf = (unsigned char*)XMALLOC(bin_len, NULL, + ExpectIntEQ(bin_len, sizeof(binCompG)); + ExpectNotNull(buf = (unsigned char*)XMALLOC(bin_len, NULL, DYNAMIC_TYPE_ECC)); - AssertIntEQ(EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_COMPRESSED, buf, + ExpectIntEQ(EC_POINT_point2oct(group, Gxy, POINT_CONVERSION_COMPRESSED, buf, bin_len, ctx), bin_len); - AssertIntEQ(XMEMCMP(buf, binCompG, sizeof(binCompG)), 0); + ExpectIntEQ(XMEMCMP(buf, binCompG, sizeof(binCompG)), 0); XFREE(buf, NULL, DYNAMIC_TYPE_ECC); #endif /* Test point BN */ - AssertNull(wolfSSL_EC_POINT_point2bn(NULL, NULL, + ExpectNull(wolfSSL_EC_POINT_point2bn(NULL, NULL, POINT_CONVERSION_UNCOMPRESSED, NULL, ctx)); - AssertNull(wolfSSL_EC_POINT_point2bn(NULL, Gxy, + ExpectNull(wolfSSL_EC_POINT_point2bn(NULL, Gxy, POINT_CONVERSION_UNCOMPRESSED, NULL, ctx)); - AssertNull(wolfSSL_EC_POINT_point2bn(group, NULL, + ExpectNull(wolfSSL_EC_POINT_point2bn(group, NULL, POINT_CONVERSION_UNCOMPRESSED, NULL, ctx)); - AssertNull(wolfSSL_EC_POINT_point2bn(group, Gxy, 0, NULL, ctx)); + ExpectNull(wolfSSL_EC_POINT_point2bn(group, Gxy, 0, NULL, ctx)); /* Test oct to point */ - AssertNotNull(tmp = EC_POINT_new(group)); - AssertIntEQ(EC_POINT_oct2point(NULL, NULL, binUncompG, sizeof(binUncompG), + ExpectNotNull(tmp = EC_POINT_new(group)); + ExpectIntEQ(EC_POINT_oct2point(NULL, NULL, binUncompG, sizeof(binUncompG), ctx), 0); - AssertIntEQ(EC_POINT_oct2point(NULL, tmp, binUncompG, sizeof(binUncompG), + ExpectIntEQ(EC_POINT_oct2point(NULL, tmp, binUncompG, sizeof(binUncompG), ctx), 0); - AssertIntEQ(EC_POINT_oct2point(group, NULL, binUncompG, sizeof(binUncompG), + ExpectIntEQ(EC_POINT_oct2point(group, NULL, binUncompG, sizeof(binUncompG), ctx), 0); - AssertIntEQ(EC_POINT_oct2point(group, tmp, binUncompGBad, + ExpectIntEQ(EC_POINT_oct2point(group, tmp, binUncompGBad, sizeof(binUncompGBad), ctx), 0); - AssertIntEQ(EC_POINT_oct2point(group, tmp, binUncompG, sizeof(binUncompG), + ExpectIntEQ(EC_POINT_oct2point(group, tmp, binUncompG, sizeof(binUncompG), ctx), 1); - AssertIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); + ExpectIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); EC_POINT_free(tmp); + tmp = NULL; /* Test setting BN ordinates. */ - AssertNotNull(tmp = EC_POINT_new(group)); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, NULL, NULL, + ExpectNotNull(tmp = EC_POINT_new(group)); + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, NULL, NULL, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, NULL, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, NULL, NULL, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, tmp, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, tmp, NULL, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, NULL, Gx, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, NULL, Gx, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, NULL, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, NULL, NULL, Gy, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, tmp, Gx, Gy, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(NULL, tmp, Gx, Gy, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, NULL, Gx, Gy, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, NULL, Gx, Gy, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, tmp, NULL, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, tmp, NULL, Gy, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, tmp, Gx, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, tmp, Gx, NULL, ctx), 0); - AssertIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, tmp, Gx, Gy, + ExpectIntEQ(wolfSSL_EC_POINT_set_affine_coordinates_GFp(group, tmp, Gx, Gy, ctx), 1); EC_POINT_free(tmp); + tmp = NULL; /* Test point d2i */ - AssertNotNull(tmp = EC_POINT_new(group)); - AssertIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), NULL, NULL), 0); - AssertIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), NULL, NULL), 0); - AssertIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), group, NULL), 0); - AssertIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), NULL, tmp), 0); - AssertIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), group, tmp), 0); - AssertIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), NULL, tmp), 0); - AssertIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), group, NULL), 0); - AssertIntEQ(ECPoint_d2i(binUncompGBad, sizeof(binUncompG), group, tmp), 0); - AssertIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), group, tmp), 1); - AssertIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); + ExpectNotNull(tmp = EC_POINT_new(group)); + ExpectIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), NULL, NULL), 0); + ExpectIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), NULL, NULL), 0); + ExpectIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), group, NULL), 0); + ExpectIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), NULL, tmp), 0); + ExpectIntEQ(ECPoint_d2i(NULL, sizeof(binUncompG), group, tmp), 0); + ExpectIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), NULL, tmp), 0); + ExpectIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), group, NULL), 0); + ExpectIntEQ(ECPoint_d2i(binUncompGBad, sizeof(binUncompG), group, tmp), 0); + ExpectIntEQ(ECPoint_d2i(binUncompG, sizeof(binUncompG), group, tmp), 1); + ExpectIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); EC_POINT_free(tmp); + tmp = NULL; #ifdef HAVE_COMP_KEY /* Test oct compressed to point */ - AssertNotNull(tmp = EC_POINT_new(group)); - AssertIntEQ(EC_POINT_oct2point(group, tmp, binCompG, sizeof(binCompG), ctx), + ExpectNotNull(tmp = EC_POINT_new(group)); + ExpectIntEQ(EC_POINT_oct2point(group, tmp, binCompG, sizeof(binCompG), ctx), 1); - AssertIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); + ExpectIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); EC_POINT_free(tmp); + tmp = NULL; /* Test point d2i - compressed */ - AssertNotNull(tmp = EC_POINT_new(group)); - AssertIntEQ(ECPoint_d2i(binCompG, sizeof(binCompG), group, tmp), 1); - AssertIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); + ExpectNotNull(tmp = EC_POINT_new(group)); + ExpectIntEQ(ECPoint_d2i(binCompG, sizeof(binCompG), group, tmp), 1); + ExpectIntEQ(EC_POINT_cmp(group, tmp, Gxy, ctx), 0); EC_POINT_free(tmp); + tmp = NULL; #endif #endif /* test BN_mod_add */ - AssertIntEQ(BN_mod_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), + ExpectIntEQ(BN_mod_add(new_point->Z, (WOLFSSL_BIGNUM*)BN_value_one(), (WOLFSSL_BIGNUM*)BN_value_one(), (WOLFSSL_BIGNUM*)BN_value_one(), NULL), 1); - AssertIntEQ(BN_is_zero(new_point->Z), 1); + ExpectIntEQ(BN_is_zero(new_point->Z), 1); /* cleanup */ BN_free(X); @@ -60530,52 +72532,176 @@ #endif EC_GROUP_free(group); BN_CTX_free(ctx); - - res = TEST_RES_CHECK(1); #endif #endif /* !WOLFSSL_SP_MATH && ( !HAVE_FIPS || HAVE_FIPS_VERSION > 2) */ - return res; + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SPAKE(void) +{ + EXPECT_DECLS; + +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && !defined(WOLFSSL_ATECC508A) \ + && !defined(WOLFSSL_ATECC608A) && !defined(HAVE_SELFTEST) && \ + !defined(WOLFSSL_SP_MATH) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) + BIGNUM* x = NULL; /* kdc priv */ + BIGNUM* y = NULL; /* client priv */ + BIGNUM* w = NULL; /* shared value */ + byte M_bytes[] = { + /* uncompressed */ + 0x04, + /* x */ + 0x88, 0x6e, 0x2f, 0x97, 0xac, 0xe4, 0x6e, 0x55, 0xba, 0x9d, 0xd7, 0x24, + 0x25, 0x79, 0xf2, 0x99, 0x3b, 0x64, 0xe1, 0x6e, 0xf3, 0xdc, 0xab, 0x95, + 0xaf, 0xd4, 0x97, 0x33, 0x3d, 0x8f, 0xa1, 0x2f, + /* y */ + 0x5f, 0xf3, 0x55, 0x16, 0x3e, 0x43, 0xce, 0x22, 0x4e, 0x0b, 0x0e, 0x65, + 0xff, 0x02, 0xac, 0x8e, 0x5c, 0x7b, 0xe0, 0x94, 0x19, 0xc7, 0x85, 0xe0, + 0xca, 0x54, 0x7d, 0x55, 0xa1, 0x2e, 0x2d, 0x20 + }; + EC_POINT* M = NULL; /* shared value */ + byte N_bytes[] = { + /* uncompressed */ + 0x04, + /* x */ + 0xd8, 0xbb, 0xd6, 0xc6, 0x39, 0xc6, 0x29, 0x37, 0xb0, 0x4d, 0x99, 0x7f, + 0x38, 0xc3, 0x77, 0x07, 0x19, 0xc6, 0x29, 0xd7, 0x01, 0x4d, 0x49, 0xa2, + 0x4b, 0x4f, 0x98, 0xba, 0xa1, 0x29, 0x2b, 0x49, + /* y */ + 0x07, 0xd6, 0x0a, 0xa6, 0xbf, 0xad, 0xe4, 0x50, 0x08, 0xa6, 0x36, 0x33, + 0x7f, 0x51, 0x68, 0xc6, 0x4d, 0x9b, 0xd3, 0x60, 0x34, 0x80, 0x8c, 0xd5, + 0x64, 0x49, 0x0b, 0x1e, 0x65, 0x6e, 0xdb, 0xe7 + }; + EC_POINT* N = NULL; /* shared value */ + EC_POINT* T = NULL; /* kdc pub */ + EC_POINT* tmp1 = NULL; /* kdc pub */ + EC_POINT* tmp2 = NULL; /* kdc pub */ + EC_POINT* S = NULL; /* client pub */ + EC_POINT* client_secret = NULL; + EC_POINT* kdc_secret = NULL; + EC_GROUP* group = NULL; + BN_CTX* bn_ctx = NULL; + + /* Values taken from a test run of Kerberos 5 */ + + ExpectNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(bn_ctx = BN_CTX_new()); + + ExpectNotNull(M = EC_POINT_new(group)); + ExpectNotNull(N = EC_POINT_new(group)); + ExpectNotNull(T = EC_POINT_new(group)); + ExpectNotNull(tmp1 = EC_POINT_new(group)); + ExpectNotNull(tmp2 = EC_POINT_new(group)); + ExpectNotNull(S = EC_POINT_new(group)); + ExpectNotNull(client_secret = EC_POINT_new(group)); + ExpectNotNull(kdc_secret = EC_POINT_new(group)); + ExpectIntEQ(BN_hex2bn(&x, "DAC3027CD692B4BDF0EDFE9B7D0E4E7" + "E5D8768A725EAEEA6FC68EC239A17C0"), 1); + ExpectIntEQ(BN_hex2bn(&y, "6F6A1D394E26B1655A54B26DCE30D49" + "90CC47EBE08F809EF3FF7F6AEAABBB5"), 1); + ExpectIntEQ(BN_hex2bn(&w, "1D992AB8BA851B9BA05353453D81EE9" + "506AB395478F0AAB647752CF117B36250"), 1); + ExpectIntEQ(EC_POINT_oct2point(group, M, M_bytes, sizeof(M_bytes), bn_ctx), + 1); + ExpectIntEQ(EC_POINT_oct2point(group, N, N_bytes, sizeof(N_bytes), bn_ctx), + 1); + + /* Function pattern similar to ossl_keygen and ossl_result in krb5 */ + + /* kdc */ + /* T=x*P+w*M */ + /* All in one function call */ + ExpectIntEQ(EC_POINT_mul(group, T, x, M, w, bn_ctx), 1); + /* Spread into separate calls */ + ExpectIntEQ(EC_POINT_mul(group, tmp1, x, NULL, NULL, bn_ctx), 1); + ExpectIntEQ(EC_POINT_mul(group, tmp2, NULL, M, w, bn_ctx), 1); + ExpectIntEQ(EC_POINT_add(group, tmp1, tmp1, tmp2, bn_ctx), + 1); + ExpectIntEQ(EC_POINT_cmp(group, T, tmp1, bn_ctx), 0); + /* client */ + /* S=y*P+w*N */ + /* All in one function call */ + ExpectIntEQ(EC_POINT_mul(group, S, y, N, w, bn_ctx), 1); + /* Spread into separate calls */ + ExpectIntEQ(EC_POINT_mul(group, tmp1, y, NULL, NULL, bn_ctx), 1); + ExpectIntEQ(EC_POINT_mul(group, tmp2, NULL, N, w, bn_ctx), 1); + ExpectIntEQ(EC_POINT_add(group, tmp1, tmp1, tmp2, bn_ctx), + 1); + ExpectIntEQ(EC_POINT_cmp(group, S, tmp1, bn_ctx), 0); + /* K=y*(T-w*M) */ + ExpectIntEQ(EC_POINT_mul(group, client_secret, NULL, M, w, bn_ctx), 1); + ExpectIntEQ(EC_POINT_invert(group, client_secret, bn_ctx), 1); + ExpectIntEQ(EC_POINT_add(group, client_secret, T, client_secret, bn_ctx), + 1); + ExpectIntEQ(EC_POINT_mul(group, client_secret, NULL, client_secret, y, + bn_ctx), 1); + /* kdc */ + /* K=x*(S-w*N) */ + ExpectIntEQ(EC_POINT_mul(group, kdc_secret, NULL, N, w, bn_ctx), 1); + ExpectIntEQ(EC_POINT_invert(group, kdc_secret, bn_ctx), 1); + ExpectIntEQ(EC_POINT_add(group, kdc_secret, S, kdc_secret, bn_ctx), + 1); + ExpectIntEQ(EC_POINT_mul(group, kdc_secret, NULL, kdc_secret, x, bn_ctx), + 1); + + /* kdc_secret == client_secret */ + ExpectIntEQ(EC_POINT_cmp(group, client_secret, kdc_secret, bn_ctx), 0); + + BN_free(x); + BN_free(y); + BN_free(w); + EC_POINT_free(M); + EC_POINT_free(N); + EC_POINT_free(T); + EC_POINT_free(tmp1); + EC_POINT_free(tmp2); + EC_POINT_free(S); + EC_POINT_free(client_secret); + EC_POINT_free(kdc_secret); + EC_GROUP_free(group); + BN_CTX_free(bn_ctx); +#endif + return EXPECT_RESULT(); } static int test_wolfSSL_EC_KEY_generate(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_EXTRA - WOLFSSL_EC_KEY* key; + WOLFSSL_EC_KEY* key = NULL; #ifndef HAVE_ECC_BRAINPOOL - WOLFSSL_EC_GROUP* group; + WOLFSSL_EC_GROUP* group = NULL; #endif - AssertNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(NULL), 0); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(key), 1); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(NULL), 0); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(key), 1); wolfSSL_EC_KEY_free(key); + key = NULL; #ifndef HAVE_ECC_BRAINPOOL - AssertNotNull(group = wolfSSL_EC_GROUP_new_by_curve_name( + ExpectNotNull(group = wolfSSL_EC_GROUP_new_by_curve_name( NID_brainpoolP256r1)); - AssertNotNull(key = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EC_KEY_set_group(key, group), 1); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(key), 0); + ExpectNotNull(key = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EC_KEY_set_group(key, group), 1); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(key), 0); wolfSSL_EC_KEY_free(key); wolfSSL_EC_GROUP_free(group); #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_EC_i2d(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(HAVE_FIPS) - EC_KEY *key; + EC_KEY *key = NULL; EC_KEY *copy = NULL; - int len; + int len = 0; unsigned char *buf = NULL; - unsigned char *p; + unsigned char *p = NULL; const unsigned char *tmp = NULL; const unsigned char octBad[] = { 0x09, 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, 0xf8, 0xbc, @@ -60586,362 +72712,374 @@ 0x5e, 0xce, 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5, }; - AssertNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertIntEQ(EC_KEY_generate_key(key), 1); - AssertIntGT((len = i2d_EC_PUBKEY(key, NULL)), 0); - AssertNotNull(buf = (unsigned char*)XMALLOC(len, NULL, + ExpectNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectIntEQ(EC_KEY_generate_key(key), 1); + ExpectIntGT((len = i2d_EC_PUBKEY(key, NULL)), 0); + ExpectNotNull(buf = (unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER)); p = buf; - AssertIntEQ(i2d_EC_PUBKEY(key, &p), len); + ExpectIntEQ(i2d_EC_PUBKEY(key, &p), len); - AssertNull(o2i_ECPublicKey(NULL, NULL, -1)); - AssertNull(o2i_ECPublicKey(©, NULL, -1)); - AssertNull(o2i_ECPublicKey(&key, NULL, -1)); - AssertNull(o2i_ECPublicKey(NULL, &tmp, -1)); - AssertNull(o2i_ECPublicKey(NULL, NULL, 0)); - AssertNull(o2i_ECPublicKey(&key, NULL, 0)); - AssertNull(o2i_ECPublicKey(&key, &tmp, 0)); + ExpectNull(o2i_ECPublicKey(NULL, NULL, -1)); + ExpectNull(o2i_ECPublicKey(©, NULL, -1)); + ExpectNull(o2i_ECPublicKey(&key, NULL, -1)); + ExpectNull(o2i_ECPublicKey(NULL, &tmp, -1)); + ExpectNull(o2i_ECPublicKey(NULL, NULL, 0)); + ExpectNull(o2i_ECPublicKey(&key, NULL, 0)); + ExpectNull(o2i_ECPublicKey(&key, &tmp, 0)); tmp = buf; - AssertNull(o2i_ECPublicKey(NULL, &tmp, 0)); - AssertNull(o2i_ECPublicKey(©, &tmp, 0)); - AssertNull(o2i_ECPublicKey(NULL, &tmp, -1)); - AssertNull(o2i_ECPublicKey(&key, &tmp, -1)); + ExpectNull(o2i_ECPublicKey(NULL, &tmp, 0)); + ExpectNull(o2i_ECPublicKey(©, &tmp, 0)); + ExpectNull(o2i_ECPublicKey(NULL, &tmp, -1)); + ExpectNull(o2i_ECPublicKey(&key, &tmp, -1)); - AssertIntEQ(i2o_ECPublicKey(NULL, NULL), 0); - AssertIntEQ(i2o_ECPublicKey(NULL, &buf), 0); + ExpectIntEQ(i2o_ECPublicKey(NULL, NULL), 0); + ExpectIntEQ(i2o_ECPublicKey(NULL, &buf), 0); tmp = buf; - AssertNull(d2i_ECPrivateKey(NULL, &tmp, 0)); - AssertNull(d2i_ECPrivateKey(NULL, &tmp, 1)); - AssertNull(d2i_ECPrivateKey(©, &tmp, 0)); - AssertNull(d2i_ECPrivateKey(©, &tmp, 1)); - AssertNull(d2i_ECPrivateKey(&key, &tmp, 0)); - - AssertIntEQ(i2d_ECPrivateKey(NULL, &p), 0); - AssertIntEQ(i2d_ECPrivateKey(NULL, NULL), 0); - - AssertIntEQ(wolfSSL_EC_KEY_LoadDer(NULL, NULL, -1), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, NULL, -1, 0), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, NULL, -1, 0), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, buf, -1, 0), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, NULL, 0, 0), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, NULL, -1, + ExpectNull(d2i_ECPrivateKey(NULL, &tmp, 0)); + ExpectNull(d2i_ECPrivateKey(NULL, &tmp, 1)); + ExpectNull(d2i_ECPrivateKey(©, &tmp, 0)); + ExpectNull(d2i_ECPrivateKey(©, &tmp, 1)); + ExpectNull(d2i_ECPrivateKey(&key, &tmp, 0)); + + ExpectIntEQ(i2d_ECPrivateKey(NULL, &p), 0); + ExpectIntEQ(i2d_ECPrivateKey(NULL, NULL), 0); + + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer(NULL, NULL, -1), -1); + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, NULL, -1, 0), -1); + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, NULL, -1, 0), -1); + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, buf, -1, 0), -1); + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, NULL, 0, 0), -1); + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, NULL, -1, WOLFSSL_EC_KEY_LOAD_PUBLIC), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, buf, len, + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(NULL, buf, len, WOLFSSL_EC_KEY_LOAD_PUBLIC), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, NULL, len, + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, NULL, len, WOLFSSL_EC_KEY_LOAD_PUBLIC), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, buf, -1, + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, buf, -1, WOLFSSL_EC_KEY_LOAD_PUBLIC), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, buf, len, 0), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, buf, len, + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, buf, len, 0), -1); + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, buf, len, WOLFSSL_EC_KEY_LOAD_PRIVATE), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, octBad, sizeof(octBad), + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, octBad, sizeof(octBad), WOLFSSL_EC_KEY_LOAD_PRIVATE), -1); - AssertIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, octBad, sizeof(octBad), + ExpectIntEQ(wolfSSL_EC_KEY_LoadDer_ex(key, octBad, sizeof(octBad), WOLFSSL_EC_KEY_LOAD_PUBLIC), -1); XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); buf = NULL; + buf = NULL; - AssertIntGT((len = i2d_ECPrivateKey(key, NULL)), 0); - AssertNotNull(buf = (unsigned char*)XMALLOC(len, NULL, + ExpectIntGT((len = i2d_ECPrivateKey(key, NULL)), 0); + ExpectNotNull(buf = (unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER)); p = buf; - AssertIntEQ(i2d_ECPrivateKey(key, &p), len); + ExpectIntEQ(i2d_ECPrivateKey(key, &p), len); p = NULL; - AssertIntEQ(i2d_ECPrivateKey(key, &p), len); + ExpectIntEQ(i2d_ECPrivateKey(key, &p), len); XFREE(p, NULL, DYNAMIC_TYPE_TMP_BUFFER); + p = NULL; /* Bad point is also an invalid private key. */ tmp = octBad; - AssertNull(d2i_ECPrivateKey(©, &tmp, sizeof(octBad))); + ExpectNull(d2i_ECPrivateKey(©, &tmp, sizeof(octBad))); tmp = buf; - AssertNotNull(d2i_ECPrivateKey(©, &tmp, len)); + ExpectNotNull(d2i_ECPrivateKey(©, &tmp, len)); XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER); buf = NULL; + buf = NULL; - AssertIntGT((len = i2o_ECPublicKey(key, NULL)), 0); - AssertNotNull(buf = (unsigned char*)XMALLOC(len, NULL, + ExpectIntGT((len = i2o_ECPublicKey(key, NULL)), 0); + ExpectNotNull(buf = (unsigned char*)XMALLOC(len, NULL, DYNAMIC_TYPE_TMP_BUFFER)); p = buf; - AssertIntGT((len = i2o_ECPublicKey(key, &p)), 0); + ExpectIntGT((len = i2o_ECPublicKey(key, &p)), 0); p = NULL; - AssertIntGT((len = i2o_ECPublicKey(key, &p)), 0); + ExpectIntGT((len = i2o_ECPublicKey(key, &p)), 0); tmp = buf; - AssertNotNull(o2i_ECPublicKey(©, &tmp, len)); + ExpectNotNull(o2i_ECPublicKey(©, &tmp, len)); tmp = octBad; - AssertNull(o2i_ECPublicKey(&key, &tmp, sizeof(octBad))); + ExpectNull(o2i_ECPublicKey(&key, &tmp, sizeof(octBad))); - AssertIntEQ(EC_KEY_check_key(NULL), 0); - AssertIntEQ(EC_KEY_check_key(key), 1); + ExpectIntEQ(EC_KEY_check_key(NULL), 0); + ExpectIntEQ(EC_KEY_check_key(key), 1); XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL); XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL); EC_KEY_free(key); EC_KEY_free(copy); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_curve(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) int nid = NID_secp160k1; - const char* nid_name; - - AssertNull(EC_curve_nid2nist(NID_sha256)); + const char* nid_name = NULL; - AssertNotNull(nid_name = EC_curve_nid2nist(nid)); - AssertIntEQ(XMEMCMP(nid_name, "K-160", XSTRLEN("K-160")), 0); + ExpectNull(EC_curve_nid2nist(NID_sha256)); - AssertIntEQ(EC_curve_nist2nid("INVALID"), 0); - AssertIntEQ(EC_curve_nist2nid(nid_name), nid); + ExpectNotNull(nid_name = EC_curve_nid2nist(nid)); + ExpectIntEQ(XMEMCMP(nid_name, "K-160", XSTRLEN("K-160")), 0); - res = TEST_RES_CHECK(1); + ExpectIntEQ(EC_curve_nist2nid("INVALID"), 0); + ExpectIntEQ(EC_curve_nist2nid(nid_name), nid); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_KEY_dup(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) - WOLFSSL_EC_KEY* ecKey; - WOLFSSL_EC_KEY* dupKey; - ecc_key* srcKey; - ecc_key* destKey; + WOLFSSL_EC_KEY* ecKey = NULL; + WOLFSSL_EC_KEY* dupKey = NULL; + ecc_key* srcKey = NULL; + ecc_key* destKey = NULL; - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); /* Valid cases */ - AssertNotNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); - AssertIntEQ(EC_KEY_check_key(dupKey), 1); + ExpectNotNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); + ExpectIntEQ(EC_KEY_check_key(dupKey), 1); /* Compare pubkey */ - srcKey = (ecc_key*)ecKey->internal; - destKey = (ecc_key*)dupKey->internal; - AssertIntEQ(wc_ecc_cmp_point(&srcKey->pubkey, &destKey->pubkey), 0); + if (ecKey != NULL) { + srcKey = (ecc_key*)ecKey->internal; + } + if (dupKey != NULL) { + destKey = (ecc_key*)dupKey->internal; + } + ExpectIntEQ(wc_ecc_cmp_point(&srcKey->pubkey, &destKey->pubkey), 0); /* compare EC_GROUP */ - AssertIntEQ(wolfSSL_EC_GROUP_cmp(ecKey->group, dupKey->group, NULL), MP_EQ); + ExpectIntEQ(wolfSSL_EC_GROUP_cmp(ecKey->group, dupKey->group, NULL), MP_EQ); /* compare EC_POINT */ - AssertIntEQ(wolfSSL_EC_POINT_cmp(ecKey->group, ecKey->pub_key, \ + ExpectIntEQ(wolfSSL_EC_POINT_cmp(ecKey->group, ecKey->pub_key, \ dupKey->pub_key, NULL), MP_EQ); /* compare BIGNUM */ - AssertIntEQ(wolfSSL_BN_cmp(ecKey->priv_key, dupKey->priv_key), MP_EQ); + ExpectIntEQ(wolfSSL_BN_cmp(ecKey->priv_key, dupKey->priv_key), MP_EQ); wolfSSL_EC_KEY_free(dupKey); + dupKey = NULL; /* Invalid cases */ /* NULL key */ - AssertNull(dupKey = wolfSSL_EC_KEY_dup(NULL)); + ExpectNull(dupKey = wolfSSL_EC_KEY_dup(NULL)); /* NULL ecc_key */ - wc_ecc_free((ecc_key*)ecKey->internal); - XFREE(ecKey->internal, NULL, DYNAMIC_TYPE_ECC); - ecKey->internal = NULL; /* Set ecc_key to NULL */ - AssertNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); + if (ecKey != NULL) { + wc_ecc_free((ecc_key*)ecKey->internal); + XFREE(ecKey->internal, NULL, DYNAMIC_TYPE_ECC); + ecKey->internal = NULL; /* Set ecc_key to NULL */ + } + ExpectNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); wolfSSL_EC_KEY_free(ecKey); + ecKey = NULL; wolfSSL_EC_KEY_free(dupKey); + dupKey = NULL; /* NULL Group */ - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); - wolfSSL_EC_GROUP_free(ecKey->group); - ecKey->group = NULL; /* Set group to NULL */ - AssertNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); + if (ecKey != NULL) { + wolfSSL_EC_GROUP_free(ecKey->group); + ecKey->group = NULL; /* Set group to NULL */ + } + ExpectNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); wolfSSL_EC_KEY_free(ecKey); + ecKey = NULL; wolfSSL_EC_KEY_free(dupKey); + dupKey = NULL; /* NULL public key */ - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); - wc_ecc_del_point((ecc_point*)ecKey->pub_key->internal); - ecKey->pub_key->internal = NULL; /* Set ecc_point to NULL */ - AssertNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); - - wolfSSL_EC_POINT_free(ecKey->pub_key); - ecKey->pub_key = NULL; /* Set pub_key to NULL */ - AssertNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); + if (ecKey != NULL) { + wc_ecc_del_point((ecc_point*)ecKey->pub_key->internal); + ecKey->pub_key->internal = NULL; /* Set ecc_point to NULL */ + } + + ExpectNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); + if (ecKey != NULL) { + wolfSSL_EC_POINT_free(ecKey->pub_key); + ecKey->pub_key = NULL; /* Set pub_key to NULL */ + } + ExpectNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); wolfSSL_EC_KEY_free(ecKey); + ecKey = NULL; wolfSSL_EC_KEY_free(dupKey); + dupKey = NULL; /* NULL private key */ - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), 1); - wolfSSL_BN_free(ecKey->priv_key); - ecKey->priv_key = NULL; /* Set priv_key to NULL */ - AssertNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); + if (ecKey != NULL) { + wolfSSL_BN_free(ecKey->priv_key); + ecKey->priv_key = NULL; /* Set priv_key to NULL */ + } + ExpectNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); wolfSSL_EC_KEY_free(ecKey); + ecKey = NULL; wolfSSL_EC_KEY_free(dupKey); + dupKey = NULL; /* Test EC_KEY_up_ref */ - AssertNotNull(ecKey = wolfSSL_EC_KEY_new()); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EC_KEY_up_ref(NULL), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EC_KEY_up_ref(ecKey), WOLFSSL_SUCCESS); + ExpectNotNull(ecKey = wolfSSL_EC_KEY_new()); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(ecKey), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EC_KEY_up_ref(NULL), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EC_KEY_up_ref(ecKey), WOLFSSL_SUCCESS); /* reference count doesn't follow duplicate */ - AssertNotNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); - AssertIntEQ(wolfSSL_EC_KEY_up_ref(dupKey), WOLFSSL_SUCCESS); /* +1 */ - AssertIntEQ(wolfSSL_EC_KEY_up_ref(dupKey), WOLFSSL_SUCCESS); /* +2 */ + ExpectNotNull(dupKey = wolfSSL_EC_KEY_dup(ecKey)); + ExpectIntEQ(wolfSSL_EC_KEY_up_ref(dupKey), WOLFSSL_SUCCESS); /* +1 */ + ExpectIntEQ(wolfSSL_EC_KEY_up_ref(dupKey), WOLFSSL_SUCCESS); /* +2 */ wolfSSL_EC_KEY_free(dupKey); /* 3 */ wolfSSL_EC_KEY_free(dupKey); /* 2 */ wolfSSL_EC_KEY_free(dupKey); /* 1, free */ wolfSSL_EC_KEY_free(ecKey); /* 2 */ wolfSSL_EC_KEY_free(ecKey); /* 1, free */ - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_KEY_set_group(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && !defined(NO_ECC256) && !defined(NO_ECC_SECP) && \ defined(OPENSSL_EXTRA) EC_KEY *key = NULL; EC_GROUP *group = NULL; const EC_GROUP *group2 = NULL; - AssertNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); - AssertNotNull(key = EC_KEY_new()); + ExpectNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(key = EC_KEY_new()); - AssertNull(EC_KEY_get0_group(NULL)); - AssertIntEQ(EC_KEY_set_group(NULL, NULL), 0); - AssertIntEQ(EC_KEY_set_group(key, NULL), 0); - AssertIntEQ(EC_KEY_set_group(NULL, group), 0); - - AssertIntEQ(EC_KEY_set_group(key, group), WOLFSSL_SUCCESS); - AssertNotNull(group2 = EC_KEY_get0_group(key)); - AssertIntEQ(EC_GROUP_cmp(group2, group, NULL), 0); + ExpectNull(EC_KEY_get0_group(NULL)); + ExpectIntEQ(EC_KEY_set_group(NULL, NULL), 0); + ExpectIntEQ(EC_KEY_set_group(key, NULL), 0); + ExpectIntEQ(EC_KEY_set_group(NULL, group), 0); + + ExpectIntEQ(EC_KEY_set_group(key, group), WOLFSSL_SUCCESS); + ExpectNotNull(group2 = EC_KEY_get0_group(key)); + ExpectIntEQ(EC_GROUP_cmp(group2, group, NULL), 0); EC_GROUP_free(group); EC_KEY_free(key); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_KEY_set_conv_form(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && defined(OPENSSL_EXTRA) && !defined(NO_BIO) - BIO* bio; - EC_KEY* key; + BIO* bio = NULL; + EC_KEY* key = NULL; /* Error condition: NULL key. */ - AssertIntLT(EC_KEY_get_conv_form(NULL), 0); + ExpectIntLT(EC_KEY_get_conv_form(NULL), 0); - AssertNotNull(bio = BIO_new_file("./certs/ecc-keyPub.pem", "rb")); - AssertNotNull(key = PEM_read_bio_EC_PUBKEY(bio, NULL, NULL, NULL)); + ExpectNotNull(bio = BIO_new_file("./certs/ecc-keyPub.pem", "rb")); + ExpectNotNull(key = PEM_read_bio_EC_PUBKEY(bio, NULL, NULL, NULL)); /* Conversion form defaults to uncompressed. */ - AssertIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_UNCOMPRESSED); + ExpectIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_UNCOMPRESSED); #ifdef HAVE_COMP_KEY /* Explicitly set to compressed. */ EC_KEY_set_conv_form(key, POINT_CONVERSION_COMPRESSED); - AssertIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_COMPRESSED); + ExpectIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_COMPRESSED); #else /* Will still work just won't change anything. */ EC_KEY_set_conv_form(key, POINT_CONVERSION_COMPRESSED); - AssertIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_UNCOMPRESSED); + ExpectIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_UNCOMPRESSED); EC_KEY_set_conv_form(key, POINT_CONVERSION_UNCOMPRESSED); - AssertIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_UNCOMPRESSED); + ExpectIntEQ(EC_KEY_get_conv_form(key), POINT_CONVERSION_UNCOMPRESSED); #endif EC_KEY_set_conv_form(NULL, POINT_CONVERSION_UNCOMPRESSED); BIO_free(bio); EC_KEY_free(key); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_KEY_private_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_BIO) - WOLFSSL_EC_KEY* key; + WOLFSSL_EC_KEY* key = NULL; WOLFSSL_BIGNUM* priv = NULL; WOLFSSL_BIGNUM* priv2 = NULL; WOLFSSL_BIGNUM* bn; - AssertNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertNotNull(priv = wolfSSL_BN_new()); - AssertNotNull(priv2 = wolfSSL_BN_new()); - AssertIntNE(BN_set_word(priv, 2), 0); - AssertIntNE(BN_set_word(priv2, 2), 0); + ExpectNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(priv = wolfSSL_BN_new()); + ExpectNotNull(priv2 = wolfSSL_BN_new()); + ExpectIntNE(BN_set_word(priv, 2), 0); + ExpectIntNE(BN_set_word(priv2, 2), 0); - AssertNull(wolfSSL_EC_KEY_get0_private_key(NULL)); + ExpectNull(wolfSSL_EC_KEY_get0_private_key(NULL)); /* No private key set. */ - AssertNull(wolfSSL_EC_KEY_get0_private_key(key)); + ExpectNull(wolfSSL_EC_KEY_get0_private_key(key)); - AssertIntEQ(wolfSSL_EC_KEY_set_private_key(NULL, NULL), 0); - AssertIntEQ(wolfSSL_EC_KEY_set_private_key(key, NULL), 0); - AssertIntEQ(wolfSSL_EC_KEY_set_private_key(NULL, priv), 0); - - AssertIntEQ(wolfSSL_EC_KEY_set_private_key(key, priv), 1); - AssertNotNull(bn = wolfSSL_EC_KEY_get0_private_key(key)); - AssertPtrNE(bn, priv); - AssertIntEQ(wolfSSL_EC_KEY_set_private_key(key, priv2), 1); - AssertNotNull(bn = wolfSSL_EC_KEY_get0_private_key(key)); - AssertPtrNE(bn, priv2); + ExpectIntEQ(wolfSSL_EC_KEY_set_private_key(NULL, NULL), 0); + ExpectIntEQ(wolfSSL_EC_KEY_set_private_key(key, NULL), 0); + ExpectIntEQ(wolfSSL_EC_KEY_set_private_key(NULL, priv), 0); + + ExpectIntEQ(wolfSSL_EC_KEY_set_private_key(key, priv), 1); + ExpectNotNull(bn = wolfSSL_EC_KEY_get0_private_key(key)); + ExpectPtrNE(bn, priv); + ExpectIntEQ(wolfSSL_EC_KEY_set_private_key(key, priv2), 1); + ExpectNotNull(bn = wolfSSL_EC_KEY_get0_private_key(key)); + ExpectPtrNE(bn, priv2); wolfSSL_BN_free(priv2); wolfSSL_BN_free(priv); wolfSSL_EC_KEY_free(key); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_KEY_public_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_BIO) - WOLFSSL_EC_KEY* key; - WOLFSSL_EC_POINT* pub; - WOLFSSL_EC_POINT* point; + WOLFSSL_EC_KEY* key = NULL; + WOLFSSL_EC_POINT* pub = NULL; + WOLFSSL_EC_POINT* point = NULL; - AssertNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertNull(wolfSSL_EC_KEY_get0_public_key(NULL)); - AssertNotNull(wolfSSL_EC_KEY_get0_public_key(key)); + ExpectNull(wolfSSL_EC_KEY_get0_public_key(NULL)); + ExpectNotNull(wolfSSL_EC_KEY_get0_public_key(key)); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(key), 1); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(key), 1); - AssertNotNull(pub = wolfSSL_EC_KEY_get0_public_key(key)); + ExpectNotNull(pub = wolfSSL_EC_KEY_get0_public_key(key)); - AssertIntEQ(wolfSSL_EC_KEY_set_public_key(NULL, NULL), 0); - AssertIntEQ(wolfSSL_EC_KEY_set_public_key(key, NULL), 0); - AssertIntEQ(wolfSSL_EC_KEY_set_public_key(NULL, pub), 0); + ExpectIntEQ(wolfSSL_EC_KEY_set_public_key(NULL, NULL), 0); + ExpectIntEQ(wolfSSL_EC_KEY_set_public_key(key, NULL), 0); + ExpectIntEQ(wolfSSL_EC_KEY_set_public_key(NULL, pub), 0); - AssertIntEQ(wolfSSL_EC_KEY_set_public_key(key, pub), 1); - AssertNotNull(point = wolfSSL_EC_KEY_get0_public_key(key)); - AssertPtrEq(point, pub); + ExpectIntEQ(wolfSSL_EC_KEY_set_public_key(key, pub), 1); + ExpectNotNull(point = wolfSSL_EC_KEY_get0_public_key(key)); + ExpectPtrEq(point, pub); wolfSSL_EC_KEY_free(key); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_KEY_print_fp(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(HAVE_ECC) && ((defined(HAVE_ECC224) && defined(HAVE_ECC256)) || \ defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 && \ defined(OPENSSL_EXTRA) && defined(XFPRINTF) && !defined(NO_FILESYSTEM) && \ @@ -60949,75 +73087,71 @@ EC_KEY* key = NULL; /* Bad file pointer. */ - AssertIntEQ(wolfSSL_EC_KEY_print_fp(NULL, key, 0), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EC_KEY_print_fp(NULL, key, 0), WOLFSSL_FAILURE); /* NULL key. */ - AssertIntEQ(wolfSSL_EC_KEY_print_fp(stderr, NULL, 0), WOLFSSL_FAILURE); - AssertNotNull((key = wolfSSL_EC_KEY_new_by_curve_name(NID_secp224r1))); + ExpectIntEQ(wolfSSL_EC_KEY_print_fp(stderr, NULL, 0), WOLFSSL_FAILURE); + ExpectNotNull((key = wolfSSL_EC_KEY_new_by_curve_name(NID_secp224r1))); /* Negative indent. */ - AssertIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, -1), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, -1), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, 4), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(key), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, 4), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, 4), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(key), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, 4), WOLFSSL_SUCCESS); wolfSSL_EC_KEY_free(key); - AssertNotNull((key = wolfSSL_EC_KEY_new_by_curve_name( + ExpectNotNull((key = wolfSSL_EC_KEY_new_by_curve_name( NID_X9_62_prime256v1))); - AssertIntEQ(wolfSSL_EC_KEY_generate_key(key), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, 4), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EC_KEY_generate_key(key), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_EC_KEY_print_fp(stderr, key, 4), WOLFSSL_SUCCESS); wolfSSL_EC_KEY_free(key); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EC_get_builtin_curves(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) #if !defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION>2)) EC_builtin_curve* curves = NULL; size_t crv_len = 0; size_t i = 0; - AssertIntGT((crv_len = EC_get_builtin_curves(NULL, 0)), 0); - AssertNotNull(curves = (EC_builtin_curve*)XMALLOC( + ExpectIntGT((crv_len = EC_get_builtin_curves(NULL, 0)), 0); + ExpectNotNull(curves = (EC_builtin_curve*)XMALLOC( sizeof(EC_builtin_curve) * crv_len, NULL, DYNAMIC_TYPE_TMP_BUFFER)); - AssertIntEQ((EC_get_builtin_curves(curves, 0)), crv_len); - AssertIntEQ(EC_get_builtin_curves(curves, crv_len), crv_len); + ExpectIntEQ((EC_get_builtin_curves(curves, 0)), crv_len); + ExpectIntEQ(EC_get_builtin_curves(curves, crv_len), crv_len); - for (i = 0; i < crv_len; i++) { + for (i = 0; EXPECT_SUCCESS() && (i < crv_len); i++) { if (curves[i].comment != NULL) { - AssertStrEQ(OBJ_nid2sn(curves[i].nid), curves[i].comment); + ExpectStrEQ(OBJ_nid2sn(curves[i].nid), curves[i].comment); } } if (crv_len > 1) { - AssertIntEQ(EC_get_builtin_curves(curves, crv_len - 1), crv_len - 1); + ExpectIntEQ(EC_get_builtin_curves(curves, crv_len - 1), crv_len - 1); } XFREE(curves, NULL, DYNAMIC_TYPE_TMP_BUFFER); - - res = TEST_RES_CHECK(1); #endif /* !HAVE_FIPS || HAVE_FIPS_VERSION > 2 */ #endif /* OPENSSL_EXTRA || OPENSSL_ALL */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ECDSA_SIG(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef OPENSSL_EXTRA WOLFSSL_ECDSA_SIG* sig = NULL; WOLFSSL_ECDSA_SIG* sig2 = NULL; - WOLFSSL_BIGNUM* r; - WOLFSSL_BIGNUM* s; - const WOLFSSL_BIGNUM* r2; - const WOLFSSL_BIGNUM* s2; - const unsigned char* cp; - unsigned char* p; + WOLFSSL_BIGNUM* r = NULL; + WOLFSSL_BIGNUM* s = NULL; + const WOLFSSL_BIGNUM* r2 = NULL; + const WOLFSSL_BIGNUM* s2 = NULL; + const unsigned char* cp = NULL; + unsigned char* p = NULL; unsigned char outSig[8]; unsigned char sigData[8] = { 0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01 }; @@ -61026,76 +73160,89 @@ wolfSSL_ECDSA_SIG_free(NULL); - AssertNotNull(sig = wolfSSL_ECDSA_SIG_new()); - AssertNotNull(r = wolfSSL_BN_new()); - AssertNotNull(s = wolfSSL_BN_new()); - AssertIntEQ(wolfSSL_BN_set_word(r, 1), 1); - AssertIntEQ(wolfSSL_BN_set_word(s, 1), 1); + ExpectNotNull(sig = wolfSSL_ECDSA_SIG_new()); + ExpectNotNull(r = wolfSSL_BN_new()); + ExpectNotNull(s = wolfSSL_BN_new()); + ExpectIntEQ(wolfSSL_BN_set_word(r, 1), 1); + ExpectIntEQ(wolfSSL_BN_set_word(s, 1), 1); wolfSSL_ECDSA_SIG_get0(NULL, NULL, NULL); wolfSSL_ECDSA_SIG_get0(NULL, &r2, NULL); wolfSSL_ECDSA_SIG_get0(NULL, NULL, &s2); wolfSSL_ECDSA_SIG_get0(NULL, &r2, &s2); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, NULL, NULL), 0); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(sig, NULL, NULL), 0); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, r, NULL), 0); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, NULL, s), 0); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, r, s), 0); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(sig, NULL, s), 0); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(sig, r, NULL), 0); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(sig, NULL, NULL), 0); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, r, NULL), 0); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, NULL, s), 0); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(NULL, r, s), 0); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(sig, NULL, s), 0); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(sig, r, NULL), 0); r2 = NULL; s2 = NULL; wolfSSL_ECDSA_SIG_get0(NULL, &r2, &s2); - AssertNull(r2); - AssertNull(s2); - AssertIntEQ(wolfSSL_ECDSA_SIG_set0(sig, r, s), 1); + ExpectNull(r2); + ExpectNull(s2); + ExpectIntEQ(wolfSSL_ECDSA_SIG_set0(sig, r, s), 1); + if (EXPECT_FAIL()) { + wolfSSL_BN_free(r); + wolfSSL_BN_free(s); + } wolfSSL_ECDSA_SIG_get0(sig, &r2, &s2); - AssertPtrEq(r2, r); - AssertPtrEq(s2, s); + ExpectPtrEq(r2, r); + ExpectPtrEq(s2, s); r2 = NULL; wolfSSL_ECDSA_SIG_get0(sig, &r2, NULL); - AssertPtrEq(r2, r); + ExpectPtrEq(r2, r); s2 = NULL; wolfSSL_ECDSA_SIG_get0(sig, NULL, &s2); - AssertPtrEq(s2, s); + ExpectPtrEq(s2, s); /* r and s are freed when sig is freed. */ wolfSSL_ECDSA_SIG_free(sig); + sig = NULL; - AssertNull(wolfSSL_d2i_ECDSA_SIG(NULL, NULL, sizeof(sigData))); + ExpectNull(wolfSSL_d2i_ECDSA_SIG(NULL, NULL, sizeof(sigData))); cp = sigDataBad; - AssertNull(wolfSSL_d2i_ECDSA_SIG(NULL, &cp, sizeof(sigDataBad))); + ExpectNull(wolfSSL_d2i_ECDSA_SIG(NULL, &cp, sizeof(sigDataBad))); cp = sigData; - AssertNotNull((sig = wolfSSL_d2i_ECDSA_SIG(NULL, &cp, sizeof(sigData)))); - AssertIntEQ((cp == sigData + 8), 1); + ExpectNotNull((sig = wolfSSL_d2i_ECDSA_SIG(NULL, &cp, sizeof(sigData)))); + ExpectIntEQ((cp == sigData + 8), 1); cp = sigData; - AssertNull(wolfSSL_d2i_ECDSA_SIG(&sig, NULL, sizeof(sigData))); - AssertNotNull((sig2 = wolfSSL_d2i_ECDSA_SIG(&sig, &cp, sizeof(sigData)))); - AssertIntEQ((sig == sig2), 1); + ExpectNull(wolfSSL_d2i_ECDSA_SIG(&sig, NULL, sizeof(sigData))); + ExpectNotNull((sig2 = wolfSSL_d2i_ECDSA_SIG(&sig, &cp, sizeof(sigData)))); + ExpectIntEQ((sig == sig2), 1); cp = outSig; p = outSig; - AssertIntEQ(wolfSSL_i2d_ECDSA_SIG(NULL, &p), 0); - AssertIntEQ(wolfSSL_i2d_ECDSA_SIG(NULL, NULL), 0); - AssertIntEQ(wolfSSL_i2d_ECDSA_SIG(sig, NULL), 8); - AssertIntEQ(wolfSSL_i2d_ECDSA_SIG(sig, &p), sizeof(sigData)); - AssertIntEQ((p == outSig + 8), 1); - AssertIntEQ(XMEMCMP(sigData, outSig, 8), 0); + ExpectIntEQ(wolfSSL_i2d_ECDSA_SIG(NULL, &p), 0); + ExpectIntEQ(wolfSSL_i2d_ECDSA_SIG(NULL, NULL), 0); + ExpectIntEQ(wolfSSL_i2d_ECDSA_SIG(sig, NULL), 8); + ExpectIntEQ(wolfSSL_i2d_ECDSA_SIG(sig, &p), sizeof(sigData)); + ExpectIntEQ((p == outSig + 8), 1); + ExpectIntEQ(XMEMCMP(sigData, outSig, 8), 0); - wolfSSL_ECDSA_SIG_free(sig); + p = NULL; + ExpectIntEQ(wolfSSL_i2d_ECDSA_SIG(sig, &p), 8); +#ifndef WOLFSSL_I2D_ECDSA_SIG_ALLOC + ExpectNull(p); +#else + ExpectNotNull(p); + ExpectIntEQ(XMEMCMP(p, outSig, 8), 0); + XFREE(p, NULL, DYNAMIC_TYPE_OPENSSL); +#endif - res = TEST_RES_CHECK(1); + wolfSSL_ECDSA_SIG_free(sig); #endif - return res; + return EXPECT_RESULT(); } static int test_ECDSA_size_sign(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ECC256) && !defined(NO_ECC_SECP) - EC_KEY* key; - ECDSA_SIG* ecdsaSig; + EC_KEY* key = NULL; + ECDSA_SIG* ecdsaSig = NULL; int id; byte hash[WC_MAX_DIGEST_SIZE]; byte hash2[WC_MAX_DIGEST_SIZE]; @@ -61106,246 +73253,258 @@ XMEMSET(hash2, 234, sizeof(hash2)); id = wc_ecc_get_curve_id_from_name("SECP256R1"); - AssertIntEQ(id, ECC_SECP256R1); + ExpectIntEQ(id, ECC_SECP256R1); - AssertNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertIntEQ(EC_KEY_generate_key(key), 1); + ExpectNotNull(key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectIntEQ(EC_KEY_generate_key(key), 1); - AssertIntGE(ECDSA_size(NULL), 0); + ExpectIntGE(ECDSA_size(NULL), 0); - AssertIntEQ(ECDSA_sign(0, hash, sizeof(hash), sig, &sigSz, NULL), 0); - AssertIntEQ(ECDSA_sign(0, NULL, sizeof(hash), sig, &sigSz, key), 0); - AssertIntEQ(ECDSA_sign(0, hash, sizeof(hash), NULL, &sigSz, key), 0); - AssertIntEQ(ECDSA_verify(0, hash, sizeof(hash), sig, sigSz, NULL), 0); - AssertIntEQ(ECDSA_verify(0, NULL, sizeof(hash), sig, sigSz, key), 0); - AssertIntEQ(ECDSA_verify(0, hash, sizeof(hash), NULL, sigSz, key), 0); - - AssertIntEQ(ECDSA_sign(0, hash, sizeof(hash), sig, &sigSz, key), 1); - AssertIntGE(ECDSA_size(key), sigSz); - AssertIntEQ(ECDSA_verify(0, hash, sizeof(hash), sig, sigSz, key), 1); - AssertIntEQ(ECDSA_verify(0, hash2, sizeof(hash2), sig, sigSz, key), 0); - - AssertNull(ECDSA_do_sign(NULL, sizeof(hash), NULL)); - AssertNull(ECDSA_do_sign(NULL, sizeof(hash), key)); - AssertNull(ECDSA_do_sign(hash, sizeof(hash), NULL)); - AssertNotNull(ecdsaSig = ECDSA_do_sign(hash, sizeof(hash), key)); - AssertIntEQ(ECDSA_do_verify(NULL, sizeof(hash), NULL, NULL), -1); - AssertIntEQ(ECDSA_do_verify(hash, sizeof(hash), NULL, NULL), -1); - AssertIntEQ(ECDSA_do_verify(NULL, sizeof(hash), ecdsaSig, NULL), -1); - AssertIntEQ(ECDSA_do_verify(NULL, sizeof(hash), NULL, key), -1); - AssertIntEQ(ECDSA_do_verify(NULL, sizeof(hash), ecdsaSig, key), -1); - AssertIntEQ(ECDSA_do_verify(hash, sizeof(hash), NULL, key), -1); - AssertIntEQ(ECDSA_do_verify(hash, sizeof(hash), ecdsaSig, NULL), -1); - AssertIntEQ(ECDSA_do_verify(hash, sizeof(hash), ecdsaSig, key), 1); - AssertIntEQ(ECDSA_do_verify(hash2, sizeof(hash2), ecdsaSig, key), 0); + ExpectIntEQ(ECDSA_sign(0, hash, sizeof(hash), sig, &sigSz, NULL), 0); + ExpectIntEQ(ECDSA_sign(0, NULL, sizeof(hash), sig, &sigSz, key), 0); + ExpectIntEQ(ECDSA_sign(0, hash, sizeof(hash), NULL, &sigSz, key), 0); + ExpectIntEQ(ECDSA_verify(0, hash, sizeof(hash), sig, (int)sigSz, NULL), 0); + ExpectIntEQ(ECDSA_verify(0, NULL, sizeof(hash), sig, (int)sigSz, key), 0); + ExpectIntEQ(ECDSA_verify(0, hash, sizeof(hash), NULL, (int)sigSz, key), 0); + + ExpectIntEQ(ECDSA_sign(0, hash, sizeof(hash), sig, &sigSz, key), 1); + ExpectIntGE(ECDSA_size(key), sigSz); + ExpectIntEQ(ECDSA_verify(0, hash, sizeof(hash), sig, (int)sigSz, key), 1); + ExpectIntEQ(ECDSA_verify(0, hash2, sizeof(hash2), sig, (int)sigSz, key), 0); + + ExpectNull(ECDSA_do_sign(NULL, sizeof(hash), NULL)); + ExpectNull(ECDSA_do_sign(NULL, sizeof(hash), key)); + ExpectNull(ECDSA_do_sign(hash, sizeof(hash), NULL)); + ExpectNotNull(ecdsaSig = ECDSA_do_sign(hash, sizeof(hash), key)); + ExpectIntEQ(ECDSA_do_verify(NULL, sizeof(hash), NULL, NULL), -1); + ExpectIntEQ(ECDSA_do_verify(hash, sizeof(hash), NULL, NULL), -1); + ExpectIntEQ(ECDSA_do_verify(NULL, sizeof(hash), ecdsaSig, NULL), -1); + ExpectIntEQ(ECDSA_do_verify(NULL, sizeof(hash), NULL, key), -1); + ExpectIntEQ(ECDSA_do_verify(NULL, sizeof(hash), ecdsaSig, key), -1); + ExpectIntEQ(ECDSA_do_verify(hash, sizeof(hash), NULL, key), -1); + ExpectIntEQ(ECDSA_do_verify(hash, sizeof(hash), ecdsaSig, NULL), -1); + ExpectIntEQ(ECDSA_do_verify(hash, sizeof(hash), ecdsaSig, key), 1); + ExpectIntEQ(ECDSA_do_verify(hash2, sizeof(hash2), ecdsaSig, key), 0); ECDSA_SIG_free(ecdsaSig); EC_KEY_free(key); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_EXTRA && !NO_ECC256 && !NO_ECC_SECP */ - return res; + return EXPECT_RESULT(); } static int test_ECDH_compute_key(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_ECC256) && !defined(NO_ECC_SECP) && \ !defined(WOLF_CRYPTO_CB_ONLY_ECC) - EC_KEY* key1; - EC_KEY* key2; - EC_POINT* pub1; - EC_POINT* pub2; + EC_KEY* key1 = NULL; + EC_KEY* key2 = NULL; + EC_POINT* pub1 = NULL; + EC_POINT* pub2 = NULL; byte secret1[32]; byte secret2[32]; int i; - AssertNotNull(key1 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertIntEQ(EC_KEY_generate_key(key1), 1); - AssertNotNull(pub1 = wolfSSL_EC_KEY_get0_public_key(key1)); - AssertNotNull(key2 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertIntEQ(EC_KEY_generate_key(key2), 1); - AssertNotNull(pub2 = wolfSSL_EC_KEY_get0_public_key(key2)); + ExpectNotNull(key1 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectIntEQ(EC_KEY_generate_key(key1), 1); + ExpectNotNull(pub1 = wolfSSL_EC_KEY_get0_public_key(key1)); + ExpectNotNull(key2 = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); + ExpectIntEQ(EC_KEY_generate_key(key2), 1); + ExpectNotNull(pub2 = wolfSSL_EC_KEY_get0_public_key(key2)); - AssertIntEQ(ECDH_compute_key(NULL, sizeof(secret1), NULL, NULL, NULL), 0); - AssertIntEQ(ECDH_compute_key(secret1, sizeof(secret1), NULL, NULL, NULL), + ExpectIntEQ(ECDH_compute_key(NULL, sizeof(secret1), NULL, NULL, NULL), 0); + ExpectIntEQ(ECDH_compute_key(secret1, sizeof(secret1), NULL, NULL, NULL), 0); - AssertIntEQ(ECDH_compute_key(NULL, sizeof(secret1), pub2, NULL, NULL), 0); - AssertIntEQ(ECDH_compute_key(NULL, sizeof(secret1), NULL, key1, NULL), 0); - AssertIntEQ(ECDH_compute_key(NULL, sizeof(secret1), pub2, key1, NULL), 0); - AssertIntEQ(ECDH_compute_key(secret1, sizeof(secret1), NULL, key1, NULL), + ExpectIntEQ(ECDH_compute_key(NULL, sizeof(secret1), pub2, NULL, NULL), 0); + ExpectIntEQ(ECDH_compute_key(NULL, sizeof(secret1), NULL, key1, NULL), 0); + ExpectIntEQ(ECDH_compute_key(NULL, sizeof(secret1), pub2, key1, NULL), 0); + ExpectIntEQ(ECDH_compute_key(secret1, sizeof(secret1), NULL, key1, NULL), 0); - AssertIntEQ(ECDH_compute_key(secret1, sizeof(secret1), pub2, NULL, NULL), + ExpectIntEQ(ECDH_compute_key(secret1, sizeof(secret1), pub2, NULL, NULL), 0); - AssertIntEQ(ECDH_compute_key(secret1, sizeof(secret1) - 16, pub2, key1, + ExpectIntEQ(ECDH_compute_key(secret1, sizeof(secret1) - 16, pub2, key1, NULL), 0); - AssertIntEQ(ECDH_compute_key(secret1, sizeof(secret1), pub2, key1, NULL), + ExpectIntEQ(ECDH_compute_key(secret1, sizeof(secret1), pub2, key1, NULL), sizeof(secret1)); - AssertIntEQ(ECDH_compute_key(secret2, sizeof(secret2), pub1, key2, NULL), + ExpectIntEQ(ECDH_compute_key(secret2, sizeof(secret2), pub1, key2, NULL), sizeof(secret2)); for (i = 0; i < (int)sizeof(secret1); i++) { - AssertIntEQ(secret1[i], secret2[i]); + ExpectIntEQ(secret1[i], secret2[i]); } EC_KEY_free(key2); EC_KEY_free(key1); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_EXTRA && !NO_ECC256 && !NO_ECC_SECP && * !WOLF_CRYPTO_CB_ONLY_ECC */ - return res; + return EXPECT_RESULT(); } #endif /* HAVE_ECC && !OPENSSL_NO_PK */ #if defined(OPENSSL_EXTRA) && !defined(NO_CERTS) && \ - defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) -static int test_openssl_make_self_signed_certificate(EVP_PKEY* pkey) + defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_REQ) && \ + !defined(NO_ASN_TIME) +static int test_openssl_make_self_signed_certificate(EVP_PKEY* pkey, + int expectedDerSz) { + EXPECT_DECLS; X509* x509 = NULL; BIGNUM* serial_number = NULL; X509_NAME* name = NULL; time_t epoch_off = 0; ASN1_INTEGER* asn1_serial_number; long not_before, not_after; + int derSz; - AssertNotNull(x509 = X509_new()); + ExpectNotNull(x509 = X509_new()); - AssertIntNE(X509_set_pubkey(x509, pkey), 0); + ExpectIntNE(X509_set_pubkey(x509, pkey), 0); - AssertNotNull(serial_number = BN_new()); - AssertIntNE(BN_pseudo_rand(serial_number, 64, 0, 0), 0); - AssertNotNull(asn1_serial_number = X509_get_serialNumber(x509)); - AssertNotNull(BN_to_ASN1_INTEGER(serial_number, asn1_serial_number)); + ExpectNotNull(serial_number = BN_new()); + ExpectIntNE(BN_pseudo_rand(serial_number, 64, 0, 0), 0); + ExpectNotNull(asn1_serial_number = X509_get_serialNumber(x509)); + ExpectNotNull(BN_to_ASN1_INTEGER(serial_number, asn1_serial_number)); /* version 3 */ - AssertIntNE(X509_set_version(x509, 2L), 0); + ExpectIntNE(X509_set_version(x509, 2L), 0); - AssertNotNull(name = X509_NAME_new()); + ExpectNotNull(name = X509_NAME_new()); - AssertIntNE(X509_NAME_add_entry_by_NID(name, NID_commonName, MBSTRING_UTF8, + ExpectIntNE(X509_NAME_add_entry_by_NID(name, NID_commonName, MBSTRING_UTF8, (unsigned char*)"www.wolfssl.com", -1, -1, 0), 0); + ExpectIntNE(X509_NAME_add_entry_by_NID(name, NID_pkcs9_contentType, + MBSTRING_UTF8,(unsigned char*)"Server", -1, -1, 0), 0); - AssertIntNE(X509_set_subject_name(x509, name), 0); - AssertIntNE(X509_set_issuer_name(x509, name), 0); + ExpectIntNE(X509_set_subject_name(x509, name), 0); + ExpectIntNE(X509_set_issuer_name(x509, name), 0); not_before = (long)wc_Time(NULL); not_after = not_before + (365 * 24 * 60 * 60); - AssertNotNull(X509_time_adj(X509_get_notBefore(x509), not_before, &epoch_off)); - AssertNotNull(X509_time_adj(X509_get_notAfter(x509), not_after, &epoch_off)); + ExpectNotNull(X509_time_adj(X509_get_notBefore(x509), not_before, + &epoch_off)); + ExpectNotNull(X509_time_adj(X509_get_notAfter(x509), not_after, + &epoch_off)); - AssertIntNE(X509_sign(x509, pkey, EVP_sha256()), 0); + ExpectIntNE(X509_sign(x509, pkey, EVP_sha256()), 0); + + ExpectNotNull(wolfSSL_X509_get_der(x509, &derSz)); + ExpectIntGE(derSz, expectedDerSz); BN_free(serial_number); X509_NAME_free(name); X509_free(x509); - return 0; + return EXPECT_RESULT(); } #endif static int test_openssl_generate_key_and_cert(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) + int expectedDerSz; + EVP_PKEY* pkey = NULL; +#ifdef HAVE_ECC + EC_KEY* ec_key = NULL; +#endif #if !defined(NO_RSA) - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - EVP_PKEY* pkey = EVP_PKEY_new(); - int key_length = 2048; - BIGNUM* exponent = BN_new(); - RSA* rsa = RSA_new(); - - AssertNotNull(pkey); - AssertNotNull(exponent); - AssertNotNull(rsa); - - AssertIntNE(BN_set_word(exponent, WC_RSA_EXPONENT), 0); - #ifndef WOLFSSL_KEY_GEN - AssertIntEQ(RSA_generate_key_ex(rsa, key_length, exponent, NULL), 0); - - #if defined(USE_CERT_BUFFERS_1024) - AssertIntNE(wolfSSL_RSA_LoadDer_ex(rsa, server_key_der_1024, - sizeof_server_key_der_1024, WOLFSSL_RSA_LOAD_PRIVATE), 0); - key_length = 1024; - #elif defined(USE_CERT_BUFFERS_2048) - AssertIntNE(wolfSSL_RSA_LoadDer_ex(rsa, server_key_der_2048, - sizeof_server_key_der_2048, WOLFSSL_RSA_LOAD_PRIVATE), 0); - #else - RSA_free(rsa); - rsa = NULL; - #endif - #else - AssertIntEQ(RSA_generate_key_ex(NULL, key_length, exponent, NULL), 0); - AssertIntEQ(RSA_generate_key_ex(rsa, 0, exponent, NULL), 0); - AssertIntEQ(RSA_generate_key_ex(rsa, key_length, NULL, NULL), 0); - AssertIntNE(RSA_generate_key_ex(rsa, key_length, exponent, NULL), 0); - #endif + int key_length = 2048; + BIGNUM* exponent = NULL; + RSA* rsa = NULL; - if (rsa) { - AssertIntNE(EVP_PKEY_assign_RSA(pkey, rsa), 0); + ExpectNotNull(pkey = EVP_PKEY_new()); + ExpectNotNull(exponent = BN_new()); + ExpectNotNull(rsa = RSA_new()); + + ExpectIntNE(BN_set_word(exponent, WC_RSA_EXPONENT), 0); +#ifndef WOLFSSL_KEY_GEN + ExpectIntEQ(RSA_generate_key_ex(rsa, key_length, exponent, NULL), 0); - BN_free(exponent); + #if defined(USE_CERT_BUFFERS_1024) + ExpectIntNE(wolfSSL_RSA_LoadDer_ex(rsa, server_key_der_1024, + sizeof_server_key_der_1024, WOLFSSL_RSA_LOAD_PRIVATE), 0); + key_length = 1024; + #elif defined(USE_CERT_BUFFERS_2048) + ExpectIntNE(wolfSSL_RSA_LoadDer_ex(rsa, server_key_der_2048, + sizeof_server_key_der_2048, WOLFSSL_RSA_LOAD_PRIVATE), 0); + #else + RSA_free(rsa); + rsa = NULL; + #endif +#else + ExpectIntEQ(RSA_generate_key_ex(NULL, key_length, exponent, NULL), 0); + ExpectIntEQ(RSA_generate_key_ex(rsa, 0, exponent, NULL), 0); + ExpectIntEQ(RSA_generate_key_ex(rsa, key_length, NULL, NULL), 0); + ExpectIntNE(RSA_generate_key_ex(rsa, key_length, exponent, NULL), 0); +#endif - #if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN) && \ - defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) - test_openssl_make_self_signed_certificate(pkey); - #endif + if (rsa) { + ExpectIntNE(EVP_PKEY_assign_RSA(pkey, rsa), 0); + if (EXPECT_FAIL()) { + RSA_free(rsa); } - EVP_PKEY_free(pkey); - res = TEST_RES_CHECK(1); + #if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN) && \ + defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) + expectedDerSz = 743; + ExpectIntEQ(test_openssl_make_self_signed_certificate(pkey, + expectedDerSz), TEST_SUCCESS); + #endif } + + EVP_PKEY_free(pkey); + pkey = NULL; + BN_free(exponent); #endif /* !NO_RSA */ #ifdef HAVE_ECC - if (res == TEST_SKIPPED || res == TEST_SUCCESS) { - EVP_PKEY* pkey = EVP_PKEY_new(); - EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); + ExpectNotNull(pkey = EVP_PKEY_new()); + ExpectNotNull(ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1)); - AssertNotNull(pkey); - AssertNotNull(ec_key); - - #ifndef NO_WOLFSSL_STUB - EC_KEY_set_asn1_flag(ec_key, OPENSSL_EC_NAMED_CURVE); - #endif +#ifndef NO_WOLFSSL_STUB + EC_KEY_set_asn1_flag(ec_key, OPENSSL_EC_NAMED_CURVE); +#endif - AssertIntNE(EC_KEY_generate_key(ec_key), 0); - AssertIntNE(EVP_PKEY_assign_EC_KEY(pkey, ec_key), 0); + ExpectIntNE(EC_KEY_generate_key(ec_key), 0); + ExpectIntNE(EVP_PKEY_assign_EC_KEY(pkey, ec_key), 0); + if (EXPECT_FAIL()) { + EC_KEY_free(ec_key); + } - #if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN) && \ - defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) - test_openssl_make_self_signed_certificate(pkey); - #endif +#if !defined(NO_CERTS) && defined(WOLFSSL_CERT_GEN) && \ + defined(WOLFSSL_CERT_REQ) && !defined(NO_ASN_TIME) + expectedDerSz = 344; + ExpectIntEQ(test_openssl_make_self_signed_certificate(pkey, expectedDerSz), + TEST_SUCCESS); +#endif - EVP_PKEY_free(pkey); - res = TEST_RES_CHECK(1); - } + EVP_PKEY_free(pkey); #endif /* HAVE_ECC */ + (void)pkey; + (void)expectedDerSz; #endif /* OPENSSL_EXTRA */ - return res; + + return EXPECT_RESULT(); } static int test_stubs_are_stubs(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && !defined(NO_WOLFSSL_STUB) + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && !defined(NO_WOLFSSL_STUB) && \ + (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) WOLFSSL_CTX* ctx = NULL; WOLFSSL_CTX* ctxN = NULL; #ifndef NO_WOLFSSL_CLIENT - ctx = wolfSSL_CTX_new(wolfSSLv23_client_method()); - AssertNotNull(ctx); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); #elif !defined(NO_WOLFSSL_SERVER) - ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); - AssertNotNull(ctx); - #else - return res; + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); #endif - #define CHECKZERO_RET(x, y, z) AssertIntEQ((int) x(y), 0); \ - AssertIntEQ((int) x(z), 0) + #define CHECKZERO_RET(x, y, z) ExpectIntEQ((int) x(y), 0); \ + ExpectIntEQ((int) x(z), 0) /* test logic, all stubs return same result regardless of ctx being NULL * as there are no sanity checks, it's just a stub! If at some * point a stub is not a stub it should begin to return BAD_FUNC_ARG @@ -61363,12 +73522,19 @@ CHECKZERO_RET(wolfSSL_CTX_sess_cache_full, ctx, ctxN); CHECKZERO_RET(wolfSSL_CTX_sess_misses, ctx, ctxN); CHECKZERO_RET(wolfSSL_CTX_sess_timeouts, ctx, ctxN); + + /* when implemented this should take WOLFSSL object insted, right now + * always returns 0 */ + ExpectIntEQ(SSL_get_current_expansion(NULL), 0); + wolfSSL_CTX_free(ctx); ctx = NULL; - res = TEST_RES_CHECK(1); -#endif /* OPENSSL_EXTRA && !NO_WOLFSSL_STUB */ - return res; + ExpectStrEQ(SSL_COMP_get_name(NULL), "not supported"); + ExpectIntEQ(SSL_get_current_expansion(), 0); +#endif /* OPENSSL_EXTRA && !NO_WOLFSSL_STUB && (!NO_WOLFSSL_CLIENT || + * !NO_WOLFSSL_SERVER) */ + return EXPECT_RESULT(); } static int test_CONF_modules_xxx(void) @@ -61376,18 +73542,12 @@ int res = TEST_SKIPPED; #if defined(OPENSSL_EXTRA) CONF_modules_free(); - AssertTrue(1); /* to confirm previous call gives no harm */ CONF_modules_unload(0); - AssertTrue(1); - CONF_modules_unload(1); - AssertTrue(1); - CONF_modules_unload(-1); - AssertTrue(1); - res = TEST_RES_CHECK(1); + res = TEST_SUCCESS; #endif /* OPENSSL_EXTRA */ return res; } @@ -61413,40 +73573,36 @@ CRYPTO_set_dynlock_lock_callback( (void (*)(int, struct CRYPTO_dynlock_value *, const char*, int))1); - AssertTrue(1); /* to confirm previous call gives no harm */ - - res = TEST_RES_CHECK(1); + res = TEST_SUCCESS; #endif /* OPENSSL_EXTRA */ return res; } static int test_CRYPTO_THREADID_xxx(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) CRYPTO_THREADID_current((CRYPTO_THREADID*)NULL); CRYPTO_THREADID_current((CRYPTO_THREADID*)1); - AssertIntEQ(CRYPTO_THREADID_hash((const CRYPTO_THREADID*)NULL), 0); - - res = TEST_RES_CHECK(1); + ExpectIntEQ(CRYPTO_THREADID_hash((const CRYPTO_THREADID*)NULL), 0); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_ENGINE_cleanup(void) { int res = TEST_SKIPPED; #if defined(OPENSSL_EXTRA) ENGINE_cleanup(); - AssertTrue(1); /* to confirm previous call gives no harm */ - res = TEST_RES_CHECK(1); + res = TEST_SUCCESS; #endif /* OPENSSL_EXTRA */ return res; } static int test_wolfSSL_CTX_LoadCRL(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_CRL) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) + EXPECT_DECLS; +#if defined(HAVE_CRL) && !defined(NO_RSA) && !defined(NO_FILESYSTEM) && \ + (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; const char* badPath = "dummypath"; @@ -61455,22 +73611,37 @@ const char* issuerCert = "./certs/client-cert.pem"; int derType = WOLFSSL_FILETYPE_ASN1; int pemType = WOLFSSL_FILETYPE_PEM; +#ifdef HAVE_CRL_MONITOR int monitor = WOLFSSL_CRL_MONITOR; +#else + int monitor = 0; +#endif WOLFSSL_CERT_MANAGER* cm = NULL; - #define FAIL_T1(x, y, z, p, d) AssertIntEQ((int) x(y, z, p, d), \ + #define FAIL_T1(x, y, z, p, d) ExpectIntEQ((int) x(y, z, p, d), \ BAD_FUNC_ARG) - #define SUCC_T(x, y, z, p, d) AssertIntEQ((int) x(y, z, p, d), \ + #define FAIL_T2(x, y, z, p, d) ExpectIntEQ((int) x(y, z, p, d), \ + NOT_COMPILED_IN) + #define SUCC_T(x, y, z, p, d) ExpectIntEQ((int) x(y, z, p, d), \ WOLFSSL_SUCCESS) - - FAIL_T1(wolfSSL_CTX_LoadCRL, ctx, validPath, pemType, monitor); - #ifndef NO_WOLFSSL_CLIENT - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + #define NEW_CTX(ctx) ExpectNotNull( \ + (ctx) = wolfSSL_CTX_new(wolfSSLv23_client_method())) #elif !defined(NO_WOLFSSL_SERVER) - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + #define NEW_CTX(ctx) ExpectNotNull( \ + (ctx) = wolfSSL_CTX_new(wolfSSLv23_server_method())) #else - return; + #define NEW_CTX(ctx) return +#endif + + FAIL_T1(wolfSSL_CTX_LoadCRL, ctx, validPath, pemType, monitor); + + NEW_CTX(ctx); + +#ifndef HAVE_CRL_MONITOR + FAIL_T2(wolfSSL_CTX_LoadCRL, ctx, validPath, pemType, WOLFSSL_CRL_MONITOR); + wolfSSL_CTX_free(ctx); + NEW_CTX(ctx); #endif SUCC_T (wolfSSL_CTX_LoadCRL, ctx, validPath, pemType, monitor); @@ -61478,49 +73649,81 @@ SUCC_T (wolfSSL_CTX_LoadCRL, ctx, badPath, derType, monitor); wolfSSL_CTX_free(ctx); + ctx = NULL; -#ifndef NO_WOLFSSL_CLIENT - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); -#elif !defined(NO_WOLFSSL_SERVER) - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); -#else - return; -#endif - AssertIntEQ(wolfSSL_CTX_load_verify_locations(ctx, issuerCert, NULL), + NEW_CTX(ctx); + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx, issuerCert, NULL), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, validFilePath, pemType), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, validFilePath, pemType), WOLFSSL_SUCCESS); wolfSSL_CTX_free(ctx); + ctx = NULL; -#ifndef NO_WOLFSSL_CLIENT - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); -#elif !defined(NO_WOLFSSL_SERVER) - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); -#else - return; -#endif - AssertIntEQ(wolfSSL_CTX_load_verify_locations(ctx, issuerCert, NULL), + NEW_CTX(ctx); + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx, issuerCert, NULL), WOLFSSL_SUCCESS); - AssertNotNull(ssl = wolfSSL_new(ctx)); - AssertIntEQ(wolfSSL_LoadCRLFile(ssl, validFilePath, pemType), WOLFSSL_SUCCESS); + ExpectNotNull(ssl = wolfSSL_new(ctx)); + ExpectIntEQ(wolfSSL_LoadCRLFile(ssl, validFilePath, pemType), WOLFSSL_SUCCESS); wolfSSL_free(ssl); + ssl = NULL; wolfSSL_CTX_free(ctx); + ctx = NULL; - AssertNotNull(cm = wolfSSL_CertManagerNew()); - AssertIntEQ(wolfSSL_CertManagerLoadCA(cm, issuerCert, NULL), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CertManagerLoadCRLFile(cm, validFilePath, pemType), WOLFSSL_SUCCESS); + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + ExpectIntEQ(wolfSSL_CertManagerLoadCA(cm, issuerCert, NULL), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CertManagerLoadCRLFile(cm, validFilePath, pemType), + WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); +#endif + return EXPECT_RESULT(); +} - res = TEST_RES_CHECK(1); +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && defined(HAVE_CRL) +static int test_multiple_crls_same_issuer_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL); + ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, "./certs/crl/crl.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + return EXPECT_RESULT(); +} #endif - return res; + +static int test_multiple_crls_same_issuer(void) +{ + EXPECT_DECLS; +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && defined(HAVE_CRL) + test_ssl_cbf client_cbs, server_cbs; + struct { + const char* server_cert; + const char* server_key; + } test_params[] = { + { "./certs/server-cert.pem", "./certs/server-key.pem" }, + { "./certs/server-revoked-cert.pem", "./certs/server-revoked-key.pem" } + }; + size_t i; + + for (i = 0; i < (sizeof(test_params)/sizeof(*test_params)); i++) { + XMEMSET(&client_cbs, 0, sizeof(client_cbs)); + XMEMSET(&server_cbs, 0, sizeof(server_cbs)); + + server_cbs.certPemFile = test_params[i].server_cert; + server_cbs.keyPemFile = test_params[i].server_key; + client_cbs.crlPemFile = "./certs/crl/extra-crls/general-server-crl.pem"; + + client_cbs.ctx_ready = test_multiple_crls_same_issuer_ctx_ready; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbs, + &server_cbs, NULL), TEST_FAIL); + } +#endif + return EXPECT_RESULT(); } static int test_SetTmpEC_DHE_Sz(void) { - int res = TEST_SKIPPED; -#if defined(HAVE_ECC) && !defined(NO_WOLFSSL_CLIENT) EXPECT_DECLS; +#if defined(HAVE_ECC) && !defined(NO_WOLFSSL_CLIENT) WOLFSSL_CTX *ctx = NULL; WOLFSSL *ssl = NULL; @@ -61531,18 +73734,15 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_get0_privatekey(void) { - int res = TEST_SKIPPED; -#ifdef OPENSSL_ALL EXPECT_DECLS; +#ifdef OPENSSL_ALL WOLFSSL_CTX* ctx = NULL; (void)ctx; @@ -61570,19 +73770,17 @@ ExpectNotNull(SSL_CTX_get0_privatekey(ctx)); wolfSSL_CTX_free(ctx); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_dtls_set_mtu(void) { - int res = TEST_SKIPPED; -#if (defined(WOLFSSL_DTLS_MTU) || defined(WOLFSSL_SCTP)) && \ - !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_DTLS) EXPECT_DECLS; +#if (defined(WOLFSSL_DTLS_MTU) || defined(WOLFSSL_SCTP)) && \ + !defined(NO_WOLFSSL_SERVER) && defined(WOLFSSL_DTLS) && \ + !defined(WOLFSSL_NO_TLS12) WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; const char* testCertFile; @@ -61614,15 +73812,13 @@ wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(SINGLE_THREADED) && \ - defined(WOLFSSL_DTLS) + defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) static WC_INLINE void generateDTLSMsg(byte* out, int outSz, word32 seq, enum HandShakeType hsType, word16 length) @@ -61742,7 +73938,7 @@ #endif #if defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(SINGLE_THREADED) && \ - defined(WOLFSSL_DTLS) + defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) static void test_wolfSSL_dtls12_fragments_spammer(WOLFSSL* ssl) { @@ -61854,6 +74050,7 @@ static int test_wolfSSL_dtls_fragments(void) { + EXPECT_DECLS; callback_functions func_cb_client; callback_functions func_cb_server; size_t i; @@ -61862,8 +74059,10 @@ method_provider server_meth; ssl_callback spammer; } params[] = { +#if !defined(WOLFSSL_NO_TLS12) {wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, test_wolfSSL_dtls12_fragments_spammer}, +#endif #ifdef WOLFSSL_DTLS13 {wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, test_wolfSSL_dtls13_fragments_spammer}, @@ -61874,7 +74073,6 @@ XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); - func_cb_client.doUdp = func_cb_server.doUdp = 1; func_cb_server.method = params[i].server_meth; func_cb_client.method = params[i].client_meth; @@ -61882,22 +74080,25 @@ test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); - AssertFalse(func_cb_client.return_code); - AssertFalse(func_cb_server.return_code); + ExpectFalse(func_cb_client.return_code); + ExpectFalse(func_cb_server.return_code); /* The socket should be closed by the server resulting in a * socket error, fatal error or reading a close notify alert */ if (func_cb_client.last_err != SOCKET_ERROR_E && func_cb_client.last_err != WOLFSSL_ERROR_ZERO_RETURN && func_cb_client.last_err != FATAL_ERROR) { - AssertIntEQ(func_cb_client.last_err, SOCKET_ERROR_E); + ExpectIntEQ(func_cb_client.last_err, SOCKET_ERROR_E); } /* Check the server returned an error indicating the msg buffer * was full */ - AssertIntEQ(func_cb_server.last_err, DTLS_TOO_MANY_FRAGMENTS_E); + ExpectIntEQ(func_cb_server.last_err, DTLS_TOO_MANY_FRAGMENTS_E); + + if (EXPECT_FAIL()) + break; } - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } static void test_wolfSSL_dtls_send_alert(WOLFSSL* ssl) @@ -61926,10 +74127,15 @@ XMEMSET(&server_cbs, 0, sizeof(server_cbs)); client_cbs.doUdp = server_cbs.doUdp = 1; if (version12) { +#if !defined(WOLFSSL_NO_TLS12) client_cbs.method = wolfDTLSv1_2_client_method; server_cbs.method = wolfDTLSv1_2_server_method; +#else + return TEST_SKIPPED; +#endif } - else { + else + { #ifdef WOLFSSL_DTLS13 client_cbs.method = wolfDTLSv1_3_client_method; server_cbs.method = wolfDTLSv1_3_server_method; @@ -62022,17 +74228,18 @@ static int test_wolfSSL_dtls_bad_record(void) { - int ret; + int ret = TEST_SUCCESS; +#if !defined(WOLFSSL_NO_TLS12) ret = _test_wolfSSL_dtls_bad_record(wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method); +#endif #ifdef WOLFSSL_DTLS13 - if (ret != TEST_SUCCESS) - return ret; - return _test_wolfSSL_dtls_bad_record(wolfDTLSv1_3_client_method, + if (ret == TEST_SUCCESS) { + ret = _test_wolfSSL_dtls_bad_record(wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method); -#else - return ret; + } #endif /* WOLFSSL_DTLS13 */ + return ret; } @@ -62248,7 +74455,8 @@ #endif #if defined(WOLFSSL_DTLS) && \ - defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(SINGLE_THREADED) + defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(SINGLE_THREADED) && \ + !defined(DEBUG_VECTOR_REGISTER_ACCESS_FUZZING) static void test_wolfSSL_dtls_send_ch(WOLFSSL* ssl) { int fd, ret; @@ -62414,6 +74622,7 @@ sslCopy.buffers.outputBuffer.offset = 0; sslCopy.error = 0; sslCopy.curSize = 0; + sslCopy.curStartIdx = 0; sslCopy.keys.curSeq_lo = 0; XMEMSET(&sslCopy.curRL, 0, sizeof(sslCopy.curRL)); #ifdef WOLFSSL_DTLS13 @@ -62517,8 +74726,10 @@ ssl_callback client_ssl_ready; ssl_callback server_ssl_ready; } test_params[] = { +#if !defined(WOLFSSL_NO_TLS12) {wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, test_wolfSSL_dtls_send_ch, test_wolfSSL_dtls_compare_stateless}, +#endif #if defined(WOLFSSL_DTLS13) && defined(WOLFSSL_SEND_HRR_COOKIE) {wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, test_wolfSSL_dtls_send_ch, test_wolfSSL_dtls_enable_hrrcookie}, @@ -62527,6 +74738,10 @@ #endif }; + if (0 == sizeof(test_params)){ + return TEST_SKIPPED; + } + for (i = 0; i < sizeof(test_params)/sizeof(*test_params); i++) { XMEMSET(&client_cbs, 0, sizeof(client_cbs)); XMEMSET(&server_cbs, 0, sizeof(server_cbs)); @@ -62598,7 +74813,7 @@ #define VERIFY_ONE_CERT(a, b, c, d) \ do { \ - (a) = verify_cert_with_cm(c, d); \ + (a) = verify_cert_with_cm(c, d);\ if ((a) != 0) \ return (b); \ else \ @@ -62637,8 +74852,8 @@ VERIFY_ONE_CERT(ret, i, cm, chainGArr[7]); /* if failure, i = -15 here */ VERIFY_ONE_CERT(ret, i, cm, chainGArr[8]); /* if failure, i = -16 here */ -/* test validating the entity twice, should have no effect on pathLen since - * entity/leaf cert */ + /* test validating the entity twice, should have no effect on pathLen since + * entity/leaf cert */ VERIFY_ONE_CERT(ret, i, cm, chainGArr[8]); /* if failure, i = -17 here */ return ret; @@ -62737,87 +74952,61 @@ static int test_various_pathlen_chains(void) { - int ret; - WOLFSSL_CERT_MANAGER* cm; + EXPECT_DECLS; + WOLFSSL_CERT_MANAGER* cm = NULL; /* Test chain G (large chain with varying pathLens) */ - if ((cm = wolfSSL_CertManagerNew()) == NULL) { - fprintf(stderr, "cert manager new failed\n"); - return -1; - } + ExpectNotNull(cm = wolfSSL_CertManagerNew()); #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) - AssertIntEQ(test_chainG(cm), -1); + ExpectIntEQ(test_chainG(cm), -1); #else - AssertIntEQ(test_chainG(cm), 0); + ExpectIntEQ(test_chainG(cm), 0); #endif /* NO_WOLFSSL_CLIENT && NO_WOLFSSL_SERVER */ - ret = wolfSSL_CertManagerUnloadCAs(cm); - if (ret != WOLFSSL_SUCCESS) - return -1; + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(cm), WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); /* end test chain G */ /* Test chain H (5 chain with same pathLens) */ - if ((cm = wolfSSL_CertManagerNew()) == NULL) { - fprintf(stderr, "cert manager new failed\n"); - return -1; - } - AssertIntLT(test_chainH(cm), 0); - - wolfSSL_CertManagerUnloadCAs(cm); + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + ExpectIntLT(test_chainH(cm), 0); + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(cm), WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); - if ((cm = wolfSSL_CertManagerNew()) == NULL) { - fprintf(stderr, "cert manager new failed\n"); - return -1; - } - ret = wolfSSL_CertManagerUnloadCAs(cm); - if (ret != WOLFSSL_SUCCESS) - return -1; + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(cm), WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); /* end test chain H */ /* Test chain I (only first ICA has pathLen set and it's set to 2, * followed by 2 ICA's, should pass) */ - if ((cm = wolfSSL_CertManagerNew()) == NULL) { - fprintf(stderr, "cert manager new failed\n"); - return -1; - } + ExpectNotNull(cm = wolfSSL_CertManagerNew()); #if defined(NO_WOLFSSL_CLIENT) && defined(NO_WOLFSSL_SERVER) - AssertIntEQ(test_chainI(cm), -1); + ExpectIntEQ(test_chainI(cm), -1); #else - AssertIntEQ(test_chainI(cm), 0); + ExpectIntEQ(test_chainI(cm), 0); #endif /* NO_WOLFSSL_CLIENT && NO_WOLFSSL_SERVER */ - wolfSSL_CertManagerUnloadCAs(cm); + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(cm), WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); - if ((cm = wolfSSL_CertManagerNew()) == NULL) { - fprintf(stderr, "cert manager new failed\n"); - return -1; - } + cm = NULL; - ret = wolfSSL_CertManagerUnloadCAs(cm); - if (ret != WOLFSSL_SUCCESS) - return -1; + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(cm), WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); + cm = NULL; /* Test chain J (Again only first ICA has pathLen set and it's set to 2, * this time followed by 3 ICA's, should fail */ - if ((cm = wolfSSL_CertManagerNew()) == NULL) { - fprintf(stderr, "cert manager new failed\n"); - return -1; - } - AssertIntLT(test_chainJ(cm), 0); - - wolfSSL_CertManagerUnloadCAs(cm); + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + ExpectIntLT(test_chainJ(cm), 0); + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(cm), WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); - if ((cm = wolfSSL_CertManagerNew()) == NULL) { - fprintf(stderr, "cert manager new failed\n"); - return -1; - } + cm = NULL; - ret = wolfSSL_CertManagerUnloadCAs(cm); + ExpectNotNull(cm = wolfSSL_CertManagerNew()); + ExpectIntEQ(wolfSSL_CertManagerUnloadCAs(cm), WOLFSSL_SUCCESS); wolfSSL_CertManagerFree(cm); - return TEST_RES_CHECK(ret == WOLFSSL_SUCCESS); + return EXPECT_RESULT(); } #endif /* !NO_RSA && !NO_SHA && !NO_FILESYSTEM && !NO_CERTS */ @@ -62829,7 +75018,7 @@ (void)ctx; - /* Succes Cases */ + /* Success Cases */ ExpectIntEQ(wolfSSL_export_keying_material(ssl, ekm, sizeof(ekm), "Test label", XSTR_SIZEOF("Test label"), NULL, 0, 0), 1); ExpectIntEQ(wolfSSL_export_keying_material(ssl, ekm, sizeof(ekm), @@ -62878,9 +75067,8 @@ static int test_wolfSSL_THREADID_hash(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) CRYPTO_THREADID id; CRYPTO_THREADID_current(NULL); @@ -62888,32 +75076,41 @@ ExpectTrue(CRYPTO_THREADID_hash(NULL) == 0UL); XMEMSET(&id, 0, sizeof(id)); ExpectTrue(CRYPTO_THREADID_hash(&id) == 0UL); +#endif /* OPENSSL_EXTRA */ + return EXPECT_RESULT(); +} +static int test_wolfSSL_set_ecdh_auto(void) +{ + EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) + WOLFSSL* ssl = NULL; - res = EXPECT_RESULT(); + ExpectIntEQ(SSL_set_ecdh_auto(NULL,0), 1); + ExpectIntEQ(SSL_set_ecdh_auto(NULL,1), 1); + ExpectIntEQ(SSL_set_ecdh_auto(ssl,0), 1); + ExpectIntEQ(SSL_set_ecdh_auto(ssl,1), 1); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_set_ecdh_auto(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) WOLFSSL_CTX* ctx = NULL; ExpectIntEQ(SSL_CTX_set_ecdh_auto(NULL,0), 1); ExpectIntEQ(SSL_CTX_set_ecdh_auto(NULL,1), 1); ExpectIntEQ(SSL_CTX_set_ecdh_auto(ctx,0), 1); ExpectIntEQ(SSL_CTX_set_ecdh_auto(ctx,1), 1); - - res = EXPECT_RESULT(); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL) && \ defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_NO_TLS12) static THREAD_RETURN WOLFSSL_THREAD SSL_read_test_server_thread(void* args) { + EXPECT_DECLS; callback_functions* callbacks = NULL; WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; @@ -62923,10 +75120,11 @@ char msg[] = "I hear you fa shizzle!"; int len = (int) XSTRLEN(msg); char input[1024]; - int ret, err; + int ret = 0; + int err = 0; if (!args) - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); ((func_args*)args)->return_code = TEST_FAIL; @@ -62944,19 +75142,17 @@ fdOpenSession(Task_self()); #endif - AssertIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_load_verify_locations(ctx, + caCertFile, 0)); - AssertIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CTX_use_certificate_file(ctx, svrCertFile, - WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_use_certificate_file(ctx, + svrCertFile, WOLFSSL_FILETYPE_PEM)); - AssertIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, - WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_use_PrivateKey_file(ctx, + svrKeyFile, WOLFSSL_FILETYPE_PEM)); #if !defined(NO_FILESYSTEM) && !defined(NO_DH) - AssertIntEQ(wolfSSL_CTX_SetTmpDH_file(ctx, dhParamFile, + ExpectIntEQ(wolfSSL_CTX_SetTmpDH_file(ctx, dhParamFile, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); #elif !defined(NO_DH) SetDHCtx(ctx); /* will repick suites with DHE, higher priority than PSK */ @@ -62966,37 +75162,33 @@ callbacks->ctx_ready(ctx); ssl = wolfSSL_new(ctx); - AssertNotNull(ssl); + ExpectNotNull(ssl); /* listen and accept */ tcp_accept(&sfd, &cfd, (func_args*)args, port, 0, 0, 0, 0, 1, 0, 0); CloseSocket(sfd); - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_set_fd(ssl, cfd)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_set_fd(ssl, cfd)); if (callbacks->ssl_ready) callbacks->ssl_ready(ssl); - do { - err = 0; /* Reset error */ - ret = wolfSSL_accept(ssl); - if (ret != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); - } - } while (ret != WOLFSSL_SUCCESS && err == WC_PENDING_E); - - if (ret != WOLFSSL_SUCCESS) { - wolfSSL_free(ssl); - wolfSSL_CTX_free(ctx); - CloseSocket(cfd); - ((func_args*)args)->return_code = TEST_FAIL; - return 0; + if (EXPECT_SUCCESS()) { + do { + err = 0; /* Reset error */ + ret = wolfSSL_accept(ssl); + if (ret != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); + } + } while (ret != WOLFSSL_SUCCESS && err == WC_PENDING_E); } + ExpectIntEQ(ret, WOLFSSL_SUCCESS); + /* read and write data */ - XMEMSET( input, 0, sizeof(input)); + XMEMSET(input, 0, sizeof(input)); - while (1) { + while (EXPECT_SUCCESS()) { ret = wolfSSL_read(ssl, input, sizeof(input)); if (ret > 0) { break; @@ -63010,7 +75202,7 @@ } } - if (err == WOLFSSL_ERROR_ZERO_RETURN) { + if (EXPECT_SUCCESS() && (err == WOLFSSL_ERROR_ZERO_RETURN)) { do { ret = wolfSSL_write(ssl, msg, len); if (ret > 0) { @@ -63020,21 +75212,27 @@ } /* bidirectional shutdown */ - while (wolfSSL_shutdown(ssl) != WOLFSSL_SUCCESS) { - continue; + while (EXPECT_SUCCESS()) { + ret = wolfSSL_shutdown(ssl); + ExpectIntNE(ret, WOLFSSL_FATAL_ERROR); + if (ret == WOLFSSL_SUCCESS) { + break; + } } - /* wait for the peer to disconnect the tcp connection */ - do { - ret = wolfSSL_read(ssl, input, sizeof(input)); - err = wolfSSL_get_error(ssl, ret); - } while (ret > 0 || err != WOLFSSL_ERROR_ZERO_RETURN); + if (EXPECT_SUCCESS()) { + /* wait for the peer to disconnect the tcp connection */ + do { + ret = wolfSSL_read(ssl, input, sizeof(input)); + err = wolfSSL_get_error(ssl, ret); + } while (ret > 0 || err != WOLFSSL_ERROR_ZERO_RETURN); + } /* detect TCP disconnect */ - AssertIntLE(ret,WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_get_error(ssl, ret), WOLFSSL_ERROR_ZERO_RETURN); + ExpectIntLE(ret,WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_get_error(ssl, ret), WOLFSSL_ERROR_ZERO_RETURN); - ((func_args*)args)->return_code = TEST_SUCCESS; + ((func_args*)args)->return_code = EXPECT_RESULT(); wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); @@ -63042,10 +75240,11 @@ #if defined(HAVE_ECC) && defined(FP_ECC) && defined(HAVE_THREAD_LS) wc_ecc_fp_free(); /* free per thread cache */ #endif - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); } static THREAD_RETURN WOLFSSL_THREAD SSL_read_test_client_thread(void* args) { + EXPECT_DECLS; callback_functions* callbacks = NULL; WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; @@ -63057,7 +75256,7 @@ int ret, err; if (!args) - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); ((func_args*)args)->return_code = TEST_FAIL; callbacks = ((func_args*)args)->callbacks; @@ -63067,44 +75266,48 @@ fdOpenSession(Task_self()); #endif - AssertIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CTX_load_verify_locations(ctx, caCertFile, 0)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_load_verify_locations(ctx, + caCertFile, 0)); - AssertIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CTX_use_certificate_file(ctx, cliCertFile, - WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_use_certificate_file(ctx, + cliCertFile, WOLFSSL_FILETYPE_PEM)); - AssertIntEQ(WOLFSSL_SUCCESS, - wolfSSL_CTX_use_PrivateKey_file(ctx, cliKeyFile, - WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_CTX_use_PrivateKey_file(ctx, + cliKeyFile, WOLFSSL_FILETYPE_PEM)); - AssertNotNull((ssl = wolfSSL_new(ctx))); + ExpectNotNull((ssl = wolfSSL_new(ctx))); tcp_connect(&sfd, wolfSSLIP, ((func_args*)args)->signal->port, 0, 0, ssl); - AssertIntEQ(WOLFSSL_SUCCESS, wolfSSL_set_fd(ssl, sfd)); + ExpectIntEQ(WOLFSSL_SUCCESS, wolfSSL_set_fd(ssl, sfd)); - do { - err = 0; /* Reset error */ - ret = wolfSSL_connect(ssl); - if (ret != WOLFSSL_SUCCESS) { - err = wolfSSL_get_error(ssl, 0); - } - } while (ret != WOLFSSL_SUCCESS && err == WC_PENDING_E); + if (EXPECT_SUCCESS()) { + do { + err = 0; /* Reset error */ + ret = wolfSSL_connect(ssl); + if (ret != WOLFSSL_SUCCESS) { + err = wolfSSL_get_error(ssl, 0); + } + } while (ret != WOLFSSL_SUCCESS && err == WC_PENDING_E); + } - AssertIntGE(wolfSSL_write(ssl, msg, len), 0); + ExpectIntGE(wolfSSL_write(ssl, msg, len), 0); - if (0 < (idx = wolfSSL_read(ssl, input, sizeof(input)-1))) { - input[idx] = 0; + if (EXPECT_SUCCESS()) { + if (0 < (idx = wolfSSL_read(ssl, input, sizeof(input)-1))) { + input[idx] = 0; + } } - ret = wolfSSL_shutdown(ssl); - if ( ret == WOLFSSL_SHUTDOWN_NOT_DONE) { + if (EXPECT_SUCCESS()) { ret = wolfSSL_shutdown(ssl); + if (ret == WOLFSSL_SHUTDOWN_NOT_DONE) { + ret = wolfSSL_shutdown(ssl); + } } - AssertIntEQ(ret, WOLFSSL_SUCCESS); + ExpectIntEQ(ret, WOLFSSL_SUCCESS); - ((func_args*)args)->return_code = TEST_SUCCESS; + ((func_args*)args)->return_code = EXPECT_RESULT(); wolfSSL_free(ssl); wolfSSL_CTX_free(ctx); @@ -63112,7 +75315,7 @@ #if defined(HAVE_ECC) && defined(FP_ECC) && defined(HAVE_THREAD_LS) wc_ecc_fp_free(); /* free per thread cache */ #endif - return 0; + WOLFSSL_RETURN_FROM_THREAD(0); } #endif /* OPENSSL_EXTRA && WOLFSSL_ERROR_CODE_OPENSSL && HAVE_IO_TESTS_DEPENDENCIES && !WOLFSSL_NO_TLS12 */ @@ -63122,7 +75325,7 @@ */ static int test_wolfSSL_read_detect_TCP_disconnect(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_ERROR_CODE_OPENSSL) && \ defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_NO_TLS12) tcp_ready ready; @@ -63168,71 +75371,77 @@ join_thread(clientThread); join_thread(serverThread); - AssertTrue(client_args.return_code); - AssertTrue(server_args.return_code); + ExpectTrue(client_args.return_code); + ExpectTrue(server_args.return_code); FreeTcpReady(&ready); - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_get_min_proto_version(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) - WOLFSSL_CTX *ctx; - - (void)ctx; + WOLFSSL_CTX *ctx = NULL; - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_method())); - AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, SSL3_VERSION), WOLFSSL_SUCCESS); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_method())); + ExpectIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, SSL3_VERSION), + WOLFSSL_SUCCESS); #ifdef WOLFSSL_ALLOW_SSLV3 - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), SSL3_VERSION); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), SSL3_VERSION); #else - AssertIntGT(wolfSSL_CTX_get_min_proto_version(ctx), SSL3_VERSION); + ExpectIntGT(wolfSSL_CTX_get_min_proto_version(ctx), SSL3_VERSION); #endif wolfSSL_CTX_free(ctx); + ctx = NULL; + #ifndef NO_OLD_TLS #ifdef WOLFSSL_ALLOW_TLSV10 - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_method())); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_method())); #endif - AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_VERSION), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_VERSION), + WOLFSSL_SUCCESS); #ifdef WOLFSSL_ALLOW_TLSV10 - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_VERSION); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_VERSION); #else - AssertIntGT(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_VERSION); + ExpectIntGT(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_VERSION); #endif wolfSSL_CTX_free(ctx); + ctx = NULL; + #endif - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_method())); - AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION), WOLFSSL_SUCCESS); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_method())); + ExpectIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_1_VERSION), + WOLFSSL_SUCCESS); #ifndef NO_OLD_TLS - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_1_VERSION); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_1_VERSION); #else - AssertIntGT(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_1_VERSION); + ExpectIntGT(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_1_VERSION); #endif wolfSSL_CTX_free(ctx); + ctx = NULL; #ifndef WOLFSSL_NO_TLS12 - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_2_method())); - AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_2_VERSION); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_2_method())); + ExpectIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_2_VERSION); wolfSSL_CTX_free(ctx); + ctx = NULL; #endif #ifdef WOLFSSL_TLS13 - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_method())); - AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_3_VERSION); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_method())); + ExpectIntEQ(wolfSSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx), TLS1_3_VERSION); wolfSSL_CTX_free(ctx); + ctx = NULL; #endif - - res = TEST_RES_CHECK(1); #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) */ - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ @@ -63241,82 +75450,85 @@ defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB))) static int test_wolfSSL_set_SSL_CTX(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) \ && !defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_TLS13) && \ !defined(NO_RSA) - WOLFSSL_CTX *ctx1, *ctx2; - WOLFSSL *ssl; + WOLFSSL_CTX *ctx1 = NULL; + WOLFSSL_CTX *ctx2 = NULL; + WOLFSSL *ssl = NULL; const byte *session_id1 = (const byte *)"CTX1"; const byte *session_id2 = (const byte *)"CTX2"; - AssertNotNull(ctx1 = wolfSSL_CTX_new(wolfTLS_server_method())); - AssertTrue(wolfSSL_CTX_use_certificate_file(ctx1, svrCertFile, - WOLFSSL_FILETYPE_PEM)); - AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx1, svrKeyFile, - WOLFSSL_FILETYPE_PEM)); - AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx1, TLS1_2_VERSION), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx1), TLS1_2_VERSION); - AssertIntEQ(wolfSSL_CTX_get_max_proto_version(ctx1), TLS1_3_VERSION); - AssertIntEQ(wolfSSL_CTX_set_session_id_context(ctx1, session_id1, 4), - WOLFSSL_SUCCESS); + ExpectNotNull(ctx1 = wolfSSL_CTX_new(wolfTLS_server_method())); + ExpectTrue(wolfSSL_CTX_use_certificate_file(ctx1, svrCertFile, + WOLFSSL_FILETYPE_PEM)); + ExpectTrue(wolfSSL_CTX_use_PrivateKey_file(ctx1, svrKeyFile, + WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(wolfSSL_CTX_set_min_proto_version(ctx1, TLS1_2_VERSION), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx1), TLS1_2_VERSION); + ExpectIntEQ(wolfSSL_CTX_get_max_proto_version(ctx1), TLS1_3_VERSION); + ExpectIntEQ(wolfSSL_CTX_set_session_id_context(ctx1, session_id1, 4), + WOLFSSL_SUCCESS); - AssertNotNull(ctx2 = wolfSSL_CTX_new(wolfTLS_server_method())); - AssertTrue(wolfSSL_CTX_use_certificate_file(ctx2, svrCertFile, - WOLFSSL_FILETYPE_PEM)); - AssertTrue(wolfSSL_CTX_use_PrivateKey_file(ctx2, svrKeyFile, - WOLFSSL_FILETYPE_PEM)); - AssertIntEQ(wolfSSL_CTX_set_min_proto_version(ctx2, TLS1_2_VERSION), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_set_max_proto_version(ctx2, TLS1_2_VERSION), - WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_get_min_proto_version(ctx2), TLS1_2_VERSION); - AssertIntEQ(wolfSSL_CTX_get_max_proto_version(ctx2), TLS1_2_VERSION); - AssertIntEQ(wolfSSL_CTX_set_session_id_context(ctx2, session_id2, 4), - WOLFSSL_SUCCESS); + ExpectNotNull(ctx2 = wolfSSL_CTX_new(wolfTLS_server_method())); + ExpectTrue(wolfSSL_CTX_use_certificate_file(ctx2, svrCertFile, + WOLFSSL_FILETYPE_PEM)); + ExpectTrue(wolfSSL_CTX_use_PrivateKey_file(ctx2, svrKeyFile, + WOLFSSL_FILETYPE_PEM)); + ExpectIntEQ(wolfSSL_CTX_set_min_proto_version(ctx2, TLS1_2_VERSION), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_set_max_proto_version(ctx2, TLS1_2_VERSION), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_get_min_proto_version(ctx2), TLS1_2_VERSION); + ExpectIntEQ(wolfSSL_CTX_get_max_proto_version(ctx2), TLS1_2_VERSION); + ExpectIntEQ(wolfSSL_CTX_set_session_id_context(ctx2, session_id2, 4), + WOLFSSL_SUCCESS); #ifdef HAVE_SESSION_TICKET - AssertIntEQ((wolfSSL_CTX_get_options(ctx1) & SSL_OP_NO_TICKET), 0); + ExpectIntEQ((wolfSSL_CTX_get_options(ctx1) & SSL_OP_NO_TICKET), 0); wolfSSL_CTX_set_options(ctx2, SSL_OP_NO_TICKET); - AssertIntNE((wolfSSL_CTX_get_options(ctx2) & SSL_OP_NO_TICKET), 0); + ExpectIntNE((wolfSSL_CTX_get_options(ctx2) & SSL_OP_NO_TICKET), 0); #endif - AssertNotNull(ssl = wolfSSL_new(ctx2)); - AssertIntNE((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3), 0); + ExpectNotNull(ssl = wolfSSL_new(ctx2)); + ExpectIntNE((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3), 0); #ifdef WOLFSSL_INT_H - AssertIntEQ(XMEMCMP(ssl->sessionCtx, session_id2, 4), 0); - AssertTrue(ssl->buffers.certificate == ctx2->certificate); - AssertTrue(ssl->buffers.certChain == ctx2->certChain); +#ifdef WOLFSSL_SESSION_ID_CTX + ExpectIntEQ(XMEMCMP(ssl->sessionCtx, session_id2, 4), 0); +#endif + ExpectTrue(ssl->buffers.certificate == ctx2->certificate); + ExpectTrue(ssl->buffers.certChain == ctx2->certChain); #endif #ifdef HAVE_SESSION_TICKET - AssertIntNE((wolfSSL_get_options(ssl) & SSL_OP_NO_TICKET), 0); + ExpectIntNE((wolfSSL_get_options(ssl) & SSL_OP_NO_TICKET), 0); #endif /* Set the ctx1 that has TLSv1.3 as max proto version */ - AssertNotNull(wolfSSL_set_SSL_CTX(ssl, ctx1)); + ExpectNotNull(wolfSSL_set_SSL_CTX(ssl, ctx1)); /* MUST not change proto versions of ssl */ - AssertIntNE((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3), 0); + ExpectIntNE((wolfSSL_get_options(ssl) & WOLFSSL_OP_NO_TLSv1_3), 0); #ifdef HAVE_SESSION_TICKET /* MUST not change */ - AssertIntNE((wolfSSL_get_options(ssl) & SSL_OP_NO_TICKET), 0); + ExpectIntNE((wolfSSL_get_options(ssl) & SSL_OP_NO_TICKET), 0); #endif /* MUST change */ #ifdef WOLFSSL_INT_H - AssertTrue(ssl->buffers.certificate == ctx1->certificate); - AssertTrue(ssl->buffers.certChain == ctx1->certChain); - AssertIntEQ(XMEMCMP(ssl->sessionCtx, session_id1, 4), 0); + ExpectTrue(ssl->buffers.certificate == ctx1->certificate); + ExpectTrue(ssl->buffers.certChain == ctx1->certChain); +#ifdef WOLFSSL_SESSION_ID_CTX + ExpectIntEQ(XMEMCMP(ssl->sessionCtx, session_id1, 4), 0); +#endif #endif wolfSSL_free(ssl); wolfSSL_CTX_free(ctx1); wolfSSL_CTX_free(ctx2); - - res = TEST_RES_CHECK(1); #endif /* defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) */ - return res; + return EXPECT_RESULT(); } #endif /* defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ @@ -63325,160 +75537,150 @@ static int test_wolfSSL_security_level(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) - SSL_CTX *ctx; + SSL_CTX *ctx = NULL; #ifdef WOLFSSL_TLS13 #ifdef NO_WOLFSSL_SERVER - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method())); #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); #endif + SSL_CTX_set_security_level(NULL, 1); SSL_CTX_set_security_level(ctx, 1); - AssertTrue(1); - - AssertIntEQ(SSL_CTX_get_security_level(ctx), 0); + ExpectIntEQ(SSL_CTX_get_security_level(NULL), 0); + /* Stub so nothing happens. */ + ExpectIntEQ(SSL_CTX_get_security_level(ctx), 0); SSL_CTX_free(ctx); #else (void)ctx; #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_SSL_in_init(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_BIO) - SSL_CTX* ctx; - SSL* ssl; + SSL_CTX* ctx = NULL; + SSL* ssl = NULL; const char* testCertFile; const char* testKeyFile; - #ifdef WOLFSSL_TLS13 - #ifdef NO_WOLFSSL_SERVER - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method())); - #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); - #endif +#ifdef WOLFSSL_TLS13 + #ifdef NO_WOLFSSL_SERVER + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method())); + #else + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); + #endif +#else + #ifdef NO_WOLFSSL_SERVER + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + #else + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + #endif +#endif #ifndef NO_RSA - testCertFile = svrCertFile; - testKeyFile = svrKeyFile; + testCertFile = svrCertFile; + testKeyFile = svrKeyFile; #elif defined(HAVE_ECC) - testCertFile = eccCertFile; - testKeyFile = eccKeyFile; + testCertFile = eccCertFile; + testKeyFile = eccKeyFile; #else - testCertFile = NULL; - testKeyFile = NULL; + testCertFile = NULL; + testKeyFile = NULL; #endif - if (testCertFile != NULL && testKeyFile != NULL) { - AssertTrue(SSL_CTX_use_certificate_file(ctx, testCertFile, - SSL_FILETYPE_PEM)); - AssertTrue(SSL_CTX_use_PrivateKey_file(ctx, testKeyFile, - SSL_FILETYPE_PEM)); - } - - ssl = SSL_new(ctx); - AssertNotNull(ssl); - AssertIntEQ(SSL_in_init(ssl), 1); + if ((testCertFile != NULL) && (testKeyFile != NULL)) { + ExpectTrue(SSL_CTX_use_certificate_file(ctx, testCertFile, + SSL_FILETYPE_PEM)); + ExpectTrue(SSL_CTX_use_PrivateKey_file(ctx, testKeyFile, + SSL_FILETYPE_PEM)); + } - SSL_CTX_free(ctx); - SSL_free(ssl); - #else - (void)ctx; - (void)ssl; - (void)testCertFile; - (void)testKeyFile; - #endif + ExpectNotNull(ssl = SSL_new(ctx)); + ExpectIntEQ(SSL_in_init(ssl), 1); - res = TEST_RES_CHECK(1); + SSL_CTX_free(ctx); + SSL_free(ssl); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CTX_set_timeout(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_SESSION_CACHE) int timeout; - - WOLFSSL_CTX* ctx = wolfSSL_CTX_new(wolfSSLv23_server_method()); + WOLFSSL_CTX* ctx = NULL; (void)timeout; - AssertNotNull(ctx); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); #if defined(WOLFSSL_ERROR_CODE_OPENSSL) /* in WOLFSSL_ERROR_CODE_OPENSSL macro guard, * wolfSSL_CTX_set_timeout returns previous timeout value on success. */ - AssertIntEQ(wolfSSL_CTX_set_timeout(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_timeout(NULL, 0), BAD_FUNC_ARG); /* giving 0 as timeout value sets default timeout */ timeout = wolfSSL_CTX_set_timeout(ctx, 0); - AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 20), timeout); - AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 30), 20); + ExpectIntEQ(wolfSSL_CTX_set_timeout(ctx, 20), timeout); + ExpectIntEQ(wolfSSL_CTX_set_timeout(ctx, 30), 20); #else - - AssertIntEQ(wolfSSL_CTX_set_timeout(NULL, 0), BAD_FUNC_ARG); - AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 100), 1); - AssertIntEQ(wolfSSL_CTX_set_timeout(ctx, 0), 1); - + ExpectIntEQ(wolfSSL_CTX_set_timeout(NULL, 0), BAD_FUNC_ARG); + ExpectIntEQ(wolfSSL_CTX_set_timeout(ctx, 100), 1); + ExpectIntEQ(wolfSSL_CTX_set_timeout(ctx, 0), 1); #endif - wolfSSL_CTX_free(ctx); - res = TEST_RES_CHECK(1); + wolfSSL_CTX_free(ctx); #endif /* !NO_WOLFSSL_SERVER && !NO_SESSION_CACHE*/ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_OpenSSL_version(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) const char* ver; - #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L - AssertNotNull(ver = OpenSSL_version(0)); - #else - AssertNotNull(ver = OpenSSL_version()); - #endif - AssertIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING, - XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0); - - res = TEST_RES_CHECK(1); +#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L + ExpectNotNull(ver = OpenSSL_version(0)); +#else + ExpectNotNull(ver = OpenSSL_version()); #endif - return res; + ExpectIntEQ(XMEMCMP(ver, "wolfSSL " LIBWOLFSSL_VERSION_STRING, + XSTRLEN("wolfSSL " LIBWOLFSSL_VERSION_STRING)), 0); +#endif + return EXPECT_RESULT(); } static int test_CONF_CTX_CMDLINE(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) SSL_CTX* ctx = NULL; SSL_CONF_CTX* cctx = NULL; - AssertNotNull(cctx = SSL_CONF_CTX_new()); + ExpectNotNull(cctx = SSL_CONF_CTX_new()); - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); SSL_CONF_CTX_set_ssl_ctx(cctx, ctx); - AssertTrue(1); /* set flags */ - AssertIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_CMDLINE), - WOLFSSL_CONF_FLAG_CMDLINE); - AssertIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_CERTIFICATE), - WOLFSSL_CONF_FLAG_CMDLINE | WOLFSSL_CONF_FLAG_CERTIFICATE); + ExpectIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_CMDLINE), + WOLFSSL_CONF_FLAG_CMDLINE); + ExpectIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_CERTIFICATE), + WOLFSSL_CONF_FLAG_CMDLINE | WOLFSSL_CONF_FLAG_CERTIFICATE); /* cmd invalid command */ - AssertIntEQ(SSL_CONF_cmd(cctx, "foo", "foobar"), -2); - AssertIntEQ(SSL_CONF_cmd(cctx, "foo", NULL), -2); - AssertIntEQ(SSL_CONF_cmd(cctx, NULL, NULL), WOLFSSL_FAILURE); - AssertIntEQ(SSL_CONF_cmd(cctx, NULL, "foobar"), WOLFSSL_FAILURE); - AssertIntEQ(SSL_CONF_cmd(NULL, "-curves", "foobar"), WOLFSSL_FAILURE); + ExpectIntEQ(SSL_CONF_cmd(cctx, "foo", "foobar"), -2); + ExpectIntEQ(SSL_CONF_cmd(cctx, "foo", NULL), -2); + ExpectIntEQ(SSL_CONF_cmd(cctx, NULL, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(SSL_CONF_cmd(cctx, NULL, "foobar"), WOLFSSL_FAILURE); + ExpectIntEQ(SSL_CONF_cmd(NULL, "-curves", "foobar"), WOLFSSL_FAILURE); /* cmd Certificate and Private Key*/ { @@ -63486,12 +75688,11 @@ const char* ourCert = svrCertFile; const char* ourKey = svrKeyFile; - AssertIntEQ(SSL_CONF_cmd(cctx, "-cert", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "-cert", ourCert), - WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_cmd(cctx, "-key", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "-key", ourKey), WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-cert", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-cert", ourCert), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-key", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-key", ourKey), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); #endif } @@ -63500,9 +75701,9 @@ #if defined(HAVE_ECC) const char* curve = "secp256r1"; - AssertIntEQ(SSL_CONF_cmd(cctx, "-curves", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "-curves", curve), WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-curves", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-curves", curve), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); #endif } @@ -63510,9 +75711,9 @@ { char* cipher = wolfSSL_get_cipher_list(0/*top priority*/); - AssertIntEQ(SSL_CONF_cmd(cctx, "-cipher", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "-cipher", cipher), WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-cipher", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-cipher", cipher), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); } /* cmd DH parameter */ @@ -63520,45 +75721,41 @@ #if !defined(NO_DH) && !defined(NO_BIO) const char* ourdhcert = "./certs/dh2048.pem"; - AssertIntEQ(SSL_CONF_cmd(cctx, "-dhparam", NULL), - -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "-dhparam", ourdhcert), - WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-dhparam", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "-dhparam", ourdhcert), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); #endif } + SSL_CTX_free(ctx); SSL_CONF_CTX_free(cctx); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_CONF_CTX_FILE(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) SSL_CTX* ctx = NULL; SSL_CONF_CTX* cctx = NULL; - AssertNotNull(cctx = SSL_CONF_CTX_new()); - AssertNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + ExpectNotNull(cctx = SSL_CONF_CTX_new()); + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); SSL_CONF_CTX_set_ssl_ctx(cctx, ctx); - AssertTrue(1); /* set flags */ - AssertIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_FILE), - WOLFSSL_CONF_FLAG_FILE); - AssertIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_CERTIFICATE), - WOLFSSL_CONF_FLAG_FILE | WOLFSSL_CONF_FLAG_CERTIFICATE); + ExpectIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_FILE), + WOLFSSL_CONF_FLAG_FILE); + ExpectIntEQ(SSL_CONF_CTX_set_flags(cctx, WOLFSSL_CONF_FLAG_CERTIFICATE), + WOLFSSL_CONF_FLAG_FILE | WOLFSSL_CONF_FLAG_CERTIFICATE); /* sanity check */ - AssertIntEQ(SSL_CONF_cmd(cctx, "foo", "foobar"), -2); - AssertIntEQ(SSL_CONF_cmd(cctx, "foo", NULL), -2); - AssertIntEQ(SSL_CONF_cmd(cctx, NULL, NULL), WOLFSSL_FAILURE); - AssertIntEQ(SSL_CONF_cmd(cctx, NULL, "foobar"), WOLFSSL_FAILURE); - AssertIntEQ(SSL_CONF_cmd(NULL, "-curves", "foobar"), WOLFSSL_FAILURE); + ExpectIntEQ(SSL_CONF_cmd(cctx, "foo", "foobar"), -2); + ExpectIntEQ(SSL_CONF_cmd(cctx, "foo", NULL), -2); + ExpectIntEQ(SSL_CONF_cmd(cctx, NULL, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(SSL_CONF_cmd(cctx, NULL, "foobar"), WOLFSSL_FAILURE); + ExpectIntEQ(SSL_CONF_cmd(NULL, "-curves", "foobar"), WOLFSSL_FAILURE); /* cmd Certificate and Private Key*/ { @@ -63566,13 +75763,13 @@ const char* ourCert = svrCertFile; const char* ourKey = svrKeyFile; - AssertIntEQ(SSL_CONF_cmd(cctx, "Certificate", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "PrivateKey", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "Certificate", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "PrivateKey", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "Certificate", ourCert), - WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_cmd(cctx, "PrivateKey", ourKey), WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "Certificate", ourCert), + WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "PrivateKey", ourKey), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); #endif } @@ -63581,9 +75778,9 @@ #if defined(HAVE_ECC) const char* curve = "secp256r1"; - AssertIntEQ(SSL_CONF_cmd(cctx, "Curves", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "Curves", curve), WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "Curves", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "Curves", curve), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); #endif } @@ -63591,9 +75788,10 @@ { char* cipher = wolfSSL_get_cipher_list(0/*top priority*/); - AssertIntEQ(SSL_CONF_cmd(cctx, "CipherString", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "CipherString", cipher), WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "CipherString", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "CipherString", cipher), + WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); } /* cmd DH parameter */ @@ -63601,91 +75799,90 @@ #if !defined(NO_DH) && !defined(NO_BIO) && defined(HAVE_FFDHE_3072) const char* ourdhcert = "./certs/dh3072.pem"; - AssertIntEQ(SSL_CONF_cmd(cctx, "DHParameters", NULL), -3); - AssertIntEQ(SSL_CONF_cmd(cctx, "DHParameters", ourdhcert), - WOLFSSL_SUCCESS); - AssertIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_cmd(cctx, "DHParameters", NULL), -3); + ExpectIntEQ(SSL_CONF_cmd(cctx, "DHParameters", ourdhcert), + WOLFSSL_SUCCESS); + ExpectIntEQ(SSL_CONF_CTX_finish(cctx), WOLFSSL_SUCCESS); #endif } + SSL_CTX_free(ctx); SSL_CONF_CTX_free(cctx); - - res = TEST_RES_CHECK(1); #endif /* OPENSSL_EXTRA */ - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_CRYPTO_get_ex_new_index(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef HAVE_EX_DATA int idx1, idx2; /* test for unsupported class index */ - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_X509_STORE, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_X509_STORE_CTX, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_DH, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_DSA, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_EC_KEY, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_RSA, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_ENGINE, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_UI, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_BIO, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_APP, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_UI_METHOD, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_DRBG, - 0,NULL, NULL, NULL, NULL ), -1); - AssertIntEQ(wolfSSL_CRYPTO_get_ex_new_index(20, 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_X509_STORE, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index( + WOLF_CRYPTO_EX_INDEX_X509_STORE_CTX, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_DH, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_DSA, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_EC_KEY, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_RSA, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_ENGINE, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_UI, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_BIO, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_APP, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_UI_METHOD, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_DRBG, + 0,NULL, NULL, NULL, NULL ), -1); + ExpectIntEQ(wolfSSL_CRYPTO_get_ex_new_index(20, + 0,NULL, NULL, NULL, NULL ), -1); /* test for supported class index */ idx1 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL, - 0,NULL, NULL, NULL, NULL ); + 0,NULL, NULL, NULL, NULL ); idx2 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL, - 0,NULL, NULL, NULL, NULL ); - AssertIntNE(idx1, -1); - AssertIntNE(idx2, -1); - AssertIntNE(idx1, idx2); + 0,NULL, NULL, NULL, NULL ); + ExpectIntNE(idx1, -1); + ExpectIntNE(idx2, -1); + ExpectIntNE(idx1, idx2); idx1 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_CTX, - 0,NULL, NULL, NULL, NULL ); + 0,NULL, NULL, NULL, NULL ); idx2 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_CTX, - 0,NULL, NULL, NULL, NULL ); - AssertIntNE(idx1, -1); - AssertIntNE(idx2, -1); - AssertIntNE(idx1, idx2); + 0,NULL, NULL, NULL, NULL ); + ExpectIntNE(idx1, -1); + ExpectIntNE(idx2, -1); + ExpectIntNE(idx1, idx2); idx1 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_X509, - 0,NULL, NULL, NULL, NULL ); + 0,NULL, NULL, NULL, NULL ); idx2 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_X509, - 0,NULL, NULL, NULL, NULL ); - AssertIntNE(idx1, -1); - AssertIntNE(idx2, -1); - AssertIntNE(idx1, idx2); + 0,NULL, NULL, NULL, NULL ); + ExpectIntNE(idx1, -1); + ExpectIntNE(idx2, -1); + ExpectIntNE(idx1, idx2); idx1 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION, - 0,NULL, NULL, NULL, NULL ); + 0,NULL, NULL, NULL, NULL ); idx2 = wolfSSL_CRYPTO_get_ex_new_index(WOLF_CRYPTO_EX_INDEX_SSL_SESSION, - 0,NULL, NULL, NULL, NULL ); - AssertIntNE(idx1, -1); - AssertIntNE(idx2, -1); - AssertIntNE(idx1, idx2); - - res = TEST_RES_CHECK(1); + 0,NULL, NULL, NULL, NULL ); + ExpectIntNE(idx1, -1); + ExpectIntNE(idx2, -1); + ExpectIntNE(idx1, idx2); #endif /* HAVE_EX_DATA */ - return res; + return EXPECT_RESULT(); } #if defined(HAVE_EX_DATA) && defined(HAVE_EXT_CACHE) && \ @@ -63713,31 +75910,43 @@ const CRYPTO_EX_DATA* in, void* inPtr, int idx, long argV, void* arg) { - AssertNotNull(out); - AssertNotNull(in); - AssertPtrEq(*(void**)inPtr, SESSION_NEW_IDX_VAL); - AssertPtrEq(CRYPTO_get_ex_data(in, idx), SESSION_NEW_IDX_VAL); - AssertPtrEq(CRYPTO_get_ex_data(out, idx), SESSION_NEW_IDX_VAL); - AssertIntEQ(argV, SESSION_NEW_IDX_LONG); - AssertStrEQ(arg, SESSION_NEW_IDX_PTR); + EXPECT_DECLS; + + ExpectNotNull(out); + ExpectNotNull(in); + ExpectPtrEq(*(void**)inPtr, SESSION_NEW_IDX_VAL); + ExpectPtrEq(CRYPTO_get_ex_data(in, idx), SESSION_NEW_IDX_VAL); + ExpectPtrEq(CRYPTO_get_ex_data(out, idx), SESSION_NEW_IDX_VAL); + ExpectIntEQ(argV, SESSION_NEW_IDX_LONG); + ExpectStrEQ(arg, SESSION_NEW_IDX_PTR); *(void**)inPtr = SESSION_DUP_IDX_VAL; - return SSL_SUCCESS; + if (EXPECT_SUCCESS()) { + return SSL_SUCCESS; + } + else { + return SSL_FAILURE; + } } static int test_wolfSSL_SESSION_get_ex_new_index_free_cb_called = 0; static void test_wolfSSL_SESSION_get_ex_new_index_free_cb(void* p, void* ptr, CRYPTO_EX_DATA* a, int idx, long argValue, void* arg) { - AssertNotNull(p); - AssertNull(ptr); - AssertPtrNE(CRYPTO_get_ex_data(a, idx), 0); - AssertIntEQ(argValue, SESSION_NEW_IDX_LONG); - AssertStrEQ(arg, SESSION_NEW_IDX_PTR); - test_wolfSSL_SESSION_get_ex_new_index_free_cb_called++; + EXPECT_DECLS; + + ExpectNotNull(p); + ExpectNull(ptr); + ExpectPtrNE(CRYPTO_get_ex_data(a, idx), 0); + ExpectIntEQ(argValue, SESSION_NEW_IDX_LONG); + ExpectStrEQ(arg, SESSION_NEW_IDX_PTR); + if (EXPECT_SUCCESS()) { + test_wolfSSL_SESSION_get_ex_new_index_free_cb_called++; + } } static int test_wolfSSL_SESSION_get_ex_new_index(void) { + EXPECT_DECLS; int idx = SSL_SESSION_get_ex_new_index(SESSION_NEW_IDX_LONG, (void*)SESSION_NEW_IDX_PTR, test_wolfSSL_SESSION_get_ex_new_index_new_cb, @@ -63746,18 +75955,18 @@ SSL_SESSION* s = SSL_SESSION_new(); SSL_SESSION* d = NULL; - AssertNotNull(s); - AssertPtrEq(SSL_SESSION_get_ex_data(s, idx), SESSION_NEW_IDX_VAL); - AssertNotNull(d = SSL_SESSION_dup(s)); - AssertPtrEq(SSL_SESSION_get_ex_data(d, idx), SESSION_DUP_IDX_VAL); + ExpectNotNull(s); + ExpectPtrEq(SSL_SESSION_get_ex_data(s, idx), SESSION_NEW_IDX_VAL); + ExpectNotNull(d = SSL_SESSION_dup(s)); + ExpectPtrEq(SSL_SESSION_get_ex_data(d, idx), SESSION_DUP_IDX_VAL); SSL_SESSION_free(s); - AssertIntEQ(test_wolfSSL_SESSION_get_ex_new_index_free_cb_called, 1); + ExpectIntEQ(test_wolfSSL_SESSION_get_ex_new_index_free_cb_called, 1); SSL_SESSION_free(d); - AssertIntEQ(test_wolfSSL_SESSION_get_ex_new_index_free_cb_called, 2); + ExpectIntEQ(test_wolfSSL_SESSION_get_ex_new_index_free_cb_called, 2); crypto_ex_cb_free(crypto_ex_cb_ctx_session); crypto_ex_cb_ctx_session = NULL; - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #else static int test_wolfSSL_SESSION_get_ex_new_index(void) @@ -63768,63 +75977,58 @@ static int test_wolfSSL_set_psk_use_session_callback(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(NO_PSK) - SSL_CTX* ctx; - SSL* ssl; + SSL_CTX* ctx = NULL; + SSL* ssl = NULL; const char* testCertFile; const char* testKeyFile; - #ifdef WOLFSSL_TLS13 - #ifdef NO_WOLFSSL_SERVER - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method())); - #else - AssertNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); - #endif +#ifdef WOLFSSL_TLS13 + #ifdef NO_WOLFSSL_SERVER + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_client_method())); + #else + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method())); + #endif +#else + #ifdef NO_WOLFSSL_SERVER + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_client_method())); + #else + ExpectNotNull(ctx = wolfSSL_CTX_new(wolfSSLv23_server_method())); + #endif +#endif #ifndef NO_RSA - testCertFile = svrCertFile; - testKeyFile = svrKeyFile; + testCertFile = svrCertFile; + testKeyFile = svrKeyFile; #elif defined(HAVE_ECC) - testCertFile = eccCertFile; - testKeyFile = eccKeyFile; + testCertFile = eccCertFile; + testKeyFile = eccKeyFile; #else - testCertFile = NULL; - testKeyFile = NULL; + testCertFile = NULL; + testKeyFile = NULL; #endif - if (testCertFile != NULL && testKeyFile != NULL) { - AssertTrue(SSL_CTX_use_certificate_file(ctx, testCertFile, - SSL_FILETYPE_PEM)); - AssertTrue(SSL_CTX_use_PrivateKey_file(ctx, testKeyFile, - SSL_FILETYPE_PEM)); - } - - ssl = SSL_new(ctx); - AssertNotNull(ssl); + if ((testCertFile != NULL) && (testKeyFile != NULL)) { + ExpectTrue(SSL_CTX_use_certificate_file(ctx, testCertFile, + SSL_FILETYPE_PEM)); + ExpectTrue(SSL_CTX_use_PrivateKey_file(ctx, testKeyFile, + SSL_FILETYPE_PEM)); + } - SSL_set_psk_use_session_callback(ssl, - my_psk_use_session_cb); - AssertTrue(1); + ExpectNotNull(ssl = SSL_new(ctx)); - SSL_CTX_free(ctx); - SSL_free(ssl); - #else - (void)ctx; - (void)ssl; - (void)testCertFile; - (void)testKeyFile; - #endif + SSL_set_psk_use_session_callback(ssl, my_psk_use_session_cb); - res = TEST_RES_CHECK(1); + SSL_CTX_free(ctx); + SSL_free(ssl); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_ERR_strings(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if !defined(NO_ERROR_STRINGS) - EXPECT_DECLS; const char* err1 = "unsupported cipher suite"; const char* err2 = "wolfSSL PEM routines"; const char* err = NULL; @@ -63853,51 +76057,136 @@ ExpectNotNull(err = wolfSSL_ERR_lib_error_string(-MIN_CODE_E+2)); ExpectIntEQ((*err == '\0'), 1); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_shake128(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA3) && \ defined(WOLFSSL_SHAKE128) - EXPECT_DECLS; const EVP_MD* md = NULL; ExpectNotNull(md = EVP_shake128()); ExpectIntEQ(XSTRNCMP(md, "SHAKE128", XSTRLEN("SHAKE128")), 0); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_EVP_shake256(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA3) && \ defined(WOLFSSL_SHAKE256) - EXPECT_DECLS; const EVP_MD* md = NULL; ExpectNotNull(md = EVP_shake256()); ExpectIntEQ(XSTRNCMP(md, "SHAKE256", XSTRLEN("SHAKE256")), 0); +#endif + + return EXPECT_RESULT(); +} + +/* + * Testing EVP digest API with SM3 + */ +static int test_wolfSSL_EVP_sm3(void) +{ + int res = TEST_SKIPPED; +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SM3) + EXPECT_DECLS; + const EVP_MD* md = NULL; + EVP_MD_CTX* mdCtx = NULL; + byte data[WC_SM3_BLOCK_SIZE * 4]; + byte hash[WC_SM3_DIGEST_SIZE]; + byte calcHash[WC_SM3_DIGEST_SIZE]; + byte expHash[WC_SM3_DIGEST_SIZE] = { + 0x38, 0x48, 0x15, 0xa7, 0x0e, 0xae, 0x0b, 0x27, + 0x5c, 0xde, 0x9d, 0xa5, 0xd1, 0xa4, 0x30, 0xa1, + 0xca, 0xd4, 0x54, 0x58, 0x44, 0xa2, 0x96, 0x1b, + 0xd7, 0x14, 0x80, 0x3f, 0x80, 0x1a, 0x07, 0xb6 + }; + word32 chunk; + word32 i; + unsigned int sz; + int ret; + + XMEMSET(data, 0, sizeof(data)); + + md = EVP_sm3(); + ExpectTrue(md != NULL); + ExpectIntEQ(XSTRNCMP(md, "SM3", XSTRLEN("SM3")), 0); + mdCtx = EVP_MD_CTX_new(); + ExpectTrue(mdCtx != NULL); + + /* Invalid Parameters */ + ExpectIntEQ(EVP_DigestInit(NULL, md), BAD_FUNC_ARG); + /* Valid Parameters */ + ExpectIntEQ(EVP_DigestInit(mdCtx, md), WOLFSSL_SUCCESS); + + ExpectIntEQ(EVP_DigestUpdate(NULL, NULL, 1), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_DigestUpdate(mdCtx, NULL, 1), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_DigestUpdate(NULL, data, 1), WOLFSSL_FAILURE); + + /* Valid Parameters */ + ExpectIntEQ(EVP_DigestUpdate(mdCtx, NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data, WC_SM3_BLOCK_SIZE), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data, WC_SM3_BLOCK_SIZE - 2), + WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data, WC_SM3_BLOCK_SIZE * 2), + WOLFSSL_SUCCESS); + /* Ensure too many bytes for lengths. */ + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data, WC_SM3_PAD_SIZE), + WOLFSSL_SUCCESS); + + /* Invalid Parameters */ + ExpectIntEQ(EVP_DigestFinal(NULL, NULL, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_DigestFinal(mdCtx, NULL, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_DigestFinal(NULL, hash, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_DigestFinal(NULL, hash, NULL), WOLFSSL_FAILURE); + ExpectIntEQ(EVP_DigestFinal(mdCtx, NULL, NULL), WOLFSSL_FAILURE); + + /* Valid Parameters */ + ExpectIntEQ(EVP_DigestFinal(mdCtx, hash, NULL), WOLFSSL_SUCCESS); + ExpectBufEQ(hash, expHash, WC_SM3_DIGEST_SIZE); + + /* Chunk tests. */ + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data, sizeof(data)), WOLFSSL_SUCCESS); + ExpectIntEQ(EVP_DigestFinal(mdCtx, calcHash, &sz), WOLFSSL_SUCCESS); + ExpectIntEQ(sz, WC_SM3_DIGEST_SIZE); + for (chunk = 1; chunk <= WC_SM3_BLOCK_SIZE + 1; chunk++) { + for (i = 0; i + chunk <= (word32)sizeof(data); i += chunk) { + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data + i, chunk), + WOLFSSL_SUCCESS); + } + if (i < (word32)sizeof(data)) { + ExpectIntEQ(EVP_DigestUpdate(mdCtx, data + i, + (word32)sizeof(data) - i), WOLFSSL_SUCCESS); + } + ExpectIntEQ(EVP_DigestFinal(mdCtx, hash, NULL), WOLFSSL_SUCCESS); + ExpectBufEQ(hash, calcHash, WC_SM3_DIGEST_SIZE); + } + + /* Not testing when the low 32-bit length overflows. */ + + ret = EVP_MD_CTX_cleanup(mdCtx); + ExpectIntEQ(ret, WOLFSSL_SUCCESS); + wolfSSL_EVP_MD_CTX_free(mdCtx); res = EXPECT_RESULT(); #endif - return res; -} +} /* END test_EVP_sm3 */ static int test_EVP_blake2(void) { - int res = TEST_SKIPPED; -#if defined(OPENSSL_EXTRA) && (defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S)) EXPECT_DECLS; +#if defined(OPENSSL_EXTRA) && (defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S)) const EVP_MD* md = NULL; (void)md; @@ -63910,11 +76199,9 @@ ExpectNotNull(md = EVP_blake2s256()); ExpectIntEQ(XSTRNCMP(md, "BLAKE2S256", XSTRLEN("BLAKE2S256")), 0); #endif - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(OPENSSL_EXTRA) @@ -64014,10 +76301,9 @@ static int test_SSL_CIPHER_get_xxx(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) && !defined(NO_CERTS) && \ !defined(NO_FILESYSTEM) - EXPECT_DECLS; const SSL_CIPHER* cipher = NULL; STACK_OF(SSL_CIPHER) *supportedCiphers = NULL; int i, numCiphers = 0; @@ -64142,11 +76428,9 @@ SSL_CTX_free(ctx); SSL_free(ssl); - - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); } #if defined(WOLF_CRYPTO_CB) && defined(HAVE_IO_TESTS_DEPENDENCIES) @@ -64362,12 +76646,13 @@ } /* tlsVer: WOLFSSL_TLSV1_2 or WOLFSSL_TLSV1_3 */ -static void test_wc_CryptoCb_TLS(int tlsVer, +static int test_wc_CryptoCb_TLS(int tlsVer, const char* cliCaPemFile, const char* cliCertPemFile, const char* cliPrivKeyPemFile, const char* cliPubKeyPemFile, const char* svrCaPemFile, const char* svrCertPemFile, const char* svrPrivKeyPemFile, const char* svrPubKeyPemFile) { + EXPECT_DECLS; callback_functions client_cbf; callback_functions server_cbf; @@ -64420,7 +76705,7 @@ if (server_cbf.method == NULL) { /* not enabled */ - return; + return TEST_SUCCESS; } /* Setup the keys for the TLS test */ @@ -64444,28 +76729,32 @@ /* First test is at WOLFSSL_CTX level */ test_wolfSSL_client_server(&client_cbf, &server_cbf); /* Check for success */ - AssertIntEQ(server_cbf.return_code, TEST_SUCCESS); - AssertIntEQ(client_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); - /* Second test is a WOLFSSL object level */ - client_cbf.loadToSSL = 1; server_cbf.loadToSSL = 1; - test_wolfSSL_client_server(&client_cbf, &server_cbf); + if (EXPECT_SUCCESS()) { + /* Second test is a WOLFSSL object level */ + client_cbf.loadToSSL = 1; server_cbf.loadToSSL = 1; + test_wolfSSL_client_server(&client_cbf, &server_cbf); + } /* Check for success */ - AssertIntEQ(server_cbf.return_code, TEST_SUCCESS); - AssertIntEQ(client_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); /* Un register the devId's */ wc_CryptoCb_UnRegisterDevice(client_cbf.devId); client_cbf.devId = INVALID_DEVID; wc_CryptoCb_UnRegisterDevice(server_cbf.devId); server_cbf.devId = INVALID_DEVID; + + return EXPECT_RESULT(); } #endif /* WOLF_CRYPTO_CB && HAVE_IO_TESTS_DEPENDENCIES */ static int test_wc_CryptoCb(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #ifdef WOLF_CRYPTO_CB /* TODO: Add crypto callback API tests */ @@ -64476,43 +76765,45 @@ #ifndef NO_RSA for (tlsVer = WOLFSSL_SSLV3; tlsVer <= WOLFSSL_DTLSV1; tlsVer++) { - test_wc_CryptoCb_TLS(tlsVer, + ExpectIntEQ(test_wc_CryptoCb_TLS(tlsVer, svrCertFile, cliCertFile, cliKeyFile, cliKeyPubFile, - cliCertFile, svrCertFile, svrKeyFile, svrKeyPubFile); + cliCertFile, svrCertFile, svrKeyFile, svrKeyPubFile), + TEST_SUCCESS); } #endif #ifdef HAVE_ECC for (tlsVer = WOLFSSL_TLSV1; tlsVer <= WOLFSSL_DTLSV1; tlsVer++) { - test_wc_CryptoCb_TLS(tlsVer, + ExpectIntEQ(test_wc_CryptoCb_TLS(tlsVer, caEccCertFile, cliEccCertFile, cliEccKeyFile, cliEccKeyPubFile, - cliEccCertFile, eccCertFile, eccKeyFile, eccKeyPubFile); + cliEccCertFile, eccCertFile, eccKeyFile, eccKeyPubFile), + TEST_SUCCESS); } #endif #ifdef HAVE_ED25519 for (tlsVer = WOLFSSL_TLSV1_2; tlsVer <= WOLFSSL_DTLSV1_2; tlsVer++) { if (tlsVer == WOLFSSL_DTLSV1) continue; - test_wc_CryptoCb_TLS(tlsVer, + ExpectIntEQ(test_wc_CryptoCb_TLS(tlsVer, caEdCertFile, cliEdCertFile, cliEdKeyFile, cliEdKeyPubFile, - cliEdCertFile, edCertFile, edKeyFile, edKeyPubFile); + cliEdCertFile, edCertFile, edKeyFile, edKeyPubFile), + TEST_SUCCESS); } #endif #endif /* HAVE_IO_TESTS_DEPENDENCIES */ - - res = TEST_RES_CHECK(1); #endif /* WOLF_CRYPTO_CB */ - return res; + return EXPECT_RESULT(); } #if defined(WOLFSSL_STATIC_MEMORY) && defined(HAVE_IO_TESTS_DEPENDENCIES) /* tlsVer: Example: WOLFSSL_TLSV1_2 or WOLFSSL_TLSV1_3 */ -static void test_wolfSSL_CTX_StaticMemory_TLS(int tlsVer, +static int test_wolfSSL_CTX_StaticMemory_TLS(int tlsVer, const char* cliCaPemFile, const char* cliCertPemFile, const char* cliPrivKeyPemFile, const char* svrCaPemFile, const char* svrCertPemFile, const char* svrPrivKeyPemFile, byte* cliMem, word32 cliMemSz, byte* svrMem, word32 svrMemSz) { + EXPECT_DECLS; callback_functions client_cbf; callback_functions server_cbf; @@ -64565,7 +76856,7 @@ if (server_cbf.method_ex == NULL) { /* not enabled */ - return; + return TEST_SUCCESS; } /* Setup the keys for the TLS test */ @@ -64589,51 +76880,45 @@ /* First test is at WOLFSSL_CTX level */ test_wolfSSL_client_server(&client_cbf, &server_cbf); /* Check for success */ - AssertIntEQ(server_cbf.return_code, TEST_SUCCESS); - AssertIntEQ(client_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); - /* Second test is a WOLFSSL object level */ - client_cbf.loadToSSL = 1; server_cbf.loadToSSL = 1; - test_wolfSSL_client_server(&client_cbf, &server_cbf); + if (EXPECT_SUCCESS()) { + /* Second test is a WOLFSSL object level */ + client_cbf.loadToSSL = 1; server_cbf.loadToSSL = 1; + test_wolfSSL_client_server(&client_cbf, &server_cbf); + } /* Check for success */ - AssertIntEQ(server_cbf.return_code, TEST_SUCCESS); - AssertIntEQ(client_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbf.return_code, TEST_SUCCESS); + ExpectIntEQ(client_cbf.return_code, TEST_SUCCESS); + + return EXPECT_RESULT(); } #endif /* WOLFSSL_STATIC_MEMORY && HAVE_IO_TESTS_DEPENDENCIES */ #if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFCRYPT_ONLY) -#if (defined(HAVE_ECC) && !defined(ALT_ECC_SIZE)) || \ - defined(SESSION_CERTS) - #ifdef OPENSSL_EXTRA - #define TEST_TLS_STATIC_MEMSZ (400000) - #else - #define TEST_TLS_STATIC_MEMSZ (320000) - #endif -#else - #define TEST_TLS_STATIC_MEMSZ (80000) -#endif - static int test_wolfSSL_CTX_StaticMemory_SSL(WOLFSSL_CTX* ctx) { + EXPECT_DECLS; WOLFSSL *ssl1 = NULL, *ssl2 = NULL, *ssl3 = NULL; WOLFSSL_MEM_STATS mem_stats; WOLFSSL_MEM_CONN_STATS ssl_stats; #if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) - AssertIntEQ(wolfSSL_CTX_use_certificate_file(ctx, svrCertFile, + ExpectIntEQ(wolfSSL_CTX_use_certificate_file(ctx, svrCertFile, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, + ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile, WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); #endif - AssertNotNull((ssl1 = wolfSSL_new(ctx))); - AssertNotNull((ssl2 = wolfSSL_new(ctx))); + ExpectNotNull((ssl1 = wolfSSL_new(ctx))); + ExpectNotNull((ssl2 = wolfSSL_new(ctx))); /* this should fail because kMaxCtxClients == 2 */ - AssertNull((ssl3 = wolfSSL_new(ctx))); + ExpectNull((ssl3 = wolfSSL_new(ctx))); if (wolfSSL_is_static_memory(ssl1, &ssl_stats) == 1) { - #ifdef DEBUG_WOLFSSL + #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) wolfSSL_PrintStatsConn(&ssl_stats); #endif (void)ssl_stats; @@ -64641,7 +76926,7 @@ /* display collected statistics */ if (wolfSSL_CTX_is_static_memory(ctx, &mem_stats) == 1) { - #ifdef DEBUG_WOLFSSL + #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) wolfSSL_PrintStats(&mem_stats); #endif (void)mem_stats; @@ -64650,13 +76935,13 @@ wolfSSL_free(ssl1); wolfSSL_free(ssl2); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #endif /* WOLFSSL_STATIC_MEMORY && !WOLFCRYPT_ONLY */ static int test_wolfSSL_CTX_StaticMemory(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFCRYPT_ONLY) wolfSSL_method_func method_func; WOLFSSL_CTX* ctx; @@ -64685,60 +76970,59 @@ /* Test creating CTX directly from static memory pool */ ctx = NULL; - AssertIntEQ(wolfSSL_CTX_load_static_memory( - &ctx, method_func, svrMem, sizeof(svrMem), - 0, kMaxCtxClients), WOLFSSL_SUCCESS); - test_wolfSSL_CTX_StaticMemory_SSL(ctx); + ExpectIntEQ(wolfSSL_CTX_load_static_memory(&ctx, method_func, svrMem, + sizeof(svrMem), 0, kMaxCtxClients), WOLFSSL_SUCCESS); + ExpectIntEQ(test_wolfSSL_CTX_StaticMemory_SSL(ctx), TEST_SUCCESS); wolfSSL_CTX_free(ctx); ctx = NULL; /* Test for heap allocated CTX, then assigning static pool to it */ - AssertNotNull(ctx = wolfSSL_CTX_new(method_func(NULL))); - AssertIntEQ(wolfSSL_CTX_load_static_memory(&ctx, - NULL, svrMem, sizeof(svrMem), - 0, kMaxCtxClients), WOLFSSL_SUCCESS); - test_wolfSSL_CTX_StaticMemory_SSL(ctx); + ExpectNotNull(ctx = wolfSSL_CTX_new(method_func(NULL))); + ExpectIntEQ(wolfSSL_CTX_load_static_memory(&ctx, NULL, svrMem, + sizeof(svrMem), 0, kMaxCtxClients), WOLFSSL_SUCCESS); + ExpectIntEQ(test_wolfSSL_CTX_StaticMemory_SSL(ctx), TEST_SUCCESS); wolfSSL_CTX_free(ctx); /* TLS Level Tests using static memory */ #ifdef HAVE_IO_TESTS_DEPENDENCIES #ifndef NO_RSA for (tlsVer = WOLFSSL_SSLV3; tlsVer <= WOLFSSL_DTLSV1; tlsVer++) { - test_wolfSSL_CTX_StaticMemory_TLS(tlsVer, + ExpectIntEQ(test_wolfSSL_CTX_StaticMemory_TLS(tlsVer, svrCertFile, cliCertFile, cliKeyFile, cliCertFile, svrCertFile, svrKeyFile, - cliMem, (word32)sizeof(cliMem), svrMem, (word32)sizeof(svrMem)); + cliMem, (word32)sizeof(cliMem), svrMem, (word32)sizeof(svrMem)), + TEST_SUCCESS); } #endif #ifdef HAVE_ECC for (tlsVer = WOLFSSL_TLSV1; tlsVer <= WOLFSSL_DTLSV1; tlsVer++) { - test_wolfSSL_CTX_StaticMemory_TLS(tlsVer, + ExpectIntEQ(test_wolfSSL_CTX_StaticMemory_TLS(tlsVer, caEccCertFile, cliEccCertFile, cliEccKeyFile, cliEccCertFile, eccCertFile, eccKeyFile, - cliMem, (word32)sizeof(cliMem), svrMem, (word32)sizeof(svrMem)); + cliMem, (word32)sizeof(cliMem), svrMem, (word32)sizeof(svrMem)), + TEST_SUCCESS); } #endif #ifdef HAVE_ED25519 for (tlsVer = WOLFSSL_TLSV1_2; tlsVer <= WOLFSSL_DTLSV1_2; tlsVer++) { if (tlsVer == WOLFSSL_DTLSV1) continue; - test_wolfSSL_CTX_StaticMemory_TLS(tlsVer, + ExpectIntEQ(test_wolfSSL_CTX_StaticMemory_TLS(tlsVer, caEdCertFile, cliEdCertFile, cliEdKeyFile, cliEdCertFile, edCertFile, edKeyFile, - cliMem, (word32)sizeof(cliMem), svrMem, (word32)sizeof(svrMem)); + cliMem, (word32)sizeof(cliMem), svrMem, (word32)sizeof(svrMem)), + TEST_SUCCESS); } #endif #endif /* HAVE_IO_TESTS_DEPENDENCIES */ - - res = TEST_RES_CHECK(1); #endif /* WOLFSSL_STATIC_MEMORY && !WOLFCRYPT_ONLY */ - return res; + return EXPECT_RESULT(); } static int test_openssl_FIPS_drbg(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_EXTRA) && !defined(WC_NO_RNG) && defined(HAVE_HASHDRBG) - DRBG_CTX* dctx; + DRBG_CTX* dctx = NULL; byte data1[32], data2[32], zeroData[32]; byte testSeed[16]; size_t dlen = sizeof(data1); @@ -64747,52 +77031,48 @@ XMEMSET(data1, 0, dlen); XMEMSET(data2, 0, dlen); XMEMSET(zeroData, 0, sizeof(zeroData)); - for (i=0; i<(int)sizeof(testSeed); i++) { + for (i = 0; i < (int)sizeof(testSeed); i++) { testSeed[i] = (byte)i; } - AssertNotNull(dctx = FIPS_get_default_drbg()); - AssertIntEQ(FIPS_drbg_init(dctx, 0, 0), WOLFSSL_SUCCESS); - AssertIntEQ(FIPS_drbg_set_callbacks(dctx, NULL, NULL, 20, NULL, NULL), + ExpectNotNull(dctx = FIPS_get_default_drbg()); + ExpectIntEQ(FIPS_drbg_init(dctx, 0, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(FIPS_drbg_set_callbacks(dctx, NULL, NULL, 20, NULL, NULL), WOLFSSL_SUCCESS); - AssertIntEQ(FIPS_drbg_instantiate(dctx, NULL, 0), WOLFSSL_SUCCESS); - AssertIntEQ(FIPS_drbg_generate(dctx, data1, dlen, 0, NULL, 0), + ExpectIntEQ(FIPS_drbg_instantiate(dctx, NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(FIPS_drbg_generate(dctx, data1, dlen, 0, NULL, 0), WOLFSSL_SUCCESS); - AssertIntNE(XMEMCMP(data1, zeroData, dlen), 0); - AssertIntEQ(FIPS_drbg_reseed(dctx, testSeed, sizeof(testSeed)), + ExpectIntNE(XMEMCMP(data1, zeroData, dlen), 0); + ExpectIntEQ(FIPS_drbg_reseed(dctx, testSeed, sizeof(testSeed)), WOLFSSL_SUCCESS); - AssertIntEQ(FIPS_drbg_generate(dctx, data2, dlen, 0, NULL, 0), + ExpectIntEQ(FIPS_drbg_generate(dctx, data2, dlen, 0, NULL, 0), WOLFSSL_SUCCESS); - AssertIntNE(XMEMCMP(data1, zeroData, dlen), 0); - AssertIntNE(XMEMCMP(data1, data2, dlen), 0); - AssertIntEQ(FIPS_drbg_uninstantiate(dctx), WOLFSSL_SUCCESS); + ExpectIntNE(XMEMCMP(data1, zeroData, dlen), 0); + ExpectIntNE(XMEMCMP(data1, data2, dlen), 0); + ExpectIntEQ(FIPS_drbg_uninstantiate(dctx), WOLFSSL_SUCCESS); #ifndef HAVE_GLOBAL_RNG /* gets freed by wolfSSL_Cleanup() when HAVE_GLOBAL_RNG defined */ wolfSSL_FIPS_drbg_free(dctx); #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } static int test_wolfSSL_FIPS_mode(void) { - int res = TEST_SKIPPED; + EXPECT_DECLS; #if defined(OPENSSL_ALL) #ifdef HAVE_FIPS - AssertIntEQ(wolfSSL_FIPS_mode(), 1); - AssertIntEQ(wolfSSL_FIPS_mode_set(0), WOLFSSL_FAILURE); - AssertIntEQ(wolfSSL_FIPS_mode_set(1), WOLFSSL_SUCCESS); -#else - AssertIntEQ(wolfSSL_FIPS_mode(), 0); - AssertIntEQ(wolfSSL_FIPS_mode_set(0), WOLFSSL_SUCCESS); - AssertIntEQ(wolfSSL_FIPS_mode_set(1), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_FIPS_mode(), 1); + ExpectIntEQ(wolfSSL_FIPS_mode_set(0), WOLFSSL_FAILURE); + ExpectIntEQ(wolfSSL_FIPS_mode_set(1), WOLFSSL_SUCCESS); +#else + ExpectIntEQ(wolfSSL_FIPS_mode(), 0); + ExpectIntEQ(wolfSSL_FIPS_mode_set(0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_FIPS_mode_set(1), WOLFSSL_FAILURE); #endif - - res = TEST_RES_CHECK(1); #endif - return res; + return EXPECT_RESULT(); } #ifdef WOLFSSL_DTLS @@ -64832,16 +77112,17 @@ * i - expected window[0] */ #define DUW_TEST(a,b,c,d,e,f,g,h,i) do { \ - wolfSSL_DtlsUpdateWindow((a), (b), &(c), &(d), (e)); \ + ExpectIntEQ(wolfSSL_DtlsUpdateWindow((a), (b), &(c), &(d), (e)), 1); \ DUW_TEST_print_window_binary((a), (b), (e)); \ - AssertIntEQ((c), (f)); \ - AssertIntEQ((d), (g)); \ - AssertIntEQ((e)[1], (h)); \ - AssertIntEQ((e)[0], (i)); \ + ExpectIntEQ((c), (f)); \ + ExpectIntEQ((d), (g)); \ + ExpectIntEQ((e)[1], (h)); \ + ExpectIntEQ((e)[0], (i)); \ } while (0) static int test_wolfSSL_DtlsUpdateWindow(void) { + EXPECT_DECLS; word32 window[WOLFSSL_DTLS_WINDOW_WORDS]; word32 next_lo = 0; word16 next_hi = 0; @@ -64884,7 +77165,7 @@ DUW_TEST(150, 0xFFFFFFFF, next_hi, next_lo, window, 151, 0, 0, 0x01); DUW_TEST(152, 0xFFFFFFFF, next_hi, next_lo, window, 153, 0, 0, 0x01); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #endif /* WOLFSSL_DTLS */ @@ -64940,80 +77221,76 @@ return 0; } -static void DFB_TEST_RESET(WOLFSSL* ssl) -{ - DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap); - ssl->dtls_rx_msg_list = NULL; - ssl->dtls_rx_msg_list_sz = 0; -} - static int test_wolfSSL_DTLS_fragment_buckets(void) { + EXPECT_DECLS; WOLFSSL ssl[1]; XMEMSET(ssl, 0, sizeof(*ssl)); - AssertIntEQ(DFB_TEST(ssl, 0, 100, 0, 100, 0, 1, 100), 0); /* 0-100 */ + ExpectIntEQ(DFB_TEST(ssl, 0, 100, 0, 100, 0, 1, 100), 0); /* 0-100 */ - AssertIntEQ(DFB_TEST(ssl, 1, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */ - AssertIntEQ(DFB_TEST(ssl, 1, 100, 20, 20, 1, 0, 40), 0); /* 20-40 */ - AssertIntEQ(DFB_TEST(ssl, 1, 100, 40, 20, 1, 0, 60), 0); /* 40-60 */ - AssertIntEQ(DFB_TEST(ssl, 1, 100, 60, 20, 1, 0, 80), 0); /* 60-80 */ - AssertIntEQ(DFB_TEST(ssl, 1, 100, 80, 20, 0, 1, 100), 0); /* 80-100 */ + ExpectIntEQ(DFB_TEST(ssl, 1, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */ + ExpectIntEQ(DFB_TEST(ssl, 1, 100, 20, 20, 1, 0, 40), 0); /* 20-40 */ + ExpectIntEQ(DFB_TEST(ssl, 1, 100, 40, 20, 1, 0, 60), 0); /* 40-60 */ + ExpectIntEQ(DFB_TEST(ssl, 1, 100, 60, 20, 1, 0, 80), 0); /* 60-80 */ + ExpectIntEQ(DFB_TEST(ssl, 1, 100, 80, 20, 0, 1, 100), 0); /* 80-100 */ /* Test all permutations of 3 regions */ /* 1 2 3 */ - AssertIntEQ(DFB_TEST(ssl, 2, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */ - AssertIntEQ(DFB_TEST(ssl, 2, 100, 30, 30, 1, 0, 60), 0); /* 30-60 */ - AssertIntEQ(DFB_TEST(ssl, 2, 100, 60, 40, 0, 1, 100), 0); /* 60-100 */ + ExpectIntEQ(DFB_TEST(ssl, 2, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */ + ExpectIntEQ(DFB_TEST(ssl, 2, 100, 30, 30, 1, 0, 60), 0); /* 30-60 */ + ExpectIntEQ(DFB_TEST(ssl, 2, 100, 60, 40, 0, 1, 100), 0); /* 60-100 */ /* 1 3 2 */ - AssertIntEQ(DFB_TEST(ssl, 3, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */ - AssertIntEQ(DFB_TEST(ssl, 3, 100, 60, 40, 2, 0, 70), 0); /* 60-100 */ - AssertIntEQ(DFB_TEST(ssl, 3, 100, 30, 30, 0, 1, 100), 0); /* 30-60 */ + ExpectIntEQ(DFB_TEST(ssl, 3, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */ + ExpectIntEQ(DFB_TEST(ssl, 3, 100, 60, 40, 2, 0, 70), 0); /* 60-100 */ + ExpectIntEQ(DFB_TEST(ssl, 3, 100, 30, 30, 0, 1, 100), 0); /* 30-60 */ /* 2 1 3 */ - AssertIntEQ(DFB_TEST(ssl, 4, 100, 30, 30, 1, 0, 30), 0); /* 30-60 */ - AssertIntEQ(DFB_TEST(ssl, 4, 100, 0, 30, 1, 0, 60), 0); /* 0-30 */ - AssertIntEQ(DFB_TEST(ssl, 4, 100, 60, 40, 0, 1, 100), 0); /* 60-100 */ + ExpectIntEQ(DFB_TEST(ssl, 4, 100, 30, 30, 1, 0, 30), 0); /* 30-60 */ + ExpectIntEQ(DFB_TEST(ssl, 4, 100, 0, 30, 1, 0, 60), 0); /* 0-30 */ + ExpectIntEQ(DFB_TEST(ssl, 4, 100, 60, 40, 0, 1, 100), 0); /* 60-100 */ /* 2 3 1 */ - AssertIntEQ(DFB_TEST(ssl, 5, 100, 30, 30, 1, 0, 30), 0); /* 30-60 */ - AssertIntEQ(DFB_TEST(ssl, 5, 100, 60, 40, 1, 0, 70), 0); /* 60-100 */ - AssertIntEQ(DFB_TEST(ssl, 5, 100, 0, 30, 0, 1, 100), 0); /* 0-30 */ + ExpectIntEQ(DFB_TEST(ssl, 5, 100, 30, 30, 1, 0, 30), 0); /* 30-60 */ + ExpectIntEQ(DFB_TEST(ssl, 5, 100, 60, 40, 1, 0, 70), 0); /* 60-100 */ + ExpectIntEQ(DFB_TEST(ssl, 5, 100, 0, 30, 0, 1, 100), 0); /* 0-30 */ /* 3 1 2 */ - AssertIntEQ(DFB_TEST(ssl, 6, 100, 60, 40, 1, 0, 40), 0); /* 60-100 */ - AssertIntEQ(DFB_TEST(ssl, 6, 100, 0, 30, 2, 0, 70), 0); /* 0-30 */ - AssertIntEQ(DFB_TEST(ssl, 6, 100, 30, 30, 0, 1, 100), 0); /* 30-60 */ + ExpectIntEQ(DFB_TEST(ssl, 6, 100, 60, 40, 1, 0, 40), 0); /* 60-100 */ + ExpectIntEQ(DFB_TEST(ssl, 6, 100, 0, 30, 2, 0, 70), 0); /* 0-30 */ + ExpectIntEQ(DFB_TEST(ssl, 6, 100, 30, 30, 0, 1, 100), 0); /* 30-60 */ /* 3 2 1 */ - AssertIntEQ(DFB_TEST(ssl, 7, 100, 60, 40, 1, 0, 40), 0); /* 60-100 */ - AssertIntEQ(DFB_TEST(ssl, 7, 100, 30, 30, 1, 0, 70), 0); /* 30-60 */ - AssertIntEQ(DFB_TEST(ssl, 7, 100, 0, 30, 0, 1, 100), 0); /* 0-30 */ + ExpectIntEQ(DFB_TEST(ssl, 7, 100, 60, 40, 1, 0, 40), 0); /* 60-100 */ + ExpectIntEQ(DFB_TEST(ssl, 7, 100, 30, 30, 1, 0, 70), 0); /* 30-60 */ + ExpectIntEQ(DFB_TEST(ssl, 7, 100, 0, 30, 0, 1, 100), 0); /* 0-30 */ /* Test overlapping regions */ - AssertIntEQ(DFB_TEST(ssl, 8, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */ - AssertIntEQ(DFB_TEST(ssl, 8, 100, 20, 10, 1, 0, 30), 0); /* 20-30 */ - AssertIntEQ(DFB_TEST(ssl, 8, 100, 70, 10, 2, 0, 40), 0); /* 70-80 */ - AssertIntEQ(DFB_TEST(ssl, 8, 100, 20, 30, 2, 0, 60), 0); /* 20-50 */ - AssertIntEQ(DFB_TEST(ssl, 8, 100, 40, 60, 0, 1, 100), 0); /* 40-100 */ + ExpectIntEQ(DFB_TEST(ssl, 8, 100, 0, 30, 1, 0, 30), 0); /* 0-30 */ + ExpectIntEQ(DFB_TEST(ssl, 8, 100, 20, 10, 1, 0, 30), 0); /* 20-30 */ + ExpectIntEQ(DFB_TEST(ssl, 8, 100, 70, 10, 2, 0, 40), 0); /* 70-80 */ + ExpectIntEQ(DFB_TEST(ssl, 8, 100, 20, 30, 2, 0, 60), 0); /* 20-50 */ + ExpectIntEQ(DFB_TEST(ssl, 8, 100, 40, 60, 0, 1, 100), 0); /* 40-100 */ /* Test overlapping multiple regions */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 30, 5, 2, 0, 25), 0); /* 30-35 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 40, 5, 3, 0, 30), 0); /* 40-45 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 50, 5, 4, 0, 35), 0); /* 50-55 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 60, 5, 5, 0, 40), 0); /* 60-65 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 70, 5, 6, 0, 45), 0); /* 70-75 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 30, 25, 4, 0, 55), 0); /* 30-55 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 55, 15, 2, 0, 65), 0); /* 55-70 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 75, 25, 2, 0, 90), 0); /* 75-100 */ - AssertIntEQ(DFB_TEST(ssl, 9, 100, 10, 25, 0, 1, 100), 0); /* 10-35 */ - - AssertIntEQ(DFB_TEST(ssl, 10, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */ - AssertIntEQ(DFB_TEST(ssl, 10, 100, 30, 20, 2, 0, 40), 0); /* 30-50 */ - AssertIntEQ(DFB_TEST(ssl, 10, 100, 0, 40, 1, 0, 50), 0); /* 0-40 */ - AssertIntEQ(DFB_TEST(ssl, 10, 100, 50, 50, 0, 1, 100), 0); /* 10-35 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 30, 5, 2, 0, 25), 0); /* 30-35 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 40, 5, 3, 0, 30), 0); /* 40-45 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 50, 5, 4, 0, 35), 0); /* 50-55 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 60, 5, 5, 0, 40), 0); /* 60-65 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 70, 5, 6, 0, 45), 0); /* 70-75 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 30, 25, 4, 0, 55), 0); /* 30-55 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 55, 15, 2, 0, 65), 0); /* 55-70 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 75, 25, 2, 0, 90), 0); /* 75-100 */ + ExpectIntEQ(DFB_TEST(ssl, 9, 100, 10, 25, 0, 1, 100), 0); /* 10-35 */ + + ExpectIntEQ(DFB_TEST(ssl, 10, 100, 0, 20, 1, 0, 20), 0); /* 0-20 */ + ExpectIntEQ(DFB_TEST(ssl, 10, 100, 30, 20, 2, 0, 40), 0); /* 30-50 */ + ExpectIntEQ(DFB_TEST(ssl, 10, 100, 0, 40, 1, 0, 50), 0); /* 0-40 */ + ExpectIntEQ(DFB_TEST(ssl, 10, 100, 50, 50, 0, 1, 100), 0); /* 10-35 */ - DFB_TEST_RESET(ssl); + DtlsMsgListDelete(ssl->dtls_rx_msg_list, ssl->heap); + ssl->dtls_rx_msg_list = NULL; + ssl->dtls_rx_msg_list_sz = 0; - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #endif @@ -65021,94 +77298,84 @@ #if !defined(NO_FILESYSTEM) && \ defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ - !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ - !defined(NO_RSA) + defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) static int test_wolfSSL_dtls_stateless2(void) { - WOLFSSL *ssl_c = NULL, *ssl_c2 = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_c2 = NULL; + WOLFSSL *ssl_s = NULL; struct test_memio_ctx test_ctx; - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - int ret; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method); - if (ret != 0) - return -1; - ssl_c2 = wolfSSL_new(ctx_c); - if (ssl_c2 == NULL) - return -2; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method), 0); + ExpectNotNull(ssl_c2 = wolfSSL_new(ctx_c)); wolfSSL_SetIOWriteCtx(ssl_c2, &test_ctx); wolfSSL_SetIOReadCtx(ssl_c2, &test_ctx); /* send CH */ - ret = wolfSSL_connect(ssl_c2); - if (ret == 0 || ssl_c2->error != WANT_READ) - return -3; - ret = wolfSSL_accept(ssl_s); - if (ret == 0 || ssl_s->error != WANT_READ) - return -4; - if (test_ctx.c_len == 0) - return -5; + ExpectTrue((wolfSSL_connect(ssl_c2) == WOLFSSL_FATAL_ERROR) && + (ssl_c2->error == WANT_READ)); + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_FATAL_ERROR) && + (ssl_s->error == WANT_READ)); + ExpectIntNE(test_ctx.c_len, 0); /* consume HRR */ test_ctx.c_len = 0; - ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); - if (ret != 0) - return -6; + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + wolfSSL_free(ssl_c2); wolfSSL_free(ssl_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_c); wolfSSL_CTX_free(ctx_s); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #ifdef HAVE_MAX_FRAGMENT static int test_wolfSSL_dtls_stateless_maxfrag(void) { - WOLFSSL *ssl_c = NULL, *ssl_c2 = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_c2 = NULL; + WOLFSSL *ssl_s = NULL; struct test_memio_ctx test_ctx; - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - word16 max_fragment; - int ret; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + word16 max_fragment = 0; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method); - if (ret != 0) - return -1; - ssl_c2 = wolfSSL_new(ctx_c); - if (ssl_c2 == NULL) - return -2; - ret = wolfSSL_UseMaxFragment(ssl_c2, WOLFSSL_MFL_2_8); - if (ret != WOLFSSL_SUCCESS) - return -3; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method), 0); + ExpectNotNull(ssl_c2 = wolfSSL_new(ctx_c)); + ExpectIntEQ(wolfSSL_UseMaxFragment(ssl_c2, WOLFSSL_MFL_2_8), + WOLFSSL_SUCCESS); wolfSSL_SetIOWriteCtx(ssl_c2, &test_ctx); wolfSSL_SetIOReadCtx(ssl_c2, &test_ctx); - max_fragment = ssl_s->max_fragment; - /* send CH */ - ret = wolfSSL_connect(ssl_c2); - if (ret == 0 || ssl_c2->error != WANT_READ) - return -4; - ret = wolfSSL_accept(ssl_s); - if (ret == 0 || ssl_s->error != WANT_READ) - return -5; + if (ssl_s != NULL) { + max_fragment = ssl_s->max_fragment; + } + /* send CH */ + ExpectTrue((wolfSSL_connect(ssl_c2) == WOLFSSL_FATAL_ERROR) && + (ssl_c2->error == WANT_READ)); + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_FATAL_ERROR) && + (ssl_s->error == WANT_READ)); /* CH without cookie shouldn't change state */ - if (ssl_s->max_fragment != max_fragment) - return -6; - if (test_ctx.c_len == 0) - return -7; + ExpectIntEQ(ssl_s->max_fragment, max_fragment); + ExpectIntNE(test_ctx.c_len, 0); + /* consume HRR from buffer */ test_ctx.c_len = 0; - ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); - if (ret != 0) - return -8; + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + wolfSSL_free(ssl_c2); wolfSSL_free(ssl_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_c); wolfSSL_CTX_free(ctx_s); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #endif /* HAVE_MAX_FRAGMENT */ @@ -65125,146 +77392,122 @@ static int _test_wolfSSL_dtls_stateless_resume(byte useticket, byte bad) { + EXPECT_DECLS; struct test_memio_ctx test_ctx; - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; - WOLFSSL_SESSION *sess; - int ret, round_trips; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + WOLFSSL_SESSION *sess = NULL; + int round_trips; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method); - if (ret != 0) - return -1; + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, + &ssl_s, wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method), 0); #ifdef HAVE_SESSION_TICKET if (useticket) { - ret = wolfSSL_UseSessionTicket(ssl_c); - if (ret != WOLFSSL_SUCCESS) - return -2; + ExpectIntEQ(wolfSSL_UseSessionTicket(ssl_c), WOLFSSL_SUCCESS); } #endif round_trips = ROUNDS_WITH_HVR; - ret = test_memio_do_handshake(ssl_c, ssl_s, round_trips, &round_trips); - if (ret != 0) - return -3; - if (round_trips != ROUNDS_WITH_HVR) - return -4; - sess = wolfSSL_get1_session(ssl_c); - if (sess == NULL) - return -5; + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, round_trips, + &round_trips), 0); + ExpectIntEQ(round_trips, ROUNDS_WITH_HVR); + ExpectNotNull(sess = wolfSSL_get1_session(ssl_c)); wolfSSL_shutdown(ssl_c); wolfSSL_shutdown(ssl_s); wolfSSL_free(ssl_c); + ssl_c = NULL; wolfSSL_free(ssl_s); + ssl_s = NULL; + test_ctx.c_len = test_ctx.s_len = 0; /* make resumption invalid */ - if (bad) { + if (bad && (sess != NULL)) { if (useticket) { #ifdef HAVE_SESSION_TICKET - sess->ticket[0] = !sess->ticket[0]; + if (sess->ticket != NULL) { + sess->ticket[0] = !sess->ticket[0]; + } #endif /* HAVE_SESSION_TICKET */ } else { sess->sessionID[0] = !sess->sessionID[0]; } } - ssl_c = wolfSSL_new(ctx_c); - ssl_s = wolfSSL_new(ctx_s); + ExpectNotNull(ssl_c = wolfSSL_new(ctx_c)); + ExpectNotNull(ssl_s = wolfSSL_new(ctx_s)); wolfSSL_SetIOWriteCtx(ssl_c, &test_ctx); wolfSSL_SetIOReadCtx(ssl_c, &test_ctx); wolfSSL_SetIOWriteCtx(ssl_s, &test_ctx); wolfSSL_SetIOReadCtx(ssl_s, &test_ctx); - ret = wolfSSL_set_session(ssl_c, sess); - if (ret != WOLFSSL_SUCCESS) - return -6; - ret = wolfSSL_connect(ssl_c); - if (ret == WOLFSSL_SUCCESS || ssl_c->error != WANT_READ) - return -7; - ret = wolfSSL_accept(ssl_s); - if (ret == WOLFSSL_SUCCESS || ssl_s->error != WANT_READ) - return -8; - if (bad && !buf_is_hvr(test_ctx.c_buff, test_ctx.c_len)) - return -9; - if (!bad && buf_is_hvr(test_ctx.c_buff, test_ctx.c_len)) - return -10; + ExpectIntEQ(wolfSSL_set_session(ssl_c, sess), WOLFSSL_SUCCESS); + ExpectTrue((wolfSSL_connect(ssl_c) == WOLFSSL_FATAL_ERROR) && + (ssl_c->error == WANT_READ)); + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_FATAL_ERROR) && + (ssl_s->error == WANT_READ)); + ExpectFalse(bad && !buf_is_hvr(test_ctx.c_buff, test_ctx.c_len)); + ExpectFalse(!bad && buf_is_hvr(test_ctx.c_buff, test_ctx.c_len)); if (!useticket) { - ret = test_memio_do_handshake(ssl_c, ssl_s, 10, &round_trips); - if (ret != 0) - return -11; - if (bad && round_trips != ROUNDS_WITH_HVR - 1) - return -12; - if (!bad && round_trips != ROUNDS_WITHOUT_HVR - 1) - return -13; + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, &round_trips), 0); + ExpectFalse(bad && round_trips != ROUNDS_WITH_HVR - 1); + ExpectFalse(!bad && round_trips != ROUNDS_WITHOUT_HVR - 1); } wolfSSL_SESSION_free(sess); wolfSSL_free(ssl_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_c); wolfSSL_CTX_free(ctx_s); - return 0; + return EXPECT_RESULT(); } static int test_wolfSSL_dtls_stateless_resume(void) { - int ret; + EXPECT_DECLS; #ifdef HAVE_SESSION_TICKET - ret = _test_wolfSSL_dtls_stateless_resume(1, 0); - if (ret != 0) - return TEST_RES_CHECK(ret); - ret = _test_wolfSSL_dtls_stateless_resume(1, 1); - if (ret != 0) - return TEST_RES_CHECK(ret - 100); + ExpectIntEQ(_test_wolfSSL_dtls_stateless_resume(1, 0), TEST_SUCCESS); + ExpectIntEQ(_test_wolfSSL_dtls_stateless_resume(1, 1), TEST_SUCCESS); #endif /* HAVE_SESION_TICKET */ - ret = _test_wolfSSL_dtls_stateless_resume(0, 0); - if (ret != 0) - return TEST_RES_CHECK(ret - 200); - ret = _test_wolfSSL_dtls_stateless_resume(0, 1); - if (ret != 0) - return TEST_RES_CHECK(ret - 300); - return TEST_RES_CHECK(TEST_SUCCESS); + ExpectIntEQ(_test_wolfSSL_dtls_stateless_resume(0, 0), TEST_SUCCESS); + ExpectIntEQ(_test_wolfSSL_dtls_stateless_resume(0, 1), TEST_SUCCESS); + return EXPECT_RESULT(); } #endif /* WOLFSSL_DTLS_NO_HVR_ON_RESUME */ #if !defined(NO_OLD_TLS) static int test_wolfSSL_dtls_stateless_downgrade(void) { - WOLFSSL_CTX *ctx_c = NULL, *ctx_c2 = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_c2 = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_c2 = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_c2 = NULL; + WOLFSSL *ssl_s = NULL; struct test_memio_ctx test_ctx; - int ret; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method); - if (ret != 0) - return -1; - ret = wolfSSL_CTX_SetMinVersion(ctx_s, WOLFSSL_DTLSV1); - if (ret != WOLFSSL_SUCCESS) - return -2; - ctx_c2 = wolfSSL_CTX_new(wolfDTLSv1_client_method()); - if (ctx_c2 == NULL) - return -3; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method), 0); + ExpectIntEQ(wolfSSL_CTX_SetMinVersion(ctx_s, WOLFSSL_DTLSV1), + WOLFSSL_SUCCESS); + ExpectNotNull(ctx_c2 = wolfSSL_CTX_new(wolfDTLSv1_client_method())); wolfSSL_SetIORecv(ctx_c2, test_memio_read_cb); wolfSSL_SetIOSend(ctx_c2, test_memio_write_cb); - ssl_c2 = wolfSSL_new(ctx_c2); - if (ssl_c2 == NULL) - return -4; + ExpectNotNull(ssl_c2 = wolfSSL_new(ctx_c2)); wolfSSL_SetIOWriteCtx(ssl_c2, &test_ctx); wolfSSL_SetIOReadCtx(ssl_c2, &test_ctx); - /* send CH */ - ret = wolfSSL_connect(ssl_c2); - if (ret == 0 || ssl_c2->error != WANT_READ) - return -5; - ret = wolfSSL_accept(ssl_s); - if (ret == 0 || ssl_s->error != WANT_READ) - return -6; - if (test_ctx.c_len == 0) - return -7; + /* send CH */ + ExpectTrue((wolfSSL_connect(ssl_c2) == WOLFSSL_FATAL_ERROR) && + (ssl_c2->error == WANT_READ)); + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_FATAL_ERROR) && + (ssl_s->error == WANT_READ)); + ExpectIntNE(test_ctx.c_len, 0); /* consume HRR */ test_ctx.c_len = 0; - ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); - if (ret != 0) - return -8; + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + wolfSSL_free(ssl_c2); wolfSSL_free(ssl_c); wolfSSL_free(ssl_s); @@ -65272,62 +77515,54 @@ wolfSSL_CTX_free(ctx_c2); wolfSSL_CTX_free(ctx_s); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #endif /* !defined(NO_OLD_TLS) */ #endif /* defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER)*/ -#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ - !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ - !defined(NO_OLD_TLS) && !defined(NO_RSA) +#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ + !defined(NO_OLD_TLS) && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) static int test_WOLFSSL_dtls_version_alert(void) { + EXPECT_DECLS; struct test_memio_ctx test_ctx; - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; - int ret; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfDTLSv1_2_client_method, wolfDTLSv1_server_method); - if (ret != 0) - return -1; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_2_client_method, wolfDTLSv1_server_method), 0); /* client hello */ - ret = wolfSSL_connect(ssl_c); - if (ret == 0 || ssl_c->error != WANT_READ ) - return -2; + ExpectTrue((wolfSSL_connect(ssl_c) == WOLFSSL_FATAL_ERROR) && + (ssl_c->error == WANT_READ)); /* hrr */ - ret = wolfSSL_accept(ssl_s); - if (ret == 0 || ssl_s->error != WANT_READ ) - return -3; + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_FATAL_ERROR) && + (ssl_s->error == WANT_READ)); /* client hello 1 */ - ret = wolfSSL_connect(ssl_c); - if (ret == 0 || ssl_c->error != WANT_READ ) - return -4; + ExpectTrue((wolfSSL_connect(ssl_c) == WOLFSSL_FATAL_ERROR) && + (ssl_c->error == WANT_READ)); /* server hello */ - ret = wolfSSL_accept(ssl_s); - if (ret == 0 || ssl_s->error != WANT_READ ) - return -5; + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_FATAL_ERROR) && + (ssl_s->error == WANT_READ)); /* should fail */ - ret = wolfSSL_connect(ssl_c); - if (ret == 0 || ssl_c->error != VERSION_ERROR) - return -6; + ExpectTrue((wolfSSL_connect(ssl_c) == WOLFSSL_FATAL_ERROR) && + (ssl_c->error == VERSION_ERROR)); /* shuould fail */ - ret = wolfSSL_accept(ssl_s); - if (ret == 0 || - (ssl_s->error != VERSION_ERROR && ssl_s->error != FATAL_ERROR)) - return -7; + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_FATAL_ERROR) && + (ssl_s->error == VERSION_ERROR || ssl_s->error == FATAL_ERROR)); wolfSSL_free(ssl_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_c); wolfSSL_CTX_free(ctx_s); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #else static int test_WOLFSSL_dtls_version_alert(void) @@ -65342,7 +77577,8 @@ #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && defined(HAVE_SESSION_TICKET) \ && defined(WOLFSSL_TLS13) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))\ + && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) static int send_new_session_ticket(WOLFSSL *ssl, byte nonceLength, byte filler) { struct test_memio_ctx *test_ctx; @@ -65383,147 +77619,127 @@ sz = BuildTls13Message(ssl, buf, 2048, buf+5, idx - 5, handshake, 0, 0, 0); test_ctx = (struct test_memio_ctx*)wolfSSL_GetIOWriteCtx(ssl); + AssertNotNull(test_ctx); ret = test_memio_write_cb(ssl, (char*)buf, sz, test_ctx); return !(ret == sz); } static int test_ticket_nonce_check(WOLFSSL_SESSION *sess, byte len) { - int i; - - if (sess == NULL) - return -1; - - if (sess->ticketNonce.len != len) - return -1; + int ret = 0; - for (i = 0; i < len; i++) - if (sess->ticketNonce.data[i] != len) - return -1; + if ((sess == NULL) || (sess->ticketNonce.len != len)) { + ret = -1; + } + else { + int i; + for (i = 0; i < len; i++) { + if (sess->ticketNonce.data[i] != len) { + ret = -1; + break; + } + } + } - return 0; + return ret; } static int test_ticket_nonce_malloc_do(WOLFSSL *ssl_s, WOLFSSL *ssl_c, byte len) { + EXPECT_DECLS; char *buf[1024]; - int ret; - ret = send_new_session_ticket(ssl_s, len, len); - if (ret != 0) - return -1; + ExpectIntEQ(send_new_session_ticket(ssl_s, len, len), 0); + ExpectTrue((wolfSSL_recv(ssl_c, buf, 1024, 0) == WOLFSSL_FATAL_ERROR) && + (ssl_c->error == WANT_READ)); - ret = wolfSSL_recv(ssl_c, buf, 1024, 0); - if (ret != WOLFSSL_SUCCESS && ssl_c->error != WANT_READ) - return -1; + ExpectIntEQ(test_ticket_nonce_check(ssl_c->session, len), 0); - return test_ticket_nonce_check(ssl_c->session, len); + return EXPECT_RESULT(); } static int test_ticket_nonce_cache(WOLFSSL *ssl_s, WOLFSSL *ssl_c, byte len) { - WOLFSSL_SESSION *sess, *cached; - WOLFSSL_CTX *ctx; - int ret; - - ctx = ssl_c->ctx; + EXPECT_DECLS; + WOLFSSL_SESSION *sess = NULL; + WOLFSSL_SESSION *cached = NULL; + WOLFSSL_CTX *ctx = ssl_c->ctx; - ret = test_ticket_nonce_malloc_do(ssl_s, ssl_c, len); - if (ret != 0) - return -1; - sess = wolfSSL_get1_session(ssl_c); - if (sess == NULL) - return -1; + ExpectIntEQ(test_ticket_nonce_malloc_do(ssl_s, ssl_c, len), TEST_SUCCESS); + ExpectNotNull(sess = wolfSSL_get1_session(ssl_c)); - ret = AddSessionToCache(ctx, sess, sess->sessionID, sess->sessionIDSz, - NULL, ssl_c->options.side, 1,NULL); - if (ret != 0) - return -1; + ExpectIntEQ(AddSessionToCache(ctx, sess, sess->sessionID, sess->sessionIDSz, + NULL, ssl_c->options.side, 1,NULL), 0); - cached = wolfSSL_SESSION_new(); - if (cached == NULL) - return -1; + ExpectNotNull(cached = wolfSSL_SESSION_new()); - ret = wolfSSL_GetSessionFromCache(ssl_c, cached); - if (ret != WOLFSSL_SUCCESS) - return -1; + ExpectIntEQ(wolfSSL_GetSessionFromCache(ssl_c, cached), WOLFSSL_SUCCESS); - ret = test_ticket_nonce_check(cached, len); - if (ret != 0) - return -1; + ExpectIntEQ(test_ticket_nonce_check(cached, len), 0); wolfSSL_SESSION_free(cached); wolfSSL_SESSION_free(sess); - return 0; + return EXPECT_RESULT(); } static int test_ticket_nonce_malloc(void) { + EXPECT_DECLS; struct test_memio_ctx test_ctx; - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; - byte small, medium, big; - int ret; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + byte small; + byte medium; + byte big; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfTLSv1_3_client_method, wolfTLSv1_3_server_method); - if (ret != 0) - return -1; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method), 0); /* will send ticket manually */ - wolfSSL_no_ticket_TLSv13(ssl_s); + ExpectIntEQ(wolfSSL_no_ticket_TLSv13(ssl_s), 0); wolfSSL_set_verify(ssl_s, WOLFSSL_VERIFY_NONE, 0); wolfSSL_set_verify(ssl_c, WOLFSSL_VERIFY_NONE, 0); - while (!ssl_c->options.handShakeDone && !ssl_s->options.handShakeDone) { - ret = wolfSSL_connect(ssl_c); - if (ret != WOLFSSL_SUCCESS && ssl_c->error != WANT_READ) - return -2; - - ret = wolfSSL_accept(ssl_s); - if (ret != WOLFSSL_SUCCESS && ssl_s->error != WANT_READ) - return -3; + while (EXPECT_SUCCESS() && (ssl_c->options.handShakeDone == 0) && + (ssl_s->options.handShakeDone == 0)) { + ExpectTrue((wolfSSL_connect(ssl_c) == WOLFSSL_SUCCESS) || + (ssl_c->error == WANT_READ)); + + ExpectTrue((wolfSSL_accept(ssl_s) == WOLFSSL_SUCCESS) || + (ssl_s->error == WANT_READ)); } small = TLS13_TICKET_NONCE_STATIC_SZ; medium = small + 20 <= 255 ? small + 20 : 255; big = medium + 20 <= 255 ? small + 20 : 255; - if (test_ticket_nonce_malloc_do(ssl_s, ssl_c, small)) - return -1; - if (ssl_c->session->ticketNonce.data != - ssl_c->session->ticketNonce.dataStatic) - return -1; - if (test_ticket_nonce_malloc_do(ssl_s, ssl_c, medium)) - return -1; - if (test_ticket_nonce_malloc_do(ssl_s, ssl_c, big)) - return -1; - if (test_ticket_nonce_malloc_do(ssl_s, ssl_c, medium)) - return -5; - if (test_ticket_nonce_malloc_do(ssl_s, ssl_c, small)) - return -6; - - if (test_ticket_nonce_cache(ssl_s, ssl_c, small)) - return -1; - if (test_ticket_nonce_cache(ssl_s, ssl_c, medium)) - return -1; - if (test_ticket_nonce_cache(ssl_s, ssl_c, big)) - return -1; - if (test_ticket_nonce_cache(ssl_s, ssl_c, medium)) - return -1; - if (test_ticket_nonce_cache(ssl_s, ssl_c, small)) - return -1; + ExpectIntEQ(test_ticket_nonce_malloc_do(ssl_s, ssl_c, small), TEST_SUCCESS); + ExpectPtrEq(ssl_c->session->ticketNonce.data, + ssl_c->session->ticketNonce.dataStatic); + ExpectIntEQ(test_ticket_nonce_malloc_do(ssl_s, ssl_c, medium), + TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_malloc_do(ssl_s, ssl_c, big), TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_malloc_do(ssl_s, ssl_c, medium), + TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_malloc_do(ssl_s, ssl_c, small), TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_cache(ssl_s, ssl_c, small), TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_cache(ssl_s, ssl_c, medium), TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_cache(ssl_s, ssl_c, big), TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_cache(ssl_s, ssl_c, medium), TEST_SUCCESS); + ExpectIntEQ(test_ticket_nonce_cache(ssl_s, ssl_c, small), TEST_SUCCESS); wolfSSL_free(ssl_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_c); wolfSSL_CTX_free(ctx_s); - return 0; + return EXPECT_RESULT(); } #endif /* WOLFSSL_TICKET_NONCE_MALLOC */ @@ -65532,60 +77748,52 @@ !defined(WOLFSSL_TICKET_DECRYPT_NO_CREATE) && \ !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && !defined(NO_RSA) && \ - defined(HAVE_ECC) + defined(HAVE_ECC) && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) static int test_ticket_ret_create(void) { - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; byte ticket[SESSION_TICKET_LEN]; struct test_memio_ctx test_ctx; WOLFSSL_SESSION *sess = NULL; - word16 ticketLen; - int ret; + word16 ticketLen = 0; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfTLSv1_2_client_method, wolfTLSv1_2_server_method); - if (ret != 0) - return TEST_FAIL; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, wolfTLSv1_2_server_method), 0); wolfSSL_set_verify(ssl_s, WOLFSSL_VERIFY_NONE, 0); wolfSSL_set_verify(ssl_c, WOLFSSL_VERIFY_NONE, 0); - wolfSSL_CTX_UseSessionTicket(ctx_c); + ExpectIntEQ(wolfSSL_CTX_UseSessionTicket(ctx_c), WOLFSSL_SUCCESS); - ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); - if (ret != 0) - return TEST_FAIL; + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); - sess = wolfSSL_get1_session(ssl_c); - if (sess->ticketLen > SESSION_TICKET_LEN) - return TEST_FAIL; - ticketLen = sess->ticketLen; - XMEMCPY(ticket, sess->ticket, sess->ticketLen); + ExpectNotNull(sess = wolfSSL_get1_session(ssl_c)); + ExpectIntLE(sess->ticketLen, SESSION_TICKET_LEN); + if (sess != NULL) { + ticketLen = sess->ticketLen; + XMEMCPY(ticket, sess->ticket, sess->ticketLen); + } wolfSSL_free(ssl_c); + ssl_c = NULL; wolfSSL_free(ssl_s); + ssl_s = NULL; - ssl_s = wolfSSL_new(ctx_s); - if (ssl_s == NULL) - return TEST_FAIL; + ExpectNotNull(ssl_s = wolfSSL_new(ctx_s)); wolfSSL_SetIOWriteCtx(ssl_s, &test_ctx); wolfSSL_SetIOReadCtx(ssl_s, &test_ctx); - ssl_c = wolfSSL_new(ctx_c); - if (ssl_c == NULL) - return TEST_FAIL; + ExpectNotNull(ssl_c = wolfSSL_new(ctx_c)); wolfSSL_SetIOWriteCtx(ssl_c, &test_ctx); wolfSSL_SetIOReadCtx(ssl_c, &test_ctx); - wolfSSL_set_session(ssl_c, sess); - ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); - if (ret != 0) - return TEST_FAIL; - if (ssl_c->session->ticketLen > SESSION_TICKET_LEN) - return TEST_FAIL; - if (ssl_c->session->ticketLen != ticketLen) - return TEST_FAIL; - if (XMEMCMP(ssl_c->session->ticket, ticket, ticketLen) == 0) - return TEST_FAIL; + ExpectIntEQ(wolfSSL_set_session(ssl_c, sess), WOLFSSL_SUCCESS); + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + ExpectIntLE(ssl_c->session->ticketLen, SESSION_TICKET_LEN); + ExpectIntEQ(ssl_c->session->ticketLen, ticketLen); + ExpectTrue(XMEMCMP(ssl_c->session->ticket, ticket, ticketLen) != 0); wolfSSL_SESSION_free(sess); wolfSSL_free(ssl_c); @@ -65593,7 +77801,7 @@ wolfSSL_CTX_free(ctx_c); wolfSSL_CTX_free(ctx_s); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #else static int test_ticket_ret_create(void) @@ -65602,14 +77810,16 @@ } #endif -#if defined(WOLFSSL_TLS13) && !defined(NO_PSK) && defined(HAVE_SESSION_TICKET) \ - && defined(OPENSSL_EXTRA) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ - defined(HAVE_AESGCM) && !defined(NO_SHA256) && defined(WOLFSSL_AES_128) && \ +#if defined(WOLFSSL_TLS13) && !defined(NO_PSK) && \ + defined(HAVE_SESSION_TICKET) && defined(OPENSSL_EXTRA) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_AESGCM) && \ + !defined(NO_SHA256) && defined(WOLFSSL_AES_128) && \ defined(WOLFSSL_SHA384) && defined(WOLFSSL_AES_256) static void test_ticket_and_psk_mixing_on_result(WOLFSSL* ssl) { int ret; WOLFSSL_SESSION* session = NULL; + AssertIntEQ(wolfSSL_get_current_cipher_suite(ssl), 0x1301); if (!wolfSSL_is_server(ssl)) { session = wolfSSL_SESSION_dup(wolfSSL_get_session(ssl)); @@ -65639,7 +77849,7 @@ /* Different ciphersuite so that the ticket will be invalidated based on * the ciphersuite */ AssertIntEQ(wolfSSL_set_cipher_list(ssl, "TLS13-AES256-GCM-SHA384"), - WOLFSSL_SUCCESS); + WOLFSSL_SUCCESS); wolfSSL_set_psk_server_tls13_callback(ssl, my_psk_server_tls13_cb); AssertIntEQ(wolfSSL_accept(ssl), WOLFSSL_SUCCESS); } @@ -65649,11 +77859,12 @@ { AssertIntEQ(wolfSSL_UseSessionTicket(ssl), WOLFSSL_SUCCESS); AssertIntEQ(wolfSSL_set_cipher_list(ssl, "TLS13-AES128-GCM-SHA256"), - WOLFSSL_SUCCESS); + WOLFSSL_SUCCESS); } static int test_ticket_and_psk_mixing(void) { + EXPECT_DECLS; /* Test mixing tickets and regular PSK */ callback_functions client_cbs, server_cbs; @@ -65670,10 +77881,10 @@ test_wolfSSL_client_server_nofail(&client_cbs, &server_cbs); - AssertIntEQ(client_cbs.return_code, TEST_SUCCESS); - AssertIntEQ(server_cbs.return_code, TEST_SUCCESS); + ExpectIntEQ(client_cbs.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbs.return_code, TEST_SUCCESS); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #else static int test_ticket_and_psk_mixing(void) @@ -65753,6 +77964,7 @@ static int test_prioritize_psk(void) { + EXPECT_DECLS; /* We always send the ticket first. With WOLFSSL_PRIORITIZE_PSK the order * of the PSK's will be followed instead of the ciphersuite. */ callback_functions client_cbs, server_cbs; @@ -65771,10 +77983,10 @@ test_wolfSSL_client_server_nofail(&client_cbs, &server_cbs); - AssertIntEQ(client_cbs.return_code, TEST_SUCCESS); - AssertIntEQ(server_cbs.return_code, TEST_SUCCESS); + ExpectIntEQ(client_cbs.return_code, TEST_SUCCESS); + ExpectIntEQ(server_cbs.return_code, TEST_SUCCESS); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #else static int test_prioritize_psk(void) @@ -65994,9 +78206,10 @@ } #endif #if defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_TLS12) && \ - defined(HAVE_IO_TESTS_DEPENDENCIES) + defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) -#define TEST_WRONG_CS_CLIENT "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" +#define TEST_WRONG_CS_CLIENT "DHE-RSA-AES128-SHA" +/* AKA TLS_DHE_RSA_WITH_AES_128_CBC_SHA */ byte test_extra_alerts_wrong_cs_sh[] = { 0x16, 0x03, 0x03, 0x00, 0x56, 0x02, 0x00, 0x00, 0x52, 0x03, 0x03, 0xef, @@ -66013,30 +78226,24 @@ static int test_extra_alerts_wrong_cs(void) { + EXPECT_DECLS; +#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA struct test_memio_ctx test_ctx; WOLFSSL_CTX *ctx_c = NULL; WOLFSSL_ALERT_HISTORY h; WOLFSSL *ssl_c = NULL; - int ret, err; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, NULL, &ssl_c, NULL, - wolfTLSv1_2_client_method, NULL); - if (ret != 0) - return TEST_FAIL; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, NULL, &ssl_c, NULL, + wolfTLSv1_2_client_method, NULL), 0); - ret = wolfSSL_set_cipher_list(ssl_c, TEST_WRONG_CS_CLIENT); - if (ret != WOLFSSL_SUCCESS) { - wolfSSL_free(ssl_c); - wolfSSL_CTX_free(ctx_c); - return TEST_SKIPPED; - } + ExpectIntEQ(wolfSSL_set_cipher_list(ssl_c, TEST_WRONG_CS_CLIENT), + WOLFSSL_SUCCESS); /* CH */ - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - if (ret == WOLFSSL_SUCCESS || err != WOLFSSL_ERROR_WANT_READ) - return TEST_FAIL; + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); /* consume CH */ test_ctx.s_len = 0; @@ -66045,22 +78252,17 @@ sizeof(test_extra_alerts_wrong_cs_sh)); test_ctx.c_len = sizeof(test_extra_alerts_wrong_cs_sh); - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - if (ret == WOLFSSL_SUCCESS || err == WOLFSSL_ERROR_WANT_READ) - return TEST_FAIL; - ret = wolfSSL_get_alert_history(ssl_c, &h); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; - if (h.last_tx.code != illegal_parameter) - return TEST_FAIL; - if (h.last_tx.level != alert_fatal) - return TEST_FAIL; + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntNE(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(wolfSSL_get_alert_history(ssl_c, &h), WOLFSSL_SUCCESS); + ExpectIntEQ(h.last_tx.code, handshake_failure); + ExpectIntEQ(h.last_tx.level, alert_fatal); wolfSSL_free(ssl_c); wolfSSL_CTX_free(ctx_c); - - return TEST_SUCCESS; +#endif + return EXPECT_RESULT(); } #else static int test_extra_alerts_wrong_cs(void) @@ -66069,8 +78271,69 @@ } #endif +#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_TLS12) && \ + defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) + +#define TEST_CS_DOWNGRADE_CLIENT "ECDHE-RSA-AES256-GCM-SHA384" + +byte test_wrong_cs_downgrade_sh[] = { + 0x16, 0x03, 0x03, 0x00, 0x56, 0x02, 0x00, 0x00, 0x52, 0x03, 0x03, 0x10, + 0x2c, 0x88, 0xd9, 0x7a, 0x23, 0xc9, 0xbd, 0x11, 0x3b, 0x64, 0x24, 0xab, + 0x5b, 0x45, 0x33, 0xf6, 0x2c, 0x34, 0xe4, 0xcf, 0xf4, 0x78, 0xc8, 0x62, + 0x06, 0xc7, 0xe5, 0x30, 0x39, 0xbf, 0xa1, 0x20, 0xa3, 0x06, 0x74, 0xc3, + 0xa9, 0x74, 0x52, 0x8a, 0xfb, 0xae, 0xf0, 0xd8, 0x6f, 0xb2, 0x9d, 0xfe, + 0x78, 0xf0, 0x3f, 0x51, 0x8f, 0x9c, 0xcf, 0xbe, 0x61, 0x43, 0x9d, 0xf8, + 0x85, 0xe5, 0x2f, 0x54, + 0xc0, 0x2f, /* ECDHE-RSA-AES128-GCM-SHA256 */ + 0x00, 0x00, 0x0a, 0x00, 0x0b, 0x00, + 0x02, 0x01, 0x00, 0x00, 0x17, 0x00, 0x00 +}; + +static int test_wrong_cs_downgrade(void) +{ + EXPECT_DECLS; +#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + struct test_memio_ctx test_ctx; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL *ssl_c = NULL; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, NULL, &ssl_c, NULL, + wolfSSLv23_client_method, NULL), 0); + + ExpectIntEQ(wolfSSL_set_cipher_list(ssl_c, TEST_CS_DOWNGRADE_CLIENT), + WOLFSSL_SUCCESS); + + /* CH */ + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + + /* consume CH */ + test_ctx.s_len = 0; + /* inject SH */ + XMEMCPY(test_ctx.c_buff, test_wrong_cs_downgrade_sh, + sizeof(test_wrong_cs_downgrade_sh)); + test_ctx.c_len = sizeof(test_wrong_cs_downgrade_sh); + + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + MATCH_SUITE_ERROR); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); +#endif + return EXPECT_RESULT(); +} +#else +static int test_wrong_cs_downgrade(void) +{ + return TEST_SKIPPED; +} +#endif + #if !defined(WOLFSSL_NO_TLS12) && defined(WOLFSSL_EXTRA_ALERTS) && \ - defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_SP_MATH) + defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_SP_MATH) static void test_remove_msg(byte *msg, int tail_len, int *len, int msg_length) { @@ -66094,7 +78357,7 @@ word32 hLength; idx = buf; - tail_len = *len; + tail_len = (unsigned int)*len; *found = 0; while (tail_len > _RECORD_HEADER_SZ) { curr = idx; @@ -66149,42 +78412,38 @@ static int test_remove_hs_message(byte hs_message_type, int extra_round, byte alert_type) { - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; struct test_memio_ctx test_ctx; WOLFSSL_ALERT_HISTORY h; - int ret, err; - byte found; + byte found = 0; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfTLSv1_2_client_method, wolfTLSv1_2_server_method); - AssertIntEQ(ret, 0); - - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - AssertIntNE(ret, WOLFSSL_SUCCESS); - AssertIntEQ(err, WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, wolfTLSv1_2_server_method), 0); - ret = wolfSSL_accept(ssl_s); - err = wolfSSL_get_error(ssl_s, ret); - AssertIntNE(ret, WOLFSSL_SUCCESS); - AssertIntEQ(err, WOLFSSL_ERROR_WANT_READ); + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + + ExpectIntNE(wolfSSL_accept(ssl_s), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); if (extra_round) { - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - AssertIntNE(ret, WOLFSSL_SUCCESS); - AssertIntEQ(err, WOLFSSL_ERROR_WANT_READ); + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); /* this will complete handshake from server side */ - ret = wolfSSL_accept(ssl_s); - AssertIntEQ(ret, WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_accept(ssl_s), WOLFSSL_SUCCESS); } - ret = test_remove_hs_msg_from_buffer(test_ctx.c_buff, - &test_ctx.c_len, hs_message_type, &found); - AssertIntEQ(ret, 0); + ExpectIntEQ(test_remove_hs_msg_from_buffer(test_ctx.c_buff, + &test_ctx.c_len, hs_message_type, &found), 0); if (!found) { wolfSSL_free(ssl_c); @@ -66194,44 +78453,37 @@ return TEST_SKIPPED; } - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - AssertIntNE(ret, WOLFSSL_SUCCESS); - AssertIntNE(err, WOLFSSL_ERROR_WANT_READ); - ret = wolfSSL_get_alert_history(ssl_c, &h); - AssertIntEQ(ret, WOLFSSL_SUCCESS); - if (alert_type != 0xff && h.last_tx.code != alert_type) - return TEST_FAIL; - if (h.last_tx.level != alert_fatal) - return TEST_FAIL; + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntNE(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(wolfSSL_get_alert_history(ssl_c, &h), WOLFSSL_SUCCESS); + ExpectTrue(alert_type == 0xff || h.last_tx.code == alert_type); + ExpectIntEQ(h.last_tx.level, alert_fatal); wolfSSL_free(ssl_c); wolfSSL_CTX_free(ctx_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_s); - return TEST_SUCCESS; + return EXPECT_RESULT(); } static int test_extra_alerts_skip_hs(void) { + EXPECT_DECLS; const byte _server_key_exchange = 12; const byte _server_hello = 2; const byte _certificate = 11; - int ret; /* server_hello */ - ret = test_remove_hs_message(_server_hello, 0, - unexpected_message); - AssertIntNE(ret, TEST_FAIL); - ret = test_remove_hs_message(_certificate, 0, - 0xff); - AssertIntNE(ret, TEST_FAIL); - ret = test_remove_hs_message(_server_key_exchange, 0, - unexpected_message); - AssertIntNE(ret, TEST_FAIL); + ExpectIntNE(test_remove_hs_message(_server_hello, 0, + unexpected_message), TEST_FAIL); + ExpectIntNE(test_remove_hs_message(_certificate, 0, + 0xff), TEST_FAIL); + ExpectIntNE(test_remove_hs_message(_server_key_exchange, 0, + unexpected_message), TEST_FAIL); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #else static int test_extra_alerts_skip_hs(void) @@ -66240,8 +78492,8 @@ } #endif -#if !defined(WOLFSSL_NO_TLS12) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ - defined(WOLFSSL_EXTRA_ALERTS) && !defined(NO_PSK) && !defined(NO_DH) +#if !defined(WOLFSSL_NO_TLS12) && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES)\ + && defined(WOLFSSL_EXTRA_ALERTS) && !defined(NO_PSK) && !defined(NO_DH) static unsigned int test_server_psk_cb(WOLFSSL* ssl, const char* id, unsigned char* key, unsigned int key_max_len) @@ -66256,56 +78508,47 @@ static int test_extra_alerts_bad_psk(void) { - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; struct test_memio_ctx test_ctx; WOLFSSL_ALERT_HISTORY h; - int ret, err; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfTLSv1_2_client_method, wolfTLSv1_2_server_method); - if (ret != 0) - return TEST_FAIL; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, wolfTLSv1_2_server_method), 0); - ret = wolfSSL_set_cipher_list(ssl_c, "DHE-PSK-AES128-GCM-SHA256"); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; + ExpectIntEQ(wolfSSL_set_cipher_list(ssl_c, "DHE-PSK-AES128-GCM-SHA256"), + WOLFSSL_SUCCESS); - ret = wolfSSL_set_cipher_list(ssl_s, "DHE-PSK-AES128-GCM-SHA256"); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; + ExpectIntEQ(wolfSSL_set_cipher_list(ssl_s, "DHE-PSK-AES128-GCM-SHA256"), + WOLFSSL_SUCCESS); wolfSSL_set_psk_server_callback(ssl_s, test_server_psk_cb); - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - if (ret == WOLFSSL_SUCCESS || err != WOLFSSL_ERROR_WANT_READ) - return TEST_FAIL; + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); - ret = wolfSSL_accept(ssl_s); - err = wolfSSL_get_error(ssl_s, ret); - if (ret == WOLFSSL_SUCCESS || err != WOLFSSL_ERROR_WANT_READ) - return TEST_FAIL; + ExpectIntNE(wolfSSL_accept(ssl_s), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_s, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - if (ret == WOLFSSL_SUCCESS || err == WOLFSSL_ERROR_WANT_READ) - return TEST_FAIL; - ret = wolfSSL_get_alert_history(ssl_c, &h); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; - if (h.last_tx.code != handshake_failure) - return TEST_FAIL; - if (h.last_tx.level != alert_fatal) - return TEST_FAIL; + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntNE(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(wolfSSL_get_alert_history(ssl_c, &h), WOLFSSL_SUCCESS); + ExpectIntEQ(h.last_tx.code, handshake_failure); + ExpectIntEQ(h.last_tx.level, alert_fatal); wolfSSL_free(ssl_c); wolfSSL_CTX_free(ctx_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_s); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #else static int test_extra_alerts_bad_psk(void) @@ -66314,6 +78557,77 @@ } #endif +#if defined(WOLFSSL_TLS13) && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES)\ + && !defined(NO_PSK) +static unsigned int test_tls13_bad_psk_binder_client_cb(WOLFSSL* ssl, + const char* hint, char* identity, unsigned int id_max_len, + unsigned char* key, unsigned int key_max_len) +{ + (void)ssl; + (void)hint; + (void)key_max_len; + + /* see internal.h MAX_PSK_ID_LEN for PSK identity limit */ + XSTRNCPY(identity, "Client_identity", id_max_len); + + key[0] = 0x20; + return 1; +} + +static unsigned int test_tls13_bad_psk_binder_server_cb(WOLFSSL* ssl, + const char* id, unsigned char* key, unsigned int key_max_len) +{ + (void)ssl; + (void)id; + (void)key_max_len; + /* zero means error */ + key[0] = 0x10; + return 1; +} +#endif + +static int test_tls13_bad_psk_binder(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_TLS13) && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES)\ + && !defined(NO_PSK) + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + WOLFSSL_ALERT_HISTORY h; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method), 0); + + wolfSSL_set_psk_client_callback(ssl_c, test_tls13_bad_psk_binder_client_cb); + wolfSSL_set_psk_server_callback(ssl_s, test_tls13_bad_psk_binder_server_cb); + + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + + ExpectIntNE(wolfSSL_accept(ssl_s), WOLFSSL_SUCCESS); + ExpectIntEQ( wolfSSL_get_error(ssl_s, WOLFSSL_FATAL_ERROR), + BAD_BINDER); + + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + FATAL_ERROR); + ExpectIntEQ(wolfSSL_get_alert_history(ssl_c, &h), WOLFSSL_SUCCESS); + ExpectIntEQ(h.last_rx.code, illegal_parameter); + ExpectIntEQ(h.last_rx.level, alert_fatal); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + #if defined(WOLFSSL_HARDEN_TLS) && !defined(WOLFSSL_NO_TLS12) && \ defined(HAVE_IO_TESTS_DEPENDENCIES) static int test_harden_no_secure_renegotiation_io_cb(WOLFSSL *ssl, char *buf, @@ -66357,6 +78671,7 @@ static int test_harden_no_secure_renegotiation(void) { + EXPECT_DECLS; callback_functions client_cbs, server_cbs; XMEMSET(&client_cbs, 0, sizeof(client_cbs)); @@ -66369,12 +78684,13 @@ server_cbs.on_cleanup = test_harden_no_secure_renegotiation_on_cleanup; test_wolfSSL_client_server_nofail(&client_cbs, &server_cbs); - AssertIntEQ(client_cbs.return_code, TEST_FAIL); - AssertIntEQ(client_cbs.last_err, SECURE_RENEGOTIATION_E); - AssertIntEQ(server_cbs.return_code, TEST_FAIL); - AssertIntEQ(server_cbs.last_err, SOCKET_ERROR_E); + ExpectIntEQ(client_cbs.return_code, TEST_FAIL); + ExpectIntEQ(client_cbs.last_err, SECURE_RENEGOTIATION_E); + ExpectIntEQ(server_cbs.return_code, TEST_FAIL); + ExpectTrue(server_cbs.last_err == SOCKET_ERROR_E || + server_cbs.last_err == FATAL_ERROR); - return TEST_RES_CHECK(1); + return EXPECT_RESULT(); } #else static int test_harden_no_secure_renegotiation(void) @@ -66387,11 +78703,11 @@ static int test_override_alt_cert_chain_cert_cb(int preverify, WOLFSSL_X509_STORE_CTX* store) { - printf("preverify: %d\n", preverify); - printf("store->error: %d\n", store->error); - printf("error reason: %s\n", wolfSSL_ERR_reason_error_string(store->error)); + fprintf(stderr, "preverify: %d\n", preverify); + fprintf(stderr, "store->error: %d\n", store->error); + fprintf(stderr, "error reason: %s\n", wolfSSL_ERR_reason_error_string(store->error)); if (store->error == OCSP_INVALID_STATUS) { - printf("Overriding OCSP error\n"); + fprintf(stderr, "Overriding OCSP error\n"); return 1; } #ifndef WOLFSSL_ALT_CERT_CHAINS @@ -66402,7 +78718,7 @@ || store->error == WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY #endif ) && store->error_depth == store->totalCerts - 1) { - printf("Overriding no signer error only for root cert\n"); + fprintf(stderr, "Overriding no signer error only for root cert\n"); return 1; } #endif @@ -66478,7 +78794,7 @@ XMEMSET(&client_cbs, 0, sizeof(client_cbs)); XMEMSET(&server_cbs, 0, sizeof(server_cbs)); - printf("test config: %d\n", (int)i); + fprintf(stderr, "test config: %d\n", (int)i); client_cbs.ctx_ready = params[i].client_ctx_cb; server_cbs.ctx_ready = params[i].server_ctx_cb; @@ -66499,68 +78815,1086 @@ } #endif -#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) +#if defined(HAVE_RPK) +#define svrRpkCertFile "./certs/rpk/server-cert-rpk.der" +#define clntRpkCertFile "./certs/rpk/client-cert-rpk.der" -static int test_dtls13_bad_epoch_ch(void) +#if defined(WOLFSSL_ALWAYS_VERIFY_CB) && defined(WOLFSSL_TLS13) +static int MyRpkVerifyCb(int mode, WOLFSSL_X509_STORE_CTX* strctx) +{ + int ret = WOLFSSL_SUCCESS; + (void)mode; + (void)strctx; + WOLFSSL_ENTER("MyRpkVerifyCb"); + return ret; +} +#endif /* WOLFSSL_ALWAYS_VERIFY_CB && WOLFSSL_TLS13 */ + +static WC_INLINE int test_rpk_memio_setup( + struct test_memio_ctx *ctx, + WOLFSSL_CTX **ctx_c, + WOLFSSL_CTX **ctx_s, + WOLFSSL **ssl_c, + WOLFSSL **ssl_s, + method_provider method_c, + method_provider method_s, + const char* certfile_c, int fmt_cc, /* client cert file path and format */ + const char* certfile_s, int fmt_cs, /* server cert file path and format */ + const char* pkey_c, int fmt_kc, /* client private key and format */ + const char* pkey_s, int fmt_ks /* server private key and format */ + ) +{ + int ret; + if (ctx_c != NULL && *ctx_c == NULL) { + *ctx_c = wolfSSL_CTX_new(method_c()); + if (*ctx_c == NULL) { + return -1; + } + wolfSSL_CTX_set_verify(*ctx_c, WOLFSSL_VERIFY_PEER, NULL); + + ret = wolfSSL_CTX_load_verify_locations(*ctx_c, caCertFile, 0); + if (ret != WOLFSSL_SUCCESS) { + return -1; + } + wolfSSL_SetIORecv(*ctx_c, test_memio_read_cb); + wolfSSL_SetIOSend(*ctx_c, test_memio_write_cb); + + ret = wolfSSL_CTX_use_certificate_file(*ctx_c, certfile_c, fmt_cc); + if (ret != WOLFSSL_SUCCESS) { + return -1; + } + ret = wolfSSL_CTX_use_PrivateKey_file(*ctx_c, pkey_c, fmt_kc); + if (ret != WOLFSSL_SUCCESS) { + return -1; + } + } + + if (ctx_s != NULL && *ctx_s == NULL) { + *ctx_s = wolfSSL_CTX_new(method_s()); + if (*ctx_s == NULL) { + return -1; + } + wolfSSL_CTX_set_verify(*ctx_s, WOLFSSL_VERIFY_PEER, NULL); + + ret = wolfSSL_CTX_load_verify_locations(*ctx_s, cliCertFile, 0); + if (ret != WOLFSSL_SUCCESS) { + return -1; + } + + ret = wolfSSL_CTX_use_PrivateKey_file(*ctx_s, pkey_s, fmt_ks); + if (ret != WOLFSSL_SUCCESS) { + return -1; + } + ret = wolfSSL_CTX_use_certificate_file(*ctx_s, certfile_s, fmt_cs); + if (ret != WOLFSSL_SUCCESS) { + return -1; + } + wolfSSL_SetIORecv(*ctx_s, test_memio_read_cb); + wolfSSL_SetIOSend(*ctx_s, test_memio_write_cb); + if (ctx->s_ciphers != NULL) { + ret = wolfSSL_CTX_set_cipher_list(*ctx_s, ctx->s_ciphers); + if (ret != WOLFSSL_SUCCESS) { + return -1; + } + } + } + + if (ctx_c != NULL && ssl_c != NULL) { + *ssl_c = wolfSSL_new(*ctx_c); + if (*ssl_c == NULL) { + return -1; + } + wolfSSL_SetIOWriteCtx(*ssl_c, ctx); + wolfSSL_SetIOReadCtx(*ssl_c, ctx); + } + if (ctx_s != NULL && ssl_s != NULL) { + *ssl_s = wolfSSL_new(*ctx_s); + if (*ssl_s == NULL) { + return -1; + } + wolfSSL_SetIOWriteCtx(*ssl_s, ctx); + wolfSSL_SetIOReadCtx(*ssl_s, ctx); +#if !defined(NO_DH) + SetDH(*ssl_s); +#endif + } + + return 0; +} +#endif /* HAVE_RPK */ + +static int test_rpk_set_xxx_cert_type(void) +{ + EXPECT_DECLS; +#if defined(HAVE_RPK) + + char ctype[MAX_CLIENT_CERT_TYPE_CNT + 1]; /* prepare bigger buffer */ + WOLFSSL_CTX* ctx = NULL; + WOLFSSL* ssl = NULL; + int tp; + + ctx = wolfSSL_CTX_new(wolfTLS_client_method()); + ExpectNotNull(ctx); + + ssl = wolfSSL_new(ctx); + ExpectNotNull(ssl); + + /*--------------------------------------------*/ + /* tests for wolfSSL_CTX_set_client_cert_type */ + /*--------------------------------------------*/ + + /* illegal parameter test caces */ + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(NULL, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(ctx, ctype, + sizeof(ctype)), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_RPK; /* set an identical cert type */ + ctype[1] = WOLFSSL_CERT_TYPE_RPK; + + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(ctx, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_X509; + ctype[1] = 10; /* set unknown cert type */ + + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(ctx, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + BAD_FUNC_ARG); + /* pass larger type count */ + ctype[0] = WOLFSSL_CERT_TYPE_RPK; + ctype[1] = WOLFSSL_CERT_TYPE_X509; + ctype[2] = 1; /* pass unacceptable type count */ + + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(ctx, ctype, + MAX_CLIENT_CERT_TYPE_CNT + 1), + BAD_FUNC_ARG); + + /* should accept NULL for type buffer */ + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(ctx, NULL, + MAX_CLIENT_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /* should accept zero for type count */ + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(ctx, ctype, + 0), + WOLFSSL_SUCCESS); + + ExpectIntEQ(wolfSSL_CTX_set_client_cert_type(ctx, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /*--------------------------------------------*/ + /* tests for wolfSSL_CTX_set_server_cert_type */ + /*--------------------------------------------*/ + + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(NULL, ctype, + MAX_SERVER_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(ctx, ctype, + sizeof(ctype)), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_RPK; /* set an identical cert type */ + ctype[1] = WOLFSSL_CERT_TYPE_RPK; + + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(ctx, ctype, + MAX_SERVER_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_X509; + ctype[1] = 10; /* set unknown cert type */ + + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(ctx, ctype, + MAX_SERVER_CERT_TYPE_CNT), + BAD_FUNC_ARG); + /* pass larger type count */ + ctype[0] = WOLFSSL_CERT_TYPE_RPK; + ctype[1] = WOLFSSL_CERT_TYPE_X509; + ctype[2] = 1; /* pass unacceptable type count */ + + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(ctx, ctype, + MAX_SERVER_CERT_TYPE_CNT + 1), + BAD_FUNC_ARG); + + /* should accept NULL for type buffer */ + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(ctx, NULL, + MAX_SERVER_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /* should accept zero for type count */ + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(ctx, ctype, + 0), + WOLFSSL_SUCCESS); + + ExpectIntEQ(wolfSSL_CTX_set_server_cert_type(ctx, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /*--------------------------------------------*/ + /* tests for wolfSSL_set_client_cert_type */ + /*--------------------------------------------*/ + + ExpectIntEQ(wolfSSL_set_client_cert_type(NULL, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl, ctype, + sizeof(ctype)), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_RPK; /* set an identical cert type */ + ctype[1] = WOLFSSL_CERT_TYPE_RPK; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_X509; + ctype[1] = 10; /* set unknown cert type */ + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + BAD_FUNC_ARG); + /* pass larger type count */ + ctype[0] = WOLFSSL_CERT_TYPE_RPK; + ctype[1] = WOLFSSL_CERT_TYPE_X509; + ctype[2] = 1; /* pass unacceptable type count */ + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl, ctype, + MAX_CLIENT_CERT_TYPE_CNT + 1), + BAD_FUNC_ARG); + + /* should accept NULL for type buffer */ + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl, NULL, + MAX_CLIENT_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /* should accept zero for type count */ + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl, ctype, + 0), + WOLFSSL_SUCCESS); + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl, ctype, + MAX_CLIENT_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /*--------------------------------------------*/ + /* tests for wolfSSL_CTX_set_server_cert_type */ + /*--------------------------------------------*/ + + ExpectIntEQ(wolfSSL_set_server_cert_type(NULL, ctype, + MAX_SERVER_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl, ctype, + sizeof(ctype)), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_RPK; /* set an identical cert type */ + ctype[1] = WOLFSSL_CERT_TYPE_RPK; + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl, ctype, + MAX_SERVER_CERT_TYPE_CNT), + BAD_FUNC_ARG); + + ctype[0] = WOLFSSL_CERT_TYPE_X509; + ctype[1] = 10; /* set unknown cert type */ + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl, ctype, + MAX_SERVER_CERT_TYPE_CNT), + BAD_FUNC_ARG); + /* pass larger type count */ + ctype[0] = WOLFSSL_CERT_TYPE_RPK; + ctype[1] = WOLFSSL_CERT_TYPE_X509; + ctype[2] = 1; /* pass unacceptable type count */ + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl, ctype, + MAX_SERVER_CERT_TYPE_CNT + 1), + BAD_FUNC_ARG); + + /* should accept NULL for type buffer */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl, NULL, + MAX_SERVER_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /* should accept zero for type count */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl, ctype, + 0), + WOLFSSL_SUCCESS); + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl, ctype, + MAX_SERVER_CERT_TYPE_CNT), + WOLFSSL_SUCCESS); + + /*------------------------------------------------*/ + /* tests for wolfSSL_get_negotiated_xxx_cert_type */ + /*------------------------------------------------*/ + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(NULL, &tp), + BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl, NULL), + BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(NULL, &tp), + BAD_FUNC_ARG); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl, NULL), + BAD_FUNC_ARG); + + + /* clean up */ + wolfSSL_free(ssl); + wolfSSL_CTX_free(ctx); + +#endif + return EXPECT_RESULT(); +} + +static int test_tls13_rpk_handshake(void) { + EXPECT_DECLS; +#if defined(HAVE_RPK) && (!defined(WOLFSSL_NO_TLS12) || defined(WOLFSSL_TLS13)) +#ifdef WOLFSSL_TLS13 + int ret = 0; +#endif WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; WOLFSSL *ssl_c = NULL, *ssl_s = NULL; struct test_memio_ctx test_ctx; - const int EPOCH_OFF = 3; - int ret, err; + int err; + char certType_c[MAX_CLIENT_CERT_TYPE_CNT]; + char certType_s[MAX_CLIENT_CERT_TYPE_CNT]; + int typeCnt_c; + int typeCnt_s; + int tp = 0; +#if defined(WOLFSSL_ALWAYS_VERIFY_CB) && defined(WOLFSSL_TLS13) + int isServer; +#endif + + (void)err; + (void)typeCnt_c; + (void)typeCnt_s; + (void)certType_c; + (void)certType_s; +#ifndef WOLFSSL_NO_TLS12 + /* TLS1.2 + * Both client and server load x509 cert and start handshaking. + * Check no negotiation occurred. + */ XMEMSET(&test_ctx, 0, sizeof(test_ctx)); - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method); - if (ret != 0) - return TEST_FAIL; - /* disable hrr cookie so we can later check msgsReceived.got_client_hello - * with just one message */ - ret = wolfSSL_disable_hrr_cookie(ssl_s); - if (ret != WOLFSSL_SUCCESS) + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, + cliCertFile, WOLFSSL_FILETYPE_PEM, + svrCertFile, WOLFSSL_FILETYPE_PEM, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM) + , 0); + + + /* set client certificate type in client end */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_c = 2; + + certType_s[0] = WOLFSSL_CERT_TYPE_RPK; + certType_s[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_s = 2; + + /* both client and server do not call client/server_cert_type APIs, + * expecting default settings works and no negotiation performed. + */ + + if (test_memio_do_handshake(ssl_c, ssl_s, 10, NULL) != 0) return TEST_FAIL; - ret = wolfSSL_connect(ssl_c); - err = wolfSSL_get_error(ssl_c, ret); - if (ret == WOLFSSL_SUCCESS || err != WOLFSSL_ERROR_WANT_READ) + /* confirm no negotiation occurred */ + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ((int)tp, WOLFSSL_CERT_TYPE_UNKNOWN); + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + (void)typeCnt_c; + (void)typeCnt_s; + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; +#endif + +#ifdef WOLFSSL_TLS13 + /* Both client and server load x509 cert and start handshaking. + * Check no negotiation occurred. + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + cliCertFile, WOLFSSL_FILETYPE_PEM, + svrCertFile, WOLFSSL_FILETYPE_PEM, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* set client certificate type in client end */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_c = 2; + + certType_s[0] = WOLFSSL_CERT_TYPE_RPK; + certType_s[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_s = 2; + + /* both client and server do not call client/server_cert_type APIs, + * expecting default settings works and no negotiation performed. + */ + + if (test_memio_do_handshake(ssl_c, ssl_s, 10, NULL) != 0) return TEST_FAIL; - if (test_ctx.s_len < EPOCH_OFF + 2) + /* confirm no negotiation occurred */ + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ((int)tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + (void)typeCnt_c; + (void)typeCnt_s; + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; + + + /* Both client and server load RPK cert and start handshaking. + * Confirm negotiated cert types match as expected. + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + clntRpkCertFile, WOLFSSL_FILETYPE_ASN1, + svrRpkCertFile, WOLFSSL_FILETYPE_ASN1, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* set client certificate type in client end */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_c = 2; + + certType_s[0] = WOLFSSL_CERT_TYPE_RPK; + certType_s[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_s = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_c, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* set server certificate type in client end */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_c, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* set client certificate type in server end */ + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_s, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* set server certificate type in server end */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_s, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + if (test_memio_do_handshake(ssl_c, ssl_s, 10, NULL) != 0) return TEST_FAIL; - /* first CH should use epoch 0x0 */ - if (test_ctx.s_buff[EPOCH_OFF] != 0x0 || - test_ctx.s_buff[EPOCH_OFF + 1] != 0x0) + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; +#endif + + +#ifndef WOLFSSL_NO_TLS12 + /* TLS1.2 + * Both client and server load RPK cert and start handshaking. + * Confirm negotiated cert types match as expected. + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, + clntRpkCertFile, WOLFSSL_FILETYPE_ASN1, + svrRpkCertFile, WOLFSSL_FILETYPE_ASN1, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* set client certificate type in client end */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_c = 2; + + certType_s[0] = WOLFSSL_CERT_TYPE_RPK; + certType_s[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_s = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_c, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* set server certificate type in client end */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_c, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* set client certificate type in server end */ + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_s, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* set server certificate type in server end */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_s, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + if (test_memio_do_handshake(ssl_c, ssl_s, 10, NULL) != 0) return TEST_FAIL; - /* change epoch to 2 */ - test_ctx.s_buff[EPOCH_OFF + 1] = 0x2; + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; +#endif + + +#ifdef WOLFSSL_TLS13 + /* Both client and server load x509 cert. + * Have client call set_client_cert_type with both RPK and x509. + * This doesn't makes client add client cert type extension to ClientHello, + * since it does not load RPK cert actually. + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + cliCertFile, WOLFSSL_FILETYPE_PEM, + svrCertFile, WOLFSSL_FILETYPE_PEM, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* set client certificate type in client end + * + * client indicates both RPK and x509 certs are available but loaded RPK + * cert only. It does not have client add client-cert-type extension in CH. + */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_c = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_c, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* client indicates both RPK and x509 certs are acceptable */ + certType_s[0] = WOLFSSL_CERT_TYPE_RPK; + certType_s[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_s = 2; + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_c, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* server indicates both RPK and x509 certs are acceptable */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_c = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_s, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* server should indicate only RPK cert is available */ + certType_s[0] = WOLFSSL_CERT_TYPE_X509; + certType_s[1] = -1; + typeCnt_s = 1; - ret = wolfSSL_accept(ssl_s); - err = wolfSSL_get_error(ssl_s, ret); - if (ret == WOLFSSL_SUCCESS || err != WOLFSSL_ERROR_WANT_READ) + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_s, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + if (test_memio_do_handshake(ssl_c, ssl_s, 10, NULL) != 0) return TEST_FAIL; - if (ssl_s->msgsReceived.got_client_hello == 1) + /* Negotiation for client-cert-type should NOT happen. Therefore -1 should + * be returned as cert type. + */ + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; + + + /* Have client load RPK cert and have server load x509 cert. + * Check the negotiation result from both ends. + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + clntRpkCertFile, WOLFSSL_FILETYPE_ASN1, + svrCertFile, WOLFSSL_FILETYPE_PEM, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* have client tell to use RPK cert */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = -1; + typeCnt_c = 1; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_c, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* have client tell to accept both RPK and x509 cert */ + certType_s[0] = WOLFSSL_CERT_TYPE_X509; + certType_s[1] = WOLFSSL_CERT_TYPE_RPK; + typeCnt_s = 2; + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_c, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* have server accept to both RPK and x509 cert */ + certType_c[0] = WOLFSSL_CERT_TYPE_X509; + certType_c[1] = WOLFSSL_CERT_TYPE_RPK; + typeCnt_c = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_s, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* does not call wolfSSL_set_server_cert_type intentionally in sesrver + * end, expecting the default setting works. + */ + + + if (test_memio_do_handshake(ssl_c, ssl_s, 10, NULL) != 0) return TEST_FAIL; - /* resend the CH */ - ret = wolfSSL_dtls_got_timeout(ssl_c); - if (ret != WOLFSSL_SUCCESS) + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; + + + /* Have both client and server load RPK cert, however, have server + * indicate its cert type x509. + * Client is expected to detect the cert type mismatch then to send alert + * with "unsupported_certificate". + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + clntRpkCertFile, WOLFSSL_FILETYPE_ASN1, + svrRpkCertFile, WOLFSSL_FILETYPE_ASN1, /* server sends RPK cert */ + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* have client tell to use RPK cert */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = -1; + typeCnt_c = 1; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_c, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* have client tell to accept both RPK and x509 cert */ + certType_s[0] = WOLFSSL_CERT_TYPE_X509; + certType_s[1] = WOLFSSL_CERT_TYPE_RPK; + typeCnt_s = 2; + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_c, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* have server accept to both RPK and x509 cert */ + certType_c[0] = WOLFSSL_CERT_TYPE_X509; + certType_c[1] = WOLFSSL_CERT_TYPE_RPK; + typeCnt_c = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_s, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* have server tell to use x509 cert intentionally. This will bring + * certificate type mismatch in client side. + */ + certType_s[0] = WOLFSSL_CERT_TYPE_X509; + certType_s[1] = -1; + typeCnt_s = 1; + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_s, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* expect client detect cert type mismatch then send Alert */ + ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); + if (ret != -1) return TEST_FAIL; + ExpectIntEQ(wolfSSL_get_error(ssl_c, ret), UNSUPPORTED_CERTIFICATE); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; + + + /* Have client load x509 cert and server load RPK cert, + * however, have client indicate its cert type RPK. + * Server is expected to detect the cert type mismatch then to send alert + * with "unsupported_certificate". + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + cliCertFile, WOLFSSL_FILETYPE_PEM, + svrRpkCertFile, WOLFSSL_FILETYPE_ASN1, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* have client tell to use RPK cert intentionally */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = -1; + typeCnt_c = 1; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_c, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* have client tell to accept both RPK and x509 cert */ + certType_s[0] = WOLFSSL_CERT_TYPE_X509; + certType_s[1] = WOLFSSL_CERT_TYPE_RPK; + typeCnt_s = 2; + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_c, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* have server accept to both RPK and x509 cert */ + certType_c[0] = WOLFSSL_CERT_TYPE_X509; + certType_c[1] = WOLFSSL_CERT_TYPE_RPK; + typeCnt_c = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_s, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* have server tell to use x509 cert intentionally. This will bring + * certificate type mismatch in client side. + */ + certType_s[0] = WOLFSSL_CERT_TYPE_X509; + certType_s[1] = -1; + typeCnt_s = 1; + + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_s, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); + + /* expect server detect cert type mismatch then send Alert */ + ExpectIntNE(ret, 0); + err = wolfSSL_get_error(ssl_c, ret); + ExpectIntEQ(err, UNSUPPORTED_CERTIFICATE); + + /* client did not load RPK cert actually, so negotiation did not happen */ + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + /* client did not load RPK cert actually, so negotiation did not happen */ + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_UNKNOWN); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_X509); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; + + +#if defined(WOLFSSL_ALWAYS_VERIFY_CB) + /* Both client and server load RPK cert and set certificate verify + * callbacks then start handshaking. + * Confirm both side can refer the peer's cert. + */ + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ( + test_rpk_memio_setup( + &test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + clntRpkCertFile, WOLFSSL_FILETYPE_ASN1, + svrRpkCertFile, WOLFSSL_FILETYPE_ASN1, + cliKeyFile, WOLFSSL_FILETYPE_PEM, + svrKeyFile, WOLFSSL_FILETYPE_PEM ) + , 0); + + /* set client certificate type in client end */ + certType_c[0] = WOLFSSL_CERT_TYPE_RPK; + certType_c[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_c = 2; + + certType_s[0] = WOLFSSL_CERT_TYPE_RPK; + certType_s[1] = WOLFSSL_CERT_TYPE_X509; + typeCnt_s = 2; + + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_c, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* set server certificate type in client end */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_c, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* set client certificate type in server end */ + ExpectIntEQ(wolfSSL_set_client_cert_type(ssl_s, certType_c, typeCnt_c), + WOLFSSL_SUCCESS); + + /* set server certificate type in server end */ + ExpectIntEQ(wolfSSL_set_server_cert_type(ssl_s, certType_s, typeCnt_s), + WOLFSSL_SUCCESS); + + /* set certificate verify callback to both client and server */ + isServer = 0; + wolfSSL_SetCertCbCtx(ssl_c, &isServer); + wolfSSL_set_verify(ssl_c, SSL_VERIFY_PEER, MyRpkVerifyCb); + + isServer = 1; + wolfSSL_SetCertCbCtx(ssl_c, &isServer); + wolfSSL_set_verify(ssl_s, SSL_VERIFY_PEER, MyRpkVerifyCb); + ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); if (ret != 0) return TEST_FAIL; + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_c, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_client_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + + ExpectIntEQ(wolfSSL_get_negotiated_server_cert_type(ssl_s, &tp), + WOLFSSL_SUCCESS); + ExpectIntEQ(tp, WOLFSSL_CERT_TYPE_RPK); + wolfSSL_free(ssl_c); wolfSSL_CTX_free(ctx_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; +#endif /* WOLFSSL_ALWAYS_VERIFY_CB */ +#endif /* WOLFSSL_TLS13 */ - return TEST_SUCCESS; +#endif /* HAVE_RPK && (!WOLFSSL_NO_TLS12 || WOLFSSL_TLS13) */ + return EXPECT_RESULT(); +} + +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) + + +static int test_dtls13_bad_epoch_ch(void) +{ + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + const int EPOCH_OFF = 3; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method), 0); + + /* disable hrr cookie so we can later check msgsReceived.got_client_hello + * with just one message */ + ExpectIntEQ(wolfSSL_disable_hrr_cookie(ssl_s), WOLFSSL_SUCCESS); + + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + + ExpectIntGE(test_ctx.s_len, EPOCH_OFF + 2); + + /* first CH should use epoch 0x0 */ + ExpectTrue((test_ctx.s_buff[EPOCH_OFF] == 0x0) && + (test_ctx.s_buff[EPOCH_OFF + 1] == 0x0)); + + /* change epoch to 2 */ + test_ctx.s_buff[EPOCH_OFF + 1] = 0x2; + + ExpectIntNE(wolfSSL_accept(ssl_s), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_get_error(ssl_s, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + + ExpectIntNE(ssl_s->msgsReceived.got_client_hello, 1); + + /* resend the CH */ + ExpectIntEQ(wolfSSL_dtls_got_timeout(ssl_c), WOLFSSL_SUCCESS); + + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + + return EXPECT_RESULT(); } #else static int test_dtls13_bad_epoch_ch(void) @@ -66569,9 +79903,92 @@ } #endif +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && !defined(NO_SESSION_CACHE) +static int test_short_session_id_ssl_ready(WOLFSSL* ssl) +{ + EXPECT_DECLS; + WOLFSSL_SESSION *sess = NULL; + /* Setup the session to avoid errors */ + ssl->session->timeout = -1; + ssl->session->side = WOLFSSL_CLIENT_END; +#if defined(SESSION_CERTS) || (defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET)) + ssl->session->version = ssl->version; +#endif + /* Force a short session ID to be sent */ + ssl->session->sessionIDSz = 4; +#ifndef NO_SESSION_CACHE_REF + /* Allow the client cache to be used */ + ssl->session->idLen = 4; +#endif + ssl->session->isSetup = 1; + ExpectNotNull(sess = wolfSSL_get_session(ssl)); + ExpectIntEQ(wolfSSL_set_session(ssl, sess), WOLFSSL_SUCCESS); + return EXPECT_RESULT(); +} + +static int test_short_session_id(void) +{ + EXPECT_DECLS; + test_ssl_cbf client_cbf; + test_ssl_cbf server_cbf; + size_t i; + struct { + method_provider client_meth; + method_provider server_meth; + const char* tls_version; + } params[] = { +#if defined(WOLFSSL_TLS13) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) && \ + defined(HAVE_SESSION_TICKET) && defined(WOLFSSL_TICKET_HAVE_ID) && \ + !defined(WOLFSSL_TLS13_MIDDLEBOX_COMPAT) +/* With WOLFSSL_TLS13_MIDDLEBOX_COMPAT a short ID will result in an error */ + { wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3" }, +#ifdef WOLFSSL_DTLS13 + { wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3" }, +#endif +#endif +#ifndef WOLFSSL_NO_TLS12 + { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLSv1_2" }, +#ifdef WOLFSSL_DTLS + { wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, "DTLSv1_2" }, +#endif +#endif +#if !defined(NO_OLD_TLS) && ((!defined(NO_AES) && !defined(NO_AES_CBC)) || \ + !defined(NO_DES3)) + { wolfTLSv1_1_client_method, wolfTLSv1_1_server_method, "TLSv1_1" }, +#ifdef WOLFSSL_DTLS + { wolfDTLSv1_client_method, wolfDTLSv1_server_method, "DTLSv1_0" }, +#endif +#endif + }; + + fprintf(stderr, "\n"); + + for (i = 0; i < sizeof(params)/sizeof(*params) && !EXPECT_FAIL(); i++) { + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + + fprintf(stderr, "\tTesting short ID with %s\n", params[i].tls_version); + + client_cbf.ssl_ready = test_short_session_id_ssl_ready; + client_cbf.method = params[i].client_meth; + server_cbf.method = params[i].server_meth; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, + &server_cbf, NULL), TEST_SUCCESS); + } + + return EXPECT_RESULT(); +} +#else +static int test_short_session_id(void) +{ + return TEST_SKIPPED; +} +#endif -#if defined(HAVE_NULL_CIPHER) && defined(HAVE_IO_TESTS_DEPENDENCIES) && \ - defined(WOLFSSL_DTLS13) +#if defined(HAVE_NULL_CIPHER) && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) \ + && defined(WOLFSSL_DTLS13) static byte* test_find_string(const char *string, byte *buf, int buf_size) { @@ -66587,44 +80004,38 @@ static int test_wolfSSL_dtls13_null_cipher(void) { - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; struct test_memio_ctx test_ctx; const char *test_str = "test"; - int ret, test_str_size; - byte buf[255], *ptr; + int test_str_size; + byte buf[255], *ptr = NULL; XMEMSET(&test_ctx, 0, sizeof(test_ctx)); test_ctx.c_ciphers = test_ctx.s_ciphers = "TLS13-SHA256-SHA256"; - ret = test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, - wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method); - if (ret != 0) - return TEST_FAIL; - ret = test_memio_do_handshake(ssl_c, ssl_s, 10, NULL); - if (ret != 0) - return TEST_FAIL; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method), 0); + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); test_str_size = XSTRLEN("test") + 1; - ret = wolfSSL_write(ssl_c, test_str, test_str_size); - if (ret != test_str_size) - return TEST_FAIL; - ret = wolfSSL_read(ssl_s, buf, sizeof(buf)); - if (ret != test_str_size || XSTRCMP((char*)buf, test_str) != 0) - return TEST_FAIL; + ExpectIntEQ(wolfSSL_write(ssl_c, test_str, test_str_size), test_str_size); + ExpectIntEQ(wolfSSL_read(ssl_s, buf, sizeof(buf)), test_str_size); + ExpectIntEQ(XSTRCMP((char*)buf, test_str), 0); - ret = wolfSSL_write(ssl_c, test_str, test_str_size); - if (ret != test_str_size) - return TEST_FAIL; + ExpectIntEQ(wolfSSL_write(ssl_c, test_str, test_str_size), test_str_size); /* check that the packet was sent cleartext */ - ptr = test_find_string(test_str, test_ctx.s_buff, test_ctx.s_len); - if (ptr == NULL) - return TEST_FAIL; - /* modify the message */ - *ptr = 'H'; - /* bad messages should be ignored in DTLS */ - ret = wolfSSL_read(ssl_s, buf, sizeof(buf)); - if (ret != -1 || ssl_s->error != WANT_READ) - return TEST_FAIL; + ExpectNotNull(ptr = test_find_string(test_str, test_ctx.s_buff, + test_ctx.s_len)); + if (ptr != NULL) { + /* modify the message */ + *ptr = 'H'; + /* bad messages should be ignored in DTLS */ + ExpectIntEQ(wolfSSL_read(ssl_s, buf, sizeof(buf)), -1); + ExpectIntEQ(ssl_s->error, WANT_READ); + } wolfSSL_free(ssl_c); wolfSSL_free(ssl_s); @@ -66710,6 +80121,7 @@ * is done in test_dtls_msg_from_other_peer_cb */ static int test_dtls_msg_from_other_peer(void) { + EXPECT_DECLS; callback_functions client_cbs; callback_functions server_cbs; @@ -66724,11 +80136,10 @@ test_wolfSSL_client_server_nofail_ex(&client_cbs, &server_cbs, test_dtls_msg_from_other_peer_cb); - if (client_cbs.return_code != WOLFSSL_SUCCESS || - server_cbs.return_code != WOLFSSL_SUCCESS) - return TEST_FAIL; + ExpectIntEQ(client_cbs.return_code, WOLFSSL_SUCCESS); + ExpectIntEQ(server_cbs.return_code, WOLFSSL_SUCCESS); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #else static int test_dtls_msg_from_other_peer(void) @@ -66740,76 +80151,55 @@ * !defined(SINGLE_THREADED) && !defined(NO_RSA) */ #if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_IPV6) && \ !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ - defined(HAVE_IO_TESTS_DEPENDENCIES) + defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_NO_TLS12) static int test_dtls_ipv6_check(void) { - WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; - WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + EXPECT_DECLS; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; SOCKADDR_IN fake_addr6; - int sockfd; - int ret; + int sockfd = -1; - ctx_c = wolfSSL_CTX_new(wolfDTLSv1_2_client_method()); - if (ctx_c == NULL) - return TEST_FAIL; - ssl_c = wolfSSL_new(ctx_c); - if (ssl_c == NULL) - return TEST_FAIL; - ctx_s = wolfSSL_CTX_new(wolfDTLSv1_2_server_method()); - if (ctx_s == NULL) - return TEST_FAIL; - ret = wolfSSL_CTX_use_PrivateKey_file(ctx_s, svrKeyFile, - WOLFSSL_FILETYPE_PEM); - if (ret != WOLFSSL_SUCCESS) - return- -1; - ret = wolfSSL_CTX_use_certificate_file(ctx_s, svrCertFile, - WOLFSSL_FILETYPE_PEM); - if (ret != WOLFSSL_SUCCESS) - return -1; - ssl_s = wolfSSL_new(ctx_s); - if (ssl_s == NULL) - return TEST_FAIL; + ExpectNotNull(ctx_c = wolfSSL_CTX_new(wolfDTLSv1_2_client_method())); + ExpectNotNull(ssl_c = wolfSSL_new(ctx_c)); + ExpectNotNull(ctx_s = wolfSSL_CTX_new(wolfDTLSv1_2_server_method())); + ExpectIntEQ(wolfSSL_CTX_use_PrivateKey_file(ctx_s, svrKeyFile, + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_use_certificate_file(ctx_s, svrCertFile, + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + ExpectNotNull(ssl_s = wolfSSL_new(ctx_s)); XMEMSET((byte*)&fake_addr6, 0, sizeof(fake_addr6)); /* mimic a sockaddr_in6 struct, this way we can't test without * WOLFSSL_IPV6 */ fake_addr6.sin_family = WOLFSSL_IP6; - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd == -1) - return TEST_FAIL; - ret = wolfSSL_set_fd(ssl_c, sockfd); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; + ExpectIntNE(sockfd = socket(AF_INET, SOCK_DGRAM, 0), -1); + ExpectIntEQ(wolfSSL_set_fd(ssl_c, sockfd), WOLFSSL_SUCCESS); /* can't return error here, as the peer is opaque for wolfssl library at * this point */ - ret = wolfSSL_dtls_set_peer(ssl_c, &fake_addr6, sizeof(fake_addr6)); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; - ret = fcntl(sockfd, F_SETFL, O_NONBLOCK); - if (ret == -1) - return TEST_FAIL; + ExpectIntEQ(wolfSSL_dtls_set_peer(ssl_c, &fake_addr6, sizeof(fake_addr6)), + WOLFSSL_SUCCESS); + ExpectIntNE(fcntl(sockfd, F_SETFL, O_NONBLOCK), -1); wolfSSL_dtls_set_using_nonblock(ssl_c, 1); - ret = wolfSSL_connect(ssl_c); - if (ret != WOLFSSL_FAILURE && ssl_c->error != SOCKET_ERROR_E) - return TEST_FAIL; + ExpectIntNE(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + ExpectIntEQ(ssl_c->error, SOCKET_ERROR_E); - ret = wolfSSL_dtls_set_peer(ssl_s, &fake_addr6, sizeof(fake_addr6)); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; - /* re-use the socket */ - ret = wolfSSL_set_fd(ssl_c, sockfd); - if (ret != WOLFSSL_SUCCESS) - return TEST_FAIL; + ExpectIntEQ(wolfSSL_dtls_set_peer(ssl_s, &fake_addr6, sizeof(fake_addr6)), + WOLFSSL_SUCCESS); + /* reuse the socket */ + ExpectIntEQ(wolfSSL_set_fd(ssl_c, sockfd), WOLFSSL_SUCCESS); wolfSSL_dtls_set_using_nonblock(ssl_s, 1); - ret = wolfSSL_accept(ssl_s); - if (ret != WOLFSSL_FAILURE && ssl_s->error != SOCKET_ERROR_E) - return TEST_FAIL; - close(sockfd); + ExpectIntNE(wolfSSL_accept(ssl_s), WOLFSSL_SUCCESS); + ExpectIntEQ(ssl_s->error, SOCKET_ERROR_E); + if (sockfd != -1) + close(sockfd); wolfSSL_free(ssl_c); wolfSSL_CTX_free(ctx_c); wolfSSL_free(ssl_s); wolfSSL_CTX_free(ctx_s); - return TEST_SUCCESS; + return EXPECT_RESULT(); } #else static int test_dtls_ipv6_check(void) @@ -66818,16 +80208,2483 @@ } #endif +#if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_SECURE_RENEGOTIATION) + +static WOLFSSL_SESSION* test_wolfSSL_SCR_after_resumption_session = NULL; + +static void test_wolfSSL_SCR_after_resumption_ctx_ready(WOLFSSL_CTX* ctx) +{ + AssertIntEQ(wolfSSL_CTX_UseSecureRenegotiation(ctx), WOLFSSL_SUCCESS); +} + +static void test_wolfSSL_SCR_after_resumption_on_result(WOLFSSL* ssl) +{ + if (test_wolfSSL_SCR_after_resumption_session == NULL) { + test_wolfSSL_SCR_after_resumption_session = wolfSSL_get1_session(ssl); + AssertNotNull(test_wolfSSL_SCR_after_resumption_session); + } + else { + char testMsg[] = "Message after SCR"; + char msgBuf[sizeof(testMsg)]; + int ret; + if (!wolfSSL_is_server(ssl)) { + AssertIntEQ(WOLFSSL_SUCCESS, + wolfSSL_set_session(ssl, + test_wolfSSL_SCR_after_resumption_session)); + } + AssertIntEQ(wolfSSL_Rehandshake(ssl), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_write(ssl, testMsg, sizeof(testMsg)), + sizeof(testMsg)); + ret = wolfSSL_read(ssl, msgBuf, sizeof(msgBuf)); + if (ret != sizeof(msgBuf)) /* Possibly APP_DATA_READY error. Retry. */ + ret = wolfSSL_read(ssl, msgBuf, sizeof(msgBuf)); + AssertIntEQ(ret, sizeof(msgBuf)); + } +} + +static void test_wolfSSL_SCR_after_resumption_ssl_ready(WOLFSSL* ssl) +{ + AssertIntEQ(WOLFSSL_SUCCESS, + wolfSSL_set_session(ssl, test_wolfSSL_SCR_after_resumption_session)); +} + +static int test_wolfSSL_SCR_after_resumption(void) +{ + EXPECT_DECLS; + callback_functions func_cb_client; + callback_functions func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + + func_cb_client.method = wolfTLSv1_2_client_method; + func_cb_client.ctx_ready = test_wolfSSL_SCR_after_resumption_ctx_ready; + func_cb_client.on_result = test_wolfSSL_SCR_after_resumption_on_result; + func_cb_server.method = wolfTLSv1_2_server_method; + func_cb_server.ctx_ready = test_wolfSSL_SCR_after_resumption_ctx_ready; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); + + func_cb_client.ssl_ready = test_wolfSSL_SCR_after_resumption_ssl_ready; + func_cb_server.on_result = test_wolfSSL_SCR_after_resumption_on_result; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); + + wolfSSL_SESSION_free(test_wolfSSL_SCR_after_resumption_session); + + return EXPECT_RESULT(); +} + +#else +static int test_wolfSSL_SCR_after_resumption(void) +{ + return TEST_SKIPPED; +} +#endif + static int test_wolfSSL_configure_args(void) { - int res = TEST_SKIPPED; -#if defined(LIBWOLFSSL_CONFIGURE_ARGS) && defined(HAVE_WC_INTROSPECTION) EXPECT_DECLS; +#if defined(LIBWOLFSSL_CONFIGURE_ARGS) && defined(HAVE_WC_INTROSPECTION) ExpectNotNull(wolfSSL_configure_args()); - res = EXPECT_RESULT(); #endif - return res; + return EXPECT_RESULT(); +} + +static int test_dtls_no_extensions(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_DTLS) && defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && \ + !defined(WOLFSSL_NO_TLS12) + WOLFSSL *ssl_s = NULL; + WOLFSSL_CTX *ctx_s = NULL; + struct test_memio_ctx test_ctx; + const byte chNoExtensions[] = { + /* Handshake type */ + 0x16, + /* Version */ + 0xfe, 0xff, + /* Epoch */ + 0x00, 0x00, + /* Seq number */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* Length */ + 0x00, 0x40, + /* CH type */ + 0x01, + /* Length */ + 0x00, 0x00, 0x34, + /* Msg Seq */ + 0x00, 0x00, + /* Frag offset */ + 0x00, 0x00, 0x00, + /* Frag length */ + 0x00, 0x00, 0x34, + /* Version */ + 0xfe, 0xff, + /* Random */ + 0x62, 0xfe, 0xbc, 0xfe, 0x2b, 0xfe, 0x3f, 0xeb, 0x03, 0xc4, 0xea, 0x37, + 0xe7, 0x47, 0x7e, 0x8a, 0xd9, 0xbf, 0x77, 0x0f, 0x6c, 0xb6, 0x77, 0x0b, + 0x03, 0x3f, 0x82, 0x2b, 0x21, 0x64, 0x57, 0x1d, + /* Session Length */ + 0x00, + /* Cookie Length */ + 0x00, + /* CS Length */ + 0x00, 0x0c, + /* CS */ + 0xc0, 0x0a, 0xc0, 0x09, 0xc0, 0x14, 0xc0, 0x13, 0x00, 0x39, 0x00, 0x33, + /* Comp Meths Length */ + 0x01, + /* Comp Meths */ + 0x00 + /* And finally... no extensions */ + }; + int i; +#ifdef OPENSSL_EXTRA + int repeats = 2; +#else + int repeats = 1; +#endif + + for (i = 0; i < repeats; i++) { + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ssl_s = NULL; + ctx_s = NULL; + + ExpectIntEQ(test_memio_setup(&test_ctx, NULL, &ctx_s, NULL, &ssl_s, + NULL, wolfDTLS_server_method), 0); + + XMEMCPY(test_ctx.s_buff, chNoExtensions, sizeof(chNoExtensions)); + test_ctx.s_len = sizeof(chNoExtensions); + +#ifdef OPENSSL_EXTRA + if (i > 0) { + ExpectIntEQ(wolfSSL_set_max_proto_version(ssl_s, DTLS1_2_VERSION), + WOLFSSL_SUCCESS); + } +#endif + + ExpectIntEQ(wolfSSL_accept(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + + /* Expecting a handshake msg. Either HVR or SH. */ + ExpectIntGT(test_ctx.c_len, 0); + ExpectIntEQ(test_ctx.c_buff[0], 0x16); + + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); + } +#endif + return EXPECT_RESULT(); +} + +static int test_tls_alert_no_server_hello(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_NO_TLS12) + WOLFSSL *ssl_c = NULL; + WOLFSSL_CTX *ctx_c = NULL; + struct test_memio_ctx test_ctx; + unsigned char alert_msg[] = { 0x15, 0x03, 0x01, 0x00, 0x02, 0x02, 0x28 }; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ssl_c = NULL; + ctx_c = NULL; + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, NULL, &ssl_c, NULL, + wolfTLSv1_2_client_method, NULL), 0); + + XMEMCPY(test_ctx.c_buff, alert_msg, sizeof(alert_msg)); + test_ctx.c_len = sizeof(alert_msg); + + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), FATAL_ERROR); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); +#endif + return EXPECT_RESULT(); +} + +static int test_TLSX_CA_NAMES_bad_extension(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_TLS13) && \ + !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) && \ + defined(OPENSSL_EXTRA) && defined(WOLFSSL_SHA384) && \ + defined(HAVE_NULL_CIPHER) + /* This test should only fail (with BUFFER_ERROR) when we actually try to + * parse the CA Names extension. Otherwise it will return other non-related + * errors. If CA Names will be parsed in more configurations, that should + * be reflected in the macro guard above. */ + WOLFSSL *ssl_c = NULL; + WOLFSSL_CTX *ctx_c = NULL; + struct test_memio_ctx test_ctx; + /* HRR + SH using TLS_DHE_PSK_WITH_NULL_SHA384 */ + const byte shBadCaNamesExt[] = { + 0x16, 0x03, 0x04, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x3b, 0x03, 0x03, 0xcf, + 0x21, 0xad, 0x74, 0xe5, 0x9a, 0x61, 0x11, 0xbe, 0x1d, 0x8c, 0x02, 0x1e, + 0x65, 0xb8, 0x91, 0xc2, 0xa2, 0x11, 0x16, 0x7a, 0xbb, 0x8c, 0x5e, 0x07, + 0x9e, 0x09, 0xe2, 0xc8, 0xa8, 0x33, 0x9c, 0x00, 0x13, 0x03, 0x00, 0x00, + 0x13, 0x94, 0x7e, 0x00, 0x03, 0x0b, 0xf7, 0x03, 0x00, 0x2b, 0x00, 0x02, + 0x03, 0x04, 0x00, 0x33, 0x00, 0x02, 0x00, 0x19, 0x16, 0x03, 0x03, 0x00, + 0x5c, 0x02, 0x00, 0x00, 0x3b, 0x03, 0x03, 0x03, 0xcf, 0x21, 0xad, 0x74, + 0x00, 0x00, 0x83, 0x3f, 0x3b, 0x80, 0x01, 0xac, 0x65, 0x8c, 0x19, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x02, 0x00, 0x9e, 0x09, 0x1c, 0xe8, + 0xa8, 0x09, 0x9c, 0x00, 0xc0, 0xb5, 0x00, 0x00, 0x11, 0x8f, 0x00, 0x00, + 0x03, 0x3f, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x02, 0x03, 0x04, 0x13, 0x05, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0d, 0x00, 0x2f, 0x00, 0x01, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0d, 0x00, 0x00, 0x00, 0xad, 0x02 + }; + const byte shBadCaNamesExt2[] = { + 0x16, 0x03, 0x04, 0x00, 0x3f, 0x02, 0x00, 0x00, 0x3b, 0x03, 0x03, 0xcf, + 0x21, 0xad, 0x74, 0xe5, 0x9a, 0x61, 0x11, 0xbe, 0x1d, 0x8c, 0x02, 0x1e, + 0x65, 0xb8, 0x91, 0xc2, 0xa2, 0x11, 0x16, 0x7a, 0xbb, 0x8c, 0x5e, 0x07, + 0x9e, 0x09, 0xe2, 0xc8, 0xa8, 0x33, 0x9c, 0x00, 0x13, 0x03, 0x00, 0x00, + 0x13, 0x94, 0x7e, 0x00, 0x03, 0x0b, 0xf7, 0x03, 0x00, 0x2b, 0x00, 0x02, + 0x03, 0x04, 0x00, 0x33, 0x00, 0x02, 0x00, 0x19, 0x16, 0x03, 0x03, 0x00, + 0x5e, 0x02, 0x00, 0x00, 0x3b, 0x03, 0x03, 0x7f, 0xd0, 0x2d, 0xea, 0x6e, + 0x53, 0xa1, 0x6a, 0xc9, 0xc8, 0x54, 0xef, 0x75, 0xe4, 0xd9, 0xc6, 0x3e, + 0x74, 0xcb, 0x30, 0x80, 0xcc, 0x83, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc0, 0x5a, 0x00, 0xc0, 0xb5, 0x00, 0x00, 0x11, 0x8f, 0x00, 0x00, + 0x03, 0x03, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x02, 0x03, 0x04, 0x53, 0x25, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x06, 0x00, 0x04, 0x02, 0x05, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x11, 0x00, 0x00, 0x0d, 0x00, 0x2f, 0x00, 0x06, 0x00, + 0x04, 0x00, 0x03, 0x30, 0x00, 0x13, 0x94, 0x00, 0x06, 0x00, 0x04, 0x02 + }; + int i = 0; + + for (i = 0; i < 2; i++) { + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, NULL, &ssl_c, NULL, + wolfTLSv1_3_client_method, NULL), 0); + + switch (i) { + case 0: + XMEMCPY(test_ctx.c_buff, shBadCaNamesExt, + sizeof(shBadCaNamesExt)); + test_ctx.c_len = sizeof(shBadCaNamesExt); + break; + case 1: + XMEMCPY(test_ctx.c_buff, shBadCaNamesExt2, + sizeof(shBadCaNamesExt2)); + test_ctx.c_len = sizeof(shBadCaNamesExt2); + break; + } + + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); +#ifndef WOLFSSL_DISABLE_EARLY_SANITY_CHECKS + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), OUT_OF_ORDER_E); +#else + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), BUFFER_ERROR); +#endif + + wolfSSL_free(ssl_c); + ssl_c = NULL; + wolfSSL_CTX_free(ctx_c); + ctx_c = NULL; + } + +#endif + return EXPECT_RESULT(); +} + +#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) +static void test_dtls_1_0_hvr_downgrade_ctx_ready(WOLFSSL_CTX* ctx) +{ + AssertIntEQ(wolfSSL_CTX_SetMinVersion(ctx, WOLFSSL_DTLSV1_2), + WOLFSSL_SUCCESS); +} + +static int test_dtls_1_0_hvr_downgrade(void) +{ + EXPECT_DECLS; + callback_functions func_cb_client; + callback_functions func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); + XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); + + func_cb_client.doUdp = func_cb_server.doUdp = 1; + func_cb_client.method = wolfDTLS_client_method; + func_cb_server.method = wolfDTLSv1_2_server_method; + func_cb_client.ctx_ready = test_dtls_1_0_hvr_downgrade_ctx_ready; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); + + return EXPECT_RESULT(); +} +#else +static int test_dtls_1_0_hvr_downgrade(void) +{ + EXPECT_DECLS; + return EXPECT_RESULT(); +} +#endif + +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_NO_TLS12) && \ + defined(HAVE_SESSION_TICKET) + +static WOLFSSL_SESSION* test_session_ticket_no_id_session = NULL; + +static void test_session_ticket_no_id_on_result(WOLFSSL* ssl) +{ + test_session_ticket_no_id_session = wolfSSL_get1_session(ssl); + AssertNotNull(test_session_ticket_no_id_session); +} + +static void test_session_ticket_no_id_ctx_ready(WOLFSSL_CTX* ctx) +{ + AssertIntEQ(wolfSSL_CTX_UseSessionTicket(ctx), WOLFSSL_SUCCESS); +} + +static void test_session_ticket_no_id_ssl_ready(WOLFSSL* ssl) +{ + test_session_ticket_no_id_session->sessionIDSz = 0; + AssertIntEQ(WOLFSSL_SUCCESS, + wolfSSL_set_session(ssl, test_session_ticket_no_id_session)); +} + +static int test_session_ticket_no_id(void) +{ + /* We are testing an expired (invalid crypto context in out case since the + * ctx changes) session ticket being sent with the session ID being 0 + * length. */ + EXPECT_DECLS; + callback_functions func_cb_client; + callback_functions func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + func_cb_client.method = wolfTLSv1_2_client_method; + func_cb_client.ctx_ready = test_session_ticket_no_id_ctx_ready; + func_cb_client.on_result = test_session_ticket_no_id_on_result; + func_cb_server.method = wolfTLSv1_2_server_method; + func_cb_server.ctx_ready = test_session_ticket_no_id_ctx_ready; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); + + XMEMSET(&func_cb_client, 0, sizeof(func_cb_client)); + XMEMSET(&func_cb_server, 0, sizeof(func_cb_server)); + func_cb_client.method = wolfTLSv1_2_client_method; + func_cb_client.ctx_ready = test_session_ticket_no_id_ctx_ready; + func_cb_client.ssl_ready = test_session_ticket_no_id_ssl_ready; + func_cb_server.method = wolfTLSv1_2_server_method; + func_cb_server.ctx_ready = test_session_ticket_no_id_ctx_ready; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); + + wolfSSL_SESSION_free(test_session_ticket_no_id_session); + + return EXPECT_RESULT(); +} +#else +static int test_session_ticket_no_id(void) +{ + EXPECT_DECLS; + return EXPECT_RESULT(); +} +#endif + +static int test_session_ticket_hs_update(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_TLS13) && \ + defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB) + struct test_memio_ctx test_ctx; + struct test_memio_ctx test_ctx2; + struct test_memio_ctx test_ctx3; + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_c2 = NULL; + WOLFSSL *ssl_c3 = NULL; + WOLFSSL *ssl_s = NULL; + WOLFSSL *ssl_s2 = NULL; + WOLFSSL *ssl_s3 = NULL; + WOLFSSL_SESSION *sess = NULL; + byte read_data[1]; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + XMEMSET(&test_ctx2, 0, sizeof(test_ctx2)); + XMEMSET(&test_ctx3, 0, sizeof(test_ctx3)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method), 0); + + /* Generate tickets */ + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + wolfSSL_SetLoggingPrefix("client"); + /* Read the ticket msg */ + ExpectIntEQ(wolfSSL_read(ssl_c, read_data, sizeof(read_data)), + WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + wolfSSL_SetLoggingPrefix(NULL); + + ExpectIntEQ(test_memio_setup(&test_ctx2, &ctx_c, &ctx_s, &ssl_c2, &ssl_s2, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method), 0); + ExpectIntEQ(test_memio_setup(&test_ctx3, &ctx_c, &ctx_s, &ssl_c3, &ssl_s3, + wolfTLSv1_3_client_method, wolfTLSv1_3_server_method), 0); + + ExpectNotNull(sess = wolfSSL_get1_session(ssl_c)); + ExpectIntEQ(wolfSSL_set_session(ssl_c2, sess), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_set_session(ssl_c3, sess), WOLFSSL_SUCCESS); + + wolfSSL_SetLoggingPrefix("client"); + /* Exchange initial flights for the second connection */ + ExpectIntEQ(wolfSSL_connect(ssl_c2), WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_get_error(ssl_c2, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + wolfSSL_SetLoggingPrefix(NULL); + wolfSSL_SetLoggingPrefix("server"); + ExpectIntEQ(wolfSSL_accept(ssl_s2), WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_get_error(ssl_s2, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + wolfSSL_SetLoggingPrefix(NULL); + + /* Complete third connection so that new tickets are exchanged */ + ExpectIntEQ(test_memio_do_handshake(ssl_c3, ssl_s3, 10, NULL), 0); + /* Read the ticket msg */ + wolfSSL_SetLoggingPrefix("client"); + ExpectIntEQ(wolfSSL_read(ssl_c3, read_data, sizeof(read_data)), + WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_get_error(ssl_c3, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + wolfSSL_SetLoggingPrefix(NULL); + + /* Complete second connection */ + ExpectIntEQ(test_memio_do_handshake(ssl_c2, ssl_s2, 10, NULL), 0); + + ExpectIntEQ(wolfSSL_session_reused(ssl_c2), 1); + ExpectIntEQ(wolfSSL_session_reused(ssl_c3), 1); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_c2); + wolfSSL_free(ssl_c3); + wolfSSL_free(ssl_s); + wolfSSL_free(ssl_s2); + wolfSSL_free(ssl_s3); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + wolfSSL_SESSION_free(sess); +#endif + return EXPECT_RESULT(); +} + +#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_SECURE_RENEGOTIATION) +static void test_dtls_downgrade_scr_server_ctx_ready_server(WOLFSSL_CTX* ctx) +{ + AssertIntEQ(wolfSSL_CTX_SetMinVersion(ctx, WOLFSSL_DTLSV1_2), + WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_CTX_UseSecureRenegotiation(ctx), WOLFSSL_SUCCESS); +} + +static void test_dtls_downgrade_scr_server_ctx_ready(WOLFSSL_CTX* ctx) +{ + AssertIntEQ(wolfSSL_CTX_UseSecureRenegotiation(ctx), WOLFSSL_SUCCESS); +} + +static void test_dtls_downgrade_scr_server_on_result(WOLFSSL* ssl) +{ + char testMsg[] = "Message after SCR"; + char msgBuf[sizeof(testMsg)]; + if (wolfSSL_is_server(ssl)) { + AssertIntEQ(wolfSSL_Rehandshake(ssl), WOLFSSL_FATAL_ERROR); + AssertIntEQ(wolfSSL_get_error(ssl, -1), APP_DATA_READY); + AssertIntEQ(wolfSSL_read(ssl, msgBuf, sizeof(msgBuf)), sizeof(msgBuf)); + AssertIntEQ(wolfSSL_Rehandshake(ssl), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_write(ssl, testMsg, sizeof(testMsg)), + sizeof(testMsg)); + } + else { + AssertIntEQ(wolfSSL_write(ssl, testMsg, sizeof(testMsg)), + sizeof(testMsg)); + AssertIntEQ(wolfSSL_read(ssl, msgBuf, sizeof(msgBuf)), sizeof(msgBuf)); + } +} + +static int test_dtls_downgrade_scr_server(void) +{ + EXPECT_DECLS; + callback_functions func_cb_client; + callback_functions func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); + XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); + + func_cb_client.doUdp = func_cb_server.doUdp = 1; + func_cb_client.method = wolfDTLSv1_2_client_method; + func_cb_server.method = wolfDTLS_server_method; + func_cb_client.ctx_ready = test_dtls_downgrade_scr_server_ctx_ready; + func_cb_server.ctx_ready = test_dtls_downgrade_scr_server_ctx_ready_server; + func_cb_client.on_result = test_dtls_downgrade_scr_server_on_result; + func_cb_server.on_result = test_dtls_downgrade_scr_server_on_result; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); + + return EXPECT_RESULT(); +} +#else +static int test_dtls_downgrade_scr_server(void) +{ + EXPECT_DECLS; + return EXPECT_RESULT(); +} +#endif + +#if defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(HAVE_SECURE_RENEGOTIATION) +static void test_dtls_downgrade_scr_ctx_ready(WOLFSSL_CTX* ctx) +{ + AssertIntEQ(wolfSSL_CTX_SetMinVersion(ctx, WOLFSSL_DTLSV1_2), + WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_CTX_UseSecureRenegotiation(ctx), WOLFSSL_SUCCESS); +} + +static void test_dtls_downgrade_scr_on_result(WOLFSSL* ssl) +{ + char testMsg[] = "Message after SCR"; + char msgBuf[sizeof(testMsg)]; + if (wolfSSL_is_server(ssl)) { + AssertIntEQ(wolfSSL_Rehandshake(ssl), WOLFSSL_FATAL_ERROR); + AssertIntEQ(wolfSSL_get_error(ssl, -1), APP_DATA_READY); + AssertIntEQ(wolfSSL_read(ssl, msgBuf, sizeof(msgBuf)), sizeof(msgBuf)); + AssertIntEQ(wolfSSL_Rehandshake(ssl), WOLFSSL_SUCCESS); + AssertIntEQ(wolfSSL_write(ssl, testMsg, sizeof(testMsg)), + sizeof(testMsg)); + } + else { + AssertIntEQ(wolfSSL_write(ssl, testMsg, sizeof(testMsg)), + sizeof(testMsg)); + AssertIntEQ(wolfSSL_read(ssl, msgBuf, sizeof(msgBuf)), sizeof(msgBuf)); + } +} + +static int test_dtls_downgrade_scr(void) +{ + EXPECT_DECLS; + callback_functions func_cb_client; + callback_functions func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); + XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); + + func_cb_client.doUdp = func_cb_server.doUdp = 1; + func_cb_client.method = wolfDTLS_client_method; + func_cb_server.method = wolfDTLSv1_2_server_method; + func_cb_client.ctx_ready = test_dtls_downgrade_scr_ctx_ready; + func_cb_client.on_result = test_dtls_downgrade_scr_on_result; + func_cb_server.on_result = test_dtls_downgrade_scr_on_result; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); + + return EXPECT_RESULT(); +} +#else +static int test_dtls_downgrade_scr(void) +{ + EXPECT_DECLS; + return EXPECT_RESULT(); +} +#endif + +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) \ + && !defined(WOLFSSL_NO_TLS12) + +static int test_dtls_client_hello_timeout_downgrade_read_cb(WOLFSSL *ssl, + char *data, int sz, void *ctx) +{ + static int call_counter = 0; + call_counter++; + (void)ssl; + (void)data; + (void)sz; + (void)ctx; + switch (call_counter) { + case 1: + case 2: + return WOLFSSL_CBIO_ERR_TIMEOUT; + case 3: + return WOLFSSL_CBIO_ERR_WANT_READ; + default: + AssertIntLE(call_counter, 3); + return -1; + } +} +#endif + +/* Make sure we don't send acks before getting a server hello */ +static int test_dtls_client_hello_timeout_downgrade(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) \ + && !defined(WOLFSSL_NO_TLS12) + + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + DtlsRecordLayerHeader* dtlsRH; + size_t len; + byte sequence_number[8]; + int i; + + for (i = 0; i < 2; i++) { + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLS_client_method, wolfDTLSv1_2_server_method), 0); + + if (i == 0) { + /* First time simulate timeout in IO layer */ + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* HVR */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* CH2 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* SH flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Drop the SH */ + dtlsRH = (DtlsRecordLayerHeader*)(test_ctx.c_buff); + len = (size_t)((dtlsRH->length[0] << 8) | dtlsRH->length[1]); + XMEMMOVE(test_ctx.c_buff, test_ctx.c_buff + + sizeof(DtlsRecordLayerHeader) + len, test_ctx.c_len - + (sizeof(DtlsRecordLayerHeader) + len)); + test_ctx.c_len -= sizeof(DtlsRecordLayerHeader) + len; + /* Read the remainder of the flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + wolfSSL_SSLSetIORecv(ssl_c, + test_dtls_client_hello_timeout_downgrade_read_cb); + /* CH3 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + wolfSSL_SSLSetIORecv(ssl_c, test_memio_read_cb); + } + else { + /* Second time call wolfSSL_dtls_got_timeout */ + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* HVR */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* CH2 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* SH flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Drop the SH */ + dtlsRH = (DtlsRecordLayerHeader*)(test_ctx.c_buff); + len = (size_t)((dtlsRH->length[0] << 8) | dtlsRH->length[1]); + XMEMMOVE(test_ctx.c_buff, test_ctx.c_buff + + sizeof(DtlsRecordLayerHeader) + len, test_ctx.c_len - + (sizeof(DtlsRecordLayerHeader) + len)); + test_ctx.c_len -= sizeof(DtlsRecordLayerHeader) + len; + /* Read the remainder of the flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Quick timeout should be set as we received at least one msg */ + ExpectIntEQ(wolfSSL_dtls13_use_quick_timeout(ssl_c), 1); + ExpectIntEQ(wolfSSL_dtls_got_timeout(ssl_c), WOLFSSL_SUCCESS); + /* Quick timeout should be cleared after a quick timeout */ + /* CH3 */ + ExpectIntEQ(wolfSSL_dtls13_use_quick_timeout(ssl_c), 0); + ExpectIntEQ(wolfSSL_dtls_got_timeout(ssl_c), WOLFSSL_SUCCESS); + } + + /* Parse out to make sure we got exactly one ClientHello message */ + XMEMSET(&sequence_number, 0, sizeof(sequence_number)); + /* Second ClientHello after HVR */ + sequence_number[7] = 2; + dtlsRH = (DtlsRecordLayerHeader*)test_ctx.s_buff; + ExpectIntEQ(dtlsRH->type, handshake); + ExpectIntEQ(dtlsRH->pvMajor, DTLS_MAJOR); + ExpectIntEQ(dtlsRH->pvMinor, DTLSv1_2_MINOR); + ExpectIntEQ(XMEMCMP(sequence_number, dtlsRH->sequence_number, + sizeof(sequence_number)), 0); + len = (size_t)((dtlsRH->length[0] << 8) | dtlsRH->length[1]); + ExpectIntEQ(sizeof(DtlsRecordLayerHeader) + len, test_ctx.s_len); + + /* Connection should be able to continue */ + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + ssl_c = NULL; + ssl_s = NULL; + ctx_c = NULL; + ctx_s = NULL; + if (!EXPECT_SUCCESS()) + break; + } + +#endif + return EXPECT_RESULT(); +} + +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) +static int test_dtls_client_hello_timeout_read_cb(WOLFSSL *ssl, char *data, + int sz, void *ctx) +{ + static int call_counter = 0; + call_counter++; + (void)ssl; + (void)data; + (void)sz; + (void)ctx; + switch (call_counter) { + case 1: + return WOLFSSL_CBIO_ERR_TIMEOUT; + case 2: + return WOLFSSL_CBIO_ERR_WANT_READ; + default: + AssertIntLE(call_counter, 2); + return -1; + } +} +#endif + +/* Make sure we don't send acks before getting a server hello */ +static int test_dtls_client_hello_timeout(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) + WOLFSSL *ssl_c = NULL; + WOLFSSL_CTX *ctx_c = NULL; + struct test_memio_ctx test_ctx; + DtlsRecordLayerHeader* dtlsRH; + size_t idx; + size_t len; + byte sequence_number[8]; + int i; + + for (i = 0; i < 2; i++) { + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, NULL, &ssl_c, NULL, + wolfDTLSv1_3_client_method, NULL), 0); + + if (i == 0) { + /* First time simulate timeout in IO layer */ + wolfSSL_SSLSetIORecv(ssl_c, test_dtls_client_hello_timeout_read_cb); + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + } + else { + /* Second time call wolfSSL_dtls_got_timeout */ + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(wolfSSL_dtls_got_timeout(ssl_c), WOLFSSL_SUCCESS); + } + + /* Parse out to make sure we got exactly two ClientHello messages */ + idx = 0; + XMEMSET(&sequence_number, 0, sizeof(sequence_number)); + /* First ClientHello */ + dtlsRH = (DtlsRecordLayerHeader*)(test_ctx.s_buff + idx); + ExpectIntEQ(dtlsRH->type, handshake); + ExpectIntEQ(dtlsRH->pvMajor, DTLS_MAJOR); + ExpectIntEQ(dtlsRH->pvMinor, DTLSv1_2_MINOR); + ExpectIntEQ(XMEMCMP(sequence_number, dtlsRH->sequence_number, + sizeof(sequence_number)), 0); + len = (size_t)((dtlsRH->length[0] << 8) | dtlsRH->length[1]); + ExpectIntLT(idx + sizeof(DtlsRecordLayerHeader) + len, test_ctx.s_len); + idx += sizeof(DtlsRecordLayerHeader) + len; + /* Second ClientHello */ + sequence_number[7] = 1; + dtlsRH = (DtlsRecordLayerHeader*)(test_ctx.s_buff + idx); + ExpectIntEQ(dtlsRH->type, handshake); + ExpectIntEQ(dtlsRH->pvMajor, DTLS_MAJOR); + ExpectIntEQ(dtlsRH->pvMinor, DTLSv1_2_MINOR); + ExpectIntEQ(XMEMCMP(sequence_number, dtlsRH->sequence_number, + sizeof(sequence_number)), 0); + len = (size_t)((dtlsRH->length[0] << 8) | dtlsRH->length[1]); + ExpectIntEQ(idx + sizeof(DtlsRecordLayerHeader) + len, test_ctx.s_len); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + ssl_c = NULL; + ctx_c = NULL; + if (!EXPECT_SUCCESS()) + break; + } + +#endif + return EXPECT_RESULT(); +} + +/* DTLS test when dropping the changed cipher spec message */ +static int test_dtls_dropped_ccs(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) \ + && !defined(WOLFSSL_NO_TLS12) + + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + DtlsRecordLayerHeader* dtlsRH; + size_t len; + byte data[1]; + + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method), 0); + + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* HVR */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* CH2 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Server first flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Client flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Server ccs + finished */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), 1); + + /* Drop the ccs */ + dtlsRH = (DtlsRecordLayerHeader*)test_ctx.c_buff; + len = (size_t)((dtlsRH->length[0] << 8) | dtlsRH->length[1]); + ExpectIntEQ(len, 1); + ExpectIntEQ(dtlsRH->type, change_cipher_spec); + if (EXPECT_SUCCESS()) { + XMEMMOVE(test_ctx.c_buff, test_ctx.c_buff + + sizeof(DtlsRecordLayerHeader) + len, test_ctx.c_len - + (sizeof(DtlsRecordLayerHeader) + len)); + } + test_ctx.c_len -= sizeof(DtlsRecordLayerHeader) + len; + + /* Client rtx flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(wolfSSL_dtls_got_timeout(ssl_c), WOLFSSL_SUCCESS); + /* Server ccs + finished rtx */ + ExpectIntEQ(wolfSSL_read(ssl_s, data, sizeof(data)), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Client processes finished */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), 1); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) \ + && !defined(WOLFSSL_NO_TLS12) +static int test_dtls_seq_num_downgrade_check_num(byte* ioBuf, int ioBufLen, + byte seq_num) +{ + EXPECT_DECLS; + DtlsRecordLayerHeader* dtlsRH; + byte sequence_number[8]; + + XMEMSET(&sequence_number, 0, sizeof(sequence_number)); + + ExpectIntGE(ioBufLen, sizeof(*dtlsRH)); + dtlsRH = (DtlsRecordLayerHeader*)ioBuf; + ExpectIntEQ(dtlsRH->type, handshake); + ExpectIntEQ(dtlsRH->pvMajor, DTLS_MAJOR); + ExpectIntEQ(dtlsRH->pvMinor, DTLSv1_2_MINOR); + sequence_number[7] = seq_num; + ExpectIntEQ(XMEMCMP(sequence_number, dtlsRH->sequence_number, + sizeof(sequence_number)), 0); + + return EXPECT_RESULT(); +} +#endif + +/* + * Make sure that we send the correct sequence number after a HelloVerifyRequest + * and after a HelloRetryRequest. This is testing the server side as it is + * operating statelessly and should copy the sequence number of the ClientHello. + */ +static int test_dtls_seq_num_downgrade(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) \ + && !defined(WOLFSSL_NO_TLS12) + WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; + WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + struct test_memio_ctx test_ctx; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_2_client_method, wolfDTLS_server_method), 0); + + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.s_buff, + test_ctx.s_len, 0), TEST_SUCCESS); + /* HVR */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.c_buff, + test_ctx.c_len, 0), TEST_SUCCESS); + /* CH2 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.s_buff, + test_ctx.s_len, 1), TEST_SUCCESS); + /* Server first flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(test_dtls_seq_num_downgrade_check_num(test_ctx.c_buff, + test_ctx.c_len, 1), TEST_SUCCESS); + + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + +/** + * Make sure we don't send RSA Signature Hash Algorithms in the + * CertificateRequest when we don't have any such ciphers set. + * @return EXPECT_RESULT() + */ +static int test_certreq_sighash_algos(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && \ + !defined(WOLFSSL_MAX_STRENGTH) && defined(HAVE_ECC) && \ + defined(WOLFSSL_SHA384) && defined(WOLFSSL_AES_256) && \ + defined(HAVE_AES_CBC) && !defined(WOLFSSL_NO_TLS12) + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + int idx = 0; + int maxIdx = 0; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + test_ctx.c_ciphers = test_ctx.s_ciphers = + "ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA384"; + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, wolfTLSv1_2_server_method), 0); + + ExpectIntEQ(wolfSSL_CTX_load_verify_locations(ctx_c, + "./certs/ca-ecc-cert.pem", NULL), WOLFSSL_SUCCESS); + + wolfSSL_set_verify(ssl_s, WOLFSSL_VERIFY_PEER, NULL); + ExpectIntEQ(wolfSSL_use_PrivateKey_file(ssl_s, "./certs/ecc-key.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_use_certificate_file(ssl_s, "./certs/server-ecc.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + + ExpectIntEQ(wolfSSL_connect(ssl_c), WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_get_error(ssl_c, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + + ExpectIntEQ(wolfSSL_accept(ssl_s), WOLFSSL_FATAL_ERROR); + ExpectIntEQ(wolfSSL_get_error(ssl_s, WOLFSSL_FATAL_ERROR), + WOLFSSL_ERROR_WANT_READ); + + /* Find the CertificateRequest message */ + for (idx = 0; idx < test_ctx.c_len && EXPECT_SUCCESS();) { + word16 len; + ExpectIntEQ(test_ctx.c_buff[idx++], handshake); + ExpectIntEQ(test_ctx.c_buff[idx++], SSLv3_MAJOR); + ExpectIntEQ(test_ctx.c_buff[idx++], TLSv1_2_MINOR); + ato16(test_ctx.c_buff + idx, &len); + idx += OPAQUE16_LEN; + if (test_ctx.c_buff[idx] == certificate_request) { + idx++; + /* length */ + idx += OPAQUE24_LEN; + /* cert types */ + idx += 1 + test_ctx.c_buff[idx]; + /* Sig algos */ + ato16(test_ctx.c_buff + idx, &len); + idx += OPAQUE16_LEN; + maxIdx = idx + (int)len; + for (; idx < maxIdx && EXPECT_SUCCESS(); idx += OPAQUE16_LEN) { + if (test_ctx.c_buff[idx+1] == ED25519_SA_MINOR || + test_ctx.c_buff[idx+1] == ED448_SA_MINOR) + ExpectIntEQ(test_ctx.c_buff[idx], NEW_SA_MAJOR); + else + ExpectIntEQ(test_ctx.c_buff[idx+1], ecc_dsa_sa_algo); + } + break; + } + else { + idx += (int)len; + } + } + ExpectIntLT(idx, test_ctx.c_len); + + + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + +#if defined(HAVE_CRL) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) +static int test_revoked_loaded_int_cert_ctx_ready1(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify); + myVerifyAction = VERIFY_USE_PREVERFIY; + ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx, + "./certs/ca-cert.pem", NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx, + "./certs/intermediate/ca-int-cert.pem", NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_EnableCRL(ctx, WOLFSSL_CRL_CHECKALL), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, + "./certs/crl/extra-crls/ca-int-cert-revoked.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, + "./certs/crl/ca-int.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + return EXPECT_RESULT(); +} + +static int test_revoked_loaded_int_cert_ctx_ready2(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, myVerify); + myVerifyAction = VERIFY_USE_PREVERFIY; + ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx, + "./certs/ca-cert.pem", NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx, + "./certs/intermediate/ca-int-cert.pem", NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_load_verify_locations_ex(ctx, + "./certs/intermediate/ca-int2-cert.pem", NULL, 0), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_EnableCRL(ctx, WOLFSSL_CRL_CHECKALL), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, + "./certs/crl/ca-int2.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, + "./certs/crl/extra-crls/ca-int-cert-revoked.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_CTX_LoadCRLFile(ctx, + "./certs/crl/ca-int.pem", + WOLFSSL_FILETYPE_PEM), WOLFSSL_SUCCESS); + return EXPECT_RESULT(); +} +#endif + +static int test_revoked_loaded_int_cert(void) +{ + EXPECT_DECLS; +#if defined(HAVE_CRL) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) + test_ssl_cbf client_cbf; + test_ssl_cbf server_cbf; + struct { + const char* certPemFile; + const char* keyPemFile; + ctx_cb client_ctx_ready; + } test_params[] = { + {"./certs/intermediate/ca-int2-cert.pem", + "./certs/intermediate/ca-int2-key.pem", + test_revoked_loaded_int_cert_ctx_ready1}, + {"./certs/intermediate/server-chain.pem", + "./certs/server-key.pem", test_revoked_loaded_int_cert_ctx_ready2}, + {"./certs/intermediate/server-chain-short.pem", + "./certs/server-key.pem", test_revoked_loaded_int_cert_ctx_ready2}, + }; + size_t i; + + printf("\n"); + + for (i = 0; i < XELEM_CNT(test_params); i++) { + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + + printf("\tTesting with %s...\n", test_params[i].certPemFile); + + server_cbf.certPemFile = test_params[i].certPemFile; + server_cbf.keyPemFile = test_params[i].keyPemFile; + + client_cbf.ctx_ready = test_params[i].client_ctx_ready; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, + &server_cbf, NULL), TEST_FAIL); + ExpectIntEQ(client_cbf.last_err, CRL_CERT_REVOKED); + ExpectIntEQ(server_cbf.last_err, FATAL_ERROR); + + if (!EXPECT_SUCCESS()) + break; + printf("\t%s passed\n", test_params[i].certPemFile); + } + +#endif + return EXPECT_RESULT(); +} + +static int test_dtls13_frag_ch_pq(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) \ + && defined(WOLFSSL_DTLS_CH_FRAG) && defined(HAVE_LIBOQS) + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + const char *test_str = "test"; + int test_str_size; + byte buf[255]; + int group = WOLFSSL_KYBER_LEVEL5; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method), 0); + /* Add in a large post-quantum key share to make the CH long. */ + ExpectIntEQ(wolfSSL_set_groups(ssl_c, &group, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(ssl_c, group), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_dtls13_allow_ch_frag(ssl_s, 1), WOLFSSL_SUCCESS); + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + ExpectStrEQ(wolfSSL_get_curve_name(ssl_c), "KYBER_LEVEL5"); + ExpectStrEQ(wolfSSL_get_curve_name(ssl_s), "KYBER_LEVEL5"); + test_str_size = XSTRLEN("test") + 1; + ExpectIntEQ(wolfSSL_write(ssl_c, test_str, test_str_size), test_str_size); + ExpectIntEQ(wolfSSL_read(ssl_s, buf, sizeof(buf)), test_str_size); + ExpectIntEQ(XSTRCMP((char*)buf, test_str), 0); + ExpectIntEQ(wolfSSL_write(ssl_c, test_str, test_str_size), test_str_size); + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) \ + && defined(WOLFSSL_DTLS_MTU) && defined(WOLFSSL_DTLS_CH_FRAG) +static int test_dtls_frag_ch_count_records(byte* b, int len) +{ + DtlsRecordLayerHeader* dtlsRH; + int records = 0; + size_t recordLen; + while (len > 0) { + records++; + dtlsRH = (DtlsRecordLayerHeader*)b; + recordLen = (dtlsRH->length[0] << 8) | dtlsRH->length[1]; + b += sizeof(DtlsRecordLayerHeader) + recordLen; + len -= sizeof(DtlsRecordLayerHeader) + recordLen; + } + return records; +} +#endif + +static int test_dtls_frag_ch(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) \ + && defined(WOLFSSL_DTLS_MTU) && defined(WOLFSSL_DTLS_CH_FRAG) + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + static unsigned int DUMMY_MTU = 256; + unsigned char four_frag_CH[] = { + 0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xda, 0x01, 0x00, 0x02, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xce, 0xfe, 0xfd, 0xf3, 0x94, 0x01, 0x33, 0x2c, 0xcf, 0x2c, 0x47, 0xb1, + 0xe5, 0xa1, 0x7b, 0x19, 0x3e, 0xac, 0x68, 0xdd, 0xe6, 0x17, 0x6b, 0x85, + 0xad, 0x5f, 0xfc, 0x7f, 0x6e, 0xf0, 0xb9, 0xe0, 0x2e, 0xca, 0x47, 0x00, + 0x00, 0x00, 0x36, 0x13, 0x01, 0x13, 0x02, 0x13, 0x03, 0xc0, 0x2c, 0xc0, + 0x2b, 0xc0, 0x30, 0xc0, 0x2f, 0x00, 0x9f, 0x00, 0x9e, 0xcc, 0xa9, 0xcc, + 0xa8, 0xcc, 0xaa, 0xc0, 0x27, 0xc0, 0x23, 0xc0, 0x28, 0xc0, 0x24, 0xc0, + 0x0a, 0xc0, 0x09, 0xc0, 0x14, 0xc0, 0x13, 0x00, 0x6b, 0x00, 0x67, 0x00, + 0x39, 0x00, 0x33, 0xcc, 0x14, 0xcc, 0x13, 0xcc, 0x15, 0x01, 0x00, 0x02, + 0x7c, 0x00, 0x2b, 0x00, 0x03, 0x02, 0xfe, 0xfc, 0x00, 0x0d, 0x00, 0x20, + 0x00, 0x1e, 0x06, 0x03, 0x05, 0x03, 0x04, 0x03, 0x02, 0x03, 0x08, 0x06, + 0x08, 0x0b, 0x08, 0x05, 0x08, 0x0a, 0x08, 0x04, 0x08, 0x09, 0x06, 0x01, + 0x05, 0x01, 0x04, 0x01, 0x03, 0x01, 0x02, 0x01, 0x00, 0x0a, 0x00, 0x0c, + 0x00, 0x0a, 0x00, 0x19, 0x00, 0x18, 0x00, 0x17, 0x00, 0x15, 0x01, 0x00, + 0x00, 0x16, 0x00, 0x00, 0x00, 0x33, 0x02, 0x39, 0x02, 0x37, 0x00, 0x17, + 0x00, 0x41, 0x04, 0x94, 0xdf, 0x36, 0xd7, 0xb3, 0x90, 0x6d, 0x01, 0xa1, + 0xe6, 0xed, 0x67, 0xf4, 0xd9, 0x9d, 0x2c, 0xac, 0x57, 0x74, 0xff, 0x19, + 0xbe, 0x5a, 0xc9, 0x30, 0x11, 0xb7, 0x2b, 0x59, 0x47, 0x80, 0x7c, 0xa9, + 0xb7, 0x31, 0x8c, 0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0xda, 0x01, 0x00, 0x02, 0xdc, 0x00, 0x00, 0x00, 0x00, + 0xce, 0x00, 0x00, 0xce, 0x9e, 0x13, 0x74, 0x3b, 0x86, 0xba, 0x69, 0x1f, + 0x12, 0xf7, 0xcd, 0x78, 0x53, 0xe8, 0x50, 0x4d, 0x71, 0x3f, 0x4b, 0x4e, + 0xeb, 0x3e, 0xe5, 0x43, 0x54, 0x78, 0x17, 0x6d, 0x00, 0x18, 0x00, 0x61, + 0x04, 0xd1, 0x99, 0x66, 0x4f, 0xda, 0xc7, 0x12, 0x3b, 0xff, 0xb2, 0xd6, + 0x2f, 0x35, 0xb6, 0x17, 0x1f, 0xb3, 0xd0, 0xb6, 0x52, 0xff, 0x97, 0x8b, + 0x01, 0xe8, 0xd9, 0x68, 0x71, 0x40, 0x02, 0xd5, 0x68, 0x3a, 0x58, 0xb2, + 0x5d, 0xee, 0xa4, 0xe9, 0x5f, 0xf4, 0xaf, 0x3e, 0x30, 0x9c, 0x3e, 0x2b, + 0xda, 0x61, 0x43, 0x99, 0x02, 0x35, 0x33, 0x9f, 0xcf, 0xb5, 0xd3, 0x28, + 0x19, 0x9d, 0x1c, 0xbe, 0x69, 0x07, 0x9e, 0xfc, 0xe4, 0x8e, 0xcd, 0x86, + 0x4a, 0x1b, 0xf0, 0xfc, 0x17, 0x94, 0x66, 0x53, 0xda, 0x24, 0x5e, 0xaf, + 0xce, 0xec, 0x62, 0x4c, 0x06, 0xb4, 0x52, 0x94, 0xb1, 0x4a, 0x7a, 0x8c, + 0x4f, 0x00, 0x19, 0x00, 0x85, 0x04, 0x00, 0x27, 0xeb, 0x99, 0x49, 0x7f, + 0xcb, 0x2c, 0x46, 0x54, 0x2d, 0x93, 0x5d, 0x25, 0x92, 0x58, 0x5e, 0x06, + 0xc3, 0x7c, 0xfb, 0x9a, 0xa7, 0xec, 0xcd, 0x9f, 0xe1, 0x6b, 0x2d, 0x78, + 0xf5, 0x16, 0xa9, 0x20, 0x52, 0x48, 0x19, 0x0f, 0x1a, 0xd0, 0xce, 0xd8, + 0x68, 0xb1, 0x4e, 0x7f, 0x33, 0x03, 0x7d, 0x0c, 0x39, 0xdb, 0x9c, 0x4b, + 0xf4, 0xe7, 0xc2, 0xf5, 0xdd, 0x51, 0x9b, 0x03, 0xa8, 0x53, 0x2b, 0xe6, + 0x00, 0x15, 0x4b, 0xff, 0xd2, 0xa0, 0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xda, 0x01, 0x00, 0x02, 0xdc, 0x00, + 0x00, 0x00, 0x01, 0x9c, 0x00, 0x00, 0xce, 0x58, 0x30, 0x10, 0x3d, 0x46, + 0xcc, 0xca, 0x1a, 0x44, 0xc8, 0x58, 0x9b, 0x27, 0x17, 0x67, 0x31, 0x96, + 0x8a, 0x66, 0x39, 0xf4, 0xcc, 0xc1, 0x9f, 0x12, 0x1f, 0x01, 0x30, 0x50, + 0x16, 0xd6, 0x89, 0x97, 0xa3, 0x66, 0xd7, 0x99, 0x50, 0x09, 0x6e, 0x80, + 0x87, 0xe4, 0xa2, 0x88, 0xae, 0xb4, 0x23, 0x57, 0x2f, 0x12, 0x60, 0xe7, + 0x7d, 0x44, 0x2d, 0xad, 0xbe, 0xe9, 0x0d, 0x01, 0x00, 0x01, 0x00, 0xd5, + 0xdd, 0x62, 0xee, 0xf3, 0x0e, 0xd9, 0x30, 0x0e, 0x38, 0xf3, 0x48, 0xf4, + 0xc9, 0x8f, 0x8c, 0x20, 0xf7, 0xd3, 0xa8, 0xb3, 0x87, 0x3c, 0x98, 0x5d, + 0x70, 0xc5, 0x03, 0x76, 0xb7, 0xd5, 0x0b, 0x7b, 0x23, 0x97, 0x6b, 0xe3, + 0xb5, 0x18, 0xeb, 0x64, 0x55, 0x18, 0xb2, 0x8a, 0x90, 0x1a, 0x8f, 0x0e, + 0x15, 0xda, 0xb1, 0x8e, 0x7f, 0xee, 0x1f, 0xe0, 0x3b, 0xb9, 0xed, 0xfc, + 0x4e, 0x3f, 0x78, 0x16, 0x39, 0x95, 0x5f, 0xb7, 0xcb, 0x65, 0x55, 0x72, + 0x7b, 0x7d, 0x86, 0x2f, 0x8a, 0xe5, 0xee, 0xf7, 0x57, 0x40, 0xf3, 0xc4, + 0x96, 0x4f, 0x11, 0x4d, 0x85, 0xf9, 0x56, 0xfa, 0x3d, 0xf0, 0xc9, 0xa4, + 0xec, 0x1e, 0xaa, 0x47, 0x90, 0x53, 0xdf, 0xe1, 0xb7, 0x78, 0x18, 0xeb, + 0xdd, 0x0d, 0x89, 0xb7, 0xf6, 0x15, 0x0e, 0x55, 0x12, 0xb3, 0x23, 0x17, + 0x0b, 0x59, 0x6f, 0x83, 0x05, 0x6b, 0xa6, 0xf8, 0x6c, 0x3a, 0x9b, 0x1b, + 0x50, 0x93, 0x51, 0xea, 0x95, 0x2d, 0x99, 0x96, 0x38, 0x16, 0xfe, 0xfd, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7e, 0x01, 0x00, + 0x02, 0xdc, 0x00, 0x00, 0x00, 0x02, 0x6a, 0x00, 0x00, 0x72, 0x2d, 0x66, + 0x3e, 0xf2, 0x36, 0x5a, 0xf2, 0x23, 0x8f, 0x28, 0x09, 0xa9, 0x55, 0x8c, + 0x8f, 0xc0, 0x0d, 0x61, 0x98, 0x33, 0x56, 0x87, 0x7a, 0xfd, 0xa7, 0x50, + 0x71, 0x84, 0x2e, 0x41, 0x58, 0x00, 0x87, 0xd9, 0x27, 0xe5, 0x7b, 0xf4, + 0x6d, 0x84, 0x4e, 0x2e, 0x0c, 0x80, 0x0c, 0xf3, 0x8a, 0x02, 0x4b, 0x99, + 0x3a, 0x1f, 0x9f, 0x18, 0x7d, 0x1c, 0xec, 0xad, 0x60, 0x54, 0xa6, 0xa3, + 0x2c, 0x82, 0x5e, 0xf8, 0x8f, 0xae, 0xe1, 0xc4, 0x82, 0x7e, 0x43, 0x43, + 0xc5, 0x99, 0x49, 0x05, 0xd3, 0xf6, 0xdf, 0xa1, 0xb5, 0x2d, 0x0c, 0x13, + 0x2f, 0x1e, 0xb6, 0x28, 0x7c, 0x5c, 0xa1, 0x02, 0x6b, 0x8d, 0xa3, 0xeb, + 0xd4, 0x58, 0xe6, 0xa0, 0x7e, 0x6b, 0xaa, 0x09, 0x43, 0x67, 0x71, 0x87, + 0xa5, 0xcb, 0x68, 0xf3 + }; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method), 0); + + /* Fragment msgs */ + ExpectIntEQ(wolfSSL_dtls_set_mtu(ssl_c, DUMMY_MTU), WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_dtls_set_mtu(ssl_s, DUMMY_MTU), WOLFSSL_SUCCESS); + + /* Add in some key shares to make the CH long */ + ExpectIntEQ(wolfSSL_UseKeyShare(ssl_c, WOLFSSL_ECC_SECP256R1), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(ssl_c, WOLFSSL_ECC_SECP384R1), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(ssl_c, WOLFSSL_ECC_SECP521R1), + WOLFSSL_SUCCESS); + ExpectIntEQ(wolfSSL_UseKeyShare(ssl_c, WOLFSSL_FFDHE_2048), + WOLFSSL_SUCCESS); + + ExpectIntEQ(wolfSSL_dtls13_allow_ch_frag(ssl_s, 1), WOLFSSL_SUCCESS); + + /* Reject fragmented first CH */ + ExpectIntEQ(test_dtls_frag_ch_count_records(four_frag_CH, + sizeof(four_frag_CH)), 4); + XMEMCPY(test_ctx.s_buff, four_frag_CH, sizeof(four_frag_CH)); + test_ctx.s_len = sizeof(four_frag_CH); + while (test_ctx.s_len > 0 && EXPECT_SUCCESS()) { + int s_len = test_ctx.s_len; + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Fail if we didn't advance the buffer to avoid infinite loops */ + ExpectIntLT(test_ctx.s_len, s_len); + } + /* Expect all fragments read */ + ExpectIntEQ(test_ctx.s_len, 0); + /* Expect quietly dropping fragmented first CH */ + ExpectIntEQ(test_ctx.c_len, 0); + + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Count records. Expect 1 unfragmented CH */ + ExpectIntEQ(test_dtls_frag_ch_count_records(test_ctx.s_buff, + test_ctx.s_len), 1); + /* HRR */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* CH2 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Count records. Expect fragmented CH */ + ExpectIntGT(test_dtls_frag_ch_count_records(test_ctx.s_buff, + test_ctx.s_len), 1); + + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; +#endif + return EXPECT_RESULT(); +} + +static int test_dtls_empty_keyshare_with_cookie(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS13) + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + unsigned char ch_empty_keyshare_with_cookie[] = { + 0x16, 0xfe, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, + 0x12, 0x01, 0x00, 0x01, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x06, 0xfe, 0xfd, 0xfb, 0x8c, 0x9b, 0x28, 0xae, 0x50, 0x1c, 0x4d, 0xf3, + 0xb8, 0xcf, 0x4d, 0xd8, 0x7e, 0x93, 0x13, 0x7b, 0x9e, 0xd9, 0xeb, 0xe9, + 0x13, 0x4b, 0x0d, 0x7f, 0x2e, 0x43, 0x62, 0x8c, 0xe4, 0x57, 0x79, 0x00, + 0x00, 0x00, 0x36, 0x13, 0x01, 0x13, 0x02, 0x13, 0x03, 0xc0, 0x2c, 0xc0, + 0x2b, 0xc0, 0x30, 0xc0, 0x2f, 0x00, 0x9f, 0x00, 0x9e, 0xcc, 0xa9, 0xcc, + 0xa8, 0xcc, 0xaa, 0xc0, 0x27, 0xc0, 0x23, 0xc0, 0x28, 0xc0, 0x24, 0xc0, + 0x0a, 0xc0, 0x09, 0xc0, 0x14, 0xc0, 0x13, 0x00, 0x6b, 0x00, 0x67, 0x00, + 0x39, 0x00, 0x33, 0xcc, 0x14, 0xcc, 0x13, 0xcc, 0x15, 0x01, 0x00, 0x00, + 0xa6, 0x00, 0x2b, 0x00, 0x03, 0x02, 0xfe, 0xfc, 0x00, 0x2c, 0x00, 0x47, + 0x00, 0x45, 0x20, 0xee, 0x4b, 0x17, 0x70, 0x63, 0xa0, 0x4c, 0x82, 0xbf, + 0x43, 0x01, 0x7d, 0x8d, 0xc1, 0x1b, 0x4e, 0x9b, 0xa0, 0x3c, 0x53, 0x1f, + 0xb7, 0xd1, 0x10, 0x81, 0xa8, 0xdf, 0xdf, 0x8c, 0x7f, 0xf3, 0x11, 0x13, + 0x01, 0x02, 0x3d, 0x3b, 0x7d, 0x14, 0x2c, 0x31, 0xb3, 0x60, 0x72, 0x4d, + 0xe5, 0x1a, 0xb2, 0xa3, 0x61, 0x77, 0x73, 0x03, 0x40, 0x0e, 0x5f, 0xc5, + 0x61, 0x38, 0x43, 0x56, 0x21, 0x4a, 0x95, 0xd5, 0x35, 0xa8, 0x0d, 0x00, + 0x0d, 0x00, 0x2a, 0x00, 0x28, 0x06, 0x03, 0x05, 0x03, 0x04, 0x03, 0x02, + 0x03, 0xfe, 0x0b, 0xfe, 0x0e, 0xfe, 0xa0, 0xfe, 0xa3, 0xfe, 0xa5, 0x08, + 0x06, 0x08, 0x0b, 0x08, 0x05, 0x08, 0x0a, 0x08, 0x04, 0x08, 0x09, 0x06, + 0x01, 0x05, 0x01, 0x04, 0x01, 0x03, 0x01, 0x02, 0x01, 0x00, 0x0a, 0x00, + 0x18, 0x00, 0x16, 0x00, 0x19, 0x00, 0x18, 0x00, 0x17, 0x00, 0x15, 0x01, + 0x00, 0x02, 0x3a, 0x02, 0x3c, 0x02, 0x3d, 0x2f, 0x3a, 0x2f, 0x3c, 0x2f, + 0x3d, 0x00, 0x16, 0x00, 0x00, 0x00, 0x33, 0x00, 0x02, 0x00, 0x00 + }; + DtlsRecordLayerHeader* dtlsRH; + byte sequence_number[8]; + + XMEMSET(&sequence_number, 0, sizeof(sequence_number)); + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + XMEMCPY(test_ctx.s_buff, ch_empty_keyshare_with_cookie, + sizeof(ch_empty_keyshare_with_cookie)); + test_ctx.s_len = sizeof(ch_empty_keyshare_with_cookie); + ExpectIntEQ(test_memio_setup(&test_ctx, NULL, &ctx_s, NULL, &ssl_s, + NULL, wolfDTLSv1_3_server_method), 0); + + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Expect an alert. A plaintext alert should be exactly 15 bytes. */ + ExpectIntEQ(test_ctx.c_len, 15); + dtlsRH = (DtlsRecordLayerHeader*)test_ctx.c_buff; + ExpectIntEQ(dtlsRH->type, alert); + ExpectIntEQ(dtlsRH->pvMajor, DTLS_MAJOR); + ExpectIntEQ(dtlsRH->pvMinor, DTLSv1_2_MINOR); + sequence_number[7] = 1; + ExpectIntEQ(XMEMCMP(sequence_number, dtlsRH->sequence_number, + sizeof(sequence_number)), 0); + ExpectIntEQ(dtlsRH->length[0], 0); + ExpectIntEQ(dtlsRH->length[1], 2); + ExpectIntEQ(test_ctx.c_buff[13], alert_fatal); + ExpectIntEQ(test_ctx.c_buff[14], illegal_parameter); + + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + +static int test_dtls_old_seq_number(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(WOLFSSL_DTLS) + WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; + WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + struct test_memio_ctx test_ctx; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method), 0); + + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* HVR */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* CH2 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Server first flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Client second flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Modify the sequence number */ + { + DtlsRecordLayerHeader* dtlsRH = (DtlsRecordLayerHeader*)test_ctx.s_buff; + XMEMSET(dtlsRH->sequence_number, 0, sizeof(dtlsRH->sequence_number)); + } + /* Server second flight */ + ExpectIntEQ(wolfSSL_negotiate(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + /* Server should not do anything as a pkt was dropped */ + ExpectIntEQ(test_ctx.c_len, 0); + ExpectIntEQ(test_ctx.s_len, 0); + /* Trigger rtx */ + ExpectIntEQ(wolfSSL_dtls_got_timeout(ssl_c), WOLFSSL_SUCCESS); + + /* Complete connection */ + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + + wolfSSL_free(ssl_c); + wolfSSL_CTX_free(ctx_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(WOLFSSL_TLS13) && \ + defined(HAVE_LIBOQS) +static void test_tls13_pq_groups_ctx_ready(WOLFSSL_CTX* ctx) +{ + int group = WOLFSSL_KYBER_LEVEL5; + AssertIntEQ(wolfSSL_CTX_set_groups(ctx, &group, 1), WOLFSSL_SUCCESS); +} + +static void test_tls13_pq_groups_on_result(WOLFSSL* ssl) +{ + AssertStrEQ(wolfSSL_get_curve_name(ssl), "KYBER_LEVEL5"); +} +#endif + +static int test_tls13_pq_groups(void) +{ + EXPECT_DECLS; +#if defined(HAVE_IO_TESTS_DEPENDENCIES) && defined(WOLFSSL_TLS13) && \ + defined(HAVE_LIBOQS) + callback_functions func_cb_client; + callback_functions func_cb_server; + + XMEMSET(&func_cb_client, 0, sizeof(callback_functions)); + XMEMSET(&func_cb_server, 0, sizeof(callback_functions)); + + func_cb_client.method = wolfTLSv1_3_client_method; + func_cb_server.method = wolfTLSv1_3_server_method; + func_cb_client.ctx_ready = test_tls13_pq_groups_ctx_ready; + func_cb_client.on_result = test_tls13_pq_groups_on_result; + func_cb_server.on_result = test_tls13_pq_groups_on_result; + + test_wolfSSL_client_server_nofail(&func_cb_client, &func_cb_server); + + ExpectIntEQ(func_cb_client.return_code, TEST_SUCCESS); + ExpectIntEQ(func_cb_server.return_code, TEST_SUCCESS); +#endif + return EXPECT_RESULT(); +} + +static int test_tls13_early_data(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && \ + defined(WOLFSSL_EARLY_DATA) && defined(HAVE_SESSION_TICKET) + int written = 0; + int read = 0; + size_t i; + int splitEarlyData; + char msg[] = "This is early data"; + char msg2[] = "This is client data"; + char msg3[] = "This is server data"; + char msg4[] = "This is server immediate data"; + char msgBuf[50]; + struct { + method_provider client_meth; + method_provider server_meth; + const char* tls_version; + int isUdp; + } params[] = { +#ifdef WOLFSSL_TLS13 + { wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + "TLS 1.3", 0 }, +#endif +#ifdef WOLFSSL_DTLS13 + { wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, + "DTLS 1.3", 1 }, +#endif + }; + + for (i = 0; i < sizeof(params)/sizeof(*params) && !EXPECT_FAIL(); i++) { + for (splitEarlyData = 0; splitEarlyData < 2; splitEarlyData++) { + struct test_memio_ctx test_ctx; + WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; + WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + WOLFSSL_SESSION *sess = NULL; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + fprintf(stderr, "\tEarly data with %s\n", params[i].tls_version); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, + &ssl_s, params[i].client_meth, params[i].server_meth), 0); + + /* Get a ticket so that we can do 0-RTT on the next connection */ + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + /* Make sure we read the ticket */ + ExpectIntEQ(wolfSSL_read(ssl_c, msgBuf, sizeof(msgBuf)), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + ExpectNotNull(sess = wolfSSL_get1_session(ssl_c)); + + wolfSSL_free(ssl_c); + ssl_c = NULL; + wolfSSL_free(ssl_s); + ssl_s = NULL; + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + params[i].client_meth, params[i].server_meth), 0); + ExpectIntEQ(wolfSSL_set_session(ssl_c, sess), WOLFSSL_SUCCESS); +#ifdef WOLFSSL_DTLS13 + if (params[i].isUdp) { +#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME + ExpectIntEQ(wolfSSL_dtls13_no_hrr_on_resume(ssl_s, 1), WOLFSSL_SUCCESS); +#else + /* Let's test this but we generally don't recommend turning off the + * cookie exchange */ + ExpectIntEQ(wolfSSL_disable_hrr_cookie(ssl_s), WOLFSSL_SUCCESS); +#endif + } +#endif + + /* Test 0-RTT data */ + ExpectIntEQ(wolfSSL_write_early_data(ssl_c, msg, sizeof(msg), + &written), sizeof(msg)); + ExpectIntEQ(written, sizeof(msg)); + + if (splitEarlyData) { + ExpectIntEQ(wolfSSL_write_early_data(ssl_c, msg, sizeof(msg), + &written), sizeof(msg)); + ExpectIntEQ(written, sizeof(msg)); + } + + /* Read first 0-RTT data (if split otherwise entire data) */ + ExpectIntEQ(wolfSSL_read_early_data(ssl_s, msgBuf, sizeof(msgBuf), + &read), sizeof(msg)); + ExpectIntEQ(read, sizeof(msg)); + ExpectStrEQ(msg, msgBuf); + + /* Test 0.5-RTT data */ + ExpectIntEQ(wolfSSL_write(ssl_s, msg4, sizeof(msg4)), sizeof(msg4)); + + if (splitEarlyData) { + /* Read second 0-RTT data */ + ExpectIntEQ(wolfSSL_read_early_data(ssl_s, msgBuf, sizeof(msgBuf), + &read), sizeof(msg)); + ExpectIntEQ(read, sizeof(msg)); + ExpectStrEQ(msg, msgBuf); + } + + if (params[i].isUdp) { + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), APP_DATA_READY); + + /* Read server 0.5-RTT data */ + ExpectIntEQ(wolfSSL_read(ssl_c, msgBuf, sizeof(msgBuf)), sizeof(msg4)); + ExpectStrEQ(msg4, msgBuf); + + /* Complete handshake */ + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + /* Use wolfSSL_is_init_finished to check if handshake is complete. Normally + * a user would loop until it is true but here we control both sides so we + * just assert the expected value. wolfSSL_read_early_data does not provide + * handshake status to us with non-blocking IO and we can't use + * wolfSSL_accept as TLS layer may return ZERO_RETURN due to early data + * parsing logic. */ + ExpectFalse(wolfSSL_is_init_finished(ssl_s)); + ExpectIntEQ(wolfSSL_read_early_data(ssl_s, msgBuf, sizeof(msgBuf), + &read), 0); + ExpectIntEQ(read, 0); + ExpectTrue(wolfSSL_is_init_finished(ssl_s)); + + ExpectIntEQ(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + } + else { + ExpectIntEQ(wolfSSL_connect(ssl_c), WOLFSSL_SUCCESS); + + ExpectFalse(wolfSSL_is_init_finished(ssl_s)); + ExpectIntEQ(wolfSSL_read_early_data(ssl_s, msgBuf, sizeof(msgBuf), + &read), 0); + ExpectIntEQ(read, 0); + ExpectTrue(wolfSSL_is_init_finished(ssl_s)); + + /* Read server 0.5-RTT data */ + ExpectIntEQ(wolfSSL_read(ssl_c, msgBuf, sizeof(msgBuf)), sizeof(msg4)); + ExpectStrEQ(msg4, msgBuf); + } + + /* Test bi-directional write */ + ExpectIntEQ(wolfSSL_write(ssl_c, msg2, sizeof(msg2)), sizeof(msg2)); + ExpectIntEQ(wolfSSL_read(ssl_s, msgBuf, sizeof(msgBuf)), sizeof(msg2)); + ExpectStrEQ(msg2, msgBuf); + ExpectIntEQ(wolfSSL_write(ssl_s, msg3, sizeof(msg3)), sizeof(msg3)); + ExpectIntEQ(wolfSSL_read(ssl_c, msgBuf, sizeof(msgBuf)), sizeof(msg3)); + ExpectStrEQ(msg3, msgBuf); + + ExpectTrue(wolfSSL_session_reused(ssl_c)); + ExpectTrue(wolfSSL_session_reused(ssl_s)); + + wolfSSL_SESSION_free(sess); + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + } + } +#endif + return EXPECT_RESULT(); +} + +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST +static int test_self_signed_stapling_client_v1_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(ctx), 1); + ExpectIntEQ(wolfSSL_CTX_UseOCSPStapling(ctx, WOLFSSL_CSR_OCSP, + WOLFSSL_CSR_OCSP_USE_NONCE), 1); + return EXPECT_RESULT(); +} +#endif + +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 +static int test_self_signed_stapling_client_v2_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(ctx), 1); + ExpectIntEQ(wolfSSL_CTX_UseOCSPStaplingV2(ctx, WOLFSSL_CSR2_OCSP, + WOLFSSL_CSR2_OCSP_USE_NONCE), 1); + return EXPECT_RESULT(); +} + +static int test_self_signed_stapling_client_v2_multi_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(ctx), 1); + ExpectIntEQ(wolfSSL_CTX_UseOCSPStaplingV2(ctx, WOLFSSL_CSR2_OCSP_MULTI, + 0), 1); + return EXPECT_RESULT(); +} +#endif + +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) +static int test_self_signed_stapling_server_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_CTX_EnableOCSPStapling(ctx), 1); + return EXPECT_RESULT(); +} +#endif + +static int test_self_signed_stapling(void) +{ + EXPECT_DECLS; +#if defined(HAVE_CERTIFICATE_STATUS_REQUEST) \ + || defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + test_ssl_cbf client_cbf; + test_ssl_cbf server_cbf; + size_t i; + struct { + method_provider client_meth; + method_provider server_meth; + ctx_cb client_ctx; + const char* tls_version; + } params[] = { +#if defined(WOLFSSL_TLS13) && defined(HAVE_CERTIFICATE_STATUS_REQUEST) + { wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, + test_self_signed_stapling_client_v1_ctx_ready, "TLSv1_3 v1" }, +#endif +#ifndef WOLFSSL_NO_TLS12 +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST + { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, + test_self_signed_stapling_client_v1_ctx_ready, "TLSv1_2 v1" }, +#endif +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 + { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, + test_self_signed_stapling_client_v2_ctx_ready, "TLSv1_2 v2" }, + { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, + test_self_signed_stapling_client_v2_multi_ctx_ready, + "TLSv1_2 v2 multi" }, +#endif +#endif + }; + + for (i = 0; i < sizeof(params)/sizeof(*params) && !EXPECT_FAIL(); i++) { + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + + printf("\nTesting self-signed cert with status request: %s\n", + params[i].tls_version); + + client_cbf.method = params[i].client_meth; + client_cbf.ctx_ready = params[i].client_ctx; + + server_cbf.method = params[i].server_meth; + server_cbf.certPemFile = "certs/ca-cert.pem"; + server_cbf.keyPemFile = "certs/ca-key.pem"; + server_cbf.ctx_ready = test_self_signed_stapling_server_ctx_ready; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, + &server_cbf, NULL), TEST_SUCCESS); + } +#endif + return EXPECT_RESULT(); +} + +static int test_tls_multi_handshakes_one_record(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_NO_TLS12) + struct test_memio_ctx test_ctx; + WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; + WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + RecordLayerHeader* rh = NULL; + byte *len ; + int newRecIdx = RECORD_HEADER_SZ; + int idx = 0; + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLS_client_method, wolfTLSv1_2_server_method), 0); + + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(wolfSSL_accept(ssl_s), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + + /* Combine server handshake msgs into one record */ + while (idx < test_ctx.c_len) { + word16 recLen; + + rh = (RecordLayerHeader*)(test_ctx.c_buff + idx); + len = &rh->length[0]; + + ato16((const byte*)len, &recLen); + idx += RECORD_HEADER_SZ; + + XMEMMOVE(test_ctx.c_buff + newRecIdx, test_ctx.c_buff + idx, + (size_t)recLen); + + newRecIdx += recLen; + idx += recLen; + } + rh = (RecordLayerHeader*)(test_ctx.c_buff); + len = &rh->length[0]; + c16toa(newRecIdx - RECORD_HEADER_SZ, len); + test_ctx.c_len = newRecIdx; + + ExpectIntEQ(wolfSSL_connect(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); +#endif + return EXPECT_RESULT(); +} + + +static int test_write_dup(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && defined(HAVE_WRITE_DUP) + size_t i, j; + char hiWorld[] = "dup message"; + char readData[sizeof(hiWorld) + 5]; + struct { + method_provider client_meth; + method_provider server_meth; + const char* version_name; + int version; + } methods[] = { +#ifndef WOLFSSL_NO_TLS12 + {wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLS 1.2", WOLFSSL_TLSV1_2}, +#endif +#ifdef WOLFSSL_TLS13 + {wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLS 1.3", WOLFSSL_TLSV1_3}, +#endif + }; + struct { + const char* cipher; + int version; + } ciphers[] = { +/* For simplicity the macros are copied from internal.h */ +/* TLS 1.2 */ +#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && !defined(NO_SHA256) + #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448) + #ifndef NO_RSA + {"ECDHE-RSA-CHACHA20-POLY1305", WOLFSSL_TLSV1_2}, + #endif + #endif + #if !defined(NO_DH) && !defined(NO_RSA) && !defined(NO_TLS_DH) + {"DHE-RSA-CHACHA20-POLY1305", WOLFSSL_TLSV1_2}, + #endif +#endif +#if !defined(NO_DH) && !defined(NO_AES) && !defined(NO_TLS) && \ + !defined(NO_RSA) && defined(HAVE_AESGCM) && !defined(NO_TLS_DH) + #if !defined(NO_SHA256) && defined(WOLFSSL_AES_128) + {"DHE-RSA-AES128-GCM-SHA256", WOLFSSL_TLSV1_2}, + #endif + #if defined(WOLFSSL_SHA384) && defined(WOLFSSL_AES_256) + {"DHE-RSA-AES256-GCM-SHA384", WOLFSSL_TLSV1_2}, + #endif +#endif +#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) \ + && !defined(NO_TLS) && !defined(NO_AES) + #ifdef HAVE_AESGCM + #if !defined(NO_SHA256) && defined(WOLFSSL_AES_128) + #ifndef NO_RSA + {"ECDHE-RSA-AES128-GCM-SHA256", WOLFSSL_TLSV1_2}, + #endif + #endif + #if defined(WOLFSSL_SHA384) && defined(WOLFSSL_AES_256) + #ifndef NO_RSA + {"ECDHE-RSA-AES256-GCM-SHA384", WOLFSSL_TLSV1_2}, + #endif + #endif + #endif +#endif +/* TLS 1.3 */ +#ifdef WOLFSSL_TLS13 + #ifdef HAVE_AESGCM + #if !defined(NO_SHA256) && defined(WOLFSSL_AES_128) + {"TLS13-AES128-GCM-SHA256", WOLFSSL_TLSV1_3}, + #endif + #if defined(WOLFSSL_SHA384) && defined(WOLFSSL_AES_256) + {"TLS13-AES256-GCM-SHA384", WOLFSSL_TLSV1_3}, + #endif + #endif + #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) + #ifndef NO_SHA256 + {"TLS13-CHACHA20-POLY1305-SHA256", WOLFSSL_TLSV1_3}, + #endif + #endif + #ifdef HAVE_AESCCM + #if !defined(NO_SHA256) && defined(WOLFSSL_AES_128) + {"TLS13-AES128-CCM-SHA256", WOLFSSL_TLSV1_3}, + #endif + #endif +#endif + }; + + for (i = 0; i < XELEM_CNT(methods); i++) { + for (j = 0; j < XELEM_CNT(ciphers) && !EXPECT_FAIL(); j++) { + struct test_memio_ctx test_ctx; + WOLFSSL_CTX *ctx_c = NULL, *ctx_s = NULL; + WOLFSSL *ssl_c = NULL, *ssl_s = NULL; + WOLFSSL *ssl_c2 = NULL; + + if (methods[i].version != ciphers[j].version) + continue; + + if (i == 0 && j == 0) + printf("\n"); + + printf("Testing %s with %s... ", methods[i].version_name, + ciphers[j].cipher); + + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + + test_ctx.c_ciphers = test_ctx.s_ciphers = ciphers[j].cipher; + + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + methods[i].client_meth, methods[i].server_meth), 0); + ExpectIntEQ(test_memio_do_handshake(ssl_c, ssl_s, 10, NULL), 0); + + ExpectNotNull(ssl_c2 = wolfSSL_write_dup(ssl_c)); + ExpectIntEQ(wolfSSL_write(ssl_c, hiWorld, sizeof(hiWorld)), + WRITE_DUP_WRITE_E); + ExpectIntEQ(wolfSSL_write(ssl_c2, hiWorld, sizeof(hiWorld)), + sizeof(hiWorld)); + + ExpectIntEQ(wolfSSL_read(ssl_s, readData, sizeof(readData)), + sizeof(hiWorld)); + ExpectIntEQ(wolfSSL_write(ssl_s, hiWorld, sizeof(hiWorld)), + sizeof(hiWorld)); + + ExpectIntEQ(wolfSSL_read(ssl_c2, readData, sizeof(readData)), + WRITE_DUP_READ_E); + ExpectIntEQ(wolfSSL_read(ssl_c, readData, sizeof(readData)), + sizeof(hiWorld)); + + if (EXPECT_SUCCESS()) + printf("ok\n"); + else + printf("failed\n"); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_c2); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + } + } +#endif + return EXPECT_RESULT(); +} + +static int test_read_write_hs(void) +{ + + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) && !defined(WOLFSSL_NO_TLS12) + WOLFSSL_CTX *ctx_s = NULL, *ctx_c = NULL; + WOLFSSL *ssl_s = NULL, *ssl_c = NULL; + struct test_memio_ctx test_ctx; + byte test_buffer[16]; + unsigned int test; + + /* test == 0 : client writes, server reads */ + /* test == 1 : server writes, client reads */ + for (test = 0; test < 2; test++) { + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + wolfTLSv1_2_client_method, + wolfTLSv1_2_server_method), 0); + ExpectIntEQ(wolfSSL_set_group_messages(ssl_s), WOLFSSL_SUCCESS); + /* CH -> */ + if (test == 0) { + ExpectIntEQ(wolfSSL_write(ssl_c, "hello", 5), -1); + } else { + ExpectIntEQ(wolfSSL_read(ssl_c, test_buffer, + sizeof(test_buffer)), -1); + } + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + + /* <- SH + SKE + SHD */ + if (test == 0) { + ExpectIntEQ(wolfSSL_read(ssl_s, test_buffer, + sizeof(test_buffer)), -1); + } else { + ExpectIntEQ(wolfSSL_write(ssl_s, "hello", 5), -1); + } + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_READ); + + /* -> CKE + CLIENT FINISHED */ + if (test == 0) { + ExpectIntEQ(wolfSSL_write(ssl_c, "hello", 5), -1); + } else { + ExpectIntEQ(wolfSSL_read(ssl_c, test_buffer, + sizeof(test_buffer)), -1); + } + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + + /* abide clang static analyzer */ + if (ssl_s != NULL) { + /* disable group message to separate sending of ChangeCipherspec + * from Finished */ + ssl_s->options.groupMessages = 0; + } + /* allow writing of CS, but not FINISHED */ + test_ctx.c_len = TEST_MEMIO_BUF_SZ - 6; + + /* <- CS */ + if (test == 0) { + ExpectIntEQ(wolfSSL_read(ssl_s, test_buffer, + sizeof(test_buffer)), -1); + } else { + ExpectIntEQ(wolfSSL_write(ssl_s, "hello", 5), -1); + } + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), WOLFSSL_ERROR_WANT_WRITE); + + /* move CS message where the client can read it */ + memmove(test_ctx.c_buff, + (test_ctx.c_buff + TEST_MEMIO_BUF_SZ - 6), 6); + test_ctx.c_len = 6; + /* read CS */ + if (test == 0) { + ExpectIntEQ(wolfSSL_write(ssl_c, "hello", 5), -1); + } else { + ExpectIntEQ(wolfSSL_read(ssl_c, test_buffer, + sizeof(test_buffer)), -1); + } + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + ExpectIntEQ(test_ctx.c_len, 0); + + if (test == 0) { + /* send SERVER FINISHED */ + ExpectIntEQ(wolfSSL_read(ssl_s, test_buffer, + sizeof(test_buffer)), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_s, -1), + WOLFSSL_ERROR_WANT_READ); + } else { + /* send SERVER FINISHED + App Data */ + ExpectIntEQ(wolfSSL_write(ssl_s, "hello", 5), 5); + } + + ExpectIntGT(test_ctx.c_len, 0); + + /* Send and receive the data */ + if (test == 0) { + ExpectIntEQ(wolfSSL_write(ssl_c, "hello", 5), 5); + ExpectIntEQ(wolfSSL_read(ssl_s, test_buffer, + sizeof(test_buffer)), 5); + } else { + ExpectIntEQ(wolfSSL_read(ssl_c, test_buffer, + sizeof(test_buffer)), 5); + } + + ExpectBufEQ(test_buffer, "hello", 5); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + ssl_c = ssl_s = NULL; + ctx_c = ctx_s = NULL; + } + +#endif + return EXPECT_RESULT(); +} + +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && defined(OPENSSL_EXTRA) +static const char* test_get_signature_nid_siglag; +static int test_get_signature_nid_sig; +static int test_get_signature_nid_hash; + +static int test_get_signature_nid_ssl_ready(WOLFSSL* ssl) +{ + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_set_cipher_list(ssl, "ALL"), WOLFSSL_SUCCESS); + if (!wolfSSL_is_server(ssl)) { + ExpectIntEQ(wolfSSL_set1_sigalgs_list(ssl, + test_get_signature_nid_siglag), WOLFSSL_SUCCESS); + } + return EXPECT_RESULT(); +} + +static int test_get_signature_nid_on_hs_client(WOLFSSL_CTX **ctx, WOLFSSL **ssl) +{ + EXPECT_DECLS; + int nid = 0; + (void)ctx; + if (XSTRSTR(wolfSSL_get_cipher(*ssl), "TLS_RSA_") == NULL) { + ExpectIntEQ(SSL_get_peer_signature_type_nid(*ssl, &nid), WOLFSSL_SUCCESS); + ExpectIntEQ(nid, test_get_signature_nid_sig); + ExpectIntEQ(SSL_get_peer_signature_nid(*ssl, &nid), WOLFSSL_SUCCESS); + ExpectIntEQ(nid, test_get_signature_nid_hash); + } + else /* No sigalg info on static ciphersuite */ + return TEST_SUCCESS; + return EXPECT_RESULT(); +} + +static int test_get_signature_nid_on_hs_server(WOLFSSL_CTX **ctx, WOLFSSL **ssl) +{ + EXPECT_DECLS; + int nid = 0; + (void)ctx; + ExpectIntEQ(SSL_get_signature_type_nid(*ssl, &nid), WOLFSSL_SUCCESS); + ExpectIntEQ(nid, test_get_signature_nid_sig); + ExpectIntEQ(SSL_get_signature_nid(*ssl, &nid), WOLFSSL_SUCCESS); + ExpectIntEQ(nid, test_get_signature_nid_hash); + return EXPECT_RESULT(); +} +#endif + +static int test_get_signature_nid(void) +{ + EXPECT_DECLS; +#if defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) && defined(OPENSSL_EXTRA) + test_ssl_cbf client_cbf; + test_ssl_cbf server_cbf; + size_t i; +#define TGSN_TLS12_RSA(sigalg, sig_nid, hash_nid) \ + { sigalg, sig_nid, hash_nid, WOLFSSL_TLSV1_2, svrCertFile, svrKeyFile, \ + caCertFile } +#define TGSN_TLS12_ECDSA(sigalg, sig_nid, hash_nid) \ + { sigalg, sig_nid, hash_nid, WOLFSSL_TLSV1_2, eccCertFile, eccKeyFile, \ + caEccCertFile } +#define TGSN_TLS13_RSA(sigalg, sig_nid, hash_nid) \ + { sigalg, sig_nid, hash_nid, WOLFSSL_TLSV1_3, svrCertFile, svrKeyFile, \ + caCertFile } +#define TGSN_TLS13_ECDSA(sigalg, sig_nid, hash_nid) \ + { sigalg, sig_nid, hash_nid, WOLFSSL_TLSV1_3, eccCertFile, eccKeyFile, \ + caEccCertFile } +#define TGSN_TLS13_ED25519(sigalg, sig_nid, hash_nid) \ + { sigalg, sig_nid, hash_nid, WOLFSSL_TLSV1_3, edCertFile, edKeyFile, \ + caEdCertFile } +#define TGSN_TLS13_ED448(sigalg, sig_nid, hash_nid) \ + { sigalg, sig_nid, hash_nid, WOLFSSL_TLSV1_3, ed448CertFile, ed448KeyFile, \ + caEd448CertFile } + struct { + const char* siglag; + int sig_nid; + int hash_nid; + int tls_ver; + const char* server_cert; + const char* server_key; + const char* client_ca; + } params[] = { +#ifndef NO_RSA + #ifndef NO_SHA256 + TGSN_TLS12_RSA("RSA+SHA256", NID_rsaEncryption, NID_sha256), + #ifdef WC_RSA_PSS + TGSN_TLS12_RSA("RSA-PSS+SHA256", NID_rsassaPss, NID_sha256), + TGSN_TLS13_RSA("RSA-PSS+SHA256", NID_rsassaPss, NID_sha256), + #endif + #endif + #ifdef WOLFSSL_SHA512 + TGSN_TLS12_RSA("RSA+SHA512", NID_rsaEncryption, NID_sha512), + #ifdef WC_RSA_PSS + TGSN_TLS12_RSA("RSA-PSS+SHA512", NID_rsassaPss, NID_sha512), + TGSN_TLS13_RSA("RSA-PSS+SHA512", NID_rsassaPss, NID_sha512), + #endif + #endif +#endif +#ifdef HAVE_ECC + #ifndef NO_SHA256 + TGSN_TLS12_ECDSA("ECDSA+SHA256", NID_X9_62_id_ecPublicKey, NID_sha256), + TGSN_TLS13_ECDSA("ECDSA+SHA256", NID_X9_62_id_ecPublicKey, NID_sha256), + #endif +#endif +#ifdef HAVE_ED25519 + TGSN_TLS13_ED25519("ED25519", NID_ED25519, NID_sha512), +#endif +#ifdef HAVE_ED448 + TGSN_TLS13_ED448("ED448", NID_ED448, NID_sha512), +#endif + }; + + printf("\n"); + + for (i = 0; i < XELEM_CNT(params) && !EXPECT_FAIL(); i++) { + + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + + printf("Testing %s with %s...", tls_desc[params[i].tls_ver], + params[i].siglag); + + switch (params[i].tls_ver) { +#ifndef WOLFSSL_NO_TLS12 + case WOLFSSL_TLSV1_2: + client_cbf.method = wolfTLSv1_2_client_method; + server_cbf.method = wolfTLSv1_2_server_method; + break; +#endif +#ifdef WOLFSSL_TLS13 + case WOLFSSL_TLSV1_3: + client_cbf.method = wolfTLSv1_3_client_method; + server_cbf.method = wolfTLSv1_3_server_method; + break; +#endif + default: + printf("skipping\n"); + continue; + } + + test_get_signature_nid_siglag = params[i].siglag; + test_get_signature_nid_sig = params[i].sig_nid; + test_get_signature_nid_hash = params[i].hash_nid; + + client_cbf.ssl_ready = test_get_signature_nid_ssl_ready; + server_cbf.ssl_ready = test_get_signature_nid_ssl_ready; + + client_cbf.on_handshake = test_get_signature_nid_on_hs_client; + server_cbf.on_handshake = test_get_signature_nid_on_hs_server; + + server_cbf.certPemFile = params[i].server_cert; + server_cbf.keyPemFile = params[i].server_key; + + client_cbf.caPemFile = params[i].client_ca; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, + &server_cbf, NULL), TEST_SUCCESS); + if (EXPECT_SUCCESS()) + printf("passed\n"); + } + +#endif + return EXPECT_RESULT(); +} + +#if !defined(NO_CERTS) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) +static word32 test_tls_cert_store_unchanged_HashCaTable(Signer** caTable) +{ +#ifndef NO_MD5 + enum wc_HashType hashType = WC_HASH_TYPE_MD5; +#elif !defined(NO_SHA) + enum wc_HashType hashType = WC_HASH_TYPE_SHA; +#elif !defined(NO_SHA256) + enum wc_HashType hashType = WC_HASH_TYPE_SHA256; +#else + #error "We need a digest to hash the Signer object" +#endif + byte hashBuf[WC_MAX_DIGEST_SIZE]; + wc_HashAlg hash; + size_t i; + + AssertIntEQ(wc_HashInit(&hash, hashType), 0); + for (i = 0; i < CA_TABLE_SIZE; i++) { + Signer* cur; + for (cur = caTable[i]; cur != NULL; cur = cur->next) + AssertIntEQ(wc_HashUpdate(&hash, hashType, (byte*)cur, + sizeof(*cur)), 0); + } + AssertIntEQ(wc_HashFinal(&hash, hashType, hashBuf), 0); + AssertIntEQ(wc_HashFree(&hash, hashType), 0); + + return MakeWordFromHash(hashBuf); +} + +static word32 test_tls_cert_store_unchanged_before_hashes[2]; +static size_t test_tls_cert_store_unchanged_before_hashes_idx; +static word32 test_tls_cert_store_unchanged_after_hashes[2]; +static size_t test_tls_cert_store_unchanged_after_hashes_idx; + +static int test_tls_cert_store_unchanged_ctx_ready(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + + ExpectIntNE(test_tls_cert_store_unchanged_before_hashes + [test_tls_cert_store_unchanged_before_hashes_idx++] = + test_tls_cert_store_unchanged_HashCaTable(ctx->cm->caTable), 0); + + wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER | + WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT, 0); + + return EXPECT_RESULT(); +} + +static int test_tls_cert_store_unchanged_ctx_cleanup(WOLFSSL_CTX* ctx) +{ + EXPECT_DECLS; + ExpectIntEQ(wolfSSL_CTX_UnloadIntermediateCerts(ctx), WOLFSSL_SUCCESS); + ExpectIntNE(test_tls_cert_store_unchanged_after_hashes + [test_tls_cert_store_unchanged_after_hashes_idx++] = + test_tls_cert_store_unchanged_HashCaTable(ctx->cm->caTable), 0); + + return EXPECT_RESULT(); +} + +static int test_tls_cert_store_unchanged_on_hs(WOLFSSL_CTX **ctx, WOLFSSL **ssl) +{ + EXPECT_DECLS; + WOLFSSL_CERT_MANAGER* cm; + + (void)ssl; + /* WARNING: this approach bypasses the reference counter check in + * wolfSSL_CTX_UnloadIntermediateCerts. It is not recommended as it may + * cause unexpected behaviour when other active connections try accessing + * the caTable. */ + ExpectNotNull(cm = wolfSSL_CTX_GetCertManager(*ctx)); + ExpectIntEQ(wolfSSL_CertManagerUnloadIntermediateCerts(cm), + WOLFSSL_SUCCESS); + ExpectIntNE(test_tls_cert_store_unchanged_after_hashes + [test_tls_cert_store_unchanged_after_hashes_idx++] = + test_tls_cert_store_unchanged_HashCaTable((*ctx)->cm->caTable), 0); + + return EXPECT_RESULT(); +} + +static int test_tls_cert_store_unchanged_ssl_ready(WOLFSSL* ssl) +{ + EXPECT_DECLS; + WOLFSSL_CTX* ctx; + + ExpectNotNull(ctx = wolfSSL_get_SSL_CTX(ssl)); + + return EXPECT_RESULT(); +} +#endif + +static int test_tls_cert_store_unchanged(void) +{ + EXPECT_DECLS; +#if !defined(NO_CERTS) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) + test_ssl_cbf client_cbf; + test_ssl_cbf server_cbf; + int i; + + for (i = 0; i < 2; i++) { + XMEMSET(&client_cbf, 0, sizeof(client_cbf)); + XMEMSET(&server_cbf, 0, sizeof(server_cbf)); + + test_tls_cert_store_unchanged_before_hashes_idx = 0; + XMEMSET(test_tls_cert_store_unchanged_before_hashes, 0, + sizeof(test_tls_cert_store_unchanged_before_hashes)); + test_tls_cert_store_unchanged_after_hashes_idx = 0; + XMEMSET(test_tls_cert_store_unchanged_after_hashes, 0, + sizeof(test_tls_cert_store_unchanged_after_hashes)); + + client_cbf.ctx_ready = test_tls_cert_store_unchanged_ctx_ready; + server_cbf.ctx_ready = test_tls_cert_store_unchanged_ctx_ready; + + client_cbf.ssl_ready = test_tls_cert_store_unchanged_ssl_ready; + server_cbf.ssl_ready = test_tls_cert_store_unchanged_ssl_ready; + + switch (i) { + case 0: + client_cbf.on_ctx_cleanup = + test_tls_cert_store_unchanged_ctx_cleanup; + server_cbf.on_ctx_cleanup = + test_tls_cert_store_unchanged_ctx_cleanup; + break; + case 1: + client_cbf.on_handshake = test_tls_cert_store_unchanged_on_hs; + server_cbf.on_handshake = test_tls_cert_store_unchanged_on_hs; + break; + default: + Fail(("Should not enter here"), ("Entered here")); + } + + + client_cbf.certPemFile = "certs/intermediate/client-chain.pem"; + server_cbf.certPemFile = "certs/intermediate/server-chain.pem"; + + server_cbf.caPemFile = caCertFile; + + ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, + &server_cbf, NULL), TEST_SUCCESS); + + ExpectBufEQ(test_tls_cert_store_unchanged_before_hashes, + test_tls_cert_store_unchanged_after_hashes, + sizeof(test_tls_cert_store_unchanged_after_hashes)); + } +#endif + return EXPECT_RESULT(); +} + +static int test_wolfSSL_SendUserCanceled(void) +{ + EXPECT_DECLS; +#if defined(HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES) + size_t i; + struct { + method_provider client_meth; + method_provider server_meth; + const char* tls_version; + } params[] = { +#if defined(WOLFSSL_TLS13) +/* With WOLFSSL_TLS13_MIDDLEBOX_COMPAT a short ID will result in an error */ + { wolfTLSv1_3_client_method, wolfTLSv1_3_server_method, "TLSv1_3" }, +#ifdef WOLFSSL_DTLS13 + { wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "DTLSv1_3" }, +#endif +#endif +#ifndef WOLFSSL_NO_TLS12 + { wolfTLSv1_2_client_method, wolfTLSv1_2_server_method, "TLSv1_2" }, +#ifdef WOLFSSL_DTLS + { wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, "DTLSv1_2" }, +#endif +#endif +#if !defined(NO_OLD_TLS) + { wolfTLSv1_1_client_method, wolfTLSv1_1_server_method, "TLSv1_1" }, +#ifdef WOLFSSL_DTLS + { wolfDTLSv1_client_method, wolfDTLSv1_server_method, "DTLSv1_0" }, +#endif +#endif + }; + + for (i = 0; i < sizeof(params)/sizeof(*params) && !EXPECT_FAIL(); i++) { + WOLFSSL_CTX *ctx_c = NULL; + WOLFSSL_CTX *ctx_s = NULL; + WOLFSSL *ssl_c = NULL; + WOLFSSL *ssl_s = NULL; + struct test_memio_ctx test_ctx; + WOLFSSL_ALERT_HISTORY h; + + printf("Testing %s\n", params[i].tls_version); + + XMEMSET(&h, 0, sizeof(h)); + XMEMSET(&test_ctx, 0, sizeof(test_ctx)); + ExpectIntEQ(test_memio_setup(&test_ctx, &ctx_c, &ctx_s, &ssl_c, &ssl_s, + params[i].client_meth, params[i].server_meth), 0); + + /* CH1 */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_WANT_READ); + + ExpectIntEQ(wolfSSL_SendUserCanceled(ssl_s), WOLFSSL_SHUTDOWN_NOT_DONE); + + /* Alert closed connection */ + ExpectIntEQ(wolfSSL_negotiate(ssl_c), -1); + ExpectIntEQ(wolfSSL_get_error(ssl_c, -1), WOLFSSL_ERROR_ZERO_RETURN); + + /* Last alert will be close notify because user_canceled should be + * followed by a close_notify */ + ExpectIntEQ(wolfSSL_get_alert_history(ssl_c, &h), WOLFSSL_SUCCESS); + ExpectIntEQ(h.last_rx.code, close_notify); + ExpectIntEQ(h.last_rx.level, alert_warning); + + wolfSSL_free(ssl_c); + wolfSSL_free(ssl_s); + wolfSSL_CTX_free(ctx_c); + wolfSSL_CTX_free(ctx_s); + } +#endif + return EXPECT_RESULT(); } + /*----------------------------------------------------------------------------* | Main *----------------------------------------------------------------------------*/ @@ -66846,138 +82703,369 @@ TEST_CASE testCases[] = { TEST_DECL(test_fileAccess), - TEST_DECL(test_wolfSSL_Init), - TEST_DECL(test_wolfSSL_Method_Allocators), -#ifndef NO_WOLFSSL_SERVER - TEST_DECL(test_wolfSSL_CTX_new), -#endif - TEST_DECL(test_server_wolfSSL_new), - TEST_DECL(test_client_wolfSSL_new), -#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && \ - (!defined(NO_RSA) || defined(HAVE_ECC)) && !defined(NO_FILESYSTEM) - TEST_DECL(test_for_double_Free), -#endif -#ifdef HAVE_IO_TESTS_DEPENDENCIES - TEST_DECL(test_wolfSSL_get_finished), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_CTX_add_session), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_CTX_add_session_ext), -#endif - TEST_DECL(test_SSL_CIPHER_get_xxx), - TEST_DECL(test_wolfSSL_ERR_strings), - TEST_DECL(test_wolfSSL_EVP_shake128), - TEST_DECL(test_wolfSSL_EVP_shake256), - TEST_DECL(test_EVP_blake2), - TEST_DECL(test_EVP_MD_do_all), - TEST_DECL(test_OBJ_NAME_do_all), - TEST_DECL(test_wolfSSL_CTX_set_cipher_list_bytes), - TEST_DECL(test_wolfSSL_CTX_use_certificate_file), - TEST_DECL(test_wolfSSL_CTX_use_certificate_buffer), - TEST_DECL(test_wolfSSL_CTX_use_PrivateKey_file), - TEST_DECL(test_wolfSSL_CTX_load_verify_locations), - /* Large number of memory allocations. */ - TEST_DECL(test_wolfSSL_CTX_load_system_CA_certs), - TEST_DECL(test_wolfSSL_CertManagerCheckOCSPResponse), - TEST_DECL(test_wolfSSL_CheckOCSPResponse), - TEST_DECL(test_wolfSSL_CertManagerLoadCABuffer), - TEST_DECL(test_wolfSSL_CertManagerLoadCABuffer_ex), - TEST_DECL(test_wolfSSL_CertManagerGetCerts), - TEST_DECL(test_wolfSSL_CertManagerSetVerify), - TEST_DECL(test_wolfSSL_CertManagerNameConstraint), - TEST_DECL(test_wolfSSL_CertManagerNameConstraint2), - TEST_DECL(test_wolfSSL_CertManagerNameConstraint3), - TEST_DECL(test_wolfSSL_CertManagerNameConstraint4), - TEST_DECL(test_wolfSSL_CertManagerNameConstraint5), - TEST_DECL(test_wolfSSL_FPKI), - TEST_DECL(test_wolfSSL_OtherName), - TEST_DECL(test_wolfSSL_CertRsaPss), - TEST_DECL(test_wolfSSL_CertManagerCRL), - TEST_DECL(test_wolfSSL_CTX_load_verify_locations_ex), - TEST_DECL(test_wolfSSL_CTX_load_verify_buffer_ex), - TEST_DECL(test_wolfSSL_CTX_load_verify_chain_buffer_format), - TEST_DECL(test_wolfSSL_CTX_add1_chain_cert), - TEST_DECL(test_wolfSSL_CTX_use_certificate_chain_file_format), - TEST_DECL(test_wolfSSL_CTX_trust_peer_cert), - TEST_DECL(test_wolfSSL_CTX_SetTmpDH_file), - TEST_DECL(test_wolfSSL_CTX_SetTmpDH_buffer), - TEST_DECL(test_wolfSSL_CTX_SetMinMaxDhKey_Sz), - TEST_DECL(test_wolfSSL_CTX_der_load_verify_locations), - TEST_DECL(test_wolfSSL_CTX_enable_disable), - TEST_DECL(test_wolfSSL_CTX_ticket_API), - TEST_DECL(test_wolfSSL_SetTmpDH_file), - TEST_DECL(test_wolfSSL_SetTmpDH_buffer), - TEST_DECL(test_wolfSSL_SetMinMaxDhKey_Sz), - TEST_DECL(test_SetTmpEC_DHE_Sz), - TEST_DECL(test_wolfSSL_CTX_get0_privatekey), - TEST_DECL(test_wolfSSL_dtls_set_mtu), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_dtls_plaintext), -#if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ - defined(HAVE_IO_TESTS_DEPENDENCIES) - TEST_DECL(test_wolfSSL_read_write), - /* Can't memory test as server hangs if client fails before second connect. - */ - TEST_DECL(test_wolfSSL_reuse_WOLFSSLobj), - TEST_DECL(test_wolfSSL_CTX_verifyDepth_ServerClient_1), - TEST_DECL(test_wolfSSL_CTX_verifyDepth_ServerClient_2), - TEST_DECL(test_wolfSSL_CTX_verifyDepth_ServerClient_3), - TEST_DECL(test_wolfSSL_CTX_set_cipher_list), - /* Can't memory test as server hangs. */ - TEST_DECL(test_wolfSSL_dtls_export), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_tls_export), -#endif - TEST_DECL(test_wolfSSL_SetMinVersion), - TEST_DECL(test_wolfSSL_CTX_SetMinVersion), + /********************************* + * wolfcrypt + *********************************/ - /* TLS extensions tests */ -#ifdef HAVE_IO_TESTS_DEPENDENCIES -#ifdef HAVE_SNI - TEST_DECL(test_wolfSSL_UseSNI_params), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_UseSNI_connection), - TEST_DECL(test_wolfSSL_SNI_GetFromBuffer), -#endif /* HAVE_SNI */ -#endif - TEST_DECL(test_wolfSSL_UseTrustedCA), - TEST_DECL(test_wolfSSL_UseMaxFragment), - TEST_DECL(test_wolfSSL_UseTruncatedHMAC), - TEST_DECL(test_wolfSSL_UseSupportedCurve), -#if defined(HAVE_ALPN) && defined(HAVE_IO_TESTS_DEPENDENCIES) - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_UseALPN_connection), - TEST_DECL(test_wolfSSL_UseALPN_params), + TEST_DECL(test_ForceZero), + + TEST_DECL(test_wolfCrypt_Init), + + TEST_DECL(test_wc_LoadStaticMemory_ex), + + /* Locking with Compat Mutex */ + TEST_DECL(test_wc_SetMutexCb), + TEST_DECL(test_wc_LockMutex_ex), + + /* Digests */ + TEST_DECL(test_wc_InitMd5), + TEST_DECL(test_wc_Md5Update), + TEST_DECL(test_wc_Md5Final), + TEST_DECL(test_wc_InitSha), + TEST_DECL(test_wc_ShaUpdate), + TEST_DECL(test_wc_ShaFinal), + TEST_DECL(test_wc_InitSha256), + TEST_DECL(test_wc_Sha256Update), + TEST_DECL(test_wc_Sha256Final), + TEST_DECL(test_wc_Sha256FinalRaw), + TEST_DECL(test_wc_Sha256GetFlags), + TEST_DECL(test_wc_Sha256Free), + TEST_DECL(test_wc_Sha256GetHash), + TEST_DECL(test_wc_Sha256Copy), + + TEST_DECL(test_wc_InitSha224), + TEST_DECL(test_wc_Sha224Update), + TEST_DECL(test_wc_Sha224Final), + TEST_DECL(test_wc_Sha224SetFlags), + TEST_DECL(test_wc_Sha224GetFlags), + TEST_DECL(test_wc_Sha224Free), + TEST_DECL(test_wc_Sha224GetHash), + TEST_DECL(test_wc_Sha224Copy), + + TEST_DECL(test_wc_InitSha512), + TEST_DECL(test_wc_Sha512Update), + TEST_DECL(test_wc_Sha512Final), + TEST_DECL(test_wc_Sha512GetFlags), + TEST_DECL(test_wc_Sha512FinalRaw), + TEST_DECL(test_wc_Sha512Free), + TEST_DECL(test_wc_Sha512GetHash), + TEST_DECL(test_wc_Sha512Copy), + + TEST_DECL(test_wc_InitSha512_224), + TEST_DECL(test_wc_Sha512_224Update), + TEST_DECL(test_wc_Sha512_224Final), + TEST_DECL(test_wc_Sha512_224GetFlags), + TEST_DECL(test_wc_Sha512_224FinalRaw), + TEST_DECL(test_wc_Sha512_224Free), + TEST_DECL(test_wc_Sha512_224GetHash), + TEST_DECL(test_wc_Sha512_224Copy), + TEST_DECL(test_wc_InitSha512_256), + TEST_DECL(test_wc_Sha512_256Update), + TEST_DECL(test_wc_Sha512_256Final), + TEST_DECL(test_wc_Sha512_256GetFlags), + TEST_DECL(test_wc_Sha512_256FinalRaw), + TEST_DECL(test_wc_Sha512_256Free), + TEST_DECL(test_wc_Sha512_256GetHash), + TEST_DECL(test_wc_Sha512_256Copy), + + TEST_DECL(test_wc_InitSha384), + TEST_DECL(test_wc_Sha384Update), + TEST_DECL(test_wc_Sha384Final), + TEST_DECL(test_wc_Sha384GetFlags), + TEST_DECL(test_wc_Sha384FinalRaw), + TEST_DECL(test_wc_Sha384Free), + TEST_DECL(test_wc_Sha384GetHash), + TEST_DECL(test_wc_Sha384Copy), + + TEST_DECL(test_wc_InitBlake2b), + TEST_DECL(test_wc_InitBlake2b_WithKey), + TEST_DECL(test_wc_InitBlake2s_WithKey), + TEST_DECL(test_wc_InitRipeMd), + TEST_DECL(test_wc_RipeMdUpdate), + TEST_DECL(test_wc_RipeMdFinal), + + TEST_DECL(test_wc_InitSha3), + TEST_DECL(testing_wc_Sha3_Update), + TEST_DECL(test_wc_Sha3_224_Final), + TEST_DECL(test_wc_Sha3_256_Final), + TEST_DECL(test_wc_Sha3_384_Final), + TEST_DECL(test_wc_Sha3_512_Final), + TEST_DECL(test_wc_Sha3_224_Copy), + TEST_DECL(test_wc_Sha3_256_Copy), + TEST_DECL(test_wc_Sha3_384_Copy), + TEST_DECL(test_wc_Sha3_512_Copy), + TEST_DECL(test_wc_Sha3_GetFlags), + TEST_DECL(test_wc_InitShake256), + TEST_DECL(testing_wc_Shake256_Update), + TEST_DECL(test_wc_Shake256_Final), + TEST_DECL(test_wc_Shake256_Copy), + TEST_DECL(test_wc_Shake256Hash), + + /* SM3 Digest */ + TEST_DECL(test_wc_InitSm3Free), + TEST_DECL(test_wc_Sm3UpdateFinal), + TEST_DECL(test_wc_Sm3GetHash), + TEST_DECL(test_wc_Sm3Copy), + TEST_DECL(test_wc_Sm3FinalRaw), + TEST_DECL(test_wc_Sm3GetSetFlags), + TEST_DECL(test_wc_Sm3Hash), + + TEST_DECL(test_wc_HashInit), + TEST_DECL(test_wc_HashSetFlags), + TEST_DECL(test_wc_HashGetFlags), + + /* HMAC */ + TEST_DECL(test_wc_Md5HmacSetKey), + TEST_DECL(test_wc_Md5HmacUpdate), + TEST_DECL(test_wc_Md5HmacFinal), + TEST_DECL(test_wc_ShaHmacSetKey), + TEST_DECL(test_wc_ShaHmacUpdate), + TEST_DECL(test_wc_ShaHmacFinal), + TEST_DECL(test_wc_Sha224HmacSetKey), + TEST_DECL(test_wc_Sha224HmacUpdate), + TEST_DECL(test_wc_Sha224HmacFinal), + TEST_DECL(test_wc_Sha256HmacSetKey), + TEST_DECL(test_wc_Sha256HmacUpdate), + TEST_DECL(test_wc_Sha256HmacFinal), + TEST_DECL(test_wc_Sha384HmacSetKey), + TEST_DECL(test_wc_Sha384HmacUpdate), + TEST_DECL(test_wc_Sha384HmacFinal), + + /* CMAC */ + TEST_DECL(test_wc_InitCmac), + TEST_DECL(test_wc_CmacUpdate), + TEST_DECL(test_wc_CmacFinal), + TEST_DECL(test_wc_AesCmacGenerate), + + /* Cipher */ + TEST_DECL(test_wc_AesGcmStream), + + TEST_DECL(test_wc_Des3_SetIV), + TEST_DECL(test_wc_Des3_SetKey), + TEST_DECL(test_wc_Des3_CbcEncryptDecrypt), + TEST_DECL(test_wc_Des3_CbcEncryptDecryptWithKey), + TEST_DECL(test_wc_Des3_EcbEncrypt), + + TEST_DECL(test_wc_Chacha_SetKey), + TEST_DECL(test_wc_Chacha_Process), + TEST_DECL(test_wc_ChaCha20Poly1305_aead), + TEST_DECL(test_wc_Poly1305SetKey), + + TEST_DECL(test_wc_CamelliaSetKey), + TEST_DECL(test_wc_CamelliaSetIV), + TEST_DECL(test_wc_CamelliaEncryptDecryptDirect), + TEST_DECL(test_wc_CamelliaCbcEncryptDecrypt), + + TEST_DECL(test_wc_Arc4SetKey), + TEST_DECL(test_wc_Arc4Process), + + TEST_DECL(test_wc_Rc2SetKey), + TEST_DECL(test_wc_Rc2SetIV), + TEST_DECL(test_wc_Rc2EcbEncryptDecrypt), + TEST_DECL(test_wc_Rc2CbcEncryptDecrypt), + + /* AES cipher and GMAC. */ + TEST_DECL(test_wc_AesSetKey), + TEST_DECL(test_wc_AesSetIV), + TEST_DECL(test_wc_AesCbcEncryptDecrypt), + TEST_DECL(test_wc_AesCtrEncryptDecrypt), + TEST_DECL(test_wc_AesGcmSetKey), + TEST_DECL(test_wc_AesGcmEncryptDecrypt), + TEST_DECL(test_wc_AesGcmMixedEncDecLongIV), + TEST_DECL(test_wc_GmacSetKey), + TEST_DECL(test_wc_GmacUpdate), + TEST_DECL(test_wc_AesCcmSetKey), + TEST_DECL(test_wc_AesCcmEncryptDecrypt), +#if defined(WOLFSSL_AES_EAX) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + TEST_DECL(test_wc_AesEaxVectors), + TEST_DECL(test_wc_AesEaxEncryptAuth), + TEST_DECL(test_wc_AesEaxDecryptAuth), +#endif /* WOLFSSL_AES_EAX */ + + /* SM4 cipher */ + TEST_DECL(test_wc_Sm4), + TEST_DECL(test_wc_Sm4Ecb), + TEST_DECL(test_wc_Sm4Cbc), + TEST_DECL(test_wc_Sm4Ctr), + TEST_DECL(test_wc_Sm4Gcm), + TEST_DECL(test_wc_Sm4Ccm), + + /* RNG tests */ +#ifdef HAVE_HASHDRBG +#ifdef TEST_RESEED_INTERVAL + TEST_DECL(test_wc_RNG_GenerateBlock_Reseed), #endif -#ifdef HAVE_ALPN_PROTOS_SUPPORT - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_set_alpn_protos), + TEST_DECL(test_wc_RNG_GenerateBlock), #endif - TEST_DECL(test_wolfSSL_DisableExtendedMasterSecret), - TEST_DECL(test_wolfSSL_wolfSSL_UseSecureRenegotiation), - TEST_DECL(test_wolfSSL_SCR_Reconnect), - TEST_DECL(test_tls_ext_duplicate), -#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) - TEST_DECL(test_wolfSSL_Tls13_ECH_params), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_Tls13_ECH), + TEST_DECL(test_get_rand_digit), + TEST_DECL(test_wc_InitRngNonce), + TEST_DECL(test_wc_InitRngNonce_ex), + + /* MP API tests */ + TEST_DECL(test_get_digit_count), + TEST_DECL(test_mp_cond_copy), + TEST_DECL(test_mp_rand), + TEST_DECL(test_get_digit), + TEST_DECL(test_wc_export_int), + + /* RSA */ + TEST_DECL(test_wc_InitRsaKey), + TEST_DECL(test_wc_RsaPrivateKeyDecode), + TEST_DECL(test_wc_RsaPublicKeyDecode), + TEST_DECL(test_wc_RsaPublicKeyDecodeRaw), + TEST_DECL(test_wc_RsaPrivateKeyDecodeRaw), + TEST_DECL(test_wc_MakeRsaKey), + TEST_DECL(test_wc_CheckProbablePrime), + TEST_DECL(test_wc_RsaPSS_Verify), + TEST_DECL(test_wc_RsaPSS_VerifyCheck), + TEST_DECL(test_wc_RsaPSS_VerifyCheckInline), + TEST_DECL(test_wc_RsaKeyToDer), + TEST_DECL(test_wc_RsaKeyToPublicDer), + TEST_DECL(test_wc_RsaPublicEncryptDecrypt), + TEST_DECL(test_wc_RsaPublicEncryptDecrypt_ex), + TEST_DECL(test_wc_RsaEncryptSize), + TEST_DECL(test_wc_RsaSSL_SignVerify), + TEST_DECL(test_wc_RsaFlattenPublicKey), + TEST_DECL(test_RsaDecryptBoundsCheck), + + /* DSA */ + TEST_DECL(test_wc_InitDsaKey), + TEST_DECL(test_wc_DsaSignVerify), + TEST_DECL(test_wc_DsaPublicPrivateKeyDecode), + TEST_DECL(test_wc_MakeDsaKey), + TEST_DECL(test_wc_DsaKeyToDer), + TEST_DECL(test_wc_DsaKeyToPublicDer), + TEST_DECL(test_wc_DsaImportParamsRaw), + TEST_DECL(test_wc_DsaImportParamsRawCheck), + TEST_DECL(test_wc_DsaExportParamsRaw), + TEST_DECL(test_wc_DsaExportKeyRaw), + + /* DH */ + TEST_DECL(test_wc_DhPublicKeyDecode), + + /* wolfCrypt ECC tests */ + TEST_DECL(test_wc_ecc_get_curve_size_from_name), + TEST_DECL(test_wc_ecc_get_curve_id_from_name), + TEST_DECL(test_wc_ecc_get_curve_id_from_params), +#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && \ + !defined(HAVE_SELFTEST) && \ + !(defined(HAVE_FIPS) || defined(HAVE_FIPS_VERSION)) + TEST_DECL(test_wc_ecc_get_curve_id_from_dp_params), #endif + TEST_DECL(test_wc_ecc_make_key), + TEST_DECL(test_wc_ecc_init), + TEST_DECL(test_wc_ecc_check_key), + TEST_DECL(test_wc_ecc_get_generator), + TEST_DECL(test_wc_ecc_size), + TEST_DECL(test_wc_ecc_params), + TEST_DECL(test_wc_ecc_signVerify_hash), + TEST_DECL(test_wc_ecc_shared_secret), + TEST_DECL(test_wc_ecc_export_x963), + TEST_DECL(test_wc_ecc_export_x963_ex), + TEST_DECL(test_wc_ecc_import_x963), + TEST_DECL(test_wc_ecc_import_private_key), + TEST_DECL(test_wc_ecc_export_private_only), + TEST_DECL(test_wc_ecc_rs_to_sig), + TEST_DECL(test_wc_ecc_import_raw), + TEST_DECL(test_wc_ecc_import_unsigned), + TEST_DECL(test_wc_ecc_sig_size), + TEST_DECL(test_wc_ecc_ctx_new), + TEST_DECL(test_wc_ecc_ctx_reset), + TEST_DECL(test_wc_ecc_ctx_set_peer_salt), + TEST_DECL(test_wc_ecc_ctx_set_info), + TEST_DECL(test_wc_ecc_encryptDecrypt), + TEST_DECL(test_wc_ecc_del_point), + TEST_DECL(test_wc_ecc_pointFns), + TEST_DECL(test_wc_ecc_shared_secret_ssh), + TEST_DECL(test_wc_ecc_verify_hash_ex), + TEST_DECL(test_wc_ecc_mulmod), + TEST_DECL(test_wc_ecc_is_valid_idx), + TEST_DECL(test_wc_ecc_get_curve_id_from_oid), + TEST_DECL(test_wc_ecc_sig_size_calc), + TEST_DECL(test_wc_EccPrivateKeyToDer), - /* X509 tests */ - TEST_DECL(test_wolfSSL_X509_NAME_get_entry), - TEST_DECL(test_wolfSSL_PKCS12), - TEST_DECL(test_wolfSSL_no_password_cb), - TEST_DECL(test_wolfSSL_PKCS8), - TEST_DECL(test_wolfSSL_PKCS8_ED25519), - TEST_DECL(test_wolfSSL_PKCS8_ED448), - TEST_DECL(test_wolfSSL_PKCS5), - TEST_DECL(test_wolfSSL_URI), - TEST_DECL(test_wolfSSL_TBS), - TEST_DECL(test_wolfSSL_X509_verify), - TEST_DECL(test_wolfSSL_X509_TLS_version_test_1), - TEST_DECL(test_wolfSSL_X509_TLS_version_test_2), + /* SM2 elliptic curve */ + TEST_DECL(test_wc_ecc_sm2_make_key), + TEST_DECL(test_wc_ecc_sm2_shared_secret), + TEST_DECL(test_wc_ecc_sm2_create_digest), + TEST_DECL(test_wc_ecc_sm2_verify_hash_ex), + TEST_DECL(test_wc_ecc_sm2_verify_hash), + TEST_DECL(test_wc_ecc_sm2_sign_hash_ex), + TEST_DECL(test_wc_ecc_sm2_sign_hash), + + /* Curve25519 */ + TEST_DECL(test_wc_curve25519_init), + TEST_DECL(test_wc_curve25519_size), + TEST_DECL(test_wc_curve25519_export_key_raw), + TEST_DECL(test_wc_curve25519_export_key_raw_ex), + TEST_DECL(test_wc_curve25519_make_key), + TEST_DECL(test_wc_curve25519_shared_secret_ex), + TEST_DECL(test_wc_curve25519_make_pub), + TEST_DECL(test_wc_curve25519_export_public_ex), + TEST_DECL(test_wc_curve25519_export_private_raw_ex), + TEST_DECL(test_wc_curve25519_import_private_raw_ex), + TEST_DECL(test_wc_curve25519_import_private), + + /* ED25519 */ + TEST_DECL(test_wc_ed25519_make_key), + TEST_DECL(test_wc_ed25519_init), + TEST_DECL(test_wc_ed25519_sign_msg), + TEST_DECL(test_wc_ed25519_import_public), + TEST_DECL(test_wc_ed25519_import_private_key), + TEST_DECL(test_wc_ed25519_export), + TEST_DECL(test_wc_ed25519_size), + TEST_DECL(test_wc_ed25519_exportKey), + TEST_DECL(test_wc_Ed25519PublicKeyToDer), + TEST_DECL(test_wc_Ed25519KeyToDer), + TEST_DECL(test_wc_Ed25519PrivateKeyToDer), + + /* Curve448 */ + TEST_DECL(test_wc_curve448_make_key), + TEST_DECL(test_wc_curve448_shared_secret_ex), + TEST_DECL(test_wc_curve448_export_public_ex), + TEST_DECL(test_wc_curve448_export_private_raw_ex), + TEST_DECL(test_wc_curve448_export_key_raw), + TEST_DECL(test_wc_curve448_import_private_raw_ex), + TEST_DECL(test_wc_curve448_import_private), + TEST_DECL(test_wc_curve448_init), + TEST_DECL(test_wc_curve448_size), + + /* Ed448 */ + TEST_DECL(test_wc_ed448_make_key), + TEST_DECL(test_wc_ed448_init), + TEST_DECL(test_wc_ed448_sign_msg), + TEST_DECL(test_wc_ed448_import_public), + TEST_DECL(test_wc_ed448_import_private_key), + TEST_DECL(test_wc_ed448_export), + TEST_DECL(test_wc_ed448_size), + TEST_DECL(test_wc_ed448_exportKey), + TEST_DECL(test_wc_Ed448PublicKeyToDer), + TEST_DECL(test_wc_Ed448KeyToDer), + TEST_DECL(test_wc_Ed448PrivateKeyToDer), + TEST_DECL(test_wc_Curve448PrivateKeyToDer), + + /* Kyber */ + TEST_DECL(test_wc_kyber_make_key_kats), + TEST_DECL(test_wc_kyber_encapsulate_kats), + TEST_DECL(test_wc_kyber_decapsulate_kats), + + /* Dilithium */ + TEST_DECL(test_wc_dilithium), + TEST_DECL(test_wc_dilithium_make_key), + TEST_DECL(test_wc_dilithium_sign), + TEST_DECL(test_wc_dilithium_verify), + TEST_DECL(test_wc_dilithium_check_key), + TEST_DECL(test_wc_dilithium_der), + TEST_DECL(test_wc_dilithium_make_key_from_seed), + TEST_DECL(test_wc_dilithium_verify_kats), + + /* Signature API */ + TEST_DECL(test_wc_SignatureGetSize_ecc), + TEST_DECL(test_wc_SignatureGetSize_rsa), + /* PEM and DER APIs. */ TEST_DECL(test_wc_PemToDer), TEST_DECL(test_wc_AllocDer), TEST_DECL(test_wc_CertPemToDer), @@ -66987,12 +83075,69 @@ TEST_DECL(test_wc_GetPubKeyDerFromCert), TEST_DECL(test_wc_CheckCertSigPubKey), - /* OCSP Stapling */ - TEST_DECL(test_wolfSSL_UseOCSPStapling), - TEST_DECL(test_wolfSSL_UseOCSPStaplingV2), + /* wolfCrypt ASN tests */ + TEST_DECL(test_ToTraditional), + TEST_DECL(test_wc_CreateEncryptedPKCS8Key), + TEST_DECL(test_wc_GetPkcs8TraditionalOffset), - /* Multicast */ - TEST_DECL(test_wolfSSL_mcast), + /* Certificate */ + TEST_DECL(test_wc_SetSubjectRaw), + TEST_DECL(test_wc_GetSubjectRaw), + TEST_DECL(test_wc_SetIssuerRaw), + TEST_DECL(test_wc_SetIssueBuffer), + TEST_DECL(test_wc_SetSubjectKeyId), + TEST_DECL(test_wc_SetSubject), + TEST_DECL(test_CheckCertSignature), + TEST_DECL(test_wc_ParseCert), + TEST_DECL(test_wc_ParseCert_Error), + TEST_DECL(test_MakeCertWithPathLen), + TEST_DECL(test_MakeCertWith0Ser), + TEST_DECL(test_MakeCertWithCaFalse), + TEST_DECL(test_wc_SetKeyUsage), + TEST_DECL(test_wc_SetAuthKeyIdFromPublicKey_ex), + TEST_DECL(test_wc_SetSubjectBuffer), + TEST_DECL(test_wc_SetSubjectKeyIdFromPublicKey_ex), + + /* wolfcrypt PKCS#7 */ + TEST_DECL(test_wc_PKCS7_New), + TEST_DECL(test_wc_PKCS7_Init), + TEST_DECL(test_wc_PKCS7_InitWithCert), + TEST_DECL(test_wc_PKCS7_EncodeData), + TEST_DECL(test_wc_PKCS7_EncodeSignedData), + TEST_DECL(test_wc_PKCS7_EncodeSignedData_ex), + TEST_DECL(test_wc_PKCS7_VerifySignedData_RSA), + TEST_DECL(test_wc_PKCS7_VerifySignedData_ECC), + TEST_DECL(test_wc_PKCS7_EncodeDecodeEnvelopedData), + TEST_DECL(test_wc_PKCS7_EncodeEncryptedData), + TEST_DECL(test_wc_PKCS7_Degenerate), + TEST_DECL(test_wc_PKCS7_BER), + TEST_DECL(test_wc_PKCS7_signed_enveloped), + TEST_DECL(test_wc_PKCS7_NoDefaultSignedAttribs), + TEST_DECL(test_wc_PKCS7_SetOriEncryptCtx), + TEST_DECL(test_wc_PKCS7_SetOriDecryptCtx), + TEST_DECL(test_wc_PKCS7_DecodeCompressedData), + + /* wolfCrypt PKCS#12 */ + TEST_DECL(test_wc_i2d_PKCS12), + + /* + * test_wolfCrypt_Cleanup needs to come after the above wolfCrypt tests to + * avoid memory leaks. + */ + TEST_DECL(test_wolfCrypt_Cleanup), + + TEST_DECL(test_wolfSSL_Init), + + TEST_DECL(test_dual_alg_support), + + /********************************* + * OpenSSL compatibility API tests + *********************************/ + + /* If at some point a stub get implemented this test should fail indicating + * a need to implement a new test case + */ + TEST_DECL(test_stubs_are_stubs), /* ASN.1 compatibility API tests */ TEST_DECL(test_wolfSSL_ASN1_BIT_STRING), @@ -67028,31 +83173,26 @@ TEST_DECL(test_wolfSSL_ASN1_TYPE), TEST_DECL(test_wolfSSL_IMPLEMENT_ASN1_FUNCTIONS), - /* compatibility tests */ TEST_DECL(test_wolfSSL_lhash), - TEST_DECL(test_wolfSSL_X509_NAME), - TEST_DECL(test_wolfSSL_X509_NAME_hash), - TEST_DECL(test_wolfSSL_X509_NAME_print_ex), -#ifndef NO_BIO - TEST_DECL(test_wolfSSL_X509_INFO_multiple_info), - TEST_DECL(test_wolfSSL_X509_INFO), -#endif - TEST_DECL(test_wolfSSL_X509_subject_name_hash), - TEST_DECL(test_wolfSSL_X509_issuer_name_hash), - TEST_DECL(test_wolfSSL_X509_check_host), - TEST_DECL(test_wolfSSL_X509_check_email), - TEST_DECL(test_wolfSSL_DES), + TEST_DECL(test_wolfSSL_certs), - TEST_DECL(test_wolfSSL_X509_check_private_key), TEST_DECL(test_wolfSSL_private_keys), + TEST_DECL(test_wolfSSL_PEM_def_callback), TEST_DECL(test_wolfSSL_PEM_read_PrivateKey), TEST_DECL(test_wolfSSL_PEM_read_RSA_PUBKEY), TEST_DECL(test_wolfSSL_PEM_read_PUBKEY), + TEST_DECL(test_wolfSSL_PEM_PrivateKey_rsa), + TEST_DECL(test_wolfSSL_PEM_PrivateKey_ecc), + TEST_DECL(test_wolfSSL_PEM_PrivateKey_dsa), + TEST_DECL(test_wolfSSL_PEM_PrivateKey_dh), TEST_DECL(test_wolfSSL_PEM_PrivateKey), TEST_DECL(test_wolfSSL_PEM_file_RSAKey), TEST_DECL(test_wolfSSL_PEM_file_RSAPrivateKey), #ifndef NO_BIO + TEST_DECL(test_wolfSSL_BIO), + TEST_DECL(test_wolfSSL_BIO_BIO_ring_read), + TEST_DECL(test_wolfSSL_PEM_read_bio), TEST_DECL(test_wolfSSL_PEM_bio_RSAKey), TEST_DECL(test_wolfSSL_PEM_bio_DSAKey), TEST_DECL(test_wolfSSL_PEM_bio_ECKey), @@ -67060,28 +83200,134 @@ TEST_DECL(test_wolfSSL_PEM_PUBKEY), #endif - TEST_DECL(test_DSA_do_sign_verify), - TEST_DECL(test_wolfSSL_tmp_dh), - TEST_DECL(test_wolfSSL_ctrl), + /* EVP API testing */ + TEST_DECL(test_wolfSSL_EVP_ENCODE_CTX_new), + TEST_DECL(test_wolfSSL_EVP_ENCODE_CTX_free), + TEST_DECL(test_wolfSSL_EVP_EncodeInit), + TEST_DECL(test_wolfSSL_EVP_EncodeUpdate), + TEST_DECL(test_wolfSSL_EVP_EncodeFinal), + TEST_DECL(test_wolfSSL_EVP_DecodeInit), + TEST_DECL(test_wolfSSL_EVP_DecodeUpdate), + TEST_DECL(test_wolfSSL_EVP_DecodeFinal), + + TEST_DECL(test_wolfSSL_EVP_shake128), + TEST_DECL(test_wolfSSL_EVP_shake256), + TEST_DECL(test_wolfSSL_EVP_sm3), + TEST_DECL(test_EVP_blake2), +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_EVP_md4), + TEST_DECL(test_wolfSSL_EVP_ripemd160), + TEST_DECL(test_wolfSSL_EVP_get_digestbynid), + TEST_DECL(test_wolfSSL_EVP_MD_nid), + TEST_DECL(test_wolfSSL_EVP_DigestFinal_ex), +#endif + + TEST_DECL(test_EVP_MD_do_all), TEST_DECL(test_wolfSSL_EVP_MD_size), TEST_DECL(test_wolfSSL_EVP_MD_pkey_type), TEST_DECL(test_wolfSSL_EVP_Digest), TEST_DECL(test_wolfSSL_EVP_Digest_all), - TEST_DECL(test_wolfSSL_EVP_PKEY_new_mac_key), - TEST_DECL(test_wolfSSL_EVP_PKEY_new_CMAC_key), TEST_DECL(test_wolfSSL_EVP_MD_hmac_signing), TEST_DECL(test_wolfSSL_EVP_MD_rsa_signing), TEST_DECL(test_wolfSSL_EVP_MD_ecc_signing), + + TEST_DECL(test_wolfssl_EVP_aes_gcm), + TEST_DECL(test_wolfssl_EVP_aes_gcm_AAD_2_parts), + TEST_DECL(test_wolfssl_EVP_aes_gcm_zeroLen), + TEST_DECL(test_wolfssl_EVP_aes_ccm), + TEST_DECL(test_wolfssl_EVP_aes_ccm_zeroLen), + TEST_DECL(test_wolfssl_EVP_chacha20), + TEST_DECL(test_wolfssl_EVP_chacha20_poly1305), + TEST_DECL(test_wolfssl_EVP_sm4_ecb), + TEST_DECL(test_wolfssl_EVP_sm4_cbc), + TEST_DECL(test_wolfssl_EVP_sm4_ctr), + TEST_DECL(test_wolfssl_EVP_sm4_gcm_zeroLen), + TEST_DECL(test_wolfssl_EVP_sm4_gcm), + TEST_DECL(test_wolfssl_EVP_sm4_ccm_zeroLen), + TEST_DECL(test_wolfssl_EVP_sm4_ccm), +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_EVP_aes_256_gcm), + TEST_DECL(test_wolfSSL_EVP_aes_192_gcm), + TEST_DECL(test_wolfSSL_EVP_aes_256_ccm), + TEST_DECL(test_wolfSSL_EVP_aes_192_ccm), + TEST_DECL(test_wolfSSL_EVP_aes_128_ccm), + TEST_DECL(test_wolfSSL_EVP_rc4), + TEST_DECL(test_wolfSSL_EVP_enc_null), + TEST_DECL(test_wolfSSL_EVP_rc2_cbc), + TEST_DECL(test_wolfSSL_EVP_mdc2), + + TEST_DECL(test_evp_cipher_aes_gcm), +#endif + TEST_DECL(test_wolfssl_EVP_aria_gcm), + TEST_DECL(test_wolfSSL_EVP_Cipher_extra), +#ifdef OPENSSL_EXTRA + TEST_DECL(test_wolfSSL_EVP_get_cipherbynid), + TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX), +#endif +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX_iv_length), + TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX_key_length), + TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX_set_iv), + TEST_DECL(test_wolfSSL_EVP_CIPHER_block_size), + TEST_DECL(test_wolfSSL_EVP_CIPHER_iv_length), + TEST_DECL(test_wolfSSL_EVP_X_STATE), + TEST_DECL(test_wolfSSL_EVP_X_STATE_LEN), + TEST_DECL(test_wolfSSL_EVP_BytesToKey), +#endif + TEST_DECL(test_wolfSSL_EVP_PKEY_print_public), - TEST_DECL(test_wolfSSL_EVP_ENCODE_CTX_new), - TEST_DECL(test_wolfSSL_EVP_ENCODE_CTX_free), - TEST_DECL(test_wolfSSL_EVP_EncodeInit), - TEST_DECL(test_wolfSSL_EVP_EncodeUpdate), - TEST_DECL(test_wolfSSL_EVP_EncodeFinal), - TEST_DECL(test_wolfSSL_EVP_DecodeInit), - TEST_DECL(test_wolfSSL_EVP_DecodeUpdate), - TEST_DECL(test_wolfSSL_EVP_DecodeFinal), + TEST_DECL(test_wolfSSL_EVP_PKEY_new_mac_key), + TEST_DECL(test_wolfSSL_EVP_PKEY_new_CMAC_key), + TEST_DECL(test_wolfSSL_EVP_PKEY_up_ref), + TEST_DECL(test_wolfSSL_EVP_PKEY_hkdf), + TEST_DECL(test_wolfSSL_EVP_PKEY_derive), + TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey), + TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey_ecc), +#ifndef NO_BIO + TEST_DECL(test_wolfSSL_d2i_PUBKEY), +#endif + TEST_DECL(test_wolfSSL_d2i_and_i2d_DSAparams), + TEST_DECL(test_wolfSSL_i2d_PrivateKey), +#if (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO)) && !defined(NO_RSA) +#ifndef NO_BIO + TEST_DECL(test_wolfSSL_d2i_PrivateKeys_bio), +#endif /* !NO_BIO */ +#endif +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_EVP_PKEY_set1_get1_DSA), + TEST_DECL(test_wolfSSL_EVP_PKEY_set1_get1_EC_KEY), + TEST_DECL(test_wolfSSL_EVP_PKEY_set1_get1_DH), + TEST_DECL(test_wolfSSL_EVP_PKEY_assign), + TEST_DECL(test_wolfSSL_EVP_PKEY_assign_DH), + TEST_DECL(test_wolfSSL_EVP_PKEY_base_id), + TEST_DECL(test_wolfSSL_EVP_PKEY_id), + TEST_DECL(test_wolfSSL_EVP_PKEY_paramgen), + TEST_DECL(test_wolfSSL_EVP_PKEY_keygen), + TEST_DECL(test_wolfSSL_EVP_PKEY_keygen_init), + TEST_DECL(test_wolfSSL_EVP_PKEY_missing_parameters), + TEST_DECL(test_wolfSSL_EVP_PKEY_copy_parameters), + TEST_DECL(test_wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits), + TEST_DECL(test_wolfSSL_EVP_PKEY_CTX_new_id), + TEST_DECL(test_wolfSSL_EVP_PKEY_get0_EC_KEY), +#endif + + TEST_DECL(test_EVP_PKEY_rsa), + TEST_DECL(test_EVP_PKEY_ec), + TEST_DECL(test_wolfSSL_EVP_PKEY_encrypt), + TEST_DECL(test_wolfSSL_EVP_PKEY_sign_verify_rsa), + TEST_DECL(test_wolfSSL_EVP_PKEY_sign_verify_dsa), + TEST_DECL(test_wolfSSL_EVP_PKEY_sign_verify_ec), + TEST_DECL(test_EVP_PKEY_cmp), + +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_EVP_SignInit_ex), + TEST_DECL(test_wolfSSL_EVP_PKEY_param_check), + TEST_DECL(test_wolfSSL_QT_EVP_PKEY_CTX_free), +#endif + + TEST_DECL(test_wolfSSL_EVP_PBE_scrypt), + TEST_DECL(test_wolfSSL_CTX_add_extra_chain_cert), #if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) TEST_DECL(test_wolfSSL_ERR_peek_last_error_line), @@ -67094,12 +83340,18 @@ TEST_DECL(test_wc_ERR_print_errors_fp), #endif TEST_DECL(test_wolfSSL_configure_args), - TEST_DECL(test_wolfSSL_set_options), TEST_DECL(test_wolfSSL_sk_SSL_CIPHER), TEST_DECL(test_wolfSSL_set1_curves_list), + TEST_DECL(test_wolfSSL_curves_mismatch), TEST_DECL(test_wolfSSL_set1_sigalgs_list), + TEST_DECL(test_wolfSSL_OtherName), + TEST_DECL(test_wolfSSL_FPKI), + TEST_DECL(test_wolfSSL_URI), + TEST_DECL(test_wolfSSL_TBS), + TEST_DECL(test_wolfSSL_X509_STORE_CTX), + TEST_DECL(test_X509_STORE_untrusted), TEST_DECL(test_wolfSSL_X509_STORE_CTX_trusted_stack_cleanup), TEST_DECL(test_wolfSSL_X509_STORE_CTX_get0_current_issuer), TEST_DECL(test_wolfSSL_X509_STORE_set_flags), @@ -67119,42 +83371,107 @@ TEST_DECL(test_X509_STORE_get0_objects), TEST_DECL(test_wolfSSL_X509_load_crl_file), TEST_DECL(test_wolfSSL_X509_STORE_get1_certs), + TEST_DECL(test_wolfSSL_X509_STORE_set_get_crl), TEST_DECL(test_wolfSSL_X509_NAME_ENTRY_get_object), TEST_DECL(test_wolfSSL_X509_cmp_time), TEST_DECL(test_wolfSSL_X509_time_adj), + /* X509 tests */ + TEST_DECL(test_wolfSSL_X509_subject_name_hash), + TEST_DECL(test_wolfSSL_X509_issuer_name_hash), + TEST_DECL(test_wolfSSL_X509_check_host), + TEST_DECL(test_wolfSSL_X509_check_email), + TEST_DECL(test_wolfSSL_X509_check_private_key), TEST_DECL(test_wolfSSL_X509), TEST_DECL(test_wolfSSL_X509_VERIFY_PARAM), TEST_DECL(test_wolfSSL_X509_sign), TEST_DECL(test_wolfSSL_X509_sign2), + TEST_DECL(test_wolfSSL_X509_verify), TEST_DECL(test_wolfSSL_X509_get0_tbs_sigalg), TEST_DECL(test_wolfSSL_X509_ALGOR_get0), TEST_DECL(test_wolfSSL_X509_get_X509_PUBKEY), TEST_DECL(test_wolfSSL_X509_PUBKEY_RSA), TEST_DECL(test_wolfSSL_X509_PUBKEY_EC), TEST_DECL(test_wolfSSL_X509_PUBKEY_DSA), + TEST_DECL(test_wolfSSL_PEM_write_bio_X509), + TEST_DECL(test_wolfSSL_X509_NAME_get_entry), + TEST_DECL(test_wolfSSL_X509_NAME), + TEST_DECL(test_wolfSSL_X509_NAME_hash), + TEST_DECL(test_wolfSSL_X509_NAME_print_ex), + TEST_DECL(test_wolfSSL_X509_NAME_ENTRY), + TEST_DECL(test_wolfSSL_X509_set_name), + TEST_DECL(test_wolfSSL_X509_set_notAfter), + TEST_DECL(test_wolfSSL_X509_set_notBefore), + TEST_DECL(test_wolfSSL_X509_set_version), + TEST_DECL(test_wolfSSL_X509_get_serialNumber), + TEST_DECL(test_wolfSSL_X509_CRL), + TEST_DECL(test_wolfSSL_i2d_X509), + TEST_DECL(test_wolfSSL_d2i_X509_REQ), + TEST_DECL(test_wolfSSL_PEM_read_X509), + TEST_DECL(test_wolfSSL_X509_check_ca), + TEST_DECL(test_wolfSSL_X509_check_ip_asc), + TEST_DECL(test_wolfSSL_X509_bad_altname), + TEST_DECL(test_wolfSSL_X509_name_match), + TEST_DECL(test_wolfSSL_X509_name_match2), + TEST_DECL(test_wolfSSL_X509_name_match3), + TEST_DECL(test_wolfSSL_X509_max_altnames), + TEST_DECL(test_wolfSSL_X509_max_name_constraints), + TEST_DECL(test_wolfSSL_make_cert), - TEST_DECL(test_wolfSSL_msgCb), - TEST_DECL(test_wolfSSL_either_side), - TEST_DECL(test_wolfSSL_DTLS_either_side), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_dtls_fragments), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_dtls_AEAD_limit), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_ignore_alert_before_cookie), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_dtls_bad_record), - /* Uses Assert in handshake callback. */ - TEST_DECL(test_wolfSSL_dtls_stateless), - TEST_DECL(test_generate_cookie), +#ifndef NO_BIO + TEST_DECL(test_wolfSSL_X509_INFO_multiple_info), + TEST_DECL(test_wolfSSL_X509_INFO), + TEST_DECL(test_wolfSSL_PEM_X509_INFO_read_bio), +#endif + +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_X509_PUBKEY_get), +#endif + + TEST_DECL(test_wolfSSL_X509_CA_num), + TEST_DECL(test_wolfSSL_X509_get_version), +#ifndef NO_BIO + TEST_DECL(test_wolfSSL_X509_print), + TEST_DECL(test_wolfSSL_X509_CRL_print), +#endif + TEST_DECL(test_X509_get_signature_nid), + /* X509 extension testing. */ + TEST_DECL(test_wolfSSL_X509_get_extension_flags), + TEST_DECL(test_wolfSSL_X509_get_ext), + TEST_DECL(test_wolfSSL_X509_get_ext_by_NID), + TEST_DECL(test_wolfSSL_X509_get_ext_subj_alt_name), + TEST_DECL(test_wolfSSL_X509_get_ext_count), + TEST_DECL(test_wolfSSL_X509_EXTENSION_new), + TEST_DECL(test_wolfSSL_X509_EXTENSION_get_object), + TEST_DECL(test_wolfSSL_X509_EXTENSION_get_data), + TEST_DECL(test_wolfSSL_X509_EXTENSION_get_critical), + TEST_DECL(test_wolfSSL_X509V3_EXT_get), + TEST_DECL(test_wolfSSL_X509V3_EXT_nconf), + TEST_DECL(test_wolfSSL_X509V3_EXT), + TEST_DECL(test_wolfSSL_X509V3_EXT_print), + TEST_DECL(test_wolfSSL_X509_cmp), + + TEST_DECL(test_GENERAL_NAME_set0_othername), + TEST_DECL(test_othername_and_SID_ext), + TEST_DECL(test_wolfSSL_dup_CA_list), + /* OpenSSL sk_X509 API test */ + TEST_DECL(test_sk_X509), + /* OpenSSL sk_X509_CRL API test */ + TEST_DECL(test_sk_X509_CRL), + + /* OpenSSL X509 REQ API test */ + TEST_DECL(test_X509_REQ), + + /* OpenSSL compatibility outside SSL context w/ CRL lookup directory */ + TEST_DECL(test_X509_STORE_No_SSL_CTX), + TEST_DECL(test_X509_LOOKUP_add_dir), - /* RAND compatability API */ + /* RAND compatibility API */ TEST_DECL(test_wolfSSL_RAND_set_rand_method), TEST_DECL(test_wolfSSL_RAND_bytes), TEST_DECL(test_wolfSSL_RAND), - /* BN compatability API */ + /* BN compatibility API */ TEST_DECL(test_wolfSSL_BN_CTX), TEST_DECL(test_wolfSSL_BN), TEST_DECL(test_wolfSSL_BN_init), @@ -67168,31 +83485,29 @@ TEST_DECL(test_wolfSSL_BN_rand), TEST_DECL(test_wolfSSL_BN_prime), - TEST_DECL(test_wolfSSL_CTX_get0_set1_param), -#ifndef NO_BIO - TEST_DECL(test_wolfSSL_PEM_read_bio), - TEST_DECL(test_wolfSSL_BIO), -#endif - TEST_DECL(test_wolfSSL_a2i_IPADDRESS), - TEST_DECL(test_wolfSSL_BUF), - TEST_DECL(test_wolfSSL_set_tlsext_status_type), - /* Can't memory test as server hangs. */ - TEST_DECL(test_wolfSSL_CTX_set_client_CA_list), - TEST_DECL(test_wolfSSL_CTX_add_client_CA), - TEST_DECL(test_wolfSSL_CTX_set_srp_username), - TEST_DECL(test_wolfSSL_CTX_set_srp_password), - TEST_DECL(test_wolfSSL_CTX_set_keylog_callback), - TEST_DECL(test_wolfSSL_CTX_get_keylog_callback), - TEST_DECL(test_wolfSSL_Tls12_Key_Logging_test), - /* Can't memory test as server hangs. */ - TEST_DECL(test_wolfSSL_Tls13_Key_Logging_test), - TEST_DECL(test_wolfSSL_Tls13_postauth), - TEST_DECL(test_wolfSSL_CTX_set_ecdh_auto), - TEST_DECL(test_wolfSSL_set_minmax_proto_version), - TEST_DECL(test_wolfSSL_CTX_set_max_proto_version), - TEST_DECL(test_wolfSSL_THREADID_hash), + /* OpenSSL PKCS5 API test */ + TEST_DECL(test_wolfSSL_PKCS5), + + /* OpenSSL PKCS8 API test */ TEST_DECL(test_wolfSSL_PKCS8_Compat), TEST_DECL(test_wolfSSL_PKCS8_d2i), + + /* OpenSSL PKCS7 API test */ + TEST_DECL(test_wolfssl_PKCS7), + TEST_DECL(test_wolfSSL_PKCS7_certs), + TEST_DECL(test_wolfSSL_PKCS7_sign), + TEST_DECL(test_wolfSSL_PKCS7_SIGNED_new), +#ifndef NO_BIO + TEST_DECL(test_wolfSSL_PEM_write_bio_PKCS7), +#ifdef HAVE_SMIME + TEST_DECL(test_wolfSSL_SMIME_read_PKCS7), + TEST_DECL(test_wolfSSL_SMIME_write_PKCS7), +#endif /* HAVE_SMIME */ +#endif /* !NO_BIO */ + + /* OpenSSL PKCS12 API test */ + TEST_DECL(test_wolfSSL_PKCS12), + /* Can't memory test as callbacks use Assert. */ TEST_DECL(test_error_queue_per_thread), TEST_DECL(test_wolfSSL_ERR_put_error), @@ -67200,20 +83515,16 @@ #ifndef NO_BIO TEST_DECL(test_wolfSSL_ERR_print_errors), #endif - TEST_DECL(test_wolfSSL_HMAC), - TEST_DECL(test_wolfSSL_CMAC), + + TEST_DECL(test_OBJ_NAME_do_all), TEST_DECL(test_wolfSSL_OBJ), TEST_DECL(test_wolfSSL_OBJ_cmp), TEST_DECL(test_wolfSSL_OBJ_txt2nid), TEST_DECL(test_wolfSSL_OBJ_txt2obj), - TEST_DECL(test_wolfSSL_PEM_write_bio_X509), - TEST_DECL(test_wolfSSL_X509_NAME_ENTRY), - TEST_DECL(test_GENERAL_NAME_set0_othername), - TEST_DECL(test_othername_and_SID_ext), - TEST_DECL(test_wolfSSL_X509_set_name), - TEST_DECL(test_wolfSSL_X509_set_notAfter), - TEST_DECL(test_wolfSSL_X509_set_notBefore), - TEST_DECL(test_wolfSSL_X509_set_version), +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_OBJ_ln), + TEST_DECL(test_wolfSSL_OBJ_sn), +#endif #ifndef NO_BIO TEST_DECL(test_wolfSSL_BIO_gets), @@ -67222,76 +83533,31 @@ /* Can't memory test as server hangs. */ TEST_DECL(test_wolfSSL_BIO_should_retry), TEST_DECL(test_wolfSSL_BIO_write), - /* Can't memory test as server hangs. */ - TEST_DECL(test_wolfSSL_BIO_connect), - /* Can't memory test as server Asserts in thread. */ - TEST_DECL(test_wolfSSL_BIO_accept), TEST_DECL(test_wolfSSL_BIO_printf), TEST_DECL(test_wolfSSL_BIO_f_md), TEST_DECL(test_wolfSSL_BIO_up_ref), TEST_DECL(test_wolfSSL_BIO_reset), - TEST_DECL(test_wolfSSL_BIO_tls), + TEST_DECL(test_wolfSSL_BIO_get_len), #endif - /* Converted above to use Expect unless where stated. */ -#if defined(OPENSSL_EXTRA) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) - /* Converted to use Expect. */ TEST_DECL(test_wolfSSL_check_domain), -#endif - /* Converted to use Expect. */ TEST_DECL(test_wolfSSL_cert_cb), + TEST_DECL(test_wolfSSL_cert_cb_dyn_ciphers), + TEST_DECL(test_wolfSSL_ciphersuite_auth), + TEST_DECL(test_wolfSSL_sigalg_info), + /* Can't memory test as tcp_connect aborts. */ TEST_DECL(test_wolfSSL_SESSION), - /* Converted to use Expect. */ + TEST_DECL(test_wolfSSL_SESSION_expire_downgrade), TEST_DECL(test_wolfSSL_CTX_sess_set_remove_cb), TEST_DECL(test_wolfSSL_ticket_keys), - TEST_DECL(test_wolfSSL_DES_ecb_encrypt), TEST_DECL(test_wolfSSL_sk_GENERAL_NAME), TEST_DECL(test_wolfSSL_GENERAL_NAME_print), TEST_DECL(test_wolfSSL_sk_DIST_POINT), - TEST_DECL(test_wolfSSL_MD4), TEST_DECL(test_wolfSSL_verify_mode), TEST_DECL(test_wolfSSL_verify_depth), - TEST_DECL(test_wolfSSL_HMAC_CTX), + TEST_DECL(test_wolfSSL_verify_result), TEST_DECL(test_wolfSSL_msg_callback), - TEST_DECL(test_wolfSSL_SHA), - TEST_DECL(test_wolfSSL_AES_ecb_encrypt), - TEST_DECL(test_wolfSSL_MD5), - TEST_DECL(test_wolfSSL_MD5_Transform), - TEST_DECL(test_wolfSSL_SHA_Transform), - TEST_DECL(test_wolfSSL_SHA256), - TEST_DECL(test_wolfSSL_SHA256_Transform), - TEST_DECL(test_wolfSSL_SHA224), - TEST_DECL(test_wolfSSL_SHA512_Transform), - TEST_DECL(test_wolfSSL_X509_get_serialNumber), - TEST_DECL(test_wolfSSL_X509_CRL), - TEST_DECL(test_wolfSSL_d2i_X509_REQ), - TEST_DECL(test_wolfSSL_PEM_read_X509), - TEST_DECL(test_wolfSSL_PEM_read), -#ifndef NO_BIO - TEST_DECL(test_wolfSSL_PEM_X509_INFO_read_bio), -#endif - TEST_DECL(test_wolfSSL_OpenSSL_add_all_algorithms), - TEST_DECL(test_wolfSSL_OPENSSL_hexstr2buf), - TEST_DECL(test_wolfSSL_X509_check_ca), - TEST_DECL(test_wolfSSL_X509_check_ip_asc), - TEST_DECL(test_wolfSSL_make_cert), - TEST_DECL(test_wolfSSL_DES_ncbc), - TEST_DECL(test_wolfSSL_AES_cbc_encrypt), - TEST_DECL(test_wolfSSL_CRYPTO_cts128), - TEST_DECL(test_wolfssl_EVP_aes_gcm_AAD_2_parts), - TEST_DECL(test_wolfssl_EVP_aes_gcm), - TEST_DECL(test_wolfssl_EVP_aes_gcm_zeroLen), - TEST_DECL(test_wolfssl_EVP_aes_ccm), - TEST_DECL(test_wolfssl_EVP_aes_ccm_zeroLen), - TEST_DECL(test_wolfssl_EVP_chacha20_poly1305), - TEST_DECL(test_wolfssl_EVP_chacha20), - TEST_DECL(test_wolfSSL_EVP_PKEY_hkdf), - TEST_DECL(test_wolfSSL_PKEY_up_ref), - TEST_DECL(test_wolfSSL_EVP_Cipher_extra), - TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey), - TEST_DECL(test_wolfSSL_d2i_and_i2d_PublicKey_ecc), - TEST_DECL(test_wolfSSL_d2i_and_i2d_DSAparams), - TEST_DECL(test_wolfSSL_i2d_PrivateKey), + TEST_DECL(test_wolfSSL_OCSP_id_get0_info), TEST_DECL(test_wolfSSL_i2d_OCSP_CERTID), TEST_DECL(test_wolfSSL_d2i_OCSP_CERTID), @@ -67300,88 +83566,74 @@ TEST_DECL(test_wolfSSL_OCSP_single_get0_status), TEST_DECL(test_wolfSSL_OCSP_resp_count), TEST_DECL(test_wolfSSL_OCSP_resp_get0), - TEST_DECL(test_wolfSSL_EVP_PKEY_derive), - TEST_DECL(test_wolfSSL_EVP_PBE_scrypt), + + TEST_DECL(test_wolfSSL_PEM_read), + + TEST_DECL(test_wolfSSL_OpenSSL_version), + TEST_DECL(test_wolfSSL_OpenSSL_add_all_algorithms), + TEST_DECL(test_wolfSSL_OPENSSL_hexstr2buf), + TEST_DECL(test_CONF_modules_xxx), +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_TXT_DB), + TEST_DECL(test_wolfSSL_NCONF), +#endif + + TEST_DECL(test_wolfSSL_CRYPTO_memcmp), + TEST_DECL(test_wolfSSL_CRYPTO_get_ex_new_index), + TEST_DECL(test_wolfSSL_SESSION_get_ex_new_index), TEST_DECL(test_CRYPTO_set_dynlock_xxx), TEST_DECL(test_CRYPTO_THREADID_xxx), TEST_DECL(test_ENGINE_cleanup), + /* test the no op functions for compatibility */ + TEST_DECL(test_no_op_functions), + /* OpenSSL error API tests */ + TEST_DECL(test_ERR_load_crypto_strings), + #ifdef OPENSSL_ALL - TEST_DECL(test_wolfSSL_X509_PUBKEY_get), TEST_DECL(test_wolfSSL_sk_CIPHER_description), TEST_DECL(test_wolfSSL_get_ciphers_compat), - TEST_DECL(test_wolfSSL_EVP_PKEY_set1_get1_DSA), - TEST_DECL(test_wolfSSL_DSA_SIG), - TEST_DECL(test_wolfSSL_EVP_PKEY_set1_get1_EC_KEY), - TEST_DECL(test_wolfSSL_EVP_PKEY_set1_get1_DH), + TEST_DECL(test_wolfSSL_CTX_ctrl), - TEST_DECL(test_wolfSSL_EVP_PKEY_assign), - TEST_DECL(test_wolfSSL_EVP_PKEY_base_id), - TEST_DECL(test_wolfSSL_EVP_PKEY_id), - TEST_DECL(test_wolfSSL_EVP_PKEY_paramgen), - TEST_DECL(test_wolfSSL_EVP_PKEY_keygen), - TEST_DECL(test_wolfSSL_EVP_PKEY_keygen_init), - TEST_DECL(test_wolfSSL_EVP_PKEY_missing_parameters), - TEST_DECL(test_wolfSSL_EVP_PKEY_copy_parameters), - TEST_DECL(test_wolfSSL_EVP_PKEY_CTX_set_rsa_keygen_bits), - TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX_iv_length), - TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX_key_length), - TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX_set_key_length), - TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX_set_iv), - TEST_DECL(test_wolfSSL_EVP_PKEY_CTX_new_id), - TEST_DECL(test_wolfSSL_EVP_rc4), - TEST_DECL(test_wolfSSL_EVP_enc_null), - TEST_DECL(test_wolfSSL_EVP_rc2_cbc), - TEST_DECL(test_wolfSSL_EVP_mdc2), - TEST_DECL(test_wolfSSL_EVP_md4), - TEST_DECL(test_wolfSSL_EVP_aes_256_gcm), - TEST_DECL(test_wolfSSL_EVP_aes_192_gcm), - TEST_DECL(test_wolfSSL_EVP_aes_256_ccm), - TEST_DECL(test_wolfSSL_EVP_aes_192_ccm), - TEST_DECL(test_wolfSSL_EVP_aes_128_ccm), - TEST_DECL(test_wolfSSL_EVP_ripemd160), - TEST_DECL(test_wolfSSL_EVP_get_digestbynid), - TEST_DECL(test_wolfSSL_EVP_MD_nid), - TEST_DECL(test_wolfSSL_EVP_PKEY_get0_EC_KEY), - TEST_DECL(test_wolfSSL_EVP_X_STATE), - TEST_DECL(test_wolfSSL_EVP_X_STATE_LEN), - TEST_DECL(test_wolfSSL_EVP_CIPHER_block_size), - TEST_DECL(test_wolfSSL_EVP_CIPHER_iv_length), - TEST_DECL(test_wolfSSL_EVP_SignInit_ex), - TEST_DECL(test_wolfSSL_EVP_DigestFinal_ex), - TEST_DECL(test_wolfSSL_EVP_PKEY_assign_DH), - TEST_DECL(test_wolfSSL_EVP_BytesToKey), - TEST_DECL(test_wolfSSL_EVP_PKEY_param_check), - TEST_DECL(test_wolfSSL_QT_EVP_PKEY_CTX_free), - TEST_DECL(test_evp_cipher_aes_gcm), - TEST_DECL(test_wolfSSL_OBJ_ln), - TEST_DECL(test_wolfSSL_OBJ_sn), - TEST_DECL(test_wolfSSL_TXT_DB), - TEST_DECL(test_wolfSSL_NCONF), #endif /* OPENSSL_ALL */ -#ifndef NO_BIO - TEST_DECL(test_wolfSSL_d2i_PUBKEY), -#endif #if (defined(OPENSSL_ALL) || defined(WOLFSSL_ASIO)) && !defined(NO_RSA) -#ifndef NO_BIO - TEST_DECL(test_wolfSSL_d2i_PrivateKeys_bio), -#endif /* !NO_BIO */ TEST_DECL(test_wolfSSL_CTX_use_certificate_ASN1), #endif /* (OPENSSL_ALL || WOLFSSL_ASIO) && !NO_RSA */ - TEST_DECL(test_wolfSSL_X509_CA_num), - TEST_DECL(test_wolfSSL_X509_get_version), -#ifndef NO_BIO - TEST_DECL(test_wolfSSL_X509_print), - TEST_DECL(test_wolfSSL_X509_CRL_print), - TEST_DECL(test_wolfSSL_BIO_get_len), -#endif + + /********************************* + * Crypto API tests + *********************************/ + + TEST_DECL(test_wolfSSL_MD4), + TEST_DECL(test_wolfSSL_MD5), + TEST_DECL(test_wolfSSL_MD5_Transform), + TEST_DECL(test_wolfSSL_SHA), + TEST_DECL(test_wolfSSL_SHA_Transform), + TEST_DECL(test_wolfSSL_SHA224), + TEST_DECL(test_wolfSSL_SHA256), + TEST_DECL(test_wolfSSL_SHA256_Transform), + TEST_DECL(test_wolfSSL_SHA512_Transform), + TEST_DECL(test_wolfSSL_SHA512_224_Transform), + TEST_DECL(test_wolfSSL_SHA512_256_Transform), + TEST_DECL(test_wolfSSL_HMAC_CTX), + TEST_DECL(test_wolfSSL_HMAC), + TEST_DECL(test_wolfSSL_CMAC), + + TEST_DECL(test_wolfSSL_DES), + TEST_DECL(test_wolfSSL_DES_ncbc), + TEST_DECL(test_wolfSSL_DES_ecb_encrypt), + TEST_DECL(test_wolfSSL_DES_ede3_cbc_encrypt), + TEST_DECL(test_wolfSSL_AES_encrypt), + TEST_DECL(test_wolfSSL_AES_ecb_encrypt), + TEST_DECL(test_wolfSSL_AES_cbc_encrypt), + TEST_DECL(test_wolfSSL_AES_cfb128_encrypt), + TEST_DECL(test_wolfSSL_CRYPTO_cts128), + TEST_DECL(test_wolfSSL_RC4), TEST_DECL(test_wolfSSL_RSA), TEST_DECL(test_wolfSSL_RSA_DER), TEST_DECL(test_wolfSSL_RSA_print), -#ifndef NO_RSA TEST_DECL(test_wolfSSL_RSA_padding_add_PKCS1_PSS), -#endif TEST_DECL(test_wolfSSL_RSA_sign_sha3), TEST_DECL(test_wolfSSL_RSA_get0_key), TEST_DECL(test_wolfSSL_RSA_meth), @@ -67418,6 +83670,7 @@ TEST_DECL(test_wolfSSL_EC_GROUP), TEST_DECL(test_wolfSSL_PEM_read_bio_ECPKParameters), TEST_DECL(test_wolfSSL_EC_POINT), + TEST_DECL(test_wolfSSL_SPAKE), TEST_DECL(test_wolfSSL_EC_KEY_generate), TEST_DECL(test_EC_i2d), TEST_DECL(test_wolfSSL_EC_curve), @@ -67433,78 +83686,62 @@ TEST_DECL(test_ECDH_compute_key), #endif - TEST_DECL(test_wolfSSL_X509V3_EXT_get), - TEST_DECL(test_wolfSSL_X509V3_EXT_nconf), - TEST_DECL(test_wolfSSL_X509V3_EXT), - TEST_DECL(test_wolfSSL_X509_get_extension_flags), - TEST_DECL(test_wolfSSL_X509_get_ext), - TEST_DECL(test_wolfSSL_X509_get_ext_by_NID), - TEST_DECL(test_wolfSSL_X509_get_ext_subj_alt_name), - TEST_DECL(test_wolfSSL_X509_get_ext_count), - TEST_DECL(test_wolfSSL_X509_EXTENSION_new), - TEST_DECL(test_wolfSSL_X509_EXTENSION_get_object), - TEST_DECL(test_wolfSSL_X509_EXTENSION_get_data), - TEST_DECL(test_wolfSSL_X509_EXTENSION_get_critical), - TEST_DECL(test_wolfSSL_X509V3_EXT_print), - TEST_DECL(test_wolfSSL_X509_cmp), +#ifdef OPENSSL_EXTRA + TEST_DECL(test_EC25519), + TEST_DECL(test_ED25519), + TEST_DECL(test_EC448), + TEST_DECL(test_ED448), +#endif + + TEST_DECL(test_DSA_do_sign_verify), +#ifdef OPENSSL_ALL + TEST_DECL(test_wolfSSL_DSA_generate_parameters), + TEST_DECL(test_wolfSSL_DSA_SIG), +#endif + TEST_DECL(test_openssl_generate_key_and_cert), - TEST_DECL(test_wolfSSL_CRYPTO_memcmp), - TEST_DECL(test_wolfSSL_read_detect_TCP_disconnect), - /* test the no op functions for compatibility */ - TEST_DECL(test_no_op_functions), - /* OpenSSL EVP_PKEY API tests */ - TEST_DECL(test_EVP_PKEY_rsa), - TEST_DECL(test_wolfSSL_EVP_PKEY_encrypt), - TEST_DECL(test_wolfSSL_EVP_PKEY_sign_verify), - TEST_DECL(test_EVP_PKEY_ec), - TEST_DECL(test_EVP_PKEY_cmp), - /* OpenSSL error API tests */ - TEST_DECL(test_ERR_load_crypto_strings), - /* OpenSSL sk_X509 API test */ - TEST_DECL(test_sk_X509), - /* OpenSSL sk_X509_CRL API test */ - TEST_DECL(test_sk_X509_CRL), - /* OpenSSL X509 API test */ - TEST_DECL(test_X509_get_signature_nid), - /* OpenSSL X509 REQ API test */ - TEST_DECL(test_X509_REQ), - /* OpenSSL PKCS7 API test */ - TEST_DECL(test_wolfssl_PKCS7), - /* Converted to use Expect. */ - TEST_DECL(test_wolfSSL_PKCS7_certs), - TEST_DECL(test_wolfSSL_PKCS7_sign), - TEST_DECL(test_wolfSSL_PKCS7_SIGNED_new), -#ifndef NO_BIO - TEST_DECL(test_wolfSSL_PEM_write_bio_PKCS7), -#ifdef HAVE_SMIME - TEST_DECL(test_wolfSSL_SMIME_read_PKCS7), - TEST_DECL(test_wolfSSL_SMIME_write_PKCS7), -#endif /* HAVE_SMIME */ -#endif /* !NO_BIO */ + TEST_DECL(test_wolfSSL_FIPS_mode), + TEST_DECL(test_openssl_FIPS_drbg), - /* OpenSSL compatibility outside SSL context w/ CRL lookup directory */ - TEST_DECL(test_X509_STORE_No_SSL_CTX), - TEST_DECL(test_X509_LOOKUP_add_dir), + /********************************* + * CertManager API tests + *********************************/ - /* wolfCrypt ASN tests */ - TEST_DECL(test_wc_CreateEncryptedPKCS8Key), - TEST_DECL(test_wc_GetPkcs8TraditionalOffset), - TEST_DECL(test_wc_SetSubjectRaw), - TEST_DECL(test_wc_GetSubjectRaw), - TEST_DECL(test_wc_SetIssuerRaw), - TEST_DECL(test_wc_SetIssueBuffer), - TEST_DECL(test_wc_SetSubjectKeyId), - TEST_DECL(test_wc_SetSubject), - TEST_DECL(test_CheckCertSignature), - TEST_DECL(test_wc_ParseCert), - TEST_DECL(test_wc_ParseCert_Error), - TEST_DECL(test_MakeCertWithPathLen), + TEST_DECL(test_wolfSSL_CertManagerAPI), + TEST_DECL(test_wolfSSL_CertManagerLoadCABuffer), + TEST_DECL(test_wolfSSL_CertManagerLoadCABuffer_ex), + TEST_DECL(test_wolfSSL_CertManagerGetCerts), + TEST_DECL(test_wolfSSL_CertManagerSetVerify), + TEST_DECL(test_wolfSSL_CertManagerNameConstraint), + TEST_DECL(test_wolfSSL_CertManagerNameConstraint2), + TEST_DECL(test_wolfSSL_CertManagerNameConstraint3), + TEST_DECL(test_wolfSSL_CertManagerNameConstraint4), + TEST_DECL(test_wolfSSL_CertManagerNameConstraint5), + TEST_DECL(test_wolfSSL_CertManagerCRL), + TEST_DECL(test_wolfSSL_CertManagerCheckOCSPResponse), + TEST_DECL(test_wolfSSL_CheckOCSPResponse), +#if !defined(NO_RSA) && !defined(NO_SHA) && !defined(NO_FILESYSTEM) && \ + !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \ + !defined(WOLFSSL_NO_CLIENT_AUTH)) + TEST_DECL(test_various_pathlen_chains), +#endif - /* wolfCrypt ECC tests */ - TEST_DECL(test_wc_ecc_get_curve_size_from_name), - TEST_DECL(test_wc_ecc_get_curve_id_from_name), - TEST_DECL(test_wc_ecc_get_curve_id_from_params), + /********************************* + * SSL/TLS API tests + *********************************/ + + TEST_DECL(test_wolfSSL_Method_Allocators), +#ifndef NO_WOLFSSL_SERVER + TEST_DECL(test_wolfSSL_CTX_new), +#endif + TEST_DECL(test_server_wolfSSL_new), + TEST_DECL(test_client_wolfSSL_new), +#if (!defined(NO_WOLFSSL_CLIENT) || !defined(NO_WOLFSSL_SERVER)) && \ + (!defined(NO_RSA) || defined(HAVE_ECC)) && !defined(NO_FILESYSTEM) + TEST_DECL(test_for_double_Free), +#endif + TEST_DECL(test_wolfSSL_set_options), #ifdef WOLFSSL_TLS13 /* TLS v1.3 API tests */ @@ -67512,363 +83749,219 @@ TEST_DECL(test_tls13_cipher_suites), #endif -#if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \ - !defined(WOLFSSL_NO_CLIENT_AUTH)) && !defined(NO_FILESYSTEM) - /* Use the Cert Manager(CM) API to generate the error ASN_SIG_CONFIRM_E */ - /* Bad certificate signature tests */ - TEST_DECL(test_EccSigFailure_cm), - TEST_DECL(test_RsaSigFailure_cm), -#endif /* NO_CERTS */ - -#if defined(HAVE_PK_CALLBACKS) && !defined(WOLFSSL_NO_TLS12) - /* Converted to use Expect. */ - TEST_DECL(test_DhCallbacks), -#endif - -#if defined(HAVE_KEYING_MATERIAL) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) - /* Converted to use Expect. */ - TEST_DECL(test_export_keying_material), -#endif + TEST_DECL(test_wolfSSL_tmp_dh), + TEST_DECL(test_wolfSSL_ctrl), - TEST_DECL(test_wolfSSL_CTX_get_min_proto_version), #if defined(OPENSSL_ALL) || (defined(OPENSSL_EXTRA) && \ (defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ defined(HAVE_LIGHTY) || defined(WOLFSSL_HAPROXY) || \ defined(WOLFSSL_OPENSSH) || defined(HAVE_SBLIM_SFCB))) TEST_DECL(test_wolfSSL_set_SSL_CTX), #endif - + TEST_DECL(test_wolfSSL_CTX_get_min_proto_version), TEST_DECL(test_wolfSSL_security_level), TEST_DECL(test_wolfSSL_SSL_in_init), TEST_DECL(test_wolfSSL_CTX_set_timeout), - TEST_DECL(test_wolfSSL_OpenSSL_version), TEST_DECL(test_wolfSSL_set_psk_use_session_callback), - TEST_DECL(test_ticket_and_psk_mixing), - TEST_DECL(test_prioritize_psk), TEST_DECL(test_CONF_CTX_FILE), TEST_DECL(test_CONF_CTX_CMDLINE), - TEST_DECL(test_wolfSSL_CRYPTO_get_ex_new_index), - TEST_DECL(test_wolfSSL_SESSION_get_ex_new_index), - - /* wolfcrypt */ - TEST_DECL(test_wolfCrypt_Init), - TEST_DECL(test_wc_InitMd5), - TEST_DECL(test_wc_Md5Update), - TEST_DECL(test_wc_Md5Final), - TEST_DECL(test_wc_InitSha), - TEST_DECL(test_wc_ShaUpdate), - TEST_DECL(test_wc_ShaFinal), - TEST_DECL(test_wc_InitSha256), - TEST_DECL(test_wc_Sha256Update), - TEST_DECL(test_wc_Sha256Final), - TEST_DECL(test_wc_Sha256FinalRaw), - TEST_DECL(test_wc_Sha256GetFlags), - TEST_DECL(test_wc_Sha256Free), - TEST_DECL(test_wc_Sha256GetHash), - TEST_DECL(test_wc_Sha256Copy), - TEST_DECL(test_wc_InitSha512), - TEST_DECL(test_wc_Sha512Update), - TEST_DECL(test_wc_Sha512Final), - TEST_DECL(test_wc_Sha512GetFlags), - TEST_DECL(test_wc_Sha512FinalRaw), - TEST_DECL(test_wc_Sha512Free), - TEST_DECL(test_wc_Sha512GetHash), - TEST_DECL(test_wc_Sha512Copy), - - TEST_DECL(test_wc_InitSha512_224), - TEST_DECL(test_wc_Sha512_224Update), - TEST_DECL(test_wc_Sha512_224Final), - TEST_DECL(test_wc_Sha512_224GetFlags), - TEST_DECL(test_wc_Sha512_224FinalRaw), - TEST_DECL(test_wc_Sha512_224Free), - TEST_DECL(test_wc_Sha512_224GetHash), - TEST_DECL(test_wc_Sha512_224Copy), - TEST_DECL(test_wc_InitSha512_256), - TEST_DECL(test_wc_Sha512_256Update), - TEST_DECL(test_wc_Sha512_256Final), - TEST_DECL(test_wc_Sha512_256GetFlags), - TEST_DECL(test_wc_Sha512_256FinalRaw), - TEST_DECL(test_wc_Sha512_256Free), - TEST_DECL(test_wc_Sha512_256GetHash), - TEST_DECL(test_wc_Sha512_256Copy), - - TEST_DECL(test_wc_InitSha384), - TEST_DECL(test_wc_Sha384Update), - TEST_DECL(test_wc_Sha384Final), - TEST_DECL(test_wc_Sha384GetFlags), - TEST_DECL(test_wc_Sha384FinalRaw), - TEST_DECL(test_wc_Sha384Free), - TEST_DECL(test_wc_Sha384GetHash), - TEST_DECL(test_wc_Sha384Copy), - TEST_DECL(test_wc_InitSha224), - TEST_DECL(test_wc_Sha224Update), - TEST_DECL(test_wc_Sha224Final), - TEST_DECL(test_wc_Sha224SetFlags), - TEST_DECL(test_wc_Sha224GetFlags), - TEST_DECL(test_wc_Sha224Free), - TEST_DECL(test_wc_Sha224GetHash), - TEST_DECL(test_wc_Sha224Copy), - TEST_DECL(test_wc_InitBlake2b), - TEST_DECL(test_wc_InitBlake2b_WithKey), - TEST_DECL(test_wc_InitBlake2s_WithKey), - TEST_DECL(test_wc_InitRipeMd), - TEST_DECL(test_wc_RipeMdUpdate), - TEST_DECL(test_wc_RipeMdFinal), - - TEST_DECL(test_wc_InitSha3), - TEST_DECL(testing_wc_Sha3_Update), - TEST_DECL(test_wc_Sha3_224_Final), - TEST_DECL(test_wc_Sha3_256_Final), - TEST_DECL(test_wc_Sha3_384_Final), - TEST_DECL(test_wc_Sha3_512_Final), - TEST_DECL(test_wc_Sha3_224_Copy), - TEST_DECL(test_wc_Sha3_256_Copy), - TEST_DECL(test_wc_Sha3_384_Copy), - TEST_DECL(test_wc_Sha3_512_Copy), - TEST_DECL(test_wc_Sha3_GetFlags), - TEST_DECL(test_wc_InitShake256), - TEST_DECL(testing_wc_Shake256_Update), - TEST_DECL(test_wc_Shake256_Final), - TEST_DECL(test_wc_Shake256_Copy), - TEST_DECL(test_wc_Shake256Hash), - - TEST_DECL(test_wc_Md5HmacSetKey), - TEST_DECL(test_wc_Md5HmacUpdate), - TEST_DECL(test_wc_Md5HmacFinal), - TEST_DECL(test_wc_ShaHmacSetKey), - TEST_DECL(test_wc_ShaHmacUpdate), - TEST_DECL(test_wc_ShaHmacFinal), - TEST_DECL(test_wc_Sha224HmacSetKey), - TEST_DECL(test_wc_Sha224HmacUpdate), - TEST_DECL(test_wc_Sha224HmacFinal), - TEST_DECL(test_wc_Sha256HmacSetKey), - TEST_DECL(test_wc_Sha256HmacUpdate), - TEST_DECL(test_wc_Sha256HmacFinal), - TEST_DECL(test_wc_Sha384HmacSetKey), - TEST_DECL(test_wc_Sha384HmacUpdate), - TEST_DECL(test_wc_Sha384HmacFinal), - TEST_DECL(test_wc_HashInit), - TEST_DECL(test_wc_HashSetFlags), - TEST_DECL(test_wc_HashGetFlags), +#if !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \ + !defined(WOLFSSL_NO_CLIENT_AUTH)) && !defined(NO_FILESYSTEM) + /* Use the Cert Manager(CM) API to generate the error ASN_SIG_CONFIRM_E */ + /* Bad certificate signature tests */ + TEST_DECL(test_EccSigFailure_cm), + TEST_DECL(test_RsaSigFailure_cm), +#endif /* NO_CERTS */ - TEST_DECL(test_wc_InitCmac), - TEST_DECL(test_wc_CmacUpdate), - TEST_DECL(test_wc_CmacFinal), - TEST_DECL(test_wc_AesCmacGenerate), - TEST_DECL(test_wc_AesGcmStream), + /* PKCS8 testing */ + TEST_DECL(test_wolfSSL_no_password_cb), + TEST_DECL(test_wolfSSL_PKCS8), + TEST_DECL(test_wolfSSL_PKCS8_ED25519), + TEST_DECL(test_wolfSSL_PKCS8_ED448), - TEST_DECL(test_wc_Des3_SetIV), - TEST_DECL(test_wc_Des3_SetKey), - TEST_DECL(test_wc_Des3_CbcEncryptDecrypt), - TEST_DECL(test_wc_Des3_CbcEncryptDecryptWithKey), - TEST_DECL(test_wc_Des3_EcbEncrypt), - TEST_DECL(test_wc_Chacha_SetKey), - TEST_DECL(test_wc_Chacha_Process), - TEST_DECL(test_wc_ChaCha20Poly1305_aead), - TEST_DECL(test_wc_Poly1305SetKey), +#ifdef HAVE_IO_TESTS_DEPENDENCIES + TEST_DECL(test_wolfSSL_get_finished), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_CTX_add_session), + /* Large number of memory allocations. */ + TEST_DECL(test_wolfSSL_CTX_add_session_ext_tls13), + /* Large number of memory allocations. */ + TEST_DECL(test_wolfSSL_CTX_add_session_ext_dtls13), + /* Large number of memory allocations. */ + TEST_DECL(test_wolfSSL_CTX_add_session_ext_tls12), + /* Large number of memory allocations. */ + TEST_DECL(test_wolfSSL_CTX_add_session_ext_dtls12), + /* Large number of memory allocations. */ + TEST_DECL(test_wolfSSL_CTX_add_session_ext_tls11), + /* Large number of memory allocations. */ + TEST_DECL(test_wolfSSL_CTX_add_session_ext_dtls1), +#endif + TEST_DECL(test_SSL_CIPHER_get_xxx), + TEST_DECL(test_wolfSSL_ERR_strings), + TEST_DECL(test_wolfSSL_CTX_set_cipher_list_bytes), + TEST_DECL(test_wolfSSL_CTX_use_certificate_file), + TEST_DECL(test_wolfSSL_CTX_use_certificate_buffer), + TEST_DECL(test_wolfSSL_CTX_use_PrivateKey_file), + TEST_DECL(test_wolfSSL_CTX_load_verify_locations), + /* Large number of memory allocations. */ + TEST_DECL(test_wolfSSL_CTX_load_system_CA_certs), - TEST_DECL(test_wc_CamelliaSetKey), - TEST_DECL(test_wc_CamelliaSetIV), - TEST_DECL(test_wc_CamelliaEncryptDecryptDirect), - TEST_DECL(test_wc_CamelliaCbcEncryptDecrypt), + TEST_DECL(test_wolfSSL_CertRsaPss), + TEST_DECL(test_wolfSSL_CTX_load_verify_locations_ex), + TEST_DECL(test_wolfSSL_CTX_load_verify_buffer_ex), + TEST_DECL(test_wolfSSL_CTX_load_verify_chain_buffer_format), + TEST_DECL(test_wolfSSL_CTX_add1_chain_cert), + TEST_DECL(test_wolfSSL_CTX_use_certificate_chain_file_format), + TEST_DECL(test_wolfSSL_CTX_trust_peer_cert), + TEST_DECL(test_wolfSSL_CTX_LoadCRL), + TEST_DECL(test_multiple_crls_same_issuer), + TEST_DECL(test_wolfSSL_CTX_SetTmpDH_file), + TEST_DECL(test_wolfSSL_CTX_SetTmpDH_buffer), + TEST_DECL(test_wolfSSL_CTX_SetMinMaxDhKey_Sz), + TEST_DECL(test_wolfSSL_CTX_der_load_verify_locations), + TEST_DECL(test_wolfSSL_CTX_enable_disable), + TEST_DECL(test_wolfSSL_CTX_ticket_API), + TEST_DECL(test_wolfSSL_SetTmpDH_file), + TEST_DECL(test_wolfSSL_SetTmpDH_buffer), + TEST_DECL(test_wolfSSL_SetMinMaxDhKey_Sz), + TEST_DECL(test_SetTmpEC_DHE_Sz), + TEST_DECL(test_wolfSSL_CTX_get0_privatekey), +#ifdef WOLFSSL_DTLS + TEST_DECL(test_wolfSSL_DtlsUpdateWindow), + TEST_DECL(test_wolfSSL_DTLS_fragment_buckets), +#endif + TEST_DECL(test_wolfSSL_dtls_set_mtu), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_dtls_plaintext), +#if !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) + TEST_DECL(test_wolfSSL_read_write), + /* Can't memory test as server hangs if client fails before second connect. + */ + TEST_DECL(test_wolfSSL_reuse_WOLFSSLobj), + TEST_DECL(test_wolfSSL_CTX_verifyDepth_ServerClient_1), + TEST_DECL(test_wolfSSL_CTX_verifyDepth_ServerClient_2), + TEST_DECL(test_wolfSSL_CTX_verifyDepth_ServerClient_3), + TEST_DECL(test_wolfSSL_CTX_set_cipher_list), + /* Can't memory test as server hangs. */ + TEST_DECL(test_wolfSSL_dtls_export), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_tls_export), +#endif + TEST_DECL(test_wolfSSL_dtls_export_peers), + TEST_DECL(test_wolfSSL_SetMinVersion), + TEST_DECL(test_wolfSSL_CTX_SetMinVersion), - TEST_DECL(test_wc_Arc4SetKey), - TEST_DECL(test_wc_Arc4Process), + /* wolfSSL handshake APIs. */ + TEST_DECL(test_wolfSSL_CTX_get0_set1_param), + TEST_DECL(test_wolfSSL_a2i_IPADDRESS), + TEST_DECL(test_wolfSSL_BUF), + TEST_DECL(test_wolfSSL_set_tlsext_status_type), + /* Can't memory test as server hangs. */ + TEST_DECL(test_wolfSSL_CTX_set_client_CA_list), + TEST_DECL(test_wolfSSL_CTX_add_client_CA), + TEST_DECL(test_wolfSSL_CTX_set_srp_username), + TEST_DECL(test_wolfSSL_CTX_set_srp_password), + TEST_DECL(test_wolfSSL_CTX_set_keylog_callback), + TEST_DECL(test_wolfSSL_CTX_get_keylog_callback), + TEST_DECL(test_wolfSSL_Tls12_Key_Logging_test), + /* Can't memory test as server hangs. */ + TEST_DECL(test_wolfSSL_Tls13_Key_Logging_test), + TEST_DECL(test_wolfSSL_Tls13_postauth), + TEST_DECL(test_wolfSSL_set_ecdh_auto), + TEST_DECL(test_wolfSSL_CTX_set_ecdh_auto), + TEST_DECL(test_wolfSSL_set_minmax_proto_version), + TEST_DECL(test_wolfSSL_CTX_set_max_proto_version), + TEST_DECL(test_wolfSSL_THREADID_hash), - TEST_DECL(test_wc_Rc2SetKey), - TEST_DECL(test_wc_Rc2SetIV), - TEST_DECL(test_wc_Rc2EcbEncryptDecrypt), - TEST_DECL(test_wc_Rc2CbcEncryptDecrypt), + /* TLS extensions tests */ +#ifdef HAVE_IO_TESTS_DEPENDENCIES +#ifdef HAVE_SNI + TEST_DECL(test_wolfSSL_UseSNI_params), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_UseSNI_connection), + TEST_DECL(test_wolfSSL_SNI_GetFromBuffer), +#endif /* HAVE_SNI */ +#endif + TEST_DECL(test_wolfSSL_UseTrustedCA), + TEST_DECL(test_wolfSSL_UseMaxFragment), + TEST_DECL(test_wolfSSL_UseTruncatedHMAC), + TEST_DECL(test_wolfSSL_UseSupportedCurve), +#if defined(HAVE_ALPN) && defined(HAVE_IO_TESTS_DEPENDENCIES) + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_UseALPN_connection), + TEST_DECL(test_wolfSSL_UseALPN_params), +#endif +#ifdef HAVE_ALPN_PROTOS_SUPPORT + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_set_alpn_protos), +#endif + TEST_DECL(test_wolfSSL_DisableExtendedMasterSecret), + TEST_DECL(test_wolfSSL_wolfSSL_UseSecureRenegotiation), + TEST_DECL(test_wolfSSL_SCR_Reconnect), + TEST_DECL(test_tls_ext_duplicate), +#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) && \ + defined(HAVE_IO_TESTS_DEPENDENCIES) + TEST_DECL(test_wolfSSL_Tls13_ECH_params), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_Tls13_ECH), +#endif - TEST_DECL(test_wc_AesSetKey), - TEST_DECL(test_wc_AesSetIV), - TEST_DECL(test_wc_AesCbcEncryptDecrypt), - TEST_DECL(test_wc_AesCtrEncryptDecrypt), - TEST_DECL(test_wc_AesGcmSetKey), - TEST_DECL(test_wc_AesGcmEncryptDecrypt), - TEST_DECL(test_wc_AesGcmMixedEncDecLongIV), - TEST_DECL(test_wc_GmacSetKey), - TEST_DECL(test_wc_GmacUpdate), - TEST_DECL(test_wc_InitRsaKey), - TEST_DECL(test_wc_RsaPrivateKeyDecode), - TEST_DECL(test_wc_RsaPublicKeyDecode), - TEST_DECL(test_wc_RsaPublicKeyDecodeRaw), - TEST_DECL(test_wc_MakeRsaKey), - TEST_DECL(test_wc_SetKeyUsage), + TEST_DECL(test_wolfSSL_X509_TLS_version_test_1), + TEST_DECL(test_wolfSSL_X509_TLS_version_test_2), - TEST_DECL(test_wc_CheckProbablePrime), - TEST_DECL(test_wc_RsaPSS_Verify), - TEST_DECL(test_wc_RsaPSS_VerifyCheck), - TEST_DECL(test_wc_RsaPSS_VerifyCheckInline), + /* OCSP Stapling */ + TEST_DECL(test_wolfSSL_UseOCSPStapling), + TEST_DECL(test_wolfSSL_UseOCSPStaplingV2), + TEST_DECL(test_self_signed_stapling), - TEST_DECL(test_wc_SetMutexCb), - TEST_DECL(test_wc_LockMutex_ex), + /* Multicast */ + TEST_DECL(test_wolfSSL_mcast), - TEST_DECL(test_wc_RsaKeyToDer), - TEST_DECL(test_wc_RsaKeyToPublicDer), - TEST_DECL(test_wc_RsaPublicEncryptDecrypt), - TEST_DECL(test_wc_RsaPublicEncryptDecrypt_ex), - TEST_DECL(test_wc_RsaEncryptSize), - TEST_DECL(test_wc_RsaSSL_SignVerify), - TEST_DECL(test_wc_RsaFlattenPublicKey), - TEST_DECL(test_RsaDecryptBoundsCheck), - TEST_DECL(test_wc_AesCcmSetKey), - TEST_DECL(test_wc_AesCcmEncryptDecrypt), - TEST_DECL(test_wc_InitDsaKey), - TEST_DECL(test_wc_DsaSignVerify), - TEST_DECL(test_wc_DsaPublicPrivateKeyDecode), - TEST_DECL(test_wc_MakeDsaKey), - TEST_DECL(test_wc_DsaKeyToDer), - TEST_DECL(test_wc_DsaKeyToPublicDer), - TEST_DECL(test_wc_DsaImportParamsRaw), - TEST_DECL(test_wc_DsaImportParamsRawCheck), - TEST_DECL(test_wc_DsaExportParamsRaw), - TEST_DECL(test_wc_DsaExportKeyRaw), + TEST_DECL(test_wolfSSL_read_detect_TCP_disconnect), - TEST_DECL(test_wc_SignatureGetSize_ecc), - TEST_DECL(test_wc_SignatureGetSize_rsa), - /* - * test_wolfCrypt_Cleanup needs to come after the above wolfCrypt tests to - * avoid memory leaks. - */ - TEST_DECL(test_wolfCrypt_Cleanup), + TEST_DECL(test_wolfSSL_msgCb), + TEST_DECL(test_wolfSSL_either_side), + TEST_DECL(test_wolfSSL_DTLS_either_side), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_dtls_fragments), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_dtls_AEAD_limit), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_ignore_alert_before_cookie), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_dtls_bad_record), + /* Uses Assert in handshake callback. */ + TEST_DECL(test_wolfSSL_dtls_stateless), + TEST_DECL(test_generate_cookie), -#ifdef OPENSSL_EXTRA - TEST_DECL(test_wolfSSL_EVP_get_cipherbynid), - TEST_DECL(test_wolfSSL_EVP_CIPHER_CTX), - TEST_DECL(test_ED25519), - TEST_DECL(test_ED448), -#endif -#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC) && \ - !defined(HAVE_SELFTEST) && \ - !(defined(HAVE_FIPS) || defined(HAVE_FIPS_VERSION)) - TEST_DECL(test_wc_ecc_get_curve_id_from_dp_params), +#ifndef NO_BIO + /* Can't memory test as server hangs. */ + TEST_DECL(test_wolfSSL_BIO_connect), + /* Can't memory test as server Asserts in thread. */ + TEST_DECL(test_wolfSSL_BIO_accept), + TEST_DECL(test_wolfSSL_BIO_tls), #endif -#ifdef HAVE_HASHDRBG -#ifdef TEST_RESEED_INTERVAL - TEST_DECL(test_wc_RNG_GenerateBlock_Reseed), -#endif - TEST_DECL(test_wc_RNG_GenerateBlock), +#if defined(HAVE_PK_CALLBACKS) && !defined(WOLFSSL_NO_TLS12) + TEST_DECL(test_DhCallbacks), #endif - TEST_DECL(test_get_rand_digit), - TEST_DECL(test_get_digit_count), - TEST_DECL(test_mp_cond_copy), - TEST_DECL(test_mp_rand), - TEST_DECL(test_get_digit), - TEST_DECL(test_wc_export_int), - TEST_DECL(test_wc_InitRngNonce), - TEST_DECL(test_wc_InitRngNonce_ex), - - TEST_DECL(test_wc_ed25519_make_key), - TEST_DECL(test_wc_ed25519_init), - TEST_DECL(test_wc_ed25519_sign_msg), - TEST_DECL(test_wc_ed25519_import_public), - TEST_DECL(test_wc_ed25519_import_private_key), - TEST_DECL(test_wc_ed25519_export), - TEST_DECL(test_wc_ed25519_size), - TEST_DECL(test_wc_ed25519_exportKey), - TEST_DECL(test_wc_Ed25519PublicKeyToDer), - TEST_DECL(test_wc_curve25519_init), - TEST_DECL(test_wc_curve25519_size), - TEST_DECL(test_wc_curve25519_export_key_raw), - TEST_DECL(test_wc_curve25519_export_key_raw_ex), - TEST_DECL(test_wc_curve25519_make_key), - TEST_DECL(test_wc_curve25519_shared_secret_ex), - TEST_DECL(test_wc_curve25519_make_pub), - TEST_DECL(test_wc_curve25519_export_public_ex), - TEST_DECL(test_wc_curve25519_export_private_raw_ex), - TEST_DECL(test_wc_curve25519_import_private_raw_ex), - TEST_DECL(test_wc_curve25519_import_private), - TEST_DECL(test_wc_ed448_make_key), - TEST_DECL(test_wc_ed448_init), - TEST_DECL(test_wc_ed448_sign_msg), - TEST_DECL(test_wc_ed448_import_public), - TEST_DECL(test_wc_ed448_import_private_key), - TEST_DECL(test_wc_ed448_export), - TEST_DECL(test_wc_ed448_size), - TEST_DECL(test_wc_ed448_exportKey), - TEST_DECL(test_wc_Ed448PublicKeyToDer), - TEST_DECL(test_wc_curve448_make_key), - TEST_DECL(test_wc_curve448_shared_secret_ex), - TEST_DECL(test_wc_curve448_export_public_ex), - TEST_DECL(test_wc_curve448_export_private_raw_ex), - TEST_DECL(test_wc_curve448_export_key_raw), - TEST_DECL(test_wc_curve448_import_private_raw_ex), - TEST_DECL(test_wc_curve448_import_private), - TEST_DECL(test_wc_curve448_init), - TEST_DECL(test_wc_curve448_size), - TEST_DECL(test_wc_ecc_make_key), - TEST_DECL(test_wc_ecc_init), - TEST_DECL(test_wc_ecc_check_key), - TEST_DECL(test_wc_ecc_get_generator), - TEST_DECL(test_wc_ecc_size), - TEST_DECL(test_wc_ecc_params), - TEST_DECL(test_wc_ecc_signVerify_hash), - TEST_DECL(test_wc_ecc_shared_secret), - TEST_DECL(test_wc_ecc_export_x963), - TEST_DECL(test_wc_ecc_export_x963_ex), - TEST_DECL(test_wc_ecc_import_x963), - TEST_DECL(ecc_import_private_key), - TEST_DECL(test_wc_ecc_export_private_only), - TEST_DECL(test_wc_ecc_rs_to_sig), - TEST_DECL(test_wc_ecc_import_raw), - TEST_DECL(test_wc_ecc_import_unsigned), - TEST_DECL(test_wc_ecc_sig_size), - TEST_DECL(test_wc_ecc_ctx_new), - TEST_DECL(test_wc_ecc_ctx_reset), - TEST_DECL(test_wc_ecc_ctx_set_peer_salt), - TEST_DECL(test_wc_ecc_ctx_set_info), - TEST_DECL(test_wc_ecc_encryptDecrypt), - TEST_DECL(test_wc_ecc_del_point), - TEST_DECL(test_wc_ecc_pointFns), - TEST_DECL(test_wc_ecc_shared_secret_ssh), - TEST_DECL(test_wc_ecc_verify_hash_ex), - TEST_DECL(test_wc_ecc_mulmod), - TEST_DECL(test_wc_ecc_is_valid_idx), - TEST_DECL(test_wc_ecc_get_curve_id_from_oid), - TEST_DECL(test_wc_ecc_sig_size_calc), +#if defined(HAVE_KEYING_MATERIAL) && defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES) + TEST_DECL(test_export_keying_material), +#endif - TEST_DECL(test_ToTraditional), - TEST_DECL(test_wc_EccPrivateKeyToDer), - TEST_DECL(test_wc_DhPublicKeyDecode), - TEST_DECL(test_wc_Ed25519KeyToDer), - TEST_DECL(test_wc_Ed25519PrivateKeyToDer), - TEST_DECL(test_wc_Ed448KeyToDer), - TEST_DECL(test_wc_Ed448PrivateKeyToDer), - TEST_DECL(test_wc_SetAuthKeyIdFromPublicKey_ex), - TEST_DECL(test_wc_SetSubjectBuffer), - TEST_DECL(test_wc_SetSubjectKeyIdFromPublicKey_ex), + /* Can't memory test as client/server Asserts in thread. */ + TEST_DECL(test_ticket_and_psk_mixing), + /* Can't memory test as client/server Asserts in thread. */ + TEST_DECL(test_prioritize_psk), - TEST_DECL(test_wc_PKCS7_New), - TEST_DECL(test_wc_PKCS7_Init), - TEST_DECL(test_wc_PKCS7_InitWithCert), - TEST_DECL(test_wc_PKCS7_EncodeData), - TEST_DECL(test_wc_PKCS7_EncodeSignedData), - TEST_DECL(test_wc_PKCS7_EncodeSignedData_ex), - TEST_DECL(test_wc_PKCS7_VerifySignedData), - TEST_DECL(test_wc_PKCS7_EncodeDecodeEnvelopedData), - TEST_DECL(test_wc_PKCS7_EncodeEncryptedData), - TEST_DECL(test_wc_PKCS7_Degenerate), - TEST_DECL(test_wc_PKCS7_BER), - TEST_DECL(test_PKCS7_signed_enveloped), - TEST_DECL(test_wc_PKCS7_NoDefaultSignedAttribs), - TEST_DECL(test_wc_PKCS7_SetOriEncryptCtx), - TEST_DECL(test_wc_PKCS7_SetOriDecryptCtx), - TEST_DECL(test_wc_PKCS7_DecodeCompressedData), - TEST_DECL(test_wc_i2d_PKCS12), - TEST_DECL(test_wolfSSL_CTX_LoadCRL), - TEST_DECL(test_openssl_FIPS_drbg), + /* Can't memory test as client/server hangs. */ TEST_DECL(test_wc_CryptoCb), + /* Can't memory test as client/server hangs. */ TEST_DECL(test_wolfSSL_CTX_StaticMemory), - TEST_DECL(test_wolfSSL_FIPS_mode), -#ifdef WOLFSSL_DTLS - TEST_DECL(test_wolfSSL_DtlsUpdateWindow), - TEST_DECL(test_wolfSSL_DTLS_fragment_buckets), -#endif #if !defined(NO_FILESYSTEM) && \ defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) @@ -67886,41 +83979,62 @@ #endif /* ! NO_RSA */ #endif /* defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ * !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) */ - /* Converted to use Expect. */ TEST_DECL(test_wolfSSL_CTX_set_ciphersuites), - /* Converted to use Expect. */ TEST_DECL(test_wolfSSL_CRL_CERT_REVOKED_alert), - /* Converted to use Expect. */ TEST_DECL(test_TLS_13_ticket_different_ciphers), TEST_DECL(test_WOLFSSL_dtls_version_alert), - TEST_DECL(test_ForceZero), - TEST_DECL(test_wolfSSL_Cleanup), #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && defined(HAVE_SESSION_TICKET) \ && defined(WOLFSSL_TLS13) && \ (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) TEST_DECL(test_ticket_nonce_malloc), #endif -#if !defined(NO_RSA) && !defined(NO_SHA) && !defined(NO_FILESYSTEM) && \ - !defined(NO_CERTS) && (!defined(NO_WOLFSSL_CLIENT) || \ - !defined(WOLFSSL_NO_CLIENT_AUTH)) - TEST_DECL(test_various_pathlen_chains), -#endif TEST_DECL(test_ticket_ret_create), + TEST_DECL(test_wrong_cs_downgrade), TEST_DECL(test_extra_alerts_wrong_cs), TEST_DECL(test_extra_alerts_skip_hs), TEST_DECL(test_extra_alerts_bad_psk), + TEST_DECL(test_tls13_bad_psk_binder), + /* Can't memory test as client/server Asserts. */ TEST_DECL(test_harden_no_secure_renegotiation), - /* Converted to use Expect. */ TEST_DECL(test_override_alt_cert_chain), + TEST_DECL(test_rpk_set_xxx_cert_type), + TEST_DECL(test_tls13_rpk_handshake), TEST_DECL(test_dtls13_bad_epoch_ch), + TEST_DECL(test_short_session_id), TEST_DECL(test_wolfSSL_dtls13_null_cipher), + /* Can't memory test as client/server hangs. */ TEST_DECL(test_dtls_msg_from_other_peer), TEST_DECL(test_dtls_ipv6_check), - /* If at some point a stub get implemented this test should fail indicating - * a need to implement a new test case - */ - TEST_DECL(test_stubs_are_stubs) + TEST_DECL(test_wolfSSL_SCR_after_resumption), + TEST_DECL(test_dtls_no_extensions), + TEST_DECL(test_tls_alert_no_server_hello), + TEST_DECL(test_TLSX_CA_NAMES_bad_extension), + TEST_DECL(test_dtls_1_0_hvr_downgrade), + TEST_DECL(test_session_ticket_no_id), + TEST_DECL(test_session_ticket_hs_update), + TEST_DECL(test_dtls_downgrade_scr_server), + TEST_DECL(test_dtls_downgrade_scr), + TEST_DECL(test_dtls_client_hello_timeout_downgrade), + TEST_DECL(test_dtls_client_hello_timeout), + TEST_DECL(test_dtls_dropped_ccs), + TEST_DECL(test_dtls_seq_num_downgrade), + TEST_DECL(test_certreq_sighash_algos), + TEST_DECL(test_revoked_loaded_int_cert), + TEST_DECL(test_dtls_frag_ch), + TEST_DECL(test_dtls13_frag_ch_pq), + TEST_DECL(test_dtls_empty_keyshare_with_cookie), + TEST_DECL(test_dtls_old_seq_number), + TEST_DECL(test_tls13_pq_groups), + TEST_DECL(test_tls13_early_data), + TEST_DECL(test_tls_multi_handshakes_one_record), + TEST_DECL(test_write_dup), + TEST_DECL(test_read_write_hs), + TEST_DECL(test_get_signature_nid), + TEST_DECL(test_tls_cert_store_unchanged), + TEST_DECL(test_wolfSSL_SendUserCanceled), + /* This test needs to stay at the end to clean up any caches allocated. */ + TEST_DECL(test_wolfSSL_Cleanup) }; #define TEST_CASE_CNT (int)(sizeof(testCases) / sizeof(*testCases)) @@ -68018,12 +84132,28 @@ #ifndef WOLFSSL_UNIT_TEST_NO_TIMING static double gettime_secs(void) -{ - struct timeval tv; - LIBCALL_CHECK_RET(gettimeofday(&tv, 0)); + #if defined(_MSC_VER) && defined(_WIN32) + { + /* there's no gettimeofday for Windows, so we'll use system time */ + #define EPOCH_DIFF 11644473600LL + FILETIME currentFileTime; + GetSystemTimePreciseAsFileTime(¤tFileTime); + + ULARGE_INTEGER uli = { 0, 0 }; + uli.LowPart = currentFileTime.dwLowDateTime; + uli.HighPart = currentFileTime.dwHighDateTime; - return (double)tv.tv_sec + (double)tv.tv_usec / 1000000; -} + /* Convert to seconds since Unix epoch */ + return (double)((uli.QuadPart - (EPOCH_DIFF * 10000000)) / 10000000.0); + } + #else + { + struct timeval tv; + LIBCALL_CHECK_RET(gettimeofday(&tv, 0)); + + return (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0; + } + #endif #endif int ApiTest(void) @@ -68034,7 +84164,6 @@ #ifndef WOLFSSL_UNIT_TEST_NO_TIMING double timeDiff; #endif - EXPECT_DECLS; printf(" Begin API Tests\n"); fflush(stdout); @@ -68054,8 +84183,26 @@ #endif } + #ifdef WOLFSSL_DUMP_MEMIO_STREAM + if (res == 0) { + if (create_tmp_dir(tmpDirName, sizeof(tmpDirName) - 1) == NULL) { + printf("failed to create tmp dir\n"); + res = 1; + } + else { + tmpDirNameSet = 1; + } + } + #endif + if (res == 0) { for (i = 0; i < TEST_CASE_CNT; ++i) { + EXPECT_DECLS; + + #ifdef WOLFSSL_DUMP_MEMIO_STREAM + currentTestName = testCases[i].name; + #endif + /* When not testing all cases then skip if not marked for running. */ if (!testAll && !testCases[i].run) { @@ -68120,6 +84267,18 @@ fflush(stdout); } +#ifdef WOLFSSL_DUMP_MEMIO_STREAM + if (tmpDirNameSet) { + printf("\nBinary dumps of the memio streams can be found in the\n" + "%s directory. This can be imported into\n" + "Wireshark by transforming the file with\n" + "\tod -Ax -tx1 -v stream.dump > stream.dump.hex\n" + "And then loading test_output.dump.hex into Wireshark using\n" + "the \"Import from Hex Dump...\" option and selecting the\n" + "TCP encapsulation option.\n", tmpDirName); + } +#endif + printf(" End API Tests\n"); fflush(stdout); return res; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/tests/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -29,7 +29,9 @@ tests/test-tls13-pq.conf \ tests/test-tls13-pq-2.conf \ tests/test-dtls13-pq.conf \ + tests/test-dtls13-pq-frag.conf \ tests/test-dtls13-pq-2.conf \ + tests/test-dtls13-pq-2-frag.conf \ tests/test-psk.conf \ tests/test-psk-no-id.conf \ tests/test-psk-no-id-sha2.conf \ @@ -66,7 +68,9 @@ tests/test-dhprime.conf \ tests/test-p521.conf \ tests/test-ecc-cust-curves.conf \ + tests/test-sm2.conf \ tests/NCONF_test.cnf \ tests/test-tls-downgrade.conf \ - tests/TXT_DB.txt + tests/TXT_DB.txt \ + tests/utils.h DISTCLEANFILES+= tests/.libs/unit.test diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/quic.c mariadb-10.11.9/extra/wolfssl/wolfssl/tests/quic.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/quic.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/quic.c 2024-08-03 07:30:00.000000000 +0000 @@ -543,10 +543,11 @@ { QuicTestContext *ctx = (QuicTestContext*)wolfSSL_get_app_data(ssl); + AssertNotNull(ctx); + if (ctx->verbose) { printf("[%s] send_alert: level=%d, err=%d\n", ctx->name, level, err); } - AssertNotNull(ctx); ctx->alert_level = level; ctx->alert = alert; return 1; @@ -559,6 +560,8 @@ { QuicTestContext *ctx = (QuicTestContext*)wolfSSL_get_app_data(ssl); + AssertNotNull(ctx); + (void)cb_ctx; if (ticketSz < 0 || (size_t)ticketSz > sizeof(ctx->ticket)) { printf("SESSION TICKET callback: ticket given is too large: %d bytes\n", ticketSz); @@ -566,10 +569,10 @@ } memset(ctx->ticket, 0, sizeof(ctx->ticket)); ctx->ticket_len = (word32)ticketSz; - memcpy(ctx->ticket, ticket, ticketSz); + memcpy(ctx->ticket, ticket, (size_t)ticketSz); if (ctx->verbose) { printf("Session Ticket[%s]: ", ctx->name); - dump_buffer("", ticket, ticketSz, 4); + dump_buffer("", ticket, (size_t)ticketSz, 4); } return 0; } @@ -928,7 +931,7 @@ if (ret < 0) { int err = wolfSSL_get_error(conv->client->ssl, ret); char lbuffer[1024]; - printf("EARLY DATA ret = %d, error = %d, %s\n", ret, err, wolfSSL_ERR_error_string(err, lbuffer)); + printf("EARLY DATA ret = %d, error = %d, %s\n", ret, err, wolfSSL_ERR_error_string((unsigned long)err, lbuffer)); AssertTrue(0); } *pwritten = (size_t)written; @@ -988,7 +991,7 @@ } } else if (n > 0) { - conv->early_data_len += n; + conv->early_data_len += (size_t)n; if (conv->verbose) printf("RECVed early data, len now=%d\n", (int)conv->early_data_len); } @@ -1154,7 +1157,7 @@ /* we have the app secrets */ check_secrets(&tclient, wolfssl_encryption_application, 32, 32); check_secrets(&tserver, wolfssl_encryption_application, 32, 32); - /* verify client and server have the same secrets establishd */ + /* verify client and server have the same secrets established */ assert_secrets_EQ(&tclient, &tserver, wolfssl_encryption_handshake); assert_secrets_EQ(&tclient, &tserver, wolfssl_encryption_application); /* AEAD cipher should be known */ @@ -1379,10 +1382,10 @@ * a session works. */ AssertTrue(tclient.ticket_len > 0); AssertNotNull(session = wolfSSL_get1_session(tclient.ssl)); - AssertTrue((session_size = wolfSSL_i2d_SSL_SESSION(session, NULL)) > 0); + AssertTrue((session_size = (unsigned int)wolfSSL_i2d_SSL_SESSION(session, NULL)) > 0); AssertTrue((size_t)session_size < sizeof(session_buffer)); session_data2 = session_data = session_buffer; - session_size = wolfSSL_i2d_SSL_SESSION(session, &session_data); + session_size = (unsigned int)wolfSSL_i2d_SSL_SESSION(session, &session_data); session_restored = wolfSSL_d2i_SSL_SESSION(NULL, &session_data2, session_size); AssertNotNull(session_restored); @@ -1535,6 +1538,8 @@ int ret = 0; int sz; + AssertNotNull(ctx); + sz = wolfSSL_i2d_SSL_SESSION(session, NULL); if (sz <= 0) { printf("[%s] session serialization error: %d <- ", ctx->name, sz); @@ -1545,7 +1550,7 @@ return -1; } data = ctx->session; - ctx->session_len = wolfSSL_i2d_SSL_SESSION(session, &data); + ctx->session_len = (word32)wolfSSL_i2d_SSL_SESSION(session, &data); if (ctx->verbose) { printf("[%s]", ctx->name); dump_buffer(" new SESSION", ctx->session, ctx->session_len, 4); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/srp.c mariadb-10.11.9/extra/wolfssl/wolfssl/tests/srp.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/srp.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/srp.c 2024-08-03 07:30:00.000000000 +0000 @@ -128,9 +128,11 @@ /* invalid params */ AssertIntEQ(BAD_FUNC_ARG, wc_SrpInit(NULL, SRP_TYPE_TEST_DEFAULT, SRP_CLIENT_SIDE)); + /* // NOLINTBEGIN(clang-analyzer-optin.core.EnumCastOutOfRange) */ AssertIntEQ(BAD_FUNC_ARG, wc_SrpInit(&srp, (SrpType)255, SRP_CLIENT_SIDE)); AssertIntEQ(BAD_FUNC_ARG, wc_SrpInit(&srp, SRP_TYPE_TEST_DEFAULT, (SrpSide)255)); + /* // NOLINTEND(clang-analyzer-optin.core.EnumCastOutOfRange) */ /* success */ AssertIntEQ(0, wc_SrpInit(&srp, SRP_TYPE_TEST_DEFAULT, SRP_CLIENT_SIDE)); @@ -208,6 +210,7 @@ byte v[64]; word32 vSz = 0; + XMEMSET(v, 0, sizeof(v)); AssertIntEQ(0, wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE)); AssertIntEQ(0, wc_SrpSetUsername(&srp, username, usernameSz)); @@ -262,6 +265,7 @@ byte pub[64]; word32 pubSz = 0; + XMEMSET(pub, 0, sizeof(pub)); AssertIntEQ(0, wc_SrpInit(&srp, SRP_TYPE_SHA, SRP_CLIENT_SIDE)); AssertIntEQ(0, wc_SrpSetUsername(&srp, username, usernameSz)); AssertIntEQ(0, wc_SrpSetParams(&srp, srp_N, sizeof(srp_N), @@ -318,6 +322,8 @@ word32 clientPubKeySz = 64; word32 serverPubKeySz = 64; + XMEMSET(clientPubKey, 0, sizeof(clientPubKey)); + XMEMSET(serverPubKey, 0, sizeof(serverPubKey)); AssertIntEQ(0, wc_SrpInit(&cli, SRP_TYPE_SHA, SRP_CLIENT_SIDE)); AssertIntEQ(0, wc_SrpInit(&srv, SRP_TYPE_SHA, SRP_SERVER_SIDE)); @@ -388,6 +394,10 @@ word32 clientProofSz = SRP_MAX_DIGEST_SIZE; word32 serverProofSz = SRP_MAX_DIGEST_SIZE; + XMEMSET(clientPubKey, 0, sizeof(clientPubKey)); + XMEMSET(serverPubKey, 0, sizeof(serverPubKey)); + XMEMSET(clientProof, 0, sizeof(clientProof)); + XMEMSET(serverProof, 0, sizeof(serverProof)); AssertIntEQ(0, wc_SrpInit(&cli, SRP_TYPE_SHA, SRP_CLIENT_SIDE)); AssertIntEQ(0, wc_SrpInit(&srv, SRP_TYPE_SHA, SRP_SERVER_SIDE)); @@ -792,6 +802,10 @@ }; #endif + XMEMSET(clientPubKey, 0, sizeof(clientPubKey)); + XMEMSET(serverPubKey, 0, sizeof(serverPubKey)); + XMEMSET(clientProof, 0, sizeof(clientProof)); + XMEMSET(serverProof, 0, sizeof(serverProof)); AssertIntEQ(0, wc_SrpInit(&cli, SRP_TYPE_SHA512, SRP_CLIENT_SIDE)); AssertIntEQ(0, wc_SrpInit(&srv, SRP_TYPE_SHA512, SRP_SERVER_SIDE)); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/suites.c mariadb-10.11.9/extra/wolfssl/wolfssl/tests/suites.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/suites.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/suites.c 2024-08-03 07:30:00.000000000 +0000 @@ -61,7 +61,8 @@ #include "examples/client/client.h" #include "examples/server/server.h" -#if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) +#if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && \ + !defined(SINGLE_THREADED) static WOLFSSL_CTX* cipherSuiteCtx = NULL; static char nonblockFlag[] = "-N"; static char noVerifyFlag[] = "-d"; @@ -153,7 +154,7 @@ printf("suite too long!\n"); return 0; } - XMEMCPY(suite, begin, len); + XMEMCPY(suite, begin, (size_t) len); suite[len] = '\0'; } else @@ -303,12 +304,8 @@ int forceCliDefCipherList) { #if defined(WOLFSSL_TIRTOS) || defined(WOLFSSL_SRTP) - func_args cliArgs = {0}; - func_args svrArgs = {0}; - cliArgs.argc = cli_argc; - cliArgs.argv = cli_argv; - svrArgs.argc = svr_argc; - svrArgs.argv = svr_argv; + func_args cliArgs = {0, NULL, 0, NULL, NULL, NULL}; + func_args svrArgs = {0, NULL, 0, NULL, NULL, NULL}; #else func_args cliArgs = {cli_argc, cli_argv, 0, NULL, NULL}; func_args svrArgs = {svr_argc, svr_argv, 0, NULL, NULL}; @@ -329,9 +326,17 @@ int reqClientCert; #endif -#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND) srtp_test_helper srtp_helper; #endif + +#if defined(WOLFSSL_TIRTOS) || defined(WOLFSSL_SRTP) + cliArgs.argc = cli_argc; + cliArgs.argv = cli_argv; + svrArgs.argc = svr_argc; + svrArgs.argv = svr_argv; +#endif + /* Is Valid Cipher and Version Checks */ /* build command list for the Is checks below */ commandLine[0] = '\0'; @@ -460,7 +465,7 @@ InitTcpReady(&ready); -#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND) srtp_helper_init(&srtp_helper); cliArgs.srtp_helper = &srtp_helper; svrArgs.srtp_helper = &srtp_helper; @@ -580,7 +585,7 @@ #endif FreeTcpReady(&ready); -#if defined (WOLFSSL_SRTP) &&!defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined (WOLFSSL_SRTP) && defined(WOLFSSL_COND) srtp_helper_free(&srtp_helper); #endif @@ -655,7 +660,7 @@ return; } - script = (char*)malloc(sz+1); + script = (char*)malloc((size_t)(sz+1)); if (script == 0) { fprintf(stderr, "unable to allocate script buffer\n"); fclose(file); @@ -663,7 +668,7 @@ return; } - len = fread(script, 1, sz, file); + len = (long) fread(script, 1, (size_t)sz, file); if (len != sz) { fprintf(stderr, "read error\n"); fclose(file); @@ -791,7 +796,8 @@ int SuiteTest(int argc, char** argv) { #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && \ - !defined(WOLF_CRYPTO_CB_ONLY_RSA) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) + !defined(WOLF_CRYPTO_CB_ONLY_RSA) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \ + !defined(SINGLE_THREADED) func_args args; char argv0[3][80]; char* myArgv[3]; @@ -964,10 +970,31 @@ args.return_code = EXIT_FAILURE; goto exit; } + #ifdef WOLFSSL_DTLS_CH_FRAG + /* add DTLSv13 pq frag tests */ + XSTRLCPY(argv0[1], "tests/test-dtls13-pq-frag.conf", sizeof(argv0[1])); + printf("starting DTLSv13 post-quantum groups tests with fragmentation\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + args.return_code = EXIT_FAILURE; + goto exit; + } + #endif #ifdef HAVE_LIBOQS - /* add DTLSv13 pq tests */ + /* add DTLSv13 pq 2 tests */ XSTRLCPY(argv0[1], "tests/test-dtls13-pq-2.conf", sizeof(argv0[1])); - printf("starting DTLSv13 post-quantum groups tests\n"); + printf("starting DTLSv13 post-quantum 2 groups tests\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + args.return_code = EXIT_FAILURE; + goto exit; + } + #ifdef WOLFSSL_DTLS_CH_FRAG + /* add DTLSv13 pq 2 frag tests */ + XSTRLCPY(argv0[1], "tests/test-dtls13-pq-2-frag.conf", sizeof(argv0[1])); + printf("starting DTLSv13 post-quantum 2 groups tests with fragmentation\n"); test_harness(&args); if (args.return_code != 0) { printf("error from script %d\n", args.return_code); @@ -976,6 +1003,7 @@ } #endif #endif + #endif #endif #if defined(WC_RSA_PSS) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) && \ @@ -1275,6 +1303,18 @@ } #endif /* HAVE_RSA and HAVE_ECC */ #endif /* !WC_STRICT_SIG */ +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) && \ + (defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) + /* add SM2/SM3/SM4 test suites */ + XSTRLCPY(argv0[1], "tests/test-sm2.conf", sizeof(argv0[1])); + printf("starting SM2/SM3/SM4 cipher suite tests\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + args.return_code = EXIT_FAILURE; + goto exit; + } +#endif #ifndef NO_PSK #ifndef WOLFSSL_NO_TLS12 #if !defined(NO_RSA) || defined(HAVE_ECC) @@ -1415,8 +1455,8 @@ return args.return_code; #else - return NOT_COMPILED_IN; (void)argc; (void)argv; + return NOT_COMPILED_IN; #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */ } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls.conf mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls.conf 2024-08-03 07:30:00.000000000 +0000 @@ -55,6 +55,20 @@ -s -l ECDHE-PSK-CHACHA20-POLY1305 +# server TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 x25519 +-u +-v 3 +-s +-t +-l ECDHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 x25519 +-u +-v 3 +-s +-t +-l ECDHE-PSK-CHACHA20-POLY1305 + # server TLSv1.2 PSK-CHACHA20-POLY1305 -u -v 3 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls13-downgrade.conf mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-downgrade.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls13-downgrade.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-downgrade.conf 2024-08-03 07:30:00.000000000 +0000 @@ -41,3 +41,16 @@ -7 2 -u -l TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA + +# server DTLSv1.2 - PSK +-v 3 +-u +-s +-l ECDHE-PSK-AES128-GCM-SHA256 + +# client DTLS PSK multiversion, allow downgrade +-vd +-7 2 +-u +-s +-l ECDHE-PSK-AES128-GCM-SHA256 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls13-pq-2-frag.conf mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-pq-2-frag.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls13-pq-2-frag.conf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-pq-2-frag.conf 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,23 @@ +# server DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc P384_KYBER_LEVEL3 + +# client DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc P384_KYBER_LEVEL3 + +# server DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc P521_KYBER_LEVEL5 + +# client DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc P521_KYBER_LEVEL5 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls13-pq-frag.conf mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-pq-frag.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-dtls13-pq-frag.conf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-dtls13-pq-frag.conf 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,24 @@ +# server DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc KYBER_LEVEL3 + +# client DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc KYBER_LEVEL3 + +# server DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc KYBER_LEVEL5 + +# client DTLSv1.3 with post-quantum group +-u +-v 4 +-l TLS13-AES256-GCM-SHA384 +--pqc KYBER_LEVEL5 + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-sm2.conf mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-sm2.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-sm2.conf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-sm2.conf 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,189 @@ +# server TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-d + +# client TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-A ./certs/sm2/root-sm2.pem +-C + +# server TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-d + +# client TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-A ./certs/sm2/root-sm2.pem +-C + +# server TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-A ./certs/sm2/client-sm2.pem +-V +# Remove -V when CRL for SM2 certificates available. + +# client TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-c ./certs/sm2/client-sm2.pem +-k ./certs/sm2/client-sm2-priv.pem +-A ./certs/sm2/root-sm2.pem +-C + +# server TLSv1.2 ECDHE-ECDSA-SM4-GCM-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-GCM-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-d + +# client TLSv1.2 ECDHE-ECDSA-SM4-GCM-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-GCM-SM3 +-A ./certs/sm2/root-sm2.pem +-C + +# server TLSv1.2 ECDHE-ECDSA-SM4-CCM-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CCM-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-d + +# client TLSv1.2 ECDHE-ECDSA-SM4-CCM-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CCM-SM3 +-A ./certs/sm2/root-sm2.pem +-C + +# server TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-d + +# client TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-A ./certs/sm2/root-sm2.pem +-C + +# server TLSv1.3 TLS13-SM4-CCM-SM3 +-v 4 +-l TLS13-SM4-CCM-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-d + +# client TLSv1.3 TLS13-SM4-CCM-SM3 +-v 4 +-l TLS13-SM4-CCM-SM3 +-A ./certs/sm2/root-sm2.pem +-C + +# Enable when CRL for SM2 certificates available. +# server TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-A ./certs/sm2/client-sm2.pem +-V +# Remove -V when CRL for SM2 certificates available. + +# client TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-c ./certs/sm2/client-sm2.pem +-k ./certs/sm2/client-sm2-priv.pem +-A ./certs/sm2/root-sm2.pem +-C + +# Enable when CRL for SM2 certificates available. +# server TLSv1.3 TLS13-SM4-CCM-SM3 +-v 4 +-l TLS13-SM4-CCM-SM3 +-c ./certs/sm2/server-sm2.pem +-k ./certs/sm2/server-sm2-priv.pem +-A ./certs/sm2/client-sm2.pem +-V +# Remove -V when CRL for SM2 certificates available. + +# client TLSv1.3 TLS13-SM4-CCM-SM3 +-v 4 +-l TLS13-SM4-CCM-SM3 +-c ./certs/sm2/client-sm2.pem +-k ./certs/sm2/client-sm2-priv.pem +-A ./certs/sm2/root-sm2.pem +-C + +# GmSSL certificates and keys +# server TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-c ./certs/sm2/self-sm2-cert.pem +-k ./certs/sm2/self-sm2-priv.pem +-d + +# client TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-A ./certs/sm2/self-sm2-cert.pem +-C + +# server TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-c ./certs/sm2/self-sm2-cert.pem +-k ./certs/sm2/self-sm2-priv.pem +-A ./certs/sm2/self-sm2-cert.pem +-V + +# client TLSv1.2 ECDHE-ECDSA-SM4-CBC-SM3 +-v 3 +-l ECDHE-ECDSA-SM4-CBC-SM3 +-A ./certs/sm2/self-sm2-cert.pem +-c ./certs/sm2/self-sm2-cert.pem +-k ./certs/sm2/self-sm2-priv.pem +-C + +# server TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-c ./certs/sm2/self-sm2-cert.pem +-k ./certs/sm2/self-sm2-priv.pem +-d + +# client TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-A ./certs/sm2/self-sm2-cert.pem +-C + +# server TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-c ./certs/sm2/self-sm2-cert.pem +-k ./certs/sm2/self-sm2-priv.pem +-A ./certs/sm2/self-sm2-cert.pem +-V + +# client TLSv1.3 TLS13-SM4-GCM-SM3 +-v 4 +-l TLS13-SM4-GCM-SM3 +-A ./certs/sm2/self-sm2-cert.pem +-c ./certs/sm2/self-sm2-cert.pem +-k ./certs/sm2/self-sm2-priv.pem +-C diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-tls13-down.conf mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-tls13-down.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test-tls13-down.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test-tls13-down.conf 2024-08-03 07:30:00.000000000 +0000 @@ -108,3 +108,14 @@ # client TLSv 1.2 -v 3 -H exitWithRet + +# server TLSv1.2 - PSK +-v 3 +-s +-l ECDHE-PSK-AES128-GCM-SHA256 + +# client TLS PSK multiversion, allow downgrade +-v d +-7 3 +-s +-l ECDHE-PSK-AES128-GCM-SHA256 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test.conf mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/test.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/test.conf 2024-08-03 07:30:00.000000000 +0000 @@ -45,6 +45,18 @@ -s -l ECDHE-PSK-CHACHA20-POLY1305 +# server TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 x25519 +-v 3 +-s +-t +-l ECDHE-PSK-CHACHA20-POLY1305 + +# client TLSv1.2 ECDHE-PSK-CHACHA20-POLY1305 x25519 +-v 3 +-s +-t +-l ECDHE-PSK-CHACHA20-POLY1305 + # server TLSv1.2 PSK-CHACHA20-POLY1305 -v 3 -s diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/unit.c mariadb-10.11.9/extra/wolfssl/wolfssl/tests/unit.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/unit.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/unit.c 2024-08-03 07:30:00.000000000 +0000 @@ -27,6 +27,7 @@ #endif #include +#include #include #include @@ -67,7 +68,6 @@ (void)argc; (void)argv; - #ifdef WOLFSSL_FORCE_MALLOC_FAIL_TEST if (argc > 1) { int memFailCount = atoi(argv[1]); @@ -160,7 +160,7 @@ err_sys("KDF TLSv1.2 CAST failed"); } #endif -#if defined(WOLFSSL_HAVE_PRF) && defined(WOLFSSL_TLS13) +#if defined(HAVE_HKDF) && !defined(NO_HMAC) if (wc_RunCast_fips(FIPS_CAST_KDF_TLS13) != 0) { err_sys("KDF TLSv1.3 CAST failed"); } @@ -171,6 +171,11 @@ } #endif #endif /* HAVE_FIPS && HAVE_FIPS_VERSION == 5 */ +#if FIPS_VERSION3_GT(5,2,0) + if (wc_RunAllCast_fips() != 0) { + err_sys("wc_RunAllCast_fips() failed\n"); + } +#endif while (argc > 1) { if (argv[1][0] != '-') { @@ -270,75 +275,3 @@ return ret; } - - - -void wait_tcp_ready(func_args* args) -{ -#ifdef SINGLE_THREADED - (void)args; -#elif defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_mutex_lock(&args->signal->mutex)); - - if (!args->signal->ready) - PTHREAD_CHECK_RET(pthread_cond_wait(&args->signal->cond, - &args->signal->mutex)); - args->signal->ready = 0; /* reset */ - - PTHREAD_CHECK_RET(pthread_mutex_unlock(&args->signal->mutex)); -#else - (void)args; -#endif -} - - -void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread) -{ -#ifdef SINGLE_THREADED - (void)fun; - (void)args; - (void)thread; -#elif defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_create(thread, 0, fun, args)); - return; -#elif defined (WOLFSSL_TIRTOS) - /* Initialize the defaults and set the parameters. */ - Task_Params taskParams; - Task_Params_init(&taskParams); - taskParams.arg0 = (UArg)args; - taskParams.stackSize = 65535; - *thread = Task_create((Task_FuncPtr)fun, &taskParams, NULL); - if (*thread == NULL) { - fprintf(stderr, "Failed to create new Task\n"); - } - Task_yield(); -#else - *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0); -#endif -} - - -void join_thread(THREAD_TYPE thread) -{ -#ifdef SINGLE_THREADED - (void)thread; -#elif defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_join(thread, 0)); -#elif defined (WOLFSSL_TIRTOS) - while(1) { - if (Task_getMode(thread) == Task_Mode_TERMINATED) { - Task_sleep(5); - break; - } - Task_yield(); - } -#else - int res = WaitForSingleObject((HANDLE)thread, INFINITE); - assert(res == WAIT_OBJECT_0); - res = CloseHandle((HANDLE)thread); - assert(res); - (void)res; /* Suppress un-used variable warning */ -#endif -} - - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/unit.h mariadb-10.11.9/extra/wolfssl/wolfssl/tests/unit.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/unit.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/unit.h 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,7 @@ #include /* thread and tcp stuff */ #ifdef WOLFSSL_FORCE_MALLOC_FAIL_TEST -#define XABORT() +#define XABORT() WC_DO_NOTHING #else #define XABORT() abort() #endif @@ -99,17 +99,17 @@ #else #define AssertPtr(x, y, op, er) do { \ - PRAGMA_GCC_DIAG_PUSH; \ + PRAGMA_GCC_DIAG_PUSH \ /* remarkably, without this inhibition, */ \ /* the _Pragma()s make the declarations warn. */ \ - PRAGMA_GCC("GCC diagnostic ignored \"-Wdeclaration-after-statement\""); \ + PRAGMA_GCC("GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \ /* inhibit "ISO C forbids conversion of function pointer */ \ /* to object pointer type [-Werror=pedantic]" */ \ - PRAGMA_GCC("GCC diagnostic ignored \"-Wpedantic\""); \ + PRAGMA_GCC("GCC diagnostic ignored \"-Wpedantic\"") \ void* _x = (void*)(x); \ void* _y = (void*)(y); \ Assert(_x op _y, ("%s " #op " %s", #x, #y), ("%p " #er " %p", _x, _y)); \ - PRAGMA_GCC_DIAG_POP; \ + PRAGMA_GCC_DIAG_POP \ } while(0) #endif @@ -123,38 +123,40 @@ #define EXPECT_DECLS \ - int _ret = 0 + int _ret = TEST_SKIPPED #define EXPECT_RESULT() \ - ((_ret == 0) ? TEST_SUCCESS : TEST_FAIL) + _ret #define EXPECT_SUCCESS() \ - (_ret == 0) + (_ret == TEST_SUCCESS) #define EXPECT_FAIL() \ - (_ret != 0) + (_ret == TEST_FAIL) #define ExpFail(description, result) do { \ printf("\nERROR - %s line %d failed with:", __FILE__, __LINE__); \ fputs("\n expected: ", stdout); printf description; \ fputs("\n result: ", stdout); printf result; fputs("\n\n", stdout); \ fflush(stdout); \ - _ret = -1; \ + _ret = TEST_FAIL; \ } while (0) -#define Expect(test, description, result) \ - if ((_ret == 0) && (!(test))) ExpFail(description, result) +#define Expect(test, description, result) do { \ + if (_ret != TEST_FAIL) { if (!(test)) ExpFail(description, result); \ + else _ret = TEST_SUCCESS; } \ +} while (0) #define ExpectTrue(x) Expect( (x), ("%s is true", #x), (#x " => FALSE")) #define ExpectFalse(x) Expect(!(x), ("%s is false", #x), (#x " => TRUE")) #define ExpectNotNull(x) Expect( (x), ("%s is not null", #x), (#x " => NULL")) #define ExpectNull(x) do { \ - if (_ret == 0) { \ + if (_ret != TEST_FAIL) { \ PEDANTIC_EXTENSION void* _x = (void*)(x); \ Expect(!_x, ("%s is null", #x), (#x " => %p", _x)); \ } \ } while(0) #define ExpectInt(x, y, op, er) do { \ - if (_ret == 0) { \ + if (_ret != TEST_FAIL) { \ int _x = (int)(x); \ int _y = (int)(y); \ Expect(_x op _y, ("%s " #op " %s", #x, #y), ("%d " #er " %d", _x, _y));\ @@ -169,10 +171,10 @@ #define ExpectIntLE(x, y) ExpectInt(x, y, <=, >) #define ExpectStr(x, y, op, er) do { \ - if (_ret == 0) { \ + if (_ret != TEST_FAIL) { \ const char* _x = (const char*)(x); \ const char* _y = (const char*)(y); \ - int _z = (_x && _y) ? strcmp(_x, _y) : -1; \ + int _z = (_x && _y) ? XSTRCMP(_x, _y) : -1; \ Expect(_z op 0, ("%s " #op " %s", #x, #y), \ ("\"%s\" " #er " \"%s\"", _x, _y));\ } \ @@ -186,18 +188,18 @@ #define ExpectStrLE(x, y) ExpectStr(x, y, <=, >) #define ExpectPtr(x, y, op, er) do { \ - if (_ret == 0) { \ - PRAGMA_DIAG_PUSH; \ + if (_ret != TEST_FAIL) { \ + PRAGMA_DIAG_PUSH \ /* remarkably, without this inhibition, */ \ /* the _Pragma()s make the declarations warn. */ \ - PRAGMA("GCC diagnostic ignored \"-Wdeclaration-after-statement\""); \ + PRAGMA("GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \ /* inhibit "ISO C forbids conversion of function pointer */ \ /* to object pointer type [-Werror=pedantic]" */ \ - PRAGMA("GCC diagnostic ignored \"-Wpedantic\""); \ + PRAGMA("GCC diagnostic ignored \"-Wpedantic\"") \ void* _x = (void*)(x); \ void* _y = (void*)(y); \ Expect(_x op _y, ("%s " #op " %s", #x, #y), ("%p " #er " %p", _x, _y));\ - PRAGMA_DIAG_POP; \ + PRAGMA_DIAG_POP \ } \ } while(0) @@ -209,19 +211,88 @@ #define ExpectPtrLE(x, y) ExpectPtr(x, y, <=, >) #define ExpectBuf(x, y, z, op, er) do { \ - if (_ret == 0) { \ + if (_ret != TEST_FAIL) { \ const byte* _x = (const byte*)(x); \ const byte* _y = (const byte*)(y); \ int _z = (int)(z); \ int _w = ((_x) && (_y)) ? XMEMCMP(_x, _y, _z) : -1; \ Expect(_w op 0, ("%s " #op " %s for %s", #x, #y, #z), \ - ("\"%p\" " #er " \"%p\" for \"%d\"", _x, _y, _z));\ + ("\"%p\" " #er " \"%p\" for \"%d\"", \ + (const void *)_x, (const void *)_y, _z)); \ } \ } while(0) #define ExpectBufEQ(x, y, z) ExpectBuf(x, y, z, ==, !=) #define ExpectBufNE(x, y, z) ExpectBuf(x, y, z, !=, ==) +#define ExpectFail() ExpectTrue(0) + + +#define DoExpectNull(x) do { \ + PEDANTIC_EXTENSION void* _x = (void*)(x); \ + Expect(!_x, ("%s is null", #x), (#x " => %p", _x)); \ +} while(0) + +#define DoExpectInt(x, y, op, er) do { \ + int _x = (int)(x); \ + int _y = (int)(y); \ + Expect(_x op _y, ("%s " #op " %s", #x, #y), ("%d " #er " %d", _x, _y)); \ +} while(0) + +#define DoExpectIntEQ(x, y) DoExpectInt(x, y, ==, !=) +#define DoExpectIntNE(x, y) DoExpectInt(x, y, !=, ==) +#define DoExpectIntGT(x, y) DoExpectInt(x, y, >, <=) +#define DoExpectIntLT(x, y) DoExpectInt(x, y, <, >=) +#define DoExpectIntGE(x, y) DoExpectInt(x, y, >=, <) +#define DoExpectIntLE(x, y) DoExpectInt(x, y, <=, >) + +#define DoExpectStr(x, y, op, er) do { \ + const char* _x = (const char*)(x); \ + const char* _y = (const char*)(y); \ + int _z = (_x && _y) ? strcmp(_x, _y) : -1; \ + Expect(_z op 0, ("%s " #op " %s", #x, #y), \ + ("\"%s\" " #er " \"%s\"", _x, _y));\ +} while(0) + +#define DoExpectStrEQ(x, y) DoExpectStr(x, y, ==, !=) +#define DoExpectStrNE(x, y) DoExpectStr(x, y, !=, ==) +#define DoExpectStrGT(x, y) DoExpectStr(x, y, >, <=) +#define DoExpectStrLT(x, y) DoExpectStr(x, y, <, >=) +#define DoExpectStrGE(x, y) DoExpectStr(x, y, >=, <) +#define DoExpectStrLE(x, y) DoExpectStr(x, y, <=, >) + +#define DoExpectPtr(x, y, op, er) do { \ + PRAGMA_DIAG_PUSH \ + /* remarkably, without this inhibition, */ \ + /* the _Pragma()s make the declarations warn. */ \ + PRAGMA("GCC diagnostic ignored \"-Wdeclaration-after-statement\"") \ + /* inhibit "ISO C forbids conversion of function pointer */ \ + /* to object pointer type [-Werror=pedantic]" */ \ + PRAGMA("GCC diagnostic ignored \"-Wpedantic\"") \ + void* _x = (void*)(x); \ + void* _y = (void*)(y); \ + Expect(_x op _y, ("%s " #op " %s", #x, #y), ("%p " #er " %p", _x, _y)); \ + PRAGMA_DIAG_POP \ +} while(0) + +#define DoExpectPtrEq(x, y) DoExpectPtr(x, y, ==, !=) +#define DoExpectPtrNE(x, y) DoExpectPtr(x, y, !=, ==) +#define DoExpectPtrGT(x, y) DoExpectPtr(x, y, >, <=) +#define DoExpectPtrLT(x, y) DoExpectPtr(x, y, <, >=) +#define DoExpectPtrGE(x, y) DoExpectPtr(x, y, >=, <) +#define DoExpectPtrLE(x, y) DoExpectPtr(x, y, <=, >) + +#define DoExpectBuf(x, y, z, op, er) do { \ + const byte* _x = (const byte*)(x); \ + const byte* _y = (const byte*)(y); \ + int _z = (int)(z); \ + int _w = ((_x) && (_y)) ? XMEMCMP(_x, _y, _z) : -1; \ + Expect(_w op 0, ("%s " #op " %s for %s", #x, #y, #z), \ + ("\"%p\" " #er " \"%p\" for \"%d\"", _x, _y, _z));\ +} while(0) + +#define DoExpectBufEQ(x, y, z) DoExpectBuf(x, y, z, ==, !=) +#define DoExpectBufNE(x, y, z) DoExpectBuf(x, y, z, !=, ==) void ApiTest_PrintTestCases(void); int ApiTest_RunIdx(int idx); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/utils.h mariadb-10.11.9/extra/wolfssl/wolfssl/tests/utils.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/utils.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/utils.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,443 @@ +/* utils.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#ifndef NO_FILESYSTEM + +#ifdef _MSC_VER +#include +#endif + +#define TMP_DIR_PREFIX "tmpDir-" +/* len is length of tmpDir name, assuming + * len does not include null terminating character */ +char* create_tmp_dir(char *tmpDir, int len) +{ + if (len < (int)XSTR_SIZEOF(TMP_DIR_PREFIX)) + return NULL; + + XMEMCPY(tmpDir, TMP_DIR_PREFIX, XSTR_SIZEOF(TMP_DIR_PREFIX)); + + if (mymktemp(tmpDir, len, len - (int)XSTR_SIZEOF(TMP_DIR_PREFIX)) == NULL) + return NULL; + +#ifdef _MSC_VER + if (_mkdir(tmpDir) != 0) + return NULL; +#elif defined(__MINGW32__) + if (mkdir(tmpDir) != 0) + return NULL; +#else + if (mkdir(tmpDir, 0700) != 0) + return NULL; +#endif + + return tmpDir; +} + +int rem_dir(const char* dirName) +{ +#ifdef _MSC_VER + if (_rmdir(dirName) != 0) + return -1; +#else + if (rmdir(dirName) != 0) + return -1; +#endif + return 0; +} + +int rem_file(const char* fileName) +{ +#ifdef _MSC_VER + if (_unlink(fileName) != 0) + return -1; +#else + if (unlink(fileName) != 0) + return -1; +#endif + return 0; +} + +int copy_file(const char* in, const char* out) +{ + byte buf[100]; + XFILE inFile = XBADFILE; + XFILE outFile = XBADFILE; + size_t sz; + int ret = -1; + + inFile = XFOPEN(in, "rb"); + if (inFile == XBADFILE) + goto cleanup; + + outFile = XFOPEN(out, "wb"); + if (outFile == XBADFILE) + goto cleanup; + + while ((sz = XFREAD(buf, 1, sizeof(buf), inFile)) != 0) { + if (XFERROR(inFile)) + goto cleanup; + if (XFWRITE(buf, 1, sz, outFile) != sz) + goto cleanup; + if (XFEOF(inFile)) + break; + } + + ret = 0; +cleanup: + if (inFile != XBADFILE) + XFCLOSE(inFile); + if (outFile != XBADFILE) + XFCLOSE(outFile); + return ret; +} + +#if defined(__MACH__) || defined(__FreeBSD__) +int link_file(const char* in, const char* out) +{ + return link(in, out); +} +#endif +#endif /* !NO_FILESYSTEM */ + +#if !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && !defined(NO_RSA) && \ + !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) + +/* This set of memio functions allows for more fine tuned control of the TLS + * connection operations. For new tests, try to use ssl_memio first. */ + +/* To dump the memory in gdb use + * dump memory client.bin test_ctx.c_buff test_ctx.c_buff+test_ctx.c_len + * dump memory server.bin test_ctx.s_buff test_ctx.s_buff+test_ctx.s_len + * This can be imported into Wireshark by transforming the file with + * od -Ax -tx1 -v client.bin > client.bin.hex + * od -Ax -tx1 -v server.bin > server.bin.hex + * And then loading test_output.dump.hex into Wireshark using the + * "Import from Hex Dump..." option ion and selecting the TCP + * encapsulation option. + */ + +#define HAVE_MANUAL_MEMIO_TESTS_DEPENDENCIES + +#define TEST_MEMIO_BUF_SZ (64 * 1024) +struct test_memio_ctx +{ + byte c_buff[TEST_MEMIO_BUF_SZ]; + int c_len; + const char* c_ciphers; + byte s_buff[TEST_MEMIO_BUF_SZ]; + int s_len; + const char* s_ciphers; +}; + +int test_memio_do_handshake(WOLFSSL *ssl_c, WOLFSSL *ssl_s, + int max_rounds, int *rounds); +int test_memio_setup(struct test_memio_ctx *ctx, + WOLFSSL_CTX **ctx_c, WOLFSSL_CTX **ctx_s, WOLFSSL **ssl_c, WOLFSSL **ssl_s, + method_provider method_c, method_provider method_s); +int test_memio_setup_ex(struct test_memio_ctx *ctx, + WOLFSSL_CTX **ctx_c, WOLFSSL_CTX **ctx_s, WOLFSSL **ssl_c, WOLFSSL **ssl_s, + method_provider method_c, method_provider method_s, + byte *caCert, int caCertSz, byte *serverCert, int serverCertSz, + byte *serverKey, int serverKeySz); + + +static WC_INLINE int test_memio_write_cb(WOLFSSL *ssl, char *data, int sz, + void *ctx) +{ + struct test_memio_ctx *test_ctx; + byte *buf; + int *len; + + test_ctx = (struct test_memio_ctx*)ctx; + + if (wolfSSL_GetSide(ssl) == WOLFSSL_SERVER_END) { + buf = test_ctx->c_buff; + len = &test_ctx->c_len; + } + else { + buf = test_ctx->s_buff; + len = &test_ctx->s_len; + } + + if ((unsigned)(*len + sz) > TEST_MEMIO_BUF_SZ) + return WOLFSSL_CBIO_ERR_WANT_WRITE; + +#ifdef WOLFSSL_DUMP_MEMIO_STREAM + { + WOLFSSL_BIO *dump_file = wolfSSL_BIO_new_file("test_memio.dump", "a"); + if (dump_file != NULL) { + (void)wolfSSL_BIO_write(dump_file, data, sz); + wolfSSL_BIO_free(dump_file); + } + } +#endif + XMEMCPY(buf + *len, data, (size_t)sz); + *len += sz; + + return sz; +} + +static WC_INLINE int test_memio_read_cb(WOLFSSL *ssl, char *data, int sz, + void *ctx) +{ + struct test_memio_ctx *test_ctx; + int read_sz; + byte *buf; + int *len; + + test_ctx = (struct test_memio_ctx*)ctx; + + if (wolfSSL_GetSide(ssl) == WOLFSSL_SERVER_END) { + buf = test_ctx->s_buff; + len = &test_ctx->s_len; + } + else { + buf = test_ctx->c_buff; + len = &test_ctx->c_len; + } + + if (*len == 0) + return WOLFSSL_CBIO_ERR_WANT_READ; + + read_sz = sz < *len ? sz : *len; + + XMEMCPY(data, buf, (size_t)read_sz); + XMEMMOVE(buf, buf + read_sz,(size_t) (*len - read_sz)); + + *len -= read_sz; + + return read_sz; +} + +int test_memio_do_handshake(WOLFSSL *ssl_c, WOLFSSL *ssl_s, + int max_rounds, int *rounds) +{ + byte handshake_complete = 0, hs_c = 0, hs_s = 0; + int ret, err; + + if (rounds != NULL) + *rounds = 0; + while (!handshake_complete && max_rounds > 0) { + if (!hs_c) { + wolfSSL_SetLoggingPrefix("client"); + ret = wolfSSL_connect(ssl_c); + wolfSSL_SetLoggingPrefix(NULL); + if (ret == WOLFSSL_SUCCESS) { + hs_c = 1; + } + else { + err = wolfSSL_get_error(ssl_c, ret); + if (err != WOLFSSL_ERROR_WANT_READ && + err != WOLFSSL_ERROR_WANT_WRITE) + return -1; + } + } + if (!hs_s) { + wolfSSL_SetLoggingPrefix("server"); + ret = wolfSSL_accept(ssl_s); + wolfSSL_SetLoggingPrefix(NULL); + if (ret == WOLFSSL_SUCCESS) { + hs_s = 1; + } + else { + err = wolfSSL_get_error(ssl_s, ret); + if (err != WOLFSSL_ERROR_WANT_READ && + err != WOLFSSL_ERROR_WANT_WRITE) + return -1; + } + } + handshake_complete = hs_c && hs_s; + max_rounds--; + if (rounds != NULL) + *rounds = *rounds + 1; + } + + if (!handshake_complete) + return -1; + + return 0; +} + +int test_memio_setup_ex(struct test_memio_ctx *ctx, + WOLFSSL_CTX **ctx_c, WOLFSSL_CTX **ctx_s, WOLFSSL **ssl_c, WOLFSSL **ssl_s, + method_provider method_c, method_provider method_s, + byte *caCert, int caCertSz, byte *serverCert, int serverCertSz, + byte *serverKey, int serverKeySz) +{ + int ret; + (void)caCert; + (void)caCertSz; + (void)serverCert; + (void)serverCertSz; + (void)serverKey; + (void)serverKeySz; + + if (ctx_c != NULL && *ctx_c == NULL) { + *ctx_c = wolfSSL_CTX_new(method_c()); + if (*ctx_c == NULL) + return -1; +#ifndef NO_CERTS + if (caCert == NULL) { + ret = wolfSSL_CTX_load_verify_locations(*ctx_c, caCertFile, 0); + } + else { + ret = wolfSSL_CTX_load_verify_buffer(*ctx_c, caCert, (long)caCertSz, + WOLFSSL_FILETYPE_ASN1); + } + if (ret != WOLFSSL_SUCCESS) + return -1; +#endif /* NO_CERTS */ + wolfSSL_SetIORecv(*ctx_c, test_memio_read_cb); + wolfSSL_SetIOSend(*ctx_c, test_memio_write_cb); + if (ctx->c_ciphers != NULL) { + ret = wolfSSL_CTX_set_cipher_list(*ctx_c, ctx->c_ciphers); + if (ret != WOLFSSL_SUCCESS) + return -1; + } + } + + if (ctx_s != NULL && *ctx_s == NULL) { + *ctx_s = wolfSSL_CTX_new(method_s()); + if (*ctx_s == NULL) + return -1; +#ifndef NO_CERTS + if (serverKey == NULL) { + ret = wolfSSL_CTX_use_PrivateKey_file(*ctx_s, svrKeyFile, + WOLFSSL_FILETYPE_PEM); + } + else { + ret = wolfSSL_CTX_use_PrivateKey_buffer(*ctx_s, serverKey, + (long)serverKeySz, WOLFSSL_FILETYPE_ASN1); + } + if (ret != WOLFSSL_SUCCESS) + return- -1; + + if (serverCert == NULL) { + ret = wolfSSL_CTX_use_certificate_file(*ctx_s, svrCertFile, + WOLFSSL_FILETYPE_PEM); + } + else { + ret = wolfSSL_CTX_use_certificate_chain_buffer_format(*ctx_s, + serverCert, (long)serverCertSz, WOLFSSL_FILETYPE_ASN1); + } + if (ret != WOLFSSL_SUCCESS) + return -1; +#endif /* NO_CERTS */ + wolfSSL_SetIORecv(*ctx_s, test_memio_read_cb); + wolfSSL_SetIOSend(*ctx_s, test_memio_write_cb); + if (ctx->s_ciphers != NULL) { + ret = wolfSSL_CTX_set_cipher_list(*ctx_s, ctx->s_ciphers); + if (ret != WOLFSSL_SUCCESS) + return -1; + } + } + + if (ctx_c != NULL && ssl_c != NULL) { + *ssl_c = wolfSSL_new(*ctx_c); + if (*ssl_c == NULL) + return -1; + wolfSSL_SetIOWriteCtx(*ssl_c, ctx); + wolfSSL_SetIOReadCtx(*ssl_c, ctx); + } + if (ctx_s != NULL && ssl_s != NULL) { + *ssl_s = wolfSSL_new(*ctx_s); + if (*ssl_s == NULL) + return -1; + wolfSSL_SetIOWriteCtx(*ssl_s, ctx); + wolfSSL_SetIOReadCtx(*ssl_s, ctx); +#if !defined(NO_DH) + SetDH(*ssl_s); +#endif + } + + return 0; +} + +int test_memio_setup(struct test_memio_ctx *ctx, + WOLFSSL_CTX **ctx_c, WOLFSSL_CTX **ctx_s, WOLFSSL **ssl_c, WOLFSSL **ssl_s, + method_provider method_c, method_provider method_s) +{ + return test_memio_setup_ex(ctx, ctx_c, ctx_s, ssl_c, ssl_s, method_c, + method_s, NULL, 0, NULL, 0, NULL, 0); +} +#endif + +#if !defined(SINGLE_THREADED) && defined(WOLFSSL_COND) +void signal_ready(tcp_ready* ready) +{ + THREAD_CHECK_RET(wolfSSL_CondStart(&ready->cond)); + ready->ready = 1; + THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&ready->cond)); +} +#endif + +void wait_tcp_ready(func_args* args) +{ +#if !defined(SINGLE_THREADED) && defined(WOLFSSL_COND) + tcp_ready* ready = args->signal; + THREAD_CHECK_RET(wolfSSL_CondStart(&ready->cond)); + if (!ready->ready) { + THREAD_CHECK_RET(wolfSSL_CondWait(&ready->cond)); + } + ready->ready = 0; /* reset */ + THREAD_CHECK_RET(wolfSSL_CondEnd(&ready->cond)); +#else + /* no threading wait or single threaded */ + (void)args; +#endif +} + +#ifndef SINGLE_THREADED +/* Start a thread. + * + * @param [in] fun Function to execute in thread. + * @param [in] args Object to send to function in thread. + * @param [out] thread Handle to thread. + */ +void start_thread(THREAD_CB fun, func_args* args, THREAD_TYPE* thread) +{ + THREAD_CHECK_RET(wolfSSL_NewThread(thread, fun, args)); +} + + +/* Join thread to wait for completion. + * + * @param [in] thread Handle to thread. + */ +void join_thread(THREAD_TYPE thread) +{ + THREAD_CHECK_RET(wolfSSL_JoinThread(thread)); +} +#endif /* SINGLE_THREADED */ + +/* These correspond to WOLFSSL_SSLV3...WOLFSSL_DTLSV1_3 */ +const char* tls_desc[] = { + "SSLv3", "TLSv1.0", "TLSv1.1", "TLSv1.2", "TLSv1.3", + "DTLSv1.0", "DTLSv1.2", "DTLSv1.3" +}; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/tests/w64wrapper.c mariadb-10.11.9/extra/wolfssl/wolfssl/tests/w64wrapper.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/tests/w64wrapper.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/tests/w64wrapper.c 2024-08-03 07:30:00.000000000 +0000 @@ -41,7 +41,7 @@ a = w64From32(0x01020304, 0x05060708); #if defined(WORD64_AVAILABLE) && !defined(WOLFSSL_W64_WRAPPER_TEST) - if (a.n != 0x0102030405060708) + if (a.n != 0x0102030405060708LL) return -1; #else if (a.n[0] != 0x01020304 || a.n[1] != 0x05060708) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/testsuite/testsuite.c mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/testsuite/testsuite.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.c 2024-08-03 07:30:00.000000000 +0000 @@ -25,6 +25,7 @@ #endif #include +#include #include #include @@ -44,6 +45,7 @@ #include #include +#include "tests/utils.h" #ifndef NO_SHA256 void file_test(const char* file, byte* check); @@ -57,6 +59,10 @@ static void simple_test(func_args *args); #endif static int test_tls(func_args* server_args); +#if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && \ + defined(HAVE_CRL) && defined(HAVE_CRL_MONITOR) +static int test_crl_monitor(void); +#endif static void show_ciphers(void); static void cleanup_output(void); static int validate_cleanup_output(void); @@ -214,6 +220,16 @@ cleanup_output(); return server_args.return_code; } + +#if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && \ + defined(HAVE_CRL) && defined(HAVE_CRL_MONITOR) + ret = test_crl_monitor(); + if (ret != 0) { + cleanup_output(); + return ret; + } +#endif + #endif /* !NETOS */ show_ciphers(); @@ -247,6 +263,148 @@ } #if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && \ + defined(HAVE_CRL) && defined(HAVE_CRL_MONITOR) +#define CRL_MONITOR_TEST_ROUNDS 6 +#define CRL_MONITOR_REM_FILE_ATTEMPTS 20 + +static int test_crl_monitor(void) +{ + func_args server_args; + func_args client_args; + THREAD_TYPE serverThread; + tcp_ready ready; + char buf[128]; + char tmpDir[16]; + char rounds[4]; + char portNum[8]; + const char* serverArgv[] = { + "testsuite", + "-A", "certs/ca-cert.pem", + "--crl-dir", tmpDir, + "-C", rounds, + "--quieter", + "-x", + "-p", "0" + }; + const char* clientArgv[] = { + "testsuite", + "-C", + "-c", "certs/server-cert.pem", + "-k", "certs/server-key.pem", + "--quieter", + "-H", "exitWithRet", + "-p", portNum + }; + int ret = -1; + int i = -1, j; + + printf("\nRunning CRL monitor test\n"); + + sprintf(rounds, "%d", CRL_MONITOR_TEST_ROUNDS); + + XMEMSET(&server_args, 0, sizeof(func_args)); + XMEMSET(&client_args, 0, sizeof(func_args)); + + /* Create temp dir */ + if (create_tmp_dir(tmpDir, sizeof(tmpDir) - 1) == NULL) { + fprintf(stderr, "Failed to create tmp dir"); + goto cleanup; + } + + server_args.argv = (char**)serverArgv; + server_args.argc = sizeof(serverArgv) / sizeof(*serverArgv); + client_args.signal = server_args.signal = &ready; + client_args.argv = (char**)clientArgv; + client_args.argc = sizeof(clientArgv) / sizeof(*clientArgv); + + InitTcpReady(&ready); + start_thread(server_test, &server_args, &serverThread); + wait_tcp_ready(&server_args); + sprintf(portNum, "%d", server_args.signal->port); + + for (i = 0; i < CRL_MONITOR_TEST_ROUNDS; i++) { + int expectFail; + if (i % 2 == 0) { + /* succeed on even rounds */ + sprintf(buf, "%s/%s", tmpDir, "crl.pem"); + if (STAGE_FILE("certs/crl/crl.pem", buf) != 0) { + fprintf(stderr, "[%d] Failed to copy file to %s\n", i, buf); + goto cleanup; + } + sprintf(buf, "%s/%s", tmpDir, "crl.revoked"); + /* The monitor can be holding the file handle and this will cause + * the remove call to fail. Let's give the monitor a some time to + * finish up. */ + for (j = 0; j < CRL_MONITOR_REM_FILE_ATTEMPTS; j++) { + /* i == 0 since there is nothing to delete in the first round */ + if (i == 0 || rem_file(buf) == 0) + break; + XSLEEP_MS(100); + } + if (j == CRL_MONITOR_REM_FILE_ATTEMPTS) { + fprintf(stderr, "[%d] Failed to remove file %s\n", i, buf); + goto cleanup; + } + expectFail = 0; + } + else { + /* fail on odd rounds */ + sprintf(buf, "%s/%s", tmpDir, "crl.revoked"); + if (STAGE_FILE("certs/crl/crl.revoked", buf) != 0) { + fprintf(stderr, "[%d] Failed to copy file to %s\n", i, buf); + goto cleanup; + } + sprintf(buf, "%s/%s", tmpDir, "crl.pem"); + /* The monitor can be holding the file handle and this will cause + * the remove call to fail. Let's give the monitor a some time to + * finish up. */ + for (j = 0; j < CRL_MONITOR_REM_FILE_ATTEMPTS; j++) { + if (rem_file(buf) == 0) + break; + XSLEEP_MS(100); + } + if (j == CRL_MONITOR_REM_FILE_ATTEMPTS) { + fprintf(stderr, "[%d] Failed to remove file %s\n", i, buf); + goto cleanup; + } + expectFail = 1; + } + /* Give server a moment to register the file change */ + XSLEEP_MS(100); + + client_args.return_code = 0; + client_test(&client_args); + + if (!expectFail) { + if (client_args.return_code != 0) { + fprintf(stderr, "[%d] Incorrect return %d\n", i, + client_args.return_code); + goto cleanup; + } + } + else { + if (client_args.return_code == 0) { + fprintf(stderr, "[%d] Expected failure\n", i); + goto cleanup; + } + } + } + + join_thread(serverThread); + ret = 0; +cleanup: + if (ret != 0 && i >= 0) + fprintf(stderr, "test_crl_monitor failed on iteration %d\n", i); + sprintf(buf, "%s/%s", tmpDir, "crl.pem"); + rem_file(buf); + sprintf(buf, "%s/%s", tmpDir, "crl.revoked"); + rem_file(buf); + (void)rem_dir(tmpDir); + return ret; +} +#endif + +#if !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT) && \ (!defined(WOLF_CRYPTO_CB_ONLY_RSA) && !defined(WOLF_CRYPTO_CB_ONLY_ECC)) /* Perform a basic TLS handshake. * @@ -263,6 +421,8 @@ char* myArgv[NUMARGS]; char arg[3][128]; + printf("\nRunning TLS test\n"); + /* Set up command line arguments for echoclient to send input file * and write echoed data to temporary output file. */ myArgv[0] = arg[0]; @@ -374,6 +534,8 @@ char *cliArgv[NUMARGS]; char argvc[3][32]; + printf("\nRunning simple test\n"); + for (i = 0; i < 9; i++) svrArgv[i] = argvs[i]; for (i = 0; i < 3; i++) @@ -424,149 +586,11 @@ } #endif /* !NO_WOLFSSL_SERVER && !NO_WOLFSSL_CLIENT */ - -/* Wait for the server to be ready for a connection. - * - * @param [in] args Object to send to thread. - */ -void wait_tcp_ready(func_args* args) -{ -#if defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_mutex_lock(&args->signal->mutex)); - - if (!args->signal->ready) - PTHREAD_CHECK_RET(pthread_cond_wait(&args->signal->cond, - &args->signal->mutex)); - args->signal->ready = 0; /* reset */ - - PTHREAD_CHECK_RET(pthread_mutex_unlock(&args->signal->mutex)); -#elif defined(NETOS) - (void)tx_mutex_get(&args->signal->mutex, TX_WAIT_FOREVER); - - /* TODO: - * if (!args->signal->ready) - * pthread_cond_wait(&args->signal->cond, &args->signal->mutex); - * args->signal->ready = 0; */ - - (void)tx_mutex_put(&args->signal->mutex); -#elif defined(USE_WINDOWS_API) - /* Give peer a moment to get running */ - #if defined(__MINGW32__) || defined(__MINGW64__) - Sleep(500); - #else - _sleep(500); - #endif - (void)args; -#else - (void)args; -#endif -} - - -/* Start a thread. - * - * @param [in] fun Function to executre in thread. - * @param [in] args Object to send to function in thread. - * @param [out] thread Handle to thread. - */ -void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread) -{ -#if defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_create(thread, 0, fun, args)); - return; -#elif defined(WOLFSSL_TIRTOS) - /* Initialize the defaults and set the parameters. */ - Task_Params taskParams; - Task_Params_init(&taskParams); - taskParams.arg0 = (UArg)args; - taskParams.stackSize = 65535; - *thread = Task_create((Task_FuncPtr)fun, &taskParams, NULL); - if (*thread == NULL) { - printf("Failed to create new Task\n"); - } - Task_yield(); -#elif defined(NETOS) - /* This can be adjusted by defining in user_settings.h, will default to 65k - * in the event it is undefined */ - #ifndef TESTSUITE_THREAD_STACK_SZ - #define TESTSUITE_THREAD_STACK_SZ 65535 - #endif - int result; - static void * TestSuiteThreadStack = NULL; - - /* Assume only one additional thread is created concurrently. */ - if (TestSuiteThreadStack == NULL) - { - TestSuiteThreadStack = (void *)malloc(TESTSUITE_THREAD_STACK_SZ); - if (TestSuiteThreadStack == NULL) - { - printf ("Stack allocation failure.\n"); - return; - } - } - - memset (thread, 0, sizeof *thread); - - /* first create the idle thread: - * ARGS: - * Param1: pointer to thread - * Param2: name - * Param3 and 4: entry function and input - * Param5: pointer to thread stack - * Param6: stack size - * Param7 and 8: priority level and preempt threshold - * Param9 and 10: time slice and auto-start indicator */ - result = tx_thread_create(thread, - "WolfSSL TestSuiteThread", - (entry_functionType)fun, (ULONG)args, - TestSuiteThreadStack, - TESTSUITE_THREAD_STACK_SZ, - 2, 2, - 1, TX_AUTO_START); - if (result != TX_SUCCESS) - { - printf("Ethernet Bypass Application: failed to create idle thread!\n"); - } - -#else - *thread = (THREAD_TYPE)_beginthreadex(0, 0, fun, args, 0, 0); -#endif -} - - -/* Join thread to wait for completion. - * - * @param [in] thread Handle to thread. - */ -void join_thread(THREAD_TYPE thread) -{ -#if defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_join(thread, 0)); -#elif defined(WOLFSSL_TIRTOS) - while(1) { - if (Task_getMode(thread) == Task_Mode_TERMINATED) { - Task_sleep(5); - break; - } - Task_yield(); - } -#elif defined(NETOS) - /* TODO: */ -#else - int res = WaitForSingleObject((HANDLE)thread, INFINITE); - assert(res == WAIT_OBJECT_0); - res = CloseHandle((HANDLE)thread); - assert(res); - (void)res; /* Suppress un-used variable warning */ -#endif -} - - #ifndef NO_SHA256 /* Create SHA-256 hash of the file based on filename. * * @param [in] file Name of file. - * @parma [out] check Buffer to hold SHA-256 hash. + * @param [out] check Buffer to hold SHA-256 hash. */ void file_test(const char* file, byte* check) { @@ -586,12 +610,19 @@ return; } while( ( i = (int)fread(buf, 1, sizeof(buf), f )) > 0 ) { - ret = wc_Sha256Update(&sha256, buf, i); + if (ferror(f)) { + printf("I/O error reading %s\n", file); + fclose(f); + return; + } + ret = wc_Sha256Update(&sha256, buf, (word32)i); if (ret != 0) { printf("Can't wc_Sha256Update %d\n", ret); fclose(f); return; } + if (feof(f)) + break; } ret = wc_Sha256Final(&sha256, shasum); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/testsuite/testsuite.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/testsuite/testsuite.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.vcproj 2024-08-03 07:30:00.000000000 +0000 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../;../IDE/WIN" - PreprocessorDefinitions="NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -117,7 +117,7 @@ Optimization="2" EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="../;../IDE/WIN" - PreprocessorDefinitions="NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/testsuite/testsuite.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/testsuite/testsuite.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/testsuite/testsuite.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -159,7 +159,7 @@ Disabled ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -179,7 +179,7 @@ Disabled ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -200,7 +200,7 @@ Disabled ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -218,7 +218,7 @@ Disabled ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -237,7 +237,7 @@ MaxSpeed true ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -259,7 +259,7 @@ MaxSpeed true ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -281,7 +281,7 @@ MaxSpeed true ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -302,7 +302,7 @@ MaxSpeed true ../;../IDE/WIN;%(AdditionalIncludeDirectories) - NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) + NO_MAIN_DRIVER;WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;WOLFSSL_DLL;%(PreprocessorDefinitions) MultiThreadedDLL true diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* benchmark.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -22,48 +22,263 @@ /* wolfCrypt benchmark */ +/* Some common, optional build settings: + * these can also be set in wolfssl/options.h or user_settings.h + * ------------------------------------------------------------- + * make the binary always use CSV format: + * WOLFSSL_BENCHMARK_FIXED_CSV + * + * choose to use the same units, regardless of scale. pick 1: + * WOLFSSL_BENCHMARK_FIXED_UNITS_GB + * WOLFSSL_BENCHMARK_FIXED_UNITS_MB + * WOLFSSL_BENCHMARK_FIXED_UNITS_KB + * WOLFSSL_BENCHMARK_FIXED_UNITS_B + * + * when the output should be in machine-parseable format: + * GENERATE_MACHINE_PARSEABLE_REPORT + * + * use microseconds as the unit of time: + * BENCH_MICROSECOND + * + * display mean, max, min and sd of operation durations: + * MULTI_VALUE_STATISTICS + * + * Enable tracking of the stats into an allocated linked list: + * (use -print to display results): + * WC_BENCH_TRACK_STATS + * + * set the default devId for cryptocb to the value instead of INVALID_DEVID + * WC_USE_DEVID=0x1234 + * + * Turn on benchmark timing debugging (CPU Cycles, RTOS ticks, etc) + * DEBUG_WOLFSSL_BENCHMARK_TIMING + * + * Turn on timer debugging (used when CPU cycles not available) + * WOLFSSL_BENCHMARK_TIMER_DEBUG + */ #ifdef HAVE_CONFIG_H #include #endif -/* Some common, optional user settings */ -/* these can also be set in wolfssl/options.h or user_settings.h */ -/* ------------------------------------------------------------- */ -/* make the binary always use CSV format: */ -/* #define WOLFSSL_BENCHMARK_FIXED_CSV */ -/* */ -/* choose to use the same units, regardless of scale. pick 1: */ -/* #define WOLFSSL_BENCHMARK_FIXED_UNITS_GB */ -/* #define WOLFSSL_BENCHMARK_FIXED_UNITS_MB */ -/* #define WOLFSSL_BENCHMARK_FIXED_UNITS_KB */ -/* #define WOLFSSL_BENCHMARK_FIXED_UNITS_B */ -/* */ -/* when the output should be in machine-parseable format: */ -/* #define GENERATE_MACHINE_PARSEABLE_REPORT */ -/* */ - -/* define the max length for each string of metric reported */ -#define __BENCHMARK_MAXIMUM_LINE_LENGTH 150 - -/* some internal helpers to get values of settings */ -/* this first one gets the text name of the #define parameter */ -#define __BENCHMARK_VALUE_TO_STRING(x) #x - -/* this next one gets the text value of the assigned value of #define param */ -#define __BENCHMARK_VALUE(x) __BENCHMARK_VALUE_TO_STRING(x) - -#define WOLFSSL_FIXED_UNITS_PER_SEC "MB/s" /* may be re-set by fixed units */ - #ifndef WOLFSSL_USER_SETTINGS #include #endif #include /* also picks up user_settings.h */ + +/* Macro to disable benchmark */ +#ifndef NO_CRYPT_BENCHMARK + +#define WC_ALLOC_DO_ON_FAILURE() do { printf("out of memory at benchmark.c L %d\n", __LINE__); ret = MEMORY_E; goto exit; } while (0) + #include -#include #include -#include #include +#include +#include +#include +#include +#include + +#ifdef WOLFSSL_LINUXKM + /* remap current_time() -- collides with a function in kernel linux/fs.h */ + #define current_time benchmark_current_time +#endif /* WOLFSSL_LINUXKM */ + +#ifdef HAVE_CHACHA + #include +#endif +#ifdef HAVE_POLY1305 + #include +#endif +#if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) + #include +#endif +#ifndef NO_AES + #include +#endif +#ifdef HAVE_CAMELLIA + #include +#endif +#ifdef WOLFSSL_SM4 + #include +#endif +#ifndef NO_MD5 + #include +#endif +#ifndef NO_SHA + #include +#endif +#ifndef NO_SHA256 + #include +#endif +#if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) + #include +#endif +#ifdef WOLFSSL_SHA3 + #include +#endif +#ifdef WOLFSSL_SM3 + #include +#endif +#ifndef NO_RSA + #include +#endif +#ifdef WOLFSSL_RIPEMD + #include +#endif +#ifdef WOLFSSL_CMAC + #include +#endif +#ifndef NO_DH + #include +#endif +#ifndef NO_DES3 + #include +#endif +#ifndef NO_RC4 + #include +#endif +#ifndef NO_HMAC + #include +#endif +#ifdef WOLFSSL_SIPHASH + #include +#endif + #include +#ifndef NO_PWDBASED + #include +#endif +#ifdef HAVE_ECC + #include +#endif +#ifdef WOLFSSL_SM2 + #include +#endif +#ifdef HAVE_CURVE25519 + #include +#endif +#ifdef HAVE_ED25519 + #include +#endif +#ifdef HAVE_CURVE448 + #include +#endif +#ifdef HAVE_ED448 + #include +#endif +#ifdef WOLFSSL_HAVE_KYBER + #include + #ifdef WOLFSSL_WC_KYBER + #include + #endif + #if defined(HAVE_LIBOQS) || defined(HAVE_PQM4) + #include + #endif +#endif +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) + #include + #ifdef HAVE_LIBLMS + #include + #else + #include + #endif +#endif +#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY) + #include + #ifdef HAVE_LIBXMSS + #include + #else + #include + #endif +#endif +#ifdef WOLFCRYPT_HAVE_ECCSI + #include +#endif +#ifdef WOLFCRYPT_HAVE_SAKKE + #include +#endif + +#if defined(HAVE_FALCON) + #include +#endif +#if defined(HAVE_DILITHIUM) + #include +#endif +#if defined(HAVE_SPHINCS) + #include +#endif + +#ifdef WOLF_CRYPTO_CB + #include + #ifdef HAVE_INTEL_QA_SYNC + #include + #endif + #ifdef HAVE_CAVIUM_OCTEON_SYNC + #include + #endif + #ifdef HAVE_RENESAS_SYNC + #include + #endif +#endif + +#ifdef WOLFSSL_ASYNC_CRYPT + #include +#endif + +#ifdef USE_FLAT_BENCHMARK_H + #include "benchmark.h" +#else + #include "wolfcrypt/benchmark/benchmark.h" +#endif + +/* define the max length for each string of metric reported */ +#ifndef WC_BENCH_MAX_LINE_LEN +#define WC_BENCH_MAX_LINE_LEN 150 +#endif + +/* default units per second. See WOLFSSL_BENCHMARK_FIXED_UNITS_* to change */ +#define WOLFSSL_FIXED_UNIT "MB" /* may be re-set by fixed units */ +#define MILLION_VALUE 1000000.0 + +#ifdef BENCH_MICROSECOND + #define WOLFSSL_FIXED_TIME_UNIT "μs" + #define WOLFSSL_BENCHMARK_FIXED_UNITS_KB +#else + #define WOLFSSL_FIXED_TIME_UNIT "s" +#endif + +#ifdef MULTI_VALUE_STATISTICS + #define STATS_CLAUSE_SEPARATOR "" + #define DECLARE_MULTI_VALUE_STATS_VARS() double max = 0, min = 0, sum = 0,\ + squareSum = 0, prev = 0, delta;\ + int runs = 0; + #define RECORD_MULTI_VALUE_STATS() if (runs == 0) {\ + delta = current_time(0) - start;\ + min = delta;\ + max = delta;\ + }\ + else {\ + delta = current_time(0) - prev;\ + }\ + if (max < delta)\ + max = delta;\ + else if (min > delta)\ + min = delta;\ + sum += delta;\ + squareSum += delta * delta;\ + runs++;\ + prev = current_time(0) + #define RESET_MULTI_VALUE_STATS_VARS() prev = 0;\ + runs = 0;\ + sum = 0;\ + squareSum = 0 +#else + #define STATS_CLAUSE_SEPARATOR "\n" + #define DECLARE_MULTI_VALUE_STATS_VARS() + #define RECORD_MULTI_VALUE_STATS() WC_DO_NOTHING + #define RESET_MULTI_VALUE_STATS_VARS() WC_DO_NOTHING +#endif #ifdef WOLFSSL_NO_FLOAT_FMT #define FLT_FMT "%0ld,%09lu" @@ -92,30 +307,79 @@ #define FLT_FMT_ARGS(x) x #define FLT_FMT_PREC_ARGS(p, x) p, x #define FLT_FMT_PREC2_ARGS(w, p, x) w, p, x -#endif +#endif /* WOLFSSL_NO_FLOAT_FMT */ #ifdef WOLFSSL_ESPIDF - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + #include + + /* Benchmark uses 64 bit integer formatting support. When new nanolib is + * enabled, all if the values in report are blank. */ + #ifdef CONFIG_NEWLIB_NANO_FORMAT + #if CONFIG_NEWLIB_NANO_FORMAT == 1 + #error "Nano newlib formatting must not be enabled for benchmark" + #endif + #endif + + #ifdef configTICK_RATE_HZ + /* Define CPU clock cycles per tick of FreeRTOS clock + * CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ is typically a value like 240 + * configTICK_RATE_HZ is typically 100 or 1000. + **/ + #if defined(CONFIG_IDF_TARGET_ESP8266) + #ifndef CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ + #define CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ \ + CONFIG_ESP8266_DEFAULT_CPU_FREQ_MHZ + #endif + #ifndef CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ + #define CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ configCPU_CLOCK_HZ + #endif + #endif + #define CPU_TICK_CYCLES ( \ + (CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ * MILLION_VALUE) \ + / configTICK_RATE_HZ \ + ) + #endif /* WOLFSSL_ESPIDF configTICK_RATE_HZ */ + + #if defined(CONFIG_IDF_TARGET_ESP32C2) #include "driver/gptimer.h" static gptimer_handle_t esp_gptimer = NULL; static gptimer_config_t esp_timer_config = { .clk_src = GPTIMER_CLK_SRC_DEFAULT, .direction = GPTIMER_COUNT_UP, - .resolution_hz = CONFIG_XTAL_FREQ * 1000000, + .resolution_hz = CONFIG_XTAL_FREQ * 100000, }; + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + #include + #include "driver/gptimer.h" + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + #define RESOLUTION_SCALE 100 + static gptimer_handle_t esp_gptimer = NULL; + static gptimer_config_t esp_timer_config = { + .clk_src = GPTIMER_CLK_SRC_DEFAULT, + .direction = GPTIMER_COUNT_UP, + /* CONFIG_XTAL_FREQ = 40, + * CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ = 160 */ + .resolution_hz = CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ * + (MILLION_VALUE / RESOLUTION_SCALE), + }; + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ + #elif defined(CONFIG_IDF_TARGET_ESP32) || \ defined(CONFIG_IDF_TARGET_ESP32S2) || \ defined(CONFIG_IDF_TARGET_ESP32S3) #include + #elif defined(CONFIG_IDF_TARGET_ESP8266) + /* no CPU HAL for ESP8266, we'll use RTOS tick calc estimates */ + #include + #elif defined(CONFIG_IDF_TARGET_ESP32H2) + /* TODO add ESP32-H2 benchmark support */ #else - #error "CONFIG_IDF_TARGET not implemented" + /* Other platform */ #endif #include -#endif +#endif /* WOLFSSL_ESPIDF */ -#ifdef HAVE_PTHREAD - #include -#endif #if defined(HAVE_PTHREAD) || \ (!defined(NO_CRYPT_BENCHMARK) && !defined(NO_STDIO_FILESYSTEM) && \ !defined(NO_ERROR_STRINGS) && !defined(NO_MAIN_DRIVER) && \ @@ -127,28 +391,21 @@ #endif #if defined(WOLFSSL_ZEPHYR) || defined(NO_STDIO_FILESYSTEM) || !defined(XFFLUSH) -/* fflush in Zephyr doesn't work on stdout and stderr. Use - * CONFIG_LOG_MODE_IMMEDIATE compilation option instead. */ -#undef XFFLUSH -#define XFFLUSH(...) do {} while (0) + /* fflush in Zephyr doesn't work on stdout and stderr. Use + * CONFIG_LOG_MODE_IMMEDIATE compilation option instead. */ + #undef XFFLUSH + #define XFFLUSH(...) WC_DO_NOTHING #endif -/* Macro to disable benchmark */ -#ifndef NO_CRYPT_BENCHMARK - +/* only for stack size check */ #include -/* only for stack size check */ -#if defined(WOLFSSL_ASYNC_CRYPT) - #ifndef WC_NO_ASYNC_THREADING - #define WC_ENABLE_BENCH_THREADING - #endif +#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_NO_ASYNC_THREADING) + #define WC_ENABLE_BENCH_THREADING #endif - -#ifdef USE_FLAT_BENCHMARK_H - #include "benchmark.h" -#else - #include "wolfcrypt/benchmark/benchmark.h" +/* enable tracking of stats for threaded benchmark */ +#if defined(WC_ENABLE_BENCH_THREADING) && !defined(WC_BENCH_TRACK_STATS) + #define WC_BENCH_TRACK_STATS #endif #ifdef GENERATE_MACHINE_PARSEABLE_REPORT @@ -189,7 +446,7 @@ static int printfk(const char *fmt, ...) { int ret; - char line[__BENCHMARK_MAXIMUM_LINE_LENGTH]; + char line[WC_BENCH_MAX_LINE_LEN]; va_list ap; va_start(ap, fmt); @@ -243,7 +500,7 @@ #include /* we're using malloc / free direct here */ #endif - #ifndef STRING_USER + #if !defined(STRING_USER) && !defined(NO_STDIO_FILESYSTEM) #include #include #endif @@ -258,98 +515,6 @@ #endif #endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef NO_HMAC - #include -#endif -#ifdef WOLFSSL_SIPHASH - #include -#endif -#ifndef NO_PWDBASED - #include -#endif -#ifdef HAVE_ECC - #include -#endif -#ifdef HAVE_CURVE25519 - #include -#endif -#ifdef HAVE_ED25519 - #include -#endif -#ifdef HAVE_CURVE448 - #include -#endif -#ifdef HAVE_ED448 - #include -#endif -#ifdef WOLFSSL_HAVE_KYBER - #include -#ifdef WOLFSSL_WC_KYBER - #include -#endif -#if defined(HAVE_LIBOQS) || defined(HAVE_PQM4) - #include -#endif -#endif -#ifdef WOLFCRYPT_HAVE_ECCSI - #include -#endif -#ifdef WOLFCRYPT_HAVE_SAKKE - #include -#endif - -#if defined(HAVE_PQC) - #if defined(HAVE_FALCON) - #include - #endif - #if defined(HAVE_DILITHIUM) - #include - #endif - #if defined(HAVE_SPHINCS) - #include - #endif -#endif - -#include -#include -#include -#include - -#ifdef WOLF_CRYPTO_CB - #include - #ifdef HAVE_INTEL_QA_SYNC - #include - #endif - #ifdef HAVE_CAVIUM_OCTEON_SYNC - #include - #endif - #ifdef HAVE_RENESAS_SYNC - #include - #endif -#endif - -#ifdef WOLFSSL_ASYNC_CRYPT - #include -#endif - #ifdef HAVE_FIPS #include @@ -397,14 +562,14 @@ } while(0) #endif -#undef PTHREAD_CHECK_RET -#define PTHREAD_CHECK_RET(...) do { \ - int _pthread_ret = (__VA_ARGS__); \ - if (_pthread_ret != 0) { \ - errno = _pthread_ret; \ +#undef THREAD_CHECK_RET +#define THREAD_CHECK_RET(...) do { \ + int _thread_ret = (__VA_ARGS__); \ + if (_thread_ret != 0) { \ + errno = _thread_ret; \ printf("%s%s L%d error %d for \"%s\"\n", \ err_prefix, __FILE__, __LINE__, \ - _pthread_ret, #__VA_ARGS__); \ + _thread_ret, #__VA_ARGS__); \ XFFLUSH(stdout); \ _exit(1); \ } \ @@ -413,7 +578,7 @@ /* optional macro to add sleep between tests */ #ifndef TEST_SLEEP /* stub the sleep macro */ - #define TEST_SLEEP() + #define TEST_SLEEP() WC_DO_NOTHING #endif #define TEST_STRING "Everyone gets Friday off." @@ -439,6 +604,10 @@ #define BENCH_AES_CFB 0x00010000 #define BENCH_AES_OFB 0x00020000 #define BENCH_AES_SIV 0x00040000 +#define BENCH_SM4_CBC 0x00080000 +#define BENCH_SM4_GCM 0x00100000 +#define BENCH_SM4_CCM 0x00200000 +#define BENCH_SM4 (BENCH_SM4_CBC | BENCH_SM4_GCM | BENCH_SM4_CCM) /* Digest algorithms. */ #define BENCH_MD5 0x00000001 #define BENCH_POLY1305 0x00000002 @@ -461,6 +630,7 @@ #define BENCH_RIPEMD 0x00004000 #define BENCH_BLAKE2B 0x00008000 #define BENCH_BLAKE2S 0x00010000 +#define BENCH_SM3 0x00020000 /* MAC algorithms. */ #define BENCH_CMAC 0x00000001 @@ -476,12 +646,14 @@ #define BENCH_PBKDF2 0x00000100 #define BENCH_SIPHASH 0x00000200 +/* KDF algorithms */ +#define BENCH_SRTP_KDF 0x00000001 + /* Asymmetric algorithms. */ #define BENCH_RSA_KEYGEN 0x00000001 #define BENCH_RSA 0x00000002 #define BENCH_RSA_SZ 0x00000004 #define BENCH_DH 0x00000010 -#define BENCH_KYBER 0x00000020 #define BENCH_ECC_MAKEKEY 0x00001000 #define BENCH_ECC 0x00002000 #define BENCH_ECC_ENCRYPT 0x00004000 @@ -497,6 +669,7 @@ #define BENCH_ECC_P256 0x01000000 #define BENCH_ECC_P384 0x02000000 #define BENCH_ECC_P521 0x04000000 +#define BENCH_SM2 0x08000000 #define BENCH_ECCSI_KEYGEN 0x00000020 #define BENCH_ECCSI_PAIRGEN 0x00000040 #define BENCH_ECCSI_VALIDATE 0x00000080 @@ -507,11 +680,22 @@ #define BENCH_SAKKE 0x80000000 /* Post-Quantum Asymmetric algorithms. */ +#define BENCH_KYBER512 0x00000020 +#define BENCH_KYBER768 0x00000040 +#define BENCH_KYBER1024 0x00000080 +#define BENCH_KYBER (BENCH_KYBER512 | BENCH_KYBER768 | \ + BENCH_KYBER1024) #define BENCH_FALCON_LEVEL1_SIGN 0x00000001 #define BENCH_FALCON_LEVEL5_SIGN 0x00000002 #define BENCH_DILITHIUM_LEVEL2_SIGN 0x04000000 #define BENCH_DILITHIUM_LEVEL3_SIGN 0x08000000 #define BENCH_DILITHIUM_LEVEL5_SIGN 0x10000000 +#define BENCH_ML_DSA_44_SIGN 0x04000000 +#define BENCH_ML_DSA_65_SIGN 0x08000000 +#define BENCH_ML_DSA_87_SIGN 0x10000000 +#define BENCH_ML_DSA_SIGN (BENCH_ML_DSA_44_SIGN | \ + BENCH_ML_DSA_65_SIGN | \ + BENCH_ML_DSA_87_SIGN) /* Post-Quantum Asymmetric algorithms. (Part 2) */ #define BENCH_SPHINCS_FAST_LEVEL1_SIGN 0x00000001 @@ -521,6 +705,24 @@ #define BENCH_SPHINCS_SMALL_LEVEL3_SIGN 0x00000010 #define BENCH_SPHINCS_SMALL_LEVEL5_SIGN 0x00000020 +/* Post-Quantum Stateful Hash-Based sig algorithms. */ +#define BENCH_LMS_HSS 0x00000001 +#define BENCH_XMSS_XMSSMT_SHA256 0x00000002 +#define BENCH_XMSS_XMSSMT_SHA512 0x00000004 +#define BENCH_XMSS_XMSSMT_SHAKE128 0x00000008 +#define BENCH_XMSS_XMSSMT_SHAKE256 0x00000010 +#ifndef NO_SHA256 +#define BENCH_XMSS_XMSSMT BENCH_XMSS_XMSSMT_SHA256 +#elif defined(WOLFSSL_SHA512) +#define BENCH_XMSS_XMSSMT BENCH_XMSS_XMSSMT_SHA512 +#elif defined(WOLFSSL_SHAKE128) +#define BENCH_XMSS_XMSSMT BENCH_XMSS_XMSSMT_SHAKE128 +#elif defined(WOLFSSL_SHAKE256) +#define BENCH_XMSS_XMSSMT BENCH_XMSS_XMSSMT_SHAKE256 +#else +#define BENCH_XMSS_XMSSMT 0x00000000 +#endif + /* Other */ #define BENCH_RNG 0x00000001 #define BENCH_SCRYPT 0x00000002 @@ -540,6 +742,11 @@ #endif #endif +#if (defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY)) || \ + (defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY)) + #define BENCH_PQ_STATEFUL_HBS +#endif + /* Benchmark all compiled in algorithms. * When 1, ignore other benchmark algorithm values. * 0, only benchmark algorithm values set. @@ -551,6 +758,8 @@ static word32 bench_digest_algs = 0; /* MAC algorithms to benchmark. */ static word32 bench_mac_algs = 0; +/* KDF algorithms to benchmark. */ +static word32 bench_kdf_algs = 0; /* Asymmetric algorithms to benchmark. */ static word32 bench_asym_algs = 0; /* Post-Quantum Asymmetric algorithms to benchmark. */ @@ -559,6 +768,8 @@ static word32 bench_pq_asym_algs2 = 0; /* Other cryptographic algorithms to benchmark. */ static word32 bench_other_algs = 0; +/* Post-Quantum Stateful Hash-Based sig algorithms to benchmark. */ +static word32 bench_pq_hash_sig_algs = 0; #if !defined(WOLFSSL_BENCHMARK_ALL) && !defined(NO_MAIN_DRIVER) @@ -613,6 +824,18 @@ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) { "-chacha20-poly1305", BENCH_CHACHA20_POLY1305 }, #endif +#ifdef WOLFSSL_SM4_CBC + { "-sm4-cbc", BENCH_SM4_CBC }, +#endif +#ifdef WOLFSSL_SM4_GCM + { "-sm4-gcm", BENCH_SM4_GCM }, +#endif +#ifdef WOLFSSL_SM4_CCM + { "-sm4-ccm", BENCH_SM4_CCM }, +#endif +#ifdef WOLFSSL_SM4 + { "-sm4", BENCH_SM4 }, +#endif #ifndef NO_DES3 { "-des", BENCH_DES }, #endif @@ -671,6 +894,9 @@ { "-shake256", BENCH_SHAKE256 }, #endif #endif +#ifdef WOLFSSL_SM3 + { "-sm3", BENCH_SM3 }, +#endif #ifdef WOLFSSL_RIPEMD { "-ripemd", BENCH_RIPEMD }, #endif @@ -712,9 +938,18 @@ #ifndef NO_PWDBASED { "-pbkdf2", BENCH_PBKDF2 }, #endif +#endif #ifdef WOLFSSL_SIPHASH { "-siphash", BENCH_SIPHASH }, #endif + { NULL, 0 } +}; + +/* All recognized KDF algorithm choosing command line options. */ +static const bench_alg bench_kdf_opt[] = { + { "-kdf", 0xffffffff }, +#ifdef WC_SRTP_KDF + { "-srtp-kdf", BENCH_SRTP_KDF }, #endif { NULL, 0 } }; @@ -727,14 +962,13 @@ { "-rsa-kg", BENCH_RSA_KEYGEN }, #endif { "-rsa", BENCH_RSA }, + #ifdef WOLFSSL_KEY_GEN { "-rsa-sz", BENCH_RSA_SZ }, + #endif #endif #ifndef NO_DH { "-dh", BENCH_DH }, #endif -#ifdef WOLFSSL_HAVE_KYBER - { "-kyber", BENCH_KYBER }, -#endif #ifdef HAVE_ECC { "-ecc-kg", BENCH_ECC_MAKEKEY }, { "-ecc", BENCH_ECC }, @@ -743,6 +977,9 @@ #endif { "-ecc-all", BENCH_ECC_ALL }, #endif +#ifdef WOLFSSL_SM2 + { "-sm2", BENCH_SM2 }, +#endif #ifdef HAVE_CURVE25519 { "-curve25519-kg", BENCH_CURVE25519_KEYGEN }, #ifdef HAVE_CURVE25519_SHARED_SECRET @@ -794,7 +1031,44 @@ #endif /* !WOLFSSL_BENCHMARK_ALL && !NO_MAIN_DRIVER */ -#if defined(HAVE_PQC) && defined(HAVE_LIBOQS) +#if defined(BENCH_PQ_STATEFUL_HBS) +typedef struct bench_pq_hash_sig_alg { + /* Command line option string. */ + const char* str; + /* Bit values to set. */ + word32 val; +} bench_pq_hash_sig_alg; + +static const bench_pq_hash_sig_alg bench_pq_hash_sig_opt[] = { + { "-pq_hash_sig", 0xffffffff}, +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) + { "-lms_hss", BENCH_LMS_HSS}, +#endif +#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY) + { "-xmss_xmssmt", BENCH_XMSS_XMSSMT}, +#ifdef WC_XMSS_SHA256 + { "-xmss_xmssmt_sha256", BENCH_XMSS_XMSSMT_SHA256}, +#endif +#ifdef WC_XMSS_SHA512 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 + { "-xmss_xmssmt_sha512", BENCH_XMSS_XMSSMT_SHA512}, +#endif +#endif +#ifdef WC_XMSS_SHAKE128 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 + { "-xmss_xmssmt_shake128", BENCH_XMSS_XMSSMT_SHAKE128}, +#endif +#endif +#ifdef WC_XMSS_SHAKE256 + { "-xmss_xmssmt_shake256", BENCH_XMSS_XMSSMT_SHAKE256}, +#endif +#endif + { NULL, 0} +}; +#endif /* BENCH_PQ_STATEFUL_HBS */ + +#if defined(WOLFSSL_HAVE_KYBER) || defined(HAVE_FALCON) || \ + defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS) /* The post-quantum-specific mapping of command line option to bit values and * OQS name. */ typedef struct bench_pq_alg { @@ -802,49 +1076,49 @@ const char* str; /* Bit values to set. */ word32 val; - const char* pqc_name; } bench_pq_alg; /* All recognized post-quantum asymmetric algorithm choosing command line * options. */ static const bench_pq_alg bench_pq_asym_opt[] = { - { "-pq", 0xffffffff, NULL}, -#ifdef HAVE_LIBOQS - { "-falcon_level1", BENCH_FALCON_LEVEL1_SIGN, - OQS_SIG_alg_falcon_512 }, - { "-falcon_level5", BENCH_FALCON_LEVEL5_SIGN, - OQS_SIG_alg_falcon_1024 }, - { "-dilithium_level2", BENCH_DILITHIUM_LEVEL2_SIGN, - OQS_SIG_alg_dilithium_2 }, - { "-dilithium_level3", BENCH_DILITHIUM_LEVEL3_SIGN, - OQS_SIG_alg_dilithium_3 }, - { "-dilithium_level5", BENCH_DILITHIUM_LEVEL5_SIGN, - OQS_SIG_alg_dilithium_5 }, -#endif /* HAVE_LIBOQS */ - { NULL, 0, NULL } + { "-pq", 0xffffffff }, +#ifdef WOLFSSL_HAVE_KYBER + { "-kyber", BENCH_KYBER }, + { "-kyber512", BENCH_KYBER512 }, + { "-kyber768", BENCH_KYBER768 }, + { "-kyber1024", BENCH_KYBER1024 }, +#endif +#if defined(HAVE_FALCON) + { "-falcon_level1", BENCH_FALCON_LEVEL1_SIGN }, + { "-falcon_level5", BENCH_FALCON_LEVEL5_SIGN }, +#endif +#if defined(HAVE_DILITHIUM) + { "-dilithium_level2", BENCH_DILITHIUM_LEVEL2_SIGN }, + { "-dilithium_level3", BENCH_DILITHIUM_LEVEL3_SIGN }, + { "-dilithium_level5", BENCH_DILITHIUM_LEVEL5_SIGN }, + { "-ml-dsa", BENCH_ML_DSA_SIGN }, + { "-ml-dsa-44", BENCH_ML_DSA_44_SIGN }, + { "-ml-dsa-65", BENCH_ML_DSA_65_SIGN }, + { "-ml-dsa-87", BENCH_ML_DSA_87_SIGN }, +#endif + { NULL, 0 } }; -#ifdef HAVE_LIBOQS +#if defined(HAVE_SPHINCS) /* All recognized post-quantum asymmetric algorithm choosing command line * options. (Part 2) */ static const bench_pq_alg bench_pq_asym_opt2[] = { - { "-pq", 0xffffffff, NULL}, - { "-sphincs_fast_level1", BENCH_SPHINCS_FAST_LEVEL1_SIGN, - OQS_SIG_alg_sphincs_shake256_128f_simple }, - { "-sphincs_fast_level3", BENCH_SPHINCS_FAST_LEVEL3_SIGN, - OQS_SIG_alg_sphincs_shake256_192f_simple }, - { "-sphincs_fast_level5", BENCH_SPHINCS_FAST_LEVEL5_SIGN, - OQS_SIG_alg_sphincs_shake256_256f_simple }, - { "-sphincs_small_level1", BENCH_SPHINCS_SMALL_LEVEL1_SIGN, - OQS_SIG_alg_sphincs_shake256_128s_simple }, - { "-sphincs_small_level3", BENCH_SPHINCS_SMALL_LEVEL3_SIGN, - OQS_SIG_alg_sphincs_shake256_192s_simple }, - { "-sphincs_small_level5", BENCH_SPHINCS_SMALL_LEVEL5_SIGN, - OQS_SIG_alg_sphincs_shake256_256s_simple }, - { NULL, 0, NULL } + { "-pq", 0xffffffff }, + { "-sphincs_fast_level1", BENCH_SPHINCS_FAST_LEVEL1_SIGN }, + { "-sphincs_fast_level3", BENCH_SPHINCS_FAST_LEVEL3_SIGN }, + { "-sphincs_fast_level5", BENCH_SPHINCS_FAST_LEVEL5_SIGN }, + { "-sphincs_small_level1", BENCH_SPHINCS_SMALL_LEVEL1_SIGN }, + { "-sphincs_small_level3", BENCH_SPHINCS_SMALL_LEVEL3_SIGN }, + { "-sphincs_small_level5", BENCH_SPHINCS_SMALL_LEVEL5_SIGN }, + { NULL, 0, } }; -#endif /* HAVE_LIBOQS */ -#endif /* HAVE_PQC */ +#endif /* HAVE_SPHINCS */ +#endif #ifdef HAVE_WNR const char* wnrConfigFile = "wnr-example.conf"; @@ -859,9 +1133,10 @@ #ifndef NO_MAIN_DRIVER #ifndef MAIN_NO_ARGS -static const char* bench_Usage_msg1[][21] = { +static const char* bench_Usage_msg1[][25] = { /* 0 English */ - { "-? Help, print this usage\n 0: English, 1: Japanese\n", + { "-? Help, print this usage\n", + " 0: English, 1: Japanese\n", "-csv Print terminal output in csv format\n", "-base10 Display bytes as power of 10 (eg 1 kB = 1000 Bytes)\n", "-no_aad No additional authentication data passed.\n", @@ -881,17 +1156,24 @@ "-p521 Measure ECC using P-521 curve.\n", "-ecc-all Bench all enabled ECC curves.\n", "- Algorithm to benchmark. Available algorithms include:\n", - "-lng Display benchmark result by specified language.\n 0: English, 1: Japanese\n", + ("-lng Display benchmark result by specified language.\n" + " 0: English, 1: Japanese\n" + ), " Size of block in bytes\n", - ("-blocks Number of blocks. Can be used together with the 'Size of block'\n" + ("-blocks Number of blocks. Can be used together with the " + "'Size of block'\n" " option, but must be used after that one.\n" ), "-threads Number of threads to run\n", - "-print Show benchmark stats summary\n" + "-print Show benchmark stats summary\n", + "-hash_input Input data to use for hash benchmarking\n", + "-cipher_input Input data to use for cipher benchmarking\n", + "-min_runs Specify minimum number of operation runs\n" }, #ifndef NO_MULTIBYTE_PRINT /* 1 Japanese */ - { "-? ヘルプ, 使ã„方を表示ã—ã¾ã™ã€‚\n 0: 英語〠1: 日本語\n", + { "-? ヘルプ, 使ã„方を表示ã—ã¾ã™ã€‚\n", + " 0: 英語〠1: 日本語\n", "-csv csv å½¢å¼ã§ç«¯æœ«ã«å‡ºåŠ›ã—ã¾ã™ã€‚\n", "-base10 ãƒã‚¤ãƒˆã‚’10ã®ã¹ãä¹—ã§è¡¨ç¤ºã—ã¾ã™ã€‚(例 1 kB = 1000 Bytes)\n", "-no_aad 追加ã®èªè¨¼ãƒ‡ãƒ¼ã‚¿ã‚’使用ã—ã¾ã›ã‚“.\n", @@ -906,12 +1188,20 @@ "-p384 Measure ECC using P-384 curve.\n", "-p521 Measure ECC using P-521 curve.\n", "-ecc-all Bench all enabled ECC curves.\n", - "- アルゴリズムã®ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚’実施ã—ã¾ã™ã€‚\n 利用å¯èƒ½ãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯ä¸‹è¨˜ã‚’å«ã¿ã¾ã™:\n", - "-lng 指定ã•ã‚ŒãŸè¨€èªžã§ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯çµæžœã‚’表示ã—ã¾ã™ã€‚\n 0: 英語〠1: 日本語\n", + ("- アルゴリズムã®ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚’実施ã—ã¾ã™ã€‚\n" + " 利用å¯èƒ½ãªã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã¯ä¸‹è¨˜ã‚’å«ã¿ã¾ã™:\n" + ), + ("-lng 指定ã•ã‚ŒãŸè¨€èªžã§ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯çµæžœã‚’表示ã—ã¾ã™ã€‚\n" + " 0: 英語〠1: 日本語\n" + ), " ブロックサイズをãƒã‚¤ãƒˆå˜ä½ã§æŒ‡å®šã—ã¾ã™ã€‚\n", "-blocks TBD.\n", "-threads 実行ã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰æ•°\n", - "-print ベンãƒãƒžãƒ¼ã‚¯çµ±è¨ˆã®è¦ç´„を表示ã™ã‚‹\n" + "-print ベンãƒãƒžãƒ¼ã‚¯çµ±è¨ˆã®è¦ç´„を表示ã™ã‚‹\n", + /* TODO: translate below */ + "-hash_input Input data to use for hash benchmarking\n", + "-cipher_input Input data to use for cipher benchmarking\n", + "-min_runs Specify minimum number of operation runs\n" }, #endif }; @@ -919,7 +1209,13 @@ #endif static const char* bench_result_words1[][4] = { - { "took", "seconds" , "Cycles per byte", NULL }, /* 0 English */ + { "took", +#ifdef BENCH_MICROSECOND + "microseconds" +#else + "seconds" +#endif + , "Cycles per byte", NULL }, /* 0 English */ #ifndef NO_MULTIBYTE_PRINT { "ã‚’" , "秒ã§å‡¦ç†", "1ãƒã‚¤ãƒˆã‚ãŸã‚Šã®ã‚µã‚¤ã‚¯ãƒ«æ•°", NULL }, /* 1 Japanese */ #endif @@ -930,7 +1226,7 @@ defined(HAVE_CURVE25519) || defined(HAVE_CURVE25519_SHARED_SECRET) || \ defined(HAVE_ED25519) || defined(HAVE_CURVE448) || \ defined(HAVE_CURVE448_SHARED_SECRET) || defined(HAVE_ED448) || \ - defined(WOLFSSL_HAVE_KYBER) + defined(WOLFSSL_HAVE_KYBER) || defined(HAVE_DILITHIUM) static const char* bench_desc_words[][15] = { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ @@ -942,6 +1238,15 @@ #endif +#ifdef MULTI_VALUE_STATISTICS +static const char* bench_result_words3[][5] = { + /* 0 English */ + { "max duration", "min duration" , "mean duration", "sd", NULL }, + /* TODO: Add japenese version */ + { "max duration", "min duration" , "mean duration", "sd", NULL } +}; +#endif + #if defined(__GNUC__) && defined(__x86_64__) && !defined(NO_ASM) && !defined(WOLFSSL_SGX) #define HAVE_GET_CYCLES static WC_INLINE word64 get_intel_cycles(void); @@ -950,15 +1255,15 @@ #define BEGIN_INTEL_CYCLES total_cycles = get_intel_cycles(); #define END_INTEL_CYCLES total_cycles = get_intel_cycles() - total_cycles; /* s == size in bytes that 1 count represents, normally BENCH_SIZE */ - #define SHOW_INTEL_CYCLES(b, n, s) \ - (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), \ - " %s = " FLT_FMT_PREC2 "\n", \ - bench_result_words1[lng_index][2], \ - FLT_FMT_PREC2_ARGS(6, 2, count == 0 ? 0 : \ + #define SHOW_INTEL_CYCLES(b, n, s) \ + (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), \ + " %s = " FLT_FMT_PREC2 STATS_CLAUSE_SEPARATOR, \ + bench_result_words1[lng_index][2], \ + FLT_FMT_PREC2_ARGS(6, 2, count == 0 ? 0 : \ (double)total_cycles / ((word64)count*(s)))) - #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ - (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), FLT_FMT_PREC ",\n", \ - FLT_FMT_PREC_ARGS(6, count == 0 ? 0 : \ + #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ + (void)XSNPRINTF((b) + XSTRLEN(b), (n) - XSTRLEN(b), FLT_FMT_PREC "," \ + STATS_CLAUSE_SEPARATOR, FLT_FMT_PREC_ARGS(6, count == 0 ? 0 : \ (double)total_cycles / ((word64)count*(s)))) #elif defined(LINUX_CYCLE_COUNT) #include @@ -983,14 +1288,16 @@ } while (0); /* s == size in bytes that 1 count represents, normally BENCH_SIZE */ - #define SHOW_INTEL_CYCLES(b, n, s) \ - (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ - " %s = " FLT_FMT_PREC2 "\n", \ - bench_result_words1[lng_index][2], \ - FLT_FMT_PREC2_ARGS(6, 2, (double)total_cycles / (count*s))) - #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ - (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC ",\n", \ - FLT_FMT_PREC_ARGS(6, (double)total_cycles / (count*s))) + #define SHOW_INTEL_CYCLES(b, n, s) \ + (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ + " %s = " FLT_FMT_PREC2 STATS_CLAUSE_SEPARATOR, \ + bench_result_words1[lng_index][2], \ + FLT_FMT_PREC2_ARGS(6, 2, (double)total_cycles / \ + (count*s))) + #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ + (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC "," \ + STATS_CLAUSE_SEPARATOR, FLT_FMT_PREC_ARGS(6, (double)total_cycles \ + / (count*s))) #elif defined(SYNERGY_CYCLE_COUNT) #include "hal_data.h" @@ -1002,76 +1309,177 @@ #define END_INTEL_CYCLES total_cycles = DWT->CYCCNT - begin_cycles; /* s == size in bytes that 1 count represents, normally BENCH_SIZE */ - #define SHOW_INTEL_CYCLES(b, n, s) \ - (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ - " %s = " FLT_FMT_PREC2 "\n", \ - bench_result_words1[lng_index][2], \ + #define SHOW_INTEL_CYCLES(b, n, s) \ + (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ + " %s = " FLT_FMT_PREC2 STATS_CLAUSE_SEPARATOR, \ + bench_result_words1[lng_index][2], \ FLT_FMT_PREC2_ARGS(6, 2, (double)total_cycles / (count*s))) - #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ - (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC ",\n", \ + #define SHOW_INTEL_CYCLES_CSV(b, n, s) \ + (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC ",\n", \ FLT_FMT_PREC_ARGS(6, (double)total_cycles / (count*s))) #elif defined(WOLFSSL_ESPIDF) - static THREAD_LS_T word64 begin_cycles; - static THREAD_LS_T word64 total_cycles; - - /* the return value */ - static THREAD_LS_T word64 _xthal_get_ccount_ex = 0; - - /* the last value seen, adjusted for an overflow */ - static THREAD_LS_T word64 _xthal_get_ccount_last = 0; - /* TAG for ESP_LOGx() */ static const char* TAG = "wolfssl_benchmark"; - #define HAVE_GET_CYCLES - #define INIT_CYCLE_COUNTER - static WC_INLINE word64 get_xtensa_cycles(void); + static THREAD_LS_T word64 begin_cycles = 0; + static THREAD_LS_T word64 begin_cycles_ticks = 0; + static THREAD_LS_T word64 end_cycles = 0; + static THREAD_LS_T word64 total_cycles = 0; + + /* the return value, as a global var */ + static THREAD_LS_T word64 _esp_get_cycle_count_ex = 0; + + /* the last value seen, adjusted for an overflow, as a global var */ + static THREAD_LS_T word64 _esp_cpu_count_last = 0; + + static THREAD_LS_T TickType_t last_tickCount = 0; /* last FreeRTOS value */ + + /* esp_get_cpu_benchmark_cycles(void): + * + * Architecture-independant CPU clock counter. + * WARNING: the hal UINT xthal_get_ccount() quietly rolls over. */ + static WC_INLINE word64 esp_get_cpu_benchmark_cycles(void); + + /* Some vars for debugging, compare ticks to cycles */ + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + static THREAD_LS_T word64 _esp_cpu_timer_last = 0; + static THREAD_LS_T word64 _esp_cpu_timer_diff = 0; + static THREAD_LS_T word64 _xthal_get_ccount_exAlt = 0; + static THREAD_LS_T word64 _xthal_get_ccount_exDiff = 0; + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ + + /* The ESP32 (both Xtensa and RISC-V have raw CPU counters). */ + #if ESP_IDF_VERSION_MAJOR >= 5 + /* esp_cpu_set_cycle_count() introduced in ESP-IDF v5 */ + #define HAVE_GET_CYCLES + #define INIT_CYCLE_COUNTER do { \ + ESP_LOGV(TAG, "INIT_CYCLE_COUNTER"); \ + esp_cpu_set_cycle_count(0); \ + } while (0); + #else + #define HAVE_GET_CYCLES + #define INIT_CYCLE_COUNTER do { \ + ESP_LOGV(TAG, "INIT_CYCLE_COUNTER"); \ + } while (0); + #endif - /* WARNING the hal UINT xthal_get_ccount() quietly rolls over. */ - #define BEGIN_ESP_CYCLES begin_cycles = (get_xtensa_cycles()); + #define BEGIN_ESP_CYCLES do { \ + ESP_LOGV(TAG, "BEGIN_ESP_CYCLES"); \ + begin_cycles = esp_get_cpu_benchmark_cycles(); \ + begin_cycles_ticks = xTaskGetTickCount(); \ + } while (0); /* since it rolls over, we have something that will tolerate one */ - #define END_ESP_CYCLES \ - ESP_LOGV(TAG,"%llu - %llu", \ - get_xtensa_cycles(), \ - begin_cycles \ - ); \ - total_cycles = (get_xtensa_cycles() - begin_cycles); + #define END_ESP_CYCLES \ + end_cycles = esp_get_cpu_benchmark_cycles(); \ + ESP_LOGV(TAG,"END_ESP_CYCLES %llu - %llu", \ + end_cycles, \ + begin_cycles \ + ); \ + total_cycles = (end_cycles - begin_cycles); #define SHOW_ESP_CYCLES(b, n, s) \ - (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ - " %s = " FLT_FMT_PREC2 "\n", \ - bench_result_words1[lng_index][2], \ - FLT_FMT_PREC2_ARGS(6, 2, (double)total_cycles / (count*s)) \ - ) + (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), \ + " %s = " FLT_FMT_PREC2 "\n", \ + bench_result_words1[lng_index][2], \ + FLT_FMT_PREC2_ARGS(6, 2, (double)total_cycles / (count*s)) \ + ) #define SHOW_ESP_CYCLES_CSV(b, n, s) \ - (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC ",\n", \ - FLT_FMT_PREC_ARGS(6, (double)total_cycles / (count*s))) + (void)XSNPRINTF(b + XSTRLEN(b), n - XSTRLEN(b), FLT_FMT_PREC ",\n", \ + FLT_FMT_PREC_ARGS(6, (double)total_cycles / (count*s))) - /* xthal_get_ccount_ex() is a single-overflow-tolerant extension to - ** the Espressif `unsigned xthal_get_ccount()` which is known to overflow + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + /* 64 bit, unisgned, absolute difference + * used in CPU cycle counter debug calcs. */ + static uint64_t esp_cycle_abs_diff(uint64_t x, uint64_t y) + { + uint64_t ret; + ret = (x > y) ? (x - y) : (y - x); + return ret; + } + #endif + + /* esp_get_cycle_count_ex() is a single-overflow-tolerant extension to + ** the Espressif `unsigned xthal_get_ccount()` (Xtensa) or + ** `esp_cpu_get_cycle_count` (RISC-V) which are known to overflow ** at least once during full benchmark tests. + ** + ** To test timing overflow, add a delay longer than max cycles: + ** vTaskDelay( (const TickType_t)(configTICK_RATE_HZ * 17 * 5) ); */ - uint64_t xthal_get_ccount_ex() + uint64_t esp_get_cycle_count_ex() { - /* reminder: unsigned long long max = 18,446,744,073,709,551,615 */ + /* reminder: unsigned long long max = 18,446,744,073,709,551,615 */ + /* unsigned int max = 4,294,967,295 */ + uint64_t thisVal = 0; /* CPU counter, "this current value" as read. */ + uint64_t thisIncrement = 0; /* The adjusted increment amount. */ + uint64_t expected_diff = 0; /* FreeRTOS estimated expected CPU diff.*/ + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + uint64_t tickCount = 0; /* Current rtos tick counter. */ + uint64_t tickDiff = 0; /* Tick difference from last check. */ + uint64_t tickBeginDiff = 0; /* Tick difference from beginning. */ + #endif + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + uint64_t thisTimerVal = 0; /* Timer Value as alternate to compare */ + uint64_t diffDiff = 0; /* Difference between CPU & Timer differences: + * (current - last) */ + #endif + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + ESP_ERROR_CHECK(gptimer_get_raw_count(esp_gptimer, &thisTimerVal)); + thisTimerVal = thisTimerVal * RESOLUTION_SCALE; + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ - /* the currently observed clock counter value */ - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - uint64_t thisVal = 0; - ESP_ERROR_CHECK(gptimer_get_raw_count(esp_gptimer, &thisVal)); + thisVal = esp_cpu_get_cycle_count(); + + #elif defined(CONFIG_IDF_TARGET_ESP32H2) + thisVal = esp_cpu_get_cycle_count(); #else - /* reminder unsupported CONFIG_IDF_TARGET captured above */ - uint64_t thisVal = xthal_get_ccount(); + /* TODO: Why doesn't esp_cpu_get_cycle_count work for Xtensa? + * Calling current_time(1) to reset time causes thisVal overflow, + * on Xtensa, but not on RISC-V architecture. See also, below */ + #if defined(CONFIG_IDF_TARGET_ESP8266) || (ESP_IDF_VERSION_MAJOR < 5) + #ifndef configCPU_CLOCK_HZ + /* esp_cpu_get_cycle_count not available in ESP-IDF v4 */ + #define configCPU_CLOCK_HZ \ + (CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ * MILLION_VALUE) + #endif + /* There's no CPU counter on the ESP8266 (Tensilica). Using RTOS */ + thisVal = (uint64_t)xTaskGetTickCount() * + (uint64_t)(configCPU_CLOCK_HZ / CONFIG_FREERTOS_HZ); + #elif defined(__XTENSA__) + thisVal = esp_cpu_get_cycle_count(); + #else + /* Not Tensilica(ESP8266), not Xtensa(ESP32/-S2/-S3, then RISC-V */ + thisVal = xthal_get_ccount(); /* or esp_cpu_get_cycle_count(); */ + #endif #endif - /* if the current value is less than the previous value, - ** we likely overflowed at least once. - */ - if (thisVal < _xthal_get_ccount_last) + + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + { + tickCount = xTaskGetTickCount(); /* Our local FreeRTOS tick count */ + tickDiff = tickCount - last_tickCount; /* ticks since bench start */ + expected_diff = CPU_TICK_CYCLES * tickDiff; /* CPU expected count */ + ESP_LOGV(TAG, "CPU_TICK_CYCLES = %d", (int)CPU_TICK_CYCLES); + ESP_LOGV(TAG, "tickCount = %llu", tickCount); + ESP_LOGV(TAG, "last_tickCount = %u", last_tickCount); + ESP_LOGV(TAG, "tickDiff = %llu", tickDiff); + ESP_LOGV(TAG, "expected_diff1 = %llu", expected_diff); + } + #endif + + /* If either thisVal is smaller than last (overflow), and/or the + * expected value calculated from FreeRTOS tick difference that would + * have never fit into an unsigned 32 bit integer anyhow... then we + * need to adjust thisVal to save. */ + if ( (thisVal < _esp_cpu_count_last) || (expected_diff > UINT_MAX) ) { - /* Warning: we assume the return type of xthal_get_ccount() - ** will always be unsigned int to add UINT_MAX. + /* Warning: we assume the return type of esp_cpu_get_cycle_count() + ** will always be unsigned int (or uint32_t) to add UINT_MAX. ** ** NOTE for long duration between calls with multiple overflows: ** @@ -1082,23 +1490,127 @@ ** as well call xthal_get_ccount_ex() with no more than one ** overflow CPU tick count, all will be well. */ - ESP_LOGV(TAG, "Alert: Detected xthal_get_ccount overflow, " - "adding %ull", UINT_MAX); - thisVal += (word64)UINT_MAX; + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGW(TAG, "Alert: Detected xthal_get_ccount overflow at " + "(%llu < %llu) adding UINT_MAX = %llu.", + thisVal, _esp_cpu_count_last, (uint64_t) UINT_MAX); + #endif + #if !defined(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ) && \ + !defined(CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ) + #error "CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ not found" + #endif + + /* double check expected diff calc */ + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + expected_diff = (CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ * MILLION_VALUE) + * tickDiff / configTICK_RATE_HZ; + ESP_LOGI(TAG, "expected_diff2 = %llu", expected_diff); + #endif + if (expected_diff > UINT_MAX) { + /* The number of cycles expected from FreeRTOS ticks is + * greater than the maximum size of an unsigned 32-bit + * integer, meaning multiple overflows occurred. */ + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGW(TAG, "expected_diff > UINT_MAX (%u)", UINT_MAX); + #endif + thisVal += expected_diff; /* FreeRTOS calc to our 64 bit val */ + } + else { + thisVal += (word64)UINT_MAX; /* add 32 bit max to our 64 bit */ + } + + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + { + tickBeginDiff = tickCount - begin_cycles_ticks; + + ESP_LOGI(TAG, "begin_cycles_ticks = %llu", begin_cycles_ticks); + ESP_LOGI(TAG, "tickDiff = %llu", tickDiff); + ESP_LOGI(TAG, "expected_diff = %llu", expected_diff); + ESP_LOGI(TAG, "tickBeginDiff = %llu", tickBeginDiff); + + ESP_LOGW(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); + } + #endif } + else { + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGI(TAG, "thisVal, read CPU = %llu", thisVal); + #endif + } /* if thisVal adjustment check */ - /* adjust our actual returned value that takes into account overflow */ - _xthal_get_ccount_ex += (thisVal - _xthal_get_ccount_last); - - /* all of this took some time, so reset the "last seen" value */ - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - ESP_ERROR_CHECK(gptimer_get_raw_count(esp_gptimer, - &_xthal_get_ccount_last)); - #else - _xthal_get_ccount_last = xthal_get_ccount(); - #endif - return _xthal_get_ccount_ex; - } + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + if (thisTimerVal < _esp_cpu_timer_last) + { + ESP_LOGW(TAG, "Alert: Detected xthal_get_ccountAlt overflow, " + "adding %ull", UINT_MAX); + thisTimerVal += (word64)UINT_MAX; + } + /* Check an alternate counter using a timer */ + + _esp_cpu_timer_diff = esp_cycle_abs_diff(_esp_cpu_count_last, _esp_cpu_timer_last); + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ + + /* Adjust our actual returned value that takes into account overflow, + * increment 64 bit extended total by this 32 bit differential: */ + thisIncrement = (thisVal - _esp_cpu_count_last); + + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGI(TAG, "thisIncrement = %llu", thisIncrement); + #endif + + /* Add our adjustment, taking into account overflows (see above) */ + _esp_get_cycle_count_ex += thisIncrement; + + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + _xthal_get_ccount_exDiff = esp_cycle_abs_diff(_esp_get_cycle_count_ex, _xthal_get_ccount_exAlt); + _xthal_get_ccount_exAlt += (thisTimerVal - _esp_cpu_timer_last); + diffDiff = esp_cycle_abs_diff(_xthal_get_ccount_exDiff, _esp_cpu_timer_diff); + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ + + /* all of this took some time, so reset the "last seen" value + * for the next measurement. */ + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + ESP_ERROR_CHECK(gptimer_get_raw_count(esp_gptimer, + &_esp_cpu_timer_last)); + ESP_LOGI(TAG, "thisVal = %llu", thisVal); + ESP_LOGI(TAG, "thisTimerVal = %llu", thisTimerVal); + ESP_LOGI(TAG, "diffDiff = %llu", diffDiff); + ESP_LOGI(TAG, "_xthal_get_ccount_exDiff = %llu", _xthal_get_ccount_exDiff); + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ + _esp_cpu_count_last = esp_cpu_get_cycle_count(); + ESP_LOGV(TAG, "_xthal_get_ccount_last = %llu", _esp_cpu_count_last); + } + #elif defined(CONFIG_IDF_TARGET_ESP32H2) + _esp_cpu_count_last = esp_cpu_get_cycle_count(); + #else + /* TODO: Why doesn't esp_cpu_get_cycle_count work for Xtensa + * when resetting CPU cycle counter? FreeRTOS tick collision? + * thisVal = esp_cpu_get_cycle_count(); See also, above + * or thisVal = xthal_get_ccount(); */ + #if defined(CONFIG_IDF_TARGET_ESP8266) + /* There's no CPU counter on the ESP8266, so we'll estimate + * cycles based on defined CPU frequency from sdkconfig and + * the RTOS tick frequency */ + _esp_cpu_count_last = (uint64_t)xTaskGetTickCount() * + (uint64_t)(configCPU_CLOCK_HZ / CONFIG_FREERTOS_HZ); + #elif ESP_IDF_VERSION_MAJOR < 5 + _esp_cpu_count_last = xthal_get_ccount(); + #else + _esp_cpu_count_last = esp_cpu_get_cycle_count(); + #endif + #endif + + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGI(TAG, "_esp_cpu_count_last = %llu", _esp_cpu_count_last); + #endif + + /* Return the 64 bit extended total from 32 bit counter. */ + return _esp_get_cycle_count_ex; + } /* esp_get_cycle_count_ex for esp_get_cpu_benchmark_cycles() */ /* implement other architecture cycle counters here */ @@ -1109,8 +1621,13 @@ #define INIT_CYCLE_COUNTER #define BEGIN_INTEL_CYCLES #define END_INTEL_CYCLES - #define SHOW_INTEL_CYCLES(b, n, s) b[XSTRLEN(b)] = '\n' - #define SHOW_INTEL_CYCLES_CSV(b, n, s) b[XSTRLEN(b)] = '\n' + #ifdef MULTI_VALUE_STATISTICS + #define SHOW_INTEL_CYCLES(b, n, s) WC_DO_NOTHING + #define SHOW_INTEL_CYCLES_CSV(b, n, s) WC_DO_NOTHING + #else + #define SHOW_INTEL_CYCLES(b, n, s) b[XSTRLEN(b)] = '\n' + #define SHOW_INTEL_CYCLES_CSV(b, n, s) b[XSTRLEN(b)] = '\n' + #endif #endif /* determine benchmark buffer to use (if NO_FILESYSTEM) */ @@ -1175,7 +1692,7 @@ defined(HAVE_CURVE448) || defined(HAVE_ED448) || \ defined(HAVE_ECC) || !defined(NO_DH) || \ !defined(NO_RSA) || defined(HAVE_SCRYPT) || \ - defined(WOLFSSL_HAVE_KYBER) + defined(WOLFSSL_HAVE_KYBER) || defined(HAVE_DILITHIUM) #define BENCH_ASYM #endif @@ -1183,9 +1700,14 @@ #if defined(HAVE_ECC) || !defined(NO_RSA) || !defined(NO_DH) || \ defined(HAVE_CURVE25519) || defined(HAVE_ED25519) || \ defined(HAVE_CURVE448) || defined(HAVE_ED448) || \ - defined(WOLFSSL_HAVE_KYBER) + defined(WOLFSSL_HAVE_KYBER) || defined(HAVE_DILITHIUM) static const char* bench_result_words2[][5] = { +#ifdef BENCH_MICROSECOND + { "ops took", "μsec" , "avg" , "ops/μsec", NULL }, /* 0 English + for μsec */ +#else { "ops took", "sec" , "avg" , "ops/sec", NULL }, /* 0 English */ +#endif #ifndef NO_MULTIBYTE_PRINT { "回処ç†ã‚’", "秒ã§å®Ÿæ–½", "å¹³å‡", "処ç†/秒", NULL }, /* 1 Japanese */ #endif @@ -1203,7 +1725,11 @@ static THREAD_LS_T int devId = WOLFSSL_CAAM_DEVID; #else + #ifdef WC_USE_DEVID + static THREAD_LS_T int devId = WC_USE_DEVID; + #else static THREAD_LS_T int devId = INVALID_DEVID; + #endif #endif /* Asynchronous helper macros */ @@ -1215,11 +1741,15 @@ static volatile int g_threadCount; #endif -#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_CAAM) +#if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_CAAM) || defined(WC_USE_DEVID) #ifndef NO_HW_BENCH #define BENCH_DEVID #endif - #define BENCH_DEVID_GET_NAME(useDeviceID) (useDeviceID) ? "HW" : "SW" + #ifndef HAVE_RENESAS_SYNC + #define BENCH_DEVID_GET_NAME(useDeviceID) (useDeviceID) ? "HW" : "SW" + #else + #define BENCH_DEVID_GET_NAME(useDeviceID) "" + #endif #else #define BENCH_DEVID_GET_NAME(useDeviceID) "" #endif @@ -1242,7 +1772,8 @@ /* if algo doesn't require calling again then use this flow */ if (state == WOLF_EVENT_STATE_DONE) { if (callAgain) { - /* needs called again, so allow it and handle completion in bench_async_handle */ + /* needs called again, so allow it and handle completion in + * bench_async_handle */ allowNext = 1; } else { @@ -1348,7 +1879,7 @@ } return 0; } - #define bench_async_poll(p) + #define bench_async_poll(p) WC_DO_NOTHING #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -1369,7 +1900,9 @@ #define AES_AAD_OPTIONS_DEFAULT 0x3U #endif #endif - #define AES_AAD_STRING(s) (aesAuthAddSz == 0 ? (s "-no_AAD") : (aesAuthAddSz == AES_AUTH_ADD_SZ ? (s) : (s "-custom"))) + #define AES_AAD_STRING(s) \ + (aesAuthAddSz == 0 ? (s "-no_AAD") : \ + (aesAuthAddSz == AES_AUTH_ADD_SZ ? (s) : (s "-custom"))) enum en_aad_options { AAD_SIZE_DEFAULT = 0x1U, AAD_SIZE_ZERO = 0x2U, @@ -1407,21 +1940,33 @@ /* use kB instead of mB for embedded benchmarking */ #ifdef BENCH_EMBEDDED + #ifndef BENCH_NTIMES + #define BENCH_NTIMES 2 + #endif + #ifndef BENCH_AGREETIMES + #define BENCH_AGREETIMES 2 + #endif enum BenchmarkBounds { scryptCnt = 1, - ntimes = 2, + ntimes = BENCH_NTIMES, genTimes = BENCH_MAX_PENDING, - agreeTimes = 2 + agreeTimes = BENCH_AGREETIMES }; /* how many kB to test (en/de)cryption */ #define NUM_BLOCKS 25 #define BENCH_SIZE (1024uL) #else + #ifndef BENCH_NTIMES + #define BENCH_NTIMES 100 + #endif + #ifndef BENCH_AGREETIMES + #define BENCH_AGREETIMES 100 + #endif enum BenchmarkBounds { scryptCnt = 10, - ntimes = 100, + ntimes = BENCH_NTIMES, genTimes = BENCH_MAX_PENDING, /* must be at least BENCH_MAX_PENDING */ - agreeTimes = 100 + agreeTimes = BENCH_AGREETIMES }; /* how many megs to test (en/de)cryption */ #define NUM_BLOCKS 5 @@ -1432,6 +1977,14 @@ static word32 bench_size = BENCH_SIZE; static int base2 = 1; static int digest_stream = 1; +static int encrypt_only = 0; +#ifdef HAVE_AES_CBC +static int cipher_same_buffer = 0; +#endif + +#ifdef MULTI_VALUE_STATISTICS +static int minimum_runs = 0; +#endif #ifndef NO_RSA /* Don't measure RSA sign/verify by default */ @@ -1459,6 +2012,10 @@ /* globals for cipher tests */ static THREAD_LS_T byte* bench_plain = NULL; static THREAD_LS_T byte* bench_cipher = NULL; +#ifndef NO_FILESYSTEM +static THREAD_LS_T char* hash_input = NULL; +static THREAD_LS_T char* cipher_input = NULL; +#endif static const XGEN_ALIGN byte bench_key_buf[] = { @@ -1480,7 +2037,10 @@ }; static THREAD_LS_T byte* bench_key = NULL; static THREAD_LS_T byte* bench_iv = NULL; - +#ifdef HAVE_RENESAS_SYNC +static THREAD_LS_T byte* bench_key1 = NULL; +static THREAD_LS_T byte* bench_key2 = NULL; +#endif #ifdef WOLFSSL_STATIC_MEMORY #ifdef WOLFSSL_STATIC_MEMORY_TEST_SZ static byte gBenchMemory[WOLFSSL_STATIC_MEMORY_TEST_SZ]; @@ -1510,14 +2070,19 @@ #endif base2 = 1; digest_stream = 1; + #ifdef MULTI_VALUE_STATISTICS + minimum_runs = 0; + #endif bench_all = 1; bench_cipher_algs = 0; bench_digest_algs = 0; bench_mac_algs = 0; + bench_kdf_algs = 0; bench_asym_algs = 0; bench_pq_asym_algs = 0; bench_other_algs = 0; + bench_pq_hash_sig_algs = 0; csv_format = 0; } } @@ -1533,11 +2098,11 @@ BENCH_STAT_IGNORE, } bench_stat_type_t; -#ifdef WC_ENABLE_BENCH_THREADING +#ifdef WC_BENCH_TRACK_STATS static int gPrintStats = 0; - - static pthread_mutex_t bench_lock = PTHREAD_MUTEX_INITIALIZER; - + #ifdef WC_ENABLE_BENCH_THREADING + static pthread_mutex_t bench_lock = PTHREAD_MUTEX_INITIALIZER; + #endif #ifndef BENCH_MAX_NAME_SZ #define BENCH_MAX_NAME_SZ 24 #endif @@ -1563,8 +2128,10 @@ { bench_stats_t* bstat = NULL; + #ifdef WC_ENABLE_BENCH_THREADING /* protect bench_stats_head and bench_stats_tail access */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&bench_lock)); + THREAD_CHECK_RET(pthread_mutex_lock(&bench_lock)); + #endif if (algo != NULL) { /* locate existing in list */ @@ -1611,99 +2178,56 @@ if (bstat->lastRet > ret) bstat->lastRet = ret; /* track last error */ } - PTHREAD_CHECK_RET(pthread_mutex_unlock(&bench_lock)); - + #ifdef WC_ENABLE_BENCH_THREADING + THREAD_CHECK_RET(pthread_mutex_unlock(&bench_lock)); + #endif return bstat; } void bench_stats_print(void) { bench_stats_t* bstat; + int digits; + #ifdef WC_ENABLE_BENCH_THREADING /* protect bench_stats_head and bench_stats_tail access */ - PTHREAD_CHECK_RET(pthread_mutex_lock(&bench_lock)); + THREAD_CHECK_RET(pthread_mutex_lock(&bench_lock)); + #endif + + #ifdef BENCH_MICROSECOND + digits = 5; + #else + digits = 3; + #endif for (bstat = bench_stats_head; bstat != NULL; ) { if (bstat->type == BENCH_STAT_SYM) { - printf("%-16s%s " FLT_FMT_PREC2 " %s/s\n", bstat->desc, + printf("%-16s%s " FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT + "\n", bstat->desc, BENCH_DEVID_GET_NAME(bstat->useDeviceID), - FLT_FMT_PREC2_ARGS(8, 3, bstat->perfsec), + FLT_FMT_PREC2_ARGS(8, digits, bstat->perfsec), base2 ? "MB" : "mB"); } else { - printf("%-5s %4d %-9s %s " FLT_FMT_PREC " ops/sec\n", + printf("%-5s %4d %-9s %s " FLT_FMT_PREC " ops/" + WOLFSSL_FIXED_TIME_UNIT "ec\n", bstat->algo, bstat->strength, bstat->desc, BENCH_DEVID_GET_NAME(bstat->useDeviceID), - FLT_FMT_PREC_ARGS(3, bstat->perfsec)); + FLT_FMT_PREC_ARGS(digits, bstat->perfsec)); } bstat = bstat->next; } - PTHREAD_CHECK_RET(pthread_mutex_unlock(&bench_lock)); - } - -#else /* !WC_ENABLE_BENCH_THREADING */ - - typedef struct bench_stats { - const char* algo; - const char* desc; - double perfsec; - const char* perftype; - int strength; - bench_stat_type_t type; - int ret; - } bench_stats_t; - /* 16 threads and 8 different operations. */ - #define MAX_BENCH_STATS (16 * 8) - static bench_stats_t gStats[MAX_BENCH_STATS]; - static int gStatsCount; - - static bench_stats_t* bench_stats_add(bench_stat_type_t type, - const char* algo, int strength, const char* desc, int useDeviceID, - double perfsec, const char* perftype, int ret) - { - bench_stats_t* bstat = NULL; - if (gStatsCount >= MAX_BENCH_STATS) - return bstat; - - bstat = &gStats[gStatsCount++]; - bstat->algo = algo; - bstat->desc = desc; - bstat->perfsec = perfsec; - bstat->perftype = perftype; - bstat->strength = strength; - bstat->type = type; - bstat->ret = ret; - - (void)useDeviceID; - - return bstat; - } - - void bench_stats_print(void) - { - int i; - - for (i=0; itype == BENCH_STAT_SYM) { - printf("%-16s " FLT_FMT_PREC2 " %s/s\n", bstat->desc, - FLT_FMT_PREC2_ARGS(8, 3, bstat->perfsec), - base2 ? "MB" : "mB"); - } - else if (bstat->type == BENCH_STAT_ASYM) { - printf("%-5s %4d %-9s " FLT_FMT_PREC " ops/sec\n", - bstat->algo, bstat->strength, bstat->desc, - FLT_FMT_PREC_ARGS(3, bstat->perfsec)); - } - } + #ifdef WC_ENABLE_BENCH_THREADING + THREAD_CHECK_RET(pthread_mutex_unlock(&bench_lock)); + #endif } -#endif /* WC_ENABLE_BENCH_THREADING */ +#endif /* WC_BENCH_TRACK_STATS */ static WC_INLINE void bench_stats_init(void) { -#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_NO_ASYNC_THREADING) +#ifdef WC_BENCH_TRACK_STATS bench_stats_head = NULL; bench_stats_tail = NULL; #endif @@ -1716,9 +2240,10 @@ *start = current_time(1); #ifdef WOLFSSL_ESPIDF - ESP_LOGV(TAG, "finish total_cycles = %llu, start=" FLT_FMT, - total_cycles, FLT_FMT_ARGS(*start) ); - + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGI(TAG, "bench_stats_start total_cycles = %llu, start=" FLT_FMT, + total_cycles, FLT_FMT_ARGS(*start) ); + #endif BEGIN_ESP_CYCLES #else BEGIN_INTEL_CYCLES @@ -1726,16 +2251,32 @@ } #ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS - #define bench_stats_start(count, start) do { \ - SAVE_VECTOR_REGISTERS(pr_err("SAVE_VECTOR_REGISTERS failed for benchmark run."); \ - return; ); \ - bench_stats_start(count, start); \ + #define bench_stats_start(count, start) do { \ + SAVE_VECTOR_REGISTERS(pr_err( \ + "SAVE_VECTOR_REGISTERS failed for benchmark run."); \ + return; ); \ + bench_stats_start(count, start); \ } while (0) #endif static WC_INLINE int bench_stats_check(double start) { - return ((current_time(0) - start) < BENCH_MIN_RUNTIME_SEC); + int ret = 0; + double this_current_time; + this_current_time = current_time(0); /* get the timestamp, no reset */ + +#if defined(DEBUG_WOLFSSL_BENCHMARK_TIMING) && defined(WOLFSSL_ESPIDF) + ESP_LOGV(TAG, "bench_stats_check: Current time %f, start %f", + this_current_time, start ); +#endif + + ret = ((this_current_time - start) < BENCH_MIN_RUNTIME_SEC +#ifdef BENCH_MICROSECOND + * 1000000 +#endif + ); + + return ret; } /* return text for units and scale the value of blocks as needed */ @@ -1745,25 +2286,25 @@ #if ( defined(WOLFSSL_BENCHMARK_FIXED_UNITS_G) || \ defined(WOLFSSL_BENCHMARK_FIXED_UNITS_GB)) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "GB/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "GB" *blocks /= (1024UL * 1024UL * 1024UL); rt = "GiB"; #elif (defined(WOLFSSL_BENCHMARK_FIXED_UNITS_M) || \ defined(WOLFSSL_BENCHMARK_FIXED_UNITS_MB)) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "MB/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "MB" *blocks /= (1024UL * 1024UL); rt = "MiB"; #elif (defined(WOLFSSL_BENCHMARK_FIXED_UNITS_K) || \ defined(WOLFSSL_BENCHMARK_FIXED_UNITS_KB)) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "KB/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "KB" *blocks /= 1024; rt = "KiB"; #elif defined (WOLFSSL_BENCHMARK_FIXED_UNITS_B) - #undef WOLFSSL_FIXED_UNITS_PER_SEC - #define WOLFSSL_FIXED_UNITS_PER_SEC "bytes/s" + #undef WOLFSSL_FIXED_UNIT + #define WOLFSSL_FIXED_UNIT "bytes" (void)(*blocks); /* no adjustment, just appease compiler for not used */ rt = "bytes"; #else @@ -1824,6 +2365,66 @@ return rt; } +#ifdef MULTI_VALUE_STATISTICS +static double wc_sqroot(double in) +{ + /* do 32 iterations for the sqroot */ + int iter = 32; + double root = in/3.0; + + if (in < 0.0) + return -1; + + for (int i=0; i < iter; i++) + root = (root + in / root) / 2.0; + + return root; +} + +static void bench_multi_value_stats(double max, double min, double sum, + double squareSum, int runs) +{ + double mean = 0; + double sd = 0; + char msg[WC_BENCH_MAX_LINE_LEN]; + const char** word = bench_result_words3[lng_index]; + + XMEMSET(msg, 0, sizeof(msg)); + + mean = sum / runs; + + /* Calculating standard deviation */ + sd = (squareSum / runs) - (mean * mean); + sd = wc_sqroot(sd); + + if (csv_format == 1) { + (void)XSNPRINTF(msg, sizeof(msg), FLT_FMT_PREC2 "," + FLT_FMT_PREC2 "," FLT_FMT_PREC2 "," FLT_FMT_PREC2 ",\n", + FLT_FMT_PREC2_ARGS(3, 3, max), + FLT_FMT_PREC2_ARGS(3, 3, min), + FLT_FMT_PREC2_ARGS(3, 3, mean), + FLT_FMT_PREC2_ARGS(3, 3, sd)); + } + else{ + (void)XSNPRINTF(msg, sizeof(msg), ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT ", %s " FLT_FMT_PREC2 " " + WOLFSSL_FIXED_TIME_UNIT "\n", + word[0], FLT_FMT_PREC2_ARGS(3, 3, max), + word[1], FLT_FMT_PREC2_ARGS(3, 3, min), + word[2], FLT_FMT_PREC2_ARGS(3, 3, mean), + word[3], FLT_FMT_PREC2_ARGS(3, 3, sd)); + } + printf("%s", msg); + +#ifndef WOLFSSL_SGX + XFFLUSH(stdout); +#endif + +} +#endif + /* countSz is number of bytes that 1 count represents. Normally bench_size, * except for AES direct that operates on AES_BLOCK_SIZE blocks */ static void bench_stats_sym_finish(const char* desc, int useDeviceID, @@ -1832,7 +2433,7 @@ { double total, persec = 0, blocks = (double)count; const char* blockType; - char msg[__BENCHMARK_MAXIMUM_LINE_LENGTH]; + char msg[WC_BENCH_MAX_LINE_LEN]; const char** word = bench_result_words1[lng_index]; static int sym_header_printed = 0; @@ -1846,8 +2447,8 @@ total = current_time(0) - start; -#ifdef WOLFSSL_ESPIDF - ESP_LOGV(TAG, "%s total_cycles = %llu", desc, total_cycles); +#if defined(WOLFSSL_ESPIDF) && defined(DEBUG_WOLFSSL_BENCHMARK_TIMING) + ESP_LOGI(TAG, "%s total_cycles = %llu", desc, total_cycles); #endif #ifdef LINUX_RUSAGE_UTIME @@ -1863,11 +2464,15 @@ #ifdef GENERATE_MACHINE_PARSEABLE_REPORT /* machine parseable CSV */ #ifdef HAVE_GET_CYCLES - printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total,seconds_total," - WOLFSSL_FIXED_UNITS_PER_SEC ",cycles_total,Cycles per byte,\n"); + printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total," + WOLFSSL_FIXED_TIME_UNIT "econds_total," + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT + ",cycles_total,Cycles per byte,"); #else - printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total,seconds_total," - WOLFSSL_FIXED_UNITS_PER_SEC ",cycles_total,\n"); + printf("%s", "\"sym\",Algorithm,HW/SW,bytes_total," + WOLFSSL_FIXED_TIME_UNIT "econds_total," + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT + ",cycles_total,"); #endif #else /* normal CSV */ @@ -1880,14 +2485,20 @@ printf("\n\nSymmetric Ciphers:\n\n"); printf("Algorithm," BENCH_DEVID_COLUMN_HEADER - WOLFSSL_FIXED_UNITS_PER_SEC ",Cycles per byte,\n"); + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT + ",Cycles per byte,"); #else printf("\n\nSymmetric Ciphers:\n\n"); printf("Algorithm," BENCH_DEVID_COLUMN_HEADER - WOLFSSL_FIXED_UNITS_PER_SEC ", \n"); + WOLFSSL_FIXED_UNIT "/" WOLFSSL_FIXED_TIME_UNIT ","); #endif #endif + #ifdef MULTI_VALUE_STATISTICS + printf("max duration,min duration,mean duration,sd,\n"); + #else + printf("\n"); + #endif sym_header_printed = 1; } } @@ -1922,9 +2533,11 @@ /* note this codepath brings in all the fields from the non-CSV case. */ #ifdef WOLFSSL_ESPIDF #ifdef HAVE_GET_CYCLES - (void)XSNPRINTF(msg, sizeof(msg), "sym,%s,%s,%lu," FLT_FMT "," FLT_FMT ",%lu,", desc, + (void)XSNPRINTF(msg, sizeof(msg), + "sym,%s,%s,%lu," FLT_FMT "," FLT_FMT ",%lu,", desc, BENCH_DEVID_GET_NAME(useDeviceID), - bytes_processed, FLT_FMT_ARGS(total), FLT_FMT_ARGS(persec), + bytes_processed, FLT_FMT_ARGS(total), + FLT_FMT_ARGS(persec), (long unsigned int) total_cycles); #else #warning "HAVE_GET_CYCLES should be defined for WOLFSSL_ESPIDF" @@ -1949,16 +2562,23 @@ #endif #elif defined(BENCH_DEVID) (void)XSNPRINTF(msg, sizeof(msg), "%s,%s," FLT_FMT ",", desc, - BENCH_DEVID_GET_NAME(useDeviceID), FLT_FMT_ARGS(persec)); + BENCH_DEVID_GET_NAME(useDeviceID), FLT_FMT_ARGS(persec)); #else - (void)XSNPRINTF(msg, sizeof(msg), "%s," FLT_FMT ",", desc, FLT_FMT_ARGS(persec)); + (void)XSNPRINTF(msg, sizeof(msg), "%s," FLT_FMT ",", desc, + FLT_FMT_ARGS(persec)); #endif #ifdef WOLFSSL_ESPIDF SHOW_ESP_CYCLES_CSV(msg, sizeof(msg), countSz); - ESP_LOGV(TAG, "finish total_cycles = %llu", total_cycles); - /* implement other cycle counters here */ + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGI(TAG, "bench_stats_sym_finish total_cycles = %llu", + total_cycles); + #endif + + /* implement other cycle counters here */ + #else + /* the default cycle counter is Intel */ SHOW_INTEL_CYCLES_CSV(msg, sizeof(msg), (unsigned)countSz); #endif } /* if (csv_format == 1) */ @@ -1967,30 +2587,30 @@ #ifdef GENERATE_MACHINE_PARSEABLE_REPORT #ifdef HAVE_GET_CYCLES (void)XSNPRINTF(msg, sizeof(msg), + "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " + FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT ", %lu cycles,", + desc, BENCH_DEVID_GET_NAME(useDeviceID), + FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, + word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], + FLT_FMT_PREC2_ARGS(8, 3, persec), blockType, + (unsigned long) total_cycles); + #else + (void)XSNPRINTF(msg, sizeof(msg), "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " - FLT_FMT_PREC2 " %s/s, %lu cycles,", + FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT ",", desc, BENCH_DEVID_GET_NAME(useDeviceID), FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], - FLT_FMT_PREC2_ARGS(8, 3, persec), blockType, - (unsigned long) total_cycles); - #else - (void)XSNPRINTF(msg, sizeof(msg), - "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " - FLT_FMT_PREC2 " %s/s,", - desc, BENCH_DEVID_GET_NAME(useDeviceID), - FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, - word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], - FLT_FMT_PREC2_ARGS(8, 3, persec), blockType); - #endif /* HAVE_GET_CYCLES */ + FLT_FMT_PREC2_ARGS(8, 3, persec), blockType); + #endif /* HAVE_GET_CYCLES */ #else (void)XSNPRINTF(msg, sizeof(msg), - "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " - FLT_FMT_PREC2 " %s/s", - desc, BENCH_DEVID_GET_NAME(useDeviceID), - FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, - word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], - FLT_FMT_PREC2_ARGS(8, 3, persec), blockType); + "%-24s%s " FLT_FMT_PREC2 " %s %s " FLT_FMT_PREC2 " %s, " + FLT_FMT_PREC2 " %s/" WOLFSSL_FIXED_TIME_UNIT, + desc, BENCH_DEVID_GET_NAME(useDeviceID), + FLT_FMT_PREC2_ARGS(5, 0, blocks), blockType, + word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], + FLT_FMT_PREC2_ARGS(8, 3, persec), blockType); #endif #ifdef WOLFSSL_ESPIDF @@ -2014,14 +2634,18 @@ XFFLUSH(stdout); #endif +#ifdef WC_BENCH_TRACK_STATS /* Add to thread stats */ bench_stats_add(BENCH_STAT_SYM, desc, 0, desc, useDeviceID, persec, blockType, ret); +#endif (void)useDeviceID; (void)ret; +#ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS RESTORE_VECTOR_REGISTERS(); +#endif TEST_SLEEP(); } /* bench_stats_sym_finish */ @@ -2030,16 +2654,23 @@ #if defined(HAVE_ECC) || !defined(NO_RSA) || !defined(NO_DH) || \ defined(HAVE_CURVE25519) || defined(HAVE_ED25519) || \ defined(HAVE_CURVE448) || defined(HAVE_ED448) || \ - defined(WOLFSSL_HAVE_KYBER) + defined(WOLFSSL_HAVE_KYBER) || defined(HAVE_DILITHIUM) static void bench_stats_asym_finish_ex(const char* algo, int strength, const char* desc, const char* desc_extra, int useDeviceID, int count, double start, int ret) { double total, each = 0, opsSec, milliEach; const char **word = bench_result_words2[lng_index]; +#ifdef WC_BENCH_TRACK_STATS const char* kOpsSec = "Ops/Sec"; +#endif char msg[256]; static int asym_header_printed = 0; +#ifdef BENCH_MICROSECOND + const int digits = 5; +#else + const int digits = 3; +#endif XMEMSET(msg, 0, sizeof(msg)); @@ -2073,48 +2704,144 @@ opsSec = 0; } +#ifdef BENCH_MICROSECOND + milliEach = each / 1000; /* milliseconds */ +#else milliEach = each * 1000; /* milliseconds */ +#endif SLEEP_ON_ERROR(ret); + +#ifdef MULTI_VALUE_STATISTICS /* Print without avg ms */ + (void)milliEach; + + /* format and print to terminal */ + if (csv_format == 1) { + /* only print out header once */ + if (asym_header_printed == 0) { +#ifdef GENERATE_MACHINE_PARSEABLE_REPORT + #ifdef HAVE_GET_CYCLES + printf("%s", "\"asym\",Algorithm,key size,operation,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,ops," WOLFSSL_FIXED_TIME_UNIT + "ecs,cycles,cycles/op,"); + #else + printf("%s", "\"asym\",Algorithm,key size,operation,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,ops," WOLFSSL_FIXED_TIME_UNIT + "ecs,"); + #endif +#else + printf("\n%sAsymmetric Ciphers:\n\n", info_prefix); + printf("%sAlgorithm,key size,operation,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,", info_prefix); +#endif + printf("max duration,min duration,mean duration,sd,\n"); + asym_header_printed = 1; + } +#ifdef GENERATE_MACHINE_PARSEABLE_REPORT + #ifdef HAVE_GET_CYCLES + (void)XSNPRINTF(msg, sizeof(msg), + "asym,%s,%d,%s%s," FLT_FMT_PREC ",%d," + FLT_FMT ",%lu," FLT_FMT_PREC STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + FLT_FMT_PREC_ARGS(digits, opsSec), + count, FLT_FMT_ARGS(total), (unsigned long)total_cycles, + FLT_FMT_PREC_ARGS(6, + (double)total_cycles / (double)count)); + #else + (void)XSNPRINTF(msg, sizeof(msg), + "asym,%s,%d,%s%s," FLT_FMT_PREC ",%d," + FLT_FMT STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + FLT_FMT_PREC_ARGS(digits, opsSec), + count, FLT_FMT_ARGS(total)); + #endif +#else + (void)XSNPRINTF(msg, sizeof(msg), "%s,%d,%s%s," + FLT_FMT_PREC "," STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + FLT_FMT_PREC_ARGS(digits, opsSec)); +#endif + } /* if (csv_format == 1) */ + + else { +#ifdef GENERATE_MACHINE_PARSEABLE_REPORT + #ifdef HAVE_GET_CYCLES + (void)XSNPRINTF(msg, sizeof(msg), + "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, " + FLT_FMT_PREC " %s, %lu cycles" STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], + FLT_FMT_PREC2_ARGS(5, 3, total), word[1], + FLT_FMT_PREC_ARGS(digits, opsSec), word[3], + (unsigned long)total_cycles); + #else + (void)XSNPRINTF(msg, sizeof(msg), + "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, " + FLT_FMT_PREC " %s" STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], + FLT_FMT_PREC2_ARGS(5, 3, total), word[1], + FLT_FMT_PREC_ARGS(digits, opsSec), word[3]); + #endif /* HAVE_GET_CYCLES */ +#else + (void)XSNPRINTF(msg, sizeof(msg), + "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, " + FLT_FMT_PREC " %s" STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], + FLT_FMT_PREC2_ARGS(5, 3, total), word[1], + FLT_FMT_PREC_ARGS(digits, opsSec), word[3]); +#endif + } +#else /* MULTI_VALUE_STATISTICS. Print with avg ms */ /* format and print to terminal */ if (csv_format == 1) { /* only print out header once */ if (asym_header_printed == 0) { #ifdef GENERATE_MACHINE_PARSEABLE_REPORT #ifdef HAVE_GET_CYCLES - printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/sec," - "ops,secs,cycles,cycles/op\n"); + printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,ops," WOLFSSL_FIXED_TIME_UNIT + "ecs,cycles,cycles/op,"); #else - printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/sec," - "ops,secs\n"); + printf("%s", "\"asym\",Algorithm,key size,operation,avg ms,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,ops," WOLFSSL_FIXED_TIME_UNIT + "ecs,"); #endif #else printf("\n%sAsymmetric Ciphers:\n\n", info_prefix); - printf("%sAlgorithm,key size,operation,avg ms,ops/sec,\n", - info_prefix); + printf("%sAlgorithm,key size,operation,avg ms,ops/" + WOLFSSL_FIXED_TIME_UNIT "ec,", info_prefix); #endif + printf("\n"); asym_header_printed = 1; } #ifdef GENERATE_MACHINE_PARSEABLE_REPORT #ifdef HAVE_GET_CYCLES (void)XSNPRINTF(msg, sizeof(msg), - "asym,%s,%d,%s%s," FLT_FMT_PREC "," FLT_FMT_PREC ",%d," FLT_FMT - ",%lu," FLT_FMT_PREC "\n", - algo, strength, desc, desc_extra, FLT_FMT_PREC_ARGS(3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), - count, FLT_FMT_ARGS(total), (unsigned long) total_cycles, - FLT_FMT_PREC_ARGS(6, (double)total_cycles / (double)count)); + "asym,%s,%d,%s%s," FLT_FMT_PREC "," FLT_FMT_PREC ",%d," + FLT_FMT ",%lu," FLT_FMT_PREC STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + FLT_FMT_PREC_ARGS(3, milliEach), + FLT_FMT_PREC_ARGS(digits, opsSec), + count, FLT_FMT_ARGS(total), (unsigned long)total_cycles, + FLT_FMT_PREC_ARGS(6, + (double)total_cycles / (double)count)); #else (void)XSNPRINTF(msg, sizeof(msg), - "asym,%s,%d,%s%s," FLT_FMT_PREC "," FLT_FMT_PREC ",%d," FLT_FMT "\n", - algo, strength, desc, desc_extra, FLT_FMT_PREC_ARGS(3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), + "asym,%s,%d,%s%s," FLT_FMT_PREC "," FLT_FMT_PREC ",%d," + FLT_FMT STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + FLT_FMT_PREC_ARGS(3, milliEach), + FLT_FMT_PREC_ARGS(digits, opsSec), count, FLT_FMT_ARGS(total)); #endif #else - (void)XSNPRINTF(msg, sizeof(msg), "%s,%d,%s%s," FLT_FMT_PREC "," FLT_FMT_PREC ",\n", algo, - strength, desc, desc_extra, FLT_FMT_PREC_ARGS(3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec)); + (void)XSNPRINTF(msg, sizeof(msg), "%s,%d,%s%s," FLT_FMT_PREC "," + FLT_FMT_PREC "," STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + FLT_FMT_PREC_ARGS(3, milliEach), + FLT_FMT_PREC_ARGS(digits, opsSec)); #endif } /* if (csv_format == 1) */ @@ -2122,30 +2849,39 @@ #ifdef GENERATE_MACHINE_PARSEABLE_REPORT #ifdef HAVE_GET_CYCLES (void)XSNPRINTF(msg, sizeof(msg), - "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " FLT_FMT_PREC2 " ms," - " " FLT_FMT_PREC " %s, %lu cycles\n", algo, strength, desc, - desc_extra, BENCH_DEVID_GET_NAME(useDeviceID), - count, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], + "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " + FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s, %lu cycles" + STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], + FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], FLT_FMT_PREC2_ARGS(5, 3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), word[3], (unsigned long) total_cycles); + FLT_FMT_PREC_ARGS(digits, opsSec), word[3], + (unsigned long)total_cycles); #else (void)XSNPRINTF(msg, sizeof(msg), - "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " FLT_FMT_PREC2 " ms," - " " FLT_FMT_PREC " %s\n", algo, strength, desc, - desc_extra, BENCH_DEVID_GET_NAME(useDeviceID), - count, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], + "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " + FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s" + STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, + BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], + FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], FLT_FMT_PREC2_ARGS(5, 3, milliEach), - FLT_FMT_PREC_ARGS(3, opsSec), word[3]); + FLT_FMT_PREC_ARGS(digits, opsSec), word[3]); #endif /* HAVE_GET_CYCLES */ #else (void)XSNPRINTF(msg, sizeof(msg), - "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " FLT_FMT_PREC2 " ms," - " " FLT_FMT_PREC " %s\n", algo, strength, desc, desc_extra, + "%-6s %5d %8s%-2s %s %6d %s " FLT_FMT_PREC2 " %s, %s " + FLT_FMT_PREC2 " ms, " FLT_FMT_PREC " %s" + STATS_CLAUSE_SEPARATOR, + algo, strength, desc, desc_extra, BENCH_DEVID_GET_NAME(useDeviceID), count, word[0], FLT_FMT_PREC2_ARGS(5, 3, total), word[1], word[2], - FLT_FMT_PREC2_ARGS(5, 3, milliEach), FLT_FMT_PREC_ARGS(3, opsSec), word[3]); + FLT_FMT_PREC2_ARGS(5, 3, milliEach), + FLT_FMT_PREC_ARGS(digits, opsSec), word[3]); #endif } +#endif /* MULTI_VALUE_STATISTICS */ printf("%s", msg); /* show errors */ @@ -2158,14 +2894,18 @@ XFFLUSH(stdout); #endif +#ifdef WC_BENCH_TRACK_STATS /* Add to thread stats */ bench_stats_add(BENCH_STAT_ASYM, algo, strength, desc, useDeviceID, opsSec, kOpsSec, ret); +#endif (void)useDeviceID; (void)ret; +#ifdef WOLFSSL_LINUXKM_USE_SAVE_VECTOR_REGISTERS RESTORE_VECTOR_REGISTERS(); +#endif TEST_SLEEP(); } /* bench_stats_asym_finish_ex */ @@ -2181,7 +2921,7 @@ static WC_INLINE void bench_stats_free(void) { -#if defined(WOLFSSL_ASYNC_CRYPT) && !defined(WC_NO_ASYNC_THREADING) +#ifdef WC_BENCH_TRACK_STATS bench_stats_t* bstat; for (bstat = bench_stats_head; bstat != NULL; ) { bench_stats_t* next = bstat->next; @@ -2200,7 +2940,7 @@ static void* benchmarks_do(void* args) { - int bench_buf_size; + long bench_buf_size; #ifdef WOLFSSL_ASYNC_CRYPT #ifndef WC_NO_ASYNC_THREADING @@ -2284,8 +3024,101 @@ printf("%sBenchmark block buffer alloc failed!\n", err_prefix); goto exit; } - XMEMSET(bench_plain, 0, (size_t)bench_buf_size); - XMEMSET(bench_cipher, 0, (size_t)bench_buf_size); + +#ifndef NO_FILESYSTEM + if (hash_input) { + size_t rawSz; + XFILE file; + file = XFOPEN(hash_input, "rb"); + if (file == XBADFILE) + goto exit; + + if (XFSEEK(file, 0, XSEEK_END) != 0) { + XFCLOSE(file); + goto exit; + } + + bench_buf_size = XFTELL(file); + if(XFSEEK(file, 0, XSEEK_SET) != 0) { + XFCLOSE(file); + goto exit; + } + + XFREE(bench_plain, HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + rawSz = (size_t)bench_buf_size; + if (bench_buf_size % 16) + bench_buf_size += 16 - (bench_buf_size % 16); + + bench_size = (word32)bench_buf_size; + + bench_plain = (byte*)XMALLOC((size_t)bench_buf_size + 16*2, + HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + if (bench_plain == NULL) { + XFCLOSE(file); + goto exit; + } + + if ((size_t)XFREAD(bench_plain, 1, rawSz, file) + != rawSz) { + XFCLOSE(file); + goto exit; + } + + XFCLOSE(file); + } + else { + XMEMSET(bench_plain, 0, (size_t)bench_buf_size); + } + + if (cipher_input) { + size_t rawSz; + XFILE file; + file = XFOPEN(cipher_input, "rb"); + if (file == XBADFILE) + goto exit; + + if (XFSEEK(file, 0, XSEEK_END) != 0) { + XFCLOSE(file); + goto exit; + } + + bench_buf_size = XFTELL(file); + if(XFSEEK(file, 0, XSEEK_SET) != 0) { + XFCLOSE(file); + goto exit; + } + + XFREE(bench_cipher, HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + rawSz = (size_t)bench_buf_size; + if (bench_buf_size % 16) + bench_buf_size += 16 - (bench_buf_size % 16); + + if (bench_size > (word32)bench_buf_size) + bench_size = (word32)bench_buf_size; + + bench_cipher = (byte*)XMALLOC((size_t)bench_buf_size + 16*2, + HEAP_HINT, DYNAMIC_TYPE_WOLF_BIGINT); + + if (bench_cipher == NULL) { + XFCLOSE(file); + goto exit; + } + + if ((size_t)XFREAD(bench_cipher, 1, rawSz, file) + != rawSz) { + XFCLOSE(file); + goto exit; + } + + XFCLOSE(file); + } + else { + XMEMSET(bench_cipher, 0, (size_t)bench_buf_size); + } +#endif #if defined(WOLFSSL_ASYNC_CRYPT) || defined(HAVE_INTEL_QA_SYNC) bench_key = (byte*)XMALLOC(sizeof(bench_key_buf), @@ -2303,6 +3136,11 @@ } XMEMCPY(bench_key, bench_key_buf, sizeof(bench_key_buf)); XMEMCPY(bench_iv, bench_iv_buf, sizeof(bench_iv_buf)); +#elif defined(HAVE_RENESAS_SYNC) + bench_key1 = (byte*)guser_PKCbInfo.wrapped_key_aes128; + bench_key2 = (byte*)guser_PKCbInfo.wrapped_key_aes256; + bench_key = (byte*)bench_key_buf; + bench_iv = (byte*)bench_iv_buf; #else bench_key = (byte*)bench_key_buf; bench_iv = (byte*)bench_iv_buf; @@ -2318,7 +3156,7 @@ #ifndef NO_SW_BENCH bench_aescbc(0); #endif - #if defined(BENCH_DEVID) || defined(HAVE_RENESAS_SYNC) + #if defined(BENCH_DEVID) bench_aescbc(1); #endif } @@ -2334,8 +3172,12 @@ !defined(NO_HW_BENCH) bench_aes_aad_options_wrap(bench_aesgcm, 1); #endif - - bench_gmac(); + #ifndef NO_SW_BENCH + bench_gmac(0); + #endif + #if defined(BENCH_DEVID) + bench_gmac(1); + #endif } #endif #ifdef HAVE_AES_ECB @@ -2386,6 +3228,18 @@ if (bench_all || (bench_cipher_algs & BENCH_CAMELLIA)) bench_camellia(); #endif +#ifdef WOLFSSL_SM4_CBC + if (bench_all || (bench_cipher_algs & BENCH_SM4_CBC)) + bench_sm4_cbc(); +#endif +#ifdef WOLFSSL_SM4_GCM + if (bench_all || (bench_cipher_algs & BENCH_SM4_GCM)) + bench_sm4_gcm(); +#endif +#ifdef WOLFSSL_SM4_CCM + if (bench_all || (bench_cipher_algs & BENCH_SM4_CCM)) + bench_sm4_ccm(); +#endif #ifndef NO_RC4 if (bench_all || (bench_cipher_algs & BENCH_ARC4)) { #ifndef NO_SW_BENCH @@ -2565,6 +3419,16 @@ } #endif /* WOLFSSL_SHAKE256 */ #endif +#ifdef WOLFSSL_SM3 + if (bench_all || (bench_digest_algs & BENCH_SM3)) { + #ifndef NO_SW_BENCH + bench_sm3(0); + #endif + #ifdef BENCH_DEVID + bench_sm3(1); + #endif + } +#endif #ifdef WOLFSSL_RIPEMD if (bench_all || (bench_digest_algs & BENCH_RIPEMD)) bench_ripemd(); @@ -2652,12 +3516,18 @@ bench_pbkdf2(); } #endif - #ifdef WOLFSSL_SIPHASH - if (bench_all || (bench_mac_algs & BENCH_SIPHASH)) { - bench_siphash(); - } - #endif #endif /* NO_HMAC */ +#ifdef WOLFSSL_SIPHASH + if (bench_all || (bench_mac_algs & BENCH_SIPHASH)) { + bench_siphash(); + } +#endif + +#ifdef WC_SRTP_KDF + if (bench_all || (bench_kdf_algs & BENCH_SRTP_KDF)) { + bench_srtpkdf(); + } +#endif #ifdef HAVE_SCRYPT if (bench_all || (bench_other_algs & BENCH_SCRYPT)) @@ -2665,6 +3535,7 @@ #endif #ifndef NO_RSA +#ifndef HAVE_RENESAS_SYNC #ifdef WOLFSSL_KEY_GEN if (bench_all || (bench_asym_algs & BENCH_RSA_KEYGEN)) { #ifndef NO_SW_BENCH @@ -2706,6 +3577,7 @@ } #endif #endif +#endif #ifndef NO_DH if (bench_all || (bench_asym_algs & BENCH_DH)) { @@ -2719,19 +3591,57 @@ #endif #ifdef WOLFSSL_HAVE_KYBER - if (bench_all || (bench_asym_algs & BENCH_KYBER)) { + if (bench_all || (bench_pq_asym_algs & BENCH_KYBER)) { #ifdef WOLFSSL_KYBER512 - bench_kyber(KYBER512); + if (bench_all || (bench_pq_asym_algs & BENCH_KYBER512)) { + bench_kyber(KYBER512); + } #endif #ifdef WOLFSSL_KYBER768 - bench_kyber(KYBER768); + if (bench_all || (bench_pq_asym_algs & BENCH_KYBER768)) { + bench_kyber(KYBER768); + } #endif #ifdef WOLFSSL_KYBER1024 - bench_kyber(KYBER1024); + if (bench_all || (bench_pq_asym_algs & BENCH_KYBER1024)) { + bench_kyber(KYBER1024); + } #endif } #endif +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) + if (bench_all || (bench_pq_hash_sig_algs & BENCH_LMS_HSS)) { + bench_lms(); + } +#endif /* if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) */ + +#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY) + if (bench_all) { + bench_pq_hash_sig_algs |= BENCH_XMSS_XMSSMT; + } +#ifndef NO_SHA256 + if (bench_pq_hash_sig_algs & BENCH_XMSS_XMSSMT_SHA256) { + bench_xmss(WC_HASH_TYPE_SHA256); + } +#endif +#ifdef WOLFSSL_SHA512 + if (bench_pq_hash_sig_algs & BENCH_XMSS_XMSSMT_SHA512) { + bench_xmss(WC_HASH_TYPE_SHA512); + } +#endif +#ifdef WOLFSSL_SHAKE128 + if (bench_pq_hash_sig_algs & BENCH_XMSS_XMSSMT_SHAKE128) { + bench_xmss(WC_HASH_TYPE_SHAKE128); + } +#endif +#ifdef WOLFSSL_SHAKE256 + if (bench_pq_hash_sig_algs & BENCH_XMSS_XMSSMT_SHAKE256) { + bench_xmss(WC_HASH_TYPE_SHAKE256); + } +#endif +#endif /* if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY) */ + #ifdef HAVE_ECC if (bench_all || (bench_asym_algs & BENCH_ECC_MAKEKEY) || (bench_asym_algs & BENCH_ECC) || @@ -2754,7 +3664,7 @@ do { #ifdef WOLFCRYPT_HAVE_SAKKE - /* SAKKE is not useable with ECDH/ECDSA. Run separate test. */ + /* SAKKE is not usable with ECDH/ECDSA. Run separate test. */ if (curveId == ECC_SAKKE_1) { curveId++; continue; @@ -2795,6 +3705,11 @@ } } #endif +#ifdef WOLFSSL_SM2 + if (bench_all || (bench_asym_algs & BENCH_SM2)) { + bench_sm2(0); + } +#endif #ifdef HAVE_CURVE25519 if (bench_all || (bench_asym_algs & BENCH_CURVE25519_KEYGEN)) { @@ -2875,7 +3790,6 @@ #endif #endif -#if defined(HAVE_LIBOQS) #ifdef HAVE_FALCON if (bench_all || (bench_pq_asym_algs & BENCH_FALCON_LEVEL1_SIGN)) bench_falconKeySign(1); @@ -2883,13 +3797,19 @@ bench_falconKeySign(5); #endif #ifdef HAVE_DILITHIUM +#ifndef WOLFSSL_NO_ML_DSA_44 if (bench_all || (bench_pq_asym_algs & BENCH_DILITHIUM_LEVEL2_SIGN)) bench_dilithiumKeySign(2); +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 if (bench_all || (bench_pq_asym_algs & BENCH_DILITHIUM_LEVEL3_SIGN)) bench_dilithiumKeySign(3); +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 if (bench_all || (bench_pq_asym_algs & BENCH_DILITHIUM_LEVEL5_SIGN)) bench_dilithiumKeySign(5); #endif +#endif #ifdef HAVE_SPHINCS if (bench_all || (bench_pq_asym_algs2 & BENCH_SPHINCS_FAST_LEVEL1_SIGN)) bench_sphincsKeySign(1, FAST_VARIANT); @@ -2904,7 +3824,6 @@ if (bench_all || (bench_pq_asym_algs2 & BENCH_SPHINCS_SMALL_LEVEL5_SIGN)) bench_sphincsKeySign(5, SMALL_VARIANT); #endif -#endif /* HAVE_LIBOQS */ exit: /* free benchmark buffers */ @@ -3004,7 +3923,7 @@ { int ret; -#ifdef WC_ENABLE_BENCH_THREADING +#ifdef WC_BENCH_TRACK_STATS if (gPrintStats || devId != INVALID_DEVID) { bench_stats_print(); } @@ -3075,12 +3994,12 @@ } for (i = 0; i < g_threadCount; i++) { - PTHREAD_CHECK_RET(pthread_create(&g_threadData[i].thread_id, + THREAD_CHECK_RET(pthread_create(&g_threadData[i].thread_id, NULL, run_bench, args)); } for (i = 0; i < g_threadCount; i++) { - PTHREAD_CHECK_RET(pthread_join(g_threadData[i].thread_id, 0)); + THREAD_CHECK_RET(pthread_join(g_threadData[i].thread_id, 0)); } printf("\n"); @@ -3181,6 +4100,7 @@ double start; long pos, len, remain; WC_RNG myrng; + DECLARE_MULTI_VALUE_STATS_VARS() #ifndef HAVE_FIPS ret = wc_InitRng_ex(&myrng, HEAP_HINT, devId); @@ -3210,11 +4130,19 @@ remain -= len; pos += len; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_rng: bench_stats_sym_finish("RNG", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif wc_FreeRng(&myrng); } @@ -3229,28 +4157,36 @@ const byte* iv, const char* encLabel, const char* decLabel) { + const byte* in = bench_cipher; + byte* out = bench_plain; int ret = 0, i, count = 0, times, pending = 0; - Aes enc[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); double start; + DECLARE_MULTI_VALUE_STATS_VARS() - /* clear for done cleanup */ - XMEMSET(enc, 0, sizeof(enc)); + WC_CALLOC_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_AesInit(&enc[i], HEAP_HINT, + if ((ret = wc_AesInit(enc[i], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID)) != 0) { - printf("AesInit failed, ret = %d\n", ret); + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); goto exit; } - ret = wc_AesSetKey(&enc[i], key, keySz, iv, AES_ENCRYPTION); + ret = wc_AesSetKey(enc[i], key, keySz, iv, AES_ENCRYPTION); if (ret != 0) { printf("AesSetKey failed, ret = %d\n", ret); goto exit; } } + if (cipher_same_buffer) { + in = bench_plain; + } + bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks || pending > 0; ) { @@ -3258,24 +4194,31 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, numBlocks, &pending)) { - ret = wc_AesCbcEncrypt(&enc[i], bench_plain, bench_cipher, - bench_size); + ret = wc_AesCbcEncrypt(enc[i], out, in, bench_size); - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_aes_enc; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_aes_enc: bench_stats_sym_finish(encLabel, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif if (ret < 0) { goto exit; @@ -3284,13 +4227,15 @@ #ifdef HAVE_AES_DECRYPT /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_AesSetKey(&enc[i], key, keySz, iv, AES_DECRYPTION); + ret = wc_AesSetKey(enc[i], key, keySz, iv, AES_DECRYPTION); if (ret != 0) { printf("AesSetKey failed, ret = %d\n", ret); goto exit; } } + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks || pending > 0; ) { @@ -3298,48 +4243,69 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, numBlocks, &pending)) { - ret = wc_AesCbcDecrypt(&enc[i], bench_cipher, bench_plain, - bench_size); + ret = wc_AesCbcDecrypt(enc[i], out, in, bench_size); - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_aes_dec; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_aes_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ (void)decLabel; exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_AesFree(&enc[i]); + if (WC_ARRAY_OK(enc)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_AesFree(enc[i]); + } + WC_FREE_ARRAY(enc, BENCH_MAX_PENDING, HEAP_HINT); } } void bench_aescbc(int useDeviceID) { #ifdef WOLFSSL_AES_128 +#ifdef HAVE_RENESAS_SYNC + bench_aescbc_internal(useDeviceID, bench_key1, 16, bench_iv, + "AES-128-CBC-enc", "AES-128-CBC-dec"); +#else bench_aescbc_internal(useDeviceID, bench_key, 16, bench_iv, "AES-128-CBC-enc", "AES-128-CBC-dec"); #endif +#endif #ifdef WOLFSSL_AES_192 bench_aescbc_internal(useDeviceID, bench_key, 24, bench_iv, "AES-192-CBC-enc", "AES-192-CBC-dec"); #endif #ifdef WOLFSSL_AES_256 +#ifdef HAVE_RENESAS_SYNC + bench_aescbc_internal(useDeviceID, bench_key2, 32, bench_iv, + "AES-256-CBC-enc", "AES-256-CBC-dec"); +#else bench_aescbc_internal(useDeviceID, bench_key, 32, bench_iv, "AES-256-CBC-enc", "AES-256-CBC-dec"); #endif +#endif } #endif /* HAVE_AES_CBC */ @@ -3351,41 +4317,38 @@ const char* encLabel, const char* decLabel) { int ret = 0, i, count = 0, times, pending = 0; - Aes enc[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); #ifdef HAVE_AES_DECRYPT - Aes dec[BENCH_MAX_PENDING+1]; + WC_DECLARE_ARRAY(dec, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); #endif double start; - + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); -#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (bench_additional == NULL || bench_tag == NULL) { - printf("bench_aesgcm_internal malloc failed\n"); - goto exit; - } -#endif - /* clear for done cleanup */ - XMEMSET(enc, 0, sizeof(enc)); -#ifdef WOLFSSL_ASYNC_CRYPT - if (bench_additional) -#endif - XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); -#ifdef WOLFSSL_ASYNC_CRYPT - if (bench_tag) + WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); + WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); + WC_CALLOC_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); +#ifdef HAVE_AES_DECRYPT + WC_CALLOC_ARRAY(dec, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); #endif - XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); + + XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); + XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_AesInit(&enc[i], HEAP_HINT, + if ((ret = wc_AesInit(enc[i], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID)) != 0) { - printf("AesInit failed, ret = %d\n", ret); + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); goto exit; } - ret = wc_AesGcmSetKey(&enc[i], key, keySz); + ret = wc_AesGcmSetKey(enc[i], key, keySz); if (ret != 0) { printf("AesGcmSetKey failed, ret = %d\n", ret); goto exit; @@ -3400,37 +4363,47 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, numBlocks, &pending)) { - ret = wc_AesGcmEncrypt(&enc[i], bench_cipher, + ret = wc_AesGcmEncrypt(enc[i], bench_cipher, bench_plain, bench_size, iv, ivSz, bench_tag, AES_AUTH_TAG_SZ, bench_additional, aesAuthAddSz); - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_aes_gcm; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_aes_gcm: bench_stats_sym_finish(encLabel, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #ifdef HAVE_AES_DECRYPT - XMEMSET(dec, 0, sizeof(dec)); + + RESET_MULTI_VALUE_STATS_VARS(); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_AesInit(&dec[i], HEAP_HINT, + if ((ret = wc_AesInit(dec[i], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID)) != 0) { - printf("AesInit failed, ret = %d\n", ret); + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); goto exit; } - ret = wc_AesGcmSetKey(&dec[i], key, keySz); + ret = wc_AesGcmSetKey(dec[i], key, keySz); if (ret != 0) { printf("AesGcmSetKey failed, ret = %d\n", ret); goto exit; @@ -3444,25 +4417,33 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&dec[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(dec[i]), 0, ×, numBlocks, &pending)) { - ret = wc_AesGcmDecrypt(&dec[i], bench_plain, + ret = wc_AesGcmDecrypt(dec[i], bench_plain, bench_cipher, bench_size, iv, ivSz, bench_tag, AES_AUTH_TAG_SZ, bench_additional, aesAuthAddSz); - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&dec[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(dec[i]), 0, ×, &pending)) { goto exit_aes_gcm_dec; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_aes_gcm_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ (void)decLabel; @@ -3473,12 +4454,18 @@ printf("bench_aesgcm failed: %d\n", ret); } #ifdef HAVE_AES_DECRYPT - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_AesFree(&dec[i]); + if (WC_ARRAY_OK(dec)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_AesFree(dec[i]); + } + WC_FREE_ARRAY(dec, BENCH_MAX_PENDING, HEAP_HINT); } #endif - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_AesFree(&enc[i]); + if (WC_ARRAY_OK(enc)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_AesFree(enc[i]); + } + WC_FREE_ARRAY(enc, BENCH_MAX_PENDING, HEAP_HINT); } WC_FREE_VAR(bench_additional, HEAP_HINT); @@ -3491,44 +4478,40 @@ const char* encLabel, const char* decLabel) { int ret = 0, i, count = 0, times, pending = 0; - Aes enc[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); #ifdef HAVE_AES_DECRYPT - Aes dec[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(dec, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); #endif double start; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); -#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (bench_additional == NULL || bench_tag == NULL) { - printf("bench_aesgcm_internal malloc failed\n"); - goto exit; - } -#endif - /* clear for done cleanup */ - XMEMSET(enc, 0, sizeof(enc)); + WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); + WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); + + WC_CALLOC_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); #ifdef HAVE_AES_DECRYPT - XMEMSET(dec, 0, sizeof(dec)); -#endif -#ifdef WOLFSSL_ASYNC_CRYPT - if (bench_additional) -#endif - XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); -#ifdef WOLFSSL_ASYNC_CRYPT - if (bench_tag) + WC_CALLOC_ARRAY(dec, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); #endif - XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); + + XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); + XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_AesInit(&enc[i], HEAP_HINT, + if ((ret = wc_AesInit(enc[i], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID)) != 0) { - printf("AesInit failed, ret = %d\n", ret); + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); goto exit; } - ret = wc_AesGcmSetKey(&enc[i], key, keySz); + ret = wc_AesGcmSetKey(enc[i], key, keySz); if (ret != 0) { printf("AesGcmSetKey failed, ret = %d\n", ret); goto exit; @@ -3543,47 +4526,58 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, numBlocks, &pending)) { - ret = wc_AesGcmEncryptInit(&enc[i], NULL, 0, iv, ivSz); + ret = wc_AesGcmEncryptInit(enc[i], NULL, 0, iv, ivSz); if (ret == 0) { - ret = wc_AesGcmEncryptUpdate(&enc[i], bench_cipher, + ret = wc_AesGcmEncryptUpdate(enc[i], bench_cipher, bench_plain, bench_size, bench_additional, aesAuthAddSz); } if (ret == 0) { - ret = wc_AesGcmEncryptFinal(&enc[i], bench_tag, + ret = wc_AesGcmEncryptFinal(enc[i], bench_tag, AES_AUTH_TAG_SZ); } - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_aes_gcm; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_aes_gcm: bench_stats_sym_finish(encLabel, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #ifdef HAVE_AES_DECRYPT /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_AesInit(&dec[i], HEAP_HINT, + if ((ret = wc_AesInit(dec[i], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID)) != 0) { - printf("AesInit failed, ret = %d\n", ret); + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); goto exit; } - ret = wc_AesGcmSetKey(&dec[i], key, keySz); + ret = wc_AesGcmSetKey(dec[i], key, keySz); if (ret != 0) { printf("AesGcmSetKey failed, ret = %d\n", ret); goto exit; } } + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks || pending > 0; ) { @@ -3591,31 +4585,39 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&dec[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(dec[i]), 0, ×, numBlocks, &pending)) { - ret = wc_AesGcmDecryptInit(&enc[i], NULL, 0, iv, ivSz); + ret = wc_AesGcmDecryptInit(enc[i], NULL, 0, iv, ivSz); if (ret == 0) { - ret = wc_AesGcmDecryptUpdate(&enc[i], bench_plain, + ret = wc_AesGcmDecryptUpdate(enc[i], bench_plain, bench_cipher, bench_size, bench_additional, aesAuthAddSz); } if (ret == 0) { - ret = wc_AesGcmDecryptFinal(&enc[i], bench_tag, + ret = wc_AesGcmDecryptFinal(enc[i], bench_tag, AES_AUTH_TAG_SZ); } - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&dec[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(dec[i]), 0, ×, &pending)) { goto exit_aes_gcm_dec; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_aes_gcm_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ (void)decLabel; @@ -3626,12 +4628,18 @@ printf("bench_aesgcm failed: %d\n", ret); } #ifdef HAVE_AES_DECRYPT - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_AesFree(&dec[i]); + if (WC_ARRAY_OK(dec)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_AesFree(dec[i]); + } + WC_FREE_ARRAY(dec, BENCH_MAX_PENDING, HEAP_HINT); } #endif - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_AesFree(&enc[i]); + if (WC_ARRAY_OK(enc)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_AesFree(enc[i]); + } + WC_FREE_ARRAY(enc, BENCH_MAX_PENDING, HEAP_HINT); } WC_FREE_VAR(bench_additional, HEAP_HINT); @@ -3645,18 +4653,28 @@ #if defined(WOLFSSL_AES_128) && !defined(WOLFSSL_AFALG_XILINX_AES) \ && !defined(WOLFSSL_XILINX_CRYPT) \ || defined(WOLFSSL_XILINX_CRYPT_VERSAL) +#ifdef HAVE_RENESAS_SYNC + bench_aesgcm_internal(useDeviceID, bench_key1, 16, bench_iv, 12, + AES_GCM_STRING(128, enc), AES_GCM_STRING(128, dec)); +#else bench_aesgcm_internal(useDeviceID, bench_key, 16, bench_iv, 12, AES_GCM_STRING(128, enc), AES_GCM_STRING(128, dec)); #endif +#endif #if defined(WOLFSSL_AES_192) && !defined(WOLFSSL_AFALG_XILINX_AES) \ && !defined(WOLFSSL_XILINX_CRYPT) bench_aesgcm_internal(useDeviceID, bench_key, 24, bench_iv, 12, AES_GCM_STRING(192, enc), AES_GCM_STRING(192, dec)); #endif #ifdef WOLFSSL_AES_256 +#ifdef HAVE_RENESAS_SYNC + bench_aesgcm_internal(useDeviceID, bench_key2, 32, bench_iv, 12, + AES_GCM_STRING(256, enc), AES_GCM_STRING(256, dec)); +#else bench_aesgcm_internal(useDeviceID, bench_key, 32, bench_iv, 12, AES_GCM_STRING(256, enc), AES_GCM_STRING(256, dec)); #endif +#endif #ifdef WOLFSSL_AESGCM_STREAM #undef AES_GCM_STRING #define AES_GCM_STRING(n, dir) AES_AAD_STRING("AES-" #n "-GCM-STREAM-" #dir) @@ -3680,12 +4698,13 @@ } /* GMAC */ -void bench_gmac(void) +void bench_gmac(int useDeviceID) { int ret, count = 0; Gmac gmac; double start; byte tag[AES_AUTH_TAG_SZ]; + DECLARE_MULTI_VALUE_STATS_VARS() /* determine GCM GHASH method */ #ifdef GCM_SMALL @@ -3704,19 +4723,33 @@ XMEMSET(bench_plain, 0, bench_size); XMEMSET(tag, 0, sizeof(tag)); XMEMSET(&gmac, 0, sizeof(Gmac)); /* clear context */ - (void)wc_AesInit((Aes*)&gmac, HEAP_HINT, INVALID_DEVID); + (void)wc_AesInit((Aes*)&gmac, HEAP_HINT, + useDeviceID ? devId: INVALID_DEVID); +#ifdef HAVE_RENESAS_SYNC + wc_GmacSetKey(&gmac, bench_key1, 16); +#else wc_GmacSetKey(&gmac, bench_key, 16); - +#endif bench_stats_start(&count, &start); do { ret = wc_GmacUpdate(&gmac, bench_iv, 12, bench_plain, bench_size, tag, sizeof(tag)); count++; - } while (bench_stats_check(start)); + RECORD_MULTI_VALUE_STATS(); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + wc_AesFree((Aes*)&gmac); bench_stats_sym_finish(gmacStr, 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + } #endif /* HAVE_AESGCM */ @@ -3728,26 +4761,28 @@ const char* encLabel, const char* decLabel) { int ret = 0, i, count = 0, times, pending = 0; - Aes enc[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); double start; + DECLARE_MULTI_VALUE_STATS_VARS() #ifdef HAVE_FIPS - static const int benchSz = AES_BLOCK_SIZE; + const word32 benchSz = AES_BLOCK_SIZE; #else - static const int benchSz = BENCH_SIZE; + const word32 benchSz = bench_size; #endif - /* clear for done cleanup */ - XMEMSET(enc, 0, sizeof(enc)); + WC_CALLOC_ARRAY(enc, Aes, BENCH_MAX_PENDING, + sizeof(Aes), HEAP_HINT); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_AesInit(&enc[i], HEAP_HINT, + if ((ret = wc_AesInit(enc[i], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID)) != 0) { - printf("AesInit failed, ret = %d\n", ret); + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); goto exit; } - ret = wc_AesSetKey(&enc[i], key, keySz, bench_iv, AES_ENCRYPTION); + ret = wc_AesSetKey(enc[i], key, keySz, bench_iv, AES_ENCRYPTION); if (ret != 0) { printf("AesSetKey failed, ret = %d\n", ret); goto exit; @@ -3756,7 +4791,7 @@ bench_stats_start(&count, &start); do { - int outer_loop_limit = (((int)bench_size / benchSz) * 10) + 1; + int outer_loop_limit = (int)((bench_size / benchSz) * 10) + 1; for (times = 0; times < outer_loop_limit /* numBlocks */ || pending > 0; ) { @@ -3764,74 +4799,99 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, - ×, numBlocks, &pending)) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, + ×, outer_loop_limit, &pending)) { #ifdef HAVE_FIPS - wc_AesEncryptDirect(&enc[i], bench_cipher, bench_plain); + wc_AesEncryptDirect(enc[i], bench_cipher, bench_plain); #else - wc_AesEcbEncrypt(&enc[i], bench_cipher, bench_plain, + wc_AesEcbEncrypt(enc[i], bench_cipher, bench_plain, benchSz); #endif ret = 0; - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_aes_enc; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_aes_enc: bench_stats_sym_finish(encLabel, useDeviceID, count, benchSz, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #ifdef HAVE_AES_DECRYPT /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_AesSetKey(&enc[i], key, keySz, bench_iv, AES_DECRYPTION); + ret = wc_AesSetKey(enc[i], key, keySz, bench_iv, AES_DECRYPTION); if (ret != 0) { printf("AesSetKey failed, ret = %d\n", ret); goto exit; } } + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { - int outer_loop_limit = (10 * ((int)bench_size / benchSz)) + 1; + int outer_loop_limit = (int)(10 * (bench_size / benchSz)) + 1; for (times = 0; times < outer_loop_limit || pending > 0; ) { bench_async_poll(&pending); /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, - ×, numBlocks, &pending)) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, + ×, outer_loop_limit, &pending)) { #ifdef HAVE_FIPS - wc_AesDecryptDirect(&enc[i], bench_plain, bench_cipher); + wc_AesDecryptDirect(enc[i], bench_plain, bench_cipher); #else - wc_AesEcbDecrypt(&enc[i], bench_plain, bench_cipher, + wc_AesEcbDecrypt(enc[i], bench_plain, bench_cipher, benchSz); #endif ret = 0; - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_aes_dec; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_aes_dec: bench_stats_sym_finish(decLabel, useDeviceID, count, benchSz, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #endif /* HAVE_AES_DECRYPT */ + (void)decLabel; + exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_AesFree(&enc[i]); + if (WC_ARRAY_OK(enc)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_AesFree(enc[i]); + } + WC_FREE_ARRAY(enc, BENCH_MAX_PENDING, HEAP_HINT); } } @@ -3860,11 +4920,18 @@ Aes enc; double start; int i, ret, count; + DECLARE_MULTI_VALUE_STATS_VARS() + + ret = wc_AesInit(&enc, HEAP_HINT, INVALID_DEVID); + if (ret != 0) { + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); + return; + } ret = wc_AesSetKey(&enc, key, keySz, iv, AES_ENCRYPTION); if (ret != 0) { printf("AesSetKey failed, ret = %d\n", ret); - return; + goto out; } bench_stats_start(&count, &start); @@ -3873,12 +4940,26 @@ if((ret = wc_AesCfbEncrypt(&enc, bench_plain, bench_cipher, bench_size)) != 0) { printf("wc_AesCfbEncrypt failed, ret = %d\n", ret); - return; + goto out; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(label, 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +out: + + wc_AesFree(&enc); + return; } void bench_aescfb(void) @@ -3904,10 +4985,11 @@ Aes enc; double start; int i, ret, count; + DECLARE_MULTI_VALUE_STATS_VARS() ret = wc_AesInit(&enc, NULL, INVALID_DEVID); if (ret != 0) { - printf("AesInit failed, ret = %d\n", ret); + printf("AesInit failed at L%d, ret = %d\n", __LINE__, ret); return; } @@ -3925,10 +5007,19 @@ printf("wc_AesCfbEncrypt failed, ret = %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(label, 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif wc_AesFree(&enc); } @@ -3951,64 +5042,91 @@ #ifdef WOLFSSL_AES_XTS void bench_aesxts(void) { - XtsAes aes; + WC_DECLARE_VAR(aes, XtsAes, 1, HEAP_HINT); double start; int i, count, ret; + DECLARE_MULTI_VALUE_STATS_VARS() - static unsigned char k1[] = { + static const unsigned char k1[] = { 0xa1, 0xb9, 0x0c, 0xba, 0x3f, 0x06, 0xac, 0x35, 0x3b, 0x2c, 0x34, 0x38, 0x76, 0x08, 0x17, 0x62, 0x09, 0x09, 0x23, 0x02, 0x6e, 0x91, 0x77, 0x18, 0x15, 0xf2, 0x9d, 0xab, 0x01, 0x93, 0x2f, 0x2f }; - static unsigned char i1[] = { + static const unsigned char i1[] = { 0x4f, 0xae, 0xf7, 0x11, 0x7c, 0xda, 0x59, 0xc6, 0x6e, 0x4b, 0x92, 0x01, 0x3e, 0x76, 0x8a, 0xd5 }; - ret = wc_AesXtsSetKey(&aes, k1, sizeof(k1), AES_ENCRYPTION, + WC_ALLOC_VAR(aes, XtsAes, 1, HEAP_HINT); + + ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_ENCRYPTION, HEAP_HINT, devId); if (ret != 0) { printf("wc_AesXtsSetKey failed, ret = %d\n", ret); - return; + goto exit; } bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { - if ((ret = wc_AesXtsEncrypt(&aes, bench_cipher, bench_plain, + if ((ret = wc_AesXtsEncrypt(aes, bench_cipher, bench_plain, bench_size, i1, sizeof(i1))) != 0) { printf("wc_AesXtsEncrypt failed, ret = %d\n", ret); - return; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("AES-XTS-enc", 0, count, bench_size, start, ret); - wc_AesXtsFree(&aes); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + wc_AesXtsFree(aes); /* decryption benchmark */ - ret = wc_AesXtsSetKey(&aes, k1, sizeof(k1), AES_DECRYPTION, + ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_DECRYPTION, HEAP_HINT, devId); if (ret != 0) { printf("wc_AesXtsSetKey failed, ret = %d\n", ret); - return; + goto exit; } + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { - if ((ret = wc_AesXtsDecrypt(&aes, bench_plain, bench_cipher, + if ((ret = wc_AesXtsDecrypt(aes, bench_plain, bench_cipher, bench_size, i1, sizeof(i1))) != 0) { printf("wc_AesXtsDecrypt failed, ret = %d\n", ret); - return; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("AES-XTS-dec", 0, count, bench_size, start, ret); - wc_AesXtsFree(&aes); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +exit: + + wc_AesXtsFree(aes); + WC_FREE_VAR(aes, HEAP_HINT); } #endif /* WOLFSSL_AES_XTS */ @@ -4021,6 +5139,7 @@ Aes enc; double start; int i, count, ret = 0; + DECLARE_MULTI_VALUE_STATS_VARS() if ((ret = wc_AesInit(&enc, HEAP_HINT, useDeviceID ? devId : INVALID_DEVID)) != 0) { @@ -4040,10 +5159,19 @@ printf("wc_AesCtrEncrypt failed, ret = %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(label, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif wc_AesFree(&enc); } @@ -4067,24 +5195,23 @@ void bench_aesccm(int useDeviceID) { Aes enc; + int enc_inited = 0; double start; int ret, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); -#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (bench_additional == NULL || bench_tag == NULL) { - printf("bench_aesccm malloc failed\n"); - goto exit; - } -#endif + WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); + WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); if ((ret = wc_AesInit(&enc, HEAP_HINT, - useDeviceID ? devId : INVALID_DEVID)) != 0) { + useDeviceID ? devId : INVALID_DEVID)) != 0) + { printf("wc_AesInit failed, ret = %d\n", ret); goto exit; } @@ -4093,6 +5220,7 @@ printf("wc_AesCcmSetKey failed, ret = %d\n", ret); goto exit; } + enc_inited = 1; bench_stats_start(&count, &start); do { @@ -4100,34 +5228,59 @@ ret |= wc_AesCcmEncrypt(&enc, bench_cipher, bench_plain, bench_size, bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, bench_additional, 0); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(AES_AAD_STRING("AES-CCM-enc"), useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif if (ret != 0) { printf("wc_AesCcmEncrypt failed, ret = %d\n", ret); goto exit; } +#ifdef HAVE_AES_DECRYPT + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { ret |= wc_AesCcmDecrypt(&enc, bench_plain, bench_cipher, bench_size, bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, bench_additional, 0); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(AES_AAD_STRING("AES-CCM-dec"), useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif if (ret != 0) { printf("wc_AesCcmEncrypt failed, ret = %d\n", ret); goto exit; } +#endif exit: + if (enc_inited) + wc_AesFree(&enc); + WC_FREE_VAR(bench_additional, HEAP_HINT); WC_FREE_VAR(bench_tag, HEAP_HINT); } @@ -4145,6 +5298,7 @@ byte siv[AES_BLOCK_SIZE]; int count = 0; double start; + DECLARE_MULTI_VALUE_STATS_VARS() bench_stats_start(&count, &start); do { @@ -4156,10 +5310,21 @@ printf("wc_AesSivEncrypt failed (%d)\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(encLabel, 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); bench_stats_start(&count, &start); do { @@ -4171,10 +5336,19 @@ printf("wc_AesSivDecrypt failed (%d)\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(decLabel, 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } void bench_aessiv(void) @@ -4194,6 +5368,7 @@ byte mac[16]; double start; int ret = 0, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() if (digest_stream) { ret = wc_Poly1305SetKey(&enc, bench_key, 32); @@ -4210,11 +5385,15 @@ printf("Poly1305Update failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } wc_Poly1305Final(&enc, mac); count += i; - } while (bench_stats_check(start)); - bench_stats_sym_finish("POLY1305", 0, count, bench_size, start, ret); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -4231,11 +5410,19 @@ break; } wc_Poly1305Final(&enc, mac); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); - bench_stats_sym_finish("POLY1305", 0, count, bench_size, start, ret); - } + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + } + bench_stats_sym_finish("POLY1305", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #endif /* HAVE_POLY1305 */ @@ -4246,6 +5433,7 @@ Camellia cam; double start; int ret, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() ret = wc_CamelliaSetKey(&cam, bench_key, 16, bench_iv); if (ret != 0) { @@ -4262,33 +5450,269 @@ printf("CamelliaCbcEncrypt failed: %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("Camellia", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif +} +#endif + +#ifdef WOLFSSL_SM4_CBC +void bench_sm4_cbc(void) +{ + wc_Sm4 sm4; + double start; + int ret; + int i; + int count; + DECLARE_MULTI_VALUE_STATS_VARS() + + ret = wc_Sm4SetKey(&sm4, bench_key, SM4_KEY_SIZE); + if (ret != 0) { + printf("Sm4SetKey failed, ret = %d\n", ret); + return; + } + ret = wc_Sm4SetIV(&sm4, bench_iv); + if (ret != 0) { + printf("Sm4SetIV failed, ret = %d\n", ret); + return; + } + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_Sm4CbcEncrypt(&sm4, bench_cipher, bench_plain, bench_size); + if (ret < 0) { + printf("Sm4CbcEncrypt failed: %d\n", ret); + return; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("SM4-CBC-enc", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_Sm4CbcDecrypt(&sm4, bench_plain, bench_cipher, bench_size); + if (ret < 0) { + printf("Sm4CbcDecrypt failed: %d\n", ret); + return; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("SM4-CBC-dec", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #endif +#ifdef WOLFSSL_SM4_GCM +void bench_sm4_gcm(void) +{ + wc_Sm4 sm4; + double start; + int ret; + int i; + int count; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); + WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); + + WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); + WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); + + ret = wc_Sm4GcmSetKey(&sm4, bench_key, SM4_KEY_SIZE); + if (ret != 0) { + printf("Sm4GcmSetKey failed, ret = %d\n", ret); + goto exit; + } + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_Sm4GcmEncrypt(&sm4, bench_cipher, bench_plain, bench_size, + bench_iv, GCM_NONCE_MID_SZ, bench_tag, SM4_BLOCK_SIZE, + bench_additional, aesAuthAddSz); + if (ret < 0) { + printf("Sm4GcmEncrypt failed: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("SM4-GCM-enc", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_Sm4GcmDecrypt(&sm4, bench_plain, bench_cipher, bench_size, + bench_iv, GCM_NONCE_MID_SZ, bench_tag, SM4_BLOCK_SIZE, + bench_additional, aesAuthAddSz); + if (ret < 0) { + printf("Sm4GcmDecrypt failed: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("SM4-GCM-dec", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +exit: + + WC_FREE_VAR(bench_additional, HEAP_HINT); + WC_FREE_VAR(bench_tag, HEAP_HINT); +} +#endif + +#ifdef WOLFSSL_SM4_CCM +void bench_sm4_ccm(void) +{ + wc_Sm4 enc; + double start; + int ret, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_DECLARE_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); + WC_DECLARE_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); + + WC_ALLOC_VAR(bench_additional, byte, AES_AUTH_ADD_SZ, HEAP_HINT); + WC_ALLOC_VAR(bench_tag, byte, AES_AUTH_TAG_SZ, HEAP_HINT); + + XMEMSET(bench_tag, 0, AES_AUTH_TAG_SZ); + XMEMSET(bench_additional, 0, AES_AUTH_ADD_SZ); + + if ((ret = wc_Sm4SetKey(&enc, bench_key, 16)) != 0) { + printf("wc_Sm4SetKey failed, ret = %d\n", ret); + goto exit; + } + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret |= wc_Sm4CcmEncrypt(&enc, bench_cipher, bench_plain, bench_size, + bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, + bench_additional, 0); + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("SM4-CCM-enc", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + if (ret != 0) { + printf("wc_Sm4Encrypt failed, ret = %d\n", ret); + goto exit; + } + + RESET_MULTI_VALUE_STATS_VARS(); + + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret |= wc_Sm4CcmDecrypt(&enc, bench_plain, bench_cipher, bench_size, + bench_iv, 12, bench_tag, AES_AUTH_TAG_SZ, + bench_additional, 0); + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_sym_finish("SM4-CCM-dec", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + if (ret != 0) { + printf("wc_Sm4Decrypt failed, ret = %d\n", ret); + goto exit; + } + exit: + + WC_FREE_VAR(bench_additional, HEAP_HINT); + WC_FREE_VAR(bench_tag, HEAP_HINT); +} +#endif /* HAVE_AESCCM */ #ifndef NO_DES3 void bench_des(int useDeviceID) { int ret = 0, i, count = 0, times, pending = 0; - Des3 enc[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(enc, Des3, BENCH_MAX_PENDING, + sizeof(Des3), HEAP_HINT); double start; + DECLARE_MULTI_VALUE_STATS_VARS() - /* clear for done cleanup */ - XMEMSET(enc, 0, sizeof(enc)); + WC_CALLOC_ARRAY(enc, Des3, BENCH_MAX_PENDING, + sizeof(Des3), HEAP_HINT); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_Des3Init(&enc[i], HEAP_HINT, + if ((ret = wc_Des3Init(enc[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID)) != 0) { printf("Des3Init failed, ret = %d\n", ret); goto exit; } - ret = wc_Des3_SetKey(&enc[i], bench_key, bench_iv, DES_ENCRYPTION); + ret = wc_Des3_SetKey(enc[i], bench_key, bench_iv, DES_ENCRYPTION); if (ret != 0) { printf("Des3_SetKey failed, ret = %d\n", ret); goto exit; @@ -4302,27 +5726,39 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Des3_CbcEncrypt(&enc[i], + ret = wc_Des3_CbcEncrypt(enc[i], bench_cipher, bench_plain, bench_size); - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_3des; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_3des: bench_stats_sym_finish("3DES", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Des3Free(&enc[i]); + if (WC_ARRAY_OK(enc)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Des3Free(enc[i]); + } + WC_FREE_ARRAY(enc, BENCH_MAX_PENDING, HEAP_HINT); } } #endif /* !NO_DES3 */ @@ -4332,21 +5768,23 @@ void bench_arc4(int useDeviceID) { int ret = 0, i, count = 0, times, pending = 0; - Arc4 enc[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(enc, Arc4, BENCH_MAX_PENDING, + sizeof(Arc4), HEAP_HINT); double start; + DECLARE_MULTI_VALUE_STATS_VARS() - /* clear for done cleanup */ - XMEMSET(enc, 0, sizeof(enc)); + WC_CALLOC_ARRAY(enc, Arc4, BENCH_MAX_PENDING, + sizeof(Arc4), HEAP_HINT); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if ((ret = wc_Arc4Init(&enc[i], HEAP_HINT, + if ((ret = wc_Arc4Init(enc[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID)) != 0) { printf("Arc4Init failed, ret = %d\n", ret); goto exit; } - ret = wc_Arc4SetKey(&enc[i], bench_key, 16); + ret = wc_Arc4SetKey(enc[i], bench_key, 16); if (ret != 0) { printf("Arc4SetKey failed, ret = %d\n", ret); goto exit; @@ -4360,26 +5798,38 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), 0, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Arc4Process(&enc[i], bench_cipher, bench_plain, + ret = wc_Arc4Process(enc[i], bench_cipher, bench_plain, bench_size); - if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(&enc[i]), + if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV(enc[i]), 0, ×, &pending)) { goto exit_arc4; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_arc4: bench_stats_sym_finish("ARC4", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Arc4Free(&enc[i]); + if (WC_ARRAY_OK(enc)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Arc4Free(enc[i]); + } + WC_FREE_ARRAY(enc, BENCH_MAX_PENDING, HEAP_HINT); } } #endif /* !NO_RC4 */ @@ -4388,21 +5838,72 @@ #ifdef HAVE_CHACHA void bench_chacha(void) { - ChaCha enc; + WC_DECLARE_VAR(enc, ChaCha, 1, HEAP_HINT); double start; - int i, count; + int ret, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() - wc_Chacha_SetKey(&enc, bench_key, 16); + WC_ALLOC_VAR(enc, ChaCha, 1, HEAP_HINT); - bench_stats_start(&count, &start); - do { - for (i = 0; i < numBlocks; i++) { - wc_Chacha_SetIV(&enc, bench_iv, 0); - wc_Chacha_Process(&enc, bench_cipher, bench_plain, bench_size); + XMEMSET(enc, 0, sizeof(ChaCha)); + wc_Chacha_SetKey(enc, bench_key, 16); + + if (encrypt_only) { + ret = wc_Chacha_SetIV(enc, bench_iv, 0); + if (ret < 0) { + printf("wc_Chacha_SetIV error: %d\n", ret); + goto exit; } - count += i; - } while (bench_stats_check(start)); + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_Chacha_Process(enc, bench_cipher, bench_plain, + bench_size); + if (ret < 0) { + printf("wc_Chacha_Process error: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + } + else { + bench_stats_start(&count, &start); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_Chacha_SetIV(enc, bench_iv, 0); + if (ret < 0) { + printf("wc_Chacha_SetIV error: %d\n", ret); + goto exit; + } + ret = wc_Chacha_Process(enc, bench_cipher, bench_plain, + bench_size); + if (ret < 0) { + printf("wc_Chacha_Process error: %d\n", ret); + goto exit; + } + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + } + bench_stats_sym_finish("CHACHA", 0, count, bench_size, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +exit: + WC_FREE_VAR(enc, HEAP_HINT); } #endif /* HAVE_CHACHA*/ @@ -4411,9 +5912,11 @@ { double start; int ret = 0, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() - byte authTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; - XMEMSET(authTag, 0, sizeof(authTag)); + WC_DECLARE_VAR(authTag, byte, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE, HEAP_HINT); + WC_ALLOC_VAR(authTag, byte, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE, HEAP_HINT); + XMEMSET(authTag, 0, CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE); bench_stats_start(&count, &start); do { @@ -4422,12 +5925,25 @@ bench_plain, bench_size, bench_cipher, authTag); if (ret < 0) { printf("wc_ChaCha20Poly1305_Encrypt error: %d\n", ret); - break; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("CHA-POLY", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +exit: + + WC_FREE_VAR(authTag, HEAP_HINT); } #endif /* HAVE_CHACHA && HAVE_POLY1305 */ @@ -4435,28 +5951,30 @@ #ifndef NO_MD5 void bench_md5(int useDeviceID) { - wc_Md5 hash[BENCH_MAX_PENDING]; - double start; + WC_DECLARE_ARRAY(hash, wc_Md5, BENCH_MAX_PENDING, + sizeof(wc_Md5), HEAP_HINT); + double start = 0; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_MD5_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_MD5_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Md5, BENCH_MAX_PENDING, + sizeof(wc_Md5), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_MD5_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitMd5_ex(&hash[i], HEAP_HINT, + ret = wc_InitMd5_ex(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitMd5_ex failed, ret = %d\n", ret); goto exit; } #ifdef WOLFSSL_PIC32MZ_HASH - wc_Md5SizeSet(&hash[i], numBlocks * bench_size); + wc_Md5SizeSet(hash[i], numBlocks * bench_size); #endif } @@ -4467,17 +5985,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Md5Update(&hash[i], bench_plain, + ret = wc_Md5Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_md5; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -4486,45 +6005,60 @@ bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Md5Final(&hash[i], digest[i]); + ret = wc_Md5Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_md5; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitMd5_ex(hash, HEAP_HINT, INVALID_DEVID); + ret = wc_InitMd5_ex(hash[0], HEAP_HINT, INVALID_DEVID); if (ret == 0) - ret = wc_Md5Update(hash, bench_plain, bench_size); + ret = wc_Md5Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Md5Final(hash, digest[0]); + ret = wc_Md5Final(hash[0], digest[0]); if (ret != 0) goto exit_md5; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_md5: bench_stats_sym_finish("MD5", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: #ifdef WOLFSSL_ASYNC_CRYPT - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Md5Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Md5Free(hash[i]); + } } #endif + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* !NO_MD5 */ @@ -4533,28 +6067,30 @@ #ifndef NO_SHA void bench_sha(int useDeviceID) { - wc_Sha hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha, BENCH_MAX_PENDING, + sizeof(wc_Sha), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha, BENCH_MAX_PENDING, + sizeof(wc_Sha), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha_ex(&hash[i], HEAP_HINT, + ret = wc_InitSha_ex(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha failed, ret = %d\n", ret); goto exit; } #ifdef WOLFSSL_PIC32MZ_HASH - wc_ShaSizeSet(&hash[i], numBlocks * bench_size); + wc_ShaSizeSet(hash[i], numBlocks * bench_size); #endif } @@ -4565,17 +6101,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_ShaUpdate(&hash[i], bench_plain, + ret = wc_ShaUpdate(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -4584,44 +6121,58 @@ bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_ShaFinal(&hash[i], digest[i]); + ret = wc_ShaFinal(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha_ex(hash, HEAP_HINT, + ret = wc_InitSha_ex(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_ShaUpdate(hash, bench_plain, bench_size); + ret = wc_ShaUpdate(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_ShaFinal(hash, digest[0]); + ret = wc_ShaFinal(hash[0], digest[0]); if (ret != 0) goto exit_sha; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha: bench_stats_sym_finish("SHA", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_ShaFree(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_ShaFree(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* NO_SHA */ @@ -4630,21 +6181,23 @@ #ifdef WOLFSSL_SHA224 void bench_sha224(int useDeviceID) { - wc_Sha224 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha224, BENCH_MAX_PENDING, + sizeof(wc_Sha224), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA224_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA224_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha224, BENCH_MAX_PENDING, + sizeof(wc_Sha224), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA224_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha224_ex(&hash[i], HEAP_HINT, + ret = wc_InitSha224_ex(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha224_ex failed, ret = %d\n", ret); @@ -4659,17 +6212,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha224Update(&hash[i], bench_plain, + ret = wc_Sha224Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha224; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -4677,74 +6231,90 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha224Final(&hash[i], digest[i]); + ret = wc_Sha224Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha224; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha224_ex(hash, HEAP_HINT, + ret = wc_InitSha224_ex(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha224Update(hash, bench_plain, bench_size); + ret = wc_Sha224Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha224Final(hash, digest[0]); + ret = wc_Sha224Final(hash[0], digest[0]); if (ret != 0) goto exit_sha224; } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha224: bench_stats_sym_finish("SHA-224", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha224Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha224Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif + #ifndef NO_SHA256 void bench_sha256(int useDeviceID) { - wc_Sha256 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha256, BENCH_MAX_PENDING, + sizeof(wc_Sha256), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA256_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA256_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha256, BENCH_MAX_PENDING, + sizeof(wc_Sha256), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA256_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha256_ex(&hash[i], HEAP_HINT, + ret = wc_InitSha256_ex(hash[i], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID); if (ret != 0) { printf("InitSha256_ex failed, ret = %d\n", ret); goto exit; } #ifdef WOLFSSL_PIC32MZ_HASH - wc_Sha256SizeSet(&hash[i], numBlocks * bench_size); + wc_Sha256SizeSet(hash[i], numBlocks * bench_size); #endif } @@ -4755,17 +6325,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha256Update(&hash[i], bench_plain, + ret = wc_Sha256Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha256; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -4773,45 +6344,57 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha256Final(&hash[i], digest[i]); + ret = wc_Sha256Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha256; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha256_ex(hash, HEAP_HINT, + ret = wc_InitSha256_ex(hash[0], HEAP_HINT, useDeviceID ? devId: INVALID_DEVID); if (ret == 0) - ret = wc_Sha256Update(hash, bench_plain, bench_size); + ret = wc_Sha256Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha256Final(hash, digest[0]); + ret = wc_Sha256Final(hash[0], digest[0]); if (ret != 0) goto exit_sha256; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha256: bench_stats_sym_finish("SHA-256", useDeviceID, count, bench_size, start, ret); - +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha256Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha256Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif @@ -4819,21 +6402,23 @@ #ifdef WOLFSSL_SHA384 void bench_sha384(int useDeviceID) { - wc_Sha384 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha384, BENCH_MAX_PENDING, + sizeof(wc_Sha384), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA384_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA384_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha384, BENCH_MAX_PENDING, + sizeof(wc_Sha384), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA384_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha384_ex(&hash[i], HEAP_HINT, + ret = wc_InitSha384_ex(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha384_ex failed, ret = %d\n", ret); @@ -4848,17 +6433,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha384Update(&hash[i], bench_plain, + ret = wc_Sha384Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha384; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -4866,45 +6452,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha384Final(&hash[i], digest[i]); + ret = wc_Sha384Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha384; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha384_ex(hash, HEAP_HINT, + ret = wc_InitSha384_ex(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha384Update(hash, bench_plain, bench_size); + ret = wc_Sha384Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha384Final(hash, digest[0]); + ret = wc_Sha384Final(hash[0], digest[0]); if (ret != 0) goto exit_sha384; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha384: bench_stats_sym_finish("SHA-384", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha384Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha384Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif @@ -4912,21 +6512,23 @@ #ifdef WOLFSSL_SHA512 void bench_sha512(int useDeviceID) { - wc_Sha512 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha512, BENCH_MAX_PENDING, + sizeof(wc_Sha512), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA512_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha512, BENCH_MAX_PENDING, + sizeof(wc_Sha512), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA512_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha512_ex(&hash[i], HEAP_HINT, + ret = wc_InitSha512_ex(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha512_ex failed, ret = %d\n", ret); @@ -4941,17 +6543,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha512Update(&hash[i], bench_plain, + ret = wc_Sha512Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha512; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -4959,45 +6562,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha512Final(&hash[i], digest[i]); + ret = wc_Sha512Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha512; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha512_ex(hash, HEAP_HINT, + ret = wc_InitSha512_ex(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha512Update(hash, bench_plain, bench_size); + ret = wc_Sha512Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha512Final(hash, digest[0]); + ret = wc_Sha512Final(hash[0], digest[0]); if (ret != 0) goto exit_sha512; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha512: bench_stats_sym_finish("SHA-512", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha512Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha512Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } @@ -5005,21 +6622,23 @@ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) void bench_sha512_224(int useDeviceID) { - wc_Sha512_224 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha512_224, BENCH_MAX_PENDING, + sizeof(wc_Sha512_224), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_224_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA512_224_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha512_224, BENCH_MAX_PENDING, + sizeof(wc_Sha512_224), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA512_224_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha512_224_ex(&hash[i], HEAP_HINT, + ret = wc_InitSha512_224_ex(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha512_224_ex failed, ret = %d\n", ret); @@ -5034,17 +6653,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha512_224Update(&hash[i], bench_plain, + ret = wc_Sha512_224Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha512_224; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5052,45 +6672,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha512_224Final(&hash[i], digest[i]); + ret = wc_Sha512_224Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha512_224; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha512_224_ex(hash, HEAP_HINT, + ret = wc_InitSha512_224_ex(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha512_224Update(hash, bench_plain, bench_size); + ret = wc_Sha512_224Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha512_224Final(hash, digest[0]); + ret = wc_Sha512_224Final(hash[0], digest[0]); if (ret != 0) goto exit_sha512_224; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha512_224: bench_stats_sym_finish("SHA-512/224", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha512_224Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha512_224Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_NOSHA512_224 && !FIPS ... */ @@ -5099,21 +6733,23 @@ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) void bench_sha512_256(int useDeviceID) { - wc_Sha512_256 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha512_256, BENCH_MAX_PENDING, + sizeof(wc_Sha512_256), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA512_256_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA512_256_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha512_256, BENCH_MAX_PENDING, + sizeof(wc_Sha512_256), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA512_256_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha512_256_ex(&hash[i], HEAP_HINT, + ret = wc_InitSha512_256_ex(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha512_256_ex failed, ret = %d\n", ret); @@ -5128,17 +6764,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha512_256Update(&hash[i], bench_plain, + ret = wc_Sha512_256Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha512_256; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5146,45 +6783,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha512_256Final(&hash[i], digest[i]); + ret = wc_Sha512_256Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha512_256; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha512_256_ex(hash, HEAP_HINT, + ret = wc_InitSha512_256_ex(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha512_256Update(hash, bench_plain, bench_size); + ret = wc_Sha512_256Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha512_256Final(hash, digest[0]); + ret = wc_Sha512_256Final(hash[0], digest[0]); if (ret != 0) goto exit_sha512_256; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha512_256: bench_stats_sym_finish("SHA-512/256", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha512_256Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha512_256Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_NOSHA512_256 && !FIPS ... */ @@ -5196,21 +6847,23 @@ #ifndef WOLFSSL_NOSHA3_224 void bench_sha3_224(int useDeviceID) { - wc_Sha3 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_224_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA3_224_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA3_224_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha3_224(&hash[i], HEAP_HINT, + ret = wc_InitSha3_224(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha3_224 failed, ret = %d\n", ret); @@ -5225,17 +6878,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_224_Update(&hash[i], bench_plain, + ret = wc_Sha3_224_Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_224; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5243,45 +6897,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_224_Final(&hash[i], digest[i]); + ret = wc_Sha3_224_Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_224; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha3_224(hash, HEAP_HINT, + ret = wc_InitSha3_224(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha3_224_Update(hash, bench_plain, bench_size); + ret = wc_Sha3_224_Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha3_224_Final(hash, digest[0]); + ret = wc_Sha3_224_Final(hash[0], digest[0]); if (ret != 0) goto exit_sha3_224; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha3_224: bench_stats_sym_finish("SHA3-224", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha3_224_Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha3_224_Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_NOSHA3_224 */ @@ -5289,21 +6957,23 @@ #ifndef WOLFSSL_NOSHA3_256 void bench_sha3_256(int useDeviceID) { - wc_Sha3 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); double start; + DECLARE_MULTI_VALUE_STATS_VARS() int ret = 0, i, count = 0, times, pending = 0; WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_256_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA3_256_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA3_256_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha3_256(&hash[i], HEAP_HINT, + ret = wc_InitSha3_256(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha3_256 failed, ret = %d\n", ret); @@ -5318,17 +6988,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_256_Update(&hash[i], bench_plain, + ret = wc_Sha3_256_Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_256; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5336,45 +7007,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_256_Final(&hash[i], digest[i]); + ret = wc_Sha3_256_Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_256; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha3_256(hash, HEAP_HINT, + ret = wc_InitSha3_256(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha3_256_Update(hash, bench_plain, bench_size); + ret = wc_Sha3_256_Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha3_256_Final(hash, digest[0]); + ret = wc_Sha3_256_Final(hash[0], digest[0]); if (ret != 0) goto exit_sha3_256; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha3_256: bench_stats_sym_finish("SHA3-256", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha3_256_Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha3_256_Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_NOSHA3_256 */ @@ -5382,21 +7067,23 @@ #ifndef WOLFSSL_NOSHA3_384 void bench_sha3_384(int useDeviceID) { - wc_Sha3 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_384_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA3_384_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA3_384_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha3_384(&hash[i], HEAP_HINT, + ret = wc_InitSha3_384(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha3_384 failed, ret = %d\n", ret); @@ -5411,17 +7098,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_384_Update(&hash[i], bench_plain, + ret = wc_Sha3_384_Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_384; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5429,45 +7117,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_384_Final(&hash[i], digest[i]); + ret = wc_Sha3_384_Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_384; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha3_384(hash, HEAP_HINT, + ret = wc_InitSha3_384(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha3_384_Update(hash, bench_plain, bench_size); + ret = wc_Sha3_384_Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha3_384_Final(hash, digest[0]); + ret = wc_Sha3_384_Final(hash[0], digest[0]); if (ret != 0) goto exit_sha3_384; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha3_384: bench_stats_sym_finish("SHA3-384", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha3_384_Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha3_384_Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_NOSHA3_384 */ @@ -5475,21 +7177,23 @@ #ifndef WOLFSSL_NOSHA3_512 void bench_sha3_512(int useDeviceID) { - wc_Sha3 hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_512_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA3_512_DIGEST_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Sha3, BENCH_MAX_PENDING, + sizeof(wc_Sha3), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA3_512_DIGEST_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitSha3_512(&hash[i], HEAP_HINT, + ret = wc_InitSha3_512(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitSha3_512 failed, ret = %d\n", ret); @@ -5504,17 +7208,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_512_Update(&hash[i], bench_plain, + ret = wc_Sha3_512_Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_512; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5522,45 +7227,59 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Sha3_512_Final(&hash[i], digest[i]); + ret = wc_Sha3_512_Final(hash[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_sha3_512; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitSha3_512(hash, HEAP_HINT, + ret = wc_InitSha3_512(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Sha3_512_Update(hash, bench_plain, bench_size); + ret = wc_Sha3_512_Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Sha3_512_Final(hash, digest[0]); + ret = wc_Sha3_512_Final(hash[0], digest[0]); if (ret != 0) goto exit_sha3_512; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_sha3_512: bench_stats_sym_finish("SHA3-512", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Sha3_512_Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sha3_512_Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_NOSHA3_512 */ @@ -5568,21 +7287,23 @@ #ifdef WOLFSSL_SHAKE128 void bench_shake128(int useDeviceID) { - wc_Shake hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Shake, BENCH_MAX_PENDING, + sizeof(wc_Shake), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_128_BLOCK_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA3_128_BLOCK_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Shake, BENCH_MAX_PENDING, + sizeof(wc_Shake), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA3_128_BLOCK_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitShake128(&hash[i], HEAP_HINT, + ret = wc_InitShake128(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitShake128 failed, ret = %d\n", ret); @@ -5597,17 +7318,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Shake128_Update(&hash[i], bench_plain, + ret = wc_Shake128_Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_shake128; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5615,47 +7337,61 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Shake128_Final(&hash[i], digest[i], + ret = wc_Shake128_Final(hash[i], digest[i], WC_SHA3_128_BLOCK_SIZE); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_shake128; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitShake128(hash, HEAP_HINT, + ret = wc_InitShake128(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Shake128_Update(hash, bench_plain, bench_size); + ret = wc_Shake128_Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Shake128_Final(hash, digest[0], + ret = wc_Shake128_Final(hash[0], digest[0], WC_SHA3_128_BLOCK_SIZE); if (ret != 0) goto exit_shake128; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_shake128: bench_stats_sym_finish("SHAKE128", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Shake128_Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Shake128_Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_SHAKE128 */ @@ -5663,21 +7399,23 @@ #ifdef WOLFSSL_SHAKE256 void bench_shake256(int useDeviceID) { - wc_Shake hash[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hash, wc_Shake, BENCH_MAX_PENDING, + sizeof(wc_Shake), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SHA3_256_BLOCK_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, - WC_SHA3_256_BLOCK_SIZE, HEAP_HINT); - /* clear for done cleanup */ - XMEMSET(hash, 0, sizeof(hash)); + WC_CALLOC_ARRAY(hash, wc_Shake, BENCH_MAX_PENDING, + sizeof(wc_Shake), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_SHA3_256_BLOCK_SIZE, HEAP_HINT); if (digest_stream) { /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_InitShake256(&hash[i], HEAP_HINT, + ret = wc_InitShake256(hash[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("InitShake256 failed, ret = %d\n", ret); @@ -5692,17 +7430,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Shake256_Update(&hash[i], bench_plain, + ret = wc_Shake256_Update(hash[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_shake256; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; @@ -5710,52 +7449,173 @@ do { bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&hash[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, numBlocks, &pending)) { - ret = wc_Shake256_Final(&hash[i], digest[i], + ret = wc_Shake256_Final(hash[i], digest[i], WC_SHA3_256_BLOCK_SIZE); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hash[i]), 0, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { goto exit_shake256; } } } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); do { for (times = 0; times < numBlocks; times++) { - ret = wc_InitShake256(hash, HEAP_HINT, + ret = wc_InitShake256(hash[0], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret == 0) - ret = wc_Shake256_Update(hash, bench_plain, bench_size); + ret = wc_Shake256_Update(hash[0], bench_plain, bench_size); if (ret == 0) - ret = wc_Shake256_Final(hash, digest[0], + ret = wc_Shake256_Final(hash[0], digest[0], WC_SHA3_256_BLOCK_SIZE); if (ret != 0) goto exit_shake256; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } exit_shake256: bench_stats_sym_finish("SHAKE256", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_Shake256_Free(&hash[i]); + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Shake256_Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); } - WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); } #endif /* WOLFSSL_SHAKE256 */ #endif +#ifdef WOLFSSL_SM3 +void bench_sm3(int useDeviceID) +{ + WC_DECLARE_ARRAY(hash, wc_Sm3, BENCH_MAX_PENDING, + sizeof(wc_Sm3), HEAP_HINT); + double start; + int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() + WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SM3_DIGEST_SIZE, + HEAP_HINT); + + WC_CALLOC_ARRAY(hash, wc_Sm3, BENCH_MAX_PENDING, + sizeof(wc_Sm3), HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_SM3_DIGEST_SIZE, + HEAP_HINT); + + if (digest_stream) { + /* init keys */ + for (i = 0; i < BENCH_MAX_PENDING; i++) { + ret = wc_InitSm3(hash[i], HEAP_HINT, + useDeviceID ? devId: INVALID_DEVID); + if (ret != 0) { + printf("InitSm3 failed, ret = %d\n", ret); + goto exit; + } + } + + bench_stats_start(&count, &start); + do { + for (times = 0; times < numBlocks || pending > 0; ) { + bench_async_poll(&pending); + + /* while free pending slots in queue, submit ops */ + for (i = 0; i < BENCH_MAX_PENDING; i++) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), + 0, ×, numBlocks, &pending)) { + ret = wc_Sm3Update(hash[i], bench_plain, + bench_size); + if (!bench_async_handle(&ret, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { + goto exit_sm3; + } + } + } /* for i */ + RECORD_MULTI_VALUE_STATS(); + } /* for times */ + count += times; + + times = 0; + do { + bench_async_poll(&pending); + for (i = 0; i < BENCH_MAX_PENDING; i++) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(hash[i]), + 0, ×, numBlocks, &pending)) { + ret = wc_Sm3Final(hash[i], digest[i]); + if (!bench_async_handle(&ret, + BENCH_ASYNC_GET_DEV(hash[i]), 0, ×, &pending)) { + goto exit_sm3; + } + } + } /* for i */ + } while (pending > 0); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + } + else { + bench_stats_start(&count, &start); + do { + for (times = 0; times < numBlocks; times++) { + ret = wc_InitSm3(hash[0], HEAP_HINT, + useDeviceID ? devId: INVALID_DEVID); + if (ret == 0) + ret = wc_Sm3Update(hash[0], bench_plain, bench_size); + if (ret == 0) + ret = wc_Sm3Final(hash[0], digest[0]); + if (ret != 0) + goto exit_sm3; + RECORD_MULTI_VALUE_STATS(); + } /* for times */ + count += times; + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + } +exit_sm3: + bench_stats_sym_finish("SM3", useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +exit: + + if (WC_ARRAY_OK(hash)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_Sm3Free(hash[i]); + } + WC_FREE_ARRAY(hash, BENCH_MAX_PENDING, HEAP_HINT); + } + WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); +} +#endif + #ifdef WOLFSSL_RIPEMD void bench_ripemd(void) @@ -5764,6 +7624,7 @@ byte digest[RIPEMD_DIGEST_SIZE]; double start; int i, count, ret = 0; + DECLARE_MULTI_VALUE_STATS_VARS() if (digest_stream) { ret = wc_InitRipeMd(&hash); @@ -5780,6 +7641,7 @@ printf("wc_RipeMdUpdate failed, retval %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } ret = wc_RipeMdFinal(&hash, digest); if (ret != 0) { @@ -5788,7 +7650,11 @@ } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5809,11 +7675,19 @@ printf("wc_RipeMdFinal failed, retval %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } bench_stats_sym_finish("RIPEMD", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif return; } @@ -5827,6 +7701,7 @@ byte digest[64]; double start; int ret = 0, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() if (digest_stream) { ret = wc_InitBlake2b(&b2b, 64); @@ -5843,6 +7718,7 @@ printf("Blake2bUpdate failed, ret = %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } ret = wc_Blake2bFinal(&b2b, digest, 64); if (ret != 0) { @@ -5850,7 +7726,11 @@ return; } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5871,11 +7751,19 @@ printf("Blake2bFinal failed, ret = %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } bench_stats_sym_finish("BLAKE2b", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #endif @@ -5886,6 +7774,7 @@ byte digest[32]; double start; int ret = 0, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() if (digest_stream) { ret = wc_InitBlake2s(&b2s, 32); @@ -5902,6 +7791,7 @@ printf("Blake2sUpdate failed, ret = %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } ret = wc_Blake2sFinal(&b2s, digest, 32); if (ret != 0) { @@ -5909,7 +7799,11 @@ return; } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } else { bench_stats_start(&count, &start); @@ -5930,11 +7824,19 @@ printf("Blake2sFinal failed, ret = %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); } bench_stats_sym_finish("BLAKE2s", 0, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #endif @@ -5948,6 +7850,7 @@ word32 digestSz = sizeof(digest); double start; int ret, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() #ifdef WOLFSSL_SECO_CAAM unsigned int keyID; int keyGroup = 1; /* group one was chosen arbitrarily */ @@ -5992,6 +7895,7 @@ printf("CmacUpdate failed, ret = %d\n", ret); return; } + RECORD_MULTI_VALUE_STATS(); } /* Note: final force zero's the Cmac struct */ ret = wc_CmacFinal(&cmac, digest, &digestSz); @@ -6000,8 +7904,16 @@ return; } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish(outMsg, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } void bench_cmac(int useDeviceID) @@ -6023,6 +7935,7 @@ byte derived[64]; double start; int ret, i, count; + DECLARE_MULTI_VALUE_STATS_VARS() bench_stats_start(&count, &start); do { @@ -6034,11 +7947,20 @@ printf("scrypt failed, ret = %d\n", ret); goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("scrypt", 17, "", 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #endif /* HAVE_SCRYPT */ @@ -6048,13 +7970,15 @@ static void bench_hmac(int useDeviceID, int type, int digestSz, const byte* key, word32 keySz, const char* label) { - Hmac hmac[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(hmac, Hmac, BENCH_MAX_PENDING, + sizeof(Hmac), HEAP_HINT); double start; int ret = 0, i, count = 0, times, pending = 0; + DECLARE_MULTI_VALUE_STATS_VARS() #ifdef WOLFSSL_ASYNC_CRYPT WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_MAX_DIGEST_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, WC_MAX_DIGEST_SIZE, HEAP_HINT); #else byte digest[BENCH_MAX_PENDING][WC_MAX_DIGEST_SIZE]; @@ -6062,19 +7986,19 @@ (void)digestSz; - /* clear for done cleanup */ - XMEMSET(hmac, 0, sizeof(hmac)); + WC_CALLOC_ARRAY(hmac, Hmac, BENCH_MAX_PENDING, + sizeof(Hmac), HEAP_HINT); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - ret = wc_HmacInit(&hmac[i], HEAP_HINT, + ret = wc_HmacInit(hmac[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) { printf("wc_HmacInit failed for %s, ret = %d\n", label, ret); goto exit; } - ret = wc_HmacSetKey(&hmac[i], type, key, keySz); + ret = wc_HmacSetKey(hmac[i], type, key, keySz); if (ret != 0) { printf("wc_HmacSetKey failed for %s, ret = %d\n", label, ret); goto exit; @@ -6089,11 +8013,11 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { if (bench_async_check(&ret, - BENCH_ASYNC_GET_DEV(&hmac[i]), 0, + BENCH_ASYNC_GET_DEV(hmac[i]), 0, ×, numBlocks, &pending)) { - ret = wc_HmacUpdate(&hmac[i], bench_plain, bench_size); + ret = wc_HmacUpdate(hmac[i], bench_plain, bench_size); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hmac[i]), + BENCH_ASYNC_GET_DEV(hmac[i]), 0, ×, &pending)) { goto exit_hmac; } @@ -6108,27 +8032,37 @@ for (i = 0; i < BENCH_MAX_PENDING; i++) { if (bench_async_check(&ret, - BENCH_ASYNC_GET_DEV(&hmac[i]), 0, + BENCH_ASYNC_GET_DEV(hmac[i]), 0, ×, numBlocks, &pending)) { - ret = wc_HmacFinal(&hmac[i], digest[i]); + ret = wc_HmacFinal(hmac[i], digest[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&hmac[i]), + BENCH_ASYNC_GET_DEV(hmac[i]), 0, ×, &pending)) { goto exit_hmac; } } + RECORD_MULTI_VALUE_STATS(); } /* for i */ } while (pending > 0); - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_hmac: bench_stats_sym_finish(label, useDeviceID, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_HmacFree(&hmac[i]); + wc_HmacFree(hmac[i]); } + WC_FREE_ARRAY(hmac, BENCH_MAX_PENDING, HEAP_HINT); #ifdef WOLFSSL_ASYNC_CRYPT WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); #endif @@ -6246,14 +8180,26 @@ 0x78, 0x57, 0x8E, 0x5a, 0x5d, 0x63, 0xcb, 0x06, 0x78, 0x57, 0x8E, 0x5a, 0x5d, 0x63, 0xcb, 0x06 }; byte derived[32]; + DECLARE_MULTI_VALUE_STATS_VARS() bench_stats_start(&count, &start); + PRIVATE_KEY_UNLOCK(); do { ret = wc_PBKDF2(derived, (const byte*)passwd32, (int)XSTRLEN(passwd32), salt32, (int)sizeof(salt32), 1000, 32, WC_SHA256); count++; - } while (bench_stats_check(start)); + RECORD_MULTI_VALUE_STATS(); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); + bench_stats_sym_finish("PBKDF2", 32, count, 32, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #endif /* !NO_PWDBASED */ @@ -6267,26 +8213,157 @@ const char* passwd16 = "passwordpassword"; byte out[16]; int i; + DECLARE_MULTI_VALUE_STATS_VARS() bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { ret = wc_SipHash((const byte*)passwd16, bench_plain, bench_size, out, 8); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SipHash-8", 1, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); bench_stats_start(&count, &start); do { for (i = 0; i < numBlocks; i++) { ret = wc_SipHash((const byte*)passwd16, bench_plain, bench_size, out, 16); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_sym_finish("SipHash-16", 1, count, bench_size, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif +} +#endif + +#ifdef WC_SRTP_KDF +void bench_srtpkdf(void) +{ + double start; + int count; + int ret = 0; + byte keyE[32]; + byte keyA[20]; + byte keyS[14]; + const byte *key = bench_key_buf; + const byte salt[14] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e }; + const byte index[6] = { 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA }; + int kdrIdx = 0; + int i; + DECLARE_MULTI_VALUE_STATS_VARS() + + bench_stats_start(&count, &start); + PRIVATE_KEY_UNLOCK(); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_SRTP_KDF(key, AES_128_KEY_SIZE, salt, sizeof(salt), + kdrIdx, index, keyE, AES_128_KEY_SIZE, keyA, sizeof(keyA), + keyS, sizeof(keyS)); + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); + bench_stats_asym_finish("KDF", 128, "SRTP", 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); + + bench_stats_start(&count, &start); + PRIVATE_KEY_UNLOCK(); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_SRTP_KDF(key, AES_256_KEY_SIZE, salt, sizeof(salt), + kdrIdx, index, keyE, AES_256_KEY_SIZE, keyA, sizeof(keyA), + keyS, sizeof(keyS)); + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); + bench_stats_asym_finish("KDF", 256, "SRTP", 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); + + bench_stats_start(&count, &start); + PRIVATE_KEY_UNLOCK(); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_SRTCP_KDF(key, AES_128_KEY_SIZE, salt, sizeof(salt), + kdrIdx, index, keyE, AES_128_KEY_SIZE, keyA, sizeof(keyA), + keyS, sizeof(keyS)); + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); + bench_stats_asym_finish("KDF", 128, "SRTCP", 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); + + bench_stats_start(&count, &start); + PRIVATE_KEY_UNLOCK(); + do { + for (i = 0; i < numBlocks; i++) { + ret = wc_SRTCP_KDF(key, AES_256_KEY_SIZE, salt, sizeof(salt), + kdrIdx, index, keyE, AES_256_KEY_SIZE, keyA, sizeof(keyA), + keyS, sizeof(keyS)); + RECORD_MULTI_VALUE_STATS(); + } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); + bench_stats_asym_finish("KDF", 256, "SRTCP", 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + } #endif @@ -6295,27 +8372,16 @@ #if defined(WOLFSSL_KEY_GEN) static void bench_rsaKeyGen_helper(int useDeviceID, word32 keySz) { -#ifdef WOLFSSL_SMALL_STACK - RsaKey *genKey; -#else - RsaKey genKey[BENCH_MAX_PENDING]; -#endif - double start; + WC_DECLARE_ARRAY(genKey, RsaKey, BENCH_MAX_PENDING, + sizeof(RsaKey), HEAP_HINT); + double start = 0; int ret = 0, i, count = 0, times, pending = 0; const long rsa_e_val = WC_RSA_EXPONENT; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() -#ifdef WOLFSSL_SMALL_STACK - genKey = (RsaKey *)XMALLOC(sizeof(*genKey) * BENCH_MAX_PENDING, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (genKey == NULL) { - printf("bench_rsaKeyGen_helper malloc failed\n"); - return; - } -#endif - - /* clear for done cleanup */ - XMEMSET(genKey, 0, sizeof(*genKey) * BENCH_MAX_PENDING); + WC_CALLOC_ARRAY(genKey, RsaKey, BENCH_MAX_PENDING, + sizeof(RsaKey), HEAP_HINT); bench_stats_start(&count, &start); do { @@ -6324,39 +8390,45 @@ bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&genKey[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 0, ×, genTimes, &pending)) { - - wc_FreeRsaKey(&genKey[i]); - ret = wc_InitRsaKey_ex(&genKey[i], HEAP_HINT, devId); + wc_FreeRsaKey(genKey[i]); + ret = wc_InitRsaKey_ex(genKey[i], HEAP_HINT, devId); if (ret < 0) { goto exit; } - ret = wc_MakeRsaKey(&genKey[i], (int)keySz, rsa_e_val, + ret = wc_MakeRsaKey(genKey[i], (int)keySz, rsa_e_val, &gRng); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&genKey[i]), 0, + BENCH_ASYNC_GET_DEV(genKey[i]), 0, ×, &pending)) { goto exit; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("RSA", (int)keySz, desc[2], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif /* cleanup */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_FreeRsaKey(&genKey[i]); + wc_FreeRsaKey(genKey[i]); } -#ifdef WOLFSSL_SMALL_STACK - XFREE(genKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); -#endif + WC_FREE_ARRAY(genKey, BENCH_MAX_PENDING, HEAP_HINT); } void bench_rsaKeyGen(int useDeviceID) @@ -6487,7 +8559,11 @@ #endif #endif /* WOLFSSL_RSA_VERIFY_INLINE || WOLFSSL_RSA_PUBLIC_ONLY */ -static void bench_rsa_helper(int useDeviceID, RsaKey rsaKey[BENCH_MAX_PENDING], +static void bench_rsa_helper(int useDeviceID, + WC_ARRAY_ARG(rsaKey, + RsaKey, + BENCH_MAX_PENDING, + sizeof(RsaKey)), word32 rsaKeySz) { int ret = 0, i, times, count = 0, pending = 0; @@ -6498,44 +8574,42 @@ #endif double start = 0.0F; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() #ifndef WOLFSSL_RSA_VERIFY_ONLY WC_DECLARE_VAR(message, byte, TEST_STRING_SZ, HEAP_HINT); #endif - WC_DECLARE_ARRAY_DYNAMIC_DEC(enc, byte, BENCH_MAX_PENDING, + WC_DECLARE_HEAP_ARRAY(enc, byte, BENCH_MAX_PENDING, rsaKeySz, HEAP_HINT); - #if ( !defined(WOLFSSL_RSA_VERIFY_INLINE) \ - && !defined(WOLFSSL_RSA_PUBLIC_ONLY) ) - WC_DECLARE_ARRAY_DYNAMIC_DEC(out, byte, BENCH_MAX_PENDING, - rsaKeySz, HEAP_HINT); - #else - byte* out[BENCH_MAX_PENDING]; - #endif +#if (!defined(WOLFSSL_RSA_VERIFY_INLINE) && \ + !defined(WOLFSSL_RSA_PUBLIC_ONLY)) + WC_DECLARE_HEAP_ARRAY(out, byte, BENCH_MAX_PENDING, + rsaKeySz, HEAP_HINT); +#else + byte* out[BENCH_MAX_PENDING]; +#endif - WC_DECLARE_ARRAY_DYNAMIC_EXE(enc, byte, BENCH_MAX_PENDING, + XMEMSET(out, 0, sizeof(out)); + + WC_ALLOC_HEAP_ARRAY(enc, byte, BENCH_MAX_PENDING, rsaKeySz, HEAP_HINT); - #if ( !defined(WOLFSSL_RSA_VERIFY_INLINE) \ - && !defined(WOLFSSL_RSA_PUBLIC_ONLY) ) - WC_DECLARE_ARRAY_DYNAMIC_EXE(out, byte, BENCH_MAX_PENDING, - rsaKeySz, HEAP_HINT); - if (out[0] == NULL) { - ret = MEMORY_E; - goto exit; - } - #endif - if (enc[0] == NULL) { +#if (!defined(WOLFSSL_RSA_VERIFY_INLINE) && \ + !defined(WOLFSSL_RSA_PUBLIC_ONLY)) + WC_ALLOC_HEAP_ARRAY(out, byte, BENCH_MAX_PENDING, + rsaKeySz, HEAP_HINT); + if (out[0] == NULL) { ret = MEMORY_E; goto exit; } - -#ifndef WOLFSSL_RSA_VERIFY_ONLY - #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (message == NULL) { +#endif + if (enc[0] == NULL) { ret = MEMORY_E; goto exit; } - #endif + +#ifndef WOLFSSL_RSA_VERIFY_ONLY + WC_ALLOC_VAR(message, byte, TEST_STRING_SZ, HEAP_HINT); XMEMCPY(message, messageStr, len); #endif @@ -6550,25 +8624,34 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { if (bench_async_check(&ret, - BENCH_ASYNC_GET_DEV(&rsaKey[i]), + BENCH_ASYNC_GET_DEV(rsaKey[i]), 1, ×, ntimes, &pending)) { ret = wc_RsaPublicEncrypt(message, (word32)len, enc[i], - rsaKeySz/8, &rsaKey[i], + rsaKeySz/8, rsaKey[i], GLOBAL_RNG); if (!bench_async_handle(&ret, BENCH_ASYNC_GET_DEV( - &rsaKey[i]), 1, ×, + rsaKey[i]), 1, ×, &pending)) { goto exit_rsa_verify; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + exit_rsa_verify: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[0], useDeviceID, count, start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif #endif /* !WOLFSSL_RSA_VERIFY_ONLY */ #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -6576,6 +8659,8 @@ goto exit; } + RESET_MULTI_VALUE_STATS_VARS(); + /* capture resulting encrypt length */ idx = (word32)(rsaKeySz/8); @@ -6588,23 +8673,32 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { if (bench_async_check(&ret, - BENCH_ASYNC_GET_DEV(&rsaKey[i]), + BENCH_ASYNC_GET_DEV(rsaKey[i]), 1, ×, ntimes, &pending)) { ret = wc_RsaPrivateDecrypt(enc[i], idx, out[i], - rsaKeySz/8, &rsaKey[i]); + rsaKeySz/8, rsaKey[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&rsaKey[i]), + BENCH_ASYNC_GET_DEV(rsaKey[i]), 1, ×, &pending)) { goto exit_rsa_pub; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + exit_rsa_pub: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[1], useDeviceID, count, start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif #endif /* !WOLFSSL_RSA_PUBLIC_ONLY */ } else { @@ -6618,27 +8712,38 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { if (bench_async_check(&ret, - BENCH_ASYNC_GET_DEV(&rsaKey[i]), + BENCH_ASYNC_GET_DEV(rsaKey[i]), 1, ×, ntimes, &pending)) { ret = wc_RsaSSL_Sign(message, len, enc[i], - rsaKeySz/8, &rsaKey[i], GLOBAL_RNG); + rsaKeySz/8, rsaKey[i], GLOBAL_RNG); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&rsaKey[i]), + BENCH_ASYNC_GET_DEV(rsaKey[i]), 1, ×, &pending)) { goto exit_rsa_sign; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); + exit_rsa_sign: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[4], useDeviceID, count, start, ret); - + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif if (ret < 0) { goto exit; } + + RESET_MULTI_VALUE_STATS_VARS(); + #endif /* !WOLFSSL_RSA_PUBLIC_ONLY && !WOLFSSL_RSA_VERIFY_ONLY */ /* capture resulting encrypt length */ @@ -6653,18 +8758,18 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { if (bench_async_check(&ret, - BENCH_ASYNC_GET_DEV(&rsaKey[i]), + BENCH_ASYNC_GET_DEV(rsaKey[i]), 1, ×, ntimes, &pending)) { #if !defined(WOLFSSL_RSA_VERIFY_INLINE) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY) ret = wc_RsaSSL_Verify(enc[i], idx, out[i], - rsaKeySz/8, &rsaKey[i]); + rsaKeySz/8, rsaKey[i]); #elif defined(USE_CERT_BUFFERS_2048) XMEMCPY(enc[i], rsa_2048_sig, sizeof(rsa_2048_sig)); idx = sizeof(rsa_2048_sig); out[i] = NULL; ret = wc_RsaSSL_VerifyInline(enc[i], idx, - &out[i], &rsaKey[i]); + &out[i], rsaKey[i]); if (ret > 0) { ret = 0; } @@ -6674,31 +8779,39 @@ idx = sizeof(rsa_3072_sig); out[i] = NULL; ret = wc_RsaSSL_VerifyInline(enc[i], idx, - &out[i], &rsaKey[i]); + &out[i], rsaKey[i]); if (ret > 0) ret = 0; #endif if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&rsaKey[i]), + BENCH_ASYNC_GET_DEV(rsaKey[i]), 1, ×, &pending)) { goto exit_rsa_verifyinline; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) + #ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs + #endif + ); exit_rsa_verifyinline: bench_stats_asym_finish("RSA", (int)rsaKeySz, desc[5], useDeviceID, count, start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif } exit: - WC_FREE_ARRAY_DYNAMIC(enc, BENCH_MAX_PENDING, HEAP_HINT); + WC_FREE_HEAP_ARRAY(enc, BENCH_MAX_PENDING, HEAP_HINT); #if !defined(WOLFSSL_RSA_VERIFY_INLINE) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) - WC_FREE_ARRAY_DYNAMIC(out, BENCH_MAX_PENDING, HEAP_HINT); + WC_FREE_HEAP_ARRAY(out, BENCH_MAX_PENDING, HEAP_HINT); #endif #ifndef WOLFSSL_RSA_VERIFY_ONLY WC_FREE_VAR(message, HEAP_HINT); @@ -6708,11 +8821,8 @@ void bench_rsa(int useDeviceID) { int i; -#ifdef WOLFSSL_SMALL_STACK - RsaKey *rsaKey; -#else - RsaKey rsaKey[BENCH_MAX_PENDING]; -#endif + WC_DECLARE_ARRAY(rsaKey, RsaKey, BENCH_MAX_PENDING, + sizeof(RsaKey), HEAP_HINT); int ret = 0; word32 rsaKeySz = 0; const byte* tmp; @@ -6721,14 +8831,8 @@ word32 idx; #endif -#ifdef WOLFSSL_SMALL_STACK - rsaKey = (RsaKey *)XMALLOC(sizeof(*rsaKey) * BENCH_MAX_PENDING, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (rsaKey == NULL) { - printf("bench_rsa malloc failed\n"); - return; - } -#endif + WC_CALLOC_ARRAY(rsaKey, RsaKey, BENCH_MAX_PENDING, + sizeof(RsaKey), HEAP_HINT); #ifdef USE_CERT_BUFFERS_1024 tmp = rsa_key_der_1024; @@ -6750,23 +8854,20 @@ #error "need a cert buffer size" #endif /* USE_CERT_BUFFERS */ - /* clear for done cleanup */ - XMEMSET(rsaKey, 0, sizeof(*rsaKey) * BENCH_MAX_PENDING); - /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { /* setup an async context for each key */ - ret = wc_InitRsaKey_ex(&rsaKey[i], HEAP_HINT, + ret = wc_InitRsaKey_ex(rsaKey[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret < 0) { - goto exit_bench_rsa; + goto exit; } #if !defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY) #ifdef WC_RSA_BLINDING - ret = wc_RsaSetRNG(&rsaKey[i], &gRng); + ret = wc_RsaSetRNG(rsaKey[i], &gRng); if (ret != 0) - goto exit_bench_rsa; + goto exit; #endif #endif @@ -6774,9 +8875,9 @@ /* decode the private key */ idx = 0; if ((ret = wc_RsaPrivateKeyDecode(tmp, &idx, - &rsaKey[i], (word32)bytes)) != 0) { + rsaKey[i], (word32)bytes)) != 0) { printf("wc_RsaPrivateKeyDecode failed! %d\n", ret); - goto exit_bench_rsa; + goto exit; } #elif defined(WOLFSSL_PUBLIC_MP) /* get offset to public portion of the RSA key */ @@ -6785,15 +8886,15 @@ #elif defined(USE_CERT_BUFFERS_2048) || defined(USE_CERT_BUFFERS_3072) bytes = 12; #endif - ret = mp_read_unsigned_bin(&rsaKey[i].n, &tmp[bytes], rsaKeySz/8); + ret = mp_read_unsigned_bin(&rsaKey[i]->n, &tmp[bytes], rsaKeySz/8); if (ret != 0) { printf("wc_RsaPrivateKeyDecode failed! %d\n", ret); - goto exit_bench_rsa; + goto exit; } - ret = mp_set_int(&rsaKey[i].e, WC_RSA_EXPONENT); + ret = mp_set_int(&rsaKey[i]->e, WC_RSA_EXPONENT); if (ret != 0) { printf("wc_RsaPrivateKeyDecode failed! %d\n", ret); - goto exit_bench_rsa; + goto exit; } #else /* Note: To benchmark public only define WOLFSSL_PUBLIC_MP */ @@ -6808,15 +8909,14 @@ (void)bytes; (void)tmp; -exit_bench_rsa: +exit: /* cleanup */ - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_FreeRsaKey(&rsaKey[i]); + if (WC_ARRAY_OK(rsaKey)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_FreeRsaKey(rsaKey[i]); + } + WC_FREE_ARRAY(rsaKey, BENCH_MAX_PENDING, HEAP_HINT); } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(rsaKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); -#endif } @@ -6825,27 +8925,17 @@ void bench_rsa_key(int useDeviceID, word32 rsaKeySz) { int ret = 0, i, pending = 0; -#ifdef WOLFSSL_SMALL_STACK - RsaKey *rsaKey; -#else - RsaKey rsaKey[BENCH_MAX_PENDING]; -#endif - int isPending[BENCH_MAX_PENDING]; + WC_DECLARE_ARRAY(rsaKey, RsaKey, BENCH_MAX_PENDING, + sizeof(RsaKey), HEAP_HINT); + int isPending[BENCH_MAX_PENDING]; long exp = 65537L; -#ifdef WOLFSSL_SMALL_STACK - rsaKey = (RsaKey *)XMALLOC(sizeof(*rsaKey) * BENCH_MAX_PENDING, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (rsaKey == NULL) { - printf("bench_rsa_key malloc failed\n"); - return; - } -#endif - /* clear for done cleanup */ - XMEMSET(rsaKey, 0, sizeof(*rsaKey) * BENCH_MAX_PENDING); XMEMSET(isPending, 0, sizeof(isPending)); + WC_CALLOC_ARRAY(rsaKey, RsaKey, BENCH_MAX_PENDING, + sizeof(RsaKey), HEAP_HINT); + /* init keys */ do { pending = 0; @@ -6853,42 +8943,41 @@ if (!isPending[i]) { /* if making the key is pending then just call * wc_MakeRsaKey again */ /* setup an async context for each key */ - if (wc_InitRsaKey_ex(&rsaKey[i], HEAP_HINT, + if (wc_InitRsaKey_ex(rsaKey[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID) < 0) { - goto exit_bench_rsa_key; + goto exit; } #ifdef WC_RSA_BLINDING - ret = wc_RsaSetRNG(&rsaKey[i], &gRng); + ret = wc_RsaSetRNG(rsaKey[i], &gRng); if (ret != 0) - goto exit_bench_rsa_key; + goto exit; #endif } /* create the RSA key */ - ret = wc_MakeRsaKey(&rsaKey[i], (int)rsaKeySz, exp, &gRng); + ret = wc_MakeRsaKey(rsaKey[i], (int)rsaKeySz, exp, &gRng); if (ret == WC_PENDING_E) { isPending[i] = 1; pending = 1; } else if (ret != 0) { printf("wc_MakeRsaKey failed! %d\n", ret); - goto exit_bench_rsa_key; + goto exit; } } /* for i */ } while (pending > 0); bench_rsa_helper(useDeviceID, rsaKey, rsaKeySz); -exit_bench_rsa_key: +exit: /* cleanup */ - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_FreeRsaKey(&rsaKey[i]); + if (WC_ARRAY_OK(rsaKey)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_FreeRsaKey(rsaKey[i]); + } + WC_FREE_ARRAY(rsaKey, BENCH_MAX_PENDING, HEAP_HINT); } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(rsaKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); -#endif } #endif /* WOLFSSL_KEY_GEN */ #endif /* !NO_RSA */ @@ -6924,11 +9013,8 @@ int count = 0, times, pending = 0; const byte* tmp = NULL; double start = 0.0F; -#ifdef WOLFSSL_SMALL_STACK - DhKey *dhKey = NULL; -#else - DhKey dhKey[BENCH_MAX_PENDING]; -#endif + WC_DECLARE_ARRAY(dhKey, DhKey, BENCH_MAX_PENDING, + sizeof(DhKey), HEAP_HINT); int dhKeySz = BENCH_DH_KEY_SIZE * 8; /* used in printf */ const char**desc = bench_desc_words[lng_index]; #ifndef NO_ASN @@ -6947,6 +9033,7 @@ int paramName = 0; #endif #endif + DECLARE_MULTI_VALUE_STATS_VARS() WC_DECLARE_ARRAY(pub, byte, BENCH_MAX_PENDING, BENCH_DH_KEY_SIZE, HEAP_HINT); @@ -6959,28 +9046,22 @@ WC_DECLARE_VAR(priv2, byte, BENCH_DH_PRIV_SIZE, HEAP_HINT); - WC_INIT_ARRAY(pub, byte, + /* old scan-build misfires -Wmaybe-uninitialized on these. */ + XMEMSET(pub, 0, sizeof(pub)); + XMEMSET(agree, 0, sizeof(agree)); + XMEMSET(priv, 0, sizeof(priv)); + + WC_CALLOC_ARRAY(dhKey, DhKey, BENCH_MAX_PENDING, + sizeof(DhKey), HEAP_HINT); + WC_ALLOC_ARRAY(pub, byte, BENCH_MAX_PENDING, BENCH_DH_KEY_SIZE, HEAP_HINT); - WC_INIT_ARRAY(agree, byte, + WC_ALLOC_ARRAY(agree, byte, BENCH_MAX_PENDING, BENCH_DH_KEY_SIZE, HEAP_HINT); - WC_INIT_ARRAY(priv, byte, + WC_ALLOC_ARRAY(priv, byte, BENCH_MAX_PENDING, BENCH_DH_PRIV_SIZE, HEAP_HINT); -#ifdef WOLFSSL_SMALL_STACK - dhKey = (DhKey *)XMALLOC(sizeof(DhKey) * BENCH_MAX_PENDING, HEAP_HINT, - DYNAMIC_TYPE_TMP_BUFFER); - if (! dhKey) { - ret = MEMORY_E; - goto exit; - } -#endif - -#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC - if (pub[0] == NULL || pub2 == NULL || agree[0] == NULL || priv[0] == NULL || priv2 == NULL) { - ret = MEMORY_E; - goto exit; - } -#endif + WC_ALLOC_VAR(pub2, byte, BENCH_DH_KEY_SIZE, HEAP_HINT); + WC_ALLOC_VAR(priv2, byte, BENCH_DH_PRIV_SIZE, HEAP_HINT); (void)tmp; @@ -7039,18 +9120,10 @@ } #endif - /* clear for done cleanup */ - XMEMSET(dhKey, 0, sizeof(DhKey) * BENCH_MAX_PENDING); -#if 0 - for (i = 0; i < BENCH_MAX_PENDING; i++) { - XMEMSET(dhKey[i], 0, sizeof(DhKey)); - } -#endif - /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { /* setup an async context for each key */ - ret = wc_InitDhKey_ex(&dhKey[i], HEAP_HINT, + ret = wc_InitDhKey_ex(dhKey[i], HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); if (ret != 0) goto exit; @@ -7058,22 +9131,22 @@ /* setup key */ if (!use_ffdhe) { #ifdef NO_ASN - ret = wc_DhSetKey(&dhKey[i], dh_p, + ret = wc_DhSetKey(dhKey[i], dh_p, sizeof(dh_p), dh_g, sizeof(dh_g)); #else idx = 0; - ret = wc_DhKeyDecode(tmp, &idx, &dhKey[i], (word32)bytes); + ret = wc_DhKeyDecode(tmp, &idx, dhKey[i], (word32)bytes); #endif } #if defined(HAVE_FFDHE_2048) || defined(HAVE_FFDHE_3072) #ifdef HAVE_PUBLIC_FFDHE else if (params != NULL) { - ret = wc_DhSetKey(&dhKey[i], params->p, params->p_len, + ret = wc_DhSetKey(dhKey[i], params->p, params->p_len, params->g, params->g_len); } #else else if (paramName != 0) { - ret = wc_DhSetNamedKey(&dhKey[i], paramName); + ret = wc_DhSetNamedKey(dhKey[i], paramName); } #endif #endif @@ -7083,6 +9156,7 @@ } } + /* Key Gen */ bench_stats_start(&count, &start); PRIVATE_KEY_UNLOCK(); @@ -7092,39 +9166,50 @@ bench_async_poll(&pending); for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&dhKey[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(dhKey[i]), 0, ×, genTimes, &pending)) { privSz[i] = BENCH_DH_PRIV_SIZE; pubSz[i] = BENCH_DH_KEY_SIZE; - ret = wc_DhGenerateKeyPair(&dhKey[i], &gRng, + ret = wc_DhGenerateKeyPair(dhKey[i], &gRng, priv[i], &privSz[i], pub[i], &pubSz[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&dhKey[i]), + BENCH_ASYNC_GET_DEV(dhKey[i]), 0, ×, &pending)) { goto exit_dh_gen; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); exit_dh_gen: bench_stats_asym_finish("DH", dhKeySz, desc[2], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif if (ret < 0) { goto exit; } + RESET_MULTI_VALUE_STATS_VARS(); + /* Generate key to use as other public */ PRIVATE_KEY_UNLOCK(); - ret = wc_DhGenerateKeyPair(&dhKey[0], &gRng, + ret = wc_DhGenerateKeyPair(dhKey[0], &gRng, priv2, &privSz2, pub2, &pubSz2); PRIVATE_KEY_LOCK(); #ifdef WOLFSSL_ASYNC_CRYPT - ret = wc_AsyncWait(ret, &dhKey[0].asyncDev, WC_ASYNC_FLAG_NONE); + ret = wc_AsyncWait(ret, &dhKey[0]->asyncDev, WC_ASYNC_FLAG_NONE); #endif /* Key Agree */ @@ -7136,39 +9221,41 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&dhKey[i]), + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(dhKey[i]), 0, ×, agreeTimes, &pending)) { - ret = wc_DhAgree(&dhKey[i], agree[i], &agreeSz[i], priv[i], + ret = wc_DhAgree(dhKey[i], agree[i], &agreeSz[i], priv[i], privSz[i], pub2, pubSz2); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&dhKey[i]), 0, ×, &pending)) { + BENCH_ASYNC_GET_DEV(dhKey[i]), 0, ×, &pending)) { goto exit; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_LOCK(); exit: bench_stats_asym_finish("DH", dhKeySz, desc[3], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif /* cleanup */ -#ifdef WOLFSSL_SMALL_STACK - if (dhKey) { + if (WC_ARRAY_OK(dhKey)) { for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_FreeDhKey(&dhKey[i]); + wc_FreeDhKey(dhKey[i]); } - XFREE(dhKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + WC_FREE_ARRAY(dhKey, BENCH_MAX_PENDING, HEAP_HINT); } -#else - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_FreeDhKey(&dhKey[i]); - } -#endif - WC_FREE_ARRAY(pub, BENCH_MAX_PENDING, HEAP_HINT); WC_FREE_VAR(pub2, HEAP_HINT); WC_FREE_ARRAY(priv, BENCH_MAX_PENDING, HEAP_HINT); @@ -7184,6 +9271,7 @@ int ret = 0, times, count, pending = 0; double start; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() /* KYBER Make Key */ bench_stats_start(&count, &start); @@ -7203,13 +9291,20 @@ #endif if (ret != 0) goto exit; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } - while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit: bench_stats_asym_finish(name, keySize, desc[2], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } static void bench_kyber_encap(const char* name, int keySize, KyberKey* key) @@ -7220,6 +9315,7 @@ byte ct[KYBER_MAX_CIPHER_TEXT_SIZE]; byte ss[KYBER_SS_SZ]; word32 ctSz; + DECLARE_MULTI_VALUE_STATS_VARS() ret = wc_KyberKey_CipherTextSize(key, &ctSz); if (ret != 0) { @@ -7240,13 +9336,22 @@ #endif if (ret != 0) goto exit_encap; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } - while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_encap: bench_stats_asym_finish(name, keySize, desc[9], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); /* KYBER Decapsulate */ bench_stats_start(&count, &start); @@ -7256,13 +9361,20 @@ ret = wc_KyberKey_Decapsulate(key, ss, ct, ctSz); if (ret != 0) goto exit_decap; + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } - while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_decap: bench_stats_asym_finish(name, keySize, desc[13], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } void bench_kyber(int type) @@ -7299,9 +9411,1096 @@ } #endif +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) +/* WC_LMS_PARM_L2_H10_W2 + * signature length: 9300 */ +static const byte lms_priv_L2_H10_W2[64] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x62,0x62,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xC7,0x74,0x25,0x5B,0x2C,0xE8,0xDA,0x53, + 0xF0,0x7C,0x04,0x3F,0x64,0x2D,0x26,0x2C, + 0x46,0x1D,0xC8,0x90,0x77,0x59,0xD6,0xC0, + 0x56,0x46,0x7D,0x97,0x64,0xF2,0xA3,0xA1, + 0xF8,0xD0,0x3B,0x5F,0xAC,0x40,0xB9,0x9E, + 0x83,0x67,0xBF,0x92,0x8D,0xFE,0x45,0x79 +}; + +static const byte lms_pub_L2_H10_W2[60] = +{ + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06, + 0x00,0x00,0x00,0x02,0xF8,0xD0,0x3B,0x5F, + 0xAC,0x40,0xB9,0x9E,0x83,0x67,0xBF,0x92, + 0x8D,0xFE,0x45,0x79,0x41,0xBC,0x2A,0x3B, + 0x9F,0xC0,0x11,0x12,0x93,0xF0,0x5A,0xA5, + 0xC1,0x88,0x29,0x79,0x6C,0x3E,0x0A,0x0F, + 0xEC,0x3B,0x3E,0xE4,0x38,0xD3,0xD2,0x34, + 0x7F,0xC8,0x91,0xB0 +}; + +/* WC_LMS_PARM_L2_H10_W4 + * signature length: 5076 */ +static const byte lms_priv_L2_H10_W4[64] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x63,0x63,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xAE,0x28,0x87,0x19,0x4F,0x4B,0x68,0x61, + 0x93,0x9A,0xC7,0x0E,0x33,0xB8,0xCE,0x96, + 0x66,0x0D,0xC7,0xB1,0xFA,0x94,0x80,0xA2, + 0x28,0x9B,0xCF,0xE2,0x08,0xB5,0x25,0xAC, + 0xFB,0xB8,0x65,0x5E,0xD1,0xCC,0x31,0xDA, + 0x2E,0x49,0x3A,0xEE,0xAF,0x63,0x70,0x5E +}; + +static const byte lms_pub_L2_H10_W4[60] = +{ + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06, + 0x00,0x00,0x00,0x03,0xFB,0xB8,0x65,0x5E, + 0xD1,0xCC,0x31,0xDA,0x2E,0x49,0x3A,0xEE, + 0xAF,0x63,0x70,0x5E,0xA2,0xD5,0xB6,0x15, + 0x33,0x8C,0x9B,0xE9,0xE1,0x91,0x40,0x1A, + 0x12,0xE0,0xD7,0xBD,0xE4,0xE0,0x76,0xF5, + 0x04,0x90,0x76,0xA5,0x9A,0xA7,0x4E,0xFE, + 0x6B,0x9A,0xD3,0x14 +}; + +/* WC_LMS_PARM_L3_H5_W4 + * signature length: 7160 */ +static const byte lms_priv_L3_H5_W4[64] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x53,0x53,0x53,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x38,0xD1,0xBE,0x68,0xD1,0x93,0xE1,0x14, + 0x6C,0x8B,0xED,0xE2,0x25,0x88,0xED,0xAC, + 0x57,0xBD,0x87,0x9F,0x54,0xF3,0x58,0xD9, + 0x4D,0xF5,0x6A,0xBD,0x71,0x99,0x6A,0x28, + 0x2F,0xE1,0xFC,0xD1,0xD1,0x0C,0x7C,0xF8, + 0xB4,0xDC,0xDF,0x7F,0x14,0x1A,0x7B,0x50 +}; + +static const byte lms_pub_L3_H5_W4[60] = +{ + 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05, + 0x00,0x00,0x00,0x03,0x2F,0xE1,0xFC,0xD1, + 0xD1,0x0C,0x7C,0xF8,0xB4,0xDC,0xDF,0x7F, + 0x14,0x1A,0x7B,0x50,0x8E,0x3A,0xD4,0x05, + 0x0C,0x95,0x59,0xA0,0xCA,0x7A,0xD8,0xD6, + 0x5D,0xBD,0x42,0xBB,0xD5,0x82,0xB8,0x9C, + 0x52,0x37,0xB7,0x45,0x03,0xC2,0x06,0xCE, + 0xAB,0x4B,0x51,0x39 +}; + +/* WC_LMS_PARM_L3_H5_W8 + * signature length: 3992 */ +static const byte lms_priv_L3_H5_W8[64] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x54,0x54,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xA5,0x46,0x97,0x0C,0xA1,0x3C,0xEA,0x17, + 0x5C,0x9D,0x59,0xF4,0x0E,0x27,0x37,0xF3, + 0x6A,0x1C,0xF7,0x29,0x4A,0xCC,0xCD,0x7B, + 0x4F,0xE7,0x37,0x6E,0xEF,0xC1,0xBD,0xBD, + 0x04,0x5D,0x8E,0xDD,0xAA,0x47,0xCC,0xE6, + 0xCE,0x78,0x46,0x20,0x41,0x87,0xE0,0x85 +}; + +static const byte lms_pub_L3_H5_W8[60] = +{ + 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05, + 0x00,0x00,0x00,0x04,0x04,0x5D,0x8E,0xDD, + 0xAA,0x47,0xCC,0xE6,0xCE,0x78,0x46,0x20, + 0x41,0x87,0xE0,0x85,0x0D,0x2C,0x46,0xB9, + 0x39,0x8C,0xA3,0x92,0x4F,0xCE,0x50,0x96, + 0x90,0x9C,0xF3,0x36,0x2E,0x09,0x15,0x3B, + 0x4B,0x34,0x17,0xE7,0xE2,0x55,0xFC,0x5B, + 0x83,0xAB,0x43,0xAF +}; + +/* WC_LMS_PARM_L3_H10_W4 + * signature length: 7640 */ +static const byte lms_priv_L3_H10_W4[64] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x63,0x63,0x63,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xDF,0x98,0xAB,0xEC,0xFE,0x13,0x9F,0xF8, + 0xD7,0x2B,0x4F,0x4C,0x79,0x34,0xB8,0x89, + 0x24,0x6B,0x26,0x7D,0x7A,0x2E,0xA2,0xCB, + 0x82,0x75,0x4E,0x96,0x54,0x49,0xED,0xA0, + 0xAF,0xC7,0xA5,0xEE,0x8A,0xA2,0x83,0x99, + 0x4B,0x18,0x59,0x2B,0x66,0xC0,0x32,0xDB +}; + +static const byte lms_pub_L3_H10_W4[60] = +{ + 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06, + 0x00,0x00,0x00,0x03,0xAF,0xC7,0xA5,0xEE, + 0x8A,0xA2,0x83,0x99,0x4B,0x18,0x59,0x2B, + 0x66,0xC0,0x32,0xDB,0xC4,0x18,0xEB,0x11, + 0x17,0x7D,0xAA,0x93,0xFD,0xA0,0x70,0x4D, + 0x68,0x4B,0x63,0x8F,0xC2,0xE7,0xCA,0x34, + 0x14,0x31,0x0D,0xAA,0x18,0xBF,0x9B,0x32, + 0x8D,0x78,0xD5,0xA8 +}; + +/* WC_LMS_PARM_L4_H5_W8 + * signature length: 5340 */ +static const byte lms_priv_L4_H5_W8[64] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x54,0x54,0x54,0xFF,0xFF,0xFF,0xFF, + 0x46,0x8F,0x2A,0x4A,0x14,0x26,0xF0,0x89, + 0xFE,0xED,0x66,0x0F,0x73,0x69,0xB1,0x4C, + 0x47,0xA1,0x35,0x9F,0x7B,0xBA,0x08,0x03, + 0xEE,0xA2,0xEB,0xAD,0xB4,0x82,0x52,0x1F, + 0xFD,0x9B,0x22,0x82,0x42,0x1A,0x96,0x1E, + 0xE4,0xA1,0x9C,0x33,0xED,0xE6,0x9F,0xAB +}; + +static const byte lms_pub_L4_H5_W8[60] = +{ + 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05, + 0x00,0x00,0x00,0x04,0xFD,0x9B,0x22,0x82, + 0x42,0x1A,0x96,0x1E,0xE4,0xA1,0x9C,0x33, + 0xED,0xE6,0x9F,0xAB,0x6B,0x47,0x05,0x5B, + 0xA7,0xAD,0xF6,0x88,0xA5,0x4F,0xCD,0xF1, + 0xDA,0x29,0x67,0xC3,0x7F,0x2C,0x11,0xFE, + 0x85,0x1A,0x7A,0xD8,0xD5,0x46,0x74,0x3B, + 0x74,0x24,0x12,0xC8 +}; + +static int lms_write_key_mem(const byte* priv, word32 privSz, void* context) +{ + /* WARNING: THIS IS AN INSECURE WRITE CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! Production applications should + * write only to non-volatile storage. */ + XMEMCPY(context, priv, privSz); + return WC_LMS_RC_SAVED_TO_NV_MEMORY; +} + +static int lms_read_key_mem(byte* priv, word32 privSz, void* context) +{ + /* WARNING: THIS IS AN INSECURE READ CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! */ + XMEMCPY(priv, context, privSz); + return WC_LMS_RC_READ_TO_MEMORY; +} +static byte lms_priv[HSS_MAX_PRIVATE_KEY_LEN]; + +static void bench_lms_keygen(int parm, byte* pub) +{ + WC_RNG rng; + LmsKey key; + int ret; + word32 pubLen = HSS_MAX_PUBLIC_KEY_LEN; + int times = 0; + int count = 0; + double start = 0.0F; + int levels; + int height; + int winternitz; + const char* str = wc_LmsKey_ParmToStr(parm); + DECLARE_MULTI_VALUE_STATS_VARS() + +#ifndef HAVE_FIPS + ret = wc_InitRng_ex(&rng, HEAP_HINT, INVALID_DEVID); +#else + ret = wc_InitRng(&rng); +#endif + if (ret != 0) { + fprintf(stderr, "error: wc_InitRng failed: %d\n", ret); + return; + } + + ret = wc_LmsKey_Init(&key, NULL, INVALID_DEVID); + if (ret) { + printf("wc_LmsKey_Init failed: %d\n", ret); + wc_FreeRng(&rng); + return; + } + + count = 0; + bench_stats_start(&count, &start); + + do { + /* LMS is stateful. Async queuing not practical. */ + for (times = 0; times < 1; ++times) { + + wc_LmsKey_Free(&key); + + ret = wc_LmsKey_Init(&key, NULL, INVALID_DEVID); + if (ret) { + printf("wc_LmsKey_Init failed: %d\n", ret); + goto exit_lms_keygen; + } + + ret = wc_LmsKey_SetLmsParm(&key, parm); + if (ret) { + printf("wc_LmsKey_SetLmsParm failed: %d\n", ret); + goto exit_lms_keygen; + } + + ret = wc_LmsKey_GetParameters(&key, &levels, &height, &winternitz); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_GetParameters failed: %d\n", + ret); + goto exit_lms_keygen; + } + + ret = wc_LmsKey_SetWriteCb(&key, lms_write_key_mem); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_SetWriteCb failed: %d\n", + ret); + goto exit_lms_keygen; + } + + ret = wc_LmsKey_SetReadCb(&key, lms_read_key_mem); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_SetReadCb failed: %d\n", ret); + goto exit_lms_keygen; + } + + ret = wc_LmsKey_SetContext(&key, (void*)lms_priv); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_SetContext failed: %d\n", + ret); + goto exit_lms_keygen; + } + + ret = wc_LmsKey_MakeKey(&key, &rng); + if (ret) { + printf("wc_LmsKey_MakeKey failed: %d\n", ret); + goto exit_lms_keygen; + } + + RECORD_MULTI_VALUE_STATS(); + } + + count += times; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_asym_finish(str, levels * height, "keygen", 0, + count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + ret = wc_LmsKey_ExportPubRaw(&key, pub, &pubLen); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_ExportPubRaw failed: %d\n", ret); + } + +exit_lms_keygen: + wc_LmsKey_Free(&key); + wc_FreeRng(&rng); +} + +static void bench_lms_sign_verify(int parm, byte* pub) +{ + LmsKey key; + int ret = 0; + const char * msg = TEST_STRING; + word32 msgSz = TEST_STRING_SZ; + byte * sig = NULL; + word32 sigSz = 0; + word32 privLen = 0; + int loaded = 0; + int times = 0; + int count = 0; + double start = 0.0F; + const char * str = wc_LmsKey_ParmToStr(parm); + DECLARE_MULTI_VALUE_STATS_VARS() + + ret = wc_LmsKey_Init(&key, NULL, INVALID_DEVID); + if (ret) { + printf("wc_LmsKey_Init failed: %d\n", ret); + goto exit_lms_sign_verify; + } + + ret = wc_LmsKey_SetLmsParm(&key, parm); + if (ret) { + printf("wc_LmsKey_SetLmsParm failed: %d\n", ret); + goto exit_lms_sign_verify; + } + + switch (parm) { + case WC_LMS_PARM_L2_H10_W2: + XMEMCPY(lms_priv, lms_priv_L2_H10_W2, sizeof(lms_priv_L2_H10_W2)); + XMEMCPY(key.pub, lms_pub_L2_H10_W2, HSS_MAX_PUBLIC_KEY_LEN); + break; + + case WC_LMS_PARM_L2_H10_W4: + XMEMCPY(lms_priv, lms_priv_L2_H10_W4, sizeof(lms_priv_L2_H10_W4)); + XMEMCPY(key.pub, lms_pub_L2_H10_W4, HSS_MAX_PUBLIC_KEY_LEN); + break; + + case WC_LMS_PARM_L3_H5_W4: + XMEMCPY(lms_priv, lms_priv_L3_H5_W4, sizeof(lms_priv_L3_H5_W4)); + XMEMCPY(key.pub, lms_pub_L3_H5_W4, HSS_MAX_PUBLIC_KEY_LEN); + break; + + case WC_LMS_PARM_L3_H5_W8: + XMEMCPY(lms_priv, lms_priv_L3_H5_W8, sizeof(lms_priv_L3_H5_W8)); + XMEMCPY(key.pub, lms_pub_L3_H5_W8, HSS_MAX_PUBLIC_KEY_LEN); + break; + + case WC_LMS_PARM_L3_H10_W4: + XMEMCPY(lms_priv, lms_priv_L3_H10_W4, sizeof(lms_priv_L3_H10_W4)); + XMEMCPY(key.pub, lms_pub_L3_H10_W4, HSS_MAX_PUBLIC_KEY_LEN); + break; + + case WC_LMS_PARM_L4_H5_W8: + XMEMCPY(lms_priv, lms_priv_L4_H5_W8, sizeof(lms_priv_L4_H5_W8)); + XMEMCPY(key.pub, lms_pub_L4_H5_W8, HSS_MAX_PUBLIC_KEY_LEN); + break; + + case WC_LMS_PARM_NONE: + case WC_LMS_PARM_L1_H15_W2: + case WC_LMS_PARM_L1_H15_W4: + case WC_LMS_PARM_L2_H10_W8: + case WC_LMS_PARM_L3_H5_W2: + default: + XMEMCPY(key.pub, pub, HSS_MAX_PUBLIC_KEY_LEN); + break; + } + + ret = wc_LmsKey_SetWriteCb(&key, lms_write_key_mem); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_SetWriteCb failed: %d\n", ret); + goto exit_lms_sign_verify; + } + + ret = wc_LmsKey_SetReadCb(&key, lms_read_key_mem); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_SetReadCb failed: %d\n", ret); + goto exit_lms_sign_verify; + } + + ret = wc_LmsKey_SetContext(&key, (void*)lms_priv); + if (ret) { + fprintf(stderr, "error: wc_LmsKey_SetContext failed: %d\n", ret); + goto exit_lms_sign_verify; + } + + /* Even with saved priv/pub keys, we must still reload the private + * key before using it. Reloading the private key is the bottleneck + * for larger heights. Only print load time in debug builds. */ + count = 0; + bench_stats_start(&count, &start); + +#ifndef WOLFSSL_WC_LMS_SMALL + do { + #ifdef WOLFSSL_WC_LMS + key.priv.inited = 0; + key.state = WC_LMS_STATE_PARMSET; + #endif + ret = wc_LmsKey_Reload(&key); + if (ret) { + printf("wc_LmsKey_Reload failed: %d\n", ret); + goto exit_lms_sign_verify; + } + RECORD_MULTI_VALUE_STATS(); + + count++; + + ret = wc_LmsKey_GetSigLen(&key, &sigSz); + if (ret) { + printf("wc_LmsKey_GetSigLen failed: %d\n", ret); + goto exit_lms_sign_verify; + } + + ret = wc_LmsKey_GetPrivLen(&key, &privLen); + if (ret) { + printf("wc_LmsKey_GetPrivLen failed: %d\n", ret); + goto exit_lms_sign_verify; + } + #ifdef HAVE_LIBLMS + break; + #endif + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + bench_stats_asym_finish(str, (int)privLen, "load", 0, + count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); +#else + ret = wc_LmsKey_Reload(&key); + if (ret) { + printf("wc_LmsKey_Reload failed: %d\n", ret); + goto exit_lms_sign_verify; + } + ret = wc_LmsKey_GetSigLen(&key, &sigSz); + if (ret) { + printf("wc_LmsKey_GetSigLen failed: %d\n", ret); + goto exit_lms_sign_verify; + } + ret = wc_LmsKey_GetPrivLen(&key, &privLen); + if (ret) { + printf("wc_LmsKey_GetPrivLen failed: %d\n", ret); + goto exit_lms_sign_verify; + } +#endif + + loaded = 1; + + sig = XMALLOC(sigSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (sig == NULL) { + printf("bench_lms_sign_verify malloc failed\n"); + goto exit_lms_sign_verify; + } + + count = 0; + bench_stats_start(&count, &start); + + do { + /* LMS is stateful. Async queuing not practical. */ +#ifndef WOLFSSL_WC_LMS_SMALL + for (times = 0; times < ntimes; ++times) +#else + for (times = 0; times < 1; ++times) +#endif + { + ret = wc_LmsKey_Sign(&key, sig, &sigSz, (byte *) msg, msgSz); + if (ret) { + printf("wc_LmsKey_Sign failed: %d\n", ret); + goto exit_lms_sign_verify; + } + RECORD_MULTI_VALUE_STATS(); + if (!wc_LmsKey_SigsLeft(&key)) { + break; + } + } + + count += times; + } while (wc_LmsKey_SigsLeft(&key) && (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + )); + + bench_stats_asym_finish(str, (int)sigSz, "sign", 0, + count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); + count = 0; + bench_stats_start(&count, &start); + + do { + /* LMS is stateful. Async queuing not practical. */ + for (times = 0; times < ntimes; ++times) { + ret = wc_LmsKey_Verify(&key, sig, sigSz, (byte *) msg, msgSz); + if (ret) { + printf("wc_LmsKey_Verify failed: %d\n", ret); + goto exit_lms_sign_verify; + } + RECORD_MULTI_VALUE_STATS(); + } + + count += times; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + +exit_lms_sign_verify: + bench_stats_asym_finish(str, (int)sigSz, "verify", 0, + count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + + if (loaded) { + wc_LmsKey_Free(&key); + } + XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + + return; +} + +void bench_lms(void) +{ + byte pub[HSS_MAX_PUBLIC_KEY_LEN]; + +#ifdef BENCH_LMS_SLOW_KEYGEN +#if !defined(WOLFSSL_WC_LMS) || (LMS_MAX_HEIGHT >= 15) + bench_lms_keygen(WC_LMS_PARM_L1_H15_W2, pub); + bench_lms_sign_verify(WC_LMS_PARM_L1_H15_W2, pub); + bench_lms_keygen(WC_LMS_PARM_L1_H15_W4, pub); + bench_lms_sign_verify(WC_LMS_PARM_L1_H15_W4, pub); + #undef LMS_PARAMS_BENCHED + #define LMS_PARAMS_BENCHED +#endif +#endif +#if !defined(WOLFSSL_WC_LMS) || ((LMS_MAX_LEVELS >= 2) && \ + (LMS_MAX_HEIGHT >= 10)) + bench_lms_keygen(WC_LMS_PARM_L2_H10_W2, pub); + bench_lms_sign_verify(WC_LMS_PARM_L2_H10_W2, pub); + bench_lms_keygen(WC_LMS_PARM_L2_H10_W4, pub); + bench_lms_sign_verify(WC_LMS_PARM_L2_H10_W4, pub); + #undef LMS_PARAMS_BENCHED + #define LMS_PARAMS_BENCHED +#ifdef BENCH_LMS_SLOW_KEYGEN + bench_lms_keygen(WC_LMS_PARM_L2_H10_W8, pub); + bench_lms_sign_verify(WC_LMS_PARM_L2_H10_W8, pub); +#endif +#endif +#if !defined(WOLFSSL_WC_LMS) || (LMS_MAX_LEVELS >= 3) + bench_lms_keygen(WC_LMS_PARM_L3_H5_W4, pub); + bench_lms_sign_verify(WC_LMS_PARM_L3_H5_W4, pub); + bench_lms_keygen(WC_LMS_PARM_L3_H5_W8, pub); + bench_lms_sign_verify(WC_LMS_PARM_L3_H5_W8, pub); + #undef LMS_PARAMS_BENCHED + #define LMS_PARAMS_BENCHED +#endif +#if !defined(WOLFSSL_WC_LMS) || ((LMS_MAX_LEVELS >= 3) && \ + (LMS_MAX_HEIGHT >= 10)) + bench_lms_keygen(WC_LMS_PARM_L3_H10_W4, pub); + bench_lms_sign_verify(WC_LMS_PARM_L3_H10_W4, pub); +#endif +#if !defined(WOLFSSL_WC_LMS) || (LMS_MAX_LEVELS >= 4) + bench_lms_keygen(WC_LMS_PARM_L4_H5_W8, pub); + bench_lms_sign_verify(WC_LMS_PARM_L4_H5_W8, pub); +#endif + +#if defined(WOLFSSL_WC_LMS) && !defined(LMS_PARAMS_BENCHED) + bench_lms_keygen(WC_LMS_PARM_L1_H5_W1, pub); + bench_lms_sign_verify(WC_LMS_PARM_L1_H5_W1, pub); +#endif + + return; +} + +#endif /* if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) */ + +#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY) + +static enum wc_XmssRc xmss_write_key_mem(const byte * priv, word32 privSz, + void *context) +{ + /* WARNING: THIS IS AN INSECURE WRITE CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! Production applications should + * write only to non-volatile storage. */ + XMEMCPY(context, priv, privSz); + return WC_XMSS_RC_SAVED_TO_NV_MEMORY; +} + +static enum wc_XmssRc xmss_read_key_mem(byte * priv, word32 privSz, + void *context) +{ + /* WARNING: THIS IS AN INSECURE READ CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! */ + XMEMCPY(priv, context, privSz); + return WC_XMSS_RC_READ_TO_MEMORY; +} + +static void bench_xmss_sign_verify(const char * params) +{ + WC_RNG rng; + XmssKey key; + word32 pkSz = 0; + word32 skSz = 0; + int freeRng = 0; + int freeKey = 0; + unsigned char * sk = NULL; + const char * msg = "XMSS post quantum signature test"; + word32 msgSz = (word32) XSTRLEN(msg); + int ret = 0; + byte * sig = NULL; + word32 sigSz = 0; + int times = 0; + int count = 0; + double start = 0.0F; + +#ifndef HAVE_FIPS + ret = wc_InitRng_ex(&rng, HEAP_HINT, INVALID_DEVID); +#else + ret = wc_InitRng(&rng); +#endif + if (ret != 0) { + fprintf(stderr, "error: wc_InitRng failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + + freeRng = 1; + + ret = wc_XmssKey_Init(&key, NULL, INVALID_DEVID); + if (ret != 0) { + fprintf(stderr, "wc_XmssKey_Init failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + + ret = wc_XmssKey_SetParamStr(&key, params); + if (ret != 0) { + fprintf(stderr, "wc_XmssKey_SetParamStr failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + + ret = wc_XmssKey_GetPubLen(&key, &pkSz); + if (ret != 0) { + fprintf(stderr, "wc_XmssKey_GetPubLen failed: %d\n", ret); + goto exit_xmss_sign_verify; + } +#ifndef WOLFSSL_WC_XMSS + if (pkSz != XMSS_SHA256_PUBLEN) { + fprintf(stderr, "error: xmss pub len: got %u, expected %d\n", pkSz, + XMSS_SHA256_PUBLEN); + goto exit_xmss_sign_verify; + } +#endif + + ret = wc_XmssKey_GetPrivLen(&key, &skSz); + if (ret != 0 || skSz <= 0) { + fprintf(stderr, "error: wc_XmssKey_GetPrivLen failed\n"); + goto exit_xmss_sign_verify; + } + + ret = wc_XmssKey_GetSigLen(&key, &sigSz); + if (ret != 0 || sigSz <= 0) { + fprintf(stderr, "error: wc_XmssKey_GetSigLen failed\n"); + goto exit_xmss_sign_verify; + } + + /* Allocate secret keys.*/ + sk = (unsigned char *)XMALLOC(skSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (sk == NULL) { + fprintf(stderr, "error: allocate xmss sk failed\n"); + goto exit_xmss_sign_verify; + } + + /* Allocate signature array. */ + sig = (byte *)XMALLOC(sigSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (sig == NULL) { + fprintf(stderr, "error: allocate xmss sig failed\n"); + goto exit_xmss_sign_verify; + } + + ret = wc_XmssKey_SetWriteCb(&key, xmss_write_key_mem); + if (ret != 0) { + fprintf(stderr, "error: wc_XmssKey_SetWriteCb failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + + ret = wc_XmssKey_SetReadCb(&key, xmss_read_key_mem); + if (ret != 0) { + fprintf(stderr, "error: wc_XmssKey_SetReadCb failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + + ret = wc_XmssKey_SetContext(&key, (void *)sk); + if (ret != 0) { + fprintf(stderr, "error: wc_XmssKey_SetContext failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + +#if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_DEBUG_NONBLOCK) + fprintf(stderr, "params: %s\n", params); + fprintf(stderr, "pkSz: %d\n", pkSz); + fprintf(stderr, "skSz: %d\n", skSz); + fprintf(stderr, "sigSz: %d\n", sigSz); +#endif + + /* Making the private key is the bottleneck for larger heights. */ + count = 0; + bench_stats_start(&count, &start); + + ret = wc_XmssKey_MakeKey(&key, &rng); + if (ret != 0) { + printf("wc_XmssKey_MakeKey failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + /* Can only do one at a time - state changes after make key. */ + + count +=1; + + bench_stats_check(start); + bench_stats_asym_finish(params, (int)skSz, "gen", 0, count, start, ret); + + freeKey = 1; + + count = 0; + bench_stats_start(&count, &start); + + do { + /* XMSS is stateful. Async queuing not practical. */ +#ifndef WOLFSSL_WC_XMSS_SMALL + for (times = 0; times < ntimes; ++times) +#else + for (times = 0; times < 1; ++times) +#endif + { + if (!wc_XmssKey_SigsLeft(&key)) + break; + ret = wc_XmssKey_Sign(&key, sig, &sigSz, (byte *) msg, msgSz); + if (ret) { + printf("wc_XmssKey_Sign failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + } + count += times; + } while (wc_XmssKey_SigsLeft(&key) && bench_stats_check(start)); + + bench_stats_asym_finish(params, (int)sigSz, "sign", 0, count, start, ret); + + count = 0; + bench_stats_start(&count, &start); + + do { + /* XMSS is stateful. Async queuing not practical. */ + for (times = 0; times < ntimes; ++times) { + ret = wc_XmssKey_Verify(&key, sig, sigSz, (byte *) msg, msgSz); + if (ret) { + printf("wc_XmssKey_Verify failed: %d\n", ret); + goto exit_xmss_sign_verify; + } + } + count += times; + } while (bench_stats_check(start)); + +exit_xmss_sign_verify: + bench_stats_asym_finish(params, (int)sigSz, "verify", 0, count, start, ret); + + /* Cleanup everything. */ + if (sig != NULL) { + XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + sig = NULL; + } + + if (sk != NULL) { + XFREE(sk, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + sk = NULL; + } + + if (freeRng) { + wc_FreeRng(&rng); + } + + if (freeKey) { + wc_XmssKey_Free(&key); + } + + return; +} + +void bench_xmss(int hash) +{ + /* All NIST SP 800-208 approved SHA256 XMSS/XMSS^MT parameter + * sets. + * + * Note: not testing "XMSS-SHA2_16_256", "XMSS-SHA2_20_256", + * and "XMSSMT-SHA2_60/3_256", because their keygen can be + * very slow, their signatures and private keys quite large, + * and xmss private keys are not portable across different + * XMSS/XMSS^MT implementations. + * + * The bottleneck in key generation is the height of the first + * level tree (or h/d). + * + * h is the total height of the hyper tree, and d the number of + * trees. + */ + /* h/d h d */ +#ifdef WC_XMSS_SHA256 + if (hash == WC_HASH_TYPE_SHA256) { +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + bench_xmss_sign_verify("XMSS-SHA2_10_256"); /* 10 10 1 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHA2_16_256"); /* 16 16 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHA2_20_256"); /* 20 20 1 */ +#endif +#endif +#endif /* HASH_SIZE 256 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + bench_xmss_sign_verify("XMSS-SHA2_10_192"); /* 10 10 1 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHA2_16_192"); /* 16 16 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHA2_20_192"); /* 20 20 1 */ +#endif +#endif +#endif /* HASH_SIZE 192 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + bench_xmss_sign_verify("XMSSMT-SHA2_20/2_256"); /* 10 20 2 */ + bench_xmss_sign_verify("XMSSMT-SHA2_20/4_256"); /* 5 20 4 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_40/2_256"); /* 20 40 4 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHA2_40/4_256"); /* 10 40 4 */ + bench_xmss_sign_verify("XMSSMT-SHA2_40/8_256"); /* 5 40 8 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_60/3_256"); /* 20 60 3 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHA2_60/6_256"); /* 10 60 6 */ + bench_xmss_sign_verify("XMSSMT-SHA2_60/12_256"); /* 5 60 12 */ +#endif +#endif /* HASH_SIZE 256 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + bench_xmss_sign_verify("XMSSMT-SHA2_20/2_192"); /* 10 20 2 */ + bench_xmss_sign_verify("XMSSMT-SHA2_20/4_192"); /* 5 20 4 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_40/2_192"); /* 20 40 4 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHA2_40/4_192"); /* 10 40 4 */ + bench_xmss_sign_verify("XMSSMT-SHA2_40/8_192"); /* 5 40 8 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_60/3_192"); /* 20 60 3 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHA2_60/6_192"); /* 10 60 6 */ + bench_xmss_sign_verify("XMSSMT-SHA2_60/12_192"); /* 5 60 12 */ +#endif +#endif /* HASH_SIZE 192 */ + } +#endif +#ifdef WC_XMSS_SHA512 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 + if (hash == WC_HASH_TYPE_SHA512) { +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + bench_xmss_sign_verify("XMSS-SHA2_10_512"); /* 10 10 1 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHA2_16_512"); /* 16 16 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHA2_20_512"); /* 20 20 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + bench_xmss_sign_verify("XMSSMT-SHA2_20/2_512"); /* 10 20 2 */ + bench_xmss_sign_verify("XMSSMT-SHA2_20/4_512"); /* 5 20 4 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_40/2_512"); /* 20 40 4 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_40/4_512"); /* 10 40 4 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHA2_40/8_512"); /* 5 40 8 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_60/3_512"); /* 20 60 3 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHA2_60/6_512"); /* 10 60 6 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHA2_60/12_512"); /* 5 60 12 */ +#endif + } +#endif /* HASH_SIZE 512 */ +#endif +#ifdef WC_XMSS_SHAKE128 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 + if (hash == WC_HASH_TYPE_SHAKE128) { +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + bench_xmss_sign_verify("XMSS-SHAKE_10_256"); /* 10 10 1 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE_16_256"); /* 16 16 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE_20_256"); /* 20 20 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + bench_xmss_sign_verify("XMSSMT-SHAKE_20/2_256"); /* 10 20 2 */ + bench_xmss_sign_verify("XMSSMT-SHAKE_20/4_256"); /* 5 20 4 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_40/2_256"); /* 20 40 4 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_40/4_256"); /* 10 40 4 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE_40/8_256"); /* 5 40 8 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_60/3_256"); /* 20 60 3 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_60/6_256"); /* 10 60 6 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE_60/12_256"); /* 5 60 12 */ +#endif + } +#endif /* HASH_SIZE 256 */ +#endif +#ifdef WC_XMSS_SHAKE256 + if (hash == WC_HASH_TYPE_SHAKE256) { +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + bench_xmss_sign_verify("XMSS-SHAKE_10_512"); /* 10 10 1 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE_16_512"); /* 16 16 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE_20_512"); /* 20 20 1 */ +#endif +#endif +#endif /* HASH_SIZE 512 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + bench_xmss_sign_verify("XMSS-SHAKE256_10_256"); /* 10 10 1 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE256_16_256"); /* 16 16 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE256_20_256"); /* 20 20 1 */ +#endif +#endif +#endif /* HASH_SIZE 256 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + bench_xmss_sign_verify("XMSS-SHAKE256_10_192"); /* 10 10 1 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE256_16_192"); /* 16 16 1 */ +#endif +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSS-SHAKE256_20_192"); /* 20 20 1 */ +#endif +#endif +#endif /* HASH_SIZE 192 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_20/2_512"); /* 10 20 2 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE_20/4_512"); /* 5 20 4 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_40/2_512"); /* 20 40 4 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_40/4_512"); /* 10 40 4 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE_40/8_512"); /* 5 40 8 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_60/3_512"); /* 20 60 3 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE_60/6_512"); /* 10 60 6 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE_60/12_512"); /* 5 60 12 */ +#endif +#endif /* HASH_SIZE 512 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + bench_xmss_sign_verify("XMSSMT-SHAKE256_20/2_256"); /* 10 20 2 */ + bench_xmss_sign_verify("XMSSMT-SHAKE256_20/4_256"); /* 5 20 4 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_40/2_256"); /* 20 40 4 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_40/4_256"); /* 10 40 4 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE256_40/8_256"); /* 5 40 8 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_60/3_256"); /* 20 60 3 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_60/6_256"); /* 10 60 6 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE256_60/12_256");/* 5 60 12 */ +#endif +#endif /* HASH_SIZE 256 */ +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + bench_xmss_sign_verify("XMSSMT-SHAKE256_20/2_192"); /* 10 20 2 */ + bench_xmss_sign_verify("XMSSMT-SHAKE256_20/4_192"); /* 5 20 4 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_40/2_192"); /* 20 40 4 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_40/4_192"); /* 10 40 4 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE256_40/8_192"); /* 5 40 8 */ +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_60/3_192"); /* 20 60 3 */ +#endif +#ifdef BENCH_XMSS_SLOW_KEYGEN + bench_xmss_sign_verify("XMSSMT-SHAKE256_60/6_192"); /* 10 60 6 */ +#endif + bench_xmss_sign_verify("XMSSMT-SHAKE256_60/12_192");/* 5 60 12 */ +#endif +#endif /* HASH_SIZE 192 */ + } +#endif + return; +} +#endif /* if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY) */ + #ifdef HAVE_ECC -/* +8 for 'ECDSA [%s]' and null terminator */ +/* Maximum ECC name plus null terminator: + * "ECC [%15s]" and "ECDHE [%15s]" and "ECDSA [%15s]" */ #define BENCH_ECC_NAME_SZ (ECC_MAXNAME + 8) /* run all benchmarks on a curve */ @@ -7332,33 +10531,22 @@ void bench_eccMakeKey(int useDeviceID, int curveId) { - int ret = 0, i, times, count, pending = 0; + int ret = 0, i, times, count = 0, pending = 0; int deviceID; - int keySize; -#ifdef WOLFSSL_SMALL_STACK - ecc_key *genKey; -#else - ecc_key genKey[BENCH_MAX_PENDING]; -#endif + int keySize = 0; + WC_DECLARE_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); char name[BENCH_ECC_NAME_SZ]; - double start; + double start = 0; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() -#ifdef WOLFSSL_SMALL_STACK - genKey = (ecc_key *)XMALLOC(sizeof(*genKey) * BENCH_MAX_PENDING, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (genKey == NULL) { - printf("bench_eccMakeKey malloc failed\n"); - return; - } -#endif + WC_CALLOC_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); deviceID = useDeviceID ? devId : INVALID_DEVID; keySize = wc_ecc_get_curve_size_from_id(curveId); - /* clear for done cleanup */ - XMEMSET(genKey, 0, sizeof(*genKey) * BENCH_MAX_PENDING); - /* ECC Make Key */ bench_stats_start(&count, &start); do { @@ -7368,42 +10556,49 @@ for (i = 0; i < BENCH_MAX_PENDING; i++) { if (bench_async_check(&ret, - BENCH_ASYNC_GET_DEV(&genKey[i]), 0, + BENCH_ASYNC_GET_DEV(genKey[i]), 0, ×, agreeTimes, &pending)) { - wc_ecc_free(&genKey[i]); - ret = wc_ecc_init_ex(&genKey[i], HEAP_HINT, deviceID); + wc_ecc_free(genKey[i]); + ret = wc_ecc_init_ex(genKey[i], HEAP_HINT, deviceID); if (ret < 0) { goto exit; } - ret = wc_ecc_make_key_ex(&gRng, keySize, &genKey[i], + ret = wc_ecc_make_key_ex(&gRng, keySize, genKey[i], curveId); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&genKey[i]), 0, ×, + BENCH_ASYNC_GET_DEV(genKey[i]), 0, ×, &pending)) { goto exit; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECC [%15s]", wc_ecc_get_name(curveId)); bench_stats_asym_finish(name, keySize * 8, desc[2], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif /* cleanup */ - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_ecc_free(&genKey[i]); + if (WC_ARRAY_OK(genKey)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_ecc_free(genKey[i]); + } + WC_FREE_ARRAY(genKey, BENCH_MAX_PENDING, HEAP_HINT); } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(genKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); -#endif } @@ -7413,28 +10608,23 @@ int deviceID; int keySize; char name[BENCH_ECC_NAME_SZ]; -#ifdef WOLFSSL_SMALL_STACK - ecc_key *genKey; -#else - ecc_key genKey[BENCH_MAX_PENDING]; -#endif + WC_DECLARE_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); #ifdef HAVE_ECC_DHE -#ifdef WOLFSSL_SMALL_STACK - ecc_key *genKey2; -#else - ecc_key genKey2[BENCH_MAX_PENDING]; -#endif + WC_DECLARE_ARRAY(genKey2, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); #endif #if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) #ifdef HAVE_ECC_VERIFY - int verify[BENCH_MAX_PENDING]; + int verify[BENCH_MAX_PENDING]; #endif #endif word32 x[BENCH_MAX_PENDING]; double start = 0; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() #ifdef HAVE_ECC_DHE WC_DECLARE_ARRAY(shared, byte, @@ -7448,61 +10638,48 @@ BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); #endif -#ifdef WOLFSSL_SMALL_STACK - genKey = (ecc_key *)XMALLOC(sizeof(*genKey) * BENCH_MAX_PENDING, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (genKey == NULL) { - printf("bench_eccMakeKey malloc failed\n"); - return; - } -#ifdef HAVE_ECC_DHE - genKey2 = (ecc_key *)XMALLOC(sizeof(*genKey2) * BENCH_MAX_PENDING, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (genKey2 == NULL) { - XFREE(genKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - printf("bench_eccMakeKey malloc failed\n"); - return; - } -#endif -#endif + /* old scan-build misfires -Wmaybe-uninitialized on these. */ + XMEMSET(sig, 0, sizeof(sig)); + XMEMSET(digest, 0, sizeof(digest)); + XMEMSET(shared, 0, sizeof(shared)); + + WC_CALLOC_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); #ifdef HAVE_ECC_DHE - WC_INIT_ARRAY(shared, byte, + WC_CALLOC_ARRAY(genKey2, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); + WC_ALLOC_ARRAY(shared, byte, BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); #endif #if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) - WC_INIT_ARRAY(sig, byte, BENCH_MAX_PENDING, ECC_MAX_SIG_SIZE, HEAP_HINT); - WC_INIT_ARRAY(digest, byte, BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); + WC_ALLOC_ARRAY(sig, byte, BENCH_MAX_PENDING, ECC_MAX_SIG_SIZE, HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); #endif deviceID = useDeviceID ? devId : INVALID_DEVID; - /* clear for done cleanup */ - XMEMSET(genKey, 0, sizeof(*genKey) * BENCH_MAX_PENDING); -#ifdef HAVE_ECC_DHE - XMEMSET(genKey2, 0, sizeof(*genKey2) * BENCH_MAX_PENDING); -#endif keySize = wc_ecc_get_curve_size_from_id(curveId); /* init keys */ for (i = 0; i < BENCH_MAX_PENDING; i++) { /* setup an context for each key */ - if ((ret = wc_ecc_init_ex(&genKey[i], HEAP_HINT, deviceID)) < 0) { + if ((ret = wc_ecc_init_ex(genKey[i], HEAP_HINT, deviceID)) < 0) { goto exit; } - ret = wc_ecc_make_key_ex(&gRng, keySize, &genKey[i], curveId); + ret = wc_ecc_make_key_ex(&gRng, keySize, genKey[i], curveId); #ifdef WOLFSSL_ASYNC_CRYPT - ret = wc_AsyncWait(ret, &genKey[i].asyncDev, WC_ASYNC_FLAG_NONE); + ret = wc_AsyncWait(ret, &genKey[i]->asyncDev, WC_ASYNC_FLAG_NONE); #endif if (ret < 0) { goto exit; } #ifdef HAVE_ECC_DHE - if ((ret = wc_ecc_init_ex(&genKey2[i], HEAP_HINT, deviceID)) < 0) { + if ((ret = wc_ecc_init_ex(genKey2[i], HEAP_HINT, deviceID)) < 0) { goto exit; } - if ((ret = wc_ecc_make_key_ex(&gRng, keySize, &genKey2[i], + if ((ret = wc_ecc_make_key_ex(&gRng, keySize, genKey2[i], curveId)) > 0) { goto exit; } @@ -7514,7 +10691,7 @@ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \ !defined(HAVE_SELFTEST) for (i = 0; i < BENCH_MAX_PENDING; i++) { - (void)wc_ecc_set_rng(&genKey[i], &gRng); + (void)wc_ecc_set_rng(genKey[i], &gRng); } #endif @@ -7527,21 +10704,27 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&genKey[i]), 1, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, agreeTimes, &pending)) { x[i] = (word32)keySize; - ret = wc_ecc_shared_secret(&genKey[i], &genKey2[i], + ret = wc_ecc_shared_secret(genKey[i], genKey2[i], shared[i], &x[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&genKey[i]), 1, ×, + BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, &pending)) { goto exit_ecdhe; } } } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + PRIVATE_KEY_UNLOCK(); exit_ecdhe: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDHE [%15s]", @@ -7549,10 +10732,16 @@ bench_stats_asym_finish(name, keySize * 8, desc[3], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); if (ret < 0) { goto exit; } + #endif /* HAVE_ECC_DHE */ #if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) @@ -7572,26 +10761,31 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&genKey[i]), 1, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, agreeTimes, &pending)) { - if (genKey[i].state == 0) { + if (genKey[i]->state == 0) { x[i] = ECC_MAX_SIG_SIZE; } ret = wc_ecc_sign_hash(digest[i], (word32)keySize, sig[i], - &x[i], GLOBAL_RNG, &genKey[i]); + &x[i], GLOBAL_RNG, genKey[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&genKey[i]), 1, ×, + BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, &pending)) { goto exit_ecdsa_sign; } } /* bench_async_check */ } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_ecdsa_sign: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", @@ -7599,6 +10793,11 @@ bench_stats_asym_finish(name, keySize * 8, desc[4], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); if (ret < 0) { goto exit; @@ -7614,27 +10813,32 @@ /* while free pending slots in queue, submit ops */ for (i = 0; i < BENCH_MAX_PENDING; i++) { - if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(&genKey[i]), 1, + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, agreeTimes, &pending)) { - if (genKey[i].state == 0) { + if (genKey[i]->state == 0) { verify[i] = 0; } ret = wc_ecc_verify_hash(sig[i], x[i], digest[i], (word32)keySize, &verify[i], - &genKey[i]); + genKey[i]); if (!bench_async_handle(&ret, - BENCH_ASYNC_GET_DEV(&genKey[i]), + BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, &pending)) { goto exit_ecdsa_verify; } } /* if bench_async_check */ } /* for i */ + RECORD_MULTI_VALUE_STATS(); } /* for times */ count += times; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_ecdsa_verify: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", @@ -7642,25 +10846,27 @@ bench_stats_asym_finish(name, keySize * 8, desc[5], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #endif /* HAVE_ECC_VERIFY */ #endif /* !NO_ASN && HAVE_ECC_SIGN */ exit: /* cleanup */ - for (i = 0; i < BENCH_MAX_PENDING; i++) { - wc_ecc_free(&genKey[i]); - #ifdef HAVE_ECC_DHE - wc_ecc_free(&genKey2[i]); - #endif + if (WC_ARRAY_OK(genKey)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) + wc_ecc_free(genKey[i]); + WC_FREE_ARRAY(genKey, BENCH_MAX_PENDING, HEAP_HINT); } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(genKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #ifdef HAVE_ECC_DHE - XFREE(genKey2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (WC_ARRAY_OK(genKey2)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) + wc_ecc_free(genKey2[i]); + WC_FREE_ARRAY(genKey2, BENCH_MAX_PENDING, HEAP_HINT); + } #endif -#endif #ifdef HAVE_ECC_DHE WC_FREE_ARRAY(shared, BENCH_MAX_PENDING, HEAP_HINT); @@ -7693,18 +10899,18 @@ ecc_key *userA = NULL, *userB = NULL; byte *msg = NULL; byte *out = NULL; - char *name = NULL; #else ecc_key userA[1], userB[1]; byte msg[BENCH_ECCENCRYPT_MSG_SIZE]; byte out[BENCH_ECCENCRYPT_OUT_SIZE]; - char name[BENCH_ECC_NAME_SZ]; #endif + char name[BENCH_ECC_NAME_SZ]; int keySize; word32 bench_plainSz = bench_size; int ret, i, count; double start; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() #ifdef WOLFSSL_SMALL_STACK userA = (ecc_key *)XMALLOC(sizeof(*userA), @@ -7715,9 +10921,7 @@ HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); out = (byte *)XMALLOC(outSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - name = (char *)XMALLOC(BENCH_ECC_NAME_SZ, - HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if ((! userA) || (! userB) || (! msg) || (! out) || (! name)) { + if ((! userA) || (! userB) || (! msg) || (! out)) { printf("bench_eccEncrypt malloc failed\n"); goto exit; } @@ -7776,14 +10980,27 @@ printf("wc_ecc_encrypt failed! %d\n", ret); goto exit_enc; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); exit_enc: (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECC [%15s]", wc_ecc_get_name(curveId)); bench_stats_asym_finish(name, keySize * 8, desc[6], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); + + if (ret != 0) + goto exit; bench_stats_start(&count, &start); do { @@ -7795,11 +11012,20 @@ printf("wc_ecc_decrypt failed! %d\n", ret); goto exit_dec; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_dec: bench_stats_asym_finish(name, keySize * 8, desc[7], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif exit: @@ -7817,14 +11043,351 @@ XFREE(msg, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (out) XFREE(out, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (name) - XFREE(name, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #else wc_ecc_free(userB); wc_ecc_free(userA); #endif } #endif + +#ifdef WOLFSSL_SM2 +static void bench_sm2_MakeKey(int useDeviceID) +{ + int ret = 0, i, times, count = 0, pending = 0; + int deviceID; + int keySize; + WC_DECLARE_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); + char name[BENCH_ECC_NAME_SZ]; + double start = 0; + const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() + + deviceID = useDeviceID ? devId : INVALID_DEVID; + keySize = wc_ecc_get_curve_size_from_id(ECC_SM2P256V1); + + WC_CALLOC_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); + + /* ECC Make Key */ + bench_stats_start(&count, &start); + do { + /* while free pending slots in queue, submit ops */ + for (times = 0; times < agreeTimes || pending > 0; ) { + bench_async_poll(&pending); + + for (i = 0; i < BENCH_MAX_PENDING; i++) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 0, + ×, agreeTimes, &pending)) { + + wc_ecc_free(genKey[i]); + ret = wc_ecc_init_ex(genKey[i], HEAP_HINT, deviceID); + if (ret < 0) { + goto exit; + } + + ret = wc_ecc_sm2_make_key(&gRng, genKey[i], + WC_ECC_FLAG_NONE); + if (!bench_async_handle(&ret, + BENCH_ASYNC_GET_DEV(genKey[i]), 0, ×, + &pending)) { + goto exit; + } + } + } /* for i */ + RECORD_MULTI_VALUE_STATS(); + } /* for times */ + count += times; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + +exit: + (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECC [%15s]", + wc_ecc_get_name(ECC_SM2P256V1)); + bench_stats_asym_finish(name, keySize * 8, desc[2], useDeviceID, count, + start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + /* cleanup */ + if (WC_ARRAY_OK(genKey)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) { + wc_ecc_free(genKey[i]); + } + WC_FREE_ARRAY(genKey, BENCH_MAX_PENDING, HEAP_HINT); + } +} + + +void bench_sm2(int useDeviceID) +{ + int ret = 0, i, times, count, pending = 0; + int deviceID; + int keySize; + char name[BENCH_ECC_NAME_SZ]; + WC_DECLARE_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); +#ifdef HAVE_ECC_DHE + WC_DECLARE_ARRAY(genKey2, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); +#endif +#if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) +#ifdef HAVE_ECC_VERIFY + int verify[BENCH_MAX_PENDING]; +#endif +#endif + word32 x[BENCH_MAX_PENDING]; + double start = 0; + const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() + +#ifdef HAVE_ECC_DHE + WC_DECLARE_ARRAY(shared, byte, BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); +#endif +#if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) + WC_DECLARE_ARRAY(sig, byte, BENCH_MAX_PENDING, ECC_MAX_SIG_SIZE, HEAP_HINT); + WC_DECLARE_ARRAY(digest, byte, BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); +#endif + +#ifdef HAVE_ECC_DHE + WC_ALLOC_ARRAY(shared, byte, BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); +#endif +#if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) + WC_ALLOC_ARRAY(sig, byte, BENCH_MAX_PENDING, ECC_MAX_SIG_SIZE, HEAP_HINT); + WC_ALLOC_ARRAY(digest, byte, BENCH_MAX_PENDING, MAX_ECC_BYTES, HEAP_HINT); +#endif + deviceID = useDeviceID ? devId : INVALID_DEVID; + + bench_sm2_MakeKey(useDeviceID); + + WC_CALLOC_ARRAY(genKey, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); +#ifdef HAVE_ECC_DHE + WC_CALLOC_ARRAY(genKey2, ecc_key, BENCH_MAX_PENDING, + sizeof(ecc_key), HEAP_HINT); +#endif + + keySize = wc_ecc_get_curve_size_from_id(ECC_SM2P256V1); + + /* init keys */ + for (i = 0; i < BENCH_MAX_PENDING; i++) { + /* setup an context for each key */ + if ((ret = wc_ecc_init_ex(genKey[i], HEAP_HINT, deviceID)) < 0) { + goto exit; + } + ret = wc_ecc_sm2_make_key(&gRng, genKey[i], WC_ECC_FLAG_NONE); + #ifdef WOLFSSL_ASYNC_CRYPT + ret = wc_AsyncWait(ret, genKey[i].asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret < 0) { + goto exit; + } + + #ifdef HAVE_ECC_DHE + if ((ret = wc_ecc_init_ex(genKey2[i], HEAP_HINT, deviceID)) < 0) { + goto exit; + } + if ((ret = wc_ecc_sm2_make_key(&gRng, genKey2[i], + WC_ECC_FLAG_NONE)) > 0) { + goto exit; + } + #endif + } + +#ifdef HAVE_ECC_DHE +#if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \ + (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \ + !defined(HAVE_SELFTEST) + for (i = 0; i < BENCH_MAX_PENDING; i++) { + (void)wc_ecc_set_rng(genKey[i], &gRng); + } +#endif + + /* ECC Shared Secret */ + bench_stats_start(&count, &start); + PRIVATE_KEY_UNLOCK(); + do { + for (times = 0; times < agreeTimes || pending > 0; ) { + bench_async_poll(&pending); + + /* while free pending slots in queue, submit ops */ + for (i = 0; i < BENCH_MAX_PENDING; i++) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 1, + ×, agreeTimes, &pending)) { + x[i] = (word32)keySize; + ret = wc_ecc_sm2_shared_secret(genKey[i], genKey2[i], + shared[i], &x[i]); + if (!bench_async_handle(&ret, + BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, + &pending)) { + goto exit_ecdhe; + } + } + } /* for i */ + RECORD_MULTI_VALUE_STATS(); + } /* for times */ + count += times; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + + PRIVATE_KEY_UNLOCK(); +exit_ecdhe: + (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDHE [%15s]", + wc_ecc_get_name(ECC_SM2P256V1)); + + bench_stats_asym_finish(name, keySize * 8, desc[3], useDeviceID, count, + start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + if (ret < 0) { + goto exit; + } +#endif /* HAVE_ECC_DHE */ + +#if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) + + /* Init digest to sign */ + for (i = 0; i < BENCH_MAX_PENDING; i++) { + for (count = 0; count < keySize; count++) { + digest[i][count] = (byte)count; + } + } + + RESET_MULTI_VALUE_STATS_VARS(); + + /* ECC Sign */ + bench_stats_start(&count, &start); + do { + for (times = 0; times < agreeTimes || pending > 0; ) { + bench_async_poll(&pending); + + /* while free pending slots in queue, submit ops */ + for (i = 0; i < BENCH_MAX_PENDING; i++) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 1, + ×, agreeTimes, &pending)) { + if (genKey[i]->state == 0) + x[i] = ECC_MAX_SIG_SIZE; + ret = wc_ecc_sm2_sign_hash(digest[i], (word32)keySize, + sig[i], &x[i], &gRng, genKey[i]); + if (!bench_async_handle(&ret, + BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, + &pending)) { + goto exit_ecdsa_sign; + } + } + } /* for i */ + RECORD_MULTI_VALUE_STATS(); + } /* for times */ + count += times; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + +exit_ecdsa_sign: + (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", + wc_ecc_get_name(ECC_SM2P256V1)); + + bench_stats_asym_finish(name, keySize * 8, desc[4], useDeviceID, count, + start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + if (ret < 0) { + goto exit; + } + +#ifdef HAVE_ECC_VERIFY + + /* ECC Verify */ + bench_stats_start(&count, &start); + do { + for (times = 0; times < agreeTimes || pending > 0; ) { + bench_async_poll(&pending); + + /* while free pending slots in queue, submit ops */ + for (i = 0; i < BENCH_MAX_PENDING; i++) { + if (bench_async_check(&ret, BENCH_ASYNC_GET_DEV(genKey[i]), 1, + ×, agreeTimes, &pending)) { + if (genKey[i]->state == 0) + verify[i] = 0; + ret = wc_ecc_sm2_verify_hash(sig[i], x[i], digest[i], + (word32)keySize, &verify[i], genKey[i]); + if (!bench_async_handle(&ret, + BENCH_ASYNC_GET_DEV(genKey[i]), 1, ×, + &pending)) { + goto exit_ecdsa_verify; + } + } + } /* for i */ + RECORD_MULTI_VALUE_STATS(); + } /* for times */ + count += times; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + +exit_ecdsa_verify: + (void)XSNPRINTF(name, BENCH_ECC_NAME_SZ, "ECDSA [%15s]", + wc_ecc_get_name(ECC_SM2P256V1)); + + bench_stats_asym_finish(name, keySize * 8, desc[5], useDeviceID, count, + start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +#endif /* HAVE_ECC_VERIFY */ +#endif /* !NO_ASN && HAVE_ECC_SIGN */ + +exit: + + /* cleanup */ + if (WC_ARRAY_OK(genKey)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) + wc_ecc_free(genKey[i]); + WC_FREE_ARRAY(genKey, BENCH_MAX_PENDING, HEAP_HINT); + } + #ifdef HAVE_ECC_DHE + if (WC_ARRAY_OK(genKey2)) { + for (i = 0; i < BENCH_MAX_PENDING; i++) + wc_ecc_free(genKey2[i]); + WC_FREE_ARRAY(genKey2, BENCH_MAX_PENDING, HEAP_HINT); + } + #endif + +#ifdef HAVE_ECC_DHE + WC_FREE_ARRAY(shared, BENCH_MAX_PENDING, HEAP_HINT); +#endif +#if !defined(NO_ASN) && defined(HAVE_ECC_SIGN) + WC_FREE_ARRAY(sig, BENCH_MAX_PENDING, HEAP_HINT); + WC_FREE_ARRAY(digest, BENCH_MAX_PENDING, HEAP_HINT); +#endif + + + (void)useDeviceID; + (void)pending; + (void)x; + (void)count; + (void)times; + (void)desc; + (void)start; + (void)name; +} +#endif /* WOLFSSL_SM2 */ #endif /* HAVE_ECC */ #ifdef HAVE_CURVE25519 @@ -7834,6 +11397,7 @@ double start; int ret = 0, i, count; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() /* Key Gen */ bench_stats_start(&count, &start); @@ -7852,11 +11416,20 @@ printf("wc_curve25519_make_key failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("CURVE", 25519, desc[2], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #ifdef HAVE_CURVE25519_SHARED_SECRET @@ -7868,6 +11441,7 @@ byte shared[32]; const char**desc = bench_desc_words[lng_index]; word32 x = 0; + DECLARE_MULTI_VALUE_STATS_VARS() wc_curve25519_init_ex(&genKey, HEAP_HINT, useDeviceID ? devId : INVALID_DEVID); @@ -7896,12 +11470,21 @@ printf("curve25519_shared_secret failed: %d\n", ret); goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("CURVE", 25519, desc[3], useDeviceID, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif wc_curve25519_free(&genKey2); wc_curve25519_free(&genKey); @@ -7912,10 +11495,12 @@ #ifdef HAVE_ED25519 void bench_ed25519KeyGen(void) { +#ifdef HAVE_ED25519_MAKE_KEY ed25519_key genKey; double start; int i, count; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() /* Key Gen */ bench_stats_start(&count, &start); @@ -7924,16 +11509,28 @@ wc_ed25519_init(&genKey); (void)wc_ed25519_make_key(&gRng, 32, &genKey); wc_ed25519_free(&genKey); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ED", 25519, desc[2], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif +#endif /* HAVE_ED25519_MAKE_KEY */ } void bench_ed25519KeySign(void) { +#ifdef HAVE_ED25519_MAKE_KEY int ret; +#endif ed25519_key genKey; #ifdef HAVE_ED25519_SIGN double start; @@ -7942,15 +11539,18 @@ byte msg[512]; word32 x = 0; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() #endif wc_ed25519_init(&genKey); +#ifdef HAVE_ED25519_MAKE_KEY ret = wc_ed25519_make_key(&gRng, ED25519_KEY_SIZE, &genKey); if (ret != 0) { printf("ed25519_make_key failed\n"); return; } +#endif #ifdef HAVE_ED25519_SIGN /* make dummy msg */ @@ -7966,11 +11566,22 @@ printf("ed25519_sign_msg failed\n"); goto exit_ed_sign; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_ed_sign: bench_stats_asym_finish("ED", 25519, desc[4], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); #ifdef HAVE_ED25519_VERIFY bench_stats_start(&count, &start); @@ -7983,11 +11594,20 @@ printf("ed25519_verify_msg failed\n"); goto exit_ed_verify; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit_ed_verify: bench_stats_asym_finish("ED", 25519, desc[5], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #endif /* HAVE_ED25519_VERIFY */ #endif /* HAVE_ED25519_SIGN */ @@ -8002,6 +11622,7 @@ double start; int ret = 0, i, count; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() /* Key Gen */ bench_stats_start(&count, &start); @@ -8013,10 +11634,19 @@ printf("wc_curve448_make_key failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("CURVE", 448, desc[2], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } #ifdef HAVE_CURVE448_SHARED_SECRET @@ -8028,6 +11658,7 @@ byte shared[56]; const char**desc = bench_desc_words[lng_index]; word32 x = 0; + DECLARE_MULTI_VALUE_STATS_VARS() wc_curve448_init(&genKey); wc_curve448_init(&genKey2); @@ -8054,11 +11685,20 @@ printf("curve448_shared_secret failed: %d\n", ret); goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + exit: bench_stats_asym_finish("CURVE", 448, desc[3], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif wc_curve448_free(&genKey2); wc_curve448_free(&genKey); @@ -8073,6 +11713,7 @@ double start; int i, count; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() /* Key Gen */ bench_stats_start(&count, &start); @@ -8081,17 +11722,25 @@ wc_ed448_init(&genKey); (void)wc_ed448_make_key(&gRng, ED448_KEY_SIZE, &genKey); wc_ed448_free(&genKey); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ED", 448, desc[2], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif } - void bench_ed448KeySign(void) { int ret; - ed448_key genKey; + WC_DECLARE_VAR(genKey, ed448_key, 1, HEAP_HINT); #ifdef HAVE_ED448_SIGN double start; int i, count; @@ -8099,14 +11748,17 @@ byte msg[512]; word32 x = 0; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() #endif - wc_ed448_init(&genKey); + WC_ALLOC_VAR(genKey, ed448_key, 1, HEAP_HINT); + + wc_ed448_init(genKey); - ret = wc_ed448_make_key(&gRng, ED448_KEY_SIZE, &genKey); + ret = wc_ed448_make_key(&gRng, ED448_KEY_SIZE, genKey); if (ret != 0) { printf("ed448_make_key failed\n"); - return; + goto exit; } #ifdef HAVE_ED448_SIGN @@ -8118,17 +11770,27 @@ do { for (i = 0; i < agreeTimes; i++) { x = sizeof(sig); - ret = wc_ed448_sign_msg(msg, sizeof(msg), sig, &x, &genKey, + ret = wc_ed448_sign_msg(msg, sizeof(msg), sig, &x, genKey, NULL, 0); if (ret != 0) { printf("ed448_sign_msg failed\n"); - goto exit_ed_sign; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); -exit_ed_sign: + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ED", 448, desc[4], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); #ifdef HAVE_ED448_VERIFY bench_stats_start(&count, &start); @@ -8136,20 +11798,31 @@ for (i = 0; i < agreeTimes; i++) { int verify = 0; ret = wc_ed448_verify_msg(sig, x, msg, sizeof(msg), &verify, - &genKey, NULL, 0); + genKey, NULL, 0); if (ret != 0 || verify != 1) { printf("ed448_verify_msg failed\n"); - goto exit_ed_verify; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); -exit_ed_verify: + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ED", 448, desc[5], 0, count, start, ret); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif #endif /* HAVE_ED448_VERIFY */ #endif /* HAVE_ED448_SIGN */ - wc_ed448_free(&genKey); +exit: + + wc_ed448_free(genKey); + WC_FREE_VAR(genKey, HEAP_HINT); } #endif /* HAVE_ED448 */ @@ -8157,114 +11830,166 @@ #ifdef WOLFCRYPT_ECCSI_KMS void bench_eccsiKeyGen(void) { - EccsiKey genKey; + WC_DECLARE_VAR(genKey, EccsiKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; int ret; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT); /* Key Gen */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID); - ret = wc_MakeEccsiKey(&genKey, &gRng); + wc_InitEccsiKey(genKey, NULL, INVALID_DEVID); + ret = wc_MakeEccsiKey(genKey, &gRng); + wc_FreeEccsiKey(genKey); if (ret != 0) { printf("wc_MakeEccsiKey failed: %d\n", ret); - break; + goto exit; } - wc_FreeEccsiKey(&genKey); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[2], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +exit: + + WC_FREE_VAR(genKey, HEAP_HINT); } void bench_eccsiPairGen(void) { - EccsiKey genKey; + WC_DECLARE_VAR(genKey, EccsiKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; - mp_int ssk; + WC_DECLARE_VAR(ssk, mp_int, 1, HEAP_HINT); ecc_point* pvt; static const byte id[] = { 0x01, 0x23, 0x34, 0x45 }; int ret; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT); + WC_ALLOC_VAR(ssk, mp_int, 1, HEAP_HINT); - (void)mp_init(&ssk); + (void)mp_init(ssk); pvt = wc_ecc_new_point(); - wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID); - (void)wc_MakeEccsiKey(&genKey, &gRng); + wc_InitEccsiKey(genKey, NULL, INVALID_DEVID); + (void)wc_MakeEccsiKey(genKey, &gRng); /* RSK Gen */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_MakeEccsiPair(&genKey, &gRng, WC_HASH_TYPE_SHA256, id, - sizeof(id), &ssk, pvt); + ret = wc_MakeEccsiPair(genKey, &gRng, WC_HASH_TYPE_SHA256, id, + sizeof(id), ssk, pvt); if (ret != 0) { printf("wc_MakeEccsiPair failed: %d\n", ret); - break; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[12], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif - wc_FreeEccsiKey(&genKey); + wc_FreeEccsiKey(genKey); wc_ecc_del_point(pvt); - mp_free(&ssk); + mp_free(ssk); + +exit: + + WC_FREE_VAR(genKey, HEAP_HINT); + WC_FREE_VAR(ssk, HEAP_HINT); } #endif #ifdef WOLFCRYPT_ECCSI_CLIENT void bench_eccsiValidate(void) { - EccsiKey genKey; + WC_DECLARE_VAR(genKey, EccsiKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; - mp_int ssk; + WC_DECLARE_VAR(ssk, mp_int, 1, HEAP_HINT); ecc_point* pvt; static const byte id[] = { 0x01, 0x23, 0x34, 0x45 }; int valid; int ret; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT); + WC_ALLOC_VAR(ssk, mp_int, 1, HEAP_HINT); - (void)mp_init(&ssk); + (void)mp_init(ssk); pvt = wc_ecc_new_point(); - wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID); - (void)wc_MakeEccsiKey(&genKey, &gRng); - (void)wc_MakeEccsiPair(&genKey, &gRng, WC_HASH_TYPE_SHA256, id, sizeof(id), - &ssk, pvt); + wc_InitEccsiKey(genKey, NULL, INVALID_DEVID); + (void)wc_MakeEccsiKey(genKey, &gRng); + (void)wc_MakeEccsiPair(genKey, &gRng, WC_HASH_TYPE_SHA256, id, sizeof(id), + ssk, pvt); /* Validation of RSK */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_ValidateEccsiPair(&genKey, WC_HASH_TYPE_SHA256, id, - sizeof(id), &ssk, pvt, &valid); + ret = wc_ValidateEccsiPair(genKey, WC_HASH_TYPE_SHA256, id, + sizeof(id), ssk, pvt, &valid); if (ret != 0 || !valid) { printf("wc_ValidateEccsiPair failed: %d (valid=%d))\n", ret, valid); - break; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[11], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif - wc_FreeEccsiKey(&genKey); + wc_FreeEccsiKey(genKey); wc_ecc_del_point(pvt); - mp_free(&ssk); + mp_free(ssk); + +exit: + + WC_FREE_VAR(genKey, HEAP_HINT); + WC_FREE_VAR(ssk, HEAP_HINT); } void bench_eccsi(void) { - EccsiKey genKey; + WC_DECLARE_VAR(genKey, EccsiKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; - mp_int ssk; + WC_DECLARE_VAR(ssk, mp_int, 1, HEAP_HINT); ecc_point* pvt; static const byte id[] = { 0x01, 0x23, 0x34, 0x45 }; static const byte msg[] = { 0x01, 0x23, 0x34, 0x45 }; @@ -8274,52 +11999,81 @@ word32 sigSz = sizeof(sig); int ret; int verified; + DECLARE_MULTI_VALUE_STATS_VARS() - (void)mp_init(&ssk); + WC_ALLOC_VAR(genKey, EccsiKey, 1, HEAP_HINT); + WC_ALLOC_VAR(ssk, mp_int, 1, HEAP_HINT); + + (void)mp_init(ssk); pvt = wc_ecc_new_point(); - (void)wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID); - (void)wc_MakeEccsiKey(&genKey, &gRng); - (void)wc_MakeEccsiPair(&genKey, &gRng, WC_HASH_TYPE_SHA256, id, sizeof(id), - &ssk, pvt); - (void)wc_HashEccsiId(&genKey, WC_HASH_TYPE_SHA256, id, sizeof(id), pvt, + (void)wc_InitEccsiKey(genKey, NULL, INVALID_DEVID); + (void)wc_MakeEccsiKey(genKey, &gRng); + (void)wc_MakeEccsiPair(genKey, &gRng, WC_HASH_TYPE_SHA256, id, sizeof(id), + ssk, pvt); + (void)wc_HashEccsiId(genKey, WC_HASH_TYPE_SHA256, id, sizeof(id), pvt, hash, &hashSz); - (void)wc_SetEccsiHash(&genKey, hash, hashSz); - (void)wc_SetEccsiPair(&genKey, &ssk, pvt); + (void)wc_SetEccsiHash(genKey, hash, hashSz); + (void)wc_SetEccsiPair(genKey, ssk, pvt); /* Encapsulate */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_SignEccsiHash(&genKey, &gRng, WC_HASH_TYPE_SHA256, msg, + ret = wc_SignEccsiHash(genKey, &gRng, WC_HASH_TYPE_SHA256, msg, sizeof(msg), sig, &sigSz); if (ret != 0) { printf("wc_SignEccsiHash failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[4], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); /* Derive */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_VerifyEccsiHash(&genKey, WC_HASH_TYPE_SHA256, msg, + ret = wc_VerifyEccsiHash(genKey, WC_HASH_TYPE_SHA256, msg, sizeof(msg), sig, sigSz, &verified); if (ret != 0 || !verified) { printf("wc_VerifyEccsiHash failed: %d (verified: %d)\n", ret, verified); - break; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("ECCSI", 256, desc[5], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif - wc_FreeEccsiKey(&genKey); + wc_FreeEccsiKey(genKey); wc_ecc_del_point(pvt); + +exit: + + WC_FREE_VAR(genKey, HEAP_HINT); + WC_FREE_VAR(ssk, HEAP_HINT); } #endif /* WOLFCRYPT_ECCSI_CLIENT */ #endif /* WOLFCRYPT_HAVE_ECCSI */ @@ -8328,66 +12082,98 @@ #ifdef WOLFCRYPT_SAKKE_KMS void bench_sakkeKeyGen(void) { - SakkeKey genKey; + WC_DECLARE_VAR(genKey, SakkeKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; int ret; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT); /* Key Gen */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - wc_InitSakkeKey_ex(&genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); - ret = wc_MakeSakkeKey(&genKey, &gRng); + wc_InitSakkeKey_ex(genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); + ret = wc_MakeSakkeKey(genKey, &gRng); if (ret != 0) { printf("wc_MakeSakkeKey failed: %d\n", ret); - break; + goto exit; } - wc_FreeSakkeKey(&genKey); + wc_FreeSakkeKey(genKey); + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("SAKKE", 1024, desc[2], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + +exit: + + WC_FREE_VAR(genKey, HEAP_HINT); } void bench_sakkeRskGen(void) { - SakkeKey genKey; + WC_DECLARE_VAR(genKey, SakkeKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; ecc_point* rsk; static const byte id[] = { 0x01, 0x23, 0x34, 0x45 }; int ret; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT); rsk = wc_ecc_new_point(); - wc_InitSakkeKey_ex(&genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); - (void)wc_MakeSakkeKey(&genKey, &gRng); + wc_InitSakkeKey_ex(genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); + (void)wc_MakeSakkeKey(genKey, &gRng); /* RSK Gen */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_MakeSakkeRsk(&genKey, id, sizeof(id), rsk); + ret = wc_MakeSakkeRsk(genKey, id, sizeof(id), rsk); if (ret != 0) { printf("wc_MakeSakkeRsk failed: %d\n", ret); - break; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("SAKKE", 1024, desc[8], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif - wc_FreeSakkeKey(&genKey); + wc_FreeSakkeKey(genKey); wc_ecc_del_point(rsk); + +exit: + + WC_FREE_VAR(genKey, HEAP_HINT); } #endif #ifdef WOLFCRYPT_SAKKE_CLIENT void bench_sakkeValidate(void) { - SakkeKey genKey; + WC_DECLARE_VAR(genKey, SakkeKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; @@ -8395,35 +12181,51 @@ static const byte id[] = { 0x01, 0x23, 0x34, 0x45 }; int valid; int ret; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT); rsk = wc_ecc_new_point(); - (void)wc_InitSakkeKey_ex(&genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); - (void)wc_MakeSakkeKey(&genKey, &gRng); - (void)wc_MakeSakkeRsk(&genKey, id, sizeof(id), rsk); - (void)wc_ValidateSakkeRsk(&genKey, id, sizeof(id), rsk, &valid); + (void)wc_InitSakkeKey_ex(genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); + (void)wc_MakeSakkeKey(genKey, &gRng); + (void)wc_MakeSakkeRsk(genKey, id, sizeof(id), rsk); + (void)wc_ValidateSakkeRsk(genKey, id, sizeof(id), rsk, &valid); /* Validation of RSK */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_ValidateSakkeRsk(&genKey, id, sizeof(id), rsk, &valid); + ret = wc_ValidateSakkeRsk(genKey, id, sizeof(id), rsk, &valid); if (ret != 0 || !valid) { printf("wc_ValidateSakkeRsk failed: %d (valid=%d))\n", ret, valid); - break; + goto exit; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish("SAKKE", 1024, desc[11], 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif - wc_FreeSakkeKey(&genKey); + wc_FreeSakkeKey(genKey); wc_ecc_del_point(rsk); + +exit: + + WC_FREE_VAR(genKey, HEAP_HINT); } void bench_sakke(void) { - SakkeKey genKey; + WC_DECLARE_VAR(genKey, SakkeKey, 1, HEAP_HINT); double start; int i, count; const char**desc = bench_desc_words[lng_index]; @@ -8439,152 +12241,227 @@ word32 len = 0; byte* iTable = NULL; word32 iTableLen = 0; + DECLARE_MULTI_VALUE_STATS_VARS() + + WC_ALLOC_VAR(genKey, SakkeKey, 1, HEAP_HINT); XMEMCPY(ssv, ssv_init, sizeof ssv); rsk = wc_ecc_new_point(); - (void)wc_InitSakkeKey_ex(&genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); - (void)wc_MakeSakkeKey(&genKey, &gRng); - (void)wc_MakeSakkeRsk(&genKey, id, sizeof(id), rsk); - (void)wc_SetSakkeRsk(&genKey, rsk, NULL, 0); - (void)wc_SetSakkeIdentity(&genKey, id, sizeof(id)); + (void)wc_InitSakkeKey_ex(genKey, 128, ECC_SAKKE_1, NULL, INVALID_DEVID); + (void)wc_MakeSakkeKey(genKey, &gRng); + (void)wc_MakeSakkeRsk(genKey, id, sizeof(id), rsk); + (void)wc_SetSakkeRsk(genKey, rsk, NULL, 0); + (void)wc_SetSakkeIdentity(genKey, id, sizeof(id)); /* Encapsulate */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_MakeSakkeEncapsulatedSSV(&genKey, + ret = wc_MakeSakkeEncapsulatedSSV(genKey, WC_HASH_TYPE_SHA256, ssv, sizeof(ssv), auth, &authSz); if (ret != 0) { printf("wc_MakeSakkeEncapsulatedSSV failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } /* for */ count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); bench_stats_asym_finish_ex("SAKKE", 1024, desc[9], "-1", 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); /* Derive */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { XMEMCPY(derSSV, ssv, sizeof(ssv)); - ret = wc_DeriveSakkeSSV(&genKey, WC_HASH_TYPE_SHA256, derSSV, + ret = wc_DeriveSakkeSSV(genKey, WC_HASH_TYPE_SHA256, derSSV, sizeof(derSSV), auth, authSz); if (ret != 0) { printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-1", 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif /* Calculate Point I and generate table. */ - (void)wc_MakeSakkePointI(&genKey, id, sizeof(id)); + (void)wc_MakeSakkePointI(genKey, id, sizeof(id)); iTableLen = 0; - (void)wc_GenerateSakkePointITable(&genKey, NULL, &iTableLen); + (void)wc_GenerateSakkePointITable(genKey, NULL, &iTableLen); if (iTableLen != 0) { iTable = (byte*)XMALLOC(iTableLen, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - (void)wc_GenerateSakkePointITable(&genKey, iTable, &iTableLen); + if (iTable == NULL) + WC_ALLOC_DO_ON_FAILURE(); + (void)wc_GenerateSakkePointITable(genKey, iTable, &iTableLen); } /* Encapsulate with Point I table */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { - ret = wc_MakeSakkeEncapsulatedSSV(&genKey, + ret = wc_MakeSakkeEncapsulatedSSV(genKey, WC_HASH_TYPE_SHA256, ssv, sizeof(ssv), auth, &authSz); if (ret != 0) { printf("wc_MakeSakkeEncapsulatedSSV failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); bench_stats_asym_finish_ex("SAKKE", 1024, desc[9], "-2", 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif - (void)wc_SetSakkeRsk(&genKey, rsk, table, len); + RESET_MULTI_VALUE_STATS_VARS(); + + (void)wc_SetSakkeRsk(genKey, rsk, table, len); /* Derive with Point I table */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { XMEMCPY(derSSV, ssv, sizeof(ssv)); - ret = wc_DeriveSakkeSSV(&genKey, WC_HASH_TYPE_SHA256, derSSV, + ret = wc_DeriveSakkeSSV(genKey, WC_HASH_TYPE_SHA256, derSSV, sizeof(derSSV), auth, authSz); if (ret != 0) { printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-2", 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); len = 0; - (void)wc_GenerateSakkeRskTable(&genKey, rsk, NULL, &len); + (void)wc_GenerateSakkeRskTable(genKey, rsk, NULL, &len); if (len > 0) { table = (byte*)XMALLOC(len, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - (void)wc_GenerateSakkeRskTable(&genKey, rsk, table, &len); + if (table == NULL) + WC_ALLOC_DO_ON_FAILURE(); + (void)wc_GenerateSakkeRskTable(genKey, rsk, table, &len); } - (void)wc_SetSakkeRsk(&genKey, rsk, table, len); + (void)wc_SetSakkeRsk(genKey, rsk, table, len); /* Derive with Point I table and RSK table */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { XMEMCPY(derSSV, ssv, sizeof(ssv)); - ret = wc_DeriveSakkeSSV(&genKey, WC_HASH_TYPE_SHA256, derSSV, + ret = wc_DeriveSakkeSSV(genKey, WC_HASH_TYPE_SHA256, derSSV, sizeof(derSSV), auth, authSz); if (ret != 0) { printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-3", 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif + + RESET_MULTI_VALUE_STATS_VARS(); - wc_ClearSakkePointITable(&genKey); + wc_ClearSakkePointITable(genKey); /* Derive with RSK table */ bench_stats_start(&count, &start); do { for (i = 0; i < genTimes; i++) { XMEMCPY(derSSV, ssv, sizeof(ssv)); - ret = wc_DeriveSakkeSSV(&genKey, WC_HASH_TYPE_SHA256, derSSV, + ret = wc_DeriveSakkeSSV(genKey, WC_HASH_TYPE_SHA256, derSSV, sizeof(derSSV), auth, authSz); if (ret != 0) { printf("wc_DeriveSakkeSSV failed: %d\n", ret); break; } + RECORD_MULTI_VALUE_STATS(); } if (ret != 0) break; count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); + bench_stats_asym_finish_ex("SAKKE", 1024, desc[10], "-4", 0, count, start, 0); +#ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); +#endif - wc_FreeSakkeKey(&genKey); + wc_FreeSakkeKey(genKey); wc_ecc_del_point(rsk); + +exit: + + if (iTable) + XFREE(iTable, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + + if (table) + XFREE(table, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + + WC_FREE_VAR(genKey, HEAP_HINT); } #endif /* WOLFCRYPT_SAKKE_CLIENT */ #endif /* WOLFCRYPT_HAVE_SAKKE */ -#if defined(HAVE_PQC) && defined(HAVE_LIBOQS) #ifdef HAVE_FALCON void bench_falconKeySign(byte level) { @@ -8596,6 +12473,7 @@ byte msg[512]; word32 x = 0; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() ret = wc_falcon_init(&key); if (ret != 0) { @@ -8641,20 +12519,30 @@ x = FALCON_LEVEL5_SIG_SIZE; } - ret = wc_falcon_sign_msg(msg, sizeof(msg), sig, &x, &key); + ret = wc_falcon_sign_msg(msg, sizeof(msg), sig, &x, &key, GLOBAL_RNG); if (ret != 0) { printf("wc_falcon_sign_msg failed\n"); } } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); if (ret == 0) { bench_stats_asym_finish("FALCON", level, desc[4], 0, count, start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif } + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { @@ -8668,13 +12556,21 @@ ret = -1; } } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); if (ret == 0) { bench_stats_asym_finish("FALCON", level, desc[5], 0, count, start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif } wc_falcon_free(&key); @@ -8682,16 +12578,1100 @@ #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM + +#if defined(WOLFSSL_DILITHIUM_NO_SIGN) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + +#ifndef WOLFSSL_NO_ML_DSA_44 +static const unsigned char bench_dilithium_level2_sig[] = { + 0x5e, 0xc1, 0xce, 0x0e, 0x31, 0xea, 0x10, 0x52, 0xa3, 0x7a, + 0xfe, 0x4d, 0xac, 0x07, 0x89, 0x5a, 0x45, 0xbd, 0x5a, 0xe5, + 0x22, 0xed, 0x98, 0x4d, 0x2f, 0xc8, 0x27, 0x00, 0x99, 0x40, + 0x00, 0x79, 0xcd, 0x93, 0x27, 0xd0, 0x40, 0x33, 0x79, 0x4f, + 0xe5, 0x16, 0x89, 0x9f, 0xbd, 0xa6, 0x3f, 0xdd, 0x68, 0x74, + 0x73, 0xc3, 0x97, 0x54, 0x11, 0x1d, 0xc8, 0xb8, 0xc8, 0xfd, + 0x3a, 0xbe, 0xca, 0x17, 0x0f, 0x10, 0x6d, 0x89, 0x6d, 0xe0, + 0xb2, 0xff, 0x3b, 0xe5, 0xa1, 0x75, 0xea, 0x35, 0x16, 0xa3, + 0x0c, 0x6e, 0x4a, 0x7b, 0xdb, 0x28, 0xc6, 0x2a, 0x76, 0x0e, + 0x78, 0x78, 0xa0, 0x4f, 0x4e, 0xf8, 0x99, 0xff, 0xe7, 0x47, + 0x7e, 0xc4, 0x62, 0xa7, 0xb4, 0xb9, 0x2b, 0xc1, 0xc7, 0xd0, + 0x00, 0xb6, 0xaa, 0xa7, 0x37, 0xd5, 0x1e, 0x19, 0xc4, 0xc4, + 0x59, 0x2f, 0xa5, 0x09, 0xa3, 0xda, 0x5d, 0xd4, 0x48, 0x64, + 0x16, 0x0e, 0x92, 0xdf, 0x61, 0xb7, 0x25, 0x3b, 0x90, 0x5a, + 0x08, 0xb5, 0x88, 0xe8, 0x64, 0x80, 0x63, 0xee, 0xbf, 0x59, + 0x0f, 0x4a, 0x48, 0x1e, 0x77, 0xa9, 0x46, 0xc6, 0x9c, 0x0b, + 0x83, 0xad, 0xb5, 0xbf, 0xb5, 0x5b, 0x99, 0xf3, 0x55, 0xe8, + 0xe5, 0xe7, 0x5c, 0x12, 0xac, 0x06, 0x06, 0xe0, 0xc0, 0x32, + 0x5d, 0xb6, 0x9f, 0x2b, 0x8e, 0x19, 0x5c, 0x2a, 0x58, 0xbb, + 0x37, 0xf1, 0x68, 0x56, 0x8b, 0x74, 0x94, 0x58, 0x48, 0x28, + 0xee, 0xf7, 0x0a, 0x8f, 0xad, 0x43, 0x67, 0xe1, 0xa3, 0x8c, + 0x3b, 0x35, 0x48, 0xcc, 0x52, 0x14, 0x36, 0x99, 0x18, 0x71, + 0x1c, 0xb2, 0xfc, 0x82, 0xda, 0xac, 0xd5, 0x55, 0x0a, 0x77, + 0x44, 0x6a, 0x48, 0xed, 0xfc, 0x5a, 0x68, 0xa6, 0x4d, 0x65, + 0xe7, 0x30, 0xaa, 0x23, 0x66, 0x84, 0xdf, 0x83, 0xf1, 0x17, + 0x5c, 0x46, 0xfe, 0x63, 0xcb, 0xc3, 0x6e, 0x4e, 0x47, 0x8d, + 0x30, 0x48, 0x06, 0xda, 0x97, 0x6b, 0x04, 0x5d, 0x44, 0xf3, + 0xb7, 0x2a, 0x6d, 0x2b, 0xbb, 0xcd, 0x97, 0x4e, 0x26, 0x8e, + 0xc9, 0x03, 0x0b, 0x5d, 0x68, 0xed, 0x81, 0xf7, 0x19, 0x61, + 0x81, 0xe9, 0xac, 0x3a, 0x35, 0xcd, 0xe8, 0xfd, 0x99, 0xdb, + 0x89, 0x83, 0x7d, 0x23, 0x6a, 0xc1, 0xc1, 0x10, 0xe9, 0xd3, + 0xfa, 0x9e, 0x5a, 0xcd, 0x73, 0xa3, 0x0a, 0x37, 0xa3, 0x12, + 0xef, 0x72, 0xa2, 0x28, 0xd4, 0x3d, 0x67, 0x53, 0x24, 0x0d, + 0x61, 0x98, 0xbb, 0x07, 0xf3, 0xa7, 0x79, 0x22, 0x74, 0x57, + 0x99, 0xe8, 0x7a, 0xbf, 0x90, 0x84, 0xa2, 0x6b, 0x29, 0x34, + 0xac, 0xc9, 0xff, 0x67, 0x82, 0xd0, 0xd2, 0x7d, 0x69, 0xc0, + 0xf3, 0xd7, 0x4b, 0x5c, 0xf2, 0xa8, 0x53, 0x8b, 0x78, 0x57, + 0xfc, 0x74, 0xf5, 0x81, 0x6e, 0xc2, 0x5b, 0x32, 0x52, 0x9e, + 0x58, 0x84, 0xa1, 0x71, 0xd5, 0x8c, 0xf5, 0x16, 0x36, 0x4d, + 0x11, 0xd4, 0xb5, 0xc2, 0x05, 0xc4, 0x03, 0xce, 0x83, 0xea, + 0x0b, 0x6a, 0x2e, 0xf6, 0x28, 0x5e, 0xb2, 0x40, 0x8c, 0xa3, + 0x6a, 0xc7, 0xee, 0x04, 0x54, 0x93, 0x0f, 0x3b, 0xf9, 0x57, + 0x92, 0x00, 0xf1, 0xc7, 0x1b, 0x48, 0x63, 0xcb, 0xd3, 0xdd, + 0x40, 0x90, 0x46, 0xb0, 0x87, 0x2a, 0xb8, 0xec, 0xbc, 0x07, + 0x09, 0x83, 0x25, 0xb1, 0x88, 0x2c, 0xa0, 0x0a, 0x40, 0x4f, + 0xfd, 0xec, 0xfd, 0xbe, 0x18, 0xae, 0xdd, 0x83, 0x89, 0x83, + 0x2d, 0x10, 0xb4, 0x14, 0x30, 0xac, 0x6c, 0xd9, 0xc9, 0xaa, + 0xbc, 0xdb, 0x5e, 0x14, 0xab, 0x19, 0x64, 0xaa, 0xb1, 0x9c, + 0xc3, 0xf5, 0xdc, 0x2b, 0xcd, 0x26, 0x0b, 0x81, 0x1a, 0x0e, + 0x0a, 0xd6, 0x39, 0x79, 0x10, 0x06, 0xbf, 0xe0, 0xc1, 0x8b, + 0x20, 0x24, 0x90, 0x8b, 0x0f, 0xa4, 0x2d, 0x2d, 0x46, 0x2a, + 0xd4, 0xf3, 0xa9, 0x58, 0x4b, 0xd9, 0xa6, 0x6c, 0x75, 0x3d, + 0xbc, 0x36, 0x76, 0x7f, 0xef, 0x1b, 0xa1, 0x41, 0xba, 0xd0, + 0xfe, 0x16, 0x19, 0xc3, 0x92, 0xe3, 0x59, 0x07, 0x3f, 0x48, + 0x11, 0x70, 0xe0, 0x8a, 0xff, 0x97, 0xbc, 0x71, 0xd5, 0xb9, + 0x4a, 0x9b, 0x4c, 0xb8, 0x4b, 0x50, 0xd6, 0x43, 0xe8, 0x84, + 0x0a, 0x95, 0xd0, 0x20, 0x28, 0xd3, 0x20, 0x4a, 0x0e, 0x1b, + 0xe6, 0x5d, 0x2f, 0x0c, 0xdb, 0x76, 0xab, 0xa3, 0xc2, 0xad, + 0xd5, 0x86, 0xae, 0xb9, 0x26, 0xb2, 0x5d, 0x72, 0x27, 0xbb, + 0xec, 0x23, 0x9f, 0x42, 0x90, 0x58, 0xe1, 0xf8, 0xe9, 0x63, + 0xdf, 0x1a, 0x46, 0x53, 0x65, 0x05, 0xfb, 0x20, 0x21, 0xa6, + 0x64, 0xc8, 0x5c, 0x67, 0x6b, 0x41, 0x6c, 0x04, 0x34, 0xeb, + 0x05, 0x71, 0xeb, 0xbe, 0xed, 0x6d, 0xa2, 0x96, 0x67, 0x45, + 0xe7, 0x47, 0x22, 0x64, 0xaf, 0x82, 0xf8, 0x78, 0x0e, 0xe6, + 0xa1, 0x4a, 0x2d, 0x82, 0x1e, 0xd0, 0xc2, 0x79, 0x4e, 0x29, + 0x89, 0xd9, 0xf3, 0x3f, 0xb6, 0xc4, 0xee, 0x69, 0xb2, 0x8f, + 0x8b, 0xd9, 0x13, 0xd9, 0x6e, 0x3a, 0xc5, 0x9f, 0xdf, 0x25, + 0xb7, 0xc3, 0x16, 0xb8, 0xa2, 0x85, 0x17, 0xae, 0xe9, 0x95, + 0x5d, 0xb8, 0x1d, 0x21, 0xbb, 0xd9, 0x38, 0x11, 0x8f, 0x44, + 0xea, 0xe8, 0x4c, 0x91, 0x82, 0xf5, 0x45, 0xee, 0x8f, 0xf5, + 0x6a, 0x0d, 0x08, 0xe7, 0x6b, 0xb0, 0x91, 0xd5, 0x42, 0x17, + 0x8c, 0x37, 0x6a, 0x5a, 0x0a, 0x87, 0x53, 0x76, 0xc3, 0x59, + 0x35, 0x13, 0x1c, 0xf1, 0x72, 0x2c, 0x2b, 0xb2, 0x9e, 0xda, + 0x10, 0x2a, 0xce, 0x38, 0xb4, 0x67, 0x8c, 0x4b, 0x08, 0xa1, + 0xb6, 0xa3, 0x08, 0x9c, 0xeb, 0xd8, 0x93, 0x1b, 0x29, 0x5a, + 0xa7, 0x03, 0x17, 0x7e, 0xec, 0x58, 0x6b, 0x5b, 0xc5, 0x46, + 0x03, 0x33, 0x7f, 0x0e, 0x93, 0x9a, 0xdd, 0xb5, 0x89, 0xb1, + 0x16, 0x4c, 0xa7, 0xd8, 0x0e, 0x73, 0xd8, 0xc3, 0xd2, 0x36, + 0x85, 0x66, 0xcb, 0x5b, 0x64, 0xf2, 0xdc, 0xba, 0x39, 0xcc, + 0xa5, 0xe0, 0x9b, 0xaa, 0x2a, 0x95, 0x6d, 0xdc, 0x49, 0xde, + 0x3b, 0x61, 0xa2, 0x3b, 0x1f, 0xed, 0x32, 0xfa, 0x10, 0xe4, + 0x88, 0x59, 0xca, 0x5a, 0xe4, 0xf9, 0x5e, 0xe2, 0xca, 0x21, + 0x5a, 0xdc, 0x02, 0x73, 0x7a, 0xc8, 0x90, 0x7a, 0x8e, 0x91, + 0x19, 0x04, 0x53, 0x3c, 0x50, 0x15, 0x8a, 0x84, 0x93, 0x8f, + 0xac, 0x99, 0x82, 0xdd, 0xc6, 0xce, 0xfb, 0x18, 0x84, 0x29, + 0x2a, 0x8d, 0xa2, 0xc5, 0x7f, 0x87, 0xce, 0x4c, 0xf5, 0xdf, + 0x73, 0xd2, 0xba, 0xc2, 0x4f, 0xe3, 0x74, 0xa5, 0x8f, 0xc3, + 0xf4, 0x99, 0xd1, 0xe8, 0x4e, 0xb8, 0xe0, 0x2e, 0xef, 0xd6, + 0x87, 0x70, 0xcf, 0x45, 0x3b, 0xff, 0x03, 0xfd, 0x59, 0x7f, + 0x7c, 0xd0, 0x4e, 0x49, 0xf7, 0xd5, 0x08, 0xd9, 0x06, 0x53, + 0x90, 0x0a, 0x5a, 0x1b, 0x2e, 0xf5, 0xb0, 0x85, 0xb6, 0xb6, + 0x61, 0xa5, 0x71, 0x47, 0xbf, 0x4a, 0xf6, 0xae, 0x9a, 0x19, + 0x6c, 0xd8, 0x2d, 0x9b, 0xb4, 0x40, 0x9e, 0x15, 0x77, 0x2e, + 0x7e, 0xe9, 0xb4, 0x3d, 0x0f, 0x1b, 0xb5, 0x1c, 0xc2, 0x58, + 0x4e, 0x4b, 0xf6, 0x53, 0x9e, 0x6f, 0x09, 0x55, 0xa0, 0xb8, + 0x73, 0x11, 0x64, 0x70, 0x54, 0xb4, 0xcb, 0xb7, 0x27, 0xe5, + 0xdf, 0x58, 0x67, 0x5b, 0xc0, 0xd6, 0xf5, 0x64, 0xa6, 0x66, + 0x6d, 0xdf, 0xd8, 0xf8, 0xd6, 0x85, 0xba, 0xba, 0x30, 0xa7, + 0xca, 0x34, 0xf4, 0x9a, 0xba, 0x0a, 0xfb, 0x0e, 0xa0, 0x65, + 0x98, 0x78, 0xee, 0xaa, 0x14, 0x6a, 0x99, 0x77, 0x67, 0xad, + 0x01, 0x95, 0x5e, 0x50, 0x22, 0xe9, 0x74, 0x95, 0xa7, 0x13, + 0x3f, 0xdd, 0xa6, 0x69, 0x64, 0xf6, 0x50, 0x06, 0x6d, 0xba, + 0x90, 0x5a, 0x8c, 0x81, 0xa0, 0xda, 0x55, 0xe9, 0x97, 0x0e, + 0xd7, 0x10, 0x8e, 0x1f, 0x23, 0x65, 0xd9, 0x14, 0xd4, 0xde, + 0xa5, 0xf9, 0xec, 0xb6, 0xad, 0x65, 0xce, 0x0b, 0x1b, 0x0a, + 0x4c, 0x7d, 0xb0, 0x97, 0xa6, 0xfe, 0x67, 0xfb, 0x4f, 0x8f, + 0x00, 0x92, 0xb6, 0x0d, 0x20, 0x78, 0x65, 0x1d, 0x9a, 0x56, + 0x57, 0xc6, 0x15, 0x88, 0xba, 0x55, 0x02, 0x7a, 0x9a, 0xac, + 0x50, 0x4c, 0xc7, 0x9e, 0x66, 0x8b, 0xfc, 0xf3, 0x67, 0x48, + 0x07, 0xbf, 0x84, 0x94, 0x9b, 0x22, 0x2a, 0xae, 0x1b, 0x25, + 0xe9, 0x94, 0x06, 0xa7, 0xe8, 0x61, 0x52, 0x89, 0xdc, 0x93, + 0x6e, 0x89, 0xdc, 0x30, 0x6e, 0xd9, 0xee, 0xcb, 0x12, 0x38, + 0x58, 0x9d, 0x8b, 0xc5, 0x05, 0x2c, 0x50, 0x4e, 0xc8, 0xc2, + 0xe0, 0x65, 0xb6, 0x49, 0xc4, 0xf0, 0x1e, 0x5c, 0x8e, 0x3c, + 0xe9, 0x77, 0xd2, 0x9e, 0xa8, 0xd5, 0xf5, 0xd9, 0xc5, 0xad, + 0x5b, 0x74, 0x48, 0x08, 0x3a, 0x30, 0x84, 0x57, 0x71, 0x1e, + 0x69, 0x45, 0x09, 0xdd, 0xea, 0x62, 0xec, 0x7c, 0xa3, 0xf9, + 0x92, 0xee, 0x16, 0xdc, 0xe5, 0x9d, 0xcf, 0xb7, 0x08, 0x51, + 0x8a, 0x76, 0x3a, 0x23, 0x94, 0x50, 0x8e, 0x4d, 0x3a, 0xea, + 0xf3, 0xc1, 0x53, 0x2c, 0x65, 0x9c, 0x36, 0x8c, 0x10, 0xe3, + 0x9c, 0x01, 0xa4, 0xe6, 0x45, 0x77, 0xa6, 0x5d, 0x7e, 0x37, + 0x31, 0x95, 0x2f, 0xec, 0x61, 0x92, 0x69, 0x65, 0x53, 0x54, + 0x6d, 0xbe, 0x9e, 0x5a, 0x68, 0x12, 0xc4, 0xe7, 0xe4, 0x06, + 0x51, 0x5a, 0xc0, 0x63, 0xb9, 0x69, 0xb8, 0x3c, 0xd8, 0xae, + 0x8b, 0xff, 0x96, 0x4d, 0x55, 0xce, 0x25, 0x2b, 0x8b, 0x89, + 0xc9, 0x3a, 0x16, 0x48, 0x2a, 0x73, 0xb2, 0x70, 0x8b, 0x62, + 0xd5, 0xb1, 0xa0, 0x30, 0xe5, 0x46, 0xab, 0x8b, 0xc3, 0xeb, + 0x37, 0x2f, 0xbd, 0xb8, 0x4e, 0x6c, 0x30, 0xdc, 0x6c, 0x8a, + 0xf1, 0x89, 0x06, 0xce, 0x64, 0x0a, 0x3e, 0xb2, 0x16, 0x31, + 0xa1, 0xe4, 0x4b, 0x98, 0xe7, 0xf1, 0x99, 0x76, 0x00, 0x5f, + 0xd2, 0xd3, 0x30, 0xf0, 0xbf, 0xa7, 0x4a, 0xf6, 0x9e, 0xa5, + 0x75, 0x74, 0x78, 0xfe, 0xec, 0x72, 0x7c, 0x89, 0xe9, 0xf6, + 0x0d, 0x7e, 0x15, 0xd6, 0xd8, 0x79, 0x85, 0x3c, 0xcf, 0xb0, + 0x21, 0xc8, 0x9c, 0x54, 0x87, 0x63, 0xb3, 0x05, 0xbb, 0x8a, + 0x02, 0xe4, 0x79, 0xdc, 0xa1, 0xa2, 0xd3, 0x19, 0xd8, 0x86, + 0xff, 0x8a, 0x0e, 0x82, 0x89, 0xaf, 0xaa, 0x62, 0x2e, 0xd4, + 0xb2, 0xd0, 0x5d, 0x0d, 0x4f, 0x2a, 0xda, 0x0e, 0x9f, 0x8a, + 0x2b, 0x32, 0xe9, 0x09, 0xf5, 0x55, 0x51, 0xe7, 0xd5, 0x69, + 0x12, 0xdd, 0x33, 0x6b, 0x3d, 0xd7, 0xe9, 0xfd, 0xb2, 0xa7, + 0xf5, 0x97, 0x2a, 0x6d, 0x89, 0x30, 0x65, 0x2a, 0x0d, 0xf2, + 0x00, 0x81, 0xbe, 0xfb, 0xd9, 0xd7, 0x1b, 0xc2, 0x48, 0x7a, + 0x22, 0x30, 0xae, 0x35, 0xf6, 0x32, 0x41, 0x9d, 0xd9, 0x12, + 0xb3, 0xa7, 0x6d, 0xba, 0x74, 0x93, 0x2d, 0x0d, 0xb2, 0xb6, + 0xdc, 0xa9, 0x98, 0x5b, 0x3b, 0xaa, 0x2b, 0x47, 0x06, 0xc4, + 0x36, 0xfd, 0x04, 0x10, 0x94, 0x61, 0x61, 0x47, 0x1c, 0x02, + 0x54, 0x85, 0x4a, 0xcb, 0x75, 0x6b, 0x75, 0xf5, 0xb4, 0x61, + 0x26, 0xb3, 0x12, 0x43, 0x31, 0x55, 0xb5, 0xda, 0x4b, 0xb5, + 0x11, 0xb4, 0xb8, 0xfb, 0x0a, 0xd9, 0xa7, 0x0e, 0x9f, 0x2a, + 0x74, 0x01, 0xf6, 0x1a, 0x33, 0x10, 0x9e, 0x66, 0xff, 0x82, + 0xfa, 0xa9, 0xa4, 0xa0, 0x9b, 0x25, 0x2d, 0x16, 0xbf, 0x60, + 0x0d, 0x87, 0xea, 0x94, 0xad, 0xdd, 0xc4, 0xd0, 0xa8, 0xdd, + 0x2d, 0xc7, 0xc8, 0xac, 0x39, 0x9e, 0x87, 0x69, 0xc4, 0x3a, + 0xbc, 0x28, 0x7e, 0x36, 0x69, 0xfd, 0x20, 0x25, 0xac, 0xa3, + 0xa7, 0x37, 0x96, 0xe9, 0x8a, 0x65, 0xe4, 0xb0, 0x2a, 0x61, + 0x23, 0x28, 0x64, 0xff, 0x17, 0x6c, 0x36, 0x9e, 0x0a, 0xba, + 0xe4, 0x4b, 0xeb, 0x84, 0x24, 0x20, 0x57, 0x0f, 0x34, 0x05, + 0x95, 0x56, 0xc3, 0x2f, 0x2b, 0xf0, 0x36, 0xef, 0xca, 0x68, + 0xfe, 0x78, 0xf8, 0x98, 0x09, 0x4a, 0x25, 0xcc, 0x17, 0xbe, + 0x05, 0x00, 0xff, 0xf9, 0xa5, 0x5b, 0xe6, 0xaa, 0x5b, 0x56, + 0xb6, 0x89, 0x64, 0x9c, 0x16, 0x48, 0xe1, 0xcd, 0x67, 0x87, + 0xdd, 0xba, 0xbd, 0x02, 0x0d, 0xd8, 0xb4, 0xc9, 0x7c, 0x37, + 0x92, 0xd0, 0x39, 0x46, 0xd2, 0xc4, 0x78, 0x13, 0xf0, 0x76, + 0x45, 0x5f, 0xeb, 0x52, 0xd2, 0x3f, 0x61, 0x87, 0x34, 0x09, + 0xb7, 0x24, 0x4e, 0x93, 0xf3, 0xc5, 0x10, 0x19, 0x66, 0x66, + 0x3f, 0x15, 0xe3, 0x05, 0x55, 0x43, 0xb7, 0xf4, 0x62, 0x57, + 0xb4, 0xd9, 0xef, 0x46, 0x47, 0xb5, 0xfb, 0x79, 0xc9, 0x67, + 0xc5, 0xc3, 0x18, 0x91, 0x73, 0x75, 0xec, 0xd5, 0x68, 0x2b, + 0xf6, 0x42, 0xb4, 0xff, 0xfb, 0x27, 0x61, 0x77, 0x28, 0x10, + 0x6b, 0xce, 0x19, 0xad, 0x87, 0xc3, 0x85, 0xe3, 0x78, 0x00, + 0xdb, 0x21, 0xee, 0xd8, 0xfa, 0x9c, 0x81, 0x11, 0x97, 0xac, + 0xd0, 0x50, 0x89, 0x45, 0x23, 0xf6, 0x85, 0x7d, 0x60, 0xb2, + 0xad, 0x0c, 0x5d, 0xd8, 0x9e, 0xe4, 0xe1, 0x25, 0xb2, 0x13, + 0x1a, 0x54, 0x54, 0xfd, 0x7b, 0xab, 0x85, 0x20, 0xe8, 0xda, + 0x52, 0x0f, 0xac, 0x49, 0x70, 0xf1, 0x4c, 0x66, 0x74, 0x8c, + 0x87, 0x6e, 0xca, 0xc1, 0x0d, 0x92, 0xc0, 0xa8, 0x08, 0xfd, + 0x0f, 0x60, 0x55, 0xaf, 0x24, 0xcb, 0x04, 0xb7, 0xff, 0xa9, + 0xc5, 0x07, 0x26, 0xf6, 0xe2, 0x1e, 0x2f, 0xd1, 0x99, 0x6d, + 0xef, 0xc0, 0xdb, 0x5b, 0xf7, 0x06, 0x80, 0x92, 0x5f, 0x56, + 0x54, 0xdb, 0x2e, 0xba, 0x93, 0xb2, 0x94, 0xf2, 0xad, 0xbc, + 0x91, 0x6e, 0x4e, 0xce, 0x21, 0xc4, 0x8b, 0x18, 0xc4, 0xfc, + 0xab, 0xb4, 0x4f, 0xd7, 0xa2, 0xef, 0x55, 0x00, 0x6d, 0x34, + 0x17, 0x59, 0x8d, 0x79, 0x75, 0x02, 0xa3, 0x7a, 0x52, 0x57, + 0x5c, 0x26, 0xb9, 0xae, 0xd6, 0x19, 0x2e, 0x31, 0x02, 0x98, + 0x98, 0xe5, 0x3d, 0xc2, 0xa5, 0x56, 0xb6, 0x02, 0xae, 0x0d, + 0x3b, 0x35, 0x97, 0xd2, 0x43, 0x38, 0x8a, 0x65, 0xfa, 0x86, + 0x20, 0xb7, 0xb5, 0xb0, 0xda, 0x19, 0x01, 0x2f, 0x13, 0xb5, + 0x6d, 0xbd, 0xb2, 0x34, 0xa7, 0xff, 0xae, 0x7e, 0x8f, 0x98, + 0x1b, 0xc4, 0x27, 0xbd, 0xa9, 0x64, 0xdc, 0xab, 0x2a, 0xd2, + 0xb4, 0x27, 0xd0, 0x25, 0xdd, 0xff, 0xdc, 0x0a, 0x96, 0xd3, + 0x85, 0x3e, 0xc5, 0x11, 0x34, 0x60, 0xa2, 0x33, 0x92, 0x90, + 0xbb, 0x4c, 0x86, 0xdd, 0xd6, 0x1e, 0xcb, 0x0a, 0x17, 0xc6, + 0x87, 0x4e, 0x3e, 0x7a, 0x4b, 0xab, 0xef, 0x0a, 0x00, 0x3d, + 0x94, 0x34, 0x8b, 0x63, 0x36, 0xd9, 0xaf, 0x5d, 0x63, 0x40, + 0xbb, 0x32, 0x4b, 0x64, 0xf0, 0x31, 0x48, 0xdb, 0x44, 0x2b, + 0x48, 0x60, 0x6a, 0xea, 0xa4, 0x8c, 0xdd, 0xaf, 0x81, 0x3f, + 0x86, 0x81, 0x99, 0x7a, 0x98, 0xe1, 0xff, 0x21, 0x7a, 0x28, + 0xbc, 0x33, 0xe6, 0x4e, 0xb0, 0x85, 0x6b, 0xec, 0x11, 0x37, + 0x81, 0x7f, 0xf9, 0xdc, 0xbf, 0x1a, 0xa6, 0x6d, 0x4d, 0x0f, + 0x5b, 0x99, 0x73, 0xb8, 0xd2, 0x6e, 0x37, 0xf0, 0x71, 0xf1, + 0x1a, 0xc3, 0x5c, 0xea, 0x12, 0x5f, 0x2e, 0x85, 0x3f, 0xfd, + 0xd5, 0x87, 0x67, 0x9f, 0x67, 0x9f, 0xd7, 0xef, 0x9f, 0x81, + 0xa4, 0xbc, 0x63, 0x1d, 0x00, 0x81, 0xf6, 0x20, 0x77, 0xae, + 0x0b, 0x90, 0xe5, 0x9c, 0xa9, 0x44, 0xb5, 0xd7, 0xb1, 0x61, + 0x33, 0x4f, 0x75, 0xa9, 0xb7, 0xf4, 0xa4, 0x72, 0x9e, 0x72, + 0xec, 0x7b, 0xcd, 0x83, 0xb3, 0xd6, 0x22, 0x50, 0x50, 0x97, + 0x0f, 0x63, 0x0f, 0xe1, 0x15, 0xb3, 0x07, 0xb6, 0xa3, 0xfa, + 0x2f, 0xb5, 0xf3, 0x5b, 0x5d, 0x7f, 0x90, 0x20, 0xcd, 0x5f, + 0x40, 0x48, 0x87, 0x43, 0xfd, 0xa3, 0x69, 0xdc, 0xf8, 0x51, + 0x08, 0x67, 0xc2, 0x2d, 0xff, 0xfe, 0xbf, 0x85, 0x3e, 0x80, + 0xff, 0x91, 0x62, 0xc5, 0x83, 0xe0, 0x80, 0xeb, 0xce, 0xdc, + 0xff, 0xb1, 0xdb, 0x02, 0xb7, 0x01, 0x1e, 0xa6, 0xf0, 0x32, + 0xfb, 0x95, 0x6a, 0x47, 0x44, 0x84, 0x42, 0x6e, 0x3a, 0xb1, + 0xcf, 0xf9, 0x28, 0xb4, 0x3a, 0x8e, 0xa7, 0x8d, 0x48, 0x81, + 0x1c, 0x7e, 0xf5, 0x0b, 0x46, 0x7e, 0x92, 0x4e, 0xb9, 0xa8, + 0x36, 0xb8, 0x81, 0x6d, 0x8c, 0x70, 0x59, 0x33, 0x12, 0x61, + 0xbb, 0xe6, 0x10, 0x8a, 0xe4, 0xc1, 0x2c, 0x50, 0x12, 0xbf, + 0xd3, 0xc6, 0x3c, 0x53, 0x91, 0x50, 0x07, 0xc8, 0x85, 0x32, + 0x3c, 0xe1, 0x67, 0x99, 0x68, 0xc1, 0xf4, 0x74, 0x86, 0x35, + 0x8a, 0x6c, 0x75, 0x1d, 0x8f, 0x8a, 0x60, 0xe1, 0xc7, 0x59, + 0x4e, 0xb0, 0xe0, 0x45, 0x5a, 0x11, 0x05, 0x24, 0xa7, 0x8d, + 0x39, 0x93, 0x60, 0x4c, 0xc5, 0x9e, 0x8a, 0x70, 0xcc, 0x44, + 0x96, 0x92, 0xc8, 0xf7, 0x23, 0x14, 0xc7, 0xf4, 0x82, 0x9d, + 0x5b, 0x1c, 0x26, 0xd0, 0x3c, 0x76, 0x36, 0xe9, 0x98, 0x8a, + 0xbb, 0xe6, 0xa0, 0xad, 0xed, 0xf7, 0xd9, 0x06, 0x50, 0x67, + 0x79, 0x50, 0x4e, 0xd5, 0x80, 0x4e, 0x59, 0x72, 0x5d, 0x8b, + 0xcb, 0x86, 0x3b, 0x57, 0xc4, 0xb2, 0x3d, 0xbc, 0x35, 0x6d, + 0xb1, 0x50, 0xf5, 0x8c, 0xf2, 0x89, 0x72, 0x20, 0xd0, 0x47, + 0x68, 0x13, 0x42, 0x25, 0x1a, 0xb6, 0xc5, 0x07, 0xdf, 0x45, + 0x11, 0xa9, 0x05, 0x5d, 0xad, 0xf0, 0x49, 0x9e, 0x70, 0x78, + 0xed, 0xe7, 0xf9, 0x00, 0x1f, 0x62, 0x76, 0x47, 0xb5, 0x48, + 0x4f, 0x2c, 0x2e, 0xe3, 0x78, 0x6a, 0x44, 0x46, 0x1e, 0x6b, + 0x00, 0x74, 0x54, 0xb9, 0xd1, 0x4f, 0x6d, 0x45, 0xc1, 0xa6, + 0x45, 0x2e, 0x1a, 0xaf, 0x94, 0x3f, 0xd0, 0x72, 0x67, 0x0d, + 0x2e, 0xa9, 0x8d, 0x16, 0xc4, 0x05, 0x01, 0x07, 0x13, 0x1b, + 0x1c, 0x3d, 0x43, 0x71, 0x91, 0x95, 0x9a, 0xae, 0xaf, 0xc4, + 0xe5, 0xe6, 0xe9, 0xff, 0x02, 0x0c, 0x0f, 0x3e, 0x62, 0x67, + 0x68, 0x81, 0xc7, 0xd0, 0xd8, 0xdd, 0xe0, 0xf5, 0x0b, 0x25, + 0x35, 0x45, 0x4a, 0x4b, 0x63, 0x74, 0x79, 0x7e, 0x82, 0xa2, + 0xaf, 0xc6, 0xc7, 0xcc, 0xd2, 0xfa, 0x2a, 0x2d, 0x2f, 0x32, + 0x35, 0x38, 0x3f, 0x4c, 0x7f, 0x80, 0x81, 0x8b, 0x9b, 0x9c, + 0x9d, 0xa7, 0xa9, 0xcb, 0xe9, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x20, 0x32, 0x46, +}; +static const int sizeof_bench_dilithium_level2_sig = + sizeof(bench_dilithium_level2_sig); +#endif + +#ifndef WOLFSSL_NO_ML_DSA_65 +static const unsigned char bench_dilithium_level3_sig[] = { + 0x3e, 0xff, 0xf4, 0x48, 0x80, 0x2d, 0x88, 0x87, 0xf4, 0xcc, + 0xa4, 0x61, 0xe1, 0x27, 0x20, 0x55, 0x66, 0xc8, 0xfe, 0x3e, + 0xdd, 0xf5, 0x5c, 0x70, 0x6c, 0x54, 0xba, 0x50, 0x8a, 0xa2, + 0x4b, 0x88, 0xbc, 0xb8, 0x87, 0xf9, 0x4e, 0x50, 0x3a, 0x04, + 0x18, 0xb3, 0xf4, 0x5f, 0x77, 0x4a, 0x7e, 0xa8, 0xf5, 0xca, + 0x49, 0x00, 0xdc, 0x24, 0xaa, 0x05, 0x35, 0x0f, 0x34, 0xf7, + 0xbf, 0x09, 0xa6, 0xcf, 0x75, 0x37, 0x07, 0xcd, 0x07, 0x99, + 0x92, 0x1d, 0xc7, 0xc9, 0x17, 0x1c, 0xdd, 0x27, 0x8c, 0x66, + 0xf2, 0x8b, 0x75, 0xb0, 0x86, 0x2d, 0xbd, 0x51, 0x16, 0xc2, + 0x50, 0xe0, 0x7e, 0x0a, 0x21, 0x58, 0x93, 0x22, 0x06, 0xcb, + 0x85, 0x8b, 0xfd, 0x97, 0x61, 0xc0, 0xdb, 0xab, 0xfa, 0x4a, + 0x69, 0xef, 0x9c, 0xc1, 0x4e, 0xae, 0xb2, 0xb3, 0xa2, 0x74, + 0xa4, 0x94, 0x0a, 0xed, 0x39, 0x9e, 0xe8, 0x58, 0xeb, 0xfd, + 0x43, 0x05, 0x73, 0x38, 0xd6, 0xbb, 0xeb, 0xb9, 0x9d, 0x3b, + 0xf8, 0x85, 0xb4, 0x4b, 0x16, 0x5c, 0x9e, 0xfe, 0xb8, 0x13, + 0xf8, 0x68, 0x44, 0x90, 0x05, 0x61, 0xb3, 0xed, 0x6f, 0x47, + 0xc9, 0x50, 0xcf, 0x6c, 0xc0, 0xac, 0xdf, 0x4c, 0x4c, 0x1b, + 0x42, 0xce, 0x0a, 0x32, 0x69, 0xb0, 0xfd, 0x87, 0xef, 0xf3, + 0x9c, 0xcc, 0xba, 0x2f, 0x03, 0xd7, 0xdb, 0x76, 0xee, 0xa0, + 0x71, 0x4a, 0x80, 0xcb, 0x90, 0x9e, 0xbb, 0x8f, 0x00, 0x46, + 0x81, 0xe0, 0xde, 0xa6, 0x43, 0xb5, 0x37, 0x79, 0xf2, 0x35, + 0xce, 0x9e, 0xd2, 0xb1, 0x5b, 0xff, 0x91, 0xfb, 0x98, 0xc1, + 0xe1, 0x66, 0x2c, 0x00, 0x1b, 0x89, 0xf2, 0x57, 0x81, 0x73, + 0x7e, 0x9f, 0x8d, 0x50, 0xd0, 0xe0, 0xe3, 0x93, 0xf2, 0x87, + 0x41, 0x64, 0x6c, 0xb7, 0x09, 0x60, 0x91, 0x4e, 0x0b, 0xbe, + 0xbe, 0xd4, 0x98, 0xfa, 0x14, 0x8c, 0x46, 0x09, 0xfa, 0xaa, + 0x82, 0xd6, 0xdd, 0x65, 0x93, 0x39, 0x45, 0x50, 0x90, 0x10, + 0xae, 0x1b, 0xff, 0xab, 0x7e, 0x86, 0xda, 0xb9, 0x4d, 0xf1, + 0xc2, 0x00, 0x54, 0x66, 0xee, 0x40, 0xc0, 0x56, 0x2f, 0xe8, + 0x43, 0x89, 0xbb, 0xb8, 0x59, 0x24, 0x63, 0x45, 0x9a, 0xde, + 0x08, 0xf3, 0x16, 0x94, 0xd2, 0x8d, 0xee, 0xf9, 0xbe, 0x4f, + 0x29, 0xe1, 0x4b, 0x5e, 0x2b, 0x14, 0xef, 0x66, 0xe2, 0x12, + 0xf8, 0x87, 0x2e, 0xb1, 0x75, 0x8b, 0x21, 0xb5, 0x8f, 0x8e, + 0xc5, 0x0e, 0x60, 0x27, 0x15, 0xbd, 0x72, 0xe4, 0x26, 0x4e, + 0x62, 0x7d, 0x3a, 0x46, 0x49, 0x93, 0xa9, 0x52, 0x7f, 0xc2, + 0x27, 0xb9, 0x55, 0x6a, 0x45, 0x9f, 0x2c, 0x7a, 0x5a, 0xc9, + 0xf4, 0x55, 0xaf, 0x49, 0xb3, 0xd5, 0xc0, 0x84, 0xdb, 0x89, + 0x5f, 0x21, 0x04, 0xf5, 0x4c, 0x66, 0x1e, 0x2e, 0x69, 0xdf, + 0x5b, 0x14, 0x60, 0x89, 0x84, 0xf8, 0xa3, 0xaf, 0xdf, 0xb9, + 0x18, 0x5e, 0xbf, 0x81, 0x95, 0x9a, 0x5e, 0x4f, 0x24, 0x45, + 0xad, 0xab, 0xe2, 0x36, 0x7c, 0x19, 0xde, 0xc0, 0xf4, 0x1a, + 0x42, 0xb2, 0xc2, 0x58, 0x2f, 0x5f, 0xd0, 0x2e, 0x28, 0x33, + 0x59, 0x75, 0xc2, 0xde, 0x41, 0xe3, 0x9b, 0x85, 0x46, 0xad, + 0x6d, 0xf1, 0x06, 0xf0, 0x6a, 0xb9, 0xed, 0x71, 0x7b, 0xfd, + 0xf1, 0xc4, 0x56, 0xd8, 0xb3, 0x1a, 0x5f, 0x04, 0xae, 0xe8, + 0xce, 0xde, 0xa1, 0x6d, 0x46, 0x2a, 0x4f, 0x62, 0xee, 0x25, + 0xdf, 0x22, 0x21, 0xb2, 0x8f, 0x5f, 0x26, 0x33, 0x5a, 0xdd, + 0xbe, 0x08, 0xb3, 0x93, 0x16, 0x16, 0xad, 0x2e, 0x00, 0xb8, + 0x14, 0x0c, 0x10, 0xa3, 0x29, 0x89, 0x1f, 0xd7, 0x06, 0x7a, + 0x09, 0xf3, 0x84, 0xf9, 0x18, 0x04, 0x56, 0x2f, 0x7f, 0xbd, + 0x8e, 0x12, 0xdf, 0x4d, 0x58, 0x5c, 0x1d, 0x81, 0x0c, 0x7d, + 0x62, 0x02, 0xe0, 0xf9, 0x1b, 0x69, 0xe9, 0x38, 0x45, 0x84, + 0x2d, 0x9a, 0x4a, 0x3d, 0x7b, 0x48, 0xd5, 0x0d, 0x76, 0xba, + 0xff, 0x20, 0x00, 0xf8, 0x42, 0x7f, 0xd2, 0x25, 0x70, 0x90, + 0x88, 0xb3, 0x98, 0xac, 0xe9, 0xd9, 0xac, 0x58, 0xa6, 0x49, + 0xcc, 0x93, 0xa5, 0x04, 0x0c, 0x68, 0x53, 0x64, 0x72, 0x8c, + 0xfc, 0x8d, 0x61, 0xeb, 0x3f, 0x93, 0x8b, 0x85, 0x98, 0x05, + 0xce, 0x06, 0xd7, 0xbf, 0xbb, 0xa5, 0x22, 0xda, 0xe9, 0x8a, + 0x29, 0x30, 0x5e, 0x82, 0xe4, 0x46, 0x7c, 0x36, 0x5e, 0xf5, + 0xc7, 0xe3, 0x09, 0xdf, 0x20, 0x76, 0x73, 0x33, 0x31, 0x75, + 0xc2, 0x99, 0xe9, 0x74, 0x43, 0x82, 0xb1, 0xeb, 0x74, 0x6f, + 0xad, 0x59, 0x48, 0x12, 0xa0, 0x24, 0xe3, 0x38, 0x48, 0x61, + 0x0c, 0xf6, 0x38, 0x83, 0x3a, 0xcd, 0xd6, 0x45, 0x10, 0x0e, + 0x09, 0x79, 0x31, 0x30, 0x80, 0xfb, 0x34, 0x60, 0x1e, 0x72, + 0x98, 0xe9, 0x5c, 0xbf, 0xab, 0x21, 0x7f, 0xa3, 0x19, 0x7e, + 0x8c, 0xa9, 0xa7, 0xfc, 0x25, 0xe0, 0x8e, 0x6d, 0xa1, 0xb9, + 0x7b, 0x5b, 0x37, 0x33, 0x96, 0xd8, 0x6e, 0x7a, 0xce, 0xa6, + 0x1a, 0xbd, 0xe6, 0x6e, 0x62, 0xc4, 0x8c, 0x69, 0xfe, 0xe4, + 0xcb, 0x0a, 0xa1, 0x6c, 0x66, 0x0e, 0x1a, 0x5e, 0xb9, 0xd1, + 0x4a, 0xa3, 0x91, 0x39, 0xcf, 0x85, 0x07, 0x5b, 0xaf, 0x99, + 0x11, 0xca, 0xee, 0x6f, 0x2e, 0x33, 0xda, 0x60, 0xbf, 0xd6, + 0xa0, 0x7a, 0xdb, 0x91, 0x13, 0xb7, 0xa3, 0x5d, 0x0e, 0x1e, + 0x3b, 0xf9, 0x7a, 0x3e, 0x4f, 0x8d, 0xb3, 0x81, 0xe8, 0x0c, + 0x4d, 0x48, 0x61, 0x06, 0x14, 0x0f, 0x3e, 0x33, 0x9e, 0xea, + 0xa6, 0xd8, 0xd8, 0x4d, 0x9b, 0x00, 0x34, 0x0d, 0x31, 0x62, + 0x54, 0x93, 0x04, 0xd2, 0x02, 0x21, 0x38, 0x91, 0x58, 0xca, + 0x77, 0xd3, 0x6c, 0xd1, 0x94, 0x05, 0xfa, 0x30, 0x6a, 0x0b, + 0xf0, 0x52, 0x52, 0xb7, 0xdb, 0x34, 0xff, 0x18, 0x5c, 0x78, + 0x25, 0x44, 0x39, 0xe4, 0x54, 0x8a, 0xf1, 0x49, 0x04, 0xab, + 0x8a, 0x5f, 0x87, 0xe1, 0x6e, 0x1a, 0xf2, 0xba, 0x39, 0xb4, + 0x7c, 0x71, 0x5b, 0xbe, 0x8d, 0xbb, 0xed, 0x3b, 0xed, 0x20, + 0x95, 0xdf, 0xa7, 0x50, 0xb5, 0x66, 0xff, 0xd0, 0x3a, 0x92, + 0xde, 0xf2, 0xa3, 0xf2, 0xd6, 0x48, 0x6b, 0xd8, 0xef, 0x80, + 0x4d, 0xc2, 0x3c, 0xc7, 0xc6, 0x6e, 0xdf, 0xd1, 0x54, 0xfb, + 0x22, 0xac, 0x1a, 0x11, 0x81, 0x02, 0xc7, 0x66, 0xe0, 0xf3, + 0xad, 0x0b, 0xd0, 0xec, 0xae, 0x93, 0x53, 0xa5, 0xbf, 0xa5, + 0x17, 0x59, 0x14, 0x7d, 0x7e, 0x1e, 0x26, 0x15, 0x7a, 0x74, + 0xfb, 0xb1, 0x7a, 0x0e, 0xd3, 0xb5, 0x7c, 0x8c, 0x3a, 0xd7, + 0x45, 0x38, 0x55, 0xae, 0x4b, 0xe1, 0xfe, 0x5b, 0x57, 0x20, + 0x73, 0x38, 0xb9, 0x67, 0x34, 0xb1, 0xf3, 0x15, 0xb0, 0xb7, + 0x46, 0xa7, 0x1b, 0x19, 0x6d, 0xaf, 0x5e, 0x2c, 0x9c, 0x02, + 0x3f, 0x0f, 0xa3, 0x56, 0x2f, 0x9f, 0x1a, 0x82, 0x0e, 0xb4, + 0x46, 0xf5, 0x69, 0x89, 0x91, 0xf9, 0x2d, 0x99, 0x45, 0xa6, + 0x3c, 0x82, 0x74, 0xac, 0xeb, 0x58, 0x4a, 0xdd, 0x03, 0xaf, + 0xd1, 0x0a, 0xca, 0x4b, 0xe8, 0x4c, 0x63, 0xd4, 0x73, 0x94, + 0xbf, 0xd1, 0xc5, 0x8a, 0x3f, 0x6e, 0x58, 0xfc, 0x70, 0x76, + 0x69, 0x92, 0x05, 0xe0, 0xb9, 0xed, 0x5f, 0x19, 0xd7, 0x6f, + 0xd0, 0x35, 0xbb, 0x5a, 0x8d, 0x45, 0xac, 0x43, 0xcb, 0x74, + 0xcc, 0x92, 0xc3, 0x62, 0x56, 0x02, 0xb0, 0x0a, 0xb6, 0x88, + 0x40, 0x6f, 0x76, 0x1b, 0x89, 0xe4, 0x51, 0xeb, 0x7e, 0x08, + 0x8c, 0xce, 0x24, 0xc8, 0xd8, 0x58, 0xbd, 0x0e, 0x48, 0x57, + 0xc8, 0x9f, 0xad, 0x64, 0xcf, 0x69, 0x72, 0x35, 0xbf, 0x04, + 0x09, 0xfb, 0x0e, 0x62, 0x92, 0x76, 0x8b, 0x8d, 0xd5, 0x16, + 0xa2, 0x51, 0xdb, 0x71, 0xa9, 0x08, 0xb2, 0xf9, 0x1e, 0x07, + 0xe7, 0xf8, 0xf4, 0x79, 0x59, 0x2f, 0x8f, 0xf1, 0x5b, 0x45, + 0xe1, 0xb8, 0xb7, 0xef, 0x86, 0x69, 0x71, 0x51, 0x1c, 0xe5, + 0x61, 0xee, 0xb8, 0x1d, 0xa7, 0xdc, 0x48, 0xba, 0x51, 0xa5, + 0x70, 0x4d, 0xfd, 0x2c, 0x46, 0x21, 0x63, 0x0c, 0x9f, 0xb7, + 0x68, 0x58, 0x7b, 0xb3, 0x7d, 0x64, 0xfd, 0xaf, 0x87, 0x3d, + 0x86, 0x06, 0x36, 0x8a, 0x6d, 0xfe, 0xdf, 0xce, 0xa8, 0x16, + 0x42, 0x46, 0x15, 0xe5, 0xcf, 0x48, 0xa6, 0x4b, 0xe5, 0xc1, + 0xad, 0x14, 0x3a, 0x6d, 0xeb, 0xf9, 0xc9, 0x32, 0xd1, 0x82, + 0x60, 0x23, 0xf0, 0xff, 0xa7, 0xe6, 0x2e, 0xd6, 0x8d, 0x9d, + 0x4f, 0x6d, 0xb3, 0xc4, 0xad, 0xd9, 0xf0, 0xf5, 0x5c, 0x47, + 0x6c, 0x67, 0xf4, 0x0e, 0x18, 0x25, 0xbb, 0x67, 0xfa, 0x11, + 0x70, 0xd5, 0xbc, 0x3a, 0x34, 0xae, 0xa2, 0x76, 0x4b, 0x9f, + 0x59, 0x01, 0x18, 0x69, 0x44, 0xc4, 0x8a, 0xff, 0x00, 0xfc, + 0x2a, 0x45, 0xa9, 0x50, 0x8e, 0x37, 0x6b, 0x78, 0x14, 0x69, + 0xe7, 0x92, 0x3d, 0xf1, 0x34, 0xd5, 0x5c, 0x48, 0xc2, 0x50, + 0xb3, 0x0c, 0x7d, 0x54, 0x05, 0x31, 0x1e, 0xce, 0xaa, 0xc1, + 0x4c, 0xc9, 0x13, 0x33, 0x26, 0x1f, 0x56, 0x7e, 0x7e, 0x74, + 0xd3, 0x78, 0x3e, 0x00, 0x4a, 0xc8, 0xc6, 0x20, 0x5b, 0xb8, + 0x80, 0xb4, 0x13, 0x35, 0x23, 0xff, 0x50, 0xde, 0x25, 0x92, + 0x67, 0x08, 0xb8, 0xa3, 0xb6, 0x39, 0xd4, 0x30, 0xdc, 0xa5, + 0x88, 0x8a, 0x44, 0x08, 0x8b, 0x6d, 0x2e, 0xb8, 0xf3, 0x0d, + 0x23, 0xda, 0x35, 0x08, 0x5a, 0x92, 0xe1, 0x40, 0xac, 0xc7, + 0x15, 0x05, 0x8a, 0xdf, 0xe5, 0x71, 0xd8, 0xe0, 0xd7, 0x9f, + 0x58, 0x03, 0xf4, 0xec, 0x99, 0x3c, 0xb0, 0xe0, 0x07, 0x42, + 0x9b, 0xa0, 0x10, 0x7c, 0x24, 0x60, 0x19, 0xe8, 0x84, 0xd4, + 0xb1, 0x86, 0x19, 0x0a, 0x52, 0x70, 0x6e, 0xc2, 0x3c, 0xe2, + 0x73, 0x8d, 0xfe, 0xf8, 0x7e, 0xdf, 0x78, 0xe7, 0x92, 0x36, + 0x10, 0xf7, 0x2d, 0x76, 0x93, 0x8a, 0x0f, 0x20, 0xc8, 0x30, + 0x59, 0x81, 0xff, 0x3b, 0x70, 0x22, 0xce, 0x6e, 0x23, 0x68, + 0x35, 0x59, 0x0e, 0xcf, 0xf8, 0xf6, 0xcd, 0x45, 0xb6, 0x41, + 0xba, 0xda, 0xe6, 0x35, 0x0b, 0xd1, 0xef, 0xa5, 0x7c, 0xe0, + 0xb9, 0x6f, 0x5b, 0xa9, 0xab, 0x87, 0xe3, 0x3b, 0x92, 0xce, + 0xbe, 0xfe, 0xf7, 0xab, 0x82, 0xa3, 0xe6, 0xbd, 0xfe, 0xce, + 0xa6, 0x17, 0xcb, 0x4c, 0xb4, 0x4c, 0xd6, 0xfe, 0xbb, 0x1c, + 0x10, 0xde, 0x29, 0x3e, 0x92, 0x66, 0x20, 0xf8, 0xee, 0x83, + 0x86, 0x66, 0xe0, 0x66, 0x97, 0x85, 0xaf, 0x3a, 0x8f, 0xa9, + 0x97, 0x09, 0xde, 0x77, 0xda, 0xb7, 0x81, 0x41, 0x10, 0xca, + 0x66, 0x00, 0xec, 0xf8, 0x46, 0x73, 0xa6, 0x24, 0x36, 0xec, + 0x25, 0xbe, 0x93, 0x5e, 0x74, 0x9f, 0xbe, 0xf4, 0x84, 0x15, + 0x9c, 0xc5, 0x43, 0xd9, 0xea, 0x5a, 0xcc, 0x2c, 0x4e, 0x2e, + 0x4e, 0x32, 0xa6, 0x88, 0xb1, 0x25, 0x34, 0xf7, 0xba, 0xab, + 0xd3, 0xa0, 0xc2, 0x06, 0x70, 0xed, 0x66, 0x4d, 0x71, 0x34, + 0xaf, 0x10, 0x99, 0x10, 0x11, 0x4f, 0xe4, 0x7d, 0x42, 0x03, + 0x04, 0x02, 0xc2, 0x41, 0x85, 0x1e, 0xc4, 0xca, 0xae, 0xf0, + 0x83, 0x78, 0x34, 0x98, 0x55, 0x8b, 0x4c, 0xa0, 0x14, 0xea, + 0x15, 0x2c, 0xa1, 0x30, 0xd8, 0xcf, 0xac, 0xd4, 0xca, 0xf7, + 0xf4, 0xc4, 0x20, 0xca, 0xa1, 0xef, 0xce, 0x5d, 0x6b, 0x32, + 0xb6, 0xf0, 0x22, 0x08, 0x49, 0x21, 0x0c, 0x57, 0x0f, 0xf8, + 0xc0, 0xd2, 0xe3, 0xc0, 0xa6, 0x31, 0xc7, 0x87, 0x96, 0xa9, + 0xfe, 0x69, 0xa0, 0x7f, 0xf7, 0x8e, 0x31, 0x92, 0x37, 0xce, + 0xde, 0x36, 0x3f, 0xf5, 0x7d, 0x07, 0xaa, 0xa9, 0x43, 0xee, + 0x3c, 0x8c, 0xd3, 0x7d, 0x2c, 0xa6, 0xc3, 0x98, 0xab, 0xbe, + 0x90, 0x4c, 0xa5, 0x5a, 0x27, 0xeb, 0x0e, 0xed, 0xa1, 0x1e, + 0x3e, 0x44, 0xa3, 0x4b, 0x49, 0xad, 0xe4, 0x19, 0x90, 0xc8, + 0x9e, 0x6e, 0x5b, 0x68, 0xbc, 0x37, 0x54, 0xaf, 0xa6, 0xb7, + 0x71, 0x5c, 0x5d, 0x74, 0x83, 0xf4, 0xb9, 0x2f, 0xe5, 0x1a, + 0x0c, 0x73, 0x30, 0x56, 0x82, 0x04, 0xb3, 0x0e, 0x32, 0x98, + 0xfd, 0x27, 0xa0, 0xfe, 0xe0, 0xe0, 0xf5, 0xb7, 0xe0, 0x47, + 0x2a, 0xa6, 0x4a, 0xe0, 0xfc, 0xb5, 0xd8, 0xfd, 0x01, 0xfe, + 0x4e, 0x96, 0x17, 0x06, 0xcc, 0x92, 0x7c, 0xa1, 0x2f, 0xb5, + 0x04, 0x08, 0x76, 0xcc, 0x40, 0x75, 0x37, 0x4d, 0x2c, 0x74, + 0xcd, 0xc7, 0x62, 0xa6, 0xe6, 0xd8, 0x9e, 0x21, 0x7f, 0x2e, + 0xf5, 0x2c, 0xcf, 0x0b, 0x3f, 0xd7, 0xed, 0x17, 0xee, 0x92, + 0xaf, 0xf9, 0xa4, 0x71, 0x5d, 0x5f, 0x81, 0xb9, 0x2f, 0x12, + 0xe5, 0x57, 0x2d, 0x1e, 0xf1, 0x67, 0x47, 0x2a, 0xde, 0xab, + 0xf2, 0xea, 0xb7, 0xb5, 0x83, 0xdc, 0x46, 0xd4, 0xf3, 0x25, + 0x65, 0x15, 0x4d, 0x66, 0x34, 0x54, 0xab, 0x94, 0x89, 0x80, + 0x39, 0xd3, 0x39, 0xe3, 0xa2, 0xb1, 0x91, 0x2a, 0x5e, 0x55, + 0xe1, 0xa4, 0x0f, 0xc3, 0x4b, 0x5a, 0xa5, 0x4a, 0xb3, 0xc0, + 0x40, 0xea, 0x16, 0x0c, 0xd5, 0x2d, 0x83, 0x3e, 0x28, 0x20, + 0xac, 0x0a, 0x1b, 0x5b, 0x87, 0xcf, 0xf1, 0x51, 0xd6, 0xda, + 0xd1, 0xc9, 0xb1, 0x27, 0xf5, 0x62, 0x03, 0x10, 0xcf, 0x76, + 0x28, 0xa2, 0xea, 0x4b, 0x76, 0xaf, 0x9c, 0x3d, 0xf1, 0x1b, + 0x92, 0xff, 0xb0, 0xca, 0x16, 0xa2, 0x29, 0x94, 0x0e, 0x1e, + 0x51, 0xfb, 0xe1, 0x2b, 0x5a, 0x50, 0xfd, 0xaf, 0xab, 0xd7, + 0x32, 0xaa, 0x43, 0xa7, 0xcb, 0xd3, 0xd3, 0xe9, 0x1e, 0xb1, + 0x70, 0xd2, 0xbb, 0x15, 0x68, 0x49, 0xee, 0x6e, 0x1e, 0xc5, + 0x64, 0x4b, 0x26, 0x08, 0xe7, 0x32, 0x1c, 0x1d, 0x73, 0x8f, + 0x42, 0xfe, 0xeb, 0x67, 0x89, 0x42, 0x25, 0x40, 0xd6, 0x15, + 0x02, 0x55, 0x87, 0xe3, 0x87, 0xdd, 0x78, 0xc1, 0x01, 0x94, + 0xbc, 0x30, 0x5f, 0xbd, 0x89, 0xe1, 0xb0, 0x5c, 0xcd, 0xb7, + 0x68, 0xd5, 0xbb, 0xf4, 0xa0, 0x5d, 0x3d, 0xdd, 0x89, 0x12, + 0xc7, 0xb8, 0x5d, 0x51, 0x8a, 0xf4, 0xd5, 0x05, 0xc6, 0xdd, + 0x7b, 0x44, 0x38, 0xce, 0xb1, 0x24, 0x24, 0xe1, 0x9d, 0xc7, + 0x80, 0x86, 0x46, 0x2a, 0xd2, 0xa4, 0x0f, 0xec, 0xd3, 0x6b, + 0x31, 0xc0, 0x05, 0x31, 0xff, 0xf5, 0x1a, 0x33, 0x35, 0x68, + 0x2e, 0x68, 0x24, 0xbd, 0x62, 0xfc, 0x46, 0x79, 0x54, 0x5e, + 0x1e, 0x27, 0x93, 0x07, 0xed, 0x78, 0x94, 0x50, 0x42, 0x98, + 0x53, 0x88, 0xb7, 0x57, 0x04, 0x7d, 0xe2, 0xe1, 0xb5, 0x61, + 0x9e, 0x5a, 0x88, 0x31, 0x3e, 0x6c, 0x69, 0xbc, 0x8a, 0xe6, + 0xbc, 0x9d, 0x20, 0x7a, 0x86, 0xe5, 0x73, 0x93, 0x02, 0xc5, + 0xde, 0xdc, 0xcc, 0xbf, 0x89, 0x76, 0xdc, 0x4e, 0xa1, 0x89, + 0xe7, 0x95, 0x75, 0x01, 0xf7, 0x43, 0xaa, 0x3f, 0x1b, 0xb7, + 0x8c, 0x92, 0x66, 0x22, 0xbe, 0x34, 0xf1, 0x2f, 0xc3, 0xc7, + 0x21, 0xaf, 0x25, 0x57, 0x9a, 0x2c, 0x80, 0xf0, 0xb3, 0xdd, + 0xb3, 0xb2, 0x82, 0x97, 0x85, 0x73, 0xa9, 0x76, 0xe4, 0x37, + 0xa2, 0x65, 0xf9, 0xc1, 0x3d, 0x11, 0xbf, 0xcb, 0x3c, 0x8e, + 0xdd, 0xaf, 0x98, 0x57, 0x6a, 0xe1, 0x33, 0xe7, 0xf0, 0xff, + 0xed, 0x61, 0x53, 0xfe, 0x1e, 0x2d, 0x06, 0x2f, 0xb8, 0x9e, + 0xf9, 0xa5, 0x21, 0x06, 0xf3, 0x72, 0xf6, 0xa3, 0x77, 0xbb, + 0x63, 0x6e, 0x52, 0xb2, 0x42, 0x47, 0x9b, 0x92, 0x4c, 0xf8, + 0xd2, 0xe6, 0x02, 0xa5, 0x57, 0x2d, 0x6f, 0x30, 0x05, 0xe2, + 0xfd, 0x33, 0xe5, 0xb6, 0x23, 0x85, 0x89, 0x4a, 0x99, 0x20, + 0x33, 0xea, 0x2f, 0xcd, 0x28, 0x27, 0xff, 0xfd, 0x2e, 0x73, + 0x52, 0x29, 0x19, 0x7c, 0x65, 0xf5, 0x6a, 0xaa, 0x97, 0x6e, + 0xe9, 0x42, 0xa8, 0x55, 0x97, 0x56, 0x92, 0x9d, 0xd2, 0xd1, + 0xc4, 0x30, 0xaa, 0x95, 0x86, 0xba, 0x71, 0xdd, 0x2f, 0xf1, + 0xed, 0x66, 0x54, 0x78, 0x4b, 0x13, 0x31, 0xed, 0x9d, 0x2c, + 0xae, 0x0a, 0xc3, 0xca, 0xfb, 0x3f, 0x92, 0x92, 0x30, 0xa3, + 0x8e, 0xc8, 0x6d, 0x7b, 0x42, 0xd5, 0x5d, 0x99, 0x79, 0x42, + 0x28, 0x63, 0x9f, 0x97, 0x8e, 0x94, 0x6d, 0x1d, 0xb4, 0x21, + 0x39, 0xc7, 0x64, 0x48, 0x44, 0x5e, 0x15, 0x10, 0x45, 0x9f, + 0x8a, 0x01, 0x45, 0x20, 0x5c, 0xd1, 0x28, 0x0d, 0xe9, 0xfb, + 0xa9, 0x72, 0x68, 0x07, 0x31, 0x20, 0x75, 0x76, 0x82, 0x76, + 0x5d, 0x7c, 0xc1, 0x5d, 0x42, 0x40, 0xfd, 0x06, 0xa9, 0x66, + 0xb0, 0x36, 0x55, 0x86, 0x6c, 0x96, 0xbd, 0xb8, 0xf7, 0x36, + 0x87, 0xf2, 0xa1, 0x37, 0xd8, 0x2d, 0x83, 0xf5, 0xdc, 0xd8, + 0xde, 0x9e, 0x69, 0xd6, 0xe1, 0x0d, 0xd5, 0x93, 0xc5, 0xee, + 0xba, 0xd3, 0x40, 0x71, 0xbb, 0xc7, 0xbb, 0x50, 0x1a, 0x10, + 0x80, 0x99, 0x62, 0x1c, 0xe3, 0x1f, 0xa2, 0xcc, 0x98, 0xe1, + 0xaa, 0xff, 0xd9, 0x69, 0xe7, 0x87, 0x04, 0x87, 0x76, 0xec, + 0x55, 0x18, 0xaf, 0x82, 0x34, 0x4d, 0x4f, 0xf7, 0x57, 0x1f, + 0xa5, 0x43, 0xcc, 0xe9, 0x7a, 0x4a, 0xc8, 0xb4, 0x1f, 0x61, + 0x40, 0x5e, 0x1d, 0x11, 0xdd, 0xdc, 0xdc, 0xb4, 0x57, 0xf9, + 0x47, 0x96, 0xbc, 0x47, 0x29, 0xf8, 0xf2, 0x43, 0xc4, 0xa0, + 0x8c, 0x14, 0x5e, 0x73, 0x52, 0xac, 0xac, 0x39, 0x3b, 0x06, + 0x19, 0x1a, 0xca, 0x22, 0xc8, 0x96, 0x12, 0x2e, 0x4c, 0x7b, + 0xa0, 0x96, 0x53, 0x16, 0xce, 0x6d, 0x6e, 0xac, 0xb2, 0x07, + 0x17, 0x22, 0x07, 0x30, 0x20, 0x84, 0x9b, 0x0e, 0x92, 0x31, + 0x07, 0xe2, 0x77, 0xcd, 0x6a, 0x3e, 0x16, 0x4f, 0xd6, 0x12, + 0x88, 0x8a, 0x70, 0x5a, 0x87, 0xd8, 0xb9, 0xef, 0x76, 0xab, + 0x14, 0x65, 0x87, 0x3a, 0xef, 0xd8, 0x0e, 0x24, 0x40, 0x73, + 0x93, 0x2b, 0xbf, 0xac, 0xfe, 0x96, 0x8a, 0x9d, 0x12, 0xe6, + 0xc1, 0x5b, 0x00, 0x3b, 0x23, 0xee, 0xe2, 0x10, 0xb6, 0xbe, + 0x0e, 0x2f, 0xa2, 0x77, 0x16, 0x17, 0xfc, 0x4b, 0x2c, 0xd7, + 0x9c, 0xad, 0x66, 0xb4, 0xf2, 0xfd, 0xc1, 0xaf, 0x81, 0x12, + 0xd9, 0xed, 0x14, 0x32, 0xcf, 0x1b, 0xee, 0xc6, 0x63, 0xe8, + 0xe5, 0xe6, 0xb6, 0x91, 0x8d, 0x1b, 0x90, 0x75, 0x5d, 0x69, + 0x4c, 0x5d, 0xd6, 0xac, 0x79, 0xe8, 0xb6, 0xdf, 0xbf, 0x43, + 0x39, 0xd3, 0xb8, 0xf0, 0x39, 0xf4, 0x90, 0xaf, 0x73, 0x26, + 0xc7, 0x73, 0x6f, 0x93, 0xbb, 0xce, 0x6e, 0xdc, 0x1c, 0xd0, + 0x36, 0x23, 0x17, 0xb2, 0x39, 0x37, 0x15, 0xf5, 0x3a, 0x61, + 0xa9, 0x15, 0x52, 0x6e, 0xc5, 0x3a, 0x63, 0x79, 0x5d, 0x45, + 0xdc, 0x3a, 0xd5, 0x26, 0x01, 0x56, 0x97, 0x80, 0x7f, 0x83, + 0xf9, 0xec, 0xde, 0xa0, 0x2e, 0x7a, 0xb2, 0x4b, 0x04, 0x63, + 0x60, 0x05, 0xce, 0x96, 0xeb, 0xe0, 0x0a, 0x5f, 0xb0, 0x7e, + 0x6d, 0x0a, 0x24, 0x32, 0x47, 0x82, 0x7f, 0x0b, 0xd7, 0xe9, + 0xd5, 0x14, 0xa9, 0x6b, 0x10, 0x5d, 0x1e, 0x1f, 0x8a, 0xad, + 0x70, 0x91, 0xd4, 0x33, 0x1d, 0xc2, 0x3e, 0xf8, 0xc8, 0x52, + 0x9a, 0x27, 0x1f, 0x45, 0x2f, 0xb5, 0xc7, 0xb1, 0x8b, 0xf9, + 0xc6, 0x7b, 0xb5, 0x92, 0x7a, 0xdd, 0xeb, 0x07, 0x6c, 0x6f, + 0x11, 0xd7, 0x5b, 0x56, 0x56, 0xec, 0x88, 0x1c, 0xc9, 0xb4, + 0xe8, 0x43, 0xab, 0xdf, 0x0b, 0xc5, 0x28, 0xba, 0x70, 0x5d, + 0xd3, 0xb2, 0xe2, 0xcf, 0xa7, 0xbb, 0x53, 0x04, 0x6b, 0x73, + 0xdf, 0x27, 0xa6, 0x63, 0x58, 0xe1, 0x39, 0x26, 0x2a, 0x1a, + 0x21, 0xec, 0xbb, 0x5f, 0x46, 0x98, 0x3d, 0x48, 0x66, 0xfe, + 0xf3, 0xcb, 0xfc, 0x6e, 0x99, 0x82, 0x91, 0xce, 0x53, 0xfd, + 0x75, 0xc9, 0xb6, 0x08, 0xa8, 0xf3, 0xe4, 0xe0, 0xa0, 0x24, + 0x45, 0xb4, 0x69, 0x11, 0xac, 0x06, 0x1c, 0x39, 0x71, 0xcf, + 0x72, 0xfc, 0x77, 0x9b, 0x5f, 0xf4, 0x8b, 0x02, 0x31, 0xf3, + 0x67, 0xd1, 0x9b, 0xe0, 0x49, 0xa4, 0x69, 0x20, 0x99, 0x38, + 0xa7, 0xf5, 0x43, 0xd2, 0x45, 0x9f, 0x7a, 0xe7, 0xad, 0x7e, + 0x36, 0xee, 0xfd, 0x8c, 0xc5, 0x6a, 0x12, 0x58, 0x15, 0x3b, + 0x02, 0x81, 0x73, 0x8b, 0x10, 0xda, 0x21, 0xc7, 0x1d, 0x38, + 0xd8, 0x40, 0x7a, 0xa3, 0x59, 0x55, 0x35, 0x44, 0xa9, 0x9c, + 0xf5, 0xf4, 0xe4, 0x14, 0xc1, 0xc4, 0x15, 0x26, 0x01, 0xe3, + 0x31, 0xbf, 0xdc, 0xbc, 0x69, 0x0b, 0xcf, 0x71, 0x8c, 0xdb, + 0x16, 0xab, 0x36, 0x3e, 0xb3, 0xa4, 0x9f, 0xcc, 0xbf, 0xa2, + 0x93, 0x93, 0x9a, 0x3b, 0xaf, 0x72, 0x8d, 0x8b, 0x92, 0x44, + 0x5d, 0x6f, 0xc5, 0xf0, 0xdc, 0x65, 0x62, 0xea, 0xba, 0x33, + 0xe7, 0x6c, 0xa4, 0x35, 0xcf, 0xd9, 0xbc, 0x3c, 0xbf, 0x25, + 0x7b, 0x7c, 0x0b, 0x62, 0x92, 0x5a, 0x66, 0x63, 0xe1, 0x27, + 0x89, 0x12, 0xe2, 0xae, 0xb7, 0xf8, 0x04, 0x70, 0xda, 0x4a, + 0x3d, 0xa6, 0x67, 0x12, 0x14, 0x9e, 0x8e, 0xdc, 0xa2, 0xf2, + 0x3d, 0xc7, 0xd2, 0x8f, 0x18, 0x3a, 0x53, 0x8c, 0x83, 0x5d, + 0x66, 0xbb, 0x9f, 0x8c, 0xaf, 0xa8, 0x73, 0x08, 0x2e, 0x6d, + 0x30, 0xa0, 0xd0, 0x20, 0x94, 0x48, 0xad, 0x5e, 0x31, 0xfd, + 0x5e, 0xfd, 0xf9, 0xb5, 0xa2, 0x39, 0xa3, 0xb9, 0xdf, 0x4d, + 0xa4, 0xb1, 0x54, 0xcc, 0x92, 0x63, 0x2c, 0x66, 0x2d, 0x01, + 0x88, 0x8b, 0x7d, 0xc6, 0x5c, 0x9f, 0x18, 0x9a, 0x53, 0x91, + 0x59, 0x66, 0x70, 0xd7, 0x81, 0x0e, 0xa1, 0x3c, 0x7e, 0x86, + 0x85, 0x64, 0x38, 0x6f, 0xec, 0x76, 0x57, 0x80, 0x41, 0x9d, + 0xef, 0x61, 0xb8, 0xb2, 0x8a, 0xeb, 0xe9, 0x26, 0xbb, 0x69, + 0xb3, 0x8d, 0xd4, 0x6b, 0x05, 0xd8, 0x55, 0x1c, 0xbd, 0x9f, + 0x6b, 0x23, 0x46, 0x2b, 0xf7, 0xfb, 0x4d, 0x33, 0x3b, 0x21, + 0x6d, 0xea, 0x1b, 0x15, 0xaf, 0x0f, 0x8c, 0x98, 0xc8, 0xf4, + 0xd1, 0x3c, 0xdd, 0x21, 0xd0, 0x45, 0xdc, 0xaf, 0x89, 0x89, + 0xbf, 0xde, 0xbf, 0x46, 0x9e, 0x9e, 0x18, 0x56, 0x9d, 0x05, + 0x4d, 0x63, 0x5f, 0x1c, 0xd9, 0x15, 0xd1, 0x43, 0x17, 0x0c, + 0x48, 0x3d, 0x36, 0x8b, 0x14, 0x87, 0xc8, 0x10, 0x44, 0xdf, + 0x9c, 0xfd, 0x6e, 0x88, 0x88, 0xae, 0x7f, 0x7f, 0x67, 0xa3, + 0x33, 0x4d, 0xa3, 0x84, 0x8b, 0x58, 0x07, 0x17, 0xd8, 0x1d, + 0x9e, 0x43, 0xd6, 0x41, 0x9c, 0xff, 0xfa, 0x35, 0xa2, 0x42, + 0xa9, 0x5d, 0xa9, 0x4b, 0x95, 0x23, 0x6a, 0x6e, 0x42, 0xd7, + 0xa2, 0x0a, 0x70, 0x00, 0x61, 0x8b, 0x45, 0xbb, 0xac, 0x20, + 0x27, 0xcd, 0xfc, 0x61, 0x17, 0xfe, 0xab, 0x6b, 0xe8, 0xe0, + 0x51, 0xab, 0xa3, 0xbf, 0xe4, 0x85, 0x69, 0x8e, 0xd7, 0xa6, + 0x62, 0x33, 0x8f, 0x7c, 0xba, 0x48, 0xfa, 0x83, 0x94, 0xa5, + 0xdf, 0xa1, 0x76, 0xdc, 0xa9, 0x4b, 0x3c, 0x27, 0xff, 0xd9, + 0xbe, 0xf4, 0x80, 0x5a, 0xca, 0x33, 0xf3, 0x9a, 0x1d, 0xf8, + 0xf3, 0xe1, 0x83, 0x27, 0x0b, 0x59, 0x87, 0x31, 0x7d, 0x4f, + 0x5a, 0x5e, 0xe1, 0xbe, 0xa9, 0x68, 0xe9, 0x6f, 0x10, 0x0a, + 0xe2, 0x70, 0x05, 0xaa, 0xcb, 0xdd, 0x41, 0xd7, 0x49, 0x8a, + 0x98, 0xa0, 0x40, 0x2d, 0xc6, 0x56, 0x49, 0xca, 0x60, 0x16, + 0x9c, 0x38, 0xc9, 0xfe, 0x99, 0x15, 0xfb, 0x79, 0x01, 0x33, + 0xcd, 0x54, 0x2f, 0xf3, 0x70, 0x37, 0x82, 0x36, 0x32, 0x76, + 0x8f, 0x63, 0x00, 0xa2, 0x42, 0xce, 0x39, 0x90, 0xfc, 0xf8, + 0xff, 0x34, 0x38, 0x0a, 0x17, 0x5e, 0x9d, 0x34, 0x86, 0xde, + 0x33, 0x45, 0xac, 0xbf, 0x81, 0xdf, 0xd2, 0xbc, 0xc7, 0xd7, + 0xd1, 0xee, 0xde, 0x2b, 0x5b, 0x50, 0x56, 0xb5, 0x88, 0x00, + 0x92, 0x76, 0x5a, 0x34, 0x0c, 0xfe, 0x8f, 0xc5, 0xa0, 0x92, + 0xb0, 0xed, 0x43, 0xe7, 0x81, 0x39, 0x36, 0x6e, 0xb7, 0x4d, + 0x5b, 0xcf, 0xc7, 0xf0, 0x83, 0xe5, 0xdc, 0xb7, 0x74, 0xf4, + 0xf3, 0xbd, 0xa8, 0xa6, 0x7b, 0xe0, 0xc5, 0x50, 0xaa, 0xc7, + 0x83, 0x4d, 0xd9, 0xc5, 0x97, 0x03, 0x7c, 0x0c, 0x3b, 0x3a, + 0x18, 0xb2, 0x8c, 0xee, 0x67, 0x91, 0x38, 0x84, 0x8f, 0xef, + 0xb4, 0xf4, 0xe4, 0x7c, 0x1a, 0x3f, 0xa3, 0x0a, 0xd9, 0xba, + 0xff, 0x56, 0xd8, 0xe2, 0x82, 0xfc, 0x58, 0x8f, 0xf6, 0x12, + 0x10, 0x65, 0x6a, 0x68, 0x53, 0x2d, 0x9f, 0x2c, 0x77, 0xd1, + 0xb8, 0x21, 0x8a, 0xcb, 0xe9, 0xd4, 0x25, 0x18, 0x22, 0x46, + 0x3e, 0x72, 0x29, 0x2a, 0x68, 0x70, 0x73, 0xe2, 0x61, 0xa2, + 0xa8, 0x1f, 0x24, 0x48, 0x92, 0xa0, 0xd4, 0xdd, 0xde, 0xe5, + 0x02, 0x1b, 0x59, 0x5c, 0x7e, 0x92, 0x9c, 0xd8, 0xf4, 0x2d, + 0x6b, 0x79, 0x7b, 0xc7, 0xcd, 0xef, 0x21, 0x2a, 0x50, 0x7e, + 0xba, 0xdd, 0x02, 0x45, 0x7e, 0xc1, 0xdd, 0xeb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x0c, 0x15, 0x1c, 0x22, 0x28, +}; +static const int sizeof_bench_dilithium_level3_sig = + sizeof(bench_dilithium_level3_sig); +#endif + +#ifndef WOLFSSL_NO_ML_DSA_87 +static const unsigned char bench_dilithium_level5_sig[] = { + 0x78, 0xed, 0x1a, 0x3f, 0x41, 0xab, 0xf8, 0x93, 0x80, 0xf0, + 0xc6, 0xbf, 0x4a, 0xde, 0xaf, 0x29, 0x93, 0xe5, 0x9a, 0xbf, + 0x38, 0x08, 0x18, 0x33, 0xca, 0x7d, 0x5e, 0x65, 0xa4, 0xd2, + 0xd7, 0x45, 0xe3, 0xe7, 0x58, 0xfb, 0x05, 0xab, 0x65, 0x57, + 0xac, 0x6f, 0xf5, 0x43, 0x28, 0x5f, 0x9c, 0x9a, 0x3e, 0x35, + 0x84, 0xe4, 0xef, 0xa5, 0x57, 0x17, 0xad, 0x51, 0x44, 0x70, + 0x09, 0x00, 0x81, 0xbe, 0xfe, 0x14, 0x01, 0xfe, 0x0c, 0x94, + 0xbe, 0xa9, 0x89, 0xfd, 0x47, 0xfc, 0xb9, 0xd8, 0x17, 0x4d, + 0xd8, 0x73, 0xd5, 0x50, 0x9f, 0x13, 0x6c, 0x07, 0x71, 0x47, + 0xaa, 0x3c, 0xc0, 0x64, 0x00, 0x19, 0x2e, 0x74, 0x51, 0x0e, + 0x0f, 0x25, 0x30, 0x7f, 0x13, 0x96, 0xc6, 0xc5, 0xbf, 0xd4, + 0x82, 0xd3, 0x0d, 0xd3, 0x65, 0x4c, 0x72, 0x67, 0xe2, 0x37, + 0x6b, 0x3c, 0x8e, 0xa3, 0x36, 0x84, 0xe9, 0xaa, 0xac, 0x7d, + 0xf3, 0xac, 0xfc, 0x01, 0x50, 0x87, 0x88, 0xf6, 0xbf, 0x84, + 0xc3, 0xa0, 0x23, 0xe4, 0xe8, 0x01, 0x38, 0x39, 0x30, 0x8a, + 0xf3, 0xba, 0x92, 0x62, 0x37, 0xd7, 0x20, 0xd7, 0xf7, 0x41, + 0xff, 0xae, 0x81, 0x02, 0x29, 0x2a, 0x66, 0x8b, 0x20, 0xbe, + 0x61, 0x8d, 0xfb, 0x7c, 0x70, 0x14, 0xad, 0xf4, 0x94, 0x8c, + 0xee, 0x64, 0x3b, 0x9f, 0xe1, 0x6e, 0x68, 0x17, 0x07, 0xb8, + 0xfc, 0x99, 0xdc, 0xde, 0x69, 0x58, 0x8c, 0x97, 0x7d, 0xb3, + 0x2c, 0x9e, 0x90, 0x33, 0x2e, 0x7b, 0xbf, 0xf8, 0x6f, 0xf8, + 0x12, 0x64, 0xda, 0xc0, 0xfb, 0x30, 0xe6, 0xbf, 0x7b, 0x9a, + 0xde, 0xb5, 0xac, 0x9d, 0x6b, 0xcb, 0xe1, 0x0d, 0xf1, 0xbb, + 0xf3, 0x97, 0xc5, 0x08, 0xd3, 0x3e, 0xe3, 0xa4, 0xeb, 0x6f, + 0x6b, 0x62, 0x61, 0xc5, 0x0b, 0xa8, 0x02, 0xc2, 0xf1, 0xbe, + 0xbb, 0x93, 0x13, 0xa5, 0x8d, 0x7b, 0x5a, 0x6d, 0x1f, 0x28, + 0xbc, 0x35, 0xd8, 0xe8, 0xcf, 0x80, 0x8b, 0x4b, 0x02, 0x80, + 0x3b, 0xdc, 0x00, 0xce, 0x88, 0xb0, 0x62, 0x35, 0x7d, 0x51, + 0x7f, 0x5c, 0xb2, 0x23, 0x85, 0x47, 0x7e, 0x73, 0x88, 0x65, + 0xfd, 0x0d, 0x47, 0x33, 0xef, 0xb9, 0x75, 0x05, 0x86, 0x5d, + 0xd3, 0x98, 0xa6, 0x91, 0xe6, 0x8c, 0xe2, 0x71, 0x7a, 0x95, + 0xe0, 0x8c, 0x54, 0x4b, 0x68, 0x4d, 0x5a, 0xec, 0xad, 0xae, + 0x54, 0x4e, 0x3b, 0x0e, 0xcd, 0x70, 0xe6, 0x81, 0xbf, 0xf4, + 0x86, 0xab, 0xfe, 0xd8, 0xed, 0x69, 0xdd, 0x0f, 0x75, 0x8f, + 0x8e, 0xcd, 0x72, 0x40, 0x21, 0xee, 0x80, 0x6f, 0x9e, 0xa0, + 0x80, 0xf7, 0xf6, 0xa2, 0xf5, 0x04, 0x82, 0xea, 0xb6, 0xb1, + 0xa3, 0xfe, 0xa2, 0x2d, 0x83, 0xc7, 0x01, 0x4b, 0x27, 0x19, + 0x6a, 0x31, 0x04, 0x70, 0xce, 0x75, 0x22, 0x4b, 0x7a, 0x21, + 0x29, 0xfd, 0xe9, 0xcb, 0xbb, 0xca, 0x95, 0x0a, 0xd8, 0xcd, + 0x20, 0x2a, 0xb7, 0xbe, 0xdf, 0x2f, 0x0f, 0xfa, 0xf1, 0xc0, + 0x39, 0xf3, 0x74, 0x22, 0x05, 0x33, 0xca, 0x2a, 0x9c, 0x9f, + 0x06, 0x71, 0x90, 0x1e, 0x74, 0x4b, 0xbe, 0x9a, 0xc7, 0x1e, + 0x37, 0x9b, 0x96, 0x19, 0xfd, 0xa0, 0x61, 0x87, 0x93, 0xab, + 0x75, 0x79, 0xac, 0x2f, 0x83, 0xe1, 0x8c, 0x70, 0x54, 0x70, + 0x01, 0x93, 0xce, 0x76, 0x7a, 0x08, 0xe7, 0x75, 0xfb, 0x5e, + 0xa4, 0xcc, 0xd6, 0xeb, 0x90, 0xe2, 0x57, 0x07, 0x53, 0x88, + 0x8f, 0x7f, 0x29, 0x39, 0x80, 0xc4, 0x7f, 0x70, 0x6f, 0xff, + 0x44, 0x25, 0x2b, 0x9e, 0xa1, 0xbb, 0xda, 0x43, 0x53, 0x14, + 0xf8, 0x97, 0x08, 0xa4, 0xaf, 0xa0, 0xa5, 0x0c, 0xfa, 0xcc, + 0xba, 0xcd, 0x4f, 0xd3, 0x90, 0x28, 0x02, 0x25, 0xbe, 0xc6, + 0x35, 0x66, 0x99, 0xb0, 0x69, 0x46, 0xe5, 0xbf, 0x7e, 0x4f, + 0x53, 0x11, 0x1f, 0xa5, 0x2c, 0x9b, 0xd1, 0x70, 0x90, 0x34, + 0x66, 0xaa, 0x9f, 0xa8, 0x02, 0x3a, 0x05, 0x2b, 0x0a, 0xd0, + 0x72, 0x5d, 0x01, 0x7b, 0x02, 0xce, 0x18, 0xb9, 0x63, 0xd1, + 0x7d, 0xd2, 0x34, 0xa3, 0x2d, 0xaa, 0x78, 0xf0, 0x30, 0x6e, + 0x59, 0xe3, 0xf1, 0x1e, 0xf1, 0x33, 0x41, 0xde, 0xc4, 0x4e, + 0x88, 0x61, 0xc3, 0xb4, 0x6b, 0x21, 0x5d, 0xcc, 0x69, 0x44, + 0xf3, 0xb0, 0x84, 0x54, 0x2a, 0x23, 0x22, 0xa2, 0xc4, 0xba, + 0xad, 0x00, 0x57, 0x5b, 0xdf, 0xa0, 0xf7, 0x1c, 0x00, 0xc3, + 0x23, 0x93, 0xc0, 0x2f, 0x3b, 0x9d, 0x6e, 0x8c, 0x38, 0xa6, + 0x5e, 0xd8, 0x98, 0x7a, 0x6c, 0x90, 0xd5, 0x40, 0x3f, 0x8c, + 0xc3, 0xf0, 0x92, 0x66, 0xc4, 0xe5, 0xa8, 0x42, 0x25, 0x4c, + 0x56, 0x42, 0x37, 0x9a, 0xa4, 0x1d, 0xf5, 0xb0, 0xe3, 0x8a, + 0x9c, 0x57, 0x52, 0x63, 0xdc, 0xd9, 0xb0, 0xbf, 0xc3, 0xfc, + 0xfc, 0x6c, 0xab, 0x41, 0xae, 0xec, 0xc7, 0x40, 0x80, 0xb6, + 0x0b, 0x3c, 0xa9, 0xf5, 0x4f, 0x2d, 0xf6, 0x72, 0xe3, 0xba, + 0x13, 0x2c, 0x73, 0x61, 0x98, 0x66, 0x6f, 0x03, 0x88, 0x3b, + 0xe6, 0x95, 0x43, 0x33, 0x3b, 0xfe, 0xfd, 0x63, 0x8c, 0x00, + 0x8a, 0x67, 0x1c, 0x46, 0x0e, 0x0b, 0x51, 0x26, 0x79, 0x4f, + 0x7b, 0xb1, 0x36, 0x34, 0x52, 0x41, 0x7e, 0x74, 0xbb, 0x71, + 0x52, 0x8f, 0xcc, 0xf2, 0x99, 0x24, 0x3f, 0x18, 0xe6, 0xcf, + 0xdf, 0x6b, 0xfe, 0x77, 0xfa, 0xa8, 0x3f, 0xe3, 0x6b, 0xb7, + 0x32, 0x30, 0x8e, 0x16, 0x08, 0x59, 0x66, 0xdf, 0x95, 0x75, + 0x7d, 0xa3, 0x80, 0xf0, 0x0c, 0x1a, 0xa8, 0xe7, 0x87, 0x2f, + 0xe3, 0x39, 0x11, 0x82, 0x00, 0x3e, 0xe5, 0x71, 0x05, 0x7d, + 0x0c, 0x90, 0xae, 0xbc, 0xbf, 0xe0, 0x4b, 0x8f, 0x91, 0x85, + 0x1d, 0x0a, 0xa2, 0x36, 0x66, 0x18, 0x78, 0xd0, 0x0a, 0xa0, + 0xaf, 0x0f, 0x1c, 0x01, 0xdb, 0xb2, 0x21, 0x96, 0x25, 0xf7, + 0x9e, 0x3a, 0x9e, 0xc3, 0xe8, 0x92, 0x34, 0xaf, 0x7e, 0x3b, + 0x5f, 0xd9, 0x23, 0x97, 0x09, 0xf1, 0x87, 0x31, 0x3a, 0x94, + 0xc8, 0x9b, 0x52, 0xf4, 0x57, 0x54, 0x7b, 0x3e, 0x50, 0xd3, + 0x75, 0x2a, 0xba, 0x97, 0xd7, 0xec, 0x95, 0x6c, 0x35, 0x63, + 0xa4, 0xa1, 0x8f, 0xf5, 0xcc, 0xbe, 0x42, 0x65, 0x4e, 0x69, + 0x35, 0x55, 0xa5, 0x3e, 0xc4, 0xf0, 0xde, 0x60, 0x54, 0xdf, + 0xbb, 0x83, 0xad, 0xdf, 0xa5, 0x24, 0x8f, 0xbe, 0x0b, 0x16, + 0xfc, 0xf2, 0x64, 0xd5, 0x79, 0x68, 0xf3, 0x91, 0x81, 0x2a, + 0xd7, 0x1c, 0xc0, 0xdd, 0xe6, 0xb6, 0xb3, 0xa2, 0x4f, 0xc0, + 0x6d, 0x77, 0x02, 0xee, 0x43, 0xd6, 0x5e, 0x82, 0x66, 0x7f, + 0xb4, 0xe6, 0x5c, 0xff, 0x87, 0x1e, 0x1d, 0x6f, 0x1d, 0x96, + 0x6d, 0xbd, 0x90, 0x57, 0x65, 0xc2, 0x01, 0x35, 0xfa, 0x9a, + 0xc6, 0xe0, 0x4e, 0x2c, 0x4b, 0x16, 0xfa, 0x0d, 0x38, 0x87, + 0x39, 0x2c, 0x2b, 0x48, 0x14, 0x92, 0x3d, 0x83, 0x00, 0xa9, + 0x1a, 0x3d, 0x4d, 0x30, 0x23, 0x48, 0xcd, 0xd5, 0xcd, 0x01, + 0xb1, 0x45, 0x85, 0xcc, 0x66, 0x47, 0x1d, 0x63, 0x3d, 0x70, + 0xb8, 0x0c, 0xfd, 0xe3, 0xb2, 0x0f, 0x64, 0x6e, 0xb9, 0x2b, + 0xe5, 0xb0, 0x4d, 0x44, 0x4d, 0x66, 0x1a, 0xfa, 0x49, 0xbb, + 0xc3, 0xb8, 0xad, 0x64, 0x23, 0x7e, 0x71, 0x9f, 0x59, 0xec, + 0x25, 0xa8, 0x5e, 0x11, 0xd6, 0x6e, 0xc9, 0x09, 0xe7, 0xb9, + 0x6a, 0x63, 0x91, 0xaa, 0x5d, 0xd2, 0x8c, 0x91, 0xe8, 0x8d, + 0x35, 0x6d, 0x10, 0xf6, 0xfc, 0x6a, 0x3c, 0x77, 0x90, 0xf8, + 0x2a, 0x49, 0x13, 0x7f, 0xdb, 0xf5, 0x0c, 0xe9, 0xc8, 0x57, + 0xc6, 0xfd, 0x26, 0x8d, 0x79, 0xb5, 0xdd, 0x47, 0x74, 0x6e, + 0xe8, 0x8f, 0x50, 0xf5, 0xa7, 0x9e, 0xd1, 0x74, 0x10, 0xbb, + 0xf4, 0x8f, 0x8f, 0x0d, 0xcd, 0x1f, 0xf6, 0x59, 0xb8, 0x6c, + 0xd2, 0x37, 0x83, 0x28, 0xb2, 0x36, 0xc1, 0x39, 0x5b, 0xde, + 0x59, 0xee, 0x77, 0xa2, 0x6e, 0x67, 0xc6, 0xea, 0x1d, 0x2b, + 0x41, 0x8f, 0x6f, 0x96, 0x94, 0x1b, 0x5d, 0xab, 0x30, 0x53, + 0x1e, 0xf8, 0x17, 0x06, 0xea, 0xcc, 0x98, 0xa8, 0xdf, 0x81, + 0xe1, 0x80, 0xb7, 0xad, 0x69, 0xcb, 0x8f, 0x81, 0x1e, 0x76, + 0x75, 0x3c, 0x11, 0x9b, 0x38, 0x95, 0xa7, 0x87, 0x1f, 0xd9, + 0x76, 0x82, 0x21, 0x13, 0x25, 0x20, 0x42, 0xd3, 0x8c, 0xd9, + 0x1c, 0x64, 0xed, 0xe9, 0x55, 0xb5, 0x29, 0x98, 0x85, 0x7c, + 0x01, 0x94, 0xaa, 0xdd, 0x8c, 0x78, 0x08, 0x99, 0x99, 0x5a, + 0xf6, 0x61, 0x4c, 0xe0, 0x99, 0xf8, 0x15, 0x74, 0x2e, 0x0d, + 0x14, 0x89, 0x11, 0x84, 0xcd, 0x78, 0x0c, 0x6b, 0x48, 0xde, + 0xb4, 0xd6, 0x05, 0xbd, 0x99, 0x58, 0xb7, 0xe5, 0xc5, 0x7a, + 0x43, 0x18, 0x55, 0x33, 0x16, 0x2b, 0xfa, 0x27, 0xf5, 0xbb, + 0xaa, 0x52, 0xb5, 0x28, 0x5c, 0xfe, 0x61, 0x7f, 0x7a, 0x70, + 0xc2, 0x32, 0x4b, 0x05, 0x8d, 0x7b, 0x4d, 0x22, 0x57, 0x25, + 0x40, 0x46, 0x7c, 0xad, 0x2f, 0x8a, 0xc8, 0x16, 0xd6, 0xac, + 0x4e, 0xe3, 0xe3, 0x29, 0xe4, 0xe8, 0x00, 0x2b, 0xc9, 0xe3, + 0x3a, 0x6f, 0x66, 0xf1, 0x37, 0x37, 0x52, 0x88, 0x77, 0xf6, + 0xbd, 0x59, 0x5f, 0xf8, 0x11, 0x46, 0x7b, 0x12, 0x88, 0x2f, + 0x4b, 0x0d, 0x16, 0x89, 0x3e, 0x2a, 0x56, 0x58, 0xa8, 0x1c, + 0xee, 0x23, 0xd5, 0x66, 0x86, 0x5f, 0x59, 0x55, 0xac, 0x07, + 0xfd, 0xda, 0x6b, 0xf1, 0xc7, 0x01, 0x19, 0xdb, 0xff, 0x63, + 0x6f, 0x27, 0xdb, 0xa1, 0xc7, 0xe9, 0xe0, 0xdb, 0xe4, 0x9a, + 0xce, 0xf5, 0xac, 0x68, 0xab, 0x59, 0x0c, 0x83, 0xa3, 0x1c, + 0x2a, 0x86, 0x55, 0xe2, 0xaa, 0xa1, 0xb3, 0xed, 0xc2, 0x2d, + 0x43, 0xc5, 0x13, 0x68, 0xe4, 0x83, 0x3e, 0xd5, 0x7f, 0xf7, + 0xd5, 0xd0, 0x60, 0xd3, 0x70, 0x7f, 0x88, 0xaa, 0xca, 0x74, + 0xcc, 0x50, 0x8d, 0x55, 0x9c, 0xfe, 0x4a, 0xc6, 0xc9, 0x36, + 0xf7, 0x27, 0x26, 0x64, 0xd3, 0x6c, 0xdb, 0x16, 0x31, 0x81, + 0xe9, 0xce, 0x73, 0x60, 0x61, 0x9c, 0x0f, 0xb5, 0x6e, 0x68, + 0xbc, 0xb1, 0x9e, 0x9f, 0xcd, 0x6c, 0x27, 0x31, 0x2d, 0x40, + 0x36, 0xce, 0x91, 0xee, 0x47, 0xdc, 0xa0, 0x4f, 0xd7, 0x14, + 0x4f, 0x93, 0x00, 0xc4, 0x34, 0xca, 0xd4, 0x42, 0x21, 0x90, + 0xf6, 0x9d, 0xea, 0x45, 0x15, 0xfe, 0x2d, 0xd6, 0xab, 0xc2, + 0x36, 0x47, 0xc0, 0x5b, 0xd2, 0xae, 0x53, 0x33, 0xb0, 0x2d, + 0x29, 0xa3, 0x14, 0xda, 0xa4, 0x48, 0xc1, 0x57, 0x0c, 0xdc, + 0x72, 0x4a, 0xd0, 0xf5, 0x5b, 0x9a, 0x57, 0x1d, 0x06, 0xc8, + 0x0f, 0xc7, 0x5b, 0x70, 0xbb, 0x27, 0xf4, 0xe2, 0xf4, 0xf3, + 0x3c, 0xdc, 0xba, 0x43, 0xc4, 0x4e, 0xe2, 0x96, 0xd4, 0x6c, + 0x33, 0x3e, 0xbf, 0x85, 0xf7, 0x3c, 0x1d, 0x46, 0x59, 0x4e, + 0xa1, 0xa7, 0xa3, 0x76, 0x55, 0x8a, 0x72, 0x83, 0xd0, 0x45, + 0x86, 0x38, 0xa5, 0x4d, 0xc8, 0x62, 0xe4, 0x8a, 0xd5, 0x8e, + 0xb7, 0x4c, 0x6e, 0xaf, 0xa4, 0xbe, 0x88, 0x87, 0x77, 0xd1, + 0x7b, 0xb2, 0x1d, 0xe0, 0x1e, 0x53, 0x30, 0x31, 0x15, 0x6c, + 0x10, 0x81, 0x03, 0x55, 0xa7, 0x69, 0xb6, 0xa5, 0x48, 0xf4, + 0xb2, 0x3b, 0x76, 0x8b, 0x2e, 0x42, 0xa6, 0xaa, 0x7e, 0x66, + 0x57, 0xc2, 0x11, 0xc5, 0x2c, 0x7d, 0x96, 0xdf, 0xe3, 0x58, + 0x12, 0x98, 0x18, 0x0d, 0x87, 0xbd, 0x64, 0xbd, 0xfe, 0x6d, + 0xad, 0x6d, 0x1e, 0xf6, 0x34, 0x01, 0xb5, 0x56, 0xe8, 0x6a, + 0xb3, 0x8c, 0x70, 0x84, 0x36, 0x17, 0xd6, 0x4b, 0xaa, 0x57, + 0xab, 0xb3, 0x45, 0x30, 0x36, 0x10, 0xd4, 0xee, 0x8a, 0xc9, + 0x29, 0xd1, 0x92, 0x9b, 0xe2, 0x7c, 0x12, 0xd1, 0x29, 0x62, + 0x41, 0x69, 0xae, 0x3a, 0x50, 0xcc, 0x89, 0x50, 0x2e, 0xe6, + 0x07, 0xf8, 0x9c, 0x98, 0x80, 0xd5, 0xa3, 0xc8, 0x74, 0xfb, + 0xfc, 0x91, 0x16, 0x02, 0xdc, 0xf0, 0x42, 0x49, 0xbc, 0xc9, + 0x2f, 0x7f, 0x8d, 0x93, 0xf7, 0xf0, 0x74, 0xb7, 0xd1, 0x55, + 0xfc, 0x79, 0x03, 0x37, 0xfb, 0xf6, 0x7d, 0x2f, 0x2d, 0xf8, + 0x6b, 0xc5, 0xf9, 0x66, 0x38, 0xf5, 0xfd, 0x64, 0xc6, 0x08, + 0x99, 0xb3, 0x25, 0xad, 0xf4, 0xfd, 0x69, 0x2f, 0xf1, 0x18, + 0x46, 0xd6, 0x5c, 0x1a, 0x37, 0xcd, 0xee, 0xa3, 0xbf, 0x0f, + 0x57, 0x5c, 0xc3, 0x97, 0x94, 0x84, 0x89, 0xbe, 0x00, 0xf6, + 0x40, 0xe9, 0x5a, 0x52, 0xaf, 0x3a, 0x5b, 0xf4, 0x56, 0xb0, + 0x04, 0x49, 0xc6, 0x32, 0x8c, 0xa1, 0x0a, 0xd8, 0x88, 0xa1, + 0xc3, 0xb7, 0x8b, 0x96, 0xc3, 0x39, 0x51, 0x50, 0x83, 0xa6, + 0xf0, 0x6d, 0xe7, 0x6e, 0x20, 0xff, 0x9d, 0xac, 0x03, 0x57, + 0xbc, 0xcb, 0x6a, 0x19, 0xa7, 0xc5, 0xd2, 0x44, 0x4f, 0x17, + 0x1e, 0x9a, 0x8d, 0x97, 0x25, 0x55, 0x52, 0x49, 0xe2, 0x48, + 0xae, 0x4b, 0x3f, 0x94, 0x5a, 0xb2, 0x2d, 0x40, 0xd9, 0x85, + 0xef, 0x03, 0xa0, 0xd3, 0x66, 0x9a, 0x8f, 0x7b, 0xc0, 0x8d, + 0x54, 0x95, 0x42, 0x49, 0xeb, 0x15, 0x00, 0xf3, 0x6d, 0x6f, + 0x40, 0xf2, 0x8b, 0xc1, 0x50, 0xa6, 0x22, 0x3b, 0xd6, 0x88, + 0xa1, 0xf7, 0xb0, 0x1f, 0xcd, 0x20, 0x4e, 0x5b, 0xad, 0x66, + 0x4a, 0xda, 0x40, 0xee, 0x4c, 0x4c, 0x3e, 0xa7, 0x75, 0x51, + 0x90, 0xba, 0xee, 0x59, 0xbc, 0xe3, 0xcd, 0x4d, 0xb9, 0x57, + 0xb7, 0xf8, 0xc1, 0xb9, 0x8d, 0x0f, 0x58, 0x2c, 0x4c, 0x98, + 0xa6, 0x9c, 0xd9, 0x0e, 0x25, 0x4f, 0xea, 0x4c, 0x15, 0x0b, + 0x89, 0xe4, 0xac, 0xa1, 0x5a, 0xa1, 0xfd, 0x5b, 0xc6, 0xfe, + 0xf0, 0xf1, 0x4c, 0xa7, 0x60, 0xbc, 0xc3, 0xa5, 0x80, 0x00, + 0x3b, 0x3f, 0x22, 0x38, 0x60, 0x40, 0x76, 0x52, 0x83, 0x32, + 0xee, 0x20, 0x6a, 0xf9, 0x1e, 0x6b, 0x99, 0x52, 0xe7, 0x04, + 0xdc, 0x5a, 0x9d, 0x77, 0x8a, 0xdd, 0x9b, 0x53, 0x19, 0xff, + 0x69, 0x8c, 0xbc, 0xc6, 0xe0, 0x79, 0x0d, 0x3d, 0x3d, 0x54, + 0x5b, 0xe0, 0x47, 0x5b, 0x71, 0x05, 0x98, 0x8f, 0xbb, 0x65, + 0xe1, 0x31, 0x9a, 0xc8, 0x1e, 0x7a, 0x4a, 0xf8, 0xcb, 0x17, + 0xd1, 0x83, 0x58, 0xb1, 0xc0, 0xe4, 0xb1, 0x85, 0xca, 0xa5, + 0xf8, 0x0e, 0xd1, 0x0c, 0xe8, 0x71, 0xc3, 0xfa, 0xbf, 0x1d, + 0xd6, 0x98, 0x03, 0xed, 0x77, 0x3b, 0x55, 0xaf, 0x69, 0x72, + 0x6b, 0x42, 0x31, 0x98, 0x95, 0xd5, 0x79, 0xa5, 0x4c, 0x51, + 0xcf, 0x02, 0x65, 0x93, 0xf2, 0x71, 0xdc, 0xde, 0x9a, 0xa3, + 0x86, 0xa7, 0xea, 0xcf, 0xd7, 0xe5, 0x00, 0xde, 0x40, 0x02, + 0xcd, 0x6b, 0x46, 0x0b, 0xbb, 0xbf, 0x77, 0x5f, 0x9d, 0x7c, + 0xa4, 0x7f, 0x7c, 0x8a, 0xba, 0xd6, 0x99, 0xc5, 0xaa, 0x06, + 0x36, 0xe1, 0x7e, 0x9c, 0x6f, 0x28, 0xd4, 0x6e, 0x1d, 0x5b, + 0xdd, 0x01, 0x24, 0xbd, 0x6c, 0x5d, 0x87, 0x3c, 0xc1, 0xf6, + 0x93, 0x37, 0xe2, 0x3b, 0x70, 0xc4, 0xd8, 0x10, 0x0e, 0x44, + 0x37, 0x00, 0xe3, 0x07, 0xbd, 0x67, 0xd3, 0x9d, 0xe6, 0xe7, + 0x48, 0x1b, 0xe0, 0x79, 0xb3, 0x30, 0x91, 0x89, 0x0f, 0x89, + 0x77, 0xfa, 0x13, 0x85, 0xd0, 0x32, 0xbd, 0xc1, 0x9e, 0x52, + 0x04, 0x80, 0x54, 0xb1, 0x08, 0x39, 0x20, 0xda, 0x3e, 0xf1, + 0xd9, 0x15, 0x74, 0x55, 0x06, 0xfc, 0x4d, 0x85, 0xd4, 0x98, + 0x02, 0x64, 0x10, 0x86, 0xd7, 0xcd, 0x01, 0x0d, 0x85, 0xa0, + 0x78, 0xb0, 0x58, 0x99, 0x7b, 0xdf, 0xe4, 0x8c, 0x3f, 0xab, + 0xc0, 0xbc, 0xa5, 0x30, 0x28, 0xe1, 0x4e, 0x02, 0x98, 0xab, + 0x03, 0xf3, 0x21, 0xe7, 0xa7, 0xe7, 0xc3, 0x5f, 0x98, 0xc0, + 0x83, 0x02, 0xe8, 0x8a, 0x30, 0x75, 0x95, 0xcf, 0x77, 0x83, + 0xfb, 0x32, 0x5a, 0xf9, 0x13, 0xed, 0xdb, 0xda, 0xc3, 0x84, + 0x4b, 0x8f, 0x1a, 0xf0, 0xad, 0x8e, 0xcf, 0xe3, 0xa7, 0x2b, + 0xb5, 0x44, 0x75, 0xd6, 0xda, 0x33, 0x81, 0x22, 0xa7, 0x6a, + 0xbd, 0x21, 0x64, 0x85, 0xfa, 0x65, 0x8e, 0xc4, 0x58, 0xec, + 0xc4, 0x18, 0x90, 0xa3, 0xcc, 0x2e, 0xaa, 0xa2, 0x2e, 0x46, + 0x7a, 0x4a, 0x35, 0xbf, 0x58, 0x78, 0x2b, 0x1e, 0x72, 0xe5, + 0x80, 0xc9, 0xe0, 0x9e, 0x43, 0x01, 0xcc, 0xe1, 0x0c, 0x00, + 0xe9, 0xc1, 0xa5, 0x1a, 0x9b, 0x4e, 0x6e, 0x34, 0x32, 0xfd, + 0x86, 0xb7, 0xae, 0xc3, 0x6e, 0x69, 0x04, 0xf6, 0x6a, 0x92, + 0x78, 0xb1, 0x1f, 0x9d, 0x5e, 0x0c, 0xf9, 0xc4, 0x1a, 0xf6, + 0xb4, 0x8a, 0x63, 0xb5, 0x87, 0x5b, 0xfb, 0x50, 0xbf, 0xd5, + 0x17, 0x97, 0x8e, 0x55, 0x1c, 0xfe, 0x82, 0xf6, 0xa7, 0x9c, + 0x0b, 0xc9, 0x0a, 0xf6, 0x7f, 0x70, 0xd1, 0x00, 0xed, 0x1c, + 0x6c, 0x3a, 0x95, 0xed, 0x61, 0xa4, 0xd6, 0x57, 0xfb, 0x57, + 0xf8, 0x9b, 0x4c, 0xce, 0x50, 0x26, 0x5c, 0x19, 0xd2, 0xa7, + 0xd6, 0xe8, 0x3c, 0x29, 0x34, 0xfb, 0x26, 0x7f, 0xc5, 0x78, + 0xbf, 0xfe, 0xb6, 0x2a, 0x5a, 0x62, 0x8e, 0x31, 0x9b, 0x57, + 0xa4, 0xe7, 0x4d, 0x3d, 0x18, 0x05, 0xf0, 0x94, 0xbb, 0x04, + 0xfa, 0x0a, 0x92, 0xf4, 0xc6, 0x7f, 0x16, 0xa2, 0x31, 0xed, + 0xc1, 0xb4, 0x62, 0x54, 0x3a, 0x23, 0x12, 0x6a, 0x76, 0xcc, + 0x8c, 0x91, 0x89, 0x58, 0x8c, 0x20, 0x23, 0xd9, 0xaa, 0x0d, + 0x80, 0xbe, 0xb9, 0xb4, 0x40, 0x1e, 0xff, 0xa9, 0xf7, 0x71, + 0x0a, 0xa0, 0x0a, 0xdf, 0x11, 0x0b, 0x66, 0x3f, 0xf2, 0x4d, + 0x5d, 0x39, 0x7c, 0x77, 0xe1, 0xb1, 0x09, 0xa1, 0x6b, 0x2e, + 0x30, 0x43, 0x33, 0x80, 0x6e, 0x6a, 0x1d, 0x47, 0xd9, 0xd6, + 0xac, 0xdc, 0x3f, 0x16, 0xb1, 0x58, 0x11, 0x9f, 0x67, 0xd7, + 0x15, 0x45, 0xd8, 0xc3, 0x69, 0x24, 0x8d, 0xac, 0xff, 0xc3, + 0x43, 0xfd, 0x24, 0xaf, 0xf1, 0xc8, 0x3a, 0xc7, 0xd6, 0x1f, + 0x56, 0x26, 0x16, 0xe6, 0x30, 0xcd, 0x6e, 0x0a, 0x63, 0x2a, + 0x7b, 0x86, 0xd7, 0x65, 0x39, 0x45, 0x7c, 0xe6, 0xa0, 0xe6, + 0x38, 0xed, 0x54, 0x84, 0x00, 0x4d, 0x8e, 0xc2, 0xba, 0x56, + 0x9b, 0xf3, 0xe1, 0xe8, 0x7d, 0xfe, 0x47, 0xf0, 0x58, 0xe7, + 0x59, 0x60, 0x97, 0x2e, 0x57, 0x1a, 0x09, 0x1f, 0x8b, 0x2b, + 0x0b, 0x47, 0x75, 0xc0, 0xb3, 0x79, 0xce, 0x10, 0x47, 0x6d, + 0xfc, 0xcb, 0x22, 0x61, 0x5c, 0x39, 0xc4, 0x3f, 0xc5, 0xef, + 0xb8, 0xc8, 0x88, 0x52, 0xce, 0x90, 0x17, 0xf5, 0x3c, 0xa9, + 0x87, 0x6f, 0xcb, 0x2f, 0x11, 0x53, 0x65, 0x9b, 0x74, 0x21, + 0x3e, 0xdd, 0x7b, 0x1f, 0x19, 0x9f, 0x53, 0xe6, 0xab, 0xc0, + 0x56, 0xba, 0x80, 0x19, 0x5d, 0x3f, 0xc7, 0xe2, 0xfb, 0x8c, + 0xe2, 0x93, 0xe0, 0x31, 0xc9, 0x33, 0x31, 0x23, 0x31, 0xa1, + 0x36, 0x4c, 0x62, 0xd8, 0x0a, 0xfd, 0x85, 0x97, 0xae, 0xa9, + 0xe9, 0x58, 0x29, 0x17, 0x33, 0x09, 0x5a, 0x8e, 0xa3, 0x90, + 0x41, 0xd3, 0xfc, 0x24, 0x98, 0x61, 0x4d, 0x30, 0x1f, 0x76, + 0x8f, 0xfc, 0xd0, 0x96, 0x8b, 0x2e, 0x9b, 0x24, 0x73, 0x35, + 0x00, 0xb7, 0xf6, 0xe8, 0xba, 0xec, 0x98, 0x74, 0x41, 0xa4, + 0x47, 0x10, 0x0d, 0xbc, 0xba, 0xd1, 0xe7, 0xdb, 0x12, 0xcb, + 0x5f, 0x02, 0xb1, 0xa6, 0xa0, 0xd7, 0x28, 0x30, 0x3e, 0x0a, + 0x5c, 0x5f, 0xe6, 0x2f, 0x3c, 0xde, 0x46, 0x60, 0xaf, 0x07, + 0x5f, 0xed, 0x08, 0xc0, 0x06, 0x58, 0xba, 0xd7, 0x36, 0x5b, + 0xa0, 0x4a, 0xf7, 0xa1, 0x05, 0x9b, 0x00, 0xda, 0x49, 0xdc, + 0xbf, 0xea, 0xe1, 0x03, 0xda, 0x95, 0x95, 0xa0, 0xfa, 0x2e, + 0xf1, 0x60, 0x11, 0x47, 0xdd, 0xb3, 0xfb, 0x0b, 0xa2, 0x92, + 0xcf, 0x73, 0xbb, 0xce, 0x82, 0x71, 0xbc, 0xbd, 0x50, 0x64, + 0xf1, 0x96, 0x48, 0x48, 0x93, 0xf8, 0xdc, 0x1c, 0x18, 0x12, + 0xc6, 0x17, 0x6a, 0xa9, 0xc1, 0x4d, 0x6f, 0x76, 0xda, 0x2f, + 0x4e, 0x59, 0xdd, 0x8b, 0x1c, 0xa5, 0x30, 0xb6, 0xe9, 0x88, + 0x8f, 0x75, 0x0c, 0xcd, 0xd8, 0x61, 0xf4, 0x28, 0xc5, 0x9a, + 0xcd, 0x77, 0x0d, 0x36, 0x5f, 0x75, 0xa5, 0x0a, 0x77, 0x20, + 0x28, 0x5a, 0xac, 0x5f, 0xa1, 0x83, 0x67, 0x70, 0xb7, 0xd8, + 0x23, 0x48, 0x60, 0xa8, 0xd0, 0xaf, 0xee, 0x7a, 0xb8, 0x25, + 0xd7, 0x8f, 0x82, 0x8c, 0xd0, 0x81, 0x7a, 0x49, 0x69, 0xe4, + 0x22, 0x73, 0x29, 0x48, 0xc8, 0x09, 0x72, 0x16, 0xf8, 0x3d, + 0xff, 0x13, 0xac, 0x98, 0x03, 0x76, 0x33, 0xcb, 0x19, 0xb0, + 0x22, 0x5b, 0x1e, 0x16, 0x29, 0xb9, 0xcc, 0xa6, 0x92, 0xd8, + 0xed, 0x93, 0x0f, 0xbd, 0x10, 0x98, 0x53, 0x0a, 0x07, 0x7f, + 0xd6, 0x51, 0x76, 0xda, 0xdc, 0x0c, 0xeb, 0x2a, 0x95, 0xd0, + 0x3e, 0xa6, 0xc4, 0xc6, 0xd8, 0xfb, 0x1b, 0x2a, 0x7f, 0xf1, + 0x08, 0xbe, 0xd3, 0xed, 0x67, 0x63, 0x5f, 0x1d, 0x29, 0xdb, + 0x47, 0x03, 0x4a, 0xf4, 0x6b, 0xb4, 0x46, 0x02, 0x28, 0x4f, + 0x88, 0x9b, 0x46, 0x66, 0x40, 0x56, 0x34, 0x4c, 0xec, 0x8e, + 0x0b, 0x5d, 0x14, 0x94, 0x91, 0xfc, 0xdc, 0x0c, 0xdc, 0x5b, + 0x45, 0x12, 0x7e, 0xa1, 0xe9, 0x75, 0x38, 0xcb, 0xd3, 0x6b, + 0xd7, 0xa4, 0x24, 0x94, 0x78, 0x09, 0x7f, 0x77, 0xc8, 0x6d, + 0xe1, 0x82, 0x1c, 0x1c, 0x91, 0xc6, 0x38, 0x9e, 0x3b, 0x3d, + 0x31, 0xdd, 0x9e, 0x46, 0x58, 0x7a, 0x42, 0x16, 0x6f, 0xfd, + 0x7d, 0x8c, 0xf5, 0xf0, 0x9f, 0x92, 0x6e, 0xbe, 0x47, 0xa6, + 0x1e, 0x8e, 0x82, 0x15, 0x24, 0xc3, 0x1b, 0xb0, 0xd1, 0x68, + 0xf9, 0xd1, 0x7c, 0x60, 0x98, 0x86, 0xd9, 0x53, 0xa2, 0x38, + 0x62, 0xf4, 0x72, 0x71, 0xcb, 0xb9, 0x35, 0xef, 0xb9, 0x49, + 0x3a, 0x73, 0xb2, 0xd7, 0x0f, 0x90, 0xf5, 0x2c, 0x5b, 0xf5, + 0xfd, 0x39, 0x17, 0xf7, 0xe4, 0x69, 0x81, 0x0f, 0x6b, 0xe7, + 0x32, 0xd2, 0xdc, 0x5d, 0x40, 0xbf, 0x41, 0x95, 0x89, 0x81, + 0x29, 0x80, 0x40, 0xa3, 0xac, 0xd2, 0xc7, 0xf7, 0xe8, 0xd0, + 0x45, 0xed, 0x48, 0x43, 0x3a, 0xed, 0x8d, 0xef, 0x37, 0xe1, + 0x24, 0x9a, 0x67, 0x9a, 0x6b, 0x71, 0x4f, 0x9a, 0xb9, 0x2c, + 0x1b, 0x10, 0x48, 0xe2, 0x31, 0x1e, 0xbb, 0xf2, 0x4a, 0xad, + 0x04, 0xc7, 0xd7, 0xf2, 0xe8, 0x83, 0x5f, 0xe8, 0xa2, 0x81, + 0x95, 0xf9, 0x60, 0x51, 0x9c, 0x99, 0x76, 0x69, 0x76, 0x4e, + 0xbd, 0x44, 0x52, 0x36, 0xca, 0xd8, 0x6e, 0xf7, 0x1a, 0xa1, + 0x54, 0xdf, 0x90, 0x52, 0x94, 0xb6, 0x3a, 0xcb, 0x43, 0x56, + 0x11, 0xde, 0xa0, 0xe1, 0x45, 0x8a, 0x80, 0x2d, 0xaf, 0x1f, + 0x24, 0x3f, 0x80, 0x17, 0x1f, 0x28, 0xbb, 0xcc, 0x1a, 0xd2, + 0x2d, 0xa6, 0x9e, 0xe0, 0xdc, 0xf0, 0x98, 0x16, 0x58, 0x88, + 0xc6, 0xf1, 0x81, 0x71, 0x91, 0x8f, 0xa2, 0xab, 0xa5, 0xe6, + 0x68, 0x1f, 0xa5, 0x86, 0xb5, 0xd9, 0x05, 0xba, 0x50, 0x67, + 0x0b, 0x1e, 0xfe, 0x42, 0x50, 0xf8, 0x01, 0xf8, 0x38, 0x92, + 0x57, 0x86, 0x08, 0x47, 0xee, 0x23, 0x11, 0x60, 0x61, 0x1a, + 0x77, 0x3c, 0x1a, 0x8e, 0x08, 0xe3, 0xaf, 0x84, 0x04, 0x75, + 0x15, 0x47, 0x7a, 0x83, 0x8e, 0x92, 0x3e, 0xe8, 0xf0, 0xc2, + 0x81, 0x89, 0x3b, 0x73, 0x81, 0xe5, 0xe8, 0x97, 0x97, 0x63, + 0x64, 0xf3, 0xa9, 0x1b, 0x61, 0x65, 0x7f, 0x0e, 0x47, 0x6b, + 0x14, 0x57, 0x29, 0x8f, 0x91, 0x35, 0x43, 0x10, 0x12, 0x86, + 0x99, 0xec, 0xc8, 0x9e, 0x67, 0x90, 0x20, 0x21, 0x3c, 0x83, + 0xdb, 0x73, 0x4e, 0x8e, 0x7d, 0x86, 0xde, 0xb8, 0xd8, 0xfa, + 0x23, 0x1f, 0x5a, 0xe4, 0xc7, 0x0c, 0x1d, 0x5e, 0xd1, 0x10, + 0x58, 0xd5, 0x86, 0xfa, 0x40, 0x30, 0x0a, 0x78, 0x0a, 0xa5, + 0x56, 0xd5, 0xe6, 0x86, 0xd4, 0x14, 0x77, 0x32, 0xcd, 0x07, + 0xf9, 0xbe, 0x7a, 0xd8, 0xbc, 0x91, 0xe0, 0xda, 0x76, 0x6b, + 0x97, 0x10, 0xda, 0xea, 0x27, 0xa2, 0x67, 0x6d, 0x94, 0x27, + 0x6e, 0xea, 0xca, 0x56, 0x45, 0x32, 0x1d, 0x38, 0x12, 0x21, + 0x33, 0x2c, 0x3c, 0x5c, 0x33, 0xb0, 0x9e, 0x80, 0x0b, 0x4e, + 0xbb, 0x09, 0x5e, 0x56, 0x54, 0xb0, 0x9b, 0x7e, 0xb6, 0x00, + 0xe8, 0x63, 0x19, 0x85, 0xf1, 0x4d, 0x65, 0x9d, 0x1f, 0x8d, + 0x18, 0xcc, 0x63, 0xc6, 0xd9, 0xa6, 0xbc, 0xe7, 0x42, 0x55, + 0x12, 0xdc, 0x8c, 0x26, 0x2d, 0x8d, 0xc2, 0xe9, 0x3b, 0xbc, + 0xed, 0x06, 0x08, 0x31, 0xb0, 0xe0, 0x99, 0xe2, 0x86, 0x81, + 0x88, 0x4a, 0xac, 0x1f, 0x4a, 0xb2, 0x1e, 0x1e, 0x4c, 0xb2, + 0x9f, 0x27, 0xa0, 0xd9, 0x8a, 0x7e, 0xe7, 0xa3, 0xad, 0xeb, + 0x2c, 0xfd, 0x14, 0xc6, 0x4b, 0x26, 0xce, 0x38, 0xb9, 0x01, + 0x9e, 0xde, 0xc8, 0x7b, 0x82, 0x2f, 0xaa, 0x72, 0x80, 0xbe, + 0x3a, 0x35, 0x95, 0xc8, 0xf3, 0x7c, 0x36, 0x68, 0x02, 0xdc, + 0xa2, 0xda, 0xef, 0xd7, 0xf1, 0x3e, 0x81, 0xb3, 0x5d, 0x2f, + 0xcf, 0x7e, 0xe6, 0x9c, 0xa0, 0x32, 0x29, 0x8b, 0x52, 0x24, + 0xbd, 0x0d, 0x36, 0xdc, 0x1d, 0xcc, 0x6a, 0x0a, 0x74, 0x52, + 0x1b, 0x68, 0x4d, 0x15, 0x05, 0x47, 0xe1, 0x2f, 0x97, 0x45, + 0x52, 0x17, 0x4b, 0x2a, 0x3b, 0x74, 0xc5, 0x20, 0x35, 0x5c, + 0x37, 0xae, 0xe6, 0xa7, 0x24, 0x0f, 0x34, 0x70, 0xea, 0x7c, + 0x03, 0xa3, 0xde, 0x2d, 0x22, 0x55, 0x88, 0x01, 0x45, 0xf2, + 0x5f, 0x1f, 0xaf, 0x3b, 0xb1, 0xa6, 0x5d, 0xcd, 0x93, 0xfb, + 0xf8, 0x2f, 0x87, 0xcc, 0x26, 0xc5, 0x36, 0xde, 0x06, 0x9b, + 0xe9, 0xa7, 0x66, 0x7e, 0x8c, 0xcd, 0x99, 0x6b, 0x51, 0x1c, + 0xb0, 0xa0, 0xfa, 0xc7, 0x46, 0xfe, 0x65, 0xe4, 0x80, 0x5b, + 0x5f, 0x24, 0x3b, 0xa4, 0xe6, 0x81, 0x31, 0xe5, 0x87, 0x2c, + 0xa4, 0x83, 0xaf, 0x8b, 0x9f, 0x89, 0xb4, 0x3c, 0x7a, 0xbe, + 0x4c, 0xb3, 0xbf, 0x3d, 0xec, 0x78, 0xb0, 0x8a, 0xdd, 0xc8, + 0x43, 0x8c, 0x45, 0xa1, 0xa3, 0x3a, 0x82, 0x7d, 0x06, 0xdf, + 0x20, 0x27, 0x9b, 0x4e, 0x09, 0x90, 0x6a, 0x23, 0xbf, 0x1b, + 0x04, 0x1d, 0x50, 0xe2, 0xb4, 0xff, 0xe0, 0xd0, 0x9b, 0x40, + 0x2b, 0xc0, 0x52, 0xc1, 0x39, 0x29, 0x60, 0x83, 0x06, 0x9b, + 0x48, 0xb8, 0xa7, 0xe1, 0x2b, 0xfb, 0xf0, 0x2b, 0x82, 0xf1, + 0xda, 0xc9, 0x30, 0x47, 0x3f, 0xf5, 0xf9, 0xf7, 0x6c, 0xf0, + 0x0f, 0xe7, 0xb1, 0x4d, 0x46, 0x49, 0xf8, 0xb3, 0xe1, 0xfe, + 0x85, 0x61, 0xcc, 0xf7, 0xfa, 0xd2, 0xf1, 0xbc, 0xf0, 0x7f, + 0x3b, 0xe6, 0x45, 0xa2, 0x1b, 0x55, 0xf6, 0x0c, 0x02, 0x95, + 0xdc, 0x78, 0x94, 0xa0, 0xc4, 0x6a, 0x21, 0x7e, 0xa8, 0x5f, + 0xbd, 0xc3, 0xb3, 0x4d, 0x9b, 0x30, 0x31, 0x1d, 0x5b, 0x8b, + 0x45, 0x3c, 0x18, 0xe9, 0x61, 0xe8, 0x76, 0x3e, 0x91, 0xd2, + 0xfd, 0x1a, 0xd7, 0x30, 0x4d, 0xfe, 0xef, 0x7f, 0xc0, 0x7e, + 0x45, 0x43, 0xe9, 0xf9, 0x23, 0xfe, 0xd8, 0xef, 0xbc, 0xd6, + 0x99, 0x79, 0x54, 0xed, 0x7a, 0x8b, 0x39, 0xa6, 0xe7, 0x9d, + 0x3f, 0x9f, 0x35, 0xe1, 0xe4, 0xd5, 0x26, 0x31, 0x3a, 0x44, + 0x03, 0x79, 0xde, 0xdc, 0x29, 0x1e, 0x8e, 0x26, 0x41, 0xc6, + 0x60, 0xaa, 0xfd, 0xe1, 0x5e, 0xa6, 0xc0, 0x2f, 0x90, 0x1e, + 0x3b, 0xc1, 0xe6, 0xf6, 0xde, 0x60, 0x87, 0x57, 0x51, 0x11, + 0x6a, 0x8e, 0x9d, 0x70, 0x9d, 0x6d, 0x36, 0x21, 0x05, 0x55, + 0xc1, 0x56, 0x9b, 0xc9, 0x91, 0x50, 0x3e, 0xb4, 0xbd, 0x19, + 0x53, 0x44, 0x99, 0xc7, 0xb8, 0xce, 0xce, 0x86, 0x06, 0x5d, + 0x99, 0x85, 0x33, 0xd4, 0x16, 0x21, 0x4a, 0xe9, 0x7e, 0x2e, + 0xcc, 0x7e, 0x3f, 0xc1, 0x47, 0x3b, 0x32, 0xd0, 0x57, 0x1c, + 0xc2, 0x26, 0x67, 0xf0, 0xd9, 0xc4, 0x9e, 0xbb, 0x65, 0xa4, + 0xf7, 0xf7, 0x8d, 0x7d, 0x08, 0xd4, 0x9c, 0x1e, 0x0f, 0xb9, + 0xff, 0x24, 0x2f, 0xaf, 0xfa, 0x24, 0x26, 0xb7, 0xb1, 0x78, + 0xc1, 0xd1, 0xfe, 0x85, 0x55, 0xa0, 0x86, 0x77, 0xf6, 0xc2, + 0xe0, 0x12, 0xe4, 0x45, 0x85, 0xd0, 0xe7, 0x68, 0xf0, 0x31, + 0x4c, 0x9c, 0xb0, 0x5f, 0x89, 0xca, 0xfe, 0xc2, 0xf0, 0x1e, + 0xeb, 0xee, 0x75, 0x64, 0xea, 0x09, 0xd4, 0x1c, 0x72, 0x12, + 0xd4, 0x31, 0xf0, 0x89, 0x71, 0x74, 0x6e, 0x01, 0x32, 0xca, + 0x8a, 0x91, 0x0c, 0xdf, 0xd7, 0x05, 0xe9, 0x35, 0xed, 0x06, + 0x1a, 0x17, 0x5a, 0xf3, 0x65, 0xc5, 0xbd, 0x37, 0xf2, 0x53, + 0x49, 0x2f, 0xcd, 0xc6, 0x15, 0xb3, 0x36, 0x88, 0xd8, 0x7a, + 0x2f, 0xfa, 0x21, 0x7f, 0x55, 0x20, 0xc6, 0xf4, 0x23, 0x59, + 0x6b, 0x3c, 0xeb, 0xe5, 0xd3, 0x78, 0xdc, 0x31, 0xeb, 0x87, + 0x86, 0x3d, 0x7c, 0x10, 0x64, 0x66, 0xa4, 0xad, 0x07, 0xe1, + 0x93, 0x15, 0x07, 0x4c, 0xe4, 0xb4, 0x4a, 0x06, 0xca, 0x2a, + 0x50, 0xa2, 0x85, 0xc6, 0xa1, 0x19, 0x89, 0x7f, 0x8a, 0x05, + 0x00, 0x23, 0x72, 0x5f, 0x89, 0x74, 0x8e, 0x22, 0xa1, 0x5d, + 0x26, 0xf9, 0xfe, 0xdf, 0x6d, 0x98, 0x3a, 0xc4, 0x7c, 0x93, + 0xcf, 0xc4, 0xfe, 0xed, 0x98, 0xb0, 0x31, 0x4c, 0x81, 0x83, + 0x0d, 0x5d, 0x3d, 0x0c, 0x27, 0x4e, 0xca, 0xcf, 0x38, 0x0c, + 0x37, 0xb0, 0xf8, 0xc5, 0xc8, 0x52, 0x14, 0xec, 0x53, 0x80, + 0xb9, 0xd8, 0x8a, 0x05, 0x4e, 0x31, 0x3d, 0x67, 0x57, 0xf0, + 0x7a, 0xa2, 0xc5, 0xc9, 0x02, 0x25, 0x69, 0x83, 0xb9, 0x3e, + 0x1b, 0x04, 0xbf, 0xb2, 0xe6, 0x97, 0x7a, 0x6b, 0x8e, 0x37, + 0x77, 0x2e, 0x16, 0x8b, 0x33, 0xe1, 0xea, 0x2b, 0x30, 0x01, + 0x6e, 0xa0, 0x28, 0x14, 0x17, 0xe9, 0x98, 0xa8, 0x89, 0x72, + 0x68, 0x64, 0x81, 0x60, 0xa8, 0xf7, 0x72, 0xdf, 0x1a, 0xae, + 0xf5, 0xf0, 0x9f, 0x69, 0x35, 0xbc, 0x58, 0x27, 0x38, 0xd6, + 0x7f, 0x7a, 0xd4, 0xc4, 0xf1, 0xcf, 0xee, 0x59, 0x49, 0x31, + 0xda, 0xc1, 0x08, 0x46, 0x65, 0x68, 0xe9, 0x44, 0x18, 0x2b, + 0xf2, 0x2a, 0x13, 0x60, 0x07, 0xae, 0xe4, 0x96, 0xdb, 0x0a, + 0x6f, 0x52, 0x23, 0x9a, 0xcf, 0x9d, 0xa4, 0xc5, 0xc1, 0x74, + 0xa8, 0x0e, 0xe1, 0x5e, 0xfa, 0xa4, 0x06, 0x9c, 0x2e, 0x70, + 0x08, 0x22, 0x25, 0x4f, 0xc1, 0xf1, 0x13, 0x5a, 0x66, 0xa0, + 0x6c, 0x59, 0xa3, 0xfc, 0x03, 0x9c, 0x8a, 0x23, 0x01, 0x00, + 0xa9, 0x49, 0xf0, 0x22, 0xa3, 0x8f, 0x6c, 0xef, 0xcb, 0x69, + 0x06, 0x3a, 0x69, 0x99, 0x96, 0xd2, 0xa7, 0xa0, 0x0b, 0x7e, + 0x44, 0x7d, 0x04, 0xff, 0x7e, 0x9e, 0x1e, 0x77, 0xa0, 0x30, + 0xd1, 0xdf, 0x18, 0xe4, 0xd8, 0xa5, 0x64, 0xbe, 0x8c, 0x80, + 0x28, 0xe2, 0x98, 0x5e, 0xec, 0x9e, 0xb1, 0x0a, 0xb5, 0x25, + 0xaa, 0xb8, 0x0f, 0x78, 0x30, 0x48, 0x06, 0xe5, 0x76, 0xf9, + 0x24, 0x96, 0x87, 0x2a, 0x91, 0x89, 0xb6, 0xce, 0x04, 0xdf, + 0xfc, 0x13, 0x42, 0x19, 0xba, 0x14, 0x46, 0x20, 0x08, 0x47, + 0xe1, 0x82, 0x57, 0x51, 0x74, 0x3b, 0x5b, 0x23, 0x5c, 0xb2, + 0x85, 0x8c, 0xed, 0xe6, 0xda, 0x4d, 0x56, 0xe8, 0x61, 0x31, + 0xec, 0x97, 0x27, 0xeb, 0xf2, 0xa7, 0x7c, 0x13, 0x1b, 0xc5, + 0x44, 0xfe, 0x63, 0x4b, 0x2b, 0x33, 0x22, 0x23, 0x60, 0x86, + 0x7c, 0x3b, 0x57, 0xba, 0x16, 0xde, 0x47, 0x04, 0x3e, 0x2b, + 0xe5, 0xbd, 0x23, 0xa0, 0xab, 0xdf, 0x5d, 0x6e, 0x20, 0xb1, + 0x37, 0x44, 0xcb, 0xbd, 0x03, 0xa9, 0x5c, 0xe6, 0x92, 0x5e, + 0x2f, 0x6f, 0x95, 0xc6, 0x5b, 0x6d, 0xab, 0x39, 0xdd, 0x1e, + 0x34, 0xd5, 0x21, 0xca, 0x92, 0xee, 0x59, 0xf0, 0xb9, 0x65, + 0xe6, 0x81, 0x49, 0xf8, 0x11, 0xec, 0x45, 0x14, 0x6a, 0x19, + 0xb4, 0xce, 0xbf, 0x9e, 0xf7, 0x32, 0x8d, 0x99, 0x78, 0xc3, + 0x07, 0x3d, 0xfd, 0x18, 0x2d, 0x0e, 0x06, 0x2f, 0x27, 0x24, + 0x6f, 0x16, 0xd8, 0x01, 0x33, 0xc8, 0xbb, 0x7f, 0x7d, 0xfa, + 0x73, 0xf6, 0x7d, 0x54, 0xf2, 0xd4, 0x8a, 0x53, 0xe1, 0x62, + 0x45, 0xf4, 0x01, 0xa6, 0x31, 0x6b, 0x3a, 0x06, 0x56, 0xfd, + 0x79, 0x7f, 0x58, 0xd8, 0x47, 0x33, 0x53, 0xc5, 0x78, 0x70, + 0xce, 0x81, 0x7f, 0x66, 0xa1, 0x58, 0x7c, 0x5a, 0xdb, 0x4a, + 0xad, 0x29, 0xff, 0x93, 0x75, 0x95, 0x35, 0xa9, 0xd2, 0xb1, + 0xeb, 0xa0, 0x4f, 0x10, 0x0a, 0xc9, 0x38, 0x69, 0xc8, 0x8d, + 0x57, 0xef, 0x99, 0x0f, 0xa5, 0x69, 0x86, 0xa6, 0xfb, 0x2b, + 0x37, 0xe4, 0xc7, 0xab, 0x3e, 0xcd, 0x8f, 0x3f, 0x93, 0x8c, + 0x0b, 0xc4, 0x4d, 0x16, 0xe0, 0xb0, 0x94, 0x5a, 0x0d, 0x17, + 0xaf, 0x6e, 0x4b, 0x2e, 0x18, 0x29, 0x0e, 0xe0, 0xf5, 0x72, + 0x1a, 0x21, 0x37, 0xef, 0x7d, 0x6a, 0x39, 0xe9, 0xa8, 0xd7, + 0x96, 0xd6, 0xb3, 0x7d, 0x83, 0x0c, 0x13, 0x30, 0x49, 0x03, + 0xe8, 0x6b, 0xe6, 0x77, 0xe8, 0x69, 0x48, 0x56, 0x5f, 0x39, + 0x63, 0xbc, 0x86, 0xa8, 0x26, 0xa1, 0xbd, 0x4b, 0x24, 0xbd, + 0xdd, 0xe8, 0x02, 0x64, 0xcb, 0xae, 0x24, 0x17, 0x62, 0xbd, + 0x27, 0xa7, 0x22, 0x60, 0x51, 0x0c, 0x53, 0xff, 0x9d, 0x63, + 0x1b, 0xf9, 0xff, 0x76, 0x3b, 0x74, 0x05, 0x98, 0x46, 0x0b, + 0xe8, 0xcb, 0xd4, 0x0a, 0xcd, 0x91, 0xdb, 0x5b, 0x21, 0x4d, + 0xa1, 0x87, 0xbd, 0xb7, 0x58, 0xec, 0x28, 0x00, 0x92, 0xc2, + 0x98, 0xe4, 0x8c, 0x1f, 0x9d, 0xa4, 0x80, 0x83, 0x40, 0xb9, + 0x63, 0xfe, 0xc9, 0x18, 0x3f, 0xd6, 0xab, 0x34, 0x00, 0x2c, + 0x53, 0x40, 0x38, 0x0e, 0xb1, 0x69, 0xa8, 0xb8, 0xa9, 0x2e, + 0x9b, 0x7b, 0x89, 0x8d, 0xff, 0x86, 0x01, 0x51, 0x42, 0xde, + 0x04, 0xd6, 0x1d, 0xd1, 0x29, 0x8d, 0x42, 0x46, 0x5f, 0xd6, + 0x02, 0xde, 0x73, 0xee, 0x2d, 0xe9, 0x6e, 0xb0, 0x3f, 0xf0, + 0x47, 0x72, 0xfe, 0x45, 0xff, 0x05, 0x82, 0x2d, 0xc6, 0x4f, + 0xc9, 0xd3, 0xec, 0xf9, 0x5a, 0x22, 0x50, 0x6c, 0x4f, 0x1e, + 0xc8, 0x5f, 0xfc, 0x2c, 0x04, 0x4f, 0xdf, 0xce, 0xe4, 0x18, + 0xd2, 0xd7, 0x8b, 0x67, 0x83, 0x39, 0x96, 0x47, 0x5e, 0x5b, + 0xad, 0x7f, 0x5d, 0x42, 0x56, 0x97, 0x71, 0x39, 0x28, 0x44, + 0x9d, 0x35, 0xde, 0xde, 0x03, 0x20, 0x34, 0x44, 0xdb, 0xdf, + 0xfc, 0xff, 0x1e, 0x3d, 0x58, 0x5f, 0x7a, 0x8e, 0x90, 0xa1, + 0xd3, 0xeb, 0x0c, 0x23, 0x3f, 0x4e, 0x61, 0x77, 0x79, 0xb2, + 0xdc, 0xfb, 0x21, 0x46, 0x5c, 0x82, 0xb6, 0xf6, 0x34, 0x3c, + 0x3f, 0x45, 0x4b, 0x80, 0x9e, 0xa4, 0xe6, 0x02, 0x13, 0x38, + 0x40, 0x7e, 0x87, 0x92, 0x96, 0x51, 0x63, 0x87, 0xae, 0xc8, + 0x02, 0x6a, 0x70, 0xc8, 0xcd, 0xd0, 0xe2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x12, 0x1c, 0x22, 0x2b, 0x33, 0x38, 0x3f, +}; +static const int sizeof_bench_dilithium_level5_sig = + sizeof(bench_dilithium_level5_sig); +#endif + +#endif /* !WOLFSSL_DILITHIUM_NO_VERIFY */ + + void bench_dilithiumKeySign(byte level) { int ret = 0; dilithium_key key; double start; int i, count; +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) byte sig[DILITHIUM_MAX_SIG_SIZE]; byte msg[512]; word32 x = 0; +#endif const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() + byte params = 0; + + if (level == 2) { + params = 44; + } + else if (level == 3) { + params = 65; + } + else if (level == 5) { + params = 87; + } + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + /* make dummy msg */ + for (i = 0; i < (int)sizeof(msg); i++) { + msg[i] = (byte)i; + } +#endif ret = wc_dilithium_init(&key); if (ret != 0) { @@ -8704,59 +13684,144 @@ printf("wc_dilithium_set_level() failed %d\n", ret); } - if (ret == 0) { - ret = -1; - if (level == 2) { - ret = wc_dilithium_import_private_key(bench_dilithium_level2_key, - sizeof_bench_dilithium_level2_key, NULL, 0, &key); - } - else if (level == 3) { - ret = wc_dilithium_import_private_key(bench_dilithium_level3_key, - sizeof_bench_dilithium_level3_key, NULL, 0, &key); - } - else if (level == 5) { - ret = wc_dilithium_import_private_key(bench_dilithium_level5_key, - sizeof_bench_dilithium_level5_key, NULL, 0, &key); +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY + bench_stats_start(&count, &start); + do { + for (i = 0; i < agreeTimes; i++) { + ret = wc_dilithium_make_key(&key, GLOBAL_RNG); + if (ret != 0) { + printf("wc_dilithium_import_private_key failed %d\n", ret); + return; + } } + count += i; + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); - if (ret != 0) { - printf("wc_dilithium_import_private_key failed %d\n", ret); - } + if (ret == 0) { + bench_stats_asym_finish("ML-DSA", params, desc[2], 0, count, + start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif } - /* make dummy msg */ - for (i = 0; i < (int)sizeof(msg); i++) { - msg[i] = (byte)i; +#elif !defined WOLFSSL_DILITHIUM_NO_SIGN + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (level == 2) { + ret = wc_dilithium_import_private(bench_dilithium_level2_key, + sizeof_bench_dilithium_level2_key, &key); + } +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + if (level == 3) { + ret = wc_dilithium_import_private(bench_dilithium_level3_key, + sizeof_bench_dilithium_level3_key, &key); } +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 + if (level == 5) { + ret = wc_dilithium_import_private(bench_dilithium_level5_key, + sizeof_bench_dilithium_level5_key, &key); + } +#endif + if (ret != 0) { + printf("Failed to load private key\n"); + return; + } + +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + if (level == 2) { + x = DILITHIUM_LEVEL2_SIG_SIZE; + } + else if (level == 3) { + x = DILITHIUM_LEVEL3_SIG_SIZE; + } + else { + x = DILITHIUM_LEVEL5_SIG_SIZE; + } + + RESET_MULTI_VALUE_STATS_VARS(); bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { if (ret == 0) { - if (level == 2) { - x = DILITHIUM_LEVEL2_SIG_SIZE; - } - else if (level == 3) { - x = DILITHIUM_LEVEL3_SIG_SIZE; - } - else { - x = DILITHIUM_LEVEL5_SIG_SIZE; - } - - ret = wc_dilithium_sign_msg(msg, sizeof(msg), sig, &x, &key); + ret = wc_dilithium_sign_msg(msg, sizeof(msg), sig, &x, &key, + GLOBAL_RNG); if (ret != 0) { printf("wc_dilithium_sign_msg failed\n"); } } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); if (ret == 0) { - bench_stats_asym_finish("DILITHIUM", level, desc[4], 0, count, start, + bench_stats_asym_finish("ML-DSA", params, desc[4], 0, count, start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif + } + +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + (defined(WOLFSSL_DILITHIUM_NO_SIGN) || \ + defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY)) + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (level == 2) { + #ifdef WOLFSSL_DILITHIUM_NO_SIGN + x = sizeof_bench_dilithium_level2_sig; + XMEMCPY(sig, bench_dilithium_level2_sig, x); + #endif + ret = wc_dilithium_import_public(bench_dilithium_level2_pubkey, + sizeof_bench_dilithium_level2_pubkey, &key); + } +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + if (level == 3) { + #ifdef WOLFSSL_DILITHIUM_NO_SIGN + x = sizeof_bench_dilithium_level3_sig; + XMEMCPY(sig, bench_dilithium_level3_sig, x); + #endif + ret = wc_dilithium_import_public(bench_dilithium_level3_pubkey, + sizeof_bench_dilithium_level3_pubkey, &key); + } +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 + if (level == 5) { + #ifdef WOLFSSL_DILITHIUM_NO_SIGN + x = sizeof_bench_dilithium_level5_sig; + XMEMCPY(sig, bench_dilithium_level5_sig, x); + #endif + ret = wc_dilithium_import_public(bench_dilithium_level5_pubkey, + sizeof_bench_dilithium_level5_pubkey, &key); + } +#endif + if (ret != 0) { + printf("Failed to load public key\n"); + return; } +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { @@ -8771,14 +13836,23 @@ ret = -1; } } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); if (ret == 0) { - bench_stats_asym_finish("DILITHIUM", level, desc[5], 0, count, start, + bench_stats_asym_finish("ML-DSA", params, desc[5], 0, count, start, ret); + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif } +#endif wc_dilithium_free(&key); } @@ -8795,6 +13869,7 @@ byte msg[512]; word32 x = 0; const char**desc = bench_desc_words[lng_index]; + DECLARE_MULTI_VALUE_STATS_VARS() ret = wc_sphincs_init(&key); if (ret != 0) { @@ -8870,14 +13945,19 @@ x = SPHINCS_SMALL_LEVEL5_SIG_SIZE; } - ret = wc_sphincs_sign_msg(msg, sizeof(msg), sig, &x, &key); + ret = wc_sphincs_sign_msg(msg, sizeof(msg), sig, &x, &key, GLOBAL_RNG); if (ret != 0) { printf("wc_sphincs_sign_msg failed\n"); } } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); if (ret == 0) { if (optim == FAST_VARIANT) { @@ -8888,8 +13968,13 @@ bench_stats_asym_finish("SPHINCS-SMALL", level, desc[4], 0, count, start, ret); } + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif } + RESET_MULTI_VALUE_STATS_VARS(); + bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { @@ -8904,9 +13989,14 @@ ret = -1; } } + RECORD_MULTI_VALUE_STATS(); } count += i; - } while (bench_stats_check(start)); + } while (bench_stats_check(start) +#ifdef MULTI_VALUE_STATISTICS + || runs < minimum_runs +#endif + ); if (ret == 0) { if (optim == FAST_VARIANT) { @@ -8917,12 +14007,14 @@ bench_stats_asym_finish("SPHINCS-SMALL", level, desc[5], 0, count, start, ret); } + #ifdef MULTI_VALUE_STATISTICS + bench_multi_value_stats(max, min, sum, squareSum, runs); + #endif } wc_sphincs_free(&key); } #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ #if defined(_WIN32) && !defined(INTIME_RTOS) @@ -8945,7 +14037,11 @@ QueryPerformanceCounter(&count); +#ifdef BENCH_MICROSECOND + return ((double)count.QuadPart * 1000000) / freq.QuadPart; +#else return (double)count.QuadPart / freq.QuadPart; +#endif } #elif defined MICROCHIP_PIC32 @@ -8978,26 +14074,124 @@ #elif defined(FREERTOS) - #include "task.h" + #ifdef PLATFORMIO + #include + #include + #else + #include "task.h" + #endif + #if defined(WOLFSSL_ESPIDF) /* prototype definition */ int construct_argv(); extern char* __argv[22]; -#endif + + /* current_time(reset) + * + * Benchmark passage of time, in fractional seconds. + * [reset] is non zero to adjust timer or counter to zero + * + * Use care when repeatedly calling calling. See implementation. */ double current_time(int reset) { + double ret; #if ESP_IDF_VERSION_MAJOR >= 4 - TickType_t tickCount; + TickType_t tickCount; /* typically 32 bit, local FreeRTOS ticks */ #else portTickType tickCount; #endif - (void) reset; + #if defined(__XTENSA__) + (void)reset; - /* tick count == ms, if configTICK_RATE_HZ is set to 1000 */ - tickCount = xTaskGetTickCount(); + if (reset) { + /* TODO: Determine a mechanism for reset that does not interfere + * with freeRTOS tick. Using this code for Xtensa appears to cause + * RTOS tick timer to stick. See "last_tickCount unchanged". + ESP_LOGW(TAG, "Current_time() reset!"); + portTICK_TYPE_ENTER_CRITICAL(); + { + esp_cpu_set_cycle_count((esp_cpu_cycle_count_t)0); + _esp_cpu_count_last = xthal_get_ccount(); + _esp_cpu_count_last = esp_cpu_get_cycle_count(); + } + portTICK_TYPE_EXIT_CRITICAL(); + */ + } + #else + /* Only reset the CPU counter for RISC-V */ + if (reset) { + ESP_LOGV(TAG, "current_time() reset!"); + /* TODO: why does Espressif esp_cpu_get_cycle_count() cause + * unexpected rollovers in return values for Xtensa but not RISC-V? + * See also esp_get_cycle_count_ex() */ + #ifdef __XTENSA__ + _esp_cpu_count_last = xthal_get_ccount(); + #else + esp_cpu_set_cycle_count((esp_cpu_cycle_count_t)0); + _esp_cpu_count_last = esp_cpu_get_cycle_count(); + #endif + } + #endif + + /* tick count == ms, if configTICK_RATE_HZ is set to 1000 */ + tickCount = xTaskGetTickCount(); /* RTOS ticks, not CPU cycles! + The count of ticks since vTaskStartScheduler was called, + typiclly in app_startup.c */ + + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGV(TAG, "tickCount = %d", tickCount); + if (tickCount == last_tickCount) { + ESP_LOGW(TAG, "last_tickCount unchanged? %d", tickCount); + + } + if (tickCount < last_tickCount) { + ESP_LOGW(TAG, "last_tickCount overflow?"); + } + #endif + + if (reset) { + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGW(TAG, "Assign last_tickCount = %d", tickCount); + #endif + last_tickCount = tickCount; + } + else { + #ifdef DEBUG_WOLFSSL_BENCHMARK_TIMING + ESP_LOGV(TAG, "No Reset last_tickCount = %d", tickCount); + #endif + } + + #if defined(configTICK_RATE_HZ) && defined(CONFIG_FREERTOS_HZ) + ret = (double)tickCount / configTICK_RATE_HZ; + #else + ESP_LOGW(TAG, "Warning: configTICK_RATE_HZ not defined," + "assuming 1000 Hz."); + ret = (double)(tickCount / 1000.0); + #endif /* configTICK_RATE_HZ */ + + return ret; + + } /* current_time */ +#else + /* current_time(reset) + * + * Benchmark passage of time, in fractional seconds. + * [reset] is non zero to adjust timer or counter to zero + * + * Use care when repeatedly calling calling. See implementation. */ + double current_time(int reset) + { + portTickType tickCount = xTaskGetTickCount(); + /* if configTICK_RATE_HZ is available use if (default is 1000) */ + #ifdef configTICK_RATE_HZ + return (double)tickCount / configTICK_RATE_HZ; + #else return (double)tickCount / 1000; + #endif } +#endif + #elif defined (WOLFSSL_TIRTOS) @@ -9020,6 +14214,14 @@ return (double)OSA_TimeGetMsec() / 1000; } +#elif defined(WOLFSSL_CMSIS_RTOS) || defined(WOLFSSL_CMSIS_RTOSv2) + + double current_time(int reset) + { + (void)reset; + return (double)osKernelGetTickCount() / 1000.0; + } + #elif defined(WOLFSSL_EMBOS) #include "RTOS.h" @@ -9028,7 +14230,7 @@ { double time_now; double current_s = OS_GetTime() / 1000.0; - double current_us = OS_GetTime_us() / 1000000.0; + double current_us = OS_GetTime_us() / MILLION_VALUE; time_now = (double)( current_s + current_us); (void) reset; @@ -9078,13 +14280,13 @@ double current_time(int reset) { + int64_t t; (void)reset; - #if defined(CONFIG_ARCH_POSIX) k_cpu_idle(); #endif - - return (double)k_uptime_get() / 1000; + t = k_uptime_get(); /* returns current uptime in milliseconds */ + return (double)(t / 1000); } #elif defined(WOLFSSL_NETBURNER) @@ -9155,20 +14357,20 @@ * outside wolfcrypt. */ return (double)rusage.ru_utime.tv_sec + - (double)rusage.ru_utime.tv_usec / 1000000.0; + (double)rusage.ru_utime.tv_usec / MILLION_VALUE; } static void check_for_excessive_stime(const char *desc, const char *desc_extra) { double start_utime = (double)base_rusage.ru_utime.tv_sec + - (double)base_rusage.ru_utime.tv_usec / 1000000.0; + (double)base_rusage.ru_utime.tv_usec / MILLION_VALUE; double start_stime = (double)base_rusage.ru_stime.tv_sec + - (double)base_rusage.ru_stime.tv_usec / 1000000.0; + (double)base_rusage.ru_stime.tv_usec / MILLION_VALUE; double cur_utime = (double)cur_rusage.ru_utime.tv_sec + - (double)cur_rusage.ru_utime.tv_usec / 1000000.0; + (double)cur_rusage.ru_utime.tv_usec / MILLION_VALUE; double cur_stime = (double)cur_rusage.ru_stime.tv_sec + - (double)cur_rusage.ru_stime.tv_usec / 1000000.0; + (double)cur_rusage.ru_stime.tv_usec / MILLION_VALUE; double stime_utime_ratio = (cur_stime - start_stime) / (cur_utime - start_utime); if (stime_utime_ratio > .1) @@ -9193,13 +14395,17 @@ double current_time(int reset) { - struct timeval tv; + struct timespec tv; (void)reset; - LIBCALL_CHECK_RET(gettimeofday(&tv, 0)); + LIBCALL_CHECK_RET(clock_gettime(CLOCK_REALTIME, &tv)); - return (double)tv.tv_sec + (double)tv.tv_usec / 1000000; + #ifdef BENCH_MICROSECOND + return (double)tv.tv_sec * 1000000 + (double)tv.tv_nsec / 1000; + #else + return (double)tv.tv_sec + (double)tv.tv_nsec / 1000000000; + #endif } #endif /* _WIN32 */ @@ -9207,9 +14413,12 @@ #if defined(HAVE_GET_CYCLES) #if defined(WOLFSSL_ESPIDF) - static WC_INLINE word64 get_xtensa_cycles(void) + /* Generic CPU cycle counter for either Xtensa or RISC-V */ + static WC_INLINE word64 esp_get_cpu_benchmark_cycles(void) { - return xthal_get_ccount_ex(); + /* Reminder for long duration between calls with + * multiple overflows will not be detected. */ + return esp_get_cycle_count_ex(); } /* implement other architectures here */ @@ -9279,6 +14488,7 @@ printf("benchmark\n"); printf("%s", bench_Usage_msg1[lng_index][e++]); /* option -? */ + printf("%s", bench_Usage_msg1[lng_index][e++]); /* English / Japanese */ printf("%s", bench_Usage_msg1[lng_index][e++]); /* option -csv */ printf("%s", bench_Usage_msg1[lng_index][e++]); /* option -base10 */ #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) @@ -9331,18 +14541,25 @@ print_alg(bench_digest_opt[i].str, &line); for (i=0; bench_mac_opt[i].str != NULL; i++) print_alg(bench_mac_opt[i].str, &line); + for (i=0; bench_kdf_opt[i].str != NULL; i++) + print_alg(bench_kdf_opt[i].str, &line); for (i=0; bench_asym_opt[i].str != NULL; i++) print_alg(bench_asym_opt[i].str, &line); for (i=0; bench_other_opt[i].str != NULL; i++) print_alg(bench_other_opt[i].str, &line); -#if defined(HAVE_PQC) && defined(HAVE_LIBOQS) +#if defined(WOLFSSL_HAVE_KYBER) || defined(HAVE_FALCON) || \ + defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS) for (i=0; bench_pq_asym_opt[i].str != NULL; i++) print_alg(bench_pq_asym_opt[i].str, &line); -#if defined(HAVE_LIBOQS) +#if defined(HAVE_SPHINCS) for (i=0; bench_pq_asym_opt2[i].str != NULL; i++) print_alg(bench_pq_asym_opt2[i].str, &line); -#endif /* HAVE_LIBOQS */ -#endif /* HAVE_PQC */ +#endif /* HAVE_SPHINCS */ +#endif +#if defined(BENCH_PQ_STATEFUL_HBS) + for (i=0; bench_pq_hash_sig_opt[i].str != NULL; i++) + print_alg(bench_pq_hash_sig_opt[i].str, &line); +#endif /* BENCH_PQ_STATEFUL_HBS */ printf("\n"); #endif /* !WOLFSSL_BENCHMARK_ALL */ e++; @@ -9353,7 +14570,21 @@ printf("%s", bench_Usage_msg1[lng_index][e]); /* option -threads */ #endif e++; +#ifdef WC_BENCH_TRACK_STATS printf("%s", bench_Usage_msg1[lng_index][e]); /* option -print */ +#endif + e++; +#ifndef NO_FILESYSTEM + printf("%s", bench_Usage_msg1[lng_index][e]); /* option -hash_input */ +#endif + e++; +#ifndef NO_FILESYSTEM + printf("%s", bench_Usage_msg1[lng_index][e]); /* option -cipher_input */ +#endif +#ifdef MULTI_VALUE_STATISTICS + e++; + printf("%s", bench_Usage_msg1[lng_index][e]); /* option -min_runs */ +#endif } /* Match the command line argument with the string. @@ -9391,25 +14622,18 @@ #endif { + /* Code for main() or wolf_benchmark_task() */ #ifdef WOLFSSL_ESPIDF int argc = construct_argv(); char** argv = (char**)__argv; - - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - ESP_ERROR_CHECK(gptimer_new_timer(&esp_timer_config, &esp_gptimer)); - ESP_LOGI(TAG, "Enable ESP32-C3 timer "); - ESP_ERROR_CHECK(gptimer_enable(esp_gptimer)); - ESP_ERROR_CHECK(gptimer_start(esp_gptimer)); - #endif #elif defined(MAIN_NO_ARGS) int argc = 0; char** argv = NULL; - #endif return wolfcrypt_benchmark_main(argc, argv); } -#endif /* NO_MAIN_DRIVER && NO_MAIN_FUNCTION */ +#endif /* !NO_MAIN_DRIVER && !NO_MAIN_FUNCTION */ int wolfcrypt_benchmark_main(int argc, char** argv) { @@ -9472,6 +14696,8 @@ #endif else if (string_matches(argv[1], "-dgst_full")) digest_stream = 0; + else if (string_matches(argv[1], "-enc_only")) + encrypt_only = 1; #ifndef NO_RSA else if (string_matches(argv[1], "-rsa_sign")) rsa_sign_verify = 1; @@ -9519,6 +14745,8 @@ } } } +#endif +#ifdef WC_BENCH_TRACK_STATS else if (string_matches(argv[1], "-print")) { gPrintStats = 1; } @@ -9529,6 +14757,29 @@ if (argc > 1) numBlocks = XATOI(argv[1]); } +#ifndef NO_FILESYSTEM + else if (string_matches(argv[1], "-hash_input")) { + argc--; + argv++; + if (argc > 1) + hash_input = argv[1]; + } + else if (string_matches(argv[1], "-cipher_input")) { + argc--; + argv++; + if (argc > 1) + cipher_input = argv[1]; + } +#endif +#ifdef MULTI_VALUE_STATISTICS + else if (string_matches(argv[1], "-min_runs")) { + argc--; + argv++; + if (argc > 1) { + minimum_runs = XATOI(argv[1]); + } + } +#endif else if (argv[1][0] == '-') { optMatched = 0; #ifndef WOLFSSL_BENCHMARK_ALL @@ -9557,6 +14808,14 @@ optMatched = 1; } } + /* Known KDF algorithms */ + for (i=0; !optMatched && bench_kdf_opt[i].str != NULL; i++) { + if (string_matches(argv[1], bench_kdf_opt[i].str)) { + bench_kdf_algs |= bench_kdf_opt[i].val; + bench_all = 0; + optMatched = 1; + } + } /* Known asymmetric algorithms */ for (i=0; !optMatched && bench_asym_opt[i].str != NULL; i++) { if (string_matches(argv[1], bench_asym_opt[i].str)) { @@ -9565,7 +14824,8 @@ optMatched = 1; } } - #if defined(HAVE_PQC) && defined(HAVE_LIBOQS) + #if defined(WOLFSSL_HAVE_KYBER) || defined(HAVE_FALCON) || \ + defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS) /* Known asymmetric post-quantum algorithms */ for (i=0; !optMatched && bench_pq_asym_opt[i].str != NULL; i++) { if (string_matches(argv[1], bench_pq_asym_opt[i].str)) { @@ -9574,10 +14834,13 @@ optMatched = 1; } } + #ifdef HAVE_SPHINCS /* Both bench_pq_asym_opt and bench_pq_asym_opt2 are looking for * -pq, so we need to do a special case for -pq since optMatched * was set to 1 just above. */ - if (string_matches(argv[1], bench_pq_asym_opt[0].str)) { + if ((bench_pq_asym_opt[0].str != NULL) && + string_matches(argv[1], bench_pq_asym_opt[0].str)) + { bench_pq_asym_algs2 |= bench_pq_asym_opt2[0].val; bench_all = 0; optMatched = 1; @@ -9589,7 +14852,8 @@ optMatched = 1; } } - #endif /* HAVE_PQC */ + #endif + #endif /* Other known cryptographic algorithms */ for (i=0; !optMatched && bench_other_opt[i].str != NULL; i++) { if (string_matches(argv[1], bench_other_opt[i].str)) { @@ -9598,6 +14862,17 @@ optMatched = 1; } } + + #if defined(BENCH_PQ_STATEFUL_HBS) + /* post-quantum stateful hash-based signatures */ + for (i=0; !optMatched && bench_pq_hash_sig_opt[i].str != NULL; i++) { + if (string_matches(argv[1], bench_pq_hash_sig_opt[i].str)) { + bench_pq_hash_sig_algs |= bench_pq_hash_sig_opt[i].val; + bench_all = 0; + optMatched = 1; + } + } + #endif /* BENCH_PQ_STATEFUL_HBS */ #endif if (!optMatched) { printf("Option not recognized: %s\n", argv[1]); @@ -9628,6 +14903,22 @@ else #endif { + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + if (esp_gptimer == NULL) { + ESP_ERROR_CHECK(gptimer_new_timer(&esp_timer_config, + &esp_gptimer) ); + } + ESP_ERROR_CHECK(gptimer_enable(esp_gptimer)); + ESP_ERROR_CHECK(gptimer_start(esp_gptimer)); + ESP_LOGI(TAG, "Enable %s timer", CONFIG_IDF_TARGET); + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ + } + #endif + #ifdef HAVE_STACK_SIZE ret = StackSizeCheck(NULL, benchmark_test); #else @@ -9635,6 +14926,17 @@ #endif } + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + #ifdef WOLFSSL_BENCHMARK_TIMER_DEBUG + ESP_ERROR_CHECK(gptimer_stop(esp_gptimer)); + ESP_ERROR_CHECK(gptimer_disable(esp_gptimer)); + #endif /* WOLFSSL_BENCHMARK_TIMER_DEBUG */ + } + #endif + return ret; } #endif /* !NO_MAIN_DRIVER */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.h 2024-08-03 07:30:00.000000000 +0000 @@ -51,7 +51,7 @@ void bench_chacha20_poly1305_aead(void); void bench_aescbc(int useDeviceID); void bench_aesgcm(int useDeviceID); -void bench_gmac(void); +void bench_gmac(int useDeviceID); void bench_aesccm(int useDeviceID); void bench_aesecb(int useDeviceID); void bench_aesxts(void); @@ -61,6 +61,9 @@ void bench_aessiv(void); void bench_poly1305(void); void bench_camellia(void); +void bench_sm4_cbc(void); +void bench_sm4_gcm(void); +void bench_sm4_ccm(void); void bench_md5(int useDeviceID); void bench_sha(int useDeviceID); void bench_sha224(int useDeviceID); @@ -81,6 +84,7 @@ void bench_sha3_512(int useDeviceID); void bench_shake128(int useDeviceID); void bench_shake256(int useDeviceID); +void bench_sm3(int useDeviceID); void bench_ripemd(void); void bench_cmac(int useDeviceID); void bench_scrypt(void); @@ -91,16 +95,20 @@ void bench_hmac_sha384(int useDeviceID); void bench_hmac_sha512(int useDeviceID); void bench_siphash(void); +void bench_srtpkdf(void); void bench_rsaKeyGen(int useDeviceID); void bench_rsaKeyGen_size(int useDeviceID, word32 keySz); void bench_rsa(int useDeviceID); void bench_rsa_key(int useDeviceID, word32 keySz); void bench_dh(int useDeviceID); void bench_kyber(int type); +void bench_lms(void); +void bench_xmss(int hash); void bench_ecc_curve(int curveId); void bench_eccMakeKey(int useDeviceID, int curveId); void bench_ecc(int useDeviceID, int curveId); void bench_eccEncrypt(int curveId); +void bench_sm2(int useDeviceID); void bench_curve25519KeyGen(int useDeviceID); void bench_curve25519KeyAgree(int useDeviceID); void bench_ed25519KeyGen(void); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.vcxproj mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.vcxproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.vcxproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/benchmark/benchmark.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -146,7 +146,7 @@ Console true true - MachineX86 + MachineX64
    diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -39,15 +39,13 @@ /* Tip: Locate the software cipher modes by searching for "Software AES" */ -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) - +#if FIPS_VERSION3_GE(2,0,0) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$g") - #pragma const_seg(".fipsB$g") + #pragma code_seg(".fipsA$b") + #pragma const_seg(".fipsB$b") #endif #endif @@ -76,223 +74,14 @@ #include #endif -#ifdef WOLFSSL_AES_SIV +#if defined(WOLFSSL_AES_SIV) #include -#endif +#endif /* WOLFSSL_AES_SIV */ #if defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_AES) #include #endif -/* fips wrapper calls, user can call direct */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - - int wc_AesSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, - int dir) - { - if (aes == NULL || !( (len == 16) || (len == 24) || (len == 32)) ) { - return BAD_FUNC_ARG; - } - - return AesSetKey_fips(aes, key, len, iv, dir); - } - int wc_AesSetIV(Aes* aes, const byte* iv) - { - if (aes == NULL) { - return BAD_FUNC_ARG; - } - - return AesSetIV_fips(aes, iv); - } - #ifdef HAVE_AES_CBC - int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) - { - if (aes == NULL || out == NULL || in == NULL) { - return BAD_FUNC_ARG; - } - - return AesCbcEncrypt_fips(aes, out, in, sz); - } - #ifdef HAVE_AES_DECRYPT - int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) - { - if (aes == NULL || out == NULL || in == NULL - || sz % AES_BLOCK_SIZE != 0) { - return BAD_FUNC_ARG; - } - - return AesCbcDecrypt_fips(aes, out, in, sz); - } - #endif /* HAVE_AES_DECRYPT */ - #endif /* HAVE_AES_CBC */ - - /* AES-CTR */ - #ifdef WOLFSSL_AES_COUNTER - int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) - { - if (aes == NULL || out == NULL || in == NULL) { - return BAD_FUNC_ARG; - } - - return AesCtrEncrypt(aes, out, in, sz); - } - #endif - - /* AES-DIRECT */ - #if defined(WOLFSSL_AES_DIRECT) - void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) - { - AesEncryptDirect(aes, out, in); - } - - #ifdef HAVE_AES_DECRYPT - void wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) - { - AesDecryptDirect(aes, out, in); - } - #endif /* HAVE_AES_DECRYPT */ - - int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, - const byte* iv, int dir) - { - return AesSetKeyDirect(aes, key, len, iv, dir); - } - #endif /* WOLFSSL_AES_DIRECT */ - - /* AES-GCM */ - #ifdef HAVE_AESGCM - int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) - { - if (aes == NULL || !( (len == 16) || (len == 24) || (len == 32)) ) { - return BAD_FUNC_ARG; - } - - return AesGcmSetKey_fips(aes, key, len); - } - int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) - { - if (aes == NULL || authTagSz > AES_BLOCK_SIZE || - authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ || - ivSz == 0 || ivSz > AES_BLOCK_SIZE) { - return BAD_FUNC_ARG; - } - - return AesGcmEncrypt_fips(aes, out, in, sz, iv, ivSz, authTag, - authTagSz, authIn, authInSz); - } - - #ifdef HAVE_AES_DECRYPT - int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) - { - if (aes == NULL || out == NULL || in == NULL || iv == NULL - || authTag == NULL || authTagSz > AES_BLOCK_SIZE || - ivSz == 0 || ivSz > AES_BLOCK_SIZE) { - return BAD_FUNC_ARG; - } - - return AesGcmDecrypt_fips(aes, out, in, sz, iv, ivSz, authTag, - authTagSz, authIn, authInSz); - } - #endif /* HAVE_AES_DECRYPT */ - - int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) - { - if (gmac == NULL || key == NULL || !((len == 16) || - (len == 24) || (len == 32)) ) { - return BAD_FUNC_ARG; - } - - return GmacSetKey(gmac, key, len); - } - int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, - const byte* authIn, word32 authInSz, - byte* authTag, word32 authTagSz) - { - if (gmac == NULL || authTagSz > AES_BLOCK_SIZE || - authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ) { - return BAD_FUNC_ARG; - } - - return GmacUpdate(gmac, iv, ivSz, authIn, authInSz, - authTag, authTagSz); - } - #endif /* HAVE_AESGCM */ - - /* AES-CCM */ - #if defined(HAVE_AESCCM) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) - int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) - { - return AesCcmSetKey(aes, key, keySz); - } - int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) - { - /* sanity check on arguments */ - if (aes == NULL || out == NULL || in == NULL || nonce == NULL - || authTag == NULL || nonceSz < 7 || nonceSz > 13) - return BAD_FUNC_ARG; - - AesCcmEncrypt(aes, out, in, inSz, nonce, nonceSz, authTag, - authTagSz, authIn, authInSz); - return 0; - } - - #ifdef HAVE_AES_DECRYPT - int wc_AesCcmDecrypt(Aes* aes, byte* out, - const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) - { - - if (aes == NULL || out == NULL || in == NULL || nonce == NULL - || authTag == NULL || nonceSz < 7 || nonceSz > 13) { - return BAD_FUNC_ARG; - } - - return AesCcmDecrypt(aes, out, in, inSz, nonce, nonceSz, - authTag, authTagSz, authIn, authInSz); - } - #endif /* HAVE_AES_DECRYPT */ - #endif /* HAVE_AESCCM && HAVE_FIPS_VERSION 2 */ - - int wc_AesInit(Aes* aes, void* h, int i) - { - if (aes == NULL) - return BAD_FUNC_ARG; - - (void)h; - (void)i; - - /* FIPS doesn't support */ - #ifdef WOLFSSL_KCAPI_AES - return AesInit(aes, h, i); - #else - return 0; - #endif - } - void wc_AesFree(Aes* aes) - { - (void)aes; - /* FIPS doesn't support */ - #ifdef WOLFSSL_KCAPI_AES - AesFree(aes); - #endif - } - -#else /* else build without fips, or for FIPS v2+ */ - - #if defined(WOLFSSL_TI_CRYPT) #include #else @@ -306,7 +95,7 @@ #include #endif -#ifndef WOLFSSL_ARMASM +#if !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_RISCV_ASM) #ifdef WOLFSSL_IMX6_CAAM_BLOB /* case of possibly not using hardware acceleration for AES but using key @@ -323,6 +112,14 @@ #pragma warning(disable: 4127) #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_aes_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000002 }; + int wolfCrypt_FIPS_AES_sanity(void) + { + return 0; + } +#endif /* Define AES implementation includes and functions */ #if defined(STM32_CRYPTO) @@ -341,6 +138,12 @@ CRYP_KeyInitTypeDef keyInit; #endif +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + #ifdef WOLFSSL_STM32_CUBEMX ret = wc_Stm32_Aes_Init(aes, &hcryp); if (ret != 0) @@ -417,6 +220,7 @@ CRYP_Cmd(DISABLE); #endif /* WOLFSSL_STM32_CUBEMX */ wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); return ret; } @@ -435,6 +239,12 @@ CRYP_KeyInitTypeDef keyInit; #endif +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + #ifdef WOLFSSL_STM32_CUBEMX ret = wc_Stm32_Aes_Init(aes, &hcryp); if (ret != 0) @@ -520,6 +330,7 @@ CRYP_Cmd(DISABLE); #endif /* WOLFSSL_STM32_CUBEMX */ wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); return ret; } @@ -550,6 +361,12 @@ if (ret != 0) return ret; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + if (wolfSSL_CryptHwMutexLock() == 0) { LTC_AES_EncryptEcb(LTC_BASE, inBlock, outBlock, AES_BLOCK_SIZE, key, keySize); @@ -567,6 +384,12 @@ if (ret != 0) return ret; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + if (wolfSSL_CryptHwMutexLock() == 0) { LTC_AES_DecryptEcb(LTC_BASE, inBlock, outBlock, AES_BLOCK_SIZE, key, keySize, kLTC_EncryptKey); @@ -591,6 +414,14 @@ static WARN_UNUSED_RESULT int wc_AesEncrypt( Aes* aes, const byte* inBlock, byte* outBlock) { +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + if (wolfSSL_CryptHwMutexLock() == 0) { #ifdef FREESCALE_MMCAU_CLASSIC if ((wc_ptr_t)outBlock % WOLFSSL_MMCAU_ALIGNMENT) { @@ -610,6 +441,13 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt( Aes* aes, const byte* inBlock, byte* outBlock) { +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif if (wolfSSL_CryptHwMutexLock() == 0) { #ifdef FREESCALE_MMCAU_CLASSIC if ((wc_ptr_t)outBlock % WOLFSSL_MMCAU_ALIGNMENT) { @@ -635,6 +473,13 @@ static WARN_UNUSED_RESULT int wc_AesEncrypt( Aes* aes, const byte* inBlock, byte* outBlock) { +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif /* Thread mutex protection handled in Pic32Crypto */ return wc_Pic32AesCrypt(aes->key, aes->keylen, NULL, 0, outBlock, inBlock, AES_BLOCK_SIZE, @@ -646,6 +491,13 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt( Aes* aes, const byte* inBlock, byte* outBlock) { +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif /* Thread mutex protection handled in Pic32Crypto */ return wc_Pic32AesCrypt(aes->key, aes->keylen, NULL, 0, outBlock, inBlock, AES_BLOCK_SIZE, @@ -661,6 +513,13 @@ Aes* aes, const byte* inBlock, byte* outBlock) { int ret; + +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + ret = wolfSSL_CryptHwMutexLock(); if (ret == 0) { ret = nrf51_aes_encrypt(inBlock, (byte*)aes->key, aes->rounds, @@ -674,26 +533,71 @@ #error nRF51 AES Hardware does not support decrypt #endif /* HAVE_AES_DECRYPT */ -#elif defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES) - - #include "wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h" - - #if defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) - static WARN_UNUSED_RESULT int wc_AesEncrypt( +#elif defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_AES) + #include + #include + #define TAG "aes" + + /* We'll use SW for fallback: + * unsupported key lengths. (e.g. ESP32-S3) + * chipsets not implemented. + * hardware busy. */ + #define NEED_AES_TABLES + #define NEED_AES_HW_FALLBACK + #define NEED_SOFTWARE_AES_SETKEY + #undef WOLFSSL_AES_DIRECT + #define WOLFSSL_AES_DIRECT + + /* Encrypt: If we choose to never have a fallback to SW: */ + #if !defined(NEED_AES_HW_FALLBACK) && (defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT)) + static WARN_UNUSED_RESULT int wc_AesEncrypt( /* calling this one when NO_AES_192 is defined */ Aes* aes, const byte* inBlock, byte* outBlock) { + int ret; + +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + /* Thread mutex protection handled in esp_aes_hw_InUse */ - return wc_esp32AesEncrypt(aes, inBlock, outBlock); + #ifdef NEED_AES_HW_FALLBACK + if (wc_esp32AesSupportedKeyLen(aes)) { + ret = wc_esp32AesEncrypt(aes, inBlock, outBlock); + } + #else + ret = wc_esp32AesEncrypt(aes, inBlock, outBlock); + #endif + return ret; } #endif - #if defined(HAVE_AES_DECRYPT) && defined(WOLFSSL_AES_DIRECT) + /* Decrypt: If we choose to never have a fallback to SW: */ + #if !defined(NEED_AES_HW_FALLBACK) && (defined(HAVE_AES_DECRYPT) && defined(WOLFSSL_AES_DIRECT)) static WARN_UNUSED_RESULT int wc_AesDecrypt( Aes* aes, const byte* inBlock, byte* outBlock) { + int ret = 0; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif /* Thread mutex protection handled in esp_aes_hw_InUse */ - return wc_esp32AesDecrypt(aes, inBlock, outBlock); + #ifdef NEED_AES_HW_FALLBACK + if (wc_esp32AesSupportedKeyLen(aes)) { + ret = wc_esp32AesDecrypt(aes, inBlock, outBlock); + } + else { + ret = wc_AesDecrypt_SW(aes, inBlock, outBlock); + } + #else + /* if we don't need fallback, always use HW */ + ret = wc_esp32AesDecrypt(aes, inBlock, outBlock); + #endif + return ret; } #endif @@ -709,7 +613,7 @@ #define AESNI_ALIGN 16 #endif - static int checkAESNI = 0; + static int checkedAESNI = 0; static int haveAESNI = 0; static word32 intel_flags = 0; @@ -724,71 +628,73 @@ /* tell C compiler these are asm functions in case any mix up of ABI underscore prefix between clang/gcc/llvm etc */ #ifdef HAVE_AES_CBC - void AES_CBC_encrypt(const unsigned char* in, unsigned char* out, + void AES_CBC_encrypt_AESNI(const unsigned char* in, unsigned char* out, unsigned char* ivec, unsigned long length, const unsigned char* KS, int nr) - XASM_LINK("AES_CBC_encrypt"); + XASM_LINK("AES_CBC_encrypt_AESNI"); #ifdef HAVE_AES_DECRYPT #if defined(WOLFSSL_AESNI_BY4) || defined(WOLFSSL_X86_BUILD) - void AES_CBC_decrypt_by4(const unsigned char* in, unsigned char* out, + void AES_CBC_decrypt_AESNI_by4(const unsigned char* in, unsigned char* out, unsigned char* ivec, unsigned long length, const unsigned char* KS, int nr) - XASM_LINK("AES_CBC_decrypt_by4"); + XASM_LINK("AES_CBC_decrypt_AESNI_by4"); #elif defined(WOLFSSL_AESNI_BY6) - void AES_CBC_decrypt_by6(const unsigned char* in, unsigned char* out, + void AES_CBC_decrypt_AESNI_by6(const unsigned char* in, unsigned char* out, unsigned char* ivec, unsigned long length, const unsigned char* KS, int nr) - XASM_LINK("AES_CBC_decrypt_by6"); + XASM_LINK("AES_CBC_decrypt_AESNI_by6"); #else /* WOLFSSL_AESNI_BYx */ - void AES_CBC_decrypt_by8(const unsigned char* in, unsigned char* out, + void AES_CBC_decrypt_AESNI_by8(const unsigned char* in, unsigned char* out, unsigned char* ivec, unsigned long length, const unsigned char* KS, int nr) - XASM_LINK("AES_CBC_decrypt_by8"); + XASM_LINK("AES_CBC_decrypt_AESNI_by8"); #endif /* WOLFSSL_AESNI_BYx */ #endif /* HAVE_AES_DECRYPT */ #endif /* HAVE_AES_CBC */ - void AES_ECB_encrypt(const unsigned char* in, unsigned char* out, + void AES_ECB_encrypt_AESNI(const unsigned char* in, unsigned char* out, unsigned long length, const unsigned char* KS, int nr) - XASM_LINK("AES_ECB_encrypt"); + XASM_LINK("AES_ECB_encrypt_AESNI"); #ifdef HAVE_AES_DECRYPT - void AES_ECB_decrypt(const unsigned char* in, unsigned char* out, + void AES_ECB_decrypt_AESNI(const unsigned char* in, unsigned char* out, unsigned long length, const unsigned char* KS, int nr) - XASM_LINK("AES_ECB_decrypt"); + XASM_LINK("AES_ECB_decrypt_AESNI"); #endif - void AES_128_Key_Expansion(const unsigned char* userkey, + void AES_128_Key_Expansion_AESNI(const unsigned char* userkey, unsigned char* key_schedule) - XASM_LINK("AES_128_Key_Expansion"); + XASM_LINK("AES_128_Key_Expansion_AESNI"); - void AES_192_Key_Expansion(const unsigned char* userkey, + void AES_192_Key_Expansion_AESNI(const unsigned char* userkey, unsigned char* key_schedule) - XASM_LINK("AES_192_Key_Expansion"); + XASM_LINK("AES_192_Key_Expansion_AESNI"); - void AES_256_Key_Expansion(const unsigned char* userkey, + void AES_256_Key_Expansion_AESNI(const unsigned char* userkey, unsigned char* key_schedule) - XASM_LINK("AES_256_Key_Expansion"); + XASM_LINK("AES_256_Key_Expansion_AESNI"); - static WARN_UNUSED_RESULT int AES_set_encrypt_key( + static WARN_UNUSED_RESULT int AES_set_encrypt_key_AESNI( const unsigned char *userKey, const int bits, Aes* aes) { int ret; + ASSERT_SAVED_VECTOR_REGISTERS(); + if (!userKey || !aes) return BAD_FUNC_ARG; switch (bits) { case 128: - AES_128_Key_Expansion (userKey,(byte*)aes->key); aes->rounds = 10; + AES_128_Key_Expansion_AESNI (userKey,(byte*)aes->key); aes->rounds = 10; return 0; case 192: - AES_192_Key_Expansion (userKey,(byte*)aes->key); aes->rounds = 12; + AES_192_Key_Expansion_AESNI (userKey,(byte*)aes->key); aes->rounds = 12; return 0; case 256: - AES_256_Key_Expansion (userKey,(byte*)aes->key); aes->rounds = 14; + AES_256_Key_Expansion_AESNI (userKey,(byte*)aes->key); aes->rounds = 14; return 0; default: ret = BAD_FUNC_ARG; @@ -798,7 +704,7 @@ } #ifdef HAVE_AES_DECRYPT - static WARN_UNUSED_RESULT int AES_set_decrypt_key( + static WARN_UNUSED_RESULT int AES_set_decrypt_key_AESNI( const unsigned char* userKey, const int bits, Aes* aes) { word32 nr; @@ -810,6 +716,8 @@ __m128i *Key_Schedule; __m128i *Temp_Key_Schedule; + ASSERT_SAVED_VECTOR_REGISTERS(); + if (!userKey || !aes) return BAD_FUNC_ARG; @@ -819,7 +727,8 @@ return MEMORY_E; #endif - if (AES_set_encrypt_key(userKey,bits,temp_key) == BAD_FUNC_ARG) { + if (AES_set_encrypt_key_AESNI(userKey,bits,temp_key) + == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { #ifdef WOLFSSL_SMALL_STACK XFREE(temp_key, aes->heap, DYNAMIC_TYPE_AES); #endif @@ -832,12 +741,6 @@ nr = temp_key->rounds; aes->rounds = nr; -#ifdef WOLFSSL_SMALL_STACK - SAVE_VECTOR_REGISTERS(XFREE(temp_key, aes->heap, DYNAMIC_TYPE_AES); return _svr_ret;); -#else - SAVE_VECTOR_REGISTERS(return _svr_ret;); -#endif - Key_Schedule[nr] = Temp_Key_Schedule[0]; Key_Schedule[nr-1] = _mm_aesimc_si128(Temp_Key_Schedule[1]); Key_Schedule[nr-2] = _mm_aesimc_si128(Temp_Key_Schedule[2]); @@ -861,8 +764,6 @@ Key_Schedule[0] = Temp_Key_Schedule[nr]; - RESTORE_VECTOR_REGISTERS(); - #ifdef WOLFSSL_SMALL_STACK XFREE(temp_key, aes->heap, DYNAMIC_TYPE_AES); #endif @@ -878,6 +779,14 @@ static WARN_UNUSED_RESULT int wc_AesEncrypt( Aes* aes, const byte* inBlock, byte* outBlock) { +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = + wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif return wc_AesEncryptDirect(aes, outBlock, inBlock); } @@ -1020,6 +929,13 @@ static WARN_UNUSED_RESULT int wc_AesEncrypt( Aes* aes, const byte* inBlock, byte* outBlock) { +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif return AES_ECB_encrypt(aes, inBlock, outBlock, AES_BLOCK_SIZE); } #endif @@ -1028,22 +944,33 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt( Aes* aes, const byte* inBlock, byte* outBlock) { +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif return AES_ECB_decrypt(aes, inBlock, outBlock, AES_BLOCK_SIZE); } #endif #elif defined(WOLFSSL_KCAPI_AES) - /* Only CBC and GCM that are in wolfcrypt/src/port/kcapi/kcapi_aes.c */ + /* Only CBC and GCM are in wolfcrypt/src/port/kcapi/kcapi_aes.c */ #if defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AESCCM) || \ defined(WOLFSSL_CMAC) || defined(WOLFSSL_AES_OFB) || \ defined(WOLFSSL_AES_CFB) || defined(HAVE_AES_ECB) || \ - defined(WOLFSSL_AES_DIRECT) || \ + defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_XTS) || \ (defined(HAVE_AES_CBC) && defined(WOLFSSL_NO_KCAPI_AES_CBC)) #define NEED_AES_TABLES #endif #elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_AES) /* implemented in wolfcrypt/src/port/psa/psa_aes.c */ + +#elif defined(WOLFSSL_RISCV_ASM) +/* implemented in wolfcrypt/src/port/risc-v/riscv-64-aes.c */ + #else /* using wolfCrypt software implementation */ @@ -1052,14 +979,23 @@ +#if defined(WC_AES_BITSLICED) && !defined(HAVE_AES_ECB) + #error "When WC_AES_BITSLICED is defined, HAVE_AES_ECB is needed." +#endif + #ifdef NEED_AES_TABLES +#ifndef WC_AES_BITSLICED +#if !defined(WOLFSSL_SILABS_SE_ACCEL) || \ + defined(NO_ESP32_CRYPT) || defined(NO_WOLFSSL_ESP32_CRYPT_AES) || \ + defined(NEED_AES_HW_FALLBACK) static const FLASH_QUALIFIER word32 rcon[] = { 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ }; +#endif #ifndef WOLFSSL_AES_SMALL_TABLES static const FLASH_QUALIFIER word32 Te[4][256] = { @@ -1329,7 +1265,7 @@ } }; -#ifdef HAVE_AES_DECRYPT +#if defined(HAVE_AES_DECRYPT) && !defined(WOLFSSL_SILABS_SE_ACCEL) static const FLASH_QUALIFIER word32 Td[4][256] = { { 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, @@ -1601,8 +1537,9 @@ #endif /* WOLFSSL_AES_SMALL_TABLES */ #ifdef HAVE_AES_DECRYPT -#if (defined(HAVE_AES_CBC) && !defined(WOLFSSL_DEVCRYPTO_CBC)) \ - || defined(WOLFSSL_AES_DIRECT) +#if (defined(HAVE_AES_CBC) && !defined(WOLFSSL_DEVCRYPTO_CBC) && \ + !defined(WOLFSSL_SILABS_SE_ACCEL)) || \ + defined(WOLFSSL_AES_DIRECT) static const FLASH_QUALIFIER byte Td4[256] = { 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, @@ -1701,12 +1638,15 @@ byte t0 = t9 ^ tb ^ td; return t0 ^ AES_XTIME(AES_XTIME(AES_XTIME(t0 ^ te) ^ td ^ te) ^ tb ^ te); } -#endif +#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */ +#endif /* WOLFSSL_AES_SMALL_TABLES */ #endif #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) || \ defined(HAVE_AESCCM) || defined(HAVE_AESGCM) +#ifndef WC_AES_BITSLICED + #ifndef WC_CACHE_LINE_SZ #if defined(__x86_64__) || defined(_M_X64) || \ (defined(__ILP32__) && (__ILP32__ >= 1)) @@ -1763,25 +1703,25 @@ #ifdef WOLFSSL_AES_TOUCH_LINES #if WC_CACHE_LINE_SZ == 128 - #define WC_CACHE_LINE_BITS 5 - #define WC_CACHE_LINE_MASK_HI 0xe0 - #define WC_CACHE_LINE_MASK_LO 0x1f - #define WC_CACHE_LINE_ADD 0x20 + #define WC_CACHE_LINE_BITS 5 + #define WC_CACHE_LINE_MASK_HI 0xe0 + #define WC_CACHE_LINE_MASK_LO 0x1f + #define WC_CACHE_LINE_ADD 0x20 #elif WC_CACHE_LINE_SZ == 64 - #define WC_CACHE_LINE_BITS 4 - #define WC_CACHE_LINE_MASK_HI 0xf0 - #define WC_CACHE_LINE_MASK_LO 0x0f - #define WC_CACHE_LINE_ADD 0x10 + #define WC_CACHE_LINE_BITS 4 + #define WC_CACHE_LINE_MASK_HI 0xf0 + #define WC_CACHE_LINE_MASK_LO 0x0f + #define WC_CACHE_LINE_ADD 0x10 #elif WC_CACHE_LINE_SZ == 32 - #define WC_CACHE_LINE_BITS 3 - #define WC_CACHE_LINE_MASK_HI 0xf8 - #define WC_CACHE_LINE_MASK_LO 0x07 - #define WC_CACHE_LINE_ADD 0x08 -#elif WC_CACHE_LINE_SZ = 16 - #define WC_CACHE_LINE_BITS 2 - #define WC_CACHE_LINE_MASK_HI 0xfc - #define WC_CACHE_LINE_MASK_LO 0x03 - #define WC_CACHE_LINE_ADD 0x04 + #define WC_CACHE_LINE_BITS 3 + #define WC_CACHE_LINE_MASK_HI 0xf8 + #define WC_CACHE_LINE_MASK_LO 0x07 + #define WC_CACHE_LINE_ADD 0x08 +#elif WC_CACHE_LINE_SZ == 16 + #define WC_CACHE_LINE_BITS 2 + #define WC_CACHE_LINE_MASK_HI 0xfc + #define WC_CACHE_LINE_MASK_LO 0x03 + #define WC_CACHE_LINE_ADD 0x04 #else #error Cache line size not supported #endif @@ -1967,6 +1907,7 @@ } #endif #else + #define GetTable(t, o) t[o] #define GetTable8(t, o) t[o] #define GetTable_Multi(t, t0, o0, t1, o1, t2, o2, t3, o3) \ @@ -1978,83 +1919,25 @@ ((word32)(t)[o2] << 8) | ((word32)(t)[o3] << 0)) #endif -/* Software AES - ECB Encrypt */ -static WARN_UNUSED_RESULT int wc_AesEncrypt( - Aes* aes, const byte* inBlock, byte* outBlock) +#ifndef HAVE_CUDA +/* Encrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] inBlock Block to encrypt. + * @param [out] outBlock Encrypted block. + * @param [in] r Rounds divided by 2. + */ +static void AesEncrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r) { word32 s0, s1, s2, s3; word32 t0, t1, t2, t3; - word32 r = aes->rounds >> 1; - const word32* rk = aes->key; - - if (r > 7 || r == 0) { - WOLFSSL_ERROR_VERBOSE(KEYUSAGE_E); - return KEYUSAGE_E; - } + const word32* rk; -#ifdef WOLFSSL_AESNI - if (haveAESNI && aes->use_aesni) { - #ifdef DEBUG_AESNI - printf("about to aes encrypt\n"); - printf("in = %p\n", inBlock); - printf("out = %p\n", outBlock); - printf("aes->key = %p\n", aes->key); - printf("aes->rounds = %d\n", aes->rounds); - printf("sz = %d\n", AES_BLOCK_SIZE); - #endif - - /* check alignment, decrypt doesn't need alignment */ - if ((wc_ptr_t)inBlock % AESNI_ALIGN) { - #ifndef NO_WOLFSSL_ALLOC_ALIGN - byte* tmp = (byte*)XMALLOC(AES_BLOCK_SIZE + AESNI_ALIGN, aes->heap, - DYNAMIC_TYPE_TMP_BUFFER); - byte* tmp_align; - if (tmp == NULL) - return MEMORY_E; - - tmp_align = tmp + (AESNI_ALIGN - ((wc_ptr_t)tmp % AESNI_ALIGN)); - - XMEMCPY(tmp_align, inBlock, AES_BLOCK_SIZE); - AES_ECB_encrypt(tmp_align, tmp_align, AES_BLOCK_SIZE, - (byte*)aes->key, (int)aes->rounds); - XMEMCPY(outBlock, tmp_align, AES_BLOCK_SIZE); - XFREE(tmp, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); - return 0; - #else - WOLFSSL_MSG("AES-ECB encrypt with bad alignment"); - WOLFSSL_ERROR_VERBOSE(BAD_ALIGN_E); - return BAD_ALIGN_E; - #endif - } - - AES_ECB_encrypt(inBlock, outBlock, AES_BLOCK_SIZE, (byte*)aes->key, - (int)aes->rounds); - - return 0; - } - else { - #ifdef DEBUG_AESNI - printf("Skipping AES-NI\n"); - #endif - } -#endif -#if defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_AES) - AES_ECB_encrypt(aes, inBlock, outBlock, AES_BLOCK_SIZE); - return 0; -#endif - -#if defined(WOLFSSL_IMXRT_DCP) - if (aes->keylen == 16) { - DCPAesEcbEncrypt(aes, outBlock, inBlock, AES_BLOCK_SIZE); - return 0; - } -#endif - -#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_CRYPT) - if (aes->useSWCrypt == 0) { - return se050_aes_crypt(aes, inBlock, outBlock, AES_BLOCK_SIZE, - AES_ENCRYPTION, kAlgorithm_SSS_AES_ECB); - } +#ifdef WC_C_DYNAMIC_FALLBACK + rk = aes->key_C_fallback; +#else + rk = aes->key; #endif /* @@ -2315,58 +2198,608 @@ XMEMCPY(outBlock + sizeof(s0), &s1, sizeof(s1)); XMEMCPY(outBlock + 2 * sizeof(s0), &s2, sizeof(s2)); XMEMCPY(outBlock + 3 * sizeof(s0), &s3, sizeof(s3)); +} - return 0; +#if defined(HAVE_AES_ECB) && !(defined(WOLFSSL_IMX6_CAAM) && \ + !defined(NO_IMX6_CAAM_AES) && !defined(WOLFSSL_QNX_CAAM)) +/* Encrypt a number of blocks using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + * @param [in] sz Number of blocks to encrypt. + */ +static void AesEncryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz) +{ + word32 i; + + for (i = 0; i < sz; i += AES_BLOCK_SIZE) { + AesEncrypt_C(aes, in, out, aes->rounds >> 1); + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } } -#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT || HAVE_AESGCM */ +#endif +#else +extern void AesEncrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r); +extern void AesEncryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz); +#endif /* HAVE_CUDA */ + +#else + +/* Bit-sliced implementation based on work by "circuit minimization team" (CMT): + * http://cs-www.cs.yale.edu/homes/peralta/CircuitStuff/CMT.html + */ +/* http://cs-www.cs.yale.edu/homes/peralta/CircuitStuff/SLP_AES_113.txt */ +static void bs_sub_bytes(bs_word u[8]) +{ + bs_word y1, y2, y3, y4, y5, y6, y7, y8, y9; + bs_word y10, y11, y12, y13, y14, y15, y16, y17, y18, y19; + bs_word y20, y21; + bs_word t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; + bs_word t10, t11, t12, t13, t14, t15, t16, t17, t18, t19; + bs_word t20, t21, t22, t23, t24, t25, t26, t27, t28, t29; + bs_word t30, t31, t32, t33, t34, t35, t36, t37, t38, t39; + bs_word t40, t41, t42, t43, t44, t45; + bs_word z0, z1, z2, z3, z4, z5, z6, z7, z8, z9; + bs_word z10, z11, z12, z13, z14, z15, z16, z17; + bs_word tc1, tc2, tc3, tc4, tc5, tc6, tc7, tc8, tc9; + bs_word tc10, tc11, tc12, tc13, tc14, tc16, tc17, tc18; + bs_word tc20, tc21, tc26; + bs_word U0, U1, U2, U3, U4, U5, U6, U7; + bs_word S0, S1, S2, S3, S4, S5, S6, S7; + + U0 = u[7]; + U1 = u[6]; + U2 = u[5]; + U3 = u[4]; + U4 = u[3]; + U5 = u[2]; + U6 = u[1]; + U7 = u[0]; + + y14 = U3 ^ U5; + y13 = U0 ^ U6; + y9 = U0 ^ U3; + y8 = U0 ^ U5; + t0 = U1 ^ U2; + y1 = t0 ^ U7; + y4 = y1 ^ U3; + y12 = y13 ^ y14; + y2 = y1 ^ U0; + y5 = y1 ^ U6; + y3 = y5 ^ y8; + t1 = U4 ^ y12; + y15 = t1 ^ U5; + y20 = t1 ^ U1; + y6 = y15 ^ U7; + y10 = y15 ^ t0; + y11 = y20 ^ y9; + y7 = U7 ^ y11; + y17 = y10 ^ y11; + y19 = y10 ^ y8; + y16 = t0 ^ y11; + y21 = y13 ^ y16; + y18 = U0 ^ y16; + t2 = y12 & y15; + t3 = y3 & y6; + t4 = t3 ^ t2; + t5 = y4 & U7; + t6 = t5 ^ t2; + t7 = y13 & y16; + t8 = y5 & y1; + t9 = t8 ^ t7; + t10 = y2 & y7; + t11 = t10 ^ t7; + t12 = y9 & y11; + t13 = y14 & y17; + t14 = t13 ^ t12; + t15 = y8 & y10; + t16 = t15 ^ t12; + t17 = t4 ^ y20; + t18 = t6 ^ t16; + t19 = t9 ^ t14; + t20 = t11 ^ t16; + t21 = t17 ^ t14; + t22 = t18 ^ y19; + t23 = t19 ^ y21; + t24 = t20 ^ y18; + t25 = t21 ^ t22; + t26 = t21 & t23; + t27 = t24 ^ t26; + t28 = t25 & t27; + t29 = t28 ^ t22; + t30 = t23 ^ t24; + t31 = t22 ^ t26; + t32 = t31 & t30; + t33 = t32 ^ t24; + t34 = t23 ^ t33; + t35 = t27 ^ t33; + t36 = t24 & t35; + t37 = t36 ^ t34; + t38 = t27 ^ t36; + t39 = t29 & t38; + t40 = t25 ^ t39; + t41 = t40 ^ t37; + t42 = t29 ^ t33; + t43 = t29 ^ t40; + t44 = t33 ^ t37; + t45 = t42 ^ t41; + z0 = t44 & y15; + z1 = t37 & y6; + z2 = t33 & U7; + z3 = t43 & y16; + z4 = t40 & y1; + z5 = t29 & y7; + z6 = t42 & y11; + z7 = t45 & y17; + z8 = t41 & y10; + z9 = t44 & y12; + z10 = t37 & y3; + z11 = t33 & y4; + z12 = t43 & y13; + z13 = t40 & y5; + z14 = t29 & y2; + z15 = t42 & y9; + z16 = t45 & y14; + z17 = t41 & y8; + tc1 = z15 ^ z16; + tc2 = z10 ^ tc1; + tc3 = z9 ^ tc2; + tc4 = z0 ^ z2; + tc5 = z1 ^ z0; + tc6 = z3 ^ z4; + tc7 = z12 ^ tc4; + tc8 = z7 ^ tc6; + tc9 = z8 ^ tc7; + tc10 = tc8 ^ tc9; + tc11 = tc6 ^ tc5; + tc12 = z3 ^ z5; + tc13 = z13 ^ tc1; + tc14 = tc4 ^ tc12; + S3 = tc3 ^ tc11; + tc16 = z6 ^ tc8; + tc17 = z14 ^ tc10; + tc18 = tc13 ^ tc14; + S7 = ~(z12 ^ tc18); + tc20 = z15 ^ tc16; + tc21 = tc2 ^ z11; + S0 = tc3 ^ tc16; + S6 = ~(tc10 ^ tc18); + S4 = tc14 ^ S3; + S1 = ~(S3 ^ tc16); + tc26 = tc17 ^ tc20; + S2 = ~(tc26 ^ z17); + S5 = tc21 ^ tc17; + + u[0] = S7; + u[1] = S6; + u[2] = S5; + u[3] = S4; + u[4] = S3; + u[5] = S2; + u[6] = S1; + u[7] = S0; +} + +#define BS_MASK_BIT_SET(w, j, bmask) \ + (((bs_word)0 - (((w) >> (j)) & (bs_word)1)) & (bmask)) + +#define BS_TRANS_8(t, o, w, bmask, s) \ + t[o + s + 0] |= BS_MASK_BIT_SET(w, s + 0, bmask); \ + t[o + s + 1] |= BS_MASK_BIT_SET(w, s + 1, bmask); \ + t[o + s + 2] |= BS_MASK_BIT_SET(w, s + 2, bmask); \ + t[o + s + 3] |= BS_MASK_BIT_SET(w, s + 3, bmask); \ + t[o + s + 4] |= BS_MASK_BIT_SET(w, s + 4, bmask); \ + t[o + s + 5] |= BS_MASK_BIT_SET(w, s + 5, bmask); \ + t[o + s + 6] |= BS_MASK_BIT_SET(w, s + 6, bmask); \ + t[o + s + 7] |= BS_MASK_BIT_SET(w, s + 7, bmask) -#if defined(HAVE_AES_DECRYPT) -#if (defined(HAVE_AES_CBC) && !defined(WOLFSSL_DEVCRYPTO_CBC)) || \ - defined(WOLFSSL_AES_DIRECT) +static void bs_transpose(bs_word* t, bs_word* blocks) +{ + bs_word bmask = 1; + int i; -#ifndef WC_NO_CACHE_RESISTANT -#ifndef WOLFSSL_AES_SMALL_TABLES -/* load 4 Td Tables into cache by cache line stride */ -static WARN_UNUSED_RESULT WC_INLINE word32 PreFetchTd(void) + XMEMSET(t, 0, sizeof(bs_word) * AES_BLOCK_BITS); + + for (i = 0; i < BS_WORD_SIZE; i++) { + int j; + int o = 0; + for (j = 0; j < BS_BLOCK_WORDS; j++) { + #ifdef LITTLE_ENDIAN_ORDER + bs_word w = blocks[i * BS_BLOCK_WORDS + j]; + #else + bs_word w = bs_bswap(blocks[i * BS_BLOCK_WORDS + j]); + #endif + #ifdef WOLFSSL_AES_NO_UNROLL + int k; + for (k = 0; k < BS_WORD_SIZE; k++) { + t[o + k] |= BS_MASK_BIT_SET(w, k, bmask); + } + #else + BS_TRANS_8(t, o, w, bmask, 0); + #if BS_WORD_SIZE >= 16 + BS_TRANS_8(t, o, w, bmask, 8); + #endif + #if BS_WORD_SIZE >= 32 + BS_TRANS_8(t, o, w, bmask, 16); + BS_TRANS_8(t, o, w, bmask, 24); + #endif + #if BS_WORD_SIZE >= 64 + BS_TRANS_8(t, o, w, bmask, 32); + BS_TRANS_8(t, o, w, bmask, 40); + BS_TRANS_8(t, o, w, bmask, 48); + BS_TRANS_8(t, o, w, bmask, 56); + #endif + #endif + o += BS_WORD_SIZE; + } + bmask <<= 1; + } +} + +#define BS_INV_TRANS_8(t, o, w, bmask, s) \ + t[o + (s + 0) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 0, bmask); \ + t[o + (s + 1) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 1, bmask); \ + t[o + (s + 2) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 2, bmask); \ + t[o + (s + 3) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 3, bmask); \ + t[o + (s + 4) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 4, bmask); \ + t[o + (s + 5) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 5, bmask); \ + t[o + (s + 6) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 6, bmask); \ + t[o + (s + 7) * BS_BLOCK_WORDS] |= BS_MASK_BIT_SET(w, s + 7, bmask) + +static void bs_inv_transpose(bs_word* t, bs_word* blocks) { - word32 x = 0; - int i,j; + int o; - for (i = 0; i < 4; i++) { - /* 256 elements, each one is 4 bytes */ - for (j = 0; j < 256; j += WC_CACHE_LINE_SZ/4) { - x &= Td[i][j]; + XMEMSET(t, 0, sizeof(bs_word) * AES_BLOCK_BITS); + + for (o = 0; o < BS_BLOCK_WORDS; o++) { + int i; + for (i = 0; i < BS_WORD_SIZE; i++) { + #ifdef LITTLE_ENDIAN_ORDER + bs_word bmask = (bs_word)1 << i; + #else + bs_word bmask = bs_bswap((bs_word)1 << i); + #endif + bs_word w = blocks[(o << BS_WORD_SHIFT) + i]; + #ifdef WOLFSSL_AES_NO_UNROLL + int j; + for (j = 0; j < BS_WORD_SIZE; j++) { + t[j * BS_BLOCK_WORDS + o] |= BS_MASK_BIT_SET(w, j, bmask); + } + #else + BS_INV_TRANS_8(t, o, w, bmask, 0); + #if BS_WORD_SIZE >= 16 + BS_INV_TRANS_8(t, o, w, bmask, 8); + #endif + #if BS_WORD_SIZE >= 32 + BS_INV_TRANS_8(t, o, w, bmask, 16); + BS_INV_TRANS_8(t, o, w, bmask, 24); + #endif + #if BS_WORD_SIZE >= 64 + BS_INV_TRANS_8(t, o, w, bmask, 32); + BS_INV_TRANS_8(t, o, w, bmask, 40); + BS_INV_TRANS_8(t, o, w, bmask, 48); + BS_INV_TRANS_8(t, o, w, bmask, 56); + #endif + #endif } } - return x; } -#endif -/* load Td Table4 into cache by cache line stride */ -static WARN_UNUSED_RESULT WC_INLINE word32 PreFetchTd4(void) +#define BS_ROW_OFF_0 0 +#define BS_ROW_OFF_1 32 +#define BS_ROW_OFF_2 64 +#define BS_ROW_OFF_3 96 + +#define BS_ROW_ADD (AES_BLOCK_BITS / 16 + AES_BLOCK_BITS / 4) +#define BS_IDX_MASK 0x7f + +#define BS_ASSIGN_8(d, od, s, os) \ + d[(od) + 0] = s[(os) + 0]; \ + d[(od) + 1] = s[(os) + 1]; \ + d[(od) + 2] = s[(os) + 2]; \ + d[(od) + 3] = s[(os) + 3]; \ + d[(od) + 4] = s[(os) + 4]; \ + d[(od) + 5] = s[(os) + 5]; \ + d[(od) + 6] = s[(os) + 6]; \ + d[(od) + 7] = s[(os) + 7] + +static void bs_shift_rows(bs_word* t, bs_word* b) { -#ifndef WOLFSSL_AES_TOUCH_LINES - word32 x = 0; int i; - for (i = 0; i < 256; i += WC_CACHE_LINE_SZ) { - x &= (word32)Td4[i]; + for (i = 0; i < 128; i += 32) { + BS_ASSIGN_8(t, i + 0, b, ( 0 + i) & BS_IDX_MASK); + BS_ASSIGN_8(t, i + 8, b, ( 40 + i) & BS_IDX_MASK); + BS_ASSIGN_8(t, i + 16, b, ( 80 + i) & BS_IDX_MASK); + BS_ASSIGN_8(t, i + 24, b, (120 + i) & BS_IDX_MASK); } - return x; +} + +#define BS_SHIFT_OFF_0 0 +#define BS_SHIFT_OFF_1 8 +#define BS_SHIFT_OFF_2 16 +#define BS_SHIFT_OFF_3 24 + +/* Shift rows and mix columns. + * See: See https://eprint.iacr.org/2009/129.pdf - Appendix A + */ + +#define BS_SHIFT_MIX_8(t, o, br0, br1, br2, br3, of) \ + of = br0[7] ^ br1[7]; \ + t[o+0] = br1[0] ^ br2[0] ^ br3[0] ^ of; \ + t[o+1] = br0[0] ^ br1[0] ^ br1[1] ^ br2[1] ^ br3[1] ^ of; \ + t[o+2] = br0[1] ^ br1[1] ^ br1[2] ^ br2[2] ^ br3[2]; \ + t[o+3] = br0[2] ^ br1[2] ^ br1[3] ^ br2[3] ^ br3[3] ^ of; \ + t[o+4] = br0[3] ^ br1[3] ^ br1[4] ^ br2[4] ^ br3[4] ^ of; \ + t[o+5] = br0[4] ^ br1[4] ^ br1[5] ^ br2[5] ^ br3[5]; \ + t[o+6] = br0[5] ^ br1[5] ^ br1[6] ^ br2[6] ^ br3[6]; \ + t[o+7] = br0[6] ^ br1[6] ^ br1[7] ^ br2[7] ^ br3[7] + +static void bs_shift_mix(bs_word* t, bs_word* b) +{ + int i; + word8 or0 = BS_ROW_OFF_0 + BS_SHIFT_OFF_0; + word8 or1 = BS_ROW_OFF_1 + BS_SHIFT_OFF_1; + word8 or2 = BS_ROW_OFF_2 + BS_SHIFT_OFF_2; + word8 or3 = BS_ROW_OFF_3 + BS_SHIFT_OFF_3; + + for (i = 0; i < AES_BLOCK_BITS; i += AES_BLOCK_BITS / 4) { + bs_word* br0 = b + or0; + bs_word* br1 = b + or1; + bs_word* br2 = b + or2; + bs_word* br3 = b + or3; + bs_word of; + + BS_SHIFT_MIX_8(t, i + 0, br0, br1, br2, br3, of); + BS_SHIFT_MIX_8(t, i + 8, br1, br2, br3, br0, of); + BS_SHIFT_MIX_8(t, i + 16, br2, br3, br0, br1, of); + BS_SHIFT_MIX_8(t, i + 24, br3, br0, br1, br2, of); + + or0 = (or0 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + or1 = (or1 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + or2 = (or2 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + or3 = (or3 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + } +} + +static void bs_add_round_key(bs_word* out, bs_word* b, bs_word* rk) +{ + xorbufout((byte*)out, (byte*)b, (byte*)rk, BS_BLOCK_SIZE); +} + +static void bs_sub_bytes_blocks(bs_word* b) +{ + int i; + + for (i = 0; i < AES_BLOCK_BITS; i += 8) { + bs_sub_bytes(b + i); + } +} + +static const FLASH_QUALIFIER byte bs_rcon[] = { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36, + /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +static void bs_ke_sub_bytes(unsigned char* out, unsigned char *in) { + bs_word block[AES_BLOCK_BITS]; + bs_word trans[AES_BLOCK_BITS]; + + XMEMSET(block, 0, sizeof(block)); + XMEMCPY(block, in, 4); + + bs_transpose(trans, block); + bs_sub_bytes_blocks(trans); + bs_inv_transpose(block, trans); + + XMEMCPY(out, block, 4); +} + +static void bs_ke_transform(unsigned char* out, unsigned char *in, word8 i) { + /* Rotate the input 8 bits to the left */ +#ifdef LITTLE_ENDIAN_ORDER + *(word32*)out = rotrFixed(*(word32*)in, 8); #else - return 0; + *(word32*)out = rotlFixed(*(word32*)in, 8); #endif + bs_ke_sub_bytes(out, out); + /* On just the first byte, add 2^i to the byte */ + out[0] ^= bs_rcon[i]; +} + +static void bs_expand_key(unsigned char *in, word32 sz) { + unsigned char t[4]; + word32 o; + word8 i = 0; + + if (sz == 176) { + /* Total of 11 rounds - AES-128. */ + for (o = 16; o < sz; o += 16) { + bs_ke_transform(t, in + o - 4, i); + i++; + *(word32*)(in + o + 0) = *(word32*)(in + o - 16) ^ + *(word32*) t; + *(word32*)(in + o + 4) = *(word32*)(in + o - 12) ^ + *(word32*)(in + o + 0); + *(word32*)(in + o + 8) = *(word32*)(in + o - 8) ^ + *(word32*)(in + o + 4); + *(word32*)(in + o + 12) = *(word32*)(in + o - 4) ^ + *(word32*)(in + o + 8); + } + } + else if (sz == 208) { + /* Total of 13 rounds - AES-192. */ + for (o = 24; o < sz; o += 24) { + bs_ke_transform(t, in + o - 4, i); + i++; + *(word32*)(in + o + 0) = *(word32*)(in + o - 24) ^ + *(word32*) t; + *(word32*)(in + o + 4) = *(word32*)(in + o - 20) ^ + *(word32*)(in + o + 0); + *(word32*)(in + o + 8) = *(word32*)(in + o - 16) ^ + *(word32*)(in + o + 4); + *(word32*)(in + o + 12) = *(word32*)(in + o - 12) ^ + *(word32*)(in + o + 8); + *(word32*)(in + o + 16) = *(word32*)(in + o - 8) ^ + *(word32*)(in + o + 12); + *(word32*)(in + o + 20) = *(word32*)(in + o - 4) ^ + *(word32*)(in + o + 16); + } + } + else if (sz == 240) { + /* Total of 15 rounds - AES-256. */ + for (o = 32; o < sz; o += 16) { + if ((o & 0x1f) == 0) { + bs_ke_transform(t, in + o - 4, i); + i++; + } + else { + bs_ke_sub_bytes(t, in + o - 4); + } + *(word32*)(in + o + 0) = *(word32*)(in + o - 32) ^ + *(word32*) t; + *(word32*)(in + o + 4) = *(word32*)(in + o - 28) ^ + *(word32*)(in + o + 0); + *(word32*)(in + o + 8) = *(word32*)(in + o - 24) ^ + *(word32*)(in + o + 4); + *(word32*)(in + o + 12) = *(word32*)(in + o - 20) ^ + *(word32*)(in + o + 8); + } + } +} + +static void bs_set_key(bs_word* rk, const byte* key, word32 keyLen, + word32 rounds) +{ + int i; + byte bs_key[15 * AES_BLOCK_SIZE]; + int ksSz = (rounds + 1) * AES_BLOCK_SIZE; + bs_word block[AES_BLOCK_BITS]; + + /* Fist round. */ + XMEMCPY(bs_key, key, keyLen); + bs_expand_key(bs_key, ksSz); + + for (i = 0; i < ksSz; i += AES_BLOCK_SIZE) { + int k; + + XMEMCPY(block, bs_key + i, AES_BLOCK_SIZE); + for (k = BS_BLOCK_WORDS; k < AES_BLOCK_BITS; k += BS_BLOCK_WORDS) { + int l; + for (l = 0; l < BS_BLOCK_WORDS; l++) { + block[k + l] = block[l]; + } + } + bs_transpose(rk, block); + rk += AES_BLOCK_BITS; + } +} + +static void bs_encrypt(bs_word* state, bs_word* rk, word32 r) +{ + word32 i; + bs_word trans[AES_BLOCK_BITS]; + + bs_transpose(trans, state); + + bs_add_round_key(trans, trans, rk); + for (i = 1; i < r; i++) { + bs_sub_bytes_blocks(trans); + bs_shift_mix(state, trans); + rk += AES_BLOCK_BITS; + bs_add_round_key(trans, state, rk); + } + bs_sub_bytes_blocks(trans); + bs_shift_rows(state, trans); + rk += AES_BLOCK_BITS; + bs_add_round_key(trans, state, rk); + bs_inv_transpose(state, trans); +} + +#ifndef HAVE_CUDA +/* Encrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] inBlock Block to encrypt. + * @param [out] outBlock Encrypted block. + * @param [in] r Rounds divided by 2. + */ +static void AesEncrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r) +{ + bs_word state[AES_BLOCK_BITS]; + + (void)r; + + XMEMCPY(state, inBlock, AES_BLOCK_SIZE); + XMEMSET(((byte*)state) + AES_BLOCK_SIZE, 0, sizeof(state) - AES_BLOCK_SIZE); + + bs_encrypt(state, aes->bs_key, aes->rounds); + + XMEMCPY(outBlock, state, AES_BLOCK_SIZE); +} + +#if defined(HAVE_AES_ECB) && !(defined(WOLFSSL_IMX6_CAAM) && \ + !defined(NO_IMX6_CAAM_AES) && !defined(WOLFSSL_QNX_CAAM)) +/* Encrypt a number of blocks using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + * @param [in] sz Number of blocks to encrypt. + */ +static void AesEncryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz) +{ + bs_word state[AES_BLOCK_BITS]; + + while (sz >= BS_BLOCK_SIZE) { + XMEMCPY(state, in, BS_BLOCK_SIZE); + bs_encrypt(state, aes->bs_key, aes->rounds); + XMEMCPY(out, state, BS_BLOCK_SIZE); + sz -= BS_BLOCK_SIZE; + in += BS_BLOCK_SIZE; + out += BS_BLOCK_SIZE; + } + if (sz > 0) { + XMEMCPY(state, in, sz); + XMEMSET(((byte*)state) + sz, 0, sizeof(state) - sz); + bs_encrypt(state, aes->bs_key, aes->rounds); + XMEMCPY(out, state, sz); + } } #endif +#else +extern void AesEncrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r); +extern void AesEncryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz); +#endif /* HAVE_CUDA */ -/* Software AES - ECB Decrypt */ -static WARN_UNUSED_RESULT int wc_AesDecrypt( +#endif /* !WC_AES_BITSLICED */ + +/* this section disabled with NO_AES_192 */ +/* calling this one when missing NO_AES_192 */ +static WARN_UNUSED_RESULT int wc_AesEncrypt( Aes* aes, const byte* inBlock, byte* outBlock) { - word32 s0, s1, s2, s3; - word32 t0, t1, t2, t3; - word32 r = aes->rounds >> 1; - const word32* rk = aes->key; + word32 r; + + if (aes == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + + r = aes->rounds >> 1; if (r > 7 || r == 0) { WOLFSSL_ERROR_VERBOSE(KEYUSAGE_E); @@ -2374,9 +2807,11 @@ } #ifdef WOLFSSL_AESNI - if (haveAESNI && aes->use_aesni) { + if (aes->use_aesni) { + ASSERT_SAVED_VECTOR_REGISTERS(); + #ifdef DEBUG_AESNI - printf("about to aes decrypt\n"); + printf("about to aes encrypt\n"); printf("in = %p\n", inBlock); printf("out = %p\n", outBlock); printf("aes->key = %p\n", aes->key); @@ -2384,11 +2819,33 @@ printf("sz = %d\n", AES_BLOCK_SIZE); #endif - /* if input and output same will overwrite input iv */ - if ((const byte*)aes->tmp != inBlock) - XMEMCPY(aes->tmp, inBlock, AES_BLOCK_SIZE); - AES_ECB_decrypt(inBlock, outBlock, AES_BLOCK_SIZE, (byte*)aes->key, + /* check alignment, decrypt doesn't need alignment */ + if ((wc_ptr_t)inBlock % AESNI_ALIGN) { + #ifndef NO_WOLFSSL_ALLOC_ALIGN + byte* tmp = (byte*)XMALLOC(AES_BLOCK_SIZE + AESNI_ALIGN, aes->heap, + DYNAMIC_TYPE_TMP_BUFFER); + byte* tmp_align; + if (tmp == NULL) + return MEMORY_E; + + tmp_align = tmp + (AESNI_ALIGN - ((wc_ptr_t)tmp % AESNI_ALIGN)); + + XMEMCPY(tmp_align, inBlock, AES_BLOCK_SIZE); + AES_ECB_encrypt_AESNI(tmp_align, tmp_align, AES_BLOCK_SIZE, + (byte*)aes->key, (int)aes->rounds); + XMEMCPY(outBlock, tmp_align, AES_BLOCK_SIZE); + XFREE(tmp, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); + return 0; + #else + WOLFSSL_MSG("AES-ECB encrypt with bad alignment"); + WOLFSSL_ERROR_VERBOSE(BAD_ALIGN_E); + return BAD_ALIGN_E; + #endif + } + + AES_ECB_encrypt_AESNI(inBlock, outBlock, AES_BLOCK_SIZE, (byte*)aes->key, (int)aes->rounds); + return 0; } else { @@ -2398,21 +2855,106 @@ } #endif /* WOLFSSL_AESNI */ #if defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_AES) - return AES_ECB_decrypt(aes, inBlock, outBlock, AES_BLOCK_SIZE); + AES_ECB_encrypt(aes, inBlock, outBlock, AES_BLOCK_SIZE); + return 0; #endif + #if defined(WOLFSSL_IMXRT_DCP) if (aes->keylen == 16) { - DCPAesEcbDecrypt(aes, outBlock, inBlock, AES_BLOCK_SIZE); + DCPAesEcbEncrypt(aes, outBlock, inBlock, AES_BLOCK_SIZE); return 0; } #endif + #if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_CRYPT) if (aes->useSWCrypt == 0) { return se050_aes_crypt(aes, inBlock, outBlock, AES_BLOCK_SIZE, - AES_DECRYPTION, kAlgorithm_SSS_AES_ECB); + AES_ENCRYPTION, kAlgorithm_SSS_AES_ECB); } #endif +#if defined(WOLFSSL_ESPIDF) && defined(NEED_AES_HW_FALLBACK) + ESP_LOGV(TAG, "wc_AesEncrypt fallback check"); + if (wc_esp32AesSupportedKeyLen(aes)) { + return wc_esp32AesEncrypt(aes, inBlock, outBlock); + } + else { + /* For example, the ESP32-S3 does not support HW for len = 24, + * so fall back to SW */ + #ifdef DEBUG_WOLFSSL + ESP_LOGW(TAG, "wc_AesEncrypt HW Falling back, unsupported keylen = %d", + aes->keylen); + #endif + } +#endif + + AesEncrypt_C(aes, inBlock, outBlock, r); + + return 0; +} /* wc_AesEncrypt */ +#endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT || HAVE_AESGCM */ + +#if defined(HAVE_AES_DECRYPT) +#if (defined(HAVE_AES_CBC) && !defined(WOLFSSL_DEVCRYPTO_CBC) && \ + !defined(WOLFSSL_SILABS_SE_ACCEL)) || \ + defined(WOLFSSL_AES_DIRECT) + +#ifndef WC_AES_BITSLICED +#ifndef WC_NO_CACHE_RESISTANT +#ifndef WOLFSSL_AES_SMALL_TABLES +/* load 4 Td Tables into cache by cache line stride */ +static WARN_UNUSED_RESULT WC_INLINE word32 PreFetchTd(void) +{ + word32 x = 0; + int i,j; + + for (i = 0; i < 4; i++) { + /* 256 elements, each one is 4 bytes */ + for (j = 0; j < 256; j += WC_CACHE_LINE_SZ/4) { + x &= Td[i][j]; + } + } + return x; +} +#endif /* !WOLFSSL_AES_SMALL_TABLES */ + +/* load Td Table4 into cache by cache line stride */ +static WARN_UNUSED_RESULT WC_INLINE word32 PreFetchTd4(void) +{ +#ifndef WOLFSSL_AES_TOUCH_LINES + word32 x = 0; + int i; + + for (i = 0; i < 256; i += WC_CACHE_LINE_SZ) { + x &= (word32)Td4[i]; + } + return x; +#else + return 0; +#endif +} +#endif /* !WC_NO_CACHE_RESISTANT */ + +/* Decrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] inBlock Block to encrypt. + * @param [out] outBlock Encrypted block. + * @param [in] r Rounds divided by 2. + */ +static void AesDecrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r) +{ + word32 s0, s1, s2, s3; + word32 t0, t1, t2, t3; + const word32* rk; + +#ifdef WC_C_DYNAMIC_FALLBACK + rk = aes->key_C_fallback; +#else + rk = aes->key; +#endif + /* * map byte array block to cipher state * and add initial round key: @@ -2623,8 +3165,457 @@ XMEMCPY(outBlock + 2 * sizeof(s0), &s2, sizeof(s2)); XMEMCPY(outBlock + 3 * sizeof(s0), &s3, sizeof(s3)); - return 0; } + +#if defined(HAVE_AES_ECB) && !(defined(WOLFSSL_IMX6_CAAM) && \ + !defined(NO_IMX6_CAAM_AES) && !defined(WOLFSSL_QNX_CAAM)) +/* Decrypt a number of blocks using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + * @param [in] sz Number of blocks to encrypt. + */ +static void AesDecryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz) +{ + word32 i; + + for (i = 0; i < sz; i += AES_BLOCK_SIZE) { + AesDecrypt_C(aes, in, out, aes->rounds >> 1); + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } +} +#endif + +#else /* WC_AES_BITSLICED */ + +/* http://cs-www.cs.yale.edu/homes/peralta/CircuitStuff/Sinv.txt */ +static void bs_inv_sub_bytes(bs_word u[8]) +{ + bs_word U0, U1, U2, U3, U4, U5, U6, U7; + bs_word Y0, Y1, Y2, Y3, Y4, Y5, Y6, Y7; + bs_word RTL0, RTL1, RTL2; + bs_word sa0, sa1; + bs_word sb0, sb1; + bs_word ab0, ab1, ab2, ab3; + bs_word ab20, ab21, ab22, ab23; + bs_word al, ah, aa, bl, bh, bb; + bs_word abcd1, abcd2, abcd3, abcd4, abcd5, abcd6; + bs_word ph11, ph12, ph13, ph01, ph02, ph03; + bs_word pl01, pl02, pl03, pl11, pl12, pl13; + bs_word r1, r2, r3, r4, r5, r6, r7, r8, r9; + bs_word rr1, rr2; + bs_word r10, r11; + bs_word cp1, cp2, cp3, cp4; + bs_word vr1, vr2, vr3; + bs_word pr1, pr2, pr3; + bs_word wr1, wr2, wr3; + bs_word qr1, qr2, qr3; + bs_word tinv1, tinv2, tinv3, tinv4, tinv5, tinv6, tinv7, tinv8, tinv9; + bs_word tinv10, tinv11, tinv12, tinv13; + bs_word t01, t02; + bs_word d0, d1, d2, d3; + bs_word dl, dd, dh; + bs_word sd0, sd1; + bs_word p0, p1, p2, p3, p4, p6, p7; + bs_word X11, X13, X14, X16, X18, X19; + bs_word S0, S1, S2, S3, S4, S5, S6, S7; + + U0 = u[7]; + U1 = u[6]; + U2 = u[5]; + U3 = u[4]; + U4 = u[3]; + U5 = u[2]; + U6 = u[1]; + U7 = u[0]; + + Y0 = U0 ^ U3; + Y2 = ~(U1 ^ U3); + Y4 = U0 ^ Y2; + RTL0 = U6 ^ U7; + Y1 = Y2 ^ RTL0; + Y7 = ~(U2 ^ Y1); + RTL1 = U3 ^ U4; + Y6 = ~(U7 ^ RTL1); + Y3 = Y1 ^ RTL1; + RTL2 = ~(U0 ^ U2); + Y5 = U5 ^ RTL2; + sa1 = Y0 ^ Y2; + sa0 = Y1 ^ Y3; + sb1 = Y4 ^ Y6; + sb0 = Y5 ^ Y7; + ah = Y0 ^ Y1; + al = Y2 ^ Y3; + aa = sa0 ^ sa1; + bh = Y4 ^ Y5; + bl = Y6 ^ Y7; + bb = sb0 ^ sb1; + ab20 = sa0 ^ sb0; + ab22 = al ^ bl; + ab23 = Y3 ^ Y7; + ab21 = sa1 ^ sb1; + abcd1 = ah & bh; + rr1 = Y0 & Y4; + ph11 = ab20 ^ abcd1; + t01 = Y1 & Y5; + ph01 = t01 ^ abcd1; + abcd2 = al & bl; + r1 = Y2 & Y6; + pl11 = ab22 ^ abcd2; + r2 = Y3 & Y7; + pl01 = r2 ^ abcd2; + r3 = sa0 & sb0; + vr1 = aa & bb; + pr1 = vr1 ^ r3; + wr1 = sa1 & sb1; + qr1 = wr1 ^ r3; + ab0 = ph11 ^ rr1; + ab1 = ph01 ^ ab21; + ab2 = pl11 ^ r1; + ab3 = pl01 ^ qr1; + cp1 = ab0 ^ pr1; + cp2 = ab1 ^ qr1; + cp3 = ab2 ^ pr1; + cp4 = ab3 ^ ab23; + tinv1 = cp3 ^ cp4; + tinv2 = cp3 & cp1; + tinv3 = cp2 ^ tinv2; + tinv4 = cp1 ^ cp2; + tinv5 = cp4 ^ tinv2; + tinv6 = tinv5 & tinv4; + tinv7 = tinv3 & tinv1; + d2 = cp4 ^ tinv7; + d0 = cp2 ^ tinv6; + tinv8 = cp1 & cp4; + tinv9 = tinv4 & tinv8; + tinv10 = tinv4 ^ tinv2; + d1 = tinv9 ^ tinv10; + tinv11 = cp2 & cp3; + tinv12 = tinv1 & tinv11; + tinv13 = tinv1 ^ tinv2; + d3 = tinv12 ^ tinv13; + sd1 = d1 ^ d3; + sd0 = d0 ^ d2; + dl = d0 ^ d1; + dh = d2 ^ d3; + dd = sd0 ^ sd1; + abcd3 = dh & bh; + rr2 = d3 & Y4; + t02 = d2 & Y5; + abcd4 = dl & bl; + r4 = d1 & Y6; + r5 = d0 & Y7; + r6 = sd0 & sb0; + vr2 = dd & bb; + wr2 = sd1 & sb1; + abcd5 = dh & ah; + r7 = d3 & Y0; + r8 = d2 & Y1; + abcd6 = dl & al; + r9 = d1 & Y2; + r10 = d0 & Y3; + r11 = sd0 & sa0; + vr3 = dd & aa; + wr3 = sd1 & sa1; + ph12 = rr2 ^ abcd3; + ph02 = t02 ^ abcd3; + pl12 = r4 ^ abcd4; + pl02 = r5 ^ abcd4; + pr2 = vr2 ^ r6; + qr2 = wr2 ^ r6; + p0 = ph12 ^ pr2; + p1 = ph02 ^ qr2; + p2 = pl12 ^ pr2; + p3 = pl02 ^ qr2; + ph13 = r7 ^ abcd5; + ph03 = r8 ^ abcd5; + pl13 = r9 ^ abcd6; + pl03 = r10 ^ abcd6; + pr3 = vr3 ^ r11; + qr3 = wr3 ^ r11; + p4 = ph13 ^ pr3; + S7 = ph03 ^ qr3; + p6 = pl13 ^ pr3; + p7 = pl03 ^ qr3; + S3 = p1 ^ p6; + S6 = p2 ^ p6; + S0 = p3 ^ p6; + X11 = p0 ^ p2; + S5 = S0 ^ X11; + X13 = p4 ^ p7; + X14 = X11 ^ X13; + S1 = S3 ^ X14; + X16 = p1 ^ S7; + S2 = X14 ^ X16; + X18 = p0 ^ p4; + X19 = S5 ^ X16; + S4 = X18 ^ X19; + + u[0] = S7; + u[1] = S6; + u[2] = S5; + u[3] = S4; + u[4] = S3; + u[5] = S2; + u[6] = S1; + u[7] = S0; +} + +static void bs_inv_shift_rows(bs_word* b) +{ + bs_word t[AES_BLOCK_BITS]; + int i; + + for (i = 0; i < 128; i += 32) { + BS_ASSIGN_8(t, i + 0, b, ( 0 + i) & BS_IDX_MASK); + BS_ASSIGN_8(t, i + 8, b, (104 + i) & BS_IDX_MASK); + BS_ASSIGN_8(t, i + 16, b, ( 80 + i) & BS_IDX_MASK); + BS_ASSIGN_8(t, i + 24, b, ( 56 + i) & BS_IDX_MASK); + } + + XMEMCPY(b, t, sizeof(t)); +} + +#define O0 0 +#define O1 8 +#define O2 16 +#define O3 24 + +#define BS_INV_MIX_SHIFT_8(br, b, O0, O1, O2, O3, of0, of1, of2) \ + of0 = b[O0+7] ^ b[O0+6] ^ b[O0+5] ^ b[O1 + 7] ^ b[O1+5] ^ \ + b[O2+6] ^ b[O2+5] ^ b[O3+5]; \ + of1 = b[O0+7] ^ b[O0+6] ^ b[O1+6] ^ \ + b[O2+7] ^ b[O2+6] ^ b[O3+6]; \ + of2 = b[O0+7] ^ b[O1+7] ^ \ + b[O2+7] ^ b[O3+7]; \ + \ + br[0] = b[O1+0] ^ \ + b[O2+0] ^ b[O3+0] ^ of0; \ + br[1] = b[O0+0] ^ b[O1+0] ^ b[O1+1] ^ \ + b[O2+1] ^ b[O3+1] ^ of0 ^ of1; \ + br[2] = b[O0+1] ^ b[O0+0] ^ b[O1+1] ^ b[O1+2] ^ \ + b[O2+2] ^ b[O2+0] ^ b[O3+2] ^ of1 ^ of2; \ + br[3] = b[O0+2] ^ b[O0+1] ^ b[O0+0] ^ b[O1+0] ^ b[O1+2] ^ b[O1+3] ^ \ + b[O2+3] ^ b[O2+1] ^ b[O2+0] ^ b[O3+3] ^ b[O3+0] ^ of0 ^ of2; \ + br[4] = b[O0+3] ^ b[O0+2] ^ b[O0+1] ^ b[O1+1] ^ b[O1+3] ^ b[O1+4] ^ \ + b[O2+4] ^ b[O2+2] ^ b[O2+1] ^ b[O3+4] ^ b[O3+1] ^ of0 ^ of1; \ + br[5] = b[O0+4] ^ b[O0+3] ^ b[O0+2] ^ b[O1+2] ^ b[O1+4] ^ b[O1+5] ^ \ + b[O2+5] ^ b[O2+3] ^ b[O2+2] ^ b[O3+5] ^ b[O3+2] ^ of1 ^ of2; \ + br[6] = b[O0+5] ^ b[O0+4] ^ b[O0+3] ^ b[O1+3] ^ b[O1+5] ^ b[O1+6] ^ \ + b[O2+6] ^ b[O2+4] ^ b[O2+3] ^ b[O3+6] ^ b[O3+3] ^ of2; \ + br[7] = b[O0+6] ^ b[O0+5] ^ b[O0+4] ^ b[O1+4] ^ b[O1+6] ^ b[O1+7] ^ \ + b[O2+7] ^ b[O2+5] ^ b[O2+4] ^ b[O3+7] ^ b[O3+4] + +/* Inverse mix columns and shift rows. */ +static void bs_inv_mix_shift(bs_word* t, bs_word* b) +{ + bs_word* bp = b; + word8 or0 = BS_ROW_OFF_0 + BS_SHIFT_OFF_0; + word8 or1 = BS_ROW_OFF_1 + BS_SHIFT_OFF_1; + word8 or2 = BS_ROW_OFF_2 + BS_SHIFT_OFF_2; + word8 or3 = BS_ROW_OFF_3 + BS_SHIFT_OFF_3; + int i; + + for (i = 0; i < AES_BLOCK_BITS / 4; i += AES_BLOCK_BITS / 16) { + bs_word* br; + bs_word of0; + bs_word of1; + bs_word of2; + + br = t + or0; + BS_INV_MIX_SHIFT_8(br, bp, O0, O1, O2, O3, of0, of1, of2); + br = t + or1; + BS_INV_MIX_SHIFT_8(br, bp, O1, O2, O3, O0, of0, of1, of2); + br = t + or2; + BS_INV_MIX_SHIFT_8(br, bp, O2, O3, O0, O1, of0, of1, of2); + br = t + or3; + BS_INV_MIX_SHIFT_8(br, bp, O3, O0, O1, O2, of0, of1, of2); + + or0 = (or0 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + or1 = (or1 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + or2 = (or2 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + or3 = (or3 + AES_BLOCK_BITS / 4) & BS_IDX_MASK; + + bp += AES_BLOCK_BITS / 4; + } +} + +static void bs_inv_sub_bytes_blocks(bs_word* b) +{ + int i; + + for (i = 0; i < AES_BLOCK_BITS; i += 8) { + bs_inv_sub_bytes(b + i); + } +} + +static void bs_decrypt(bs_word* state, bs_word* rk, word32 r) +{ + int i; + bs_word trans[AES_BLOCK_BITS]; + + bs_transpose(trans, state); + + rk += r * AES_BLOCK_BITS; + bs_add_round_key(trans, trans, rk); + bs_inv_shift_rows(trans); + bs_inv_sub_bytes_blocks(trans); + rk -= AES_BLOCK_BITS; + bs_add_round_key(trans, trans, rk); + for (i = (int)r - 2; i >= 0; i--) { + bs_inv_mix_shift(state, trans); + bs_inv_sub_bytes_blocks(state); + rk -= AES_BLOCK_BITS; + bs_add_round_key(trans, state, rk); + } + + bs_inv_transpose(state, trans); +} + +#ifdef WOLFSSL_AES_DIRECT +/* Decrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] inBlock Block to encrypt. + * @param [out] outBlock Encrypted block. + * @param [in] r Rounds divided by 2. + */ +static void AesDecrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r) +{ + bs_word state[AES_BLOCK_BITS]; + + (void)r; + + XMEMCPY(state, inBlock, AES_BLOCK_SIZE); + XMEMSET(((byte*)state) + AES_BLOCK_SIZE, 0, sizeof(state) - AES_BLOCK_SIZE); + + bs_decrypt(state, aes->bs_key, aes->rounds); + + XMEMCPY(outBlock, state, AES_BLOCK_SIZE); +} +#endif + +#if defined(HAVE_AES_ECB) && !(defined(WOLFSSL_IMX6_CAAM) && \ + !defined(NO_IMX6_CAAM_AES) && !defined(WOLFSSL_QNX_CAAM)) +/* Decrypt a number of blocks using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + * @param [in] sz Number of blocks to encrypt. + */ +static void AesDecryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz) +{ + bs_word state[AES_BLOCK_BITS]; + + while (sz >= BS_BLOCK_SIZE) { + XMEMCPY(state, in, BS_BLOCK_SIZE); + bs_decrypt(state, aes->bs_key, aes->rounds); + XMEMCPY(out, state, BS_BLOCK_SIZE); + sz -= BS_BLOCK_SIZE; + in += BS_BLOCK_SIZE; + out += BS_BLOCK_SIZE; + } + if (sz > 0) { + XMEMCPY(state, in, sz); + XMEMSET(((byte*)state) + sz, 0, sizeof(state) - sz); + bs_decrypt(state, aes->bs_key, aes->rounds); + XMEMCPY(out, state, sz); + } +} +#endif + +#endif /* !WC_AES_BITSLICED */ + +#if !defined(WC_AES_BITSLICED) || defined(WOLFSSL_AES_DIRECT) +/* Software AES - ECB Decrypt */ +static WARN_UNUSED_RESULT int wc_AesDecrypt( + Aes* aes, const byte* inBlock, byte* outBlock) +{ + word32 r; + + if (aes == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + + r = aes->rounds >> 1; + + if (r > 7 || r == 0) { + WOLFSSL_ERROR_VERBOSE(KEYUSAGE_E); + return KEYUSAGE_E; + } + +#ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + ASSERT_SAVED_VECTOR_REGISTERS(); + + #ifdef DEBUG_AESNI + printf("about to aes decrypt\n"); + printf("in = %p\n", inBlock); + printf("out = %p\n", outBlock); + printf("aes->key = %p\n", aes->key); + printf("aes->rounds = %d\n", aes->rounds); + printf("sz = %d\n", AES_BLOCK_SIZE); + #endif + + /* if input and output same will overwrite input iv */ + if ((const byte*)aes->tmp != inBlock) + XMEMCPY(aes->tmp, inBlock, AES_BLOCK_SIZE); + AES_ECB_decrypt_AESNI(inBlock, outBlock, AES_BLOCK_SIZE, (byte*)aes->key, + (int)aes->rounds); + return 0; + } + else { + #ifdef DEBUG_AESNI + printf("Skipping AES-NI\n"); + #endif + } +#endif /* WOLFSSL_AESNI */ +#if defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_AES) + return AES_ECB_decrypt(aes, inBlock, outBlock, AES_BLOCK_SIZE); +#endif +#if defined(WOLFSSL_IMXRT_DCP) + if (aes->keylen == 16) { + DCPAesEcbDecrypt(aes, outBlock, inBlock, AES_BLOCK_SIZE); + return 0; + } +#endif +#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_CRYPT) + if (aes->useSWCrypt == 0) { + return se050_aes_crypt(aes, inBlock, outBlock, AES_BLOCK_SIZE, + AES_DECRYPTION, kAlgorithm_SSS_AES_ECB); + } +#endif +#if defined(WOLFSSL_ESPIDF) && defined(NEED_AES_HW_FALLBACK) + if (wc_esp32AesSupportedKeyLen(aes)) { + return wc_esp32AesDecrypt(aes, inBlock, outBlock); + } + else { + /* For example, the ESP32-S3 does not support HW for len = 24, + * so fall back to SW */ + #ifdef DEBUG_WOLFSSL + ESP_LOGW(TAG, "wc_AesDecrypt HW Falling back, " + "unsupported keylen = %d", aes->keylen); + #endif + } /* else !wc_esp32AesSupportedKeyLen for ESP32 */ +#endif + + AesDecrypt_C(aes, inBlock, outBlock, r); + + return 0; +} /* wc_AesDecrypt[_SW]() */ +#endif /* !WC_AES_BITSLICED || WOLFSSL_AES_DIRECT */ #endif /* HAVE_AES_CBC || WOLFSSL_AES_DIRECT */ #endif /* HAVE_AES_DECRYPT */ @@ -2650,6 +3641,14 @@ return BAD_FUNC_ARG; } +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + rk = aes->key; aes->keylen = keylen; aes->rounds = keylen/4 + 6; @@ -2723,6 +3722,14 @@ if (aes == NULL) return BAD_FUNC_ARG; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + aes->keylen = keylen; aes->rounds = keylen/4 + 6; XMEMCPY(aes->key, userKey, keylen); @@ -2738,12 +3745,26 @@ return 0; } #elif defined(FREESCALE_LTC) - int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, - int dir) + int wc_AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen, + const byte* iv, int dir, int checkKeyLen) { - if (aes == NULL || !((keylen == 16) || (keylen == 24) || (keylen == 32))) + if (aes == NULL) return BAD_FUNC_ARG; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + + if (checkKeyLen) { + if (!((keylen == 16) || (keylen == 24) || (keylen == 32))) + return BAD_FUNC_ARG; + } + (void)dir; + aes->rounds = keylen/4 + 6; XMEMCPY(aes->key, userKey, keylen); @@ -2755,14 +3776,21 @@ return wc_AesSetIV(aes, iv); } + int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, + const byte* iv, int dir) + { + return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 1); + } + + int wc_AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, int dir) { return wc_AesSetKey(aes, userKey, keylen, iv, dir); } #elif defined(FREESCALE_MMCAU) - int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, - const byte* iv, int dir) + int wc_AesSetKeyLocal(Aes* aes, const byte* userKey, word32 keylen, + const byte* iv, int dir, int checkKeyLen) { int ret; byte* rk; @@ -2772,11 +3800,22 @@ (void)dir; - if (!((keylen == 16) || (keylen == 24) || (keylen == 32))) - return BAD_FUNC_ARG; if (aes == NULL) return BAD_FUNC_ARG; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + + if (checkKeyLen) { + if (!((keylen == 16) || (keylen == 24) || (keylen == 32))) + return BAD_FUNC_ARG; + } + rk = (byte*)aes->key; if (rk == NULL) return BAD_FUNC_ARG; @@ -2827,6 +3866,12 @@ return ret; } + int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, + const byte* iv, int dir) + { + return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 1); + } + int wc_AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, int dir) { @@ -2845,6 +3890,12 @@ if (aes == NULL || keylen != 16) return BAD_FUNC_ARG; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + aes->keylen = keylen; aes->rounds = keylen/4 + 6; XMEMCPY(aes->key, userKey, keylen); @@ -2863,19 +3914,28 @@ { return wc_AesSetKey(aes, userKey, keylen, iv, dir); } -#elif defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES) - - int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, +#elif defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_AES) + /* This is the only definition for HW only. + * but needs to be renamed when fallback needed. + * See call in wc_AesSetKey() */ + int wc_AesSetKey_for_ESP32(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, int dir) { (void)dir; (void)iv; - + ESP_LOGV(TAG, "wc_AesSetKey_for_ESP32"); if (aes == NULL || (keylen != 16 && keylen != 24 && keylen != 32)) { return BAD_FUNC_ARG; } +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + #if !defined(WOLFSSL_AES_128) if (keylen == 16) { return BAD_FUNC_ARG; @@ -2902,13 +3962,9 @@ aes->left = 0; #endif return wc_AesSetIV(aes, iv); - } + } /* wc_AesSetKey */ - int wc_AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen, - const byte* iv, int dir) - { - return wc_AesSetKey(aes, userKey, keylen, iv, dir); - } + /* end #elif ESP32 */ #elif defined(WOLFSSL_CRYPTOCELL) && defined(WOLFSSL_CRYPTOCELL_AES) int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, @@ -2923,6 +3979,16 @@ keylen != AES_256_KEY_SIZE)) { return BAD_FUNC_ARG; } + +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret2 = + wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret2 < 0) + return ret2; + } +#endif + #if defined(AES_MAX_KEY_SIZE) if (keylen > (AES_MAX_KEY_SIZE/8)) { return BAD_FUNC_ARG; @@ -2996,26 +4062,303 @@ /* implemented in wolfcrypt/src/port/devcrypto/devcrypto_aes.c */ #elif defined(WOLFSSL_SILABS_SE_ACCEL) - /* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */ + /* implemented in wolfcrypt/src/port/silabs/silabs_aes.c */ + +#elif defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_AES) + /* implemented in wolfcrypt/src/port/renesas/renesas_fspsm_aes.c */ + +#else + #define NEED_SOFTWARE_AES_SETKEY +#endif + +/* Either we fell though with no HW support at all, + * or perhaps there's HW support for *some* keylengths + * and we need both HW and SW. */ +#ifdef NEED_SOFTWARE_AES_SETKEY + +#ifdef NEED_AES_TABLES + +#ifndef WC_AES_BITSLICED +/* Set the AES key and expand. + * + * @param [in] aes AES object. + * @param [in] key Block to encrypt. + * @param [in] keySz Number of bytes in key. + * @param [in] dir Direction of crypt: AES_ENCRYPTION or AES_DECRYPTION. + */ +static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir) +{ +#ifdef WC_C_DYNAMIC_FALLBACK + word32* rk = aes->key_C_fallback; +#else + word32* rk = aes->key; +#endif + word32 temp; + unsigned int i = 0; + + XMEMCPY(rk, key, keySz); +#if defined(LITTLE_ENDIAN_ORDER) && !defined(WOLFSSL_PIC32MZ_CRYPT) && \ + (!defined(WOLFSSL_ESP32_CRYPT) || defined(NO_WOLFSSL_ESP32_CRYPT_AES)) + /* Always reverse words when using only SW */ + { + ByteReverseWords(rk, rk, keySz); + } +#else + /* Sometimes reverse words when using supported HW */ + #if defined(WOLFSSL_ESPIDF) + /* Some platforms may need SW fallback (e.g. AES192) */ + #if defined(NEED_AES_HW_FALLBACK) + { + ESP_LOGV(TAG, "wc_AesEncrypt fallback check"); + if (wc_esp32AesSupportedKeyLen(aes)) { + /* don't reverse for HW supported key lengths */ + } + else { + ByteReverseWords(rk, rk, keySz); + } + } + #else + /* If we don't need SW fallback, don't need to reverse words. */ + #endif /* NEED_AES_HW_FALLBACK */ + #endif /* WOLFSSL_ESPIDF */ +#endif /* LITTLE_ENDIAN_ORDER, etc */ + + switch (keySz) { +#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 128 && \ + defined(WOLFSSL_AES_128) + case 16: + #ifdef WOLFSSL_CHECK_MEM_ZERO + temp = (word32)-1; + wc_MemZero_Add("wc_AesSetKeyLocal temp", &temp, sizeof(temp)); + #endif + while (1) + { + temp = rk[3]; + rk[4] = rk[0] ^ + #ifndef WOLFSSL_AES_SMALL_TABLES + (GetTable(Te[2], GETBYTE(temp, 2)) & 0xff000000) ^ + (GetTable(Te[3], GETBYTE(temp, 1)) & 0x00ff0000) ^ + (GetTable(Te[0], GETBYTE(temp, 0)) & 0x0000ff00) ^ + (GetTable(Te[1], GETBYTE(temp, 3)) & 0x000000ff) ^ + #else + ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 0)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 3))) ^ + #endif + rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) + break; + rk += 4; + } + break; +#endif /* 128 */ + +#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 192 && \ + defined(WOLFSSL_AES_192) + case 24: + #ifdef WOLFSSL_CHECK_MEM_ZERO + temp = (word32)-1; + wc_MemZero_Add("wc_AesSetKeyLocal temp", &temp, sizeof(temp)); + #endif + /* for (;;) here triggers a bug in VC60 SP4 w/ Pro Pack */ + while (1) + { + temp = rk[ 5]; + rk[ 6] = rk[ 0] ^ + #ifndef WOLFSSL_AES_SMALL_TABLES + (GetTable(Te[2], GETBYTE(temp, 2)) & 0xff000000) ^ + (GetTable(Te[3], GETBYTE(temp, 1)) & 0x00ff0000) ^ + (GetTable(Te[0], GETBYTE(temp, 0)) & 0x0000ff00) ^ + (GetTable(Te[1], GETBYTE(temp, 3)) & 0x000000ff) ^ + #else + ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 0)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 3))) ^ + #endif + rcon[i]; + rk[ 7] = rk[ 1] ^ rk[ 6]; + rk[ 8] = rk[ 2] ^ rk[ 7]; + rk[ 9] = rk[ 3] ^ rk[ 8]; + if (++i == 8) + break; + rk[10] = rk[ 4] ^ rk[ 9]; + rk[11] = rk[ 5] ^ rk[10]; + rk += 6; + } + break; +#endif /* 192 */ + +#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 256 && \ + defined(WOLFSSL_AES_256) + case 32: + #ifdef WOLFSSL_CHECK_MEM_ZERO + temp = (word32)-1; + wc_MemZero_Add("wc_AesSetKeyLocal temp", &temp, sizeof(temp)); + #endif + while (1) + { + temp = rk[ 7]; + rk[ 8] = rk[ 0] ^ + #ifndef WOLFSSL_AES_SMALL_TABLES + (GetTable(Te[2], GETBYTE(temp, 2)) & 0xff000000) ^ + (GetTable(Te[3], GETBYTE(temp, 1)) & 0x00ff0000) ^ + (GetTable(Te[0], GETBYTE(temp, 0)) & 0x0000ff00) ^ + (GetTable(Te[1], GETBYTE(temp, 3)) & 0x000000ff) ^ + #else + ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 0)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 3))) ^ + #endif + rcon[i]; + rk[ 9] = rk[ 1] ^ rk[ 8]; + rk[10] = rk[ 2] ^ rk[ 9]; + rk[11] = rk[ 3] ^ rk[10]; + if (++i == 7) + break; + temp = rk[11]; + rk[12] = rk[ 4] ^ + #ifndef WOLFSSL_AES_SMALL_TABLES + (GetTable(Te[2], GETBYTE(temp, 3)) & 0xff000000) ^ + (GetTable(Te[3], GETBYTE(temp, 2)) & 0x00ff0000) ^ + (GetTable(Te[0], GETBYTE(temp, 1)) & 0x0000ff00) ^ + (GetTable(Te[1], GETBYTE(temp, 0)) & 0x000000ff); + #else + ((word32)GetTable8(Tsbox, GETBYTE(temp, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(temp, 0))); + #endif + rk[13] = rk[ 5] ^ rk[12]; + rk[14] = rk[ 6] ^ rk[13]; + rk[15] = rk[ 7] ^ rk[14]; + + rk += 8; + } + break; +#endif /* 256 */ + } /* switch */ + ForceZero(&temp, sizeof(temp)); + +#if defined(HAVE_AES_DECRYPT) + if (dir == AES_DECRYPTION) { + unsigned int j; + +#ifdef WC_C_DYNAMIC_FALLBACK + rk = aes->key_C_fallback; +#else + rk = aes->key; +#endif + /* invert the order of the round keys: */ + for (i = 0, j = 4* aes->rounds; i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; + } + ForceZero(&temp, sizeof(temp)); + #if !defined(WOLFSSL_AES_SMALL_TABLES) + /* apply the inverse MixColumn transform to all round keys but the + first and the last: */ + for (i = 1; i < aes->rounds; i++) { + rk += 4; + rk[0] = + GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[0], 3)) & 0xff) ^ + GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[0], 2)) & 0xff) ^ + GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[0], 1)) & 0xff) ^ + GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[0], 0)) & 0xff); + rk[1] = + GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[1], 3)) & 0xff) ^ + GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[1], 2)) & 0xff) ^ + GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[1], 1)) & 0xff) ^ + GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[1], 0)) & 0xff); + rk[2] = + GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[2], 3)) & 0xff) ^ + GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[2], 2)) & 0xff) ^ + GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[2], 1)) & 0xff) ^ + GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[2], 0)) & 0xff); + rk[3] = + GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[3], 3)) & 0xff) ^ + GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[3], 2)) & 0xff) ^ + GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[3], 1)) & 0xff) ^ + GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[3], 0)) & 0xff); + } + #endif + } +#else + (void)dir; +#endif /* HAVE_AES_DECRYPT */ + +#ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(&temp, sizeof(temp)); #else + (void)temp; +#endif +} +#else /* WC_AES_BITSLICED */ +/* Set the AES key and expand. + * + * @param [in] aes AES object. + * @param [in] key Block to encrypt. + * @param [in] keySz Number of bytes in key. + * @param [in] dir Direction of crypt: AES_ENCRYPTION or AES_DECRYPTION. + */ +static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir) +{ + /* No need to invert when decrypting. */ + (void)dir; + bs_set_key(aes->bs_key, key, keySz, aes->rounds); +} +#endif /* WC_AES_BITSLICED */ + +#endif /* NEED_AES_TABLES */ + +#ifndef WOLFSSL_RISCV_ASM /* Software AES - SetKey */ static WARN_UNUSED_RESULT int wc_AesSetKeyLocal( Aes* aes, const byte* userKey, word32 keylen, const byte* iv, int dir, int checkKeyLen) { int ret; - word32 *rk; - #ifdef NEED_AES_TABLES - word32 temp; - unsigned int i = 0; - #endif #ifdef WOLFSSL_IMX6_CAAM_BLOB byte local[32]; word32 localSz = 32; #endif + if (aes == NULL) + return BAD_FUNC_ARG; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; +#endif + + switch (keylen) { + #if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 128 && \ + defined(WOLFSSL_AES_128) + case 16: + #endif + #if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 192 && \ + defined(WOLFSSL_AES_192) + case 24: + #endif + #if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 256 && \ + defined(WOLFSSL_AES_256) + case 32: + #endif + break; + default: + return BAD_FUNC_ARG; + } + #ifdef WOLFSSL_MAXQ10XX_CRYPTO if (wc_MAXQ10XX_AesSetKey(aes, userKey, keylen) != 0) { return WC_HW_E; @@ -3113,12 +4456,21 @@ aes->keylen = (int)keylen; aes->rounds = (keylen/4) + 6; + ret = wc_AesSetIV(aes, iv); + if (ret != 0) + return ret; + +#ifdef WC_C_DYNAMIC_FALLBACK +#ifdef NEED_AES_TABLES + AesSetKey_C(aes, userKey, keylen, dir); +#endif /* NEED_AES_TABLES */ +#endif /* WC_C_DYNAMIC_FALLBACK */ #ifdef WOLFSSL_AESNI aes->use_aesni = 0; - if (checkAESNI == 0) { + if (checkedAESNI == 0) { haveAESNI = Check_CPU_support_AES(); - checkAESNI = 1; + checkedAESNI = 1; } if (haveAESNI) { #ifdef WOLFSSL_LINUXKM @@ -3126,18 +4478,33 @@ if ((wc_ptr_t)&aes->key & (wc_ptr_t)0xf) { return BAD_ALIGN_E; } - #endif - aes->use_aesni = 1; - if (iv) - XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); - else - XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); - if (dir == AES_ENCRYPTION) - return AES_set_encrypt_key(userKey, (int)keylen * 8, aes); - #ifdef HAVE_AES_DECRYPT - else - return AES_set_decrypt_key(userKey, (int)keylen * 8, aes); - #endif + #endif /* WOLFSSL_LINUXKM */ + ret = SAVE_VECTOR_REGISTERS2(); + if (ret == 0) { + if (dir == AES_ENCRYPTION) + ret = AES_set_encrypt_key_AESNI(userKey, (int)keylen * 8, aes); +#ifdef HAVE_AES_DECRYPT + else + ret = AES_set_decrypt_key_AESNI(userKey, (int)keylen * 8, aes); +#endif + + RESTORE_VECTOR_REGISTERS(); + + if (ret == 0) + aes->use_aesni = 1; + else { +#ifdef WC_C_DYNAMIC_FALLBACK + ret = 0; +#endif + } + return ret; + } else { +#ifdef WC_C_DYNAMIC_FALLBACK + return 0; +#else + return ret; +#endif + } } #endif /* WOLFSSL_AESNI */ @@ -3171,194 +4538,49 @@ } #endif - rk = aes->key; - XMEMCPY(rk, userKey, keylen); - #if defined(LITTLE_ENDIAN_ORDER) && !defined(WOLFSSL_PIC32MZ_CRYPT) && \ - (!defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES)) - ByteReverseWords(rk, rk, keylen); - #endif + XMEMCPY(aes->key, userKey, keylen); - #ifdef WOLFSSL_IMXRT_DCP - /* Implemented in wolfcrypt/src/port/nxp/dcp_port.c */ - temp = 0; - if (keylen == 16) - temp = DCPAesSetKey(aes, userKey, keylen, iv, dir); - if (temp != 0) - return WC_HW_E; - #endif +#ifndef WC_AES_BITSLICED + #if defined(LITTLE_ENDIAN_ORDER) && !defined(WOLFSSL_PIC32MZ_CRYPT) && \ + (!defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_AES)) -#ifdef NEED_AES_TABLES - switch (keylen) { - #if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 128 && \ - defined(WOLFSSL_AES_128) - case 16: - #ifdef WOLFSSL_CHECK_MEM_ZERO - temp = (word32)-1; - wc_MemZero_Add("wc_AesSetKeyLocal temp", &temp, sizeof(temp)); - #endif - while (1) - { - temp = rk[3]; - rk[4] = rk[0] ^ - #ifndef WOLFSSL_AES_SMALL_TABLES - (GetTable(Te[2], GETBYTE(temp, 2)) & 0xff000000) ^ - (GetTable(Te[3], GETBYTE(temp, 1)) & 0x00ff0000) ^ - (GetTable(Te[0], GETBYTE(temp, 0)) & 0x0000ff00) ^ - (GetTable(Te[1], GETBYTE(temp, 3)) & 0x000000ff) ^ - #else - ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 24) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 16) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 0)) << 8) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 3))) ^ - #endif - rcon[i]; - rk[5] = rk[1] ^ rk[4]; - rk[6] = rk[2] ^ rk[5]; - rk[7] = rk[3] ^ rk[6]; - if (++i == 10) - break; - rk += 4; - } - break; - #endif /* 128 */ + /* software */ + ByteReverseWords(aes->key, aes->key, keylen); - #if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 192 && \ - defined(WOLFSSL_AES_192) - case 24: - #ifdef WOLFSSL_CHECK_MEM_ZERO - temp = (word32)-1; - wc_MemZero_Add("wc_AesSetKeyLocal temp", &temp, sizeof(temp)); - #endif - /* for (;;) here triggers a bug in VC60 SP4 w/ Pro Pack */ - while (1) - { - temp = rk[ 5]; - rk[ 6] = rk[ 0] ^ - #ifndef WOLFSSL_AES_SMALL_TABLES - (GetTable(Te[2], GETBYTE(temp, 2)) & 0xff000000) ^ - (GetTable(Te[3], GETBYTE(temp, 1)) & 0x00ff0000) ^ - (GetTable(Te[0], GETBYTE(temp, 0)) & 0x0000ff00) ^ - (GetTable(Te[1], GETBYTE(temp, 3)) & 0x000000ff) ^ - #else - ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 24) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 16) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 0)) << 8) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 3))) ^ - #endif - rcon[i]; - rk[ 7] = rk[ 1] ^ rk[ 6]; - rk[ 8] = rk[ 2] ^ rk[ 7]; - rk[ 9] = rk[ 3] ^ rk[ 8]; - if (++i == 8) - break; - rk[10] = rk[ 4] ^ rk[ 9]; - rk[11] = rk[ 5] ^ rk[10]; - rk += 6; - } - break; - #endif /* 192 */ + #elif defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_AES) + if (wc_esp32AesSupportedKeyLen(aes)) { + /* supported lengths don't get reversed */ + ESP_LOGV(TAG, "wc_AesSetKeyLocal (no ByteReverseWords)"); + } + else { + word32* rk = aes->key; - #if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 256 && \ - defined(WOLFSSL_AES_256) - case 32: - #ifdef WOLFSSL_CHECK_MEM_ZERO - temp = (word32)-1; - wc_MemZero_Add("wc_AesSetKeyLocal temp", &temp, sizeof(temp)); + /* For example, the ESP32-S3 does not support HW for len = 24, + * so fall back to SW */ + #ifdef DEBUG_WOLFSSL + ESP_LOGW(TAG, "wc_AesSetKeyLocal ByteReverseWords"); #endif - while (1) - { - temp = rk[ 7]; - rk[ 8] = rk[ 0] ^ - #ifndef WOLFSSL_AES_SMALL_TABLES - (GetTable(Te[2], GETBYTE(temp, 2)) & 0xff000000) ^ - (GetTable(Te[3], GETBYTE(temp, 1)) & 0x00ff0000) ^ - (GetTable(Te[0], GETBYTE(temp, 0)) & 0x0000ff00) ^ - (GetTable(Te[1], GETBYTE(temp, 3)) & 0x000000ff) ^ - #else - ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 24) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 16) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 0)) << 8) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 3))) ^ - #endif - rcon[i]; - rk[ 9] = rk[ 1] ^ rk[ 8]; - rk[10] = rk[ 2] ^ rk[ 9]; - rk[11] = rk[ 3] ^ rk[10]; - if (++i == 7) - break; - temp = rk[11]; - rk[12] = rk[ 4] ^ - #ifndef WOLFSSL_AES_SMALL_TABLES - (GetTable(Te[2], GETBYTE(temp, 3)) & 0xff000000) ^ - (GetTable(Te[3], GETBYTE(temp, 2)) & 0x00ff0000) ^ - (GetTable(Te[0], GETBYTE(temp, 1)) & 0x0000ff00) ^ - (GetTable(Te[1], GETBYTE(temp, 0)) & 0x000000ff); - #else - ((word32)GetTable8(Tsbox, GETBYTE(temp, 3)) << 24) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 2)) << 16) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 1)) << 8) ^ - ((word32)GetTable8(Tsbox, GETBYTE(temp, 0))); - #endif - rk[13] = rk[ 5] ^ rk[12]; - rk[14] = rk[ 6] ^ rk[13]; - rk[15] = rk[ 7] ^ rk[14]; - - rk += 8; - } - break; - #endif /* 256 */ - - default: - return BAD_FUNC_ARG; - } /* switch */ - ForceZero(&temp, sizeof(temp)); - - #if defined(HAVE_AES_DECRYPT) - if (dir == AES_DECRYPTION) { - unsigned int j; - rk = aes->key; + XMEMCPY(rk, userKey, keylen); + /* When not ESP32 HW, we need to reverse endianness */ + ByteReverseWords(rk, rk, keylen); + } + #endif - /* invert the order of the round keys: */ - for (i = 0, j = 4* aes->rounds; i < j; i += 4, j -= 4) { - temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; - temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; - temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; - temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; - } - ForceZero(&temp, sizeof(temp)); - #if !defined(WOLFSSL_AES_SMALL_TABLES) - /* apply the inverse MixColumn transform to all round keys but the - first and the last: */ - for (i = 1; i < aes->rounds; i++) { - rk += 4; - rk[0] = - GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[0], 3)) & 0xff) ^ - GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[0], 2)) & 0xff) ^ - GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[0], 1)) & 0xff) ^ - GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[0], 0)) & 0xff); - rk[1] = - GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[1], 3)) & 0xff) ^ - GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[1], 2)) & 0xff) ^ - GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[1], 1)) & 0xff) ^ - GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[1], 0)) & 0xff); - rk[2] = - GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[2], 3)) & 0xff) ^ - GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[2], 2)) & 0xff) ^ - GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[2], 1)) & 0xff) ^ - GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[2], 0)) & 0xff); - rk[3] = - GetTable(Td[0], GetTable(Te[1], GETBYTE(rk[3], 3)) & 0xff) ^ - GetTable(Td[1], GetTable(Te[1], GETBYTE(rk[3], 2)) & 0xff) ^ - GetTable(Td[2], GetTable(Te[1], GETBYTE(rk[3], 1)) & 0xff) ^ - GetTable(Td[3], GetTable(Te[1], GETBYTE(rk[3], 0)) & 0xff); - } - #endif + #ifdef WOLFSSL_IMXRT_DCP + { + /* Implemented in wolfcrypt/src/port/nxp/dcp_port.c */ + word32 temp = 0; + if (keylen == 16) + temp = DCPAesSetKey(aes, userKey, keylen, iv, dir); + if (temp != 0) + return WC_HW_E; } - #else - (void)dir; - #endif /* HAVE_AES_DECRYPT */ - (void)temp; + #endif +#endif /* !WC_AES_BITSLICED */ + +#ifdef NEED_AES_TABLES + AesSetKey_C(aes, userKey, keylen, dir); #endif /* NEED_AES_TABLES */ #if defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_AES) @@ -3377,14 +4599,11 @@ #ifdef WOLFSSL_IMX6_CAAM_BLOB ForceZero(local, sizeof(local)); #endif - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(&temp, sizeof(temp)); - #endif return ret; - } + } /* wc_AesSetKeyLocal */ int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, - const byte* iv, int dir) + const byte* iv, int dir) { if (aes == NULL) { return BAD_FUNC_ARG; @@ -3393,24 +4612,46 @@ return BAD_FUNC_ARG; } + /* sometimes hardware may not support all keylengths (e.g. ESP32-S3) */ + #if defined(WOLFSSL_ESPIDF) && defined(NEED_AES_HW_FALLBACK) + ESP_LOGV(TAG, "wc_AesSetKey fallback check %d", keylen); + if (wc_esp32AesSupportedKeyLenValue(keylen)) { + ESP_LOGV(TAG, "wc_AesSetKey calling wc_AesSetKey_for_ESP32"); + return wc_AesSetKey_for_ESP32(aes, userKey, keylen, iv, dir); + } + else { + #if defined(WOLFSSL_HW_METRICS) + /* It is interesting to know how many times we could not complete + * AES in hardware due to unsupported lengths. */ + wc_esp32AesUnupportedLengthCountAdd(); + #endif + #ifdef DEBUG_WOLFSSL + ESP_LOGW(TAG, "wc_AesSetKey HW Fallback, unsupported keylen = %d", + keylen); + #endif + } + #endif /* WOLFSSL_ESPIDF && NEED_AES_HW_FALLBACK */ + return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 1); - } + + } /* wc_AesSetKey() */ +#endif #if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) /* AES-CTR and AES-DIRECT need to use this for key setup */ /* This function allows key sizes that are not 128/192/256 bits */ - int wc_AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen, - const byte* iv, int dir) - { - if (aes == NULL) { - return BAD_FUNC_ARG; - } - if (keylen > sizeof(aes->key)) { - return BAD_FUNC_ARG; - } - - return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 0); + int wc_AesSetKeyDirect(Aes* aes, const byte* userKey, word32 keylen, + const byte* iv, int dir) + { + if (aes == NULL) { + return BAD_FUNC_ARG; } + if (keylen > sizeof(aes->key)) { + return BAD_FUNC_ARG; + } + + return wc_AesSetKeyLocal(aes, userKey, keylen, iv, dir, 0); + } #endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ #endif /* wc_AesSetKey block */ @@ -3421,6 +4662,14 @@ if (aes == NULL) return BAD_FUNC_ARG; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + { + int ret = wc_debug_CipherLifecycleCheck(aes->CipherLifecycleTag, 0); + if (ret < 0) + return ret; + } +#endif + if (iv) XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); else @@ -3435,6 +4684,50 @@ return 0; } +#ifdef WOLFSSL_AESNI + +#ifdef WC_C_DYNAMIC_FALLBACK + +#define VECTOR_REGISTERS_PUSH { \ + int orig_use_aesni = aes->use_aesni; \ + if (aes->use_aesni && (SAVE_VECTOR_REGISTERS2() != 0)) { \ + aes->use_aesni = 0; \ + } \ + WC_DO_NOTHING + +#define VECTOR_REGISTERS_POP \ + if (aes->use_aesni) \ + RESTORE_VECTOR_REGISTERS(); \ + else \ + aes->use_aesni = orig_use_aesni; \ + } \ + WC_DO_NOTHING + +#else + +#define VECTOR_REGISTERS_PUSH { \ + if (aes->use_aesni && ((ret = SAVE_VECTOR_REGISTERS2()) != 0)) { \ + return ret; \ + } \ + WC_DO_NOTHING + +#define VECTOR_REGISTERS_POP \ + if (aes->use_aesni) { \ + RESTORE_VECTOR_REGISTERS(); \ + } \ + } \ + WC_DO_NOTHING + +#endif + +#else /* !WOLFSSL_AESNI */ + +#define VECTOR_REGISTERS_PUSH { WC_DO_NOTHING +#define VECTOR_REGISTERS_POP } WC_DO_NOTHING + +#endif /* !WOLFSSL_AESNI */ + + /* AES-DIRECT */ #if defined(WOLFSSL_AES_DIRECT) #if defined(HAVE_COLDFIRE_SEC) @@ -3450,53 +4743,43 @@ #elif defined(WOLFSSL_DEVCRYPTO_AES) /* implemented in wolfcrypt/src/port/devcrypt/devcrypto_aes.c */ - #elif defined(WOLFSSL_LINUXKM) && defined(WOLFSSL_AESNI) + #else - WARN_UNUSED_RESULT int wc_AesEncryptDirect( - Aes* aes, byte* out, const byte* in) + /* Allow direct access to one block encrypt */ + int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) { int ret; - if (haveAESNI && aes->use_aesni) - SAVE_VECTOR_REGISTERS(return _svr_ret;); + + if (aes == NULL) + return BAD_FUNC_ARG; + VECTOR_REGISTERS_PUSH; ret = wc_AesEncrypt(aes, in, out); - if (haveAESNI && aes->use_aesni) - RESTORE_VECTOR_REGISTERS(); + VECTOR_REGISTERS_POP; return ret; } + /* vector reg save/restore is explicit in all below calls to * wc_Aes{En,De}cryptDirect(), so bypass the public version with a * macro. */ #define wc_AesEncryptDirect(aes, out, in) wc_AesEncrypt(aes, in, out) + #ifdef HAVE_AES_DECRYPT /* Allow direct access to one block decrypt */ - WARN_UNUSED_RESULT int wc_AesDecryptDirect( - Aes* aes, byte* out, const byte* in) + int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) { int ret; - if (haveAESNI && aes->use_aesni) - SAVE_VECTOR_REGISTERS(return _svr_ret;); + + if (aes == NULL) + return BAD_FUNC_ARG; + VECTOR_REGISTERS_PUSH; ret = wc_AesDecrypt(aes, in, out); - if (haveAESNI && aes->use_aesni) - RESTORE_VECTOR_REGISTERS(); + VECTOR_REGISTERS_POP; return ret; } - #define wc_AesDecryptDirect(aes, out, in) wc_AesDecrypt(aes, in, out) - #endif /* HAVE_AES_DECRYPT */ - #else + #define wc_AesDecryptDirect(aes, out, in) wc_AesDecrypt(aes, in, out) - /* Allow direct access to one block encrypt */ - int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) - { - return wc_AesEncrypt(aes, in, out); - } - #ifdef HAVE_AES_DECRYPT - /* Allow direct access to one block decrypt */ - int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) - { - return wc_AesDecrypt(aes, in, out); - } #endif /* HAVE_AES_DECRYPT */ #endif /* AES direct block */ #endif /* WOLFSSL_AES_DIRECT */ @@ -3562,6 +4845,7 @@ HAL_CRYP_DeInit(&hcryp); wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); return ret; } @@ -3624,6 +4908,7 @@ HAL_CRYP_DeInit(&hcryp); wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); return ret; } @@ -3708,6 +4993,7 @@ /* disable crypto processor */ CRYP_Cmd(DISABLE); wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); return ret; } @@ -3802,6 +5088,7 @@ /* disable crypto processor */ CRYP_Cmd(DISABLE); wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); return ret; } @@ -4051,6 +5338,7 @@ #ifdef HAVE_AES_DECRYPT int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) { + int ret; int offset = 0; byte* iv; byte temp_block[AES_BLOCK_SIZE]; @@ -4069,7 +5357,9 @@ while (blocks--) { XMEMCPY(temp_block, in + offset, AES_BLOCK_SIZE); - wc_AesDecrypt(aes, in + offset, out + offset); + ret = wc_AesDecrypt(aes, in + offset, out + offset); + if (ret != 0) + return ret; /* XOR block with IV for CBC */ xorbuf(out + offset, iv, AES_BLOCK_SIZE); @@ -4146,17 +5436,15 @@ return ret; } #endif /* HAVE_AES_DECRYPT */ -#elif defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES) +#elif defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_AES) + + /* We'll use SW for fall back: + * unsupported key lengths + * hardware busy */ + #define NEED_SW_AESCBC + #define NEED_AESCBC_HW_FALLBACK - int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) - { - return wc_esp32AesCbcEncrypt(aes, out, in, sz); - } - int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) - { - return wc_esp32AesCbcDecrypt(aes, out, in, sz); - } #elif defined(WOLFSSL_CRYPTOCELL) && defined(WOLFSSL_CRYPTOCELL_AES) int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { @@ -4180,17 +5468,24 @@ /* implemented in wolfcrypt/src/port/devcrypt/devcrypto_aes.c */ #elif defined(WOLFSSL_SILABS_SE_ACCEL) - /* implemented in wolfcrypt/src/port/silabs/silabs_hash.c */ + /* implemented in wolfcrypt/src/port/silabs/silabs_aes.c */ #elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_AES) /* implemented in wolfcrypt/src/port/psa/psa_aes.c */ #else + /* Reminder: Some HW implementations may also define this as needed. + * (e.g. for unsupported key length fallback) */ + #define NEED_SW_AESCBC +#endif +#ifdef NEED_SW_AESCBC /* Software AES - CBC Encrypt */ - int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) + +int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { word32 blocks; + int ret; if (aes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; @@ -4220,7 +5515,7 @@ #endif { int crypto_cb_ret = wc_CryptoCb_AesCbcEncrypt(aes, out, in, sz); - if (crypto_cb_ret != CRYPTOCB_UNAVAILABLE) + if (crypto_cb_ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return crypto_cb_ret; /* fall-through when unavailable */ } @@ -4235,7 +5530,7 @@ return IntelQaSymAesCbcEncrypt(&aes->asyncDev, out, in, sz, (const byte*)aes->devKey, aes->keylen, (byte*)aes->reg, AES_BLOCK_SIZE); - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_CBC_ENCRYPT)) { WC_ASYNC_SW* sw = &aes->asyncDev.sw; sw->aes.aes = aes; @@ -4254,10 +5549,23 @@ return se050_aes_crypt(aes, in, out, sz, AES_ENCRYPTION, kAlgorithm_SSS_AES_CBC); } - #endif - - #ifdef WOLFSSL_AESNI - if (haveAESNI) { + else + #elif defined(WOLFSSL_ESPIDF) && defined(NEED_AESCBC_HW_FALLBACK) + if (wc_esp32AesSupportedKeyLen(aes)) { + ESP_LOGV(TAG, "wc_AesCbcEncrypt calling wc_esp32AesCbcEncrypt"); + return wc_esp32AesCbcEncrypt(aes, out, in, sz); + } + else { + /* For example, the ESP32-S3 does not support HW for len = 24, + * so fall back to SW */ + #ifdef DEBUG_WOLFSSL + ESP_LOGW(TAG, "wc_AesCbcEncrypt HW Falling back, " + "unsupported keylen = %d", aes->keylen); + #endif + } + #elif defined(WOLFSSL_AESNI) + VECTOR_REGISTERS_PUSH; + if (aes->use_aesni) { #ifdef DEBUG_AESNI printf("about to aes cbc encrypt\n"); printf("in = %p\n", in); @@ -4274,58 +5582,63 @@ byte* tmp = (byte*)XMALLOC(sz + AES_BLOCK_SIZE + AESNI_ALIGN, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); byte* tmp_align; - if (tmp == NULL) return MEMORY_E; - - tmp_align = tmp + (AESNI_ALIGN - ((wc_ptr_t)tmp % AESNI_ALIGN)); - XMEMCPY(tmp_align, in, sz); - SAVE_VECTOR_REGISTERS(XFREE(tmp, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); return _svr_ret;); - AES_CBC_encrypt(tmp_align, tmp_align, (byte*)aes->reg, sz, - (byte*)aes->key, (int)aes->rounds); - RESTORE_VECTOR_REGISTERS(); - /* store iv for next call */ - XMEMCPY(aes->reg, tmp_align + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - - XMEMCPY(out, tmp_align, sz); - XFREE(tmp, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); - return 0; + if (tmp == NULL) + ret = MEMORY_E; + else { + tmp_align = tmp + (AESNI_ALIGN - ((wc_ptr_t)tmp % AESNI_ALIGN)); + XMEMCPY(tmp_align, in, sz); + AES_CBC_encrypt_AESNI(tmp_align, tmp_align, (byte*)aes->reg, sz, + (byte*)aes->key, (int)aes->rounds); + /* store iv for next call */ + XMEMCPY(aes->reg, tmp_align + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + + XMEMCPY(out, tmp_align, sz); + XFREE(tmp, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); + ret = 0; + } #else WOLFSSL_MSG("AES-CBC encrypt with bad alignment"); WOLFSSL_ERROR_VERBOSE(BAD_ALIGN_E); - return BAD_ALIGN_E; + ret = BAD_ALIGN_E; #endif - } - - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_CBC_encrypt(in, out, (byte*)aes->reg, sz, (byte*)aes->key, - (int)aes->rounds); - RESTORE_VECTOR_REGISTERS(); - /* store iv for next call */ - XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + } else { + AES_CBC_encrypt_AESNI(in, out, (byte*)aes->reg, sz, (byte*)aes->key, + (int)aes->rounds); + /* store iv for next call */ + XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - return 0; + ret = 0; + } } + else #endif + { + ret = 0; + while (blocks--) { + xorbuf((byte*)aes->reg, in, AES_BLOCK_SIZE); + ret = wc_AesEncrypt(aes, (byte*)aes->reg, (byte*)aes->reg); + if (ret != 0) + break; + XMEMCPY(out, aes->reg, AES_BLOCK_SIZE); - while (blocks--) { - int ret; - xorbuf((byte*)aes->reg, in, AES_BLOCK_SIZE); - ret = wc_AesEncrypt(aes, (byte*)aes->reg, (byte*)aes->reg); - if (ret != 0) - return ret; - XMEMCPY(out, aes->reg, AES_BLOCK_SIZE); - - out += AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + } } - return 0; - } + #ifdef WOLFSSL_AESNI + VECTOR_REGISTERS_POP; + #endif - #ifdef HAVE_AES_DECRYPT + return ret; + } /* wc_AesCbcEncrypt */ + +#ifdef HAVE_AES_DECRYPT /* Software AES - CBC Decrypt */ int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) { word32 blocks; + int ret; if (aes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; @@ -4335,6 +5648,21 @@ return 0; } + #if defined(WOLFSSL_ESPIDF) && defined(NEED_AESCBC_HW_FALLBACK) + if (wc_esp32AesSupportedKeyLen(aes)) { + ESP_LOGV(TAG, "wc_AesCbcDecrypt calling wc_esp32AesCbcDecrypt"); + return wc_esp32AesCbcDecrypt(aes, out, in, sz); + } + else { + /* For example, the ESP32-S3 does not support HW for len = 24, + * so fall back to SW */ + #ifdef DEBUG_WOLFSSL + ESP_LOGW(TAG, "wc_AesCbcDecrypt HW Falling back, " + "unsupported keylen = %d", aes->keylen); + #endif + } + #endif + blocks = sz / AES_BLOCK_SIZE; if (sz % AES_BLOCK_SIZE) { #ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS @@ -4356,7 +5684,7 @@ #endif { int crypto_cb_ret = wc_CryptoCb_AesCbcDecrypt(aes, out, in, sz); - if (crypto_cb_ret != CRYPTOCB_UNAVAILABLE) + if (crypto_cb_ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return crypto_cb_ret; /* fall-through when unavailable */ } @@ -4371,7 +5699,7 @@ return IntelQaSymAesCbcDecrypt(&aes->asyncDev, out, in, sz, (const byte*)aes->devKey, aes->keylen, (byte*)aes->reg, AES_BLOCK_SIZE); - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_CBC_DECRYPT)) { WC_ASYNC_SW* sw = &aes->asyncDev.sw; sw->aes.aes = aes; @@ -4392,8 +5720,10 @@ } #endif + VECTOR_REGISTERS_PUSH; + #ifdef WOLFSSL_AESNI - if (haveAESNI) { + if (aes->use_aesni) { #ifdef DEBUG_AESNI printf("about to aes cbc decrypt\n"); printf("in = %p\n", in); @@ -4406,41 +5736,105 @@ /* if input and output same will overwrite input iv */ XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - SAVE_VECTOR_REGISTERS(return _svr_ret;); #if defined(WOLFSSL_AESNI_BY4) || defined(WOLFSSL_X86_BUILD) - AES_CBC_decrypt_by4(in, out, (byte*)aes->reg, sz, (byte*)aes->key, + AES_CBC_decrypt_AESNI_by4(in, out, (byte*)aes->reg, sz, (byte*)aes->key, aes->rounds); #elif defined(WOLFSSL_AESNI_BY6) - AES_CBC_decrypt_by6(in, out, (byte*)aes->reg, sz, (byte*)aes->key, + AES_CBC_decrypt_AESNI_by6(in, out, (byte*)aes->reg, sz, (byte*)aes->key, aes->rounds); #else /* WOLFSSL_AESNI_BYx */ - AES_CBC_decrypt_by8(in, out, (byte*)aes->reg, sz, (byte*)aes->key, + AES_CBC_decrypt_AESNI_by8(in, out, (byte*)aes->reg, sz, (byte*)aes->key, (int)aes->rounds); #endif /* WOLFSSL_AESNI_BYx */ /* store iv for next call */ - RESTORE_VECTOR_REGISTERS(); XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); - return 0; + ret = 0; } + else #endif + { + ret = 0; +#ifdef WC_AES_BITSLICED + if (in != out) { + unsigned char dec[AES_BLOCK_SIZE * BS_WORD_SIZE]; - while (blocks--) { - int ret; - XMEMCPY(aes->tmp, in, AES_BLOCK_SIZE); - ret = wc_AesDecrypt(aes, (byte*)aes->tmp, out); - if (ret != 0) - return ret; - xorbuf(out, (byte*)aes->reg, AES_BLOCK_SIZE); - /* store iv for next call */ - XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); + while (blocks > BS_WORD_SIZE) { + AesDecryptBlocks_C(aes, in, dec, AES_BLOCK_SIZE * BS_WORD_SIZE); + xorbufout(out, dec, aes->reg, AES_BLOCK_SIZE); + xorbufout(out + AES_BLOCK_SIZE, dec + AES_BLOCK_SIZE, in, + AES_BLOCK_SIZE * (BS_WORD_SIZE - 1)); + XMEMCPY(aes->reg, in + (AES_BLOCK_SIZE * (BS_WORD_SIZE - 1)), + AES_BLOCK_SIZE); + in += AES_BLOCK_SIZE * BS_WORD_SIZE; + out += AES_BLOCK_SIZE * BS_WORD_SIZE; + blocks -= BS_WORD_SIZE; + } + if (blocks > 0) { + AesDecryptBlocks_C(aes, in, dec, blocks * AES_BLOCK_SIZE); + xorbufout(out, dec, aes->reg, AES_BLOCK_SIZE); + xorbufout(out + AES_BLOCK_SIZE, dec + AES_BLOCK_SIZE, in, + AES_BLOCK_SIZE * (blocks - 1)); + XMEMCPY(aes->reg, in + (AES_BLOCK_SIZE * (blocks - 1)), + AES_BLOCK_SIZE); + blocks = 0; + } + } + else { + unsigned char dec[AES_BLOCK_SIZE * BS_WORD_SIZE]; + int i; - out += AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; + while (blocks > BS_WORD_SIZE) { + AesDecryptBlocks_C(aes, in, dec, AES_BLOCK_SIZE * BS_WORD_SIZE); + XMEMCPY(aes->tmp, in + (BS_WORD_SIZE - 1) * AES_BLOCK_SIZE, + AES_BLOCK_SIZE); + for (i = BS_WORD_SIZE-1; i >= 1; i--) { + xorbufout(out + i * AES_BLOCK_SIZE, + dec + i * AES_BLOCK_SIZE, in + (i - 1) * AES_BLOCK_SIZE, + AES_BLOCK_SIZE); + } + xorbufout(out, dec, aes->reg, AES_BLOCK_SIZE); + XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); + + in += AES_BLOCK_SIZE * BS_WORD_SIZE; + out += AES_BLOCK_SIZE * BS_WORD_SIZE; + blocks -= BS_WORD_SIZE; + } + if (blocks > 0) { + AesDecryptBlocks_C(aes, in, dec, blocks * AES_BLOCK_SIZE); + XMEMCPY(aes->tmp, in + (blocks - 1) * AES_BLOCK_SIZE, + AES_BLOCK_SIZE); + for (i = blocks-1; i >= 1; i--) { + xorbufout(out + i * AES_BLOCK_SIZE, + dec + i * AES_BLOCK_SIZE, in + (i - 1) * AES_BLOCK_SIZE, + AES_BLOCK_SIZE); + } + xorbufout(out, dec, aes->reg, AES_BLOCK_SIZE); + XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); + + blocks = 0; + } + } +#else + while (blocks--) { + XMEMCPY(aes->tmp, in, AES_BLOCK_SIZE); + ret = wc_AesDecrypt(aes, in, out); + if (ret != 0) + return ret; + xorbuf(out, (byte*)aes->reg, AES_BLOCK_SIZE); + /* store iv for next call */ + XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); + + out += AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + } +#endif } - return 0; + VECTOR_REGISTERS_POP; + + return ret; } - #endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_DECRYPT */ #endif /* AES-CBC block */ #endif /* HAVE_AES_CBC */ @@ -4562,6 +5956,7 @@ #endif /* WOLFSSL_STM32_CUBEMX */ wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); return ret; } @@ -4634,8 +6029,8 @@ #elif defined(WOLFSSL_DEVCRYPTO_AES) /* implemented in wolfcrypt/src/port/devcrypt/devcrypto_aes.c */ - #elif defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES) + #elif defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_AES) /* esp32 doesn't support CRT mode by hw. */ /* use aes ecnryption plus sw implementation */ #define NEED_AES_CTR_SOFT @@ -4664,9 +6059,11 @@ int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { byte scratch[AES_BLOCK_SIZE]; - int ret; + int ret = 0; word32 processed; + XMEMSET(scratch, 0, sizeof(scratch)); + if (aes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; } @@ -4677,7 +6074,7 @@ #endif { int crypto_cb_ret = wc_CryptoCb_AesCtrEncrypt(aes, out, in, sz); - if (crypto_cb_ret != CRYPTOCB_UNAVAILABLE) + if (crypto_cb_ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return crypto_cb_ret; /* fall-through when unavailable */ } @@ -4692,6 +6089,8 @@ aes->left -= processed; sz -= processed; + VECTOR_REGISTERS_PUSH; + #if defined(HAVE_AES_ECB) && !defined(WOLFSSL_PIC32MZ_CRYPT) && \ !defined(XTRANSFORM_AESCTRBLOCK) if (in != out && sz >= AES_BLOCK_SIZE) { @@ -4725,13 +6124,8 @@ XTRANSFORM_AESCTRBLOCK(aes, out, in); #else ret = wc_AesEncrypt(aes, (byte*)aes->reg, scratch); - if (ret != 0) { - ForceZero(scratch, AES_BLOCK_SIZE); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(scratch, AES_BLOCK_SIZE); - #endif - return ret; - } + if (ret != 0) + break; xorbuf(scratch, in, AES_BLOCK_SIZE); XMEMCPY(out, scratch, AES_BLOCK_SIZE); #endif @@ -4746,31 +6140,44 @@ } /* handle non block size remaining and store unused byte count in left */ - if (sz) { + if ((ret == 0) && sz) { ret = wc_AesEncrypt(aes, (byte*)aes->reg, (byte*)aes->tmp); - if (ret != 0) { - ForceZero(scratch, AES_BLOCK_SIZE); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(scratch, AES_BLOCK_SIZE); - #endif - return ret; + if (ret == 0) { + IncrementAesCounter((byte*)aes->reg); + aes->left = AES_BLOCK_SIZE - sz; + xorbufout(out, in, aes->tmp, sz); } - IncrementAesCounter((byte*)aes->reg); - - aes->left = AES_BLOCK_SIZE - sz; - xorbufout(out, in, aes->tmp, sz); } + if (ret < 0) + ForceZero(scratch, AES_BLOCK_SIZE); + #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(scratch, AES_BLOCK_SIZE); #endif - return 0; + + VECTOR_REGISTERS_POP; + + return ret; + } + + int wc_AesCtrSetKey(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir) + { + if (aes == NULL) { + return BAD_FUNC_ARG; + } + if (len > sizeof(aes->key)) { + return BAD_FUNC_ARG; + } + + return wc_AesSetKey(aes, key, len, iv, dir); } #endif /* NEED_AES_CTR_SOFT */ #endif /* WOLFSSL_AES_COUNTER */ -#endif /* !WOLFSSL_ARMASM */ +#endif /* !WOLFSSL_ARMASM && ! WOLFSSL_RISCV_ASM */ /* @@ -4820,6 +6227,9 @@ #ifdef WOLFSSL_ARMASM /* implementation is located in wolfcrypt/src/port/arm/armv8-aes.c */ +#elif defined(WOLFSSL_RISCV_ASM) + /* implemented in wolfcrypt/src/port/risc-v/riscv-64-aes.c */ + #elif defined(WOLFSSL_AFALG) /* implemented in wolfcrypt/src/port/afalg/afalg_aes.c */ @@ -4883,12 +6293,12 @@ #ifdef GCM_TABLE -static void GenerateM0(Aes* aes) +void GenerateM0(Gcm* gcm) { int i, j; - byte (*m)[AES_BLOCK_SIZE] = aes->M0; + byte (*m)[AES_BLOCK_SIZE] = gcm->M0; - XMEMCPY(m[128], aes->H, AES_BLOCK_SIZE); + XMEMCPY(m[128], gcm->H, AES_BLOCK_SIZE); for (i = 64; i > 0; i /= 2) { XMEMCPY(m[i], m[i*2], AES_BLOCK_SIZE); @@ -4917,17 +6327,17 @@ } #endif -static void GenerateM0(Aes* aes) +void GenerateM0(Gcm* gcm) { #if !defined(BIG_ENDIAN_ORDER) && !defined(WC_16BIT_CPU) int i; #endif - byte (*m)[AES_BLOCK_SIZE] = aes->M0; + byte (*m)[AES_BLOCK_SIZE] = gcm->M0; /* 0 times -> 0x0 */ XMEMSET(m[0x0], 0, AES_BLOCK_SIZE); /* 1 times -> 0x8 */ - XMEMCPY(m[0x8], aes->H, AES_BLOCK_SIZE); + XMEMCPY(m[0x8], gcm->H, AES_BLOCK_SIZE); /* 2 times -> 0x4 */ XMEMCPY(m[0x4], m[0x8], AES_BLOCK_SIZE); RIGHTSHIFTX(m[0x4]); @@ -5000,40 +6410,45 @@ if (!((len == 16) || (len == 24) || (len == 32))) return BAD_FUNC_ARG; - if (aes == NULL) { + + if (aes == NULL || key == NULL) { #ifdef WOLFSSL_IMX6_CAAM_BLOB ForceZero(local, sizeof(local)); #endif return BAD_FUNC_ARG; } - #ifdef OPENSSL_EXTRA - XMEMSET(aes->aadH, 0, sizeof(aes->aadH)); - aes->aadLen = 0; + XMEMSET(aes->gcm.aadH, 0, sizeof(aes->gcm.aadH)); + aes->gcm.aadLen = 0; #endif XMEMSET(iv, 0, AES_BLOCK_SIZE); ret = wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); #ifdef WOLFSSL_AESGCM_STREAM aes->gcmKeySet = 1; #endif - - #ifdef WOLFSSL_AESNI - /* AES-NI code generates its own H value. */ - if (haveAESNI) - return ret; - #endif /* WOLFSSL_AESNI */ #if defined(WOLFSSL_SECO_CAAM) if (aes->devId == WOLFSSL_SECO_DEVID) { return ret; } #endif /* WOLFSSL_SECO_CAAM */ + #if defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_AES) + return ret; + #endif /* WOLFSSL_RENESAS_RSIP && WOLFSSL_RENESAS_FSPSM_CRYPTONLY*/ + #if !defined(FREESCALE_LTC_AES_GCM) - if (ret == 0) - ret = wc_AesEncrypt(aes, iv, aes->H); + if (ret == 0) { + VECTOR_REGISTERS_PUSH; + /* AES-NI code generates its own H value, but generate it here too, to + * assure pure-C fallback is always usable. + */ + ret = wc_AesEncrypt(aes, iv, aes->gcm.H); + VECTOR_REGISTERS_POP; + } if (ret == 0) { #if defined(GCM_TABLE) || defined(GCM_TABLE_4BIT) - GenerateM0(aes); + GenerateM0(&aes->gcm); #endif /* GCM_TABLE */ } #endif /* FREESCALE_LTC_AES_GCM */ @@ -5062,12 +6477,12 @@ #define HAVE_INTEL_AVX2 #endif /* USE_INTEL_SPEEDUP */ -void AES_GCM_encrypt(const unsigned char *in, unsigned char *out, +void AES_GCM_encrypt_aesni(const unsigned char *in, unsigned char *out, const unsigned char* addt, const unsigned char* ivec, unsigned char *tag, word32 nbytes, word32 abytes, word32 ibytes, word32 tbytes, const unsigned char* key, int nr) - XASM_LINK("AES_GCM_encrypt"); + XASM_LINK("AES_GCM_encrypt_aesni"); #ifdef HAVE_INTEL_AVX1 void AES_GCM_encrypt_avx1(const unsigned char *in, unsigned char *out, const unsigned char* addt, const unsigned char* ivec, @@ -5088,12 +6503,12 @@ #endif /* HAVE_INTEL_AVX1 */ #ifdef HAVE_AES_DECRYPT -void AES_GCM_decrypt(const unsigned char *in, unsigned char *out, +void AES_GCM_decrypt_aesni(const unsigned char *in, unsigned char *out, const unsigned char* addt, const unsigned char* ivec, const unsigned char *tag, word32 nbytes, word32 abytes, word32 ibytes, word32 tbytes, const unsigned char* key, int nr, int* res) - XASM_LINK("AES_GCM_decrypt"); + XASM_LINK("AES_GCM_decrypt_aesni"); #ifdef HAVE_INTEL_AVX1 void AES_GCM_decrypt_avx1(const unsigned char *in, unsigned char *out, const unsigned char* addt, const unsigned char* ivec, @@ -5140,7 +6555,7 @@ } -void GHASH(Aes* aes, const byte* a, word32 aSz, const byte* c, +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, byte* s, word32 sSz) { byte x[AES_BLOCK_SIZE]; @@ -5148,11 +6563,11 @@ word32 blocks, partial; byte* h; - if (aes == NULL) { + if (gcm == NULL) { return; } - h = aes->H; + h = gcm->H; XMEMSET(x, 0, AES_BLOCK_SIZE); /* Hash in A, the Additional Authentication Data */ @@ -5204,7 +6619,7 @@ * * @param [in] aes AES GCM object. */ -#define GHASH_INIT_EXTRA(aes) +#define GHASH_INIT_EXTRA(aes) WC_DO_NOTHING /* GHASH one block of data.. * @@ -5216,14 +6631,14 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ xorbuf(AES_TAG(aes), block, AES_BLOCK_SIZE); \ - GMULT(AES_TAG(aes), aes->H); \ + GMULT(AES_TAG(aes), aes->gcm.H); \ } \ while (0) #endif /* WOLFSSL_AESGCM_STREAM */ /* end GCM_SMALL */ #elif defined(GCM_TABLE) -static const byte R[256][2] = { +ALIGN16 static const byte R[256][2] = { {0x00, 0x00}, {0x01, 0xc2}, {0x03, 0x84}, {0x02, 0x46}, {0x07, 0x08}, {0x06, 0xca}, {0x04, 0x8c}, {0x05, 0x4e}, {0x0e, 0x10}, {0x0f, 0xd2}, {0x0d, 0x94}, {0x0c, 0x56}, @@ -5313,6 +6728,38 @@ xorbuf(Z, m[x[0]], AES_BLOCK_SIZE); XMEMCPY(x, Z, AES_BLOCK_SIZE); +#elif defined(WC_32BIT_CPU) + byte Z[AES_BLOCK_SIZE + AES_BLOCK_SIZE]; + byte a; + word32* pZ; + word32* pm; + word32* px = (word32*)(x); + int i; + + pZ = (word32*)(Z + 15 + 1); + pm = (word32*)(m[x[15]]); + pZ[0] = pm[0]; + pZ[1] = pm[1]; + pZ[2] = pm[2]; + pZ[3] = pm[3]; + a = Z[16 + 15]; + Z[15] = R[a][0]; + Z[16] ^= R[a][1]; + for (i = 14; i > 0; i--) { + pZ = (word32*)(Z + i + 1); + pm = (word32*)(m[x[i]]); + pZ[0] ^= pm[0]; + pZ[1] ^= pm[1]; + pZ[2] ^= pm[2]; + pZ[3] ^= pm[3]; + a = Z[16 + i]; + Z[i] = R[a][0]; + Z[i+1] ^= R[a][1]; + } + pZ = (word32*)(Z + 1); + pm = (word32*)(m[x[0]]); + px[0] = pZ[0] ^ pm[0]; px[1] = pZ[1] ^ pm[1]; + px[2] = pZ[2] ^ pm[2]; px[3] = pZ[3] ^ pm[3]; #else byte Z[AES_BLOCK_SIZE + AES_BLOCK_SIZE]; byte a; @@ -5343,14 +6790,14 @@ #endif } -void GHASH(Aes* aes, const byte* a, word32 aSz, const byte* c, +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, byte* s, word32 sSz) { byte x[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE]; word32 blocks, partial; - if (aes == NULL) { + if (gcm == NULL) { return; } @@ -5362,14 +6809,14 @@ partial = aSz % AES_BLOCK_SIZE; while (blocks--) { xorbuf(x, a, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); a += AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, a, partial); xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); } } @@ -5379,14 +6826,14 @@ partial = cSz % AES_BLOCK_SIZE; while (blocks--) { xorbuf(x, c, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); c += AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, c, partial); xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); } } @@ -5394,7 +6841,7 @@ FlattenSzInBits(&scratch[0], aSz); FlattenSzInBits(&scratch[8], cSz); xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); /* Copy the result into s. */ XMEMCPY(s, x, sSz); @@ -5405,7 +6852,7 @@ * * @param [in] aes AES GCM object. */ -#define GHASH_INIT_EXTRA(aes) +#define GHASH_INIT_EXTRA(aes) WC_DO_NOTHING /* GHASH one block of data.. * @@ -5417,7 +6864,7 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ xorbuf(AES_TAG(aes), block, AES_BLOCK_SIZE); \ - GMULT(AES_TAG(aes), aes->M0); \ + GMULT(AES_TAG(aes), aes->gcm.M0); \ } \ while (0) #endif /* WOLFSSL_AESGCM_STREAM */ @@ -5464,7 +6911,7 @@ * H: hash key = encrypt(key, 0) * x = x * H in field * - * x: cumlative result + * x: cumulative result * m: 4-bit table * [0..15] * H */ @@ -5643,14 +7090,14 @@ } #endif -void GHASH(Aes* aes, const byte* a, word32 aSz, const byte* c, +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, byte* s, word32 sSz) { byte x[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE]; word32 blocks, partial; - if (aes == NULL) { + if (gcm == NULL) { return; } @@ -5662,14 +7109,14 @@ partial = aSz % AES_BLOCK_SIZE; while (blocks--) { xorbuf(x, a, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); a += AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, a, partial); xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); } } @@ -5679,14 +7126,14 @@ partial = cSz % AES_BLOCK_SIZE; while (blocks--) { xorbuf(x, c, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); c += AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, c, partial); xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); } } @@ -5694,7 +7141,7 @@ FlattenSzInBits(&scratch[0], aSz); FlattenSzInBits(&scratch[8], cSz); xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->M0); + GMULT(x, gcm->M0); /* Copy the result into s. */ XMEMCPY(s, x, sSz); @@ -5705,7 +7152,7 @@ * * @param [in] aes AES GCM object. */ -#define GHASH_INIT_EXTRA(aes) +#define GHASH_INIT_EXTRA(aes) WC_DO_NOTHING /* GHASH one block of data.. * @@ -5717,7 +7164,7 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ xorbuf(AES_TAG(aes), block, AES_BLOCK_SIZE); \ - GMULT(AES_TAG(aes), (aes)->M0); \ + GMULT(AES_TAG(aes), (aes)->gcm.M0); \ } \ while (0) #endif /* WOLFSSL_AESGCM_STREAM */ @@ -5761,18 +7208,18 @@ } -void GHASH(Aes* aes, const byte* a, word32 aSz, const byte* c, +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, byte* s, word32 sSz) { word64 x[2] = {0,0}; word32 blocks, partial; word64 bigH[2]; - if (aes == NULL) { + if (gcm == NULL) { return; } - XMEMCPY(bigH, aes->H, AES_BLOCK_SIZE); + XMEMCPY(bigH, gcm->H, AES_BLOCK_SIZE); #ifdef LITTLE_ENDIAN_ORDER ByteReverseWords64(bigH, bigH, AES_BLOCK_SIZE); #endif @@ -5804,10 +7251,10 @@ } #ifdef OPENSSL_EXTRA /* store AAD partial tag for next call */ - aes->aadH[0] = (word32)((x[0] & 0xFFFFFFFF00000000ULL) >> 32); - aes->aadH[1] = (word32)(x[0] & 0xFFFFFFFF); - aes->aadH[2] = (word32)((x[1] & 0xFFFFFFFF00000000ULL) >> 32); - aes->aadH[3] = (word32)(x[1] & 0xFFFFFFFF); + gcm->aadH[0] = (word32)((x[0] & 0xFFFFFFFF00000000ULL) >> 32); + gcm->aadH[1] = (word32)(x[0] & 0xFFFFFFFF); + gcm->aadH[2] = (word32)((x[1] & 0xFFFFFFFF00000000ULL) >> 32); + gcm->aadH[3] = (word32)(x[1] & 0xFFFFFFFF); #endif } @@ -5818,9 +7265,9 @@ partial = cSz % AES_BLOCK_SIZE; #ifdef OPENSSL_EXTRA /* Start from last AAD partial tag */ - if(aes->aadLen) { - x[0] = ((word64)aes->aadH[0]) << 32 | aes->aadH[1]; - x[1] = ((word64)aes->aadH[2]) << 32 | aes->aadH[3]; + if(gcm->aadLen) { + x[0] = ((word64)gcm->aadH[0]) << 32 | gcm->aadH[1]; + x[1] = ((word64)gcm->aadH[2]) << 32 | gcm->aadH[3]; } #endif while (blocks--) { @@ -5850,8 +7297,8 @@ word64 len[2]; len[0] = aSz; len[1] = cSz; #ifdef OPENSSL_EXTRA - if (aes->aadLen) - len[0] = (word64)aes->aadLen; + if (gcm->aadLen) + len[0] = (word64)gcm->aadLen; #endif /* Lengths are in bytes. Convert to bits. */ len[0] *= 8; @@ -5877,7 +7324,7 @@ * @param [in] aes AES GCM object. */ #define GHASH_INIT_EXTRA(aes) \ - ByteReverseWords64((word64*)aes->H, (word64*)aes->H, AES_BLOCK_SIZE) + ByteReverseWords64((word64*)aes->gcm.H, (word64*)aes->gcm.H, AES_BLOCK_SIZE) /* GHASH one block of data.. * @@ -5889,7 +7336,7 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ word64* x = (word64*)AES_TAG(aes); \ - word64* h = (word64*)aes->H; \ + word64* h = (word64*)aes->gcm.H; \ word64 block64[2]; \ XMEMCPY(block64, block, AES_BLOCK_SIZE); \ ByteReverseWords64(block64, block64, AES_BLOCK_SIZE); \ @@ -5909,11 +7356,11 @@ #define GHASH_LEN_BLOCK(aes) \ do { \ word64* x = (word64*)AES_TAG(aes); \ - word64* h = (word64*)aes->H; \ + word64* h = (word64*)aes->gcm.H; \ word64 len[2]; \ len[0] = aes->aSz; len[1] = aes->cSz; \ - if (aes->aadLen) \ - len[0] = (word64)aes->aadLen; \ + if (aes->gcm.aadLen) \ + len[0] = (word64)aes->gcm.aadLen; \ /* Lengths are in bytes. Convert to bits. */ \ len[0] *= 8; \ len[1] *= 8; \ @@ -5934,7 +7381,7 @@ #define GHASH_LEN_BLOCK(aes) \ do { \ word64* x = (word64*)AES_TAG(aes); \ - word64* h = (word64*)aes->H; \ + word64* h = (word64*)aes->gcm.H; \ word64 len[2]; \ len[0] = aes->aSz; len[1] = aes->cSz; \ /* Lengths are in bytes. Convert to bits. */ \ @@ -5955,7 +7402,7 @@ * * @param [in] aes AES GCM object. */ -#define GHASH_INIT_EXTRA(aes) +#define GHASH_INIT_EXTRA(aes) WC_DO_NOTHING /* GHASH one block of data.. * @@ -5967,7 +7414,7 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ word64* x = (word64*)AES_TAG(aes); \ - word64* h = (word64*)aes->H; \ + word64* h = (word64*)aes->gcm.H; \ word64 block64[2]; \ XMEMCPY(block64, block, AES_BLOCK_SIZE); \ x[0] ^= block64[0]; \ @@ -5986,11 +7433,11 @@ #define GHASH_LEN_BLOCK(aes) \ do { \ word64* x = (word64*)AES_TAG(aes); \ - word64* h = (word64*)aes->H; \ + word64* h = (word64*)aes->gcm.H; \ word64 len[2]; \ len[0] = aes->aSz; len[1] = aes->cSz; \ - if (aes->aadLen) \ - len[0] = (word64)aes->aadLen; \ + if (aes->gcm.aadLen) \ + len[0] = (word64)aes->gcm.aadLen; \ /* Lengths are in bytes. Convert to bits. */ \ len[0] *= 8; \ len[1] *= 8; \ @@ -6010,7 +7457,7 @@ #define GHASH_LEN_BLOCK(aes) \ do { \ word64* x = (word64*)AES_TAG(aes); \ - word64* h = (word64*)aes->H; \ + word64* h = (word64*)aes->gcm.H; \ word64 len[2]; \ len[0] = aes->aSz; len[1] = aes->cSz; \ /* Lengths are in bytes. Convert to bits. */ \ @@ -6078,18 +7525,18 @@ } -void GHASH(Aes* aes, const byte* a, word32 aSz, const byte* c, +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, byte* s, word32 sSz) { word32 x[4] = {0,0,0,0}; word32 blocks, partial; word32 bigH[4]; - if (aes == NULL) { + if (gcm == NULL) { return; } - XMEMCPY(bigH, aes->H, AES_BLOCK_SIZE); + XMEMCPY(bigH, gcm->H, AES_BLOCK_SIZE); #ifdef LITTLE_ENDIAN_ORDER ByteReverseWords(bigH, bigH, AES_BLOCK_SIZE); #endif @@ -6187,7 +7634,7 @@ * @param [in, out] aes AES GCM object. */ #define GHASH_INIT_EXTRA(aes) \ - ByteReverseWords((word32*)aes->H, (word32*)aes->H, AES_BLOCK_SIZE) + ByteReverseWords((word32*)aes->gcm.H, (word32*)aes->gcm.H, AES_BLOCK_SIZE) /* GHASH one block of data.. * @@ -6199,7 +7646,7 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ word32* x = (word32*)AES_TAG(aes); \ - word32* h = (word32*)aes->H; \ + word32* h = (word32*)aes->gcm.H; \ word32 bigEnd[4]; \ XMEMCPY(bigEnd, block, AES_BLOCK_SIZE); \ ByteReverseWords(bigEnd, bigEnd, AES_BLOCK_SIZE); \ @@ -6221,7 +7668,7 @@ do { \ word32 len[4]; \ word32* x = (word32*)AES_TAG(aes); \ - word32* h = (word32*)aes->H; \ + word32* h = (word32*)aes->gcm.H; \ len[0] = (aes->aSz >> (8*sizeof(aes->aSz) - 3)); \ len[1] = aes->aSz << 3; \ len[2] = (aes->cSz >> (8*sizeof(aes->cSz) - 3)); \ @@ -6239,7 +7686,7 @@ * * @param [in] aes AES GCM object. */ -#define GHASH_INIT_EXTRA(aes) +#define GHASH_INIT_EXTRA(aes) WC_DO_NOTHING /* GHASH one block of data.. * @@ -6251,7 +7698,7 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ word32* x = (word32*)AES_TAG(aes); \ - word32* h = (word32*)aes->H; \ + word32* h = (word32*)aes->gcm.H; \ word32 block32[4]; \ XMEMCPY(block32, block, AES_BLOCK_SIZE); \ x[0] ^= block32[0]; \ @@ -6270,7 +7717,7 @@ do { \ word32 len[4]; \ word32* x = (word32*)AES_TAG(aes); \ - word32* h = (word32*)aes->H; \ + word32* h = (word32*)aes->gcm.H; \ len[0] = (aes->aSz >> (8*sizeof(aes->aSz) - 3)); \ len[1] = aes->aSz << 3; \ len[2] = (aes->cSz >> (8*sizeof(aes->cSz) - 3)); \ @@ -6315,7 +7762,7 @@ /* Reset counts of AAD and cipher text. */ aes->aOver = 0; aes->cOver = 0; - /* Extra initialization baed on implementation. */ + /* Extra initialization based on implementation. */ GHASH_INIT_EXTRA(aes); } @@ -6394,7 +7841,7 @@ sz = (byte)cSz; } XMEMCPY(AES_LASTGBLOCK(aes) + aes->cOver, c, sz); - /* Update count of unsed encrypted counter. */ + /* Update count of unused encrypted counter. */ aes->cOver += sz; if (aes->cOver == AES_BLOCK_SIZE) { /* We have filled up the block and can process. */ @@ -6540,7 +7987,7 @@ pCtr[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, (byte*)ctr, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, (byte*)ctr, AES_BLOCK_SIZE); } XMEMCPY(ctrInit, ctr, sizeof(ctr)); /* save off initial counter for GMAC */ @@ -6571,7 +8018,7 @@ /* if IV is not 12 calculate GHASH using software */ if (ivSz != GCM_NONCE_MID_SZ #ifndef CRYP_HEADERWIDTHUNIT_BYTE - /* or harware that does not support partial block */ + /* or hardware that does not support partial block */ || sz == 0 || partial != 0 #endif #if !defined(CRYP_HEADERWIDTHUNIT_BYTE) && !defined(STM32_AESGCM_PARTIAL) @@ -6708,12 +8155,13 @@ ret = AES_GCM_AUTH_E; #endif /* WOLFSSL_STM32_CUBEMX */ wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); if (ret == 0) { /* return authTag */ if (authTag) { if (useSwGhash) { - GHASH(aes, authIn, authInSz, out, sz, authTag, authTagSz); + GHASH(&aes->gcm, authIn, authInSz, out, sz, authTag, authTagSz); ret = wc_AesEncrypt(aes, (byte*)ctrInit, (byte*)tag); if (ret == 0) { xorbuf(authTag, tag, authTagSz); @@ -6771,12 +8219,12 @@ else { /* Counter is GHASH of IV. */ #ifdef OPENSSL_EXTRA - word32 aadTemp = aes->aadLen; - aes->aadLen = 0; + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; #endif - GHASH(aes, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); #ifdef OPENSSL_EXTRA - aes->aadLen = aadTemp; + aes->gcm.aadLen = aadTemp; #endif } XMEMCPY(initialCounter, counter, AES_BLOCK_SIZE); @@ -6836,7 +8284,7 @@ xorbufout(c, scratch, p, partial); } if (authTag) { - GHASH(aes, authIn, authInSz, out, sz, authTag, authTagSz); + GHASH(&aes->gcm, authIn, authInSz, out, sz, authTag, authTagSz); ret = wc_AesEncrypt(aes, initialCounter, scratch); if (ret != 0) return ret; @@ -6844,7 +8292,7 @@ #ifdef OPENSSL_EXTRA if (!in && !sz) /* store AAD size for next call */ - aes->aadLen = authInSz; + aes->gcm.aadLen = authInSz; #endif } @@ -6857,6 +8305,8 @@ byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { + int ret; + /* argument checks */ if (aes == NULL || authTagSz > AES_BLOCK_SIZE || ivSz == 0) { return BAD_FUNC_ARG; @@ -6875,7 +8325,7 @@ int crypto_cb_ret = wc_CryptoCb_AesGcmEncrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, authIn, authInSz); - if (crypto_cb_ret != CRYPTOCB_UNAVAILABLE) + if (crypto_cb_ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return crypto_cb_ret; /* fall-through when unavailable */ } @@ -6898,7 +8348,7 @@ return IntelQaSymAesGcmEncrypt(&aes->asyncDev, out, in, sz, (const byte*)aes->devKey, aes->keylen, iv, ivSz, authTag, authTagSz, authIn, authInSz); - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_GCM_ENCRYPT)) { WC_ASYNC_SW* sw = &aes->asyncDev.sw; sw->aes.aes = aes; @@ -6931,38 +8381,41 @@ authTag, authTagSz, authIn, authInSz); #endif /* STM32_CRYPTO_AES_GCM */ + VECTOR_REGISTERS_PUSH; + #ifdef WOLFSSL_AESNI - #ifdef HAVE_INTEL_AVX2 - if (IS_INTEL_AVX2(intel_flags)) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_GCM_encrypt_avx2(in, out, authIn, iv, authTag, sz, authInSz, ivSz, - authTagSz, (const byte*)aes->key, (int)aes->rounds); - RESTORE_VECTOR_REGISTERS(); - return 0; - } - else - #endif - #if defined(HAVE_INTEL_AVX1) - if (IS_INTEL_AVX1(intel_flags)) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_GCM_encrypt_avx1(in, out, authIn, iv, authTag, sz, authInSz, ivSz, - authTagSz, (const byte*)aes->key, (int)aes->rounds); - RESTORE_VECTOR_REGISTERS(); - return 0; - } - else - #endif - if (haveAESNI) { - AES_GCM_encrypt(in, out, authIn, iv, authTag, sz, authInSz, ivSz, + if (aes->use_aesni) { +#ifdef HAVE_INTEL_AVX2 + if (IS_INTEL_AVX2(intel_flags)) { + AES_GCM_encrypt_avx2(in, out, authIn, iv, authTag, sz, authInSz, ivSz, + authTagSz, (const byte*)aes->key, (int)aes->rounds); + ret = 0; + } + else +#endif +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_GCM_encrypt_avx1(in, out, authIn, iv, authTag, sz, authInSz, ivSz, + authTagSz, (const byte*)aes->key, (int)aes->rounds); + ret = 0; + } else +#endif + { + AES_GCM_encrypt_aesni(in, out, authIn, iv, authTag, sz, authInSz, ivSz, authTagSz, (const byte*)aes->key, (int)aes->rounds); - return 0; + ret = 0; + } } else -#endif +#endif /* WOLFSSL_AESNI */ { - return AES_GCM_encrypt_C(aes, out, in, sz, iv, ivSz, authTag, authTagSz, - authIn, authInSz); + ret = AES_GCM_encrypt_C(aes, out, in, sz, iv, ivSz, authTag, authTagSz, + authIn, authInSz); } + + VECTOR_REGISTERS_POP; + + return ret; } #endif @@ -7052,7 +8505,7 @@ pCtr[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, (byte*)ctr, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, (byte*)ctr, AES_BLOCK_SIZE); } /* Make copy of expected authTag, which could get corrupted in some @@ -7073,7 +8526,7 @@ /* if IV is not 12 calculate GHASH using software */ if (ivSz != GCM_NONCE_MID_SZ #ifndef CRYP_HEADERWIDTHUNIT_BYTE - /* or harware that does not support partial block */ + /* or hardware that does not support partial block */ || sz == 0 || partial != 0 #endif #if !defined(CRYP_HEADERWIDTHUNIT_BYTE) && !defined(STM32_AESGCM_PARTIAL) @@ -7081,7 +8534,7 @@ || authPadSz != authInSz #endif ) { - GHASH(aes, authIn, authInSz, in, sz, (byte*)tag, sizeof(tag)); + GHASH(&aes->gcm, authIn, authInSz, in, sz, (byte*)tag, sizeof(tag)); ret = wc_AesEncrypt(aes, (byte*)ctr, (byte*)partialBlock); if (ret != 0) return ret; @@ -7242,6 +8695,7 @@ XMEMCPY(tag, partialBlock, authTagSz); #endif /* WOLFSSL_STM32_CUBEMX */ wolfSSL_CryptHwMutexUnLock(); + wc_Stm32_Aes_Cleanup(); /* Check authentication tag */ if (ConstantCompare((const byte*)tagExpected, (byte*)tag, authTagSz) != 0) { @@ -7295,17 +8749,17 @@ else { /* Counter is GHASH of IV. */ #ifdef OPENSSL_EXTRA - word32 aadTemp = aes->aadLen; - aes->aadLen = 0; + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; #endif - GHASH(aes, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); #ifdef OPENSSL_EXTRA - aes->aadLen = aadTemp; + aes->gcm.aadLen = aadTemp; #endif } /* Calc the authTag again using received auth data and the cipher text */ - GHASH(aes, authIn, authInSz, in, sz, Tprime, sizeof(Tprime)); + GHASH(&aes->gcm, authIn, authInSz, in, sz, Tprime, sizeof(Tprime)); ret = wc_AesEncrypt(aes, counter, EKY0); if (ret != 0) return ret; @@ -7328,7 +8782,7 @@ if (!out) { /* authenticated, non-confidential data */ /* store AAD size for next call */ - aes->aadLen = authInSz; + aes->gcm.aadLen = authInSz; } #endif @@ -7412,8 +8866,9 @@ const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { + int ret; #ifdef WOLFSSL_AESNI - int res = AES_GCM_AUTH_E; + int res = WC_NO_ERR_TRACE(AES_GCM_AUTH_E); #endif /* argument checks */ @@ -7434,7 +8889,7 @@ int crypto_cb_ret = wc_CryptoCb_AesGcmDecrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, authIn, authInSz); - if (crypto_cb_ret != CRYPTOCB_UNAVAILABLE) + if (crypto_cb_ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return crypto_cb_ret; /* fall-through when unavailable */ } @@ -7457,7 +8912,7 @@ return IntelQaSymAesGcmDecrypt(&aes->asyncDev, out, in, sz, (const byte*)aes->devKey, aes->keylen, iv, ivSz, authTag, authTagSz, authIn, authInSz); - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&aes->asyncDev, ASYNC_SW_AES_GCM_DECRYPT)) { WC_ASYNC_SW* sw = &aes->asyncDev.sw; sw->aes.aes = aes; @@ -7490,49 +8945,57 @@ authTag, authTagSz, authIn, authInSz); #endif /* STM32_CRYPTO_AES_GCM */ + VECTOR_REGISTERS_PUSH; + #ifdef WOLFSSL_AESNI - #ifdef HAVE_INTEL_AVX2 - if (IS_INTEL_AVX2(intel_flags)) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_GCM_decrypt_avx2(in, out, authIn, iv, authTag, sz, authInSz, ivSz, - authTagSz, (byte*)aes->key, (int)aes->rounds, &res); - RESTORE_VECTOR_REGISTERS(); - if (res == 0) - return AES_GCM_AUTH_E; - return 0; - } - else - #endif - #if defined(HAVE_INTEL_AVX1) - if (IS_INTEL_AVX1(intel_flags)) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_GCM_decrypt_avx1(in, out, authIn, iv, authTag, sz, authInSz, ivSz, - authTagSz, (byte*)aes->key, (int)aes->rounds, &res); - RESTORE_VECTOR_REGISTERS(); - if (res == 0) - return AES_GCM_AUTH_E; - return 0; - } - else - #endif - if (haveAESNI) { - AES_GCM_decrypt(in, out, authIn, iv, authTag, sz, authInSz, ivSz, + if (aes->use_aesni) { +#ifdef HAVE_INTEL_AVX2 + if (IS_INTEL_AVX2(intel_flags)) { + AES_GCM_decrypt_avx2(in, out, authIn, iv, authTag, sz, authInSz, ivSz, + authTagSz, (byte*)aes->key, (int)aes->rounds, &res); + if (res == 0) + ret = AES_GCM_AUTH_E; + else + ret = 0; + } + else +#endif +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_GCM_decrypt_avx1(in, out, authIn, iv, authTag, sz, authInSz, ivSz, + authTagSz, (byte*)aes->key, (int)aes->rounds, &res); + if (res == 0) + ret = AES_GCM_AUTH_E; + else + ret = 0; + } + else +#endif + { + AES_GCM_decrypt_aesni(in, out, authIn, iv, authTag, sz, authInSz, ivSz, authTagSz, (byte*)aes->key, (int)aes->rounds, &res); - if (res == 0) - return AES_GCM_AUTH_E; - return 0; + if (res == 0) + ret = AES_GCM_AUTH_E; + else + ret = 0; + } } else -#endif +#endif /* WOLFSSL_AESNI */ { - return AES_GCM_decrypt_C(aes, out, in, sz, iv, ivSz, authTag, authTagSz, - authIn, authInSz); + ret = AES_GCM_decrypt_C(aes, out, in, sz, iv, ivSz, authTag, authTagSz, + authIn, authInSz); } + + VECTOR_REGISTERS_POP; + + return ret; } #endif #endif /* HAVE_AES_DECRYPT || HAVE_AESGCM_DECRYPT */ #ifdef WOLFSSL_AESGCM_STREAM + /* Initialize the AES GCM cipher with an IV. C implementation. * * @param [in, out] aes AES object. @@ -7554,12 +9017,12 @@ else { /* Counter is GHASH of IV. */ #ifdef OPENSSL_EXTRA - word32 aadTemp = aes->aadLen; - aes->aadLen = 0; + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; #endif - GHASH(aes, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); #ifdef OPENSSL_EXTRA - aes->aadLen = aadTemp; + aes->gcm.aadLen = aadTemp; #endif } @@ -7686,7 +9149,7 @@ xorbuf(authTag, AES_INITCTR(aes), authTagSz); #ifdef OPENSSL_EXTRA /* store AAD size for next call */ - aes->aadLen = aes->aSz; + aes->gcm.aadLen = aes->aSz; #endif /* Zeroize last block to protect sensitive data. */ ForceZero(AES_LASTBLOCK(aes), AES_BLOCK_SIZE); @@ -7767,7 +9230,10 @@ static WARN_UNUSED_RESULT int AesGcmInit_aesni( Aes* aes, const byte* iv, word32 ivSz) { + ASSERT_SAVED_VECTOR_REGISTERS(); + /* Reset state fields. */ + aes->over = 0; aes->aSz = 0; aes->cSz = 0; /* Set tag to all zeros as initial value. */ @@ -7778,28 +9244,23 @@ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_GCM_init_avx2((byte*)aes->key, (int)aes->rounds, iv, ivSz, aes->H, - AES_COUNTER(aes), AES_INITCTR(aes)); - RESTORE_VECTOR_REGISTERS(); + AES_GCM_init_avx2((byte*)aes->key, (int)aes->rounds, iv, ivSz, + aes->gcm.H, AES_COUNTER(aes), AES_INITCTR(aes)); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_GCM_init_avx1((byte*)aes->key, (int)aes->rounds, iv, ivSz, aes->H, - AES_COUNTER(aes), AES_INITCTR(aes)); - RESTORE_VECTOR_REGISTERS(); + AES_GCM_init_avx1((byte*)aes->key, (int)aes->rounds, iv, ivSz, + aes->gcm.H, AES_COUNTER(aes), AES_INITCTR(aes)); } else #endif { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_GCM_init_aesni((byte*)aes->key, (int)aes->rounds, iv, ivSz, aes->H, - AES_COUNTER(aes), AES_INITCTR(aes)); - RESTORE_VECTOR_REGISTERS(); + AES_GCM_init_aesni((byte*)aes->key, (int)aes->rounds, iv, ivSz, + aes->gcm.H, AES_COUNTER(aes), AES_INITCTR(aes)); } + return 0; } @@ -7838,20 +9299,20 @@ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_ghash_block_avx2(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_ghash_block_avx1(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } else #endif { AES_GCM_ghash_block_aesni(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } /* Reset count. */ aes->aOver = 0; @@ -7869,20 +9330,20 @@ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_aad_update_avx2(a, blocks * AES_BLOCK_SIZE, - AES_TAG(aes), aes->H); + AES_TAG(aes), aes->gcm.H); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_aad_update_avx1(a, blocks * AES_BLOCK_SIZE, - AES_TAG(aes), aes->H); + AES_TAG(aes), aes->gcm.H); } else #endif { AES_GCM_aad_update_aesni(a, blocks * AES_BLOCK_SIZE, - AES_TAG(aes), aes->H); + AES_TAG(aes), aes->gcm.H); } /* Skip over to end of AAD blocks. */ a += blocks * AES_BLOCK_SIZE; @@ -7901,19 +9362,21 @@ /* GHASH last AAD block. */ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { - AES_GCM_ghash_block_avx2(AES_LASTGBLOCK(aes), AES_TAG(aes), aes->H); + AES_GCM_ghash_block_avx2(AES_LASTGBLOCK(aes), AES_TAG(aes), + aes->gcm.H); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { - AES_GCM_ghash_block_avx1(AES_LASTGBLOCK(aes), AES_TAG(aes), aes->H); + AES_GCM_ghash_block_avx1(AES_LASTGBLOCK(aes), AES_TAG(aes), + aes->gcm.H); } else #endif { AES_GCM_ghash_block_aesni(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } /* Clear partial count for next time through. */ aes->aOver = 0; @@ -7940,7 +9403,8 @@ int partial; int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret;); + ASSERT_SAVED_VECTOR_REGISTERS(); + /* Hash in A, the Authentication Data */ ret = AesGcmAadUpdate_aesni(aes, a, aSz, (cSz > 0) && (c != NULL)); if (ret != 0) @@ -7959,27 +9423,27 @@ /* Encrypt some of the plaintext. */ xorbuf(AES_LASTGBLOCK(aes) + aes->cOver, p, sz); XMEMCPY(c, AES_LASTGBLOCK(aes) + aes->cOver, sz); - /* Update count of unsed encrypted counter. */ + /* Update count of unused encrypted counter. */ aes->cOver += sz; if (aes->cOver == AES_BLOCK_SIZE) { /* We have filled up the block and can process. */ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_ghash_block_avx2(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_ghash_block_avx1(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } else #endif { AES_GCM_ghash_block_aesni(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } /* Reset count. */ aes->cOver = 0; @@ -7998,7 +9462,7 @@ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_encrypt_update_avx2((byte*)aes->key, (int)aes->rounds, - c, p, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->H, + c, p, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->gcm.H, AES_COUNTER(aes)); } else @@ -8006,14 +9470,14 @@ #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_encrypt_update_avx1((byte*)aes->key, (int)aes->rounds, - c, p, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->H, + c, p, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->gcm.H, AES_COUNTER(aes)); } else #endif { AES_GCM_encrypt_update_aesni((byte*)aes->key, (int)aes->rounds, - c, p, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->H, + c, p, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->gcm.H, AES_COUNTER(aes)); } /* Skip over to end of blocks. */ @@ -8050,7 +9514,6 @@ aes->cOver = (byte)partial; } } - RESTORE_VECTOR_REGISTERS(); return 0; } @@ -8069,7 +9532,8 @@ /* AAD block incomplete when > 0 */ byte over = aes->aOver; - SAVE_VECTOR_REGISTERS(return _svr_ret;); + ASSERT_SAVED_VECTOR_REGISTERS(); + if (aes->cOver > 0) { /* Cipher text block incomplete. */ over = aes->cOver; @@ -8080,41 +9544,43 @@ /* GHASH last cipher block. */ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { - AES_GCM_ghash_block_avx2(AES_LASTGBLOCK(aes), AES_TAG(aes), aes->H); + AES_GCM_ghash_block_avx2(AES_LASTGBLOCK(aes), AES_TAG(aes), + aes->gcm.H); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { - AES_GCM_ghash_block_avx1(AES_LASTGBLOCK(aes), AES_TAG(aes), aes->H); + AES_GCM_ghash_block_avx1(AES_LASTGBLOCK(aes), AES_TAG(aes), + aes->gcm.H); } else #endif { AES_GCM_ghash_block_aesni(AES_LASTGBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } } /* Calculate the authentication tag. */ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_encrypt_final_avx2(AES_TAG(aes), authTag, authTagSz, aes->cSz, - aes->aSz, aes->H, AES_INITCTR(aes)); + aes->aSz, aes->gcm.H, AES_INITCTR(aes)); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_encrypt_final_avx1(AES_TAG(aes), authTag, authTagSz, aes->cSz, - aes->aSz, aes->H, AES_INITCTR(aes)); + aes->aSz, aes->gcm.H, AES_INITCTR(aes)); } else #endif { AES_GCM_encrypt_final_aesni(AES_TAG(aes), authTag, authTagSz, aes->cSz, - aes->aSz, aes->H, AES_INITCTR(aes)); + aes->aSz, aes->gcm.H, AES_INITCTR(aes)); } - RESTORE_VECTOR_REGISTERS(); + return 0; } @@ -8156,7 +9622,7 @@ * * @param [in, out] aes AES object. * @param [out] p Buffer to hold plaintext. - * @param [in] c Buffer holding ciper text. + * @param [in] c Buffer holding cipher text. * @param [in] cSz Length of cipher text/plaintext in bytes. * @param [in] a Buffer holding authentication data. * @param [in] aSz Length of authentication data in bytes. @@ -8168,7 +9634,8 @@ int partial; int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret;); + ASSERT_SAVED_VECTOR_REGISTERS(); + /* Hash in A, the Authentication Data */ ret = AesGcmAadUpdate_aesni(aes, a, aSz, (cSz > 0) && (c != NULL)); if (ret != 0) @@ -8189,27 +9656,27 @@ /* Decrypt some of the cipher text. */ xorbuf(AES_LASTGBLOCK(aes) + aes->cOver, c, sz); XMEMCPY(p, AES_LASTGBLOCK(aes) + aes->cOver, sz); - /* Update count of unsed encrypted counter. */ + /* Update count of unused encrypted counter. */ aes->cOver += sz; if (aes->cOver == AES_BLOCK_SIZE) { /* We have filled up the block and can process. */ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_ghash_block_avx2(AES_LASTBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_ghash_block_avx1(AES_LASTBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } else #endif { AES_GCM_ghash_block_aesni(AES_LASTBLOCK(aes), AES_TAG(aes), - aes->H); + aes->gcm.H); } /* Reset count. */ aes->cOver = 0; @@ -8228,7 +9695,7 @@ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_decrypt_update_avx2((byte*)aes->key, (int)aes->rounds, - p, c, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->H, + p, c, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->gcm.H, AES_COUNTER(aes)); } else @@ -8236,14 +9703,14 @@ #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_decrypt_update_avx1((byte*)aes->key, (int)aes->rounds, - p, c, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->H, + p, c, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->gcm.H, AES_COUNTER(aes)); } else #endif { AES_GCM_decrypt_update_aesni((byte*)aes->key, (int)aes->rounds, - p, c, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->H, + p, c, blocks * AES_BLOCK_SIZE, AES_TAG(aes), aes->gcm.H, AES_COUNTER(aes)); } /* Skip over to end of blocks. */ @@ -8280,7 +9747,7 @@ aes->cOver = (byte)partial; } } - RESTORE_VECTOR_REGISTERS(); + return 0; } @@ -8304,7 +9771,8 @@ byte over = aes->aOver; byte *lastBlock = AES_LASTGBLOCK(aes); - SAVE_VECTOR_REGISTERS(return _svr_ret;); + ASSERT_SAVED_VECTOR_REGISTERS(); + if (aes->cOver > 0) { /* Cipher text block incomplete. */ over = aes->cOver; @@ -8316,40 +9784,40 @@ /* Hash the last block of cipher text. */ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { - AES_GCM_ghash_block_avx2(lastBlock, AES_TAG(aes), aes->H); + AES_GCM_ghash_block_avx2(lastBlock, AES_TAG(aes), aes->gcm.H); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { - AES_GCM_ghash_block_avx1(lastBlock, AES_TAG(aes), aes->H); + AES_GCM_ghash_block_avx1(lastBlock, AES_TAG(aes), aes->gcm.H); } else #endif { - AES_GCM_ghash_block_aesni(lastBlock, AES_TAG(aes), aes->H); + AES_GCM_ghash_block_aesni(lastBlock, AES_TAG(aes), aes->gcm.H); } } /* Calculate and compare the authentication tag. */ #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { AES_GCM_decrypt_final_avx2(AES_TAG(aes), authTag, authTagSz, aes->cSz, - aes->aSz, aes->H, AES_INITCTR(aes), &res); + aes->aSz, aes->gcm.H, AES_INITCTR(aes), &res); } else #endif #ifdef HAVE_INTEL_AVX1 if (IS_INTEL_AVX1(intel_flags)) { AES_GCM_decrypt_final_avx1(AES_TAG(aes), authTag, authTagSz, aes->cSz, - aes->aSz, aes->H, AES_INITCTR(aes), &res); + aes->aSz, aes->gcm.H, AES_INITCTR(aes), &res); } else #endif { AES_GCM_decrypt_final_aesni(AES_TAG(aes), authTag, authTagSz, aes->cSz, - aes->aSz, aes->H, AES_INITCTR(aes), &res); + aes->aSz, aes->gcm.H, AES_INITCTR(aes), &res); } - RESTORE_VECTOR_REGISTERS(); + /* Return error code when calculated doesn't match input. */ if (res == 0) { ret = AES_GCM_AUTH_E; @@ -8418,16 +9886,12 @@ if (iv != NULL) { /* Initialize with the IV. */ + #ifdef WOLFSSL_AESNI - if (haveAESNI - #ifdef HAVE_INTEL_AVX2 - || IS_INTEL_AVX2(intel_flags) - #endif - #ifdef HAVE_INTEL_AVX1 - || IS_INTEL_AVX1(intel_flags) - #endif - ) { + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = AesGcmInit_aesni(aes, iv, ivSz); + RESTORE_VECTOR_REGISTERS(); } else #endif @@ -8435,7 +9899,8 @@ ret = AesGcmInit_C(aes, iv, ivSz); } - aes->nonceSet = 1; + if (ret == 0) + aes->nonceSet = 1; } } @@ -8547,27 +10012,23 @@ if (ret == 0) { /* Encrypt with AAD and/or plaintext. */ - #if defined(WOLFSSL_AESNI) - if (haveAESNI - #ifdef HAVE_INTEL_AVX2 - || IS_INTEL_AVX2(intel_flags) - #endif - #ifdef HAVE_INTEL_AVX1 - || IS_INTEL_AVX1(intel_flags) - #endif - ) { + + #ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = AesGcmEncryptUpdate_aesni(aes, out, in, sz, authIn, authInSz); + RESTORE_VECTOR_REGISTERS(); } else #endif { /* Encrypt the plaintext. */ ret = AesGcmCryptUpdate_C(aes, out, in, sz); - if (ret != 0) - return ret; - /* Update the authenication tag with any authentication data and the - * new cipher text. */ - GHASH_UPDATE(aes, authIn, authInSz, out, sz); + if (ret == 0) { + /* Update the authentication tag with any authentication data and the + * new cipher text. */ + GHASH_UPDATE(aes, authIn, authInSz, out, sz); + } } } @@ -8606,15 +10067,10 @@ if (ret == 0) { /* Calculate authentication tag. */ #ifdef WOLFSSL_AESNI - if (haveAESNI - #ifdef HAVE_INTEL_AVX2 - || IS_INTEL_AVX2(intel_flags) - #endif - #ifdef HAVE_INTEL_AVX1 - || IS_INTEL_AVX1(intel_flags) - #endif - ) { + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = AesGcmEncryptFinal_aesni(aes, authTag, authTagSz); + RESTORE_VECTOR_REGISTERS(); } else #endif @@ -8693,21 +10149,16 @@ if (ret == 0) { /* Decrypt with AAD and/or cipher text. */ - #if defined(WOLFSSL_AESNI) - if (haveAESNI - #ifdef HAVE_INTEL_AVX2 - || IS_INTEL_AVX2(intel_flags) - #endif - #ifdef HAVE_INTEL_AVX1 - || IS_INTEL_AVX1(intel_flags) - #endif - ) { + #ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = AesGcmDecryptUpdate_aesni(aes, out, in, sz, authIn, authInSz); + RESTORE_VECTOR_REGISTERS(); } else #endif { - /* Update the authenication tag with any authentication data and + /* Update the authentication tag with any authentication data and * cipher text. */ GHASH_UPDATE(aes, authIn, authInSz, in, sz); /* Decrypt the cipher text. */ @@ -8750,15 +10201,10 @@ if (ret == 0) { /* Calculate authentication tag and compare with one passed in.. */ #ifdef WOLFSSL_AESNI - if (haveAESNI - #ifdef HAVE_INTEL_AVX2 - || IS_INTEL_AVX2(intel_flags) - #endif - #ifdef HAVE_INTEL_AVX1 - || IS_INTEL_AVX1(intel_flags) - #endif - ) { + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = AesGcmDecryptFinal_aesni(aes, authTag, authTagSz); + RESTORE_VECTOR_REGISTERS(); } else #endif @@ -8775,10 +10221,6 @@ } } - /* reset the state */ - if (ret == 0) - wc_AesFree(aes); - return ret; } #endif /* HAVE_AES_DECRYPT || HAVE_AESGCM_DECRYPT */ @@ -9045,6 +10487,9 @@ #ifdef WOLFSSL_ARMASM /* implementation located in wolfcrypt/src/port/arm/armv8-aes.c */ +#elif defined(WOLFSSL_RISCV_ASM) + /* implementation located in wolfcrypt/src/port/risc-v/riscv-64-aes.c */ + #elif defined(HAVE_COLDFIRE_SEC) #error "Coldfire SEC doesn't currently support AES-CCM mode" @@ -9297,12 +10742,12 @@ byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { -#ifndef WOLFSSL_AESNI - byte A[AES_BLOCK_SIZE]; - byte B[AES_BLOCK_SIZE]; -#else +#ifdef WOLFSSL_AESNI ALIGN128 byte A[AES_BLOCK_SIZE * 4]; ALIGN128 byte B[AES_BLOCK_SIZE * 4]; +#else + byte A[AES_BLOCK_SIZE]; + byte B[AES_BLOCK_SIZE]; #endif byte lenSz; word32 i; @@ -9316,6 +10761,11 @@ authTagSz > AES_BLOCK_SIZE) return BAD_FUNC_ARG; + /* Sanity check on authIn to prevent segfault in xorbuf() where + * variable 'in' is dereferenced as the mask 'm' in misc.c */ + if (authIn == NULL && authInSz > 0) + return BAD_FUNC_ARG; + /* sanity check on tag size */ if (wc_AesCcmCheckTagSize((int)authTagSz) != 0) { return BAD_FUNC_ARG; @@ -9329,7 +10779,7 @@ int crypto_cb_ret = wc_CryptoCb_AesCcmEncrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz); - if (crypto_cb_ret != CRYPTOCB_UNAVAILABLE) + if (crypto_cb_ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return crypto_cb_ret; /* fall-through when unavailable */ } @@ -9351,67 +10801,38 @@ wc_MemZero_Add("wc_AesCcmEncrypt B", B, sizeof(B)); #endif + VECTOR_REGISTERS_PUSH; ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Add("wc_AesCcmEncrypt A", A, sizeof(A)); + if (ret == 0) + wc_MemZero_Add("wc_AesCcmEncrypt A", A, sizeof(A)); #endif - if (authInSz > 0) { + if ((ret == 0) && (authInSz > 0)) ret = roll_auth(aes, authIn, authInSz, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } - } - if (inSz > 0) { + + if ((ret == 0) && (inSz > 0)) ret = roll_x(aes, in, inSz, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } - } - XMEMCPY(authTag, A, authTagSz); - B[0] = lenSz - 1; - for (i = 0; i < lenSz; i++) - B[AES_BLOCK_SIZE - 1 - i] = 0; - ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; + if (ret == 0) { + XMEMCPY(authTag, A, authTagSz); + + B[0] = lenSz - 1; + for (i = 0; i < lenSz; i++) + B[AES_BLOCK_SIZE - 1 - i] = 0; + ret = wc_AesEncrypt(aes, B, A); } - xorbuf(authTag, A, authTagSz); - B[15] = 1; + if (ret == 0) { + xorbuf(authTag, A, authTagSz); + B[15] = 1; + } #ifdef WOLFSSL_AESNI - if (haveAESNI && aes->use_aesni) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); + if ((ret == 0) && aes->use_aesni) { while (inSz >= AES_BLOCK_SIZE * 4) { AesCcmCtrIncSet4(B, lenSz); - AES_ECB_encrypt(B, A, AES_BLOCK_SIZE * 4, (byte*)aes->key, + AES_ECB_encrypt_AESNI(B, A, AES_BLOCK_SIZE * 4, (byte*)aes->key, (int)aes->rounds); xorbuf(A, in, AES_BLOCK_SIZE * 4); @@ -9423,39 +10844,26 @@ AesCcmCtrInc4(B, lenSz); } - RESTORE_VECTOR_REGISTERS(); } #endif - while (inSz >= AES_BLOCK_SIZE) { - ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } - xorbuf(A, in, AES_BLOCK_SIZE); - XMEMCPY(out, A, AES_BLOCK_SIZE); + if (ret == 0) { + while (inSz >= AES_BLOCK_SIZE) { + ret = wc_AesEncrypt(aes, B, A); + if (ret != 0) + break; + xorbuf(A, in, AES_BLOCK_SIZE); + XMEMCPY(out, A, AES_BLOCK_SIZE); - AesCcmCtrInc(B, lenSz); - inSz -= AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; + AesCcmCtrInc(B, lenSz); + inSz -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } } - if (inSz > 0) { + if ((ret == 0) && (inSz > 0)) { ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } + } + if ((ret == 0) && (inSz > 0)) { xorbuf(A, in, inSz); XMEMCPY(out, A, inSz); } @@ -9468,7 +10876,9 @@ wc_MemZero_Check(B, sizeof(B)); #endif - return 0; + VECTOR_REGISTERS_POP; + + return ret; } #ifdef HAVE_AES_DECRYPT @@ -9478,19 +10888,19 @@ const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { -#ifndef WOLFSSL_AESNI - byte A[AES_BLOCK_SIZE]; - byte B[AES_BLOCK_SIZE]; -#else +#ifdef WOLFSSL_AESNI ALIGN128 byte B[AES_BLOCK_SIZE * 4]; ALIGN128 byte A[AES_BLOCK_SIZE * 4]; +#else + byte A[AES_BLOCK_SIZE]; + byte B[AES_BLOCK_SIZE]; #endif byte* o; byte lenSz; word32 i, oSz; byte mask = 0xFF; const word32 wordSz = (word32)sizeof(word32); - int ret; + int ret = 0; /* sanity check on arguments */ if (aes == NULL || (inSz != 0 && (in == NULL || out == NULL)) || @@ -9498,6 +10908,11 @@ authTagSz > AES_BLOCK_SIZE) return BAD_FUNC_ARG; + /* Sanity check on authIn to prevent segfault in xorbuf() where + * variable 'in' is dereferenced as the mask 'm' in misc.c */ + if (authIn == NULL && authInSz > 0) + return BAD_FUNC_ARG; + /* sanity check on tag size */ if (wc_AesCcmCheckTagSize((int)authTagSz) != 0) { return BAD_FUNC_ARG; @@ -9511,7 +10926,7 @@ int crypto_cb_ret = wc_CryptoCb_AesCcmDecrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz); - if (crypto_cb_ret != CRYPTOCB_UNAVAILABLE) + if (crypto_cb_ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return crypto_cb_ret; /* fall-through when unavailable */ } @@ -9533,13 +10948,14 @@ wc_MemZero_Add("wc_AesCcmEncrypt B", B, sizeof(B)); #endif + VECTOR_REGISTERS_PUSH; + #ifdef WOLFSSL_AESNI - if (haveAESNI && aes->use_aesni) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); + if (aes->use_aesni) { while (oSz >= AES_BLOCK_SIZE * 4) { AesCcmCtrIncSet4(B, lenSz); - AES_ECB_encrypt(B, A, AES_BLOCK_SIZE * 4, (byte*)aes->key, + AES_ECB_encrypt_AESNI(B, A, AES_BLOCK_SIZE * 4, (byte*)aes->key, (int)aes->rounds); xorbuf(A, in, AES_BLOCK_SIZE * 4); @@ -9551,131 +10967,79 @@ AesCcmCtrInc4(B, lenSz); } - RESTORE_VECTOR_REGISTERS(); } #endif + while (oSz >= AES_BLOCK_SIZE) { ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } + if (ret != 0) + break; xorbuf(A, in, AES_BLOCK_SIZE); XMEMCPY(o, A, AES_BLOCK_SIZE); - AesCcmCtrInc(B, lenSz); oSz -= AES_BLOCK_SIZE; in += AES_BLOCK_SIZE; o += AES_BLOCK_SIZE; } - if (inSz > 0) { + + if ((ret == 0) && (inSz > 0)) ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } + + if ((ret == 0) && (inSz > 0)) { xorbuf(A, in, oSz); XMEMCPY(o, A, oSz); + for (i = 0; i < lenSz; i++) + B[AES_BLOCK_SIZE - 1 - i] = 0; + ret = wc_AesEncrypt(aes, B, A); } - for (i = 0; i < lenSz; i++) - B[AES_BLOCK_SIZE - 1 - i] = 0; - ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } - - o = out; - oSz = inSz; + if (ret == 0) { + o = out; + oSz = inSz; - B[0] = (byte)((authInSz > 0 ? 64 : 0) - + (8 * (((byte)authTagSz - 2) / 2)) - + (lenSz - 1)); - for (i = 0; i < lenSz; i++) { - if (mask && i >= wordSz) - mask = 0x00; - B[AES_BLOCK_SIZE - 1 - i] = (byte)((inSz >> ((8 * i) & mask)) & mask); - } + B[0] = (byte)((authInSz > 0 ? 64 : 0) + + (8 * (((byte)authTagSz - 2) / 2)) + + (lenSz - 1)); + for (i = 0; i < lenSz; i++) { + if (mask && i >= wordSz) + mask = 0x00; + B[AES_BLOCK_SIZE - 1 - i] = (byte)((inSz >> ((8 * i) & mask)) & mask); + } - ret = wc_AesEncrypt(aes, B, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; + ret = wc_AesEncrypt(aes, B, A); } - if (authInSz > 0) { - ret = roll_auth(aes, authIn, authInSz, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } + if (ret == 0) { + if (authInSz > 0) + ret = roll_auth(aes, authIn, authInSz, A); } - if (inSz > 0) { + if ((ret == 0) && (inSz > 0)) ret = roll_x(aes, o, oSz, A); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; - } - } - B[0] = lenSz - 1; - for (i = 0; i < lenSz; i++) - B[AES_BLOCK_SIZE - 1 - i] = 0; - ret = wc_AesEncrypt(aes, B, B); - if (ret != 0) { - ForceZero(A, sizeof(A)); - ForceZero(B, sizeof(B)); - #ifdef WOLFSSL_CHECK_MEM_ZERO - wc_MemZero_Check(A, sizeof(A)); - wc_MemZero_Check(B, sizeof(B)); - #endif - return ret; + if (ret == 0) { + B[0] = lenSz - 1; + for (i = 0; i < lenSz; i++) + B[AES_BLOCK_SIZE - 1 - i] = 0; + ret = wc_AesEncrypt(aes, B, B); } - xorbuf(A, B, authTagSz); - if (ConstantCompare(A, authTag, (int)authTagSz) != 0) { - /* If the authTag check fails, don't keep the decrypted data. - * Unfortunately, you need the decrypted data to calculate the - * check value. */ - #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) && \ - defined(ACVP_VECTOR_TESTING) + if (ret == 0) + xorbuf(A, B, authTagSz); + + if (ret == 0) { + if (ConstantCompare(A, authTag, (int)authTagSz) != 0) { + /* If the authTag check fails, don't keep the decrypted data. + * Unfortunately, you need the decrypted data to calculate the + * check value. */ + #if defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) && \ + defined(ACVP_VECTOR_TESTING) WOLFSSL_MSG("Preserve output for vector responses"); - #else + #else if (inSz > 0) XMEMSET(out, 0, inSz); - #endif - ret = AES_CCM_AUTH_E; + #endif + ret = AES_CCM_AUTH_E; + } } ForceZero(A, sizeof(A)); @@ -9687,6 +11051,8 @@ wc_MemZero_Check(B, sizeof(B)); #endif + VECTOR_REGISTERS_POP; + return ret; } @@ -9772,6 +11138,12 @@ return BAD_FUNC_ARG; aes->heap = heap; + aes->rounds = 0; + +#ifdef WOLFSSL_AESNI + /* clear here for the benefit of wc_AesGcmInit(). */ + aes->use_aesni = 0; +#endif #ifdef WOLF_CRYPTO_CB aes->devId = devId; @@ -9784,7 +11156,7 @@ aes->heap, devId); #endif /* WOLFSSL_ASYNC_CRYPT */ -#ifdef WOLFSSL_AFALG +#if defined(WOLFSSL_AFALG) || defined(WOLFSSL_AFALG_XILINX_AES) aes->alFd = WC_SOCK_NOTSET; aes->rdFd = WC_SOCK_NOTSET; #endif @@ -9809,8 +11181,8 @@ #ifdef HAVE_AESGCM #ifdef OPENSSL_EXTRA - XMEMSET(aes->aadH, 0, sizeof(aes->aadH)); - aes->aadLen = 0; + XMEMSET(aes->gcm.aadH, 0, sizeof(aes->gcm.aadH)); + aes->gcm.aadLen = 0; #endif #endif @@ -9829,6 +11201,15 @@ ret = wc_psa_aes_init(aes); #endif +#if defined(WOLFSSL_RENESAS_FSPSM) + XMEMSET(&aes->ctx, 0, sizeof(aes->ctx)); +#endif + +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + if (ret == 0) + ret = wc_debug_CipherLifecycleInit(&aes->CipherLifecycleTag, aes->heap); +#endif + return ret; } @@ -9884,6 +11265,10 @@ if (aes == NULL) return; +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + (void)wc_debug_CipherLifecycleFree(&aes->CipherLifecycleTag, aes->heap, 1); +#endif + #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_AES) wolfAsync_DevCtxFree(&aes->asyncDev, WOLFSSL_ASYNC_MARKER_AES); #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -9939,12 +11324,17 @@ wc_MAXQ10XX_AesFree(aes); #endif +#if ((defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY)) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_AES)) + wc_fspsm_Aesfree(aes); +#endif + #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Check(aes, sizeof(Aes)); #endif } - int wc_AesGetKeySize(Aes* aes, word32* keySize) { int ret = 0; @@ -9986,6 +11376,16 @@ #endif /* !WOLFSSL_TI_CRYPT */ +/* the earlier do-nothing default definitions for VECTOR_REGISTERS_{PUSH,POP} + * are missed when WOLFSSL_TI_CRYPT or WOLFSSL_ARMASM. + */ +#ifndef VECTOR_REGISTERS_PUSH + #define VECTOR_REGISTERS_PUSH { WC_DO_NOTHING +#endif +#ifndef VECTOR_REGISTERS_POP + #define VECTOR_REGISTERS_POP } WC_DO_NOTHING +#endif + #ifdef HAVE_AES_ECB #if defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_AES) && \ !defined(WOLFSSL_QNX_CAAM) @@ -9997,6 +11397,9 @@ #elif defined(WOLFSSL_DEVCRYPTO_AES) /* implemented in wolfcrypt/src/port/devcrypt/devcrypto_aes.c */ +#elif defined(WOLFSSL_RISCV_ASM) + /* implemented in wolfcrypt/src/port/riscv/riscv-64-aes.c */ + #elif defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_AES) /* Software AES - ECB */ @@ -10023,16 +11426,17 @@ static WARN_UNUSED_RESULT int _AesEcbEncrypt( Aes* aes, byte* out, const byte* in, word32 sz) { - word32 blocks = sz / AES_BLOCK_SIZE; + int ret = 0; #ifdef WOLF_CRYPTO_CB #ifndef WOLF_CRYPTO_CB_FIND if (aes->devId != INVALID_DEVID) #endif { - int ret = wc_CryptoCb_AesEcbEncrypt(aes, out, in, sz); - if (ret != CRYPTOCB_UNAVAILABLE) + ret = wc_CryptoCb_AesEcbEncrypt(aes, out, in, sz); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; + ret = 0; /* fall-through when unavailable */ } #endif @@ -10040,38 +11444,51 @@ if (aes->keylen == 16) return DCPAesEcbEncrypt(aes, out, in, sz); #endif + + VECTOR_REGISTERS_PUSH; + #ifdef WOLFSSL_AESNI - if (haveAESNI && aes->use_aesni) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_ECB_encrypt(in, out, sz, (byte*)aes->key, (int)aes->rounds); - RESTORE_VECTOR_REGISTERS(); - blocks = 0; + if (aes->use_aesni) { + AES_ECB_encrypt_AESNI(in, out, sz, (byte*)aes->key, (int)aes->rounds); } + else +#endif + { +#ifdef NEED_AES_TABLES + AesEncryptBlocks_C(aes, in, out, sz); +#else + word32 i; + + for (i = 0; i < sz; i += AES_BLOCK_SIZE) { + ret = wc_AesEncryptDirect(aes, out, in); + if (ret != 0) + break; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } #endif - while (blocks > 0) { - int ret = wc_AesEncryptDirect(aes, out, in); - if (ret != 0) - return ret; - out += AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; - blocks--; } - return 0; + + VECTOR_REGISTERS_POP; + + return ret; } +#ifdef HAVE_AES_DECRYPT static WARN_UNUSED_RESULT int _AesEcbDecrypt( Aes* aes, byte* out, const byte* in, word32 sz) { - word32 blocks = sz / AES_BLOCK_SIZE; + int ret = 0; #ifdef WOLF_CRYPTO_CB #ifndef WOLF_CRYPTO_CB_FIND if (aes->devId != INVALID_DEVID) #endif { - int ret = wc_CryptoCb_AesEcbDecrypt(aes, out, in, sz); - if (ret != CRYPTOCB_UNAVAILABLE) + ret = wc_CryptoCb_AesEcbDecrypt(aes, out, in, sz); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; + ret = 0; /* fall-through when unavailable */ } #endif @@ -10079,52 +11496,60 @@ if (aes->keylen == 16) return DCPAesEcbDecrypt(aes, out, in, sz); #endif + + VECTOR_REGISTERS_PUSH; + #ifdef WOLFSSL_AESNI - if (haveAESNI && aes->use_aesni) { - SAVE_VECTOR_REGISTERS(return _svr_ret;); - AES_ECB_decrypt(in, out, sz, (byte*)aes->key, (int)aes->rounds); - RESTORE_VECTOR_REGISTERS(); - blocks = 0; + if (aes->use_aesni) { + AES_ECB_decrypt_AESNI(in, out, sz, (byte*)aes->key, (int)aes->rounds); } + else +#endif + { +#ifdef NEED_AES_TABLES + AesDecryptBlocks_C(aes, in, out, sz); +#else + word32 i; + + for (i = 0; i < sz; i += AES_BLOCK_SIZE) { + ret = wc_AesDecryptDirect(aes, out, in); + if (ret != 0) + break; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } #endif - while (blocks > 0) { - int ret = wc_AesDecryptDirect(aes, out, in); - if (ret != 0) - return ret; - out += AES_BLOCK_SIZE; - in += AES_BLOCK_SIZE; - blocks--; } - return 0; + + VECTOR_REGISTERS_POP; + + return ret; } +#endif int wc_AesEcbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - int ret; - if ((in == NULL) || (out == NULL) || (aes == NULL)) return BAD_FUNC_ARG; + if ((sz % AES_BLOCK_SIZE) != 0) { + return BAD_LENGTH_E; + } - SAVE_VECTOR_REGISTERS(return _svr_ret;); - ret = _AesEcbEncrypt(aes, out, in, sz); - RESTORE_VECTOR_REGISTERS(); - - return ret; + return _AesEcbEncrypt(aes, out, in, sz); } +#ifdef HAVE_AES_DECRYPT int wc_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - int ret; - if ((in == NULL) || (out == NULL) || (aes == NULL)) return BAD_FUNC_ARG; + if ((sz % AES_BLOCK_SIZE) != 0) { + return BAD_LENGTH_E; + } - SAVE_VECTOR_REGISTERS(return _svr_ret;); - ret = _AesEcbDecrypt(aes, out, in, sz); - RESTORE_VECTOR_REGISTERS(); - - return ret; + return _AesEcbDecrypt(aes, out, in, sz); } +#endif /* HAVE_AES_DECRYPT */ #endif #endif /* HAVE_AES_ECB */ @@ -10165,7 +11590,7 @@ in += processed; sz -= processed; - SAVE_VECTOR_REGISTERS(return _svr_ret;); + VECTOR_REGISTERS_PUSH; while (sz >= AES_BLOCK_SIZE) { /* Using aes->tmp here for inline case i.e. in=out */ @@ -10211,7 +11636,8 @@ #endif aes->left -= sz; } - RESTORE_VECTOR_REGISTERS(); + + VECTOR_REGISTERS_POP; return ret; } @@ -10255,7 +11681,7 @@ in += processed; sz -= processed; - SAVE_VECTOR_REGISTERS(return _svr_ret;); + VECTOR_REGISTERS_PUSH; while (sz > AES_BLOCK_SIZE) { /* Using aes->tmp here for inline case i.e. in=out */ @@ -10299,7 +11725,8 @@ aes->left = AES_BLOCK_SIZE - sz; xorbufout(out, in, aes->tmp, sz); } - RESTORE_VECTOR_REGISTERS(); + + VECTOR_REGISTERS_POP; return ret; } @@ -10382,7 +11809,7 @@ return 0; } - SAVE_VECTOR_REGISTERS(return _svr_ret;); + VECTOR_REGISTERS_PUSH; while (sz > 0) { ret = wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg); @@ -10414,7 +11841,7 @@ sz -= 1; } - RESTORE_VECTOR_REGISTERS(); + VECTOR_REGISTERS_POP; return ret; } @@ -10438,7 +11865,7 @@ return 0; } - SAVE_VECTOR_REGISTERS(return _svr_ret;); + VECTOR_REGISTERS_PUSH; while (sz > 0) { ret = wc_AesEncryptDirect(aes, (byte*)aes->tmp, (byte*)aes->reg); @@ -10486,12 +11913,12 @@ } if (ret == 0) { - if (bit > 0 && bit < 7) { + if (bit >= 0 && bit < 7) { out[0] = cur; } } - RESTORE_VECTOR_REGISTERS(); + VECTOR_REGISTERS_POP; return ret; } @@ -10669,7 +12096,7 @@ XMEMCPY(tmp, iv, KEYWRAP_BLOCK_SIZE); } - SAVE_VECTOR_REGISTERS(return _svr_ret;); + VECTOR_REGISTERS_PUSH; for (j = 0; j <= 5; j++) { for (i = 1; i <= inSz / KEYWRAP_BLOCK_SIZE; i++) { @@ -10692,7 +12119,8 @@ break; r = out + KEYWRAP_BLOCK_SIZE; } - RESTORE_VECTOR_REGISTERS(); + + VECTOR_REGISTERS_POP; if (ret != 0) return ret; @@ -10781,7 +12209,7 @@ XMEMCPY(out, in + KEYWRAP_BLOCK_SIZE, inSz - KEYWRAP_BLOCK_SIZE); XMEMSET(t, 0, sizeof(t)); - SAVE_VECTOR_REGISTERS(return _svr_ret;); + VECTOR_REGISTERS_PUSH; /* initialize counter to 6n */ n = (inSz - 1) / KEYWRAP_BLOCK_SIZE; @@ -10807,7 +12235,8 @@ if (ret != 0) break; } - RESTORE_VECTOR_REGISTERS(); + + VECTOR_REGISTERS_POP; if (ret != 0) return ret; @@ -10868,31 +12297,22 @@ #ifdef WOLFSSL_AES_XTS -/* Galios Field to use */ +/* Galois Field to use */ #define GF_XTS 0x87 -/* This is to help with setting keys to correct encrypt or decrypt type. +/* Set up keys for encryption and/or decryption. * - * tweak AES key for tweak in XTS - * aes AES key for encrypt/decrypt process - * key buffer holding aes key | tweak key - * len length of key buffer in bytes. Should be twice that of key size. i.e. - * 32 for a 16 byte key. - * dir direction, either AES_ENCRYPTION or AES_DECRYPTION + * aes buffer holding aes subkeys * heap heap hint to use for memory. Can be NULL * devId id to use with async crypto. Can be 0 * - * Note: is up to user to call wc_AesFree on tweak and aes key when done. - * * return 0 on success */ -int wc_AesXtsSetKey(XtsAes* aes, const byte* key, word32 len, int dir, - void* heap, int devId) +int wc_AesXtsInit(XtsAes* aes, void* heap, int devId) { - word32 keySz; int ret = 0; - if (aes == NULL || key == NULL) { + if (aes == NULL) { return BAD_FUNC_ARG; } @@ -10900,22 +12320,150 @@ return ret; } if ((ret = wc_AesInit(&aes->aes, heap, devId)) != 0) { + (void)wc_AesFree(&aes->tweak); + return ret; + } +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + if ((ret = wc_AesInit(&aes->aes_decrypt, heap, devId)) != 0) { + (void)wc_AesFree(&aes->tweak); + (void)wc_AesFree(&aes->aes); return ret; } +#endif + + return 0; +} + +/* Set up keys for encryption and/or decryption. + * + * aes buffer holding aes subkeys + * key AES key for encrypt/decrypt and tweak process (concatenated) + * len length of key buffer in bytes. Should be twice that of key size. i.e. + * 32 for a 16 byte key. + * dir direction: AES_ENCRYPTION, AES_DECRYPTION, or + * AES_ENCRYPTION_AND_DECRYPTION + * + * return 0 on success + */ +int wc_AesXtsSetKeyNoInit(XtsAes* aes, const byte* key, word32 len, int dir) +{ + word32 keySz; + int ret = 0; + + if (aes == NULL || key == NULL) { + return BAD_FUNC_ARG; + } - keySz = len/2; - if (keySz != 16 && keySz != 32) { + if ((dir != AES_ENCRYPTION) && (dir != AES_DECRYPTION) +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + && (dir != AES_ENCRYPTION_AND_DECRYPTION) +#endif + ) + { + return BAD_FUNC_ARG; + } + + if ((len != (AES_128_KEY_SIZE*2)) && + (len != (AES_192_KEY_SIZE*2)) && + (len != (AES_256_KEY_SIZE*2))) + { WOLFSSL_MSG("Unsupported key size"); return WC_KEY_SIZE_E; } - if ((ret = wc_AesSetKey(&aes->aes, key, keySz, NULL, dir)) == 0) { + keySz = len/2; + +#ifdef HAVE_FIPS + if (XMEMCMP(key, key + keySz, keySz) == 0) { + WOLFSSL_MSG("FIPS AES-XTS main and tweak keys must differ"); + return BAD_FUNC_ARG; + } +#endif + + if (dir == AES_ENCRYPTION +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + || dir == AES_ENCRYPTION_AND_DECRYPTION +#endif + ) + { + ret = wc_AesSetKey(&aes->aes, key, keySz, NULL, AES_ENCRYPTION); + } + +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + if ((ret == 0) && ((dir == AES_DECRYPTION) + || (dir == AES_ENCRYPTION_AND_DECRYPTION))) + ret = wc_AesSetKey(&aes->aes_decrypt, key, keySz, NULL, AES_DECRYPTION); +#else + if (dir == AES_DECRYPTION) + ret = wc_AesSetKey(&aes->aes, key, keySz, NULL, AES_DECRYPTION); +#endif + + if (ret == 0) ret = wc_AesSetKey(&aes->tweak, key + keySz, keySz, NULL, AES_ENCRYPTION); - if (ret != 0) { - wc_AesFree(&aes->aes); + +#ifdef WOLFSSL_AESNI + if (ret == 0) { + /* With WC_C_DYNAMIC_FALLBACK, the main and tweak keys could have + * conflicting _aesni status, but the AES-XTS asm implementations need + * them to all be AESNI. If any aren't, disable AESNI on all. + */ + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + if ((((dir == AES_ENCRYPTION) || + (dir == AES_ENCRYPTION_AND_DECRYPTION)) + && (aes->aes.use_aesni != aes->tweak.use_aesni)) + || + (((dir == AES_DECRYPTION) || + (dir == AES_ENCRYPTION_AND_DECRYPTION)) + && (aes->aes_decrypt.use_aesni != aes->tweak.use_aesni))) + { + #ifdef WC_C_DYNAMIC_FALLBACK + aes->aes.use_aesni = 0; + aes->aes_decrypt.use_aesni = 0; + aes->tweak.use_aesni = 0; + #else + ret = SYSLIB_FAILED_E; + #endif } + #else /* !WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS */ + if (aes->aes.use_aesni != aes->tweak.use_aesni) { + #ifdef WC_C_DYNAMIC_FALLBACK + aes->aes.use_aesni = 0; + aes->tweak.use_aesni = 0; + #else + ret = SYSLIB_FAILED_E; + #endif + } + #endif /* !WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS */ } +#endif /* WOLFSSL_AESNI */ + + return ret; +} + +/* Combined call to wc_AesXtsInit() and wc_AesXtsSetKeyNoInit(). + * + * Note: is up to user to call wc_AesXtsFree when done. + * + * return 0 on success + */ +int wc_AesXtsSetKey(XtsAes* aes, const byte* key, word32 len, int dir, + void* heap, int devId) +{ + int ret = 0; + + if (aes == NULL || key == NULL) { + return BAD_FUNC_ARG; + } + + ret = wc_AesXtsInit(aes, heap, devId); + if (ret != 0) + return ret; + + ret = wc_AesXtsSetKeyNoInit(aes, key, len, dir); + + if (ret != 0) + wc_AesXtsFree(aes); return ret; } @@ -10931,6 +12479,9 @@ { if (aes != NULL) { wc_AesFree(&aes->aes); +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + wc_AesFree(&aes->aes_decrypt); +#endif wc_AesFree(&aes->tweak); } @@ -10994,6 +12545,68 @@ return wc_AesXtsDecrypt(aes, out, in, sz, (const byte*)i, AES_BLOCK_SIZE); } +#ifdef WOLFSSL_AESNI + +#if defined(USE_INTEL_SPEEDUP) + #define HAVE_INTEL_AVX1 + #define HAVE_INTEL_AVX2 +#endif /* USE_INTEL_SPEEDUP */ + +void AES_XTS_encrypt_aesni(const unsigned char *in, unsigned char *out, word32 sz, + const unsigned char* i, const unsigned char* key, + const unsigned char* key2, int nr) + XASM_LINK("AES_XTS_encrypt_aesni"); +#ifdef WOLFSSL_AESXTS_STREAM +void AES_XTS_init_aesni(unsigned char* i, const unsigned char* tweak_key, + int tweak_nr) + XASM_LINK("AES_XTS_init_aesni"); +void AES_XTS_encrypt_update_aesni(const unsigned char *in, unsigned char *out, word32 sz, + const unsigned char* key, unsigned char *i, int nr) + XASM_LINK("AES_XTS_encrypt_update_aesni"); +#endif +#ifdef HAVE_INTEL_AVX1 +void AES_XTS_encrypt_avx1(const unsigned char *in, unsigned char *out, + word32 sz, const unsigned char* i, + const unsigned char* key, const unsigned char* key2, + int nr) + XASM_LINK("AES_XTS_encrypt_avx1"); +#ifdef WOLFSSL_AESXTS_STREAM +void AES_XTS_init_avx1(unsigned char* i, const unsigned char* tweak_key, + int tweak_nr) + XASM_LINK("AES_XTS_init_avx1"); +void AES_XTS_encrypt_update_avx1(const unsigned char *in, unsigned char *out, word32 sz, + const unsigned char* key, unsigned char *i, int nr) + XASM_LINK("AES_XTS_encrypt_update_avx1"); +#endif +#endif /* HAVE_INTEL_AVX1 */ + +#ifdef HAVE_AES_DECRYPT +void AES_XTS_decrypt_aesni(const unsigned char *in, unsigned char *out, word32 sz, + const unsigned char* i, const unsigned char* key, + const unsigned char* key2, int nr) + XASM_LINK("AES_XTS_decrypt_aesni"); +#ifdef WOLFSSL_AESXTS_STREAM +void AES_XTS_decrypt_update_aesni(const unsigned char *in, unsigned char *out, word32 sz, + const unsigned char* key, unsigned char *i, int nr) + XASM_LINK("AES_XTS_decrypt_update_aesni"); +#endif +#ifdef HAVE_INTEL_AVX1 +void AES_XTS_decrypt_avx1(const unsigned char *in, unsigned char *out, + word32 sz, const unsigned char* i, + const unsigned char* key, const unsigned char* key2, + int nr) + XASM_LINK("AES_XTS_decrypt_avx1"); +#ifdef WOLFSSL_AESXTS_STREAM +void AES_XTS_decrypt_update_avx1(const unsigned char *in, unsigned char *out, word32 sz, + const unsigned char* key, unsigned char *i, int nr) + XASM_LINK("AES_XTS_decrypt_update_avx1"); +#endif +#endif /* HAVE_INTEL_AVX1 */ +#endif /* HAVE_AES_DECRYPT */ + +#endif /* WOLFSSL_AESNI */ + +#if !defined(WOLFSSL_ARMASM) || defined(WOLFSSL_ARMASM_NO_HW_CRYPTO) #ifdef HAVE_AES_ECB /* helper function for encrypting / decrypting full buffer at once */ static WARN_UNUSED_RESULT int _AesXtsHelper( @@ -11025,15 +12638,161 @@ } xorbuf(out, in, totalSz); +#ifndef WOLFSSL_RISCV_ASM if (dir == AES_ENCRYPTION) { return _AesEcbEncrypt(aes, out, out, totalSz); } else { return _AesEcbDecrypt(aes, out, out, totalSz); } +#else + if (dir == AES_ENCRYPTION) { + return wc_AesEcbEncrypt(aes, out, out, totalSz); + } + else { + return wc_AesEcbDecrypt(aes, out, out, totalSz); + } +#endif } #endif /* HAVE_AES_ECB */ +/* AES with XTS mode. (XTS) XEX encryption with Tweak and cipher text Stealing. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold cipher text + * in input plain text buffer to encrypt + * sz size of both out and in buffers + * i value to use for tweak + * + * returns 0 on success + */ +/* Software AES - XTS Encrypt */ + +static int AesXtsEncryptUpdate_sw(XtsAes* xaes, byte* out, const byte* in, + word32 sz, + byte *i); +static int AesXtsEncrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, + const byte* i) +{ + int ret; + byte tweak_block[AES_BLOCK_SIZE]; + + ret = wc_AesEncryptDirect(&xaes->tweak, tweak_block, i); + if (ret != 0) + return ret; + + return AesXtsEncryptUpdate_sw(xaes, out, in, sz, tweak_block); +} + +#ifdef WOLFSSL_AESXTS_STREAM + +/* Block-streaming AES-XTS tweak setup. + * + * xaes AES keys to use for block encrypt/decrypt + * i readwrite value to use for tweak + * + * returns 0 on success + */ +static int AesXtsInitTweak_sw(XtsAes* xaes, byte* i) { + return wc_AesEncryptDirect(&xaes->tweak, i, i); +} + +#endif /* WOLFSSL_AESXTS_STREAM */ + +/* Block-streaming AES-XTS. + * + * Supply block-aligned input data with successive calls. Final call need not + * be block aligned. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold cipher text + * in input plain text buffer to encrypt + * sz size of both out and in buffers + * + * returns 0 on success + */ +/* Software AES - XTS Encrypt */ +static int AesXtsEncryptUpdate_sw(XtsAes* xaes, byte* out, const byte* in, + word32 sz, + byte *i) +{ + int ret = 0; + word32 blocks = (sz / AES_BLOCK_SIZE); + Aes *aes = &xaes->aes; + +#ifdef HAVE_AES_ECB + /* encrypt all of buffer at once when possible */ + if (in != out) { /* can not handle inline */ + XMEMCPY(out, i, AES_BLOCK_SIZE); + if ((ret = _AesXtsHelper(aes, out, in, sz, AES_ENCRYPTION)) != 0) + return ret; + } +#endif + + while (blocks > 0) { + word32 j; + byte carry = 0; + +#ifdef HAVE_AES_ECB + if (in == out) +#endif + { /* check for if inline */ + byte buf[AES_BLOCK_SIZE]; + + XMEMCPY(buf, in, AES_BLOCK_SIZE); + xorbuf(buf, i, AES_BLOCK_SIZE); + ret = wc_AesEncryptDirect(aes, out, buf); + if (ret != 0) + return ret; + } + xorbuf(out, i, AES_BLOCK_SIZE); + + /* multiply by shift left and propagate carry */ + for (j = 0; j < AES_BLOCK_SIZE; j++) { + byte tmpC; + + tmpC = (i[j] >> 7) & 0x01; + i[j] = (byte)((i[j] << 1) + carry); + carry = tmpC; + } + if (carry) { + i[0] ^= GF_XTS; + } + + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + sz -= AES_BLOCK_SIZE; + blocks--; + } + + /* stealing operation of XTS to handle left overs */ + if (sz > 0) { + byte buf[AES_BLOCK_SIZE]; + + XMEMCPY(buf, out - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + if (sz >= AES_BLOCK_SIZE) { /* extra sanity check before copy */ + return BUFFER_E; + } + if (in != out) { + XMEMCPY(out, buf, sz); + XMEMCPY(buf, in, sz); + } + else { + byte buf2[AES_BLOCK_SIZE]; + + XMEMCPY(buf2, buf, sz); + XMEMCPY(buf, in, sz); + XMEMCPY(out, buf2, sz); + } + + xorbuf(buf, i, AES_BLOCK_SIZE); + ret = wc_AesEncryptDirect(aes, out - AES_BLOCK_SIZE, buf); + if (ret == 0) + xorbuf(out - AES_BLOCK_SIZE, i, AES_BLOCK_SIZE); + } + + return ret; +} /* AES with XTS mode. (XTS) XEX encryption with Tweak and cipher text Stealing. * @@ -11047,126 +12806,427 @@ * * returns 0 on success */ -/* Software AES - XTS Encrypt */ int wc_AesXtsEncrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, const byte* i, word32 iSz) { - int ret = 0; - word32 blocks = (sz / AES_BLOCK_SIZE); - Aes *aes, *tweak; + int ret; + + Aes *aes; if (xaes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; } - aes = &xaes->aes; - tweak = &xaes->tweak; - - if (iSz < AES_BLOCK_SIZE) { +#if FIPS_VERSION3_GE(6,0,0) + /* SP800-38E - Restrict data unit to 2^20 blocks per key. A block is + * AES_BLOCK_SIZE or 16-bytes (128-bits). So each key may only be used to + * protect up to 1,048,576 blocks of AES_BLOCK_SIZE (16,777,216 bytes) + */ + if (sz > FIPS_AES_XTS_MAX_BYTES_PER_TWEAK) { + WOLFSSL_MSG("Request exceeds allowed bytes per SP800-38E"); return BAD_FUNC_ARG; } +#endif - if (blocks > 0) { - byte tmp[AES_BLOCK_SIZE]; + aes = &xaes->aes; - XMEMSET(tmp, 0, AES_BLOCK_SIZE); /* set to 0's in case of improper AES - * key setup passed to encrypt direct*/ + if (aes->keylen == 0) { + WOLFSSL_MSG("wc_AesXtsEncrypt called with unset encryption key."); + return BAD_FUNC_ARG; + } - SAVE_VECTOR_REGISTERS(return _svr_ret;); + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } - ret = wc_AesEncryptDirect(tweak, tmp, i); + if (sz < AES_BLOCK_SIZE) { + WOLFSSL_MSG("Plain text input too small for encryption"); + return BAD_FUNC_ARG; + } - if (ret != 0) { + { +#ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_XTS_encrypt_avx1(in, out, sz, i, + (const byte*)aes->key, + (const byte*)xaes->tweak.key, + (int)aes->rounds); + ret = 0; + } + else +#endif + { + AES_XTS_encrypt_aesni(in, out, sz, i, + (const byte*)aes->key, + (const byte*)xaes->tweak.key, + (int)aes->rounds); + ret = 0; + } RESTORE_VECTOR_REGISTERS(); - return ret; } + else +#endif + { + ret = AesXtsEncrypt_sw(xaes, out, in, sz, i); + } + } - #ifdef HAVE_AES_ECB - /* encrypt all of buffer at once when possible */ - if (in != out) { /* can not handle inline */ - XMEMCPY(out, tmp, AES_BLOCK_SIZE); - if ((ret = _AesXtsHelper(aes, out, in, sz, AES_ENCRYPTION)) != 0) { - RESTORE_VECTOR_REGISTERS(); - return ret; + return ret; +} + +#ifdef WOLFSSL_AESXTS_STREAM + +/* Block-streaming AES-XTS. + * + * xaes AES keys to use for block encrypt/decrypt + * i readwrite value to use for tweak + * iSz size of i buffer, should always be AES_BLOCK_SIZE but having this input + * adds a sanity check on how the user calls the function. + * + * returns 0 on success + */ +int wc_AesXtsEncryptInit(XtsAes* xaes, const byte* i, word32 iSz, + struct XtsAesStreamData *stream) +{ + int ret; + + Aes *aes; + + if ((xaes == NULL) || (i == NULL) || (stream == NULL)) { + return BAD_FUNC_ARG; + } + + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + aes = &xaes->aes; + + if (aes->keylen == 0) { + WOLFSSL_MSG("wc_AesXtsEncrypt called with unset encryption key."); + return BAD_FUNC_ARG; + } + + XMEMCPY(stream->tweak_block, i, AES_BLOCK_SIZE); + stream->bytes_crypted_with_this_tweak = 0; + + { +#ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_XTS_init_avx1(stream->tweak_block, + (const byte*)xaes->tweak.key, + (int)xaes->tweak.rounds); + ret = 0; } + else +#endif + { + AES_XTS_init_aesni(stream->tweak_block, + (const byte*)xaes->tweak.key, + (int)xaes->tweak.rounds); + ret = 0; + } + RESTORE_VECTOR_REGISTERS(); } - #endif + else +#endif /* WOLFSSL_AESNI */ + { + ret = AesXtsInitTweak_sw(xaes, stream->tweak_block); + } + } - while (blocks > 0) { - word32 j; - byte carry = 0; - - #ifdef HAVE_AES_ECB - if (in == out) - #endif - { /* check for if inline */ - byte buf[AES_BLOCK_SIZE]; - - XMEMCPY(buf, in, AES_BLOCK_SIZE); - xorbuf(buf, tmp, AES_BLOCK_SIZE); - ret = wc_AesEncryptDirect(aes, out, buf); - if (ret != 0) { - RESTORE_VECTOR_REGISTERS(); - return ret; - } - } - xorbuf(out, tmp, AES_BLOCK_SIZE); + return ret; +} + +/* Block-streaming AES-XTS + * + * Note that sz must be >= AES_BLOCK_SIZE in each call, and must be a multiple + * of AES_BLOCK_SIZE in each call to wc_AesXtsEncryptUpdate(). + * wc_AesXtsEncryptFinal() can handle any length >= AES_BLOCK_SIZE. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold cipher text + * in input plain text buffer to encrypt + * sz size of both out and in buffers -- must be >= AES_BLOCK_SIZE. + * i value to use for tweak + * iSz size of i buffer, should always be AES_BLOCK_SIZE but having this input + * adds a sanity check on how the user calls the function. + * + * returns 0 on success + */ +static int AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz, + struct XtsAesStreamData *stream) +{ + int ret; - /* multiply by shift left and propagate carry */ - for (j = 0; j < AES_BLOCK_SIZE; j++) { - byte tmpC; - - tmpC = (tmp[j] >> 7) & 0x01; - tmp[j] = (byte)((tmp[j] << 1) + carry); - carry = tmpC; +#ifdef WOLFSSL_AESNI + Aes *aes; +#endif + + if (xaes == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_AESNI + aes = &xaes->aes; +#endif + + if (sz < AES_BLOCK_SIZE) { + WOLFSSL_MSG("Plain text input too small for encryption"); + return BAD_FUNC_ARG; + } + + if (stream->bytes_crypted_with_this_tweak & ((word32)AES_BLOCK_SIZE - 1U)) + { + WOLFSSL_MSG("Call to AesXtsEncryptUpdate after previous finalizing call"); + return BAD_FUNC_ARG; + } + +#ifndef WC_AESXTS_STREAM_NO_REQUEST_ACCOUNTING + (void)WC_SAFE_SUM_WORD32(stream->bytes_crypted_with_this_tweak, sz, + stream->bytes_crypted_with_this_tweak); +#endif +#if FIPS_VERSION3_GE(6,0,0) + /* SP800-38E - Restrict data unit to 2^20 blocks per key. A block is + * AES_BLOCK_SIZE or 16-bytes (128-bits). So each key may only be used to + * protect up to 1,048,576 blocks of AES_BLOCK_SIZE (16,777,216 bytes) + */ + if (stream->bytes_crypted_with_this_tweak > + FIPS_AES_XTS_MAX_BYTES_PER_TWEAK) + { + WOLFSSL_MSG("Request exceeds allowed bytes per SP800-38E"); + return BAD_FUNC_ARG; + } +#endif + { +#ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_XTS_encrypt_update_avx1(in, out, sz, + (const byte*)aes->key, + stream->tweak_block, + (int)aes->rounds); + ret = 0; } - if (carry) { - tmp[0] ^= GF_XTS; + else +#endif + { + AES_XTS_encrypt_update_aesni(in, out, sz, + (const byte*)aes->key, + stream->tweak_block, + (int)aes->rounds); + ret = 0; } - - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - sz -= AES_BLOCK_SIZE; - blocks--; + RESTORE_VECTOR_REGISTERS(); + } + else +#endif /* WOLFSSL_AESNI */ + { + ret = AesXtsEncryptUpdate_sw(xaes, out, in, sz, stream->tweak_block); } + } + + return ret; +} + +int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz, + struct XtsAesStreamData *stream) +{ + if (stream == NULL) + return BAD_FUNC_ARG; + if (sz & ((word32)AES_BLOCK_SIZE - 1U)) + return BAD_FUNC_ARG; + return AesXtsEncryptUpdate(xaes, out, in, sz, stream); +} + +int wc_AesXtsEncryptFinal(XtsAes* xaes, byte* out, const byte* in, word32 sz, + struct XtsAesStreamData *stream) +{ + int ret; + if (stream == NULL) + return BAD_FUNC_ARG; + if (sz > 0) + ret = AesXtsEncryptUpdate(xaes, out, in, sz, stream); + else + ret = 0; + /* force the count odd, to assure error on attempt to AesXtsEncryptUpdate() + * after finalization. + */ + stream->bytes_crypted_with_this_tweak |= 1U; + ForceZero(stream->tweak_block, AES_BLOCK_SIZE); +#ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(stream->tweak_block, AES_BLOCK_SIZE); +#endif + return ret; +} + +#endif /* WOLFSSL_AESXTS_STREAM */ + + +/* Same process as encryption but use aes_decrypt key. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold plain text + * in input cipher text buffer to decrypt + * sz size of both out and in buffers + * i value to use for tweak + * + * returns 0 on success + */ +/* Software AES - XTS Decrypt */ + +static int AesXtsDecryptUpdate_sw(XtsAes* xaes, byte* out, const byte* in, + word32 sz, byte *i); + +static int AesXtsDecrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz, + const byte* i) +{ + int ret; + byte tweak_block[AES_BLOCK_SIZE]; - /* stealing operation of XTS to handle left overs */ - if (sz > 0) { + ret = wc_AesEncryptDirect(&xaes->tweak, tweak_block, i); + if (ret != 0) + return ret; + + return AesXtsDecryptUpdate_sw(xaes, out, in, sz, tweak_block); +} + +/* Block-streaming AES-XTS. + * + * Same process as encryption but use decrypt key. + * + * Supply block-aligned input data with successive calls. Final call need not + * be block aligned. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold plain text + * in input cipher text buffer to decrypt + * sz size of both out and in buffers + * i value to use for tweak + * + * returns 0 on success + */ +/* Software AES - XTS Decrypt */ +static int AesXtsDecryptUpdate_sw(XtsAes* xaes, byte* out, const byte* in, + word32 sz, byte *i) +{ + int ret = 0; + word32 blocks = (sz / AES_BLOCK_SIZE); +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + Aes *aes = &xaes->aes_decrypt; +#else + Aes *aes = &xaes->aes; +#endif + word32 j; + byte carry = 0; + byte stl = (sz % AES_BLOCK_SIZE); + + /* if Stealing then break out of loop one block early to handle special + * case */ + if (stl > 0) { + blocks--; + } + +#ifdef HAVE_AES_ECB + /* decrypt all of buffer at once when possible */ + if (in != out) { /* can not handle inline */ + XMEMCPY(out, i, AES_BLOCK_SIZE); + if ((ret = _AesXtsHelper(aes, out, in, sz, AES_DECRYPTION)) != 0) + return ret; + } +#endif + + while (blocks > 0) { +#ifdef HAVE_AES_ECB + if (in == out) +#endif + { /* check for if inline */ byte buf[AES_BLOCK_SIZE]; - XMEMCPY(buf, out - AES_BLOCK_SIZE, AES_BLOCK_SIZE); - if (sz >= AES_BLOCK_SIZE) { /* extra sanity check before copy */ - RESTORE_VECTOR_REGISTERS(); - return BUFFER_E; - } - if (in != out) { - XMEMCPY(out, buf, sz); - XMEMCPY(buf, in, sz); - } - else { - byte buf2[AES_BLOCK_SIZE]; + XMEMCPY(buf, in, AES_BLOCK_SIZE); + xorbuf(buf, i, AES_BLOCK_SIZE); + ret = wc_AesDecryptDirect(aes, out, buf); + if (ret != 0) + return ret; + } + xorbuf(out, i, AES_BLOCK_SIZE); - XMEMCPY(buf2, buf, sz); - XMEMCPY(buf, in, sz); - XMEMCPY(out, buf2, sz); - } + /* multiply by shift left and propagate carry */ + for (j = 0; j < AES_BLOCK_SIZE; j++) { + byte tmpC; - xorbuf(buf, tmp, AES_BLOCK_SIZE); - ret = wc_AesEncryptDirect(aes, out - AES_BLOCK_SIZE, buf); - if (ret == 0) - xorbuf(out - AES_BLOCK_SIZE, tmp, AES_BLOCK_SIZE); + tmpC = (i[j] >> 7) & 0x01; + i[j] = (byte)((i[j] << 1) + carry); + carry = tmpC; } - RESTORE_VECTOR_REGISTERS(); + if (carry) { + i[0] ^= GF_XTS; + } + carry = 0; + + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + sz -= AES_BLOCK_SIZE; + blocks--; } - else { - WOLFSSL_MSG("Plain text input too small for encryption"); - return BAD_FUNC_ARG; + + /* stealing operation of XTS to handle left overs */ + if (sz >= AES_BLOCK_SIZE) { + byte buf[AES_BLOCK_SIZE]; + byte tmp2[AES_BLOCK_SIZE]; + + /* multiply by shift left and propagate carry */ + for (j = 0; j < AES_BLOCK_SIZE; j++) { + byte tmpC; + + tmpC = (i[j] >> 7) & 0x01; + tmp2[j] = (byte)((i[j] << 1) + carry); + carry = tmpC; + } + if (carry) { + tmp2[0] ^= GF_XTS; + } + + XMEMCPY(buf, in, AES_BLOCK_SIZE); + xorbuf(buf, tmp2, AES_BLOCK_SIZE); + ret = wc_AesDecryptDirect(aes, out, buf); + if (ret != 0) + return ret; + xorbuf(out, tmp2, AES_BLOCK_SIZE); + + /* tmp2 holds partial | last */ + XMEMCPY(tmp2, out, AES_BLOCK_SIZE); + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + sz -= AES_BLOCK_SIZE; + + /* Make buffer with end of cipher text | last */ + XMEMCPY(buf, tmp2, AES_BLOCK_SIZE); + if (sz >= AES_BLOCK_SIZE) { /* extra sanity check before copy */ + return BUFFER_E; + } + XMEMCPY(buf, in, sz); + XMEMCPY(out, tmp2, sz); + + xorbuf(buf, i, AES_BLOCK_SIZE); + ret = wc_AesDecryptDirect(aes, tmp2, buf); + if (ret != 0) + return ret; + xorbuf(tmp2, i, AES_BLOCK_SIZE); + XMEMCPY(out - AES_BLOCK_SIZE, tmp2, AES_BLOCK_SIZE); } return ret; } - /* Same process as encryption but Aes key is AES_DECRYPTION type. * * xaes AES keys to use for block encrypt/decrypt @@ -11179,155 +13239,365 @@ * * returns 0 on success */ -/* Software AES - XTS Decrypt */ int wc_AesXtsDecrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, const byte* i, word32 iSz) { - int ret = 0; - word32 blocks = (sz / AES_BLOCK_SIZE); - Aes *aes, *tweak; + int ret; + Aes *aes; if (xaes == NULL || out == NULL || in == NULL) { return BAD_FUNC_ARG; } - aes = &xaes->aes; - tweak = &xaes->tweak; +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + aes = &xaes->aes_decrypt; +#else + aes = &xaes->aes; +#endif - if (iSz < AES_BLOCK_SIZE) { +/* FIPS TODO: SP800-38E - Restrict data unit to 2^20 blocks per key. A block is + * AES_BLOCK_SIZE or 16-bytes (128-bits). So each key may only be used to + * protect up to 1,048,576 blocks of AES_BLOCK_SIZE (16,777,216 bytes or + * 134,217,728-bits) Add helpful printout and message along with BAD_FUNC_ARG + * return whenever sz / AES_BLOCK_SIZE > 1,048,576 or equal to that and sz is + * not a sequence of complete blocks. + */ + + if (aes->keylen == 0) { + WOLFSSL_MSG("wc_AesXtsDecrypt called with unset decryption key."); return BAD_FUNC_ARG; } - if (blocks > 0) { - word32 j; - byte carry = 0; - byte tmp[AES_BLOCK_SIZE]; - byte stl = (sz % AES_BLOCK_SIZE); - - XMEMSET(tmp, 0, AES_BLOCK_SIZE); /* set to 0's in case of improper AES - * key setup passed to decrypt direct*/ + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } - SAVE_VECTOR_REGISTERS(return _svr_ret;); + if (sz < AES_BLOCK_SIZE) { + WOLFSSL_MSG("Cipher text input too small for decryption"); + return BAD_FUNC_ARG; + } - ret = wc_AesEncryptDirect(tweak, tmp, i); - if (ret != 0) { + { +#ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_XTS_decrypt_avx1(in, out, sz, i, + (const byte*)aes->key, + (const byte*)xaes->tweak.key, + (int)aes->rounds); + ret = 0; + } + else +#endif + { + AES_XTS_decrypt_aesni(in, out, sz, i, + (const byte*)aes->key, + (const byte*)xaes->tweak.key, + (int)aes->rounds); + ret = 0; + } RESTORE_VECTOR_REGISTERS(); - return ret; } - - /* if Stealing then break out of loop one block early to handle special - * case */ - if (stl > 0) { - blocks--; + else +#endif + { + ret = AesXtsDecrypt_sw(xaes, out, in, sz, i); } - #ifdef HAVE_AES_ECB - /* decrypt all of buffer at once when possible */ - if (in != out) { /* can not handle inline */ - XMEMCPY(out, tmp, AES_BLOCK_SIZE); - if ((ret = _AesXtsHelper(aes, out, in, sz, AES_DECRYPTION)) != 0) { - RESTORE_VECTOR_REGISTERS(); - return ret; - } - } - #endif + return ret; + } +} - while (blocks > 0) { - #ifdef HAVE_AES_ECB - if (in == out) - #endif - { /* check for if inline */ - byte buf[AES_BLOCK_SIZE]; - - XMEMCPY(buf, in, AES_BLOCK_SIZE); - xorbuf(buf, tmp, AES_BLOCK_SIZE); - ret = wc_AesDecryptDirect(aes, out, buf); - if (ret != 0) { - RESTORE_VECTOR_REGISTERS(); - return ret; - } - } - xorbuf(out, tmp, AES_BLOCK_SIZE); +#ifdef WOLFSSL_AESXTS_STREAM - /* multiply by shift left and propagate carry */ - for (j = 0; j < AES_BLOCK_SIZE; j++) { - byte tmpC; +/* Same process as encryption but Aes key is AES_DECRYPTION type. + * + * xaes AES keys to use for block encrypt/decrypt + * i readwrite value to use for tweak + * iSz size of i buffer, should always be AES_BLOCK_SIZE but having this input + * adds a sanity check on how the user calls the function. + * + * returns 0 on success + */ +int wc_AesXtsDecryptInit(XtsAes* xaes, const byte* i, word32 iSz, + struct XtsAesStreamData *stream) +{ + int ret; + Aes *aes; - tmpC = (tmp[j] >> 7) & 0x01; - tmp[j] = (byte)((tmp[j] << 1) + carry); - carry = tmpC; - } - if (carry) { - tmp[0] ^= GF_XTS; - } - carry = 0; + if (xaes == NULL) { + return BAD_FUNC_ARG; + } - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - sz -= AES_BLOCK_SIZE; - blocks--; - } +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + aes = &xaes->aes_decrypt; +#else + aes = &xaes->aes; +#endif - /* stealing operation of XTS to handle left overs */ - if (sz >= AES_BLOCK_SIZE) { - byte buf[AES_BLOCK_SIZE]; - byte tmp2[AES_BLOCK_SIZE]; + if (aes->keylen == 0) { + WOLFSSL_MSG("wc_AesXtsDecrypt called with unset decryption key."); + return BAD_FUNC_ARG; + } - /* multiply by shift left and propagate carry */ - for (j = 0; j < AES_BLOCK_SIZE; j++) { - byte tmpC; - - tmpC = (tmp[j] >> 7) & 0x01; - tmp2[j] = (byte)((tmp[j] << 1) + carry); - carry = tmpC; + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + XMEMCPY(stream->tweak_block, i, AES_BLOCK_SIZE); + stream->bytes_crypted_with_this_tweak = 0; + + { +#ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_XTS_init_avx1(stream->tweak_block, + (const byte*)xaes->tweak.key, + (int)xaes->tweak.rounds); + ret = 0; } - if (carry) { - tmp2[0] ^= GF_XTS; + else +#endif + { + AES_XTS_init_aesni(stream->tweak_block, + (const byte*)xaes->tweak.key, + (int)xaes->tweak.rounds); + ret = 0; } + RESTORE_VECTOR_REGISTERS(); + } + else +#endif /* WOLFSSL_AESNI */ + { + ret = AesXtsInitTweak_sw(xaes, stream->tweak_block); + } - XMEMCPY(buf, in, AES_BLOCK_SIZE); - xorbuf(buf, tmp2, AES_BLOCK_SIZE); - ret = wc_AesDecryptDirect(aes, out, buf); - if (ret != 0) { - RESTORE_VECTOR_REGISTERS(); - return ret; - } - xorbuf(out, tmp2, AES_BLOCK_SIZE); + } - /* tmp2 holds partial | last */ - XMEMCPY(tmp2, out, AES_BLOCK_SIZE); - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - sz -= AES_BLOCK_SIZE; + return ret; +} - /* Make buffer with end of cipher text | last */ - XMEMCPY(buf, tmp2, AES_BLOCK_SIZE); - if (sz >= AES_BLOCK_SIZE) { /* extra sanity check before copy */ - RESTORE_VECTOR_REGISTERS(); - return BUFFER_E; - } - XMEMCPY(buf, in, sz); - XMEMCPY(out, tmp2, sz); +/* Block-streaming AES-XTS + * + * Note that sz must be >= AES_BLOCK_SIZE in each call, and must be a multiple + * of AES_BLOCK_SIZE in each call to wc_AesXtsDecryptUpdate(). + * wc_AesXtsDecryptFinal() can handle any length >= AES_BLOCK_SIZE. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold plain text + * in input cipher text buffer to decrypt + * sz size of both out and in buffers + * i tweak buffer of size AES_BLOCK_SIZE. + * + * returns 0 on success + */ +static int AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz, + struct XtsAesStreamData *stream) +{ + int ret; +#ifdef WOLFSSL_AESNI + Aes *aes; +#endif - xorbuf(buf, tmp, AES_BLOCK_SIZE); - ret = wc_AesDecryptDirect(aes, tmp2, buf); - if (ret != 0) { - RESTORE_VECTOR_REGISTERS(); - return ret; + if (xaes == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_AESNI +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + aes = &xaes->aes_decrypt; +#else + aes = &xaes->aes; +#endif +#endif + + if (sz < AES_BLOCK_SIZE) { + WOLFSSL_MSG("Cipher text input too small for decryption"); + return BAD_FUNC_ARG; + } + + if (stream->bytes_crypted_with_this_tweak & ((word32)AES_BLOCK_SIZE - 1U)) + { + WOLFSSL_MSG("Call to AesXtsDecryptUpdate after previous finalizing call"); + return BAD_FUNC_ARG; + } + +#ifndef WC_AESXTS_STREAM_NO_REQUEST_ACCOUNTING + (void)WC_SAFE_SUM_WORD32(stream->bytes_crypted_with_this_tweak, sz, + stream->bytes_crypted_with_this_tweak); +#endif + + { +#ifdef WOLFSSL_AESNI + if (aes->use_aesni) { + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + AES_XTS_decrypt_update_avx1(in, out, sz, + (const byte*)aes->key, + stream->tweak_block, + (int)aes->rounds); + ret = 0; + } + else +#endif + { + AES_XTS_decrypt_update_aesni(in, out, sz, + (const byte*)aes->key, + stream->tweak_block, + (int)aes->rounds); + ret = 0; } - xorbuf(tmp2, tmp, AES_BLOCK_SIZE); - XMEMCPY(out - AES_BLOCK_SIZE, tmp2, AES_BLOCK_SIZE); + RESTORE_VECTOR_REGISTERS(); + } + else +#endif /* WOLFSSL_AESNI */ + { + ret = AesXtsDecryptUpdate_sw(xaes, out, in, sz, + stream->tweak_block); } - RESTORE_VECTOR_REGISTERS(); } - else { - WOLFSSL_MSG("Plain text input too small for encryption"); + + return ret; +} + +int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz, + struct XtsAesStreamData *stream) +{ + if (stream == NULL) + return BAD_FUNC_ARG; + if (sz & ((word32)AES_BLOCK_SIZE - 1U)) + return BAD_FUNC_ARG; + return AesXtsDecryptUpdate(xaes, out, in, sz, stream); +} + +int wc_AesXtsDecryptFinal(XtsAes* xaes, byte* out, const byte* in, word32 sz, + struct XtsAesStreamData *stream) +{ + int ret; + if (stream == NULL) + return BAD_FUNC_ARG; + if (sz > 0) + ret = AesXtsDecryptUpdate(xaes, out, in, sz, stream); + else + ret = 0; + ForceZero(stream->tweak_block, AES_BLOCK_SIZE); + /* force the count odd, to assure error on attempt to AesXtsEncryptUpdate() + * after finalization. + */ + stream->bytes_crypted_with_this_tweak |= 1U; +#ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(stream->tweak_block, AES_BLOCK_SIZE); +#endif + return ret; +} + +#endif /* WOLFSSL_AESXTS_STREAM */ + +#endif /* !WOLFSSL_ARMASM || WOLFSSL_ARMASM_NO_HW_CRYPTO */ + +/* Same as wc_AesXtsEncryptSector but the sector gets incremented by one every + * sectorSz bytes + * + * xaes AES keys to use for block encrypt + * out output buffer to hold cipher text + * in input plain text buffer to encrypt + * sz size of both out and in buffers + * sector value to use for tweak + * sectorSz size of the sector + * + * returns 0 on success + */ +int wc_AesXtsEncryptConsecutiveSectors(XtsAes* aes, byte* out, const byte* in, + word32 sz, word64 sector, word32 sectorSz) +{ + int ret = 0; + word32 iter = 0; + word32 sectorCount; + word32 remainder; + + if (aes == NULL || out == NULL || in == NULL || sectorSz == 0) { return BAD_FUNC_ARG; } + if (sz < AES_BLOCK_SIZE) { + WOLFSSL_MSG("Cipher text input too small for encryption"); + return BAD_FUNC_ARG; + } + + sectorCount = sz / sectorSz; + remainder = sz % sectorSz; + + while (sectorCount) { + ret = wc_AesXtsEncryptSector(aes, out + (iter * sectorSz), + in + (iter * sectorSz), sectorSz, sector); + if (ret != 0) + break; + + sectorCount--; + iter++; + sector++; + } + + if (remainder && ret == 0) + ret = wc_AesXtsEncryptSector(aes, out + (iter * sectorSz), + in + (iter * sectorSz), remainder, sector); + return ret; } +/* Same as wc_AesXtsEncryptConsecutiveSectors but Aes key is AES_DECRYPTION type + * + * xaes AES keys to use for block decrypt + * out output buffer to hold cipher text + * in input plain text buffer to encrypt + * sz size of both out and in buffers + * sector value to use for tweak + * sectorSz size of the sector + * + * returns 0 on success + */ +int wc_AesXtsDecryptConsecutiveSectors(XtsAes* aes, byte* out, const byte* in, + word32 sz, word64 sector, word32 sectorSz) +{ + int ret = 0; + word32 iter = 0; + word32 sectorCount; + word32 remainder; + + if (aes == NULL || out == NULL || in == NULL || sectorSz == 0) { + return BAD_FUNC_ARG; + } + + if (sz < AES_BLOCK_SIZE) { + WOLFSSL_MSG("Cipher text input too small for decryption"); + return BAD_FUNC_ARG; + } + + sectorCount = sz / sectorSz; + remainder = sz % sectorSz; + + while (sectorCount) { + ret = wc_AesXtsDecryptSector(aes, out + (iter * sectorSz), + in + (iter * sectorSz), sectorSz, sector); + if (ret != 0) + break; + + sectorCount--; + iter++; + sector++; + } + + if (remainder && ret == 0) + ret = wc_AesXtsDecryptSector(aes, out + (iter * sectorSz), + in + (iter * sectorSz), remainder, sector); + + return ret; +} #endif /* WOLFSSL_AES_XTS */ #ifdef WOLFSSL_AES_SIV @@ -11572,5 +13842,518 @@ #endif /* WOLFSSL_AES_SIV */ -#endif /* HAVE_FIPS */ +#if defined(WOLFSSL_AES_EAX) + +/* + * AES EAX one-shot API + * Encrypts input data and computes an auth tag over the input + * auth data and ciphertext + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxEncryptAuth(const byte* key, word32 keySz, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + /* output computed auth tag */ + byte* authTag, word32 authTagSz, + /* input data to authenticate */ + const byte* authIn, word32 authInSz) +{ +#if defined(WOLFSSL_SMALL_STACK) + AesEax *eax; +#else + AesEax eax_mem; + AesEax *eax = &eax_mem; +#endif + int ret; + int eaxInited = 0; + + if (key == NULL || out == NULL || in == NULL || nonce == NULL + || authTag == NULL || authIn == NULL) { + return BAD_FUNC_ARG; + } + +#if defined(WOLFSSL_SMALL_STACK) + if ((eax = (AesEax *)XMALLOC(sizeof(AesEax), + NULL, + DYNAMIC_TYPE_AES_EAX)) == NULL) { + return MEMORY_E; + } +#endif + + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + authIn, authInSz)) != 0) { + goto cleanup; + } + eaxInited = 1; + + if ((ret = wc_AesEaxEncryptUpdate(eax, out, in, inSz, NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxEncryptFinal(eax, authTag, authTagSz)) != 0) { + goto cleanup; + } + +cleanup: + if (eaxInited) + wc_AesEaxFree(eax); +#if defined(WOLFSSL_SMALL_STACK) + XFREE(eax, NULL, DYNAMIC_TYPE_AES_EAX); +#endif + return ret; +} + + +/* + * AES EAX one-shot API + * Decrypts and authenticates data against a supplied auth tag + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxDecryptAuth(const byte* key, word32 keySz, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + /* auth tag to verify against */ + const byte* authTag, word32 authTagSz, + /* input data to authenticate */ + const byte* authIn, word32 authInSz) +{ +#if defined(WOLFSSL_SMALL_STACK) + AesEax *eax; +#else + AesEax eax_mem; + AesEax *eax = &eax_mem; +#endif + int ret; + int eaxInited = 0; + + if (key == NULL || out == NULL || in == NULL || nonce == NULL + || authTag == NULL || authIn == NULL) { + return BAD_FUNC_ARG; + } + +#if defined(WOLFSSL_SMALL_STACK) + if ((eax = (AesEax *)XMALLOC(sizeof(AesEax), + NULL, + DYNAMIC_TYPE_AES_EAX)) == NULL) { + return MEMORY_E; + } +#endif + + if ((ret = wc_AesEaxInit(eax, + key, keySz, + nonce, nonceSz, + authIn, authInSz)) != 0) { + + goto cleanup; + } + eaxInited = 1; + + if ((ret = wc_AesEaxDecryptUpdate(eax, out, in, inSz, NULL, 0)) != 0) { + goto cleanup; + } + + if ((ret = wc_AesEaxDecryptFinal(eax, authTag, authTagSz)) != 0) { + goto cleanup; + } + +cleanup: + if (eaxInited) + wc_AesEaxFree(eax); +#if defined(WOLFSSL_SMALL_STACK) + XFREE(eax, NULL, DYNAMIC_TYPE_AES_EAX); +#endif + return ret; +} + + +/* + * AES EAX Incremental API: + * Initializes an AES EAX encryption or decryption operation. This must be + * called before any other EAX APIs are used on the AesEax struct + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxInit(AesEax* eax, + const byte* key, word32 keySz, + const byte* nonce, word32 nonceSz, + const byte* authIn, word32 authInSz) +{ + int ret = 0; + word32 cmacSize; + int aesInited = 0; + int nonceCmacInited = 0; + int aadCmacInited = 0; + + if (eax == NULL || key == NULL || nonce == NULL) { + return BAD_FUNC_ARG; + } + + XMEMSET(eax->prefixBuf, 0, sizeof(eax->prefixBuf)); + + if ((ret = wc_AesInit(&eax->aes, NULL, INVALID_DEVID)) != 0) { + goto out; + } + aesInited = 1; + + if ((ret = wc_AesSetKey(&eax->aes, + key, + keySz, + NULL, + AES_ENCRYPTION)) != 0) { + goto out; + } + + /* + * OMAC the nonce to use as the IV for CTR encryption and auth tag chunk + * N' = OMAC^0_K(N) + */ + if ((ret = wc_InitCmac(&eax->nonceCmac, + key, + keySz, + WC_CMAC_AES, + NULL)) != 0) { + return ret; + } + nonceCmacInited = 1; + + if ((ret = wc_CmacUpdate(&eax->nonceCmac, + eax->prefixBuf, + sizeof(eax->prefixBuf))) != 0) { + goto out; + } + + if ((ret = wc_CmacUpdate(&eax->nonceCmac, nonce, nonceSz)) != 0) { + goto out; + } + + cmacSize = AES_BLOCK_SIZE; + if ((ret = wc_CmacFinal(&eax->nonceCmac, + eax->nonceCmacFinal, + &cmacSize)) != 0) { + goto out; + } + + if ((ret = wc_AesSetIV(&eax->aes, eax->nonceCmacFinal)) != 0) { + goto out; + } + + /* + * start the OMAC used to build the auth tag chunk for the AD . + * This CMAC is continued in subsequent update calls when more auth data is + * provided + * H' = OMAC^1_K(H) + */ + eax->prefixBuf[AES_BLOCK_SIZE-1] = 1; + if ((ret = wc_InitCmac(&eax->aadCmac, + key, + keySz, + WC_CMAC_AES, + NULL)) != 0) { + goto out; + } + aadCmacInited = 1; + + if ((ret = wc_CmacUpdate(&eax->aadCmac, + eax->prefixBuf, + sizeof(eax->prefixBuf))) != 0) { + goto out; + } + + if (authIn != NULL) { + if ((ret = wc_CmacUpdate(&eax->aadCmac, authIn, authInSz)) != 0) { + goto out; + } + } + + /* + * start the OMAC to create auth tag chunk for ciphertext. This MAC will be + * updated in subsequent calls to encrypt/decrypt + * C' = OMAC^2_K(C) + */ + eax->prefixBuf[AES_BLOCK_SIZE-1] = 2; + if ((ret = wc_InitCmac(&eax->ciphertextCmac, + key, + keySz, + WC_CMAC_AES, + NULL)) != 0) { + goto out; + } + + if ((ret = wc_CmacUpdate(&eax->ciphertextCmac, + eax->prefixBuf, + sizeof(eax->prefixBuf))) != 0) { + goto out; + } + +out: + + if (ret != 0) { + if (aesInited) + wc_AesFree(&eax->aes); + if (nonceCmacInited) + wc_CmacFree(&eax->nonceCmac); + if (aadCmacInited) + wc_CmacFree(&eax->aadCmac); + } + + return ret; +} + + +/* + * AES EAX Incremental API: + * Encrypts input plaintext using AES EAX mode, adding optional auth data to + * the authentication stream + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxEncryptUpdate(AesEax* eax, byte* out, + const byte* in, word32 inSz, + const byte* authIn, word32 authInSz) +{ + int ret; + + if (eax == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + /* + * Encrypt the plaintext using AES CTR + * C = CTR(M) + */ + if ((ret = wc_AesCtrEncrypt(&eax->aes, out, in, inSz)) != 0) { + return ret; + } + + /* + * update OMAC with new ciphertext + * C' = OMAC^2_K(C) + */ + if ((ret = wc_CmacUpdate(&eax->ciphertextCmac, out, inSz)) != 0) { + return ret; + } + + /* If there exists new auth data, update the OMAC for that as well */ + if (authIn != NULL) { + if ((ret = wc_CmacUpdate(&eax->aadCmac, authIn, authInSz)) != 0) { + return ret; + } + } + + return 0; +} + + +/* + * AES EAX Incremental API: + * Decrypts input ciphertext using AES EAX mode, adding optional auth data to + * the authentication stream + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxDecryptUpdate(AesEax* eax, byte* out, + const byte* in, word32 inSz, + const byte* authIn, word32 authInSz) +{ + int ret; + + if (eax == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + /* + * Decrypt the plaintext using AES CTR + * C = CTR(M) + */ + if ((ret = wc_AesCtrEncrypt(&eax->aes, out, in, inSz)) != 0) { + return ret; + } + + /* + * update OMAC with new ciphertext + * C' = OMAC^2_K(C) + */ + if ((ret = wc_CmacUpdate(&eax->ciphertextCmac, in, inSz)) != 0) { + return ret; + } + + /* If there exists new auth data, update the OMAC for that as well */ + if (authIn != NULL) { + if ((ret = wc_CmacUpdate(&eax->aadCmac, authIn, authInSz)) != 0) { + return ret; + } + } + + return 0; +} + + +/* + * AES EAX Incremental API: + * Provides additional auth data information to the authentication + * stream for an authenticated encryption or decryption operation + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxAuthDataUpdate(AesEax* eax, const byte* authIn, word32 authInSz) +{ + return wc_CmacUpdate(&eax->aadCmac, authIn, authInSz); +} + + +/* + * AES EAX Incremental API: + * Finalizes the authenticated encryption operation, computing the auth tag + * over previously supplied auth data and computed ciphertext + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxEncryptFinal(AesEax* eax, byte* authTag, word32 authTagSz) +{ + word32 cmacSize; + int ret; + word32 i; + + if (eax == NULL || authTag == NULL || authTagSz > AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + /* Complete the OMAC for the ciphertext */ + cmacSize = AES_BLOCK_SIZE; + if ((ret = wc_CmacFinalNoFree(&eax->ciphertextCmac, + eax->ciphertextCmacFinal, + &cmacSize)) != 0) { + return ret; + } + + /* Complete the OMAC for auth data */ + cmacSize = AES_BLOCK_SIZE; + if ((ret = wc_CmacFinalNoFree(&eax->aadCmac, + eax->aadCmacFinal, + &cmacSize)) != 0) { + return ret; + } + + /* + * Concatenate all three auth tag chunks into the final tag, truncating + * at the specified tag length + * T = Tag [first authTagSz bytes] + */ + for (i = 0; i < authTagSz; i++) { + authTag[i] = eax->nonceCmacFinal[i] + ^ eax->aadCmacFinal[i] + ^ eax->ciphertextCmacFinal[i]; + } + + return 0; +} + + +/* + * AES EAX Incremental API: + * Finalizes the authenticated decryption operation, computing the auth tag + * for the previously supplied auth data and cipher text and validating it + * against a provided auth tag + * + * Returns 0 on success + * Return error code for failure + */ +int wc_AesEaxDecryptFinal(AesEax* eax, + const byte* authIn, word32 authInSz) +{ + int ret; + word32 i; + word32 cmacSize; + +#if defined(WOLFSSL_SMALL_STACK) + byte *authTag; +#else + byte authTag[AES_BLOCK_SIZE]; +#endif + + if (eax == NULL || authIn == NULL || authInSz > AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + /* Complete the OMAC for the ciphertext */ + cmacSize = AES_BLOCK_SIZE; + if ((ret = wc_CmacFinalNoFree(&eax->ciphertextCmac, + eax->ciphertextCmacFinal, + &cmacSize)) != 0) { + return ret; + } + + /* Complete the OMAC for auth data */ + cmacSize = AES_BLOCK_SIZE; + if ((ret = wc_CmacFinalNoFree(&eax->aadCmac, + eax->aadCmacFinal, + &cmacSize)) != 0) { + return ret; + } + +#if defined(WOLFSSL_SMALL_STACK) + authTag = (byte*)XMALLOC(AES_BLOCK_SIZE, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (authTag == NULL) { + return MEMORY_E; + } +#endif + + /* + * Concatenate all three auth tag chunks into the final tag, truncating + * at the specified tag length + * T = Tag [first authInSz bytes] + */ + for (i = 0; i < authInSz; i++) { + authTag[i] = eax->nonceCmacFinal[i] + ^ eax->aadCmacFinal[i] + ^ eax->ciphertextCmacFinal[i]; + } + + if (ConstantCompare((const byte*)authTag, authIn, (int)authInSz) != 0) { + ret = AES_EAX_AUTH_E; + } + else { + ret = 0; + } + +#if defined(WOLFSSL_SMALL_STACK) + XFREE(authTag, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +/* + * Frees the underlying CMAC and AES contexts. Must be called when done using + * the AES EAX context structure. + * + * Returns 0 on success + * Returns error code on failure + */ +int wc_AesEaxFree(AesEax* eax) +{ + if (eax == NULL) { + return BAD_FUNC_ARG; + } + + (void)wc_CmacFree(&eax->ciphertextCmac); + (void)wc_CmacFree(&eax->aadCmac); + wc_AesFree(&eax->aes); + + return 0; +} + +#endif /* WOLFSSL_AES_EAX */ + #endif /* !NO_AES */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,7 +30,7 @@ #ifdef WOLFSSL_X86_64_BUILD /* -AES_CBC_encrypt (const unsigned char *in, +AES_CBC_encrypt_AESNI (const unsigned char *in, unsigned char *out, unsigned char ivec[16], unsigned long length, @@ -38,11 +38,11 @@ int nr) */ #ifndef __APPLE__ -.globl AES_CBC_encrypt -AES_CBC_encrypt: +.globl AES_CBC_encrypt_AESNI +AES_CBC_encrypt_AESNI: #else -.globl _AES_CBC_encrypt -_AES_CBC_encrypt: +.globl _AES_CBC_encrypt_AESNI +_AES_CBC_encrypt_AESNI: #endif # parameter 1: %rdi # parameter 2: %rsi @@ -95,7 +95,7 @@ #if defined(WOLFSSL_AESNI_BY4) /* -AES_CBC_decrypt_by4 (const unsigned char *in, +AES_CBC_decrypt_AESNI_by4 (const unsigned char *in, unsigned char *out, unsigned char ivec[16], unsigned long length, @@ -103,11 +103,11 @@ int nr) */ #ifndef __APPLE__ -.globl AES_CBC_decrypt_by4 -AES_CBC_decrypt_by4: +.globl AES_CBC_decrypt_AESNI_by4 +AES_CBC_decrypt_AESNI_by4: #else -.globl _AES_CBC_decrypt_by4 -_AES_CBC_decrypt_by4: +.globl _AES_CBC_decrypt_AESNI_by4 +_AES_CBC_decrypt_AESNI_by4: #endif # parameter 1: %rdi # parameter 2: %rsi @@ -276,7 +276,7 @@ #elif defined(WOLFSSL_AESNI_BY6) /* -AES_CBC_decrypt_by6 (const unsigned char *in, +AES_CBC_decrypt_AESNI_by6 (const unsigned char *in, unsigned char *out, unsigned char ivec[16], unsigned long length, @@ -284,11 +284,11 @@ int nr) */ #ifndef __APPLE__ -.globl AES_CBC_decrypt_by6 -AES_CBC_decrypt_by6: +.globl AES_CBC_decrypt_AESNI_by6 +AES_CBC_decrypt_AESNI_by6: #else -.globl _AES_CBC_decrypt_by6 -_AES_CBC_decrypt_by6: +.globl _AES_CBC_decrypt_AESNI_by6 +_AES_CBC_decrypt_AESNI_by6: #endif # parameter 1: %rdi - in # parameter 2: %rsi - out @@ -504,7 +504,7 @@ #else /* WOLFSSL_AESNI_BYx */ /* -AES_CBC_decrypt_by8 (const unsigned char *in, +AES_CBC_decrypt_AESNI_by8 (const unsigned char *in, unsigned char *out, unsigned char ivec[16], unsigned long length, @@ -512,11 +512,11 @@ int nr) */ #ifndef __APPLE__ -.globl AES_CBC_decrypt_by8 -AES_CBC_decrypt_by8: +.globl AES_CBC_decrypt_AESNI_by8 +AES_CBC_decrypt_AESNI_by8: #else -.globl _AES_CBC_decrypt_by8 -_AES_CBC_decrypt_by8: +.globl _AES_CBC_decrypt_AESNI_by8 +_AES_CBC_decrypt_AESNI_by8: #endif # parameter 1: %rdi - in # parameter 2: %rsi - out @@ -761,18 +761,18 @@ /* -AES_ECB_encrypt (const unsigned char *in, +AES_ECB_encrypt_AESNI (const unsigned char *in, unsigned char *out, unsigned long length, const unsigned char *KS, int nr) */ #ifndef __APPLE__ -.globl AES_ECB_encrypt -AES_ECB_encrypt: +.globl AES_ECB_encrypt_AESNI +AES_ECB_encrypt_AESNI: #else -.globl _AES_ECB_encrypt -_AES_ECB_encrypt: +.globl _AES_ECB_encrypt_AESNI +_AES_ECB_encrypt_AESNI: #endif # parameter 1: %rdi # parameter 2: %rsi @@ -925,18 +925,18 @@ /* -AES_ECB_decrypt (const unsigned char *in, +AES_ECB_decrypt_AESNI (const unsigned char *in, unsigned char *out, unsigned long length, const unsigned char *KS, int nr) */ #ifndef __APPLE__ -.globl AES_ECB_decrypt -AES_ECB_decrypt: +.globl AES_ECB_decrypt_AESNI +AES_ECB_decrypt_AESNI: #else -.globl _AES_ECB_decrypt -_AES_ECB_decrypt: +.globl _AES_ECB_decrypt_AESNI +_AES_ECB_decrypt_AESNI: #endif # parameter 1: %rdi # parameter 2: %rsi @@ -1092,20 +1092,20 @@ /* -void AES_128_Key_Expansion(const unsigned char* userkey, +void AES_128_Key_Expansion_AESNI(const unsigned char* userkey, unsigned char* key_schedule); */ -.align 16,0x90 #ifndef __APPLE__ -.globl AES_128_Key_Expansion -AES_128_Key_Expansion: +.globl AES_128_Key_Expansion_AESNI +.align 16,0x90 +AES_128_Key_Expansion_AESNI: #else -.globl _AES_128_Key_Expansion -_AES_128_Key_Expansion: +.globl _AES_128_Key_Expansion_AESNI +.p2align 4 +_AES_128_Key_Expansion_AESNI: #endif # parameter 1: %rdi # parameter 2: %rsi -movl $10, 240(%rsi) movdqu (%rdi), %xmm1 movdqa %xmm1, (%rsi) @@ -1158,15 +1158,15 @@ /* -void AES_192_Key_Expansion (const unsigned char *userkey, +void AES_192_Key_Expansion_AESNI (const unsigned char *userkey, unsigned char *key) */ #ifndef __APPLE__ -.globl AES_192_Key_Expansion -AES_192_Key_Expansion: +.globl AES_192_Key_Expansion_AESNI +AES_192_Key_Expansion_AESNI: #else -.globl _AES_192_Key_Expansion -_AES_192_Key_Expansion: +.globl _AES_192_Key_Expansion_AESNI +_AES_192_Key_Expansion_AESNI: #endif # parameter 1: %rdi # parameter 2: %rsi @@ -1249,15 +1249,15 @@ /* -void AES_256_Key_Expansion (const unsigned char *userkey, +void AES_256_Key_Expansion_AESNI (const unsigned char *userkey, unsigned char *key) */ #ifndef __APPLE__ -.globl AES_256_Key_Expansion -AES_256_Key_Expansion: +.globl AES_256_Key_Expansion_AESNI +AES_256_Key_Expansion_AESNI: #else -.globl _AES_256_Key_Expansion -_AES_256_Key_Expansion: +.globl _AES_256_Key_Expansion_AESNI +_AES_256_Key_Expansion_AESNI: #endif # parameter 1: %rdi # parameter 2: %rsi @@ -1337,7 +1337,7 @@ #elif defined WOLFSSL_X86_BUILD /* -AES_CBC_encrypt (const unsigned char *in, +AES_CBC_encrypt_AESNI (const unsigned char *in, unsigned char *out, unsigned char ivec[16], unsigned long length, @@ -1345,11 +1345,11 @@ int nr) */ #ifndef __APPLE__ -.globl AES_CBC_encrypt -AES_CBC_encrypt: +.globl AES_CBC_encrypt_AESNI +AES_CBC_encrypt_AESNI: #else -.globl _AES_CBC_encrypt -_AES_CBC_encrypt: +.globl _AES_CBC_encrypt_AESNI +_AES_CBC_encrypt_AESNI: #endif # parameter 1: stack[4] => %edi # parameter 2: stack[8] => %esi @@ -1416,7 +1416,7 @@ /* -AES_CBC_decrypt_by4 (const unsigned char *in, +AES_CBC_decrypt_AESNI_by4 (const unsigned char *in, unsigned char *out, unsigned char ivec[16], unsigned long length, @@ -1424,11 +1424,11 @@ int nr) */ #ifndef __APPLE__ -.globl AES_CBC_decrypt_by4 -AES_CBC_decrypt_by4: +.globl AES_CBC_decrypt_AESNI_by4 +AES_CBC_decrypt_AESNI_by4: #else -.globl _AES_CBC_decrypt_by4 -_AES_CBC_decrypt_by4: +.globl _AES_CBC_decrypt_AESNI_by4 +_AES_CBC_decrypt_AESNI_by4: #endif # parameter 1: stack[4] => %edi # parameter 2: stack[8] => %esi @@ -1614,18 +1614,18 @@ ret /* -AES_ECB_encrypt (const unsigned char *in, +AES_ECB_encrypt_AESNI (const unsigned char *in, unsigned char *out, unsigned long length, const unsigned char *KS, int nr) */ #ifndef __APPLE__ -.globl AES_ECB_encrypt -AES_ECB_encrypt: +.globl AES_ECB_encrypt_AESNI +AES_ECB_encrypt_AESNI: #else -.globl _AES_ECB_encrypt -_AES_ECB_encrypt: +.globl _AES_ECB_encrypt_AESNI +_AES_ECB_encrypt_AESNI: #endif # parameter 1: stack[4] => %edi # parameter 2: stack[8] => %esi @@ -1791,18 +1791,18 @@ /* -AES_ECB_decrypt (const unsigned char *in, +AES_ECB_decrypt_AESNI (const unsigned char *in, unsigned char *out, unsigned long length, const unsigned char *KS, int nr) */ #ifndef __APPLE__ -.globl AES_ECB_decrypt -AES_ECB_decrypt: +.globl AES_ECB_decrypt_AESNI +AES_ECB_decrypt_AESNI: #else -.globl _AES_ECB_decrypt -_AES_ECB_decrypt: +.globl _AES_ECB_decrypt_AESNI +_AES_ECB_decrypt_AESNI: #endif # parameter 1: stack[4] => %edi # parameter 2: stack[8] => %esi @@ -1969,16 +1969,17 @@ /* -void AES_128_Key_Expansion(const unsigned char* userkey, +void AES_128_Key_Expansion_AESNI(const unsigned char* userkey, unsigned char* key_schedule); */ -.align 16,0x90 #ifndef __APPLE__ -.globl AES_128_Key_Expansion -AES_128_Key_Expansion: +.globl AES_128_Key_Expansion_AESNI +.align 16,0x90 +AES_128_Key_Expansion_AESNI: #else -.globl _AES_128_Key_Expansion -_AES_128_Key_Expansion: +.globl _AES_128_Key_Expansion_AESNI +.p2align 4 +_AES_128_Key_Expansion_AESNI: #endif # parameter 1: stack[4] => %eax # parameter 2: stack[8] => %edx @@ -2038,15 +2039,15 @@ /* -void AES_192_Key_Expansion (const unsigned char *userkey, +void AES_192_Key_Expansion_AESNI (const unsigned char *userkey, unsigned char *key) */ #ifndef __APPLE__ -.globl AES_192_Key_Expansion -AES_192_Key_Expansion: +.globl AES_192_Key_Expansion_AESNI +AES_192_Key_Expansion_AESNI: #else -.globl _AES_192_Key_Expansion -_AES_192_Key_Expansion: +.globl _AES_192_Key_Expansion_AESNI +_AES_192_Key_Expansion_AESNI: #endif # parameter 1: stack[4] => %eax # parameter 2: stack[8] => %edx @@ -2131,15 +2132,15 @@ /* -void AES_256_Key_Expansion (const unsigned char *userkey, +void AES_256_Key_Expansion_AESNI (const unsigned char *userkey, unsigned char *key) */ #ifndef __APPLE__ -.globl AES_256_Key_Expansion -AES_256_Key_Expansion: +.globl AES_256_Key_Expansion_AESNI +AES_256_Key_Expansion_AESNI: #else -.globl _AES_256_Key_Expansion -_AES_256_Key_Expansion: +.globl _AES_256_Key_Expansion_AESNI +_AES_256_Key_Expansion_AESNI: #endif # parameter 1: stack[4] => %eax # parameter 2: stack[8] => %edx diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.asm mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.asm --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.asm 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_asm.asm 2024-08-03 07:30:00.000000000 +0000 @@ -40,21 +40,21 @@ ENDIF IF fips_version GE 2 - fipsAh SEGMENT ALIAS(".fipsA$h") 'CODE' + fipsAb SEGMENT ALIAS(".fipsA$b") 'CODE' ELSE _text SEGMENT ENDIF ; /* -; AES_CBC_encrypt[const ,unsigned char*in +; AES_CBC_encrypt_AESNI[const ,unsigned char*in ; unsigned ,char*out ; unsigned ,char ivec+16 ; unsigned ,long length ; const ,unsigned char*KS ; int nr] ; */ -AES_CBC_encrypt PROC +AES_CBC_encrypt_AESNI PROC ;# parameter 1: rdi ;# parameter 2: rsi ;# parameter 3: rdx @@ -117,16 +117,16 @@ mov rdi,rax mov rsi,r11 ret -AES_CBC_encrypt ENDP +AES_CBC_encrypt_AESNI ENDP -; void AES_CBC_decrypt_by4(const unsigned char* in, +; void AES_CBC_decrypt_AESNI_by4(const unsigned char* in, ; unsigned char* out, ; unsigned char ivec[16], ; unsigned long length, ; const unsigned char* KS, ; int nr) -AES_CBC_decrypt_by4 PROC +AES_CBC_decrypt_AESNI_by4 PROC ; parameter 1: rdi ; parameter 2: rsi ; parameter 3: rdx @@ -325,16 +325,16 @@ movdqa xmm15, [rsp+112] add rsp, 8+8*16 ; 8 = align stack , 8 xmm6-12,15 16 bytes each ret -AES_CBC_decrypt_by4 ENDP +AES_CBC_decrypt_AESNI_by4 ENDP -; void AES_CBC_decrypt_by6(const unsigned char *in, +; void AES_CBC_decrypt_AESNI_by6(const unsigned char *in, ; unsigned char *out, ; unsigned char ivec[16], ; unsigned long length, ; const unsigned char *KS, ; int nr) -AES_CBC_decrypt_by6 PROC +AES_CBC_decrypt_AESNI_by6 PROC ; parameter 1: rdi - in ; parameter 2: rsi - out ; parameter 3: rdx - ivec @@ -582,16 +582,16 @@ movdqa xmm14, [rsp+128] add rsp, 8+9*16 ; 8 = align stack , 9 xmm6-14 16 bytes each ret -AES_CBC_decrypt_by6 ENDP +AES_CBC_decrypt_AESNI_by6 ENDP -; void AES_CBC_decrypt_by8(const unsigned char *in, +; void AES_CBC_decrypt_AESNI_by8(const unsigned char *in, ; unsigned char *out, ; unsigned char ivec[16], ; unsigned long length, ; const unsigned char *KS, ; int nr) -AES_CBC_decrypt_by8 PROC +AES_CBC_decrypt_AESNI_by8 PROC ; parameter 1: rdi - in ; parameter 2: rsi - out ; parameter 3: rdx - ivec @@ -865,18 +865,18 @@ movdqa xmm13, [rsp+112] add rsp, 8+8*16 ; 8 = align stack , 8 xmm6-13 16 bytes each ret -AES_CBC_decrypt_by8 ENDP +AES_CBC_decrypt_AESNI_by8 ENDP ; /* -; AES_ECB_encrypt[const ,unsigned char*in +; AES_ECB_encrypt_AESNI[const ,unsigned char*in ; unsigned ,char*out ; unsigned ,long length ; const ,unsigned char*KS ; int nr] ; */ -; . globl AES_ECB_encrypt -AES_ECB_encrypt PROC +; . globl AES_ECB_encrypt_AESNI +AES_ECB_encrypt_AESNI PROC ;# parameter 1: rdi ;# parameter 2: rsi ;# parameter 3: rdx @@ -1054,17 +1054,17 @@ movdqa xmm12, [rsp+48] add rsp,8+4*16 ; 8 = align stack , 4 xmm9-12 16 bytes each ret -AES_ECB_encrypt ENDP +AES_ECB_encrypt_AESNI ENDP ; /* -; AES_ECB_decrypt[const ,unsigned char*in +; AES_ECB_decrypt_AESNI[const ,unsigned char*in ; unsigned ,char*out ; unsigned ,long length ; const ,unsigned char*KS ; int nr] ; */ -; . globl AES_ECB_decrypt -AES_ECB_decrypt PROC +; . globl AES_ECB_decrypt_AESNI +AES_ECB_decrypt_AESNI PROC ;# parameter 1: rdi ;# parameter 2: rsi ;# parameter 3: rdx @@ -1241,17 +1241,17 @@ movdqa xmm12, [rsp+48] add rsp,8+4*16 ; 8 = align stack , 4 xmm9-12 16 bytes each ret -AES_ECB_decrypt ENDP +AES_ECB_decrypt_AESNI ENDP ; /* -; void ,AES_128_Key_Expansion[const unsigned char*userkey +; void ,AES_128_Key_Expansion_AESNI[const unsigned char*userkey ; unsigned char*key_schedule]/ ; */ ; . align 16,0x90 -; . globl AES_128_Key_Expansion -AES_128_Key_Expansion PROC +; . globl AES_128_Key_Expansion_AESNI +AES_128_Key_Expansion_AESNI PROC ;# parameter 1: rdi ;# parameter 2: rsi @@ -1322,14 +1322,14 @@ pxor xmm1,xmm3 pxor xmm1,xmm2 ret -AES_128_Key_Expansion ENDP +AES_128_Key_Expansion_AESNI ENDP ; /* -; void ,AES_192_Key_Expansion[const unsigned char*userkey +; void ,AES_192_Key_Expansion_AESNI[const unsigned char*userkey ; unsigned char*key] ; */ -; . globl AES_192_Key_Expansion -AES_192_Key_Expansion PROC +; . globl AES_192_Key_Expansion_AESNI +AES_192_Key_Expansion_AESNI PROC ;# parameter 1: rdi ;# parameter 2: rsi @@ -1426,14 +1426,14 @@ pxor xmm3,xmm4 pxor xmm3,xmm2 ret -AES_192_Key_Expansion ENDP +AES_192_Key_Expansion_AESNI ENDP ; /* -; void ,AES_256_Key_Expansion[const unsigned char*userkey +; void ,AES_256_Key_Expansion_AESNI[const unsigned char*userkey ; unsigned char*key] ; */ -; . globl AES_256_Key_Expansion -AES_256_Key_Expansion PROC +; . globl AES_256_Key_Expansion_AESNI +AES_256_Key_Expansion_AESNI PROC ;# parameter 1: rdi ;# parameter 2: rsi @@ -1495,7 +1495,7 @@ mov rdi,rax mov rsi,r11 ret -AES_256_Key_Expansion ENDP +AES_256_Key_Expansion_AESNI ENDP MAKE_RK256_a: pshufd xmm2,xmm2,0ffh @@ -1523,7 +1523,7 @@ IF fips_version GE 2 - fipsAh ENDS + fipsAb ENDS ELSE _text ENDS ENDIF diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ -/* aes_gcm_asm - * +/* aes_gcm_asm.S */ +/* * Copyright (C) 2006-2023 wolfSSL Inc. * * This file is part of wolfSSL. @@ -180,15 +180,15 @@ .quad 0x1, 0xc200000000000000 #ifndef __APPLE__ .text -.globl AES_GCM_encrypt -.type AES_GCM_encrypt,@function +.globl AES_GCM_encrypt_aesni +.type AES_GCM_encrypt_aesni,@function .align 16 -AES_GCM_encrypt: +AES_GCM_encrypt_aesni: #else .section __TEXT,__text -.globl _AES_GCM_encrypt +.globl _AES_GCM_encrypt_aesni .p2align 4 -_AES_GCM_encrypt: +_AES_GCM_encrypt_aesni: #endif /* __APPLE__ */ pushq %r13 pushq %r12 @@ -207,7 +207,7 @@ pxor %xmm6, %xmm6 cmpl $12, %ebx movl %ebx, %edx - jne L_AES_GCM_encrypt_iv_not_12 + jne L_AES_GCM_encrypt_aesni_iv_not_12 # # Calculate values when IV is 12 bytes # Set counter based on IV movl $0x1000000, %ecx @@ -247,7 +247,7 @@ aesenc %xmm7, %xmm1 cmpl $11, %r10d movdqa 160(%r15), %xmm7 - jl L_AES_GCM_encrypt_calc_iv_12_last + jl L_AES_GCM_encrypt_aesni_calc_iv_12_last aesenc %xmm7, %xmm5 aesenc %xmm7, %xmm1 movdqa 176(%r15), %xmm7 @@ -255,20 +255,20 @@ aesenc %xmm7, %xmm1 cmpl $13, %r10d movdqa 192(%r15), %xmm7 - jl L_AES_GCM_encrypt_calc_iv_12_last + jl L_AES_GCM_encrypt_aesni_calc_iv_12_last aesenc %xmm7, %xmm5 aesenc %xmm7, %xmm1 movdqa 208(%r15), %xmm7 aesenc %xmm7, %xmm5 aesenc %xmm7, %xmm1 movdqa 224(%r15), %xmm7 -L_AES_GCM_encrypt_calc_iv_12_last: +L_AES_GCM_encrypt_aesni_calc_iv_12_last: aesenclast %xmm7, %xmm5 aesenclast %xmm7, %xmm1 pshufb L_aes_gcm_bswap_mask(%rip), %xmm5 movdqu %xmm1, 144(%rsp) - jmp L_AES_GCM_encrypt_iv_done -L_AES_GCM_encrypt_iv_not_12: + jmp L_AES_GCM_encrypt_aesni_iv_done +L_AES_GCM_encrypt_aesni_iv_not_12: # Calculate values when IV is not 12 bytes # H = Encrypt X(=0) movdqa (%r15), %xmm5 @@ -283,27 +283,27 @@ aesenc 144(%r15), %xmm5 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm9, %xmm5 aesenc 176(%r15), %xmm5 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm9, %xmm5 aesenc 208(%r15), %xmm5 movdqa 224(%r15), %xmm9 -L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last: aesenclast %xmm9, %xmm5 pshufb L_aes_gcm_bswap_mask(%rip), %xmm5 # Calc counter # Initialization vector cmpl $0x00, %edx movq $0x00, %rcx - je L_AES_GCM_encrypt_calc_iv_done + je L_AES_GCM_encrypt_aesni_calc_iv_done cmpl $16, %edx - jl L_AES_GCM_encrypt_calc_iv_lt16 + jl L_AES_GCM_encrypt_aesni_calc_iv_lt16 andl $0xfffffff0, %edx -L_AES_GCM_encrypt_calc_iv_16_loop: +L_AES_GCM_encrypt_aesni_calc_iv_16_loop: movdqu (%rax,%rcx,1), %xmm8 pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 pxor %xmm8, %xmm4 @@ -363,22 +363,22 @@ pxor %xmm2, %xmm4 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_iv_16_loop + jl L_AES_GCM_encrypt_aesni_calc_iv_16_loop movl %ebx, %edx cmpl %edx, %ecx - je L_AES_GCM_encrypt_calc_iv_done -L_AES_GCM_encrypt_calc_iv_lt16: + je L_AES_GCM_encrypt_aesni_calc_iv_done +L_AES_GCM_encrypt_aesni_calc_iv_lt16: subq $16, %rsp pxor %xmm8, %xmm8 xorl %ebx, %ebx movdqu %xmm8, (%rsp) -L_AES_GCM_encrypt_calc_iv_loop: +L_AES_GCM_encrypt_aesni_calc_iv_loop: movzbl (%rax,%rcx,1), %r13d movb %r13b, (%rsp,%rbx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_iv_loop + jl L_AES_GCM_encrypt_aesni_calc_iv_loop movdqu (%rsp), %xmm8 addq $16, %rsp pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 @@ -437,7 +437,7 @@ pxor %xmm1, %xmm2 pxor %xmm7, %xmm2 pxor %xmm2, %xmm4 -L_AES_GCM_encrypt_calc_iv_done: +L_AES_GCM_encrypt_aesni_calc_iv_done: # T = Encrypt counter pxor %xmm0, %xmm0 shll $3, %edx @@ -512,28 +512,28 @@ aesenc 144(%r15), %xmm8 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm9, %xmm8 aesenc 176(%r15), %xmm8 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm9, %xmm8 aesenc 208(%r15), %xmm8 movdqa 224(%r15), %xmm9 -L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last: aesenclast %xmm9, %xmm8 movdqu %xmm8, 144(%rsp) -L_AES_GCM_encrypt_iv_done: +L_AES_GCM_encrypt_aesni_iv_done: # Additional authentication data movl %r11d, %edx cmpl $0x00, %edx - je L_AES_GCM_encrypt_calc_aad_done + je L_AES_GCM_encrypt_aesni_calc_aad_done xorl %ecx, %ecx cmpl $16, %edx - jl L_AES_GCM_encrypt_calc_aad_lt16 + jl L_AES_GCM_encrypt_aesni_calc_aad_lt16 andl $0xfffffff0, %edx -L_AES_GCM_encrypt_calc_aad_16_loop: +L_AES_GCM_encrypt_aesni_calc_aad_16_loop: movdqu (%r12,%rcx,1), %xmm8 pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 pxor %xmm8, %xmm6 @@ -593,22 +593,22 @@ pxor %xmm2, %xmm6 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_aad_16_loop + jl L_AES_GCM_encrypt_aesni_calc_aad_16_loop movl %r11d, %edx cmpl %edx, %ecx - je L_AES_GCM_encrypt_calc_aad_done -L_AES_GCM_encrypt_calc_aad_lt16: + je L_AES_GCM_encrypt_aesni_calc_aad_done +L_AES_GCM_encrypt_aesni_calc_aad_lt16: subq $16, %rsp pxor %xmm8, %xmm8 xorl %ebx, %ebx movdqu %xmm8, (%rsp) -L_AES_GCM_encrypt_calc_aad_loop: +L_AES_GCM_encrypt_aesni_calc_aad_loop: movzbl (%r12,%rcx,1), %r13d movb %r13b, (%rsp,%rbx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_aad_loop + jl L_AES_GCM_encrypt_aesni_calc_aad_loop movdqu (%rsp), %xmm8 addq $16, %rsp pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 @@ -667,7 +667,7 @@ pxor %xmm1, %xmm2 pxor %xmm7, %xmm2 pxor %xmm2, %xmm6 -L_AES_GCM_encrypt_calc_aad_done: +L_AES_GCM_encrypt_aesni_calc_aad_done: # Calculate counter and H pshufb L_aes_gcm_bswap_epi64(%rip), %xmm4 movdqa %xmm5, %xmm9 @@ -685,7 +685,7 @@ xorq %rbx, %rbx cmpl $0x80, %r9d movl %r9d, %r13d - jl L_AES_GCM_encrypt_done_128 + jl L_AES_GCM_encrypt_aesni_done_128 andl $0xffffff80, %r13d movdqa %xmm6, %xmm2 # H ^ 1 @@ -1104,7 +1104,7 @@ aesenc %xmm7, %xmm15 cmpl $11, %r10d movdqa 160(%r15), %xmm7 - jl L_AES_GCM_encrypt_enc_done + jl L_AES_GCM_encrypt_aesni_enc_done aesenc %xmm7, %xmm8 aesenc %xmm7, %xmm9 aesenc %xmm7, %xmm10 @@ -1124,7 +1124,7 @@ aesenc %xmm7, %xmm15 cmpl $13, %r10d movdqa 192(%r15), %xmm7 - jl L_AES_GCM_encrypt_enc_done + jl L_AES_GCM_encrypt_aesni_enc_done aesenc %xmm7, %xmm8 aesenc %xmm7, %xmm9 aesenc %xmm7, %xmm10 @@ -1143,7 +1143,7 @@ aesenc %xmm7, %xmm14 aesenc %xmm7, %xmm15 movdqa 224(%r15), %xmm7 -L_AES_GCM_encrypt_enc_done: +L_AES_GCM_encrypt_aesni_enc_done: aesenclast %xmm7, %xmm8 aesenclast %xmm7, %xmm9 movdqu (%rdi), %xmm0 @@ -1178,9 +1178,9 @@ movdqu %xmm15, 112(%rsi) cmpl $0x80, %r13d movl $0x80, %ebx - jle L_AES_GCM_encrypt_end_128 + jle L_AES_GCM_encrypt_aesni_end_128 # More 128 bytes of input -L_AES_GCM_encrypt_ghash_128: +L_AES_GCM_encrypt_aesni_ghash_128: leaq (%rdi,%rbx,1), %rcx leaq (%rsi,%rbx,1), %rdx movdqu 128(%rsp), %xmm8 @@ -1448,7 +1448,7 @@ pxor %xmm3, %xmm2 cmpl $11, %r10d movdqa 160(%r15), %xmm7 - jl L_AES_GCM_encrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_encrypt_aesni_aesenc_128_ghash_avx_done aesenc %xmm7, %xmm8 aesenc %xmm7, %xmm9 aesenc %xmm7, %xmm10 @@ -1468,7 +1468,7 @@ aesenc %xmm7, %xmm15 cmpl $13, %r10d movdqa 192(%r15), %xmm7 - jl L_AES_GCM_encrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_encrypt_aesni_aesenc_128_ghash_avx_done aesenc %xmm7, %xmm8 aesenc %xmm7, %xmm9 aesenc %xmm7, %xmm10 @@ -1487,7 +1487,7 @@ aesenc %xmm7, %xmm14 aesenc %xmm7, %xmm15 movdqa 224(%r15), %xmm7 -L_AES_GCM_encrypt_aesenc_128_ghash_avx_done: +L_AES_GCM_encrypt_aesni_aesenc_128_ghash_avx_done: aesenclast %xmm7, %xmm8 aesenclast %xmm7, %xmm9 movdqu (%rcx), %xmm0 @@ -1522,8 +1522,8 @@ movdqu %xmm15, 112(%rdx) addl $0x80, %ebx cmpl %r13d, %ebx - jl L_AES_GCM_encrypt_ghash_128 -L_AES_GCM_encrypt_end_128: + jl L_AES_GCM_encrypt_aesni_ghash_128 +L_AES_GCM_encrypt_aesni_end_128: movdqa L_aes_gcm_bswap_mask(%rip), %xmm4 pshufb %xmm4, %xmm8 pshufb %xmm4, %xmm9 @@ -1710,14 +1710,14 @@ pxor %xmm4, %xmm2 pxor %xmm2, %xmm6 movdqu (%rsp), %xmm5 -L_AES_GCM_encrypt_done_128: +L_AES_GCM_encrypt_aesni_done_128: movl %r9d, %edx cmpl %edx, %ebx - jge L_AES_GCM_encrypt_done_enc + jge L_AES_GCM_encrypt_aesni_done_enc movl %r9d, %r13d andl $0xfffffff0, %r13d cmpl %r13d, %ebx - jge L_AES_GCM_encrypt_last_block_done + jge L_AES_GCM_encrypt_aesni_last_block_done leaq (%rdi,%rbx,1), %rcx leaq (%rsi,%rbx,1), %rdx movdqu 128(%rsp), %xmm8 @@ -1737,16 +1737,16 @@ aesenc 144(%r15), %xmm8 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last aesenc %xmm9, %xmm8 aesenc 176(%r15), %xmm8 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last aesenc %xmm9, %xmm8 aesenc 208(%r15), %xmm8 movdqa 224(%r15), %xmm9 -L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last: aesenclast %xmm9, %xmm8 movdqu (%rcx), %xmm9 pxor %xmm9, %xmm8 @@ -1755,8 +1755,8 @@ pxor %xmm8, %xmm6 addl $16, %ebx cmpl %r13d, %ebx - jge L_AES_GCM_encrypt_last_block_ghash -L_AES_GCM_encrypt_last_block_start: + jge L_AES_GCM_encrypt_aesni_last_block_ghash +L_AES_GCM_encrypt_aesni_last_block_start: leaq (%rdi,%rbx,1), %rcx leaq (%rsi,%rbx,1), %rdx movdqu 128(%rsp), %xmm8 @@ -1801,16 +1801,16 @@ pxor %xmm3, %xmm6 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_encrypt_aesenc_gfmul_last + jl L_AES_GCM_encrypt_aesni_aesenc_gfmul_last aesenc %xmm9, %xmm8 aesenc 176(%r15), %xmm8 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_encrypt_aesenc_gfmul_last + jl L_AES_GCM_encrypt_aesni_aesenc_gfmul_last aesenc %xmm9, %xmm8 aesenc 208(%r15), %xmm8 movdqa 224(%r15), %xmm9 -L_AES_GCM_encrypt_aesenc_gfmul_last: +L_AES_GCM_encrypt_aesni_aesenc_gfmul_last: aesenclast %xmm9, %xmm8 movdqu (%rcx), %xmm9 pxor %xmm9, %xmm8 @@ -1819,8 +1819,8 @@ pxor %xmm8, %xmm6 addl $16, %ebx cmpl %r13d, %ebx - jl L_AES_GCM_encrypt_last_block_start -L_AES_GCM_encrypt_last_block_ghash: + jl L_AES_GCM_encrypt_aesni_last_block_start +L_AES_GCM_encrypt_aesni_last_block_ghash: pshufd $0x4e, %xmm5, %xmm9 pshufd $0x4e, %xmm6, %xmm10 movdqa %xmm6, %xmm11 @@ -1861,11 +1861,11 @@ pxor %xmm13, %xmm14 pxor %xmm8, %xmm14 pxor %xmm14, %xmm6 -L_AES_GCM_encrypt_last_block_done: +L_AES_GCM_encrypt_aesni_last_block_done: movl %r9d, %ecx movl %ecx, %edx andl $15, %ecx - jz L_AES_GCM_encrypt_aesenc_last15_enc_avx_done + jz L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_done movdqu 128(%rsp), %xmm4 pshufb L_aes_gcm_bswap_epi64(%rip), %xmm4 pxor (%r15), %xmm4 @@ -1880,21 +1880,21 @@ aesenc 144(%r15), %xmm4 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last aesenc %xmm9, %xmm4 aesenc 176(%r15), %xmm4 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last aesenc %xmm9, %xmm4 aesenc 208(%r15), %xmm4 movdqa 224(%r15), %xmm9 -L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last: aesenclast %xmm9, %xmm4 subq $16, %rsp xorl %ecx, %ecx movdqu %xmm4, (%rsp) -L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_loop: movzbl (%rdi,%rbx,1), %r13d xorb (%rsp,%rcx,1), %r13b movb %r13b, (%rsi,%rbx,1) @@ -1902,16 +1902,16 @@ incl %ebx incl %ecx cmpl %edx, %ebx - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_loop xorq %r13, %r13 cmpl $16, %ecx - je L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc -L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop: + je L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_finish_enc +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_byte_loop: movb %r13b, (%rsp,%rcx,1) incl %ecx cmpl $16, %ecx - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop -L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc: + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_byte_loop +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_finish_enc: movdqu (%rsp), %xmm4 addq $16, %rsp pshufb L_aes_gcm_bswap_mask(%rip), %xmm4 @@ -1956,8 +1956,8 @@ pxor %xmm13, %xmm14 pxor %xmm8, %xmm14 pxor %xmm14, %xmm6 -L_AES_GCM_encrypt_aesenc_last15_enc_avx_done: -L_AES_GCM_encrypt_done_enc: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_done: +L_AES_GCM_encrypt_aesni_done_enc: movl %r9d, %edx movl %r11d, %ecx shlq $3, %rdx @@ -2009,19 +2009,19 @@ movdqu 144(%rsp), %xmm0 pxor %xmm6, %xmm0 cmpl $16, %r14d - je L_AES_GCM_encrypt_store_tag_16 + je L_AES_GCM_encrypt_aesni_store_tag_16 xorq %rcx, %rcx movdqu %xmm0, (%rsp) -L_AES_GCM_encrypt_store_tag_loop: +L_AES_GCM_encrypt_aesni_store_tag_loop: movzbl (%rsp,%rcx,1), %r13d movb %r13b, (%r8,%rcx,1) incl %ecx cmpl %r14d, %ecx - jne L_AES_GCM_encrypt_store_tag_loop - jmp L_AES_GCM_encrypt_store_tag_done -L_AES_GCM_encrypt_store_tag_16: + jne L_AES_GCM_encrypt_aesni_store_tag_loop + jmp L_AES_GCM_encrypt_aesni_store_tag_done +L_AES_GCM_encrypt_aesni_store_tag_16: movdqu %xmm0, (%r8) -L_AES_GCM_encrypt_store_tag_done: +L_AES_GCM_encrypt_aesni_store_tag_done: addq $0xa0, %rsp popq %r15 popq %r14 @@ -2030,19 +2030,19 @@ popq %r13 repz retq #ifndef __APPLE__ -.size AES_GCM_encrypt,.-AES_GCM_encrypt +.size AES_GCM_encrypt_aesni,.-AES_GCM_encrypt_aesni #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl AES_GCM_decrypt -.type AES_GCM_decrypt,@function +.globl AES_GCM_decrypt_aesni +.type AES_GCM_decrypt_aesni,@function .align 16 -AES_GCM_decrypt: +AES_GCM_decrypt_aesni: #else .section __TEXT,__text -.globl _AES_GCM_decrypt +.globl _AES_GCM_decrypt_aesni .p2align 4 -_AES_GCM_decrypt: +_AES_GCM_decrypt_aesni: #endif /* __APPLE__ */ pushq %r13 pushq %r12 @@ -2063,7 +2063,7 @@ pxor %xmm6, %xmm6 cmpl $12, %ebx movl %ebx, %edx - jne L_AES_GCM_decrypt_iv_not_12 + jne L_AES_GCM_decrypt_aesni_iv_not_12 # # Calculate values when IV is 12 bytes # Set counter based on IV movl $0x1000000, %ecx @@ -2103,7 +2103,7 @@ aesenc %xmm7, %xmm1 cmpl $11, %r10d movdqa 160(%r15), %xmm7 - jl L_AES_GCM_decrypt_calc_iv_12_last + jl L_AES_GCM_decrypt_aesni_calc_iv_12_last aesenc %xmm7, %xmm5 aesenc %xmm7, %xmm1 movdqa 176(%r15), %xmm7 @@ -2111,20 +2111,20 @@ aesenc %xmm7, %xmm1 cmpl $13, %r10d movdqa 192(%r15), %xmm7 - jl L_AES_GCM_decrypt_calc_iv_12_last + jl L_AES_GCM_decrypt_aesni_calc_iv_12_last aesenc %xmm7, %xmm5 aesenc %xmm7, %xmm1 movdqa 208(%r15), %xmm7 aesenc %xmm7, %xmm5 aesenc %xmm7, %xmm1 movdqa 224(%r15), %xmm7 -L_AES_GCM_decrypt_calc_iv_12_last: +L_AES_GCM_decrypt_aesni_calc_iv_12_last: aesenclast %xmm7, %xmm5 aesenclast %xmm7, %xmm1 pshufb L_aes_gcm_bswap_mask(%rip), %xmm5 movdqu %xmm1, 144(%rsp) - jmp L_AES_GCM_decrypt_iv_done -L_AES_GCM_decrypt_iv_not_12: + jmp L_AES_GCM_decrypt_aesni_iv_done +L_AES_GCM_decrypt_aesni_iv_not_12: # Calculate values when IV is not 12 bytes # H = Encrypt X(=0) movdqa (%r15), %xmm5 @@ -2139,27 +2139,27 @@ aesenc 144(%r15), %xmm5 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm9, %xmm5 aesenc 176(%r15), %xmm5 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm9, %xmm5 aesenc 208(%r15), %xmm5 movdqa 224(%r15), %xmm9 -L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last: aesenclast %xmm9, %xmm5 pshufb L_aes_gcm_bswap_mask(%rip), %xmm5 # Calc counter # Initialization vector cmpl $0x00, %edx movq $0x00, %rcx - je L_AES_GCM_decrypt_calc_iv_done + je L_AES_GCM_decrypt_aesni_calc_iv_done cmpl $16, %edx - jl L_AES_GCM_decrypt_calc_iv_lt16 + jl L_AES_GCM_decrypt_aesni_calc_iv_lt16 andl $0xfffffff0, %edx -L_AES_GCM_decrypt_calc_iv_16_loop: +L_AES_GCM_decrypt_aesni_calc_iv_16_loop: movdqu (%rax,%rcx,1), %xmm8 pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 pxor %xmm8, %xmm4 @@ -2219,22 +2219,22 @@ pxor %xmm2, %xmm4 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_iv_16_loop + jl L_AES_GCM_decrypt_aesni_calc_iv_16_loop movl %ebx, %edx cmpl %edx, %ecx - je L_AES_GCM_decrypt_calc_iv_done -L_AES_GCM_decrypt_calc_iv_lt16: + je L_AES_GCM_decrypt_aesni_calc_iv_done +L_AES_GCM_decrypt_aesni_calc_iv_lt16: subq $16, %rsp pxor %xmm8, %xmm8 xorl %ebx, %ebx movdqu %xmm8, (%rsp) -L_AES_GCM_decrypt_calc_iv_loop: +L_AES_GCM_decrypt_aesni_calc_iv_loop: movzbl (%rax,%rcx,1), %r13d movb %r13b, (%rsp,%rbx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_iv_loop + jl L_AES_GCM_decrypt_aesni_calc_iv_loop movdqu (%rsp), %xmm8 addq $16, %rsp pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 @@ -2293,7 +2293,7 @@ pxor %xmm1, %xmm2 pxor %xmm7, %xmm2 pxor %xmm2, %xmm4 -L_AES_GCM_decrypt_calc_iv_done: +L_AES_GCM_decrypt_aesni_calc_iv_done: # T = Encrypt counter pxor %xmm0, %xmm0 shll $3, %edx @@ -2368,28 +2368,28 @@ aesenc 144(%r15), %xmm8 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm9, %xmm8 aesenc 176(%r15), %xmm8 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm9, %xmm8 aesenc 208(%r15), %xmm8 movdqa 224(%r15), %xmm9 -L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last: aesenclast %xmm9, %xmm8 movdqu %xmm8, 144(%rsp) -L_AES_GCM_decrypt_iv_done: +L_AES_GCM_decrypt_aesni_iv_done: # Additional authentication data movl %r11d, %edx cmpl $0x00, %edx - je L_AES_GCM_decrypt_calc_aad_done + je L_AES_GCM_decrypt_aesni_calc_aad_done xorl %ecx, %ecx cmpl $16, %edx - jl L_AES_GCM_decrypt_calc_aad_lt16 + jl L_AES_GCM_decrypt_aesni_calc_aad_lt16 andl $0xfffffff0, %edx -L_AES_GCM_decrypt_calc_aad_16_loop: +L_AES_GCM_decrypt_aesni_calc_aad_16_loop: movdqu (%r12,%rcx,1), %xmm8 pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 pxor %xmm8, %xmm6 @@ -2449,22 +2449,22 @@ pxor %xmm2, %xmm6 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_aad_16_loop + jl L_AES_GCM_decrypt_aesni_calc_aad_16_loop movl %r11d, %edx cmpl %edx, %ecx - je L_AES_GCM_decrypt_calc_aad_done -L_AES_GCM_decrypt_calc_aad_lt16: + je L_AES_GCM_decrypt_aesni_calc_aad_done +L_AES_GCM_decrypt_aesni_calc_aad_lt16: subq $16, %rsp pxor %xmm8, %xmm8 xorl %ebx, %ebx movdqu %xmm8, (%rsp) -L_AES_GCM_decrypt_calc_aad_loop: +L_AES_GCM_decrypt_aesni_calc_aad_loop: movzbl (%r12,%rcx,1), %r13d movb %r13b, (%rsp,%rbx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_aad_loop + jl L_AES_GCM_decrypt_aesni_calc_aad_loop movdqu (%rsp), %xmm8 addq $16, %rsp pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 @@ -2523,7 +2523,7 @@ pxor %xmm1, %xmm2 pxor %xmm7, %xmm2 pxor %xmm2, %xmm6 -L_AES_GCM_decrypt_calc_aad_done: +L_AES_GCM_decrypt_aesni_calc_aad_done: # Calculate counter and H pshufb L_aes_gcm_bswap_epi64(%rip), %xmm4 movdqa %xmm5, %xmm9 @@ -2541,7 +2541,7 @@ xorl %ebx, %ebx cmpl $0x80, %r9d movl %r9d, %r13d - jl L_AES_GCM_decrypt_done_128 + jl L_AES_GCM_decrypt_aesni_done_128 andl $0xffffff80, %r13d movdqa %xmm6, %xmm2 # H ^ 1 @@ -2840,7 +2840,7 @@ pxor %xmm8, %xmm14 pxor %xmm14, %xmm7 movdqu %xmm7, 112(%rsp) -L_AES_GCM_decrypt_ghash_128: +L_AES_GCM_decrypt_aesni_ghash_128: leaq (%rdi,%rbx,1), %rcx leaq (%rsi,%rbx,1), %rdx movdqu 128(%rsp), %xmm8 @@ -3108,7 +3108,7 @@ pxor %xmm3, %xmm2 cmpl $11, %r10d movdqa 160(%r15), %xmm7 - jl L_AES_GCM_decrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_decrypt_aesni_aesenc_128_ghash_avx_done aesenc %xmm7, %xmm8 aesenc %xmm7, %xmm9 aesenc %xmm7, %xmm10 @@ -3128,7 +3128,7 @@ aesenc %xmm7, %xmm15 cmpl $13, %r10d movdqa 192(%r15), %xmm7 - jl L_AES_GCM_decrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_decrypt_aesni_aesenc_128_ghash_avx_done aesenc %xmm7, %xmm8 aesenc %xmm7, %xmm9 aesenc %xmm7, %xmm10 @@ -3147,7 +3147,7 @@ aesenc %xmm7, %xmm14 aesenc %xmm7, %xmm15 movdqa 224(%r15), %xmm7 -L_AES_GCM_decrypt_aesenc_128_ghash_avx_done: +L_AES_GCM_decrypt_aesni_aesenc_128_ghash_avx_done: aesenclast %xmm7, %xmm8 aesenclast %xmm7, %xmm9 movdqu (%rcx), %xmm0 @@ -3182,18 +3182,18 @@ movdqu %xmm15, 112(%rdx) addl $0x80, %ebx cmpl %r13d, %ebx - jl L_AES_GCM_decrypt_ghash_128 + jl L_AES_GCM_decrypt_aesni_ghash_128 movdqa %xmm2, %xmm6 movdqu (%rsp), %xmm5 -L_AES_GCM_decrypt_done_128: +L_AES_GCM_decrypt_aesni_done_128: movl %r9d, %edx cmpl %edx, %ebx - jge L_AES_GCM_decrypt_done_dec + jge L_AES_GCM_decrypt_aesni_done_dec movl %r9d, %r13d andl $0xfffffff0, %r13d cmpl %r13d, %ebx - jge L_AES_GCM_decrypt_last_block_done -L_AES_GCM_decrypt_last_block_start: + jge L_AES_GCM_decrypt_aesni_last_block_done +L_AES_GCM_decrypt_aesni_last_block_start: leaq (%rdi,%rbx,1), %rcx leaq (%rsi,%rbx,1), %rdx movdqu (%rcx), %xmm1 @@ -3242,28 +3242,28 @@ pxor %xmm3, %xmm6 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_decrypt_aesenc_gfmul_last + jl L_AES_GCM_decrypt_aesni_aesenc_gfmul_last aesenc %xmm9, %xmm8 aesenc 176(%r15), %xmm8 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_decrypt_aesenc_gfmul_last + jl L_AES_GCM_decrypt_aesni_aesenc_gfmul_last aesenc %xmm9, %xmm8 aesenc 208(%r15), %xmm8 movdqa 224(%r15), %xmm9 -L_AES_GCM_decrypt_aesenc_gfmul_last: +L_AES_GCM_decrypt_aesni_aesenc_gfmul_last: aesenclast %xmm9, %xmm8 movdqu (%rcx), %xmm9 pxor %xmm9, %xmm8 movdqu %xmm8, (%rdx) addl $16, %ebx cmpl %r13d, %ebx - jl L_AES_GCM_decrypt_last_block_start -L_AES_GCM_decrypt_last_block_done: + jl L_AES_GCM_decrypt_aesni_last_block_start +L_AES_GCM_decrypt_aesni_last_block_done: movl %r9d, %ecx movl %ecx, %edx andl $15, %ecx - jz L_AES_GCM_decrypt_aesenc_last15_dec_avx_done + jz L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_done movdqu 128(%rsp), %xmm4 pshufb L_aes_gcm_bswap_epi64(%rip), %xmm4 pxor (%r15), %xmm4 @@ -3278,23 +3278,23 @@ aesenc 144(%r15), %xmm4 cmpl $11, %r10d movdqa 160(%r15), %xmm9 - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last aesenc %xmm9, %xmm4 aesenc 176(%r15), %xmm4 cmpl $13, %r10d movdqa 192(%r15), %xmm9 - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last aesenc %xmm9, %xmm4 aesenc 208(%r15), %xmm4 movdqa 224(%r15), %xmm9 -L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last: aesenclast %xmm9, %xmm4 subq $32, %rsp xorl %ecx, %ecx movdqu %xmm4, (%rsp) pxor %xmm0, %xmm0 movdqu %xmm0, 16(%rsp) -L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_loop: movzbl (%rdi,%rbx,1), %r13d movb %r13b, 16(%rsp,%rcx,1) xorb (%rsp,%rcx,1), %r13b @@ -3302,7 +3302,7 @@ incl %ebx incl %ecx cmpl %edx, %ebx - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_loop movdqu 16(%rsp), %xmm4 addq $32, %rsp pshufb L_aes_gcm_bswap_mask(%rip), %xmm4 @@ -3347,8 +3347,8 @@ pxor %xmm13, %xmm14 pxor %xmm8, %xmm14 pxor %xmm14, %xmm6 -L_AES_GCM_decrypt_aesenc_last15_dec_avx_done: -L_AES_GCM_decrypt_done_dec: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_done: +L_AES_GCM_decrypt_aesni_done_dec: movl %r9d, %edx movl %r11d, %ecx shlq $3, %rdx @@ -3400,24 +3400,24 @@ movdqu 144(%rsp), %xmm0 pxor %xmm6, %xmm0 cmpl $16, %r14d - je L_AES_GCM_decrypt_cmp_tag_16 + je L_AES_GCM_decrypt_aesni_cmp_tag_16 subq $16, %rsp xorq %rcx, %rcx xorq %rbx, %rbx movdqu %xmm0, (%rsp) -L_AES_GCM_decrypt_cmp_tag_loop: +L_AES_GCM_decrypt_aesni_cmp_tag_loop: movzbl (%rsp,%rcx,1), %r13d xorb (%r8,%rcx,1), %r13b orb %r13b, %bl incl %ecx cmpl %r14d, %ecx - jne L_AES_GCM_decrypt_cmp_tag_loop + jne L_AES_GCM_decrypt_aesni_cmp_tag_loop cmpb $0x00, %bl sete %bl addq $16, %rsp xorq %rcx, %rcx - jmp L_AES_GCM_decrypt_cmp_tag_done -L_AES_GCM_decrypt_cmp_tag_16: + jmp L_AES_GCM_decrypt_aesni_cmp_tag_done +L_AES_GCM_decrypt_aesni_cmp_tag_16: movdqu (%r8), %xmm1 pcmpeqb %xmm1, %xmm0 pmovmskb %xmm0, %rdx @@ -3425,7 +3425,7 @@ xorl %ebx, %ebx cmpl $0xffff, %edx sete %bl -L_AES_GCM_decrypt_cmp_tag_done: +L_AES_GCM_decrypt_aesni_cmp_tag_done: movl %ebx, (%rbp) addq $0xa8, %rsp popq %rbp @@ -3436,7 +3436,7 @@ popq %r13 repz retq #ifndef __APPLE__ -.size AES_GCM_decrypt,.-AES_GCM_decrypt +.size AES_GCM_decrypt_aesni,.-AES_GCM_decrypt_aesni #endif /* __APPLE__ */ #ifdef WOLFSSL_AESGCM_STREAM #ifndef __APPLE__ @@ -3472,53 +3472,53 @@ movdqa %xmm4, %xmm1 movdqa (%rdi), %xmm5 pxor %xmm5, %xmm1 - movdqa 16(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 32(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 48(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 64(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 80(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 96(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 112(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 128(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 144(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 + movdqa 16(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 32(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 48(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 64(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 80(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 96(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 112(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 128(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 144(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 cmpl $11, %esi - movdqa 160(%rdi), %xmm7 + movdqa 160(%rdi), %xmm6 jl L_AES_GCM_init_aesni_calc_iv_12_last - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 176(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 176(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 cmpl $13, %esi - movdqa 192(%rdi), %xmm7 + movdqa 192(%rdi), %xmm6 jl L_AES_GCM_init_aesni_calc_iv_12_last - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 208(%rdi), %xmm7 - aesenc %xmm7, %xmm5 - aesenc %xmm7, %xmm1 - movdqa 224(%rdi), %xmm7 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 208(%rdi), %xmm6 + aesenc %xmm6, %xmm5 + aesenc %xmm6, %xmm1 + movdqa 224(%rdi), %xmm6 L_AES_GCM_init_aesni_calc_iv_12_last: - aesenclast %xmm7, %xmm5 - aesenclast %xmm7, %xmm1 + aesenclast %xmm6, %xmm5 + aesenclast %xmm6, %xmm1 pshufb L_aes_gcm_bswap_mask(%rip), %xmm5 movdqu %xmm1, %xmm15 jmp L_AES_GCM_init_aesni_iv_done @@ -3536,18 +3536,18 @@ aesenc 128(%rdi), %xmm5 aesenc 144(%rdi), %xmm5 cmpl $11, %esi - movdqa 160(%rdi), %xmm9 + movdqa 160(%rdi), %xmm8 jl L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last - aesenc %xmm9, %xmm5 + aesenc %xmm8, %xmm5 aesenc 176(%rdi), %xmm5 cmpl $13, %esi - movdqa 192(%rdi), %xmm9 + movdqa 192(%rdi), %xmm8 jl L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last - aesenc %xmm9, %xmm5 + aesenc %xmm8, %xmm5 aesenc 208(%rdi), %xmm5 - movdqa 224(%rdi), %xmm9 + movdqa 224(%rdi), %xmm8 L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last: - aesenclast %xmm9, %xmm5 + aesenclast %xmm8, %xmm5 pshufb L_aes_gcm_bswap_mask(%rip), %xmm5 # Calc counter # Initialization vector @@ -3558,9 +3558,9 @@ jl L_AES_GCM_init_aesni_calc_iv_lt16 andl $0xfffffff0, %edx L_AES_GCM_init_aesni_calc_iv_16_loop: - movdqu (%r10,%rcx,1), %xmm8 - pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 - pxor %xmm8, %xmm4 + movdqu (%r10,%rcx,1), %xmm7 + pshufb L_aes_gcm_bswap_mask(%rip), %xmm7 + pxor %xmm7, %xmm4 pshufd $0x4e, %xmm4, %xmm1 pshufd $0x4e, %xmm5, %xmm2 movdqa %xmm5, %xmm3 @@ -3573,28 +3573,28 @@ pxor %xmm0, %xmm1 pxor %xmm3, %xmm1 movdqa %xmm1, %xmm2 - movdqa %xmm0, %xmm7 + movdqa %xmm0, %xmm6 movdqa %xmm3, %xmm4 pslldq $8, %xmm2 psrldq $8, %xmm1 - pxor %xmm2, %xmm7 + pxor %xmm2, %xmm6 pxor %xmm1, %xmm4 - movdqa %xmm7, %xmm0 + movdqa %xmm6, %xmm0 movdqa %xmm4, %xmm1 psrld $31, %xmm0 psrld $31, %xmm1 - pslld $0x01, %xmm7 + pslld $0x01, %xmm6 pslld $0x01, %xmm4 movdqa %xmm0, %xmm2 pslldq $4, %xmm0 psrldq $12, %xmm2 pslldq $4, %xmm1 por %xmm2, %xmm4 - por %xmm0, %xmm7 + por %xmm0, %xmm6 por %xmm1, %xmm4 - movdqa %xmm7, %xmm0 - movdqa %xmm7, %xmm1 - movdqa %xmm7, %xmm2 + movdqa %xmm6, %xmm0 + movdqa %xmm6, %xmm1 + movdqa %xmm6, %xmm2 pslld $31, %xmm0 pslld $30, %xmm1 pslld $25, %xmm2 @@ -3603,17 +3603,17 @@ movdqa %xmm0, %xmm1 psrldq $4, %xmm1 pslldq $12, %xmm0 - pxor %xmm0, %xmm7 - movdqa %xmm7, %xmm2 - movdqa %xmm7, %xmm3 - movdqa %xmm7, %xmm0 + pxor %xmm0, %xmm6 + movdqa %xmm6, %xmm2 + movdqa %xmm6, %xmm3 + movdqa %xmm6, %xmm0 psrld $0x01, %xmm2 psrld $2, %xmm3 psrld $7, %xmm0 pxor %xmm3, %xmm2 pxor %xmm0, %xmm2 pxor %xmm1, %xmm2 - pxor %xmm7, %xmm2 + pxor %xmm6, %xmm2 pxor %xmm2, %xmm4 addl $16, %ecx cmpl %edx, %ecx @@ -3623,9 +3623,9 @@ je L_AES_GCM_init_aesni_calc_iv_done L_AES_GCM_init_aesni_calc_iv_lt16: subq $16, %rsp - pxor %xmm8, %xmm8 + pxor %xmm7, %xmm7 xorl %r13d, %r13d - movdqu %xmm8, (%rsp) + movdqu %xmm7, (%rsp) L_AES_GCM_init_aesni_calc_iv_loop: movzbl (%r10,%rcx,1), %r12d movb %r12b, (%rsp,%r13,1) @@ -3633,10 +3633,10 @@ incl %r13d cmpl %edx, %ecx jl L_AES_GCM_init_aesni_calc_iv_loop - movdqu (%rsp), %xmm8 + movdqu (%rsp), %xmm7 addq $16, %rsp - pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 - pxor %xmm8, %xmm4 + pshufb L_aes_gcm_bswap_mask(%rip), %xmm7 + pxor %xmm7, %xmm4 pshufd $0x4e, %xmm4, %xmm1 pshufd $0x4e, %xmm5, %xmm2 movdqa %xmm5, %xmm3 @@ -3649,28 +3649,28 @@ pxor %xmm0, %xmm1 pxor %xmm3, %xmm1 movdqa %xmm1, %xmm2 - movdqa %xmm0, %xmm7 + movdqa %xmm0, %xmm6 movdqa %xmm3, %xmm4 pslldq $8, %xmm2 psrldq $8, %xmm1 - pxor %xmm2, %xmm7 + pxor %xmm2, %xmm6 pxor %xmm1, %xmm4 - movdqa %xmm7, %xmm0 + movdqa %xmm6, %xmm0 movdqa %xmm4, %xmm1 psrld $31, %xmm0 psrld $31, %xmm1 - pslld $0x01, %xmm7 + pslld $0x01, %xmm6 pslld $0x01, %xmm4 movdqa %xmm0, %xmm2 pslldq $4, %xmm0 psrldq $12, %xmm2 pslldq $4, %xmm1 por %xmm2, %xmm4 - por %xmm0, %xmm7 + por %xmm0, %xmm6 por %xmm1, %xmm4 - movdqa %xmm7, %xmm0 - movdqa %xmm7, %xmm1 - movdqa %xmm7, %xmm2 + movdqa %xmm6, %xmm0 + movdqa %xmm6, %xmm1 + movdqa %xmm6, %xmm2 pslld $31, %xmm0 pslld $30, %xmm1 pslld $25, %xmm2 @@ -3679,17 +3679,17 @@ movdqa %xmm0, %xmm1 psrldq $4, %xmm1 pslldq $12, %xmm0 - pxor %xmm0, %xmm7 - movdqa %xmm7, %xmm2 - movdqa %xmm7, %xmm3 - movdqa %xmm7, %xmm0 + pxor %xmm0, %xmm6 + movdqa %xmm6, %xmm2 + movdqa %xmm6, %xmm3 + movdqa %xmm6, %xmm0 psrld $0x01, %xmm2 psrld $2, %xmm3 psrld $7, %xmm0 pxor %xmm3, %xmm2 pxor %xmm0, %xmm2 pxor %xmm1, %xmm2 - pxor %xmm7, %xmm2 + pxor %xmm6, %xmm2 pxor %xmm2, %xmm4 L_AES_GCM_init_aesni_calc_iv_done: # T = Encrypt counter @@ -3709,28 +3709,28 @@ pxor %xmm0, %xmm1 pxor %xmm3, %xmm1 movdqa %xmm1, %xmm2 - movdqa %xmm0, %xmm7 + movdqa %xmm0, %xmm6 movdqa %xmm3, %xmm4 pslldq $8, %xmm2 psrldq $8, %xmm1 - pxor %xmm2, %xmm7 + pxor %xmm2, %xmm6 pxor %xmm1, %xmm4 - movdqa %xmm7, %xmm0 + movdqa %xmm6, %xmm0 movdqa %xmm4, %xmm1 psrld $31, %xmm0 psrld $31, %xmm1 - pslld $0x01, %xmm7 + pslld $0x01, %xmm6 pslld $0x01, %xmm4 movdqa %xmm0, %xmm2 pslldq $4, %xmm0 psrldq $12, %xmm2 pslldq $4, %xmm1 por %xmm2, %xmm4 - por %xmm0, %xmm7 + por %xmm0, %xmm6 por %xmm1, %xmm4 - movdqa %xmm7, %xmm0 - movdqa %xmm7, %xmm1 - movdqa %xmm7, %xmm2 + movdqa %xmm6, %xmm0 + movdqa %xmm6, %xmm1 + movdqa %xmm6, %xmm2 pslld $31, %xmm0 pslld $30, %xmm1 pslld $25, %xmm2 @@ -3739,45 +3739,45 @@ movdqa %xmm0, %xmm1 psrldq $4, %xmm1 pslldq $12, %xmm0 - pxor %xmm0, %xmm7 - movdqa %xmm7, %xmm2 - movdqa %xmm7, %xmm3 - movdqa %xmm7, %xmm0 + pxor %xmm0, %xmm6 + movdqa %xmm6, %xmm2 + movdqa %xmm6, %xmm3 + movdqa %xmm6, %xmm0 psrld $0x01, %xmm2 psrld $2, %xmm3 psrld $7, %xmm0 pxor %xmm3, %xmm2 pxor %xmm0, %xmm2 pxor %xmm1, %xmm2 - pxor %xmm7, %xmm2 + pxor %xmm6, %xmm2 pxor %xmm2, %xmm4 pshufb L_aes_gcm_bswap_mask(%rip), %xmm4 # Encrypt counter - movdqa (%rdi), %xmm8 - pxor %xmm4, %xmm8 - aesenc 16(%rdi), %xmm8 - aesenc 32(%rdi), %xmm8 - aesenc 48(%rdi), %xmm8 - aesenc 64(%rdi), %xmm8 - aesenc 80(%rdi), %xmm8 - aesenc 96(%rdi), %xmm8 - aesenc 112(%rdi), %xmm8 - aesenc 128(%rdi), %xmm8 - aesenc 144(%rdi), %xmm8 + movdqa (%rdi), %xmm7 + pxor %xmm4, %xmm7 + aesenc 16(%rdi), %xmm7 + aesenc 32(%rdi), %xmm7 + aesenc 48(%rdi), %xmm7 + aesenc 64(%rdi), %xmm7 + aesenc 80(%rdi), %xmm7 + aesenc 96(%rdi), %xmm7 + aesenc 112(%rdi), %xmm7 + aesenc 128(%rdi), %xmm7 + aesenc 144(%rdi), %xmm7 cmpl $11, %esi - movdqa 160(%rdi), %xmm9 + movdqa 160(%rdi), %xmm8 jl L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last - aesenc %xmm9, %xmm8 - aesenc 176(%rdi), %xmm8 + aesenc %xmm8, %xmm7 + aesenc 176(%rdi), %xmm7 cmpl $13, %esi - movdqa 192(%rdi), %xmm9 + movdqa 192(%rdi), %xmm8 jl L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last - aesenc %xmm9, %xmm8 - aesenc 208(%rdi), %xmm8 - movdqa 224(%rdi), %xmm9 + aesenc %xmm8, %xmm7 + aesenc 208(%rdi), %xmm7 + movdqa 224(%rdi), %xmm8 L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last: - aesenclast %xmm9, %xmm8 - movdqu %xmm8, %xmm15 + aesenclast %xmm8, %xmm7 + movdqu %xmm7, %xmm15 L_AES_GCM_init_aesni_iv_done: movdqa %xmm15, (%rax) pshufb L_aes_gcm_bswap_epi64(%rip), %xmm4 @@ -3809,9 +3809,9 @@ movdqa (%rax), %xmm6 xorl %ecx, %ecx L_AES_GCM_aad_update_aesni_16_loop: - movdqu (%rdi,%rcx,1), %xmm8 - pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 - pxor %xmm8, %xmm5 + movdqu (%rdi,%rcx,1), %xmm7 + pshufb L_aes_gcm_bswap_mask(%rip), %xmm7 + pxor %xmm7, %xmm5 pshufd $0x4e, %xmm5, %xmm1 pshufd $0x4e, %xmm6, %xmm2 movdqa %xmm6, %xmm3 @@ -3888,38 +3888,38 @@ #endif /* __APPLE__ */ movq %rdx, %r10 movq %rcx, %r11 - movdqu (%r8), %xmm8 - movdqa %xmm8, %xmm9 - pshufb L_aes_gcm_bswap_epi64(%rip), %xmm8 - paddd L_aes_gcm_one(%rip), %xmm9 - pxor (%rdi), %xmm8 - movdqu %xmm9, (%r8) - aesenc 16(%rdi), %xmm8 - aesenc 32(%rdi), %xmm8 - aesenc 48(%rdi), %xmm8 - aesenc 64(%rdi), %xmm8 - aesenc 80(%rdi), %xmm8 - aesenc 96(%rdi), %xmm8 - aesenc 112(%rdi), %xmm8 - aesenc 128(%rdi), %xmm8 - aesenc 144(%rdi), %xmm8 + movdqu (%r8), %xmm0 + movdqa %xmm0, %xmm1 + pshufb L_aes_gcm_bswap_epi64(%rip), %xmm0 + paddd L_aes_gcm_one(%rip), %xmm1 + pxor (%rdi), %xmm0 + movdqu %xmm1, (%r8) + aesenc 16(%rdi), %xmm0 + aesenc 32(%rdi), %xmm0 + aesenc 48(%rdi), %xmm0 + aesenc 64(%rdi), %xmm0 + aesenc 80(%rdi), %xmm0 + aesenc 96(%rdi), %xmm0 + aesenc 112(%rdi), %xmm0 + aesenc 128(%rdi), %xmm0 + aesenc 144(%rdi), %xmm0 cmpl $11, %esi - movdqa 160(%rdi), %xmm9 + movdqa 160(%rdi), %xmm1 jl L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last - aesenc %xmm9, %xmm8 - aesenc 176(%rdi), %xmm8 + aesenc %xmm1, %xmm0 + aesenc 176(%rdi), %xmm0 cmpl $13, %esi - movdqa 192(%rdi), %xmm9 + movdqa 192(%rdi), %xmm1 jl L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last - aesenc %xmm9, %xmm8 - aesenc 208(%rdi), %xmm8 - movdqa 224(%rdi), %xmm9 + aesenc %xmm1, %xmm0 + aesenc 208(%rdi), %xmm0 + movdqa 224(%rdi), %xmm1 L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last: - aesenclast %xmm9, %xmm8 - movdqu (%r11), %xmm9 - pxor %xmm9, %xmm8 - movdqu %xmm8, (%r10) - pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 + aesenclast %xmm1, %xmm0 + movdqu (%r11), %xmm1 + pxor %xmm1, %xmm0 + movdqu %xmm0, (%r10) + pshufb L_aes_gcm_bswap_mask(%rip), %xmm0 repz retq #ifndef __APPLE__ .size AES_GCM_encrypt_block_aesni,.-AES_GCM_encrypt_block_aesni @@ -3938,9 +3938,9 @@ #endif /* __APPLE__ */ movdqa (%rsi), %xmm4 movdqa (%rdx), %xmm5 - movdqu (%rdi), %xmm8 - pshufb L_aes_gcm_bswap_mask(%rip), %xmm8 - pxor %xmm8, %xmm4 + movdqu (%rdi), %xmm7 + pshufb L_aes_gcm_bswap_mask(%rip), %xmm7 + pxor %xmm7, %xmm4 pshufd $0x4e, %xmm4, %xmm1 pshufd $0x4e, %xmm5, %xmm2 movdqa %xmm5, %xmm3 @@ -5243,16 +5243,16 @@ movdqa (%rdi), %xmm4 movdqa (%r9), %xmm5 movdqa (%r8), %xmm6 - movdqa %xmm5, %xmm9 movdqa %xmm5, %xmm8 - psrlq $63, %xmm9 - psllq $0x01, %xmm8 - pslldq $8, %xmm9 - por %xmm9, %xmm8 + movdqa %xmm5, %xmm7 + psrlq $63, %xmm8 + psllq $0x01, %xmm7 + pslldq $8, %xmm8 + por %xmm8, %xmm7 pshufd $0xff, %xmm5, %xmm5 psrad $31, %xmm5 pand L_aes_gcm_mod2_128(%rip), %xmm5 - pxor %xmm8, %xmm5 + pxor %xmm7, %xmm5 movl %r10d, %edx movl %r11d, %ecx shlq $3, %rdx @@ -5260,46 +5260,46 @@ pinsrq $0x00, %rdx, %xmm0 pinsrq $0x01, %rcx, %xmm0 pxor %xmm0, %xmm4 - pshufd $0x4e, %xmm5, %xmm9 - pshufd $0x4e, %xmm4, %xmm10 - movdqa %xmm4, %xmm11 - movdqa %xmm4, %xmm8 - pclmulqdq $0x11, %xmm5, %xmm11 - pclmulqdq $0x00, %xmm5, %xmm8 - pxor %xmm5, %xmm9 - pxor %xmm4, %xmm10 - pclmulqdq $0x00, %xmm10, %xmm9 - pxor %xmm8, %xmm9 - pxor %xmm11, %xmm9 - movdqa %xmm9, %xmm10 - movdqa %xmm11, %xmm4 - pslldq $8, %xmm10 - psrldq $8, %xmm9 + pshufd $0x4e, %xmm5, %xmm8 + pshufd $0x4e, %xmm4, %xmm9 + movdqa %xmm4, %xmm10 + movdqa %xmm4, %xmm7 + pclmulqdq $0x11, %xmm5, %xmm10 + pclmulqdq $0x00, %xmm5, %xmm7 + pxor %xmm5, %xmm8 + pxor %xmm4, %xmm9 + pclmulqdq $0x00, %xmm9, %xmm8 + pxor %xmm7, %xmm8 pxor %xmm10, %xmm8 - pxor %xmm9, %xmm4 - movdqa %xmm8, %xmm12 - movdqa %xmm8, %xmm13 - movdqa %xmm8, %xmm14 - pslld $31, %xmm12 - pslld $30, %xmm13 - pslld $25, %xmm14 - pxor %xmm13, %xmm12 - pxor %xmm14, %xmm12 - movdqa %xmm12, %xmm13 - psrldq $4, %xmm13 - pslldq $12, %xmm12 - pxor %xmm12, %xmm8 - movdqa %xmm8, %xmm14 - movdqa %xmm8, %xmm10 movdqa %xmm8, %xmm9 - psrld $0x01, %xmm14 - psrld $2, %xmm10 - psrld $7, %xmm9 - pxor %xmm10, %xmm14 - pxor %xmm9, %xmm14 - pxor %xmm13, %xmm14 - pxor %xmm8, %xmm14 - pxor %xmm14, %xmm4 + movdqa %xmm10, %xmm4 + pslldq $8, %xmm9 + psrldq $8, %xmm8 + pxor %xmm9, %xmm7 + pxor %xmm8, %xmm4 + movdqa %xmm7, %xmm11 + movdqa %xmm7, %xmm12 + movdqa %xmm7, %xmm13 + pslld $31, %xmm11 + pslld $30, %xmm12 + pslld $25, %xmm13 + pxor %xmm12, %xmm11 + pxor %xmm13, %xmm11 + movdqa %xmm11, %xmm12 + psrldq $4, %xmm12 + pslldq $12, %xmm11 + pxor %xmm11, %xmm7 + movdqa %xmm7, %xmm13 + movdqa %xmm7, %xmm9 + movdqa %xmm7, %xmm8 + psrld $0x01, %xmm13 + psrld $2, %xmm9 + psrld $7, %xmm8 + pxor %xmm9, %xmm13 + pxor %xmm8, %xmm13 + pxor %xmm12, %xmm13 + pxor %xmm7, %xmm13 + pxor %xmm13, %xmm4 pshufb L_aes_gcm_bswap_mask(%rip), %xmm4 movdqu %xmm6, %xmm0 pxor %xmm4, %xmm0 @@ -6113,16 +6113,16 @@ movdqa (%rdi), %xmm6 movdqa (%r9), %xmm5 movdqa (%r8), %xmm15 - movdqa %xmm5, %xmm9 movdqa %xmm5, %xmm8 - psrlq $63, %xmm9 - psllq $0x01, %xmm8 - pslldq $8, %xmm9 - por %xmm9, %xmm8 + movdqa %xmm5, %xmm7 + psrlq $63, %xmm8 + psllq $0x01, %xmm7 + pslldq $8, %xmm8 + por %xmm8, %xmm7 pshufd $0xff, %xmm5, %xmm5 psrad $31, %xmm5 pand L_aes_gcm_mod2_128(%rip), %xmm5 - pxor %xmm8, %xmm5 + pxor %xmm7, %xmm5 movl %r10d, %edx movl %r11d, %ecx shlq $3, %rdx @@ -6130,46 +6130,46 @@ pinsrq $0x00, %rdx, %xmm0 pinsrq $0x01, %rcx, %xmm0 pxor %xmm0, %xmm6 - pshufd $0x4e, %xmm5, %xmm9 - pshufd $0x4e, %xmm6, %xmm10 - movdqa %xmm6, %xmm11 - movdqa %xmm6, %xmm8 - pclmulqdq $0x11, %xmm5, %xmm11 - pclmulqdq $0x00, %xmm5, %xmm8 - pxor %xmm5, %xmm9 - pxor %xmm6, %xmm10 - pclmulqdq $0x00, %xmm10, %xmm9 - pxor %xmm8, %xmm9 - pxor %xmm11, %xmm9 - movdqa %xmm9, %xmm10 - movdqa %xmm11, %xmm6 - pslldq $8, %xmm10 - psrldq $8, %xmm9 + pshufd $0x4e, %xmm5, %xmm8 + pshufd $0x4e, %xmm6, %xmm9 + movdqa %xmm6, %xmm10 + movdqa %xmm6, %xmm7 + pclmulqdq $0x11, %xmm5, %xmm10 + pclmulqdq $0x00, %xmm5, %xmm7 + pxor %xmm5, %xmm8 + pxor %xmm6, %xmm9 + pclmulqdq $0x00, %xmm9, %xmm8 + pxor %xmm7, %xmm8 pxor %xmm10, %xmm8 - pxor %xmm9, %xmm6 - movdqa %xmm8, %xmm12 - movdqa %xmm8, %xmm13 - movdqa %xmm8, %xmm14 - pslld $31, %xmm12 - pslld $30, %xmm13 - pslld $25, %xmm14 - pxor %xmm13, %xmm12 - pxor %xmm14, %xmm12 - movdqa %xmm12, %xmm13 - psrldq $4, %xmm13 - pslldq $12, %xmm12 - pxor %xmm12, %xmm8 - movdqa %xmm8, %xmm14 - movdqa %xmm8, %xmm10 movdqa %xmm8, %xmm9 - psrld $0x01, %xmm14 - psrld $2, %xmm10 - psrld $7, %xmm9 - pxor %xmm10, %xmm14 - pxor %xmm9, %xmm14 - pxor %xmm13, %xmm14 - pxor %xmm8, %xmm14 - pxor %xmm14, %xmm6 + movdqa %xmm10, %xmm6 + pslldq $8, %xmm9 + psrldq $8, %xmm8 + pxor %xmm9, %xmm7 + pxor %xmm8, %xmm6 + movdqa %xmm7, %xmm11 + movdqa %xmm7, %xmm12 + movdqa %xmm7, %xmm13 + pslld $31, %xmm11 + pslld $30, %xmm12 + pslld $25, %xmm13 + pxor %xmm12, %xmm11 + pxor %xmm13, %xmm11 + movdqa %xmm11, %xmm12 + psrldq $4, %xmm12 + pslldq $12, %xmm11 + pxor %xmm11, %xmm7 + movdqa %xmm7, %xmm13 + movdqa %xmm7, %xmm9 + movdqa %xmm7, %xmm8 + psrld $0x01, %xmm13 + psrld $2, %xmm9 + psrld $7, %xmm8 + pxor %xmm9, %xmm13 + pxor %xmm8, %xmm13 + pxor %xmm12, %xmm13 + pxor %xmm7, %xmm13 + pxor %xmm13, %xmm6 pshufb L_aes_gcm_bswap_mask(%rip), %xmm6 movdqu %xmm15, %xmm0 pxor %xmm6, %xmm0 @@ -9133,53 +9133,53 @@ # H = Encrypt X(=0) and T = Encrypt counter vmovdqa (%rdi), %xmm5 vpxor %xmm5, %xmm4, %xmm1 - vmovdqa 16(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 32(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 48(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 64(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 80(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 96(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 112(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 128(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 144(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 + vmovdqa 16(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 32(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 48(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 64(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 80(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 96(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 112(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 128(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 144(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 cmpl $11, %esi - vmovdqa 160(%rdi), %xmm7 + vmovdqa 160(%rdi), %xmm6 jl L_AES_GCM_init_avx1_calc_iv_12_last - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 176(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 176(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 cmpl $13, %esi - vmovdqa 192(%rdi), %xmm7 + vmovdqa 192(%rdi), %xmm6 jl L_AES_GCM_init_avx1_calc_iv_12_last - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 208(%rdi), %xmm7 - vaesenc %xmm7, %xmm5, %xmm5 - vaesenc %xmm7, %xmm1, %xmm1 - vmovdqa 224(%rdi), %xmm7 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 208(%rdi), %xmm6 + vaesenc %xmm6, %xmm5, %xmm5 + vaesenc %xmm6, %xmm1, %xmm1 + vmovdqa 224(%rdi), %xmm6 L_AES_GCM_init_avx1_calc_iv_12_last: - vaesenclast %xmm7, %xmm5, %xmm5 - vaesenclast %xmm7, %xmm1, %xmm1 + vaesenclast %xmm6, %xmm5, %xmm5 + vaesenclast %xmm6, %xmm1, %xmm1 vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm5, %xmm5 vmovdqu %xmm1, %xmm15 jmp L_AES_GCM_init_avx1_iv_done @@ -9197,18 +9197,18 @@ vaesenc 128(%rdi), %xmm5, %xmm5 vaesenc 144(%rdi), %xmm5, %xmm5 cmpl $11, %esi - vmovdqa 160(%rdi), %xmm9 + vmovdqa 160(%rdi), %xmm8 jl L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last - vaesenc %xmm9, %xmm5, %xmm5 + vaesenc %xmm8, %xmm5, %xmm5 vaesenc 176(%rdi), %xmm5, %xmm5 cmpl $13, %esi - vmovdqa 192(%rdi), %xmm9 + vmovdqa 192(%rdi), %xmm8 jl L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last - vaesenc %xmm9, %xmm5, %xmm5 + vaesenc %xmm8, %xmm5, %xmm5 vaesenc 208(%rdi), %xmm5, %xmm5 - vmovdqa 224(%rdi), %xmm9 + vmovdqa 224(%rdi), %xmm8 L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last: - vaesenclast %xmm9, %xmm5, %xmm5 + vaesenclast %xmm8, %xmm5, %xmm5 vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm5, %xmm5 # Calc counter # Initialization vector @@ -9219,9 +9219,9 @@ jl L_AES_GCM_init_avx1_calc_iv_lt16 andl $0xfffffff0, %edx L_AES_GCM_init_avx1_calc_iv_16_loop: - vmovdqu (%r10,%rcx,1), %xmm8 - vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm8, %xmm8 - vpxor %xmm8, %xmm4, %xmm4 + vmovdqu (%r10,%rcx,1), %xmm7 + vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm7, %xmm7 + vpxor %xmm7, %xmm4, %xmm4 # ghash_gfmul_avx vpshufd $0x4e, %xmm4, %xmm1 vpshufd $0x4e, %xmm5, %xmm2 @@ -9232,38 +9232,38 @@ vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1 vpxor %xmm0, %xmm1, %xmm1 vpxor %xmm3, %xmm1, %xmm1 - vmovdqa %xmm0, %xmm7 + vmovdqa %xmm0, %xmm6 vmovdqa %xmm3, %xmm4 vpslldq $8, %xmm1, %xmm2 vpsrldq $8, %xmm1, %xmm1 - vpxor %xmm2, %xmm7, %xmm7 + vpxor %xmm2, %xmm6, %xmm6 vpxor %xmm1, %xmm4, %xmm4 - vpsrld $31, %xmm7, %xmm0 + vpsrld $31, %xmm6, %xmm0 vpsrld $31, %xmm4, %xmm1 - vpslld $0x01, %xmm7, %xmm7 + vpslld $0x01, %xmm6, %xmm6 vpslld $0x01, %xmm4, %xmm4 vpsrldq $12, %xmm0, %xmm2 vpslldq $4, %xmm0, %xmm0 vpslldq $4, %xmm1, %xmm1 vpor %xmm2, %xmm4, %xmm4 - vpor %xmm0, %xmm7, %xmm7 + vpor %xmm0, %xmm6, %xmm6 vpor %xmm1, %xmm4, %xmm4 - vpslld $31, %xmm7, %xmm0 - vpslld $30, %xmm7, %xmm1 - vpslld $25, %xmm7, %xmm2 + vpslld $31, %xmm6, %xmm0 + vpslld $30, %xmm6, %xmm1 + vpslld $25, %xmm6, %xmm2 vpxor %xmm1, %xmm0, %xmm0 vpxor %xmm2, %xmm0, %xmm0 vmovdqa %xmm0, %xmm1 vpsrldq $4, %xmm1, %xmm1 vpslldq $12, %xmm0, %xmm0 - vpxor %xmm0, %xmm7, %xmm7 - vpsrld $0x01, %xmm7, %xmm2 - vpsrld $2, %xmm7, %xmm3 - vpsrld $7, %xmm7, %xmm0 + vpxor %xmm0, %xmm6, %xmm6 + vpsrld $0x01, %xmm6, %xmm2 + vpsrld $2, %xmm6, %xmm3 + vpsrld $7, %xmm6, %xmm0 vpxor %xmm3, %xmm2, %xmm2 vpxor %xmm0, %xmm2, %xmm2 vpxor %xmm1, %xmm2, %xmm2 - vpxor %xmm7, %xmm2, %xmm2 + vpxor %xmm6, %xmm2, %xmm2 vpxor %xmm2, %xmm4, %xmm4 addl $16, %ecx cmpl %edx, %ecx @@ -9273,9 +9273,9 @@ je L_AES_GCM_init_avx1_calc_iv_done L_AES_GCM_init_avx1_calc_iv_lt16: subq $16, %rsp - vpxor %xmm8, %xmm8, %xmm8 + vpxor %xmm7, %xmm7, %xmm7 xorl %r13d, %r13d - vmovdqu %xmm8, (%rsp) + vmovdqu %xmm7, (%rsp) L_AES_GCM_init_avx1_calc_iv_loop: movzbl (%r10,%rcx,1), %r12d movb %r12b, (%rsp,%r13,1) @@ -9283,10 +9283,10 @@ incl %r13d cmpl %edx, %ecx jl L_AES_GCM_init_avx1_calc_iv_loop - vmovdqu (%rsp), %xmm8 + vmovdqu (%rsp), %xmm7 addq $16, %rsp - vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm8, %xmm8 - vpxor %xmm8, %xmm4, %xmm4 + vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm7, %xmm7 + vpxor %xmm7, %xmm4, %xmm4 # ghash_gfmul_avx vpshufd $0x4e, %xmm4, %xmm1 vpshufd $0x4e, %xmm5, %xmm2 @@ -9297,38 +9297,38 @@ vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1 vpxor %xmm0, %xmm1, %xmm1 vpxor %xmm3, %xmm1, %xmm1 - vmovdqa %xmm0, %xmm7 + vmovdqa %xmm0, %xmm6 vmovdqa %xmm3, %xmm4 vpslldq $8, %xmm1, %xmm2 vpsrldq $8, %xmm1, %xmm1 - vpxor %xmm2, %xmm7, %xmm7 + vpxor %xmm2, %xmm6, %xmm6 vpxor %xmm1, %xmm4, %xmm4 - vpsrld $31, %xmm7, %xmm0 + vpsrld $31, %xmm6, %xmm0 vpsrld $31, %xmm4, %xmm1 - vpslld $0x01, %xmm7, %xmm7 + vpslld $0x01, %xmm6, %xmm6 vpslld $0x01, %xmm4, %xmm4 vpsrldq $12, %xmm0, %xmm2 vpslldq $4, %xmm0, %xmm0 vpslldq $4, %xmm1, %xmm1 vpor %xmm2, %xmm4, %xmm4 - vpor %xmm0, %xmm7, %xmm7 + vpor %xmm0, %xmm6, %xmm6 vpor %xmm1, %xmm4, %xmm4 - vpslld $31, %xmm7, %xmm0 - vpslld $30, %xmm7, %xmm1 - vpslld $25, %xmm7, %xmm2 + vpslld $31, %xmm6, %xmm0 + vpslld $30, %xmm6, %xmm1 + vpslld $25, %xmm6, %xmm2 vpxor %xmm1, %xmm0, %xmm0 vpxor %xmm2, %xmm0, %xmm0 vmovdqa %xmm0, %xmm1 vpsrldq $4, %xmm1, %xmm1 vpslldq $12, %xmm0, %xmm0 - vpxor %xmm0, %xmm7, %xmm7 - vpsrld $0x01, %xmm7, %xmm2 - vpsrld $2, %xmm7, %xmm3 - vpsrld $7, %xmm7, %xmm0 + vpxor %xmm0, %xmm6, %xmm6 + vpsrld $0x01, %xmm6, %xmm2 + vpsrld $2, %xmm6, %xmm3 + vpsrld $7, %xmm6, %xmm0 vpxor %xmm3, %xmm2, %xmm2 vpxor %xmm0, %xmm2, %xmm2 vpxor %xmm1, %xmm2, %xmm2 - vpxor %xmm7, %xmm2, %xmm2 + vpxor %xmm6, %xmm2, %xmm2 vpxor %xmm2, %xmm4, %xmm4 L_AES_GCM_init_avx1_calc_iv_done: # T = Encrypt counter @@ -9346,66 +9346,66 @@ vpclmulqdq $0x00, %xmm2, %xmm1, %xmm1 vpxor %xmm0, %xmm1, %xmm1 vpxor %xmm3, %xmm1, %xmm1 - vmovdqa %xmm0, %xmm7 + vmovdqa %xmm0, %xmm6 vmovdqa %xmm3, %xmm4 vpslldq $8, %xmm1, %xmm2 vpsrldq $8, %xmm1, %xmm1 - vpxor %xmm2, %xmm7, %xmm7 + vpxor %xmm2, %xmm6, %xmm6 vpxor %xmm1, %xmm4, %xmm4 - vpsrld $31, %xmm7, %xmm0 + vpsrld $31, %xmm6, %xmm0 vpsrld $31, %xmm4, %xmm1 - vpslld $0x01, %xmm7, %xmm7 + vpslld $0x01, %xmm6, %xmm6 vpslld $0x01, %xmm4, %xmm4 vpsrldq $12, %xmm0, %xmm2 vpslldq $4, %xmm0, %xmm0 vpslldq $4, %xmm1, %xmm1 vpor %xmm2, %xmm4, %xmm4 - vpor %xmm0, %xmm7, %xmm7 + vpor %xmm0, %xmm6, %xmm6 vpor %xmm1, %xmm4, %xmm4 - vpslld $31, %xmm7, %xmm0 - vpslld $30, %xmm7, %xmm1 - vpslld $25, %xmm7, %xmm2 + vpslld $31, %xmm6, %xmm0 + vpslld $30, %xmm6, %xmm1 + vpslld $25, %xmm6, %xmm2 vpxor %xmm1, %xmm0, %xmm0 vpxor %xmm2, %xmm0, %xmm0 vmovdqa %xmm0, %xmm1 vpsrldq $4, %xmm1, %xmm1 vpslldq $12, %xmm0, %xmm0 - vpxor %xmm0, %xmm7, %xmm7 - vpsrld $0x01, %xmm7, %xmm2 - vpsrld $2, %xmm7, %xmm3 - vpsrld $7, %xmm7, %xmm0 + vpxor %xmm0, %xmm6, %xmm6 + vpsrld $0x01, %xmm6, %xmm2 + vpsrld $2, %xmm6, %xmm3 + vpsrld $7, %xmm6, %xmm0 vpxor %xmm3, %xmm2, %xmm2 vpxor %xmm0, %xmm2, %xmm2 vpxor %xmm1, %xmm2, %xmm2 - vpxor %xmm7, %xmm2, %xmm2 + vpxor %xmm6, %xmm2, %xmm2 vpxor %xmm2, %xmm4, %xmm4 vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm4, %xmm4 # Encrypt counter - vmovdqa (%rdi), %xmm8 - vpxor %xmm4, %xmm8, %xmm8 - vaesenc 16(%rdi), %xmm8, %xmm8 - vaesenc 32(%rdi), %xmm8, %xmm8 - vaesenc 48(%rdi), %xmm8, %xmm8 - vaesenc 64(%rdi), %xmm8, %xmm8 - vaesenc 80(%rdi), %xmm8, %xmm8 - vaesenc 96(%rdi), %xmm8, %xmm8 - vaesenc 112(%rdi), %xmm8, %xmm8 - vaesenc 128(%rdi), %xmm8, %xmm8 - vaesenc 144(%rdi), %xmm8, %xmm8 + vmovdqa (%rdi), %xmm7 + vpxor %xmm4, %xmm7, %xmm7 + vaesenc 16(%rdi), %xmm7, %xmm7 + vaesenc 32(%rdi), %xmm7, %xmm7 + vaesenc 48(%rdi), %xmm7, %xmm7 + vaesenc 64(%rdi), %xmm7, %xmm7 + vaesenc 80(%rdi), %xmm7, %xmm7 + vaesenc 96(%rdi), %xmm7, %xmm7 + vaesenc 112(%rdi), %xmm7, %xmm7 + vaesenc 128(%rdi), %xmm7, %xmm7 + vaesenc 144(%rdi), %xmm7, %xmm7 cmpl $11, %esi - vmovdqa 160(%rdi), %xmm9 + vmovdqa 160(%rdi), %xmm8 jl L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last - vaesenc %xmm9, %xmm8, %xmm8 - vaesenc 176(%rdi), %xmm8, %xmm8 + vaesenc %xmm8, %xmm7, %xmm7 + vaesenc 176(%rdi), %xmm7, %xmm7 cmpl $13, %esi - vmovdqa 192(%rdi), %xmm9 + vmovdqa 192(%rdi), %xmm8 jl L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last - vaesenc %xmm9, %xmm8, %xmm8 - vaesenc 208(%rdi), %xmm8, %xmm8 - vmovdqa 224(%rdi), %xmm9 + vaesenc %xmm8, %xmm7, %xmm7 + vaesenc 208(%rdi), %xmm7, %xmm7 + vmovdqa 224(%rdi), %xmm8 L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last: - vaesenclast %xmm9, %xmm8, %xmm8 - vmovdqu %xmm8, %xmm15 + vaesenclast %xmm8, %xmm7, %xmm7 + vmovdqu %xmm7, %xmm15 L_AES_GCM_init_avx1_iv_done: vmovdqa %xmm15, (%rax) vpshufb L_avx1_aes_gcm_bswap_epi64(%rip), %xmm4, %xmm4 @@ -9437,9 +9437,9 @@ vmovdqa (%rax), %xmm6 xorl %ecx, %ecx L_AES_GCM_aad_update_avx1_16_loop: - vmovdqu (%rdi,%rcx,1), %xmm8 - vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm8, %xmm8 - vpxor %xmm8, %xmm5, %xmm5 + vmovdqu (%rdi,%rcx,1), %xmm7 + vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm7, %xmm7 + vpxor %xmm7, %xmm5, %xmm5 # ghash_gfmul_avx vpshufd $0x4e, %xmm5, %xmm1 vpshufd $0x4e, %xmm6, %xmm2 @@ -9506,37 +9506,37 @@ #endif /* __APPLE__ */ movq %rdx, %r10 movq %rcx, %r11 - vmovdqu (%r8), %xmm9 - vpshufb L_avx1_aes_gcm_bswap_epi64(%rip), %xmm9, %xmm8 - vpaddd L_avx1_aes_gcm_one(%rip), %xmm9, %xmm9 - vmovdqu %xmm9, (%r8) - vpxor (%rdi), %xmm8, %xmm8 - vaesenc 16(%rdi), %xmm8, %xmm8 - vaesenc 32(%rdi), %xmm8, %xmm8 - vaesenc 48(%rdi), %xmm8, %xmm8 - vaesenc 64(%rdi), %xmm8, %xmm8 - vaesenc 80(%rdi), %xmm8, %xmm8 - vaesenc 96(%rdi), %xmm8, %xmm8 - vaesenc 112(%rdi), %xmm8, %xmm8 - vaesenc 128(%rdi), %xmm8, %xmm8 - vaesenc 144(%rdi), %xmm8, %xmm8 + vmovdqu (%r8), %xmm1 + vpshufb L_avx1_aes_gcm_bswap_epi64(%rip), %xmm1, %xmm0 + vpaddd L_avx1_aes_gcm_one(%rip), %xmm1, %xmm1 + vmovdqu %xmm1, (%r8) + vpxor (%rdi), %xmm0, %xmm0 + vaesenc 16(%rdi), %xmm0, %xmm0 + vaesenc 32(%rdi), %xmm0, %xmm0 + vaesenc 48(%rdi), %xmm0, %xmm0 + vaesenc 64(%rdi), %xmm0, %xmm0 + vaesenc 80(%rdi), %xmm0, %xmm0 + vaesenc 96(%rdi), %xmm0, %xmm0 + vaesenc 112(%rdi), %xmm0, %xmm0 + vaesenc 128(%rdi), %xmm0, %xmm0 + vaesenc 144(%rdi), %xmm0, %xmm0 cmpl $11, %esi - vmovdqa 160(%rdi), %xmm9 + vmovdqa 160(%rdi), %xmm1 jl L_AES_GCM_encrypt_block_avx1_aesenc_block_last - vaesenc %xmm9, %xmm8, %xmm8 - vaesenc 176(%rdi), %xmm8, %xmm8 + vaesenc %xmm1, %xmm0, %xmm0 + vaesenc 176(%rdi), %xmm0, %xmm0 cmpl $13, %esi - vmovdqa 192(%rdi), %xmm9 + vmovdqa 192(%rdi), %xmm1 jl L_AES_GCM_encrypt_block_avx1_aesenc_block_last - vaesenc %xmm9, %xmm8, %xmm8 - vaesenc 208(%rdi), %xmm8, %xmm8 - vmovdqa 224(%rdi), %xmm9 + vaesenc %xmm1, %xmm0, %xmm0 + vaesenc 208(%rdi), %xmm0, %xmm0 + vmovdqa 224(%rdi), %xmm1 L_AES_GCM_encrypt_block_avx1_aesenc_block_last: - vaesenclast %xmm9, %xmm8, %xmm8 - vmovdqu (%r11), %xmm9 - vpxor %xmm9, %xmm8, %xmm8 - vmovdqu %xmm8, (%r10) - vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm8, %xmm8 + vaesenclast %xmm1, %xmm0, %xmm0 + vmovdqu (%r11), %xmm1 + vpxor %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, (%r10) + vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm0, %xmm0 vzeroupper repz retq #ifndef __APPLE__ @@ -9556,9 +9556,9 @@ #endif /* __APPLE__ */ vmovdqa (%rsi), %xmm4 vmovdqa (%rdx), %xmm5 - vmovdqu (%rdi), %xmm8 - vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm8, %xmm8 - vpxor %xmm8, %xmm4, %xmm4 + vmovdqu (%rdi), %xmm7 + vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm7, %xmm7 + vpxor %xmm7, %xmm4, %xmm4 # ghash_gfmul_avx vpshufd $0x4e, %xmm4, %xmm1 vpshufd $0x4e, %xmm5, %xmm2 @@ -10654,14 +10654,14 @@ vmovdqa (%rdi), %xmm4 vmovdqa (%r9), %xmm5 vmovdqa (%r8), %xmm6 - vpsrlq $63, %xmm5, %xmm9 - vpsllq $0x01, %xmm5, %xmm8 - vpslldq $8, %xmm9, %xmm9 - vpor %xmm9, %xmm8, %xmm8 + vpsrlq $63, %xmm5, %xmm8 + vpsllq $0x01, %xmm5, %xmm7 + vpslldq $8, %xmm8, %xmm8 + vpor %xmm8, %xmm7, %xmm7 vpshufd $0xff, %xmm5, %xmm5 vpsrad $31, %xmm5, %xmm5 vpand L_avx1_aes_gcm_mod2_128(%rip), %xmm5, %xmm5 - vpxor %xmm8, %xmm5, %xmm5 + vpxor %xmm7, %xmm5, %xmm5 movl %r10d, %edx movl %r11d, %ecx shlq $3, %rdx @@ -10671,35 +10671,35 @@ vpunpcklqdq %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm4, %xmm4 # ghash_gfmul_red_avx - vpshufd $0x4e, %xmm5, %xmm9 - vpshufd $0x4e, %xmm4, %xmm10 - vpclmulqdq $0x11, %xmm5, %xmm4, %xmm11 - vpclmulqdq $0x00, %xmm5, %xmm4, %xmm8 - vpxor %xmm5, %xmm9, %xmm9 - vpxor %xmm4, %xmm10, %xmm10 - vpclmulqdq $0x00, %xmm10, %xmm9, %xmm9 - vpxor %xmm8, %xmm9, %xmm9 - vpxor %xmm11, %xmm9, %xmm9 - vpslldq $8, %xmm9, %xmm10 - vpsrldq $8, %xmm9, %xmm9 + vpshufd $0x4e, %xmm5, %xmm8 + vpshufd $0x4e, %xmm4, %xmm9 + vpclmulqdq $0x11, %xmm5, %xmm4, %xmm10 + vpclmulqdq $0x00, %xmm5, %xmm4, %xmm7 + vpxor %xmm5, %xmm8, %xmm8 + vpxor %xmm4, %xmm9, %xmm9 + vpclmulqdq $0x00, %xmm9, %xmm8, %xmm8 + vpxor %xmm7, %xmm8, %xmm8 vpxor %xmm10, %xmm8, %xmm8 - vpxor %xmm9, %xmm11, %xmm4 - vpslld $31, %xmm8, %xmm12 - vpslld $30, %xmm8, %xmm13 - vpslld $25, %xmm8, %xmm14 - vpxor %xmm13, %xmm12, %xmm12 - vpxor %xmm14, %xmm12, %xmm12 - vpsrldq $4, %xmm12, %xmm13 - vpslldq $12, %xmm12, %xmm12 - vpxor %xmm12, %xmm8, %xmm8 - vpsrld $0x01, %xmm8, %xmm14 - vpsrld $2, %xmm8, %xmm10 - vpsrld $7, %xmm8, %xmm9 - vpxor %xmm10, %xmm14, %xmm14 - vpxor %xmm9, %xmm14, %xmm14 - vpxor %xmm13, %xmm14, %xmm14 - vpxor %xmm8, %xmm14, %xmm14 - vpxor %xmm14, %xmm4, %xmm4 + vpslldq $8, %xmm8, %xmm9 + vpsrldq $8, %xmm8, %xmm8 + vpxor %xmm9, %xmm7, %xmm7 + vpxor %xmm8, %xmm10, %xmm4 + vpslld $31, %xmm7, %xmm11 + vpslld $30, %xmm7, %xmm12 + vpslld $25, %xmm7, %xmm13 + vpxor %xmm12, %xmm11, %xmm11 + vpxor %xmm13, %xmm11, %xmm11 + vpsrldq $4, %xmm11, %xmm12 + vpslldq $12, %xmm11, %xmm11 + vpxor %xmm11, %xmm7, %xmm7 + vpsrld $0x01, %xmm7, %xmm13 + vpsrld $2, %xmm7, %xmm9 + vpsrld $7, %xmm7, %xmm8 + vpxor %xmm9, %xmm13, %xmm13 + vpxor %xmm8, %xmm13, %xmm13 + vpxor %xmm12, %xmm13, %xmm13 + vpxor %xmm7, %xmm13, %xmm13 + vpxor %xmm13, %xmm4, %xmm4 vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm4, %xmm4 vpxor %xmm6, %xmm4, %xmm0 cmpl $16, %eax @@ -11356,14 +11356,14 @@ vmovdqa (%rdi), %xmm6 vmovdqa (%r9), %xmm5 vmovdqa (%r8), %xmm15 - vpsrlq $63, %xmm5, %xmm9 - vpsllq $0x01, %xmm5, %xmm8 - vpslldq $8, %xmm9, %xmm9 - vpor %xmm9, %xmm8, %xmm8 + vpsrlq $63, %xmm5, %xmm8 + vpsllq $0x01, %xmm5, %xmm7 + vpslldq $8, %xmm8, %xmm8 + vpor %xmm8, %xmm7, %xmm7 vpshufd $0xff, %xmm5, %xmm5 vpsrad $31, %xmm5, %xmm5 vpand L_avx1_aes_gcm_mod2_128(%rip), %xmm5, %xmm5 - vpxor %xmm8, %xmm5, %xmm5 + vpxor %xmm7, %xmm5, %xmm5 movl %r10d, %edx movl %r11d, %ecx shlq $3, %rdx @@ -11373,35 +11373,35 @@ vpunpcklqdq %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm6, %xmm6 # ghash_gfmul_red_avx - vpshufd $0x4e, %xmm5, %xmm9 - vpshufd $0x4e, %xmm6, %xmm10 - vpclmulqdq $0x11, %xmm5, %xmm6, %xmm11 - vpclmulqdq $0x00, %xmm5, %xmm6, %xmm8 - vpxor %xmm5, %xmm9, %xmm9 - vpxor %xmm6, %xmm10, %xmm10 - vpclmulqdq $0x00, %xmm10, %xmm9, %xmm9 - vpxor %xmm8, %xmm9, %xmm9 - vpxor %xmm11, %xmm9, %xmm9 - vpslldq $8, %xmm9, %xmm10 - vpsrldq $8, %xmm9, %xmm9 + vpshufd $0x4e, %xmm5, %xmm8 + vpshufd $0x4e, %xmm6, %xmm9 + vpclmulqdq $0x11, %xmm5, %xmm6, %xmm10 + vpclmulqdq $0x00, %xmm5, %xmm6, %xmm7 + vpxor %xmm5, %xmm8, %xmm8 + vpxor %xmm6, %xmm9, %xmm9 + vpclmulqdq $0x00, %xmm9, %xmm8, %xmm8 + vpxor %xmm7, %xmm8, %xmm8 vpxor %xmm10, %xmm8, %xmm8 - vpxor %xmm9, %xmm11, %xmm6 - vpslld $31, %xmm8, %xmm12 - vpslld $30, %xmm8, %xmm13 - vpslld $25, %xmm8, %xmm14 - vpxor %xmm13, %xmm12, %xmm12 - vpxor %xmm14, %xmm12, %xmm12 - vpsrldq $4, %xmm12, %xmm13 - vpslldq $12, %xmm12, %xmm12 - vpxor %xmm12, %xmm8, %xmm8 - vpsrld $0x01, %xmm8, %xmm14 - vpsrld $2, %xmm8, %xmm10 - vpsrld $7, %xmm8, %xmm9 - vpxor %xmm10, %xmm14, %xmm14 - vpxor %xmm9, %xmm14, %xmm14 - vpxor %xmm13, %xmm14, %xmm14 - vpxor %xmm8, %xmm14, %xmm14 - vpxor %xmm14, %xmm6, %xmm6 + vpslldq $8, %xmm8, %xmm9 + vpsrldq $8, %xmm8, %xmm8 + vpxor %xmm9, %xmm7, %xmm7 + vpxor %xmm8, %xmm10, %xmm6 + vpslld $31, %xmm7, %xmm11 + vpslld $30, %xmm7, %xmm12 + vpslld $25, %xmm7, %xmm13 + vpxor %xmm12, %xmm11, %xmm11 + vpxor %xmm13, %xmm11, %xmm11 + vpsrldq $4, %xmm11, %xmm12 + vpslldq $12, %xmm11, %xmm11 + vpxor %xmm11, %xmm7, %xmm7 + vpsrld $0x01, %xmm7, %xmm13 + vpsrld $2, %xmm7, %xmm9 + vpsrld $7, %xmm7, %xmm8 + vpxor %xmm9, %xmm13, %xmm13 + vpxor %xmm8, %xmm13, %xmm13 + vpxor %xmm12, %xmm13, %xmm13 + vpxor %xmm7, %xmm13, %xmm13 + vpxor %xmm13, %xmm6, %xmm6 vpshufb L_avx1_aes_gcm_bswap_mask(%rip), %xmm6, %xmm6 vpxor %xmm15, %xmm6, %xmm0 cmpl $16, %eax diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.asm mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.asm --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.asm 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_asm.asm 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -; /* aes_gcm_asm -; * -; * Copyright (C) 2006-2023 wolfSSL Inc. +; /* aes_gcm_asm.asm */ +; /* +; * Copyright (C) 2006-2024 wolfSSL Inc. ; * ; * This file is part of wolfSSL. ; * @@ -96,7 +96,7 @@ ptr_L_aes_gcm_mod2_128 QWORD L_aes_gcm_mod2_128 _DATA ENDS _text SEGMENT READONLY PARA -AES_GCM_encrypt PROC +AES_GCM_encrypt_aesni PROC push r13 push rdi push rsi @@ -115,12 +115,22 @@ mov r14d, DWORD PTR [rsp+128] mov r15, QWORD PTR [rsp+136] mov r10d, DWORD PTR [rsp+144] - sub rsp, 160 + sub rsp, 320 + movdqu OWORD PTR [rsp+160], xmm6 + movdqu OWORD PTR [rsp+176], xmm7 + movdqu OWORD PTR [rsp+192], xmm8 + movdqu OWORD PTR [rsp+208], xmm9 + movdqu OWORD PTR [rsp+224], xmm10 + movdqu OWORD PTR [rsp+240], xmm11 + movdqu OWORD PTR [rsp+256], xmm12 + movdqu OWORD PTR [rsp+272], xmm13 + movdqu OWORD PTR [rsp+288], xmm14 + movdqu OWORD PTR [rsp+304], xmm15 pxor xmm4, xmm4 pxor xmm6, xmm6 cmp ebx, 12 mov edx, ebx - jne L_AES_GCM_encrypt_iv_not_12 + jne L_AES_GCM_encrypt_aesni_iv_not_12 ; # Calculate values when IV is 12 bytes ; Set counter based on IV mov ecx, 16777216 @@ -160,7 +170,7 @@ aesenc xmm1, xmm7 cmp r10d, 11 movdqa xmm7, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_calc_iv_12_last + jl L_AES_GCM_encrypt_aesni_calc_iv_12_last aesenc xmm5, xmm7 aesenc xmm1, xmm7 movdqa xmm7, OWORD PTR [r15+176] @@ -168,20 +178,20 @@ aesenc xmm1, xmm7 cmp r10d, 13 movdqa xmm7, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_calc_iv_12_last + jl L_AES_GCM_encrypt_aesni_calc_iv_12_last aesenc xmm5, xmm7 aesenc xmm1, xmm7 movdqa xmm7, OWORD PTR [r15+208] aesenc xmm5, xmm7 aesenc xmm1, xmm7 movdqa xmm7, OWORD PTR [r15+224] -L_AES_GCM_encrypt_calc_iv_12_last: +L_AES_GCM_encrypt_aesni_calc_iv_12_last: aesenclast xmm5, xmm7 aesenclast xmm1, xmm7 pshufb xmm5, OWORD PTR L_aes_gcm_bswap_mask - movdqu [rsp+144], xmm1 - jmp L_AES_GCM_encrypt_iv_done -L_AES_GCM_encrypt_iv_not_12: + movdqu OWORD PTR [rsp+144], xmm1 + jmp L_AES_GCM_encrypt_aesni_iv_done +L_AES_GCM_encrypt_aesni_iv_not_12: ; Calculate values when IV is not 12 bytes ; H = Encrypt X(=0) movdqa xmm5, OWORD PTR [r15] @@ -196,28 +206,28 @@ aesenc xmm5, [r15+144] cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last aesenc xmm5, xmm9 aesenc xmm5, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last aesenc xmm5, xmm9 aesenc xmm5, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last: aesenclast xmm5, xmm9 pshufb xmm5, OWORD PTR L_aes_gcm_bswap_mask ; Calc counter ; Initialization vector cmp edx, 0 mov rcx, 0 - je L_AES_GCM_encrypt_calc_iv_done + je L_AES_GCM_encrypt_aesni_calc_iv_done cmp edx, 16 - jl L_AES_GCM_encrypt_calc_iv_lt16 + jl L_AES_GCM_encrypt_aesni_calc_iv_lt16 and edx, 4294967280 -L_AES_GCM_encrypt_calc_iv_16_loop: - movdqu xmm8, [rax+rcx] +L_AES_GCM_encrypt_aesni_calc_iv_16_loop: + movdqu xmm8, OWORD PTR [rax+rcx] pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm4, xmm8 pshufd xmm1, xmm4, 78 @@ -276,23 +286,23 @@ pxor xmm4, xmm2 add ecx, 16 cmp ecx, edx - jl L_AES_GCM_encrypt_calc_iv_16_loop + jl L_AES_GCM_encrypt_aesni_calc_iv_16_loop mov edx, ebx cmp ecx, edx - je L_AES_GCM_encrypt_calc_iv_done -L_AES_GCM_encrypt_calc_iv_lt16: + je L_AES_GCM_encrypt_aesni_calc_iv_done +L_AES_GCM_encrypt_aesni_calc_iv_lt16: sub rsp, 16 pxor xmm8, xmm8 xor ebx, ebx - movdqu [rsp], xmm8 -L_AES_GCM_encrypt_calc_iv_loop: + movdqu OWORD PTR [rsp], xmm8 +L_AES_GCM_encrypt_aesni_calc_iv_loop: movzx r13d, BYTE PTR [rax+rcx] mov BYTE PTR [rsp+rbx], r13b inc ecx inc ebx cmp ecx, edx - jl L_AES_GCM_encrypt_calc_iv_loop - movdqu xmm8, [rsp] + jl L_AES_GCM_encrypt_aesni_calc_iv_loop + movdqu xmm8, OWORD PTR [rsp] add rsp, 16 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm4, xmm8 @@ -350,7 +360,7 @@ pxor xmm2, xmm1 pxor xmm2, xmm7 pxor xmm4, xmm2 -L_AES_GCM_encrypt_calc_iv_done: +L_AES_GCM_encrypt_aesni_calc_iv_done: ; T = Encrypt counter pxor xmm0, xmm0 shl edx, 3 @@ -425,29 +435,29 @@ aesenc xmm8, [r15+144] cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last aesenc xmm8, xmm9 aesenc xmm8, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last aesenc xmm8, xmm9 aesenc xmm8, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last: aesenclast xmm8, xmm9 - movdqu [rsp+144], xmm8 -L_AES_GCM_encrypt_iv_done: + movdqu OWORD PTR [rsp+144], xmm8 +L_AES_GCM_encrypt_aesni_iv_done: ; Additional authentication data mov edx, r11d cmp edx, 0 - je L_AES_GCM_encrypt_calc_aad_done + je L_AES_GCM_encrypt_aesni_calc_aad_done xor ecx, ecx cmp edx, 16 - jl L_AES_GCM_encrypt_calc_aad_lt16 + jl L_AES_GCM_encrypt_aesni_calc_aad_lt16 and edx, 4294967280 -L_AES_GCM_encrypt_calc_aad_16_loop: - movdqu xmm8, [r12+rcx] +L_AES_GCM_encrypt_aesni_calc_aad_16_loop: + movdqu xmm8, OWORD PTR [r12+rcx] pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 pshufd xmm1, xmm6, 78 @@ -506,23 +516,23 @@ pxor xmm6, xmm2 add ecx, 16 cmp ecx, edx - jl L_AES_GCM_encrypt_calc_aad_16_loop + jl L_AES_GCM_encrypt_aesni_calc_aad_16_loop mov edx, r11d cmp ecx, edx - je L_AES_GCM_encrypt_calc_aad_done -L_AES_GCM_encrypt_calc_aad_lt16: + je L_AES_GCM_encrypt_aesni_calc_aad_done +L_AES_GCM_encrypt_aesni_calc_aad_lt16: sub rsp, 16 pxor xmm8, xmm8 xor ebx, ebx - movdqu [rsp], xmm8 -L_AES_GCM_encrypt_calc_aad_loop: + movdqu OWORD PTR [rsp], xmm8 +L_AES_GCM_encrypt_aesni_calc_aad_loop: movzx r13d, BYTE PTR [r12+rcx] mov BYTE PTR [rsp+rbx], r13b inc ecx inc ebx cmp ecx, edx - jl L_AES_GCM_encrypt_calc_aad_loop - movdqu xmm8, [rsp] + jl L_AES_GCM_encrypt_aesni_calc_aad_loop + movdqu xmm8, OWORD PTR [rsp] add rsp, 16 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 @@ -580,13 +590,13 @@ pxor xmm2, xmm1 pxor xmm2, xmm7 pxor xmm6, xmm2 -L_AES_GCM_encrypt_calc_aad_done: +L_AES_GCM_encrypt_aesni_calc_aad_done: ; Calculate counter and H pshufb xmm4, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm9, xmm5 paddd xmm4, OWORD PTR L_aes_gcm_one movdqa xmm8, xmm5 - movdqu [rsp+128], xmm4 + movdqu OWORD PTR [rsp+128], xmm4 psrlq xmm9, 63 psllq xmm8, 1 pslldq xmm9, 8 @@ -598,11 +608,11 @@ xor rbx, rbx cmp r9d, 128 mov r13d, r9d - jl L_AES_GCM_encrypt_done_128 + jl L_AES_GCM_encrypt_aesni_done_128 and r13d, 4294967168 movdqa xmm2, xmm6 ; H ^ 1 - movdqu [rsp], xmm5 + movdqu OWORD PTR [rsp], xmm5 ; H ^ 2 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm5, 78 @@ -644,7 +654,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm0, xmm14 - movdqu [rsp+16], xmm0 + movdqu OWORD PTR [rsp+16], xmm0 ; H ^ 3 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm0, 78 @@ -686,7 +696,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm1, xmm14 - movdqu [rsp+32], xmm1 + movdqu OWORD PTR [rsp+32], xmm1 ; H ^ 4 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm0, 78 @@ -728,7 +738,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm3, xmm14 - movdqu [rsp+48], xmm3 + movdqu OWORD PTR [rsp+48], xmm3 ; H ^ 5 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm1, 78 @@ -770,7 +780,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+64], xmm7 + movdqu OWORD PTR [rsp+64], xmm7 ; H ^ 6 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm1, 78 @@ -812,7 +822,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+80], xmm7 + movdqu OWORD PTR [rsp+80], xmm7 ; H ^ 7 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm3, 78 @@ -854,7 +864,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+96], xmm7 + movdqu OWORD PTR [rsp+96], xmm7 ; H ^ 8 pshufd xmm9, xmm3, 78 pshufd xmm10, xmm3, 78 @@ -896,9 +906,9 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+112], xmm7 + movdqu OWORD PTR [rsp+112], xmm7 ; First 128 bytes of input - movdqu xmm8, [rsp+128] + movdqu xmm8, OWORD PTR [rsp+128] movdqa xmm1, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm0, xmm8 pshufb xmm8, xmm1 @@ -925,7 +935,7 @@ pshufb xmm15, xmm1 paddd xmm0, OWORD PTR L_aes_gcm_eight movdqa xmm7, OWORD PTR [r15] - movdqu [rsp+128], xmm0 + movdqu OWORD PTR [rsp+128], xmm0 pxor xmm8, xmm7 pxor xmm9, xmm7 pxor xmm10, xmm7 @@ -1017,7 +1027,7 @@ aesenc xmm15, xmm7 cmp r10d, 11 movdqa xmm7, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_enc_done + jl L_AES_GCM_encrypt_aesni_enc_done aesenc xmm8, xmm7 aesenc xmm9, xmm7 aesenc xmm10, xmm7 @@ -1037,7 +1047,7 @@ aesenc xmm15, xmm7 cmp r10d, 13 movdqa xmm7, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_enc_done + jl L_AES_GCM_encrypt_aesni_enc_done aesenc xmm8, xmm7 aesenc xmm9, xmm7 aesenc xmm10, xmm7 @@ -1056,47 +1066,47 @@ aesenc xmm14, xmm7 aesenc xmm15, xmm7 movdqa xmm7, OWORD PTR [r15+224] -L_AES_GCM_encrypt_enc_done: +L_AES_GCM_encrypt_aesni_enc_done: aesenclast xmm8, xmm7 aesenclast xmm9, xmm7 - movdqu xmm0, [rdi] - movdqu xmm1, [rdi+16] + movdqu xmm0, OWORD PTR [rdi] + movdqu xmm1, OWORD PTR [rdi+16] pxor xmm8, xmm0 pxor xmm9, xmm1 - movdqu [rsi], xmm8 - movdqu [rsi+16], xmm9 + movdqu OWORD PTR [rsi], xmm8 + movdqu OWORD PTR [rsi+16], xmm9 aesenclast xmm10, xmm7 aesenclast xmm11, xmm7 - movdqu xmm0, [rdi+32] - movdqu xmm1, [rdi+48] + movdqu xmm0, OWORD PTR [rdi+32] + movdqu xmm1, OWORD PTR [rdi+48] pxor xmm10, xmm0 pxor xmm11, xmm1 - movdqu [rsi+32], xmm10 - movdqu [rsi+48], xmm11 + movdqu OWORD PTR [rsi+32], xmm10 + movdqu OWORD PTR [rsi+48], xmm11 aesenclast xmm12, xmm7 aesenclast xmm13, xmm7 - movdqu xmm0, [rdi+64] - movdqu xmm1, [rdi+80] + movdqu xmm0, OWORD PTR [rdi+64] + movdqu xmm1, OWORD PTR [rdi+80] pxor xmm12, xmm0 pxor xmm13, xmm1 - movdqu [rsi+64], xmm12 - movdqu [rsi+80], xmm13 + movdqu OWORD PTR [rsi+64], xmm12 + movdqu OWORD PTR [rsi+80], xmm13 aesenclast xmm14, xmm7 aesenclast xmm15, xmm7 - movdqu xmm0, [rdi+96] - movdqu xmm1, [rdi+112] + movdqu xmm0, OWORD PTR [rdi+96] + movdqu xmm1, OWORD PTR [rdi+112] pxor xmm14, xmm0 pxor xmm15, xmm1 - movdqu [rsi+96], xmm14 - movdqu [rsi+112], xmm15 + movdqu OWORD PTR [rsi+96], xmm14 + movdqu OWORD PTR [rsi+112], xmm15 cmp r13d, 128 mov ebx, 128 - jle L_AES_GCM_encrypt_end_128 + jle L_AES_GCM_encrypt_aesni_end_128 ; More 128 bytes of input -L_AES_GCM_encrypt_ghash_128: +L_AES_GCM_encrypt_aesni_ghash_128: lea rcx, QWORD PTR [rdi+rbx] lea rdx, QWORD PTR [rsi+rbx] - movdqu xmm8, [rsp+128] + movdqu xmm8, OWORD PTR [rsp+128] movdqa xmm1, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm0, xmm8 pshufb xmm8, xmm1 @@ -1123,7 +1133,7 @@ pshufb xmm15, xmm1 paddd xmm0, OWORD PTR L_aes_gcm_eight movdqa xmm7, OWORD PTR [r15] - movdqu [rsp+128], xmm0 + movdqu OWORD PTR [rsp+128], xmm0 pxor xmm8, xmm7 pxor xmm9, xmm7 pxor xmm10, xmm7 @@ -1132,8 +1142,8 @@ pxor xmm13, xmm7 pxor xmm14, xmm7 pxor xmm15, xmm7 - movdqu xmm7, [rsp+112] - movdqu xmm0, [rdx+-128] + movdqu xmm7, OWORD PTR [rsp+112] + movdqu xmm0, OWORD PTR [rdx+-128] aesenc xmm8, [r15+16] pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask pxor xmm0, xmm2 @@ -1155,8 +1165,8 @@ aesenc xmm15, [r15+16] pxor xmm1, xmm2 pxor xmm1, xmm3 - movdqu xmm7, [rsp+96] - movdqu xmm0, [rdx+-112] + movdqu xmm7, OWORD PTR [rsp+96] + movdqu xmm0, OWORD PTR [rdx+-112] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+32] @@ -1179,8 +1189,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+80] - movdqu xmm0, [rdx+-96] + movdqu xmm7, OWORD PTR [rsp+80] + movdqu xmm0, OWORD PTR [rdx+-96] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+48] @@ -1203,8 +1213,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+64] - movdqu xmm0, [rdx+-80] + movdqu xmm7, OWORD PTR [rsp+64] + movdqu xmm0, OWORD PTR [rdx+-80] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+64] @@ -1227,8 +1237,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+48] - movdqu xmm0, [rdx+-64] + movdqu xmm7, OWORD PTR [rsp+48] + movdqu xmm0, OWORD PTR [rdx+-64] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+80] @@ -1251,8 +1261,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+32] - movdqu xmm0, [rdx+-48] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm0, OWORD PTR [rdx+-48] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+96] @@ -1275,8 +1285,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+16] - movdqu xmm0, [rdx+-32] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm0, OWORD PTR [rdx+-32] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+112] @@ -1299,8 +1309,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp] - movdqu xmm0, [rdx+-16] + movdqu xmm7, OWORD PTR [rsp] + movdqu xmm0, OWORD PTR [rdx+-16] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+128] @@ -1361,7 +1371,7 @@ pxor xmm2, xmm3 cmp r10d, 11 movdqa xmm7, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_encrypt_aesni_aesenc_128_ghash_avx_done aesenc xmm8, xmm7 aesenc xmm9, xmm7 aesenc xmm10, xmm7 @@ -1381,7 +1391,7 @@ aesenc xmm15, xmm7 cmp r10d, 13 movdqa xmm7, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_encrypt_aesni_aesenc_128_ghash_avx_done aesenc xmm8, xmm7 aesenc xmm9, xmm7 aesenc xmm10, xmm7 @@ -1400,43 +1410,43 @@ aesenc xmm14, xmm7 aesenc xmm15, xmm7 movdqa xmm7, OWORD PTR [r15+224] -L_AES_GCM_encrypt_aesenc_128_ghash_avx_done: +L_AES_GCM_encrypt_aesni_aesenc_128_ghash_avx_done: aesenclast xmm8, xmm7 aesenclast xmm9, xmm7 - movdqu xmm0, [rcx] - movdqu xmm1, [rcx+16] + movdqu xmm0, OWORD PTR [rcx] + movdqu xmm1, OWORD PTR [rcx+16] pxor xmm8, xmm0 pxor xmm9, xmm1 - movdqu [rdx], xmm8 - movdqu [rdx+16], xmm9 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 aesenclast xmm10, xmm7 aesenclast xmm11, xmm7 - movdqu xmm0, [rcx+32] - movdqu xmm1, [rcx+48] + movdqu xmm0, OWORD PTR [rcx+32] + movdqu xmm1, OWORD PTR [rcx+48] pxor xmm10, xmm0 pxor xmm11, xmm1 - movdqu [rdx+32], xmm10 - movdqu [rdx+48], xmm11 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 aesenclast xmm12, xmm7 aesenclast xmm13, xmm7 - movdqu xmm0, [rcx+64] - movdqu xmm1, [rcx+80] + movdqu xmm0, OWORD PTR [rcx+64] + movdqu xmm1, OWORD PTR [rcx+80] pxor xmm12, xmm0 pxor xmm13, xmm1 - movdqu [rdx+64], xmm12 - movdqu [rdx+80], xmm13 + movdqu OWORD PTR [rdx+64], xmm12 + movdqu OWORD PTR [rdx+80], xmm13 aesenclast xmm14, xmm7 aesenclast xmm15, xmm7 - movdqu xmm0, [rcx+96] - movdqu xmm1, [rcx+112] + movdqu xmm0, OWORD PTR [rcx+96] + movdqu xmm1, OWORD PTR [rcx+112] pxor xmm14, xmm0 pxor xmm15, xmm1 - movdqu [rdx+96], xmm14 - movdqu [rdx+112], xmm15 + movdqu OWORD PTR [rdx+96], xmm14 + movdqu OWORD PTR [rdx+112], xmm15 add ebx, 128 cmp ebx, r13d - jl L_AES_GCM_encrypt_ghash_128 -L_AES_GCM_encrypt_end_128: + jl L_AES_GCM_encrypt_aesni_ghash_128 +L_AES_GCM_encrypt_aesni_end_128: movdqa xmm4, OWORD PTR L_aes_gcm_bswap_mask pshufb xmm8, xmm4 pshufb xmm9, xmm4 @@ -1447,7 +1457,7 @@ pshufb xmm13, xmm4 pshufb xmm14, xmm4 pshufb xmm15, xmm4 - movdqu xmm7, [rsp+112] + movdqu xmm7, OWORD PTR [rsp+112] pshufd xmm1, xmm8, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1466,7 +1476,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+96] + movdqu xmm7, OWORD PTR [rsp+96] pshufd xmm1, xmm9, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1485,7 +1495,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+80] + movdqu xmm7, OWORD PTR [rsp+80] pshufd xmm1, xmm10, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1504,7 +1514,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+64] + movdqu xmm7, OWORD PTR [rsp+64] pshufd xmm1, xmm11, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1523,7 +1533,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+48] + movdqu xmm7, OWORD PTR [rsp+48] pshufd xmm1, xmm12, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1542,7 +1552,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+32] + movdqu xmm7, OWORD PTR [rsp+32] pshufd xmm1, xmm13, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1561,7 +1571,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+16] + movdqu xmm7, OWORD PTR [rsp+16] pshufd xmm1, xmm14, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1580,7 +1590,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp] + movdqu xmm7, OWORD PTR [rsp] pshufd xmm1, xmm15, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -1622,23 +1632,23 @@ pxor xmm2, xmm1 pxor xmm2, xmm4 pxor xmm6, xmm2 - movdqu xmm5, [rsp] -L_AES_GCM_encrypt_done_128: + movdqu xmm5, OWORD PTR [rsp] +L_AES_GCM_encrypt_aesni_done_128: mov edx, r9d cmp ebx, edx - jge L_AES_GCM_encrypt_done_enc + jge L_AES_GCM_encrypt_aesni_done_enc mov r13d, r9d and r13d, 4294967280 cmp ebx, r13d - jge L_AES_GCM_encrypt_last_block_done + jge L_AES_GCM_encrypt_aesni_last_block_done lea rcx, QWORD PTR [rdi+rbx] lea rdx, QWORD PTR [rsi+rbx] - movdqu xmm8, [rsp+128] + movdqu xmm8, OWORD PTR [rsp+128] movdqa xmm9, xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_epi64 paddd xmm9, OWORD PTR L_aes_gcm_one pxor xmm8, [r15] - movdqu [rsp+128], xmm9 + movdqu OWORD PTR [rsp+128], xmm9 aesenc xmm8, [r15+16] aesenc xmm8, [r15+32] aesenc xmm8, [r15+48] @@ -1650,34 +1660,34 @@ aesenc xmm8, [r15+144] cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last aesenc xmm8, xmm9 aesenc xmm8, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last aesenc xmm8, xmm9 aesenc xmm8, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last: aesenclast xmm8, xmm9 - movdqu xmm9, [rcx] + movdqu xmm9, OWORD PTR [rcx] pxor xmm8, xmm9 - movdqu [rdx], xmm8 + movdqu OWORD PTR [rdx], xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 add ebx, 16 cmp ebx, r13d - jge L_AES_GCM_encrypt_last_block_ghash -L_AES_GCM_encrypt_last_block_start: + jge L_AES_GCM_encrypt_aesni_last_block_ghash +L_AES_GCM_encrypt_aesni_last_block_start: lea rcx, QWORD PTR [rdi+rbx] lea rdx, QWORD PTR [rsi+rbx] - movdqu xmm8, [rsp+128] + movdqu xmm8, OWORD PTR [rsp+128] movdqa xmm9, xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_epi64 paddd xmm9, OWORD PTR L_aes_gcm_one pxor xmm8, [r15] - movdqu [rsp+128], xmm9 + movdqu OWORD PTR [rsp+128], xmm9 movdqa xmm10, xmm6 pclmulqdq xmm10, xmm5, 16 aesenc xmm8, [r15+16] @@ -1714,26 +1724,26 @@ pxor xmm6, xmm3 cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_aesenc_gfmul_last + jl L_AES_GCM_encrypt_aesni_aesenc_gfmul_last aesenc xmm8, xmm9 aesenc xmm8, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_aesenc_gfmul_last + jl L_AES_GCM_encrypt_aesni_aesenc_gfmul_last aesenc xmm8, xmm9 aesenc xmm8, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_encrypt_aesenc_gfmul_last: +L_AES_GCM_encrypt_aesni_aesenc_gfmul_last: aesenclast xmm8, xmm9 - movdqu xmm9, [rcx] + movdqu xmm9, OWORD PTR [rcx] pxor xmm8, xmm9 - movdqu [rdx], xmm8 + movdqu OWORD PTR [rdx], xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 add ebx, 16 cmp ebx, r13d - jl L_AES_GCM_encrypt_last_block_start -L_AES_GCM_encrypt_last_block_ghash: + jl L_AES_GCM_encrypt_aesni_last_block_start +L_AES_GCM_encrypt_aesni_last_block_ghash: pshufd xmm9, xmm5, 78 pshufd xmm10, xmm6, 78 movdqa xmm11, xmm6 @@ -1774,12 +1784,12 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm6, xmm14 -L_AES_GCM_encrypt_last_block_done: +L_AES_GCM_encrypt_aesni_last_block_done: mov ecx, r9d mov edx, ecx and ecx, 15 - jz L_AES_GCM_encrypt_aesenc_last15_enc_avx_done - movdqu xmm4, [rsp+128] + jz L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_done + movdqu xmm4, OWORD PTR [rsp+128] pshufb xmm4, OWORD PTR L_aes_gcm_bswap_epi64 pxor xmm4, [r15] aesenc xmm4, [r15+16] @@ -1793,21 +1803,21 @@ aesenc xmm4, [r15+144] cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last aesenc xmm4, xmm9 aesenc xmm4, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last aesenc xmm4, xmm9 aesenc xmm4, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last: aesenclast xmm4, xmm9 sub rsp, 16 xor ecx, ecx - movdqu [rsp], xmm4 -L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop: + movdqu OWORD PTR [rsp], xmm4 +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_loop: movzx r13d, BYTE PTR [rdi+rbx] xor r13b, BYTE PTR [rsp+rcx] mov BYTE PTR [rsi+rbx], r13b @@ -1815,17 +1825,17 @@ inc ebx inc ecx cmp ebx, edx - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_loop xor r13, r13 cmp ecx, 16 - je L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc -L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop: + je L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_finish_enc +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_byte_loop: mov BYTE PTR [rsp+rcx], r13b inc ecx cmp ecx, 16 - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop -L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc: - movdqu xmm4, [rsp] + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_byte_loop +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_finish_enc: + movdqu xmm4, OWORD PTR [rsp] add rsp, 16 pshufb xmm4, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm4 @@ -1869,8 +1879,8 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm6, xmm14 -L_AES_GCM_encrypt_aesenc_last15_enc_avx_done: -L_AES_GCM_encrypt_done_enc: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_done: +L_AES_GCM_encrypt_aesni_done_enc: mov edx, r9d mov ecx, r11d shl rdx, 3 @@ -1919,23 +1929,33 @@ pxor xmm14, xmm8 pxor xmm6, xmm14 pshufb xmm6, OWORD PTR L_aes_gcm_bswap_mask - movdqu xmm0, [rsp+144] + movdqu xmm0, OWORD PTR [rsp+144] pxor xmm0, xmm6 cmp r14d, 16 - je L_AES_GCM_encrypt_store_tag_16 + je L_AES_GCM_encrypt_aesni_store_tag_16 xor rcx, rcx - movdqu [rsp], xmm0 -L_AES_GCM_encrypt_store_tag_loop: + movdqu OWORD PTR [rsp], xmm0 +L_AES_GCM_encrypt_aesni_store_tag_loop: movzx r13d, BYTE PTR [rsp+rcx] mov BYTE PTR [r8+rcx], r13b inc ecx cmp ecx, r14d - jne L_AES_GCM_encrypt_store_tag_loop - jmp L_AES_GCM_encrypt_store_tag_done -L_AES_GCM_encrypt_store_tag_16: - movdqu [r8], xmm0 -L_AES_GCM_encrypt_store_tag_done: - add rsp, 160 + jne L_AES_GCM_encrypt_aesni_store_tag_loop + jmp L_AES_GCM_encrypt_aesni_store_tag_done +L_AES_GCM_encrypt_aesni_store_tag_16: + movdqu OWORD PTR [r8], xmm0 +L_AES_GCM_encrypt_aesni_store_tag_done: + movdqu xmm6, OWORD PTR [rsp+160] + movdqu xmm7, OWORD PTR [rsp+176] + movdqu xmm8, OWORD PTR [rsp+192] + movdqu xmm9, OWORD PTR [rsp+208] + movdqu xmm10, OWORD PTR [rsp+224] + movdqu xmm11, OWORD PTR [rsp+240] + movdqu xmm12, OWORD PTR [rsp+256] + movdqu xmm13, OWORD PTR [rsp+272] + movdqu xmm14, OWORD PTR [rsp+288] + movdqu xmm15, OWORD PTR [rsp+304] + add rsp, 320 pop r15 pop r14 pop rbx @@ -1944,10 +1964,10 @@ pop rdi pop r13 ret -AES_GCM_encrypt ENDP +AES_GCM_encrypt_aesni ENDP _text ENDS _text SEGMENT READONLY PARA -AES_GCM_decrypt PROC +AES_GCM_decrypt_aesni PROC push r13 push rdi push rsi @@ -1968,12 +1988,22 @@ mov r15, QWORD PTR [rsp+144] mov r10d, DWORD PTR [rsp+152] mov rbp, QWORD PTR [rsp+160] - sub rsp, 168 + sub rsp, 328 + movdqu OWORD PTR [rsp+168], xmm6 + movdqu OWORD PTR [rsp+184], xmm7 + movdqu OWORD PTR [rsp+200], xmm8 + movdqu OWORD PTR [rsp+216], xmm9 + movdqu OWORD PTR [rsp+232], xmm10 + movdqu OWORD PTR [rsp+248], xmm11 + movdqu OWORD PTR [rsp+264], xmm12 + movdqu OWORD PTR [rsp+280], xmm13 + movdqu OWORD PTR [rsp+296], xmm14 + movdqu OWORD PTR [rsp+312], xmm15 pxor xmm4, xmm4 pxor xmm6, xmm6 cmp ebx, 12 mov edx, ebx - jne L_AES_GCM_decrypt_iv_not_12 + jne L_AES_GCM_decrypt_aesni_iv_not_12 ; # Calculate values when IV is 12 bytes ; Set counter based on IV mov ecx, 16777216 @@ -2013,7 +2043,7 @@ aesenc xmm1, xmm7 cmp r10d, 11 movdqa xmm7, OWORD PTR [r15+160] - jl L_AES_GCM_decrypt_calc_iv_12_last + jl L_AES_GCM_decrypt_aesni_calc_iv_12_last aesenc xmm5, xmm7 aesenc xmm1, xmm7 movdqa xmm7, OWORD PTR [r15+176] @@ -2021,20 +2051,20 @@ aesenc xmm1, xmm7 cmp r10d, 13 movdqa xmm7, OWORD PTR [r15+192] - jl L_AES_GCM_decrypt_calc_iv_12_last + jl L_AES_GCM_decrypt_aesni_calc_iv_12_last aesenc xmm5, xmm7 aesenc xmm1, xmm7 movdqa xmm7, OWORD PTR [r15+208] aesenc xmm5, xmm7 aesenc xmm1, xmm7 movdqa xmm7, OWORD PTR [r15+224] -L_AES_GCM_decrypt_calc_iv_12_last: +L_AES_GCM_decrypt_aesni_calc_iv_12_last: aesenclast xmm5, xmm7 aesenclast xmm1, xmm7 pshufb xmm5, OWORD PTR L_aes_gcm_bswap_mask - movdqu [rsp+144], xmm1 - jmp L_AES_GCM_decrypt_iv_done -L_AES_GCM_decrypt_iv_not_12: + movdqu OWORD PTR [rsp+144], xmm1 + jmp L_AES_GCM_decrypt_aesni_iv_done +L_AES_GCM_decrypt_aesni_iv_not_12: ; Calculate values when IV is not 12 bytes ; H = Encrypt X(=0) movdqa xmm5, OWORD PTR [r15] @@ -2049,28 +2079,28 @@ aesenc xmm5, [r15+144] cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last aesenc xmm5, xmm9 aesenc xmm5, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last aesenc xmm5, xmm9 aesenc xmm5, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last: aesenclast xmm5, xmm9 pshufb xmm5, OWORD PTR L_aes_gcm_bswap_mask ; Calc counter ; Initialization vector cmp edx, 0 mov rcx, 0 - je L_AES_GCM_decrypt_calc_iv_done + je L_AES_GCM_decrypt_aesni_calc_iv_done cmp edx, 16 - jl L_AES_GCM_decrypt_calc_iv_lt16 + jl L_AES_GCM_decrypt_aesni_calc_iv_lt16 and edx, 4294967280 -L_AES_GCM_decrypt_calc_iv_16_loop: - movdqu xmm8, [rax+rcx] +L_AES_GCM_decrypt_aesni_calc_iv_16_loop: + movdqu xmm8, OWORD PTR [rax+rcx] pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm4, xmm8 pshufd xmm1, xmm4, 78 @@ -2129,23 +2159,23 @@ pxor xmm4, xmm2 add ecx, 16 cmp ecx, edx - jl L_AES_GCM_decrypt_calc_iv_16_loop + jl L_AES_GCM_decrypt_aesni_calc_iv_16_loop mov edx, ebx cmp ecx, edx - je L_AES_GCM_decrypt_calc_iv_done -L_AES_GCM_decrypt_calc_iv_lt16: + je L_AES_GCM_decrypt_aesni_calc_iv_done +L_AES_GCM_decrypt_aesni_calc_iv_lt16: sub rsp, 16 pxor xmm8, xmm8 xor ebx, ebx - movdqu [rsp], xmm8 -L_AES_GCM_decrypt_calc_iv_loop: + movdqu OWORD PTR [rsp], xmm8 +L_AES_GCM_decrypt_aesni_calc_iv_loop: movzx r13d, BYTE PTR [rax+rcx] mov BYTE PTR [rsp+rbx], r13b inc ecx inc ebx cmp ecx, edx - jl L_AES_GCM_decrypt_calc_iv_loop - movdqu xmm8, [rsp] + jl L_AES_GCM_decrypt_aesni_calc_iv_loop + movdqu xmm8, OWORD PTR [rsp] add rsp, 16 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm4, xmm8 @@ -2203,7 +2233,7 @@ pxor xmm2, xmm1 pxor xmm2, xmm7 pxor xmm4, xmm2 -L_AES_GCM_decrypt_calc_iv_done: +L_AES_GCM_decrypt_aesni_calc_iv_done: ; T = Encrypt counter pxor xmm0, xmm0 shl edx, 3 @@ -2278,29 +2308,29 @@ aesenc xmm8, [r15+144] cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last aesenc xmm8, xmm9 aesenc xmm8, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last aesenc xmm8, xmm9 aesenc xmm8, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last: aesenclast xmm8, xmm9 - movdqu [rsp+144], xmm8 -L_AES_GCM_decrypt_iv_done: + movdqu OWORD PTR [rsp+144], xmm8 +L_AES_GCM_decrypt_aesni_iv_done: ; Additional authentication data mov edx, r11d cmp edx, 0 - je L_AES_GCM_decrypt_calc_aad_done + je L_AES_GCM_decrypt_aesni_calc_aad_done xor ecx, ecx cmp edx, 16 - jl L_AES_GCM_decrypt_calc_aad_lt16 + jl L_AES_GCM_decrypt_aesni_calc_aad_lt16 and edx, 4294967280 -L_AES_GCM_decrypt_calc_aad_16_loop: - movdqu xmm8, [r12+rcx] +L_AES_GCM_decrypt_aesni_calc_aad_16_loop: + movdqu xmm8, OWORD PTR [r12+rcx] pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 pshufd xmm1, xmm6, 78 @@ -2359,23 +2389,23 @@ pxor xmm6, xmm2 add ecx, 16 cmp ecx, edx - jl L_AES_GCM_decrypt_calc_aad_16_loop + jl L_AES_GCM_decrypt_aesni_calc_aad_16_loop mov edx, r11d cmp ecx, edx - je L_AES_GCM_decrypt_calc_aad_done -L_AES_GCM_decrypt_calc_aad_lt16: + je L_AES_GCM_decrypt_aesni_calc_aad_done +L_AES_GCM_decrypt_aesni_calc_aad_lt16: sub rsp, 16 pxor xmm8, xmm8 xor ebx, ebx - movdqu [rsp], xmm8 -L_AES_GCM_decrypt_calc_aad_loop: + movdqu OWORD PTR [rsp], xmm8 +L_AES_GCM_decrypt_aesni_calc_aad_loop: movzx r13d, BYTE PTR [r12+rcx] mov BYTE PTR [rsp+rbx], r13b inc ecx inc ebx cmp ecx, edx - jl L_AES_GCM_decrypt_calc_aad_loop - movdqu xmm8, [rsp] + jl L_AES_GCM_decrypt_aesni_calc_aad_loop + movdqu xmm8, OWORD PTR [rsp] add rsp, 16 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 @@ -2433,13 +2463,13 @@ pxor xmm2, xmm1 pxor xmm2, xmm7 pxor xmm6, xmm2 -L_AES_GCM_decrypt_calc_aad_done: +L_AES_GCM_decrypt_aesni_calc_aad_done: ; Calculate counter and H pshufb xmm4, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm9, xmm5 paddd xmm4, OWORD PTR L_aes_gcm_one movdqa xmm8, xmm5 - movdqu [rsp+128], xmm4 + movdqu OWORD PTR [rsp+128], xmm4 psrlq xmm9, 63 psllq xmm8, 1 pslldq xmm9, 8 @@ -2451,11 +2481,11 @@ xor ebx, ebx cmp r9d, 128 mov r13d, r9d - jl L_AES_GCM_decrypt_done_128 + jl L_AES_GCM_decrypt_aesni_done_128 and r13d, 4294967168 movdqa xmm2, xmm6 ; H ^ 1 - movdqu [rsp], xmm5 + movdqu OWORD PTR [rsp], xmm5 ; H ^ 2 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm5, 78 @@ -2497,7 +2527,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm0, xmm14 - movdqu [rsp+16], xmm0 + movdqu OWORD PTR [rsp+16], xmm0 ; H ^ 3 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm0, 78 @@ -2539,7 +2569,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm1, xmm14 - movdqu [rsp+32], xmm1 + movdqu OWORD PTR [rsp+32], xmm1 ; H ^ 4 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm0, 78 @@ -2581,7 +2611,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm3, xmm14 - movdqu [rsp+48], xmm3 + movdqu OWORD PTR [rsp+48], xmm3 ; H ^ 5 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm1, 78 @@ -2623,7 +2653,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+64], xmm7 + movdqu OWORD PTR [rsp+64], xmm7 ; H ^ 6 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm1, 78 @@ -2665,7 +2695,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+80], xmm7 + movdqu OWORD PTR [rsp+80], xmm7 ; H ^ 7 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm3, 78 @@ -2707,7 +2737,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+96], xmm7 + movdqu OWORD PTR [rsp+96], xmm7 ; H ^ 8 pshufd xmm9, xmm3, 78 pshufd xmm10, xmm3, 78 @@ -2749,11 +2779,11 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+112], xmm7 -L_AES_GCM_decrypt_ghash_128: + movdqu OWORD PTR [rsp+112], xmm7 +L_AES_GCM_decrypt_aesni_ghash_128: lea rcx, QWORD PTR [rdi+rbx] lea rdx, QWORD PTR [rsi+rbx] - movdqu xmm8, [rsp+128] + movdqu xmm8, OWORD PTR [rsp+128] movdqa xmm1, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm0, xmm8 pshufb xmm8, xmm1 @@ -2780,7 +2810,7 @@ pshufb xmm15, xmm1 paddd xmm0, OWORD PTR L_aes_gcm_eight movdqa xmm7, OWORD PTR [r15] - movdqu [rsp+128], xmm0 + movdqu OWORD PTR [rsp+128], xmm0 pxor xmm8, xmm7 pxor xmm9, xmm7 pxor xmm10, xmm7 @@ -2789,8 +2819,8 @@ pxor xmm13, xmm7 pxor xmm14, xmm7 pxor xmm15, xmm7 - movdqu xmm7, [rsp+112] - movdqu xmm0, [rcx] + movdqu xmm7, OWORD PTR [rsp+112] + movdqu xmm0, OWORD PTR [rcx] aesenc xmm8, [r15+16] pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask pxor xmm0, xmm2 @@ -2812,8 +2842,8 @@ aesenc xmm15, [r15+16] pxor xmm1, xmm2 pxor xmm1, xmm3 - movdqu xmm7, [rsp+96] - movdqu xmm0, [rcx+16] + movdqu xmm7, OWORD PTR [rsp+96] + movdqu xmm0, OWORD PTR [rcx+16] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+32] @@ -2836,8 +2866,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+80] - movdqu xmm0, [rcx+32] + movdqu xmm7, OWORD PTR [rsp+80] + movdqu xmm0, OWORD PTR [rcx+32] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+48] @@ -2860,8 +2890,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+64] - movdqu xmm0, [rcx+48] + movdqu xmm7, OWORD PTR [rsp+64] + movdqu xmm0, OWORD PTR [rcx+48] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+64] @@ -2884,8 +2914,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+48] - movdqu xmm0, [rcx+64] + movdqu xmm7, OWORD PTR [rsp+48] + movdqu xmm0, OWORD PTR [rcx+64] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+80] @@ -2908,8 +2938,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+32] - movdqu xmm0, [rcx+80] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm0, OWORD PTR [rcx+80] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+96] @@ -2932,8 +2962,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+16] - movdqu xmm0, [rcx+96] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm0, OWORD PTR [rcx+96] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+112] @@ -2956,8 +2986,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp] - movdqu xmm0, [rcx+112] + movdqu xmm7, OWORD PTR [rsp] + movdqu xmm0, OWORD PTR [rcx+112] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [r15+128] @@ -3018,7 +3048,7 @@ pxor xmm2, xmm3 cmp r10d, 11 movdqa xmm7, OWORD PTR [r15+160] - jl L_AES_GCM_decrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_decrypt_aesni_aesenc_128_ghash_avx_done aesenc xmm8, xmm7 aesenc xmm9, xmm7 aesenc xmm10, xmm7 @@ -3038,7 +3068,7 @@ aesenc xmm15, xmm7 cmp r10d, 13 movdqa xmm7, OWORD PTR [r15+192] - jl L_AES_GCM_decrypt_aesenc_128_ghash_avx_done + jl L_AES_GCM_decrypt_aesni_aesenc_128_ghash_avx_done aesenc xmm8, xmm7 aesenc xmm9, xmm7 aesenc xmm10, xmm7 @@ -3057,65 +3087,65 @@ aesenc xmm14, xmm7 aesenc xmm15, xmm7 movdqa xmm7, OWORD PTR [r15+224] -L_AES_GCM_decrypt_aesenc_128_ghash_avx_done: +L_AES_GCM_decrypt_aesni_aesenc_128_ghash_avx_done: aesenclast xmm8, xmm7 aesenclast xmm9, xmm7 - movdqu xmm0, [rcx] - movdqu xmm1, [rcx+16] + movdqu xmm0, OWORD PTR [rcx] + movdqu xmm1, OWORD PTR [rcx+16] pxor xmm8, xmm0 pxor xmm9, xmm1 - movdqu [rdx], xmm8 - movdqu [rdx+16], xmm9 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 aesenclast xmm10, xmm7 aesenclast xmm11, xmm7 - movdqu xmm0, [rcx+32] - movdqu xmm1, [rcx+48] + movdqu xmm0, OWORD PTR [rcx+32] + movdqu xmm1, OWORD PTR [rcx+48] pxor xmm10, xmm0 pxor xmm11, xmm1 - movdqu [rdx+32], xmm10 - movdqu [rdx+48], xmm11 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 aesenclast xmm12, xmm7 aesenclast xmm13, xmm7 - movdqu xmm0, [rcx+64] - movdqu xmm1, [rcx+80] + movdqu xmm0, OWORD PTR [rcx+64] + movdqu xmm1, OWORD PTR [rcx+80] pxor xmm12, xmm0 pxor xmm13, xmm1 - movdqu [rdx+64], xmm12 - movdqu [rdx+80], xmm13 + movdqu OWORD PTR [rdx+64], xmm12 + movdqu OWORD PTR [rdx+80], xmm13 aesenclast xmm14, xmm7 aesenclast xmm15, xmm7 - movdqu xmm0, [rcx+96] - movdqu xmm1, [rcx+112] + movdqu xmm0, OWORD PTR [rcx+96] + movdqu xmm1, OWORD PTR [rcx+112] pxor xmm14, xmm0 pxor xmm15, xmm1 - movdqu [rdx+96], xmm14 - movdqu [rdx+112], xmm15 + movdqu OWORD PTR [rdx+96], xmm14 + movdqu OWORD PTR [rdx+112], xmm15 add ebx, 128 cmp ebx, r13d - jl L_AES_GCM_decrypt_ghash_128 + jl L_AES_GCM_decrypt_aesni_ghash_128 movdqa xmm6, xmm2 - movdqu xmm5, [rsp] -L_AES_GCM_decrypt_done_128: + movdqu xmm5, OWORD PTR [rsp] +L_AES_GCM_decrypt_aesni_done_128: mov edx, r9d cmp ebx, edx - jge L_AES_GCM_decrypt_done_dec + jge L_AES_GCM_decrypt_aesni_done_dec mov r13d, r9d and r13d, 4294967280 cmp ebx, r13d - jge L_AES_GCM_decrypt_last_block_done -L_AES_GCM_decrypt_last_block_start: + jge L_AES_GCM_decrypt_aesni_last_block_done +L_AES_GCM_decrypt_aesni_last_block_start: lea rcx, QWORD PTR [rdi+rbx] lea rdx, QWORD PTR [rsi+rbx] - movdqu xmm1, [rcx] + movdqu xmm1, OWORD PTR [rcx] movdqa xmm0, xmm5 pshufb xmm1, OWORD PTR L_aes_gcm_bswap_mask pxor xmm1, xmm6 - movdqu xmm8, [rsp+128] + movdqu xmm8, OWORD PTR [rsp+128] movdqa xmm9, xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_epi64 paddd xmm9, OWORD PTR L_aes_gcm_one pxor xmm8, [r15] - movdqu [rsp+128], xmm9 + movdqu OWORD PTR [rsp+128], xmm9 movdqa xmm10, xmm1 pclmulqdq xmm10, xmm0, 16 aesenc xmm8, [r15+16] @@ -3152,29 +3182,29 @@ pxor xmm6, xmm3 cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_decrypt_aesenc_gfmul_last + jl L_AES_GCM_decrypt_aesni_aesenc_gfmul_last aesenc xmm8, xmm9 aesenc xmm8, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_decrypt_aesenc_gfmul_last + jl L_AES_GCM_decrypt_aesni_aesenc_gfmul_last aesenc xmm8, xmm9 aesenc xmm8, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_decrypt_aesenc_gfmul_last: +L_AES_GCM_decrypt_aesni_aesenc_gfmul_last: aesenclast xmm8, xmm9 - movdqu xmm9, [rcx] + movdqu xmm9, OWORD PTR [rcx] pxor xmm8, xmm9 - movdqu [rdx], xmm8 + movdqu OWORD PTR [rdx], xmm8 add ebx, 16 cmp ebx, r13d - jl L_AES_GCM_decrypt_last_block_start -L_AES_GCM_decrypt_last_block_done: + jl L_AES_GCM_decrypt_aesni_last_block_start +L_AES_GCM_decrypt_aesni_last_block_done: mov ecx, r9d mov edx, ecx and ecx, 15 - jz L_AES_GCM_decrypt_aesenc_last15_dec_avx_done - movdqu xmm4, [rsp+128] + jz L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_done + movdqu xmm4, OWORD PTR [rsp+128] pshufb xmm4, OWORD PTR L_aes_gcm_bswap_epi64 pxor xmm4, [r15] aesenc xmm4, [r15+16] @@ -3188,23 +3218,23 @@ aesenc xmm4, [r15+144] cmp r10d, 11 movdqa xmm9, OWORD PTR [r15+160] - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last aesenc xmm4, xmm9 aesenc xmm4, [r15+176] cmp r10d, 13 movdqa xmm9, OWORD PTR [r15+192] - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last aesenc xmm4, xmm9 aesenc xmm4, [r15+208] movdqa xmm9, OWORD PTR [r15+224] -L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last: aesenclast xmm4, xmm9 sub rsp, 32 xor ecx, ecx - movdqu [rsp], xmm4 + movdqu OWORD PTR [rsp], xmm4 pxor xmm0, xmm0 - movdqu [rsp+16], xmm0 -L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop: + movdqu OWORD PTR [rsp+16], xmm0 +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_loop: movzx r13d, BYTE PTR [rdi+rbx] mov BYTE PTR [rsp+rcx+16], r13b xor r13b, BYTE PTR [rsp+rcx] @@ -3212,8 +3242,8 @@ inc ebx inc ecx cmp ebx, edx - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop - movdqu xmm4, [rsp+16] + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_loop + movdqu xmm4, OWORD PTR [rsp+16] add rsp, 32 pshufb xmm4, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm4 @@ -3257,8 +3287,8 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm6, xmm14 -L_AES_GCM_decrypt_aesenc_last15_dec_avx_done: -L_AES_GCM_decrypt_done_dec: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_done: +L_AES_GCM_decrypt_aesni_done_dec: mov edx, r9d mov ecx, r11d shl rdx, 3 @@ -3307,37 +3337,47 @@ pxor xmm14, xmm8 pxor xmm6, xmm14 pshufb xmm6, OWORD PTR L_aes_gcm_bswap_mask - movdqu xmm0, [rsp+144] + movdqu xmm0, OWORD PTR [rsp+144] pxor xmm0, xmm6 cmp r14d, 16 - je L_AES_GCM_decrypt_cmp_tag_16 + je L_AES_GCM_decrypt_aesni_cmp_tag_16 sub rsp, 16 xor rcx, rcx xor rbx, rbx - movdqu [rsp], xmm0 -L_AES_GCM_decrypt_cmp_tag_loop: + movdqu OWORD PTR [rsp], xmm0 +L_AES_GCM_decrypt_aesni_cmp_tag_loop: movzx r13d, BYTE PTR [rsp+rcx] xor r13b, BYTE PTR [r8+rcx] or bl, r13b inc ecx cmp ecx, r14d - jne L_AES_GCM_decrypt_cmp_tag_loop - cmp rbx, 0 + jne L_AES_GCM_decrypt_aesni_cmp_tag_loop + cmp bl, 0 sete bl add rsp, 16 xor rcx, rcx - jmp L_AES_GCM_decrypt_cmp_tag_done -L_AES_GCM_decrypt_cmp_tag_16: - movdqu xmm1, [r8] + jmp L_AES_GCM_decrypt_aesni_cmp_tag_done +L_AES_GCM_decrypt_aesni_cmp_tag_16: + movdqu xmm1, OWORD PTR [r8] pcmpeqb xmm0, xmm1 pmovmskb rdx, xmm0 ; %%edx == 0xFFFF then return 1 else => return 0 xor ebx, ebx cmp edx, 65535 sete bl -L_AES_GCM_decrypt_cmp_tag_done: +L_AES_GCM_decrypt_aesni_cmp_tag_done: mov DWORD PTR [rbp], ebx - add rsp, 168 + movdqu xmm6, OWORD PTR [rsp+168] + movdqu xmm7, OWORD PTR [rsp+184] + movdqu xmm8, OWORD PTR [rsp+200] + movdqu xmm9, OWORD PTR [rsp+216] + movdqu xmm10, OWORD PTR [rsp+232] + movdqu xmm11, OWORD PTR [rsp+248] + movdqu xmm12, OWORD PTR [rsp+264] + movdqu xmm13, OWORD PTR [rsp+280] + movdqu xmm14, OWORD PTR [rsp+296] + movdqu xmm15, OWORD PTR [rsp+312] + add rsp, 328 pop rbp pop r15 pop r14 @@ -3347,7 +3387,7 @@ pop rdi pop r13 ret -AES_GCM_decrypt ENDP +AES_GCM_decrypt_aesni ENDP _text ENDS _text SEGMENT READONLY PARA AES_GCM_init_aesni PROC @@ -3363,7 +3403,11 @@ mov rax, QWORD PTR [rsp+80] mov r8, QWORD PTR [rsp+88] mov r9, QWORD PTR [rsp+96] - sub rsp, 16 + sub rsp, 80 + movdqu OWORD PTR [rsp+16], xmm6 + movdqu OWORD PTR [rsp+32], xmm7 + movdqu OWORD PTR [rsp+48], xmm8 + movdqu OWORD PTR [rsp+64], xmm15 pxor xmm4, xmm4 mov edx, r11d cmp edx, 12 @@ -3378,53 +3422,53 @@ movdqa xmm1, xmm4 movdqa xmm5, OWORD PTR [rdi] pxor xmm1, xmm5 - movdqa xmm7, OWORD PTR [rdi+16] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+32] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+48] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+64] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+80] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+96] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+112] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+128] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+144] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 + movdqa xmm6, OWORD PTR [rdi+16] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+32] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+48] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+64] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+80] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+96] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+112] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+128] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+144] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 cmp esi, 11 - movdqa xmm7, OWORD PTR [rdi+160] + movdqa xmm6, OWORD PTR [rdi+160] jl L_AES_GCM_init_aesni_calc_iv_12_last - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+176] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+176] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 cmp esi, 13 - movdqa xmm7, OWORD PTR [rdi+192] + movdqa xmm6, OWORD PTR [rdi+192] jl L_AES_GCM_init_aesni_calc_iv_12_last - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+208] - aesenc xmm5, xmm7 - aesenc xmm1, xmm7 - movdqa xmm7, OWORD PTR [rdi+224] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+208] + aesenc xmm5, xmm6 + aesenc xmm1, xmm6 + movdqa xmm6, OWORD PTR [rdi+224] L_AES_GCM_init_aesni_calc_iv_12_last: - aesenclast xmm5, xmm7 - aesenclast xmm1, xmm7 + aesenclast xmm5, xmm6 + aesenclast xmm1, xmm6 pshufb xmm5, OWORD PTR L_aes_gcm_bswap_mask movdqu xmm15, xmm1 jmp L_AES_GCM_init_aesni_iv_done @@ -3442,18 +3486,18 @@ aesenc xmm5, [rdi+128] aesenc xmm5, [rdi+144] cmp esi, 11 - movdqa xmm9, OWORD PTR [rdi+160] + movdqa xmm8, OWORD PTR [rdi+160] jl L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last - aesenc xmm5, xmm9 + aesenc xmm5, xmm8 aesenc xmm5, [rdi+176] cmp esi, 13 - movdqa xmm9, OWORD PTR [rdi+192] + movdqa xmm8, OWORD PTR [rdi+192] jl L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last - aesenc xmm5, xmm9 + aesenc xmm5, xmm8 aesenc xmm5, [rdi+208] - movdqa xmm9, OWORD PTR [rdi+224] + movdqa xmm8, OWORD PTR [rdi+224] L_AES_GCM_init_aesni_calc_iv_1_aesenc_avx_last: - aesenclast xmm5, xmm9 + aesenclast xmm5, xmm8 pshufb xmm5, OWORD PTR L_aes_gcm_bswap_mask ; Calc counter ; Initialization vector @@ -3464,9 +3508,9 @@ jl L_AES_GCM_init_aesni_calc_iv_lt16 and edx, 4294967280 L_AES_GCM_init_aesni_calc_iv_16_loop: - movdqu xmm8, [r10+rcx] - pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask - pxor xmm4, xmm8 + movdqu xmm7, OWORD PTR [r10+rcx] + pshufb xmm7, OWORD PTR L_aes_gcm_bswap_mask + pxor xmm4, xmm7 pshufd xmm1, xmm4, 78 pshufd xmm2, xmm5, 78 movdqa xmm3, xmm5 @@ -3479,28 +3523,28 @@ pxor xmm1, xmm0 pxor xmm1, xmm3 movdqa xmm2, xmm1 - movdqa xmm7, xmm0 + movdqa xmm6, xmm0 movdqa xmm4, xmm3 pslldq xmm2, 8 psrldq xmm1, 8 - pxor xmm7, xmm2 + pxor xmm6, xmm2 pxor xmm4, xmm1 - movdqa xmm0, xmm7 + movdqa xmm0, xmm6 movdqa xmm1, xmm4 psrld xmm0, 31 psrld xmm1, 31 - pslld xmm7, 1 + pslld xmm6, 1 pslld xmm4, 1 movdqa xmm2, xmm0 pslldq xmm0, 4 psrldq xmm2, 12 pslldq xmm1, 4 por xmm4, xmm2 - por xmm7, xmm0 + por xmm6, xmm0 por xmm4, xmm1 - movdqa xmm0, xmm7 - movdqa xmm1, xmm7 - movdqa xmm2, xmm7 + movdqa xmm0, xmm6 + movdqa xmm1, xmm6 + movdqa xmm2, xmm6 pslld xmm0, 31 pslld xmm1, 30 pslld xmm2, 25 @@ -3509,17 +3553,17 @@ movdqa xmm1, xmm0 psrldq xmm1, 4 pslldq xmm0, 12 - pxor xmm7, xmm0 - movdqa xmm2, xmm7 - movdqa xmm3, xmm7 - movdqa xmm0, xmm7 + pxor xmm6, xmm0 + movdqa xmm2, xmm6 + movdqa xmm3, xmm6 + movdqa xmm0, xmm6 psrld xmm2, 1 psrld xmm3, 2 psrld xmm0, 7 pxor xmm2, xmm3 pxor xmm2, xmm0 pxor xmm2, xmm1 - pxor xmm2, xmm7 + pxor xmm2, xmm6 pxor xmm4, xmm2 add ecx, 16 cmp ecx, edx @@ -3529,9 +3573,9 @@ je L_AES_GCM_init_aesni_calc_iv_done L_AES_GCM_init_aesni_calc_iv_lt16: sub rsp, 16 - pxor xmm8, xmm8 + pxor xmm7, xmm7 xor r13d, r13d - movdqu [rsp], xmm8 + movdqu OWORD PTR [rsp], xmm7 L_AES_GCM_init_aesni_calc_iv_loop: movzx r12d, BYTE PTR [r10+rcx] mov BYTE PTR [rsp+r13], r12b @@ -3539,10 +3583,10 @@ inc r13d cmp ecx, edx jl L_AES_GCM_init_aesni_calc_iv_loop - movdqu xmm8, [rsp] + movdqu xmm7, OWORD PTR [rsp] add rsp, 16 - pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask - pxor xmm4, xmm8 + pshufb xmm7, OWORD PTR L_aes_gcm_bswap_mask + pxor xmm4, xmm7 pshufd xmm1, xmm4, 78 pshufd xmm2, xmm5, 78 movdqa xmm3, xmm5 @@ -3555,28 +3599,28 @@ pxor xmm1, xmm0 pxor xmm1, xmm3 movdqa xmm2, xmm1 - movdqa xmm7, xmm0 + movdqa xmm6, xmm0 movdqa xmm4, xmm3 pslldq xmm2, 8 psrldq xmm1, 8 - pxor xmm7, xmm2 + pxor xmm6, xmm2 pxor xmm4, xmm1 - movdqa xmm0, xmm7 + movdqa xmm0, xmm6 movdqa xmm1, xmm4 psrld xmm0, 31 psrld xmm1, 31 - pslld xmm7, 1 + pslld xmm6, 1 pslld xmm4, 1 movdqa xmm2, xmm0 pslldq xmm0, 4 psrldq xmm2, 12 pslldq xmm1, 4 por xmm4, xmm2 - por xmm7, xmm0 + por xmm6, xmm0 por xmm4, xmm1 - movdqa xmm0, xmm7 - movdqa xmm1, xmm7 - movdqa xmm2, xmm7 + movdqa xmm0, xmm6 + movdqa xmm1, xmm6 + movdqa xmm2, xmm6 pslld xmm0, 31 pslld xmm1, 30 pslld xmm2, 25 @@ -3585,17 +3629,17 @@ movdqa xmm1, xmm0 psrldq xmm1, 4 pslldq xmm0, 12 - pxor xmm7, xmm0 - movdqa xmm2, xmm7 - movdqa xmm3, xmm7 - movdqa xmm0, xmm7 + pxor xmm6, xmm0 + movdqa xmm2, xmm6 + movdqa xmm3, xmm6 + movdqa xmm0, xmm6 psrld xmm2, 1 psrld xmm3, 2 psrld xmm0, 7 pxor xmm2, xmm3 pxor xmm2, xmm0 pxor xmm2, xmm1 - pxor xmm2, xmm7 + pxor xmm2, xmm6 pxor xmm4, xmm2 L_AES_GCM_init_aesni_calc_iv_done: ; T = Encrypt counter @@ -3615,28 +3659,28 @@ pxor xmm1, xmm0 pxor xmm1, xmm3 movdqa xmm2, xmm1 - movdqa xmm7, xmm0 + movdqa xmm6, xmm0 movdqa xmm4, xmm3 pslldq xmm2, 8 psrldq xmm1, 8 - pxor xmm7, xmm2 + pxor xmm6, xmm2 pxor xmm4, xmm1 - movdqa xmm0, xmm7 + movdqa xmm0, xmm6 movdqa xmm1, xmm4 psrld xmm0, 31 psrld xmm1, 31 - pslld xmm7, 1 + pslld xmm6, 1 pslld xmm4, 1 movdqa xmm2, xmm0 pslldq xmm0, 4 psrldq xmm2, 12 pslldq xmm1, 4 por xmm4, xmm2 - por xmm7, xmm0 + por xmm6, xmm0 por xmm4, xmm1 - movdqa xmm0, xmm7 - movdqa xmm1, xmm7 - movdqa xmm2, xmm7 + movdqa xmm0, xmm6 + movdqa xmm1, xmm6 + movdqa xmm2, xmm6 pslld xmm0, 31 pslld xmm1, 30 pslld xmm2, 25 @@ -3645,52 +3689,56 @@ movdqa xmm1, xmm0 psrldq xmm1, 4 pslldq xmm0, 12 - pxor xmm7, xmm0 - movdqa xmm2, xmm7 - movdqa xmm3, xmm7 - movdqa xmm0, xmm7 + pxor xmm6, xmm0 + movdqa xmm2, xmm6 + movdqa xmm3, xmm6 + movdqa xmm0, xmm6 psrld xmm2, 1 psrld xmm3, 2 psrld xmm0, 7 pxor xmm2, xmm3 pxor xmm2, xmm0 pxor xmm2, xmm1 - pxor xmm2, xmm7 + pxor xmm2, xmm6 pxor xmm4, xmm2 pshufb xmm4, OWORD PTR L_aes_gcm_bswap_mask ; Encrypt counter - movdqa xmm8, OWORD PTR [rdi] - pxor xmm8, xmm4 - aesenc xmm8, [rdi+16] - aesenc xmm8, [rdi+32] - aesenc xmm8, [rdi+48] - aesenc xmm8, [rdi+64] - aesenc xmm8, [rdi+80] - aesenc xmm8, [rdi+96] - aesenc xmm8, [rdi+112] - aesenc xmm8, [rdi+128] - aesenc xmm8, [rdi+144] + movdqa xmm7, OWORD PTR [rdi] + pxor xmm7, xmm4 + aesenc xmm7, [rdi+16] + aesenc xmm7, [rdi+32] + aesenc xmm7, [rdi+48] + aesenc xmm7, [rdi+64] + aesenc xmm7, [rdi+80] + aesenc xmm7, [rdi+96] + aesenc xmm7, [rdi+112] + aesenc xmm7, [rdi+128] + aesenc xmm7, [rdi+144] cmp esi, 11 - movdqa xmm9, OWORD PTR [rdi+160] + movdqa xmm8, OWORD PTR [rdi+160] jl L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last - aesenc xmm8, xmm9 - aesenc xmm8, [rdi+176] + aesenc xmm7, xmm8 + aesenc xmm7, [rdi+176] cmp esi, 13 - movdqa xmm9, OWORD PTR [rdi+192] + movdqa xmm8, OWORD PTR [rdi+192] jl L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last - aesenc xmm8, xmm9 - aesenc xmm8, [rdi+208] - movdqa xmm9, OWORD PTR [rdi+224] + aesenc xmm7, xmm8 + aesenc xmm7, [rdi+208] + movdqa xmm8, OWORD PTR [rdi+224] L_AES_GCM_init_aesni_calc_iv_2_aesenc_avx_last: - aesenclast xmm8, xmm9 - movdqu xmm15, xmm8 + aesenclast xmm7, xmm8 + movdqu xmm15, xmm7 L_AES_GCM_init_aesni_iv_done: movdqa OWORD PTR [r9], xmm15 pshufb xmm4, OWORD PTR L_aes_gcm_bswap_epi64 paddd xmm4, OWORD PTR L_aes_gcm_one movdqa OWORD PTR [rax], xmm5 movdqa OWORD PTR [r8], xmm4 - add rsp, 16 + movdqu xmm6, OWORD PTR [rsp+16] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm8, OWORD PTR [rsp+48] + movdqu xmm15, OWORD PTR [rsp+64] + add rsp, 80 pop r14 pop r13 pop r12 @@ -3702,13 +3750,16 @@ _text SEGMENT READONLY PARA AES_GCM_aad_update_aesni PROC mov rax, rcx + sub rsp, 32 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 movdqa xmm5, OWORD PTR [r8] movdqa xmm6, OWORD PTR [r9] xor ecx, ecx L_AES_GCM_aad_update_aesni_16_loop: - movdqu xmm8, [rax+rcx] - pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask - pxor xmm5, xmm8 + movdqu xmm7, OWORD PTR [rax+rcx] + pshufb xmm7, OWORD PTR L_aes_gcm_bswap_mask + pxor xmm5, xmm7 pshufd xmm1, xmm5, 78 pshufd xmm2, xmm6, 78 movdqa xmm3, xmm6 @@ -3767,6 +3818,9 @@ cmp ecx, edx jl L_AES_GCM_aad_update_aesni_16_loop movdqa OWORD PTR [r8], xmm5 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + add rsp, 32 ret AES_GCM_aad_update_aesni ENDP _text ENDS @@ -3775,48 +3829,51 @@ mov r10, r8 mov r11, r9 mov rax, QWORD PTR [rsp+40] - movdqu xmm8, [rax] - movdqa xmm9, xmm8 - pshufb xmm8, OWORD PTR L_aes_gcm_bswap_epi64 - paddd xmm9, OWORD PTR L_aes_gcm_one - pxor xmm8, [rcx] - movdqu [rax], xmm9 - aesenc xmm8, [rcx+16] - aesenc xmm8, [rcx+32] - aesenc xmm8, [rcx+48] - aesenc xmm8, [rcx+64] - aesenc xmm8, [rcx+80] - aesenc xmm8, [rcx+96] - aesenc xmm8, [rcx+112] - aesenc xmm8, [rcx+128] - aesenc xmm8, [rcx+144] + movdqu xmm0, OWORD PTR [rax] + movdqa xmm1, xmm0 + pshufb xmm0, OWORD PTR L_aes_gcm_bswap_epi64 + paddd xmm1, OWORD PTR L_aes_gcm_one + pxor xmm0, [rcx] + movdqu OWORD PTR [rax], xmm1 + aesenc xmm0, [rcx+16] + aesenc xmm0, [rcx+32] + aesenc xmm0, [rcx+48] + aesenc xmm0, [rcx+64] + aesenc xmm0, [rcx+80] + aesenc xmm0, [rcx+96] + aesenc xmm0, [rcx+112] + aesenc xmm0, [rcx+128] + aesenc xmm0, [rcx+144] cmp edx, 11 - movdqa xmm9, OWORD PTR [rcx+160] + movdqa xmm1, OWORD PTR [rcx+160] jl L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last - aesenc xmm8, xmm9 - aesenc xmm8, [rcx+176] + aesenc xmm0, xmm1 + aesenc xmm0, [rcx+176] cmp edx, 13 - movdqa xmm9, OWORD PTR [rcx+192] + movdqa xmm1, OWORD PTR [rcx+192] jl L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last - aesenc xmm8, xmm9 - aesenc xmm8, [rcx+208] - movdqa xmm9, OWORD PTR [rcx+224] + aesenc xmm0, xmm1 + aesenc xmm0, [rcx+208] + movdqa xmm1, OWORD PTR [rcx+224] L_AES_GCM_encrypt_block_aesni_aesenc_block_aesenc_avx_last: - aesenclast xmm8, xmm9 - movdqu xmm9, [r11] - pxor xmm8, xmm9 - movdqu [r10], xmm8 - pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask + aesenclast xmm0, xmm1 + movdqu xmm1, OWORD PTR [r11] + pxor xmm0, xmm1 + movdqu OWORD PTR [r10], xmm0 + pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask ret AES_GCM_encrypt_block_aesni ENDP _text ENDS _text SEGMENT READONLY PARA AES_GCM_ghash_block_aesni PROC + sub rsp, 32 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 movdqa xmm4, OWORD PTR [rdx] movdqa xmm5, OWORD PTR [r8] - movdqu xmm8, [rcx] - pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask - pxor xmm4, xmm8 + movdqu xmm7, OWORD PTR [rcx] + pshufb xmm7, OWORD PTR L_aes_gcm_bswap_mask + pxor xmm4, xmm7 pshufd xmm1, xmm4, 78 pshufd xmm2, xmm5, 78 movdqa xmm3, xmm5 @@ -3872,6 +3929,9 @@ pxor xmm2, xmm6 pxor xmm4, xmm2 movdqa OWORD PTR [rdx], xmm4 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + add rsp, 32 ret AES_GCM_ghash_block_aesni ENDP _text ENDS @@ -3890,7 +3950,17 @@ mov r12, QWORD PTR [rsp+88] mov r14, QWORD PTR [rsp+96] mov r15, QWORD PTR [rsp+104] - sub rsp, 160 + sub rsp, 320 + movdqu OWORD PTR [rsp+160], xmm6 + movdqu OWORD PTR [rsp+176], xmm7 + movdqu OWORD PTR [rsp+192], xmm8 + movdqu OWORD PTR [rsp+208], xmm9 + movdqu OWORD PTR [rsp+224], xmm10 + movdqu OWORD PTR [rsp+240], xmm11 + movdqu OWORD PTR [rsp+256], xmm12 + movdqu OWORD PTR [rsp+272], xmm13 + movdqu OWORD PTR [rsp+288], xmm14 + movdqu OWORD PTR [rsp+304], xmm15 movdqa xmm6, OWORD PTR [r12] movdqa xmm5, OWORD PTR [r14] movdqa xmm9, xmm5 @@ -3910,7 +3980,7 @@ and r13d, 4294967168 movdqa xmm2, xmm6 ; H ^ 1 - movdqu [rsp], xmm5 + movdqu OWORD PTR [rsp], xmm5 ; H ^ 2 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm5, 78 @@ -3952,7 +4022,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm0, xmm14 - movdqu [rsp+16], xmm0 + movdqu OWORD PTR [rsp+16], xmm0 ; H ^ 3 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm0, 78 @@ -3994,7 +4064,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm1, xmm14 - movdqu [rsp+32], xmm1 + movdqu OWORD PTR [rsp+32], xmm1 ; H ^ 4 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm0, 78 @@ -4036,7 +4106,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm3, xmm14 - movdqu [rsp+48], xmm3 + movdqu OWORD PTR [rsp+48], xmm3 ; H ^ 5 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm1, 78 @@ -4078,7 +4148,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+64], xmm7 + movdqu OWORD PTR [rsp+64], xmm7 ; H ^ 6 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm1, 78 @@ -4120,7 +4190,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+80], xmm7 + movdqu OWORD PTR [rsp+80], xmm7 ; H ^ 7 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm3, 78 @@ -4162,7 +4232,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+96], xmm7 + movdqu OWORD PTR [rsp+96], xmm7 ; H ^ 8 pshufd xmm9, xmm3, 78 pshufd xmm10, xmm3, 78 @@ -4204,9 +4274,9 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+112], xmm7 + movdqu OWORD PTR [rsp+112], xmm7 ; First 128 bytes of input - movdqu xmm8, [r15] + movdqu xmm8, OWORD PTR [r15] movdqa xmm1, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm0, xmm8 pshufb xmm8, xmm1 @@ -4233,7 +4303,7 @@ pshufb xmm15, xmm1 paddd xmm0, OWORD PTR L_aes_gcm_eight movdqa xmm7, OWORD PTR [rax] - movdqu [r15], xmm0 + movdqu OWORD PTR [r15], xmm0 pxor xmm8, xmm7 pxor xmm9, xmm7 pxor xmm10, xmm7 @@ -4367,36 +4437,36 @@ L_AES_GCM_encrypt_update_aesni_enc_done: aesenclast xmm8, xmm7 aesenclast xmm9, xmm7 - movdqu xmm0, [r11] - movdqu xmm1, [r11+16] + movdqu xmm0, OWORD PTR [r11] + movdqu xmm1, OWORD PTR [r11+16] pxor xmm8, xmm0 pxor xmm9, xmm1 - movdqu [r10], xmm8 - movdqu [r10+16], xmm9 + movdqu OWORD PTR [r10], xmm8 + movdqu OWORD PTR [r10+16], xmm9 aesenclast xmm10, xmm7 aesenclast xmm11, xmm7 - movdqu xmm0, [r11+32] - movdqu xmm1, [r11+48] + movdqu xmm0, OWORD PTR [r11+32] + movdqu xmm1, OWORD PTR [r11+48] pxor xmm10, xmm0 pxor xmm11, xmm1 - movdqu [r10+32], xmm10 - movdqu [r10+48], xmm11 + movdqu OWORD PTR [r10+32], xmm10 + movdqu OWORD PTR [r10+48], xmm11 aesenclast xmm12, xmm7 aesenclast xmm13, xmm7 - movdqu xmm0, [r11+64] - movdqu xmm1, [r11+80] + movdqu xmm0, OWORD PTR [r11+64] + movdqu xmm1, OWORD PTR [r11+80] pxor xmm12, xmm0 pxor xmm13, xmm1 - movdqu [r10+64], xmm12 - movdqu [r10+80], xmm13 + movdqu OWORD PTR [r10+64], xmm12 + movdqu OWORD PTR [r10+80], xmm13 aesenclast xmm14, xmm7 aesenclast xmm15, xmm7 - movdqu xmm0, [r11+96] - movdqu xmm1, [r11+112] + movdqu xmm0, OWORD PTR [r11+96] + movdqu xmm1, OWORD PTR [r11+112] pxor xmm14, xmm0 pxor xmm15, xmm1 - movdqu [r10+96], xmm14 - movdqu [r10+112], xmm15 + movdqu OWORD PTR [r10+96], xmm14 + movdqu OWORD PTR [r10+112], xmm15 cmp r13d, 128 mov edi, 128 jle L_AES_GCM_encrypt_update_aesni_end_128 @@ -4404,7 +4474,7 @@ L_AES_GCM_encrypt_update_aesni_ghash_128: lea rcx, QWORD PTR [r11+rdi] lea rdx, QWORD PTR [r10+rdi] - movdqu xmm8, [r15] + movdqu xmm8, OWORD PTR [r15] movdqa xmm1, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm0, xmm8 pshufb xmm8, xmm1 @@ -4431,7 +4501,7 @@ pshufb xmm15, xmm1 paddd xmm0, OWORD PTR L_aes_gcm_eight movdqa xmm7, OWORD PTR [rax] - movdqu [r15], xmm0 + movdqu OWORD PTR [r15], xmm0 pxor xmm8, xmm7 pxor xmm9, xmm7 pxor xmm10, xmm7 @@ -4440,8 +4510,8 @@ pxor xmm13, xmm7 pxor xmm14, xmm7 pxor xmm15, xmm7 - movdqu xmm7, [rsp+112] - movdqu xmm0, [rdx+-128] + movdqu xmm7, OWORD PTR [rsp+112] + movdqu xmm0, OWORD PTR [rdx+-128] aesenc xmm8, [rax+16] pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask pxor xmm0, xmm2 @@ -4463,8 +4533,8 @@ aesenc xmm15, [rax+16] pxor xmm1, xmm2 pxor xmm1, xmm3 - movdqu xmm7, [rsp+96] - movdqu xmm0, [rdx+-112] + movdqu xmm7, OWORD PTR [rsp+96] + movdqu xmm0, OWORD PTR [rdx+-112] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+32] @@ -4487,8 +4557,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+80] - movdqu xmm0, [rdx+-96] + movdqu xmm7, OWORD PTR [rsp+80] + movdqu xmm0, OWORD PTR [rdx+-96] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+48] @@ -4511,8 +4581,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+64] - movdqu xmm0, [rdx+-80] + movdqu xmm7, OWORD PTR [rsp+64] + movdqu xmm0, OWORD PTR [rdx+-80] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+64] @@ -4535,8 +4605,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+48] - movdqu xmm0, [rdx+-64] + movdqu xmm7, OWORD PTR [rsp+48] + movdqu xmm0, OWORD PTR [rdx+-64] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+80] @@ -4559,8 +4629,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+32] - movdqu xmm0, [rdx+-48] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm0, OWORD PTR [rdx+-48] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+96] @@ -4583,8 +4653,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+16] - movdqu xmm0, [rdx+-32] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm0, OWORD PTR [rdx+-32] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+112] @@ -4607,8 +4677,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp] - movdqu xmm0, [rdx+-16] + movdqu xmm7, OWORD PTR [rsp] + movdqu xmm0, OWORD PTR [rdx+-16] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+128] @@ -4711,36 +4781,36 @@ L_AES_GCM_encrypt_update_aesni_aesenc_128_ghash_avx_done: aesenclast xmm8, xmm7 aesenclast xmm9, xmm7 - movdqu xmm0, [rcx] - movdqu xmm1, [rcx+16] + movdqu xmm0, OWORD PTR [rcx] + movdqu xmm1, OWORD PTR [rcx+16] pxor xmm8, xmm0 pxor xmm9, xmm1 - movdqu [rdx], xmm8 - movdqu [rdx+16], xmm9 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 aesenclast xmm10, xmm7 aesenclast xmm11, xmm7 - movdqu xmm0, [rcx+32] - movdqu xmm1, [rcx+48] + movdqu xmm0, OWORD PTR [rcx+32] + movdqu xmm1, OWORD PTR [rcx+48] pxor xmm10, xmm0 pxor xmm11, xmm1 - movdqu [rdx+32], xmm10 - movdqu [rdx+48], xmm11 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 aesenclast xmm12, xmm7 aesenclast xmm13, xmm7 - movdqu xmm0, [rcx+64] - movdqu xmm1, [rcx+80] + movdqu xmm0, OWORD PTR [rcx+64] + movdqu xmm1, OWORD PTR [rcx+80] pxor xmm12, xmm0 pxor xmm13, xmm1 - movdqu [rdx+64], xmm12 - movdqu [rdx+80], xmm13 + movdqu OWORD PTR [rdx+64], xmm12 + movdqu OWORD PTR [rdx+80], xmm13 aesenclast xmm14, xmm7 aesenclast xmm15, xmm7 - movdqu xmm0, [rcx+96] - movdqu xmm1, [rcx+112] + movdqu xmm0, OWORD PTR [rcx+96] + movdqu xmm1, OWORD PTR [rcx+112] pxor xmm14, xmm0 pxor xmm15, xmm1 - movdqu [rdx+96], xmm14 - movdqu [rdx+112], xmm15 + movdqu OWORD PTR [rdx+96], xmm14 + movdqu OWORD PTR [rdx+112], xmm15 add edi, 128 cmp edi, r13d jl L_AES_GCM_encrypt_update_aesni_ghash_128 @@ -4755,7 +4825,7 @@ pshufb xmm13, xmm4 pshufb xmm14, xmm4 pshufb xmm15, xmm4 - movdqu xmm7, [rsp+112] + movdqu xmm7, OWORD PTR [rsp+112] pshufd xmm1, xmm8, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4774,7 +4844,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+96] + movdqu xmm7, OWORD PTR [rsp+96] pshufd xmm1, xmm9, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4793,7 +4863,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+80] + movdqu xmm7, OWORD PTR [rsp+80] pshufd xmm1, xmm10, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4812,7 +4882,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+64] + movdqu xmm7, OWORD PTR [rsp+64] pshufd xmm1, xmm11, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4831,7 +4901,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+48] + movdqu xmm7, OWORD PTR [rsp+48] pshufd xmm1, xmm12, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4850,7 +4920,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+32] + movdqu xmm7, OWORD PTR [rsp+32] pshufd xmm1, xmm13, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4869,7 +4939,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp+16] + movdqu xmm7, OWORD PTR [rsp+16] pshufd xmm1, xmm14, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4888,7 +4958,7 @@ psrldq xmm1, 8 pxor xmm4, xmm2 pxor xmm6, xmm1 - movdqu xmm7, [rsp] + movdqu xmm7, OWORD PTR [rsp] pshufd xmm1, xmm15, 78 pshufd xmm2, xmm7, 78 movdqa xmm3, xmm7 @@ -4930,7 +5000,7 @@ pxor xmm2, xmm1 pxor xmm2, xmm4 pxor xmm6, xmm2 - movdqu xmm5, [rsp] + movdqu xmm5, OWORD PTR [rsp] L_AES_GCM_encrypt_update_aesni_done_128: mov edx, r9d cmp edi, edx @@ -4941,12 +5011,12 @@ jge L_AES_GCM_encrypt_update_aesni_last_block_done lea rcx, QWORD PTR [r11+rdi] lea rdx, QWORD PTR [r10+rdi] - movdqu xmm8, [r15] + movdqu xmm8, OWORD PTR [r15] movdqa xmm9, xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_epi64 paddd xmm9, OWORD PTR L_aes_gcm_one pxor xmm8, [rax] - movdqu [r15], xmm9 + movdqu OWORD PTR [r15], xmm9 aesenc xmm8, [rax+16] aesenc xmm8, [rax+32] aesenc xmm8, [rax+48] @@ -4969,9 +5039,9 @@ movdqa xmm9, OWORD PTR [rax+224] L_AES_GCM_encrypt_update_aesni_aesenc_block_aesenc_avx_last: aesenclast xmm8, xmm9 - movdqu xmm9, [rcx] + movdqu xmm9, OWORD PTR [rcx] pxor xmm8, xmm9 - movdqu [rdx], xmm8 + movdqu OWORD PTR [rdx], xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 add edi, 16 @@ -4980,12 +5050,12 @@ L_AES_GCM_encrypt_update_aesni_last_block_start: lea rcx, QWORD PTR [r11+rdi] lea rdx, QWORD PTR [r10+rdi] - movdqu xmm8, [r15] + movdqu xmm8, OWORD PTR [r15] movdqa xmm9, xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_epi64 paddd xmm9, OWORD PTR L_aes_gcm_one pxor xmm8, [rax] - movdqu [r15], xmm9 + movdqu OWORD PTR [r15], xmm9 movdqa xmm10, xmm6 pclmulqdq xmm10, xmm5, 16 aesenc xmm8, [rax+16] @@ -5033,9 +5103,9 @@ movdqa xmm9, OWORD PTR [rax+224] L_AES_GCM_encrypt_update_aesni_aesenc_gfmul_last: aesenclast xmm8, xmm9 - movdqu xmm9, [rcx] + movdqu xmm9, OWORD PTR [rcx] pxor xmm8, xmm9 - movdqu [rdx], xmm8 + movdqu OWORD PTR [rdx], xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_mask pxor xmm6, xmm8 add edi, 16 @@ -5085,7 +5155,17 @@ L_AES_GCM_encrypt_update_aesni_last_block_done: L_AES_GCM_encrypt_update_aesni_done_enc: movdqa OWORD PTR [r12], xmm6 - add rsp, 160 + movdqu xmm6, OWORD PTR [rsp+160] + movdqu xmm7, OWORD PTR [rsp+176] + movdqu xmm8, OWORD PTR [rsp+192] + movdqu xmm9, OWORD PTR [rsp+208] + movdqu xmm10, OWORD PTR [rsp+224] + movdqu xmm11, OWORD PTR [rsp+240] + movdqu xmm12, OWORD PTR [rsp+256] + movdqu xmm13, OWORD PTR [rsp+272] + movdqu xmm14, OWORD PTR [rsp+288] + movdqu xmm15, OWORD PTR [rsp+304] + add rsp, 320 pop rdi pop r15 pop r14 @@ -5105,20 +5185,28 @@ mov r11d, DWORD PTR [rsp+64] mov r12, QWORD PTR [rsp+72] mov r14, QWORD PTR [rsp+80] - sub rsp, 16 + sub rsp, 144 + movdqu OWORD PTR [rsp+16], xmm6 + movdqu OWORD PTR [rsp+32], xmm7 + movdqu OWORD PTR [rsp+48], xmm8 + movdqu OWORD PTR [rsp+64], xmm9 + movdqu OWORD PTR [rsp+80], xmm10 + movdqu OWORD PTR [rsp+96], xmm11 + movdqu OWORD PTR [rsp+112], xmm12 + movdqu OWORD PTR [rsp+128], xmm13 movdqa xmm4, OWORD PTR [rax] movdqa xmm5, OWORD PTR [r12] movdqa xmm6, OWORD PTR [r14] - movdqa xmm9, xmm5 movdqa xmm8, xmm5 - psrlq xmm9, 63 - psllq xmm8, 1 - pslldq xmm9, 8 - por xmm8, xmm9 + movdqa xmm7, xmm5 + psrlq xmm8, 63 + psllq xmm7, 1 + pslldq xmm8, 8 + por xmm7, xmm8 pshufd xmm5, xmm5, 255 psrad xmm5, 31 pand xmm5, OWORD PTR L_aes_gcm_mod2_128 - pxor xmm5, xmm8 + pxor xmm5, xmm7 mov edx, r10d mov ecx, r11d shl rdx, 3 @@ -5126,53 +5214,53 @@ pinsrq xmm0, rdx, 0 pinsrq xmm0, rcx, 1 pxor xmm4, xmm0 - pshufd xmm9, xmm5, 78 - pshufd xmm10, xmm4, 78 - movdqa xmm11, xmm4 - movdqa xmm8, xmm4 - pclmulqdq xmm11, xmm5, 17 - pclmulqdq xmm8, xmm5, 0 - pxor xmm9, xmm5 - pxor xmm10, xmm4 - pclmulqdq xmm9, xmm10, 0 - pxor xmm9, xmm8 - pxor xmm9, xmm11 - movdqa xmm10, xmm9 - movdqa xmm4, xmm11 - pslldq xmm10, 8 - psrldq xmm9, 8 + pshufd xmm8, xmm5, 78 + pshufd xmm9, xmm4, 78 + movdqa xmm10, xmm4 + movdqa xmm7, xmm4 + pclmulqdq xmm10, xmm5, 17 + pclmulqdq xmm7, xmm5, 0 + pxor xmm8, xmm5 + pxor xmm9, xmm4 + pclmulqdq xmm8, xmm9, 0 + pxor xmm8, xmm7 pxor xmm8, xmm10 - pxor xmm4, xmm9 - movdqa xmm12, xmm8 - movdqa xmm13, xmm8 - movdqa xmm14, xmm8 - pslld xmm12, 31 - pslld xmm13, 30 - pslld xmm14, 25 - pxor xmm12, xmm13 - pxor xmm12, xmm14 - movdqa xmm13, xmm12 - psrldq xmm13, 4 - pslldq xmm12, 12 - pxor xmm8, xmm12 - movdqa xmm14, xmm8 - movdqa xmm10, xmm8 movdqa xmm9, xmm8 - psrld xmm14, 1 - psrld xmm10, 2 - psrld xmm9, 7 - pxor xmm14, xmm10 - pxor xmm14, xmm9 - pxor xmm14, xmm13 - pxor xmm14, xmm8 - pxor xmm4, xmm14 + movdqa xmm4, xmm10 + pslldq xmm9, 8 + psrldq xmm8, 8 + pxor xmm7, xmm9 + pxor xmm4, xmm8 + movdqa xmm11, xmm7 + movdqa xmm12, xmm7 + movdqa xmm13, xmm7 + pslld xmm11, 31 + pslld xmm12, 30 + pslld xmm13, 25 + pxor xmm11, xmm12 + pxor xmm11, xmm13 + movdqa xmm12, xmm11 + psrldq xmm12, 4 + pslldq xmm11, 12 + pxor xmm7, xmm11 + movdqa xmm13, xmm7 + movdqa xmm9, xmm7 + movdqa xmm8, xmm7 + psrld xmm13, 1 + psrld xmm9, 2 + psrld xmm8, 7 + pxor xmm13, xmm9 + pxor xmm13, xmm8 + pxor xmm13, xmm12 + pxor xmm13, xmm7 + pxor xmm4, xmm13 pshufb xmm4, OWORD PTR L_aes_gcm_bswap_mask movdqu xmm0, xmm6 pxor xmm0, xmm4 cmp r8d, 16 je L_AES_GCM_encrypt_final_aesni_store_tag_16 xor rcx, rcx - movdqu [rsp], xmm0 + movdqu OWORD PTR [rsp], xmm0 L_AES_GCM_encrypt_final_aesni_store_tag_loop: movzx r13d, BYTE PTR [rsp+rcx] mov BYTE PTR [r9+rcx], r13b @@ -5181,9 +5269,17 @@ jne L_AES_GCM_encrypt_final_aesni_store_tag_loop jmp L_AES_GCM_encrypt_final_aesni_store_tag_done L_AES_GCM_encrypt_final_aesni_store_tag_16: - movdqu [r9], xmm0 + movdqu OWORD PTR [r9], xmm0 L_AES_GCM_encrypt_final_aesni_store_tag_done: - add rsp, 16 + movdqu xmm6, OWORD PTR [rsp+16] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm8, OWORD PTR [rsp+48] + movdqu xmm9, OWORD PTR [rsp+64] + movdqu xmm10, OWORD PTR [rsp+80] + movdqu xmm11, OWORD PTR [rsp+96] + movdqu xmm12, OWORD PTR [rsp+112] + movdqu xmm13, OWORD PTR [rsp+128] + add rsp, 144 pop r14 pop r12 pop r13 @@ -5206,7 +5302,17 @@ mov r12, QWORD PTR [rsp+96] mov r14, QWORD PTR [rsp+104] mov r15, QWORD PTR [rsp+112] - sub rsp, 168 + sub rsp, 328 + movdqu OWORD PTR [rsp+168], xmm6 + movdqu OWORD PTR [rsp+184], xmm7 + movdqu OWORD PTR [rsp+200], xmm8 + movdqu OWORD PTR [rsp+216], xmm9 + movdqu OWORD PTR [rsp+232], xmm10 + movdqu OWORD PTR [rsp+248], xmm11 + movdqu OWORD PTR [rsp+264], xmm12 + movdqu OWORD PTR [rsp+280], xmm13 + movdqu OWORD PTR [rsp+296], xmm14 + movdqu OWORD PTR [rsp+312], xmm15 movdqa xmm6, OWORD PTR [r12] movdqa xmm5, OWORD PTR [r14] movdqa xmm9, xmm5 @@ -5226,7 +5332,7 @@ and r13d, 4294967168 movdqa xmm2, xmm6 ; H ^ 1 - movdqu [rsp], xmm5 + movdqu OWORD PTR [rsp], xmm5 ; H ^ 2 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm5, 78 @@ -5268,7 +5374,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm0, xmm14 - movdqu [rsp+16], xmm0 + movdqu OWORD PTR [rsp+16], xmm0 ; H ^ 3 pshufd xmm9, xmm5, 78 pshufd xmm10, xmm0, 78 @@ -5310,7 +5416,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm1, xmm14 - movdqu [rsp+32], xmm1 + movdqu OWORD PTR [rsp+32], xmm1 ; H ^ 4 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm0, 78 @@ -5352,7 +5458,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm3, xmm14 - movdqu [rsp+48], xmm3 + movdqu OWORD PTR [rsp+48], xmm3 ; H ^ 5 pshufd xmm9, xmm0, 78 pshufd xmm10, xmm1, 78 @@ -5394,7 +5500,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+64], xmm7 + movdqu OWORD PTR [rsp+64], xmm7 ; H ^ 6 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm1, 78 @@ -5436,7 +5542,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+80], xmm7 + movdqu OWORD PTR [rsp+80], xmm7 ; H ^ 7 pshufd xmm9, xmm1, 78 pshufd xmm10, xmm3, 78 @@ -5478,7 +5584,7 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+96], xmm7 + movdqu OWORD PTR [rsp+96], xmm7 ; H ^ 8 pshufd xmm9, xmm3, 78 pshufd xmm10, xmm3, 78 @@ -5520,11 +5626,11 @@ pxor xmm14, xmm13 pxor xmm14, xmm8 pxor xmm7, xmm14 - movdqu [rsp+112], xmm7 + movdqu OWORD PTR [rsp+112], xmm7 L_AES_GCM_decrypt_update_aesni_ghash_128: lea rcx, QWORD PTR [r11+rdi] lea rdx, QWORD PTR [r10+rdi] - movdqu xmm8, [r15] + movdqu xmm8, OWORD PTR [r15] movdqa xmm1, OWORD PTR L_aes_gcm_bswap_epi64 movdqa xmm0, xmm8 pshufb xmm8, xmm1 @@ -5551,7 +5657,7 @@ pshufb xmm15, xmm1 paddd xmm0, OWORD PTR L_aes_gcm_eight movdqa xmm7, OWORD PTR [rax] - movdqu [r15], xmm0 + movdqu OWORD PTR [r15], xmm0 pxor xmm8, xmm7 pxor xmm9, xmm7 pxor xmm10, xmm7 @@ -5560,8 +5666,8 @@ pxor xmm13, xmm7 pxor xmm14, xmm7 pxor xmm15, xmm7 - movdqu xmm7, [rsp+112] - movdqu xmm0, [rcx] + movdqu xmm7, OWORD PTR [rsp+112] + movdqu xmm0, OWORD PTR [rcx] aesenc xmm8, [rax+16] pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask pxor xmm0, xmm2 @@ -5583,8 +5689,8 @@ aesenc xmm15, [rax+16] pxor xmm1, xmm2 pxor xmm1, xmm3 - movdqu xmm7, [rsp+96] - movdqu xmm0, [rcx+16] + movdqu xmm7, OWORD PTR [rsp+96] + movdqu xmm0, OWORD PTR [rcx+16] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+32] @@ -5607,8 +5713,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+80] - movdqu xmm0, [rcx+32] + movdqu xmm7, OWORD PTR [rsp+80] + movdqu xmm0, OWORD PTR [rcx+32] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+48] @@ -5631,8 +5737,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+64] - movdqu xmm0, [rcx+48] + movdqu xmm7, OWORD PTR [rsp+64] + movdqu xmm0, OWORD PTR [rcx+48] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+64] @@ -5655,8 +5761,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+48] - movdqu xmm0, [rcx+64] + movdqu xmm7, OWORD PTR [rsp+48] + movdqu xmm0, OWORD PTR [rcx+64] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+80] @@ -5679,8 +5785,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+32] - movdqu xmm0, [rcx+80] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm0, OWORD PTR [rcx+80] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+96] @@ -5703,8 +5809,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp+16] - movdqu xmm0, [rcx+96] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm0, OWORD PTR [rcx+96] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+112] @@ -5727,8 +5833,8 @@ pxor xmm1, xmm6 pxor xmm3, xmm6 pxor xmm1, xmm4 - movdqu xmm7, [rsp] - movdqu xmm0, [rcx+112] + movdqu xmm7, OWORD PTR [rsp] + movdqu xmm0, OWORD PTR [rcx+112] pshufd xmm4, xmm7, 78 pshufb xmm0, OWORD PTR L_aes_gcm_bswap_mask aesenc xmm8, [rax+128] @@ -5831,41 +5937,41 @@ L_AES_GCM_decrypt_update_aesni_aesenc_128_ghash_avx_done: aesenclast xmm8, xmm7 aesenclast xmm9, xmm7 - movdqu xmm0, [rcx] - movdqu xmm1, [rcx+16] + movdqu xmm0, OWORD PTR [rcx] + movdqu xmm1, OWORD PTR [rcx+16] pxor xmm8, xmm0 pxor xmm9, xmm1 - movdqu [rdx], xmm8 - movdqu [rdx+16], xmm9 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 aesenclast xmm10, xmm7 aesenclast xmm11, xmm7 - movdqu xmm0, [rcx+32] - movdqu xmm1, [rcx+48] + movdqu xmm0, OWORD PTR [rcx+32] + movdqu xmm1, OWORD PTR [rcx+48] pxor xmm10, xmm0 pxor xmm11, xmm1 - movdqu [rdx+32], xmm10 - movdqu [rdx+48], xmm11 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 aesenclast xmm12, xmm7 aesenclast xmm13, xmm7 - movdqu xmm0, [rcx+64] - movdqu xmm1, [rcx+80] + movdqu xmm0, OWORD PTR [rcx+64] + movdqu xmm1, OWORD PTR [rcx+80] pxor xmm12, xmm0 pxor xmm13, xmm1 - movdqu [rdx+64], xmm12 - movdqu [rdx+80], xmm13 + movdqu OWORD PTR [rdx+64], xmm12 + movdqu OWORD PTR [rdx+80], xmm13 aesenclast xmm14, xmm7 aesenclast xmm15, xmm7 - movdqu xmm0, [rcx+96] - movdqu xmm1, [rcx+112] + movdqu xmm0, OWORD PTR [rcx+96] + movdqu xmm1, OWORD PTR [rcx+112] pxor xmm14, xmm0 pxor xmm15, xmm1 - movdqu [rdx+96], xmm14 - movdqu [rdx+112], xmm15 + movdqu OWORD PTR [rdx+96], xmm14 + movdqu OWORD PTR [rdx+112], xmm15 add edi, 128 cmp edi, r13d jl L_AES_GCM_decrypt_update_aesni_ghash_128 movdqa xmm6, xmm2 - movdqu xmm5, [rsp] + movdqu xmm5, OWORD PTR [rsp] L_AES_GCM_decrypt_update_aesni_done_128: mov edx, r9d cmp edi, edx @@ -5877,16 +5983,16 @@ L_AES_GCM_decrypt_update_aesni_last_block_start: lea rcx, QWORD PTR [r11+rdi] lea rdx, QWORD PTR [r10+rdi] - movdqu xmm1, [rcx] + movdqu xmm1, OWORD PTR [rcx] movdqa xmm0, xmm5 pshufb xmm1, OWORD PTR L_aes_gcm_bswap_mask pxor xmm1, xmm6 - movdqu xmm8, [r15] + movdqu xmm8, OWORD PTR [r15] movdqa xmm9, xmm8 pshufb xmm8, OWORD PTR L_aes_gcm_bswap_epi64 paddd xmm9, OWORD PTR L_aes_gcm_one pxor xmm8, [rax] - movdqu [r15], xmm9 + movdqu OWORD PTR [r15], xmm9 movdqa xmm10, xmm1 pclmulqdq xmm10, xmm0, 16 aesenc xmm8, [rax+16] @@ -5934,16 +6040,26 @@ movdqa xmm9, OWORD PTR [rax+224] L_AES_GCM_decrypt_update_aesni_aesenc_gfmul_last: aesenclast xmm8, xmm9 - movdqu xmm9, [rcx] + movdqu xmm9, OWORD PTR [rcx] pxor xmm8, xmm9 - movdqu [rdx], xmm8 + movdqu OWORD PTR [rdx], xmm8 add edi, 16 cmp edi, r13d jl L_AES_GCM_decrypt_update_aesni_last_block_start L_AES_GCM_decrypt_update_aesni_last_block_done: L_AES_GCM_decrypt_update_aesni_done_dec: movdqa OWORD PTR [r12], xmm6 - add rsp, 168 + movdqu xmm6, OWORD PTR [rsp+168] + movdqu xmm7, OWORD PTR [rsp+184] + movdqu xmm8, OWORD PTR [rsp+200] + movdqu xmm9, OWORD PTR [rsp+216] + movdqu xmm10, OWORD PTR [rsp+232] + movdqu xmm11, OWORD PTR [rsp+248] + movdqu xmm12, OWORD PTR [rsp+264] + movdqu xmm13, OWORD PTR [rsp+280] + movdqu xmm14, OWORD PTR [rsp+296] + movdqu xmm15, OWORD PTR [rsp+312] + add rsp, 328 pop rsi pop rdi pop r15 @@ -5967,20 +6083,29 @@ mov r12, QWORD PTR [rsp+88] mov r14, QWORD PTR [rsp+96] mov rbp, QWORD PTR [rsp+104] - sub rsp, 16 + sub rsp, 160 + movdqu OWORD PTR [rsp+16], xmm6 + movdqu OWORD PTR [rsp+32], xmm7 + movdqu OWORD PTR [rsp+48], xmm8 + movdqu OWORD PTR [rsp+64], xmm9 + movdqu OWORD PTR [rsp+80], xmm10 + movdqu OWORD PTR [rsp+96], xmm11 + movdqu OWORD PTR [rsp+112], xmm12 + movdqu OWORD PTR [rsp+128], xmm13 + movdqu OWORD PTR [rsp+144], xmm15 movdqa xmm6, OWORD PTR [rax] movdqa xmm5, OWORD PTR [r12] movdqa xmm15, OWORD PTR [r14] - movdqa xmm9, xmm5 movdqa xmm8, xmm5 - psrlq xmm9, 63 - psllq xmm8, 1 - pslldq xmm9, 8 - por xmm8, xmm9 + movdqa xmm7, xmm5 + psrlq xmm8, 63 + psllq xmm7, 1 + pslldq xmm8, 8 + por xmm7, xmm8 pshufd xmm5, xmm5, 255 psrad xmm5, 31 pand xmm5, OWORD PTR L_aes_gcm_mod2_128 - pxor xmm5, xmm8 + pxor xmm5, xmm7 mov edx, r10d mov ecx, r11d shl rdx, 3 @@ -5988,46 +6113,46 @@ pinsrq xmm0, rdx, 0 pinsrq xmm0, rcx, 1 pxor xmm6, xmm0 - pshufd xmm9, xmm5, 78 - pshufd xmm10, xmm6, 78 - movdqa xmm11, xmm6 - movdqa xmm8, xmm6 - pclmulqdq xmm11, xmm5, 17 - pclmulqdq xmm8, xmm5, 0 - pxor xmm9, xmm5 - pxor xmm10, xmm6 - pclmulqdq xmm9, xmm10, 0 - pxor xmm9, xmm8 - pxor xmm9, xmm11 - movdqa xmm10, xmm9 - movdqa xmm6, xmm11 - pslldq xmm10, 8 - psrldq xmm9, 8 + pshufd xmm8, xmm5, 78 + pshufd xmm9, xmm6, 78 + movdqa xmm10, xmm6 + movdqa xmm7, xmm6 + pclmulqdq xmm10, xmm5, 17 + pclmulqdq xmm7, xmm5, 0 + pxor xmm8, xmm5 + pxor xmm9, xmm6 + pclmulqdq xmm8, xmm9, 0 + pxor xmm8, xmm7 pxor xmm8, xmm10 - pxor xmm6, xmm9 - movdqa xmm12, xmm8 - movdqa xmm13, xmm8 - movdqa xmm14, xmm8 - pslld xmm12, 31 - pslld xmm13, 30 - pslld xmm14, 25 - pxor xmm12, xmm13 - pxor xmm12, xmm14 - movdqa xmm13, xmm12 - psrldq xmm13, 4 - pslldq xmm12, 12 - pxor xmm8, xmm12 - movdqa xmm14, xmm8 - movdqa xmm10, xmm8 movdqa xmm9, xmm8 - psrld xmm14, 1 - psrld xmm10, 2 - psrld xmm9, 7 - pxor xmm14, xmm10 - pxor xmm14, xmm9 - pxor xmm14, xmm13 - pxor xmm14, xmm8 - pxor xmm6, xmm14 + movdqa xmm6, xmm10 + pslldq xmm9, 8 + psrldq xmm8, 8 + pxor xmm7, xmm9 + pxor xmm6, xmm8 + movdqa xmm11, xmm7 + movdqa xmm12, xmm7 + movdqa xmm13, xmm7 + pslld xmm11, 31 + pslld xmm12, 30 + pslld xmm13, 25 + pxor xmm11, xmm12 + pxor xmm11, xmm13 + movdqa xmm12, xmm11 + psrldq xmm12, 4 + pslldq xmm11, 12 + pxor xmm7, xmm11 + movdqa xmm13, xmm7 + movdqa xmm9, xmm7 + movdqa xmm8, xmm7 + psrld xmm13, 1 + psrld xmm9, 2 + psrld xmm8, 7 + pxor xmm13, xmm9 + pxor xmm13, xmm8 + pxor xmm13, xmm12 + pxor xmm13, xmm7 + pxor xmm6, xmm13 pshufb xmm6, OWORD PTR L_aes_gcm_bswap_mask movdqu xmm0, xmm15 pxor xmm0, xmm6 @@ -6036,7 +6161,7 @@ sub rsp, 16 xor rcx, rcx xor r15, r15 - movdqu [rsp], xmm0 + movdqu OWORD PTR [rsp], xmm0 L_AES_GCM_decrypt_final_aesni_cmp_tag_loop: movzx r13d, BYTE PTR [rsp+rcx] xor r13b, BYTE PTR [r9+rcx] @@ -6044,13 +6169,13 @@ inc ecx cmp ecx, r8d jne L_AES_GCM_decrypt_final_aesni_cmp_tag_loop - cmp r15, 0 + cmp r15b, 0 sete r15b add rsp, 16 xor rcx, rcx jmp L_AES_GCM_decrypt_final_aesni_cmp_tag_done L_AES_GCM_decrypt_final_aesni_cmp_tag_16: - movdqu xmm1, [r9] + movdqu xmm1, OWORD PTR [r9] pcmpeqb xmm0, xmm1 pmovmskb rdx, xmm0 ; %%edx == 0xFFFF then return 1 else => return 0 @@ -6059,7 +6184,16 @@ sete r15b L_AES_GCM_decrypt_final_aesni_cmp_tag_done: mov DWORD PTR [rbp], r15d - add rsp, 16 + movdqu xmm6, OWORD PTR [rsp+16] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm8, OWORD PTR [rsp+48] + movdqu xmm9, OWORD PTR [rsp+64] + movdqu xmm10, OWORD PTR [rsp+80] + movdqu xmm11, OWORD PTR [rsp+96] + movdqu xmm12, OWORD PTR [rsp+112] + movdqu xmm13, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] + add rsp, 160 pop r15 pop rbp pop r14 @@ -6144,7 +6278,17 @@ mov r14d, DWORD PTR [rsp+128] mov r15, QWORD PTR [rsp+136] mov r10d, DWORD PTR [rsp+144] - sub rsp, 160 + sub rsp, 320 + vmovdqu OWORD PTR [rsp+160], xmm6 + vmovdqu OWORD PTR [rsp+176], xmm7 + vmovdqu OWORD PTR [rsp+192], xmm8 + vmovdqu OWORD PTR [rsp+208], xmm9 + vmovdqu OWORD PTR [rsp+224], xmm10 + vmovdqu OWORD PTR [rsp+240], xmm11 + vmovdqu OWORD PTR [rsp+256], xmm12 + vmovdqu OWORD PTR [rsp+272], xmm13 + vmovdqu OWORD PTR [rsp+288], xmm14 + vmovdqu OWORD PTR [rsp+304], xmm15 vpxor xmm4, xmm4, xmm4 vpxor xmm6, xmm6, xmm6 mov edx, ebx @@ -7692,7 +7836,17 @@ vmovdqu OWORD PTR [r8], xmm0 L_AES_GCM_encrypt_avx1_store_tag_done: vzeroupper - add rsp, 160 + vmovdqu xmm6, OWORD PTR [rsp+160] + vmovdqu xmm7, OWORD PTR [rsp+176] + vmovdqu xmm8, OWORD PTR [rsp+192] + vmovdqu xmm9, OWORD PTR [rsp+208] + vmovdqu xmm10, OWORD PTR [rsp+224] + vmovdqu xmm11, OWORD PTR [rsp+240] + vmovdqu xmm12, OWORD PTR [rsp+256] + vmovdqu xmm13, OWORD PTR [rsp+272] + vmovdqu xmm14, OWORD PTR [rsp+288] + vmovdqu xmm15, OWORD PTR [rsp+304] + add rsp, 320 pop r15 pop r14 pop rbx @@ -7725,7 +7879,17 @@ mov r15, QWORD PTR [rsp+144] mov r10d, DWORD PTR [rsp+152] mov rbp, QWORD PTR [rsp+160] - sub rsp, 168 + sub rsp, 328 + vmovdqu OWORD PTR [rsp+168], xmm6 + vmovdqu OWORD PTR [rsp+184], xmm7 + vmovdqu OWORD PTR [rsp+200], xmm8 + vmovdqu OWORD PTR [rsp+216], xmm9 + vmovdqu OWORD PTR [rsp+232], xmm10 + vmovdqu OWORD PTR [rsp+248], xmm11 + vmovdqu OWORD PTR [rsp+264], xmm12 + vmovdqu OWORD PTR [rsp+280], xmm13 + vmovdqu OWORD PTR [rsp+296], xmm14 + vmovdqu OWORD PTR [rsp+312], xmm15 vpxor xmm4, xmm4, xmm4 vpxor xmm6, xmm6, xmm6 cmp ebx, 12 @@ -8848,7 +9012,7 @@ inc ecx cmp ecx, r14d jne L_AES_GCM_decrypt_avx1_cmp_tag_loop - cmp rbx, 0 + cmp bl, 0 sete bl add rsp, 16 xor rcx, rcx @@ -8864,7 +9028,17 @@ L_AES_GCM_decrypt_avx1_cmp_tag_done: mov DWORD PTR [rbp], ebx vzeroupper - add rsp, 168 + vmovdqu xmm6, OWORD PTR [rsp+168] + vmovdqu xmm7, OWORD PTR [rsp+184] + vmovdqu xmm8, OWORD PTR [rsp+200] + vmovdqu xmm9, OWORD PTR [rsp+216] + vmovdqu xmm10, OWORD PTR [rsp+232] + vmovdqu xmm11, OWORD PTR [rsp+248] + vmovdqu xmm12, OWORD PTR [rsp+264] + vmovdqu xmm13, OWORD PTR [rsp+280] + vmovdqu xmm14, OWORD PTR [rsp+296] + vmovdqu xmm15, OWORD PTR [rsp+312] + add rsp, 328 pop rbp pop r15 pop r14 @@ -8889,7 +9063,11 @@ mov rax, QWORD PTR [rsp+72] mov r8, QWORD PTR [rsp+80] mov r9, QWORD PTR [rsp+88] - sub rsp, 16 + sub rsp, 80 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 + vmovdqu OWORD PTR [rsp+48], xmm8 + vmovdqu OWORD PTR [rsp+64], xmm15 vpxor xmm4, xmm4, xmm4 mov edx, r11d cmp edx, 12 @@ -8903,53 +9081,53 @@ ; H = Encrypt X(=0) and T = Encrypt counter vmovdqa xmm5, OWORD PTR [rdi] vpxor xmm1, xmm4, xmm5 - vmovdqa xmm7, OWORD PTR [rdi+16] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+32] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+48] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+64] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+80] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+96] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+112] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+128] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+144] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 + vmovdqa xmm6, OWORD PTR [rdi+16] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+32] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+48] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+64] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+80] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+96] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+112] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+128] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+144] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 cmp esi, 11 - vmovdqa xmm7, OWORD PTR [rdi+160] + vmovdqa xmm6, OWORD PTR [rdi+160] jl L_AES_GCM_init_avx1_calc_iv_12_last - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+176] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+176] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 cmp esi, 13 - vmovdqa xmm7, OWORD PTR [rdi+192] + vmovdqa xmm6, OWORD PTR [rdi+192] jl L_AES_GCM_init_avx1_calc_iv_12_last - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+208] - vaesenc xmm5, xmm5, xmm7 - vaesenc xmm1, xmm1, xmm7 - vmovdqa xmm7, OWORD PTR [rdi+224] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+208] + vaesenc xmm5, xmm5, xmm6 + vaesenc xmm1, xmm1, xmm6 + vmovdqa xmm6, OWORD PTR [rdi+224] L_AES_GCM_init_avx1_calc_iv_12_last: - vaesenclast xmm5, xmm5, xmm7 - vaesenclast xmm1, xmm1, xmm7 + vaesenclast xmm5, xmm5, xmm6 + vaesenclast xmm1, xmm1, xmm6 vpshufb xmm5, xmm5, OWORD PTR L_avx1_aes_gcm_bswap_mask vmovdqu xmm15, xmm1 jmp L_AES_GCM_init_avx1_iv_done @@ -8967,18 +9145,18 @@ vaesenc xmm5, xmm5, [rdi+128] vaesenc xmm5, xmm5, [rdi+144] cmp esi, 11 - vmovdqa xmm9, OWORD PTR [rdi+160] + vmovdqa xmm8, OWORD PTR [rdi+160] jl L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last - vaesenc xmm5, xmm5, xmm9 + vaesenc xmm5, xmm5, xmm8 vaesenc xmm5, xmm5, [rdi+176] cmp esi, 13 - vmovdqa xmm9, OWORD PTR [rdi+192] + vmovdqa xmm8, OWORD PTR [rdi+192] jl L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last - vaesenc xmm5, xmm5, xmm9 + vaesenc xmm5, xmm5, xmm8 vaesenc xmm5, xmm5, [rdi+208] - vmovdqa xmm9, OWORD PTR [rdi+224] + vmovdqa xmm8, OWORD PTR [rdi+224] L_AES_GCM_init_avx1_calc_iv_1_aesenc_avx_last: - vaesenclast xmm5, xmm5, xmm9 + vaesenclast xmm5, xmm5, xmm8 vpshufb xmm5, xmm5, OWORD PTR L_avx1_aes_gcm_bswap_mask ; Calc counter ; Initialization vector @@ -8989,9 +9167,9 @@ jl L_AES_GCM_init_avx1_calc_iv_lt16 and edx, 4294967280 L_AES_GCM_init_avx1_calc_iv_16_loop: - vmovdqu xmm8, OWORD PTR [r10+rcx] - vpshufb xmm8, xmm8, OWORD PTR L_avx1_aes_gcm_bswap_mask - vpxor xmm4, xmm4, xmm8 + vmovdqu xmm7, OWORD PTR [r10+rcx] + vpshufb xmm7, xmm7, OWORD PTR L_avx1_aes_gcm_bswap_mask + vpxor xmm4, xmm4, xmm7 ; ghash_gfmul_avx vpshufd xmm1, xmm4, 78 vpshufd xmm2, xmm5, 78 @@ -9002,38 +9180,38 @@ vpclmulqdq xmm1, xmm1, xmm2, 0 vpxor xmm1, xmm1, xmm0 vpxor xmm1, xmm1, xmm3 - vmovdqa xmm7, xmm0 + vmovdqa xmm6, xmm0 vmovdqa xmm4, xmm3 vpslldq xmm2, xmm1, 8 vpsrldq xmm1, xmm1, 8 - vpxor xmm7, xmm7, xmm2 + vpxor xmm6, xmm6, xmm2 vpxor xmm4, xmm4, xmm1 - vpsrld xmm0, xmm7, 31 + vpsrld xmm0, xmm6, 31 vpsrld xmm1, xmm4, 31 - vpslld xmm7, xmm7, 1 + vpslld xmm6, xmm6, 1 vpslld xmm4, xmm4, 1 vpsrldq xmm2, xmm0, 12 vpslldq xmm0, xmm0, 4 vpslldq xmm1, xmm1, 4 vpor xmm4, xmm4, xmm2 - vpor xmm7, xmm7, xmm0 + vpor xmm6, xmm6, xmm0 vpor xmm4, xmm4, xmm1 - vpslld xmm0, xmm7, 31 - vpslld xmm1, xmm7, 30 - vpslld xmm2, xmm7, 25 + vpslld xmm0, xmm6, 31 + vpslld xmm1, xmm6, 30 + vpslld xmm2, xmm6, 25 vpxor xmm0, xmm0, xmm1 vpxor xmm0, xmm0, xmm2 vmovdqa xmm1, xmm0 vpsrldq xmm1, xmm1, 4 vpslldq xmm0, xmm0, 12 - vpxor xmm7, xmm7, xmm0 - vpsrld xmm2, xmm7, 1 - vpsrld xmm3, xmm7, 2 - vpsrld xmm0, xmm7, 7 + vpxor xmm6, xmm6, xmm0 + vpsrld xmm2, xmm6, 1 + vpsrld xmm3, xmm6, 2 + vpsrld xmm0, xmm6, 7 vpxor xmm2, xmm2, xmm3 vpxor xmm2, xmm2, xmm0 vpxor xmm2, xmm2, xmm1 - vpxor xmm2, xmm2, xmm7 + vpxor xmm2, xmm2, xmm6 vpxor xmm4, xmm4, xmm2 add ecx, 16 cmp ecx, edx @@ -9043,9 +9221,9 @@ je L_AES_GCM_init_avx1_calc_iv_done L_AES_GCM_init_avx1_calc_iv_lt16: sub rsp, 16 - vpxor xmm8, xmm8, xmm8 + vpxor xmm7, xmm7, xmm7 xor r13d, r13d - vmovdqu OWORD PTR [rsp], xmm8 + vmovdqu OWORD PTR [rsp], xmm7 L_AES_GCM_init_avx1_calc_iv_loop: movzx r12d, BYTE PTR [r10+rcx] mov BYTE PTR [rsp+r13], r12b @@ -9053,10 +9231,10 @@ inc r13d cmp ecx, edx jl L_AES_GCM_init_avx1_calc_iv_loop - vmovdqu xmm8, OWORD PTR [rsp] + vmovdqu xmm7, OWORD PTR [rsp] add rsp, 16 - vpshufb xmm8, xmm8, OWORD PTR L_avx1_aes_gcm_bswap_mask - vpxor xmm4, xmm4, xmm8 + vpshufb xmm7, xmm7, OWORD PTR L_avx1_aes_gcm_bswap_mask + vpxor xmm4, xmm4, xmm7 ; ghash_gfmul_avx vpshufd xmm1, xmm4, 78 vpshufd xmm2, xmm5, 78 @@ -9067,38 +9245,38 @@ vpclmulqdq xmm1, xmm1, xmm2, 0 vpxor xmm1, xmm1, xmm0 vpxor xmm1, xmm1, xmm3 - vmovdqa xmm7, xmm0 + vmovdqa xmm6, xmm0 vmovdqa xmm4, xmm3 vpslldq xmm2, xmm1, 8 vpsrldq xmm1, xmm1, 8 - vpxor xmm7, xmm7, xmm2 + vpxor xmm6, xmm6, xmm2 vpxor xmm4, xmm4, xmm1 - vpsrld xmm0, xmm7, 31 + vpsrld xmm0, xmm6, 31 vpsrld xmm1, xmm4, 31 - vpslld xmm7, xmm7, 1 + vpslld xmm6, xmm6, 1 vpslld xmm4, xmm4, 1 vpsrldq xmm2, xmm0, 12 vpslldq xmm0, xmm0, 4 vpslldq xmm1, xmm1, 4 vpor xmm4, xmm4, xmm2 - vpor xmm7, xmm7, xmm0 + vpor xmm6, xmm6, xmm0 vpor xmm4, xmm4, xmm1 - vpslld xmm0, xmm7, 31 - vpslld xmm1, xmm7, 30 - vpslld xmm2, xmm7, 25 + vpslld xmm0, xmm6, 31 + vpslld xmm1, xmm6, 30 + vpslld xmm2, xmm6, 25 vpxor xmm0, xmm0, xmm1 vpxor xmm0, xmm0, xmm2 vmovdqa xmm1, xmm0 vpsrldq xmm1, xmm1, 4 vpslldq xmm0, xmm0, 12 - vpxor xmm7, xmm7, xmm0 - vpsrld xmm2, xmm7, 1 - vpsrld xmm3, xmm7, 2 - vpsrld xmm0, xmm7, 7 + vpxor xmm6, xmm6, xmm0 + vpsrld xmm2, xmm6, 1 + vpsrld xmm3, xmm6, 2 + vpsrld xmm0, xmm6, 7 vpxor xmm2, xmm2, xmm3 vpxor xmm2, xmm2, xmm0 vpxor xmm2, xmm2, xmm1 - vpxor xmm2, xmm2, xmm7 + vpxor xmm2, xmm2, xmm6 vpxor xmm4, xmm4, xmm2 L_AES_GCM_init_avx1_calc_iv_done: ; T = Encrypt counter @@ -9116,66 +9294,66 @@ vpclmulqdq xmm1, xmm1, xmm2, 0 vpxor xmm1, xmm1, xmm0 vpxor xmm1, xmm1, xmm3 - vmovdqa xmm7, xmm0 + vmovdqa xmm6, xmm0 vmovdqa xmm4, xmm3 vpslldq xmm2, xmm1, 8 vpsrldq xmm1, xmm1, 8 - vpxor xmm7, xmm7, xmm2 + vpxor xmm6, xmm6, xmm2 vpxor xmm4, xmm4, xmm1 - vpsrld xmm0, xmm7, 31 + vpsrld xmm0, xmm6, 31 vpsrld xmm1, xmm4, 31 - vpslld xmm7, xmm7, 1 + vpslld xmm6, xmm6, 1 vpslld xmm4, xmm4, 1 vpsrldq xmm2, xmm0, 12 vpslldq xmm0, xmm0, 4 vpslldq xmm1, xmm1, 4 vpor xmm4, xmm4, xmm2 - vpor xmm7, xmm7, xmm0 + vpor xmm6, xmm6, xmm0 vpor xmm4, xmm4, xmm1 - vpslld xmm0, xmm7, 31 - vpslld xmm1, xmm7, 30 - vpslld xmm2, xmm7, 25 + vpslld xmm0, xmm6, 31 + vpslld xmm1, xmm6, 30 + vpslld xmm2, xmm6, 25 vpxor xmm0, xmm0, xmm1 vpxor xmm0, xmm0, xmm2 vmovdqa xmm1, xmm0 vpsrldq xmm1, xmm1, 4 vpslldq xmm0, xmm0, 12 - vpxor xmm7, xmm7, xmm0 - vpsrld xmm2, xmm7, 1 - vpsrld xmm3, xmm7, 2 - vpsrld xmm0, xmm7, 7 + vpxor xmm6, xmm6, xmm0 + vpsrld xmm2, xmm6, 1 + vpsrld xmm3, xmm6, 2 + vpsrld xmm0, xmm6, 7 vpxor xmm2, xmm2, xmm3 vpxor xmm2, xmm2, xmm0 vpxor xmm2, xmm2, xmm1 - vpxor xmm2, xmm2, xmm7 + vpxor xmm2, xmm2, xmm6 vpxor xmm4, xmm4, xmm2 vpshufb xmm4, xmm4, OWORD PTR L_avx1_aes_gcm_bswap_mask ; Encrypt counter - vmovdqa xmm8, OWORD PTR [rdi] - vpxor xmm8, xmm8, xmm4 - vaesenc xmm8, xmm8, [rdi+16] - vaesenc xmm8, xmm8, [rdi+32] - vaesenc xmm8, xmm8, [rdi+48] - vaesenc xmm8, xmm8, [rdi+64] - vaesenc xmm8, xmm8, [rdi+80] - vaesenc xmm8, xmm8, [rdi+96] - vaesenc xmm8, xmm8, [rdi+112] - vaesenc xmm8, xmm8, [rdi+128] - vaesenc xmm8, xmm8, [rdi+144] + vmovdqa xmm7, OWORD PTR [rdi] + vpxor xmm7, xmm7, xmm4 + vaesenc xmm7, xmm7, [rdi+16] + vaesenc xmm7, xmm7, [rdi+32] + vaesenc xmm7, xmm7, [rdi+48] + vaesenc xmm7, xmm7, [rdi+64] + vaesenc xmm7, xmm7, [rdi+80] + vaesenc xmm7, xmm7, [rdi+96] + vaesenc xmm7, xmm7, [rdi+112] + vaesenc xmm7, xmm7, [rdi+128] + vaesenc xmm7, xmm7, [rdi+144] cmp esi, 11 - vmovdqa xmm9, OWORD PTR [rdi+160] + vmovdqa xmm8, OWORD PTR [rdi+160] jl L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last - vaesenc xmm8, xmm8, xmm9 - vaesenc xmm8, xmm8, [rdi+176] + vaesenc xmm7, xmm7, xmm8 + vaesenc xmm7, xmm7, [rdi+176] cmp esi, 13 - vmovdqa xmm9, OWORD PTR [rdi+192] + vmovdqa xmm8, OWORD PTR [rdi+192] jl L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last - vaesenc xmm8, xmm8, xmm9 - vaesenc xmm8, xmm8, [rdi+208] - vmovdqa xmm9, OWORD PTR [rdi+224] + vaesenc xmm7, xmm7, xmm8 + vaesenc xmm7, xmm7, [rdi+208] + vmovdqa xmm8, OWORD PTR [rdi+224] L_AES_GCM_init_avx1_calc_iv_2_aesenc_avx_last: - vaesenclast xmm8, xmm8, xmm9 - vmovdqu xmm15, xmm8 + vaesenclast xmm7, xmm7, xmm8 + vmovdqu xmm15, xmm7 L_AES_GCM_init_avx1_iv_done: vmovdqa OWORD PTR [r9], xmm15 vpshufb xmm4, xmm4, OWORD PTR L_avx1_aes_gcm_bswap_epi64 @@ -9183,7 +9361,11 @@ vmovdqa OWORD PTR [rax], xmm5 vmovdqa OWORD PTR [r8], xmm4 vzeroupper - add rsp, 16 + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + vmovdqu xmm8, OWORD PTR [rsp+48] + vmovdqu xmm15, OWORD PTR [rsp+64] + add rsp, 80 pop r13 pop r12 pop rsi @@ -9194,13 +9376,16 @@ _text SEGMENT READONLY PARA AES_GCM_aad_update_avx1 PROC mov rax, rcx + sub rsp, 32 + vmovdqu OWORD PTR [rsp], xmm6 + vmovdqu OWORD PTR [rsp+16], xmm7 vmovdqa xmm5, OWORD PTR [r8] vmovdqa xmm6, OWORD PTR [r9] xor ecx, ecx L_AES_GCM_aad_update_avx1_16_loop: - vmovdqu xmm8, OWORD PTR [rax+rcx] - vpshufb xmm8, xmm8, OWORD PTR L_avx1_aes_gcm_bswap_mask - vpxor xmm5, xmm5, xmm8 + vmovdqu xmm7, OWORD PTR [rax+rcx] + vpshufb xmm7, xmm7, OWORD PTR L_avx1_aes_gcm_bswap_mask + vpxor xmm5, xmm5, xmm7 ; ghash_gfmul_avx vpshufd xmm1, xmm5, 78 vpshufd xmm2, xmm6, 78 @@ -9249,6 +9434,9 @@ jl L_AES_GCM_aad_update_avx1_16_loop vmovdqa OWORD PTR [r8], xmm5 vzeroupper + vmovdqu xmm6, OWORD PTR [rsp] + vmovdqu xmm7, OWORD PTR [rsp+16] + add rsp, 32 ret AES_GCM_aad_update_avx1 ENDP _text ENDS @@ -9257,48 +9445,51 @@ mov r10, r8 mov r11, r9 mov rax, QWORD PTR [rsp+40] - vmovdqu xmm9, OWORD PTR [rax] - vpshufb xmm8, xmm9, OWORD PTR L_avx1_aes_gcm_bswap_epi64 - vpaddd xmm9, xmm9, OWORD PTR L_avx1_aes_gcm_one - vmovdqu OWORD PTR [rax], xmm9 - vpxor xmm8, xmm8, [rcx] - vaesenc xmm8, xmm8, [rcx+16] - vaesenc xmm8, xmm8, [rcx+32] - vaesenc xmm8, xmm8, [rcx+48] - vaesenc xmm8, xmm8, [rcx+64] - vaesenc xmm8, xmm8, [rcx+80] - vaesenc xmm8, xmm8, [rcx+96] - vaesenc xmm8, xmm8, [rcx+112] - vaesenc xmm8, xmm8, [rcx+128] - vaesenc xmm8, xmm8, [rcx+144] + vmovdqu xmm1, OWORD PTR [rax] + vpshufb xmm0, xmm1, OWORD PTR L_avx1_aes_gcm_bswap_epi64 + vpaddd xmm1, xmm1, OWORD PTR L_avx1_aes_gcm_one + vmovdqu OWORD PTR [rax], xmm1 + vpxor xmm0, xmm0, [rcx] + vaesenc xmm0, xmm0, [rcx+16] + vaesenc xmm0, xmm0, [rcx+32] + vaesenc xmm0, xmm0, [rcx+48] + vaesenc xmm0, xmm0, [rcx+64] + vaesenc xmm0, xmm0, [rcx+80] + vaesenc xmm0, xmm0, [rcx+96] + vaesenc xmm0, xmm0, [rcx+112] + vaesenc xmm0, xmm0, [rcx+128] + vaesenc xmm0, xmm0, [rcx+144] cmp edx, 11 - vmovdqa xmm9, OWORD PTR [rcx+160] + vmovdqa xmm1, OWORD PTR [rcx+160] jl L_AES_GCM_encrypt_block_avx1_aesenc_block_last - vaesenc xmm8, xmm8, xmm9 - vaesenc xmm8, xmm8, [rcx+176] + vaesenc xmm0, xmm0, xmm1 + vaesenc xmm0, xmm0, [rcx+176] cmp edx, 13 - vmovdqa xmm9, OWORD PTR [rcx+192] + vmovdqa xmm1, OWORD PTR [rcx+192] jl L_AES_GCM_encrypt_block_avx1_aesenc_block_last - vaesenc xmm8, xmm8, xmm9 - vaesenc xmm8, xmm8, [rcx+208] - vmovdqa xmm9, OWORD PTR [rcx+224] + vaesenc xmm0, xmm0, xmm1 + vaesenc xmm0, xmm0, [rcx+208] + vmovdqa xmm1, OWORD PTR [rcx+224] L_AES_GCM_encrypt_block_avx1_aesenc_block_last: - vaesenclast xmm8, xmm8, xmm9 - vmovdqu xmm9, OWORD PTR [r11] - vpxor xmm8, xmm8, xmm9 - vmovdqu OWORD PTR [r10], xmm8 - vpshufb xmm8, xmm8, OWORD PTR L_avx1_aes_gcm_bswap_mask + vaesenclast xmm0, xmm0, xmm1 + vmovdqu xmm1, OWORD PTR [r11] + vpxor xmm0, xmm0, xmm1 + vmovdqu OWORD PTR [r10], xmm0 + vpshufb xmm0, xmm0, OWORD PTR L_avx1_aes_gcm_bswap_mask vzeroupper ret AES_GCM_encrypt_block_avx1 ENDP _text ENDS _text SEGMENT READONLY PARA AES_GCM_ghash_block_avx1 PROC + sub rsp, 32 + vmovdqu OWORD PTR [rsp], xmm6 + vmovdqu OWORD PTR [rsp+16], xmm7 vmovdqa xmm4, OWORD PTR [rdx] vmovdqa xmm5, OWORD PTR [r8] - vmovdqu xmm8, OWORD PTR [rcx] - vpshufb xmm8, xmm8, OWORD PTR L_avx1_aes_gcm_bswap_mask - vpxor xmm4, xmm4, xmm8 + vmovdqu xmm7, OWORD PTR [rcx] + vpshufb xmm7, xmm7, OWORD PTR L_avx1_aes_gcm_bswap_mask + vpxor xmm4, xmm4, xmm7 ; ghash_gfmul_avx vpshufd xmm1, xmm4, 78 vpshufd xmm2, xmm5, 78 @@ -9344,6 +9535,9 @@ vpxor xmm4, xmm4, xmm2 vmovdqa OWORD PTR [rdx], xmm4 vzeroupper + vmovdqu xmm6, OWORD PTR [rsp] + vmovdqu xmm7, OWORD PTR [rsp+16] + add rsp, 32 ret AES_GCM_ghash_block_avx1 ENDP _text ENDS @@ -9362,7 +9556,17 @@ mov r12, QWORD PTR [rsp+88] mov r14, QWORD PTR [rsp+96] mov r15, QWORD PTR [rsp+104] - sub rsp, 160 + sub rsp, 320 + vmovdqu OWORD PTR [rsp+160], xmm6 + vmovdqu OWORD PTR [rsp+176], xmm7 + vmovdqu OWORD PTR [rsp+192], xmm8 + vmovdqu OWORD PTR [rsp+208], xmm9 + vmovdqu OWORD PTR [rsp+224], xmm10 + vmovdqu OWORD PTR [rsp+240], xmm11 + vmovdqu OWORD PTR [rsp+256], xmm12 + vmovdqu OWORD PTR [rsp+272], xmm13 + vmovdqu OWORD PTR [rsp+288], xmm14 + vmovdqu OWORD PTR [rsp+304], xmm15 vmovdqa xmm6, OWORD PTR [r12] vmovdqa xmm5, OWORD PTR [r14] vpsrlq xmm9, xmm5, 63 @@ -10360,7 +10564,17 @@ L_AES_GCM_encrypt_update_avx1_done_enc: vmovdqa OWORD PTR [r12], xmm6 vzeroupper - add rsp, 160 + vmovdqu xmm6, OWORD PTR [rsp+160] + vmovdqu xmm7, OWORD PTR [rsp+176] + vmovdqu xmm8, OWORD PTR [rsp+192] + vmovdqu xmm9, OWORD PTR [rsp+208] + vmovdqu xmm10, OWORD PTR [rsp+224] + vmovdqu xmm11, OWORD PTR [rsp+240] + vmovdqu xmm12, OWORD PTR [rsp+256] + vmovdqu xmm13, OWORD PTR [rsp+272] + vmovdqu xmm14, OWORD PTR [rsp+288] + vmovdqu xmm15, OWORD PTR [rsp+304] + add rsp, 320 pop rdi pop r15 pop r14 @@ -10380,18 +10594,26 @@ mov r11d, DWORD PTR [rsp+64] mov r12, QWORD PTR [rsp+72] mov r14, QWORD PTR [rsp+80] - sub rsp, 16 + sub rsp, 144 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 + vmovdqu OWORD PTR [rsp+48], xmm8 + vmovdqu OWORD PTR [rsp+64], xmm9 + vmovdqu OWORD PTR [rsp+80], xmm10 + vmovdqu OWORD PTR [rsp+96], xmm11 + vmovdqu OWORD PTR [rsp+112], xmm12 + vmovdqu OWORD PTR [rsp+128], xmm13 vmovdqa xmm4, OWORD PTR [rax] vmovdqa xmm5, OWORD PTR [r12] vmovdqa xmm6, OWORD PTR [r14] - vpsrlq xmm9, xmm5, 63 - vpsllq xmm8, xmm5, 1 - vpslldq xmm9, xmm9, 8 - vpor xmm8, xmm8, xmm9 + vpsrlq xmm8, xmm5, 63 + vpsllq xmm7, xmm5, 1 + vpslldq xmm8, xmm8, 8 + vpor xmm7, xmm7, xmm8 vpshufd xmm5, xmm5, 255 vpsrad xmm5, xmm5, 31 vpand xmm5, xmm5, OWORD PTR L_avx1_aes_gcm_mod2_128 - vpxor xmm5, xmm5, xmm8 + vpxor xmm5, xmm5, xmm7 mov edx, r10d mov ecx, r11d shl rdx, 3 @@ -10401,35 +10623,35 @@ vpunpcklqdq xmm0, xmm0, xmm1 vpxor xmm4, xmm4, xmm0 ; ghash_gfmul_red_avx - vpshufd xmm9, xmm5, 78 - vpshufd xmm10, xmm4, 78 - vpclmulqdq xmm11, xmm4, xmm5, 17 - vpclmulqdq xmm8, xmm4, xmm5, 0 - vpxor xmm9, xmm9, xmm5 - vpxor xmm10, xmm10, xmm4 - vpclmulqdq xmm9, xmm9, xmm10, 0 - vpxor xmm9, xmm9, xmm8 - vpxor xmm9, xmm9, xmm11 - vpslldq xmm10, xmm9, 8 - vpsrldq xmm9, xmm9, 8 + vpshufd xmm8, xmm5, 78 + vpshufd xmm9, xmm4, 78 + vpclmulqdq xmm10, xmm4, xmm5, 17 + vpclmulqdq xmm7, xmm4, xmm5, 0 + vpxor xmm8, xmm8, xmm5 + vpxor xmm9, xmm9, xmm4 + vpclmulqdq xmm8, xmm8, xmm9, 0 + vpxor xmm8, xmm8, xmm7 vpxor xmm8, xmm8, xmm10 - vpxor xmm4, xmm11, xmm9 - vpslld xmm12, xmm8, 31 - vpslld xmm13, xmm8, 30 - vpslld xmm14, xmm8, 25 - vpxor xmm12, xmm12, xmm13 - vpxor xmm12, xmm12, xmm14 - vpsrldq xmm13, xmm12, 4 - vpslldq xmm12, xmm12, 12 - vpxor xmm8, xmm8, xmm12 - vpsrld xmm14, xmm8, 1 - vpsrld xmm10, xmm8, 2 - vpsrld xmm9, xmm8, 7 - vpxor xmm14, xmm14, xmm10 - vpxor xmm14, xmm14, xmm9 - vpxor xmm14, xmm14, xmm13 - vpxor xmm14, xmm14, xmm8 - vpxor xmm4, xmm4, xmm14 + vpslldq xmm9, xmm8, 8 + vpsrldq xmm8, xmm8, 8 + vpxor xmm7, xmm7, xmm9 + vpxor xmm4, xmm10, xmm8 + vpslld xmm11, xmm7, 31 + vpslld xmm12, xmm7, 30 + vpslld xmm13, xmm7, 25 + vpxor xmm11, xmm11, xmm12 + vpxor xmm11, xmm11, xmm13 + vpsrldq xmm12, xmm11, 4 + vpslldq xmm11, xmm11, 12 + vpxor xmm7, xmm7, xmm11 + vpsrld xmm13, xmm7, 1 + vpsrld xmm9, xmm7, 2 + vpsrld xmm8, xmm7, 7 + vpxor xmm13, xmm13, xmm9 + vpxor xmm13, xmm13, xmm8 + vpxor xmm13, xmm13, xmm12 + vpxor xmm13, xmm13, xmm7 + vpxor xmm4, xmm4, xmm13 vpshufb xmm4, xmm4, OWORD PTR L_avx1_aes_gcm_bswap_mask vpxor xmm0, xmm4, xmm6 cmp r8d, 16 @@ -10447,7 +10669,15 @@ vmovdqu OWORD PTR [r9], xmm0 L_AES_GCM_encrypt_final_avx1_store_tag_done: vzeroupper - add rsp, 16 + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + vmovdqu xmm8, OWORD PTR [rsp+48] + vmovdqu xmm9, OWORD PTR [rsp+64] + vmovdqu xmm10, OWORD PTR [rsp+80] + vmovdqu xmm11, OWORD PTR [rsp+96] + vmovdqu xmm12, OWORD PTR [rsp+112] + vmovdqu xmm13, OWORD PTR [rsp+128] + add rsp, 144 pop r14 pop r12 pop r13 @@ -10469,7 +10699,17 @@ mov r12, QWORD PTR [rsp+88] mov r14, QWORD PTR [rsp+96] mov r15, QWORD PTR [rsp+104] - sub rsp, 168 + sub rsp, 328 + vmovdqu OWORD PTR [rsp+168], xmm6 + vmovdqu OWORD PTR [rsp+184], xmm7 + vmovdqu OWORD PTR [rsp+200], xmm8 + vmovdqu OWORD PTR [rsp+216], xmm9 + vmovdqu OWORD PTR [rsp+232], xmm10 + vmovdqu OWORD PTR [rsp+248], xmm11 + vmovdqu OWORD PTR [rsp+264], xmm12 + vmovdqu OWORD PTR [rsp+280], xmm13 + vmovdqu OWORD PTR [rsp+296], xmm14 + vmovdqu OWORD PTR [rsp+312], xmm15 vmovdqa xmm6, OWORD PTR [r12] vmovdqa xmm5, OWORD PTR [r14] vpsrlq xmm9, xmm5, 63 @@ -11051,7 +11291,17 @@ L_AES_GCM_decrypt_update_avx1_done_dec: vmovdqa OWORD PTR [r12], xmm6 vzeroupper - add rsp, 168 + vmovdqu xmm6, OWORD PTR [rsp+168] + vmovdqu xmm7, OWORD PTR [rsp+184] + vmovdqu xmm8, OWORD PTR [rsp+200] + vmovdqu xmm9, OWORD PTR [rsp+216] + vmovdqu xmm10, OWORD PTR [rsp+232] + vmovdqu xmm11, OWORD PTR [rsp+248] + vmovdqu xmm12, OWORD PTR [rsp+264] + vmovdqu xmm13, OWORD PTR [rsp+280] + vmovdqu xmm14, OWORD PTR [rsp+296] + vmovdqu xmm15, OWORD PTR [rsp+312] + add rsp, 328 pop rdi pop r15 pop r14 @@ -11074,18 +11324,27 @@ mov r12, QWORD PTR [rsp+88] mov r14, QWORD PTR [rsp+96] mov rbp, QWORD PTR [rsp+104] - sub rsp, 16 + sub rsp, 160 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 + vmovdqu OWORD PTR [rsp+48], xmm8 + vmovdqu OWORD PTR [rsp+64], xmm9 + vmovdqu OWORD PTR [rsp+80], xmm10 + vmovdqu OWORD PTR [rsp+96], xmm11 + vmovdqu OWORD PTR [rsp+112], xmm12 + vmovdqu OWORD PTR [rsp+128], xmm13 + vmovdqu OWORD PTR [rsp+144], xmm15 vmovdqa xmm6, OWORD PTR [rax] vmovdqa xmm5, OWORD PTR [r12] vmovdqa xmm15, OWORD PTR [r14] - vpsrlq xmm9, xmm5, 63 - vpsllq xmm8, xmm5, 1 - vpslldq xmm9, xmm9, 8 - vpor xmm8, xmm8, xmm9 + vpsrlq xmm8, xmm5, 63 + vpsllq xmm7, xmm5, 1 + vpslldq xmm8, xmm8, 8 + vpor xmm7, xmm7, xmm8 vpshufd xmm5, xmm5, 255 vpsrad xmm5, xmm5, 31 vpand xmm5, xmm5, OWORD PTR L_avx1_aes_gcm_mod2_128 - vpxor xmm5, xmm5, xmm8 + vpxor xmm5, xmm5, xmm7 mov edx, r10d mov ecx, r11d shl rdx, 3 @@ -11095,35 +11354,35 @@ vpunpcklqdq xmm0, xmm0, xmm1 vpxor xmm6, xmm6, xmm0 ; ghash_gfmul_red_avx - vpshufd xmm9, xmm5, 78 - vpshufd xmm10, xmm6, 78 - vpclmulqdq xmm11, xmm6, xmm5, 17 - vpclmulqdq xmm8, xmm6, xmm5, 0 - vpxor xmm9, xmm9, xmm5 - vpxor xmm10, xmm10, xmm6 - vpclmulqdq xmm9, xmm9, xmm10, 0 - vpxor xmm9, xmm9, xmm8 - vpxor xmm9, xmm9, xmm11 - vpslldq xmm10, xmm9, 8 - vpsrldq xmm9, xmm9, 8 + vpshufd xmm8, xmm5, 78 + vpshufd xmm9, xmm6, 78 + vpclmulqdq xmm10, xmm6, xmm5, 17 + vpclmulqdq xmm7, xmm6, xmm5, 0 + vpxor xmm8, xmm8, xmm5 + vpxor xmm9, xmm9, xmm6 + vpclmulqdq xmm8, xmm8, xmm9, 0 + vpxor xmm8, xmm8, xmm7 vpxor xmm8, xmm8, xmm10 - vpxor xmm6, xmm11, xmm9 - vpslld xmm12, xmm8, 31 - vpslld xmm13, xmm8, 30 - vpslld xmm14, xmm8, 25 - vpxor xmm12, xmm12, xmm13 - vpxor xmm12, xmm12, xmm14 - vpsrldq xmm13, xmm12, 4 - vpslldq xmm12, xmm12, 12 - vpxor xmm8, xmm8, xmm12 - vpsrld xmm14, xmm8, 1 - vpsrld xmm10, xmm8, 2 - vpsrld xmm9, xmm8, 7 - vpxor xmm14, xmm14, xmm10 - vpxor xmm14, xmm14, xmm9 - vpxor xmm14, xmm14, xmm13 - vpxor xmm14, xmm14, xmm8 - vpxor xmm6, xmm6, xmm14 + vpslldq xmm9, xmm8, 8 + vpsrldq xmm8, xmm8, 8 + vpxor xmm7, xmm7, xmm9 + vpxor xmm6, xmm10, xmm8 + vpslld xmm11, xmm7, 31 + vpslld xmm12, xmm7, 30 + vpslld xmm13, xmm7, 25 + vpxor xmm11, xmm11, xmm12 + vpxor xmm11, xmm11, xmm13 + vpsrldq xmm12, xmm11, 4 + vpslldq xmm11, xmm11, 12 + vpxor xmm7, xmm7, xmm11 + vpsrld xmm13, xmm7, 1 + vpsrld xmm9, xmm7, 2 + vpsrld xmm8, xmm7, 7 + vpxor xmm13, xmm13, xmm9 + vpxor xmm13, xmm13, xmm8 + vpxor xmm13, xmm13, xmm12 + vpxor xmm13, xmm13, xmm7 + vpxor xmm6, xmm6, xmm13 vpshufb xmm6, xmm6, OWORD PTR L_avx1_aes_gcm_bswap_mask vpxor xmm0, xmm6, xmm15 cmp r8d, 16 @@ -11139,7 +11398,7 @@ inc ecx cmp ecx, r8d jne L_AES_GCM_decrypt_final_avx1_cmp_tag_loop - cmp r15, 0 + cmp r15b, 0 sete r15b add rsp, 16 xor rcx, rcx @@ -11155,7 +11414,16 @@ L_AES_GCM_decrypt_final_avx1_cmp_tag_done: mov DWORD PTR [rbp], r15d vzeroupper - add rsp, 16 + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + vmovdqu xmm8, OWORD PTR [rsp+48] + vmovdqu xmm9, OWORD PTR [rsp+64] + vmovdqu xmm10, OWORD PTR [rsp+80] + vmovdqu xmm11, OWORD PTR [rsp+96] + vmovdqu xmm12, OWORD PTR [rsp+112] + vmovdqu xmm13, OWORD PTR [rsp+128] + vmovdqu xmm15, OWORD PTR [rsp+144] + add rsp, 160 pop r15 pop rbp pop r14 @@ -11246,7 +11514,17 @@ mov r14d, DWORD PTR [rsp+128] mov rsi, QWORD PTR [rsp+136] mov r9d, DWORD PTR [rsp+144] - sub rsp, 160 + sub rsp, 320 + vmovdqu OWORD PTR [rsp+160], xmm6 + vmovdqu OWORD PTR [rsp+176], xmm7 + vmovdqu OWORD PTR [rsp+192], xmm8 + vmovdqu OWORD PTR [rsp+208], xmm9 + vmovdqu OWORD PTR [rsp+224], xmm10 + vmovdqu OWORD PTR [rsp+240], xmm11 + vmovdqu OWORD PTR [rsp+256], xmm12 + vmovdqu OWORD PTR [rsp+272], xmm13 + vmovdqu OWORD PTR [rsp+288], xmm14 + vmovdqu OWORD PTR [rsp+304], xmm15 vpxor xmm4, xmm4, xmm4 vpxor xmm6, xmm6, xmm6 mov edx, ebx @@ -12517,7 +12795,17 @@ vmovdqu OWORD PTR [r15], xmm0 L_AES_GCM_encrypt_avx2_store_tag_done: vzeroupper - add rsp, 160 + vmovdqu xmm6, OWORD PTR [rsp+160] + vmovdqu xmm7, OWORD PTR [rsp+176] + vmovdqu xmm8, OWORD PTR [rsp+192] + vmovdqu xmm9, OWORD PTR [rsp+208] + vmovdqu xmm10, OWORD PTR [rsp+224] + vmovdqu xmm11, OWORD PTR [rsp+240] + vmovdqu xmm12, OWORD PTR [rsp+256] + vmovdqu xmm13, OWORD PTR [rsp+272] + vmovdqu xmm14, OWORD PTR [rsp+288] + vmovdqu xmm15, OWORD PTR [rsp+304] + add rsp, 320 pop rsi pop r14 pop rbx @@ -12550,7 +12838,17 @@ mov rsi, QWORD PTR [rsp+144] mov r9d, DWORD PTR [rsp+152] mov rbp, QWORD PTR [rsp+160] - sub rsp, 168 + sub rsp, 328 + vmovdqu OWORD PTR [rsp+168], xmm6 + vmovdqu OWORD PTR [rsp+184], xmm7 + vmovdqu OWORD PTR [rsp+200], xmm8 + vmovdqu OWORD PTR [rsp+216], xmm9 + vmovdqu OWORD PTR [rsp+232], xmm10 + vmovdqu OWORD PTR [rsp+248], xmm11 + vmovdqu OWORD PTR [rsp+264], xmm12 + vmovdqu OWORD PTR [rsp+280], xmm13 + vmovdqu OWORD PTR [rsp+296], xmm14 + vmovdqu OWORD PTR [rsp+312], xmm15 vpxor xmm4, xmm4, xmm4 vpxor xmm6, xmm6, xmm6 mov edx, ebx @@ -13467,7 +13765,7 @@ inc edx cmp edx, r15d jne L_AES_GCM_decrypt_avx2_cmp_tag_loop - cmp rax, 0 + cmp al, 0 sete al jmp L_AES_GCM_decrypt_avx2_cmp_tag_done L_AES_GCM_decrypt_avx2_cmp_tag_16: @@ -13481,7 +13779,17 @@ L_AES_GCM_decrypt_avx2_cmp_tag_done: mov DWORD PTR [rbp], eax vzeroupper - add rsp, 168 + vmovdqu xmm6, OWORD PTR [rsp+168] + vmovdqu xmm7, OWORD PTR [rsp+184] + vmovdqu xmm8, OWORD PTR [rsp+200] + vmovdqu xmm9, OWORD PTR [rsp+216] + vmovdqu xmm10, OWORD PTR [rsp+232] + vmovdqu xmm11, OWORD PTR [rsp+248] + vmovdqu xmm12, OWORD PTR [rsp+264] + vmovdqu xmm13, OWORD PTR [rsp+280] + vmovdqu xmm14, OWORD PTR [rsp+296] + vmovdqu xmm15, OWORD PTR [rsp+312] + add rsp, 328 pop rbp pop rsi pop r15 @@ -13506,7 +13814,9 @@ mov rax, QWORD PTR [rsp+72] mov r8, QWORD PTR [rsp+80] mov r9, QWORD PTR [rsp+88] - sub rsp, 16 + sub rsp, 48 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 vpxor xmm4, xmm4, xmm4 mov edx, r11d cmp edx, 12 @@ -13755,7 +14065,9 @@ vmovdqu OWORD PTR [rax], xmm5 vmovdqu OWORD PTR [r8], xmm4 vzeroupper - add rsp, 16 + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + add rsp, 48 pop r12 pop rsi pop rdi @@ -13766,6 +14078,8 @@ _text SEGMENT READONLY PARA AES_GCM_aad_update_avx2 PROC mov rax, rcx + sub rsp, 16 + vmovdqu OWORD PTR [rsp], xmm6 vmovdqu xmm4, OWORD PTR [r8] vmovdqu xmm5, OWORD PTR [r9] xor ecx, ecx @@ -13808,6 +14122,8 @@ jl L_AES_GCM_aad_update_avx2_16_loop vmovdqu OWORD PTR [r8], xmm4 vzeroupper + vmovdqu xmm6, OWORD PTR [rsp] + add rsp, 16 ret AES_GCM_aad_update_avx2 ENDP _text ENDS @@ -13868,6 +14184,8 @@ _text ENDS _text SEGMENT READONLY PARA AES_GCM_ghash_block_avx2 PROC + sub rsp, 16 + vmovdqu OWORD PTR [rsp], xmm6 vmovdqu xmm4, OWORD PTR [rdx] vmovdqu xmm5, OWORD PTR [r8] vmovdqu xmm0, OWORD PTR [rcx] @@ -13905,6 +14223,8 @@ vpxor xmm4, xmm4, xmm1 vmovdqu OWORD PTR [rdx], xmm4 vzeroupper + vmovdqu xmm6, OWORD PTR [rsp] + add rsp, 16 ret AES_GCM_ghash_block_avx2 ENDP _text ENDS @@ -13923,7 +14243,17 @@ mov r12, QWORD PTR [rsp+88] mov r13, QWORD PTR [rsp+96] mov r14, QWORD PTR [rsp+104] - sub rsp, 152 + sub rsp, 312 + vmovdqu OWORD PTR [rsp+152], xmm6 + vmovdqu OWORD PTR [rsp+168], xmm7 + vmovdqu OWORD PTR [rsp+184], xmm8 + vmovdqu OWORD PTR [rsp+200], xmm9 + vmovdqu OWORD PTR [rsp+216], xmm10 + vmovdqu OWORD PTR [rsp+232], xmm11 + vmovdqu OWORD PTR [rsp+248], xmm12 + vmovdqu OWORD PTR [rsp+264], xmm13 + vmovdqu OWORD PTR [rsp+280], xmm14 + vmovdqu OWORD PTR [rsp+296], xmm15 vmovdqu xmm6, OWORD PTR [r12] vmovdqu xmm5, OWORD PTR [r13] vmovdqu xmm4, OWORD PTR [r14] @@ -14754,7 +15084,17 @@ vmovdqu OWORD PTR [r12], xmm6 vmovdqu OWORD PTR [r14], xmm4 vzeroupper - add rsp, 152 + vmovdqu xmm6, OWORD PTR [rsp+152] + vmovdqu xmm7, OWORD PTR [rsp+168] + vmovdqu xmm8, OWORD PTR [rsp+184] + vmovdqu xmm9, OWORD PTR [rsp+200] + vmovdqu xmm10, OWORD PTR [rsp+216] + vmovdqu xmm11, OWORD PTR [rsp+232] + vmovdqu xmm12, OWORD PTR [rsp+248] + vmovdqu xmm13, OWORD PTR [rsp+264] + vmovdqu xmm14, OWORD PTR [rsp+280] + vmovdqu xmm15, OWORD PTR [rsp+296] + add rsp, 312 pop rdi pop r15 pop r14 @@ -14770,7 +15110,9 @@ mov eax, DWORD PTR [rsp+56] mov r10, QWORD PTR [rsp+64] mov r11, QWORD PTR [rsp+72] - sub rsp, 16 + sub rsp, 48 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 vmovdqu xmm4, OWORD PTR [rcx] vmovdqu xmm5, OWORD PTR [r10] vmovdqu xmm6, OWORD PTR [r11] @@ -14824,7 +15166,9 @@ vmovdqu OWORD PTR [rdx], xmm0 L_AES_GCM_encrypt_final_avx2_store_tag_done: vzeroupper - add rsp, 16 + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + add rsp, 48 pop r13 pop r12 ret @@ -14845,7 +15189,17 @@ mov r12, QWORD PTR [rsp+88] mov r14, QWORD PTR [rsp+96] mov r15, QWORD PTR [rsp+104] - sub rsp, 168 + sub rsp, 328 + vmovdqu OWORD PTR [rsp+168], xmm6 + vmovdqu OWORD PTR [rsp+184], xmm7 + vmovdqu OWORD PTR [rsp+200], xmm8 + vmovdqu OWORD PTR [rsp+216], xmm9 + vmovdqu OWORD PTR [rsp+232], xmm10 + vmovdqu OWORD PTR [rsp+248], xmm11 + vmovdqu OWORD PTR [rsp+264], xmm12 + vmovdqu OWORD PTR [rsp+280], xmm13 + vmovdqu OWORD PTR [rsp+296], xmm14 + vmovdqu OWORD PTR [rsp+312], xmm15 vmovdqu xmm6, OWORD PTR [r12] vmovdqu xmm5, OWORD PTR [r14] vmovdqu xmm4, OWORD PTR [r15] @@ -15329,7 +15683,17 @@ vmovdqu OWORD PTR [r12], xmm6 vmovdqu OWORD PTR [r15], xmm4 vzeroupper - add rsp, 168 + vmovdqu xmm6, OWORD PTR [rsp+168] + vmovdqu xmm7, OWORD PTR [rsp+184] + vmovdqu xmm8, OWORD PTR [rsp+200] + vmovdqu xmm9, OWORD PTR [rsp+216] + vmovdqu xmm10, OWORD PTR [rsp+232] + vmovdqu xmm11, OWORD PTR [rsp+248] + vmovdqu xmm12, OWORD PTR [rsp+264] + vmovdqu xmm13, OWORD PTR [rsp+280] + vmovdqu xmm14, OWORD PTR [rsp+296] + vmovdqu xmm15, OWORD PTR [rsp+312] + add rsp, 328 pop rdi pop r15 pop r14 @@ -15347,7 +15711,9 @@ mov r10, QWORD PTR [rsp+72] mov r11, QWORD PTR [rsp+80] mov r12, QWORD PTR [rsp+88] - sub rsp, 16 + sub rsp, 48 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 vmovdqu xmm4, OWORD PTR [rcx] vmovdqu xmm5, OWORD PTR [r10] vmovdqu xmm6, OWORD PTR [r11] @@ -15398,7 +15764,7 @@ inc r13d cmp r13d, r8d jne L_AES_GCM_decrypt_final_avx2_cmp_tag_loop - cmp r10, 0 + cmp r10b, 0 sete r10b jmp L_AES_GCM_decrypt_final_avx2_cmp_tag_done L_AES_GCM_decrypt_final_avx2_cmp_tag_16: @@ -15412,7 +15778,9 @@ L_AES_GCM_decrypt_final_avx2_cmp_tag_done: mov DWORD PTR [r12], r10d vzeroupper - add rsp, 16 + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + add rsp, 48 pop r14 pop r13 pop r12 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_x86_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_x86_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_x86_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_gcm_x86_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -97,10 +97,10 @@ L_aes_gcm_avx2_mod2_128: .long 0x1,0x0,0x0,0xc2000000 .text -.globl AES_GCM_encrypt -.type AES_GCM_encrypt,@function +.globl AES_GCM_encrypt_aesni +.type AES_GCM_encrypt_aesni,@function .align 16 -AES_GCM_encrypt: +AES_GCM_encrypt_aesni: pushl %ebx pushl %esi pushl %edi @@ -112,7 +112,7 @@ pxor %xmm0, %xmm0 pxor %xmm2, %xmm2 cmpl $12, %edx - jne L_AES_GCM_encrypt_iv_not_12 + jne L_AES_GCM_encrypt_aesni_iv_not_12 # # Calculate values when IV is 12 bytes # Set counter based on IV movl $0x1000000, %ecx @@ -153,7 +153,7 @@ aesenc %xmm3, %xmm5 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm3 - jl L_AES_GCM_encrypt_calc_iv_12_last + jl L_AES_GCM_encrypt_aesni_calc_iv_12_last aesenc %xmm3, %xmm1 aesenc %xmm3, %xmm5 movdqa 176(%ebp), %xmm3 @@ -161,20 +161,20 @@ aesenc %xmm3, %xmm5 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm3 - jl L_AES_GCM_encrypt_calc_iv_12_last + jl L_AES_GCM_encrypt_aesni_calc_iv_12_last aesenc %xmm3, %xmm1 aesenc %xmm3, %xmm5 movdqa 208(%ebp), %xmm3 aesenc %xmm3, %xmm1 aesenc %xmm3, %xmm5 movdqa 224(%ebp), %xmm3 -L_AES_GCM_encrypt_calc_iv_12_last: +L_AES_GCM_encrypt_aesni_calc_iv_12_last: aesenclast %xmm3, %xmm1 aesenclast %xmm3, %xmm5 pshufb L_aes_gcm_bswap_mask, %xmm1 movdqu %xmm5, 80(%esp) - jmp L_AES_GCM_encrypt_iv_done -L_AES_GCM_encrypt_iv_not_12: + jmp L_AES_GCM_encrypt_aesni_iv_done +L_AES_GCM_encrypt_aesni_iv_not_12: # Calculate values when IV is not 12 bytes # H = Encrypt X(=0) movdqa (%ebp), %xmm1 @@ -189,27 +189,27 @@ aesenc 144(%ebp), %xmm1 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm5, %xmm1 aesenc 176(%ebp), %xmm1 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm5, %xmm1 aesenc 208(%ebp), %xmm1 movdqa 224(%ebp), %xmm5 -L_AES_GCM_encrypt_calc_iv_1_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_calc_iv_1_aesenc_avx_last: aesenclast %xmm5, %xmm1 pshufb L_aes_gcm_bswap_mask, %xmm1 # Calc counter # Initialization vector cmpl $0x00, %edx movl $0x00, %ecx - je L_AES_GCM_encrypt_calc_iv_done + je L_AES_GCM_encrypt_aesni_calc_iv_done cmpl $16, %edx - jl L_AES_GCM_encrypt_calc_iv_lt16 + jl L_AES_GCM_encrypt_aesni_calc_iv_lt16 andl $0xfffffff0, %edx -L_AES_GCM_encrypt_calc_iv_16_loop: +L_AES_GCM_encrypt_aesni_calc_iv_16_loop: movdqu (%esi,%ecx,1), %xmm4 pshufb L_aes_gcm_bswap_mask, %xmm4 pxor %xmm4, %xmm0 @@ -269,22 +269,22 @@ pxor %xmm6, %xmm0 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_iv_16_loop + jl L_AES_GCM_encrypt_aesni_calc_iv_16_loop movl 160(%esp), %edx cmpl %edx, %ecx - je L_AES_GCM_encrypt_calc_iv_done -L_AES_GCM_encrypt_calc_iv_lt16: + je L_AES_GCM_encrypt_aesni_calc_iv_done +L_AES_GCM_encrypt_aesni_calc_iv_lt16: subl $16, %esp pxor %xmm4, %xmm4 xorl %ebx, %ebx movdqu %xmm4, (%esp) -L_AES_GCM_encrypt_calc_iv_loop: +L_AES_GCM_encrypt_aesni_calc_iv_loop: movzbl (%esi,%ecx,1), %eax movb %al, (%esp,%ebx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_iv_loop + jl L_AES_GCM_encrypt_aesni_calc_iv_loop movdqu (%esp), %xmm4 addl $16, %esp pshufb L_aes_gcm_bswap_mask, %xmm4 @@ -343,7 +343,7 @@ pxor %xmm5, %xmm6 pxor %xmm3, %xmm6 pxor %xmm6, %xmm0 -L_AES_GCM_encrypt_calc_iv_done: +L_AES_GCM_encrypt_aesni_calc_iv_done: # T = Encrypt counter pxor %xmm4, %xmm4 shll $3, %edx @@ -418,29 +418,29 @@ aesenc 144(%ebp), %xmm4 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm5, %xmm4 aesenc 176(%ebp), %xmm4 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm5, %xmm4 aesenc 208(%ebp), %xmm4 movdqa 224(%ebp), %xmm5 -L_AES_GCM_encrypt_calc_iv_2_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_calc_iv_2_aesenc_avx_last: aesenclast %xmm5, %xmm4 movdqu %xmm4, 80(%esp) -L_AES_GCM_encrypt_iv_done: +L_AES_GCM_encrypt_aesni_iv_done: movl 140(%esp), %esi # Additional authentication data movl 156(%esp), %edx cmpl $0x00, %edx - je L_AES_GCM_encrypt_calc_aad_done + je L_AES_GCM_encrypt_aesni_calc_aad_done xorl %ecx, %ecx cmpl $16, %edx - jl L_AES_GCM_encrypt_calc_aad_lt16 + jl L_AES_GCM_encrypt_aesni_calc_aad_lt16 andl $0xfffffff0, %edx -L_AES_GCM_encrypt_calc_aad_16_loop: +L_AES_GCM_encrypt_aesni_calc_aad_16_loop: movdqu (%esi,%ecx,1), %xmm4 pshufb L_aes_gcm_bswap_mask, %xmm4 pxor %xmm4, %xmm2 @@ -500,22 +500,22 @@ pxor %xmm6, %xmm2 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_aad_16_loop + jl L_AES_GCM_encrypt_aesni_calc_aad_16_loop movl 156(%esp), %edx cmpl %edx, %ecx - je L_AES_GCM_encrypt_calc_aad_done -L_AES_GCM_encrypt_calc_aad_lt16: + je L_AES_GCM_encrypt_aesni_calc_aad_done +L_AES_GCM_encrypt_aesni_calc_aad_lt16: subl $16, %esp pxor %xmm4, %xmm4 xorl %ebx, %ebx movdqu %xmm4, (%esp) -L_AES_GCM_encrypt_calc_aad_loop: +L_AES_GCM_encrypt_aesni_calc_aad_loop: movzbl (%esi,%ecx,1), %eax movb %al, (%esp,%ebx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_encrypt_calc_aad_loop + jl L_AES_GCM_encrypt_aesni_calc_aad_loop movdqu (%esp), %xmm4 addl $16, %esp pshufb L_aes_gcm_bswap_mask, %xmm4 @@ -574,7 +574,7 @@ pxor %xmm5, %xmm6 pxor %xmm3, %xmm6 pxor %xmm6, %xmm2 -L_AES_GCM_encrypt_calc_aad_done: +L_AES_GCM_encrypt_aesni_calc_aad_done: movdqu %xmm2, 96(%esp) movl 132(%esp), %esi movl 136(%esp), %edi @@ -595,7 +595,7 @@ xorl %ebx, %ebx movl 152(%esp), %eax cmpl $0x40, %eax - jl L_AES_GCM_encrypt_done_64 + jl L_AES_GCM_encrypt_aesni_done_64 andl $0xffffffc0, %eax movdqa %xmm2, %xmm6 # H ^ 1 @@ -792,7 +792,7 @@ aesenc %xmm3, %xmm7 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm3 - jl L_AES_GCM_encrypt_enc_done + jl L_AES_GCM_encrypt_aesni_enc_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -804,7 +804,7 @@ aesenc %xmm3, %xmm7 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm3 - jl L_AES_GCM_encrypt_enc_done + jl L_AES_GCM_encrypt_aesni_enc_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -815,7 +815,7 @@ aesenc %xmm3, %xmm6 aesenc %xmm3, %xmm7 movdqa 224(%ebp), %xmm3 -L_AES_GCM_encrypt_enc_done: +L_AES_GCM_encrypt_aesni_enc_done: aesenclast %xmm3, %xmm4 aesenclast %xmm3, %xmm5 movdqu (%esi), %xmm0 @@ -836,9 +836,9 @@ movl $0x40, %ebx movl %esi, %ecx movl %edi, %edx - jle L_AES_GCM_encrypt_end_64 + jle L_AES_GCM_encrypt_aesni_end_64 # More 64 bytes of input -L_AES_GCM_encrypt_ghash_64: +L_AES_GCM_encrypt_aesni_ghash_64: leal (%esi,%ebx,1), %ecx leal (%edi,%ebx,1), %edx # Encrypt 64 bytes of counter @@ -909,7 +909,7 @@ aesenc %xmm3, %xmm7 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm3 - jl L_AES_GCM_encrypt_aesenc_64_ghash_avx_done + jl L_AES_GCM_encrypt_aesni_aesenc_64_ghash_avx_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -921,7 +921,7 @@ aesenc %xmm3, %xmm7 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm3 - jl L_AES_GCM_encrypt_aesenc_64_ghash_avx_done + jl L_AES_GCM_encrypt_aesni_aesenc_64_ghash_avx_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -932,7 +932,7 @@ aesenc %xmm3, %xmm6 aesenc %xmm3, %xmm7 movdqa 224(%ebp), %xmm3 -L_AES_GCM_encrypt_aesenc_64_ghash_avx_done: +L_AES_GCM_encrypt_aesni_aesenc_64_ghash_avx_done: aesenclast %xmm3, %xmm4 aesenclast %xmm3, %xmm5 movdqu (%ecx), %xmm0 @@ -1045,8 +1045,8 @@ movdqu %xmm6, 96(%esp) addl $0x40, %ebx cmpl %eax, %ebx - jl L_AES_GCM_encrypt_ghash_64 -L_AES_GCM_encrypt_end_64: + jl L_AES_GCM_encrypt_aesni_ghash_64 +L_AES_GCM_encrypt_aesni_end_64: movdqu 96(%esp), %xmm2 # Block 1 movdqa L_aes_gcm_bswap_mask, %xmm4 @@ -1165,14 +1165,14 @@ pxor %xmm0, %xmm6 pxor %xmm6, %xmm2 movdqu (%esp), %xmm1 -L_AES_GCM_encrypt_done_64: +L_AES_GCM_encrypt_aesni_done_64: movl 152(%esp), %edx cmpl %edx, %ebx - jge L_AES_GCM_encrypt_done_enc + jge L_AES_GCM_encrypt_aesni_done_enc movl 152(%esp), %eax andl $0xfffffff0, %eax cmpl %eax, %ebx - jge L_AES_GCM_encrypt_last_block_done + jge L_AES_GCM_encrypt_aesni_last_block_done leal (%esi,%ebx,1), %ecx leal (%edi,%ebx,1), %edx movdqu 64(%esp), %xmm4 @@ -1192,16 +1192,16 @@ aesenc 144(%ebp), %xmm4 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last aesenc %xmm5, %xmm4 aesenc 176(%ebp), %xmm4 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last aesenc %xmm5, %xmm4 aesenc 208(%ebp), %xmm4 movdqa 224(%ebp), %xmm5 -L_AES_GCM_encrypt_aesenc_block_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_aesenc_block_aesenc_avx_last: aesenclast %xmm5, %xmm4 movdqu (%ecx), %xmm5 pxor %xmm5, %xmm4 @@ -1210,8 +1210,8 @@ pxor %xmm4, %xmm2 addl $16, %ebx cmpl %eax, %ebx - jge L_AES_GCM_encrypt_last_block_ghash -L_AES_GCM_encrypt_last_block_start: + jge L_AES_GCM_encrypt_aesni_last_block_ghash +L_AES_GCM_encrypt_aesni_last_block_start: leal (%esi,%ebx,1), %ecx leal (%edi,%ebx,1), %edx movdqu 64(%esp), %xmm4 @@ -1255,16 +1255,16 @@ pxor %xmm5, %xmm2 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_encrypt_aesenc_gfmul_last + jl L_AES_GCM_encrypt_aesni_aesenc_gfmul_last aesenc %xmm5, %xmm4 aesenc 176(%ebp), %xmm4 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_encrypt_aesenc_gfmul_last + jl L_AES_GCM_encrypt_aesni_aesenc_gfmul_last aesenc %xmm5, %xmm4 aesenc 208(%ebp), %xmm4 movdqa 224(%ebp), %xmm5 -L_AES_GCM_encrypt_aesenc_gfmul_last: +L_AES_GCM_encrypt_aesni_aesenc_gfmul_last: aesenclast %xmm5, %xmm4 movdqu (%ecx), %xmm5 pxor %xmm5, %xmm4 @@ -1273,8 +1273,8 @@ pxor %xmm4, %xmm2 addl $16, %ebx cmpl %eax, %ebx - jl L_AES_GCM_encrypt_last_block_start -L_AES_GCM_encrypt_last_block_ghash: + jl L_AES_GCM_encrypt_aesni_last_block_start +L_AES_GCM_encrypt_aesni_last_block_ghash: pshufd $0x4e, %xmm1, %xmm5 pshufd $0x4e, %xmm2, %xmm6 movdqa %xmm2, %xmm7 @@ -1314,11 +1314,11 @@ pxor %xmm7, %xmm5 pxor %xmm4, %xmm5 pxor %xmm5, %xmm2 -L_AES_GCM_encrypt_last_block_done: +L_AES_GCM_encrypt_aesni_last_block_done: movl 152(%esp), %ecx movl %ecx, %edx andl $15, %ecx - jz L_AES_GCM_encrypt_aesenc_last15_enc_avx_done + jz L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_done movdqu 64(%esp), %xmm0 pshufb L_aes_gcm_bswap_epi64, %xmm0 pxor (%ebp), %xmm0 @@ -1333,21 +1333,21 @@ aesenc 144(%ebp), %xmm0 cmpl $11, 172(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last aesenc %xmm5, %xmm0 aesenc 176(%ebp), %xmm0 cmpl $13, 172(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last aesenc %xmm5, %xmm0 aesenc 208(%ebp), %xmm0 movdqa 224(%ebp), %xmm5 -L_AES_GCM_encrypt_aesenc_last15_enc_avx_aesenc_avx_last: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_aesenc_avx_last: aesenclast %xmm5, %xmm0 subl $16, %esp xorl %ecx, %ecx movdqu %xmm0, (%esp) -L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_loop: movzbl (%esi,%ebx,1), %eax xorb (%esp,%ecx,1), %al movb %al, (%edi,%ebx,1) @@ -1355,16 +1355,16 @@ incl %ebx incl %ecx cmpl %edx, %ebx - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_loop + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_loop xorl %eax, %eax cmpl $16, %ecx - je L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc -L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop: + je L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_finish_enc +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_byte_loop: movb %al, (%esp,%ecx,1) incl %ecx cmpl $16, %ecx - jl L_AES_GCM_encrypt_aesenc_last15_enc_avx_byte_loop -L_AES_GCM_encrypt_aesenc_last15_enc_avx_finish_enc: + jl L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_byte_loop +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_finish_enc: movdqu (%esp), %xmm0 addl $16, %esp pshufb L_aes_gcm_bswap_mask, %xmm0 @@ -1408,8 +1408,8 @@ pxor %xmm7, %xmm5 pxor %xmm4, %xmm5 pxor %xmm5, %xmm2 -L_AES_GCM_encrypt_aesenc_last15_enc_avx_done: -L_AES_GCM_encrypt_done_enc: +L_AES_GCM_encrypt_aesni_aesenc_last15_enc_avx_done: +L_AES_GCM_encrypt_aesni_done_enc: movl 148(%esp), %edi movl 164(%esp), %ebx movl 152(%esp), %edx @@ -1468,31 +1468,31 @@ movdqu 80(%esp), %xmm4 pxor %xmm2, %xmm4 cmpl $16, %ebx - je L_AES_GCM_encrypt_store_tag_16 + je L_AES_GCM_encrypt_aesni_store_tag_16 xorl %ecx, %ecx movdqu %xmm4, (%esp) -L_AES_GCM_encrypt_store_tag_loop: +L_AES_GCM_encrypt_aesni_store_tag_loop: movzbl (%esp,%ecx,1), %eax movb %al, (%edi,%ecx,1) incl %ecx cmpl %ebx, %ecx - jne L_AES_GCM_encrypt_store_tag_loop - jmp L_AES_GCM_encrypt_store_tag_done -L_AES_GCM_encrypt_store_tag_16: + jne L_AES_GCM_encrypt_aesni_store_tag_loop + jmp L_AES_GCM_encrypt_aesni_store_tag_done +L_AES_GCM_encrypt_aesni_store_tag_16: movdqu %xmm4, (%edi) -L_AES_GCM_encrypt_store_tag_done: +L_AES_GCM_encrypt_aesni_store_tag_done: addl $0x70, %esp popl %ebp popl %edi popl %esi popl %ebx ret -.size AES_GCM_encrypt,.-AES_GCM_encrypt +.size AES_GCM_encrypt_aesni,.-AES_GCM_encrypt_aesni .text -.globl AES_GCM_decrypt -.type AES_GCM_decrypt,@function +.globl AES_GCM_decrypt_aesni +.type AES_GCM_decrypt_aesni,@function .align 16 -AES_GCM_decrypt: +AES_GCM_decrypt_aesni: pushl %ebx pushl %esi pushl %edi @@ -1504,7 +1504,7 @@ pxor %xmm0, %xmm0 pxor %xmm2, %xmm2 cmpl $12, %edx - jne L_AES_GCM_decrypt_iv_not_12 + jne L_AES_GCM_decrypt_aesni_iv_not_12 # # Calculate values when IV is 12 bytes # Set counter based on IV movl $0x1000000, %ecx @@ -1545,7 +1545,7 @@ aesenc %xmm3, %xmm5 cmpl $11, 236(%esp) movdqa 160(%ebp), %xmm3 - jl L_AES_GCM_decrypt_calc_iv_12_last + jl L_AES_GCM_decrypt_aesni_calc_iv_12_last aesenc %xmm3, %xmm1 aesenc %xmm3, %xmm5 movdqa 176(%ebp), %xmm3 @@ -1553,20 +1553,20 @@ aesenc %xmm3, %xmm5 cmpl $13, 236(%esp) movdqa 192(%ebp), %xmm3 - jl L_AES_GCM_decrypt_calc_iv_12_last + jl L_AES_GCM_decrypt_aesni_calc_iv_12_last aesenc %xmm3, %xmm1 aesenc %xmm3, %xmm5 movdqa 208(%ebp), %xmm3 aesenc %xmm3, %xmm1 aesenc %xmm3, %xmm5 movdqa 224(%ebp), %xmm3 -L_AES_GCM_decrypt_calc_iv_12_last: +L_AES_GCM_decrypt_aesni_calc_iv_12_last: aesenclast %xmm3, %xmm1 aesenclast %xmm3, %xmm5 pshufb L_aes_gcm_bswap_mask, %xmm1 movdqu %xmm5, 80(%esp) - jmp L_AES_GCM_decrypt_iv_done -L_AES_GCM_decrypt_iv_not_12: + jmp L_AES_GCM_decrypt_aesni_iv_done +L_AES_GCM_decrypt_aesni_iv_not_12: # Calculate values when IV is not 12 bytes # H = Encrypt X(=0) movdqa (%ebp), %xmm1 @@ -1581,27 +1581,27 @@ aesenc 144(%ebp), %xmm1 cmpl $11, 236(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm5, %xmm1 aesenc 176(%ebp), %xmm1 cmpl $13, 236(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last aesenc %xmm5, %xmm1 aesenc 208(%ebp), %xmm1 movdqa 224(%ebp), %xmm5 -L_AES_GCM_decrypt_calc_iv_1_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_calc_iv_1_aesenc_avx_last: aesenclast %xmm5, %xmm1 pshufb L_aes_gcm_bswap_mask, %xmm1 # Calc counter # Initialization vector cmpl $0x00, %edx movl $0x00, %ecx - je L_AES_GCM_decrypt_calc_iv_done + je L_AES_GCM_decrypt_aesni_calc_iv_done cmpl $16, %edx - jl L_AES_GCM_decrypt_calc_iv_lt16 + jl L_AES_GCM_decrypt_aesni_calc_iv_lt16 andl $0xfffffff0, %edx -L_AES_GCM_decrypt_calc_iv_16_loop: +L_AES_GCM_decrypt_aesni_calc_iv_16_loop: movdqu (%esi,%ecx,1), %xmm4 pshufb L_aes_gcm_bswap_mask, %xmm4 pxor %xmm4, %xmm0 @@ -1661,22 +1661,22 @@ pxor %xmm6, %xmm0 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_iv_16_loop + jl L_AES_GCM_decrypt_aesni_calc_iv_16_loop movl 224(%esp), %edx cmpl %edx, %ecx - je L_AES_GCM_decrypt_calc_iv_done -L_AES_GCM_decrypt_calc_iv_lt16: + je L_AES_GCM_decrypt_aesni_calc_iv_done +L_AES_GCM_decrypt_aesni_calc_iv_lt16: subl $16, %esp pxor %xmm4, %xmm4 xorl %ebx, %ebx movdqu %xmm4, (%esp) -L_AES_GCM_decrypt_calc_iv_loop: +L_AES_GCM_decrypt_aesni_calc_iv_loop: movzbl (%esi,%ecx,1), %eax movb %al, (%esp,%ebx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_iv_loop + jl L_AES_GCM_decrypt_aesni_calc_iv_loop movdqu (%esp), %xmm4 addl $16, %esp pshufb L_aes_gcm_bswap_mask, %xmm4 @@ -1735,7 +1735,7 @@ pxor %xmm5, %xmm6 pxor %xmm3, %xmm6 pxor %xmm6, %xmm0 -L_AES_GCM_decrypt_calc_iv_done: +L_AES_GCM_decrypt_aesni_calc_iv_done: # T = Encrypt counter pxor %xmm4, %xmm4 shll $3, %edx @@ -1810,29 +1810,29 @@ aesenc 144(%ebp), %xmm4 cmpl $11, 236(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm5, %xmm4 aesenc 176(%ebp), %xmm4 cmpl $13, 236(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last aesenc %xmm5, %xmm4 aesenc 208(%ebp), %xmm4 movdqa 224(%ebp), %xmm5 -L_AES_GCM_decrypt_calc_iv_2_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_calc_iv_2_aesenc_avx_last: aesenclast %xmm5, %xmm4 movdqu %xmm4, 80(%esp) -L_AES_GCM_decrypt_iv_done: +L_AES_GCM_decrypt_aesni_iv_done: movl 204(%esp), %esi # Additional authentication data movl 220(%esp), %edx cmpl $0x00, %edx - je L_AES_GCM_decrypt_calc_aad_done + je L_AES_GCM_decrypt_aesni_calc_aad_done xorl %ecx, %ecx cmpl $16, %edx - jl L_AES_GCM_decrypt_calc_aad_lt16 + jl L_AES_GCM_decrypt_aesni_calc_aad_lt16 andl $0xfffffff0, %edx -L_AES_GCM_decrypt_calc_aad_16_loop: +L_AES_GCM_decrypt_aesni_calc_aad_16_loop: movdqu (%esi,%ecx,1), %xmm4 pshufb L_aes_gcm_bswap_mask, %xmm4 pxor %xmm4, %xmm2 @@ -1892,22 +1892,22 @@ pxor %xmm6, %xmm2 addl $16, %ecx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_aad_16_loop + jl L_AES_GCM_decrypt_aesni_calc_aad_16_loop movl 220(%esp), %edx cmpl %edx, %ecx - je L_AES_GCM_decrypt_calc_aad_done -L_AES_GCM_decrypt_calc_aad_lt16: + je L_AES_GCM_decrypt_aesni_calc_aad_done +L_AES_GCM_decrypt_aesni_calc_aad_lt16: subl $16, %esp pxor %xmm4, %xmm4 xorl %ebx, %ebx movdqu %xmm4, (%esp) -L_AES_GCM_decrypt_calc_aad_loop: +L_AES_GCM_decrypt_aesni_calc_aad_loop: movzbl (%esi,%ecx,1), %eax movb %al, (%esp,%ebx,1) incl %ecx incl %ebx cmpl %edx, %ecx - jl L_AES_GCM_decrypt_calc_aad_loop + jl L_AES_GCM_decrypt_aesni_calc_aad_loop movdqu (%esp), %xmm4 addl $16, %esp pshufb L_aes_gcm_bswap_mask, %xmm4 @@ -1966,7 +1966,7 @@ pxor %xmm5, %xmm6 pxor %xmm3, %xmm6 pxor %xmm6, %xmm2 -L_AES_GCM_decrypt_calc_aad_done: +L_AES_GCM_decrypt_aesni_calc_aad_done: movdqu %xmm2, 96(%esp) movl 196(%esp), %esi movl 200(%esp), %edi @@ -1987,7 +1987,7 @@ xorl %ebx, %ebx cmpl $0x40, 216(%esp) movl 216(%esp), %eax - jl L_AES_GCM_decrypt_done_64 + jl L_AES_GCM_decrypt_aesni_done_64 andl $0xffffffc0, %eax movdqa %xmm2, %xmm6 # H ^ 1 @@ -2116,8 +2116,8 @@ pxor %xmm5, %xmm3 movdqu %xmm3, 48(%esp) cmpl %esi, %edi - jne L_AES_GCM_decrypt_ghash_64 -L_AES_GCM_decrypt_ghash_64_inplace: + jne L_AES_GCM_decrypt_aesni_ghash_64 +L_AES_GCM_decrypt_aesni_ghash_64_inplace: leal (%esi,%ebx,1), %ecx leal (%edi,%ebx,1), %edx # Encrypt 64 bytes of counter @@ -2188,7 +2188,7 @@ aesenc %xmm3, %xmm7 cmpl $11, 236(%esp) movdqa 160(%ebp), %xmm3 - jl L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done + jl L_AES_GCM_decrypt_aesniinplace_aesenc_64_ghash_avx_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -2200,7 +2200,7 @@ aesenc %xmm3, %xmm7 cmpl $13, 236(%esp) movdqa 192(%ebp), %xmm3 - jl L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done + jl L_AES_GCM_decrypt_aesniinplace_aesenc_64_ghash_avx_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -2211,7 +2211,7 @@ aesenc %xmm3, %xmm6 aesenc %xmm3, %xmm7 movdqa 224(%ebp), %xmm3 -L_AES_GCM_decryptinplace_aesenc_64_ghash_avx_done: +L_AES_GCM_decrypt_aesniinplace_aesenc_64_ghash_avx_done: aesenclast %xmm3, %xmm4 aesenclast %xmm3, %xmm5 movdqu (%ecx), %xmm0 @@ -2328,9 +2328,9 @@ movdqu %xmm6, 96(%esp) addl $0x40, %ebx cmpl %eax, %ebx - jl L_AES_GCM_decrypt_ghash_64_inplace - jmp L_AES_GCM_decrypt_ghash_64_done -L_AES_GCM_decrypt_ghash_64: + jl L_AES_GCM_decrypt_aesni_ghash_64_inplace + jmp L_AES_GCM_decrypt_aesni_ghash_64_done +L_AES_GCM_decrypt_aesni_ghash_64: leal (%esi,%ebx,1), %ecx leal (%edi,%ebx,1), %edx # Encrypt 64 bytes of counter @@ -2401,7 +2401,7 @@ aesenc %xmm3, %xmm7 cmpl $11, 236(%esp) movdqa 160(%ebp), %xmm3 - jl L_AES_GCM_decrypt_aesenc_64_ghash_avx_done + jl L_AES_GCM_decrypt_aesni_aesenc_64_ghash_avx_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -2413,7 +2413,7 @@ aesenc %xmm3, %xmm7 cmpl $13, 236(%esp) movdqa 192(%ebp), %xmm3 - jl L_AES_GCM_decrypt_aesenc_64_ghash_avx_done + jl L_AES_GCM_decrypt_aesni_aesenc_64_ghash_avx_done aesenc %xmm3, %xmm4 aesenc %xmm3, %xmm5 aesenc %xmm3, %xmm6 @@ -2424,7 +2424,7 @@ aesenc %xmm3, %xmm6 aesenc %xmm3, %xmm7 movdqa 224(%ebp), %xmm3 -L_AES_GCM_decrypt_aesenc_64_ghash_avx_done: +L_AES_GCM_decrypt_aesni_aesenc_64_ghash_avx_done: aesenclast %xmm3, %xmm4 aesenclast %xmm3, %xmm5 movdqu (%ecx), %xmm0 @@ -2541,19 +2541,19 @@ movdqu %xmm6, 96(%esp) addl $0x40, %ebx cmpl %eax, %ebx - jl L_AES_GCM_decrypt_ghash_64 -L_AES_GCM_decrypt_ghash_64_done: + jl L_AES_GCM_decrypt_aesni_ghash_64 +L_AES_GCM_decrypt_aesni_ghash_64_done: movdqa %xmm6, %xmm2 movdqu (%esp), %xmm1 -L_AES_GCM_decrypt_done_64: +L_AES_GCM_decrypt_aesni_done_64: movl 216(%esp), %edx cmpl %edx, %ebx - jge L_AES_GCM_decrypt_done_dec + jge L_AES_GCM_decrypt_aesni_done_dec movl 216(%esp), %eax andl $0xfffffff0, %eax cmpl %eax, %ebx - jge L_AES_GCM_decrypt_last_block_done -L_AES_GCM_decrypt_last_block_start: + jge L_AES_GCM_decrypt_aesni_last_block_done +L_AES_GCM_decrypt_aesni_last_block_start: leal (%esi,%ebx,1), %ecx leal (%edi,%ebx,1), %edx movdqu (%ecx), %xmm5 @@ -2601,28 +2601,28 @@ pxor %xmm5, %xmm2 cmpl $11, 236(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_decrypt_aesenc_gfmul_last + jl L_AES_GCM_decrypt_aesni_aesenc_gfmul_last aesenc %xmm5, %xmm4 aesenc 176(%ebp), %xmm4 cmpl $13, 236(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_decrypt_aesenc_gfmul_last + jl L_AES_GCM_decrypt_aesni_aesenc_gfmul_last aesenc %xmm5, %xmm4 aesenc 208(%ebp), %xmm4 movdqa 224(%ebp), %xmm5 -L_AES_GCM_decrypt_aesenc_gfmul_last: +L_AES_GCM_decrypt_aesni_aesenc_gfmul_last: aesenclast %xmm5, %xmm4 movdqu (%ecx), %xmm5 pxor %xmm5, %xmm4 movdqu %xmm4, (%edx) addl $16, %ebx cmpl %eax, %ebx - jl L_AES_GCM_decrypt_last_block_start -L_AES_GCM_decrypt_last_block_done: + jl L_AES_GCM_decrypt_aesni_last_block_start +L_AES_GCM_decrypt_aesni_last_block_done: movl 216(%esp), %ecx movl %ecx, %edx andl $15, %ecx - jz L_AES_GCM_decrypt_aesenc_last15_dec_avx_done + jz L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_done movdqu 64(%esp), %xmm0 pshufb L_aes_gcm_bswap_epi64, %xmm0 pxor (%ebp), %xmm0 @@ -2637,23 +2637,23 @@ aesenc 144(%ebp), %xmm0 cmpl $11, 236(%esp) movdqa 160(%ebp), %xmm5 - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last aesenc %xmm5, %xmm0 aesenc 176(%ebp), %xmm0 cmpl $13, 236(%esp) movdqa 192(%ebp), %xmm5 - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last aesenc %xmm5, %xmm0 aesenc 208(%ebp), %xmm0 movdqa 224(%ebp), %xmm5 -L_AES_GCM_decrypt_aesenc_last15_dec_avx_aesenc_avx_last: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_aesenc_avx_last: aesenclast %xmm5, %xmm0 subl $32, %esp xorl %ecx, %ecx movdqu %xmm0, (%esp) pxor %xmm4, %xmm4 movdqu %xmm4, 16(%esp) -L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_loop: movzbl (%esi,%ebx,1), %eax movb %al, 16(%esp,%ecx,1) xorb (%esp,%ecx,1), %al @@ -2661,7 +2661,7 @@ incl %ebx incl %ecx cmpl %edx, %ebx - jl L_AES_GCM_decrypt_aesenc_last15_dec_avx_loop + jl L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_loop movdqu 16(%esp), %xmm0 addl $32, %esp pshufb L_aes_gcm_bswap_mask, %xmm0 @@ -2705,8 +2705,8 @@ pxor %xmm7, %xmm5 pxor %xmm4, %xmm5 pxor %xmm5, %xmm2 -L_AES_GCM_decrypt_aesenc_last15_dec_avx_done: -L_AES_GCM_decrypt_done_dec: +L_AES_GCM_decrypt_aesni_aesenc_last15_dec_avx_done: +L_AES_GCM_decrypt_aesni_done_dec: movl 212(%esp), %esi movl 228(%esp), %ebp movl 216(%esp), %edx @@ -2766,24 +2766,24 @@ pxor %xmm2, %xmm4 movl 240(%esp), %edi cmpl $16, %ebp - je L_AES_GCM_decrypt_cmp_tag_16 + je L_AES_GCM_decrypt_aesni_cmp_tag_16 subl $16, %esp xorl %ecx, %ecx xorl %ebx, %ebx movdqu %xmm4, (%esp) -L_AES_GCM_decrypt_cmp_tag_loop: +L_AES_GCM_decrypt_aesni_cmp_tag_loop: movzbl (%esp,%ecx,1), %eax xorb (%esi,%ecx,1), %al orb %al, %bl incl %ecx cmpl %ebp, %ecx - jne L_AES_GCM_decrypt_cmp_tag_loop + jne L_AES_GCM_decrypt_aesni_cmp_tag_loop cmpb $0x00, %bl sete %bl addl $16, %esp xorl %ecx, %ecx - jmp L_AES_GCM_decrypt_cmp_tag_done -L_AES_GCM_decrypt_cmp_tag_16: + jmp L_AES_GCM_decrypt_aesni_cmp_tag_done +L_AES_GCM_decrypt_aesni_cmp_tag_16: movdqu (%esi), %xmm5 pcmpeqb %xmm5, %xmm4 pmovmskb %xmm4, %edx @@ -2791,7 +2791,7 @@ xorl %ebx, %ebx cmpl $0xffff, %edx sete %bl -L_AES_GCM_decrypt_cmp_tag_done: +L_AES_GCM_decrypt_aesni_cmp_tag_done: movl %ebx, (%edi) addl $0xb0, %esp popl %ebp @@ -2799,7 +2799,7 @@ popl %esi popl %ebx ret -.size AES_GCM_decrypt,.-AES_GCM_decrypt +.size AES_GCM_decrypt_aesni,.-AES_GCM_decrypt_aesni #ifdef WOLFSSL_AESGCM_STREAM .text .globl AES_GCM_init_aesni diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2782 @@ +/* aes_xts_asm.S */ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef WOLFSSL_USER_SETTINGS +#ifdef WOLFSSL_USER_SETTINGS_ASM +/* + * user_settings_asm.h is a file generated by the script user_settings_asm.sh. + * The script takes in a user_settings.h and produces user_settings_asm.h, which + * is a stripped down version of user_settings.h containing only preprocessor + * directives. This makes the header safe to include in assembly (.S) files. + */ +#include "user_settings_asm.h" +#else +/* + * Note: if user_settings.h contains any C code (e.g. a typedef or function + * prototype), including it here in an assembly (.S) file will cause an + * assembler failure. See user_settings_asm.h above. + */ +#include "user_settings.h" +#endif /* WOLFSSL_USER_SETTINGS_ASM */ +#endif /* WOLFSSL_USER_SETTINGS */ + +#ifndef HAVE_INTEL_AVX1 +#define HAVE_INTEL_AVX1 +#endif /* HAVE_INTEL_AVX1 */ +#ifndef NO_AVX2_SUPPORT +#define HAVE_INTEL_AVX2 +#endif /* NO_AVX2_SUPPORT */ + +#ifdef WOLFSSL_AES_XTS +#ifdef WOLFSSL_X86_64_BUILD +#ifndef __APPLE__ +.text +.globl AES_XTS_init_aesni +.type AES_XTS_init_aesni,@function +.align 16 +AES_XTS_init_aesni: +#else +.section __TEXT,__text +.globl _AES_XTS_init_aesni +.p2align 4 +_AES_XTS_init_aesni: +#endif /* __APPLE__ */ + movdqu (%rdi), %xmm0 + # aes_enc_block + pxor (%rsi), %xmm0 + movdqu 16(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 32(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 48(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 64(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 80(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 96(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 112(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 128(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + movdqu 144(%rsi), %xmm2 + aesenc %xmm2, %xmm0 + cmpl $11, %edx + movdqu 160(%rsi), %xmm2 + jl L_AES_XTS_init_aesni_tweak_aes_enc_block_last + aesenc %xmm2, %xmm0 + movdqu 176(%rsi), %xmm3 + aesenc %xmm3, %xmm0 + cmpl $13, %edx + movdqu 192(%rsi), %xmm2 + jl L_AES_XTS_init_aesni_tweak_aes_enc_block_last + aesenc %xmm2, %xmm0 + movdqu 208(%rsi), %xmm3 + aesenc %xmm3, %xmm0 + movdqu 224(%rsi), %xmm2 +L_AES_XTS_init_aesni_tweak_aes_enc_block_last: + aesenclast %xmm2, %xmm0 + movdqu %xmm0, (%rdi) + repz retq +#ifndef __APPLE__ +.size AES_XTS_init_aesni,.-AES_XTS_init_aesni +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_aes_xts_gc_xts: +.long 0x87,0x1,0x1,0x1 +#ifndef __APPLE__ +.text +.globl AES_XTS_encrypt_aesni +.type AES_XTS_encrypt_aesni,@function +.align 16 +AES_XTS_encrypt_aesni: +#else +.section __TEXT,__text +.globl _AES_XTS_encrypt_aesni +.p2align 4 +_AES_XTS_encrypt_aesni: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + movq %rdx, %rax + movq %rcx, %r12 + movl 24(%rsp), %r10d + subq $0x40, %rsp + movdqu L_aes_xts_gc_xts(%rip), %xmm12 + movdqu (%r12), %xmm0 + # aes_enc_block + pxor (%r9), %xmm0 + movdqu 16(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 32(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 48(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 64(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 80(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 96(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 112(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 128(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 144(%r9), %xmm5 + aesenc %xmm5, %xmm0 + cmpl $11, %r10d + movdqu 160(%r9), %xmm5 + jl L_AES_XTS_encrypt_aesni_tweak_aes_enc_block_last + aesenc %xmm5, %xmm0 + movdqu 176(%r9), %xmm6 + aesenc %xmm6, %xmm0 + cmpl $13, %r10d + movdqu 192(%r9), %xmm5 + jl L_AES_XTS_encrypt_aesni_tweak_aes_enc_block_last + aesenc %xmm5, %xmm0 + movdqu 208(%r9), %xmm6 + aesenc %xmm6, %xmm0 + movdqu 224(%r9), %xmm5 +L_AES_XTS_encrypt_aesni_tweak_aes_enc_block_last: + aesenclast %xmm5, %xmm0 + xorl %r13d, %r13d + cmpl $0x40, %eax + movl %eax, %r11d + jl L_AES_XTS_encrypt_aesni_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_encrypt_aesni_enc_64: + # 64 bytes of input + # aes_enc_64 + leaq (%rdi,%r13,1), %rcx + leaq (%rsi,%r13,1), %rdx + movdqu (%rcx), %xmm8 + movdqu 16(%rcx), %xmm9 + movdqu 32(%rcx), %xmm10 + movdqu 48(%rcx), %xmm11 + movdqa %xmm0, %xmm4 + movdqa %xmm0, %xmm1 + psrad $31, %xmm4 + pslld $0x01, %xmm1 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm1 + movdqa %xmm1, %xmm4 + movdqa %xmm1, %xmm2 + psrad $31, %xmm4 + pslld $0x01, %xmm2 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm2 + movdqa %xmm2, %xmm4 + movdqa %xmm2, %xmm3 + psrad $31, %xmm4 + pslld $0x01, %xmm3 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm3 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + # aes_enc_block + movdqu (%r8), %xmm4 + pxor %xmm4, %xmm8 + pxor %xmm4, %xmm9 + pxor %xmm4, %xmm10 + pxor %xmm4, %xmm11 + movdqu 16(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 32(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 48(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 64(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 80(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 96(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 112(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 128(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 144(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + cmpl $11, %r10d + movdqu 160(%r8), %xmm4 + jl L_AES_XTS_encrypt_aesni_aes_enc_64_aes_enc_block_last + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 176(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + cmpl $13, %r10d + movdqu 192(%r8), %xmm4 + jl L_AES_XTS_encrypt_aesni_aes_enc_64_aes_enc_block_last + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 208(%r8), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 224(%r8), %xmm4 +L_AES_XTS_encrypt_aesni_aes_enc_64_aes_enc_block_last: + aesenclast %xmm4, %xmm8 + aesenclast %xmm4, %xmm9 + aesenclast %xmm4, %xmm10 + aesenclast %xmm4, %xmm11 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + movdqu %xmm8, (%rdx) + movdqu %xmm9, 16(%rdx) + movdqu %xmm10, 32(%rdx) + movdqu %xmm11, 48(%rdx) + movdqa %xmm3, %xmm4 + movdqa %xmm3, %xmm0 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $0x40, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_encrypt_aesni_enc_64 +L_AES_XTS_encrypt_aesni_done_64: + cmpl %eax, %r13d + movl %eax, %r11d + je L_AES_XTS_encrypt_aesni_done_enc + subl %r13d, %r11d + cmpl $16, %r11d + movl %eax, %r11d + jl L_AES_XTS_encrypt_aesni_last_15 + andl $0xfffffff0, %r11d + # 16 bytes of input +L_AES_XTS_encrypt_aesni_enc_16: + leaq (%rdi,%r13,1), %rcx + movdqu (%rcx), %xmm8 + pxor %xmm0, %xmm8 + # aes_enc_block + pxor (%r8), %xmm8 + movdqu 16(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 32(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 48(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 64(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 80(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 96(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 112(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 128(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 144(%r8), %xmm5 + aesenc %xmm5, %xmm8 + cmpl $11, %r10d + movdqu 160(%r8), %xmm5 + jl L_AES_XTS_encrypt_aesni_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 176(%r8), %xmm6 + aesenc %xmm6, %xmm8 + cmpl $13, %r10d + movdqu 192(%r8), %xmm5 + jl L_AES_XTS_encrypt_aesni_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 208(%r8), %xmm6 + aesenc %xmm6, %xmm8 + movdqu 224(%r8), %xmm5 +L_AES_XTS_encrypt_aesni_aes_enc_block_last: + aesenclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + leaq (%rsi,%r13,1), %rcx + movdqu %xmm8, (%rcx) + movdqa %xmm0, %xmm4 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $16, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_encrypt_aesni_enc_16 + cmpl %eax, %r13d + je L_AES_XTS_encrypt_aesni_done_enc +L_AES_XTS_encrypt_aesni_last_15: + subq $16, %r13 + leaq (%rsi,%r13,1), %rcx + movdqu (%rcx), %xmm8 + addq $16, %r13 + movdqu %xmm8, (%rsp) + xorq %rdx, %rdx +L_AES_XTS_encrypt_aesni_last_15_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r13,1), %cl + movb %r11b, (%rsi,%r13,1) + movb %cl, (%rsp,%rdx,1) + incl %r13d + incl %edx + cmpl %eax, %r13d + jl L_AES_XTS_encrypt_aesni_last_15_byte_loop + subq %rdx, %r13 + movdqu (%rsp), %xmm8 + subq $16, %r13 + pxor %xmm0, %xmm8 + # aes_enc_block + pxor (%r8), %xmm8 + movdqu 16(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 32(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 48(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 64(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 80(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 96(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 112(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 128(%r8), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 144(%r8), %xmm5 + aesenc %xmm5, %xmm8 + cmpl $11, %r10d + movdqu 160(%r8), %xmm5 + jl L_AES_XTS_encrypt_aesni_last_15_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 176(%r8), %xmm6 + aesenc %xmm6, %xmm8 + cmpl $13, %r10d + movdqu 192(%r8), %xmm5 + jl L_AES_XTS_encrypt_aesni_last_15_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 208(%r8), %xmm6 + aesenc %xmm6, %xmm8 + movdqu 224(%r8), %xmm5 +L_AES_XTS_encrypt_aesni_last_15_aes_enc_block_last: + aesenclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + leaq (%rsi,%r13,1), %rcx + movdqu %xmm8, (%rcx) +L_AES_XTS_encrypt_aesni_done_enc: + addq $0x40, %rsp + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_encrypt_aesni,.-AES_XTS_encrypt_aesni +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl AES_XTS_encrypt_update_aesni +.type AES_XTS_encrypt_update_aesni,@function +.align 16 +AES_XTS_encrypt_update_aesni: +#else +.section __TEXT,__text +.globl _AES_XTS_encrypt_update_aesni +.p2align 4 +_AES_XTS_encrypt_update_aesni: +#endif /* __APPLE__ */ + pushq %r12 + movq %rdx, %rax + movq %rcx, %r10 + subq $0x40, %rsp + movdqu L_aes_xts_gc_xts(%rip), %xmm12 + movdqu (%r8), %xmm0 + xorl %r12d, %r12d + cmpl $0x40, %eax + movl %eax, %r11d + jl L_AES_XTS_encrypt_update_aesni_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_encrypt_update_aesni_enc_64: + # 64 bytes of input + # aes_enc_64 + leaq (%rdi,%r12,1), %rcx + leaq (%rsi,%r12,1), %rdx + movdqu (%rcx), %xmm8 + movdqu 16(%rcx), %xmm9 + movdqu 32(%rcx), %xmm10 + movdqu 48(%rcx), %xmm11 + movdqa %xmm0, %xmm4 + movdqa %xmm0, %xmm1 + psrad $31, %xmm4 + pslld $0x01, %xmm1 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm1 + movdqa %xmm1, %xmm4 + movdqa %xmm1, %xmm2 + psrad $31, %xmm4 + pslld $0x01, %xmm2 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm2 + movdqa %xmm2, %xmm4 + movdqa %xmm2, %xmm3 + psrad $31, %xmm4 + pslld $0x01, %xmm3 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm3 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + # aes_enc_block + movdqu (%r10), %xmm4 + pxor %xmm4, %xmm8 + pxor %xmm4, %xmm9 + pxor %xmm4, %xmm10 + pxor %xmm4, %xmm11 + movdqu 16(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 32(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 48(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 64(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 80(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 96(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 112(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 128(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 144(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + cmpl $11, %r9d + movdqu 160(%r10), %xmm4 + jl L_AES_XTS_encrypt_update_aesni_aes_enc_64_aes_enc_block_last + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 176(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + cmpl $13, %r9d + movdqu 192(%r10), %xmm4 + jl L_AES_XTS_encrypt_update_aesni_aes_enc_64_aes_enc_block_last + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 208(%r10), %xmm4 + aesenc %xmm4, %xmm8 + aesenc %xmm4, %xmm9 + aesenc %xmm4, %xmm10 + aesenc %xmm4, %xmm11 + movdqu 224(%r10), %xmm4 +L_AES_XTS_encrypt_update_aesni_aes_enc_64_aes_enc_block_last: + aesenclast %xmm4, %xmm8 + aesenclast %xmm4, %xmm9 + aesenclast %xmm4, %xmm10 + aesenclast %xmm4, %xmm11 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + movdqu %xmm8, (%rdx) + movdqu %xmm9, 16(%rdx) + movdqu %xmm10, 32(%rdx) + movdqu %xmm11, 48(%rdx) + movdqa %xmm3, %xmm4 + movdqa %xmm3, %xmm0 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $0x40, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_encrypt_update_aesni_enc_64 +L_AES_XTS_encrypt_update_aesni_done_64: + cmpl %eax, %r12d + movl %eax, %r11d + je L_AES_XTS_encrypt_update_aesni_done_enc + subl %r12d, %r11d + cmpl $16, %r11d + movl %eax, %r11d + jl L_AES_XTS_encrypt_update_aesni_last_15 + andl $0xfffffff0, %r11d + # 16 bytes of input +L_AES_XTS_encrypt_update_aesni_enc_16: + leaq (%rdi,%r12,1), %rcx + movdqu (%rcx), %xmm8 + pxor %xmm0, %xmm8 + # aes_enc_block + pxor (%r10), %xmm8 + movdqu 16(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 32(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 48(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 64(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 80(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 96(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 112(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 128(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 144(%r10), %xmm5 + aesenc %xmm5, %xmm8 + cmpl $11, %r9d + movdqu 160(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_aesni_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 176(%r10), %xmm6 + aesenc %xmm6, %xmm8 + cmpl $13, %r9d + movdqu 192(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_aesni_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 208(%r10), %xmm6 + aesenc %xmm6, %xmm8 + movdqu 224(%r10), %xmm5 +L_AES_XTS_encrypt_update_aesni_aes_enc_block_last: + aesenclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + leaq (%rsi,%r12,1), %rcx + movdqu %xmm8, (%rcx) + movdqa %xmm0, %xmm4 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $16, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_encrypt_update_aesni_enc_16 + cmpl %eax, %r12d + je L_AES_XTS_encrypt_update_aesni_done_enc +L_AES_XTS_encrypt_update_aesni_last_15: + subq $16, %r12 + leaq (%rsi,%r12,1), %rcx + movdqu (%rcx), %xmm8 + addq $16, %r12 + movdqu %xmm8, (%rsp) + xorq %rdx, %rdx +L_AES_XTS_encrypt_update_aesni_last_15_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r12,1), %cl + movb %r11b, (%rsi,%r12,1) + movb %cl, (%rsp,%rdx,1) + incl %r12d + incl %edx + cmpl %eax, %r12d + jl L_AES_XTS_encrypt_update_aesni_last_15_byte_loop + subq %rdx, %r12 + movdqu (%rsp), %xmm8 + subq $16, %r12 + pxor %xmm0, %xmm8 + # aes_enc_block + pxor (%r10), %xmm8 + movdqu 16(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 32(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 48(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 64(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 80(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 96(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 112(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 128(%r10), %xmm5 + aesenc %xmm5, %xmm8 + movdqu 144(%r10), %xmm5 + aesenc %xmm5, %xmm8 + cmpl $11, %r9d + movdqu 160(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_aesni_last_15_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 176(%r10), %xmm6 + aesenc %xmm6, %xmm8 + cmpl $13, %r9d + movdqu 192(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_aesni_last_15_aes_enc_block_last + aesenc %xmm5, %xmm8 + movdqu 208(%r10), %xmm6 + aesenc %xmm6, %xmm8 + movdqu 224(%r10), %xmm5 +L_AES_XTS_encrypt_update_aesni_last_15_aes_enc_block_last: + aesenclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + leaq (%rsi,%r12,1), %rcx + movdqu %xmm8, (%rcx) +L_AES_XTS_encrypt_update_aesni_done_enc: + movdqu %xmm0, (%r8) + addq $0x40, %rsp + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_encrypt_update_aesni,.-AES_XTS_encrypt_update_aesni +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl AES_XTS_decrypt_aesni +.type AES_XTS_decrypt_aesni,@function +.align 16 +AES_XTS_decrypt_aesni: +#else +.section __TEXT,__text +.globl _AES_XTS_decrypt_aesni +.p2align 4 +_AES_XTS_decrypt_aesni: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + movq %rdx, %rax + movq %rcx, %r12 + movl 24(%rsp), %r10d + subq $16, %rsp + movdqu L_aes_xts_gc_xts(%rip), %xmm12 + movdqu (%r12), %xmm0 + # aes_enc_block + pxor (%r9), %xmm0 + movdqu 16(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 32(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 48(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 64(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 80(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 96(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 112(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 128(%r9), %xmm5 + aesenc %xmm5, %xmm0 + movdqu 144(%r9), %xmm5 + aesenc %xmm5, %xmm0 + cmpl $11, %r10d + movdqu 160(%r9), %xmm5 + jl L_AES_XTS_decrypt_aesni_tweak_aes_enc_block_last + aesenc %xmm5, %xmm0 + movdqu 176(%r9), %xmm6 + aesenc %xmm6, %xmm0 + cmpl $13, %r10d + movdqu 192(%r9), %xmm5 + jl L_AES_XTS_decrypt_aesni_tweak_aes_enc_block_last + aesenc %xmm5, %xmm0 + movdqu 208(%r9), %xmm6 + aesenc %xmm6, %xmm0 + movdqu 224(%r9), %xmm5 +L_AES_XTS_decrypt_aesni_tweak_aes_enc_block_last: + aesenclast %xmm5, %xmm0 + xorl %r13d, %r13d + movl %eax, %r11d + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_aesni_mul16_64 + subl $16, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_aesni_last_31_start +L_AES_XTS_decrypt_aesni_mul16_64: + cmpl $0x40, %r11d + jl L_AES_XTS_decrypt_aesni_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_decrypt_aesni_dec_64: + # 64 bytes of input + # aes_dec_64 + leaq (%rdi,%r13,1), %rcx + leaq (%rsi,%r13,1), %rdx + movdqu (%rcx), %xmm8 + movdqu 16(%rcx), %xmm9 + movdqu 32(%rcx), %xmm10 + movdqu 48(%rcx), %xmm11 + movdqa %xmm0, %xmm4 + movdqa %xmm0, %xmm1 + psrad $31, %xmm4 + pslld $0x01, %xmm1 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm1 + movdqa %xmm1, %xmm4 + movdqa %xmm1, %xmm2 + psrad $31, %xmm4 + pslld $0x01, %xmm2 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm2 + movdqa %xmm2, %xmm4 + movdqa %xmm2, %xmm3 + psrad $31, %xmm4 + pslld $0x01, %xmm3 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm3 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + # aes_dec_block + movdqu (%r8), %xmm4 + pxor %xmm4, %xmm8 + pxor %xmm4, %xmm9 + pxor %xmm4, %xmm10 + pxor %xmm4, %xmm11 + movdqu 16(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 32(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 48(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 64(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 80(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 96(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 112(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 128(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 144(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + cmpl $11, %r10d + movdqu 160(%r8), %xmm4 + jl L_AES_XTS_decrypt_aesni_aes_dec_64_aes_dec_block_last + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 176(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + cmpl $13, %r10d + movdqu 192(%r8), %xmm4 + jl L_AES_XTS_decrypt_aesni_aes_dec_64_aes_dec_block_last + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 208(%r8), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 224(%r8), %xmm4 +L_AES_XTS_decrypt_aesni_aes_dec_64_aes_dec_block_last: + aesdeclast %xmm4, %xmm8 + aesdeclast %xmm4, %xmm9 + aesdeclast %xmm4, %xmm10 + aesdeclast %xmm4, %xmm11 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + movdqu %xmm8, (%rdx) + movdqu %xmm9, 16(%rdx) + movdqu %xmm10, 32(%rdx) + movdqu %xmm11, 48(%rdx) + movdqa %xmm3, %xmm4 + movdqa %xmm3, %xmm0 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $0x40, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_decrypt_aesni_dec_64 +L_AES_XTS_decrypt_aesni_done_64: + cmpl %eax, %r13d + movl %eax, %r11d + je L_AES_XTS_decrypt_aesni_done_dec + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_aesni_mul16 + subl $16, %r11d + subl %r13d, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_aesni_last_31_start + addl %r13d, %r11d +L_AES_XTS_decrypt_aesni_mul16: +L_AES_XTS_decrypt_aesni_dec_16: + # 16 bytes of input + leaq (%rdi,%r13,1), %rcx + movdqu (%rcx), %xmm8 + pxor %xmm0, %xmm8 + # aes_dec_block + pxor (%r8), %xmm8 + movdqu 16(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 32(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 48(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 64(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 80(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 96(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 112(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 128(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 144(%r8), %xmm5 + aesdec %xmm5, %xmm8 + cmpl $11, %r10d + movdqu 160(%r8), %xmm5 + jl L_AES_XTS_decrypt_aesni_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 176(%r8), %xmm6 + aesdec %xmm6, %xmm8 + cmpl $13, %r10d + movdqu 192(%r8), %xmm5 + jl L_AES_XTS_decrypt_aesni_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 208(%r8), %xmm6 + aesdec %xmm6, %xmm8 + movdqu 224(%r8), %xmm5 +L_AES_XTS_decrypt_aesni_aes_dec_block_last: + aesdeclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + leaq (%rsi,%r13,1), %rcx + movdqu %xmm8, (%rcx) + movdqa %xmm0, %xmm4 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $16, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_decrypt_aesni_dec_16 + cmpl %eax, %r13d + je L_AES_XTS_decrypt_aesni_done_dec +L_AES_XTS_decrypt_aesni_last_31_start: + movdqa %xmm0, %xmm4 + movdqa %xmm0, %xmm7 + psrad $31, %xmm4 + pslld $0x01, %xmm7 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm7 + leaq (%rdi,%r13,1), %rcx + movdqu (%rcx), %xmm8 + pxor %xmm7, %xmm8 + # aes_dec_block + pxor (%r8), %xmm8 + movdqu 16(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 32(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 48(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 64(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 80(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 96(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 112(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 128(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 144(%r8), %xmm5 + aesdec %xmm5, %xmm8 + cmpl $11, %r10d + movdqu 160(%r8), %xmm5 + jl L_AES_XTS_decrypt_aesni_last_31_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 176(%r8), %xmm6 + aesdec %xmm6, %xmm8 + cmpl $13, %r10d + movdqu 192(%r8), %xmm5 + jl L_AES_XTS_decrypt_aesni_last_31_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 208(%r8), %xmm6 + aesdec %xmm6, %xmm8 + movdqu 224(%r8), %xmm5 +L_AES_XTS_decrypt_aesni_last_31_aes_dec_block_last: + aesdeclast %xmm5, %xmm8 + pxor %xmm7, %xmm8 + movdqu %xmm8, (%rsp) + addq $16, %r13 + xorq %rdx, %rdx +L_AES_XTS_decrypt_aesni_last_31_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r13,1), %cl + movb %r11b, (%rsi,%r13,1) + movb %cl, (%rsp,%rdx,1) + incl %r13d + incl %edx + cmpl %eax, %r13d + jl L_AES_XTS_decrypt_aesni_last_31_byte_loop + subq %rdx, %r13 + movdqu (%rsp), %xmm8 + pxor %xmm0, %xmm8 + # aes_dec_block + pxor (%r8), %xmm8 + movdqu 16(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 32(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 48(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 64(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 80(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 96(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 112(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 128(%r8), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 144(%r8), %xmm5 + aesdec %xmm5, %xmm8 + cmpl $11, %r10d + movdqu 160(%r8), %xmm5 + jl L_AES_XTS_decrypt_aesni_last_31_2_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 176(%r8), %xmm6 + aesdec %xmm6, %xmm8 + cmpl $13, %r10d + movdqu 192(%r8), %xmm5 + jl L_AES_XTS_decrypt_aesni_last_31_2_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 208(%r8), %xmm6 + aesdec %xmm6, %xmm8 + movdqu 224(%r8), %xmm5 +L_AES_XTS_decrypt_aesni_last_31_2_aes_dec_block_last: + aesdeclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + subq $16, %r13 + leaq (%rsi,%r13,1), %rcx + movdqu %xmm8, (%rcx) +L_AES_XTS_decrypt_aesni_done_dec: + addq $16, %rsp + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_decrypt_aesni,.-AES_XTS_decrypt_aesni +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl AES_XTS_decrypt_update_aesni +.type AES_XTS_decrypt_update_aesni,@function +.align 16 +AES_XTS_decrypt_update_aesni: +#else +.section __TEXT,__text +.globl _AES_XTS_decrypt_update_aesni +.p2align 4 +_AES_XTS_decrypt_update_aesni: +#endif /* __APPLE__ */ + pushq %r12 + movq %rdx, %rax + movq %rcx, %r10 + subq $16, %rsp + movdqu L_aes_xts_gc_xts(%rip), %xmm12 + movdqu (%r8), %xmm0 + xorl %r12d, %r12d + movl %eax, %r11d + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_update_aesni_mul16_64 + subl $16, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_update_aesni_last_31_start +L_AES_XTS_decrypt_update_aesni_mul16_64: + cmpl $0x40, %r11d + jl L_AES_XTS_decrypt_update_aesni_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_decrypt_update_aesni_dec_64: + # 64 bytes of input + # aes_dec_64 + leaq (%rdi,%r12,1), %rcx + leaq (%rsi,%r12,1), %rdx + movdqu (%rcx), %xmm8 + movdqu 16(%rcx), %xmm9 + movdqu 32(%rcx), %xmm10 + movdqu 48(%rcx), %xmm11 + movdqa %xmm0, %xmm4 + movdqa %xmm0, %xmm1 + psrad $31, %xmm4 + pslld $0x01, %xmm1 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm1 + movdqa %xmm1, %xmm4 + movdqa %xmm1, %xmm2 + psrad $31, %xmm4 + pslld $0x01, %xmm2 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm2 + movdqa %xmm2, %xmm4 + movdqa %xmm2, %xmm3 + psrad $31, %xmm4 + pslld $0x01, %xmm3 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm3 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + # aes_dec_block + movdqu (%r10), %xmm4 + pxor %xmm4, %xmm8 + pxor %xmm4, %xmm9 + pxor %xmm4, %xmm10 + pxor %xmm4, %xmm11 + movdqu 16(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 32(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 48(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 64(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 80(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 96(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 112(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 128(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 144(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + cmpl $11, %r9d + movdqu 160(%r10), %xmm4 + jl L_AES_XTS_decrypt_update_aesni_aes_dec_64_aes_dec_block_last + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 176(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + cmpl $13, %r9d + movdqu 192(%r10), %xmm4 + jl L_AES_XTS_decrypt_update_aesni_aes_dec_64_aes_dec_block_last + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 208(%r10), %xmm4 + aesdec %xmm4, %xmm8 + aesdec %xmm4, %xmm9 + aesdec %xmm4, %xmm10 + aesdec %xmm4, %xmm11 + movdqu 224(%r10), %xmm4 +L_AES_XTS_decrypt_update_aesni_aes_dec_64_aes_dec_block_last: + aesdeclast %xmm4, %xmm8 + aesdeclast %xmm4, %xmm9 + aesdeclast %xmm4, %xmm10 + aesdeclast %xmm4, %xmm11 + pxor %xmm0, %xmm8 + pxor %xmm1, %xmm9 + pxor %xmm2, %xmm10 + pxor %xmm3, %xmm11 + movdqu %xmm8, (%rdx) + movdqu %xmm9, 16(%rdx) + movdqu %xmm10, 32(%rdx) + movdqu %xmm11, 48(%rdx) + movdqa %xmm3, %xmm4 + movdqa %xmm3, %xmm0 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $0x40, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_decrypt_update_aesni_dec_64 +L_AES_XTS_decrypt_update_aesni_done_64: + cmpl %eax, %r12d + movl %eax, %r11d + je L_AES_XTS_decrypt_update_aesni_done_dec + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_update_aesni_mul16 + subl $16, %r11d + subl %r12d, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_update_aesni_last_31_start + addl %r12d, %r11d +L_AES_XTS_decrypt_update_aesni_mul16: +L_AES_XTS_decrypt_update_aesni_dec_16: + # 16 bytes of input + leaq (%rdi,%r12,1), %rcx + movdqu (%rcx), %xmm8 + pxor %xmm0, %xmm8 + # aes_dec_block + pxor (%r10), %xmm8 + movdqu 16(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 32(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 48(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 64(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 80(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 96(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 112(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 128(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 144(%r10), %xmm5 + aesdec %xmm5, %xmm8 + cmpl $11, %r9d + movdqu 160(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_aesni_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 176(%r10), %xmm6 + aesdec %xmm6, %xmm8 + cmpl $13, %r9d + movdqu 192(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_aesni_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 208(%r10), %xmm6 + aesdec %xmm6, %xmm8 + movdqu 224(%r10), %xmm5 +L_AES_XTS_decrypt_update_aesni_aes_dec_block_last: + aesdeclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + leaq (%rsi,%r12,1), %rcx + movdqu %xmm8, (%rcx) + movdqa %xmm0, %xmm4 + psrad $31, %xmm4 + pslld $0x01, %xmm0 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm0 + addl $16, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_decrypt_update_aesni_dec_16 + cmpl %eax, %r12d + je L_AES_XTS_decrypt_update_aesni_done_dec +L_AES_XTS_decrypt_update_aesni_last_31_start: + movdqa %xmm0, %xmm4 + movdqa %xmm0, %xmm7 + psrad $31, %xmm4 + pslld $0x01, %xmm7 + pshufd $0x93, %xmm4, %xmm4 + pand %xmm12, %xmm4 + pxor %xmm4, %xmm7 + leaq (%rdi,%r12,1), %rcx + movdqu (%rcx), %xmm8 + pxor %xmm7, %xmm8 + # aes_dec_block + pxor (%r10), %xmm8 + movdqu 16(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 32(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 48(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 64(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 80(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 96(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 112(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 128(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 144(%r10), %xmm5 + aesdec %xmm5, %xmm8 + cmpl $11, %r9d + movdqu 160(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_aesni_last_31_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 176(%r10), %xmm6 + aesdec %xmm6, %xmm8 + cmpl $13, %r9d + movdqu 192(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_aesni_last_31_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 208(%r10), %xmm6 + aesdec %xmm6, %xmm8 + movdqu 224(%r10), %xmm5 +L_AES_XTS_decrypt_update_aesni_last_31_aes_dec_block_last: + aesdeclast %xmm5, %xmm8 + pxor %xmm7, %xmm8 + movdqu %xmm8, (%rsp) + addq $16, %r12 + xorq %rdx, %rdx +L_AES_XTS_decrypt_update_aesni_last_31_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r12,1), %cl + movb %r11b, (%rsi,%r12,1) + movb %cl, (%rsp,%rdx,1) + incl %r12d + incl %edx + cmpl %eax, %r12d + jl L_AES_XTS_decrypt_update_aesni_last_31_byte_loop + subq %rdx, %r12 + movdqu (%rsp), %xmm8 + pxor %xmm0, %xmm8 + # aes_dec_block + pxor (%r10), %xmm8 + movdqu 16(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 32(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 48(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 64(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 80(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 96(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 112(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 128(%r10), %xmm5 + aesdec %xmm5, %xmm8 + movdqu 144(%r10), %xmm5 + aesdec %xmm5, %xmm8 + cmpl $11, %r9d + movdqu 160(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_aesni_last_31_2_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 176(%r10), %xmm6 + aesdec %xmm6, %xmm8 + cmpl $13, %r9d + movdqu 192(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_aesni_last_31_2_aes_dec_block_last + aesdec %xmm5, %xmm8 + movdqu 208(%r10), %xmm6 + aesdec %xmm6, %xmm8 + movdqu 224(%r10), %xmm5 +L_AES_XTS_decrypt_update_aesni_last_31_2_aes_dec_block_last: + aesdeclast %xmm5, %xmm8 + pxor %xmm0, %xmm8 + subq $16, %r12 + leaq (%rsi,%r12,1), %rcx + movdqu %xmm8, (%rcx) +L_AES_XTS_decrypt_update_aesni_done_dec: + movdqu %xmm0, (%r8) + addq $16, %rsp + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_decrypt_update_aesni,.-AES_XTS_decrypt_update_aesni +#endif /* __APPLE__ */ +#ifdef HAVE_INTEL_AVX1 +#ifndef __APPLE__ +.text +.globl AES_XTS_init_avx1 +.type AES_XTS_init_avx1,@function +.align 16 +AES_XTS_init_avx1: +#else +.section __TEXT,__text +.globl _AES_XTS_init_avx1 +.p2align 4 +_AES_XTS_init_avx1: +#endif /* __APPLE__ */ + movl %edx, %eax + vmovdqu (%rdi), %xmm0 + # aes_enc_block + vpxor (%rsi), %xmm0, %xmm0 + vmovdqu 16(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 32(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 48(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 64(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 80(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 96(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 112(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 128(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 144(%rsi), %xmm2 + vaesenc %xmm2, %xmm0, %xmm0 + cmpl $11, %eax + vmovdqu 160(%rsi), %xmm2 + jl L_AES_XTS_init_avx1_tweak_aes_enc_block_last + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 176(%rsi), %xmm3 + vaesenc %xmm3, %xmm0, %xmm0 + cmpl $13, %eax + vmovdqu 192(%rsi), %xmm2 + jl L_AES_XTS_init_avx1_tweak_aes_enc_block_last + vaesenc %xmm2, %xmm0, %xmm0 + vmovdqu 208(%rsi), %xmm3 + vaesenc %xmm3, %xmm0, %xmm0 + vmovdqu 224(%rsi), %xmm2 +L_AES_XTS_init_avx1_tweak_aes_enc_block_last: + vaesenclast %xmm2, %xmm0, %xmm0 + vmovdqu %xmm0, (%rdi) + repz retq +#ifndef __APPLE__ +.size AES_XTS_init_avx1,.-AES_XTS_init_avx1 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_avx1_aes_xts_gc_xts: +.long 0x87,0x1,0x1,0x1 +#ifndef __APPLE__ +.text +.globl AES_XTS_encrypt_avx1 +.type AES_XTS_encrypt_avx1,@function +.align 16 +AES_XTS_encrypt_avx1: +#else +.section __TEXT,__text +.globl _AES_XTS_encrypt_avx1 +.p2align 4 +_AES_XTS_encrypt_avx1: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + movq %rdx, %rax + movq %rcx, %r12 + movl 24(%rsp), %r10d + subq $0x40, %rsp + vmovdqu L_avx1_aes_xts_gc_xts(%rip), %xmm12 + vmovdqu (%r12), %xmm0 + # aes_enc_block + vpxor (%r9), %xmm0, %xmm0 + vmovdqu 16(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 32(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 48(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 64(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 80(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 96(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 112(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 128(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 144(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + cmpl $11, %r10d + vmovdqu 160(%r9), %xmm5 + jl L_AES_XTS_encrypt_avx1_tweak_aes_enc_block_last + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 176(%r9), %xmm6 + vaesenc %xmm6, %xmm0, %xmm0 + cmpl $13, %r10d + vmovdqu 192(%r9), %xmm5 + jl L_AES_XTS_encrypt_avx1_tweak_aes_enc_block_last + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 208(%r9), %xmm6 + vaesenc %xmm6, %xmm0, %xmm0 + vmovdqu 224(%r9), %xmm5 +L_AES_XTS_encrypt_avx1_tweak_aes_enc_block_last: + vaesenclast %xmm5, %xmm0, %xmm0 + xorl %r13d, %r13d + cmpl $0x40, %eax + movl %eax, %r11d + jl L_AES_XTS_encrypt_avx1_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_encrypt_avx1_enc_64: + # 64 bytes of input + # aes_enc_64 + leaq (%rdi,%r13,1), %rcx + leaq (%rsi,%r13,1), %rdx + vmovdqu (%rcx), %xmm8 + vmovdqu 16(%rcx), %xmm9 + vmovdqu 32(%rcx), %xmm10 + vmovdqu 48(%rcx), %xmm11 + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm1 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm1, %xmm1 + vpsrad $31, %xmm1, %xmm4 + vpslld $0x01, %xmm1, %xmm2 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm2, %xmm2 + vpsrad $31, %xmm2, %xmm4 + vpslld $0x01, %xmm2, %xmm3 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm3, %xmm3 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + # aes_enc_block + vmovdqu (%r8), %xmm4 + vpxor %xmm4, %xmm8, %xmm8 + vpxor %xmm4, %xmm9, %xmm9 + vpxor %xmm4, %xmm10, %xmm10 + vpxor %xmm4, %xmm11, %xmm11 + vmovdqu 16(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 32(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 48(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 64(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 80(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 96(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 112(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 128(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 144(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + cmpl $11, %r10d + vmovdqu 160(%r8), %xmm4 + jl L_AES_XTS_encrypt_avx1_aes_enc_64_aes_enc_block_last + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 176(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + cmpl $13, %r10d + vmovdqu 192(%r8), %xmm4 + jl L_AES_XTS_encrypt_avx1_aes_enc_64_aes_enc_block_last + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 208(%r8), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 224(%r8), %xmm4 +L_AES_XTS_encrypt_avx1_aes_enc_64_aes_enc_block_last: + vaesenclast %xmm4, %xmm8, %xmm8 + vaesenclast %xmm4, %xmm9, %xmm9 + vaesenclast %xmm4, %xmm10, %xmm10 + vaesenclast %xmm4, %xmm11, %xmm11 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + vmovdqu %xmm8, (%rdx) + vmovdqu %xmm9, 16(%rdx) + vmovdqu %xmm10, 32(%rdx) + vmovdqu %xmm11, 48(%rdx) + vpsrad $31, %xmm3, %xmm4 + vpslld $0x01, %xmm3, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $0x40, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_encrypt_avx1_enc_64 +L_AES_XTS_encrypt_avx1_done_64: + cmpl %eax, %r13d + movl %eax, %r11d + je L_AES_XTS_encrypt_avx1_done_enc + subl %r13d, %r11d + cmpl $16, %r11d + movl %eax, %r11d + jl L_AES_XTS_encrypt_avx1_last_15 + andl $0xfffffff0, %r11d + # 16 bytes of input +L_AES_XTS_encrypt_avx1_enc_16: + leaq (%rdi,%r13,1), %rcx + vmovdqu (%rcx), %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + # aes_enc_block + vpxor (%r8), %xmm8, %xmm8 + vmovdqu 16(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + cmpl $11, %r10d + vmovdqu 160(%r8), %xmm5 + jl L_AES_XTS_encrypt_avx1_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r8), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + cmpl $13, %r10d + vmovdqu 192(%r8), %xmm5 + jl L_AES_XTS_encrypt_avx1_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r8), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r8), %xmm5 +L_AES_XTS_encrypt_avx1_aes_enc_block_last: + vaesenclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + leaq (%rsi,%r13,1), %rcx + vmovdqu %xmm8, (%rcx) + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $16, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_encrypt_avx1_enc_16 + cmpl %eax, %r13d + je L_AES_XTS_encrypt_avx1_done_enc +L_AES_XTS_encrypt_avx1_last_15: + subq $16, %r13 + leaq (%rsi,%r13,1), %rcx + vmovdqu (%rcx), %xmm8 + addq $16, %r13 + vmovdqu %xmm8, (%rsp) + xorq %rdx, %rdx +L_AES_XTS_encrypt_avx1_last_15_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r13,1), %cl + movb %r11b, (%rsi,%r13,1) + movb %cl, (%rsp,%rdx,1) + incl %r13d + incl %edx + cmpl %eax, %r13d + jl L_AES_XTS_encrypt_avx1_last_15_byte_loop + subq %rdx, %r13 + vmovdqu (%rsp), %xmm8 + subq $16, %r13 + vpxor %xmm0, %xmm8, %xmm8 + # aes_enc_block + vpxor (%r8), %xmm8, %xmm8 + vmovdqu 16(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r8), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + cmpl $11, %r10d + vmovdqu 160(%r8), %xmm5 + jl L_AES_XTS_encrypt_avx1_last_15_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r8), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + cmpl $13, %r10d + vmovdqu 192(%r8), %xmm5 + jl L_AES_XTS_encrypt_avx1_last_15_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r8), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r8), %xmm5 +L_AES_XTS_encrypt_avx1_last_15_aes_enc_block_last: + vaesenclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + leaq (%rsi,%r13,1), %rcx + vmovdqu %xmm8, (%rcx) +L_AES_XTS_encrypt_avx1_done_enc: + addq $0x40, %rsp + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_encrypt_avx1,.-AES_XTS_encrypt_avx1 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl AES_XTS_encrypt_update_avx1 +.type AES_XTS_encrypt_update_avx1,@function +.align 16 +AES_XTS_encrypt_update_avx1: +#else +.section __TEXT,__text +.globl _AES_XTS_encrypt_update_avx1 +.p2align 4 +_AES_XTS_encrypt_update_avx1: +#endif /* __APPLE__ */ + pushq %r12 + movq %rdx, %rax + movq %rcx, %r10 + subq $0x40, %rsp + vmovdqu L_avx1_aes_xts_gc_xts(%rip), %xmm12 + vmovdqu (%r8), %xmm0 + xorl %r12d, %r12d + cmpl $0x40, %eax + movl %eax, %r11d + jl L_AES_XTS_encrypt_update_avx1_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_encrypt_update_avx1_enc_64: + # 64 bytes of input + # aes_enc_64 + leaq (%rdi,%r12,1), %rcx + leaq (%rsi,%r12,1), %rdx + vmovdqu (%rcx), %xmm8 + vmovdqu 16(%rcx), %xmm9 + vmovdqu 32(%rcx), %xmm10 + vmovdqu 48(%rcx), %xmm11 + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm1 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm1, %xmm1 + vpsrad $31, %xmm1, %xmm4 + vpslld $0x01, %xmm1, %xmm2 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm2, %xmm2 + vpsrad $31, %xmm2, %xmm4 + vpslld $0x01, %xmm2, %xmm3 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm3, %xmm3 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + # aes_enc_block + vmovdqu (%r10), %xmm4 + vpxor %xmm4, %xmm8, %xmm8 + vpxor %xmm4, %xmm9, %xmm9 + vpxor %xmm4, %xmm10, %xmm10 + vpxor %xmm4, %xmm11, %xmm11 + vmovdqu 16(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 32(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 48(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 64(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 80(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 96(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 112(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 128(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 144(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + cmpl $11, %r9d + vmovdqu 160(%r10), %xmm4 + jl L_AES_XTS_encrypt_update_avx1_aes_enc_64_aes_enc_block_last + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 176(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + cmpl $13, %r9d + vmovdqu 192(%r10), %xmm4 + jl L_AES_XTS_encrypt_update_avx1_aes_enc_64_aes_enc_block_last + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 208(%r10), %xmm4 + vaesenc %xmm4, %xmm8, %xmm8 + vaesenc %xmm4, %xmm9, %xmm9 + vaesenc %xmm4, %xmm10, %xmm10 + vaesenc %xmm4, %xmm11, %xmm11 + vmovdqu 224(%r10), %xmm4 +L_AES_XTS_encrypt_update_avx1_aes_enc_64_aes_enc_block_last: + vaesenclast %xmm4, %xmm8, %xmm8 + vaesenclast %xmm4, %xmm9, %xmm9 + vaesenclast %xmm4, %xmm10, %xmm10 + vaesenclast %xmm4, %xmm11, %xmm11 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + vmovdqu %xmm8, (%rdx) + vmovdqu %xmm9, 16(%rdx) + vmovdqu %xmm10, 32(%rdx) + vmovdqu %xmm11, 48(%rdx) + vpsrad $31, %xmm3, %xmm4 + vpslld $0x01, %xmm3, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $0x40, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_encrypt_update_avx1_enc_64 +L_AES_XTS_encrypt_update_avx1_done_64: + cmpl %eax, %r12d + movl %eax, %r11d + je L_AES_XTS_encrypt_update_avx1_done_enc + subl %r12d, %r11d + cmpl $16, %r11d + movl %eax, %r11d + jl L_AES_XTS_encrypt_update_avx1_last_15 + andl $0xfffffff0, %r11d + # 16 bytes of input +L_AES_XTS_encrypt_update_avx1_enc_16: + leaq (%rdi,%r12,1), %rcx + vmovdqu (%rcx), %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + # aes_enc_block + vpxor (%r10), %xmm8, %xmm8 + vmovdqu 16(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + cmpl $11, %r9d + vmovdqu 160(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_avx1_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r10), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + cmpl $13, %r9d + vmovdqu 192(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_avx1_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r10), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r10), %xmm5 +L_AES_XTS_encrypt_update_avx1_aes_enc_block_last: + vaesenclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + leaq (%rsi,%r12,1), %rcx + vmovdqu %xmm8, (%rcx) + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $16, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_encrypt_update_avx1_enc_16 + cmpl %eax, %r12d + je L_AES_XTS_encrypt_update_avx1_done_enc +L_AES_XTS_encrypt_update_avx1_last_15: + subq $16, %r12 + leaq (%rsi,%r12,1), %rcx + vmovdqu (%rcx), %xmm8 + addq $16, %r12 + vmovdqu %xmm8, (%rsp) + xorq %rdx, %rdx +L_AES_XTS_encrypt_update_avx1_last_15_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r12,1), %cl + movb %r11b, (%rsi,%r12,1) + movb %cl, (%rsp,%rdx,1) + incl %r12d + incl %edx + cmpl %eax, %r12d + jl L_AES_XTS_encrypt_update_avx1_last_15_byte_loop + subq %rdx, %r12 + vmovdqu (%rsp), %xmm8 + subq $16, %r12 + vpxor %xmm0, %xmm8, %xmm8 + # aes_enc_block + vpxor (%r10), %xmm8, %xmm8 + vmovdqu 16(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r10), %xmm5 + vaesenc %xmm5, %xmm8, %xmm8 + cmpl $11, %r9d + vmovdqu 160(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_avx1_last_15_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r10), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + cmpl $13, %r9d + vmovdqu 192(%r10), %xmm5 + jl L_AES_XTS_encrypt_update_avx1_last_15_aes_enc_block_last + vaesenc %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r10), %xmm6 + vaesenc %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r10), %xmm5 +L_AES_XTS_encrypt_update_avx1_last_15_aes_enc_block_last: + vaesenclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + leaq (%rsi,%r12,1), %rcx + vmovdqu %xmm8, (%rcx) +L_AES_XTS_encrypt_update_avx1_done_enc: + vmovdqu %xmm0, (%r8) + addq $0x40, %rsp + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_encrypt_update_avx1,.-AES_XTS_encrypt_update_avx1 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl AES_XTS_decrypt_avx1 +.type AES_XTS_decrypt_avx1,@function +.align 16 +AES_XTS_decrypt_avx1: +#else +.section __TEXT,__text +.globl _AES_XTS_decrypt_avx1 +.p2align 4 +_AES_XTS_decrypt_avx1: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + movq %rdx, %rax + movq %rcx, %r12 + movl 24(%rsp), %r10d + subq $16, %rsp + vmovdqu L_avx1_aes_xts_gc_xts(%rip), %xmm12 + vmovdqu (%r12), %xmm0 + # aes_enc_block + vpxor (%r9), %xmm0, %xmm0 + vmovdqu 16(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 32(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 48(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 64(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 80(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 96(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 112(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 128(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 144(%r9), %xmm5 + vaesenc %xmm5, %xmm0, %xmm0 + cmpl $11, %r10d + vmovdqu 160(%r9), %xmm5 + jl L_AES_XTS_decrypt_avx1_tweak_aes_enc_block_last + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 176(%r9), %xmm6 + vaesenc %xmm6, %xmm0, %xmm0 + cmpl $13, %r10d + vmovdqu 192(%r9), %xmm5 + jl L_AES_XTS_decrypt_avx1_tweak_aes_enc_block_last + vaesenc %xmm5, %xmm0, %xmm0 + vmovdqu 208(%r9), %xmm6 + vaesenc %xmm6, %xmm0, %xmm0 + vmovdqu 224(%r9), %xmm5 +L_AES_XTS_decrypt_avx1_tweak_aes_enc_block_last: + vaesenclast %xmm5, %xmm0, %xmm0 + xorl %r13d, %r13d + movl %eax, %r11d + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_avx1_mul16_64 + subl $16, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_avx1_last_31_start +L_AES_XTS_decrypt_avx1_mul16_64: + cmpl $0x40, %r11d + jl L_AES_XTS_decrypt_avx1_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_decrypt_avx1_dec_64: + # 64 bytes of input + # aes_dec_64 + leaq (%rdi,%r13,1), %rcx + leaq (%rsi,%r13,1), %rdx + vmovdqu (%rcx), %xmm8 + vmovdqu 16(%rcx), %xmm9 + vmovdqu 32(%rcx), %xmm10 + vmovdqu 48(%rcx), %xmm11 + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm1 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm1, %xmm1 + vpsrad $31, %xmm1, %xmm4 + vpslld $0x01, %xmm1, %xmm2 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm2, %xmm2 + vpsrad $31, %xmm2, %xmm4 + vpslld $0x01, %xmm2, %xmm3 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm3, %xmm3 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + # aes_dec_block + vmovdqu (%r8), %xmm4 + vpxor %xmm4, %xmm8, %xmm8 + vpxor %xmm4, %xmm9, %xmm9 + vpxor %xmm4, %xmm10, %xmm10 + vpxor %xmm4, %xmm11, %xmm11 + vmovdqu 16(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 32(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 48(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 64(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 80(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 96(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 112(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 128(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 144(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + cmpl $11, %r10d + vmovdqu 160(%r8), %xmm4 + jl L_AES_XTS_decrypt_avx1_aes_dec_64_aes_dec_block_last + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 176(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + cmpl $13, %r10d + vmovdqu 192(%r8), %xmm4 + jl L_AES_XTS_decrypt_avx1_aes_dec_64_aes_dec_block_last + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 208(%r8), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 224(%r8), %xmm4 +L_AES_XTS_decrypt_avx1_aes_dec_64_aes_dec_block_last: + vaesdeclast %xmm4, %xmm8, %xmm8 + vaesdeclast %xmm4, %xmm9, %xmm9 + vaesdeclast %xmm4, %xmm10, %xmm10 + vaesdeclast %xmm4, %xmm11, %xmm11 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + vmovdqu %xmm8, (%rdx) + vmovdqu %xmm9, 16(%rdx) + vmovdqu %xmm10, 32(%rdx) + vmovdqu %xmm11, 48(%rdx) + vpsrad $31, %xmm3, %xmm4 + vpslld $0x01, %xmm3, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $0x40, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_decrypt_avx1_dec_64 +L_AES_XTS_decrypt_avx1_done_64: + cmpl %eax, %r13d + movl %eax, %r11d + je L_AES_XTS_decrypt_avx1_done_dec + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_avx1_mul16 + subl $16, %r11d + subl %r13d, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_avx1_last_31_start + addl %r13d, %r11d +L_AES_XTS_decrypt_avx1_mul16: +L_AES_XTS_decrypt_avx1_dec_16: + # 16 bytes of input + leaq (%rdi,%r13,1), %rcx + vmovdqu (%rcx), %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + # aes_dec_block + vpxor (%r8), %xmm8, %xmm8 + vmovdqu 16(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + cmpl $11, %r10d + vmovdqu 160(%r8), %xmm5 + jl L_AES_XTS_decrypt_avx1_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r8), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + cmpl $13, %r10d + vmovdqu 192(%r8), %xmm5 + jl L_AES_XTS_decrypt_avx1_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r8), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r8), %xmm5 +L_AES_XTS_decrypt_avx1_aes_dec_block_last: + vaesdeclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + leaq (%rsi,%r13,1), %rcx + vmovdqu %xmm8, (%rcx) + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $16, %r13d + cmpl %r11d, %r13d + jl L_AES_XTS_decrypt_avx1_dec_16 + cmpl %eax, %r13d + je L_AES_XTS_decrypt_avx1_done_dec +L_AES_XTS_decrypt_avx1_last_31_start: + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm7 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm7, %xmm7 + leaq (%rdi,%r13,1), %rcx + vmovdqu (%rcx), %xmm8 + vpxor %xmm7, %xmm8, %xmm8 + # aes_dec_block + vpxor (%r8), %xmm8, %xmm8 + vmovdqu 16(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + cmpl $11, %r10d + vmovdqu 160(%r8), %xmm5 + jl L_AES_XTS_decrypt_avx1_last_31_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r8), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + cmpl $13, %r10d + vmovdqu 192(%r8), %xmm5 + jl L_AES_XTS_decrypt_avx1_last_31_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r8), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r8), %xmm5 +L_AES_XTS_decrypt_avx1_last_31_aes_dec_block_last: + vaesdeclast %xmm5, %xmm8, %xmm8 + vpxor %xmm7, %xmm8, %xmm8 + vmovdqu %xmm8, (%rsp) + addq $16, %r13 + xorq %rdx, %rdx +L_AES_XTS_decrypt_avx1_last_31_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r13,1), %cl + movb %r11b, (%rsi,%r13,1) + movb %cl, (%rsp,%rdx,1) + incl %r13d + incl %edx + cmpl %eax, %r13d + jl L_AES_XTS_decrypt_avx1_last_31_byte_loop + subq %rdx, %r13 + vmovdqu (%rsp), %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + # aes_dec_block + vpxor (%r8), %xmm8, %xmm8 + vmovdqu 16(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r8), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + cmpl $11, %r10d + vmovdqu 160(%r8), %xmm5 + jl L_AES_XTS_decrypt_avx1_last_31_2_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r8), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + cmpl $13, %r10d + vmovdqu 192(%r8), %xmm5 + jl L_AES_XTS_decrypt_avx1_last_31_2_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r8), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r8), %xmm5 +L_AES_XTS_decrypt_avx1_last_31_2_aes_dec_block_last: + vaesdeclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + subq $16, %r13 + leaq (%rsi,%r13,1), %rcx + vmovdqu %xmm8, (%rcx) +L_AES_XTS_decrypt_avx1_done_dec: + addq $16, %rsp + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_decrypt_avx1,.-AES_XTS_decrypt_avx1 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl AES_XTS_decrypt_update_avx1 +.type AES_XTS_decrypt_update_avx1,@function +.align 16 +AES_XTS_decrypt_update_avx1: +#else +.section __TEXT,__text +.globl _AES_XTS_decrypt_update_avx1 +.p2align 4 +_AES_XTS_decrypt_update_avx1: +#endif /* __APPLE__ */ + pushq %r12 + movq %rdx, %rax + movq %rcx, %r10 + subq $16, %rsp + vmovdqu L_avx1_aes_xts_gc_xts(%rip), %xmm12 + vmovdqu (%r8), %xmm0 + xorl %r12d, %r12d + movl %eax, %r11d + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_update_avx1_mul16_64 + subl $16, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_update_avx1_last_31_start +L_AES_XTS_decrypt_update_avx1_mul16_64: + cmpl $0x40, %r11d + jl L_AES_XTS_decrypt_update_avx1_done_64 + andl $0xffffffc0, %r11d +L_AES_XTS_decrypt_update_avx1_dec_64: + # 64 bytes of input + # aes_dec_64 + leaq (%rdi,%r12,1), %rcx + leaq (%rsi,%r12,1), %rdx + vmovdqu (%rcx), %xmm8 + vmovdqu 16(%rcx), %xmm9 + vmovdqu 32(%rcx), %xmm10 + vmovdqu 48(%rcx), %xmm11 + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm1 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm1, %xmm1 + vpsrad $31, %xmm1, %xmm4 + vpslld $0x01, %xmm1, %xmm2 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm2, %xmm2 + vpsrad $31, %xmm2, %xmm4 + vpslld $0x01, %xmm2, %xmm3 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm3, %xmm3 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + # aes_dec_block + vmovdqu (%r10), %xmm4 + vpxor %xmm4, %xmm8, %xmm8 + vpxor %xmm4, %xmm9, %xmm9 + vpxor %xmm4, %xmm10, %xmm10 + vpxor %xmm4, %xmm11, %xmm11 + vmovdqu 16(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 32(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 48(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 64(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 80(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 96(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 112(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 128(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 144(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + cmpl $11, %r9d + vmovdqu 160(%r10), %xmm4 + jl L_AES_XTS_decrypt_update_avx1_aes_dec_64_aes_dec_block_last + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 176(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + cmpl $13, %r9d + vmovdqu 192(%r10), %xmm4 + jl L_AES_XTS_decrypt_update_avx1_aes_dec_64_aes_dec_block_last + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 208(%r10), %xmm4 + vaesdec %xmm4, %xmm8, %xmm8 + vaesdec %xmm4, %xmm9, %xmm9 + vaesdec %xmm4, %xmm10, %xmm10 + vaesdec %xmm4, %xmm11, %xmm11 + vmovdqu 224(%r10), %xmm4 +L_AES_XTS_decrypt_update_avx1_aes_dec_64_aes_dec_block_last: + vaesdeclast %xmm4, %xmm8, %xmm8 + vaesdeclast %xmm4, %xmm9, %xmm9 + vaesdeclast %xmm4, %xmm10, %xmm10 + vaesdeclast %xmm4, %xmm11, %xmm11 + vpxor %xmm0, %xmm8, %xmm8 + vpxor %xmm1, %xmm9, %xmm9 + vpxor %xmm2, %xmm10, %xmm10 + vpxor %xmm3, %xmm11, %xmm11 + vmovdqu %xmm8, (%rdx) + vmovdqu %xmm9, 16(%rdx) + vmovdqu %xmm10, 32(%rdx) + vmovdqu %xmm11, 48(%rdx) + vpsrad $31, %xmm3, %xmm4 + vpslld $0x01, %xmm3, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $0x40, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_decrypt_update_avx1_dec_64 +L_AES_XTS_decrypt_update_avx1_done_64: + cmpl %eax, %r12d + movl %eax, %r11d + je L_AES_XTS_decrypt_update_avx1_done_dec + andl $0xfffffff0, %r11d + cmpl %eax, %r11d + je L_AES_XTS_decrypt_update_avx1_mul16 + subl $16, %r11d + subl %r12d, %r11d + cmpl $16, %r11d + jl L_AES_XTS_decrypt_update_avx1_last_31_start + addl %r12d, %r11d +L_AES_XTS_decrypt_update_avx1_mul16: +L_AES_XTS_decrypt_update_avx1_dec_16: + # 16 bytes of input + leaq (%rdi,%r12,1), %rcx + vmovdqu (%rcx), %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + # aes_dec_block + vpxor (%r10), %xmm8, %xmm8 + vmovdqu 16(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + cmpl $11, %r9d + vmovdqu 160(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_avx1_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r10), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + cmpl $13, %r9d + vmovdqu 192(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_avx1_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r10), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r10), %xmm5 +L_AES_XTS_decrypt_update_avx1_aes_dec_block_last: + vaesdeclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + leaq (%rsi,%r12,1), %rcx + vmovdqu %xmm8, (%rcx) + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm0 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm0, %xmm0 + addl $16, %r12d + cmpl %r11d, %r12d + jl L_AES_XTS_decrypt_update_avx1_dec_16 + cmpl %eax, %r12d + je L_AES_XTS_decrypt_update_avx1_done_dec +L_AES_XTS_decrypt_update_avx1_last_31_start: + vpsrad $31, %xmm0, %xmm4 + vpslld $0x01, %xmm0, %xmm7 + vpshufd $0x93, %xmm4, %xmm4 + vpand %xmm12, %xmm4, %xmm4 + vpxor %xmm4, %xmm7, %xmm7 + leaq (%rdi,%r12,1), %rcx + vmovdqu (%rcx), %xmm8 + vpxor %xmm7, %xmm8, %xmm8 + # aes_dec_block + vpxor (%r10), %xmm8, %xmm8 + vmovdqu 16(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + cmpl $11, %r9d + vmovdqu 160(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_avx1_last_31_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r10), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + cmpl $13, %r9d + vmovdqu 192(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_avx1_last_31_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r10), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r10), %xmm5 +L_AES_XTS_decrypt_update_avx1_last_31_aes_dec_block_last: + vaesdeclast %xmm5, %xmm8, %xmm8 + vpxor %xmm7, %xmm8, %xmm8 + vmovdqu %xmm8, (%rsp) + addq $16, %r12 + xorq %rdx, %rdx +L_AES_XTS_decrypt_update_avx1_last_31_byte_loop: + movb (%rsp,%rdx,1), %r11b + movb (%rdi,%r12,1), %cl + movb %r11b, (%rsi,%r12,1) + movb %cl, (%rsp,%rdx,1) + incl %r12d + incl %edx + cmpl %eax, %r12d + jl L_AES_XTS_decrypt_update_avx1_last_31_byte_loop + subq %rdx, %r12 + vmovdqu (%rsp), %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + # aes_dec_block + vpxor (%r10), %xmm8, %xmm8 + vmovdqu 16(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 32(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 48(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 64(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 80(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 96(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 112(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 128(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 144(%r10), %xmm5 + vaesdec %xmm5, %xmm8, %xmm8 + cmpl $11, %r9d + vmovdqu 160(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_avx1_last_31_2_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 176(%r10), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + cmpl $13, %r9d + vmovdqu 192(%r10), %xmm5 + jl L_AES_XTS_decrypt_update_avx1_last_31_2_aes_dec_block_last + vaesdec %xmm5, %xmm8, %xmm8 + vmovdqu 208(%r10), %xmm6 + vaesdec %xmm6, %xmm8, %xmm8 + vmovdqu 224(%r10), %xmm5 +L_AES_XTS_decrypt_update_avx1_last_31_2_aes_dec_block_last: + vaesdeclast %xmm5, %xmm8, %xmm8 + vpxor %xmm0, %xmm8, %xmm8 + subq $16, %r12 + leaq (%rsi,%r12,1), %rcx + vmovdqu %xmm8, (%rcx) +L_AES_XTS_decrypt_update_avx1_done_dec: + vmovdqu %xmm0, (%r8) + addq $16, %rsp + popq %r12 + repz retq +#ifndef __APPLE__ +.size AES_XTS_decrypt_update_avx1,.-AES_XTS_decrypt_update_avx1 +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX1 */ +#endif /* WOLFSSL_X86_64_BUILD */ +#endif /* WOLFSSL_AES_XTS */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.asm mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.asm --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.asm 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/aes_xts_asm.asm 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2832 @@ +; /* aes_xts_asm.asm */ +; /* +; * Copyright (C) 2006-2024 wolfSSL Inc. +; * +; * This file is part of wolfSSL. +; * +; * wolfSSL 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 of the License, or +; * (at your option) any later version. +; * +; * wolfSSL 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, write to the Free Software +; * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +; */ +IF @Version LT 1200 +; AVX2 instructions not recognized by old versions of MASM +IFNDEF NO_AVX2_SUPPORT +NO_AVX2_SUPPORT = 1 +ENDIF +; MOVBE instruction not recognized by old versions of MASM +IFNDEF NO_MOVBE_SUPPORT +NO_MOVBE_SUPPORT = 1 +ENDIF +ENDIF + +IFNDEF HAVE_INTEL_AVX1 +HAVE_INTEL_AVX1 = 1 +ENDIF +IFNDEF NO_AVX2_SUPPORT +HAVE_INTEL_AVX2 = 1 +ENDIF + +IFNDEF _WIN64 +_WIN64 = 1 +ENDIF + +_text SEGMENT READONLY PARA +AES_XTS_init_aesni PROC + movdqu xmm0, OWORD PTR [rcx] + ; aes_enc_block + pxor xmm0, [rdx] + movdqu xmm2, OWORD PTR [rdx+16] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+32] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+48] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+64] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+80] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+96] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+112] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+128] + aesenc xmm0, xmm2 + movdqu xmm2, OWORD PTR [rdx+144] + aesenc xmm0, xmm2 + cmp r8d, 11 + movdqu xmm2, OWORD PTR [rdx+160] + jl L_AES_XTS_init_aesni_tweak_aes_enc_block_last + aesenc xmm0, xmm2 + movdqu xmm3, OWORD PTR [rdx+176] + aesenc xmm0, xmm3 + cmp r8d, 13 + movdqu xmm2, OWORD PTR [rdx+192] + jl L_AES_XTS_init_aesni_tweak_aes_enc_block_last + aesenc xmm0, xmm2 + movdqu xmm3, OWORD PTR [rdx+208] + aesenc xmm0, xmm3 + movdqu xmm2, OWORD PTR [rdx+224] +L_AES_XTS_init_aesni_tweak_aes_enc_block_last: + aesenclast xmm0, xmm2 + movdqu OWORD PTR [rcx], xmm0 + ret +AES_XTS_init_aesni ENDP +_text ENDS +_DATA SEGMENT +ALIGN 16 +L_aes_xts_gc_xts DWORD 135,1,1,1 +ptr_L_aes_xts_gc_xts QWORD L_aes_xts_gc_xts +_DATA ENDS +_text SEGMENT READONLY PARA +AES_XTS_encrypt_aesni PROC + push rdi + push rsi + push r12 + push r13 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r12, r9 + mov r8, QWORD PTR [rsp+72] + mov r9, QWORD PTR [rsp+80] + mov r10d, DWORD PTR [rsp+88] + sub rsp, 176 + movdqu OWORD PTR [rsp+64], xmm6 + movdqu OWORD PTR [rsp+80], xmm7 + movdqu OWORD PTR [rsp+96], xmm8 + movdqu OWORD PTR [rsp+112], xmm9 + movdqu OWORD PTR [rsp+128], xmm10 + movdqu OWORD PTR [rsp+144], xmm11 + movdqu OWORD PTR [rsp+160], xmm12 + movdqu xmm12, OWORD PTR L_aes_xts_gc_xts + movdqu xmm0, OWORD PTR [r12] + ; aes_enc_block + pxor xmm0, [r9] + movdqu xmm5, OWORD PTR [r9+16] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+32] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+48] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+64] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+80] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+96] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+112] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+128] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+144] + aesenc xmm0, xmm5 + cmp r10d, 11 + movdqu xmm5, OWORD PTR [r9+160] + jl L_AES_XTS_encrypt_aesni_tweak_aes_enc_block_last + aesenc xmm0, xmm5 + movdqu xmm6, OWORD PTR [r9+176] + aesenc xmm0, xmm6 + cmp r10d, 13 + movdqu xmm5, OWORD PTR [r9+192] + jl L_AES_XTS_encrypt_aesni_tweak_aes_enc_block_last + aesenc xmm0, xmm5 + movdqu xmm6, OWORD PTR [r9+208] + aesenc xmm0, xmm6 + movdqu xmm5, OWORD PTR [r9+224] +L_AES_XTS_encrypt_aesni_tweak_aes_enc_block_last: + aesenclast xmm0, xmm5 + xor r13d, r13d + cmp eax, 64 + mov r11d, eax + jl L_AES_XTS_encrypt_aesni_done_64 + and r11d, 4294967232 +L_AES_XTS_encrypt_aesni_enc_64: + ; 64 bytes of input + ; aes_enc_64 + lea rcx, QWORD PTR [rdi+r13] + lea rdx, QWORD PTR [rsi+r13] + movdqu xmm8, OWORD PTR [rcx] + movdqu xmm9, OWORD PTR [rcx+16] + movdqu xmm10, OWORD PTR [rcx+32] + movdqu xmm11, OWORD PTR [rcx+48] + movdqa xmm4, xmm0 + movdqa xmm1, xmm0 + psrad xmm4, 31 + pslld xmm1, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm1, xmm4 + movdqa xmm4, xmm1 + movdqa xmm2, xmm1 + psrad xmm4, 31 + pslld xmm2, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm2, xmm4 + movdqa xmm4, xmm2 + movdqa xmm3, xmm2 + psrad xmm4, 31 + pslld xmm3, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm3, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + ; aes_enc_block + movdqu xmm4, OWORD PTR [r8] + pxor xmm8, xmm4 + pxor xmm9, xmm4 + pxor xmm10, xmm4 + pxor xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+16] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+32] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+48] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+64] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+80] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+96] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+112] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+128] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+144] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + cmp r10d, 11 + movdqu xmm4, OWORD PTR [r8+160] + jl L_AES_XTS_encrypt_aesni_aes_enc_64_aes_enc_block_last + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+176] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + cmp r10d, 13 + movdqu xmm4, OWORD PTR [r8+192] + jl L_AES_XTS_encrypt_aesni_aes_enc_64_aes_enc_block_last + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+208] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+224] +L_AES_XTS_encrypt_aesni_aes_enc_64_aes_enc_block_last: + aesenclast xmm8, xmm4 + aesenclast xmm9, xmm4 + aesenclast xmm10, xmm4 + aesenclast xmm11, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 + movdqa xmm4, xmm3 + movdqa xmm0, xmm3 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r13d, 64 + cmp r13d, r11d + jl L_AES_XTS_encrypt_aesni_enc_64 +L_AES_XTS_encrypt_aesni_done_64: + cmp r13d, eax + mov r11d, eax + je L_AES_XTS_encrypt_aesni_done_enc + sub r11d, r13d + cmp r11d, 16 + mov r11d, eax + jl L_AES_XTS_encrypt_aesni_last_15 + and r11d, 4294967280 + ; 16 bytes of input +L_AES_XTS_encrypt_aesni_enc_16: + lea rcx, QWORD PTR [rdi+r13] + movdqu xmm8, OWORD PTR [rcx] + pxor xmm8, xmm0 + ; aes_enc_block + pxor xmm8, [r8] + movdqu xmm5, OWORD PTR [r8+16] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+32] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+48] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+64] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+80] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+96] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+112] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+128] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+144] + aesenc xmm8, xmm5 + cmp r10d, 11 + movdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_encrypt_aesni_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+176] + aesenc xmm8, xmm6 + cmp r10d, 13 + movdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_encrypt_aesni_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+208] + aesenc xmm8, xmm6 + movdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_encrypt_aesni_aes_enc_block_last: + aesenclast xmm8, xmm5 + pxor xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r13] + movdqu OWORD PTR [rcx], xmm8 + movdqa xmm4, xmm0 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r13d, 16 + cmp r13d, r11d + jl L_AES_XTS_encrypt_aesni_enc_16 + cmp r13d, eax + je L_AES_XTS_encrypt_aesni_done_enc +L_AES_XTS_encrypt_aesni_last_15: + sub r13, 16 + lea rcx, QWORD PTR [rsi+r13] + movdqu xmm8, OWORD PTR [rcx] + add r13, 16 + movdqu OWORD PTR [rsp], xmm8 + xor rdx, rdx +L_AES_XTS_encrypt_aesni_last_15_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r13] + mov BYTE PTR [rsi+r13], r11b + mov BYTE PTR [rsp+rdx], cl + inc r13d + inc edx + cmp r13d, eax + jl L_AES_XTS_encrypt_aesni_last_15_byte_loop + sub r13, rdx + movdqu xmm8, OWORD PTR [rsp] + sub r13, 16 + pxor xmm8, xmm0 + ; aes_enc_block + pxor xmm8, [r8] + movdqu xmm5, OWORD PTR [r8+16] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+32] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+48] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+64] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+80] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+96] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+112] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+128] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+144] + aesenc xmm8, xmm5 + cmp r10d, 11 + movdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_encrypt_aesni_last_15_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+176] + aesenc xmm8, xmm6 + cmp r10d, 13 + movdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_encrypt_aesni_last_15_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+208] + aesenc xmm8, xmm6 + movdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_encrypt_aesni_last_15_aes_enc_block_last: + aesenclast xmm8, xmm5 + pxor xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r13] + movdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_encrypt_aesni_done_enc: + movdqu xmm6, OWORD PTR [rsp+64] + movdqu xmm7, OWORD PTR [rsp+80] + movdqu xmm8, OWORD PTR [rsp+96] + movdqu xmm9, OWORD PTR [rsp+112] + movdqu xmm10, OWORD PTR [rsp+128] + movdqu xmm11, OWORD PTR [rsp+144] + movdqu xmm12, OWORD PTR [rsp+160] + add rsp, 176 + pop r13 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_encrypt_aesni ENDP +_text ENDS +_text SEGMENT READONLY PARA +AES_XTS_encrypt_update_aesni PROC + push rdi + push rsi + push r12 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r10, r9 + mov r8, QWORD PTR [rsp+64] + mov r9d, DWORD PTR [rsp+72] + sub rsp, 176 + movdqu OWORD PTR [rsp+64], xmm6 + movdqu OWORD PTR [rsp+80], xmm7 + movdqu OWORD PTR [rsp+96], xmm8 + movdqu OWORD PTR [rsp+112], xmm9 + movdqu OWORD PTR [rsp+128], xmm10 + movdqu OWORD PTR [rsp+144], xmm11 + movdqu OWORD PTR [rsp+160], xmm12 + movdqu xmm12, OWORD PTR L_aes_xts_gc_xts + movdqu xmm0, OWORD PTR [r8] + xor r12d, r12d + cmp eax, 64 + mov r11d, eax + jl L_AES_XTS_encrypt_update_aesni_done_64 + and r11d, 4294967232 +L_AES_XTS_encrypt_update_aesni_enc_64: + ; 64 bytes of input + ; aes_enc_64 + lea rcx, QWORD PTR [rdi+r12] + lea rdx, QWORD PTR [rsi+r12] + movdqu xmm8, OWORD PTR [rcx] + movdqu xmm9, OWORD PTR [rcx+16] + movdqu xmm10, OWORD PTR [rcx+32] + movdqu xmm11, OWORD PTR [rcx+48] + movdqa xmm4, xmm0 + movdqa xmm1, xmm0 + psrad xmm4, 31 + pslld xmm1, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm1, xmm4 + movdqa xmm4, xmm1 + movdqa xmm2, xmm1 + psrad xmm4, 31 + pslld xmm2, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm2, xmm4 + movdqa xmm4, xmm2 + movdqa xmm3, xmm2 + psrad xmm4, 31 + pslld xmm3, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm3, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + ; aes_enc_block + movdqu xmm4, OWORD PTR [r10] + pxor xmm8, xmm4 + pxor xmm9, xmm4 + pxor xmm10, xmm4 + pxor xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+16] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+32] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+48] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+64] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+80] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+96] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+112] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+128] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+144] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + cmp r9d, 11 + movdqu xmm4, OWORD PTR [r10+160] + jl L_AES_XTS_encrypt_update_aesni_aes_enc_64_aes_enc_block_last + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+176] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + cmp r9d, 13 + movdqu xmm4, OWORD PTR [r10+192] + jl L_AES_XTS_encrypt_update_aesni_aes_enc_64_aes_enc_block_last + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+208] + aesenc xmm8, xmm4 + aesenc xmm9, xmm4 + aesenc xmm10, xmm4 + aesenc xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+224] +L_AES_XTS_encrypt_update_aesni_aes_enc_64_aes_enc_block_last: + aesenclast xmm8, xmm4 + aesenclast xmm9, xmm4 + aesenclast xmm10, xmm4 + aesenclast xmm11, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 + movdqa xmm4, xmm3 + movdqa xmm0, xmm3 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r12d, 64 + cmp r12d, r11d + jl L_AES_XTS_encrypt_update_aesni_enc_64 +L_AES_XTS_encrypt_update_aesni_done_64: + cmp r12d, eax + mov r11d, eax + je L_AES_XTS_encrypt_update_aesni_done_enc + sub r11d, r12d + cmp r11d, 16 + mov r11d, eax + jl L_AES_XTS_encrypt_update_aesni_last_15 + and r11d, 4294967280 + ; 16 bytes of input +L_AES_XTS_encrypt_update_aesni_enc_16: + lea rcx, QWORD PTR [rdi+r12] + movdqu xmm8, OWORD PTR [rcx] + pxor xmm8, xmm0 + ; aes_enc_block + pxor xmm8, [r10] + movdqu xmm5, OWORD PTR [r10+16] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+32] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+48] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+64] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+80] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+96] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+112] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+128] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+144] + aesenc xmm8, xmm5 + cmp r9d, 11 + movdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_encrypt_update_aesni_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+176] + aesenc xmm8, xmm6 + cmp r9d, 13 + movdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_encrypt_update_aesni_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+208] + aesenc xmm8, xmm6 + movdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_encrypt_update_aesni_aes_enc_block_last: + aesenclast xmm8, xmm5 + pxor xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r12] + movdqu OWORD PTR [rcx], xmm8 + movdqa xmm4, xmm0 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r12d, 16 + cmp r12d, r11d + jl L_AES_XTS_encrypt_update_aesni_enc_16 + cmp r12d, eax + je L_AES_XTS_encrypt_update_aesni_done_enc +L_AES_XTS_encrypt_update_aesni_last_15: + sub r12, 16 + lea rcx, QWORD PTR [rsi+r12] + movdqu xmm8, OWORD PTR [rcx] + add r12, 16 + movdqu OWORD PTR [rsp], xmm8 + xor rdx, rdx +L_AES_XTS_encrypt_update_aesni_last_15_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r12] + mov BYTE PTR [rsi+r12], r11b + mov BYTE PTR [rsp+rdx], cl + inc r12d + inc edx + cmp r12d, eax + jl L_AES_XTS_encrypt_update_aesni_last_15_byte_loop + sub r12, rdx + movdqu xmm8, OWORD PTR [rsp] + sub r12, 16 + pxor xmm8, xmm0 + ; aes_enc_block + pxor xmm8, [r10] + movdqu xmm5, OWORD PTR [r10+16] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+32] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+48] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+64] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+80] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+96] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+112] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+128] + aesenc xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+144] + aesenc xmm8, xmm5 + cmp r9d, 11 + movdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_encrypt_update_aesni_last_15_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+176] + aesenc xmm8, xmm6 + cmp r9d, 13 + movdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_encrypt_update_aesni_last_15_aes_enc_block_last + aesenc xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+208] + aesenc xmm8, xmm6 + movdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_encrypt_update_aesni_last_15_aes_enc_block_last: + aesenclast xmm8, xmm5 + pxor xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r12] + movdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_encrypt_update_aesni_done_enc: + movdqu OWORD PTR [r8], xmm0 + movdqu xmm6, OWORD PTR [rsp+64] + movdqu xmm7, OWORD PTR [rsp+80] + movdqu xmm8, OWORD PTR [rsp+96] + movdqu xmm9, OWORD PTR [rsp+112] + movdqu xmm10, OWORD PTR [rsp+128] + movdqu xmm11, OWORD PTR [rsp+144] + movdqu xmm12, OWORD PTR [rsp+160] + add rsp, 176 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_encrypt_update_aesni ENDP +_text ENDS +_text SEGMENT READONLY PARA +AES_XTS_decrypt_aesni PROC + push rdi + push rsi + push r12 + push r13 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r12, r9 + mov r8, QWORD PTR [rsp+72] + mov r9, QWORD PTR [rsp+80] + mov r10d, DWORD PTR [rsp+88] + sub rsp, 128 + movdqu OWORD PTR [rsp+16], xmm6 + movdqu OWORD PTR [rsp+32], xmm7 + movdqu OWORD PTR [rsp+48], xmm8 + movdqu OWORD PTR [rsp+64], xmm9 + movdqu OWORD PTR [rsp+80], xmm10 + movdqu OWORD PTR [rsp+96], xmm11 + movdqu OWORD PTR [rsp+112], xmm12 + movdqu xmm12, OWORD PTR L_aes_xts_gc_xts + movdqu xmm0, OWORD PTR [r12] + ; aes_enc_block + pxor xmm0, [r9] + movdqu xmm5, OWORD PTR [r9+16] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+32] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+48] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+64] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+80] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+96] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+112] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+128] + aesenc xmm0, xmm5 + movdqu xmm5, OWORD PTR [r9+144] + aesenc xmm0, xmm5 + cmp r10d, 11 + movdqu xmm5, OWORD PTR [r9+160] + jl L_AES_XTS_decrypt_aesni_tweak_aes_enc_block_last + aesenc xmm0, xmm5 + movdqu xmm6, OWORD PTR [r9+176] + aesenc xmm0, xmm6 + cmp r10d, 13 + movdqu xmm5, OWORD PTR [r9+192] + jl L_AES_XTS_decrypt_aesni_tweak_aes_enc_block_last + aesenc xmm0, xmm5 + movdqu xmm6, OWORD PTR [r9+208] + aesenc xmm0, xmm6 + movdqu xmm5, OWORD PTR [r9+224] +L_AES_XTS_decrypt_aesni_tweak_aes_enc_block_last: + aesenclast xmm0, xmm5 + xor r13d, r13d + mov r11d, eax + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_aesni_mul16_64 + sub r11d, 16 + cmp r11d, 16 + jl L_AES_XTS_decrypt_aesni_last_31_start +L_AES_XTS_decrypt_aesni_mul16_64: + cmp r11d, 64 + jl L_AES_XTS_decrypt_aesni_done_64 + and r11d, 4294967232 +L_AES_XTS_decrypt_aesni_dec_64: + ; 64 bytes of input + ; aes_dec_64 + lea rcx, QWORD PTR [rdi+r13] + lea rdx, QWORD PTR [rsi+r13] + movdqu xmm8, OWORD PTR [rcx] + movdqu xmm9, OWORD PTR [rcx+16] + movdqu xmm10, OWORD PTR [rcx+32] + movdqu xmm11, OWORD PTR [rcx+48] + movdqa xmm4, xmm0 + movdqa xmm1, xmm0 + psrad xmm4, 31 + pslld xmm1, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm1, xmm4 + movdqa xmm4, xmm1 + movdqa xmm2, xmm1 + psrad xmm4, 31 + pslld xmm2, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm2, xmm4 + movdqa xmm4, xmm2 + movdqa xmm3, xmm2 + psrad xmm4, 31 + pslld xmm3, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm3, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + ; aes_dec_block + movdqu xmm4, OWORD PTR [r8] + pxor xmm8, xmm4 + pxor xmm9, xmm4 + pxor xmm10, xmm4 + pxor xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+16] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+32] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+48] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+64] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+80] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+96] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+112] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+128] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+144] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + cmp r10d, 11 + movdqu xmm4, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_aesni_aes_dec_64_aes_dec_block_last + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+176] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + cmp r10d, 13 + movdqu xmm4, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_aesni_aes_dec_64_aes_dec_block_last + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+208] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r8+224] +L_AES_XTS_decrypt_aesni_aes_dec_64_aes_dec_block_last: + aesdeclast xmm8, xmm4 + aesdeclast xmm9, xmm4 + aesdeclast xmm10, xmm4 + aesdeclast xmm11, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 + movdqa xmm4, xmm3 + movdqa xmm0, xmm3 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r13d, 64 + cmp r13d, r11d + jl L_AES_XTS_decrypt_aesni_dec_64 +L_AES_XTS_decrypt_aesni_done_64: + cmp r13d, eax + mov r11d, eax + je L_AES_XTS_decrypt_aesni_done_dec + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_aesni_mul16 + sub r11d, 16 + sub r11d, r13d + cmp r11d, 16 + jl L_AES_XTS_decrypt_aesni_last_31_start + add r11d, r13d +L_AES_XTS_decrypt_aesni_mul16: +L_AES_XTS_decrypt_aesni_dec_16: + ; 16 bytes of input + lea rcx, QWORD PTR [rdi+r13] + movdqu xmm8, OWORD PTR [rcx] + pxor xmm8, xmm0 + ; aes_dec_block + pxor xmm8, [r8] + movdqu xmm5, OWORD PTR [r8+16] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+32] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+48] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+64] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+80] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+96] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+112] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+128] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+144] + aesdec xmm8, xmm5 + cmp r10d, 11 + movdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_aesni_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+176] + aesdec xmm8, xmm6 + cmp r10d, 13 + movdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_aesni_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+208] + aesdec xmm8, xmm6 + movdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_decrypt_aesni_aes_dec_block_last: + aesdeclast xmm8, xmm5 + pxor xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r13] + movdqu OWORD PTR [rcx], xmm8 + movdqa xmm4, xmm0 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r13d, 16 + cmp r13d, r11d + jl L_AES_XTS_decrypt_aesni_dec_16 + cmp r13d, eax + je L_AES_XTS_decrypt_aesni_done_dec +L_AES_XTS_decrypt_aesni_last_31_start: + movdqa xmm4, xmm0 + movdqa xmm7, xmm0 + psrad xmm4, 31 + pslld xmm7, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm7, xmm4 + lea rcx, QWORD PTR [rdi+r13] + movdqu xmm8, OWORD PTR [rcx] + pxor xmm8, xmm7 + ; aes_dec_block + pxor xmm8, [r8] + movdqu xmm5, OWORD PTR [r8+16] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+32] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+48] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+64] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+80] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+96] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+112] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+128] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+144] + aesdec xmm8, xmm5 + cmp r10d, 11 + movdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_aesni_last_31_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+176] + aesdec xmm8, xmm6 + cmp r10d, 13 + movdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_aesni_last_31_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+208] + aesdec xmm8, xmm6 + movdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_decrypt_aesni_last_31_aes_dec_block_last: + aesdeclast xmm8, xmm5 + pxor xmm8, xmm7 + movdqu OWORD PTR [rsp], xmm8 + add r13, 16 + xor rdx, rdx +L_AES_XTS_decrypt_aesni_last_31_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r13] + mov BYTE PTR [rsi+r13], r11b + mov BYTE PTR [rsp+rdx], cl + inc r13d + inc edx + cmp r13d, eax + jl L_AES_XTS_decrypt_aesni_last_31_byte_loop + sub r13, rdx + movdqu xmm8, OWORD PTR [rsp] + pxor xmm8, xmm0 + ; aes_dec_block + pxor xmm8, [r8] + movdqu xmm5, OWORD PTR [r8+16] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+32] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+48] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+64] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+80] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+96] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+112] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+128] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r8+144] + aesdec xmm8, xmm5 + cmp r10d, 11 + movdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_aesni_last_31_2_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+176] + aesdec xmm8, xmm6 + cmp r10d, 13 + movdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_aesni_last_31_2_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r8+208] + aesdec xmm8, xmm6 + movdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_decrypt_aesni_last_31_2_aes_dec_block_last: + aesdeclast xmm8, xmm5 + pxor xmm8, xmm0 + sub r13, 16 + lea rcx, QWORD PTR [rsi+r13] + movdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_decrypt_aesni_done_dec: + movdqu xmm6, OWORD PTR [rsp+16] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm8, OWORD PTR [rsp+48] + movdqu xmm9, OWORD PTR [rsp+64] + movdqu xmm10, OWORD PTR [rsp+80] + movdqu xmm11, OWORD PTR [rsp+96] + movdqu xmm12, OWORD PTR [rsp+112] + add rsp, 128 + pop r13 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_decrypt_aesni ENDP +_text ENDS +_text SEGMENT READONLY PARA +AES_XTS_decrypt_update_aesni PROC + push rdi + push rsi + push r12 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r10, r9 + mov r8, QWORD PTR [rsp+64] + mov r9d, DWORD PTR [rsp+72] + sub rsp, 128 + movdqu OWORD PTR [rsp+16], xmm6 + movdqu OWORD PTR [rsp+32], xmm7 + movdqu OWORD PTR [rsp+48], xmm8 + movdqu OWORD PTR [rsp+64], xmm9 + movdqu OWORD PTR [rsp+80], xmm10 + movdqu OWORD PTR [rsp+96], xmm11 + movdqu OWORD PTR [rsp+112], xmm12 + movdqu xmm12, OWORD PTR L_aes_xts_gc_xts + movdqu xmm0, OWORD PTR [r8] + xor r12d, r12d + mov r11d, eax + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_update_aesni_mul16_64 + sub r11d, 16 + cmp r11d, 16 + jl L_AES_XTS_decrypt_update_aesni_last_31_start +L_AES_XTS_decrypt_update_aesni_mul16_64: + cmp r11d, 64 + jl L_AES_XTS_decrypt_update_aesni_done_64 + and r11d, 4294967232 +L_AES_XTS_decrypt_update_aesni_dec_64: + ; 64 bytes of input + ; aes_dec_64 + lea rcx, QWORD PTR [rdi+r12] + lea rdx, QWORD PTR [rsi+r12] + movdqu xmm8, OWORD PTR [rcx] + movdqu xmm9, OWORD PTR [rcx+16] + movdqu xmm10, OWORD PTR [rcx+32] + movdqu xmm11, OWORD PTR [rcx+48] + movdqa xmm4, xmm0 + movdqa xmm1, xmm0 + psrad xmm4, 31 + pslld xmm1, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm1, xmm4 + movdqa xmm4, xmm1 + movdqa xmm2, xmm1 + psrad xmm4, 31 + pslld xmm2, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm2, xmm4 + movdqa xmm4, xmm2 + movdqa xmm3, xmm2 + psrad xmm4, 31 + pslld xmm3, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm3, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + ; aes_dec_block + movdqu xmm4, OWORD PTR [r10] + pxor xmm8, xmm4 + pxor xmm9, xmm4 + pxor xmm10, xmm4 + pxor xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+16] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+32] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+48] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+64] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+80] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+96] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+112] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+128] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+144] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + cmp r9d, 11 + movdqu xmm4, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_aesni_aes_dec_64_aes_dec_block_last + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+176] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + cmp r9d, 13 + movdqu xmm4, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_aesni_aes_dec_64_aes_dec_block_last + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+208] + aesdec xmm8, xmm4 + aesdec xmm9, xmm4 + aesdec xmm10, xmm4 + aesdec xmm11, xmm4 + movdqu xmm4, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_aesni_aes_dec_64_aes_dec_block_last: + aesdeclast xmm8, xmm4 + aesdeclast xmm9, xmm4 + aesdeclast xmm10, xmm4 + aesdeclast xmm11, xmm4 + pxor xmm8, xmm0 + pxor xmm9, xmm1 + pxor xmm10, xmm2 + pxor xmm11, xmm3 + movdqu OWORD PTR [rdx], xmm8 + movdqu OWORD PTR [rdx+16], xmm9 + movdqu OWORD PTR [rdx+32], xmm10 + movdqu OWORD PTR [rdx+48], xmm11 + movdqa xmm4, xmm3 + movdqa xmm0, xmm3 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r12d, 64 + cmp r12d, r11d + jl L_AES_XTS_decrypt_update_aesni_dec_64 +L_AES_XTS_decrypt_update_aesni_done_64: + cmp r12d, eax + mov r11d, eax + je L_AES_XTS_decrypt_update_aesni_done_dec + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_update_aesni_mul16 + sub r11d, 16 + sub r11d, r12d + cmp r11d, 16 + jl L_AES_XTS_decrypt_update_aesni_last_31_start + add r11d, r12d +L_AES_XTS_decrypt_update_aesni_mul16: +L_AES_XTS_decrypt_update_aesni_dec_16: + ; 16 bytes of input + lea rcx, QWORD PTR [rdi+r12] + movdqu xmm8, OWORD PTR [rcx] + pxor xmm8, xmm0 + ; aes_dec_block + pxor xmm8, [r10] + movdqu xmm5, OWORD PTR [r10+16] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+32] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+48] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+64] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+80] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+96] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+112] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+128] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+144] + aesdec xmm8, xmm5 + cmp r9d, 11 + movdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_aesni_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+176] + aesdec xmm8, xmm6 + cmp r9d, 13 + movdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_aesni_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+208] + aesdec xmm8, xmm6 + movdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_aesni_aes_dec_block_last: + aesdeclast xmm8, xmm5 + pxor xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r12] + movdqu OWORD PTR [rcx], xmm8 + movdqa xmm4, xmm0 + psrad xmm4, 31 + pslld xmm0, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm0, xmm4 + add r12d, 16 + cmp r12d, r11d + jl L_AES_XTS_decrypt_update_aesni_dec_16 + cmp r12d, eax + je L_AES_XTS_decrypt_update_aesni_done_dec +L_AES_XTS_decrypt_update_aesni_last_31_start: + movdqa xmm4, xmm0 + movdqa xmm7, xmm0 + psrad xmm4, 31 + pslld xmm7, 1 + pshufd xmm4, xmm4, 147 + pand xmm4, xmm12 + pxor xmm7, xmm4 + lea rcx, QWORD PTR [rdi+r12] + movdqu xmm8, OWORD PTR [rcx] + pxor xmm8, xmm7 + ; aes_dec_block + pxor xmm8, [r10] + movdqu xmm5, OWORD PTR [r10+16] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+32] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+48] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+64] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+80] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+96] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+112] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+128] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+144] + aesdec xmm8, xmm5 + cmp r9d, 11 + movdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_aesni_last_31_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+176] + aesdec xmm8, xmm6 + cmp r9d, 13 + movdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_aesni_last_31_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+208] + aesdec xmm8, xmm6 + movdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_aesni_last_31_aes_dec_block_last: + aesdeclast xmm8, xmm5 + pxor xmm8, xmm7 + movdqu OWORD PTR [rsp], xmm8 + add r12, 16 + xor rdx, rdx +L_AES_XTS_decrypt_update_aesni_last_31_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r12] + mov BYTE PTR [rsi+r12], r11b + mov BYTE PTR [rsp+rdx], cl + inc r12d + inc edx + cmp r12d, eax + jl L_AES_XTS_decrypt_update_aesni_last_31_byte_loop + sub r12, rdx + movdqu xmm8, OWORD PTR [rsp] + pxor xmm8, xmm0 + ; aes_dec_block + pxor xmm8, [r10] + movdqu xmm5, OWORD PTR [r10+16] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+32] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+48] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+64] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+80] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+96] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+112] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+128] + aesdec xmm8, xmm5 + movdqu xmm5, OWORD PTR [r10+144] + aesdec xmm8, xmm5 + cmp r9d, 11 + movdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_aesni_last_31_2_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+176] + aesdec xmm8, xmm6 + cmp r9d, 13 + movdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_aesni_last_31_2_aes_dec_block_last + aesdec xmm8, xmm5 + movdqu xmm6, OWORD PTR [r10+208] + aesdec xmm8, xmm6 + movdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_aesni_last_31_2_aes_dec_block_last: + aesdeclast xmm8, xmm5 + pxor xmm8, xmm0 + sub r12, 16 + lea rcx, QWORD PTR [rsi+r12] + movdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_decrypt_update_aesni_done_dec: + movdqu OWORD PTR [r8], xmm0 + movdqu xmm6, OWORD PTR [rsp+16] + movdqu xmm7, OWORD PTR [rsp+32] + movdqu xmm8, OWORD PTR [rsp+48] + movdqu xmm9, OWORD PTR [rsp+64] + movdqu xmm10, OWORD PTR [rsp+80] + movdqu xmm11, OWORD PTR [rsp+96] + movdqu xmm12, OWORD PTR [rsp+112] + add rsp, 128 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_decrypt_update_aesni ENDP +_text ENDS +IFDEF HAVE_INTEL_AVX1 +_text SEGMENT READONLY PARA +AES_XTS_init_avx1 PROC + mov eax, r8d + vmovdqu xmm0, OWORD PTR [rcx] + ; aes_enc_block + vpxor xmm0, xmm0, [rdx] + vmovdqu xmm2, OWORD PTR [rdx+16] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+32] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+48] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+64] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+80] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+96] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+112] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+128] + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm2, OWORD PTR [rdx+144] + vaesenc xmm0, xmm0, xmm2 + cmp eax, 11 + vmovdqu xmm2, OWORD PTR [rdx+160] + jl L_AES_XTS_init_avx1_tweak_aes_enc_block_last + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm3, OWORD PTR [rdx+176] + vaesenc xmm0, xmm0, xmm3 + cmp eax, 13 + vmovdqu xmm2, OWORD PTR [rdx+192] + jl L_AES_XTS_init_avx1_tweak_aes_enc_block_last + vaesenc xmm0, xmm0, xmm2 + vmovdqu xmm3, OWORD PTR [rdx+208] + vaesenc xmm0, xmm0, xmm3 + vmovdqu xmm2, OWORD PTR [rdx+224] +L_AES_XTS_init_avx1_tweak_aes_enc_block_last: + vaesenclast xmm0, xmm0, xmm2 + vmovdqu OWORD PTR [rcx], xmm0 + ret +AES_XTS_init_avx1 ENDP +_text ENDS +_DATA SEGMENT +ALIGN 16 +L_avx1_aes_xts_gc_xts DWORD 135,1,1,1 +ptr_L_avx1_aes_xts_gc_xts QWORD L_avx1_aes_xts_gc_xts +_DATA ENDS +_text SEGMENT READONLY PARA +AES_XTS_encrypt_avx1 PROC + push rdi + push rsi + push r12 + push r13 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r12, r9 + mov r8, QWORD PTR [rsp+72] + mov r9, QWORD PTR [rsp+80] + mov r10d, DWORD PTR [rsp+88] + sub rsp, 176 + vmovdqu OWORD PTR [rsp+64], xmm6 + vmovdqu OWORD PTR [rsp+80], xmm7 + vmovdqu OWORD PTR [rsp+96], xmm8 + vmovdqu OWORD PTR [rsp+112], xmm9 + vmovdqu OWORD PTR [rsp+128], xmm10 + vmovdqu OWORD PTR [rsp+144], xmm11 + vmovdqu OWORD PTR [rsp+160], xmm12 + vmovdqu xmm12, OWORD PTR L_avx1_aes_xts_gc_xts + vmovdqu xmm0, OWORD PTR [r12] + ; aes_enc_block + vpxor xmm0, xmm0, [r9] + vmovdqu xmm5, OWORD PTR [r9+16] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+32] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+48] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+64] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+80] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+96] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+112] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+128] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+144] + vaesenc xmm0, xmm0, xmm5 + cmp r10d, 11 + vmovdqu xmm5, OWORD PTR [r9+160] + jl L_AES_XTS_encrypt_avx1_tweak_aes_enc_block_last + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm6, OWORD PTR [r9+176] + vaesenc xmm0, xmm0, xmm6 + cmp r10d, 13 + vmovdqu xmm5, OWORD PTR [r9+192] + jl L_AES_XTS_encrypt_avx1_tweak_aes_enc_block_last + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm6, OWORD PTR [r9+208] + vaesenc xmm0, xmm0, xmm6 + vmovdqu xmm5, OWORD PTR [r9+224] +L_AES_XTS_encrypt_avx1_tweak_aes_enc_block_last: + vaesenclast xmm0, xmm0, xmm5 + xor r13d, r13d + cmp eax, 64 + mov r11d, eax + jl L_AES_XTS_encrypt_avx1_done_64 + and r11d, 4294967232 +L_AES_XTS_encrypt_avx1_enc_64: + ; 64 bytes of input + ; aes_enc_64 + lea rcx, QWORD PTR [rdi+r13] + lea rdx, QWORD PTR [rsi+r13] + vmovdqu xmm8, OWORD PTR [rcx] + vmovdqu xmm9, OWORD PTR [rcx+16] + vmovdqu xmm10, OWORD PTR [rcx+32] + vmovdqu xmm11, OWORD PTR [rcx+48] + vpsrad xmm4, xmm0, 31 + vpslld xmm1, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm1, xmm1, xmm4 + vpsrad xmm4, xmm1, 31 + vpslld xmm2, xmm1, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm2, xmm2, xmm4 + vpsrad xmm4, xmm2, 31 + vpslld xmm3, xmm2, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm3, xmm3, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + ; aes_enc_block + vmovdqu xmm4, OWORD PTR [r8] + vpxor xmm8, xmm8, xmm4 + vpxor xmm9, xmm9, xmm4 + vpxor xmm10, xmm10, xmm4 + vpxor xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+16] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+32] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+48] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+64] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+80] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+96] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+112] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+128] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+144] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + cmp r10d, 11 + vmovdqu xmm4, OWORD PTR [r8+160] + jl L_AES_XTS_encrypt_avx1_aes_enc_64_aes_enc_block_last + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+176] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + cmp r10d, 13 + vmovdqu xmm4, OWORD PTR [r8+192] + jl L_AES_XTS_encrypt_avx1_aes_enc_64_aes_enc_block_last + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+208] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+224] +L_AES_XTS_encrypt_avx1_aes_enc_64_aes_enc_block_last: + vaesenclast xmm8, xmm8, xmm4 + vaesenclast xmm9, xmm9, xmm4 + vaesenclast xmm10, xmm10, xmm4 + vaesenclast xmm11, xmm11, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + vmovdqu OWORD PTR [rdx], xmm8 + vmovdqu OWORD PTR [rdx+16], xmm9 + vmovdqu OWORD PTR [rdx+32], xmm10 + vmovdqu OWORD PTR [rdx+48], xmm11 + vpsrad xmm4, xmm3, 31 + vpslld xmm0, xmm3, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r13d, 64 + cmp r13d, r11d + jl L_AES_XTS_encrypt_avx1_enc_64 +L_AES_XTS_encrypt_avx1_done_64: + cmp r13d, eax + mov r11d, eax + je L_AES_XTS_encrypt_avx1_done_enc + sub r11d, r13d + cmp r11d, 16 + mov r11d, eax + jl L_AES_XTS_encrypt_avx1_last_15 + and r11d, 4294967280 + ; 16 bytes of input +L_AES_XTS_encrypt_avx1_enc_16: + lea rcx, QWORD PTR [rdi+r13] + vmovdqu xmm8, OWORD PTR [rcx] + vpxor xmm8, xmm8, xmm0 + ; aes_enc_block + vpxor xmm8, xmm8, [r8] + vmovdqu xmm5, OWORD PTR [r8+16] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+32] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+48] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+64] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+80] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+96] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+112] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+128] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+144] + vaesenc xmm8, xmm8, xmm5 + cmp r10d, 11 + vmovdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_encrypt_avx1_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+176] + vaesenc xmm8, xmm8, xmm6 + cmp r10d, 13 + vmovdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_encrypt_avx1_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+208] + vaesenc xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_encrypt_avx1_aes_enc_block_last: + vaesenclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r13] + vmovdqu OWORD PTR [rcx], xmm8 + vpsrad xmm4, xmm0, 31 + vpslld xmm0, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r13d, 16 + cmp r13d, r11d + jl L_AES_XTS_encrypt_avx1_enc_16 + cmp r13d, eax + je L_AES_XTS_encrypt_avx1_done_enc +L_AES_XTS_encrypt_avx1_last_15: + sub r13, 16 + lea rcx, QWORD PTR [rsi+r13] + vmovdqu xmm8, OWORD PTR [rcx] + add r13, 16 + vmovdqu OWORD PTR [rsp], xmm8 + xor rdx, rdx +L_AES_XTS_encrypt_avx1_last_15_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r13] + mov BYTE PTR [rsi+r13], r11b + mov BYTE PTR [rsp+rdx], cl + inc r13d + inc edx + cmp r13d, eax + jl L_AES_XTS_encrypt_avx1_last_15_byte_loop + sub r13, rdx + vmovdqu xmm8, OWORD PTR [rsp] + sub r13, 16 + vpxor xmm8, xmm8, xmm0 + ; aes_enc_block + vpxor xmm8, xmm8, [r8] + vmovdqu xmm5, OWORD PTR [r8+16] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+32] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+48] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+64] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+80] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+96] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+112] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+128] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+144] + vaesenc xmm8, xmm8, xmm5 + cmp r10d, 11 + vmovdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_encrypt_avx1_last_15_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+176] + vaesenc xmm8, xmm8, xmm6 + cmp r10d, 13 + vmovdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_encrypt_avx1_last_15_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+208] + vaesenc xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_encrypt_avx1_last_15_aes_enc_block_last: + vaesenclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r13] + vmovdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_encrypt_avx1_done_enc: + vmovdqu xmm6, OWORD PTR [rsp+64] + vmovdqu xmm7, OWORD PTR [rsp+80] + vmovdqu xmm8, OWORD PTR [rsp+96] + vmovdqu xmm9, OWORD PTR [rsp+112] + vmovdqu xmm10, OWORD PTR [rsp+128] + vmovdqu xmm11, OWORD PTR [rsp+144] + vmovdqu xmm12, OWORD PTR [rsp+160] + add rsp, 176 + pop r13 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_encrypt_avx1 ENDP +_text ENDS +_text SEGMENT READONLY PARA +AES_XTS_encrypt_update_avx1 PROC + push rdi + push rsi + push r12 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r10, r9 + mov r8, QWORD PTR [rsp+64] + mov r9d, DWORD PTR [rsp+72] + sub rsp, 176 + vmovdqu OWORD PTR [rsp+64], xmm6 + vmovdqu OWORD PTR [rsp+80], xmm7 + vmovdqu OWORD PTR [rsp+96], xmm8 + vmovdqu OWORD PTR [rsp+112], xmm9 + vmovdqu OWORD PTR [rsp+128], xmm10 + vmovdqu OWORD PTR [rsp+144], xmm11 + vmovdqu OWORD PTR [rsp+160], xmm12 + vmovdqu xmm12, OWORD PTR L_avx1_aes_xts_gc_xts + vmovdqu xmm0, OWORD PTR [r8] + xor r12d, r12d + cmp eax, 64 + mov r11d, eax + jl L_AES_XTS_encrypt_update_avx1_done_64 + and r11d, 4294967232 +L_AES_XTS_encrypt_update_avx1_enc_64: + ; 64 bytes of input + ; aes_enc_64 + lea rcx, QWORD PTR [rdi+r12] + lea rdx, QWORD PTR [rsi+r12] + vmovdqu xmm8, OWORD PTR [rcx] + vmovdqu xmm9, OWORD PTR [rcx+16] + vmovdqu xmm10, OWORD PTR [rcx+32] + vmovdqu xmm11, OWORD PTR [rcx+48] + vpsrad xmm4, xmm0, 31 + vpslld xmm1, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm1, xmm1, xmm4 + vpsrad xmm4, xmm1, 31 + vpslld xmm2, xmm1, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm2, xmm2, xmm4 + vpsrad xmm4, xmm2, 31 + vpslld xmm3, xmm2, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm3, xmm3, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + ; aes_enc_block + vmovdqu xmm4, OWORD PTR [r10] + vpxor xmm8, xmm8, xmm4 + vpxor xmm9, xmm9, xmm4 + vpxor xmm10, xmm10, xmm4 + vpxor xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+16] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+32] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+48] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+64] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+80] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+96] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+112] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+128] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+144] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + cmp r9d, 11 + vmovdqu xmm4, OWORD PTR [r10+160] + jl L_AES_XTS_encrypt_update_avx1_aes_enc_64_aes_enc_block_last + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+176] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + cmp r9d, 13 + vmovdqu xmm4, OWORD PTR [r10+192] + jl L_AES_XTS_encrypt_update_avx1_aes_enc_64_aes_enc_block_last + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+208] + vaesenc xmm8, xmm8, xmm4 + vaesenc xmm9, xmm9, xmm4 + vaesenc xmm10, xmm10, xmm4 + vaesenc xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+224] +L_AES_XTS_encrypt_update_avx1_aes_enc_64_aes_enc_block_last: + vaesenclast xmm8, xmm8, xmm4 + vaesenclast xmm9, xmm9, xmm4 + vaesenclast xmm10, xmm10, xmm4 + vaesenclast xmm11, xmm11, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + vmovdqu OWORD PTR [rdx], xmm8 + vmovdqu OWORD PTR [rdx+16], xmm9 + vmovdqu OWORD PTR [rdx+32], xmm10 + vmovdqu OWORD PTR [rdx+48], xmm11 + vpsrad xmm4, xmm3, 31 + vpslld xmm0, xmm3, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r12d, 64 + cmp r12d, r11d + jl L_AES_XTS_encrypt_update_avx1_enc_64 +L_AES_XTS_encrypt_update_avx1_done_64: + cmp r12d, eax + mov r11d, eax + je L_AES_XTS_encrypt_update_avx1_done_enc + sub r11d, r12d + cmp r11d, 16 + mov r11d, eax + jl L_AES_XTS_encrypt_update_avx1_last_15 + and r11d, 4294967280 + ; 16 bytes of input +L_AES_XTS_encrypt_update_avx1_enc_16: + lea rcx, QWORD PTR [rdi+r12] + vmovdqu xmm8, OWORD PTR [rcx] + vpxor xmm8, xmm8, xmm0 + ; aes_enc_block + vpxor xmm8, xmm8, [r10] + vmovdqu xmm5, OWORD PTR [r10+16] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+32] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+48] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+64] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+80] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+96] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+112] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+128] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+144] + vaesenc xmm8, xmm8, xmm5 + cmp r9d, 11 + vmovdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_encrypt_update_avx1_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+176] + vaesenc xmm8, xmm8, xmm6 + cmp r9d, 13 + vmovdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_encrypt_update_avx1_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+208] + vaesenc xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_encrypt_update_avx1_aes_enc_block_last: + vaesenclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r12] + vmovdqu OWORD PTR [rcx], xmm8 + vpsrad xmm4, xmm0, 31 + vpslld xmm0, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r12d, 16 + cmp r12d, r11d + jl L_AES_XTS_encrypt_update_avx1_enc_16 + cmp r12d, eax + je L_AES_XTS_encrypt_update_avx1_done_enc +L_AES_XTS_encrypt_update_avx1_last_15: + sub r12, 16 + lea rcx, QWORD PTR [rsi+r12] + vmovdqu xmm8, OWORD PTR [rcx] + add r12, 16 + vmovdqu OWORD PTR [rsp], xmm8 + xor rdx, rdx +L_AES_XTS_encrypt_update_avx1_last_15_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r12] + mov BYTE PTR [rsi+r12], r11b + mov BYTE PTR [rsp+rdx], cl + inc r12d + inc edx + cmp r12d, eax + jl L_AES_XTS_encrypt_update_avx1_last_15_byte_loop + sub r12, rdx + vmovdqu xmm8, OWORD PTR [rsp] + sub r12, 16 + vpxor xmm8, xmm8, xmm0 + ; aes_enc_block + vpxor xmm8, xmm8, [r10] + vmovdqu xmm5, OWORD PTR [r10+16] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+32] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+48] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+64] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+80] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+96] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+112] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+128] + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+144] + vaesenc xmm8, xmm8, xmm5 + cmp r9d, 11 + vmovdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_encrypt_update_avx1_last_15_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+176] + vaesenc xmm8, xmm8, xmm6 + cmp r9d, 13 + vmovdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_encrypt_update_avx1_last_15_aes_enc_block_last + vaesenc xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+208] + vaesenc xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_encrypt_update_avx1_last_15_aes_enc_block_last: + vaesenclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r12] + vmovdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_encrypt_update_avx1_done_enc: + vmovdqu OWORD PTR [r8], xmm0 + vmovdqu xmm6, OWORD PTR [rsp+64] + vmovdqu xmm7, OWORD PTR [rsp+80] + vmovdqu xmm8, OWORD PTR [rsp+96] + vmovdqu xmm9, OWORD PTR [rsp+112] + vmovdqu xmm10, OWORD PTR [rsp+128] + vmovdqu xmm11, OWORD PTR [rsp+144] + vmovdqu xmm12, OWORD PTR [rsp+160] + add rsp, 176 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_encrypt_update_avx1 ENDP +_text ENDS +_text SEGMENT READONLY PARA +AES_XTS_decrypt_avx1 PROC + push rdi + push rsi + push r12 + push r13 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r12, r9 + mov r8, QWORD PTR [rsp+72] + mov r9, QWORD PTR [rsp+80] + mov r10d, DWORD PTR [rsp+88] + sub rsp, 128 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 + vmovdqu OWORD PTR [rsp+48], xmm8 + vmovdqu OWORD PTR [rsp+64], xmm9 + vmovdqu OWORD PTR [rsp+80], xmm10 + vmovdqu OWORD PTR [rsp+96], xmm11 + vmovdqu OWORD PTR [rsp+112], xmm12 + vmovdqu xmm12, OWORD PTR L_avx1_aes_xts_gc_xts + vmovdqu xmm0, OWORD PTR [r12] + ; aes_enc_block + vpxor xmm0, xmm0, [r9] + vmovdqu xmm5, OWORD PTR [r9+16] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+32] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+48] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+64] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+80] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+96] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+112] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+128] + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm5, OWORD PTR [r9+144] + vaesenc xmm0, xmm0, xmm5 + cmp r10d, 11 + vmovdqu xmm5, OWORD PTR [r9+160] + jl L_AES_XTS_decrypt_avx1_tweak_aes_enc_block_last + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm6, OWORD PTR [r9+176] + vaesenc xmm0, xmm0, xmm6 + cmp r10d, 13 + vmovdqu xmm5, OWORD PTR [r9+192] + jl L_AES_XTS_decrypt_avx1_tweak_aes_enc_block_last + vaesenc xmm0, xmm0, xmm5 + vmovdqu xmm6, OWORD PTR [r9+208] + vaesenc xmm0, xmm0, xmm6 + vmovdqu xmm5, OWORD PTR [r9+224] +L_AES_XTS_decrypt_avx1_tweak_aes_enc_block_last: + vaesenclast xmm0, xmm0, xmm5 + xor r13d, r13d + mov r11d, eax + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_avx1_mul16_64 + sub r11d, 16 + cmp r11d, 16 + jl L_AES_XTS_decrypt_avx1_last_31_start +L_AES_XTS_decrypt_avx1_mul16_64: + cmp r11d, 64 + jl L_AES_XTS_decrypt_avx1_done_64 + and r11d, 4294967232 +L_AES_XTS_decrypt_avx1_dec_64: + ; 64 bytes of input + ; aes_dec_64 + lea rcx, QWORD PTR [rdi+r13] + lea rdx, QWORD PTR [rsi+r13] + vmovdqu xmm8, OWORD PTR [rcx] + vmovdqu xmm9, OWORD PTR [rcx+16] + vmovdqu xmm10, OWORD PTR [rcx+32] + vmovdqu xmm11, OWORD PTR [rcx+48] + vpsrad xmm4, xmm0, 31 + vpslld xmm1, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm1, xmm1, xmm4 + vpsrad xmm4, xmm1, 31 + vpslld xmm2, xmm1, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm2, xmm2, xmm4 + vpsrad xmm4, xmm2, 31 + vpslld xmm3, xmm2, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm3, xmm3, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + ; aes_dec_block + vmovdqu xmm4, OWORD PTR [r8] + vpxor xmm8, xmm8, xmm4 + vpxor xmm9, xmm9, xmm4 + vpxor xmm10, xmm10, xmm4 + vpxor xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+16] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+32] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+48] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+64] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+80] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+96] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+112] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+128] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+144] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + cmp r10d, 11 + vmovdqu xmm4, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_avx1_aes_dec_64_aes_dec_block_last + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+176] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + cmp r10d, 13 + vmovdqu xmm4, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_avx1_aes_dec_64_aes_dec_block_last + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+208] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r8+224] +L_AES_XTS_decrypt_avx1_aes_dec_64_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm4 + vaesdeclast xmm9, xmm9, xmm4 + vaesdeclast xmm10, xmm10, xmm4 + vaesdeclast xmm11, xmm11, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + vmovdqu OWORD PTR [rdx], xmm8 + vmovdqu OWORD PTR [rdx+16], xmm9 + vmovdqu OWORD PTR [rdx+32], xmm10 + vmovdqu OWORD PTR [rdx+48], xmm11 + vpsrad xmm4, xmm3, 31 + vpslld xmm0, xmm3, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r13d, 64 + cmp r13d, r11d + jl L_AES_XTS_decrypt_avx1_dec_64 +L_AES_XTS_decrypt_avx1_done_64: + cmp r13d, eax + mov r11d, eax + je L_AES_XTS_decrypt_avx1_done_dec + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_avx1_mul16 + sub r11d, 16 + sub r11d, r13d + cmp r11d, 16 + jl L_AES_XTS_decrypt_avx1_last_31_start + add r11d, r13d +L_AES_XTS_decrypt_avx1_mul16: +L_AES_XTS_decrypt_avx1_dec_16: + ; 16 bytes of input + lea rcx, QWORD PTR [rdi+r13] + vmovdqu xmm8, OWORD PTR [rcx] + vpxor xmm8, xmm8, xmm0 + ; aes_dec_block + vpxor xmm8, xmm8, [r8] + vmovdqu xmm5, OWORD PTR [r8+16] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+32] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+48] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+64] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+80] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+96] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+112] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+128] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+144] + vaesdec xmm8, xmm8, xmm5 + cmp r10d, 11 + vmovdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_avx1_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+176] + vaesdec xmm8, xmm8, xmm6 + cmp r10d, 13 + vmovdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_avx1_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+208] + vaesdec xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_decrypt_avx1_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r13] + vmovdqu OWORD PTR [rcx], xmm8 + vpsrad xmm4, xmm0, 31 + vpslld xmm0, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r13d, 16 + cmp r13d, r11d + jl L_AES_XTS_decrypt_avx1_dec_16 + cmp r13d, eax + je L_AES_XTS_decrypt_avx1_done_dec +L_AES_XTS_decrypt_avx1_last_31_start: + vpsrad xmm4, xmm0, 31 + vpslld xmm7, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm7, xmm7, xmm4 + lea rcx, QWORD PTR [rdi+r13] + vmovdqu xmm8, OWORD PTR [rcx] + vpxor xmm8, xmm8, xmm7 + ; aes_dec_block + vpxor xmm8, xmm8, [r8] + vmovdqu xmm5, OWORD PTR [r8+16] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+32] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+48] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+64] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+80] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+96] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+112] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+128] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+144] + vaesdec xmm8, xmm8, xmm5 + cmp r10d, 11 + vmovdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_avx1_last_31_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+176] + vaesdec xmm8, xmm8, xmm6 + cmp r10d, 13 + vmovdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_avx1_last_31_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+208] + vaesdec xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_decrypt_avx1_last_31_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm7 + vmovdqu OWORD PTR [rsp], xmm8 + add r13, 16 + xor rdx, rdx +L_AES_XTS_decrypt_avx1_last_31_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r13] + mov BYTE PTR [rsi+r13], r11b + mov BYTE PTR [rsp+rdx], cl + inc r13d + inc edx + cmp r13d, eax + jl L_AES_XTS_decrypt_avx1_last_31_byte_loop + sub r13, rdx + vmovdqu xmm8, OWORD PTR [rsp] + vpxor xmm8, xmm8, xmm0 + ; aes_dec_block + vpxor xmm8, xmm8, [r8] + vmovdqu xmm5, OWORD PTR [r8+16] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+32] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+48] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+64] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+80] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+96] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+112] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+128] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r8+144] + vaesdec xmm8, xmm8, xmm5 + cmp r10d, 11 + vmovdqu xmm5, OWORD PTR [r8+160] + jl L_AES_XTS_decrypt_avx1_last_31_2_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+176] + vaesdec xmm8, xmm8, xmm6 + cmp r10d, 13 + vmovdqu xmm5, OWORD PTR [r8+192] + jl L_AES_XTS_decrypt_avx1_last_31_2_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r8+208] + vaesdec xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r8+224] +L_AES_XTS_decrypt_avx1_last_31_2_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + sub r13, 16 + lea rcx, QWORD PTR [rsi+r13] + vmovdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_decrypt_avx1_done_dec: + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + vmovdqu xmm8, OWORD PTR [rsp+48] + vmovdqu xmm9, OWORD PTR [rsp+64] + vmovdqu xmm10, OWORD PTR [rsp+80] + vmovdqu xmm11, OWORD PTR [rsp+96] + vmovdqu xmm12, OWORD PTR [rsp+112] + add rsp, 128 + pop r13 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_decrypt_avx1 ENDP +_text ENDS +_text SEGMENT READONLY PARA +AES_XTS_decrypt_update_avx1 PROC + push rdi + push rsi + push r12 + mov rdi, rcx + mov rsi, rdx + mov rax, r8 + mov r10, r9 + mov r8, QWORD PTR [rsp+64] + mov r9d, DWORD PTR [rsp+72] + sub rsp, 128 + vmovdqu OWORD PTR [rsp+16], xmm6 + vmovdqu OWORD PTR [rsp+32], xmm7 + vmovdqu OWORD PTR [rsp+48], xmm8 + vmovdqu OWORD PTR [rsp+64], xmm9 + vmovdqu OWORD PTR [rsp+80], xmm10 + vmovdqu OWORD PTR [rsp+96], xmm11 + vmovdqu OWORD PTR [rsp+112], xmm12 + vmovdqu xmm12, OWORD PTR L_avx1_aes_xts_gc_xts + vmovdqu xmm0, OWORD PTR [r8] + xor r12d, r12d + mov r11d, eax + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_update_avx1_mul16_64 + sub r11d, 16 + cmp r11d, 16 + jl L_AES_XTS_decrypt_update_avx1_last_31_start +L_AES_XTS_decrypt_update_avx1_mul16_64: + cmp r11d, 64 + jl L_AES_XTS_decrypt_update_avx1_done_64 + and r11d, 4294967232 +L_AES_XTS_decrypt_update_avx1_dec_64: + ; 64 bytes of input + ; aes_dec_64 + lea rcx, QWORD PTR [rdi+r12] + lea rdx, QWORD PTR [rsi+r12] + vmovdqu xmm8, OWORD PTR [rcx] + vmovdqu xmm9, OWORD PTR [rcx+16] + vmovdqu xmm10, OWORD PTR [rcx+32] + vmovdqu xmm11, OWORD PTR [rcx+48] + vpsrad xmm4, xmm0, 31 + vpslld xmm1, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm1, xmm1, xmm4 + vpsrad xmm4, xmm1, 31 + vpslld xmm2, xmm1, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm2, xmm2, xmm4 + vpsrad xmm4, xmm2, 31 + vpslld xmm3, xmm2, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm3, xmm3, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + ; aes_dec_block + vmovdqu xmm4, OWORD PTR [r10] + vpxor xmm8, xmm8, xmm4 + vpxor xmm9, xmm9, xmm4 + vpxor xmm10, xmm10, xmm4 + vpxor xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+16] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+32] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+48] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+64] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+80] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+96] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+112] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+128] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+144] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + cmp r9d, 11 + vmovdqu xmm4, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_avx1_aes_dec_64_aes_dec_block_last + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+176] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + cmp r9d, 13 + vmovdqu xmm4, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_avx1_aes_dec_64_aes_dec_block_last + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+208] + vaesdec xmm8, xmm8, xmm4 + vaesdec xmm9, xmm9, xmm4 + vaesdec xmm10, xmm10, xmm4 + vaesdec xmm11, xmm11, xmm4 + vmovdqu xmm4, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_avx1_aes_dec_64_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm4 + vaesdeclast xmm9, xmm9, xmm4 + vaesdeclast xmm10, xmm10, xmm4 + vaesdeclast xmm11, xmm11, xmm4 + vpxor xmm8, xmm8, xmm0 + vpxor xmm9, xmm9, xmm1 + vpxor xmm10, xmm10, xmm2 + vpxor xmm11, xmm11, xmm3 + vmovdqu OWORD PTR [rdx], xmm8 + vmovdqu OWORD PTR [rdx+16], xmm9 + vmovdqu OWORD PTR [rdx+32], xmm10 + vmovdqu OWORD PTR [rdx+48], xmm11 + vpsrad xmm4, xmm3, 31 + vpslld xmm0, xmm3, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r12d, 64 + cmp r12d, r11d + jl L_AES_XTS_decrypt_update_avx1_dec_64 +L_AES_XTS_decrypt_update_avx1_done_64: + cmp r12d, eax + mov r11d, eax + je L_AES_XTS_decrypt_update_avx1_done_dec + and r11d, 4294967280 + cmp r11d, eax + je L_AES_XTS_decrypt_update_avx1_mul16 + sub r11d, 16 + sub r11d, r12d + cmp r11d, 16 + jl L_AES_XTS_decrypt_update_avx1_last_31_start + add r11d, r12d +L_AES_XTS_decrypt_update_avx1_mul16: +L_AES_XTS_decrypt_update_avx1_dec_16: + ; 16 bytes of input + lea rcx, QWORD PTR [rdi+r12] + vmovdqu xmm8, OWORD PTR [rcx] + vpxor xmm8, xmm8, xmm0 + ; aes_dec_block + vpxor xmm8, xmm8, [r10] + vmovdqu xmm5, OWORD PTR [r10+16] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+32] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+48] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+64] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+80] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+96] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+112] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+128] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+144] + vaesdec xmm8, xmm8, xmm5 + cmp r9d, 11 + vmovdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_avx1_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+176] + vaesdec xmm8, xmm8, xmm6 + cmp r9d, 13 + vmovdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_avx1_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+208] + vaesdec xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_avx1_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + lea rcx, QWORD PTR [rsi+r12] + vmovdqu OWORD PTR [rcx], xmm8 + vpsrad xmm4, xmm0, 31 + vpslld xmm0, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm0, xmm0, xmm4 + add r12d, 16 + cmp r12d, r11d + jl L_AES_XTS_decrypt_update_avx1_dec_16 + cmp r12d, eax + je L_AES_XTS_decrypt_update_avx1_done_dec +L_AES_XTS_decrypt_update_avx1_last_31_start: + vpsrad xmm4, xmm0, 31 + vpslld xmm7, xmm0, 1 + vpshufd xmm4, xmm4, 147 + vpand xmm4, xmm4, xmm12 + vpxor xmm7, xmm7, xmm4 + lea rcx, QWORD PTR [rdi+r12] + vmovdqu xmm8, OWORD PTR [rcx] + vpxor xmm8, xmm8, xmm7 + ; aes_dec_block + vpxor xmm8, xmm8, [r10] + vmovdqu xmm5, OWORD PTR [r10+16] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+32] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+48] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+64] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+80] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+96] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+112] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+128] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+144] + vaesdec xmm8, xmm8, xmm5 + cmp r9d, 11 + vmovdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_avx1_last_31_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+176] + vaesdec xmm8, xmm8, xmm6 + cmp r9d, 13 + vmovdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_avx1_last_31_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+208] + vaesdec xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_avx1_last_31_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm7 + vmovdqu OWORD PTR [rsp], xmm8 + add r12, 16 + xor rdx, rdx +L_AES_XTS_decrypt_update_avx1_last_31_byte_loop: + mov r11b, BYTE PTR [rsp+rdx] + mov cl, BYTE PTR [rdi+r12] + mov BYTE PTR [rsi+r12], r11b + mov BYTE PTR [rsp+rdx], cl + inc r12d + inc edx + cmp r12d, eax + jl L_AES_XTS_decrypt_update_avx1_last_31_byte_loop + sub r12, rdx + vmovdqu xmm8, OWORD PTR [rsp] + vpxor xmm8, xmm8, xmm0 + ; aes_dec_block + vpxor xmm8, xmm8, [r10] + vmovdqu xmm5, OWORD PTR [r10+16] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+32] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+48] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+64] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+80] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+96] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+112] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+128] + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm5, OWORD PTR [r10+144] + vaesdec xmm8, xmm8, xmm5 + cmp r9d, 11 + vmovdqu xmm5, OWORD PTR [r10+160] + jl L_AES_XTS_decrypt_update_avx1_last_31_2_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+176] + vaesdec xmm8, xmm8, xmm6 + cmp r9d, 13 + vmovdqu xmm5, OWORD PTR [r10+192] + jl L_AES_XTS_decrypt_update_avx1_last_31_2_aes_dec_block_last + vaesdec xmm8, xmm8, xmm5 + vmovdqu xmm6, OWORD PTR [r10+208] + vaesdec xmm8, xmm8, xmm6 + vmovdqu xmm5, OWORD PTR [r10+224] +L_AES_XTS_decrypt_update_avx1_last_31_2_aes_dec_block_last: + vaesdeclast xmm8, xmm8, xmm5 + vpxor xmm8, xmm8, xmm0 + sub r12, 16 + lea rcx, QWORD PTR [rsi+r12] + vmovdqu OWORD PTR [rcx], xmm8 +L_AES_XTS_decrypt_update_avx1_done_dec: + vmovdqu OWORD PTR [r8], xmm0 + vmovdqu xmm6, OWORD PTR [rsp+16] + vmovdqu xmm7, OWORD PTR [rsp+32] + vmovdqu xmm8, OWORD PTR [rsp+48] + vmovdqu xmm9, OWORD PTR [rsp+64] + vmovdqu xmm10, OWORD PTR [rsp+80] + vmovdqu xmm11, OWORD PTR [rsp+96] + vmovdqu xmm12, OWORD PTR [rsp+112] + add rsp, 128 + pop r12 + pop rsi + pop rdi + ret +AES_XTS_decrypt_update_avx1 ENDP +_text ENDS +ENDIF +END diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/asm.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/asm.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/asm.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/asm.c 2024-08-03 07:30:00.000000000 +0000 @@ -118,7 +118,7 @@ if(IS_INTEL_BMI2 && IS_INTEL_ADX){ func; ret ; } #else - #define IF_HAVE_INTEL_MULX(func, ret) + #define IF_HAVE_INTEL_MULX(func, ret) WC_DO_NOTHING #endif #if defined(TFM_X86) && !defined(TFM_SSE2) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/asn.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/asn.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/asn.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/asn.c 2024-08-03 07:30:00.000000000 +0000 @@ -63,13 +63,15 @@ does not perform a PKI validation, so it is not a secure solution. Only enabled for OCSP. * WOLFSSL_NO_OCSP_ISSUER_CHECK: Can be defined for backwards compatibility to - disable checking of OCSP subject hash with issuer hash. + disable checking of https://www.rfc-editor.org/rfc/rfc6960#section-4.2.2.2. * WOLFSSL_SMALL_CERT_VERIFY: Verify the certificate signature without using DecodedCert. Doubles up on some code but allows smaller dynamic memory usage. * WOLFSSL_NO_OCSP_DATE_CHECK: Disable date checks for OCSP responses. This may be required when the system's real-time clock is not very accurate. It is recommended to enforce the nonce check instead if possible. + * WOLFSSL_NO_CRL_DATE_CHECK: Disable date checks for CRL's. + * WOLFSSL_NO_CRL_NEXT_DATE: Do not fail if CRL next date is missing * WOLFSSL_FORCE_OCSP_NONCE_CHECK: Require nonces to be available in OCSP responses. The nonces are optional and may not be supported by all responders. If it can be ensured that the used responder sends nonces this @@ -94,6 +96,10 @@ cost of taking up more memory. Adds initials, givenname, dnQualifer for example. * WC_ASN_HASH_SHA256: Force use of SHA2-256 for the internal hash ID calcs. + * WOLFSSL_ALLOW_ENCODING_CA_FALSE: Allow encoding BasicConstraints CA:FALSE + * which is discouraged by X.690 specification - default values shall not + * be encoded. + * NO_TIME_SIGNEDNESS_CHECK: Disabled the time_t signedness check. */ #include @@ -142,6 +148,10 @@ #include #endif +#ifdef WOLFSSL_SM2 + #include +#endif + #ifdef HAVE_ED25519 #include #endif @@ -156,23 +166,21 @@ #include #endif -#ifdef HAVE_PQC - #if defined(HAVE_FALCON) +#if defined(HAVE_FALCON) #include - #endif - #if defined(HAVE_DILITHIUM) +#endif +#if defined(HAVE_DILITHIUM) #include - #endif - #if defined(HAVE_SPHINCS) +#endif +#if defined(HAVE_SPHINCS) #include - #endif #endif #ifdef WOLFSSL_QNX_CAAM #include #endif -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) #include #endif @@ -186,8 +194,11 @@ #include #endif -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) +#ifndef WOLFCRYPT_ONLY #include +#endif + +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) #include #endif @@ -304,15 +315,13 @@ /* Calculates the minimum number of bytes required to encode the value. * - * Only support up to 2^24-1. - * * @param [in] value Value to be encoded. * @return Number of bytes to encode value. */ static word32 BytePrecision(word32 value) { word32 i; - for (i = (word32)sizeof(value) - 1; i; --i) + for (i = (word32)sizeof(value); i; --i) if (value >> ((i - 1) * WOLFSSL_BIT_SIZE)) break; @@ -502,7 +511,7 @@ * @param [in, out] err Error variable. * @param [in] heap Dynamic memory allocation hint. */ - #define ALLOC_ASNGETDATA(name, cnt, err, heap) + #define ALLOC_ASNGETDATA(name, cnt, err, heap) WC_DO_NOTHING /* Clears the memory of the dynamic BER encoding data. * @@ -519,7 +528,7 @@ * @param [in] name Variable name to declare. * @param [in] heap Dynamic memory allocation hint. */ - #define FREE_ASNGETDATA(name, heap) + #define FREE_ASNGETDATA(name, heap) WC_DO_NOTHING /* Declare the variable that is the dynamic data for encoding DER data. * @@ -536,7 +545,7 @@ * @param [in, out] err Error variable. * @param [in] heap Dynamic memory allocation hint. */ - #define ALLOC_ASNSETDATA(name, cnt, err, heap) + #define ALLOC_ASNSETDATA(name, cnt, err, heap) WC_DO_NOTHING /* Clears the memory of the dynamic BER encoding data. * @@ -553,7 +562,7 @@ * @param [in] name Variable name to declare. * @param [in] heap Dynamic memory allocation hint. */ - #define FREE_ASNSETDATA(name, heap) + #define FREE_ASNSETDATA(name, heap) WC_DO_NOTHING #endif @@ -588,7 +597,7 @@ * @param [in] data_a Data to place in each item. Lengths set were not known. * @param [in] i Index of item to check. * @return 1 when ASN.1 item is an integer and MSB is 1. - * @erturn 0 otherwise. + * @return 0 otherwise. */ #define ASNIntMSBSet(asn, data_a, i) \ (((asn)[i].tag == ASN_INTEGER) && \ @@ -632,13 +641,13 @@ * @param [in] idx Index of item working on. */ static void SizeASN_CalcDataLength(const ASNItem* asn, ASNSetData *data, - int idx, int max) + int idx, int maxIdx) { int j; data[idx].data.buffer.length = 0; /* Sum the item length of all items underneath. */ - for (j = idx + 1; j < max; j++) { + for (j = idx + 1; j < maxIdx; j++) { /* Stop looking if the next ASN.1 is same level or higher. */ if (asn[j].depth <= asn[idx].depth) break; @@ -1054,6 +1063,16 @@ #endif } } + /* check for invalid padding on negative integer. + * c.f. X.690 (ISO/IEC 8825-2:2003 (E)) 10.4.6; RFC 5280 4.1 + */ + else if ((length > 1) && (input[idx] == 0xff) && + ((input[idx + 1] & 0x80) != 0)) { + WOLFSSL_MSG("Bad INTEGER encoding of negative"); + #ifndef WOLFSSL_ASN_INT_LEAD_0_ANY + return ASN_EXPECT_0_E; + #endif /* WOLFSSL_ASN_INT_LEAD_0_ANY */ + } /* Check whether a leading zero byte was required. */ else if (positive && (input[idx] & 0x80)) { WOLFSSL_MSG("INTEGER is negative"); @@ -1105,6 +1124,100 @@ return 0; } +#ifndef WOLFSSL_NO_ASN_STRICT +/* Check a UTF8STRING's data is valid. + * + * @param [in] input BER encoded data. + * @param [in] idx Index of UTF8STRING data. + * @param [in] length Length of input data. + * @return 0 on success. + * @return ASN_PARSE_E when data is invalid. + */ +static int GetASN_UTF8String(const byte* input, word32 idx, int length) +{ + int ret = 0; + word32 i = 0; + + while ((ret == 0) && ((int)i < length)) { + int cnt; + + /* Check code points and get count of following bytes. */ + if ((input[idx + i] & 0x80) == 0x00) { + cnt = 0; + } + else if ((input[idx + i] & 0xe0) == 0xc0) { + cnt = 1; + } + else if ((input[idx + i] & 0xf0) == 0xe0) { + cnt = 2; + } + else if ((input[idx + i] & 0xf8) == 0xf0) { + cnt = 3; + } + else { + WOLFSSL_MSG("Invalid character in UTF8STRING\n"); + ret = ASN_PARSE_E; + break; + } + + /* Have checked first byte. */ + i++; + /* Check each following byte. */ + for (; cnt > 0; cnt--) { + /* Check we have enough data. */ + if ((int)i == length) { + WOLFSSL_MSG("Missing character in UTF8STRING\n"); + ret = ASN_PARSE_E; + break; + } + /* Check following byte has top bit set. */ + if ((input[idx + i] & 0x80) != 0x80) { + WOLFSSL_MSG("Invalid character in UTF8STRING\n"); + ret = ASN_PARSE_E; + break; + } + i++; + } + } + + return ret; +} +#endif + +/* Check an OBJECT IDENTIFIER's data is valid. + * + * X.690 8.19 + * + * @param [in] input BER encoded data. + * @param [in] idx Index of OBJECT IDENTIFIER data. + * @param [in] length Length of input data. + * @return 0 on success. + * @return ASN_PARSE_E when data is invalid. + */ +static int GetASN_ObjectId(const byte* input, word32 idx, int length) +{ + int ret = 0; + + /* OID data must be at least 3 bytes. */ + if (length < 3) { + #ifdef WOLFSSL_DEBUG_ASN_TEMPLATE + WOLFSSL_MSG_VSNPRINTF("OID length must be 3 or more: %d", length); + #else + WOLFSSL_MSG("OID length less than 3"); + #endif + ret = ASN_PARSE_E; + } + /* Last octet of a sub-identifier has bit 8 clear. Last octet must be last + * of a subidentifier. Ensure last octet hasn't got top bit set. + */ + else if ((input[(int)idx + length - 1] & 0x80) != 0x00) { + WOLFSSL_MSG("OID last octet has top bit set"); + ret = ASN_PARSE_E; + } + + return ret; +} + /* Get the ASN.1 items from the BER encoding. * * @param [in] asn ASN.1 item expected. @@ -1373,9 +1486,8 @@ int len; /* Current index into buffer. */ word32 idx = *inOutIdx; - /* Initialize the end index at each depth to be the length. */ - word32 endIdx[GET_ASN_MAX_DEPTH] = { length, length, length, length, length, - length, length }; + /* Declare the end index array. */ + word32 endIdx[GET_ASN_MAX_DEPTH]; /* Set choices to -1 to indicate they haven't been seen or found. */ signed char choiceMet[GET_ASN_MAX_CHOICES] = { -1, -1 }; /* Not matching a choice right now. */ @@ -1391,6 +1503,11 @@ WOLFSSL_ENTER("GetASN_Items"); #endif + /* Set the end index at each depth to be the length. */ + for (i=0; i MAX_RSA_INT_SZ) - return BUFFER_E; - - if (output) { - int err = wc_Rsa_to_unsigned_bin(n, output + idx, length); - if (err != MP_OKAY) - return MP_TO_E; - } - idx += length; - - return idx; -} -#endif /* !NO_RSA && HAVE_USER_RSA && WOLFSSL_CERT_GEN */ #endif /* !WOLFSSL_ASN_TEMPLATE */ #ifdef WOLFSSL_ASN_TEMPLATE @@ -3038,7 +3129,7 @@ #else ASNGetData dataASN[intASN_Length]; int ret; - byte num; + byte num = 0; /* Clear dynamic data and set the version number variable. */ XMEMSET(dataASN, 0, sizeof(dataASN)); @@ -3105,7 +3196,7 @@ #else ASNGetData dataASN[intASN_Length]; int ret; - word32 num; + word32 num = 0; /* Clear dynamic data and set the 32-bit number variable. */ XMEMSET(dataASN, 0, sizeof(dataASN)); @@ -3127,51 +3218,40 @@ defined(HAVE_PKCS12) /* Set small integer, 32 bits or less. DER encoding with no leading 0s * returns total amount written including ASN tag and length byte on success */ -int SetShortInt(byte* input, word32* inOutIdx, word32 number, word32 maxIdx) +int SetShortInt(byte* output, word32* inOutIdx, word32 number, word32 maxIdx) { word32 idx = *inOutIdx; - int len = 0; + word32 len; int i; - byte ar[MAX_LENGTH_SZ]; - /* check for room for type and length bytes */ - if ((idx + 2) > maxIdx) + if (number == 0) + len = 1; + else + len = BytePrecision(number); + + /* check for room for type and length bytes. */ + if ((idx + 2 + len) > maxIdx) return BUFFER_E; - input[idx++] = ASN_INTEGER; - idx++; /* place holder for length byte */ - if (MAX_LENGTH_SZ + idx > maxIdx) + /* check that MAX_SHORT_SZ allows this size of ShortInt. */ + if (2 + len > MAX_SHORT_SZ) return ASN_PARSE_E; - /* find first non zero byte */ - XMEMSET(ar, 0, MAX_LENGTH_SZ); - c32toa(number, ar); - for (i = 0; i < MAX_LENGTH_SZ; i++) { - if (ar[i] != 0) { - break; - } - } + output[idx++] = ASN_INTEGER; + output[idx++] = (byte)len; - /* handle case of 0 */ - if (i == MAX_LENGTH_SZ) { - input[idx++] = 0; len++; - } - - for (; i < MAX_LENGTH_SZ && idx < maxIdx; i++) { - input[idx++] = ar[i]; len++; - } + for (i = (int)len - 1; i >= 0; --i) + output[idx++] = (byte)(number >> (i * WOLFSSL_BIT_SIZE)); - /* jump back to beginning of input buffer using unaltered inOutIdx value - * and set number of bytes for integer, then update the index value */ - input[*inOutIdx + 1] = (byte)len; + len = idx - *inOutIdx; *inOutIdx = idx; - return len + 2; /* size of integer bytes plus ASN TAG and length byte */ + return (int)len; } #endif /* !WOLFSSL_ASN_TEMPLATE || HAVE_PKCS8 || HAVE_PKCS12 */ #endif /* !NO_PWDBASED */ -#ifndef WOLFSSL_ASN_TEMPLATE +#if !defined(WOLFSSL_ASN_TEMPLATE) && !defined(NO_CERTS) /* May not have one, not an error */ static int GetExplicitVersion(const byte* input, word32* inOutIdx, int* version, word32 maxIdx) @@ -3276,8 +3356,21 @@ if (ret != 0) return ret; - if (((input[idx] & 0x80) == 0x80) && (input[idx - 1] != 0x00)) + /* should not be hit but adding in an additional sanity check */ + if (idx + length > maxIdx) { return MP_INIT_E; + } + + if ((input[idx] & 0x80) == 0x80) { + if (idx < 1) { + /* needs at least one byte for length value */ + return MP_INIT_E; + } + + if (input[idx - 1] != 0x00) { + return MP_INIT_E; + } + } if (initNum) { if (mp_init(mpi) != MP_OKAY) @@ -3303,7 +3396,7 @@ #endif /* (ECC || !NO_DSA) && !WOLFSSL_ASN_TEMPLATE */ #ifndef WOLFSSL_ASN_TEMPLATE -#if (!defined(NO_RSA) && !defined(HAVE_USER_RSA)) || !defined(NO_DSA) +#if !defined(NO_RSA) || !defined(NO_DSA) static int SkipInt(const byte* input, word32* inOutIdx, word32 maxIdx) { word32 idx = *inOutIdx; @@ -3401,7 +3494,7 @@ #else ASNGetData dataASN[bitStringASN_Length]; int ret; - int bits; + int bits = 0; /* Parse BIT_STRING and check validity of unused bits. */ XMEMSET(dataASN, 0, sizeof(dataASN)); @@ -3432,14 +3525,14 @@ /* RSA (with CertGen or KeyGen) OR ECC OR ED25519 OR ED448 (with CertGen or * KeyGen) */ -#if (!defined(NO_RSA) && !defined(HAVE_USER_RSA) && \ +#if (!defined(NO_RSA) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN) || \ defined(OPENSSL_EXTRA))) || \ (defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT)) || \ ((defined(HAVE_ED25519) || defined(HAVE_ED448)) && \ (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN) || \ defined(OPENSSL_EXTRA))) || \ - (defined(WC_ENABLE_ASYM_KEY_EXPORT) && !defined(NO_CERT)) || \ + (defined(WC_ENABLE_ASYM_KEY_EXPORT) && !defined(NO_CERTS)) || \ (!defined(NO_DSA) && !defined(HAVE_SELFTEST) && defined(WOLFSSL_KEY_GEN)) || \ (!defined(NO_DH) && defined(WOLFSSL_DH_EXTRA)) @@ -3482,6 +3575,72 @@ #endif /* !NO_RSA || HAVE_ECC || HAVE_ED25519 || HAVE_ED448 */ #ifdef ASN_BER_TO_DER + +#ifndef BER_OCTET_LENGTH + #define BER_OCTET_LENGTH 4096 +#endif + +/* sets the terminating 0x00 0x00 at the end of an indefinite length + * returns the number of bytes written */ +word32 SetIndefEnd(byte* output) +{ + byte terminate[ASN_INDEF_END_SZ] = { 0x00, 0x00 }; + + if (output != NULL) { + XMEMCPY(output, terminate, ASN_INDEF_END_SZ); + } + + return (word32)ASN_INDEF_END_SZ; +} + + +/* Breaks an octet string up into chunks for use with streaming + * returns 0 on success and updates idx */ +int StreamOctetString(const byte* inBuf, word32 inBufSz, byte* out, word32* outSz, + word32* idx) +{ + word32 i = 0; + word32 outIdx = *idx; + byte* tmp = out; + + if (tmp) tmp += outIdx; + + while (i < inBufSz) { + word32 ret, sz; + + sz = BER_OCTET_LENGTH; + + if ((sz + i) > inBufSz) { + sz = inBufSz - i; + } + + ret = SetOctetString(sz, tmp); + if (ret > 0) { + outIdx += ret; + } + + if (tmp) { + if ((word32)ret + sz + i + outIdx > *outSz) { + return BUFFER_E; + } + XMEMCPY(tmp + ret, inBuf + i, sz); + tmp += sz + ret; + } + outIdx += sz; + i += sz; + } + + if (tmp) { + *idx = outIdx; + return 0; + } + else { + *outSz = outIdx; + return LENGTH_ONLY_E; + } +} + + /* Convert BER to DER */ /* Pull informtation from the ASN.1 BER encoded item header */ @@ -4028,6 +4187,10 @@ static const byte sigSha3_512wEcdsaOid[] = {96, 134, 72, 1, 101, 3, 4, 3, 12}; #endif #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + /* 0x2A, 0x81, 0x1C, 0xCF, 0x55, 0x01, 0x83, 0x75 */ + static const byte sigSm3wSm2Oid[] = {42, 129, 28, 207, 85, 1, 131, 117}; + #endif #endif /* HAVE_ECC */ #ifdef HAVE_ED25519 static const byte sigEd25519Oid[] = {43, 101, 112}; @@ -4035,26 +4198,25 @@ #ifdef HAVE_ED448 static const byte sigEd448Oid[] = {43, 101, 113}; #endif /* HAVE_ED448 */ -#ifdef HAVE_PQC #ifdef HAVE_FALCON - /* Falcon Level 1: 1 3 9999 3 1 */ - static const byte sigFalcon_Level1Oid[] = {43, 206, 15, 3, 1}; + /* Falcon Level 1: 1 3 9999 3 6 */ + static const byte sigFalcon_Level1Oid[] = {43, 206, 15, 3, 6}; - /* Falcon Level 5: 1 3 9999 3 4 */ - static const byte sigFalcon_Level5Oid[] = {43, 206, 15, 3, 4}; + /* Falcon Level 5: 1 3 9999 3 9 */ + static const byte sigFalcon_Level5Oid[] = {43, 206, 15, 3, 9}; #endif /* HAVE_FACON */ #ifdef HAVE_DILITHIUM - /* Dilithium Level 2: 1.3.6.1.4.1.2.267.7.4.4 */ + /* Dilithium Level 2: 1.3.6.1.4.1.2.267.12.4.4 */ static const byte sigDilithium_Level2Oid[] = - {43, 6, 1, 4, 1, 2, 130, 11, 7, 4, 4}; + {43, 6, 1, 4, 1, 2, 130, 11, 12, 4, 4}; - /* Dilithium Level 3: 1.3.6.1.4.1.2.267.7.6.5 */ + /* Dilithium Level 3: 1.3.6.1.4.1.2.267.12.6.5 */ static const byte sigDilithium_Level3Oid[] = - {43, 6, 1, 4, 1, 2, 130, 11, 7, 6, 5}; + {43, 6, 1, 4, 1, 2, 130, 11, 12, 6, 5}; - /* Dilithium Level 5: 1.3.6.1.4.1.2.267.7.8.7 */ + /* Dilithium Level 5: 1.3.6.1.4.1.2.267.12.8.7 */ static const byte sigDilithium_Level5Oid[] = - {43, 6, 1, 4, 1, 2, 130, 11, 7, 8, 7}; + {43, 6, 1, 4, 1, 2, 130, 11, 12, 8, 7}; #endif /* HAVE_DILITHIUM */ #ifdef HAVE_SPHINCS /* Sphincs Fast Level 1: 1 3 9999 6 7 4 */ @@ -4081,7 +4243,6 @@ static const byte sigSphincsSmall_Level5Oid[] = {43, 206, 15, 6, 9, 7}; #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ /* keyType */ #ifndef NO_DSA @@ -4111,26 +4272,25 @@ #ifndef NO_DH static const byte keyDhOid[] = {42, 134, 72, 134, 247, 13, 1, 3, 1}; #endif /* !NO_DH */ -#ifdef HAVE_PQC #ifdef HAVE_FALCON - /* Falcon Level 1: 1 3 9999 3 1 */ - static const byte keyFalcon_Level1Oid[] = {43, 206, 15, 3, 1}; + /* Falcon Level 1: 1 3 9999 3 6 */ + static const byte keyFalcon_Level1Oid[] = {43, 206, 15, 3, 6}; - /* Falcon Level 5: 1 3 9999 3 4 */ - static const byte keyFalcon_Level5Oid[] = {43, 206, 15, 3, 4}; + /* Falcon Level 5: 1 3 9999 3 9 */ + static const byte keyFalcon_Level5Oid[] = {43, 206, 15, 3, 9}; #endif /* HAVE_FALCON */ #ifdef HAVE_DILITHIUM - /* Dilithium Level 2: 1.3.6.1.4.1.2.267.7.4.4 */ + /* Dilithium Level 2: 1.3.6.1.4.1.2.267.12.4.4 */ static const byte keyDilithium_Level2Oid[] = - {43, 6, 1, 4, 1, 2, 130, 11, 7, 4, 4}; + {43, 6, 1, 4, 1, 2, 130, 11, 12, 4, 4}; - /* Dilithium Level 3: 1.3.6.1.4.1.2.267.7.6.5 */ + /* Dilithium Level 3: 1.3.6.1.4.1.2.267.12.6.5 */ static const byte keyDilithium_Level3Oid[] = - {43, 6, 1, 4, 1, 2, 130, 11, 7, 6, 5}; + {43, 6, 1, 4, 1, 2, 130, 11, 12, 6, 5}; - /* Dilithium Level 5: 1.3.6.1.4.1.2.267.7.8.7 */ + /* Dilithium Level 5: 1.3.6.1.4.1.2.267.12.8.7 */ static const byte keyDilithium_Level5Oid[] = - {43, 6, 1, 4, 1, 2, 130, 11, 7, 8, 7}; + {43, 6, 1, 4, 1, 2, 130, 11, 12, 8, 7}; #endif /* HAVE_DILITHIUM */ #ifdef HAVE_SPHINCS /* Sphincs Fast Level 1: 1 3 9999 6 7 4 */ @@ -4157,7 +4317,6 @@ static const byte keySphincsSmall_Level5Oid[] = {43, 206, 15, 6, 9, 7}; #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ /* curveType */ #ifdef HAVE_ECC @@ -4362,6 +4521,9 @@ #if !defined(NO_DES3) && !defined(NO_SHA) static const byte pbeSha1Des3[] = {42, 134, 72, 134, 247, 13, 1, 12, 1, 3}; #endif +#if defined(WC_RC2) && !defined(NO_SHA) +static const byte pbe40Rc2Cbc[] = {42, 134, 72, 134, 247, 13, 1, 12, 1, 6}; +#endif #ifdef HAVE_LIBZ /* zlib compression */ @@ -4643,6 +4805,12 @@ break; #endif #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case CTC_SM3wSM2: + oid = sigSm3wSm2Oid; + *oidSz = sizeof(sigSm3wSm2Oid); + break; + #endif #endif /* HAVE_ECC */ #ifdef HAVE_ED25519 case CTC_ED25519: @@ -4656,7 +4824,6 @@ *oidSz = sizeof(sigEd448Oid); break; #endif - #ifdef HAVE_PQC #ifdef HAVE_FALCON case CTC_FALCON_LEVEL1: oid = sigFalcon_Level1Oid; @@ -4707,7 +4874,6 @@ *oidSz = sizeof(sigSphincsSmall_Level5Oid); break; #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ default: break; } @@ -4769,7 +4935,6 @@ *oidSz = sizeof(keyDhOid); break; #endif /* !NO_DH */ - #ifdef HAVE_PQC #ifdef HAVE_FALCON case FALCON_LEVEL1k: oid = keyFalcon_Level1Oid; @@ -4820,7 +4985,6 @@ *oidSz = sizeof(keySphincsSmall_Level5Oid); break; #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ default: break; } @@ -5169,6 +5333,13 @@ *oidSz = sizeof(pbeSha1Des3); break; #endif + #if !defined(NO_SHA) && defined(WC_RC2) + case PBE_SHA1_40RC2_CBC_SUM: + case PBE_SHA1_40RC2_CBC: + oid = pbe40Rc2Cbc; + *oidSz = sizeof(pbe40Rc2Cbc); + break; + #endif case PBES2_SUM: case PBES2: oid = pbes2; @@ -5438,13 +5609,18 @@ * @return BAD_FUNC_ARG when in or outSz is NULL. * @return BUFFER_E when buffer too small. */ +int wc_EncodeObjectId(const word16* in, word32 inSz, byte* out, word32* outSz) +{ + return EncodeObjectId(in, inSz, out, outSz); +} + int EncodeObjectId(const word16* in, word32 inSz, byte* out, word32* outSz) { int i, x, len; word32 d, t; /* check args */ - if (in == NULL || outSz == NULL) { + if (in == NULL || outSz == NULL || inSz <= 0) { return BAD_FUNC_ARG; } @@ -5513,7 +5689,8 @@ } #endif /* HAVE_OID_ENCODING */ -#if defined(HAVE_OID_DECODING) || defined(WOLFSSL_ASN_PRINT) +#if defined(HAVE_OID_DECODING) || defined(WOLFSSL_ASN_PRINT) || \ + defined(OPENSSL_ALL) /* Encode dotted form of OID into byte array version. * * @param [in] in Byte array containing OID. @@ -5560,7 +5737,7 @@ return 0; } -#endif /* HAVE_OID_DECODING */ +#endif /* HAVE_OID_DECODING || WOLFSSL_ASN_PRINT || OPENSSL_ALL */ /* Decode the header of a BER/DER encoded OBJECT ID. * @@ -5688,7 +5865,7 @@ const byte* checkOid = NULL; word32 checkOidSz; #endif /* NO_VERIFY_OID */ -#ifdef HAVE_PQC +#if defined(HAVE_SPHINCS) word32 found_collision = 0; #endif (void)oidType; @@ -5700,7 +5877,7 @@ actualOidSz = (word32)length; #endif /* NO_VERIFY_OID */ -#if defined(HAVE_PQC) && defined(HAVE_LIBOQS) +#if defined(HAVE_SPHINCS) /* Since we are summing it up, there could be collisions...and indeed there * are: SPHINCS_FAST_LEVEL1 and SPHINCS_FAST_LEVEL3. * @@ -5709,11 +5886,12 @@ * * These hacks will hopefully disappear when new standardized OIDs appear. */ - if (memcmp(&input[idx], sigSphincsFast_Level3Oid, + if (idx + (word32)sizeof(sigSphincsFast_Level3Oid) < (word32)length && + XMEMCMP(&input[idx], sigSphincsFast_Level3Oid, sizeof(sigSphincsFast_Level3Oid)) == 0) { found_collision = SPHINCS_FAST_LEVEL3k; } -#endif /* HAVE_PQC */ +#endif /* HAVE_SPHINCS */ /* Sum it up for now. */ while (length--) { @@ -5722,11 +5900,11 @@ idx++; } -#ifdef HAVE_PQC +#ifdef HAVE_SPHINCS if (found_collision) { *oid = found_collision; } -#endif /* HAVE_PQC */ +#endif /* HAVE_SPHINCS */ /* Return the index after the OID data. */ *inOutIdx = idx; @@ -6032,6 +6210,7 @@ return ret; } +#ifndef NO_CERTS /* Convert a hash OID to a fake signature OID. * * @param [in] oid Hash OID. @@ -6079,6 +6258,7 @@ return ret; } +#endif #ifdef WOLFSSL_ASN_TEMPLATE /* ASN tag for hashAlgorigthm. */ @@ -6294,7 +6474,6 @@ } #endif /* WC_RSA_PSS */ -#ifndef HAVE_USER_RSA #if defined(WOLFSSL_ASN_TEMPLATE) || (!defined(NO_CERTS) && \ (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || \ defined(WOLFSSL_KCAPI_RSA) || defined(WOLFSSL_SE050))) @@ -6632,8 +6811,6 @@ { return _RsaPrivateKeyDecode(input, inOutIdx, NULL, keySz, inSz); } - -#endif /* HAVE_USER_RSA */ #endif /* NO_RSA */ #ifdef WOLFSSL_ASN_TEMPLATE @@ -6746,7 +6923,7 @@ ret = GetOctetString(input, &idx, &length, sz); if (ret < 0) { - if (ret == BUFFER_E) + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) return ASN_PARSE_E; /* Some private keys don't expect an octet string */ WOLFSSL_MSG("Couldn't find Octet string"); @@ -6759,7 +6936,7 @@ DECL_ASNGETDATA(dataASN, pkcs8KeyASN_Length); int ret = 0; word32 oid = 9; - byte version; + byte version = 0; word32 idx; /* Check validity of parameters. */ @@ -6934,7 +7111,7 @@ #endif /* HAVE_PKCS8 || HAVE_PKCS12 */ -#if defined(HAVE_PKCS8) && !defined(NO_CERTS) +#if defined(HAVE_PKCS8) int wc_GetPkcs8TraditionalOffset(byte* input, word32* inOutIdx, word32 sz) { @@ -7040,7 +7217,7 @@ return (int)(tmpSz + sz); #else DECL_ASNSETDATA(dataASN, pkcs8KeyASN_Length); - int sz; + int sz = 0; int ret = 0; word32 keyIdx = 0; word32 tmpAlgId = 0; @@ -7067,10 +7244,11 @@ SetASN_Int8Bit(&dataASN[PKCS8KEYASN_IDX_VER], PKCS8v0); /* Set key OID that corresponds to key data. */ SetASN_OID(&dataASN[PKCS8KEYASN_IDX_PKEY_ALGO_OID_KEY], (word32)algoID, - oidKeyType); + oidKeyType); if (curveOID != NULL && oidSz > 0) { /* ECC key and curveOID set to write. */ - SetASN_Buffer(&dataASN[PKCS8KEYASN_IDX_PKEY_ALGO_OID_CURVE], curveOID, oidSz); + SetASN_Buffer(&dataASN[PKCS8KEYASN_IDX_PKEY_ALGO_OID_CURVE], + curveOID, oidSz); } else { /* EC curve OID to encode. */ @@ -7107,7 +7285,7 @@ #endif /* WOLFSSL_ASN_TEMPLATE */ } -#endif /* HAVE_PKCS8 && !NO_CERTS */ +#endif /* HAVE_PKCS8 */ #if defined(HAVE_PKCS12) || !defined(NO_CHECK_PRIVATE_KEY) /* check that the private key is a pair for the public key @@ -7178,12 +7356,6 @@ if ((ret = wc_RsaPublicKeyDecode(pubKey, &keyIdx, b, pubKeySz)) == 0) { - /* limit for user RSA crypto because of RsaKey - * dereference. */ - #if defined(HAVE_USER_RSA) - WOLFSSL_MSG("Cannot verify RSA pair with user RSA"); - ret = 1; /* return first RSA cert as match */ - #else /* both keys extracted successfully now check n and e * values are the same. This is dereferencing RsaKey */ if (mp_cmp(&(a->n), &(b->n)) != MP_EQ || @@ -7193,7 +7365,6 @@ } else ret = 1; - #endif } else { WOLFSSL_ERROR_VERBOSE(ret); @@ -7384,7 +7555,6 @@ } else #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT && !NO_ASN_CRYPT */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) if ((ks == FALCON_LEVEL1k) || (ks == FALCON_LEVEL5k)) { #ifdef WOLFSSL_SMALL_STACK @@ -7446,7 +7616,8 @@ } else #endif /* HAVE_FALCON */ - #if defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && !defined(WOLFSSL_DILITHIUM_NO_ASN1) if ((ks == DILITHIUM_LEVEL2k) || (ks == DILITHIUM_LEVEL3k) || (ks == DILITHIUM_LEVEL5k)) { @@ -7504,7 +7675,7 @@ #endif } else - #endif /* HAVE_DILITHIUM */ +#endif /* HAVE_DILITHIUM && !WOLFSSL_DILITHIUM_VERIFY_ONLY */ #if defined(HAVE_SPHINCS) if ((ks == SPHINCS_FAST_LEVEL1k) || (ks == SPHINCS_FAST_LEVEL3k) || @@ -7576,7 +7747,6 @@ } else #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ { ret = 0; } @@ -7589,17 +7759,59 @@ * return 1 (true) on match * return 0 or negative value on failure/error * - * key : buffer holding DER format key - * keySz : size of key buffer - * der : a initialized and parsed DecodedCert holding a certificate */ -int wc_CheckPrivateKeyCert(const byte* key, word32 keySz, DecodedCert* der) + * key : buffer holding DER format key + * keySz : size of key buffer + * der : a initialized and parsed DecodedCert holding a certificate + * checkAlt : indicate if we check primary or alternative key + */ +int wc_CheckPrivateKeyCert(const byte* key, word32 keySz, DecodedCert* der, + int checkAlt) { + int ret = 0; + if (key == NULL || der == NULL) { return BAD_FUNC_ARG; } - return wc_CheckPrivateKey(key, keySz, der->publicKey, - der->pubKeySize, (enum Key_Sum) der->keyOID); +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (checkAlt && der->sapkiDer != NULL) { + /* We have to decode the public key first */ + word32 idx = 0; + /* Dilithium has the largest public key at the moment */ + word32 pubKeyLen = DILITHIUM_MAX_PUB_KEY_SIZE; + byte* decodedPubKey = (byte*)XMALLOC(pubKeyLen, NULL, + DYNAMIC_TYPE_PUBLIC_KEY); + if (decodedPubKey == NULL) { + ret = MEMORY_E; + } + if (ret == 0) { + if (der->sapkiOID == RSAk || der->sapkiOID == ECDSAk) { + /* Simply copy the data */ + XMEMCPY(decodedPubKey, der->sapkiDer, der->sapkiLen); + pubKeyLen = der->sapkiLen; + } + else { + ret = DecodeAsymKeyPublic(der->sapkiDer, &idx, der->sapkiLen, + decodedPubKey, &pubKeyLen, + der->sapkiOID); + } + } + if (ret == 0) { + ret = wc_CheckPrivateKey(key, keySz, decodedPubKey, pubKeyLen, + (enum Key_Sum) der->sapkiOID); + } + XFREE(decodedPubKey, NULL, DYNAMIC_TYPE_PUBLIC_KEY); + } + else +#endif + { + ret = wc_CheckPrivateKey(key, keySz, der->publicKey, + der->pubKeySize, (enum Key_Sum) der->keyOID); + } + + (void)checkAlt; + + return ret; } #endif /* HAVE_PKCS12 || !NO_CHECK_PRIVATE_KEY */ @@ -7879,7 +8091,6 @@ XFREE(ed448, heap, DYNAMIC_TYPE_TMP_BUFFER); } #endif /* HAVE_ED448 && HAVE_ED448_KEY_IMPORT && !NO_ASN_CRYPT */ -#if defined(HAVE_PQC) #if defined(HAVE_FALCON) if (*algoID == 0) { falcon_key *falcon = (falcon_key *)XMALLOC(sizeof(*falcon), heap, @@ -7915,7 +8126,8 @@ XFREE(falcon, heap, DYNAMIC_TYPE_TMP_BUFFER); } #endif /* HAVE_FALCON */ -#if defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && !defined(WOLFSSL_DILITHIUM_NO_ASN1) if (*algoID == 0) { dilithium_key *dilithium = (dilithium_key *)XMALLOC(sizeof(*dilithium), heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -7961,7 +8173,7 @@ } XFREE(dilithium, heap, DYNAMIC_TYPE_TMP_BUFFER); } -#endif /* HAVE_DILITHIUM */ +#endif /* HAVE_DILITHIUM && !WOLFSSL_DILITHIUM_VERIFY_ONLY */ #if defined(HAVE_SPHINCS) if (*algoID == 0) { sphincs_key *sphincs = (sphincs_key *)XMALLOC(sizeof(*sphincs), @@ -8039,7 +8251,6 @@ XFREE(sphincs, heap, DYNAMIC_TYPE_TMP_BUFFER); } #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ /* if flag is not set then this is not a key that we understand. */ if (*algoID == 0) { @@ -8159,6 +8370,14 @@ *blkSz = 8; break; #endif +#if defined(WOLFSSL_AES_128) && defined(HAVE_AES_CBC) + case AES128CBCb: + *len = sizeof(blkAes128CbcOid); + *oid = blkAes128CbcOid; + *id = PBE_AES128_CBC; + *blkSz = 16; + break; +#endif #if defined(WOLFSSL_AES_256) && defined(HAVE_AES_CBC) case AES256CBCb: *len = sizeof(blkAes256CbcOid); @@ -8228,7 +8447,7 @@ padSz = (word32)((blockSz - ((int)keySz & (blockSz - 1))) & (blockSz - 1)); /* inner = OCT salt INT itt */ - innerLen = 2 + saltSz + 2 + (itt < 256 ? 1 : 2); + innerLen = 2 + saltSz + 2 + ((itt < 256) ? 1 : ((itt < 65536) ? 2 : 3)); if (version != PKCS5v2) { pbeOidBuf = OidFromId((word32)pbeId, oidPBEType, &pbeOidBufSz); @@ -8416,7 +8635,7 @@ if (ret == 0) { ret = wc_CreatePKCS8Key(NULL, &pkcs8KeySz, key, keySz, algId, curveOid, curveOidSz); - if (ret == LENGTH_ONLY_E) + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) ret = 0; } if (ret == 0) { @@ -8672,10 +8891,10 @@ DECL_ASNGETDATA(dataASN, pbes2ParamsASN_Length); int ret = 0; int id = 0; - int version; + int version = 0; word32 idx = 0; word32 pIdx = 0; - word32 iterations; + word32 iterations = 0; word32 keySz = 0; word32 saltSz = 0; word32 shaOid = 0; @@ -9078,7 +9297,7 @@ DECL_ASNSETDATA(dataASN, p8EncPbes1ASN_Length); int ret = 0; int sz = 0; - int version; + int version = 0; int id = -1; int blockSz = 0; word32 pkcs8Sz = 0; @@ -9180,8 +9399,7 @@ #ifndef NO_RSA -#ifndef HAVE_USER_RSA -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) /* This function is to retrieve key position information in a cert.* * The information will be used to call TSIP TLS-linked API for * * certificate verification. */ @@ -9532,7 +9750,6 @@ return ret; } -#endif /* HAVE_USER_RSA */ #endif /* !NO_RSA */ #ifndef NO_DH @@ -9728,7 +9945,7 @@ #if !defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2)) /* If ASN_DH_KEY_E: Check if input started at beginning of key */ - if (ret == ASN_DH_KEY_E) { + if (ret == WC_NO_ERR_TRACE(ASN_DH_KEY_E)) { *inOutIdx = temp; /* the version (0) - private only (for public skip) */ @@ -9870,7 +10087,7 @@ /* determine size */ if (exportPriv) { - /* octect string: priv */ + /* octet string: priv */ privSz = SetASNIntMP(&key->priv, -1, NULL); if (privSz < 0) return privSz; @@ -9889,7 +10106,7 @@ /* DH Parameters sequence with P and G */ total = 0; ret = wc_DhParamsToDer(key, NULL, &total); - if (ret != LENGTH_ONLY_E) + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) return ret; idx += total; @@ -9938,7 +10155,7 @@ return ret; idx += total; - /* octect string: priv */ + /* octet string: priv */ if (exportPriv) { idx += (word32)SetOctetString((word32)privSz, output + idx); idx += (word32)SetASNIntMP(&key->priv, -1, output + idx); @@ -10538,7 +10755,7 @@ } } /* An alternate pass if default certificate fails parsing */ - if (ret == ASN_PARSE_E) { + if (ret == WC_NO_ERR_TRACE(ASN_PARSE_E)) { *inOutIdx = (word32)temp; if (GetMyVersion(input, inOutIdx, &version, inSz) < 0) return ASN_PARSE_E; @@ -11072,6 +11289,7 @@ #endif /* NO_DSA */ +#ifndef NO_CERTS /* Initialize decoded certificate object with buffer of DER encoding. * * @param [in, out] cert Decoded certificate object. @@ -11130,9 +11348,7 @@ #endif /* WOLFSSL_HAVE_ISSUER_NAMES */ #endif /* WOLFSSL_CERT_GEN || WOLFSSL_CERT_EXT */ - #ifndef NO_CERTS InitSignatureCtx(&cert->sigCtx, heap, devId); - #endif } } @@ -11160,6 +11376,9 @@ #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME) XFREE(altNames->ipString, heap, DYNAMIC_TYPE_ALTNAME); #endif + #if defined(OPENSSL_ALL) + XFREE(altNames->ridString, heap, DYNAMIC_TYPE_ALTNAME); + #endif XFREE(altNames, heap, DYNAMIC_TYPE_ALTNAME); altNames = tmp; } @@ -11177,6 +11396,47 @@ return ret; } +DNS_entry* AltNameDup(DNS_entry* from, void* heap) +{ + DNS_entry* ret; + + ret = AltNameNew(heap); + if (ret == NULL) { + WOLFSSL_MSG("\tOut of Memory"); + return NULL; + } + + ret->type = from->type; + ret->len = from->len; + + + ret->name = CopyString(from->name, from->len, heap, DYNAMIC_TYPE_ALTNAME); +#if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME) + ret->ipString = CopyString(from->ipString, 0, heap, DYNAMIC_TYPE_ALTNAME); +#endif +#ifdef OPENSSL_ALL + ret->ridString = CopyString(from->ridString, 0, heap, DYNAMIC_TYPE_ALTNAME); +#endif + if (ret->name == NULL +#if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME) + || (from->ipString != NULL && ret->ipString == NULL) +#endif +#ifdef OPENSSL_ALL + || (from->ridString != NULL && ret->ridString == NULL) +#endif + ) { + WOLFSSL_MSG("\tOut of Memory"); + FreeAltNames(ret, heap); + return NULL; + } + +#ifdef WOLFSSL_FPKI + ret->oidSum = from->oidSum; +#endif + + return ret; +} + #ifndef IGNORE_NAME_CONSTRAINTS @@ -11239,13 +11499,11 @@ if (cert->subjectName != NULL) wolfSSL_X509_NAME_free((WOLFSSL_X509_NAME*)cert->subjectName); #endif /* WOLFSSL_X509_NAME_AVAILABLE */ -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) if (cert->sce_tsip_encRsaKeyIdx != NULL) XFREE(cert->sce_tsip_encRsaKeyIdx, cert->heap, DYNAMIC_TYPE_RSA); #endif -#ifndef NO_CERTS FreeSignatureCtx(&cert->sigCtx); -#endif } void wc_FreeDecodedCert(DecodedCert* cert) @@ -11284,9 +11542,9 @@ } #endif -#if defined(HAVE_ED25519) || defined(HAVE_ED448) || (defined(HAVE_PQC) && \ - defined(HAVE_LIBOQS)) -/* Store the key data under the BIT_STRING in dynamicly allocated data. +#if defined(HAVE_ED25519) || defined(HAVE_ED448) || defined(HAVE_FALCON) || \ + defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS) +/* Store the key data under the BIT_STRING in dynamically allocated data. * * @param [in, out] cert Certificate object. * @param [in] source Buffer containing encoded key. @@ -11304,8 +11562,8 @@ ret = CheckBitString(source, srcIdx, &length, maxIdx, 1, NULL); if (ret == 0) { #ifdef HAVE_OCSP - ret = CalcHashId(source + *srcIdx, (word32)length, - cert->subjectKeyHash); + ret = CalcHashId_ex(source + *srcIdx, (word32)length, + cert->subjectKeyHash, HashIdAlg(cert->signatureOID)); } if (ret == 0) { #endif @@ -11327,8 +11585,530 @@ return ret; } #endif /* HAVE_ED25519 || HAVE_ED448 */ +#endif + +#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) + +static int SetCurve(ecc_key* key, byte* output, size_t outSz) +{ +#ifdef HAVE_OID_ENCODING + int ret; +#endif + int idx; + word32 oidSz = 0; + + /* validate key */ + if (key == NULL || key->dp == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef HAVE_OID_ENCODING + ret = EncodeObjectId(key->dp->oid, key->dp->oidSz, NULL, &oidSz); + if (ret != 0) { + return ret; + } +#else + oidSz = key->dp->oidSz; +#endif + + idx = SetObjectId((int)oidSz, output); + + /* length only */ + if (output == NULL) { + return idx + (int)oidSz; + } + + /* verify output buffer has room */ + if (oidSz > outSz) + return BUFFER_E; + +#ifdef HAVE_OID_ENCODING + ret = EncodeObjectId(key->dp->oid, key->dp->oidSz, output+idx, &oidSz); + if (ret != 0) { + return ret; + } +#else + XMEMCPY(output+idx, key->dp->oid, oidSz); +#endif + idx += (int)oidSz; + + return idx; +} + +#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */ + +#ifdef HAVE_ECC +#ifdef WOLFSSL_ASN_TEMPLATE +/* ASN.1 template for ECC public key (SubjectPublicKeyInfo). + * RFC 5480, 2 - Subject Public Key Information Fields + * 2.1.1 - Unrestricted Algorithm Identifier and Parameters + * X9.62 ECC point format. + * See ASN.1 template 'eccSpecifiedASN' for specifiedCurve. + */ +static const ASNItem eccPublicKeyASN[] = { +/* SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, + /* AlgorithmIdentifier */ +/* ALGOID_SEQ */ { 1, ASN_SEQUENCE, 1, 1, 0 }, + /* algorithm */ +/* ALGOID_OID */ { 2, ASN_OBJECT_ID, 0, 0, 0 }, + /* namedCurve */ +/* ALGOID_CURVEID */ { 2, ASN_OBJECT_ID, 0, 0, 2 }, + /* specifiedCurve - explicit parameters */ +/* ALGOID_PARAMS */ { 2, ASN_SEQUENCE, 1, 0, 2 }, + /* Public Key */ +/* PUBKEY */ { 1, ASN_BIT_STRING, 0, 0, 0 }, +}; +enum { + ECCPUBLICKEYASN_IDX_SEQ = 0, + ECCPUBLICKEYASN_IDX_ALGOID_SEQ, + ECCPUBLICKEYASN_IDX_ALGOID_OID, + ECCPUBLICKEYASN_IDX_ALGOID_CURVEID, + ECCPUBLICKEYASN_IDX_ALGOID_PARAMS, + ECCPUBLICKEYASN_IDX_PUBKEY +}; + +/* Number of items in ASN.1 template for ECC public key. */ +#define eccPublicKeyASN_Length (sizeof(eccPublicKeyASN) / sizeof(ASNItem)) +#endif /* WOLFSSL_ASN_TEMPLATE */ +#endif /* HAVE_ECC */ + +#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) + +/* Encode public ECC key in DER format. + * + * RFC 5480, 2 - Subject Public Key Information Fields + * 2.1.1 - Unrestricted Algorithm Identifier and Parameters + * X9.62 ECC point format. + * SEC 1 Ver. 2.0, C.2 - Syntax for Elliptic Curve Domain Parameters + * + * @param [out] output Buffer to put encoded data in. + * @param [in] key ECC key object. + * @param [in] outLen Size of buffer in bytes. + * @param [in] with_header Whether to use SubjectPublicKeyInfo format. + * @return Size of encoded data in bytes on success. + * @return BAD_FUNC_ARG when key or key's parameters is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +static int SetEccPublicKey(byte* output, ecc_key* key, int outLen, + int with_header, int comp) +{ +#ifndef WOLFSSL_ASN_TEMPLATE + int ret; + word32 idx = 0, curveSz, algoSz, pubSz, bitStringSz; + byte bitString[1 + MAX_LENGTH_SZ + 1]; /* 6 */ + byte algo[MAX_ALGO_SZ]; /* 20 */ + + /* public size */ + pubSz = key->dp ? (word32)key->dp->size : MAX_ECC_BYTES; + if (comp) + pubSz = 1 + pubSz; + else + pubSz = 1 + 2 * pubSz; + + /* check for buffer overflow */ + if (output != NULL && pubSz > (word32)outLen) { + return BUFFER_E; + } + + /* headers */ + if (with_header) { + ret = SetCurve(key, NULL, 0); + if (ret <= 0) { + return ret; + } + curveSz = (word32)ret; + ret = 0; + + /* calculate size */ + algoSz = SetAlgoID(ECDSAk, algo, oidKeyType, (int)curveSz); + bitStringSz = SetBitString(pubSz, 0, bitString); + idx = SetSequence(pubSz + curveSz + bitStringSz + algoSz, NULL); + + /* check for buffer overflow */ + if (output != NULL && + curveSz + algoSz + bitStringSz + idx + pubSz > (word32)outLen) { + return BUFFER_E; + } + + idx = SetSequence(pubSz + curveSz + bitStringSz + algoSz, + output); + /* algo */ + if (output) + XMEMCPY(output + idx, algo, algoSz); + idx += algoSz; + /* curve */ + if (output) + (void)SetCurve(key, output + idx, curveSz); + idx += curveSz; + /* bit string */ + if (output) + XMEMCPY(output + idx, bitString, bitStringSz); + idx += bitStringSz; + } + + /* pub */ + if (output) { + PRIVATE_KEY_UNLOCK(); + ret = wc_ecc_export_x963_ex(key, output + idx, &pubSz, comp); + PRIVATE_KEY_LOCK(); + if (ret != 0) { + return ret; + } + } + idx += pubSz; + + return (int)idx; +#else + word32 pubSz = 0; + int sz = 0; + int ret = 0; + int curveIdSz = 0; + byte* curveOid = NULL; + + /* Check key validity. */ + if ((key == NULL) || (key->dp == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Calculate the size of the encoded public point. */ + PRIVATE_KEY_UNLOCK(); + #if defined(HAVE_COMP_KEY) && defined(HAVE_FIPS) && \ + defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 2) + /* in earlier versions of FIPS the get length functionality is not + * available with compressed keys */ + pubSz = key->dp ? key->dp->size : MAX_ECC_BYTES; + if (comp) + pubSz = 1 + pubSz; + else + pubSz = 1 + 2 * pubSz; + ret = LENGTH_ONLY_E; + #else + ret = wc_ecc_export_x963_ex(key, NULL, &pubSz, comp); + #endif + PRIVATE_KEY_LOCK(); + /* LENGTH_ONLY_E on success. */ + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { + ret = 0; + } + } + if ((ret == 0) && with_header) { + /* Including SubjectPublicKeyInfo header. */ + DECL_ASNSETDATA(dataASN, eccPublicKeyASN_Length); + + CALLOC_ASNSETDATA(dataASN, eccPublicKeyASN_Length, ret, key->heap); + + /* Get the length of the named curve OID to put into the encoding. */ + curveIdSz = SetCurve(key, NULL, 0); + if (curveIdSz < 0) { + ret = curveIdSz; + } + + if (ret == 0) { + /* Set the key type OID. */ + SetASN_OID(&dataASN[ECCPUBLICKEYASN_IDX_ALGOID_OID], ECDSAk, + oidKeyType); + /* Set the curve OID. */ + SetASN_ReplaceBuffer(&dataASN[ECCPUBLICKEYASN_IDX_ALGOID_CURVEID], + NULL, (word32)curveIdSz); + /* Don't try to write out explicit parameters. */ + dataASN[ECCPUBLICKEYASN_IDX_ALGOID_PARAMS].noOut = 1; + /* Set size of public point to ensure space is made for it. */ + SetASN_Buffer(&dataASN[ECCPUBLICKEYASN_IDX_PUBKEY], NULL, pubSz); + /* Calculate size of ECC public key. */ + ret = SizeASN_Items(eccPublicKeyASN, dataASN, + eccPublicKeyASN_Length, &sz); + } + + /* Check buffer, if passed in, is big enough for encoded data. */ + if ((ret == 0) && (output != NULL) && (sz > outLen)) { + ret = BUFFER_E; + } + if ((ret == 0) && (output != NULL)) { + /* Encode ECC public key. */ + SetASN_Items(eccPublicKeyASN, dataASN, eccPublicKeyASN_Length, + output); + /* Skip to where public point is to be encoded. */ + output += sz - (int)pubSz; + /* Cache the location to place the name curve OID. */ + curveOid = (byte*) + dataASN[ECCPUBLICKEYASN_IDX_ALGOID_CURVEID].data.buffer.data; + } + + FREE_ASNSETDATA(dataASN, key->heap); + } + else if ((ret == 0) && (output != NULL) && (pubSz > (word32)outLen)) { + ret = BUFFER_E; + } + else { + /* Total size is the public point size. */ + sz = (int)pubSz; + } + + if ((ret == 0) && (output != NULL)) { + /* Put named curve OID data into encoding. */ + curveIdSz = SetCurve(key, curveOid, (size_t)curveIdSz); + if (curveIdSz < 0) { + ret = curveIdSz; + } + } + if ((ret == 0) && (output != NULL)) { + /* Encode public point. */ + PRIVATE_KEY_UNLOCK(); + ret = wc_ecc_export_x963_ex(key, output, &pubSz, comp); + PRIVATE_KEY_LOCK(); + } + if (ret == 0) { + /* Return the size of the encoding. */ + ret = sz; + } + + return ret; +#endif +} + + +/* Encode the public part of an ECC key in a DER. + * + * Pass NULL for output to get the size of the encoding. + * + * @param [in] key ECC key object. + * @param [out] output Buffer to hold DER encoding. + * @param [in] inLen Size of buffer in bytes. + * @param [in] with_AlgCurve Whether to use SubjectPublicKeyInfo format. + * @return Size of encoded data in bytes on success. + * @return BAD_FUNC_ARG when key or key's parameters is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +WOLFSSL_ABI +int wc_EccPublicKeyToDer(ecc_key* key, byte* output, word32 inLen, + int with_AlgCurve) +{ + return SetEccPublicKey(output, key, (int)inLen, with_AlgCurve, 0); +} + +int wc_EccPublicKeyToDer_ex(ecc_key* key, byte* output, word32 inLen, + int with_AlgCurve, int comp) +{ + return SetEccPublicKey(output, key, (int)inLen, with_AlgCurve, comp); +} + +int wc_EccPublicKeyDerSize(ecc_key* key, int with_AlgCurve) +{ + return SetEccPublicKey(NULL, key, 0, with_AlgCurve, 0); +} + +#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */ -#if !defined(NO_RSA) +#ifdef WOLFSSL_ASN_TEMPLATE +#if defined(WC_ENABLE_ASYM_KEY_EXPORT) || defined(WC_ENABLE_ASYM_KEY_IMPORT) +/* ASN.1 template for Ed25519 and Ed448 public key (SubkectPublicKeyInfo). + * RFC 8410, 4 - Subject Public Key Fields + */ +static const ASNItem edPubKeyASN[] = { + /* SubjectPublicKeyInfo */ +/* SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, + /* AlgorithmIdentifier */ +/* ALGOID_SEQ */ { 1, ASN_SEQUENCE, 1, 1, 0 }, + /* Ed25519/Ed448 OID */ +/* ALGOID_OID */ { 2, ASN_OBJECT_ID, 0, 0, 1 }, + /* Public key stream */ +/* PUBKEY */ { 1, ASN_BIT_STRING, 0, 0, 0 }, +}; +enum { + EDPUBKEYASN_IDX_SEQ = 0, + EDPUBKEYASN_IDX_ALGOID_SEQ, + EDPUBKEYASN_IDX_ALGOID_OID, + EDPUBKEYASN_IDX_PUBKEY +}; + +/* Number of items in ASN.1 template for Ed25519 and Ed448 public key. */ +#define edPubKeyASN_Length (sizeof(edPubKeyASN) / sizeof(ASNItem)) +#endif /* WC_ENABLE_ASYM_KEY_EXPORT || WC_ENABLE_ASYM_KEY_IMPORT */ +#endif /* WOLFSSL_ASN_TEMPLATE */ + +#ifdef WC_ENABLE_ASYM_KEY_EXPORT + +/* Build ASN.1 formatted public key based on RFC 8410 + * + * Pass NULL for output to get the size of the encoding. + * + * @param [in] pubKey public key buffer + * @param [in] pubKeyLen public key buffer length + * @param [out] output Buffer to put encoded data in (optional) + * @param [in] outLen Size of buffer in bytes + * @param [in] keyType is "enum Key_Sum" like ED25519k + * @param [in] withHeader Whether to include SubjectPublicKeyInfo around key. + * @return Size of encoded data in bytes on success + * @return BAD_FUNC_ARG when key is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int SetAsymKeyDerPublic(const byte* pubKey, word32 pubKeyLen, + byte* output, word32 outLen, int keyType, int withHeader) +{ + int ret = 0; +#ifndef WOLFSSL_ASN_TEMPLATE + word32 idx = 0; + word32 seqDataSz = 0; + word32 sz; +#else + int sz = 0; + DECL_ASNSETDATA(dataASN, edPubKeyASN_Length); +#endif + + if (pubKey == NULL) { + return BAD_FUNC_ARG; + } + +#ifndef WOLFSSL_ASN_TEMPLATE + /* calculate size */ + if (withHeader) { + word32 algoSz = SetAlgoID(keyType, NULL, oidKeyType, 0); + word32 bitStringSz = SetBitString(pubKeyLen, 0, NULL); + + seqDataSz = algoSz + bitStringSz + pubKeyLen; + sz = SetSequence(seqDataSz, NULL) + seqDataSz; + } + else { + sz = pubKeyLen; + } + + /* checkout output size */ + if (output != NULL && sz > outLen) { + ret = BUFFER_E; + } + + /* headers */ + if (ret == 0 && output != NULL && withHeader) { + /* sequence */ + idx = SetSequence(seqDataSz, output); + /* algo */ + idx += SetAlgoID(keyType, output + idx, oidKeyType, 0); + /* bit string */ + idx += SetBitString(pubKeyLen, 0, output + idx); + } + + if (ret == 0 && output != NULL) { + /* pub */ + XMEMCPY(output + idx, pubKey, pubKeyLen); + idx += pubKeyLen; + + sz = idx; + } + + if (ret == 0) { + ret = (int)sz; + } +#else + if (withHeader) { + CALLOC_ASNSETDATA(dataASN, edPubKeyASN_Length, ret, NULL); + + if (ret == 0) { + /* Set the OID. */ + SetASN_OID(&dataASN[EDPUBKEYASN_IDX_ALGOID_OID], (word32)keyType, + oidKeyType); + /* Leave space for public point. */ + SetASN_Buffer(&dataASN[EDPUBKEYASN_IDX_PUBKEY], NULL, pubKeyLen); + /* Calculate size of public key encoding. */ + ret = SizeASN_Items(edPubKeyASN, dataASN, edPubKeyASN_Length, &sz); + } + if ((ret == 0) && (output != NULL) && (sz > (int)outLen)) { + ret = BUFFER_E; + } + if ((ret == 0) && (output != NULL)) { + /* Encode public key. */ + SetASN_Items(edPubKeyASN, dataASN, edPubKeyASN_Length, output); + /* Set location to encode public point. */ + output = (byte*)dataASN[EDPUBKEYASN_IDX_PUBKEY].data.buffer.data; + } + + FREE_ASNSETDATA(dataASN, NULL); + } + else if ((output != NULL) && (pubKeyLen > outLen)) { + ret = BUFFER_E; + } + else if (ret == 0) { + sz = (int)pubKeyLen; + } + + if ((ret == 0) && (output != NULL)) { + /* Put public key into space provided. */ + XMEMCPY(output, pubKey, pubKeyLen); + } + if (ret == 0) { + ret = sz; + } +#endif /* WOLFSSL_ASN_TEMPLATE */ + return ret; +} +#endif /* WC_ENABLE_ASYM_KEY_EXPORT */ + +#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) +/* Encode the public part of an Ed25519 key in DER. + * + * Pass NULL for output to get the size of the encoding. + * + * @param [in] key Ed25519 key object. + * @param [out] output Buffer to put encoded data in. + * @param [in] outLen Size of buffer in bytes. + * @param [in] withAlg Whether to use SubjectPublicKeyInfo format. + * @return Size of encoded data in bytes on success. + * @return BAD_FUNC_ARG when key is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_Ed25519PublicKeyToDer(ed25519_key* key, byte* output, word32 inLen, + int withAlg) +{ + int ret; + byte pubKey[ED25519_PUB_KEY_SIZE]; + word32 pubKeyLen = (word32)sizeof(pubKey); + + if (key == NULL) { + return BAD_FUNC_ARG; + } + + ret = wc_ed25519_export_public(key, pubKey, &pubKeyLen); + if (ret == 0) { + ret = SetAsymKeyDerPublic(pubKey, pubKeyLen, output, inLen, + ED25519k, withAlg); + } + return ret; +} +#endif /* HAVE_ED25519 && HAVE_ED25519_KEY_EXPORT */ + +#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) +/* Encode the public part of an Ed448 key in DER. + * + * Pass NULL for output to get the size of the encoding. + * + * @param [in] key Ed448 key object. + * @param [out] output Buffer to put encoded data in. + * @param [in] outLen Size of buffer in bytes. + * @param [in] withAlg Whether to use SubjectPublicKeyInfo format. + * @return Size of encoded data in bytes on success. + * @return BAD_FUNC_ARG when key is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_Ed448PublicKeyToDer(ed448_key* key, byte* output, word32 inLen, + int withAlg) +{ + int ret; + byte pubKey[ED448_PUB_KEY_SIZE]; + word32 pubKeyLen = (word32)sizeof(pubKey); + + if (key == NULL) { + return BAD_FUNC_ARG; + } + + ret = wc_ed448_export_public(key, pubKey, &pubKeyLen); + if (ret == 0) { + ret = SetAsymKeyDerPublic(pubKey, pubKeyLen, output, inLen, + ED448k, withAlg); + } + return ret; +} +#endif /* HAVE_ED448 && HAVE_ED448_KEY_EXPORT */ +#if !defined(NO_RSA) && !defined(NO_CERTS) #ifdef WOLFSSL_ASN_TEMPLATE /* ASN.1 template for header before RSA key in certificate. */ static const ASNItem rsaCertKeyASN[] = { @@ -11374,7 +12154,7 @@ if (GetSequence(source, srcIdx, &length, pubIdx + (word32)pubLen) < 0) return ASN_PARSE_E; -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) cert->sigCtx.CertAtt.pubkey_n_start = cert->sigCtx.CertAtt.pubkey_e_start = pubIdx; #endif @@ -11386,7 +12166,8 @@ *srcIdx += (word32)length; #ifdef HAVE_OCSP - return CalcHashId(cert->publicKey, cert->pubKeySize, cert->subjectKeyHash); + return CalcHashId_ex(cert->publicKey, cert->pubKeySize, + cert->subjectKeyHash, HashIdAlg(cert->signatureOID)); #else return 0; #endif @@ -11409,24 +12190,24 @@ cert->publicKeyIndex = dataASN[RSACERTKEYASN_IDX_SEQ].offset; #endif - #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) + #if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) /* Start of SEQUENCE. */ cert->sigCtx.CertAtt.pubkey_n_start = cert->sigCtx.CertAtt.pubkey_e_start = dataASN[RSACERTKEYASN_IDX_SEQ].offset; #endif #ifdef HAVE_OCSP /* Calculate the hash of the public key for OCSP. */ - ret = CalcHashId(cert->publicKey, cert->pubKeySize, - cert->subjectKeyHash); + ret = CalcHashId_ex(cert->publicKey, cert->pubKeySize, + cert->subjectKeyHash, HashIdAlg(cert->signatureOID)); #endif } return ret; #endif /* WOLFSSL_ASN_TEMPLATE */ } -#endif /* !NO_RSA */ +#endif /* !NO_RSA && !NO_CERTS */ -#ifdef HAVE_ECC +#if defined(HAVE_ECC) && !defined(NO_CERTS) #ifdef WOLFSSL_ASN_TEMPLATE /* ASN.1 template for header before ECC key in certificate. */ @@ -11445,6 +12226,11 @@ /* Number of items in ASN.1 template for header before ECC key in cert. */ #define eccCertKeyASN_Length (sizeof(eccCertKeyASN) / sizeof(ASNItem)) + +#ifdef WOLFSSL_CUSTOM_CURVES +static int EccSpecifiedECDomainDecode(const byte* input, word32 inSz, + ecc_key* key, void* heap, int* curveSz); +#endif /* WOLFSSL_CUSTOM_CURVES */ #endif /* WOLFSSL_ASN_TEMPLATE */ /* Store public ECC key in certificate object. @@ -11495,7 +12281,7 @@ if ((ret = CheckCurve(cert->pkCurveOID)) < 0) return ECC_CURVE_OID_E; - #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) cert->sigCtx.CertAtt.curve_id = ret; #else (void)ret; @@ -11504,7 +12290,7 @@ ret = CheckBitString(source, srcIdx, &length, maxIdx, 1, NULL); if (ret != 0) return ret; - #if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) cert->sigCtx.CertAtt.pubkey_n_start = cert->sigCtx.CertAtt.pubkey_e_start = (*srcIdx + 1); cert->sigCtx.CertAtt.pubkey_n_len = ((length - 1) >> 1); @@ -11518,8 +12304,8 @@ #endif #ifdef HAVE_OCSP - ret = CalcHashId(source + *srcIdx, (word32)length, - cert->subjectKeyHash); + ret = CalcHashId_ex(source + *srcIdx, (word32)length, + cert->subjectKeyHash, HashIdAlg(cert->signatureOID)); if (ret != 0) return ret; #endif @@ -11558,7 +12344,18 @@ /* Store curve OID. */ cert->pkCurveOID = dataASN[ECCCERTKEYASN_IDX_OID].data.oid.sum; } - /* Ignore explicit parameters. */ + else { + #ifdef WOLFSSL_CUSTOM_CURVES + /* Parse explicit parameters. */ + ret = EccSpecifiedECDomainDecode( + dataASN[ECCCERTKEYASN_IDX_PARAMS].data.ref.data, + dataASN[ECCCERTKEYASN_IDX_PARAMS].data.ref.length, NULL, + NULL, &cert->pkCurveSize); + #else + /* Explicit parameters not supported in build configuration. */ + ret = ASN_PARSE_E; + #endif + } #ifdef WOLFSSL_MAXQ10XX_TLS cert->publicKeyIndex = @@ -11567,10 +12364,13 @@ #endif #ifdef HAVE_OCSP - /* Calculate the hash of the subject public key for OCSP. */ - ret = CalcHashId(dataASN[ECCCERTKEYASN_IDX_SUBJPUBKEY].data.ref.data, - dataASN[ECCCERTKEYASN_IDX_SUBJPUBKEY].data.ref.length, - cert->subjectKeyHash); + if (ret == 0) { + /* Calculate the hash of the subject public key for OCSP. */ + ret = CalcHashId_ex( + dataASN[ECCCERTKEYASN_IDX_SUBJPUBKEY].data.ref.data, + dataASN[ECCCERTKEYASN_IDX_SUBJPUBKEY].data.ref.length, + cert->subjectKeyHash, HashIdAlg(cert->signatureOID)); + } } if (ret == 0) { #endif @@ -11596,8 +12396,9 @@ return ret; #endif /* WOLFSSL_ASN_TEMPLATE */ } -#endif /* HAVE_ECC */ +#endif /* HAVE_ECC && !NO_CERTS */ +#ifndef NO_CERTS #if !defined(NO_DSA) #ifdef WOLFSSL_ASN_TEMPLATE /* ASN.1 template for DSA key in certificate. @@ -11690,7 +12491,7 @@ * Stores the public key in fields of the certificate object. * Validates the BER/DER items and does not store in a key object. * - * @param [in, out] cert Decoded certificate oject. + * @param [in, out] cert Decoded certificate object. * @param [in] source BER/DER encoded SubjectPublicKeyInfo block. * @param [in, out] inOutIdx On in, start of public key. * On out, start of ASN.1 item after public key. @@ -11713,7 +12514,7 @@ int ret = 0; int length; - /* Validate paramaters. */ + /* Validate parameters. */ if (source == NULL) { return ASN_PARSE_E; } @@ -11795,6 +12596,9 @@ break; #endif /* NO_RSA */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + #endif case ECDSAk: ret = StoreEccKey(cert, source, &srcIdx, maxIdx, source + pubIdx, (word32)pubLen); @@ -11812,7 +12616,6 @@ ret = StoreKey(cert, source, &srcIdx, maxIdx); break; #endif /* HAVE_ED448 */ - #if defined(HAVE_PQC) && defined(HAVE_LIBOQS) #ifdef HAVE_FALCON case FALCON_LEVEL1k: cert->pkCurveOID = FALCON_LEVEL1k; @@ -11863,7 +12666,6 @@ ret = StoreKey(cert, source, &srcIdx, maxIdx); break; #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ #ifndef NO_DSA case DSAk: cert->publicKey = source + pubIdx; @@ -11883,6 +12685,31 @@ /* Return error code. */ return ret; } +#endif + +/* Return the hash algorithm to use with the signature algorithm. + * + * @param [in] oidSum Signature id. + * @return Hash algorithm id. + */ +int HashIdAlg(word32 oidSum) +{ + (void)oidSum; + +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (oidSum == CTC_SM3wSM2) { + return WC_SM3; + } + if (oidSum == SM2k) { + return WC_SM3; + } +#endif +#if defined(NO_SHA) || (!defined(NO_SHA256) && defined(WC_ASN_HASH_SHA256)) + return WC_SHA256; +#else + return WC_SHA; +#endif +} /* Calculate hash of the id using the SHA-1 or SHA-256. * @@ -11894,18 +12721,55 @@ */ int CalcHashId(const byte* data, word32 len, byte* hash) { + /* Use default hash algorithm. */ + return CalcHashId_ex(data, len, hash, +#if defined(NO_SHA) || (!defined(NO_SHA256) && defined(WC_ASN_HASH_SHA256)) + WC_SHA256 +#else + WC_SHA +#endif + ); +} + +/* Calculate hash of the id using the SHA-1 or SHA-256. + * + * @param [in] data Data to hash. + * @param [in] len Length of data to hash. + * @param [out] hash Buffer to hold hash. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + */ +int CalcHashId_ex(const byte* data, word32 len, byte* hash, int hashAlg) +{ int ret; +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (hashAlg == WC_SM3) { + ret = wc_Sm3Hash(data, len, hash); + } + else +#endif #if defined(NO_SHA) || (!defined(NO_SHA256) && defined(WC_ASN_HASH_SHA256)) - ret = wc_Sha256Hash(data, len, hash); + if (hashAlg == WC_SHA256) { + ret = wc_Sha256Hash(data, len, hash); + } + else #elif !defined(NO_SHA) - ret = wc_ShaHash(data, len, hash); + if (hashAlg == WC_SHA) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + XMEMSET(hash + WC_SHA_DIGEST_SIZE, 0, KEYID_SIZE - WC_SHA_DIGEST_SIZE); + #endif + ret = wc_ShaHash(data, len, hash); + } + else #else - ret = NOT_COMPILED_IN; (void)data; (void)len; (void)hash; #endif + { + ret = NOT_COMPILED_IN; + } return ret; } @@ -11921,16 +12785,24 @@ * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ -static int GetHashId(const byte* id, int length, byte* hash) +static int GetHashId(const byte* id, int length, byte* hash, int hashAlg) { int ret; - if (length == KEYID_SIZE) { +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (length == wc_HashGetDigestSize(wc_HashTypeConvert(hashAlg))) +#else + if (length == KEYID_SIZE) +#endif + { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + XMEMSET(hash + length, 0, KEYID_SIZE - length); + #endif XMEMCPY(hash, id, (size_t)length); ret = 0; } else { - ret = CalcHashId(id, (word32)length, hash); + ret = CalcHashId_ex(id, (word32)length, hash, hashAlg); } return ret; @@ -11971,6 +12843,17 @@ (((id) - 3) >= 0 && ((id) - 3) < certNameSubjectSz && \ (certNameSubject[(id) - 3].strLen > 0)) +/* Set the string for a name component into the issuer name. */ +#define SetCertNameIssuer(cert, id, val) \ + *((char**)(((byte *)(cert)) + certNameSubject[(id) - 3].dataI)) = (val) +/* Set the string length for a name component into the issuer name. */ +#define SetCertNameIssuerLen(cert, id, val) \ + *((int*)(((byte *)(cert)) + certNameSubject[(id) - 3].lenI)) = (int)(val) +/* Set the encoding for a name component into the issuer name. */ +#define SetCertNameIssuerEnc(cert, id, val) \ + *((byte*)(((byte *)(cert)) + certNameSubject[(id) - 3].encI)) = (val) + + /* Mapping of certificate name component to useful information. */ typedef struct CertNameData { /* Type string of name component. */ @@ -11984,6 +12867,14 @@ size_t len; /* Offset of encoding in subject name component. */ size_t enc; +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + /* Offset of data in subject name component. */ + size_t dataI; + /* Offset of length in subject name component. */ + size_t lenI; + /* Offset of encoding in subject name component. */ + size_t encI; +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE /* NID of type for subject name component. */ @@ -12000,6 +12891,11 @@ OFFSETOF(DecodedCert, subjectCN), OFFSETOF(DecodedCert, subjectCNLen), OFFSETOF(DecodedCert, subjectCNEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerCN), + OFFSETOF(DecodedCert, issuerCNLen), + OFFSETOF(DecodedCert, issuerCNEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_commonName @@ -12012,6 +12908,11 @@ OFFSETOF(DecodedCert, subjectSN), OFFSETOF(DecodedCert, subjectSNLen), OFFSETOF(DecodedCert, subjectSNEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerSN), + OFFSETOF(DecodedCert, issuerSNLen), + OFFSETOF(DecodedCert, issuerSNEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_surname @@ -12024,6 +12925,11 @@ OFFSETOF(DecodedCert, subjectSND), OFFSETOF(DecodedCert, subjectSNDLen), OFFSETOF(DecodedCert, subjectSNDEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerSND), + OFFSETOF(DecodedCert, issuerSNDLen), + OFFSETOF(DecodedCert, issuerSNDEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_serialNumber @@ -12036,6 +12942,11 @@ OFFSETOF(DecodedCert, subjectC), OFFSETOF(DecodedCert, subjectCLen), OFFSETOF(DecodedCert, subjectCEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerC), + OFFSETOF(DecodedCert, issuerCLen), + OFFSETOF(DecodedCert, issuerCEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_countryName @@ -12048,6 +12959,11 @@ OFFSETOF(DecodedCert, subjectL), OFFSETOF(DecodedCert, subjectLLen), OFFSETOF(DecodedCert, subjectLEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerL), + OFFSETOF(DecodedCert, issuerLLen), + OFFSETOF(DecodedCert, issuerLEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_localityName @@ -12060,6 +12976,11 @@ OFFSETOF(DecodedCert, subjectST), OFFSETOF(DecodedCert, subjectSTLen), OFFSETOF(DecodedCert, subjectSTEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerST), + OFFSETOF(DecodedCert, issuerSTLen), + OFFSETOF(DecodedCert, issuerSTEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_stateOrProvinceName @@ -12072,6 +12993,11 @@ OFFSETOF(DecodedCert, subjectStreet), OFFSETOF(DecodedCert, subjectStreetLen), OFFSETOF(DecodedCert, subjectStreetEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_streetAddress @@ -12084,6 +13010,11 @@ OFFSETOF(DecodedCert, subjectO), OFFSETOF(DecodedCert, subjectOLen), OFFSETOF(DecodedCert, subjectOEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerO), + OFFSETOF(DecodedCert, issuerOLen), + OFFSETOF(DecodedCert, issuerOEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_organizationName @@ -12096,6 +13027,11 @@ OFFSETOF(DecodedCert, subjectOU), OFFSETOF(DecodedCert, subjectOULen), OFFSETOF(DecodedCert, subjectOUEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + OFFSETOF(DecodedCert, issuerOU), + OFFSETOF(DecodedCert, issuerOULen), + OFFSETOF(DecodedCert, issuerOUEnc), +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_organizationalUnitName @@ -12108,6 +13044,11 @@ 0, 0, 0, +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE 0, @@ -12120,6 +13061,11 @@ 0, 0, 0, +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE 0, @@ -12132,6 +13078,11 @@ 0, 0, 0, +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE 0, @@ -12144,6 +13095,11 @@ OFFSETOF(DecodedCert, subjectBC), OFFSETOF(DecodedCert, subjectBCLen), OFFSETOF(DecodedCert, subjectBCEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_businessCategory @@ -12156,6 +13112,11 @@ 0, 0, 0, +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE 0, @@ -12168,6 +13129,11 @@ OFFSETOF(DecodedCert, subjectPC), OFFSETOF(DecodedCert, subjectPCLen), OFFSETOF(DecodedCert, subjectPCEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_postalCode @@ -12180,6 +13146,11 @@ OFFSETOF(DecodedCert, subjectUID), OFFSETOF(DecodedCert, subjectUIDLen), OFFSETOF(DecodedCert, subjectUIDEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_userId @@ -12193,6 +13164,11 @@ OFFSETOF(DecodedCert, subjectN), OFFSETOF(DecodedCert, subjectNLen), OFFSETOF(DecodedCert, subjectNEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_name @@ -12205,6 +13181,11 @@ OFFSETOF(DecodedCert, subjectGN), OFFSETOF(DecodedCert, subjectGNLen), OFFSETOF(DecodedCert, subjectGNEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_givenName @@ -12217,6 +13198,11 @@ OFFSETOF(DecodedCert, subjectI), OFFSETOF(DecodedCert, subjectILen), OFFSETOF(DecodedCert, subjectIEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_initials @@ -12229,6 +13215,11 @@ OFFSETOF(DecodedCert, subjectDNQ), OFFSETOF(DecodedCert, subjectDNQLen), OFFSETOF(DecodedCert, subjectDNQEnc), +#ifdef WOLFSSL_HAVE_ISSUER_NAMES + 0, + 0, + 0, +#endif #endif #ifdef WOLFSSL_X509_NAME_AVAILABLE NID_dnQualifier @@ -12240,6 +13231,7 @@ static const int certNameSubjectSz = (int) (sizeof(certNameSubject) / sizeof(CertNameData)); + /* ASN.1 template for an RDN. * X.509: RFC 5280, 4.1.2.4 - RelativeDistinguishedName */ @@ -12280,9 +13272,9 @@ static int GenerateDNSEntryIPString(DNS_entry* entry, void* heap) { int ret = 0; - int nameSz; + size_t nameSz = 0; char tmpName[WOLFSSL_MAX_IPSTR] = {0}; - char* ip; + unsigned char* ip; if (entry == NULL || entry->type != ASN_IP_TYPE) { return BAD_FUNC_ARG; @@ -12293,7 +13285,7 @@ WOLFSSL_MSG("Unexpected IP size"); return BAD_FUNC_ARG; } - ip = entry->name; + ip = (unsigned char*)entry->name; /* store IP addresses as a string */ if (entry->len == WOLFSSL_IP4_ADDR_LEN) { @@ -12307,7 +13299,7 @@ } if (entry->len == WOLFSSL_IP6_ADDR_LEN) { - int i; + size_t i; for (i = 0; i < 8; i++) { if (XSNPRINTF(tmpName + i * 5, sizeof(tmpName) - i * 5, "%02X%02X%s", 0xFF & ip[2 * i], 0xFF & ip[2 * i + 1], @@ -12320,8 +13312,9 @@ } } - nameSz = (int)XSTRLEN(tmpName); - entry->ipString = (char*)XMALLOC(nameSz + 1, heap, DYNAMIC_TYPE_ALTNAME); + nameSz = XSTRLEN(tmpName); + entry->ipString = (char*)XMALLOC(nameSz + 1, heap, + DYNAMIC_TYPE_ALTNAME); if (entry->ipString == NULL) { ret = MEMORY_E; } @@ -12337,6 +13330,91 @@ } #endif /* OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */ +#if defined(OPENSSL_ALL) +/* used to set the human readable string for the registeredID with an + * ASN_RID_TYPE DNS entry + * return 0 on success + */ +static int GenerateDNSEntryRIDString(DNS_entry* entry, void* heap) +{ + int i, j, ret = 0; + int nameSz = 0; + int nid = 0; + int tmpSize = MAX_OID_SZ; + word32 oid = 0; + word32 idx = 0; + word16 tmpName[MAX_OID_SZ]; + char oidName[MAX_OID_SZ]; + char* finalName; + + if (entry == NULL || entry->type != ASN_RID_TYPE) { + return BAD_FUNC_ARG; + } + + if (entry->len <= 0) { + return BAD_FUNC_ARG; + } + + XMEMSET(&oidName, 0, MAX_OID_SZ); + + ret = GetOID((const byte*)entry->name, &idx, &oid, oidIgnoreType, + entry->len); + + if (ret == 0 && (nid = oid2nid(oid, oidCsrAttrType)) > 0) { + /* OID has known string value */ + finalName = (char*)wolfSSL_OBJ_nid2ln(nid); + } + else { + /* Decode OBJECT_ID into dotted form array. */ + ret = DecodeObjectId((const byte*)(entry->name),(word32)entry->len, + tmpName, (word32*)&tmpSize); + + if (ret == 0) { + j = 0; + /* Append each number of dotted form. */ + for (i = 0; i < tmpSize; i++) { + if (j >= MAX_OID_SZ) { + return BUFFER_E; + } + + if (i < tmpSize - 1) { + ret = XSNPRINTF(oidName + j, MAX_OID_SZ - j, "%d.", tmpName[i]); + } + else { + ret = XSNPRINTF(oidName + j, MAX_OID_SZ - j, "%d", tmpName[i]); + } + + if (ret >= 0) { + j += ret; + } + else { + return BUFFER_E; + } + } + ret = 0; + finalName = oidName; + } + } + + if (ret == 0) { + nameSz = (int)XSTRLEN((const char*)finalName); + + entry->ridString = (char*)XMALLOC(nameSz + 1, heap, + DYNAMIC_TYPE_ALTNAME); + + if (entry->ridString == NULL) { + ret = MEMORY_E; + } + + if (ret == 0) { + XMEMCPY(entry->ridString, finalName, nameSz + 1); + } + } + + return ret; +} +#endif /* OPENSSL_ALL && WOLFSSL_ASN_TEMPLATE */ + #ifdef WOLFSSL_ASN_TEMPLATE #if defined(WOLFSSL_CERT_GEN) || !defined(NO_CERTS) @@ -12415,6 +13493,15 @@ XMEMCPY(dnsEntry->name, str, (size_t)strLen); dnsEntry->name[strLen] = '\0'; +#if defined(OPENSSL_ALL) + /* store registeredID as a string */ + if (type == ASN_RID_TYPE) { + if ((ret = GenerateDNSEntryRIDString(dnsEntry, cert->heap)) != 0) { + XFREE(dnsEntry->name, cert->heap, DYNAMIC_TYPE_ALTNAME); + XFREE(dnsEntry, cert->heap, DYNAMIC_TYPE_ALTNAME); + } + } +#endif #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME) /* store IP addresses as a string */ if (type == ASN_IP_TYPE) { @@ -12485,6 +13572,43 @@ return ret; } +#if (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_EXT)) && \ + defined(WOLFSSL_HAVE_ISSUER_NAMES) +/* Set the details of an issuer name component into a certificate. + * + * @param [in, out] cert Certificate object. + * @param [in] id Id of component. + * @param [in] str String for component. + * @param [in] strLen Length of string. + * @param [in] tag BER tag representing encoding of string. + * @return 0 on success, negative values on failure. + */ +static int SetIssuer(DecodedCert* cert, int id, byte* str, int strLen, + byte tag) +{ + int ret = 0; + + /* Put string and encoding into certificate. */ + if (id == ASN_COMMON_NAME) { + cert->issuerCN = (char *)str; + cert->issuerCNLen = (int)strLen; + cert->issuerCNEnc = (char)tag; + } + else if (id > ASN_COMMON_NAME && id <= ASN_USER_ID) { + /* Use table and offsets to put data into appropriate fields. */ + SetCertNameIssuer(cert, id, (char*)str); + SetCertNameIssuerLen(cert, id, strLen); + SetCertNameIssuerEnc(cert, id, tag); + } + else if (id == ASN_EMAIL) { + cert->issuerEmail = (char*)str; + cert->issuerEmailLen = strLen; + } + + return ret; +} +#endif + /* Get a RelativeDistinguishedName from the encoding and put in certificate. * * @param [in, out] cert Certificate object. @@ -12561,6 +13685,18 @@ *nid = NID_favouriteDrink; #endif } +#ifdef WOLFSSL_CERT_REQ + else if (oidSz == sizeof(attrPkcs9ContentTypeOid) && + XMEMCMP(oid, attrPkcs9ContentTypeOid, oidSz) == 0) { + /* Set the pkcs9_contentType, type string, length and NID. */ + id = ASN_CONTENT_TYPE; + typeStr = WOLFSSL_CONTENT_TYPE; + typeStrLen = sizeof(WOLFSSL_CONTENT_TYPE) - 1; + #ifdef WOLFSSL_X509_NAME_AVAILABLE + *nid = NID_pkcs9_contentType; + #endif + } +#endif /* Other OIDs that start with the same values. */ else if (oidSz == sizeof(dcOid) && XMEMCMP(oid, dcOid, oidSz-1) == 0) { WOLFSSL_MSG("Unknown pilot attribute type"); @@ -12605,6 +13741,13 @@ /* Store subject field components. */ ret = SetSubject(cert, id, str, (int)strLen, tag); } + #if (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_CERT_EXT)) && \ + defined(WOLFSSL_HAVE_ISSUER_NAMES) + /* Put issuer common name string and encoding into certificate. */ + else { + ret = SetIssuer(cert, id, str, (int)strLen, tag); + } + #endif if (ret == 0) { /* Check there is space for this in the full name string and * terminating NUL character. */ @@ -12663,12 +13806,14 @@ /* For OCSP, RFC2560 section 4.1.1 states the issuer hash should be * calculated over the entire DER encoding of the Name field, including * the tag and length. */ - if (CalcHashId(input + *inOutIdx, maxIdx - *inOutIdx, hash) != 0) + if (CalcHashId_ex(input + *inOutIdx, maxIdx - *inOutIdx, hash, + HashIdAlg(cert->signatureOID)) != 0) { return ASN_PARSE_E; + } #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ !defined(WOLFCRYPT_ONLY) - dName = wolfSSL_X509_NAME_new(); + dName = wolfSSL_X509_NAME_new_ex(cert->heap); if (dName == NULL) { return MEMORY_E; } @@ -12758,6 +13903,18 @@ return ASN_PARSE_E; } + #ifndef WOLFSSL_NO_ASN_STRICT + /* RFC 5280 section 4.1.2.4 lists a DirecotryString as being + * 1..MAX in length */ + if (strLen < 1) { + WOLFSSL_MSG("Non conforming DirectoryString of length 0 was" + " found"); + WOLFSSL_MSG("Use WOLFSSL_NO_ASN_STRICT if wanting to allow" + " empty DirectoryString's"); + return ASN_PARSE_E; + } + #endif + if (id == ASN_COMMON_NAME) { if (nameType == SUBJECT) { cert->subjectCN = (char *)&input[srcIdx]; @@ -13210,7 +14367,6 @@ nid = NID_userId; #endif /* OPENSSL_EXTRA */ break; - case ASN_DOMAIN_COMPONENT: copy = WOLFSSL_DOMAIN_COMPONENT; copyLen = sizeof(WOLFSSL_DOMAIN_COMPONENT) - 1; @@ -13229,7 +14385,15 @@ nid = NID_favouriteDrink; #endif /* OPENSSL_EXTRA */ break; - + case ASN_CONTENT_TYPE: + copy = WOLFSSL_CONTENT_TYPE; + copyLen = sizeof(WOLFSSL_CONTENT_TYPE) - 1; + #if (defined(OPENSSL_EXTRA) || \ + defined(OPENSSL_EXTRA_X509_SMALL)) \ + && !defined(WOLFCRYPT_ONLY) + nid = NID_pkcs9_contentType; + #endif /* OPENSSL_EXTRA */ + break; default: WOLFSSL_MSG("Unknown pilot attribute type"); #if (defined(OPENSSL_EXTRA) || \ @@ -13305,7 +14469,7 @@ DECL_ASNGETDATA(dataASN, rdnASN_Length); int ret = 0; word32 idx = 0; - int len; + int len = 0; word32 srcIdx = *inOutIdx; #ifdef WOLFSSL_X509_NAME_AVAILABLE WOLFSSL_X509_NAME* dName = NULL; @@ -13316,7 +14480,8 @@ /* For OCSP, RFC2560 section 4.1.1 states the issuer hash should be * calculated over the entire DER encoding of the Name field, including * the tag and length. */ - if (CalcHashId(input + srcIdx, maxIdx - srcIdx, hash) != 0) { + if (CalcHashId_ex(input + srcIdx, maxIdx - srcIdx, hash, + HashIdAlg(cert->signatureOID)) != 0) { ret = ASN_PARSE_E; } @@ -13324,8 +14489,8 @@ #ifdef WOLFSSL_X509_NAME_AVAILABLE if (ret == 0) { - /* Create an X509_NAME to hold data for OpenSSL compatability APIs. */ - dName = wolfSSL_X509_NAME_new(); + /* Create an X509_NAME to hold data for OpenSSL compatibility APIs. */ + dName = wolfSSL_X509_NAME_new_ex(cert->heap); if (dName == NULL) { ret = MEMORY_E; } @@ -13380,6 +14545,18 @@ /* Get string reference. */ GetASN_GetRef(&dataASN[RDNASN_IDX_ATTR_VAL], &str, &strLen); + #ifndef WOLFSSL_NO_ASN_STRICT + /* RFC 5280 section 4.1.2.4 lists a DirecotryString as being + * 1..MAX in length */ + if (ret == 0 && strLen < 1) { + WOLFSSL_MSG("Non conforming DirectoryString of length 0 was" + " found"); + WOLFSSL_MSG("Use WOLFSSL_NO_ASN_STRICT if wanting to allow" + " empty DirectoryString's"); + ret = ASN_PARSE_E; + } + #endif + /* Convert BER tag to a OpenSSL type. */ switch (tag) { case CTC_UTF8: @@ -13395,7 +14572,7 @@ if (nid != 0) { /* Add an entry to the X509_NAME. */ if (wolfSSL_X509_NAME_add_entry_by_NID(dName, nid, enc, str, - strLen, -1, -1) != WOLFSSL_SUCCESS) { + (int)strLen, -1, -1) != WOLFSSL_SUCCESS) { ret = ASN_PARSE_E; } } @@ -13415,15 +14592,17 @@ #if (defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ defined(HAVE_LIGHTY)) && \ (defined(HAVE_PKCS7) || defined(WOLFSSL_CERT_EXT)) - dName->rawLen = min(cert->issuerRawLen, WC_ASN_NAME_MAX); - XMEMCPY(dName->raw, cert->issuerRaw, dName->rawLen); + dName->rawLen = (int)min((word32)cert->issuerRawLen, + WC_ASN_NAME_MAX); + XMEMCPY(dName->raw, cert->issuerRaw, (size_t)dName->rawLen); #endif cert->issuerName = dName; } else { #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) - dName->rawLen = min(cert->subjectRawLen, WC_ASN_NAME_MAX); - XMEMCPY(dName->raw, cert->subjectRaw, dName->rawLen); + dName->rawLen = (int)min((word32)cert->subjectRawLen, + WC_ASN_NAME_MAX); + XMEMCPY(dName->raw, cert->subjectRaw, (size_t)dName->rawLen); #endif cert->subjectName = dName; } @@ -13701,7 +14880,7 @@ } idx = 4; /* use idx now for char buffer */ - if (XSNPRINTF(buf + idx, len - idx, "%2d %02d:%02d:%02d %d GMT", + if (XSNPRINTF(buf + idx, (size_t)(len - idx), "%2d %02d:%02d:%02d %d GMT", t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, (int)t.tm_year + 1900) >= len - idx) { @@ -13713,6 +14892,23 @@ } #endif /* OPENSSL_ALL || WOLFSSL_MYSQL_COMPATIBLE || WOLFSSL_NGINX || WOLFSSL_HAPROXY */ +/* Check time struct for valid values. Returns 0 for success */ +static int ValidateGmtime(struct tm* inTime) +{ + int ret = 1; + if ((inTime != NULL) && + (inTime->tm_sec >= 0) && (inTime->tm_sec <= 61) && + (inTime->tm_min >= 0) && (inTime->tm_min <= 59) && + (inTime->tm_hour >= 0) && (inTime->tm_hour <= 23) && + (inTime->tm_mday >= 1) && (inTime->tm_mday <= 31) && + (inTime->tm_mon >= 0) && (inTime->tm_mon <= 11) && + (inTime->tm_wday >= 0) && (inTime->tm_wday <= 6) && + (inTime->tm_yday >= 0) && (inTime->tm_yday <= 365)) { + ret = 0; + } + + return ret; +} #if !defined(NO_ASN_TIME) && !defined(USER_TIME) && \ !defined(TIME_OVERRIDES) && (defined(OPENSSL_EXTRA) || defined(HAVE_PKCS7)) @@ -13789,7 +14985,7 @@ return BAD_FUNC_ARG; ts = (struct tm *)XGMTIME((time_t*)currTime, tmpTime); - if (ts == NULL) { + if (ValidateGmtime(ts)) { WOLFSSL_MSG("failed to get time data."); return ASN_TIME_E; } @@ -13893,6 +15089,9 @@ /* like atoi but only use first byte */ /* Make sure before and after dates are valid */ +/* date = ASN.1 raw */ +/* format = ASN_UTC_TIME or ASN_GENERALIZED_TIME */ +/* dateType = AFTER or BEFORE */ int wc_ValidateDate(const byte* date, byte format, int dateType) { time_t ltime; @@ -13912,12 +15111,14 @@ (void)tmpTime; ltime = wc_Time(0); - if (sizeof(ltime) == sizeof(word32) && (int)ltime < 0){ +#ifndef NO_TIME_SIGNEDNESS_CHECK + if (sizeof(ltime) == sizeof(word32) && (sword32)ltime < 0){ /* A negative response here could be due to a 32-bit time_t * where the year is 2038 or later. */ WOLFSSL_MSG("wc_Time failed to return a valid value"); return 0; } +#endif #ifdef WOLFSSL_BEFORE_DATE_CLOCK_SKEW if (dateType == BEFORE) { @@ -13953,10 +15154,10 @@ return 0; } - ltime -= (time_t)timeDiff ; + ltime -= (time_t)timeDiff; localTime = XGMTIME(<ime, tmpTime); - if (localTime == NULL) { + if (ValidateGmtime(localTime)) { WOLFSSL_MSG("XGMTIME failed"); return 0; } @@ -14124,7 +15325,7 @@ #endif } -#ifndef WOLFSSL_ASN_TEMPLATE +#if !defined(NO_CERTS) && !defined(WOLFSSL_ASN_TEMPLATE) static int GetDate(DecodedCert* cert, int dateType, int verify, int maxIdx) { int ret, length; @@ -14192,7 +15393,7 @@ return 0; } -#endif /* !WOLFSSL_ASN_TEMPLATE */ +#endif /* !NO_CERTS && !WOLFSSL_ASN_TEMPLATE */ int wc_GetDateInfo(const byte* certDate, int certDateSz, const byte** date, @@ -14246,7 +15447,7 @@ #endif /* WOLFSSL_CERT_GEN && WOLFSSL_ALT_NAMES */ #endif /* !NO_ASN_TIME */ -#ifndef WOLFSSL_ASN_TEMPLATE +#if !defined(WOLFSSL_ASN_TEMPLATE) && !defined(NO_CERTS) static int GetSigAlg(DecodedCert* cert, word32* sigOid, word32 maxIdx) { int length; @@ -14287,6 +15488,7 @@ } #endif +#ifndef NO_CERTS #ifdef WOLFSSL_ASN_TEMPLATE /* TODO: move code around to not require this. */ static int DecodeCertInternal(DecodedCert* cert, int verify, int* criticalExt, @@ -14294,6 +15496,54 @@ int stopAfterPubKey); #endif +/* Assumes the target is a Raw-Public-Key certificate and parsed up to the + * public key. Returns CRYPTOCB_UNAVAILABLE if it determines that the cert is + * different from the Paw-Public-Key cert. In that case, cert->srcIdx is not + * consumed so as succeeding parse function can take over. + * In case that the target is Raw-Public-Key cert and contains a public key, + * returns 0 and consumes cert->srcIdx so as a public key retrieval function + * can follow. + */ +#if defined(HAVE_RPK) +int TryDecodeRPKToKey(DecodedCert* cert) +{ + int ret = 0, len; + word32 tmpIdx; + word32 oid; + + WOLFSSL_ENTER("TryDecodeRPKToKey"); + + if (cert == NULL) + return BAD_FUNC_ARG; + + tmpIdx = cert->srcIdx; + + /* both X509 cert and RPK cert should start with a Sequence tag */ + if (ret == 0) { + if (GetSequence(cert->source, &tmpIdx, &len, cert->maxIdx) < 0) + ret = ASN_PARSE_E; + } + /* TBSCertificate of X509 or AlgorithmIdentifier of RPK cert */ + if (ret == 0) { + if (GetSequence(cert->source, &tmpIdx, &len, cert->maxIdx) < 0) + ret = ASN_PARSE_E; + } + /* OBJ ID should be next in RPK cert */ + if (ret == 0) { + if (GetObjectId(cert->source, &tmpIdx, &oid, oidKeyType, cert->maxIdx) + < 0) + ret = CRYPTOCB_UNAVAILABLE; + } + /* consume cert->srcIdx */ + if (ret == 0) { + WOLFSSL_MSG("Looks like RPK certificate"); + cert->srcIdx = tmpIdx; + } + WOLFSSL_LEAVE("TryDecodeRPKToKey", ret); + return ret; +} +#endif /* HAVE_RPK */ + /* Parse the certificate up to the X.509 public key. * * If cert data is invalid then badDate get set to error value. @@ -14386,6 +15636,20 @@ int badDate = 0; int ret; +#if defined(HAVE_RPK) + + /* Raw Public Key certificate has only a SubjectPublicKeyInfo structure + * as its contents. So try to call GetCertKey to get public key from it. + * If it fails, the cert should be a X509 cert and proceed to process as + * x509 cert. */ + ret = GetCertKey(cert, cert->source, &cert->srcIdx, cert->maxIdx); + if (ret == 0) { + WOLFSSL_MSG("Raw Public Key certificate found and parsed"); + cert->isRPK = 1; + return ret; + } +#endif /* HAVE_RPK */ + if ( (ret = wc_GetPubX509(cert, verify, &badDate)) < 0) return ret; @@ -14396,9 +15660,8 @@ else #endif { - cert->selfSigned = XMEMCMP(cert->issuerHash, - cert->subjectHash, - KEYID_SIZE) == 0 ? 1 : 0; + cert->selfSigned = XMEMCMP(cert->issuerHash, cert->subjectHash, + KEYID_SIZE) == 0 ? 1 : 0; } ret = GetCertKey(cert, cert->source, &cert->srcIdx, cert->maxIdx); @@ -14415,8 +15678,15 @@ int ret; int badDate = 0; +#ifdef WOLFSSL_DUAL_ALG_CERTS + /* Call internal version and decode completely to also handle extensions. + * This is required to parse a potential alternative public key in the + * SubjectAlternativeKey extension. */ + ret = DecodeCertInternal(cert, verify, NULL, &badDate, 0, 0); +#else /* Call internal version and stop after public key. */ ret = DecodeCertInternal(cert, verify, NULL, &badDate, 0, 1); +#endif /* Always return date errors. */ if (ret == 0) { ret = badDate; @@ -14425,7 +15695,7 @@ #endif /* WOLFSSL_ASN_TEMPLATE */ } -#if !defined(NO_CERTS) && !defined(WOLFSSL_ASN_TEMPLATE) +#if !defined(WOLFSSL_ASN_TEMPLATE) static int GetSignature(DecodedCert* cert) { int length; @@ -14445,7 +15715,8 @@ return 0; } -#endif /* !NO_CERTS && !WOLFSSL_ASN_TEMPLATE */ +#endif /* !WOLFSSL_ASN_TEMPLATE */ +#endif /* !NO_CERTS */ #ifndef WOLFSSL_ASN_TEMPLATE static word32 SetOctetString8Bit(word32 len, byte* output) @@ -14510,6 +15781,18 @@ return i; } +word32 SetLengthEx(word32 length, byte* output, byte isIndef) +{ + if (isIndef) { + if (output != NULL) { + output[0] = ASN_INDEF_LENGTH; + } + return 1; + } + else { + return SetLength(length, output); + } +} /* Encode a DER header - type/tag and length. * * @param [in] tag DER tag of ASN.1 item. @@ -14517,14 +15800,15 @@ * @param [out] output Buffer to encode into. * @return Number of bytes encoded. */ -static word32 SetHeader(byte tag, word32 len, byte* output) +static word32 SetHeader(byte tag, word32 len, byte* output, byte isIndef) { if (output) { /* Encode tag first. */ output[0] = tag; } /* Encode the length. */ - return SetLength(len, output ? output + ASN_TAG_SZ : NULL) + ASN_TAG_SZ; + return SetLengthEx(len, output ? output + ASN_TAG_SZ : NULL, isIndef) + + ASN_TAG_SZ; } /* Encode a SEQUENCE header in DER. @@ -14535,7 +15819,12 @@ */ word32 SetSequence(word32 len, byte* output) { - return SetHeader(ASN_SEQUENCE | ASN_CONSTRUCTED, len, output); + return SetHeader(ASN_SEQUENCE | ASN_CONSTRUCTED, len, output, 0); +} + +word32 SetSequenceEx(word32 len, byte* output, byte isIndef) +{ + return SetHeader(ASN_SEQUENCE | ASN_CONSTRUCTED, len, output, isIndef); } /* Encode an OCTET STRING header in DER. @@ -14546,7 +15835,14 @@ */ word32 SetOctetString(word32 len, byte* output) { - return SetHeader(ASN_OCTET_STRING, len, output); + return SetHeader(ASN_OCTET_STRING, len, output, 0); +} + +word32 SetOctetStringEx(word32 len, byte* output, byte indef) +{ + if (indef) + return SetHeader(ASN_OCTET_STRING | ASN_CONSTRUCTED, len, output, indef); + return SetOctetString(len, output); } /* Encode a SET header in DER. @@ -14557,7 +15853,7 @@ */ word32 SetSet(word32 len, byte* output) { - return SetHeader(ASN_SET | ASN_CONSTRUCTED, len, output); + return SetHeader(ASN_SET | ASN_CONSTRUCTED, len, output, 0); } /* Encode an implicit context specific header in DER. @@ -14570,11 +15866,23 @@ * @param [out] output Buffer to encode into. * @return Number of bytes encoded. */ -word32 SetImplicit(byte tag, byte number, word32 len, byte* output) +word32 SetImplicit(byte tag, byte number, word32 len, byte* output, byte isIndef) { - tag = (byte)(((tag == ASN_SEQUENCE || tag == ASN_SET) ? ASN_CONSTRUCTED : 0) - | ASN_CONTEXT_SPECIFIC | number); - return SetHeader(tag, len, output); + byte useIndef = 0; + + if ((tag == ASN_OCTET_STRING) && isIndef) { + tag = ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC | number; + } + else { + tag = (byte)(((tag == ASN_SEQUENCE || tag == ASN_SET) ? + ASN_CONSTRUCTED : 0) | ASN_CONTEXT_SPECIFIC | number); + } + + if (isIndef && (tag & ASN_CONSTRUCTED)) { + useIndef = 1; + } + + return SetHeader(tag, len, output, useIndef); } /* Encode an explicit context specific header in DER. @@ -14586,10 +15894,10 @@ * @param [out] output Buffer to encode into. * @return Number of bytes encoded. */ -word32 SetExplicit(byte number, word32 len, byte* output) +word32 SetExplicit(byte number, word32 len, byte* output, byte isIndef) { return SetHeader((byte)(ASN_CONTEXT_SPECIFIC | ASN_CONSTRUCTED | number), - len, output); + len, output, isIndef); } #if defined(OPENSSL_EXTRA) @@ -14603,7 +15911,7 @@ { WOLFSSL_ASN1_OTHERNAME *nm = (WOLFSSL_ASN1_OTHERNAME *)name; char *nameStr = NULL; - int nameSz = 0; + word32 nameSz = 0; word32 len = 0; if ((nm == NULL) || (nm->value == NULL)) { @@ -14612,11 +15920,11 @@ } nameStr = nm->value->value.utf8string->data; - nameSz = nm->value->value.utf8string->length; + nameSz = (word32)nm->value->value.utf8string->length; len = nm->type_id->objSz + - SetHeader(ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC, nameSz + 2, NULL) + - SetHeader(CTC_UTF8, nameSz, NULL) + nameSz; + SetHeader(ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC, nameSz + 2, NULL, 0) + + SetHeader(CTC_UTF8, nameSz, NULL, 0) + nameSz; if (output != NULL) { /* otherName OID */ @@ -14624,9 +15932,9 @@ output += nm->type_id->objSz; output += SetHeader(ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC, nameSz + 2, - output); + output, 0); - output += SetHeader(CTC_UTF8, nameSz, output); + output += SetHeader(CTC_UTF8, nameSz, output, 0); XMEMCPY(output, nameStr, nameSz); } @@ -14635,56 +15943,6 @@ } #endif /* OPENSSL_EXTRA */ -#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) - -static int SetCurve(ecc_key* key, byte* output, size_t outSz) -{ -#ifdef HAVE_OID_ENCODING - int ret; -#endif - int idx; - word32 oidSz = 0; - - /* validate key */ - if (key == NULL || key->dp == NULL) { - return BAD_FUNC_ARG; - } - -#ifdef HAVE_OID_ENCODING - ret = EncodeObjectId(key->dp->oid, key->dp->oidSz, NULL, &oidSz); - if (ret != 0) { - return ret; - } -#else - oidSz = key->dp->oidSz; -#endif - - idx = SetObjectId((int)oidSz, output); - - /* length only */ - if (output == NULL) { - return idx + (int)oidSz; - } - - /* verify output buffer has room */ - if (oidSz > outSz) - return BUFFER_E; - -#ifdef HAVE_OID_ENCODING - ret = EncodeObjectId(key->dp->oid, key->dp->oidSz, output+idx, &oidSz); - if (ret != 0) { - return ret; - } -#else - XMEMCPY(output+idx, key->dp->oid, oidSz); -#endif - idx += (int)oidSz; - - return idx; -} - -#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */ - #ifdef HAVE_ECC /* Determines whether the signature algorithm is using ECDSA. @@ -14720,6 +15978,9 @@ #ifdef HAVE_ECC || IsSigAlgoECDSA(algoOID) #endif + #ifdef WOLFSSL_SM2 + || (algoOID == SM2k) + #endif #ifdef HAVE_ED25519 || (algoOID == ED25519k) #endif @@ -14732,7 +15993,6 @@ #ifdef HAVE_CURVE448 || (algoOID == X448k) #endif - #ifdef HAVE_PQC #ifdef HAVE_FACON || (algoOID == FALCON_LEVEL1k) || (algoOID == FALCON_LEVEL5k) @@ -14750,7 +16010,6 @@ || (algoOID == SPHINCS_SMALL_LEVEL3k) || (algoOID == SPHINCS_SMALL_LEVEL5k) #endif - #endif /* HAVE_PQC */ ); } @@ -14929,7 +16188,7 @@ #else DECL_ASNSETDATA(dataASN, digestInfoASN_Length); int ret = 0; - int sz; + int sz = 0; unsigned char dgst[WC_MAX_DIGEST_SIZE]; CALLOC_ASNSETDATA(dataASN, digestInfoASN_Length, ret, NULL); @@ -15038,6 +16297,9 @@ #endif #ifdef HAVE_ECC case ECDSAk: + #ifdef WOLFSSL_SM2 + case SM2k: + #endif #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \ defined(WC_ASYNC_ENABLE_ECC) if (sigCtx->key.ecc->nb_ctx != NULL) { @@ -15065,7 +16327,6 @@ sigCtx->key.ed448 = NULL; break; #endif /* HAVE_ED448 */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case FALCON_LEVEL1k: case FALCON_LEVEL5k: @@ -15098,7 +16359,6 @@ sigCtx->key.sphincs = NULL; break; #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ default: break; } /* switch (keyOID) */ @@ -15222,6 +16482,14 @@ break; #endif #endif + #if defined(WOLFSSL_SM2) & defined(WOLFSSL_SM3) + case CTC_SM3wSM2: + if ((ret = wc_Sm3Hash(buf, bufSz, digest)) == 0) { + *typeH = SM3h; + *digestSz = WC_SM3_DIGEST_SIZE; + } + break; + #endif #ifdef HAVE_ED25519 case CTC_ED25519: /* Hashes done in signing operation. @@ -15236,7 +16504,6 @@ */ break; #endif - #ifdef HAVE_PQC #ifdef HAVE_FALCON case CTC_FALCON_LEVEL1: case CTC_FALCON_LEVEL5: @@ -15260,7 +16527,6 @@ /* Hashes done in signing operation. */ break; #endif - #endif /* HAVE_PQC */ default: ret = HASH_TYPE_E; @@ -15288,7 +16554,7 @@ byte* rsaKeyIdx) { int ret = 0; -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) CertAttribute* certatt = NULL; #endif @@ -15306,7 +16572,7 @@ WOLFSSL_ENTER("ConfirmSignature"); -#if !defined(WOLFSSL_RENESAS_TSIP_TLS) && !defined(WOLFSSL_RENESAS_SCEPROTECT) +#if !defined(WOLFSSL_RENESAS_TSIP_TLS) && !defined(WOLFSSL_RENESAS_FSPSM_TLS) (void)rsaKeyIdx; #else #if !defined(NO_RSA) || defined(HAVE_ECC) @@ -15365,6 +16631,12 @@ } else #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (sigOID == CTC_SM3wSM2) { + ; /* SM2 hash requires public key. Done later. */ + } + else + #endif { ret = HashForSignature(buf, bufSz, sigOID, sigCtx->digest, &sigCtx->typeH, &sigCtx->digestSz, 1); @@ -15432,15 +16704,18 @@ } sigCtx->key.dsa = (DsaKey*)XMALLOC(sizeof(DsaKey), sigCtx->heap, DYNAMIC_TYPE_DSA); - sigCtx->sigCpy = (byte*)XMALLOC(sigSz, - sigCtx->heap, DYNAMIC_TYPE_SIGNATURE); - if (sigCtx->key.dsa == NULL || sigCtx->sigCpy == NULL) { + if (sigCtx->key.dsa == NULL) { ERROR_OUT(MEMORY_E, exit_cs); } if ((ret = wc_InitDsaKey_h(sigCtx->key.dsa, sigCtx->heap)) != 0) { WOLFSSL_MSG("wc_InitDsaKey_h error"); goto exit_cs; } + sigCtx->sigCpy = (byte*)XMALLOC(sigSz, + sigCtx->heap, DYNAMIC_TYPE_SIGNATURE); + if (sigCtx->sigCpy == NULL) { + ERROR_OUT(MEMORY_E, exit_cs); + } if ((ret = wc_DsaPublicKeyDecode(key, &idx, sigCtx->key.dsa, keySz)) != 0) { WOLFSSL_MSG("ASN Key decode error DSA"); @@ -15530,6 +16805,9 @@ } #endif /* !NO_DSA && !HAVE_SELFTEST */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + #endif case ECDSAk: { word32 idx = 0; @@ -15628,10 +16906,10 @@ break; } #endif - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case FALCON_LEVEL1k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.falcon = (falcon_key*)XMALLOC(sizeof(falcon_key), @@ -15640,15 +16918,16 @@ if (sigCtx->key.falcon == NULL) { ERROR_OUT(MEMORY_E, exit_cs); } - if ((ret = wc_falcon_init(sigCtx->key.falcon)) < 0) { + if ((ret = wc_falcon_init_ex(sigCtx->key.falcon, + sigCtx->heap, sigCtx->devId)) < 0) { goto exit_cs; } if ((ret = wc_falcon_set_level(sigCtx->key.falcon, 1)) < 0) { goto exit_cs; } - if ((ret = wc_falcon_import_public(key, keySz, - sigCtx->key.falcon)) < 0) { + if ((ret = wc_Falcon_PublicKeyDecode(key, &idx, + sigCtx->key.falcon, keySz)) < 0) { WOLFSSL_MSG("ASN Key import error Falcon Level 1"); WOLFSSL_ERROR_VERBOSE(ret); goto exit_cs; @@ -15657,6 +16936,7 @@ } case FALCON_LEVEL5k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.falcon = (falcon_key*)XMALLOC(sizeof(falcon_key), @@ -15665,15 +16945,16 @@ if (sigCtx->key.falcon == NULL) { ERROR_OUT(MEMORY_E, exit_cs); } - if ((ret = wc_falcon_init(sigCtx->key.falcon)) < 0) { + if ((ret = wc_falcon_init_ex(sigCtx->key.falcon, + sigCtx->heap, sigCtx->devId)) < 0) { goto exit_cs; } if ((ret = wc_falcon_set_level(sigCtx->key.falcon, 5)) < 0) { goto exit_cs; } - if ((ret = wc_falcon_import_public(key, keySz, - sigCtx->key.falcon)) < 0) { + if ((ret = wc_Falcon_PublicKeyDecode(key, &idx, + sigCtx->key.falcon, keySz)) < 0) { WOLFSSL_MSG("ASN Key import error Falcon Level 5"); WOLFSSL_ERROR_VERBOSE(ret); goto exit_cs; @@ -15681,9 +16962,12 @@ break; } #endif /* HAVE_FALCON */ - #if defined(HAVE_DILITHIUM) + #if defined(HAVE_DILITHIUM) && \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_NO_ASN1) case DILITHIUM_LEVEL2k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.dilithium = (dilithium_key*)XMALLOC(sizeof(dilithium_key), @@ -15692,7 +16976,8 @@ if (sigCtx->key.dilithium == NULL) { ERROR_OUT(MEMORY_E, exit_cs); } - if ((ret = wc_dilithium_init(sigCtx->key.dilithium)) < 0) { + if ((ret = wc_dilithium_init_ex(sigCtx->key.dilithium, + sigCtx->heap, sigCtx->devId)) < 0) { goto exit_cs; } if ((ret = wc_dilithium_set_level( @@ -15700,8 +16985,8 @@ < 0) { goto exit_cs; } - if ((ret = wc_dilithium_import_public(key, keySz, - sigCtx->key.dilithium)) < 0) { + if ((ret = wc_Dilithium_PublicKeyDecode(key, &idx, + sigCtx->key.dilithium, keySz)) < 0) { WOLFSSL_MSG("ASN Key import error Dilithium Level 2"); goto exit_cs; } @@ -15709,6 +16994,7 @@ } case DILITHIUM_LEVEL3k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.dilithium = (dilithium_key*)XMALLOC(sizeof(dilithium_key), @@ -15717,7 +17003,8 @@ if (sigCtx->key.dilithium == NULL) { ERROR_OUT(MEMORY_E, exit_cs); } - if ((ret = wc_dilithium_init(sigCtx->key.dilithium)) < 0) { + if ((ret = wc_dilithium_init_ex(sigCtx->key.dilithium, + sigCtx->heap, sigCtx->devId)) < 0) { goto exit_cs; } if ((ret = wc_dilithium_set_level( @@ -15725,15 +17012,16 @@ < 0) { goto exit_cs; } - if ((ret = wc_dilithium_import_public(key, keySz, - sigCtx->key.dilithium)) < 0) { - WOLFSSL_MSG("ASN Key import error Dilithium Level 5"); + if ((ret = wc_Dilithium_PublicKeyDecode(key, &idx, + sigCtx->key.dilithium, keySz)) < 0) { + WOLFSSL_MSG("ASN Key import error Dilithium Level 3"); goto exit_cs; } break; } case DILITHIUM_LEVEL5k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.dilithium = (dilithium_key*)XMALLOC(sizeof(dilithium_key), @@ -15742,7 +17030,8 @@ if (sigCtx->key.dilithium == NULL) { ERROR_OUT(MEMORY_E, exit_cs); } - if ((ret = wc_dilithium_init(sigCtx->key.dilithium)) < 0) { + if ((ret = wc_dilithium_init_ex(sigCtx->key.dilithium, + sigCtx->heap, sigCtx->devId)) < 0) { goto exit_cs; } if ((ret = wc_dilithium_set_level( @@ -15750,8 +17039,8 @@ < 0) { goto exit_cs; } - if ((ret = wc_dilithium_import_public(key, keySz, - sigCtx->key.dilithium)) < 0) { + if ((ret = wc_Dilithium_PublicKeyDecode(key, &idx, + sigCtx->key.dilithium, keySz)) < 0) { WOLFSSL_MSG("ASN Key import error Dilithium Level 5"); goto exit_cs; } @@ -15761,6 +17050,7 @@ #if defined(HAVE_SPHINCS) case SPHINCS_FAST_LEVEL1k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.sphincs = (sphincs_key*)XMALLOC(sizeof(sphincs_key), @@ -15777,8 +17067,8 @@ < 0) { goto exit_cs; } - if ((ret = wc_sphincs_import_public(key, keySz, - sigCtx->key.sphincs)) < 0) { + if ((ret = wc_Sphincs_PublicKeyDecode(key, &idx, + sigCtx->key.sphincs, keySz)) < 0) { WOLFSSL_MSG("ASN Key import err: Sphincs-fast Level1"); goto exit_cs; } @@ -15786,6 +17076,7 @@ } case SPHINCS_FAST_LEVEL3k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.sphincs = (sphincs_key*)XMALLOC(sizeof(sphincs_key), @@ -15802,8 +17093,8 @@ < 0) { goto exit_cs; } - if ((ret = wc_sphincs_import_public(key, keySz, - sigCtx->key.sphincs)) < 0) { + if ((ret = wc_Sphincs_PublicKeyDecode(key, &idx, + sigCtx->key.sphincs, keySz)) < 0) { WOLFSSL_MSG("ASN Key import err: Sphincs-fast Level3"); goto exit_cs; } @@ -15811,6 +17102,7 @@ } case SPHINCS_FAST_LEVEL5k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.sphincs = (sphincs_key*)XMALLOC(sizeof(sphincs_key), @@ -15827,16 +17119,16 @@ < 0) { goto exit_cs; } - if ((ret = wc_sphincs_import_public(key, keySz, - sigCtx->key.sphincs)) < 0) { + if ((ret = wc_Sphincs_PublicKeyDecode(key, &idx, + sigCtx->key.sphincs, keySz)) < 0) { WOLFSSL_MSG("ASN Key import err: Sphincs-fast Level5"); goto exit_cs; } break; } - case SPHINCS_SMALL_LEVEL1k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.sphincs = (sphincs_key*)XMALLOC(sizeof(sphincs_key), @@ -15853,8 +17145,8 @@ < 0) { goto exit_cs; } - if ((ret = wc_sphincs_import_public(key, keySz, - sigCtx->key.sphincs)) < 0) { + if ((ret = wc_Sphincs_PublicKeyDecode(key, &idx, + sigCtx->key.sphincs, keySz)) < 0) { WOLFSSL_MSG("ASN Key import err: Sphincs-fast Level1"); goto exit_cs; } @@ -15862,6 +17154,7 @@ } case SPHINCS_SMALL_LEVEL3k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.sphincs = (sphincs_key*)XMALLOC(sizeof(sphincs_key), @@ -15878,8 +17171,8 @@ < 0) { goto exit_cs; } - if ((ret = wc_sphincs_import_public(key, keySz, - sigCtx->key.sphincs)) < 0) { + if ((ret = wc_Sphincs_PublicKeyDecode(key, &idx, + sigCtx->key.sphincs, keySz)) < 0) { WOLFSSL_MSG("ASN Key import err: Sphincs-fast Level3"); goto exit_cs; } @@ -15887,6 +17180,7 @@ } case SPHINCS_SMALL_LEVEL5k: { + word32 idx = 0; sigCtx->verify = 0; sigCtx->key.sphincs = (sphincs_key*)XMALLOC(sizeof(sphincs_key), @@ -15903,15 +17197,14 @@ < 0) { goto exit_cs; } - if ((ret = wc_sphincs_import_public(key, keySz, - sigCtx->key.sphincs)) < 0) { + if ((ret = wc_Sphincs_PublicKeyDecode(key, &idx, + sigCtx->key.sphincs, keySz)) < 0) { WOLFSSL_MSG("ASN Key import err: Sphincs-fast Level5"); goto exit_cs; } break; } #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ default: WOLFSSL_MSG("Verify Key type unknown"); ret = ASN_UNKNOWN_OID_E; @@ -15959,12 +17252,13 @@ key, keySz, sigCtx->pkCtxRsa); } - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) else #else - if (!sigCtx->pkCbRsa || ret == CRYPTOCB_UNAVAILABLE) - #endif /* WOLFSSL_RENESAS_SCEPROTECT */ + if (!sigCtx->pkCbRsa || + ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + #endif /* WOLFSSL_RENESAS_FSPSM_TLS */ #endif /* HAVE_PK_CALLBACKS */ { ret = wc_RsaSSL_VerifyInline(sigCtx->sigCpy, sigSz, @@ -15981,9 +17275,50 @@ break; } #endif /* !NO_DSA && !HAVE_SELFTEST */ + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + { + /* OpenSSL creates signature without CERT_SIG_ID. */ + ret = wc_ecc_sm2_create_digest(CERT_SIG_ID, 0, buf, bufSz, + WC_HASH_TYPE_SM3, sigCtx->digest, WC_SM3_DIGEST_SIZE, + sigCtx->key.ecc); + if (ret == 0) { + sigCtx->typeH = SM3h; + sigCtx->digestSz = WC_SM3_DIGEST_SIZE; + } + else { + WOLFSSL_MSG("SM2wSM3 create digest failed"); + WOLFSSL_ERROR_VERBOSE(ret); + goto exit_cs; + } + ret = wc_ecc_sm2_verify_hash(sig, sigSz, sigCtx->digest, + sigCtx->digestSz, &sigCtx->verify, sigCtx->key.ecc); + break; + } + #endif #if defined(HAVE_ECC) && defined(HAVE_ECC_VERIFY) case ECDSAk: { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (sigOID == CTC_SM3wSM2) { + ret = wc_ecc_sm2_create_digest(CERT_SIG_ID, + CERT_SIG_ID_SZ, buf, bufSz, WC_HASH_TYPE_SM3, + sigCtx->digest, WC_SM3_DIGEST_SIZE, + sigCtx->key.ecc); + if (ret == 0) { + sigCtx->typeH = SM3h; + sigCtx->digestSz = WC_SM3_DIGEST_SIZE; + } + else { + WOLFSSL_MSG("SM2wSM3 create digest failed"); + WOLFSSL_ERROR_VERBOSE(ret); + goto exit_cs; + } + ret = wc_ecc_sm2_verify_hash(sig, sigSz, sigCtx->digest, + sigCtx->digestSz, &sigCtx->verify, sigCtx->key.ecc); + } + else + #endif #if defined(HAVE_PK_CALLBACKS) if (sigCtx->pkCbEcc) { ret = sigCtx->pkCbEcc( @@ -15992,12 +17327,13 @@ key, keySz, &sigCtx->verify, sigCtx->pkCtxEcc); } - #if !defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ !defined(WOLFSSL_RENESAS_TSIP_TLS) else #else - if (!sigCtx->pkCbEcc || ret == CRYPTOCB_UNAVAILABLE) - #endif /* WOLFSSL_RENESAS_SCEPROTECT */ + if (!sigCtx->pkCbEcc || + ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + #endif /* WOLFSSL_RENESAS_FSPSM_TLS */ #endif /* HAVE_PK_CALLBACKS */ { ret = wc_ecc_verify_hash(sig, sigSz, sigCtx->digest, @@ -16024,7 +17360,6 @@ break; } #endif - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) case FALCON_LEVEL1k: case FALCON_LEVEL5k: @@ -16035,7 +17370,7 @@ break; } #endif /* HAVE_FALCON */ - #if defined(HAVE_DILITHIUM) + #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_VERIFY) case DILITHIUM_LEVEL2k: case DILITHIUM_LEVEL3k: case DILITHIUM_LEVEL5k: @@ -16060,13 +17395,12 @@ break; } #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ default: break; } /* switch (keyOID) */ #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { goto exit_cs; } #endif @@ -16118,7 +17452,7 @@ { int encodedSigSz, verifySz; #if defined(WOLFSSL_RENESAS_TSIP_TLS) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT) + defined(WOLFSSL_RENESAS_FSPSM_TLS) if (sigCtx->CertAtt.verifyByTSIP_SCE == 1) break; #endif #ifdef WOLFSSL_SMALL_STACK @@ -16169,6 +17503,9 @@ } #endif /* !NO_DSA && !HAVE_SELFTEST */ #ifdef HAVE_ECC + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + case SM2k: + #endif case ECDSAk: { if (sigCtx->verify == 1) { @@ -16210,7 +17547,6 @@ break; } #endif /* HAVE_ED448 */ - #ifdef HAVE_PQC #ifdef HAVE_FALCON case FALCON_LEVEL1k: { @@ -16340,7 +17676,6 @@ break; } #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ default: break; } /* switch (keyOID) */ @@ -16362,7 +17697,7 @@ WOLFSSL_LEAVE("ConfirmSignature", ret); #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) return ret; #endif @@ -16371,6 +17706,41 @@ return ret; } +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wc_ConfirmAltSignature( + const byte* buf, word32 bufSz, + const byte* key, word32 keySz, word32 keyOID, + const byte* sig, word32 sigSz, word32 sigOID, + void *heap) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + SignatureCtx* sigCtx = (SignatureCtx*)XMALLOC(sizeof(*sigCtx), heap, + DYNAMIC_TYPE_SIGNATURE); + if (sigCtx == NULL) { + ret = MEMORY_E; + } +#else + SignatureCtx sigCtx[1]; + (void)heap; +#endif + + if (ret == 0) { + InitSignatureCtx(sigCtx, heap, INVALID_DEVID); + + ret = ConfirmSignature(sigCtx, buf, bufSz, key, keySz, + keyOID, sig, sigSz, sigOID, NULL, 0, NULL); + + FreeSignatureCtx(sigCtx); + } + +#ifdef WOLFSSL_SMALL_STACK + if (sigCtx != NULL) + XFREE(sigCtx, heap, DYNAMIC_TYPE_SIGNATURE); +#endif + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #ifndef IGNORE_NAME_CONSTRAINTS @@ -16437,9 +17807,11 @@ } while (nameSz > 0) { - if (XTOLOWER((unsigned char)*name++) != - XTOLOWER((unsigned char)*base++)) + if (XTOLOWER((unsigned char)*name) != + XTOLOWER((unsigned char)*base)) return 0; + name++; + base++; nameSz--; } @@ -16533,7 +17905,7 @@ name = cert->altNames; break; case ASN_RFC822_TYPE: - /* Shouldn't it validade E= in subject as well? */ + /* Shouldn't it validate E= in subject as well? */ name = cert->altEmailNames; /* Add subject email for checking. */ @@ -16917,10 +18289,21 @@ ret = SetDNSEntry(cert, (const char*)(input + idx), len, ASN_IP_TYPE, &cert->altNames); if (ret == 0) { - idx += len; + idx += (word32)len; } } #endif /* WOLFSSL_QT || OPENSSL_ALL */ + + #ifdef OPENSSL_ALL + /* GeneralName choice: registeredID */ + else if (tag == (ASN_CONTEXT_SPECIFIC | ASN_RID_TYPE)) { + ret = SetDNSEntry(cert, (const char*)(input + idx), len, + ASN_RID_TYPE, &cert->altNames); + if (ret == 0) { + idx += (word32)len; + } + } + #endif #endif /* IGNORE_NAME_CONSTRAINTS */ #if defined(WOLFSSL_SEP) || defined(WOLFSSL_FPKI) /* GeneralName choice: otherName */ @@ -16929,8 +18312,7 @@ ret = DecodeOtherName(cert, input, &idx, idx + (word32)len); } #endif - /* GeneralName choice: dNSName, x400Address, ediPartyName, - * registeredID */ + /* GeneralName choice: dNSName, x400Address, ediPartyName */ else { WOLFSSL_MSG("\tUnsupported name type, skipping"); idx += (word32)len; @@ -17440,7 +18822,55 @@ length -= strLen; idx += (word32)strLen; } -#endif /* WOLFSSL_QT || OPENSSL_ALL */ +#endif /* WOLFSSL_QT || OPENSSL_ALL || WOLFSSL_IP_ALT_NAME */ +#if defined(OPENSSL_ALL) + else if (current_byte == (ASN_CONTEXT_SPECIFIC | ASN_RID_TYPE)) { + DNS_entry* rid; + int strLen; + word32 lenStartIdx = idx; + WOLFSSL_MSG("Decoding Subject Alt. Name: Registered Id"); + + if (GetLength(input, &idx, &strLen, sz) < 0) { + WOLFSSL_MSG("\tfail: str length"); + return ASN_PARSE_E; + } + length -= (idx - lenStartIdx); + /* check that strLen at index is not past input buffer */ + if (strLen + idx > sz) { + return BUFFER_E; + } + + rid = AltNameNew(cert->heap); + if (rid == NULL) { + WOLFSSL_MSG("\tOut of Memory"); + return MEMORY_E; + } + + rid->type = ASN_RID_TYPE; + rid->name = (char*)XMALLOC((size_t)strLen + 1, cert->heap, + DYNAMIC_TYPE_ALTNAME); + if (rid->name == NULL) { + WOLFSSL_MSG("\tOut of Memory"); + XFREE(rid, cert->heap, DYNAMIC_TYPE_ALTNAME); + return MEMORY_E; + } + rid->len = strLen; + XMEMCPY(rid->name, &input[idx], strLen); + rid->name[strLen] = '\0'; + + if (GenerateDNSEntryRIDString(rid, cert->heap) != 0) { + WOLFSSL_MSG("\tOut of Memory for registered Id string"); + XFREE(rid->name, cert->heap, DYNAMIC_TYPE_ALTNAME); + XFREE(rid, cert->heap, DYNAMIC_TYPE_ALTNAME); + return MEMORY_E; + } + + AddAltName(cert, rid); + + length -= strLen; + idx += (word32)strLen; + } +#endif /* OPENSSL_ALL */ #endif /* IGNORE_NAME_CONSTRAINTS */ else if (current_byte == (ASN_CONTEXT_SPECIFIC | ASN_CONSTRUCTED | ASN_OTHER_TYPE)) { @@ -17516,6 +18946,7 @@ word32 idx = 0; int length = 0; int ret = 0; + word32 numNames = 0; WOLFSSL_ENTER("DecodeAltNames"); @@ -17548,6 +18979,13 @@ while ((ret == 0) && (idx < sz)) { ASNGetData dataASN[altNameASN_Length]; + numNames++; + if (numNames > WOLFSSL_MAX_ALT_NAMES) { + WOLFSSL_MSG("\tToo many subject alternative names"); + ret = ASN_ALT_NAME_E; + break; + } + /* Clear dynamic data items. */ XMEMSET(dataASN, 0, sizeof(dataASN)); /* Parse GeneralName with the choices supported. */ @@ -17566,7 +19004,7 @@ } #ifdef WOLFSSL_ASN_TEMPLATE -/* ASN.1 template for BasicContraints. +/* ASN.1 template for BasicConstraints. * X.509: RFC 5280, 4.2.1.9 - BasicConstraints. */ static const ASNItem basicConsASN[] = { @@ -17653,7 +19091,7 @@ word32 idx = 0; byte isCA = 0; - WOLFSSL_ENTER("DecodeBasicCaConstraints"); + WOLFSSL_ENTER("DecodeBasicCaConstraint"); CALLOC_ASNGETDATA(dataASN, basicConsASN_Length, ret, cert->heap); @@ -17670,15 +19108,22 @@ if ((ret == 0) && (dataASN[BASICCONSASN_IDX_SEQ].length != 0)) { /* Bad encoding when CA Boolean is false * (default when not present). */ +#if !defined(ASN_TEMPLATE_SKIP_ISCA_CHECK) && \ + !defined(WOLFSSL_ALLOW_ENCODING_CA_FALSE) if ((dataASN[BASICCONSASN_IDX_CA].length != 0) && (!isCA)) { WOLFSSL_ERROR_VERBOSE(ASN_PARSE_E); ret = ASN_PARSE_E; } +#endif /* Path length must be a 7-bit value. */ if ((ret == 0) && (cert->pathLength >= (1 << 7))) { WOLFSSL_ERROR_VERBOSE(ASN_PARSE_E); ret = ASN_PARSE_E; } + if ((ret == 0) && cert->pathLength > WOLFSSL_MAX_PATH_LEN) { + WOLFSSL_ERROR_VERBOSE(ASN_PATHLEN_SIZE_E); + ret = ASN_PATHLEN_SIZE_E; + } /* Store CA boolean and whether a path length was seen. */ if (ret == 0) { /* isCA in certificate is a 1 bit of a byte. */ @@ -17918,7 +19363,7 @@ if (ret == 0) { /* Get the GeneralName choice */ GetASN_Choice(&dataASN[CRLDISTASN_IDX_DP_DISTPOINT_FN_GN], generalNameChoice); - /* Parse CRL distribtion point. */ + /* Parse CRL distribution point. */ ret = GetASN_Items(crlDistASN, dataASN, crlDistASN_Length, 0, input, &idx, sz); } @@ -17999,7 +19444,6 @@ #ifndef WOLFSSL_ASN_TEMPLATE word32 idx = 0; int length = 0; - int count = 0; byte b = 0; word32 oid; @@ -18009,7 +19453,7 @@ if (GetSequence(input, &idx, &length, sz) < 0) return ASN_PARSE_E; - while ((idx < (word32)sz) && (count < MAX_AIA_SZ)) { + while ((idx < (word32)sz)) { /* Unwrap a single AIA */ if (GetSequence(input, &idx, &length, sz) < 0) return ASN_PARSE_E; @@ -18027,23 +19471,22 @@ return ASN_PARSE_E; /* Set ocsp entry */ - if (b == GENERALNAME_URI && oid == AIA_OCSP_OID) + if (b == GENERALNAME_URI && oid == AIA_OCSP_OID && + cert->extAuthInfo == NULL) { cert->extAuthInfoSz = length; cert->extAuthInfo = input + idx; - #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - count++; - #else + #if !defined(OPENSSL_ALL) && !defined(WOLFSSL_QT) break; #endif } #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) /* Set CaIssuers entry */ - else if ((b == GENERALNAME_URI) && oid == AIA_CA_ISSUER_OID) + else if ((b == GENERALNAME_URI) && oid == AIA_CA_ISSUER_OID && + cert->extAuthInfoCaIssuer == NULL) { cert->extAuthInfoCaIssuerSz = length; cert->extAuthInfoCaIssuer = input + idx; - count++; } #endif idx += (word32)length; @@ -18053,7 +19496,6 @@ #else word32 idx = 0; int length = 0; - int count = 0; int ret = 0; WOLFSSL_ENTER("DecodeAuthInfo"); @@ -18063,7 +19505,7 @@ ret = ASN_PARSE_E; } - while ((ret == 0) && (idx < (word32)sz) && (count < MAX_AIA_SZ)) { + while ((ret == 0) && (idx < (word32)sz)) { ASNGetData dataASN[accessDescASN_Length]; /* Clear dynamic data and retrieve OID and name. */ @@ -18078,14 +19520,13 @@ /* Check we have OCSP and URI. */ if ((dataASN[ACCESSDESCASN_IDX_METH].data.oid.sum == AIA_OCSP_OID) && - (dataASN[ACCESSDESCASN_IDX_LOC].tag == GENERALNAME_URI)) { + (dataASN[ACCESSDESCASN_IDX_LOC].tag == GENERALNAME_URI) && + (cert->extAuthInfo == NULL)) { /* Store URI for OCSP lookup. */ GetASN_GetConstRef(&dataASN[ACCESSDESCASN_IDX_LOC], &cert->extAuthInfo, &sz32); cert->extAuthInfoSz = (int)sz32; - #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) - count++; - #else + #if !defined(OPENSSL_ALL) && !defined(WOLFSSL_QT) break; #endif } @@ -18093,12 +19534,12 @@ /* Check we have CA Issuer and URI. */ else if ((dataASN[ACCESSDESCASN_IDX_METH].data.oid.sum == AIA_CA_ISSUER_OID) && - (dataASN[ACCESSDESCASN_IDX_LOC].tag == GENERALNAME_URI)) { + (dataASN[ACCESSDESCASN_IDX_LOC].tag == GENERALNAME_URI) && + (cert->extAuthInfoCaIssuer == NULL)) { /* Set CaIssuers entry */ GetASN_GetConstRef(&dataASN[ACCESSDESCASN_IDX_LOC], &cert->extAuthInfoCaIssuer, &sz32); - cert->extAuthInfoCaIssuerSz = sz32; - count++; + cert->extAuthInfoCaIssuerSz = (int)sz32; } #endif /* Otherwise skip. */ @@ -18134,9 +19575,9 @@ #define authKeyIdASN_Length (sizeof(authKeyIdASN) / sizeof(ASNItem)) #endif -/* Decode authority information access extension in a certificate. +/* Decode authority key identifier extension in a certificate. * - * X.509: RFC 5280, 4.2.2.1 - Authority Information Access. + * X.509: RFC 5280, 4.2.1.1 - Authority Key Identifier. * * @param [in] input Buffer holding data. * @param [in] sz Size of data in buffer. @@ -18185,11 +19626,11 @@ cert->extAuthKeyIdSz = length; #endif /* OPENSSL_EXTRA */ - return GetHashId(input + idx, length, cert->extAuthKeyId); + return GetHashId(input + idx, length, cert->extAuthKeyId, + HashIdAlg(cert->signatureOID)); #else DECL_ASNGETDATA(dataASN, authKeyIdASN_Length); int ret = 0; - word32 idx = 0; WOLFSSL_ENTER("DecodeAuthKeyId"); @@ -18197,31 +19638,59 @@ if (ret == 0) { /* Parse an authority key identifier. */ + word32 idx = 0; ret = GetASN_Items(authKeyIdASN, dataASN, authKeyIdASN_Length, 1, input, &idx, sz); } - if (ret == 0) { - /* Key id is optional. */ - if (dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.data == NULL) { - WOLFSSL_MSG("\tinfo: OPTIONAL item 0, not available"); - } - else { + /* Each field is optional */ + if (ret == 0 && dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.data != NULL) { #ifdef OPENSSL_EXTRA - /* Store the authority key id. */ -#ifdef WOLFSSL_AKID_NAME - cert->extRawAuthKeyIdSrc = input; - cert->extRawAuthKeyIdSz = sz; -#endif - GetASN_GetConstRef(&dataASN[AUTHKEYIDASN_IDX_KEYID], &cert->extAuthKeyIdSrc, - &cert->extAuthKeyIdSz); + GetASN_GetConstRef(&dataASN[AUTHKEYIDASN_IDX_KEYID], + &cert->extAuthKeyIdSrc, &cert->extAuthKeyIdSz); #endif /* OPENSSL_EXTRA */ + /* Get the hash or hash of the hash if wrong size. */ + ret = GetHashId(dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.data, + (int)dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.length, + cert->extAuthKeyId, HashIdAlg(cert->signatureOID)); + } +#ifdef WOLFSSL_AKID_NAME + if (ret == 0 && dataASN[AUTHKEYIDASN_IDX_ISSUER].data.ref.data != NULL) { + /* We only support using one (first) name. Parse the name to perform + * a sanity check. */ + word32 idx = 0; + ASNGetData nameASN[altNameASN_Length]; + XMEMSET(nameASN, 0, sizeof(nameASN)); + /* Parse GeneralName with the choices supported. */ + GetASN_Choice(&nameASN[ALTNAMEASN_IDX_GN], generalNameChoice); + /* Decode a GeneralName choice. */ + ret = GetASN_Items(altNameASN, nameASN, altNameASN_Length, 0, + dataASN[AUTHKEYIDASN_IDX_ISSUER].data.ref.data, &idx, + dataASN[AUTHKEYIDASN_IDX_ISSUER].data.ref.length); - /* Get the hash or hash of the hash if wrong size. */ - ret = GetHashId(dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.data, - (int)dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.length, - cert->extAuthKeyId); + if (ret == 0) { + GetASN_GetConstRef(&nameASN[ALTNAMEASN_IDX_GN], + &cert->extAuthKeyIdIssuer, &cert->extAuthKeyIdIssuerSz); } } + if (ret == 0 && dataASN[AUTHKEYIDASN_IDX_SERIAL].data.ref.data != NULL) { + GetASN_GetConstRef(&dataASN[AUTHKEYIDASN_IDX_SERIAL], + &cert->extAuthKeyIdIssuerSN, &cert->extAuthKeyIdIssuerSNSz); + } + if (ret == 0) { + if ((cert->extAuthKeyIdIssuerSz > 0) ^ + (cert->extAuthKeyIdIssuerSNSz > 0)) { + WOLFSSL_MSG("authorityCertIssuer and authorityCertSerialNumber MUST" + " both be present or both be absent"); + } + } +#endif /* WOLFSSL_AKID_NAME */ + if (ret == 0) { +#if defined(OPENSSL_EXTRA) && defined(WOLFSSL_AKID_NAME) + /* Store the raw authority key id. */ + cert->extRawAuthKeyIdSrc = input; + cert->extRawAuthKeyIdSz = sz; +#endif /* OPENSSL_EXTRA */ + } FREE_ASNGETDATA(dataASN, cert->heap); return ret; @@ -18230,7 +19699,7 @@ /* Decode subject key id extension in a certificate. * - * X.509: RFC 5280, 4.2.2.1 - Authority Information Access. + * X.509: RFC 5280, 4.2.1.2 - Subject Key Identifier. * * @param [in] input Buffer holding data. * @param [in] sz Size of data in buffer. @@ -18252,11 +19721,12 @@ if (ret > 0) { #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) cert->extSubjKeyIdSrc = &input[idx]; - cert->extSubjKeyIdSz = length; + cert->extSubjKeyIdSz = (word32)length; #endif /* OPENSSL_EXTRA */ /* Get the hash or hash of the hash if wrong size. */ - ret = GetHashId(input + idx, length, cert->extSubjKeyId); + ret = GetHashId(input + idx, length, cert->extSubjKeyId, + HashIdAlg(cert->signatureOID)); } return ret; @@ -18279,7 +19749,7 @@ /* Decode key usage extension in a certificate. * - * X.509: RFC 5280, 4.2.2.1 - Authority Information Access. + * X.509: RFC 5280, 4.2.1.3 - Key Usage. * * @param [in] input Buffer holding data. * @param [in] sz Size of data in buffer. @@ -18313,14 +19783,25 @@ #else ASNGetData dataASN[keyUsageASN_Length]; word32 idx = 0; + byte keyUsage[2]; + word32 keyUsageSz = sizeof(keyUsage); + int ret; WOLFSSL_ENTER("DecodeKeyUsage"); /* Clear dynamic data and set where to store extended key usage. */ XMEMSET(dataASN, 0, sizeof(dataASN)); - GetASN_Int16Bit(&dataASN[KEYUSAGEASN_IDX_STR], &cert->extKeyUsage); + XMEMSET(keyUsage, 0, sizeof(keyUsage)); + GetASN_Buffer(&dataASN[KEYUSAGEASN_IDX_STR], keyUsage, &keyUsageSz); /* Parse key usage. */ - return GetASN_Items(keyUsageASN, dataASN, keyUsageASN_Length, 0, input, + ret = GetASN_Items(keyUsageASN, dataASN, keyUsageASN_Length, 0, input, &idx, sz); + if (ret == 0) { + /* Decode the bit string number as LE */ + cert->extKeyUsage = (word16)(keyUsage[0]); + if (keyUsageSz == 2) + cert->extKeyUsage |= (word16)(keyUsage[1] << 8); + } + return ret; #endif /* WOLFSSL_ASN_TEMPLATE */ } @@ -18372,7 +19853,7 @@ while (idx < (word32)sz) { ret = GetObjectId(input, &idx, &oid, oidCertKeyUseType, sz); - if (ret == ASN_UNKNOWN_OID_E) + if (ret == WC_NO_ERR_TRACE(ASN_UNKNOWN_OID_E)) continue; else if (ret < 0) return ret; @@ -18437,7 +19918,7 @@ #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) /* Keep reference for WOLFSSL_X509. */ cert->extExtKeyUsageSrc = input + idx; - cert->extExtKeyUsageSz = length; + cert->extExtKeyUsageSz = (word32)length; #endif } @@ -18452,7 +19933,7 @@ ret = GetASN_Items(keyPurposeIdASN, dataASN, keyPurposeIdASN_Length, 0, input, &idx, sz); /* Skip unknown OIDs. */ - if (ret == ASN_UNKNOWN_OID_E) { + if (ret == WC_NO_ERR_TRACE(ASN_UNKNOWN_OID_E)) { ret = 0; } else if (ret == 0) { @@ -18556,7 +20037,7 @@ static int DecodeSubtreeGeneralName(const byte* input, word32 sz, byte tag, Base_entry** head, void* heap) { - Base_entry* entry; + Base_entry* entry = NULL; word32 nameIdx = 0; word32 len = sz; int strLen; @@ -18610,18 +20091,21 @@ /* Decode a subtree of a name constraints in a certificate. * - * X.509: RFC 5280, 4.2.1.10 - Name Contraints. + * X.509: RFC 5280, 4.2.1.10 - Name Constraints. * * @param [in] input Buffer holding data. * @param [in] sz Size of data in buffer. * @param [in, out] head Linked list of subtree names. + * @param [in] limit If > 0, limit on number of tree + * entries to process, exceeding + * is an error. * @param [in] heap Dynamic memory hint. * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. * @return ASN_PARSE_E when SEQUENCE is not found as expected. */ static int DecodeSubtree(const byte* input, word32 sz, Base_entry** head, - void* heap) + word32 limit, void* heap) { #ifndef WOLFSSL_ASN_TEMPLATE word32 idx = 0; @@ -18699,6 +20183,7 @@ DECL_ASNGETDATA(dataASN, subTreeASN_Length); word32 idx = 0; int ret = 0; + word32 cnt = 0; (void)heap; @@ -18708,6 +20193,14 @@ while ((ret == 0) && (idx < (word32)sz)) { byte minVal = 0; byte maxVal = 0; + if (limit > 0) { + cnt++; + if (cnt > limit) { + WOLFSSL_MSG("too many name constraints"); + ret = ASN_NAME_INVALID_E; + break; + } + } /* Clear dynamic data and set choice for GeneralName and location to * store minimum and maximum. @@ -18742,7 +20235,7 @@ #ifdef WOLFSSL_ASN_TEMPLATE /* ASN.1 template for NameConstraints. - * X.509: RFC 5280, 4.2.1.10 - Name Contraints. + * X.509: RFC 5280, 4.2.1.10 - Name Constraints. */ static const ASNItem nameConstraintsASN[] = { /* SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, @@ -18806,7 +20299,7 @@ } if (DecodeSubtree(input + idx, (word32)length, subtree, - cert->heap) < 0) { + WOLFSSL_MAX_NAME_CONSTRAINTS, cert->heap) < 0) { WOLFSSL_MSG("\terror parsing subtree"); return ASN_PARSE_E; } @@ -18833,7 +20326,8 @@ ret = DecodeSubtree( dataASN[NAMECONSTRAINTSASN_IDX_PERMIT].data.ref.data, dataASN[NAMECONSTRAINTSASN_IDX_PERMIT].data.ref.length, - &cert->permittedNames, cert->heap); + &cert->permittedNames, WOLFSSL_MAX_NAME_CONSTRAINTS, + cert->heap); } } if (ret == 0) { @@ -18842,7 +20336,8 @@ ret = DecodeSubtree( dataASN[NAMECONSTRAINTSASN_IDX_EXCLUDE].data.ref.data, dataASN[NAMECONSTRAINTSASN_IDX_EXCLUDE].data.ref.length, - &cert->excludedNames, cert->heap); + &cert->excludedNames, WOLFSSL_MAX_NAME_CONSTRAINTS, + cert->heap); } } @@ -18874,7 +20369,7 @@ w = BUFFER_E; goto exit; } - outIdx += w; + outIdx += (word32)w; val = 0; while (inIdx < inSz && outIdx < outSz) { @@ -18892,7 +20387,7 @@ w = BUFFER_E; goto exit; } - outIdx += w; + outIdx += (word32)w; val = 0; } inIdx++; @@ -19011,7 +20506,7 @@ return ASN_PARSE_E; } #ifndef WOLFSSL_DUP_CERTPOL - /* From RFC 5280 section 4.2.1.3 "A certificate policy OID MUST + /* From RFC 5280 section 4.2.1.4 "A certificate policy OID MUST * NOT appear more than once in a certificate policies * extension". This is a sanity check for duplicates. * extCertPolicies should only have OID values, additional @@ -19120,11 +20615,11 @@ } } #ifndef WOLFSSL_DUP_CERTPOL - /* From RFC 5280 section 4.2.1.3 "A certificate policy OID MUST + /* From RFC 5280 section 4.2.1.4 "A certificate policy OID MUST * NOT appear more than once in a certificate policies * extension". This is a sanity check for duplicates. * extCertPolicies should only have OID values, additional - * qualifiers need to be stored in a seperate array. */ + * qualifiers need to be stored in a separate array. */ for (i = 0; (ret == 0) && (i < cert->extCertPoliciesNb); i++) { if (XMEMCMP(cert->extCertPolicies[i], cert->extCertPolicies[cert->extCertPoliciesNb], @@ -19169,7 +20664,7 @@ SUBJDIRATTRASN_IDX_SET, }; -/* Number of items in ASN.1 template for BasicContraints. */ +/* Number of items in ASN.1 template for BasicConstraints. */ #define subjDirAttrASN_Length (sizeof(subjDirAttrASN) / sizeof(ASNItem)) #endif /* Decode subject directory attributes extension in a certificate. @@ -19183,7 +20678,7 @@ * @return ASN_PARSE_E when BER encoded data does not match ASN.1 items or * is invalid. */ -static int DecodeSubjDirAttr(const byte* input, int sz, DecodedCert* cert) +static int DecodeSubjDirAttr(const byte* input, word32 sz, DecodedCert* cert) { #ifndef WOLFSSL_ASN_TEMPLATE word32 idx = 0; @@ -19280,7 +20775,8 @@ ret = ASN_PARSE_E; } if (ret == 0) { - XMEMCPY(cert->countryOfCitizenship, setData + setIdx, cuLen); + XMEMCPY(cert->countryOfCitizenship, setData + setIdx, + (size_t)cuLen); cert->countryOfCitizenship[COUNTRY_CODE_LEN] = 0; } } @@ -19292,7 +20788,7 @@ #endif /* WOLFSSL_SUBJ_DIR_ATTR */ #ifdef WOLFSSL_SUBJ_INFO_ACC -/* Decode subject infomation access extension in a certificate. +/* Decode subject information access extension in a certificate. * * X.509: RFC 5280, 4.2.2.2 - Subject Information Access. * @@ -19305,7 +20801,7 @@ * is invalid. * @return MEMORY_E on dynamic memory allocation failure. */ -static int DecodeSubjInfoAcc(const byte* input, int sz, DecodedCert* cert) +static int DecodeSubjInfoAcc(const byte* input, word32 sz, DecodedCert* cert) { word32 idx = 0; int length = 0; @@ -19358,11 +20854,11 @@ /* Set caRepo entry */ if (b == GENERALNAME_URI && oid == AIA_CA_REPO_OID) { - cert->extSubjInfoAccCaRepoSz = length; + cert->extSubjInfoAccCaRepoSz = (word32)length; cert->extSubjInfoAccCaRepo = input + idx; break; } - idx += length; + idx += (word32)length; } if (cert->extSubjInfoAccCaRepo == NULL || @@ -19376,6 +20872,161 @@ } #endif /* WOLFSSL_SUBJ_INFO_ACC */ +#ifdef WOLFSSL_DUAL_ALG_CERTS +/* The subject alternative public key is an extension that holds the same thing + * as a subject public key. */ +static const ASNItem subjAltPubKeyInfoASN[] = { + /* subjectPublicKeyInfo SubjectPublicKeyInfo */ +/* ALT_SPUBKEYINFO_SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, + /* algorithm AlgorithmIdentifier */ + /* AlgorithmIdentifier ::= SEQUENCE */ +/* ALT_SPUBKEYINFO_ALGO_SEQ */ { 1, ASN_SEQUENCE, 1, 1, 0 }, + /* Algorithm OBJECT IDENTIFIER */ +/* ALT_SPUBKEYINFO_ALGO_OID */ { 2, ASN_OBJECT_ID, 0, 0, 0 }, + /* parameters ANY defined by algorithm OPTIONAL */ +/* ALT_SPUBKEYINFO_ALGO_NULL */ { 2, ASN_TAG_NULL, 0, 0, 1 }, +/* ALT_SPUBKEYINFO_ALGO_CURVEID */ { 2, ASN_OBJECT_ID, 0, 0, 1 }, +#ifdef WC_RSA_PSS +/* ALT_SPUBKEYINFO_ALGO_P_SEQ */ { 2, ASN_SEQUENCE, 1, 0, 1 }, +#endif + /* subjectPublicKey BIT STRING */ +/* ALT_SPUBKEYINFO_PUBKEY */ { 1, ASN_BIT_STRING, 0, 0, 0 } +}; + +#define subjAltPubKeyInfoASN_Length (sizeof(subjAltPubKeyInfoASN) / \ + sizeof(ASNItem)) + +enum { + ALT_SPUBKEYINFO_SEQ = 0, + ALT_SPUBKEYINFO_ALGO_SEQ, + ALT_SPUBKEYINFO_ALGO_OID, + ALT_SPUBKEYINFO_ALGO_NULL, + ALT_SPUBKEYINFO_ALGO_CURVEID, +#ifdef WC_RSA_PSS + ALT_SPUBKEYINFO_ALGO_P_SEQ, +#endif + ALT_SPUBKEYINFO_PUBKEY +}; + +static int DecodeSubjAltPubKeyInfo(const byte* input, int sz, DecodedCert* cert) +{ + int ret = 0; + word32 idx = 0; + DECL_ASNGETDATA(dataASN, subjAltPubKeyInfoASN_Length); + + WOLFSSL_ENTER("DecodeSubjAltPubKeyInfo"); + + if (ret == 0) { + CALLOC_ASNGETDATA(dataASN, subjAltPubKeyInfoASN_Length, ret, + cert->heap); + (void)cert; + } + + if (ret == 0) { + GetASN_OID(&dataASN[ALT_SPUBKEYINFO_ALGO_OID], oidKeyType); + GetASN_OID(&dataASN[ALT_SPUBKEYINFO_ALGO_CURVEID], oidCurveType); + + ret = GetASN_Items(subjAltPubKeyInfoASN, dataASN, + subjAltPubKeyInfoASN_Length, 1, input, &idx, + (word32)sz); + } + + if (ret == 0) { + /* dataASN[ALT_SPUBKEYINFO_SEQ].data.u8 */ + cert->sapkiDer = (byte *)input; + /* dataASN[ALT_SPUBKEYINFO_SEQ].length */ + cert->sapkiLen = sz; + cert->sapkiOID = dataASN[ALT_SPUBKEYINFO_ALGO_OID].data.oid.sum; + } + + FREE_ASNGETDATA(dataASN, cert->heap); + WOLFSSL_LEAVE("DecodeSubjAltPubKeyInfo", ret); + return ret; +} + +/* The alternative signature algorithm extension holds the same thing as a + * as a signature algorithm identifier. */ +static const ASNItem altSigAlgASN[] = { + /* AltSigAlg AlgorithmIdentifier */ + /* AlgorithmIdentifier ::= SEQUENCE */ +/* ALTSIG_ALGOID_SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, + /* Algorithm OBJECT IDENTIFIER */ +/* ALTSIG_ALGOID_OID */ { 1, ASN_OBJECT_ID, 0, 0, 0 }, + /* parameters ANY defined by algorithm OPTIONAL */ +/* ALTSIG_ALGOID_PARAMS_NULL */ { 1, ASN_TAG_NULL, 0, 0, 1 }, +#ifdef WC_RSA_PSS +/* ALTSIG_ALGOID_PARAMS */ { 1, ASN_SEQUENCE, 1, 0, 1 }, +#endif +}; + +#define altSigAlgASN_Length (sizeof(altSigAlgASN) / sizeof(ASNItem)) + +enum { + ALTSIG_ALGOID_SEQ = 0, + ALTSIG_ALGOID_OID, + ALTSIG_ALGOID_PARAMS_NULL, +#ifdef WC_RSA_PSS + ALTSIG_ALGOID_PARAMS, +#endif +}; + +static int DecodeAltSigAlg(const byte* input, int sz, DecodedCert* cert) +{ + int ret = 0; + word32 idx = 0; + DECL_ASNGETDATA(dataASN, altSigAlgASN_Length); + + WOLFSSL_ENTER("DecodeAltSigAlg"); + + if (ret == 0) { + CALLOC_ASNGETDATA(dataASN, altSigAlgASN_Length, ret, cert->heap); + (void)cert; + } + + if (ret == 0) { + GetASN_OID(&dataASN[ALTSIG_ALGOID_OID], oidSigType); + + ret = GetASN_Items(altSigAlgASN, dataASN, + altSigAlgASN_Length, 1, input, &idx, + (word32)sz); + } + + if (ret == 0) { + cert->altSigAlgDer = dataASN[ALTSIG_ALGOID_SEQ].data.u8; + cert->altSigAlgLen = dataASN[ALTSIG_ALGOID_SEQ].length; + cert->altSigAlgOID = dataASN[ALTSIG_ALGOID_OID].data.oid.sum; + } + + FREE_ASNGETDATA(dataASN, cert->heap); + WOLFSSL_LEAVE("DecodeAltSigAlg", ret); + return ret; +} + +/* The alternative signature value extension holds an ASN.1 bitstring just + * like a traditional signature in the certificate. */ +static int DecodeAltSigVal(const byte* input, int sz, DecodedCert* cert) +{ + (void)cert; + int ret = 0; + word32 idx = 0; + int len = 0; + + WOLFSSL_ENTER("DecodeAltSigVal"); + + if (ret == 0) { + ret = CheckBitString(input, &idx, &len, sz, 1, NULL); + } + + if (ret == 0) { + cert->altSigValDer = (byte *)input + idx; + cert->altSigValLen = len; + } + + WOLFSSL_LEAVE("DecodeAltSigVal", ret); + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + /* Macro to check if bit is set, if not sets and return success. Otherwise returns failure */ /* Macro required here because bit-field operation */ @@ -19457,7 +21108,19 @@ case AUTH_INFO_OID: VERIFY_AND_SET_OID(cert->extAuthInfoSet); cert->extAuthInfoCrit = critical ? 1 : 0; - if (DecodeAuthInfo(input, length, cert) < 0) { + #ifndef WOLFSSL_ALLOW_CRIT_AIA + /* This check is added due to RFC 5280 section 4.2.2.1 + * stating that conforming CA's must mark this extension + * as non-critical. When parsing extensions check that + * certificate was made in compliance with this. */ + if (critical) { + WOLFSSL_MSG("Critical Authority Information Access is not" + "allowed"); + WOLFSSL_MSG("Use macro WOLFSSL_ALLOW_CRIT_AIA if wanted"); + ret = ASN_CRIT_EXT_E; + } + #endif + if ((ret == 0) && (DecodeAuthInfo(input, length, cert) < 0)) { ret = ASN_PARSE_E; } break; @@ -19473,17 +21136,17 @@ case AUTH_KEY_OID: VERIFY_AND_SET_OID(cert->extAuthKeyIdSet); cert->extAuthKeyIdCrit = critical ? 1 : 0; - #ifndef WOLFSSL_ALLOW_CRIT_SKID - /* This check is added due to RFC 5280 section 4.2.1.1 - * stating that conforming CA's must mark this extension - * as non-critical. When parsing extensions check that - * certificate was made in compliance with this. */ - if (critical) { - WOLFSSL_MSG("Critical Auth Key ID is not allowed"); - WOLFSSL_MSG("Use macro WOLFSSL_ALLOW_CRIT_SKID if wanted"); - ret = ASN_CRIT_EXT_E; - } - #endif + #ifndef WOLFSSL_ALLOW_CRIT_AKID + /* This check is added due to RFC 5280 section 4.2.1.1 + * stating that conforming CA's must mark this extension + * as non-critical. When parsing extensions check that + * certificate was made in compliance with this. */ + if (critical) { + WOLFSSL_MSG("Critical Auth Key ID is not allowed"); + WOLFSSL_MSG("Use macro WOLFSSL_ALLOW_CRIT_AKID if wanted"); + ret = ASN_CRIT_EXT_E; + } + #endif if ((ret == 0) && (DecodeAuthKeyId(input, length, cert) < 0)) { ret = ASN_PARSE_E; } @@ -19493,17 +21156,17 @@ case SUBJ_KEY_OID: VERIFY_AND_SET_OID(cert->extSubjKeyIdSet); cert->extSubjKeyIdCrit = critical ? 1 : 0; - #ifndef WOLFSSL_ALLOW_CRIT_SKID - /* This check is added due to RFC 5280 section 4.2.1.2 - * stating that conforming CA's must mark this extension - * as non-critical. When parsing extensions check that - * certificate was made in compliance with this. */ - if (critical) { - WOLFSSL_MSG("Critical Subject Key ID is not allowed"); - WOLFSSL_MSG("Use macro WOLFSSL_ALLOW_CRIT_SKID if wanted"); - ret = ASN_CRIT_EXT_E; - } - #endif + #ifndef WOLFSSL_ALLOW_CRIT_SKID + /* This check is added due to RFC 5280 section 4.2.1.2 + * stating that conforming CA's must mark this extension + * as non-critical. When parsing extensions check that + * certificate was made in compliance with this. */ + if (critical) { + WOLFSSL_MSG("Critical Subject Key ID is not allowed"); + WOLFSSL_MSG("Use macro WOLFSSL_ALLOW_CRIT_SKID if wanted"); + ret = ASN_CRIT_EXT_E; + } + #endif if ((ret == 0) && (DecodeSubjKeyId(input, length, cert) < 0)) { ret = ASN_PARSE_E; @@ -19512,21 +21175,27 @@ /* Certificate policies. */ case CERT_POLICY_OID: - #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT) - VERIFY_AND_SET_OID(cert->extCertPolicySet); - #if defined(OPENSSL_EXTRA) || \ - defined(OPENSSL_EXTRA_X509_SMALL) - cert->extCertPolicyCrit = critical ? 1 : 0; - #endif + #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT) + VERIFY_AND_SET_OID(cert->extCertPolicySet); + #if defined(OPENSSL_EXTRA) || \ + defined(OPENSSL_EXTRA_X509_SMALL) + cert->extCertPolicyCrit = critical ? 1 : 0; #endif - #if defined(WOLFSSL_SEP) || defined(WOLFSSL_CERT_EXT) || \ - defined(WOLFSSL_QT) - if (DecodeCertPolicy(input, length, cert) < 0) { - ret = ASN_PARSE_E; - } - #else - WOLFSSL_MSG("Certificate Policy extension not supported yet."); + #endif + #if defined(WOLFSSL_SEP) || defined(WOLFSSL_CERT_EXT) || \ + defined(WOLFSSL_QT) + if (DecodeCertPolicy(input, length, cert) < 0) { + ret = ASN_PARSE_E; + } + #else + WOLFSSL_MSG("Certificate Policy extension not supported."); + #ifndef WOLFSSL_NO_ASN_STRICT + if (critical) { + WOLFSSL_ERROR_VERBOSE(ASN_CRIT_EXT_E); + ret = ASN_CRIT_EXT_E; + } #endif + #endif break; /* Key usage. */ @@ -19611,6 +21280,23 @@ return ASN_PARSE_E; break; #endif + #ifdef WOLFSSL_DUAL_ALG_CERTS + case SUBJ_ALT_PUB_KEY_INFO_OID: + VERIFY_AND_SET_OID(cert->extSapkiSet); + if (DecodeSubjAltPubKeyInfo(&input[idx], length, cert) < 0) + return ASN_PARSE_E; + break; + case ALT_SIG_ALG_OID: + VERIFY_AND_SET_OID(cert->extAltSigAlgSet); + if (DecodeAltSigAlg(&input[idx], length, cert) < 0) + return ASN_PARSE_E; + break; + case ALT_SIG_VAL_OID: + VERIFY_AND_SET_OID(cert->extAltSigValSet); + if (DecodeAltSigVal(&input[idx], length, cert) < 0) + return ASN_PARSE_E; + break; + #endif /* WOLFSSL_DUAL_ALG_CERTS */ default: if (isUnknownExt != NULL) *isUnknownExt = 1; @@ -19643,7 +21329,7 @@ CERTEXTHDRASN_IDX_EXTSEQ }; -/* Number of itesm in ASN.1 template for extensions. */ +/* Number of items in ASN.1 template for extensions. */ #define certExtHdrASN_Length (sizeof(certExtHdrASN) / sizeof(ASNItem)) /* ASN.1 template for Extension. @@ -19771,7 +21457,7 @@ ret = DecodeExtensionType(input + idx, (word32)length, oid, critical, cert, NULL); - if (ret == ASN_CRIT_EXT_E) { + if (ret == WC_NO_ERR_TRACE(ASN_CRIT_EXT_E)) { ret = 0; criticalFail = 1; } @@ -19820,7 +21506,7 @@ /* Clear dynamic data. */ XMEMSET(dataASN, 0, sizeof(*dataASN) * certExtASN_Length); - /* Ensure OID is an extention type. */ + /* Ensure OID is an extension type. */ GetASN_OID(&dataASN[CERTEXTASN_IDX_OID], oidCertExtType); /* Set criticality variable. */ GetASN_Int8Bit(&dataASN[CERTEXTASN_IDX_CRIT], &critical); @@ -19861,7 +21547,7 @@ } /* Don't fail criticality until all other extensions have been checked. */ - if (ret == ASN_CRIT_EXT_E) { + if (ret == WC_NO_ERR_TRACE(ASN_CRIT_EXT_E)) { criticalRet = ASN_CRIT_EXT_E; ret = 0; } @@ -19878,6 +21564,41 @@ } #ifdef WOLFSSL_ASN_TEMPLATE + +#if defined(HAVE_RPK) +/* ASN template for a Raw Public Key certificate defined RFC7250. */ +static const ASNItem RPKCertASN[] = { +/* SubjectPublicKeyInfo ::= SEQUENCE */ { 0, ASN_SEQUENCE, 1, 1, 0 }, + /* algorithm AlgorithmIdentifier */ + /* AlgorithmIdentifier ::= SEQUENCE */ { 1, ASN_SEQUENCE, 1, 1, 0 }, + /* Algorithm OBJECT IDENTIFIER */ + /* TBS_SPUBKEYINFO_ALGO_OID */ { 2, ASN_OBJECT_ID, 0, 0, 0 }, + /* parameters ANY defined by algorithm OPTIONAL */ + /* TBS_SPUBKEYINFO_ALGO_NULL */ { 2, ASN_TAG_NULL, 0, 0, 2 }, + /* TBS_SPUBKEYINFO_ALGO_CURVEID */ { 2, ASN_OBJECT_ID, 0, 0, 2 }, +#ifdef WC_RSA_PSS + /* TBS_SPUBKEYINFO_ALGO_P_SEQ */ { 2, ASN_SEQUENCE, 1, 0, 2 }, +#endif + /* subjectPublicKey BIT STRING */ + /* TBS_SPUBKEYINFO_PUBKEY */ { 1, ASN_BIT_STRING, 0, 0, 0 }, +}; +/* Number of items in ASN template for a RawPublicKey certificate. */ +#define RPKCertASN_Length (sizeof(RPKCertASN) / sizeof(ASNItem)) + +enum { + RPKCERTASN_IDX_SPUBKEYINFO_SEQ = 0, + RPKCERTASN_IDX_SPUBKEYINFO_ALGO_SEQ, + RPKCERTASN_IDX_SPUBKEYINFO_ALGO_OID, + RPKCERTASN_IDX_SPUBKEYINFO_ALGO_NULL, + RPKCERTASN_IDX_SPUBKEYINFO_ALGO_CURVEID, +#ifdef WC_RSA_PSS + RPKCERTASN_IDX_SPUBKEYINFO_ALGO_P_SEQ, +#endif + RPKCERTASN_IDX_SPUBKEYINFO_PUBKEY, +}; + +#endif /* HAVE_RPK */ + /* ASN template for an X509 certificate. * X.509: RFC 5280, 4.1 - Basic Certificate Fields. */ @@ -19887,12 +21608,12 @@ /* tbsCertificate TBSCertificate */ /* TBSCertificate ::= SEQUENCE */ /* TBS_SEQ */ { 1, ASN_SEQUENCE, 1, 1, 0 }, - /* version [0] EXPLICT Version DEFAULT v1 */ + /* version [0] EXPLICIT Version DEFAULT v1 */ /* TBS_VER */ { 2, ASN_CONTEXT_SPECIFIC | ASN_X509_CERT_VERSION, 1, 1, 1 }, /* Version ::= INTEGER { v1(0), v2(1), v3(2) */ /* TBS_VER_INT */ { 3, ASN_INTEGER, 0, 0, 0 }, /* serialNumber CertificateSerialNumber */ - /* CetificateSerialNumber ::= INTEGER */ + /* CertificateSerialNumber ::= INTEGER */ /* TBS_SERIAL */ { 2, ASN_INTEGER, 0, 0, 0 }, /* signature AlgorithmIdentifier */ /* AlgorithmIdentifier ::= SEQUENCE */ @@ -20071,9 +21792,9 @@ DECL_ASNGETDATA(dataASN, x509CertASN_Length); int ret = 0; int badDate = 0; - byte version; + byte version = 0; word32 idx; - word32 serialSz; + word32 serialSz = 0; const unsigned char* issuer = NULL; word32 issuerSz = 0; const unsigned char* subject = NULL; @@ -20082,6 +21803,40 @@ word32 pubKeyEnd = 0; int done = 0; +#if defined(HAVE_RPK) + /* try to parse the cert as Raw Public Key cert */ + DECL_ASNGETDATA(RPKdataASN, RPKCertASN_Length); + CALLOC_ASNGETDATA(RPKdataASN, RPKCertASN_Length, ret, cert->heap); + GetASN_OID(&RPKdataASN[RPKCERTASN_IDX_SPUBKEYINFO_ALGO_OID], + oidKeyType); + GetASN_OID(&RPKdataASN[RPKCERTASN_IDX_SPUBKEYINFO_ALGO_CURVEID], + oidCurveType); + ret = GetASN_Items(RPKCertASN, RPKdataASN, RPKCertASN_Length, 1, + cert->source, &cert->srcIdx, cert->maxIdx); + if (ret == 0) { + cert->keyOID = + RPKdataASN[RPKCERTASN_IDX_SPUBKEYINFO_ALGO_OID].data.oid.sum; + + /* Parse the public key. */ + pubKeyOffset = RPKdataASN[RPKCERTASN_IDX_SPUBKEYINFO_SEQ].offset; + pubKeyEnd = cert->maxIdx; + ret = GetCertKey(cert, cert->source, &pubKeyOffset, pubKeyEnd); + if (ret == 0) { + WOLFSSL_MSG("Raw Public Key certificate found and parsed"); + cert->isRPK = 1; + } + } + /* Dispose of memory before allocating for extension decoding. */ + FREE_ASNGETDATA(RPKdataASN, cert->heap); + + if (ret == 0) { + return ret; + } + else { + ret = 0; /* proceed to the original x509 parsing */ + } +#endif /* HAVE_RPK */ + CALLOC_ASNGETDATA(dataASN, x509CertASN_Length, ret, cert->heap); if (ret == 0) { @@ -20122,6 +21877,19 @@ /* Set fields extracted from data. */ cert->version = version; cert->serialSz = (int)serialSz; + + #if !defined(WOLFSSL_NO_ASN_STRICT) && !defined(WOLFSSL_PYTHON) + /* RFC 5280 section 4.1.2.2 states that non-conforming CAs may issue + * a negative or zero serial number and should be handled gracefully. + * Since it is a non-conforming CA that issues a serial of 0 then we + * treat it as an error here. */ + if (cert->serialSz == 1 && cert->serial[0] == 0) { + WOLFSSL_MSG("Error serial number of 0, use WOLFSSL_NO_ASN_STRICT " + "if wanted"); + ret = ASN_PARSE_E; + } + #endif + cert->signatureOID = dataASN[X509CERTASN_IDX_TBS_ALGOID_OID].data.oid.sum; cert->keyOID = dataASN[X509CERTASN_IDX_TBS_SPUBKEYINFO_ALGO_OID].data.oid.sum; cert->certBegin = dataASN[X509CERTASN_IDX_TBS_SEQ].offset; @@ -20132,7 +21900,8 @@ i = (dataASN[X509CERTASN_IDX_TBS_VALIDITY_NOTB_UTC].tag != 0) ? X509CERTASN_IDX_TBS_VALIDITY_NOTB_UTC : X509CERTASN_IDX_TBS_VALIDITY_NOTB_GT; - if ((CheckDate(&dataASN[i], BEFORE) < 0) && verify) { + if ((CheckDate(&dataASN[i], BEFORE) < 0) && (verify != NO_VERIFY) && + (verify != VERIFY_SKIP_DATE)) { badDate = ASN_BEFORE_DATE_E; } /* Store reference to BEFOREdate. */ @@ -20143,7 +21912,8 @@ i = (dataASN[X509CERTASN_IDX_TBS_VALIDITY_NOTA_UTC].tag != 0) ? X509CERTASN_IDX_TBS_VALIDITY_NOTA_UTC : X509CERTASN_IDX_TBS_VALIDITY_NOTA_GT; - if ((CheckDate(&dataASN[i], AFTER) < 0) && verify) { + if ((CheckDate(&dataASN[i], AFTER) < 0) && (verify != NO_VERIFY) && + (verify != VERIFY_SKIP_DATE)) { badDate = ASN_AFTER_DATE_E; } /* Store reference to AFTER date. */ @@ -20313,7 +22083,7 @@ /* Decode the extension data starting at [3]. */ ret = DecodeCertExtensions(cert); if (criticalExt != NULL) { - if (ret == ASN_CRIT_EXT_E) { + if (ret == WC_NO_ERR_TRACE(ASN_CRIT_EXT_E)) { /* Return critical extension not recognized. */ *criticalExt = ret; ret = 0; @@ -20401,7 +22171,7 @@ * * @param [in] cert Certificate request object. * @param [out] criticalExt Critical extension return code. - * @param [in] oid OID decribing which attribute was found. + * @param [in] oid OID describing which attribute was found. * @param [in] aIdx Index into certificate source to start parsing. * @param [in] input Attribute value data. * @param [in] maxIdx Maximum index to parse to. @@ -20477,6 +22247,22 @@ } break; + case UNSTRUCTURED_NAME_OID: + /* Clear dynamic data and specify choices acceptable. */ + XMEMSET(strDataASN, 0, sizeof(strDataASN)); + GetASN_Choice(&strDataASN[STRATTRASN_IDX_STR], strAttrChoice); + /* Parse a string. */ + ret = GetASN_Items(strAttrASN, strDataASN, strAttrASN_Length, + 1, input, &idx, maxIdx); + if (ret == 0) { + /* Store references to unstructured name. */ + cert->unstructuredName = + (char*)strDataASN[STRATTRASN_IDX_STR].data.ref.data; + cert->unstructuredNameLen = (int)strDataASN[STRATTRASN_IDX_STR]. + data.ref.length; + } + break; + /* Certificate extensions to be included in generated certificate. * PKCS#9: RFC 2985, 5.4.2 - Extension request */ @@ -20488,7 +22274,7 @@ /* Decode and validate extensions. */ ret = DecodeCertExtensions(cert); - if (ret == ASN_CRIT_EXT_E) { + if (ret == WC_NO_ERR_TRACE(ASN_CRIT_EXT_E)) { /* Return critical extension not recognized. */ *criticalExt = ret; ret = 0; @@ -20715,13 +22501,13 @@ char* ptr; #endif - ret = ParseCertRelative(cert, type, verify, cm); + ret = ParseCertRelative(cert, type, verify, cm, NULL); if (ret < 0) return ret; #if (!defined(WOLFSSL_NO_MALLOC) && !defined(NO_WOLFSSL_CM_VERIFY)) || \ defined(WOLFSSL_DYN_CERT) - /* cert->subjectCN not stored as copy of WOLFSSL_NO_MALLOC defind */ + /* cert->subjectCN not stored as copy of WOLFSSL_NO_MALLOC defined */ if (cert->subjectCNLen > 0) { ptr = (char*)XMALLOC((size_t)cert->subjectCNLen + 1, cert->heap, DYNAMIC_TYPE_SUBJECT_CN); @@ -20760,29 +22546,10 @@ return ParseCert(cert, type, verify, cm); } -#if !defined(OPENSSL_EXTRA) && !defined(OPENSSL_EXTRA_X509_SMALL) && \ - !defined(GetCA) -/* from SSL proper, for locking can't do find here anymore. - * brought in from internal.h if built with compat layer. - * if defined(GetCA), it's a predefined macro and these prototypes - * would conflict. - */ -#ifdef __cplusplus - extern "C" { -#endif - Signer* GetCA(void* signers, byte* hash); - #ifndef NO_SKID - Signer* GetCAByName(void* signers, byte* hash); - #endif -#ifdef __cplusplus - } -#endif - -#endif /* !OPENSSL_EXTRA && !OPENSSL_EXTRA_X509_SMALL && !GetCA */ - -#if defined(WOLFCRYPT_ONLY) +#ifdef WOLFCRYPT_ONLY /* dummy functions, not using wolfSSL so don't need actual ones */ +Signer* GetCA(void* signers, byte* hash); Signer* GetCA(void* signers, byte* hash) { (void)hash; @@ -20791,6 +22558,7 @@ } #ifndef NO_SKID +Signer* GetCAByName(void* signers, byte* hash); Signer* GetCAByName(void* signers, byte* hash) { (void)hash; @@ -20799,6 +22567,21 @@ } #endif /* NO_SKID */ +#ifdef WOLFSSL_AKID_NAME +Signer* GetCAByAKID(void* vp, const byte* issuer, word32 issuerSz, + const byte* serial, word32 serialSz); +Signer* GetCAByAKID(void* vp, const byte* issuer, word32 issuerSz, + const byte* serial, word32 serialSz) +{ + (void)issuer; + (void)issuerSz; + (void)serial; + (void)serialSz; + + return (Signer*)vp; +} +#endif + #endif /* WOLFCRYPT_ONLY */ #if defined(WOLFSSL_NO_TRUSTED_CERTS_VERIFY) && !defined(NO_SKID) @@ -20825,6 +22608,7 @@ * * @param [in] input Input data. * @param [in] maxIdx Maximum index for data. + * @param [in] sigOID Signature OID for determining hash algorithm. * @param [out] hash Hash of AKI. * @param [out] set Whether the hash buffer was set. * @param [in] heap Dynamic memory allocation hint. @@ -20833,10 +22617,10 @@ * is invalid. * @return MEMORY_E on dynamic memory allocation failure. */ -static int GetAKIHash(const byte* input, word32 maxIdx, byte* hash, int* set, - void* heap) +static int GetAKIHash(const byte* input, word32 maxIdx, word32 sigOID, + byte* hash, int* set, void* heap) { - /* AKI and Certificate Extenion ASN.1 templates are the same length. */ + /* AKI and Certificate Extension ASN.1 templates are the same length. */ DECL_ASNGETDATA(dataASN, certExtASN_Length); int ret = 0; word32 idx = 0; @@ -20882,9 +22666,9 @@ *set = 1; /* Get the hash or hash of the hash if wrong size. */ ret = GetHashId( - dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.data, - dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.length, - hash); + dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.data, + (int)dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.length, + hash, HashIdAlg(sigOID)); } break; } @@ -21149,7 +22933,7 @@ /* Get the hash or hash of the hash if wrong * size. */ ret = GetHashId(cert + extIdx, extLen, - hash); + hash, HashIdAlg(signatureOID)); } } break; @@ -21171,14 +22955,16 @@ if (extAuthKeyIdSet) ca = GetCA(cm, hash); if (ca == NULL) { - ret = CalcHashId(cert + issuerIdx, issuerSz, hash); + ret = CalcHashId_ex(cert + issuerIdx, issuerSz, hash, + HashIdAlg(signatureOID)); if (ret == 0) ca = GetCAByName(cm, hash); } } #else if (ret == 0 && pubKey == NULL) { - ret = CalcHashId(cert + issuerIdx, issuerSz, hash); + ret = CalcHashId_ex(cert + issuerIdx, issuerSz, hash, + HashIdAlg(signatureOID)); if (ret == 0) ca = GetCA(cm, hash); } @@ -21407,7 +23193,8 @@ /* Find the AKI extension in list of extensions and get hash. */ if ((!req) && (akiData != NULL)) { /* TODO: test case */ - ret = GetAKIHash(akiData, akiLen, hash, &extAuthKeyIdSet, heap); + ret = GetAKIHash(akiData, akiLen, sigOID, hash, &extAuthKeyIdSet, + heap); } /* Get the CA by hash one was found. */ @@ -21418,7 +23205,7 @@ #endif { /* Try hash of issuer name. */ - ret = CalcHashId(caName, caNameLen, hash); + ret = CalcHashId_ex(caName, caNameLen, hash, HashIdAlg(sigOID)); if (ret == 0) { ca = GetCAByName(cm, hash); } @@ -21428,7 +23215,7 @@ /* Extract public key information. */ pubKey = ca->publicKey; pubKeySz = ca->pubKeySize; - pubKeyOID = ca->keyOID; + pubKeyOID = (int)ca->keyOID; } else { /* No public key to verify with. */ @@ -21450,7 +23237,8 @@ /* Check signature. */ ret = ConfirmSignature(sigCtx, tbs, tbsSz, pubKey, pubKeySz, - pubKeyOID, sig, sigSz, sigOID, sigParams, sigParamsSz, NULL); + (word32)pubKeyOID, sig, sigSz, sigOID, sigParams, sigParamsSz, + NULL); if (ret != 0) { WOLFSSL_MSG("Confirm signature failed"); } @@ -21466,9 +23254,7 @@ #endif /* WOLFSSL_ASN_TEMPLATE */ } -#ifdef OPENSSL_EXTRA -/* Call CheckCertSignature_ex using a public key buffer for verification - */ +/* Call CheckCertSignature_ex using a public key buffer for verification */ int CheckCertSignaturePubKey(const byte* cert, word32 certSz, void* heap, const byte* pubKey, word32 pubKeySz, int pubKeyOID) { @@ -21476,6 +23262,7 @@ pubKey, pubKeySz, pubKeyOID, 0); } +/* Call CheckCertSignature_ex using a public key and oid */ int wc_CheckCertSigPubKey(const byte* cert, word32 certSz, void* heap, const byte* pubKey, word32 pubKeySz, int pubKeyOID) { @@ -21491,15 +23278,12 @@ pubKey, pubKeySz, pubKeyOID, 1); } #endif /* WOLFSSL_CERT_REQ */ -#endif /* OPENSSL_EXTRA */ -#ifdef WOLFSSL_SMALL_CERT_VERIFY -/* Call CheckCertSignature_ex using a certificate manager (cm) - */ -int CheckCertSignature(const byte* cert, word32 certSz, void* heap, void* cm) + +/* Call CheckCertSignature_ex using a certificate manager (cm) */ +int wc_CheckCertSignature(const byte* cert, word32 certSz, void* heap, void* cm) { return CheckCertSignature_ex(cert, certSz, heap, cm, NULL, 0, 0, 0); } -#endif /* WOLFSSL_SMALL_CERT_VERIFY */ #endif /* WOLFSSL_SMALL_CERT_VERIFY || OPENSSL_EXTRA */ #if (defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) || \ @@ -21589,7 +23373,7 @@ } /* Skip data if required. */ else if (op.op == DECODE_INSTR_OVER) { - o += l; + o += (word32)l; } } } @@ -21598,14 +23382,24 @@ /* Return the public key data and length. * Skip first byte of BIT_STRING data: unused bits. */ *pubKey = cert + o + 1; - *pubKeySz = l - 1; + *pubKeySz = (word32)(l - 1); } return ret; } #endif +Signer* findSignerByName(Signer *list, byte *hash) +{ + Signer *s; + for (s = list; s != NULL; s = s->next) { + if (XMEMCMP(s->subjectNameHash, hash, SIGNER_DIGEST_SIZE) == 0) { + return s; + } + } + return NULL; +} -int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm) +int ParseCertRelative(DecodedCert* cert, int type, int verify, void* cm, Signer *extraCAList) { int ret = 0; #ifndef WOLFSSL_ASN_TEMPLATE @@ -21614,10 +23408,11 @@ int len = 0; #endif #endif -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) int idx = 0; #endif byte* sce_tsip_encRsaKeyIdx; + (void)extraCAList; if (cert == NULL) { return BAD_FUNC_ARG; @@ -21633,7 +23428,8 @@ cert->badDate = 0; cert->criticalExt = 0; if ((ret = DecodeToKey(cert, verify)) < 0) { - if (ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) { + if (ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E) || + ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) { cert->badDate = ret; if (verify == VERIFY_SKIP_DATE) ret = 0; @@ -21643,7 +23439,11 @@ } WOLFSSL_MSG("Parsed Past Key"); - +#if defined(HAVE_RPK) + if (cert->isRPK) { + return ret; + } +#endif /* HAVE_RPK */ #ifdef WOLFSSL_CERT_REQ /* Read attributes */ @@ -21792,7 +23592,7 @@ cert->extensionsIdx = cert->srcIdx; /* for potential later use */ if ((ret = DecodeCertExtensions(cert)) < 0) { - if (ret == ASN_CRIT_EXT_E) { + if (ret == WC_NO_ERR_TRACE(ASN_CRIT_EXT_E)) { cert->criticalExt = ret; } else { @@ -21826,7 +23626,7 @@ cert->extensionsIdx = cert->srcIdx; /* for potential later use */ if ((ret = DecodeCertExtensions(cert)) < 0) { - if (ret == ASN_CRIT_EXT_E) + if (ret == WC_NO_ERR_TRACE(ASN_CRIT_EXT_E)) cert->criticalExt = ret; else return ret; @@ -21879,7 +23679,8 @@ #endif { ret = DecodeCert(cert, verify, &cert->criticalExt); - if (ret == ASN_BEFORE_DATE_E || ret == ASN_AFTER_DATE_E) { + if (ret == WC_NO_ERR_TRACE(ASN_BEFORE_DATE_E) || + ret == WC_NO_ERR_TRACE(ASN_AFTER_DATE_E)) { cert->badDate = ret; if (verify == VERIFY_SKIP_DATE) ret = 0; @@ -21888,14 +23689,38 @@ WOLFSSL_ERROR_VERBOSE(ret); return ret; } +#if defined(HAVE_RPK) + if (cert->isRPK) { + return ret; + } +#endif /* HAVE_RPK */ } #endif + #ifndef ALLOW_INVALID_CERTSIGN + /* https://datatracker.ietf.org/doc/html/rfc5280#section-4.2.1.9 + * If the cA boolean is not asserted, then the keyCertSign bit in the + * key usage extension MUST NOT be asserted. */ + if (!cert->isCA && cert->extKeyUsageSet && + (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) != 0) { + WOLFSSL_ERROR_VERBOSE(KEYUSAGE_E); + return KEYUSAGE_E; + } + #endif + #ifndef NO_SKID if (cert->extSubjKeyIdSet == 0 && cert->publicKey != NULL && cert->pubKeySize > 0) { - ret = CalcHashId(cert->publicKey, cert->pubKeySize, - cert->extSubjKeyId); + if (cert->signatureOID == CTC_SM3wSM2) { + /* TODO: GmSSL creates IDs this way but whole public key info + * block should be hashed. */ + ret = CalcHashId_ex(cert->publicKey + cert->pubKeySize - 65, 65, + cert->extSubjKeyId, HashIdAlg(cert->signatureOID)); + } + else { + ret = CalcHashId_ex(cert->publicKey, cert->pubKeySize, + cert->extSubjKeyId, HashIdAlg(cert->signatureOID)); + } if (ret != 0) { WOLFSSL_ERROR_VERBOSE(ret); return ret; @@ -21906,16 +23731,28 @@ if (!cert->selfSigned || (verify != NO_VERIFY && type != CA_TYPE && type != TRUSTED_PEER_TYPE)) { cert->ca = NULL; +#ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2 + if (extraCAList != NULL) { + cert->ca = findSignerByName(extraCAList, cert->issuerHash); + } +#endif #ifndef NO_SKID - if (cert->extAuthKeyIdSet) { + if (cert->ca == NULL && cert->extAuthKeyIdSet) { cert->ca = GetCA(cm, cert->extAuthKeyId); + #ifdef WOLFSSL_AKID_NAME + if (cert->ca == NULL) { + cert->ca = GetCAByAKID(cm, cert->extAuthKeyIdIssuer, + cert->extAuthKeyIdIssuerSz, cert->extAuthKeyIdIssuerSN, + cert->extAuthKeyIdIssuerSNSz); + } + #endif } if (cert->ca == NULL && cert->extSubjKeyIdSet && verify != VERIFY_OCSP) { cert->ca = GetCA(cm, cert->extSubjKeyId); } if (cert->ca != NULL && XMEMCMP(cert->issuerHash, - cert->ca->subjectNameHash, KEYID_SIZE) != 0) { + cert->ca->subjectNameHash, KEYID_SIZE) != 0) { cert->ca = NULL; } if (cert->ca == NULL) { @@ -21947,93 +23784,31 @@ } } - if (cert->selfSigned) { - cert->maxPathLen = WOLFSSL_MAX_PATH_LEN; - } else { - /* RFC 5280 Section 4.2.1.9: - * - * load/receive check - * - * 1) Is CA boolean set? - * No - SKIP CHECK - * Yes - Check key usage - * 2) Is Key usage extension present? - * No - goto 3 - * Yes - check keyCertSign assertion - * 2.a) Is keyCertSign asserted? - * No - goto 4 - * Yes - goto 3 - * 3) Is pathLen set? - * No - goto 4 - * Yes - check pathLen against maxPathLen. - * 3.a) Is pathLen less than maxPathLen? - * No - goto 4 - * Yes - set maxPathLen to pathLen and EXIT - * 4) Is maxPathLen > 0? - * Yes - Reduce by 1 - * No - ERROR - */ - - if (cert->ca && cert->pathLengthSet) { - int checkPathLen = 0; - int decrementMaxPathLen = 0; - cert->maxPathLen = cert->pathLength; - if (cert->isCA) { - WOLFSSL_MSG("\tCA boolean set"); - if (cert->extKeyUsageSet) { - WOLFSSL_MSG("\tExtension Key Usage Set"); - if ((cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) != 0) { - checkPathLen = 1; - } - else { - decrementMaxPathLen = 1; - } - } - else { - checkPathLen = 1; - } /* !cert->ca check */ - } /* cert is not a CA (assuming entity cert) */ - - if (checkPathLen && cert->pathLengthSet) { - if (cert->pathLength < cert->ca->maxPathLen) { - WOLFSSL_MSG("\tmaxPathLen status: set to pathLength"); - cert->maxPathLen = cert->pathLength; - } - else { - decrementMaxPathLen = 1; - } - } - - if (decrementMaxPathLen && cert->ca->maxPathLen > 0) { - WOLFSSL_MSG("\tmaxPathLen status: reduce by 1"); - cert->maxPathLen = (byte)(cert->ca->maxPathLen - 1); - if (verify != NO_VERIFY && type != CA_TYPE && - type != TRUSTED_PEER_TYPE) { - WOLFSSL_MSG("\tmaxPathLen status: OK"); - } - } else if (decrementMaxPathLen && cert->ca->maxPathLen == 0) { + /* Set to WOLFSSL_MAX_PATH_LEN by default in InitDecodedCert_ex */ + if (cert->pathLengthSet) + cert->maxPathLen = cert->pathLength; + + if (!cert->selfSigned) { + /* Need to perform a pathlen check on anything that will be used + * to sign certificates later on. Otherwise, pathLen doesn't + * mean anything. + * Nothing to check if we don't have the issuer of this cert. */ + if (type != CERT_TYPE && cert->isCA && cert->extKeyUsageSet && + (cert->extKeyUsage & KEYUSE_KEY_CERT_SIGN) != 0 && cert->ca) { + if (cert->ca->maxPathLen == 0) { + /* This cert CAN NOT be used as an intermediate cert. The + * issuer does not allow it. */ cert->maxPathLen = 0; - if (verify != NO_VERIFY && type != CA_TYPE && - type != TRUSTED_PEER_TYPE) { + if (verify != NO_VERIFY) { WOLFSSL_MSG("\tNon-entity cert, maxPathLen is 0"); WOLFSSL_MSG("\tmaxPathLen status: ERROR"); WOLFSSL_ERROR_VERBOSE(ASN_PATHLEN_INV_E); return ASN_PATHLEN_INV_E; } } - } else if (cert->ca && cert->isCA) { - /* case where cert->pathLength extension is not set */ - if (cert->ca->maxPathLen > 0) { - cert->maxPathLen = (byte)(cert->ca->maxPathLen - 1); - } else { - cert->maxPathLen = 0; - if (verify != NO_VERIFY && type != CA_TYPE && - type != TRUSTED_PEER_TYPE) { - WOLFSSL_MSG("\tNon-entity cert, maxPathLen is 0"); - WOLFSSL_MSG("\tmaxPathLen status: ERROR"); - WOLFSSL_ERROR_VERBOSE(ASN_PATHLEN_INV_E); - return ASN_PATHLEN_INV_E; - } + else { + cert->maxPathLen = (byte)min(cert->ca->maxPathLen - 1, + cert->maxPathLen); } } } @@ -22044,12 +23819,12 @@ if (cert->ca) { /* Need the CA's public key hash for OCSP */ XMEMCPY(cert->issuerKeyHash, cert->ca->subjectKeyHash, - KEYID_SIZE); + KEYID_SIZE); } } #endif /* HAVE_OCSP */ } -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) /* prepare for TSIP TLS cert verification API use */ if (cert->keyOID == RSAk) { /* to call TSIP API, it needs keys position info in bytes */ @@ -22063,7 +23838,8 @@ return ret; } cert->sigCtx.CertAtt.certBegin = cert->certBegin; - } else if (cert->keyOID == ECDSAk) { + } + else if (cert->keyOID == ECDSAk) { cert->sigCtx.CertAtt.certBegin = cert->certBegin; } /* check if we can use TSIP for cert verification */ @@ -22106,13 +23882,19 @@ if (cert->ca) { if (verify == VERIFY || verify == VERIFY_OCSP || verify == VERIFY_SKIP_DATE) { + word32 keyOID = cert->ca->keyOID; + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if (cert->selfSigned && (cert->signatureOID == CTC_SM3wSM2)) { + keyOID = SM2k; + } + #endif /* try to confirm/verify signature */ if ((ret = ConfirmSignature(&cert->sigCtx, cert->source + cert->certBegin, cert->sigIndex - cert->certBegin, cert->ca->publicKey, cert->ca->pubKeySize, - cert->ca->keyOID, cert->signature, - cert->sigLength, cert->signatureOID, + keyOID, cert->signature, cert->sigLength, + cert->signatureOID, #ifdef WC_RSA_PSS cert->source + cert->sigParamsIndex, cert->sigParamsLength, @@ -22120,12 +23902,50 @@ NULL, 0, #endif sce_tsip_encRsaKeyIdx)) != 0) { - if (ret != WC_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) { WOLFSSL_MSG("Confirm signature failed"); } WOLFSSL_ERROR_VERBOSE(ret); return ret; } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ret == 0) && cert->extAltSigAlgSet && + cert->extAltSigValSet) { + #ifndef WOLFSSL_SMALL_STACK + byte der[MAX_CERT_VERIFY_SZ]; + #else + byte *der = (byte*)XMALLOC(MAX_CERT_VERIFY_SZ, cert->heap, + DYNAMIC_TYPE_DCERT); + if (der == NULL) { + ret = MEMORY_E; + } else + #endif /* ! WOLFSSL_SMALL_STACK */ + { + ret = wc_GeneratePreTBS(cert, der, MAX_CERT_VERIFY_SZ); + + if (ret > 0) { + ret = ConfirmSignature(&cert->sigCtx, der, ret, + cert->ca->sapkiDer, cert->ca->sapkiLen, + cert->ca->sapkiOID, cert->altSigValDer, + cert->altSigValLen, cert->altSigAlgOID, + NULL, 0, NULL); + } + #ifdef WOLFSSL_SMALL_STACK + XFREE(der, cert->heap, DYNAMIC_TYPE_DCERT); + #endif /* WOLFSSL_SMALL_STACK */ + + if (ret != 0) { + WOLFSSL_MSG("Confirm alternative signature failed"); + WOLFSSL_ERROR_VERBOSE(ret); + return ret; + } + else { + WOLFSSL_MSG("Alt signature has been verified!"); + } + } + } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ } #ifndef IGNORE_NAME_CONSTRAINTS if (verify == VERIFY || verify == VERIFY_OCSP || @@ -22142,6 +23962,7 @@ } #ifdef WOLFSSL_CERT_REQ else if (type == CERTREQ_TYPE) { + /* try to confirm/verify signature */ if ((ret = ConfirmSignature(&cert->sigCtx, cert->source + cert->certBegin, cert->sigIndex - cert->certBegin, @@ -22154,12 +23975,50 @@ NULL, 0, #endif sce_tsip_encRsaKeyIdx)) != 0) { - if (ret != WC_PENDING_E) { + if (ret != WC_NO_ERR_TRACE(WC_PENDING_E)) { WOLFSSL_MSG("Confirm signature failed"); } WOLFSSL_ERROR_VERBOSE(ret); return ret; } + + #ifdef WOLFSSL_DUAL_ALG_CERTS + if ((ret == 0) && cert->extAltSigAlgSet && + cert->extAltSigValSet) { + #ifndef WOLFSSL_SMALL_STACK + byte der[MAX_CERT_VERIFY_SZ]; + #else + byte *der = (byte*)XMALLOC(MAX_CERT_VERIFY_SZ, cert->heap, + DYNAMIC_TYPE_DCERT); + if (der == NULL) { + ret = MEMORY_E; + } else + #endif /* ! WOLFSSL_SMALL_STACK */ + { + ret = wc_GeneratePreTBS(cert, der, MAX_CERT_VERIFY_SZ); + + if (ret > 0) { + ret = ConfirmSignature(&cert->sigCtx, der, ret, + cert->sapkiDer, cert->sapkiLen, + cert->sapkiOID, cert->altSigValDer, + cert->altSigValLen, cert->altSigAlgOID, + NULL, 0, NULL); + } + #ifdef WOLFSSL_SMALL_STACK + XFREE(der, cert->heap, DYNAMIC_TYPE_DCERT); + #endif /* WOLFSSL_SMALL_STACK */ + + if (ret != 0) { + WOLFSSL_MSG("Confirm alternative signature failed"); + WOLFSSL_ERROR_VERBOSE(ret); + return ret; + } + else { + WOLFSSL_MSG("Alt signature has been verified!"); + } + } + } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ } #endif else { @@ -22197,6 +24056,89 @@ return ret; } +int FillSigner(Signer* signer, DecodedCert* cert, int type, DerBuffer *der) +{ + int ret = 0; + + if (signer == NULL || cert == NULL) + return BAD_FUNC_ARG; + +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (ret == 0 && signer != NULL) { + if (cert->extSapkiSet && cert->sapkiLen > 0) { + /* Allocated space for alternative public key. */ + signer->sapkiDer = (byte*)XMALLOC(cert->sapkiLen, cert->heap, + DYNAMIC_TYPE_PUBLIC_KEY); + if (signer->sapkiDer == NULL) { + ret = MEMORY_E; + } + else { + XMEMCPY(signer->sapkiDer, cert->sapkiDer, cert->sapkiLen); + signer->sapkiLen = cert->sapkiLen; + signer->sapkiOID = cert->sapkiOID; + } + } + } +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + +#if defined(WOLFSSL_AKID_NAME) || defined(HAVE_CRL) + if (ret == 0 && signer != NULL) + ret = CalcHashId(cert->serial, (word32)cert->serialSz, + signer->serialHash); +#endif + if (ret == 0 && signer != NULL) { + #ifdef WOLFSSL_SIGNER_DER_CERT + ret = AllocDer(&signer->derCert, der->length, der->type, NULL); + } + if (ret == 0 && signer != NULL) { + XMEMCPY(signer->derCert->buffer, der->buffer, der->length); + #else + (void)der; + #endif + signer->keyOID = cert->keyOID; + if (cert->pubKeyStored) { + signer->publicKey = cert->publicKey; + signer->pubKeySize = cert->pubKeySize; + } + + if (cert->subjectCNStored) { + signer->nameLen = cert->subjectCNLen; + signer->name = cert->subjectCN; + } + signer->maxPathLen = cert->maxPathLen; + signer->selfSigned = cert->selfSigned; + #ifndef IGNORE_NAME_CONSTRAINTS + signer->permittedNames = cert->permittedNames; + signer->excludedNames = cert->excludedNames; + #endif + #ifndef NO_SKID + XMEMCPY(signer->subjectKeyIdHash, cert->extSubjKeyId, + SIGNER_DIGEST_SIZE); + #endif + XMEMCPY(signer->subjectNameHash, cert->subjectHash, + SIGNER_DIGEST_SIZE); + #if defined(HAVE_OCSP) || defined(HAVE_CRL) + XMEMCPY(signer->issuerNameHash, cert->issuerHash, + SIGNER_DIGEST_SIZE); + #endif + #ifdef HAVE_OCSP + XMEMCPY(signer->subjectKeyHash, cert->subjectKeyHash, + KEYID_SIZE); + #endif + signer->keyUsage = cert->extKeyUsageSet ? cert->extKeyUsage + : 0xFFFF; + signer->next = NULL; /* If Key Usage not set, all uses valid. */ + cert->publicKey = 0; /* in case lock fails don't free here. */ + cert->subjectCN = 0; + #ifndef IGNORE_NAME_CONSTRAINTS + cert->permittedNames = NULL; + cert->excludedNames = NULL; + #endif + signer->type = (byte)type; + } + return ret; +} + /* Create and init an new signer */ Signer* MakeSigner(void* heap) { @@ -22225,6 +24167,9 @@ (void)heap; XFREE(signer->name, heap, DYNAMIC_TYPE_SUBJECT_CN); XFREE((void*)signer->publicKey, heap, DYNAMIC_TYPE_PUBLIC_KEY); +#ifdef WOLFSSL_DUAL_ALG_CERTS + XFREE(signer->sapkiDer, heap, DYNAMIC_TYPE_PUBLIC_KEY); +#endif #ifndef IGNORE_NAME_CONSTRAINTS if (signer->permittedNames) FreeNameSubtrees(signer->permittedNames, heap); @@ -22262,6 +24207,28 @@ } } +void FreeSignerTableType(Signer** table, int rows, byte type, void* heap) +{ + int i; + + for (i = 0; i < rows; i++) { + Signer* signer = table[i]; + Signer** next = &table[i]; + + while (signer) { + if (signer->type == type) { + *next = signer->next; + FreeSigner(signer, heap); + signer = *next; + } + else { + next = &signer->next; + signer = signer->next; + } + } + } +} + #ifdef WOLFSSL_TRUST_PEER_CERT /* Free an individual trusted peer cert. * @@ -22317,24 +24284,6 @@ } #endif /* WOLFSSL_TRUST_PEER_CERT */ -int SetMyVersion(word32 version, byte* output, int header) -{ - int i = 0; - - if (output == NULL) - return BAD_FUNC_ARG; - - if (header) { - output[i++] = ASN_CONTEXT_SPECIFIC | ASN_CONSTRUCTED; - output[i++] = 3; - } - output[i++] = ASN_INTEGER; - output[i++] = 0x01; - output[i++] = (byte)version; - - return i; -} - #if !defined(WOLFSSL_ASN_TEMPLATE) || defined(HAVE_PKCS7) int SetSerialNumber(const byte* sn, word32 snSz, byte* output, word32 outputSz, int maxSnSz) @@ -22385,6 +24334,27 @@ #endif /* !NO_CERTS */ +#if defined(WOLFSSL_ASN_TEMPLATE) || defined(HAVE_PKCS12) || \ + (defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT)) +int SetMyVersion(word32 version, byte* output, int header) +{ + int i = 0; + + if (output == NULL) + return BAD_FUNC_ARG; + + if (header) { + output[i++] = ASN_CONTEXT_SPECIFIC | ASN_CONSTRUCTED; + output[i++] = 3; + } + output[i++] = ASN_INTEGER; + output[i++] = 0x01; + output[i++] = (byte)version; + + return i; +} +#endif + #ifndef WOLFSSL_ASN_TEMPLATE int wc_GetSerialNumber(const byte* input, word32* inOutIdx, byte* serial, int* serialSz, word32 maxIdx) @@ -22428,7 +24398,7 @@ int AllocDer(DerBuffer** pDer, word32 length, int type, void* heap) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); if (pDer) { int dynType = 0; DerBuffer* der; @@ -22436,6 +24406,7 @@ /* Determine dynamic type */ switch (type) { case CA_TYPE: dynType = DYNAMIC_TYPE_CA; break; + case CHAIN_CERT_TYPE: case CERT_TYPE: dynType = DYNAMIC_TYPE_CERT; break; case CRL_TYPE: dynType = DYNAMIC_TYPE_CRL; break; case DSA_TYPE: dynType = DYNAMIC_TYPE_DSA; break; @@ -22458,18 +24429,31 @@ der->buffer = (byte*)der + sizeof(DerBuffer); der->length = length; ret = 0; /* Success */ + } else { + ret = BAD_FUNC_ARG; + } + return ret; +} + +int AllocCopyDer(DerBuffer** pDer, const unsigned char* buff, word32 length, + int type, void* heap) +{ + int ret = AllocDer(pDer, length, type, heap); + if (ret == 0) { + XMEMCPY((*pDer)->buffer, buff, length); } + return ret; } void FreeDer(DerBuffer** pDer) { - if (pDer && *pDer) - { + if (pDer && *pDer) { DerBuffer* der = (DerBuffer*)*pDer; /* ForceZero private keys */ - if (der->type == PRIVATEKEY_TYPE && der->buffer != NULL) { + if (((der->type == PRIVATEKEY_TYPE) || + (der->type == ALT_PRIVATEKEY_TYPE)) && der->buffer != NULL) { ForceZero(der->buffer, der->length); } der->buffer = NULL; @@ -22545,7 +24529,6 @@ wcchar BEGIN_EDDSA_PRIV = "-----BEGIN EDDSA PRIVATE KEY-----"; wcchar END_EDDSA_PRIV = "-----END EDDSA PRIVATE KEY-----"; #endif -#if defined(HAVE_PQC) #if defined(HAVE_FALCON) wcchar BEGIN_FALCON_LEVEL1_PRIV = "-----BEGIN FALCON_LEVEL1 PRIVATE KEY-----"; wcchar END_FALCON_LEVEL1_PRIV = "-----END FALCON_LEVEL1 PRIVATE KEY-----"; @@ -22575,7 +24558,6 @@ wcchar BEGIN_SPHINCS_SMALL_LEVEL5_PRIV = "-----BEGIN SPHINCS_SMALL_LEVEL5 PRIVATE KEY-----"; wcchar END_SPHINCS_SMALL_LEVEL5_PRIV = "-----END SPHINCS_SMALL_LEVEL5 PRIVATE KEY-----"; #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ const int pem_struct_min_sz = XSTR_SIZEOF("-----BEGIN X509 CRL-----" "-----END X509 CRL-----"); @@ -22595,11 +24577,12 @@ int wc_PemGetHeaderFooter(int type, const char** header, const char** footer) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (type) { case CA_TYPE: /* same as below */ case TRUSTED_PEER_TYPE: + case CHAIN_CERT_TYPE: case CERT_TYPE: if (header) *header = BEGIN_CERT; if (footer) *footer = END_CERT; @@ -22662,6 +24645,9 @@ #endif case RSA_TYPE: case PRIVATEKEY_TYPE: + #ifdef WOLFSSL_DUAL_ALG_CERTS + case ALT_PRIVATEKEY_TYPE: + #endif if (header) *header = BEGIN_RSA_PRIV; if (footer) *footer = END_RSA_PRIV; ret = 0; @@ -22679,7 +24665,6 @@ ret = 0; break; #endif -#ifdef HAVE_PQC #ifdef HAVE_FALCON case FALCON_LEVEL1_TYPE: if (header) *header = BEGIN_FALCON_LEVEL1_PRIV; @@ -22741,7 +24726,6 @@ ret = 0; break; #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ case PUBLICKEY_TYPE: case ECC_PUBLICKEY_TYPE: if (header) *header = BEGIN_PUB_KEY; @@ -22767,6 +24751,7 @@ ret = 0; break; default: + ret = BAD_FUNC_ARG; break; } return ret; @@ -23069,7 +25054,7 @@ #endif outLen = 0; if ((err = Base64_Encode(der, derSz, NULL, (word32*)&outLen)) - != LENGTH_ONLY_E) { + != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { WOLFSSL_ERROR_VERBOSE(err); return err; } @@ -23145,7 +25130,7 @@ const char* bufferEnd = (const char*)(buff + longSz); long neededSz; int ret = 0; - int sz = (int)longSz; + word32 sz = (word32)longSz; int encrypted_key = 0; DerBuffer* der; word32 algId = 0; @@ -23164,12 +25149,16 @@ /* map header if not found for type */ for (;;) { - headerEnd = XSTRNSTR((char*)buff, header, (word32)sz); + headerEnd = XSTRNSTR((char*)buff, header, sz); if (headerEnd) { break; } - if (type == PRIVATEKEY_TYPE) { + if (type == PRIVATEKEY_TYPE +#ifdef WOLFSSL_DUAL_ALG_CERTS + || type == ALT_PRIVATEKEY_TYPE +#endif + ) { if (header == BEGIN_RSA_PRIV) { header = BEGIN_PRIV_KEY; footer = END_PRIV_KEY; @@ -23242,12 +25231,16 @@ if (!headerEnd) { #ifdef OPENSSL_EXTRA - if (type == PRIVATEKEY_TYPE) { + if (type == PRIVATEKEY_TYPE +#ifdef WOLFSSL_DUAL_ALG_CERTS + || type == ALT_PRIVATEKEY_TYPE +#endif + ) { /* see if there is a -----BEGIN * PRIVATE KEY----- header */ headerEnd = XSTRNSTR((char*)buff, PRIV_KEY_SUFFIX, sz); if (headerEnd) { const char* beginEnd; - int endLen; + unsigned int endLen; beginEnd = headerEnd + XSTR_SIZEOF(PRIV_KEY_SUFFIX); if (beginEnd >= (char*)buff + sz) { @@ -23271,7 +25264,7 @@ } /* headerEnd now points to beginning of header */ - XMEMCPY(beginBuf, headerEnd, beginEnd - headerEnd); + XMEMCPY(beginBuf, headerEnd, (size_t)(beginEnd - headerEnd)); beginBuf[beginEnd - headerEnd] = '\0'; /* look for matching footer */ footer = XSTRNSTR(beginEnd, @@ -23291,10 +25284,10 @@ return BUFFER_E; } - endLen = (unsigned int)(beginEnd - headerEnd - + endLen = (unsigned int)((size_t)(beginEnd - headerEnd) - (XSTR_SIZEOF(BEGIN_PRIV_KEY_PREFIX) - XSTR_SIZEOF(END_PRIV_KEY_PREFIX))); - XMEMCPY(endBuf, footer, endLen); + XMEMCPY(endBuf, footer, (size_t)endLen); endBuf[endLen] = '\0'; header = beginBuf; @@ -23321,7 +25314,11 @@ if (keyFormat) { /* keyFormat is Key_Sum enum */ - if (type == PRIVATEKEY_TYPE) { + if (type == PRIVATEKEY_TYPE + #ifdef WOLFSSL_DUAL_ALG_CERTS + || type == ALT_PRIVATEKEY_TYPE + #endif + ) { #ifndef NO_RSA if (header == BEGIN_RSA_PRIV) *keyFormat = RSAk; @@ -23380,7 +25377,7 @@ /* set up der buffer */ neededSz = (long)(footerEnd - headerEnd); - if (neededSz > sz || neededSz <= 0) + if (neededSz > (long)sz || neededSz <= 0) return BUFFER_E; ret = AllocDer(pDer, (word32)neededSz, type, heap); @@ -23659,7 +25656,8 @@ return BAD_FUNC_ARG; } - if (type != CERT_TYPE && type != CA_TYPE && type != CERTREQ_TYPE) { + if (type != CERT_TYPE && type != CHAIN_CERT_TYPE && type != CA_TYPE && + type != CERTREQ_TYPE) { WOLFSSL_MSG("Bad cert type"); return BAD_FUNC_ARG; } @@ -24000,7 +25998,7 @@ /* returns 0 on success */ int wc_GetUUIDFromCert(struct DecodedCert* cert, byte* uuid, word32* uuidSz) { - int ret = ALT_NAME_E; + int ret = WC_NO_ERR_TRACE(ALT_NAME_E); DNS_entry* id = NULL; do { @@ -24016,7 +26014,7 @@ } if (uuid == NULL) { - *uuidSz = id->len; + *uuidSz = (word32)id->len; return LENGTH_ONLY_E; } @@ -24024,7 +26022,7 @@ return BUFFER_E; } - XMEMCPY(uuid, id->name, id->len); + XMEMCPY(uuid, id->name, (size_t)id->len); ret = 0; /* success */ break; } @@ -24034,17 +26032,17 @@ } -/* reutrns 0 on success */ +/* returns 0 on success */ int wc_GetFASCNFromCert(struct DecodedCert* cert, byte* fascn, word32* fascnSz) { - int ret = ALT_NAME_E; + int ret = WC_NO_ERR_TRACE(ALT_NAME_E); DNS_entry* id = NULL; do { id = FindAltName(cert, ASN_OTHER_TYPE, id); if (id != NULL && id->oidSum == FASCN_OID) { if (fascn == NULL) { - *fascnSz = id->len; + *fascnSz = (word32)id->len; return LENGTH_ONLY_E; } @@ -24052,7 +26050,7 @@ return BUFFER_E; } - XMEMCPY(fascn, id->name, id->len); + XMEMCPY(fascn, id->name, (size_t)id->len); ret = 0; /* success */ } } while (id != NULL); @@ -24063,7 +26061,7 @@ #if !defined(NO_RSA) && (defined(WOLFSSL_CERT_GEN) || \ defined(WOLFSSL_KCAPI_RSA) || \ - ((defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)) && !defined(HAVE_USER_RSA))) + ((defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA)))) /* USER RSA ifdef portions used instead of refactor in consideration for possible fips build */ /* Encode a public RSA key to output. @@ -24098,19 +26096,13 @@ return BAD_FUNC_ARG; } -#ifdef HAVE_USER_RSA - nSz = SetASNIntRSA(key->n, NULL); -#else nSz = SetASNIntMP(&key->n, MAX_RSA_INT_SZ, NULL); -#endif + if (nSz < 0) return nSz; -#ifdef HAVE_USER_RSA - eSz = SetASNIntRSA(key->e, NULL); -#else eSz = SetASNIntMP(&key->e, MAX_RSA_INT_SZ, NULL); -#endif + if (eSz < 0) return eSz; seqSz = SetSequence((word32)(nSz + eSz), seq); @@ -24151,18 +26143,10 @@ XMEMCPY(output + idx, seq, seqSz); idx += seqSz; /* n */ -#ifdef HAVE_USER_RSA - nSz = SetASNIntRSA(key->n, output + idx); -#else nSz = SetASNIntMP(&key->n, nSz, output + idx); -#endif idx += (word32)nSz; /* e */ -#ifdef HAVE_USER_RSA - eSz = SetASNIntRSA(key->e, output + idx); -#else eSz = SetASNIntMP(&key->e, eSz, output + idx); -#endif idx += (word32)eSz; return (int)idx; @@ -24190,13 +26174,8 @@ dataASN[RSAPUBLICKEYASN_IDX_ALGOID_P_SEQ].noOut = 1; #endif /* Set public key mp_ints. */ - #ifdef HAVE_USER_RSA - SetASN_MP(&dataASN[RSAPUBLICKEYASN_IDX_PUBKEY_RSA_N], key->n); - SetASN_MP(&dataASN[RSAPUBLICKEYASN_IDX_PUBKEY_RSA_E], key->e); - #else SetASN_MP(&dataASN[RSAPUBLICKEYASN_IDX_PUBKEY_RSA_N], &key->n); SetASN_MP(&dataASN[RSAPUBLICKEYASN_IDX_PUBKEY_RSA_E], &key->e); - #endif /* Calculate size of RSA public key. */ ret = SizeASN_Items(rsaPublicKeyASN + o, dataASN + o, (int)rsaPublicKeyASN_Length - o, &sz); @@ -24265,11 +26244,12 @@ } #endif /* !NO_RSA && (WOLFSSL_CERT_GEN || WOLFSSL_KCAPI_RSA || - ((OPENSSL_EXTRA || WOLFSSL_KEY_GEN) && !HAVE_USER_RSA))) */ + ((OPENSSL_EXTRA || WOLFSSL_KEY_GEN))) */ +#endif /* NO_CERTS */ #if (defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || \ defined(WOLFSSL_KCAPI_RSA) || defined(WOLFSSL_SE050)) && \ - !defined(NO_RSA) && !defined(HAVE_USER_RSA) + !defined(NO_RSA) /* Encode private RSA key in DER format. * @@ -24286,11 +26266,16 @@ { #ifndef WOLFSSL_ASN_TEMPLATE int ret = 0, i; + int mpSz; word32 seqSz = 0, verSz = 0, intTotalLen = 0, outLen = 0; word32 sizes[RSA_INTS]; byte seq[MAX_SEQ_SZ]; byte ver[MAX_VERSION_SZ]; + mp_int* keyInt; +#ifndef WOLFSSL_NO_MALLOC + word32 rawLen; byte* tmps[RSA_INTS]; +#endif if (key == NULL) return BAD_FUNC_ARG; @@ -24298,18 +26283,18 @@ if (key->type != RSA_PRIVATE) return BAD_FUNC_ARG; +#ifndef WOLFSSL_NO_MALLOC for (i = 0; i < RSA_INTS; i++) tmps[i] = NULL; +#endif /* write all big ints from key to DER tmps */ for (i = 0; i < RSA_INTS; i++) { - mp_int* keyInt = GetRsaInt(key, i); - int mpSz; - word32 rawLen; - + keyInt = GetRsaInt(key, i); ret = mp_unsigned_bin_size(keyInt); if (ret < 0) - return ret; + break; +#ifndef WOLFSSL_NO_MALLOC rawLen = (word32)ret + 1; ret = 0; if (output != NULL) { @@ -24320,8 +26305,11 @@ break; } } - mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]); +#else + ret = 0; + mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, NULL); +#endif if (mpSz < 0) { ret = mpSz; break; @@ -24353,15 +26341,33 @@ j += verSz; for (i = 0; i < RSA_INTS; i++) { +/* copy from tmps if we have malloc, otherwise re-export with buffer */ +#ifndef WOLFSSL_NO_MALLOC XMEMCPY(output + j, tmps[i], sizes[i]); j += sizes[i]; +#else + keyInt = GetRsaInt(key, i); + ret = mp_unsigned_bin_size(keyInt); + if (ret < 0) + break; + ret = 0; + /* This won't overrun output due to the outLen check above */ + mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, output + j); + if (mpSz < 0) { + ret = mpSz; + break; + } + j += mpSz; +#endif } } +#ifndef WOLFSSL_NO_MALLOC for (i = 0; i < RSA_INTS; i++) { if (tmps[i]) XFREE(tmps[i], key->heap, DYNAMIC_TYPE_RSA); } +#endif if (ret == 0) ret = (int)outLen; @@ -24408,8 +26414,9 @@ #endif } -#endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA && !HAVE_USER_RSA */ +#endif /* (WOLFSSL_KEY_GEN || OPENSSL_EXTRA) && !NO_RSA */ +#ifndef NO_CERTS #ifdef WOLFSSL_CERT_GEN @@ -24590,7 +26597,7 @@ int keyUsageSz; /* encoded KeyUsage extension length */ int extKeyUsageSz; /* encoded ExtendedKeyUsage extension length */ #ifndef IGNORE_NETSCAPE_CERT_TYPE - int nsCertTypeSz; /* encoded Netscape Certifcate Type + int nsCertTypeSz; /* encoded Netscape Certificate Type * extension length */ #endif int certPoliciesSz; /* encoded CertPolicies extension length*/ @@ -24670,7 +26677,7 @@ InitDecodedCert_ex((DecodedCert*)cert->decodedCert, der, derSz, cert->heap, devId); ret = ParseCertRelative((DecodedCert*)cert->decodedCert, - CERT_TYPE, 0, NULL); + CERT_TYPE, 0, NULL, NULL); if (ret >= 0) { cert->der = (byte*)der; } @@ -24685,477 +26692,6 @@ #endif /* WOLFSSL_CERT_GEN */ -#ifdef HAVE_ECC -#ifdef WOLFSSL_ASN_TEMPLATE -/* ASN.1 template for ECC public key (SubjectPublicKeyInfo). - * RFC 5480, 2 - Subject Public Key Information Fields - * 2.1.1 - Unrestricted Algorithm Identifier and Parameters - * X9.62 ECC point format. - * See ASN.1 template 'eccSpecifiedASN' for specifiedCurve. - */ -static const ASNItem eccPublicKeyASN[] = { -/* SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, - /* AlgorithmIdentifier */ -/* ALGOID_SEQ */ { 1, ASN_SEQUENCE, 1, 1, 0 }, - /* algorithm */ -/* ALGOID_OID */ { 2, ASN_OBJECT_ID, 0, 0, 0 }, - /* namedCurve */ -/* ALGOID_CURVEID */ { 2, ASN_OBJECT_ID, 0, 0, 2 }, - /* specifiedCurve - explicit parameters */ -/* ALGOID_PARAMS */ { 2, ASN_SEQUENCE, 1, 0, 2 }, - /* Public Key */ -/* PUBKEY */ { 1, ASN_BIT_STRING, 0, 0, 0 }, -}; -enum { - ECCPUBLICKEYASN_IDX_SEQ = 0, - ECCPUBLICKEYASN_IDX_ALGOID_SEQ, - ECCPUBLICKEYASN_IDX_ALGOID_OID, - ECCPUBLICKEYASN_IDX_ALGOID_CURVEID, - ECCPUBLICKEYASN_IDX_ALGOID_PARAMS, - ECCPUBLICKEYASN_IDX_PUBKEY -}; - -/* Number of items in ASN.1 template for ECC public key. */ -#define eccPublicKeyASN_Length (sizeof(eccPublicKeyASN) / sizeof(ASNItem)) -#endif /* WOLFSSL_ASN_TEMPLATE */ -#endif /* HAVE_ECC */ - -#if defined(HAVE_ECC) && defined(HAVE_ECC_KEY_EXPORT) - -/* Encode public ECC key in DER format. - * - * RFC 5480, 2 - Subject Public Key Information Fields - * 2.1.1 - Unrestricted Algorithm Identifier and Parameters - * X9.62 ECC point format. - * SEC 1 Ver. 2.0, C.2 - Syntax for Elliptic Curve Domain Parameters - * - * @param [out] output Buffer to put encoded data in. - * @param [in] key ECC key object. - * @param [in] outLen Size of buffer in bytes. - * @param [in] with_header Whether to use SubjectPublicKeyInfo format. - * @return Size of encoded data in bytes on success. - * @return BAD_FUNC_ARG when key or key's parameters is NULL. - * @return MEMORY_E when dynamic memory allocation failed. - */ -static int SetEccPublicKey(byte* output, ecc_key* key, int outLen, - int with_header, int comp) -{ -#ifndef WOLFSSL_ASN_TEMPLATE - int ret; - word32 idx = 0, curveSz, algoSz, pubSz, bitStringSz; - byte bitString[1 + MAX_LENGTH_SZ + 1]; /* 6 */ - byte algo[MAX_ALGO_SZ]; /* 20 */ - - /* public size */ - pubSz = key->dp ? (word32)key->dp->size : MAX_ECC_BYTES; - if (comp) - pubSz = 1 + pubSz; - else - pubSz = 1 + 2 * pubSz; - - /* check for buffer overflow */ - if (output != NULL && pubSz > (word32)outLen) { - return BUFFER_E; - } - - /* headers */ - if (with_header) { - ret = SetCurve(key, NULL, 0); - if (ret <= 0) { - return ret; - } - curveSz = (word32)ret; - ret = 0; - - /* calculate size */ - algoSz = SetAlgoID(ECDSAk, algo, oidKeyType, (int)curveSz); - bitStringSz = SetBitString(pubSz, 0, bitString); - idx = SetSequence(pubSz + curveSz + bitStringSz + algoSz, NULL); - - /* check for buffer overflow */ - if (output != NULL && - curveSz + algoSz + bitStringSz + idx + pubSz > (word32)outLen) { - return BUFFER_E; - } - - idx = SetSequence(pubSz + curveSz + bitStringSz + algoSz, - output); - /* algo */ - if (output) - XMEMCPY(output + idx, algo, algoSz); - idx += algoSz; - /* curve */ - if (output) - (void)SetCurve(key, output + idx, curveSz); - idx += curveSz; - /* bit string */ - if (output) - XMEMCPY(output + idx, bitString, bitStringSz); - idx += bitStringSz; - } - - /* pub */ - if (output) { - PRIVATE_KEY_UNLOCK(); - ret = wc_ecc_export_x963_ex(key, output + idx, &pubSz, comp); - PRIVATE_KEY_LOCK(); - if (ret != 0) { - return ret; - } - } - idx += pubSz; - - return (int)idx; -#else - word32 pubSz = 0; - int sz = 0; - int ret = 0; - int curveIdSz = 0; - byte* curveOid = NULL; - - /* Check key validity. */ - if ((key == NULL) || (key->dp == NULL)) { - ret = BAD_FUNC_ARG; - } - - if (ret == 0) { - /* Calculate the size of the encoded public point. */ - PRIVATE_KEY_UNLOCK(); - #if defined(HAVE_COMP_KEY) && defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION == 2) - /* in earlier versions of FIPS the get length functionality is not - * available with compressed keys */ - pubSz = key->dp ? key->dp->size : MAX_ECC_BYTES; - if (comp) - pubSz = 1 + pubSz; - else - pubSz = 1 + 2 * pubSz; - ret = LENGTH_ONLY_E; - #else - ret = wc_ecc_export_x963_ex(key, NULL, &pubSz, comp); - #endif - PRIVATE_KEY_LOCK(); - /* LENGTH_ONLY_E on success. */ - if (ret == LENGTH_ONLY_E) { - ret = 0; - } - } - if ((ret == 0) && with_header) { - /* Including SubjectPublicKeyInfo header. */ - DECL_ASNSETDATA(dataASN, eccPublicKeyASN_Length); - - CALLOC_ASNSETDATA(dataASN, eccPublicKeyASN_Length, ret, key->heap); - - /* Get the length of the named curve OID to put into the encoding. */ - curveIdSz = SetCurve(key, NULL, 0); - if (curveIdSz < 0) { - ret = curveIdSz; - } - - if (ret == 0) { - /* Set the key type OID. */ - SetASN_OID(&dataASN[ECCPUBLICKEYASN_IDX_ALGOID_OID], ECDSAk, - oidKeyType); - /* Set the curve OID. */ - SetASN_ReplaceBuffer(&dataASN[ECCPUBLICKEYASN_IDX_ALGOID_CURVEID], - NULL, (word32)curveIdSz); - /* Don't try to write out explicit parameters. */ - dataASN[ECCPUBLICKEYASN_IDX_ALGOID_PARAMS].noOut = 1; - /* Set size of public point to ensure space is made for it. */ - SetASN_Buffer(&dataASN[ECCPUBLICKEYASN_IDX_PUBKEY], NULL, pubSz); - /* Calculate size of ECC public key. */ - ret = SizeASN_Items(eccPublicKeyASN, dataASN, - eccPublicKeyASN_Length, &sz); - } - - /* Check buffer, if passed in, is big enough for encoded data. */ - if ((ret == 0) && (output != NULL) && (sz > outLen)) { - ret = BUFFER_E; - } - if ((ret == 0) && (output != NULL)) { - /* Encode ECC public key. */ - SetASN_Items(eccPublicKeyASN, dataASN, eccPublicKeyASN_Length, - output); - /* Skip to where public point is to be encoded. */ - output += sz - (int)pubSz; - /* Cache the location to place the name curve OID. */ - curveOid = (byte*) - dataASN[ECCPUBLICKEYASN_IDX_ALGOID_CURVEID].data.buffer.data; - } - - FREE_ASNSETDATA(dataASN, key->heap); - } - else if ((ret == 0) && (output != NULL) && (pubSz > (word32)outLen)) { - ret = BUFFER_E; - } - else { - /* Total size is the public point size. */ - sz = (int)pubSz; - } - - if ((ret == 0) && (output != NULL)) { - /* Put named curve OID data into encoding. */ - curveIdSz = SetCurve(key, curveOid, (size_t)curveIdSz); - if (curveIdSz < 0) { - ret = curveIdSz; - } - } - if ((ret == 0) && (output != NULL)) { - /* Encode public point. */ - PRIVATE_KEY_UNLOCK(); - ret = wc_ecc_export_x963_ex(key, output, &pubSz, comp); - PRIVATE_KEY_LOCK(); - } - if (ret == 0) { - /* Return the size of the encoding. */ - ret = sz; - } - - return ret; -#endif -} - - -/* Encode the public part of an ECC key in a DER. - * - * Pass NULL for output to get the size of the encoding. - * - * @param [in] key ECC key object. - * @param [out] output Buffer to hold DER encoding. - * @param [in] inLen Size of buffer in bytes. - * @param [in] with_AlgCurve Whether to use SubjectPublicKeyInfo format. - * @return Size of encoded data in bytes on success. - * @return BAD_FUNC_ARG when key or key's parameters is NULL. - * @return MEMORY_E when dynamic memory allocation failed. - */ -WOLFSSL_ABI -int wc_EccPublicKeyToDer(ecc_key* key, byte* output, word32 inLen, - int with_AlgCurve) -{ - return SetEccPublicKey(output, key, (int)inLen, with_AlgCurve, 0); -} - -int wc_EccPublicKeyToDer_ex(ecc_key* key, byte* output, word32 inLen, - int with_AlgCurve, int comp) -{ - return SetEccPublicKey(output, key, (int)inLen, with_AlgCurve, comp); -} - -int wc_EccPublicKeyDerSize(ecc_key* key, int with_AlgCurve) -{ - return SetEccPublicKey(NULL, key, 0, with_AlgCurve, 0); -} - -#endif /* HAVE_ECC && HAVE_ECC_KEY_EXPORT */ - -#ifdef WOLFSSL_ASN_TEMPLATE -#if defined(WC_ENABLE_ASYM_KEY_EXPORT) || defined(WC_ENABLE_ASYM_KEY_IMPORT) -/* ASN.1 template for Ed25519 and Ed448 public key (SubkectPublicKeyInfo). - * RFC 8410, 4 - Subject Public Key Fields - */ -static const ASNItem edPubKeyASN[] = { - /* SubjectPublicKeyInfo */ -/* SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, - /* AlgorithmIdentifier */ -/* ALGOID_SEQ */ { 1, ASN_SEQUENCE, 1, 1, 0 }, - /* Ed25519/Ed448 OID */ -/* ALGOID_OID */ { 2, ASN_OBJECT_ID, 0, 0, 1 }, - /* Public key stream */ -/* PUBKEY */ { 1, ASN_BIT_STRING, 0, 0, 0 }, -}; -enum { - EDPUBKEYASN_IDX_SEQ = 0, - EDPUBKEYASN_IDX_ALGOID_SEQ, - EDPUBKEYASN_IDX_ALGOID_OID, - EDPUBKEYASN_IDX_PUBKEY -}; - -/* Number of items in ASN.1 template for Ed25519 and Ed448 public key. */ -#define edPubKeyASN_Length (sizeof(edPubKeyASN) / sizeof(ASNItem)) -#endif /* WC_ENABLE_ASYM_KEY_EXPORT || WC_ENABLE_ASYM_KEY_IMPORT */ -#endif /* WOLFSSL_ASN_TEMPLATE */ - -#ifdef WC_ENABLE_ASYM_KEY_EXPORT - -/* Build ASN.1 formatted public key based on RFC 8410 - * - * Pass NULL for output to get the size of the encoding. - * - * @param [in] pubKey public key buffer - * @param [in] pubKeyLen public ket buffer length - * @param [out] output Buffer to put encoded data in (optional) - * @param [in] outLen Size of buffer in bytes - * @param [in] keyType is "enum Key_Sum" like ED25519k - * @param [in] withHeader Whether to include SubjectPublicKeyInfo around key. - * @return Size of encoded data in bytes on success - * @return BAD_FUNC_ARG when key is NULL. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int SetAsymKeyDerPublic(const byte* pubKey, word32 pubKeyLen, - byte* output, word32 outLen, int keyType, int withHeader) -{ - int ret = 0; -#ifndef WOLFSSL_ASN_TEMPLATE - word32 idx = 0; - word32 seqDataSz = 0; - word32 sz; -#else - int sz = 0; - DECL_ASNSETDATA(dataASN, edPubKeyASN_Length); -#endif - - if (pubKey == NULL) { - return BAD_FUNC_ARG; - } - -#ifndef WOLFSSL_ASN_TEMPLATE - /* calculate size */ - if (withHeader) { - word32 algoSz = SetAlgoID(keyType, NULL, oidKeyType, 0); - word32 bitStringSz = SetBitString(pubKeyLen, 0, NULL); - - seqDataSz = algoSz + bitStringSz + pubKeyLen; - sz = SetSequence(seqDataSz, NULL) + seqDataSz; - } - else { - sz = pubKeyLen; - } - - /* checkout output size */ - if (output != NULL && sz > outLen) { - ret = BUFFER_E; - } - - /* headers */ - if (ret == 0 && output != NULL && withHeader) { - /* sequence */ - idx = SetSequence(seqDataSz, output); - /* algo */ - idx += SetAlgoID(keyType, output + idx, oidKeyType, 0); - /* bit string */ - idx += SetBitString(pubKeyLen, 0, output + idx); - } - - if (ret == 0 && output != NULL) { - /* pub */ - XMEMCPY(output + idx, pubKey, pubKeyLen); - idx += pubKeyLen; - - sz = idx; - } - - if (ret == 0) { - ret = (int)sz; - } -#else - if (withHeader) { - CALLOC_ASNSETDATA(dataASN, edPubKeyASN_Length, ret, NULL); - - if (ret == 0) { - /* Set the OID. */ - SetASN_OID(&dataASN[EDPUBKEYASN_IDX_ALGOID_OID], (word32)keyType, - oidKeyType); - /* Leave space for public point. */ - SetASN_Buffer(&dataASN[EDPUBKEYASN_IDX_PUBKEY], NULL, pubKeyLen); - /* Calculate size of public key encoding. */ - ret = SizeASN_Items(edPubKeyASN, dataASN, edPubKeyASN_Length, &sz); - } - if ((ret == 0) && (output != NULL) && (sz > (int)outLen)) { - ret = BUFFER_E; - } - if ((ret == 0) && (output != NULL)) { - /* Encode public key. */ - SetASN_Items(edPubKeyASN, dataASN, edPubKeyASN_Length, output); - /* Set location to encode public point. */ - output = (byte*)dataASN[EDPUBKEYASN_IDX_PUBKEY].data.buffer.data; - } - - FREE_ASNSETDATA(dataASN, NULL); - } - else if ((output != NULL) && (pubKeyLen > outLen)) { - ret = BUFFER_E; - } - else if (ret == 0) { - sz = (int)pubKeyLen; - } - - if ((ret == 0) && (output != NULL)) { - /* Put public key into space provided. */ - XMEMCPY(output, pubKey, pubKeyLen); - } - if (ret == 0) { - ret = sz; - } -#endif /* WOLFSSL_ASN_TEMPLATE */ - return ret; -} -#endif /* WC_ENABLE_ASYM_KEY_EXPORT */ - -#if defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_EXPORT) -/* Encode the public part of an Ed25519 key in DER. - * - * Pass NULL for output to get the size of the encoding. - * - * @param [in] key Ed25519 key object. - * @param [out] output Buffer to put encoded data in. - * @param [in] outLen Size of buffer in bytes. - * @param [in] withAlg Whether to use SubjectPublicKeyInfo format. - * @return Size of encoded data in bytes on success. - * @return BAD_FUNC_ARG when key is NULL. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int wc_Ed25519PublicKeyToDer(ed25519_key* key, byte* output, word32 inLen, - int withAlg) -{ - int ret; - byte pubKey[ED25519_PUB_KEY_SIZE]; - word32 pubKeyLen = (word32)sizeof(pubKey); - - if (key == NULL) { - return BAD_FUNC_ARG; - } - - ret = wc_ed25519_export_public(key, pubKey, &pubKeyLen); - if (ret == 0) { - ret = SetAsymKeyDerPublic(pubKey, pubKeyLen, output, inLen, - ED25519k, withAlg); - } - return ret; -} -#endif /* HAVE_ED25519 && HAVE_ED25519_KEY_EXPORT */ - -#if defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT) -/* Encode the public part of an Ed448 key in DER. - * - * Pass NULL for output to get the size of the encoding. - * - * @param [in] key Ed448 key object. - * @param [out] output Buffer to put encoded data in. - * @param [in] outLen Size of buffer in bytes. - * @param [in] withAlg Whether to use SubjectPublicKeyInfo format. - * @return Size of encoded data in bytes on success. - * @return BAD_FUNC_ARG when key is NULL. - * @return MEMORY_E when dynamic memory allocation failed. - */ -int wc_Ed448PublicKeyToDer(ed448_key* key, byte* output, word32 inLen, - int withAlg) -{ - int ret; - byte pubKey[ED448_PUB_KEY_SIZE]; - word32 pubKeyLen = (word32)sizeof(pubKey); - - if (key == NULL) { - return BAD_FUNC_ARG; - } - - ret = wc_ed448_export_public(key, pubKey, &pubKeyLen); - if (ret == 0) { - ret = SetAsymKeyDerPublic(pubKey, pubKeyLen, output, inLen, - ED448k, withAlg); - } - return ret; -} -#endif /* HAVE_ED448 && HAVE_ED448_KEY_EXPORT */ #ifdef WOLFSSL_CERT_GEN #ifndef NO_ASN_TIME @@ -25447,10 +26983,9 @@ return (int)sizeof(caPathLenBasicConstASN1); } - -/* encode CA basic constraints true +/* encode CA basic constraints * return total bytes written */ -static int SetCa(byte* out, word32 outSz) +static int SetCaEx(byte* out, word32 outSz, byte isCa) { /* ASN1->DER sequence for Basic Constraints True */ const byte caBasicConstASN1[] = { @@ -25466,9 +27001,20 @@ XMEMCPY(out, caBasicConstASN1, sizeof(caBasicConstASN1)); + if (!isCa) { + out[sizeof(caBasicConstASN1)-1] = isCa; + } + return (int)sizeof(caBasicConstASN1); } +/* encode CA basic constraints true + * return total bytes written */ +static int SetCa(byte* out, word32 outSz) +{ + return SetCaEx(out, outSz, 1); +} + /* encode basic constraints without CA Boolean * return total bytes written */ static int SetBC(byte* out, word32 outSz) @@ -26261,6 +27807,12 @@ firstSz = cname->custom.oidSz; break; #endif + #ifdef WOLFSSL_CERT_REQ + case ASN_CONTENT_TYPE: + thisLen += (int)sizeof(attrPkcs9ContentTypeOid); + firstSz = (int)sizeof(attrPkcs9ContentTypeOid); + break; + #endif default: thisLen += DN_OID_SZ; firstSz = DN_OID_SZ; @@ -26325,6 +27877,15 @@ name->encoded[idx++] = nameTag; break; #endif + #ifdef WOLFSSL_CERT_REQ + case ASN_CONTENT_TYPE: + XMEMCPY(name->encoded + idx, attrPkcs9ContentTypeOid, + sizeof(attrPkcs9ContentTypeOid)); + idx += (int)sizeof(attrPkcs9ContentTypeOid); + /* str type */ + name->encoded[idx++] = nameTag; + break; + #endif default: name->encoded[idx++] = 0x55; name->encoded[idx++] = 0x04; @@ -26352,14 +27913,25 @@ int ret = 0; int sz = 0; const byte* oid; - word32 oidSz; - word32 nameSz; + word32 oidSz = 0; + word32 nameSz = 0; /* Validate input parameters. */ if ((name == NULL) || (nameStr == NULL)) { ret = BAD_FUNC_ARG; } +#ifdef WOLFSSL_CUSTOM_OID + if (ret == 0 && type == ASN_CUSTOM_NAME) { + if (cname == NULL || cname->custom.oidSz == 0) { + name->used = 0; + return 0; + } + } +#else + (void)cname; +#endif + CALLOC_ASNSETDATA(dataASN, rdnASN_Length, ret, NULL); if (ret == 0) { nameSz = (word32)XSTRLEN(nameStr); @@ -26397,6 +27969,12 @@ oidSz = cname->custom.oidSz; break; #endif + #ifdef WOLFSSL_CERT_REQ + case ASN_CONTENT_TYPE: + oid = attrPkcs9ContentTypeOid; + oidSz = sizeof(attrPkcs9ContentTypeOid); + break; + #endif default: /* Construct OID using type. */ dnOid[2] = type; @@ -26455,6 +28033,132 @@ } #endif /* WOLFSSL_CERT_GEN || OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ +#if (defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT)) || \ + (defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) + +/* Convert key usage string (comma delimited, null terminated) to word16 + * Returns 0 on success, negative on error */ +int ParseKeyUsageStr(const char* value, word16* keyUsage, void* heap) +{ + int ret = 0; + char *token, *str, *ptr; + word32 len = 0; + word16 usage = 0; + + if (value == NULL || keyUsage == NULL) { + return BAD_FUNC_ARG; + } + + /* duplicate string (including terminator) */ + len = (word32)XSTRLEN(value); + str = (char*)XMALLOC(len + 1, heap, DYNAMIC_TYPE_TMP_BUFFER); + if (str == NULL) { + return MEMORY_E; + } + XMEMCPY(str, value, len + 1); + + /* parse value, and set corresponding Key Usage value */ + if ((token = XSTRTOK(str, ",", &ptr)) == NULL) { + XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER); + return KEYUSAGE_E; + } + while (token != NULL) { + if (!XSTRCASECMP(token, "digitalSignature")) + usage |= KEYUSE_DIGITAL_SIG; + else if (!XSTRCASECMP(token, "nonRepudiation") || + !XSTRCASECMP(token, "contentCommitment")) + usage |= KEYUSE_CONTENT_COMMIT; + else if (!XSTRCASECMP(token, "keyEncipherment")) + usage |= KEYUSE_KEY_ENCIPHER; + else if (!XSTRCASECMP(token, "dataEncipherment")) + usage |= KEYUSE_DATA_ENCIPHER; + else if (!XSTRCASECMP(token, "keyAgreement")) + usage |= KEYUSE_KEY_AGREE; + else if (!XSTRCASECMP(token, "keyCertSign")) + usage |= KEYUSE_KEY_CERT_SIGN; + else if (!XSTRCASECMP(token, "cRLSign")) + usage |= KEYUSE_CRL_SIGN; + else if (!XSTRCASECMP(token, "encipherOnly")) + usage |= KEYUSE_ENCIPHER_ONLY; + else if (!XSTRCASECMP(token, "decipherOnly")) + usage |= KEYUSE_DECIPHER_ONLY; + else { + ret = KEYUSAGE_E; + break; + } + + token = XSTRTOK(NULL, ",", &ptr); + } + + XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER); + + if (ret == 0) { + *keyUsage = usage; + } + + return ret; +} + +/* Convert extended key usage string (comma delimited, null terminated) to byte + * Returns 0 on success, negative on error */ +int ParseExtKeyUsageStr(const char* value, byte* extKeyUsage, void* heap) +{ + int ret = 0; + char *token, *str, *ptr; + word32 len = 0; + byte usage = 0; + + if (value == NULL || extKeyUsage == NULL) { + return BAD_FUNC_ARG; + } + + /* duplicate string (including terminator) */ + len = (word32)XSTRLEN(value); + str = (char*)XMALLOC(len + 1, heap, DYNAMIC_TYPE_TMP_BUFFER); + if (str == NULL) { + return MEMORY_E; + } + XMEMCPY(str, value, len + 1); + + /* parse value, and set corresponding Key Usage value */ + if ((token = XSTRTOK(str, ",", &ptr)) == NULL) { + XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER); + return EXTKEYUSAGE_E; + } + while (token != NULL) { + if (!XSTRCASECMP(token, "any")) + usage |= EXTKEYUSE_ANY; + else if (!XSTRCASECMP(token, "serverAuth")) + usage |= EXTKEYUSE_SERVER_AUTH; + else if (!XSTRCASECMP(token, "clientAuth")) + usage |= EXTKEYUSE_CLIENT_AUTH; + else if (!XSTRCASECMP(token, "codeSigning")) + usage |= EXTKEYUSE_CODESIGN; + else if (!XSTRCASECMP(token, "emailProtection")) + usage |= EXTKEYUSE_EMAILPROT; + else if (!XSTRCASECMP(token, "timeStamping")) + usage |= EXTKEYUSE_TIMESTAMP; + else if (!XSTRCASECMP(token, "OCSPSigning")) + usage |= EXTKEYUSE_OCSP_SIGN; + else { + ret = EXTKEYUSAGE_E; + break; + } + + token = XSTRTOK(NULL, ",", &ptr); + } + + XFREE(str, heap, DYNAMIC_TYPE_TMP_BUFFER); + + if (ret == 0) { + *extKeyUsage = usage; + } + + return ret; +} + +#endif /* (CERT_GEN && CERT_EXT) || (OPENSSL_ALL || OPENSSL_EXTRA) */ + #ifdef WOLFSSL_CERT_GEN /* Encodes one attribute of the name (issuer/subject) * call we_EncodeName_ex with 0x16, IA5String for email type @@ -26827,7 +28531,8 @@ static int EncodePublicKey(int keyType, byte* output, int outLen, RsaKey* rsaKey, ecc_key* eccKey, ed25519_key* ed25519Key, ed448_key* ed448Key, - DsaKey* dsaKey) + DsaKey* dsaKey, falcon_key* falconKey, + dilithium_key* dilithiumKey, sphincs_key* sphincsKey) { int ret = 0; @@ -26837,6 +28542,9 @@ (void)ed25519Key; (void)ed448Key; (void)dsaKey; + (void)falconKey; + (void)dilithiumKey; + (void)sphincsKey; switch (keyType) { #ifndef NO_RSA @@ -26872,6 +28580,41 @@ } break; #endif + #if defined(HAVE_FALCON) + case FALCON_LEVEL1_KEY: + case FALCON_LEVEL5_KEY: + ret = wc_Falcon_PublicKeyToDer(falconKey, output, + (word32)outLen, 1); + if (ret <= 0) { + ret = PUBLIC_KEY_E; + } + break; + #endif /* HAVE_FALCON */ + #if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_ASN1) + case DILITHIUM_LEVEL2_KEY: + case DILITHIUM_LEVEL3_KEY: + case DILITHIUM_LEVEL5_KEY: + ret = wc_Dilithium_PublicKeyToDer(dilithiumKey, output, + (word32)outLen, 1); + if (ret <= 0) { + ret = PUBLIC_KEY_E; + } + break; + #endif /* HAVE_DILITHIUM */ + #if defined(HAVE_SPHINCS) + case SPHINCS_FAST_LEVEL1_KEY: + case SPHINCS_FAST_LEVEL3_KEY: + case SPHINCS_FAST_LEVEL5_KEY: + case SPHINCS_SMALL_LEVEL1_KEY: + case SPHINCS_SMALL_LEVEL3_KEY: + case SPHINCS_SMALL_LEVEL5_KEY: + ret = wc_Sphincs_PublicKeyToDer(sphincsKey, output, + (word32)outLen, 1); + if (ret <= 0) { + ret = PUBLIC_KEY_E; + } + break; + #endif /* HAVE_SPHINCS */ default: ret = PUBLIC_KEY_E; break; @@ -26933,6 +28676,17 @@ /* CRLINFO_SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, /* CRLINFO_OID */ { 1, ASN_OBJECT_ID, 0, 0, 0 }, /* CRLINFO_STR */ { 1, ASN_OCTET_STRING, 0, 0, 0 }, +#ifdef WOLFSSL_DUAL_ALG_CERTS +/* SAPKI_SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, +/* SAPKI_OID */ { 1, ASN_OBJECT_ID, 0, 0, 0 }, +/* SAPKI_STR */ { 1, ASN_OCTET_STRING, 0, 0, 0 }, +/* ALTSIGALG_SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, +/* ALTSIGALG_OID */ { 1, ASN_OBJECT_ID, 0, 0, 0 }, +/* ALTSIGALG_STR */ { 1, ASN_OCTET_STRING, 0, 0, 0 }, +/* ALTSIGVAL_SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, +/* ALTSIGVAL_OID */ { 1, ASN_OBJECT_ID, 0, 0, 0 }, +/* ALTSIGVAL_STR */ { 1, ASN_OCTET_STRING, 0, 0, 0 }, +#endif /* WOLFSSL_DUAL_ALG_CERTS */ /* CUSTOM_SEQ */ { 0, ASN_SEQUENCE, 1, 1, 0 }, /* CUSTOM_OID */ { 1, ASN_OBJECT_ID, 0, 0, 0 }, /* CUSTOM_STR */ { 1, ASN_OCTET_STRING, 0, 0, 0 }, @@ -26976,6 +28730,17 @@ CERTEXTSASN_IDX_CRLINFO_SEQ, CERTEXTSASN_IDX_CRLINFO_OID, CERTEXTSASN_IDX_CRLINFO_STR, +#ifdef WOLFSSL_DUAL_ALG_CERTS + CERTEXTSASN_IDX_SAPKI_SEQ, + CERTEXTSASN_IDX_SAPKI_OID, + CERTEXTSASN_IDX_SAPKI_STR, + CERTEXTSASN_IDX_ALTSIGALG_SEQ, + CERTEXTSASN_IDX_ALTSIGALG_OID, + CERTEXTSASN_IDX_ALTSIGALG_STR, + CERTEXTSASN_IDX_ALTSIGVAL_SEQ, + CERTEXTSASN_IDX_ALTSIGVAL_OID, + CERTEXTSASN_IDX_ALTSIGVAL_STR, +#endif /* WOLFSSL_DUAL_ALG_CERTS */ CERTEXTSASN_IDX_CUSTOM_SEQ, CERTEXTSASN_IDX_CUSTOM_OID, CERTEXTSASN_IDX_CUSTOM_STR, @@ -26998,7 +28763,7 @@ int forRequest) { DECL_ASNSETDATA(dataASN, certExtsASN_Length); - int sz; + int sz = 0; int ret = 0; int i = 0; static const byte bcOID[] = { 0x55, 0x1d, 0x13 }; @@ -27014,7 +28779,12 @@ static const byte nsCertOID[] = { 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x42, 0x01, 0x01 }; static const byte crlInfoOID[] = { 0x55, 0x1D, 0x1F }; -#endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + static const byte sapkiOID[] = { 0x55, 0x1d, 0x48 }; + static const byte altSigAlgOID[] = { 0x55, 0x1d, 0x49 }; + static const byte altSigValOID[] = { 0x55, 0x1d, 0x4a }; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ +#endif /* WOLFSSL_CERT_EXT */ #ifdef WOLFSSL_SMALL_STACK #if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_CERT_EXT) @@ -27072,6 +28842,13 @@ dataASN[CERTEXTSASN_IDX_BC_PATHLEN].noOut = 1; } } + #ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE + else if (cert->isCaSet) { + SetASN_Boolean(&dataASN[CERTEXTSASN_IDX_BC_CA], 0); + SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_BC_OID], bcOID, sizeof(bcOID)); + dataASN[CERTEXTSASN_IDX_BC_PATHLEN].noOut = 1; + } + #endif else if (cert->basicConstSet) { /* Set Basic Constraints to be a non Certificate Authority. */ SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_BC_OID], bcOID, sizeof(bcOID)); @@ -27127,7 +28904,7 @@ #ifdef WOLFSSL_AKID_NAME if (cert->rawAkid) { SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_AKID_STR], - cert->akid, cert->akidSz); + cert->akid, (word32)cert->akidSz); /* cert->akid contains the internal ext structure */ SetASNItem_NoOutBelow(dataASN, certExtsASN, CERTEXTSASN_IDX_AKID_STR, certExtsASN_Length); @@ -27239,6 +29016,47 @@ CERTEXTSASN_IDX_CRLINFO_STR); } + #ifdef WOLFSSL_DUAL_ALG_CERTS + if (cert->sapkiDer != NULL) { + /* Set subject alternative public key info OID and data. */ + SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_SAPKI_OID], sapkiOID, + sizeof(sapkiOID)); + SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_SAPKI_STR], cert->sapkiDer, + cert->sapkiLen); + } + else { + /* Don't write out subject alternative public key info. */ + SetASNItem_NoOut(dataASN, CERTEXTSASN_IDX_SAPKI_SEQ, + CERTEXTSASN_IDX_SAPKI_STR); + } + + if (cert->altSigAlgDer != NULL) { + /* Set alternative signature algorithm OID and data. */ + SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_ALTSIGALG_OID], altSigAlgOID, + sizeof(altSigAlgOID)); + SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_ALTSIGALG_STR], + cert->altSigAlgDer, cert->altSigAlgLen); + } + else { + /* Don't write out alternative signature algorithm. */ + SetASNItem_NoOut(dataASN, CERTEXTSASN_IDX_ALTSIGALG_SEQ, + CERTEXTSASN_IDX_ALTSIGALG_STR); + } + + if (cert->altSigValDer != NULL) { + /* Set alternative signature value OID and data. */ + SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_ALTSIGVAL_OID], altSigValOID, + sizeof(altSigValOID)); + SetASN_Buffer(&dataASN[CERTEXTSASN_IDX_ALTSIGVAL_STR], + cert->altSigValDer, cert->altSigValLen); + } + else { + /* Don't write out alternative signature value. */ + SetASNItem_NoOut(dataASN, CERTEXTSASN_IDX_ALTSIGVAL_SEQ, + CERTEXTSASN_IDX_ALTSIGVAL_STR); + } + #endif /* WOLFSSL_DUAL_ALG_CERTS */ + #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CUSTOM_OID) /* encode a custom oid and value */ if (cert->extCustom.oidSz > 0) { @@ -27383,7 +29201,7 @@ /* subtract 1 day of seconds for more compliance */ then = now - 86400; expandedTime = XGMTIME(&then, tmpTime); - if (expandedTime == NULL) { + if (ValidateGmtime(expandedTime)) { WOLFSSL_MSG("XGMTIME failed"); return 0; /* error */ } @@ -27402,7 +29220,7 @@ /* add daysValid of seconds */ then = now + (daysValid * (time_t)86400); expandedTime = XGMTIME(&then, tmpTime); - if (expandedTime == NULL) { + if (ValidateGmtime(expandedTime)) { WOLFSSL_MSG("XGMTIME failed"); return 0; /* error */ } @@ -27451,7 +29269,7 @@ /* subtract 1 day of seconds for more compliance */ then = now - 86400; expandedTime = XGMTIME(&then, tmpTime); - if (expandedTime == NULL) { + if (ValidateGmtime(expandedTime)) { WOLFSSL_MSG("XGMTIME failed"); ret = DATE_E; } @@ -27467,7 +29285,7 @@ /* add daysValid of seconds */ then = now + (daysValid * (time_t)86400); expandedTime = XGMTIME(&then, tmpTime); - if (expandedTime == NULL) { + if (ValidateGmtime(expandedTime)) { WOLFSSL_MSG("XGMTIME failed"); ret = DATE_E; } @@ -27585,7 +29403,6 @@ } #endif -#if defined(HAVE_PQC) #if defined(HAVE_FALCON) if ((cert->keyType == FALCON_LEVEL1_KEY) || (cert->keyType == FALCON_LEVEL5_KEY)) { @@ -27597,7 +29414,7 @@ (word32)sizeof(der->publicKey), 1); } #endif /* HAVE_FALCON */ -#if defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_ASN1) if ((cert->keyType == DILITHIUM_LEVEL2_KEY) || (cert->keyType == DILITHIUM_LEVEL3_KEY) || (cert->keyType == DILITHIUM_LEVEL5_KEY)) { @@ -27624,7 +29441,6 @@ (word32)sizeof(der->publicKey), 1); } #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ if (der->publicKeySz <= 0) return PUBLIC_KEY_E; @@ -27720,7 +29536,17 @@ der->extensionsSz += der->caSz; } +#ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE /* Set CA */ + else if (cert->isCaSet) { + der->caSz = SetCaEx(der->ca, sizeof(der->ca), cert->isCA); + if (der->caSz <= 0) + return EXTENSIONS_E; + + der->extensionsSz += der->caSz; + } +#endif + /* Set CA true */ else if (cert->isCA) { der->caSz = SetCa(der->ca, sizeof(der->ca)); if (der->caSz <= 0) @@ -28120,11 +29946,10 @@ } #endif /* HAVE_ED448 && HAVE_ED448_SIGN */ - #if defined(HAVE_PQC) #if defined(HAVE_FALCON) if (!rsaKey && !eccKey && !ed25519Key && !ed448Key && falconKey) { word32 outSz = sigSz; - ret = wc_falcon_sign_msg(buf, sz, sig, &outSz, falconKey); + ret = wc_falcon_sign_msg(buf, sz, sig, &outSz, falconKey, rng); if (ret == 0) ret = outSz; } @@ -28133,7 +29958,7 @@ if (!rsaKey && !eccKey && !ed25519Key && !ed448Key && !falconKey && dilithiumKey) { word32 outSz = sigSz; - ret = wc_dilithium_sign_msg(buf, sz, sig, &outSz, dilithiumKey); + ret = wc_dilithium_sign_msg(buf, sz, sig, &outSz, dilithiumKey, rng); if (ret == 0) ret = outSz; } @@ -28142,12 +29967,11 @@ if (!rsaKey && !eccKey && !ed25519Key && !ed448Key && !falconKey && !dilithiumKey && sphincsKey) { word32 outSz = sigSz; - ret = wc_sphincs_sign_msg(buf, sz, sig, &outSz, sphincsKey); + ret = wc_sphincs_sign_msg(buf, sz, sig, &outSz, sphincsKey, rng); if (ret == 0) ret = outSz; } #endif /* HAVE_SPHINCS */ - #endif /* HAVE_PQC */ break; } @@ -28155,7 +29979,7 @@ exit_ms: #ifdef WOLFSSL_ASYNC_CRYPT - if (ret == WC_PENDING_E) { + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { return ret; } #endif @@ -28287,9 +30111,15 @@ /* In place, put body between SEQUENCE and signature. */ if (ret == 0) { - /* Set sigature OID and signature data. */ + /* Set signature OID and signature data. */ SetASN_OID(&dataASN[SIGASN_IDX_SIGALGO_OID], (word32)sigAlgoType, oidSigType); + if (dataASN[SIGASN_IDX_SIGALGO_OID].data.buffer.data == NULL) { + /* The OID was not found or compiled in! */ + ret = ASN_UNKNOWN_OID_E; + } + } + if (ret == 0) { if (IsSigAlgoECC((word32)sigAlgoType)) { /* ECDSA and EdDSA doesn't have NULL tagged item. */ dataASN[SIGASN_IDX_SIGALGO_NULL].noOut = 1; @@ -28358,7 +30188,6 @@ cert->keyType = ED25519_KEY; else if (ed448Key) cert->keyType = ED448_KEY; -#ifdef HAVE_PQC #ifdef HAVE_FALCON else if ((falconKey != NULL) && (falconKey->level == 1)) cert->keyType = FALCON_LEVEL1_KEY; @@ -28393,7 +30222,6 @@ && (sphincsKey->optim == SMALL_VARIANT)) cert->keyType = SPHINCS_SMALL_LEVEL5_KEY; #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ else return BAD_FUNC_ARG; @@ -28453,7 +30281,6 @@ else if (ed448Key) { cert->keyType = ED448_KEY; } -#ifdef HAVE_PQC #ifdef HAVE_FALCON else if ((falconKey != NULL) && (falconKey->level == 1)) { cert->keyType = FALCON_LEVEL1_KEY; @@ -28499,7 +30326,6 @@ cert->keyType = SPHINCS_SMALL_LEVEL5_KEY; } #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ else { ret = BAD_FUNC_ARG; } @@ -28547,7 +30373,8 @@ if (ret >= 0) { /* Calculate public key encoding size. */ ret = EncodePublicKey(cert->keyType, NULL, 0, rsaKey, - eccKey, ed25519Key, ed448Key, dsaKey); + eccKey, ed25519Key, ed448Key, dsaKey, falconKey, + dilithiumKey, sphincsKey); publicKeySz = (word32)ret; } if (ret >= 0) { @@ -28563,8 +30390,24 @@ (byte)cert->version); SetASN_Buffer(&dataASN[X509CERTASN_IDX_TBS_SERIAL], cert->serial, (word32)cert->serialSz); - SetASN_OID(&dataASN[X509CERTASN_IDX_TBS_ALGOID_OID], - (word32)cert->sigType, oidSigType); +#ifdef WOLFSSL_DUAL_ALG_CERTS + if (cert->sigType == 0) { + /* sigOID being 0 indicates preTBS. Do not encode signature. */ + dataASN[X509CERTASN_IDX_TBS_ALGOID_SEQ].noOut = 1; + dataASN[X509CERTASN_IDX_TBS_ALGOID_OID].noOut = 1; + dataASN[X509CERTASN_IDX_TBS_ALGOID_PARAMS_NULL].noOut = 1; + #ifdef WC_RSA_PSS + dataASN[X509CERTASN_IDX_TBS_ALGOID_PARAMS].noOut = 1; + #endif + + } + else +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + { + SetASN_OID(&dataASN[X509CERTASN_IDX_TBS_ALGOID_OID], + (word32)cert->sigType, oidSigType); + } + if (IsSigAlgoECC((word32)cert->sigType)) { /* No NULL tagged item with ECDSA and EdDSA signature OIDs. */ dataASN[X509CERTASN_IDX_TBS_ALGOID_PARAMS_NULL].noOut = 1; @@ -28711,7 +30554,8 @@ .data.buffer.data, (int)dataASN[X509CERTASN_IDX_TBS_SPUBKEYINFO_SEQ] .data.buffer.length, - rsaKey, eccKey, ed25519Key, ed448Key, dsaKey); + rsaKey, eccKey, ed25519Key, ed448Key, dsaKey, + falconKey, dilithiumKey, sphincsKey); } if ((ret >= 0) && (!dataASN[X509CERTASN_IDX_TBS_EXT_SEQ].noOut)) { /* Encode extensions into buffer. */ @@ -28720,7 +30564,7 @@ dataASN[X509CERTASN_IDX_TBS_EXT_SEQ].data.buffer.length, 0); } if (ret >= 0) { - /* Store encoded certifcate body size. */ + /* Store encoded certificate body size. */ cert->bodySz = sz; /* Return the encoding size. */ ret = sz; @@ -28792,6 +30636,7 @@ NULL, NULL, NULL, NULL); } + #ifdef WOLFSSL_CERT_REQ #ifndef WOLFSSL_ASN_TEMPLATE @@ -29055,7 +30900,6 @@ (word32)sizeof(der->publicKey), 1); } #endif -#if defined(HAVE_PQC) #if defined(HAVE_FALCON) if ((cert->keyType == FALCON_LEVEL1_KEY) || (cert->keyType == FALCON_LEVEL5_KEY)) { @@ -29065,7 +30909,7 @@ der->publicKey, (word32)sizeof(der->publicKey), 1); } #endif -#if defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_ASN1) if ((cert->keyType == DILITHIUM_LEVEL2_KEY) || (cert->keyType == DILITHIUM_LEVEL3_KEY) || (cert->keyType == DILITHIUM_LEVEL5_KEY)) { @@ -29088,7 +30932,6 @@ der->publicKey, (word32)sizeof(der->publicKey), 1); } #endif -#endif /* HAVE_PQC */ if (der->publicKeySz <= 0) return PUBLIC_KEY_E; @@ -29112,7 +30955,17 @@ der->extensionsSz += der->caSz; } +#ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE /* Set CA */ + else if (cert->isCaSet) { + der->caSz = SetCaEx(der->ca, sizeof(der->ca), cert->isCA); + if (der->caSz <= 0) + return EXTENSIONS_E; + + der->extensionsSz += der->caSz; + } +#endif + /* Set CA true */ else if (cert->isCA) { der->caSz = SetCa(der->ca, sizeof(der->ca)); if (der->caSz <= 0) @@ -29343,6 +31196,11 @@ /* ATTRS_CPW_SET */ { 3, ASN_SET, 1, 1, 0 }, /* ATTRS_CPW_PS */ { 4, ASN_PRINTABLE_STRING, 0, 0, 0 }, /* ATTRS_CPW_UTF */ { 4, ASN_UTF8STRING, 0, 0, 0 }, +/* ATTRS_USN_SEQ */ { 2, ASN_SEQUENCE, 1, 1, 1 }, +/* ATTRS_USN_OID */ { 3, ASN_OBJECT_ID, 0, 0, 0 }, +/* ATTRS_USN_SET */ { 3, ASN_SET, 1, 1, 0 }, +/* ATTRS_USN_PS */ { 4, ASN_PRINTABLE_STRING, 0, 0, 0 }, +/* ATTRS_USN_UTF */ { 4, ASN_UTF8STRING, 0, 0, 0 }, /* Extensions Attribute */ /* EXT_SEQ */ { 2, ASN_SEQUENCE, 1, 1, 1 }, /* EXT_OID */ { 3, ASN_OBJECT_ID, 0, 0, 0 }, @@ -29360,6 +31218,11 @@ CERTREQBODYASN_IDX_ATTRS_CPW_SET, CERTREQBODYASN_IDX_ATTRS_CPW_PS, CERTREQBODYASN_IDX_ATTRS_CPW_UTF, + CERTREQBODYASN_IDX_ATTRS_USN_SEQ, + CERTREQBODYASN_IDX_ATTRS_USN_OID, + CERTREQBODYASN_IDX_ATTRS_USN_SET, + CERTREQBODYASN_IDX_ATTRS_USN_PS, + CERTREQBODYASN_IDX_ATTRS_USN_UTF, CERTREQBODYASN_IDX_EXT_SEQ, CERTREQBODYASN_IDX_EXT_OID, CERTREQBODYASN_IDX_EXT_SET, @@ -29394,7 +31257,6 @@ cert->keyType = ED25519_KEY; else if (ed448Key) cert->keyType = ED448_KEY; -#ifdef HAVE_PQC #ifdef HAVE_FALCON else if ((falconKey != NULL) && (falconKey->level == 1)) cert->keyType = FALCON_LEVEL1_KEY; @@ -29429,7 +31291,6 @@ && (sphincsKey->optim == SMALL_VARIANT)) cert->keyType = SPHINCS_SMALL_LEVEL5_KEY; #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ else return BAD_FUNC_ARG; @@ -29490,7 +31351,6 @@ else if (ed448Key != NULL) { cert->keyType = ED448_KEY; } -#ifdef HAVE_PQC #ifdef HAVE_FALCON else if ((falconKey != NULL) && (falconKey->level == 1)) { cert->keyType = FALCON_LEVEL1_KEY; @@ -29536,7 +31396,6 @@ cert->keyType = SPHINCS_SMALL_LEVEL5_KEY; } #endif /* HAVE_SPHINCS */ -#endif /* HAVE_PQC */ else { ret = BAD_FUNC_ARG; } @@ -29558,7 +31417,8 @@ if (ret >= 0) { /* Determine encode public key size. */ ret = EncodePublicKey(cert->keyType, NULL, 0, rsaKey, - eccKey, ed25519Key, ed448Key, dsaKey); + eccKey, ed25519Key, ed448Key, dsaKey, falconKey, + dilithiumKey, sphincsKey); publicKeySz = (word32)ret; } if (ret >= 0) { @@ -29613,6 +31473,23 @@ SetASNItem_NoOutNode(dataASN, certReqBodyASN, CERTREQBODYASN_IDX_ATTRS_CPW_SEQ, certReqBodyASN_Length); } + if (cert->unstructuredName[0] != '\0') { + /* Add unstructured name attribute. */ + /* Set unstructured name OID. */ + SetASN_Buffer(&dataASN[CERTREQBODYASN_IDX_ATTRS_USN_OID], + attrUnstructuredNameOid, sizeof(attrUnstructuredNameOid)); + /* PRINTABLE_STRING - set buffer */ + SetASN_Buffer(&dataASN[CERTREQBODYASN_IDX_ATTRS_USN_PS], + (byte*)cert->unstructuredName, + (word32)XSTRLEN(cert->unstructuredName)); + /* UTF8STRING - don't encode */ + dataASN[CERTREQBODYASN_IDX_ATTRS_USN_UTF].noOut = 1; + } + else { + /* Leave out unstructured name attribute item. */ + SetASNItem_NoOutNode(dataASN, certReqBodyASN, + CERTREQBODYASN_IDX_ATTRS_USN_SEQ, certReqBodyASN_Length); + } if (extSz > 0) { /* Set extension attribute OID. */ SetASN_Buffer(&dataASN[CERTREQBODYASN_IDX_EXT_OID], attrExtensionRequestOid, @@ -29655,7 +31532,8 @@ ret = EncodePublicKey(cert->keyType, (byte*)dataASN[CERTREQBODYASN_IDX_SPUBKEYINFO_SEQ].data.buffer.data, (int)dataASN[CERTREQBODYASN_IDX_SPUBKEYINFO_SEQ].data.buffer.length, - rsaKey, eccKey, ed25519Key, ed448Key, dsaKey); + rsaKey, eccKey, ed25519Key, ed448Key, dsaKey, falconKey, + dilithiumKey, sphincsKey); } if ((ret >= 0 && derBuffer != NULL) && (!dataASN[CERTREQBODYASN_IDX_EXT_BODY].noOut)) { @@ -29665,7 +31543,7 @@ dataASN[CERTREQBODYASN_IDX_EXT_BODY].data.buffer.length, 1); } if (ret >= 0) { - /* Store encoded certifcate request body size. */ + /* Store encoded certificate request body size. */ cert->bodySz = sz; /* Return the encoding size. */ ret = sz; @@ -29785,7 +31663,7 @@ MAX_ENCODED_SIG_SZ, rsaKey, eccKey, ed25519Key, ed448Key, falconKey, dilithiumKey, sphincsKey, rng, (word32)sType, heap); #ifdef WOLFSSL_ASYNC_CRYPT - if (sigSz == WC_PENDING_E) { + if (sigSz == WC_NO_ERR_TRACE(WC_PENDING_E)) { /* Not free'ing certSignCtx->sig here because it could still be in use * with async operations. */ return sigSz; @@ -29806,6 +31684,128 @@ return sigSz; } +#ifdef WOLFSSL_DUAL_ALG_CERTS +int wc_MakeSigWithBitStr(byte *sig, int sigSz, int sType, byte* buf, + word32 bufSz, int keyType, void* key, WC_RNG* rng) +{ + RsaKey* rsaKey = NULL; + ecc_key* eccKey = NULL; + ed25519_key* ed25519Key = NULL; + ed448_key* ed448Key = NULL; + falcon_key* falconKey = NULL; + dilithium_key* dilithiumKey = NULL; + sphincs_key* sphincsKey = NULL; + + int ret = 0; + int headerSz; + void* heap = NULL; + CertSignCtx certSignCtx_lcl; + CertSignCtx* certSignCtx = &certSignCtx_lcl; + + if ((sig == NULL) || (sigSz <= 0)) { + return BAD_FUNC_ARG; + } + + XMEMSET(certSignCtx, 0, sizeof(*certSignCtx)); + + switch (keyType) + { + case RSA_TYPE: + rsaKey = (RsaKey*)key; + break; + case ECC_TYPE: + eccKey = (ecc_key*)key; + break; + case ED25519_TYPE: + ed25519Key = (ed25519_key*)key; + break; + case ED448_TYPE: + ed448Key = (ed448_key*)key; + break; + case FALCON_LEVEL1_TYPE: + case FALCON_LEVEL5_TYPE: + falconKey = (falcon_key*)key; + break; + case DILITHIUM_LEVEL2_TYPE: + case DILITHIUM_LEVEL3_TYPE: + case DILITHIUM_LEVEL5_TYPE: + dilithiumKey = (dilithium_key*)key; + break; + case SPHINCS_FAST_LEVEL1_TYPE: + case SPHINCS_FAST_LEVEL3_TYPE: + case SPHINCS_FAST_LEVEL5_TYPE: + case SPHINCS_SMALL_LEVEL1_TYPE: + case SPHINCS_SMALL_LEVEL3_TYPE: + case SPHINCS_SMALL_LEVEL5_TYPE: + sphincsKey = (sphincs_key*)key; + break; + default: + return BAD_FUNC_ARG; + } + + /* locate ctx */ + if (rsaKey) { + #ifndef NO_RSA + #ifdef WOLFSSL_ASYNC_CRYPT + certSignCtx = &rsaKey->certSignCtx; + #endif + heap = rsaKey->heap; + #else + return NOT_COMPILED_IN; + #endif /* NO_RSA */ + } + else if (eccKey) { + #ifdef HAVE_ECC + #ifdef WOLFSSL_ASYNC_CRYPT + certSignCtx = &eccKey->certSignCtx; + #endif + heap = eccKey->heap; + #else + return NOT_COMPILED_IN; + #endif /* HAVE_ECC */ + } + + if (certSignCtx->sig == NULL) { + certSignCtx->sig = (byte*)XMALLOC(MAX_ENCODED_SIG_SZ, heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (certSignCtx->sig == NULL) + return MEMORY_E; + } + + ret = MakeSignature(certSignCtx, buf, (word32)bufSz, certSignCtx->sig, + MAX_ENCODED_SIG_SZ, rsaKey, eccKey, ed25519Key, ed448Key, + falconKey, dilithiumKey, sphincsKey, rng, (word32)sType, heap); +#ifdef WOLFSSL_ASYNC_CRYPT + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { + /* Not free'ing certSignCtx->sig here because it could still be in use + * with async operations. */ + return ret; + } +#endif + + if (ret <= 0) { + XFREE(certSignCtx->sig, heap, DYNAMIC_TYPE_TMP_BUFFER); + certSignCtx->sig = NULL; + return ret; + } + + headerSz = SetBitString(ret, 0, NULL); + if (headerSz + ret > sigSz) { + ret = BUFFER_E; + } + + if (ret > 0) { + sig += SetBitString(ret, 0, sig); + XMEMCPY(sig, certSignCtx->sig, ret); + ret += headerSz; + } + + XFREE(certSignCtx->sig, heap, DYNAMIC_TYPE_TMP_BUFFER); + certSignCtx->sig = NULL; + return ret; +} +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + int wc_SignCert_ex(int requestSz, int sType, byte* buf, word32 buffSz, int keyType, void* key, WC_RNG* rng) { @@ -29859,6 +31859,7 @@ NULL, NULL, NULL, rng); } + WOLFSSL_ABI int wc_MakeSelfCert(Cert* cert, byte* buf, word32 buffSz, RsaKey* key, WC_RNG* rng) @@ -29935,14 +31936,13 @@ bufferSz = wc_Ed448PublicKeyToDer(ed448Key, buf, MAX_PUBLIC_KEY_SZ, 0); } #endif -#if defined(HAVE_PQC) #if defined(HAVE_FALCON) if (falconKey != NULL) { bufferSz = wc_Falcon_PublicKeyToDer(falconKey, buf, MAX_PUBLIC_KEY_SZ, 0); } #endif -#if defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) && !defined(WOLFSSL_DILITHIUM_NO_ASN1) if (dilithiumKey != NULL) { bufferSz = wc_Dilithium_PublicKeyToDer(dilithiumKey, buf, MAX_PUBLIC_KEY_SZ, 0); @@ -29954,7 +31954,6 @@ MAX_PUBLIC_KEY_SZ, 0); } #endif -#endif /* HAVE_PQC */ if (bufferSz <= 0) { XFREE(buf, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -29963,12 +31962,22 @@ /* Compute SKID by hashing public key */ if (kid_type == SKID_TYPE) { - ret = CalcHashId(buf, (word32)bufferSz, cert->skid); + int hashId = HashIdAlg((word32)cert->sigType); + ret = CalcHashId_ex(buf, (word32)bufferSz, cert->skid, hashId); + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + cert->skidSz = wc_HashGetDigestSize(wc_HashTypeConvert(hashId)); + #else cert->skidSz = KEYID_SIZE; + #endif } else if (kid_type == AKID_TYPE) { - ret = CalcHashId(buf, (word32)bufferSz, cert->akid); + int hashId = HashIdAlg((word32)cert->sigType); + ret = CalcHashId_ex(buf, (word32)bufferSz, cert->akid, hashId); + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + cert->akidSz = wc_HashGetDigestSize(wc_HashTypeConvert(hashId)); + #else cert->akidSz = KEYID_SIZE; + #endif } else ret = BAD_FUNC_ARG; @@ -30182,6 +32191,9 @@ wc_ecc_free(eckey); XFREE(eckey, cert->heap, DYNAMIC_TYPE_ECC); #endif +#if defined(NO_RSA) && !defined(HAVE_ECC) + (void)idx; +#endif return ret; } @@ -30202,9 +32214,14 @@ } else { - /* Put the SKID of CA to AKID of certificate */ - XMEMCPY(cert->akid, decoded->extSubjKeyId, KEYID_SIZE); + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + cert->akidSz = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + cert->sigType))); + #else cert->akidSz = KEYID_SIZE; + #endif + /* Put the SKID of CA to AKID of certificate */ + XMEMCPY(cert->akid, decoded->extSubjKeyId, (size_t)cert->akidSz); } return ret; @@ -30264,56 +32281,14 @@ int wc_SetKeyUsage(Cert *cert, const char *value) { int ret = 0; - char *token, *str, *ptr; - word32 len; if (cert == NULL || value == NULL) return BAD_FUNC_ARG; cert->keyUsage = 0; - /* duplicate string (including terminator) */ - len = (word32)XSTRLEN(value); - str = (char*)XMALLOC(len+1, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (str == NULL) - return MEMORY_E; - XMEMCPY(str, value, len+1); + ret = ParseKeyUsageStr(value, &cert->keyUsage, cert->heap); - /* parse value, and set corresponding Key Usage value */ - if ((token = XSTRTOK(str, ",", &ptr)) == NULL) { - XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); - return KEYUSAGE_E; - } - while (token != NULL) - { - if (!XSTRCASECMP(token, "digitalSignature")) - cert->keyUsage |= KEYUSE_DIGITAL_SIG; - else if (!XSTRCASECMP(token, "nonRepudiation") || - !XSTRCASECMP(token, "contentCommitment")) - cert->keyUsage |= KEYUSE_CONTENT_COMMIT; - else if (!XSTRCASECMP(token, "keyEncipherment")) - cert->keyUsage |= KEYUSE_KEY_ENCIPHER; - else if (!XSTRCASECMP(token, "dataEncipherment")) - cert->keyUsage |= KEYUSE_DATA_ENCIPHER; - else if (!XSTRCASECMP(token, "keyAgreement")) - cert->keyUsage |= KEYUSE_KEY_AGREE; - else if (!XSTRCASECMP(token, "keyCertSign")) - cert->keyUsage |= KEYUSE_KEY_CERT_SIGN; - else if (!XSTRCASECMP(token, "cRLSign")) - cert->keyUsage |= KEYUSE_CRL_SIGN; - else if (!XSTRCASECMP(token, "encipherOnly")) - cert->keyUsage |= KEYUSE_ENCIPHER_ONLY; - else if (!XSTRCASECMP(token, "decipherOnly")) - cert->keyUsage |= KEYUSE_DECIPHER_ONLY; - else { - ret = KEYUSAGE_E; - break; - } - - token = XSTRTOK(NULL, ",", &ptr); - } - - XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); return ret; } @@ -30321,52 +32296,14 @@ int wc_SetExtKeyUsage(Cert *cert, const char *value) { int ret = 0; - char *token, *str, *ptr; - word32 len; if (cert == NULL || value == NULL) return BAD_FUNC_ARG; cert->extKeyUsage = 0; - /* duplicate string (including terminator) */ - len = (word32)XSTRLEN(value); - str = (char*)XMALLOC(len+1, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (str == NULL) - return MEMORY_E; - XMEMCPY(str, value, len+1); - - /* parse value, and set corresponding Key Usage value */ - if ((token = XSTRTOK(str, ",", &ptr)) == NULL) { - XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); - return EXTKEYUSAGE_E; - } - - while (token != NULL) - { - if (!XSTRCASECMP(token, "any")) - cert->extKeyUsage |= EXTKEYUSE_ANY; - else if (!XSTRCASECMP(token, "serverAuth")) - cert->extKeyUsage |= EXTKEYUSE_SERVER_AUTH; - else if (!XSTRCASECMP(token, "clientAuth")) - cert->extKeyUsage |= EXTKEYUSE_CLIENT_AUTH; - else if (!XSTRCASECMP(token, "codeSigning")) - cert->extKeyUsage |= EXTKEYUSE_CODESIGN; - else if (!XSTRCASECMP(token, "emailProtection")) - cert->extKeyUsage |= EXTKEYUSE_EMAILPROT; - else if (!XSTRCASECMP(token, "timeStamping")) - cert->extKeyUsage |= EXTKEYUSE_TIMESTAMP; - else if (!XSTRCASECMP(token, "OCSPSigning")) - cert->extKeyUsage |= EXTKEYUSE_OCSP_SIGN; - else { - ret = EXTKEYUSAGE_E; - break; - } - - token = XSTRTOK(NULL, ",", &ptr); - } + ret = ParseExtKeyUsageStr(value, &cert->extKeyUsage, cert->heap); - XFREE(str, cert->heap, DYNAMIC_TYPE_TMP_BUFFER); return ret; } @@ -30382,8 +32319,8 @@ int wc_SetExtKeyUsageOID(Cert *cert, const char *in, word32 sz, byte idx, void* heap) { - byte oid[MAX_OID_SZ]; - word32 oidSz = MAX_OID_SZ; + byte oid[CTC_MAX_EKU_OID_SZ]; + word32 oidSz = CTC_MAX_EKU_OID_SZ; if (idx >= CTC_MAX_EKU_NB || sz >= CTC_MAX_EKU_OID_SZ) { WOLFSSL_MSG("Either idx or sz was too large"); @@ -30428,9 +32365,9 @@ ext = &cert->customCertExt[cert->customCertExtCount]; - ext->oid = oid; + ext->oid = (char*)oid; ext->crit = (critical == 0) ? 0 : 1; - ext->val = der; + ext->val = (byte*)der; ext->valSz = derSz; cert->customCertExtCount++; @@ -30484,7 +32421,7 @@ #endif InitDecodedCert_ex(decoded, der, (word32)derSz, NULL, devId); - ret = ParseCertRelative(decoded, CA_TYPE, NO_VERIFY, 0); + ret = ParseCertRelative(decoded, CA_TYPE, NO_VERIFY, 0, NULL); if (ret < 0) { WOLFSSL_MSG("ParseCertRelative error"); @@ -30683,7 +32620,7 @@ #endif InitDecodedCert_ex(decoded, der, (word32)derSz, NULL, devId); - ret = ParseCertRelative(decoded, CA_TYPE, NO_VERIFY, 0); + ret = ParseCertRelative(decoded, CA_TYPE, NO_VERIFY, 0, NULL); if (ret < 0) { WOLFSSL_MSG("ParseCertRelative error"); @@ -31111,7 +33048,7 @@ /* Encode the DH parameters into buffer. */ SetASN_Items(dhParamASN, dataASN, dhParamASN_Length, out); /* Set the actual encoding size. */ - *outLen = sz; + *outLen = (word32)sz; } return ret; @@ -31196,9 +33133,16 @@ } if (ret == 0) { /* Encode DSA signature into buffer. */ - SetASN_Items(dsaSigASN, dataASN, dsaSigASN_Length, out); - /* Set the actual encoding size. */ - *outLen = (word32)sz; + ret = SetASN_Items(dsaSigASN, dataASN, dsaSigASN_Length, out); + if (ret >= 0) { + if (ret == sz) { + /* Set the actual encoding size. */ + *outLen = (word32)sz; + ret = 0; + } else { + ret = BAD_STATE_E; + } + } } return ret; @@ -31288,6 +33232,14 @@ /* Clear dynamic data and set buffers for r and s */ XMEMSET(dataASN, 0, sizeof(dataASN)); + while ((rLen > 1) && (r[0] == 0)) { + rLen--; + r++; + } + while ((sLen > 1) && (s[0] == 0)) { + sLen--; + s++; + } SetASN_Buffer(&dataASN[DSASIGASN_IDX_R], r, rLen); SetASN_Buffer(&dataASN[DSASIGASN_IDX_S], s, sLen); @@ -31442,6 +33394,11 @@ /* Decode the DSA signature. */ ret = GetASN_Items(dsaSigASN, dataASN, dsaSigASN_Length, 0, sig, &idx, sigLen); + + if (ret != 0) { + ret = ASN_ECC_KEY_E; + } + #ifndef NO_STRICT_ECDSA_LEN /* sanity check that the index has been advanced all the way to the end of * the buffer */ @@ -31461,7 +33418,7 @@ #ifdef WOLFSSL_ASN_TEMPLATE -#ifdef WOLFSSL_CUSTOM_CURVES +#if defined(HAVE_ECC) && defined(WOLFSSL_CUSTOM_CURVES) /* Convert data to hex string. * * Big-endian byte array is converted to big-endian hexadecimal string. @@ -31495,7 +33452,7 @@ * @param [out] out Allocated buffer holding hex string. * @param [in] heap Dynamic memory allocation hint. * @param [in] heapType Type of heap to use. - * @return 0 on succcess. + * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ static int DataToHexStringAlloc(const byte* input, word32 inSz, char** out, @@ -31569,7 +33526,7 @@ /* Number of items in ASN.1 template for SpecifiedECDomain. */ #define eccSpecifiedASN_Length (sizeof(eccSpecifiedASN) / sizeof(ASNItem)) -/* OID indicating the prime field is explicity defined. */ +/* OID indicating the prime field is explicitly defined. */ static const byte primeFieldOID[] = { 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x01, 0x01 }; @@ -31577,20 +33534,20 @@ /* Explicit EC parameter values. */ static int EccSpecifiedECDomainDecode(const byte* input, word32 inSz, - ecc_key* key) + ecc_key* key, void* heap, int* curveSz) { DECL_ASNGETDATA(dataASN, eccSpecifiedASN_Length); int ret = 0; - ecc_set_type* curve; + ecc_set_type* curve = NULL; word32 idx = 0; - byte version; - byte cofactor; - const byte *base; - word32 baseLen; + byte version = 0; + byte cofactor = 0; + const byte *base = NULL; + word32 baseLen = 0; /* Allocate a new parameter set. */ - curve = (ecc_set_type*)XMALLOC(sizeof(*curve), key->heap, - DYNAMIC_TYPE_ECC_BUFFER); + curve = (ecc_set_type*)XMALLOC(sizeof(*curve), heap, + DYNAMIC_TYPE_ECC_BUFFER); if (curve == NULL) { ret = MEMORY_E; } @@ -31599,7 +33556,7 @@ XMEMSET(curve, 0, sizeof(*curve)); } - CALLOC_ASNGETDATA(dataASN, eccSpecifiedASN_Length, ret, key->heap); + CALLOC_ASNGETDATA(dataASN, eccSpecifiedASN_Length, ret, heap); if (ret == 0) { /* Set name to be: "Custom" */ @@ -31625,15 +33582,19 @@ } #ifndef WOLFSSL_NO_ASN_STRICT /* Only version 2 and above can have a seed. */ - if ((ret == 0) && (dataASN[ECCSPECIFIEDASN_IDX_PARAM_SEED].tag != 0) && + if (ret == 0) { + if ((dataASN[ECCSPECIFIEDASN_IDX_PARAM_SEED].tag != 0) && (version < 2)) { - ret = ASN_PARSE_E; + ret = ASN_PARSE_E; + } } #endif /* Only version 2 and above can have a hash algorithm. */ - if ((ret == 0) && (dataASN[ECCSPECIFIEDASN_IDX_HASH_SEQ].tag != 0) && + if (ret == 0) { + if ((dataASN[ECCSPECIFIEDASN_IDX_HASH_SEQ].tag != 0) && (version < 2)) { - ret = ASN_PARSE_E; + ret = ASN_PARSE_E; + } } if ((ret == 0) && (dataASN[ECCSPECIFIEDASN_IDX_COFACTOR].tag != 0)) { /* Store optional co-factor. */ @@ -31658,13 +33619,13 @@ if (ret == 0) { /* Base X-ordinate */ ret = DataToHexStringAlloc(base + 1, (word32)curve->size, - (char**)&curve->Gx, key->heap, + (char**)&curve->Gx, heap, DYNAMIC_TYPE_ECC_BUFFER); } if (ret == 0) { /* Base Y-ordinate */ ret = DataToHexStringAlloc(base + 1 + curve->size, (word32)curve->size, - (char**)&curve->Gy, key->heap, + (char**)&curve->Gy, heap, DYNAMIC_TYPE_ECC_BUFFER); } if (ret == 0) { @@ -31672,28 +33633,28 @@ ret = DataToHexStringAlloc( dataASN[ECCSPECIFIEDASN_IDX_PRIME_P].data.ref.data, dataASN[ECCSPECIFIEDASN_IDX_PRIME_P].data.ref.length, - (char**)&curve->prime, key->heap, DYNAMIC_TYPE_ECC_BUFFER); + (char**)&curve->prime, heap, DYNAMIC_TYPE_ECC_BUFFER); } if (ret == 0) { /* Parameter A */ ret = DataToHexStringAlloc( dataASN[ECCSPECIFIEDASN_IDX_PARAM_A].data.ref.data, dataASN[ECCSPECIFIEDASN_IDX_PARAM_A].data.ref.length, - (char**)&curve->Af, key->heap, DYNAMIC_TYPE_ECC_BUFFER); + (char**)&curve->Af, heap, DYNAMIC_TYPE_ECC_BUFFER); } if (ret == 0) { /* Parameter B */ ret = DataToHexStringAlloc( dataASN[ECCSPECIFIEDASN_IDX_PARAM_B].data.ref.data, dataASN[ECCSPECIFIEDASN_IDX_PARAM_B].data.ref.length, - (char**)&curve->Bf, key->heap, DYNAMIC_TYPE_ECC_BUFFER); + (char**)&curve->Bf, heap, DYNAMIC_TYPE_ECC_BUFFER); } if (ret == 0) { /* Order of curve */ ret = DataToHexStringAlloc( dataASN[ECCSPECIFIEDASN_IDX_ORDER].data.ref.data, dataASN[ECCSPECIFIEDASN_IDX_ORDER].data.ref.length, - (char**)&curve->order, key->heap, DYNAMIC_TYPE_ECC_BUFFER); + (char**)&curve->order, heap, DYNAMIC_TYPE_ECC_BUFFER); } #else if (ret == 0) { @@ -31720,26 +33681,31 @@ } #endif /* WOLFSSL_ECC_CURVE_STATIC */ - /* Store parameter set in key. */ - if ((ret == 0) && (wc_ecc_set_custom_curve(key, curve) < 0)) { - ret = ASN_PARSE_E; + if (key) { + /* Store parameter set in key. */ + if ((ret == 0) && (wc_ecc_set_custom_curve(key, curve) < 0)) { + ret = ASN_PARSE_E; + } + if (ret == 0) { + /* The parameter set was allocated.. */ + key->deallocSet = 1; + } } - if (ret == 0) { - /* The parameter set was allocated.. */ - key->deallocSet = 1; + + if ((ret == 0) && (curveSz)) { + *curveSz = curve->size; } if ((ret != 0) && (curve != NULL)) { - /* Failed to set parameters so free paramter set. */ - wc_ecc_free_curve(curve, key->heap); + /* Failed to set parameters so free parameter set. */ + wc_ecc_free_curve(curve, heap); } - FREE_ASNGETDATA(dataASN, key->heap); + FREE_ASNGETDATA(dataASN, heap); return ret; } #endif /* WOLFSSL_CUSTOM_CURVES */ #endif /* WOLFSSL_ASN_TEMPLATE */ - #ifdef HAVE_ECC #ifdef WOLFSSL_ASN_TEMPLATE @@ -31806,6 +33772,9 @@ if (ToTraditionalInline_ex(input, inOutIdx, inSz, &algId) < 0) { /* ignore error, did not have pkcs8 header */ } + else { + curve_id = wc_ecc_get_oid(algId, NULL, NULL); + } if (GetSequence(input, inOutIdx, &length, inSz) < 0) return ASN_PARSE_E; @@ -31912,10 +33881,10 @@ return ret; #else DECL_ASNGETDATA(dataASN, eccKeyASN_Length); - byte version; + byte version = 0; int ret = 0; int curve_id = ECC_CURVE_DEF; -#if defined(HAVE_PKCS8) || defined(HAVE_PKCS12) +#if defined(HAVE_PKCS8) || defined(HAVE_PKCS12) || defined(SM2) word32 algId = 0; #endif @@ -31924,11 +33893,14 @@ ret = BAD_FUNC_ARG; } -#if defined(HAVE_PKCS8) || defined(HAVE_PKCS12) +#if defined(HAVE_PKCS8) || defined(HAVE_PKCS12) || defined(SM2) /* if has pkcs8 header skip it */ if (ToTraditionalInline_ex(input, inOutIdx, inSz, &algId) < 0) { /* ignore error, did not have pkcs8 header */ } + else { + curve_id = wc_ecc_get_oid(algId, NULL, NULL); + } #endif CALLOC_ASNGETDATA(dataASN, eccKeyASN_Length, ret, key->heap); @@ -31942,8 +33914,10 @@ inOutIdx, inSz); } /* Only version 1 supported. */ - if ((ret == 0) && (version != 1)) { - ret = ASN_PARSE_E; + if (ret == 0) { + if (version != 1) { + ret = ASN_PARSE_E; + } } /* Curve Parameters are optional. */ if ((ret == 0) && (dataASN[ECCKEYASN_IDX_PARAMS].tag != 0)) { @@ -31959,7 +33933,8 @@ /* Parse explicit parameters. */ ret = EccSpecifiedECDomainDecode( dataASN[ECCKEYASN_IDX_CURVEPARAMS].data.ref.data, - dataASN[ECCKEYASN_IDX_CURVEPARAMS].data.ref.length, key); + dataASN[ECCKEYASN_IDX_CURVEPARAMS].data.ref.length, key, + key->heap, NULL); #else /* Explicit parameters not supported in build configuration. */ ret = ASN_PARSE_E; @@ -32026,7 +34001,7 @@ return 0; } -static int EccKeyParamCopy(char** dst, char* src) +static int EccKeyParamCopy(char** dst, char* src, void* heap) { int ret = 0; #ifdef WOLFSSL_ECC_CURVE_STATIC @@ -32047,8 +34022,9 @@ else { XSTRNCPY(*dst, src, MAX_ECC_STRING); } - XFREE(src, key->heap, DYNAMIC_TYPE_ECC_BUFFER); + XFREE(src, heap, DYNAMIC_TYPE_ECC_BUFFER); #endif + (void)heap; return ret; } @@ -32156,10 +34132,10 @@ key->heap, DYNAMIC_TYPE_ECC_BUFFER); if (ret == 0) { #ifndef WOLFSSL_ECC_CURVE_STATIC - ret = EccKeyParamCopy((char**)&curve->prime, p); + ret = EccKeyParamCopy((char**)&curve->prime, p, key->heap); #else const char *_tmp_ptr = &curve->prime[0]; - ret = EccKeyParamCopy((char**)&_tmp_ptr, p); + ret = EccKeyParamCopy((char**)&_tmp_ptr, p, key->heap); #endif } } @@ -32175,10 +34151,10 @@ key->heap, DYNAMIC_TYPE_ECC_BUFFER); if (ret == 0) { #ifndef WOLFSSL_ECC_CURVE_STATIC - ret = EccKeyParamCopy((char**)&curve->Af, af); + ret = EccKeyParamCopy((char**)&curve->Af, af, key->heap); #else const char *_tmp_ptr = &curve->Af[0]; - ret = EccKeyParamCopy((char**)&_tmp_ptr, af); + ret = EccKeyParamCopy((char**)&_tmp_ptr, af, key->heap); #endif } } @@ -32188,10 +34164,10 @@ key->heap, DYNAMIC_TYPE_ECC_BUFFER); if (ret == 0) { #ifndef WOLFSSL_ECC_CURVE_STATIC - ret = EccKeyParamCopy((char**)&curve->Bf, bf); + ret = EccKeyParamCopy((char**)&curve->Bf, bf, key->heap); #else const char *_tmp_ptr = &curve->Bf[0]; - ret = EccKeyParamCopy((char**)&_tmp_ptr, bf); + ret = EccKeyParamCopy((char**)&_tmp_ptr, bf, key->heap); #endif } } @@ -32248,10 +34224,10 @@ key->heap, DYNAMIC_TYPE_ECC_BUFFER); if (ret == 0) { #ifndef WOLFSSL_ECC_CURVE_STATIC - ret = EccKeyParamCopy((char**)&curve->order, o); + ret = EccKeyParamCopy((char**)&curve->order, o, key->heap); #else const char *_tmp_ptr = &curve->order[0]; - ret = EccKeyParamCopy((char**)&_tmp_ptr, o); + ret = EccKeyParamCopy((char**)&_tmp_ptr, o, key->heap); #endif } } @@ -32343,10 +34319,14 @@ if (ret == 0) { /* Clear dynamic data for ECC public key. */ XMEMSET(dataASN, 0, sizeof(*dataASN) * eccPublicKeyASN_Length); +#if !defined(WOLFSSL_SM2) || !defined(WOLFSSL_SM3) /* Set required ECDSA OID and ignore the curve OID type. */ GetASN_ExpBuffer(&dataASN[ECCPUBLICKEYASN_IDX_ALGOID_OID], keyEcdsaOid, sizeof(keyEcdsaOid)); - GetASN_OID(&dataASN[oidIdx], oidIgnoreType); +#else + GetASN_OID(&dataASN[ECCPUBLICKEYASN_IDX_ALGOID_OID], oidKeyType); +#endif + GetASN_OID(&dataASN[oidIdx], oidCurveType); /* Decode the public ECC key. */ ret = GetASN_Items(eccPublicKeyASN, dataASN, eccPublicKeyASN_Length, 1, input, inOutIdx, inSz); @@ -32360,7 +34340,7 @@ /* Clear dynamic data for ECC private key. */ XMEMSET(dataASN, 0, sizeof(*dataASN) * eccKeyASN_Length); /* Check named curve OID type. */ - GetASN_OID(&dataASN[oidIdx], oidIgnoreType); + GetASN_OID(&dataASN[oidIdx], oidCurveType); /* Try private key format .*/ ret = GetASN_Items(eccKeyASN, dataASN, eccKeyASN_Length, 1, input, inOutIdx, inSz); @@ -32370,6 +34350,14 @@ } } +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + if ((ret == 0) && (oidIdx == ECCPUBLICKEYASN_IDX_ALGOID_CURVEID)) { + int oidSum = dataASN[ECCPUBLICKEYASN_IDX_ALGOID_OID].data.oid.sum; + if ((oidSum != ECDSAk) && (oidSum != SM2k)) { + ret = ASN_PARSE_E; + } + } +#endif if (ret == 0) { if (dataASN[oidIdx].tag != 0) { /* Named curve - check and get id. */ @@ -32382,7 +34370,8 @@ #ifdef WOLFSSL_CUSTOM_CURVES /* Parse explicit parameters. */ ret = EccSpecifiedECDomainDecode(dataASN[specIdx].data.ref.data, - dataASN[specIdx].data.ref.length, key); + dataASN[specIdx].data.ref.length, key, + key->heap, NULL); #else /* Explicit parameters not supported in build configuration. */ ret = ASN_PARSE_E; @@ -32406,7 +34395,7 @@ #if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) /* build DER formatted ECC key, include optional public key if requested, * return length on success, negative on error */ -static int wc_BuildEccKeyDer(ecc_key* key, byte* output, word32 *inLen, +int wc_BuildEccKeyDer(ecc_key* key, byte* output, word32 *inLen, int pubIn, int curveIn) { #ifndef WOLFSSL_ASN_TEMPLATE @@ -32484,7 +34473,7 @@ PRIVATE_KEY_UNLOCK(); ret = wc_ecc_export_x963(key, NULL, &pubSz); PRIVATE_KEY_LOCK(); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { #ifndef WOLFSSL_NO_MALLOC XFREE(prv, key->heap, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -32582,7 +34571,8 @@ return (int)totalSz; #else DECL_ASNSETDATA(dataASN, eccKeyASN_Length); - word32 privSz, pubSz; + word32 privSz = 0; + word32 pubSz = 0; int sz = 0; int ret = 0; int curveIdSz = 0; @@ -32607,7 +34597,7 @@ PRIVATE_KEY_UNLOCK(); ret = wc_ecc_export_x963(key, NULL, &pubSz); PRIVATE_KEY_LOCK(); - if (ret == LENGTH_ONLY_E) + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) ret = 0; } } @@ -32709,7 +34699,7 @@ ret = wc_BuildEccKeyDer(key, NULL, &sz, pub, 1); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { return ret; } return (int)sz; @@ -32722,8 +34712,6 @@ return wc_BuildEccKeyDer(key, output, &inLen, 0, 1); } - - #ifdef HAVE_PKCS8 /* Write only private ecc key or both private and public parts to unencrypted @@ -32778,7 +34766,7 @@ /* get pkcs8 expected output size */ ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, tmpDer, tmpDerSz, algoID, curveOID, oidSz); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { #ifndef WOLFSSL_NO_MALLOC XFREE(tmpDer, key->heap, DYNAMIC_TYPE_TMP_BUFFER); #endif @@ -32878,13 +34866,11 @@ || (defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_IMPORT)) \ || (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)) \ || (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_IMPORT)) \ - || (defined(HAVE_PQC) && defined(HAVE_FALCON)) \ - || (defined(HAVE_PQC) && defined(HAVE_DILITHIUM)) \ - || (defined(HAVE_PQC) && defined(HAVE_SPHINCS))) + || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS)) -int DecodeAsymKey(const byte* input, word32* inOutIdx, word32 inSz, - byte* privKey, word32* privKeyLen, - byte* pubKey, word32* pubKeyLen, int keyType) +int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, word32 inSz, + const byte** privKey, word32* privKeyLen, + const byte** pubKey, word32* pubKeyLen, int keyType) { #ifndef WOLFSSL_ASN_TEMPLATE word32 oid; @@ -32899,6 +34885,9 @@ if (input == NULL || inOutIdx == NULL || inSz == 0 || privKey == NULL || privKeyLen == NULL) { + #ifdef WOLFSSL_ASN_TEMPLATE + FREE_ASNGETDATA(dataASN, NULL); + #endif return BAD_FUNC_ARG; } @@ -32936,12 +34925,9 @@ endKeyIdx = (int)*inOutIdx; } - if ((word32)privSz > *privKeyLen) - return BUFFER_E; - if (endKeyIdx == (int)*inOutIdx) { *privKeyLen = (word32)privSz; - XMEMCPY(privKey, priv, *privKeyLen); + *privKey = priv; if (pubKeyLen != NULL) *pubKeyLen = 0; } @@ -32955,17 +34941,14 @@ return ASN_PARSE_E; } - if ((word32)pubSz > *pubKeyLen) - return BUFFER_E; - pub = input + *inOutIdx; *inOutIdx += (word32)pubSz; *privKeyLen = (word32)privSz; - XMEMCPY(privKey, priv, *privKeyLen); + *privKey = priv; *pubKeyLen = (word32)pubSz; if (pubKey != NULL) - XMEMCPY(pubKey, pub, *pubKeyLen); + *pubKey = pub; } if (endKeyIdx != (int)*inOutIdx) return ASN_PARSE_E; @@ -32989,33 +34972,22 @@ } } } - /* Check the private value length is correct. */ - if ((ret == 0) && dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length - > *privKeyLen) { - ret = ASN_PARSE_E; + if (ret == 0) { + /* Import private value. */ + *privKeyLen = dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length; + *privKey = dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.data; } if ((ret == 0) && dataASN[EDKEYASN_IDX_PUBKEY].tag == 0) { - *privKeyLen = dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length; - XMEMCPY(privKey, dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.data, - *privKeyLen); + /* Set public length to 0 as not seen. */ if (pubKeyLen != NULL) *pubKeyLen = 0; } - else if ((ret == 0) && - (pubKeyLen != NULL) && - (dataASN[EDKEYASN_IDX_PUBKEY].data.ref.length > *pubKeyLen)) { - ret = ASN_PARSE_E; - } else if (ret == 0) { - /* Import private and public value. */ - *privKeyLen = dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.length; - XMEMCPY(privKey, dataASN[EDKEYASN_IDX_PKEY_CURVEPKEY].data.ref.data, - *privKeyLen); + /* Import public value. */ if (pubKeyLen != NULL) *pubKeyLen = dataASN[EDKEYASN_IDX_PUBKEY].data.ref.length; if (pubKey != NULL && pubKeyLen != NULL) - XMEMCPY(pubKey, dataASN[EDKEYASN_IDX_PUBKEY].data.ref.data, - *pubKeyLen); + *pubKey = dataASN[EDKEYASN_IDX_PUBKEY].data.ref.data; } FREE_ASNGETDATA(dataASN, NULL); @@ -33023,10 +34995,48 @@ #endif /* WOLFSSL_ASN_TEMPLATE */ } -int DecodeAsymKeyPublic(const byte* input, word32* inOutIdx, word32 inSz, +int DecodeAsymKey(const byte* input, word32* inOutIdx, word32 inSz, + byte* privKey, word32* privKeyLen, byte* pubKey, word32* pubKeyLen, int keyType) { int ret = 0; + const byte* privKeyPtr = NULL; + const byte* pubKeyPtr = NULL; + word32 privKeyPtrLen = 0; + word32 pubKeyPtrLen = 0; + + if (privKey == NULL) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + ret = DecodeAsymKey_Assign(input, inOutIdx, inSz, &privKeyPtr, + &privKeyPtrLen, &pubKeyPtr, &pubKeyPtrLen, keyType); + } + if ((ret == 0) && (privKeyPtrLen > *privKeyLen)) { + ret = BUFFER_E; + } + if ((ret == 0) && (pubKeyLen != NULL) && (pubKeyPtrLen > *pubKeyLen)) { + ret = BUFFER_E; + } + if ((ret == 0) && (privKeyPtr != NULL)) { + XMEMCPY(privKey, privKeyPtr, privKeyPtrLen); + *privKeyLen = privKeyPtrLen; + } + if ((ret == 0) && (pubKey != NULL) && (pubKeyPtr != NULL)) { + XMEMCPY(pubKey, pubKeyPtr, pubKeyPtrLen); + } + if ((ret == 0) && (pubKeyLen != NULL)) { + *pubKeyLen = pubKeyPtrLen; + } + + return ret; +} + +int DecodeAsymKeyPublic_Assign(const byte* input, word32* inOutIdx, word32 inSz, + const byte** pubKey, word32* pubKeyLen, int keyType) +{ + int ret = 0; #ifndef WOLFSSL_ASN_TEMPLATE int length; word32 oid; @@ -33057,17 +35067,13 @@ if (ret != 0) return ret; - /* check that the value found is not too large for pubKey buffer */ - if ((word32)length > *pubKeyLen) - return ASN_PARSE_E; - /* check that input buffer is exhausted */ if (*inOutIdx + (word32)length != inSz) return ASN_PARSE_E; /* This is the raw point data compressed or uncompressed. */ *pubKeyLen = (word32)length; - XMEMCPY(pubKey, input + *inOutIdx, *pubKeyLen); + *pubKey = input + *inOutIdx; #else len = inSz - *inOutIdx; @@ -33088,11 +35094,6 @@ if (*inOutIdx != inSz) ret = ASN_PARSE_E; } - /* Check the public value length is correct. */ - if ((ret == 0) && - (dataASN[EDPUBKEYASN_IDX_PUBKEY].data.ref.length > *pubKeyLen)) { - ret = ASN_PARSE_E; - } /* Check that the all the buffer was used. */ if ((ret == 0) && (GetASNItem_Length(dataASN[EDPUBKEYASN_IDX_SEQ], input) != len)) { @@ -33100,14 +35101,39 @@ } if (ret == 0) { *pubKeyLen = dataASN[EDPUBKEYASN_IDX_PUBKEY].data.ref.length; - XMEMCPY(pubKey, dataASN[EDPUBKEYASN_IDX_PUBKEY].data.ref.data, - *pubKeyLen); + *pubKey = dataASN[EDPUBKEYASN_IDX_PUBKEY].data.ref.data; } FREE_ASNGETDATA(dataASN, NULL); #endif /* WOLFSSL_ASN_TEMPLATE */ return ret; } + +int DecodeAsymKeyPublic(const byte* input, word32* inOutIdx, word32 inSz, + byte* pubKey, word32* pubKeyLen, int keyType) +{ + int ret = 0; + const byte* pubKeyPtr = NULL; + word32 pubKeyPtrLen = 0; + + if (pubKey == NULL) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + ret = DecodeAsymKeyPublic_Assign(input, inOutIdx, inSz, &pubKeyPtr, + &pubKeyPtrLen, keyType); + } + if ((ret == 0) && (pubKeyPtrLen > *pubKeyLen)) { + ret = BUFFER_E; + } + if ((ret == 0) && (pubKeyPtr != NULL)) { + XMEMCPY(pubKey, pubKeyPtr, pubKeyPtrLen); + *pubKeyLen = pubKeyPtrLen; + } + + return ret; +} #endif #endif /* WC_ENABLE_ASYM_KEY_IMPORT */ @@ -33116,7 +35142,7 @@ ed25519_key* key, word32 inSz) { int ret; - byte privKey[ED25519_KEY_SIZE], pubKey[ED25519_PUB_KEY_SIZE]; + byte privKey[ED25519_KEY_SIZE], pubKey[2*ED25519_PUB_KEY_SIZE+1]; word32 privKeyLen = (word32)sizeof(privKey); word32 pubKeyLen = (word32)sizeof(pubKey); @@ -33142,7 +35168,7 @@ ed25519_key* key, word32 inSz) { int ret; - byte pubKey[ED25519_PUB_KEY_SIZE]; + byte pubKey[2*ED25519_PUB_KEY_SIZE+1]; word32 pubKeyLen = (word32)sizeof(pubKey); if (input == NULL || inOutIdx == NULL || key == NULL || inSz == 0) { @@ -33206,9 +35232,9 @@ * Pass NULL for output to get the size of the encoding. * * @param [in] privKey private key buffer - * @param [in] privKeyLen private ket buffer length + * @param [in] privKeyLen private key buffer length * @param [in] pubKey public key buffer (optional) - * @param [in] pubKeyLen public ket buffer length + * @param [in] pubKeyLen public key buffer length * @param [out] output Buffer to put encoded data in (optional) * @param [in] outLen Size of buffer in bytes * @param [in] keyType is "enum Key_Sum" like ED25519k @@ -33268,7 +35294,7 @@ /* pubKey */ if (pubKey) { idx += SetHeader(ASN_CONTEXT_SPECIFIC | ASN_ASYMKEY_PUBKEY | - 1, pubKeyLen, output + idx); + 1, pubKeyLen, output + idx, 0); XMEMCPY(output + idx, pubKey, pubKeyLen); idx += pubKeyLen; } @@ -33433,7 +35459,7 @@ ed448_key* key, word32 inSz) { int ret; - byte pubKey[ED448_PUB_KEY_SIZE]; + byte pubKey[2 * ED448_PUB_KEY_SIZE + 1]; word32 pubKeyLen = (word32)sizeof(pubKey); if (input == NULL || inOutIdx == NULL || key == NULL || inSz == 0) { @@ -33543,7 +35569,7 @@ byte pubKey[CURVE448_PUB_KEY_SIZE]; word32 pubKeyLen = (word32)sizeof(pubKey); - if (key == NULL || output == NULL) { + if (key == NULL) { return BAD_FUNC_ARG; } @@ -33646,7 +35672,7 @@ /* revocationTime */ /* CS_REVOKED_TIME */ { 2, ASN_GENERALIZED_TIME, 0, 0, 0 }, /* revocationReason [0] EXPLICIT CRLReason OPTIONAL */ -/* CS_REVOKED_REASON */ { 2, ASN_CONTEXT_SPECIFIC | 0, 0, 1, 1 }, +/* CS_REVOKED_REASON */ { 2, ASN_CONTEXT_SPECIFIC | 0, 1, 1, 1 }, /* crlReason */ /* CS_REVOKED_REASON_VAL */ { 3, ASN_ENUMERATED, 0, 0, 0 }, /* unknown [2] IMPLICIT UnknownInfo ::= NULL */ @@ -33843,6 +35869,7 @@ #else DECL_ASNGETDATA(dataASN, singleResponseASN_Length); int ret = 0; + word32 ocspDigestSize = OCSP_DIGEST_SIZE; CertStatus* cs = NULL; word32 serialSz; word32 issuerHashLen; @@ -33889,17 +35916,28 @@ ret = GetASN_Items(singleResponseASN, dataASN, singleResponseASN_Length, 1, source, ioIndex, size); } + if (ret == 0) { + single->hashAlgoOID = + dataASN[SINGLERESPONSEASN_IDX_CID_HASHALGO_OID].data.oid.sum; + ocspDigestSize = (word32)wc_HashGetDigestSize( + wc_OidGetHash((int)single->hashAlgoOID)); + } /* Validate the issuer hash length is the size required. */ - if ((ret == 0) && (issuerHashLen != OCSP_DIGEST_SIZE)) { + if ((ret == 0) && (issuerHashLen != ocspDigestSize)) { ret = ASN_PARSE_E; } /* Validate the issuer key hash length is the size required. */ - if ((ret == 0) && (issuerKeyHashLen != OCSP_DIGEST_SIZE)) { - ret = ASN_PARSE_E; + if (ret == 0) { + if (issuerKeyHashLen != ocspDigestSize) { + ret = ASN_PARSE_E; + } } if (ret == 0) { /* Store serial size. */ - cs->serialSz = serialSz; + cs->serialSz = (int)serialSz; + /* Set the hash algorithm OID */ + single->hashAlgoOID = + dataASN[SINGLERESPONSEASN_IDX_CID_HASHALGO_OID].data.oid.sum; /* Determine status by which item was found. */ if (dataASN[SINGLERESPONSEASN_IDX_CS_GOOD].tag != 0) { @@ -33930,7 +35968,7 @@ at = &cs->thisDateParsed; at->type = ASN_GENERALIZED_TIME; XMEMCPY(at->data, cs->thisDate, thisDateLen); - at->length = thisDateLen; + at->length = (int)thisDateLen; #endif } if ((ret == 0) && @@ -33954,7 +35992,7 @@ at = &cs->nextDateParsed; at->type = ASN_GENERALIZED_TIME; XMEMCPY(at->data, cs->nextDate, nextDateLen); - at->length = nextDateLen; + at->length = (int)nextDateLen; #endif } if (ret == 0) { @@ -34095,7 +36133,7 @@ source, &idx, sz); if (ret == 0) { word32 oid = dataASN[CERTEXTASN_IDX_OID].data.oid.sum; - int length = dataASN[CERTEXTASN_IDX_VAL].length; + int length = (int)dataASN[CERTEXTASN_IDX_VAL].length; if (oid == OCSP_NONCE_OID) { /* Extract nonce data. */ @@ -34110,7 +36148,7 @@ /* Ignore all other extension types. */ /* Skip over rest of extension. */ - idx += length; + idx += (word32)length; } } @@ -34256,7 +36294,8 @@ DECL_ASNGETDATA(dataASN, ocspRespDataASN_Length); int ret = 0; byte version; - word32 dateSz, idx = *ioIndex; + word32 dateSz = 0; + word32 idx = *ioIndex; OcspEntry* single = NULL; WOLFSSL_ENTER("DecodeResponseData"); @@ -34279,12 +36318,16 @@ 1, source, ioIndex, size); } /* Only support v1 == 0 */ - if ((ret == 0) && (version != 0)) { - ret = ASN_PARSE_E; + if (ret == 0) { + if (version != 0) { + ret = ASN_PARSE_E; + } } /* Ensure date is a minimal size. */ - if ((ret == 0) && (dateSz < MIN_DATE_SIZE)) { - ret = ASN_PARSE_E; + if (ret == 0) { + if (dateSz < MIN_DATE_SIZE) { + ret = ASN_PARSE_E; + } } if (ret == 0) { /* TODO: use byName/byKey fields. */ @@ -34330,8 +36373,8 @@ if (ret == 0) { /* Decode SingleResponse into OcspEntry. */ ret = DecodeSingleResponse(source, &idx, - dataASN[OCSPRESPDATAASN_IDX_RESPEXT].offset, - dataASN[OCSPRESPDATAASN_IDX_RESP].length, single); + dataASN[OCSPRESPDATAASN_IDX_RESPEXT].offset, + (int)dataASN[OCSPRESPDATAASN_IDX_RESP].length, single); /* single->used set on successful decode. */ } } @@ -34516,7 +36559,7 @@ /* Don't verify if we don't have access to Cert Manager. */ ret = ParseCertRelative(cert, CERT_TYPE, noVerify ? NO_VERIFY : VERIFY_OCSP_CERT, - cm); + cm, resp->pendingCAs); if (ret < 0) { WOLFSSL_MSG("\tOCSP Responder certificate parsing failed"); break; @@ -34575,7 +36618,11 @@ #else ca = GetCA(cm, resp->single->issuerHash); #endif - +#if defined(HAVE_CERTIFICATE_STATUS_V2) + if (ca == NULL && resp->pendingCAs != NULL) { + ca = findSignerByName(resp->pendingCAs, resp->single->issuerHash); + } +#endif if (ca) { SignatureCtx sigCtx; InitSignatureCtx(&sigCtx, heap, INVALID_DEVID); @@ -34626,13 +36673,11 @@ if (ret == 0) { word32 dataIdx = 0; /* Decode the response data. */ - if (DecodeResponseData( + ret = DecodeResponseData( GetASNItem_Addr(dataASN[OCSPBASICRESPASN_IDX_TBS_SEQ], source), &dataIdx, resp, GetASNItem_Length(dataASN[OCSPBASICRESPASN_IDX_TBS_SEQ], source) - ) < 0) { - ret = ASN_PARSE_E; - } + ); } #ifdef WC_RSA_PSS if (ret == 0 && (dataASN[OCSPBASICRESPASN_IDX_SIGNATURE_PARAMS].tag != 0)) { @@ -34669,17 +36714,24 @@ if ((ret == 0) && (dataASN[OCSPBASICRESPASN_IDX_CERTS_SEQ].data.ref.data != NULL)) { #endif - /* Initialize the crtificate object. */ + /* Initialize the certificate object. */ InitDecodedCert(cert, resp->cert, resp->certSz, heap); certInit = 1; /* Parse the certificate and don't verify if we don't have access to * Cert Manager. */ ret = ParseCertRelative(cert, CERT_TYPE, noVerify ? NO_VERIFY : VERIFY, - cm); + cm, resp->pendingCAs); if (ret < 0) { WOLFSSL_MSG("\tOCSP Responder certificate parsing failed"); } } +#ifndef WOLFSSL_NO_OCSP_ISSUER_CHECK + if ((ret == 0) && + (dataASN[OCSPBASICRESPASN_IDX_CERTS_SEQ].data.ref.data != NULL) && + !noVerify) { + ret = CheckOcspResponder(resp, cert, cm); + } +#endif /* WOLFSSL_NO_OCSP_ISSUER_CHECK */ if ((ret == 0) && (dataASN[OCSPBASICRESPASN_IDX_CERTS_SEQ].data.ref.data != NULL)) { /* TODO: ConfirmSignature is blocking here */ @@ -34701,12 +36753,19 @@ Signer* ca; int sigValid = -1; - /* Resonse didn't have a certificate - lookup CA. */ + /* Response didn't have a certificate - lookup CA. */ #ifndef NO_SKID ca = GetCA(cm, resp->single->issuerKeyHash); #else ca = GetCA(cm, resp->single->issuerHash); #endif + + #if defined(HAVE_CERTIFICATE_STATUS_REQUEST_V2) + if (ca == NULL && resp->pendingCAs != NULL) { + ca = findSignerByName(resp->pendingCAs, resp->single->issuerHash); + } + #endif + if (ca) { SignatureCtx sigCtx; @@ -34764,6 +36823,7 @@ resp->source = source; resp->maxIdx = inSz; resp->heap = heap; + resp->pendingCAs = NULL; } void FreeOcspResponse(OcspResponse* resp) @@ -34899,7 +36959,7 @@ int ret = 0; word32 idx = 0, size = resp->maxIdx; byte* source = resp->source; - byte status; + byte status = 0; byte* basic; word32 basicSz; @@ -34951,7 +37011,7 @@ /* EXT */ { 1, ASN_SEQUENCE, 1, 1, 0 }, /* extnId */ /* EXT_OID */ {2, ASN_OBJECT_ID, 0, 0, 0 }, - /* critcal not encoded. */ + /* critical not encoded. */ /* extnValue */ /* EXT_VAL */ {2, ASN_OCTET_STRING, 0, 1, 0 }, /* nonce */ @@ -35024,18 +37084,20 @@ /* Check request has nonce to write in extension. */ if (req != NULL && req->nonceSz != 0) { DECL_ASNSETDATA(dataASN, ocspNonceExtASN_Length); - int sz; + int sz = 0; CALLOC_ASNSETDATA(dataASN, ocspNonceExtASN_Length, ret, req->heap); - /* Set nonce extension OID and nonce. */ - SetASN_Buffer(&dataASN[OCSPNONCEEXTASN_IDX_EXT_OID], NonceObjId, - sizeof(NonceObjId)); - SetASN_Buffer(&dataASN[OCSPNONCEEXTASN_IDX_EXT_NONCE], req->nonce, - req->nonceSz); - /* Calculate size of nonce extension. */ - ret = SizeASN_Items(ocspNonceExtASN, dataASN, ocspNonceExtASN_Length, - &sz); + if (ret == 0) { + /* Set nonce extension OID and nonce. */ + SetASN_Buffer(&dataASN[OCSPNONCEEXTASN_IDX_EXT_OID], NonceObjId, + sizeof(NonceObjId)); + SetASN_Buffer(&dataASN[OCSPNONCEEXTASN_IDX_EXT_NONCE], req->nonce, + (word32)req->nonceSz); + /* Calculate size of nonce extension. */ + ret = SizeASN_Items(ocspNonceExtASN, dataASN, + ocspNonceExtASN_Length, &sz); + } /* Check buffer big enough for encoding if supplied. */ if ((ret == 0) && (output != NULL) && (sz > (int)size)) { ret = BUFFER_E; @@ -35053,7 +37115,7 @@ FREE_ASNSETDATA(dataASN, req->heap); } - return ret; + return (word32)ret; #endif /* WOLFSSL_ASN_TEMPLATE */ } @@ -35118,17 +37180,20 @@ byte extArray[MAX_OCSP_EXT_SZ]; word32 seqSz[5], algoSz, issuerSz, issuerKeySz, extSz, totalSz; int i, snSz; + int keyIdSz; WOLFSSL_ENTER("EncodeOcspRequest"); #ifdef NO_SHA algoSz = SetAlgoID(SHA256h, algoArray, oidHashType, 0); + keyIdSz = WC_SHA256_DIGEST_SIZE; #else algoSz = SetAlgoID(SHAh, algoArray, oidHashType, 0); + keyIdSz = WC_SHA_DIGEST_SIZE; #endif - issuerSz = SetDigest(req->issuerHash, KEYID_SIZE, issuerArray); - issuerKeySz = SetDigest(req->issuerKeyHash, KEYID_SIZE, issuerKeyArray); + issuerSz = SetDigest(req->issuerHash, keyIdSz, issuerArray); + issuerKeySz = SetDigest(req->issuerKeyHash, keyIdSz, issuerKeyArray); snSz = SetSerialNumber(req->serial, req->serialSz, snArray, MAX_SN_SZ, MAX_SN_SZ); extSz = 0; @@ -35142,7 +37207,7 @@ */ extSz = EncodeOcspRequestExtensions(req, extArray + 2, OCSP_NONCE_EXT_SZ); - extSz += SetExplicit(2, extSz, extArray); + extSz += SetExplicit(2, extSz, extArray, 0); } totalSz = algoSz + issuerSz + issuerKeySz + snSz; @@ -35186,6 +37251,7 @@ word32 extSz = 0; int sz = 0; int ret = 0; + word32 keyIdSz; WOLFSSL_ENTER("EncodeOcspRequest"); @@ -35196,22 +37262,24 @@ #ifdef NO_SHA SetASN_OID(&dataASN[OCSPREQUESTASN_IDX_TBS_REQ_HASH_OID], SHA256h, oidHashType); + keyIdSz = WC_SHA256_DIGEST_SIZE; #else SetASN_OID(&dataASN[OCSPREQUESTASN_IDX_TBS_REQ_HASH_OID], SHAh, oidHashType); + keyIdSz = WC_SHA_DIGEST_SIZE; #endif /* Set issuer, issuer key hash and serial number of certificate being * checked. */ SetASN_Buffer(&dataASN[OCSPREQUESTASN_IDX_TBS_REQ_ISSUER], - req->issuerHash, KEYID_SIZE); + req->issuerHash, keyIdSz); SetASN_Buffer(&dataASN[OCSPREQUESTASN_IDX_TBS_REQ_ISSUERKEY], - req->issuerKeyHash, KEYID_SIZE); + req->issuerKeyHash, keyIdSz); SetASN_Buffer(&dataASN[OCSPREQUESTASN_IDX_TBS_REQ_SERIAL], - req->serial, req->serialSz); + req->serial, (word32)req->serialSz); /* Only extension to write is nonce - check if one to encode. */ if (req->nonceSz) { /* Get size of extensions and leave space for them in encoding. */ - ret = extSz = EncodeOcspRequestExtensions(req, NULL, 0); + ret = (int)(extSz = EncodeOcspRequestExtensions(req, NULL, 0)); SetASN_Buffer(&dataASN[OCSPREQUESTASN_IDX_TBS_REQEXT], NULL, extSz); if (ret > 0) { ret = 0; @@ -35236,7 +37304,7 @@ SetASN_Items(ocspRequestASN, dataASN, ocspRequestASN_Length, output); if (req->nonceSz) { /* Encode extensions into space provided. */ - ret = EncodeOcspRequestExtensions(req, + ret = (int)EncodeOcspRequestExtensions(req, (byte*)dataASN[OCSPREQUESTASN_IDX_TBS_REQEXT].data.buffer.data, extSz); if (ret > 0) { @@ -35273,24 +37341,24 @@ XMEMCPY(req->issuerHash, cert->issuerHash, KEYID_SIZE); XMEMCPY(req->issuerKeyHash, cert->issuerKeyHash, KEYID_SIZE); - req->serial = (byte*)XMALLOC(cert->serialSz, req->heap, + req->serial = (byte*)XMALLOC((size_t)cert->serialSz, req->heap, DYNAMIC_TYPE_OCSP_REQUEST); if (req->serial == NULL) return MEMORY_E; - XMEMCPY(req->serial, cert->serial, cert->serialSz); + XMEMCPY(req->serial, cert->serial, (size_t)cert->serialSz); req->serialSz = cert->serialSz; if (cert->extAuthInfoSz != 0 && cert->extAuthInfo != NULL) { - req->url = (byte*)XMALLOC(cert->extAuthInfoSz + 1, req->heap, - DYNAMIC_TYPE_OCSP_REQUEST); + req->url = (byte*)XMALLOC((size_t)cert->extAuthInfoSz + 1, + req->heap, DYNAMIC_TYPE_OCSP_REQUEST); if (req->url == NULL) { XFREE(req->serial, req->heap, DYNAMIC_TYPE_OCSP); req->serial = NULL; return MEMORY_E; } - XMEMCPY(req->url, cert->extAuthInfo, cert->extAuthInfoSz); + XMEMCPY(req->url, cert->extAuthInfo, (size_t)cert->extAuthInfoSz); req->urlSz = cert->extAuthInfoSz; req->url[req->urlSz] = 0; } @@ -35341,6 +37409,14 @@ if (req->url) XFREE(req->url, req->heap, DYNAMIC_TYPE_OCSP_REQUEST); req->url = NULL; + +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_APACHE_HTTPD) || \ + defined(HAVE_LIGHTY) + if (req->cid != NULL) + wolfSSL_OCSP_CERTID_free((WOLFSSL_OCSP_CERTID*)req->cid); + req->cid = NULL; +#endif } } @@ -35348,6 +37424,7 @@ int CompareOcspReqResp(OcspRequest* req, OcspResponse* resp) { int cmp = -1; /* default as not matching, cmp gets set on each check */ + int ocspDigestSize; OcspEntry *single, *next, *prev = NULL, *top; WOLFSSL_ENTER("CompareOcspReqResp"); @@ -35374,7 +37451,7 @@ return cmp; } - cmp = XMEMCMP(req->nonce, resp->nonce, req->nonceSz); + cmp = XMEMCMP(req->nonce, resp->nonce, (size_t)req->nonceSz); if (cmp != 0) { WOLFSSL_MSG("\tnonce mismatch"); return cmp; @@ -35383,11 +37460,20 @@ /* match based on found status and return */ for (single = resp->single; single; single = next) { + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + ocspDigestSize = wc_HashGetDigestSize( + wc_OidGetHash(single->hashAlgoOID)); + #else + ocspDigestSize = OCSP_DIGEST_SIZE; + #endif cmp = req->serialSz - single->status->serialSz; if (cmp == 0) { - cmp = XMEMCMP(req->serial, single->status->serial, req->serialSz) - || XMEMCMP(req->issuerHash, single->issuerHash, OCSP_DIGEST_SIZE) - || XMEMCMP(req->issuerKeyHash, single->issuerKeyHash, OCSP_DIGEST_SIZE); + cmp = XMEMCMP(req->serial, single->status->serial, + (size_t)req->serialSz) + || XMEMCMP(req->issuerHash, single->issuerHash, + (size_t)ocspDigestSize) + || XMEMCMP(req->issuerKeyHash, single->issuerKeyHash, + (size_t)ocspDigestSize); if (cmp == 0) { /* match found */ if (resp->single != single && prev) { @@ -35433,6 +37519,14 @@ /* store WC_SHA hash of NAME */ int GetNameHash(const byte* source, word32* idx, byte* hash, int maxIdx) { + /* Use summy signature OID. */ + return GetNameHash_ex(source, idx, hash, maxIdx, 0); +} + +/* store WC_SHA hash of NAME */ +int GetNameHash_ex(const byte* source, word32* idx, byte* hash, int maxIdx, + word32 sigOID) +{ #ifndef WOLFSSL_ASN_TEMPLATE int length; /* length of all distinguished names */ int ret; @@ -35460,7 +37554,8 @@ if (GetSequence(source, idx, &length, (word32)maxIdx) < 0) return ASN_PARSE_E; - ret = CalcHashId(source + dummy, (word32)length + *idx - dummy, hash); + ret = CalcHashId_ex(source + dummy, (word32)length + *idx - dummy, hash, + HashIdAlg(sigOID)); *idx += (word32)length; @@ -35480,10 +37575,10 @@ * calculated over the entire DER encoding of the Name field, including * the tag and length. */ /* Calculate hash of complete name including SEQUENCE. */ - ret = CalcHashId( + ret = CalcHashId_ex( GetASNItem_Addr(dataASN[NAMEHASHASN_IDX_NAME], source), GetASNItem_Length(dataASN[NAMEHASHASN_IDX_NAME], source), - hash); + hash, HashIdAlg(sigOID)); } return ret; @@ -35497,13 +37592,13 @@ { char* out; - out = (char*)XMALLOC(sz, NULL, DYNAMIC_TYPE_OPENSSL); + out = (char*)XMALLOC((size_t)sz, NULL, DYNAMIC_TYPE_OPENSSL); if (out == NULL) { WOLFSSL_MSG("Name malloc failed"); return NULL; } - XMEMCPY(out, source, sz); + XMEMCPY(out, source, (size_t)sz); return out; } @@ -35569,7 +37664,7 @@ /* Get Revoked Cert list, 0 on success */ static int GetRevoked(RevokedCert* rcert, const byte* buff, word32* idx, - DecodedCRL* dcrl, int maxIdx) + DecodedCRL* dcrl, word32 maxIdx) { #ifndef WOLFSSL_ASN_TEMPLATE int ret; @@ -35673,7 +37768,7 @@ } if (ret == 0) { /* Store size of serial number. */ - rc->serialSz = serialSz; + rc->serialSz = (int)serialSz; rc->revDateFormat = (dataASN[REVOKEDASN_IDX_TIME_UTC].tag != 0) ? dataASN[REVOKEDASN_IDX_TIME_UTC].tag : dataASN[REVOKEDASN_IDX_TIME_GT].tag; @@ -35713,7 +37808,7 @@ { int ret = 0; - /* Parse each revoked cerificate. */ + /* Parse each revoked certificate. */ while ((ret == 0) && (idx < maxIdx)) { /* Parse a revoked certificate. */ if (GetRevoked(rcert, buff, &idx, dcrl, maxIdx) < 0) { @@ -35749,7 +37844,8 @@ int VerifyCRL_Signature(SignatureCtx* sigCtx, const byte* toBeSigned, word32 tbsSz, const byte* signature, word32 sigSz, - word32 signatureOID, Signer *ca, void* heap) + word32 signatureOID, const byte* sigParams, + int sigParamsSz, Signer *ca, void* heap) { /* try to confirm/verify signature */ #ifndef IGNORE_KEY_EXTENSIONS @@ -35763,7 +37859,7 @@ InitSignatureCtx(sigCtx, heap, INVALID_DEVID); if (ConfirmSignature(sigCtx, toBeSigned, tbsSz, ca->publicKey, ca->pubKeySize, ca->keyOID, signature, sigSz, - signatureOID, NULL, 0, NULL) != 0) { + signatureOID, sigParams, (word32)sigParamsSz, NULL) != 0) { WOLFSSL_MSG("CRL Confirm signature failed"); WOLFSSL_ERROR_VERBOSE(ASN_CRL_CONFIRM_E); return ASN_CRL_CONFIRM_E; @@ -35782,7 +37878,8 @@ * @return ASN_CRL_NO_SIGNER_E when no signer found. * @return ASN_CRL_CONFIRM_E when signature did not verify. */ -static int PaseCRL_CheckSignature(DecodedCRL* dcrl, const byte* buff, void* cm) +static int PaseCRL_CheckSignature(DecodedCRL* dcrl, const byte* sigParams, + int sigParamsSz, const byte* buff, void* cm) { int ret = 0; Signer* ca = NULL; @@ -35798,7 +37895,7 @@ } /* Check issuerHash matched CA's subjectNameHash. */ if ((ca != NULL) && (XMEMCMP(dcrl->issuerHash, ca->subjectNameHash, - KEYID_SIZE) != 0)) { + KEYID_SIZE) != 0)) { ca = NULL; } if (ca == NULL) { @@ -35826,7 +37923,7 @@ /* Verify CRL signature with CA. */ ret = VerifyCRL_Signature(&sigCtx, buff + dcrl->certBegin, dcrl->sigIndex - dcrl->certBegin, dcrl->signature, dcrl->sigLength, - dcrl->signatureOID, ca, dcrl->heap); + dcrl->signatureOID, sigParams, sigParamsSz, ca, dcrl->heap); } return ret; @@ -35858,8 +37955,24 @@ dcrl->version++; } - if (GetAlgoId(buf, &idx, &oid, oidIgnoreType, sz) < 0) + if (GetAlgoId(buf, &idx, &oid, oidIgnoreType, sz) < 0) { return ASN_PARSE_E; + } +#ifdef WC_RSA_PSS + else if (oid == CTC_RSASSAPSS) { + word32 tmpSz; + int len; + + tmpSz = idx; + dcrl->sigParamsIndex = idx; + if (GetSequence(buf, &idx, &len, sz) < 0) { + dcrl->sigParamsIndex = 0; + return ASN_PARSE_E; + } + idx += len; + dcrl->sigParamsLength = idx - tmpSz; + } +#endif checkIdx = idx; if (GetSequence(buf, &checkIdx, &length, sz) < 0) { @@ -35870,7 +37983,7 @@ dcrl->issuer = (byte*)GetNameFromDer(buf + idx, (int)dcrl->issuerSz); #endif - if (GetNameHash(buf, &idx, dcrl->issuerHash, sz) < 0) + if (GetNameHash_ex(buf, &idx, dcrl->issuerHash, sz, oid) < 0) return ASN_PARSE_E; if (GetBasicDate(buf, &idx, dcrl->lastDate, &dcrl->lastDateFormat, sz) < 0) @@ -35894,7 +38007,7 @@ if (doNextDate) #endif { -#ifndef NO_ASN_TIME +#if !defined(NO_ASN_TIME) && !defined(WOLFSSL_NO_CRL_DATE_CHECK) if (verify != NO_VERIFY && !XVALIDATE_DATE(dcrl->nextDate, dcrl->nextDateFormat, AFTER)) { WOLFSSL_MSG("CRL after date is no longer valid"); @@ -35960,7 +38073,8 @@ dcrl->extAuthKeyIdSet = 1; /* Get the hash or hash of the hash if wrong size. */ - ret = GetHashId(input + idx, length, dcrl->extAuthKeyId); + ret = GetHashId(input + idx, length, dcrl->extAuthKeyId, + HashIdAlg(dcrl->signatureOID)); return ret; #else @@ -35975,7 +38089,7 @@ if (ret == 0) { /* Parse an authority key identifier. */ ret = GetASN_Items(authKeyIdASN, dataASN, authKeyIdASN_Length, 1, input, - &idx, sz); + &idx, (word32)sz); } if (ret == 0) { /* Key id is optional. */ @@ -35985,8 +38099,8 @@ else { /* Get the hash or hash of the hash if wrong size. */ ret = GetHashId(dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.data, - dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.length, - dcrl->extAuthKeyId); + (int)dataASN[AUTHKEYIDASN_IDX_KEYID].data.ref.length, + dcrl->extAuthKeyId, HashIdAlg(dcrl->signatureOID)); } } @@ -36165,7 +38279,7 @@ /* Clear dynamic data. */ XMEMSET(dataASN, 0, sizeof(*dataASN) * certExtASN_Length); - /* Ensure OID is an extention type. */ + /* Ensure OID is an extension type. */ GetASN_OID(&dataASN[CERTEXTASN_IDX_OID], oidCertExtType); /* Set criticality variable. */ GetASN_Int8Bit(&dataASN[CERTEXTASN_IDX_CRIT], &critical); @@ -36176,11 +38290,11 @@ /* OID in extension. */ word32 oid = dataASN[CERTEXTASN_IDX_OID].data.oid.sum; /* Length of extension data. */ - int length = dataASN[CERTEXTASN_IDX_VAL].length; + int length = (int)dataASN[CERTEXTASN_IDX_VAL].length; if (oid == AUTH_KEY_OID) { #ifndef NO_SKID - /* Parse Authority Key Id extesion. + /* Parse Authority Key Id extension. * idx is at start of OCTET_STRING data. */ ret = ParseCRL_AuthKeyIdExt(buf + idx, length, dcrl); if (ret != 0) { @@ -36191,7 +38305,7 @@ /* TODO: Parse CRL Number extension */ /* TODO: check criticality */ /* Move index on to next extension. */ - idx += length; + idx += (word32)length; } } @@ -36222,6 +38336,9 @@ /* TBS_SIGALGO_OID */ { 3, ASN_OBJECT_ID, 0, 0, 0 }, /* TBS_SIGALGO_NULL */ { 3, ASN_TAG_NULL, 0, 0, 1 }, /* issuer */ +#ifdef WC_RSA_PSS +/* TBS_SIGALGO_P_SEQ */ { 3, ASN_SEQUENCE, 1, 0, 2 }, +#endif /* TBS_ISSUER */ { 2, ASN_SEQUENCE, 1, 0, 0 }, /* thisUpdate */ /* TBS_THISUPDATE_UTC */ { 2, ASN_UTC_TIME, 0, 0, 2 }, @@ -36238,6 +38355,9 @@ /* SIGALGO */ { 1, ASN_SEQUENCE, 1, 1, 0 }, /* SIGALGO_OID */ { 2, ASN_OBJECT_ID, 0, 0, 0 }, /* SIGALGO_NULL */ { 2, ASN_TAG_NULL, 0, 0, 1 }, +#ifdef WC_RSA_PSS +/* SIGALGO_PARAMS */ { 2, ASN_SEQUENCE, 1, 0, 2 }, +#endif /* signatureValue */ /* SIGNATURE */ { 1, ASN_BIT_STRING, 0, 0, 0 }, }; @@ -36248,6 +38368,9 @@ CRLASN_IDX_TBS_SIGALGO, CRLASN_IDX_TBS_SIGALGO_OID, CRLASN_IDX_TBS_SIGALGO_NULL, +#ifdef WC_RSA_PSS + CRLASN_IDX_TBS_SIGALGO_PARAMS, +#endif CRLASN_IDX_TBS_ISSUER, CRLASN_IDX_TBS_THISUPDATE_UTC, CRLASN_IDX_TBS_THISUPDATE_GT, @@ -36259,6 +38382,9 @@ CRLASN_IDX_SIGALGO, CRLASN_IDX_SIGALGO_OID, CRLASN_IDX_SIGALGO_NULL, +#ifdef WC_RSA_PSS + CRLASN_IDX_SIGALGO_PARAMS, +#endif CRLASN_IDX_SIGNATURE, }; @@ -36276,6 +38402,10 @@ int ret = 0; int len; word32 idx = 0; +#ifdef WC_RSA_PSS + const byte* sigParams = NULL; + int sigParamsSz = 0; +#endif WOLFSSL_MSG("ParseCRL"); @@ -36305,8 +38435,24 @@ idx = dcrl->sigIndex; - if (GetAlgoId(buff, &idx, &dcrl->signatureOID, oidSigType, sz) < 0) + if (GetAlgoId(buff, &idx, &dcrl->signatureOID, oidSigType, sz) < 0) { return ASN_PARSE_E; + } +#ifdef WC_RSA_PSS + else if (dcrl->signatureOID == CTC_RSASSAPSS) { + word32 tmpSz; + const byte* params; + + tmpSz = idx; + params = buff + idx; + if (GetSequence(buff, &idx, &len, sz) < 0) { + return ASN_PARSE_E; + } + idx += len; + sigParams = params; + sigParamsSz = idx - tmpSz; + } +#endif if (GetCRL_Signature(buff, &idx, dcrl, sz) < 0) return ASN_PARSE_E; @@ -36319,7 +38465,7 @@ ca = GetCA(cm, dcrl->extAuthKeyId); /* more unique than issuerHash */ } if (ca != NULL && XMEMCMP(dcrl->issuerHash, ca->subjectNameHash, - KEYID_SIZE) != 0) { + KEYID_SIZE) != 0) { ca = NULL; } if (ca == NULL) { @@ -36346,7 +38492,7 @@ WOLFSSL_MSG("Found CRL issuer CA"); ret = VerifyCRL_Signature(&sigCtx, buff + dcrl->certBegin, dcrl->sigIndex - dcrl->certBegin, dcrl->signature, dcrl->sigLength, - dcrl->signatureOID, ca, dcrl->heap); + dcrl->signatureOID, sigParams, sigParamsSz, ca, dcrl->heap); end: return ret; @@ -36359,6 +38505,12 @@ /* Size of buffer for date. */ word32 lastDateSz = MAX_DATE_SIZE; word32 nextDateSz = MAX_DATE_SIZE; + const byte* sigParams = NULL; + int sigParamsSz = 0; +#ifdef WC_RSA_PSS + const byte* tbsParams = NULL; + int tbsParamsSz = 0; +#endif /* When NO_ASN_TIME is defined, verify not used. */ (void)verify; @@ -36411,11 +38563,54 @@ dcrl->certBegin = dataASN[CRLASN_IDX_TBS].offset; /* Store index of signature. */ dcrl->sigIndex = dataASN[CRLASN_IDX_SIGALGO].offset; + + #ifdef WC_RSA_PSS + /* get TBS and Signature parameters for PSS */ + if (dataASN[CRLASN_IDX_TBS_SIGALGO_PARAMS].tag != 0) { + tbsParams = + GetASNItem_Addr(dataASN[CRLASN_IDX_TBS_SIGALGO_PARAMS], + buff); + tbsParamsSz = + GetASNItem_Length(dataASN[CRLASN_IDX_TBS_SIGALGO_PARAMS], + buff); + } + if (dataASN[CRLASN_IDX_SIGALGO_PARAMS].tag != 0) { + sigParams = + GetASNItem_Addr(dataASN[CRLASN_IDX_SIGALGO_PARAMS], + buff); + sigParamsSz = + GetASNItem_Length(dataASN[CRLASN_IDX_SIGALGO_PARAMS], + buff); + dcrl->sigParamsIndex = + dataASN[CRLASN_IDX_SIGALGO_PARAMS].offset; + dcrl->sigParamsLength = (word32)sigParamsSz; + } + #endif + /* Store address and length of signature data. */ GetASN_GetRef(&dataASN[CRLASN_IDX_SIGNATURE], &dcrl->signature, &dcrl->sigLength); /* Get the signature OID. */ dcrl->signatureOID = dataASN[CRLASN_IDX_SIGALGO_OID].data.oid.sum; + + #ifdef WC_RSA_PSS + /* Sanity check on parameters found */ + if (tbsParamsSz != sigParamsSz) { + WOLFSSL_MSG("CRL TBS and signature parameter sizes mismatch"); + ret = ASN_PARSE_E; + } + else if ((tbsParamsSz > 0) && + (dataASN[CRLASN_IDX_TBS_SIGALGO_OID].data.oid.sum != CTC_RSASSAPSS)) { + WOLFSSL_MSG("CRL unexpected signature parameters found"); + ret = ASN_PARSE_E; + } + else if ((tbsParamsSz > 0) && + (XMEMCMP(tbsParams, sigParams, tbsParamsSz) != 0)) { + WOLFSSL_MSG("CRL TBS and signature parameter mismatch"); + ret = ASN_PARSE_E; + } + #endif + /* Get the format/tag of the last and next date. */ dcrl->lastDateFormat = (dataASN[CRLASN_IDX_TBS_THISUPDATE_UTC].tag != 0) ? dataASN[CRLASN_IDX_TBS_THISUPDATE_UTC].tag @@ -36423,7 +38618,7 @@ dcrl->nextDateFormat = (dataASN[CRLASN_IDX_TBS_NEXTUPDATE_UTC].tag != 0) ? dataASN[CRLASN_IDX_TBS_NEXTUPDATE_UTC].tag : dataASN[CRLASN_IDX_TBS_NEXTUPDATE_GT].tag; - #ifndef NO_ASN_TIME + #if !defined(NO_ASN_TIME) && !defined(WOLFSSL_NO_CRL_DATE_CHECK) if (dcrl->nextDateFormat != 0) { /* Next date was set, so validate it. */ if (verify != NO_VERIFY && @@ -36434,8 +38629,8 @@ } } } - if (ret == 0) { - #endif + if (ret == 0) { /* in "no time" cases above "ret" is not set */ + #endif /* !NO_ASN_TIME && !WOLFSSL_NO_CRL_DATE_CHECK */ #ifdef OPENSSL_EXTRA /* Parse and store the issuer name. */ dcrl->issuerSz = GetASNItem_Length(dataASN[CRLASN_IDX_TBS_ISSUER], @@ -36445,16 +38640,17 @@ (int)dcrl->issuerSz); #endif /* Calculate the Hash id from the issuer name. */ - ret = CalcHashId(GetASNItem_Addr(dataASN[CRLASN_IDX_TBS_ISSUER], buff), + ret = CalcHashId_ex( + GetASNItem_Addr(dataASN[CRLASN_IDX_TBS_ISSUER], buff), GetASNItem_Length(dataASN[CRLASN_IDX_TBS_ISSUER], buff), - dcrl->issuerHash); + dcrl->issuerHash, HashIdAlg(dcrl->signatureOID)); if (ret < 0) { ret = ASN_PARSE_E; } } if ((ret == 0) && (dataASN[CRLASN_IDX_TBS_REVOKEDCERTS].tag != 0)) { - /* Parse revoked cerificates - starting after SEQUENCE OF. */ + /* Parse revoked certificates - starting after SEQUENCE OF. */ ret = ParseCRL_RevokedCerts(rcert, dcrl, buff, GetASNItem_DataIdx(dataASN[CRLASN_IDX_TBS_REVOKEDCERTS], buff), GetASNItem_EndIdx(dataASN[CRLASN_IDX_TBS_REVOKEDCERTS], buff)); @@ -36467,7 +38663,7 @@ } if (ret == 0) { /* Find signer and verify signature. */ - ret = PaseCRL_CheckSignature(dcrl, buff, cm); + ret = PaseCRL_CheckSignature(dcrl, sigParams, sigParamsSz, buff, cm); } FREE_ASNGETDATA(dataASN, dcrl->heap); @@ -36635,7 +38831,7 @@ GetASN_Int8Bit(&dataASN[PIVCERTASN_IDX_INFO], &info); /* Start parsing from start of buffer. */ idx = 0; - /* Parse PIV cetificate data. */ + /* Parse PIV certificate data. */ ret = GetASN_Items(pivCertASN, dataASN, pivCertASN_Length, 1, buf, &idx, totalSz); if (ret == 0) { @@ -36696,13 +38892,17 @@ goto error; } nextHdr = (MimeHdr*)XMALLOC(sizeof(MimeHdr), NULL, DYNAMIC_TYPE_PKCS7); + if (nextHdr == NULL) { + ret = MEMORY_E; + goto error; + } + XMEMSET(nextHdr, 0, sizeof(MimeHdr)); nextParam = (MimeParam*)XMALLOC(sizeof(MimeParam), NULL, DYNAMIC_TYPE_PKCS7); - if (nextHdr == NULL || nextParam == NULL) { + if (nextParam == NULL) { ret = MEMORY_E; goto error; } - XMEMSET(nextHdr, 0, sizeof(MimeHdr)); XMEMSET(nextParam, 0, sizeof(MimeParam)); curLine = XSTRTOK(in, "\r\n", &ptr); @@ -36734,8 +38934,10 @@ mimeType == MIME_PARAM)) && pos >= 1) { mimeStatus = MIME_BODYVAL; end = pos-1; - if (nameAttr != NULL) + if (nameAttr != NULL) { XFREE(nameAttr, NULL, DYNAMIC_TYPE_PKCS7); + nameAttr = NULL; + } ret = wc_MIME_header_strip(curLine, &nameAttr, start, end); if (ret) { goto error; @@ -36744,8 +38946,10 @@ } else if (mimeStatus == MIME_BODYVAL && cur == ';' && pos >= 1) { end = pos-1; - if (bodyVal != NULL) + if (bodyVal != NULL) { XFREE(bodyVal, NULL, DYNAMIC_TYPE_PKCS7); + bodyVal = NULL; + } ret = wc_MIME_header_strip(curLine, &bodyVal, start, end); if (ret) { goto error; @@ -36842,7 +39046,8 @@ XFREE(nameAttr, NULL, DYNAMIC_TYPE_PKCS7); if (bodyVal != NULL) XFREE(bodyVal, NULL, DYNAMIC_TYPE_PKCS7); - XFREE(nextParam, NULL, DYNAMIC_TYPE_PKCS7); + if (nextParam != NULL) + XFREE(nextParam, NULL, DYNAMIC_TYPE_PKCS7); return ret; } @@ -37006,7 +39211,7 @@ #ifdef WOLFSSL_ASN_PRINT /******************************************************************************* - * ASN.1 Parsing and Printing Implemenation + * ASN.1 Parsing and Printing Implementation ******************************************************************************/ /* Initialize ASN.1 print options. @@ -37147,9 +39352,6 @@ return ret; } -/* Maximum OID dotted form size. */ -#define ASN1_OID_DOTTED_MAX_SZ 16 - /* Print OID in dotted form or as hex bytes. * * @param [in] file File pointer to write to. @@ -37167,7 +39369,7 @@ /* Print out each number of dotted form. */ for (i = 0; i < num; i++) { XFPRINTF(file, "%d", dotted_nums[i]); - /* Add separetor. */ + /* Add separator. */ if (i < num - 1) { XFPRINTF(file, "."); } @@ -37177,7 +39379,7 @@ /* Print out bytes as we couldn't decode. */ for (i = 0; i < len; i++) { XFPRINTF(file, "%02x", oid[i]); - /* Add separetor. */ + /* Add separator. */ if (i < len - 1) { XFPRINTF(file, ":"); } @@ -37255,7 +39457,7 @@ /* Get the OID value for the OBJECT_ID. */ if (GetObjectId(asn1->data + asn1->offset, &i, &oid, oidIgnoreType, - asn1->item.len + 2) == ASN_PARSE_E) { + asn1->item.len + 2) == WC_NO_ERR_TRACE(ASN_PARSE_E)) { known = 0; } else @@ -37577,7 +39779,7 @@ } } -/* Print ASN.1 item info based on header and indeces. +/* Print ASN.1 item info based on header and indices. * * @param [in] asn1 ASN.1 parse object. * @param [in] opts ASN.1 options for printing. @@ -37678,7 +39880,7 @@ /* Done with this ASN.1 item. */ asn1->part = ASN_PART_TAG; } - /* Check end indeces are valid. */ + /* Check end indices are valid. */ ret = CheckDepth(asn1); } } @@ -37700,7 +39902,7 @@ } /* Step past data to next ASN.1 item. */ asn1->curr += asn1->item.len; - /* Update the depth based on end indeces. */ + /* Update the depth based on end indices. */ UpdateDepth(asn1); /* Done with this ASN.1 item. */ asn1->part = ASN_PART_TAG; @@ -37774,8 +39976,7 @@ #endif /* !NO_ASN */ /* Functions that parse, but are not using ASN.1 */ -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) && \ - (!defined(NO_BIG_INT) || defined(WOLFSSL_SP_MATH)) +#if !defined(NO_RSA) && (!defined(NO_BIG_INT) || defined(WOLFSSL_SP_MATH)) /* import RSA public key elements (n, e) into RsaKey structure (key) */ /* this function does not use any ASN.1 parsing */ int wc_RsaPublicKeyDecodeRaw(const byte* n, word32 nSz, const byte* e, @@ -37826,7 +40027,7 @@ return 0; } -#endif /* !NO_RSA && !HAVE_USER_RSA && (!NO_BIG_INT || WOLFSSL_SP_MATH) */ +#endif /* !NO_RSA && (!NO_BIG_INT || WOLFSSL_SP_MATH) */ #ifdef WOLFSSL_SEP diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/camellia.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/camellia.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/camellia.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/camellia.c 2024-08-03 07:30:00.000000000 +0000 @@ -1464,7 +1464,7 @@ * API for compatibility */ -static void Camellia_EncryptBlock(const int keyBitLength, +static void Camellia_EncryptBlock(const word32 keyBitLength, const unsigned char *plaintext, const KEY_TABLE_TYPE keyTable, unsigned char *ciphertext) @@ -1495,7 +1495,7 @@ PUTU32(ciphertext + 12, tmp[3]); } -static void Camellia_DecryptBlock(const int keyBitLength, +static void Camellia_DecryptBlock(const word32 keyBitLength, const unsigned char *ciphertext, const KEY_TABLE_TYPE keyTable, unsigned char *plaintext) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,17 +28,18 @@ Public domain. */ -#ifdef WOLFSSL_ARMASM - /* implementation is located in wolfcrypt/src/port/arm/armv8-chacha.c */ -#else #ifdef HAVE_CONFIG_H #include #endif #include -#if defined(HAVE_CHACHA) && !defined(WOLFSSL_ARMASM) +#if defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_ARMASM_NO_NEON) + /* implementation is located in wolfcrypt/src/port/arm/armv8-chacha.c */ + +#else +#if defined(HAVE_CHACHA) #include #include @@ -71,6 +72,10 @@ #elif defined(__clang__) && defined(NO_AVX2_SUPPORT) #undef NO_AVX2_SUPPORT #endif + #if defined(_MSC_VER) && (_MSC_VER <= 1900) + #undef NO_AVX2_SUPPORT + #define NO_AVX2_SUPPORT + #endif #ifndef NO_AVX2_SUPPORT #define HAVE_INTEL_AVX2 @@ -199,6 +204,7 @@ return 0; } +#ifndef USE_INTEL_CHACHA_SPEEDUP /** * Converts word into bytes with rotations having been done. */ @@ -227,6 +233,7 @@ #endif } } +#endif /* !USE_INTEL_CHACHA_SPEEDUP */ #ifdef HAVE_XCHACHA @@ -324,6 +331,7 @@ #endif +#ifndef USE_INTEL_CHACHA_SPEEDUP /** * Encrypt a stream of bytes */ @@ -371,6 +379,8 @@ ctx->left = CHACHA_CHUNK_BYTES - bytes; } } +#endif /* !USE_INTEL_CHACHA_SPEEDUP */ + /** * API to encrypt/decrypt a message of any size. @@ -422,10 +432,10 @@ chacha_encrypt_x64(ctx, input, output, msglen); return 0; } -#endif +#else wc_Chacha_encrypt_bytes(ctx, input, output, msglen); - return 0; +#endif } void wc_Chacha_purge_current_block(ChaCha* ctx) { @@ -436,6 +446,6 @@ } } -#endif /* HAVE_CHACHA*/ +#endif /* HAVE_CHACHA */ -#endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM && !WOLFSSL_ARMASM_NO_NEON */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha20_poly1305.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha20_poly1305.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha20_poly1305.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha20_poly1305.c 2024-08-03 07:30:00.000000000 +0000 @@ -57,7 +57,11 @@ byte outAuthTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]) { int ret; - ChaChaPoly_Aead aead; +#ifdef WOLFSSL_SMALL_STACK + ChaChaPoly_Aead *aead = NULL; +#else + ChaChaPoly_Aead aead[1]; +#endif /* Validate function arguments */ if (!inKey || !inIV || @@ -68,15 +72,27 @@ return BAD_FUNC_ARG; } - ret = wc_ChaCha20Poly1305_Init(&aead, inKey, inIV, +#ifdef WOLFSSL_SMALL_STACK + aead = (ChaChaPoly_Aead *)XMALLOC(sizeof(*aead), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (aead == NULL) + return MEMORY_E; +#endif + + ret = wc_ChaCha20Poly1305_Init(aead, inKey, inIV, CHACHA20_POLY1305_AEAD_ENCRYPT); if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateAad(&aead, inAAD, inAADLen); + ret = wc_ChaCha20Poly1305_UpdateAad(aead, inAAD, inAADLen); if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateData(&aead, inPlaintext, outCiphertext, + ret = wc_ChaCha20Poly1305_UpdateData(aead, inPlaintext, outCiphertext, inPlaintextLen); if (ret == 0) - ret = wc_ChaCha20Poly1305_Final(&aead, outAuthTag); + ret = wc_ChaCha20Poly1305_Final(aead, outAuthTag); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(aead, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return ret; } @@ -90,7 +106,11 @@ byte* outPlaintext) { int ret; - ChaChaPoly_Aead aead; +#ifdef WOLFSSL_SMALL_STACK + ChaChaPoly_Aead *aead = NULL; +#else + ChaChaPoly_Aead aead[1]; +#endif byte calculatedAuthTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; /* Validate function arguments */ @@ -102,19 +122,31 @@ return BAD_FUNC_ARG; } +#ifdef WOLFSSL_SMALL_STACK + aead = (ChaChaPoly_Aead *)XMALLOC(sizeof(*aead), NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (aead == NULL) + return MEMORY_E; +#endif + XMEMSET(calculatedAuthTag, 0, sizeof(calculatedAuthTag)); - ret = wc_ChaCha20Poly1305_Init(&aead, inKey, inIV, + ret = wc_ChaCha20Poly1305_Init(aead, inKey, inIV, CHACHA20_POLY1305_AEAD_DECRYPT); if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateAad(&aead, inAAD, inAADLen); + ret = wc_ChaCha20Poly1305_UpdateAad(aead, inAAD, inAADLen); if (ret == 0) - ret = wc_ChaCha20Poly1305_UpdateData(&aead, inCiphertext, outPlaintext, + ret = wc_ChaCha20Poly1305_UpdateData(aead, inCiphertext, outPlaintext, inCiphertextLen); if (ret == 0) - ret = wc_ChaCha20Poly1305_Final(&aead, calculatedAuthTag); + ret = wc_ChaCha20Poly1305_Final(aead, calculatedAuthTag); if (ret == 0) ret = wc_ChaCha20Poly1305_CheckTag(inAuthTag, calculatedAuthTag); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(aead, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return ret; } @@ -355,9 +387,9 @@ int isEncrypt) { int ret; - ssize_t dst_len = isEncrypt ? - (ssize_t)src_len + POLY1305_DIGEST_SIZE : - (ssize_t)src_len - POLY1305_DIGEST_SIZE; + long int dst_len = isEncrypt ? + (long int)src_len + POLY1305_DIGEST_SIZE : + (long int)src_len - POLY1305_DIGEST_SIZE; const byte *src_i; byte *dst_i; size_t src_len_rem; @@ -375,7 +407,7 @@ goto out; } - if ((ssize_t)dst_space < dst_len) { + if ((long int)dst_space < dst_len) { ret = BUFFER_E; goto out; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* chacha_asm - * - * Copyright (C) 2006-2023 wolfSSL Inc. +/* chacha_asm.S */ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -536,9 +536,19 @@ .p2align 4 _chacha_encrypt_avx1: #endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 subq $0x190, %rsp movq %rsp, %r9 leaq 256(%rsp), %r10 + leaq L_chacha20_avx1_rotl8(%rip), %r12 + leaq L_chacha20_avx1_rotl16(%rip), %r13 + leaq L_chacha20_avx1_add(%rip), %r14 + leaq L_chacha20_avx1_four(%rip), %r15 + addq $15, %r9 + addq $15, %r10 andq $-16, %r9 andq $-16, %r10 movl %ecx, %eax @@ -560,7 +570,7 @@ vpshufd $0x00, 52(%rdi), %xmm13 vpshufd $0x00, 56(%rdi), %xmm14 vpshufd $0x00, 60(%rdi), %xmm15 - vpaddd L_chacha20_avx1_add(%rip), %xmm12, %xmm12 + vpaddd (%r14), %xmm12, %xmm12 vmovdqa %xmm0, (%r9) vmovdqa %xmm1, 16(%r9) vmovdqa %xmm2, 32(%r9) @@ -584,22 +594,22 @@ vpaddd %xmm4, %xmm0, %xmm0 vpxor %xmm0, %xmm12, %xmm12 vmovdqa 48(%r10), %xmm11 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12 + vpshufb (%r13), %xmm12, %xmm12 vpaddd %xmm12, %xmm8, %xmm8 vpxor %xmm8, %xmm4, %xmm4 vpaddd %xmm5, %xmm1, %xmm1 vpxor %xmm1, %xmm13, %xmm13 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13 + vpshufb (%r13), %xmm13, %xmm13 vpaddd %xmm13, %xmm9, %xmm9 vpxor %xmm9, %xmm5, %xmm5 vpaddd %xmm6, %xmm2, %xmm2 vpxor %xmm2, %xmm14, %xmm14 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14 + vpshufb (%r13), %xmm14, %xmm14 vpaddd %xmm14, %xmm10, %xmm10 vpxor %xmm10, %xmm6, %xmm6 vpaddd %xmm7, %xmm3, %xmm3 vpxor %xmm3, %xmm15, %xmm15 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15 + vpshufb (%r13), %xmm15, %xmm15 vpaddd %xmm15, %xmm11, %xmm11 vpxor %xmm11, %xmm7, %xmm7 vmovdqa %xmm11, 48(%r10) @@ -618,22 +628,22 @@ vpaddd %xmm4, %xmm0, %xmm0 vpxor %xmm0, %xmm12, %xmm12 vmovdqa 48(%r10), %xmm11 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12 + vpshufb (%r12), %xmm12, %xmm12 vpaddd %xmm12, %xmm8, %xmm8 vpxor %xmm8, %xmm4, %xmm4 vpaddd %xmm5, %xmm1, %xmm1 vpxor %xmm1, %xmm13, %xmm13 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13 + vpshufb (%r12), %xmm13, %xmm13 vpaddd %xmm13, %xmm9, %xmm9 vpxor %xmm9, %xmm5, %xmm5 vpaddd %xmm6, %xmm2, %xmm2 vpxor %xmm2, %xmm14, %xmm14 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14 + vpshufb (%r12), %xmm14, %xmm14 vpaddd %xmm14, %xmm10, %xmm10 vpxor %xmm10, %xmm6, %xmm6 vpaddd %xmm7, %xmm3, %xmm3 vpxor %xmm3, %xmm15, %xmm15 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15 + vpshufb (%r12), %xmm15, %xmm15 vpaddd %xmm15, %xmm11, %xmm11 vpxor %xmm11, %xmm7, %xmm7 vmovdqa %xmm11, 48(%r10) @@ -652,22 +662,22 @@ vpaddd %xmm5, %xmm0, %xmm0 vpxor %xmm0, %xmm15, %xmm15 vmovdqa 48(%r10), %xmm11 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm15, %xmm15 + vpshufb (%r13), %xmm15, %xmm15 vpaddd %xmm15, %xmm10, %xmm10 vpxor %xmm10, %xmm5, %xmm5 vpaddd %xmm6, %xmm1, %xmm1 vpxor %xmm1, %xmm12, %xmm12 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm12, %xmm12 + vpshufb (%r13), %xmm12, %xmm12 vpaddd %xmm12, %xmm11, %xmm11 vpxor %xmm11, %xmm6, %xmm6 vpaddd %xmm7, %xmm2, %xmm2 vpxor %xmm2, %xmm13, %xmm13 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm13, %xmm13 + vpshufb (%r13), %xmm13, %xmm13 vpaddd %xmm13, %xmm8, %xmm8 vpxor %xmm8, %xmm7, %xmm7 vpaddd %xmm4, %xmm3, %xmm3 vpxor %xmm3, %xmm14, %xmm14 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm14, %xmm14 + vpshufb (%r13), %xmm14, %xmm14 vpaddd %xmm14, %xmm9, %xmm9 vpxor %xmm9, %xmm4, %xmm4 vmovdqa %xmm11, 48(%r10) @@ -686,22 +696,22 @@ vpaddd %xmm5, %xmm0, %xmm0 vpxor %xmm0, %xmm15, %xmm15 vmovdqa 48(%r10), %xmm11 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm15, %xmm15 + vpshufb (%r12), %xmm15, %xmm15 vpaddd %xmm15, %xmm10, %xmm10 vpxor %xmm10, %xmm5, %xmm5 vpaddd %xmm6, %xmm1, %xmm1 vpxor %xmm1, %xmm12, %xmm12 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm12, %xmm12 + vpshufb (%r12), %xmm12, %xmm12 vpaddd %xmm12, %xmm11, %xmm11 vpxor %xmm11, %xmm6, %xmm6 vpaddd %xmm7, %xmm2, %xmm2 vpxor %xmm2, %xmm13, %xmm13 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm13, %xmm13 + vpshufb (%r12), %xmm13, %xmm13 vpaddd %xmm13, %xmm8, %xmm8 vpxor %xmm8, %xmm7, %xmm7 vpaddd %xmm4, %xmm3, %xmm3 vpxor %xmm3, %xmm14, %xmm14 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm14, %xmm14 + vpshufb (%r12), %xmm14, %xmm14 vpaddd %xmm14, %xmm9, %xmm9 vpxor %xmm9, %xmm4, %xmm4 vmovdqa %xmm11, 48(%r10) @@ -835,7 +845,7 @@ vmovdqa 192(%r9), %xmm12 addq $0x100, %rsi addq $0x100, %rdx - vpaddd L_chacha20_avx1_four(%rip), %xmm12, %xmm12 + vpaddd (%r15), %xmm12, %xmm12 subl $0x100, %ecx vmovdqa %xmm12, 192(%r9) cmpl $0x100, %ecx @@ -858,7 +868,7 @@ vmovdqa 240(%r9), %xmm15 jmp L_chacha20_avx1_start128 L_chacha20_avx1_done128: - shl $2, %eax + shll $2, %eax addl %eax, 48(%rdi) L_chacha20_avx1_end128: cmpl $0x40, %ecx @@ -876,7 +886,7 @@ L_chacha20_avx1_block_crypt_start: vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 + vpshufb (%r13), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 @@ -884,7 +894,7 @@ vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 + vpshufb (%r12), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 @@ -895,7 +905,7 @@ vpshufd $0x93, %xmm3, %xmm3 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 + vpshufb (%r13), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 @@ -903,7 +913,7 @@ vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 + vpshufb (%r12), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 @@ -952,7 +962,7 @@ L_chacha20_avx1_partial_crypt_start: vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 + vpshufb (%r13), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 @@ -960,7 +970,7 @@ vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 + vpshufb (%r12), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 @@ -971,7 +981,7 @@ vpshufd $0x93, %xmm3, %xmm3 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl16(%rip), %xmm3, %xmm3 + vpshufb (%r13), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $20, %xmm1, %xmm4 @@ -979,7 +989,7 @@ vpxor %xmm4, %xmm1, %xmm1 vpaddd %xmm1, %xmm0, %xmm0 vpxor %xmm0, %xmm3, %xmm3 - vpshufb L_chacha20_avx1_rotl8(%rip), %xmm3, %xmm3 + vpshufb (%r12), %xmm3, %xmm3 vpaddd %xmm3, %xmm2, %xmm2 vpxor %xmm2, %xmm1, %xmm1 vpsrld $25, %xmm1, %xmm4 @@ -1023,7 +1033,12 @@ subl %r11d, %r8d movl %r8d, 76(%rdi) L_chacha20_avx1_partial_done: + vzeroupper addq $0x190, %rsp + popq %r15 + popq %r14 + popq %r13 + popq %r12 repz retq #ifndef __APPLE__ .size chacha_encrypt_avx1,.-chacha_encrypt_avx1 @@ -1094,9 +1109,18 @@ .p2align 4 _chacha_encrypt_avx2: #endif /* __APPLE__ */ - subq $0x310, %rsp + pushq %r12 + pushq %r13 + pushq %r14 + subq $0x320, %rsp movq %rsp, %r9 + leaq L_chacha20_avx2_rotl8(%rip), %r11 + leaq L_chacha20_avx2_rotl16(%rip), %r12 + leaq L_chacha20_avx2_add(%rip), %r13 + leaq L_chacha20_avx2_eight(%rip), %r14 leaq 512(%rsp), %r10 + addq $31, %r9 + addq $31, %r10 andq $-32, %r9 andq $-32, %r10 movl %ecx, %eax @@ -1118,7 +1142,7 @@ vpbroadcastd 52(%rdi), %ymm13 vpbroadcastd 56(%rdi), %ymm14 vpbroadcastd 60(%rdi), %ymm15 - vpaddd L_chacha20_avx2_add(%rip), %ymm12, %ymm12 + vpaddd (%r13), %ymm12, %ymm12 vmovdqa %ymm0, (%r9) vmovdqa %ymm1, 32(%r9) vmovdqa %ymm2, 64(%r9) @@ -1142,22 +1166,22 @@ vpaddd %ymm4, %ymm0, %ymm0 vpxor %ymm0, %ymm12, %ymm12 vmovdqa 96(%r10), %ymm11 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12 + vpshufb (%r12), %ymm12, %ymm12 vpaddd %ymm12, %ymm8, %ymm8 vpxor %ymm8, %ymm4, %ymm4 vpaddd %ymm5, %ymm1, %ymm1 vpxor %ymm1, %ymm13, %ymm13 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13 + vpshufb (%r12), %ymm13, %ymm13 vpaddd %ymm13, %ymm9, %ymm9 vpxor %ymm9, %ymm5, %ymm5 vpaddd %ymm6, %ymm2, %ymm2 vpxor %ymm2, %ymm14, %ymm14 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14 + vpshufb (%r12), %ymm14, %ymm14 vpaddd %ymm14, %ymm10, %ymm10 vpxor %ymm10, %ymm6, %ymm6 vpaddd %ymm7, %ymm3, %ymm3 vpxor %ymm3, %ymm15, %ymm15 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15 + vpshufb (%r12), %ymm15, %ymm15 vpaddd %ymm15, %ymm11, %ymm11 vpxor %ymm11, %ymm7, %ymm7 vmovdqa %ymm11, 96(%r10) @@ -1176,22 +1200,22 @@ vpaddd %ymm4, %ymm0, %ymm0 vpxor %ymm0, %ymm12, %ymm12 vmovdqa 96(%r10), %ymm11 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12 + vpshufb (%r11), %ymm12, %ymm12 vpaddd %ymm12, %ymm8, %ymm8 vpxor %ymm8, %ymm4, %ymm4 vpaddd %ymm5, %ymm1, %ymm1 vpxor %ymm1, %ymm13, %ymm13 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13 + vpshufb (%r11), %ymm13, %ymm13 vpaddd %ymm13, %ymm9, %ymm9 vpxor %ymm9, %ymm5, %ymm5 vpaddd %ymm6, %ymm2, %ymm2 vpxor %ymm2, %ymm14, %ymm14 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14 + vpshufb (%r11), %ymm14, %ymm14 vpaddd %ymm14, %ymm10, %ymm10 vpxor %ymm10, %ymm6, %ymm6 vpaddd %ymm7, %ymm3, %ymm3 vpxor %ymm3, %ymm15, %ymm15 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15 + vpshufb (%r11), %ymm15, %ymm15 vpaddd %ymm15, %ymm11, %ymm11 vpxor %ymm11, %ymm7, %ymm7 vmovdqa %ymm11, 96(%r10) @@ -1210,22 +1234,22 @@ vpaddd %ymm5, %ymm0, %ymm0 vpxor %ymm0, %ymm15, %ymm15 vmovdqa 96(%r10), %ymm11 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm15, %ymm15 + vpshufb (%r12), %ymm15, %ymm15 vpaddd %ymm15, %ymm10, %ymm10 vpxor %ymm10, %ymm5, %ymm5 vpaddd %ymm6, %ymm1, %ymm1 vpxor %ymm1, %ymm12, %ymm12 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm12, %ymm12 + vpshufb (%r12), %ymm12, %ymm12 vpaddd %ymm12, %ymm11, %ymm11 vpxor %ymm11, %ymm6, %ymm6 vpaddd %ymm7, %ymm2, %ymm2 vpxor %ymm2, %ymm13, %ymm13 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm13, %ymm13 + vpshufb (%r12), %ymm13, %ymm13 vpaddd %ymm13, %ymm8, %ymm8 vpxor %ymm8, %ymm7, %ymm7 vpaddd %ymm4, %ymm3, %ymm3 vpxor %ymm3, %ymm14, %ymm14 - vpshufb L_chacha20_avx2_rotl16(%rip), %ymm14, %ymm14 + vpshufb (%r12), %ymm14, %ymm14 vpaddd %ymm14, %ymm9, %ymm9 vpxor %ymm9, %ymm4, %ymm4 vmovdqa %ymm11, 96(%r10) @@ -1244,22 +1268,22 @@ vpaddd %ymm5, %ymm0, %ymm0 vpxor %ymm0, %ymm15, %ymm15 vmovdqa 96(%r10), %ymm11 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm15, %ymm15 + vpshufb (%r11), %ymm15, %ymm15 vpaddd %ymm15, %ymm10, %ymm10 vpxor %ymm10, %ymm5, %ymm5 vpaddd %ymm6, %ymm1, %ymm1 vpxor %ymm1, %ymm12, %ymm12 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm12, %ymm12 + vpshufb (%r11), %ymm12, %ymm12 vpaddd %ymm12, %ymm11, %ymm11 vpxor %ymm11, %ymm6, %ymm6 vpaddd %ymm7, %ymm2, %ymm2 vpxor %ymm2, %ymm13, %ymm13 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm13, %ymm13 + vpshufb (%r11), %ymm13, %ymm13 vpaddd %ymm13, %ymm8, %ymm8 vpxor %ymm8, %ymm7, %ymm7 vpaddd %ymm4, %ymm3, %ymm3 vpxor %ymm3, %ymm14, %ymm14 - vpshufb L_chacha20_avx2_rotl8(%rip), %ymm14, %ymm14 + vpshufb (%r11), %ymm14, %ymm14 vpaddd %ymm14, %ymm9, %ymm9 vpxor %ymm9, %ymm4, %ymm4 vmovdqa %ymm11, 96(%r10) @@ -1409,7 +1433,7 @@ vmovdqa 384(%r9), %ymm12 addq $0x200, %rsi addq $0x200, %rdx - vpaddd L_chacha20_avx2_eight(%rip), %ymm12, %ymm12 + vpaddd (%r14), %ymm12, %ymm12 subl $0x200, %ecx vmovdqa %ymm12, 384(%r9) cmpl $0x200, %ecx @@ -1432,7 +1456,7 @@ vmovdqa 480(%r9), %ymm15 jmp L_chacha20_avx2_start256 L_chacha20_avx2_done256: - shl $3, %eax + shll $3, %eax addl %eax, 48(%rdi) L_chacha20_avx2_end256: #ifndef __APPLE__ @@ -1440,7 +1464,11 @@ #else callq _chacha_encrypt_avx1 #endif /* __APPLE__ */ - addq $0x310, %rsp + vzeroupper + addq $0x320, %rsp + popq %r14 + popq %r13 + popq %r12 repz retq #ifndef __APPLE__ .size chacha_encrypt_avx2,.-chacha_encrypt_avx2 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.asm mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.asm --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.asm 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/chacha_asm.asm 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1426 @@ +; /* chacha_asm.asm */ +; /* +; * Copyright (C) 2006-2024 wolfSSL Inc. +; * +; * This file is part of wolfSSL. +; * +; * wolfSSL 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 of the License, or +; * (at your option) any later version. +; * +; * wolfSSL 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, write to the Free Software +; * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +; */ +IF @Version LT 1200 +; AVX2 instructions not recognized by old versions of MASM +IFNDEF NO_AVX2_SUPPORT +NO_AVX2_SUPPORT = 1 +ENDIF +; MOVBE instruction not recognized by old versions of MASM +IFNDEF NO_MOVBE_SUPPORT +NO_MOVBE_SUPPORT = 1 +ENDIF +ENDIF + +IFNDEF HAVE_INTEL_AVX1 +HAVE_INTEL_AVX1 = 1 +ENDIF +IFNDEF NO_AVX2_SUPPORT +HAVE_INTEL_AVX2 = 1 +ENDIF + +IFNDEF _WIN64 +_WIN64 = 1 +ENDIF + +_text SEGMENT READONLY PARA +chacha_encrypt_x64 PROC + push rbx + push rbp + push r12 + push r13 + push r14 + push r15 + sub rsp, 64 + cmp r9d, 64 + jl L_chacha_x64_small +L_chacha_x64_start: + sub rsp, 48 + mov QWORD PTR [rsp+24], r8 + mov QWORD PTR [rsp+32], rdx + mov QWORD PTR [rsp+40], r9 + mov rax, QWORD PTR [rcx+32] + mov rbx, QWORD PTR [rcx+40] + mov QWORD PTR [rsp+8], rax + mov QWORD PTR [rsp+16], rbx + mov eax, DWORD PTR [rcx] + mov ebx, DWORD PTR [rcx+4] + mov r9d, DWORD PTR [rcx+8] + mov r8d, DWORD PTR [rcx+12] + mov r8d, DWORD PTR [rcx+16] + mov r9d, DWORD PTR [rcx+20] + mov r10d, DWORD PTR [rcx+24] + mov r11d, DWORD PTR [rcx+28] + mov r12d, DWORD PTR [rcx+48] + mov r13d, DWORD PTR [rcx+52] + mov r14d, DWORD PTR [rcx+56] + mov r15d, DWORD PTR [rcx+60] + mov BYTE PTR [rsp], 10 + mov edx, DWORD PTR [rsp+8] + mov ebp, DWORD PTR [rsp+12] +L_chacha_x64_block_crypt_start: + add eax, r8d + add ebx, r9d + xor r12d, eax + xor r13d, ebx + rol r12d, 16 + rol r13d, 16 + add edx, r12d + add ebp, r13d + xor r8d, edx + xor r9d, ebp + rol r8d, 12 + rol r9d, 12 + add eax, r8d + add ebx, r9d + xor r12d, eax + xor r13d, ebx + rol r12d, 8 + rol r13d, 8 + add edx, r12d + add ebp, r13d + xor r8d, edx + xor r9d, ebp + rol r8d, 7 + rol r9d, 7 + mov DWORD PTR [rsp+8], edx + mov DWORD PTR [rsp+12], ebp + mov edx, DWORD PTR [rsp+16] + mov ebp, DWORD PTR [rsp+20] + add r9d, r10d + add r8d, r11d + xor r14d, r9d + xor r15d, r8d + rol r14d, 16 + rol r15d, 16 + add edx, r14d + add ebp, r15d + xor r10d, edx + xor r11d, ebp + rol r10d, 12 + rol r11d, 12 + add r9d, r10d + add r8d, r11d + xor r14d, r9d + xor r15d, r8d + rol r14d, 8 + rol r15d, 8 + add edx, r14d + add ebp, r15d + xor r10d, edx + xor r11d, ebp + rol r10d, 7 + rol r11d, 7 + add eax, r9d + add ebx, r10d + xor r15d, eax + xor r12d, ebx + rol r15d, 16 + rol r12d, 16 + add edx, r15d + add ebp, r12d + xor r9d, edx + xor r10d, ebp + rol r9d, 12 + rol r10d, 12 + add eax, r9d + add ebx, r10d + xor r15d, eax + xor r12d, ebx + rol r15d, 8 + rol r12d, 8 + add edx, r15d + add ebp, r12d + xor r9d, edx + xor r10d, ebp + rol r9d, 7 + rol r10d, 7 + mov DWORD PTR [rsp+16], edx + mov DWORD PTR [rsp+20], ebp + mov edx, DWORD PTR [rsp+8] + mov ebp, DWORD PTR [rsp+12] + add r9d, r11d + add r8d, r8d + xor r13d, r9d + xor r14d, r8d + rol r13d, 16 + rol r14d, 16 + add edx, r13d + add ebp, r14d + xor r11d, edx + xor r8d, ebp + rol r11d, 12 + rol r8d, 12 + add r9d, r11d + add r8d, r8d + xor r13d, r9d + xor r14d, r8d + rol r13d, 8 + rol r14d, 8 + add edx, r13d + add ebp, r14d + xor r11d, edx + xor r8d, ebp + rol r11d, 7 + rol r8d, 7 + dec BYTE PTR [rsp] + jnz L_chacha_x64_block_crypt_start + mov DWORD PTR [rsp+8], edx + mov DWORD PTR [rsp+12], ebp + mov rdx, QWORD PTR [rsp+32] + mov rbp, QWORD PTR [rsp+24] + add eax, DWORD PTR [rcx] + add ebx, DWORD PTR [rcx+4] + add r9d, DWORD PTR [rcx+8] + add r8d, DWORD PTR [rcx+12] + add r8d, DWORD PTR [rcx+16] + add r9d, DWORD PTR [rcx+20] + add r10d, DWORD PTR [rcx+24] + add r11d, DWORD PTR [rcx+28] + add r12d, DWORD PTR [rcx+48] + add r13d, DWORD PTR [rcx+52] + add r14d, DWORD PTR [rcx+56] + add r15d, DWORD PTR [rcx+60] + xor eax, DWORD PTR [rdx] + xor ebx, DWORD PTR [rdx+4] + xor r9d, DWORD PTR [rdx+8] + xor r8d, DWORD PTR [rdx+12] + xor r8d, DWORD PTR [rdx+16] + xor r9d, DWORD PTR [rdx+20] + xor r10d, DWORD PTR [rdx+24] + xor r11d, DWORD PTR [rdx+28] + xor r12d, DWORD PTR [rdx+48] + xor r13d, DWORD PTR [rdx+52] + xor r14d, DWORD PTR [rdx+56] + xor r15d, DWORD PTR [rdx+60] + mov DWORD PTR [rbp], eax + mov DWORD PTR [rbp+4], ebx + mov DWORD PTR [rbp+8], r9d + mov DWORD PTR [rbp+12], r8d + mov DWORD PTR [rbp+16], r8d + mov DWORD PTR [rbp+20], r9d + mov DWORD PTR [rbp+24], r10d + mov DWORD PTR [rbp+28], r11d + mov DWORD PTR [rbp+48], r12d + mov DWORD PTR [rbp+52], r13d + mov DWORD PTR [rbp+56], r14d + mov DWORD PTR [rbp+60], r15d + mov eax, DWORD PTR [rsp+8] + mov ebx, DWORD PTR [rsp+12] + mov r9d, DWORD PTR [rsp+16] + mov r8d, DWORD PTR [rsp+20] + add eax, DWORD PTR [rcx+32] + add ebx, DWORD PTR [rcx+36] + add r9d, DWORD PTR [rcx+40] + add r8d, DWORD PTR [rcx+44] + xor eax, DWORD PTR [rdx+32] + xor ebx, DWORD PTR [rdx+36] + xor r9d, DWORD PTR [rdx+40] + xor r8d, DWORD PTR [rdx+44] + mov DWORD PTR [rbp+32], eax + mov DWORD PTR [rbp+36], ebx + mov DWORD PTR [rbp+40], r9d + mov DWORD PTR [rbp+44], r8d + mov r8, QWORD PTR [rsp+24] + mov r9, QWORD PTR [rsp+40] + add DWORD PTR [rcx+48], 1 + add rsp, 48 + sub r9d, 64 + add rdx, 64 + add r8, 64 + cmp r9d, 64 + jge L_chacha_x64_start +L_chacha_x64_small: + cmp r9d, 0 + je L_chacha_x64_done + sub rsp, 48 + mov QWORD PTR [rsp+24], r8 + mov QWORD PTR [rsp+32], rdx + mov QWORD PTR [rsp+40], r9 + mov rax, QWORD PTR [rcx+32] + mov rbx, QWORD PTR [rcx+40] + mov QWORD PTR [rsp+8], rax + mov QWORD PTR [rsp+16], rbx + mov eax, DWORD PTR [rcx] + mov ebx, DWORD PTR [rcx+4] + mov r9d, DWORD PTR [rcx+8] + mov r8d, DWORD PTR [rcx+12] + mov r8d, DWORD PTR [rcx+16] + mov r9d, DWORD PTR [rcx+20] + mov r10d, DWORD PTR [rcx+24] + mov r11d, DWORD PTR [rcx+28] + mov r12d, DWORD PTR [rcx+48] + mov r13d, DWORD PTR [rcx+52] + mov r14d, DWORD PTR [rcx+56] + mov r15d, DWORD PTR [rcx+60] + mov BYTE PTR [rsp], 10 + mov edx, DWORD PTR [rsp+8] + mov ebp, DWORD PTR [rsp+12] +L_chacha_x64_partial_crypt_start: + add eax, r8d + add ebx, r9d + xor r12d, eax + xor r13d, ebx + rol r12d, 16 + rol r13d, 16 + add edx, r12d + add ebp, r13d + xor r8d, edx + xor r9d, ebp + rol r8d, 12 + rol r9d, 12 + add eax, r8d + add ebx, r9d + xor r12d, eax + xor r13d, ebx + rol r12d, 8 + rol r13d, 8 + add edx, r12d + add ebp, r13d + xor r8d, edx + xor r9d, ebp + rol r8d, 7 + rol r9d, 7 + mov DWORD PTR [rsp+8], edx + mov DWORD PTR [rsp+12], ebp + mov edx, DWORD PTR [rsp+16] + mov ebp, DWORD PTR [rsp+20] + add r9d, r10d + add r8d, r11d + xor r14d, r9d + xor r15d, r8d + rol r14d, 16 + rol r15d, 16 + add edx, r14d + add ebp, r15d + xor r10d, edx + xor r11d, ebp + rol r10d, 12 + rol r11d, 12 + add r9d, r10d + add r8d, r11d + xor r14d, r9d + xor r15d, r8d + rol r14d, 8 + rol r15d, 8 + add edx, r14d + add ebp, r15d + xor r10d, edx + xor r11d, ebp + rol r10d, 7 + rol r11d, 7 + add eax, r9d + add ebx, r10d + xor r15d, eax + xor r12d, ebx + rol r15d, 16 + rol r12d, 16 + add edx, r15d + add ebp, r12d + xor r9d, edx + xor r10d, ebp + rol r9d, 12 + rol r10d, 12 + add eax, r9d + add ebx, r10d + xor r15d, eax + xor r12d, ebx + rol r15d, 8 + rol r12d, 8 + add edx, r15d + add ebp, r12d + xor r9d, edx + xor r10d, ebp + rol r9d, 7 + rol r10d, 7 + mov DWORD PTR [rsp+16], edx + mov DWORD PTR [rsp+20], ebp + mov edx, DWORD PTR [rsp+8] + mov ebp, DWORD PTR [rsp+12] + add r9d, r11d + add r8d, r8d + xor r13d, r9d + xor r14d, r8d + rol r13d, 16 + rol r14d, 16 + add edx, r13d + add ebp, r14d + xor r11d, edx + xor r8d, ebp + rol r11d, 12 + rol r8d, 12 + add r9d, r11d + add r8d, r8d + xor r13d, r9d + xor r14d, r8d + rol r13d, 8 + rol r14d, 8 + add edx, r13d + add ebp, r14d + xor r11d, edx + xor r8d, ebp + rol r11d, 7 + rol r8d, 7 + dec BYTE PTR [rsp] + jnz L_chacha_x64_partial_crypt_start + mov DWORD PTR [rsp+8], edx + mov DWORD PTR [rsp+12], ebp + mov rdx, QWORD PTR [rsp+32] + add eax, DWORD PTR [rcx] + add ebx, DWORD PTR [rcx+4] + add r9d, DWORD PTR [rcx+8] + add r8d, DWORD PTR [rcx+12] + add r8d, DWORD PTR [rcx+16] + add r9d, DWORD PTR [rcx+20] + add r10d, DWORD PTR [rcx+24] + add r11d, DWORD PTR [rcx+28] + add r12d, DWORD PTR [rcx+48] + add r13d, DWORD PTR [rcx+52] + add r14d, DWORD PTR [rcx+56] + add r15d, DWORD PTR [rcx+60] + lea rbp, QWORD PTR [rcx+80] + mov DWORD PTR [rbp], eax + mov DWORD PTR [rbp+4], ebx + mov DWORD PTR [rbp+8], r9d + mov DWORD PTR [rbp+12], r8d + mov DWORD PTR [rbp+16], r8d + mov DWORD PTR [rbp+20], r9d + mov DWORD PTR [rbp+24], r10d + mov DWORD PTR [rbp+28], r11d + mov DWORD PTR [rbp+48], r12d + mov DWORD PTR [rbp+52], r13d + mov DWORD PTR [rbp+56], r14d + mov DWORD PTR [rbp+60], r15d + mov eax, DWORD PTR [rsp+8] + mov ebx, DWORD PTR [rsp+12] + mov r9d, DWORD PTR [rsp+16] + mov r8d, DWORD PTR [rsp+20] + add eax, DWORD PTR [rcx+32] + add ebx, DWORD PTR [rcx+36] + add r9d, DWORD PTR [rcx+40] + add r8d, DWORD PTR [rcx+44] + mov DWORD PTR [rbp+32], eax + mov DWORD PTR [rbp+36], ebx + mov DWORD PTR [rbp+40], r9d + mov DWORD PTR [rbp+44], r8d + mov r8, QWORD PTR [rsp+24] + mov r9, QWORD PTR [rsp+40] + add DWORD PTR [rcx+48], 1 + add rsp, 48 + mov r8d, r9d + xor rbx, rbx + and r8d, 7 + jz L_chacha_x64_partial_start64 +L_chacha_x64_partial_start8: + movzx eax, BYTE PTR [rbp+rbx] + xor al, BYTE PTR [rdx+rbx] + mov BYTE PTR [r8+rbx], al + inc ebx + cmp ebx, r8d + jne L_chacha_x64_partial_start8 + je L_chacha_x64_partial_end64 +L_chacha_x64_partial_start64: + mov rax, QWORD PTR [rbp+rbx] + xor rax, QWORD PTR [rdx+rbx] + mov QWORD PTR [r8+rbx], rax + add ebx, 8 +L_chacha_x64_partial_end64: + cmp ebx, r9d + jne L_chacha_x64_partial_start64 + mov r9d, 64 + sub r9d, ebx + mov DWORD PTR [rcx+76], r9d +L_chacha_x64_done: + add rsp, 64 + pop r15 + pop r14 + pop r13 + pop r12 + pop rbp + pop rbx + ret +chacha_encrypt_x64 ENDP +_text ENDS +IFDEF HAVE_INTEL_AVX1 +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx1_rotl8 QWORD 433757367256023043, 1012478749960636427 +ptr_L_chacha20_avx1_rotl8 QWORD L_chacha20_avx1_rotl8 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx1_rotl16 QWORD 361421592464458498, 940142975169071882 +ptr_L_chacha20_avx1_rotl16 QWORD L_chacha20_avx1_rotl16 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx1_add QWORD 4294967296, 12884901890 +ptr_L_chacha20_avx1_add QWORD L_chacha20_avx1_add +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx1_four QWORD 17179869188, 17179869188 +ptr_L_chacha20_avx1_four QWORD L_chacha20_avx1_four +_DATA ENDS +_text SEGMENT READONLY PARA +chacha_encrypt_avx1 PROC + push r12 + push r13 + push r14 + push r15 + push rdi + push rsi + sub rsp, 560 + vmovdqu OWORD PTR [rsp+400], xmm6 + vmovdqu OWORD PTR [rsp+416], xmm7 + vmovdqu OWORD PTR [rsp+432], xmm8 + vmovdqu OWORD PTR [rsp+448], xmm9 + vmovdqu OWORD PTR [rsp+464], xmm10 + vmovdqu OWORD PTR [rsp+480], xmm11 + vmovdqu OWORD PTR [rsp+496], xmm12 + vmovdqu OWORD PTR [rsp+512], xmm13 + vmovdqu OWORD PTR [rsp+528], xmm14 + vmovdqu OWORD PTR [rsp+544], xmm15 + mov r11, rsp + lea r12, QWORD PTR [rsp+256] + mov r14, QWORD PTR [ptr_L_chacha20_avx1_rotl8] + mov r15, QWORD PTR [ptr_L_chacha20_avx1_rotl16] + mov rdi, QWORD PTR [ptr_L_chacha20_avx1_add] + mov rsi, QWORD PTR [ptr_L_chacha20_avx1_four] + add r11, 15 + add r12, 15 + and r11, -16 + and r12, -16 + mov eax, r9d + shr eax, 8 + jz L_chacha20_avx1_end128 + vpshufd xmm0, [rcx], 0 + vpshufd xmm1, [rcx+4], 0 + vpshufd xmm2, [rcx+8], 0 + vpshufd xmm3, [rcx+12], 0 + vpshufd xmm4, [rcx+16], 0 + vpshufd xmm5, [rcx+20], 0 + vpshufd xmm6, [rcx+24], 0 + vpshufd xmm7, [rcx+28], 0 + vpshufd xmm8, [rcx+32], 0 + vpshufd xmm9, [rcx+36], 0 + vpshufd xmm10, [rcx+40], 0 + vpshufd xmm11, [rcx+44], 0 + vpshufd xmm12, [rcx+48], 0 + vpshufd xmm13, [rcx+52], 0 + vpshufd xmm14, [rcx+56], 0 + vpshufd xmm15, [rcx+60], 0 + vpaddd xmm12, xmm12, OWORD PTR [rdi] + vmovdqa OWORD PTR [r11], xmm0 + vmovdqa OWORD PTR [r11+16], xmm1 + vmovdqa OWORD PTR [r11+32], xmm2 + vmovdqa OWORD PTR [r11+48], xmm3 + vmovdqa OWORD PTR [r11+64], xmm4 + vmovdqa OWORD PTR [r11+80], xmm5 + vmovdqa OWORD PTR [r11+96], xmm6 + vmovdqa OWORD PTR [r11+112], xmm7 + vmovdqa OWORD PTR [r11+128], xmm8 + vmovdqa OWORD PTR [r11+144], xmm9 + vmovdqa OWORD PTR [r11+160], xmm10 + vmovdqa OWORD PTR [r11+176], xmm11 + vmovdqa OWORD PTR [r11+192], xmm12 + vmovdqa OWORD PTR [r11+208], xmm13 + vmovdqa OWORD PTR [r11+224], xmm14 + vmovdqa OWORD PTR [r11+240], xmm15 +L_chacha20_avx1_start128: + vmovdqa OWORD PTR [r12+48], xmm11 + mov r10b, 10 +L_chacha20_avx1_loop128: + vpaddd xmm0, xmm0, xmm4 + vpxor xmm12, xmm12, xmm0 + vmovdqa xmm11, OWORD PTR [r12+48] + vpshufb xmm12, xmm12, OWORD PTR [r15] + vpaddd xmm8, xmm8, xmm12 + vpxor xmm4, xmm4, xmm8 + vpaddd xmm1, xmm1, xmm5 + vpxor xmm13, xmm13, xmm1 + vpshufb xmm13, xmm13, OWORD PTR [r15] + vpaddd xmm9, xmm9, xmm13 + vpxor xmm5, xmm5, xmm9 + vpaddd xmm2, xmm2, xmm6 + vpxor xmm14, xmm14, xmm2 + vpshufb xmm14, xmm14, OWORD PTR [r15] + vpaddd xmm10, xmm10, xmm14 + vpxor xmm6, xmm6, xmm10 + vpaddd xmm3, xmm3, xmm7 + vpxor xmm15, xmm15, xmm3 + vpshufb xmm15, xmm15, OWORD PTR [r15] + vpaddd xmm11, xmm11, xmm15 + vpxor xmm7, xmm7, xmm11 + vmovdqa OWORD PTR [r12+48], xmm11 + vpsrld xmm11, xmm4, 20 + vpslld xmm4, xmm4, 12 + vpxor xmm4, xmm4, xmm11 + vpsrld xmm11, xmm5, 20 + vpslld xmm5, xmm5, 12 + vpxor xmm5, xmm5, xmm11 + vpsrld xmm11, xmm6, 20 + vpslld xmm6, xmm6, 12 + vpxor xmm6, xmm6, xmm11 + vpsrld xmm11, xmm7, 20 + vpslld xmm7, xmm7, 12 + vpxor xmm7, xmm7, xmm11 + vpaddd xmm0, xmm0, xmm4 + vpxor xmm12, xmm12, xmm0 + vmovdqa xmm11, OWORD PTR [r12+48] + vpshufb xmm12, xmm12, OWORD PTR [r14] + vpaddd xmm8, xmm8, xmm12 + vpxor xmm4, xmm4, xmm8 + vpaddd xmm1, xmm1, xmm5 + vpxor xmm13, xmm13, xmm1 + vpshufb xmm13, xmm13, OWORD PTR [r14] + vpaddd xmm9, xmm9, xmm13 + vpxor xmm5, xmm5, xmm9 + vpaddd xmm2, xmm2, xmm6 + vpxor xmm14, xmm14, xmm2 + vpshufb xmm14, xmm14, OWORD PTR [r14] + vpaddd xmm10, xmm10, xmm14 + vpxor xmm6, xmm6, xmm10 + vpaddd xmm3, xmm3, xmm7 + vpxor xmm15, xmm15, xmm3 + vpshufb xmm15, xmm15, OWORD PTR [r14] + vpaddd xmm11, xmm11, xmm15 + vpxor xmm7, xmm7, xmm11 + vmovdqa OWORD PTR [r12+48], xmm11 + vpsrld xmm11, xmm4, 25 + vpslld xmm4, xmm4, 7 + vpxor xmm4, xmm4, xmm11 + vpsrld xmm11, xmm5, 25 + vpslld xmm5, xmm5, 7 + vpxor xmm5, xmm5, xmm11 + vpsrld xmm11, xmm6, 25 + vpslld xmm6, xmm6, 7 + vpxor xmm6, xmm6, xmm11 + vpsrld xmm11, xmm7, 25 + vpslld xmm7, xmm7, 7 + vpxor xmm7, xmm7, xmm11 + vpaddd xmm0, xmm0, xmm5 + vpxor xmm15, xmm15, xmm0 + vmovdqa xmm11, OWORD PTR [r12+48] + vpshufb xmm15, xmm15, OWORD PTR [r15] + vpaddd xmm10, xmm10, xmm15 + vpxor xmm5, xmm5, xmm10 + vpaddd xmm1, xmm1, xmm6 + vpxor xmm12, xmm12, xmm1 + vpshufb xmm12, xmm12, OWORD PTR [r15] + vpaddd xmm11, xmm11, xmm12 + vpxor xmm6, xmm6, xmm11 + vpaddd xmm2, xmm2, xmm7 + vpxor xmm13, xmm13, xmm2 + vpshufb xmm13, xmm13, OWORD PTR [r15] + vpaddd xmm8, xmm8, xmm13 + vpxor xmm7, xmm7, xmm8 + vpaddd xmm3, xmm3, xmm4 + vpxor xmm14, xmm14, xmm3 + vpshufb xmm14, xmm14, OWORD PTR [r15] + vpaddd xmm9, xmm9, xmm14 + vpxor xmm4, xmm4, xmm9 + vmovdqa OWORD PTR [r12+48], xmm11 + vpsrld xmm11, xmm5, 20 + vpslld xmm5, xmm5, 12 + vpxor xmm5, xmm5, xmm11 + vpsrld xmm11, xmm6, 20 + vpslld xmm6, xmm6, 12 + vpxor xmm6, xmm6, xmm11 + vpsrld xmm11, xmm7, 20 + vpslld xmm7, xmm7, 12 + vpxor xmm7, xmm7, xmm11 + vpsrld xmm11, xmm4, 20 + vpslld xmm4, xmm4, 12 + vpxor xmm4, xmm4, xmm11 + vpaddd xmm0, xmm0, xmm5 + vpxor xmm15, xmm15, xmm0 + vmovdqa xmm11, OWORD PTR [r12+48] + vpshufb xmm15, xmm15, OWORD PTR [r14] + vpaddd xmm10, xmm10, xmm15 + vpxor xmm5, xmm5, xmm10 + vpaddd xmm1, xmm1, xmm6 + vpxor xmm12, xmm12, xmm1 + vpshufb xmm12, xmm12, OWORD PTR [r14] + vpaddd xmm11, xmm11, xmm12 + vpxor xmm6, xmm6, xmm11 + vpaddd xmm2, xmm2, xmm7 + vpxor xmm13, xmm13, xmm2 + vpshufb xmm13, xmm13, OWORD PTR [r14] + vpaddd xmm8, xmm8, xmm13 + vpxor xmm7, xmm7, xmm8 + vpaddd xmm3, xmm3, xmm4 + vpxor xmm14, xmm14, xmm3 + vpshufb xmm14, xmm14, OWORD PTR [r14] + vpaddd xmm9, xmm9, xmm14 + vpxor xmm4, xmm4, xmm9 + vmovdqa OWORD PTR [r12+48], xmm11 + vpsrld xmm11, xmm5, 25 + vpslld xmm5, xmm5, 7 + vpxor xmm5, xmm5, xmm11 + vpsrld xmm11, xmm6, 25 + vpslld xmm6, xmm6, 7 + vpxor xmm6, xmm6, xmm11 + vpsrld xmm11, xmm7, 25 + vpslld xmm7, xmm7, 7 + vpxor xmm7, xmm7, xmm11 + vpsrld xmm11, xmm4, 25 + vpslld xmm4, xmm4, 7 + vpxor xmm4, xmm4, xmm11 + dec r10b + jnz L_chacha20_avx1_loop128 + vmovdqa xmm11, OWORD PTR [r12+48] + vpaddd xmm0, xmm0, OWORD PTR [r11] + vpaddd xmm1, xmm1, OWORD PTR [r11+16] + vpaddd xmm2, xmm2, OWORD PTR [r11+32] + vpaddd xmm3, xmm3, OWORD PTR [r11+48] + vpaddd xmm4, xmm4, OWORD PTR [r11+64] + vpaddd xmm5, xmm5, OWORD PTR [r11+80] + vpaddd xmm6, xmm6, OWORD PTR [r11+96] + vpaddd xmm7, xmm7, OWORD PTR [r11+112] + vpaddd xmm8, xmm8, OWORD PTR [r11+128] + vpaddd xmm9, xmm9, OWORD PTR [r11+144] + vpaddd xmm10, xmm10, OWORD PTR [r11+160] + vpaddd xmm11, xmm11, OWORD PTR [r11+176] + vpaddd xmm12, xmm12, OWORD PTR [r11+192] + vpaddd xmm13, xmm13, OWORD PTR [r11+208] + vpaddd xmm14, xmm14, OWORD PTR [r11+224] + vpaddd xmm15, xmm15, OWORD PTR [r11+240] + vmovdqa OWORD PTR [r12], xmm8 + vmovdqa OWORD PTR [r12+16], xmm9 + vmovdqa OWORD PTR [r12+32], xmm10 + vmovdqa OWORD PTR [r12+48], xmm11 + vmovdqa OWORD PTR [r12+64], xmm12 + vmovdqa OWORD PTR [r12+80], xmm13 + vmovdqa OWORD PTR [r12+96], xmm14 + vmovdqa OWORD PTR [r12+112], xmm15 + vpunpckldq xmm8, xmm0, xmm1 + vpunpckldq xmm9, xmm2, xmm3 + vpunpckhdq xmm12, xmm0, xmm1 + vpunpckhdq xmm13, xmm2, xmm3 + vpunpckldq xmm10, xmm4, xmm5 + vpunpckldq xmm11, xmm6, xmm7 + vpunpckhdq xmm14, xmm4, xmm5 + vpunpckhdq xmm15, xmm6, xmm7 + vpunpcklqdq xmm0, xmm8, xmm9 + vpunpcklqdq xmm1, xmm10, xmm11 + vpunpckhqdq xmm2, xmm8, xmm9 + vpunpckhqdq xmm3, xmm10, xmm11 + vpunpcklqdq xmm4, xmm12, xmm13 + vpunpcklqdq xmm5, xmm14, xmm15 + vpunpckhqdq xmm6, xmm12, xmm13 + vpunpckhqdq xmm7, xmm14, xmm15 + vmovdqu xmm8, OWORD PTR [rdx] + vmovdqu xmm9, OWORD PTR [rdx+16] + vmovdqu xmm10, OWORD PTR [rdx+64] + vmovdqu xmm11, OWORD PTR [rdx+80] + vmovdqu xmm12, OWORD PTR [rdx+128] + vmovdqu xmm13, OWORD PTR [rdx+144] + vmovdqu xmm14, OWORD PTR [rdx+192] + vmovdqu xmm15, OWORD PTR [rdx+208] + vpxor xmm0, xmm0, xmm8 + vpxor xmm1, xmm1, xmm9 + vpxor xmm2, xmm2, xmm10 + vpxor xmm3, xmm3, xmm11 + vpxor xmm4, xmm4, xmm12 + vpxor xmm5, xmm5, xmm13 + vpxor xmm6, xmm6, xmm14 + vpxor xmm7, xmm7, xmm15 + vmovdqu OWORD PTR [r8], xmm0 + vmovdqu OWORD PTR [r8+16], xmm1 + vmovdqu OWORD PTR [r8+64], xmm2 + vmovdqu OWORD PTR [r8+80], xmm3 + vmovdqu OWORD PTR [r8+128], xmm4 + vmovdqu OWORD PTR [r8+144], xmm5 + vmovdqu OWORD PTR [r8+192], xmm6 + vmovdqu OWORD PTR [r8+208], xmm7 + vmovdqa xmm0, OWORD PTR [r12] + vmovdqa xmm1, OWORD PTR [r12+16] + vmovdqa xmm2, OWORD PTR [r12+32] + vmovdqa xmm3, OWORD PTR [r12+48] + vmovdqa xmm4, OWORD PTR [r12+64] + vmovdqa xmm5, OWORD PTR [r12+80] + vmovdqa xmm6, OWORD PTR [r12+96] + vmovdqa xmm7, OWORD PTR [r12+112] + vpunpckldq xmm8, xmm0, xmm1 + vpunpckldq xmm9, xmm2, xmm3 + vpunpckhdq xmm12, xmm0, xmm1 + vpunpckhdq xmm13, xmm2, xmm3 + vpunpckldq xmm10, xmm4, xmm5 + vpunpckldq xmm11, xmm6, xmm7 + vpunpckhdq xmm14, xmm4, xmm5 + vpunpckhdq xmm15, xmm6, xmm7 + vpunpcklqdq xmm0, xmm8, xmm9 + vpunpcklqdq xmm1, xmm10, xmm11 + vpunpckhqdq xmm2, xmm8, xmm9 + vpunpckhqdq xmm3, xmm10, xmm11 + vpunpcklqdq xmm4, xmm12, xmm13 + vpunpcklqdq xmm5, xmm14, xmm15 + vpunpckhqdq xmm6, xmm12, xmm13 + vpunpckhqdq xmm7, xmm14, xmm15 + vmovdqu xmm8, OWORD PTR [rdx+32] + vmovdqu xmm9, OWORD PTR [rdx+48] + vmovdqu xmm10, OWORD PTR [rdx+96] + vmovdqu xmm11, OWORD PTR [rdx+112] + vmovdqu xmm12, OWORD PTR [rdx+160] + vmovdqu xmm13, OWORD PTR [rdx+176] + vmovdqu xmm14, OWORD PTR [rdx+224] + vmovdqu xmm15, OWORD PTR [rdx+240] + vpxor xmm0, xmm0, xmm8 + vpxor xmm1, xmm1, xmm9 + vpxor xmm2, xmm2, xmm10 + vpxor xmm3, xmm3, xmm11 + vpxor xmm4, xmm4, xmm12 + vpxor xmm5, xmm5, xmm13 + vpxor xmm6, xmm6, xmm14 + vpxor xmm7, xmm7, xmm15 + vmovdqu OWORD PTR [r8+32], xmm0 + vmovdqu OWORD PTR [r8+48], xmm1 + vmovdqu OWORD PTR [r8+96], xmm2 + vmovdqu OWORD PTR [r8+112], xmm3 + vmovdqu OWORD PTR [r8+160], xmm4 + vmovdqu OWORD PTR [r8+176], xmm5 + vmovdqu OWORD PTR [r8+224], xmm6 + vmovdqu OWORD PTR [r8+240], xmm7 + vmovdqa xmm12, OWORD PTR [r11+192] + add rdx, 256 + add r8, 256 + vpaddd xmm12, xmm12, OWORD PTR [rsi] + sub r9d, 256 + vmovdqa OWORD PTR [r11+192], xmm12 + cmp r9d, 256 + jl L_chacha20_avx1_done128 + vmovdqa xmm0, OWORD PTR [r11] + vmovdqa xmm1, OWORD PTR [r11+16] + vmovdqa xmm2, OWORD PTR [r11+32] + vmovdqa xmm3, OWORD PTR [r11+48] + vmovdqa xmm4, OWORD PTR [r11+64] + vmovdqa xmm5, OWORD PTR [r11+80] + vmovdqa xmm6, OWORD PTR [r11+96] + vmovdqa xmm7, OWORD PTR [r11+112] + vmovdqa xmm8, OWORD PTR [r11+128] + vmovdqa xmm9, OWORD PTR [r11+144] + vmovdqa xmm10, OWORD PTR [r11+160] + vmovdqa xmm11, OWORD PTR [r11+176] + vmovdqa xmm12, OWORD PTR [r11+192] + vmovdqa xmm13, OWORD PTR [r11+208] + vmovdqa xmm14, OWORD PTR [r11+224] + vmovdqa xmm15, OWORD PTR [r11+240] + jmp L_chacha20_avx1_start128 +L_chacha20_avx1_done128: + shl eax, 2 + add DWORD PTR [rcx+48], eax +L_chacha20_avx1_end128: + cmp r9d, 64 + jl L_chacha20_avx1_block_done +L_chacha20_avx1_block_start: + vmovdqu xmm0, OWORD PTR [rcx] + vmovdqu xmm1, OWORD PTR [rcx+16] + vmovdqu xmm2, OWORD PTR [rcx+32] + vmovdqu xmm3, OWORD PTR [rcx+48] + vmovdqa xmm5, xmm0 + vmovdqa xmm6, xmm1 + vmovdqa xmm7, xmm2 + vmovdqa xmm8, xmm3 + mov al, 10 +L_chacha20_avx1_block_crypt_start: + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r15] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 20 + vpslld xmm1, xmm1, 12 + vpxor xmm1, xmm1, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r14] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 25 + vpslld xmm1, xmm1, 7 + vpxor xmm1, xmm1, xmm4 + vpshufd xmm1, xmm1, 57 + vpshufd xmm2, xmm2, 78 + vpshufd xmm3, xmm3, 147 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r15] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 20 + vpslld xmm1, xmm1, 12 + vpxor xmm1, xmm1, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r14] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 25 + vpslld xmm1, xmm1, 7 + vpxor xmm1, xmm1, xmm4 + vpshufd xmm1, xmm1, 147 + vpshufd xmm2, xmm2, 78 + vpshufd xmm3, xmm3, 57 + dec al + jnz L_chacha20_avx1_block_crypt_start + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm1, xmm1, xmm6 + vpaddd xmm2, xmm2, xmm7 + vpaddd xmm3, xmm3, xmm8 + vmovdqu xmm5, OWORD PTR [rdx] + vmovdqu xmm6, OWORD PTR [rdx+16] + vmovdqu xmm7, OWORD PTR [rdx+32] + vmovdqu xmm8, OWORD PTR [rdx+48] + vpxor xmm0, xmm0, xmm5 + vpxor xmm1, xmm1, xmm6 + vpxor xmm2, xmm2, xmm7 + vpxor xmm3, xmm3, xmm8 + vmovdqu OWORD PTR [r8], xmm0 + vmovdqu OWORD PTR [r8+16], xmm1 + vmovdqu OWORD PTR [r8+32], xmm2 + vmovdqu OWORD PTR [r8+48], xmm3 + add DWORD PTR [rcx+48], 1 + sub r9d, 64 + add rdx, 64 + add r8, 64 + cmp r9d, 64 + jge L_chacha20_avx1_block_start +L_chacha20_avx1_block_done: + cmp r9d, 0 + je L_chacha20_avx1_partial_done + lea r12, QWORD PTR [rcx+80] + vmovdqu xmm0, OWORD PTR [rcx] + vmovdqu xmm1, OWORD PTR [rcx+16] + vmovdqu xmm2, OWORD PTR [rcx+32] + vmovdqu xmm3, OWORD PTR [rcx+48] + vmovdqa xmm5, xmm0 + vmovdqa xmm6, xmm1 + vmovdqa xmm7, xmm2 + vmovdqa xmm8, xmm3 + mov al, 10 +L_chacha20_avx1_partial_crypt_start: + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r15] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 20 + vpslld xmm1, xmm1, 12 + vpxor xmm1, xmm1, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r14] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 25 + vpslld xmm1, xmm1, 7 + vpxor xmm1, xmm1, xmm4 + vpshufd xmm1, xmm1, 57 + vpshufd xmm2, xmm2, 78 + vpshufd xmm3, xmm3, 147 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r15] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 20 + vpslld xmm1, xmm1, 12 + vpxor xmm1, xmm1, xmm4 + vpaddd xmm0, xmm0, xmm1 + vpxor xmm3, xmm3, xmm0 + vpshufb xmm3, xmm3, OWORD PTR [r14] + vpaddd xmm2, xmm2, xmm3 + vpxor xmm1, xmm1, xmm2 + vpsrld xmm4, xmm1, 25 + vpslld xmm1, xmm1, 7 + vpxor xmm1, xmm1, xmm4 + vpshufd xmm1, xmm1, 147 + vpshufd xmm2, xmm2, 78 + vpshufd xmm3, xmm3, 57 + dec al + jnz L_chacha20_avx1_partial_crypt_start + vpaddd xmm0, xmm0, xmm5 + vpaddd xmm1, xmm1, xmm6 + vpaddd xmm2, xmm2, xmm7 + vpaddd xmm3, xmm3, xmm8 + vmovdqu OWORD PTR [r12], xmm0 + vmovdqu OWORD PTR [r12+16], xmm1 + vmovdqu OWORD PTR [r12+32], xmm2 + vmovdqu OWORD PTR [r12+48], xmm3 + add DWORD PTR [rcx+48], 1 + mov r10d, r9d + xor r13, r13 + and r10d, 7 + jz L_chacha20_avx1_partial_start64 +L_chacha20_avx1_partial_start8: + movzx eax, BYTE PTR [r12+r13] + xor al, BYTE PTR [rdx+r13] + mov BYTE PTR [r8+r13], al + inc r13d + cmp r13d, r10d + jne L_chacha20_avx1_partial_start8 + je L_chacha20_avx1_partial_end64 +L_chacha20_avx1_partial_start64: + mov rax, QWORD PTR [r12+r13] + xor rax, QWORD PTR [rdx+r13] + mov QWORD PTR [r8+r13], rax + add r13d, 8 +L_chacha20_avx1_partial_end64: + cmp r13d, r9d + jne L_chacha20_avx1_partial_start64 + mov r10d, 64 + sub r10d, r13d + mov DWORD PTR [rcx+76], r10d +L_chacha20_avx1_partial_done: + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp+400] + vmovdqu xmm7, OWORD PTR [rsp+416] + vmovdqu xmm8, OWORD PTR [rsp+432] + vmovdqu xmm9, OWORD PTR [rsp+448] + vmovdqu xmm10, OWORD PTR [rsp+464] + vmovdqu xmm11, OWORD PTR [rsp+480] + vmovdqu xmm12, OWORD PTR [rsp+496] + vmovdqu xmm13, OWORD PTR [rsp+512] + vmovdqu xmm14, OWORD PTR [rsp+528] + vmovdqu xmm15, OWORD PTR [rsp+544] + add rsp, 560 + pop rsi + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +chacha_encrypt_avx1 ENDP +_text ENDS +ENDIF +IFDEF HAVE_INTEL_AVX2 +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx2_rotl8 QWORD 433757367256023043, 1012478749960636427, + 433757367256023043, 1012478749960636427 +ptr_L_chacha20_avx2_rotl8 QWORD L_chacha20_avx2_rotl8 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx2_rotl16 QWORD 361421592464458498, 940142975169071882, + 361421592464458498, 940142975169071882 +ptr_L_chacha20_avx2_rotl16 QWORD L_chacha20_avx2_rotl16 +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx2_add QWORD 4294967296, 12884901890, + 21474836484, 30064771078 +ptr_L_chacha20_avx2_add QWORD L_chacha20_avx2_add +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_chacha20_avx2_eight QWORD 34359738376, 34359738376, + 34359738376, 34359738376 +ptr_L_chacha20_avx2_eight QWORD L_chacha20_avx2_eight +_DATA ENDS +_text SEGMENT READONLY PARA +chacha_encrypt_avx2 PROC + push r12 + push r13 + push r14 + push r15 + push rdi + sub rsp, 960 + vmovdqu OWORD PTR [rsp+800], xmm6 + vmovdqu OWORD PTR [rsp+816], xmm7 + vmovdqu OWORD PTR [rsp+832], xmm8 + vmovdqu OWORD PTR [rsp+848], xmm9 + vmovdqu OWORD PTR [rsp+864], xmm10 + vmovdqu OWORD PTR [rsp+880], xmm11 + vmovdqu OWORD PTR [rsp+896], xmm12 + vmovdqu OWORD PTR [rsp+912], xmm13 + vmovdqu OWORD PTR [rsp+928], xmm14 + vmovdqu OWORD PTR [rsp+944], xmm15 + mov r11, rsp + mov r13, QWORD PTR [ptr_L_chacha20_avx2_rotl8] + mov r14, QWORD PTR [ptr_L_chacha20_avx2_rotl16] + mov r15, QWORD PTR [ptr_L_chacha20_avx2_add] + mov rdi, QWORD PTR [ptr_L_chacha20_avx2_eight] + lea r12, QWORD PTR [rsp+512] + add r11, 31 + add r12, 31 + and r11, -32 + and r12, -32 + mov eax, r9d + shr eax, 9 + jz L_chacha20_avx2_end256 + vpbroadcastd ymm0, DWORD PTR [rcx] + vpbroadcastd ymm1, DWORD PTR [rcx+4] + vpbroadcastd ymm2, DWORD PTR [rcx+8] + vpbroadcastd ymm3, DWORD PTR [rcx+12] + vpbroadcastd ymm4, DWORD PTR [rcx+16] + vpbroadcastd ymm5, DWORD PTR [rcx+20] + vpbroadcastd ymm6, DWORD PTR [rcx+24] + vpbroadcastd ymm7, DWORD PTR [rcx+28] + vpbroadcastd ymm8, DWORD PTR [rcx+32] + vpbroadcastd ymm9, DWORD PTR [rcx+36] + vpbroadcastd ymm10, DWORD PTR [rcx+40] + vpbroadcastd ymm11, DWORD PTR [rcx+44] + vpbroadcastd ymm12, DWORD PTR [rcx+48] + vpbroadcastd ymm13, DWORD PTR [rcx+52] + vpbroadcastd ymm14, DWORD PTR [rcx+56] + vpbroadcastd ymm15, DWORD PTR [rcx+60] + vpaddd ymm12, ymm12, YMMWORD PTR [r15] + vmovdqa YMMWORD PTR [r11], ymm0 + vmovdqa YMMWORD PTR [r11+32], ymm1 + vmovdqa YMMWORD PTR [r11+64], ymm2 + vmovdqa YMMWORD PTR [r11+96], ymm3 + vmovdqa YMMWORD PTR [r11+128], ymm4 + vmovdqa YMMWORD PTR [r11+160], ymm5 + vmovdqa YMMWORD PTR [r11+192], ymm6 + vmovdqa YMMWORD PTR [r11+224], ymm7 + vmovdqa YMMWORD PTR [r11+256], ymm8 + vmovdqa YMMWORD PTR [r11+288], ymm9 + vmovdqa YMMWORD PTR [r11+320], ymm10 + vmovdqa YMMWORD PTR [r11+352], ymm11 + vmovdqa YMMWORD PTR [r11+384], ymm12 + vmovdqa YMMWORD PTR [r11+416], ymm13 + vmovdqa YMMWORD PTR [r11+448], ymm14 + vmovdqa YMMWORD PTR [r11+480], ymm15 +L_chacha20_avx2_start256: + mov r10b, 10 + vmovdqa YMMWORD PTR [r12+96], ymm11 +L_chacha20_avx2_loop256: + vpaddd ymm0, ymm0, ymm4 + vpxor ymm12, ymm12, ymm0 + vmovdqa ymm11, YMMWORD PTR [r12+96] + vpshufb ymm12, ymm12, YMMWORD PTR [r14] + vpaddd ymm8, ymm8, ymm12 + vpxor ymm4, ymm4, ymm8 + vpaddd ymm1, ymm1, ymm5 + vpxor ymm13, ymm13, ymm1 + vpshufb ymm13, ymm13, YMMWORD PTR [r14] + vpaddd ymm9, ymm9, ymm13 + vpxor ymm5, ymm5, ymm9 + vpaddd ymm2, ymm2, ymm6 + vpxor ymm14, ymm14, ymm2 + vpshufb ymm14, ymm14, YMMWORD PTR [r14] + vpaddd ymm10, ymm10, ymm14 + vpxor ymm6, ymm6, ymm10 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm15, ymm15, ymm3 + vpshufb ymm15, ymm15, YMMWORD PTR [r14] + vpaddd ymm11, ymm11, ymm15 + vpxor ymm7, ymm7, ymm11 + vmovdqa YMMWORD PTR [r12+96], ymm11 + vpsrld ymm11, ymm4, 20 + vpslld ymm4, ymm4, 12 + vpxor ymm4, ymm4, ymm11 + vpsrld ymm11, ymm5, 20 + vpslld ymm5, ymm5, 12 + vpxor ymm5, ymm5, ymm11 + vpsrld ymm11, ymm6, 20 + vpslld ymm6, ymm6, 12 + vpxor ymm6, ymm6, ymm11 + vpsrld ymm11, ymm7, 20 + vpslld ymm7, ymm7, 12 + vpxor ymm7, ymm7, ymm11 + vpaddd ymm0, ymm0, ymm4 + vpxor ymm12, ymm12, ymm0 + vmovdqa ymm11, YMMWORD PTR [r12+96] + vpshufb ymm12, ymm12, YMMWORD PTR [r13] + vpaddd ymm8, ymm8, ymm12 + vpxor ymm4, ymm4, ymm8 + vpaddd ymm1, ymm1, ymm5 + vpxor ymm13, ymm13, ymm1 + vpshufb ymm13, ymm13, YMMWORD PTR [r13] + vpaddd ymm9, ymm9, ymm13 + vpxor ymm5, ymm5, ymm9 + vpaddd ymm2, ymm2, ymm6 + vpxor ymm14, ymm14, ymm2 + vpshufb ymm14, ymm14, YMMWORD PTR [r13] + vpaddd ymm10, ymm10, ymm14 + vpxor ymm6, ymm6, ymm10 + vpaddd ymm3, ymm3, ymm7 + vpxor ymm15, ymm15, ymm3 + vpshufb ymm15, ymm15, YMMWORD PTR [r13] + vpaddd ymm11, ymm11, ymm15 + vpxor ymm7, ymm7, ymm11 + vmovdqa YMMWORD PTR [r12+96], ymm11 + vpsrld ymm11, ymm4, 25 + vpslld ymm4, ymm4, 7 + vpxor ymm4, ymm4, ymm11 + vpsrld ymm11, ymm5, 25 + vpslld ymm5, ymm5, 7 + vpxor ymm5, ymm5, ymm11 + vpsrld ymm11, ymm6, 25 + vpslld ymm6, ymm6, 7 + vpxor ymm6, ymm6, ymm11 + vpsrld ymm11, ymm7, 25 + vpslld ymm7, ymm7, 7 + vpxor ymm7, ymm7, ymm11 + vpaddd ymm0, ymm0, ymm5 + vpxor ymm15, ymm15, ymm0 + vmovdqa ymm11, YMMWORD PTR [r12+96] + vpshufb ymm15, ymm15, YMMWORD PTR [r14] + vpaddd ymm10, ymm10, ymm15 + vpxor ymm5, ymm5, ymm10 + vpaddd ymm1, ymm1, ymm6 + vpxor ymm12, ymm12, ymm1 + vpshufb ymm12, ymm12, YMMWORD PTR [r14] + vpaddd ymm11, ymm11, ymm12 + vpxor ymm6, ymm6, ymm11 + vpaddd ymm2, ymm2, ymm7 + vpxor ymm13, ymm13, ymm2 + vpshufb ymm13, ymm13, YMMWORD PTR [r14] + vpaddd ymm8, ymm8, ymm13 + vpxor ymm7, ymm7, ymm8 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm14, ymm14, ymm3 + vpshufb ymm14, ymm14, YMMWORD PTR [r14] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm4, ymm4, ymm9 + vmovdqa YMMWORD PTR [r12+96], ymm11 + vpsrld ymm11, ymm5, 20 + vpslld ymm5, ymm5, 12 + vpxor ymm5, ymm5, ymm11 + vpsrld ymm11, ymm6, 20 + vpslld ymm6, ymm6, 12 + vpxor ymm6, ymm6, ymm11 + vpsrld ymm11, ymm7, 20 + vpslld ymm7, ymm7, 12 + vpxor ymm7, ymm7, ymm11 + vpsrld ymm11, ymm4, 20 + vpslld ymm4, ymm4, 12 + vpxor ymm4, ymm4, ymm11 + vpaddd ymm0, ymm0, ymm5 + vpxor ymm15, ymm15, ymm0 + vmovdqa ymm11, YMMWORD PTR [r12+96] + vpshufb ymm15, ymm15, YMMWORD PTR [r13] + vpaddd ymm10, ymm10, ymm15 + vpxor ymm5, ymm5, ymm10 + vpaddd ymm1, ymm1, ymm6 + vpxor ymm12, ymm12, ymm1 + vpshufb ymm12, ymm12, YMMWORD PTR [r13] + vpaddd ymm11, ymm11, ymm12 + vpxor ymm6, ymm6, ymm11 + vpaddd ymm2, ymm2, ymm7 + vpxor ymm13, ymm13, ymm2 + vpshufb ymm13, ymm13, YMMWORD PTR [r13] + vpaddd ymm8, ymm8, ymm13 + vpxor ymm7, ymm7, ymm8 + vpaddd ymm3, ymm3, ymm4 + vpxor ymm14, ymm14, ymm3 + vpshufb ymm14, ymm14, YMMWORD PTR [r13] + vpaddd ymm9, ymm9, ymm14 + vpxor ymm4, ymm4, ymm9 + vmovdqa YMMWORD PTR [r12+96], ymm11 + vpsrld ymm11, ymm5, 25 + vpslld ymm5, ymm5, 7 + vpxor ymm5, ymm5, ymm11 + vpsrld ymm11, ymm6, 25 + vpslld ymm6, ymm6, 7 + vpxor ymm6, ymm6, ymm11 + vpsrld ymm11, ymm7, 25 + vpslld ymm7, ymm7, 7 + vpxor ymm7, ymm7, ymm11 + vpsrld ymm11, ymm4, 25 + vpslld ymm4, ymm4, 7 + vpxor ymm4, ymm4, ymm11 + dec r10b + jnz L_chacha20_avx2_loop256 + vmovdqa ymm11, YMMWORD PTR [r12+96] + vpaddd ymm0, ymm0, YMMWORD PTR [r11] + vpaddd ymm1, ymm1, YMMWORD PTR [r11+32] + vpaddd ymm2, ymm2, YMMWORD PTR [r11+64] + vpaddd ymm3, ymm3, YMMWORD PTR [r11+96] + vpaddd ymm4, ymm4, YMMWORD PTR [r11+128] + vpaddd ymm5, ymm5, YMMWORD PTR [r11+160] + vpaddd ymm6, ymm6, YMMWORD PTR [r11+192] + vpaddd ymm7, ymm7, YMMWORD PTR [r11+224] + vpaddd ymm8, ymm8, YMMWORD PTR [r11+256] + vpaddd ymm9, ymm9, YMMWORD PTR [r11+288] + vpaddd ymm10, ymm10, YMMWORD PTR [r11+320] + vpaddd ymm11, ymm11, YMMWORD PTR [r11+352] + vpaddd ymm12, ymm12, YMMWORD PTR [r11+384] + vpaddd ymm13, ymm13, YMMWORD PTR [r11+416] + vpaddd ymm14, ymm14, YMMWORD PTR [r11+448] + vpaddd ymm15, ymm15, YMMWORD PTR [r11+480] + vmovdqa YMMWORD PTR [r12], ymm8 + vmovdqa YMMWORD PTR [r12+32], ymm9 + vmovdqa YMMWORD PTR [r12+64], ymm10 + vmovdqa YMMWORD PTR [r12+96], ymm11 + vmovdqa YMMWORD PTR [r12+128], ymm12 + vmovdqa YMMWORD PTR [r12+160], ymm13 + vmovdqa YMMWORD PTR [r12+192], ymm14 + vmovdqa YMMWORD PTR [r12+224], ymm15 + vpunpckldq ymm8, ymm0, ymm1 + vpunpckldq ymm9, ymm2, ymm3 + vpunpckhdq ymm12, ymm0, ymm1 + vpunpckhdq ymm13, ymm2, ymm3 + vpunpckldq ymm10, ymm4, ymm5 + vpunpckldq ymm11, ymm6, ymm7 + vpunpckhdq ymm14, ymm4, ymm5 + vpunpckhdq ymm15, ymm6, ymm7 + vpunpcklqdq ymm0, ymm8, ymm9 + vpunpcklqdq ymm1, ymm10, ymm11 + vpunpckhqdq ymm2, ymm8, ymm9 + vpunpckhqdq ymm3, ymm10, ymm11 + vpunpcklqdq ymm4, ymm12, ymm13 + vpunpcklqdq ymm5, ymm14, ymm15 + vpunpckhqdq ymm6, ymm12, ymm13 + vpunpckhqdq ymm7, ymm14, ymm15 + vperm2i128 ymm8, ymm0, ymm1, 32 + vperm2i128 ymm9, ymm2, ymm3, 32 + vperm2i128 ymm12, ymm0, ymm1, 49 + vperm2i128 ymm13, ymm2, ymm3, 49 + vperm2i128 ymm10, ymm4, ymm5, 32 + vperm2i128 ymm11, ymm6, ymm7, 32 + vperm2i128 ymm14, ymm4, ymm5, 49 + vperm2i128 ymm15, ymm6, ymm7, 49 + vmovdqu ymm0, YMMWORD PTR [rdx] + vmovdqu ymm1, YMMWORD PTR [rdx+64] + vmovdqu ymm2, YMMWORD PTR [rdx+128] + vmovdqu ymm3, YMMWORD PTR [rdx+192] + vmovdqu ymm4, YMMWORD PTR [rdx+256] + vmovdqu ymm5, YMMWORD PTR [rdx+320] + vmovdqu ymm6, YMMWORD PTR [rdx+384] + vmovdqu ymm7, YMMWORD PTR [rdx+448] + vpxor ymm8, ymm8, ymm0 + vpxor ymm9, ymm9, ymm1 + vpxor ymm10, ymm10, ymm2 + vpxor ymm11, ymm11, ymm3 + vpxor ymm12, ymm12, ymm4 + vpxor ymm13, ymm13, ymm5 + vpxor ymm14, ymm14, ymm6 + vpxor ymm15, ymm15, ymm7 + vmovdqu YMMWORD PTR [r8], ymm8 + vmovdqu YMMWORD PTR [r8+64], ymm9 + vmovdqu YMMWORD PTR [r8+128], ymm10 + vmovdqu YMMWORD PTR [r8+192], ymm11 + vmovdqu YMMWORD PTR [r8+256], ymm12 + vmovdqu YMMWORD PTR [r8+320], ymm13 + vmovdqu YMMWORD PTR [r8+384], ymm14 + vmovdqu YMMWORD PTR [r8+448], ymm15 + vmovdqa ymm0, YMMWORD PTR [r12] + vmovdqa ymm1, YMMWORD PTR [r12+32] + vmovdqa ymm2, YMMWORD PTR [r12+64] + vmovdqa ymm3, YMMWORD PTR [r12+96] + vmovdqa ymm4, YMMWORD PTR [r12+128] + vmovdqa ymm5, YMMWORD PTR [r12+160] + vmovdqa ymm6, YMMWORD PTR [r12+192] + vmovdqa ymm7, YMMWORD PTR [r12+224] + vpunpckldq ymm8, ymm0, ymm1 + vpunpckldq ymm9, ymm2, ymm3 + vpunpckhdq ymm12, ymm0, ymm1 + vpunpckhdq ymm13, ymm2, ymm3 + vpunpckldq ymm10, ymm4, ymm5 + vpunpckldq ymm11, ymm6, ymm7 + vpunpckhdq ymm14, ymm4, ymm5 + vpunpckhdq ymm15, ymm6, ymm7 + vpunpcklqdq ymm0, ymm8, ymm9 + vpunpcklqdq ymm1, ymm10, ymm11 + vpunpckhqdq ymm2, ymm8, ymm9 + vpunpckhqdq ymm3, ymm10, ymm11 + vpunpcklqdq ymm4, ymm12, ymm13 + vpunpcklqdq ymm5, ymm14, ymm15 + vpunpckhqdq ymm6, ymm12, ymm13 + vpunpckhqdq ymm7, ymm14, ymm15 + vperm2i128 ymm8, ymm0, ymm1, 32 + vperm2i128 ymm9, ymm2, ymm3, 32 + vperm2i128 ymm12, ymm0, ymm1, 49 + vperm2i128 ymm13, ymm2, ymm3, 49 + vperm2i128 ymm10, ymm4, ymm5, 32 + vperm2i128 ymm11, ymm6, ymm7, 32 + vperm2i128 ymm14, ymm4, ymm5, 49 + vperm2i128 ymm15, ymm6, ymm7, 49 + vmovdqu ymm0, YMMWORD PTR [rdx+32] + vmovdqu ymm1, YMMWORD PTR [rdx+96] + vmovdqu ymm2, YMMWORD PTR [rdx+160] + vmovdqu ymm3, YMMWORD PTR [rdx+224] + vmovdqu ymm4, YMMWORD PTR [rdx+288] + vmovdqu ymm5, YMMWORD PTR [rdx+352] + vmovdqu ymm6, YMMWORD PTR [rdx+416] + vmovdqu ymm7, YMMWORD PTR [rdx+480] + vpxor ymm8, ymm8, ymm0 + vpxor ymm9, ymm9, ymm1 + vpxor ymm10, ymm10, ymm2 + vpxor ymm11, ymm11, ymm3 + vpxor ymm12, ymm12, ymm4 + vpxor ymm13, ymm13, ymm5 + vpxor ymm14, ymm14, ymm6 + vpxor ymm15, ymm15, ymm7 + vmovdqu YMMWORD PTR [r8+32], ymm8 + vmovdqu YMMWORD PTR [r8+96], ymm9 + vmovdqu YMMWORD PTR [r8+160], ymm10 + vmovdqu YMMWORD PTR [r8+224], ymm11 + vmovdqu YMMWORD PTR [r8+288], ymm12 + vmovdqu YMMWORD PTR [r8+352], ymm13 + vmovdqu YMMWORD PTR [r8+416], ymm14 + vmovdqu YMMWORD PTR [r8+480], ymm15 + vmovdqa ymm12, YMMWORD PTR [r11+384] + add rdx, 512 + add r8, 512 + vpaddd ymm12, ymm12, YMMWORD PTR [rdi] + sub r9d, 512 + vmovdqa YMMWORD PTR [r11+384], ymm12 + cmp r9d, 512 + jl L_chacha20_avx2_done256 + vmovdqa ymm0, YMMWORD PTR [r11] + vmovdqa ymm1, YMMWORD PTR [r11+32] + vmovdqa ymm2, YMMWORD PTR [r11+64] + vmovdqa ymm3, YMMWORD PTR [r11+96] + vmovdqa ymm4, YMMWORD PTR [r11+128] + vmovdqa ymm5, YMMWORD PTR [r11+160] + vmovdqa ymm6, YMMWORD PTR [r11+192] + vmovdqa ymm7, YMMWORD PTR [r11+224] + vmovdqa ymm8, YMMWORD PTR [r11+256] + vmovdqa ymm9, YMMWORD PTR [r11+288] + vmovdqa ymm10, YMMWORD PTR [r11+320] + vmovdqa ymm11, YMMWORD PTR [r11+352] + vmovdqa ymm12, YMMWORD PTR [r11+384] + vmovdqa ymm13, YMMWORD PTR [r11+416] + vmovdqa ymm14, YMMWORD PTR [r11+448] + vmovdqa ymm15, YMMWORD PTR [r11+480] + jmp L_chacha20_avx2_start256 +L_chacha20_avx2_done256: + shl eax, 3 + add DWORD PTR [rcx+48], eax +L_chacha20_avx2_end256: + call chacha_encrypt_avx1 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp+800] + vmovdqu xmm7, OWORD PTR [rsp+816] + vmovdqu xmm8, OWORD PTR [rsp+832] + vmovdqu xmm9, OWORD PTR [rsp+848] + vmovdqu xmm10, OWORD PTR [rsp+864] + vmovdqu xmm11, OWORD PTR [rsp+880] + vmovdqu xmm12, OWORD PTR [rsp+896] + vmovdqu xmm13, OWORD PTR [rsp+912] + vmovdqu xmm14, OWORD PTR [rsp+928] + vmovdqu xmm15, OWORD PTR [rsp+944] + add rsp, 960 + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +chacha_encrypt_avx2 ENDP +_text ENDS +ENDIF +END diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/cmac.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cmac.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/cmac.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cmac.c 2024-08-03 07:30:00.000000000 +0000 @@ -39,8 +39,8 @@ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$n") - #pragma const_seg(".fipsB$n") + #pragma code_seg(".fipsA$c") + #pragma const_seg(".fipsB$c") #endif #endif @@ -59,6 +59,15 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_cmac_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000003 }; + int wolfCrypt_FIPS_CMAC_sanity(void) + { + return 0; + } +#endif + #ifdef WOLFSSL_HASH_KEEP /* Some hardware have issues with update, this function stores the data to be * hashed into an array. Once ready, the Final operation is called on all of the @@ -96,7 +105,7 @@ int wc_InitCmac_ex(Cmac* cmac, const byte* key, word32 keySz, int type, void* unused, void* heap, int devId) { - int ret; + int ret = 0; #if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_CRYPT) byte useSW = 0; #endif @@ -115,16 +124,17 @@ XMEMSET(cmac, 0, sizeof(Cmac)); #ifdef WOLF_CRYPTO_CB + /* Set devId regardless of value (invalid or not) */ + cmac->devId = devId; #ifndef WOLF_CRYPTO_CB_FIND if (devId != INVALID_DEVID) #endif { - cmac->devId = devId; cmac->devCtx = NULL; ret = wc_CryptoCb_Cmac(cmac, key, keySz, NULL, 0, NULL, NULL, type, unused); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -136,6 +146,8 @@ return BAD_FUNC_ARG; } + ret = wc_AesInit(&cmac->aes, heap, devId); + #if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_CRYPT) cmac->useSWCrypt = useSW; if (cmac->useSWCrypt == 1) { @@ -143,7 +155,10 @@ } #endif - ret = wc_AesSetKey(&cmac->aes, key, keySz, NULL, AES_ENCRYPTION); + if (ret == 0) { + ret = wc_AesSetKey(&cmac->aes, key, keySz, NULL, AES_ENCRYPTION); + } + if (ret == 0) { byte l[AES_BLOCK_SIZE]; @@ -187,14 +202,16 @@ { ret = wc_CryptoCb_Cmac(cmac, NULL, 0, in, inSz, NULL, NULL, 0, NULL); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ - ret = 0; /* reset error code */ } #endif - while (inSz != 0) { + /* Clear CRYPTOCB_UNAVAILABLE return code */ + ret = 0; + + while ((ret == 0) && (inSz != 0)) { word32 add = min(inSz, AES_BLOCK_SIZE - cmac->bufferSz); XMEMCPY(&cmac->buffer[cmac->bufferSz], in, add); @@ -217,10 +234,26 @@ return ret; } +int wc_CmacFree(Cmac* cmac) +{ + if (cmac == NULL) + return BAD_FUNC_ARG; +#if defined(WOLFSSL_HASH_KEEP) + /* TODO: msg is leaked if wc_CmacFinal() is not called + * e.g. when multiple calls to wc_CmacUpdate() and one fails but + * wc_CmacFinal() not called. */ + if (cmac->msg != NULL) { + XFREE(cmac->msg, cmac->heap, DYNAMIC_TYPE_TMP_BUFFER); + } +#endif + wc_AesFree(&cmac->aes); + ForceZero(cmac, sizeof(Cmac)); + return 0; +} -int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz) +int wc_CmacFinalNoFree(Cmac* cmac, byte* out, word32* outSz) { - int ret; + int ret = 0; const byte* subKey; word32 remainder; @@ -237,7 +270,7 @@ #endif { ret = wc_CryptoCb_Cmac(cmac, NULL, 0, NULL, 0, out, outSz, 0, NULL); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -270,17 +303,73 @@ XMEMCPY(out, cmac->digest, *outSz); } -#if defined(WOLFSSL_HASH_KEEP) - /* TODO: msg is leaked if wc_CmacFinal() is not called - * e.g. when multiple calls to wc_CmacUpdate() and one fails but - * wc_CmacFinal() not called. */ - if (cmac->msg != NULL) { - XFREE(cmac->msg, cmac->heap, DYNAMIC_TYPE_TMP_BUFFER); - cmac->msg = NULL; + return 0; +} + +int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz) { + int ret = 0; + + if (cmac == NULL) + return BAD_FUNC_ARG; + ret = wc_CmacFinalNoFree(cmac, out, outSz); + (void)wc_CmacFree(cmac); + return ret; +} + + +int wc_AesCmacGenerate_ex(Cmac* cmac, + byte* out, word32* outSz, + const byte* in, word32 inSz, + const byte* key, word32 keySz, + void* heap, int devId) +{ + int ret = 0; + + if (cmac == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WOLF_CRYPTO_CB + /* Set devId regardless of value (invalid or not) */ + cmac->devId = devId; + #ifndef WOLF_CRYPTO_CB_FIND + if (devId != INVALID_DEVID) + #endif + { + cmac->devCtx = NULL; + + ret = wc_CryptoCb_Cmac(cmac, key, keySz, in, inSz, out, outSz, + WC_CMAC_AES, NULL); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + + /* Clear CRYPTOCB_UNAVAILABLE return code */ + ret = 0; + + /* fall-through when unavailable */ } #endif - wc_AesFree(&cmac->aes); - ForceZero(cmac, sizeof(Cmac)); + + if ( ((out == NULL) && (outSz != NULL) && (*outSz > 0)) + || (in == NULL && inSz > 0) + || (key == NULL && keySz > 0)) { + return BAD_FUNC_ARG; + } + + /* Init step is optional */ + if (key != NULL) { + ret = wc_InitCmac_ex(cmac, key, keySz, WC_CMAC_AES, NULL, heap, devId); + } + if (ret == 0) { + ret = wc_CmacUpdate(cmac, in, inSz); + /* Ensure we are freed and zeroed if not calling wc_CmacFinal */ + if (ret != 0) { + (void)wc_CmacFree(cmac); + } + } + if (ret == 0) { + ret = wc_CmacFinal(cmac, out, outSz); + } return ret; } @@ -290,7 +379,7 @@ const byte* in, word32 inSz, const byte* key, word32 keySz) { - int ret; + int ret = 0; #ifdef WOLFSSL_SMALL_STACK Cmac *cmac; #else @@ -307,21 +396,22 @@ return MEMORY_E; } #endif + #ifdef WOLFSSL_CHECK_MEM_ZERO XMEMSET(((unsigned char *)cmac) + sizeof(Aes), 0xff, sizeof(Cmac) - sizeof(Aes)); /* Aes part is checked by wc_AesFree. */ - wc_MemZero_Add("wc_AesCmacGenerate cmac", + wc_MemZero_Add("wc_AesCmacGenerate_ex cmac", ((unsigned char *)cmac) + sizeof(Aes), sizeof(Cmac) - sizeof(Aes)); #endif - ret = wc_InitCmac(cmac, key, keySz, WC_CMAC_AES, NULL); - if (ret == 0) { - ret = wc_CmacUpdate(cmac, in, inSz); - } - if (ret == 0) { - ret = wc_CmacFinal(cmac, out, outSz); - } + ret = wc_AesCmacGenerate_ex(cmac, + out, outSz, + in, inSz, + key, keySz, + NULL, + INVALID_DEVID); + #ifdef WOLFSSL_SMALL_STACK if (cmac) { @@ -335,26 +425,82 @@ } -int wc_AesCmacVerify(const byte* check, word32 checkSz, - const byte* in, word32 inSz, - const byte* key, word32 keySz) +int wc_AesCmacVerify_ex(Cmac* cmac, + const byte* check, word32 checkSz, + const byte* in, word32 inSz, + const byte* key, word32 keySz, + void* heap, int devId) { - int ret; + int ret = 0; byte a[AES_BLOCK_SIZE]; word32 aSz = sizeof(a); int compareRet; - if (check == NULL || checkSz == 0 || (in == NULL && inSz != 0) || - key == NULL || keySz == 0) { + if (cmac == NULL || check == NULL || checkSz == 0 || (in == NULL && inSz != 0)) { return BAD_FUNC_ARG; } XMEMSET(a, 0, aSz); - ret = wc_AesCmacGenerate(a, &aSz, in, inSz, key, keySz); - compareRet = ConstantCompare(check, a, (int)min(checkSz, aSz)); - - if (ret == 0) + ret = wc_AesCmacGenerate_ex(cmac, + a, &aSz, + in, inSz, + key, keySz, + heap, + devId); + if (ret == 0) { + compareRet = ConstantCompare(check, a, (int)min(checkSz, aSz)); ret = compareRet ? 1 : 0; + } + + return ret; +} + + +int wc_AesCmacVerify(const byte* check, word32 checkSz, + const byte* in, word32 inSz, + const byte* key, word32 keySz) +{ + int ret = 0; +#ifdef WOLFSSL_SMALL_STACK + Cmac *cmac; +#else + Cmac cmac[1]; +#endif + + if (check == NULL || checkSz == 0 || (in == NULL && inSz > 0) || + key == NULL || keySz == 0) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if ((cmac = (Cmac *)XMALLOC(sizeof *cmac, NULL, + DYNAMIC_TYPE_CMAC)) == NULL) { + return MEMORY_E; + } +#endif + +#ifdef WOLFSSL_CHECK_MEM_ZERO + XMEMSET(((unsigned char *)cmac) + sizeof(Aes), 0xff, + sizeof(Cmac) - sizeof(Aes)); + /* Aes part is checked by wc_AesFree. */ + wc_MemZero_Add("wc_AesCmacGenerate_ex cmac", + ((unsigned char *)cmac) + sizeof(Aes), sizeof(Cmac) - sizeof(Aes)); +#endif + + ret = wc_AesCmacVerify_ex(cmac, + check, checkSz, + in, inSz, + key, keySz, + NULL, + INVALID_DEVID); + +#ifdef WOLFSSL_SMALL_STACK + if (cmac) { + XFREE(cmac, NULL, DYNAMIC_TYPE_CMAC); + } +#elif defined(WOLFSSL_CHECK_MEM_ZERO) + wc_MemZero_Check(cmac, sizeof(Cmac)); +#endif return ret; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/coding.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/coding.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/coding.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/coding.c 2024-08-03 07:30:00.000000000 +0000 @@ -181,7 +181,7 @@ byte e1, e2, e3, e4; if ((ret = Base64_SkipNewline(in, &inLen, &j)) != 0) { - if (ret == BUFFER_E) { + if (ret == WC_NO_ERR_TRACE(BUFFER_E)) { /* Running out of buffer here is not an error */ break; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/compress.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/compress.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/compress.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/compress.c 2024-08-03 07:30:00.000000000 +0000 @@ -245,6 +245,7 @@ stream.opaque = (voidpf)0; if (inflateInit2(&stream, DEFLATE_DEFAULT_WINDOWBITS | windowBits) != Z_OK) { + XFREE(tmp, heap, memoryType); return DECOMPRESS_INIT_E; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/cpuid.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cpuid.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/cpuid.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cpuid.c 2024-08-03 07:30:00.000000000 +0000 @@ -96,6 +96,7 @@ if (cpuid_flag(7, 0, EBX, 19)) { cpuid_flags |= CPUID_ADX ; } if (cpuid_flag(1, 0, ECX, 22)) { cpuid_flags |= CPUID_MOVBE ; } if (cpuid_flag(7, 0, EBX, 3)) { cpuid_flags |= CPUID_BMI1 ; } + if (cpuid_flag(7, 0, EBX, 29)) { cpuid_flags |= CPUID_SHA ; } cpuid_check = 1; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/cryptocb.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cryptocb.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/cryptocb.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/cryptocb.c 2024-08-03 07:30:00.000000000 +0000 @@ -22,6 +22,20 @@ /* This framework provides a central place for crypto hardware integration using the devId scheme. If not supported return `CRYPTOCB_UNAVAILABLE`. */ +/* Some common, optional build settings: + * these can also be set in wolfssl/options.h or user_settings.h + * ------------------------------------------------------------- + * enable the find device callback functions + * WOLF_CRYPTO_CB_FIND + * + * enable the command callback functions to invoke the callback during + * register and unregister + * WOLF_CRYPTO_CB_CMD + * + * enable debug InfoString functions + * DEBUG_CRYPTOCB + */ + #ifdef HAVE_CONFIG_H #include #endif @@ -34,6 +48,10 @@ #include #include +#ifdef HAVE_ARIA + #include +#endif + #ifdef WOLFSSL_CAAM #include #endif @@ -58,6 +76,9 @@ static const char* GetAlgoTypeStr(int algo) { switch (algo) { /* enum wc_AlgoType */ +#ifdef WOLF_CRYPTO_CB_CMD + case WC_ALGO_TYPE_NONE: return "None-Command"; +#endif case WC_ALGO_TYPE_HASH: return "Hash"; case WC_ALGO_TYPE_CIPHER: return "Cipher"; case WC_ALGO_TYPE_PK: return "PK"; @@ -133,6 +154,17 @@ } #endif +#ifdef WOLF_CRYPTO_CB_CMD +static const char* GetCryptoCbCmdTypeStr(int type) +{ + switch (type) { + case WC_CRYPTOCB_CMD_TYPE_REGISTER: return "Register"; + case WC_CRYPTOCB_CMD_TYPE_UNREGISTER: return "UnRegister"; + } + return NULL; +} +#endif + WOLFSSL_API void wc_CryptoCb_InfoString(wc_CryptoInfo* info) { if (info == NULL) @@ -149,22 +181,38 @@ else #endif { - printf("Crypto CB: %s %s (%d)\n", GetAlgoTypeStr(info->algo_type), + printf("Crypto CB: %s %s (%d)\n", + GetAlgoTypeStr(info->algo_type), GetPkTypeStr(info->pk.type), info->pk.type); } } else if (info->algo_type == WC_ALGO_TYPE_CIPHER) { - printf("Crypto CB: %s %s (%d)\n", GetAlgoTypeStr(info->algo_type), - GetCipherTypeStr(info->cipher.type), info->cipher.type); + printf("Crypto CB: %s %s (%d) (%p ctx)\n", + GetAlgoTypeStr(info->algo_type), + GetCipherTypeStr(info->cipher.type), + info->cipher.type, info->cipher.ctx); } else if (info->algo_type == WC_ALGO_TYPE_HASH) { - printf("Crypto CB: %s %s (%d)\n", GetAlgoTypeStr(info->algo_type), - GetHashTypeStr(info->hash.type), info->hash.type); + printf("Crypto CB: %s %s (%d) (%p ctx) %s\n", + GetAlgoTypeStr(info->algo_type), + GetHashTypeStr(info->hash.type), + info->hash.type, info->hash.ctx, + (info->hash.in != NULL) ? "Update" : "Final"); } else if (info->algo_type == WC_ALGO_TYPE_HMAC) { - printf("Crypto CB: %s %s (%d)\n", GetAlgoTypeStr(info->algo_type), - GetHashTypeStr(info->hmac.macType), info->hmac.macType); + printf("Crypto CB: %s %s (%d) (%p ctx) %s\n", + GetAlgoTypeStr(info->algo_type), + GetHashTypeStr(info->hmac.macType), + info->hmac.macType, info->hmac.hmac, + (info->hmac.in != NULL) ? "Update" : "Final"); + } +#ifdef WOLF_CRYPTO_CB_CMD + else if (info->algo_type == WC_ALGO_TYPE_NONE) { + printf("Crypto CB: %s %s (%d)\n", + GetAlgoTypeStr(info->algo_type), + GetCryptoCbCmdTypeStr(info->cmd.type), info->cmd.type); } +#endif else { printf("CryptoCb: %s \n", GetAlgoTypeStr(info->algo_type)); } @@ -212,18 +260,35 @@ static WC_INLINE int wc_CryptoCb_TranslateErrorCode(int ret) { - if (ret == NOT_COMPILED_IN) { + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { /* backwards compatibility for older NOT_COMPILED_IN syntax */ - ret = CRYPTOCB_UNAVAILABLE; + ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); } return ret; } +/* Helper function to reset a device entry to invalid */ +static WC_INLINE void wc_CryptoCb_ClearDev(CryptoCb *dev) +{ + XMEMSET(dev, 0, sizeof(*dev)); + dev->devId = INVALID_DEVID; +} + void wc_CryptoCb_Init(void) { int i; - for (i=0; idevId = devId; - dev->cb = cb; - dev->ctx = ctx; + dev->cb = cb; + dev->ctx = ctx; - return 0; +#ifdef WOLF_CRYPTO_CB_CMD + if (cb != NULL) { + /* Invoke callback with register command */ + wc_CryptoInfo info; + XMEMSET(&info, 0, sizeof(info)); + info.algo_type = WC_ALGO_TYPE_NONE; + info.cmd.type = WC_CRYPTOCB_CMD_TYPE_REGISTER; + info.cmd.ctx = ctx; /* cb may update on success */ + + rc = cb(devId, &info, ctx); + if (rc == 0) { + /* Success. Update dev->ctx */ + dev->ctx = info.cmd.ctx; + } + else if ((rc == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) || + (rc == WC_NO_ERR_TRACE(NOT_COMPILED_IN))) { + /* Not implemented. Return success*/ + rc = 0; + } + else { + /* Error in callback register cmd. Don't register */ + wc_CryptoCb_ClearDev(dev); + } + } +#endif + return rc; } void wc_CryptoCb_UnRegisterDevice(int devId) { - CryptoCb* dev = wc_CryptoCb_GetDevice(devId); - if (dev) { - XMEMSET(dev, 0, sizeof(*dev)); - dev->devId = INVALID_DEVID; + CryptoCb* dev = NULL; + + /* Can't unregister the invalid device */ + if (devId == INVALID_DEVID) + return; + + /* Find the matching dev */ + dev = wc_CryptoCb_GetDevice(devId); + if (dev == NULL) + return; + +#ifdef WOLF_CRYPTO_CB_CMD + if (dev->cb != NULL) { + /* Invoke callback with unregister command.*/ + wc_CryptoInfo info; + XMEMSET(&info, 0, sizeof(info)); + info.algo_type = WC_ALGO_TYPE_NONE; + info.cmd.type = WC_CRYPTOCB_CMD_TYPE_UNREGISTER; + info.cmd.ctx = NULL; /* Not used */ + + /* Ignore errors here */ + dev->cb(devId, &info, dev->ctx); } +#endif + wc_CryptoCb_ClearDev(dev); } #ifndef NO_RSA int wc_CryptoCb_Rsa(const byte* in, word32 inLen, byte* out, word32* outLen, int type, RsaKey* key, WC_RNG* rng) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -309,7 +421,7 @@ #ifdef WOLFSSL_KEY_GEN int wc_CryptoCb_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -337,7 +449,7 @@ int wc_CryptoCb_RsaCheckPrivKey(RsaKey* key, const byte* pubKey, word32 pubKeySz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -362,7 +474,7 @@ int wc_CryptoCb_RsaGetSize(const RsaKey* key, int* keySize) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -388,7 +500,7 @@ #ifdef HAVE_ECC int wc_CryptoCb_MakeEccKey(WC_RNG* rng, int keySize, ecc_key* key, int curveId) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -415,7 +527,7 @@ int wc_CryptoCb_Ecdh(ecc_key* private_key, ecc_key* public_key, byte* out, word32* outlen) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (private_key == NULL) @@ -442,7 +554,7 @@ int wc_CryptoCb_EccSign(const byte* in, word32 inlen, byte* out, word32 *outlen, WC_RNG* rng, ecc_key* key) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -471,7 +583,7 @@ int wc_CryptoCb_EccVerify(const byte* sig, word32 siglen, const byte* hash, word32 hashlen, int* res, ecc_key* key) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -500,7 +612,7 @@ int wc_CryptoCb_EccCheckPrivKey(ecc_key* key, const byte* pubKey, word32 pubKeySz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -528,7 +640,7 @@ int wc_CryptoCb_Curve25519Gen(WC_RNG* rng, int keySize, curve25519_key* key) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -554,7 +666,7 @@ int wc_CryptoCb_Curve25519(curve25519_key* private_key, curve25519_key* public_key, byte* out, word32* outlen, int endian) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (private_key == NULL) @@ -584,7 +696,7 @@ int wc_CryptoCb_Ed25519Gen(WC_RNG* rng, int keySize, ed25519_key* key) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -611,7 +723,7 @@ word32 *outLen, ed25519_key* key, byte type, const byte* context, byte contextLen) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -643,7 +755,7 @@ const byte* msg, word32 msgLen, int* res, ed25519_key* key, byte type, const byte* context, byte contextLen) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (key == NULL) @@ -673,6 +785,289 @@ } #endif /* HAVE_ED25519 */ +#if defined(WOLFSSL_HAVE_KYBER) +int wc_CryptoCb_PqcKemGetDevId(int type, void* key) +{ + int devId = INVALID_DEVID; + + if (key == NULL) + return devId; + + /* get devId */ + if (type == WC_PQC_KEM_TYPE_KYBER) { + devId = ((KyberKey*) key)->devId; + } + + return devId; +} + +int wc_CryptoCb_MakePqcKemKey(WC_RNG* rng, int type, int keySize, void* key) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + int devId = INVALID_DEVID; + CryptoCb* dev; + + if (key == NULL) + return ret; + + /* get devId */ + devId = wc_CryptoCb_PqcKemGetDevId(type, key); + if (devId == INVALID_DEVID) + return ret; + + /* locate registered callback */ + dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK); + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_PK; + cryptoInfo.pk.type = WC_PK_TYPE_PQC_KEM_KEYGEN; + cryptoInfo.pk.pqc_kem_kg.rng = rng; + cryptoInfo.pk.pqc_kem_kg.size = keySize; + cryptoInfo.pk.pqc_kem_kg.key = key; + cryptoInfo.pk.pqc_kem_kg.type = type; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} + +int wc_CryptoCb_PqcEncapsulate(byte* ciphertext, word32 ciphertextLen, + byte* sharedSecret, word32 sharedSecretLen, WC_RNG* rng, int type, + void* key) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + int devId = INVALID_DEVID; + CryptoCb* dev; + + if (key == NULL) + return ret; + + /* get devId */ + devId = wc_CryptoCb_PqcKemGetDevId(type, key); + if (devId == INVALID_DEVID) + return ret; + + /* locate registered callback */ + dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK); + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_PK; + cryptoInfo.pk.type = WC_PK_TYPE_PQC_KEM_ENCAPS; + cryptoInfo.pk.pqc_encaps.ciphertext = ciphertext; + cryptoInfo.pk.pqc_encaps.ciphertextLen = ciphertextLen; + cryptoInfo.pk.pqc_encaps.sharedSecret = sharedSecret; + cryptoInfo.pk.pqc_encaps.sharedSecretLen = sharedSecretLen; + cryptoInfo.pk.pqc_encaps.rng = rng; + cryptoInfo.pk.pqc_encaps.key = key; + cryptoInfo.pk.pqc_encaps.type = type; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} + +int wc_CryptoCb_PqcDecapsulate(const byte* ciphertext, word32 ciphertextLen, + byte* sharedSecret, word32 sharedSecretLen, int type, void* key) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + int devId = INVALID_DEVID; + CryptoCb* dev; + + if (key == NULL) + return ret; + + /* get devId */ + devId = wc_CryptoCb_PqcKemGetDevId(type, key); + if (devId == INVALID_DEVID) + return ret; + + /* locate registered callback */ + dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK); + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_PK; + cryptoInfo.pk.type = WC_PK_TYPE_PQC_KEM_DECAPS; + cryptoInfo.pk.pqc_decaps.ciphertext = ciphertext; + cryptoInfo.pk.pqc_decaps.ciphertextLen = ciphertextLen; + cryptoInfo.pk.pqc_decaps.sharedSecret = sharedSecret; + cryptoInfo.pk.pqc_decaps.sharedSecretLen = sharedSecretLen; + cryptoInfo.pk.pqc_decaps.key = key; + cryptoInfo.pk.pqc_decaps.type = type; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} +#endif /* WOLFSSL_HAVE_KYBER */ + +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) +int wc_CryptoCb_PqcSigGetDevId(int type, void* key) +{ + int devId = INVALID_DEVID; + + if (key == NULL) + return devId; + + /* get devId */ +#if defined(HAVE_DILITHIUM) + if (type == WC_PQC_SIG_TYPE_DILITHIUM) { + devId = ((dilithium_key*) key)->devId; + } +#endif +#if defined(HAVE_FALCON) + if (type == WC_PQC_SIG_TYPE_FALCON) { + devId = ((falcon_key*) key)->devId; + } +#endif + + return devId; +} + +int wc_CryptoCb_MakePqcSignatureKey(WC_RNG* rng, int type, int keySize, + void* key) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + int devId = INVALID_DEVID; + CryptoCb* dev; + + if (key == NULL) + return ret; + + /* get devId */ + devId = wc_CryptoCb_PqcSigGetDevId(type, key); + if (devId == INVALID_DEVID) + return ret; + + /* locate registered callback */ + dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK); + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_PK; + cryptoInfo.pk.type = WC_PK_TYPE_PQC_SIG_KEYGEN; + cryptoInfo.pk.pqc_sig_kg.rng = rng; + cryptoInfo.pk.pqc_sig_kg.size = keySize; + cryptoInfo.pk.pqc_sig_kg.key = key; + cryptoInfo.pk.pqc_sig_kg.type = type; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} + +int wc_CryptoCb_PqcSign(const byte* in, word32 inlen, byte* out, word32 *outlen, + WC_RNG* rng, int type, void* key) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + int devId = INVALID_DEVID; + CryptoCb* dev; + + if (key == NULL) + return ret; + + /* get devId */ + devId = wc_CryptoCb_PqcSigGetDevId(type, key); + if (devId == INVALID_DEVID) + return ret; + + /* locate registered callback */ + dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK); + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_PK; + cryptoInfo.pk.type = WC_PK_TYPE_PQC_SIG_SIGN; + cryptoInfo.pk.pqc_sign.in = in; + cryptoInfo.pk.pqc_sign.inlen = inlen; + cryptoInfo.pk.pqc_sign.out = out; + cryptoInfo.pk.pqc_sign.outlen = outlen; + cryptoInfo.pk.pqc_sign.rng = rng; + cryptoInfo.pk.pqc_sign.key = key; + cryptoInfo.pk.pqc_sign.type = type; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} + +int wc_CryptoCb_PqcVerify(const byte* sig, word32 siglen, const byte* msg, + word32 msglen, int* res, int type, void* key) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + int devId = INVALID_DEVID; + CryptoCb* dev; + + if (key == NULL) + return ret; + + /* get devId */ + devId = wc_CryptoCb_PqcSigGetDevId(type, key); + if (devId == INVALID_DEVID) + return ret; + + /* locate registered callback */ + dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK); + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_PK; + cryptoInfo.pk.type = WC_PK_TYPE_PQC_SIG_VERIFY; + cryptoInfo.pk.pqc_verify.sig = sig; + cryptoInfo.pk.pqc_verify.siglen = siglen; + cryptoInfo.pk.pqc_verify.msg = msg; + cryptoInfo.pk.pqc_verify.msglen = msglen; + cryptoInfo.pk.pqc_verify.res = res; + cryptoInfo.pk.pqc_verify.key = key; + cryptoInfo.pk.pqc_verify.type = type; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} + +int wc_CryptoCb_PqcSignatureCheckPrivKey(void* key, int type, + const byte* pubKey, word32 pubKeySz) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + int devId = INVALID_DEVID; + CryptoCb* dev; + + if (key == NULL) + return ret; + + /* get devId */ + devId = wc_CryptoCb_PqcSigGetDevId(type, key); + if (devId == INVALID_DEVID) + return ret; + + /* locate registered callback */ + dev = wc_CryptoCb_FindDevice(devId, WC_ALGO_TYPE_PK); + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_PK; + cryptoInfo.pk.type = WC_PK_TYPE_PQC_SIG_CHECK_PRIV_KEY; + cryptoInfo.pk.pqc_sig_check.key = key; + cryptoInfo.pk.pqc_sig_check.pubKey = pubKey; + cryptoInfo.pk.pqc_sig_check.pubKeySz = pubKeySz; + cryptoInfo.pk.pqc_sig_check.type = type; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} +#endif /* HAVE_FALCON || HAVE_DILITHIUM */ + #ifndef NO_AES #ifdef HAVE_AESGCM int wc_CryptoCb_AesGcmEncrypt(Aes* aes, byte* out, @@ -681,7 +1076,7 @@ byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -722,7 +1117,7 @@ const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -765,7 +1160,7 @@ byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -806,7 +1201,7 @@ const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -846,7 +1241,7 @@ int wc_CryptoCb_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -878,7 +1273,7 @@ int wc_CryptoCb_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -911,7 +1306,7 @@ int wc_CryptoCb_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -944,7 +1339,7 @@ int wc_CryptoCb_AesEcbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -976,7 +1371,7 @@ int wc_CryptoCb_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1011,7 +1406,7 @@ int wc_CryptoCb_Des3Encrypt(Des3* des3, byte* out, const byte* in, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1043,7 +1438,7 @@ int wc_CryptoCb_Des3Decrypt(Des3* des3, byte* out, const byte* in, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1077,7 +1472,7 @@ int wc_CryptoCb_ShaHash(wc_Sha* sha, const byte* in, word32 inSz, byte* digest) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1110,7 +1505,7 @@ int wc_CryptoCb_Sha256Hash(wc_Sha256* sha256, const byte* in, word32 inSz, byte* digest) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1143,7 +1538,7 @@ int wc_CryptoCb_Sha384Hash(wc_Sha384* sha384, const byte* in, word32 inSz, byte* digest) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1179,7 +1574,7 @@ int wc_CryptoCb_Sha512Hash(wc_Sha512* sha512, const byte* in, word32 inSz, byte* digest) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1211,11 +1606,45 @@ } #endif /* WOLFSSL_SHA512 */ +#if defined(WOLFSSL_SHA3) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(6, 0)) +int wc_CryptoCb_Sha3Hash(wc_Sha3* sha3, int type, const byte* in, + word32 inSz, byte* digest) +{ + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); + CryptoCb* dev; + + /* locate registered callback */ + if (sha3) { + dev = wc_CryptoCb_FindDevice(sha3->devId, WC_ALGO_TYPE_HASH); + } + else + { + /* locate first callback and try using it */ + dev = wc_CryptoCb_FindDeviceByIndex(0); + } + + if (dev && dev->cb) { + wc_CryptoInfo cryptoInfo; + XMEMSET(&cryptoInfo, 0, sizeof(cryptoInfo)); + cryptoInfo.algo_type = WC_ALGO_TYPE_HASH; + cryptoInfo.hash.type = type; + cryptoInfo.hash.sha3 = sha3; + cryptoInfo.hash.in = in; + cryptoInfo.hash.inSz = inSz; + cryptoInfo.hash.digest = digest; + + ret = dev->cb(dev->devId, &cryptoInfo, dev->ctx); + } + + return wc_CryptoCb_TranslateErrorCode(ret); +} +#endif /* WOLFSSL_SHA3 && (!HAVE_FIPS || FIPS_VERSION_GE(6, 0)) */ + #ifndef NO_HMAC int wc_CryptoCb_Hmac(Hmac* hmac, int macType, const byte* in, word32 inSz, byte* digest) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; if (hmac == NULL) @@ -1243,7 +1672,7 @@ #ifndef WC_NO_RNG int wc_CryptoCb_RandomBlock(WC_RNG* rng, byte* out, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1271,7 +1700,7 @@ int wc_CryptoCb_RandomSeed(OS_Seed* os, byte* seed, word32 sz) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1295,7 +1724,7 @@ const byte* in, word32 inSz, byte* out, word32* outSz, int type, void* ctx) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); CryptoCb* dev; /* locate registered callback */ @@ -1337,8 +1766,13 @@ /* conditional macro selection based on build */ #ifdef WOLFSSL_CAAM_DEVID ret = WOLFSSL_CAAM_DEVID; +#elif defined(HAVE_ARIA) + ret = WOLFSSL_ARIA_DEVID; +#elif defined(WC_USE_DEVID) + ret = WC_USE_DEVID; #else - ret = INVALID_DEVID; + /* try first available */ + ret = wc_CryptoCb_GetDevIdAtIndex(0); #endif return ret; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/curve25519.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/curve25519.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/curve25519.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/curve25519.c 2024-08-03 07:30:00.000000000 +0000 @@ -51,6 +51,14 @@ #include #endif +#if defined(WOLFSSL_LINUXKM) && !defined(USE_INTEL_SPEEDUP) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif + const curve25519_set_type curve25519_sets[] = { { CURVE25519_KEYSIZE, @@ -58,7 +66,13 @@ } }; -static const unsigned char kCurve25519BasePoint[CURVE25519_KEYSIZE] = {9}; +static const word32 kCurve25519BasePoint[CURVE25519_KEYSIZE/sizeof(word32)] = { +#ifdef BIG_ENDIAN_ORDER + 0x09000000 +#else + 9 +#endif +}; /* Curve25519 private key must be less than order */ /* These functions clamp private k and check it */ @@ -133,7 +147,7 @@ SAVE_VECTOR_REGISTERS(return _svr_ret;); - ret = curve25519(pub, priv, kCurve25519BasePoint); + ret = curve25519(pub, priv, (byte*)kCurve25519BasePoint); RESTORE_VECTOR_REGISTERS(); #endif @@ -224,7 +238,7 @@ #ifdef WOLF_CRYPTO_CB if (key->devId != INVALID_DEVID) { ret = wc_CryptoCb_Curve25519Gen(rng, keysize, key); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -285,7 +299,7 @@ if (private_key->devId != INVALID_DEVID) { ret = wc_CryptoCb_Curve25519(private_key, public_key, out, outlen, endian); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -325,14 +339,11 @@ } } #endif - if (ret != 0) { - ForceZero(&o, sizeof(o)); - return ret; + if (ret == 0) { + curve25519_copy_point(out, o.point, endian); + *outlen = CURVE25519_KEYSIZE; } - curve25519_copy_point(out, o.point, endian); - *outlen = CURVE25519_KEYSIZE; - ForceZero(&o, sizeof(o)); return ret; @@ -372,7 +383,7 @@ (int)sizeof(key->k), key->k); key->pubSet = (ret == 0); } - /* export public point with endianess */ + /* export public point with endianness */ curve25519_copy_point(out, key->p.point, endian); *outLen = CURVE25519_KEYSIZE; @@ -410,7 +421,7 @@ return ECC_BAD_ARG_E; } - /* import public point with endianess */ + /* import public point with endianness */ curve25519_copy_point(key->p.point, in, endian); key->pubSet = 1; @@ -535,7 +546,7 @@ return ECC_BAD_ARG_E; } - /* export private scalar with endianess */ + /* export private scalar with endianness */ curve25519_copy_point(out, key->k, endian); *outLen = CURVE25519_KEYSIZE; @@ -632,7 +643,7 @@ se050_curve25519_free_key(key); #endif - /* import private scalar with endianess */ + /* import private scalar with endianness */ curve25519_copy_point(key->k, priv, endian); key->privSet = 1; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/des3.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/des3.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/des3.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/des3.c 2024-08-03 07:30:00.000000000 +0000 @@ -38,8 +38,8 @@ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$i") - #pragma const_seg(".fipsB$i") + #pragma code_seg(".fipsA$d") + #pragma const_seg(".fipsB$d") #endif #endif @@ -49,85 +49,6 @@ #include #endif -/* fips wrapper calls, user can call direct */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - - int wc_Des_SetKey(Des* des, const byte* key, const byte* iv, int dir) - { - return Des_SetKey(des, key, iv, dir); - } - int wc_Des3_SetKey(Des3* des, const byte* key, const byte* iv, int dir) - { - if (des == NULL || key == NULL || dir < 0) { - return BAD_FUNC_ARG; - } - - return Des3_SetKey_fips(des, key, iv, dir); - } - int wc_Des_CbcEncrypt(Des* des, byte* out, const byte* in, word32 sz) - { - return Des_CbcEncrypt(des, out, in, sz); - } - int wc_Des_CbcDecrypt(Des* des, byte* out, const byte* in, word32 sz) - { - return Des_CbcDecrypt(des, out, in, sz); - } - int wc_Des3_CbcEncrypt(Des3* des, byte* out, const byte* in, word32 sz) - { - if (des == NULL || out == NULL || in == NULL) { - return BAD_FUNC_ARG; - } - return Des3_CbcEncrypt_fips(des, out, in, sz); - } - int wc_Des3_CbcDecrypt(Des3* des, byte* out, const byte* in, word32 sz) - { - if (des == NULL || out == NULL || in == NULL) { - return BAD_FUNC_ARG; - } - return Des3_CbcDecrypt_fips(des, out, in, sz); - } - - #ifdef WOLFSSL_DES_ECB - /* One block, compatibility only */ - int wc_Des_EcbEncrypt(Des* des, byte* out, const byte* in, word32 sz) - { - return Des_EcbEncrypt(des, out, in, sz); - } - int wc_Des3_EcbEncrypt(Des3* des, byte* out, const byte* in, word32 sz) - { - return Des3_EcbEncrypt(des, out, in, sz); - } - #endif /* WOLFSSL_DES_ECB */ - - void wc_Des_SetIV(Des* des, const byte* iv) - { - Des_SetIV(des, iv); - } - int wc_Des3_SetIV(Des3* des, const byte* iv) - { - return Des3_SetIV_fips(des, iv); - } - - int wc_Des3Init(Des3* des3, void* heap, int devId) - { - (void)des3; - (void)heap; - (void)devId; - /* FIPS doesn't support: - return Des3Init(des3, heap, devId); */ - return 0; - } - void wc_Des3Free(Des3* des3) - { - (void)des3; - /* FIPS doesn't support: - Des3Free(des3); */ - } - -#else /* else build without fips, or for FIPS v2 */ - - #if defined(WOLFSSL_TI_CRYPT) #include #else @@ -517,7 +438,7 @@ #elif defined(HAVE_COLDFIRE_SEC) - #include + #include #include "sec.h" #include "mcf5475_sec.h" @@ -1681,7 +1602,7 @@ #ifdef WOLF_CRYPTO_CB if (des->devId != INVALID_DEVID) { int ret = wc_CryptoCb_Des3Encrypt(des, out, in, sz); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1695,7 +1616,7 @@ #elif defined(HAVE_INTEL_QA) return IntelQaSymDes3CbcEncrypt(&des->asyncDev, out, in, sz, (const byte*)des->devKey, DES3_KEYLEN, (byte*)des->reg, DES3_IVLEN); - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&des->asyncDev, ASYNC_SW_DES3_CBC_ENCRYPT)) { WC_ASYNC_SW* sw = &des->asyncDev.sw; sw->des.des = des; @@ -1732,7 +1653,7 @@ #ifdef WOLF_CRYPTO_CB if (des->devId != INVALID_DEVID) { int ret = wc_CryptoCb_Des3Decrypt(des, out, in, sz); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1746,7 +1667,7 @@ #elif defined(HAVE_INTEL_QA) return IntelQaSymDes3CbcDecrypt(&des->asyncDev, out, in, sz, (const byte*)des->devKey, DES3_KEYLEN, (byte*)des->reg, DES3_IVLEN); - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&des->asyncDev, ASYNC_SW_DES3_CBC_DECRYPT)) { WC_ASYNC_SW* sw = &des->asyncDev.sw; sw->des.des = des; @@ -1889,5 +1810,4 @@ } #endif /* WOLFSSL_TI_CRYPT */ -#endif /* HAVE_FIPS */ #endif /* NO_DES3 */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/dh.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dh.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/dh.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dh.c 2024-08-03 07:30:00.000000000 +0000 @@ -35,8 +35,8 @@ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$m") - #pragma const_seg(".fipsB$m") + #pragma code_seg(".fipsA$e") + #pragma const_seg(".fipsB$e") #endif #endif @@ -55,6 +55,22 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_dh_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000004 }; + int wolfCrypt_FIPS_DH_sanity(void) + { + return 0; + } +#endif + +#if defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_SP_ASM) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif /* Possible DH enable options: @@ -1021,7 +1037,7 @@ /* if not using fixed points use DiscreteLogWorkFactor function for unusual size otherwise round up on size needed */ #ifndef WOLFSSL_DH_CONST - #define WOLFSSL_DH_ROUND(x) + #define WOLFSSL_DH_ROUND(x) WC_DO_NOTHING #else #define WOLFSSL_DH_ROUND(x) \ do { \ @@ -1352,7 +1368,7 @@ *pubSz = (word32)mp_unsigned_bin_size(y); mp_clear(y); - mp_clear(x); + mp_forcezero(x); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XFREE(y, key->heap, DYNAMIC_TYPE_DH); XFREE(x, key->heap, DYNAMIC_TYPE_DH); @@ -1433,7 +1449,7 @@ #elif defined(HAVE_CAVIUM) /* TODO: Not implemented - use software for now */ -#else /* WOLFSSL_ASYNC_CRYPT_SW */ +#elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_DH_GEN)) { WC_ASYNC_SW* sw = &key->asyncDev.sw; sw->dhGen.key = key; @@ -2207,7 +2223,7 @@ #elif defined(HAVE_CAVIUM) /* TODO: Not implemented - use software for now */ -#else /* WOLFSSL_ASYNC_CRYPT_SW */ +#elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_DH_AGREE)) { WC_ASYNC_SW* sw = &key->asyncDev.sw; sw->dhAgree.key = key; @@ -2886,6 +2902,11 @@ ret = 0; unsigned char *buf = NULL; +#if !defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_NO_MALLOC) + XMEMSET(tmp, 0, sizeof(tmp)); + XMEMSET(tmp2, 0, sizeof(tmp2)); +#endif + if (rng == NULL || dh == NULL) ret = BAD_FUNC_ARG; @@ -2919,6 +2940,14 @@ if (ret == 0) { /* modulus size in bytes */ modSz /= WOLFSSL_BIT_SIZE; + + if ((word32)modSz < groupSz) { + WOLFSSL_MSG("DH modSz was too small"); + ret = BAD_FUNC_ARG; + } + } + + if (ret == 0) { bufSz = (word32)modSz - groupSz; /* allocate ram */ @@ -2934,9 +2963,22 @@ #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if (ret == 0) { - if (((tmp = (mp_int *)XMALLOC(sizeof(*tmp), NULL, DYNAMIC_TYPE_WOLF_BIGINT)) == NULL) || - ((tmp2 = (mp_int *)XMALLOC(sizeof(*tmp2), NULL, DYNAMIC_TYPE_WOLF_BIGINT)) == NULL)) + if ((tmp = (mp_int *)XMALLOC(sizeof(*tmp), NULL, + DYNAMIC_TYPE_WOLF_BIGINT)) == NULL) { ret = MEMORY_E; + } + else { + XMEMSET(tmp, 0, sizeof(*tmp)); + } + } + if (ret == 0) { + if ((tmp2 = (mp_int *)XMALLOC(sizeof(*tmp2), NULL, + DYNAMIC_TYPE_WOLF_BIGINT)) == NULL) { + ret = MEMORY_E; + } + else { + XMEMSET(tmp2, 0, sizeof(*tmp2)); + } } #endif @@ -2985,7 +3027,7 @@ /* loop until p is prime */ if (ret == 0) { - do { + for (;;) { if (mp_prime_is_prime_ex(&dh->p, 8, &primeCheck, rng) != MP_OKAY) ret = PRIME_GEN_E; @@ -2996,7 +3038,14 @@ else primeCheckCount++; } - } while (ret == 0 && primeCheck == MP_NO); + + if (ret != 0 || primeCheck == MP_YES) + break; + + /* linuxkm: release the kernel for a moment before iterating. */ + RESTORE_VECTOR_REGISTERS(); + SAVE_VECTOR_REGISTERS(ret = _svr_ret; break;); + }; } /* tmp2 += (2*loop_check_prime) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/dilithium.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dilithium.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/dilithium.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dilithium.c 2024-08-03 07:30:00.000000000 +0000 @@ -19,7 +19,97 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -/* Based on ed448.c and Reworked for Dilithium by Anthony Hu. */ +/* Based on ed448.c and Reworked for Dilithium by Anthony Hu. + * WolfSSL implementation by Sean Parkinson. + */ + +/* Possible Dilithium/ML-DSA options: + * + * HAVE_DILITHIUM Default: OFF + * Enables the code in this file to be compiled. + * WOLFSSL_WC_DILITHIUM Default: OFF + * Compiles the wolfSSL implementation of dilithium. + * + * WOLFSSL_NO_ML_DSA_44 Default: OFF + * Does not compile in parameter set ML-DSA-44 and any code specific to that + * parameter set. + * WOLFSSL_NO_ML_DSA_65 Default: OFF + * Does not compile in parameter set ML-DSA-65 and any code specific to that + * parameter set. + * WOLFSSL_NO_ML_DSA_87 Default: OFF + * Does not compile in parameter set ML-DSA-87 and any code specific to that + * parameter set. + * + * WOLFSSL_DILITHIUM_NO_LARGE_CODE Default: OFF + * Compiles smaller, fast code with speed trade-off. + * WOLFSSL_DILITHIUM_SMALL Default: OFF + * Compiles to small code size with a speed trade-off. + * WOLFSSL_DILITHIUM_VERIFY_ONLY Default: OFF + * Compiles in only the verification and public key operations. + * WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM Default: OFF + * Compiles verification implementation that uses smaller amounts of memory. + * WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC Default: OFF + * Only works with WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM. + * Don't allocate memory with XMALLOC. Memory is pinned against key. + * WOLFSSL_DILITHIUM_ASSIGN_KEY Default: OFF + * Key data is assigned into Dilithium key rather than copied. + * Life of key data passed in is tightly coupled to life of Dilithium key. + * Cannot be used when make key is enabled. + * WOLFSSL_DILITHIUM_SIGN_SMALL_MEM Default: OFF + * Compiles signature implementation that uses smaller amounts of memory but + * is considerably slower. + * + * WOLFSSL_DILITHIUM_ALIGNMENT Default: 8 + * Use to indicate whether loading and storing of words needs to be aligned. + * Default is to use WOLFSSL_GENERAL_ALIGNMENT - should be 4 on some ARM CPUs. + * Set this value explicitly if specific Dilithium implementation alignment is + * needed. + * + * WOLFSSL_DILITHIUM_NO_ASN1 Default: OFF + * Disables any ASN.1 encoding or decoding code. + * + * WC_DILITHIUM_CACHE_MATRIX_A Default: OFF + * Enable caching of the A matrix on import. + * Less work is required in sign and verify operations. + * WC_DILITHIUM_CACHE_PRIV_VECTORS Default: OFF + * Enable caching of private key vectors on import. + * Enables WC_DILITHIUM_CACHE_MATRIX_A. + * Less work is required in sign operations. + * WC_DILITHIUM_CACHE_PUB_VECTORS Default: OFF + * Enable caching of public key vectors on import. + * Enables WC_DILITHIUM_CACHE_MATRIX_A. + * Less work is required in sign operations. + * + * WOLFSSL_DILITHIUM_SIGN_CHECK_Y Default: OFF + * Check vector y is in required range as an early check on valid vector z. + * Falsely reports invalid in approximately 1-2% of checks. + * All valid reports are true. + * Fast fail gives faster signing times on average. + * DO NOT enable this if implementation must be conformant to FIPS 204. + * WOLFSSL_DILITHIUM_SIGN_CHECK_W0 Default: OFF + * Check vector w0 is in required range as an early check on valid vector r0. + * Falsely reports invalid in approximately 3-5% of checks. + * All valid reports are true. + * Fast fail gives faster signing times on average. + * DO NOT enable this if implementation must be conformant to FIPS 204. + * + * DILITHIUM_MUL_SLOW Default: OFF + * Define when multiplying by Q / 44 is slower than masking. + * Only applies to ML-DSA-44. + * DILITHIUM_MUL_44_SLOW Default: OFF + * Define when multiplying by 44 is slower than by 11. + * Only applies to ML-DSA-44. + * DILITHIUM_MUL_11_SLOW Default: OFF + * Define when multiplying by 11 is slower than adding and shifting. + * Only applies to ML-DSA-44. + * DILITHIUM_MUL_QINV_SLOW Default: OFF + * Define when multiplying by QINV 0x3802001 is slower than add, subtract and + * shift equivalent. + * DILITHIUM_MUL_Q_SLOW Default: OFF + * Define when multiplying by Q 0x7fe001 is slower than add, subtract and + * shift equivalent. + */ + #ifdef HAVE_CONFIG_H #include @@ -28,15 +118,18 @@ /* in case user set HAVE_PQC there */ #include +#ifndef WOLFSSL_DILITHIUM_NO_ASN1 #include +#endif -#if defined(HAVE_PQC) && defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) #ifdef HAVE_LIBOQS #include #endif #include +#include #include #ifdef NO_INLINE #include @@ -45,883 +138,8004 @@ #include #endif -/* Sign the message using the dilithium private key. +#ifdef WOLFSSL_WC_DILITHIUM + +#ifdef DEBUG_DILITHIUM +void print_polys(const char* name, const sword32* a, int d1, int d2); +void print_polys(const char* name, const sword32* a, int d1, int d2) +{ + int i; + int j; + int k; + + fprintf(stderr, "%s\n", name); + for (i = 0; i < d1; i++) { + for (j = 0; j < d2; j++) { + for (k = 0; k < 256; k++) { + fprintf(stderr, "%9d,", a[(i*d2*256) + (j*256) + k]); + if ((k % 8) == 7) fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); + } + } +} + +void print_data(const char* name, const byte* d, int len); +void print_data(const char* name, const byte* d, int len) +{ + int i; + + fprintf(stderr, "%s\n", name); + for (i = 0; i < len; i++) { + fprintf(stderr, "0x%02x,", d[i]); + if ((i % 16) == 15) fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); +} +#endif + +#if defined(WOLFSSL_NO_ML_DSA_44) && defined(WOLFSSL_NO_ML_DSA_65) && \ + defined(WOLFSSL_NO_ML_DSA_87) + #error "No Dilithium parameters chosen" +#endif + +#if defined(WOLFSSL_DILITHIUM_ASSIGN_KEY) && \ + !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) + #error "Cannot use assign key when making keys" +#endif + + +/* Number of bytes from first block to use for sign. */ +#define DILITHIUM_SIGN_BYTES 8 + + +/* Length of seed in bytes when generating y. */ +#define DILITHIUM_Y_SEED_SZ (DILITHIUM_PRIV_RAND_SEED_SZ + 2) + + +/* Length of seed in bytes used in generating matrix a. */ +#define DILITHIUM_GEN_A_SEED_SZ (DILITHIUM_PUB_SEED_SZ + 2) +/* Length of seed in bytes used in generating vectors s1 and s2. */ +#define DILITHIUM_GEN_S_SEED_SZ (DILITHIUM_PRIV_SEED_SZ + 2) + + +/* MAX: (256 * 8 / (17 + 1)) = 576, or ((256 * 8 / (19 + 1)) = 640 + * but need blocks of 17 * 8 bytes: 5 * 17 * 8 = 680 */ +#define DILITHIUM_MAX_V_BLOCKS 5 +/* Maximum number of bytes to generate into v to make y. */ +#define DILITHIUM_MAX_V (DILITHIUM_MAX_V_BLOCKS * 8 * 17) + + +/* 2 blocks, each block 136 bytes = 272 bytes. + * ETA 2: Min req is 128 but reject rate is 2 in 16 so we need 146.3 on average. + * ETA 4: Min req is 128 but reject rate is 7 in 16 so we need 227.6 on average. + */ +#define DILITHIUM_GEN_S_NBLOCKS 2 +/* Number of bytes to generate with SHAKE-256 when generating s1 and s2. */ +#define DILITHIUM_GEN_S_BYTES \ + (DILITHIUM_GEN_S_NBLOCKS * WC_SHA3_256_COUNT * 8) +/* Number of bytes to a block of SHAKE-256 when generating s1 and s2. */ +#define DILITHIUM_GEN_S_BLOCK_BYTES (WC_SHA3_256_COUNT * 8) + + +/* The ML-DSA parameters sets. */ +static const wc_dilithium_params dilithium_params[] = { +#ifndef WOLFSSL_NO_ML_DSA_44 + { WC_ML_DSA_44, PARAMS_ML_DSA_44_K, PARAMS_ML_DSA_44_L, + PARAMS_ML_DSA_44_ETA, PARAMS_ML_DSA_44_ETA_BITS, + PARAMS_ML_DSA_44_TAU, PARAMS_ML_DSA_44_BETA, PARAMS_ML_DSA_44_OMEGA, + PARAMS_ML_DSA_44_LAMBDA, + PARAMS_ML_DSA_44_GAMMA1_BITS, PARAMS_ML_DSA_44_GAMMA2, + PARAMS_ML_DSA_44_W1_ENC_SZ, PARAMS_ML_DSA_44_A_SIZE, + PARAMS_ML_DSA_44_S1_SIZE, PARAMS_ML_DSA_44_S1_ENC_SIZE, + PARAMS_ML_DSA_44_S2_SIZE, PARAMS_ML_DSA_44_S2_ENC_SIZE, + PARAMS_ML_DSA_44_Z_ENC_SIZE, + PARAMS_ML_DSA_44_PK_SIZE, PARAMS_ML_DSA_44_SIG_SIZE }, +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + { WC_ML_DSA_65, PARAMS_ML_DSA_65_K, PARAMS_ML_DSA_65_L, + PARAMS_ML_DSA_65_ETA, PARAMS_ML_DSA_65_ETA_BITS, + PARAMS_ML_DSA_65_TAU, PARAMS_ML_DSA_65_BETA, PARAMS_ML_DSA_65_OMEGA, + PARAMS_ML_DSA_65_LAMBDA, + PARAMS_ML_DSA_65_GAMMA1_BITS, PARAMS_ML_DSA_65_GAMMA2, + PARAMS_ML_DSA_65_W1_ENC_SZ, PARAMS_ML_DSA_65_A_SIZE, + PARAMS_ML_DSA_65_S1_SIZE, PARAMS_ML_DSA_65_S1_ENC_SIZE, + PARAMS_ML_DSA_65_S2_SIZE, PARAMS_ML_DSA_65_S2_ENC_SIZE, + PARAMS_ML_DSA_65_Z_ENC_SIZE, + PARAMS_ML_DSA_65_PK_SIZE, PARAMS_ML_DSA_65_SIG_SIZE }, +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 + { WC_ML_DSA_87, PARAMS_ML_DSA_87_K, PARAMS_ML_DSA_87_L, + PARAMS_ML_DSA_87_ETA, PARAMS_ML_DSA_87_ETA_BITS, + PARAMS_ML_DSA_87_TAU, PARAMS_ML_DSA_87_BETA, PARAMS_ML_DSA_87_OMEGA, + PARAMS_ML_DSA_87_LAMBDA, + PARAMS_ML_DSA_87_GAMMA1_BITS, PARAMS_ML_DSA_87_GAMMA2, + PARAMS_ML_DSA_87_W1_ENC_SZ, PARAMS_ML_DSA_87_A_SIZE, + PARAMS_ML_DSA_87_S1_SIZE, PARAMS_ML_DSA_87_S1_ENC_SIZE, + PARAMS_ML_DSA_87_S2_SIZE, PARAMS_ML_DSA_87_S2_ENC_SIZE, + PARAMS_ML_DSA_87_Z_ENC_SIZE, + PARAMS_ML_DSA_87_PK_SIZE, PARAMS_ML_DSA_87_SIG_SIZE }, +#endif +}; +/* Number of ML-DSA parameter sets compiled in. */ +#define DILITHIUM_PARAMS_CNT \ + ((unsigned int)(sizeof(dilithium_params) / sizeof(wc_dilithium_params))) + +/* Get the ML-DSA parameters that match the level. * - * in [in] Message to sign. - * inLen [in] Length of the message in bytes. - * out [in] Buffer to write signature into. - * outLen [in/out] On in, size of buffer. - * On out, the length of the signature in bytes. - * key [in] Dilithium key to use when signing - * returns BAD_FUNC_ARG when a parameter is NULL or public key not set, - * BUFFER_E when outLen is less than DILITHIUM_LEVEL2_SIG_SIZE, - * 0 otherwise. + * @param [in] level Level required. + * @param [out] params Parameter set. + * @return 0 on success. + * @return NOT_COMPILED_IN when parameters at level are not compiled in. */ -int wc_dilithium_sign_msg(const byte* in, word32 inLen, - byte* out, word32 *outLen, - dilithium_key* key) +static int dilithium_get_params(int level, const wc_dilithium_params** params) { - int ret = 0; -#ifdef HAVE_LIBOQS - OQS_SIG *oqssig = NULL; - size_t localOutLen = 0; + unsigned int i; + int ret = NOT_COMPILED_IN; - /* sanity check on arguments */ - if ((in == NULL) || (out == NULL) || (outLen == NULL) || (key == NULL)) { - ret = BAD_FUNC_ARG; + for (i = 0; i < DILITHIUM_PARAMS_CNT; i++) { + if (dilithium_params[i].level == level) { + *params = &dilithium_params[i]; + ret = 0; + } } - if ((ret == 0) && (!key->prvKeySet)) { - ret = BAD_FUNC_ARG; + return ret; +} + +/****************************************************************************** + * Hash operations + ******************************************************************************/ + +/* 256-bit hash using SHAKE-256. + * + * FIPS 204. 8.3: H(v,d) <- SHAKE256(v,d) + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [in] data Buffer holding data to hash. + * @param [in] dataLen Length of data to hash in bytes. + * @param [out] hash Buffer to hold hash result. + * @param [in] hashLen Number of bytes of hash to return. + * @return 0 on success. + * @return Negative on error. + */ +static int dilithium_shake256(wc_Shake* shake256, const byte* data, + word32 dataLen, byte* hash, word32 hashLen) +{ + int ret; + + /* Initialize SHAKE-256 operation. */ + ret = wc_InitShake256(shake256, NULL, INVALID_DEVID); + if (ret == 0) { + /* Update with data. */ + ret = wc_Shake256_Update(shake256, data, dataLen); } + if (ret == 0) { + /* Compute hash of data. */ + ret = wc_Shake256_Final(shake256, hash, hashLen); + } + + return ret; +} + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) +/* 256-bit hash using SHAKE-256. + * + * FIPS 204. 8.3: H(v,d) <- SHAKE256(v,d) + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [in] data1 First block of data to hash. + * @param [in] data1Len Length of first block in bytes. + * @param [in] data2 Second block of data to hash. + * @param [in] data2Len Length of second block in bytes. + * @param [out] hash Buffer to hold hash result. + * @param [in] hashLen Number of bytes of hash to return. + * @return 0 on success. + * @return Negative on error. + */ +static int dilithium_hash256(wc_Shake* shake256, const byte* data1, + word32 data1Len, const byte* data2, word32 data2Len, byte* hash, + word32 hashLen) +{ + int ret; + /* Initialize SHAKE-256 operation. */ + ret = wc_InitShake256(shake256, NULL, INVALID_DEVID); if (ret == 0) { - if (key->level == 2) { - oqssig = OQS_SIG_new(OQS_SIG_alg_dilithium_2); + /* Update with first data. */ + ret = wc_Shake256_Update(shake256, data1, data1Len); + } + if (ret == 0) { + /* Update with second data. */ + ret = wc_Shake256_Update(shake256, data2, data2Len); + } + if (ret == 0) { + /* Compute hash of data. */ + ret = wc_Shake256_Final(shake256, hash, hashLen); + } + + return ret; +} +#endif + +#ifndef WOLFSSL_DILITHIUM_SMALL +/* 128-bit hash using SHAKE-128. + * + * FIPS 204. 8.3: H128(v,d) <- SHAKE128(v,d) + * + * @param [in, out] shake128 SHAKE-128 object. + * @param [in] in Block of data to hash. + * @param [in] inLen Length of data in bytes. + * @param [out] out Buffer to hold hash result. + * @param [in] outLen Number of hash blocks to return. + * @return 0 on success. + * @return Negative on error. + */ +static int dilithium_squeeze128(wc_Shake* shake128, const byte* in, + word32 inLen, byte* out, word32 outBlocks) +{ + int ret; + + /* Initialize SHAKE-128 operation. */ + ret = wc_InitShake128(shake128, NULL, INVALID_DEVID); + if (ret == 0) { + /* Absorb data - update plus final. */ + ret = wc_Shake128_Absorb(shake128, in, inLen); + } + if (ret == 0) { + /* Squeeze out hash data. */ + ret = wc_Shake128_SqueezeBlocks(shake128, out, outBlocks); + } + + return ret; +} +#endif /* WOLFSSL_DILITHIUM_SMALL */ + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || \ + (!defined(WOLFSSL_DILITHIUM_SMALL) && \ + !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY)) +/* 256-bit hash using SHAKE-256. + * + * FIPS 204. 8.3: H(v,d) <- SHAKE256(v,d) + * Using SqueezeBlocks interface to get larger amounts of output. + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [in] in Block of data to hash. + * @param [in] inLen Length of data in bytes. + * @param [out] out Buffer to hold hash result. + * @param [in] outLen Number of hash blocks to return. + * @return 0 on success. + * @return Negative on hash error. + */ +static int dilithium_squeeze256(wc_Shake* shake256, const byte* in, + word32 inLen, byte* out, word32 outBlocks) +{ + int ret; + + /* Initialize SHAKE-256 operation. */ + ret = wc_InitShake256(shake256, NULL, INVALID_DEVID); + if (ret == 0) { + /* Absorb data - update plus final. */ + ret = wc_Shake256_Absorb(shake256, in, inLen); + } + if (ret == 0) { + /* Squeeze out hash data. */ + ret = wc_Shake256_SqueezeBlocks(shake256, out, outBlocks); + } + + return ret; +} +#endif + +/****************************************************************************** + * Encode/Decode operations + ******************************************************************************/ + +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY +/* Encode vector of polynomials with range -ETA..ETA. + * + * FIPS 204. 8.2: Algorithm 18 skEncode(rho, K, tr, s1, s2, t0) + * ... + * 2: for i from 0 to l - 1 do + * 3: sk <- sk || BitPack(s1[i], eta, eta) + * 4: end for + * ... + * OR + * ... + * 5: for i from 0 to k - 1 do + * 6: sk <- sk || BitPack(s2[i], eta, eta) + * 7: end for + * ... + * + * FIPS 204. 8.2: Algorithm 11 BitPack(w, a, b) + * 1: z <- () + * 2: for i from 0 to 255 do + * 3: z <- z||IntegerToBits(b - wi, bitlen(a + b)) + * 4: end for + * 5: return BitsToBytes(z) + * + * IntegerToBits makes bit array with width specified from integer. + * BitToBytes make a byte array from a bit array. + * + * @param [in] s Vector of polynomials to encode. + * @param [in] d Dimension of vector. + * @param [in] eta Range specifier of each value. + * @param [out] p Buffer to encode into. + */ +static void dilthium_vec_encode_eta_bits(const sword32* s, byte d, byte eta, + byte* p) +{ + unsigned int i; + unsigned int j; + +#if !defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_NO_ML_DSA_87) + /* -2..2 */ + if (eta == DILITHIUM_ETA_2) { + /* Setp 2 or 5: For each polynomial of vector. */ + for (i = 0; i < d; i++) { + /* Step 3 or 6. + * 3 bits to encode each number. + * 8 numbers become 3 bytes. (8 * 3 bits = 3 * 8 bits) */ + for (j = 0; j < DILITHIUM_N; j += 8) { + /* Make value a positive integer. */ + byte s0 = 2 - s[j + 0]; + byte s1 = 2 - s[j + 1]; + byte s2 = 2 - s[j + 2]; + byte s3 = 2 - s[j + 3]; + byte s4 = 2 - s[j + 4]; + byte s5 = 2 - s[j + 5]; + byte s6 = 2 - s[j + 6]; + byte s7 = 2 - s[j + 7]; + + /* Pack 8 3-bit values into 3 bytes. */ + p[0] = (s0 >> 0) | (s1 << 3) | (s2 << 6); + p[1] = (s2 >> 2) | (s3 << 1) | (s4 << 4) | (s5 << 7); + p[2] = (s5 >> 1) | (s6 << 2) | (s7 << 5); + /* Move to next place to encode into. */ + p += DILITHIUM_ETA_2_BITS; + } + /* Next polynomial. */ + s += DILITHIUM_N; } - else if (key->level == 3) { - oqssig = OQS_SIG_new(OQS_SIG_alg_dilithium_3); + } + else +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + /* -4..4 */ + if (eta == DILITHIUM_ETA_4) { + for (i = 0; i < d; i++) { + #ifdef WOLFSSL_DILITHIUM_SMALL + /* Step 3 or 6. + * 4 bits to encode each number. + * 2 numbers become 1 bytes. (2 * 4 bits = 1 * 8 bits) */ + for (j = 0; j < DILITHIUM_N / 2; j++) { + /* Make values positive and pack 2 4-bit values into 1 byte. */ + p[j] = (((byte)(4 - s[j * 2 + 0])) << 0) | + (((byte)(4 - s[j * 2 + 1])) << 4); + } + #else + /* Step 3 or 6. + * 4 bits to encode each number. + * 8 numbers become 4 bytes. (8 * 4 bits = 4 * 8 bits) */ + for (j = 0; j < DILITHIUM_N / 2; j += 4) { + /* Make values positive and pack 2 4-bit values into 1 byte. */ + p[j + 0] = (((byte)(4 - s[j * 2 + 0])) << 0) | + (((byte)(4 - s[j * 2 + 1])) << 4); + p[j + 1] = (((byte)(4 - s[j * 2 + 2])) << 0) | + (((byte)(4 - s[j * 2 + 3])) << 4); + p[j + 2] = (((byte)(4 - s[j * 2 + 4])) << 0) | + (((byte)(4 - s[j * 2 + 5])) << 4); + p[j + 3] = (((byte)(4 - s[j * 2 + 6])) << 0) | + (((byte)(4 - s[j * 2 + 7])) << 4); + } + #endif + /* Move to next place to encode into. */ + p += DILITHIUM_N / 2; + /* Next polynomial. */ + s += DILITHIUM_N; } - else if (key->level == 5) { - oqssig = OQS_SIG_new(OQS_SIG_alg_dilithium_5); + } + else +#endif + { + } +} +#endif /* !WOLFSSL_DILITHIUM_NO_MAKE_KEY */ + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || defined(WOLFSSL_DILITHIUM_CHECK_KEY) + +#if !defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_NO_ML_DSA_87) +/* Decode polynomial with range -2..2. + * + * FIPS 204. 8.2: Algorithm 19 skDecode(sk) + * ... + * 5: for i from 0 to l - 1 do + * 6: s1[i] <- BitUnpack(yi, eta, eta) + * 7: end for + * ... + * OR + * ... + * 8: for i from 0 to k - 1 do + * 9: s2[i] <- BitUnpack(zi, eta, eta) + * 10: end for + * ... + * Where y and z are arrays of bit arrays. + * + * @param [in] p Buffer of data to decode. + * @param [in] s Vector of decoded polynomials. + */ +static void dilithium_decode_eta_2_bits(const byte* p, sword32* s) +{ + unsigned int j; + + /* Step 6 or 9. + * 3 bits to encode each number. + * 8 numbers from 3 bytes. (8 * 3 bits = 3 * 8 bits) */ + for (j = 0; j < DILITHIUM_N; j += 8) { + /* Get 3 bits and put in range of -2..2. */ + s[j + 0] = 2 - ((p[0] >> 0) & 0x7 ); + s[j + 1] = 2 - ((p[0] >> 3) & 0x7 ); + s[j + 2] = 2 - ((p[0] >> 6) | ((p[1] << 2) & 0x7)); + s[j + 3] = 2 - ((p[1] >> 1) & 0x7 ); + s[j + 4] = 2 - ((p[1] >> 4) & 0x7 ); + s[j + 5] = 2 - ((p[1] >> 7) | ((p[2] << 1) & 0x7)); + s[j + 6] = 2 - ((p[2] >> 2) & 0x7 ); + s[j + 7] = 2 - ((p[2] >> 5) & 0x7 ); + /* Move to next place to decode from. */ + p += DILITHIUM_ETA_2_BITS; + } +} +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 +/* Decode polynomial with range -4..4. + * + * FIPS 204. 8.2: Algorithm 19 skDecode(sk) + * ... + * 5: for i from 0 to l - 1 do + * 6: s1[i] <- BitUnpack(yi, eta, eta) + * 7: end for + * ... + * OR + * ... + * 8: for i from 0 to k - 1 do + * 9: s2[i] <- BitUnpack(zi, eta, eta) + * 10: end for + * ... + * Where y and z are arrays of bit arrays. + * + * @param [in] p Buffer of data to decode. + * @param [in] s Vector of decoded polynomials. + */ +static void dilithium_decode_eta_4_bits(const byte* p, sword32* s) +{ + unsigned int j; + +#ifdef WOLFSSL_DILITHIUM_SMALL + /* Step 6 or 9. + * 4 bits to encode each number. + * 2 numbers from 1 bytes. (2 * 4 bits = 1 * 8 bits) */ + for (j = 0; j < DILITHIUM_N / 2; j++) { + /* Get 4 bits and put in range of -4..4. */ + s[j * 2 + 0] = 4 - (p[j] & 0xf); + s[j * 2 + 1] = 4 - (p[j] >> 4); + } +#else + /* Step 6 or 9. + * 4 bits to encode each number. + * 8 numbers from 4 bytes. (8 * 4 bits = 4 * 8 bits) */ + for (j = 0; j < DILITHIUM_N / 2; j += 4) { + /* Get 4 bits and put in range of -4..4. */ + s[j * 2 + 0] = 4 - (p[j + 0] & 0xf); + s[j * 2 + 1] = 4 - (p[j + 0] >> 4); + s[j * 2 + 2] = 4 - (p[j + 1] & 0xf); + s[j * 2 + 3] = 4 - (p[j + 1] >> 4); + s[j * 2 + 4] = 4 - (p[j + 2] & 0xf); + s[j * 2 + 5] = 4 - (p[j + 2] >> 4); + s[j * 2 + 6] = 4 - (p[j + 3] & 0xf); + s[j * 2 + 7] = 4 - (p[j + 3] >> 4); + } +#endif /* WOLFSSL_DILITHIUM_SMALL */ +} +#endif + +#if defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + (defined(WC_DILITHIUM_CACHE_PRIV_VECTORS) || \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM))) +/* Decode vector of polynomials with range -ETA..ETA. + * + * FIPS 204. 8.2: Algorithm 19 skDecode(sk) + * ... + * 5: for i from 0 to l - 1 do + * 6: s1[i] <- BitUnpack(yi, eta, eta) + * 7: end for + * ... + * OR + * ... + * 8: for i from 0 to k - 1 do + * 9: s2[i] <- BitUnpack(zi, eta, eta) + * 10: end for + * ... + * Where y and z are arrays of bit arrays. + * + * @param [in] p Buffer of data to decode. + * @param [in] eta Range specifier of each value. + * @param [in] s Vector of decoded polynomials. + * @param [in] d Dimension of vector. + */ +static void dilithium_vec_decode_eta_bits(const byte* p, byte eta, sword32* s, + byte d) +{ + unsigned int i; + +#if !defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_NO_ML_DSA_87) + /* -2..2 */ + if (eta == DILITHIUM_ETA_2) { + /* Step 5 or 8: For each polynomial of vector */ + for (i = 0; i < d; i++) { + dilithium_decode_eta_2_bits(p, s); + /* Move to next place to decode from. */ + p += DILITHIUM_ETA_2_BITS * DILITHIUM_N / 8; + /* Next polynomial. */ + s += DILITHIUM_N; } - else { - ret = SIG_TYPE_E; + } + else +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + /* -4..4 */ + if (eta == DILITHIUM_ETA_4) { + /* Step 5 or 8: For each polynomial of vector */ + for (i = 0; i < d; i++) { + dilithium_decode_eta_4_bits(p, s); + /* Move to next place to decode from. */ + p += DILITHIUM_N / 2; + /* Next polynomial. */ + s += DILITHIUM_N; } } + else +#endif + { + } +} +#endif +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN || WOLFSSL_DILITHIUM_CHECK_KEY */ - /* check and set up out length */ - if (ret == 0) { - if ((key->level == 2) && (*outLen < DILITHIUM_LEVEL2_SIG_SIZE)) { - *outLen = DILITHIUM_LEVEL2_SIG_SIZE; - ret = BUFFER_E; +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY +/* Encode t into t0 and t1. + * + * FIPS 204. 8.4: Algorithm 29 Power2Round(r) + * 1: r+ <- r mod q + * 2: r0 <- r+ mod +/- 2^d + * 3: return ((r+ - r0) / 2^d, r0) + * + * FIPS 204. 8.2: Algorithm 18 skEncode(rho, K, tr, s1, s2, t0) + * ... + * 8: for i form 0 to k - 1 do + * 9: sk <- sk || BitPack(t0[i], s^(d-1) - 1, 2^(d-1)) + * 10: end for + * + * FIPS 204. 8.2: Algorithm 16 pkEncode(rho, t1) + * ... + * 2: for i from 0 to k - 1 do + * 3: pk <- pk || SimpleBitPack(t1[i], 2^bitlen(q-1) - d - 1) + * 4: end for + * + * @param [in] t Vector of polynomials. + * @param [in] d Dimension of vector. + * @param [out] t0 Buffer to encode bottom part of value of t into. + * @param [out] t1 Buffer to encode top part of value of t into. + */ +static void dilithium_vec_encode_t0_t1(sword32* t, byte d, byte* t0, byte* t1) +{ + unsigned int i; + unsigned int j; + + /* Alg 18, Step 8 and Alg 16, Step 2. For each polynomial of vector. */ + for (i = 0; i < d; i++) { + /* Alg 18, Step 9 and Alg 16, Step 3. + * Do all polynomial values - 8 at a time. */ + for (j = 0; j < DILITHIUM_N; j += 8) { + /* Take 8 values of t and take top bits and make positive. */ + word16 n1_0 = (t[j + 0] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + word16 n1_1 = (t[j + 1] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + word16 n1_2 = (t[j + 2] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + word16 n1_3 = (t[j + 3] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + word16 n1_4 = (t[j + 4] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + word16 n1_5 = (t[j + 5] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + word16 n1_6 = (t[j + 6] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + word16 n1_7 = (t[j + 7] + DILITHIUM_D_MAX_HALF - 1) >> DILITHIUM_D; + /* Take 8 values of t and take bottom bits and make positive. */ + word16 n0_0 = DILITHIUM_D_MAX_HALF - + (t[j + 0] - (n1_0 << DILITHIUM_D)); + word16 n0_1 = DILITHIUM_D_MAX_HALF - + (t[j + 1] - (n1_1 << DILITHIUM_D)); + word16 n0_2 = DILITHIUM_D_MAX_HALF - + (t[j + 2] - (n1_2 << DILITHIUM_D)); + word16 n0_3 = DILITHIUM_D_MAX_HALF - + (t[j + 3] - (n1_3 << DILITHIUM_D)); + word16 n0_4 = DILITHIUM_D_MAX_HALF - + (t[j + 4] - (n1_4 << DILITHIUM_D)); + word16 n0_5 = DILITHIUM_D_MAX_HALF - + (t[j + 5] - (n1_5 << DILITHIUM_D)); + word16 n0_6 = DILITHIUM_D_MAX_HALF - + (t[j + 6] - (n1_6 << DILITHIUM_D)); + word16 n0_7 = DILITHIUM_D_MAX_HALF - + (t[j + 7] - (n1_7 << DILITHIUM_D)); + + /* 13 bits per number. + * 8 numbers become 13 bytes. (8 * 13 bits = 13 * 8 bits) */ + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT <= 2) + word32* tp; + #endif + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + tp = (word32*)t0; + tp[0] = (n0_0 ) | ((word32)n0_1 << 13) | ((word32)n0_2 << 26); + tp[1] = (n0_2 >> 6) | ((word32)n0_3 << 7) | ((word32)n0_4 << 20); + tp[2] = (n0_4 >> 12) | ((word32)n0_5 << 1) | + ((word32)n0_6 << 14) | ((word32)n0_7 << 27); + #else + t0[ 0] = (n0_0 << 0); + t0[ 1] = (n0_0 >> 8) | (n0_1 << 5); + t0[ 2] = (n0_1 >> 3) ; + t0[ 3] = (n0_1 >> 11) | (n0_2 << 2); + t0[ 4] = (n0_2 >> 6) | (n0_3 << 7); + t0[ 5] = (n0_3 >> 1) ; + t0[ 6] = (n0_3 >> 9) | (n0_4 << 4); + t0[ 7] = (n0_4 >> 4) ; + t0[ 8] = (n0_4 >> 12) | (n0_5 << 1); + t0[ 9] = (n0_5 >> 7) | (n0_6 << 6); + t0[10] = (n0_6 >> 2) ; + t0[11] = (n0_6 >> 10) | (n0_7 << 3); + #endif + t0[12] = (n0_7 >> 5) ; + + /* 10 bits per number. + * 8 bytes become 10 bytes. (8 * 10 bits = 10 * 8 bits) */ + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT <= 2) + tp = (word32*)t1; + tp[0] = (n1_0 ) | ((word32)n1_1 << 10) | + ((word32)n1_2 << 20) | ((word32)n1_3 << 30); + tp[1] = (n1_3 >> 2) | ((word32)n1_4 << 8) | + ((word32)n1_5 << 18) | ((word32)n1_6 << 28); + #else + t1[0] = (n1_0 << 0); + t1[1] = (n1_0 >> 8) | (n1_1 << 2); + t1[2] = (n1_1 >> 6) | (n1_2 << 4); + t1[3] = (n1_2 >> 4) | (n1_3 << 6); + t1[4] = (n1_3 >> 2) ; + t1[5] = (n1_4 << 0); + t1[6] = (n1_4 >> 8) | (n1_5 << 2); + t1[7] = (n1_5 >> 6) | (n1_6 << 4); + #endif + t1[8] = (n1_6 >> 4) | (n1_7 << 6); + t1[9] = (n1_7 >> 2) ; + + /* Move to next place to encode bottom bits to. */ + t0 += DILITHIUM_D; + /* Move to next place to encode top bits to. */ + t1 += DILITHIUM_U; } - else if ((key->level == 3) && (*outLen < DILITHIUM_LEVEL3_SIG_SIZE)) { - *outLen = DILITHIUM_LEVEL3_SIG_SIZE; - ret = BUFFER_E; + /* Next polynomial. */ + t += DILITHIUM_N; + } +} +#endif /* !WOLFSSL_DILITHIUM_NO_MAKE_KEY */ + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || defined(WOLFSSL_DILITHIUM_CHECK_KEY) +/* Decode bottom D bits of t as t0. + * + * FIPS 204. 8.2: Algorithm 19 skDecode(sk) + * ... + * 12: t0[i] <- BitUnpack(wi, 2^(d-1) - 1, 2^(d-1) + * ... + * + * @param [in] t0 Encoded values of t0. + * @param [in] d Dimensions of vector t0. + * @param [out] t Vector of polynomials. + */ +static void dilithium_decode_t0(const byte* t0, sword32* t) +{ + unsigned int j; + + /* Step 12. Get 13 bits and convert to range (2^(d-1)-1)..2^(d-1). */ + for (j = 0; j < DILITHIUM_N; j += 8) { + /* 13 bits used per number. + * 8 numbers from 13 bytes. (8 * 13 bits = 13 * 8 bits) */ +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + word32 t32_2 = ((const word32*)t0)[2]; + #ifdef WC_64BIT_CPU + word64 t64 = *(const word64*)t0; + t[j + 0] = DILITHIUM_D_MAX_HALF - ( t64 & 0x1fff); + t[j + 1] = DILITHIUM_D_MAX_HALF - ((t64 >> 13) & 0x1fff); + t[j + 2] = DILITHIUM_D_MAX_HALF - ((t64 >> 26) & 0x1fff); + t[j + 3] = DILITHIUM_D_MAX_HALF - ((t64 >> 39) & 0x1fff); + t[j + 4] = DILITHIUM_D_MAX_HALF - + ((t64 >> 52) | ((t32_2 & 0x0001) << 12)); + #else + word32 t32_0 = ((const word32*)t0)[0]; + word32 t32_1 = ((const word32*)t0)[1]; + t[j + 0] = DILITHIUM_D_MAX_HALF - + ( t32_0 & 0x1fff); + t[j + 1] = DILITHIUM_D_MAX_HALF - + ((t32_0 >> 13) & 0x1fff); + t[j + 2] = DILITHIUM_D_MAX_HALF - + (( t32_0 >> 26 ) | ((t32_1 & 0x007f) << 6)); + t[j + 3] = DILITHIUM_D_MAX_HALF - + ((t32_1 >> 7) & 0x1fff); + t[j + 4] = DILITHIUM_D_MAX_HALF - + (( t32_1 >> 20 ) | ((t32_2 & 0x0001) << 12)); + #endif + t[j + 5] = DILITHIUM_D_MAX_HALF - + ((t32_2 >> 1) & 0x1fff); + t[j + 6] = DILITHIUM_D_MAX_HALF - + ((t32_2 >> 14) & 0x1fff); + t[j + 7] = DILITHIUM_D_MAX_HALF - + (( t32_2 >> 27 ) | ((word32)t0[12] ) << 5 ); +#else + t[j + 0] = DILITHIUM_D_MAX_HALF - + ((t0[ 0] ) | (((word16)(t0[ 1] & 0x1f)) << 8)); + t[j + 1] = DILITHIUM_D_MAX_HALF - + ((t0[ 1] >> 5) | (((word16)(t0[ 2] )) << 3) | + (((word16)(t0[ 3] & 0x03)) << 11)); + t[j + 2] = DILITHIUM_D_MAX_HALF - + ((t0[ 3] >> 2) | (((word16)(t0[ 4] & 0x7f)) << 6)); + t[j + 3] = DILITHIUM_D_MAX_HALF - + ((t0[ 4] >> 7) | (((word16)(t0[ 5] )) << 1) | + (((word16)(t0[ 6] & 0x0f)) << 9)); + t[j + 4] = DILITHIUM_D_MAX_HALF - + ((t0[ 6] >> 4) | (((word16)(t0[ 7] )) << 4) | + (((word16)(t0[ 8] & 0x01)) << 12)); + t[j + 5] = DILITHIUM_D_MAX_HALF - + ((t0[ 8] >> 1) | (((word16)(t0[ 9] & 0x3f)) << 7)); + t[j + 6] = DILITHIUM_D_MAX_HALF - + ((t0[ 9] >> 6) | (((word16)(t0[10] )) << 2) | + (((word16)(t0[11] & 0x07)) << 10)); + t[j + 7] = DILITHIUM_D_MAX_HALF - + ((t0[11] >> 3) | (((word16)(t0[12] )) << 5)); +#endif + /* Move to next place to decode from. */ + t0 += DILITHIUM_D; + } +} + +#if defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + (defined(WC_DILITHIUM_CACHE_PRIV_VECTORS) || \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM))) +/* Decode bottom D bits of t as t0. + * + * FIPS 204. 8.2: Algorithm 19 skDecode(sk) + * ... + * 11: for i from 0 to k - 1 do + * 12: t0[i] <- BitUnpack(wi, 2^(d-1) - 1, 2^(d-1) + * 13: end for + * ... + * + * @param [in] t0 Encoded values of t0. + * @param [in] d Dimensions of vector t0. + * @param [out] t Vector of polynomials. + */ +static void dilithium_vec_decode_t0(const byte* t0, byte d, sword32* t) +{ + unsigned int i; + + /* Step 11. For each polynomial of vector. */ + for (i = 0; i < d; i++) { + dilithium_decode_t0(t0, t); + t0 += DILITHIUM_D * DILITHIUM_N / 8; + /* Next polynomial. */ + t += DILITHIUM_N; + } +} +#endif +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN || WOLFSSL_DILITHIUM_CHECK_KEY */ + +#if !defined(WOLFSSL_DILITHIUM_NO_VERIFY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) +/* Decode top bits of t as t1. + * + * FIPS 204. 8.2: Algorithm 17 pkDecode(pk) + * ... + * 4: t1[i] <- SimpleBitUnpack(zi, 2^(bitlen(q-1)-d) - 1) + * ... + * + * @param [in] t1 Encoded values of t1. + * @param [out] t Polynomials. + */ +static void dilithium_decode_t1(const byte* t1, sword32* t) +{ + unsigned int j; + /* Step 4. Get 10 bits as a number. */ + for (j = 0; j < DILITHIUM_N; j += 8) { + /* 10 bits used per number. + * 8 numbers from 10 bytes. (8 * 10 bits = 10 * 8 bits) */ +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + #ifdef WC_64BIT_CPU + word64 t64 = *(const word64*) t1; + word16 t16 = *(const word16*)(t1 + 8); + t[j+0] = (sword32)( ( t64 & 0x03ff) << DILITHIUM_D); + t[j+1] = (sword32)( ((t64 >> 10) & 0x03ff) << DILITHIUM_D); + t[j+2] = (sword32)( ((t64 >> 20) & 0x03ff) << DILITHIUM_D); + t[j+3] = (sword32)( ((t64 >> 30) & 0x03ff) << DILITHIUM_D); + t[j+4] = (sword32)( ((t64 >> 40) & 0x03ff) << DILITHIUM_D); + t[j+5] = (sword32)( ((t64 >> 50) & 0x03ff) << DILITHIUM_D); + t[j+6] = (sword32)((((t64 >> 60)| (t16 << 4)) & 0x03ff) << DILITHIUM_D); + t[j+7] = (sword32)( ((t16 >> 6) & 0x03ff) << DILITHIUM_D); + #else + word32 t32 = *((const word32*)t1); + t[j + 0] = ( t32 & 0x03ff ) << + DILITHIUM_D; + t[j + 1] = ((t32 >> 10) & 0x03ff ) << + DILITHIUM_D; + t[j + 2] = ((t32 >> 20) & 0x03ff ) << + DILITHIUM_D; + t[j + 3] = ((t32 >> 30) | (((word16)t1[4]) << 2)) << + DILITHIUM_D; + t32 = *((const word32*)(t1 + 5)); + t[j + 4] = ( t32 & 0x03ff ) << + DILITHIUM_D; + t[j + 5] = ((t32 >> 10) & 0x03ff ) << + DILITHIUM_D; + t[j + 6] = ((t32 >> 20) & 0x03ff ) << + DILITHIUM_D; + t[j + 7] = ((t32 >> 30) | (((word16)t1[9]) << 2)) << + DILITHIUM_D; + #endif +#else + t[j + 0] = (sword32)((t1[0] >> 0) | (((word16)(t1[1] & 0x03)) << 8)) + << DILITHIUM_D; + t[j + 1] = (sword32)((t1[1] >> 2) | (((word16)(t1[2] & 0x0f)) << 6)) + << DILITHIUM_D; + t[j + 2] = (sword32)((t1[2] >> 4) | (((word16)(t1[3] & 0x3f)) << 4)) + << DILITHIUM_D; + t[j + 3] = (sword32)((t1[3] >> 6) | (((word16)(t1[4] )) << 2)) + << DILITHIUM_D; + t[j + 4] = (sword32)((t1[5] >> 0) | (((word16)(t1[6] & 0x03)) << 8)) + << DILITHIUM_D; + t[j + 5] = (sword32)((t1[6] >> 2) | (((word16)(t1[7] & 0x0f)) << 6)) + << DILITHIUM_D; + t[j + 6] = (sword32)((t1[7] >> 4) | (((word16)(t1[8] & 0x3f)) << 4)) + << DILITHIUM_D; + t[j + 7] = (sword32)((t1[8] >> 6) | (((word16)(t1[9] )) << 2)) + << DILITHIUM_D; +#endif + /* Move to next place to decode from. */ + t1 += DILITHIUM_U; + } +} +#endif + +#if (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) +/* Decode top bits of t as t1. + * + * FIPS 204. 8.2: Algorithm 17 pkDecode(pk) + * ... + * 3: for i from 0 to k - 1 do + * 4: t1[i] <- SimpleBitUnpack(zi, 2^(bitlen(q-1)-d) - 1) + * 5: end for + * ... + * + * @param [in] t1 Encoded values of t1. + * @param [in] d Dimensions of vector t1. + * @param [out] t Vector of polynomials. + */ +static void dilithium_vec_decode_t1(const byte* t1, byte d, sword32* t) +{ + unsigned int i; + + /* Step 3. For each polynomial of vector. */ + for (i = 0; i < d; i++) { + dilithium_decode_t1(t1, t); + /* Next polynomial. */ + t1 += DILITHIUM_U * DILITHIUM_N / 8; + t += DILITHIUM_N; + } +} +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + +#ifndef WOLFSSL_NO_ML_DSA_44 +/* Encode z with range of -(GAMMA1-1)...GAMMA1 + * + * FIPS 204. 8.2: Algorithm 20 sigEncode(c_tilde, z, h) + * ... + * 3: sigma <- sigma || BitPack(z[i], GAMMA1 - 1, GAMMA1) + * ... + * + * @param [in] z Polynomial to encode. + * @param [out] s Buffer to encode into. + */ +static void dilithium_encode_gamma1_17_bits(const sword32* z, byte* s) +{ + unsigned int j; + + /* Step 3. Get 18 bits as a number. */ + for (j = 0; j < DILITHIUM_N; j += 4) { + word32 z0 = DILITHIUM_GAMMA1_17 - z[j + 0]; + word32 z1 = DILITHIUM_GAMMA1_17 - z[j + 1]; + word32 z2 = DILITHIUM_GAMMA1_17 - z[j + 2]; + word32 z3 = DILITHIUM_GAMMA1_17 - z[j + 3]; + + /* 18 bits per number. + * 8 numbers become 9 bytes. (8 * 9 bits = 9 * 8 bits) */ +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + #ifdef WC_64BIT_CPU + word64* s64p = (word64*)s; + s64p[0] = z0 | ((word64)z1 << 18) | + ((word64)z2 << 36) | ((word64)z3 << 54); + #else + word32* s32p = (word32*)s; + s32p[0] = z0 | (z1 << 18) ; + s32p[1] = (z1 >> 14) | (z2 << 4) | (z3 << 22); + #endif +#else + s[0] = z0 ; + s[1] = z0 >> 8 ; + s[2] = (z0 >> 16) | (z1 << 2); + s[3] = z1 >> 6 ; + s[4] = (z1 >> 14) | (z2 << 4); + s[5] = z2 >> 4 ; + s[6] = (z2 >> 12) | (z3 << 6); + s[7] = z3 >> 2 ; +#endif + s[8] = z3 >> 10 ; + /* Move to next place to encode to. */ + s += DILITHIUM_GAMMA1_17_ENC_BITS / 2; + } +} +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) +/* Encode z with range of -(GAMMA1-1)...GAMMA1 + * + * FIPS 204. 8.2: Algorithm 20 sigEncode(c_tilde, z, h) + * ... + * 3: sigma <- sigma || BitPack(z[i], GAMMA1 - 1, GAMMA1) + * ... + * + * @param [in] z Polynomial to encode. + * @param [out] s Buffer to encode into. + */ +static void dilithium_encode_gamma1_19_bits(const sword32* z, byte* s) +{ + unsigned int j; + + /* Step 3. Get 20 bits as a number. */ + for (j = 0; j < DILITHIUM_N; j += 4) { + sword32 z0 = DILITHIUM_GAMMA1_19 - z[j + 0]; + sword32 z1 = DILITHIUM_GAMMA1_19 - z[j + 1]; + sword32 z2 = DILITHIUM_GAMMA1_19 - z[j + 2]; + sword32 z3 = DILITHIUM_GAMMA1_19 - z[j + 3]; + + /* 20 bits per number. + * 4 numbers become 10 bytes. (4 * 20 bits = 10 * 8 bits) */ +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT <= 2) + word16* s16p = (word16*)s; + #ifdef WC_64BIT_CPU + word64* s64p = (word64*)s; + s64p[0] = z0 | ((word64)z1 << 20) | + ((word64)z2 << 40) | ((word64)z3 << 60); + #else + word32* s32p = (word32*)s; + s32p[0] = z0 | (z1 << 20) ; + s32p[1] = (z1 >> 12) | (z2 << 8) | (z3 << 28); + #endif + s16p[4] = (z3 >> 4) ; +#else + s[0] = z0 ; + s[1] = (z0 >> 8) ; + s[2] = (z0 >> 16) | (z1 << 4); + s[3] = (z1 >> 4) ; + s[4] = (z1 >> 12) ; + s[5] = z2 ; + s[6] = (z2 >> 8) ; + s[7] = (z2 >> 16) | (z3 << 4); + s[8] = (z3 >> 4) ; + s[9] = (z3 >> 12) ; +#endif + /* Move to next place to encode to. */ + s += DILITHIUM_GAMMA1_19_ENC_BITS / 2; + } +} +#endif + +#ifndef WOLFSSL_DILITHIUM_SIGN_SMALL_MEM +/* Encode z with range of -(GAMMA1-1)...GAMMA1 + * + * FIPS 204. 8.2: Algorithm 20 sigEncode(c_tilde, z, h) + * ... + * 2: for i form 0 to l - 1 do + * 3: sigma <- sigma || BitPack(z[i], GAMMA1 - 1, GAMMA1) + * 4: end for + * ... + * + * @param [in] z Vector of polynomials to encode. + * @param [in] l Dimension of vector. + * @param [in] bits Number of bits used in encoding - GAMMA1 bits. + * @param [out] s Buffer to encode into. + */ +static void dilithium_vec_encode_gamma1(const sword32* z, byte l, int bits, + byte* s) +{ + unsigned int i; + + (void)l; + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (bits == DILITHIUM_GAMMA1_BITS_17) { + /* Step 2. For each polynomial of vector. */ + for (i = 0; i < PARAMS_ML_DSA_44_L; i++) { + dilithium_encode_gamma1_17_bits(z, s); + /* Move to next place to encode to. */ + s += DILITHIUM_GAMMA1_17_ENC_BITS / 2 * DILITHIUM_N / 4; + /* Next polynomial. */ + z += DILITHIUM_N; } - else if ((key->level == 5) && (*outLen < DILITHIUM_LEVEL5_SIG_SIZE)) { - *outLen = DILITHIUM_LEVEL5_SIG_SIZE; - ret = BUFFER_E; + } + else +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (bits == DILITHIUM_GAMMA1_BITS_19) { + /* Step 2. For each polynomial of vector. */ + for (i = 0; i < l; i++) { + dilithium_encode_gamma1_19_bits(z, s); + /* Move to next place to encode to. */ + s += DILITHIUM_GAMMA1_19_ENC_BITS / 2 * DILITHIUM_N / 4; + /* Next polynomial. */ + z += DILITHIUM_N; } - localOutLen = *outLen; } + else +#endif + { + } +} +#endif /* WOLFSSL_DILITHIUM_SIGN_SMALL_MEM */ - if ((ret == 0) && - (OQS_SIG_sign(oqssig, out, &localOutLen, in, inLen, key->k) - == OQS_ERROR)) { - ret = BAD_FUNC_ARG; +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) +/* Decode polynomial with range -(GAMMA1-1)..GAMMA1. + * + * FIPS 204. 8.2: Algorithm 21 sigDecode(sigma) + * ... + * 4: z[i] <- BitUnpack(xi, GAMMA1 - 1, GAMMA1) + * ... + * + * @param [in] s Encoded values of z. + * @param [in] bits Number of bits used in encoding - GAMMA1 bits. + * @param [out] z Polynomial to fill. + */ +static void dilithium_decode_gamma1(const byte* s, int bits, sword32* z) +{ + unsigned int i; + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (bits == DILITHIUM_GAMMA1_BITS_17) { +#if defined(WOLFSSL_DILITHIUM_NO_LARGE_CODE) || defined(WOLFSSL_DILITHIUM_SMALL) + /* Step 4: Get 18 bits as a number. */ + for (i = 0; i < DILITHIUM_N; i += 4) { + /* 18 bits per number. + * 4 numbers from 9 bytes. (4 * 18 bits = 9 * 8 bits) */ + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + #ifdef WC_64BIT_CPU + word64 s64_0 = *(const word64*)(s+0); + z[i+0] = (word32)DILITHIUM_GAMMA1_17 - + ( s64_0 & 0x3ffff ); + z[i+1] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_0 >> 18) & 0x3ffff ); + z[i+2] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_0 >> 36) & 0x3ffff ); + z[i+3] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_0 >> 54) | (((word32)s[8]) << 10)); + #else + word32 s32_0 = ((const word32*)(s+0))[0]; + word32 s32_1 = ((const word32*)(s+0))[1]; + z[i+0] = (word32)DILITHIUM_GAMMA1_17 - + ( s32_0 & 0x3ffff ); + z[i+1] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_0 >> 18) | (((s32_1 & 0x0000f) << 14))); + z[i+2] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_1 >> 4) & 0x3ffff); + z[i+3] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_1 >> 22) | (((word32)s[8]) << 10 )); + #endif + #else + z[i+0] = DILITHIUM_GAMMA1_17 - + ( s[ 0] | ((sword32)(s[ 1] << 8) | + (sword32)(s[ 2] & 0x03) << 16)); + z[i+1] = DILITHIUM_GAMMA1_17 - + ((s[ 2] >> 2) | ((sword32)(s[ 3] << 6) | + (sword32)(s[ 4] & 0x0f) << 14)); + z[i+2] = DILITHIUM_GAMMA1_17 - + ((s[ 4] >> 4) | ((sword32)(s[ 5] << 4) | + (sword32)(s[ 6] & 0x3f) << 12)); + z[i+3] = DILITHIUM_GAMMA1_17 - + ((s[ 6] >> 6) | ((sword32)(s[ 7] << 2) | + (sword32)(s[ 8] ) << 10)); + #endif + /* Move to next place to decode from. */ + s += DILITHIUM_GAMMA1_17_ENC_BITS / 2; + } +#else + /* Step 4: Get 18 bits as a number. */ + for (i = 0; i < DILITHIUM_N; i += 8) { + /* 18 bits per number. + * 8 numbers from 9 bytes. (8 * 18 bits = 18 * 8 bits) */ + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + #ifdef WC_64BIT_CPU + word64 s64_0 = *(const word64*)(s+0); + word64 s64_1 = *(const word64*)(s+9); + z[i+0] = (word32)DILITHIUM_GAMMA1_17 - + ( s64_0 & 0x3ffff ); + z[i+1] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_0 >> 18) & 0x3ffff ); + z[i+2] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_0 >> 36) & 0x3ffff ); + z[i+3] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_0 >> 54) | (((word32)s[8]) << 10)); + z[i+4] = (word32)DILITHIUM_GAMMA1_17 - + ( s64_1 & 0x3ffff ); + z[i+5] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_1 >> 18) & 0x3ffff ); + z[i+6] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_1 >> 36) & 0x3ffff ); + z[i+7] = (word32)DILITHIUM_GAMMA1_17 - + ((s64_1 >> 54) | (((word32)s[17]) << 10)); + #else + word32 s32_0 = ((const word32*)(s+0))[0]; + word32 s32_1 = ((const word32*)(s+0))[1]; + word32 s32_2 = ((const word32*)(s+9))[0]; + word32 s32_3 = ((const word32*)(s+9))[1]; + z[i+0] = (word32)DILITHIUM_GAMMA1_17 - + ( s32_0 & 0x3ffff ); + z[i+1] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_0 >> 18) | (((s32_1 & 0x0000f) << 14))); + z[i+2] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_1 >> 4) & 0x3ffff); + z[i+3] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_1 >> 22) | (((word32)s[8]) << 10 )); + z[i+4] = (word32)DILITHIUM_GAMMA1_17 - + ( s32_2 & 0x3ffff ); + z[i+5] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_2 >> 18) | (((s32_3 & 0x0000f) << 14))); + z[i+6] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_3 >> 4) & 0x3ffff); + z[i+7] = (word32)DILITHIUM_GAMMA1_17 - + ((s32_3 >> 22) | (((word32)s[17]) << 10 )); + #endif + #else + z[i+0] = DILITHIUM_GAMMA1_17 - + ( s[ 0] | ((sword32)(s[ 1] << 8) | + (sword32)(s[ 2] & 0x03) << 16)); + z[i+1] = DILITHIUM_GAMMA1_17 - + ((s[ 2] >> 2) | ((sword32)(s[ 3] << 6) | + (sword32)(s[ 4] & 0x0f) << 14)); + z[i+2] = DILITHIUM_GAMMA1_17 - + ((s[ 4] >> 4) | ((sword32)(s[ 5] << 4) | + (sword32)(s[ 6] & 0x3f) << 12)); + z[i+3] = DILITHIUM_GAMMA1_17 - + ((s[ 6] >> 6) | ((sword32)(s[ 7] << 2) | + (sword32)(s[ 8] ) << 10)); + z[i+4] = DILITHIUM_GAMMA1_17 - + ( s[ 9] | ((sword32)(s[10] << 8) | + (sword32)(s[11] & 0x03) << 16)); + z[i+5] = DILITHIUM_GAMMA1_17 - + ((s[11] >> 2) | ((sword32)(s[12] << 6) | + (sword32)(s[13] & 0x0f) << 14)); + z[i+6] = DILITHIUM_GAMMA1_17 - + ((s[13] >> 4) | ((sword32)(s[14] << 4) | + (sword32)(s[15] & 0x3f) << 12)); + z[i+7] = DILITHIUM_GAMMA1_17 - + ((s[15] >> 6) | ((sword32)(s[16] << 2) | + (sword32)(s[17] ) << 10)); + #endif + /* Move to next place to decode from. */ + s += DILITHIUM_GAMMA1_17_ENC_BITS; + } +#endif + } + else +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (bits == DILITHIUM_GAMMA1_BITS_19) { +#if defined(WOLFSSL_DILITHIUM_NO_LARGE_CODE) || defined(WOLFSSL_DILITHIUM_SMALL) + /* Step 4: Get 20 bits as a number. */ + for (i = 0; i < DILITHIUM_N; i += 4) { + /* 20 bits per number. + * 4 numbers from 10 bytes. (4 * 20 bits = 10 * 8 bits) */ + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT <= 2) + word16 s16_0 = ((const word16*)s)[4]; + #ifdef WC_64BIT_CPU + word64 s64_0 = *(const word64*)s; + z[i+0] = DILITHIUM_GAMMA1_19 - ( s64_0 & 0xfffff) ; + z[i+1] = DILITHIUM_GAMMA1_19 - ( (s64_0 >> 20) & 0xfffff) ; + z[i+2] = DILITHIUM_GAMMA1_19 - ( (s64_0 >> 40) & 0xfffff) ; + z[i+3] = DILITHIUM_GAMMA1_19 - (((s64_0 >> 60) & 0xfffff) | + ((sword32)s16_0 << 4)); + #else + word32 s32_0 = ((const word32*)s)[0]; + word32 s32_1 = ((const word32*)s)[1]; + z[i+0] = DILITHIUM_GAMMA1_19 - ( s32_0 & 0xfffff); + z[i+1] = DILITHIUM_GAMMA1_19 - (( s32_0 >> 20) | + ((s32_1 & 0x000ff) << 12)); + z[i+2] = DILITHIUM_GAMMA1_19 - ( (s32_1 >> 8) & 0xfffff); + z[i+3] = DILITHIUM_GAMMA1_19 - (( s32_1 >> 28) | + ((sword32)s16_0 << 4)); + #endif + #else + z[i+0] = DILITHIUM_GAMMA1_19 - ( s[0] | ((sword32)s[1] << 8) | + ((sword32)(s[2] & 0x0f) << 16)); + z[i+1] = DILITHIUM_GAMMA1_19 - ((s[2] >> 4) | ((sword32)s[3] << 4) | + ((sword32)(s[4] ) << 12)); + z[i+2] = DILITHIUM_GAMMA1_19 - ( s[5] | ((sword32)s[6] << 8) | + ((sword32)(s[7] & 0x0f) << 16)); + z[i+3] = DILITHIUM_GAMMA1_19 - ((s[7] >> 4) | ((sword32)s[8] << 4) | + ((sword32)(s[9] ) << 12)); + #endif + /* Move to next place to decode from. */ + s += DILITHIUM_GAMMA1_19_ENC_BITS / 2; + } +#else + /* Step 4: Get 20 bits as a number. */ + for (i = 0; i < DILITHIUM_N; i += 8) { + /* 20 bits per number. + * 8 numbers from 10 bytes. (8 * 20 bits = 20 * 8 bits) */ + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT <= 2) + word16 s16_0 = ((const word16*)s)[4]; + word16 s16_1 = ((const word16*)s)[9]; + #ifdef WC_64BIT_CPU + word64 s64_0 = *(const word64*)(s+0); + word64 s64_1 = *(const word64*)(s+10); + z[i+0] = DILITHIUM_GAMMA1_19 - ( s64_0 & 0xfffff) ; + z[i+1] = DILITHIUM_GAMMA1_19 - ( (s64_0 >> 20) & 0xfffff) ; + z[i+2] = DILITHIUM_GAMMA1_19 - ( (s64_0 >> 40) & 0xfffff) ; + z[i+3] = DILITHIUM_GAMMA1_19 - (((s64_0 >> 60) & 0xfffff) | + ((sword32)s16_0 << 4)); + z[i+4] = DILITHIUM_GAMMA1_19 - ( s64_1 & 0xfffff) ; + z[i+5] = DILITHIUM_GAMMA1_19 - ( (s64_1 >> 20) & 0xfffff) ; + z[i+6] = DILITHIUM_GAMMA1_19 - ( (s64_1 >> 40) & 0xfffff) ; + z[i+7] = DILITHIUM_GAMMA1_19 - (((s64_1 >> 60) & 0xfffff) | + ((sword32)s16_1 << 4)); + #else + word32 s32_0 = ((const word32*)(s+ 0))[0]; + word32 s32_1 = ((const word32*)(s+ 0))[1]; + word32 s32_2 = ((const word32*)(s+10))[0]; + word32 s32_3 = ((const word32*)(s+10))[1]; + z[i+0] = DILITHIUM_GAMMA1_19 - ( s32_0 & 0xfffff); + z[i+1] = DILITHIUM_GAMMA1_19 - (( s32_0 >> 20) | + ((s32_1 & 0x000ff) << 12)); + z[i+2] = DILITHIUM_GAMMA1_19 - ( (s32_1 >> 8) & 0xfffff); + z[i+3] = DILITHIUM_GAMMA1_19 - (( s32_1 >> 28) | + ((sword32)s16_0 << 4)); + z[i+4] = DILITHIUM_GAMMA1_19 - ( s32_2 & 0xfffff); + z[i+5] = DILITHIUM_GAMMA1_19 - (( s32_2 >> 20) | + ((s32_3 & 0x000ff) << 12)); + z[i+6] = DILITHIUM_GAMMA1_19 - ( (s32_3 >> 8) & 0xfffff); + z[i+7] = DILITHIUM_GAMMA1_19 - (( s32_3 >> 28) | + ((sword32)s16_1 << 4)); + #endif + #else + z[i+0] = DILITHIUM_GAMMA1_19 - ( s[ 0] | + ((sword32)s[ 1] << 8) | + ((sword32)(s[ 2] & 0x0f) << 16)); + z[i+1] = DILITHIUM_GAMMA1_19 - ((s[ 2] >> 4) | + ((sword32) s[ 3] << 4) | + ((sword32)(s[ 4] ) << 12)); + z[i+2] = DILITHIUM_GAMMA1_19 - ( s[ 5] | + ((sword32) s[ 6] << 8) | + ((sword32)(s[ 7] & 0x0f) << 16)); + z[i+3] = DILITHIUM_GAMMA1_19 - ((s[ 7] >> 4) | + ((sword32) s[ 8] << 4) | + ((sword32)(s[ 9] ) << 12)); + z[i+4] = DILITHIUM_GAMMA1_19 - ( s[10] | + ((sword32) s[11] << 8) | + ((sword32)(s[12] & 0x0f) << 16)); + z[i+5] = DILITHIUM_GAMMA1_19 - ((s[12] >> 4) | + ((sword32) s[13] << 4) | + ((sword32)(s[14] ) << 12)); + z[i+6] = DILITHIUM_GAMMA1_19 - ( s[15] | + ((sword32) s[16] << 8) | + ((sword32)(s[17] & 0x0f) << 16)); + z[i+7] = DILITHIUM_GAMMA1_19 - ((s[17] >> 4) | + ((sword32) s[18] << 4) | + ((sword32)(s[19] ) << 12)); + #endif + /* Move to next place to decode from. */ + s += DILITHIUM_GAMMA1_19_ENC_BITS; + } +#endif + } + else +#endif + { + } +} +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY +/* Decode polynomial with range -(GAMMA1-1)..GAMMA1. + * + * FIPS 204. 8.2: Algorithm 21 sigDecode(sigma) + * ... + * 3: for i from 0 to l - 1 do + * 4: z[i] <- BitUnpack(xi, GAMMA1 - 1, GAMMA1) + * 5: end for + * ... + * + * @param [in] x Encoded values of t0. + * @param [in] l Dimensions of vector z. + * @param [in] bits Number of bits used in encoding - GAMMA1 bits. + * @param [out] z Vector of polynomials. + */ +static void dilithium_vec_decode_gamma1(const byte* x, byte l, int bits, + sword32* z) +{ + unsigned int i; + + /* Step 3: For each polynomial of vector. */ + for (i = 0; i < l; i++) { + /* Step 4: Unpack a polynomial. */ + dilithium_decode_gamma1(x, bits, z); + /* Move pointers on to next polynomial. */ + x += DILITHIUM_N / 8 * (bits + 1); + z += DILITHIUM_N; + } +} +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) +#ifndef WOLFSSL_NO_ML_DSA_44 +/* Encode w1 with range of 0..((q-1)/(2*GAMMA2)-1). + * + * FIPS 204. 8.2: Algorithm 22 w1Encode(w1) + * ... + * 3: w1_tilde <- w1_tilde || + * ByteToBits(SimpleBitPack(w1[i], (q-1)/(2*GAMMA2)-1)) + * ... + * + * @param [in] w1 Vector of polynomials to encode. + * @param [in] gamma2 Maximum value in range. + * @param [out] w1e Buffer to encode into. + */ +static void dilithium_encode_w1_88(const sword32* w1, byte* w1e) +{ + unsigned int j; + + /* Step 3: Encode a polynomial values 6 bits at a time. */ + for (j = 0; j < DILITHIUM_N; j += 16) { + /* 6 bits per number. + * 16 numbers in 12 bytes. (16 * 6 bits = 12 * 8 bits) */ +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT <= 4) + word32* w1e32 = (word32*)w1e; + w1e32[0] = w1[j+ 0] | (w1[j+ 1] << 6) | + (w1[j+ 2] << 12) | (w1[j+ 3] << 18) | + (w1[j+ 4] << 24) | (w1[j+ 5] << 30); + w1e32[1] = (w1[j+ 5] >> 2) | (w1[j+ 6] << 4) | + (w1[j+ 7] << 10) | (w1[j+ 8] << 16) | + (w1[j+ 9] << 22) | (w1[j+10] << 28); + w1e32[2] = (w1[j+10] >> 4) | (w1[j+11] << 2) | + (w1[j+12] << 8) | (w1[j+13] << 14) | + (w1[j+14] << 20) | (w1[j+15] << 26); +#else + w1e[ 0] = w1[j+ 0] | (w1[j+ 1] << 6); + w1e[ 1] = (w1[j+ 1] >> 2) | (w1[j+ 2] << 4); + w1e[ 2] = (w1[j+ 2] >> 4) | (w1[j+ 3] << 2); + w1e[ 3] = w1[j+ 4] | (w1[j+ 5] << 6); + w1e[ 4] = (w1[j+ 5] >> 2) | (w1[j+ 6] << 4); + w1e[ 5] = (w1[j+ 6] >> 4) | (w1[j+ 7] << 2); + w1e[ 6] = w1[j+ 8] | (w1[j+ 9] << 6); + w1e[ 7] = (w1[j+ 9] >> 2) | (w1[j+10] << 4); + w1e[ 8] = (w1[j+10] >> 4) | (w1[j+11] << 2); + w1e[ 9] = w1[j+12] | (w1[j+13] << 6); + w1e[10] = (w1[j+13] >> 2) | (w1[j+14] << 4); + w1e[11] = (w1[j+14] >> 4) | (w1[j+15] << 2); +#endif + /* Move to next place to encode to. */ + w1e += DILITHIUM_Q_HI_88_ENC_BITS * 2; + } +} +#endif /* !WOLFSSL_NO_ML_DSA_44 */ + +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) +/* Encode w1 with range of 0..((q-1)/(2*GAMMA2)-1). + * + * FIPS 204. 8.2: Algorithm 22 w1Encode(w1) + * ... + * 3: w1_tilde <- w1_tilde || + * ByteToBits(SimpleBitPack(w1[i], (q-1)/(2*GAMMA2)-1)) + * ... + * + * @param [in] w1 Vector of polynomials to encode. + * @param [in] gamma2 Maximum value in range. + * @param [out] w1e Buffer to encode into. + */ +static void dilithium_encode_w1_32(const sword32* w1, byte* w1e) +{ + unsigned int j; + + /* Step 3: Encode a polynomial values 4 bits at a time. */ + for (j = 0; j < DILITHIUM_N; j += 16) { + /* 4 bits per number. + * 16 numbers in 8 bytes. (16 * 4 bits = 8 * 8 bits) */ +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT <= 8) + word32* w1e32 = (word32*)w1e; + w1e32[0] = (w1[j + 0] << 0) | (w1[j + 1] << 4) | + (w1[j + 2] << 8) | (w1[j + 3] << 12) | + (w1[j + 4] << 16) | (w1[j + 5] << 20) | + (w1[j + 6] << 24) | (w1[j + 7] << 28); + w1e32[1] = (w1[j + 8] << 0) | (w1[j + 9] << 4) | + (w1[j + 10] << 8) | (w1[j + 11] << 12) | + (w1[j + 12] << 16) | (w1[j + 13] << 20) | + (w1[j + 14] << 24) | (w1[j + 15] << 28); +#else + w1e[0] = w1[j + 0] | (w1[j + 1] << 4); + w1e[1] = w1[j + 2] | (w1[j + 3] << 4); + w1e[2] = w1[j + 4] | (w1[j + 5] << 4); + w1e[3] = w1[j + 6] | (w1[j + 7] << 4); + w1e[4] = w1[j + 8] | (w1[j + 9] << 4); + w1e[5] = w1[j + 10] | (w1[j + 11] << 4); + w1e[6] = w1[j + 12] | (w1[j + 13] << 4); + w1e[7] = w1[j + 14] | (w1[j + 15] << 4); +#endif + /* Move to next place to encode to. */ + w1e += DILITHIUM_Q_HI_32_ENC_BITS * 2; + } +} +#endif +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) +/* Encode w1 with range of 0..((q-1)/(2*GAMMA2)-1). + * + * FIPS 204. 8.2: Algorithm 22 w1Encode(w1) + * 1: w1_tilde = () + * 2: for i form 0 to k - 1 do + * 3: w1_tilde <- w1_tilde || + * ByteToBits(SimpleBitPack(w1[i], (q-1)/(2*GAMMA2)-1)) + * 4: end for + * 5: return w1_tilde + * + * @param [in] w1 Vector of polynomials to encode. + * @param [in] k Dimension of vector. + * @param [in] gamma2 Maximum value in range. + * @param [out] w1e Buffer to encode into. + */ +static void dilithium_vec_encode_w1(const sword32* w1, byte k, sword32 gamma2, + byte* w1e) +{ + unsigned int i; + + (void)k; + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (gamma2 == DILITHIUM_Q_LOW_88) { + /* Step 2. For each polynomial of vector. */ + for (i = 0; i < PARAMS_ML_DSA_44_K; i++) { + dilithium_encode_w1_88(w1, w1e); + /* Next polynomial. */ + w1 += DILITHIUM_N; + w1e += DILITHIUM_Q_HI_88_ENC_BITS * 2 * DILITHIUM_N / 16; + } } + else +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (gamma2 == DILITHIUM_Q_LOW_32) { + /* Step 2. For each polynomial of vector. */ + for (i = 0; i < k; i++) { + dilithium_encode_w1_32(w1, w1e); + /* Next polynomial. */ + w1 += DILITHIUM_N; + w1e += DILITHIUM_Q_HI_32_ENC_BITS * 2 * DILITHIUM_N / 16; + } + } + else +#endif + { + } +} +#endif + +/****************************************************************************** + * Expand operations + ******************************************************************************/ +/* Generate a random polynomial by rejection. + * + * FIPS 204. 8.3: Algorithm 24 RejNTTPoly(rho) + * 1: j <- 0 + * 2: c <- 0 + * 3: while j < 256 do + * 4: a_hat[j] <- CoeffFromThreeBytes(H128(rho)[[c]], H128(rho)[[c+1]], + * H128(rho)[[c+2]]) + * 5: c <- c + 3 + * 6: if a_hat[j] != falsam then + * 7: j <- j + 1 + * 8: end if + * 9: end while + * 10: return a_hat + * + * FIPS 204. 8.1: Algorithm 8 CoeffFromThreeBytes(b0,b1,b2) + * 1: if b2 > 127 then + * 2: b2 <- b2 - 128 + * 3. end if + * 4. z <- 2^16.b2 + s^8.b1 + b0 + * 5. if z < q then return z + * 6. else return falsam + * 7. end if + * + * @param [in, out] shake128 SHAKE-128 object. + * @param [in] seed Seed to hash to generate values. + * @param [out] a Polynomial. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + * @return Negative on hash error. + */ +static int dilithium_rej_ntt_poly(wc_Shake* shake128, byte* seed, sword32* a, + byte* key_h) +{ +#ifdef WOLFSSL_DILITHIUM_SMALL + int ret = 0; + int j = 0; +#if defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC) + byte* h = NULL; +#else + byte h[DILITHIUM_REJ_NTT_POLY_H_SIZE]; +#endif + + (void)key_h; + +#ifdef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC + h = key_h; +#elif defined(WOLFSSL_SMALL_STACK) + h = (byte*)XMALLOC(DILITHIUM_REJ_NTT_POLY_H_SIZE, NULL, + DYNAMIC_TYPE_DILITHIUM); + if (h == NULL) { + ret = MEMORY_E; + } +#endif /* WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC */ + + if (ret == 0) { + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Reading 4 bytes for 3 so need to set 1 past for last read. */ + h[DILITHIUM_GEN_A_BLOCK_BYTES] = 0; + #endif + + /* Initialize SHAKE-128 object for new hash. */ + ret = wc_InitShake128(shake128, NULL, INVALID_DEVID); + } if (ret == 0) { - *outLen = (word32)localOutLen; + /* Absorb the seed. */ + ret = wc_Shake128_Absorb(shake128, seed, DILITHIUM_GEN_A_SEED_SZ); + } + /* Keep generating more blocks and using triplets until we have enough. + */ + while ((ret == 0) && (j < DILITHIUM_N)) { + /* Squeeze out a block - 168 bytes = 56 values. */ + ret = wc_Shake128_SqueezeBlocks(shake128, h, 1); + if (ret == 0) { + int c; + /* Use triplets until run out or have enough for polynomial. */ + for (c = 0; c < DILITHIUM_GEN_A_BLOCK_BYTES; c += 3) { + #if defined(LITTLE_ENDIAN_ORDER) && \ + (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Load 32-bit value and mask out 23 bits. */ + sword32 t = *((sword32*)(h + c)) & 0x7fffff; + #else + /* Load 24-bit value and mask out 23 bits. */ + sword32 t = (h[c] + ((sword32)h[c+1] << 8) + + ((sword32)h[c+2] << 16)) & 0x7fffff; + #endif + /* Check if value is in valid range. */ + if (t < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. + */ + a[j++] = t; + /* Check we whether we have enough yet. */ + if (j == DILITHIUM_N) { + break; + } + } + } + } } - if (oqssig != NULL) { - OQS_SIG_free(oqssig); +#if !defined(WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC) && defined(WOLFSSL_SMALL_STACK) + XFREE(h, NULL, DYNAMIC_TYPE_DILITHIUM); +#endif + return ret; +#else + int ret = 0; + unsigned int j = 0; + unsigned int c; +#if defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC) + byte* h = NULL; +#else + byte h[DILITHIUM_REJ_NTT_POLY_H_SIZE]; +#endif + + (void)key_h; + +#ifdef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC + h = key_h; +#elif defined(WOLFSSL_SMALL_STACK) + h = (byte*)XMALLOC(DILITHIUM_REJ_NTT_POLY_H_SIZE, NULL, + DYNAMIC_TYPE_DILITHIUM); + if (h == NULL) { + ret = MEMORY_E; } +#endif /* WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC */ + + if (ret == 0) { + /* Generate enough SHAKE-128 output blocks to give high probability of + * being able to get 256 valid 3-byte, 23-bit values from it. */ + ret = dilithium_squeeze128(shake128, seed, DILITHIUM_GEN_A_SEED_SZ, h, + DILITHIUM_GEN_A_NBLOCKS); + } + if (ret == 0) { + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Reading 4 bytes for 3 so need to set 1 past for last read. */ + h[DILITHIUM_GEN_A_BYTES] = 0; + #endif + + /* Use the first 256 triplets and know we won't exceed required. */ +#ifdef WOLFSSL_DILITHIUM_NO_LARGE_CODE + for (c = 0; c < (DILITHIUM_N - 1) * 3; c += 3) { + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Load 32-bit value and mask out 23 bits. */ + sword32 t = *((sword32*)(h + c)) & 0x7fffff; + #else + /* Load 24-bit value and mask out 23 bits. */ + sword32 t = (h[c] + ((sword32)h[c+1] << 8) + + ((sword32)h[c+2] << 16)) & 0x7fffff; + #endif + /* Check if value is in valid range. */ + if (t < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t; + } + } + /* Use the remaining triplets, checking we have enough. */ + for (; c < DILITHIUM_GEN_A_BYTES; c += 3) { + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Load 32-bit value and mask out 23 bits. */ + sword32 t = *((sword32*)(h + c)) & 0x7fffff; + #else + /* Load 24-bit value and mask out 23 bits. */ + sword32 t = (h[c] + ((sword32)h[c+1] << 8) + + ((sword32)h[c+2] << 16)) & 0x7fffff; + #endif + /* Check if value is in valid range. */ + if (t < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t; + /* Check we whether we have enough yet. */ + if (j == DILITHIUM_N) { + break; + } + } + } #else - ret = NOT_COMPILED_IN; + /* Do 15 bytes at a time: 255 * 3 / 15 = 51 */ + for (c = 0; c < DILITHIUM_N * 3; c += 24) { + #if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Load 32-bit value and mask out 23 bits. */ + sword32 t0 = *((sword32*)(h + c + 0)) & 0x7fffff; + sword32 t1 = *((sword32*)(h + c + 3)) & 0x7fffff; + sword32 t2 = *((sword32*)(h + c + 6)) & 0x7fffff; + sword32 t3 = *((sword32*)(h + c + 9)) & 0x7fffff; + sword32 t4 = *((sword32*)(h + c + 12)) & 0x7fffff; + sword32 t5 = *((sword32*)(h + c + 15)) & 0x7fffff; + sword32 t6 = *((sword32*)(h + c + 18)) & 0x7fffff; + sword32 t7 = *((sword32*)(h + c + 21)) & 0x7fffff; + #else + /* Load 24-bit value and mask out 23 bits. */ + sword32 t0 = (h[c + 0] + ((sword32)h[c + 1] << 8) + + ((sword32)h[c + 2] << 16)) & 0x7fffff; + sword32 t1 = (h[c + 3] + ((sword32)h[c + 4] << 8) + + ((sword32)h[c + 5] << 16)) & 0x7fffff; + sword32 t2 = (h[c + 6] + ((sword32)h[c + 7] << 8) + + ((sword32)h[c + 8] << 16)) & 0x7fffff; + sword32 t3 = (h[c + 9] + ((sword32)h[c + 10] << 8) + + ((sword32)h[c + 11] << 16)) & 0x7fffff; + sword32 t4 = (h[c + 12] + ((sword32)h[c + 13] << 8) + + ((sword32)h[c + 14] << 16)) & 0x7fffff; + sword32 t5 = (h[c + 15] + ((sword32)h[c + 16] << 8) + + ((sword32)h[c + 17] << 16)) & 0x7fffff; + sword32 t6 = (h[c + 18] + ((sword32)h[c + 19] << 8) + + ((sword32)h[c + 20] << 16)) & 0x7fffff; + sword32 t7 = (h[c + 21] + ((sword32)h[c + 22] << 8) + + ((sword32)h[c + 23] << 16)) & 0x7fffff; + #endif + /* Check if value is in valid range. */ + if (t0 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t0; + } + /* Check if value is in valid range. */ + if (t1 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t1; + } + /* Check if value is in valid range. */ + if (t2 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t2; + } + /* Check if value is in valid range. */ + if (t3 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t3; + } + /* Check if value is in valid range. */ + if (t4 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t4; + } + /* Check if value is in valid range. */ + if (t5 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t5; + } + /* Check if value is in valid range. */ + if (t6 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t6; + } + /* Check if value is in valid range. */ + if (t7 < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. */ + a[j++] = t7; + } + } + if (j < DILITHIUM_N) { + /* Use the remaining triplets, checking we have enough. */ + for (; c < DILITHIUM_GEN_A_BYTES; c += 3) { + #if defined(LITTLE_ENDIAN_ORDER) && \ + (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Load 32-bit value and mask out 23 bits. */ + sword32 t = *((sword32*)(h + c)) & 0x7fffff; + #else + /* Load 24-bit value and mask out 23 bits. */ + sword32 t = (h[c] + ((sword32)h[c+1] << 8) + + ((sword32)h[c+2] << 16)) & 0x7fffff; + #endif + /* Check if value is in valid range. */ + if (t < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. + */ + a[j++] = t; + /* Check we whether we have enough yet. */ + if (j == DILITHIUM_N) { + break; + } + } + } + } +#endif + /* Keep generating more blocks and using triplets until we have enough. + */ + while (j < DILITHIUM_N) { + /* Squeeze out a block - 168 bytes = 56 values. */ + ret = wc_Shake128_SqueezeBlocks(shake128, h, 1); + if (ret != 0) { + break; + } + /* Use triplets until run out or have enough for polynomial. */ + for (c = 0; c < DILITHIUM_GEN_A_BLOCK_BYTES; c += 3) { + #if defined(LITTLE_ENDIAN_ORDER) && \ + (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* Load 32-bit value and mask out 23 bits. */ + sword32 t = *((sword32*)(h + c)) & 0x7fffff; + #else + /* Load 24-bit value and mask out 23 bits. */ + sword32 t = (h[c] + ((sword32)h[c+1] << 8) + + ((sword32)h[c+2] << 16)) & 0x7fffff; + #endif + /* Check if value is in valid range. */ + if (t < DILITHIUM_Q) { + /* Store value in polynomial and increment count of values. + */ + a[j++] = t; + /* Check we whether we have enough yet. */ + if (j == DILITHIUM_N) { + break; + } + } + } + } + } + +#if !defined(WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC) && defined(WOLFSSL_SMALL_STACK) + XFREE(h, NULL, DYNAMIC_TYPE_DILITHIUM); #endif return ret; +#endif } -/* Verify the message using the dilithium public key. +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + (!defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM) || \ + defined(WC_DILITHIUM_CACHE_MATRIX_A))) +/* Expand the seed to create matrix a. * - * sig [in] Signature to verify. - * sigLen [in] Size of signature in bytes. - * msg [in] Message to verify. - * msgLen [in] Length of the message in bytes. - * res [out] *res is set to 1 on successful verification. - * key [in] Dilithium key to use to verify. - * returns BAD_FUNC_ARG when a parameter is NULL or contextLen is zero when and - * BUFFER_E when sigLen is less than DILITHIUM_LEVEL2_SIG_SIZE, - * 0 otherwise. + * FIPS 204. 8.3: Algorithm 26 ExpandA(rho) + * 1: for r from 0 to k - 1 do + * 2: for s from 0 to l - 1 do + * 3: A_hat[r,s] <- RejNTTPoly(rho||IntegerToBits(s,8)|| + * IntegerToBits(r,8)) + * 4: end for + * 5: end for + * 6: return A_hat + * + * @param [in, out] shake128 SHAKE-128 object. + * @param [in] pub_seed Seed to generate stream of data. + * @param [in] k First dimension of matrix a. + * @param [in] l Second dimension of matrix a. + * @param [out] a Matrix of polynomials. + * @return 0 on success. + * @return Negative on hash error. */ -int wc_dilithium_verify_msg(const byte* sig, word32 sigLen, const byte* msg, - word32 msgLen, int* res, dilithium_key* key) +static int dilithium_expand_a(wc_Shake* shake128, const byte* pub_seed, byte k, + byte l, sword32* a) { int ret = 0; -#ifdef HAVE_LIBOQS - OQS_SIG *oqssig = NULL; + byte r; + byte s; + byte seed[DILITHIUM_GEN_A_SEED_SZ]; + + /* Copy the seed into a buffer that has space for s and r. */ + XMEMCPY(seed, pub_seed, DILITHIUM_PUB_SEED_SZ); + /* Step 1: Loop over first dimension of matrix. */ + for (r = 0; (ret == 0) && (r < k); r++) { + /* Put r into buffer to be hashed. */ + seed[DILITHIUM_PUB_SEED_SZ + 1] = r; + /* Step 2: Loop over second dimension of matrix. */ + for (s = 0; (ret == 0) && (s < l); s++) { + /* Put s into buffer to be hashed. */ + seed[DILITHIUM_PUB_SEED_SZ + 0] = s; + /* Step 3: Create polynomial from hashing seed. */ + ret = dilithium_rej_ntt_poly(shake128, seed, a, NULL); + /* Next polynomial. */ + a += DILITHIUM_N; + } + } - if (key == NULL || sig == NULL || msg == NULL || res == NULL) { - ret = BAD_FUNC_ARG; + return ret; +} +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY + +#if !defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_NO_ML_DSA_87) +/* Check random value is in valid range. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 1: if b < 15 + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. Will always be 2 - unused. + * @return 1 when value less than 9. + * @return 0 when value greater than or equal to 9. + */ +#define DILITHIUM_COEFF_S_VALID_ETA2(b) \ + ((b) < DILITHIUM_ETA_2_MOD) + +static const byte dilithium_coeff_eta2[] = { + 2, 1, 0, -1, -2, + 2, 1, 0, -1, -2, + 2, 1, 0, -1, -2 +}; +/* Convert random value 0..15 to a value in range of -2..2. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 1: return 2 - (b mod 5) + * + * @param [in] b Random half-byte (nibble) value. + * @return Value in range of -2..2 on success. + */ +#define DILITHIUM_COEFF_S_ETA2(b) \ + (dilithium_coeff_eta2[b]) +#endif + +#ifndef WOLFSSL_NO_ML_DSA_65 +/* Check random value is in valid range. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 3: if b < 9 + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. Will always be 4 - unused. + * @return 1 when value less than 9. + * @return 0 when value greater than or equal to 9. + */ +#define DILITHIUM_COEFF_S_VALID_ETA4(b) \ + ((b) < DILITHIUM_ETA_4_MOD) + +/* Convert random value 0..15 to a value in range of -4..4. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 3: return 4 - b + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. Will always be 4 - unused. + * @return Value in range of -4..4 on success. + */ +#define DILITHIUM_COEFF_S_ETA4(b) \ + (4 - (b)) +#endif + +#if !defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_NO_ML_DSA_87) +#ifndef WOLFSSL_NO_ML_DSA_65 + +/* Check random value is in valid range. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 1: if eta = 2 and b < 15 + * 2: else + * 3: if eta = 4 and b < 9 + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. + * @return Value in range of -ETA..ETA on success. + */ +#define DILITHIUM_COEFF_S_VALID(b, eta) \ + (((eta) == DILITHIUM_ETA_2) ? DILITHIUM_COEFF_S_VALID_ETA2(b) : \ + DILITHIUM_COEFF_S_VALID_ETA4(b)) + +/* Convert random value 0..15 to a value in range of -ETA..ETA. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 1: if eta = 2 then return 2 - (b mod 5) + * 2: else + * 3: if eta = 4 then return 4 - b + * ... + * 6: end if + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. + * @return Value in range of -ETA..ETA on success. + */ +#define DILITHIUM_COEFF_S(b, eta) \ + (((eta) == DILITHIUM_ETA_2) ? DILITHIUM_COEFF_S_ETA2(b) \ + : DILITHIUM_COEFF_S_ETA4(b)) + +#else + +/* Check random value is in valid range. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 1: if b < 15 + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. Will always be 2 - unused. + * @return 1 when value less than 9. + * @return 0 when value greater than or equal to 9. + */ +#define DILITHIUM_COEFF_S_VALID(b, eta) \ + DILITHIUM_COEFF_S_VALID_ETA2(b) + +/* Convert random value 0..15 to a value in range of -2..2. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 1: return 2 - (b mod 5) + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. Will always be 2 - unused. + * @return Value in range of -2..2 on success. + */ +#define DILITHIUM_COEFF_S(b, eta) \ + DILITHIUM_COEFF_S_ETA2(b) + +#endif /* WOLFSSL_NO_ML_DSA_65 */ + +#else + +/* Check random value is in valid range. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 3: if b < 9 + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. Will always be 4 - unused. + * @return 1 when value less than 9. + * @return 0 when value greater than or equal to 9. + */ +#define DILITHIUM_COEFF_S_VALID(b, eta) \ + DILITHIUM_COEFF_S_VALID_ETA4(b) + +/* Convert random value 0..15 to a value in range of -4..4. + * + * FIPS 204. 8.1: Algorithm 9 CoeffFromHalfByte(b) + * 3: return 4 - b + * + * @param [in] b Random half-byte (nibble) value. + * @param [in] eta Range specifier of result. Will always be 4 - unused. + * @return Value in range of -4..4 on success. + */ +#define DILITHIUM_COEFF_S(b, eta) \ + DILITHIUM_COEFF_S_ETA4(b) + +#endif /* !WOLFSSL_NO_ML_DSA_44 || !WOLFSSL_NO_ML_DSA_87 */ + +/* Extract a coefficient from a nibble of z. + * + * Breaks out of loop when we have enough coefficients. + * + * @param [in] z A random value. + * @param [in] rs Amount to shift right. + * @param [in] t Temporary result. + * @param [in] eta ETA value from parameters. + * @return Value in range -eta..eta on success. + * @return Falsam (0x10) when random value out of range. + */ +#define EXTRACT_COEFF_NIBBLE_CHECK_J(z, rs, t, eta) \ + (t) = (sword8)(((z) >> (rs)) & 0xf); \ + /* Step 7: Check we have a valid coefficient. */ \ + if (DILITHIUM_COEFF_S_VALID(t, eta)) { \ + (t) = DILITHIUM_COEFF_S(t, eta); \ + /* Step 8: Store coefficient as next polynomial value. \ + * Step 9: Increment count of polynomial values set. */ \ + s[j++] = (sword32)(t); \ + if (j == DILITHIUM_N) { \ + break; \ + } \ + } + +/* Extract a coefficient from a nibble of z. + * + * @param [in] z A random value. + * @param [in] rs Amount to shift right. + * @param [in] t Temporary result. + * @param [in] eta ETA value from parameters. + * @return Value in range -eta..eta on success. + * @return Falsam (0x10) when random value out of range. + */ +#define EXTRACT_COEFF_NIBBLE(z, rs, t, eta) \ + (t) = (sword8)(((z) >> (rs)) & 0xf); \ + /* Step 7: Check we have a valid coefficient. */ \ + if (DILITHIUM_COEFF_S_VALID(t, eta)) { \ + (t) = DILITHIUM_COEFF_S(t, eta); \ + /* Step 8: Store coefficient as next polynomial value. \ + * Step 9: Increment count of polynomial values set. */ \ + s[j++] = (sword32)(t); \ + } + + +/* Extract coefficients from hash - z. + * + * FIPS 204. 8.3: Algorithm 25 RejBoundedPoly(rho) + * 2: c <- 0 + * 5: z0 <- CoeffFromHalfByte(z mod 16, eta) + * 6: z1 <- CoeffFromHalfByte(lower(z / 16), eta) + * 7: if z0 != falsam then + * 8: aj <- z0 + * 9: j <- j + 1 + * 10: end if + * 11: if z1 != falsam then + * 12: aj <- z1 + * 13: j <- j + 1 + * 14: end if + * 15: c <- c + 1 + * + * @param [in] z Hash data to extract coefficients from. + * @param [in] zLen Length of z in bytes. + * @param [in] eta Range specifier of each value. + * @param [out] s Polynomial to fill with coefficients. + * @param [in, out] cnt Current count of coefficients in polynomial. + */ +static void dilithium_extract_coeffs(byte* z, unsigned int zLen, byte eta, + sword32* s, unsigned int* cnt) +{ +#ifdef WOLFSSL_DILITHIUM_NO_LARGE_CODE + unsigned int j = *cnt; + unsigned int c; + + (void)eta; + + /* Extract values from the squeezed data. */ + for (c = 0; c < zLen; c++) { + sword8 t; + + /* Step 5: Get coefficient from bottom nibble. */ + EXTRACT_COEFF_NIBBLE_CHECK_J(z[c], 0, t, eta); + /* Step 6: Get coefficient from top nibble. */ + EXTRACT_COEFF_NIBBLE_CHECK_J(z[c], 4, t, eta); } - if ((ret == 0) && (!key->pubKeySet)) { - ret = BAD_FUNC_ARG; + *cnt = j; +#else + unsigned int j = *cnt; + unsigned int c; + unsigned int min = (DILITHIUM_N - j) / 2; + + (void)eta; + +#if defined(LITTLE_ENDIAN_ORDER) +#ifdef WC_64BIT_CPU + min &= ~(unsigned int)7; + /* Extract values from the squeezed data. */ + for (c = 0; c < min; c += 8) { + word64 z64 = *(word64*)(z + c); + sword8 t; + + /* Do each nibble from lowest to highest 16 at a time. */ + EXTRACT_COEFF_NIBBLE(z64, 0, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 4, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 8, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 12, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 16, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 20, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 24, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 28, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 32, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 36, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 40, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 44, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 48, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 52, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 56, t, eta); + EXTRACT_COEFF_NIBBLE(z64, 60, t, eta); } +#else + min &= ~(unsigned int)3; + /* Extract values from the squeezed data. */ + for (c = 0; c < min; c += 4) { + word32 z32 = *(word32*)(z + c); + sword8 t; + + /* Do each nibble from lowest to highest 8 at a time. */ + EXTRACT_COEFF_NIBBLE(z32, 0, t, eta); + EXTRACT_COEFF_NIBBLE(z32, 4, t, eta); + EXTRACT_COEFF_NIBBLE(z32, 8, t, eta); + EXTRACT_COEFF_NIBBLE(z32, 12, t, eta); + EXTRACT_COEFF_NIBBLE(z32, 16, t, eta); + EXTRACT_COEFF_NIBBLE(z32, 20, t, eta); + EXTRACT_COEFF_NIBBLE(z32, 24, t, eta); + EXTRACT_COEFF_NIBBLE(z32, 28, t, eta); + } +#endif +#else + /* Extract values from the squeezed data. */ + for (c = 0; c < min; c++) { + sword8 t; + + /* Step 5: Get coefficient from bottom nibble. */ + EXTRACT_COEFF_NIBBLE(z[c], 0, t, eta); + EXTRACT_COEFF_NIBBLE(z[c], 4, t, eta); + } +#endif + if (j != DILITHIUM_N) { + /* Extract values from the squeezed data. */ + for (; c < zLen; c++) { + sword8 t; - if (ret == 0) { - if (key->level == 2) { - oqssig = OQS_SIG_new(OQS_SIG_alg_dilithium_2); + EXTRACT_COEFF_NIBBLE_CHECK_J(z[c], 0, t, eta); + EXTRACT_COEFF_NIBBLE_CHECK_J(z[c], 4, t, eta); } - else if (key->level == 3) { - oqssig = OQS_SIG_new(OQS_SIG_alg_dilithium_3); + } + + *cnt = j; +#endif +} + +/* Create polynomial from hashing the seed with bounded values. + * + * FIPS 204. 8.3: Algorithm 25 RejBoundedPoly(rho) + * 1: j <- 0 + * ... + * 3: while j < 256 do + * 4: z <- H(rho)[[c]] + * ... [Extract coefficients into polynomial from z] + * 16: end while + * 17: return a + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [in] seed Seed, rho, to hash to generate values. + * @param [in] eta Range specifier of each value. + * @return 0 on success. + * @return Negative on hash error. + */ +static int dilithium_rej_bound_poly(wc_Shake* shake256, byte* seed, sword32* s, + byte eta) +{ +#ifdef WOLFSSL_DILITHIUM_SMALL + int ret; + unsigned int j = 0; + byte z[DILITHIUM_GEN_S_BLOCK_BYTES]; + + /* Initialize SHAKE-256 object for new hash. */ + ret = wc_InitShake256(shake256, NULL, INVALID_DEVID); + if (ret == 0) { + /* Absorb the seed. */ + ret = wc_Shake256_Absorb(shake256, seed, DILITHIUM_GEN_S_SEED_SZ); + } + if (ret == 0) { + do { + /* Squeeze out another block. */ + ret = wc_Shake256_SqueezeBlocks(shake256, z, 1); + if (ret != 0) { + break; + } + /* Extract up to the 256 valid coefficients for polynomial. */ + dilithium_extract_coeffs(z, DILITHIUM_GEN_S_BLOCK_BYTES, eta, s, + &j); } - else if (key->level == 5) { - oqssig = OQS_SIG_new(OQS_SIG_alg_dilithium_5); + /* Check we got enough values to fill polynomial. */ + while (j < DILITHIUM_N); + } + + return ret; +#else + int ret; + unsigned int j = 0; + byte z[DILITHIUM_GEN_S_BYTES]; + + /* Absorb seed and squeeze out some blocks. */ + ret = dilithium_squeeze256(shake256, seed, DILITHIUM_GEN_S_SEED_SZ, z, + DILITHIUM_GEN_S_NBLOCKS); + if (ret == 0) { + /* Extract up to 256 valid coefficients for polynomial. */ + dilithium_extract_coeffs(z, DILITHIUM_GEN_S_BYTES, eta, s, &j); + /* Check we got enough values to fill polynomial. */ + while (j < DILITHIUM_N) { + /* Squeeze out another block. */ + ret = wc_Shake256_SqueezeBlocks(shake256, z, 1); + if (ret != 0) { + break; + } + /* Extract up to the 256 valid coefficients for polynomial. */ + dilithium_extract_coeffs(z, DILITHIUM_GEN_S_BLOCK_BYTES, eta, s, + &j); } - else { - ret = SIG_TYPE_E; + } + + return ret; +#endif +} + +/* Expand private seed into vectors s1 and s2. + * + * FIPS 204. 8.3: Algorithm 27 ExpandS(rho) + * 1: for r from 0 to l - 1 do + * 2: s1[r] <- RejBoundedPoly(rho||IntegerToBits(r,16)) + * 3: end for + * 4: for r from 0 to k - 1 do + * 5: s2[r] <- RejBoundedPoly(rho||IntegerToBits(r + l,16)) + * 6: end for + * 7: return (s1,s2) + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [in] priv_seed Private seed, rho, to expand. + * @param [in] eta Range specifier of each value. + * @param [out] s1 First vector of polynomials. + * @param [in] s1Len Dimension of first vector. + * @param [out] s2 Second vector of polynomials. + * @param [in] s2Len Dimension of second vector. + * @return 0 on success. + * @return Negative on hash error. + */ +static int dilithium_expand_s(wc_Shake* shake256, byte* priv_seed, byte eta, + sword32* s1, byte s1Len, sword32* s2, byte s2Len) +{ + int ret = 0; + byte r; + byte seed[DILITHIUM_GEN_S_SEED_SZ]; + + /* Copy the seed into a buffer that has space for r. */ + XMEMCPY(seed, priv_seed, DILITHIUM_PRIV_SEED_SZ); + /* Set top 8-bits of r in buffer to 0. */ + seed[DILITHIUM_PRIV_SEED_SZ + 1] = 0; + /* Step 1: Each polynomial in s1. */ + for (r = 0; (ret == 0) && (r < s1Len); r++) { + /* Set bottom 8-bits of r into buffer - little endian. */ + seed[DILITHIUM_PRIV_SEED_SZ] = r; + + /* Step 2: Generate polynomial for s1. */ + ret = dilithium_rej_bound_poly(shake256, seed, s1, eta); + /* Next polynomial in s1. */ + s1 += DILITHIUM_N; + } + /* Step 4: Each polynomial in s2. */ + for (r = 0; (ret == 0) && (r < s2Len); r++) { + /* Set bottom 8-bits of r + l into buffer - little endian. */ + seed[DILITHIUM_PRIV_SEED_SZ] = r + s1Len; + /* Step 5: Generate polynomial for s1. */ + ret = dilithium_rej_bound_poly(shake256, seed, s2, eta); + /* Next polynomial in s2. */ + s2 += DILITHIUM_N; + } + + return ret; +} + +#endif /* !WOLFSSL_DILITHIUM_NO_MAKE_KEY */ + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN +/* Expand the private random seed into vector y. + * + * FIPS 204. 8.3: Algorithm 28 ExpandMask(rho, mu) + * 1: c <- 1 + bitlen(GAMMA1 - 1) + * 2: for r from 0 to l - 1 do + * 3: n <- IntegerToBits(mu + r, 16) + * 4: v <- (H(rho||n)[[32rc]], H(rho||n)[[32rc + 1]], ..., + * H(rho||n)[[32rc + 32c - 1]]) + * 5: s[r] <- BitUnpack(v, GAMMA-1, GAMMA1) + * 6: end for + * 7: return s + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [in, out] seed Buffer containing seed to expand. + * Has space for two bytes to be appended. + * @param [in] kappa Base value to append to seed. + * @param [in] gamma1_bits Number of bits per value. + * @param [out] y Vector of polynomials. + * @param [in] l Dimension of vector. + * @return 0 on success. + * @return Negative on hash error. + */ +static int dilithium_vec_expand_mask(wc_Shake* shake256, byte* seed, + word16 kappa, byte gamma1_bits, sword32* y, byte l) +{ + int ret = 0; + byte r; + byte v[DILITHIUM_MAX_V]; + + /* Step 2: For each polynomial of vector. */ + for (r = 0; (ret == 0) && (r < l); r++) { + /* Step 3: Calculate value to append to seed. */ + word16 n = kappa + r; + + /* Step 4: Append to seed and squeeze out data. */ + seed[DILITHIUM_PRIV_RAND_SEED_SZ + 0] = n; + seed[DILITHIUM_PRIV_RAND_SEED_SZ + 1] = n >> 8; + ret = dilithium_squeeze256(shake256, seed, DILITHIUM_Y_SEED_SZ, v, + DILITHIUM_MAX_V_BLOCKS); + if (ret == 0) { + /* Decode v into polynomial. */ + dilithium_decode_gamma1(v, gamma1_bits, y); + /* Next polynomial. */ + y += DILITHIUM_N; } } - if ((ret == 0) && - (OQS_SIG_verify(oqssig, msg, msgLen, sig, sigLen, key->p) - == OQS_ERROR)) { - ret = SIG_VERIFY_E; + return ret; +} +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) +/* Expand commit to a polynomial. + * + * FIPS 204. 8.3: Algorithm 23 SampleInBall(rho) + * 1: c <- 0 + * 2: k <- 8 + * 3: for i from 256 - TAU to 255 do + * 4: while H(rho)[[k]] > i do + * 5: k <- k + 1 + * 6: end while + * 7: j <- H(rho)[[k]] + * 8: c[i] <- c[j] + * 9: c[j] <- (-1)^H(rho)[i+TAU-256] + * 10: k <- k + 1 + * 11: end for + * 12: return c + * + * @param [in] shake256 SHAKE-256 object. + * @param [in] seed Buffer containing seed to expand. + * @param [in] tau Number of +/- 1s in polynomial. + * @param [out] c Commit polynomial. + * @param [in] key_block Memory to use for block from key. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. + * @return Negative on hash error. + */ +static int dilithium_sample_in_ball(wc_Shake* shake256, const byte* seed, + byte tau, sword32* c, byte* key_block) +{ + int ret = 0; + unsigned int k; + unsigned int i; + unsigned int s; +#if defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC) + byte* block = NULL; +#else + byte block[DILITHIUM_GEN_C_BLOCK_BYTES]; +#endif + byte signs[DILITHIUM_SIGN_BYTES]; + + (void)key_block; + +#ifdef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC + block = key_block; +#elif defined(WOLFSSL_SMALL_STACK) + block = (byte*)XMALLOC(DILITHIUM_GEN_C_BLOCK_BYTES, NULL, + DYNAMIC_TYPE_DILITHIUM); + if (block == NULL) { + ret = MEMORY_E; } +#endif if (ret == 0) { - *res = 1; + /* Set polynomial to all zeros. */ + XMEMSET(c, 0, DILITHIUM_POLY_SIZE); + + /* Generate a block of data from seed. */ + ret = dilithium_shake256(shake256, seed, DILITHIUM_SEED_SZ, block, + DILITHIUM_GEN_C_BLOCK_BYTES); } + if (ret == 0) { + /* Copy first 8 bytes of first hash block as random sign bits. */ + XMEMCPY(signs, block, DILITHIUM_SIGN_BYTES); + /* Step 1: Initialize sign bit index. */ + s = 0; + /* Step 2: First 8 bytes are used for sign. */ + k = DILITHIUM_SIGN_BYTES; + } + + /* Step 3: Put in TAU +/- 1s. */ + for (i = DILITHIUM_N - tau; (ret == 0) && (i < DILITHIUM_N); i++) { + unsigned int j; + do { + /* Check whether block is exhausted. */ + if (k == DILITHIUM_GEN_C_BLOCK_BYTES) { + /* Generate a new block. */ + ret = wc_Shake256_SqueezeBlocks(shake256, block, 1); + /* Restart hash block index. */ + k = 0; + } + /* Step 7: Get random byte from block as index. + * Step 5 and 10: Increment hash block index. + */ + j = block[k++]; + } + /* Step 4: Get another random if random index is a future swap index. */ + while ((ret == 0) && (j > i)); - if (oqssig != NULL) { - OQS_SIG_free(oqssig); + /* Step 8: Move value from random index to current index. */ + c[i] = c[j]; + /* Step 9: Set value at random index to +/- 1. */ + c[j] = 1 - ((((signs[s >> 3]) >> (s & 0x7)) & 0x1) << 1); + /* Next sign bit index. */ + s++; } + +#if !defined(WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC) && defined(WOLFSSL_SMALL_STACK) + XFREE(block, NULL, DYNAMIC_TYPE_DILITHIUM); +#endif + return ret; +} +#endif + +/****************************************************************************** + * Decompose operations + ******************************************************************************/ + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) +#ifndef WOLFSSL_NO_ML_DSA_44 +/* Decompose value into high and low based on GAMMA2 being ((q-1) / 88). + * + * FIPS 204. 8.4: Algorithm 30 Decompose(r) + * 1: r+ <- r mod q + * 2: r0 <- r+ mod+/- (2 * GAMMA2) + * 3: if r+ - r0 = q - 1 then + * 4: r1 <- 0 + * 5: r0 <- r0 - 1 + * 6: else r1 <- (r+ - r0) / (2 * GAMMA2) + * 7: end if + * 8: return (r1, r0) + * + * DILITHIUM_Q_LOW_88_2 = 0x2e800 = 0b101110100000000000 + * t1 * DILITHIUM_Q_LOW_88_2 = (t1 << 18) - (t1 << 16) - (t1 << 12) - (t1 << 11) + * = ((93 * t1) << 11) + * Nothing faster than straight multiply. + * + * Implementation using Barrett Reduction. + * + * @param [in] r Value to decompose. + * @param [out] r0 Low bits. + * @param [out] r1 High bits. + */ +static void dilithium_decompose_q88(sword32 r, sword32* r0, sword32* r1) +{ + sword32 t0; + sword32 t1; +#ifdef DILITHIUM_MUL_SLOW + sword32 t2; +#endif + + /* Roundup r and calculate approx high value. */ +#if !defined(DILITHIUM_MUL_44_SLOW) + t1 = ((r * 44) + ((DILITHIUM_Q_LOW_88 - 1) * 44)) >> 23; +#elif !defined(DILITHIUM_MUL_11_SLOW) + t1 = ((r * 11) + ((DILITHIUM_Q_LOW_88 - 1) * 11)) >> 21; #else - ret = NOT_COMPILED_IN; + t0 = r + DILITHIUM_Q_LOW_88 - 1; + t1 = ((t0 << 3) + (t0 << 1) + t0) >> 21; +#endif + /* Calculate approx low value. */ + t0 = r - (t1 * DILITHIUM_Q_LOW_88_2); +#ifndef DILITHIUM_MUL_SLOW + /* Calculate real high value, When t0 > modulus, +1 to approx high value. */ + t1 += ((word32)(DILITHIUM_Q_LOW_88 - t0)) >> 31; + /* Calculate real low value. */ + t0 = r - (t1 * DILITHIUM_Q_LOW_88_2); +#else + /* Calculate real high value, When t0 > modulus, +1 to approx high value. */ + t2 = ((word32)(DILITHIUM_Q_LOW_88 - t0)) >> 31; + t1 += t2; + /* Calculate real low value. */ + t0 -= (0 - t2) & DILITHIUM_Q_LOW_88_2; +#endif + /* -1 from low value if high value is 44. Was 43 but low is negative. */ + t0 -= ((word32)(43 - t1)) >> 31; + /* When high value is 44, too large, set to 0. */ + t1 &= 0 - (((word32)(t1 - 44)) >> 31); + + *r0 = t0; + *r1 = t1; +} #endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) +/* Decompose value into high and low based on GAMMA2 being ((q-1) / 32). + * + * FIPS 204. 8.4: Algorithm 30 Decompose(r) + * 1: r+ <- r mod q + * 2: r0 <- r+ mod+/- (2 * GAMMA2) + * 3: if r+ - r0 = q - 1 then + * 4: r1 <- 0 + * 5: r0 <- r0 - 1 + * 6: else r1 <- (r+ - r0) / (2 * GAMMA2) + * 7: end if + * 8: return (r1, r0) + * + * DILITHIUM_Q_LOW_32_2 = 0x7fe00 = 0b1111111111000000000 + * t1 * DILITHIUM_Q_LOW_32_2 = (t1 << 19) - (t1 << 9) + * + * Implementation using Barrett Reduction. + * + * @param [in] r Value to decompose. + * @param [out] r0 Low bits. + * @param [out] r1 High bits. + */ +static void dilithium_decompose_q32(sword32 r, sword32* r0, sword32* r1) +{ + sword32 t0; + sword32 t1; + + /* Roundup r and calculate approx high value. */ + t1 = (r + DILITHIUM_Q_LOW_32 - 1) >> 19; + /* Calculate approx low value. */ + t0 = r - (t1 << 19) + (t1 << 9); + /* Calculate real high value, When t0 > modulus, +1 to approx high value. */ + t1 += ((word32)(DILITHIUM_Q_LOW_32 - t0)) >> 31; + /* Calculate real low value. */ + t0 = r - (t1 << 19) + (t1 << 9); + /* -1 from low value if high value is 16. Was 15 but low is negative. */ + t0 -= t1 >> 4; + /* When high value is 16, too large, set to 0. */ + t1 &= 0xf; + + *r0 = t0; + *r1 = t1; +} +#endif +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + +#ifndef WOLFSSL_DILITHIUM_SIGN_SMALL_MEM +/* Decompose vector of polynomials into high and low based on GAMMA2. + * + * @param [in] r Vector of polynomials to decompose. + * @param [in] k Dimension of vector. + * @param [in] gamma2 Low-order rounding range, GAMMA2. + * @param [out] r0 Low parts in vector of polynomials. + * @param [out] r1 High parts in vector of polynomials. + */ +static void dilithium_vec_decompose(const sword32* r, byte k, sword32 gamma2, + sword32* r0, sword32* r1) +{ + unsigned int i; + unsigned int j; + + (void)k; + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (gamma2 == DILITHIUM_Q_LOW_88) { + /* For each polynomial of vector. */ + for (i = 0; i < PARAMS_ML_DSA_44_K; i++) { + /* For each value of polynomial. */ + for (j = 0; j < DILITHIUM_N; j++) { + /* Decompose value into two vectors. */ + dilithium_decompose_q88(r[j], &r0[j], &r1[j]); + } + /* Next polynomial of vectors. */ + r += DILITHIUM_N; + r0 += DILITHIUM_N; + r1 += DILITHIUM_N; + } + } + else +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (gamma2 == DILITHIUM_Q_LOW_32) { + /* For each polynomial of vector. */ + for (i = 0; i < k; i++) { + /* For each value of polynomial. */ + for (j = 0; j < DILITHIUM_N; j++) { + /* Decompose value into two vectors. */ + dilithium_decompose_q32(r[j], &r0[j], &r1[j]); + } + /* Next polynomial of vectors. */ + r += DILITHIUM_N; + r0 += DILITHIUM_N; + r1 += DILITHIUM_N; + } + } + else +#endif + { + } +} +#endif + +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +/****************************************************************************** + * Range check operation + ******************************************************************************/ + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) +/* Check that the values of the polynomial are in range. + * + * Many places in FIPS 204. One example from Algorithm 2: + * 23: if ||z||inf >= GAMMA1 - BETA or ..., then (z, h) = falsam + * + * @param [in] a Polynomial. + * @param [in] hi Largest value in range. + */ +static int dilithium_check_low(const sword32* a, sword32 hi) +{ + int ret = 1; + unsigned int j; + /* Calculate lowest range value. */ + sword32 nhi = -hi; + + /* For each value of polynomial. */ + for (j = 0; j < DILITHIUM_N; j++) { + /* Check range is -(hi-1)..(hi-1). */ + if ((a[j] <= nhi) || (a[j] >= hi)) { + /* Check failed. */ + ret = 0; + break; + } + } + return ret; } -/* Initialize the dilithium private/public key. +#if (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM)) +/* Check that the values of the vector are in range. * - * key [in] Dilithium key. - * returns BAD_FUNC_ARG when key is NULL + * Many places in FIPS 204. One example from Algorithm 2: + * 23: if ||z||inf >= GAMMA1 - BETA or ..., then (z, h) = falsam + * + * @param [in] a Vector of polynomials. + * @param [in] l Dimension of vector. + * @param [in] hi Largest value in range. */ -int wc_dilithium_init(dilithium_key* key) +static int dilithium_vec_check_low(const sword32* a, byte l, sword32 hi) { - if (key == NULL) { - return BAD_FUNC_ARG; + int ret = 1; + unsigned int i; + + /* For each polynomial of vector. */ + for (i = 0; (ret == 1) && (i < l); i++) { + ret = dilithium_check_low(a, hi); + if (ret == 0) { + break; + } + /* Next polynomial. */ + a += DILITHIUM_N; } - ForceZero(key, sizeof(key)); - return 0; + return ret; } +#endif +#endif -/* Set the level of the dilithium private/public key. +/****************************************************************************** + * Hint operations + ******************************************************************************/ + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + +#ifndef WOLFSSL_NO_ML_DSA_44 +/* Compute hints indicating whether adding ct0 to w alters high bits of w. * - * key [out] Dilithium key. - * level [in] Either 2,3 or 5. - * returns BAD_FUNC_ARG when key is NULL or level is a bad values. + * FIPS 204. 6: Algorithm 2 ML-DSA.Sign(sk, M) + * ... + * 26: h <- MakeHint(-<>, w - <> + <>) + * 27: if ... or the number of 1's in h is greater than OMEGA, then + * (z, h) <- falsam + * ... + * 32: sigma <- sigEncode(c_tilda, z mod+/- q, h) + * ... + * + * FIPS 204. 8.4: Algorithm 33 MakeHint(z, r) + * 1: r1 <- HighBits(r) + * 2: v1 <- HightBits(r+z) + * 3: return [[r1 != v1]] + * + * FIPS 204. 8.2: Algorithm 20 sigEncode(c_tilde, z, h) + * ... + * 5: sigma <- sigma || HintBitPack(h) + * ... + * + * FIPS 204. 8.1: Algorithm 14 HintBitPack(h) + * ... + * 4: for j from 0 to 255 do + * 5: if h[i]j != 0 then + * 6: y[Index] <- j + * 7: Index <- Index + 1 + * 8: end if + * 9: end for + * ... + * + * @param [in] s Vector of polynomials that is sum of ct0 and w0. + * @param [in] w1 Vector of polynomials that is high part of w. + * @param [out] h Encoded hints. + * @param [in, out] idxp Index to write next hint into. + * return Number of hints on success. + * return Falsam of -1 when too many hints. */ -int wc_dilithium_set_level(dilithium_key* key, byte level) +static int dilithium_make_hint_88(const sword32* s, const sword32* w1, byte* h, + byte *idxp) { - if (key == NULL) { - return BAD_FUNC_ARG; + unsigned int j; + byte idx = *idxp; + + /* Alg 14, Step 3: For each value of polynomial. */ + for (j = 0; j < DILITHIUM_N; j++) { + /* Alg 14, Step 4: Check whether hint is required. + * Did sum end up greater than low modulus or + * sum end up less than the negative of low modulus or + * sum is the negative of the low modulus and w1 is not zero, + * then w1 will be modified. + */ + if ((s[j] > (sword32)DILITHIUM_Q_LOW_88) || + (s[j] < -(sword32)DILITHIUM_Q_LOW_88) || + ((s[j] == -(sword32)DILITHIUM_Q_LOW_88) && + (w1[j] != 0))) { + /* Alg 14, Step 6, 7: Put index as hint modifier. */ + h[idx++] = (byte)j; + /* Alg 2, Step 27: If there are too many hints, return + * falsam of -1. */ + if (idx > PARAMS_ML_DSA_44_OMEGA) { + return -1; + } + } } - if (level != 2 && level != 3 && level != 5) { - return BAD_FUNC_ARG; + *idxp = idx; + return 0; +} +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) +/* Compute hints indicating whether adding ct0 to w alters high bits of w. + * + * FIPS 204. 6: Algorithm 2 ML-DSA.Sign(sk, M) + * ... + * 26: h <- MakeHint(-<>, w - <> + <>) + * 27: if ... or the number of 1's in h is greater than OMEGA, then + * (z, h) <- falsam + * ... + * 32: sigma <- sigEncode(c_tilda, z mod+/- q, h) + * ... + * + * FIPS 204. 8.4: Algorithm 33 MakeHint(z, r) + * 1: r1 <- HighBits(r) + * 2: v1 <- HightBits(r+z) + * 3: return [[r1 != v1]] + * + * FIPS 204. 8.2: Algorithm 20 sigEncode(c_tilde, z, h) + * ... + * 5: sigma <- sigma || HintBitPack(h) + * ... + * + * FIPS 204. 8.1: Algorithm 14 HintBitPack(h) + * ... + * 4: for j from 0 to 255 do + * 5: if h[i]j != 0 then + * 6: y[Index] <- j + * 7: Index <- Index + 1 + * 8: end if + * 9: end for + * ... + * + * @param [in] s Vector of polynomials that is sum of ct0 and w0. + * @param [in] w1 Vector of polynomials that is high part of w. + * @param [in] omega Maximum number of hints allowed. + * @param [out] h Encoded hints. + * @param [in, out] idxp Index to write next hint into. + * return Number of hints on success. + * return Falsam of -1 when too many hints. + */ +static int dilithium_make_hint_32(const sword32* s, const sword32* w1, + byte omega, byte* h, byte *idxp) +{ + unsigned int j; + byte idx = *idxp; + + (void)omega; + + /* Alg 14, Step 3: For each value of polynomial. */ + for (j = 0; j < DILITHIUM_N; j++) { + /* Alg 14, Step 4: Check whether hint is required. + * Did sum end up greater than low modulus or + * sum end up less than the negative of low modulus or + * sum is the negative of the low modulus and w1 is not zero, + * then w1 will be modified. + */ + if ((s[j] > (sword32)DILITHIUM_Q_LOW_32) || + (s[j] < -(sword32)DILITHIUM_Q_LOW_32) || + ((s[j] == -(sword32)DILITHIUM_Q_LOW_32) && + (w1[j] != 0))) { + /* Alg 14, Step 6, 7: Put index as hint modifier. */ + h[idx++] = (byte)j; + /* Alg 2, Step 27: If there are too many hints, return + * falsam of -1. */ + if (idx > omega) { + return -1; + } + } } - key->level = level; - key->pubKeySet = 0; - key->prvKeySet = 0; + *idxp = idx; return 0; } +#endif -/* Get the level of the dilithium private/public key. +#ifndef WOLFSSL_DILITHIUM_SIGN_SMALL_MEM +/* Compute hints indicating whether adding ct0 to w alters high bits of w. * - * key [in] Dilithium key. - * level [out] The level. - * returns BAD_FUNC_ARG when key is NULL or level has not been set. + * FIPS 204. 6: Algorithm 2 ML-DSA.Sign(sk, M) + * ... + * 26: h <- MakeHint(-<>, w - <> + <>) + * 27: if ... or the number of 1's in h is greater than OMEGA, then + * (z, h) <- falsam + * ... + * 32: sigma <- sigEncode(c_tilda, z mod+/- q, h) + * ... + * + * FIPS 204. 8.4: Algorithm 33 MakeHint(z, r) + * 1: r1 <- HighBits(r) + * 2: v1 <- HightBits(r+z) + * 3: return [[r1 != v1]] + * + * FIPS 204. 8.2: Algorithm 20 sigEncode(c_tilde, z, h) + * ... + * 5: sigma <- sigma || HintBitPack(h) + * ... + * + * FIPS 204. 8.1: Algorithm 14 HintBitPack(h) + * ... + * 2: Index <- 0 + * 3. for i from 0 to k - 1 do + * 4: for j from 0 to 255 do + * 5: if h[i]j != 0 then + * 6: y[Index] <- j + * 7: Index <- Index + 1 + * 8: end if + * 9: end for + * 10: y[OMEGA + i] <- Index + * 11: end for + * 12: return y + * + * @param [in] s Vector of polynomials that is sum of ct0 and w0. + * @param [in] w1 Vector of polynomials that is high part of w. + * @param [in] k Dimension of vectors. + * @param [in] gamma2 Low-order rounding range, GAMMA2. + * @param [in] omega Maximum number of hints allowed. + * @param [out] h Encoded hints. + * return Number of hints on success. + * return Falsam of -1 when too many hints. */ -int wc_dilithium_get_level(dilithium_key* key, byte* level) +static int dilithium_make_hint(const sword32* s, const sword32* w1, byte k, + word32 gamma2, byte omega, byte* h) { - if (key == NULL || level == NULL) { - return BAD_FUNC_ARG; + unsigned int i; + byte idx = 0; + + (void)k; + (void)omega; + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (gamma2 == DILITHIUM_Q_LOW_88) { + /* Alg 14, Step 2: For each polynomial of vector. */ + for (i = 0; i < PARAMS_ML_DSA_44_K; i++) { + if (dilithium_make_hint_88(s, w1, h, &idx) == -1) { + return -1; + } + /* Alg 14, Step 10: Store count of hints for polynomial at end of + * list. */ + h[PARAMS_ML_DSA_44_OMEGA + i] = idx; + /* Next polynomial. */ + s += DILITHIUM_N; + w1 += DILITHIUM_N; + } + } + else +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (gamma2 == DILITHIUM_Q_LOW_32) { + /* Alg 14, Step 2: For each polynomial of vector. */ + for (i = 0; i < k; i++) { + if (dilithium_make_hint_32(s, w1, omega, h, &idx) == -1) { + return -1; + } + /* Alg 14, Step 10: Store count of hints for polynomial at end of + * list. */ + h[omega + i] = idx; + /* Next polynomial. */ + s += DILITHIUM_N; + w1 += DILITHIUM_N; + } + } + else +#endif + { } - if (key->level != 2 && key->level != 3 && key->level != 5) { - return BAD_FUNC_ARG; + /* Set remaining hints to zero. */ + XMEMSET(h + idx, 0, omega - idx); + return idx; +} +#endif /* !WOLFSSL_DILITHIUM_SIGN_SMALL_MEM */ + +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY +/* Check that the hints are valid. + * + * @param [in] h Hints to check + * @param [in] k Dimension of vector. + * @param [in] omega Maximum number of hints. Hint counts after this index. + * @return 0 when hints valid. + * @return SIG_VERIFY_E when hints invalid. + */ +static int dilithium_check_hint(const byte* h, byte k, byte omega) +{ + int ret = 0; + unsigned int o = 0; + unsigned int i; + + /* Skip polynomial index while count is 0. */ + while ((h[omega + o] == 0) && (o < k)) { + o++; + } + /* Check all possible hints. */ + for (i = 1; i < omega; i++) { + /* Done with polynomial if index equals count of hints. */ + if (i == h[omega + o]) { + /* Next polynomial index while count is index. */ + do { + o++; + } + while ((o < k) && (i == h[omega + o])); + /* Stop if hints for all polynomials checked. */ + if (o == k) { + break; + } + } + /* Ensure the last hint is less than the current hint. */ + else if (h[i - 1] > h[i]) { + ret = SIG_VERIFY_E; + break; + } + } + if (ret == 0) { + /* Use up any sizes that are the last element. */ + while ((o < k) && (i == h[omega + o])) { + o++; + } + /* Ensure all sizes were used. */ + if (o != k) { + ret = SIG_VERIFY_E; + } + } + /* Check remaining hints are 0. */ + for (; (ret == 0) && (i < omega); i++) { + if (h[i] != 0) { + ret = SIG_VERIFY_E; + } } - *level = key->level; - return 0; + return ret; } -/* Clears the dilithium key data +#ifndef WOLFSSL_NO_ML_DSA_44 +/* Use hints to modify w1. * - * key [in] Dilithium key. + * FIPS 204. 8.4: Algorithm 34 UseHint(h, r) + * 1: m <- (q - 1) / (2 * GAMMA2) + * 2: (r1, r0) <- Decompose(r) + * 3: if h == 1 and r0 > 0 return (r1 + 1) mod m + * 4: if h == 1 and r0 <= 0 return (r1 - 1) mod m + * 5: return r1 + * + * @param [in, out] w1 Vector of polynomials needing hints applied to. + * @param [in] h Hints to apply. In signature encoding. + * @param [in] i Dimension index. + * @param [in, out] op Pointer to current offset into hints. */ -void wc_dilithium_free(dilithium_key* key) +static void dilithium_use_hint_88(sword32* w1, const byte* h, unsigned int i, + byte* op) { - if (key != NULL) { - ForceZero(key, sizeof(key)); + byte o = *op; + unsigned int j; + + /* For each value of polynomial. */ + for (j = 0; j < DILITHIUM_N; j++) { + sword32 r; + sword32 r0; + sword32 r1; +#ifdef DILITHIUM_USE_HINT_CT + /* Hint is 1 when index is next in hint list. */ + sword32 hint = ((o < h[PARAMS_ML_DSA_44_OMEGA + i]) & + (h[o] == (byte)j)); + + /* Increment hint offset if this index has hint. */ + o += hint; + /* Convert value to positive only range. */ + r = w1[j] + ((0 - (((word32)w1[j]) >> 31)) & DILITHIUM_Q); + /* Decompose value into low and high parts. */ + dilithium_decompose_q88(r, &r0, &r1); + /* Make hint positive or negative based on sign of r0. */ + hint = (1 - (2 * (((word32)r0) >> 31))) & (0 - hint); + /* Make w1 only the top part plus the hint. */ + w1[j] = r1 + hint; + + /* Fix up w1 to not be 44 but 0. */ + w1[j] &= 0 - (((word32)(w1[j] - 44)) >> 31); + /* Hint may have reduced 0 to -1 which is actually 43. */ + w1[j] += (0 - (((word32)w1[j]) >> 31)) & 44; +#else + /* Convert value to positive only range. */ + r = w1[j] + ((0 - (((word32)w1[j]) >> 31)) & DILITHIUM_Q); + /* Decompose value into low and high parts. */ + dilithium_decompose_q88(r, &r0, &r1); + /* Check for hint. */ + if ((o < h[PARAMS_ML_DSA_44_OMEGA + i]) && (h[o] == (byte)j)) { + /* Add or subtrac hint based on sign of r0. */ + r1 += 1 - (2 * (((word32)r0) >> 31)); + /* Go to next hint offset. */ + o++; + } + /* Fix up w1 to not be 44 but 0. */ + r1 &= 0 - (((word32)(r1 - 44)) >> 31); + /* Hint may have reduced 0 to -1 which is actually 43. */ + r1 += (0 - (((word32)r1) >> 31)) & 44; + /* Make w1 only the top part plus any hint. */ + w1[j] = r1; +#endif } + *op = o; } +#endif /* !WOLFSSL_NO_ML_DSA_44 */ -/* Export the dilithium public key. +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) +/* Use hints to modify w1. + * + * FIPS 204. 8.4: Algorithm 34 UseHint(h, r) + * 1: m <- (q - 1) / (2 * GAMMA2) + * 2: (r1, r0) <- Decompose(r) + * 3: if h == 1 and r0 > 0 return (r1 + 1) mod m + * 4: if h == 1 and r0 <= 0 return (r1 - 1) mod m + * 5: return r1 * - * key [in] Dilithium public key. - * out [in] Array to hold public key. - * outLen [in/out] On in, the number of bytes in array. - * On out, the number bytes put into array. - * returns BAD_FUNC_ARG when a parameter is NULL, - * BUFFER_E when outLen is less than DILITHIUM_LEVEL2_PUB_KEY_SIZE, - * 0 otherwise. + * @param [in, out] w1 Vector of polynomials needing hints applied to. + * @param [in] h Hints to apply. In signature encoding. + * @param [in] omega Max number of hints. Hint counts after this index. + * @param [in] i Dimension index. + * @param [in, out] op Pointer to current offset into hints. */ -int wc_dilithium_export_public(dilithium_key* key, - byte* out, word32* outLen) +static void dilithium_use_hint_32(sword32* w1, const byte* h, byte omega, + unsigned int i, byte* op) { - /* sanity check on arguments */ - if ((key == NULL) || (out == NULL) || (outLen == NULL)) { - return BAD_FUNC_ARG; + byte o = *op; + unsigned int j; + + /* For each value of polynomial. */ + for (j = 0; j < DILITHIUM_N; j++) { + sword32 r; + sword32 r0; + sword32 r1; +#ifdef DILITHIUM_USE_HINT_CT + /* Hint is 1 when index is next in hint list. */ + sword32 hint = ((o < h[omega + i]) & (h[o] == (byte)j)); + + /* Increment hint offset if this index has hint. */ + o += hint; + /* Convert value to positive only range. */ + r = w1[j] + ((0 - (((word32)w1[j]) >> 31)) & DILITHIUM_Q); + /* Decompose value into low and high parts. */ + dilithium_decompose_q32(r, &r0, &r1); + /* Make hint positive or negative based on sign of r0. */ + hint = (1 - (2 * (((word32)r0) >> 31))) & (0 - hint); + /* Make w1 only the top part plus the hint. */ + w1[j] = r1 + hint; + + /* Fix up w1 not be 16 (-> 0) or -1 (-> 15). */ + w1[j] &= 0xf; +#else + /* Convert value to positive only range. */ + r = w1[j] + ((0 - (((word32)w1[j]) >> 31)) & DILITHIUM_Q); + /* Decompose value into low and high parts. */ + dilithium_decompose_q32(r, &r0, &r1); + /* Check for hint. */ + if ((o < h[omega + i]) && (h[o] == (byte)j)) { + /* Add or subtract hint based on sign of r0. */ + r1 += 1 - (2 * (((word32)r0) >> 31)); + /* Go to next hint offset. */ + o++; + } + /* Fix up w1 not be 16 (-> 0) or -1 (-> 15). */ + w1[j] = r1 & 0xf; +#endif } + *op = o; +} +#endif + +#ifndef WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM +/* Use hints to modify w1. + * + * FIPS 204. 8.4: Algorithm 34 UseHint(h, r) + * 1: m <- (q - 1) / (2 * GAMMA2) + * 2: (r1, r0) <- Decompose(r) + * 3: if h == 1 and r0 > 0 return (r1 + 1) mod m + * 4: if h == 1 and r0 <= 0 return (r1 - 1) mod m + * 5: return r1 + * + * @param [in, out] w1 Vector of polynomials needing hints applied to. + * @param [in] k Dimension of vector. + * @param [in] gamma2 Low-order rounding range, GAMMA2. + * @param [in] omega Max number of hints. Hint counts after this index. + * @param [in] h Hints to apply. In signature encoding. + */ +static void dilithium_vec_use_hint(sword32* w1, byte k, word32 gamma2, + byte omega, const byte* h) +{ + unsigned int i; + byte o = 0; - if ((key->level != 1) && (key->level != 5)) { - return BAD_FUNC_ARG; + (void)k; + (void)omega; + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (gamma2 == DILITHIUM_Q_LOW_88) { + /* For each polynomial of vector. */ + for (i = 0; i < PARAMS_ML_DSA_44_K; i++) { + dilithium_use_hint_88(w1, h, i, &o); + w1 += DILITHIUM_N; + } + } + else +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (gamma2 == DILITHIUM_Q_LOW_32) { + /* For each polynomial of vector. */ + for (i = 0; i < k; i++) { + dilithium_use_hint_32(w1, h, omega, i, &o); + w1 += DILITHIUM_N; + } + } + else +#endif + { } +} +#endif +#endif /* !WOLFSSL_DILITHIUM_NO_VERIFY */ - if (!key->pubKeySet) { - return BAD_FUNC_ARG; +/****************************************************************************** + * Maths operations + ******************************************************************************/ + +/* q^-1 mod 2^32 (inverse of 8380417 mod 2^32 = 58728449 = 0x3802001) */ +#define DILITHIUM_QINV 58728449 + +/* Montgomery reduce a. + * + * @param [in] a 64-bit value to be reduced. + * @return Montgomery reduction result. + */ +static sword32 dilithium_mont_red(sword64 a) +{ +#ifndef DILITHIUM_MUL_QINV_SLOW + sword64 t = (sword32)((sword32)a * (sword32)DILITHIUM_QINV); +#else + sword64 t = (sword32)((sword32)a + (sword32)((sword32)a << 13) - + (sword32)((sword32)a << 23) + (sword32)((sword32)a << 26)); +#endif +#ifndef DILITHIUM_MUL_Q_SLOW + return (sword32)((a - ((sword32)t * (sword64)DILITHIUM_Q)) >> 32); +#else + return (sword32)((a - (t << 23) + (t << 13) - t) >> 32); +#endif +} + +#if !defined(WOLFSSL_DILITHIUM_SMALL) || !defined(WOLFSSL_DILITHIUM_NO_SIGN) + +/* Reduce 32-bit a modulo q. r = a mod q. + * + * @param [in] a 32-bit value to be reduced to range of q. + * @return Modulo result. + */ +static sword32 dilithium_red(sword32 a) +{ + sword32 t = (sword32)((a + (1 << 22)) >> 23); +#ifndef DILITHIUM_MUL_Q_SLOW + return (sword32)(a - (t * DILITHIUM_Q)); +#else + return (sword32)(a - (t << 23) + (t << 13) - t); +#endif +} + +#endif /* !WOLFSSL_DILITHIUM_SMALL || !WOLFSSL_DILITHIUM_NO_SIGN */ + +/* Zetas for NTT. */ +static const sword32 zetas[DILITHIUM_N] = { + -41978, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 2353451, -359251, -2091905, 3119733, -2884855, 3111497, 2680103, + 2725464, 1024112, -1079900, 3585928, -549488, -1119584, 2619752, -2108549, + -2118186, -3859737, -1399561, -3277672, 1757237, -19422, 4010497, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -1528703, -3677745, -3041255, -1452451, 3475950, 2176455, -1585221, + -1257611, 1939314, -4083598, -1000202, -3190144, -3157330, -3632928, 126922, + 3412210, -983419, 2147896, 2715295, -2967645, -3693493, -411027, -2477047, + -671102, -1228525, -22981, -1308169, -381987, 1349076, 1852771, -1430430, + -3343383, 264944, 508951, 3097992, 44288, -1100098, 904516, 3958618, + -3724342, -8578, 1653064, -3249728, 2389356, -210977, 759969, -1316856, + 189548, -3553272, 3159746, -1851402, -2409325, -177440, 1315589, 1341330, + 1285669, -1584928, -812732, -1439742, -3019102, -3881060, -3628969, 3839961, + 2091667, 3407706, 2316500, 3817976, -3342478, 2244091, -2446433, -3562462, + 266997, 2434439, -1235728, 3513181, -3520352, -3759364, -1197226, -3193378, + 900702, 1859098, 909542, 819034, 495491, -1613174, -43260, -522500, + -655327, -3122442, 2031748, 3207046, -3556995, -525098, -768622, -3595838, + 342297, 286988, -2437823, 4108315, 3437287, -3342277, 1735879, 203044, + 2842341, 2691481, -2590150, 1265009, 4055324, 1247620, 2486353, 1595974, + -3767016, 1250494, 2635921, -3548272, -2994039, 1869119, 1903435, -1050970, + -1333058, 1237275, -3318210, -1430225, -451100, 1312455, 3306115, -1962642, + -1279661, 1917081, -2546312, -1374803, 1500165, 777191, 2235880, 3406031, + -542412, -2831860, -1671176, -1846953, -2584293, -3724270, 594136, -3776993, + -2013608, 2432395, 2454455, -164721, 1957272, 3369112, 185531, -1207385, + -3183426, 162844, 1616392, 3014001, 810149, 1652634, -3694233, -1799107, + -3038916, 3523897, 3866901, 269760, 2213111, -975884, 1717735, 472078, + -426683, 1723600, -1803090, 1910376, -1667432, -1104333, -260646, -3833893, + -2939036, -2235985, -420899, -2286327, 183443, -976891, 1612842, -3545687, + -554416, 3919660, -48306, -1362209, 3937738, 1400424, -846154, 1976782 +}; + +#ifndef WOLFSSL_DILITHIUM_SMALL +/* Zetas for inverse NTT. */ +static const sword32 zetas_inv[DILITHIUM_N] = { + -1976782, 846154, -1400424, -3937738, 1362209, 48306, -3919660, 554416, + 3545687, -1612842, 976891, -183443, 2286327, 420899, 2235985, 2939036, + 3833893, 260646, 1104333, 1667432, -1910376, 1803090, -1723600, 426683, + -472078, -1717735, 975884, -2213111, -269760, -3866901, -3523897, 3038916, + 1799107, 3694233, -1652634, -810149, -3014001, -1616392, -162844, 3183426, + 1207385, -185531, -3369112, -1957272, 164721, -2454455, -2432395, 2013608, + 3776993, -594136, 3724270, 2584293, 1846953, 1671176, 2831860, 542412, + -3406031, -2235880, -777191, -1500165, 1374803, 2546312, -1917081, 1279661, + 1962642, -3306115, -1312455, 451100, 1430225, 3318210, -1237275, 1333058, + 1050970, -1903435, -1869119, 2994039, 3548272, -2635921, -1250494, 3767016, + -1595974, -2486353, -1247620, -4055324, -1265009, 2590150, -2691481, -2842341, + -203044, -1735879, 3342277, -3437287, -4108315, 2437823, -286988, -342297, + 3595838, 768622, 525098, 3556995, -3207046, -2031748, 3122442, 655327, + 522500, 43260, 1613174, -495491, -819034, -909542, -1859098, -900702, + 3193378, 1197226, 3759364, 3520352, -3513181, 1235728, -2434439, -266997, + 3562462, 2446433, -2244091, 3342478, -3817976, -2316500, -3407706, -2091667, + -3839961, 3628969, 3881060, 3019102, 1439742, 812732, 1584928, -1285669, + -1341330, -1315589, 177440, 2409325, 1851402, -3159746, 3553272, -189548, + 1316856, -759969, 210977, -2389356, 3249728, -1653064, 8578, 3724342, + -3958618, -904516, 1100098, -44288, -3097992, -508951, -264944, 3343383, + 1430430, -1852771, -1349076, 381987, 1308169, 22981, 1228525, 671102, + 2477047, 411027, 3693493, 2967645, -2715295, -2147896, 983419, -3412210, + -126922, 3632928, 3157330, 3190144, 1000202, 4083598, -1939314, 1257611, + 1585221, -2176455, -3475950, 1452451, 3041255, 3677745, 1528703, 3930395, + 2797779, -2071892, 2556880, -3900724, -3881043, -954230, -531354, -811944, + -3699596, 1600420, 2140649, -3507263, 3821735, -3505694, 1643818, 1699267, + 539299, -2348700, 300467, -3539968, 2867647, -3574422, 3043716, 3861115, + -3915439, 2537516, 3592148, 1661693, -3530437, -3077325, -95776, -2706023, + -280005, -4010497, 19422, -1757237, 3277672, 1399561, 3859737, 2118186, + 2108549, -2619752, 1119584, 549488, -3585928, 1079900, -1024112, -2725464, + -2680103, -3111497, 2884855, -3119733, 2091905, 359251, -2353451, -1826347, + -466468, 876248, 777960, -237124, 518909, 2608894, -25847, 41978 +}; +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_MAKE) && defined(WOLFSSL_DILITHIUM_SMALL)) + +/* One iteration of Number-Theoretic Transform. + * + * @param [in] len Length of sequence. + */ +#define NTT(len) \ +do { \ + for (start = 0; start < DILITHIUM_N; start += 2 * (len)) { \ + zeta = zetas[++k]; \ + for (j = 0; j < (len); ++j) { \ + sword32 t = \ + dilithium_mont_red((sword64)zeta * r[start + j + (len)]); \ + sword32 rj = r[start + j]; \ + r[start + j + (len)] = rj - t; \ + r[start + j] = rj + t; \ + } \ + } \ +} \ +while (0) + +/* Number-Theoretic Transform. + * + * @param [in, out] r Polynomial to transform. + */ +static void dilithium_ntt(sword32* r) +{ +#ifdef WOLFSSL_DILITHIUM_SMALL + unsigned int len; + unsigned int k; + unsigned int j; + + k = 0; + for (len = DILITHIUM_N / 2; len >= 1; len >>= 1) { + unsigned int start; + for (start = 0; start < DILITHIUM_N; start = j + len) { + sword32 zeta = zetas[++k]; + for (j = start; j < start + len; ++j) { + sword32 t = dilithium_mont_red((sword64)zeta * r[j + len]); + sword32 rj = r[j]; + r[j + len] = rj - t; + r[j] = rj + t; + } + } + } +#elif defined(WOLFSSL_DILITHIUM_NO_LARGE_CODE) + unsigned int j; + unsigned int k; + unsigned int start; + sword32 zeta; + + zeta = zetas[1]; + for (j = 0; j < DILITHIUM_N / 2; j++) { + sword32 t = + dilithium_mont_red((sword64)zeta * r[j + DILITHIUM_N / 2]); + sword32 rj = r[j]; + r[j + DILITHIUM_N / 2] = rj - t; + r[j] = rj + t; + } + + k = 1; + NTT(64); + NTT(32); + NTT(16); + NTT(8); + NTT(4); + NTT(2); + + for (j = 0; j < DILITHIUM_N; j += 2) { + sword32 t = dilithium_mont_red((sword64)zetas[++k] * r[j + 1]); + sword32 rj = r[j]; + r[j + 1] = rj - t; + r[j] = rj + t; + } +#elif defined(WC_32BIT_CPU) + unsigned int j; + unsigned int k; + sword32 t0; + sword32 t2; + + sword32 zeta128 = zetas[1]; + sword32 zeta640 = zetas[2]; + sword32 zeta641 = zetas[3]; + for (j = 0; j < DILITHIUM_N / 4; j++) { + sword32 r0 = r[j + 0]; + sword32 r2 = r[j + 64]; + sword32 r4 = r[j + 128]; + sword32 r6 = r[j + 192]; + + t0 = dilithium_mont_red((sword64)zeta128 * r4); + t2 = dilithium_mont_red((sword64)zeta128 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zeta640 * r2); + t2 = dilithium_mont_red((sword64)zeta641 * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + 0] = r0; + r[j + 64] = r2; + r[j + 128] = r4; + r[j + 192] = r6; + } + + for (j = 0; j < DILITHIUM_N; j += 64) { + int i; + sword32 zeta32 = zetas[ 4 + j / 64 + 0]; + sword32 zeta160 = zetas[ 8 + j / 32 + 0]; + sword32 zeta161 = zetas[ 8 + j / 32 + 1]; + for (i = 0; i < 16; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r2 = r[j + i + 16]; + sword32 r4 = r[j + i + 32]; + sword32 r6 = r[j + i + 48]; + + t0 = dilithium_mont_red((sword64)zeta32 * r4); + t2 = dilithium_mont_red((sword64)zeta32 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zeta160 * r2); + t2 = dilithium_mont_red((sword64)zeta161 * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + i + 0] = r0; + r[j + i + 16] = r2; + r[j + i + 32] = r4; + r[j + i + 48] = r6; + } } - /* check and set up out length */ - if ((key->level == 2) && (*outLen < DILITHIUM_LEVEL2_PUB_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE; - return BUFFER_E; - } - else if ((key->level == 3) && (*outLen < DILITHIUM_LEVEL3_PUB_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE; - return BUFFER_E; - } - else if ((key->level == 5) && (*outLen < DILITHIUM_LEVEL5_PUB_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE; - return BUFFER_E; + for (j = 0; j < DILITHIUM_N; j += 16) { + int i; + sword32 zeta8 = zetas[16 + j / 16]; + sword32 zeta40 = zetas[32 + j / 8 + 0]; + sword32 zeta41 = zetas[32 + j / 8 + 1]; + for (i = 0; i < 4; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r2 = r[j + i + 4]; + sword32 r4 = r[j + i + 8]; + sword32 r6 = r[j + i + 12]; + + t0 = dilithium_mont_red((sword64)zeta8 * r4); + t2 = dilithium_mont_red((sword64)zeta8 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zeta40 * r2); + t2 = dilithium_mont_red((sword64)zeta41 * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + i + 0] = r0; + r[j + i + 4] = r2; + r[j + i + 8] = r4; + r[j + i + 12] = r6; + } } - if (key->level == 2) { - *outLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE; - XMEMCPY(out, key->p, DILITHIUM_LEVEL2_PUB_KEY_SIZE); + k = 128; + for (j = 0; j < DILITHIUM_N; j += 4) { + sword32 zeta2 = zetas[64 + j / 4]; + sword32 r0 = r[j + 0]; + sword32 r2 = r[j + 1]; + sword32 r4 = r[j + 2]; + sword32 r6 = r[j + 3]; + + t0 = dilithium_mont_red((sword64)zeta2 * r4); + t2 = dilithium_mont_red((sword64)zeta2 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zetas[k++] * r2); + t2 = dilithium_mont_red((sword64)zetas[k++] * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + 0] = r0; + r[j + 1] = r2; + r[j + 2] = r4; + r[j + 3] = r6; } - else if (key->level == 3) { - *outLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE; - XMEMCPY(out, key->p, DILITHIUM_LEVEL3_PUB_KEY_SIZE); +#else + unsigned int j; + unsigned int k; + sword32 t0; + sword32 t1; + sword32 t2; + sword32 t3; + + sword32 zeta128 = zetas[1]; + sword32 zeta640 = zetas[2]; + sword32 zeta641 = zetas[3]; + for (j = 0; j < DILITHIUM_N / 8; j++) { + sword32 r0 = r[j + 0]; + sword32 r1 = r[j + 32]; + sword32 r2 = r[j + 64]; + sword32 r3 = r[j + 96]; + sword32 r4 = r[j + 128]; + sword32 r5 = r[j + 160]; + sword32 r6 = r[j + 192]; + sword32 r7 = r[j + 224]; + + t0 = dilithium_mont_red((sword64)zeta128 * r4); + t1 = dilithium_mont_red((sword64)zeta128 * r5); + t2 = dilithium_mont_red((sword64)zeta128 * r6); + t3 = dilithium_mont_red((sword64)zeta128 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = dilithium_mont_red((sword64)zeta640 * r2); + t1 = dilithium_mont_red((sword64)zeta640 * r3); + t2 = dilithium_mont_red((sword64)zeta641 * r6); + t3 = dilithium_mont_red((sword64)zeta641 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + r[j + 0] = r0; + r[j + 32] = r1; + r[j + 64] = r2; + r[j + 96] = r3; + r[j + 128] = r4; + r[j + 160] = r5; + r[j + 192] = r6; + r[j + 224] = r7; + } + + for (j = 0; j < DILITHIUM_N; j += 64) { + int i; + sword32 zeta32 = zetas[ 4 + j / 64 + 0]; + sword32 zeta160 = zetas[ 8 + j / 32 + 0]; + sword32 zeta161 = zetas[ 8 + j / 32 + 1]; + sword32 zeta80 = zetas[16 + j / 16 + 0]; + sword32 zeta81 = zetas[16 + j / 16 + 1]; + sword32 zeta82 = zetas[16 + j / 16 + 2]; + sword32 zeta83 = zetas[16 + j / 16 + 3]; + for (i = 0; i < 8; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r1 = r[j + i + 8]; + sword32 r2 = r[j + i + 16]; + sword32 r3 = r[j + i + 24]; + sword32 r4 = r[j + i + 32]; + sword32 r5 = r[j + i + 40]; + sword32 r6 = r[j + i + 48]; + sword32 r7 = r[j + i + 56]; + + t0 = dilithium_mont_red((sword64)zeta32 * r4); + t1 = dilithium_mont_red((sword64)zeta32 * r5); + t2 = dilithium_mont_red((sword64)zeta32 * r6); + t3 = dilithium_mont_red((sword64)zeta32 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = dilithium_mont_red((sword64)zeta160 * r2); + t1 = dilithium_mont_red((sword64)zeta160 * r3); + t2 = dilithium_mont_red((sword64)zeta161 * r6); + t3 = dilithium_mont_red((sword64)zeta161 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + t0 = dilithium_mont_red((sword64)zeta80 * r1); + t1 = dilithium_mont_red((sword64)zeta81 * r3); + t2 = dilithium_mont_red((sword64)zeta82 * r5); + t3 = dilithium_mont_red((sword64)zeta83 * r7); + r1 = r0 - t0; + r3 = r2 - t1; + r5 = r4 - t2; + r7 = r6 - t3; + r0 += t0; + r2 += t1; + r4 += t2; + r6 += t3; + + r[j + i + 0] = r0; + r[j + i + 8] = r1; + r[j + i + 16] = r2; + r[j + i + 24] = r3; + r[j + i + 32] = r4; + r[j + i + 40] = r5; + r[j + i + 48] = r6; + r[j + i + 56] = r7; + } } - else if (key->level == 5) { - *outLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE; - XMEMCPY(out, key->p, DILITHIUM_LEVEL5_PUB_KEY_SIZE); + + k = 128; + for (j = 0; j < DILITHIUM_N; j += 8) { + sword32 zeta4 = zetas[32 + j / 8 + 0]; + sword32 zeta20 = zetas[64 + j / 4 + 0]; + sword32 zeta21 = zetas[64 + j / 4 + 1]; + sword32 r0 = r[j + 0]; + sword32 r1 = r[j + 1]; + sword32 r2 = r[j + 2]; + sword32 r3 = r[j + 3]; + sword32 r4 = r[j + 4]; + sword32 r5 = r[j + 5]; + sword32 r6 = r[j + 6]; + sword32 r7 = r[j + 7]; + + t0 = dilithium_mont_red((sword64)zeta4 * r4); + t1 = dilithium_mont_red((sword64)zeta4 * r5); + t2 = dilithium_mont_red((sword64)zeta4 * r6); + t3 = dilithium_mont_red((sword64)zeta4 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = dilithium_mont_red((sword64)zeta20 * r2); + t1 = dilithium_mont_red((sword64)zeta20 * r3); + t2 = dilithium_mont_red((sword64)zeta21 * r6); + t3 = dilithium_mont_red((sword64)zeta21 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + t0 = dilithium_mont_red((sword64)zetas[k++] * r1); + t1 = dilithium_mont_red((sword64)zetas[k++] * r3); + t2 = dilithium_mont_red((sword64)zetas[k++] * r5); + t3 = dilithium_mont_red((sword64)zetas[k++] * r7); + r1 = r0 - t0; + r3 = r2 - t1; + r5 = r4 - t2; + r7 = r6 - t3; + r0 += t0; + r2 += t1; + r4 += t2; + r6 += t3; + + r[j + 0] = r0; + r[j + 1] = r1; + r[j + 2] = r2; + r[j + 3] = r3; + r[j + 4] = r4; + r[j + 5] = r5; + r[j + 6] = r6; + r[j + 7] = r7; } +#endif +} - return 0; +#if !defined(WOLFSSL_DILITHIUM_NO_VERIFY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + (defined(WC_DILITHIUM_CACHE_PRIV_VECTORS) || \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM))) +/* Number-Theoretic Transform. + * + * @param [in, out] r Vector of polynomials to transform. + * @param [in] l Dimension of polynomial. + */ +static void dilithium_vec_ntt(sword32* r, byte l) +{ + unsigned int i; + + for (i = 0; i < l; i++) { + dilithium_ntt(r); + r += DILITHIUM_N; + } } +#endif +#endif -/* Import a dilithium public key from a byte array. - * Public key encoded in big-endian. +#ifndef WOLFSSL_DILITHIUM_SMALL + +/* Number-Theoretic Transform with small initial values. * - * in [in] Array holding public key. - * inLen [in] Number of bytes of data in array. - * key [in] Dilithium public key. - * returns BAD_FUNC_ARG when a parameter is NULL or key format is not supported, - * 0 otherwise. + * @param [in, out] r Polynomial to transform. */ -int wc_dilithium_import_public(const byte* in, word32 inLen, - dilithium_key* key) +static void dilithium_ntt_small(sword32* r) { - /* sanity check on arguments */ - if ((in == NULL) || (key == NULL)) { - return BAD_FUNC_ARG; + unsigned int k; + unsigned int j; +#ifdef WOLFSSL_DILITHIUM_NO_LARGE_CODE + unsigned int start; + sword32 zeta; + + for (j = 0; j < DILITHIUM_N / 2; ++j) { + sword32 t = dilithium_red((sword32)-3572223 * r[j + DILITHIUM_N / 2]); + sword32 rj = r[j]; + r[j + DILITHIUM_N / 2] = rj - t; + r[j] = rj + t; + } + + k = 1; + NTT(64); + NTT(32); + NTT(16); + NTT(8); + NTT(4); + NTT(2); + + for (j = 0; j < DILITHIUM_N; j += 2) { + sword32 t = dilithium_mont_red((sword64)zetas[++k] * r[j + 1]); + sword32 rj = r[j]; + r[j + 1] = rj - t; + r[j] = rj + t; + } +#elif defined(WC_32BIT_CPU) + sword32 t0; + sword32 t2; + + sword32 zeta640 = zetas[2]; + sword32 zeta641 = zetas[3]; + for (j = 0; j < DILITHIUM_N / 4; j++) { + sword32 r0 = r[j + 0]; + sword32 r2 = r[j + 64]; + sword32 r4 = r[j + 128]; + sword32 r6 = r[j + 192]; + + t0 = dilithium_red((sword32)-3572223 * r4); + t2 = dilithium_red((sword32)-3572223 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zeta640 * r2); + t2 = dilithium_mont_red((sword64)zeta641 * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + 0] = r0; + r[j + 64] = r2; + r[j + 128] = r4; + r[j + 192] = r6; + } + + for (j = 0; j < DILITHIUM_N; j += 64) { + int i; + sword32 zeta32 = zetas[ 4 + j / 64 + 0]; + sword32 zeta160 = zetas[ 8 + j / 32 + 0]; + sword32 zeta161 = zetas[ 8 + j / 32 + 1]; + for (i = 0; i < 16; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r2 = r[j + i + 16]; + sword32 r4 = r[j + i + 32]; + sword32 r6 = r[j + i + 48]; + + t0 = dilithium_mont_red((sword64)zeta32 * r4); + t2 = dilithium_mont_red((sword64)zeta32 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zeta160 * r2); + t2 = dilithium_mont_red((sword64)zeta161 * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + i + 0] = r0; + r[j + i + 16] = r2; + r[j + i + 32] = r4; + r[j + i + 48] = r6; + } } - if ((key->level != 2) && (key->level != 3) && (key->level != 5)) { - return BAD_FUNC_ARG; + for (j = 0; j < DILITHIUM_N; j += 16) { + int i; + sword32 zeta8 = zetas[16 + j / 16]; + sword32 zeta40 = zetas[32 + j / 8 + 0]; + sword32 zeta41 = zetas[32 + j / 8 + 1]; + for (i = 0; i < 4; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r2 = r[j + i + 4]; + sword32 r4 = r[j + i + 8]; + sword32 r6 = r[j + i + 12]; + + t0 = dilithium_mont_red((sword64)zeta8 * r4); + t2 = dilithium_mont_red((sword64)zeta8 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zeta40 * r2); + t2 = dilithium_mont_red((sword64)zeta41 * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + i + 0] = r0; + r[j + i + 4] = r2; + r[j + i + 8] = r4; + r[j + i + 12] = r6; + } } - if ((key->level == 2) && (inLen != DILITHIUM_LEVEL2_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; + k = 128; + for (j = 0; j < DILITHIUM_N; j += 4) { + sword32 zeta2 = zetas[64 + j / 4]; + sword32 r0 = r[j + 0]; + sword32 r2 = r[j + 1]; + sword32 r4 = r[j + 2]; + sword32 r6 = r[j + 3]; + + t0 = dilithium_mont_red((sword64)zeta2 * r4); + t2 = dilithium_mont_red((sword64)zeta2 * r6); + r4 = r0 - t0; + r6 = r2 - t2; + r0 += t0; + r2 += t2; + + t0 = dilithium_mont_red((sword64)zetas[k++] * r2); + t2 = dilithium_mont_red((sword64)zetas[k++] * r6); + r2 = r0 - t0; + r6 = r4 - t2; + r0 += t0; + r4 += t2; + + r[j + 0] = r0; + r[j + 1] = r2; + r[j + 2] = r4; + r[j + 3] = r6; } - else if ((key->level == 3) && (inLen != DILITHIUM_LEVEL3_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; +#else + sword32 t0; + sword32 t1; + sword32 t2; + sword32 t3; + sword32 zeta640 = zetas[2]; + sword32 zeta641 = zetas[3]; + for (j = 0; j < DILITHIUM_N / 8; j++) { + sword32 r0 = r[j + 0]; + sword32 r1 = r[j + 32]; + sword32 r2 = r[j + 64]; + sword32 r3 = r[j + 96]; + sword32 r4 = r[j + 128]; + sword32 r5 = r[j + 160]; + sword32 r6 = r[j + 192]; + sword32 r7 = r[j + 224]; + + t0 = dilithium_red((sword32)-3572223 * r4); + t1 = dilithium_red((sword32)-3572223 * r5); + t2 = dilithium_red((sword32)-3572223 * r6); + t3 = dilithium_red((sword32)-3572223 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = dilithium_mont_red((sword64)zeta640 * r2); + t1 = dilithium_mont_red((sword64)zeta640 * r3); + t2 = dilithium_mont_red((sword64)zeta641 * r6); + t3 = dilithium_mont_red((sword64)zeta641 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + r[j + 0] = r0; + r[j + 32] = r1; + r[j + 64] = r2; + r[j + 96] = r3; + r[j + 128] = r4; + r[j + 160] = r5; + r[j + 192] = r6; + r[j + 224] = r7; + } + + for (j = 0; j < DILITHIUM_N; j += 64) { + int i; + sword32 zeta32 = zetas[ 4 + j / 64 + 0]; + sword32 zeta160 = zetas[ 8 + j / 32 + 0]; + sword32 zeta161 = zetas[ 8 + j / 32 + 1]; + sword32 zeta80 = zetas[16 + j / 16 + 0]; + sword32 zeta81 = zetas[16 + j / 16 + 1]; + sword32 zeta82 = zetas[16 + j / 16 + 2]; + sword32 zeta83 = zetas[16 + j / 16 + 3]; + for (i = 0; i < 8; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r1 = r[j + i + 8]; + sword32 r2 = r[j + i + 16]; + sword32 r3 = r[j + i + 24]; + sword32 r4 = r[j + i + 32]; + sword32 r5 = r[j + i + 40]; + sword32 r6 = r[j + i + 48]; + sword32 r7 = r[j + i + 56]; + + t0 = dilithium_mont_red((sword64)zeta32 * r4); + t1 = dilithium_mont_red((sword64)zeta32 * r5); + t2 = dilithium_mont_red((sword64)zeta32 * r6); + t3 = dilithium_mont_red((sword64)zeta32 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = dilithium_mont_red((sword64)zeta160 * r2); + t1 = dilithium_mont_red((sword64)zeta160 * r3); + t2 = dilithium_mont_red((sword64)zeta161 * r6); + t3 = dilithium_mont_red((sword64)zeta161 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + t0 = dilithium_mont_red((sword64)zeta80 * r1); + t1 = dilithium_mont_red((sword64)zeta81 * r3); + t2 = dilithium_mont_red((sword64)zeta82 * r5); + t3 = dilithium_mont_red((sword64)zeta83 * r7); + r1 = r0 - t0; + r3 = r2 - t1; + r5 = r4 - t2; + r7 = r6 - t3; + r0 += t0; + r2 += t1; + r4 += t2; + r6 += t3; + + r[j + i + 0] = r0; + r[j + i + 8] = r1; + r[j + i + 16] = r2; + r[j + i + 24] = r3; + r[j + i + 32] = r4; + r[j + i + 40] = r5; + r[j + i + 48] = r6; + r[j + i + 56] = r7; + } } - else if ((key->level == 5) && (inLen != DILITHIUM_LEVEL5_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; + + k = 128; + for (j = 0; j < DILITHIUM_N; j += 8) { + sword32 zeta4 = zetas[32 + j / 8 + 0]; + sword32 zeta20 = zetas[64 + j / 4 + 0]; + sword32 zeta21 = zetas[64 + j / 4 + 1]; + sword32 r0 = r[j + 0]; + sword32 r1 = r[j + 1]; + sword32 r2 = r[j + 2]; + sword32 r3 = r[j + 3]; + sword32 r4 = r[j + 4]; + sword32 r5 = r[j + 5]; + sword32 r6 = r[j + 6]; + sword32 r7 = r[j + 7]; + + t0 = dilithium_mont_red((sword64)zeta4 * r4); + t1 = dilithium_mont_red((sword64)zeta4 * r5); + t2 = dilithium_mont_red((sword64)zeta4 * r6); + t3 = dilithium_mont_red((sword64)zeta4 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = dilithium_mont_red((sword64)zeta20 * r2); + t1 = dilithium_mont_red((sword64)zeta20 * r3); + t2 = dilithium_mont_red((sword64)zeta21 * r6); + t3 = dilithium_mont_red((sword64)zeta21 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + t0 = dilithium_mont_red((sword64)zetas[k++] * r1); + t1 = dilithium_mont_red((sword64)zetas[k++] * r3); + t2 = dilithium_mont_red((sword64)zetas[k++] * r5); + t3 = dilithium_mont_red((sword64)zetas[k++] * r7); + r1 = r0 - t0; + r3 = r2 - t1; + r5 = r4 - t2; + r7 = r6 - t3; + r0 += t0; + r2 += t1; + r4 += t2; + r6 += t3; + + r[j + 0] = r0; + r[j + 1] = r1; + r[j + 2] = r2; + r[j + 3] = r3; + r[j + 4] = r4; + r[j + 5] = r5; + r[j + 6] = r6; + r[j + 7] = r7; } +#endif +} - XMEMCPY(key->p, in, inLen); - key->pubKeySet = 1; +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + (defined(WC_DILITHIUM_CACHE_PRIV_VECTORS) || \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM))) +/* Number-Theoretic Transform with small initial values. + * + * @param [in, out] r Vector of polynomials to transform. + * @param [in] l Dimension of polynomial. + */ +static void dilithium_vec_ntt_small(sword32* r, byte l) +{ + unsigned int i; - return 0; + for (i = 0; i < l; i++) { + dilithium_ntt_small(r); + r += DILITHIUM_N; + } } +#endif /* !WOLFSSL_DILITHIUM_VERIFY_ONLY */ -static int parse_private_key(const byte* priv, word32 privSz, - byte** out, word32 *outSz, - dilithium_key* key) { - word32 idx = 0; - int ret = 0; - int length = 0; +#else - /* sanity check on arguments */ - if ((priv == NULL) || (key == NULL)) { - return BAD_FUNC_ARG; +/* Number-Theoretic Transform with small initial values. + * + * @param [in, out] r Polynomial to transform. + */ +#define dilithium_ntt_small dilithium_ntt +/* Number-Theoretic Transform with small initial values. + * + * @param [in, out] r Vector of polynomials to transform. + * @param [in] l Dimension of polynomial. + */ +#define dilithium_vec_ntt_small dilithium_vec_ntt + +#endif /* WOLFSSL_DILITHIUM_SMALL */ + + +/* One iteration of Inverse Number-Theoretic Transform. + * + * @param [in] len Length of sequence. + */ +#define INVNTT(len) \ +do { \ + for (start = 0; start < DILITHIUM_N; start += 2 * (len)) { \ + zeta = zetas_inv[k++]; \ + for (j = 0; j < (len); ++j) { \ + sword32 rj = r[start + j]; \ + sword32 rjl = r[start + j + (len)]; \ + sword32 t = rj + rjl; \ + r[start + j] = t; \ + rjl = rj - rjl; \ + r[start + j + (len)] = dilithium_mont_red((sword64)zeta * rjl); \ + } \ + } \ +} \ +while (0) + +/* Inverse Number-Theoretic Transform. + * + * @param [in, out] r Polynomial to transform. + */ +static void dilithium_invntt(sword32* r) +{ +#ifdef WOLFSSL_DILITHIUM_SMALL + unsigned int len; + unsigned int k; + unsigned int j; + sword32 zeta; + + k = 256; + for (len = 1; len <= DILITHIUM_N / 2; len <<= 1) { + unsigned int start; + for (start = 0; start < DILITHIUM_N; start = j + len) { + zeta = -zetas[--k]; + for (j = start; j < start + len; ++j) { + sword32 rj = r[j]; + sword32 rjl = r[j + len]; + sword32 t = rj + rjl; + r[j] = t; + rjl = rj - rjl; + r[j + len] = dilithium_mont_red((sword64)zeta * rjl); + } + } + } + + zeta = -zetas[0]; + for (j = 0; j < DILITHIUM_N; ++j) { + r[j] = dilithium_mont_red((sword64)zeta * r[j]); + } +#elif defined(WOLFSSL_DILITHIUM_NO_LARGE_CODE) + unsigned int j; + unsigned int k = 0; + unsigned int start; + sword32 zeta; + + for (j = 0; j < DILITHIUM_N; j += 2) { + sword32 rj = r[j]; + sword32 rjl = r[j + 1]; + sword32 t = rj + rjl; + r[j] = t; + rjl = rj - rjl; + r[j + 1] = dilithium_mont_red((sword64)zetas_inv[k++] * rjl); + } + + INVNTT(2); + INVNTT(4); + INVNTT(8); + INVNTT(16); + INVNTT(32); + INVNTT(64); + INVNTT(128); + + zeta = zetas_inv[255]; + for (j = 0; j < DILITHIUM_N; ++j) { + r[j] = dilithium_mont_red((sword64)zeta * r[j]); + } +#elif defined(WC_32BIT_CPU) + unsigned int j; + unsigned int k = 0; + sword32 t0; + sword32 t2; + + sword32 zeta640; + sword32 zeta641; + sword32 zeta128; + sword32 zeta256; + for (j = 0; j < DILITHIUM_N; j += 4) { + sword32 zeta2 = zetas_inv[128 + j / 4]; + sword32 r0 = r[j + 0]; + sword32 r2 = r[j + 1]; + sword32 r4 = r[j + 2]; + sword32 r6 = r[j + 3]; + + t0 = dilithium_mont_red((sword64)zetas_inv[k++] * (r0 - r2)); + t2 = dilithium_mont_red((sword64)zetas_inv[k++] * (r4 - r6)); + r0 += r2; + r4 += r6; + r2 = t0; + r6 = t2; + + t0 = dilithium_mont_red((sword64)zeta2 * (r0 - r4)); + t2 = dilithium_mont_red((sword64)zeta2 * (r2 - r6)); + r0 += r4; + r2 += r6; + r4 = t0; + r6 = t2; + + r[j + 0] = r0; + r[j + 1] = r2; + r[j + 2] = r4; + r[j + 3] = r6; + } + + for (j = 0; j < DILITHIUM_N; j += 16) { + int i; + sword32 zeta40 = zetas_inv[192 + j / 8 + 0]; + sword32 zeta41 = zetas_inv[192 + j / 8 + 1]; + sword32 zeta8 = zetas_inv[224 + j / 16 + 0]; + for (i = 0; i < 4; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r2 = r[j + i + 4]; + sword32 r4 = r[j + i + 8]; + sword32 r6 = r[j + i + 12]; + + t0 = dilithium_mont_red((sword64)zeta40 * (r0 - r2)); + t2 = dilithium_mont_red((sword64)zeta41 * (r4 - r6)); + r0 += r2; + r4 += r6; + r2 = t0; + r6 = t2; + + t0 = dilithium_mont_red((sword64)zeta8 * (r0 - r4)); + t2 = dilithium_mont_red((sword64)zeta8 * (r2 - r6)); + r0 += r4; + r2 += r6; + r4 = t0; + r6 = t2; + + r[j + i + 0] = r0; + r[j + i + 4] = r2; + r[j + i + 8] = r4; + r[j + i + 12] = r6; + } } - if ((key->level != 2) && (key->level != 3) && (key->level != 5)) { - return BAD_FUNC_ARG; + for (j = 0; j < DILITHIUM_N; j += 64) { + int i; + sword32 zeta160 = zetas_inv[240 + j / 32 + 0]; + sword32 zeta161 = zetas_inv[240 + j / 32 + 1]; + sword32 zeta32 = zetas_inv[248 + j / 64 + 0]; + for (i = 0; i < 16; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r2 = r[j + i + 16]; + sword32 r4 = r[j + i + 32]; + sword32 r6 = r[j + i + 48]; + + t0 = dilithium_mont_red((sword64)zeta160 * (r0 - r2)); + t2 = dilithium_mont_red((sword64)zeta161 * (r4 - r6)); + r0 += r2; + r4 += r6; + r2 = t0; + r6 = t2; + + t0 = dilithium_mont_red((sword64)zeta32 * (r0 - r4)); + t2 = dilithium_mont_red((sword64)zeta32 * (r2 - r6)); + r0 += r4; + r2 += r6; + r4 = t0; + r6 = t2; + + r[j + i + 0] = r0; + r[j + i + 16] = r2; + r[j + i + 32] = r4; + r[j + i + 48] = r6; + } } - /* At this point, it is still a PKCS8 private key. */ - if ((ret = ToTraditionalInline(priv, &idx, privSz)) < 0) { - return ret; + zeta640 = zetas_inv[252]; + zeta641 = zetas_inv[253]; + zeta128 = zetas_inv[254]; + zeta256 = zetas_inv[255]; + for (j = 0; j < DILITHIUM_N / 4; j++) { + sword32 r0 = r[j + 0]; + sword32 r2 = r[j + 64]; + sword32 r4 = r[j + 128]; + sword32 r6 = r[j + 192]; + + t0 = dilithium_mont_red((sword64)zeta640 * (r0 - r2)); + t2 = dilithium_mont_red((sword64)zeta641 * (r4 - r6)); + r0 += r2; + r4 += r6; + r2 = t0; + r6 = t2; + + t0 = dilithium_mont_red((sword64)zeta128 * (r0 - r4)); + t2 = dilithium_mont_red((sword64)zeta128 * (r2 - r6)); + r0 += r4; + r2 += r6; + r4 = t0; + r6 = t2; + + r0 = dilithium_mont_red((sword64)zeta256 * r0); + r2 = dilithium_mont_red((sword64)zeta256 * r2); + r4 = dilithium_mont_red((sword64)zeta256 * r4); + r6 = dilithium_mont_red((sword64)zeta256 * r6); + + r[j + 0] = r0; + r[j + 64] = r2; + r[j + 128] = r4; + r[j + 192] = r6; + } +#else + unsigned int j; + unsigned int k = 0; + sword32 t0; + sword32 t1; + sword32 t2; + sword32 t3; + + sword32 zeta640; + sword32 zeta641; + sword32 zeta128; + sword32 zeta256; + for (j = 0; j < DILITHIUM_N; j += 8) { + sword32 zeta20 = zetas_inv[128 + j / 4 + 0]; + sword32 zeta21 = zetas_inv[128 + j / 4 + 1]; + sword32 zeta4 = zetas_inv[192 + j / 8 + 0]; + sword32 r0 = r[j + 0]; + sword32 r1 = r[j + 1]; + sword32 r2 = r[j + 2]; + sword32 r3 = r[j + 3]; + sword32 r4 = r[j + 4]; + sword32 r5 = r[j + 5]; + sword32 r6 = r[j + 6]; + sword32 r7 = r[j + 7]; + + t0 = dilithium_mont_red((sword64)zetas_inv[k++] * (r0 - r1)); + t1 = dilithium_mont_red((sword64)zetas_inv[k++] * (r2 - r3)); + t2 = dilithium_mont_red((sword64)zetas_inv[k++] * (r4 - r5)); + t3 = dilithium_mont_red((sword64)zetas_inv[k++] * (r6 - r7)); + r0 += r1; + r2 += r3; + r4 += r5; + r6 += r7; + r1 = t0; + r3 = t1; + r5 = t2; + r7 = t3; + + t0 = dilithium_mont_red((sword64)zeta20 * (r0 - r2)); + t1 = dilithium_mont_red((sword64)zeta20 * (r1 - r3)); + t2 = dilithium_mont_red((sword64)zeta21 * (r4 - r6)); + t3 = dilithium_mont_red((sword64)zeta21 * (r5 - r7)); + r0 += r2; + r1 += r3; + r4 += r6; + r5 += r7; + r2 = t0; + r3 = t1; + r6 = t2; + r7 = t3; + + t0 = dilithium_mont_red((sword64)zeta4 * (r0 - r4)); + t1 = dilithium_mont_red((sword64)zeta4 * (r1 - r5)); + t2 = dilithium_mont_red((sword64)zeta4 * (r2 - r6)); + t3 = dilithium_mont_red((sword64)zeta4 * (r3 - r7)); + r0 += r4; + r1 += r5; + r2 += r6; + r3 += r7; + r4 = t0; + r5 = t1; + r6 = t2; + r7 = t3; + + r[j + 0] = r0; + r[j + 1] = r1; + r[j + 2] = r2; + r[j + 3] = r3; + r[j + 4] = r4; + r[j + 5] = r5; + r[j + 6] = r6; + r[j + 7] = r7; + } + + for (j = 0; j < DILITHIUM_N; j += 64) { + int i; + sword32 zeta80 = zetas_inv[224 + j / 16 + 0]; + sword32 zeta81 = zetas_inv[224 + j / 16 + 1]; + sword32 zeta82 = zetas_inv[224 + j / 16 + 2]; + sword32 zeta83 = zetas_inv[224 + j / 16 + 3]; + sword32 zeta160 = zetas_inv[240 + j / 32 + 0]; + sword32 zeta161 = zetas_inv[240 + j / 32 + 1]; + sword32 zeta32 = zetas_inv[248 + j / 64 + 0]; + for (i = 0; i < 8; i++) { + sword32 r0 = r[j + i + 0]; + sword32 r1 = r[j + i + 8]; + sword32 r2 = r[j + i + 16]; + sword32 r3 = r[j + i + 24]; + sword32 r4 = r[j + i + 32]; + sword32 r5 = r[j + i + 40]; + sword32 r6 = r[j + i + 48]; + sword32 r7 = r[j + i + 56]; + + t0 = dilithium_mont_red((sword64)zeta80 * (r0 - r1)); + t1 = dilithium_mont_red((sword64)zeta81 * (r2 - r3)); + t2 = dilithium_mont_red((sword64)zeta82 * (r4 - r5)); + t3 = dilithium_mont_red((sword64)zeta83 * (r6 - r7)); + r0 += r1; + r2 += r3; + r4 += r5; + r6 += r7; + r1 = t0; + r3 = t1; + r5 = t2; + r7 = t3; + + t0 = dilithium_mont_red((sword64)zeta160 * (r0 - r2)); + t1 = dilithium_mont_red((sword64)zeta160 * (r1 - r3)); + t2 = dilithium_mont_red((sword64)zeta161 * (r4 - r6)); + t3 = dilithium_mont_red((sword64)zeta161 * (r5 - r7)); + r0 += r2; + r1 += r3; + r4 += r6; + r5 += r7; + r2 = t0; + r3 = t1; + r6 = t2; + r7 = t3; + + t0 = dilithium_mont_red((sword64)zeta32 * (r0 - r4)); + t1 = dilithium_mont_red((sword64)zeta32 * (r1 - r5)); + t2 = dilithium_mont_red((sword64)zeta32 * (r2 - r6)); + t3 = dilithium_mont_red((sword64)zeta32 * (r3 - r7)); + r0 += r4; + r1 += r5; + r2 += r6; + r3 += r7; + r4 = t0; + r5 = t1; + r6 = t2; + r7 = t3; + + r[j + i + 0] = r0; + r[j + i + 8] = r1; + r[j + i + 16] = r2; + r[j + i + 24] = r3; + r[j + i + 32] = r4; + r[j + i + 40] = r5; + r[j + i + 48] = r6; + r[j + i + 56] = r7; + } } - /* Now it is a octet_string(concat(priv,pub)) */ - if ((ret = GetOctetString(priv, &idx, &length, privSz)) < 0) { - return ret; + zeta640 = zetas_inv[252]; + zeta641 = zetas_inv[253]; + zeta128 = zetas_inv[254]; + zeta256 = zetas_inv[255]; + for (j = 0; j < DILITHIUM_N / 8; j++) { + sword32 r0 = r[j + 0]; + sword32 r1 = r[j + 32]; + sword32 r2 = r[j + 64]; + sword32 r3 = r[j + 96]; + sword32 r4 = r[j + 128]; + sword32 r5 = r[j + 160]; + sword32 r6 = r[j + 192]; + sword32 r7 = r[j + 224]; + + t0 = dilithium_mont_red((sword64)zeta640 * (r0 - r2)); + t1 = dilithium_mont_red((sword64)zeta640 * (r1 - r3)); + t2 = dilithium_mont_red((sword64)zeta641 * (r4 - r6)); + t3 = dilithium_mont_red((sword64)zeta641 * (r5 - r7)); + r0 += r2; + r1 += r3; + r4 += r6; + r5 += r7; + r2 = t0; + r3 = t1; + r6 = t2; + r7 = t3; + + t0 = dilithium_mont_red((sword64)zeta128 * (r0 - r4)); + t1 = dilithium_mont_red((sword64)zeta128 * (r1 - r5)); + t2 = dilithium_mont_red((sword64)zeta128 * (r2 - r6)); + t3 = dilithium_mont_red((sword64)zeta128 * (r3 - r7)); + r0 += r4; + r1 += r5; + r2 += r6; + r3 += r7; + r4 = t0; + r5 = t1; + r6 = t2; + r7 = t3; + + r0 = dilithium_mont_red((sword64)zeta256 * r0); + r1 = dilithium_mont_red((sword64)zeta256 * r1); + r2 = dilithium_mont_red((sword64)zeta256 * r2); + r3 = dilithium_mont_red((sword64)zeta256 * r3); + r4 = dilithium_mont_red((sword64)zeta256 * r4); + r5 = dilithium_mont_red((sword64)zeta256 * r5); + r6 = dilithium_mont_red((sword64)zeta256 * r6); + r7 = dilithium_mont_red((sword64)zeta256 * r7); + + r[j + 0] = r0; + r[j + 32] = r1; + r[j + 64] = r2; + r[j + 96] = r3; + r[j + 128] = r4; + r[j + 160] = r5; + r[j + 192] = r6; + r[j + 224] = r7; } +#endif +} - *out = (byte *)priv + idx; - *outSz = privSz - idx; - /* And finally it is concat(priv,pub). Key size check. */ - if ((key->level == 2) && (*outSz != DILITHIUM_LEVEL2_KEY_SIZE + - DILITHIUM_LEVEL2_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM)) +/* Inverse Number-Theoretic Transform. + * + * @param [in, out] r Vector of polynomials to transform. + * @param [in] l Dimension of polynomial. + */ +static void dilithium_vec_invntt(sword32* r, byte l) +{ + unsigned int i; + + for (i = 0; i < l; i++) { + dilithium_invntt(r); + r += DILITHIUM_N; } - else if ((key->level == 3) && (*outSz != DILITHIUM_LEVEL3_KEY_SIZE + - DILITHIUM_LEVEL3_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; +} +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM)) +/* Matrix multiplication. + * + * @param [out] r Vector of polynomials that is result. + * @param [in] m Matrix of polynomials. + * @param [in] v Vector of polynomials. + * @param [in] k First dimension of matrix and dimension of result. + * @param [in] l Second dimension of matrix and dimension of v. + */ +static void dilithium_matrix_mul(sword32* r, const sword32* m, const sword32* v, + byte k, byte l) +{ + byte i; + + for (i = 0; i < k; i++) { + byte j; + unsigned int e; + const sword32* vt = v; + +#ifdef WOLFSSL_DILITHIUM_SMALL + for (e = 0; e < DILITHIUM_N; e++) { + r[e] = dilithium_mont_red((sword64)m[e] * vt[e]); + } + m += DILITHIUM_N; + vt += DILITHIUM_N; + for (j = 1; j < l; j++) { + for (e = 0; e < DILITHIUM_N; e++) { + r[e] += dilithium_mont_red((sword64)m[e] * vt[e]); + } + m += DILITHIUM_N; + vt += DILITHIUM_N; + } +#elif defined(WOLFSSL_DILITHIUM_NO_LARGE_CODE) + (void)j; + if (l == 4) { + for (e = 0; e < DILITHIUM_N; e++) { + sword64 t = ((sword64)m[e + 0 * 256] * vt[e + 0 * 256]) + + ((sword64)m[e + 1 * 256] * vt[e + 1 * 256]) + + ((sword64)m[e + 2 * 256] * vt[e + 2 * 256]) + + ((sword64)m[e + 3 * 256] * vt[e + 3 * 256]); + r[e] = dilithium_mont_red(t); + } + m += DILITHIUM_N * 4; + } + else if (l == 5) { + for (e = 0; e < DILITHIUM_N; e++) { + sword64 t = ((sword64)m[e + 0 * 256] * vt[e + 0 * 256]) + + ((sword64)m[e + 1 * 256] * vt[e + 1 * 256]) + + ((sword64)m[e + 2 * 256] * vt[e + 2 * 256]) + + ((sword64)m[e + 3 * 256] * vt[e + 3 * 256]) + + ((sword64)m[e + 4 * 256] * vt[e + 4 * 256]); + r[e] = dilithium_mont_red(t); + } + m += DILITHIUM_N * 5; + } + else if (l == 7) { + for (e = 0; e < DILITHIUM_N; e++) { + sword64 t = ((sword64)m[e + 0 * 256] * vt[e + 0 * 256]) + + ((sword64)m[e + 1 * 256] * vt[e + 1 * 256]) + + ((sword64)m[e + 2 * 256] * vt[e + 2 * 256]) + + ((sword64)m[e + 3 * 256] * vt[e + 3 * 256]) + + ((sword64)m[e + 4 * 256] * vt[e + 4 * 256]) + + ((sword64)m[e + 5 * 256] * vt[e + 5 * 256]) + + ((sword64)m[e + 6 * 256] * vt[e + 6 * 256]); + r[e] = dilithium_mont_red(t); + } + m += DILITHIUM_N * 7; + } +#else + sword64 t0; + sword64 t1; +#if !defined(WOLFSSL_NO_ML_DSA_44) || !defined(WOLFSSL_NO_ML_DSA_65) + sword64 t2; + sword64 t3; +#endif + + (void)j; +#ifndef WOLFSSL_NO_ML_DSA_44 + if (l == 4) { + for (e = 0; e < DILITHIUM_N; e += 4) { + t0 = ((sword64)m[e + 0 + 0 * 256] * vt[e + 0 + 0 * 256]) + + ((sword64)m[e + 0 + 1 * 256] * vt[e + 0 + 1 * 256]) + + ((sword64)m[e + 0 + 2 * 256] * vt[e + 0 + 2 * 256]) + + ((sword64)m[e + 0 + 3 * 256] * vt[e + 0 + 3 * 256]); + t1 = ((sword64)m[e + 1 + 0 * 256] * vt[e + 1 + 0 * 256]) + + ((sword64)m[e + 1 + 1 * 256] * vt[e + 1 + 1 * 256]) + + ((sword64)m[e + 1 + 2 * 256] * vt[e + 1 + 2 * 256]) + + ((sword64)m[e + 1 + 3 * 256] * vt[e + 1 + 3 * 256]); + t2 = ((sword64)m[e + 2 + 0 * 256] * vt[e + 2 + 0 * 256]) + + ((sword64)m[e + 2 + 1 * 256] * vt[e + 2 + 1 * 256]) + + ((sword64)m[e + 2 + 2 * 256] * vt[e + 2 + 2 * 256]) + + ((sword64)m[e + 2 + 3 * 256] * vt[e + 2 + 3 * 256]); + t3 = ((sword64)m[e + 3 + 0 * 256] * vt[e + 3 + 0 * 256]) + + ((sword64)m[e + 3 + 1 * 256] * vt[e + 3 + 1 * 256]) + + ((sword64)m[e + 3 + 2 * 256] * vt[e + 3 + 2 * 256]) + + ((sword64)m[e + 3 + 3 * 256] * vt[e + 3 + 3 * 256]); + r[e + 0] = dilithium_mont_red(t0); + r[e + 1] = dilithium_mont_red(t1); + r[e + 2] = dilithium_mont_red(t2); + r[e + 3] = dilithium_mont_red(t3); + } + m += DILITHIUM_N * 4; + } + else +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 + if (l == 5) { + for (e = 0; e < DILITHIUM_N; e += 4) { + t0 = ((sword64)m[e + 0 + 0 * 256] * vt[e + 0 + 0 * 256]) + + ((sword64)m[e + 0 + 1 * 256] * vt[e + 0 + 1 * 256]) + + ((sword64)m[e + 0 + 2 * 256] * vt[e + 0 + 2 * 256]) + + ((sword64)m[e + 0 + 3 * 256] * vt[e + 0 + 3 * 256]) + + ((sword64)m[e + 0 + 4 * 256] * vt[e + 0 + 4 * 256]); + t1 = ((sword64)m[e + 1 + 0 * 256] * vt[e + 1 + 0 * 256]) + + ((sword64)m[e + 1 + 1 * 256] * vt[e + 1 + 1 * 256]) + + ((sword64)m[e + 1 + 2 * 256] * vt[e + 1 + 2 * 256]) + + ((sword64)m[e + 1 + 3 * 256] * vt[e + 1 + 3 * 256]) + + ((sword64)m[e + 1 + 4 * 256] * vt[e + 1 + 4 * 256]); + t2 = ((sword64)m[e + 2 + 0 * 256] * vt[e + 2 + 0 * 256]) + + ((sword64)m[e + 2 + 1 * 256] * vt[e + 2 + 1 * 256]) + + ((sword64)m[e + 2 + 2 * 256] * vt[e + 2 + 2 * 256]) + + ((sword64)m[e + 2 + 3 * 256] * vt[e + 2 + 3 * 256]) + + ((sword64)m[e + 2 + 4 * 256] * vt[e + 2 + 4 * 256]); + t3 = ((sword64)m[e + 3 + 0 * 256] * vt[e + 3 + 0 * 256]) + + ((sword64)m[e + 3 + 1 * 256] * vt[e + 3 + 1 * 256]) + + ((sword64)m[e + 3 + 2 * 256] * vt[e + 3 + 2 * 256]) + + ((sword64)m[e + 3 + 3 * 256] * vt[e + 3 + 3 * 256]) + + ((sword64)m[e + 3 + 4 * 256] * vt[e + 3 + 4 * 256]); + r[e + 0] = dilithium_mont_red(t0); + r[e + 1] = dilithium_mont_red(t1); + r[e + 2] = dilithium_mont_red(t2); + r[e + 3] = dilithium_mont_red(t3); + } + m += DILITHIUM_N * 5; + } + else +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 + if (l == 7) { + for (e = 0; e < DILITHIUM_N; e += 2) { + t0 = ((sword64)m[e + 0 + 0 * 256] * vt[e + 0 + 0 * 256]) + + ((sword64)m[e + 0 + 1 * 256] * vt[e + 0 + 1 * 256]) + + ((sword64)m[e + 0 + 2 * 256] * vt[e + 0 + 2 * 256]) + + ((sword64)m[e + 0 + 3 * 256] * vt[e + 0 + 3 * 256]) + + ((sword64)m[e + 0 + 4 * 256] * vt[e + 0 + 4 * 256]) + + ((sword64)m[e + 0 + 5 * 256] * vt[e + 0 + 5 * 256]) + + ((sword64)m[e + 0 + 6 * 256] * vt[e + 0 + 6 * 256]); + t1 = ((sword64)m[e + 1 + 0 * 256] * vt[e + 1 + 0 * 256]) + + ((sword64)m[e + 1 + 1 * 256] * vt[e + 1 + 1 * 256]) + + ((sword64)m[e + 1 + 2 * 256] * vt[e + 1 + 2 * 256]) + + ((sword64)m[e + 1 + 3 * 256] * vt[e + 1 + 3 * 256]) + + ((sword64)m[e + 1 + 4 * 256] * vt[e + 1 + 4 * 256]) + + ((sword64)m[e + 1 + 5 * 256] * vt[e + 1 + 5 * 256]) + + ((sword64)m[e + 1 + 6 * 256] * vt[e + 1 + 6 * 256]); + r[e + 0] = dilithium_mont_red(t0); + r[e + 1] = dilithium_mont_red(t1); + } + m += DILITHIUM_N * 7; + } + else +#endif + { + } +#endif + r += DILITHIUM_N; + } +} +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) +/* Polynomial multiplication. + * + * @param [out] r Polynomial result. + * @param [in] a Polynomial + * @param [in] b Polynomial. + */ +static void dilithium_mul(sword32* r, sword32* a, sword32* b) +{ + unsigned int e; +#ifdef WOLFSSL_DILITHIUM_SMALL + for (e = 0; e < DILITHIUM_N; e++) { + r[e] = dilithium_mont_red((sword64)a[e] * b[e]); + } +#elif defined(WOLFSSL_DILITHIUM_NO_LARGE_CODE) + for (e = 0; e < DILITHIUM_N; e += 8) { + r[e+0] = dilithium_mont_red((sword64)a[e+0] * b[e+0]); + r[e+1] = dilithium_mont_red((sword64)a[e+1] * b[e+1]); + r[e+2] = dilithium_mont_red((sword64)a[e+2] * b[e+2]); + r[e+3] = dilithium_mont_red((sword64)a[e+3] * b[e+3]); + r[e+4] = dilithium_mont_red((sword64)a[e+4] * b[e+4]); + r[e+5] = dilithium_mont_red((sword64)a[e+5] * b[e+5]); + r[e+6] = dilithium_mont_red((sword64)a[e+6] * b[e+6]); + r[e+7] = dilithium_mont_red((sword64)a[e+7] * b[e+7]); } - else if ((key->level == 5) && (*outSz != DILITHIUM_LEVEL5_KEY_SIZE + - DILITHIUM_LEVEL5_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; +#else + for (e = 0; e < DILITHIUM_N; e += 16) { + r[e+ 0] = dilithium_mont_red((sword64)a[e+ 0] * b[e+ 0]); + r[e+ 1] = dilithium_mont_red((sword64)a[e+ 1] * b[e+ 1]); + r[e+ 2] = dilithium_mont_red((sword64)a[e+ 2] * b[e+ 2]); + r[e+ 3] = dilithium_mont_red((sword64)a[e+ 3] * b[e+ 3]); + r[e+ 4] = dilithium_mont_red((sword64)a[e+ 4] * b[e+ 4]); + r[e+ 5] = dilithium_mont_red((sword64)a[e+ 5] * b[e+ 5]); + r[e+ 6] = dilithium_mont_red((sword64)a[e+ 6] * b[e+ 6]); + r[e+ 7] = dilithium_mont_red((sword64)a[e+ 7] * b[e+ 7]); + r[e+ 8] = dilithium_mont_red((sword64)a[e+ 8] * b[e+ 8]); + r[e+ 9] = dilithium_mont_red((sword64)a[e+ 9] * b[e+ 9]); + r[e+10] = dilithium_mont_red((sword64)a[e+10] * b[e+10]); + r[e+11] = dilithium_mont_red((sword64)a[e+11] * b[e+11]); + r[e+12] = dilithium_mont_red((sword64)a[e+12] * b[e+12]); + r[e+13] = dilithium_mont_red((sword64)a[e+13] * b[e+13]); + r[e+14] = dilithium_mont_red((sword64)a[e+14] * b[e+14]); + r[e+15] = dilithium_mont_red((sword64)a[e+15] * b[e+15]); } +#endif +} - return 0; +#if (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM)) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) +/* Vector multiplication. + * + * @param [out] r Vector of polynomials that is result. + * @param [in] a Polynomials + * @param [in] b Vector of polynomials. + * @param [in] l Dimension of vectors. + */ +static void dilithium_vec_mul(sword32* r, sword32* a, sword32* b, byte l) +{ + byte i; + + for (i = 0; i < l; i++) { + dilithium_mul(r, a, b); + r += DILITHIUM_N; + b += DILITHIUM_N; + } } +#endif +#endif -/* Import a dilithium private key from a byte array. +#ifndef WOLFSSL_DILITHIUM_NO_SIGN +/* Modulo reduce values in polynomial. Range (-2^31)..(2^31-1). * - * priv [in] Array holding private key. - * privSz [in] Number of bytes of data in array. - * key [in] Dilithium private key. - * returns BAD_FUNC_ARG when a parameter is NULL or privSz is less than - * DILITHIUM_LEVEL2_KEY_SIZE, - * 0 otherwise. - */ -int wc_dilithium_import_private_only(const byte* priv, word32 privSz, - dilithium_key* key) -{ - int ret = 0; - byte *newPriv = NULL; - word32 newPrivSz = 0; - - if ((ret = parse_private_key(priv, privSz, &newPriv, &newPrivSz, key)) - != 0) { - return ret; + * @param [in, out] a Polynomial. + */ +static void dilithium_poly_red(sword32* a) +{ + word16 j; +#ifdef WOLFSSL_DILITHIUM_SMALL + for (j = 0; j < DILITHIUM_N; j++) { + a[j] = dilithium_red(a[j]); } +#else + for (j = 0; j < DILITHIUM_N; j += 8) { + a[j+0] = dilithium_red(a[j+0]); + a[j+1] = dilithium_red(a[j+1]); + a[j+2] = dilithium_red(a[j+2]); + a[j+3] = dilithium_red(a[j+3]); + a[j+4] = dilithium_red(a[j+4]); + a[j+5] = dilithium_red(a[j+5]); + a[j+6] = dilithium_red(a[j+6]); + a[j+7] = dilithium_red(a[j+7]); + } +#endif +} - if (key->level == 2) { - XMEMCPY(key->k, newPriv, DILITHIUM_LEVEL2_KEY_SIZE); +#ifndef WOLFSSL_DILITHIUM_SIGN_SMALL_MEM +/* Modulo reduce values in polynomials of vector. Range (-2^31)..(2^31-1). + * + * @param [in, out] a Vector of polynomials. + * @param [in] l Dimension of vector. + */ +static void dilithium_vec_red(sword32* a, byte l) +{ + byte i; + + for (i = 0; i < l; i++) { + dilithium_poly_red(a); + a += DILITHIUM_N; } - else if (key->level == 3) { - XMEMCPY(key->k, newPriv, DILITHIUM_LEVEL3_KEY_SIZE); +} +#endif /* WOLFSSL_DILITHIUM_SIGN_SMALL_MEM*/ +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +#if (!defined(WOLFSSL_DILITHIUM_NO_SIGN) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM))) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) +/* Subtract polynomials a from r. r -= a. + * + * @param [out] r Polynomial to subtract from. + * @param [in] a Polynomial to subtract. + */ +static void dilithium_sub(sword32* r, const sword32* a) +{ + word16 j; +#ifdef WOLFSSL_DILITHIUM_SMALL + for (j = 0; j < DILITHIUM_N; j++) { + r[j] -= a[j]; } - else if (key->level == 5) { - XMEMCPY(key->k, newPriv, DILITHIUM_LEVEL5_KEY_SIZE); +#else + for (j = 0; j < DILITHIUM_N; j += 8) { + r[j+0] -= a[j+0]; + r[j+1] -= a[j+1]; + r[j+2] -= a[j+2]; + r[j+3] -= a[j+3]; + r[j+4] -= a[j+4]; + r[j+5] -= a[j+5]; + r[j+6] -= a[j+6]; + r[j+7] -= a[j+7]; } - key->prvKeySet = 1; +#endif +} - return 0; +#if defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM)) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM)) +/* Subtract vector a from r. r -= a. + * + * @param [out] r Vector of polynomials that is result. + * @param [in] a Vector of polynomials to subtract. + * @param [in] l Dimension of vectors. + */ +static void dilithium_vec_sub(sword32* r, const sword32* a, byte l) +{ + byte i; + + for (i = 0; i < l; i++) { + dilithium_sub(r, a); + r += DILITHIUM_N; + a += DILITHIUM_N; + } } +#endif +#endif -/* Import a dilithium private and public keys from byte array(s). +#ifndef WOLFSSL_DILITHIUM_VERIFY_ONLY +/* Add polynomials a to r. r += a. * - * priv [in] Array holding private key or private+public keys - * privSz [in] Number of bytes of data in private key array. - * pub [in] Array holding public key (or NULL). - * pubSz [in] Number of bytes of data in public key array (or 0). - * key [in] Dilithium private/public key. - * returns BAD_FUNC_ARG when a required parameter is NULL or an invalid - * combination of keys/lengths is supplied, 0 otherwise. + * @param [out] r Polynomial to add to. + * @param [in] a Polynomial to add. */ -int wc_dilithium_import_private_key(const byte* priv, word32 privSz, - const byte* pub, word32 pubSz, - dilithium_key* key) +static void dilithium_add(sword32* r, const sword32* a) +{ + word16 j; +#ifdef WOLFSSL_DILITHIUM_SMALL + for (j = 0; j < DILITHIUM_N; j++) { + r[j] += a[j]; + } +#else + for (j = 0; j < DILITHIUM_N; j += 8) { + r[j+0] += a[j+0]; + r[j+1] += a[j+1]; + r[j+2] += a[j+2]; + r[j+3] += a[j+3]; + r[j+4] += a[j+4]; + r[j+5] += a[j+5]; + r[j+6] += a[j+6]; + r[j+7] += a[j+7]; + } +#endif +} + +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM)) +/* Add vector a to r. r += a. + * + * @param [out] r Vector of polynomials that is result. + * @param [in] a Vector of polynomials to add. + * @param [in] l Dimension of vectors. + */ +static void dilithium_vec_add(sword32* r, const sword32* a, byte l) +{ + byte i; + + for (i = 0; i < l; i++) { + dilithium_add(r, a); + r += DILITHIUM_N; + a += DILITHIUM_N; + } +} +#endif + +/* Make values in polynomial be in positive range. + * + * @param [in, out] a Polynomial. + */ +static void dilithium_make_pos(sword32* a) +{ + word16 j; +#ifdef WOLFSSL_DILITHIUM_SMALL + for (j = 0; j < DILITHIUM_N; j++) { + a[j] += (0 - (((word32)a[j]) >> 31)) & DILITHIUM_Q; + } +#else + for (j = 0; j < DILITHIUM_N; j += 8) { + a[j+0] += (0 - (((word32)a[j+0]) >> 31)) & DILITHIUM_Q; + a[j+1] += (0 - (((word32)a[j+1]) >> 31)) & DILITHIUM_Q; + a[j+2] += (0 - (((word32)a[j+2]) >> 31)) & DILITHIUM_Q; + a[j+3] += (0 - (((word32)a[j+3]) >> 31)) & DILITHIUM_Q; + a[j+4] += (0 - (((word32)a[j+4]) >> 31)) & DILITHIUM_Q; + a[j+5] += (0 - (((word32)a[j+5]) >> 31)) & DILITHIUM_Q; + a[j+6] += (0 - (((word32)a[j+6]) >> 31)) & DILITHIUM_Q; + a[j+7] += (0 - (((word32)a[j+7]) >> 31)) & DILITHIUM_Q; + } +#endif +} + +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + defined(WOLFSSL_DILITHIUM_CHECK_KEY) || \ + (!defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM)) +/* Make values in polynomials of vector be in positive range. + * + * @param [in, out] a Vector of polynomials. + * @param [in] l Dimension of vector. + */ +static void dilithium_vec_make_pos(sword32* a, byte l) +{ + byte i; + + for (i = 0; i < l; i++) { + dilithium_make_pos(a); + a += DILITHIUM_N; + } +} +#endif + +#endif /* !WOLFSSL_DILITHIUM_VERIFY_ONLY */ + +/******************************************************************************/ + +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY + +/* Make a key from a random seed. + * + * xi is seed passed in. + * FIPS 204. 5: Algorithm 1 ML-DSA.KeyGen() + * ... + * 2: (rho, rho', K) E {0,1}256 x {0,1}512 x {0,1}256 <- H(xi, 1024) + * 3: A_circum <- ExpandA(rho) + * 4: (s1,s2) <- ExpandS(rho') + * 5: t <- NTT-1(A_circum o NTT(s1)) + s2 + * 6: (t1, t0) <- Power2Round(t, d) + * 7: pk <- pkEncode(rho, t1) + * 8: tr <- H(BytesToBits(pk), 512) + * 9: sk <- skEncode(rho, K, tr, s1, s2, t0) + * 10: return (pk, sk) + * + * FIPS 204. 8.2: Algorithm 16 pkEncode(rho, t1) + * 1: pk <- BitsToBytes(rho) + * 2: for i from 0 to l - 1 do + * 3: pk <- pk || SimpleBitPack(t1[i], 2^(bitlen(q-1)-d) - 1) + * 4: end for + * 5: return pk + * + * FIPS 204. 8.2: Algorithm 18 skEncode(rho, K, tr, s, s2, t0) + * 1: sk <- BitsToBytes(rho) || BitsToBytes(K) || BitsToBytes(tr) + * 2: for i from 0 to l - 1 do + * 3: sk <- sk || BitPack(s1[i], eta, eta) + * 4: end for + * 5: for i from 0 to k - 1 do + * 6: sk <- sk || BitPack(s2[i], eta, eta) + * 7: end for + * 8: for i from 0 to k - 1 do + * 9: sk <- sk || BitPack(t0[i], 2^(d-1)-1, 2^(d-1)) + * 10: end for + * 11: return sk + * + * Public and private key store in key. + * + * @param [in, out] key Dilithium key. + * @param [in] seed Seed to hash to generate values. + * @return 0 on success. + * @return MEMORY_E when memory allocation fails. + * @return Other negative when an error occurs. + */ +static int dilithium_make_key_from_seed(dilithium_key* key, const byte* seed) { int ret = 0; - byte *newPriv = NULL; - word32 newPrivSz = 0; + const wc_dilithium_params* params = key->params; + sword32* a = NULL; + sword32* s1 = NULL; + sword32* s2 = NULL; + sword32* t = NULL; + byte* pub_seed = key->k; + + /* Allocate memory for large intermediates. */ +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + if (key->a == NULL) { + key->a = (sword32*)XMALLOC(params->aSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (key->a == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + a = key->a; + } +#endif +#ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + if ((ret == 0) && (key->s1 == NULL)) { + key->s1 = (sword32*)XMALLOC(params->aSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (key->s1 == NULL) { + ret = MEMORY_E; + } + else { + key->s2 = key->s1 + params->s1Sz / sizeof(*s1); + key->t0 = key->s2 + params->s2Sz / sizeof(*s2); + } + } + if (ret == 0) { + s1 = key->s1; + s2 = key->s2; + t = key->t0; + } +#else + if (ret == 0) { + unsigned int allocSz; + + allocSz = params->s1Sz + params->s2Sz + params->s2Sz; +#ifndef WC_DILITHIUM_CACHE_MATRIX_A + allocSz += params->aSz; +#endif - if ((ret = parse_private_key(priv, privSz, &newPriv, &newPrivSz, key)) - != 0) { - return ret; + /* s1, s2, t, a */ + s1 = (sword32*)XMALLOC(allocSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (s1 == NULL) { + ret = MEMORY_E; + } + else { + s2 = s1 + params->s1Sz / sizeof(*s1); + t = s2 + params->s2Sz / sizeof(*s2); +#ifndef WC_DILITHIUM_CACHE_MATRIX_A + a = t + params->s2Sz / sizeof(*s2); +#endif + } + } +#endif + + if (ret == 0) { + /* Step 2: Create public seed, private seed and K from seed. + * Step 9; Alg 18, Step 1: Public seed is placed into private key. */ + ret = dilithium_shake256(&key->shake, seed, DILITHIUM_SEED_SZ, pub_seed, + DILITHIUM_SEEDS_SZ); + } + if (ret == 0) { + /* Step 7; Alg 16 Step 1: Copy public seed into public key. */ + XMEMCPY(key->p, pub_seed, DILITHIUM_PUB_SEED_SZ); + + /* Step 3: Expand public seed into a matrix of polynomials. */ + ret = dilithium_expand_a(&key->shake, pub_seed, params->k, params->l, + a); + } + if (ret == 0) { + byte* priv_seed = key->k + DILITHIUM_PUB_SEED_SZ; + + /* Step 4: Expand private seed into to vectors of polynomials. */ + ret = dilithium_expand_s(&key->shake, priv_seed, params->eta, s1, + params->l, s2, params->k); + } + if (ret == 0) { + byte* k = pub_seed + DILITHIUM_PUB_SEED_SZ; + byte* tr = k + DILITHIUM_K_SZ; + byte* s1p = tr + DILITHIUM_TR_SZ; + byte* s2p = s1p + params->s1EncSz; + byte* t0 = s2p + params->s2EncSz; + byte* t1 = key->p + DILITHIUM_PUB_SEED_SZ; + + /* Step 9: Move k down to after public seed. */ + XMEMCPY(k, k + DILITHIUM_PRIV_SEED_SZ, DILITHIUM_K_SZ); + /* Step 9. Alg 18 Steps 2-4: Encode s1 into private key. */ + dilthium_vec_encode_eta_bits(s1, params->l, params->eta, s1p); + /* Step 9. Alg 18 Steps 5-7: Encode s2 into private key. */ + dilthium_vec_encode_eta_bits(s2, params->k, params->eta, s2p); + + /* Step 5: t <- NTT-1(A_circum o NTT(s1)) + s2 */ + dilithium_vec_ntt_small(s1, params->l); + dilithium_matrix_mul(t, a, s1, params->k, params->l); + dilithium_vec_invntt(t, params->k); + dilithium_vec_add(t, s2, params->k); + + /* Make positive for decomposing. */ + dilithium_vec_make_pos(t, params->k); + /* Step 6, Step 7, Step 9. Alg 16 Steps 2-4, Alg 18 Steps 8-10. + * Decompose t in t0 and t1 and encode into public and private key. + */ + dilithium_vec_encode_t0_t1(t, params->k, t0, t1); + /* Step 8. Alg 18, Step 1: Hash public key into private key. */ + ret = dilithium_shake256(&key->shake, key->p, params->pkSz, tr, + DILITHIUM_TR_SZ); + } + if (ret == 0) { + /* Public key and private key are available. */ + key->prvKeySet = 1; + key->pubKeySet = 1; +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + /* Matrix A is available. */ + key->aSet = 1; +#endif +#ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + /* Private vectors are not available as they were overwritten. */ + key->privVecsSet = 0; +#endif +#ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + /* Public vector, t1, is not available as it was not created. */ + key->pubVecSet = 0; +#endif } - if (pub == NULL) { - if (pubSz != 0) { - return BAD_FUNC_ARG; +#ifndef WC_DILITHIUM_CACHE_PRIV_VECTORS + XFREE(s1, NULL, DYNAMIC_TYPE_DILITHIUM); +#endif + return ret; +} + +/* Make a key from a random seed. + * + * FIPS 204. 5: Algorithm 1 ML-DSA.KeyGen() + * 1: xi <- {0,1}256 [Choose random seed] + * ... + * + * @param [in, out] key Dilithium key. + * @param [in] rng Random number generator. + * @return 0 on success. + * @return MEMORY_E when memory allocation fails. + * @return Other negative when an error occurs. + */ +static int dilithium_make_key(dilithium_key* key, WC_RNG* rng) +{ + int ret; + byte seed[DILITHIUM_SEED_SZ]; + + /* Generate a 256-bit random seed. */ + ret = wc_RNG_GenerateBlock(rng, seed, DILITHIUM_SEED_SZ); + if (ret == 0) { + /* Make key with random seed. */ + ret = wc_dilithium_make_key_from_seed(key, seed); + } + + return ret; +} +#endif /* !WOLFSSL_DILITHIUM_NO_MAKE_KEY */ + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + +#if !defined(WOLFSSL_DILITHIUM_SIGN_SMALL_MEM) || \ + defined(WC_DILITHIUM_CACHE_PRIV_VECTORS) +/* Decode, from private key, and NTT private key vectors s1, s2, and t0. + * + * FIPS 204. 6: Algorithm 2 MD-DSA.Sign(sk, M) + * 1: (rho, K, tr, s1, s2, t0) <- skDecode(sk) + * 2: s1_circum <- NTT(s1) + * 3: s2_circum <- NTT(s2) + * 4: t0_circum <- NTT(t0) + * + * @param [in, out] key Dilithium key. + * @param [out] s1 Vector of polynomials s1. + * @param [out] s2 Vector of polynomials s2. + * @param [out] t0 Vector of polynomials t0. + */ +static void dilithium_make_priv_vecs(dilithium_key* key, sword32* s1, + sword32* s2, sword32* t0) +{ + const wc_dilithium_params* params = key->params; + const byte* pubSeed = key->k; + const byte* k = pubSeed + DILITHIUM_PUB_SEED_SZ; + const byte* tr = k + DILITHIUM_K_SZ; + const byte* s1p = tr + DILITHIUM_TR_SZ; + const byte* s2p = s1p + params->s1EncSz; + const byte* t0p = s2p + params->s2EncSz; + + /* Step 1: Decode s1, s2, t0. */ + dilithium_vec_decode_eta_bits(s1p, params->eta, s1, params->l); + dilithium_vec_decode_eta_bits(s2p, params->eta, s2, params->k); + dilithium_vec_decode_t0(t0p, params->k, t0); + + /* Step 2: NTT s1. */ + dilithium_vec_ntt_small(s1, params->l); + /* Step 3: NTT s2. */ + dilithium_vec_ntt_small(s2, params->k); + /* Step 4: NTT t0. */ + dilithium_vec_ntt(t0, params->k); + +#ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + /* Private key vectors have been created. */ + key->privVecsSet = 1; +#endif +} +#endif + +/* Sign a message with the key and a seed. + * + * FIPS 204. 6: Algorithm 2 MD-DSA.Sign(sk, M) + * 1: (rho, K, tr, s1, s2, t0) <- skDecode(sk) + * 2: s1_circum <- NTT(s1) + * 3: s2_circum <- NTT(s2) + * 4: t0_circum <- NTT(t0) + * 5: A_circum <- ExpandA(rho) + * 6: mu <- H(tr||M, 512) + * 7: rnd <- {0,1}256 + * 8: rho' <- H(K||rnd||mu, 512) + * 9: kappa <- 0 + * 10: (z, h) <- falsam + * 11: while (z, h) = falsam do + * 12: y <- ExpandMask(rho', kappa) + * 13: w <- NTT-1(A_circum o NTT(y)) + * 14: w1 <- HighBits(w) + * 15: c_tilde E {0,1}2*lambda <- H(mu|w1Encode(w1), 2 * lambda) + * 16: (c1_tilde, c2_tilde) E {0,1}256 x {0,1}2*lambda-256 <- c_tilde + * 17: c < SampleInBall(c1_tilde) + * 18: c_circum <- NTT(c) + * 19: <> <- NTT-1(c_circum o s1_circum) + * 20: <> <- NTT-1(c_circum o s2_circum) + * 21: z <- y + <> + * 22: r0 <- LowBits(w - <> + * 23: if ||z||inf >= GAMMA1 - BETA or ||r0||inf GAMMA2 - BETA then + * (z, h) <- falsam + * 24: else + * 25: <> <- NTT-1(c_circum o t0_circum) + * 26: h < MakeHint(-<>, w - <> + <>) + * 27: if (||<>||inf >= GAMMMA1 or + * the number of 1's in h is greater than OMEGA, then + * (z, h) <- falsam + * 28: end if + * 29: end if + * 30: kappa <- kappa + l + * 31: end while + * 32: sigma <- sigEncode(c_tilde, z mod +/- q, h) + * 33: return sigma + * + * @param [in, out] key Dilithium key. + * @param [in, out] seed Random seed. + * @param [in] msg Message data to sign. + * @param [in] msgLen Length of message data in bytes. + * @param [out] sig Buffer to hold signature. + * @param [in, out] sigLen On in, length of buffer in bytes. + * On out, the length of the signature in bytes. + * @return 0 on success. + * @return BUFFER_E when the signature buffer is too small. + * @return MEMORY_E when memory allocation fails. + * @return Other negative when an error occurs. + */ +static int dilithium_sign_msg_with_seed(dilithium_key* key, const byte* seed, + const byte* msg, word32 msgLen, byte* sig, word32 *sigLen) +{ +#ifndef WOLFSSL_DILITHIUM_SIGN_SMALL_MEM + int ret = 0; + const wc_dilithium_params* params = key->params; + byte* pub_seed = key->k; + byte* k = pub_seed + DILITHIUM_PUB_SEED_SZ; + byte* tr = k + DILITHIUM_K_SZ; + sword32* a = NULL; + sword32* s1 = NULL; + sword32* s2 = NULL; + sword32* t0 = NULL; + sword32* y = NULL; + sword32* w0 = NULL; + sword32* w1 = NULL; + sword32* c = NULL; + sword32* z = NULL; + sword32* ct0 = NULL; + byte data[DILITHIUM_RND_SZ + DILITHIUM_MU_SZ]; + byte* mu = data + DILITHIUM_RND_SZ; + byte priv_rand_seed[DILITHIUM_Y_SEED_SZ]; + byte* h = sig + params->lambda * 2 + params->zEncSz; + + /* Check the signature buffer isn't too small. */ + if ((ret == 0) && (*sigLen < params->sigSz)) { + ret = BUFFER_E; + } + if (ret == 0) { + /* Return the size of the signature. */ + *sigLen = params->sigSz; + } + + /* Allocate memory for large intermediates. */ +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + if ((ret == 0) && (key->a == NULL)) { + a = (sword32*)XMALLOC(params->aSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (a == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + a = key->a; + } +#endif +#ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + if ((ret == 0) && (key->s1 == NULL)) { + key->s1 = (sword32*)XMALLOC(params->aSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (key->s1 == NULL) { + ret = MEMORY_E; + } + else { + key->s2 = key->s1 + params->s1Sz / sizeof(*s1); + key->t0 = key->s2 + params->s2Sz / sizeof(*s2); + } + } + if (ret == 0) { + s1 = key->s1; + s2 = key->s2; + t0 = key->t0; + } +#endif + if (ret == 0) { + unsigned int allocSz; + + /* y-l, w0-k, w1-k, c-1, z-l, ct0-k */ + allocSz = params->s1Sz + params->s2Sz + params->s2Sz + + DILITHIUM_POLY_SIZE + params->s1Sz + params->s2Sz; +#ifndef WC_DILITHIUM_CACHE_PRIV_VECTORS + /* s1-l, s2-k, t0-k */ + allocSz += params->s1Sz + params->s2Sz + params->s2Sz; +#endif +#ifndef WC_DILITHIUM_CACHE_MATRIX_A + /* A */ + allocSz += params->aSz; +#endif + y = (sword32*)XMALLOC(allocSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (y == NULL) { + ret = MEMORY_E; + } + else { + w0 = y + params->s1Sz / sizeof(*y); + w1 = w0 + params->s2Sz / sizeof(*w0); + c = w1 + params->s2Sz / sizeof(*w1); + z = c + DILITHIUM_N; + ct0 = z + params->s1Sz / sizeof(*z); +#ifndef WC_DILITHIUM_CACHE_PRIV_VECTORS + s1 = ct0 + params->s2Sz / sizeof(*ct0); + s2 = s1 + params->s1Sz / sizeof(*s1); + t0 = s2 + params->s2Sz / sizeof(*s2); +#endif +#ifndef WC_DILITHIUM_CACHE_MATRIX_A + a = t0 + params->s2Sz / sizeof(*s2); +#endif + } + } + + if (ret == 0) { +#ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + /* Check that we haven't already cached the private vectors. */ + if (!key->privVecsSet) +#endif + { + /* Steps 1-4: Decode and NTT vectors s1, s2, and t0. */ + dilithium_make_priv_vecs(key, s1, s2, t0); + } + +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + /* Check that we haven't already cached the matrix A. */ + if (!key->aSet) +#endif + { + /* Step 5: Create the matrix A from the public seed. */ + ret = dilithium_expand_a(&key->shake, pub_seed, params->k, + params->l, a); +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + key->aSet = (ret == 0); +#endif + } + } + if (ret == 0) { + /* Step 6: Compute the hash of tr, public key hash, and message. */ + ret = dilithium_hash256(&key->shake, tr, DILITHIUM_TR_SZ, msg, msgLen, + mu, DILITHIUM_MU_SZ); + } + if (ret == 0) { + /* Step 7: Copy random into buffer for hashing. */ + XMEMCPY(data, seed, DILITHIUM_RND_SZ); + } + if (ret == 0) { + /* Step 9: Compute private random using hash. */ + ret = dilithium_hash256(&key->shake, k, DILITHIUM_K_SZ, data, + DILITHIUM_RND_SZ + DILITHIUM_MU_SZ, priv_rand_seed, + DILITHIUM_PRIV_RAND_SEED_SZ); + } + if (ret == 0) { + word16 kappa = 0; + int valid = 0; + + /* Step 11: Start rejection sampling loop */ + do { + byte w1e[DILITHIUM_MAX_W1_ENC_SZ]; + sword32* w = w1; + sword32* y_ntt = z; + sword32* cs2 = ct0; + byte* commit = sig; + + /* Step 12: Compute vector y from private random seed and kappa. */ + dilithium_vec_expand_mask(&key->shake, priv_rand_seed, kappa, + params->gamma1_bits, y, params->l); + #ifdef WOLFSSL_DILITHIUM_SIGN_CHECK_Y + valid = dilithium_vec_check_low(y, params->l, + (1 << params->gamma1_bits) - params->beta); + if (valid) + #endif + { + /* Step 13: NTT-1(A o NTT(y)) */ + XMEMCPY(y_ntt, y, params->s1Sz); + dilithium_vec_ntt(y_ntt, params->l); + dilithium_matrix_mul(w, a, y_ntt, params->k, params->l); + dilithium_vec_invntt(w, params->k); + /* Step 14, Step 22: Make values positive and decompose. */ + dilithium_vec_make_pos(w, params->k); + dilithium_vec_decompose(w, params->k, params->gamma2, w0, w1); + #ifdef WOLFSSL_DILITHIUM_SIGN_CHECK_W0 + valid = dilithium_vec_check_low(w0, params->k, + params->gamma2 - params->beta); + } + if (valid) { + #endif + /* Step 15: Encode w1. */ + dilithium_vec_encode_w1(w1, params->k, params->gamma2, w1e); + /* Step 15: Hash mu and encoded w1. + * Step 32: Hash is stored in signature. */ + ret = dilithium_hash256(&key->shake, mu, DILITHIUM_MU_SZ, + w1e, params->w1EncSz, commit, 2 * params->lambda); + if (ret == 0) { + /* Step 17: Compute c from first 256 bits of commit. */ + ret = dilithium_sample_in_ball(&key->shake, commit, + params->tau, c, NULL); + } + if (ret == 0) { + sword32 hi; + + /* Step 18: NTT(c). */ + dilithium_ntt_small(c); + /* Step 20: cs2 = NTT-1(c o s2) */ + dilithium_vec_mul(cs2, c, s2, params->k); + dilithium_vec_invntt(cs2, params->k); + /* Step 22: w0 - cs2 */ + dilithium_vec_sub(w0, cs2, params->k); + dilithium_vec_red(w0, params->k); + /* Step 23: Check w0 - cs2 has low enough values. */ + hi = params->gamma2 - params->beta; + valid = dilithium_vec_check_low(w0, params->k, hi); + if (valid) { + /* Step 19: cs1 = NTT-1(c o s1) */ + dilithium_vec_mul(z, c, s1, params->l); + dilithium_vec_invntt(z, params->l); + /* Step 21: z = y + cs1 */ + dilithium_vec_add(z, y, params->l); + dilithium_vec_red(z, params->l); + /* Step 23: Check z has low enough values. */ + hi = (1 << params->gamma1_bits) - params->beta; + valid = dilithium_vec_check_low(z, params->l, hi); + } + if (valid) { + /* Step 25: ct0 = NTT-1(c o t0) */ + dilithium_vec_mul(ct0, c, t0, params->k); + dilithium_vec_invntt(ct0, params->k); + /* Step 27: Check ct0 has low enough values. */ + hi = params->gamma2; + valid = dilithium_vec_check_low(ct0, params->k, hi); + } + if (valid) { + /* Step 26: ct0 = ct0 + w0 */ + dilithium_vec_add(ct0, w0, params->k); + dilithium_vec_red(ct0, params->k); + /* Step 26, 27: Make hint from ct0 and w1 and check + * number of hints is valid. + * Step 32: h is encoded into signature. + */ + valid = (dilithium_make_hint(ct0, w1, params->k, + params->gamma2, params->omega, h) >= 0); + } + } + } + + if (!valid) { + /* Too many attempts - something wrong with implementation. */ + if ((kappa > (word16)(kappa + params->l))) { + ret = BAD_COND_E; + } + + /* Step 30: increment value to append to seed to unique value. + */ + kappa += params->l; + } + } + /* Step 11: Check we have a valid signature. */ + while ((ret == 0) && (!valid)); + } + if (ret == 0) { + byte* ze = sig + params->lambda * 2; + /* Step 32: Encode z into signature. + * Commit (c) and h already encoded into signature. */ + dilithium_vec_encode_gamma1(z, params->l, params->gamma1_bits, ze); + } + + XFREE(y, NULL, DYNAMIC_TYPE_DILITHIUM); + return ret; +#else + int ret = 0; + const wc_dilithium_params* params = key->params; + byte* pub_seed = key->k; + byte* k = pub_seed + DILITHIUM_PUB_SEED_SZ; + byte* tr = k + DILITHIUM_K_SZ; + const byte* s1p = tr + DILITHIUM_TR_SZ; + const byte* s2p = s1p + params->s1EncSz; + const byte* t0p = s2p + params->s2EncSz; + sword32* a = NULL; + sword32* s1 = NULL; + sword32* s2 = NULL; + sword32* t0 = NULL; + sword32* y = NULL; + sword32* y_ntt = NULL; + sword32* w0 = NULL; + sword32* w1 = NULL; + sword32* c = NULL; + sword32* z = NULL; + sword32* ct0 = NULL; + byte data[DILITHIUM_RND_SZ + DILITHIUM_MU_SZ]; + byte* mu = data + DILITHIUM_RND_SZ; + byte priv_rand_seed[DILITHIUM_Y_SEED_SZ]; + byte* h = sig + params->lambda * 2 + params->zEncSz; + + /* Check the signature buffer isn't too small. */ + if ((ret == 0) && (*sigLen < params->sigSz)) { + ret = BUFFER_E; + } + if (ret == 0) { + /* Return the size of the signature. */ + *sigLen = params->sigSz; + } + + /* Allocate memory for large intermediates. */ + if (ret == 0) { + unsigned int allocSz; + + /* y-l, w0-k, w1-k, c-1, s1-1, A-1 */ + allocSz = params->s1Sz + params->s2Sz + params->s2Sz + + DILITHIUM_POLY_SIZE + DILITHIUM_POLY_SIZE + DILITHIUM_POLY_SIZE; + y = (sword32*)XMALLOC(allocSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (y == NULL) { + ret = MEMORY_E; + } + else { + w0 = y + params->s1Sz / sizeof(*y_ntt); + w1 = w0 + params->s2Sz / sizeof(*w0); + c = w1 + params->s2Sz / sizeof(*w1); + s1 = c + DILITHIUM_N; + a = s1 + DILITHIUM_N; + s2 = s1; + t0 = s1; + ct0 = s1; + z = s1; + y_ntt = s1; + } + } + + if (ret == 0) { + /* Step 7: Copy random into buffer for hashing. */ + XMEMCPY(data, seed, DILITHIUM_RND_SZ); + + /* Step 6: Compute the hash of tr, public key hash, and message. */ + ret = dilithium_hash256(&key->shake, tr, DILITHIUM_TR_SZ, msg, msgLen, + mu, DILITHIUM_MU_SZ); + } + if (ret == 0) { + /* Step 9: Compute private random using hash. */ + ret = dilithium_hash256(&key->shake, k, DILITHIUM_K_SZ, data, + DILITHIUM_RND_SZ + DILITHIUM_MU_SZ, priv_rand_seed, + DILITHIUM_PRIV_RAND_SEED_SZ); + } + if (ret == 0) { + word16 kappa = 0; + int valid; + + /* Step 11: Start rejection sampling loop */ + do { + byte w1e[DILITHIUM_MAX_W1_ENC_SZ]; + sword32* w = w1; + byte* commit = sig; + byte r; + byte s; + byte aseed[DILITHIUM_GEN_A_SEED_SZ]; + sword32 hi; + sword32* at = a; + sword32* wt = w; + sword32* w0t = w0; + sword32* w1t = w1; + + valid = 1; + /* Step 12: Compute vector y from private random seed and kappa. */ + dilithium_vec_expand_mask(&key->shake, priv_rand_seed, kappa, + params->gamma1_bits, y, params->l); + #ifdef WOLFSSL_DILITHIUM_SIGN_CHECK_Y + valid = dilithium_vec_check_low(y, params->l, + (1 << params->gamma1_bits) - params->beta); + #endif + + /* Step 5: Create the matrix A from the public seed. */ + /* Copy the seed into a buffer that has space for s and r. */ + XMEMCPY(aseed, pub_seed, DILITHIUM_PUB_SEED_SZ); + /* Alg 26. Step 1: Loop over first dimension of matrix. */ + for (r = 0; (ret == 0) && valid && (r < params->k); r++) { + unsigned int e; + sword32* yt = y; + + /* Put r/i into buffer to be hashed. */ + aseed[DILITHIUM_PUB_SEED_SZ + 1] = r; + /* Alg 26. Step 2: Loop over second dimension of matrix. */ + for (s = 0; (ret == 0) && (s < params->l); s++) { + /* Put s into buffer to be hashed. */ + aseed[DILITHIUM_PUB_SEED_SZ + 0] = s; + /* Alg 26. Step 3: Create polynomial from hashing seed. */ + ret = dilithium_rej_ntt_poly(&key->shake, aseed, at, + NULL); + if (ret != 0) { + break; + } + XMEMCPY(y_ntt, yt, DILITHIUM_POLY_SIZE); + dilithium_ntt(y_ntt); + /* Matrix multiply. */ + if (s == 0) { + for (e = 0; e < DILITHIUM_N; e++) { + wt[e] = dilithium_mont_red((sword64)at[e] * + y_ntt[e]); + } + } + else { + for (e = 0; e < DILITHIUM_N; e++) { + wt[e] += dilithium_mont_red((sword64)at[e] * + y_ntt[e]); + } + } + /* Next polynomial. */ + yt += DILITHIUM_N; + } + dilithium_invntt(wt); + /* Step 14, Step 22: Make values positive and decompose. */ + dilithium_make_pos(wt); + #ifndef WOLFSSL_NO_ML_DSA_44 + if (params->gamma2 == DILITHIUM_Q_LOW_88) { + /* For each value of polynomial. */ + for (e = 0; e < DILITHIUM_N; e++) { + /* Decompose value into two vectors. */ + dilithium_decompose_q88(wt[e], &w0t[e], &w1t[e]); + } + } + #endif + #if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (params->gamma2 == DILITHIUM_Q_LOW_32) { + /* For each value of polynomial. */ + for (e = 0; e < DILITHIUM_N; e++) { + /* Decompose value into two vectors. */ + dilithium_decompose_q32(wt[e], &w0t[e], &w1t[e]); + } + } + #endif + #ifdef WOLFSSL_DILITHIUM_SIGN_CHECK_W0 + valid = dilithium_vec_check_low(w0t, + params->gamma2 - params->beta); + #endif + wt += DILITHIUM_N; + w0t += DILITHIUM_N; + w1t += DILITHIUM_N; + } + if ((ret == 0) && valid) { + sword32* yt = y; + const byte* s1pt = s1p; + byte* ze = sig + params->lambda * 2; + + /* Step 15: Encode w1. */ + dilithium_vec_encode_w1(w1, params->k, params->gamma2, w1e); + /* Step 15: Hash mu and encoded w1. + * Step 32: Hash is stored in signature. */ + ret = dilithium_hash256(&key->shake, mu, DILITHIUM_MU_SZ, + w1e, params->w1EncSz, commit, 2 * params->lambda); + if (ret == 0) { + /* Step 17: Compute c from first 256 bits of commit. */ + ret = dilithium_sample_in_ball(&key->shake, commit, + params->tau, c, NULL); + } + if (ret == 0) { + /* Step 18: NTT(c). */ + dilithium_ntt_small(c); + } + + for (s = 0; (ret == 0) && valid && (s < params->l); s++) { + #if !defined(WOLFSSL_NO_ML_DSA_44) || \ + !defined(WOLFSSL_NO_ML_DSA_87) + /* -2..2 */ + if (params->eta == DILITHIUM_ETA_2) { + dilithium_decode_eta_2_bits(s1pt, s1); + s1pt += DILITHIUM_ETA_2_BITS * DILITHIUM_N / 8; + } + #endif + #ifndef WOLFSSL_NO_ML_DSA_65 + /* -4..4 */ + if (params->eta == DILITHIUM_ETA_4) { + dilithium_decode_eta_4_bits(s1pt, s1); + s1pt += DILITHIUM_N / 2; + } + #endif + dilithium_ntt_small(s1); + dilithium_mul(z, c, s1); + /* Step 19: cs1 = NTT-1(c o s1) */ + dilithium_invntt(z); + /* Step 21: z = y + cs1 */ + dilithium_add(z, yt); + dilithium_poly_red(z); + /* Step 23: Check z has low enough values. */ + hi = (1 << params->gamma1_bits) - params->beta; + valid = dilithium_check_low(z, hi); + if (valid) { + /* Step 32: Encode z into signature. + * Commit (c) and h already encoded into signature. */ + #if !defined(WOLFSSL_NO_ML_DSA_44) + if (params->gamma1_bits == DILITHIUM_GAMMA1_BITS_17) { + dilithium_encode_gamma1_17_bits(z, ze); + /* Move to next place to encode to. */ + ze += DILITHIUM_GAMMA1_17_ENC_BITS / 2 * + DILITHIUM_N / 4; + } + else + #endif + #if !defined(WOLFSSL_NO_ML_DSA_65) || \ + !defined(WOLFSSL_NO_ML_DSA_87) + if (params->gamma1_bits == DILITHIUM_GAMMA1_BITS_19) { + dilithium_encode_gamma1_19_bits(z, ze); + /* Move to next place to encode to. */ + ze += DILITHIUM_GAMMA1_19_ENC_BITS / 2 * + DILITHIUM_N / 4; + } + #endif + } + + yt += DILITHIUM_N; + } + } + if ((ret == 0) && valid) { + const byte* t0pt = t0p; + const byte* s2pt = s2p; + sword32* cs2 = ct0; + w0t = w0; + w1t = w1; + byte idx = 0; + + for (r = 0; valid && (r < params->k); r++) { + #if !defined(WOLFSSL_NO_ML_DSA_44) || \ + !defined(WOLFSSL_NO_ML_DSA_87) + /* -2..2 */ + if (params->eta == DILITHIUM_ETA_2) { + dilithium_decode_eta_2_bits(s2pt, s2); + s2pt += DILITHIUM_ETA_2_BITS * DILITHIUM_N / 8; + } + #endif + #ifndef WOLFSSL_NO_ML_DSA_65 + /* -4..4 */ + if (params->eta == DILITHIUM_ETA_4) { + dilithium_decode_eta_4_bits(s2pt, s2); + s2pt += DILITHIUM_N / 2; + } + #endif + dilithium_ntt_small(s2); + /* Step 20: cs2 = NTT-1(c o s2) */ + dilithium_mul(cs2, c, s2); + dilithium_invntt(cs2); + /* Step 22: w0 - cs2 */ + dilithium_sub(w0t, cs2); + dilithium_poly_red(w0t); + /* Step 23: Check w0 - cs2 has low enough values. */ + hi = params->gamma2 - params->beta; + valid = dilithium_check_low(w0t, hi); + if (valid) { + dilithium_decode_t0(t0pt, t0); + dilithium_ntt(t0); + + /* Step 25: ct0 = NTT-1(c o t0) */ + dilithium_mul(ct0, c, t0); + dilithium_invntt(ct0); + /* Step 27: Check ct0 has low enough values. */ + valid = dilithium_check_low(ct0, params->gamma2); + } + if (valid) { + /* Step 26: ct0 = ct0 + w0 */ + dilithium_add(ct0, w0t); + dilithium_poly_red(ct0); + + /* Step 26, 27: Make hint from ct0 and w1 and check + * number of hints is valid. + * Step 32: h is encoded into signature. + */ + #ifndef WOLFSSL_NO_ML_DSA_44 + if (params->gamma2 == DILITHIUM_Q_LOW_88) { + valid = (dilithium_make_hint_88(ct0, w1t, h, + &idx) == 0); + /* Alg 14, Step 10: Store count of hints for + * polynomial at end of list. */ + h[PARAMS_ML_DSA_44_OMEGA + r] = idx; + } + #endif + #if !defined(WOLFSSL_NO_ML_DSA_65) || \ + !defined(WOLFSSL_NO_ML_DSA_87) + if (params->gamma2 == DILITHIUM_Q_LOW_32) { + valid = (dilithium_make_hint_32(ct0, w1t, + params->omega, h, &idx) == 0); + /* Alg 14, Step 10: Store count of hints for + * polynomial at end of list. */ + h[params->omega + r] = idx; + } + #endif + } + + t0pt += DILITHIUM_D * DILITHIUM_N / 8; + w0t += DILITHIUM_N; + w1t += DILITHIUM_N; + } + /* Set remaining hints to zero. */ + XMEMSET(h + idx, 0, params->omega - idx); + } + + if (!valid) { + /* Too many attempts - something wrong with implementation. */ + if ((kappa > (word16)(kappa + params->l))) { + ret = BAD_COND_E; + } + + /* Step 30: increment value to append to seed to unique value. + */ + kappa += params->l; + } + } + /* Step 11: Check we have a valid signature. */ + while ((ret == 0) && (!valid)); + } + + XFREE(y, NULL, DYNAMIC_TYPE_DILITHIUM); + return ret; +#endif +} + +/* Sign a message with the key and a random number generator. + * + * FIPS 204. 6: Algorithm 2 MD-DSA.Sign(sk, M) + * ... + * 7: rnd <- {0,1}256 [Randomly generated.] + * ... + * + * @param [in, out] key Dilithium key. + * @param [in, out] rng Random number generator. + * @param [in] msg Message data to sign. + * @param [in] msgLen Length of message data in bytes. + * @param [out] sig Buffer to hold signature. + * @param [in, out] sigLen On in, length of buffer in bytes. + * On out, the length of the signature in bytes. + * @return 0 on success. + * @return BUFFER_E when the signature buffer is too small. + * @return MEMORY_E when memory allocation fails. + * @return Other negative when an error occurs. + */ +static int dilithium_sign_msg(dilithium_key* key, WC_RNG* rng, const byte* msg, + word32 msgLen, byte* sig, word32 *sigLen) +{ + int ret = 0; + byte rnd[DILITHIUM_RND_SZ]; + + /* Must have a random number generator. */ + if (rng == NULL) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Step 7: Generate random seed. */ + ret = wc_RNG_GenerateBlock(rng, rnd, DILITHIUM_RND_SZ); + } + if (ret == 0) { + /* Sign with random seed. */ + ret = dilithium_sign_msg_with_seed(key, rnd, msg, msgLen, sig, + sigLen); + } + + return ret; +} + +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + +#ifndef WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM +static void dilithium_make_pub_vec(dilithium_key* key, sword32* t1) +{ + const wc_dilithium_params* params = key->params; + const byte* t1p = key->p + DILITHIUM_PUB_SEED_SZ; + + dilithium_vec_decode_t1(t1p, params->k, t1); + dilithium_vec_ntt(t1, params->k); + +#ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + key->pubVecSet = 1; +#endif +} +#endif + +/* Verify signature of message using public key. + * + * FIPS 204. 6: Algorithm 3 ML-DSA.Verify(pk, M, sigma) + * 1: (rho, t1) <- pkDecode(pk) + * 2: (c_tilde, z, h) <- sigDecode(sigma) + * 3: if h = falsam then return false + * 4: end if + * 5: A_circum <- ExpandS(rho) + * 6: tr <- H(BytesToBits(pk), 512) + * 7: mu <- H(tr||M, 512) + * 8: (c1_tilde, c2_tilde) E {0,1}256 x {0,1)2*lambda-256 <- c_tilde + * 9: c <- SampleInBall(c1_tilde) + * 10: w'approx <- NTT-1(A_circum o NTT(z) - NTT(c) o NTT(t1.s^d)) + * 11: w1' <- UseHint(h, w'approx) + * 12: c'_tilde < H(mu||w1Encode(w1'), 2*lambda) + * 13: return [[ ||z||inf < GAMMA1 - BETA]] and [[c_tilde = c'_tilde]] and + * [[number of 1's in h is <= OMEGA + * + * @param [in, out] key Dilithium key. + * @param [in] msg Message to verify. + * @param [in] msgLen Length of message in bytes. + * @param [in] sig Signature to verify message. + * @param [in] sigLen Length of message in bytes. + * @param [out] res Result of verification. + * @return 0 on success. + * @return SIG_VERIFY_E when hint is malformed. + * @return BUFFER_E when the length of the signature does not match + * parameters. + * @return MEMORY_E when memory allocation fails. + * @return Other negative when an error occurs. + */ +static int dilithium_verify_msg(dilithium_key* key, const byte* msg, + word32 msgLen, const byte* sig, word32 sigLen, int* res) +{ +#ifndef WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM + int ret = 0; + const wc_dilithium_params* params = key->params; + const byte* pub_seed = key->p; + const byte* commit = sig; + const byte* ze = sig + params->lambda * 2; + const byte* h = ze + params->zEncSz; + sword32* a = NULL; + sword32* t1 = NULL; + sword32* c = NULL; + sword32* z = NULL; + sword32* w = NULL; + sword32* t1c = NULL; + byte tr[DILITHIUM_TR_SZ]; + byte* mu = tr; + byte* w1e = NULL; + byte* commit_calc = tr; + int valid = 0; + sword32 hi; + + /* Ensure the signature is the right size for the parameters. */ + if (sigLen != params->sigSz) { + ret = BUFFER_E; + } + if (ret == 0) { + /* Step 13: Verify the hint is well-formed. */ + ret = dilithium_check_hint(h, params->k, params->omega); + } + + /* Allocate memory for large intermediates. */ +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + if ((ret == 0) && (key->a == NULL)) { + key->a = (sword32*)XMALLOC(params->aSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (key->a == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + a = key->a; + } +#endif +#ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + if ((ret == 0) && (key->t1 == NULL)) { + key->t1 = (sword32*)XMALLOC(params->s2Sz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (key->t1 == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + t1 = key->t1; + } +#endif + if (ret == 0) { + unsigned int allocSz; + + /* z, c, w, t1/t1c */ + allocSz = DILITHIUM_POLY_SIZE + params->s1Sz + params->s2Sz + + params->s2Sz; +#ifndef WC_DILITHIUM_CACHE_MATRIX_A + /* a */ + allocSz += params->aSz; +#endif + + z = (sword32*)XMALLOC(allocSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (z == NULL) { + ret = MEMORY_E; + } + else { + c = z + params->s1Sz / sizeof(*z); + w = c + DILITHIUM_N; +#ifndef WC_DILITHIUM_CACHE_PUB_VECTORS + t1 = w + params->s2Sz / sizeof(*w); + t1c = t1; +#else + t1c = w + params->s2Sz / sizeof(*w); +#endif +#ifndef WC_DILITHIUM_CACHE_MATRIX_A + a = t1 + params->s2Sz / sizeof(*t1); +#endif + w1e = (byte*)c; + } + } + + if (ret == 0) { + /* Step 2: Decode z from signature. */ + dilithium_vec_decode_gamma1(ze, params->l, params->gamma1_bits, z); + /* Step 13: Check z is valid - values are low enough. */ + hi = (1 << params->gamma1_bits) - params->beta; + valid = dilithium_vec_check_low(z, params->l, hi); + } + if ((ret == 0) && valid) { +#ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + /* Check that we haven't already cached the public vector. */ + if (!key->pubVecSet) +#endif + { + /* Step 1: Decode and NTT vector t1. */ + dilithium_make_pub_vec(key, t1); + } + +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + /* Check that we haven't already cached the matrix A. */ + if (!key->aSet) +#endif + { + /* Step 5: Expand pub seed to compute matrix A. */ + ret = dilithium_expand_a(&key->shake, pub_seed, params->k, + params->l, a); +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + /* Whether we have cached A is dependent on success of operation. */ + key->aSet = (ret == 0); +#endif + } + } + if ((ret == 0) && valid) { + /* Step 6: Hash public key. */ + ret = dilithium_shake256(&key->shake, key->p, params->pkSz, tr, + DILITHIUM_TR_SZ); + } + if ((ret == 0) && valid) { + /* Step 7: Hash hash of public key and message. */ + ret = dilithium_hash256(&key->shake, tr, DILITHIUM_TR_SZ, msg, msgLen, + mu, DILITHIUM_MU_SZ); + } + if ((ret == 0) && valid) { + /* Step 9: Compute c from first 256 bits of commit. */ + ret = dilithium_sample_in_ball(&key->shake, commit, params->tau, c, + NULL); + } + if ((ret == 0) && valid) { + /* Step 10: w = NTT-1(A o NTT(z) - NTT(c) o NTT(t1)) */ + dilithium_vec_ntt(z, params->l); + dilithium_matrix_mul(w, a, z, params->k, params->l); + dilithium_ntt_small(c); + dilithium_vec_mul(t1c, c, t1, params->k); + dilithium_vec_sub(w, t1c, params->k); + dilithium_vec_invntt(w, params->k); + /* Step 11: Use hint to give full w1. */ + dilithium_vec_use_hint(w, params->k, params->gamma2, params->omega, h); + /* Step 12: Encode w1. */ + dilithium_vec_encode_w1(w, params->k, params->gamma2, w1e); + /* Step 12: Hash mu and encoded w1. */ + ret = dilithium_hash256(&key->shake, mu, DILITHIUM_MU_SZ, w1e, + params->w1EncSz, commit_calc, 2 * params->lambda); + } + if ((ret == 0) && valid) { + /* Step 13: Compare commit. */ + valid = (XMEMCMP(commit, commit_calc, 2 * params->lambda) == 0); + } + + *res = valid; + XFREE(z, NULL, DYNAMIC_TYPE_DILITHIUM); + return ret; +#else + int ret = 0; + const wc_dilithium_params* params = key->params; + const byte* pub_seed = key->p; + const byte* t1p = pub_seed + DILITHIUM_PUB_SEED_SZ; + const byte* commit = sig; + const byte* ze = sig + params->lambda * 2; + const byte* h = ze + params->zEncSz; + sword32* t1 = NULL; + sword32* a = NULL; + sword32* c = NULL; + sword32* z = NULL; + sword32* w = NULL; + byte tr[DILITHIUM_TR_SZ]; + byte* mu = tr; + byte* w1e = NULL; + byte* commit_calc = tr; + int valid = 0; + sword32 hi; + byte i; + unsigned int j; + byte o; + byte* encW1; + byte* seed = tr; + + /* Ensure the signature is the right size for the parameters. */ + if (sigLen != params->sigSz) { + ret = BUFFER_E; + } + if (ret == 0) { + /* Step 13: Verify the hint is well-formed. */ + ret = dilithium_check_hint(h, params->k, params->omega); + } + +#ifndef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC + /* Allocate memory for large intermediates. */ + if (ret == 0) { + /* z, c, w, t1, w1e. */ + z = (sword32*)XMALLOC(params->s1Sz + 3 * DILITHIUM_POLY_SIZE + + DILITHIUM_MAX_W1_ENC_SZ, NULL, DYNAMIC_TYPE_DILITHIUM); + if (z == NULL) { + ret = MEMORY_E; + } + else { + c = z + params->s1Sz / sizeof(*t1); + w = c + DILITHIUM_N; + t1 = w + DILITHIUM_N; + w1e = (byte*)(t1 + DILITHIUM_N); + a = t1; } + } +#else + if (ret == 0) { + z = key->z; + c = key->c; + w = key->w; + t1 = key->t1; + w1e = key->w1e; + a = t1; + } +#endif + + if (ret == 0) { + /* Step 2: Decode z from signature. */ + dilithium_vec_decode_gamma1(ze, params->l, params->gamma1_bits, z); + /* Step 13: Check z is valid - values are low enough. */ + hi = (1 << params->gamma1_bits) - params->beta; + valid = dilithium_vec_check_low(z, params->l, hi); + } + if ((ret == 0) && valid) { + /* Step 10: NTT(z) */ + dilithium_vec_ntt(z, params->l); + + /* Step 9: Compute c from first 256 bits of commit. */ +#ifdef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC + ret = dilithium_sample_in_ball(&key->shake, commit, params->tau, c, + key->block); +#else + ret = dilithium_sample_in_ball(&key->shake, commit, params->tau, c, + NULL); +#endif + } + if ((ret == 0) && valid) { + dilithium_ntt_small(c); - if ((newPrivSz != DILITHIUM_LEVEL2_PRV_KEY_SIZE) && - (newPrivSz != DILITHIUM_LEVEL3_PRV_KEY_SIZE) && - (newPrivSz != DILITHIUM_LEVEL5_PRV_KEY_SIZE)) { - return BAD_FUNC_ARG; + o = 0; + encW1 = w1e; + + /* Copy the seed into a buffer that has space for s and r. */ + XMEMCPY(seed, pub_seed, DILITHIUM_PUB_SEED_SZ); + /* Step 1: Loop over first dimension of matrix. */ + for (i = 0; (ret == 0) && (i < params->k); i++) { + byte s; + const sword32* zt = z; + + /* Step 1: Decode and NTT vector t1. */ + dilithium_decode_t1(t1p, w); + /* Next polynomial. */ + t1p += DILITHIUM_U * DILITHIUM_N / 8; + + /* Step 10: - NTT(c) o NTT(t1)) */ + dilithium_ntt(w); +#ifdef WOLFSSL_DILITHIUM_SMALL + for (j = 0; j < DILITHIUM_N; j++) { + w[j] = -dilithium_mont_red((sword64)c[j] * w[j]); + } +#else + for (j = 0; j < DILITHIUM_N; j += 8) { + w[j+0] = -dilithium_mont_red((sword64)c[j+0] * w[j+0]); + w[j+1] = -dilithium_mont_red((sword64)c[j+1] * w[j+1]); + w[j+2] = -dilithium_mont_red((sword64)c[j+2] * w[j+2]); + w[j+3] = -dilithium_mont_red((sword64)c[j+3] * w[j+3]); + w[j+4] = -dilithium_mont_red((sword64)c[j+4] * w[j+4]); + w[j+5] = -dilithium_mont_red((sword64)c[j+5] * w[j+5]); + w[j+6] = -dilithium_mont_red((sword64)c[j+6] * w[j+6]); + w[j+7] = -dilithium_mont_red((sword64)c[j+7] * w[j+7]); + } +#endif + + /* Step 5: Expand pub seed to compute matrix A. */ + /* Put r into buffer to be hashed. */ + seed[DILITHIUM_PUB_SEED_SZ + 1] = i; + for (s = 0; (ret == 0) && (s < params->l); s++) { + /* Put s into buffer to be hashed. */ + seed[DILITHIUM_PUB_SEED_SZ + 0] = s; + /* Step 3: Create polynomial from hashing seed. */ + #ifdef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC + ret = dilithium_rej_ntt_poly(&key->shake, seed, a, key->h); + #else + ret = dilithium_rej_ntt_poly(&key->shake, seed, a, NULL); + #endif + + /* Step 10: w = A o NTT(z) - NTT(c) o NTT(t1) */ +#ifdef WOLFSSL_DILITHIUM_SMALL + for (j = 0; j < DILITHIUM_N; j++) { + w[j] += dilithium_mont_red((sword64)a[j] * zt[j]); + } +#else + for (j = 0; j < DILITHIUM_N; j += 8) { + w[j+0] += dilithium_mont_red((sword64)a[j+0] * zt[j+0]); + w[j+1] += dilithium_mont_red((sword64)a[j+1] * zt[j+1]); + w[j+2] += dilithium_mont_red((sword64)a[j+2] * zt[j+2]); + w[j+3] += dilithium_mont_red((sword64)a[j+3] * zt[j+3]); + w[j+4] += dilithium_mont_red((sword64)a[j+4] * zt[j+4]); + w[j+5] += dilithium_mont_red((sword64)a[j+5] * zt[j+5]); + w[j+6] += dilithium_mont_red((sword64)a[j+6] * zt[j+6]); + w[j+7] += dilithium_mont_red((sword64)a[j+7] * zt[j+7]); + } +#endif + /* Next polynomial. */ + zt += DILITHIUM_N; + } + + /* Step 10: w = NTT-1(A o NTT(z) - NTT(c) o NTT(t1)) */ + dilithium_invntt(w); + +#ifndef WOLFSSL_NO_ML_DSA_44 + if (params->gamma2 == DILITHIUM_Q_LOW_88) { + /* Step 11: Use hint to give full w1. */ + dilithium_use_hint_88(w, h, i, &o); + /* Step 12: Encode w1. */ + dilithium_encode_w1_88(w, encW1); + encW1 += DILITHIUM_Q_HI_88_ENC_BITS * 2 * DILITHIUM_N / 16; + } + else +#endif +#if !defined(WOLFSSL_NO_ML_DSA_65) || !defined(WOLFSSL_NO_ML_DSA_87) + if (params->gamma2 == DILITHIUM_Q_LOW_32) { + /* Step 11: Use hint to give full w1. */ + dilithium_use_hint_32(w, h, params->omega, i, &o); + /* Step 12: Encode w1. */ + dilithium_encode_w1_32(w, encW1); + encW1 += DILITHIUM_Q_HI_32_ENC_BITS * 2 * DILITHIUM_N / 16; + } + else +#endif + { + } } + } + if ((ret == 0) && valid) { + /* Step 6: Hash public key. */ + ret = dilithium_shake256(&key->shake, key->p, params->pkSz, tr, + DILITHIUM_TR_SZ); + } + if ((ret == 0) && valid) { + /* Step 7: Hash hash of public key and message. */ + ret = dilithium_hash256(&key->shake, tr, DILITHIUM_TR_SZ, msg, msgLen, + mu, DILITHIUM_MU_SZ); + } + if ((ret == 0) && valid) { + /* Step 12: Hash mu and encoded w1. */ + ret = dilithium_hash256(&key->shake, mu, DILITHIUM_MU_SZ, w1e, + params->w1EncSz, commit_calc, 2 * params->lambda); + } + if ((ret == 0) && valid) { + /* Step 13: Compare commit. */ + valid = (XMEMCMP(commit, commit_calc, 2 * params->lambda) == 0); + } + + *res = valid; +#ifndef WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC + XFREE(z, NULL, DYNAMIC_TYPE_DILITHIUM); +#endif + return ret; +#endif /* !WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM */ +} +#endif /* WOLFSSL_DILITHIUM_NO_VERIFY */ + +#elif defined(HAVE_LIBOQS) + +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY +static int oqs_dilithium_make_key(dilithium_key* key, WC_RNG* rng) +{ + int ret = 0; + OQS_SIG *oqssig = NULL; + + if (key->level == 2) { + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_44_ipd); + } + else if (key->level == 3) { + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_65_ipd); + } + else if (key->level == 5) { + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_87_ipd); + } + else { + ret = SIG_TYPE_E; + } + + if (ret == 0) { + ret = wolfSSL_liboqsRngMutexLock(rng); + if (ret == 0) { + if (OQS_SIG_keypair(oqssig, key->p, key->k) != OQS_SUCCESS) { + ret = BUFFER_E; + } + } + wolfSSL_liboqsRngMutexUnlock(); + } + if (ret == 0) { + key->prvKeySet = 1; + key->pubKeySet = 1; + } + + if (oqssig != NULL) { + OQS_SIG_free(oqssig); + } + + return ret; +} +#endif /* WOLFSSL_DILITHIUM_NO_MAKE_KEY */ + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN +static int oqs_dilithium_sign_msg(const byte* msg, word32 msgLen, byte* sig, + word32 *sigLen, dilithium_key* key, WC_RNG* rng) +{ + int ret = 0; + OQS_SIG *oqssig = NULL; + size_t localOutLen = 0; + + if (!key->prvKeySet) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { if (key->level == 2) { - pub = newPriv + DILITHIUM_LEVEL2_KEY_SIZE; - pubSz = DILITHIUM_LEVEL2_PUB_KEY_SIZE; + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_44_ipd); } else if (key->level == 3) { - pub = newPriv + DILITHIUM_LEVEL3_KEY_SIZE; - pubSz = DILITHIUM_LEVEL3_PUB_KEY_SIZE; + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_65_ipd); } else if (key->level == 5) { - pub = newPriv + DILITHIUM_LEVEL5_KEY_SIZE; - pubSz = DILITHIUM_LEVEL5_PUB_KEY_SIZE; + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_87_ipd); + } + else { + ret = SIG_TYPE_E; + } + } + + if ((ret == 0) && (oqssig == NULL)) { + ret = BUFFER_E; + } + + /* check and set up out length */ + if (ret == 0) { + if ((key->level == 2) && (*sigLen < DILITHIUM_LEVEL2_SIG_SIZE)) { + *sigLen = DILITHIUM_LEVEL2_SIG_SIZE; + ret = BUFFER_E; + } + else if ((key->level == 3) && (*sigLen < DILITHIUM_LEVEL3_SIG_SIZE)) { + *sigLen = DILITHIUM_LEVEL3_SIG_SIZE; + ret = BUFFER_E; } + else if ((key->level == 5) && (*sigLen < DILITHIUM_LEVEL5_SIG_SIZE)) { + *sigLen = DILITHIUM_LEVEL5_SIG_SIZE; + ret = BUFFER_E; + } + localOutLen = *sigLen; } - else if ((pubSz != DILITHIUM_LEVEL2_PUB_KEY_SIZE) && - (pubSz != DILITHIUM_LEVEL3_PUB_KEY_SIZE) && - (pubSz != DILITHIUM_LEVEL5_PUB_KEY_SIZE)) { - return BAD_FUNC_ARG; + + if (ret == 0) { + ret = wolfSSL_liboqsRngMutexLock(rng); } - /* import public key */ - ret = wc_dilithium_import_public(pub, pubSz, key); + if ((ret == 0) && + (OQS_SIG_sign(oqssig, sig, &localOutLen, msg, msgLen, key->k) + == OQS_ERROR)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + *sigLen = (word32)localOutLen; + } + + wolfSSL_liboqsRngMutexUnlock(); + + if (oqssig != NULL) { + OQS_SIG_free(oqssig); + } + return ret; +} +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY +static int oqs_dilithium_verify_msg(const byte* sig, word32 sigLen, + const byte* msg, word32 msgLen, int* res, dilithium_key* key) +{ + int ret = 0; + OQS_SIG *oqssig = NULL; + + if (!key->pubKeySet) { + ret = BAD_FUNC_ARG; + } if (ret == 0) { - /* make the private key (priv + pub) */ if (key->level == 2) { - XMEMCPY(key->k, newPriv, DILITHIUM_LEVEL2_KEY_SIZE); + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_44_ipd); } else if (key->level == 3) { - XMEMCPY(key->k, newPriv, DILITHIUM_LEVEL3_KEY_SIZE); + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_65_ipd); } else if (key->level == 5) { - XMEMCPY(key->k, newPriv, DILITHIUM_LEVEL5_KEY_SIZE); + oqssig = OQS_SIG_new(OQS_SIG_alg_ml_dsa_87_ipd); } - key->prvKeySet = 1; + else { + ret = SIG_TYPE_E; + } + } + + if ((ret == 0) && (oqssig == NULL)) { + ret = BUFFER_E; + } + + if ((ret == 0) && + (OQS_SIG_verify(oqssig, msg, msgLen, sig, sigLen, key->p) + == OQS_ERROR)) { + ret = SIG_VERIFY_E; + } + + if (ret == 0) { + *res = 1; } + if (oqssig != NULL) { + OQS_SIG_free(oqssig); + } return ret; } +#endif /* WOLFSSL_DILITHIUM_NO_VERIFY */ -/* Export the dilithium private key. +#else + #error "No dilithium implementation chosen." +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY +int wc_dilithium_make_key(dilithium_key* key, WC_RNG* rng) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (rng == NULL)) { + ret = BAD_FUNC_ARG; + } + +#ifdef WOLF_CRYPTO_CB + if (ret == 0) { + #ifndef WOLF_CRYPTO_CB_FIND + if (key->devId != INVALID_DEVID) + #endif + { + ret = wc_CryptoCb_MakePqcSignatureKey(rng, + WC_PQC_SIG_TYPE_DILITHIUM, key->level, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; + } + } +#endif + + if (ret == 0) { +#ifdef WOLFSSL_WC_DILITHIUM + /* Check the level or parameters have been set. */ + if (key->params == NULL) { + ret = BAD_STATE_E; + } + else { + /* Make the key. */ + ret = dilithium_make_key(key, rng); + } +#elif defined(HAVE_LIBOQS) + /* Make the key. */ + ret = oqs_dilithium_make_key(key, rng); +#endif + } + + return ret; +} + +int wc_dilithium_make_key_from_seed(dilithium_key* key, const byte* seed) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (seed == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { +#ifdef WOLFSSL_WC_DILITHIUM + /* Check the level or parameters have been set. */ + if (key->params == NULL) { + ret = BAD_STATE_E; + } + else { + /* Make the key. */ + ret = dilithium_make_key_from_seed(key, seed); + } +#elif defined(HAVE_LIBOQS) + /* Make the key. */ + ret = NOT_COMPILED_IN; +#endif + } + + return ret; +} +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN +/* Sign the message using the dilithium private key. * - * key [in] Dilithium private key. - * out [in] Array to hold private key. - * outLen [in/out] On in, the number of bytes in array. - * On out, the number bytes put into array. - * returns BAD_FUNC_ARG when a parameter is NULL, - * BUFFER_E when outLen is less than DILITHIUM_LEVEL2_KEY_SIZE, - * 0 otherwise. + * msg [in] Message to sign. + * msgLen [in] Length of the message in bytes. + * sig [out] Buffer to write signature into. + * sigLen [in/out] On in, size of buffer. + * On out, the length of the signature in bytes. + * key [in] Dilithium key to use when signing + * returns BAD_FUNC_ARG when a parameter is NULL or public key not set, + * BUFFER_E when outLen is less than DILITHIUM_LEVEL2_SIG_SIZE, + * 0 otherwise. */ -int wc_dilithium_export_private_only(dilithium_key* key, byte* out, - word32* outLen) +int wc_dilithium_sign_msg(const byte* msg, word32 msgLen, byte* sig, + word32 *sigLen, dilithium_key* key, WC_RNG* rng) { - /* sanity checks on arguments */ - if ((key == NULL) || (out == NULL) || (outLen == NULL)) { - return BAD_FUNC_ARG; + int ret = 0; + + /* Validate parameters. */ + if ((msg == NULL) || (sig == NULL) || (sigLen == NULL) || (key == NULL)) { + ret = BAD_FUNC_ARG; } - if ((key->level != 2) && (key->level != 3) && (key->level != 5)) { - return BAD_FUNC_ARG; +#ifdef WOLF_CRYPTO_CB + if (ret == 0) { + #ifndef WOLF_CRYPTO_CB_FIND + if (key->devId != INVALID_DEVID) + #endif + { + ret = wc_CryptoCb_PqcSign(msg, msgLen, sig, sigLen, rng, + WC_PQC_SIG_TYPE_DILITHIUM, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; + } } +#endif - /* check and set up out length */ - if ((key->level == 2) && (*outLen < DILITHIUM_LEVEL2_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL2_KEY_SIZE; - return BUFFER_E; - } - else if ((key->level == 3) && (*outLen < DILITHIUM_LEVEL3_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL3_KEY_SIZE; - return BUFFER_E; - } - else if ((key->level == 5) && (*outLen < DILITHIUM_LEVEL5_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL5_KEY_SIZE; - return BUFFER_E; + if (ret == 0) { + /* Sign message. */ + #ifdef WOLFSSL_WC_DILITHIUM + ret = dilithium_sign_msg(key, rng, msg, msgLen, sig, sigLen); + #elif defined(HAVE_LIBOQS) + ret = oqs_dilithium_sign_msg(msg, msgLen, sig, sigLen, key, rng); + #endif } - if (key->level == 2) { - *outLen = DILITHIUM_LEVEL2_KEY_SIZE; + return ret; +} + +/* Sign the message using the dilithium private key. + * + * msg [in] Message to sign. + * msgLen [in] Length of the message in bytes. + * sig [out] Buffer to write signature into. + * sigLen [in/out] On in, size of buffer. + * On out, the length of the signature in bytes. + * key [in] Dilithium key to use when signing + * returns BAD_FUNC_ARG when a parameter is NULL or public key not set, + * BUFFER_E when outLen is less than DILITHIUM_LEVEL2_SIG_SIZE, + * 0 otherwise. + */ +int wc_dilithium_sign_msg_with_seed(const byte* msg, word32 msgLen, byte* sig, + word32 *sigLen, dilithium_key* key, byte* seed) +{ + int ret = 0; + + /* Validate parameters. */ + if ((msg == NULL) || (sig == NULL) || (sigLen == NULL) || (key == NULL)) { + ret = BAD_FUNC_ARG; } - else if (key->level == 3) { - *outLen = DILITHIUM_LEVEL3_KEY_SIZE; + + if (ret == 0) { + /* Sign message. */ + #ifdef WOLFSSL_WC_DILITHIUM + ret = dilithium_sign_msg_with_seed(key, seed, msg, msgLen, sig, sigLen); + #elif defined(HAVE_LIBOQS) + ret = NOT_COMPILED_IN; + (void)msgLen; + (void)seed; + #endif } - else if (key->level == 5) { - *outLen = DILITHIUM_LEVEL5_KEY_SIZE; + + return ret; +} +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY +/* Verify the message using the dilithium public key. + * + * sig [in] Signature to verify. + * sigLen [in] Size of signature in bytes. + * msg [in] Message to verify. + * msgLen [in] Length of the message in bytes. + * res [out] *res is set to 1 on successful verification. + * key [in] Dilithium key to use to verify. + * returns BAD_FUNC_ARG when a parameter is NULL or contextLen is zero when and + * BUFFER_E when sigLen is less than DILITHIUM_LEVEL2_SIG_SIZE, + * 0 otherwise. + */ +int wc_dilithium_verify_msg(const byte* sig, word32 sigLen, const byte* msg, + word32 msgLen, int* res, dilithium_key* key) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (sig == NULL) || (msg == NULL) || (res == NULL)) { + ret = BAD_FUNC_ARG; } - XMEMCPY(out, key->k, *outLen); + #ifdef WOLF_CRYPTO_CB + if (ret == 0) { + #ifndef WOLF_CRYPTO_CB_FIND + if (key->devId != INVALID_DEVID) + #endif + { + ret = wc_CryptoCb_PqcVerify(sig, sigLen, msg, msgLen, res, + WC_PQC_SIG_TYPE_DILITHIUM, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; + } + } + #endif - return 0; + if (ret == 0) { + /* Verify message with signature. */ + #ifdef WOLFSSL_WC_DILITHIUM + ret = dilithium_verify_msg(key, msg, msgLen, sig, sigLen, res); + #elif defined(HAVE_LIBOQS) + ret = oqs_dilithium_verify_msg(sig, sigLen, msg, msgLen, res, key); + #endif + } + + return ret; } +#endif /* WOLFSSL_DILITHIUM_NO_VERIFY */ -/* Export the dilithium private and public key. +/* Initialize the dilithium private/public key. * - * key [in] Dilithium private/public key. - * out [in] Array to hold private and public key. - * outLen [in/out] On in, the number of bytes in array. - * On out, the number bytes put into array. - * returns BAD_FUNC_ARG when a parameter is NULL, - * BUFFER_E when outLen is less than DILITHIUM_LEVEL2_PRV_KEY_SIZE, - * 0 otherwise. + * key [in] Dilithium key. + * returns BAD_FUNC_ARG when key is NULL */ -int wc_dilithium_export_private(dilithium_key* key, byte* out, word32* outLen) +int wc_dilithium_init(dilithium_key* key) { - /* sanity checks on arguments */ - if ((key == NULL) || (out == NULL) || (outLen == NULL)) { - return BAD_FUNC_ARG; + return wc_dilithium_init_ex(key, NULL, INVALID_DEVID); +} + +/* Initialize the dilithium private/public key. + * + * key [in] Dilithium key. + * heap [in] Heap hint. + * devId[in] Device ID. + * returns BAD_FUNC_ARG when key is NULL + */ +int wc_dilithium_init_ex(dilithium_key* key, void* heap, int devId) +{ + int ret = 0; + + (void)heap; + (void)devId; + + /* Validate parameters. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; } - if ((key->level != 2) && (key->level != 3) && (key->level != 5)) { - return BAD_FUNC_ARG; + if (ret == 0) { + /* Ensure all fields reset. */ + XMEMSET(key, 0, sizeof(*key)); + + #ifdef WOLF_CRYPTO_CB + key->devCtx = NULL; + key->devId = devId; + #endif + #ifdef WOLF_PRIVATE_KEY_ID + key->idLen = 0; + key->labelLen = 0; + #endif } - if ((key->level == 2) && (*outLen < DILITHIUM_LEVEL2_PRV_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL2_PRV_KEY_SIZE; - return BUFFER_E; + return ret; +} + +#ifdef WOLF_PRIVATE_KEY_ID +int wc_dilithium_init_id(dilithium_key* key, const unsigned char* id, int len, + void* heap, int devId) +{ + int ret = 0; + + if (key == NULL) { + ret = BAD_FUNC_ARG; } - else if ((key->level == 3) && (*outLen < DILITHIUM_LEVEL3_PRV_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL3_PRV_KEY_SIZE; - return BUFFER_E; + if ((ret == 0) && ((len < 0) || (len > DILITHIUM_MAX_ID_LEN))) { + ret = BUFFER_E; } - else if ((key->level == 5) && (*outLen < DILITHIUM_LEVEL5_PRV_KEY_SIZE)) { - *outLen = DILITHIUM_LEVEL5_PRV_KEY_SIZE; - return BUFFER_E; + + if (ret == 0) { + ret = wc_dilithium_init_ex(key, heap, devId); + } + if ((ret == 0) && (id != NULL) && (len != 0)) { + XMEMCPY(key->id, id, (size_t)len); + key->idLen = len; } + /* Set the maximum level here */ + wc_dilithium_set_level(key, 5); - if (key->level == 2) { - *outLen = DILITHIUM_LEVEL2_PRV_KEY_SIZE; - XMEMCPY(out, key->k, DILITHIUM_LEVEL2_PRV_KEY_SIZE); - XMEMCPY(out + DILITHIUM_LEVEL2_PRV_KEY_SIZE, key->p, - DILITHIUM_LEVEL2_PUB_KEY_SIZE); + return ret; +} + +int wc_dilithium_init_label(dilithium_key* key, const char* label, void* heap, + int devId) +{ + int ret = 0; + int labelLen = 0; + + if ((key == NULL) || (label == NULL)) { + ret = BAD_FUNC_ARG; } - else if (key->level == 3) { - *outLen = DILITHIUM_LEVEL3_PRV_KEY_SIZE; - XMEMCPY(out, key->k, DILITHIUM_LEVEL3_PRV_KEY_SIZE); - XMEMCPY(out + DILITHIUM_LEVEL3_PRV_KEY_SIZE, key->p, - DILITHIUM_LEVEL3_PUB_KEY_SIZE); + if (ret == 0) { + labelLen = (int)XSTRLEN(label); + if ((labelLen == 0) || (labelLen > DILITHIUM_MAX_LABEL_LEN)) { + ret = BUFFER_E; + } } - else if (key->level == 5) { - *outLen = DILITHIUM_LEVEL5_PRV_KEY_SIZE; - XMEMCPY(out, key->k, DILITHIUM_LEVEL5_PRV_KEY_SIZE); - XMEMCPY(out + DILITHIUM_LEVEL5_PRV_KEY_SIZE, key->p, - DILITHIUM_LEVEL5_PUB_KEY_SIZE); + + if (ret == 0) { + ret = wc_dilithium_init_ex(key, heap, devId); + } + if (ret == 0) { + XMEMCPY(key->label, label, (size_t)labelLen); + key->labelLen = labelLen; } - return 0; + /* Set the maximum level here */ + wc_dilithium_set_level(key, 5); + + return ret; } +#endif -/* Export the dilithium private and public key. +/* Set the level of the dilithium private/public key. * - * key [in] Dilithium private/public key. - * priv [in] Array to hold private key. - * privSz [in/out] On in, the number of bytes in private key array. - * pub [in] Array to hold public key. - * pubSz [in/out] On in, the number of bytes in public key array. - * On out, the number bytes put into array. - * returns BAD_FUNC_ARG when a parameter is NULL, - * BUFFER_E when privSz is less than DILITHIUM_LEVEL2_PRV_KEY_SIZE or pubSz is less - * than DILITHIUM_LEVEL2_PUB_KEY_SIZE, - * 0 otherwise. + * key [out] Dilithium key. + * level [in] Either 2,3 or 5. + * returns BAD_FUNC_ARG when key is NULL or level is a bad values. */ -int wc_dilithium_export_key(dilithium_key* key, byte* priv, word32 *privSz, - byte* pub, word32 *pubSz) +int wc_dilithium_set_level(dilithium_key* key, byte level) { int ret = 0; - /* export private part */ - ret = wc_dilithium_export_private(key, priv, privSz); + /* Validate parameters. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (level != 2) && (level != 3) && (level != 5)) { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { - /* export public part */ - ret = wc_dilithium_export_public(key, pub, pubSz); +#ifdef WOLFSSL_WC_DILITHIUM + /* Get the parameters for level into key. */ + ret = dilithium_get_params(level, &key->params); + } + if (ret == 0) { + /* Clear any cached items. */ + #ifdef WC_DILITHIUM_CACHE_MATRIX_A + XFREE(key->a, NULL, WOLFSSL_WC_DILITHIUM); + key->a = NULL; + key->aSet = 0; + #endif + #ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + XFREE(key->s1, NULL, WOLFSSL_WC_DILITHIUM); + key->s1 = NULL; + key->s2 = NULL; + key->t0 = NULL; + key->privVecsSet = 0; + #endif + #ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + XFREE(key->t1, NULL, WOLFSSL_WC_DILITHIUM); + key->t1 = NULL; + key->pubVecSet = 0; + #endif +#endif /* WOLFSSL_WC_DILITHIUM */ + + /* Store level and indicate public and private key are not set. */ + key->level = level; + key->pubKeySet = 0; + key->prvKeySet = 0; } return ret; } -/* Check the public key of the dilithium key matches the private key. +/* Get the level of the dilithium private/public key. * - * key [in] Dilithium private/public key. - * returns BAD_FUNC_ARG when key is NULL, - * PUBLIC_KEY_E when the public key is not set or doesn't match, - * other -ve value on hash failure, - * 0 otherwise. + * key [in] Dilithium key. + * level [out] The level. + * returns BAD_FUNC_ARG when key is NULL or level has not been set. */ -int wc_dilithium_check_key(dilithium_key* key) +int wc_dilithium_get_level(dilithium_key* key, byte* level) { - if (key == NULL) { - return BAD_FUNC_ARG; + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (level == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (key->level != 2) && (key->level != 3) && + (key->level != 5)) { + ret = BAD_FUNC_ARG; } - /* Assume everything is fine. */ - return 0; + if (ret == 0) { + /* Return level. */ + *level = key->level; + } + + return ret; } +/* Clears the dilithium key data + * + * key [in] Dilithium key. + */ +void wc_dilithium_free(dilithium_key* key) +{ + if (key != NULL) { +#ifdef WOLFSSL_WC_DILITHIUM + /* Dispose of cached items. */ + #ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + XFREE(key->t1, NULL, WOLFSSL_WC_DILITHIUM); + #endif + #ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + XFREE(key->s1, NULL, WOLFSSL_WC_DILITHIUM); + #endif + #ifdef WC_DILITHIUM_CACHE_MATRIX_A + XFREE(key->a, NULL, WOLFSSL_WC_DILITHIUM); + #endif + /* Free the SHAKE-128/256 object. */ + wc_Shake256_Free(&key->shake); +#endif + /* Ensure all private data is zeroized. */ + ForceZero(key, sizeof(*key)); + } +} + +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY /* Returns the size of a dilithium private key. * - * key [in] Dilithium private/public key. - * returns BAD_FUNC_ARG when key is NULL, - * DILITHIUM_LEVEL2_KEY_SIZE otherwise. + * @param [in] key Dilithium private/public key. + * @return Private key size on success for set level. + * @return BAD_FUNC_ARG when key is NULL or level not set, */ int wc_dilithium_size(dilithium_key* key) { - if (key == NULL) { - return BAD_FUNC_ARG; - } + int ret = BAD_FUNC_ARG; - if (key->level == 2) { - return DILITHIUM_LEVEL2_KEY_SIZE; - } - else if (key->level == 3) { - return DILITHIUM_LEVEL3_KEY_SIZE; - } - else if (key->level == 5) { - return DILITHIUM_LEVEL5_KEY_SIZE; + if (key != NULL) { + if (key->level == 2) { + ret = DILITHIUM_LEVEL2_KEY_SIZE; + } + else if (key->level == 3) { + ret = DILITHIUM_LEVEL3_KEY_SIZE; + } + else if (key->level == 5) { + ret = DILITHIUM_LEVEL5_KEY_SIZE; + } } - return BAD_FUNC_ARG; + return ret; } +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY /* Returns the size of a dilithium private plus public key. * - * key [in] Dilithium private/public key. - * returns BAD_FUNC_ARG when key is NULL, - * DILITHIUM_LEVEL2_PRV_KEY_SIZE otherwise. + * @param [in] key Dilithium private/public key. + * @return Private key size on success for set level. + * @return BAD_FUNC_ARG when key is NULL or level not set, */ int wc_dilithium_priv_size(dilithium_key* key) { - if (key == NULL) { - return BAD_FUNC_ARG; - } + int ret = BAD_FUNC_ARG; - if (key->level == 2) { - return DILITHIUM_LEVEL2_PRV_KEY_SIZE; - } - else if (key->level == 3) { - return DILITHIUM_LEVEL3_PRV_KEY_SIZE; + if (key != NULL) { + if (key->level == 2) { + ret = DILITHIUM_LEVEL2_PRV_KEY_SIZE; + } + else if (key->level == 3) { + ret = DILITHIUM_LEVEL3_PRV_KEY_SIZE; + } + else if (key->level == 5) { + ret = DILITHIUM_LEVEL5_PRV_KEY_SIZE; + } } - else if (key->level == 5) { - return DILITHIUM_LEVEL5_PRV_KEY_SIZE; + + return ret; +} + +/* Returns the size of a dilithium private plus public key. + * + * @param [in] key Dilithium private/public key. + * @param [out] len Private key size for set level. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL or level not set, + */ +int wc_MlDsaKey_GetPrivLen(MlDsaKey* key, int* len) +{ + int ret = 0; + + *len = wc_dilithium_priv_size(key); + if (*len < 0) { + ret = *len; } - return BAD_FUNC_ARG; + return ret; } +#endif /* WOLFSSL_DILITHIUM_PUBLIC_KEY */ +#endif /* WOLFSSL_DILITHIUM_PRIVATE_KEY */ +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY /* Returns the size of a dilithium public key. * - * key [in] Dilithium private/public key. - * returns BAD_FUNC_ARG when key is NULL, - * DILITHIUM_LEVEL2_PUB_KEY_SIZE otherwise. + * @param [in] key Dilithium private/public key. + * @return Public key size on success for set level. + * @return BAD_FUNC_ARG when key is NULL or level not set, */ int wc_dilithium_pub_size(dilithium_key* key) { - if (key == NULL) { - return BAD_FUNC_ARG; - } + int ret = BAD_FUNC_ARG; - if (key->level == 2) { - return DILITHIUM_LEVEL2_PUB_KEY_SIZE; - } - else if (key->level == 3) { - return DILITHIUM_LEVEL3_PUB_KEY_SIZE; + if (key != NULL) { + if (key->level == 2) { + ret = DILITHIUM_LEVEL2_PUB_KEY_SIZE; + } + else if (key->level == 3) { + ret = DILITHIUM_LEVEL3_PUB_KEY_SIZE; + } + else if (key->level == 5) { + ret = DILITHIUM_LEVEL5_PUB_KEY_SIZE; + } } - else if (key->level == 5) { - return DILITHIUM_LEVEL5_PUB_KEY_SIZE; + + return ret; +} + +/* Returns the size of a dilithium public key. + * + * @param [in] key Dilithium private/public key. + * @param [out] len Public key size for set level. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL or level not set, + */ +int wc_MlDsaKey_GetPubLen(MlDsaKey* key, int* len) +{ + int ret = 0; + + *len = wc_dilithium_pub_size(key); + if (*len < 0) { + ret = *len; } - return BAD_FUNC_ARG; + return ret; } +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) /* Returns the size of a dilithium signature. * - * key [in] Dilithium private/public key. - * returns BAD_FUNC_ARG when key is NULL, - * DILITHIUM_LEVEL2_SIG_SIZE otherwise. + * @param [in] key Dilithium private/public key. + * @return Signature size on success for set level. + * @return BAD_FUNC_ARG when key is NULL or level not set, */ int wc_dilithium_sig_size(dilithium_key* key) { + int ret = BAD_FUNC_ARG; + + if (key != NULL) { + if (key->level == 2) { + ret = DILITHIUM_LEVEL2_SIG_SIZE; + } + else if (key->level == 3) { + ret = DILITHIUM_LEVEL3_SIG_SIZE; + } + else if (key->level == 5) { + ret = DILITHIUM_LEVEL5_SIG_SIZE; + } + } + + return ret; +} + +/* Returns the size of a dilithium signature. + * + * @param [in] key Dilithium private/public key. + * @param [out] len Signature size for set level. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL or level not set, + */ +int wc_MlDsaKey_GetSigLen(MlDsaKey* key, int* len) +{ + int ret = 0; + + *len = wc_dilithium_sig_size(key); + if (*len < 0) { + ret = *len; + } + + return ret; +} +#endif + +#ifdef WOLFSSL_DILITHIUM_CHECK_KEY +/* Check the public key of the dilithium key matches the private key. + * + * @param [in] key Dilithium private/public key. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL or no private key available, + * @return PUBLIC_KEY_E when the public key is not set or doesn't match, + * @return MEMORY_E when dynamic memory allocation fails. + */ +int wc_dilithium_check_key(dilithium_key* key) +{ + int ret = 0; +#ifdef WOLFSSL_WC_DILITHIUM + const wc_dilithium_params* params; + sword32* a = NULL; + sword32* s1 = NULL; + sword32* s2 = NULL; + sword32* t = NULL; + sword32* t0 = NULL; + sword32* t1 = NULL; + + /* Validate parameter. */ if (key == NULL) { - return BAD_FUNC_ARG; + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (!key->prvKeySet)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (!key->pubKeySet)) { + ret = PUBLIC_KEY_E; } - if (key->level == 2) { - return DILITHIUM_LEVEL2_SIG_SIZE; + /* Any value in public key are valid. + * Public seed is hashed to generate matrix A. + * t1 is the top 10 bits of a number in range of 0..(Q-1). + * Q >> 13 = 0x3ff so all encoded values are valid. + */ + + if (ret == 0) { + params = key->params; + unsigned int allocSz; + + /* s1-L, s2-K, t0-K, t-K, t1-K */ + allocSz = params->s1Sz + 4 * params->s2Sz; +#if !defined(WC_DILITHIUM_CACHE_MATRIX_A) + /* A-KxL */ + allocSz += params->aSz; +#endif + + /* Allocate memory for large intermediates. */ + s1 = (sword32*)XMALLOC(allocSz, NULL, DYNAMIC_TYPE_DILITHIUM); + if (s1 == NULL) { + ret = MEMORY_E; + } + else { + s2 = s1 + params->s1Sz / sizeof(*s1); + t0 = s2 + params->s2Sz / sizeof(*s2); + t = t0 + params->s2Sz / sizeof(*t0); + t1 = t + params->s2Sz / sizeof(*t); +#if !defined(WC_DILITHIUM_CACHE_MATRIX_A) + a = t1 + params->s2Sz / sizeof(*t1); +#else + a = key->a; +#endif + } } - else if (key->level == 3) { - return DILITHIUM_LEVEL3_SIG_SIZE; + + if (ret == 0) { +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + /* Check that we haven't already cached the matrix A. */ + if (!key->aSet) +#endif + { + const byte* pub_seed = key->p; + + ret = dilithium_expand_a(&key->shake, pub_seed, params->k, + params->l, a); +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + key->aSet = (ret == 0); +#endif + } } - else if (key->level == 5) { - return DILITHIUM_LEVEL5_SIG_SIZE; + if (ret == 0) { + const byte* s1p = key->k + DILITHIUM_PUB_SEED_SZ + DILITHIUM_K_SZ + + DILITHIUM_TR_SZ; + const byte* s2p = s1p + params->s1EncSz; + const byte* t0p = s2p + params->s2EncSz; + const byte* t1p = key->p + DILITHIUM_PUB_SEED_SZ; + sword32* tt = t; + unsigned int i; + unsigned int j; + sword32 x = 0; + + /* Get s1, s2 and t0 from private key. */ + dilithium_vec_decode_eta_bits(s1p, params->eta, s1, params->l); + dilithium_vec_decode_eta_bits(s2p, params->eta, s2, params->k); + dilithium_vec_decode_t0(t0p, params->k, t0); + + /* Get t1 from public key. */ + dilithium_vec_decode_t1(t1p, params->k, t1); + + /* Calcaluate t = NTT-1(A o NTT(s1)) + s2 */ + dilithium_vec_ntt_small(s1, params->l); + dilithium_matrix_mul(t, a, s1, params->k, params->l); + dilithium_vec_invntt(t, params->k); + dilithium_vec_add(t, s2, params->k); + /* Subtract t0 from t. */ + dilithium_vec_sub(t, t0, params->k); + /* Make t positive to match t1. */ + dilithium_vec_make_pos(t, params->k); + + /* Check t - t0 and t1 are the same. */ + for (i = 0; i < params->k; i++) { + for (j = 0; j < DILITHIUM_N; j++) { + x |= tt[j] ^ t1[j]; + } + tt += DILITHIUM_N; + t1 += DILITHIUM_N; + } + /* Check the public seed is the same in private and public key. */ + for (i = 0; i < DILITHIUM_PUB_SEED_SZ; i++) { + x |= key->p[i] ^ key->k[i]; + } + + if ((ret == 0) && (x != 0)) { + ret = PUBLIC_KEY_E; + } } - return BAD_FUNC_ARG; + /* Dispose of allocated memory. */ + XFREE(s1, NULL, DYNAMIC_TYPE_DILITHIUM); +#else + /* Validate parameter. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (!key->prvKeySet)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (!key->pubKeySet)) { + ret = PUBLIC_KEY_E; + } + + if (ret == 0) { + int i; + sword32 x = 0; + + /* Check the public seed is the same in private and public key. */ + for (i = 0; i < 32; i++) { + x |= key->p[i] ^ key->k[i]; + } + + if (x != 0) { + ret = PUBLIC_KEY_E; + } + } +#endif /* WOLFSSL_WC_DILITHIUM */ + return ret; } +#endif /* WOLFSSL_DILITHIUM_CHECK_KEY */ -int wc_Dilithium_PrivateKeyDecode(const byte* input, word32* inOutIdx, - dilithium_key* key, word32 inSz) +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + +/* Export the dilithium public key. + * + * @param [in] key Dilithium public key. + * @param [out] out Array to hold public key. + * @param [in, out] outLen On in, the number of bytes in array. + * On out, the number bytes put into array. + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BUFFER_E when outLen is less than DILITHIUM_LEVEL2_PUB_KEY_SIZE. + */ +int wc_dilithium_export_public(dilithium_key* key, byte* out, word32* outLen) { int ret = 0; - byte privKey[DILITHIUM_MAX_KEY_SIZE], pubKey[DILITHIUM_MAX_PUB_KEY_SIZE]; - word32 privKeyLen = (word32)sizeof(privKey); - word32 pubKeyLen = (word32)sizeof(pubKey); - int keytype = 0; + word32 inLen; - if (input == NULL || inOutIdx == NULL || key == NULL || inSz == 0) { - return BAD_FUNC_ARG; + /* Validate parameters */ + if ((key == NULL) || (out == NULL) || (outLen == NULL)) { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + /* Get length passed in for checking. */ + inLen = *outLen; + if (key->level == 2) { + /* Set out length. */ + *outLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE; + /* Validate length passed in. */ + if (inLen < DILITHIUM_LEVEL2_PUB_KEY_SIZE) { + ret = BUFFER_E; + } + } + else if (key->level == 3) { + /* Set out length. */ + *outLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE; + /* Validate length passed in. */ + if (inLen < DILITHIUM_LEVEL3_PUB_KEY_SIZE) { + ret = BUFFER_E; + } + } + else if (key->level == 5) { + /* Set out length. */ + *outLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE; + /* Validate length passed in. */ + if (inLen < DILITHIUM_LEVEL5_PUB_KEY_SIZE) { + ret = BUFFER_E; + } + } + else { + /* Level not set. */ + ret = BAD_FUNC_ARG; + } } - if (key->level == 2) { - keytype = DILITHIUM_LEVEL2k; + /* Check public key available. */ + if ((ret == 0) && (!key->pubKeySet)) { + ret = BAD_FUNC_ARG; } - else if (key->level == 3) { - keytype = DILITHIUM_LEVEL3k; + + if (ret == 0) { + /* Copy public key out. */ + XMEMCPY(out, key->p, *outLen); } - else if (key->level == 5) { - keytype = DILITHIUM_LEVEL5k; + + return ret; +} + +/* Import a dilithium public key from a byte array. + * + * Public key encoded in big-endian. + * + * @param [in] in Array holding public key. + * @param [in] inLen Number of bytes of data in array. + * @param [in, out] key Dilithium public key. + * @return 0 on success. + * @return BAD_FUNC_ARG when in or key is NULL or key format is not supported. + */ +int wc_dilithium_import_public(const byte* in, word32 inLen, dilithium_key* key) +{ + int ret = 0; + + /* Validate parameters. */ + if ((in == NULL) || (key == NULL)) { + ret = BAD_FUNC_ARG; } - else { - return BAD_FUNC_ARG; + if (ret == 0) { + if (key->level == 2) { + /* Check length. */ + if (inLen != DILITHIUM_LEVEL2_PUB_KEY_SIZE) { + ret = BAD_FUNC_ARG; + } + } + else if (key->level == 3) { + /* Check length. */ + if (inLen != DILITHIUM_LEVEL3_PUB_KEY_SIZE) { + ret = BAD_FUNC_ARG; + } + } + else if (key->level == 5) { + /* Check length. */ + if (inLen != DILITHIUM_LEVEL5_PUB_KEY_SIZE) { + ret = BAD_FUNC_ARG; + } + } + else { + /* Level not set. */ + ret = BAD_FUNC_ARG; + } } - ret = DecodeAsymKey(input, inOutIdx, inSz, privKey, &privKeyLen, - pubKey, &pubKeyLen, keytype); if (ret == 0) { - if (pubKeyLen == 0) { - ret = wc_dilithium_import_private_only(input, inSz, key); + /* Copy the private key data in or copy pointer. */ + #ifndef WOLFSSL_DILITHIUM_ASSIGN_KEY + XMEMCPY(key->p, in, inLen); + #else + key->p = in; + #endif + + #ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + /* Allocate t1 if required. */ + if (key->t1 == NULL) { + key->t1 = (sword32*)XMALLOC(key->params->s2Sz, NULL, + DYNAMIC_TYPE_DILITHIUM); + if (key->t1 == NULL) { + ret = MEMORY_E; + } } - else { - ret = wc_dilithium_import_private_key(privKey, privKeyLen, - pubKey, pubKeyLen, key); + } + if (ret == 0) { + /* Compute t1 from public key data. */ + dilithium_make_pub_vec(key, key->t1); + #endif + #ifdef WC_DILITHIUM_CACHE_MATRIX_A + /* Allocate matrix a if required. */ + if (key->a == NULL) { + key->a = (sword32*)XMALLOC(key->params->aSz, NULL, + DYNAMIC_TYPE_DILITHIUM); + if (key->a == NULL) { + ret = MEMORY_E; + } } } + if (ret == 0) { + /* Compute matrix a from public key data. */ + ret = dilithium_expand_a(&key->shake, key->p, key->params->k, + key->params->l, key->a); + if (ret == 0) { + key->aSet = 1; + } + } + if (ret == 0) { + #endif + /* Public key is set. */ + key->pubKeySet = 1; + } + return ret; } -int wc_Dilithium_PublicKeyDecode(const byte* input, word32* inOutIdx, - dilithium_key* key, word32 inSz) +#endif /* WOLFSSL_DILITHIUM_PUBLIC_KEY */ + +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY + +/* Set the private key data into key. + * + * @param [in] priv Private key data. + * @param [in] privSz Size of private key data in bytes. + * @param in, out] key Dilithium key to set into. + * @return 0 on success. + * @return BAD_FUNC_ARG when private key size is invalid. + * @return MEMORY_E when dynamic memory allocation fails. + * @return Other negative on hash error. + */ +static int dilithium_set_priv_key(const byte* priv, word32 privSz, + dilithium_key* key) { int ret = 0; - byte pubKey[DILITHIUM_MAX_PUB_KEY_SIZE]; - word32 pubKeyLen = (word32)sizeof(pubKey); - int keytype = 0; +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + const wc_dilithium_params* params = key->params; +#endif - if (input == NULL || inOutIdx == NULL || key == NULL || inSz == 0) { - return BAD_FUNC_ARG; + /* Validate parameters. */ + if ((privSz != DILITHIUM_LEVEL2_KEY_SIZE) && + (privSz != DILITHIUM_LEVEL3_KEY_SIZE) && + (privSz != DILITHIUM_LEVEL5_KEY_SIZE)) { + ret = BAD_FUNC_ARG; } - if (key->level == 2) { - keytype = DILITHIUM_LEVEL2k; + if (ret == 0) { + /* Copy the private key data in or copy pointer. */ + #ifndef WOLFSSL_DILITHIUM_ASSIGN_KEY + XMEMCPY(key->k, priv, privSz); + #else + key->k = priv; + #endif } - else if (key->level == 3) { - keytype = DILITHIUM_LEVEL3k; + + /* Allocate and create cached values. */ +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + if (ret == 0) { + /* Allocate matrix a if required. */ + if (key->a == NULL) { + key->a = (sword32*)XMALLOC(params->aSz, NULL, + DYNAMIC_TYPE_DILITHIUM); + if (key->a == NULL) { + ret = MEMORY_E; + } + } } - else if (key->level == 5) { - keytype = DILITHIUM_LEVEL5k; + if (ret == 0) { + /* Compute matrix a from private key data. */ + ret = dilithium_expand_a(&key->shake, key->k, params->k, params->l, + key->a); + if (ret == 0) { + key->aSet = 1; + } } - else { - return BAD_FUNC_ARG; +#endif +#ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + if ((ret == 0) && (key->s1 == NULL)) { + /* Allocate L vector s1, K vector s2 and K vector t0 if required. */ + key->s1 = (sword32*)XMALLOC(params->s1Sz + params->s2Sz + params->s2Sz, + NULL, DYNAMIC_TYPE_DILITHIUM); + if (key->s1 == NULL) { + ret = MEMORY_E; + } } + if (ret == 0) { + /* Set pointers into allocated memory. */ + key->s2 = key->s1 + params->s1Sz / sizeof(*key->s1); + key->t0 = key->s2 + params->s2Sz / sizeof(*key->s2); - ret = DecodeAsymKeyPublic(input, inOutIdx, inSz, pubKey, &pubKeyLen, - keytype); + /* Compute vectors from private key. */ + dilithium_make_priv_vecs(key, key->s1, key->s2, key->t0); + } +#endif if (ret == 0) { - ret = wc_dilithium_import_public(pubKey, pubKeyLen, key); + /* Private key is set. */ + key->prvKeySet = 1; } + return ret; } -#ifdef WC_ENABLE_ASYM_KEY_EXPORT -/* Encode the public part of an Dilithium key in DER. +/* Import a dilithium private key from a byte array. * - * Pass NULL for output to get the size of the encoding. + * @param [in] priv Array holding private key. + * @param [in] privSz Number of bytes of data in array. + * @param [in, out] key Dilithium private key. + * @return 0 otherwise. + * @return BAD_FUNC_ARG when a parameter is NULL or privSz is less than size + * required for level, + */ +int wc_dilithium_import_private(const byte* priv, word32 privSz, + dilithium_key* key) +{ + int ret = 0; + + /* Validate parameters. */ + if ((priv == NULL) || (key == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (key->level != 2) && (key->level != 3) && + (key->level != 5)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Set the private key data. */ + ret = dilithium_set_priv_key(priv, privSz, key); + } + + return ret; +} + +#if defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) +/* Import a dilithium private and public keys from byte array(s). * - * @param [in] key Dilithium key object. - * @param [out] output Buffer to put encoded data in. - * @param [in] outLen Size of buffer in bytes. - * @param [in] withAlg Whether to use SubjectPublicKeyInfo format. - * @return Size of encoded data in bytes on success. - * @return BAD_FUNC_ARG when key is NULL. - * @return MEMORY_E when dynamic memory allocation failed. + * @param [in] priv Array holding private key or private+public keys + * @param [in] privSz Number of bytes of data in private key array. + * @param [in] pub Array holding public key (or NULL). + * @param [in] pubSz Number of bytes of data in public key array (or 0). + * @param [in] key Dilithium private/public key. + * @return 0 on success. + * @return BAD_FUNC_ARG when a required parameter is NULL an invalid + * combination of keys/lengths is supplied. */ -int wc_Dilithium_PublicKeyToDer(dilithium_key* key, byte* output, word32 inLen, - int withAlg) +int wc_dilithium_import_key(const byte* priv, word32 privSz, + const byte* pub, word32 pubSz, dilithium_key* key) { - int ret; - byte pubKey[DILITHIUM_MAX_PUB_KEY_SIZE]; - word32 pubKeyLen = (word32)sizeof(pubKey); - int keytype = 0; + int ret = 0; - if (key == NULL || output == NULL) { - return BAD_FUNC_ARG; + /* Validate parameters. */ + if ((priv == NULL) || (key == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((pub == NULL) && (pubSz != 0)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (key->level != 2) && (key->level != 3) && + (key->level != 5)) { + ret = BAD_FUNC_ARG; } - if (key->level == 2) { - keytype = DILITHIUM_LEVEL2k; + if ((ret == 0) && (pub != NULL)) { + /* Import public key. */ + ret = wc_dilithium_import_public(pub, pubSz, key); } - else if (key->level == 3) { - keytype = DILITHIUM_LEVEL3k; + if (ret == 0) { + ret = dilithium_set_priv_key(priv, privSz, key); } - else if (key->level == 5) { - keytype = DILITHIUM_LEVEL5k; + + return ret; +} +#endif /* WOLFSSL_DILITHIUM_PUBLIC_KEY */ + +/* Export the dilithium private key. + * + * @param [in] key Dilithium private key. + * @param [out] out Array to hold private key. + * @param [in, out] outLen On in, the number of bytes in array. + * On out, the number bytes put into array. + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BUFFER_E when outLen is less than DILITHIUM_LEVEL2_KEY_SIZE. + */ +int wc_dilithium_export_private(dilithium_key* key, byte* out, + word32* outLen) +{ + int ret = 0; + word32 inLen; + + /* Validate parameters. */ + if ((key == NULL) || (out == NULL) || (outLen == NULL)) { + ret = BAD_FUNC_ARG; } - else { - return BAD_FUNC_ARG; + + /* Check private key available. */ + if ((ret == 0) && (!key->prvKeySet)) { + ret = BAD_FUNC_ARG; } - ret = wc_dilithium_export_public(key, pubKey, &pubKeyLen); if (ret == 0) { - ret = SetAsymKeyDerPublic(pubKey, pubKeyLen, output, inLen, keytype, - withAlg); + inLen = *outLen; + /* check and set up out length */ + if (key->level == 2) { + *outLen = DILITHIUM_LEVEL2_KEY_SIZE; + } + else if (key->level == 3) { + *outLen = DILITHIUM_LEVEL3_KEY_SIZE; + } + else if (key->level == 5) { + *outLen = DILITHIUM_LEVEL5_KEY_SIZE; + } + else { + /* Level not set. */ + ret = BAD_FUNC_ARG; + } + } + + /* Check array length. */ + if ((ret == 0) && (inLen < *outLen)) { + ret = BUFFER_E; + } + + if (ret == 0) { + /* Copy private key out key. */ + XMEMCPY(out, key->k, *outLen); } return ret; } -#endif -int wc_Dilithium_KeyToDer(dilithium_key* key, byte* output, word32 inLen) +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY +/* Export the dilithium private and public key. + * + * @param [in] key Dilithium private/public key. + * @param [out] priv Array to hold private key. + * @param [in, out] privSz On in, the number of bytes in private key array. + * On out, the number bytes put into private key. + * @param [out] pub Array to hold public key. + * @param [in, out] pubSz On in, the number of bytes in public key array. + * On out, the number bytes put into public key. + * @return 0 on success. + * @return BAD_FUNC_ARG when a key, priv, privSz, pub or pubSz is NULL. + * @return BUFFER_E when privSz or pubSz is less than required size. + */ +int wc_dilithium_export_key(dilithium_key* key, byte* priv, word32 *privSz, + byte* pub, word32 *pubSz) { - if (key == NULL) { - return BAD_FUNC_ARG; + int ret; + + /* Export private key only. */ + ret = wc_dilithium_export_private(key, priv, privSz); + if (ret == 0) { + /* Export public key. */ + ret = wc_dilithium_export_public(key, pub, pubSz); } - if (key->level == 2) { - return SetAsymKeyDer(key->k, DILITHIUM_LEVEL2_KEY_SIZE, key->p, - DILITHIUM_LEVEL2_KEY_SIZE, output, inLen, - DILITHIUM_LEVEL2k); + return ret; +} +#endif /* WOLFSSL_DILITHIUM_PUBLIC_KEY */ + +#endif /* WOLFSSL_DILITHIUM_PRIVATE_KEY */ + +#ifndef WOLFSSL_DILITHIUM_NO_ASN1 + +#if defined(WOLFSSL_DILITHIUM_PRIVATE_KEY) + +/* Decode the DER encoded Dilithium key. + * + * @param [in] input Array holding DER encoded data. + * @param [in, out] inOutIdx On in, index into array of start of DER encoding. + * On out, index into array after DER encoding. + * @param [in, out] key Dilithium key to store key. + * @param [in] inSz Total size of data in array. + * @return 0 on success. + * @return BAD_FUNC_ARG when input, inOutIdx or key is NULL or inSz is 0. + * @return BAD_FUNC_ARG when level not set. + * @return Other negative on parse error. + */ +int wc_Dilithium_PrivateKeyDecode(const byte* input, word32* inOutIdx, + dilithium_key* key, word32 inSz) +{ + int ret = 0; + const byte* privKey = NULL; + const byte* pubKey = NULL; + word32 privKeyLen = 0; + word32 pubKeyLen = 0; + int keytype = 0; + + /* Validate parameters. */ + if ((input == NULL) || (inOutIdx == NULL) || (key == NULL) || (inSz == 0)) { + ret = BAD_FUNC_ARG; } - else if (key->level == 3) { - return SetAsymKeyDer(key->k, DILITHIUM_LEVEL3_KEY_SIZE, key->p, - DILITHIUM_LEVEL3_KEY_SIZE, output, inLen, - DILITHIUM_LEVEL3k); + + if (ret == 0) { + /* Get OID sum for level. */ + if (key->level == 2) { + keytype = DILITHIUM_LEVEL2k; + } + else if (key->level == 3) { + keytype = DILITHIUM_LEVEL3k; + } + else if (key->level == 5) { + keytype = DILITHIUM_LEVEL5k; + } + else { + /* Level not set. */ + ret = BAD_FUNC_ARG; + } } - else if (key->level == 5) { - return SetAsymKeyDer(key->k, DILITHIUM_LEVEL5_KEY_SIZE, key->p, - DILITHIUM_LEVEL5_KEY_SIZE, output, inLen, - DILITHIUM_LEVEL5k); + + if (ret == 0) { + /* Decode the asymmetric key and get out private and public key data. */ + ret = DecodeAsymKey_Assign(input, inOutIdx, inSz, &privKey, &privKeyLen, + &pubKey, &pubKeyLen, keytype); + } + if ((ret == 0) && (pubKey == NULL) && (pubKeyLen == 0)) { + /* Check if the public key is included in the private key. */ + if ((key->level == 2) && + (privKeyLen == DILITHIUM_LEVEL2_PRV_KEY_SIZE)) { + pubKey = privKey + DILITHIUM_LEVEL2_KEY_SIZE; + pubKeyLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE; + privKeyLen -= DILITHIUM_LEVEL2_PUB_KEY_SIZE; + } + else if ((key->level == 3) && + (privKeyLen == DILITHIUM_LEVEL3_PRV_KEY_SIZE)) { + pubKey = privKey + DILITHIUM_LEVEL3_KEY_SIZE; + pubKeyLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE; + privKeyLen -= DILITHIUM_LEVEL3_PUB_KEY_SIZE; + } + else if ((key->level == 5) && + (privKeyLen == DILITHIUM_LEVEL5_PRV_KEY_SIZE)) { + pubKey = privKey + DILITHIUM_LEVEL5_KEY_SIZE; + pubKeyLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE; + privKeyLen -= DILITHIUM_LEVEL5_PUB_KEY_SIZE; + } } - return BAD_FUNC_ARG; + if (ret == 0) { + /* Check whether public key data was found. */ +#if defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) + if (pubKeyLen == 0) +#endif + { + /* No public key data, only import private key data. */ + ret = wc_dilithium_import_private(privKey, privKeyLen, key); + } +#if defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) + else { + /* Import private and public key data. */ + ret = wc_dilithium_import_key(privKey, privKeyLen, pubKey, + pubKeyLen, key); + } +#endif + } + + (void)pubKey; + (void)pubKeyLen; + + return ret; } -int wc_Dilithium_PrivateKeyToDer(dilithium_key* key, byte* output, word32 inLen) +#endif /* WOLFSSL_DILITHIUM_PRIVATE_KEY */ + +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY + +/* Decode the DER encoded Dilithium public key. + * + * @param [in] input Array holding DER encoded data. + * @param [in, out] inOutIdx On in, index into array of start of DER encoding. + * On out, index into array after DER encoding. + * @param [in, out] key Dilithium key to store key. + * @param [in] inSz Total size of data in array. + * @return 0 on success. + * @return BAD_FUNC_ARG when input, inOutIdx or key is NULL or inSz is 0. + * @return BAD_FUNC_ARG when level not set. + * @return Other negative on parse error. + */ +int wc_Dilithium_PublicKeyDecode(const byte* input, word32* inOutIdx, + dilithium_key* key, word32 inSz) { + int ret = 0; + const byte* pubKey; + word32 pubKeyLen = 0; + int keytype = 0; + + /* Validate parameters. */ + if ((input == NULL) || (inOutIdx == NULL) || (key == NULL) || (inSz == 0)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Try to import the key directly. */ + ret = wc_dilithium_import_public(input, inSz, key); + if (ret != 0) { + /* Start again. */ + ret = 0; + + /* Get OID sum for level. */ + if (key->level == 2) { + keytype = DILITHIUM_LEVEL2k; + } + else if (key->level == 3) { + keytype = DILITHIUM_LEVEL3k; + } + else if (key->level == 5) { + keytype = DILITHIUM_LEVEL5k; + } + else { + /* Level not set. */ + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + /* Decode the asymmetric key and get out public key data. */ + ret = DecodeAsymKeyPublic_Assign(input, inOutIdx, inSz, &pubKey, + &pubKeyLen, keytype); + } + if (ret == 0) { + /* Import public key data. */ + ret = wc_dilithium_import_public(pubKey, pubKeyLen, key); + } + } + } + return ret; +} + +#ifdef WC_ENABLE_ASYM_KEY_EXPORT +/* Encode the public part of a Dilithium key in DER. + * + * Pass NULL for output to get the size of the encoding. + * + * @param [in] key Dilithium key object. + * @param [out] output Buffer to put encoded data in. + * @param [in] len Size of buffer in bytes. + * @param [in] withAlg Whether to use SubjectPublicKeyInfo format. + * @return Size of encoded data in bytes on success. + * @return BAD_FUNC_ARG when key is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_Dilithium_PublicKeyToDer(dilithium_key* key, byte* output, word32 len, + int withAlg) +{ + int ret = 0; + int keytype = 0; + int pubKeyLen = 0; + + /* Validate parameters. */ if (key == NULL) { - return BAD_FUNC_ARG; + ret = BAD_FUNC_ARG; + } + /* Check we have a public key to encode. */ + if ((ret == 0) && (!key->pubKeySet)) { + ret = BAD_FUNC_ARG; } - if (key->level == 2) { - return SetAsymKeyDer(key->k, DILITHIUM_LEVEL2_KEY_SIZE, NULL, 0, output, - inLen, DILITHIUM_LEVEL2k); + if (ret == 0) { + /* Get OID and length for level. */ + if (key->level == 2) { + keytype = DILITHIUM_LEVEL2k; + pubKeyLen = DILITHIUM_LEVEL2_PUB_KEY_SIZE; + } + else if (key->level == 3) { + keytype = DILITHIUM_LEVEL3k; + pubKeyLen = DILITHIUM_LEVEL3_PUB_KEY_SIZE; + } + else if (key->level == 5) { + keytype = DILITHIUM_LEVEL5k; + pubKeyLen = DILITHIUM_LEVEL5_PUB_KEY_SIZE; + } + else { + /* Level not set. */ + ret = BAD_FUNC_ARG; + } } - else if (key->level == 3) { - return SetAsymKeyDer(key->k, DILITHIUM_LEVEL3_KEY_SIZE, NULL, 0, output, - inLen, DILITHIUM_LEVEL3k); + + if (ret == 0) { + ret = SetAsymKeyDerPublic(key->p, pubKeyLen, output, len, keytype, + withAlg); } - else if (key->level == 5) { - return SetAsymKeyDer(key->k, DILITHIUM_LEVEL5_KEY_SIZE, NULL, 0, output, - inLen, DILITHIUM_LEVEL5k); + + return ret; +} +#endif /* WC_ENABLE_ASYM_KEY_EXPORT */ + +#endif /* WOLFSSL_DILITHIUM_PUBLIC_KEY */ + +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY + +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY +/* Encode the private and public data of a Dilithium key in DER. + * + * Pass NULL for output to get the size of the encoding. + * + * @param [in] key Dilithium key object. + * @param [out] output Buffer to put encoded data in. + * @param [in] len Size of buffer in bytes. + * @return Size of encoded data in bytes on success. + * @return BAD_FUNC_ARG when key is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_Dilithium_KeyToDer(dilithium_key* key, byte* output, word32 len) +{ + int ret = BAD_FUNC_ARG; + + /* Validate parameters and check public and private key set. */ + if ((key != NULL) && key->prvKeySet && key->pubKeySet) { + /* Create DER for level. */ + if (key->level == 2) { + ret = SetAsymKeyDer(key->k, DILITHIUM_LEVEL2_KEY_SIZE, key->p, + DILITHIUM_LEVEL2_PUB_KEY_SIZE, output, len, DILITHIUM_LEVEL2k); + } + else if (key->level == 3) { + ret = SetAsymKeyDer(key->k, DILITHIUM_LEVEL3_KEY_SIZE, key->p, + DILITHIUM_LEVEL3_PUB_KEY_SIZE, output, len, DILITHIUM_LEVEL3k); + } + else if (key->level == 5) { + ret = SetAsymKeyDer(key->k, DILITHIUM_LEVEL5_KEY_SIZE, key->p, + DILITHIUM_LEVEL5_PUB_KEY_SIZE, output, len, DILITHIUM_LEVEL5k); + } } - return BAD_FUNC_ARG; + return ret; } -#endif /* HAVE_PQC && HAVE_DILITHIUM */ +#endif /* WOLFSSL_DILITHIUM_PUBLIC_KEY */ + +/* Encode the private data of a Dilithium key in DER. + * + * Pass NULL for output to get the size of the encoding. + * + * @param [in] key Dilithium key object. + * @param [out] output Buffer to put encoded data in. + * @param [in] len Size of buffer in bytes. + * @return Size of encoded data in bytes on success. + * @return BAD_FUNC_ARG when key is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_Dilithium_PrivateKeyToDer(dilithium_key* key, byte* output, word32 len) +{ + int ret = BAD_FUNC_ARG; + + /* Validate parameters and check private key set. */ + if ((key != NULL) && key->prvKeySet) { + /* Create DER for level. */ + if (key->level == 2) { + ret = SetAsymKeyDer(key->k, DILITHIUM_LEVEL2_KEY_SIZE, NULL, 0, + output, len, DILITHIUM_LEVEL2k); + } + else if (key->level == 3) { + ret = SetAsymKeyDer(key->k, DILITHIUM_LEVEL3_KEY_SIZE, NULL, 0, + output, len, DILITHIUM_LEVEL3k); + } + else if (key->level == 5) { + ret = SetAsymKeyDer(key->k, DILITHIUM_LEVEL5_KEY_SIZE, NULL, 0, + output, len, DILITHIUM_LEVEL5k); + } + } + + return ret; +} + +#endif /* WOLFSSL_DILITHIUM_PRIVATE_KEY */ + +#endif /* WOLFSSL_DILITHIUM_NO_ASN1 */ + +#endif /* HAVE_DILITHIUM */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/dsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/dsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/dsa.c 2024-08-03 07:30:00.000000000 +0000 @@ -42,6 +42,14 @@ #include #endif +#if defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_SP_ASM) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif + #ifdef _MSC_VER /* disable for while(0) cases (MSVC bug) */ #pragma warning(disable:4127) @@ -260,7 +268,7 @@ */ switch (modulus_size) { #ifdef WOLFSSL_DSA_768_MODULUS - /* This key length is unsecure and only included for bind 9 testing */ + /* This key length is insecure and only included for bind 9 testing */ case 768: #endif case 1024: @@ -641,7 +649,7 @@ int wc_DsaSign(const byte* digest, byte* out, DsaKey* key, WC_RNG* rng) { - /* use sha1 by default for backwards compatability */ + /* use sha1 by default for backwards compatibility */ return wc_DsaSign_ex(digest, WC_SHA_DIGEST_SIZE, out, key, rng); } @@ -756,7 +764,7 @@ break; } - /* k is a random numnber and it should be less than q-1 + /* k is a random number and it should be less than q-1 * if k greater than repeat */ /* Step 6 */ @@ -922,33 +930,39 @@ #ifdef WOLFSSL_SMALL_STACK if (k) { - if ((ret != MP_INIT_E) && (ret != MEMORY_E)) + if ((ret != WC_NO_ERR_TRACE(MP_INIT_E)) && + (ret != WC_NO_ERR_TRACE(MEMORY_E))) mp_forcezero(k); XFREE(k, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (kInv) { - if ((ret != MP_INIT_E) && (ret != MEMORY_E)) + if ((ret != WC_NO_ERR_TRACE(MP_INIT_E)) && + (ret != WC_NO_ERR_TRACE(MEMORY_E))) mp_forcezero(kInv); XFREE(kInv, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (r) { - if ((ret != MP_INIT_E) && (ret != MEMORY_E)) + if ((ret != WC_NO_ERR_TRACE(MP_INIT_E)) && + (ret != WC_NO_ERR_TRACE(MEMORY_E))) mp_clear(r); XFREE(r, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (s) { - if ((ret != MP_INIT_E) && (ret != MEMORY_E)) + if ((ret != WC_NO_ERR_TRACE(MP_INIT_E)) && + (ret != WC_NO_ERR_TRACE(MEMORY_E))) mp_clear(s); XFREE(s, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (H) { - if ((ret != MP_INIT_E) && (ret != MEMORY_E)) + if ((ret != WC_NO_ERR_TRACE(MP_INIT_E)) && + (ret != WC_NO_ERR_TRACE(MEMORY_E))) mp_clear(H); XFREE(H, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } #ifndef WOLFSSL_MP_INVMOD_CONSTANT_TIME if (b) { - if ((ret != MP_INIT_E) && (ret != MEMORY_E)) + if ((ret != WC_NO_ERR_TRACE(MP_INIT_E)) && + (ret != WC_NO_ERR_TRACE(MEMORY_E))) mp_forcezero(b); XFREE(b, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } @@ -958,7 +972,7 @@ XFREE(buffer, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } #else /* !WOLFSSL_SMALL_STACK */ - if (ret != MP_INIT_E) { + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) { ForceZero(buffer, halfSz); mp_forcezero(kInv); mp_forcezero(k); @@ -976,7 +990,7 @@ int wc_DsaVerify(const byte* digest, const byte* sig, DsaKey* key, int* answer) { - /* use sha1 by default for backwards compatability */ + /* use sha1 by default for backwards compatibility */ return wc_DsaVerify_ex(digest, WC_SHA_DIGEST_SIZE, sig, key, answer); } @@ -1098,37 +1112,37 @@ #ifdef WOLFSSL_SMALL_STACK if (s) { - if (ret != MP_INIT_E) + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(s); XFREE(s, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (r) { - if (ret != MP_INIT_E) + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(r); XFREE(r, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (u1) { - if (ret != MP_INIT_E) + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(u1); XFREE(u1, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (u2) { - if (ret != MP_INIT_E) + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(u2); XFREE(u2, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (w) { - if (ret != MP_INIT_E) + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(w); XFREE(w, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } if (v) { - if (ret != MP_INIT_E) + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(v); XFREE(v, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } #else - if (ret != MP_INIT_E) { + if (ret != WC_NO_ERR_TRACE(MP_INIT_E)) { mp_clear(s); mp_clear(r); mp_clear(u1); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ecc.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ecc.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ecc.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ecc.c 2024-08-03 07:30:00.000000000 +0000 @@ -92,6 +92,18 @@ * Enables implementations that protect data that is in * encrypted memory. * default: off + * WOLFSSL_ECC_GEN_REJECT_SAMPLING + * Enables generation of scalar (private key and ECDSA + * nonce) to be performed using reject sampling algorithm. + * Use this when CPU state can be closely observed by + * attacker. + * default: off + * WOLFSSL_ECC_BLIND_K + * Blind the private key k by using a random mask. + * The private key is never stored unprotected but an + * unmasked copy is computed and stored each time it is + * needed. + * default: off */ /* @@ -101,6 +113,7 @@ * HAVE_ECC_SECPR3 Enables SECP R3 curves default: off * HAVE_ECC_BRAINPOOL Enables Brainpool curves default: off * HAVE_ECC_KOBLITZ Enables Koblitz curves default: off + * WOLFSSL_SM2 Enables SM2 curves default: off */ /* @@ -173,6 +186,15 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_ecc_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000005 }; + int wolfCrypt_FIPS_ECC_sanity(void) + { + return 0; + } +#endif + #if defined(FREESCALE_LTC_ECC) #include #endif @@ -206,6 +228,14 @@ #include #endif +#if defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_SP_ASM) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif + #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL) #define GEN_MEM_ERR MP_MEM #elif defined(USE_FAST_MATH) @@ -215,28 +245,109 @@ #endif #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ - !defined(WOLFSSL_SILABS_SE_ACCEL) && !defined(WOLFSSL_KCAPI_ECC) && \ - !defined(WOLFSSL_CRYPTOCELL) && !defined(NO_ECC_MAKE_PUB) && \ + !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \ + !defined(WOLFSSL_KCAPI_ECC) && !defined(WOLFSSL_SE050) && \ + !defined(WOLFSSL_XILINX_CRYPT_VERSAL) && !defined(WOLFSSL_STM32_PKA) + #undef HAVE_ECC_VERIFY_HELPER + #define HAVE_ECC_VERIFY_HELPER +#endif + +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \ + !defined(WOLFSSL_KCAPI_ECC) && !defined(NO_ECC_MAKE_PUB) && \ !defined(WOLF_CRYPTO_CB_ONLY_ECC) #undef HAVE_ECC_MAKE_PUB #define HAVE_ECC_MAKE_PUB #endif + +/* macro guard for ecc_check_pubkey_order functionality */ +#if !defined(WOLFSSL_SP_MATH) && \ + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \ + !defined(WOLFSSL_SE050) && !defined(WOLFSSL_STM32_PKA) && \ + (!defined(WOLF_CRYPTO_CB_ONLY_ECC) || defined(WOLFSSL_IMXRT1170_CAAM) || \ + defined(WOLFSSL_QNX_CAAM)) + + /* CAAM builds use public key validation as a means to check if an + * imported private key is an encrypted black key or not */ + #undef HAVE_ECC_CHECK_PUBKEY_ORDER + #define HAVE_ECC_CHECK_PUBKEY_ORDER +#endif + #if defined(WOLFSSL_SP_MATH_ALL) && SP_INT_BITS < MAX_ECC_BITS_NEEDED #define MAX_ECC_BITS_USE SP_INT_BITS #else #define MAX_ECC_BITS_USE MAX_ECC_BITS_NEEDED #endif + #if !defined(WOLFSSL_CUSTOM_CURVES) && (ECC_MIN_KEY_SZ > 160) && \ (!defined(HAVE_ECC_KOBLITZ) || (ECC_MIN_KEY_SZ > 224)) + #define ECC_KEY_MAX_BITS(key) \ ((((key) == NULL) || ((key)->dp == NULL)) ? MAX_ECC_BITS_USE : \ ((unsigned)((key)->dp->size * 8))) +#define ECC_KEY_MAX_BITS_NONULLCHECK(key) \ + (((key)->dp == NULL) ? MAX_ECC_BITS_USE : \ + ((unsigned)((key)->dp->size * 8))) + #else + /* Add one bit for cases when order is a bit greater than prime. */ #define ECC_KEY_MAX_BITS(key) \ ((((key) == NULL) || ((key)->dp == NULL)) ? MAX_ECC_BITS_USE : \ ((unsigned)((key)->dp->size * 8 + 1))) +#define ECC_KEY_MAX_BITS_NONULLCHECK(key) \ + (((key)->dp == NULL) ? MAX_ECC_BITS_USE : \ + ((unsigned)((key)->dp->size * 8 + 1))) + +#endif + +#ifdef WOLFSSL_ECC_BLIND_K +mp_int* ecc_get_k(ecc_key* key) +{ + mp_xor_ct(key->k, key->kb, key->dp->size, key->ku); + return key->ku; +} +void ecc_blind_k(ecc_key* key, mp_int* b) +{ + mp_xor_ct(key->k, b, key->dp->size, key->k); + mp_xor_ct(key->kb, b, key->dp->size, key->kb); +} +int ecc_blind_k_rng(ecc_key* key, WC_RNG* rng) +{ + int ret = 0; + WC_RNG local_rng; + +#ifdef ECC_TIMING_RESISTANT + if (rng == NULL) { + rng = key->rng; + } +#endif + if (rng == NULL) { + ret = wc_InitRng(&local_rng); + if (ret == 0) { + rng = &local_rng; + } + } + if (ret == 0) { + ret = mp_rand(key->kb, (key->dp->size + sizeof(mp_digit) - 1) / + sizeof(mp_digit), rng); + if (ret == 0) { + mp_xor_ct(key->k, key->kb, key->dp->size, key->k); + } + } + + if (rng == &local_rng) { + wc_FreeRng(&local_rng); + } + return ret; +} + +mp_int* wc_ecc_key_get_priv(ecc_key* key) +{ + return ecc_get_k(key); +} #endif /* forward declarations */ @@ -319,7 +430,7 @@ #endif #define ecc_oid_secp112r1_sz CODED_SECP112R1_SZ #endif /* !NO_ECC_SECP */ - #ifdef HAVE_ECC_SECPR2 + #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ) #ifdef HAVE_OID_ENCODING #define CODED_SECP112R2 {1,3,132,0,7} #define CODED_SECP112R2_SZ 5 @@ -333,7 +444,7 @@ #define ecc_oid_secp112r2 CODED_SECP112R2 #endif #define ecc_oid_secp112r2_sz CODED_SECP112R2_SZ - #endif /* HAVE_ECC_SECPR2 */ + #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */ #endif /* ECC112 */ #ifdef ECC128 #ifndef NO_ECC_SECP @@ -351,7 +462,7 @@ #endif #define ecc_oid_secp128r1_sz CODED_SECP128R1_SZ #endif /* !NO_ECC_SECP */ - #ifdef HAVE_ECC_SECPR2 + #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ) #ifdef HAVE_OID_ENCODING #define CODED_SECP128R2 {1,3,132,0,29} #define CODED_SECP128R2_SZ 5 @@ -365,7 +476,7 @@ #define ecc_oid_secp128r2 CODED_SECP128R2 #endif #define ecc_oid_secp128r2_sz CODED_SECP128R2_SZ - #endif /* HAVE_ECC_SECPR2 */ + #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */ #endif /* ECC128 */ #ifdef ECC160 #ifndef FP_ECC @@ -649,6 +760,21 @@ #define ecc_oid_brainpoolp256r1_sz CODED_BRAINPOOLP256R1_SZ #endif /* HAVE_ECC_BRAINPOOL */ #endif /* ECC256 */ + #if defined(WOLFSSL_SM2) + #ifdef HAVE_OID_ENCODING + #define CODED_SM2P256V1 {1,2,156,10197,1,301} + #define CODED_SM2P256V1_SZ 6 + #else + #define CODED_SM2P256V1 {0x2A,0x81,0x1C,0xCF,0x55,0x01,0x82,0x2d} + #define CODED_SM2P256V1_SZ 8 + #endif + #ifndef WOLFSSL_ECC_CURVE_STATIC + static const ecc_oid_t ecc_oid_sm2p256v1[] = CODED_SM2P256V1; + #else + #define ecc_oid_sm2p256v1 CODED_SM2P256V1 + #endif + #define ecc_oid_sm2p256v1_sz CODED_SM2P256V1_SZ + #endif /* WOLFSSL_SM2 */ #ifdef ECC320 #ifdef HAVE_ECC_BRAINPOOL #ifdef HAVE_OID_ENCODING @@ -757,7 +883,7 @@ 1, /* cofactor */ }, #endif /* !NO_ECC_SECP */ - #ifdef HAVE_ECC_SECPR2 + #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ) { 14, /* size/bytes */ ECC_SECP112R2, /* ID */ @@ -773,7 +899,7 @@ ECC_SECP112R2_OID, /* oid sum */ 4, /* cofactor */ }, - #endif /* HAVE_ECC_SECPR2 */ + #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */ #endif /* ECC112 */ #ifdef ECC128 #ifndef NO_ECC_SECP @@ -793,7 +919,7 @@ 1, /* cofactor */ }, #endif /* !NO_ECC_SECP */ - #ifdef HAVE_ECC_SECPR2 + #if defined(HAVE_ECC_SECPR2) && defined(HAVE_ECC_KOBLITZ) { 16, /* size/bytes */ ECC_SECP128R2, /* ID */ @@ -809,7 +935,7 @@ ECC_SECP128R2_OID, /* oid sum */ 4, /* cofactor */ }, - #endif /* HAVE_ECC_SECPR2 */ + #endif /* HAVE_ECC_SECPR2 && HAVE_ECC_KOBLITZ */ #endif /* ECC128 */ #ifdef ECC160 #ifndef FP_ECC @@ -1129,6 +1255,25 @@ }, #endif /* HAVE_ECC_BRAINPOOL */ #endif /* ECC256 */ + #if defined(WOLFSSL_SM2) + { + 32, /* size/bytes */ + ECC_SM2P256V1, /* ID */ + "SM2P256V1", /* curve name */ + + /* bottom of draft-shen-sm2-ecdsa-02, recommended values */ + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", /* prime */ + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", /* A */ + "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", /* B */ + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", /* order */ + "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", /* Gx */ + "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", /* Gy */ + ecc_oid_sm2p256v1, /* oid/oidSz */ + ecc_oid_sm2p256v1_sz, + ECC_SM2P256V1_OID, /* oid sum */ + 1, /* cofactor */ + }, + #endif /* WOLFSSL_SM2 */ #ifdef ECC320 #ifdef HAVE_ECC_BRAINPOOL { @@ -1274,18 +1419,11 @@ static oid_cache_t ecc_oid_cache[ECC_SET_COUNT]; #endif - +/* Forward declarations */ #if defined(HAVE_COMP_KEY) && defined(HAVE_ECC_KEY_EXPORT) static int wc_ecc_export_x963_compressed(ecc_key* key, byte* out, word32* outLen); #endif - - - -#if !defined(WOLFSSL_SP_MATH) && \ - !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ - !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \ - !defined(WOLFSSL_SE050) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \ - !defined(WOLFSSL_STM32_PKA) +#ifdef HAVE_ECC_CHECK_PUBKEY_ORDER static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, mp_int* prime, mp_int* order); #endif @@ -1296,8 +1434,18 @@ #endif -int mp_jacobi(mp_int* a, mp_int* n, int* c); -int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret); +#ifdef HAVE_COMP_KEY +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(WOLFSSL_CRYPTOCELL) + +#ifndef WOLFSSL_SP_MATH +#if !defined(SQRTMOD_USE_MOD_EXP) +static int mp_jacobi(mp_int* a, mp_int* n, int* c); +#endif +static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret); +#endif +#endif +#endif /* Curve Specs */ @@ -1335,25 +1483,22 @@ byte load_mask; } ecc_curve_spec; -enum ecc_curve_load_mask { - ECC_CURVE_FIELD_NONE = 0x00, - ECC_CURVE_FIELD_PRIME = 0x01, - ECC_CURVE_FIELD_AF = 0x02, + #define ECC_CURVE_FIELD_NONE 0x00 + #define ECC_CURVE_FIELD_PRIME 0x01 + #define ECC_CURVE_FIELD_AF 0x02 #ifdef USE_ECC_B_PARAM - ECC_CURVE_FIELD_BF = 0x04, + #define ECC_CURVE_FIELD_BF 0x04 #endif - ECC_CURVE_FIELD_ORDER = 0x08, - ECC_CURVE_FIELD_GX = 0x10, - ECC_CURVE_FIELD_GY = 0x20, + #define ECC_CURVE_FIELD_ORDER 0x08 + #define ECC_CURVE_FIELD_GX 0x10 + #define ECC_CURVE_FIELD_GY 0x20 #ifdef USE_ECC_B_PARAM - ECC_CURVE_FIELD_ALL = 0x3F, - ECC_CURVE_FIELD_COUNT = 6, + #define ECC_CURVE_FIELD_ALL 0x3F + #define ECC_CURVE_FIELD_COUNT 6 #else - ECC_CURVE_FIELD_ALL = 0x3B, - ECC_CURVE_FIELD_COUNT = 5, + #define ECC_CURVE_FIELD_ALL 0x3B + #define ECC_CURVE_FIELD_COUNT 5 #endif - WOLF_ENUM_DUMMY_LAST_ELEMENT(ecc_curve_load_mask) -}; #if defined(WOLFSSL_XILINX_CRYPT_VERSAL) static const u32 xil_curve_type[ECC_CURVE_MAX] = { @@ -1403,14 +1548,18 @@ #ifdef ECC_CACHE_CURVE /* cache (mp_int) of the curve parameters */ + #ifdef WOLFSSL_NO_MALLOC + static ecc_curve_spec ecc_curve_spec_cache[ECC_SET_COUNT]; + #else static ecc_curve_spec* ecc_curve_spec_cache[ECC_SET_COUNT]; + #endif #ifndef SINGLE_THREADED - static wolfSSL_Mutex ecc_curve_cache_mutex; + static wolfSSL_Mutex ecc_curve_cache_mutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(ecc_curve_cache_mutex); #endif #define DECLARE_CURVE_SPECS(intcount) ecc_curve_spec* curve = NULL - #define ALLOC_CURVE_SPECS(intcount, err) - #define FREE_CURVE_SPECS() + #define ALLOC_CURVE_SPECS(intcount, err) WC_DO_NOTHING + #define FREE_CURVE_SPECS() WC_DO_NOTHING #elif defined(WOLFSSL_SMALL_STACK) #ifdef WOLFSSL_SP_MATH_ALL #define DECLARE_CURVE_SPECS(intcount) \ @@ -1465,8 +1614,8 @@ curve->spec_ints = spec_ints; \ curve->spec_count = (intcount) #endif - #define ALLOC_CURVE_SPECS(intcount, err) - #define FREE_CURVE_SPECS() + #define ALLOC_CURVE_SPECS(intcount, err) WC_DO_NOTHING + #define FREE_CURVE_SPECS() WC_DO_NOTHING #endif /* ECC_CACHE_CURVE */ static void wc_ecc_curve_cache_free_spec_item(ecc_curve_spec* curve, mp_int* item, @@ -1583,6 +1732,9 @@ } #endif +#ifdef WOLFSSL_NO_MALLOC + curve = &ecc_curve_spec_cache[x]; +#else /* make sure cache has been allocated */ if (ecc_curve_spec_cache[x] == NULL #ifdef WOLFSSL_CUSTOM_CURVES @@ -1609,6 +1761,8 @@ else { curve = ecc_curve_spec_cache[x]; } +#endif /* WOLFSSL_NO_MALLOC */ + /* return new or cached curve */ *pCurve = curve; #else @@ -1675,7 +1829,8 @@ int wc_ecc_curve_cache_init(void) { int ret = 0; -#if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED) +#if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED) && \ + !defined(WOLFSSL_MUTEX_INITIALIZER) ret = wc_InitMutex(&ecc_curve_cache_mutex); #endif return ret; @@ -1687,14 +1842,20 @@ /* free all ECC curve caches */ for (x = 0; x < (int)ECC_SET_COUNT; x++) { + #ifdef WOLFSSL_NO_MALLOC + wc_ecc_curve_cache_free_spec(&ecc_curve_spec_cache[x]); + XMEMSET(&ecc_curve_spec_cache[x], 0, sizeof(ecc_curve_spec_cache[x])); + #else if (ecc_curve_spec_cache[x]) { wc_ecc_curve_cache_free_spec(ecc_curve_spec_cache[x]); XFREE(ecc_curve_spec_cache[x], NULL, DYNAMIC_TYPE_ECC); ecc_curve_spec_cache[x] = NULL; } + #endif /* WOLFSSL_NO_MALLOC */ } -#if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED) +#if defined(ECC_CACHE_CURVE) && !defined(SINGLE_THREADED) && \ + !defined(WOLFSSL_MUTEX_INITIALIZER) wc_FreeMutex(&ecc_curve_cache_mutex); #endif } @@ -1765,7 +1926,9 @@ #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ - !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) + !defined(WOLFSSL_CRYPTOCELL) && \ + (!defined(WOLF_CRYPTO_CB_ONLY_ECC) || defined(WOLFSSL_QNX_CAAM) || \ + defined(WOLFSSL_IMXRT1170_CAAM)) #if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_PUBLIC_ECC_ADD_DBL) static int _ecc_projective_dbl_point(ecc_point *P, ecc_point *R, mp_int* a, @@ -2107,6 +2270,12 @@ (void)a; (void)mp; +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((modBits == 256) && (!mp_is_bit_set(modulus, 224))) { + return sp_ecc_proj_add_point_sm2_256(P->x, P->y, P->z, Q->x, Q->y, Q->z, + R->x, R->y, R->z); + } +#endif #ifndef WOLFSSL_SP_NO_256 if (modBits == 256) { return sp_ecc_proj_add_point_256(P->x, P->y, P->z, Q->x, Q->y, Q->z, @@ -2471,6 +2640,11 @@ (void)a; (void)mp; +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((modBits == 256) && (!mp_is_bit_set(modulus, 224))) { + return sp_ecc_proj_dbl_point_sm2_256(P->x, P->y, P->z, R->x, R->y, R->z); + } +#endif #ifndef WOLFSSL_SP_NO_256 if (modBits == 256) { return sp_ecc_proj_dbl_point_256(P->x, P->y, P->z, R->x, R->y, R->z); @@ -2519,6 +2693,7 @@ */ int ecc_map_ex(ecc_point* P, mp_int* modulus, mp_digit mp, int ct) { + int err = MP_OKAY; #if !defined(WOLFSSL_SP_MATH) DECL_MP_INT_SIZE_DYN(t1, mp_bitsused(modulus), MAX_ECC_BITS_USE); DECL_MP_INT_SIZE_DYN(t2, mp_bitsused(modulus), MAX_ECC_BITS_USE); @@ -2528,7 +2703,6 @@ DECL_MP_INT_SIZE_DYN(rz, mp_bitsused(modulus), MAX_ECC_BITS_USE); #endif mp_int *x, *y, *z; - int err; (void)ct; @@ -2716,30 +2890,39 @@ } return err; + /* end !defined(WOLFSSL_SP_MATH) */ + #else + /* begin defined(WOLFSSL_SP_MATH) */ if (P == NULL || modulus == NULL) return ECC_BAD_ARG_E; (void)mp; (void)ct; -#ifndef WOLFSSL_SP_NO_256 +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) { + err = sp_ecc_map_sm2_256(P->x, P->y, P->z); + } +#elif defined(WOLFSSL_SP_NO_256) if (mp_count_bits(modulus) == 256) { - return sp_ecc_map_256(P->x, P->y, P->z); + err = sp_ecc_map_256(P->x, P->y, P->z); } -#endif -#ifdef WOLFSSL_SP_384 +#elif defined(WOLFSSL_SP_384) if (mp_count_bits(modulus) == 384) { - return sp_ecc_map_384(P->x, P->y, P->z); + err = sp_ecc_map_384(P->x, P->y, P->z); } -#endif -#ifdef WOLFSSL_SP_521 +#elif defined(WOLFSSL_SP_521) if (mp_count_bits(modulus) == 521) { - return sp_ecc_map_521(P->x, P->y, P->z); + err = sp_ecc_map_521(P->x, P->y, P->z); } +#else + err = ECC_BAD_ARG_E; #endif - return ECC_BAD_ARG_E; -#endif + + WOLFSSL_LEAVE("ecc_map_ex (SP Math)", err); + return err; +#endif /* WOLFSSL_SP_MATH */ } #endif /* !FREESCALE_LTC_ECC && !WOLFSSL_STM32_PKA */ @@ -2906,21 +3089,11 @@ #else static int wc_ecc_gen_z(WC_RNG* rng, int size, ecc_point* p, mp_int* modulus, - mp_digit mp, mp_int* tx, mp_int* ty) + mp_digit mp, mp_int* tx, mp_int* ty, mp_int* mu) { int err = MP_OKAY; - DECL_MP_INT_SIZE_DYN(mu, mp_bitsused(modulus), MAX_ECC_BITS_USE); - - NEW_MP_INT_SIZE(mu, mp_bitsused(modulus), NULL, DYNAMIC_TYPE_ECC); -#ifdef MP_INT_SIZE_CHECK_NULL - if (mu == NULL) - err = MEMORY_E; -#endif - if (err == MP_OKAY) - err = INIT_MP_INT_SIZE(mu, mp_bitsused(modulus)); - if (err == MP_OKAY) - err = mp_montgomery_calc_normalization(mu, modulus); + err = mp_montgomery_calc_normalization(mu, modulus); /* Generate random value to multiply into p->z. */ if (err == MP_OKAY) err = wc_ecc_gen_k(rng, size, ty, modulus); @@ -2953,9 +3126,6 @@ if (err == MP_OKAY) err = mp_montgomery_reduce(p->y, modulus, mp); - mp_clear(mu); - FREE_MP_INT_SIZE(mu, NULL, DYNAMIC_TYPE_ECC); - return err; } @@ -2993,9 +3163,25 @@ #ifndef WC_NO_CACHE_RESISTANT /* First bit always 1 (fix at end) and swap equals first bit */ int swap = 1; +#ifdef WOLFSSL_SMALL_STACK + mp_int* tmp = NULL; +#else + mp_int tmp[1]; +#endif #endif int infinity; +#ifndef WC_NO_CACHE_RESISTANT +#ifdef WOLFSSL_SMALL_STACK + tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC); + if (tmp == NULL) { + err = MEMORY_E; + } +#endif + if (err == MP_OKAY) + err = mp_init(tmp); +#endif + /* Step 1: R[0] = P; R[1] = P */ /* R[0] = P */ if (err == MP_OKAY) @@ -3015,9 +3201,9 @@ /* Randomize z ordinates to obfuscate timing. */ if ((err == MP_OKAY) && (rng != NULL)) - err = wc_ecc_gen_z(rng, bytes, R[0], modulus, mp, R[2]->x, R[2]->y); + err = wc_ecc_gen_z(rng, bytes, R[0], modulus, mp, R[2]->x, R[2]->y, kt); if ((err == MP_OKAY) && (rng != NULL)) - err = wc_ecc_gen_z(rng, bytes, R[1], modulus, mp, R[2]->x, R[2]->y); + err = wc_ecc_gen_z(rng, bytes, R[1], modulus, mp, R[2]->x, R[2]->y, kt); if (err == MP_OKAY) { /* Order could be one greater than the size of the modulus. */ @@ -3050,12 +3236,18 @@ #else /* Swap R[0] and R[1] if other index is needed. */ swap ^= (int)b; - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, swap); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, swap); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, swap); + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used, swap, + tmp); + } + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used, swap, + tmp); + } + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used, swap, + tmp); + } swap = (int)b; if (err == MP_OKAY) @@ -3070,12 +3262,18 @@ #ifndef WC_NO_CACHE_RESISTANT /* Swap back if last bit is 0. */ swap ^= 1; - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, swap); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, swap); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, swap); + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used, swap, + tmp); + } + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used, swap, + tmp); + } + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used, swap, + tmp); + } #endif /* Step 5: b = k[0]; R[b] = R[b] - P */ @@ -3094,21 +3292,32 @@ &infinity); #else /* Swap R[0] and R[1], if necessary, to operate on the one we want. */ - err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, (int)b); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, (int)b); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, (int)b); + err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used, (int)b, + tmp); + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used, + (int)b, tmp); + } + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used, + (int)b, tmp); + } if (err == MP_OKAY) err = ecc_projective_add_point_safe(R[0], R[2], R[0], a, modulus, mp, &infinity); /* Swap back if necessary. */ - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->x, R[1]->x, (int)modulus->used, (int)b); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->y, R[1]->y, (int)modulus->used, (int)b); - if (err == MP_OKAY) - err = mp_cond_swap_ct(R[0]->z, R[1]->z, (int)modulus->used, (int)b); + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->x, R[1]->x, (int)modulus->used, + (int)b, tmp); + } + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->y, R[1]->y, (int)modulus->used, + (int)b, tmp); + } + if (err == MP_OKAY) { + err = mp_cond_swap_ct_ex(R[0]->z, R[1]->z, (int)modulus->used, + (int)b, tmp); + } #endif } @@ -3120,6 +3329,10 @@ if (err == MP_OKAY) err = mp_copy(R[0]->z, Q->z); +#if defined(WOLFSSL_SMALL_STACK) && !defined(WC_NO_CACHE_RESISTANT) + XFREE(tmp, NULL, DYNAMIC_TYPE_ECC); +#endif + return err; } @@ -3211,10 +3424,10 @@ /* Randomize z ordinates to obfuscate timing. */ if ((err == MP_OKAY) && (rng != NULL)) err = wc_ecc_gen_z(rng, bytes, R[0], modulus, mp, R[TMP_IDX]->x, - R[TMP_IDX]->y); + R[TMP_IDX]->y, kt); if ((err == MP_OKAY) && (rng != NULL)) err = wc_ecc_gen_z(rng, bytes, R[1], modulus, mp, R[TMP_IDX]->x, - R[TMP_IDX]->y); + R[TMP_IDX]->y, kt); if (err == MP_OKAY) { /* Order could be one greater than the size of the modulus. */ @@ -3375,12 +3588,12 @@ XMEMSET(key, 0, sizeof(*key)); #if defined(WOLFSSL_SP_MATH_ALL) && defined(WOLFSSL_SMALL_STACK) - NEW_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC); - NEW_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS_NONULLCHECK(key), heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS_NONULLCHECK(key), heap, DYNAMIC_TYPE_ECC); #ifdef ALT_ECC_SIZE - NEW_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC); - NEW_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC); - NEW_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS(key), heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS_NONULLCHECK(key), heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS_NONULLCHECK(key), heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS_NONULLCHECK(key), heap, DYNAMIC_TYPE_ECC); #endif if (key->t1 == NULL || key->t2 == NULL #ifdef ALT_ECC_SIZE @@ -3390,20 +3603,20 @@ err = MEMORY_E; } if (err == 0) { - err = INIT_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(key->t1, ECC_KEY_MAX_BITS_NONULLCHECK(key)); } if (err == 0) { - err = INIT_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(key->t2, ECC_KEY_MAX_BITS_NONULLCHECK(key)); } #ifdef ALT_ECC_SIZE if (err == 0) { - err = INIT_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(key->x, ECC_KEY_MAX_BITS_NONULLCHECK(key)); } if (err == 0) { - err = INIT_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(key->y, ECC_KEY_MAX_BITS_NONULLCHECK(key)); } if (err == 0) { - err = INIT_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(key->z, ECC_KEY_MAX_BITS_NONULLCHECK(key)); } #endif #else @@ -3595,6 +3808,11 @@ } #ifdef WOLFSSL_HAVE_SP_ECC +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) { + return sp_ecc_mulmod_sm2_256(k, G, R, map, heap); + } +#endif #ifndef WOLFSSL_SP_NO_256 if (mp_count_bits(modulus) == 256) { return sp_ecc_mulmod_256(k, G, R, map, heap); @@ -3708,6 +3926,7 @@ #endif /* k can't have more bits than order */ if (mp_count_bits(k) > mp_count_bits(order)) { + WOLFSSL_MSG("Private key length is greater than order in bits."); return ECC_OUT_OF_RANGE_E; } @@ -3795,6 +4014,11 @@ (void)rng; #ifdef WOLFSSL_HAVE_SP_ECC +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) { + return sp_ecc_mulmod_sm2_256(k, G, R, map, heap); + } +#endif #ifndef WOLFSSL_SP_NO_256 if (mp_count_bits(modulus) == 256) { return sp_ecc_mulmod_256(k, G, R, map, heap); @@ -3834,10 +4058,16 @@ int wc_ecc_mulmod(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, mp_int* modulus, int map) { + if ((k != NULL) && (R != NULL) && (mp_iszero(k))) { + mp_zero(R->x); + mp_zero(R->y); + mp_set(R->z, 1); + return MP_OKAY; + } return wc_ecc_mulmod_ex(k, G, R, a, modulus, map, NULL); } -#endif /* !WOLFSSL_ATECC508A */ +#endif /** * Allocate a new ECC point (if one not provided) @@ -3867,6 +4097,7 @@ #ifndef ALT_ECC_SIZE err = mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL); if (err != MP_OKAY) { + WOLFSSL_MSG("mp_init_multi failed."); #ifndef WOLFSSL_NO_MALLOC XFREE(p, heap, DYNAMIC_TYPE_ECC); #endif @@ -3884,13 +4115,15 @@ *point = p; (void)heap; return err; -} +} /* wc_ecc_new_point_ex */ + ecc_point* wc_ecc_new_point_h(void* heap) { ecc_point* p = NULL; (void)wc_ecc_new_point_ex(&p, heap); return p; } + ecc_point* wc_ecc_new_point(void) { ecc_point* p = NULL; @@ -4128,8 +4361,11 @@ if (param == NULL || curveParam == NULL) return BAD_FUNC_ARG; - if (encType == WC_TYPE_HEX_STR) - return XSTRNCMP(curveParam, (char*) param, paramSz); + if (encType == WC_TYPE_HEX_STR) { + if ((word32)XSTRLEN(curveParam) != paramSz) + return -1; + return (XSTRNCMP(curveParam, (char*) param, paramSz) == 0) ? 0 : -1; + } #ifdef WOLFSSL_SMALL_STACK a = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_ECC); @@ -4445,20 +4681,15 @@ #endif { err = wc_CryptoCb_Ecdh(private_key, public_key, out, outlen); - #ifndef WOLF_CRYPTO_CB_ONLY_ECC - if (err != CRYPTOCB_UNAVAILABLE) + if (err != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return err; /* fall-through when unavailable */ - #endif - #ifdef WOLF_CRYPTO_CB_ONLY_ECC - if (err == CRYPTOCB_UNAVAILABLE) { - err = NO_VALID_DEVID; - } - #endif } #endif -#ifndef WOLF_CRYPTO_CB_ONLY_ECC +#ifdef WOLF_CRYPTO_CB_ONLY_ECC + return NO_VALID_DEVID; +#else /* !WOLF_CRYPTO_CB_ONLY_ECC */ /* type valid? */ if (private_key->type != ECC_PRIVATEKEY && private_key->type != ECC_PRIVATEKEY_ONLY) { @@ -4507,7 +4738,7 @@ #else err = wc_ecc_shared_secret_ex(private_key, &public_key->pubkey, out, outlen); #endif /* WOLFSSL_ATECC508A */ -#endif /* WOLF_CRYPTO_CB_ONLY_ECC */ +#endif /* !WOLF_CRYPTO_CB_ONLY_ECC */ return err; } @@ -4521,7 +4752,7 @@ byte* out, word32* outlen) { int err = MP_OKAY; - mp_int* k = private_key->k; + mp_int* k = ecc_get_k(private_key); #ifdef HAVE_ECC_CDH #ifdef WOLFSSL_SMALL_STACK mp_int *k_lcl = NULL; @@ -4551,7 +4782,7 @@ goto errout; } /* multiply cofactor times private key "k" */ - err = mp_mul_d(private_key->k, cofactor, k); + err = mp_mul_d(ecc_get_k(private_key), cofactor, k); if (err != MP_OKAY) goto errout; } @@ -4586,6 +4817,14 @@ } else #endif /* ! WOLFSSL_SP_NO_256 */ +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (private_key->idx != ECC_CUSTOM_IDX && + ecc_sets[private_key->idx].id == ECC_SM2P256V1) { + err = sp_ecc_secret_gen_sm2_256(k, point, out, outlen, + private_key->heap); + } + else +#endif #ifdef WOLFSSL_SP_384 if (private_key->idx != ECC_CUSTOM_IDX && ecc_sets[private_key->idx].id == ECC_SECP384R1) { @@ -4784,7 +5023,8 @@ word32 keySz = private_key->dp->size; /* sync public key x/y */ - err = wc_mp_to_bigint_sz(private_key->k, &private_key->k->raw, keySz); + err = wc_mp_to_bigint_sz(ecc_get_k(private_key), + &ecc_get_k(private_key)->raw, keySz); if (err == MP_OKAY) err = wc_mp_to_bigint_sz(point->x, &point->x->raw, keySz); if (err == MP_OKAY) @@ -4798,7 +5038,7 @@ NitroxEccGetSize(private_key)*2); if (err == MP_OKAY) err = NitroxEcdh(private_key, - &private_key->k->raw, &point->x->raw, &point->y->raw, + &ecc_get_k(private_key)->raw, &point->x->raw, &point->y->raw, private_key->e->raw.buf, &private_key->e->raw.len, &curve->prime->raw); #else @@ -4806,7 +5046,7 @@ err = wc_ecc_curve_load(private_key->dp, &curve, ECC_CURVE_FIELD_BF); if (err == MP_OKAY) err = IntelQaEcdh(&private_key->asyncDev, - &private_key->k->raw, &point->x->raw, &point->y->raw, + &ecc_get_k(private_key)->raw, &point->x->raw, &point->y->raw, out, outlen, &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw, private_key->dp->cofactor); @@ -4829,7 +5069,7 @@ err = wc_ecc_shared_secret_gen_sync(private_key, point, out, outlen); } - if (err == WC_PENDING_E) { + if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) { private_key->state++; } @@ -4886,11 +5126,6 @@ if (private_key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) { err = wc_ecc_shared_secret_gen_async(private_key, point, out, outlen); - if (err == 0) { - /* exit early */ - RESTORE_VECTOR_REGISTERS(); - return err; - } } else #endif @@ -4927,7 +5162,7 @@ RESTORE_VECTOR_REGISTERS(); /* if async pending then return and skip done cleanup below */ - if (err == WC_PENDING_E) { + if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) { return err; } @@ -4949,11 +5184,33 @@ err = wc_ecc_init_ex(&public_key, private_key->heap, INVALID_DEVID); if (err == MP_OKAY) { + #if FIPS_VERSION3_GE(6,0,0) + /* Since we are allowing a pass-through of ecc_make_key_ex_fips when + * both keysize == 0 and curve_id == 0 ensure we select an appropriate + * keysize here when relying on default selection */ + if (private_key->dp->size < WC_ECC_FIPS_GEN_MIN) { + if (private_key->dp->size == 0 && + (private_key->dp->id == ECC_SECP256R1 || + private_key->dp->id == ECC_SECP224R1 || + private_key->dp->id == ECC_SECP384R1 || + private_key->dp->id == ECC_SECP521R1)) { + WOLFSSL_MSG("ECC dp->size zero but dp->id sufficient for FIPS"); + err = 0; + } else { + WOLFSSL_MSG("ECC curve too small for FIPS mode"); + err = ECC_CURVE_OID_E; + } + } + if (err == 0) { /* FIPS specific check */ + #endif err = wc_ecc_set_curve(&public_key, private_key->dp->size, private_key->dp->id); if (err == MP_OKAY) { err = mp_copy(point->x, public_key.pubkey.x); } + #if FIPS_VERSION3_GE(6,0,0) + } /* end FIPS specific check */ + #endif if (err == MP_OKAY) { err = mp_copy(point->y, public_key.pubkey.y); } @@ -5007,7 +5264,9 @@ #endif /* USE_ECC_B_PARAM */ #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ - !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) + !defined(WOLFSSL_CRYPTOCELL) && \ + (!defined(WOLF_CRYPTO_CB_ONLY_ECC) || defined(WOLFSSL_QNX_CAAM) || \ + defined(WOLFSSL_IMXRT1170_CAAM)) /* return 1 if point is at infinity, 0 if not, < 0 on error */ int wc_ecc_point_is_at_infinity(ecc_point* p) { @@ -5018,12 +5277,13 @@ return 0; } -#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL */ +#endif /* generate random and ensure its greater than 0 and less than order */ int wc_ecc_gen_k(WC_RNG* rng, int size, mp_int* k, mp_int* order) { #ifndef WC_NO_RNG +#ifndef WOLFSSL_ECC_GEN_REJECT_SAMPLING int err; byte buf[ECC_MAXSIZE_GEN]; @@ -5066,6 +5326,54 @@ return err; #else + int err; + byte buf[ECC_MAXSIZE_GEN]; + int bits; + + if ((rng == NULL) || (size < 0) || (size + 8 > ECC_MAXSIZE_GEN) || + (k == NULL) || (order == NULL)) { + return BAD_FUNC_ARG; + } + + /* Get actual bit count of order. */ + bits = mp_count_bits(order); + size = (bits + 7) >> 3; + + /* generate number in range of order through rejection sampling. */ + /* see section A.2.2 and A.4.2 in FIPS 186-5 */ + do { + /* A.2.2 step 3: make up random string */ + err = wc_RNG_GenerateBlock(rng, buf, (word32)size); + #ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Add("wc_ecc_gen_k buf", buf, size); + #endif + /* Generated multiple of 8 bits but now make it size of order. */ + if ((bits & 0x7) > 0) { + buf[0] &= (1 << (bits & 0x7)) - 1; + } + + /* A.2.2 step 4: convert to integer. */ + /* A.4.2 step 3: Convert the bit string to integer x. */ + if (err == 0) { + err = mp_read_unsigned_bin(k, buf, (word32)size); + } + + /* A.4.2 step 4, 5: x must be in range [1, n-1] */ + if ((err == MP_OKAY) && !mp_iszero(k) && + (mp_cmp_ct(k, order, order->used) == MP_LT)) { + break; + } + } + while (err == MP_OKAY); + + ForceZero(buf, ECC_MAXSIZE_GEN); +#ifdef WOLFSSL_CHECK_MEM_ZERO + wc_MemZero_Check(buf, ECC_MAXSIZE_GEN); +#endif + + return err; +#endif +#else (void)rng; (void)size; (void)k; @@ -5123,9 +5431,9 @@ key->type = ECC_PRIVATEKEY_ONLY; } - if ((err == MP_OKAY) && (mp_iszero(key->k) || mp_isneg(key->k) || - (mp_cmp(key->k, curve->order) != MP_LT))) - { + if ((err == MP_OKAY) && (mp_iszero(ecc_get_k(key)) || + mp_isneg(ecc_get_k(key)) || + (mp_cmp(ecc_get_k(key), curve->order) != MP_LT))) { err = ECC_PRIV_KEY_E; } @@ -5147,10 +5455,10 @@ if (err == MP_OKAY && key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) { word32 keySz = key->dp->size; /* sync private key to raw */ - err = wc_mp_to_bigint_sz(key->k, &key->k->raw, keySz); + err = wc_mp_to_bigint_sz(ecc_get_k(key), &ecc_get_k(key)->raw, keySz); if (err == MP_OKAY) { err = IntelQaEccPointMul(&key->asyncDev, - &key->k->raw, pub->x, pub->y, pub->z, + &ecc_get_k(key)->raw, pub->x, pub->y, pub->z, &curve->Gx->raw, &curve->Gy->raw, &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw, key->dp->cofactor); @@ -5166,19 +5474,25 @@ else #ifndef WOLFSSL_SP_NO_256 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) { - err = sp_ecc_mulmod_base_256(key->k, pub, 1, key->heap); + err = sp_ecc_mulmod_base_256(ecc_get_k(key), pub, 1, key->heap); + } + else +#endif /* WOLFSSL_SP_NO_256 */ +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) { + err = sp_ecc_mulmod_base_sm2_256(ecc_get_k(key), pub, 1, key->heap); } else #endif #ifdef WOLFSSL_SP_384 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) { - err = sp_ecc_mulmod_base_384(key->k, pub, 1, key->heap); + err = sp_ecc_mulmod_base_384(ecc_get_k(key), pub, 1, key->heap); } else #endif #ifdef WOLFSSL_SP_521 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) { - err = sp_ecc_mulmod_base_521(key->k, pub, 1, key->heap); + err = sp_ecc_mulmod_base_521(ecc_get_k(key), pub, 1, key->heap); } else #endif @@ -5210,8 +5524,8 @@ /* make the public key */ if (err == MP_OKAY) { /* Map in a separate call as this should be constant time */ - err = wc_ecc_mulmod_ex2(key->k, base, pub, curve->Af, curve->prime, - curve->order, rng, 0, key->heap); + err = wc_ecc_mulmod_ex2(ecc_get_k(key), base, pub, curve->Af, + curve->prime, curve->order, rng, 0, key->heap); if (err == MP_MEM) { err = MEMORY_E; } @@ -5333,11 +5647,30 @@ /* make sure required variables are reset */ wc_ecc_reset(key); + #if FIPS_VERSION3_GE(6,0,0) + /* Since we are allowing a pass-through of ecc_make_key_ex_fips when + * both keysize == 0 and curve_id == 0 ensure we select an appropriate + * keysize here when relying on default selection */ + if (keysize < WC_ECC_FIPS_GEN_MIN) { + if (keysize == 0 && (curve_id == ECC_SECP256R1 || + curve_id == ECC_SECP224R1 || curve_id == ECC_SECP384R1 || + curve_id == ECC_SECP521R1)) { + WOLFSSL_MSG("ECC keysize zero but curve_id sufficient for FIPS"); + err = 0; + } else { + WOLFSSL_MSG("ECC curve too small for FIPS mode"); + err = ECC_CURVE_OID_E; + } + } + if (err == 0) { /* FIPS specific check */ + #endif err = wc_ecc_set_curve(key, keysize, curve_id); if (err != 0) { return err; } - + #if FIPS_VERSION3_GE(6,0,0) + } /* end FIPS specific check */ + #endif key->flags = (byte)flags; #ifdef WOLF_CRYPTO_CB @@ -5346,28 +5679,22 @@ #endif { err = wc_CryptoCb_MakeEccKey(rng, keysize, key, curve_id); - #ifndef WOLF_CRYPTO_CB_ONLY_ECC - if (err != CRYPTOCB_UNAVAILABLE) + if (err != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return err; /* fall-through when unavailable */ - #endif - #ifdef WOLF_CRYPTO_CB_ONLY_ECC - if (err == CRYPTOCB_UNAVAILABLE) { - return NO_VALID_DEVID; - } - return err; - #endif } #endif -#ifndef WOLF_CRYPTO_CB_ONLY_ECC +#ifdef WOLF_CRYPTO_CB_ONLY_ECC + return NO_VALID_DEVID; +#else /* !WOLF_CRYPTO_CB_ONLY_ECC */ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) { #ifdef HAVE_CAVIUM /* TODO: Not implemented */ #elif defined(HAVE_INTEL_QA) /* Implemented in ecc_make_pub_ex for the pub calc */ - #else + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_MAKE)) { WC_ASYNC_SW* sw = &key->asyncDev.sw; sw->eccMake.rng = rng; @@ -5453,6 +5780,11 @@ if (err == SA_SILIB_RET_OK) { err = mp_read_unsigned_bin(key->k, ucompressed_key, raw_size); +#ifdef WOLFSSL_ECC_BLIND_K + if (err == MP_OKAY) { + err = ecc_blind_k_rng(key, rng); + } +#endif } #elif defined(WOLFSSL_SILABS_SE_ACCEL) @@ -5475,7 +5807,7 @@ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), key->dp->size); - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(key->keyRaw), + WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw), 2 * key->dp->size); err = XSecure_EllipticGenerateKey(&(key->xSec.cinst), @@ -5487,7 +5819,7 @@ err = WC_HW_E; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(key->keyRaw), + WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->keyRaw), 2 * key->dp->size); #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN @@ -5504,7 +5836,12 @@ err = xil_mpi_import(key->pubkey.y, key->keyRaw + key->dp->size, key->dp->size, key->heap); if (err == 0) - err = xil_mpi_import(key->k, key->privKey, key->dp->size, key->heap); + err = xil_mpi_import(key->k, key->privKey, key->dp->size, + key->heap); +#ifdef WOLFSSL_ECC_BLIND_K + if (err == 0) + err = ecc_blind_k_rng(key, rng); +#endif if (err == 0) err = mp_set(key->pubkey.z, 1); if (err) { @@ -5546,6 +5883,15 @@ } else #endif /* !WOLFSSL_SP_NO_256 */ +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) { + err = sp_ecc_make_key_sm2_256(rng, key->k, &key->pubkey, key->heap); + if (err == MP_OKAY) { + key->type = ECC_PRIVATEKEY; + } + } + else +#endif #ifdef WOLFSSL_SP_384 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) { #ifndef WC_ECC_NONBLOCK @@ -5612,6 +5958,7 @@ #ifndef ALT_ECC_SIZE err = mp_init(key->k); #else + err = 0; key->k = (mp_int*)key->ka; alt_fp_init(key->k); #endif @@ -5619,19 +5966,32 @@ /* load curve info */ if (err == MP_OKAY) { ALLOC_CURVE_SPECS(ECC_CURVE_FIELD_COUNT, err); + if (err != MP_OKAY) { + WOLFSSL_MSG("ALLOC_CURVE_SPECS failed"); + } } + if (err == MP_OKAY) { err = wc_ecc_curve_load(key->dp, &curve, ECC_CURVE_FIELD_ALL); + if (err != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_curve_load failed"); + } } /* generate k */ if (err == MP_OKAY) { err = wc_ecc_gen_k(rng, key->dp->size, key->k, curve->order); + if (err != MP_OKAY) { + WOLFSSL_MSG("wc_ecc_gen_k failed"); + } } /* generate public key from k */ if (err == MP_OKAY) { err = ecc_make_pub_ex(key, curve, NULL, rng); + if (err != MP_OKAY) { + WOLFSSL_MSG("ecc_make_pub_ex failed"); + } } if (err == MP_OKAY @@ -5663,10 +6023,15 @@ err = wc_mp_to_bigint(key->pubkey.z, &key->pubkey.z->raw); #endif +#ifdef WOLFSSL_ECC_BLIND_K + if (err == MP_OKAY) + err = ecc_blind_k_rng(key, rng); +#endif + #endif /* HAVE_ECC_MAKE_PUB */ return err; -#endif /* WOLF_CRYPTO_CB_ONLY_ECC */ +#endif /* !WOLF_CRYPTO_CB_ONLY_ECC */ } @@ -5818,20 +6183,11 @@ int wc_ecc_init_ex(ecc_key* key, void* heap, int devId) { int ret = 0; -#if defined(HAVE_PKCS11) - int isPkcs11 = 0; -#endif if (key == NULL) { return BAD_FUNC_ARG; } -#if defined(HAVE_PKCS11) - if (key->isPkcs11) { - isPkcs11 = 1; - } -#endif - #ifdef ECC_DUMP_OID wc_ecc_dump_oids(); #endif @@ -5859,13 +6215,27 @@ alt_fp_init(key->pubkey.z); key->k = (mp_int*)key->ka; alt_fp_init(key->k); +#ifdef WOLFSSL_ECC_BLIND_K + key->kb = (mp_int*)key->kba; + key->ku = (mp_int*)key->kia; + alt_fp_init(key->kb); + alt_fp_init(key->ku); +#endif #else ret = mp_init_multi(key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z, - NULL, NULL); +#ifndef WOLFSSL_ECC_BLIND_K + NULL, NULL +#else + key->kb, key->ku +#endif + ); if (ret != MP_OKAY) { return MEMORY_E; } #endif /* ALT_ECC_SIZE */ +#ifdef WOLFSSL_ECC_BLIND_K + mp_forcezero(key->kb); +#endif #endif /* WOLFSSL_ATECC508A */ #if (defined(WOLFSSL_ECDSA_SET_K) || defined(WOLFSSL_ECDSA_SET_K_ONE_LOOP) || \ defined(WOLFSSL_ECDSA_DETERMINISTIC_K) || \ @@ -5878,22 +6248,24 @@ #endif #ifdef WOLFSSL_HEAP_TEST + (void)heap; key->heap = (void*)WOLFSSL_HEAP_TEST; #else key->heap = heap; #endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) - #if defined(HAVE_PKCS11) - if (!isPkcs11) + #ifdef WOLF_CRYPTO_CB + /* prefer crypto callback */ + if (key->devId != INVALID_DEVID) #endif - { - /* handle as async */ - ret = wolfAsync_DevCtxInit(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC, - key->heap, devId); - } -#elif defined(HAVE_PKCS11) - (void)isPkcs11; + { + /* handle as async */ + ret = wolfAsync_DevCtxInit(&key->asyncDev, WOLFSSL_ASYNC_MARKER_ECC, + key->heap, devId); + } + if (ret != 0) + return ret; #endif #if defined(WOLFSSL_DSP) @@ -5907,6 +6279,10 @@ #ifdef WOLFSSL_CHECK_MEM_ZERO mp_memzero_add("ECC k", key->k); +#ifdef WOLFSSL_ECC_BLIND_K + mp_memzero_add("ECC kb", key->kb); + mp_memzero_add("ECC ku", key->ku); +#endif #endif #if defined(WOLFSSL_XILINX_CRYPT_VERSAL) @@ -5945,12 +6321,6 @@ ret = BAD_FUNC_ARG; if (ret == 0 && (len < 0 || len > ECC_MAX_ID_LEN)) ret = BUFFER_E; - -#if defined(HAVE_PKCS11) - XMEMSET(key, 0, sizeof(ecc_key)); - key->isPkcs11 = 1; -#endif - if (ret == 0) ret = wc_ecc_init_ex(key, heap, devId); if (ret == 0 && id != NULL && len != 0) { @@ -5980,12 +6350,6 @@ if (labelLen == 0 || labelLen > ECC_MAX_LABEL_LEN) ret = BUFFER_E; } - -#if defined(HAVE_PKCS11) - XMEMSET(key, 0, sizeof(ecc_key)); - key->isPkcs11 = 1; -#endif - if (ret == 0) ret = wc_ecc_init_ex(key, heap, devId); if (ret == 0) { @@ -6186,7 +6550,7 @@ WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(key->privKey), keysize); WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(K), keysize); - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(out), keysize * 2); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(out), keysize * 2); err = XSecure_EllipticGenerateSign(&(key->xSec.cinst), xil_curve_type[key->dp->id], @@ -6199,7 +6563,7 @@ err = WC_HW_E; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(XIL_CAST_U64(out), keysize * 2); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE(XIL_CAST_U64(out), keysize * 2); mp_reverse(&out[0], keysize); mp_reverse(&out[keysize], keysize); @@ -6327,7 +6691,7 @@ } /* if async pending then return and skip done cleanup below */ - if (err == WC_PENDING_E) { + if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) { key->state++; return err; } @@ -6369,20 +6733,20 @@ #endif { err = wc_CryptoCb_EccSign(in, inlen, out, outlen, rng, key); - #ifndef WOLF_CRYPTO_CB_ONLY_ECC - if (err != CRYPTOCB_UNAVAILABLE) + if (err != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return err; /* fall-through when unavailable */ - #endif - #ifdef WOLF_CRYPTO_CB_ONLY_ECC - if (err == CRYPTOCB_UNAVAILABLE) { - err = NO_VALID_DEVID; - } - #endif } #endif -#ifndef WOLF_CRYPTO_CB_ONLY_ECC +#ifdef WOLF_CRYPTO_CB_ONLY_ECC + (void)rng; + (void)inlen; + (void)s; + (void)r; + (void)err; + return NO_VALID_DEVID; +#else /* !WOLF_CRYPTO_CB_ONLY_ECC */ if (rng == NULL) { WOLFSSL_MSG("ECC sign RNG missing"); return ECC_BAD_ARG_E; @@ -6393,12 +6757,12 @@ err = wc_ecc_sign_hash_async(in, inlen, out, outlen, rng, key); #else - NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (r == NULL) return MEMORY_E; #endif - NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (s == NULL) { FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); @@ -6406,13 +6770,13 @@ } #endif - err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS_NONULLCHECK(key)); if (err != 0) { FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC); FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); return err; } - err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS_NONULLCHECK(key)); if (err != 0) { FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC); FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); @@ -6446,15 +6810,8 @@ FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC); FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); #endif /* WOLFSSL_ASYNC_CRYPT */ -#else - (void)rng; - (void)inlen; - (void)s; - (void)r; - (void)err; -#endif /* WOLF_CRYPTO_CB_ONLY_ECC */ - return err; +#endif /* !WOLF_CRYPTO_CB_ONLY_ECC */ } #endif /* !NO_ASN */ @@ -6486,7 +6843,7 @@ /* currently limiting to SHA256 for auto create */ if (mp_init(key->sign_k) != MP_OKAY || wc_ecc_gen_deterministic_k(in, inlen, - WC_HASH_TYPE_SHA256, key->k, key->sign_k, + WC_HASH_TYPE_SHA256, ecc_get_k(key), key->sign_k, curve->order, key->heap) != 0) { mp_free(key->sign_k); XFREE(key->sign_k, key->heap, DYNAMIC_TYPE_ECC); @@ -6505,8 +6862,8 @@ #else key->sign_k_set = 0; /* currently limiting to SHA256 for auto create */ - if (wc_ecc_gen_deterministic_k(in, inlen, WC_HASH_TYPE_SHA256, key->k, - key->sign_k, curve->order, key->heap) != 0) { + if (wc_ecc_gen_deterministic_k(in, inlen, WC_HASH_TYPE_SHA256, + ecc_get_k(key), key->sign_k, curve->order, key->heap) != 0) { err = ECC_PRIV_KEY_E; } else { @@ -6537,16 +6894,16 @@ { int err = MP_OKAY; int loop_check = 0; - DECL_MP_INT_SIZE_DYN(b, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE); + DECL_MP_INT_SIZE_DYN(b, ECC_KEY_MAX_BITS_NONULLCHECK(key), MAX_ECC_BITS_USE); - NEW_MP_INT_SIZE(b, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(b, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (b == NULL) err = MEMORY_E; #endif if (err == MP_OKAY) { - err = INIT_MP_INT_SIZE(b, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(b, ECC_KEY_MAX_BITS_NONULLCHECK(key)); } #ifdef WOLFSSL_CUSTOM_CURVES @@ -6566,7 +6923,7 @@ err = wc_ecc_gen_k(rng, key->dp->size, b, curve->order); } - while (err == MP_ZERO_E); + while (err == WC_NO_ERR_TRACE(MP_ZERO_E)); loop_check = 0; } #ifdef WOLFSSL_CHECK_MEM_ZERO @@ -6644,15 +7001,18 @@ if (err != MP_OKAY) break; if (mp_iszero(r) == MP_NO) { - mp_int* ep = pubkey->k; - mp_int* kp = pubkey->k; - mp_int* x = key->k; + mp_int* kp = ecc_get_k(pubkey); + mp_int* ep = kp; + mp_int* x = ecc_get_k(key); + + /* Blind after getting. */ + ecc_blind_k(key, b); /* find s = (e + xr)/k = b.(e/k.b + x.r/k.b) */ /* k' = k.b */ - err = mp_mulmod(pubkey->k, b, curve->order, kp); + err = mp_mulmod(kp, b, curve->order, kp); if (err != MP_OKAY) break; /* k' = 1/k.b @@ -6731,12 +7091,12 @@ #endif if (key->nb_ctx) { return sp_ecc_sign_256_nb(&key->nb_ctx->sp_ctx, in, inlen, rng, - key->k, r, s, sign_k, key->heap); + ecc_get_k(key), r, s, sign_k, key->heap); } #ifdef WC_ECC_NONBLOCK_ONLY do { /* perform blocking call to non-blocking function */ err = sp_ecc_sign_256_nb(&nb_ctx.sp_ctx, in, inlen, rng, - key->k, r, s, sign_k, key->heap); + ecc_get_k(key), r, s, sign_k, key->heap); } while (err == FP_WOULDBLOCK); return err; #endif @@ -6745,14 +7105,24 @@ { int ret; SAVE_VECTOR_REGISTERS(return _svr_ret;); - ret = sp_ecc_sign_256(in, inlen, rng, key->k, r, s, sign_k, - key->heap); + ret = sp_ecc_sign_256(in, inlen, rng, ecc_get_k(key), r, s, + sign_k, key->heap); RESTORE_VECTOR_REGISTERS(); return ret; } #endif } #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (ecc_sets[key->idx].id == ECC_SM2P256V1) { + int ret; + SAVE_VECTOR_REGISTERS(return _svr_ret;); + ret = sp_ecc_sign_sm2_256(in, inlen, rng, ecc_get_k(key), r, s, + sign_k, key->heap); + RESTORE_VECTOR_REGISTERS(); + return ret; + } + #endif #ifdef WOLFSSL_SP_384 if (ecc_sets[key->idx].id == ECC_SECP384R1) { #ifdef WC_ECC_NONBLOCK @@ -6761,12 +7131,12 @@ #endif if (key->nb_ctx) { return sp_ecc_sign_384_nb(&key->nb_ctx->sp_ctx, in, inlen, rng, - key->k, r, s, sign_k, key->heap); + ecc_get_k(key), r, s, sign_k, key->heap); } #ifdef WC_ECC_NONBLOCK_ONLY do { /* perform blocking call to non-blocking function */ err = sp_ecc_sign_384_nb(&nb_ctx.sp_ctx, in, inlen, rng, - key->k, r, s, sign_k, key->heap); + ecc_get_k(key), r, s, sign_k, key->heap); } while (err == FP_WOULDBLOCK); return err; #endif @@ -6775,8 +7145,8 @@ { int ret; SAVE_VECTOR_REGISTERS(return _svr_ret;); - ret = sp_ecc_sign_384(in, inlen, rng, key->k, r, s, sign_k, - key->heap); + ret = sp_ecc_sign_384(in, inlen, rng, ecc_get_k(key), r, s, + sign_k, key->heap); RESTORE_VECTOR_REGISTERS(); return ret; } @@ -6791,12 +7161,12 @@ #endif if (key->nb_ctx) { return sp_ecc_sign_521_nb(&key->nb_ctx->sp_ctx, in, inlen, rng, - key->k, r, s, sign_k, key->heap); + ecc_get_k(key), r, s, sign_k, key->heap); } #ifdef WC_ECC_NONBLOCK_ONLY do { /* perform blocking call to non-blocking function */ err = sp_ecc_sign_521_nb(&nb_ctx.sp_ctx, in, inlen, rng, - key->k, r, s, sign_k, key->heap); + ecc_get_k(key), r, s, sign_k, key->heap); } while (err == FP_WOULDBLOCK); return err; #endif @@ -6805,8 +7175,8 @@ { int ret; SAVE_VECTOR_REGISTERS(return _svr_ret;); - ret = sp_ecc_sign_521(in, inlen, rng, key->k, r, s, sign_k, - key->heap); + ret = sp_ecc_sign_521(in, inlen, rng, ecc_get_k(key), r, s, + sign_k, key->heap); RESTORE_VECTOR_REGISTERS(); return ret; } @@ -6870,6 +7240,9 @@ #ifndef WOLFSSL_SP_NO_256 && ecc_sets[key->idx].id != ECC_SECP256R1 #endif + #ifdef WOLFSSL_SP_SM2 + && ecc_sets[key->idx].id != ECC_SM2P256V1 + #endif #ifdef WOLFSSL_SP_384 && ecc_sets[key->idx].id != ECC_SECP384R1 #endif @@ -6894,7 +7267,7 @@ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) && \ - defined(WOLFSSL_ASYNC_CRYPT_SW) + defined(WOLFSSL_ASYNC_CRYPT_SW) if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_ECC) { if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_ECC_SIGN)) { WC_ASYNC_SW* sw = &key->asyncDev.sw; @@ -6911,7 +7284,7 @@ #if defined(WOLFSSL_HAVE_SP_ECC) err = ecc_sign_hash_sp(in, inlen, rng, key, r, s); - if (err != WC_KEY_SIZE_E) { + if (err != WC_NO_ERR_TRACE(WC_KEY_SIZE_E)) { return err; } #else @@ -6927,7 +7300,7 @@ } e = key->e; #else - NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (e_lcl == NULL) { return MEMORY_E; @@ -6938,7 +7311,7 @@ /* get the hash and load it as a bignum into 'e' */ /* init the bignums */ - if ((err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS(key))) != MP_OKAY) { + if ((err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS_NONULLCHECK(key))) != MP_OKAY) { FREE_MP_INT_SIZE(e_lcl, key->heap, DYNAMIC_TYPE_ECC); return err; } @@ -7026,7 +7399,8 @@ if (err == MP_OKAY) err = wc_mp_to_bigint_sz(e, &e->raw, keySz); if (err == MP_OKAY) - err = wc_mp_to_bigint_sz(key->k, &key->k->raw, keySz); + err = wc_mp_to_bigint_sz(ecc_get_k(key), &ecc_get_k(key)->raw, + keySz); if (err == MP_OKAY) err = wc_ecc_gen_k(rng, key->dp->size, k, curve->order); if (err == MP_OKAY) @@ -7034,14 +7408,15 @@ #ifdef HAVE_CAVIUM_V if (err == MP_OKAY) - err = NitroxEcdsaSign(key, &e->raw, &key->k->raw, &k->raw, - &r->raw, &s->raw, &curve->prime->raw, &curve->order->raw); + err = NitroxEcdsaSign(key, &e->raw, &ecc_get_k(key)->raw, + &k->raw, &r->raw, &s->raw, &curve->prime->raw, + &curve->order->raw); #else if (err == MP_OKAY) - err = IntelQaEcdsaSign(&key->asyncDev, &e->raw, &key->k->raw, - &k->raw, &r->raw, &s->raw, &curve->Af->raw, &curve->Bf->raw, - &curve->prime->raw, &curve->order->raw, &curve->Gx->raw, - &curve->Gy->raw); + err = IntelQaEcdsaSign(&key->asyncDev, &e->raw, + &ecc_get_k(key)->raw, &k->raw, &r->raw, &s->raw, + &curve->Af->raw, &curve->Bf->raw, &curve->prime->raw, + &curve->order->raw, &curve->Gx->raw, &curve->Gy->raw); #endif #ifndef HAVE_CAVIUM_V @@ -7068,10 +7443,10 @@ pubkey = (ecc_key*)XMALLOC(sizeof(ecc_key), key->heap, DYNAMIC_TYPE_ECC); if (pubkey == NULL) err = MEMORY_E; + else #endif - + { /* don't use async for key, since we don't support async return here */ - if (err == MP_OKAY) { err = wc_ecc_init_ex(pubkey, key->heap, INVALID_DEVID); if (err == MP_OKAY) { err = ecc_sign_hash_sw(key, pubkey, rng, curve, e, r, s); @@ -7539,7 +7914,20 @@ mp_clear(key->pubkey.y); mp_clear(key->pubkey.z); - mp_forcezero(key->k); +#ifdef ALT_ECC_SIZE + if (key->k) +#endif + mp_forcezero(key->k); +#ifdef WOLFSSL_ECC_BLIND_K +#ifdef ALT_ECC_SIZE + if (key->kb) +#endif + mp_forcezero(key->kb); +#ifdef ALT_ECC_SIZE + if (key->ku) +#endif + mp_forcezero(key->ku); +#endif #ifdef WOLFSSL_CUSTOM_CURVES if (key->deallocSet && key->dp != NULL) @@ -7555,7 +7943,9 @@ #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SP_MATH) && \ - !defined(WOLF_CRYPTO_CB_ONLY_ECC) + (!defined(WOLF_CRYPTO_CB_ONLY_ECC) || defined(WOLFSSL_QNX_CAAM) || \ + defined(WOLFSSL_IMXRT1170_CAAM)) + /* Handles add failure cases: * * Before add: @@ -7658,12 +8048,22 @@ } else { err = _ecc_projective_dbl_point(P, R, a, modulus, mp); + if ((err == MP_OKAY) && mp_iszero(R->z)) { + err = mp_set(R->x, 0); + if (err == MP_OKAY) + err = mp_set(R->y, 0); + if (err == MP_OKAY) + err = mp_set(R->z, 1); + } } return err; } -#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A - && !WOLFSSL_CRYPTOCELL && !WOLFSSL_SP_MATH */ +#endif /* !(WOLFSSL_ATECC508A) && !(WOLFSSL_ATECC608A) && \ + !(WOLFSSL_CRYPTOCELL) && !(WOLFSSL_SP_MATH) && \ + (!(WOLF_CRYPTO_CB_ONLY_ECC) || (WOLFSSL_QNX_CAAM) || \ + (WOLFSSL_IMXRT1170_CAAM)) + */ #if !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_ATECC508A) && \ !defined(WOLFSSL_ATECC608A) && !defined(WOLFSSL_CRYPTOCELL) && \ @@ -8072,21 +8472,20 @@ #endif { err = wc_CryptoCb_EccVerify(sig, siglen, hash, hashlen, res, key); - #ifndef WOLF_CRYPTO_CB_ONLY_ECC - if (err != CRYPTOCB_UNAVAILABLE) + if (err != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return err; /* fall-through when unavailable */ - #endif - #ifdef WOLF_CRYPTO_CB_ONLY_ECC - if (err == CRYPTOCB_UNAVAILABLE) { - err = NO_VALID_DEVID; - } - #endif } #endif -#ifndef WOLF_CRYPTO_CB_ONLY_ECC - +#ifdef WOLF_CRYPTO_CB_ONLY_ECC + (void)siglen; + (void)hashlen; + (void)s; + (void)r; + (void)err; + return NO_VALID_DEVID; +#else /* !WOLF_CRYPTO_CB_ONLY_ECC */ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_ECC) err = wc_ecc_alloc_async(key); if (err != 0) @@ -8094,25 +8493,25 @@ r = key->r; s = key->s; #else - NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(r, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (r == NULL) return MEMORY_E; #endif - NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(s, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (s == NULL) { FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); return MEMORY_E; } #endif - err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(r, ECC_KEY_MAX_BITS_NONULLCHECK(key)); if (err != 0) { FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC); FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); return err; } - err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(s, ECC_KEY_MAX_BITS_NONULLCHECK(key)); if (err != 0) { FREE_MP_INT_SIZE(s, key->heap, DYNAMIC_TYPE_ECC); FREE_MP_INT_SIZE(r, key->heap, DYNAMIC_TYPE_ECC); @@ -8181,7 +8580,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* if async pending then return and skip done cleanup below */ - if (err == WC_PENDING_E) { + if (err == WC_NO_ERR_TRACE(WC_PENDING_E)) { if (!isPrivateKeyOnly) /* do not advance state if doing make pub key */ key->state++; return err; @@ -8198,15 +8597,8 @@ /* make sure required variables are reset */ wc_ecc_reset(key); -#else - (void)siglen; - (void)hashlen; - (void)s; - (void)r; - (void)err; -#endif /* WOLF_CRYPTO_CB_ONLY_ECC */ - return err; +#endif /* !WOLF_CRYPTO_CB_ONLY_ECC */ } #endif /* !NO_ASN */ @@ -8244,6 +8636,7 @@ } #endif /* !WOLFSSL_STM32_PKA && !WOLFSSL_PSOC6_CRYPTO */ +#ifdef HAVE_ECC_VERIFY_HELPER static int ecc_verify_hash_sp(mp_int *r, mp_int *s, const byte* hash, word32 hashlen, int* res, ecc_key* key) { @@ -8270,6 +8663,9 @@ #ifndef WOLFSSL_SP_NO_256 && ecc_sets[key->idx].id != ECC_SECP256R1 #endif + #ifdef WOLFSSL_SP_SM2 + && ecc_sets[key->idx].id != ECC_SM2P256V1 + #endif #ifdef WOLFSSL_SP_384 && ecc_sets[key->idx].id != ECC_SECP384R1 #endif @@ -8319,6 +8715,21 @@ #endif } #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (ecc_sets[key->idx].id == ECC_SM2P256V1) { + #if defined(FP_ECC_CONTROL) && !defined(WOLFSSL_DSP_BUILD) + return sp_ecc_cache_verify_sm2_256(hash, hashlen, key->pubkey.x, + key->pubkey.y, key->pubkey.z, r, s, res, + sp_ecc_get_cache_entry_256(&(key->pubkey), ECC_SM2P256V1, + key->fpIdx, key->fpBuild, key->heap), + key->heap); + #endif + #if !defined(FP_ECC_CONTROL) + return sp_ecc_verify_sm2_256(hash, hashlen, key->pubkey.x, + key->pubkey.y, key->pubkey.z, r, s, res, key->heap); + #endif + } + #endif #ifdef WOLFSSL_SP_384 if (ecc_sets[key->idx].id == ECC_SECP384R1) { #ifdef WC_ECC_NONBLOCK @@ -8394,9 +8805,9 @@ ecc_point lcl_mG; ecc_point lcl_mQ; #endif - DECL_MP_INT_SIZE_DYN(w, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE); + DECL_MP_INT_SIZE_DYN(w, ECC_KEY_MAX_BITS_NONULLCHECK(key), MAX_ECC_BITS_USE); #if !defined(WOLFSSL_ASYNC_CRYPT) || !defined(HAVE_CAVIUM_V) - DECL_MP_INT_SIZE_DYN(e_lcl, ECC_KEY_MAX_BITS(key), MAX_ECC_BITS_USE); + DECL_MP_INT_SIZE_DYN(e_lcl, ECC_KEY_MAX_BITS_NONULLCHECK(key), MAX_ECC_BITS_USE); #endif mp_int* e; mp_int* v = NULL; /* Will be w. */ @@ -8412,7 +8823,7 @@ err = mp_init(e); #else - NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(e_lcl, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (e_lcl == NULL) { return MEMORY_E; @@ -8420,7 +8831,7 @@ #endif e = e_lcl; - err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(e, ECC_KEY_MAX_BITS_NONULLCHECK(key)); #endif /* WOLFSSL_ASYNC_CRYPT && HAVE_CAVIUM_V */ if (err != MP_OKAY) { #ifdef WOLFSSL_SMALL_STACK @@ -8482,7 +8893,7 @@ } #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_ECC */ - NEW_MP_INT_SIZE(w, ECC_KEY_MAX_BITS(key), key->heap, DYNAMIC_TYPE_ECC); + NEW_MP_INT_SIZE(w, ECC_KEY_MAX_BITS_NONULLCHECK(key), key->heap, DYNAMIC_TYPE_ECC); #ifdef MP_INT_SIZE_CHECK_NULL if (w == NULL) { err = MEMORY_E; @@ -8495,7 +8906,7 @@ v = w; } if (err == MP_OKAY) { - err = INIT_MP_INT_SIZE(w, ECC_KEY_MAX_BITS(key)); + err = INIT_MP_INT_SIZE(w, ECC_KEY_MAX_BITS_NONULLCHECK(key)); } /* allocate points */ @@ -8616,6 +9027,7 @@ return err; } #endif /* !WOLFSSL_SP_MATH || FREESCALE_LTC_ECC */ +#endif /* HAVE_ECC_VERIFY_HELPER */ /** Verify an ECC signature @@ -8692,10 +9104,7 @@ } #endif -#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ - defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) || \ - defined(WOLFSSL_KCAPI_ECC) || defined(WOLFSSL_SE050) || \ - defined(WOLFSSL_XILINX_CRYPT_VERSAL) +#ifndef HAVE_ECC_VERIFY_HELPER #ifndef WOLFSSL_SE050 /* Extract R and S with front zero padding (if required), @@ -8813,7 +9222,7 @@ } err = ecc_verify_hash_sp(r, s, hash, hashlen, res, key); - if (err != NOT_COMPILED_IN) { + if (err != WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { if (curveLoaded) { wc_ecc_curve_free(curve); FREE_CURVE_SPECS(); @@ -8842,7 +9251,7 @@ (void)curveLoaded; wc_ecc_curve_free(curve); FREE_CURVE_SPECS(); -#endif /* WOLFSSL_ATECC508A */ +#endif /* HAVE_ECC_VERIFY_HELPER */ (void)keySz; (void)hashlen; @@ -8942,6 +9351,13 @@ } else #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (curve_idx != ECC_CUSTOM_IDX && + ecc_sets[curve_idx].id == ECC_SM2P256V1) { + sp_ecc_uncompress_sm2_256(point->x, pointType, point->y); + } + else + #endif #ifdef WOLFSSL_SP_384 if (curve_idx != ECC_CUSTOM_IDX && ecc_sets[curve_idx].id == ECC_SECP384R1) { @@ -9089,7 +9505,7 @@ return err; } -/* function for backwards compatiblity with previous implementations */ +/* function for backwards compatibility with previous implementations */ int wc_ecc_import_point_der(const byte* in, word32 inLen, const int curve_idx, ecc_point* point) { @@ -9371,7 +9787,9 @@ #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SE050) && \ - !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(WOLFSSL_STM32_PKA) + !defined(WOLFSSL_STM32_PKA) && \ + (!defined(WOLF_CRYPTO_CB_ONLY_ECC) || defined(WOLFSSL_QNX_CAAM) || \ + defined(WOLFSSL_IMXRT1170_CAAM)) /* is ecc point on curve described by dp ? */ static int _ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime) @@ -9487,6 +9905,11 @@ (void)b; #ifdef WOLFSSL_HAVE_SP_ECC +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((mp_count_bits(prime) == 256) && (!mp_is_bit_set(prime, 224))) { + return sp_ecc_is_point_sm2_256(ecp->x, ecp->y); + } +#endif #ifndef WOLFSSL_SP_NO_256 if (mp_count_bits(prime) == 256) { return sp_ecc_is_point_256(ecp->x, ecp->y); @@ -9577,7 +10000,15 @@ #ifndef WOLFSSL_SP_NO_256 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) { if (err == MP_OKAY) { - err = sp_ecc_mulmod_base_256(key->k, res, 1, key->heap); + err = sp_ecc_mulmod_base_256(ecc_get_k(key), res, 1, key->heap); + } + } + else +#endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) { + if (err == MP_OKAY) { + err = sp_ecc_mulmod_base_sm2_256(ecc_get_k(key), res, 1, key->heap); } } else @@ -9585,7 +10016,7 @@ #ifdef WOLFSSL_SP_384 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) { if (err == MP_OKAY) { - err = sp_ecc_mulmod_base_384(key->k, res, 1, key->heap); + err = sp_ecc_mulmod_base_384(ecc_get_k(key), res, 1, key->heap); } } else @@ -9593,7 +10024,7 @@ #ifdef WOLFSSL_SP_521 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) { if (err == MP_OKAY) { - err = sp_ecc_mulmod_base_521(key->k, res, 1, key->heap); + err = sp_ecc_mulmod_base_521(ecc_get_k(key), res, 1, key->heap); } } else @@ -9646,12 +10077,12 @@ #else #ifdef ECC_TIMING_RESISTANT if (err == MP_OKAY) - err = wc_ecc_mulmod_ex2(key->k, base, res, a, prime, curve->order, - key->rng, 1, key->heap); + err = wc_ecc_mulmod_ex2(ecc_get_k(key), base, res, a, prime, + curve->order, key->rng, 1, key->heap); #else if (err == MP_OKAY) - err = wc_ecc_mulmod_ex2(key->k, base, res, a, prime, curve->order, - NULL, 1, key->heap); + err = wc_ecc_mulmod_ex2(ecc_get_k(key), base, res, a, prime, + curve->order, NULL, 1, key->heap); #endif #endif /* WOLFSSL_KCAPI_ECC */ } @@ -9783,7 +10214,7 @@ } #endif /* (FIPS v5 or later || WOLFSSL_VALIDATE_ECC_KEYGEN) &&!WOLFSSL_KCAPI_ECC */ -#ifndef WOLFSSL_SP_MATH +#ifdef HAVE_ECC_CHECK_PUBKEY_ORDER /* validate order * pubkey = point at infinity, 0 on success */ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a, mp_int* prime, mp_int* order) @@ -9815,6 +10246,13 @@ } else #endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (key->idx != ECC_CUSTOM_IDX && + ecc_sets[key->idx].id == ECC_SM2P256V1) { + err = sp_ecc_mulmod_sm2_256(order, pubkey, inf, 1, key->heap); + } + else +#endif #ifdef WOLFSSL_SP_384 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) { @@ -9850,7 +10288,11 @@ } #endif /* !WOLFSSL_SP_MATH */ -#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_CRYPTOCELL*/ +#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A && + !WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 && !WOLFSSL_STM32_PKA && + (!WOLF_CRYPTO_CB_ONLY_ECC || WOLFSSL_QNX_CAAM || + WOLFSSL_IMXRT1170_CAAM) + */ #ifdef OPENSSL_EXTRA int wc_ecc_get_generator(ecc_point* ecp, int curve_idx) @@ -9890,11 +10332,7 @@ static int _ecc_validate_public_key(ecc_key* key, int partial, int priv) { int err = MP_OKAY; -#ifndef WOLFSSL_SP_MATH -#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ - !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \ - !defined(WOLFSSL_SE050) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \ - !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(WOLFSSL_STM32_PKA) +#ifdef HAVE_ECC_CHECK_PUBKEY_ORDER mp_int* b = NULL; #ifdef USE_ECC_B_PARAM DECLARE_CURVE_SPECS(4); @@ -9904,9 +10342,7 @@ #endif DECLARE_CURVE_SPECS(3); #endif /* USE_ECC_B_PARAM */ -#endif /* !WOLFSSL_ATECC508A && !WOLFSSL_ATECC608A && - !WOLFSSL_CRYPTOCELL && !WOLFSSL_SILABS_SE_ACCEL && !WOLFSSL_SE050 */ -#endif /* !WOLFSSL_SP_MATH */ +#endif /* HAVE_ECC_CHECK_PUBKEY_ORDER */ ASSERT_SAVED_VECTOR_REGISTERS(); @@ -9917,39 +10353,41 @@ #ifndef WOLFSSL_SP_NO_256 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP256R1) { return sp_ecc_check_key_256(key->pubkey.x, key->pubkey.y, - key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap); + key->type == ECC_PRIVATEKEY ? ecc_get_k(key) : NULL, key->heap); + } +#endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SM2P256V1) { + return sp_ecc_check_key_sm2_256(key->pubkey.x, key->pubkey.y, + key->type == ECC_PRIVATEKEY ? ecc_get_k(key) : NULL, key->heap); } #endif #ifdef WOLFSSL_SP_384 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP384R1) { return sp_ecc_check_key_384(key->pubkey.x, key->pubkey.y, - key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap); + key->type == ECC_PRIVATEKEY ? ecc_get_k(key) : NULL, key->heap); } #endif #ifdef WOLFSSL_SP_521 if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SECP521R1) { return sp_ecc_check_key_521(key->pubkey.x, key->pubkey.y, - key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap); + key->type == ECC_PRIVATEKEY ? ecc_get_k(key) : NULL, key->heap); } #endif #if defined(WOLFSSL_SP_1024) && defined(WOLFCRYPT_HAVE_SAKKE) if (key->idx != ECC_CUSTOM_IDX && ecc_sets[key->idx].id == ECC_SAKKE_1) { return sp_ecc_check_key_1024(key->pubkey.x, key->pubkey.y, - key->type == ECC_PRIVATEKEY ? key->k : NULL, key->heap); + key->type == ECC_PRIVATEKEY ? ecc_get_k(key) : NULL, key->heap); } #endif #endif #ifndef WOLFSSL_SP_MATH -#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ - defined(WOLFSSL_CRYPTOCELL) || defined(WOLFSSL_SILABS_SE_ACCEL) || \ - defined(WOLFSSL_SE050) || defined(WOLF_CRYPTO_CB_ONLY_ECC) || \ - defined(WOLFSSL_XILINX_CRYPT_VERSAL) || defined(WOLFSSL_STM32_PKA) - +#ifndef HAVE_ECC_CHECK_PUBKEY_ORDER /* consider key check success on HW crypto * ex: ATECC508/608A, CryptoCell and Silabs * - * consider key check success on Crypt Cb + * consider key check success on most Crypt Cb only builds */ err = MP_OKAY; @@ -10050,8 +10488,8 @@ /* SP 800-56Ar3, section 5.6.2.1.2 */ /* private keys must be in the range [1, n-1] */ if ((err == MP_OKAY) && (key->type == ECC_PRIVATEKEY) && - (mp_iszero(key->k) || mp_isneg(key->k) || - (mp_cmp(key->k, curve->order) != MP_LT)) + (mp_iszero(ecc_get_k(key)) || mp_isneg(ecc_get_k(key)) || + (mp_cmp(ecc_get_k(key), curve->order) != MP_LT)) #ifdef WOLFSSL_KCAPI_ECC && key->handle == NULL #endif @@ -10077,7 +10515,8 @@ #endif FREE_CURVE_SPECS(); -#endif /* HW Based Crypto */ +#endif /* HAVE_ECC_CHECK_PUBKEY_ORDER */ + #else err = WC_KEY_SIZE_E; #endif /* !WOLFSSL_SP_MATH */ @@ -10135,12 +10574,26 @@ alt_fp_init(key->pubkey.z); key->k = (mp_int*)key->ka; alt_fp_init(key->k); + #ifdef WOLFSSL_ECC_BLIND_K + key->kb = (mp_int*)key->kba; + key->ku = (mp_int*)key->kua; + alt_fp_init(key->kb); + alt_fp_init(key->ku); + #endif + #else + err = mp_init_multi(key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z, + #ifndef WOLFSSL_ECC_BLIND_K + NULL, NULL #else - err = mp_init_multi(key->k, - key->pubkey.x, key->pubkey.y, key->pubkey.z, NULL, NULL); + key->kb, key->ku + #endif + ); #endif if (err != MP_OKAY) return MEMORY_E; +#ifdef WOLFSSL_ECC_BLIND_K + mp_forcezero(key->kb); +#endif SAVE_VECTOR_REGISTERS(return _svr_ret;); @@ -10184,6 +10637,8 @@ /* determine key size */ keysize = (int)(inLen>>1); + /* NOTE: FIPS v6.0.0 or greater, no restriction on imported keys, only + * on created keys or signatures */ err = wc_ecc_set_curve(key, keysize, curve_id); key->type = ECC_PUBLICKEY; } @@ -10300,6 +10755,12 @@ } else #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if (key->dp->id == ECC_SM2P256V1) { + sp_ecc_uncompress_sm2_256(key->pubkey.x, pointType, key->pubkey.y); + } + else + #endif #ifdef WOLFSSL_SP_384 if (key->dp->id == ECC_SECP384R1) { err = sp_ecc_uncompress_384(key->pubkey.x, pointType, @@ -10350,7 +10811,7 @@ } #elif defined(WOLFSSL_SILABS_SE_ACCEL) if (err == MP_OKAY) - err = silabs_ecc_import(key, keysize); + err = silabs_ecc_import(key, keysize, 1, 0); #elif defined(WOLFSSL_SE050) if (err == MP_OKAY) { /* reset key ID, in case used before */ @@ -10441,7 +10902,7 @@ return BUFFER_E; } - err = wc_export_int(key->k, d, dLen, keySz + WC_CAAM_MAC_SZ, + err = wc_export_int(ecc_get_k(key), d, dLen, keySz + WC_CAAM_MAC_SZ, encType); *dLen = keySz + WC_CAAM_MAC_SZ; } @@ -10463,7 +10924,7 @@ else #endif { - err = wc_export_int(key->k, d, dLen, keySz, encType); + err = wc_export_int(ecc_get_k(key), d, dLen, keySz, encType); if (err != MP_OKAY) return err; } @@ -10572,6 +11033,8 @@ wc_ecc_reset(key); /* set key size */ + /* NOTE: FIPS v6.0.0 or greater, no restriction on imported keys, only + * on created keys or signatures */ ret = wc_ecc_set_curve(key, (int)privSz, curve_id); key->type = ECC_PRIVATEKEY_ONLY; } @@ -10596,18 +11059,11 @@ } ret = mp_read_unsigned_bin(key->k, priv, privSz); - } -#elif defined(WOLFSSL_SILABS_SE_ACCEL) - if (ret == MP_OKAY) - ret = mp_read_unsigned_bin(key->k, priv, privSz); - - if (ret == MP_OKAY) { - if (pub) { - ret = silabs_ecc_import(key, key->dp->size); - } - else { - ret = silabs_ecc_import_private(key, key->dp->size); + #ifdef WOLFSSL_ECC_BLIND_K + if (ret == MP_OKAY) { + err = ecc_blind_k_rng(key, NULL); } + #endif } #elif defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_IMXRT1170_CAAM) if ((wc_ecc_size(key) + WC_CAAM_MAC_SZ) == (int)privSz) { @@ -10639,11 +11095,21 @@ #else key->blackKey = CAAM_BLACK_KEY_CCM; ret = mp_read_unsigned_bin(key->k, priv, privSz); + #ifdef WOLFSSL_ECC_BLIND_K + if (ret == MP_OKAY) { + err = ecc_blind_k_rng(key, NULL); + } + #endif #endif } else { key->blackKey = 0; ret = mp_read_unsigned_bin(key->k, priv, privSz); + #ifdef WOLFSSL_ECC_BLIND_K + if (ret == MP_OKAY) { + err = ecc_blind_k_rng(key, NULL); + } + #endif /* If using AES-ECB encrypted black keys check here if key is valid, * if not valid than assume is an encrypted key. A public key is needed @@ -10672,8 +11138,8 @@ ret = mp_read_unsigned_bin(key->k, priv, privSz); #ifdef HAVE_WOLF_BIGINT - if (ret == 0 && - wc_bigint_from_unsigned_bin(&key->k->raw, priv, privSz) != 0) { + if (ret == 0 && wc_bigint_from_unsigned_bin(&key->k->raw, priv, + privSz) != 0) { mp_clear(key->k); ret = ASN_GETINT_E; } @@ -10699,6 +11165,13 @@ if (ret == 0) { ret = mp_read_radix(order, key->dp->order, MP_RADIX_HEX); } + #ifdef WOLFSSL_SM2 + /* SM2 curve: private key must be less than order-1. */ + if ((ret == 0) && (key->idx != ECC_CUSTOM_IDX) && + (ecc_sets[key->idx].id == ECC_SM2P256V1)) { + ret = mp_sub_d(order, 1, order); + } + #endif if ((ret == 0) && (mp_cmp(key->k, order) != MP_LT)) { ret = ECC_PRIV_KEY_E; } @@ -10708,6 +11181,11 @@ #endif } #endif /* WOLFSSL_VALIDATE_ECC_IMPORT */ +#ifdef WOLFSSL_ECC_BLIND_K + if (ret == 0) { + ret = ecc_blind_k_rng(key, NULL); + } +#endif #endif /* WOLFSSL_CRYPTOCELL */ @@ -10726,6 +11204,10 @@ if (ret == 0) { ret = wc_MAXQ10XX_EccSetKey(key, key->dp->size); } +#elif defined(WOLFSSL_SILABS_SE_ACCEL) + if (ret == 0) { + ret = silabs_ecc_import(key, key->dp->size, (pub != NULL), 1); + } #endif return ret; @@ -10866,7 +11348,7 @@ #endif #if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ - defined(WOLFSSL_SILABS_SE_ACCEL) || defined(WOLFSSL_CRYPTOCELL) + defined(WOLFSSL_CRYPTOCELL) word32 keySz = 0; #endif @@ -10879,6 +11361,8 @@ wc_ecc_reset(key); /* set curve type and index */ + /* NOTE: FIPS v6.0.0 or greater, no restriction on imported keys, only + * on created keys or signatures */ err = wc_ecc_set_curve(key, 0, curve_id); if (err != 0) { return err; @@ -10894,12 +11378,26 @@ alt_fp_init(key->pubkey.z); key->k = (mp_int*)key->ka; alt_fp_init(key->k); +#ifdef WOLFSSL_ECC_BLIND_K + key->kb = (mp_int*)key->kba; + key->ku = (mp_int*)key->kua; + alt_fp_init(key->kb); + alt_fp_init(key->ku); +#endif #else err = mp_init_multi(key->k, key->pubkey.x, key->pubkey.y, key->pubkey.z, - NULL, NULL); +#ifndef WOLFSSL_ECC_BLIND_K + NULL, NULL +#else + key->kb, key->ku +#endif + ); #endif if (err != MP_OKAY) return MEMORY_E; +#ifdef WOLFSSL_ECC_BLIND_K + mp_forcezero(key->kb); +#endif /* read Qx */ if (err == MP_OKAY) { @@ -10955,11 +11453,6 @@ err = wc_export_int(key->pubkey.y, &key->pubkey_raw[keySz], &keySz, keySz, WC_TYPE_UNSIGNED_BIN); } -#elif defined(WOLFSSL_SILABS_SE_ACCEL) - keySz = key->dp->size; - if (err == MP_OKAY) { - err = silabs_ecc_sig_to_rs(key, keySz); - } #elif defined(WOLFSSL_CRYPTOCELL) if (err == MP_OKAY) { keyRaw[0] = ECC_POINT_UNCOMP; @@ -11039,9 +11532,6 @@ /* Hardware doesn't support loading private key */ err = NOT_COMPILED_IN; - #elif defined(WOLFSSL_SILABS_SE_ACCEL) - err = silabs_ecc_import_private_raw(key, keySz, d, encType); - #elif defined(WOLFSSL_CRYPTOCELL) key->type = ECC_PRIVATEKEY; @@ -11054,6 +11544,11 @@ err = wc_export_int(key->k, &keyRaw[0], &keySz, keySz, WC_TYPE_UNSIGNED_BIN); } + #ifdef WOLFSSL_ECC_BLIND_K + if (err == 0) { + err = ecc_blind_k_rng(key, NULL); + } + #endif if (err == MP_OKAY) { /* Create private key from external key buffer*/ @@ -11085,12 +11580,17 @@ (word32)key->dp->size); } } + #ifdef WOLFSSL_ECC_BLIND_K + if (err == 0) { + err = ecc_blind_k_rng(key, NULL); + } + #endif #if defined(WOLFSSL_XILINX_CRYPT_VERSAL) if (err == MP_OKAY) { const word32 key_size = key->dp->size; word32 buf_size = key_size; - err = wc_export_int(key->k, key->privKey, - &buf_size, key_size, WC_TYPE_UNSIGNED_BIN); + err = wc_export_int(key, key->privKey, &buf_size, key_size, + WC_TYPE_UNSIGNED_BIN); mp_reverse(key->privKey, key_size); } #endif @@ -11108,7 +11608,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_IMPORT if (err == MP_OKAY) { err = wc_ecc_check_key(key); - if (err == IS_POINT_E && (mp_iszero(key->pubkey.x) || + if (err == WC_NO_ERR_TRACE(IS_POINT_E) && (mp_iszero(key->pubkey.x) || mp_iszero(key->pubkey.y))) { err = BAD_FUNC_ARG; } @@ -11123,6 +11623,10 @@ if (err == MP_OKAY) { err = wc_MAXQ10XX_EccSetKey(key, key->dp->size); } +#elif defined(WOLFSSL_SILABS_SE_ACCEL) + if (err == MP_OKAY) { + err = silabs_ecc_import(key, key->dp->size, 1, (d != NULL)); + } #endif if (err != MP_OKAY) { @@ -11322,8 +11826,10 @@ static THREAD_LS_T fp_cache_t fp_cache[FP_ENTRIES]; #ifndef HAVE_THREAD_LS + static wolfSSL_Mutex ecc_fp_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(ecc_fp_lock); +#ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initMutex = 0; /* prevent multiple mutex inits */ - static wolfSSL_Mutex ecc_fp_lock; +#endif #endif /* HAVE_THREAD_LS */ /* simple table to help direct the generation of the LUT */ @@ -12610,10 +13116,12 @@ } #ifndef HAVE_THREAD_LS +#ifndef WOLFSSL_MUTEX_INITIALIZER if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */ wc_InitMutex(&ecc_fp_lock); initMutex = 1; } +#endif if (wc_LockMutex(&ecc_fp_lock) != 0) { #ifdef WOLFSSL_SMALL_STACK @@ -12768,10 +13276,12 @@ } #ifndef HAVE_THREAD_LS +#ifndef WOLFSSL_MUTEX_INITIALIZER if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */ wc_InitMutex(&ecc_fp_lock); initMutex = 1; } +#endif if (wc_LockMutex(&ecc_fp_lock) != 0) { err = BAD_MUTEX_E; @@ -12856,10 +13366,19 @@ return IS_POINT_E; } +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) { + int ret; + SAVE_VECTOR_REGISTERS(return _svr_ret); + ret = sp_ecc_mulmod_sm2_256(k, G, R, map, heap); + RESTORE_VECTOR_REGISTERS(); + return ret; + } +#endif #ifndef WOLFSSL_SP_NO_256 if (mp_count_bits(modulus) == 256) { int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret); + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = sp_ecc_mulmod_256(k, G, R, map, heap); RESTORE_VECTOR_REGISTERS(); return ret; @@ -12868,7 +13387,7 @@ #ifdef WOLFSSL_SP_384 if (mp_count_bits(modulus) == 384) { int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret); + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = sp_ecc_mulmod_384(k, G, R, map, heap); RESTORE_VECTOR_REGISTERS(); return ret; @@ -12877,7 +13396,7 @@ #ifdef WOLFSSL_SP_521 if (mp_count_bits(modulus) == 521) { int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret); + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = sp_ecc_mulmod_521(k, G, R, map, heap); RESTORE_VECTOR_REGISTERS(); return ret; @@ -12934,10 +13453,12 @@ } #ifndef HAVE_THREAD_LS +#ifndef WOLFSSL_MUTEX_INITIALIZER if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */ wc_InitMutex(&ecc_fp_lock); initMutex = 1; } +#endif if (wc_LockMutex(&ecc_fp_lock) != 0) { err = BAD_MUTEX_E; @@ -13025,10 +13546,19 @@ return IS_POINT_E; } +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SP_SM2) + if ((mp_count_bits(modulus) == 256) && (!mp_is_bit_set(modulus, 224))) { + int ret; + SAVE_VECTOR_REGISTERS(return _svr_ret;); + ret = sp_ecc_mulmod_sm2_256(k, G, R, map, heap); + RESTORE_VECTOR_REGISTERS(); + return ret; + } +#endif #ifndef WOLFSSL_SP_NO_256 if (mp_count_bits(modulus) == 256) { int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret); + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = sp_ecc_mulmod_256(k, G, R, map, heap); RESTORE_VECTOR_REGISTERS(); return ret; @@ -13037,7 +13567,7 @@ #ifdef WOLFSSL_SP_384 if (mp_count_bits(modulus) == 384) { int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret); + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = sp_ecc_mulmod_384(k, G, R, map, heap); RESTORE_VECTOR_REGISTERS(); return ret; @@ -13046,7 +13576,7 @@ #ifdef WOLFSSL_SP_521 if (mp_count_bits(modulus) == 521) { int ret; - SAVE_VECTOR_REGISTERS(return _svr_ret); + SAVE_VECTOR_REGISTERS(return _svr_ret;); ret = sp_ecc_mulmod_521(k, G, R, map, heap); RESTORE_VECTOR_REGISTERS(); return ret; @@ -13085,12 +13615,14 @@ { #ifndef WOLFSSL_SP_MATH #ifndef HAVE_THREAD_LS +#ifndef WOLFSSL_MUTEX_INITIALIZER if (initMutex == 0) { wc_InitMutex(&ecc_fp_lock); initMutex = 1; } #endif #endif +#endif } @@ -13100,10 +13632,12 @@ { #if !defined(WOLFSSL_SP_MATH) #ifndef HAVE_THREAD_LS +#ifndef WOLFSSL_MUTEX_INITIALIZER if (initMutex == 0) { /* extra sanity check if wolfCrypt_Init not called */ wc_InitMutex(&ecc_fp_lock); initMutex = 1; } +#endif if (wc_LockMutex(&ecc_fp_lock) == 0) { #endif /* HAVE_THREAD_LS */ @@ -13112,8 +13646,10 @@ #ifndef HAVE_THREAD_LS wc_UnLockMutex(&ecc_fp_lock); +#ifndef WOLFSSL_MUTEX_INITIALIZER wc_FreeMutex(&ecc_fp_lock); initMutex = 0; +#endif } #endif /* HAVE_THREAD_LS */ #endif @@ -13294,17 +13830,17 @@ * * @param [in, out] ctx ECIES context object. * @param [in] salt Salt to use with KDF. - * @param [in] len Length of salt in bytes. + * @param [in] sz Length of salt in bytes. * @return 0 on success. * @return BAD_FUNC_ARG when ctx is NULL or salt is NULL and len is not 0. */ -int wc_ecc_ctx_set_kdf_salt(ecEncCtx* ctx, const byte* salt, word32 len) +int wc_ecc_ctx_set_kdf_salt(ecEncCtx* ctx, const byte* salt, word32 sz) { - if (ctx == NULL || (salt == NULL && len != 0)) + if (ctx == NULL || (salt == NULL && sz != 0)) return BAD_FUNC_ARG; ctx->kdfSalt = salt; - ctx->kdfSaltSz = len; + ctx->kdfSaltSz = sz; if (ctx->protocol == REQ_RESP_CLIENT) { ctx->cliSt = ecCLI_SALT_SET; @@ -13316,9 +13852,37 @@ return 0; } +/* Set your own salt. By default we generate a random salt for ourselves. + * This allows overriding that after init or reset. + * + * @param [in, out] ctx ECIES context object. + * @param [in] salt Salt to use for ourselves + * @param [in] sz Length of salt in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when ctx is NULL or salt is NULL and len is not 0. + */ +int wc_ecc_ctx_set_own_salt(ecEncCtx* ctx, const byte* salt, word32 sz) +{ + byte* saltBuffer; + + if (ctx == NULL || ctx->protocol == 0 || salt == NULL) + return BAD_FUNC_ARG; + + if (sz > EXCHANGE_SALT_SZ) + sz = EXCHANGE_SALT_SZ; + saltBuffer = (ctx->protocol == REQ_RESP_CLIENT) ? + ctx->clientSalt : + ctx->serverSalt; + XMEMSET(saltBuffer, 0, EXCHANGE_SALT_SZ); + XMEMCPY(saltBuffer, salt, sz); + + return 0; +} + + static int ecc_ctx_set_salt(ecEncCtx* ctx, int flags) { - byte* saltBuffer = NULL; + byte* saltBuffer; if (ctx == NULL || flags == 0) return BAD_FUNC_ARG; @@ -13328,7 +13892,6 @@ return wc_RNG_GenerateBlock(ctx->rng, saltBuffer, EXCHANGE_SALT_SZ); } - static void ecc_ctx_init(ecEncCtx* ctx, int flags, WC_RNG* rng) { if (ctx) { @@ -13620,7 +14183,9 @@ ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret + pubKeySz, &sharedSz); #endif - } while (ret == WC_PENDING_E); + } + while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); + if (ret == 0) { #ifdef WOLFSSL_ECIES_ISO18033 /* KDF data is encoded public key and secret. */ @@ -13632,6 +14197,30 @@ ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen); break; + case ecHKDF_SHA1 : + ret = wc_HKDF(WC_SHA, sharedSecret, sharedSz, ctx->kdfSalt, + ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz, + keys, (word32)keysLen); + break; +#if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER) + case ecKDF_X963_SHA1 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz, + ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen); + break; + case ecKDF_X963_SHA256 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz, + ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen); + break; + case ecKDF_SHA1 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz, + NULL, 0, keys, (word32)keysLen); + break; + case ecKDF_SHA256 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz, + NULL, 0, keys, (word32)keysLen); + break; +#endif + default: ret = BAD_FUNC_ARG; @@ -14014,7 +14603,7 @@ ret = wc_ecc_shared_secret(privKey, pubKey, sharedSecret + pubKeySz, &sharedSz); #endif - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); } if (ret == 0) { #ifdef WOLFSSL_ECIES_ISO18033 @@ -14027,6 +14616,29 @@ ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen); break; + case ecHKDF_SHA1 : + ret = wc_HKDF(WC_SHA, sharedSecret, sharedSz, ctx->kdfSalt, + ctx->kdfSaltSz, ctx->kdfInfo, ctx->kdfInfoSz, + keys, (word32)keysLen); + break; +#if defined(HAVE_X963_KDF) && !defined(NO_HASH_WRAPPER) + case ecKDF_X963_SHA1 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz, + ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen); + break; + case ecKDF_X963_SHA256 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz, + ctx->kdfInfo, ctx->kdfInfoSz, keys, (word32)keysLen); + break; + case ecKDF_SHA1 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA, sharedSecret, sharedSz, + NULL, 0, keys, (word32)keysLen); + break; + case ecKDF_SHA256 : + ret = wc_X963_KDF(WC_HASH_TYPE_SHA256, sharedSecret, sharedSz, + NULL, 0, keys, (word32)keysLen); + break; +#endif default: ret = BAD_FUNC_ARG; @@ -14213,9 +14825,10 @@ !defined(WOLFSSL_CRYPTOCELL) #ifndef WOLFSSL_SP_MATH +#if !defined(SQRTMOD_USE_MOD_EXP) /* computes the jacobi c = (a | n) (or Legendre if n is prime) */ -int mp_jacobi(mp_int* a, mp_int* n, int* c) +static int mp_jacobi(mp_int* a, mp_int* n, int* c) { #ifdef WOLFSSL_SMALL_STACK mp_int* a1 = NULL; @@ -14332,6 +14945,7 @@ return res; } +#endif /* !SQRTMOD_USE_MOD_EXP */ /* Solves the modular equation x^2 = n (mod p) @@ -14339,20 +14953,46 @@ * The result is returned in the third argument x * the function returns MP_OKAY on success, MP_VAL or another error on failure */ -int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret) +static int mp_sqrtmod_prime(mp_int* n, mp_int* prime, mp_int* ret) { -#ifdef SQRTMOD_USE_MOD_EXP +#if defined(SQRTMOD_USE_MOD_EXP) int res; - + mp_digit i; mp_int e; + /* first handle the simple cases n = 0 or n = 1 */ + if (mp_cmp_d(n, 0) == MP_EQ) { + mp_zero(ret); + return MP_OKAY; + } + if (mp_cmp_d(n, 1) == MP_EQ) { + return mp_set(ret, 1); + } + + if (mp_iseven(prime)) { + return MP_VAL; + } + SAVE_VECTOR_REGISTERS(return _svr_ret;); res = mp_init(&e); if (res == MP_OKAY) + res = mp_mod_d(prime, 8, &i); + if (res == MP_OKAY && i == 1) { + return MP_VAL; + } + /* prime mod 8 = 5 */ + else if (res == MP_OKAY && i == 5) { + res = mp_sub_d(prime, 1, &e); + if (res == MP_OKAY) + res = mp_div_2d(&e, 2, &e, NULL); + } + /* prime mod 4 = 3 */ + else if (res == MP_OKAY && ((i == 3) || (i == 7))) { res = mp_add_d(prime, 1, &e); - if (res == MP_OKAY) - res = mp_div_2d(&e, 2, &e, NULL); + if (res == MP_OKAY) + res = mp_div_2d(&e, 2, &e, NULL); + } if (res == MP_OKAY) res = mp_exptmod(n, &e, prime, ret); @@ -14491,9 +15131,24 @@ if (res == MP_OKAY && legendre == -1) break; +#if defined(WOLFSSL_CUSTOM_CURVES) + /* P224R1 succeeds with a value of 11. */ + if (mp_cmp_d(Z, 22) == MP_EQ) { + /* This is to clamp the loop in case 'prime' is not really prime */ + res = MP_VAL; + break; + } +#endif + /* Z = Z + 1 */ if (res == MP_OKAY) res = mp_add_d(Z, 1, Z); + + if ((res == MP_OKAY) && (mp_cmp(Z,prime) == MP_EQ)) { + /* This is to clamp the loop in case 'prime' is not really prime */ + res = MP_VAL; + break; + } } /* C = Z ^ Q mod prime */ @@ -14530,6 +15185,11 @@ if (mp_cmp_d(t1, 1) == MP_EQ) break; res = mp_exptmod(t1, two, prime, t1); + if ((res == MP_OKAY) && (mp_cmp_d(M,i) == MP_EQ)) { + /* This is to clamp the loop in case 'prime' is not really prime */ + res = MP_VAL; + break; + } if (res == MP_OKAY) i++; } @@ -14576,57 +15236,57 @@ #ifdef WOLFSSL_SMALL_STACK if (t1) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(t1); XFREE(t1, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (C) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(C); XFREE(C, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (Q) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(Q); XFREE(Q, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (S) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(S); XFREE(S, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (Z) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(Z); XFREE(Z, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (M) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(M); XFREE(M, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (T) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(T); XFREE(T, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (R) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(R); XFREE(R, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (N) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(N); XFREE(N, NULL, DYNAMIC_TYPE_ECC_BUFFER); } if (two) { - if (res != MP_INIT_E) + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(two); XFREE(two, NULL, DYNAMIC_TYPE_ECC_BUFFER); } #else - if (res != MP_INIT_E) { + if (res != WC_NO_ERR_TRACE(MP_INIT_E)) { mp_clear(t1); mp_clear(C); mp_clear(Q); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/eccsi.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/eccsi.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/eccsi.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/eccsi.c 2024-08-03 07:30:00.000000000 +0000 @@ -43,6 +43,14 @@ #include #endif +#if defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_SP_ASM) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif + #ifndef WOLFSSL_HAVE_ECC_KEY_GET_PRIV /* FIPS build has replaced ecc.h. */ #define wc_ecc_key_get_priv(key) (&((key)->k)) @@ -1350,15 +1358,13 @@ { int err = 0; -#ifdef WOLFSSL_HAVE_SP_ECC -#ifndef WOLFSSL_SP_NO_256 +#if defined(WOLFSSL_HAVE_SP_ECC) && !defined(WOLFSSL_SP_NO_256) if ((key->ecc.idx != ECC_CUSTOM_IDX) && (ecc_sets[key->ecc.idx].id == ECC_SECP256R1)) { err = sp_ecc_mulmod_base_add_256(n, a, 1, res, map, key->heap); } else #endif -#endif #ifndef WOLFSSL_SP_MATH { EccsiKeyParams* params = &key->params; @@ -1377,7 +1383,12 @@ { err = NOT_COMPILED_IN; } + (void)key; + (void)n; + (void)a; + (void)res; (void)mp; + (void)map; #endif return err; @@ -1401,15 +1412,13 @@ { int err; -#ifdef WOLFSSL_HAVE_SP_ECC -#ifndef WOLFSSL_SP_NO_256 +#if defined(WOLFSSL_HAVE_SP_ECC) && !defined(WOLFSSL_SP_NO_256) if ((key->ecc.idx != ECC_CUSTOM_IDX) && (ecc_sets[key->ecc.idx].id == ECC_SECP256R1)) { err = sp_ecc_mulmod_256(n, point, res, map, key->heap); } else #endif -#endif { EccsiKeyParams* params = &key->params; @@ -1437,9 +1446,8 @@ static int eccsi_mulmod_point_add(EccsiKey* key, const mp_int* n, ecc_point* point, ecc_point* a, ecc_point* res, mp_digit mp, int map) { -#ifdef WOLFSSL_HAVE_SP_ECC -#ifndef WOLFSSL_SP_NO_256 - int err = NOT_COMPILED_IN; +#if defined(WOLFSSL_HAVE_SP_ECC) && !defined(WOLFSSL_SP_NO_256) + int err = WC_NO_ERR_TRACE(NOT_COMPILED_IN); if ((key->ecc.idx != ECC_CUSTOM_IDX) && (ecc_sets[key->ecc.idx].id == ECC_SECP256R1)) { @@ -1449,7 +1457,6 @@ (void)mp; return err; -#endif #else int err; EccsiKeyParams* params = &key->params; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ed25519.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ed25519.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ed25519.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ed25519.c 2024-08-03 07:30:00.000000000 +0000 @@ -22,6 +22,12 @@ /* Based On Daniel J Bernstein's ed25519 Public Domain ref10 work. */ + +/* Possible Ed25519 enable options: + * WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN Default: OFF + * Check that the private key didn't change during the signing operations. + */ + #ifdef HAVE_CONFIG_H #include #endif @@ -30,8 +36,18 @@ #include #ifdef HAVE_ED25519 +#if FIPS_VERSION3_GE(6,0,0) + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS + + #ifdef USE_WINDOWS_API + #pragma code_seg(".fipsA$f") + #pragma const_seg(".fipsB$f") + #endif +#endif #include +#include #include #include #ifdef NO_INLINE @@ -41,6 +57,15 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_ed25519_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000006 }; + int wolfCrypt_FIPS_ED25519_sanity(void) + { + return 0; + } +#endif + #ifdef FREESCALE_LTC_ECC #include #endif @@ -182,11 +207,62 @@ return ret; } +#ifdef HAVE_ED25519_MAKE_KEY +#if FIPS_VERSION3_GE(6,0,0) +/* Performs a Pairwise Consistency Test on an Ed25519 key pair. + * + * @param [in] key Ed25519 key to test. + * @param [in] rng Random number generator to use to create random digest. + * @return 0 on success. + * @return ECC_PCT_E when signing or verification fail. + * @return Other -ve when random number generation fails. + */ +static int ed25519_pairwise_consistency_test(ed25519_key* key, WC_RNG* rng) +{ + int err = 0; + byte digest[WC_SHA512_DIGEST_SIZE]; + word32 digestLen = WC_SHA512_DIGEST_SIZE; + byte sig[ED25519_SIG_SIZE]; + word32 sigLen = ED25519_SIG_SIZE; + int res = 0; + + /* Generate a random digest to sign. */ + err = wc_RNG_GenerateBlock(rng, digest, digestLen); + if (err == 0) { + /* Sign digest without context. */ + err = wc_ed25519_sign_msg_ex(digest, digestLen, sig, &sigLen, key, + (byte)Ed25519, NULL, 0); + if (err != 0) { + /* Any sign failure means test failed. */ + err = ECC_PCT_E; + } + } + if (err == 0) { + /* Verify digest without context. */ + err = wc_ed25519_verify_msg_ex(sig, sigLen, digest, digestLen, &res, + key, (byte)Ed25519, NULL, 0); + if (err != 0) { + /* Any verification operation failure means test failed. */ + err = ECC_PCT_E; + } + /* Check whether the signature verified. */ + else if (res == 0) { + /* Test failed. */ + err = ECC_PCT_E; + } + } + + ForceZero(sig, sigLen); + + return err; +} +#endif + int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey, word32 pubKeySz) { int ret = 0; - byte az[ED25519_PRV_KEY_SIZE]; + ALIGN16 byte az[ED25519_PRV_KEY_SIZE]; #if !defined(FREESCALE_LTC_ECC) ge_p3 A; #endif @@ -244,7 +320,7 @@ #ifdef WOLF_CRYPTO_CB if (key->devId != INVALID_DEVID) { ret = wc_CryptoCb_Ed25519Gen(rng, keySz, key); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -265,8 +341,16 @@ /* put public key after private key, on the same buffer */ XMEMMOVE(key->k + ED25519_KEY_SIZE, key->p, ED25519_PUB_KEY_SIZE); +#if FIPS_VERSION3_GE(6,0,0) + ret = wc_ed25519_check_key(key); + if (ret == 0) { + ret = ed25519_pairwise_consistency_test(key, rng); + } +#endif + return ret; } +#endif /* HAVE_ED25519_MAKE_KEY */ #ifdef HAVE_ED25519_SIGN @@ -294,14 +378,17 @@ ret = se050_ed25519_sign_msg(in, inLen, out, outLen, key); #else #ifdef FREESCALE_LTC_ECC - byte tempBuf[ED25519_PRV_KEY_SIZE]; + ALIGN16 byte tempBuf[ED25519_PRV_KEY_SIZE]; ltc_pkha_ecc_point_t ltcPoint = {0}; #else ge_p3 R; #endif - byte nonce[WC_SHA512_DIGEST_SIZE]; - byte hram[WC_SHA512_DIGEST_SIZE]; - byte az[ED25519_PRV_KEY_SIZE]; + ALIGN16 byte nonce[WC_SHA512_DIGEST_SIZE]; + ALIGN16 byte hram[WC_SHA512_DIGEST_SIZE]; + ALIGN16 byte az[ED25519_PRV_KEY_SIZE]; +#ifdef WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN + byte orig_k[ED25519_KEY_SIZE]; +#endif /* sanity check on arguments */ if (in == NULL || out == NULL || outLen == NULL || key == NULL || @@ -313,7 +400,7 @@ if (key->devId != INVALID_DEVID) { ret = wc_CryptoCb_Ed25519Sign(in, inLen, out, outLen, key, type, context, contextLen); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -329,6 +416,10 @@ } *outLen = ED25519_SIG_SIZE; +#ifdef WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN + XMEMCPY(orig_k, key->k, ED25519_KEY_SIZE); +#endif + /* step 1: create nonce to use where nonce is r in r = H(h_b, ... ,h_2b-1,M) */ ret = ed25519_hash(key, key->k, ED25519_KEY_SIZE, az); @@ -439,6 +530,18 @@ sc_muladd(out + (ED25519_SIG_SIZE/2), hram, az, nonce); #endif #endif /* WOLFSSL_SE050 */ + +#ifdef WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN + { + int i; + byte c = 0; + for (i = 0; i < ED25519_KEY_SIZE; i++) { + c |= key->k[i] ^ orig_k[i]; + } + ret = ctMaskGT(c, 0) & SIG_VERIFY_E; + } +#endif + return ret; } @@ -595,15 +698,14 @@ return ed25519_hash_update(key, sha, msgSegment, msgSegmentLen); } -/* Low part of order in big endian. */ -static const byte ed25519_low_order[] = { - 0x14, 0xde, 0xf9, 0xde, 0xa2, 0xf7, 0x9c, 0xd6, - 0x58, 0x12, 0x63, 0x1a, 0x5c, 0xf5, 0xd3, 0xed +/* ed25519 order in little endian. */ +static const byte ed25519_order[] = { + 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, + 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 }; -#define ED25519_SIG_LOW_ORDER_IDX \ - ((int)(ED25519_SIG_SIZE/2 + sizeof(ed25519_low_order) - 1)) - /* sig is array of bytes containing the signature sigLen is the length of sig byte array @@ -615,13 +717,14 @@ int* res, ed25519_key* key, wc_Sha512 *sha) { - byte rcheck[ED25519_KEY_SIZE]; - byte h[WC_SHA512_DIGEST_SIZE]; + ALIGN16 byte rcheck[ED25519_KEY_SIZE]; + ALIGN16 byte h[WC_SHA512_DIGEST_SIZE]; #ifndef FREESCALE_LTC_ECC ge_p3 A; ge_p2 R; #endif int ret; + int i; /* sanity check on arguments */ if (sig == NULL || res == NULL || key == NULL) @@ -637,33 +740,19 @@ * 2^252 + 0x14def9dea2f79cd65812631a5cf5d3ed * = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed */ - if (sig[ED25519_SIG_SIZE-1] > 0x10) - return BAD_FUNC_ARG; - if (sig[ED25519_SIG_SIZE-1] == 0x10) { - int i = ED25519_SIG_SIZE-1; - int j; - - /* Check high zeros. */ - for (--i; i > ED25519_SIG_LOW_ORDER_IDX; i--) { - if (sig[i] > 0x00) - break; - } - /* Did we see all zeros up to lower order index? */ - if (i == ED25519_SIG_LOW_ORDER_IDX) { - /* Check lower part. */ - for (j = 0; j < (int)sizeof(ed25519_low_order); j++, i--) { - /* Check smaller. */ - if (sig[i] < ed25519_low_order[j]) - break; - /* Check bigger. */ - if (sig[i] > ed25519_low_order[j]) - return BAD_FUNC_ARG; - } - /* Check equal - all bytes match. */ - if (i == ED25519_SIG_SIZE/2 - 1) - return BAD_FUNC_ARG; - } + + /* Check S is not larger than or equal to order. */ + for (i = (int)sizeof(ed25519_order) - 1; i >= 0; i--) { + /* Bigger than order. */ + if (sig[ED25519_SIG_SIZE/2 + i] > ed25519_order[i]) + return BAD_FUNC_ARG; + /* Less than order. */ + if (sig[ED25519_SIG_SIZE/2 + i] < ed25519_order[i]) + break; } + /* Check equal - all bytes match. */ + if (i == -1) + return BAD_FUNC_ARG; /* uncompress A (public key), test if valid, and negate it */ #ifndef FREESCALE_LTC_ECC @@ -769,7 +858,7 @@ if (key->devId != INVALID_DEVID) { ret = wc_CryptoCb_Ed25519Verify(sig, sigLen, msg, msgLen, res, key, type, context, contextLen); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1031,7 +1120,7 @@ if (ret == 0) { key->pubKeySet = 1; - if (key->privKeySet && (!trusted)) { + if (!trusted) { ret = wc_ed25519_check_key(key); } } @@ -1232,18 +1321,83 @@ #endif /* HAVE_ED25519_KEY_EXPORT */ -/* check the private and public keys match */ +/* Check the public key is valid. + * + * When private key available, check the calculated public key matches. + * When no private key, check Y is in range and an X is able to be calculated. + * + * @param [in] key Ed25519 private/public key. + * @return 0 otherwise. + * @return BAD_FUNC_ARG when key is NULL. + * @return PUBLIC_KEY_E when the public key is not set, doesn't match or is + * invalid. + * @return other -ve value on hash failure. + */ int wc_ed25519_check_key(ed25519_key* key) { int ret = 0; - unsigned char pubKey[ED25519_PUB_KEY_SIZE]; - if (!key->pubKeySet) + /* Validate parameter. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + + /* Check we have a public key to check. */ + if ((ret == 0) && (!key->pubKeySet)) { ret = PUBLIC_KEY_E; - if (ret == 0) + } + +#ifdef HAVE_ED25519_MAKE_KEY + /* If we have a private key just make the public key and compare. */ + if ((ret == 0) && (key->privKeySet)) { + ALIGN16 unsigned char pubKey[ED25519_PUB_KEY_SIZE]; + ret = wc_ed25519_make_public(key, pubKey, sizeof(pubKey)); - if (ret == 0 && XMEMCMP(pubKey, key->p, ED25519_PUB_KEY_SIZE) != 0) - ret = PUBLIC_KEY_E; + if (ret == 0 && XMEMCMP(pubKey, key->p, ED25519_PUB_KEY_SIZE) != 0) + ret = PUBLIC_KEY_E; + } +#else + (void)key; +#endif /* HAVE_ED25519_MAKE_KEY */ + + /* No private key (or ability to make a public key), check Y is valid. */ + if ((ret == 0) +#ifdef HAVE_ED25519_MAKE_KEY + && (!key->privKeySet) +#endif + ) { + /* Verify that Q is not identity element 0. + * 0 has no representation for Ed25519. */ + + /* Verify that xQ and yQ are integers in the interval [0, p - 1]. + * Only have yQ so check that ordinate. p = 2^255 - 19 */ + if ((key->p[ED25519_PUB_KEY_SIZE - 1] & 0x7f) == 0x7f) { + int i; + + ret = PUBLIC_KEY_E; + /* Check up to last byte. */ + for (i = ED25519_PUB_KEY_SIZE - 2; i > 0; i--) { + if (key->p[i] != 0xff) { + ret = 0; + break; + } + } + /* Bits are all one up to last byte - check less than -19. */ + if ((ret == WC_NO_ERR_TRACE(PUBLIC_KEY_E)) && (key->p[0] < 0xed)) { + ret = 0; + } + } + + if (ret == 0) { + /* Verify that Q is on the curve. + * Uncompressing the public key will validate yQ. */ + ge_p3 A; + + if (ge_frombytes_negate_vartime(&A, key->p) != 0) { + ret = PUBLIC_KEY_E; + } + } + } return ret; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ed448.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ed448.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ed448.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ed448.c 2024-08-03 07:30:00.000000000 +0000 @@ -25,6 +25,11 @@ * Reworked for curve448 by Sean Parkinson. */ +/* Possible Ed448 enable options: + * WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN Default: OFF + * Check that the private key didn't change during the signing operations. + */ + #ifdef HAVE_CONFIG_H #include #endif @@ -33,6 +38,15 @@ #include #ifdef HAVE_ED448 +#if FIPS_VERSION3_GE(6,0,0) + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS + + #ifdef USE_WINDOWS_API + #pragma code_seg(".fipsA$f") + #pragma const_seg(".fipsB$f") + #endif +#endif #include #include @@ -51,6 +65,14 @@ static const byte ed448Ctx[ED448CTX_SIZE+1] = "SigEd448"; #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_ed448_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000007 }; + int wolfCrypt_FIPS_ED448_sanity(void) + { + return 0; + } +#endif static int ed448_hash_init(ed448_key* key, wc_Shake *sha) { @@ -165,10 +187,60 @@ return ret; } +#if FIPS_VERSION3_GE(6,0,0) +/* Performs a Pairwise Consistency Test on an Ed448 key pair. + * + * @param [in] key Ed448 key to test. + * @param [in] rng Random number generator to use to create random digest. + * @return 0 on success. + * @return ECC_PCT_E when signing or verification fail. + * @return Other -ve when random number generation fails. + */ +static int ed448_pairwise_consistency_test(ed448_key* key, WC_RNG* rng) +{ + int err = 0; + byte digest[WC_SHA256_DIGEST_SIZE]; + word32 digestLen = WC_SHA256_DIGEST_SIZE; + byte sig[ED448_SIG_SIZE]; + word32 sigLen = ED448_SIG_SIZE; + int res = 0; + + /* Generate a random digest to sign. */ + err = wc_RNG_GenerateBlock(rng, digest, digestLen); + if (err == 0) { + /* Sign digest without context. */ + err = wc_ed448_sign_msg_ex(digest, digestLen, sig, &sigLen, key, Ed448, + NULL, 0); + if (err != 0) { + /* Any sign failure means test failed. */ + err = ECC_PCT_E; + } + } + if (err == 0) { + /* Verify digest without context. */ + err = wc_ed448_verify_msg_ex(sig, sigLen, digest, digestLen, &res, key, + Ed448, NULL, 0); + if (err != 0) { + /* Any verification operation failure means test failed. */ + err = ECC_PCT_E; + } + /* Check whether the signature verified. */ + else if (res == 0) { + /* Test failed. */ + err = ECC_PCT_E; + } + } + + ForceZero(sig, sigLen); + + return err; +} +#endif + /* Derive the public key for the private key. * * key [in] Ed448 key object. - * pubKey [in] Byte array to hold te public key. + * pubKey [in] Byte array to hold the public key. * pubKeySz [in] Size of the array in bytes. * returns BAD_FUNC_ARG when key is NULL or pubKeySz is not equal to * ED448_PUB_KEY_SIZE, @@ -198,7 +270,10 @@ az[55] |= 0x80; az[56] = 0x00; - ge448_scalarmult_base(&A, az); + ret = ge448_scalarmult_base(&A, az); + } + + if (ret == 0) { ge448_to_bytes(pubKey, &A); key->pubKeySet = 1; @@ -247,6 +322,13 @@ if (ret == 0) { /* put public key after private key, on the same buffer */ XMEMMOVE(key->k + ED448_KEY_SIZE, key->p, ED448_PUB_KEY_SIZE); + + #if FIPS_VERSION3_GE(6,0,0) + ret = wc_ed448_check_key(key); + if (ret == 0) { + ret = ed448_pairwise_consistency_test(key, rng); + } + #endif } return ret; @@ -279,6 +361,9 @@ byte hram[ED448_SIG_SIZE]; byte az[ED448_PRV_KEY_SIZE]; int ret = 0; +#ifdef WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN + byte orig_k[ED448_KEY_SIZE]; +#endif /* sanity check on arguments */ if ((in == NULL) || (out == NULL) || (outLen == NULL) || (key == NULL) || @@ -298,6 +383,10 @@ if (ret == 0) { *outLen = ED448_SIG_SIZE; +#ifdef WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN + XMEMCPY(orig_k, key->k, ED448_KEY_SIZE); +#endif + /* step 1: create nonce to use where nonce is r in r = H(h_b, ... ,h_2b-1,M) */ ret = ed448_hash(key, key->k, ED448_KEY_SIZE, az, sizeof(az)); @@ -353,13 +442,15 @@ /* step 2: computing R = rB where rB is the scalar multiplication of r and B */ - ge448_scalarmult_base(&R,nonce); - ge448_to_bytes(out,&R); + ret = ge448_scalarmult_base(&R,nonce); /* step 3: hash R + public key + message getting H(R,A,M) then creating S = (r + H(R,A,M)a) mod l */ + if (ret == 0) { + ge448_to_bytes(out,&R); - ret = ed448_hash_update(key, sha, ed448Ctx, ED448CTX_SIZE); + ret = ed448_hash_update(key, sha, ed448Ctx, ED448CTX_SIZE); + } if (ret == 0) { ret = ed448_hash_update(key, sha, &type, sizeof(type)); } @@ -391,6 +482,17 @@ sc448_muladd(out + (ED448_SIG_SIZE/2), hram, az, nonce); } +#ifdef WOLFSSL_EDDSA_CHECK_PRIV_ON_SIGN + if (ret == 0) { + int i; + byte c = 0; + for (i = 0; i < ED448_KEY_SIZE; i++) { + c |= key->k[i] ^ orig_k[i]; + } + ret = ctMaskGT(c, 0) & SIG_VERIFY_E; + } +#endif + return ret; } @@ -921,7 +1023,7 @@ ret = BAD_FUNC_ARG; } - if (inLen != ED448_PUB_KEY_SIZE) { + if ((inLen != ED448_PUB_KEY_SIZE) && (inLen != ED448_PUB_KEY_SIZE + 1)) { ret = BAD_FUNC_ARG; } @@ -950,7 +1052,7 @@ if (ret == 0) { key->pubKeySet = 1; - if (key->privKeySet && (!trusted)) { + if (!trusted) { /* Check untrusted public key data matches private key. */ ret = wc_ed448_check_key(key); } @@ -1198,31 +1300,91 @@ #endif /* HAVE_ED448_KEY_EXPORT */ -/* Check the public key of the ed448 key matches the private key. +/* Check the public key is valid. * - * key [in] Ed448 private/public key. - * returns BAD_FUNC_ARG when key is NULL, - * PUBLIC_KEY_E when the public key is not set or doesn't match, - * other -ve value on hash failure, - * 0 otherwise. + * When private key available, check the calculated public key matches. + * When no private key, check Y is in range and an X is able to be calculated. + * + * @param [in] key Ed448 private/public key. + * @return 0 otherwise. + * @return BAD_FUNC_ARG when key is NULL. + * @return PUBLIC_KEY_E when the public key is not set, doesn't match or is + * invalid. + * @return other -ve value on hash failure. */ int wc_ed448_check_key(ed448_key* key) { int ret = 0; unsigned char pubKey[ED448_PUB_KEY_SIZE]; + /* Validate parameter. */ if (key == NULL) { ret = BAD_FUNC_ARG; } + /* Check we have a public key to check. */ if (ret == 0 && !key->pubKeySet) { ret = PUBLIC_KEY_E; } - if (ret == 0) { + + /* If we have a private key just make the public key and compare. */ + if ((ret == 0) && key->privKeySet) { ret = wc_ed448_make_public(key, pubKey, sizeof(pubKey)); + if ((ret == 0) && (XMEMCMP(pubKey, key->p, ED448_PUB_KEY_SIZE) != 0)) { + ret = PUBLIC_KEY_E; + } } - if ((ret == 0) && (XMEMCMP(pubKey, key->p, ED448_PUB_KEY_SIZE) != 0)) { - ret = PUBLIC_KEY_E; + /* No private key, check Y is valid. */ + else if ((ret == 0) && (!key->privKeySet)) { + /* Verify that Q is not identity element 0. + * 0 has no representation for Ed448. */ + + /* Verify that xQ and yQ are integers in the interval [0, p - 1]. + * Only have yQ so check that ordinate. + * p = 2^448-2^224-1 = 0xff..fe..ff + */ + { + int i; + ret = PUBLIC_KEY_E; + + /* Check top part before 0xFE. */ + for (i = ED448_PUB_KEY_SIZE - 1; i > ED448_PUB_KEY_SIZE/2; i--) { + if (key->p[i] < 0xff) { + ret = 0; + break; + } + } + if (ret == WC_NO_ERR_TRACE(PUBLIC_KEY_E)) { + /* Check against 0xFE. */ + if (key->p[ED448_PUB_KEY_SIZE/2] < 0xfe) { + ret = 0; + } + else if (key->p[ED448_PUB_KEY_SIZE/2] == 0xfe) { + /* Check bottom part before last byte. */ + for (i = ED448_PUB_KEY_SIZE/2 - 1; i > 0; i--) { + if (key->p[i] != 0xff) { + ret = 0; + break; + } + } + /* Check last byte. */ + if ((ret == WC_NO_ERR_TRACE(PUBLIC_KEY_E)) && + (key->p[0] < 0xff)) { + ret = 0; + } + } + } + } + + if (ret == 0) { + /* Verify that Q is on the curve. + * Uncompressing the public key will validate yQ. */ + ge448_p2 A; + + if (ge448_from_bytes_negate_vartime(&A, key->p) != 0) { + ret = PUBLIC_KEY_E; + } + } } return ret; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/error.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/error.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/error.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/error.c 2024-08-03 07:30:00.000000000 +0000 @@ -34,6 +34,11 @@ #endif #ifndef NO_ERROR_STRINGS + +#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES_H +#include +#endif + WOLFSSL_ABI const char* wc_GetErrorString(int error) { @@ -63,7 +68,7 @@ case WC_PENDING_E: return "wolfCrypt Operation Pending (would block / eagain) error"; - case WC_NOT_PENDING_E: + case WC_NO_PENDING_E: return "wolfCrypt operation not pending error"; case MP_INIT_E : @@ -589,12 +594,52 @@ case ASN_LEN_E: return "ASN.1 length invalid"; + case SM4_GCM_AUTH_E: + return "SM4-GCM Authentication check fail"; + + case SM4_CCM_AUTH_E: + return "SM4-CCM Authentication check fail"; + + case FIPS_DEGRADED_E: + return "FIPS module in DEGRADED mode"; + + case AES_EAX_AUTH_E: + return "AES-EAX Authentication check fail"; + + case KEY_EXHAUSTED_E: + return "Key no longer usable for operation"; + + case FIPS_INVALID_VER_E: + return "Invalid FIPS version defined, check length"; + + case FIPS_DATA_SZ_E: + return "FIPS Module Data too large adjust MAX_FIPS_DATA_SZ"; + + case FIPS_CODE_SZ_E: + return "FIPS Module Code too large adjust MAX_FIPS_CODE_SZ"; + + case KDF_SRTP_KAT_FIPS_E: + return "wolfCrypt FIPS SRTP-KDF Known Answer Test Failure"; + + case ED25519_KAT_FIPS_E: + return "wolfCrypt FIPS Ed25519 Known Answer Test Failure"; + + case ED448_KAT_FIPS_E: + return "wolfCrypt FIPS Ed448 Known Answer Test Failure"; + + case PBKDF2_KAT_FIPS_E: + return "wolfCrypt FIPS PBKDF2 Known Answer Test Failure"; + default: return "unknown error number"; } } +#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES +#include +#endif + void wc_ErrorString(int error, char* buffer) { XSTRNCPY(buffer, wc_GetErrorString(error), WOLFSSL_MAX_ERROR_SZ); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/evp.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/evp.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/evp.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/evp.c 2024-08-03 07:30:00.000000000 +0000 @@ -47,7 +47,6 @@ #include #include - static const struct s_ent { const enum wc_HashType macType; const int nid; @@ -101,6 +100,9 @@ #ifndef WOLFSSL_NOSHA3_512 {WC_HASH_TYPE_SHA3_512, NID_sha3_512, "SHA3_512"}, #endif +#ifdef WOLFSSL_SM3 + {WC_HASH_TYPE_SM3, NID_sm3, "SM3"}, +#endif /* WOLFSSL_SHA512 */ #ifdef HAVE_BLAKE2 {WC_HASH_TYPE_BLAKE2B, NID_blake2b512, "BLAKE2B512"}, #endif @@ -144,14 +146,16 @@ #endif #endif /* WOLFSSL_AES_OFB */ - #ifdef WOLFSSL_AES_XTS + #if defined(WOLFSSL_AES_XTS) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) #ifdef WOLFSSL_AES_128 static const char EVP_AES_128_XTS[] = "AES-128-XTS"; #endif #ifdef WOLFSSL_AES_256 static const char EVP_AES_256_XTS[] = "AES-256-XTS"; #endif - #endif /* WOLFSSL_AES_XTS */ + #endif /* WOLFSSL_AES_XTS && + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */ #ifdef WOLFSSL_AES_CFB #ifdef WOLFSSL_AES_128 @@ -234,6 +238,13 @@ #endif #endif +#ifdef HAVE_ARIA + #include + static const char EVP_ARIA_128_GCM[] = "ARIA-128-GCM"; + static const char EVP_ARIA_192_GCM[] = "ARIA-192-GCM"; + static const char EVP_ARIA_256_GCM[] = "ARIA-256-GCM"; +#endif + #ifndef NO_DES3 static const char EVP_DES_CBC[] = "DES-CBC"; static const char EVP_DES_ECB[] = "DES-ECB"; @@ -254,6 +265,22 @@ static const char EVP_CHACHA20[] = "CHACHA20"; #endif +#ifdef WOLFSSL_SM4_ECB + static const char EVP_SM4_ECB[] = "SM4-ECB"; +#endif /* WOLFSSL_SM4_ECB */ +#ifdef WOLFSSL_SM4_CBC + static const char EVP_SM4_CBC[] = "SM4-CBC"; +#endif /* WOLFSSL_SM4_CBC */ +#ifdef WOLFSSL_SM4_CTR + static const char EVP_SM4_CTR[] = "SM4-CTR"; +#endif /* WOLFSSL_SM4_CTR */ +#ifdef WOLFSSL_SM4_GCM + static const char EVP_SM4_GCM[] = "SM4-GCM"; +#endif /* WOLFSSL_SM4_GCM */ +#ifdef WOLFSSL_SM4_CCM + static const char EVP_SM4_CCM[] = "SM4-CCM"; +#endif /* WOLFSSL_SM4_CCM */ + static const char EVP_NULL[] = "NULL"; #define EVP_CIPHER_TYPE_MATCHES(x, y) (XSTRCMP(x,y) == 0) @@ -305,7 +332,7 @@ case AES_192_OFB_TYPE: return 24; case AES_256_OFB_TYPE: return 32; #endif - #if defined(WOLFSSL_AES_XTS) + #if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) /* Two keys for XTS. */ case AES_128_XTS_TYPE: return 16 * 2; case AES_256_XTS_TYPE: return 32 * 2; @@ -343,6 +370,21 @@ #ifdef HAVE_CHACHA case CHACHA20_TYPE: return CHACHA_MAX_KEY_SZ; #endif + #ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: return 16; + #endif + #ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: return 16; + #endif + #ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: return 16; + #endif + #ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: return 16; + #endif + #ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: return 16; + #endif default: return 0; } @@ -390,7 +432,7 @@ WOLFSSL_EVP_CIPHER_CTX *wolfSSL_EVP_CIPHER_CTX_new(void) { - WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX*)XMALLOC(sizeof *ctx, + WOLFSSL_EVP_CIPHER_CTX *ctx = (WOLFSSL_EVP_CIPHER_CTX*)XMALLOC(sizeof(*ctx), NULL, DYNAMIC_TYPE_TMP_BUFFER); if (ctx) { WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_new"); @@ -495,7 +537,7 @@ #define PRINT_BUF(b, sz) { int _i; for(_i=0; _i<(sz); _i++) { \ printf("%02x(%c),", (b)[_i], (b)[_i]); if ((_i+1)%8==0)printf("\n");}} #else -#define PRINT_BUF(b, sz) +#define PRINT_BUF(b, sz) WC_DO_NOTHING #endif static int fillBuff(WOLFSSL_EVP_CIPHER_CTX *ctx, const unsigned char *in, int sz) @@ -508,7 +550,7 @@ } else { fill = sz; } - XMEMCPY(&(ctx->buf[ctx->bufUsed]), in, fill); + XMEMCPY(&(ctx->buf[ctx->bufUsed]), in, (size_t)fill); ctx->bufUsed += fill; return fill; } else return 0; @@ -516,9 +558,10 @@ static int evpCipherBlock(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out, - const unsigned char *in, int inl) + const unsigned char *in, int inLen) { int ret = 0; + word32 inl = (word32)inLen; switch (ctx->cipherType) { #if !defined(NO_AES) @@ -591,15 +634,15 @@ ret = wc_AesCfbDecrypt(&ctx->cipher.aes, out, in, inl); break; #endif -#if defined(WOLFSSL_AES_XTS) +#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) case AES_128_XTS_TYPE: case AES_256_XTS_TYPE: if (ctx->enc) ret = wc_AesXtsEncrypt(&ctx->cipher.xts, out, in, inl, - ctx->iv, ctx->ivSz); + ctx->iv, (word32)ctx->ivSz); else ret = wc_AesXtsDecrypt(&ctx->cipher.xts, out, in, inl, - ctx->iv, ctx->ivSz); + ctx->iv, (word32)ctx->ivSz); break; #endif #endif /* !NO_AES */ @@ -628,8 +671,30 @@ #ifndef NO_RC4 case ARC4_TYPE: wc_Arc4Process(&ctx->cipher.arc4, out, in, inl); - break; + break; #endif +#if defined(WOLFSSL_SM4_ECB) + case SM4_ECB_TYPE: + if (ctx->enc) + wc_Sm4EcbEncrypt(&ctx->cipher.sm4, out, in, inl); + else + wc_Sm4EcbDecrypt(&ctx->cipher.sm4, out, in, inl); + break; +#endif +#if defined(WOLFSSL_SM4_CBC) + case SM4_CBC_TYPE: + if (ctx->enc) + wc_Sm4CbcEncrypt(&ctx->cipher.sm4, out, in, inl); + else + wc_Sm4CbcDecrypt(&ctx->cipher.sm4, out, in, inl); + break; +#endif +#if defined(WOLFSSL_SM4_CTR) + case SM4_CTR_TYPE: + wc_Sm4CtrEncrypt(&ctx->cipher.sm4, out, in, inl); + break; +#endif + default: ret = WOLFSSL_FAILURE; } @@ -641,16 +706,27 @@ return (ret == 0) ? WOLFSSL_SUCCESS : WOLFSSL_FAILURE; } -#if defined(HAVE_AESGCM) -#ifndef WOLFSSL_AESGCM_STREAM +#if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM) +#if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM) static int wolfSSL_EVP_CipherUpdate_GCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx, const unsigned char *in, int inl) { if (in && inl > 0) { - byte* tmp = (byte*)XREALLOC(ctx->authIn, - ctx->authInSz + inl, NULL, DYNAMIC_TYPE_OPENSSL); + byte* tmp; + #ifdef WOLFSSL_NO_REALLOC + tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL, + DYNAMIC_TYPE_OPENSSL); + if (tmp != NULL) { + XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz); + XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authIn = NULL; + } + #else + tmp = (byte*)XREALLOC(ctx->authIn, + (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL); + #endif if (tmp) { ctx->authIn = tmp; - XMEMCPY(ctx->authIn + ctx->authInSz, in, inl); + XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl); ctx->authInSz += inl; } else { @@ -664,9 +740,134 @@ static int wolfSSL_EVP_CipherUpdate_GCM(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, + const unsigned char *in, int inLen) +{ + word32 inl = (word32)inLen; + +#if defined(WOLFSSL_SM4_GCM) || !defined(WOLFSSL_AESGCM_STREAM) +#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM) + if (ctx->cipherType == SM4_GCM_TYPE) +#endif + { + int ret = 0; + + *outl = inl; + if (out) { + /* Buffer input for one-shot API */ + if (inl > 0) { + byte* tmp; + #ifdef WOLFSSL_NO_REALLOC + tmp = (byte*)XMALLOC((size_t)(ctx->authBufferLen + inl), NULL, + DYNAMIC_TYPE_OPENSSL); + if (tmp != NULL) { + XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen); + XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authBuffer = NULL; + } + #else + tmp = (byte*)XREALLOC(ctx->authBuffer, + (size_t)(ctx->authBufferLen + inl), NULL, + DYNAMIC_TYPE_OPENSSL); + #endif + if (tmp) { + XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl); + ctx->authBufferLen += inl; + ctx->authBuffer = tmp; + *outl = 0; + } + else { + ret = MEMORY_E; + } + } + } + else { + ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, in, inl); + } + + if (ret != 0) { + *outl = 0; + return WOLFSSL_FAILURE; + } + + return WOLFSSL_SUCCESS; + } +#endif +#if defined(WOLFSSL_SM4_GCM) && defined(WOLFSSL_AESGCM_STREAM) + else +#endif +#if defined(WOLFSSL_AESGCM_STREAM) + { + int ret; + + /* When out is NULL then this is AAD. */ + if (out == NULL) { + if (ctx->enc) { + ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL, NULL, 0, + in, inl); + } + else { + ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL, NULL, 0, + in, inl); + } + } + /* When out is not NULL then this is plaintext/cipher text. */ + else { + if (ctx->enc) { + ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, out, in, inl, + NULL, 0); + } + else { + ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, out, in, inl, + NULL, 0); + } + } + *outl = (int)inl; + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + } + else { + ret = WOLFSSL_FAILURE; + } + return ret; + } +#endif /* WOLFSSL_AESGCM_STREAM */ +} +#endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM */ + +#if defined(HAVE_AESCCM) || defined(WOLFSSL_SM4_CCM) +static int wolfSSL_EVP_CipherUpdate_CCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx, + const unsigned char *in, int inl) { + if (in && inl > 0) { + byte* tmp; + #ifdef WOLFSSL_NO_REALLOC + tmp = (byte*)XMALLOC((size_t)(ctx->authInSz + inl), NULL, + DYNAMIC_TYPE_OPENSSL); + if (tmp != NULL) { + XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz); + XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authIn = NULL; + } + #else + tmp = (byte*)XREALLOC(ctx->authIn, + (size_t)(ctx->authInSz + inl), NULL, DYNAMIC_TYPE_OPENSSL); + #endif + if (tmp) { + ctx->authIn = tmp; + XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl); + ctx->authInSz += inl; + } + else { + WOLFSSL_MSG("realloc error"); + return MEMORY_E; + } + } + return 0; +} + +static int wolfSSL_EVP_CipherUpdate_CCM(WOLFSSL_EVP_CIPHER_CTX *ctx, + unsigned char *out, int *outl, const unsigned char *in, int inl) { -#ifndef WOLFSSL_AESGCM_STREAM int ret = 0; *outl = inl; @@ -674,11 +875,21 @@ /* Buffer input for one-shot API */ if (inl > 0) { byte* tmp; + #ifdef WOLFSSL_NO_REALLOC + tmp = (byte*)XMALLOC((size_t)(ctx->authBufferLen + inl), NULL, + DYNAMIC_TYPE_OPENSSL); + if (tmp != NULL) { + XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen); + XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authBuffer = NULL; + } + #else tmp = (byte*)XREALLOC(ctx->authBuffer, - ctx->authBufferLen + inl, NULL, + (size_t)(ctx->authBufferLen + inl), NULL, DYNAMIC_TYPE_OPENSSL); + #endif if (tmp) { - XMEMCPY(tmp + ctx->authBufferLen, in, inl); + XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl); ctx->authBufferLen += inl; ctx->authBuffer = tmp; *outl = 0; @@ -689,7 +900,7 @@ } } else { - ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, in, inl); + ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, in, inl); } if (ret != 0) { @@ -698,52 +909,30 @@ } return WOLFSSL_SUCCESS; -#else - int ret; - - /* When out is NULL then this is AAD. */ - if (out == NULL) { - if (ctx->enc) { - ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, NULL, NULL, 0, in, - inl); - } - else { - ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, NULL, NULL, 0, in, - inl); - } - } - /* When out is not NULL then this is plaintext/cipher text. */ - else { - if (ctx->enc) { - ret = wc_AesGcmEncryptUpdate(&ctx->cipher.aes, out, in, inl, NULL, - 0); - } - else { - ret = wc_AesGcmDecryptUpdate(&ctx->cipher.aes, out, in, inl, NULL, - 0); - } - } - *outl = inl; - if (ret == 0) { - ret = WOLFSSL_SUCCESS; - } - else { - ret = WOLFSSL_FAILURE; - } - return ret; -#endif /* WOLFSSL_AESGCM_STREAM */ } -#endif /* HAVE_AESGCM */ +#endif /* HAVE_AESCCM || WOLFSSL_SM4_CCM */ -#if defined(HAVE_AESCCM) -static int wolfSSL_EVP_CipherUpdate_CCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx, - const unsigned char *in, int inl) { +#if defined(HAVE_ARIA) +static int wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(WOLFSSL_EVP_CIPHER_CTX *ctx, + const unsigned char *in, int inl) +{ if (in && inl > 0) { - byte* tmp = (byte*)XREALLOC(ctx->authIn, - ctx->authInSz + inl, NULL, DYNAMIC_TYPE_OPENSSL); + byte* tmp; + #ifdef WOLFSSL_NO_REALLOC + tmp = (byte*)XMALLOC((size_t)ctx->authInSz + inl, NULL, + DYNAMIC_TYPE_OPENSSL); + if (tmp != NULL) { + XMEMCPY(tmp, ctx->authIn, (size_t)ctx->authInSz); + XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authIn = NULL; + } + #else + tmp = (byte*)XREALLOC(ctx->authIn, + (size_t)ctx->authInSz + inl, NULL, DYNAMIC_TYPE_OPENSSL); + #endif if (tmp) { ctx->authIn = tmp; - XMEMCPY(ctx->authIn + ctx->authInSz, in, inl); + XMEMCPY(ctx->authIn + ctx->authInSz, in, (size_t)inl); ctx->authInSz += inl; } else { @@ -754,7 +943,7 @@ return 0; } -static int wolfSSL_EVP_CipherUpdate_CCM(WOLFSSL_EVP_CIPHER_CTX *ctx, +static int wolfSSL_EVP_CipherUpdate_AriaGCM(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl) { @@ -765,11 +954,24 @@ /* Buffer input for one-shot API */ if (inl > 0) { byte* tmp; - tmp = (byte*)XREALLOC(ctx->authBuffer, - ctx->authBufferLen + inl, NULL, - DYNAMIC_TYPE_OPENSSL); + int size = ctx->authBufferLen + inl; + if (ctx->enc == 0) { /* Append extra space for the tag */ + size = WC_ARIA_GCM_GET_CIPHERTEXT_SIZE(size); + } + #ifdef WOLFSSL_NO_REALLOC + tmp = (byte*)XMALLOC((size_t)size, NULL, + DYNAMIC_TYPE_OPENSSL); + if (tmp != NULL) { + XMEMCPY(tmp, ctx->authBuffer, (size_t)ctx->authBufferLen); + XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authBuffer = NULL; + } + #else + tmp = (byte*)XREALLOC(ctx->authBuffer, (size_t)size, NULL, + DYNAMIC_TYPE_OPENSSL); + #endif if (tmp) { - XMEMCPY(tmp + ctx->authBufferLen, in, inl); + XMEMCPY(tmp + ctx->authBufferLen, in, (size_t)inl); ctx->authBufferLen += inl; ctx->authBuffer = tmp; *outl = 0; @@ -780,7 +982,7 @@ } } else { - ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, in, inl); + ret = wolfSSL_EVP_CipherUpdate_AriaGCM_AAD(ctx, in, inl); } if (ret != 0) { @@ -790,7 +992,8 @@ return WOLFSSL_SUCCESS; } -#endif /* HAVE_AESCCM */ +#endif /* HAVE_ARIA */ + /* returns WOLFSSL_SUCCESS on success and WOLFSSL_FAILURE on failure */ int wolfSSL_EVP_CipherUpdate(WOLFSSL_EVP_CIPHER_CTX *ctx, @@ -833,11 +1036,18 @@ * additional auth data */ return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl); #endif /* !defined(NO_AES) && defined(HAVE_AESCCM) */ +#if defined(HAVE_ARIA) + case ARIA_128_GCM_TYPE: + case ARIA_192_GCM_TYPE: + case ARIA_256_GCM_TYPE: + /* if out == NULL, in/inl contains the additional auth data */ + return wolfSSL_EVP_CipherUpdate_AriaGCM(ctx, out, outl, in, inl); +#endif /* defined(HAVE_ARIA) */ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) case CHACHA20_POLY1305_TYPE: if (out == NULL) { if (wc_ChaCha20Poly1305_UpdateAad(&ctx->cipher.chachaPoly, in, - inl) != 0) { + (word32)inl) != 0) { WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateAad failed"); return WOLFSSL_FAILURE; } @@ -848,7 +1058,7 @@ } else { if (wc_ChaCha20Poly1305_UpdateData(&ctx->cipher.chachaPoly, in, - out, inl) != 0) { + out, (word32)inl) != 0) { WOLFSSL_MSG("wc_ChaCha20Poly1305_UpdateData failed"); return WOLFSSL_FAILURE; } @@ -860,13 +1070,25 @@ #endif #ifdef HAVE_CHACHA case CHACHA20_TYPE: - if (wc_Chacha_Process(&ctx->cipher.chacha, out, in, inl) != 0) { + if (wc_Chacha_Process(&ctx->cipher.chacha, out, in, (word32)inl) != + 0) { WOLFSSL_MSG("wc_ChaCha_Process failed"); return WOLFSSL_FAILURE; } *outl = inl; return WOLFSSL_SUCCESS; #endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + /* if out == NULL, in/inl contains the additional auth data */ + return wolfSSL_EVP_CipherUpdate_GCM(ctx, out, outl, in, inl); +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + /* if out == NULL, in/inl contains the + * additional auth data */ + return wolfSSL_EVP_CipherUpdate_CCM(ctx, out, outl, in, inl); +#endif default: /* fall-through */ break; @@ -894,7 +1116,7 @@ * Update the last block stored if one has already been stored */ if (ctx->enc == 0) { if (ctx->lastUsed == 1) { - XMEMCPY(out, ctx->lastBlock, ctx->block_size); + XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size); *outl+= ctx->block_size; out += ctx->block_size; } @@ -923,7 +1145,7 @@ * Update the last block stored if one has already been stored */ if ((ctx->enc == 0) && (ctx->lastUsed == 1)) { PRINT_BUF(ctx->lastBlock, ctx->block_size); - XMEMCPY(out, ctx->lastBlock, ctx->block_size); + XMEMCPY(out, ctx->lastBlock, (size_t)ctx->block_size); *outl += ctx->block_size; out += ctx->block_size; ctx->lastUsed = 0; @@ -950,7 +1172,7 @@ blocks = blocks - 1; /* save last block to check padding in * EVP_CipherFinal call */ XMEMCPY(ctx->lastBlock, &out[ctx->block_size * blocks], - ctx->block_size); + (size_t)ctx->block_size); } *outl += ctx->block_size * blocks; } @@ -990,19 +1212,18 @@ return ctx->block_size - n; } -#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM)) && \ - ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \ - || FIPS_VERSION_GE(2,0)) +#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \ + ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0)) static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz) { int i; - for (i = ctrSz-1; i >= 0; i--) { + for (i = (int)ctrSz-1; i >= 0; i--) { if (++ctr[i]) break; } } -#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) || - * HAVE_FIPS_VERSION >= 2 */ +#endif int wolfSSL_EVP_CipherFinal(WOLFSSL_EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) @@ -1047,8 +1268,7 @@ ctx->authBufferLen = 0; if (ctx->authIncIv) { - IncCtr((byte*)ctx->cipher.aes.reg, - ctx->cipher.aes.nonceSz); + IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz); ctx->authIncIv = 0; } } @@ -1060,28 +1280,27 @@ *outl = 0; if (ctx->enc) { ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes, ctx->authTag, - ctx->authTagSz); + (word32)ctx->authTagSz); } else { ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes, ctx->authTag, - ctx->authTagSz); + (word32)ctx->authTagSz); if (ctx->authIncIv) { IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz); } } - if (ret == 0) { - /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */ - if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0, - (byte*)ctx->cipher.aes.reg, - ctx->ivSz) != 0) { - WOLFSSL_MSG("wc_AesGcmInit failed"); - ret = WOLFSSL_FAILURE; - } - else { - ret = WOLFSSL_SUCCESS; - } - } - else { + + if (ret == 0) + ret = WOLFSSL_SUCCESS; + else + ret = WOLFSSL_FAILURE; + + /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */ + if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0, + (byte*)ctx->cipher.aes.reg, + (word32)ctx->ivSz) != 0) + { + WOLFSSL_MSG("wc_AesGcmInit failed"); ret = WOLFSSL_FAILURE; } #endif /* WOLFSSL_AESGCM_STREAM */ @@ -1107,16 +1326,20 @@ case AES_256_CCM_TYPE: if ((ctx->authBuffer && ctx->authBufferLen > 0) || (ctx->authBufferLen == 0)) { - if (ctx->enc) + if (ctx->enc) { ret = wc_AesCcmEncrypt(&ctx->cipher.aes, out, - ctx->authBuffer, ctx->authBufferLen, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - ctx->authIn, ctx->authInSz); - else + ctx->authBuffer, (word32)ctx->authBufferLen, + ctx->iv, (word32)ctx->ivSz, ctx->authTag, + (word32)ctx->authTagSz, ctx->authIn, + (word32)ctx->authInSz); + } + else { ret = wc_AesCcmDecrypt(&ctx->cipher.aes, out, - ctx->authBuffer, ctx->authBufferLen, - ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, - ctx->authIn, ctx->authInSz); + ctx->authBuffer, (word32)ctx->authBufferLen, + ctx->iv, (word32)ctx->ivSz, ctx->authTag, + (word32)ctx->authTagSz, ctx->authIn, + (word32)ctx->authInSz); + } if (ret == 0) { ret = WOLFSSL_SUCCESS; @@ -1132,8 +1355,7 @@ ctx->authBufferLen = 0; if (ctx->authIncIv) { - IncCtr((byte*)ctx->cipher.aes.reg, - ctx->cipher.aes.nonceSz); + IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz); ctx->authIncIv = 0; } } @@ -1156,6 +1378,61 @@ break; #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) || * HAVE_FIPS_VERSION >= 2 */ +#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \ + || FIPS_VERSION_GE(2,0)) + case ARIA_128_GCM_TYPE: + case ARIA_192_GCM_TYPE: + case ARIA_256_GCM_TYPE: + if ((ctx->authBuffer && ctx->authBufferLen > 0) + || (ctx->authBufferLen == 0)) { + if (ctx->enc) + ret = wc_AriaEncrypt(&ctx->cipher.aria, out, + ctx->authBuffer, ctx->authBufferLen, + ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz, + ctx->authTag, ctx->authTagSz); + else + ret = wc_AriaDecrypt(&ctx->cipher.aria, out, + ctx->authBuffer, ctx->authBufferLen, + ctx->iv, ctx->ivSz, ctx->authIn, ctx->authInSz, + ctx->authTag, ctx->authTagSz); + + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + *outl = ctx->authBufferLen; + } + else { + ret = WOLFSSL_FAILURE; + *outl = 0; + } + + XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authBuffer = NULL; + ctx->authBufferLen = 0; + + if (ctx->authIncIv) { + IncCtr((byte*)ctx->cipher.aria.nonce, + ctx->cipher.aria.nonceSz); + ctx->authIncIv = 0; + } + } + else { + *outl = 0; + } + if (ret == WOLFSSL_SUCCESS) { + if (ctx->authIncIv) { + ctx->authIncIv = 0; + } + else { + /* Clear IV, since IV reuse is not recommended for AES GCM. */ + XMEMSET(ctx->iv, 0, ARIA_BLOCK_SIZE); + } + if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) { + ret = WOLFSSL_FAILURE; + } + } + break; +#endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) || + * HAVE_FIPS_VERSION >= 2 */ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) case CHACHA20_POLY1305_TYPE: if (wc_ChaCha20Poly1305_Final(&ctx->cipher.chachaPoly, @@ -1167,6 +1444,109 @@ *outl = 0; return WOLFSSL_SUCCESS; } + break; +#endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + if ((ctx->authBuffer && ctx->authBufferLen > 0) || + (ctx->authBufferLen == 0)) { + if (ctx->enc) + ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, out, + ctx->authBuffer, ctx->authBufferLen, + ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, + ctx->authIn, ctx->authInSz); + else + ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, out, + ctx->authBuffer, ctx->authBufferLen, + ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, + ctx->authIn, ctx->authInSz); + + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + *outl = ctx->authBufferLen; + } + else { + ret = WOLFSSL_FAILURE; + *outl = 0; + } + + XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authBuffer = NULL; + ctx->authBufferLen = 0; + + if (ctx->authIncIv) { + IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz); + ctx->authIncIv = 0; + } + } + else { + *outl = 0; + } + if (ret == WOLFSSL_SUCCESS) { + if (ctx->authIncIv) { + ctx->authIncIv = 0; + } + else { + /* Clear IV, since IV reuse is not recommended for SM4 GCM. + */ + XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE); + } + if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) { + ret = WOLFSSL_FAILURE; + } + } + break; +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + if ((ctx->authBuffer && ctx->authBufferLen > 0) || + (ctx->authBufferLen == 0)) { + if (ctx->enc) + ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, out, + ctx->authBuffer, ctx->authBufferLen, + ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, + ctx->authIn, ctx->authInSz); + else + ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, out, + ctx->authBuffer, ctx->authBufferLen, + ctx->iv, ctx->ivSz, ctx->authTag, ctx->authTagSz, + ctx->authIn, ctx->authInSz); + + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + *outl = ctx->authBufferLen; + } + else { + ret = WOLFSSL_FAILURE; + *outl = 0; + } + + XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authBuffer = NULL; + ctx->authBufferLen = 0; + + if (ctx->authIncIv) { + IncCtr((byte*)ctx->cipher.sm4.iv, ctx->cipher.sm4.nonceSz); + ctx->authIncIv = 0; + } + } + else { + *outl = 0; + } + if (ret == WOLFSSL_SUCCESS) { + if (ctx->authIncIv) { + ctx->authIncIv = 0; + } + else { + /* Clear IV, since IV reuse is not recommended + * for SM4 CCM. */ + XMEMSET(ctx->iv, 0, SM4_BLOCK_SIZE); + } + if (wolfSSL_StoreExternalIV(ctx) != WOLFSSL_SUCCESS) { + ret = WOLFSSL_FAILURE; + } + } + break; #endif default: if (!out) @@ -1207,7 +1587,7 @@ int fl; PRINT_BUF(ctx->lastBlock, ctx->block_size); if ((fl = checkPad(ctx, ctx->lastBlock)) >= 0) { - XMEMCPY(out, ctx->lastBlock, fl); + XMEMCPY(out, ctx->lastBlock, (size_t)fl); *outl = fl; if (ctx->lastUsed == 0 && ctx->bufUsed == 0) { /* return error in cases where the block length is @@ -1230,7 +1610,8 @@ } if (ret == WOLFSSL_SUCCESS) { -#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM)) && \ +#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \ ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \ || FIPS_VERSION_GE(2,0)) byte tmp = 0; @@ -1251,6 +1632,12 @@ ctx->cipherType == AES_192_CCM_TYPE || ctx->cipherType == AES_256_CCM_TYPE #endif + #ifdef WOLFSSL_SM4_GCM + || ctx->cipherType == SM4_GCM_TYPE + #endif + #ifdef WOLFSSL_SM4_CCM + || ctx->cipherType == SM4_CCM_TYPE + #endif ) { tmp = ctx->authIvGenEnable; } @@ -1259,9 +1646,9 @@ /* reset cipher state after final */ ret = wolfSSL_EVP_CipherInit(ctx, NULL, NULL, NULL, -1); -#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM)) && \ - ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \ - || FIPS_VERSION_GE(2,0)) +#if (defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM)) && \ + ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || FIPS_VERSION_GE(2,0)) if (FALSE #ifdef HAVE_AESGCM || ctx->cipherType == AES_128_GCM_TYPE || @@ -1273,8 +1660,14 @@ ctx->cipherType == AES_192_CCM_TYPE || ctx->cipherType == AES_256_CCM_TYPE #endif + #ifdef WOLFSSL_SM4_GCM + || ctx->cipherType == SM4_GCM_TYPE + #endif + #ifdef WOLFSSL_SM4_CCM + || ctx->cipherType == SM4_CCM_TYPE + #endif ) { - ctx->authIvGenEnable = tmp; + ctx->authIvGenEnable = (tmp == 1); } #endif } @@ -1319,7 +1712,7 @@ fl = ctx->block_size; } else { - XMEMCPY(out, ctx->lastBlock, fl); + XMEMCPY(out, ctx->lastBlock, (size_t)fl); } *outl = fl; } @@ -1336,7 +1729,7 @@ { if (ctx == NULL) return BAD_FUNC_ARG; switch (ctx->cipherType) { -#if !defined(NO_AES) || !defined(NO_DES3) +#if !defined(NO_AES) || !defined(NO_DES3) || defined(WOLFSSL_SM4) #if !defined(NO_AES) #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) case AES_128_CBC_TYPE: @@ -1374,10 +1767,15 @@ case AES_192_OFB_TYPE: case AES_256_OFB_TYPE: #endif -#if defined(WOLFSSL_AES_XTS) +#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) case AES_128_XTS_TYPE: case AES_256_XTS_TYPE: #endif +#if defined(HAVE_ARIA) + case ARIA_128_GCM_TYPE: + case ARIA_192_GCM_TYPE: + case ARIA_256_GCM_TYPE: +#endif case AES_128_ECB_TYPE: case AES_192_ECB_TYPE: @@ -1389,8 +1787,23 @@ case DES_EDE3_CBC_TYPE: case DES_EDE3_ECB_TYPE: #endif +#ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: +#endif +#ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: +#endif +#ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: +#endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: +#endif return ctx->block_size; -#endif /* !NO_AES || !NO_DES3 */ +#endif /* !NO_AES || !NO_DES3 || WOLFSSL_SM4 */ default: return 0; } @@ -1482,7 +1895,7 @@ return AES_256_ECB_TYPE; #endif #endif /*HAVE_AES_CBC */ -#if defined(WOLFSSL_AES_XTS) +#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) #ifdef WOLFSSL_AES_128 else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_AES_128_XTS)) return AES_128_XTS_TYPE; @@ -1545,6 +1958,14 @@ #endif #endif #endif /* !NO_AES */ +#if defined(HAVE_ARIA) + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_128_GCM)) + return ARIA_128_GCM_TYPE; + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_192_GCM)) + return ARIA_192_GCM_TYPE; + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARIA_256_GCM)) + return ARIA_256_GCM_TYPE; +#endif /* HAVE_ARIA */ #ifndef NO_RC4 else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_ARC4)) @@ -1561,94 +1982,145 @@ return CHACHA20_TYPE; #endif +#ifdef WOLFSSL_SM4_ECB + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_ECB)) + return SM4_ECB_TYPE; +#endif +#ifdef WOLFSSL_SM4_CBC + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CBC)) + return SM4_CBC_TYPE; +#endif +#ifdef WOLFSSL_SM4_CTR + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CTR)) + return SM4_CTR_TYPE; +#endif +#ifdef WOLFSSL_SM4_GCM + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_GCM)) + return SM4_GCM_TYPE; +#endif +#ifdef WOLFSSL_SM4_CCM + else if (EVP_CIPHER_TYPE_MATCHES(cipher, EVP_SM4_CCM)) + return SM4_CCM_TYPE; +#endif + else return 0; } int wolfSSL_EVP_CIPHER_block_size(const WOLFSSL_EVP_CIPHER *cipher) { - if (cipher == NULL) return BAD_FUNC_ARG; - switch (cipherType(cipher)) { + if (cipher == NULL) + return BAD_FUNC_ARG; + + switch (cipherType(cipher)) { #if !defined(NO_AES) - #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) - case AES_128_CBC_TYPE: - case AES_192_CBC_TYPE: - case AES_256_CBC_TYPE: - return AES_BLOCK_SIZE; - #endif - #if defined(HAVE_AESGCM) - case AES_128_GCM_TYPE: - case AES_192_GCM_TYPE: - case AES_256_GCM_TYPE: - return 1; - #endif - #if defined(HAVE_AESCCM) - case AES_128_CCM_TYPE: - case AES_192_CCM_TYPE: - case AES_256_CCM_TYPE: - return 1; - #endif - #if defined(WOLFSSL_AES_COUNTER) - case AES_128_CTR_TYPE: - case AES_192_CTR_TYPE: - case AES_256_CTR_TYPE: - return 1; - #endif - #if defined(HAVE_AES_ECB) - case AES_128_ECB_TYPE: - case AES_192_ECB_TYPE: - case AES_256_ECB_TYPE: - return AES_BLOCK_SIZE; - #endif - #if defined(WOLFSSL_AES_CFB) - case AES_128_CFB1_TYPE: - case AES_192_CFB1_TYPE: - case AES_256_CFB1_TYPE: - case AES_128_CFB8_TYPE: - case AES_192_CFB8_TYPE: - case AES_256_CFB8_TYPE: - case AES_128_CFB128_TYPE: - case AES_192_CFB128_TYPE: - case AES_256_CFB128_TYPE: - return 1; - #endif - #if defined(WOLFSSL_AES_OFB) - case AES_128_OFB_TYPE: - case AES_192_OFB_TYPE: - case AES_256_OFB_TYPE: - return 1; - #endif - #if defined(WOLFSSL_AES_XTS) - case AES_128_XTS_TYPE: - case AES_256_XTS_TYPE: - return 1; - #endif -#endif /* NO_AES */ + #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) + case AES_128_CBC_TYPE: + case AES_192_CBC_TYPE: + case AES_256_CBC_TYPE: + return AES_BLOCK_SIZE; + #endif + #if defined(HAVE_AESGCM) + case AES_128_GCM_TYPE: + case AES_192_GCM_TYPE: + case AES_256_GCM_TYPE: + return 1; + #endif + #if defined(HAVE_AESCCM) + case AES_128_CCM_TYPE: + case AES_192_CCM_TYPE: + case AES_256_CCM_TYPE: + return 1; + #endif + #if defined(WOLFSSL_AES_COUNTER) + case AES_128_CTR_TYPE: + case AES_192_CTR_TYPE: + case AES_256_CTR_TYPE: + return 1; + #endif + #if defined(HAVE_AES_ECB) + case AES_128_ECB_TYPE: + case AES_192_ECB_TYPE: + case AES_256_ECB_TYPE: + return AES_BLOCK_SIZE; + #endif + #if defined(WOLFSSL_AES_CFB) + case AES_128_CFB1_TYPE: + case AES_192_CFB1_TYPE: + case AES_256_CFB1_TYPE: + case AES_128_CFB8_TYPE: + case AES_192_CFB8_TYPE: + case AES_256_CFB8_TYPE: + case AES_128_CFB128_TYPE: + case AES_192_CFB128_TYPE: + case AES_256_CFB128_TYPE: + return 1; + #endif + #if defined(WOLFSSL_AES_OFB) + case AES_128_OFB_TYPE: + case AES_192_OFB_TYPE: + case AES_256_OFB_TYPE: + return 1; + #endif + #if defined(WOLFSSL_AES_XTS) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) + case AES_128_XTS_TYPE: + case AES_256_XTS_TYPE: + return 1; + #endif + #endif /* NO_AES */ -#ifndef NO_RC4 - case ARC4_TYPE: - return 1; + #ifndef NO_RC4 + case ARC4_TYPE: + return 1; + #endif +#if defined(HAVE_ARIA) + case ARIA_128_GCM_TYPE: + case ARIA_192_GCM_TYPE: + case ARIA_256_GCM_TYPE: + return 1; #endif #ifndef NO_DES3 - case DES_CBC_TYPE: return 8; - case DES_EDE3_CBC_TYPE: return 8; - case DES_ECB_TYPE: return 8; - case DES_EDE3_ECB_TYPE: return 8; + case DES_CBC_TYPE: return 8; + case DES_EDE3_CBC_TYPE: return 8; + case DES_ECB_TYPE: return 8; + case DES_EDE3_ECB_TYPE: return 8; #endif #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) - case CHACHA20_POLY1305_TYPE: - return 1; + case CHACHA20_POLY1305_TYPE: + return 1; #endif #ifdef HAVE_CHACHA - case CHACHA20_TYPE: - return 1; + case CHACHA20_TYPE: + return 1; #endif - default: - return 0; - } +#ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: + return SM4_BLOCK_SIZE; +#endif +#ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: + return SM4_BLOCK_SIZE; +#endif +#ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: + return 1; +#endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + return 1; +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + return 1; +#endif + + default: + return 0; + } } unsigned long WOLFSSL_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher) @@ -1699,7 +2171,8 @@ case AES_256_OFB_TYPE: return WOLFSSL_EVP_CIPH_OFB_MODE; #endif - #if defined(WOLFSSL_AES_XTS) + #if defined(WOLFSSL_AES_XTS) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) case AES_128_XTS_TYPE: case AES_256_XTS_TYPE: return WOLFSSL_EVP_CIPH_XTS_MODE; @@ -1709,6 +2182,13 @@ case AES_256_ECB_TYPE: return WOLFSSL_EVP_CIPH_ECB_MODE; #endif /* !NO_AES */ + #if defined(HAVE_ARIA) + case ARIA_128_GCM_TYPE: + case ARIA_192_GCM_TYPE: + case ARIA_256_GCM_TYPE: + return WOLFSSL_EVP_CIPH_GCM_MODE | + WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; + #endif #ifndef NO_DES3 case DES_CBC_TYPE: case DES_EDE3_CBC_TYPE: @@ -1730,47 +2210,73 @@ case CHACHA20_TYPE: return WOLFSSL_EVP_CIPH_STREAM_CIPHER; #endif + #ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: + return WOLFSSL_EVP_CIPH_ECB_MODE; + #endif + #ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: + return WOLFSSL_EVP_CIPH_CBC_MODE; + #endif + #ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: + return WOLFSSL_EVP_CIPH_CTR_MODE; + #endif + #ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + return WOLFSSL_EVP_CIPH_GCM_MODE | + WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; + #endif + #ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + return WOLFSSL_EVP_CIPH_CCM_MODE | + WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; + #endif default: return 0; - } + } } unsigned long WOLFSSL_EVP_CIPHER_mode(const WOLFSSL_EVP_CIPHER *cipher) { - if (cipher == NULL) return 0; - return WOLFSSL_CIPHER_mode(cipher) & WOLFSSL_EVP_CIPH_MODE; + if (cipher == NULL) + return 0; + return WOLFSSL_CIPHER_mode(cipher) & WOLFSSL_EVP_CIPH_MODE; } void wolfSSL_EVP_CIPHER_CTX_set_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags) { if (ctx != NULL) { - ctx->flags |= flags; + ctx->flags |= (unsigned long)flags; } } void wolfSSL_EVP_CIPHER_CTX_clear_flags(WOLFSSL_EVP_CIPHER_CTX *ctx, int flags) { if (ctx != NULL) { - ctx->flags &= ~flags; + ctx->flags &= (unsigned long)~flags; } } unsigned long wolfSSL_EVP_CIPHER_flags(const WOLFSSL_EVP_CIPHER *cipher) { - if (cipher == NULL) return 0; - return WOLFSSL_CIPHER_mode(cipher); + if (cipher == NULL) + return 0; + return WOLFSSL_CIPHER_mode(cipher); } -int wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *ctx, int padding) +int wolfSSL_EVP_CIPHER_CTX_set_padding(WOLFSSL_EVP_CIPHER_CTX *ctx, + int padding) { - if (ctx == NULL) return BAD_FUNC_ARG; - if (padding) { - ctx->flags &= ~WOLFSSL_EVP_CIPH_NO_PADDING; - } - else { - ctx->flags |= WOLFSSL_EVP_CIPH_NO_PADDING; - } - return 1; + if (ctx == NULL) + return BAD_FUNC_ARG; + if (padding) { + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_NO_PADDING; + } + else { + ctx->flags |= WOLFSSL_EVP_CIPH_NO_PADDING; + } + return 1; } int wolfSSL_EVP_add_digest(const WOLFSSL_EVP_MD *digest) @@ -1793,9 +2299,9 @@ { if (ctx == NULL) #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L - return; + return; #else - return 0; + return 0; #endif WOLFSSL_ENTER("wolfSSL_EVP_PKEY_CTX_free"); if (ctx->pkey != NULL) @@ -1829,7 +2335,7 @@ if (ctx == NULL) return NULL; XMEMSET(ctx, 0, sizeof(WOLFSSL_EVP_PKEY_CTX)); ctx->pkey = pkey; -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) ctx->padding = RSA_PKCS1_PADDING; ctx->md = NULL; #endif @@ -2053,9 +2559,9 @@ #endif return WOLFSSL_FAILURE; } - if (wc_ecc_shared_secret_ssh((ecc_key*)ctx->pkey->ecc->internal, - (ecc_point*)ctx->peerKey->ecc->pub_key->internal, - key, &len32) != MP_OKAY) { + if (wc_ecc_shared_secret((ecc_key*)ctx->pkey->ecc->internal, + (ecc_key*)ctx->peerKey->ecc->internal, key, &len32) + != MP_OKAY) { WOLFSSL_MSG("wc_ecc_shared_secret failed"); #if defined(ECC_TIMING_RESISTANT) && !defined(HAVE_SELFTEST) \ && (!defined(HAVE_FIPS) || \ @@ -2108,7 +2614,7 @@ return WOLFSSL_FAILURE; } /* Length of extract only is always the length of the hash. */ - *keylen = hkdfHashSz; + *keylen = (size_t)hkdfHashSz; } } else if (ctx->pkey->hkdfMode == EVP_PKEY_HKDEF_MODE_EXPAND_ONLY) { @@ -2176,14 +2682,15 @@ if (ctx->pkey->hkdfSalt != NULL) { XFREE(ctx->pkey->hkdfSalt, NULL, DYNAMIC_TYPE_SALT); } - ctx->pkey->hkdfSalt = (byte*)XMALLOC(saltSz, NULL, DYNAMIC_TYPE_SALT); + ctx->pkey->hkdfSalt = (byte*)XMALLOC((size_t)saltSz, NULL, + DYNAMIC_TYPE_SALT); if (ctx->pkey->hkdfSalt == NULL) { WOLFSSL_MSG("Failed to allocate HKDF salt buffer."); ret = WOLFSSL_FAILURE; } else { - XMEMCPY(ctx->pkey->hkdfSalt, salt, saltSz); - ctx->pkey->hkdfSaltSz = saltSz; + XMEMCPY(ctx->pkey->hkdfSalt, salt, (size_t)saltSz); + ctx->pkey->hkdfSaltSz = (word32)saltSz; } } @@ -2212,14 +2719,15 @@ if (ctx->pkey->hkdfKey != NULL) { XFREE(ctx->pkey->hkdfKey, NULL, DYNAMIC_TYPE_KEY); } - ctx->pkey->hkdfKey = (byte*)XMALLOC(keySz, NULL, DYNAMIC_TYPE_KEY); + ctx->pkey->hkdfKey = (byte*)XMALLOC((size_t)keySz, NULL, + DYNAMIC_TYPE_KEY); if (ctx->pkey->hkdfKey == NULL) { WOLFSSL_MSG("Failed to allocate HKDF key buffer."); ret = WOLFSSL_FAILURE; } else { - XMEMCPY(ctx->pkey->hkdfKey, key, keySz); - ctx->pkey->hkdfKeySz = keySz; + XMEMCPY(ctx->pkey->hkdfKey, key, (size_t)keySz); + ctx->pkey->hkdfKeySz = (word32)keySz; } } @@ -2245,17 +2753,30 @@ } if (ret == WOLFSSL_SUCCESS && info != NULL && infoSz > 0) { + unsigned char* p; /* If there's already info in the buffer, append. */ - ctx->pkey->hkdfInfo = (byte*)XREALLOC(ctx->pkey->hkdfInfo, - ctx->pkey->hkdfInfoSz + infoSz, NULL, DYNAMIC_TYPE_INFO); - if (ctx->pkey->hkdfInfo == NULL) { + #ifdef WOLFSSL_NO_REALLOC + p = (byte*)XMALLOC((size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL, + DYNAMIC_TYPE_INFO); + if (p != NULL) { + XMEMCPY(p, ctx->pkey->hkdfInfo, (size_t)ctx->pkey->hkdfInfoSz); + XFREE(ctx->pkey->hkdfInfo, NULL, DYNAMIC_TYPE_INFO); + ctx->pkey->hkdfInfo = NULL; + } + #else + p = (byte*)XREALLOC(ctx->pkey->hkdfInfo, + (size_t)(ctx->pkey->hkdfInfoSz + (word32)infoSz), NULL, + DYNAMIC_TYPE_INFO); + #endif + if (p == NULL) { WOLFSSL_MSG("Failed to reallocate larger HKDF info buffer."); ret = WOLFSSL_FAILURE; } else { + ctx->pkey->hkdfInfo = p; XMEMCPY(ctx->pkey->hkdfInfo + ctx->pkey->hkdfInfoSz, info, - infoSz); - ctx->pkey->hkdfInfoSz += infoSz; + (size_t)infoSz); + ctx->pkey->hkdfInfoSz += (word32)infoSz; } } @@ -2325,7 +2846,7 @@ (void)len; switch (ctx->pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: if (out == NULL) { if (ctx->pkey->rsa == NULL) { @@ -2342,7 +2863,7 @@ return WOLFSSL_FAILURE; } - *outLen = len; + *outLen = (size_t)len; return WOLFSSL_SUCCESS; } @@ -2350,7 +2871,7 @@ ctx->pkey->rsa, ctx->padding); if (len < 0) break; else { - *outLen = len; + *outLen = (size_t)len; return WOLFSSL_SUCCESS; } #endif /* NO_RSA */ @@ -2428,7 +2949,7 @@ (void)len; switch (ctx->pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: if (out == NULL) { if (ctx->pkey->rsa == NULL) { @@ -2445,7 +2966,7 @@ return WOLFSSL_FAILURE; } - *outLen = len; + *outLen = (size_t)len; return WOLFSSL_SUCCESS; } @@ -2454,7 +2975,7 @@ if (len < 0) break; else { - *outLen = len; + *outLen = (size_t)len; return WOLFSSL_SUCCESS; } #endif /* NO_RSA */ @@ -2509,7 +3030,7 @@ return ret; switch (ctx->pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: ctx->op = EVP_PKEY_OP_SIGN; ret = WOLFSSL_SUCCESS; @@ -2557,7 +3078,7 @@ (void)tbslen; switch (ctx->pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: { unsigned int usiglen = (unsigned int)*siglen; if (!sig) { @@ -2593,7 +3114,7 @@ return WOLFSSL_FAILURE; bytes *= 2; if (!sig) { - *siglen = bytes; + *siglen = (size_t)bytes; return WOLFSSL_SUCCESS; } if ((int)*siglen < bytes) @@ -2604,7 +3125,7 @@ return ret; if (bytes == WOLFSSL_FAILURE) return WOLFSSL_FAILURE; - *siglen = bytes; + *siglen = (size_t)bytes; return WOLFSSL_SUCCESS; } #endif /* NO_DSA */ @@ -2627,7 +3148,7 @@ ret = wc_ecc_sig_size(eckey); if (ret == 0) return WOLFSSL_FAILURE; - *siglen = ret; + *siglen = (size_t)ret; return WOLFSSL_SUCCESS; } ecdsaSig = wolfSSL_ECDSA_do_sign(tbs, (int)tbslen, ctx->pkey->ecc); @@ -2642,7 +3163,7 @@ wolfSSL_ECDSA_SIG_free(ecdsaSig); if (ret == 0) return WOLFSSL_FAILURE; - *siglen = ret; + *siglen = (size_t)ret; return WOLFSSL_SUCCESS; } #endif /* HAVE_ECC */ @@ -2671,7 +3192,7 @@ return WOLFSSL_FAILURE; switch (ctx->pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: ctx->op = EVP_PKEY_OP_VERIFY; return WOLFSSL_SUCCESS; @@ -2713,7 +3234,7 @@ return WOLFSSL_FAILURE; switch (ctx->pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: return wolfSSL_RSA_verify_ex(WC_HASH_TYPE_NONE, tbs, (unsigned int)tbslen, sig, (unsigned int)siglen, ctx->pkey->rsa, @@ -2762,6 +3283,8 @@ if (pkey == NULL) return 0; WOLFSSL_ENTER("wolfSSL_EVP_PKEY_bits"); if ((bytes = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey)) ==0) return 0; + if (bytes < 0) + return 0; return bytes*8; } @@ -2909,8 +3432,7 @@ } switch (pkey->type) { -#if !defined(HAVE_FAST_RSA) && defined(WOLFSSL_KEY_GEN) && \ - !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA) case EVP_PKEY_RSA: pkey->rsa = wolfSSL_RSA_generate_key(ctx->nbits, WC_RSA_EXPONENT, NULL, NULL); @@ -3215,7 +3737,7 @@ /* check public key */ if (a->pkey.ptr && b->pkey.ptr) { - if (XMEMCMP(a->pkey.ptr, b->pkey.ptr, a->pkey_sz) != 0) { + if (XMEMCMP(a->pkey.ptr, b->pkey.ptr, (size_t)a->pkey_sz) != 0) { return WS_RETURN_CODE(ret, WOLFSSL_FAILURE); } } @@ -3443,7 +3965,7 @@ return ret; switch (pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: { int nid; const WOLFSSL_EVP_MD *ctxmd; @@ -3469,7 +3991,7 @@ bytes = wolfSSL_BN_num_bytes(pkey->dsa->q); if (bytes == WOLFSSL_FAILURE || (int)*siglen < bytes * 2) return WOLFSSL_FAILURE; - *siglen = bytes * 2; + *siglen = (unsigned int)(bytes * 2); return WOLFSSL_SUCCESS; } #endif @@ -3539,7 +4061,7 @@ (void)siglen; switch (pkey->type) { -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) case EVP_PKEY_RSA: { int nid; const WOLFSSL_EVP_MD *ctxmd = wolfSSL_EVP_MD_CTX_md(ctx); @@ -3581,14 +4103,15 @@ pkey = wolfSSL_EVP_PKEY_new(); if (pkey != NULL) { - pkey->pkey.ptr = (char*)XMALLOC(keylen, NULL, DYNAMIC_TYPE_PUBLIC_KEY); + pkey->pkey.ptr = (char*)XMALLOC((size_t)keylen, NULL, + DYNAMIC_TYPE_PUBLIC_KEY); if (pkey->pkey.ptr == NULL && keylen > 0) { wolfSSL_EVP_PKEY_free(pkey); pkey = NULL; } else { if (keylen) { - XMEMCPY(pkey->pkey.ptr, key, keylen); + XMEMCPY(pkey->pkey.ptr, key, (size_t)keylen); } pkey->pkey_sz = keylen; pkey->type = pkey->save_type = type; @@ -3629,7 +4152,8 @@ pkey = wolfSSL_EVP_PKEY_new(); if (pkey != NULL) { - pkey->pkey.ptr = (char*)XMALLOC(len, NULL, DYNAMIC_TYPE_PUBLIC_KEY); + pkey->pkey.ptr = (char*)XMALLOC((size_t)len, NULL, + DYNAMIC_TYPE_PUBLIC_KEY); if (pkey->pkey.ptr == NULL && len > 0) { wolfSSL_EVP_PKEY_free(pkey); pkey = NULL; @@ -3637,7 +4161,7 @@ } else { if (len) { - XMEMCPY(pkey->pkey.ptr, priv, len); + XMEMCPY(pkey->pkey.ptr, priv, (size_t)len); } pkey->pkey_sz = (int)len; pkey->type = pkey->save_type = EVP_PKEY_CMAC; @@ -3664,6 +4188,86 @@ return (const unsigned char*)pkey->pkey.ptr; } +static int wolfssl_evp_md_to_hash_type(const WOLFSSL_EVP_MD *type, + int* hashType) +{ + int ret = 0; + +#ifndef NO_SHA256 + if (XSTRCMP(type, "SHA256") == 0) { + *hashType = WC_SHA256; + } + else +#endif +#ifndef NO_SHA + if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, "SHA1") == 0)) { + *hashType = WC_SHA; + } + else +#endif /* NO_SHA */ +#ifdef WOLFSSL_SHA224 + if (XSTRCMP(type, "SHA224") == 0) { + *hashType = WC_SHA224; + } + else +#endif +#ifdef WOLFSSL_SHA384 + if (XSTRCMP(type, "SHA384") == 0) { + *hashType = WC_SHA384; + } + else +#endif +#ifdef WOLFSSL_SHA512 + if (XSTRCMP(type, "SHA512") == 0) { + *hashType = WC_SHA512; + } + else +#endif +#ifdef WOLFSSL_SHA3 + #ifndef WOLFSSL_NOSHA3_224 + if (XSTRCMP(type, "SHA3_224") == 0) { + *hashType = WC_SHA3_224; + } + else + #endif + #ifndef WOLFSSL_NOSHA3_256 + if (XSTRCMP(type, "SHA3_256") == 0) { + *hashType = WC_SHA3_256; + } + else + #endif + #ifndef WOLFSSL_NOSHA3_384 + if (XSTRCMP(type, "SHA3_384") == 0) { + *hashType = WC_SHA3_384; + } + else + #endif + #ifndef WOLFSSL_NOSHA3_512 + if (XSTRCMP(type, "SHA3_512") == 0) { + *hashType = WC_SHA3_512; + } + else + #endif +#endif +#ifdef WOLFSSL_SM3 + if (XSTRCMP(type, "SM3") == 0) { + *hashType = WC_SM3; + } + else +#endif +#ifndef NO_MD5 + if (XSTRCMP(type, "MD5") == 0) { + *hashType = WC_MD5; + } + else +#endif + { + ret = BAD_FUNC_ARG; + } + + return ret; +} + /* Initialize an EVP_DigestSign/Verify operation. * Initialize a digest for RSA and ECC keys, or HMAC for HMAC key. */ @@ -3681,80 +4285,28 @@ return WOLFSSL_FAILURE; } type = wolfSSL_EVP_get_digestbynid(default_digest); - if (!type) { + if (type == NULL) { return BAD_FUNC_ARG; } } if (pkey->type == EVP_PKEY_HMAC) { - int hashType; - - #ifndef NO_SHA256 - if (XSTRCMP(type, "SHA256") == 0) { - hashType = WC_SHA256; - } else - #endif - #ifndef NO_SHA - if ((XSTRCMP(type, "SHA") == 0) || (XSTRCMP(type, "SHA1") == 0)) { - hashType = WC_SHA; - } else - #endif /* NO_SHA */ - #ifdef WOLFSSL_SHA224 - if (XSTRCMP(type, "SHA224") == 0) { - hashType = WC_SHA224; - } else - #endif - #ifdef WOLFSSL_SHA384 - if (XSTRCMP(type, "SHA384") == 0) { - hashType = WC_SHA384; - } else - #endif - #ifdef WOLFSSL_SHA512 - if (XSTRCMP(type, "SHA512") == 0) { - hashType = WC_SHA512; - } else - #endif -#ifdef WOLFSSL_SHA3 - #ifndef WOLFSSL_NOSHA3_224 - if (XSTRCMP(type, "SHA3_224") == 0) { - hashType = WC_SHA3_224; - } else - #endif - #ifndef WOLFSSL_NOSHA3_256 - if (XSTRCMP(type, "SHA3_256") == 0) { - hashType = WC_SHA3_256; - } else - #endif - #ifndef WOLFSSL_NOSHA3_384 - if (XSTRCMP(type, "SHA3_384") == 0) { - hashType = WC_SHA3_384; - } else - #endif - #ifndef WOLFSSL_NOSHA3_512 - if (XSTRCMP(type, "SHA3_512") == 0) { - hashType = WC_SHA3_512; - } else - #endif -#endif - #ifndef NO_MD5 - if (XSTRCMP(type, "MD5") == 0) { - hashType = WC_MD5; - } else - #endif - return BAD_FUNC_ARG; - - { - size_t keySz = 0; - const unsigned char* key; + int hashType; + int ret; + size_t keySz = 0; + const unsigned char* key; - key = wolfSSL_EVP_PKEY_get0_hmac(pkey, &keySz); + ret = wolfssl_evp_md_to_hash_type(type, &hashType); + if (ret != 0) { + return ret; + } - if (wc_HmacInit(&ctx->hash.hmac, NULL, INVALID_DEVID) != 0) - return WOLFSSL_FAILURE; + key = wolfSSL_EVP_PKEY_get0_hmac(pkey, &keySz); + if (wc_HmacInit(&ctx->hash.hmac, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; - if (wc_HmacSetKey(&ctx->hash.hmac, hashType, key, (word32)keySz) != 0) - return WOLFSSL_FAILURE; - } + if (wc_HmacSetKey(&ctx->hash.hmac, hashType, key, (word32)keySz) != 0) + return WOLFSSL_FAILURE; ctx->isHMAC = 1; } @@ -3797,31 +4349,47 @@ int ret; if (ctx->isHMAC) { - Hmac hmacCopy; - - if (wolfSSL_HmacCopy(&hmacCopy, &ctx->hash.hmac) != WOLFSSL_SUCCESS) +#ifdef WOLFSSL_SMALL_STACK + Hmac *hmacCopy = (Hmac *)XMALLOC(sizeof(Hmac), NULL, DYNAMIC_TYPE_OPENSSL); + if (hmacCopy == NULL) return WOLFSSL_FAILURE; - ret = wc_HmacFinal(&hmacCopy, md) == 0; - wc_HmacFree(&hmacCopy); +#else + Hmac hmacCopy[1]; +#endif + ret = wolfSSL_HmacCopy(hmacCopy, &ctx->hash.hmac); + if (ret == WOLFSSL_SUCCESS) + ret = wc_HmacFinal(hmacCopy, md) == 0; + wc_HmacFree(hmacCopy); +#ifdef WOLFSSL_SMALL_STACK + XFREE(hmacCopy, NULL, DYNAMIC_TYPE_OPENSSL); +#endif return ret; } else { - WOLFSSL_EVP_MD_CTX ctxCopy; - wolfSSL_EVP_MD_CTX_init(&ctxCopy); - - if (wolfSSL_EVP_MD_CTX_copy_ex(&ctxCopy, ctx) != WOLFSSL_SUCCESS) +#ifdef WOLFSSL_SMALL_STACK + WOLFSSL_EVP_MD_CTX *ctxCopy = (WOLFSSL_EVP_MD_CTX *)XMALLOC(sizeof(WOLFSSL_EVP_MD_CTX), NULL, DYNAMIC_TYPE_OPENSSL); + if (ctxCopy == NULL) return WOLFSSL_FAILURE; +#else + WOLFSSL_EVP_MD_CTX ctxCopy[1]; +#endif + wolfSSL_EVP_MD_CTX_init(ctxCopy); - ret = wolfSSL_EVP_DigestFinal(&ctxCopy, md, mdlen); - wolfSSL_EVP_MD_CTX_cleanup(&ctxCopy); + ret = wolfSSL_EVP_MD_CTX_copy_ex(ctxCopy, ctx); + if (ret == WOLFSSL_SUCCESS) + ret = wolfSSL_EVP_DigestFinal(ctxCopy, md, mdlen); + wolfSSL_EVP_MD_CTX_cleanup(ctxCopy); +#ifdef WOLFSSL_SMALL_STACK + XFREE(ctxCopy, NULL, DYNAMIC_TYPE_OPENSSL); +#endif return ret; } } /* Get the length of the mac based on the digest algorithm. */ -static int wolfssl_mac_len(unsigned char macType) +static unsigned int wolfssl_mac_len(unsigned char macType) { - int hashLen; + unsigned int hashLen; switch (macType) { #ifndef NO_MD5 @@ -3888,6 +4456,12 @@ #endif #endif + #ifdef WOLFSSL_SM3 + case WC_SM3: + hashLen = WC_SM3_DIGEST_SIZE; + break; + #endif /* WOLFSSL_SM3 */ + default: hashLen = 0; } @@ -3945,7 +4519,7 @@ #ifndef NO_RSA else if (ctx->pctx->pkey->type == EVP_PKEY_RSA) { if (sig == NULL) { - *siglen = wolfSSL_RSA_size(ctx->pctx->pkey->rsa); + *siglen = (size_t)wolfSSL_RSA_size(ctx->pctx->pkey->rsa); return WOLFSSL_SUCCESS; } } @@ -3954,8 +4528,8 @@ else if (ctx->pctx->pkey->type == EVP_PKEY_EC) { if (sig == NULL) { /* SEQ + INT + INT */ - *siglen = ecc_sets[ctx->pctx->pkey->ecc->group->curve_idx].size * 2 - + 8; + *siglen = (size_t)ecc_sets[ctx->pctx->pkey->ecc->group->curve_idx]. + size * 2 + 8; return WOLFSSL_SUCCESS; } } @@ -3970,13 +4544,13 @@ *siglen = hashLen; /* May be a truncated signature. */ - XMEMCPY(sig, digest, *siglen); + XMEMCPY(sig, digest, (size_t)*siglen); ret = WOLFSSL_SUCCESS; } else { /* Sign the digest. */ switch (ctx->pctx->pkey->type) { - #if !defined(NO_RSA) && !defined(HAVE_USER_RSA) + #if !defined(NO_RSA) case EVP_PKEY_RSA: { unsigned int sigSz = (unsigned int)*siglen; int nid; @@ -3998,7 +4572,7 @@ case EVP_PKEY_EC: { int len; WOLFSSL_ECDSA_SIG *ecdsaSig; - ecdsaSig = wolfSSL_ECDSA_do_sign(digest, hashLen, + ecdsaSig = wolfSSL_ECDSA_do_sign(digest, (int)hashLen, ctx->pctx->pkey->ecc); if (ecdsaSig == NULL) break; @@ -4006,7 +4580,7 @@ wolfSSL_ECDSA_SIG_free(ecdsaSig); if (len == 0) break; - *siglen = len; + *siglen = (size_t)len; ret = WOLFSSL_SUCCESS; break; } @@ -4072,14 +4646,14 @@ if (ctx->isHMAC) { /* Check HMAC result matches the signature. */ - if (XMEMCMP(sig, digest, siglen) == 0) + if (XMEMCMP(sig, digest, (size_t)siglen) == 0) return WOLFSSL_SUCCESS; return WOLFSSL_FAILURE; } else { /* Verify the signature with the digest. */ switch (ctx->pctx->pkey->type) { - #if !defined(NO_RSA) && !defined(HAVE_USER_RSA) + #if !defined(NO_RSA) case EVP_PKEY_RSA: { int nid; const WOLFSSL_EVP_MD *md = wolfSSL_EVP_MD_CTX_md(ctx); @@ -4101,7 +4675,7 @@ ecdsaSig = wolfSSL_d2i_ECDSA_SIG(NULL, &sig, (long)siglen); if (ecdsaSig == NULL) return WOLFSSL_FAILURE; - ret = wolfSSL_ECDSA_do_verify(digest, hashLen, ecdsaSig, + ret = wolfSSL_ECDSA_do_verify(digest, (int)hashLen, ecdsaSig, ctx->pctx->pkey->ecc); wolfSSL_ECDSA_SIG_free(ecdsaSig); return ret; @@ -4190,7 +4764,7 @@ } #endif /* WOLFSSL_APACHE_HTTPD */ -#if !defined(NO_PWDBASED) && !defined(NO_SHA) +#if !defined(NO_PWDBASED) && !defined(NO_SHA) && !defined(NO_HMAC) int wolfSSL_PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, const unsigned char *salt, int saltlen, int iter, @@ -4216,7 +4790,7 @@ } #endif /* !NO_PWDBASED !NO_SHA*/ -#if !defined(NO_PWDBASED) +#if !defined(NO_PWDBASED) && !defined(NO_HMAC) int wolfSSL_PKCS5_PBKDF2_HMAC(const char *pass, int passlen, const unsigned char *salt, int saltlen, int iter, @@ -4359,7 +4933,7 @@ #endif #endif - #ifdef HAVE_AES_OFB + #ifdef WOLFSSL_AES_OFB #ifdef WOLFSSL_AES_128 {AES_128_OFB_TYPE, EVP_AES_128_OFB, NID_aes_128_ofb}, #endif @@ -4371,7 +4945,8 @@ #endif #endif - #ifdef HAVE_AES_XTS + #if defined(WOLFSSL_AES_XTS) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) #ifdef WOLFSSL_AES_128 {AES_128_XTS_TYPE, EVP_AES_128_XTS, NID_aes_128_xts}, #endif @@ -4429,6 +5004,12 @@ #endif #endif +#ifdef HAVE_ARIA + {ARIA_128_GCM_TYPE, EVP_ARIA_128_GCM, NID_aria_128_gcm}, + {ARIA_192_GCM_TYPE, EVP_ARIA_192_GCM, NID_aria_192_gcm}, + {ARIA_256_GCM_TYPE, EVP_ARIA_256_GCM, NID_aria_256_gcm}, +#endif + #ifndef NO_DES3 {DES_CBC_TYPE, EVP_DES_CBC, NID_des_cbc}, {DES_ECB_TYPE, EVP_DES_ECB, NID_des_ecb}, @@ -4449,6 +5030,22 @@ {CHACHA20_TYPE, EVP_CHACHA20, NID_chacha20}, #endif +#ifdef WOLFSSL_SM4_ECB + {SM4_ECB_TYPE, EVP_SM4_ECB, NID_sm4_ecb}, +#endif +#ifdef WOLFSSL_SM4_CBC + {SM4_CBC_TYPE, EVP_SM4_CBC, NID_sm4_cbc}, +#endif +#ifdef WOLFSSL_SM4_CTR + {SM4_CTR_TYPE, EVP_SM4_CTR, NID_sm4_ctr}, +#endif +#ifdef WOLFSSL_SM4_GCM + {SM4_GCM_TYPE, EVP_SM4_GCM, NID_sm4_gcm}, +#endif +#ifdef WOLFSSL_SM4_CCM + {SM4_CCM_TYPE, EVP_SM4_CCM, NID_sm4_ccm}, +#endif + { 0, NULL, 0} }; @@ -4557,6 +5154,30 @@ #endif #endif #endif +#ifdef HAVE_ARIA + {EVP_ARIA_128_GCM, "aria-128-gcm"}, + {EVP_ARIA_128_GCM, "id-aria128-GCM"}, + {EVP_ARIA_192_GCM, "aria-192-gcm"}, + {EVP_ARIA_192_GCM, "id-aria192-GCM"}, + {EVP_ARIA_256_GCM, "aria-256-gcm"}, + {EVP_ARIA_256_GCM, "id-aria256-GCM"}, +#endif +#ifdef WOLFSSL_SM4_EBC + {EVP_SM4_ECB, "sm4-ecb"}, +#endif +#ifdef WOLFSSL_SM4_CBC + {EVP_SM4_CBC, "sm4"}, + {EVP_SM4_CBC, "sm4-cbc"}, +#endif +#ifdef WOLFSSL_SM4_CTR + {EVP_SM4_CTR, "sm4-ctr"}, +#endif +#ifdef WOLFSSL_SM4_GCM + {EVP_SM4_GCM, "sm4-gcm"}, +#endif +#ifdef WOLFSSL_SM4_CCM + {EVP_SM4_CCM, "sm4-ccm"}, +#endif #ifndef NO_RC4 {EVP_ARC4, "RC4"}, #endif @@ -4678,6 +5299,15 @@ #endif #endif +#ifdef HAVE_ARIA + case NID_aria_128_gcm: + return wolfSSL_EVP_aria_128_gcm(); + case NID_aria_192_gcm: + return wolfSSL_EVP_aria_192_gcm(); + case NID_aria_256_gcm: + return wolfSSL_EVP_aria_256_gcm(); +#endif + #ifndef NO_DES3 case NID_des_cbc: return wolfSSL_EVP_des_cbc(); @@ -4703,6 +5333,27 @@ return wolfSSL_EVP_chacha20(); #endif +#ifdef WOLFSSL_SM4_ECB + case NID_sm4_ecb: + return wolfSSL_EVP_sm4_ecb(); +#endif +#ifdef WOLFSSL_SM4_CBC + case NID_sm4_cbc: + return wolfSSL_EVP_sm4_cbc(); +#endif +#ifdef WOLFSSL_SM4_CTR + case NID_sm4_ctr: + return wolfSSL_EVP_sm4_ctr(); +#endif +#ifdef WOLFSSL_SM4_GCM + case NID_sm4_gcm: + return wolfSSL_EVP_sm4_gcm(); +#endif +#ifdef WOLFSSL_SM4_CCM + case NID_sm4_ccm: + return wolfSSL_EVP_sm4_ccm(); +#endif + default: WOLFSSL_MSG("Bad cipher id value"); } @@ -4834,6 +5485,12 @@ ret = NOT_COMPILED_IN; #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3Copy(&src->hash.digest.sm3, + &des->hash.digest.sm3); + break; + #endif case WC_HASH_TYPE_NONE: case WC_HASH_TYPE_MD2: case WC_HASH_TYPE_MD4: @@ -4901,7 +5558,7 @@ #endif /* HAVE_AES_CBC */ #ifdef WOLFSSL_AES_CFB -#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0)) #ifdef WOLFSSL_AES_128 const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_cfb1(void) { @@ -5002,7 +5659,8 @@ #endif /* WOLFSSL_AES_256 */ #endif /* WOLFSSL_AES_OFB */ - #ifdef WOLFSSL_AES_XTS + #if defined(WOLFSSL_AES_XTS) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) #ifdef WOLFSSL_AES_128 const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_xts(void) { @@ -5018,7 +5676,8 @@ return EVP_AES_256_XTS; } #endif /* WOLFSSL_AES_256 */ - #endif /* WOLFSSL_AES_XTS */ + #endif /* WOLFSSL_AES_XTS && + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */ #ifdef HAVE_AESGCM #ifdef WOLFSSL_AES_128 @@ -5081,7 +5740,6 @@ } #endif /* WOLFSSL_AES_2128 */ - #ifdef WOLFSSL_AES_192 const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void) { @@ -5129,6 +5787,24 @@ #endif /* HAVE_AES_ECB */ #endif /* NO_AES */ +#ifdef HAVE_ARIA + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_128_gcm(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_aria_128_gcm"); + return EVP_ARIA_128_GCM; + } + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_192_gcm(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_aria_192_gcm"); + return EVP_ARIA_192_GCM; + } + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_256_gcm(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_aria_256_gcm"); + return EVP_ARIA_256_GCM; + } +#endif /* HAVE_ARIA */ + #ifndef NO_DES3 const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void) { @@ -5180,6 +5856,42 @@ } #endif +#ifdef WOLFSSL_SM4_ECB + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ecb(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_sm4_ecb"); + return EVP_SM4_ECB; + } +#endif +#ifdef WOLFSSL_SM4_CBC + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_cbc(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_sm4_cbc"); + return EVP_SM4_CBC; + } +#endif +#ifdef WOLFSSL_SM4_CTR + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ctr(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_sm4_ctr"); + return EVP_SM4_CTR; + } +#endif +#ifdef WOLFSSL_SM4_GCM + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_gcm(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_sm4_gcm"); + return EVP_SM4_GCM; + } +#endif +#ifdef WOLFSSL_SM4_CCM + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ccm(void) + { + WOLFSSL_ENTER("wolfSSL_EVP_sm4_ccm"); + return EVP_SM4_CCM; + } +#endif + const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_enc_null(void) { WOLFSSL_ENTER("wolfSSL_EVP_enc_null"); @@ -5224,7 +5936,8 @@ case EVP_CTRL_SET_KEY_LENGTH: ret = wolfSSL_EVP_CIPHER_CTX_set_key_length(ctx, arg); break; -#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \ +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || \ (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) case EVP_CTRL_AEAD_SET_IVLEN: if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0) @@ -5237,6 +5950,22 @@ } else #endif /* HAVE_CHACHA && HAVE_POLY1305 */ + #if defined(WOLFSSL_SM4_GCM) + if (ctx->cipherType == SM4_GCM_TYPE) { + if (arg <= 0 || arg > SM4_BLOCK_SIZE) { + break; + } + } + else + #endif + #if defined(WOLFSSL_SM4_CCM) + if (ctx->cipherType == SM4_CCM_TYPE) { + if (arg <= 0 || arg > SM4_BLOCK_SIZE) { + break; + } + } + else + #endif { if (arg <= 0 || arg > AES_BLOCK_SIZE) break; @@ -5244,7 +5973,8 @@ ret = wolfSSL_EVP_CIPHER_CTX_set_iv_length(ctx, arg); break; -#if defined(HAVE_AESGCM) || (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) +#if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM) || \ + (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) case EVP_CTRL_AEAD_SET_IV_FIXED: if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0) break; @@ -5263,13 +5993,13 @@ break; } /* arg is 4...(ctx->ivSz - 8) */ - XMEMCPY(ctx->iv, ptr, arg); + XMEMCPY(ctx->iv, ptr, (size_t)arg); if (wc_InitRng(&rng) != 0) { WOLFSSL_MSG("wc_InitRng failed"); break; } - if (wc_RNG_GenerateBlock(&rng, ctx->iv + arg, - ctx->ivSz - arg) == 0) { + if (wc_RNG_GenerateBlock(&rng, ctx->iv + arg, + (word32)(ctx->ivSz - arg)) == 0) { ret = WOLFSSL_SUCCESS; } else { /* rng is freed immediately after if block so no need @@ -5283,7 +6013,7 @@ break; } } - #ifdef HAVE_AESGCM + #if defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM) if (ret == WOLFSSL_SUCCESS) { /* * OpenSSL requires that a EVP_CTRL_AEAD_SET_IV_FIXED @@ -5295,9 +6025,9 @@ #endif #endif /* !WC_NO_RNG */ break; -#endif /* HAVE_AESGCM || (HAVE_CHACHA && HAVE_POLY1305) */ -#if defined(HAVE_AESGCM) && !defined(_WIN32) && !defined(HAVE_SELFTEST) && \ - (!defined(HAVE_FIPS) || FIPS_VERSION_GE(2,0)) +#endif /* HAVE_AESGCM || WOLFSSL_SM4_GCM || (HAVE_CHACHA && HAVE_POLY1305) */ +#if (defined(HAVE_AESGCM) || defined(WOLFSSL_SM4_GCM)) && !defined(_WIN32) && \ + !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(2,0)) /* * Using EVP_CTRL_GCM_IV_GEN is a way to do AES-GCM encrypt/decrypt * multiple times with EVP_Cipher without having to call @@ -5321,14 +6051,14 @@ break; } if (arg <= 0 || arg > ctx->ivSz) { - XMEMCPY(ptr, ctx->iv, ctx->ivSz); + XMEMCPY(ptr, ctx->iv, (size_t)ctx->ivSz); } else { /* * Copy the last "arg" bytes of ctx->iv into the buffer at * "ptr." Not sure why OpenSSL does this, but it does. */ - XMEMCPY(ptr, ctx->iv + ctx->ivSz - arg, arg); + XMEMCPY(ptr, ctx->iv + ctx->ivSz - arg, (size_t)arg); } /* @@ -5338,8 +6068,8 @@ ctx->authIncIv = 1; ret = WOLFSSL_SUCCESS; break; -#endif /* HAVE_AESGCM && !_WIN32 && !HAVE_SELFTEST && (!HAVE_FIPS || - * FIPS_VERSION >= 2)*/ +#endif /* (HAVE_AESGCM || WOLFSSL_SM4_GCM) && !_WIN32 && !HAVE_SELFTEST && + * !HAVE_FIPS || FIPS_VERSION >= 2)*/ case EVP_CTRL_AEAD_SET_TAG: if ((ctx->flags & WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER) == 0) break; @@ -5351,17 +6081,43 @@ ctx->authTagSz = arg; ret = WOLFSSL_SUCCESS; if (ptr != NULL) { - XMEMCPY(ctx->authTag, ptr, arg); + XMEMCPY(ctx->authTag, ptr, (size_t)arg); } break; } else #endif /* HAVE_CHACHA && HAVE_POLY1305 */ +#if defined(WOLFSSL_SM4_GCM) + if (ctx->cipherType == SM4_GCM_TYPE) { + if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) { + break; + } + + XMEMCPY(ctx->authTag, ptr, (size_t)arg); + ctx->authTagSz = arg; + ret = WOLFSSL_SUCCESS; + break; + } + else +#endif +#if defined(WOLFSSL_SM4_CCM) + if (ctx->cipherType == SM4_CCM_TYPE) { + if ((arg <= 0) || (arg > SM4_BLOCK_SIZE) || (ptr == NULL)) { + break; + } + + XMEMCPY(ctx->authTag, ptr, (size_t)arg); + ctx->authTagSz = arg; + ret = WOLFSSL_SUCCESS; + break; + } + else +#endif { if(arg <= 0 || arg > 16 || (ptr == NULL)) break; - XMEMCPY(ctx->authTag, ptr, arg); + XMEMCPY(ctx->authTag, ptr, (size_t)arg); ctx->authTagSz = arg; ret = WOLFSSL_SUCCESS; break; @@ -5378,17 +6134,34 @@ } else #endif /* HAVE_CHACHA && HAVE_POLY1305 */ +#if defined(WOLFSSL_SM4_GCM) + if (ctx->cipherType == SM4_GCM_TYPE) { + if (arg <= 0 || arg > SM4_BLOCK_SIZE) { + break; + } + } + else +#endif +#if defined(WOLFSSL_SM4_CCM) + if (ctx->cipherType == SM4_CCM_TYPE) { + if (arg <= 0 || arg > SM4_BLOCK_SIZE) { + break; + } + } + else +#endif { if (arg <= 0 || arg > AES_BLOCK_SIZE) break; } if (ptr != NULL) { - XMEMCPY(ptr, ctx->authTag, arg); + XMEMCPY(ptr, ctx->authTag, (size_t)arg); ret = WOLFSSL_SUCCESS; } break; -#endif /* HAVE_AESGCM || HAVE_AESCCM || (HAVE_CHACHA && HAVE_POLY1305) */ +#endif /* HAVE_AESGCM || HAVE_AESCCM || WOLFSSL_SM4_GCM || WOLFSSL_SM4_CCM || + * HAVE_ARIA || (HAVE_CHACHA && HAVE_POLY1305) */ default: WOLFSSL_MSG("EVP_CIPHER_CTX_ctrl operation not yet handled"); break; @@ -5397,33 +6170,34 @@ } /* WOLFSSL_SUCCESS on ok */ - int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx) + static int wolfSSL_EVP_CIPHER_CTX_cleanup_cipher( + WOLFSSL_EVP_CIPHER_CTX* ctx) { - WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_cleanup"); + int ret = WOLFSSL_SUCCESS; if (ctx) { #if (!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) + switch (ctx->cipherType) { #if (defined(HAVE_AESGCM) && defined(WOLFSSL_AESGCM_STREAM)) || \ defined(HAVE_AESCCM) || \ - defined(HAVE_AESCBC) || \ + defined(HAVE_AES_CBC) || \ defined(WOLFSSL_AES_COUNTER) || \ defined(HAVE_AES_ECB) || \ - defined(HAVE_AES_CFB) || \ - defined(HAVE_AES_OFB) || \ + defined(WOLFSSL_AES_CFB) || \ + defined(WOLFSSL_AES_OFB) || \ defined(WOLFSSL_AES_XTS) - switch (ctx->cipherType) { - #if defined(HAVE_AESGCM) && defined(WOLFSSL_AESGCM_STREAM) + #if defined(HAVE_AESGCM) case AES_128_GCM_TYPE: case AES_192_GCM_TYPE: case AES_256_GCM_TYPE: - #endif /* HAVE_AESGCM && WOLFSSL_AESGCM_STREAM */ + #endif /* HAVE_AESGCM */ #if defined(HAVE_AESCCM) case AES_128_CCM_TYPE: case AES_192_CCM_TYPE: case AES_256_CCM_TYPE: #endif /* HAVE_AESCCM */ - #ifdef HAVE_AESCBC + #ifdef HAVE_AES_CBC case AES_128_CBC_TYPE: case AES_192_CBC_TYPE: case AES_256_CBC_TYPE: @@ -5438,7 +6212,7 @@ case AES_192_ECB_TYPE: case AES_256_ECB_TYPE: #endif - #ifdef HAVE_AES_CFB + #ifdef WOLFSSL_AES_CFB case AES_128_CFB1_TYPE: case AES_192_CFB1_TYPE: case AES_256_CFB1_TYPE: @@ -5449,31 +6223,81 @@ case AES_192_CFB128_TYPE: case AES_256_CFB128_TYPE: #endif - #ifdef HAVE_AES_OFB + #ifdef WOLFSSL_AES_OFB case AES_128_OFB_TYPE: case AES_192_OFB_TYPE: case AES_256_OFB_TYPE: #endif - #ifdef WOLFSSL_AES_XTS + wc_AesFree(&ctx->cipher.aes); + ctx->flags &= ~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + break; + #if defined(WOLFSSL_AES_XTS) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) case AES_128_XTS_TYPE: case AES_256_XTS_TYPE: + wc_AesXtsFree(&ctx->cipher.xts); + ctx->flags &= ~WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + break; + #endif +#endif /* AES */ + #ifdef HAVE_ARIA + case ARIA_128_GCM_TYPE: + case ARIA_192_GCM_TYPE: + case ARIA_256_GCM_TYPE: + { + int result = wc_AriaFreeCrypt(&ctx->cipher.aria); + if (result != 0) { + WOLFSSL_MSG("wc_AriaFreeCrypt failure"); + ret = result; + } + } + break; #endif - wc_AesFree(&ctx->cipher.aes); } -#endif /* AES */ #endif /* not FIPS or FIPS v2+ */ +#ifdef WOLFSSL_SM4 + switch (ctx->cipherType) { + #ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: + #endif + #ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: + #endif + #ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: + #endif + #ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + #endif + #ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + #endif + wc_Sm4Free(&ctx->cipher.sm4); + } +#endif + } + return ret; + } + + int wolfSSL_EVP_CIPHER_CTX_cleanup(WOLFSSL_EVP_CIPHER_CTX* ctx) + { + int ret = WOLFSSL_SUCCESS; + WOLFSSL_ENTER("wolfSSL_EVP_CIPHER_CTX_cleanup"); + if (ctx) { + wolfSSL_EVP_CIPHER_CTX_cleanup_cipher(ctx); ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) if (ctx->key) { - ForceZero(ctx->key, ctx->keyLen); + ForceZero(ctx->key, (word32)ctx->keyLen); XFREE(ctx->key, NULL, DYNAMIC_TYPE_OPENSSL); ctx->key = NULL; } #endif ctx->keyLen = 0; -#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) if (ctx->authBuffer) { XFREE(ctx->authBuffer, NULL, DYNAMIC_TYPE_OPENSSL); ctx->authBuffer = NULL; @@ -5489,7 +6313,7 @@ #endif } - return WOLFSSL_SUCCESS; + return ret; } /* Permanent stub for Qt compilation. */ @@ -5532,7 +6356,7 @@ goto end; if (data == NULL) { - ret = info->keySz; + ret = (int)info->keySz; goto end; } @@ -5540,10 +6364,10 @@ if (ret == WOLFSSL_FAILURE) goto end; - ret = wc_PBKDF1_ex(key, info->keySz, iv, info->ivSz, data, sz, salt, - EVP_SALT_SIZE, count, hashType, NULL); + ret = wc_PBKDF1_ex(key, (int)info->keySz, iv, (int)info->ivSz, data, sz, + salt, EVP_SALT_SIZE, count, hashType, NULL); if (ret == 0) - ret = info->keySz; + ret = (int)info->keySz; end: #ifdef WOLFSSL_SMALL_STACK @@ -5615,7 +6439,7 @@ if (ctx->ivSz == 0) { ctx->ivSz = GCM_NONCE_MID_SZ; } - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE | WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; if (enc == 0 || enc == 1) { @@ -5647,6 +6471,13 @@ } #endif + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + ret = WOLFSSL_FAILURE; + else + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } + #ifndef WOLFSSL_AESGCM_STREAM if (ret == WOLFSSL_SUCCESS && key && wc_AesGcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { @@ -5655,7 +6486,7 @@ } #endif /* !WOLFSSL_AESGCM_STREAM */ if (ret == WOLFSSL_SUCCESS && iv && - wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, ctx->ivSz)) { + wc_AesGcmSetExtIV(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) { WOLFSSL_MSG("wc_AesGcmSetExtIV() failed"); ret = WOLFSSL_FAILURE; } @@ -5667,8 +6498,8 @@ if (ret == WOLFSSL_SUCCESS && (key || (iv && ctx->cipher.aes.gcmKeySet)) && wc_AesGcmInit(&ctx->cipher.aes, key, - (key == NULL) ? 0 : ctx->keyLen, iv, - (iv == NULL) ? 0 : ctx->ivSz) != 0) { + (key == NULL) ? 0 : (word32)ctx->keyLen, iv, + (iv == NULL) ? 0 : (word32)ctx->ivSz) != 0) { WOLFSSL_MSG("wc_AesGcmInit() failed"); ret = WOLFSSL_FAILURE; } @@ -5751,7 +6582,7 @@ if (ctx->enc) { /* Calculate authentication tag. */ ret = wc_AesGcmEncryptFinal(&ctx->cipher.aes, - ctx->authTag, ctx->authTagSz); + ctx->authTag, (word32)ctx->authTagSz); /* * wc_AesGcmEncryptFinal increments the IV in * ctx->cipher.aes.reg, so we don't call IncCtr here. @@ -5760,7 +6591,7 @@ else { /* Calculate authentication tag and compare. */ ret = wc_AesGcmDecryptFinal(&ctx->cipher.aes, - ctx->authTag, ctx->authTagSz); + ctx->authTag, (word32)ctx->authTagSz); if (ctx->authIncIv) { IncCtr((byte*)ctx->cipher.aes.reg, ctx->cipher.aes.nonceSz); @@ -5769,9 +6600,9 @@ /* Reinitialize for subsequent wolfSSL_EVP_Cipher calls. */ if (wc_AesGcmInit(&ctx->cipher.aes, NULL, 0, (byte*)ctx->cipher.aes.reg, - ctx->ivSz) != 0) { + (word32)ctx->ivSz) != 0) { WOLFSSL_MSG("wc_AesGcmInit failed"); - return WOLFSSL_FATAL_ERROR; + return WOLFSSL_FAILURE; } ctx->authIncIv = 0; } @@ -5782,12 +6613,12 @@ * NULL). */ if (ctx->authIn != NULL) { - XMEMSET(ctx->authIn, 0, ctx->authInSz); + XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz); } ctx->authInSz = 0; } if (ret == 0) { - ret = len; + ret = (int)len; } return ret; @@ -5815,7 +6646,7 @@ if (ctx->ivSz == 0) { ctx->ivSz = GCM_NONCE_MID_SZ; } - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE | WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; if (enc == 0 || enc == 1) { @@ -5847,13 +6678,23 @@ } #endif + if (ret == WOLFSSL_SUCCESS) { + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) { + WOLFSSL_MSG("wc_AesInit() failed"); + ret = WOLFSSL_FAILURE; + } else + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } + } + if (ret == WOLFSSL_SUCCESS && key && - wc_AesCcmSetKey(&ctx->cipher.aes, key, ctx->keyLen)) { + wc_AesCcmSetKey(&ctx->cipher.aes, key, (word32)ctx->keyLen)) { WOLFSSL_MSG("wc_AesCcmSetKey() failed"); ret = WOLFSSL_FAILURE; } if (ret == WOLFSSL_SUCCESS && iv && - wc_AesCcmSetNonce(&ctx->cipher.aes, iv, ctx->ivSz)) { + wc_AesCcmSetNonce(&ctx->cipher.aes, iv, (word32)ctx->ivSz)) { WOLFSSL_MSG("wc_AesCcmSetNonce() failed"); ret = WOLFSSL_FAILURE; } @@ -5877,20 +6718,20 @@ /* No destination means only AAD. */ if (src != NULL && dst == NULL) { - ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, len); + ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, (int)len); } else if (src != NULL && dst != NULL) { if (ctx->enc) { ret = wc_AesCcmEncrypt(&ctx->cipher.aes, dst, src, - len, ctx->iv, ctx->ivSz, ctx->authTag, - ctx->authTagSz, ctx->authIn, - ctx->authInSz); + len, ctx->iv, (word32)ctx->ivSz, ctx->authTag, + (word32)ctx->authTagSz, ctx->authIn, + (word32)ctx->authInSz); } else { ret = wc_AesCcmDecrypt(&ctx->cipher.aes, dst, src, - len, ctx->iv, ctx->ivSz, ctx->authTag, - ctx->authTagSz, ctx->authIn, - ctx->authInSz); + len, ctx->iv, (word32)ctx->ivSz, ctx->authTag, + (word32)ctx->authTagSz, ctx->authIn, + (word32)ctx->authInSz); } if (ctx->authIncIv) { IncCtr((byte*)ctx->cipher.aes.reg, @@ -5904,12 +6745,12 @@ * NULL). */ if (ctx->authIn != NULL) { - XMEMSET(ctx->authIn, 0, ctx->authInSz); + XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz); } ctx->authInSz = 0; } if (ret == 0) { - ret = len; + ret = (int)len; } return ret; @@ -5917,6 +6758,86 @@ #endif /* HAVE_AESCCM && ((!HAVE_FIPS && !HAVE_SELFTEST) || * HAVE_FIPS_VERSION >= 2 */ +#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \ + || FIPS_VERSION_GE(2,0)) + static int EvpCipherInitAriaGCM(WOLFSSL_EVP_CIPHER_CTX* ctx, + const WOLFSSL_EVP_CIPHER* type, + const byte* key, const byte* iv, int enc) + { + int ret = WOLFSSL_SUCCESS; + + if (ctx->cipherType == ARIA_128_GCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM))) { + WOLFSSL_MSG("EVP_ARIA_128_GCM"); + ctx->cipherType = ARIA_128_GCM_TYPE; + ctx->keyLen = ARIA_128_KEY_SIZE; + } else if (ctx->cipherType == ARIA_192_GCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM))) { + WOLFSSL_MSG("EVP_ARIA_192_GCM"); + ctx->cipherType = ARIA_192_GCM_TYPE; + ctx->keyLen = ARIA_192_KEY_SIZE; + } else if (ctx->cipherType == ARIA_256_GCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM))) { + WOLFSSL_MSG("EVP_ARIA_256_GCM"); + ctx->cipherType = ARIA_256_GCM_TYPE; + ctx->keyLen = ARIA_256_KEY_SIZE; + } else { + WOLFSSL_MSG("Unrecognized cipher type"); + return WOLFSSL_FAILURE; + } + + if (ctx->authIn) { + XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authIn = NULL; + } + ctx->authInSz = 0; + + ctx->block_size = AES_BLOCK_SIZE; + ctx->authTagSz = AES_BLOCK_SIZE; + if (ctx->ivSz == 0) { + ctx->ivSz = GCM_NONCE_MID_SZ; + } + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; + ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE | + WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; + if (enc == 0 || enc == 1) { + ctx->enc = enc ? 1 : 0; + } + + switch(ctx->cipherType) { + case ARIA_128_GCM_TYPE: + ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_128BITKEY); + break; + case ARIA_192_GCM_TYPE: + ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_192BITKEY); + break; + case ARIA_256_GCM_TYPE: + ret = wc_AriaInitCrypt(&ctx->cipher.aria, MC_ALGID_ARIA_256BITKEY); + break; + default: + WOLFSSL_MSG("Not implemented cipherType"); + return WOLFSSL_NOT_IMPLEMENTED; /* This should never happen */ + } + if (ret != 0) { + WOLFSSL_MSG(MC_GetErrorString(ret)); + WOLFSSL_MSG(MC_GetError(ctx->cipher.aria.hSession)); + return WOLFSSL_FAILURE; + } + + if (key && wc_AriaSetKey(&ctx->cipher.aria, (byte *)key)) { + WOLFSSL_MSG("wc_AriaSetKey() failed"); + return WOLFSSL_FAILURE; + } + if (iv && wc_AriaGcmSetExtIV(&ctx->cipher.aria, iv, ctx->ivSz)) { + WOLFSSL_MSG("wc_AriaGcmSetIV() failed"); + return WOLFSSL_FAILURE; + } + + return WOLFSSL_SUCCESS; + } +#endif /* HAVE_ARIA && ((!HAVE_FIPS && !HAVE_SELFTEST) || + * HAVE_FIPS_VERSION >= 2 */ + /* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */ int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx, const WOLFSSL_EVP_CIPHER* type, const byte* key, @@ -5942,6 +6863,7 @@ XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher)); ctx->flags = 0; } + /* always clear buffer state */ ctx->bufUsed = 0; ctx->lastUsed = 0; @@ -5959,16 +6881,21 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CBC))) { WOLFSSL_MSG("EVP_AES_128_CBC"); ctx->cipherType = AES_128_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; ctx->keyLen = 16; ctx->block_size = AES_BLOCK_SIZE; ctx->ivSz = AES_BLOCK_SIZE; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -5984,16 +6911,21 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CBC))) { WOLFSSL_MSG("EVP_AES_192_CBC"); ctx->cipherType = AES_192_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; ctx->keyLen = 24; ctx->block_size = AES_BLOCK_SIZE; ctx->ivSz = AES_BLOCK_SIZE; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6009,16 +6941,21 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CBC))) { WOLFSSL_MSG("EVP_AES_256_CBC"); ctx->cipherType = AES_256_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; ctx->keyLen = 32; ctx->block_size = AES_BLOCK_SIZE; ctx->ivSz = AES_BLOCK_SIZE; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); return WOLFSSL_FAILURE; @@ -6073,7 +7010,8 @@ || ctx->cipherType == AES_256_CCM_TYPE || (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CCM)) #endif - ) { + ) + { if (EvpCipherInitAesCCM(ctx, type, key, iv, enc) != WOLFSSL_SUCCESS) { return WOLFSSL_FAILURE; @@ -6086,7 +7024,7 @@ if (ctx->cipherType == AES_128_CTR_TYPE || (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CTR))) { WOLFSSL_MSG("EVP_AES_128_CTR"); - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->cipherType = AES_128_CTR_TYPE; ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE; ctx->keyLen = 16; @@ -6097,9 +7035,14 @@ #endif if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 1); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 1); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6115,7 +7058,7 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CTR))) { WOLFSSL_MSG("EVP_AES_192_CTR"); ctx->cipherType = AES_192_CTR_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE; ctx->keyLen = 24; ctx->block_size = NO_PADDING_BLOCK_SIZE; @@ -6125,9 +7068,14 @@ #endif if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 1); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 1); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6143,7 +7091,7 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CTR))) { WOLFSSL_MSG("EVP_AES_256_CTR"); ctx->cipherType = AES_256_CTR_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE; ctx->keyLen = 32; ctx->block_size = NO_PADDING_BLOCK_SIZE; @@ -6153,9 +7101,14 @@ #endif if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 1); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 1); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6173,15 +7126,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_ECB))) { WOLFSSL_MSG("EVP_AES_128_ECB"); ctx->cipherType = AES_128_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; ctx->keyLen = 16; ctx->block_size = AES_BLOCK_SIZE; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, NULL, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) return WOLFSSL_FAILURE; @@ -6192,15 +7150,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_ECB))) { WOLFSSL_MSG("EVP_AES_192_ECB"); ctx->cipherType = AES_192_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; ctx->keyLen = 24; ctx->block_size = AES_BLOCK_SIZE; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, NULL, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) return WOLFSSL_FAILURE; @@ -6211,15 +7174,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_ECB))) { WOLFSSL_MSG("EVP_AES_256_ECB"); ctx->cipherType = AES_256_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; ctx->keyLen = 32; ctx->block_size = AES_BLOCK_SIZE; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, NULL, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + NULL, ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, 1); } if (ret != 0) return WOLFSSL_FAILURE; @@ -6232,15 +7200,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB1))) { WOLFSSL_MSG("EVP_AES_128_CFB1"); ctx->cipherType = AES_128_CFB1_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 16; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6256,15 +7229,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB1))) { WOLFSSL_MSG("EVP_AES_192_CFB1"); ctx->cipherType = AES_192_CFB1_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 24; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6280,15 +7258,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB1))) { WOLFSSL_MSG("EVP_AES_256_CFB1"); ctx->cipherType = AES_256_CFB1_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 32; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); return WOLFSSL_FAILURE; @@ -6308,15 +7291,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB8))) { WOLFSSL_MSG("EVP_AES_128_CFB8"); ctx->cipherType = AES_128_CFB8_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 16; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6332,15 +7320,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB8))) { WOLFSSL_MSG("EVP_AES_192_CFB8"); ctx->cipherType = AES_192_CFB8_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 24; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6356,15 +7349,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB8))) { WOLFSSL_MSG("EVP_AES_256_CFB8"); ctx->cipherType = AES_256_CFB8_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 32; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); return WOLFSSL_FAILURE; @@ -6384,15 +7382,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_CFB128))) { WOLFSSL_MSG("EVP_AES_128_CFB128"); ctx->cipherType = AES_128_CFB128_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 16; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6408,15 +7411,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_CFB128))) { WOLFSSL_MSG("EVP_AES_192_CFB128"); ctx->cipherType = AES_192_CFB128_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 24; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6432,15 +7440,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_CFB128))) { WOLFSSL_MSG("EVP_AES_256_CFB128"); ctx->cipherType = AES_256_CFB128_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CFB_MODE; ctx->keyLen = 32; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); return WOLFSSL_FAILURE; @@ -6462,15 +7475,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_OFB))) { WOLFSSL_MSG("EVP_AES_128_OFB"); ctx->cipherType = AES_128_OFB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE; ctx->keyLen = 16; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6486,15 +7504,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_192_OFB))) { WOLFSSL_MSG("EVP_AES_192_OFB"); ctx->cipherType = AES_192_OFB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE; ctx->keyLen = 24; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0) return WOLFSSL_FAILURE; } @@ -6510,15 +7533,20 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_OFB))) { WOLFSSL_MSG("EVP_AES_256_OFB"); ctx->cipherType = AES_256_OFB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_OFB_MODE; ctx->keyLen = 32; ctx->block_size = 1; if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + if (wc_AesInit(&ctx->cipher.aes, NULL, INVALID_DEVID) != 0) + return WOLFSSL_FAILURE; + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } if (key) { - ret = AesSetKey_ex(&ctx->cipher.aes, key, ctx->keyLen, iv, - AES_ENCRYPTION, 0); + ret = AesSetKey_ex(&ctx->cipher.aes, key, (word32)ctx->keyLen, + iv, AES_ENCRYPTION, 0); if (ret != 0){ WOLFSSL_MSG("AesSetKey() failed"); return WOLFSSL_FAILURE; @@ -6533,14 +7561,15 @@ } } #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AES_OFB */ - #ifdef WOLFSSL_AES_XTS + #endif /* WOLFSSL_AES_OFB */ + #if defined(WOLFSSL_AES_XTS) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) #ifdef WOLFSSL_AES_128 if (ctx->cipherType == AES_128_XTS_TYPE || (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_128_XTS))) { WOLFSSL_MSG("EVP_AES_128_XTS"); ctx->cipherType = AES_128_XTS_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_XTS_MODE; ctx->keyLen = 32; ctx->block_size = 1; @@ -6548,16 +7577,27 @@ if (iv != NULL) { if (iv != ctx->iv) /* Valgrind error when src == dst */ - XMEMCPY(ctx->iv, iv, ctx->ivSz); + XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz); } else XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0); + if (ret != 0) { + WOLFSSL_MSG("wc_AesXtsInit() failed"); + return WOLFSSL_FAILURE; + } + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } + if (key) { - ret = wc_AesXtsSetKey(&ctx->cipher.xts, key, ctx->keyLen, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); + ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key, + (word32)ctx->keyLen, + ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION); if (ret != 0) { WOLFSSL_MSG("wc_AesXtsSetKey() failed"); return WOLFSSL_FAILURE; @@ -6570,7 +7610,7 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_AES_256_XTS))) { WOLFSSL_MSG("EVP_AES_256_XTS"); ctx->cipherType = AES_256_XTS_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_XTS_MODE; ctx->keyLen = 64; ctx->block_size = 1; @@ -6578,16 +7618,27 @@ if (iv != NULL) { if (iv != ctx->iv) /* Valgrind error when src == dst */ - XMEMCPY(ctx->iv, iv, ctx->ivSz); + XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz); } else XMEMSET(ctx->iv, 0, AES_BLOCK_SIZE); if (enc == 0 || enc == 1) ctx->enc = enc ? 1 : 0; + + if (! (ctx->flags & WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED)) { + ret = wc_AesXtsInit(&ctx->cipher.xts, NULL, 0); + if (ret != 0) { + WOLFSSL_MSG("wc_AesXtsInit() failed"); + return WOLFSSL_FAILURE; + } + ctx->flags |= WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED; + } + if (key) { - ret = wc_AesXtsSetKey(&ctx->cipher.xts, key, ctx->keyLen, - ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION, NULL, 0); + ret = wc_AesXtsSetKeyNoInit(&ctx->cipher.xts, key, + (word32)ctx->keyLen, + ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION); if (ret != 0) { WOLFSSL_MSG("wc_AesXtsSetKey() failed"); return WOLFSSL_FAILURE; @@ -6595,14 +7646,32 @@ } } #endif /* WOLFSSL_AES_256 */ - #endif /* HAVE_AES_XTS */ + #endif /* WOLFSSL_AES_XTS && + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */ #endif /* NO_AES */ + #if defined(HAVE_ARIA) + if (ctx->cipherType == ARIA_128_GCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_128_GCM)) + || ctx->cipherType == ARIA_192_GCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_192_GCM)) + || ctx->cipherType == ARIA_256_GCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARIA_256_GCM)) + ) { + if (EvpCipherInitAriaGCM(ctx, type, key, iv, enc) + != WOLFSSL_SUCCESS) { + return WOLFSSL_FAILURE; + } + } + #endif /* HAVE_AESGCM && ((!HAVE_FIPS && !HAVE_SELFTEST) || + * HAVE_FIPS_VERSION >= 2 */ + + #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) if (ctx->cipherType == CHACHA20_POLY1305_TYPE || (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20_POLY1305))) { WOLFSSL_MSG("EVP_CHACHA20_POLY1305"); ctx->cipherType = CHACHA20_POLY1305_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; ctx->keyLen = CHACHA20_POLY1305_AEAD_KEYSIZE; ctx->block_size = CHACHA_CHUNK_BYTES; @@ -6619,13 +7688,13 @@ * since wc_ChaCha20Poly1305_Init() does not. */ if (key != NULL) { if (!ctx->key) { - ctx->key = (byte*)XMALLOC(ctx->keyLen, NULL, + ctx->key = (byte*)XMALLOC((size_t)ctx->keyLen, NULL, DYNAMIC_TYPE_OPENSSL); if (!ctx->key) { return MEMORY_E; } } - XMEMCPY(ctx->key, key, ctx->keyLen); + XMEMCPY(ctx->key, key, (size_t)ctx->keyLen); } if ((ctx->key != NULL && iv != NULL) && wc_ChaCha20Poly1305_Init( &ctx->cipher.chachaPoly, ctx->key, iv, ctx->enc) != 0) { @@ -6639,15 +7708,15 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_CHACHA20))) { WOLFSSL_MSG("EVP_CHACHA20"); ctx->cipherType = CHACHA20_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->keyLen = CHACHA_MAX_KEY_SZ; ctx->block_size = 1; ctx->ivSz = WOLFSSL_EVP_CHACHA_IV_BYTES; if (enc == 0 || enc == 1) { ctx->enc = (byte) enc; } - if (key != NULL && wc_Chacha_SetKey(&ctx->cipher.chacha, - key, ctx->keyLen) != 0) { + if (key != NULL && wc_Chacha_SetKey(&ctx->cipher.chacha, key, + (word32)ctx->keyLen) != 0) { WOLFSSL_MSG("wc_Chacha_SetKey() failed"); return WOLFSSL_FAILURE; } @@ -6667,12 +7736,147 @@ } } #endif +#ifdef WOLFSSL_SM4_ECB + if (ctx->cipherType == SM4_ECB_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_ECB))) { + WOLFSSL_MSG("EVP_SM4_ECB"); + ctx->cipherType = SM4_ECB_TYPE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; + ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; + ctx->keyLen = SM4_KEY_SIZE; + ctx->block_size = SM4_BLOCK_SIZE; + if (enc == 0 || enc == 1) + ctx->enc = enc ? 1 : 0; + if (key) { + ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen); + } + if (ret != 0) { + return WOLFSSL_FAILURE; + } + } +#endif +#ifdef WOLFSSL_SM4_CBC + if (ctx->cipherType == SM4_CBC_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CBC))) { + WOLFSSL_MSG("EVP_SM4_CBC"); + ctx->cipherType = SM4_CBC_TYPE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; + ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; + ctx->keyLen = SM4_KEY_SIZE; + ctx->block_size = SM4_BLOCK_SIZE; + ctx->ivSz = SM4_BLOCK_SIZE; + if (enc == 0 || enc == 1) + ctx->enc = enc ? 1 : 0; + if (key != NULL) { + ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen); + if (ret != 0) { + return WOLFSSL_FAILURE; + } + } + if (iv != NULL) { + ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv); + if (ret != 0) { + return WOLFSSL_FAILURE; + } + } + } +#endif +#ifdef WOLFSSL_SM4_CTR + if (ctx->cipherType == SM4_CTR_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CTR))) { + WOLFSSL_MSG("EVP_SM4_CTR"); + ctx->cipherType = SM4_CTR_TYPE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; + ctx->flags |= WOLFSSL_EVP_CIPH_CTR_MODE; + ctx->keyLen = SM4_KEY_SIZE; + ctx->block_size = NO_PADDING_BLOCK_SIZE; + ctx->ivSz = SM4_BLOCK_SIZE; + if (enc == 0 || enc == 1) + ctx->enc = enc ? 1 : 0; + if (key != NULL) { + ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen); + if (ret != 0) { + return WOLFSSL_FAILURE; + } + } + if (iv != NULL) { + ret = wc_Sm4SetIV(&ctx->cipher.sm4, iv); + if (ret != 0) { + return WOLFSSL_FAILURE; + } + } + } +#endif +#ifdef WOLFSSL_SM4_GCM + if (ctx->cipherType == SM4_GCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_GCM))) { + WOLFSSL_MSG("EVP_SM4_GCM"); + ctx->cipherType = SM4_GCM_TYPE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; + ctx->flags |= WOLFSSL_EVP_CIPH_GCM_MODE | + WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; + ctx->block_size = NO_PADDING_BLOCK_SIZE; + ctx->keyLen = SM4_KEY_SIZE; + if (ctx->ivSz == 0) { + ctx->ivSz = GCM_NONCE_MID_SZ; + } + ctx->authTagSz = SM4_BLOCK_SIZE; + if (ctx->authIn) { + XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authIn = NULL; + } + ctx->authInSz = 0; + if (enc == 0 || enc == 1) + ctx->enc = enc ? 1 : 0; + if (key != NULL) { + ret = wc_Sm4GcmSetKey(&ctx->cipher.sm4, key, ctx->keyLen); + if (ret != 0) { + return WOLFSSL_FAILURE; + } + } + if (iv != NULL) { + XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz); + } + } +#endif +#ifdef WOLFSSL_SM4_CCM + if (ctx->cipherType == SM4_CCM_TYPE || + (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_SM4_CCM))) { + WOLFSSL_MSG("EVP_SM4_CCM"); + ctx->cipherType = SM4_CCM_TYPE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; + ctx->flags |= WOLFSSL_EVP_CIPH_CCM_MODE | + WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER; + ctx->block_size = NO_PADDING_BLOCK_SIZE; + ctx->keyLen = SM4_KEY_SIZE; + if (ctx->ivSz == 0) { + ctx->ivSz = GCM_NONCE_MID_SZ; + } + ctx->authTagSz = SM4_BLOCK_SIZE; + if (ctx->authIn) { + XFREE(ctx->authIn, NULL, DYNAMIC_TYPE_OPENSSL); + ctx->authIn = NULL; + } + ctx->authInSz = 0; + if (enc == 0 || enc == 1) + ctx->enc = enc ? 1 : 0; + if (key != NULL) { + ret = wc_Sm4SetKey(&ctx->cipher.sm4, key, ctx->keyLen); + if (ret != 0) { + return WOLFSSL_FAILURE; + } + } + if (iv != NULL) { + XMEMCPY(ctx->iv, iv, (size_t)ctx->ivSz); + } + } +#endif #ifndef NO_DES3 if (ctx->cipherType == DES_CBC_TYPE || (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_CBC))) { WOLFSSL_MSG("EVP_DES_CBC"); ctx->cipherType = DES_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; ctx->keyLen = 8; ctx->block_size = DES_BLOCK_SIZE; @@ -6694,7 +7898,7 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_ECB))) { WOLFSSL_MSG("EVP_DES_ECB"); ctx->cipherType = DES_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; ctx->keyLen = 8; ctx->block_size = DES_BLOCK_SIZE; @@ -6714,7 +7918,7 @@ EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_CBC))) { WOLFSSL_MSG("EVP_DES_EDE3_CBC"); ctx->cipherType = DES_EDE3_CBC_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_CBC_MODE; ctx->keyLen = 24; ctx->block_size = DES_BLOCK_SIZE; @@ -6739,7 +7943,7 @@ EVP_CIPHER_TYPE_MATCHES(type, EVP_DES_EDE3_ECB))) { WOLFSSL_MSG("EVP_DES_EDE3_ECB"); ctx->cipherType = DES_EDE3_ECB_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_ECB_MODE; ctx->keyLen = 24; ctx->block_size = DES_BLOCK_SIZE; @@ -6758,13 +7962,13 @@ (type && EVP_CIPHER_TYPE_MATCHES(type, EVP_ARC4))) { WOLFSSL_MSG("ARC4"); ctx->cipherType = ARC4_TYPE; - ctx->flags &= ~WOLFSSL_EVP_CIPH_MODE; + ctx->flags &= (unsigned long)~WOLFSSL_EVP_CIPH_MODE; ctx->flags |= WOLFSSL_EVP_CIPH_STREAM_CIPHER; ctx->block_size = 1; if (ctx->keyLen == 0) /* user may have already set */ ctx->keyLen = 16; /* default to 128 */ if (key) - wc_Arc4SetKey(&ctx->cipher.arc4, key, ctx->keyLen); + wc_Arc4SetKey(&ctx->cipher.arc4, key, (word32)ctx->keyLen); } #endif /* NO_RC4 */ if (ctx->cipherType == NULL_CIPHER_TYPE || @@ -6839,6 +8043,15 @@ #endif /* NO_AES */ +#ifdef HAVE_ARIA + case ARIA_128_GCM_TYPE : + return NID_aria_128_gcm; + case ARIA_192_GCM_TYPE : + return NID_aria_192_gcm; + case ARIA_256_GCM_TYPE : + return NID_aria_256_gcm; +#endif + #ifndef NO_DES3 case DES_CBC_TYPE : return NID_des_cbc; @@ -6866,6 +8079,31 @@ return NID_chacha20; #endif +#ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE: + return NID_sm4_ecb; +#endif + +#ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE: + return NID_sm4_cbc; +#endif + +#ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE: + return NID_sm4_ctr; +#endif + +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE: + return NID_sm4_gcm; +#endif + +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE: + return NID_sm4_ccm; +#endif + case NULL_CIPHER_TYPE : WOLFSSL_ERROR_MSG("Null cipher has no NID"); FALL_THROUGH; @@ -6956,12 +8194,32 @@ return WOLFSSL_FAILURE; } - XMEMCPY(iv, ctx->iv, ivLen); + XMEMCPY(iv, ctx->iv, (size_t)ivLen); return WOLFSSL_SUCCESS; } #endif /* !NO_AES || !NO_DES3 */ + static int IsCipherTypeAEAD(unsigned char cipherType) + { + switch (cipherType) { + case AES_128_GCM_TYPE: + case AES_192_GCM_TYPE: + case AES_256_GCM_TYPE: + case AES_128_CCM_TYPE: + case AES_192_CCM_TYPE: + case AES_256_CCM_TYPE: + case ARIA_128_GCM_TYPE: + case ARIA_192_GCM_TYPE: + case ARIA_256_GCM_TYPE: + case SM4_GCM_TYPE: + case SM4_CCM_TYPE: + return 1; + default: + return 0; + } + } + /* Return length on ok */ int wolfSSL_EVP_Cipher(WOLFSSL_EVP_CIPHER_CTX* ctx, byte* dst, byte* src, word32 len) @@ -6970,23 +8228,21 @@ WOLFSSL_ENTER("wolfSSL_EVP_Cipher"); - if (ctx == NULL || ((src == NULL || dst == NULL) && - (TRUE - #ifdef HAVE_AESGCM - && ctx->cipherType != AES_128_GCM_TYPE && - ctx->cipherType != AES_192_GCM_TYPE && - ctx->cipherType != AES_256_GCM_TYPE - #endif - #ifdef HAVE_AESCCM - && ctx->cipherType != AES_128_CCM_TYPE && - ctx->cipherType != AES_192_CCM_TYPE && - ctx->cipherType != AES_256_CCM_TYPE - #endif - ))) { + if (ctx == NULL) { WOLFSSL_MSG("Bad argument."); return WOLFSSL_FATAL_ERROR; } + if (!IsCipherTypeAEAD(ctx->cipherType)) { + /* No-op for non-AEAD ciphers */ + if (src == NULL && dst == NULL && len == 0) + return 0; + if (src == NULL || dst == NULL) { + WOLFSSL_MSG("Bad argument."); + return WOLFSSL_FATAL_ERROR; + } + } + if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT) { WOLFSSL_MSG("Cipher operation not initialized. Call " "wolfSSL_EVP_CipherInit."); @@ -7006,7 +8262,7 @@ else ret = wc_AesCbcDecrypt(&ctx->cipher.aes, dst, src, len); if (ret == 0) - ret = (len / AES_BLOCK_SIZE) * AES_BLOCK_SIZE; + ret = (int)((len / AES_BLOCK_SIZE) * AES_BLOCK_SIZE); break; #endif /* HAVE_AES_CBC */ @@ -7021,7 +8277,7 @@ else ret = wc_AesCfb1Decrypt(&ctx->cipher.aes, dst, src, len); if (ret == 0) - ret = len; + ret = (int)len; break; case AES_128_CFB8_TYPE: case AES_192_CFB8_TYPE: @@ -7032,7 +8288,7 @@ else ret = wc_AesCfb8Decrypt(&ctx->cipher.aes, dst, src, len); if (ret == 0) - ret = len; + ret = (int)len; break; #endif /* !HAVE_SELFTEST && !HAVE_FIPS */ case AES_128_CFB128_TYPE: @@ -7044,7 +8300,7 @@ else ret = wc_AesCfbDecrypt(&ctx->cipher.aes, dst, src, len); if (ret == 0) - ret = len; + ret = (int)len; break; #endif /* WOLFSSL_AES_CFB */ #if defined(WOLFSSL_AES_OFB) @@ -7057,23 +8313,23 @@ else ret = wc_AesOfbDecrypt(&ctx->cipher.aes, dst, src, len); if (ret == 0) - ret = len; + ret = (int)len; break; #endif /* WOLFSSL_AES_OFB */ -#if defined(WOLFSSL_AES_XTS) +#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) case AES_128_XTS_TYPE: case AES_256_XTS_TYPE: WOLFSSL_MSG("AES XTS"); if (ctx->enc) ret = wc_AesXtsEncrypt(&ctx->cipher.xts, dst, src, len, - ctx->iv, ctx->ivSz); + ctx->iv, (word32)ctx->ivSz); else ret = wc_AesXtsDecrypt(&ctx->cipher.xts, dst, src, len, - ctx->iv, ctx->ivSz); + ctx->iv, (word32)ctx->ivSz); if (ret == 0) - ret = len; + ret = (int)len; break; -#endif /* WOLFSSL_AES_XTS */ +#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */ #if defined(HAVE_AESGCM) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \ || FIPS_VERSION_GE(2,0)) @@ -7105,7 +8361,7 @@ else ret = wc_AesEcbDecrypt(&ctx->cipher.aes, dst, src, len); if (ret == 0) - ret = (len / AES_BLOCK_SIZE) * AES_BLOCK_SIZE; + ret = (int)((len / AES_BLOCK_SIZE) * AES_BLOCK_SIZE); break; #endif #ifdef WOLFSSL_AES_COUNTER @@ -7115,11 +8371,31 @@ WOLFSSL_MSG("AES CTR"); ret = wc_AesCtrEncrypt(&ctx->cipher.aes, dst, src, len); if (ret == 0) - ret = len; + ret = (int)len; break; #endif /* WOLFSSL_AES_COUNTER */ #endif /* NO_AES */ +#if defined(HAVE_ARIA) && ((!defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)) \ + || FIPS_VERSION_GE(2,0)) + case ARIA_128_GCM_TYPE : + case ARIA_192_GCM_TYPE : + case ARIA_256_GCM_TYPE : + WOLFSSL_MSG("ARIA GCM"); + if (ctx->enc) { + ret = wc_AriaEncrypt(&ctx->cipher.aria, dst, src, len, + ctx->iv, ctx->ivSz, NULL, 0, + ctx->authTag, ctx->authTagSz); + } + else { + ret = wc_AriaDecrypt(&ctx->cipher.aria, dst, src, len, + ctx->iv, ctx->ivSz, NULL, 0, + ctx->authTag, ctx->authTagSz); + } + break; +#endif /* HAVE_ARIA&& ((!HAVE_FIPS && !HAVE_SELFTEST) || + * HAVE_FIPS_VERSION >= 2 */ + #ifndef NO_DES3 case DES_CBC_TYPE : WOLFSSL_MSG("DES CBC"); @@ -7128,7 +8404,7 @@ else wc_Des_CbcDecrypt(&ctx->cipher.des, dst, src, len); if (ret == 0) - ret = (len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE; + ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE); break; case DES_EDE3_CBC_TYPE : WOLFSSL_MSG("DES3 CBC"); @@ -7137,20 +8413,20 @@ else ret = wc_Des3_CbcDecrypt(&ctx->cipher.des3, dst, src, len); if (ret == 0) - ret = (len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE; + ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE); break; #ifdef WOLFSSL_DES_ECB case DES_ECB_TYPE : WOLFSSL_MSG("DES ECB"); ret = wc_Des_EcbEncrypt(&ctx->cipher.des, dst, src, len); if (ret == 0) - ret = (len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE; + ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE); break; case DES_EDE3_ECB_TYPE : WOLFSSL_MSG("DES3 ECB"); ret = wc_Des3_EcbEncrypt(&ctx->cipher.des3, dst, src, len); if (ret == 0) - ret = (len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE; + ret = (int)((len / DES_BLOCK_SIZE) * DES_BLOCK_SIZE); break; #endif #endif /* !NO_DES3 */ @@ -7160,14 +8436,116 @@ WOLFSSL_MSG("ARC4"); wc_Arc4Process(&ctx->cipher.arc4, dst, src, len); if (ret == 0) - ret = len; + ret = (int)len; + break; +#endif + + /* TODO: Chacha??? */ + +#ifdef WOLFSSL_SM4_ECB + case SM4_ECB_TYPE : + WOLFSSL_MSG("Sm4 ECB"); + if (ctx->enc) + ret = wc_Sm4EcbEncrypt(&ctx->cipher.sm4, dst, src, len); + else + ret = wc_Sm4EcbDecrypt(&ctx->cipher.sm4, dst, src, len); + if (ret == 0) + ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE); + break; +#endif +#ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE : + WOLFSSL_MSG("Sm4 CBC"); + if (ctx->enc) + ret = wc_Sm4CbcEncrypt(&ctx->cipher.sm4, dst, src, len); + else + ret = wc_Sm4CbcDecrypt(&ctx->cipher.sm4, dst, src, len); + if (ret == 0) + ret = (int)((len / SM4_BLOCK_SIZE) * SM4_BLOCK_SIZE); + break; +#endif +#ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE : + WOLFSSL_MSG("AES CTR"); + ret = wc_Sm4CtrEncrypt(&ctx->cipher.sm4, dst, src, len); + if (ret == 0) + ret = (int)len; + break; +#endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE : + WOLFSSL_MSG("SM4 GCM"); + /* No destination means only AAD. */ + if (src != NULL && dst == NULL) { + ret = wolfSSL_EVP_CipherUpdate_GCM_AAD(ctx, src, len); + } + else if (src != NULL && dst != NULL) { + if (ctx->enc) { + ret = wc_Sm4GcmEncrypt(&ctx->cipher.sm4, dst, src, + len, ctx->iv, ctx->ivSz, ctx->authTag, + ctx->authTagSz, ctx->authIn, + ctx->authInSz); + } + else { + ret = wc_Sm4GcmDecrypt(&ctx->cipher.sm4, dst, src, + len, ctx->iv, ctx->ivSz, ctx->authTag, + ctx->authTagSz, ctx->authIn, + ctx->authInSz); + } + if (ctx->authIncIv) { + IncCtr((byte*)ctx->cipher.sm4.iv, + ctx->cipher.sm4.nonceSz); + ctx->authIncIv = 0; + } + } + break; +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE : + WOLFSSL_MSG("SM4 CCM"); + /* No destination means only AAD. */ + if (src != NULL && dst == NULL) { + ret = wolfSSL_EVP_CipherUpdate_CCM_AAD(ctx, src, len); + } + else if (src != NULL && dst != NULL) { + if (ctx->enc) { + ret = wc_Sm4CcmEncrypt(&ctx->cipher.sm4, dst, src, + len, ctx->iv, ctx->ivSz, ctx->authTag, + ctx->authTagSz, ctx->authIn, + ctx->authInSz); + } + else { + ret = wc_Sm4CcmDecrypt(&ctx->cipher.sm4, dst, src, + len, ctx->iv, ctx->ivSz, ctx->authTag, + ctx->authTagSz, ctx->authIn, + ctx->authInSz); + } + if (ctx->authIncIv) { + IncCtr((byte*)ctx->cipher.sm4.iv, + ctx->cipher.sm4.nonceSz); + ctx->authIncIv = 0; + } + } + if (src == NULL) { + /* + * Clear any leftover AAD on final (final is when src is + * NULL). + */ + if (ctx->authIn != NULL) { + XMEMSET(ctx->authIn, 0, (size_t)ctx->authInSz); + } + ctx->authInSz = 0; + } + if (ret == 0) { + ret = (int)len; + } break; #endif case NULL_CIPHER_TYPE : WOLFSSL_MSG("NULL CIPHER"); - XMEMCPY(dst, src, len); - ret = len; + XMEMCPY(dst, src, (size_t)len); + ret = (int)len; break; default: { @@ -7177,7 +8555,7 @@ } if (ret < 0) { - if (ret == AES_GCM_AUTH_E) { + if (ret == WC_NO_ERR_TRACE(AES_GCM_AUTH_E)) { WOLFSSL_MSG("wolfSSL_EVP_Cipher failure: bad AES-GCM tag."); } WOLFSSL_MSG("wolfSSL_EVP_Cipher failure"); @@ -7228,7 +8606,7 @@ } #ifndef NO_RSA -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) static int PopulateRSAEvpPkeyDer(WOLFSSL_EVP_PKEY *pkey) { int ret = 0; @@ -7253,9 +8631,9 @@ derSz = ret; #ifdef HAVE_PKCS8 if (key->pkcs8HeaderSz) { - ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, NULL, derSz, + ret = wc_CreatePKCS8Key(NULL, &pkcs8Sz, NULL, (word32)derSz, RSAk, NULL, 0); - if (ret == LENGTH_ONLY_E) + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) ret = 0; } #endif @@ -7273,14 +8651,14 @@ } #ifdef WOLFSSL_NO_REALLOC - derBuf = (byte*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER); + derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_DER); if (derBuf != NULL) { - XMEMCPY(derBuf, pkey->pkey.ptr, pkey->pkey_sz); + XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz); XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_DER); pkey->pkey.ptr = NULL; } #else - derBuf = (byte*)XREALLOC(pkey->pkey.ptr, derSz, + derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz, pkey->heap, DYNAMIC_TYPE_DER); #endif if (derBuf == NULL) { @@ -7292,33 +8670,35 @@ pkey->pkey.ptr = (char*)derBuf; if (rsa->type == RSA_PRIVATE) { - ret = wc_RsaKeyToDer(rsa, derBuf, derSz); + ret = wc_RsaKeyToDer(rsa, derBuf, (word32)derSz); if (ret > 0) { derSz = ret; #ifdef HAVE_PKCS8 if (key->pkcs8HeaderSz) { byte* keyBuf = derBuf; int keySz = derSz; - derSz = pkcs8Sz; + word32 sz = pkcs8Sz; /* Need new buffer for PKCS8 since we can't * do this in-place */ - derBuf = (byte*)XMALLOC(pkcs8Sz, pkey->heap, + derBuf = (byte*)XMALLOC((size_t)pkcs8Sz, pkey->heap, DYNAMIC_TYPE_DER); if (derBuf != NULL) { - ret = wc_CreatePKCS8Key(derBuf, (word32*)&derSz, keyBuf, - keySz, RSAk, NULL, 0); + ret = wc_CreatePKCS8Key(derBuf, &sz, keyBuf, (word32)keySz, + RSAk, NULL, 0); XFREE(keyBuf, pkey->heap, DYNAMIC_TYPE_DER); pkey->pkey.ptr = (char*)derBuf; } - else + else { ret = MEMORY_E; + } + derSz = (int)sz; } #endif } } else { /* Public key to DER */ - ret = wc_RsaKeyToPublicDer(rsa, derBuf, derSz); + ret = wc_RsaKeyToPublicDer(rsa, derBuf, (word32)derSz); if (ret > 0) derSz = ret; } @@ -7384,12 +8764,12 @@ } } -#if defined(WOLFSSL_KEY_GEN) && !defined(HAVE_USER_RSA) +#if defined(WOLFSSL_KEY_GEN) if (PopulateRSAEvpPkeyDer(pkey) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("PopulateRSAEvpPkeyDer failed"); return WOLFSSL_FAILURE; } -#endif /* WOLFSSL_KEY_GEN && !HAVE_USER_RSA */ +#endif /* WOLFSSL_KEY_GEN */ #ifdef WC_RSA_BLINDING if (key->ownRng == 0) { @@ -7433,7 +8813,8 @@ /* 4 > size of pub, priv, p, q, g + ASN.1 additional information */ derMax = 4 * wolfSSL_BN_num_bytes(key->g) + AES_BLOCK_SIZE; - derBuf = (byte*)XMALLOC(derMax, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); + derBuf = (byte*)XMALLOC((size_t)derMax, pkey->heap, + DYNAMIC_TYPE_TMP_BUFFER); if (derBuf == NULL) { WOLFSSL_MSG("malloc failed"); return WOLFSSL_FAILURE; @@ -7441,11 +8822,11 @@ if (dsa->type == DSA_PRIVATE) { /* Private key to DER */ - derSz = wc_DsaKeyToDer(dsa, derBuf, derMax); + derSz = wc_DsaKeyToDer(dsa, derBuf, (word32)derMax); } else { /* Public key to DER */ - derSz = wc_DsaKeyToPublicDer(dsa, derBuf, derMax); + derSz = wc_DsaKeyToPublicDer(dsa, derBuf, (word32)derMax); } if (derSz < 0) { @@ -7459,14 +8840,15 @@ return WOLFSSL_FAILURE; } - pkey->pkey.ptr = (char*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_DER); + pkey->pkey.ptr = (char*)XMALLOC((size_t)derSz, pkey->heap, + DYNAMIC_TYPE_DER); if (pkey->pkey.ptr == NULL) { WOLFSSL_MSG("key malloc failed"); XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_FAILURE; } pkey->pkey_sz = derSz; - XMEMCPY(pkey->pkey.ptr, derBuf, derSz); + XMEMCPY(pkey->pkey.ptr, derBuf, (size_t)derSz); XFREE(derBuf, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_SUCCESS; @@ -7625,12 +9007,12 @@ ret = wc_DhParamsToDer(dhkey,NULL,&derSz); } - if (derSz == 0 || ret != LENGTH_ONLY_E) { + if (derSz == 0 || ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { WOLFSSL_MSG("Failed to get size of DH Key"); return WOLFSSL_FAILURE; } - derBuf = (byte*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); + derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_TMP_BUFFER); if (derBuf == NULL) { WOLFSSL_MSG("malloc failed"); return WOLFSSL_FAILURE; @@ -7653,7 +9035,7 @@ /* Store DH key into pkey (DER format) */ pkey->pkey.ptr = (char*)derBuf; - pkey->pkey_sz = derSz; + pkey->pkey_sz = (int)derSz; return WOLFSSL_SUCCESS; } @@ -7768,8 +9150,9 @@ #ifdef HAVE_PKCS8 if (key->pkcs8HeaderSz) { /* when key has pkcs8 header the pkey should too */ - if (wc_EccKeyToPKCS8(ecc, NULL, (word32*)&derSz) == LENGTH_ONLY_E) { - derBuf = (byte*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_OPENSSL); + if (wc_EccKeyToPKCS8(ecc, NULL, (word32*)&derSz) == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { + derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, + DYNAMIC_TYPE_OPENSSL); if (derBuf) { if (wc_EccKeyToPKCS8(ecc, derBuf, (word32*)&derSz) >= 0) { if (pkey->pkey.ptr) { @@ -7798,9 +9181,10 @@ /* if not, the pkey will be traditional ecc key */ if ((derSz = wc_EccKeyDerSize(ecc, 1)) > 0) { - derBuf = (byte*)XMALLOC(derSz, pkey->heap, DYNAMIC_TYPE_OPENSSL); + derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, + DYNAMIC_TYPE_OPENSSL); if (derBuf) { - if (wc_EccKeyToDer(ecc, derBuf, derSz) >= 0) { + if (wc_EccKeyToDer(ecc, derBuf, (word32)derSz) >= 0) { if (pkey->pkey.ptr) { XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL); } @@ -7817,12 +9201,22 @@ } } else if (ecc->type == ECC_PUBLICKEY) { - if ((derSz = (word32)wc_EccPublicKeyDerSize(ecc, 1)) > 0) { - derBuf = (byte*)XREALLOC(pkey->pkey.ptr, derSz, NULL, + if ((derSz = wc_EccPublicKeyDerSize(ecc, 1)) > 0) { + #ifdef WOLFSSL_NO_REALLOC + derBuf = (byte*)XMALLOC((size_t)derSz, pkey->heap, DYNAMIC_TYPE_OPENSSL); + if (derBuf != NULL) { + XMEMCPY(derBuf, pkey->pkey.ptr, (size_t)pkey->pkey_sz); + XFREE(pkey->pkey.ptr, pkey->heap, DYNAMIC_TYPE_OPENSSL); + pkey->pkey.ptr = NULL; + } + #else + derBuf = (byte*)XREALLOC(pkey->pkey.ptr, (size_t)derSz, pkey->heap, DYNAMIC_TYPE_OPENSSL); + #endif if (derBuf != NULL) { pkey->pkey.ptr = (char*)derBuf; - if ((derSz = wc_EccPublicKeyToDer(ecc, derBuf, derSz, 1)) < 0) { + if ((derSz = wc_EccPublicKeyToDer(ecc, derBuf, (word32)derSz, + 1)) < 0) { XFREE(derBuf, NULL, DYNAMIC_TYPE_OPENSSL); derBuf = NULL; } @@ -7910,7 +9304,7 @@ int wolfSSL_EVP_MD_pkey_type(const WOLFSSL_EVP_MD* type) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); WOLFSSL_ENTER("wolfSSL_EVP_MD_pkey_type"); @@ -7934,6 +9328,9 @@ ret = NID_sha512WithRSAEncryption; } } + else { + ret = BAD_FUNC_ARG; + } WOLFSSL_LEAVE("wolfSSL_EVP_MD_pkey_type", ret); @@ -7946,6 +9343,11 @@ { WOLFSSL_MSG("wolfSSL_EVP_CIPHER_CTX_iv_length"); + if (ctx == NULL) { + WOLFSSL_MSG("No context"); + return 0; + } + switch (ctx->cipherType) { #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) @@ -8025,12 +9427,22 @@ WOLFSSL_MSG("AES OFB"); return AES_BLOCK_SIZE; #endif /* WOLFSSL_AES_OFB */ -#ifdef WOLFSSL_AES_XTS +#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) case AES_128_XTS_TYPE: case AES_256_XTS_TYPE: WOLFSSL_MSG("AES XTS"); return AES_BLOCK_SIZE; -#endif /* WOLFSSL_AES_XTS */ +#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */ +#ifdef HAVE_ARIA + case ARIA_128_GCM_TYPE : + case ARIA_192_GCM_TYPE : + case ARIA_256_GCM_TYPE : + WOLFSSL_MSG("ARIA GCM"); + if (ctx->ivSz != 0) { + return ctx->ivSz; + } + return GCM_NONCE_MID_SZ; +#endif #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) case CHACHA20_POLY1305_TYPE: WOLFSSL_MSG("CHACHA20 POLY1305"); @@ -8041,6 +9453,32 @@ WOLFSSL_MSG("CHACHA20"); return WOLFSSL_EVP_CHACHA_IV_BYTES; #endif /* HAVE_CHACHA */ +#ifdef WOLFSSL_SM4_CBC + case SM4_CBC_TYPE : + WOLFSSL_MSG("SM4 CBC"); + return SM4_BLOCK_SIZE; +#endif +#ifdef WOLFSSL_SM4_CTR + case SM4_CTR_TYPE : + WOLFSSL_MSG("SM4 CTR"); + return SM4_BLOCK_SIZE; +#endif +#ifdef WOLFSSL_SM4_GCM + case SM4_GCM_TYPE : + WOLFSSL_MSG("SM4 GCM"); + if (ctx->ivSz != 0) { + return ctx->ivSz; + } + return GCM_NONCE_MID_SZ; +#endif +#ifdef WOLFSSL_SM4_CCM + case SM4_CCM_TYPE : + WOLFSSL_MSG("SM4 CCM"); + if (ctx->ivSz != 0) { + return ctx->ivSz; + } + return CCM_NONCE_MIN_SZ; +#endif case NULL_CIPHER_TYPE : WOLFSSL_MSG("NULL"); @@ -8118,7 +9556,7 @@ return AES_BLOCK_SIZE; #endif #endif -#ifdef WOLFSSL_AES_XTS +#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) #ifdef WOLFSSL_AES_128 if (XSTRCMP(name, EVP_AES_128_XTS) == 0) return AES_BLOCK_SIZE; @@ -8128,9 +9566,17 @@ if (XSTRCMP(name, EVP_AES_256_XTS) == 0) return AES_BLOCK_SIZE; #endif /* WOLFSSL_AES_256 */ -#endif /* WOLFSSL_AES_XTS */ +#endif /* WOLFSSL_AES_XTS && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) */ #endif +#ifdef HAVE_ARIA + if (XSTRCMP(name, EVP_ARIA_128_GCM) == 0) + return GCM_NONCE_MID_SZ; + if (XSTRCMP(name, EVP_ARIA_192_GCM) == 0) + return GCM_NONCE_MID_SZ; + if (XSTRCMP(name, EVP_ARIA_256_GCM) == 0) + return GCM_NONCE_MID_SZ; +#endif /* HAVE_ARIA */ #ifndef NO_DES3 if ((XSTRCMP(name, EVP_DES_CBC) == 0) || @@ -8149,6 +9595,23 @@ return WOLFSSL_EVP_CHACHA_IV_BYTES; #endif +#ifdef WOLFSSL_SM4_CBC + if (XSTRCMP(name, EVP_SM4_CBC) == 0) + return SM4_BLOCK_SIZE; +#endif +#ifdef WOLFSSL_SM4_CTR + if (XSTRCMP(name, EVP_SM4_CTR) == 0) + return SM4_BLOCK_SIZE; +#endif +#ifdef WOLFSSL_SM4_GCM + if (XSTRCMP(name, EVP_SM4_GCM) == 0) + return GCM_NONCE_MID_SZ; +#endif +#ifdef WOLFSSL_SM4_CCM + if (XSTRCMP(name, EVP_SM4_CCM) == 0) + return CCM_NONCE_MIN_SZ; +#endif + (void)name; return 0; @@ -8297,9 +9760,10 @@ RsaKey* rsa = (RsaKey*)key->internal; int ret = wc_RsaKeyToDer(rsa, NULL, 0); if (ret > 0) { - int derSz = ret; - byte* derBuf = (byte*)XMALLOC(derSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (derBuf) { + word32 derSz = (word32)ret; + byte* derBuf = (byte*)XMALLOC((size_t)derSz, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (derBuf != NULL) { ret = wc_RsaKeyToDer(rsa, derBuf, derSz); if (ret >= 0) { pkey->pkey_sz = ret; @@ -8392,12 +9856,13 @@ if (err != WOLFSSL_SUCCESS) return err; - if (wc_Hash((enum wc_HashType)hashType, in, inSz, out, hashSz) != 0) { + if (wc_Hash((enum wc_HashType)hashType, in, (word32)inSz, out, + (word32)hashSz) != 0) { return WOLFSSL_FAILURE; } if (outSz != NULL) - *outSz = hashSz; + *outSz = (unsigned int)hashSz; (void)eng; return WOLFSSL_SUCCESS; @@ -8650,13 +10115,20 @@ #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SM3 + const WOLFSSL_EVP_MD* wolfSSL_EVP_sm3(void) + { + WOLFSSL_ENTER("EVP_sm3"); + return EVP_get_digestbyname("SM3"); + } +#endif /* WOLFSSL_SM3 */ WOLFSSL_EVP_MD_CTX *wolfSSL_EVP_MD_CTX_new(void) { WOLFSSL_EVP_MD_CTX* ctx; WOLFSSL_ENTER("EVP_MD_CTX_new"); - ctx = (WOLFSSL_EVP_MD_CTX*)XMALLOC(sizeof *ctx, NULL, + ctx = (WOLFSSL_EVP_MD_CTX*)XMALLOC(sizeof(*ctx), NULL, DYNAMIC_TYPE_OPENSSL); if (ctx){ wolfSSL_EVP_MD_CTX_init(ctx); @@ -8913,6 +10385,11 @@ wc_Sha3_512_Free((wc_Sha3*)&ctx->hash.digest); #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + wc_Sm3Free(&ctx->hash.digest.sm3); + break; + #endif case WC_HASH_TYPE_NONE: /* Not an error since an unused struct could be free'd or * reset. */ @@ -9032,6 +10509,17 @@ } else #endif #endif + #ifdef WOLFSSL_SM3 + if (XSTRCMP(md, "SM3") == 0) { + ret = wc_InitSm3(&ctx->hash.digest.sm3, NULL, INVALID_DEVID); + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + } + else { + ret = WOLFSSL_FAILURE; + } + } else + #endif { ctx->macType = WC_HASH_TYPE_NONE; return BAD_FUNC_ARG; @@ -9139,6 +10627,17 @@ (unsigned long)sz); #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3Update(&ctx->hash.digest.sm3, data, (word32)sz); + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + } + else { + ret = WOLFSSL_FAILURE; + } + break; + #endif case WC_HASH_TYPE_NONE: case WC_HASH_TYPE_MD2: case WC_HASH_TYPE_MD5_SHA: @@ -9252,6 +10751,18 @@ if (s) *s = WC_SHA3_512_DIGEST_SIZE; #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3Final(&ctx->hash.digest.sm3, md); + if (ret == 0) { + ret = WOLFSSL_SUCCESS; + } + else { + ret = WOLFSSL_FAILURE; + } + if (s) *s = WC_SM3_DIGEST_SIZE; + break; + #endif case WC_HASH_TYPE_NONE: case WC_HASH_TYPE_MD2: case WC_HASH_TYPE_MD5_SHA: @@ -9312,6 +10823,10 @@ case NID_sha512: return wolfSSL_EVP_sha512(); #endif +#ifdef WOLFSSL_SM3 + case NID_sm3: + return wolfSSL_EVP_sm3(); +#endif default: WOLFSSL_MSG("Bad digest id value"); } @@ -9384,6 +10899,11 @@ } #endif #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SM3 + if (XSTRCMP(type, "SM3") == 0) { + return WC_SM3_BLOCK_SIZE; + } else +#endif return BAD_FUNC_ARG; } @@ -9461,9 +10981,14 @@ #ifndef WOLFSSL_NOSHA3_512 if (XSTRCMP(type, "SHA3_512") == 0) { return WC_SHA3_512_DIGEST_SIZE; - } + } else #endif #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SM3 + if (XSTRCMP(type, "SM3") == 0) { + return WC_SM3_DIGEST_SIZE; + } +#endif return BAD_FUNC_ARG; } @@ -9796,7 +11321,7 @@ int wsz; /* parse key to get modulus and exponent */ - if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, pkeySz, + if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, (word32)pkeySz, &n, &nSz, &e, &eSz) != 0) { break; } @@ -9809,7 +11334,7 @@ if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) { break; } - if (mp_set_int(a, bitlen) != 0) { + if (mp_set_int(a, (unsigned long)bitlen) != 0) { break; } if (mp_todecimal(a, (char*)buff) != 0) { @@ -9837,7 +11362,7 @@ nSz++; } - if (PrintHexWithColon(out, n, nSz, + if (PrintHexWithColon(out, n, (int)nSz, indent + 4, 1/* lower case */) != WOLFSSL_SUCCESS) { break; } @@ -9972,7 +11497,7 @@ } if (res == WOLFSSL_SUCCESS) { - res = wc_EccPublicKeyDecode(pkey, &inOutIdx, key, pkeySz) == 0; + res = wc_EccPublicKeyDecode(pkey, &inOutIdx, key, (word32)pkeySz) == 0; } if (res == WOLFSSL_SUCCESS) { @@ -10016,7 +11541,7 @@ res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0; } if (res == WOLFSSL_SUCCESS) { - res = mp_set_int(a, bitlen) == 0; + res = mp_set_int(a, (unsigned long)bitlen) == 0; } if (res == WOLFSSL_SUCCESS) { res = mp_todecimal(a, (char*)buff) == 0; @@ -10040,7 +11565,8 @@ res = wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) > 0; } if (res == WOLFSSL_SUCCESS) { - res = PrintHexWithColon(out, pub, pubSz, indent + 4, 0/* upper case */); + /* upper case */ + res = PrintHexWithColon(out, pub, (int)pubSz, indent + 4, 0); } if (res == WOLFSSL_SUCCESS) { res = Indent(out, indent) >= 0; @@ -10148,26 +11674,27 @@ int idx; int wsz; - if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) { + if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) { break; } - if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) { + if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) { break; } - if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, pkeySz) != 0) { + if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) != + 0) { break; } - if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) { + if (GetSequence(pkey, &inOutIdx, &length, (word32)pkeySz) < 0) { break; } /* find P */ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_INTEGER) { break; } - if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) { break; } p = (byte*)(pkey + inOutIdx); @@ -10182,53 +11709,53 @@ } } - inOutIdx += length; + inOutIdx += (word32)length; /* find Q */ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_INTEGER) { break; } - if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) { break; } q = (byte*)(pkey + inOutIdx); qSz = length; - inOutIdx += length; + inOutIdx += (word32)length; /* find G */ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_INTEGER) { break; } - if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) { break; } g = (byte*)(pkey + inOutIdx); gSz = length; - inOutIdx += length; + inOutIdx += (word32)length; /* find Y */ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_BIT_STRING) { break; } - if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) { break; } inOutIdx++; /* skip the first byte( unused byte number)*/ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_INTEGER) { break; } - if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, &length, (word32)pkeySz) <= 0) { break; } y = (byte*)(pkey + inOutIdx); @@ -10241,7 +11768,7 @@ if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) { break; } - if (mp_set_int(a, bitlen) != 0) { + if (mp_set_int(a, (unsigned long)bitlen) != 0) { break; } if (mp_todecimal(a, (char*)buff) != 0) { @@ -10371,40 +11898,41 @@ int idx; int wsz; - if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) { + if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) { break; } - if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) { + if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) { break; } - if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, pkeySz) < 0) { + if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, (word32)pkeySz) < + 0) { break; } - if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) { + if (GetSequence(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) < 0) { break; } /* get prime element */ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_INTEGER) { break; } - if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) { break; } prime = (byte*)(pkey + inOutIdx); - primeSz = length; + primeSz = (int)length; inOutIdx += length; /* get generator element */ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_INTEGER) { break; } - if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) { break; } if (length != 1) { @@ -10414,26 +11942,26 @@ inOutIdx += length; /* get public-key element */ - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_BIT_STRING) { break; } - if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) { break; } inOutIdx ++; - if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) { + if (GetASNTag(pkey, &inOutIdx, &tagFound, (word32)pkeySz) != 0) { break; } if (tagFound != ASN_INTEGER) { break; } - if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) { + if (GetLength(pkey, &inOutIdx, (int*)&length, (word32)pkeySz) <= 0) { break; } - publicKeySz = length; + publicKeySz = (int)length; publicKey = (byte*)(pkey + inOutIdx); if (bitlen == 0) { @@ -10452,7 +11980,7 @@ if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) { break; } - if (mp_set_int(a, bitlen) != 0) { + if (mp_set_int(a, (unsigned long)bitlen) != 0) { break; } if (mp_todecimal(a, (char*)buff) != 0) { @@ -10714,6 +12242,11 @@ } else #endif #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SM3 + if (XSTRCMP("SM3", evp) == 0) { + hash = WC_HASH_TYPE_SM3; + } else +#endif #ifdef WOLFSSL_MD2 if (XSTRCMP("MD2", evp) == 0) { hash = WC_HASH_TYPE_MD2; @@ -10760,7 +12293,7 @@ { WOLFSSL_EVP_ENCODE_CTX* ctx = NULL; WOLFSSL_ENTER("wolfSSL_EVP_ENCODE_CTX_new"); - ctx = (WOLFSSL_EVP_ENCODE_CTX*)XMALLOC( sizeof(WOLFSSL_EVP_ENCODE_CTX), + ctx = (WOLFSSL_EVP_ENCODE_CTX*)XMALLOC(sizeof(WOLFSSL_EVP_ENCODE_CTX), NULL, DYNAMIC_TYPE_OPENSSL ); if (ctx != NULL) { @@ -10792,7 +12325,7 @@ if (out == NULL || in == NULL) return WOLFSSL_FATAL_ERROR; - if (Base64_Encode(in, inLen, out, &ret) == 0) + if (Base64_Encode_NoNl(in, (word32)inLen, out, &ret) == 0) return (int)ret; else return WOLFSSL_FATAL_ERROR; @@ -10808,7 +12341,7 @@ if (out == NULL || in == NULL) return WOLFSSL_FATAL_ERROR; - if (Base64_Decode(in, inLen, out, &ret) == 0) + if (Base64_Decode(in, (word32)inLen, out, &ret) == 0) return (int)ret; else return WOLFSSL_FATAL_ERROR; @@ -10851,8 +12384,9 @@ * to create a block(48bytes) for encoding */ if (ctx->remaining > 0 && inl > 0) { - int cpysz = min((BASE64_ENCODE_BLOCK_SIZE - ctx->remaining), inl); - XMEMCPY(ctx->data + ctx->remaining, in, cpysz); + int cpysz = (int)min( + (word32)(BASE64_ENCODE_BLOCK_SIZE - ctx->remaining), (word32)inl); + XMEMCPY(ctx->data + ctx->remaining, in, (size_t)cpysz); ctx->remaining += cpysz; in += cpysz; inl -= cpysz; @@ -10862,10 +12396,10 @@ /* Base64_Encode asks the out buff size via the 4th param*/ outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1; res = Base64_Encode(ctx->data, BASE64_ENCODE_BLOCK_SIZE, out, - &outsz); + &outsz); if (res == 0) { ctx->remaining = 0; - *outl = outsz; + *outl = (int)outsz; } else return 0; /* return with error */ @@ -10887,7 +12421,7 @@ in += BASE64_ENCODE_BLOCK_SIZE; inl -= BASE64_ENCODE_BLOCK_SIZE; out += outsz; - *outl += outsz; + *outl += (int)outsz; } else { *outl = 0; @@ -10898,7 +12432,7 @@ /* if remaining data exists, copy them into ctx for the next call*/ if (inl > 0) { XMEMSET(ctx->data, 0, sizeof(ctx->data)); - XMEMCPY(ctx->data, in, inl); + XMEMCPY(ctx->data, in, (size_t)inl); ctx->remaining = inl; } @@ -10927,9 +12461,9 @@ } /* process remaining data in ctx */ outsz = BASE64_ENCODE_RESULT_BLOCK_SIZE + 1; /* 64 byte and one for LF*/ - res = Base64_Encode(ctx->data, ctx->remaining ,out, &outsz); + res = Base64_Encode(ctx->data, (word32)ctx->remaining, out, &outsz); if (res == 0) - *outl = outsz; + *outl = (int)outsz; else *outl = 0; @@ -10989,17 +12523,18 @@ return 1; } - inLen = inl; + inLen = (word32)inl; *outl = 0; /* if the remaining data exist in the ctx, add input data to them to create a block(4bytes) for decoding*/ - if ( ctx->remaining > 0 && inl > 0) { + if (ctx->remaining > 0 && inl > 0) { - int cpySz = min((BASE64_DECODE_BLOCK_SIZE - ctx->remaining), inl); + int cpySz = (int)min( + (word32)(BASE64_DECODE_BLOCK_SIZE - ctx->remaining), (word32)inl); for ( i = 0; cpySz > 0 && inLen > 0; i++) { - if (Base64_SkipNewline(in, &inLen, &j) == ASN_INPUT_E) { + if (Base64_SkipNewline(in, &inLen, &j) == WC_NO_ERR_TRACE(ASN_INPUT_E)) { return -1; /* detected an illegal char in input */ } c = in[j++]; @@ -11015,7 +12550,7 @@ outsz = sizeof(ctx->data); res = Base64_Decode( ctx->data, BASE64_DECODE_BLOCK_SIZE, out, &outsz); if (res == 0) { - *outl += outsz; + *outl += (int)outsz; out += outsz; ctx->remaining = 0; @@ -11039,7 +12574,7 @@ */ while (inLen > 3) { if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) { - if (res == BUFFER_E) { + if (res == WC_NO_ERR_TRACE(BUFFER_E)) { break; } else { @@ -11053,7 +12588,7 @@ } inLen--; if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) { - if (res == BUFFER_E) { + if (res == WC_NO_ERR_TRACE(BUFFER_E)) { break; } else { @@ -11064,7 +12599,7 @@ e[1] = in[j++]; inLen--; if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) { - if (res == BUFFER_E) { + if (res == WC_NO_ERR_TRACE(BUFFER_E)) { break; } else { @@ -11075,7 +12610,7 @@ e[2] = in[j++]; inLen--; if ((res = Base64_SkipNewline(in, &inLen, &j)) != 0) { - if (res == BUFFER_E) { + if (res == WC_NO_ERR_TRACE(BUFFER_E)) { break; } else { @@ -11111,7 +12646,7 @@ return -1; } - *outl += outsz; + *outl += (int)outsz; out += outsz; } /* copy left data to ctx */ @@ -11179,20 +12714,22 @@ if (ctx->remaining > 0) { int res; - inLen = ctx->remaining; + inLen = (word32)ctx->remaining; if ((res = Base64_SkipNewline(ctx->data, &inLen, &j)) != 0) { *outl = 0; - if (res == BUFFER_E) /* means no valid data to decode in buffer */ + if (res == WC_NO_ERR_TRACE(BUFFER_E)) { + /* means no valid data to decode in buffer */ return 1; /* returns as success with no output */ + } else return -1; } - outsz = ctx->remaining; - res = Base64_Decode(ctx->data, ctx->remaining, out, &outsz); + outsz = (word32)ctx->remaining; + res = Base64_Decode(ctx->data, (word32)ctx->remaining, out, &outsz); if (res == 0) { - *outl = outsz; + *outl = (int)outsz; return 1; } else { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ext_kyber.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_kyber.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ext_kyber.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_kyber.c 2024-08-03 07:30:00.000000000 +0000 @@ -39,6 +39,8 @@ #if defined (HAVE_LIBOQS) +#include + static const char* OQS_ID2name(int id) { switch (id) { case KYBER_LEVEL1: return OQS_KEM_alg_kyber_512; @@ -99,10 +101,15 @@ /* Keep type for parameters. */ key->type = type; + +#ifdef WOLF_CRYPTO_CB + key->devCtx = NULL; + key->devId = devId; +#endif } - (void)devId; (void)heap; + (void)devId; return ret; } @@ -310,27 +317,33 @@ OQS_KEM *kem = NULL; #endif - (void)rng; - /* Validate parameter. */ if (key == NULL) { return BAD_FUNC_ARG; } -#ifdef HAVE_LIBOQS - if (ret == 0) { - algName = OQS_ID2name(key->type); - if (algName == NULL) { - ret = BAD_FUNC_ARG; - } +#ifdef WOLF_CRYPTO_CB + #ifndef WOLF_CRYPTO_CB_FIND + if (key->devId != INVALID_DEVID) + #endif + { + ret = wc_CryptoCb_MakePqcKemKey(rng, WC_PQC_KEM_TYPE_KYBER, + key->type, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; } +#endif +#ifdef HAVE_LIBOQS if (ret == 0) { algName = OQS_ID2name(key->type); if (algName == NULL) { ret = BAD_FUNC_ARG; } } + if (ret == 0) { kem = OQS_KEM_new(algName); if (kem == NULL) { @@ -338,11 +351,15 @@ } } if (ret == 0) { + ret = wolfSSL_liboqsRngMutexLock(rng); + } + if (ret == 0) { if (OQS_KEM_keypair(kem, key->pub, key->priv) != OQS_SUCCESS) { ret = BAD_FUNC_ARG; } } + wolfSSL_liboqsRngMutexUnlock(); OQS_KEM_free(kem); #endif /* HAVE_LIBOQS */ #ifdef HAVE_PQM4 @@ -397,6 +414,9 @@ WC_RNG* rng) { int ret = 0; +#ifdef WOLF_CRYPTO_CB + word32 ctlen = 0; +#endif #ifdef HAVE_LIBOQS const char * algName = NULL; OQS_KEM *kem = NULL; @@ -409,6 +429,24 @@ ret = BAD_FUNC_ARG; } +#ifdef WOLF_CRYPTO_CB + if (ret == 0) { + ret = wc_KyberKey_CipherTextSize(key, &ctlen); + } + if ((ret == 0) + #ifndef WOLF_CRYPTO_CB_FIND + && (key->devId != INVALID_DEVID) + #endif + ) { + ret = wc_CryptoCb_PqcEncapsulate(ct, ctlen, ss, KYBER_SS_SZ, rng, + WC_PQC_KEM_TYPE_KYBER, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; + } +#endif + #ifdef HAVE_LIBOQS if (ret == 0) { algName = OQS_ID2name(key->type); @@ -423,11 +461,14 @@ } } if (ret == 0) { + ret = wolfSSL_liboqsRngMutexLock(rng); + } + if (ret == 0) { if (OQS_KEM_encaps(kem, ct, ss, key->pub) != OQS_SUCCESS) { ret = BAD_FUNC_ARG; } } - + wolfSSL_liboqsRngMutexUnlock(); OQS_KEM_free(kem); #endif /* HAVE_LIBOQS */ #ifdef HAVE_PQM4 @@ -500,6 +541,21 @@ ret = BUFFER_E; } +#ifdef WOLF_CRYPTO_CB + if ((ret == 0) + #ifndef WOLF_CRYPTO_CB_FIND + && (key->devId != INVALID_DEVID) + #endif + ) { + ret = wc_CryptoCb_PqcDecapsulate(ct, ctlen, ss, KYBER_SS_SZ, + WC_PQC_KEM_TYPE_KYBER, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; + } +#endif + #ifdef HAVE_LIBOQS if (ret == 0) { algName = OQS_ID2name(key->type); @@ -548,11 +604,12 @@ * @param [in] in Buffer holding encoded key. * @param [in] len Length of data in buffer. * @return 0 on success. - * @return BAD_FUNC_ARG when key ot in is NULL. + * @return BAD_FUNC_ARG when key or in is NULL. * @return NOT_COMPILED_IN when key type is not supported. * @return BUFFER_E when len is not the correct size. */ -int wc_KyberKey_DecodePrivateKey(KyberKey* key, unsigned char* in, word32 len) +int wc_KyberKey_DecodePrivateKey(KyberKey* key, const unsigned char* in, + word32 len) { int ret = 0; word32 privLen = 0; @@ -591,7 +648,8 @@ * @return NOT_COMPILED_IN when key type is not supported. * @return BUFFER_E when len is not the correct size. */ -int wc_KyberKey_DecodePublicKey(KyberKey* key, unsigned char* in, word32 len) +int wc_KyberKey_DecodePublicKey(KyberKey* key, const unsigned char* in, + word32 len) { int ret = 0; word32 pubLen = 0; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ext_lms.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_lms.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ext_lms.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_lms.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1051 @@ +/* ext_lms.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#ifdef WOLFSSL_HAVE_LMS +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* If built against hss_lib_thread.a, the hash-sigs lib will spawn + * worker threads to parallelize cpu intensive tasks. This will mainly + * speedup key generation and signing, and to a lesser extent + * verifying for larger levels values. + * + * Their default max is 16 worker threads, but can be capped with + * hss_extra_info_set_threads(). To be safe we are capping at 4 here. + * */ +#define EXT_LMS_MAX_THREADS (4) + +/* The hash-sigs hss_generate_private_key API requires a generate_random + * callback that only has output and length args. The RNG struct must be global + * to the function. Maybe there should be a wc_LmsKey_SetRngCb. */ +static THREAD_LS_T WC_RNG * LmsRng = NULL; + +static bool LmsGenerateRand(void * output, size_t length) +{ + int ret = 0; + + if (output == NULL || LmsRng == NULL) { + return false; + } + + if (length == 0) { + return true; + } + + ret = wc_RNG_GenerateBlock(LmsRng, output, (word32) length); + + if (ret) { + WOLFSSL_MSG("error: LmsGenerateRand failed"); + return false; + } + + return true; +} + +/* Write callback passed into hash-sigs hss lib. + * + * Returns true on success. */ +static bool LmsWritePrivKey(unsigned char *private_key, + size_t len_private_key, void *lmsKey) +{ + LmsKey * key = (LmsKey *) lmsKey; + enum wc_LmsRc ret = WC_LMS_RC_NONE; + + if (private_key == NULL || key == NULL || len_private_key <= 0) { + WOLFSSL_MSG("error: LmsWritePrivKey: invalid args"); + return false; + } + + if (key->state != WC_LMS_STATE_PARMSET && key->state != WC_LMS_STATE_OK) { + /* The LmsKey is not ready for writing. */ + WOLFSSL_MSG("error: LmsWritePrivKey: LMS key not in writeable state"); + return false; + } + + if (key->write_private_key == NULL) { + WOLFSSL_MSG("error: LmsWritePrivKey: LMS key write callback not set"); + key->state = WC_LMS_STATE_BAD; + return false; + } + + /* Use write callback that saves private key to non-volatile storage. */ + ret = key->write_private_key(private_key, (word32)len_private_key, + key->context); + + if (ret != WC_LMS_RC_SAVED_TO_NV_MEMORY) { + WOLFSSL_MSG("error: LmsKey write_private_key failed"); + WOLFSSL_MSG(wc_LmsKey_RcToStr(ret)); + key->state = WC_LMS_STATE_BAD; + return false; + } + + return true; +} + +/* Read callback passed into hash-sigs hss lib. + * + * Returns true on success. */ +static bool LmsReadPrivKey(unsigned char *private_key, + size_t len_private_key, void *lmsKey) +{ + LmsKey * key = (LmsKey *) lmsKey; + enum wc_LmsRc ret = WC_LMS_RC_NONE; + + if (private_key == NULL || key == NULL || len_private_key <= 0) { + WOLFSSL_MSG("error: LmsReadPrivKey: invalid args"); + return false; + } + + if (key->state != WC_LMS_STATE_PARMSET && key->state != WC_LMS_STATE_OK) { + /* The LmsKey is not ready for reading. */ + WOLFSSL_MSG("error: LmsReadPrivKey: LMS key not in readable state"); + return false; + } + + if (key->read_private_key == NULL) { + WOLFSSL_MSG("error: LmsReadPrivKey: LMS key read callback not set"); + key->state = WC_LMS_STATE_BAD; + return false; + } + + /* Use read callback that reads private key from non-volatile storage. */ + ret = key->read_private_key(private_key, (word32)len_private_key, + key->context); + + if (ret != WC_LMS_RC_READ_TO_MEMORY) { + WOLFSSL_MSG("error: LmsKey read_private_key failed"); + WOLFSSL_MSG(wc_LmsKey_RcToStr(ret)); + key->state = WC_LMS_STATE_BAD; + return false; + } + + return true; +} +#endif /* ifndef WOLFSSL_LMS_VERIFY_ONLY */ + +const char * wc_LmsKey_ParmToStr(enum wc_LmsParm lmsParm) +{ + switch (lmsParm) { + case WC_LMS_PARM_NONE: + return "LMS/HSS NONE"; + case WC_LMS_PARM_L1_H5_W1: + return "LMS/HSS L1_H5_W1"; + case WC_LMS_PARM_L1_H5_W2: + return "LMS/HSS L1_H5_W2"; + case WC_LMS_PARM_L1_H5_W4: + return "LMS/HSS L1_H5_W4"; + case WC_LMS_PARM_L1_H5_W8: + return "LMS/HSS L1_H5_W8"; + case WC_LMS_PARM_L1_H10_W2: + return "LMS/HSS L1_H10_W2"; + case WC_LMS_PARM_L1_H10_W4: + return "LMS/HSS L1_H10_W4"; + case WC_LMS_PARM_L1_H10_W8: + return "LMS/HSS L1_H10_W8"; + case WC_LMS_PARM_L1_H15_W2: + return "LMS/HSS L1_H15_W2"; + case WC_LMS_PARM_L1_H15_W4: + return "LMS/HSS L1_H15_W4"; + case WC_LMS_PARM_L1_H15_W8: + return "LMS/HSS L1_H15_W8"; + case WC_LMS_PARM_L1_H20_W2: + return "LMS/HSS L1_H20_W2"; + case WC_LMS_PARM_L1_H20_W4: + return "LMS/HSS L1_H20_W4"; + case WC_LMS_PARM_L1_H20_W8: + return "LMS/HSS L1_H20_W8"; + case WC_LMS_PARM_L2_H5_W2: + return "LMS/HSS L2_H5_W2"; + case WC_LMS_PARM_L2_H5_W4: + return "LMS/HSS L2_H5_W4"; + case WC_LMS_PARM_L2_H5_W8: + return "LMS/HSS L2_H5_W8"; + case WC_LMS_PARM_L2_H10_W2: + return "LMS/HSS L2_H10_W2"; + case WC_LMS_PARM_L2_H10_W4: + return "LMS/HSS L2_H10_W4"; + case WC_LMS_PARM_L2_H10_W8: + return "LMS/HSS L2_H10_W8"; + case WC_LMS_PARM_L2_H15_W2: + return "LMS/HSS L2_H15_W2"; + case WC_LMS_PARM_L2_H15_W4: + return "LMS/HSS L2_H15_W4"; + case WC_LMS_PARM_L2_H15_W8: + return "LMS/HSS L2_H15_W8"; + case WC_LMS_PARM_L2_H20_W2: + return "LMS/HSS L2_H20_W2"; + case WC_LMS_PARM_L2_H20_W4: + return "LMS/HSS L2_H20_W4"; + case WC_LMS_PARM_L2_H20_W8: + return "LMS/HSS L2_H20_W8"; + case WC_LMS_PARM_L3_H5_W2: + return "LMS/HSS L3_H5_W2"; + case WC_LMS_PARM_L3_H5_W4: + return "LMS/HSS L3_H5_W4"; + case WC_LMS_PARM_L3_H5_W8: + return "LMS/HSS L3_H5_W8"; + case WC_LMS_PARM_L3_H10_W4: + return "LMS/HSS L3_H10_W4"; + case WC_LMS_PARM_L3_H10_W8: + return "LMS/HSS L3_H10_W8"; + case WC_LMS_PARM_L4_H5_W2: + return "LMS/HSS L4_H5_W2"; + case WC_LMS_PARM_L4_H5_W4: + return "LMS/HSS L4_H5_W4"; + case WC_LMS_PARM_L4_H5_W8: + return "LMS/HSS L4_H5_W8"; + case WC_LMS_PARM_L4_H10_W4: + return "LMS/HSS L4_H10_W4"; + case WC_LMS_PARM_L4_H10_W8: + return "LMS/HSS L4_H10_W8"; + default: + WOLFSSL_MSG("error: invalid LMS parameter"); + break; + } + + return "LMS_INVALID"; +} + +const char * wc_LmsKey_RcToStr(enum wc_LmsRc lmsEc) +{ + switch (lmsEc) { + case WC_LMS_RC_NONE: + return "LMS_RC_NONE"; + + case WC_LMS_RC_BAD_ARG: + return "LMS_RC_BAD_ARG"; + + case WC_LMS_RC_WRITE_FAIL: + return "LMS_RC_WRITE_FAIL"; + + case WC_LMS_RC_READ_FAIL: + return "LMS_RC_READ_FAIL"; + + case WC_LMS_RC_SAVED_TO_NV_MEMORY: + return "LMS_RC_SAVED_TO_NV_MEMORY"; + + case WC_LMS_RC_READ_TO_MEMORY: + return "LMS_RC_READ_TO_MEMORY"; + + default: + WOLFSSL_MSG("error: invalid LMS error code"); + break; + } + + return "LMS_RC_INVALID"; +} + +/* Init an LMS key. + * + * Call this before setting the params of an LMS key. + * + * Returns 0 on success. + * */ +int wc_LmsKey_Init(LmsKey * key, void * heap, int devId) +{ + if (key == NULL) { + return BAD_FUNC_ARG; + } + + (void) heap; + (void) devId; + + ForceZero(key, sizeof(LmsKey)); + +#ifndef WOLFSSL_LMS_VERIFY_ONLY + hss_init_extra_info(&key->info); + /* Set the max number of worker threads that hash-sigs can spawn. */ + hss_extra_info_set_threads(&key->info, EXT_LMS_MAX_THREADS); + + key->working_key = NULL; + key->write_private_key = NULL; + key->read_private_key = NULL; + key->context = NULL; +#endif /* ifndef WOLFSSL_LMS_VERIFY_ONLY */ + key->state = WC_LMS_STATE_INITED; + + return 0; +} + +/* Set the wc_LmsParm of an LMS key. + * + * Use this if you wish to set a key with a predefined parameter set, + * such as WC_LMS_PARM_L2_H10_W8. + * + * Key must be inited before calling this. + * + * Returns 0 on success. + * */ +int wc_LmsKey_SetLmsParm(LmsKey * key, enum wc_LmsParm lmsParm) +{ + if (key == NULL) { + return BAD_FUNC_ARG; + } + + /* If NONE is passed, default to the lowest predefined set. */ + switch (lmsParm) { + case WC_LMS_PARM_NONE: + case WC_LMS_PARM_L1_H5_W1: + return wc_LmsKey_SetParameters(key, 1, 5, 1); + case WC_LMS_PARM_L1_H5_W2: + return wc_LmsKey_SetParameters(key, 1, 5, 2); + case WC_LMS_PARM_L1_H5_W4: + return wc_LmsKey_SetParameters(key, 1, 5, 4); + case WC_LMS_PARM_L1_H5_W8: + return wc_LmsKey_SetParameters(key, 1, 5, 8); + case WC_LMS_PARM_L1_H10_W2: + return wc_LmsKey_SetParameters(key, 1, 10, 2); + case WC_LMS_PARM_L1_H10_W4: + return wc_LmsKey_SetParameters(key, 1, 10, 4); + case WC_LMS_PARM_L1_H10_W8: + return wc_LmsKey_SetParameters(key, 1, 10, 8); + case WC_LMS_PARM_L1_H15_W2: + return wc_LmsKey_SetParameters(key, 1, 15, 2); + case WC_LMS_PARM_L1_H15_W4: + return wc_LmsKey_SetParameters(key, 1, 15, 4); + case WC_LMS_PARM_L1_H15_W8: + return wc_LmsKey_SetParameters(key, 1, 15, 8); + case WC_LMS_PARM_L1_H20_W2: + return wc_LmsKey_SetParameters(key, 1, 20, 2); + case WC_LMS_PARM_L1_H20_W4: + return wc_LmsKey_SetParameters(key, 1, 20, 4); + case WC_LMS_PARM_L1_H20_W8: + return wc_LmsKey_SetParameters(key, 1, 20, 8); + case WC_LMS_PARM_L2_H5_W2: + return wc_LmsKey_SetParameters(key, 2, 5, 2); + case WC_LMS_PARM_L2_H5_W4: + return wc_LmsKey_SetParameters(key, 2, 5, 4); + case WC_LMS_PARM_L2_H5_W8: + return wc_LmsKey_SetParameters(key, 2, 5, 8); + case WC_LMS_PARM_L2_H10_W2: + return wc_LmsKey_SetParameters(key, 2, 10, 2); + case WC_LMS_PARM_L2_H10_W4: + return wc_LmsKey_SetParameters(key, 2, 10, 4); + case WC_LMS_PARM_L2_H10_W8: + return wc_LmsKey_SetParameters(key, 2, 10, 8); + case WC_LMS_PARM_L2_H15_W2: + return wc_LmsKey_SetParameters(key, 2, 15, 2); + case WC_LMS_PARM_L2_H15_W4: + return wc_LmsKey_SetParameters(key, 2, 15, 4); + case WC_LMS_PARM_L2_H15_W8: + return wc_LmsKey_SetParameters(key, 2, 15, 8); + case WC_LMS_PARM_L2_H20_W2: + return wc_LmsKey_SetParameters(key, 2, 20, 2); + case WC_LMS_PARM_L2_H20_W4: + return wc_LmsKey_SetParameters(key, 2, 20, 4); + case WC_LMS_PARM_L2_H20_W8: + return wc_LmsKey_SetParameters(key, 2, 20, 8); + case WC_LMS_PARM_L3_H5_W2: + return wc_LmsKey_SetParameters(key, 3, 5, 2); + case WC_LMS_PARM_L3_H5_W4: + return wc_LmsKey_SetParameters(key, 3, 5, 4); + case WC_LMS_PARM_L3_H5_W8: + return wc_LmsKey_SetParameters(key, 3, 5, 8); + case WC_LMS_PARM_L3_H10_W4: + return wc_LmsKey_SetParameters(key, 3, 10, 4); + case WC_LMS_PARM_L3_H10_W8: + return wc_LmsKey_SetParameters(key, 3, 10, 8); + case WC_LMS_PARM_L4_H5_W2: + return wc_LmsKey_SetParameters(key, 4, 5, 2); + case WC_LMS_PARM_L4_H5_W4: + return wc_LmsKey_SetParameters(key, 4, 5, 4); + case WC_LMS_PARM_L4_H5_W8: + return wc_LmsKey_SetParameters(key, 4, 5, 8); + case WC_LMS_PARM_L4_H10_W4: + return wc_LmsKey_SetParameters(key, 4, 10, 4); + case WC_LMS_PARM_L4_H10_W8: + return wc_LmsKey_SetParameters(key, 4, 10, 8); + default: + WOLFSSL_MSG("error: invalid LMS parameter set"); + break; + } + + return BAD_FUNC_ARG; +} + +/* Set the parameters of an LMS key. + * + * Use this if you wish to set specific parameters not found in the + * wc_LmsParm predefined sets. See comments in lms.h for allowed + * parameters. + * + * Key must be inited before calling this. + * + * Returns 0 on success. + * */ +int wc_LmsKey_SetParameters(LmsKey * key, int levels, int height, + int winternitz) +{ + int i = 0; + param_set_t lm = LMS_SHA256_N32_H5; + param_set_t ots = LMOTS_SHA256_N32_W1; + + if (key == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_LMS_STATE_INITED) { + WOLFSSL_MSG("error: LmsKey needs init"); + return -1; + } + + /* Verify inputs make sense. + * + * Note: there does not seem to be a define for min or + * max Winternitz integer in hash-sigs lib or RFC8554. */ + + if (levels < MIN_HSS_LEVELS || levels > MAX_HSS_LEVELS) { + WOLFSSL_MSG("error: invalid level parameter"); + return BAD_FUNC_ARG; + } + + if (height < MIN_MERKLE_HEIGHT || height > MAX_MERKLE_HEIGHT) { + WOLFSSL_MSG("error: invalid height parameter"); + return BAD_FUNC_ARG; + } + + switch (height) { + case 5: + lm = LMS_SHA256_N32_H5; + break; + case 10: + lm = LMS_SHA256_N32_H10; + break; + case 15: + lm = LMS_SHA256_N32_H15; + break; + case 20: + lm = LMS_SHA256_N32_H20; + break; + case 25: + lm = LMS_SHA256_N32_H25; + break; + default: + WOLFSSL_MSG("error: invalid height parameter"); + return BAD_FUNC_ARG; + } + + switch (winternitz) { + case 1: + ots = LMOTS_SHA256_N32_W1; + break; + case 2: + ots = LMOTS_SHA256_N32_W2; + break; + case 4: + ots = LMOTS_SHA256_N32_W4; + break; + case 8: + ots = LMOTS_SHA256_N32_W8; + break; + default: + WOLFSSL_MSG("error: invalid winternitz parameter"); + return BAD_FUNC_ARG; + } + + key->levels = levels; + + for (i = 0; i < levels; ++i) { + key->lm_type[i] = lm; + key->lm_ots_type[i] = ots; + } + + /* Move the state to params set. + * Key is ready for MakeKey or Reload. */ + key->state = WC_LMS_STATE_PARMSET; + + return 0; +} + +/* Get the parameters of an LMS key. + * + * Key must be inited and parameters set before calling this. + * + * Returns 0 on success. + * */ +int wc_LmsKey_GetParameters(const LmsKey * key, int * levels, int * height, + int * winternitz) +{ + if (key == NULL || levels == NULL || height == NULL || winternitz == NULL) { + return BAD_FUNC_ARG; + } + + /* This shouldn't happen, but check the LmsKey parameters aren't invalid. */ + + if (key->levels < MIN_HSS_LEVELS || key->levels > MAX_HSS_LEVELS) { + WOLFSSL_MSG("error: LmsKey invalid level parameter"); + return -1; + } + + *levels = key->levels; + + switch (key->lm_type[0]) { + case LMS_SHA256_N32_H5: + *height = 5; + break; + case LMS_SHA256_N32_H10: + *height = 10; + break; + case LMS_SHA256_N32_H15: + *height = 15; + break; + case LMS_SHA256_N32_H20: + *height = 20; + break; + case LMS_SHA256_N32_H25: + *height = 25; + break; + default: + WOLFSSL_MSG("error: LmsKey invalid height parameter"); + return -1; + } + + switch (key->lm_ots_type[0]) { + case LMOTS_SHA256_N32_W1: + *winternitz = 1; + break; + case LMOTS_SHA256_N32_W2: + *winternitz = 2; + break; + case LMOTS_SHA256_N32_W4: + *winternitz = 4; + break; + case LMOTS_SHA256_N32_W8: + *winternitz = 8; + break; + default: + WOLFSSL_MSG("error: LmsKey invalid winternitz parameter"); + return -1; + } + + return 0; +} + +/* Frees the LMS key from memory. + * + * This does not affect the private key saved to non-volatile storage. + * */ +void wc_LmsKey_Free(LmsKey* key) +{ + if (key == NULL) { + return; + } + +#ifndef WOLFSSL_LMS_VERIFY_ONLY + if (key->working_key != NULL) { + hss_free_working_key(key->working_key); + key->working_key = NULL; + } +#endif /* ifndef WOLFSSL_LMS_VERIFY_ONLY */ + + ForceZero(key, sizeof(LmsKey)); + + key->state = WC_LMS_STATE_FREED; + + return; +} + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* Set the write private key callback to the LMS key structure. + * + * The callback must be able to write/update the private key to + * non-volatile storage. + * + * Returns 0 on success. + * */ +int wc_LmsKey_SetWriteCb(LmsKey * key, wc_lms_write_private_key_cb write_cb) +{ + if (key == NULL || write_cb == NULL) { + return BAD_FUNC_ARG; + } + + /* Changing the write callback of an already working key is forbidden. */ + if (key->state == WC_LMS_STATE_OK) { + WOLFSSL_MSG("error: wc_LmsKey_SetWriteCb: key in use"); + return -1; + } + + key->write_private_key = write_cb; + + return 0; +} + +/* Set the read private key callback to the LMS key structure. + * + * The callback must be able to read the private key from + * non-volatile storage. + * + * Returns 0 on success. + * */ +int wc_LmsKey_SetReadCb(LmsKey * key, wc_lms_read_private_key_cb read_cb) +{ + if (key == NULL || read_cb == NULL) { + return BAD_FUNC_ARG; + } + + /* Changing the read callback of an already working key is forbidden. */ + if (key->state == WC_LMS_STATE_OK) { + WOLFSSL_MSG("error: wc_LmsKey_SetReadCb: key in use"); + return -1; + } + + key->read_private_key = read_cb; + + return 0; +} + +/* Sets the context to be used by write and read callbacks. + * + * E.g. this could be a filename if the callbacks write/read to file. + * + * Returns 0 on success. + * */ +int wc_LmsKey_SetContext(LmsKey * key, void * context) +{ + if (key == NULL || context == NULL) { + return BAD_FUNC_ARG; + } + + /* Setting context of an already working key is forbidden. */ + if (key->state == WC_LMS_STATE_OK) { + WOLFSSL_MSG("error: wc_LmsKey_SetContext: key in use"); + return -1; + } + + key->context = context; + + return 0; +} + +/* Make the LMS private/public key pair. The key must have its parameters + * set before calling this. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * Returns 0 on success. + * */ +int wc_LmsKey_MakeKey(LmsKey* key, WC_RNG * rng) +{ + bool result = true; + + if (key == NULL || rng == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_LMS_STATE_PARMSET) { + WOLFSSL_MSG("error: LmsKey not ready for generation"); + return -1; + } + + if (key->write_private_key == NULL || key->read_private_key == NULL) { + WOLFSSL_MSG("error: LmsKey write/read callbacks are not set"); + return -1; + } + + if (key->context == NULL) { + WOLFSSL_MSG("error: LmsKey context is not set"); + return -1; + } + + LmsRng = rng; + + /* TODO: The hash-sigs lib allows you to save variable length auxiliary + * data, which can be used to speed up key reloading when signing. The + * aux data can be 300B - 1KB in size. + * + * Not implemented at the moment. + * + * key->aux_data_len = hss_get_aux_data_len(AUX_DATA_MAX_LEN, key->levels, + * key->lm_type, + * key->lm_ots_type); + * + * key->aux_data = XMALLOC(key->aux_data_len, NULL, + * DYNAMIC_TYPE_TMP_BUFFER); + */ + + /* First generate the private key using the parameters and callbacks. + * If successful, private key will be saved to non-volatile storage, + * and the public key will be in memory. */ + result = hss_generate_private_key(LmsGenerateRand, key->levels, + key->lm_type, key->lm_ots_type, + LmsWritePrivKey, key, + key->pub, sizeof(key->pub), + NULL, 0, &key->info); + + if (!result) { + WOLFSSL_MSG("error: hss_generate_private_key failed"); + key->state = WC_LMS_STATE_BAD; + return -1; + } + + /* Once generated, now we must load the private key so we have + * an hss working key for signing operations. */ + key->working_key = hss_load_private_key(LmsReadPrivKey, key, + 0, NULL, 0, &key->info); + + if (key->working_key == NULL) { + WOLFSSL_MSG("error: hss_load_private_key failed"); + key->state = WC_LMS_STATE_BAD; + return -1; + } + + /* This should not happen, but check just in case. */ + if (wc_LmsKey_SigsLeft(key) == 0) { + WOLFSSL_MSG("error: generated LMS key signatures exhausted"); + key->state = WC_LMS_STATE_NOSIGS; + return -1; + } + + key->state = WC_LMS_STATE_OK; + + return 0; +} + +/* Reload a key that has been prepared with the appropriate params and + * data. Use this if you wish to resume signing with an existing key. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * Returns 0 on success. */ +int wc_LmsKey_Reload(LmsKey * key) +{ + bool result = true; + + if (key == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_LMS_STATE_PARMSET) { + WOLFSSL_MSG("error: LmsKey not ready for reload"); + return -1; + } + + if (key->write_private_key == NULL || key->read_private_key == NULL) { + WOLFSSL_MSG("error: LmsKey write/read callbacks are not set"); + return -1; + } + + if (key->context == NULL) { + WOLFSSL_MSG("error: LmsKey context is not set"); + return -1; + } + + key->working_key = hss_load_private_key(LmsReadPrivKey, key, + 0, NULL, 0, &key->info); + + if (key->working_key == NULL) { + WOLFSSL_MSG("error: hss_load_private_key failed"); + key->state = WC_LMS_STATE_BAD; + return -1; + } + + result = hss_get_parameter_set(&key->levels, key->lm_type, + key->lm_ots_type, LmsReadPrivKey, key); + + if (!result) { + WOLFSSL_MSG("error: hss_get_parameter_set failed"); + key->state = WC_LMS_STATE_BAD; + hss_free_working_key(key->working_key); + key->working_key = NULL; + return -1; + } + + /* Double check the key actually has signatures left. */ + if (wc_LmsKey_SigsLeft(key) == 0) { + WOLFSSL_MSG("error: reloaded LMS key signatures exhausted"); + key->state = WC_LMS_STATE_NOSIGS; + return -1; + } + + key->state = WC_LMS_STATE_OK; + + return 0; +} + +/* Given a levels, height, winternitz parameter set, determine + * the private key length */ +int wc_LmsKey_GetPrivLen(const LmsKey * key, word32 * len) +{ + if (key == NULL || len == NULL) { + return BAD_FUNC_ARG; + } + + *len = (word32) hss_get_private_key_len(key->levels, key->lm_type, + key->lm_ots_type); + + return 0; +} + +int wc_LmsKey_Sign(LmsKey* key, byte * sig, word32 * sigSz, const byte * msg, + int msgSz) +{ + bool result = true; + size_t len = 0; + + if (key == NULL || sig == NULL || sigSz == NULL || msg == NULL) { + return BAD_FUNC_ARG; + } + + if (msgSz <= 0) { + return BAD_FUNC_ARG; + } + + if (key->state == WC_LMS_STATE_NOSIGS) { + WOLFSSL_MSG("error: LMS signatures exhausted"); + return -1; + } + else if (key->state != WC_LMS_STATE_OK) { + /* The key had an error the last time it was used, and we + * can't guarantee its state. */ + WOLFSSL_MSG("error: can't sign, LMS key not in good state"); + return -1; + } + + len = hss_get_signature_len(key->levels, key->lm_type, key->lm_ots_type); + + if (len == 0) { + /* Key parameters are invalid. */ + WOLFSSL_MSG("error: hss_get_signature_len failed"); + key->state = WC_LMS_STATE_BAD; + return -1; + } + + result = hss_generate_signature(key->working_key, LmsWritePrivKey, + key, (const void *) msg, msgSz, + sig, len, &key->info); + + if (!result) { + if (wc_LmsKey_SigsLeft(key) == 0) { + WOLFSSL_MSG("error: LMS signatures exhausted"); + key->state = WC_LMS_STATE_NOSIGS; + return -1; + } + + WOLFSSL_MSG("error: hss_generate_signature failed"); + key->state = WC_LMS_STATE_BAD; + return -1; + } + + *sigSz = (word32) len; + + return 0; +} + +/* Returns 1 if there are signatures remaining. + * Returns 0 if available signatures are exhausted. + * + * Note: the number of remaining signatures is hidden behind an opaque + * pointer in the hash-sigs lib. We could add a counter here that is + * decremented on every signature. The number of available signatures + * grows as + * N = 2 ** (levels * height) + * so it would need to be a big integer. */ +int wc_LmsKey_SigsLeft(LmsKey * key) +{ + if (key == NULL) { + return BAD_FUNC_ARG; + } + + if (hss_extra_info_test_last_signature(&key->info)) { + return 0; + } + + return 1; +} + +#endif /* ifndef WOLFSSL_LMS_VERIFY_ONLY*/ + +/* Given a levels, height, winternitz parameter set, determine + * the public key length */ +int wc_LmsKey_GetPubLen(const LmsKey * key, word32 * len) +{ + if (key == NULL || len == NULL) { + return BAD_FUNC_ARG; + } + + *len = (word32) hss_get_public_key_len(key->levels, key->lm_type, + key->lm_ots_type); + + return 0; +} + +/* Export a generated public key and parameter set from one LmsKey + * to another. Use this to prepare a signature verification LmsKey + * that is pub only. + * + * Though the public key is all that is used to verify signatures, + * the parameter set is needed to calculate the signature length + * before hand. */ +int wc_LmsKey_ExportPub(LmsKey * keyDst, const LmsKey * keySrc) +{ + if (keyDst == NULL || keySrc == NULL) { + return BAD_FUNC_ARG; + } + + ForceZero(keyDst, sizeof(LmsKey)); + + XMEMCPY(keyDst->pub, keySrc->pub, sizeof(keySrc->pub)); + XMEMCPY(keyDst->lm_type, keySrc->lm_type, sizeof(keySrc->lm_type)); + XMEMCPY(keyDst->lm_ots_type, keySrc->lm_ots_type, + sizeof(keySrc->lm_ots_type)); + + keyDst->levels = keySrc->levels; + + /* Mark this key as verify only, to prevent misuse. */ + keyDst->state = WC_LMS_STATE_VERIFYONLY; + + return 0; +} + +/* Exports the raw LMS public key buffer from key to out buffer. + * The out buffer should be large enough to hold the public key, and + * outLen should indicate the size of the buffer. + * + * - Returns 0 on success, and sets outLen to LMS pubLen. + * - Returns BUFFER_E if outLen < LMS pubLen. + * + * Call wc_LmsKey_GetPubLen beforehand to determine pubLen. + * */ +int wc_LmsKey_ExportPubRaw(const LmsKey * key, byte * out, word32 * outLen) +{ + int ret = 0; + word32 pubLen = 0; + + if (key == NULL || out == NULL || outLen == NULL) { + return BAD_FUNC_ARG; + } + + ret = wc_LmsKey_GetPubLen(key, &pubLen); + + if (ret != 0) { + WOLFSSL_MSG("error: wc_LmsKey_GetPubLen failed"); + return -1; + } + + if (*outLen < pubLen) { + return BUFFER_E; + } + + XMEMCPY(out, key->pub, pubLen); + *outLen = pubLen; + + return 0; +} + +/* Imports a raw public key buffer from in array to LmsKey key. + * + * The LMS parameters must be set first with wc_LmsKey_SetLmsParm or + * wc_LmsKey_SetParameters, and inLen must match the length returned + * by wc_LmsKey_GetPubLen. + * + * - Returns 0 on success. + * - Returns BUFFER_E if inlen != LMS pubLen. + * + * Call wc_LmsKey_GetPubLen beforehand to determine pubLen. + * */ +int wc_LmsKey_ImportPubRaw(LmsKey * key, const byte * in, word32 inLen) +{ + int ret = 0; + word32 pubLen = 0; + + if (key == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + ret = wc_LmsKey_GetPubLen(key, &pubLen); + + if (ret != 0) { + WOLFSSL_MSG("error: wc_LmsKey_GetPubLen failed"); + return -1; + } + + if (inLen != pubLen) { + /* Something inconsistent. Parameters weren't set, or input + * pub key is wrong.*/ + return BUFFER_E; + } + + XMEMCPY(key->pub, in, pubLen); + + return 0; +} + +/* Given a levels, height, winternitz parameter set, determine + * the signature length. + * + * Call this before wc_LmsKey_Sign so you know the length of + * the required signature buffer. */ +int wc_LmsKey_GetSigLen(const LmsKey * key, word32 * len) +{ + if (key == NULL || len == NULL) { + return BAD_FUNC_ARG; + } + + *len = (word32) hss_get_signature_len(key->levels, key->lm_type, + key->lm_ots_type); + + return 0; +} + +int wc_LmsKey_Verify(LmsKey * key, const byte * sig, word32 sigSz, + const byte * msg, int msgSz) +{ + bool result = true; + + if (key == NULL || sig == NULL || msg == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_LMS_VERIFY_ONLY + result = hss_validate_signature(key->pub, (const void *) msg, msgSz, sig, + sigSz, NULL); +#else + result = hss_validate_signature(key->pub, (const void *) msg, msgSz, sig, + sigSz, &key->info); +#endif + + + if (!result) { + WOLFSSL_MSG("error: hss_validate_signature failed"); + return -1; + } + + return 0; +} + +#endif /* WOLFSSL_HAVE_LMS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ext_xmss.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_xmss.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ext_xmss.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ext_xmss.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1045 @@ +/* ext_xmss.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include + +#ifdef WOLFSSL_HAVE_XMSS +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +#include +#include + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY +static THREAD_LS_T WC_RNG * xmssRng = NULL; + +/* RNG callback used by xmss. + * */ +static int rng_cb(void * output, size_t length) +{ + int ret = 0; + + if (output == NULL || xmssRng == NULL) { + return -1; + } + + if (length == 0) { + return 0; + } + + ret = wc_RNG_GenerateBlock(xmssRng, (byte *)output, (word32)length); + + if (ret) { + WOLFSSL_MSG("error: XMSS rng_cb failed"); + return -1; + } + + return 0; +} +#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY */ + +/* SHA256 callback used by XMSS. + * */ +static int sha256_cb(const unsigned char *in, unsigned long long inlen, + unsigned char *out) +{ + wc_Sha256 sha; + + if (wc_InitSha256_ex(&sha, NULL, INVALID_DEVID) != 0) { + WOLFSSL_MSG("SHA256 Init failed"); + return -1; + } + + if (wc_Sha256Update(&sha, in, (word32) inlen) != 0) { + WOLFSSL_MSG("SHA256 Update failed"); + return -1; + } + + if (wc_Sha256Final(&sha, out) != 0) { + WOLFSSL_MSG("SHA256 Final failed"); + wc_Sha256Free(&sha); + return -1; + } + wc_Sha256Free(&sha); + + return 0; +} + +/* Init an XMSS key. + * + * Call this before setting the params of an XMSS key. + * + * key [in] The XMSS key to init. + * heap [in] Unused. + * devId [in] Unused. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * */ +int wc_XmssKey_Init(XmssKey * key, void * heap, int devId) +{ + if (key == NULL) { + return BAD_FUNC_ARG; + } + + (void) heap; + (void) devId; + + ForceZero(key, sizeof(XmssKey)); + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + key->sk = NULL; + key->sk_len = 0; + key->write_private_key = NULL; + key->read_private_key = NULL; + key->context = NULL; +#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY */ + key->state = WC_XMSS_STATE_INITED; + + return 0; +} + +/* Sets the XMSS key parameters, given an OID. + * + * Note: XMSS and XMSS^MT parameter sets do have overlapping + * OIDs, therefore is_xmssmt is necessary to toggle. + * + * key [in] The XMSS key to set. + * OID [in] The XMSS parameter set OID. + * is_xmssmt [in] 1 The OID is assumed to be XMSS^MT. + * 0 The OID is assumed to be XMSS. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on parse failure. + * */ +static int wc_XmssKey_SetOid(XmssKey * key, uint32_t oid, int is_xmssmt) +{ + int ret = 0; + + if (key == NULL || oid == 0) { + return BAD_FUNC_ARG; + } + + /* Parse the OID and load the XMSS params structure. */ + if (is_xmssmt) { + ret = xmssmt_parse_oid(&key->params, oid); + } + else { + ret = xmss_parse_oid(&key->params, oid); + } + + if (ret != 0) { + WOLFSSL_MSG("error: XMSS parse oid failed"); + return -1; + } + + /* Finally, sanity check that this is a supported parameter set. + * + * We are only supporting XMSS/XMSS^MT with SHA256 parameter sets + * that NIST SP 800-208 has standardized. See patched xmss-reference + * params.h for the defines. */ + if (key->params.func != XMSS_SHA2 || + key->params.n != XMSS_SHA256_N || + key->params.padding_len != XMSS_SHA256_PADDING_LEN || + key->params.wots_w != 16 || + key->params.wots_len != XMSS_SHA256_WOTS_LEN) { + WOLFSSL_MSG("error: unsupported XMSS/XMSS^MT parameter set"); + return -1; + } + if ((key->params.full_height < WOLFSSL_XMSS_MIN_HEIGHT) || + (key->params.full_height > WOLFSSL_XMSS_MAX_HEIGHT)) { + WOLFSSL_MSG("error: unsupported XMSS/XMSS^MT parameter set - height"); + return -1; + } + + ret = xmss_set_sha_cb(sha256_cb); + if (ret != 0) { + WOLFSSL_MSG("error: xmss_set_sha_cb failed"); + return -1; + } + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + ret = xmss_set_rng_cb(rng_cb); + if (ret != 0) { + WOLFSSL_MSG("error: xmss_set_rng_cb failed"); + return -1; + } +#endif + + key->oid = oid; + key->is_xmssmt = is_xmssmt; + key->state = WC_XMSS_STATE_PARMSET; + + return 0; +} + +/* Set the XMSS key parameter string. + * + * The input string must be one of the supported param set names in + * the "Name" section from the table in wolfssl/wolfcrypt/xmss.h, + * e.g. "XMSS-SHA2_10_256" or "XMSSMT-SHA2_20/4_256". + * + * key [in] The XMSS key to set. + * str [in] The XMSS/XMSS^MT parameter string. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on failure. + * */ +int wc_XmssKey_SetParamStr(XmssKey * key, const char * str) +{ + int ret = 0; + uint32_t oid = 0; + int is_xmssmt = 0; + + if (key == NULL || str == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_XMSS_STATE_INITED) { + WOLFSSL_MSG("error: XMSS key needs init"); + return BAD_FUNC_ARG; + } + + switch(XSTRLEN(str)) { + case XMSS_NAME_LEN: + is_xmssmt = 0; + break; + case XMSSMT_NAME_MIN_LEN: + case XMSSMT_NAME_MAX_LEN: + is_xmssmt = 1; + break; + default: + WOLFSSL_MSG("error: XMSS param str invalid length"); + return BAD_FUNC_ARG; + } + + /* Convert XMSS param string to OID. */ + if (is_xmssmt) { + ret = xmssmt_str_to_oid(&oid, str); + } + else { + ret = xmss_str_to_oid(&oid, str); + } + + if (ret != 0) { + WOLFSSL_MSG("error: xmssmt_str_to_oid failed"); + return -1; + } + + return wc_XmssKey_SetOid(key, oid, is_xmssmt); +} + +/* Force zeros and frees the XMSS key from memory. + * + * This does not touch the private key saved to non-volatile storage. + * + * This is the only function that frees the key->sk array. + * + * key [in] The XMSS key. + * + * returns void + * */ +void wc_XmssKey_Free(XmssKey* key) +{ + if (key == NULL) { + return; + } + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + if (key->sk != NULL) { + ForceZero(key->sk, key->sk_len); + XFREE(key->sk, NULL, DYNAMIC_TYPE_TMP_BUFFER); + key->sk = NULL; + key->sk_len = 0; + } +#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY */ + + ForceZero(key, sizeof(XmssKey)); + + key->state = WC_XMSS_STATE_FREED; + + return; +} + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY +/* Sets the XMSS write private key callback. + * + * The callback must be able to write/update the private key to + * non-volatile storage. + * + * key [in] The XMSS key. + * write_cb [in] The write private key callback. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on failure. + * */ +int wc_XmssKey_SetWriteCb(XmssKey * key, wc_xmss_write_private_key_cb write_cb) +{ + if (key == NULL || write_cb == NULL) { + return BAD_FUNC_ARG; + } + + /* Changing the write callback of an already working key is forbidden. */ + if (key->state == WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: wc_XmssKey_SetWriteCb: key in use"); + return -1; + } + + key->write_private_key = write_cb; + + return 0; +} + +/* Sets the XMSS read private key callback. + * + * The callback must be able to read the private key from + * non-volatile storage. + * + * key [in] The XMSS key. + * read_cb [in] The read private key callback. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on failure. + * */ +int wc_XmssKey_SetReadCb(XmssKey * key, wc_xmss_read_private_key_cb read_cb) +{ + if (key == NULL || read_cb == NULL) { + return BAD_FUNC_ARG; + } + + /* Changing the read callback of an already working key is forbidden. */ + if (key->state == WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: wc_XmssKey_SetReadCb: key in use"); + return -1; + } + + key->read_private_key = read_cb; + + return 0; +} + +/* Sets the XMSS context to be used by write and read callbacks. + * + * E.g. this could be a filename if the callbacks write/read to file. + * + * key [in] The XMSS key. + * context [in] The context pointer. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on failure. + * */ +int wc_XmssKey_SetContext(XmssKey * key, void * context) +{ + if (key == NULL || context == NULL) { + return BAD_FUNC_ARG; + } + + /* Setting context of an already working key is forbidden. */ + if (key->state == WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: wc_XmssKey_SetContext: key in use"); + return -1; + } + + key->context = context; + + return 0; +} + + +/* Allocates the XMSS secret key (sk) array. + * + * The XMSS/XMSS^MT secret key length is a function of the + * parameters, and can't be allocated until the param string + * has been set with SetParamStr. + * + * This is only called by MakeKey() and Reload(). + * + * Note: the XMSS sk array is force zeroed after every use. + * + * key [in] The XMSS key. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on failure. + * */ +static int wc_XmssKey_AllocSk(XmssKey* key) +{ + int ret = 0; + + if (key == NULL) { + return BAD_FUNC_ARG; + } + + if (key->sk != NULL) { + WOLFSSL_MSG("error: XMSS secret key already exists"); + return -1; + } + + /* The XMSS/XMSS^MT secret key length is a function of the + * parameters. Therefore can't allocate this until param + * string has been set. */ + ret = wc_XmssKey_GetPrivLen(key, &key->sk_len); + + if (ret != 0 || key->sk_len <= 0) { + WOLFSSL_MSG("error: wc_XmssKey_GetPrivLen failed"); + return -1; + } + + key->sk = (unsigned char *)XMALLOC(key->sk_len, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + + if (key->sk == NULL) { + WOLFSSL_MSG("error: malloc XMSS key->sk failed"); + return -1; + } + + ForceZero(key->sk, key->sk_len); + + return 0; +} + +/* Make the XMSS/XMSS^MT private/public key pair. The key must have its parameters + * set before calling this. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * This function and Reload() are the only functions that allocate + * key->sk array. wc_XmssKey_FreeKey is the only function that + * deallocates key->sk. + * + * key [in] The XMSS key to make. + * rng [in] Initialized WC_RNG pointer. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on verify fail. + * */ +int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG * rng) +{ + int ret = 0; + enum wc_XmssRc cb_rc = WC_XMSS_RC_NONE; + + if (key == NULL || rng == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_XMSS_STATE_PARMSET) { + WOLFSSL_MSG("error: XmssKey not ready for generation"); + return -1; + } + + if (key->write_private_key == NULL || key->read_private_key == NULL) { + WOLFSSL_MSG("error: XmssKey write/read callbacks are not set"); + return -1; + } + + if (key->context == NULL) { + WOLFSSL_MSG("error: XmssKey context is not set"); + return -1; + } + + /* Allocate sk array. */ + ret = wc_XmssKey_AllocSk(key); + + if (ret != 0) { + return ret; + } + + xmssRng = rng; + + /* Finally make the secret public key pair. Immediately write it to NV + * storage and then clear from memory. */ + if (key->is_xmssmt) { + ret = xmssmt_keypair(key->pk, key->sk, key->oid); + } + else { + ret = xmss_keypair(key->pk, key->sk, key->oid); + } + + if (ret == 0) { + cb_rc = key->write_private_key(key->sk, key->sk_len, key->context); + } + + ForceZero(key->sk, key->sk_len); + + if (ret != 0) { + WOLFSSL_MSG("error: XMSS keypair failed"); + key->state = WC_XMSS_STATE_BAD; + return -1; + } + + if (cb_rc != WC_XMSS_RC_SAVED_TO_NV_MEMORY) { + WOLFSSL_MSG("error: XMSS write to NV storage failed"); + key->state = WC_XMSS_STATE_BAD; + return -1; + } + + key->state = WC_XMSS_STATE_OK; + + return 0; +} + +/* This function allocates the secret key buffer, and does a + * quick sanity check to verify the secret key is readable + * from NV storage, and then force zeros the key from memory. + * + * On success it sets the key state to OK. + * + * Use this function to resume signing with an already existing + * XMSS key pair. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * Returns 0 on success. + * + * This function and MakeKey are the only functions that allocate + * key->sk array. wc_XmssKey_FreeKey is the only function that + * deallocates key->sk. + * + * key [in] XMSS key to load. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on load fail. + * */ +int wc_XmssKey_Reload(XmssKey * key) +{ + int ret = 0; + enum wc_XmssRc cb_rc = WC_XMSS_RC_NONE; + + if (key == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_XMSS_STATE_PARMSET) { + WOLFSSL_MSG("error: XmssKey not ready for reload"); + return -1; + } + + if (key->write_private_key == NULL || key->read_private_key == NULL) { + WOLFSSL_MSG("error: XmssKey write/read callbacks are not set"); + return -1; + } + + if (key->context == NULL) { + WOLFSSL_MSG("error: XmssKey context is not set"); + return -1; + } + + /* Allocate sk array. */ + ret = wc_XmssKey_AllocSk(key); + + if (ret != 0) { + return ret; + } + + /* Read the current secret key from NV storage. Force clear it + * immediately. This is just to sanity check the secret key + * is readable from permanent storage. */ + cb_rc = key->read_private_key(key->sk, key->sk_len, key->context); + ForceZero(key->sk, key->sk_len); + + if (cb_rc != WC_XMSS_RC_READ_TO_MEMORY) { + WOLFSSL_MSG("error: XMSS read from NV storage failed"); + key->state = WC_XMSS_STATE_BAD; + return -1; + } + + key->state = WC_XMSS_STATE_OK; + + return 0; +} + +/* Gets the XMSS/XMSS^MT private key length. + * + * Parameters must be set before calling this, as the key size (sk_bytes) + * is a function of the parameters. + * + * Note: the XMSS/XMSS^MT private key format is implementation specific, + * and not standardized. Interoperability of XMSS private keys should + * not be expected. + * + * key [in] The XMSS key. + * len [out] The length of the private key in bytes. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on sign fail. + * */ +int wc_XmssKey_GetPrivLen(const XmssKey * key, word32 * len) +{ + if (key == NULL || len == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_XMSS_STATE_OK && key->state != WC_XMSS_STATE_PARMSET) { + /* params.sk_bytes not set yet. */ + return -1; + } + + *len = XMSS_OID_LEN + (word32) key->params.sk_bytes; + + return 0; +} + +/* Signs the message using the XMSS secret key, and + * updates the secret key on NV storage. + * + * Both operations must succeed to be considered + * successful. + * + * On success: sets key state to WC_XMSS_STATE_OK. + * On failure: sets key state to WC_XMSS_STATE_BAD + * + * If no signatures are left, sets state to WC_XMSS_STATE_NOSIGS. + */ +static void wc_XmssKey_SignUpdate(XmssKey* key, byte * sig, word32 * sigLen, + const byte * msg, int msgLen) +{ + int ret = -1; + unsigned long long len = *sigLen; + enum wc_XmssRc cb_rc = WC_XMSS_RC_NONE; + + /* Set the key state to bad by default. State is presumed bad + * unless a correct sign and update operation happen together. */ + key->state = WC_XMSS_STATE_BAD; + *sigLen = 0; + + /* Read the current secret key from NV storage.*/ + cb_rc = key->read_private_key(key->sk, key->sk_len, key->context); + + if (cb_rc == WC_XMSS_RC_READ_TO_MEMORY) { + /* Read was good. Now sign and update the secret key in memory. */ + if (key->is_xmssmt) { + ret = xmssmt_sign(key->sk, sig, &len, msg, msgLen); + } + else { + ret = xmss_sign(key->sk, sig, &len, msg, msgLen); + } + + if (ret == 0 && len == key->params.sig_bytes) { + /* The signature succeeded. key->sk is now updated and must be + * committed to NV storage. */ + cb_rc = key->write_private_key(key->sk, key->sk_len, key->context); + + if (cb_rc == WC_XMSS_RC_SAVED_TO_NV_MEMORY) { + /* key->sk was successfully committed to NV storage. Set the + * key state to OK, and set the sigLen. */ + key->state = WC_XMSS_STATE_OK; + *sigLen = (word32) len; + } + else { + /* Write to NV storage failed. Erase the signature from + * memory. */ + ForceZero(sig, key->params.sig_bytes); + WOLFSSL_MSG("error: XMSS write_private_key failed"); + } + } + else if (ret == -2) { + /* Signature space exhausted. */ + key->state = WC_XMSS_STATE_NOSIGS; + WOLFSSL_MSG("error: no XMSS signatures remaining"); + } + else { + /* Something failed or inconsistent in signature. Erase the + * signature just to be safe. */ + ForceZero(sig, key->params.sig_bytes); + WOLFSSL_MSG("error: XMSS sign failed"); + } + } + else { + /* Read from NV storage failed. */ + WOLFSSL_MSG("error: XMSS read_private_key failed"); + } + + /* Force zero the secret key from memory always. */ + ForceZero(key->sk, key->sk_len); + + return; +} + +/* Sign the message using the XMSS secret key. + * + * key [in] XMSS key to use to sign. + * sig [in] Buffer to write signature into. + * sigLen [in/out] On in, size of buffer. + * On out, the length of the signature in bytes. + * msg [in] Message to sign. + * msgLen [in] Length of the message in bytes. + * + * returns 0 on success. + * returns -1 on sign fail. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns BUFFER_E when sigLen is too small. + */ +int wc_XmssKey_Sign(XmssKey* key, byte * sig, word32 * sigLen, const byte * msg, + int msgLen) +{ + if (key == NULL || sig == NULL || sigLen == NULL || msg == NULL) { + return BAD_FUNC_ARG; + } + + if (msgLen <= 0) { + return BAD_FUNC_ARG; + } + + if (*sigLen < key->params.sig_bytes) { + /* Signature buffer too small. */ + WOLFSSL_MSG("error: XMSS sig buffer too small"); + return BUFFER_E; + } + + if (key->state == WC_XMSS_STATE_NOSIGS) { + WOLFSSL_MSG("error: XMSS signatures exhausted"); + return -1; + } + else if (key->state != WC_XMSS_STATE_OK) { + /* The key had an error the last time it was used, and we + * can't guarantee its state. */ + WOLFSSL_MSG("error: can't sign, XMSS key not in good state"); + return -1; + } + + if (key->write_private_key == NULL || key->read_private_key == NULL) { + WOLFSSL_MSG("error: XmssKey write/read callbacks are not set"); + return -1; + } + + if (key->context == NULL) { + WOLFSSL_MSG("error: XmssKey context is not set"); + return -1; + } + + /* Finally, sign and update the secret key. */ + wc_XmssKey_SignUpdate(key, sig, sigLen, msg, msgLen); + + return (key->state == WC_XMSS_STATE_OK) ? 0 : -1; +} + + +/* Check if more signatures are possible with key. + * + * @param [in] key XMSS key to check. + * @return 1 when signatures possible. + * @return 0 when key exhausted. + */ +int wc_XmssKey_SigsLeft(XmssKey* key) +{ + int ret = 0; + + /* Validate parameter. */ + if (key == NULL) { + ret = 0; + } + /* Validate state. */ + else if (key->state == WC_XMSS_STATE_NOSIGS) { + WOLFSSL_MSG("error: XMSS signatures exhausted"); + ret = 0; + } + else if (key->state != WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: can't sign, XMSS key not in good state"); + ret = 0; + } + /* Read the current secret key from NV storage.*/ + else if (key->read_private_key(key->sk, key->sk_len, key->context) != + WC_XMSS_RC_READ_TO_MEMORY) { + WOLFSSL_MSG("error: XMSS read_private_key failed"); + ret = 0; + } + else { + /* The following assumes core_fast implementation is used + * from patched xmss-reference. */ + const unsigned char* sk = (key->sk + XMSS_OID_LEN); + const xmss_params* params = &key->params; + unsigned long long idx = 0; + + if (key->is_xmssmt) { + for (uint64_t i = 0; i < params->index_bytes; i++) { + idx |= ((unsigned long long)sk[i]) + << 8 * (params->index_bytes - 1 - i); + } + } + else { + idx = ((unsigned long)sk[0] << 24) | + ((unsigned long)sk[1] << 16) | + ((unsigned long)sk[2] << 8) | sk[3]; + } + + ret = idx < ((1ULL << params->full_height) - 1); + + /* Force zero the secret key from memory always. */ + ForceZero(key->sk, key->sk_len); + } + + return ret; +} +#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY*/ + +/* Get the XMSS/XMSS^MT public key length. The public key + * is static in size and does not depend on parameters, + * other than the choice of SHA256 as hashing function. + * + * key [in] The XMSS key. + * len [out] The length of the public key. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + */ +int wc_XmssKey_GetPubLen(const XmssKey * key, word32 * len) +{ + if (key == NULL || len == NULL) { + return BAD_FUNC_ARG; + } + + *len = XMSS_SHA256_PUBLEN; + + return 0; +} + +/* Export a generated public key and parameter set from one XmssKey + * to another. Use this to prepare a signature verification XmssKey + * that is pub only. + * + * keyDst [out] Destination key for copy. + * keySrc [in] Source key for copy. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * */ +int wc_XmssKey_ExportPub(XmssKey * keyDst, const XmssKey * keySrc) +{ + if (keyDst == NULL || keySrc == NULL) { + return BAD_FUNC_ARG; + } + + ForceZero(keyDst, sizeof(XmssKey)); + + XMEMCPY(keyDst->pk, keySrc->pk, sizeof(keySrc->pk)); + + keyDst->oid = keySrc->oid; + keyDst->is_xmssmt = keySrc->is_xmssmt; + + /* Mark keyDst as verify only, to prevent misuse. */ + keyDst->state = WC_XMSS_STATE_VERIFYONLY; + + return 0; +} + +/* Exports the raw XMSS public key buffer from key to out buffer. + * The out buffer should be large enough to hold the public key, and + * outLen should indicate the size of the buffer. + * + * key [in] XMSS key. + * out [out] Array holding public key. + * outLen [in/out] On in, size of buffer. + * On out, the length of the public key. + * + * returns 0 on success. + * returns -1 on failure. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns BUFFER_E if array is too small. + * */ +int wc_XmssKey_ExportPubRaw(const XmssKey * key, byte * out, word32 * outLen) +{ + int ret = 0; + word32 pubLen = 0; + + if (key == NULL || out == NULL || outLen == NULL) { + return BAD_FUNC_ARG; + } + + ret = wc_XmssKey_GetPubLen(key, &pubLen); + + if (ret != 0) { + WOLFSSL_MSG("error: wc_XmssKey_GetPubLen failed"); + return -1; + } + + if (*outLen < pubLen) { + return BUFFER_E; + } + + XMEMCPY(out, key->pk, pubLen); + *outLen = pubLen; + + return 0; +} + +/* Imports a raw public key buffer from in array to XmssKey key. + * + * The XMSS parameters must be set first with wc_XmssKey_SetParamStr, + * and inLen must match the length returned by wc_XmssKey_GetPubLen. + * + * key [in] XMSS key. + * in [in] Array holding public key. + * inLen [in] Length of array in bytes. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns BUFFER_E if array is incorrect size. + * returns -1 on failure. + * */ +int wc_XmssKey_ImportPubRaw(XmssKey * key, const byte * in, word32 inLen) +{ + int ret = 0; + word32 pubLen = 0; + + if (key == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_XMSS_STATE_PARMSET) { + /* XMSS key not ready for import. Param str must be set first. */ + WOLFSSL_MSG("error: XMSS key not ready for import"); + return -1; + } + + ret = wc_XmssKey_GetPubLen(key, &pubLen); + + if (ret != 0) { + WOLFSSL_MSG("error: wc_XmssKey_GetPubLen failed"); + return -1; + } + + if (inLen != pubLen) { + /* Something inconsistent. Parameters weren't set, or input + * pub key is wrong.*/ + return BUFFER_E; + } + + XMEMCPY(key->pk, in, pubLen); + + key->state = WC_XMSS_STATE_VERIFYONLY; + + return 0; +} + +/* Gets the XMSS/XMSS^MT signature length. + * + * Parameters must be set before calling this, as the signature size + * is a function of the parameters. + * + * Note: call this before wc_XmssKey_Sign or Verify so you know the + * length of the required signature buffer. + * + * key [in] XMSS key to use to sign. + * len [out] The length of the signature in bytes. + * + * returns 0 on success. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns -1 on sign fail. + * */ +int wc_XmssKey_GetSigLen(const XmssKey * key, word32 * len) +{ + if (key == NULL || len == NULL) { + return BAD_FUNC_ARG; + } + + if (key->state != WC_XMSS_STATE_OK && key->state != WC_XMSS_STATE_PARMSET) { + return -1; + } + + *len = key->params.sig_bytes; + + return 0; +} + +/* Verify the signature using the XMSS public key. + * + * Requires that XMSS parameters have been set with + * wc_XmssKey_SetParamStr, and that a public key is available + * from importing or MakeKey(). + * + * Call wc_XmssKey_GetSigLen() before this function to determine + * length of the signature buffer. + * + * key [in] XMSS key to use to verify. + * sig [in] Signature to verify. + * sigLen [in] Size of signature in bytes. + * msg [in] Message to verify. + * msgLen [in] Length of the message in bytes. + * + * returns 0 on success. + * returns -1 on verify fail. + * returns BAD_FUNC_ARG when a parameter is NULL. + * returns BUFFER_E when sigLen is too small. + */ +int wc_XmssKey_Verify(XmssKey * key, const byte * sig, word32 sigLen, + const byte * msg, int msgLen) +{ + int ret = 0; + unsigned long long msg_len = 0; + + msg_len = msgLen; + + if (key == NULL || sig == NULL || msg == NULL) { + return BAD_FUNC_ARG; + } + + if (sigLen < key->params.sig_bytes) { + /* Signature buffer too small. */ + return BUFFER_E; + } + + if (key->state != WC_XMSS_STATE_OK && + key->state != WC_XMSS_STATE_VERIFYONLY) { + /* XMSS key not ready for verification. Param str must be + * set first, and Reload() called. */ + WOLFSSL_MSG("error: XMSS key not ready for verification"); + return -1; + } + + if (key->is_xmssmt) { + ret = xmssmt_sign_open(msg, &msg_len, sig, sigLen, key->pk); + } + else { + ret = xmss_sign_open(msg, &msg_len, sig, sigLen, key->pk); + } + + if (ret != 0 || (int) msg_len != msgLen) { + WOLFSSL_MSG("error: XMSS verify failed"); + return -1; + } + + return ret; +} + +#endif /* WOLFSSL_HAVE_XMSS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/falcon.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/falcon.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/falcon.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/falcon.c 2024-08-03 07:30:00.000000000 +0000 @@ -59,17 +59,32 @@ */ int wc_falcon_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen, - falcon_key* key) + falcon_key* key, WC_RNG* rng) { int ret = 0; -#ifdef HAVE_LIBOQS - OQS_SIG *oqssig = NULL; - size_t localOutLen = 0; /* sanity check on arguments */ if ((in == NULL) || (out == NULL) || (outLen == NULL) || (key == NULL)) { - ret = BAD_FUNC_ARG; + return BAD_FUNC_ARG; + } + +#ifdef WOLF_CRYPTO_CB + #ifndef WOLF_CRYPTO_CB_FIND + if (key->devId != INVALID_DEVID) + #endif + { + ret = wc_CryptoCb_PqcSign(in, inLen, out, outLen, rng, + WC_PQC_SIG_TYPE_FALCON, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; } +#endif + +#ifdef HAVE_LIBOQS + OQS_SIG *oqssig = NULL; + size_t localOutLen = 0; if ((ret == 0) && (!key->prvKeySet)) { ret = BAD_FUNC_ARG; @@ -88,6 +103,10 @@ } } + if ((ret == 0) && (oqssig == NULL)) { + ret = BUFFER_E; + } + /* check and set up out length */ if (ret == 0) { if ((key->level == 1) && (*outLen < FALCON_LEVEL1_SIG_SIZE)) { @@ -101,6 +120,10 @@ localOutLen = *outLen; } + if (ret == 0) { + ret = wolfSSL_liboqsRngMutexLock(rng); + } + if ((ret == 0) && (OQS_SIG_sign(oqssig, out, &localOutLen, in, inLen, key->k) == OQS_ERROR)) { @@ -111,6 +134,8 @@ *outLen = (word32)localOutLen; } + wolfSSL_liboqsRngMutexUnlock(); + if (oqssig != NULL) { OQS_SIG_free(oqssig); } @@ -136,13 +161,28 @@ word32 msgLen, int* res, falcon_key* key) { int ret = 0; -#ifdef HAVE_LIBOQS - OQS_SIG *oqssig = NULL; if (key == NULL || sig == NULL || msg == NULL || res == NULL) { - ret = BAD_FUNC_ARG; + return BAD_FUNC_ARG; } +#ifdef WOLF_CRYPTO_CB + #ifndef WOLF_CRYPTO_CB_FIND + if (key->devId != INVALID_DEVID) + #endif + { + ret = wc_CryptoCb_PqcVerify(sig, sigLen, msg, msgLen, res, + WC_PQC_SIG_TYPE_FALCON, key); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + ret = 0; + } +#endif + +#ifdef HAVE_LIBOQS + OQS_SIG *oqssig = NULL; + if ((ret == 0) && (!key->pubKeySet)) { ret = BAD_FUNC_ARG; } @@ -160,6 +200,10 @@ } } + if ((ret == 0) && (oqssig == NULL)) { + ret = BUFFER_E; + } + if ((ret == 0) && (OQS_SIG_verify(oqssig, msg, msgLen, sig, sigLen, key->p) == OQS_ERROR)) { @@ -187,14 +231,91 @@ */ int wc_falcon_init(falcon_key* key) { + return wc_falcon_init_ex(key, NULL, INVALID_DEVID); +} + +/* Initialize the falcon private/public key. + * + * key [in] Falcon key. + * heap [in] Heap hint. + * devId[in] Device ID. + * returns BAD_FUNC_ARG when key is NULL + */ +int wc_falcon_init_ex(falcon_key* key, void* heap, int devId) +{ if (key == NULL) { return BAD_FUNC_ARG; } - ForceZero(key, sizeof(key)); + ForceZero(key, sizeof(*key)); + +#ifdef WOLF_CRYPTO_CB + key->devCtx = NULL; + key->devId = devId; +#endif +#ifdef WOLF_PRIVATE_KEY_ID + key->idLen = 0; + key->labelLen = 0; +#endif + + (void) heap; + (void) devId; + return 0; } +#ifdef WOLF_PRIVATE_KEY_ID +int wc_falcon_init_id(falcon_key* key, const unsigned char* id, int len, + void* heap, int devId) +{ + int ret = 0; + + if (key == NULL) + ret = BAD_FUNC_ARG; + if (ret == 0 && (len < 0 || len > FALCON_MAX_ID_LEN)) + ret = BUFFER_E; + + if (ret == 0) + ret = wc_falcon_init_ex(key, heap, devId); + if (ret == 0 && id != NULL && len != 0) { + XMEMCPY(key->id, id, (size_t)len); + key->idLen = len; + } + + /* Set the maximum level here */ + wc_falcon_set_level(key, 5); + + return ret; +} + +int wc_falcon_init_label(falcon_key* key, const char* label, void* heap, + int devId) +{ + int ret = 0; + int labelLen = 0; + + if (key == NULL || label == NULL) + ret = BAD_FUNC_ARG; + if (ret == 0) { + labelLen = (int)XSTRLEN(label); + if (labelLen == 0 || labelLen > FALCON_MAX_LABEL_LEN) + ret = BUFFER_E; + } + + if (ret == 0) + ret = wc_falcon_init_ex(key, heap, devId); + if (ret == 0) { + XMEMCPY(key->label, label, (size_t)labelLen); + key->labelLen = labelLen; + } + + /* Set the maximum level here */ + wc_falcon_set_level(key, 5); + + return ret; +} +#endif + /* Set the level of the falcon private/public key. * * key [out] Falcon key. @@ -244,7 +365,7 @@ void wc_falcon_free(falcon_key* key) { if (key != NULL) { - ForceZero(key, sizeof(key)); + ForceZero(key, sizeof(*key)); } } @@ -348,7 +469,8 @@ /* At this point, it is still a PKCS8 private key. */ if ((ret = ToTraditionalInline(priv, &idx, privSz)) < 0) { - return ret; + /* ignore error, did not have PKCS8 header */ + (void)ret; } /* Now it is a octet_string(concat(priv,pub)) */ @@ -393,12 +515,7 @@ return ret; } - if (key->level == 1) { - XMEMCPY(key->k, newPriv, FALCON_LEVEL1_KEY_SIZE); - } - else if (key->level == 5) { - XMEMCPY(key->k, newPriv, FALCON_LEVEL5_KEY_SIZE); - } + XMEMCPY(key->k, newPriv, newPrivSz); key->prvKeySet = 1; return 0; @@ -456,12 +573,7 @@ if (ret == 0) { /* make the private key (priv + pub) */ - if (key->level == 1) { - XMEMCPY(key->k, newPriv, FALCON_LEVEL1_KEY_SIZE); - } - else if (key->level == 5) { - XMEMCPY(key->k, newPriv, FALCON_LEVEL5_KEY_SIZE); - } + XMEMCPY(key->k, newPriv, newPrivSz); key->prvKeySet = 1; } @@ -544,14 +656,14 @@ if (key->level == 1) { *outLen = FALCON_LEVEL1_PRV_KEY_SIZE; - XMEMCPY(out, key->k, FALCON_LEVEL1_PRV_KEY_SIZE); - XMEMCPY(out + FALCON_LEVEL1_PRV_KEY_SIZE, key->p, + XMEMCPY(out, key->k, FALCON_LEVEL1_KEY_SIZE); + XMEMCPY(out + FALCON_LEVEL1_KEY_SIZE, key->p, FALCON_LEVEL1_PUB_KEY_SIZE); } else if (key->level == 5) { *outLen = FALCON_LEVEL5_PRV_KEY_SIZE; - XMEMCPY(out, key->k, FALCON_LEVEL5_PRV_KEY_SIZE); - XMEMCPY(out + FALCON_LEVEL5_PRV_KEY_SIZE, key->p, + XMEMCPY(out, key->k, FALCON_LEVEL5_KEY_SIZE); + XMEMCPY(out + FALCON_LEVEL5_KEY_SIZE, key->p, FALCON_LEVEL5_PUB_KEY_SIZE); } @@ -600,8 +712,24 @@ return BAD_FUNC_ARG; } - /* Assume everything is fine. */ - return 0; + int ret = 0; + + /* The public key is also decoded and stored within the private key buffer + * behind the private key. Hence, we can compare both stored public keys. */ + if (key->level == 1) { + ret = XMEMCMP(key->p, key->k + FALCON_LEVEL1_KEY_SIZE, + FALCON_LEVEL1_PUB_KEY_SIZE); + } + else if (key->level == 5) { + ret = XMEMCMP(key->p, key->k + FALCON_LEVEL5_KEY_SIZE, + FALCON_LEVEL5_PUB_KEY_SIZE); + } + + if (ret != 0) { + ret = PUBLIC_KEY_E; + } + + return ret; } /* Returns the size of a falcon private key. @@ -696,7 +824,7 @@ falcon_key* key, word32 inSz) { int ret = 0; - byte privKey[FALCON_MAX_KEY_SIZE], pubKey[FALCON_MAX_PUB_KEY_SIZE]; + byte privKey[FALCON_MAX_PRV_KEY_SIZE], pubKey[FALCON_MAX_PUB_KEY_SIZE]; word32 privKeyLen = (word32)sizeof(privKey); word32 pubKeyLen = (word32)sizeof(pubKey); int keytype = 0; @@ -719,11 +847,11 @@ pubKey, &pubKeyLen, keytype); if (ret == 0) { if (pubKeyLen == 0) { - ret = wc_falcon_import_private_only(input, inSz, key); + ret = wc_falcon_import_private_key(input, inSz, NULL, 0, key); } else { - ret = wc_falcon_import_private_key(privKey, privKeyLen, - pubKey, pubKeyLen, key); + ret = wc_falcon_import_private_key(input, inSz, pubKey, + pubKeyLen, key); } } return ret; @@ -741,6 +869,11 @@ return BAD_FUNC_ARG; } + ret = wc_falcon_import_public(input, inSz, key); + if (ret == 0) { + return 0; + } + if (key->level == 1) { keytype = FALCON_LEVEL1k; } @@ -780,7 +913,7 @@ word32 pubKeyLen = (word32)sizeof(pubKey); int keytype = 0; - if (key == NULL || output == NULL) { + if (key == NULL) { return BAD_FUNC_ARG; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_448.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_448.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_448.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_448.c 2024-08-03 07:30:00.000000000 +0000 @@ -167,7 +167,7 @@ } } -/* Mulitply a field element by 39081. r = (39081 * a) mod (2^448 - 2^224 - 1) +/* Multiply a field element by 39081. r = (39081 * a) mod (2^448 - 2^224 - 1) * * r [in] Field element to hold result. * a [in] Field element to multiply. @@ -192,7 +192,7 @@ } } -/* Mulitply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) +/* Multiply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) * * r [in] Field element to hold result. * a [in] Field element to multiply. @@ -448,7 +448,7 @@ } /* Raise field element to (p-3) / 4: 2^446 - 2^222 - 1 - * Used for calcualting y-ordinate from x-ordinate for Ed448. + * Used for calculating y-ordinate from x-ordinate for Ed448. * * r [in] Field element to hold result. * a [in] Field element to exponentiate. @@ -609,62 +609,62 @@ in4 += o; t = o << 56; in7 -= (sword64)t; /* Output as bytes */ - b[ 0] = (in0 >> 0); - b[ 1] = (in0 >> 8); - b[ 2] = (in0 >> 16); - b[ 3] = (in0 >> 24); - b[ 4] = (in0 >> 32); - b[ 5] = (in0 >> 40); - b[ 6] = (in0 >> 48); - b[ 7] = (in1 >> 0); - b[ 8] = (in1 >> 8); - b[ 9] = (in1 >> 16); - b[10] = (in1 >> 24); - b[11] = (in1 >> 32); - b[12] = (in1 >> 40); - b[13] = (in1 >> 48); - b[14] = (in2 >> 0); - b[15] = (in2 >> 8); - b[16] = (in2 >> 16); - b[17] = (in2 >> 24); - b[18] = (in2 >> 32); - b[19] = (in2 >> 40); - b[20] = (in2 >> 48); - b[21] = (in3 >> 0); - b[22] = (in3 >> 8); - b[23] = (in3 >> 16); - b[24] = (in3 >> 24); - b[25] = (in3 >> 32); - b[26] = (in3 >> 40); - b[27] = (in3 >> 48); - b[28] = (in4 >> 0); - b[29] = (in4 >> 8); - b[30] = (in4 >> 16); - b[31] = (in4 >> 24); - b[32] = (in4 >> 32); - b[33] = (in4 >> 40); - b[34] = (in4 >> 48); - b[35] = (in5 >> 0); - b[36] = (in5 >> 8); - b[37] = (in5 >> 16); - b[38] = (in5 >> 24); - b[39] = (in5 >> 32); - b[40] = (in5 >> 40); - b[41] = (in5 >> 48); - b[42] = (in6 >> 0); - b[43] = (in6 >> 8); - b[44] = (in6 >> 16); - b[45] = (in6 >> 24); - b[46] = (in6 >> 32); - b[47] = (in6 >> 40); - b[48] = (in6 >> 48); - b[49] = (in7 >> 0); - b[50] = (in7 >> 8); - b[51] = (in7 >> 16); - b[52] = (in7 >> 24); - b[53] = (in7 >> 32); - b[54] = (in7 >> 40); - b[55] = (in7 >> 48); + b[ 0] = (byte)(in0 >> 0); + b[ 1] = (byte)(in0 >> 8); + b[ 2] = (byte)(in0 >> 16); + b[ 3] = (byte)(in0 >> 24); + b[ 4] = (byte)(in0 >> 32); + b[ 5] = (byte)(in0 >> 40); + b[ 6] = (byte)(in0 >> 48); + b[ 7] = (byte)(in1 >> 0); + b[ 8] = (byte)(in1 >> 8); + b[ 9] = (byte)(in1 >> 16); + b[10] = (byte)(in1 >> 24); + b[11] = (byte)(in1 >> 32); + b[12] = (byte)(in1 >> 40); + b[13] = (byte)(in1 >> 48); + b[14] = (byte)(in2 >> 0); + b[15] = (byte)(in2 >> 8); + b[16] = (byte)(in2 >> 16); + b[17] = (byte)(in2 >> 24); + b[18] = (byte)(in2 >> 32); + b[19] = (byte)(in2 >> 40); + b[20] = (byte)(in2 >> 48); + b[21] = (byte)(in3 >> 0); + b[22] = (byte)(in3 >> 8); + b[23] = (byte)(in3 >> 16); + b[24] = (byte)(in3 >> 24); + b[25] = (byte)(in3 >> 32); + b[26] = (byte)(in3 >> 40); + b[27] = (byte)(in3 >> 48); + b[28] = (byte)(in4 >> 0); + b[29] = (byte)(in4 >> 8); + b[30] = (byte)(in4 >> 16); + b[31] = (byte)(in4 >> 24); + b[32] = (byte)(in4 >> 32); + b[33] = (byte)(in4 >> 40); + b[34] = (byte)(in4 >> 48); + b[35] = (byte)(in5 >> 0); + b[36] = (byte)(in5 >> 8); + b[37] = (byte)(in5 >> 16); + b[38] = (byte)(in5 >> 24); + b[39] = (byte)(in5 >> 32); + b[40] = (byte)(in5 >> 40); + b[41] = (byte)(in5 >> 48); + b[42] = (byte)(in6 >> 0); + b[43] = (byte)(in6 >> 8); + b[44] = (byte)(in6 >> 16); + b[45] = (byte)(in6 >> 24); + b[46] = (byte)(in6 >> 32); + b[47] = (byte)(in6 >> 40); + b[48] = (byte)(in6 >> 48); + b[49] = (byte)(in7 >> 0); + b[50] = (byte)(in7 >> 8); + b[51] = (byte)(in7 >> 16); + b[52] = (byte)(in7 >> 24); + b[53] = (byte)(in7 >> 32); + b[54] = (byte)(in7 >> 40); + b[55] = (byte)(in7 >> 48); } /* Set the field element to 0. @@ -788,7 +788,7 @@ r[7] = a[7] - b[7]; } -/* Mulitply a field element by 39081. r = (39081 * a) mod (2^448 - 2^224 - 1) +/* Multiply a field element by 39081. r = (39081 * a) mod (2^448 - 2^224 - 1) * * r [in] Field element to hold result. * a [in] Field element to multiply. @@ -826,7 +826,7 @@ r[7] = (sword64)t7; } -/* Mulitply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) +/* Multiply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) * * r [in] Field element to hold result. * a [in] Field element to multiply. @@ -1087,8 +1087,8 @@ for (i = 447; i >= 0; --i) { unsigned int b = (n[i >> 3] >> (i & 7)) & 1; swap ^= b; - fe448_cswap(x2, x3, swap); - fe448_cswap(z2, z3, swap); + fe448_cswap(x2, x3, (int)swap); + fe448_cswap(z2, z3, (int)swap); swap = b; /* Montgomery Ladder - double and add */ @@ -1172,7 +1172,7 @@ } /* Raise field element to (p-3) / 4: 2^446 - 2^222 - 1 - * Used for calcualting y-ordinate from x-ordinate for Ed448. + * Used for calculating y-ordinate from x-ordinate for Ed448. * * r [in] Field element to hold result. * a [in] Field element to exponentiate. @@ -1434,62 +1434,62 @@ in8 += o; t = o << 28; in15 -= (sword32)t; /* Output as bytes */ - b[ 0] = (in0 >> 0); - b[ 1] = (in0 >> 8); - b[ 2] = (in0 >> 16); - b[ 3] = (in0 >> 24) + ((in1 >> 0) << 4); - b[ 4] = (in1 >> 4); - b[ 5] = (in1 >> 12); - b[ 6] = (in1 >> 20); - b[ 7] = (in2 >> 0); - b[ 8] = (in2 >> 8); - b[ 9] = (in2 >> 16); - b[10] = (in2 >> 24) + ((in3 >> 0) << 4); - b[11] = (in3 >> 4); - b[12] = (in3 >> 12); - b[13] = (in3 >> 20); - b[14] = (in4 >> 0); - b[15] = (in4 >> 8); - b[16] = (in4 >> 16); - b[17] = (in4 >> 24) + ((in5 >> 0) << 4); - b[18] = (in5 >> 4); - b[19] = (in5 >> 12); - b[20] = (in5 >> 20); - b[21] = (in6 >> 0); - b[22] = (in6 >> 8); - b[23] = (in6 >> 16); - b[24] = (in6 >> 24) + ((in7 >> 0) << 4); - b[25] = (in7 >> 4); - b[26] = (in7 >> 12); - b[27] = (in7 >> 20); - b[28] = (in8 >> 0); - b[29] = (in8 >> 8); - b[30] = (in8 >> 16); - b[31] = (in8 >> 24) + ((in9 >> 0) << 4); - b[32] = (in9 >> 4); - b[33] = (in9 >> 12); - b[34] = (in9 >> 20); - b[35] = (in10 >> 0); - b[36] = (in10 >> 8); - b[37] = (in10 >> 16); - b[38] = (in10 >> 24) + ((in11 >> 0) << 4); - b[39] = (in11 >> 4); - b[40] = (in11 >> 12); - b[41] = (in11 >> 20); - b[42] = (in12 >> 0); - b[43] = (in12 >> 8); - b[44] = (in12 >> 16); - b[45] = (in12 >> 24) + ((in13 >> 0) << 4); - b[46] = (in13 >> 4); - b[47] = (in13 >> 12); - b[48] = (in13 >> 20); - b[49] = (in14 >> 0); - b[50] = (in14 >> 8); - b[51] = (in14 >> 16); - b[52] = (in14 >> 24) + ((in15 >> 0) << 4); - b[53] = (in15 >> 4); - b[54] = (in15 >> 12); - b[55] = (in15 >> 20); + b[ 0] = (byte)(in0 >> 0); + b[ 1] = (byte)(in0 >> 8); + b[ 2] = (byte)(in0 >> 16); + b[ 3] = (byte)((in0 >> 24) + ((in1 >> 0) << 4)); + b[ 4] = (byte)(in1 >> 4); + b[ 5] = (byte)(in1 >> 12); + b[ 6] = (byte)(in1 >> 20); + b[ 7] = (byte)(in2 >> 0); + b[ 8] = (byte)(in2 >> 8); + b[ 9] = (byte)(in2 >> 16); + b[10] = (byte)((in2 >> 24) + ((in3 >> 0) << 4)); + b[11] = (byte)(in3 >> 4); + b[12] = (byte)(in3 >> 12); + b[13] = (byte)(in3 >> 20); + b[14] = (byte)(in4 >> 0); + b[15] = (byte)(in4 >> 8); + b[16] = (byte)(in4 >> 16); + b[17] = (byte)((in4 >> 24) + ((in5 >> 0) << 4)); + b[18] = (byte)(in5 >> 4); + b[19] = (byte)(in5 >> 12); + b[20] = (byte)(in5 >> 20); + b[21] = (byte)(in6 >> 0); + b[22] = (byte)(in6 >> 8); + b[23] = (byte)(in6 >> 16); + b[24] = (byte)((in6 >> 24) + ((in7 >> 0) << 4)); + b[25] = (byte)(in7 >> 4); + b[26] = (byte)(in7 >> 12); + b[27] = (byte)(in7 >> 20); + b[28] = (byte)(in8 >> 0); + b[29] = (byte)(in8 >> 8); + b[30] = (byte)(in8 >> 16); + b[31] = (byte)((in8 >> 24) + ((in9 >> 0) << 4)); + b[32] = (byte)(in9 >> 4); + b[33] = (byte)(in9 >> 12); + b[34] = (byte)(in9 >> 20); + b[35] = (byte)(in10 >> 0); + b[36] = (byte)(in10 >> 8); + b[37] = (byte)(in10 >> 16); + b[38] = (byte)((in10 >> 24) + ((in11 >> 0) << 4)); + b[39] = (byte)(in11 >> 4); + b[40] = (byte)(in11 >> 12); + b[41] = (byte)(in11 >> 20); + b[42] = (byte)(in12 >> 0); + b[43] = (byte)(in12 >> 8); + b[44] = (byte)(in12 >> 16); + b[45] = (byte)((in12 >> 24) + ((in13 >> 0) << 4)); + b[46] = (byte)(in13 >> 4); + b[47] = (byte)(in13 >> 12); + b[48] = (byte)(in13 >> 20); + b[49] = (byte)(in14 >> 0); + b[50] = (byte)(in14 >> 8); + b[51] = (byte)(in14 >> 16); + b[52] = (byte)((in14 >> 24) + ((in15 >> 0) << 4)); + b[53] = (byte)(in15 >> 4); + b[54] = (byte)(in15 >> 12); + b[55] = (byte)(in15 >> 20); } /* Set the field element to 0. @@ -1699,7 +1699,7 @@ o = a[15] >> 28; a[0] += (sword32)o; a[8] += (sword32)o; a[15] -= (sword32)(o << 28); } -/* Mulitply a field element by 39081. r = (39081 * a) mod (2^448 - 2^224 - 1) +/* Multiply a field element by 39081. r = (39081 * a) mod (2^448 - 2^224 - 1) * * r [in] Field element to hold result. * a [in] Field element to multiply. @@ -1761,7 +1761,7 @@ r[15] = (sword32)t15; } -/* Mulitply two field elements. r = a * b +/* Multiply two field elements. r = a * b * * r [in] Field element to hold result. * a [in] Field element to multiply. @@ -1834,6 +1834,7 @@ sword64 t13 = (sword64)a[ 6] * b[ 7]; sword64 t113 = (sword64)a[ 7] * b[ 6]; sword64 t14 = (sword64)a[ 7] * b[ 7]; + sword64 o, t15; t1 += t101; t2 += t102; t2 += t202; t3 += t103; t3 += t203; t3 += t303; @@ -1850,8 +1851,8 @@ t11 += t111; t11 += t211; t11 += t311; t12 += t112; t12 += t212; t13 += t113; - sword64 o = t14 >> 28; - sword64 t15 = o; + o = t14 >> 28; + t15 = o; t14 -= o << 28; o = (t0 >> 28); t1 += o; t = o << 28; t0 -= t; o = (t1 >> 28); t2 += o; t = o << 28; t1 -= t; @@ -1891,7 +1892,7 @@ r[15] = (sword32)t15; } -/* Mulitply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) +/* Multiply two field elements. r = (a * b) mod (2^448 - 2^224 - 1) * * r [in] Field element to hold result. * a [in] Field element to multiply. @@ -2178,8 +2179,8 @@ for (i = 447; i >= 0; --i) { unsigned int b = (n[i >> 3] >> (i & 7)) & 1; swap ^= b; - fe448_cswap(x2, x3, swap); - fe448_cswap(z2, z3, swap); + fe448_cswap(x2, x3, (int)swap); + fe448_cswap(z2, z3, (int)swap); swap = b; /* Montgomery Ladder - double and add */ @@ -2271,7 +2272,7 @@ } /* Raise field element to (p-3) / 4: 2^446 - 2^222 - 1 - * Used for calcualting y-ordinate from x-ordinate for Ed448. + * Used for calculating y-ordinate from x-ordinate for Ed448. * * r [in] Field element to hold result. * a [in] Field element to exponentiate. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_operations.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_operations.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_operations.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_operations.c 2024-08-03 07:30:00.000000000 +0000 @@ -45,7 +45,7 @@ #elif defined(WOLFSSL_ARMASM) /* Assembly code in fe_armv[78]_x25519.* */ #elif defined(CURVED25519_128BIT) -#include "fe_x25519_128.i" +#include "fe_x25519_128.h" #else #if defined(HAVE_CURVE25519) || \ @@ -58,24 +58,24 @@ Bounds on each t[i] vary depending on context. */ -word64 load_3(const unsigned char *in) +sword64 load_3(const unsigned char *in) { word64 result; result = (word64) in[0]; result |= ((word64) in[1]) << 8; result |= ((word64) in[2]) << 16; - return result; + return (sword64)result; } -word64 load_4(const unsigned char *in) +sword64 load_4(const unsigned char *in) { word64 result; result = (word64) in[0]; result |= ((word64) in[1]) << 8; result |= ((word64) in[2]) << 16; result |= ((word64) in[3]) << 24; - return result; + return (sword64)result; } #endif @@ -170,8 +170,8 @@ #endif b &= 1; swap ^= b; - fe_cswap(x2,x3,swap); - fe_cswap(z2,z3,swap); + fe_cswap(x2,x3,(int)swap); + fe_cswap(z2,z3,(int)swap); swap = b; /* montgomery */ @@ -194,8 +194,8 @@ fe_mul(z3,x1,z2); fe_mul(z2,tmp1,tmp0); } - fe_cswap(x2,x3,swap); - fe_cswap(z2,z3,swap); + fe_cswap(x2,x3,(int)swap); + fe_cswap(z2,z3,(int)swap); fe_invert(z2,z2); fe_mul(x2,x2,z2); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.h 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,630 @@ +/* fe_x25519_128.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./x25519/fe_x25519_128_gen.rb > ../wolfssl/wolfcrypt/src/fe_x25519_128.h + */ + +void fe_init(void) +{ +} + +/* Convert a number represented as an array of bytes to an array of words with + * 51-bits of data in each word. + * + * in An array of bytes. + * out An array of words. + */ +void fe_frombytes(fe out, const unsigned char *in) +{ + out[0] = (((sword64)((in[ 0] ) )) ) + | (((sword64)((in[ 1] ) )) << 8) + | (((sword64)((in[ 2] ) )) << 16) + | (((sword64)((in[ 3] ) )) << 24) + | (((sword64)((in[ 4] ) )) << 32) + | (((sword64)((in[ 5] ) )) << 40) + | (((sword64)((in[ 6] ) & 0x07)) << 48); + out[1] = (((sword64)((in[ 6] >> 3) & 0x1f)) ) + | (((sword64)((in[ 7] ) )) << 5) + | (((sword64)((in[ 8] ) )) << 13) + | (((sword64)((in[ 9] ) )) << 21) + | (((sword64)((in[10] ) )) << 29) + | (((sword64)((in[11] ) )) << 37) + | (((sword64)((in[12] ) & 0x3f)) << 45); + out[2] = (((sword64)((in[12] >> 6) & 0x03)) ) + | (((sword64)((in[13] ) )) << 2) + | (((sword64)((in[14] ) )) << 10) + | (((sword64)((in[15] ) )) << 18) + | (((sword64)((in[16] ) )) << 26) + | (((sword64)((in[17] ) )) << 34) + | (((sword64)((in[18] ) )) << 42) + | (((sword64)((in[19] ) & 0x01)) << 50); + out[3] = (((sword64)((in[19] >> 1) & 0x7f)) ) + | (((sword64)((in[20] ) )) << 7) + | (((sword64)((in[21] ) )) << 15) + | (((sword64)((in[22] ) )) << 23) + | (((sword64)((in[23] ) )) << 31) + | (((sword64)((in[24] ) )) << 39) + | (((sword64)((in[25] ) & 0x0f)) << 47); + out[4] = (((sword64)((in[25] >> 4) & 0x0f)) ) + | (((sword64)((in[26] ) )) << 4) + | (((sword64)((in[27] ) )) << 12) + | (((sword64)((in[28] ) )) << 20) + | (((sword64)((in[29] ) )) << 28) + | (((sword64)((in[30] ) )) << 36) + | (((sword64)((in[31] ) & 0x7f)) << 44); +} + +/* Convert a number represented as an array of words to an array of bytes. + * The array of words is normalized to an array of 51-bit data words and if + * greater than the mod, modulo reduced by the prime 2^255 - 1. + * + * n An array of words. + * out An array of bytes. + */ +void fe_tobytes(unsigned char *out, const fe n) +{ + fe in; + sword64 c; + + in[0] = n[0]; + in[1] = n[1]; + in[2] = n[2]; + in[3] = n[3]; + in[4] = n[4]; + + /* Normalize to 51-bits of data per word. */ + in[0] += (in[4] >> 51) * 19; in[4] &= 0x7ffffffffffff; + + in[1] += in[0] >> 51; in[0] &= 0x7ffffffffffff; + in[2] += in[1] >> 51; in[1] &= 0x7ffffffffffff; + in[3] += in[2] >> 51; in[2] &= 0x7ffffffffffff; + in[4] += in[3] >> 51; in[3] &= 0x7ffffffffffff; + in[0] += (in[4] >> 51) * 19; + in[4] &= 0x7ffffffffffff; + + c = (in[0] + 19) >> 51; + c = (in[1] + c) >> 51; + c = (in[2] + c) >> 51; + c = (in[3] + c) >> 51; + c = (in[4] + c) >> 51; + in[0] += c * 19; + in[1] += in[0] >> 51; in[0] &= 0x7ffffffffffff; + in[2] += in[1] >> 51; in[1] &= 0x7ffffffffffff; + in[3] += in[2] >> 51; in[2] &= 0x7ffffffffffff; + in[4] += in[3] >> 51; in[3] &= 0x7ffffffffffff; + in[4] &= 0x7ffffffffffff; + + out[ 0] = (((byte)((in[0] ) )) ); + out[ 1] = (((byte)((in[0] >> 8) )) ); + out[ 2] = (((byte)((in[0] >> 16) )) ); + out[ 3] = (((byte)((in[0] >> 24) )) ); + out[ 4] = (((byte)((in[0] >> 32) )) ); + out[ 5] = (((byte)((in[0] >> 40) )) ); + out[ 6] = (((byte)((in[0] >> 48) & 0x07)) ) + | (((byte)((in[1] ) & 0x1f)) << 3); + out[ 7] = (((byte)((in[1] >> 5) )) ); + out[ 8] = (((byte)((in[1] >> 13) )) ); + out[ 9] = (((byte)((in[1] >> 21) )) ); + out[10] = (((byte)((in[1] >> 29) )) ); + out[11] = (((byte)((in[1] >> 37) )) ); + out[12] = (((byte)((in[1] >> 45) & 0x3f)) ) + | (((byte)((in[2] ) & 0x03)) << 6); + out[13] = (((byte)((in[2] >> 2) )) ); + out[14] = (((byte)((in[2] >> 10) )) ); + out[15] = (((byte)((in[2] >> 18) )) ); + out[16] = (((byte)((in[2] >> 26) )) ); + out[17] = (((byte)((in[2] >> 34) )) ); + out[18] = (((byte)((in[2] >> 42) )) ); + out[19] = (((byte)((in[2] >> 50) & 0x01)) ) + | (((byte)((in[3] ) & 0x7f)) << 1); + out[20] = (((byte)((in[3] >> 7) )) ); + out[21] = (((byte)((in[3] >> 15) )) ); + out[22] = (((byte)((in[3] >> 23) )) ); + out[23] = (((byte)((in[3] >> 31) )) ); + out[24] = (((byte)((in[3] >> 39) )) ); + out[25] = (((byte)((in[3] >> 47) & 0x0f)) ) + | (((byte)((in[4] ) & 0x0f)) << 4); + out[26] = (((byte)((in[4] >> 4) )) ); + out[27] = (((byte)((in[4] >> 12) )) ); + out[28] = (((byte)((in[4] >> 20) )) ); + out[29] = (((byte)((in[4] >> 28) )) ); + out[30] = (((byte)((in[4] >> 36) )) ); + out[31] = (((byte)((in[4] >> 44) & 0x7f)) ); +} + +/* Set the field element to 1. + * + * n The field element number. + */ +void fe_1(fe n) +{ + n[0] = 0x0000000000001; + n[1] = 0x0000000000000; + n[2] = 0x0000000000000; + n[3] = 0x0000000000000; + n[4] = 0x0000000000000; +} + +/* Set the field element to 0. + * + * n The field element number. + */ +void fe_0(fe n) +{ + n[0] = 0x0000000000000; + n[1] = 0x0000000000000; + n[2] = 0x0000000000000; + n[3] = 0x0000000000000; + n[4] = 0x0000000000000; +} + +/* Copy field element a into field element r. + * + * r Field element to copy into. + * a Field element to copy. + */ +void fe_copy(fe r, const fe a) +{ + r[0] = a[0]; + r[1] = a[1]; + r[2] = a[2]; + r[3] = a[3]; + r[4] = a[4]; +} + +/* Constant time, conditional swap of field elements a and b. + * + * f A field element. + * g A field element. + * b If 1 then swap and if 0 then don't swap. + */ +void fe_cswap(fe f, fe g, int b) +{ + sword64 m = b; + sword64 t0, t1, t2, t3, t4; + + /* Convert conditional into mask. */ + m = -m; + t0 = m & (f[0] ^ g[0]); + t1 = m & (f[1] ^ g[1]); + t2 = m & (f[2] ^ g[2]); + t3 = m & (f[3] ^ g[3]); + t4 = m & (f[4] ^ g[4]); + + f[0] ^= t0; + f[1] ^= t1; + f[2] ^= t2; + f[3] ^= t3; + f[4] ^= t4; + + g[0] ^= t0; + g[1] ^= t1; + g[2] ^= t2; + g[3] ^= t3; + g[4] ^= t4; +} + +/* Subtract b from a into r. (r = a - b) + * + * r A field element. + * a A field element. + * b A field element. + */ +void fe_sub(fe r, const fe a, const fe b) +{ + r[0] = a[0] - b[0]; + r[1] = a[1] - b[1]; + r[2] = a[2] - b[2]; + r[3] = a[3] - b[3]; + r[4] = a[4] - b[4]; +} + +/* Add b to a into r. (r = a + b) + * + * r A field element. + * a A field element. + * b A field element. + */ +void fe_add(fe r, const fe a, const fe b) +{ + r[0] = a[0] + b[0]; + r[1] = a[1] + b[1]; + r[2] = a[2] + b[2]; + r[3] = a[3] + b[3]; + r[4] = a[4] + b[4]; +} + +/* Multiply a and b into r. (r = a * b) + * + * r A field element. + * a A field element. + * b A field element. + */ +void fe_mul(fe r, const fe a, const fe b) +{ + const __int128_t k19 = 19; + __int128_t t0 = ((__int128_t)a[0]) * b[0]; + __int128_t t1 = ((__int128_t)a[0]) * b[1] + + ((__int128_t)a[1]) * b[0]; + __int128_t t2 = ((__int128_t)a[0]) * b[2] + + ((__int128_t)a[1]) * b[1] + + ((__int128_t)a[2]) * b[0]; + __int128_t t3 = ((__int128_t)a[0]) * b[3] + + ((__int128_t)a[1]) * b[2] + + ((__int128_t)a[2]) * b[1] + + ((__int128_t)a[3]) * b[0]; + __int128_t t4 = ((__int128_t)a[0]) * b[4] + + ((__int128_t)a[1]) * b[3] + + ((__int128_t)a[2]) * b[2] + + ((__int128_t)a[3]) * b[1] + + ((__int128_t)a[4]) * b[0]; + __int128_t t5 = ((__int128_t)a[1]) * b[4] + + ((__int128_t)a[2]) * b[3] + + ((__int128_t)a[3]) * b[2] + + ((__int128_t)a[4]) * b[1]; + __int128_t t6 = ((__int128_t)a[2]) * b[4] + + ((__int128_t)a[3]) * b[3] + + ((__int128_t)a[4]) * b[2]; + __int128_t t7 = ((__int128_t)a[3]) * b[4] + + ((__int128_t)a[4]) * b[3]; + __int128_t t8 = ((__int128_t)a[4]) * b[4]; + + /* Modulo reduce double long word. */ + t0 += t5 * k19; + t1 += t6 * k19; + t2 += t7 * k19; + t3 += t8 * k19; + + /* Normalize to 51-bits of data per word. */ + t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; + + t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; + t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; + t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; + t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; + r[0] += (sword64)((t4 >> 51) * k19); + r[4] = t4 & 0x7ffffffffffff; +} + +/* Square a and put result in r. (r = a * a) + * + * r A field element. + * a A field element. + * b A field element. + */ +void fe_sq(fe r, const fe a) +{ + const __int128_t k19 = 19; + const __int128_t k2 = 2; + __int128_t t0 = ((__int128_t)a[0]) * a[0]; + __int128_t t1 = ((__int128_t)a[0]) * a[1] * k2; + __int128_t t2 = ((__int128_t)a[0]) * a[2] * k2 + + ((__int128_t)a[1]) * a[1]; + __int128_t t3 = ((__int128_t)a[0]) * a[3] * k2 + + ((__int128_t)a[1]) * a[2] * k2; + __int128_t t4 = ((__int128_t)a[0]) * a[4] * k2 + + ((__int128_t)a[1]) * a[3] * k2 + + ((__int128_t)a[2]) * a[2]; + __int128_t t5 = ((__int128_t)a[1]) * a[4] * k2 + + ((__int128_t)a[2]) * a[3] * k2; + __int128_t t6 = ((__int128_t)a[2]) * a[4] * k2 + + ((__int128_t)a[3]) * a[3]; + __int128_t t7 = ((__int128_t)a[3]) * a[4] * k2; + __int128_t t8 = ((__int128_t)a[4]) * a[4]; + + /* Modulo reduce double long word. */ + t0 += t5 * k19; + t1 += t6 * k19; + t2 += t7 * k19; + t3 += t8 * k19; + + /* Normalize to 51-bits of data per word. */ + t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; + + t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; + t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; + t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; + t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; + r[0] += (sword64)((t4 >> 51) * k19); + r[4] = t4 & 0x7ffffffffffff; +} + +/* Multiply a by 121666 and put result in r. (r = 121666 * a) + * + * r A field element. + * a A field element. + * b A field element. + */ +void fe_mul121666(fe r, fe a) +{ + const __int128_t k19 = 19; + const __int128_t k121666 = 121666; + __int128_t t0 = ((__int128_t)a[0]) * k121666; + __int128_t t1 = ((__int128_t)a[1]) * k121666; + __int128_t t2 = ((__int128_t)a[2]) * k121666; + __int128_t t3 = ((__int128_t)a[3]) * k121666; + __int128_t t4 = ((__int128_t)a[4]) * k121666; + + /* Normalize to 51-bits of data per word. */ + t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; + + t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; + t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; + t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; + t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; + r[0] += (sword64)((t4 >> 51) * k19); + r[4] = t4 & 0x7ffffffffffff; +} + +/* Find the inverse of a modulo 2^255 - 1 and put result in r. + * (r * a) mod (2^255 - 1) = 1 + * Implementation is constant time. + * + * r A field element. + * a A field element. + */ +void fe_invert(fe r, const fe a) +{ + fe t0, t1, t2, t3; + int i; + + /* a ^ (2^255 - 21) */ + fe_sq(t0, a); 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, a, 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( r, t1, t0); +} + +#ifndef CURVE25519_SMALL +/* Scalar multiply the field element a by n using Montgomery Ladder and places + * result in r. + * + * r A field element as an array of bytes. + * n The scalar as an array of bytes. + * a A field element as an array of bytes. + */ +int curve25519(byte* r, const byte* n, const byte* a) +{ + fe x1, x2, z2, x3, z3; + fe t0, t1; + int pos; + unsigned int swap; + unsigned int b; + + fe_frombytes(x1, a); + fe_1(x2); + fe_0(z2); + fe_copy(x3, x1); + fe_1(z3); + + swap = 0; + for (pos = 254;pos >= 0;--pos) { + b = n[pos / 8] >> (pos & 7); + b &= 1; + swap ^= b; + fe_cswap(x2, x3, (int)swap); + fe_cswap(z2, z3, (int)swap); + swap = b; + + fe_sub(t0, x3, z3); + fe_sub(t1, x2, z2); + fe_add(x2, x2, z2); + fe_add(z2, x3, z3); + fe_mul(z3, t0, x2); + fe_mul(z2, z2, t1); + fe_sq(t0, t1); + fe_sq(t1, x2); + fe_add(x3, z3, z2); + fe_sub(z2, z3, z2); + fe_mul(x2, t1, t0); + fe_sub(t1, t1, t0); + fe_sq(z2, z2); + fe_mul121666(z3, t1); + fe_sq(x3, x3); + fe_add(t0, t0, z3); + fe_mul(z3, x1, z2); + fe_mul(z2, t1, t0); + } + fe_cswap(x2, x3, (int)swap); + fe_cswap(z2, z3, (int)swap); + + fe_invert(z2, z2); + fe_mul(x2, x2, z2); + fe_tobytes(r, x2); + + return 0; +} +#endif /* !CURVE25519_SMALL */ + +/* The field element value 0 as an array of bytes. */ +static const unsigned char zero[32] = {0}; + +/* Constant time check as to whether a is not 0. + * + * a A field element. + */ +int fe_isnonzero(const fe a) +{ + unsigned char s[32]; + fe_tobytes(s, a); + return ConstantCompare(s, zero, 32); +} + +/* Checks whether a is negative. + * + * a A field element. + */ +int fe_isnegative(const fe a) +{ + unsigned char s[32]; + fe_tobytes(s, a); + return s[0] & 1; +} + +/* Negates field element a and stores the result in r. + * + * r A field element. + * a A field element. + */ +void fe_neg(fe r, const fe a) +{ + r[0] = -a[0]; + r[1] = -a[1]; + r[2] = -a[2]; + r[3] = -a[3]; + r[4] = -a[4]; +} + +/* Constant time, conditional move of b into a. + * a is not changed if the condition is 0. + * + * f A field element. + * g A field element. + * b If 1 then copy and if 0 then don't copy. + */ +void fe_cmov(fe f, const fe g, int b) +{ + sword64 m = b; + sword64 t0, t1, t2, t3, t4; + + /* Convert conditional into mask. */ + m = -m; + t0 = m & (f[0] ^ g[0]); + t1 = m & (f[1] ^ g[1]); + t2 = m & (f[2] ^ g[2]); + t3 = m & (f[3] ^ g[3]); + t4 = m & (f[4] ^ g[4]); + + f[0] ^= t0; + f[1] ^= t1; + f[2] ^= t2; + f[3] ^= t3; + f[4] ^= t4; +} + +void fe_pow22523(fe r, const fe a) +{ + fe t0, t1, t2; + int i; + + /* a ^ (2^255 - 23) */ + fe_sq(t0, a); 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, a, 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( r, t0, a); + + return; +} + +/* Double the square of a and put result in r. (r = 2 * a * a) + * + * r A field element. + * a A field element. + * b A field element. + */ +void fe_sq2(fe r, const fe a) +{ + const __int128_t k2 = 2; + const __int128_t k19 = 19; + __int128_t t0 = k2 * (((__int128_t)a[0]) * a[0]); + __int128_t t1 = k2 * (((__int128_t)a[0]) * a[1] * k2); + __int128_t t2 = k2 * (((__int128_t)a[0]) * a[2] * k2 + + ((__int128_t)a[1]) * a[1]); + __int128_t t3 = k2 * (((__int128_t)a[0]) * a[3] * k2 + + ((__int128_t)a[1]) * a[2] * k2); + __int128_t t4 = k2 * (((__int128_t)a[0]) * a[4] * k2 + + ((__int128_t)a[1]) * a[3] * k2 + + ((__int128_t)a[2]) * a[2]); + __int128_t t5 = k2 * (((__int128_t)a[1]) * a[4] * k2 + + ((__int128_t)a[2]) * a[3] * k2); + __int128_t t6 = k2 * (((__int128_t)a[2]) * a[4] * k2 + + ((__int128_t)a[3]) * a[3]); + __int128_t t7 = k2 * (((__int128_t)a[3]) * a[4] * k2); + __int128_t t8 = k2 * (((__int128_t)a[4]) * a[4]); + + /* Modulo reduce double long word. */ + t0 += t5 * k19; + t1 += t6 * k19; + t2 += t7 * k19; + t3 += t8 * k19; + + /* Normalize to 51-bits of data per word. */ + t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; + + t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; + t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; + t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; + t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; + r[0] += (sword64)((t4 >> 51) * k19); + r[4] = t4 & 0x7ffffffffffff; +} + +/* Load 3 little endian bytes into a 64-bit word. + * + * in An array of bytes. + * returns a 64-bit word. + */ +sword64 load_3(const unsigned char *in) +{ + word64 result; + + result = ((((word64)in[0]) ) | + (((word64)in[1]) << 8) | + (((word64)in[2]) << 16)); + + return (sword64)result; +} + +/* Load 4 little endian bytes into a 64-bit word. + * + * in An array of bytes. + * returns a 64-bit word. + */ +sword64 load_4(const unsigned char *in) +{ + word64 result; + + result = ((((word64)in[0]) ) | + (((word64)in[1]) << 8) | + (((word64)in[2]) << 16) | + (((word64)in[3]) << 24)); + + return (sword64)result; +} + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.i mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.i --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.i 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_128.i 1970-01-01 00:00:00.000000000 +0000 @@ -1,630 +0,0 @@ -/* fe_x25519_128.i - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -/* Generated using (from wolfssl): - * cd ../scripts - * ruby ./x25519/fe_x25519_128_gen.rb > ../wolfssl/wolfcrypt/src/fe_x25519_128.i - */ - -void fe_init(void) -{ -} - -/* Convert a number represented as an array of bytes to an array of words with - * 51-bits of data in each word. - * - * in An array of bytes. - * out An array of words. - */ -void fe_frombytes(fe out, const unsigned char *in) -{ - out[0] = (((sword64)((in[ 0] ) )) ) - | (((sword64)((in[ 1] ) )) << 8) - | (((sword64)((in[ 2] ) )) << 16) - | (((sword64)((in[ 3] ) )) << 24) - | (((sword64)((in[ 4] ) )) << 32) - | (((sword64)((in[ 5] ) )) << 40) - | (((sword64)((in[ 6] ) & 0x07)) << 48); - out[1] = (((sword64)((in[ 6] >> 3) & 0x1f)) ) - | (((sword64)((in[ 7] ) )) << 5) - | (((sword64)((in[ 8] ) )) << 13) - | (((sword64)((in[ 9] ) )) << 21) - | (((sword64)((in[10] ) )) << 29) - | (((sword64)((in[11] ) )) << 37) - | (((sword64)((in[12] ) & 0x3f)) << 45); - out[2] = (((sword64)((in[12] >> 6) & 0x03)) ) - | (((sword64)((in[13] ) )) << 2) - | (((sword64)((in[14] ) )) << 10) - | (((sword64)((in[15] ) )) << 18) - | (((sword64)((in[16] ) )) << 26) - | (((sword64)((in[17] ) )) << 34) - | (((sword64)((in[18] ) )) << 42) - | (((sword64)((in[19] ) & 0x01)) << 50); - out[3] = (((sword64)((in[19] >> 1) & 0x7f)) ) - | (((sword64)((in[20] ) )) << 7) - | (((sword64)((in[21] ) )) << 15) - | (((sword64)((in[22] ) )) << 23) - | (((sword64)((in[23] ) )) << 31) - | (((sword64)((in[24] ) )) << 39) - | (((sword64)((in[25] ) & 0x0f)) << 47); - out[4] = (((sword64)((in[25] >> 4) & 0x0f)) ) - | (((sword64)((in[26] ) )) << 4) - | (((sword64)((in[27] ) )) << 12) - | (((sword64)((in[28] ) )) << 20) - | (((sword64)((in[29] ) )) << 28) - | (((sword64)((in[30] ) )) << 36) - | (((sword64)((in[31] ) & 0x7f)) << 44); -} - -/* Convert a number represented as an array of words to an array of bytes. - * The array of words is normalized to an array of 51-bit data words and if - * greater than the mod, modulo reduced by the prime 2^255 - 1. - * - * n An array of words. - * out An array of bytes. - */ -void fe_tobytes(unsigned char *out, const fe n) -{ - fe in; - sword64 c; - - in[0] = n[0]; - in[1] = n[1]; - in[2] = n[2]; - in[3] = n[3]; - in[4] = n[4]; - - /* Normalize to 51-bits of data per word. */ - in[0] += (in[4] >> 51) * 19; in[4] &= 0x7ffffffffffff; - - in[1] += in[0] >> 51; in[0] &= 0x7ffffffffffff; - in[2] += in[1] >> 51; in[1] &= 0x7ffffffffffff; - in[3] += in[2] >> 51; in[2] &= 0x7ffffffffffff; - in[4] += in[3] >> 51; in[3] &= 0x7ffffffffffff; - in[0] += (in[4] >> 51) * 19; - in[4] &= 0x7ffffffffffff; - - c = (in[0] + 19) >> 51; - c = (in[1] + c) >> 51; - c = (in[2] + c) >> 51; - c = (in[3] + c) >> 51; - c = (in[4] + c) >> 51; - in[0] += c * 19; - in[1] += in[0] >> 51; in[0] &= 0x7ffffffffffff; - in[2] += in[1] >> 51; in[1] &= 0x7ffffffffffff; - in[3] += in[2] >> 51; in[2] &= 0x7ffffffffffff; - in[4] += in[3] >> 51; in[3] &= 0x7ffffffffffff; - in[4] &= 0x7ffffffffffff; - - out[ 0] = (((byte)((in[0] ) )) ); - out[ 1] = (((byte)((in[0] >> 8) )) ); - out[ 2] = (((byte)((in[0] >> 16) )) ); - out[ 3] = (((byte)((in[0] >> 24) )) ); - out[ 4] = (((byte)((in[0] >> 32) )) ); - out[ 5] = (((byte)((in[0] >> 40) )) ); - out[ 6] = (((byte)((in[0] >> 48) & 0x07)) ) - | (((byte)((in[1] ) & 0x1f)) << 3); - out[ 7] = (((byte)((in[1] >> 5) )) ); - out[ 8] = (((byte)((in[1] >> 13) )) ); - out[ 9] = (((byte)((in[1] >> 21) )) ); - out[10] = (((byte)((in[1] >> 29) )) ); - out[11] = (((byte)((in[1] >> 37) )) ); - out[12] = (((byte)((in[1] >> 45) & 0x3f)) ) - | (((byte)((in[2] ) & 0x03)) << 6); - out[13] = (((byte)((in[2] >> 2) )) ); - out[14] = (((byte)((in[2] >> 10) )) ); - out[15] = (((byte)((in[2] >> 18) )) ); - out[16] = (((byte)((in[2] >> 26) )) ); - out[17] = (((byte)((in[2] >> 34) )) ); - out[18] = (((byte)((in[2] >> 42) )) ); - out[19] = (((byte)((in[2] >> 50) & 0x01)) ) - | (((byte)((in[3] ) & 0x7f)) << 1); - out[20] = (((byte)((in[3] >> 7) )) ); - out[21] = (((byte)((in[3] >> 15) )) ); - out[22] = (((byte)((in[3] >> 23) )) ); - out[23] = (((byte)((in[3] >> 31) )) ); - out[24] = (((byte)((in[3] >> 39) )) ); - out[25] = (((byte)((in[3] >> 47) & 0x0f)) ) - | (((byte)((in[4] ) & 0x0f)) << 4); - out[26] = (((byte)((in[4] >> 4) )) ); - out[27] = (((byte)((in[4] >> 12) )) ); - out[28] = (((byte)((in[4] >> 20) )) ); - out[29] = (((byte)((in[4] >> 28) )) ); - out[30] = (((byte)((in[4] >> 36) )) ); - out[31] = (((byte)((in[4] >> 44) & 0x7f)) ); -} - -/* Set the field element to 1. - * - * n The field element number. - */ -void fe_1(fe n) -{ - n[0] = 0x0000000000001; - n[1] = 0x0000000000000; - n[2] = 0x0000000000000; - n[3] = 0x0000000000000; - n[4] = 0x0000000000000; -} - -/* Set the field element to 0. - * - * n The field element number. - */ -void fe_0(fe n) -{ - n[0] = 0x0000000000000; - n[1] = 0x0000000000000; - n[2] = 0x0000000000000; - n[3] = 0x0000000000000; - n[4] = 0x0000000000000; -} - -/* Copy field element a into field element r. - * - * r Field element to copy into. - * a Field element to copy. - */ -void fe_copy(fe r, const fe a) -{ - r[0] = a[0]; - r[1] = a[1]; - r[2] = a[2]; - r[3] = a[3]; - r[4] = a[4]; -} - -/* Constant time, conditional swap of field elements a and b. - * - * f A field element. - * g A field element. - * b If 1 then swap and if 0 then don't swap. - */ -void fe_cswap(fe f, fe g, int b) -{ - sword64 m = b; - sword64 t0, t1, t2, t3, t4; - - /* Convert conditional into mask. */ - m = -m; - t0 = m & (f[0] ^ g[0]); - t1 = m & (f[1] ^ g[1]); - t2 = m & (f[2] ^ g[2]); - t3 = m & (f[3] ^ g[3]); - t4 = m & (f[4] ^ g[4]); - - f[0] ^= t0; - f[1] ^= t1; - f[2] ^= t2; - f[3] ^= t3; - f[4] ^= t4; - - g[0] ^= t0; - g[1] ^= t1; - g[2] ^= t2; - g[3] ^= t3; - g[4] ^= t4; -} - -/* Subtract b from a into r. (r = a - b) - * - * r A field element. - * a A field element. - * b A field element. - */ -void fe_sub(fe r, const fe a, const fe b) -{ - r[0] = a[0] - b[0]; - r[1] = a[1] - b[1]; - r[2] = a[2] - b[2]; - r[3] = a[3] - b[3]; - r[4] = a[4] - b[4]; -} - -/* Add b to a into r. (r = a + b) - * - * r A field element. - * a A field element. - * b A field element. - */ -void fe_add(fe r, const fe a, const fe b) -{ - r[0] = a[0] + b[0]; - r[1] = a[1] + b[1]; - r[2] = a[2] + b[2]; - r[3] = a[3] + b[3]; - r[4] = a[4] + b[4]; -} - -/* Multiply a and b into r. (r = a * b) - * - * r A field element. - * a A field element. - * b A field element. - */ -void fe_mul(fe r, const fe a, const fe b) -{ - const __int128_t k19 = 19; - __int128_t t0 = ((__int128_t)a[0]) * b[0]; - __int128_t t1 = ((__int128_t)a[0]) * b[1] - + ((__int128_t)a[1]) * b[0]; - __int128_t t2 = ((__int128_t)a[0]) * b[2] - + ((__int128_t)a[1]) * b[1] - + ((__int128_t)a[2]) * b[0]; - __int128_t t3 = ((__int128_t)a[0]) * b[3] - + ((__int128_t)a[1]) * b[2] - + ((__int128_t)a[2]) * b[1] - + ((__int128_t)a[3]) * b[0]; - __int128_t t4 = ((__int128_t)a[0]) * b[4] - + ((__int128_t)a[1]) * b[3] - + ((__int128_t)a[2]) * b[2] - + ((__int128_t)a[3]) * b[1] - + ((__int128_t)a[4]) * b[0]; - __int128_t t5 = ((__int128_t)a[1]) * b[4] - + ((__int128_t)a[2]) * b[3] - + ((__int128_t)a[3]) * b[2] - + ((__int128_t)a[4]) * b[1]; - __int128_t t6 = ((__int128_t)a[2]) * b[4] - + ((__int128_t)a[3]) * b[3] - + ((__int128_t)a[4]) * b[2]; - __int128_t t7 = ((__int128_t)a[3]) * b[4] - + ((__int128_t)a[4]) * b[3]; - __int128_t t8 = ((__int128_t)a[4]) * b[4]; - - /* Modulo reduce double long word. */ - t0 += t5 * k19; - t1 += t6 * k19; - t2 += t7 * k19; - t3 += t8 * k19; - - /* Normalize to 51-bits of data per word. */ - t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; - - t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; - t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; - t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; - t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; - r[0] += (sword64)((t4 >> 51) * k19); - r[4] = t4 & 0x7ffffffffffff; -} - -/* Square a and put result in r. (r = a * a) - * - * r A field element. - * a A field element. - * b A field element. - */ -void fe_sq(fe r, const fe a) -{ - const __int128_t k19 = 19; - const __int128_t k2 = 2; - __int128_t t0 = ((__int128_t)a[0]) * a[0]; - __int128_t t1 = ((__int128_t)a[0]) * a[1] * k2; - __int128_t t2 = ((__int128_t)a[0]) * a[2] * k2 - + ((__int128_t)a[1]) * a[1]; - __int128_t t3 = ((__int128_t)a[0]) * a[3] * k2 - + ((__int128_t)a[1]) * a[2] * k2; - __int128_t t4 = ((__int128_t)a[0]) * a[4] * k2 - + ((__int128_t)a[1]) * a[3] * k2 - + ((__int128_t)a[2]) * a[2]; - __int128_t t5 = ((__int128_t)a[1]) * a[4] * k2 - + ((__int128_t)a[2]) * a[3] * k2; - __int128_t t6 = ((__int128_t)a[2]) * a[4] * k2 - + ((__int128_t)a[3]) * a[3]; - __int128_t t7 = ((__int128_t)a[3]) * a[4] * k2; - __int128_t t8 = ((__int128_t)a[4]) * a[4]; - - /* Modulo reduce double long word. */ - t0 += t5 * k19; - t1 += t6 * k19; - t2 += t7 * k19; - t3 += t8 * k19; - - /* Normalize to 51-bits of data per word. */ - t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; - - t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; - t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; - t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; - t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; - r[0] += (sword64)((t4 >> 51) * k19); - r[4] = t4 & 0x7ffffffffffff; -} - -/* Multiply a by 121666 and put result in r. (r = 121666 * a) - * - * r A field element. - * a A field element. - * b A field element. - */ -void fe_mul121666(fe r, fe a) -{ - const __int128_t k19 = 19; - const __int128_t k121666 = 121666; - __int128_t t0 = ((__int128_t)a[0]) * k121666; - __int128_t t1 = ((__int128_t)a[1]) * k121666; - __int128_t t2 = ((__int128_t)a[2]) * k121666; - __int128_t t3 = ((__int128_t)a[3]) * k121666; - __int128_t t4 = ((__int128_t)a[4]) * k121666; - - /* Normalize to 51-bits of data per word. */ - t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; - - t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; - t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; - t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; - t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; - r[0] += (sword64)((t4 >> 51) * k19); - r[4] = t4 & 0x7ffffffffffff; -} - -/* Find the inverse of a modulo 2^255 - 1 and put result in r. - * (r * a) mod (2^255 - 1) = 1 - * Implementation is constant time. - * - * r A field element. - * a A field element. - */ -void fe_invert(fe r, const fe a) -{ - fe t0, t1, t2, t3; - int i; - - /* a ^ (2^255 - 21) */ - fe_sq(t0, a); 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, a, 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( r, t1, t0); -} - -#ifndef CURVE25519_SMALL -/* Scalar multiply the field element a by n using Montgomery Ladder and places - * result in r. - * - * r A field element as an array of bytes. - * n The scalar as an array of bytes. - * a A field element as an array of bytes. - */ -int curve25519(byte* r, const byte* n, const byte* a) -{ - fe x1, x2, z2, x3, z3; - fe t0, t1; - int pos; - unsigned int swap; - unsigned int b; - - fe_frombytes(x1, a); - fe_1(x2); - fe_0(z2); - fe_copy(x3, x1); - fe_1(z3); - - swap = 0; - for (pos = 254;pos >= 0;--pos) { - b = n[pos / 8] >> (pos & 7); - b &= 1; - swap ^= b; - fe_cswap(x2, x3, (int)swap); - fe_cswap(z2, z3, (int)swap); - swap = b; - - fe_sub(t0, x3, z3); - fe_sub(t1, x2, z2); - fe_add(x2, x2, z2); - fe_add(z2, x3, z3); - fe_mul(z3, t0, x2); - fe_mul(z2, z2, t1); - fe_sq(t0, t1); - fe_sq(t1, x2); - fe_add(x3, z3, z2); - fe_sub(z2, z3, z2); - fe_mul(x2, t1, t0); - fe_sub(t1, t1, t0); - fe_sq(z2, z2); - fe_mul121666(z3, t1); - fe_sq(x3, x3); - fe_add(t0, t0, z3); - fe_mul(z3, x1, z2); - fe_mul(z2, t1, t0); - } - fe_cswap(x2, x3, (int)swap); - fe_cswap(z2, z3, (int)swap); - - fe_invert(z2, z2); - fe_mul(x2, x2, z2); - fe_tobytes(r, x2); - - return 0; -} -#endif /* !CURVE25519_SMALL */ - -/* The field element value 0 as an array of bytes. */ -static const unsigned char zero[32] = {0}; - -/* Constant time check as to whether a is not 0. - * - * a A field element. - */ -int fe_isnonzero(const fe a) -{ - unsigned char s[32]; - fe_tobytes(s, a); - return ConstantCompare(s, zero, 32); -} - -/* Checks whether a is negative. - * - * a A field element. - */ -int fe_isnegative(const fe a) -{ - unsigned char s[32]; - fe_tobytes(s, a); - return s[0] & 1; -} - -/* Negates field element a and stores the result in r. - * - * r A field element. - * a A field element. - */ -void fe_neg(fe r, const fe a) -{ - r[0] = -a[0]; - r[1] = -a[1]; - r[2] = -a[2]; - r[3] = -a[3]; - r[4] = -a[4]; -} - -/* Constant time, conditional move of b into a. - * a is not changed if the condition is 0. - * - * f A field element. - * g A field element. - * b If 1 then copy and if 0 then don't copy. - */ -void fe_cmov(fe f, const fe g, int b) -{ - sword64 m = b; - sword64 t0, t1, t2, t3, t4; - - /* Convert conditional into mask. */ - m = -m; - t0 = m & (f[0] ^ g[0]); - t1 = m & (f[1] ^ g[1]); - t2 = m & (f[2] ^ g[2]); - t3 = m & (f[3] ^ g[3]); - t4 = m & (f[4] ^ g[4]); - - f[0] ^= t0; - f[1] ^= t1; - f[2] ^= t2; - f[3] ^= t3; - f[4] ^= t4; -} - -void fe_pow22523(fe r, const fe a) -{ - fe t0, t1, t2; - int i; - - /* a ^ (2^255 - 23) */ - fe_sq(t0, a); 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, a, 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( r, t0, a); - - return; -} - -/* Double the square of a and put result in r. (r = 2 * a * a) - * - * r A field element. - * a A field element. - * b A field element. - */ -void fe_sq2(fe r, const fe a) -{ - const __int128_t k2 = 2; - const __int128_t k19 = 19; - __int128_t t0 = k2 * (((__int128_t)a[0]) * a[0]); - __int128_t t1 = k2 * (((__int128_t)a[0]) * a[1] * k2); - __int128_t t2 = k2 * (((__int128_t)a[0]) * a[2] * k2 - + ((__int128_t)a[1]) * a[1]); - __int128_t t3 = k2 * (((__int128_t)a[0]) * a[3] * k2 - + ((__int128_t)a[1]) * a[2] * k2); - __int128_t t4 = k2 * (((__int128_t)a[0]) * a[4] * k2 - + ((__int128_t)a[1]) * a[3] * k2 - + ((__int128_t)a[2]) * a[2]); - __int128_t t5 = k2 * (((__int128_t)a[1]) * a[4] * k2 - + ((__int128_t)a[2]) * a[3] * k2); - __int128_t t6 = k2 * (((__int128_t)a[2]) * a[4] * k2 - + ((__int128_t)a[3]) * a[3]); - __int128_t t7 = k2 * (((__int128_t)a[3]) * a[4] * k2); - __int128_t t8 = k2 * (((__int128_t)a[4]) * a[4]); - - /* Modulo reduce double long word. */ - t0 += t5 * k19; - t1 += t6 * k19; - t2 += t7 * k19; - t3 += t8 * k19; - - /* Normalize to 51-bits of data per word. */ - t0 += (t4 >> 51) * k19; t4 &= 0x7ffffffffffff; - - t1 += t0 >> 51; r[0] = t0 & 0x7ffffffffffff; - t2 += t1 >> 51; r[1] = t1 & 0x7ffffffffffff; - t3 += t2 >> 51; r[2] = t2 & 0x7ffffffffffff; - t4 += t3 >> 51; r[3] = t3 & 0x7ffffffffffff; - r[0] += (sword64)((t4 >> 51) * k19); - r[4] = t4 & 0x7ffffffffffff; -} - -/* Load 3 little endian bytes into a 64-bit word. - * - * in An array of bytes. - * returns a 64-bit word. - */ -word64 load_3(const unsigned char *in) -{ - word64 result; - - result = ((((word64)in[0]) ) | - (((word64)in[1]) << 8) | - (((word64)in[2]) << 16)); - - return result; -} - -/* Load 4 little endian bytes into a 64-bit word. - * - * in An array of bytes. - * returns a 64-bit word. - */ -word64 load_4(const unsigned char *in) -{ - word64 result; - - result = ((((word64)in[0]) ) | - (((word64)in[1]) << 8) | - (((word64)in[2]) << 16) | - (((word64)in[3]) << 24)); - - return result; -} - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/fe_x25519_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* fe_x25519_asm - * - * Copyright (C) 2006-2023 wolfSSL Inc. +/* fe_x25519_asm.S */ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -116,17 +116,6 @@ movq %rax, _fe_mul121666_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_sq2_avx2@GOTPCREL(%rip), %rax -#else - leaq _fe_sq2_avx2(%rip), %rax -#endif /* __APPLE__ */ -#ifndef __APPLE__ - movq fe_sq2_p@GOTPCREL(%rip), %rdx - movq %rax, (%rdx) -#else - movq %rax, _fe_sq2_p(%rip) -#endif /* __APPLE__ */ -#ifndef __APPLE__ movq fe_invert_avx2@GOTPCREL(%rip), %rax #else leaq _fe_invert_avx2(%rip), %rax @@ -148,6 +137,18 @@ #else movq %rax, _curve25519_p(%rip) #endif /* __APPLE__ */ +#ifdef HAVE_ED25519 +#ifndef __APPLE__ + movq fe_sq2_avx2@GOTPCREL(%rip), %rax +#else + leaq _fe_sq2_avx2(%rip), %rax +#endif /* __APPLE__ */ +#ifndef __APPLE__ + movq fe_sq2_p@GOTPCREL(%rip), %rdx + movq %rax, (%rdx) +#else + movq %rax, _fe_sq2_p(%rip) +#endif /* __APPLE__ */ #ifndef __APPLE__ movq fe_pow22523_avx2@GOTPCREL(%rip), %rax #else @@ -160,82 +161,105 @@ movq %rax, _fe_pow22523_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_to_p2_avx2@GOTPCREL(%rip), %rax + movq ge_p1p1_to_p2_avx2@GOTPCREL(%rip), %rax +#else + leaq _ge_p1p1_to_p2_avx2(%rip), %rax +#endif /* __APPLE__ */ +#ifndef __APPLE__ + movq ge_p1p1_to_p2_p@GOTPCREL(%rip), %rdx + movq %rax, (%rdx) +#else + movq %rax, _ge_p1p1_to_p2_p(%rip) +#endif /* __APPLE__ */ +#ifndef __APPLE__ + movq ge_p1p1_to_p3_avx2@GOTPCREL(%rip), %rax +#else + leaq _ge_p1p1_to_p3_avx2(%rip), %rax +#endif /* __APPLE__ */ +#ifndef __APPLE__ + movq ge_p1p1_to_p3_p@GOTPCREL(%rip), %rdx + movq %rax, (%rdx) +#else + movq %rax, _ge_p1p1_to_p3_p(%rip) +#endif /* __APPLE__ */ +#ifndef __APPLE__ + movq ge_p2_dbl_avx2@GOTPCREL(%rip), %rax #else - leaq _fe_ge_to_p2_avx2(%rip), %rax + leaq _ge_p2_dbl_avx2(%rip), %rax #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_to_p2_p@GOTPCREL(%rip), %rdx + movq ge_p2_dbl_p@GOTPCREL(%rip), %rdx movq %rax, (%rdx) #else - movq %rax, _fe_ge_to_p2_p(%rip) + movq %rax, _ge_p2_dbl_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_to_p3_avx2@GOTPCREL(%rip), %rax + movq ge_madd_avx2@GOTPCREL(%rip), %rax #else - leaq _fe_ge_to_p3_avx2(%rip), %rax + leaq _ge_madd_avx2(%rip), %rax #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_to_p3_p@GOTPCREL(%rip), %rdx + movq ge_madd_p@GOTPCREL(%rip), %rdx movq %rax, (%rdx) #else - movq %rax, _fe_ge_to_p3_p(%rip) + movq %rax, _ge_madd_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_dbl_avx2@GOTPCREL(%rip), %rax + movq ge_msub_avx2@GOTPCREL(%rip), %rax #else - leaq _fe_ge_dbl_avx2(%rip), %rax + leaq _ge_msub_avx2(%rip), %rax #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_dbl_p@GOTPCREL(%rip), %rdx + movq ge_msub_p@GOTPCREL(%rip), %rdx movq %rax, (%rdx) #else - movq %rax, _fe_ge_dbl_p(%rip) + movq %rax, _ge_msub_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_madd_avx2@GOTPCREL(%rip), %rax + movq ge_add_avx2@GOTPCREL(%rip), %rax #else - leaq _fe_ge_madd_avx2(%rip), %rax + leaq _ge_add_avx2(%rip), %rax #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_madd_p@GOTPCREL(%rip), %rdx + movq ge_add_p@GOTPCREL(%rip), %rdx movq %rax, (%rdx) #else - movq %rax, _fe_ge_madd_p(%rip) + movq %rax, _ge_add_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_msub_avx2@GOTPCREL(%rip), %rax + movq ge_sub_avx2@GOTPCREL(%rip), %rax #else - leaq _fe_ge_msub_avx2(%rip), %rax + leaq _ge_sub_avx2(%rip), %rax #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_msub_p@GOTPCREL(%rip), %rdx + movq ge_sub_p@GOTPCREL(%rip), %rdx movq %rax, (%rdx) #else - movq %rax, _fe_ge_msub_p(%rip) + movq %rax, _ge_sub_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_add_avx2@GOTPCREL(%rip), %rax + movq sc_reduce_avx2@GOTPCREL(%rip), %rax #else - leaq _fe_ge_add_avx2(%rip), %rax + leaq _sc_reduce_avx2(%rip), %rax #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_add_p@GOTPCREL(%rip), %rdx + movq sc_reduce_p@GOTPCREL(%rip), %rdx movq %rax, (%rdx) #else - movq %rax, _fe_ge_add_p(%rip) + movq %rax, _sc_reduce_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_sub_avx2@GOTPCREL(%rip), %rax + movq sc_muladd_avx2@GOTPCREL(%rip), %rax #else - leaq _fe_ge_sub_avx2(%rip), %rax + leaq _sc_muladd_avx2(%rip), %rax #endif /* __APPLE__ */ #ifndef __APPLE__ - movq fe_ge_sub_p@GOTPCREL(%rip), %rdx + movq sc_muladd_p@GOTPCREL(%rip), %rdx movq %rax, (%rdx) #else - movq %rax, _fe_ge_sub_p(%rip) + movq %rax, _sc_muladd_p(%rip) #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ L_fe_init_flags_done: #ifndef __APPLE__ movq cpuFlagsSet@GOTPCREL(%rip), %rdx @@ -400,21 +424,19 @@ movq 16(%rsi), %r8 movq 24(%rsi), %r9 subq (%rdx), %rax - movq $0x00, %r10 sbbq 8(%rdx), %rcx - movq $-19, %r11 sbbq 16(%rdx), %r8 - movq $0x7fffffffffffffff, %r12 sbbq 24(%rdx), %r9 - sbbq $0x00, %r10 - # Mask the modulus - andq %r10, %r11 - andq %r10, %r12 + sbbq %r11, %r11 + shldq $0x01, %r9, %r11 + movq $0x7fffffffffffffff, %r12 + imulq $-19, %r11 + andq %r12, %r9 # Add modulus (if underflow) - addq %r11, %rax - adcq %r10, %rcx - adcq %r10, %r8 - adcq %r12, %r9 + subq %r11, %rax + sbbq $0x00, %rcx + sbbq $0x00, %r8 + sbbq $0x00, %r9 movq %rax, (%rdi) movq %rcx, 8(%rdi) movq %r8, 16(%rdi) @@ -443,21 +465,20 @@ addq (%rdx), %rax movq 16(%rsi), %r8 adcq 8(%rdx), %rcx - movq 24(%rsi), %r10 + movq 24(%rsi), %r9 adcq 16(%rdx), %r8 - movq $-19, %r11 - adcq 24(%rdx), %r10 + adcq 24(%rdx), %r9 + movq $0x00, %r11 + adcq $0x00, %r11 + shldq $0x01, %r9, %r11 movq $0x7fffffffffffffff, %r12 - movq %r10, %r9 - sarq $63, %r10 - # Mask the modulus - andq %r10, %r11 - andq %r10, %r12 + imulq $19, %r11 + andq %r12, %r9 # Sub modulus (if overflow) - subq %r11, %rax - sbbq %r10, %rcx - sbbq %r10, %r8 - sbbq %r12, %r9 + addq %r11, %rax + adcq $0x00, %rcx + adcq $0x00, %r8 + adcq $0x00, %r9 movq %rax, (%rdi) movq %rcx, 8(%rdi) movq %r8, 16(%rdi) @@ -943,26 +964,6 @@ #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_sq2 -.type fe_sq2,@function -.align 16 -fe_sq2: -#else -.section __TEXT,__text -.globl _fe_sq2 -.p2align 4 -_fe_sq2: -#endif /* __APPLE__ */ -#ifndef __APPLE__ - jmpq *fe_sq2_p(%rip) -#else - jmpq *_fe_sq2_p(%rip) -#endif /* __APPLE__ */ -#ifndef __APPLE__ -.size fe_sq2,.-fe_sq2 -#endif /* __APPLE__ */ -#ifndef __APPLE__ -.text .globl fe_invert .type fe_invert,@function .align 16 @@ -1001,6 +1002,30 @@ #ifndef __APPLE__ .size curve25519,.-curve25519 #endif /* __APPLE__ */ +#ifdef HAVE_ED25519 +#ifdef HAVE_ED25519 +#ifndef __APPLE__ +.text +.globl fe_sq2 +.type fe_sq2,@function +.align 16 +fe_sq2: +#else +.section __TEXT,__text +.globl _fe_sq2 +.p2align 4 +_fe_sq2: +#endif /* __APPLE__ */ +#ifndef __APPLE__ + jmpq *fe_sq2_p(%rip) +#else + jmpq *_fe_sq2_p(%rip) +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.size fe_sq2,.-fe_sq2 +#endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text .globl fe_pow22523 @@ -1021,146 +1046,206 @@ #ifndef __APPLE__ .size fe_pow22523,.-fe_pow22523 #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 +#ifndef __APPLE__ +.text +.globl ge_p1p1_to_p2 +.type ge_p1p1_to_p2,@function +.align 16 +ge_p1p1_to_p2: +#else +.section __TEXT,__text +.globl _ge_p1p1_to_p2 +.p2align 4 +_ge_p1p1_to_p2: +#endif /* __APPLE__ */ +#ifndef __APPLE__ + jmpq *ge_p1p1_to_p2_p(%rip) +#else + jmpq *_ge_p1p1_to_p2_p(%rip) +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.size ge_p1p1_to_p2,.-ge_p1p1_to_p2 +#endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 +#ifndef __APPLE__ +.text +.globl ge_p1p1_to_p3 +.type ge_p1p1_to_p3,@function +.align 16 +ge_p1p1_to_p3: +#else +.section __TEXT,__text +.globl _ge_p1p1_to_p3 +.p2align 4 +_ge_p1p1_to_p3: +#endif /* __APPLE__ */ +#ifndef __APPLE__ + jmpq *ge_p1p1_to_p3_p(%rip) +#else + jmpq *_ge_p1p1_to_p3_p(%rip) +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.size ge_p1p1_to_p3,.-ge_p1p1_to_p3 +#endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text -.globl fe_ge_to_p2 -.type fe_ge_to_p2,@function +.globl ge_p2_dbl +.type ge_p2_dbl,@function .align 16 -fe_ge_to_p2: +ge_p2_dbl: #else .section __TEXT,__text -.globl _fe_ge_to_p2 +.globl _ge_p2_dbl .p2align 4 -_fe_ge_to_p2: +_ge_p2_dbl: #endif /* __APPLE__ */ #ifndef __APPLE__ - jmpq *fe_ge_to_p2_p(%rip) + jmpq *ge_p2_dbl_p(%rip) #else - jmpq *_fe_ge_to_p2_p(%rip) + jmpq *_ge_p2_dbl_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ -.size fe_ge_to_p2,.-fe_ge_to_p2 +.size ge_p2_dbl,.-ge_p2_dbl #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text -.globl fe_ge_to_p3 -.type fe_ge_to_p3,@function +.globl ge_madd +.type ge_madd,@function .align 16 -fe_ge_to_p3: +ge_madd: #else .section __TEXT,__text -.globl _fe_ge_to_p3 +.globl _ge_madd .p2align 4 -_fe_ge_to_p3: +_ge_madd: #endif /* __APPLE__ */ #ifndef __APPLE__ - jmpq *fe_ge_to_p3_p(%rip) + jmpq *ge_madd_p(%rip) #else - jmpq *_fe_ge_to_p3_p(%rip) + jmpq *_ge_madd_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ -.size fe_ge_to_p3,.-fe_ge_to_p3 +.size ge_madd,.-ge_madd #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text -.globl fe_ge_dbl -.type fe_ge_dbl,@function +.globl ge_msub +.type ge_msub,@function .align 16 -fe_ge_dbl: +ge_msub: #else .section __TEXT,__text -.globl _fe_ge_dbl +.globl _ge_msub .p2align 4 -_fe_ge_dbl: +_ge_msub: #endif /* __APPLE__ */ #ifndef __APPLE__ - jmpq *fe_ge_dbl_p(%rip) + jmpq *ge_msub_p(%rip) #else - jmpq *_fe_ge_dbl_p(%rip) + jmpq *_ge_msub_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ -.size fe_ge_dbl,.-fe_ge_dbl +.size ge_msub,.-ge_msub #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text -.globl fe_ge_madd -.type fe_ge_madd,@function +.globl ge_add +.type ge_add,@function .align 16 -fe_ge_madd: +ge_add: #else .section __TEXT,__text -.globl _fe_ge_madd +.globl _ge_add .p2align 4 -_fe_ge_madd: +_ge_add: #endif /* __APPLE__ */ #ifndef __APPLE__ - jmpq *fe_ge_madd_p(%rip) + jmpq *ge_add_p(%rip) #else - jmpq *_fe_ge_madd_p(%rip) + jmpq *_ge_add_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ -.size fe_ge_madd,.-fe_ge_madd +.size ge_add,.-ge_add #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text -.globl fe_ge_msub -.type fe_ge_msub,@function +.globl ge_sub +.type ge_sub,@function .align 16 -fe_ge_msub: +ge_sub: #else .section __TEXT,__text -.globl _fe_ge_msub +.globl _ge_sub .p2align 4 -_fe_ge_msub: +_ge_sub: #endif /* __APPLE__ */ #ifndef __APPLE__ - jmpq *fe_ge_msub_p(%rip) + jmpq *ge_sub_p(%rip) #else - jmpq *_fe_ge_msub_p(%rip) + jmpq *_ge_sub_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ -.size fe_ge_msub,.-fe_ge_msub +.size ge_sub,.-ge_sub #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text -.globl fe_ge_add -.type fe_ge_add,@function +.globl sc_reduce +.type sc_reduce,@function .align 16 -fe_ge_add: +sc_reduce: #else .section __TEXT,__text -.globl _fe_ge_add +.globl _sc_reduce .p2align 4 -_fe_ge_add: +_sc_reduce: #endif /* __APPLE__ */ #ifndef __APPLE__ - jmpq *fe_ge_add_p(%rip) + jmpq *sc_reduce_p(%rip) #else - jmpq *_fe_ge_add_p(%rip) + jmpq *_sc_reduce_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ -.size fe_ge_add,.-fe_ge_add +.size sc_reduce,.-sc_reduce #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text -.globl fe_ge_sub -.type fe_ge_sub,@function +.globl sc_muladd +.type sc_muladd,@function .align 16 -fe_ge_sub: +sc_muladd: #else .section __TEXT,__text -.globl _fe_ge_sub +.globl _sc_muladd .p2align 4 -_fe_ge_sub: +_sc_muladd: #endif /* __APPLE__ */ #ifndef __APPLE__ - jmpq *fe_ge_sub_p(%rip) + jmpq *sc_muladd_p(%rip) #else - jmpq *_fe_ge_sub_p(%rip) + jmpq *_sc_muladd_p(%rip) #endif /* __APPLE__ */ #ifndef __APPLE__ -.size fe_ge_sub,.-fe_ge_sub +.size sc_muladd,.-sc_muladd #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ +#endif /* HAVE_ED25519 */ #ifndef __APPLE__ .data .type cpuFlagsSet, @object @@ -1169,7 +1254,7 @@ .long 0 #else .section __DATA,__data -.p2align 2 +.p2align 3 _cpuFlagsSet: .long 0 #endif /* __APPLE__ */ @@ -1181,7 +1266,7 @@ .long 0 #else .section __DATA,__data -.p2align 2 +.p2align 3 _intelFlags: .long 0 #endif /* __APPLE__ */ @@ -1193,7 +1278,7 @@ .quad fe_mul_x64 #else .section __DATA,__data -.p2align 2 +.p2align 3 _fe_mul_p: .quad _fe_mul_x64 #endif /* __APPLE__ */ @@ -1205,7 +1290,7 @@ .quad fe_sq_x64 #else .section __DATA,__data -.p2align 2 +.p2align 3 _fe_sq_p: .quad _fe_sq_x64 #endif /* __APPLE__ */ @@ -1217,31 +1302,19 @@ .quad fe_mul121666_x64 #else .section __DATA,__data -.p2align 2 +.p2align 3 _fe_mul121666_p: .quad _fe_mul121666_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_sq2_p, @object -.size fe_sq2_p,8 -fe_sq2_p: - .quad fe_sq2_x64 -#else -.section __DATA,__data -.p2align 2 -_fe_sq2_p: - .quad _fe_sq2_x64 -#endif /* __APPLE__ */ -#ifndef __APPLE__ -.data .type fe_invert_p, @object .size fe_invert_p,8 fe_invert_p: .quad fe_invert_x64 #else .section __DATA,__data -.p2align 2 +.p2align 3 _fe_invert_p: .quad _fe_invert_x64 #endif /* __APPLE__ */ @@ -1253,10 +1326,23 @@ .quad curve25519_x64 #else .section __DATA,__data -.p2align 2 +.p2align 3 _curve25519_p: .quad _curve25519_x64 #endif /* __APPLE__ */ +#ifdef HAVE_ED25519 +#ifndef __APPLE__ +.data +.type fe_sq2_p, @object +.size fe_sq2_p,8 +fe_sq2_p: + .quad fe_sq2_x64 +#else +.section __DATA,__data +.p2align 3 +_fe_sq2_p: + .quad _fe_sq2_x64 +#endif /* __APPLE__ */ #ifndef __APPLE__ .data .type fe_pow22523_p, @object @@ -1265,94 +1351,119 @@ .quad fe_pow22523_x64 #else .section __DATA,__data -.p2align 2 +.p2align 3 _fe_pow22523_p: .quad _fe_pow22523_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_ge_to_p2_p, @object -.size fe_ge_to_p2_p,8 -fe_ge_to_p2_p: - .quad fe_ge_to_p2_x64 +.type ge_p1p1_to_p2_p, @object +.size ge_p1p1_to_p2_p,8 +ge_p1p1_to_p2_p: + .quad ge_p1p1_to_p2_x64 +#else +.section __DATA,__data +.p2align 3 +_ge_p1p1_to_p2_p: + .quad _ge_p1p1_to_p2_x64 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +.type ge_p1p1_to_p3_p, @object +.size ge_p1p1_to_p3_p,8 +ge_p1p1_to_p3_p: + .quad ge_p1p1_to_p3_x64 +#else +.section __DATA,__data +.p2align 3 +_ge_p1p1_to_p3_p: + .quad _ge_p1p1_to_p3_x64 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +.type ge_p2_dbl_p, @object +.size ge_p2_dbl_p,8 +ge_p2_dbl_p: + .quad ge_p2_dbl_x64 #else .section __DATA,__data -.p2align 2 -_fe_ge_to_p2_p: - .quad _fe_ge_to_p2_x64 +.p2align 3 +_ge_p2_dbl_p: + .quad _ge_p2_dbl_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_ge_to_p3_p, @object -.size fe_ge_to_p3_p,8 -fe_ge_to_p3_p: - .quad fe_ge_to_p3_x64 +.type ge_madd_p, @object +.size ge_madd_p,8 +ge_madd_p: + .quad ge_madd_x64 #else .section __DATA,__data -.p2align 2 -_fe_ge_to_p3_p: - .quad _fe_ge_to_p3_x64 +.p2align 3 +_ge_madd_p: + .quad _ge_madd_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_ge_dbl_p, @object -.size fe_ge_dbl_p,8 -fe_ge_dbl_p: - .quad fe_ge_dbl_x64 +.type ge_msub_p, @object +.size ge_msub_p,8 +ge_msub_p: + .quad ge_msub_x64 #else .section __DATA,__data -.p2align 2 -_fe_ge_dbl_p: - .quad _fe_ge_dbl_x64 +.p2align 3 +_ge_msub_p: + .quad _ge_msub_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_ge_madd_p, @object -.size fe_ge_madd_p,8 -fe_ge_madd_p: - .quad fe_ge_madd_x64 +.type ge_add_p, @object +.size ge_add_p,8 +ge_add_p: + .quad ge_add_x64 #else .section __DATA,__data -.p2align 2 -_fe_ge_madd_p: - .quad _fe_ge_madd_x64 +.p2align 3 +_ge_add_p: + .quad _ge_add_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_ge_msub_p, @object -.size fe_ge_msub_p,8 -fe_ge_msub_p: - .quad fe_ge_msub_x64 +.type ge_sub_p, @object +.size ge_sub_p,8 +ge_sub_p: + .quad ge_sub_x64 #else .section __DATA,__data -.p2align 2 -_fe_ge_msub_p: - .quad _fe_ge_msub_x64 +.p2align 3 +_ge_sub_p: + .quad _ge_sub_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_ge_add_p, @object -.size fe_ge_add_p,8 -fe_ge_add_p: - .quad fe_ge_add_x64 +.type sc_reduce_p, @object +.size sc_reduce_p,8 +sc_reduce_p: + .quad sc_reduce_x64 #else .section __DATA,__data -.p2align 2 -_fe_ge_add_p: - .quad _fe_ge_add_x64 +.p2align 3 +_sc_reduce_p: + .quad _sc_reduce_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .data -.type fe_ge_sub_p, @object -.size fe_ge_sub_p,8 -fe_ge_sub_p: - .quad fe_ge_sub_x64 +.type sc_muladd_p, @object +.size sc_muladd_p,8 +sc_muladd_p: + .quad sc_muladd_x64 #else .section __DATA,__data -.p2align 2 -_fe_ge_sub_p: - .quad _fe_ge_sub_x64 +.p2align 3 +_sc_muladd_p: + .quad _sc_muladd_x64 #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ #ifndef __APPLE__ .text .globl fe_mul_x64 @@ -1470,55 +1581,43 @@ mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbx, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbx + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %r8 - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbx, %r8 + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax + movq $0x7fffffffffffffff, %rbx + movq %r11, %rax + sarq $63, %rax + andq $19, %rax andq %rbx, %r11 addq %rax, %r8 adcq $0x00, %r9 adcq $0x00, %r10 adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %r8, (%rdi) movq %r9, 8(%rdi) @@ -1621,55 +1720,43 @@ addq %r15, %r12 adcq $0x00, %r13 adcq $0x00, %r14 - # Reduce + movq $38, %rax + mulq %r14 + addq %rax, %r10 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %r15 - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - shldq $0x01, %r10, %r11 + shldq $0x01, %r10, %rdx + imulq $19, %rdx, %rdx andq %r15, %r10 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %r15 + movq $38, %rax mulq %r11 xorq %r11, %r11 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r11 mulq %r12 xorq %r12, %r12 addq %rax, %r8 - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax adcq %rdx, %r13 - mulq %r14 - # Add remaining product results in - addq %r11, %r8 + addq %r15, %rcx + adcq %r11, %r8 adcq %r12, %r9 adcq %r13, %r10 - adcq %rax, %r10 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r10, %rdx - imulq $19, %rdx, %rax + movq $0x7fffffffffffffff, %r15 + movq %r10, %rax + sarq $63, %rax + andq $19, %rax andq %r15, %r10 addq %rax, %rcx adcq $0x00, %r8 adcq $0x00, %r9 adcq $0x00, %r10 - # Reduce if top bit set - movq %r10, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %r15, %r10 - addq %rdx, %rcx - adcq $0x00, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 # Store movq %rcx, (%rdi) movq %r8, 8(%rdi) @@ -1774,55 +1861,34 @@ addq %rbx, %r13 adcq $0x00, %r14 adcq $0x00, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbx, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbx + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %r8 - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbx, %r8 + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %r8, (%rdi) movq %r9, 8(%rdi) @@ -1892,169 +1958,6 @@ #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_sq2_x64 -.type fe_sq2_x64,@function -.align 16 -fe_sq2_x64: -#else -.section __TEXT,__text -.globl _fe_sq2_x64 -.p2align 4 -_fe_sq2_x64: -#endif /* __APPLE__ */ - pushq %r12 - pushq %r13 - pushq %r14 - pushq %r15 - pushq %rbx - # Square * 2 - # A[0] * A[1] - movq (%rsi), %rax - mulq 8(%rsi) - movq %rax, %r8 - movq %rdx, %r9 - # A[0] * A[2] - movq (%rsi), %rax - mulq 16(%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[0] * A[3] - movq (%rsi), %rax - mulq 24(%rsi) - xorq %r11, %r11 - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * A[2] - movq 8(%rsi), %rax - mulq 16(%rsi) - xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[1] * A[3] - movq 8(%rsi), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - # A[2] * A[3] - movq 16(%rsi), %rax - mulq 24(%rsi) - xorq %r13, %r13 - addq %rax, %r12 - adcq %rdx, %r13 - # Double - xorq %r14, %r14 - addq %r8, %r8 - adcq %r9, %r9 - adcq %r10, %r10 - adcq %r11, %r11 - adcq %r12, %r12 - adcq %r13, %r13 - adcq $0x00, %r14 - # A[0] * A[0] - movq (%rsi), %rax - mulq %rax - movq %rax, %rcx - movq %rdx, %r15 - # A[1] * A[1] - movq 8(%rsi), %rax - mulq %rax - addq %r15, %r8 - adcq %rax, %r9 - adcq $0x00, %rdx - movq %rdx, %r15 - # A[2] * A[2] - movq 16(%rsi), %rax - mulq %rax - addq %r15, %r10 - adcq %rax, %r11 - adcq $0x00, %rdx - movq %rdx, %r15 - # A[3] * A[3] - movq 24(%rsi), %rax - mulq %rax - addq %rax, %r13 - adcq %rdx, %r14 - addq %r15, %r12 - adcq $0x00, %r13 - adcq $0x00, %r14 - # Reduce - movq $0x7fffffffffffffff, %rbx - xorq %rax, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $3, %r14, %rax - shldq $2, %r13, %r14 - shldq $2, %r12, %r13 - shldq $2, %r11, %r12 - shldq $2, %r10, %r11 - shldq $0x01, %r9, %r10 - shldq $0x01, %r8, %r9 - shldq $0x01, %rcx, %r8 - shlq $0x01, %rcx - andq %rbx, %r10 - # Two out left, one in right - andq %rbx, %r14 - # Multiply top bits by 19*19 - imulq $0x169, %rax, %r15 - # Multiply top half by 19 - movq $19, %rax - mulq %r11 - xorq %r11, %r11 - addq %rax, %rcx - movq $19, %rax - adcq %rdx, %r11 - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 - mulq %r14 - # Add remaining produce results in - addq %r15, %rcx - adcq %r11, %r8 - adcq %r12, %r9 - adcq %r13, %r10 - adcq %rax, %r10 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r10, %rdx - imulq $19, %rdx, %rax - andq %rbx, %r10 - addq %rax, %rcx - adcq $0x00, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - # Reduce if top bit set - movq %r10, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r10 - addq %rdx, %rcx - adcq $0x00, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - # Store - movq %rcx, (%rdi) - movq %r8, 8(%rdi) - movq %r9, 16(%rdi) - movq %r10, 24(%rdi) - popq %rbx - popq %r15 - popq %r14 - popq %r13 - popq %r12 - repz retq -#ifndef __APPLE__ -.size fe_sq2_x64,.-fe_sq2_x64 -#endif /* __APPLE__ */ -#ifndef __APPLE__ -.text .globl fe_invert_x64 .type fe_invert_x64,@function .align 16 @@ -2328,9 +2231,9 @@ pushq %rbx pushq %rbp movq %rdx, %r8 - subq $0xb8, %rsp + subq $0xb0, %rsp xorq %rbx, %rbx - movq %rdi, 176(%rsp) + movq %rdi, 168(%rsp) # Set one movq $0x01, (%rdi) movq $0x00, 8(%rdi) @@ -2355,12 +2258,12 @@ movq %r9, 72(%rsp) movq %r10, 80(%rsp) movq %r11, 88(%rsp) - movb $62, 168(%rsp) - movq $3, 160(%rsp) -L_curve25519_x64_words: + movq $0xfe, %r9 L_curve25519_x64_bits: - movq 160(%rsp), %r9 - movb 168(%rsp), %cl + movq %r9, 160(%rsp) + movq %r9, %rcx + andq $63, %rcx + shrq $6, %r9 movq (%rsi,%r9,8), %rbp shrq %cl, %rbp andq $0x01, %rbp @@ -2409,48 +2312,45 @@ xorq %r10, 48(%rsp) xorq %r11, 56(%rsp) movq %rbp, %rbx + # Add-Sub # Add movq (%rdi), %rcx movq 8(%rdi), %r9 movq 16(%rdi), %r10 - movq 24(%rdi), %rbp + movq 24(%rdi), %r11 movq %rcx, %r12 addq (%rsp), %rcx movq %r9, %r13 adcq 8(%rsp), %r9 movq %r10, %r14 adcq 16(%rsp), %r10 - movq %rbp, %r15 - adcq 24(%rsp), %rbp - movq $-19, %rax - movq %rbp, %r11 + movq %r11, %r15 + adcq 24(%rsp), %r11 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r11, %rax movq $0x7fffffffffffffff, %rdx - sarq $63, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + imulq $19, %rax + andq %rdx, %r11 # Sub modulus (if overflow) - subq %rax, %rcx - sbbq %rbp, %r9 - sbbq %rbp, %r10 - sbbq %rdx, %r11 + addq %rax, %rcx + adcq $0x00, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 # Sub subq (%rsp), %r12 - movq $0x00, %rbp sbbq 8(%rsp), %r13 - movq $-19, %rax sbbq 16(%rsp), %r14 - movq $0x7fffffffffffffff, %rdx sbbq 24(%rsp), %r15 - sbbq $0x00, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + sbbq %rax, %rax + shldq $0x01, %r15, %rax + imulq $-19, %rax + andq %rdx, %r15 # Add modulus (if underflow) - addq %rax, %r12 - adcq %rbp, %r13 - adcq %rbp, %r14 - adcq %rdx, %r15 + subq %rax, %r12 + sbbq $0x00, %r13 + sbbq $0x00, %r14 + sbbq $0x00, %r15 movq %rcx, (%rdi) movq %r9, 8(%rdi) movq %r10, 16(%rdi) @@ -2459,204 +2359,180 @@ movq %r13, 136(%rsp) movq %r14, 144(%rsp) movq %r15, 152(%rsp) + # Add-Sub # Add movq 64(%rsp), %rcx movq 72(%rsp), %r9 movq 80(%rsp), %r10 - movq 88(%rsp), %rbp + movq 88(%rsp), %r11 movq %rcx, %r12 addq 32(%rsp), %rcx movq %r9, %r13 adcq 40(%rsp), %r9 movq %r10, %r14 adcq 48(%rsp), %r10 - movq %rbp, %r15 - adcq 56(%rsp), %rbp - movq $-19, %rax - movq %rbp, %r11 + movq %r11, %r15 + adcq 56(%rsp), %r11 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r11, %rax movq $0x7fffffffffffffff, %rdx - sarq $63, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + imulq $19, %rax + andq %rdx, %r11 # Sub modulus (if overflow) - subq %rax, %rcx - sbbq %rbp, %r9 - sbbq %rbp, %r10 - sbbq %rdx, %r11 + addq %rax, %rcx + adcq $0x00, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 # Sub subq 32(%rsp), %r12 - movq $0x00, %rbp sbbq 40(%rsp), %r13 - movq $-19, %rax sbbq 48(%rsp), %r14 - movq $0x7fffffffffffffff, %rdx sbbq 56(%rsp), %r15 - sbbq $0x00, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + sbbq %rax, %rax + shldq $0x01, %r15, %rax + imulq $-19, %rax + andq %rdx, %r15 # Add modulus (if underflow) - addq %rax, %r12 - adcq %rbp, %r13 - adcq %rbp, %r14 - adcq %rdx, %r15 - movq %rcx, (%rsp) - movq %r9, 8(%rsp) - movq %r10, 16(%rsp) - movq %r11, 24(%rsp) + subq %rax, %r12 + sbbq $0x00, %r13 + sbbq $0x00, %r14 + sbbq $0x00, %r15 + movq %rcx, 32(%rsp) + movq %r9, 40(%rsp) + movq %r10, 48(%rsp) + movq %r11, 56(%rsp) movq %r12, 96(%rsp) movq %r13, 104(%rsp) movq %r14, 112(%rsp) movq %r15, 120(%rsp) # Multiply # A[0] * B[0] - movq (%rdi), %rax - mulq 96(%rsp) + movq 128(%rsp), %rax + mulq 32(%rsp) movq %rax, %rcx movq %rdx, %r9 # A[0] * B[1] - movq 8(%rdi), %rax - mulq 96(%rsp) + movq 136(%rsp), %rax + mulq 32(%rsp) xorq %r10, %r10 addq %rax, %r9 adcq %rdx, %r10 # A[1] * B[0] - movq (%rdi), %rax - mulq 104(%rsp) + movq 128(%rsp), %rax + mulq 40(%rsp) xorq %r11, %r11 addq %rax, %r9 adcq %rdx, %r10 adcq $0x00, %r11 # A[0] * B[2] - movq 16(%rdi), %rax - mulq 96(%rsp) + movq 144(%rsp), %rax + mulq 32(%rsp) addq %rax, %r10 adcq %rdx, %r11 # A[1] * B[1] - movq 8(%rdi), %rax - mulq 104(%rsp) + movq 136(%rsp), %rax + mulq 40(%rsp) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[2] * B[0] - movq (%rdi), %rax - mulq 112(%rsp) + movq 128(%rsp), %rax + mulq 48(%rsp) addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[0] * B[3] - movq 24(%rdi), %rax - mulq 96(%rsp) + movq 152(%rsp), %rax + mulq 32(%rsp) xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[2] - movq 16(%rdi), %rax - mulq 104(%rsp) + movq 144(%rsp), %rax + mulq 40(%rsp) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[2] * B[1] - movq 8(%rdi), %rax - mulq 112(%rsp) + movq 136(%rsp), %rax + mulq 48(%rsp) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[3] * B[0] - movq (%rdi), %rax - mulq 120(%rsp) + movq 128(%rsp), %rax + mulq 56(%rsp) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[3] - movq 24(%rdi), %rax - mulq 104(%rsp) + movq 152(%rsp), %rax + mulq 40(%rsp) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[2] - movq 16(%rdi), %rax - mulq 112(%rsp) + movq 144(%rsp), %rax + mulq 48(%rsp) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[3] * B[1] - movq 8(%rdi), %rax - mulq 120(%rsp) + movq 136(%rsp), %rax + mulq 56(%rsp) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[3] - movq 24(%rdi), %rax - mulq 112(%rsp) + movq 152(%rsp), %rax + mulq 48(%rsp) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[2] - movq 16(%rdi), %rax - mulq 120(%rsp) + movq 144(%rsp), %rax + mulq 56(%rsp) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[3] - movq 24(%rdi), %rax - mulq 120(%rsp) + movq 152(%rsp), %rax + mulq 56(%rsp) addq %rax, %r14 adcq %rdx, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, 32(%rsp) movq %r9, 40(%rsp) @@ -2664,152 +2540,131 @@ movq %r11, 56(%rsp) # Multiply # A[0] * B[0] - movq 128(%rsp), %rax - mulq (%rsp) + movq (%rdi), %rax + mulq 96(%rsp) movq %rax, %rcx movq %rdx, %r9 # A[0] * B[1] - movq 136(%rsp), %rax - mulq (%rsp) + movq 8(%rdi), %rax + mulq 96(%rsp) xorq %r10, %r10 addq %rax, %r9 adcq %rdx, %r10 # A[1] * B[0] - movq 128(%rsp), %rax - mulq 8(%rsp) + movq (%rdi), %rax + mulq 104(%rsp) xorq %r11, %r11 addq %rax, %r9 adcq %rdx, %r10 adcq $0x00, %r11 # A[0] * B[2] - movq 144(%rsp), %rax - mulq (%rsp) + movq 16(%rdi), %rax + mulq 96(%rsp) addq %rax, %r10 adcq %rdx, %r11 # A[1] * B[1] - movq 136(%rsp), %rax - mulq 8(%rsp) + movq 8(%rdi), %rax + mulq 104(%rsp) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[2] * B[0] - movq 128(%rsp), %rax - mulq 16(%rsp) + movq (%rdi), %rax + mulq 112(%rsp) addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[0] * B[3] - movq 152(%rsp), %rax - mulq (%rsp) + movq 24(%rdi), %rax + mulq 96(%rsp) xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[2] - movq 144(%rsp), %rax - mulq 8(%rsp) + movq 16(%rdi), %rax + mulq 104(%rsp) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[2] * B[1] - movq 136(%rsp), %rax - mulq 16(%rsp) + movq 8(%rdi), %rax + mulq 112(%rsp) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[3] * B[0] - movq 128(%rsp), %rax - mulq 24(%rsp) + movq (%rdi), %rax + mulq 120(%rsp) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[3] - movq 152(%rsp), %rax - mulq 8(%rsp) + movq 24(%rdi), %rax + mulq 104(%rsp) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[2] - movq 144(%rsp), %rax - mulq 16(%rsp) + movq 16(%rdi), %rax + mulq 112(%rsp) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[3] * B[1] - movq 136(%rsp), %rax - mulq 24(%rsp) + movq 8(%rdi), %rax + mulq 120(%rsp) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[3] - movq 152(%rsp), %rax - mulq 16(%rsp) + movq 24(%rdi), %rax + mulq 112(%rsp) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[2] - movq 144(%rsp), %rax - mulq 24(%rsp) + movq 16(%rdi), %rax + mulq 120(%rsp) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[3] - movq 152(%rsp), %rax - mulq 24(%rsp) + movq 24(%rdi), %rax + mulq 120(%rsp) addq %rax, %r14 adcq %rdx, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, (%rsp) movq %r9, 8(%rsp) @@ -2887,55 +2742,34 @@ addq %rbp, %r13 adcq $0x00, %r14 adcq $0x00, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, 96(%rsp) movq %r9, 104(%rsp) @@ -3013,110 +2847,86 @@ addq %rbp, %r13 adcq $0x00, %r14 adcq $0x00, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, 128(%rsp) movq %r9, 136(%rsp) movq %r10, 144(%rsp) movq %r11, 152(%rsp) + # Add-Sub # Add - movq 32(%rsp), %rcx - movq 40(%rsp), %r9 - movq 48(%rsp), %r10 - movq 56(%rsp), %rbp + movq (%rsp), %rcx + movq 8(%rsp), %r9 + movq 16(%rsp), %r10 + movq 24(%rsp), %r11 movq %rcx, %r12 - addq (%rsp), %rcx + addq 32(%rsp), %rcx movq %r9, %r13 - adcq 8(%rsp), %r9 + adcq 40(%rsp), %r9 movq %r10, %r14 - adcq 16(%rsp), %r10 - movq %rbp, %r15 - adcq 24(%rsp), %rbp - movq $-19, %rax - movq %rbp, %r11 + adcq 48(%rsp), %r10 + movq %r11, %r15 + adcq 56(%rsp), %r11 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r11, %rax movq $0x7fffffffffffffff, %rdx - sarq $63, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + imulq $19, %rax + andq %rdx, %r11 # Sub modulus (if overflow) - subq %rax, %rcx - sbbq %rbp, %r9 - sbbq %rbp, %r10 - sbbq %rdx, %r11 + addq %rax, %rcx + adcq $0x00, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 # Sub - subq (%rsp), %r12 - movq $0x00, %rbp - sbbq 8(%rsp), %r13 - movq $-19, %rax - sbbq 16(%rsp), %r14 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rsp), %r15 - sbbq $0x00, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + subq 32(%rsp), %r12 + sbbq 40(%rsp), %r13 + sbbq 48(%rsp), %r14 + sbbq 56(%rsp), %r15 + sbbq %rax, %rax + shldq $0x01, %r15, %rax + imulq $-19, %rax + andq %rdx, %r15 # Add modulus (if underflow) - addq %rax, %r12 - adcq %rbp, %r13 - adcq %rbp, %r14 - adcq %rdx, %r15 + subq %rax, %r12 + sbbq $0x00, %r13 + sbbq $0x00, %r14 + sbbq $0x00, %r15 movq %rcx, 64(%rsp) movq %r9, 72(%rsp) movq %r10, 80(%rsp) movq %r11, 88(%rsp) - movq %r12, (%rsp) - movq %r13, 8(%rsp) - movq %r14, 16(%rsp) - movq %r15, 24(%rsp) + movq %r12, 32(%rsp) + movq %r13, 40(%rsp) + movq %r14, 48(%rsp) + movq %r15, 56(%rsp) # Multiply # A[0] * B[0] movq 96(%rsp), %rax @@ -3216,55 +3026,34 @@ mulq 152(%rsp) addq %rax, %r14 adcq %rdx, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, (%rdi) movq %r9, 8(%rdi) @@ -3276,58 +3065,56 @@ movq 144(%rsp), %r10 movq 152(%rsp), %r11 subq 96(%rsp), %rcx - movq $0x00, %rbp sbbq 104(%rsp), %r9 - movq $-19, %rax sbbq 112(%rsp), %r10 - movq $0x7fffffffffffffff, %rdx sbbq 120(%rsp), %r11 - sbbq $0x00, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + sbbq %rax, %rax + shldq $0x01, %r11, %rax + movq $0x7fffffffffffffff, %rdx + imulq $-19, %rax + andq %rdx, %r11 # Add modulus (if underflow) - addq %rax, %rcx - adcq %rbp, %r9 - adcq %rbp, %r10 - adcq %rdx, %r11 + subq %rax, %rcx + sbbq $0x00, %r9 + sbbq $0x00, %r10 + sbbq $0x00, %r11 movq %rcx, 128(%rsp) movq %r9, 136(%rsp) movq %r10, 144(%rsp) movq %r11, 152(%rsp) # Square # A[0] * A[1] - movq (%rsp), %rax - mulq 8(%rsp) + movq 32(%rsp), %rax + mulq 40(%rsp) movq %rax, %r9 movq %rdx, %r10 # A[0] * A[2] - movq (%rsp), %rax - mulq 16(%rsp) + movq 32(%rsp), %rax + mulq 48(%rsp) xorq %r11, %r11 addq %rax, %r10 adcq %rdx, %r11 # A[0] * A[3] - movq (%rsp), %rax - mulq 24(%rsp) + movq 32(%rsp), %rax + mulq 56(%rsp) xorq %r12, %r12 addq %rax, %r11 adcq %rdx, %r12 # A[1] * A[2] - movq 8(%rsp), %rax - mulq 16(%rsp) + movq 40(%rsp), %rax + mulq 48(%rsp) xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * A[3] - movq 8(%rsp), %rax - mulq 24(%rsp) + movq 40(%rsp), %rax + mulq 56(%rsp) addq %rax, %r12 adcq %rdx, %r13 # A[2] * A[3] - movq 16(%rsp), %rax - mulq 24(%rsp) + movq 48(%rsp), %rax + mulq 56(%rsp) xorq %r14, %r14 addq %rax, %r13 adcq %rdx, %r14 @@ -3341,86 +3128,65 @@ adcq %r14, %r14 adcq $0x00, %r15 # A[0] * A[0] - movq (%rsp), %rax + movq 32(%rsp), %rax mulq %rax movq %rax, %rcx movq %rdx, %rbp # A[1] * A[1] - movq 8(%rsp), %rax + movq 40(%rsp), %rax mulq %rax addq %rbp, %r9 adcq %rax, %r10 adcq $0x00, %rdx movq %rdx, %rbp # A[2] * A[2] - movq 16(%rsp), %rax + movq 48(%rsp), %rax mulq %rax addq %rbp, %r11 adcq %rax, %r12 adcq $0x00, %rdx movq %rdx, %rbp # A[3] * A[3] - movq 24(%rsp), %rax + movq 56(%rsp), %rax mulq %rax addq %rax, %r14 adcq %rdx, %r15 addq %rbp, %r13 adcq $0x00, %r14 adcq $0x00, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store - movq %rcx, (%rsp) - movq %r9, 8(%rsp) - movq %r10, 16(%rsp) - movq %r11, 24(%rsp) + movq %rcx, 32(%rsp) + movq %r9, 40(%rsp) + movq %r10, 48(%rsp) + movq %r11, 56(%rsp) # Multiply by 121666 movq $0x1db42, %rax mulq 128(%rsp) @@ -3450,10 +3216,10 @@ adcq $0x00, %r9 adcq $0x00, %r10 adcq $0x00, %r11 - movq %rcx, 32(%rsp) - movq %r9, 40(%rsp) - movq %r10, 48(%rsp) - movq %r11, 56(%rsp) + movq %rcx, (%rsp) + movq %r9, 8(%rsp) + movq %r10, 16(%rsp) + movq %r11, 24(%rsp) # Square # A[0] * A[1] movq 64(%rsp), %rax @@ -3526,55 +3292,34 @@ addq %rbp, %r13 adcq $0x00, %r14 adcq $0x00, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, 64(%rsp) movq %r9, 72(%rsp) @@ -3583,176 +3328,154 @@ # Add movq 96(%rsp), %rcx movq 104(%rsp), %r9 - addq 32(%rsp), %rcx + addq (%rsp), %rcx movq 112(%rsp), %r10 - adcq 40(%rsp), %r9 - movq 120(%rsp), %rbp - adcq 48(%rsp), %r10 - movq $-19, %rax - adcq 56(%rsp), %rbp + adcq 8(%rsp), %r9 + movq 120(%rsp), %r11 + adcq 16(%rsp), %r10 + adcq 24(%rsp), %r11 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r11, %rax movq $0x7fffffffffffffff, %rdx - movq %rbp, %r11 - sarq $63, %rbp - # Mask the modulus - andq %rbp, %rax - andq %rbp, %rdx + imulq $19, %rax + andq %rdx, %r11 # Sub modulus (if overflow) - subq %rax, %rcx - sbbq %rbp, %r9 - sbbq %rbp, %r10 - sbbq %rdx, %r11 + addq %rax, %rcx + adcq $0x00, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 movq %rcx, 96(%rsp) movq %r9, 104(%rsp) movq %r10, 112(%rsp) movq %r11, 120(%rsp) # Multiply # A[0] * B[0] - movq (%rsp), %rax + movq 32(%rsp), %rax mulq (%r8) movq %rax, %rcx movq %rdx, %r9 # A[0] * B[1] - movq 8(%rsp), %rax + movq 40(%rsp), %rax mulq (%r8) xorq %r10, %r10 addq %rax, %r9 adcq %rdx, %r10 # A[1] * B[0] - movq (%rsp), %rax + movq 32(%rsp), %rax mulq 8(%r8) xorq %r11, %r11 addq %rax, %r9 adcq %rdx, %r10 adcq $0x00, %r11 # A[0] * B[2] - movq 16(%rsp), %rax + movq 48(%rsp), %rax mulq (%r8) addq %rax, %r10 adcq %rdx, %r11 # A[1] * B[1] - movq 8(%rsp), %rax + movq 40(%rsp), %rax mulq 8(%r8) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[2] * B[0] - movq (%rsp), %rax + movq 32(%rsp), %rax mulq 16(%r8) addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[0] * B[3] - movq 24(%rsp), %rax + movq 56(%rsp), %rax mulq (%r8) xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[2] - movq 16(%rsp), %rax + movq 48(%rsp), %rax mulq 8(%r8) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[2] * B[1] - movq 8(%rsp), %rax + movq 40(%rsp), %rax mulq 16(%r8) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[3] * B[0] - movq (%rsp), %rax + movq 32(%rsp), %rax mulq 24(%r8) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[3] - movq 24(%rsp), %rax + movq 56(%rsp), %rax mulq 8(%r8) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[2] - movq 16(%rsp), %rax + movq 48(%rsp), %rax mulq 16(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[3] * B[1] - movq 8(%rsp), %rax + movq 40(%rsp), %rax mulq 24(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[3] - movq 24(%rsp), %rax + movq 56(%rsp), %rax mulq 16(%r8) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[2] - movq 16(%rsp), %rax + movq 48(%rsp), %rax mulq 24(%r8) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[3] - movq 24(%rsp), %rax + movq 56(%rsp), %rax mulq 24(%r8) addq %rax, %r14 adcq %rdx, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, 32(%rsp) movq %r9, 40(%rsp) @@ -3857,65 +3580,42 @@ mulq 152(%rsp) addq %rax, %r14 adcq %rdx, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbp, %r11 - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbp, %r11 - addq %rdx, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 # Store movq %rcx, (%rsp) movq %r9, 8(%rsp) movq %r10, 16(%rsp) movq %r11, 24(%rsp) - decb 168(%rsp) + movq 160(%rsp), %r9 + decq %r9 jge L_curve25519_x64_bits - movq $63, 168(%rsp) - decb 160(%rsp) - jge L_curve25519_x64_words # Invert leaq 32(%rsp), %rdi movq %rsp, %rsi @@ -4153,7 +3853,7 @@ #else callq _fe_mul_x64 #endif /* __APPLE__ */ - movq 176(%rsp), %rdi + movq 168(%rsp), %rdi # Multiply # A[0] * B[0] movq (%rsp), %rax @@ -4253,77 +3953,66 @@ mulq 24(%rdi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce + movq $38, %rax + mulq %r15 + addq %rax, %r11 + adcq $0x00, %rdx movq $0x7fffffffffffffff, %rbp - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rdx + imulq $19, %rdx, %rdx andq %rbp, %r11 - # Multiply top half by 19 - movq $19, %rax + movq %rdx, %rbp + movq $38, %rax mulq %r12 xorq %r12, %r12 addq %rax, %rcx - movq $19, %rax + movq $38, %rax adcq %rdx, %r12 mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 + addq %rbp, %rcx + adcq %r12, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax + movq $0x7fffffffffffffff, %rbp + movq %r11, %rax + sarq $63, %rax + andq $19, %rax andq %rbp, %r11 addq %rax, %rcx adcq $0x00, %r9 adcq $0x00, %r10 adcq $0x00, %r11 - # Reduce if top bit set + movq $0x7fffffffffffffff, %rax + movq %rcx, %rdx + addq $19, %rdx + movq %r9, %rdx + adcq $0x00, %rdx + movq %r10, %rdx + adcq $0x00, %rdx movq %r11, %rdx + adcq $0x00, %rdx sarq $63, %rdx andq $19, %rdx - andq %rbp, %r11 + andq %rax, %r11 addq %rdx, %rcx adcq $0x00, %r9 adcq $0x00, %r10 adcq $0x00, %r11 - movq %rcx, %rax - addq $19, %rax - movq %r9, %rax - adcq $0x00, %rax - movq %r10, %rax - adcq $0x00, %rax - movq %r11, %rax - adcq $0x00, %rax - sarq $63, %rax - andq $19, %rax - addq %rax, %rcx - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - andq %rbp, %r11 # Store movq %rcx, (%rdi) movq %r9, 8(%rdi) movq %r10, 16(%rdi) movq %r11, 24(%rdi) xorq %rax, %rax - addq $0xb8, %rsp + addq $0xb0, %rsp popq %rbp popq %rbx popq %r15 @@ -4334,6 +4023,149 @@ #ifndef __APPLE__ .size curve25519_x64,.-curve25519_x64 #endif /* __APPLE__ */ +#ifdef HAVE_ED25519 +#ifndef __APPLE__ +.text +.globl fe_sq2_x64 +.type fe_sq2_x64,@function +.align 16 +fe_sq2_x64: +#else +.section __TEXT,__text +.globl _fe_sq2_x64 +.p2align 4 +_fe_sq2_x64: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + # Square * 2 + # A[0] * A[1] + movq (%rsi), %rax + mulq 8(%rsi) + movq %rax, %r8 + movq %rdx, %r9 + # A[0] * A[2] + movq (%rsi), %rax + mulq 16(%rsi) + xorq %r10, %r10 + addq %rax, %r9 + adcq %rdx, %r10 + # A[0] * A[3] + movq (%rsi), %rax + mulq 24(%rsi) + xorq %r11, %r11 + addq %rax, %r10 + adcq %rdx, %r11 + # A[1] * A[2] + movq 8(%rsi), %rax + mulq 16(%rsi) + xorq %r12, %r12 + addq %rax, %r10 + adcq %rdx, %r11 + adcq $0x00, %r12 + # A[1] * A[3] + movq 8(%rsi), %rax + mulq 24(%rsi) + addq %rax, %r11 + adcq %rdx, %r12 + # A[2] * A[3] + movq 16(%rsi), %rax + mulq 24(%rsi) + xorq %r13, %r13 + addq %rax, %r12 + adcq %rdx, %r13 + # Double + xorq %r14, %r14 + addq %r8, %r8 + adcq %r9, %r9 + adcq %r10, %r10 + adcq %r11, %r11 + adcq %r12, %r12 + adcq %r13, %r13 + adcq $0x00, %r14 + # A[0] * A[0] + movq (%rsi), %rax + mulq %rax + movq %rax, %rcx + movq %rdx, %r15 + # A[1] * A[1] + movq 8(%rsi), %rax + mulq %rax + addq %r15, %r8 + adcq %rax, %r9 + adcq $0x00, %rdx + movq %rdx, %r15 + # A[2] * A[2] + movq 16(%rsi), %rax + mulq %rax + addq %r15, %r10 + adcq %rax, %r11 + adcq $0x00, %rdx + movq %rdx, %r15 + # A[3] * A[3] + movq 24(%rsi), %rax + mulq %rax + addq %rax, %r13 + adcq %rdx, %r14 + addq %r15, %r12 + adcq $0x00, %r13 + adcq $0x00, %r14 + movq $38, %rax + mulq %r14 + addq %rax, %r10 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r15 + shldq $0x01, %r10, %rdx + imulq $19, %rdx, %rdx + andq %r15, %r10 + movq %rdx, %r15 + movq $38, %rax + mulq %r11 + xorq %r11, %r11 + addq %rax, %rcx + movq $38, %rax + adcq %rdx, %r11 + mulq %r12 + xorq %r12, %r12 + addq %rax, %r8 + movq $38, %rax + adcq %rdx, %r12 + mulq %r13 + xorq %r13, %r13 + addq %rax, %r9 + adcq %rdx, %r13 + addq %r15, %rcx + adcq %r11, %r8 + adcq %r12, %r9 + adcq %r13, %r10 + movq %r10, %rax + shldq $0x01, %r9, %r10 + shldq $0x01, %r8, %r9 + shldq $0x01, %rcx, %r8 + shlq $0x01, %rcx + movq $0x7fffffffffffffff, %r15 + shrq $62, %rax + andq %r15, %r10 + imulq $19, %rax, %rax + addq %rax, %rcx + adcq $0x00, %r8 + adcq $0x00, %r9 + adcq $0x00, %r10 + # Store + movq %rcx, (%rdi) + movq %r8, 8(%rdi) + movq %r9, 16(%rdi) + movq %r10, 24(%rdi) + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size fe_sq2_x64,.-fe_sq2_x64 +#endif /* __APPLE__ */ #ifndef __APPLE__ .text .globl fe_pow22523_x64 @@ -4591,4961 +4423,4678 @@ repz retq #ifndef __APPLE__ .text -.globl fe_ge_to_p2_x64 -.type fe_ge_to_p2_x64,@function +.globl ge_p1p1_to_p2_x64 +.type ge_p1p1_to_p2_x64,@function .align 16 -fe_ge_to_p2_x64: +ge_p1p1_to_p2_x64: #else .section __TEXT,__text -.globl _fe_ge_to_p2_x64 +.globl _ge_p1p1_to_p2_x64 .p2align 4 -_fe_ge_to_p2_x64: +_ge_p1p1_to_p2_x64: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $40, %rsp - movq %rsi, (%rsp) - movq %rdx, 8(%rsp) - movq %rcx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - movq 16(%rsp), %rsi - movq 88(%rsp), %rbx + pushq %rbx + subq $16, %rsp + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rsi, %rcx + addq $0x60, %rcx # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r9 + movq %rdx, %r10 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax + # A[1] * B[0] + movq (%rcx), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax + # A[0] * B[2] + movq 16(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax + # A[1] * B[1] + movq 8(%rcx), %rax mulq 8(%rsi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax + # A[2] * B[0] + movq (%rcx), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rsi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[1] + movq 8(%rcx), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax + # A[3] * B[0] + movq (%rcx), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rsi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[1] + movq 8(%rcx), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rsi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[2] + movq 16(%rcx), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + adcq $0x00, %rbx + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rsi) + addq %rax, %r15 + adcq %rdx, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 24(%rsp), %rsi - movq 32(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $0x40, %rsi + addq $0x40, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r9 + movq %rdx, %r10 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax + # A[1] * B[0] + movq (%rcx), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax + # A[0] * B[2] + movq 16(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax + # A[1] * B[1] + movq 8(%rcx), %rax mulq 8(%rsi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax + # A[2] * B[0] + movq (%rcx), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rsi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[1] + movq 8(%rcx), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax + # A[3] * B[0] + movq (%rcx), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rsi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[1] + movq 8(%rcx), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rsi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[2] + movq 16(%rcx), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + adcq $0x00, %rbx + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rsi) + addq %rax, %r15 + adcq %rdx, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 32(%rsp), %rsi - movq 88(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + movq %rsi, %rcx + subq $32, %rcx + subq $32, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r9 + movq %rdx, %r10 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax + # A[1] * B[0] + movq (%rcx), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax + # A[0] * B[2] + movq 16(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax + # A[1] * B[1] + movq 8(%rcx), %rax mulq 8(%rsi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax + # A[2] * B[0] + movq (%rcx), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rsi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[1] + movq 8(%rcx), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax + # A[3] * B[0] + movq (%rcx), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rsi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[1] + movq 8(%rcx), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rsi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[2] + movq 16(%rcx), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + adcq $0x00, %rbx + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rsi) + addq %rax, %r15 + adcq %rdx, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $40, %rsp + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $16, %rsp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_to_p2_x64,.-fe_ge_to_p2_x64 +.size ge_p1p1_to_p2_x64,.-ge_p1p1_to_p2_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_to_p3_x64 -.type fe_ge_to_p3_x64,@function +.globl ge_p1p1_to_p3_x64 +.type ge_p1p1_to_p3_x64,@function .align 16 -fe_ge_to_p3_x64: +ge_p1p1_to_p3_x64: #else .section __TEXT,__text -.globl _fe_ge_to_p3_x64 +.globl _ge_p1p1_to_p3_x64 .p2align 4 -_fe_ge_to_p3_x64: +_ge_p1p1_to_p3_x64: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $40, %rsp - movq %rsi, (%rsp) - movq %rdx, 8(%rsp) - movq %rcx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - movq 24(%rsp), %rsi - movq 96(%rsp), %rbx + pushq %rbx + subq $16, %rsp + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + movq %rsi, %rcx + addq $0x60, %rcx # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r9 + movq %rdx, %r10 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax + # A[1] * B[0] + movq (%rcx), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax + # A[0] * B[2] + movq 16(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax + # A[1] * B[1] + movq 8(%rcx), %rax mulq 8(%rsi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax + # A[2] * B[0] + movq (%rcx), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rsi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[1] + movq 8(%rcx), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax + # A[3] * B[0] + movq (%rcx), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rsi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[1] + movq 8(%rcx), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rsi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[2] + movq 16(%rcx), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + adcq $0x00, %rbx + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rsi) + addq %rax, %r15 + adcq %rdx, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 32(%rsp), %rsi - movq 88(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + movq %rsi, %rcx + addq $32, %rcx + addq $0x60, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r9 + movq %rdx, %r10 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax + # A[1] * B[0] + movq (%rcx), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax + # A[0] * B[2] + movq 16(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax + # A[1] * B[1] + movq 8(%rcx), %rax mulq 8(%rsi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax + # A[2] * B[0] + movq (%rcx), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rsi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[1] + movq 8(%rcx), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax + # A[3] * B[0] + movq (%rcx), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rsi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[1] + movq 8(%rcx), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rsi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[2] + movq 16(%rcx), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + adcq $0x00, %rbx + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rsi) + addq %rax, %r15 + adcq %rdx, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 88(%rsp), %rsi - movq 96(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $0x40, %rsi + subq $0x40, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r9 + movq %rdx, %r10 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax + # A[1] * B[0] + movq (%rcx), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax + # A[0] * B[2] + movq 16(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax + # A[1] * B[1] + movq 8(%rcx), %rax mulq 8(%rsi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax + # A[2] * B[0] + movq (%rcx), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rsi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[1] + movq 8(%rcx), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax + # A[3] * B[0] + movq (%rcx), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rsi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[1] + movq 8(%rcx), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rsi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[2] + movq 16(%rcx), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + adcq $0x00, %rbx + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rsi) + addq %rax, %r15 + adcq %rdx, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq 24(%rsp), %rsi - movq 32(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + movq %rsi, %rcx + addq $32, %rcx + addq $32, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r9 + movq %rdx, %r10 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax + # A[1] * B[0] + movq (%rcx), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax + # A[0] * B[2] + movq 16(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax + # A[1] * B[1] + movq 8(%rcx), %rax mulq 8(%rsi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax + # A[2] * B[0] + movq (%rcx), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rsi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[1] + movq 8(%rcx), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax + # A[3] * B[0] + movq (%rcx), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rsi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[1] + movq 8(%rcx), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rsi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[2] + movq 16(%rcx), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + adcq $0x00, %rbx + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rsi) + addq %rax, %r15 + adcq %rdx, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $40, %rsp + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $16, %rsp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_to_p3_x64,.-fe_ge_to_p3_x64 +.size ge_p1p1_to_p3_x64,.-ge_p1p1_to_p3_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_dbl_x64 -.type fe_ge_dbl_x64,@function +.globl ge_p2_dbl_x64 +.type ge_p2_dbl_x64,@function .align 16 -fe_ge_dbl_x64: +ge_p2_dbl_x64: #else .section __TEXT,__text -.globl _fe_ge_dbl_x64 +.globl _ge_p2_dbl_x64 .p2align 4 -_fe_ge_dbl_x64: +_ge_p2_dbl_x64: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $0x50, %rsp + pushq %rbx + subq $16, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq (%rsp), %rdi - movq 32(%rsp), %rsi + addq $0x40, %rdi # Square # A[0] * A[1] movq (%rsi), %rax mulq 8(%rsi) - movq %rax, %r9 - movq %rdx, %r10 + movq %rax, %r10 + movq %rdx, %r11 # A[0] * A[2] movq (%rsi), %rax mulq 16(%rsi) - xorq %r11, %r11 - addq %rax, %r10 - adcq %rdx, %r11 - # A[0] * A[3] - movq (%rsi), %rax - mulq 24(%rsi) xorq %r12, %r12 addq %rax, %r11 adcq %rdx, %r12 + # A[0] * A[3] + movq (%rsi), %rax + mulq 24(%rsi) + xorq %r13, %r13 + addq %rax, %r12 + adcq %rdx, %r13 # A[1] * A[2] movq 8(%rsi), %rax mulq 16(%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 + xorq %r14, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 # A[1] * A[3] movq 8(%rsi), %rax mulq 24(%rsi) - addq %rax, %r12 - adcq %rdx, %r13 + addq %rax, %r13 + adcq %rdx, %r14 # A[2] * A[3] movq 16(%rsi), %rax mulq 24(%rsi) - xorq %r14, %r14 - addq %rax, %r13 - adcq %rdx, %r14 - # Double xorq %r15, %r15 - addq %r9, %r9 - adcq %r10, %r10 + addq %rax, %r14 + adcq %rdx, %r15 + # Double + xorq %rbx, %rbx + addq %r10, %r10 adcq %r11, %r11 adcq %r12, %r12 adcq %r13, %r13 adcq %r14, %r14 - adcq $0x00, %r15 + adcq %r15, %r15 + adcq $0x00, %rbx # A[0] * A[0] movq (%rsi), %rax mulq %rax - movq %rax, %r8 - movq %rdx, %rcx + movq %rax, %r9 + movq %rdx, %r8 # A[1] * A[1] movq 8(%rsi), %rax mulq %rax - addq %rcx, %r9 - adcq %rax, %r10 + addq %r8, %r10 + adcq %rax, %r11 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[2] * A[2] movq 16(%rsi), %rax mulq %rax - addq %rcx, %r11 - adcq %rax, %r12 + addq %r8, %r12 + adcq %rax, %r13 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[3] * A[3] movq 24(%rsi), %rax mulq %rax - addq %rax, %r14 - adcq %rdx, %r15 - addq %rcx, %r13 - adcq $0x00, %r14 - adcq $0x00, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + addq %rax, %r15 + adcq %rdx, %rbx + addq %r8, %r14 + adcq $0x00, %r15 + adcq $0x00, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq 40(%rsp), %rsi + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $32, %rsi # Square # A[0] * A[1] movq (%rsi), %rax mulq 8(%rsi) - movq %rax, %r9 - movq %rdx, %r10 + movq %rax, %r10 + movq %rdx, %r11 # A[0] * A[2] movq (%rsi), %rax mulq 16(%rsi) - xorq %r11, %r11 - addq %rax, %r10 - adcq %rdx, %r11 - # A[0] * A[3] - movq (%rsi), %rax - mulq 24(%rsi) xorq %r12, %r12 addq %rax, %r11 adcq %rdx, %r12 + # A[0] * A[3] + movq (%rsi), %rax + mulq 24(%rsi) + xorq %r13, %r13 + addq %rax, %r12 + adcq %rdx, %r13 # A[1] * A[2] movq 8(%rsi), %rax mulq 16(%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 + xorq %r14, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 # A[1] * A[3] movq 8(%rsi), %rax mulq 24(%rsi) - addq %rax, %r12 - adcq %rdx, %r13 + addq %rax, %r13 + adcq %rdx, %r14 # A[2] * A[3] movq 16(%rsi), %rax mulq 24(%rsi) - xorq %r14, %r14 - addq %rax, %r13 - adcq %rdx, %r14 - # Double xorq %r15, %r15 - addq %r9, %r9 - adcq %r10, %r10 + addq %rax, %r14 + adcq %rdx, %r15 + # Double + xorq %rbx, %rbx + addq %r10, %r10 adcq %r11, %r11 adcq %r12, %r12 adcq %r13, %r13 adcq %r14, %r14 - adcq $0x00, %r15 + adcq %r15, %r15 + adcq $0x00, %rbx # A[0] * A[0] movq (%rsi), %rax mulq %rax - movq %rax, %r8 - movq %rdx, %rcx + movq %rax, %r9 + movq %rdx, %r8 # A[1] * A[1] movq 8(%rsi), %rax mulq %rax - addq %rcx, %r9 - adcq %rax, %r10 + addq %r8, %r10 + adcq %rax, %r11 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[2] * A[2] movq 16(%rsi), %rax mulq %rax - addq %rcx, %r11 - adcq %rax, %r12 + addq %r8, %r12 + adcq %rax, %r13 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[3] * A[3] movq 24(%rsi), %rax mulq %rax - addq %rax, %r14 - adcq %rdx, %r15 - addq %rcx, %r13 - adcq $0x00, %r14 - adcq $0x00, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + addq %rax, %r15 + adcq %rdx, %rbx + addq %r8, %r14 + adcq $0x00, %r15 + adcq $0x00, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 + adcq %r15, %r12 + # Store + movq %rdi, %rsi + subq $32, %rdi + # Add-Sub + # Add + movq %r9, %r13 + addq (%rsi), %r9 + movq %r10, %r14 + adcq 8(%rsi), %r10 + movq %r11, %r15 + adcq 16(%rsi), %r11 + movq %r12, %rbx + adcq 24(%rsi), %r12 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r12, %rax + movq $0x7fffffffffffffff, %rdx + imulq $19, %rax + andq %rdx, %r12 + # Sub modulus (if overflow) + addq %rax, %r9 adcq $0x00, %r10 adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 + adcq $0x00, %r12 + # Sub + subq (%rsi), %r13 + sbbq 8(%rsi), %r14 + sbbq 16(%rsi), %r15 + sbbq 24(%rsi), %rbx + sbbq %rax, %rax + shldq $0x01, %rbx, %rax + imulq $-19, %rax + andq %rdx, %rbx + # Add modulus (if underflow) + subq %rax, %r13 + sbbq $0x00, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + movq %r13, (%rsi) + movq %r14, 8(%rsi) + movq %r15, 16(%rsi) + movq %rbx, 24(%rsi) + movq 8(%rsp), %rcx + movq %rcx, %rsi + addq $32, %rsi + subq $32, %rdi + # Add + movq (%rsi), %r9 + movq 8(%rsi), %r10 + addq (%rcx), %r9 + movq 16(%rsi), %r11 + adcq 8(%rcx), %r10 + movq 24(%rsi), %r12 + adcq 16(%rcx), %r11 + adcq 24(%rcx), %r12 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r12, %rax + movq $0x7fffffffffffffff, %rdx + imulq $19, %rax + andq %rdx, %r12 + # Sub modulus (if overflow) + addq %rax, %r9 adcq $0x00, %r10 adcq $0x00, %r11 - # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - movq 128(%rsp), %rsi - # Square * 2 + adcq $0x00, %r12 + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + # Square # A[0] * A[1] - movq (%rsi), %rax - mulq 8(%rsi) - movq %rax, %r9 - movq %rdx, %r10 + movq (%rdi), %rax + mulq 8(%rdi) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * A[2] - movq (%rsi), %rax - mulq 16(%rsi) - xorq %r11, %r11 - addq %rax, %r10 - adcq %rdx, %r11 - # A[0] * A[3] - movq (%rsi), %rax - mulq 24(%rsi) + movq (%rdi), %rax + mulq 16(%rdi) xorq %r12, %r12 addq %rax, %r11 adcq %rdx, %r12 - # A[1] * A[2] - movq 8(%rsi), %rax - mulq 16(%rsi) + # A[0] * A[3] + movq (%rdi), %rax + mulq 24(%rdi) xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * A[3] - movq 8(%rsi), %rax - mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 - # A[2] * A[3] - movq 16(%rsi), %rax - mulq 24(%rsi) + # A[1] * A[2] + movq 8(%rdi), %rax + mulq 16(%rdi) xorq %r14, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[1] * A[3] + movq 8(%rdi), %rax + mulq 24(%rdi) addq %rax, %r13 adcq %rdx, %r14 - # Double + # A[2] * A[3] + movq 16(%rdi), %rax + mulq 24(%rdi) xorq %r15, %r15 - addq %r9, %r9 - adcq %r10, %r10 + addq %rax, %r14 + adcq %rdx, %r15 + # Double + xorq %rbx, %rbx + addq %r10, %r10 adcq %r11, %r11 adcq %r12, %r12 adcq %r13, %r13 adcq %r14, %r14 - adcq $0x00, %r15 + adcq %r15, %r15 + adcq $0x00, %rbx # A[0] * A[0] - movq (%rsi), %rax + movq (%rdi), %rax mulq %rax - movq %rax, %r8 - movq %rdx, %rcx + movq %rax, %r9 + movq %rdx, %r8 # A[1] * A[1] - movq 8(%rsi), %rax + movq 8(%rdi), %rax mulq %rax - addq %rcx, %r9 - adcq %rax, %r10 + addq %r8, %r10 + adcq %rax, %r11 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[2] * A[2] - movq 16(%rsi), %rax + movq 16(%rdi), %rax mulq %rax - addq %rcx, %r11 - adcq %rax, %r12 + addq %r8, %r12 + adcq %rax, %r13 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[3] * A[3] - movq 24(%rsi), %rax + movq 24(%rdi), %rax mulq %rax - addq %rax, %r14 - adcq %rdx, %r15 - addq %rcx, %r13 - adcq $0x00, %r14 - adcq $0x00, %r15 - # Reduce - movq $0x7fffffffffffffff, %rbx - xorq %rax, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $3, %r15, %rax - shldq $2, %r14, %r15 - shldq $2, %r13, %r14 - shldq $2, %r12, %r13 - shldq $2, %r11, %r12 - shldq $0x01, %r10, %r11 - shldq $0x01, %r9, %r10 - shldq $0x01, %r8, %r9 - shlq $0x01, %r8 - andq %rbx, %r11 - # Two out left, one in right - andq %rbx, %r15 - # Multiply top bits by 19*19 - imulq $0x169, %rax, %rcx - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + addq %rax, %r15 + adcq %rdx, %rbx + addq %r8, %r14 + adcq $0x00, %r15 + adcq $0x00, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining produce results in - addq %rcx, %r8 - adcq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rbx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 32(%rsp), %rsi - movq 40(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %rdi, %rsi + addq $32, %rsi + # Sub + subq (%rsi), %r9 + sbbq 8(%rsi), %r10 + sbbq 16(%rsi), %r11 + sbbq 24(%rsi), %r12 + sbbq %rax, %rax + shldq $0x01, %r12, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - leaq 48(%rsp), %rdi - movq 8(%rsp), %rsi - # Square + imulq $-19, %rax + andq %rdx, %r12 + # Add modulus (if underflow) + subq %rax, %r9 + sbbq $0x00, %r10 + sbbq $0x00, %r11 + sbbq $0x00, %r12 + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $0x40, %rcx + # Square * 2 # A[0] * A[1] - movq (%rsi), %rax - mulq 8(%rsi) - movq %rax, %r9 - movq %rdx, %r10 + movq (%rcx), %rax + mulq 8(%rcx) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * A[2] - movq (%rsi), %rax - mulq 16(%rsi) - xorq %r11, %r11 - addq %rax, %r10 - adcq %rdx, %r11 - # A[0] * A[3] - movq (%rsi), %rax - mulq 24(%rsi) + movq (%rcx), %rax + mulq 16(%rcx) xorq %r12, %r12 addq %rax, %r11 adcq %rdx, %r12 - # A[1] * A[2] - movq 8(%rsi), %rax - mulq 16(%rsi) + # A[0] * A[3] + movq (%rcx), %rax + mulq 24(%rcx) xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * A[3] - movq 8(%rsi), %rax - mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 - # A[2] * A[3] - movq 16(%rsi), %rax - mulq 24(%rsi) + # A[1] * A[2] + movq 8(%rcx), %rax + mulq 16(%rcx) xorq %r14, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[1] * A[3] + movq 8(%rcx), %rax + mulq 24(%rcx) addq %rax, %r13 adcq %rdx, %r14 - # Double + # A[2] * A[3] + movq 16(%rcx), %rax + mulq 24(%rcx) xorq %r15, %r15 - addq %r9, %r9 - adcq %r10, %r10 + addq %rax, %r14 + adcq %rdx, %r15 + # Double + xorq %rbx, %rbx + addq %r10, %r10 adcq %r11, %r11 adcq %r12, %r12 adcq %r13, %r13 adcq %r14, %r14 - adcq $0x00, %r15 + adcq %r15, %r15 + adcq $0x00, %rbx # A[0] * A[0] - movq (%rsi), %rax + movq (%rcx), %rax mulq %rax - movq %rax, %r8 - movq %rdx, %rcx + movq %rax, %r9 + movq %rdx, %r8 # A[1] * A[1] - movq 8(%rsi), %rax + movq 8(%rcx), %rax mulq %rax - addq %rcx, %r9 - adcq %rax, %r10 + addq %r8, %r10 + adcq %rax, %r11 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[2] * A[2] - movq 16(%rsi), %rax + movq 16(%rcx), %rax mulq %rax - addq %rcx, %r11 - adcq %rax, %r12 + addq %r8, %r12 + adcq %rax, %r13 adcq $0x00, %rdx - movq %rdx, %rcx + movq %rdx, %r8 # A[3] * A[3] - movq 24(%rsi), %rax + movq 24(%rcx), %rax mulq %rax - addq %rax, %r14 - adcq %rdx, %r15 - addq %rcx, %r13 - adcq $0x00, %r14 - adcq $0x00, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 + addq %rax, %r15 + adcq %rdx, %rbx + addq %r8, %r14 + adcq $0x00, %r15 + adcq $0x00, %rbx + movq $38, %rax + mulq %rbx + addq %rax, %r12 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rdx + imulq $19, %rdx, %rdx + andq %r8, %r12 + movq %rdx, %r8 + movq $38, %rax mulq %r13 xorq %r13, %r13 addq %rax, %r9 - movq $19, %rax + movq $38, %rax adcq %rdx, %r13 mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 + xorq %r15, %r15 + addq %rax, %r11 + adcq %rdx, %r15 + addq %r8, %r9 adcq %r13, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 + adcq %r15, %r12 + movq %r12, %rax + shldq $0x01, %r11, %r12 + shldq $0x01, %r10, %r11 + shldq $0x01, %r9, %r10 + shlq $0x01, %r9 + movq $0x7fffffffffffffff, %r8 + shrq $62, %rax + andq %r8, %r12 + imulq $19, %rax, %rax + addq %rax, %r9 adcq $0x00, %r10 adcq $0x00, %r11 + adcq $0x00, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 16(%rsp), %rsi - movq (%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx - movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq 16(%rsp), %rsi - movq (%rsp), %rbx - # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - leaq 48(%rsp), %rsi - movq 8(%rsp), %rbx - # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - movq 24(%rsp), %rsi - movq 16(%rsp), %rbx + movq %rdi, %rsi + addq $0x40, %rsi + addq $0x60, %rdi # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 + subq (%rsi), %r9 + sbbq 8(%rsi), %r10 + sbbq 16(%rsi), %r11 + sbbq 24(%rsi), %r12 + sbbq %rax, %rax + shldq $0x01, %r12, %rax movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $-19, %rax + andq %rdx, %r12 # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $0x50, %rsp + subq %rax, %r9 + sbbq $0x00, %r10 + sbbq $0x00, %r11 + sbbq $0x00, %r12 + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $16, %rsp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_dbl_x64,.-fe_ge_dbl_x64 +.size ge_p2_dbl_x64,.-ge_p2_dbl_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_madd_x64 -.type fe_ge_madd_x64,@function +.globl ge_madd_x64 +.type ge_madd_x64,@function .align 16 -fe_ge_madd_x64: +ge_madd_x64: #else .section __TEXT,__text -.globl _fe_ge_madd_x64 +.globl _ge_madd_x64 .p2align 4 -_fe_ge_madd_x64: +_ge_madd_x64: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $0x50, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rcx + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq (%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %rcx, 16(%rsp) + movq %rsi, %r8 + movq %rsi, %rcx + addq $32, %rcx + movq %rdi, %rsi + addq $32, %rsi + # Add-Sub + # Add + movq (%rcx), %r10 + movq 8(%rcx), %r11 + movq 16(%rcx), %r12 + movq 24(%rcx), %r13 + movq %r10, %r14 + addq (%r8), %r10 + movq %r11, %r15 + adcq 8(%r8), %r11 + movq %r12, %rbx + adcq 16(%r8), %r12 + movq %r13, %rbp + adcq 24(%r8), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%r8), %r14 + sbbq 8(%r8), %r15 + sbbq 16(%r8), %rbx + sbbq 24(%r8), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq (%rsp), %rsi - movq 152(%rsp), %rbx + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rcx + addq $32, %rcx # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 + xorq %r12, %r12 + addq %rax, %r11 + adcq %rdx, %r12 # A[1] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 + xorq %r13, %r13 + addq %rax, %r11 + adcq %rdx, %r12 + adcq $0x00, %r13 # A[0] * B[2] - movq 16(%rbx), %rax + movq 16(%rcx), %rax mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 + addq %rax, %r12 + adcq %rdx, %r13 # A[1] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq 8(%rsi) - xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 + xorq %r14, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 # A[2] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 # A[0] * B[3] - movq 24(%rbx), %rax + movq 24(%rcx), %rax mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 + xorq %r15, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 # A[1] * B[2] - movq 16(%rbx), %rax + movq 16(%rcx), %rax mulq 8(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 # A[2] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq 16(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 # A[3] * B[0] - movq (%rbx), %rax + movq (%rcx), %rax mulq 24(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 # A[1] * B[3] - movq 24(%rbx), %rax + movq 24(%rcx), %rax mulq 8(%rsi) - xorq %r14, %r14 - addq %rax, %r12 - adcq %rdx, %r13 - adcq $0x00, %r14 + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx # A[2] * B[2] - movq 16(%rbx), %rax + movq 16(%rcx), %rax mulq 16(%rsi) - addq %rax, %r12 - adcq %rdx, %r13 - adcq $0x00, %r14 + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx # A[3] * B[1] - movq 8(%rbx), %rax + movq 8(%rcx), %rax mulq 24(%rsi) - addq %rax, %r12 - adcq %rdx, %r13 - adcq $0x00, %r14 + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx # A[2] * B[3] - movq 24(%rbx), %rax + movq 24(%rcx), %rax mulq 16(%rsi) - xorq %r15, %r15 - addq %rax, %r13 - adcq %rdx, %r14 - adcq $0x00, %r15 + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp # A[3] * B[2] - movq 16(%rbx), %rax + movq 16(%rcx), %rax mulq 24(%rsi) - addq %rax, %r13 - adcq %rdx, %r14 - adcq $0x00, %r15 + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp # A[3] * B[3] - movq 24(%rbx), %rax + movq 24(%rcx), %rax mulq 24(%rsi) - addq %rax, %r14 - adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 8(%rsp), %rsi - movq 160(%rsp), %rbx + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + addq $0x60, %r8 + addq $32, %rcx + addq $0x60, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%r8) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%r8) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%r8) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%r8) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%r8) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%r8) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%r8) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%r8) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%r8) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%r8) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%r8) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - movq 144(%rsp), %rsi - movq 136(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + subq $0x40, %rcx + subq $0x60, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%rdi) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%rdi) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%rdi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%rdi) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%rdi) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%rdi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rdi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rdi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rdi) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rdi) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rdi) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - leaq 48(%rsp), %rdi - movq 128(%rsp), %rsi - movq 128(%rsp), %rbx + # Add-Sub # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + subq $32, %r8 + # Double + movq (%r8), %r10 + movq 8(%r8), %r11 + addq %r10, %r10 + movq 16(%r8), %r12 + adcq %r11, %r11 + movq 24(%r8), %r13 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + movq %rdi, %rsi + addq $0x60, %rsi + addq $0x40, %rdi + # Add-Sub # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $0x50, %rsp + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + addq $24, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_madd_x64,.-fe_ge_madd_x64 +.size ge_madd_x64,.-ge_madd_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_msub_x64 -.type fe_ge_msub_x64,@function +.globl ge_msub_x64 +.type ge_msub_x64,@function .align 16 -fe_ge_msub_x64: +ge_msub_x64: #else .section __TEXT,__text -.globl _fe_ge_msub_x64 +.globl _ge_msub_x64 .p2align 4 -_fe_ge_msub_x64: +_ge_msub_x64: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $0x50, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rcx + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq (%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %rcx, 16(%rsp) + movq %rsi, %r8 + movq %rsi, %rcx + addq $32, %rcx + movq %rdi, %rsi + addq $32, %rsi + # Add-Sub + # Add + movq (%rcx), %r10 + movq 8(%rcx), %r11 + movq 16(%rcx), %r12 + movq 24(%rcx), %r13 + movq %r10, %r14 + addq (%r8), %r10 + movq %r11, %r15 + adcq 8(%r8), %r11 + movq %r12, %rbx + adcq 16(%r8), %r12 + movq %r13, %rbp + adcq 24(%r8), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%r8), %r14 + sbbq 8(%r8), %r15 + sbbq 16(%r8), %rbx + sbbq 24(%r8), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq (%rsp), %rsi - movq 160(%rsp), %rbx + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rcx + addq $32, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%rdi) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%rdi) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%rdi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%rdi) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%rdi) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%rdi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rdi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rdi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rdi) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rdi) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rdi) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 8(%rsp), %rsi - movq 152(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + addq $0x60, %r8 + addq $0x40, %rcx + addq $0x40, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%r8) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%r8) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%r8) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%r8) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%r8) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%r8) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%r8) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%r8) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%r8) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%r8) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%r8) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - movq 144(%rsp), %rsi - movq 136(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + subq $32, %rcx + subq $0x60, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%rdi) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%rdi) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%rdi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%rdi) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%rdi) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%rdi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rdi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rdi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rdi) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rdi) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rdi) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - leaq 48(%rsp), %rdi - movq 128(%rsp), %rsi - movq 128(%rsp), %rbx + # Add-Sub # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + subq $32, %r8 + addq $0x40, %rdi + # Double + movq (%r8), %r10 + movq 8(%r8), %r11 + addq %r10, %r10 + movq 16(%r8), %r12 + adcq %r11, %r11 + movq 24(%r8), %r13 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx - # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + movq %rdi, %rsi + addq $32, %rsi + # Add-Sub # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $0x50, %rsp + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp + # Add modulus (if underflow) + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + addq $24, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_msub_x64,.-fe_ge_msub_x64 +.size ge_msub_x64,.-ge_msub_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_add_x64 -.type fe_ge_add_x64,@function +.globl ge_add_x64 +.type ge_add_x64,@function .align 16 -fe_ge_add_x64: +ge_add_x64: #else .section __TEXT,__text -.globl _fe_ge_add_x64 +.globl _ge_add_x64 .p2align 4 -_fe_ge_add_x64: +_ge_add_x64: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $0x50, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rcx + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq (%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %rcx, 16(%rsp) + movq %rsi, %r8 + movq %rsi, %rcx + addq $32, %rcx + movq %rdi, %rsi + addq $32, %rsi + # Add-Sub + # Add + movq (%rcx), %r10 + movq 8(%rcx), %r11 + movq 16(%rcx), %r12 + movq 24(%rcx), %r13 + movq %r10, %r14 + addq (%r8), %r10 + movq %r11, %r15 + adcq 8(%r8), %r11 + movq %r12, %rbx + adcq 16(%r8), %r12 + movq %r13, %rbp + adcq 24(%r8), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%r8), %r14 + sbbq 8(%r8), %r15 + sbbq 16(%r8), %rbx + sbbq 24(%r8), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq (%rsp), %rsi - movq 160(%rsp), %rbx + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rcx + addq $32, %rcx + addq $32, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%rdi) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%rdi) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%rdi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%rdi) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%rdi) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%rdi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rdi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rdi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rdi) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rdi) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rdi) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 8(%rsp), %rsi - movq 168(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + addq $0x60, %r8 + addq $0x40, %rcx + addq $0x40, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%r8) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%r8) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%r8) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%r8) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%r8) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%r8) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%r8) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%r8) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%r8) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%r8) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%r8) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - movq 152(%rsp), %rsi - movq 136(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + subq $0x60, %rcx + subq $0x60, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 - # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq (%rcx), %rax + mulq (%rdi) + movq %rax, %r10 + movq %rdx, %r11 + # A[0] * B[1] + movq 8(%rcx), %rax + mulq (%rdi) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%rdi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%rdi) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%rdi) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%rdi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rdi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rdi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rdi) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rdi) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rdi) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 128(%rsp), %rsi - movq 144(%rsp), %rbx + # Add-Sub + # Add + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax + movq $0x7fffffffffffffff, %rdx + imulq $19, %rax + andq %rdx, %r13 + # Sub modulus (if overflow) + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp + # Add modulus (if underflow) + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + subq $32, %r8 + addq $0x40, %rcx # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%r8) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%r8) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%r8) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%r8) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%r8) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%r8) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%r8) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%r8) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%r8) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%r8) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%r8) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - leaq 48(%rsp), %rdi - movq (%rsp), %rsi - movq (%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx - movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx - # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + addq $0x40, %rdi + # Double + addq %r10, %r10 + adcq %r11, %r11 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + movq %rdi, %rsi + addq $32, %rsi + # Add-Sub # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $0x50, %rsp + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + addq $24, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_add_x64,.-fe_ge_add_x64 +.size ge_add_x64,.-ge_add_x64 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_sub_x64 -.type fe_ge_sub_x64,@function +.globl ge_sub_x64 +.type ge_sub_x64,@function .align 16 -fe_ge_sub_x64: +ge_sub_x64: #else .section __TEXT,__text -.globl _fe_ge_sub_x64 +.globl _ge_sub_x64 .p2align 4 -_fe_ge_sub_x64: +_ge_sub_x64: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $0x50, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rcx + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq (%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx + movq %rcx, 16(%rsp) + movq %rsi, %r8 + movq %rsi, %rcx + addq $32, %rcx + movq %rdi, %rsi + addq $32, %rsi + # Add-Sub + # Add + movq (%rcx), %r10 + movq 8(%rcx), %r11 + movq 16(%rcx), %r12 + movq 24(%rcx), %r13 + movq %r10, %r14 + addq (%r8), %r10 + movq %r11, %r15 + adcq 8(%r8), %r11 + movq %r12, %rbx + adcq 16(%r8), %r12 + movq %r13, %rbp + adcq 24(%r8), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + imulq $19, %rax + andq %rdx, %r13 # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 40(%rsp), %rsi - movq 32(%rsp), %rbx + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 - movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx + subq (%r8), %r14 + sbbq 8(%r8), %r15 + sbbq 16(%r8), %rbx + sbbq 24(%r8), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq (%rsp), %rsi - movq 168(%rsp), %rbx + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rcx + addq $32, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%rdi) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%rdi) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%rdi) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%rdi) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%rdi) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%rdi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rdi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%rdi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rdi) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rdi) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rdi) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 8(%rsp), %rsi - movq 160(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + addq $0x60, %r8 + addq $0x60, %rcx + addq $0x40, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%r8) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%r8) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) - xorq %r13, %r13 - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) - addq %rax, %r11 - adcq %rdx, %r12 - adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%r8) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%r8) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%r8) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%r8) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%r8) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%r8) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%r8) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%r8) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%r8) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - movq 152(%rsp), %rsi - movq 136(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + subq $0x40, %rcx + subq $0x60, %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rax - mulq (%rsi) - movq %rax, %r8 - movq %rdx, %r9 + movq (%rcx), %rax + mulq (%rdi) + movq %rax, %r10 + movq %rdx, %r11 # A[0] * B[1] - movq 8(%rbx), %rax - mulq (%rsi) - xorq %r10, %r10 - addq %rax, %r9 - adcq %rdx, %r10 - # A[1] * B[0] - movq (%rbx), %rax - mulq 8(%rsi) - xorq %r11, %r11 - addq %rax, %r9 - adcq %rdx, %r10 - adcq $0x00, %r11 - # A[0] * B[2] - movq 16(%rbx), %rax - mulq (%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - # A[1] * B[1] - movq 8(%rbx), %rax - mulq 8(%rsi) + movq 8(%rcx), %rax + mulq (%rdi) xorq %r12, %r12 - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[2] * B[0] - movq (%rbx), %rax - mulq 16(%rsi) - addq %rax, %r10 - adcq %rdx, %r11 - adcq $0x00, %r12 - # A[0] * B[3] - movq 24(%rbx), %rax - mulq (%rsi) + addq %rax, %r11 + adcq %rdx, %r12 + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%rdi) xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%rdi) + addq %rax, %r12 + adcq %rdx, %r13 + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%rdi) + xorq %r14, %r14 + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%rdi) + addq %rax, %r12 + adcq %rdx, %r13 + adcq $0x00, %r14 + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%rdi) + xorq %r15, %r15 + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 # A[1] * B[2] - movq 16(%rbx), %rax - mulq 8(%rsi) + movq 16(%rcx), %rax + mulq 8(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%rdi) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%rdi) + xorq %rbx, %rbx + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%rdi) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%rdi) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%rdi) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax + mulq %r14 + xorq %r14, %r14 + addq %rax, %r10 + movq $38, %rax + adcq %rdx, %r14 + mulq %r15 + xorq %r15, %r15 addq %rax, %r11 - adcq %rdx, %r12 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 + adcq %r14, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 + # Store + # Add-Sub + # Add + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax + movq $0x7fffffffffffffff, %rdx + imulq $19, %rax + andq %rdx, %r13 + # Sub modulus (if overflow) + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 adcq $0x00, %r13 - # A[2] * B[1] - movq 8(%rbx), %rax - mulq 16(%rsi) + # Sub + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp + # Add modulus (if underflow) + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + subq $32, %r8 + addq $32, %rcx + # Multiply + # A[0] * B[0] + movq (%rcx), %rax + mulq (%r8) + movq %rax, %r10 + movq %rdx, %r11 + # A[0] * B[1] + movq 8(%rcx), %rax + mulq (%r8) + xorq %r12, %r12 addq %rax, %r11 adcq %rdx, %r12 - adcq $0x00, %r13 - # A[3] * B[0] - movq (%rbx), %rax - mulq 24(%rsi) + # A[1] * B[0] + movq (%rcx), %rax + mulq 8(%r8) + xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 - # A[1] * B[3] - movq 24(%rbx), %rax - mulq 8(%rsi) - xorq %r14, %r14 + # A[0] * B[2] + movq 16(%rcx), %rax + mulq (%r8) addq %rax, %r12 adcq %rdx, %r13 - adcq $0x00, %r14 - # A[2] * B[2] - movq 16(%rbx), %rax - mulq 16(%rsi) + # A[1] * B[1] + movq 8(%rcx), %rax + mulq 8(%r8) + xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[3] * B[1] - movq 8(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[0] + movq (%rcx), %rax + mulq 16(%r8) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 - # A[2] * B[3] - movq 24(%rbx), %rax - mulq 16(%rsi) + # A[0] * B[3] + movq 24(%rcx), %rax + mulq (%r8) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[2] - movq 16(%rbx), %rax - mulq 24(%rsi) + # A[1] * B[2] + movq 16(%rcx), %rax + mulq 8(%r8) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 - # A[3] * B[3] - movq 24(%rbx), %rax - mulq 24(%rsi) + # A[2] * B[1] + movq 8(%rcx), %rax + mulq 16(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[3] * B[0] + movq (%rcx), %rax + mulq 24(%r8) + addq %rax, %r13 + adcq %rdx, %r14 + adcq $0x00, %r15 + # A[1] * B[3] + movq 24(%rcx), %rax + mulq 8(%r8) + xorq %rbx, %rbx addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax - adcq %rdx, %r13 + adcq $0x00, %rbx + # A[2] * B[2] + movq 16(%rcx), %rax + mulq 16(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[3] * B[1] + movq 8(%rcx), %rax + mulq 24(%r8) + addq %rax, %r14 + adcq %rdx, %r15 + adcq $0x00, %rbx + # A[2] * B[3] + movq 24(%rcx), %rax + mulq 16(%r8) + xorq %rbp, %rbp + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[2] + movq 16(%rcx), %rax + mulq 24(%r8) + addq %rax, %r15 + adcq %rdx, %rbx + adcq $0x00, %rbp + # A[3] * B[3] + movq 24(%rcx), %rax + mulq 24(%r8) + addq %rax, %rbx + adcq %rdx, %rbp + movq $38, %rax + mulq %rbp + addq %rax, %r13 + adcq $0x00, %rdx + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %rdx + imulq $19, %rdx, %rdx + andq %r9, %r13 + movq %rdx, %r9 + movq $38, %rax mulq %r14 xorq %r14, %r14 addq %rax, %r10 - movq $19, %rax + movq $38, %rax adcq %rdx, %r14 mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 + xorq %r15, %r15 + addq %rax, %r11 + movq $38, %rax + adcq %rdx, %r15 + mulq %rbx + xorq %rbx, %rbx + addq %rax, %r12 + adcq %rdx, %rbx + addq %r9, %r10 adcq %r14, %r11 + adcq %r15, %r12 + adcq %rbx, %r13 + # Store + # Double + addq %r10, %r10 + adcq %r11, %r11 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax + movq $0x7fffffffffffffff, %rdx + imulq $19, %rax + andq %rdx, %r13 + # Sub modulus (if overflow) + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + movq %rdi, %rsi + addq $0x40, %rsi + addq $0x60, %rdi + # Add-Sub + # Add + movq %r10, %r14 + addq (%rdi), %r10 + movq %r11, %r15 + adcq 8(%rdi), %r11 + movq %r12, %rbx + adcq 16(%rdi), %r12 + movq %r13, %rbp + adcq 24(%rdi), %r13 + movq $0x00, %rax + adcq $0x00, %rax + shldq $0x01, %r13, %rax + movq $0x7fffffffffffffff, %rdx + imulq $19, %rax + andq %rdx, %r13 + # Sub modulus (if overflow) + addq %rax, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rdi), %r14 + sbbq 8(%rdi), %r15 + sbbq 16(%rdi), %rbx + sbbq 24(%rdi), %rbp + sbbq %rax, %rax + shldq $0x01, %rbp, %rax + imulq $-19, %rax + andq %rdx, %rbp + # Add modulus (if underflow) + subq %rax, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + addq $24, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size ge_sub_x64,.-ge_sub_x64 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl sc_reduce_x64 +.type sc_reduce_x64,@function +.align 16 +sc_reduce_x64: +#else +.section __TEXT,__text +.globl _sc_reduce_x64 +.p2align 4 +_sc_reduce_x64: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + movq (%rdi), %r8 + movq 8(%rdi), %r9 + movq 16(%rdi), %r10 + movq 24(%rdi), %r11 + movq 32(%rdi), %r12 + movq 40(%rdi), %r13 + movq 48(%rdi), %r14 + movq 56(%rdi), %r15 + movq %r15, %rcx + movq $0xfffffffffffffff, %rsi + shrq $56, %rcx + shldq $4, %r14, %r15 + shldq $4, %r13, %r14 + shldq $4, %r12, %r13 + shldq $4, %r11, %r12 + andq %rsi, %r11 + andq %rsi, %r15 + # Add order times bits 504..511 + subq %rcx, %r14 + sbbq $0x00, %r15 + movq $0xeb2106215d086329, %rax + mulq %rcx + movq $0x00, %rsi + addq %rax, %r13 + movq $0xa7ed9ce5a30a2c13, %rax + adcq %rdx, %rsi + mulq %rcx + addq %rax, %r12 + adcq %rdx, %r13 + adcq %rsi, %r14 + adcq $0x00, %r15 + # Sub product of top 4 words and order + movq $0xa7ed9ce5a30a2c13, %rcx + movq %r12, %rax + mulq %rcx + movq $0x00, %rbp + addq %rax, %r8 + adcq %rdx, %rbp + movq %r13, %rax + mulq %rcx + movq $0x00, %rsi + addq %rax, %r9 + adcq %rdx, %rsi + movq %r14, %rax + mulq %rcx + addq %rbp, %r9 + adcq %rax, %r10 + adcq %rdx, %r11 + movq $0x00, %rbx + adcq $0x00, %rbx + movq %r15, %rax + mulq %rcx + addq %rsi, %r10 + adcq %rax, %r11 + adcq %rdx, %rbx + movq $0xeb2106215d086329, %rcx + movq %r12, %rax + mulq %rcx + movq $0x00, %rbp + addq %rax, %r9 + adcq %rdx, %rbp + movq %r13, %rax + mulq %rcx + movq $0x00, %rsi + addq %rax, %r10 + adcq %rdx, %rsi + movq %r14, %rax + mulq %rcx + addq %rbp, %r10 adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 + adcq %rdx, %rbx + movq $0x00, %rbp + adcq $0x00, %rbp + movq %r15, %rax + mulq %rcx + addq %rsi, %r11 + adcq %rax, %rbx + adcq %rdx, %rbp + subq %r12, %r10 + movq %rbx, %r12 + sbbq %r13, %r11 + movq %rbp, %r13 + sbbq %r14, %r12 + sbbq %r15, %r13 + movq %r13, %rcx + sarq $57, %rcx + # Conditionally subtract order starting at bit 125 + movq $0xa000000000000000, %rax + movq $0xcb024c634b9eba7d, %rdx + movq $0x29bdf3bd45ef39a, %rbx + movq $0x200000000000000, %rbp + andq %rcx, %rax + andq %rcx, %rdx + andq %rcx, %rbx + andq %rcx, %rbp + addq %rax, %r9 + adcq %rdx, %r10 + adcq %rbx, %r11 + adcq $0x00, %r12 + adcq %rbp, %r13 + # Move bits 252-376 to own registers + movq $0xfffffffffffffff, %rcx + shldq $4, %r12, %r13 + shldq $4, %r11, %r12 + andq %rcx, %r11 + # Sub product of top 2 words and order + # * -5812631a5cf5d3ed + movq $0xa7ed9ce5a30a2c13, %rcx + movq %r12, %rax + mulq %rcx + movq $0x00, %rbx addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 + adcq %rdx, %r9 + adcq $0x00, %rbx + movq %r13, %rax + mulq %rcx + addq %rax, %r9 + adcq %rdx, %rbx + # * -14def9dea2f79cd7 + movq $0xeb2106215d086329, %rcx + movq %r12, %rax + mulq %rcx + movq $0x00, %rbp + addq %rax, %r9 + adcq %rdx, %r10 + adcq $0x00, %rbp + movq %r13, %rax + mulq %rcx + addq %rax, %r10 + adcq %rdx, %rbp + # Add overflows at 2 * 64 + movq $0xfffffffffffffff, %rsi + andq %rsi, %r11 + addq %rbx, %r10 + adcq %rbp, %r11 + # Subtract top at 2 * 64 + subq %r12, %r10 + sbbq %r13, %r11 + sbbq %rsi, %rsi + # Conditional sub order + movq $0x5812631a5cf5d3ed, %rax + movq $0x14def9dea2f79cd6, %rdx + movq $0x1000000000000000, %rbx + andq %rsi, %rax + andq %rsi, %rdx + andq %rsi, %rbx + addq %rax, %r8 + movq $0xfffffffffffffff, %rax + adcq %rdx, %r9 adcq $0x00, %r10 - adcq $0x00, %r11 - # Store + adcq %rbx, %r11 + andq %rax, %r11 + # Store result movq %r8, (%rdi) movq %r9, 8(%rdi) movq %r10, 16(%rdi) movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 128(%rsp), %rsi - movq 144(%rsp), %rbx + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size sc_reduce_x64,.-sc_reduce_x64 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl sc_muladd_x64 +.type sc_muladd_x64,@function +.align 16 +sc_muladd_x64: +#else +.section __TEXT,__text +.globl _sc_muladd_x64 +.p2align 4 +_sc_muladd_x64: +#endif /* __APPLE__ */ + pushq %rbp + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + movq %rdx, %rbp # Multiply # A[0] * B[0] - movq (%rbx), %rax + movq (%rbp), %rax mulq (%rsi) movq %rax, %r8 movq %rdx, %r9 # A[0] * B[1] - movq 8(%rbx), %rax + movq 8(%rbp), %rax mulq (%rsi) xorq %r10, %r10 addq %rax, %r9 adcq %rdx, %r10 # A[1] * B[0] - movq (%rbx), %rax + movq (%rbp), %rax mulq 8(%rsi) xorq %r11, %r11 addq %rax, %r9 adcq %rdx, %r10 adcq $0x00, %r11 # A[0] * B[2] - movq 16(%rbx), %rax + movq 16(%rbp), %rax mulq (%rsi) addq %rax, %r10 adcq %rdx, %r11 # A[1] * B[1] - movq 8(%rbx), %rax + movq 8(%rbp), %rax mulq 8(%rsi) xorq %r12, %r12 addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[2] * B[0] - movq (%rbx), %rax + movq (%rbp), %rax mulq 16(%rsi) addq %rax, %r10 adcq %rdx, %r11 adcq $0x00, %r12 # A[0] * B[3] - movq 24(%rbx), %rax + movq 24(%rbp), %rax mulq (%rsi) xorq %r13, %r13 addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[2] - movq 16(%rbx), %rax + movq 16(%rbp), %rax mulq 8(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[2] * B[1] - movq 8(%rbx), %rax + movq 8(%rbp), %rax mulq 16(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[3] * B[0] - movq (%rbx), %rax + movq (%rbp), %rax mulq 24(%rsi) addq %rax, %r11 adcq %rdx, %r12 adcq $0x00, %r13 # A[1] * B[3] - movq 24(%rbx), %rax + movq 24(%rbp), %rax mulq 8(%rsi) xorq %r14, %r14 addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[2] - movq 16(%rbx), %rax + movq 16(%rbp), %rax mulq 16(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[3] * B[1] - movq 8(%rbx), %rax + movq 8(%rbp), %rax mulq 24(%rsi) addq %rax, %r12 adcq %rdx, %r13 adcq $0x00, %r14 # A[2] * B[3] - movq 24(%rbx), %rax + movq 24(%rbp), %rax mulq 16(%rsi) xorq %r15, %r15 addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[2] - movq 16(%rbx), %rax + movq 16(%rbp), %rax mulq 24(%rsi) addq %rax, %r13 adcq %rdx, %r14 adcq $0x00, %r15 # A[3] * B[3] - movq 24(%rbx), %rax + movq 24(%rbp), %rax mulq 24(%rsi) addq %rax, %r14 adcq %rdx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rax - mulq %r12 - xorq %r12, %r12 - addq %rax, %r8 - movq $19, %rax - adcq %rdx, %r12 - mulq %r13 - xorq %r13, %r13 - addq %rax, %r9 - movq $19, %rax + # Add c to a * b + addq (%rcx), %r8 + adcq 8(%rcx), %r9 + adcq 16(%rcx), %r10 + adcq 24(%rcx), %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + movq %r15, %rbx + movq $0xfffffffffffffff, %rcx + shrq $56, %rbx + shldq $4, %r14, %r15 + shldq $4, %r13, %r14 + shldq $4, %r12, %r13 + shldq $4, %r11, %r12 + andq %rcx, %r11 + andq %rcx, %r15 + # Add order times bits 504..507 + subq %rbx, %r14 + sbbq $0x00, %r15 + movq $0xeb2106215d086329, %rax + mulq %rbx + movq $0x00, %rcx + addq %rax, %r13 + movq $0xa7ed9ce5a30a2c13, %rax + adcq %rdx, %rcx + mulq %rbx + addq %rax, %r12 adcq %rdx, %r13 - mulq %r14 - xorq %r14, %r14 - addq %rax, %r10 - movq $19, %rax - adcq %rdx, %r14 - mulq %r15 - # Add remaining product results in - addq %r12, %r9 - adcq %r13, %r10 - adcq %r14, %r11 - adcq %rax, %r11 - adcq $0x00, %rdx - # Overflow - shldq $0x01, %r11, %rdx - imulq $19, %rdx, %rax - andq %rcx, %r11 + adcq %rcx, %r14 + adcq $0x00, %r15 + # Sub product of top 4 words and order + movq $0xa7ed9ce5a30a2c13, %rbx + movq %r12, %rax + mulq %rbx + movq $0x00, %rbp addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - leaq 48(%rsp), %rdi - movq (%rsp), %rsi - movq (%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx - movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx - # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 + adcq %rdx, %rbp + movq %r13, %rax + mulq %rbx movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Add modulus (if underflow) - addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 + addq %rax, %r9 + adcq %rdx, %rcx + movq %r14, %rax + mulq %rbx + addq %rbp, %r9 + adcq %rax, %r10 adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 16(%rsp), %rsi - movq 8(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx - movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx - # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rbx), %r8 + movq $0x00, %rsi + adcq $0x00, %rsi + movq %r15, %rax + mulq %rbx + addq %rcx, %r10 + adcq %rax, %r11 + adcq %rdx, %rsi + movq $0xeb2106215d086329, %rbx + movq %r12, %rax + mulq %rbx + movq $0x00, %rbp + addq %rax, %r9 + adcq %rdx, %rbp + movq %r13, %rax + mulq %rbx movq $0x00, %rcx - sbbq 8(%rbx), %r9 - movq $-19, %rax - sbbq 16(%rbx), %r10 - movq $0x7fffffffffffffff, %rdx - sbbq 24(%rbx), %r11 - sbbq $0x00, %rcx - # Mask the modulus - andq %rcx, %rax - andq %rcx, %rdx - # Add modulus (if underflow) + addq %rax, %r10 + adcq %rdx, %rcx + movq %r14, %rax + mulq %rbx + addq %rbp, %r10 + adcq %rax, %r11 + adcq %rdx, %rsi + movq $0x00, %rbp + adcq $0x00, %rbp + movq %r15, %rax + mulq %rbx + addq %rcx, %r11 + adcq %rax, %rsi + adcq %rdx, %rbp + subq %r12, %r10 + movq %rsi, %r12 + sbbq %r13, %r11 + movq %rbp, %r13 + sbbq %r14, %r12 + sbbq %r15, %r13 + movq %r13, %rbx + sarq $57, %rbx + # Conditionally subtract order starting at bit 125 + movq $0xa000000000000000, %rax + movq $0xcb024c634b9eba7d, %rdx + movq $0x29bdf3bd45ef39a, %rsi + movq $0x200000000000000, %rbp + andq %rbx, %rax + andq %rbx, %rdx + andq %rbx, %rsi + andq %rbx, %rbp + addq %rax, %r9 + adcq %rdx, %r10 + adcq %rsi, %r11 + adcq $0x00, %r12 + adcq %rbp, %r13 + # Move bits 252-376 to own registers + movq $0xfffffffffffffff, %rbx + shldq $4, %r12, %r13 + shldq $4, %r11, %r12 + andq %rbx, %r11 + # Sub product of top 2 words and order + # * -5812631a5cf5d3ed + movq $0xa7ed9ce5a30a2c13, %rbx + movq %r12, %rax + mulq %rbx + movq $0x00, %rsi addq %rax, %r8 - adcq %rcx, %r9 - adcq %rcx, %r10 - adcq %rdx, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rdi - leaq 48(%rsp), %rsi - movq 24(%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rcx - adcq 16(%rbx), %r10 - movq $-19, %rax - adcq 24(%rbx), %rcx - movq $0x7fffffffffffffff, %rdx - movq %rcx, %r11 - sarq $63, %rcx - # Mask the modulus + adcq %rdx, %r9 + adcq $0x00, %rsi + movq %r13, %rax + mulq %rbx + addq %rax, %r9 + adcq %rdx, %rsi + # * -14def9dea2f79cd7 + movq $0xeb2106215d086329, %rbx + movq %r12, %rax + mulq %rbx + movq $0x00, %rbp + addq %rax, %r9 + adcq %rdx, %r10 + adcq $0x00, %rbp + movq %r13, %rax + mulq %rbx + addq %rax, %r10 + adcq %rdx, %rbp + # Add overflows at 2 * 64 + movq $0xfffffffffffffff, %rcx + andq %rcx, %r11 + addq %rsi, %r10 + adcq %rbp, %r11 + # Subtract top at 2 * 64 + subq %r12, %r10 + sbbq %r13, %r11 + sbbq %rcx, %rcx + # Conditional sub order + movq $0x5812631a5cf5d3ed, %rax + movq $0x14def9dea2f79cd6, %rdx + movq $0x1000000000000000, %rsi andq %rcx, %rax andq %rcx, %rdx - # Sub modulus (if overflow) - subq %rax, %r8 - sbbq %rcx, %r9 - sbbq %rcx, %r10 - sbbq %rdx, %r11 + andq %rcx, %rsi + addq %rax, %r8 + movq $0xfffffffffffffff, %rax + adcq %rdx, %r9 + adcq $0x00, %r10 + adcq %rsi, %r11 + andq %rax, %r11 + # Store result movq %r8, (%rdi) movq %r9, 8(%rdi) movq %r10, 16(%rdi) movq %r11, 24(%rdi) - addq $0x50, %rsp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx + popq %rbp repz retq #ifndef __APPLE__ -.size fe_ge_sub_x64,.-fe_ge_sub_x64 +.size sc_muladd_x64,.-sc_muladd_x64 #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ #ifdef HAVE_INTEL_AVX2 #ifndef __APPLE__ .text @@ -9575,12 +9124,11 @@ mulxq 8(%rsi), %rax, %rcx xorq %r15, %r15 adcxq %rax, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 + # A[3] * B[1] + movq 8(%rbx), %rdx + mulxq 24(%rsi), %r12, %r13 adcxq %rcx, %r10 # A[0] * B[1] - movq 8(%rbx), %rdx mulxq (%rsi), %rax, %rcx adoxq %rax, %r9 # A[2] * B[1] @@ -9604,10 +9152,10 @@ mulxq 8(%rsi), %rdx, %rax adcxq %rcx, %r11 adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx + # A[1] * B[3] + movq 24(%rbx), %rdx adoxq %rax, %r11 - mulxq 24(%rsi), %rax, %rcx + mulxq 8(%rsi), %rax, %rcx adcxq %rax, %r12 # A[2] * B[2] movq 16(%rbx), %rdx @@ -9626,34 +9174,33 @@ xorq %rcx, %rcx adcxq %rdx, %r11 # A[3] * B[0] - movq (%rbx), %rdx + movq 24(%rsi), %rdx adcxq %rax, %r12 - mulxq 24(%rsi), %rdx, %rax + mulxq (%rbx), %rdx, %rax adoxq %rdx, %r11 adoxq %rax, %r12 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rbx), %rdx, %rax + adcxq %rdx, %r13 # A[2] * B[3] movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rax - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rbx), %rdx adcxq %rax, %r14 - mulxq 24(%rsi), %rax, %rdx + mulxq 16(%rsi), %rax, %rdx adcxq %rcx, %r15 adoxq %rax, %r13 adoxq %rdx, %r14 adoxq %rcx, %r15 - # Reduce + movq $38, %rdx + mulxq %r15, %r15, %rax + addq %r15, %r11 + adcq $0x00, %rax movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rax + imulq $19, %rax, %rax andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rdx xorq %rcx, %rcx + adoxq %rax, %r8 mulxq %r12, %rax, %r12 adcxq %rax, %r8 adoxq %r12, %r9 @@ -9663,20 +9210,8 @@ mulxq %r14, %rax, %r14 adcxq %rax, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r11, %rdx + adcxq %rcx, %r11 movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set movq %r11, %rdx sarq $63, %rdx andq $19, %rdx @@ -9717,93 +9252,81 @@ pushq %r14 pushq %r15 # Square - # A[0] * A[1] movq (%rsi), %rdx - mulxq 8(%rsi), %r9, %r10 + movq 8(%rsi), %rax + # A[0] * A[1] + movq %rdx, %r15 + mulxq %rax, %r9, %r10 # A[0] * A[3] mulxq 24(%rsi), %r11, %r12 # A[2] * A[1] movq 16(%rsi), %rdx - mulxq 8(%rsi), %rcx, %rbx - xorq %r15, %r15 + mulxq %rax, %rcx, %rbx + xorq %r8, %r8 adoxq %rcx, %r11 # A[2] * A[3] mulxq 24(%rsi), %r13, %r14 adoxq %rbx, %r12 # A[2] * A[0] - mulxq (%rsi), %rcx, %rbx - adoxq %r15, %r13 + mulxq %r15, %rcx, %rbx + adoxq %r8, %r13 adcxq %rcx, %r10 - adoxq %r15, %r14 + adoxq %r8, %r14 # A[1] * A[3] - movq 8(%rsi), %rdx - mulxq 24(%rsi), %rax, %r8 + movq %rax, %rdx + mulxq 24(%rsi), %rcx, %rdx adcxq %rbx, %r11 - adcxq %rax, %r12 - adcxq %r8, %r13 - adcxq %r15, %r14 - # Double with Carry Flag - xorq %r15, %r15 + adcxq %rcx, %r12 + adcxq %rdx, %r13 + adcxq %r8, %r14 # A[0] * A[0] - movq (%rsi), %rdx - mulxq %rdx, %r8, %rax + movq %r15, %rdx + mulxq %rdx, %r8, %rcx + xorq %r15, %r15 adcxq %r9, %r9 # A[1] * A[1] - movq 8(%rsi), %rdx + movq %rax, %rdx + adoxq %rcx, %r9 mulxq %rdx, %rcx, %rbx adcxq %r10, %r10 - adoxq %rax, %r9 - adcxq %r11, %r11 adoxq %rcx, %r10 + adcxq %r11, %r11 # A[2] * A[2] movq 16(%rsi), %rdx - mulxq %rdx, %rax, %rcx - adcxq %r12, %r12 adoxq %rbx, %r11 + mulxq %rdx, %rbx, %rcx + adcxq %r12, %r12 + adoxq %rbx, %r12 adcxq %r13, %r13 - adoxq %rax, %r12 # A[3] * A[3] movq 24(%rsi), %rdx - mulxq %rdx, %rax, %rbx - adcxq %r14, %r14 adoxq %rcx, %r13 + mulxq %rdx, %rcx, %rbx + adcxq %r14, %r14 + adoxq %rcx, %r14 adcxq %r15, %r15 - adoxq %rax, %r14 adoxq %rbx, %r15 - # Reduce + movq $38, %rdx + mulxq %r15, %r15, %rbx + addq %r15, %r11 + adcq $0x00, %rbx movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rbx + imulq $19, %rbx, %rbx andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rdx xorq %rcx, %rcx - mulxq %r12, %rax, %r12 - adcxq %rax, %r8 + adoxq %rbx, %r8 + mulxq %r12, %rbx, %r12 + adcxq %rbx, %r8 adoxq %r12, %r9 - mulxq %r13, %rax, %r13 - adcxq %rax, %r9 + mulxq %r13, %rbx, %r13 + adcxq %rbx, %r9 adoxq %r13, %r10 - mulxq %r14, %rax, %r14 - adcxq %rax, %r10 + mulxq %r14, %rbx, %r14 + adcxq %rbx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r11, %rdx + adcxq %rcx, %r11 movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set movq %r11, %rdx sarq $63, %rdx andq $19, %rdx @@ -9847,101 +9370,80 @@ movq %rdx, %rbp L_fe_sq_n_avx2: # Square - # A[0] * A[1] movq (%rsi), %rdx - mulxq 8(%rsi), %r9, %r10 + movq 8(%rsi), %rax + # A[0] * A[1] + movq %rdx, %r15 + mulxq %rax, %r9, %r10 # A[0] * A[3] mulxq 24(%rsi), %r11, %r12 # A[2] * A[1] movq 16(%rsi), %rdx - mulxq 8(%rsi), %rcx, %rbx - xorq %r15, %r15 + mulxq %rax, %rcx, %rbx + xorq %r8, %r8 adoxq %rcx, %r11 # A[2] * A[3] mulxq 24(%rsi), %r13, %r14 adoxq %rbx, %r12 # A[2] * A[0] - mulxq (%rsi), %rcx, %rbx - adoxq %r15, %r13 + mulxq %r15, %rcx, %rbx + adoxq %r8, %r13 adcxq %rcx, %r10 - adoxq %r15, %r14 + adoxq %r8, %r14 # A[1] * A[3] - movq 8(%rsi), %rdx - mulxq 24(%rsi), %rax, %r8 + movq %rax, %rdx + mulxq 24(%rsi), %rcx, %rdx adcxq %rbx, %r11 - adcxq %rax, %r12 - adcxq %r8, %r13 - adcxq %r15, %r14 - # Double with Carry Flag - xorq %r15, %r15 + adcxq %rcx, %r12 + adcxq %rdx, %r13 + adcxq %r8, %r14 # A[0] * A[0] - movq (%rsi), %rdx - mulxq %rdx, %r8, %rax + movq %r15, %rdx + mulxq %rdx, %r8, %rcx + xorq %r15, %r15 adcxq %r9, %r9 # A[1] * A[1] - movq 8(%rsi), %rdx + movq %rax, %rdx + adoxq %rcx, %r9 mulxq %rdx, %rcx, %rbx adcxq %r10, %r10 - adoxq %rax, %r9 - adcxq %r11, %r11 adoxq %rcx, %r10 + adcxq %r11, %r11 # A[2] * A[2] movq 16(%rsi), %rdx - mulxq %rdx, %rax, %rcx - adcxq %r12, %r12 adoxq %rbx, %r11 + mulxq %rdx, %rbx, %rcx + adcxq %r12, %r12 + adoxq %rbx, %r12 adcxq %r13, %r13 - adoxq %rax, %r12 # A[3] * A[3] movq 24(%rsi), %rdx - mulxq %rdx, %rax, %rbx - adcxq %r14, %r14 adoxq %rcx, %r13 + mulxq %rdx, %rcx, %rbx + adcxq %r14, %r14 + adoxq %rcx, %r14 adcxq %r15, %r15 - adoxq %rax, %r14 adoxq %rbx, %r15 - # Reduce + movq $38, %rdx + mulxq %r15, %r15, %rbx + addq %r15, %r11 + adcq $0x00, %rbx movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 + shldq $0x01, %r11, %rbx + imulq $19, %rbx, %rbx andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rdx xorq %rcx, %rcx - mulxq %r12, %rax, %r12 - adcxq %rax, %r8 + adoxq %rbx, %r8 + mulxq %r12, %rbx, %r12 + adcxq %rbx, %r8 adoxq %r12, %r9 - mulxq %r13, %rax, %r13 - adcxq %rax, %r9 + mulxq %r13, %rbx, %r13 + adcxq %rbx, %r9 adoxq %r13, %r10 - mulxq %r14, %rax, %r14 - adcxq %rax, %r10 + mulxq %r14, %rbx, %r14 + adcxq %rbx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rax - andq %rcx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + adcxq %rcx, %r11 # Store movq %r8, (%rdi) movq %r9, 8(%rdi) @@ -10002,144 +9504,6 @@ #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_sq2_avx2 -.type fe_sq2_avx2,@function -.align 16 -fe_sq2_avx2: -#else -.section __TEXT,__text -.globl _fe_sq2_avx2 -.p2align 4 -_fe_sq2_avx2: -#endif /* __APPLE__ */ - pushq %rbx - pushq %r12 - pushq %r13 - pushq %r14 - pushq %r15 - # Square * 2 - # A[0] * A[1] - movq (%rsi), %rdx - mulxq 8(%rsi), %r9, %r10 - # A[0] * A[3] - mulxq 24(%rsi), %r11, %r12 - # A[2] * A[1] - movq 16(%rsi), %rdx - mulxq 8(%rsi), %rcx, %rbx - xorq %r15, %r15 - adoxq %rcx, %r11 - # A[2] * A[3] - mulxq 24(%rsi), %r13, %r14 - adoxq %rbx, %r12 - # A[2] * A[0] - mulxq (%rsi), %rcx, %rbx - adoxq %r15, %r13 - adcxq %rcx, %r10 - adoxq %r15, %r14 - # A[1] * A[3] - movq 8(%rsi), %rdx - mulxq 24(%rsi), %rax, %r8 - adcxq %rbx, %r11 - adcxq %rax, %r12 - adcxq %r8, %r13 - adcxq %r15, %r14 - # Double with Carry Flag - xorq %r15, %r15 - # A[0] * A[0] - movq (%rsi), %rdx - mulxq %rdx, %r8, %rax - adcxq %r9, %r9 - # A[1] * A[1] - movq 8(%rsi), %rdx - mulxq %rdx, %rcx, %rbx - adcxq %r10, %r10 - adoxq %rax, %r9 - adcxq %r11, %r11 - adoxq %rcx, %r10 - # A[2] * A[2] - movq 16(%rsi), %rdx - mulxq %rdx, %rax, %rcx - adcxq %r12, %r12 - adoxq %rbx, %r11 - adcxq %r13, %r13 - adoxq %rax, %r12 - # A[3] * A[3] - movq 24(%rsi), %rdx - mulxq %rdx, %rax, %rbx - adcxq %r14, %r14 - adoxq %rcx, %r13 - adcxq %r15, %r15 - adoxq %rax, %r14 - adoxq %rbx, %r15 - # Reduce - movq $0x7fffffffffffffff, %rbx - xorq %rax, %rax - # Move top half into t4-t7 and remove top bit from t3 and double - shldq $3, %r15, %rax - shldq $2, %r14, %r15 - shldq $2, %r13, %r14 - shldq $2, %r12, %r13 - shldq $2, %r11, %r12 - shldq $0x01, %r10, %r11 - shldq $0x01, %r9, %r10 - shldq $0x01, %r8, %r9 - shlq $0x01, %r8 - andq %rbx, %r11 - # Two out left, one in right - andq %rbx, %r15 - # Multiply top bits by 19*19 - imulq $0x169, %rax, %rcx - xorq %rbx, %rbx - # Multiply top half by 19 - movq $19, %rdx - adoxq %rcx, %r8 - mulxq %r12, %rax, %r12 - adcxq %rax, %r8 - adoxq %r12, %r9 - mulxq %r13, %rax, %r13 - adcxq %rax, %r9 - adoxq %r13, %r10 - mulxq %r14, %rax, %r14 - adcxq %rax, %r10 - adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rbx, %rdx - adcxq %rbx, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rbx - imulq $19, %rdx, %rax - andq %rbx, %r11 - addq %rax, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - popq %r15 - popq %r14 - popq %r13 - popq %r12 - popq %rbx - repz retq -#ifndef __APPLE__ -.size fe_sq2_avx2,.-fe_sq2_avx2 -#endif /* __APPLE__ */ -#ifndef __APPLE__ -.text .globl fe_invert_avx2 .type fe_invert_avx2,@function .align 16 @@ -10413,9 +9777,9 @@ pushq %r15 pushq %rbp movq %rdx, %r8 - subq $0xc0, %rsp - movq $0x00, 184(%rsp) - movq %rdi, 176(%rsp) + subq $0xb8, %rsp + movq $0x00, 176(%rsp) + movq %rdi, 168(%rsp) # Set one movq $0x01, (%rdi) movq $0x00, 8(%rdi) @@ -10440,18 +9804,18 @@ movq %r10, 72(%rsp) movq %r11, 80(%rsp) movq %r12, 88(%rsp) - movb $62, 168(%rsp) - movq $3, 160(%rsp) -L_curve25519_avx2_words: + movq $0xfe, %rbx L_curve25519_avx2_bits: - movq 184(%rsp), %rbx - movq 160(%rsp), %r9 - movb 168(%rsp), %cl - movq (%rsi,%r9,8), %rax - shrq %cl, %rax - andq $0x01, %rax - xorq %rax, %rbx - negq %rbx + movq 176(%rsp), %rax + movq %rbx, 160(%rsp) + movq %rbx, %rcx + andq $63, %rcx + shrq $6, %rbx + movq (%rsi,%rbx,8), %rbx + shrq %cl, %rbx + andq $0x01, %rbx + xorq %rbx, %rax + negq %rax # Conditional Swap movq (%rdi), %r9 movq 8(%rdi), %r10 @@ -10461,10 +9825,10 @@ xorq 72(%rsp), %r10 xorq 80(%rsp), %r11 xorq 88(%rsp), %r12 - andq %rbx, %r9 - andq %rbx, %r10 - andq %rbx, %r11 - andq %rbx, %r12 + andq %rax, %r9 + andq %rax, %r10 + andq %rax, %r11 + andq %rax, %r12 xorq %r9, (%rdi) xorq %r10, 8(%rdi) xorq %r11, 16(%rdi) @@ -10482,10 +9846,10 @@ xorq 40(%rsp), %r10 xorq 48(%rsp), %r11 xorq 56(%rsp), %r12 - andq %rbx, %r9 - andq %rbx, %r10 - andq %rbx, %r11 - andq %rbx, %r12 + andq %rax, %r9 + andq %rax, %r10 + andq %rax, %r11 + andq %rax, %r12 xorq %r9, (%rsp) xorq %r10, 8(%rsp) xorq %r11, 16(%rsp) @@ -10494,49 +9858,46 @@ xorq %r10, 40(%rsp) xorq %r11, 48(%rsp) xorq %r12, 56(%rsp) - movq %rax, 184(%rsp) + movq %rbx, 176(%rsp) + # Add-Sub # Add movq (%rdi), %r9 movq 8(%rdi), %r10 movq 16(%rdi), %r11 - movq 24(%rdi), %rax + movq 24(%rdi), %r12 movq %r9, %r13 addq (%rsp), %r9 movq %r10, %r14 adcq 8(%rsp), %r10 movq %r11, %r15 adcq 16(%rsp), %r11 - movq %rax, %rbp - adcq 24(%rsp), %rax - movq $-19, %rcx - movq %rax, %r12 + movq %r12, %rbp + adcq 24(%rsp), %r12 + movq $0x00, %rcx + adcq $0x00, %rcx + shldq $0x01, %r12, %rcx movq $0x7fffffffffffffff, %rbx - sarq $63, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + imulq $19, %rcx + andq %rbx, %r12 # Sub modulus (if overflow) - subq %rcx, %r9 - sbbq %rax, %r10 - sbbq %rax, %r11 - sbbq %rbx, %r12 + addq %rcx, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 # Sub subq (%rsp), %r13 - movq $0x00, %rax sbbq 8(%rsp), %r14 - movq $-19, %rcx sbbq 16(%rsp), %r15 - movq $0x7fffffffffffffff, %rbx sbbq 24(%rsp), %rbp - sbbq $0x00, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + sbbq %rcx, %rcx + shldq $0x01, %rbp, %rcx + imulq $-19, %rcx + andq %rbx, %rbp # Add modulus (if underflow) - addq %rcx, %r13 - adcq %rax, %r14 - adcq %rax, %r15 - adcq %rbx, %rbp + subq %rcx, %r13 + sbbq $0x00, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbp movq %r9, (%rdi) movq %r10, 8(%rdi) movq %r11, 16(%rdi) @@ -10545,145 +9906,140 @@ movq %r14, 136(%rsp) movq %r15, 144(%rsp) movq %rbp, 152(%rsp) + # Add-Sub # Add movq 64(%rsp), %r9 movq 72(%rsp), %r10 movq 80(%rsp), %r11 - movq 88(%rsp), %rax + movq 88(%rsp), %r12 movq %r9, %r13 addq 32(%rsp), %r9 movq %r10, %r14 adcq 40(%rsp), %r10 movq %r11, %r15 adcq 48(%rsp), %r11 - movq %rax, %rbp - adcq 56(%rsp), %rax - movq $-19, %rcx - movq %rax, %r12 + movq %r12, %rbp + adcq 56(%rsp), %r12 + movq $0x00, %rcx + adcq $0x00, %rcx + shldq $0x01, %r12, %rcx movq $0x7fffffffffffffff, %rbx - sarq $63, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + imulq $19, %rcx + andq %rbx, %r12 # Sub modulus (if overflow) - subq %rcx, %r9 - sbbq %rax, %r10 - sbbq %rax, %r11 - sbbq %rbx, %r12 + addq %rcx, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 # Sub subq 32(%rsp), %r13 - movq $0x00, %rax sbbq 40(%rsp), %r14 - movq $-19, %rcx sbbq 48(%rsp), %r15 - movq $0x7fffffffffffffff, %rbx sbbq 56(%rsp), %rbp - sbbq $0x00, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + sbbq %rcx, %rcx + shldq $0x01, %rbp, %rcx + imulq $-19, %rcx + andq %rbx, %rbp # Add modulus (if underflow) - addq %rcx, %r13 - adcq %rax, %r14 - adcq %rax, %r15 - adcq %rbx, %rbp - movq %r9, (%rsp) - movq %r10, 8(%rsp) - movq %r11, 16(%rsp) - movq %r12, 24(%rsp) + subq %rcx, %r13 + sbbq $0x00, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbp + movq %r9, 32(%rsp) + movq %r10, 40(%rsp) + movq %r11, 48(%rsp) + movq %r12, 56(%rsp) movq %r13, 96(%rsp) movq %r14, 104(%rsp) movq %r15, 112(%rsp) movq %rbp, 120(%rsp) # Multiply # A[0] * B[0] - movq (%rdi), %rdx - mulxq 96(%rsp), %r9, %r10 + movq 128(%rsp), %rdx + mulxq 32(%rsp), %r9, %r10 # A[2] * B[0] - mulxq 112(%rsp), %r11, %r12 + mulxq 48(%rsp), %r11, %r12 # A[1] * B[0] - mulxq 104(%rsp), %rcx, %rbx + mulxq 40(%rsp), %rcx, %rbx xorq %rbp, %rbp adcxq %rcx, %r10 - # A[1] * B[3] - movq 24(%rdi), %rdx - mulxq 104(%rsp), %r13, %r14 + # A[3] * B[1] + movq 136(%rsp), %rdx + mulxq 56(%rsp), %r13, %r14 adcxq %rbx, %r11 # A[0] * B[1] - movq 8(%rdi), %rdx - mulxq 96(%rsp), %rcx, %rbx + mulxq 32(%rsp), %rcx, %rbx adoxq %rcx, %r10 # A[2] * B[1] - mulxq 112(%rsp), %rcx, %r15 + mulxq 48(%rsp), %rcx, %r15 adoxq %rbx, %r11 adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rdi), %rdx - mulxq 104(%rsp), %rcx, %rbx + movq 144(%rsp), %rdx + mulxq 40(%rsp), %rcx, %rbx adcxq %r15, %r13 adoxq %rcx, %r12 adcxq %rbp, %r14 adoxq %rbx, %r13 # A[0] * B[2] - mulxq 96(%rsp), %rcx, %rbx + mulxq 32(%rsp), %rcx, %rbx adoxq %rbp, %r14 xorq %r15, %r15 adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rdi), %rdx - mulxq 104(%rsp), %rdx, %rcx + movq 136(%rsp), %rdx + mulxq 40(%rsp), %rdx, %rcx adcxq %rbx, %r12 adoxq %rdx, %r11 - # A[3] * B[1] - movq 8(%rdi), %rdx + # A[1] * B[3] + movq 152(%rsp), %rdx adoxq %rcx, %r12 - mulxq 120(%rsp), %rcx, %rbx + mulxq 40(%rsp), %rcx, %rbx adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rdi), %rdx - mulxq 112(%rsp), %rdx, %rcx + movq 144(%rsp), %rdx + mulxq 48(%rsp), %rdx, %rcx adcxq %rbx, %r14 adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rdi), %rdx + movq 152(%rsp), %rdx adoxq %rcx, %r14 - mulxq 120(%rsp), %rcx, %rbx + mulxq 56(%rsp), %rcx, %rbx adoxq %rbp, %r15 adcxq %rcx, %r15 # A[0] * B[3] - mulxq 96(%rsp), %rdx, %rcx + mulxq 32(%rsp), %rdx, %rcx adcxq %rbx, %rbp xorq %rbx, %rbx adcxq %rdx, %r12 # A[3] * B[0] - movq (%rdi), %rdx + movq 56(%rsp), %rdx adcxq %rcx, %r13 - mulxq 120(%rsp), %rdx, %rcx + mulxq 128(%rsp), %rdx, %rcx adoxq %rdx, %r12 adoxq %rcx, %r13 - # A[2] * B[3] - movq 24(%rdi), %rdx - mulxq 112(%rsp), %rdx, %rcx - adcxq %rdx, %r14 # A[3] * B[2] - movq 16(%rdi), %rdx + movq 56(%rsp), %rdx + mulxq 144(%rsp), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 152(%rsp), %rdx adcxq %rcx, %r15 - mulxq 120(%rsp), %rcx, %rdx + mulxq 48(%rsp), %rcx, %rdx adcxq %rbx, %rbp adoxq %rcx, %r14 adoxq %rdx, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rcx + addq %rbp, %r12 + adcq $0x00, %rcx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx andq %rbx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rbx, %rbx + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 @@ -10693,28 +10049,7 @@ mulxq %r15, %rcx, %r15 adcxq %rcx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rbx, %rdx - adcxq %rbx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rbx - imulq $19, %rdx, %rcx - andq %rbx, %r12 - addq %rcx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rbx, %r12 # Store movq %r9, 32(%rsp) movq %r10, 40(%rsp) @@ -10722,93 +10057,91 @@ movq %r12, 56(%rsp) # Multiply # A[0] * B[0] - movq 128(%rsp), %rdx - mulxq (%rsp), %r9, %r10 + movq (%rdi), %rdx + mulxq 96(%rsp), %r9, %r10 # A[2] * B[0] - mulxq 16(%rsp), %r11, %r12 + mulxq 112(%rsp), %r11, %r12 # A[1] * B[0] - mulxq 8(%rsp), %rcx, %rbx + mulxq 104(%rsp), %rcx, %rbx xorq %rbp, %rbp adcxq %rcx, %r10 - # A[1] * B[3] - movq 152(%rsp), %rdx - mulxq 8(%rsp), %r13, %r14 + # A[3] * B[1] + movq 8(%rdi), %rdx + mulxq 120(%rsp), %r13, %r14 adcxq %rbx, %r11 # A[0] * B[1] - movq 136(%rsp), %rdx - mulxq (%rsp), %rcx, %rbx + mulxq 96(%rsp), %rcx, %rbx adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rsp), %rcx, %r15 + mulxq 112(%rsp), %rcx, %r15 adoxq %rbx, %r11 adcxq %rcx, %r12 # A[1] * B[2] - movq 144(%rsp), %rdx - mulxq 8(%rsp), %rcx, %rbx + movq 16(%rdi), %rdx + mulxq 104(%rsp), %rcx, %rbx adcxq %r15, %r13 adoxq %rcx, %r12 adcxq %rbp, %r14 adoxq %rbx, %r13 # A[0] * B[2] - mulxq (%rsp), %rcx, %rbx + mulxq 96(%rsp), %rcx, %rbx adoxq %rbp, %r14 xorq %r15, %r15 adcxq %rcx, %r11 # A[1] * B[1] - movq 136(%rsp), %rdx - mulxq 8(%rsp), %rdx, %rcx + movq 8(%rdi), %rdx + mulxq 104(%rsp), %rdx, %rcx adcxq %rbx, %r12 adoxq %rdx, %r11 - # A[3] * B[1] - movq 136(%rsp), %rdx + # A[1] * B[3] + movq 24(%rdi), %rdx adoxq %rcx, %r12 - mulxq 24(%rsp), %rcx, %rbx + mulxq 104(%rsp), %rcx, %rbx adcxq %rcx, %r13 # A[2] * B[2] - movq 144(%rsp), %rdx - mulxq 16(%rsp), %rdx, %rcx + movq 16(%rdi), %rdx + mulxq 112(%rsp), %rdx, %rcx adcxq %rbx, %r14 adoxq %rdx, %r13 # A[3] * B[3] - movq 152(%rsp), %rdx + movq 24(%rdi), %rdx adoxq %rcx, %r14 - mulxq 24(%rsp), %rcx, %rbx + mulxq 120(%rsp), %rcx, %rbx adoxq %rbp, %r15 adcxq %rcx, %r15 # A[0] * B[3] - mulxq (%rsp), %rdx, %rcx + mulxq 96(%rsp), %rdx, %rcx adcxq %rbx, %rbp xorq %rbx, %rbx adcxq %rdx, %r12 # A[3] * B[0] - movq 128(%rsp), %rdx + movq 120(%rsp), %rdx adcxq %rcx, %r13 - mulxq 24(%rsp), %rdx, %rcx + mulxq (%rdi), %rdx, %rcx adoxq %rdx, %r12 adoxq %rcx, %r13 - # A[2] * B[3] - movq 152(%rsp), %rdx - mulxq 16(%rsp), %rdx, %rcx - adcxq %rdx, %r14 # A[3] * B[2] - movq 144(%rsp), %rdx + movq 120(%rsp), %rdx + mulxq 16(%rdi), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rdi), %rdx adcxq %rcx, %r15 - mulxq 24(%rsp), %rcx, %rdx + mulxq 112(%rsp), %rcx, %rdx adcxq %rbx, %rbp adoxq %rcx, %r14 adoxq %rdx, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rcx + addq %rbp, %r12 + adcq $0x00, %rcx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx andq %rbx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rbx, %rbx + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 @@ -10818,285 +10151,219 @@ mulxq %r15, %rcx, %r15 adcxq %rcx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rbx, %rdx - adcxq %rbx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rbx - imulq $19, %rdx, %rcx - andq %rbx, %r12 - addq %rcx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rbx, %r12 # Store movq %r9, (%rsp) movq %r10, 8(%rsp) movq %r11, 16(%rsp) movq %r12, 24(%rsp) # Square - # A[0] * A[1] movq 128(%rsp), %rdx - mulxq 136(%rsp), %r10, %r11 + movq 136(%rsp), %rax + # A[0] * A[1] + movq %rdx, %rbp + mulxq %rax, %r10, %r11 # A[0] * A[3] mulxq 152(%rsp), %r12, %r13 # A[2] * A[1] movq 144(%rsp), %rdx - mulxq 136(%rsp), %rcx, %rbx - xorq %rbp, %rbp + mulxq %rax, %rcx, %rbx + xorq %r9, %r9 adoxq %rcx, %r12 # A[2] * A[3] mulxq 152(%rsp), %r14, %r15 adoxq %rbx, %r13 # A[2] * A[0] - mulxq 128(%rsp), %rcx, %rbx - adoxq %rbp, %r14 + mulxq %rbp, %rcx, %rbx + adoxq %r9, %r14 adcxq %rcx, %r11 - adoxq %rbp, %r15 + adoxq %r9, %r15 # A[1] * A[3] - movq 136(%rsp), %rdx - mulxq 152(%rsp), %rax, %r9 + movq %rax, %rdx + mulxq 152(%rsp), %rcx, %rdx adcxq %rbx, %r12 - adcxq %rax, %r13 - adcxq %r9, %r14 - adcxq %rbp, %r15 - # Double with Carry Flag - xorq %rbp, %rbp + adcxq %rcx, %r13 + adcxq %rdx, %r14 + adcxq %r9, %r15 # A[0] * A[0] - movq 128(%rsp), %rdx - mulxq %rdx, %r9, %rax + movq %rbp, %rdx + mulxq %rdx, %r9, %rcx + xorq %rbp, %rbp adcxq %r10, %r10 # A[1] * A[1] - movq 136(%rsp), %rdx + movq %rax, %rdx + adoxq %rcx, %r10 mulxq %rdx, %rcx, %rbx adcxq %r11, %r11 - adoxq %rax, %r10 - adcxq %r12, %r12 adoxq %rcx, %r11 + adcxq %r12, %r12 # A[2] * A[2] movq 144(%rsp), %rdx - mulxq %rdx, %rax, %rcx - adcxq %r13, %r13 adoxq %rbx, %r12 + mulxq %rdx, %rbx, %rcx + adcxq %r13, %r13 + adoxq %rbx, %r13 adcxq %r14, %r14 - adoxq %rax, %r13 # A[3] * A[3] movq 152(%rsp), %rdx - mulxq %rdx, %rax, %rbx - adcxq %r15, %r15 adoxq %rcx, %r14 + mulxq %rdx, %rcx, %rbx + adcxq %r15, %r15 + adoxq %rcx, %r15 adcxq %rbp, %rbp - adoxq %rax, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rbx + addq %rbp, %r12 + adcq $0x00, %rbx movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rbx + imulq $19, %rbx, %rbx andq %rcx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rcx, %rcx - mulxq %r13, %rax, %r13 - adcxq %rax, %r9 + adoxq %rbx, %r9 + mulxq %r13, %rbx, %r13 + adcxq %rbx, %r9 adoxq %r13, %r10 - mulxq %r14, %rax, %r14 - adcxq %rax, %r10 + mulxq %r14, %rbx, %r14 + adcxq %rbx, %r10 adoxq %r14, %r11 - mulxq %r15, %rax, %r15 - adcxq %rax, %r11 + mulxq %r15, %rbx, %r15 + adcxq %rbx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rax - andq %rcx, %r12 - addq %rax, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rcx, %r12 # Store movq %r9, 96(%rsp) movq %r10, 104(%rsp) movq %r11, 112(%rsp) movq %r12, 120(%rsp) # Square - # A[0] * A[1] movq (%rdi), %rdx - mulxq 8(%rdi), %r10, %r11 + movq 8(%rdi), %rax + # A[0] * A[1] + movq %rdx, %rbp + mulxq %rax, %r10, %r11 # A[0] * A[3] mulxq 24(%rdi), %r12, %r13 # A[2] * A[1] movq 16(%rdi), %rdx - mulxq 8(%rdi), %rcx, %rbx - xorq %rbp, %rbp + mulxq %rax, %rcx, %rbx + xorq %r9, %r9 adoxq %rcx, %r12 # A[2] * A[3] mulxq 24(%rdi), %r14, %r15 adoxq %rbx, %r13 # A[2] * A[0] - mulxq (%rdi), %rcx, %rbx - adoxq %rbp, %r14 + mulxq %rbp, %rcx, %rbx + adoxq %r9, %r14 adcxq %rcx, %r11 - adoxq %rbp, %r15 + adoxq %r9, %r15 # A[1] * A[3] - movq 8(%rdi), %rdx - mulxq 24(%rdi), %rax, %r9 + movq %rax, %rdx + mulxq 24(%rdi), %rcx, %rdx adcxq %rbx, %r12 - adcxq %rax, %r13 - adcxq %r9, %r14 - adcxq %rbp, %r15 - # Double with Carry Flag - xorq %rbp, %rbp + adcxq %rcx, %r13 + adcxq %rdx, %r14 + adcxq %r9, %r15 # A[0] * A[0] - movq (%rdi), %rdx - mulxq %rdx, %r9, %rax + movq %rbp, %rdx + mulxq %rdx, %r9, %rcx + xorq %rbp, %rbp adcxq %r10, %r10 # A[1] * A[1] - movq 8(%rdi), %rdx + movq %rax, %rdx + adoxq %rcx, %r10 mulxq %rdx, %rcx, %rbx adcxq %r11, %r11 - adoxq %rax, %r10 - adcxq %r12, %r12 adoxq %rcx, %r11 + adcxq %r12, %r12 # A[2] * A[2] movq 16(%rdi), %rdx - mulxq %rdx, %rax, %rcx - adcxq %r13, %r13 adoxq %rbx, %r12 + mulxq %rdx, %rbx, %rcx + adcxq %r13, %r13 + adoxq %rbx, %r13 adcxq %r14, %r14 - adoxq %rax, %r13 # A[3] * A[3] movq 24(%rdi), %rdx - mulxq %rdx, %rax, %rbx - adcxq %r15, %r15 adoxq %rcx, %r14 + mulxq %rdx, %rcx, %rbx + adcxq %r15, %r15 + adoxq %rcx, %r15 adcxq %rbp, %rbp - adoxq %rax, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rbx + addq %rbp, %r12 + adcq $0x00, %rbx movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rbx + imulq $19, %rbx, %rbx andq %rcx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rcx, %rcx - mulxq %r13, %rax, %r13 - adcxq %rax, %r9 + adoxq %rbx, %r9 + mulxq %r13, %rbx, %r13 + adcxq %rbx, %r9 adoxq %r13, %r10 - mulxq %r14, %rax, %r14 - adcxq %rax, %r10 + mulxq %r14, %rbx, %r14 + adcxq %rbx, %r10 adoxq %r14, %r11 - mulxq %r15, %rax, %r15 - adcxq %rax, %r11 + mulxq %r15, %rbx, %r15 + adcxq %rbx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rax - andq %rcx, %r12 - addq %rax, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rcx, %r12 # Store movq %r9, 128(%rsp) movq %r10, 136(%rsp) movq %r11, 144(%rsp) movq %r12, 152(%rsp) + # Add-Sub # Add - movq 32(%rsp), %r9 - movq 40(%rsp), %r10 - movq 48(%rsp), %r11 - movq 56(%rsp), %rax + movq (%rsp), %r9 + movq 8(%rsp), %r10 + movq 16(%rsp), %r11 + movq 24(%rsp), %r12 movq %r9, %r13 - addq (%rsp), %r9 + addq 32(%rsp), %r9 movq %r10, %r14 - adcq 8(%rsp), %r10 + adcq 40(%rsp), %r10 movq %r11, %r15 - adcq 16(%rsp), %r11 - movq %rax, %rbp - adcq 24(%rsp), %rax - movq $-19, %rcx - movq %rax, %r12 + adcq 48(%rsp), %r11 + movq %r12, %rbp + adcq 56(%rsp), %r12 + movq $0x00, %rcx + adcq $0x00, %rcx + shldq $0x01, %r12, %rcx movq $0x7fffffffffffffff, %rbx - sarq $63, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + imulq $19, %rcx + andq %rbx, %r12 # Sub modulus (if overflow) - subq %rcx, %r9 - sbbq %rax, %r10 - sbbq %rax, %r11 - sbbq %rbx, %r12 + addq %rcx, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 # Sub - subq (%rsp), %r13 - movq $0x00, %rax - sbbq 8(%rsp), %r14 - movq $-19, %rcx - sbbq 16(%rsp), %r15 - movq $0x7fffffffffffffff, %rbx - sbbq 24(%rsp), %rbp - sbbq $0x00, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + subq 32(%rsp), %r13 + sbbq 40(%rsp), %r14 + sbbq 48(%rsp), %r15 + sbbq 56(%rsp), %rbp + sbbq %rcx, %rcx + shldq $0x01, %rbp, %rcx + imulq $-19, %rcx + andq %rbx, %rbp # Add modulus (if underflow) - addq %rcx, %r13 - adcq %rax, %r14 - adcq %rax, %r15 - adcq %rbx, %rbp + subq %rcx, %r13 + sbbq $0x00, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbp movq %r9, 64(%rsp) movq %r10, 72(%rsp) movq %r11, 80(%rsp) movq %r12, 88(%rsp) - movq %r13, (%rsp) - movq %r14, 8(%rsp) - movq %r15, 16(%rsp) - movq %rbp, 24(%rsp) + movq %r13, 32(%rsp) + movq %r14, 40(%rsp) + movq %r15, 48(%rsp) + movq %rbp, 56(%rsp) # Multiply # A[0] * B[0] movq 96(%rsp), %rdx @@ -11107,12 +10374,11 @@ mulxq 136(%rsp), %rcx, %rbx xorq %rbp, %rbp adcxq %rcx, %r10 - # A[1] * B[3] - movq 120(%rsp), %rdx - mulxq 136(%rsp), %r13, %r14 + # A[3] * B[1] + movq 104(%rsp), %rdx + mulxq 152(%rsp), %r13, %r14 adcxq %rbx, %r11 # A[0] * B[1] - movq 104(%rsp), %rdx mulxq 128(%rsp), %rcx, %rbx adoxq %rcx, %r10 # A[2] * B[1] @@ -11136,10 +10402,10 @@ mulxq 136(%rsp), %rdx, %rcx adcxq %rbx, %r12 adoxq %rdx, %r11 - # A[3] * B[1] - movq 104(%rsp), %rdx + # A[1] * B[3] + movq 120(%rsp), %rdx adoxq %rcx, %r12 - mulxq 152(%rsp), %rcx, %rbx + mulxq 136(%rsp), %rcx, %rbx adcxq %rcx, %r13 # A[2] * B[2] movq 112(%rsp), %rdx @@ -11158,34 +10424,33 @@ xorq %rbx, %rbx adcxq %rdx, %r12 # A[3] * B[0] - movq 96(%rsp), %rdx + movq 152(%rsp), %rdx adcxq %rcx, %r13 - mulxq 152(%rsp), %rdx, %rcx + mulxq 96(%rsp), %rdx, %rcx adoxq %rdx, %r12 adoxq %rcx, %r13 + # A[3] * B[2] + movq 152(%rsp), %rdx + mulxq 112(%rsp), %rdx, %rcx + adcxq %rdx, %r14 # A[2] * B[3] movq 120(%rsp), %rdx - mulxq 144(%rsp), %rdx, %rcx - adcxq %rdx, %r14 - # A[3] * B[2] - movq 112(%rsp), %rdx adcxq %rcx, %r15 - mulxq 152(%rsp), %rcx, %rdx + mulxq 144(%rsp), %rcx, %rdx adcxq %rbx, %rbp adoxq %rcx, %r14 adoxq %rdx, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rcx + addq %rbp, %r12 + adcq $0x00, %rcx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx andq %rbx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rbx, %rbx + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 @@ -11195,28 +10460,7 @@ mulxq %r15, %rcx, %r15 adcxq %rcx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rbx, %rdx - adcxq %rbx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rbx - imulq $19, %rdx, %rcx - andq %rbx, %r12 - addq %rcx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rbx, %r12 # Store movq %r9, (%rdi) movq %r10, 8(%rdi) @@ -11228,126 +10472,103 @@ movq 144(%rsp), %r11 movq 152(%rsp), %r12 subq 96(%rsp), %r9 - movq $0x00, %rax sbbq 104(%rsp), %r10 - movq $-19, %rcx sbbq 112(%rsp), %r11 - movq $0x7fffffffffffffff, %rbx sbbq 120(%rsp), %r12 - sbbq $0x00, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + sbbq %rcx, %rcx + shldq $0x01, %r12, %rcx + movq $0x7fffffffffffffff, %rbx + imulq $-19, %rcx + andq %rbx, %r12 # Add modulus (if underflow) - addq %rcx, %r9 - adcq %rax, %r10 - adcq %rax, %r11 - adcq %rbx, %r12 + subq %rcx, %r9 + sbbq $0x00, %r10 + sbbq $0x00, %r11 + sbbq $0x00, %r12 movq %r9, 128(%rsp) movq %r10, 136(%rsp) movq %r11, 144(%rsp) movq %r12, 152(%rsp) # Square + movq 32(%rsp), %rdx + movq 40(%rsp), %rax # A[0] * A[1] - movq (%rsp), %rdx - mulxq 8(%rsp), %r10, %r11 + movq %rdx, %rbp + mulxq %rax, %r10, %r11 # A[0] * A[3] - mulxq 24(%rsp), %r12, %r13 + mulxq 56(%rsp), %r12, %r13 # A[2] * A[1] - movq 16(%rsp), %rdx - mulxq 8(%rsp), %rcx, %rbx - xorq %rbp, %rbp + movq 48(%rsp), %rdx + mulxq %rax, %rcx, %rbx + xorq %r9, %r9 adoxq %rcx, %r12 # A[2] * A[3] - mulxq 24(%rsp), %r14, %r15 + mulxq 56(%rsp), %r14, %r15 adoxq %rbx, %r13 # A[2] * A[0] - mulxq (%rsp), %rcx, %rbx - adoxq %rbp, %r14 + mulxq %rbp, %rcx, %rbx + adoxq %r9, %r14 adcxq %rcx, %r11 - adoxq %rbp, %r15 + adoxq %r9, %r15 # A[1] * A[3] - movq 8(%rsp), %rdx - mulxq 24(%rsp), %rax, %r9 + movq %rax, %rdx + mulxq 56(%rsp), %rcx, %rdx adcxq %rbx, %r12 - adcxq %rax, %r13 - adcxq %r9, %r14 - adcxq %rbp, %r15 - # Double with Carry Flag - xorq %rbp, %rbp + adcxq %rcx, %r13 + adcxq %rdx, %r14 + adcxq %r9, %r15 # A[0] * A[0] - movq (%rsp), %rdx - mulxq %rdx, %r9, %rax + movq %rbp, %rdx + mulxq %rdx, %r9, %rcx + xorq %rbp, %rbp adcxq %r10, %r10 # A[1] * A[1] - movq 8(%rsp), %rdx + movq %rax, %rdx + adoxq %rcx, %r10 mulxq %rdx, %rcx, %rbx adcxq %r11, %r11 - adoxq %rax, %r10 - adcxq %r12, %r12 adoxq %rcx, %r11 + adcxq %r12, %r12 # A[2] * A[2] - movq 16(%rsp), %rdx - mulxq %rdx, %rax, %rcx - adcxq %r13, %r13 + movq 48(%rsp), %rdx adoxq %rbx, %r12 + mulxq %rdx, %rbx, %rcx + adcxq %r13, %r13 + adoxq %rbx, %r13 adcxq %r14, %r14 - adoxq %rax, %r13 # A[3] * A[3] - movq 24(%rsp), %rdx - mulxq %rdx, %rax, %rbx - adcxq %r15, %r15 + movq 56(%rsp), %rdx adoxq %rcx, %r14 + mulxq %rdx, %rcx, %rbx + adcxq %r15, %r15 + adoxq %rcx, %r15 adcxq %rbp, %rbp - adoxq %rax, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rbx + addq %rbp, %r12 + adcq $0x00, %rbx movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rbx + imulq $19, %rbx, %rbx andq %rcx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rcx, %rcx - mulxq %r13, %rax, %r13 - adcxq %rax, %r9 + adoxq %rbx, %r9 + mulxq %r13, %rbx, %r13 + adcxq %rbx, %r9 adoxq %r13, %r10 - mulxq %r14, %rax, %r14 - adcxq %rax, %r10 + mulxq %r14, %rbx, %r14 + adcxq %rbx, %r10 adoxq %r14, %r11 - mulxq %r15, %rax, %r15 - adcxq %rax, %r11 + mulxq %r15, %rbx, %r15 + adcxq %rbx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rax - andq %rcx, %r12 - addq %rax, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rcx, %r12 # Store - movq %r9, (%rsp) - movq %r10, 8(%rsp) - movq %r11, 16(%rsp) - movq %r12, 24(%rsp) + movq %r9, 32(%rsp) + movq %r10, 40(%rsp) + movq %r11, 48(%rsp) + movq %r12, 56(%rsp) movq $0x1db42, %rdx mulxq 128(%rsp), %r9, %rbp mulxq 136(%rsp), %r10, %r15 @@ -11365,106 +10586,85 @@ adcq $0x00, %r10 adcq $0x00, %r11 adcq $0x00, %r12 - movq %r9, 32(%rsp) - movq %r10, 40(%rsp) - movq %r11, 48(%rsp) - movq %r12, 56(%rsp) + movq %r9, (%rsp) + movq %r10, 8(%rsp) + movq %r11, 16(%rsp) + movq %r12, 24(%rsp) # Square - # A[0] * A[1] movq 64(%rsp), %rdx - mulxq 72(%rsp), %r10, %r11 + movq 72(%rsp), %rax + # A[0] * A[1] + movq %rdx, %rbp + mulxq %rax, %r10, %r11 # A[0] * A[3] mulxq 88(%rsp), %r12, %r13 # A[2] * A[1] movq 80(%rsp), %rdx - mulxq 72(%rsp), %rcx, %rbx - xorq %rbp, %rbp + mulxq %rax, %rcx, %rbx + xorq %r9, %r9 adoxq %rcx, %r12 # A[2] * A[3] mulxq 88(%rsp), %r14, %r15 adoxq %rbx, %r13 # A[2] * A[0] - mulxq 64(%rsp), %rcx, %rbx - adoxq %rbp, %r14 + mulxq %rbp, %rcx, %rbx + adoxq %r9, %r14 adcxq %rcx, %r11 - adoxq %rbp, %r15 + adoxq %r9, %r15 # A[1] * A[3] - movq 72(%rsp), %rdx - mulxq 88(%rsp), %rax, %r9 + movq %rax, %rdx + mulxq 88(%rsp), %rcx, %rdx adcxq %rbx, %r12 - adcxq %rax, %r13 - adcxq %r9, %r14 - adcxq %rbp, %r15 - # Double with Carry Flag - xorq %rbp, %rbp + adcxq %rcx, %r13 + adcxq %rdx, %r14 + adcxq %r9, %r15 # A[0] * A[0] - movq 64(%rsp), %rdx - mulxq %rdx, %r9, %rax + movq %rbp, %rdx + mulxq %rdx, %r9, %rcx + xorq %rbp, %rbp adcxq %r10, %r10 # A[1] * A[1] - movq 72(%rsp), %rdx + movq %rax, %rdx + adoxq %rcx, %r10 mulxq %rdx, %rcx, %rbx adcxq %r11, %r11 - adoxq %rax, %r10 - adcxq %r12, %r12 adoxq %rcx, %r11 + adcxq %r12, %r12 # A[2] * A[2] movq 80(%rsp), %rdx - mulxq %rdx, %rax, %rcx - adcxq %r13, %r13 adoxq %rbx, %r12 + mulxq %rdx, %rbx, %rcx + adcxq %r13, %r13 + adoxq %rbx, %r13 adcxq %r14, %r14 - adoxq %rax, %r13 # A[3] * A[3] movq 88(%rsp), %rdx - mulxq %rdx, %rax, %rbx - adcxq %r15, %r15 adoxq %rcx, %r14 + mulxq %rdx, %rcx, %rbx + adcxq %r15, %r15 + adoxq %rcx, %r15 adcxq %rbp, %rbp - adoxq %rax, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rbx + addq %rbp, %r12 + adcq $0x00, %rbx movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rbx + imulq $19, %rbx, %rbx andq %rcx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rcx, %rcx - mulxq %r13, %rax, %r13 - adcxq %rax, %r9 + adoxq %rbx, %r9 + mulxq %r13, %rbx, %r13 + adcxq %rbx, %r9 adoxq %r13, %r10 - mulxq %r14, %rax, %r14 - adcxq %rax, %r10 + mulxq %r14, %rbx, %r14 + adcxq %rbx, %r10 adoxq %r14, %r11 - mulxq %r15, %rax, %r15 - adcxq %rax, %r11 + mulxq %r15, %rbx, %r15 + adcxq %rbx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rax - andq %rcx, %r12 - addq %rax, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rcx, %r12 # Store movq %r9, 64(%rsp) movq %r10, 72(%rsp) @@ -11473,31 +10673,30 @@ # Add movq 96(%rsp), %r9 movq 104(%rsp), %r10 - addq 32(%rsp), %r9 + addq (%rsp), %r9 movq 112(%rsp), %r11 - adcq 40(%rsp), %r10 - movq 120(%rsp), %rax - adcq 48(%rsp), %r11 - movq $-19, %rcx - adcq 56(%rsp), %rax + adcq 8(%rsp), %r10 + movq 120(%rsp), %r12 + adcq 16(%rsp), %r11 + adcq 24(%rsp), %r12 + movq $0x00, %rcx + adcq $0x00, %rcx + shldq $0x01, %r12, %rcx movq $0x7fffffffffffffff, %rbx - movq %rax, %r12 - sarq $63, %rax - # Mask the modulus - andq %rax, %rcx - andq %rax, %rbx + imulq $19, %rcx + andq %rbx, %r12 # Sub modulus (if overflow) - subq %rcx, %r9 - sbbq %rax, %r10 - sbbq %rax, %r11 - sbbq %rbx, %r12 + addq %rcx, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 movq %r9, 96(%rsp) movq %r10, 104(%rsp) movq %r11, 112(%rsp) movq %r12, 120(%rsp) # Multiply # A[0] * B[0] - movq (%rsp), %rdx + movq 32(%rsp), %rdx mulxq (%r8), %r9, %r10 # A[2] * B[0] mulxq 16(%r8), %r11, %r12 @@ -11505,12 +10704,11 @@ mulxq 8(%r8), %rcx, %rbx xorq %rbp, %rbp adcxq %rcx, %r10 - # A[1] * B[3] - movq 24(%rsp), %rdx - mulxq 8(%r8), %r13, %r14 + # A[3] * B[1] + movq 40(%rsp), %rdx + mulxq 24(%r8), %r13, %r14 adcxq %rbx, %r11 # A[0] * B[1] - movq 8(%rsp), %rdx mulxq (%r8), %rcx, %rbx adoxq %rcx, %r10 # A[2] * B[1] @@ -11518,7 +10716,7 @@ adoxq %rbx, %r11 adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rsp), %rdx + movq 48(%rsp), %rdx mulxq 8(%r8), %rcx, %rbx adcxq %r15, %r13 adoxq %rcx, %r12 @@ -11530,22 +10728,22 @@ xorq %r15, %r15 adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rsp), %rdx + movq 40(%rsp), %rdx mulxq 8(%r8), %rdx, %rcx adcxq %rbx, %r12 adoxq %rdx, %r11 - # A[3] * B[1] - movq 8(%rsp), %rdx + # A[1] * B[3] + movq 56(%rsp), %rdx adoxq %rcx, %r12 - mulxq 24(%r8), %rcx, %rbx + mulxq 8(%r8), %rcx, %rbx adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rsp), %rdx + movq 48(%rsp), %rdx mulxq 16(%r8), %rdx, %rcx adcxq %rbx, %r14 adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rsp), %rdx + movq 56(%rsp), %rdx adoxq %rcx, %r14 mulxq 24(%r8), %rcx, %rbx adoxq %rbp, %r15 @@ -11556,34 +10754,33 @@ xorq %rbx, %rbx adcxq %rdx, %r12 # A[3] * B[0] - movq (%rsp), %rdx + movq 24(%r8), %rdx adcxq %rcx, %r13 - mulxq 24(%r8), %rdx, %rcx + mulxq 32(%rsp), %rdx, %rcx adoxq %rdx, %r12 adoxq %rcx, %r13 - # A[2] * B[3] - movq 24(%rsp), %rdx - mulxq 16(%r8), %rdx, %rcx - adcxq %rdx, %r14 # A[3] * B[2] - movq 16(%rsp), %rdx + movq 24(%r8), %rdx + mulxq 48(%rsp), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 56(%rsp), %rdx adcxq %rcx, %r15 - mulxq 24(%r8), %rcx, %rdx + mulxq 16(%r8), %rcx, %rdx adcxq %rbx, %rbp adoxq %rcx, %r14 adoxq %rdx, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rcx + addq %rbp, %r12 + adcq $0x00, %rcx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx andq %rbx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rbx, %rbx + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 @@ -11593,28 +10790,7 @@ mulxq %r15, %rcx, %r15 adcxq %rcx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rbx, %rdx - adcxq %rbx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rbx - imulq $19, %rdx, %rcx - andq %rbx, %r12 - addq %rcx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rbx, %r12 # Store movq %r9, 32(%rsp) movq %r10, 40(%rsp) @@ -11630,12 +10806,11 @@ mulxq 136(%rsp), %rcx, %rbx xorq %rbp, %rbp adcxq %rcx, %r10 - # A[1] * B[3] - movq 120(%rsp), %rdx - mulxq 136(%rsp), %r13, %r14 + # A[3] * B[1] + movq 104(%rsp), %rdx + mulxq 152(%rsp), %r13, %r14 adcxq %rbx, %r11 # A[0] * B[1] - movq 104(%rsp), %rdx mulxq 128(%rsp), %rcx, %rbx adoxq %rcx, %r10 # A[2] * B[1] @@ -11659,10 +10834,10 @@ mulxq 136(%rsp), %rdx, %rcx adcxq %rbx, %r12 adoxq %rdx, %r11 - # A[3] * B[1] - movq 104(%rsp), %rdx + # A[1] * B[3] + movq 120(%rsp), %rdx adoxq %rcx, %r12 - mulxq 152(%rsp), %rcx, %rbx + mulxq 136(%rsp), %rcx, %rbx adcxq %rcx, %r13 # A[2] * B[2] movq 112(%rsp), %rdx @@ -11681,34 +10856,33 @@ xorq %rbx, %rbx adcxq %rdx, %r12 # A[3] * B[0] - movq 96(%rsp), %rdx + movq 152(%rsp), %rdx adcxq %rcx, %r13 - mulxq 152(%rsp), %rdx, %rcx + mulxq 96(%rsp), %rdx, %rcx adoxq %rdx, %r12 adoxq %rcx, %r13 + # A[3] * B[2] + movq 152(%rsp), %rdx + mulxq 112(%rsp), %rdx, %rcx + adcxq %rdx, %r14 # A[2] * B[3] movq 120(%rsp), %rdx - mulxq 144(%rsp), %rdx, %rcx - adcxq %rdx, %r14 - # A[3] * B[2] - movq 112(%rsp), %rdx adcxq %rcx, %r15 - mulxq 152(%rsp), %rcx, %rdx + mulxq 144(%rsp), %rcx, %rdx adcxq %rbx, %rbp adoxq %rcx, %r14 adoxq %rdx, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rcx + addq %rbp, %r12 + adcq $0x00, %rcx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx andq %rbx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rbx, %rbx + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 @@ -11718,38 +10892,15 @@ mulxq %r15, %rcx, %r15 adcxq %rcx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rbx, %rdx - adcxq %rbx, %rdx - # Overflow - shldq $0x01, %r12, %rdx - movq $0x7fffffffffffffff, %rbx - imulq $19, %rdx, %rcx - andq %rbx, %r12 - addq %rcx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set - movq %r12, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rbx, %r12 - addq %rdx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 + adcxq %rbx, %r12 # Store movq %r9, (%rsp) movq %r10, 8(%rsp) movq %r11, 16(%rsp) movq %r12, 24(%rsp) - decb 168(%rsp) + movq 160(%rsp), %rbx + decq %rbx jge L_curve25519_avx2_bits - movq $63, 168(%rsp) - decb 160(%rsp) - jge L_curve25519_avx2_words # Invert leaq 32(%rsp), %rdi movq %rsp, %rsi @@ -11987,7 +11138,7 @@ #else callq _fe_mul_avx2 #endif /* __APPLE__ */ - movq 176(%rsp), %rdi + movq 168(%rsp), %rdi # Multiply # A[0] * B[0] movq (%rsp), %rdx @@ -11998,12 +11149,11 @@ mulxq 8(%rdi), %rcx, %rbx xorq %rbp, %rbp adcxq %rcx, %r10 - # A[1] * B[3] - movq 24(%rsp), %rdx - mulxq 8(%rdi), %r13, %r14 + # A[3] * B[1] + movq 8(%rsp), %rdx + mulxq 24(%rdi), %r13, %r14 adcxq %rbx, %r11 # A[0] * B[1] - movq 8(%rsp), %rdx mulxq (%rdi), %rcx, %rbx adoxq %rcx, %r10 # A[2] * B[1] @@ -12027,10 +11177,10 @@ mulxq 8(%rdi), %rdx, %rcx adcxq %rbx, %r12 adoxq %rdx, %r11 - # A[3] * B[1] - movq 8(%rsp), %rdx + # A[1] * B[3] + movq 24(%rsp), %rdx adoxq %rcx, %r12 - mulxq 24(%rdi), %rcx, %rbx + mulxq 8(%rdi), %rcx, %rbx adcxq %rcx, %r13 # A[2] * B[2] movq 16(%rsp), %rdx @@ -12049,34 +11199,33 @@ xorq %rbx, %rbx adcxq %rdx, %r12 # A[3] * B[0] - movq (%rsp), %rdx + movq 24(%rdi), %rdx adcxq %rcx, %r13 - mulxq 24(%rdi), %rdx, %rcx + mulxq (%rsp), %rdx, %rcx adoxq %rdx, %r12 adoxq %rcx, %r13 + # A[3] * B[2] + movq 24(%rdi), %rdx + mulxq 16(%rsp), %rdx, %rcx + adcxq %rdx, %r14 # A[2] * B[3] movq 24(%rsp), %rdx - mulxq 16(%rdi), %rdx, %rcx - adcxq %rdx, %r14 - # A[3] * B[2] - movq 16(%rsp), %rdx adcxq %rcx, %r15 - mulxq 24(%rdi), %rcx, %rdx + mulxq 16(%rdi), %rcx, %rdx adcxq %rbx, %rbp adoxq %rcx, %r14 adoxq %rdx, %r15 adoxq %rbx, %rbp - # Reduce + movq $38, %rdx + mulxq %rbp, %rbp, %rcx + addq %rbp, %r12 + adcq $0x00, %rcx movq $0x7fffffffffffffff, %rbx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r15, %rbp - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx andq %rbx, %r12 - # Multiply top half by 19 - movq $19, %rdx xorq %rbx, %rbx + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 @@ -12086,20 +11235,8 @@ mulxq %r15, %rcx, %r15 adcxq %rcx, %r11 adoxq %r15, %r12 - mulxq %rbp, %rbp, %rdx - adcxq %rbp, %r12 - adoxq %rbx, %rdx - adcxq %rbx, %rdx - # Overflow - shldq $0x01, %r12, %rdx + adcxq %rbx, %r12 movq $0x7fffffffffffffff, %rbx - imulq $19, %rdx, %rcx - andq %rbx, %r12 - addq %rcx, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - adcq $0x00, %r12 - # Reduce if top bit set movq %r12, %rdx sarq $63, %rdx andq $19, %rdx @@ -12108,7 +11245,7 @@ adcq $0x00, %r10 adcq $0x00, %r11 adcq $0x00, %r12 - movq $0x7fffffffffffffff, %rbx + movq $0x7fffffffffffffff, %rcx movq %r9, %rdx addq $19, %rdx movq %r10, %rdx @@ -12119,18 +11256,18 @@ adcq $0x00, %rdx sarq $63, %rdx andq $19, %rdx + andq %rcx, %r12 addq %rdx, %r9 adcq $0x00, %r10 adcq $0x00, %r11 adcq $0x00, %r12 - andq %rbx, %r12 # Store movq %r9, (%rdi) movq %r10, 8(%rdi) movq %r11, 16(%rdi) movq %r12, 24(%rdi) xorq %rax, %rax - addq $0xc0, %rsp + addq $0xb8, %rsp popq %rbp popq %r15 popq %r14 @@ -12141,6 +11278,126 @@ #ifndef __APPLE__ .size curve25519_avx2,.-curve25519_avx2 #endif /* __APPLE__ */ +#ifdef HAVE_ED25519 +#ifndef __APPLE__ +.text +.globl fe_sq2_avx2 +.type fe_sq2_avx2,@function +.align 16 +fe_sq2_avx2: +#else +.section __TEXT,__text +.globl _fe_sq2_avx2 +.p2align 4 +_fe_sq2_avx2: +#endif /* __APPLE__ */ + pushq %rbx + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + # Square * 2 + movq (%rsi), %rdx + movq 8(%rsi), %rax + # A[0] * A[1] + movq %rdx, %r15 + mulxq %rax, %r9, %r10 + # A[0] * A[3] + mulxq 24(%rsi), %r11, %r12 + # A[2] * A[1] + movq 16(%rsi), %rdx + mulxq %rax, %rcx, %rbx + xorq %r8, %r8 + adoxq %rcx, %r11 + # A[2] * A[3] + mulxq 24(%rsi), %r13, %r14 + adoxq %rbx, %r12 + # A[2] * A[0] + mulxq %r15, %rcx, %rbx + adoxq %r8, %r13 + adcxq %rcx, %r10 + adoxq %r8, %r14 + # A[1] * A[3] + movq %rax, %rdx + mulxq 24(%rsi), %rcx, %rdx + adcxq %rbx, %r11 + adcxq %rcx, %r12 + adcxq %rdx, %r13 + adcxq %r8, %r14 + # A[0] * A[0] + movq %r15, %rdx + mulxq %rdx, %r8, %rcx + xorq %r15, %r15 + adcxq %r9, %r9 + # A[1] * A[1] + movq %rax, %rdx + adoxq %rcx, %r9 + mulxq %rdx, %rcx, %rbx + adcxq %r10, %r10 + adoxq %rcx, %r10 + adcxq %r11, %r11 + # A[2] * A[2] + movq 16(%rsi), %rdx + adoxq %rbx, %r11 + mulxq %rdx, %rbx, %rcx + adcxq %r12, %r12 + adoxq %rbx, %r12 + adcxq %r13, %r13 + # A[3] * A[3] + movq 24(%rsi), %rdx + adoxq %rcx, %r13 + mulxq %rdx, %rcx, %rbx + adcxq %r14, %r14 + adoxq %rcx, %r14 + adcxq %r15, %r15 + adoxq %rbx, %r15 + movq $38, %rdx + mulxq %r15, %r15, %rax + addq %r15, %r11 + adcq $0x00, %rax + movq $0x7fffffffffffffff, %rcx + shldq $0x01, %r11, %rax + imulq $19, %rax, %rax + andq %rcx, %r11 + xorq %rcx, %rcx + adoxq %rax, %r8 + mulxq %r12, %rax, %r12 + adcxq %rax, %r8 + adoxq %r12, %r9 + mulxq %r13, %rax, %r13 + adcxq %rax, %r9 + adoxq %r13, %r10 + mulxq %r14, %rax, %r14 + adcxq %rax, %r10 + adoxq %r14, %r11 + adcxq %rcx, %r11 + movq %r11, %rax + shldq $0x01, %r10, %r11 + shldq $0x01, %r9, %r10 + shldq $0x01, %r8, %r9 + shlq $0x01, %r8 + movq $0x7fffffffffffffff, %rcx + shrq $62, %rax + andq %rcx, %r11 + imulq $19, %rax, %rax + addq %rax, %r8 + adcq $0x00, %r9 + adcq $0x00, %r10 + adcq $0x00, %r11 + # Store + movq %r8, (%rdi) + movq %r9, 8(%rdi) + movq %r10, 16(%rdi) + movq %r11, 24(%rdi) + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbx + repz retq +#ifndef __APPLE__ +.size fe_sq2_avx2,.-fe_sq2_avx2 +#endif /* __APPLE__ */ #ifndef __APPLE__ .text .globl fe_pow22523_avx2 @@ -12218,7 +11475,7 @@ #endif /* __APPLE__ */ leaq 32(%rsp), %rdi leaq 32(%rsp), %rsi - movb $4, %dl + movq $4, %rdx #ifndef __APPLE__ callq fe_sq_n_avx2@plt #else @@ -12241,7 +11498,7 @@ #endif /* __APPLE__ */ leaq 32(%rsp), %rdi leaq 32(%rsp), %rsi - movb $9, %dl + movq $9, %rdx #ifndef __APPLE__ callq fe_sq_n_avx2@plt #else @@ -12264,7 +11521,7 @@ #endif /* __APPLE__ */ leaq 64(%rsp), %rdi leaq 64(%rsp), %rsi - movb $19, %dl + movq $19, %rdx #ifndef __APPLE__ callq fe_sq_n_avx2@plt #else @@ -12287,7 +11544,7 @@ #endif /* __APPLE__ */ leaq 32(%rsp), %rdi leaq 32(%rsp), %rsi - movb $9, %dl + movq $9, %rdx #ifndef __APPLE__ callq fe_sq_n_avx2@plt #else @@ -12310,7 +11567,7 @@ #endif /* __APPLE__ */ leaq 32(%rsp), %rdi leaq 32(%rsp), %rsi - movb $49, %dl + movq $49, %rdx #ifndef __APPLE__ callq fe_sq_n_avx2@plt #else @@ -12333,7 +11590,7 @@ #endif /* __APPLE__ */ leaq 64(%rsp), %rdi leaq 64(%rsp), %rsi - movb $0x63, %dl + movq $0x63, %rdx #ifndef __APPLE__ callq fe_sq_n_avx2@plt #else @@ -12356,7 +11613,7 @@ #endif /* __APPLE__ */ leaq 32(%rsp), %rdi leaq 32(%rsp), %rsi - movb $49, %dl + movq $49, %rdx #ifndef __APPLE__ callq fe_sq_n_avx2@plt #else @@ -12398,4197 +11655,3916 @@ repz retq #ifndef __APPLE__ .text -.globl fe_ge_to_p2_avx2 -.type fe_ge_to_p2_avx2,@function +.globl ge_p1p1_to_p2_avx2 +.type ge_p1p1_to_p2_avx2,@function .align 16 -fe_ge_to_p2_avx2: +ge_p1p1_to_p2_avx2: #else .section __TEXT,__text -.globl _fe_ge_to_p2_avx2 +.globl _ge_p1p1_to_p2_avx2 .p2align 4 -_fe_ge_to_p2_avx2: +_ge_p1p1_to_p2_avx2: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $40, %rsp - movq %rsi, (%rsp) - movq %rdx, 8(%rsp) - movq %rcx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - movq 16(%rsp), %rsi - movq 88(%rsp), %rbx + pushq %rbx + subq $16, %rsp + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + leaq 96(%rsi), %rax # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r9, %r10 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rsi), %r11, %r12 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %rcx, %r8 + xorq %rbx, %rbx + adcxq %rcx, %r10 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r13, %r14 + adcxq %r8, %r11 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %rcx, %r8 + adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %rcx, %r15 + adoxq %r8, %r11 + adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq 8(%rsi), %rcx, %r8 adcxq %r15, %r13 - adoxq %rax, %r12 + adoxq %rcx, %r12 + adcxq %rbx, %r14 + adoxq %r8, %r13 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %rcx, %r8 + adoxq %rbx, %r14 + xorq %r15, %r15 + adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rbx), %rdx + movq 8(%rax), %rdx mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 + adcxq %r8, %r12 + adoxq %rdx, %r11 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %rcx, %r12 + mulxq 8(%rsi), %rcx, %r8 + adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rbx), %rdx + movq 16(%rax), %rdx mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 - adoxq %rdx, %r12 + adcxq %r8, %r14 + adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %rcx, %r14 + mulxq 24(%rsi), %rcx, %r8 + adoxq %rbx, %r15 + adcxq %rcx, %r15 # A[0] * B[3] mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + adcxq %r8, %rbx + xorq %r8, %r8 + adcxq %rdx, %r12 # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 + movq 24(%rsi), %rdx + adcxq %rcx, %r13 + mulxq (%rax), %rdx, %rcx + adoxq %rdx, %r12 adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %rcx, %r15 + mulxq 16(%rsi), %rcx, %rdx + adcxq %r8, %rbx + adoxq %rcx, %r14 + adoxq %rdx, %r15 + adoxq %r8, %rbx + movq $38, %rdx + mulxq %rbx, %rbx, %rcx + addq %rbx, %r12 + adcq $0x00, %rcx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx + andq %r8, %r12 + xorq %r8, %r8 + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 mulxq %r14, %rcx, %r14 adcxq %rcx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %rcx, %r15 + adcxq %rcx, %r11 + adoxq %r15, %r12 + adcxq %r8, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 24(%rsp), %rsi - movq 32(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + leaq 64(%rsi), %rsi + leaq 64(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r9, %r10 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rsi), %r11, %r12 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %rcx, %r8 + xorq %rbx, %rbx + adcxq %rcx, %r10 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r13, %r14 + adcxq %r8, %r11 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %rcx, %r8 + adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %rcx, %r15 + adoxq %r8, %r11 + adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq 8(%rsi), %rcx, %r8 adcxq %r15, %r13 - adoxq %rax, %r12 + adoxq %rcx, %r12 + adcxq %rbx, %r14 + adoxq %r8, %r13 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %rcx, %r8 + adoxq %rbx, %r14 + xorq %r15, %r15 + adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rbx), %rdx + movq 8(%rax), %rdx mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 + adcxq %r8, %r12 + adoxq %rdx, %r11 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %rcx, %r12 + mulxq 8(%rsi), %rcx, %r8 + adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rbx), %rdx + movq 16(%rax), %rdx mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 - adoxq %rdx, %r12 + adcxq %r8, %r14 + adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %rcx, %r14 + mulxq 24(%rsi), %rcx, %r8 + adoxq %rbx, %r15 + adcxq %rcx, %r15 # A[0] * B[3] mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + adcxq %r8, %rbx + xorq %r8, %r8 + adcxq %rdx, %r12 # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 + movq 24(%rsi), %rdx + adcxq %rcx, %r13 + mulxq (%rax), %rdx, %rcx + adoxq %rdx, %r12 adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %rcx, %r15 + mulxq 16(%rsi), %rcx, %rdx + adcxq %r8, %rbx + adoxq %rcx, %r14 + adoxq %rdx, %r15 + adoxq %r8, %rbx + movq $38, %rdx + mulxq %rbx, %rbx, %rcx + addq %rbx, %r12 + adcq $0x00, %rcx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx + andq %r8, %r12 + xorq %r8, %r8 + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 mulxq %r14, %rcx, %r14 adcxq %rcx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %rcx, %r15 + adcxq %rcx, %r11 + adoxq %r15, %r12 + adcxq %r8, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 88(%rsp), %rsi + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + leaq -32(%rsi), %rax + leaq -32(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rsi), %rdx - mulxq (%rbx), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r9, %r10 # A[2] * B[0] - mulxq 16(%rbx), %r10, %r11 + mulxq 16(%rsi), %r11, %r12 # A[1] * B[0] - mulxq 8(%rbx), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rsi), %rdx - mulxq 8(%rbx), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %rcx, %r8 + xorq %rbx, %rbx + adcxq %rcx, %r10 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r13, %r14 + adcxq %r8, %r11 # A[0] * B[1] - movq 8(%rsi), %rdx - mulxq (%rbx), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %rcx, %r8 + adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rbx), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %rcx, %r15 + adoxq %r8, %r11 + adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rsi), %rdx - mulxq 8(%rbx), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq 8(%rsi), %rcx, %r8 adcxq %r15, %r13 - adoxq %rax, %r12 + adoxq %rcx, %r12 + adcxq %rbx, %r14 + adoxq %r8, %r13 # A[0] * B[2] - mulxq (%rbx), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %rcx, %r8 + adoxq %rbx, %r14 + xorq %r15, %r15 + adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rsi), %rdx - mulxq 8(%rbx), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rsi), %rdx - adoxq %rcx, %r11 - mulxq 24(%rbx), %rcx, %rax - adcxq %rcx, %r12 + movq 8(%rax), %rdx + mulxq 8(%rsi), %rdx, %rcx + adcxq %r8, %r12 + adoxq %rdx, %r11 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %rcx, %r12 + mulxq 8(%rsi), %rcx, %r8 + adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rsi), %rdx - mulxq 16(%rbx), %rdx, %rcx - adcxq %rax, %r13 - adoxq %rdx, %r12 + movq 16(%rax), %rdx + mulxq 16(%rsi), %rdx, %rcx + adcxq %r8, %r14 + adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rsi), %rdx - adoxq %rcx, %r13 - mulxq 24(%rbx), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %rcx, %r14 + mulxq 24(%rsi), %rcx, %r8 + adoxq %rbx, %r15 + adcxq %rcx, %r15 # A[0] * B[3] - mulxq (%rbx), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + mulxq (%rsi), %rdx, %rcx + adcxq %r8, %rbx + xorq %r8, %r8 + adcxq %rdx, %r12 # A[3] * B[0] - movq (%rsi), %rdx - adcxq %rcx, %r12 - mulxq 24(%rbx), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] movq 24(%rsi), %rdx - mulxq 16(%rbx), %rdx, %rcx - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rsi), %rdx - adcxq %rcx, %r14 - mulxq 24(%rbx), %rcx, %rdx - adcxq %rax, %r15 + adcxq %rcx, %r13 + mulxq (%rax), %rdx, %rcx + adoxq %rdx, %r12 adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %rcx, %r15 + mulxq 16(%rsi), %rcx, %rdx + adcxq %r8, %rbx + adoxq %rcx, %r14 + adoxq %rdx, %r15 + adoxq %r8, %rbx + movq $38, %rdx + mulxq %rbx, %rbx, %rcx + addq %rbx, %r12 + adcq $0x00, %rcx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx + andq %r8, %r12 + xorq %r8, %r8 + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 mulxq %r14, %rcx, %r14 adcxq %rcx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %rcx, %r15 + adcxq %rcx, %r11 + adoxq %r15, %r12 + adcxq %r8, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $40, %rsp + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $16, %rsp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_to_p2_avx2,.-fe_ge_to_p2_avx2 +.size ge_p1p1_to_p2_avx2,.-ge_p1p1_to_p2_avx2 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_to_p3_avx2 -.type fe_ge_to_p3_avx2,@function +.globl ge_p1p1_to_p3_avx2 +.type ge_p1p1_to_p3_avx2,@function .align 16 -fe_ge_to_p3_avx2: +ge_p1p1_to_p3_avx2: #else .section __TEXT,__text -.globl _fe_ge_to_p3_avx2 +.globl _ge_p1p1_to_p3_avx2 .p2align 4 -_fe_ge_to_p3_avx2: +_ge_p1p1_to_p3_avx2: #endif /* __APPLE__ */ - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $40, %rsp - movq %rsi, (%rsp) - movq %rdx, 8(%rsp) - movq %rcx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - movq 24(%rsp), %rsi - movq 96(%rsp), %rbx + pushq %rbx + subq $16, %rsp + movq %rdi, (%rsp) + movq %rsi, 8(%rsp) + leaq 96(%rsi), %rax # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r9, %r10 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rsi), %r11, %r12 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %rcx, %r8 + xorq %rbx, %rbx + adcxq %rcx, %r10 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r13, %r14 + adcxq %r8, %r11 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %rcx, %r8 + adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %rcx, %r15 + adoxq %r8, %r11 + adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq 8(%rsi), %rcx, %r8 adcxq %r15, %r13 - adoxq %rax, %r12 + adoxq %rcx, %r12 + adcxq %rbx, %r14 + adoxq %r8, %r13 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %rcx, %r8 + adoxq %rbx, %r14 + xorq %r15, %r15 + adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rbx), %rdx + movq 8(%rax), %rdx mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 + adcxq %r8, %r12 + adoxq %rdx, %r11 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %rcx, %r12 + mulxq 8(%rsi), %rcx, %r8 + adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rbx), %rdx + movq 16(%rax), %rdx mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 - adoxq %rdx, %r12 + adcxq %r8, %r14 + adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %rcx, %r14 + mulxq 24(%rsi), %rcx, %r8 + adoxq %rbx, %r15 + adcxq %rcx, %r15 # A[0] * B[3] mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + adcxq %r8, %rbx + xorq %r8, %r8 + adcxq %rdx, %r12 # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 + movq 24(%rsi), %rdx + adcxq %rcx, %r13 + mulxq (%rax), %rdx, %rcx + adoxq %rdx, %r12 adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %rcx, %r15 + mulxq 16(%rsi), %rcx, %rdx + adcxq %r8, %rbx + adoxq %rcx, %r14 + adoxq %rdx, %r15 + adoxq %r8, %rbx + movq $38, %rdx + mulxq %rbx, %rbx, %rcx + addq %rbx, %r12 + adcq $0x00, %rcx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx + andq %r8, %r12 + xorq %r8, %r8 + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 mulxq %r14, %rcx, %r14 adcxq %rcx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %rcx, %r15 + adcxq %rcx, %r11 + adoxq %r15, %r12 + adcxq %r8, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq (%rsp), %rdi - movq 32(%rsp), %rsi - movq 88(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + leaq 32(%rsi), %rax + leaq 96(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r9, %r10 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rsi), %r11, %r12 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %rcx, %r8 + xorq %rbx, %rbx + adcxq %rcx, %r10 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r13, %r14 + adcxq %r8, %r11 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %rcx, %r8 + adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %rcx, %r15 + adoxq %r8, %r11 + adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq 8(%rsi), %rcx, %r8 adcxq %r15, %r13 - adoxq %rax, %r12 + adoxq %rcx, %r12 + adcxq %rbx, %r14 + adoxq %r8, %r13 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %rcx, %r8 + adoxq %rbx, %r14 + xorq %r15, %r15 + adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rbx), %rdx + movq 8(%rax), %rdx mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 + adcxq %r8, %r12 + adoxq %rdx, %r11 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %rcx, %r12 + mulxq 8(%rsi), %rcx, %r8 + adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rbx), %rdx + movq 16(%rax), %rdx mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 - adoxq %rdx, %r12 + adcxq %r8, %r14 + adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %rcx, %r14 + mulxq 24(%rsi), %rcx, %r8 + adoxq %rbx, %r15 + adcxq %rcx, %r15 # A[0] * B[3] mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + adcxq %r8, %rbx + xorq %r8, %r8 + adcxq %rdx, %r12 # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 + movq 24(%rsi), %rdx + adcxq %rcx, %r13 + mulxq (%rax), %rdx, %rcx + adoxq %rdx, %r12 adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %rcx, %r15 + mulxq 16(%rsi), %rcx, %rdx + adcxq %r8, %rbx + adoxq %rcx, %r14 + adoxq %rdx, %r15 + adoxq %r8, %rbx + movq $38, %rdx + mulxq %rbx, %rbx, %rcx + addq %rbx, %r12 + adcq $0x00, %rcx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx + andq %r8, %r12 + xorq %r8, %r8 + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 mulxq %r14, %rcx, %r14 adcxq %rcx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %rcx, %r15 + adcxq %rcx, %r11 + adoxq %r15, %r12 + adcxq %r8, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq 96(%rsp), %rsi + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + leaq 64(%rsi), %rsi + leaq -64(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rsi), %rdx - mulxq (%rbx), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r9, %r10 # A[2] * B[0] - mulxq 16(%rbx), %r10, %r11 + mulxq 16(%rsi), %r11, %r12 # A[1] * B[0] - mulxq 8(%rbx), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rsi), %rdx - mulxq 8(%rbx), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %rcx, %r8 + xorq %rbx, %rbx + adcxq %rcx, %r10 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r13, %r14 + adcxq %r8, %r11 # A[0] * B[1] - movq 8(%rsi), %rdx - mulxq (%rbx), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %rcx, %r8 + adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rbx), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %rcx, %r15 + adoxq %r8, %r11 + adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rsi), %rdx - mulxq 8(%rbx), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq 8(%rsi), %rcx, %r8 adcxq %r15, %r13 - adoxq %rax, %r12 + adoxq %rcx, %r12 + adcxq %rbx, %r14 + adoxq %r8, %r13 # A[0] * B[2] - mulxq (%rbx), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %rcx, %r8 + adoxq %rbx, %r14 + xorq %r15, %r15 + adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rsi), %rdx - mulxq 8(%rbx), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rsi), %rdx - adoxq %rcx, %r11 - mulxq 24(%rbx), %rcx, %rax - adcxq %rcx, %r12 + movq 8(%rax), %rdx + mulxq 8(%rsi), %rdx, %rcx + adcxq %r8, %r12 + adoxq %rdx, %r11 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %rcx, %r12 + mulxq 8(%rsi), %rcx, %r8 + adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rsi), %rdx - mulxq 16(%rbx), %rdx, %rcx - adcxq %rax, %r13 - adoxq %rdx, %r12 + movq 16(%rax), %rdx + mulxq 16(%rsi), %rdx, %rcx + adcxq %r8, %r14 + adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rsi), %rdx - adoxq %rcx, %r13 - mulxq 24(%rbx), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %rcx, %r14 + mulxq 24(%rsi), %rcx, %r8 + adoxq %rbx, %r15 + adcxq %rcx, %r15 # A[0] * B[3] - mulxq (%rbx), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + mulxq (%rsi), %rdx, %rcx + adcxq %r8, %rbx + xorq %r8, %r8 + adcxq %rdx, %r12 # A[3] * B[0] - movq (%rsi), %rdx - adcxq %rcx, %r12 - mulxq 24(%rbx), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] movq 24(%rsi), %rdx - mulxq 16(%rbx), %rdx, %rcx - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rsi), %rdx - adcxq %rcx, %r14 - mulxq 24(%rbx), %rcx, %rdx - adcxq %rax, %r15 + adcxq %rcx, %r13 + mulxq (%rax), %rdx, %rcx + adoxq %rdx, %r12 adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %rcx, %r15 + mulxq 16(%rsi), %rcx, %rdx + adcxq %r8, %rbx + adoxq %rcx, %r14 + adoxq %rdx, %r15 + adoxq %r8, %rbx + movq $38, %rdx + mulxq %rbx, %rbx, %rcx + addq %rbx, %r12 + adcq $0x00, %rcx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx + andq %r8, %r12 + xorq %r8, %r8 + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 mulxq %r14, %rcx, %r14 adcxq %rcx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %rcx, %r15 + adcxq %rcx, %r11 + adoxq %r15, %r12 + adcxq %r8, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq 24(%rsp), %rsi - movq 32(%rsp), %rbx + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + leaq 32(%rsi), %rax + leaq 32(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r9, %r10 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rsi), %r11, %r12 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %rcx, %r8 + xorq %rbx, %rbx + adcxq %rcx, %r10 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r13, %r14 + adcxq %r8, %r11 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %rcx, %r8 + adoxq %rcx, %r10 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %rcx, %r15 + adoxq %r8, %r11 + adcxq %rcx, %r12 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq 8(%rsi), %rcx, %r8 adcxq %r15, %r13 - adoxq %rax, %r12 + adoxq %rcx, %r12 + adcxq %rbx, %r14 + adoxq %r8, %r13 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %rcx, %r8 + adoxq %rbx, %r14 + xorq %r15, %r15 + adcxq %rcx, %r11 # A[1] * B[1] - movq 8(%rbx), %rdx + movq 8(%rax), %rdx mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 + adcxq %r8, %r12 + adoxq %rdx, %r11 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %rcx, %r12 + mulxq 8(%rsi), %rcx, %r8 + adcxq %rcx, %r13 # A[2] * B[2] - movq 16(%rbx), %rdx + movq 16(%rax), %rdx mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 - adoxq %rdx, %r12 + adcxq %r8, %r14 + adoxq %rdx, %r13 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %rcx, %r14 + mulxq 24(%rsi), %rcx, %r8 + adoxq %rbx, %r15 + adcxq %rcx, %r15 # A[0] * B[3] mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + adcxq %r8, %rbx + xorq %r8, %r8 + adcxq %rdx, %r12 # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rdx, %r13 - # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 + movq 24(%rsi), %rdx + adcxq %rcx, %r13 + mulxq (%rax), %rdx, %rcx + adoxq %rdx, %r12 adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %rcx + adcxq %rdx, %r14 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %rcx, %r15 + mulxq 16(%rsi), %rcx, %rdx + adcxq %r8, %rbx + adoxq %rcx, %r14 + adoxq %rdx, %r15 + adoxq %r8, %rbx + movq $38, %rdx + mulxq %rbx, %rbx, %rcx + addq %rbx, %r12 + adcq $0x00, %rcx + movq $0x7fffffffffffffff, %r8 + shldq $0x01, %r12, %rcx + imulq $19, %rcx, %rcx + andq %r8, %r12 + xorq %r8, %r8 + adoxq %rcx, %r9 mulxq %r13, %rcx, %r13 adcxq %rcx, %r9 adoxq %r13, %r10 mulxq %r14, %rcx, %r14 adcxq %rcx, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %rcx, %r15 + adcxq %rcx, %r11 + adoxq %r15, %r12 + adcxq %r8, %r12 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - addq $40, %rsp + movq %r9, (%rdi) + movq %r10, 8(%rdi) + movq %r11, 16(%rdi) + movq %r12, 24(%rdi) + addq $16, %rsp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_to_p3_avx2,.-fe_ge_to_p3_avx2 +.size ge_p1p1_to_p3_avx2,.-ge_p1p1_to_p3_avx2 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_dbl_avx2 -.type fe_ge_dbl_avx2,@function +.globl ge_p2_dbl_avx2 +.type ge_p2_dbl_avx2,@function .align 16 -fe_ge_dbl_avx2: +ge_p2_dbl_avx2: #else .section __TEXT,__text -.globl _fe_ge_dbl_avx2 +.globl _ge_p2_dbl_avx2 .p2align 4 -_fe_ge_dbl_avx2: +_ge_p2_dbl_avx2: #endif /* __APPLE__ */ - pushq %rbp - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $48, %rsp + pushq %rbx + pushq %rbp + subq $16, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq 32(%rsp), %rsi + leaq 64(%rdi), %rdi # Square - # A[0] * A[1] movq (%rsi), %rdx - mulxq 8(%rsi), %r9, %r10 + movq 8(%rsi), %r9 + # A[0] * A[1] + movq %rdx, %rbp + mulxq %r9, %r11, %r12 # A[0] * A[3] - mulxq 24(%rsi), %r11, %r12 + mulxq 24(%rsi), %r13, %r14 # A[2] * A[1] movq 16(%rsi), %rdx - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adoxq %rcx, %r11 + mulxq %r9, %rcx, %r8 + xorq %r10, %r10 + adoxq %rcx, %r13 # A[2] * A[3] - mulxq 24(%rsi), %r13, %r14 - adoxq %rax, %r12 + mulxq 24(%rsi), %r15, %rbx + adoxq %r8, %r14 # A[2] * A[0] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - adcxq %rcx, %r10 - adoxq %r15, %r14 + mulxq %rbp, %rcx, %r8 + adoxq %r10, %r15 + adcxq %rcx, %r12 + adoxq %r10, %rbx # A[1] * A[3] - movq 8(%rsi), %rdx - mulxq 24(%rsi), %rbp, %r8 - adcxq %rax, %r11 - adcxq %rbp, %r12 + movq %r9, %rdx + mulxq 24(%rsi), %rcx, %rdx adcxq %r8, %r13 - adcxq %r15, %r14 - # Double with Carry Flag - xorq %r15, %r15 + adcxq %rcx, %r14 + adcxq %rdx, %r15 + adcxq %r10, %rbx # A[0] * A[0] - movq (%rsi), %rdx - mulxq %rdx, %r8, %rbp - adcxq %r9, %r9 - # A[1] * A[1] - movq 8(%rsi), %rdx - mulxq %rdx, %rcx, %rax - adcxq %r10, %r10 - adoxq %rbp, %r9 + movq %rbp, %rdx + mulxq %rdx, %r10, %rcx + xorq %rbp, %rbp adcxq %r11, %r11 - adoxq %rcx, %r10 - # A[2] * A[2] - movq 16(%rsi), %rdx - mulxq %rdx, %rbp, %rcx + # A[1] * A[1] + movq %r9, %rdx + adoxq %rcx, %r11 + mulxq %rdx, %rcx, %r8 adcxq %r12, %r12 - adoxq %rax, %r11 + adoxq %rcx, %r12 adcxq %r13, %r13 - adoxq %rbp, %r12 - # A[3] * A[3] - movq 24(%rsi), %rdx - mulxq %rdx, %rbp, %rax + # A[2] * A[2] + movq 16(%rsi), %rdx + adoxq %r8, %r13 + mulxq %rdx, %r8, %rcx adcxq %r14, %r14 - adoxq %rcx, %r13 + adoxq %r8, %r14 adcxq %r15, %r15 - adoxq %rbp, %r14 - adoxq %rax, %r15 - # Reduce + # A[3] * A[3] + movq 24(%rsi), %rdx + adoxq %rcx, %r15 + mulxq %rdx, %rcx, %r8 + adcxq %rbx, %rbx + adoxq %rcx, %rbx + adcxq %rbp, %rbp + adoxq %r8, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rdx + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %rcx, %r13 xorq %rcx, %rcx - mulxq %r12, %rbp, %r12 - adcxq %rbp, %r8 - adoxq %r12, %r9 - mulxq %r13, %rbp, %r13 - adcxq %rbp, %r9 - adoxq %r13, %r10 - mulxq %r14, %rbp, %r14 - adcxq %rbp, %r10 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rbp - andq %rcx, %r11 - addq %rbp, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %rcx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 16(%rsp), %rdi - movq 40(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq 32(%rsi), %rsi # Square + movq (%rsi), %rdx + movq 8(%rsi), %r9 # A[0] * A[1] - movq (%rbx), %rdx - mulxq 8(%rbx), %r9, %r10 + movq %rdx, %rbp + mulxq %r9, %r11, %r12 # A[0] * A[3] - mulxq 24(%rbx), %r11, %r12 + mulxq 24(%rsi), %r13, %r14 # A[2] * A[1] - movq 16(%rbx), %rdx - mulxq 8(%rbx), %rcx, %rax - xorq %r15, %r15 - adoxq %rcx, %r11 + movq 16(%rsi), %rdx + mulxq %r9, %rcx, %r8 + xorq %r10, %r10 + adoxq %rcx, %r13 # A[2] * A[3] - mulxq 24(%rbx), %r13, %r14 - adoxq %rax, %r12 + mulxq 24(%rsi), %r15, %rbx + adoxq %r8, %r14 # A[2] * A[0] - mulxq (%rbx), %rcx, %rax - adoxq %r15, %r13 - adcxq %rcx, %r10 - adoxq %r15, %r14 + mulxq %rbp, %rcx, %r8 + adoxq %r10, %r15 + adcxq %rcx, %r12 + adoxq %r10, %rbx # A[1] * A[3] - movq 8(%rbx), %rdx - mulxq 24(%rbx), %rbp, %r8 - adcxq %rax, %r11 - adcxq %rbp, %r12 + movq %r9, %rdx + mulxq 24(%rsi), %rcx, %rdx adcxq %r8, %r13 - adcxq %r15, %r14 - # Double with Carry Flag - xorq %r15, %r15 + adcxq %rcx, %r14 + adcxq %rdx, %r15 + adcxq %r10, %rbx # A[0] * A[0] - movq (%rbx), %rdx - mulxq %rdx, %r8, %rbp - adcxq %r9, %r9 - # A[1] * A[1] - movq 8(%rbx), %rdx - mulxq %rdx, %rcx, %rax - adcxq %r10, %r10 - adoxq %rbp, %r9 + movq %rbp, %rdx + mulxq %rdx, %r10, %rcx + xorq %rbp, %rbp adcxq %r11, %r11 - adoxq %rcx, %r10 - # A[2] * A[2] - movq 16(%rbx), %rdx - mulxq %rdx, %rbp, %rcx + # A[1] * A[1] + movq %r9, %rdx + adoxq %rcx, %r11 + mulxq %rdx, %rcx, %r8 adcxq %r12, %r12 - adoxq %rax, %r11 + adoxq %rcx, %r12 adcxq %r13, %r13 - adoxq %rbp, %r12 - # A[3] * A[3] - movq 24(%rbx), %rdx - mulxq %rdx, %rbp, %rax + # A[2] * A[2] + movq 16(%rsi), %rdx + adoxq %r8, %r13 + mulxq %rdx, %r8, %rcx adcxq %r14, %r14 - adoxq %rcx, %r13 + adoxq %r8, %r14 adcxq %r15, %r15 - adoxq %rbp, %r14 - adoxq %rax, %r15 - # Reduce + # A[3] * A[3] + movq 24(%rsi), %rdx + adoxq %rcx, %r15 + mulxq %rdx, %rcx, %r8 + adcxq %rbx, %rbx + adoxq %rcx, %rbx + adcxq %rbp, %rbp + adoxq %r8, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rdx + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %rcx, %r13 xorq %rcx, %rcx - mulxq %r12, %rbp, %r12 - adcxq %rbp, %r8 - adoxq %r12, %r9 - mulxq %r13, %rbp, %r13 - adcxq %rbp, %r9 - adoxq %r13, %r10 - mulxq %r14, %rbp, %r14 - adcxq %rbp, %r10 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rbp - andq %rcx, %r11 - addq %rbp, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %rcx, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi + movq %rdi, %rsi + leaq -32(%rdi), %rdi + # Add-Sub # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq (%rbx), %r8 - movq 16(%rsi), %r10 - adcq 8(%rbx), %r9 - movq 24(%rsi), %rdx - adcq 16(%rbx), %r10 - movq $-19, %rcx - adcq 24(%rbx), %rdx - movq $0x7fffffffffffffff, %rax - movq %rdx, %r11 - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + movq %r10, %r14 + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %rcx + adcq $0x00, %rcx + shldq $0x01, %r13, %rcx + movq $0x7fffffffffffffff, %r8 + imulq $19, %rcx + andq %r8, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 24(%rsp), %rsi + addq %rcx, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %rcx, %rcx + shldq $0x01, %rbp, %rcx + imulq $-19, %rcx + andq %r8, %rbp + # Add modulus (if underflow) + subq %rcx, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 8(%rsp), %rax + leaq 32(%rax), %rsi + leaq -32(%rdi), %rdi + # Add + movq (%rsi), %r10 + movq 8(%rsi), %r11 + addq (%rax), %r10 + movq 16(%rsi), %r12 + adcq 8(%rax), %r11 + movq 24(%rsi), %r13 + adcq 16(%rax), %r12 + adcq 24(%rax), %r13 + movq $0x00, %rcx + adcq $0x00, %rcx + shldq $0x01, %r13, %rcx + movq $0x7fffffffffffffff, %r8 + imulq $19, %rcx + andq %r8, %r13 + # Sub modulus (if overflow) + addq %rcx, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) # Square - # A[0] * A[1] movq (%rdi), %rdx - mulxq 8(%rdi), %r9, %r10 + movq 8(%rdi), %r9 + # A[0] * A[1] + movq %rdx, %rbp + mulxq %r9, %r11, %r12 # A[0] * A[3] - mulxq 24(%rdi), %r11, %r12 + mulxq 24(%rdi), %r13, %r14 # A[2] * A[1] movq 16(%rdi), %rdx - mulxq 8(%rdi), %rcx, %rax - xorq %r15, %r15 - adoxq %rcx, %r11 + mulxq %r9, %rcx, %r8 + xorq %r10, %r10 + adoxq %rcx, %r13 # A[2] * A[3] - mulxq 24(%rdi), %r13, %r14 - adoxq %rax, %r12 + mulxq 24(%rdi), %r15, %rbx + adoxq %r8, %r14 # A[2] * A[0] - mulxq (%rdi), %rcx, %rax - adoxq %r15, %r13 - adcxq %rcx, %r10 - adoxq %r15, %r14 + mulxq %rbp, %rcx, %r8 + adoxq %r10, %r15 + adcxq %rcx, %r12 + adoxq %r10, %rbx # A[1] * A[3] - movq 8(%rdi), %rdx - mulxq 24(%rdi), %rbp, %r8 - adcxq %rax, %r11 - adcxq %rbp, %r12 + movq %r9, %rdx + mulxq 24(%rdi), %rcx, %rdx adcxq %r8, %r13 - adcxq %r15, %r14 - # Double with Carry Flag - xorq %r15, %r15 + adcxq %rcx, %r14 + adcxq %rdx, %r15 + adcxq %r10, %rbx # A[0] * A[0] - movq (%rdi), %rdx - mulxq %rdx, %r8, %rbp - adcxq %r9, %r9 - # A[1] * A[1] - movq 8(%rdi), %rdx - mulxq %rdx, %rcx, %rax - adcxq %r10, %r10 - adoxq %rbp, %r9 + movq %rbp, %rdx + mulxq %rdx, %r10, %rcx + xorq %rbp, %rbp adcxq %r11, %r11 - adoxq %rcx, %r10 - # A[2] * A[2] - movq 16(%rdi), %rdx - mulxq %rdx, %rbp, %rcx + # A[1] * A[1] + movq %r9, %rdx + adoxq %rcx, %r11 + mulxq %rdx, %rcx, %r8 adcxq %r12, %r12 - adoxq %rax, %r11 + adoxq %rcx, %r12 adcxq %r13, %r13 - adoxq %rbp, %r12 - # A[3] * A[3] - movq 24(%rdi), %rdx - mulxq %rdx, %rbp, %rax + # A[2] * A[2] + movq 16(%rdi), %rdx + adoxq %r8, %r13 + mulxq %rdx, %r8, %rcx adcxq %r14, %r14 - adoxq %rcx, %r13 + adoxq %r8, %r14 adcxq %r15, %r15 - adoxq %rbp, %r14 - adoxq %rax, %r15 - # Reduce + # A[3] * A[3] + movq 24(%rdi), %rdx + adoxq %rcx, %r15 + mulxq %rdx, %rcx, %r8 + adcxq %rbx, %rbx + adoxq %rcx, %rbx + adcxq %rbp, %rbp + adoxq %r8, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 movq $0x7fffffffffffffff, %rcx - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rcx, %r11 - # Multiply top half by 19 - movq $19, %rdx + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %rcx, %r13 xorq %rcx, %rcx - mulxq %r12, %rbp, %r12 - adcxq %rbp, %r8 - adoxq %r12, %r9 - mulxq %r13, %rbp, %r13 - adcxq %rbp, %r9 - adoxq %r13, %r10 - mulxq %r14, %rbp, %r14 - adcxq %rbp, %r10 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rcx, %rdx - adcxq %rcx, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rcx - imulq $19, %rdx, %rbp - andq %rcx, %r11 - addq %rbp, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rcx, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %rcx, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 16(%rsp), %rsi - movq (%rsp), %rbx - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %rdx - movq %r8, %r12 - addq (%rbx), %r8 - movq %r9, %r13 - adcq 8(%rbx), %r9 - movq %r10, %r14 - adcq 16(%rbx), %r10 - movq %rdx, %r15 - adcq 24(%rbx), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + leaq 32(%rdi), %rsi # Sub - subq (%rbx), %r12 - movq $0x00, %rdx - sbbq 8(%rbx), %r13 - movq $-19, %rcx - sbbq 16(%rbx), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rbx), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq %r12, (%rsi) - movq %r13, 8(%rsi) - movq %r14, 16(%rsi) - movq %r15, 24(%rsi) - movq 24(%rsp), %rsi - # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rdi), %r8 - movq $0x00, %rdx - sbbq 8(%rdi), %r9 - movq $-19, %rcx - sbbq 16(%rdi), %r10 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rdi), %r11 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r10 + sbbq 8(%rsi), %r11 + sbbq 16(%rsi), %r12 + sbbq 24(%rsi), %r13 + sbbq %rcx, %rcx + shldq $0x01, %r13, %rcx + movq $0x7fffffffffffffff, %r8 + imulq $-19, %rcx + andq %r8, %r13 # Add modulus (if underflow) - addq %rcx, %r8 - adcq %rdx, %r9 - adcq %rdx, %r10 - adcq %rax, %r11 - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq 104(%rsp), %rdi + subq %rcx, %r10 + sbbq $0x00, %r11 + sbbq $0x00, %r12 + sbbq $0x00, %r13 + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq 64(%rax), %rax # Square * 2 + movq (%rax), %rdx + movq 8(%rax), %r9 # A[0] * A[1] - movq (%rdi), %rdx - mulxq 8(%rdi), %r9, %r10 + movq %rdx, %rbp + mulxq %r9, %r11, %r12 # A[0] * A[3] - mulxq 24(%rdi), %r11, %r12 + mulxq 24(%rax), %r13, %r14 # A[2] * A[1] - movq 16(%rdi), %rdx - mulxq 8(%rdi), %rcx, %rax - xorq %r15, %r15 - adoxq %rcx, %r11 + movq 16(%rax), %rdx + mulxq %r9, %rcx, %r8 + xorq %r10, %r10 + adoxq %rcx, %r13 # A[2] * A[3] - mulxq 24(%rdi), %r13, %r14 - adoxq %rax, %r12 + mulxq 24(%rax), %r15, %rbx + adoxq %r8, %r14 # A[2] * A[0] - mulxq (%rdi), %rcx, %rax - adoxq %r15, %r13 - adcxq %rcx, %r10 - adoxq %r15, %r14 + mulxq %rbp, %rcx, %r8 + adoxq %r10, %r15 + adcxq %rcx, %r12 + adoxq %r10, %rbx # A[1] * A[3] - movq 8(%rdi), %rdx - mulxq 24(%rdi), %rbp, %r8 - adcxq %rax, %r11 - adcxq %rbp, %r12 + movq %r9, %rdx + mulxq 24(%rax), %rcx, %rdx adcxq %r8, %r13 - adcxq %r15, %r14 - # Double with Carry Flag - xorq %r15, %r15 + adcxq %rcx, %r14 + adcxq %rdx, %r15 + adcxq %r10, %rbx # A[0] * A[0] - movq (%rdi), %rdx - mulxq %rdx, %r8, %rbp - adcxq %r9, %r9 - # A[1] * A[1] - movq 8(%rdi), %rdx - mulxq %rdx, %rcx, %rax - adcxq %r10, %r10 - adoxq %rbp, %r9 + movq %rbp, %rdx + mulxq %rdx, %r10, %rcx + xorq %rbp, %rbp adcxq %r11, %r11 - adoxq %rcx, %r10 - # A[2] * A[2] - movq 16(%rdi), %rdx - mulxq %rdx, %rbp, %rcx + # A[1] * A[1] + movq %r9, %rdx + adoxq %rcx, %r11 + mulxq %rdx, %rcx, %r8 adcxq %r12, %r12 - adoxq %rax, %r11 + adoxq %rcx, %r12 adcxq %r13, %r13 - adoxq %rbp, %r12 - # A[3] * A[3] - movq 24(%rdi), %rdx - mulxq %rdx, %rbp, %rax + # A[2] * A[2] + movq 16(%rax), %rdx + adoxq %r8, %r13 + mulxq %rdx, %r8, %rcx adcxq %r14, %r14 - adoxq %rcx, %r13 + adoxq %r8, %r14 adcxq %r15, %r15 - adoxq %rbp, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - xorq %rbp, %rbp - # Move top half into t4-t7 and remove top bit from t3 and double - shldq $3, %r15, %rbp - shldq $2, %r14, %r15 - shldq $2, %r13, %r14 - shldq $2, %r12, %r13 - shldq $2, %r11, %r12 - shldq $0x01, %r10, %r11 - shldq $0x01, %r9, %r10 - shldq $0x01, %r8, %r9 - shlq $0x01, %r8 - andq %rax, %r11 - # Two out left, one in right - andq %rax, %r15 - # Multiply top bits by 19*19 - imulq $0x169, %rbp, %rcx - xorq %rax, %rax - # Multiply top half by 19 - movq $19, %rdx - adoxq %rcx, %r8 - mulxq %r12, %rbp, %r12 - adcxq %rbp, %r8 - adoxq %r12, %r9 - mulxq %r13, %rbp, %r13 - adcxq %rbp, %r9 - adoxq %r13, %r10 - mulxq %r14, %rbp, %r14 - adcxq %rbp, %r10 - adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rbp - andq %rax, %r11 - addq %rbp, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 + # A[3] * A[3] + movq 24(%rax), %rdx + adoxq %rcx, %r15 + mulxq %rdx, %rcx, %r8 + adcxq %rbx, %rbx + adoxq %rcx, %rbx + adcxq %rbp, %rbp + adoxq %r8, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r9 + addq %rbp, %r13 adcq $0x00, %r9 - adcq $0x00, %r10 + movq $0x7fffffffffffffff, %rcx + shldq $0x01, %r13, %r9 + imulq $19, %r9, %r9 + andq %rcx, %r13 + xorq %rcx, %rcx + adoxq %r9, %r10 + mulxq %r14, %r9, %r14 + adcxq %r9, %r10 + adoxq %r14, %r11 + mulxq %r15, %r9, %r15 + adcxq %r9, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r9, %rbx + adcxq %r9, %r12 + adoxq %rbx, %r13 + adcxq %rcx, %r13 + movq %r13, %r9 + shldq $0x01, %r12, %r13 + shldq $0x01, %r11, %r12 + shldq $0x01, %r10, %r11 + shlq $0x01, %r10 + movq $0x7fffffffffffffff, %rcx + shrq $62, %r9 + andq %rcx, %r13 + imulq $19, %r9, %r9 + addq %r9, %r10 adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 16(%rsp), %rdi + leaq 64(%rdi), %rsi + leaq 96(%rdi), %rdi # Sub - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %r11 - subq (%rdi), %r8 - movq $0x00, %rdx - sbbq 8(%rdi), %r9 - movq $-19, %rcx - sbbq 16(%rdi), %r10 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rdi), %r11 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r10 + sbbq 8(%rsi), %r11 + sbbq 16(%rsi), %r12 + sbbq 24(%rsi), %r13 + sbbq %rcx, %rcx + shldq $0x01, %r13, %rcx + movq $0x7fffffffffffffff, %r8 + imulq $-19, %rcx + andq %r8, %r13 # Add modulus (if underflow) - addq %rcx, %r8 - adcq %rdx, %r9 - adcq %rdx, %r10 - adcq %rax, %r11 - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - addq $48, %rsp + subq %rcx, %r10 + sbbq $0x00, %r11 + sbbq $0x00, %r12 + sbbq $0x00, %r13 + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + addq $16, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx - popq %rbp repz retq #ifndef __APPLE__ -.size fe_ge_dbl_avx2,.-fe_ge_dbl_avx2 +.size ge_p2_dbl_avx2,.-ge_p2_dbl_avx2 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_madd_avx2 -.type fe_ge_madd_avx2,@function +.globl ge_madd_avx2 +.type ge_madd_avx2,@function .align 16 -fe_ge_madd_avx2: +ge_madd_avx2: #else .section __TEXT,__text -.globl _fe_ge_madd_avx2 +.globl _ge_madd_avx2 .p2align 4 -_fe_ge_madd_avx2: +_ge_madd_avx2: #endif /* __APPLE__ */ - pushq %rbp - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $48, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rax + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq 8(%rsp), %rsi - movq 40(%rsp), %rbx - movq 32(%rsp), %rbp - # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rbp), %r8 - movq %r9, %r13 - adcq 8(%rbp), %r9 - movq %r10, %r14 - adcq 16(%rbp), %r10 - movq %rdx, %r15 - adcq 24(%rbp), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - # Sub - subq (%rbp), %r12 - movq $0x00, %rdx - sbbq 8(%rbp), %r13 - movq $-19, %rcx - sbbq 16(%rbp), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rbp), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq %r12, (%rsi) - movq %r13, 8(%rsi) - movq %r14, 16(%rsi) - movq %r15, 24(%rsi) - movq 16(%rsp), %rbx - movq 128(%rsp), %rbp + movq %rax, 16(%rsp) + leaq 96(%rsi), %rcx + leaq 64(%rax), %rax + leaq 96(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rdi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rcx), %r10, %r11 # A[2] * B[0] - mulxq 16(%rdi), %r10, %r11 + mulxq 16(%rcx), %r12, %r13 # A[1] * B[0] - mulxq 8(%rdi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rdi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rcx), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rcx), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rdi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rcx), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rdi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rcx), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rdi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rcx), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rdi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rcx), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rdi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rdi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rcx), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rcx), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rcx), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rdi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rcx), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rdi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rdi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx + mulxq (%rcx), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rcx), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rdi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rcx), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rcx), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq 136(%rsp), %rdi + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %rsi, %rcx + leaq 32(%rsi), %rax + leaq -64(%rdi), %rsi + leaq -96(%rdi), %rdi + # Add-Sub + # Add + movq (%rax), %r10 + movq 8(%rax), %r11 + movq 16(%rax), %r12 + movq 24(%rax), %r13 + movq %r10, %r14 + addq (%rcx), %r10 + movq %r11, %r15 + adcq 8(%rcx), %r11 + movq %r12, %rbx + adcq 16(%rcx), %r12 + movq %r13, %rbp + adcq 24(%rcx), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 + # Sub modulus (if overflow) + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rcx), %r14 + sbbq 8(%rcx), %r15 + sbbq 16(%rcx), %rbx + sbbq 24(%rcx), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp + # Add modulus (if underflow) + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rax # Multiply # A[0] * B[0] - movq (%rdi), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rdi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rdi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rdi), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rdi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rdi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rdi), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rdi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rdi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rdi), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rdi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rdi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rdi), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rdi), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rdi), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rdi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rdi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rdi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rdi), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rdi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + mulxq (%rdi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 + adcxq %rdx, %r13 # A[3] * B[0] - movq (%rdi), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] movq 24(%rdi), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rdx, %r13 + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rdi), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rdi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rdi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 24(%rsp), %rdi - movq 120(%rsp), %rsi - movq 112(%rsp), %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq 32(%rax), %rax # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rsi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rsi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rsi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rsi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rsi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rsi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rsi), %rdx, %rcx + mulxq (%rsi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rsi), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rsi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rdi - movq (%rsp), %rsi - # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rdi), %r8 - movq %r9, %r13 - adcq 8(%rdi), %r9 + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + # Add-Sub + # Add + movq (%rdi), %r10 + movq 8(%rdi), %r11 + movq 16(%rdi), %r12 + movq 24(%rdi), %r13 movq %r10, %r14 - adcq 16(%rdi), %r10 - movq %rdx, %r15 - adcq 24(%rdi), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rdi), %r12 - movq $0x00, %rdx - sbbq 8(%rdi), %r13 - movq $-19, %rcx - sbbq 16(%rdi), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rdi), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq %r12, (%rsi) - movq %r13, 8(%rsi) - movq %r14, 16(%rsi) - movq %r15, 24(%rsi) - movq 104(%rsp), %rdi + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + leaq 64(%rcx), %rcx # Double - movq (%rdi), %r8 - movq 8(%rdi), %r9 - addq %r8, %r8 - movq 16(%rdi), %r10 - adcq %r9, %r9 - movq 24(%rdi), %rdx - adcq %r10, %r10 - movq $-19, %rcx - adcq %rdx, %rdx - movq $0x7fffffffffffffff, %rax - movq %rdx, %r11 - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + movq (%rcx), %r10 + movq 8(%rcx), %r11 + addq %r10, %r10 + movq 16(%rcx), %r12 + adcq %r11, %r11 + movq 24(%rcx), %r13 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq 24(%rsp), %rdi + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + leaq 96(%rdi), %rsi + leaq 64(%rdi), %rdi + # Add-Sub # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rdi), %r8 - movq %r9, %r13 - adcq 8(%rdi), %r9 movq %r10, %r14 - adcq 16(%rdi), %r10 - movq %rdx, %r15 - adcq 24(%rdi), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rdi), %r12 - movq $0x00, %rdx - sbbq 8(%rdi), %r13 - movq $-19, %rcx - sbbq 16(%rdi), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rdi), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq %r12, (%rdi) - movq %r13, 8(%rdi) - movq %r14, 16(%rdi) - movq %r15, 24(%rdi) - addq $48, %rsp + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + addq $24, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx - popq %rbp repz retq #ifndef __APPLE__ -.size fe_ge_madd_avx2,.-fe_ge_madd_avx2 +.size ge_madd_avx2,.-ge_madd_avx2 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_msub_avx2 -.type fe_ge_msub_avx2,@function +.globl ge_msub_avx2 +.type ge_msub_avx2,@function .align 16 -fe_ge_msub_avx2: +ge_msub_avx2: #else .section __TEXT,__text -.globl _fe_ge_msub_avx2 +.globl _ge_msub_avx2 .p2align 4 -_fe_ge_msub_avx2: +_ge_msub_avx2: #endif /* __APPLE__ */ - pushq %rbp - pushq %rbx pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $48, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rax + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq 8(%rsp), %rsi - movq 40(%rsp), %rbx - movq 32(%rsp), %rbp - # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rbp), %r8 - movq %r9, %r13 - adcq 8(%rbp), %r9 - movq %r10, %r14 - adcq 16(%rbp), %r10 - movq %rdx, %r15 - adcq 24(%rbp), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - # Sub - subq (%rbp), %r12 - movq $0x00, %rdx - sbbq 8(%rbp), %r13 - movq $-19, %rcx - sbbq 16(%rbp), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rbp), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq %r12, (%rsi) - movq %r13, 8(%rsi) - movq %r14, 16(%rsi) - movq %r15, 24(%rsi) - movq 16(%rsp), %rbx - movq 136(%rsp), %rbp + movq %rax, 16(%rsp) + leaq 96(%rsi), %rcx + leaq 64(%rax), %rax + leaq 96(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rdi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rcx), %r10, %r11 # A[2] * B[0] - mulxq 16(%rdi), %r10, %r11 + mulxq 16(%rcx), %r12, %r13 # A[1] * B[0] - mulxq 8(%rdi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rdi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rcx), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rcx), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rdi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rcx), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rdi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rcx), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rdi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rcx), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rdi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rcx), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rdi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rdi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rcx), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rcx), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rcx), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rdi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rcx), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rdi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rdi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx + mulxq (%rcx), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rcx), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rdi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rcx), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rcx), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq 128(%rsp), %rdi + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %rsi, %rcx + leaq 32(%rsi), %rax + leaq -64(%rdi), %rsi + leaq -96(%rdi), %rdi + # Add-Sub + # Add + movq (%rax), %r10 + movq 8(%rax), %r11 + movq 16(%rax), %r12 + movq 24(%rax), %r13 + movq %r10, %r14 + addq (%rcx), %r10 + movq %r11, %r15 + adcq 8(%rcx), %r11 + movq %r12, %rbx + adcq 16(%rcx), %r12 + movq %r13, %rbp + adcq 24(%rcx), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 + # Sub modulus (if overflow) + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rcx), %r14 + sbbq 8(%rcx), %r15 + sbbq 16(%rcx), %rbx + sbbq 24(%rcx), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp + # Add modulus (if underflow) + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rax + leaq 32(%rax), %rax # Multiply # A[0] * B[0] - movq (%rdi), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rdi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rdi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rdi), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rdi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rdi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rdi), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rdi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rdi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rdi), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rdi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rdi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rdi), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rdi), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rdi), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rdi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rdi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rdi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rdi), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rdi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 + mulxq (%rdi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 + adcxq %rdx, %r13 # A[3] * B[0] - movq (%rdi), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] movq 24(%rdi), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rdx, %r13 + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rdi), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rdi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rdi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 24(%rsp), %rdi - movq 120(%rsp), %rsi - movq 112(%rsp), %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq -32(%rax), %rax # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rsi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rsi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rsi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rsi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rsi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rsi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rsi), %rdx, %rcx + mulxq (%rsi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rsi), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rsi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq 8(%rsp), %rsi - movq (%rsp), %rbp - # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rsi), %r8 - movq %r9, %r13 - adcq 8(%rsi), %r9 + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + # Add-Sub + # Add + movq (%rdi), %r10 + movq 8(%rdi), %r11 + movq 16(%rdi), %r12 + movq 24(%rdi), %r13 movq %r10, %r14 - adcq 16(%rsi), %r10 - movq %rdx, %r15 - adcq 24(%rsi), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rsi), %r12 - movq $0x00, %rdx - sbbq 8(%rsi), %r13 - movq $-19, %rcx - sbbq 16(%rsi), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rsi), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq %r12, (%rbp) - movq %r13, 8(%rbp) - movq %r14, 16(%rbp) - movq %r15, 24(%rbp) - movq 104(%rsp), %rsi + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + leaq 64(%rcx), %rcx # Double - movq (%rsi), %r8 - movq 8(%rsi), %r9 - addq %r8, %r8 - movq 16(%rsi), %r10 - adcq %r9, %r9 - movq 24(%rsi), %rdx - adcq %r10, %r10 - movq $-19, %rcx - adcq %rdx, %rdx - movq $0x7fffffffffffffff, %rax - movq %rdx, %r11 - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + movq (%rcx), %r10 + movq 8(%rcx), %r11 + addq %r10, %r10 + movq 16(%rcx), %r12 + adcq %r11, %r11 + movq 24(%rcx), %r13 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + leaq 96(%rdi), %rsi + leaq 64(%rdi), %rdi + # Add-Sub # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rdi), %r8 - movq %r9, %r13 - adcq 8(%rdi), %r9 movq %r10, %r14 - adcq 16(%rdi), %r10 - movq %rdx, %r15 - adcq 24(%rdi), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rdi), %r12 - movq $0x00, %rdx - sbbq 8(%rdi), %r13 - movq $-19, %rcx - sbbq 16(%rdi), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rdi), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq %r12, (%rbx) - movq %r13, 8(%rbx) - movq %r14, 16(%rbx) - movq %r15, 24(%rbx) - addq $48, %rsp + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + addq $24, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbx - popq %rbp repz retq #ifndef __APPLE__ -.size fe_ge_msub_avx2,.-fe_ge_msub_avx2 +.size ge_msub_avx2,.-ge_msub_avx2 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_add_avx2 -.type fe_ge_add_avx2,@function +.globl ge_add_avx2 +.type ge_add_avx2,@function .align 16 -fe_ge_add_avx2: +ge_add_avx2: #else .section __TEXT,__text -.globl _fe_ge_add_avx2 +.globl _ge_add_avx2 .p2align 4 -_fe_ge_add_avx2: +_ge_add_avx2: #endif /* __APPLE__ */ - pushq %rbx - pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $0x50, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rax + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq 8(%rsp), %rsi - movq 40(%rsp), %rbx - movq 32(%rsp), %rbp - # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rbp), %r8 - movq %r9, %r13 - adcq 8(%rbp), %r9 - movq %r10, %r14 - adcq 16(%rbp), %r10 - movq %rdx, %r15 - adcq 24(%rbp), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - # Sub - subq (%rbp), %r12 - movq $0x00, %rdx - sbbq 8(%rbp), %r13 - movq $-19, %rcx - sbbq 16(%rbp), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rbp), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq %r12, (%rsi) - movq %r13, 8(%rsi) - movq %r14, 16(%rsi) - movq %r15, 24(%rsi) - movq 16(%rsp), %rbx - movq 168(%rsp), %rbp + movq %rax, 16(%rsp) + leaq 96(%rsi), %rcx + leaq 96(%rax), %rax + leaq 96(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rdi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rcx), %r10, %r11 # A[2] * B[0] - mulxq 16(%rdi), %r10, %r11 + mulxq 16(%rcx), %r12, %r13 # A[1] * B[0] - mulxq 8(%rdi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rdi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rcx), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rcx), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rdi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rcx), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rdi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rcx), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rdi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rcx), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rdi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rcx), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rdi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rdi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rcx), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rcx), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rcx), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rdi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rcx), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rdi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rdi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx + mulxq (%rcx), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rcx), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rdi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rcx), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rcx), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq 176(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %rsi, %rcx + leaq 32(%rsi), %rax + leaq -64(%rdi), %rsi + leaq -96(%rdi), %rdi + # Add-Sub + # Add + movq (%rax), %r10 + movq 8(%rax), %r11 + movq 16(%rax), %r12 + movq 24(%rax), %r13 + movq %r10, %r14 + addq (%rcx), %r10 + movq %r11, %r15 + adcq 8(%rcx), %r11 + movq %r12, %rbx + adcq 16(%rcx), %r12 + movq %r13, %rbp + adcq 24(%rcx), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 + # Sub modulus (if overflow) + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rcx), %r14 + sbbq 8(%rcx), %r15 + sbbq 16(%rcx), %rbx + sbbq 24(%rcx), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp + # Add modulus (if underflow) + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rax # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rdi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rdi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rdi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rdi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rdi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rdi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rdi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rdi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbx), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rdi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rdi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rdi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rdi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx + mulxq (%rdi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rdi), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rdi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rdi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 24(%rsp), %rsi - movq 160(%rsp), %rbx - movq 144(%rsp), %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq 32(%rax), %rax # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rbx), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rbx), %r10, %r11 + mulxq 16(%rsi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rbx), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rbx), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rbx), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rbx), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rbx), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rsi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rbx), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rbx), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rbx), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rbx), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rsi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rsi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rsi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rbx), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rsi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rbx), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rbx), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rbx), %rdx, %rcx + mulxq (%rsi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rsi), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rbx), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rsi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 136(%rsp), %rsi - movq 152(%rsp), %rbx + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + leaq 64(%rcx), %rcx + leaq 32(%rax), %rax # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rcx), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rcx), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rcx), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rcx), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rcx), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rcx), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rcx), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rcx), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbx), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rcx), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rcx), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rcx), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rcx), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx + mulxq (%rcx), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rcx), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rcx), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rcx), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - leaq 48(%rsp), %rsi + leaq 64(%rdi), %rdi # Double - movq (%rdi), %r8 - movq 8(%rdi), %r9 - addq %r8, %r8 - movq 16(%rdi), %r10 - adcq %r9, %r9 - movq 24(%rdi), %rdx - adcq %r10, %r10 - movq $-19, %rcx - adcq %rdx, %rdx - movq $0x7fffffffffffffff, %rax - movq %rdx, %r11 - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq %r10, %r10 + adcq %r11, %r11 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 8(%rsp), %rbx - movq 16(%rsp), %rbp + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq -64(%rdi), %rdi + # Add-Sub # Add - movq (%rbp), %r8 - movq 8(%rbp), %r9 - movq 16(%rbp), %r10 - movq 24(%rbp), %rdx - movq %r8, %r12 - addq (%rbx), %r8 - movq %r9, %r13 - adcq 8(%rbx), %r9 + movq (%rdi), %r10 + movq 8(%rdi), %r11 + movq 16(%rdi), %r12 + movq 24(%rdi), %r13 movq %r10, %r14 - adcq 16(%rbx), %r10 - movq %rdx, %r15 - adcq 24(%rbx), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rbx), %r12 - movq $0x00, %rdx - sbbq 8(%rbx), %r13 - movq $-19, %rcx - sbbq 16(%rbx), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rbx), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq %r12, (%rdi) - movq %r13, 8(%rdi) - movq %r14, 16(%rdi) - movq %r15, 24(%rdi) - movq 24(%rsp), %rdi - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %rdx - movq %r8, %r12 - addq (%rdi), %r8 - movq %r9, %r13 - adcq 8(%rdi), %r9 + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + leaq 96(%rdi), %rsi + leaq 64(%rdi), %rdi + # Add-Sub + # Add + movq (%rdi), %r10 + movq 8(%rdi), %r11 + movq 16(%rdi), %r12 + movq 24(%rdi), %r13 movq %r10, %r14 - adcq 16(%rdi), %r10 - movq %rdx, %r15 - adcq 24(%rdi), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rdi), %r12 - movq $0x00, %rdx - sbbq 8(%rdi), %r13 - movq $-19, %rcx - sbbq 16(%rdi), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rdi), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rbp) - movq %r9, 8(%rbp) - movq %r10, 16(%rbp) - movq %r11, 24(%rbp) - movq %r12, (%rdi) - movq %r13, 8(%rdi) - movq %r14, 16(%rdi) - movq %r15, 24(%rdi) - addq $0x50, %rsp + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + addq $24, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 - popq %rbp - popq %rbx repz retq #ifndef __APPLE__ -.size fe_ge_add_avx2,.-fe_ge_add_avx2 +.size ge_add_avx2,.-ge_add_avx2 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_sub_avx2 -.type fe_ge_sub_avx2,@function +.globl ge_sub_avx2 +.type ge_sub_avx2,@function .align 16 -fe_ge_sub_avx2: +ge_sub_avx2: #else .section __TEXT,__text -.globl _fe_ge_sub_avx2 +.globl _ge_sub_avx2 .p2align 4 -_fe_ge_sub_avx2: +_ge_sub_avx2: #endif /* __APPLE__ */ - pushq %rbx - pushq %rbp pushq %r12 pushq %r13 pushq %r14 pushq %r15 - subq $0x50, %rsp + pushq %rbx + pushq %rbp + movq %rdx, %rax + subq $24, %rsp movq %rdi, (%rsp) movq %rsi, 8(%rsp) - movq %rdx, 16(%rsp) - movq %rcx, 24(%rsp) - movq %r8, 32(%rsp) - movq %r9, 40(%rsp) - movq 8(%rsp), %rsi - movq 40(%rsp), %rbx - movq 32(%rsp), %rbp - # Add - movq (%rbx), %r8 - movq 8(%rbx), %r9 - movq 16(%rbx), %r10 - movq 24(%rbx), %rdx - movq %r8, %r12 - addq (%rbp), %r8 - movq %r9, %r13 - adcq 8(%rbp), %r9 - movq %r10, %r14 - adcq 16(%rbp), %r10 - movq %rdx, %r15 - adcq 24(%rbp), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - # Sub - subq (%rbp), %r12 - movq $0x00, %rdx - sbbq 8(%rbp), %r13 - movq $-19, %rcx - sbbq 16(%rbp), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rbp), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax - # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - movq %r12, (%rsi) - movq %r13, 8(%rsi) - movq %r14, 16(%rsi) - movq %r15, 24(%rsi) - movq 16(%rsp), %rbx - movq 176(%rsp), %rbp + movq %rax, 16(%rsp) + leaq 96(%rsi), %rcx + leaq 96(%rax), %rax + leaq 96(%rdi), %rdi # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rdi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rcx), %r10, %r11 # A[2] * B[0] - mulxq 16(%rdi), %r10, %r11 + mulxq 16(%rcx), %r12, %r13 # A[1] * B[0] - mulxq 8(%rdi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rdi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rcx), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rcx), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rdi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rcx), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rdi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rcx), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rdi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rcx), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rdi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rcx), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rdi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rdi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rcx), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rcx), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rcx), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rdi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rcx), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rdi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rdi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rdi), %rdx, %rcx + mulxq (%rcx), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rcx), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rdi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rcx), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rcx), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq 168(%rsp), %rbx + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %rsi, %rcx + leaq 32(%rsi), %rax + leaq -64(%rdi), %rsi + leaq -96(%rdi), %rdi + # Add-Sub + # Add + movq (%rax), %r10 + movq 8(%rax), %r11 + movq 16(%rax), %r12 + movq 24(%rax), %r13 + movq %r10, %r14 + addq (%rcx), %r10 + movq %r11, %r15 + adcq 8(%rcx), %r11 + movq %r12, %rbx + adcq 16(%rcx), %r12 + movq %r13, %rbp + adcq 24(%rcx), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 + # Sub modulus (if overflow) + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + # Sub + subq (%rcx), %r14 + sbbq 8(%rcx), %r15 + sbbq 16(%rcx), %rbx + sbbq 24(%rcx), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp + # Add modulus (if underflow) + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + movq 16(%rsp), %rax + leaq 32(%rax), %rax # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rdi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rdi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rdi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rdi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rdi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rdi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rdi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rdi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbx), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rdi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rdi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rdi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rdi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx + mulxq (%rdi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rdi), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rdi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rdi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 24(%rsp), %rsi - movq 160(%rsp), %rbx - movq 144(%rsp), %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq -32(%rax), %rax # Multiply # A[0] * B[0] - movq (%rbp), %rdx - mulxq (%rbx), %r8, %r9 + movq (%rax), %rdx + mulxq (%rsi), %r10, %r11 # A[2] * B[0] - mulxq 16(%rbx), %r10, %r11 + mulxq 16(%rsi), %r12, %r13 # A[1] * B[0] - mulxq 8(%rbx), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbp), %rdx - mulxq 8(%rbx), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rsi), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rsi), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbp), %rdx - mulxq (%rbx), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rsi), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rbx), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rsi), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbp), %rdx - mulxq 8(%rbx), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rsi), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rbx), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rsi), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbp), %rdx - mulxq 8(%rbx), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbp), %rdx - adoxq %rcx, %r11 - mulxq 24(%rbx), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbp), %rdx - mulxq 16(%rbx), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rsi), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rsi), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rsi), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbp), %rdx - adoxq %rcx, %r13 - mulxq 24(%rbx), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rsi), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rbx), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbp), %rdx - adcxq %rcx, %r12 - mulxq 24(%rbx), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbp), %rdx - mulxq 16(%rbx), %rdx, %rcx + mulxq (%rsi), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rsi), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbp), %rdx - adcxq %rcx, %r14 - mulxq 24(%rbx), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rsi), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rsi), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 136(%rsp), %rsi - movq 152(%rsp), %rbx + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + leaq 64(%rcx), %rcx + leaq 64(%rax), %rax # Multiply # A[0] * B[0] - movq (%rbx), %rdx - mulxq (%rsi), %r8, %r9 + movq (%rax), %rdx + mulxq (%rcx), %r10, %r11 # A[2] * B[0] - mulxq 16(%rsi), %r10, %r11 + mulxq 16(%rcx), %r12, %r13 # A[1] * B[0] - mulxq 8(%rsi), %rcx, %rax - xorq %r15, %r15 - adcxq %rcx, %r9 - # A[1] * B[3] - movq 24(%rbx), %rdx - mulxq 8(%rsi), %r12, %r13 - adcxq %rax, %r10 + mulxq 8(%rcx), %r8, %r9 + xorq %rbp, %rbp + adcxq %r8, %r11 + # A[3] * B[1] + movq 8(%rax), %rdx + mulxq 24(%rcx), %r14, %r15 + adcxq %r9, %r12 # A[0] * B[1] - movq 8(%rbx), %rdx - mulxq (%rsi), %rcx, %rax - adoxq %rcx, %r9 + mulxq (%rcx), %r8, %r9 + adoxq %r8, %r11 # A[2] * B[1] - mulxq 16(%rsi), %rcx, %r14 - adoxq %rax, %r10 - adcxq %rcx, %r11 + mulxq 16(%rcx), %r8, %rbx + adoxq %r9, %r12 + adcxq %r8, %r13 # A[1] * B[2] - movq 16(%rbx), %rdx - mulxq 8(%rsi), %rcx, %rax - adcxq %r14, %r12 - adoxq %rcx, %r11 - adcxq %r15, %r13 - adoxq %rax, %r12 + movq 16(%rax), %rdx + mulxq 8(%rcx), %r8, %r9 + adcxq %rbx, %r14 + adoxq %r8, %r13 + adcxq %rbp, %r15 + adoxq %r9, %r14 # A[0] * B[2] - mulxq (%rsi), %rcx, %rax - adoxq %r15, %r13 - xorq %r14, %r14 - adcxq %rcx, %r10 + mulxq (%rcx), %r8, %r9 + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %r8, %r12 # A[1] * B[1] - movq 8(%rbx), %rdx - mulxq 8(%rsi), %rdx, %rcx - adcxq %rax, %r11 - adoxq %rdx, %r10 - # A[3] * B[1] - movq 8(%rbx), %rdx - adoxq %rcx, %r11 - mulxq 24(%rsi), %rcx, %rax - adcxq %rcx, %r12 - # A[2] * B[2] - movq 16(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx - adcxq %rax, %r13 + movq 8(%rax), %rdx + mulxq 8(%rcx), %rdx, %r8 + adcxq %r9, %r13 adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%rax), %rdx + adoxq %r8, %r13 + mulxq 8(%rcx), %r8, %r9 + adcxq %r8, %r14 + # A[2] * B[2] + movq 16(%rax), %rdx + mulxq 16(%rcx), %rdx, %r8 + adcxq %r9, %r15 + adoxq %rdx, %r14 # A[3] * B[3] - movq 24(%rbx), %rdx - adoxq %rcx, %r13 - mulxq 24(%rsi), %rcx, %rax - adoxq %r15, %r14 - adcxq %rcx, %r14 + movq 24(%rax), %rdx + adoxq %r8, %r15 + mulxq 24(%rcx), %r8, %r9 + adoxq %rbp, %rbx + adcxq %r8, %rbx # A[0] * B[3] - mulxq (%rsi), %rdx, %rcx - adcxq %rax, %r15 - xorq %rax, %rax - adcxq %rdx, %r11 - # A[3] * B[0] - movq (%rbx), %rdx - adcxq %rcx, %r12 - mulxq 24(%rsi), %rdx, %rcx - adoxq %rdx, %r11 - adoxq %rcx, %r12 - # A[2] * B[3] - movq 24(%rbx), %rdx - mulxq 16(%rsi), %rdx, %rcx + mulxq (%rcx), %rdx, %r8 + adcxq %r9, %rbp + xorq %r9, %r9 adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rcx), %rdx + adcxq %r8, %r14 + mulxq (%rax), %rdx, %r8 + adoxq %rdx, %r13 + adoxq %r8, %r14 # A[3] * B[2] - movq 16(%rbx), %rdx - adcxq %rcx, %r14 - mulxq 24(%rsi), %rcx, %rdx - adcxq %rax, %r15 - adoxq %rcx, %r13 - adoxq %rdx, %r14 - adoxq %rax, %r15 - # Reduce - movq $0x7fffffffffffffff, %rax - # Move top half into t4-t7 and remove top bit from t3 - shldq $0x01, %r14, %r15 - shldq $0x01, %r13, %r14 - shldq $0x01, %r12, %r13 - shldq $0x01, %r11, %r12 - andq %rax, %r11 - # Multiply top half by 19 - movq $19, %rdx - xorq %rax, %rax - mulxq %r12, %rcx, %r12 - adcxq %rcx, %r8 - adoxq %r12, %r9 - mulxq %r13, %rcx, %r13 - adcxq %rcx, %r9 - adoxq %r13, %r10 - mulxq %r14, %rcx, %r14 - adcxq %rcx, %r10 + movq 24(%rcx), %rdx + mulxq 16(%rax), %rdx, %r8 + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%rax), %rdx + adcxq %r8, %rbx + mulxq 16(%rcx), %r8, %rdx + adcxq %r9, %rbp + adoxq %r8, %r15 + adoxq %rdx, %rbx + adoxq %r9, %rbp + movq $38, %rdx + mulxq %rbp, %rbp, %r8 + addq %rbp, %r13 + adcq $0x00, %r8 + movq $0x7fffffffffffffff, %r9 + shldq $0x01, %r13, %r8 + imulq $19, %r8, %r8 + andq %r9, %r13 + xorq %r9, %r9 + adoxq %r8, %r10 + mulxq %r14, %r8, %r14 + adcxq %r8, %r10 adoxq %r14, %r11 - mulxq %r15, %r15, %rdx - adcxq %r15, %r11 - adoxq %rax, %rdx - adcxq %rax, %rdx - # Overflow - shldq $0x01, %r11, %rdx - movq $0x7fffffffffffffff, %rax - imulq $19, %rdx, %rcx - andq %rax, %r11 - addq %rcx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 - # Reduce if top bit set - movq %r11, %rdx - sarq $63, %rdx - andq $19, %rdx - andq %rax, %r11 - addq %rdx, %r8 - adcq $0x00, %r9 - adcq $0x00, %r10 - adcq $0x00, %r11 + mulxq %r15, %r8, %r15 + adcxq %r8, %r11 + adoxq %r15, %r12 + mulxq %rbx, %r8, %rbx + adcxq %r8, %r12 + adoxq %rbx, %r13 + adcxq %r9, %r13 # Store - movq %r8, (%rdi) - movq %r9, 8(%rdi) - movq %r10, 16(%rdi) - movq %r11, 24(%rdi) - leaq 48(%rsp), %rsi + leaq 64(%rdi), %rdi # Double - movq (%rdi), %r8 - movq 8(%rdi), %r9 - addq %r8, %r8 - movq 16(%rdi), %r10 - adcq %r9, %r9 - movq 24(%rdi), %rdx - adcq %r10, %r10 - movq $-19, %rcx - adcq %rdx, %rdx - movq $0x7fffffffffffffff, %rax - movq %rdx, %r11 - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq %r10, %r10 + adcq %r11, %r11 + adcq %r12, %r12 + adcq %r13, %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 - movq %r8, (%rsi) - movq %r9, 8(%rsi) - movq %r10, 16(%rsi) - movq %r11, 24(%rsi) - movq 8(%rsp), %rbx - movq 16(%rsp), %rbp + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + leaq -64(%rdi), %rdi + # Add-Sub # Add - movq (%rbp), %r8 - movq 8(%rbp), %r9 - movq 16(%rbp), %r10 - movq 24(%rbp), %rdx - movq %r8, %r12 - addq (%rbx), %r8 - movq %r9, %r13 - adcq 8(%rbx), %r9 + movq (%rdi), %r10 + movq 8(%rdi), %r11 + movq 16(%rdi), %r12 + movq 24(%rdi), %r13 movq %r10, %r14 - adcq 16(%rbx), %r10 - movq %rdx, %r15 - adcq 24(%rbx), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rsi), %r10 + movq %r11, %r15 + adcq 8(%rsi), %r11 + movq %r12, %rbx + adcq 16(%rsi), %r12 + movq %r13, %rbp + adcq 24(%rsi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rbx), %r12 - movq $0x00, %rdx - sbbq 8(%rbx), %r13 - movq $-19, %rcx - sbbq 16(%rbx), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rbx), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rsi), %r14 + sbbq 8(%rsi), %r15 + sbbq 16(%rsi), %rbx + sbbq 24(%rsi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 - movq %r8, (%rbx) - movq %r9, 8(%rbx) - movq %r10, 16(%rbx) - movq %r11, 24(%rbx) - movq %r12, (%rdi) - movq %r13, 8(%rdi) - movq %r14, 16(%rdi) - movq %r15, 24(%rdi) - movq 24(%rsp), %rdi - # Add - movq (%rsi), %r8 - movq 8(%rsi), %r9 - movq 16(%rsi), %r10 - movq 24(%rsi), %rdx - movq %r8, %r12 - addq (%rdi), %r8 - movq %r9, %r13 - adcq 8(%rdi), %r9 + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rsi) + movq %r11, 8(%rsi) + movq %r12, 16(%rsi) + movq %r13, 24(%rsi) + movq %r14, (%rdi) + movq %r15, 8(%rdi) + movq %rbx, 16(%rdi) + movq %rbp, 24(%rdi) + leaq 64(%rdi), %rsi + leaq 96(%rdi), %rdi + # Add-Sub + # Add + movq (%rsi), %r10 + movq 8(%rsi), %r11 + movq 16(%rsi), %r12 + movq 24(%rsi), %r13 movq %r10, %r14 - adcq 16(%rdi), %r10 - movq %rdx, %r15 - adcq 24(%rdi), %rdx - movq $-19, %rcx - movq %rdx, %r11 - movq $0x7fffffffffffffff, %rax - sarq $63, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + addq (%rdi), %r10 + movq %r11, %r15 + adcq 8(%rdi), %r11 + movq %r12, %rbx + adcq 16(%rdi), %r12 + movq %r13, %rbp + adcq 24(%rdi), %r13 + movq $0x00, %r8 + adcq $0x00, %r8 + shldq $0x01, %r13, %r8 + movq $0x7fffffffffffffff, %r9 + imulq $19, %r8 + andq %r9, %r13 # Sub modulus (if overflow) - subq %rcx, %r8 - sbbq %rdx, %r9 - sbbq %rdx, %r10 - sbbq %rax, %r11 + addq %r8, %r10 + adcq $0x00, %r11 + adcq $0x00, %r12 + adcq $0x00, %r13 # Sub - subq (%rdi), %r12 - movq $0x00, %rdx - sbbq 8(%rdi), %r13 - movq $-19, %rcx - sbbq 16(%rdi), %r14 - movq $0x7fffffffffffffff, %rax - sbbq 24(%rdi), %r15 - sbbq $0x00, %rdx - # Mask the modulus - andq %rdx, %rcx - andq %rdx, %rax + subq (%rdi), %r14 + sbbq 8(%rdi), %r15 + sbbq 16(%rdi), %rbx + sbbq 24(%rdi), %rbp + sbbq %r8, %r8 + shldq $0x01, %rbp, %r8 + imulq $-19, %r8 + andq %r9, %rbp # Add modulus (if underflow) - addq %rcx, %r12 - adcq %rdx, %r13 - adcq %rdx, %r14 - adcq %rax, %r15 + subq %r8, %r14 + sbbq $0x00, %r15 + sbbq $0x00, %rbx + sbbq $0x00, %rbp + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) + movq %r14, (%rsi) + movq %r15, 8(%rsi) + movq %rbx, 16(%rsi) + movq %rbp, 24(%rsi) + addq $24, %rsp + popq %rbp + popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size ge_sub_avx2,.-ge_sub_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl sc_reduce_avx2 +.type sc_reduce_avx2,@function +.align 16 +sc_reduce_avx2: +#else +.section __TEXT,__text +.globl _sc_reduce_avx2 +.p2align 4 +_sc_reduce_avx2: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + movq (%rdi), %r8 + movq 8(%rdi), %r9 + movq 16(%rdi), %r10 + movq 24(%rdi), %r11 + movq 32(%rdi), %r12 + movq 40(%rdi), %r13 + movq 48(%rdi), %r14 + movq 56(%rdi), %r15 + movq %r15, %rax + movq $0xfffffffffffffff, %rcx + shrq $56, %rax + shldq $4, %r14, %r15 + shldq $4, %r13, %r14 + shldq $4, %r12, %r13 + shldq $4, %r11, %r12 + andq %rcx, %r11 + andq %rcx, %r15 + # Add order times bits 504..511 + subq %rax, %r14 + sbbq $0x00, %r15 + movq $0xeb2106215d086329, %rdx + mulxq %rax, %rsi, %rcx + movq $0xa7ed9ce5a30a2c13, %rdx + addq %rsi, %r13 + mulxq %rax, %rsi, %rbx + adcq $0x00, %rcx + addq %rsi, %r12 + adcq %rbx, %r13 + adcq %rcx, %r14 + adcq $0x00, %r15 + # Sub product of top 4 words and order + movq $0xa7ed9ce5a30a2c13, %rdx + mulxq %r12, %rcx, %rax + addq %rcx, %r8 + adcq %rax, %r9 + mulxq %r14, %rcx, %rax + adcq %rcx, %r10 + adcq %rax, %r11 + movq $0x00, %rsi + adcq $0x00, %rsi + mulxq %r13, %rcx, %rax + addq %rcx, %r9 + adcq %rax, %r10 + mulxq %r15, %rcx, %rax + adcq %rcx, %r11 + adcq %rax, %rsi + movq $0xeb2106215d086329, %rdx + mulxq %r12, %rcx, %rax + addq %rcx, %r9 + adcq %rax, %r10 + mulxq %r14, %rcx, %rax + adcq %rcx, %r11 + adcq %rax, %rsi + movq $0x00, %rbx + adcq $0x00, %rbx + mulxq %r13, %rcx, %rax + addq %rcx, %r10 + adcq %rax, %r11 + mulxq %r15, %rcx, %rax + adcq %rcx, %rsi + adcq %rax, %rbx + subq %r12, %r10 + movq %rsi, %r12 + sbbq %r13, %r11 + movq %rbx, %r13 + sbbq %r14, %r12 + sbbq %r15, %r13 + movq %r13, %rax + sarq $57, %rax + # Conditionally subtract order starting at bit 125 + movq $0xa000000000000000, %rsi + movq $0xcb024c634b9eba7d, %rbx + movq $0x29bdf3bd45ef39a, %rbp + movq $0x200000000000000, %rcx + andq %rax, %rsi + andq %rax, %rbx + andq %rax, %rbp + andq %rax, %rcx + addq %rsi, %r9 + adcq %rbx, %r10 + adcq %rbp, %r11 + adcq $0x00, %r12 + adcq %rcx, %r13 + # Move bits 252-376 to own registers + movq $0xfffffffffffffff, %rax + shldq $4, %r12, %r13 + shldq $4, %r11, %r12 + andq %rax, %r11 + # Sub product of top 2 words and order + # * -5812631a5cf5d3ed + movq $0xa7ed9ce5a30a2c13, %rdx + mulxq %r12, %rbp, %rax + movq $0x00, %rsi + addq %rbp, %r8 + adcq %rax, %r9 + mulxq %r13, %rbp, %rax + adcq $0x00, %rsi + addq %rbp, %r9 + adcq %rax, %rsi + # * -14def9dea2f79cd7 + movq $0xeb2106215d086329, %rdx + mulxq %r12, %rbp, %rax + movq $0x00, %rbx + addq %rbp, %r9 + adcq %rax, %r10 + mulxq %r13, %rbp, %rax + adcq $0x00, %rbx + addq %rbp, %r10 + adcq %rax, %rbx + # Add overflows at 2 * 64 + movq $0xfffffffffffffff, %rcx + andq %rcx, %r11 + addq %rsi, %r10 + adcq %rbx, %r11 + # Subtract top at 2 * 64 + subq %r12, %r10 + sbbq %r13, %r11 + sbbq %rcx, %rcx + # Conditional sub order + movq $0x5812631a5cf5d3ed, %rsi + movq $0x14def9dea2f79cd6, %rbx + movq $0x1000000000000000, %rbp + andq %rcx, %rsi + andq %rcx, %rbx + andq %rcx, %rbp + addq %rsi, %r8 + movq $0xfffffffffffffff, %rsi + adcq %rbx, %r9 + adcq $0x00, %r10 + adcq %rbp, %r11 + andq %rsi, %r11 + # Store result movq %r8, (%rdi) movq %r9, 8(%rdi) movq %r10, 16(%rdi) movq %r11, 24(%rdi) - movq %r12, (%rbp) - movq %r13, 8(%rbp) - movq %r14, 16(%rbp) - movq %r15, 24(%rbp) - addq $0x50, %rsp + popq %rbp + popq %rbx popq %r15 popq %r14 popq %r13 popq %r12 + repz retq +#ifndef __APPLE__ +.size sc_reduce_avx2,.-sc_reduce_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl sc_muladd_avx2 +.type sc_muladd_avx2,@function +.align 16 +sc_muladd_avx2: +#else +.section __TEXT,__text +.globl _sc_muladd_avx2 +.p2align 4 +_sc_muladd_avx2: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbx + pushq %rbp + movq %rdx, %r8 + movq %rcx, %r9 + # Multiply + # A[0] * B[0] + movq (%r8), %rdx + mulxq (%rsi), %r10, %r11 + # A[2] * B[0] + mulxq 16(%rsi), %r12, %r13 + # A[1] * B[0] + mulxq 8(%rsi), %rax, %rcx + xorq %rbp, %rbp + adcxq %rax, %r11 + # A[3] * B[1] + movq 8(%r8), %rdx + mulxq 24(%rsi), %r14, %r15 + adcxq %rcx, %r12 + # A[0] * B[1] + mulxq (%rsi), %rax, %rcx + adoxq %rax, %r11 + # A[2] * B[1] + mulxq 16(%rsi), %rax, %rbx + adoxq %rcx, %r12 + adcxq %rax, %r13 + # A[1] * B[2] + movq 16(%r8), %rdx + mulxq 8(%rsi), %rax, %rcx + adcxq %rbx, %r14 + adoxq %rax, %r13 + adcxq %rbp, %r15 + adoxq %rcx, %r14 + # A[0] * B[2] + mulxq (%rsi), %rax, %rcx + adoxq %rbp, %r15 + xorq %rbx, %rbx + adcxq %rax, %r12 + # A[1] * B[1] + movq 8(%r8), %rdx + mulxq 8(%rsi), %rdx, %rax + adcxq %rcx, %r13 + adoxq %rdx, %r12 + # A[1] * B[3] + movq 24(%r8), %rdx + adoxq %rax, %r13 + mulxq 8(%rsi), %rax, %rcx + adcxq %rax, %r14 + # A[2] * B[2] + movq 16(%r8), %rdx + mulxq 16(%rsi), %rdx, %rax + adcxq %rcx, %r15 + adoxq %rdx, %r14 + # A[3] * B[3] + movq 24(%r8), %rdx + adoxq %rax, %r15 + mulxq 24(%rsi), %rax, %rcx + adoxq %rbp, %rbx + adcxq %rax, %rbx + # A[0] * B[3] + mulxq (%rsi), %rdx, %rax + adcxq %rcx, %rbp + xorq %rcx, %rcx + adcxq %rdx, %r13 + # A[3] * B[0] + movq 24(%rsi), %rdx + adcxq %rax, %r14 + mulxq (%r8), %rdx, %rax + adoxq %rdx, %r13 + adoxq %rax, %r14 + # A[3] * B[2] + movq 24(%rsi), %rdx + mulxq 16(%r8), %rdx, %rax + adcxq %rdx, %r15 + # A[2] * B[3] + movq 24(%r8), %rdx + adcxq %rax, %rbx + mulxq 16(%rsi), %rax, %rdx + adcxq %rcx, %rbp + adoxq %rax, %r15 + adoxq %rdx, %rbx + adoxq %rcx, %rbp + # Add c to a * b + addq (%r9), %r10 + adcq 8(%r9), %r11 + adcq 16(%r9), %r12 + adcq 24(%r9), %r13 + adcq $0x00, %r14 + adcq $0x00, %r15 + adcq $0x00, %rbx + adcq $0x00, %rbp + movq %rbp, %rax + movq $0xfffffffffffffff, %rcx + shrq $56, %rax + shldq $4, %rbx, %rbp + shldq $4, %r15, %rbx + shldq $4, %r14, %r15 + shldq $4, %r13, %r14 + andq %rcx, %r13 + andq %rcx, %rbp + # Add order times bits 504..507 + subq %rax, %rbx + sbbq $0x00, %rbp + movq $0xeb2106215d086329, %rdx + mulxq %rax, %rsi, %rcx + movq $0xa7ed9ce5a30a2c13, %rdx + addq %rsi, %r15 + mulxq %rax, %rsi, %r8 + adcq $0x00, %rcx + addq %rsi, %r14 + adcq %r8, %r15 + adcq %rcx, %rbx + adcq $0x00, %rbp + # Sub product of top 4 words and order + movq $0xa7ed9ce5a30a2c13, %rdx + mulxq %r14, %rcx, %rax + addq %rcx, %r10 + adcq %rax, %r11 + mulxq %rbx, %rcx, %rax + adcq %rcx, %r12 + adcq %rax, %r13 + movq $0x00, %rsi + adcq $0x00, %rsi + mulxq %r15, %rcx, %rax + addq %rcx, %r11 + adcq %rax, %r12 + mulxq %rbp, %rcx, %rax + adcq %rcx, %r13 + adcq %rax, %rsi + movq $0xeb2106215d086329, %rdx + mulxq %r14, %rcx, %rax + addq %rcx, %r11 + adcq %rax, %r12 + mulxq %rbx, %rcx, %rax + adcq %rcx, %r13 + adcq %rax, %rsi + movq $0x00, %r8 + adcq $0x00, %r8 + mulxq %r15, %rcx, %rax + addq %rcx, %r12 + adcq %rax, %r13 + mulxq %rbp, %rcx, %rax + adcq %rcx, %rsi + adcq %rax, %r8 + subq %r14, %r12 + movq %rsi, %r14 + sbbq %r15, %r13 + movq %r8, %r15 + sbbq %rbx, %r14 + sbbq %rbp, %r15 + movq %r15, %rax + sarq $57, %rax + # Conditionally subtract order starting at bit 125 + movq $0xa000000000000000, %rsi + movq $0xcb024c634b9eba7d, %r8 + movq $0x29bdf3bd45ef39a, %r9 + movq $0x200000000000000, %rcx + andq %rax, %rsi + andq %rax, %r8 + andq %rax, %r9 + andq %rax, %rcx + addq %rsi, %r11 + adcq %r8, %r12 + adcq %r9, %r13 + adcq $0x00, %r14 + adcq %rcx, %r15 + # Move bits 252-376 to own registers + movq $0xfffffffffffffff, %rax + shldq $4, %r14, %r15 + shldq $4, %r13, %r14 + andq %rax, %r13 + # Sub product of top 2 words and order + # * -5812631a5cf5d3ed + movq $0xa7ed9ce5a30a2c13, %rdx + mulxq %r14, %r9, %rax + movq $0x00, %rsi + addq %r9, %r10 + adcq %rax, %r11 + mulxq %r15, %r9, %rax + adcq $0x00, %rsi + addq %r9, %r11 + adcq %rax, %rsi + # * -14def9dea2f79cd7 + movq $0xeb2106215d086329, %rdx + mulxq %r14, %r9, %rax + movq $0x00, %r8 + addq %r9, %r11 + adcq %rax, %r12 + mulxq %r15, %r9, %rax + adcq $0x00, %r8 + addq %r9, %r12 + adcq %rax, %r8 + # Add overflows at 2 * 64 + movq $0xfffffffffffffff, %rcx + andq %rcx, %r13 + addq %rsi, %r12 + adcq %r8, %r13 + # Subtract top at 2 * 64 + subq %r14, %r12 + sbbq %r15, %r13 + sbbq %rcx, %rcx + # Conditional sub order + movq $0x5812631a5cf5d3ed, %rsi + movq $0x14def9dea2f79cd6, %r8 + movq $0x1000000000000000, %r9 + andq %rcx, %rsi + andq %rcx, %r8 + andq %rcx, %r9 + addq %rsi, %r10 + movq $0xfffffffffffffff, %rsi + adcq %r8, %r11 + adcq $0x00, %r12 + adcq %r9, %r13 + andq %rsi, %r13 + # Store result + movq %r10, (%rdi) + movq %r11, 8(%rdi) + movq %r12, 16(%rdi) + movq %r13, 24(%rdi) popq %rbp popq %rbx + popq %r15 + popq %r14 + popq %r13 + popq %r12 repz retq #ifndef __APPLE__ -.size fe_ge_sub_avx2,.-fe_ge_sub_avx2 +.size sc_muladd_avx2,.-sc_muladd_avx2 #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ #endif /* HAVE_INTEL_AVX2 */ #if defined(__linux__) && defined(__ELF__) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ge_448.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_448.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ge_448.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_448.c 2024-08-03 07:30:00.000000000 +0000 @@ -342,9 +342,10 @@ * r [in] Point to hold result. * a [in] Scalar to multiply by. */ -void ge448_scalarmult_base(ge448_p2* h, const byte* a) +int ge448_scalarmult_base(ge448_p2* h, const byte* a) { ge448_scalarmult(h, &ed448_base, a); + return 0; } /* Perform a scalar multplication of the base point and public point. @@ -648,62 +649,62 @@ o = d[ 6] >> 56; d[ 7] += o; d[ 6] = d[ 6] & 0xffffffffffffff; /* Convert to bytes */ - b[ 0] = (d[0 ] >> 0); - b[ 1] = (d[0 ] >> 8); - b[ 2] = (d[0 ] >> 16); - b[ 3] = (d[0 ] >> 24); - b[ 4] = (d[0 ] >> 32); - b[ 5] = (d[0 ] >> 40); - b[ 6] = (d[0 ] >> 48); - b[ 7] = (d[1 ] >> 0); - b[ 8] = (d[1 ] >> 8); - b[ 9] = (d[1 ] >> 16); - b[10] = (d[1 ] >> 24); - b[11] = (d[1 ] >> 32); - b[12] = (d[1 ] >> 40); - b[13] = (d[1 ] >> 48); - b[14] = (d[2 ] >> 0); - b[15] = (d[2 ] >> 8); - b[16] = (d[2 ] >> 16); - b[17] = (d[2 ] >> 24); - b[18] = (d[2 ] >> 32); - b[19] = (d[2 ] >> 40); - b[20] = (d[2 ] >> 48); - b[21] = (d[3 ] >> 0); - b[22] = (d[3 ] >> 8); - b[23] = (d[3 ] >> 16); - b[24] = (d[3 ] >> 24); - b[25] = (d[3 ] >> 32); - b[26] = (d[3 ] >> 40); - b[27] = (d[3 ] >> 48); - b[28] = (d[4 ] >> 0); - b[29] = (d[4 ] >> 8); - b[30] = (d[4 ] >> 16); - b[31] = (d[4 ] >> 24); - b[32] = (d[4 ] >> 32); - b[33] = (d[4 ] >> 40); - b[34] = (d[4 ] >> 48); - b[35] = (d[5 ] >> 0); - b[36] = (d[5 ] >> 8); - b[37] = (d[5 ] >> 16); - b[38] = (d[5 ] >> 24); - b[39] = (d[5 ] >> 32); - b[40] = (d[5 ] >> 40); - b[41] = (d[5 ] >> 48); - b[42] = (d[6 ] >> 0); - b[43] = (d[6 ] >> 8); - b[44] = (d[6 ] >> 16); - b[45] = (d[6 ] >> 24); - b[46] = (d[6 ] >> 32); - b[47] = (d[6 ] >> 40); - b[48] = (d[6 ] >> 48); - b[49] = (d[7 ] >> 0); - b[50] = (d[7 ] >> 8); - b[51] = (d[7 ] >> 16); - b[52] = (d[7 ] >> 24); - b[53] = (d[7 ] >> 32); - b[54] = (d[7 ] >> 40); - b[55] = (d[7 ] >> 48); + b[ 0] = (byte)(d[0 ] >> 0); + b[ 1] = (byte)(d[0 ] >> 8); + b[ 2] = (byte)(d[0 ] >> 16); + b[ 3] = (byte)(d[0 ] >> 24); + b[ 4] = (byte)(d[0 ] >> 32); + b[ 5] = (byte)(d[0 ] >> 40); + b[ 6] = (byte)(d[0 ] >> 48); + b[ 7] = (byte)(d[1 ] >> 0); + b[ 8] = (byte)(d[1 ] >> 8); + b[ 9] = (byte)(d[1 ] >> 16); + b[10] = (byte)(d[1 ] >> 24); + b[11] = (byte)(d[1 ] >> 32); + b[12] = (byte)(d[1 ] >> 40); + b[13] = (byte)(d[1 ] >> 48); + b[14] = (byte)(d[2 ] >> 0); + b[15] = (byte)(d[2 ] >> 8); + b[16] = (byte)(d[2 ] >> 16); + b[17] = (byte)(d[2 ] >> 24); + b[18] = (byte)(d[2 ] >> 32); + b[19] = (byte)(d[2 ] >> 40); + b[20] = (byte)(d[2 ] >> 48); + b[21] = (byte)(d[3 ] >> 0); + b[22] = (byte)(d[3 ] >> 8); + b[23] = (byte)(d[3 ] >> 16); + b[24] = (byte)(d[3 ] >> 24); + b[25] = (byte)(d[3 ] >> 32); + b[26] = (byte)(d[3 ] >> 40); + b[27] = (byte)(d[3 ] >> 48); + b[28] = (byte)(d[4 ] >> 0); + b[29] = (byte)(d[4 ] >> 8); + b[30] = (byte)(d[4 ] >> 16); + b[31] = (byte)(d[4 ] >> 24); + b[32] = (byte)(d[4 ] >> 32); + b[33] = (byte)(d[4 ] >> 40); + b[34] = (byte)(d[4 ] >> 48); + b[35] = (byte)(d[5 ] >> 0); + b[36] = (byte)(d[5 ] >> 8); + b[37] = (byte)(d[5 ] >> 16); + b[38] = (byte)(d[5 ] >> 24); + b[39] = (byte)(d[5 ] >> 32); + b[40] = (byte)(d[5 ] >> 40); + b[41] = (byte)(d[5 ] >> 48); + b[42] = (byte)(d[6 ] >> 0); + b[43] = (byte)(d[6 ] >> 8); + b[44] = (byte)(d[6 ] >> 16); + b[45] = (byte)(d[6 ] >> 24); + b[46] = (byte)(d[6 ] >> 32); + b[47] = (byte)(d[6 ] >> 40); + b[48] = (byte)(d[6 ] >> 48); + b[49] = (byte)(d[7 ] >> 0); + b[50] = (byte)(d[7 ] >> 8); + b[51] = (byte)(d[7 ] >> 16); + b[52] = (byte)(d[7 ] >> 24); + b[53] = (byte)(d[7 ] >> 32); + b[54] = (byte)(d[7 ] >> 40); + b[55] = (byte)(d[7 ] >> 48); b[56] = 0; } @@ -894,70 +895,70 @@ | ((sword64) (d[55]) << 48); /* a * b + d */ - t[ 0] = dd[ 0] + (sword128)ad[ 0] * bd[ 0]; - t[ 1] = dd[ 1] + (sword128)ad[ 0] * bd[ 1] - + (sword128)ad[ 1] * bd[ 0]; - t[ 2] = dd[ 2] + (sword128)ad[ 0] * bd[ 2] - + (sword128)ad[ 1] * bd[ 1] - + (sword128)ad[ 2] * bd[ 0]; - t[ 3] = dd[ 3] + (sword128)ad[ 0] * bd[ 3] - + (sword128)ad[ 1] * bd[ 2] - + (sword128)ad[ 2] * bd[ 1] - + (sword128)ad[ 3] * bd[ 0]; - t[ 4] = dd[ 4] + (sword128)ad[ 0] * bd[ 4] - + (sword128)ad[ 1] * bd[ 3] - + (sword128)ad[ 2] * bd[ 2] - + (sword128)ad[ 3] * bd[ 1] - + (sword128)ad[ 4] * bd[ 0]; - t[ 5] = dd[ 5] + (sword128)ad[ 0] * bd[ 5] - + (sword128)ad[ 1] * bd[ 4] - + (sword128)ad[ 2] * bd[ 3] - + (sword128)ad[ 3] * bd[ 2] - + (sword128)ad[ 4] * bd[ 1] - + (sword128)ad[ 5] * bd[ 0]; - t[ 6] = dd[ 6] + (sword128)ad[ 0] * bd[ 6] - + (sword128)ad[ 1] * bd[ 5] - + (sword128)ad[ 2] * bd[ 4] - + (sword128)ad[ 3] * bd[ 3] - + (sword128)ad[ 4] * bd[ 2] - + (sword128)ad[ 5] * bd[ 1] - + (sword128)ad[ 6] * bd[ 0]; - t[ 7] = dd[ 7] + (sword128)ad[ 0] * bd[ 7] - + (sword128)ad[ 1] * bd[ 6] - + (sword128)ad[ 2] * bd[ 5] - + (sword128)ad[ 3] * bd[ 4] - + (sword128)ad[ 4] * bd[ 3] - + (sword128)ad[ 5] * bd[ 2] - + (sword128)ad[ 6] * bd[ 1] - + (sword128)ad[ 7] * bd[ 0]; - t[ 8] = (sword128)ad[ 1] * bd[ 7] - + (sword128)ad[ 2] * bd[ 6] - + (sword128)ad[ 3] * bd[ 5] - + (sword128)ad[ 4] * bd[ 4] - + (sword128)ad[ 5] * bd[ 3] - + (sword128)ad[ 6] * bd[ 2] - + (sword128)ad[ 7] * bd[ 1]; - t[ 9] = (sword128)ad[ 2] * bd[ 7] - + (sword128)ad[ 3] * bd[ 6] - + (sword128)ad[ 4] * bd[ 5] - + (sword128)ad[ 5] * bd[ 4] - + (sword128)ad[ 6] * bd[ 3] - + (sword128)ad[ 7] * bd[ 2]; - t[10] = (sword128)ad[ 3] * bd[ 7] - + (sword128)ad[ 4] * bd[ 6] - + (sword128)ad[ 5] * bd[ 5] - + (sword128)ad[ 6] * bd[ 4] - + (sword128)ad[ 7] * bd[ 3]; - t[11] = (sword128)ad[ 4] * bd[ 7] - + (sword128)ad[ 5] * bd[ 6] - + (sword128)ad[ 6] * bd[ 5] - + (sword128)ad[ 7] * bd[ 4]; - t[12] = (sword128)ad[ 5] * bd[ 7] - + (sword128)ad[ 6] * bd[ 6] - + (sword128)ad[ 7] * bd[ 5]; - t[13] = (sword128)ad[ 6] * bd[ 7] - + (sword128)ad[ 7] * bd[ 6]; - t[14] = (sword128)ad[ 7] * bd[ 7]; + t[ 0] = (word128)dd[ 0] + (sword128)ad[ 0] * bd[ 0]; + t[ 1] = (word128)dd[ 1] + (sword128)ad[ 0] * bd[ 1] + + (sword128)ad[ 1] * bd[ 0]; + t[ 2] = (word128)dd[ 2] + (sword128)ad[ 0] * bd[ 2] + + (sword128)ad[ 1] * bd[ 1] + + (sword128)ad[ 2] * bd[ 0]; + t[ 3] = (word128)dd[ 3] + (sword128)ad[ 0] * bd[ 3] + + (sword128)ad[ 1] * bd[ 2] + + (sword128)ad[ 2] * bd[ 1] + + (sword128)ad[ 3] * bd[ 0]; + t[ 4] = (word128)dd[ 4] + (sword128)ad[ 0] * bd[ 4] + + (sword128)ad[ 1] * bd[ 3] + + (sword128)ad[ 2] * bd[ 2] + + (sword128)ad[ 3] * bd[ 1] + + (sword128)ad[ 4] * bd[ 0]; + t[ 5] = (word128)dd[ 5] + (sword128)ad[ 0] * bd[ 5] + + (sword128)ad[ 1] * bd[ 4] + + (sword128)ad[ 2] * bd[ 3] + + (sword128)ad[ 3] * bd[ 2] + + (sword128)ad[ 4] * bd[ 1] + + (sword128)ad[ 5] * bd[ 0]; + t[ 6] = (word128)dd[ 6] + (sword128)ad[ 0] * bd[ 6] + + (sword128)ad[ 1] * bd[ 5] + + (sword128)ad[ 2] * bd[ 4] + + (sword128)ad[ 3] * bd[ 3] + + (sword128)ad[ 4] * bd[ 2] + + (sword128)ad[ 5] * bd[ 1] + + (sword128)ad[ 6] * bd[ 0]; + t[ 7] = (word128)dd[ 7] + (sword128)ad[ 0] * bd[ 7] + + (sword128)ad[ 1] * bd[ 6] + + (sword128)ad[ 2] * bd[ 5] + + (sword128)ad[ 3] * bd[ 4] + + (sword128)ad[ 4] * bd[ 3] + + (sword128)ad[ 5] * bd[ 2] + + (sword128)ad[ 6] * bd[ 1] + + (sword128)ad[ 7] * bd[ 0]; + t[ 8] = (word128) (sword128)ad[ 1] * bd[ 7] + + (sword128)ad[ 2] * bd[ 6] + + (sword128)ad[ 3] * bd[ 5] + + (sword128)ad[ 4] * bd[ 4] + + (sword128)ad[ 5] * bd[ 3] + + (sword128)ad[ 6] * bd[ 2] + + (sword128)ad[ 7] * bd[ 1]; + t[ 9] = (word128) (sword128)ad[ 2] * bd[ 7] + + (sword128)ad[ 3] * bd[ 6] + + (sword128)ad[ 4] * bd[ 5] + + (sword128)ad[ 5] * bd[ 4] + + (sword128)ad[ 6] * bd[ 3] + + (sword128)ad[ 7] * bd[ 2]; + t[10] = (word128) (sword128)ad[ 3] * bd[ 7] + + (sword128)ad[ 4] * bd[ 6] + + (sword128)ad[ 5] * bd[ 5] + + (sword128)ad[ 6] * bd[ 4] + + (sword128)ad[ 7] * bd[ 3]; + t[11] = (word128) (sword128)ad[ 4] * bd[ 7] + + (sword128)ad[ 5] * bd[ 6] + + (sword128)ad[ 6] * bd[ 5] + + (sword128)ad[ 7] * bd[ 4]; + t[12] = (word128) (sword128)ad[ 5] * bd[ 7] + + (sword128)ad[ 6] * bd[ 6] + + (sword128)ad[ 7] * bd[ 5]; + t[13] = (word128) (sword128)ad[ 6] * bd[ 7] + + (sword128)ad[ 7] * bd[ 6]; + t[14] = (word128) (sword128)ad[ 7] * bd[ 7]; t[15] = 0; /* Mod curve order */ @@ -1045,62 +1046,62 @@ o = rd[ 6] >> 56; rd[ 7] += o; rd[ 6] = rd[ 6] & 0xffffffffffffff; /* Convert to bytes */ - r[ 0] = (rd[0 ] >> 0); - r[ 1] = (rd[0 ] >> 8); - r[ 2] = (rd[0 ] >> 16); - r[ 3] = (rd[0 ] >> 24); - r[ 4] = (rd[0 ] >> 32); - r[ 5] = (rd[0 ] >> 40); - r[ 6] = (rd[0 ] >> 48); - r[ 7] = (rd[1 ] >> 0); - r[ 8] = (rd[1 ] >> 8); - r[ 9] = (rd[1 ] >> 16); - r[10] = (rd[1 ] >> 24); - r[11] = (rd[1 ] >> 32); - r[12] = (rd[1 ] >> 40); - r[13] = (rd[1 ] >> 48); - r[14] = (rd[2 ] >> 0); - r[15] = (rd[2 ] >> 8); - r[16] = (rd[2 ] >> 16); - r[17] = (rd[2 ] >> 24); - r[18] = (rd[2 ] >> 32); - r[19] = (rd[2 ] >> 40); - r[20] = (rd[2 ] >> 48); - r[21] = (rd[3 ] >> 0); - r[22] = (rd[3 ] >> 8); - r[23] = (rd[3 ] >> 16); - r[24] = (rd[3 ] >> 24); - r[25] = (rd[3 ] >> 32); - r[26] = (rd[3 ] >> 40); - r[27] = (rd[3 ] >> 48); - r[28] = (rd[4 ] >> 0); - r[29] = (rd[4 ] >> 8); - r[30] = (rd[4 ] >> 16); - r[31] = (rd[4 ] >> 24); - r[32] = (rd[4 ] >> 32); - r[33] = (rd[4 ] >> 40); - r[34] = (rd[4 ] >> 48); - r[35] = (rd[5 ] >> 0); - r[36] = (rd[5 ] >> 8); - r[37] = (rd[5 ] >> 16); - r[38] = (rd[5 ] >> 24); - r[39] = (rd[5 ] >> 32); - r[40] = (rd[5 ] >> 40); - r[41] = (rd[5 ] >> 48); - r[42] = (rd[6 ] >> 0); - r[43] = (rd[6 ] >> 8); - r[44] = (rd[6 ] >> 16); - r[45] = (rd[6 ] >> 24); - r[46] = (rd[6 ] >> 32); - r[47] = (rd[6 ] >> 40); - r[48] = (rd[6 ] >> 48); - r[49] = (rd[7 ] >> 0); - r[50] = (rd[7 ] >> 8); - r[51] = (rd[7 ] >> 16); - r[52] = (rd[7 ] >> 24); - r[53] = (rd[7 ] >> 32); - r[54] = (rd[7 ] >> 40); - r[55] = (rd[7 ] >> 48); + r[ 0] = (byte)(rd[0 ] >> 0); + r[ 1] = (byte)(rd[0 ] >> 8); + r[ 2] = (byte)(rd[0 ] >> 16); + r[ 3] = (byte)(rd[0 ] >> 24); + r[ 4] = (byte)(rd[0 ] >> 32); + r[ 5] = (byte)(rd[0 ] >> 40); + r[ 6] = (byte)(rd[0 ] >> 48); + r[ 7] = (byte)(rd[1 ] >> 0); + r[ 8] = (byte)(rd[1 ] >> 8); + r[ 9] = (byte)(rd[1 ] >> 16); + r[10] = (byte)(rd[1 ] >> 24); + r[11] = (byte)(rd[1 ] >> 32); + r[12] = (byte)(rd[1 ] >> 40); + r[13] = (byte)(rd[1 ] >> 48); + r[14] = (byte)(rd[2 ] >> 0); + r[15] = (byte)(rd[2 ] >> 8); + r[16] = (byte)(rd[2 ] >> 16); + r[17] = (byte)(rd[2 ] >> 24); + r[18] = (byte)(rd[2 ] >> 32); + r[19] = (byte)(rd[2 ] >> 40); + r[20] = (byte)(rd[2 ] >> 48); + r[21] = (byte)(rd[3 ] >> 0); + r[22] = (byte)(rd[3 ] >> 8); + r[23] = (byte)(rd[3 ] >> 16); + r[24] = (byte)(rd[3 ] >> 24); + r[25] = (byte)(rd[3 ] >> 32); + r[26] = (byte)(rd[3 ] >> 40); + r[27] = (byte)(rd[3 ] >> 48); + r[28] = (byte)(rd[4 ] >> 0); + r[29] = (byte)(rd[4 ] >> 8); + r[30] = (byte)(rd[4 ] >> 16); + r[31] = (byte)(rd[4 ] >> 24); + r[32] = (byte)(rd[4 ] >> 32); + r[33] = (byte)(rd[4 ] >> 40); + r[34] = (byte)(rd[4 ] >> 48); + r[35] = (byte)(rd[5 ] >> 0); + r[36] = (byte)(rd[5 ] >> 8); + r[37] = (byte)(rd[5 ] >> 16); + r[38] = (byte)(rd[5 ] >> 24); + r[39] = (byte)(rd[5 ] >> 32); + r[40] = (byte)(rd[5 ] >> 40); + r[41] = (byte)(rd[5 ] >> 48); + r[42] = (byte)(rd[6 ] >> 0); + r[43] = (byte)(rd[6 ] >> 8); + r[44] = (byte)(rd[6 ] >> 16); + r[45] = (byte)(rd[6 ] >> 24); + r[46] = (byte)(rd[6 ] >> 32); + r[47] = (byte)(rd[6 ] >> 40); + r[48] = (byte)(rd[6 ] >> 48); + r[49] = (byte)(rd[7 ] >> 0); + r[50] = (byte)(rd[7 ] >> 8); + r[51] = (byte)(rd[7 ] >> 16); + r[52] = (byte)(rd[7 ] >> 24); + r[53] = (byte)(rd[7 ] >> 32); + r[54] = (byte)(rd[7 ] >> 40); + r[55] = (byte)(rd[7 ] >> 48); r[56] = 0; } @@ -5449,62 +5450,62 @@ o = d[14] >> 28; d[15] += o; d[14] = d[14] & 0xfffffff; /* Convert to bytes */ - b[ 0] = (d[0 ] >> 0); - b[ 1] = (d[0 ] >> 8); - b[ 2] = (d[0 ] >> 16); - b[ 3] = (d[0 ] >> 24) + ((d[1 ] >> 0) << 4); - b[ 4] = (d[1 ] >> 4); - b[ 5] = (d[1 ] >> 12); - b[ 6] = (d[1 ] >> 20); - b[ 7] = (d[2 ] >> 0); - b[ 8] = (d[2 ] >> 8); - b[ 9] = (d[2 ] >> 16); - b[10] = (d[2 ] >> 24) + ((d[3 ] >> 0) << 4); - b[11] = (d[3 ] >> 4); - b[12] = (d[3 ] >> 12); - b[13] = (d[3 ] >> 20); - b[14] = (d[4 ] >> 0); - b[15] = (d[4 ] >> 8); - b[16] = (d[4 ] >> 16); - b[17] = (d[4 ] >> 24) + ((d[5 ] >> 0) << 4); - b[18] = (d[5 ] >> 4); - b[19] = (d[5 ] >> 12); - b[20] = (d[5 ] >> 20); - b[21] = (d[6 ] >> 0); - b[22] = (d[6 ] >> 8); - b[23] = (d[6 ] >> 16); - b[24] = (d[6 ] >> 24) + ((d[7 ] >> 0) << 4); - b[25] = (d[7 ] >> 4); - b[26] = (d[7 ] >> 12); - b[27] = (d[7 ] >> 20); - b[28] = (d[8 ] >> 0); - b[29] = (d[8 ] >> 8); - b[30] = (d[8 ] >> 16); - b[31] = (d[8 ] >> 24) + ((d[9 ] >> 0) << 4); - b[32] = (d[9 ] >> 4); - b[33] = (d[9 ] >> 12); - b[34] = (d[9 ] >> 20); - b[35] = (d[10] >> 0); - b[36] = (d[10] >> 8); - b[37] = (d[10] >> 16); - b[38] = (d[10] >> 24) + ((d[11] >> 0) << 4); - b[39] = (d[11] >> 4); - b[40] = (d[11] >> 12); - b[41] = (d[11] >> 20); - b[42] = (d[12] >> 0); - b[43] = (d[12] >> 8); - b[44] = (d[12] >> 16); - b[45] = (d[12] >> 24) + ((d[13] >> 0) << 4); - b[46] = (d[13] >> 4); - b[47] = (d[13] >> 12); - b[48] = (d[13] >> 20); - b[49] = (d[14] >> 0); - b[50] = (d[14] >> 8); - b[51] = (d[14] >> 16); - b[52] = (d[14] >> 24) + ((d[15] >> 0) << 4); - b[53] = (d[15] >> 4); - b[54] = (d[15] >> 12); - b[55] = (d[15] >> 20); + b[ 0] = (byte)(d[0 ] >> 0); + b[ 1] = (byte)(d[0 ] >> 8); + b[ 2] = (byte)(d[0 ] >> 16); + b[ 3] = (byte)((d[0 ] >> 24) + ((d[1 ] >> 0) << 4)); + b[ 4] = (byte)(d[1 ] >> 4); + b[ 5] = (byte)(d[1 ] >> 12); + b[ 6] = (byte)(d[1 ] >> 20); + b[ 7] = (byte)(d[2 ] >> 0); + b[ 8] = (byte)(d[2 ] >> 8); + b[ 9] = (byte)(d[2 ] >> 16); + b[10] = (byte)((d[2 ] >> 24) + ((d[3 ] >> 0) << 4)); + b[11] = (byte)(d[3 ] >> 4); + b[12] = (byte)(d[3 ] >> 12); + b[13] = (byte)(d[3 ] >> 20); + b[14] = (byte)(d[4 ] >> 0); + b[15] = (byte)(d[4 ] >> 8); + b[16] = (byte)(d[4 ] >> 16); + b[17] = (byte)((d[4 ] >> 24) + ((d[5 ] >> 0) << 4)); + b[18] = (byte)(d[5 ] >> 4); + b[19] = (byte)(d[5 ] >> 12); + b[20] = (byte)(d[5 ] >> 20); + b[21] = (byte)(d[6 ] >> 0); + b[22] = (byte)(d[6 ] >> 8); + b[23] = (byte)(d[6 ] >> 16); + b[24] = (byte)((d[6 ] >> 24) + ((d[7 ] >> 0) << 4)); + b[25] = (byte)(d[7 ] >> 4); + b[26] = (byte)(d[7 ] >> 12); + b[27] = (byte)(d[7 ] >> 20); + b[28] = (byte)(d[8 ] >> 0); + b[29] = (byte)(d[8 ] >> 8); + b[30] = (byte)(d[8 ] >> 16); + b[31] = (byte)((d[8 ] >> 24) + ((d[9 ] >> 0) << 4)); + b[32] = (byte)(d[9 ] >> 4); + b[33] = (byte)(d[9 ] >> 12); + b[34] = (byte)(d[9 ] >> 20); + b[35] = (byte)(d[10] >> 0); + b[36] = (byte)(d[10] >> 8); + b[37] = (byte)(d[10] >> 16); + b[38] = (byte)((d[10] >> 24) + ((d[11] >> 0) << 4)); + b[39] = (byte)(d[11] >> 4); + b[40] = (byte)(d[11] >> 12); + b[41] = (byte)(d[11] >> 20); + b[42] = (byte)(d[12] >> 0); + b[43] = (byte)(d[12] >> 8); + b[44] = (byte)(d[12] >> 16); + b[45] = (byte)((d[12] >> 24) + ((d[13] >> 0) << 4)); + b[46] = (byte)(d[13] >> 4); + b[47] = (byte)(d[13] >> 12); + b[48] = (byte)(d[13] >> 20); + b[49] = (byte)(d[14] >> 0); + b[50] = (byte)(d[14] >> 8); + b[51] = (byte)(d[14] >> 16); + b[52] = (byte)((d[14] >> 24) + ((d[15] >> 0) << 4)); + b[53] = (byte)(d[15] >> 4); + b[54] = (byte)(d[15] >> 12); + b[55] = (byte)(d[15] >> 20); b[56] = 0; } @@ -5719,262 +5720,262 @@ | (((sword32)((d[55] ) >> 0)) << 20); /* a * b + d */ - t[ 0] = dd[ 0] + (sword64)ad[ 0] * bd[ 0]; - t[ 1] = dd[ 1] + (sword64)ad[ 0] * bd[ 1] - + (sword64)ad[ 1] * bd[ 0]; - t[ 2] = dd[ 2] + (sword64)ad[ 0] * bd[ 2] - + (sword64)ad[ 1] * bd[ 1] - + (sword64)ad[ 2] * bd[ 0]; - t[ 3] = dd[ 3] + (sword64)ad[ 0] * bd[ 3] - + (sword64)ad[ 1] * bd[ 2] - + (sword64)ad[ 2] * bd[ 1] - + (sword64)ad[ 3] * bd[ 0]; - t[ 4] = dd[ 4] + (sword64)ad[ 0] * bd[ 4] - + (sword64)ad[ 1] * bd[ 3] - + (sword64)ad[ 2] * bd[ 2] - + (sword64)ad[ 3] * bd[ 1] - + (sword64)ad[ 4] * bd[ 0]; - t[ 5] = dd[ 5] + (sword64)ad[ 0] * bd[ 5] - + (sword64)ad[ 1] * bd[ 4] - + (sword64)ad[ 2] * bd[ 3] - + (sword64)ad[ 3] * bd[ 2] - + (sword64)ad[ 4] * bd[ 1] - + (sword64)ad[ 5] * bd[ 0]; - t[ 6] = dd[ 6] + (sword64)ad[ 0] * bd[ 6] - + (sword64)ad[ 1] * bd[ 5] - + (sword64)ad[ 2] * bd[ 4] - + (sword64)ad[ 3] * bd[ 3] - + (sword64)ad[ 4] * bd[ 2] - + (sword64)ad[ 5] * bd[ 1] - + (sword64)ad[ 6] * bd[ 0]; - t[ 7] = dd[ 7] + (sword64)ad[ 0] * bd[ 7] - + (sword64)ad[ 1] * bd[ 6] - + (sword64)ad[ 2] * bd[ 5] - + (sword64)ad[ 3] * bd[ 4] - + (sword64)ad[ 4] * bd[ 3] - + (sword64)ad[ 5] * bd[ 2] - + (sword64)ad[ 6] * bd[ 1] - + (sword64)ad[ 7] * bd[ 0]; - t[ 8] = dd[ 8] + (sword64)ad[ 0] * bd[ 8] - + (sword64)ad[ 1] * bd[ 7] - + (sword64)ad[ 2] * bd[ 6] - + (sword64)ad[ 3] * bd[ 5] - + (sword64)ad[ 4] * bd[ 4] - + (sword64)ad[ 5] * bd[ 3] - + (sword64)ad[ 6] * bd[ 2] - + (sword64)ad[ 7] * bd[ 1] - + (sword64)ad[ 8] * bd[ 0]; - t[ 9] = dd[ 9] + (sword64)ad[ 0] * bd[ 9] - + (sword64)ad[ 1] * bd[ 8] - + (sword64)ad[ 2] * bd[ 7] - + (sword64)ad[ 3] * bd[ 6] - + (sword64)ad[ 4] * bd[ 5] - + (sword64)ad[ 5] * bd[ 4] - + (sword64)ad[ 6] * bd[ 3] - + (sword64)ad[ 7] * bd[ 2] - + (sword64)ad[ 8] * bd[ 1] - + (sword64)ad[ 9] * bd[ 0]; - t[10] = dd[10] + (sword64)ad[ 0] * bd[10] - + (sword64)ad[ 1] * bd[ 9] - + (sword64)ad[ 2] * bd[ 8] - + (sword64)ad[ 3] * bd[ 7] - + (sword64)ad[ 4] * bd[ 6] - + (sword64)ad[ 5] * bd[ 5] - + (sword64)ad[ 6] * bd[ 4] - + (sword64)ad[ 7] * bd[ 3] - + (sword64)ad[ 8] * bd[ 2] - + (sword64)ad[ 9] * bd[ 1] - + (sword64)ad[10] * bd[ 0]; - t[11] = dd[11] + (sword64)ad[ 0] * bd[11] - + (sword64)ad[ 1] * bd[10] - + (sword64)ad[ 2] * bd[ 9] - + (sword64)ad[ 3] * bd[ 8] - + (sword64)ad[ 4] * bd[ 7] - + (sword64)ad[ 5] * bd[ 6] - + (sword64)ad[ 6] * bd[ 5] - + (sword64)ad[ 7] * bd[ 4] - + (sword64)ad[ 8] * bd[ 3] - + (sword64)ad[ 9] * bd[ 2] - + (sword64)ad[10] * bd[ 1] - + (sword64)ad[11] * bd[ 0]; - t[12] = dd[12] + (sword64)ad[ 0] * bd[12] - + (sword64)ad[ 1] * bd[11] - + (sword64)ad[ 2] * bd[10] - + (sword64)ad[ 3] * bd[ 9] - + (sword64)ad[ 4] * bd[ 8] - + (sword64)ad[ 5] * bd[ 7] - + (sword64)ad[ 6] * bd[ 6] - + (sword64)ad[ 7] * bd[ 5] - + (sword64)ad[ 8] * bd[ 4] - + (sword64)ad[ 9] * bd[ 3] - + (sword64)ad[10] * bd[ 2] - + (sword64)ad[11] * bd[ 1] - + (sword64)ad[12] * bd[ 0]; - t[13] = dd[13] + (sword64)ad[ 0] * bd[13] - + (sword64)ad[ 1] * bd[12] - + (sword64)ad[ 2] * bd[11] - + (sword64)ad[ 3] * bd[10] - + (sword64)ad[ 4] * bd[ 9] - + (sword64)ad[ 5] * bd[ 8] - + (sword64)ad[ 6] * bd[ 7] - + (sword64)ad[ 7] * bd[ 6] - + (sword64)ad[ 8] * bd[ 5] - + (sword64)ad[ 9] * bd[ 4] - + (sword64)ad[10] * bd[ 3] - + (sword64)ad[11] * bd[ 2] - + (sword64)ad[12] * bd[ 1] - + (sword64)ad[13] * bd[ 0]; - t[14] = dd[14] + (sword64)ad[ 0] * bd[14] - + (sword64)ad[ 1] * bd[13] - + (sword64)ad[ 2] * bd[12] - + (sword64)ad[ 3] * bd[11] - + (sword64)ad[ 4] * bd[10] - + (sword64)ad[ 5] * bd[ 9] - + (sword64)ad[ 6] * bd[ 8] - + (sword64)ad[ 7] * bd[ 7] - + (sword64)ad[ 8] * bd[ 6] - + (sword64)ad[ 9] * bd[ 5] - + (sword64)ad[10] * bd[ 4] - + (sword64)ad[11] * bd[ 3] - + (sword64)ad[12] * bd[ 2] - + (sword64)ad[13] * bd[ 1] - + (sword64)ad[14] * bd[ 0]; - t[15] = dd[15] + (sword64)ad[ 0] * bd[15] - + (sword64)ad[ 1] * bd[14] - + (sword64)ad[ 2] * bd[13] - + (sword64)ad[ 3] * bd[12] - + (sword64)ad[ 4] * bd[11] - + (sword64)ad[ 5] * bd[10] - + (sword64)ad[ 6] * bd[ 9] - + (sword64)ad[ 7] * bd[ 8] - + (sword64)ad[ 8] * bd[ 7] - + (sword64)ad[ 9] * bd[ 6] - + (sword64)ad[10] * bd[ 5] - + (sword64)ad[11] * bd[ 4] - + (sword64)ad[12] * bd[ 3] - + (sword64)ad[13] * bd[ 2] - + (sword64)ad[14] * bd[ 1] - + (sword64)ad[15] * bd[ 0]; - t[16] = (sword64)ad[ 1] * bd[15] - + (sword64)ad[ 2] * bd[14] - + (sword64)ad[ 3] * bd[13] - + (sword64)ad[ 4] * bd[12] - + (sword64)ad[ 5] * bd[11] - + (sword64)ad[ 6] * bd[10] - + (sword64)ad[ 7] * bd[ 9] - + (sword64)ad[ 8] * bd[ 8] - + (sword64)ad[ 9] * bd[ 7] - + (sword64)ad[10] * bd[ 6] - + (sword64)ad[11] * bd[ 5] - + (sword64)ad[12] * bd[ 4] - + (sword64)ad[13] * bd[ 3] - + (sword64)ad[14] * bd[ 2] - + (sword64)ad[15] * bd[ 1]; - t[17] = (sword64)ad[ 2] * bd[15] - + (sword64)ad[ 3] * bd[14] - + (sword64)ad[ 4] * bd[13] - + (sword64)ad[ 5] * bd[12] - + (sword64)ad[ 6] * bd[11] - + (sword64)ad[ 7] * bd[10] - + (sword64)ad[ 8] * bd[ 9] - + (sword64)ad[ 9] * bd[ 8] - + (sword64)ad[10] * bd[ 7] - + (sword64)ad[11] * bd[ 6] - + (sword64)ad[12] * bd[ 5] - + (sword64)ad[13] * bd[ 4] - + (sword64)ad[14] * bd[ 3] - + (sword64)ad[15] * bd[ 2]; - t[18] = (sword64)ad[ 3] * bd[15] - + (sword64)ad[ 4] * bd[14] - + (sword64)ad[ 5] * bd[13] - + (sword64)ad[ 6] * bd[12] - + (sword64)ad[ 7] * bd[11] - + (sword64)ad[ 8] * bd[10] - + (sword64)ad[ 9] * bd[ 9] - + (sword64)ad[10] * bd[ 8] - + (sword64)ad[11] * bd[ 7] - + (sword64)ad[12] * bd[ 6] - + (sword64)ad[13] * bd[ 5] - + (sword64)ad[14] * bd[ 4] - + (sword64)ad[15] * bd[ 3]; - t[19] = (sword64)ad[ 4] * bd[15] - + (sword64)ad[ 5] * bd[14] - + (sword64)ad[ 6] * bd[13] - + (sword64)ad[ 7] * bd[12] - + (sword64)ad[ 8] * bd[11] - + (sword64)ad[ 9] * bd[10] - + (sword64)ad[10] * bd[ 9] - + (sword64)ad[11] * bd[ 8] - + (sword64)ad[12] * bd[ 7] - + (sword64)ad[13] * bd[ 6] - + (sword64)ad[14] * bd[ 5] - + (sword64)ad[15] * bd[ 4]; - t[20] = (sword64)ad[ 5] * bd[15] - + (sword64)ad[ 6] * bd[14] - + (sword64)ad[ 7] * bd[13] - + (sword64)ad[ 8] * bd[12] - + (sword64)ad[ 9] * bd[11] - + (sword64)ad[10] * bd[10] - + (sword64)ad[11] * bd[ 9] - + (sword64)ad[12] * bd[ 8] - + (sword64)ad[13] * bd[ 7] - + (sword64)ad[14] * bd[ 6] - + (sword64)ad[15] * bd[ 5]; - t[21] = (sword64)ad[ 6] * bd[15] - + (sword64)ad[ 7] * bd[14] - + (sword64)ad[ 8] * bd[13] - + (sword64)ad[ 9] * bd[12] - + (sword64)ad[10] * bd[11] - + (sword64)ad[11] * bd[10] - + (sword64)ad[12] * bd[ 9] - + (sword64)ad[13] * bd[ 8] - + (sword64)ad[14] * bd[ 7] - + (sword64)ad[15] * bd[ 6]; - t[22] = (sword64)ad[ 7] * bd[15] - + (sword64)ad[ 8] * bd[14] - + (sword64)ad[ 9] * bd[13] - + (sword64)ad[10] * bd[12] - + (sword64)ad[11] * bd[11] - + (sword64)ad[12] * bd[10] - + (sword64)ad[13] * bd[ 9] - + (sword64)ad[14] * bd[ 8] - + (sword64)ad[15] * bd[ 7]; - t[23] = (sword64)ad[ 8] * bd[15] - + (sword64)ad[ 9] * bd[14] - + (sword64)ad[10] * bd[13] - + (sword64)ad[11] * bd[12] - + (sword64)ad[12] * bd[11] - + (sword64)ad[13] * bd[10] - + (sword64)ad[14] * bd[ 9] - + (sword64)ad[15] * bd[ 8]; - t[24] = (sword64)ad[ 9] * bd[15] - + (sword64)ad[10] * bd[14] - + (sword64)ad[11] * bd[13] - + (sword64)ad[12] * bd[12] - + (sword64)ad[13] * bd[11] - + (sword64)ad[14] * bd[10] - + (sword64)ad[15] * bd[ 9]; - t[25] = (sword64)ad[10] * bd[15] - + (sword64)ad[11] * bd[14] - + (sword64)ad[12] * bd[13] - + (sword64)ad[13] * bd[12] - + (sword64)ad[14] * bd[11] - + (sword64)ad[15] * bd[10]; - t[26] = (sword64)ad[11] * bd[15] - + (sword64)ad[12] * bd[14] - + (sword64)ad[13] * bd[13] - + (sword64)ad[14] * bd[12] - + (sword64)ad[15] * bd[11]; - t[27] = (sword64)ad[12] * bd[15] - + (sword64)ad[13] * bd[14] - + (sword64)ad[14] * bd[13] - + (sword64)ad[15] * bd[12]; - t[28] = (sword64)ad[13] * bd[15] - + (sword64)ad[14] * bd[14] - + (sword64)ad[15] * bd[13]; - t[29] = (sword64)ad[14] * bd[15] - + (sword64)ad[15] * bd[14]; - t[30] = (sword64)ad[15] * bd[15]; + t[ 0] = (word64)dd[ 0] + (sword64)ad[ 0] * bd[ 0]; + t[ 1] = (word64)dd[ 1] + (sword64)ad[ 0] * bd[ 1] + + (sword64)ad[ 1] * bd[ 0]; + t[ 2] = (word64)dd[ 2] + (sword64)ad[ 0] * bd[ 2] + + (sword64)ad[ 1] * bd[ 1] + + (sword64)ad[ 2] * bd[ 0]; + t[ 3] = (word64)dd[ 3] + (sword64)ad[ 0] * bd[ 3] + + (sword64)ad[ 1] * bd[ 2] + + (sword64)ad[ 2] * bd[ 1] + + (sword64)ad[ 3] * bd[ 0]; + t[ 4] = (word64)dd[ 4] + (sword64)ad[ 0] * bd[ 4] + + (sword64)ad[ 1] * bd[ 3] + + (sword64)ad[ 2] * bd[ 2] + + (sword64)ad[ 3] * bd[ 1] + + (sword64)ad[ 4] * bd[ 0]; + t[ 5] = (word64)dd[ 5] + (sword64)ad[ 0] * bd[ 5] + + (sword64)ad[ 1] * bd[ 4] + + (sword64)ad[ 2] * bd[ 3] + + (sword64)ad[ 3] * bd[ 2] + + (sword64)ad[ 4] * bd[ 1] + + (sword64)ad[ 5] * bd[ 0]; + t[ 6] = (word64)dd[ 6] + (sword64)ad[ 0] * bd[ 6] + + (sword64)ad[ 1] * bd[ 5] + + (sword64)ad[ 2] * bd[ 4] + + (sword64)ad[ 3] * bd[ 3] + + (sword64)ad[ 4] * bd[ 2] + + (sword64)ad[ 5] * bd[ 1] + + (sword64)ad[ 6] * bd[ 0]; + t[ 7] = (word64)dd[ 7] + (sword64)ad[ 0] * bd[ 7] + + (sword64)ad[ 1] * bd[ 6] + + (sword64)ad[ 2] * bd[ 5] + + (sword64)ad[ 3] * bd[ 4] + + (sword64)ad[ 4] * bd[ 3] + + (sword64)ad[ 5] * bd[ 2] + + (sword64)ad[ 6] * bd[ 1] + + (sword64)ad[ 7] * bd[ 0]; + t[ 8] = (word64)dd[ 8] + (sword64)ad[ 0] * bd[ 8] + + (sword64)ad[ 1] * bd[ 7] + + (sword64)ad[ 2] * bd[ 6] + + (sword64)ad[ 3] * bd[ 5] + + (sword64)ad[ 4] * bd[ 4] + + (sword64)ad[ 5] * bd[ 3] + + (sword64)ad[ 6] * bd[ 2] + + (sword64)ad[ 7] * bd[ 1] + + (sword64)ad[ 8] * bd[ 0]; + t[ 9] = (word64)dd[ 9] + (sword64)ad[ 0] * bd[ 9] + + (sword64)ad[ 1] * bd[ 8] + + (sword64)ad[ 2] * bd[ 7] + + (sword64)ad[ 3] * bd[ 6] + + (sword64)ad[ 4] * bd[ 5] + + (sword64)ad[ 5] * bd[ 4] + + (sword64)ad[ 6] * bd[ 3] + + (sword64)ad[ 7] * bd[ 2] + + (sword64)ad[ 8] * bd[ 1] + + (sword64)ad[ 9] * bd[ 0]; + t[10] = (word64)dd[10] + (sword64)ad[ 0] * bd[10] + + (sword64)ad[ 1] * bd[ 9] + + (sword64)ad[ 2] * bd[ 8] + + (sword64)ad[ 3] * bd[ 7] + + (sword64)ad[ 4] * bd[ 6] + + (sword64)ad[ 5] * bd[ 5] + + (sword64)ad[ 6] * bd[ 4] + + (sword64)ad[ 7] * bd[ 3] + + (sword64)ad[ 8] * bd[ 2] + + (sword64)ad[ 9] * bd[ 1] + + (sword64)ad[10] * bd[ 0]; + t[11] = (word64)dd[11] + (sword64)ad[ 0] * bd[11] + + (sword64)ad[ 1] * bd[10] + + (sword64)ad[ 2] * bd[ 9] + + (sword64)ad[ 3] * bd[ 8] + + (sword64)ad[ 4] * bd[ 7] + + (sword64)ad[ 5] * bd[ 6] + + (sword64)ad[ 6] * bd[ 5] + + (sword64)ad[ 7] * bd[ 4] + + (sword64)ad[ 8] * bd[ 3] + + (sword64)ad[ 9] * bd[ 2] + + (sword64)ad[10] * bd[ 1] + + (sword64)ad[11] * bd[ 0]; + t[12] = (word64)dd[12] + (sword64)ad[ 0] * bd[12] + + (sword64)ad[ 1] * bd[11] + + (sword64)ad[ 2] * bd[10] + + (sword64)ad[ 3] * bd[ 9] + + (sword64)ad[ 4] * bd[ 8] + + (sword64)ad[ 5] * bd[ 7] + + (sword64)ad[ 6] * bd[ 6] + + (sword64)ad[ 7] * bd[ 5] + + (sword64)ad[ 8] * bd[ 4] + + (sword64)ad[ 9] * bd[ 3] + + (sword64)ad[10] * bd[ 2] + + (sword64)ad[11] * bd[ 1] + + (sword64)ad[12] * bd[ 0]; + t[13] = (word64)dd[13] + (sword64)ad[ 0] * bd[13] + + (sword64)ad[ 1] * bd[12] + + (sword64)ad[ 2] * bd[11] + + (sword64)ad[ 3] * bd[10] + + (sword64)ad[ 4] * bd[ 9] + + (sword64)ad[ 5] * bd[ 8] + + (sword64)ad[ 6] * bd[ 7] + + (sword64)ad[ 7] * bd[ 6] + + (sword64)ad[ 8] * bd[ 5] + + (sword64)ad[ 9] * bd[ 4] + + (sword64)ad[10] * bd[ 3] + + (sword64)ad[11] * bd[ 2] + + (sword64)ad[12] * bd[ 1] + + (sword64)ad[13] * bd[ 0]; + t[14] = (word64)dd[14] + (sword64)ad[ 0] * bd[14] + + (sword64)ad[ 1] * bd[13] + + (sword64)ad[ 2] * bd[12] + + (sword64)ad[ 3] * bd[11] + + (sword64)ad[ 4] * bd[10] + + (sword64)ad[ 5] * bd[ 9] + + (sword64)ad[ 6] * bd[ 8] + + (sword64)ad[ 7] * bd[ 7] + + (sword64)ad[ 8] * bd[ 6] + + (sword64)ad[ 9] * bd[ 5] + + (sword64)ad[10] * bd[ 4] + + (sword64)ad[11] * bd[ 3] + + (sword64)ad[12] * bd[ 2] + + (sword64)ad[13] * bd[ 1] + + (sword64)ad[14] * bd[ 0]; + t[15] = (word64)dd[15] + (sword64)ad[ 0] * bd[15] + + (sword64)ad[ 1] * bd[14] + + (sword64)ad[ 2] * bd[13] + + (sword64)ad[ 3] * bd[12] + + (sword64)ad[ 4] * bd[11] + + (sword64)ad[ 5] * bd[10] + + (sword64)ad[ 6] * bd[ 9] + + (sword64)ad[ 7] * bd[ 8] + + (sword64)ad[ 8] * bd[ 7] + + (sword64)ad[ 9] * bd[ 6] + + (sword64)ad[10] * bd[ 5] + + (sword64)ad[11] * bd[ 4] + + (sword64)ad[12] * bd[ 3] + + (sword64)ad[13] * bd[ 2] + + (sword64)ad[14] * bd[ 1] + + (sword64)ad[15] * bd[ 0]; + t[16] = (word64) (sword64)ad[ 1] * bd[15] + + (sword64)ad[ 2] * bd[14] + + (sword64)ad[ 3] * bd[13] + + (sword64)ad[ 4] * bd[12] + + (sword64)ad[ 5] * bd[11] + + (sword64)ad[ 6] * bd[10] + + (sword64)ad[ 7] * bd[ 9] + + (sword64)ad[ 8] * bd[ 8] + + (sword64)ad[ 9] * bd[ 7] + + (sword64)ad[10] * bd[ 6] + + (sword64)ad[11] * bd[ 5] + + (sword64)ad[12] * bd[ 4] + + (sword64)ad[13] * bd[ 3] + + (sword64)ad[14] * bd[ 2] + + (sword64)ad[15] * bd[ 1]; + t[17] = (word64) (sword64)ad[ 2] * bd[15] + + (sword64)ad[ 3] * bd[14] + + (sword64)ad[ 4] * bd[13] + + (sword64)ad[ 5] * bd[12] + + (sword64)ad[ 6] * bd[11] + + (sword64)ad[ 7] * bd[10] + + (sword64)ad[ 8] * bd[ 9] + + (sword64)ad[ 9] * bd[ 8] + + (sword64)ad[10] * bd[ 7] + + (sword64)ad[11] * bd[ 6] + + (sword64)ad[12] * bd[ 5] + + (sword64)ad[13] * bd[ 4] + + (sword64)ad[14] * bd[ 3] + + (sword64)ad[15] * bd[ 2]; + t[18] = (word64) (sword64)ad[ 3] * bd[15] + + (sword64)ad[ 4] * bd[14] + + (sword64)ad[ 5] * bd[13] + + (sword64)ad[ 6] * bd[12] + + (sword64)ad[ 7] * bd[11] + + (sword64)ad[ 8] * bd[10] + + (sword64)ad[ 9] * bd[ 9] + + (sword64)ad[10] * bd[ 8] + + (sword64)ad[11] * bd[ 7] + + (sword64)ad[12] * bd[ 6] + + (sword64)ad[13] * bd[ 5] + + (sword64)ad[14] * bd[ 4] + + (sword64)ad[15] * bd[ 3]; + t[19] = (word64) (sword64)ad[ 4] * bd[15] + + (sword64)ad[ 5] * bd[14] + + (sword64)ad[ 6] * bd[13] + + (sword64)ad[ 7] * bd[12] + + (sword64)ad[ 8] * bd[11] + + (sword64)ad[ 9] * bd[10] + + (sword64)ad[10] * bd[ 9] + + (sword64)ad[11] * bd[ 8] + + (sword64)ad[12] * bd[ 7] + + (sword64)ad[13] * bd[ 6] + + (sword64)ad[14] * bd[ 5] + + (sword64)ad[15] * bd[ 4]; + t[20] = (word64) (sword64)ad[ 5] * bd[15] + + (sword64)ad[ 6] * bd[14] + + (sword64)ad[ 7] * bd[13] + + (sword64)ad[ 8] * bd[12] + + (sword64)ad[ 9] * bd[11] + + (sword64)ad[10] * bd[10] + + (sword64)ad[11] * bd[ 9] + + (sword64)ad[12] * bd[ 8] + + (sword64)ad[13] * bd[ 7] + + (sword64)ad[14] * bd[ 6] + + (sword64)ad[15] * bd[ 5]; + t[21] = (word64) (sword64)ad[ 6] * bd[15] + + (sword64)ad[ 7] * bd[14] + + (sword64)ad[ 8] * bd[13] + + (sword64)ad[ 9] * bd[12] + + (sword64)ad[10] * bd[11] + + (sword64)ad[11] * bd[10] + + (sword64)ad[12] * bd[ 9] + + (sword64)ad[13] * bd[ 8] + + (sword64)ad[14] * bd[ 7] + + (sword64)ad[15] * bd[ 6]; + t[22] = (word64) (sword64)ad[ 7] * bd[15] + + (sword64)ad[ 8] * bd[14] + + (sword64)ad[ 9] * bd[13] + + (sword64)ad[10] * bd[12] + + (sword64)ad[11] * bd[11] + + (sword64)ad[12] * bd[10] + + (sword64)ad[13] * bd[ 9] + + (sword64)ad[14] * bd[ 8] + + (sword64)ad[15] * bd[ 7]; + t[23] = (word64) (sword64)ad[ 8] * bd[15] + + (sword64)ad[ 9] * bd[14] + + (sword64)ad[10] * bd[13] + + (sword64)ad[11] * bd[12] + + (sword64)ad[12] * bd[11] + + (sword64)ad[13] * bd[10] + + (sword64)ad[14] * bd[ 9] + + (sword64)ad[15] * bd[ 8]; + t[24] = (word64) (sword64)ad[ 9] * bd[15] + + (sword64)ad[10] * bd[14] + + (sword64)ad[11] * bd[13] + + (sword64)ad[12] * bd[12] + + (sword64)ad[13] * bd[11] + + (sword64)ad[14] * bd[10] + + (sword64)ad[15] * bd[ 9]; + t[25] = (word64) (sword64)ad[10] * bd[15] + + (sword64)ad[11] * bd[14] + + (sword64)ad[12] * bd[13] + + (sword64)ad[13] * bd[12] + + (sword64)ad[14] * bd[11] + + (sword64)ad[15] * bd[10]; + t[26] = (word64) (sword64)ad[11] * bd[15] + + (sword64)ad[12] * bd[14] + + (sword64)ad[13] * bd[13] + + (sword64)ad[14] * bd[12] + + (sword64)ad[15] * bd[11]; + t[27] = (word64) (sword64)ad[12] * bd[15] + + (sword64)ad[13] * bd[14] + + (sword64)ad[14] * bd[13] + + (sword64)ad[15] * bd[12]; + t[28] = (word64) (sword64)ad[13] * bd[15] + + (sword64)ad[14] * bd[14] + + (sword64)ad[15] * bd[13]; + t[29] = (word64) (sword64)ad[14] * bd[15] + + (sword64)ad[15] * bd[14]; + t[30] = (word64) (sword64)ad[15] * bd[15]; t[31] = 0; /* Mod curve order */ @@ -6202,62 +6203,62 @@ o = rd[14] >> 28; rd[15] += o; rd[14] = rd[14] & 0xfffffff; /* Convert to bytes */ - r[ 0] = (rd[0 ] >> 0); - r[ 1] = (rd[0 ] >> 8); - r[ 2] = (rd[0 ] >> 16); - r[ 3] = (rd[0 ] >> 24) + ((rd[1 ] >> 0) << 4); - r[ 4] = (rd[1 ] >> 4); - r[ 5] = (rd[1 ] >> 12); - r[ 6] = (rd[1 ] >> 20); - r[ 7] = (rd[2 ] >> 0); - r[ 8] = (rd[2 ] >> 8); - r[ 9] = (rd[2 ] >> 16); - r[10] = (rd[2 ] >> 24) + ((rd[3 ] >> 0) << 4); - r[11] = (rd[3 ] >> 4); - r[12] = (rd[3 ] >> 12); - r[13] = (rd[3 ] >> 20); - r[14] = (rd[4 ] >> 0); - r[15] = (rd[4 ] >> 8); - r[16] = (rd[4 ] >> 16); - r[17] = (rd[4 ] >> 24) + ((rd[5 ] >> 0) << 4); - r[18] = (rd[5 ] >> 4); - r[19] = (rd[5 ] >> 12); - r[20] = (rd[5 ] >> 20); - r[21] = (rd[6 ] >> 0); - r[22] = (rd[6 ] >> 8); - r[23] = (rd[6 ] >> 16); - r[24] = (rd[6 ] >> 24) + ((rd[7 ] >> 0) << 4); - r[25] = (rd[7 ] >> 4); - r[26] = (rd[7 ] >> 12); - r[27] = (rd[7 ] >> 20); - r[28] = (rd[8 ] >> 0); - r[29] = (rd[8 ] >> 8); - r[30] = (rd[8 ] >> 16); - r[31] = (rd[8 ] >> 24) + ((rd[9 ] >> 0) << 4); - r[32] = (rd[9 ] >> 4); - r[33] = (rd[9 ] >> 12); - r[34] = (rd[9 ] >> 20); - r[35] = (rd[10] >> 0); - r[36] = (rd[10] >> 8); - r[37] = (rd[10] >> 16); - r[38] = (rd[10] >> 24) + ((rd[11] >> 0) << 4); - r[39] = (rd[11] >> 4); - r[40] = (rd[11] >> 12); - r[41] = (rd[11] >> 20); - r[42] = (rd[12] >> 0); - r[43] = (rd[12] >> 8); - r[44] = (rd[12] >> 16); - r[45] = (rd[12] >> 24) + ((rd[13] >> 0) << 4); - r[46] = (rd[13] >> 4); - r[47] = (rd[13] >> 12); - r[48] = (rd[13] >> 20); - r[49] = (rd[14] >> 0); - r[50] = (rd[14] >> 8); - r[51] = (rd[14] >> 16); - r[52] = (rd[14] >> 24) + ((rd[15] >> 0) << 4); - r[53] = (rd[15] >> 4); - r[54] = (rd[15] >> 12); - r[55] = (rd[15] >> 20); + r[ 0] = (byte)(rd[0 ] >> 0); + r[ 1] = (byte)(rd[0 ] >> 8); + r[ 2] = (byte)(rd[0 ] >> 16); + r[ 3] = (byte)((rd[0 ] >> 24) + ((rd[1 ] >> 0) << 4)); + r[ 4] = (byte)(rd[1 ] >> 4); + r[ 5] = (byte)(rd[1 ] >> 12); + r[ 6] = (byte)(rd[1 ] >> 20); + r[ 7] = (byte)(rd[2 ] >> 0); + r[ 8] = (byte)(rd[2 ] >> 8); + r[ 9] = (byte)(rd[2 ] >> 16); + r[10] = (byte)((rd[2 ] >> 24) + ((rd[3 ] >> 0) << 4)); + r[11] = (byte)(rd[3 ] >> 4); + r[12] = (byte)(rd[3 ] >> 12); + r[13] = (byte)(rd[3 ] >> 20); + r[14] = (byte)(rd[4 ] >> 0); + r[15] = (byte)(rd[4 ] >> 8); + r[16] = (byte)(rd[4 ] >> 16); + r[17] = (byte)((rd[4 ] >> 24) + ((rd[5 ] >> 0) << 4)); + r[18] = (byte)(rd[5 ] >> 4); + r[19] = (byte)(rd[5 ] >> 12); + r[20] = (byte)(rd[5 ] >> 20); + r[21] = (byte)(rd[6 ] >> 0); + r[22] = (byte)(rd[6 ] >> 8); + r[23] = (byte)(rd[6 ] >> 16); + r[24] = (byte)((rd[6 ] >> 24) + ((rd[7 ] >> 0) << 4)); + r[25] = (byte)(rd[7 ] >> 4); + r[26] = (byte)(rd[7 ] >> 12); + r[27] = (byte)(rd[7 ] >> 20); + r[28] = (byte)(rd[8 ] >> 0); + r[29] = (byte)(rd[8 ] >> 8); + r[30] = (byte)(rd[8 ] >> 16); + r[31] = (byte)((rd[8 ] >> 24) + ((rd[9 ] >> 0) << 4)); + r[32] = (byte)(rd[9 ] >> 4); + r[33] = (byte)(rd[9 ] >> 12); + r[34] = (byte)(rd[9 ] >> 20); + r[35] = (byte)(rd[10] >> 0); + r[36] = (byte)(rd[10] >> 8); + r[37] = (byte)(rd[10] >> 16); + r[38] = (byte)((rd[10] >> 24) + ((rd[11] >> 0) << 4)); + r[39] = (byte)(rd[11] >> 4); + r[40] = (byte)(rd[11] >> 12); + r[41] = (byte)(rd[11] >> 20); + r[42] = (byte)(rd[12] >> 0); + r[43] = (byte)(rd[12] >> 8); + r[44] = (byte)(rd[12] >> 16); + r[45] = (byte)((rd[12] >> 24) + ((rd[13] >> 0) << 4)); + r[46] = (byte)(rd[13] >> 4); + r[47] = (byte)(rd[13] >> 12); + r[48] = (byte)(rd[13] >> 20); + r[49] = (byte)(rd[14] >> 0); + r[50] = (byte)(rd[14] >> 8); + r[51] = (byte)(rd[14] >> 16); + r[52] = (byte)((rd[14] >> 24) + ((rd[15] >> 0) << 4)); + r[53] = (byte)(rd[15] >> 4); + r[54] = (byte)(rd[15] >> 12); + r[55] = (byte)(rd[15] >> 20); r[56] = 0; } @@ -10455,7 +10456,7 @@ fe448_mul(x, p->X, recip); fe448_mul(y, p->Y, recip); fe448_to_bytes(b, y); - b[56] = fe448_isnegative(x) << 7; + b[56] = (byte)fe448_isnegative(x) << 7; } /* Convert point to byte array assuming z is 1. @@ -10466,7 +10467,7 @@ static void ge448_p2z1_to_bytes(byte *b, const ge448_p2 *p) { fe448_to_bytes(b, p->Y); - b[56] = fe448_isnegative(p->X) << 7; + b[56] = (byte)fe448_isnegative(p->X) << 7; } /* Compress the point to y-ordinate and negative bit. @@ -10543,7 +10544,7 @@ { ge448 minusx[16]; byte bnegative = negative(b); - byte babs = b - (((-bnegative) & b) << 1); + byte babs = (byte)(b - (((-bnegative) & b) << 1)); ge448_precomp_0(r); cmov(r, &base[pos][0], babs, 1); @@ -10563,36 +10564,52 @@ * r [in] Point to hold result. * a [in] Scalar to multiply by. */ -void ge448_scalarmult_base(ge448_p2* r, const byte* a) +int ge448_scalarmult_base(ge448_p2* r, const byte* a) { byte carry; - ge448_precomp t; - int i; +#ifdef WOLFSSL_SMALL_STACK + ge448_precomp *t = NULL; + byte *e = NULL; +#else + ge448_precomp t[1]; byte e[113]; +#endif + int i; + +#ifdef WOLFSSL_SMALL_STACK + t = (ge448_precomp *)XMALLOC(sizeof(*t), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (t == NULL) + return MEMORY_E; + e = (byte *)XMALLOC(113, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (e == NULL) { + XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return MEMORY_E; + } +#endif carry = 0; for (i = 0; i < 56; ++i) { e[2 * i + 0] = ((a[i] >> 0) & 0xf) + carry; carry = e[2 * i + 0] + 8; carry >>= 4; - e[2 * i + 0] -= carry << 4; + e[2 * i + 0] -= (byte)(carry << 4); e[2 * i + 1] = ((a[i] >> 4) & 0xf) + carry; carry = e[2 * i + 1] + 8; carry >>= 4; - e[2 * i + 1] -= carry << 4; + e[2 * i + 1] -= (byte)(carry << 4); } e[112] = carry; /* each e[i] is between -8 and 8 */ /* Odd indeces first - sum based on even index so multiply by 16 */ - ge448_select(&t, 0, e[1]); - fe448_copy(r->X, t.x); - fe448_copy(r->Y, t.y); + ge448_select(t, 0, e[1]); + fe448_copy(r->X, t->x); + fe448_copy(r->Y, t->y); fe448_1(r->Z); for (i = 3; i < 112; i += 2) { - ge448_select(&t, i / 2, e[i]); - ge448_madd(r, r, &t); + ge448_select(t, i / 2, e[i]); + ge448_madd(r, r, t); } ge448_dbl(r, r); @@ -10602,9 +10619,16 @@ /* Add even indeces */ for (i = 0; i <= 112; i += 2) { - ge448_select(&t, i / 2, e[i]); - ge448_madd(r, r, &t); + ge448_select(t, i / 2, e[i]); + ge448_madd(r, r, t); } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(t, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(e, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return 0; } /* Create to a sliding window for the scalar multiplicaton. @@ -10633,10 +10657,11 @@ } if (r[i] + (r[i + b] << b) <= 31) { - r[i] += r[i + b] << b; r[i + b] = 0; + r[i] += (sword8)(r[i + b] << b); + r[i + b] = 0; } else if (r[i] - (r[i + b] << b) >= -31) { - r[i] -= r[i + b] << b; + r[i] -= (sword8)(r[i + b] << b); for (k = i + b; k < 448; ++k) { if (!r[k]) { r[k] = 1; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ge_low_mem.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_low_mem.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ge_low_mem.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_low_mem.c 2024-08-03 07:30:00.000000000 +0000 @@ -442,28 +442,6 @@ /* pack the point h into array s */ -void ge_p3_tobytes(unsigned char *s,const ge_p3 *h) -{ - byte x[F25519_SIZE]; - byte y[F25519_SIZE]; - byte z1[F25519_SIZE]; - byte parity; - - fe_inv__distinct(z1, h->Z); - fe_mul__distinct(x, h->X, z1); - fe_mul__distinct(y, h->Y, z1); - - fe_normalize(x); - fe_normalize(y); - - parity = (x[0] & 1) << 7; - lm_copy(s, y); - fe_normalize(s); - s[31] |= parity; -} - - -/* pack the point h into array s */ void ge_tobytes(unsigned char *s,const ge_p2 *h) { byte x[F25519_SIZE]; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ge_operations.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_operations.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/ge_operations.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/ge_operations.c 2024-08-03 07:30:00.000000000 +0000 @@ -58,19 +58,23 @@ static void ge_p2_0(ge_p2 *h); #ifndef CURVED25519_ASM +#if defined(HAVE_ED25519_SIGN) || defined(HAVE_ED25519_MAKE_KEY) static void ge_precomp_0(ge_precomp *h); +#endif static void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p); #endif static WC_INLINE void ge_p3_to_cached(ge_cached *r,const ge_p3 *p); + +#ifndef CURVED25519_ASM static void ge_p1p1_to_p2(ge_p2 *r,const ge_p1p1 *p); static WC_INLINE void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p); static WC_INLINE void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p); static void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p); - static WC_INLINE void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q); static WC_INLINE void ge_msub(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q); static WC_INLINE void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q); static WC_INLINE void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q); +#endif /* ge means group element. @@ -95,28 +99,6 @@ #define ORDER_4 0x1dea2f #define ORDER_5 0xa6f7c -#ifdef CURVED25519_ASM_32BIT -word64 load_3(const unsigned char *in) -{ - word64 result; - result = (word64) in[0]; - result |= ((word64) in[1]) << 8; - result |= ((word64) in[2]) << 16; - return result; -} - - -word64 load_4(const unsigned char *in) -{ - word64 result; - result = (word64) in[0]; - result |= ((word64) in[1]) << 8; - result |= ((word64) in[2]) << 16; - result |= ((word64) in[3]) << 24; - return result; -} -#endif - /* Input: s[0]+256*s[1]+...+256^63*s[63] = s @@ -126,6 +108,7 @@ where l = 2^252 + 27742317777372353535851937790883648493. Overwrites s in place. */ +#ifndef CURVED25519_ASM void sc_reduce(byte* s) { sword64 t[24]; @@ -638,7 +621,9 @@ s[30] = (byte)(t[11] >> 9); s[31] = (byte)(t[11] >> 17); } +#endif #else +#ifndef CURVED25519_ASM static word64 load_6(const byte* a) { word64 n; @@ -744,38 +729,38 @@ carry = t[ 3] >> 42; t[ 4] += carry; t[ 3] &= MASK_42; carry = t[ 4] >> 42; t[ 5] += carry; t[ 4] &= MASK_42; - s[ 0] = (t[ 0] >> 0); - s[ 1] = (t[ 0] >> 8); - s[ 2] = (t[ 0] >> 16); - s[ 3] = (t[ 0] >> 24); - s[ 4] = (t[ 0] >> 32); - s[ 5] = (t[ 0] >> 40) | (t[ 1] << 2); - s[ 6] = (t[ 1] >> 6); - s[ 7] = (t[ 1] >> 14); - s[ 8] = (t[ 1] >> 22); - s[ 9] = (t[ 1] >> 30); - s[10] = (t[ 1] >> 38) | (t[ 2] << 4); - s[11] = (t[ 2] >> 4); - s[12] = (t[ 2] >> 12); - s[13] = (t[ 2] >> 20); - s[14] = (t[ 2] >> 28); - s[15] = (t[ 2] >> 36) | (t[ 3] << 6); - s[16] = (t[ 3] >> 2); - s[17] = (t[ 3] >> 10); - s[18] = (t[ 3] >> 18); - s[19] = (t[ 3] >> 26); - s[20] = (t[ 3] >> 34); - s[21] = (t[ 4] >> 0); - s[22] = (t[ 4] >> 8); - s[23] = (t[ 4] >> 16); - s[24] = (t[ 4] >> 24); - s[25] = (t[ 4] >> 32); - s[26] = (t[ 4] >> 40) | (t[ 5] << 2); - s[27] = (t[ 5] >> 6); - s[28] = (t[ 5] >> 14); - s[29] = (t[ 5] >> 22); - s[30] = (t[ 5] >> 30); - s[31] = (t[ 5] >> 38); + s[ 0] = (byte)(t[ 0] >> 0); + s[ 1] = (byte)(t[ 0] >> 8); + s[ 2] = (byte)(t[ 0] >> 16); + s[ 3] = (byte)(t[ 0] >> 24); + s[ 4] = (byte)(t[ 0] >> 32); + s[ 5] = (byte)(t[ 0] >> 40) | (byte)(t[ 1] << 2); + s[ 6] = (byte)(t[ 1] >> 6); + s[ 7] = (byte)(t[ 1] >> 14); + s[ 8] = (byte)(t[ 1] >> 22); + s[ 9] = (byte)(t[ 1] >> 30); + s[10] = (byte)(t[ 1] >> 38) | (byte)(t[ 2] << 4); + s[11] = (byte)(t[ 2] >> 4); + s[12] = (byte)(t[ 2] >> 12); + s[13] = (byte)(t[ 2] >> 20); + s[14] = (byte)(t[ 2] >> 28); + s[15] = (byte)(t[ 2] >> 36) | (byte)(t[ 3] << 6); + s[16] = (byte)(t[ 3] >> 2); + s[17] = (byte)(t[ 3] >> 10); + s[18] = (byte)(t[ 3] >> 18); + s[19] = (byte)(t[ 3] >> 26); + s[20] = (byte)(t[ 3] >> 34); + s[21] = (byte)(t[ 4] >> 0); + s[22] = (byte)(t[ 4] >> 8); + s[23] = (byte)(t[ 4] >> 16); + s[24] = (byte)(t[ 4] >> 24); + s[25] = (byte)(t[ 4] >> 32); + s[26] = (byte)(t[ 4] >> 40) | (byte)(t[ 5] << 2); + s[27] = (byte)(t[ 5] >> 6); + s[28] = (byte)(t[ 5] >> 14); + s[29] = (byte)(t[ 5] >> 22); + s[30] = (byte)(t[ 5] >> 30); + s[31] = (byte)(t[ 5] >> 38); } /* @@ -896,59 +881,57 @@ carry = t[ 3] >> 42; t[ 4] += carry; t[ 3] &= MASK_42; carry = t[ 4] >> 42; t[ 5] += carry; t[ 4] &= MASK_42; - s[ 0] = (t[ 0] >> 0); - s[ 1] = (t[ 0] >> 8); - s[ 2] = (t[ 0] >> 16); - s[ 3] = (t[ 0] >> 24); - s[ 4] = (t[ 0] >> 32); - s[ 5] = (t[ 0] >> 40) | (t[ 1] << 2); - s[ 6] = (t[ 1] >> 6); - s[ 7] = (t[ 1] >> 14); - s[ 8] = (t[ 1] >> 22); - s[ 9] = (t[ 1] >> 30); - s[10] = (t[ 1] >> 38) | (t[ 2] << 4); - s[11] = (t[ 2] >> 4); - s[12] = (t[ 2] >> 12); - s[13] = (t[ 2] >> 20); - s[14] = (t[ 2] >> 28); - s[15] = (t[ 2] >> 36) | (t[ 3] << 6); - s[16] = (t[ 3] >> 2); - s[17] = (t[ 3] >> 10); - s[18] = (t[ 3] >> 18); - s[19] = (t[ 3] >> 26); - s[20] = (t[ 3] >> 34); - s[21] = (t[ 4] >> 0); - s[22] = (t[ 4] >> 8); - s[23] = (t[ 4] >> 16); - s[24] = (t[ 4] >> 24); - s[25] = (t[ 4] >> 32); - s[26] = (t[ 4] >> 40) | (t[ 5] << 2); - s[27] = (t[ 5] >> 6); - s[28] = (t[ 5] >> 14); - s[29] = (t[ 5] >> 22); - s[30] = (t[ 5] >> 30); - s[31] = (t[ 5] >> 38); + s[ 0] = (byte)(t[ 0] >> 0); + s[ 1] = (byte)(t[ 0] >> 8); + s[ 2] = (byte)(t[ 0] >> 16); + s[ 3] = (byte)(t[ 0] >> 24); + s[ 4] = (byte)(t[ 0] >> 32); + s[ 5] = (byte)(t[ 0] >> 40) | (byte)(t[ 1] << 2); + s[ 6] = (byte)(t[ 1] >> 6); + s[ 7] = (byte)(t[ 1] >> 14); + s[ 8] = (byte)(t[ 1] >> 22); + s[ 9] = (byte)(t[ 1] >> 30); + s[10] = (byte)(t[ 1] >> 38) | (byte)(t[ 2] << 4); + s[11] = (byte)(t[ 2] >> 4); + s[12] = (byte)(t[ 2] >> 12); + s[13] = (byte)(t[ 2] >> 20); + s[14] = (byte)(t[ 2] >> 28); + s[15] = (byte)(t[ 2] >> 36) | (byte)(t[ 3] << 6); + s[16] = (byte)(t[ 3] >> 2); + s[17] = (byte)(t[ 3] >> 10); + s[18] = (byte)(t[ 3] >> 18); + s[19] = (byte)(t[ 3] >> 26); + s[20] = (byte)(t[ 3] >> 34); + s[21] = (byte)(t[ 4] >> 0); + s[22] = (byte)(t[ 4] >> 8); + s[23] = (byte)(t[ 4] >> 16); + s[24] = (byte)(t[ 4] >> 24); + s[25] = (byte)(t[ 4] >> 32); + s[26] = (byte)(t[ 4] >> 40) | (byte)(t[ 5] << 2); + s[27] = (byte)(t[ 5] >> 6); + s[28] = (byte)(t[ 5] >> 14); + s[29] = (byte)(t[ 5] >> 22); + s[30] = (byte)(t[ 5] >> 30); + s[31] = (byte)(t[ 5] >> 38); } +#endif /* !CURVED25519_ASM */ #endif /* !HAVE___UINT128_T || NO_CURVED25519_128BIT */ int ge_compress_key(byte* out, const byte* xIn, const byte* yIn, word32 keySz) { - ge x,y,z; - ge_p3 g; - byte bArray[ED25519_KEY_SIZE]; + ge_p2 g; + ALIGN16 byte bArray[ED25519_KEY_SIZE]; + ALIGN16 byte x[ED25519_PUB_KEY_SIZE]; + ALIGN16 byte y[ED25519_PUB_KEY_SIZE]; word32 i; - fe_0(x); - fe_0(y); - fe_1(z); - fe_frombytes(x, xIn); - fe_frombytes(y, yIn); - - fe_copy(g.X, x); - fe_copy(g.Y, y); - fe_copy(g.Z, z); + XMEMCPY(x, xIn, ED25519_PUB_KEY_SIZE); + XMEMCPY(y, yIn, ED25519_PUB_KEY_SIZE); + fe_frombytes(g.X, x); + fe_frombytes(g.Y, y); + fe_1(g.Z); - ge_p3_tobytes(bArray, &g); + ge_tobytes(bArray, &g); for (i = 0; i < keySz; i++) { out[keySz - 1 - i] = bArray[i]; @@ -961,9 +944,9 @@ /* r = p + q */ +#ifndef CURVED25519_ASM static WC_INLINE void ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) { -#ifndef CURVED25519_ASM ge t0; fe_add(r->X,p->Y,p->X); fe_sub(r->Y,p->Y,p->X); @@ -976,31 +959,27 @@ fe_add(r->Y,r->Z,r->Y); fe_add(r->Z,t0,r->T); fe_sub(r->T,t0,r->T); -#else - fe_ge_add(r->X, r->Y, r->Z, r->T, p->X, p->Y, p->Z, p->T, q->Z, q->T2d, - q->YplusX, q->YminusX); -#endif } +#endif #ifndef CURVED25519_ASM /* ge_scalar mult base */ -static unsigned char equal(signed char b,signed char c) +static unsigned char equal(unsigned char b,unsigned char c) { - unsigned char ub = b; - unsigned char uc = c; - unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ + unsigned char x = b ^ c; /* 0: yes; 1..255: no */ word32 y = x; /* 0: yes; 1..255: no */ y -= 1; /* 4294967295: yes; 0..254: no */ y >>= 31; /* 1: yes; 0: no */ return (unsigned char)y; } - +#if defined(HAVE_ED25519_SIGN) || defined(HAVE_ED25519_MAKE_KEY) static unsigned char negative(signed char b) { return ((unsigned char)b) >> 7; } +#endif static WC_INLINE void cmov(ge_precomp *t,const ge_precomp *u,unsigned char b, @@ -1013,6 +992,7 @@ } #endif +#if defined(HAVE_ED25519_SIGN) || defined(HAVE_ED25519_MAKE_KEY) #ifdef CURVED25519_ASM_64BIT static const ge_precomp base[64][8] = { { @@ -9098,7 +9078,7 @@ #ifndef CURVED25519_ASM ge_precomp minust; unsigned char bnegative = negative(b); - unsigned char babs = b - (((-bnegative) & b) << 1); + unsigned char babs = (unsigned char)(b - (((-bnegative) & b) << 1)); ge_precomp_0(t); cmov(t,&base[pos][0],babs,1); @@ -9148,7 +9128,7 @@ e[i] += carry; carry = e[i] + 8; carry >>= 4; - e[i] -= carry << 4; + e[i] -= (signed char)(carry << 4); } e[63] += carry; /* each e[i] is between -8 and 8 */ @@ -9190,6 +9170,7 @@ } #endif } +#endif /* HAVE_ED25519_SIGN || HAVE_ED25519_MAKE_KEY */ #define SLIDE_SIZE 256 @@ -9209,9 +9190,9 @@ for (b = 1;b <= 6 && i + b < SLIDE_SIZE;++b) { if (r[i + b]) { if (r[i] + (r[i + b] << b) <= 15) { - r[i] += r[i + b] << b; r[i + b] = 0; + r[i] += (signed char)(r[i + b] << b); r[i + b] = 0; } else if (r[i] - (r[i + b] << b) >= -15) { - r[i] -= r[i + b] << b; + r[i] -= (signed char)(r[i + b] << b); for (k = i + b;k < SLIDE_SIZE;++k) { if (!r[k]) { r[k] = 1; @@ -9598,9 +9579,9 @@ r = p + q */ +#ifndef CURVED25519_ASM static WC_INLINE void ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) { -#ifndef CURVED25519_ASM ge t0; fe_add(r->X,p->Y,p->X); fe_sub(r->Y,p->Y,p->X); @@ -9612,11 +9593,8 @@ fe_add(r->Y,r->Z,r->Y); fe_add(r->Z,t0,r->T); fe_sub(r->T,t0,r->T); -#else - fe_ge_madd(r->X, r->Y, r->Z, r->T, p->X, p->Y, p->Z, p->T, q->xy2d, - q->yplusx, q->yminusx); -#endif } +#endif /* ge msub */ @@ -9625,9 +9603,9 @@ r = p - q */ +#ifndef CURVED25519_ASM static WC_INLINE void ge_msub(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q) { -#ifndef CURVED25519_ASM ge t0; fe_add(r->X,p->Y,p->X); fe_sub(r->Y,p->Y,p->X); @@ -9639,11 +9617,8 @@ fe_add(r->Y,r->Z,r->Y); fe_sub(r->Z,t0,r->T); fe_add(r->T,t0,r->T); -#else - fe_ge_msub(r->X, r->Y, r->Z, r->T, p->X, p->Y, p->Z, p->T, q->xy2d, - q->yplusx, q->yminusx); -#endif } +#endif /* ge p1p1 to p2 */ @@ -9651,16 +9626,14 @@ r = p */ +#ifndef CURVED25519_ASM static void ge_p1p1_to_p2(ge_p2 *r,const ge_p1p1 *p) { -#ifndef CURVED25519_ASM fe_mul(r->X,p->X,p->T); fe_mul(r->Y,p->Y,p->Z); fe_mul(r->Z,p->Z,p->T); -#else - fe_ge_to_p2(r->X, r->Y, r->Z, p->X, p->Y, p->Z, p->T); -#endif } +#endif /* ge p1p1 to p3 */ @@ -9669,17 +9642,15 @@ r = p */ +#ifndef CURVED25519_ASM static WC_INLINE void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p) { -#ifndef CURVED25519_ASM 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); -#else - fe_ge_to_p3(r->X, r->Y, r->Z, r->T, p->X, p->Y, p->Z, p->T); -#endif } +#endif /* ge p2 0 */ @@ -9698,9 +9669,9 @@ r = 2 * p */ +#ifndef CURVED25519_ASM static WC_INLINE void ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p) { -#ifndef CURVED25519_ASM ge t0; fe_sq(r->X,p->X); fe_sq(r->Z,p->Y); @@ -9711,10 +9682,8 @@ fe_sub(r->Z,r->Z,r->X); fe_sub(r->X,t0,r->Y); fe_sub(r->T,r->T,r->Z); -#else - fe_ge_dbl(r->X, r->Y, r->Z, r->T, p->X, p->Y, p->Z); -#endif } +#endif /* ge p3 dble */ @@ -9723,16 +9692,14 @@ r = 2 * p */ +#ifndef CURVED25519_ASM static void ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p) { -#ifndef CURVED25519_ASM ge_p2 q; ge_p3_to_p2(&q,p); ge_p2_dbl(r,&q); -#else - fe_ge_dbl(r->X, r->Y, r->Z, r->T, p->X, p->Y, p->Z); -#endif } +#endif /* ge p3 to cached */ @@ -9786,6 +9753,7 @@ #endif +#ifdef GE_P3_TOBYTES_IMPL /* ge p3 tobytes */ void ge_p3_tobytes(unsigned char *s,const ge_p3 *h) { @@ -9797,11 +9765,13 @@ fe_mul(x,h->X,recip); fe_mul(y,h->Y,recip); fe_tobytes(s,y); - s[31] ^= fe_isnegative(x) << 7; + s[31] ^= (unsigned char)(fe_isnegative(x) << 7); } +#endif #ifndef CURVED25519_ASM +#if defined(HAVE_ED25519_SIGN) || defined(HAVE_ED25519_MAKE_KEY) /* ge_precomp_0 */ static void ge_precomp_0(ge_precomp *h) { @@ -9810,6 +9780,7 @@ fe_0(h->xy2d); } #endif +#endif /* ge_sub */ @@ -9817,9 +9788,9 @@ r = p - q */ +#ifndef CURVED25519_ASM static WC_INLINE void ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q) { -#ifndef CURVED25519_ASM ge t0; fe_add(r->X,p->Y,p->X); fe_sub(r->Y,p->Y,p->X); @@ -9832,12 +9803,8 @@ fe_add(r->Y,r->Z,r->Y); fe_sub(r->Z,t0,r->T); fe_add(r->T,t0,r->T); -#else - fe_ge_sub(r->X, r->Y, r->Z, r->T, p->X, p->Y, p->Z, p->T, q->Z, q->T2d, - q->YplusX, q->YminusX); -#endif } - +#endif /* ge tobytes */ void ge_tobytes(unsigned char *s,const ge_p2 *h) @@ -9850,7 +9817,7 @@ fe_mul(x,h->X,recip); fe_mul(y,h->Y,recip); fe_tobytes(s,y); - s[31] ^= fe_isnegative(x) << 7; + s[31] ^= (unsigned char)(fe_isnegative(x) << 7); } #endif /* !ED25519_SMALL */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/hash.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hash.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/hash.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hash.c 2024-08-03 07:30:00.000000000 +0000 @@ -59,7 +59,8 @@ SHA3_384h = 422, SHA3_512h = 423, SHAKE128h = 424, - SHAKE256h = 425 + SHAKE256h = 425, + SM3h = 640 /* 0x2A,0x81,0x1C,0xCF,0x55,0x01,0x83,0x11 */ }; #endif /* !NO_ASN */ @@ -121,6 +122,11 @@ eHashType = WC_HASH_TYPE_SHA3_512; break; #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + eHashType = WC_HASH_TYPE_SM3; + break; + #endif default: eHashType = WC_HASH_TYPE_NONE; break; @@ -139,7 +145,7 @@ int wc_HashGetOID(enum wc_HashType hash_type) { - int oid = HASH_TYPE_E; /* Default to hash type error */ + int oid = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ switch(hash_type) { case WC_HASH_TYPE_MD2: @@ -222,6 +228,11 @@ oid = SHAKE256h; break; #endif + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + oid = SM3h; + break; + #endif /* Not Supported */ case WC_HASH_TYPE_MD4: @@ -289,6 +300,11 @@ hash_type = WC_HASH_TYPE_SHA3_512; break; #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case SM3h: + hash_type = WC_HASH_TYPE_SM3; + break; + #endif default: break; } @@ -301,7 +317,7 @@ /* Get Hash digest size */ int wc_HashGetDigestSize(enum wc_HashType hash_type) { - int dig_size = HASH_TYPE_E; /* Default to hash type error */ + int dig_size = WC_NO_ERR_TRACE(HASH_TYPE_E); switch(hash_type) { case WC_HASH_TYPE_MD2: @@ -395,6 +411,12 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + dig_size = WC_SM3_DIGEST_SIZE; + break; + #endif + /* Not Supported */ #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128) case WC_HASH_TYPE_SHAKE128: @@ -414,7 +436,7 @@ /* Get Hash block size */ int wc_HashGetBlockSize(enum wc_HashType hash_type) { - int block_size = HASH_TYPE_E; /* Default to hash type error */ + int block_size = WC_NO_ERR_TRACE(HASH_TYPE_E); switch (hash_type) { case WC_HASH_TYPE_MD2: @@ -508,6 +530,12 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + block_size = WC_SM3_BLOCK_SIZE; + break; + #endif + /* Not Supported */ #if defined(WOLFSSL_SHA3) && defined(WOLFSSL_SHAKE128) case WC_HASH_TYPE_SHAKE128: @@ -524,10 +552,10 @@ } /* Generic Hashing Wrapper */ -int wc_Hash(enum wc_HashType hash_type, const byte* data, - word32 data_len, byte* hash, word32 hash_len) +int wc_Hash_ex(enum wc_HashType hash_type, const byte* data, + word32 data_len, byte* hash, word32 hash_len, void* heap, int devId) { - int ret = HASH_TYPE_E; /* Default to hash type error */ + int ret = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ int dig_size; /* Validate hash buffer size */ @@ -550,39 +578,39 @@ { case WC_HASH_TYPE_MD5: #ifndef NO_MD5 - ret = wc_Md5Hash(data, data_len, hash); + ret = wc_Md5Hash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA: #ifndef NO_SHA - ret = wc_ShaHash(data, data_len, hash); + ret = wc_ShaHash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA224: #ifdef WOLFSSL_SHA224 - ret = wc_Sha224Hash(data, data_len, hash); + ret = wc_Sha224Hash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA256: #ifndef NO_SHA256 - ret = wc_Sha256Hash(data, data_len, hash); + ret = wc_Sha256Hash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA384: #ifdef WOLFSSL_SHA384 - ret = wc_Sha384Hash(data, data_len, hash); + ret = wc_Sha384Hash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA512: #ifdef WOLFSSL_SHA512 - ret = wc_Sha512Hash(data, data_len, hash); + ret = wc_Sha512Hash_ex(data, data_len, hash, heap, devId); #endif break; #ifndef WOLFSSL_NOSHA512_224 case WC_HASH_TYPE_SHA512_224: #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) - ret = wc_Sha512_224Hash(data, data_len, hash); + ret = wc_Sha512_224Hash_ex(data, data_len, hash, heap, devId); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ break; @@ -591,41 +619,48 @@ case WC_HASH_TYPE_SHA512_256: #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_NOSHA512_224) - ret = wc_Sha512_256Hash(data, data_len, hash); + ret = wc_Sha512_256Hash_ex(data, data_len, hash, heap, devId); #endif #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ break; #endif case WC_HASH_TYPE_MD5_SHA: #if !defined(NO_MD5) && !defined(NO_SHA) - ret = wc_Md5Hash(data, data_len, hash); + ret = wc_Md5Hash_ex(data, data_len, hash, heap, devId); if (ret == 0) { - ret = wc_ShaHash(data, data_len, &hash[WC_MD5_DIGEST_SIZE]); + ret = wc_ShaHash_ex(data, data_len, &hash[WC_MD5_DIGEST_SIZE], + heap, devId); } #endif break; case WC_HASH_TYPE_SHA3_224: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_224) - ret = wc_Sha3_224Hash(data, data_len, hash); + ret = wc_Sha3_224Hash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA3_256: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_256) - ret = wc_Sha3_256Hash(data, data_len, hash); + ret = wc_Sha3_256Hash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA3_384: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_384) - ret = wc_Sha3_384Hash(data, data_len, hash); + ret = wc_Sha3_384Hash_ex(data, data_len, hash, heap, devId); #endif break; case WC_HASH_TYPE_SHA3_512: #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_NOSHA3_512) - ret = wc_Sha3_512Hash(data, data_len, hash); + ret = wc_Sha3_512Hash_ex(data, data_len, hash, heap, devId); #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3Hash_ex(data, data_len, hash, heap, devId); + break; + #endif + /* Not Supported */ case WC_HASH_TYPE_MD2: case WC_HASH_TYPE_MD4: @@ -644,11 +679,17 @@ } return ret; } +int wc_Hash(enum wc_HashType hash_type, const byte* data, + word32 data_len, byte* hash, word32 hash_len) +{ + return wc_Hash_ex(hash_type, data, data_len, hash, hash_len, + NULL, INVALID_DEVID); +} int wc_HashInit_ex(wc_HashAlg* hash, enum wc_HashType type, void* heap, int devId) { - int ret = HASH_TYPE_E; /* Default to hash type error */ + int ret = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ if (hash == NULL) return BAD_FUNC_ARG; @@ -723,6 +764,12 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_InitSm3(&hash->sm3, heap, devId); + break; + #endif + /* not supported */ case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_MD2: @@ -754,7 +801,7 @@ int wc_HashUpdate(wc_HashAlg* hash, enum wc_HashType type, const byte* data, word32 dataSz) { - int ret = HASH_TYPE_E; /* Default to hash type error */ + int ret = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ if (hash == NULL || (data == NULL && dataSz > 0)) return BAD_FUNC_ARG; @@ -829,6 +876,12 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3Update(&hash->sm3, data, dataSz); + break; + #endif + /* not supported */ case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_MD2: @@ -851,7 +904,7 @@ int wc_HashFinal(wc_HashAlg* hash, enum wc_HashType type, byte* out) { - int ret = HASH_TYPE_E; /* Default to hash type error */ + int ret = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ if (hash == NULL || out == NULL) return BAD_FUNC_ARG; @@ -926,6 +979,12 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3Final(&hash->sm3, out); + break; + #endif + /* not supported */ case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_MD2: @@ -948,7 +1007,7 @@ int wc_HashFree(wc_HashAlg* hash, enum wc_HashType type) { - int ret = HASH_TYPE_E; /* Default to hash type error */ + int ret = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ if (hash == NULL) return BAD_FUNC_ARG; @@ -1035,6 +1094,13 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + wc_Sm3Free(&hash->sm3); + ret = 0; + break; + #endif + /* not supported */ case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_MD2: @@ -1058,7 +1124,7 @@ #ifdef WOLFSSL_HASH_FLAGS int wc_HashSetFlags(wc_HashAlg* hash, enum wc_HashType type, word32 flags) { - int ret = HASH_TYPE_E; /* Default to hash type error */ + int ret = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ if (hash == NULL) return BAD_FUNC_ARG; @@ -1110,6 +1176,12 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3SetFlags(&hash->sm3, flags); + break; + #endif + /* not supported */ case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_MD2: @@ -1131,7 +1203,7 @@ } int wc_HashGetFlags(wc_HashAlg* hash, enum wc_HashType type, word32* flags) { - int ret = HASH_TYPE_E; /* Default to hash type error */ + int ret = WC_NO_ERR_TRACE(HASH_TYPE_E); /* Default to hash type error */ if (hash == NULL) return BAD_FUNC_ARG; @@ -1183,6 +1255,12 @@ #endif break; + #ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: + ret = wc_Sm3GetFlags(&hash->sm3, flags); + break; + #endif + /* not supported */ case WC_HASH_TYPE_MD5_SHA: case WC_HASH_TYPE_MD2: @@ -1208,7 +1286,8 @@ #if !defined(WOLFSSL_TI_HASH) #if !defined(NO_MD5) - int wc_Md5Hash(const byte* data, word32 len, byte* hash) + int wc_Md5Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret; #ifdef WOLFSSL_SMALL_STACK @@ -1223,7 +1302,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitMd5(md5)) != 0) { + if ((ret = wc_InitMd5_ex(md5, heap, devId)) != 0) { WOLFSSL_MSG("InitMd5 failed"); } else { @@ -1242,10 +1321,22 @@ return ret; } + int wc_Md5Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Md5Hash_ex(data, len, hash, NULL, devId); + } #endif /* !NO_MD5 */ #if !defined(NO_SHA) - int wc_ShaHash(const byte* data, word32 len, byte* hash) + int wc_ShaHash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1253,7 +1344,6 @@ #else wc_Sha sha[1]; #endif - int devId = INVALID_DEVID; #ifdef WOLFSSL_SMALL_STACK sha = (wc_Sha*)XMALLOC(sizeof(wc_Sha), NULL, DYNAMIC_TYPE_TMP_BUFFER); @@ -1261,13 +1351,7 @@ return MEMORY_E; #endif - #ifdef WOLF_CRYPTO_CB - /* only use devId if its not an empty hash */ - if (data != NULL && len > 0) - devId = wc_CryptoCb_GetDevIdAtIndex(0); - #endif - - if ((ret = wc_InitSha_ex(sha, NULL, devId)) != 0) { + if ((ret = wc_InitSha_ex(sha, heap, devId)) != 0) { WOLFSSL_MSG("InitSha failed"); } else { @@ -1286,10 +1370,22 @@ return ret; } + int wc_ShaHash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_ShaHash_ex(data, len, hash, NULL, devId); + } #endif /* !NO_SHA */ #if defined(WOLFSSL_SHA224) - int wc_Sha224Hash(const byte* data, word32 len, byte* hash) + int wc_Sha224Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1305,7 +1401,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha224(sha224)) != 0) { + if ((ret = wc_InitSha224_ex(sha224, heap, devId)) != 0) { WOLFSSL_MSG("InitSha224 failed"); } else { @@ -1322,12 +1418,24 @@ XFREE(sha224, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif - return ret; -} + return ret; + } + int wc_Sha224Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha224Hash_ex(data, len, hash, NULL, devId); + } #endif /* WOLFSSL_SHA224 */ #if !defined(NO_SHA256) - int wc_Sha256Hash(const byte* data, word32 len, byte* hash) + int wc_Sha256Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1335,7 +1443,6 @@ #else wc_Sha256 sha256[1]; #endif - int devId = INVALID_DEVID; #ifdef WOLFSSL_SMALL_STACK sha256 = (wc_Sha256*)XMALLOC(sizeof(wc_Sha256), NULL, @@ -1344,13 +1451,7 @@ return MEMORY_E; #endif - #ifdef WOLF_CRYPTO_CB - /* only use devId if its not an empty hash */ - if (data != NULL && len > 0) - devId = wc_CryptoCb_GetDevIdAtIndex(0); - #endif - - if ((ret = wc_InitSha256_ex(sha256, NULL, devId)) != 0) { + if ((ret = wc_InitSha256_ex(sha256, heap, devId)) != 0) { WOLFSSL_MSG("InitSha256 failed"); } else { @@ -1370,13 +1471,25 @@ return ret; } + int wc_Sha256Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha256Hash_ex(data, len, hash, NULL, devId); + } #endif /* !NO_SHA256 */ #endif /* !defined(WOLFSSL_TI_HASH) */ #if defined(WOLFSSL_SHA512) - int wc_Sha512Hash(const byte* data, word32 len, byte* hash) + int wc_Sha512Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1392,7 +1505,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha512(sha512)) != 0) { + if ((ret = wc_InitSha512_ex(sha512, heap, devId)) != 0) { WOLFSSL_MSG("InitSha512 failed"); } else { @@ -1411,9 +1524,21 @@ return ret; } + int wc_Sha512Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha512Hash_ex(data, len, hash, NULL, devId); + } #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #ifndef WOLFSSL_NOSHA512_224 - int wc_Sha512_224Hash(const byte* data, word32 len, byte* hash) + int wc_Sha512_224Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1429,7 +1554,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha512_224(sha512)) != 0) { + if ((ret = wc_InitSha512_224_ex(sha512, heap, devId)) != 0) { WOLFSSL_MSG("wc_InitSha512_224 failed"); } else { @@ -1448,12 +1573,24 @@ return ret; } + int wc_Sha512_224Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha512_224Hash_ex(data, len, hash, NULL, devId); + } #endif /* !WOLFSSL_NOSHA512_224 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) #ifndef WOLFSSL_NOSHA512_256 - int wc_Sha512_256Hash(const byte* data, word32 len, byte* hash) + int wc_Sha512_256Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1469,7 +1606,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha512_256(sha512)) != 0) { + if ((ret = wc_InitSha512_256_ex(sha512, heap, devId)) != 0) { WOLFSSL_MSG("wc_InitSha512_256 failed"); } else { @@ -1488,13 +1625,25 @@ return ret; } + int wc_Sha512_256Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha512_256Hash_ex(data, len, hash, NULL, devId); + } #endif /* !WOLFSSL_NOSHA512_256 */ #endif /* !HAVE_FIPS && !HAVE_SELFTEST */ #endif /* WOLFSSL_SHA512 */ #if defined(WOLFSSL_SHA384) - int wc_Sha384Hash(const byte* data, word32 len, byte* hash) + int wc_Sha384Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1510,7 +1659,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha384(sha384)) != 0) { + if ((ret = wc_InitSha384_ex(sha384, heap, devId)) != 0) { WOLFSSL_MSG("InitSha384 failed"); } else { @@ -1529,11 +1678,23 @@ return ret; } + int wc_Sha384Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha384Hash_ex(data, len, hash, NULL, devId); + } #endif /* WOLFSSL_SHA384 */ #if defined(WOLFSSL_SHA3) #if !defined(WOLFSSL_NOSHA3_224) - int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash) + int wc_Sha3_224Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1549,7 +1710,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha3_224(sha3, NULL, INVALID_DEVID)) != 0) { + if ((ret = wc_InitSha3_224(sha3, heap, devId)) != 0) { WOLFSSL_MSG("InitSha3_224 failed"); } else { @@ -1568,10 +1729,22 @@ return ret; } + int wc_Sha3_224Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha3_224Hash_ex(data, len, hash, NULL, devId); + } #endif /* !WOLFSSL_NOSHA3_224 */ #if !defined(WOLFSSL_NOSHA3_256) - int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash) + int wc_Sha3_256Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1587,7 +1760,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha3_256(sha3, NULL, INVALID_DEVID)) != 0) { + if ((ret = wc_InitSha3_256(sha3, heap, devId)) != 0) { WOLFSSL_MSG("InitSha3_256 failed"); } else { @@ -1606,10 +1779,22 @@ return ret; } + int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha3_256Hash_ex(data, len, hash, NULL, devId); + } #endif /* !WOLFSSL_NOSHA3_256 */ #if !defined(WOLFSSL_NOSHA3_384) - int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash) + int wc_Sha3_384Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1625,7 +1810,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha3_384(sha3, NULL, INVALID_DEVID)) != 0) { + if ((ret = wc_InitSha3_384(sha3, heap, devId)) != 0) { WOLFSSL_MSG("InitSha3_384 failed"); } else { @@ -1644,10 +1829,22 @@ return ret; } + int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha3_384Hash_ex(data, len, hash, NULL, devId); + } #endif /* !WOLFSSL_NOSHA3_384 */ #if !defined(WOLFSSL_NOSHA3_512) - int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash) + int wc_Sha3_512Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1663,7 +1860,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitSha3_512(sha3, NULL, INVALID_DEVID)) != 0) { + if ((ret = wc_InitSha3_512(sha3, heap, devId)) != 0) { WOLFSSL_MSG("InitSha3_512 failed"); } else { @@ -1682,11 +1879,22 @@ return ret; } + int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sha3_512Hash_ex(data, len, hash, NULL, devId); + } #endif /* !WOLFSSL_NOSHA3_512 */ #ifdef WOLFSSL_SHAKE128 - int wc_Shake128Hash(const byte* data, word32 len, byte* hash, - word32 hashLen) + int wc_Shake128Hash_ex(const byte* data, word32 len, byte* hash, + word32 hashLen, void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1702,7 +1910,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitShake128(shake, NULL, INVALID_DEVID)) != 0) { + if ((ret = wc_InitShake128(shake, heap, devId)) != 0) { WOLFSSL_MSG("InitShake128 failed"); } else { @@ -1721,11 +1929,24 @@ return ret; } + int wc_Shake128Hash(const byte* data, word32 len, byte* hash, + word32 hashLen) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Shake128Hash_ex(data, len, hash, hashLen, + NULL, devId); + } #endif /* WOLFSSL_SHAKE_128 */ #ifdef WOLFSSL_SHAKE256 - int wc_Shake256Hash(const byte* data, word32 len, byte* hash, - word32 hashLen) + int wc_Shake256Hash_ex(const byte* data, word32 len, byte* hash, + word32 hashLen, void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -1741,7 +1962,7 @@ return MEMORY_E; #endif - if ((ret = wc_InitShake256(shake, NULL, INVALID_DEVID)) != 0) { + if ((ret = wc_InitShake256(shake, heap, devId)) != 0) { WOLFSSL_MSG("InitShake256 failed"); } else { @@ -1760,9 +1981,71 @@ return ret; } + int wc_Shake256Hash(const byte* data, word32 len, byte* hash, + word32 hashLen) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Shake256Hash_ex(data, len, hash, hashLen, + NULL, devId); + } #endif /* WOLFSSL_SHAKE_256 */ #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SM3 + int wc_Sm3Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId) + { + int ret = 0; + #ifdef WOLFSSL_SMALL_STACK + wc_Sm3* sm3; + #else + wc_Sm3 sm3[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + sm3 = (wc_Sm3*)XMALLOC(sizeof(wc_Sm3), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (sm3 == NULL) + return MEMORY_E; + #endif + + if ((ret = wc_InitSm3(sm3, heap, devId)) != 0) { + WOLFSSL_MSG("InitSm3 failed"); + } + else { + if ((ret = wc_Sm3Update(sm3, data, len)) != 0) { + WOLFSSL_MSG("Sm3Update failed"); + } + else if ((ret = wc_Sm3Final(sm3, hash)) != 0) { + WOLFSSL_MSG("Sm3Final failed"); + } + wc_Sm3Free(sm3); + } + + #ifdef WOLFSSL_SMALL_STACK + XFREE(sm3, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + + return ret; + } + int wc_Sm3Hash(const byte* data, word32 len, byte* hash) + { + int devId = INVALID_DEVID; + #ifdef WOLF_CRYPTO_CB + /* find devId if its not an empty hash */ + if (data != NULL && len > 0) { + devId = wc_CryptoCb_DefaultDevID(); + } + #endif + return wc_Sm3Hash_ex(data, len, hash, NULL, devId); + } +#endif /* !WOLFSSL_NOSHA3_224 */ + #endif /* !NO_HASH_WRAPPER */ #ifdef WOLFSSL_HASH_KEEP diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/hmac.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hmac.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/hmac.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hmac.c 2024-08-03 07:30:00.000000000 +0000 @@ -30,15 +30,13 @@ #ifndef NO_HMAC -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) - +#if FIPS_VERSION3_GE(2,0,0) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$b") - #pragma const_seg(".fipsB$b") + #pragma code_seg(".fipsA$g") + #pragma const_seg(".fipsB$g") #endif #endif @@ -64,83 +62,23 @@ #define wc_HmacFinal wc_HmacFinal_Software #endif - -/* fips wrapper calls, user can call direct */ -/* If building for old FIPS. */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - - /* does init */ - int wc_HmacSetKey(Hmac* hmac, int type, const byte* key, word32 keySz) - { - if (hmac == NULL || (key == NULL && keySz != 0) || - !(type == WC_MD5 || type == WC_SHA || type == WC_SHA256 || - type == WC_SHA384 || type == WC_SHA512)) { - return BAD_FUNC_ARG; - } - - return HmacSetKey_fips(hmac, type, key, keySz); - } - int wc_HmacUpdate(Hmac* hmac, const byte* in, word32 sz) - { - if (hmac == NULL || (in == NULL && sz > 0)) { - return BAD_FUNC_ARG; - } - - return HmacUpdate_fips(hmac, in, sz); - } - int wc_HmacFinal(Hmac* hmac, byte* out) - { - if (hmac == NULL) { - return BAD_FUNC_ARG; - } - - return HmacFinal_fips(hmac, out); - } - int wolfSSL_GetHmacMaxSize(void) +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_hmac_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000008 }; + int wolfCrypt_FIPS_HMAC_sanity(void) { - return CyaSSL_GetHmacMaxSize(); - } - - int wc_HmacInit(Hmac* hmac, void* heap, int devId) - { - #ifndef WOLFSSL_KCAPI_HMAC - (void)hmac; - (void)heap; - (void)devId; return 0; - #else - return HmacInit(hmac, heap, devId); - #endif } - void wc_HmacFree(Hmac* hmac) - { - #ifndef WOLFSSL_KCAPI_HMAC - (void)hmac; - #else - HmacFree(hmac); - #endif - } - - #ifdef HAVE_HKDF - int wc_HKDF(int type, const byte* inKey, word32 inKeySz, - const byte* salt, word32 saltSz, - const byte* info, word32 infoSz, - byte* out, word32 outSz) - { - return HKDF(type, inKey, inKeySz, salt, saltSz, - info, infoSz, out, outSz); - } - #endif /* HAVE_HKDF */ - -#else /* else build without fips, or for new fips */ - +#endif int wc_HmacSizeByType(int type) { int ret; if (!(type == WC_MD5 || type == WC_SHA || + #ifdef WOLFSSL_SM3 + type == WC_SM3 || + #endif type == WC_SHA224 || type == WC_SHA256 || type == WC_SHA384 || type == WC_SHA512 || type == WC_SHA3_224 || type == WC_SHA3_256 || @@ -200,7 +138,12 @@ case WC_SHA3_512: ret = WC_SHA3_512_DIGEST_SIZE; break; + #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + ret = WC_SM3_DIGEST_SIZE; + break; #endif default: @@ -278,6 +221,12 @@ #endif #endif + #ifdef WOLFSSL_SM3 + case WC_SM3: + ret = wc_InitSm3(&hmac->hash.sm3, heap, devId); + break; + #endif + default: ret = BAD_FUNC_ARG; break; @@ -294,7 +243,8 @@ } -int wc_HmacSetKey(Hmac* hmac, int type, const byte* key, word32 length) +int wc_HmacSetKey_ex(Hmac* hmac, int type, const byte* key, word32 length, + int allowFlag) { #ifndef WOLFSSL_MAXQ108X byte* ip; @@ -306,6 +256,9 @@ if (hmac == NULL || (key == NULL && length != 0) || !(type == WC_MD5 || type == WC_SHA || + #ifdef WOLFSSL_SM3 + type == WC_SM3 || + #endif type == WC_SHA224 || type == WC_SHA256 || type == WC_SHA384 || type == WC_SHA512 || type == WC_SHA3_224 || type == WC_SHA3_256 || @@ -313,7 +266,7 @@ return BAD_FUNC_ARG; } -#ifndef HAVE_FIPS +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) /* if set key has already been run then make sure and free existing */ /* This is for async and PIC32MZ situations, and just normally OK, provided the user calls wc_HmacInit() first. That function is not @@ -331,12 +284,40 @@ if (ret != 0) return ret; -#ifdef HAVE_FIPS - if (length < HMAC_FIPS_MIN_KEY) { - WOLFSSL_ERROR_VERBOSE(HMAC_MIN_KEYLEN_E); - return HMAC_MIN_KEYLEN_E; + /* Regarding the password length: + * SP800-107r1 ss 5.3.2 states: "An HMAC key shall have a security strength + * that meets or exceeds the security strength required to protect the data + * over which the HMAC is computed" then refers to SP800-133 for HMAC keys + * generation. + * + * SP800-133r2 ss 6.2.3 states: "When a key is generated from a password, + * the entropy provided (and thus, the maximum security strength that can be + * supported by the generated key) shall be considered to be zero unless the + * password is generated using an approved RBG" + * + * wolfSSL Notes: The statement from SP800-133r2 applies to + * all password lengths. Any human generated password is considered to have + * 0 security strength regardless of length, there is no minimum length that + * is OK or will provide any amount of security strength other than 0. If + * a security strength is required users shall generate random passwords + * using a FIPS approved RBG of sufficient length that any HMAC key + * generated from that password can claim to inherit the needed security + * strength from that input. + */ + + /* In light of the above, Loosen past restriction that limited passwords to + * no less than 14-bytes to allow for shorter Passwords. + * User needs to pass true (non-zero) to override historical behavior that + * prevented use of any password less than 14-bytes. ALL non-RBG generated + * passwords shall inherit a security strength of zero + * (no security strength) + */ + if (!allowFlag) { + if (length < HMAC_FIPS_MIN_KEY) { + WOLFSSL_ERROR_VERBOSE(HMAC_MIN_KEYLEN_E); + return HMAC_MIN_KEYLEN_E; + } } -#endif #ifdef WOLF_CRYPTO_CB hmac->keyRaw = key; /* use buffer directly */ @@ -558,6 +539,27 @@ #endif #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + hmac_block_size = WC_SM3_BLOCK_SIZE; + if (length <= WC_SM3_BLOCK_SIZE) { + if (key != NULL) { + XMEMCPY(ip, key, length); + } + } + else { + ret = wc_Sm3Update(&hmac->hash.sm3, key, length); + if (ret != 0) + break; + ret = wc_Sm3Final(&hmac->hash.sm3, ip); + if (ret != 0) + break; + + length = WC_SM3_DIGEST_SIZE; + } + break; + #endif + default: return BAD_FUNC_ARG; } @@ -597,6 +599,16 @@ #endif /* WOLFSSL_MAXQ108X */ } +int wc_HmacSetKey(Hmac* hmac, int type, const byte* key, word32 length) +{ + int allowFlag; + #if defined(HAVE_FIPS) + allowFlag = 0; /* default false for FIPS cases */ + #else + allowFlag = 1; /* default true for all non-FIPS cases */ + #endif + return wc_HmacSetKey_ex(hmac, type, key, length, allowFlag); +} static int HmacKeyInnerHash(Hmac* hmac) { @@ -670,6 +682,13 @@ #endif #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + ret = wc_Sm3Update(&hmac->hash.sm3, (byte*)hmac->ipad, + WC_SM3_BLOCK_SIZE); + break; + #endif + default: break; } @@ -692,7 +711,7 @@ #ifdef WOLF_CRYPTO_CB if (hmac->devId != INVALID_DEVID) { ret = wc_CryptoCb_Hmac(hmac, hmac->macType, msg, length, NULL); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ ret = 0; /* reset error code */ @@ -776,6 +795,12 @@ #endif #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + ret = wc_Sm3Update(&hmac->hash.sm3, msg, length); + break; + #endif + default: break; } @@ -795,7 +820,7 @@ #ifdef WOLF_CRYPTO_CB if (hmac->devId != INVALID_DEVID) { ret = wc_CryptoCb_Hmac(hmac, hmac->macType, NULL, 0, hash); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -993,6 +1018,23 @@ #endif #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + ret = wc_Sm3Final(&hmac->hash.sm3, (byte*)hmac->innerHash); + if (ret != 0) + break; + ret = wc_Sm3Update(&hmac->hash.sm3, (byte*)hmac->opad, + WC_SM3_BLOCK_SIZE); + if (ret != 0) + break; + ret = wc_Sm3Update(&hmac->hash.sm3, (byte*)hmac->innerHash, + WC_SM3_DIGEST_SIZE); + if (ret != 0) + break; + ret = wc_Sm3Final(&hmac->hash.sm3, hash); + break; + #endif + default: ret = BAD_FUNC_ARG; break; @@ -1167,9 +1209,17 @@ #endif #endif /* WOLFSSL_SHA3 */ + #ifdef WOLFSSL_SM3 + case WC_SM3: + wc_Sm3Free(&hmac->hash.sm3); + break; + #endif + default: break; } + + ForceZero(hmac, sizeof(*hmac)); } #endif /* WOLFSSL_KCAPI_HMAC */ @@ -1190,8 +1240,8 @@ * out The pseudorandom key with the length that of the hash. * returns 0 on success, otherwise failure. */ - int wc_HKDF_Extract(int type, const byte* salt, word32 saltSz, - const byte* inKey, word32 inKeySz, byte* out) + int wc_HKDF_Extract_ex(int type, const byte* salt, word32 saltSz, + const byte* inKey, word32 inKeySz, byte* out, void* heap, int devId) { byte tmp[WC_MAX_DIGEST_SIZE]; /* localSalt helper */ #ifdef WOLFSSL_SMALL_STACK @@ -1223,9 +1273,14 @@ saltSz = hashSz; } - ret = wc_HmacInit(myHmac, NULL, INVALID_DEVID); + ret = wc_HmacInit(myHmac, heap, devId); if (ret == 0) { + #if FIPS_VERSION3_GE(6,0,0) + ret = wc_HmacSetKey_ex(myHmac, type, localSalt, saltSz, + FIPS_ALLOW_SHORT); + #else ret = wc_HmacSetKey(myHmac, type, localSalt, saltSz); + #endif if (ret == 0) ret = wc_HmacUpdate(myHmac, inKey, inKeySz); if (ret == 0) @@ -1239,6 +1294,13 @@ return ret; } + int wc_HKDF_Extract(int type, const byte* salt, word32 saltSz, + const byte* inKey, word32 inKeySz, byte* out) + { + return wc_HKDF_Extract_ex(type, salt, saltSz, inKey, inKeySz, out, NULL, + INVALID_DEVID); + } + /* HMAC-KDF-Expand. * RFC 5869 - HMAC-based Extract-and-Expand Key Derivation Function (HKDF). * @@ -1250,8 +1312,9 @@ * out The output keying material. * returns 0 on success, otherwise failure. */ - int wc_HKDF_Expand(int type, const byte* inKey, word32 inKeySz, - const byte* info, word32 infoSz, byte* out, word32 outSz) + int wc_HKDF_Expand_ex(int type, const byte* inKey, word32 inKeySz, + const byte* info, word32 infoSz, byte* out, word32 outSz, + void* heap, int devId) { byte tmp[WC_MAX_DIGEST_SIZE]; #ifdef WOLFSSL_SMALL_STACK @@ -1284,7 +1347,7 @@ } #endif - ret = wc_HmacInit(myHmac, NULL, INVALID_DEVID); + ret = wc_HmacInit(myHmac, heap, devId); if (ret != 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(myHmac, NULL, DYNAMIC_TYPE_HMAC); @@ -1298,7 +1361,12 @@ word32 tmpSz = (n == 1) ? 0 : hashSz; word32 left = outSz - outIdx; + #if FIPS_VERSION3_GE(6,0,0) + ret = wc_HmacSetKey_ex(myHmac, type, inKey, inKeySz, + FIPS_ALLOW_SHORT); + #else ret = wc_HmacSetKey(myHmac, type, inKey, inKeySz); + #endif if (ret != 0) break; ret = wc_HmacUpdate(myHmac, tmp, tmpSz); @@ -1329,6 +1397,13 @@ return ret; } + int wc_HKDF_Expand(int type, const byte* inKey, word32 inKeySz, + const byte* info, word32 infoSz, byte* out, word32 outSz) + { + return wc_HKDF_Expand_ex(type, inKey, inKeySz, info, infoSz, out, outSz, + NULL, INVALID_DEVID); + } + /* HMAC-KDF. * RFC 5869 - HMAC-based Extract-and-Expand Key Derivation Function (HKDF). * @@ -1366,5 +1441,4 @@ #endif /* HAVE_HKDF */ -#endif /* HAVE_FIPS */ #endif /* NO_HMAC */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/hpke.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hpke.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/hpke.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/hpke.c 2024-08-03 07:30:00.000000000 +0000 @@ -117,7 +117,7 @@ } /* make sure the byte string is cleared */ - XMEMSET( out, 0, w ); + XMEMSET(out, 0, (size_t)w); for (i = 0; i < w && n > 0; i++) { out[w-(i + 1)] = (byte)n; @@ -138,9 +138,9 @@ } XMEMSET(hpke, 0, sizeof(*hpke)); - hpke->kem = kem; - hpke->kdf = kdf; - hpke->aead = aead; + hpke->kem = (word32)kem; + hpke->kdf = (word32)kdf; + hpke->aead = (word32)aead; hpke->heap = heap; /* set kem_suite_id */ @@ -177,7 +177,7 @@ hpke->curve_id = ECC_SECP256R1; hpke->Nsecret = WC_SHA256_DIGEST_SIZE; hpke->Nh = WC_SHA256_DIGEST_SIZE; - hpke->Ndh = wc_ecc_get_curve_size_from_id(hpke->curve_id); + hpke->Ndh = (word32)wc_ecc_get_curve_size_from_id(hpke->curve_id); hpke->Npk = 1 + hpke->Ndh * 2; break; #endif @@ -187,7 +187,7 @@ hpke->curve_id = ECC_SECP384R1; hpke->Nsecret = WC_SHA384_DIGEST_SIZE; hpke->Nh = WC_SHA384_DIGEST_SIZE; - hpke->Ndh = wc_ecc_get_curve_size_from_id(hpke->curve_id); + hpke->Ndh = (word32)wc_ecc_get_curve_size_from_id(hpke->curve_id); hpke->Npk = 1 + hpke->Ndh * 2; break; #endif @@ -197,7 +197,7 @@ hpke->curve_id = ECC_SECP521R1; hpke->Nsecret = WC_SHA512_DIGEST_SIZE; hpke->Nh = WC_SHA512_DIGEST_SIZE; - hpke->Ndh = wc_ecc_get_curve_size_from_id(hpke->curve_id); + hpke->Ndh = (word32)wc_ecc_get_curve_size_from_id(hpke->curve_id); hpke->Npk = 1 + hpke->Ndh * 2; break; #endif @@ -272,7 +272,7 @@ } if ((int)hpke->Ndh < 0) { - return hpke->Ndh; + return (int)hpke->Ndh; } return ret; @@ -332,7 +332,7 @@ ret = MEMORY_E; if (ret != 0 && *keypair != NULL) { - wc_HpkeFreeKey(hpke, hpke->kem, *keypair, hpke->heap); + wc_HpkeFreeKey(hpke, (word16)hpke->kem, *keypair, hpke->heap); *keypair = NULL; } @@ -373,7 +373,7 @@ break; } - *outSz = tmpOutSz; + *outSz = (word16)tmpOutSz; return ret; } @@ -430,7 +430,7 @@ ret = MEMORY_E; if (ret != 0 && *key != NULL) { - wc_HpkeFreeKey(hpke, hpke->kem, *key, hpke->heap); + wc_HpkeFreeKey(hpke, (word16)hpke->kem, *key, hpke->heap); *key = NULL; } @@ -547,7 +547,7 @@ #endif /* copy length */ - ret = I2OSP(L, 2, labeled_info); + ret = I2OSP((int)L, 2, labeled_info); labeled_info_p = labeled_info + 2; if (ret == 0) { @@ -593,7 +593,7 @@ /* convert the sequence into a byte string with the same length as the * nonce */ - ret = I2OSP(context->seq, hpke->Nn, seq_bytes); + ret = I2OSP(context->seq, (int)hpke->Nn, seq_bytes); if (ret == 0) { xorbufout(out, context->base_nonce, seq_bytes, hpke->Nn); } @@ -759,8 +759,8 @@ return BAD_FUNC_ARG; } - receiverPubKeySz = hpke->Npk; - ephemeralPubKeySz = hpke->Npk; + receiverPubKeySz = (word16)hpke->Npk; + ephemeralPubKeySz = (word16)hpke->Npk; #ifdef WOLFSSL_SMALL_STACK dh = (byte*)XMALLOC(hpke->Ndh, hpke->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -785,8 +785,10 @@ #ifdef ECC_TIMING_RESISTANT rng = wc_rng_new(NULL, 0, hpke->heap); - if (rng == NULL) - return RNG_FAILURE_E; + if (rng == NULL) { + ret = RNG_FAILURE_E; + break; + } wc_ecc_set_rng((ecc_key*)ephemeralKey, rng); #endif @@ -990,7 +992,7 @@ return BAD_FUNC_ARG; } - receiverPubKeySz = hpke->Npk; + receiverPubKeySz = (word16)hpke->Npk; #ifdef WOLFSSL_SMALL_STACK dh = (byte*)XMALLOC(hpke->Ndh, hpke->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -1048,7 +1050,7 @@ } if (ephemeralKey != NULL) - wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap); + wc_HpkeFreeKey(hpke, (word16)hpke->kem, ephemeralKey, hpke->heap); if (ret == 0) { /* copy pubKey into kemContext */ @@ -1125,6 +1127,7 @@ return BAD_FUNC_ARG; } + XMEMSET(nonce, 0, sizeof(nonce)); #ifdef WOLFSSL_SMALL_STACK aes_key = (Aes*)XMALLOC(sizeof(Aes), hpke->heap, DYNAMIC_TYPE_AES); if (aes_key == NULL) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -15,6 +15,9 @@ EXTRA_DIST += wolfcrypt/src/asm.c EXTRA_DIST += wolfcrypt/src/aes_asm.asm EXTRA_DIST += wolfcrypt/src/aes_gcm_asm.asm +EXTRA_DIST += wolfcrypt/src/aes_xts_asm.asm +EXTRA_DIST += wolfcrypt/src/chacha_asm.asm +EXTRA_DIST += wolfcrypt/src/poly1305_asm.asm EXTRA_DIST += wolfcrypt/src/wc_dsp.c EXTRA_DIST += wolfcrypt/src/sp_dsp32.c EXTRA_DIST += wolfcrypt/src/sp_x86_64_asm.asm @@ -52,7 +55,7 @@ wolfcrypt/src/fp_sqr_comba_8.i \ wolfcrypt/src/fp_sqr_comba_9.i \ wolfcrypt/src/fp_sqr_comba_small_set.i \ - wolfcrypt/src/fe_x25519_128.i + wolfcrypt/src/fe_x25519_128.h EXTRA_DIST += wolfcrypt/src/port/ti/ti-aes.c \ wolfcrypt/src/port/ti/ti-des3.c \ @@ -63,6 +66,8 @@ wolfcrypt/src/port/arm/armv8-aes.c \ wolfcrypt/src/port/arm/armv8-sha256.c \ wolfcrypt/src/port/arm/armv8-chacha.c \ + wolfcrypt/src/port/aria/aria-crypt.c \ + wolfcrypt/src/port/aria/aria-cryptocb.c \ wolfcrypt/src/port/nxp/ksdk_port.c \ wolfcrypt/src/port/nxp/dcp_port.c \ wolfcrypt/src/port/nxp/se050_port.c \ @@ -115,21 +120,26 @@ wolfcrypt/src/port/Espressif/esp32_sha.c \ wolfcrypt/src/port/Espressif/esp32_util.c \ wolfcrypt/src/port/Espressif/esp32_mp.c \ + wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.c \ + wolfcrypt/src/port/Espressif/esp_sdk_time_lib.c \ + wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.c \ wolfcrypt/src/port/Espressif/README.md \ wolfcrypt/src/port/arm/cryptoCell.c \ wolfcrypt/src/port/arm/cryptoCellHash.c \ wolfcrypt/src/port/Renesas/renesas_tsip_aes.c \ wolfcrypt/src/port/Renesas/renesas_tsip_sha.c \ + wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c \ wolfcrypt/src/port/Renesas/renesas_tsip_util.c \ - wolfcrypt/src/port/Renesas/renesas_sce_util.c \ - wolfcrypt/src/port/Renesas/renesas_sce_aes.c \ - wolfcrypt/src/port/Renesas/renesas_sce_sha.c \ - wolfcrypt/src/port/Renesas/renesas_sce_rsa.c \ + wolfcrypt/src/port/Renesas/renesas_fspsm_util.c \ + wolfcrypt/src/port/Renesas/renesas_fspsm_aes.c \ + wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c \ + wolfcrypt/src/port/Renesas/renesas_fspsm_rsa.c \ wolfcrypt/src/port/Renesas/renesas_common.c \ wolfcrypt/src/port/Renesas/renesas_rx64_hw_sha.c \ wolfcrypt/src/port/Renesas/renesas_rx64_hw_util.c \ wolfcrypt/src/port/Renesas/README.md \ - wolfcrypt/src/port/cypress/psoc6_crypto.c + wolfcrypt/src/port/cypress/psoc6_crypto.c \ + wolfcrypt/src/port/liboqs/liboqs.c $(ASYNC_FILES): $(AM_V_at)touch $(srcdir)/$@ @@ -210,3 +220,6 @@ src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/maxim/maxq10xx.c endif EXTRA_DIST += wolfcrypt/src/port/maxim/README.md + +include wolfcrypt/src/port/autosar/include.am + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/integer.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/integer.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/integer.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/integer.c 2024-08-03 07:30:00.000000000 +0000 @@ -553,6 +553,15 @@ return MP_OKAY; } +int mp_cond_swap_ct_ex (mp_int * a, mp_int * b, int c, int m, mp_int * t) +{ + (void)c; + (void)t; + if (m == 1) + mp_exch(a, b); + return MP_OKAY; +} + int mp_cond_swap_ct (mp_int * a, mp_int * b, int c, int m) { (void)c; @@ -946,7 +955,7 @@ } #ifdef BN_MP_EXPTMOD_BASE_2 - if (G->used == 1 && G->dp[0] == 2) { + if (G->used == 1 && G->dp[0] == 2 && mp_isodd(P) == MP_YES) { return mp_exptmod_base_2(X, P, Y); } #endif @@ -976,7 +985,7 @@ } #endif - /* if the modulus is odd or dr != 0 use the montgomery method */ + /* if the modulus is odd use the montgomery method, or use other known */ #ifdef BN_MP_EXPTMOD_FAST_C if (mp_isodd (P) == MP_YES || dr != 0) { return mp_exptmod_fast (G, X, P, Y, dr); @@ -1976,7 +1985,6 @@ return 1; } - /* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 * * Uses a left-to-right k-ary sliding window to compute the modular @@ -2104,7 +2112,10 @@ if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { goto LBL_M; } - redux = mp_reduce_2k; + /* mp of zero is not usable */ + if (mp != 0) { + redux = mp_reduce_2k; + } #endif } @@ -3057,47 +3068,83 @@ /* d = a + b (mod c) */ int mp_addmod(mp_int* a, mp_int* b, mp_int* c, mp_int* d) { - int res; - mp_int t; + int res; + mp_int t; - if ((res = mp_init (&t)) != MP_OKAY) { - return res; - } + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } - res = mp_add (a, b, &t); - if (res == MP_OKAY) { - res = mp_mod (&t, c, d); - } + res = mp_add (a, b, &t); + if (res == MP_OKAY) { + res = mp_mod (&t, c, d); + } - mp_clear (&t); + mp_clear (&t); - return res; + return res; } /* d = a - b (mod c) - a < c and b < c and positive */ int mp_submod_ct(mp_int* a, mp_int* b, mp_int* c, mp_int* d) { - int res; + int res; + mp_int t; + mp_int* r = d; + + if (c == d) { + r = &t; - res = mp_sub(a, b, d); - if (res == MP_OKAY && mp_isneg(d)) { - res = mp_add(d, c, d); + if ((res = mp_init (r)) != MP_OKAY) { + return res; } + } - return res; + res = mp_sub (a, b, r); + if (res == MP_OKAY) { + if (mp_isneg (r)) { + res = mp_add (r, c, d); + } else if (c == d) { + res = mp_copy (r, d); + } + } + + if (c == d) { + mp_clear (r); + } + + return res; } /* d = a + b (mod c) - a < c and b < c and positive */ int mp_addmod_ct(mp_int* a, mp_int* b, mp_int* c, mp_int* d) { - int res; + int res; + mp_int t; + mp_int* r = d; + + if (c == d) { + r = &t; - res = mp_add(a, b, d); - if (res == MP_OKAY && mp_cmp(d, c) != MP_LT) { - res = mp_sub(d, c, d); + if ((res = mp_init (r)) != MP_OKAY) { + return res; } + } - return res; + res = mp_add (a, b, r); + if (res == MP_OKAY) { + if (mp_cmp (r, c) != MP_LT) { + res = mp_sub (r, c, d); + } else if (c == d) { + res = mp_copy (r, d); + } + } + + if (c == d) { + mp_clear (r); + } + + return res; } /* computes b = a*a */ @@ -3314,7 +3361,7 @@ } -/* the jist of squaring... +/* the list of squaring... * you do like mult except the offset of the tmpx [one that * starts closer to zero] can't equal the offset of tmpy. * So basically you set up iy like before then you min it with @@ -4378,9 +4425,6 @@ /* old number of used digits in c */ oldused = c->used; - /* sign always positive */ - c->sign = MP_ZPOS; - /* source alias */ tmpa = a->dp; @@ -4431,6 +4475,9 @@ ix = 1; } + /* sign always positive */ + c->sign = MP_ZPOS; + /* now zero to oldused */ while (ix++ < oldused) { *tmpc++ = 0; @@ -5311,6 +5358,9 @@ ++str; } + /* Skip whitespace at end of str */ + while (CharIsWhiteSpace(*str)) + ++str; /* if digit in isn't null term, then invalid character was found */ if (*str != '\0') { mp_zero (a); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/kdf.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/kdf.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/kdf.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/kdf.c 2024-08-03 07:30:00.000000000 +0000 @@ -30,15 +30,13 @@ #ifndef NO_KDF -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 5) - +#if FIPS_VERSION3_GE(5,0,0) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$m") - #pragma const_seg(".fipsB$m") + #pragma code_seg(".fipsA$h") + #pragma const_seg(".fipsB$h") #endif #endif @@ -52,7 +50,18 @@ #include #include +#ifdef WC_SRTP_KDF +#include +#endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_kdf_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000009 }; + int wolfCrypt_FIPS_KDF_sanity(void) + { + return 0; + } +#endif #if defined(WOLFSSL_HAVE_PRF) && !defined(NO_HMAC) @@ -113,6 +122,13 @@ break; #endif + #ifdef WOLFSSL_SM3 + case sm3_mac: + hash = WC_SM3; + len = WC_SM3_DIGEST_SIZE; + break; + #endif + #ifndef NO_SHA case sha_mac: hash = WC_SHA; @@ -129,7 +145,7 @@ if (lastLen) times += 1; - /* times == 0 iif resLen == 0, but times == 0 abides clang static analyzer + /* times == 0 if resLen == 0, but times == 0 abides clang static analyzer while resLen == 0 doesn't */ if (times == 0) return BAD_FUNC_ARG; @@ -290,6 +306,16 @@ { int ret = 0; +#ifdef WOLFSSL_DEBUG_TLS + WOLFSSL_MSG(" secret"); + WOLFSSL_BUFFER(secret, secLen); + WOLFSSL_MSG(" label"); + WOLFSSL_BUFFER(label, labLen); + WOLFSSL_MSG(" seed"); + WOLFSSL_BUFFER(seed, seedLen); +#endif + + if (useAtLeastSha256) { #ifdef WOLFSSL_SMALL_STACK byte* labelSeed; @@ -334,6 +360,12 @@ #endif } +#ifdef WOLFSSL_DEBUG_TLS + WOLFSSL_MSG(" digest"); + WOLFSSL_BUFFER(digest, digLen); + WOLFSSL_MSG_EX("hash_type %d", hash_type); +#endif + return ret; } #endif /* WOLFSSL_HAVE_PRF && !NO_HMAC */ @@ -343,17 +375,9 @@ /* Extract data using HMAC, salt and input. * RFC 5869 - HMAC-based Extract-and-Expand Key Derivation Function (HKDF) - * - * prk The generated pseudorandom key. - * salt The salt. - * saltLen The length of the salt. - * ikm The input keying material. - * ikmLen The length of the input keying material. - * digest The type of digest to use. - * returns 0 on success, otherwise failure. */ - int wc_Tls13_HKDF_Extract(byte* prk, const byte* salt, word32 saltLen, - byte* ikm, word32 ikmLen, int digest) + int wc_Tls13_HKDF_Extract_ex(byte* prk, const byte* salt, word32 saltLen, + byte* ikm, word32 ikmLen, int digest, void* heap, int devId) { int ret; word32 len = 0; @@ -376,6 +400,13 @@ len = WC_SHA512_DIGEST_SIZE; break; #endif + + #ifdef WOLFSSL_SM3 + case WC_SM3: + len = WC_SM3_DIGEST_SIZE; + break; + #endif + default: return BAD_FUNC_ARG; } @@ -393,7 +424,15 @@ WOLFSSL_BUFFER(ikm, ikmLen); #endif +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + ret = wc_HKDF_Extract_ex(digest, salt, saltLen, ikm, ikmLen, prk, heap, + devId); +#else ret = wc_HKDF_Extract(digest, salt, saltLen, ikm, ikmLen, prk); + (void)heap; + (void)devId; +#endif #ifdef WOLFSSL_DEBUG_TLS WOLFSSL_MSG(" PRK"); @@ -403,27 +442,21 @@ return ret; } + int wc_Tls13_HKDF_Extract(byte* prk, const byte* salt, word32 saltLen, + byte* ikm, word32 ikmLen, int digest) + { + return wc_Tls13_HKDF_Extract_ex(prk, salt, saltLen, ikm, ikmLen, digest, + NULL, INVALID_DEVID); + } + /* Expand data using HMAC, salt and label and info. - * TLS v1.3 defines this function. - * - * okm The generated pseudorandom key - output key material. - * okmLen The length of generated pseudorandom key - - * output key material. - * prk The salt - pseudo-random key. - * prkLen The length of the salt - pseudo-random key. - * protocol The TLS protocol label. - * protocolLen The length of the TLS protocol label. - * info The information to expand. - * infoLen The length of the information. - * digest The type of digest to use. - * returns 0 on success, otherwise failure. - */ - int wc_Tls13_HKDF_Expand_Label(byte* okm, word32 okmLen, + * TLS v1.3 defines this function. */ + int wc_Tls13_HKDF_Expand_Label_ex(byte* okm, word32 okmLen, const byte* prk, word32 prkLen, const byte* protocol, word32 protocolLen, const byte* label, word32 labelLen, const byte* info, word32 infoLen, - int digest) + int digest, void* heap, int devId) { int ret = 0; word32 idx = 0; @@ -453,17 +486,23 @@ data[idx++] = (byte)okmLen; /* Length of protocol | label. */ data[idx++] = (byte)(protocolLen + labelLen); - /* Protocol */ - XMEMCPY(&data[idx], protocol, protocolLen); - idx += protocolLen; - /* Label */ - XMEMCPY(&data[idx], label, labelLen); - idx += labelLen; + if (protocolLen > 0) { + /* Protocol */ + XMEMCPY(&data[idx], protocol, protocolLen); + idx += protocolLen; + } + if (labelLen > 0) { + /* Label */ + XMEMCPY(&data[idx], label, labelLen); + idx += labelLen; + } /* Length of hash of messages */ data[idx++] = (byte)infoLen; - /* Hash of messages */ - XMEMCPY(&data[idx], info, infoLen); - idx += infoLen; + if (infoLen > 0) { + /* Hash of messages */ + XMEMCPY(&data[idx], info, infoLen); + idx += infoLen; + } #ifdef WOLFSSL_CHECK_MEM_ZERO wc_MemZero_Add("wc_Tls13_HKDF_Expand_Label data", data, idx); @@ -477,7 +516,15 @@ WOLFSSL_MSG_EX(" Digest %d", digest); #endif +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \ + (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) + ret = wc_HKDF_Expand_ex(digest, prk, prkLen, data, idx, okm, okmLen, + heap, devId); +#else ret = wc_HKDF_Expand(digest, prk, prkLen, data, idx, okm, okmLen); + (void)heap; + (void)devId; +#endif #ifdef WOLFSSL_DEBUG_TLS WOLFSSL_MSG(" OKM"); @@ -495,41 +542,36 @@ return ret; } + int wc_Tls13_HKDF_Expand_Label(byte* okm, word32 okmLen, + const byte* prk, word32 prkLen, + const byte* protocol, word32 protocolLen, + const byte* label, word32 labelLen, + const byte* info, word32 infoLen, + int digest) + { + return wc_Tls13_HKDF_Expand_Label_ex(okm, okmLen, prk, prkLen, protocol, + protocolLen, label, labelLen, info, infoLen, digest, + NULL, INVALID_DEVID); + } + #if defined(WOLFSSL_TICKET_NONCE_MALLOC) && \ (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3))) /* Expand data using HMAC, salt and label and info. - * TLS v1.3 defines this function. - * - * okm The generated pseudorandom key - output key material. - * okmLen The length of generated pseudorandom key - - * output key material. - * prk The salt - pseudo-random key. - * prkLen The length of the salt - pseudo-random key. - * protocol The TLS protocol label. - * protocolLen The length of the TLS protocol label. - * info The information to expand. - * infoLen The length of the information. - * digest The type of digest to use. - * - * This functions is very similar to wc_Tls13_HKDF_Expand_Label() but it - * allocate memory if the stack space usually used isn't enough. - * - * returns 0 on success, otherwise failure. - */ + * TLS v1.3 defines this function. */ int wc_Tls13_HKDF_Expand_Label_Alloc(byte* okm, word32 okmLen, const byte* prk, word32 prkLen, const byte* protocol, word32 protocolLen, const byte* label, word32 labelLen, const byte* info, word32 infoLen, int digest, void* heap) { int ret = 0; - int idx = 0; - int len; + word32 idx = 0; + size_t len; byte *data; (void)heap; /* okmLen (2) + protocol|label len (1) + info len(1) + protocollen + * labellen + infolen */ - len = 4 + protocolLen + labelLen + infoLen; + len = 4U + protocolLen + labelLen + infoLen; data = (byte*)XMALLOC(len, heap, DYNAMIC_TYPE_TMP_BUFFER); if (data == NULL) @@ -617,7 +659,7 @@ static int _HashInit(byte hashId, _hash* hash) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (hashId) { #ifndef NO_SHA @@ -642,6 +684,9 @@ ret = wc_InitSha512(&hash->sha512); break; #endif /* WOLFSSL_SHA512 */ + default: + ret = BAD_FUNC_ARG; + break; } return ret; @@ -651,7 +696,7 @@ int _HashUpdate(byte hashId, _hash* hash, const byte* data, word32 dataSz) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (hashId) { #ifndef NO_SHA @@ -676,6 +721,9 @@ ret = wc_Sha512Update(&hash->sha512, data, dataSz); break; #endif /* WOLFSSL_SHA512 */ + default: + ret = BAD_FUNC_ARG; + break; } return ret; @@ -684,7 +732,7 @@ static int _HashFinal(byte hashId, _hash* hash, byte* digest) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (hashId) { #ifndef NO_SHA @@ -709,6 +757,9 @@ ret = wc_Sha512Final(&hash->sha512, digest); break; #endif /* WOLFSSL_SHA512 */ + default: + ret = BAD_FUNC_ARG; + break; } return ret; @@ -856,4 +907,595 @@ #endif /* WOLFSSL_WOLFSSH */ +#ifdef WC_SRTP_KDF +/* Calculate first block to encrypt. + * + * @param [in] salt Random value to XOR in. + * @param [in] saltSz Size of random value in bytes. + * @param [in] kdrIdx Key derivation rate. kdr = 0 when -1, otherwise + * kdr = 2^kdrIdx. + * @param [in] index Index value to XOR in. + * @param [in] indexSz Size of index value in bytes. + * @param [out] block First block to encrypt. + */ +static void wc_srtp_kdf_first_block(const byte* salt, word32 saltSz, int kdrIdx, + const byte* index, int indexSz, unsigned char* block) +{ + int i; + + /* XOR salt into zeroized buffer. */ + for (i = 0; i < WC_SRTP_MAX_SALT - (int)saltSz; i++) { + block[i] = 0; + } + XMEMCPY(block + WC_SRTP_MAX_SALT - saltSz, salt, saltSz); + block[WC_SRTP_MAX_SALT] = 0; + /* block[15] is counter. */ + + /* When kdrIdx is -1, don't XOR in index. */ + if (kdrIdx >= 0) { + /* Get the number of bits to shift index by. */ + word32 bits = kdrIdx & 0x7; + /* Reduce index size by number of bytes to remove. */ + indexSz -= kdrIdx >> 3; + + if ((kdrIdx & 0x7) == 0) { + /* Just XOR in as no bit shifting. */ + for (i = 0; i < indexSz; i++) { + block[i + WC_SRTP_MAX_SALT - indexSz] ^= index[i]; + } + } + else { + /* XOR in as bit shifted index. */ + block[WC_SRTP_MAX_SALT - indexSz] ^= index[0] >> bits; + for (i = 1; i < indexSz; i++) { + block[i + WC_SRTP_MAX_SALT - indexSz] ^= + (index[i-1] << (8 - bits)) | + (index[i+0] >> bits ); + } + } + } +} + +/* Derive a key given the first block. + * + * @param [in, out] block First block to encrypt. Need label XORed in. + * @param [in] indexSz Size of index in bytes to calculate where label is + * XORed into. + * @param [in] label Label byte that differs for each key. + * @param [out] key Derived key. + * @param [in] keySz Size of key to derive in bytes. + * @param [in] aes AES object to encrypt with. + * @return 0 on success. + */ +static int wc_srtp_kdf_derive_key(byte* block, int indexSz, byte label, + byte* key, word32 keySz, Aes* aes) +{ + int i; + int ret = 0; + /* Calculate the number of full blocks needed for derived key. */ + int blocks = (int)(keySz / AES_BLOCK_SIZE); + + /* XOR in label. */ + block[WC_SRTP_MAX_SALT - indexSz - 1] ^= label; + for (i = 0; (ret == 0) && (i < blocks); i++) { + /* Set counter. */ + block[15] = (byte)i; + /* Encrypt block into key buffer. */ + ret = wc_AesEcbEncrypt(aes, key, block, AES_BLOCK_SIZE); + /* Reposition for more derived key. */ + key += AES_BLOCK_SIZE; + /* Reduce the count of key bytes required. */ + keySz -= AES_BLOCK_SIZE; + } + /* Do any partial blocks. */ + if ((ret == 0) && (keySz > 0)) { + byte enc[AES_BLOCK_SIZE]; + /* Set counter. */ + block[15] = (byte)i; + /* Encrypt block into temporary. */ + ret = wc_AesEcbEncrypt(aes, enc, block, AES_BLOCK_SIZE); + if (ret == 0) { + /* Copy into key required amount. */ + XMEMCPY(key, enc, keySz); + } + } + /* XOR out label. */ + block[WC_SRTP_MAX_SALT - indexSz - 1] ^= label; + + return ret; +} + +/* Derive keys using SRTP KDF algorithm. + * + * SP 800-135 (RFC 3711). + * + * @param [in] key Key to use with encryption. + * @param [in] keySz Size of key in bytes. + * @param [in] salt Random non-secret value. + * @param [in] saltSz Size of random in bytes. + * @param [in] kdrIdx Key derivation rate. kdr = 0 when -1, otherwise + * kdr = 2^kdrIdx. + * @param [in] index Index value to XOR in. + * @param [out] key1 First key. Label value of 0x00. + * @param [in] key1Sz Size of first key in bytes. + * @param [out] key2 Second key. Label value of 0x01. + * @param [in] key2Sz Size of second key in bytes. + * @param [out] key3 Third key. Label value of 0x02. + * @param [in] key3Sz Size of third key in bytes. + * @return BAD_FUNC_ARG when key or salt is NULL. + * @return BAD_FUNC_ARG when key length is not 16, 24 or 32. + * @return BAD_FUNC_ARG when saltSz is larger than 14. + * @return BAD_FUNC_ARG when kdrIdx is less than -1 or larger than 24. + * @return MEMORY_E on dynamic memory allocation failure. + * @return 0 on success. + */ +int wc_SRTP_KDF(const byte* key, word32 keySz, const byte* salt, word32 saltSz, + int kdrIdx, const byte* index, byte* key1, word32 key1Sz, byte* key2, + word32 key2Sz, byte* key3, word32 key3Sz) +{ + int ret = 0; + byte block[AES_BLOCK_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + Aes* aes = NULL; +#else + Aes aes[1]; +#endif + int aes_inited = 0; + + /* Validate parameters. */ + if ((key == NULL) || (keySz > AES_256_KEY_SIZE) || (salt == NULL) || + (saltSz > WC_SRTP_MAX_SALT) || (kdrIdx < -1) || (kdrIdx > 24)) { + ret = BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if (ret == 0) { + aes = (Aes*)XMALLOC(sizeof(Aes), NULL, DYNAMIC_TYPE_CIPHER); + if (aes == NULL) { + ret = MEMORY_E; + } + } + if (aes != NULL) +#endif + { + XMEMSET(aes, 0, sizeof(Aes)); + } + + /* Setup AES object. */ + if (ret == 0) { + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + } + if (ret == 0) { + aes_inited = 1; + ret = wc_AesSetKey(aes, key, keySz, NULL, AES_ENCRYPTION); + } + + /* Calculate first block that can be used in each derivation. */ + if (ret == 0) { + wc_srtp_kdf_first_block(salt, saltSz, kdrIdx, index, WC_SRTP_INDEX_LEN, + block); + } + + /* Calculate first key if required. */ + if ((ret == 0) && (key1 != NULL)) { + ret = wc_srtp_kdf_derive_key(block, WC_SRTP_INDEX_LEN, + WC_SRTP_LABEL_ENCRYPTION, key1, key1Sz, aes); + } + /* Calculate second key if required. */ + if ((ret == 0) && (key2 != NULL)) { + ret = wc_srtp_kdf_derive_key(block, WC_SRTP_INDEX_LEN, + WC_SRTP_LABEL_MSG_AUTH, key2, key2Sz, aes); + } + /* Calculate third key if required. */ + if ((ret == 0) && (key3 != NULL)) { + ret = wc_srtp_kdf_derive_key(block, WC_SRTP_INDEX_LEN, + WC_SRTP_LABEL_SALT, key3, key3Sz, aes); + } + + if (aes_inited) + wc_AesFree(aes); +#ifdef WOLFSSL_SMALL_STACK + XFREE(aes, NULL, DYNAMIC_TYPE_CIPHER); +#endif + return ret; +} + +/* Derive keys using SRTCP KDF algorithm. + * + * SP 800-135 (RFC 3711). + * + * @param [in] key Key to use with encryption. + * @param [in] keySz Size of key in bytes. + * @param [in] salt Random non-secret value. + * @param [in] saltSz Size of random in bytes. + * @param [in] kdrIdx Key derivation rate index. kdr = 0 when -1, otherwise + * kdr = 2^kdrIdx. See wc_SRTP_KDF_kdr_to_idx() + * @param [in] index Index value to XOR in. + * @param [out] key1 First key. Label value of 0x03. + * @param [in] key1Sz Size of first key in bytes. + * @param [out] key2 Second key. Label value of 0x04. + * @param [in] key2Sz Size of second key in bytes. + * @param [out] key3 Third key. Label value of 0x05. + * @param [in] key3Sz Size of third key in bytes. + * @return BAD_FUNC_ARG when key or salt is NULL. + * @return BAD_FUNC_ARG when key length is not 16, 24 or 32. + * @return BAD_FUNC_ARG when saltSz is larger than 14. + * @return BAD_FUNC_ARG when kdrIdx is less than -1 or larger than 24. + * @return MEMORY_E on dynamic memory allocation failure. + * @return 0 on success. + */ +int wc_SRTCP_KDF_ex(const byte* key, word32 keySz, const byte* salt, word32 saltSz, + int kdrIdx, const byte* index, byte* key1, word32 key1Sz, byte* key2, + word32 key2Sz, byte* key3, word32 key3Sz, int idxLenIndicator) +{ + int ret = 0; + byte block[AES_BLOCK_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + Aes* aes = NULL; +#else + Aes aes[1]; +#endif + int aes_inited = 0; + int idxLen; + + if (idxLenIndicator == WC_SRTCP_32BIT_IDX) { + idxLen = WC_SRTCP_INDEX_LEN; + } else if (idxLenIndicator == WC_SRTCP_48BIT_IDX) { + idxLen = WC_SRTP_INDEX_LEN; + } else { + return BAD_FUNC_ARG; /* bad or invalid idxLenIndicator */ + } + + /* Validate parameters. */ + if ((key == NULL) || (keySz > AES_256_KEY_SIZE) || (salt == NULL) || + (saltSz > WC_SRTP_MAX_SALT) || (kdrIdx < -1) || (kdrIdx > 24)) { + ret = BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if (ret == 0) { + aes = (Aes*)XMALLOC(sizeof(Aes), NULL, DYNAMIC_TYPE_CIPHER); + if (aes == NULL) { + ret = MEMORY_E; + } + } + if (aes != NULL) +#endif + { + XMEMSET(aes, 0, sizeof(Aes)); + } + + /* Setup AES object. */ + if (ret == 0) { + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + } + if (ret == 0) { + aes_inited = 1; + ret = wc_AesSetKey(aes, key, keySz, NULL, AES_ENCRYPTION); + } + + /* Calculate first block that can be used in each derivation. */ + if (ret == 0) { + wc_srtp_kdf_first_block(salt, saltSz, kdrIdx, index, idxLen, block); + } + + /* Calculate first key if required. */ + if ((ret == 0) && (key1 != NULL)) { + ret = wc_srtp_kdf_derive_key(block, idxLen, + WC_SRTCP_LABEL_ENCRYPTION, key1, key1Sz, aes); + } + /* Calculate second key if required. */ + if ((ret == 0) && (key2 != NULL)) { + ret = wc_srtp_kdf_derive_key(block, idxLen, + WC_SRTCP_LABEL_MSG_AUTH, key2, key2Sz, aes); + } + /* Calculate third key if required. */ + if ((ret == 0) && (key3 != NULL)) { + ret = wc_srtp_kdf_derive_key(block, idxLen, + WC_SRTCP_LABEL_SALT, key3, key3Sz, aes); + } + + if (aes_inited) + wc_AesFree(aes); +#ifdef WOLFSSL_SMALL_STACK + XFREE(aes, NULL, DYNAMIC_TYPE_CIPHER); +#endif + return ret; +} + +int wc_SRTCP_KDF(const byte* key, word32 keySz, const byte* salt, word32 saltSz, + int kdrIdx, const byte* index, byte* key1, word32 key1Sz, byte* key2, + word32 key2Sz, byte* key3, word32 key3Sz) +{ + /* The default 32-bit IDX expected by many implementations */ + return wc_SRTCP_KDF_ex(key, keySz, salt, saltSz, kdrIdx, index, + key1, key1Sz, key2, key2Sz, key3, key3Sz, + WC_SRTCP_32BIT_IDX); +} +/* Derive key with label using SRTP KDF algorithm. + * + * SP 800-135 (RFC 3711). + * + * @param [in] key Key to use with encryption. + * @param [in] keySz Size of key in bytes. + * @param [in] salt Random non-secret value. + * @param [in] saltSz Size of random in bytes. + * @param [in] kdrIdx Key derivation rate index. kdr = 0 when -1, otherwise + * kdr = 2^kdrIdx. See wc_SRTP_KDF_kdr_to_idx() + * @param [in] index Index value to XOR in. + * @param [in] label Label to use when deriving key. + * @param [out] outKey Derived key. + * @param [in] outKeySz Size of derived key in bytes. + * @return BAD_FUNC_ARG when key, salt or outKey is NULL. + * @return BAD_FUNC_ARG when key length is not 16, 24 or 32. + * @return BAD_FUNC_ARG when saltSz is larger than 14. + * @return BAD_FUNC_ARG when kdrIdx is less than -1 or larger than 24. + * @return MEMORY_E on dynamic memory allocation failure. + * @return 0 on success. + */ +int wc_SRTP_KDF_label(const byte* key, word32 keySz, const byte* salt, + word32 saltSz, int kdrIdx, const byte* index, byte label, byte* outKey, + word32 outKeySz) +{ + int ret = 0; + byte block[AES_BLOCK_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + Aes* aes = NULL; +#else + Aes aes[1]; +#endif + int aes_inited = 0; + + /* Validate parameters. */ + if ((key == NULL) || (keySz > AES_256_KEY_SIZE) || (salt == NULL) || + (saltSz > WC_SRTP_MAX_SALT) || (kdrIdx < -1) || (kdrIdx > 24) || + (outKey == NULL)) { + ret = BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if (ret == 0) { + aes = (Aes*)XMALLOC(sizeof(Aes), NULL, DYNAMIC_TYPE_CIPHER); + if (aes == NULL) { + ret = MEMORY_E; + } + } + if (aes != NULL) +#endif + { + XMEMSET(aes, 0, sizeof(Aes)); + } + + /* Setup AES object. */ + if (ret == 0) { + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + } + if (ret == 0) { + aes_inited = 1; + ret = wc_AesSetKey(aes, key, keySz, NULL, AES_ENCRYPTION); + } + + /* Calculate first block that can be used in each derivation. */ + if (ret == 0) { + wc_srtp_kdf_first_block(salt, saltSz, kdrIdx, index, WC_SRTP_INDEX_LEN, + block); + } + if (ret == 0) { + /* Calculate key. */ + ret = wc_srtp_kdf_derive_key(block, WC_SRTP_INDEX_LEN, label, outKey, + outKeySz, aes); + } + + if (aes_inited) + wc_AesFree(aes); +#ifdef WOLFSSL_SMALL_STACK + XFREE(aes, NULL, DYNAMIC_TYPE_CIPHER); +#endif + return ret; + +} + +/* Derive key with label using SRTCP KDF algorithm. + * + * SP 800-135 (RFC 3711). + * + * @param [in] key Key to use with encryption. + * @param [in] keySz Size of key in bytes. + * @param [in] salt Random non-secret value. + * @param [in] saltSz Size of random in bytes. + * @param [in] kdrIdx Key derivation rate index. kdr = 0 when -1, otherwise + * kdr = 2^kdrIdx. See wc_SRTP_KDF_kdr_to_idx() + * @param [in] index Index value to XOR in. + * @param [in] label Label to use when deriving key. + * @param [out] outKey Derived key. + * @param [in] outKeySz Size of derived key in bytes. + * @return BAD_FUNC_ARG when key, salt or outKey is NULL. + * @return BAD_FUNC_ARG when key length is not 16, 24 or 32. + * @return BAD_FUNC_ARG when saltSz is larger than 14. + * @return BAD_FUNC_ARG when kdrIdx is less than -1 or larger than 24. + * @return MEMORY_E on dynamic memory allocation failure. + * @return 0 on success. + */ +int wc_SRTCP_KDF_label(const byte* key, word32 keySz, const byte* salt, + word32 saltSz, int kdrIdx, const byte* index, byte label, byte* outKey, + word32 outKeySz) +{ + int ret = 0; + byte block[AES_BLOCK_SIZE]; +#ifdef WOLFSSL_SMALL_STACK + Aes* aes = NULL; +#else + Aes aes[1]; +#endif + int aes_inited = 0; + + /* Validate parameters. */ + if ((key == NULL) || (keySz > AES_256_KEY_SIZE) || (salt == NULL) || + (saltSz > WC_SRTP_MAX_SALT) || (kdrIdx < -1) || (kdrIdx > 24) || + (outKey == NULL)) { + ret = BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if (ret == 0) { + aes = (Aes*)XMALLOC(sizeof(Aes), NULL, DYNAMIC_TYPE_CIPHER); + if (aes == NULL) { + ret = MEMORY_E; + } + } + if (aes != NULL) +#endif + { + XMEMSET(aes, 0, sizeof(Aes)); + } + + /* Setup AES object. */ + if (ret == 0) { + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + } + if (ret == 0) { + aes_inited = 1; + ret = wc_AesSetKey(aes, key, keySz, NULL, AES_ENCRYPTION); + } + + /* Calculate first block that can be used in each derivation. */ + if (ret == 0) { + wc_srtp_kdf_first_block(salt, saltSz, kdrIdx, index, WC_SRTCP_INDEX_LEN, + block); + } + if (ret == 0) { + /* Calculate key. */ + ret = wc_srtp_kdf_derive_key(block, WC_SRTCP_INDEX_LEN, label, outKey, + outKeySz, aes); + } + + if (aes_inited) + wc_AesFree(aes); +#ifdef WOLFSSL_SMALL_STACK + XFREE(aes, NULL, DYNAMIC_TYPE_CIPHER); +#endif + return ret; + +} + +/* Converts a kdr value to an index to use in SRTP/SRTCP KDF API. + * + * @param [in] kdr Key derivation rate to convert. + * @return Key derivation rate as an index. + */ +int wc_SRTP_KDF_kdr_to_idx(word32 kdr) +{ + int idx = -1; + + /* Keep shifting value down and incrementing index until top bit is gone. */ + while (kdr != 0) { + kdr >>= 1; + idx++; + } + + /* Index of top bit set. */ + return idx; +} +#endif /* WC_SRTP_KDF */ + +#ifdef WC_KDF_NIST_SP_800_56C +static int wc_KDA_KDF_iteration(const byte* z, word32 zSz, word32 counter, + const byte* fixedInfo, word32 fixedInfoSz, enum wc_HashType hashType, + byte* output) +{ + byte counterBuf[4]; + wc_HashAlg hash; + int ret; + + ret = wc_HashInit(&hash, hashType); + if (ret != 0) + return ret; + c32toa(counter, counterBuf); + ret = wc_HashUpdate(&hash, hashType, counterBuf, 4); + if (ret == 0) { + ret = wc_HashUpdate(&hash, hashType, z, zSz); + } + if (ret == 0 && fixedInfoSz > 0) { + ret = wc_HashUpdate(&hash, hashType, fixedInfo, fixedInfoSz); + } + if (ret == 0) { + ret = wc_HashFinal(&hash, hashType, output); + } + wc_HashFree(&hash, hashType); + return ret; +} + +/** + * \brief Performs the single-step key derivation function (KDF) as specified in + * SP800-56C option 1. + * + * \param [in] z The input keying material. + * \param [in] zSz The size of the input keying material. + * \param [in] fixedInfo The fixed information to be included in the KDF. + * \param [in] fixedInfoSz The size of the fixed information. + * \param [in] derivedSecretSz The desired size of the derived secret. + * \param [in] hashType The hash algorithm to be used in the KDF. + * \param [out] output The buffer to store the derived secret. + * \param [in] outputSz The size of the output buffer. + * + * \return 0 if the KDF operation is successful. + * \return BAD_FUNC_ARG if the input parameters are invalid. + * \return negative error code if the KDF operation fails. + */ +int wc_KDA_KDF_onestep(const byte* z, word32 zSz, const byte* fixedInfo, + word32 fixedInfoSz, word32 derivedSecretSz, enum wc_HashType hashType, + byte* output, word32 outputSz) +{ + byte hashTempBuf[WC_MAX_DIGEST_SIZE]; + word32 counter, outIdx; + int hashOutSz; + int ret; + + if (output == NULL || outputSz < derivedSecretSz) + return BAD_FUNC_ARG; + if (z == NULL || zSz == 0 || (fixedInfoSz > 0 && fixedInfo == NULL)) + return BAD_FUNC_ARG; + if (derivedSecretSz == 0) + return BAD_FUNC_ARG; + + hashOutSz = wc_HashGetDigestSize(hashType); + if (hashOutSz == WC_NO_ERR_TRACE(HASH_TYPE_E)) + return BAD_FUNC_ARG; + + /* According to SP800_56C, table 1, the max input size (max_H_inputBits) + * depends on the HASH algo. The smaller value in the table is (2**64-1)/8. + * This is larger than the possible length using word32 integers. */ + + counter = 1; + outIdx = 0; + ret = 0; + + /* According to SP800_56C the number of iterations shall not be greater than + * 2**32-1. This is not possible using word32 integers.*/ + while (outIdx + hashOutSz <= derivedSecretSz) { + ret = wc_KDA_KDF_iteration(z, zSz, counter, fixedInfo, fixedInfoSz, + hashType, output + outIdx); + if (ret != 0) + break; + counter++; + outIdx += hashOutSz; + } + + if (ret == 0 && outIdx < derivedSecretSz) { + ret = wc_KDA_KDF_iteration(z, zSz, counter, fixedInfo, fixedInfoSz, + hashType, hashTempBuf); + if (ret == 0) { + XMEMCPY(output + outIdx, hashTempBuf, derivedSecretSz - outIdx); + } + ForceZero(hashTempBuf, hashOutSz); + } + + if (ret != 0) { + ForceZero(output, derivedSecretSz); + } + + return ret; +} +#endif /* WC_KDF_NIST_SP_800_56C */ + #endif /* NO_KDF */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/logging.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/logging.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/logging.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/logging.c 2024-08-03 07:30:00.000000000 +0000 @@ -126,7 +126,11 @@ /* Set these to default values initially. */ static wolfSSL_Logging_cb log_function = NULL; -static int loggingEnabled = 0; +#ifndef WOLFSSL_LOGGINGENABLED_DEFAULT +#define WOLFSSL_LOGGINGENABLED_DEFAULT 0 +#endif +static int loggingEnabled = WOLFSSL_LOGGINGENABLED_DEFAULT; +THREAD_LS_T const char* log_prefix = NULL; #if defined(WOLFSSL_APACHE_MYNEWT) #include "log/log.h" @@ -135,13 +139,6 @@ #endif /* DEBUG_WOLFSSL */ -#ifdef DEBUG_VECTOR_REGISTER_ACCESS -THREAD_LS_T int wc_svr_count = 0; -THREAD_LS_T const char *wc_svr_last_file = NULL; -THREAD_LS_T int wc_svr_last_line = -1; -#endif - - /* allow this to be set to NULL, so logs can be redirected to default output */ int wolfSSL_SetLoggingCb(wolfSSL_Logging_cb f) { @@ -186,6 +183,15 @@ #endif } +WOLFSSL_API void wolfSSL_SetLoggingPrefix(const char* prefix) +{ +#ifdef DEBUG_WOLFSSL + log_prefix = prefix; +#else + (void)prefix; +#endif +} + #ifdef WOLFSSL_FUNC_TIME /* WARNING: This code is only to be used for debugging performance. * The code is not thread-safe. @@ -231,7 +237,9 @@ #ifdef DEBUG_WOLFSSL -#if defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) +#if defined(ARDUINO) + /* see Arduino wolfssl.h for wolfSSL_Arduino_Serial_Print */ +#elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) /* see wc_port.h for fio.h and nio.h includes */ #elif defined(WOLFSSL_SGX) /* Declare sprintf for ocall */ @@ -271,63 +279,128 @@ #include #endif -static void wolfssl_log(const int logLevel, const char *const logMessage) +static void wolfssl_log(const int logLevel, const char* const file_name, + int line_number, const char* const logMessage) { + (void)file_name; + (void)line_number; if (log_function) log_function(logLevel, logMessage); else { #if defined(WOLFSSL_USER_LOG) WOLFSSL_USER_LOG(logMessage); +#elif defined(ARDUINO) + wolfSSL_Arduino_Serial_Print(logMessage); #elif defined(WOLFSSL_LOG_PRINTF) - printf("%s\n", logMessage); - + if (file_name != NULL) + printf("[%s L %d] %s\n", file_name, line_number, logMessage); + else + printf("%s\n", logMessage); #elif defined(THREADX) && !defined(THREADX_NO_DC_PRINTF) - dc_log_printf("%s\n", logMessage); + if (file_name != NULL) + dc_log_printf("[%s L %d] %s\n", file_name, line_number, logMessage); + else + dc_log_printf("%s\n", logMessage); #elif defined(WOLFSSL_DEOS) - printf("%s\r\n", logMessage); + if (file_name != NULL) + printf("[%s L %d] %s\r\n", file_name, line_number, logMessage); + else + printf("%s\r\n", logMessage); #elif defined(MICRIUM) - BSP_Ser_Printf("%s\r\n", logMessage); + if (file_name != NULL) + BSP_Ser_Printf("[%s L %d] %s\r\n", + file_name, line_number, logMessage); + else + BSP_Ser_Printf("%s\r\n", logMessage); #elif defined(WOLFSSL_MDK_ARM) fflush(stdout) ; - printf("%s\n", logMessage); + if (file_name != NULL) + printf("[%s L %d] %s\n", file_name, line_number, logMessage); + else + printf("%s\n", logMessage); fflush(stdout) ; #elif defined(WOLFSSL_UTASKER) fnDebugMsg((char*)logMessage); fnDebugMsg("\r\n"); #elif defined(MQX_USE_IO_OLD) - fprintf(_mqxio_stderr, "%s\n", logMessage); + if (file_name != NULL) + fprintf(_mqxio_stderr, "[%s L %d] %s\n", + file_name, line_number, logMessage); + else + fprintf(_mqxio_stderr, "%s\n", logMessage); #elif defined(WOLFSSL_APACHE_MYNEWT) - LOG_DEBUG(&mynewt_log, LOG_MODULE_DEFAULT, "%s\n", logMessage); + if (file_name != NULL) + LOG_DEBUG(&mynewt_log, LOG_MODULE_DEFAULT, "[%s L %d] %s\n", + file_name, line_number, logMessage); + else + LOG_DEBUG(&mynewt_log, LOG_MODULE_DEFAULT, "%s\n", logMessage); #elif defined(WOLFSSL_ESPIDF) - ESP_LOGI("wolfssl", "%s", logMessage); + if (file_name != NULL) + ESP_LOGI("wolfssl", "[%s L %d] %s", + file_name, line_number, logMessage); + else + ESP_LOGI("wolfssl", "%s", logMessage); #elif defined(WOLFSSL_ZEPHYR) - printk("%s\n", logMessage); + if (file_name != NULL) + printk("[%s L %d] %s\n", file_name, line_number, logMessage); + else + printk("%s\n", logMessage); #elif defined(WOLFSSL_TELIT_M2MB) - M2M_LOG_INFO("%s\n", logMessage); + if (file_name != NULL) + M2M_LOG_INFO("[%s L %d] %s\n", file_name, line_number, logMessage); + else + M2M_LOG_INFO("%s\n", logMessage); #elif defined(WOLFSSL_ANDROID_DEBUG) - __android_log_print(ANDROID_LOG_VERBOSE, "[wolfSSL]", "%s", logMessage); + if (file_name != NULL) + __android_log_print(ANDROID_LOG_VERBOSE, "[wolfSSL]", "[%s L %d] %s", + file_name, line_number, logMessage); + else + __android_log_print(ANDROID_LOG_VERBOSE, "[wolfSSL]", "%s", + logMessage); #elif defined(WOLFSSL_XILINX) - xil_printf("%s\r\n", logMessage); + if (file_name != NULL) + xil_printf("[%s L %d] %s\r\n", file_name, line_number, logMessage); + else + xil_printf("%s\r\n", logMessage); #elif defined(WOLFSSL_LINUXKM) - printk("%s\n", logMessage); + if (file_name != NULL) + printk("[%s L %d] %s\n", file_name, line_number, logMessage); + else + printk("%s\n", logMessage); #elif defined(WOLFSSL_RENESAS_RA6M4) - myprintf("%s\n", logMessage); + if (file_name != NULL) + myprintf("[%s L %d] %s\n", file_name, line_number, logMessage); + else + myprintf("%s\n", logMessage); #elif defined(STACK_SIZE_CHECKPOINT_MSG) && \ defined(HAVE_STACK_SIZE_VERBOSE) && defined(HAVE_STACK_SIZE_VERBOSE_LOG) STACK_SIZE_CHECKPOINT_MSG(logMessage); #else - fprintf(stderr, "%s\n", logMessage); + if (log_prefix != NULL) { + if (file_name != NULL) + fprintf(stderr, "[%s]: [%s L %d] %s\n", + log_prefix, file_name, line_number, logMessage); + else + fprintf(stderr, "[%s]: %s\n", log_prefix, logMessage); + } else { + if (file_name != NULL) + fprintf(stderr, "[%s L %d] %s\n", + file_name, line_number, logMessage); + else + fprintf(stderr, "%s\n", logMessage); + } #endif } } #ifndef WOLFSSL_DEBUG_ERRORS_ONLY -#if !defined(_WIN32) && defined(XVSNPRINTF) && !defined(NO_WOLFSSL_MSG_EX) +#if defined(XVSNPRINTF) && !defined(NO_WOLFSSL_MSG_EX) #include /* for var args */ #ifndef WOLFSSL_MSG_EX_BUF_SZ #define WOLFSSL_MSG_EX_BUF_SZ 100 #endif +#undef WOLFSSL_MSG_EX /* undo WOLFSSL_DEBUG_CODEPOINTS wrapper */ #ifdef __clang__ /* tell clang argument 1 is format */ __attribute__((__format__ (__printf__, 1, 0))) @@ -342,17 +415,43 @@ written = XVSNPRINTF(msg, sizeof(msg), fmt, args); va_end(args); if (written > 0) - wolfssl_log(INFO_LOG , msg); + wolfssl_log(INFO_LOG, NULL, 0, msg); + } +} + +#ifdef WOLFSSL_DEBUG_CODEPOINTS +void WOLFSSL_MSG_EX2(const char *file, int line, const char* fmt, ...) +{ + if (loggingEnabled) { + char msg[WOLFSSL_MSG_EX_BUF_SZ]; + int written; + va_list args; + va_start(args, fmt); + written = XVSNPRINTF(msg, sizeof(msg), fmt, args); + va_end(args); + if (written > 0) + wolfssl_log(INFO_LOG, file, line, msg); } } #endif +#endif + +#undef WOLFSSL_MSG /* undo WOLFSSL_DEBUG_CODEPOINTS wrapper */ void WOLFSSL_MSG(const char* msg) { if (loggingEnabled) - wolfssl_log(INFO_LOG , msg); + wolfssl_log(INFO_LOG, NULL, 0, msg); } +#ifdef WOLFSSL_DEBUG_CODEPOINTS +void WOLFSSL_MSG2(const char *file, int line, const char* msg) +{ + if (loggingEnabled) + wolfssl_log(INFO_LOG, file, line, msg); +} +#endif + #ifndef LINE_LEN #define LINE_LEN 16 #endif @@ -366,7 +465,7 @@ } if (!buffer) { - wolfssl_log(INFO_LOG, "\tNULL"); + wolfssl_log(INFO_LOG, NULL, 0, "\tNULL"); return; } @@ -396,33 +495,67 @@ } } - wolfssl_log(INFO_LOG, line); + wolfssl_log(INFO_LOG, NULL, 0, line); buffer += LINE_LEN; buflen -= LINE_LEN; } } - +#undef WOLFSSL_ENTER /* undo WOLFSSL_DEBUG_CODEPOINTS wrapper */ void WOLFSSL_ENTER(const char* msg) { if (loggingEnabled) { char buffer[WOLFSSL_MAX_ERROR_SZ]; XSNPRINTF(buffer, sizeof(buffer), "wolfSSL Entering %s", msg); - wolfssl_log(ENTER_LOG , buffer); + wolfssl_log(ENTER_LOG, NULL, 0, buffer); } } +#ifdef WOLFSSL_DEBUG_CODEPOINTS +void WOLFSSL_ENTER2(const char *file, int line, const char* msg) +{ + if (loggingEnabled) { + char buffer[WOLFSSL_MAX_ERROR_SZ]; + XSNPRINTF(buffer, sizeof(buffer), "wolfSSL Entering %s", msg); + wolfssl_log(ENTER_LOG, file, line, buffer); + } +} +#endif +#undef WOLFSSL_LEAVE /* undo WOLFSSL_DEBUG_CODEPOINTS wrapper */ void WOLFSSL_LEAVE(const char* msg, int ret) { if (loggingEnabled) { char buffer[WOLFSSL_MAX_ERROR_SZ]; XSNPRINTF(buffer, sizeof(buffer), "wolfSSL Leaving %s, return %d", msg, ret); - wolfssl_log(LEAVE_LOG , buffer); + wolfssl_log(LEAVE_LOG, NULL, 0, buffer); } } +#ifdef WOLFSSL_DEBUG_CODEPOINTS +void WOLFSSL_LEAVE2(const char *file, int line, const char* msg, int ret) +{ + if (loggingEnabled) { + char buffer[WOLFSSL_MAX_ERROR_SZ]; + XSNPRINTF(buffer, sizeof(buffer), "wolfSSL Leaving %s, return %d", + msg, ret); + wolfssl_log(LEAVE_LOG, file, line, buffer); + } +} +#endif + +#ifdef WOLFSSL_DEBUG_CODEPOINTS + /* restore the wrappers */ + #define WOLFSSL_MSG(msg) WOLFSSL_MSG2(__FILE__, __LINE__, msg) + #define WOLFSSL_ENTER(msg) WOLFSSL_ENTER2(__FILE__, __LINE__, msg) + #define WOLFSSL_LEAVE(msg, ret) WOLFSSL_LEAVE2(__FILE__, __LINE__, msg, ret) + #ifdef XVSNPRINTF + #define WOLFSSL_MSG_EX(fmt, args...) \ + WOLFSSL_MSG_EX2(__FILE__, __LINE__, fmt, ## args) + #endif +#endif + WOLFSSL_API int WOLFSSL_IS_DEBUG_ON(void) { return loggingEnabled; @@ -430,7 +563,7 @@ #endif /* !WOLFSSL_DEBUG_ERRORS_ONLY */ #endif /* DEBUG_WOLFSSL */ -#if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) +#if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) || defined(HAVE_MEMCACHED) #ifdef WOLFSSL_HAVE_ERROR_QUEUE @@ -477,7 +610,7 @@ return (int)((wc_errors.head_idx + wc_errors.count - 1) % ERROR_QUEUE_MAX); } - return (int)((wc_errors.head_idx + relative_idx) % ERROR_QUEUE_MAX); + return (int)((wc_errors.head_idx + (size_t)relative_idx) % ERROR_QUEUE_MAX); } /** @@ -526,13 +659,13 @@ static void set_entry(struct wc_error_entry *entry, int error, const char *file, const char *reason, int line) { - int sz; + size_t sz; XMEMSET(entry, 0, sizeof(struct wc_error_entry)); entry->err = error; entry->line = line; - sz = (int)XSTRLEN(reason); + sz = XSTRLEN(reason); if (sz > WOLFSSL_MAX_ERROR_SZ - 1) { sz = WOLFSSL_MAX_ERROR_SZ - 1; } @@ -541,7 +674,7 @@ entry->reason[WOLFSSL_MAX_ERROR_SZ - 1] = '\0'; } - sz = (int)XSTRLEN(file); + sz = XSTRLEN(file); if (sz > WOLFSSL_MAX_ERROR_SZ - 1) { sz = WOLFSSL_MAX_ERROR_SZ - 1; } @@ -628,7 +761,7 @@ if (abs_idx >= (int)wc_errors.head_idx) { /* removed entry sits "above" head (or is head), * move entries below it "up" */ - move_count = (abs_idx - (int)wc_errors.head_idx); + move_count = (size_t)abs_idx - wc_errors.head_idx; if (move_count > 0) { XMEMMOVE(&wc_errors.entries[wc_errors.head_idx + 1], &wc_errors.entries[wc_errors.head_idx], @@ -642,7 +775,7 @@ * move entries above it "down" */ int last_idx = get_abs_idx(-1); if (last_idx >= abs_idx) { /* this SHOULD always be true */ - move_count = (last_idx - abs_idx); + move_count = (size_t)(last_idx - abs_idx); if (move_count > 0) { XMEMMOVE(&wc_errors.entries[abs_idx], &wc_errors.entries[abs_idx + 1], @@ -705,7 +838,7 @@ while (1) { int ret = wc_PeekErrorNode(0, file, NULL, line); - if (ret == BAD_STATE_E) { + if (ret == WC_NO_ERR_TRACE(BAD_STATE_E)) { WOLFSSL_MSG("Issue peeking at error node in queue"); return 0; } @@ -725,7 +858,7 @@ /** * Get the error value at the HEAD of the ERR queue or 0 if the queue - * is emtpy. The HEAD entry is removed by this call. + * is empty. The HEAD entry is removed by this call. */ unsigned long wc_GetErrorNodeErr(void) { @@ -735,7 +868,7 @@ ret = wc_PullErrorNode(NULL, NULL, NULL); if (ret < 0) { - if (ret == BAD_STATE_E) { + if (ret == WC_NO_ERR_TRACE(BAD_STATE_E)) { ret = 0; /* no errors in queue */ } else { @@ -746,7 +879,7 @@ wc_ClearErrorNodes(); } } - return ret; + return (unsigned long)ret; } #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) @@ -812,7 +945,7 @@ static void* wc_error_heap; /* mutex for list operation protection */ -static wolfSSL_Mutex wc_error_mutex; +static wolfSSL_Mutex wc_error_mutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(wc_error_mutex); #define ERRQ_MUTEX_INIT() wc_InitMutex(&wc_error_mutex) #define ERRQ_MUTEX_FREE() wc_FreeMutex(&wc_error_mutex) #define ERRQ_LOCK() wc_LockMutex(&wc_error_mutex) @@ -821,10 +954,12 @@ /* Internal function that is called by wolfCrypt_Init() */ int wc_LoggingInit(void) { +#ifndef WOLFSSL_MUTEX_INITIALIZER if (ERRQ_MUTEX_INIT() != 0) { WOLFSSL_MSG("Bad Init Mutex"); return BAD_MUTEX_E; } +#endif wc_errors_count = 0; wc_errors = NULL; wc_current_node = NULL; @@ -839,10 +974,12 @@ /* clear logging entries */ wc_ClearErrorNodes(); /* free mutex */ +#ifndef WOLFSSL_MUTEX_INITIALIZER if (ERRQ_MUTEX_FREE() != 0) { WOLFSSL_MSG("Bad Mutex free"); return BAD_MUTEX_E; } +#endif return 0; } @@ -1217,7 +1354,9 @@ idx = getErrorNodeCurrentIdx(); while (1) { int ret = peekErrorNode(idx, file, NULL, line); - if (ret == BAD_MUTEX_E || ret == BAD_FUNC_ARG || ret == BAD_STATE_E) { + if (ret == WC_NO_ERR_TRACE(BAD_MUTEX_E) || + ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG) || + ret == WC_NO_ERR_TRACE(BAD_STATE_E)) { ERRQ_UNLOCK(); WOLFSSL_MSG("Issue peeking at error node in queue"); return 0; @@ -1250,7 +1389,7 @@ ret = pullErrorNode(NULL, NULL, NULL); if (ret < 0) { - if (ret == BAD_STATE_E) { + if (ret == WC_NO_ERR_TRACE(BAD_STATE_E)) { ret = 0; /* no errors in queue */ } else { @@ -1450,7 +1589,8 @@ #endif /* !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) */ -#endif /* defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) */ +#endif /* defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) + || defined(HAVE_MEMCACHED) */ /* * When using OPENSSL_EXTRA or DEBUG_WOLFSSL_VERBOSE macro then WOLFSSL_ERROR is @@ -1469,7 +1609,7 @@ #endif { #ifdef WOLFSSL_ASYNC_CRYPT - if (error != WC_PENDING_E) + if (error != WC_NO_ERR_TRACE(WC_PENDING_E)) #endif { char buffer[WOLFSSL_MAX_ERROR_SZ]; @@ -1487,7 +1627,8 @@ #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) /* If running in compatibility mode do not add want read and want right to error queue */ - if (error != WANT_READ && error != WANT_WRITE) { + if (error != WC_NO_ERR_TRACE(WANT_READ) && + error != WC_NO_ERR_TRACE(WANT_WRITE)) { #endif if (error < 0) error = error - (2 * error); /* get absolute value */ @@ -1495,7 +1636,7 @@ "wolfSSL error occurred, error = %d line:%u file:%s", error, line, file); - if (wc_AddErrorNode(error, line, buffer, (char*)file) != 0) { + if (wc_AddErrorNode(error, (int)line, buffer, (char*)file) != 0) { WOLFSSL_MSG("Error creating logging node"); /* with void function there is no return here, continue on * to unlock mutex and log what buffer was created. */ @@ -1517,7 +1658,7 @@ #ifdef DEBUG_WOLFSSL if (loggingEnabled) - wolfssl_log(ERROR_LOG , buffer); + wolfssl_log(ERROR_LOG, NULL, 0, buffer); #endif } } @@ -1526,11 +1667,10 @@ { #ifdef DEBUG_WOLFSSL if (loggingEnabled) - wolfssl_log(ERROR_LOG , msg); + wolfssl_log(ERROR_LOG, NULL, 0, msg); #else (void)msg; #endif } #endif /* DEBUG_WOLFSSL || WOLFSSL_NGINX || WOLFSSL_HAPROXY */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/md2.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/md2.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/md2.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/md2.c 2024-08-03 07:30:00.000000000 +0000 @@ -107,7 +107,7 @@ t = md2->X[j+6] ^= S[t]; t = md2->X[j+7] ^= S[t]; } - t = (t + i) & 0xFF; + t = (byte)((t + i) & 0xFF); } } } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/md5.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/md5.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/md5.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/md5.c 2024-08-03 07:30:00.000000000 +0000 @@ -454,6 +454,7 @@ /* ensure we have a valid buffer length; (-1 to append a byte to length) */ if (md5->buffLen > WC_MD5_BLOCK_SIZE - 1) { + /* some places consider this BAD_STATE_E */ return BUFFER_E; } @@ -461,7 +462,9 @@ /* pad with zeros */ if (md5->buffLen > WC_MD5_PAD_SIZE) { - XMEMSET(&local[md5->buffLen], 0, WC_MD5_BLOCK_SIZE - md5->buffLen); + if (md5->buffLen < WC_MD5_BLOCK_SIZE) { + XMEMSET(&local[md5->buffLen], 0, WC_MD5_BLOCK_SIZE - md5->buffLen); + } md5->buffLen += WC_MD5_BLOCK_SIZE - md5->buffLen; #if defined(BIG_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/memory.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/memory.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/memory.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/memory.c 2024-08-03 07:30:00.000000000 +0000 @@ -31,22 +31,23 @@ #define WOLFSSL_NEED_LINUX_CURRENT #endif -#include - -/* check old macros @wc_fips */ -#if defined(USE_CYASSL_MEMORY) && !defined(USE_WOLFSSL_MEMORY) - #define USE_WOLFSSL_MEMORY -#endif -#if defined(CYASSL_MALLOC_CHECK) && !defined(WOLFSSL_MALLOC_CHECK) - #define WOLFSSL_MALLOC_CHECK -#endif - +#include /* Possible memory options: * NO_WOLFSSL_MEMORY: Disables wolf memory callback support. When not defined settings.h defines USE_WOLFSSL_MEMORY. * WOLFSSL_STATIC_MEMORY: Turns on the use of static memory buffers and functions. This allows for using static memory instead of dynamic. + * WOLFSSL_STATIC_MEMORY_LEAN: Requires WOLFSSL_STATIC_MEMORY be defined. + * Uses smaller type sizes for structs + * requiring that memory pool sizes be less + * then 65k and limits features available like + * IO buffers to reduce footprint size. + * WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK: + * Enables option to register a debugging + * callback function, useful for + * WOLFSSL_STATIC_MEMORY builds where XMALLOC + * and XFREE are not user defined. * WOLFSSL_STATIC_ALIGN: Define defaults to 16 to indicate static memory alignment. * HAVE_IO_POOL: Enables use of static thread safe memory pool for input/output buffers. * XMALLOC_OVERRIDE: Allows override of the XMALLOC, XFREE and XREALLOC macros. @@ -128,6 +129,55 @@ return 0; } +#ifdef WOLFSSL_MEM_FAIL_COUNT +static wolfSSL_Mutex memFailMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(memFailMutex); +int mem_fail_allocs = 0; +int mem_fail_frees = 0; +int mem_fail_cnt = 0; + +void wc_MemFailCount_Init() +{ + char* cnt; +#ifndef WOLFSSL_MUTEX_INITIALIZER + wc_InitMutex(&memFailMutex); +#endif + cnt = getenv("MEM_FAIL_CNT"); + if (cnt != NULL) { + fprintf(stderr, "MemFailCount At: %d\n", mem_fail_cnt); + mem_fail_cnt = atoi(cnt); + } +} +static int wc_MemFailCount_AllocMem(void) +{ + int ret = 1; + + wc_LockMutex(&memFailMutex); + if ((mem_fail_cnt > 0) && (mem_fail_cnt <= mem_fail_allocs + 1)) { + ret = 0; + } + else { + mem_fail_allocs++; + } + wc_UnLockMutex(&memFailMutex); + + return ret; +} +static void wc_MemFailCount_FreeMem(void) +{ + wc_LockMutex(&memFailMutex); + mem_fail_frees++; + wc_UnLockMutex(&memFailMutex); +} +void wc_MemFailCount_Free() +{ +#ifndef WOLFSSL_MUTEX_INITIALIZER + wc_FreeMutex(&memFailMutex); +#endif + fprintf(stderr, "MemFailCount Total: %d\n", mem_fail_allocs); + fprintf(stderr, "MemFailCount Frees: %d\n", mem_fail_frees); +} +#endif + #ifndef WOLFSSL_STATIC_MEMORY #ifdef WOLFSSL_CHECK_MEM_ZERO @@ -160,7 +210,7 @@ */ static int nextIdx = -1; /* Mutex to protect modifying list of addresses to check. */ -static wolfSSL_Mutex zeroMutex; +static wolfSSL_Mutex zeroMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(zeroMutex); /* Initialize the table of addresses and the mutex. */ @@ -169,7 +219,9 @@ /* Clear the table to more easily see what is valid. */ XMEMSET(memZero, 0, sizeof(memZero)); /* Initialize mutex. */ +#ifndef WOLFSSL_MUTEX_INITIALIZER wc_InitMutex(&zeroMutex); +#endif /* Next index is first entry. */ nextIdx = 0; } @@ -179,7 +231,9 @@ void wc_MemZero_Free() { /* Free mutex. */ +#ifndef WOLFSSL_MUTEX_INITIALIZER wc_FreeMutex(&zeroMutex); +#endif /* Make sure we checked all addresses. */ if (nextIdx > 0) { int i; @@ -269,50 +323,6 @@ } #endif /* WOLFSSL_CHECK_MEM_ZERO */ -#ifdef WOLFSSL_MEM_FAIL_COUNT -static wolfSSL_Mutex memFailMutex; -int mem_fail_allocs = 0; -int mem_fail_frees = 0; -int mem_fail_cnt = 0; - -void wc_MemFailCount_Init() -{ - wc_InitMutex(&memFailMutex); - char* cnt = getenv("MEM_FAIL_CNT"); - if (cnt != NULL) { - fprintf(stderr, "MemFailCount At: %d\n", mem_fail_cnt); - mem_fail_cnt = atoi(cnt); - } -} -static int wc_MemFailCount_AllocMem(void) -{ - int ret = 1; - - wc_LockMutex(&memFailMutex); - if ((mem_fail_cnt > 0) && (mem_fail_cnt <= mem_fail_allocs + 1)) { - ret = 0; - } - else { - mem_fail_allocs++; - } - wc_UnLockMutex(&memFailMutex); - - return ret; -} -static void wc_MemFailCount_FreeMem(void) -{ - wc_LockMutex(&memFailMutex); - mem_fail_frees++; - wc_UnLockMutex(&memFailMutex); -} -void wc_MemFailCount_Free() -{ - wc_FreeMutex(&memFailMutex); - fprintf(stderr, "MemFailCount Total: %d\n", mem_fail_allocs); - fprintf(stderr, "MemFailCount Frees: %d\n", mem_fail_frees); -} -#endif - #ifdef WOLFSSL_DEBUG_MEMORY void* wolfSSL_Malloc(size_t size, const char* func, unsigned int line) #else @@ -514,20 +524,39 @@ struct wc_Memory { byte* buffer; struct wc_Memory* next; +#ifdef WOLFSSL_STATIC_MEMORY_LEAN + /* lean static memory is assumed to be under 65k */ + word16 sz; +#else word32 sz; +#endif +#ifdef WOLFSSL_DEBUG_MEMORY + word16 szUsed; +#endif }; +#ifdef WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK +static DebugMemoryCb DebugCb = NULL; + +/* Used to set a debug memory callback. Helpful in cases where + * printf is not available. */ +void wolfSSL_SetDebugMemoryCb(DebugMemoryCb cb) +{ + DebugCb = cb; +} +#endif + /* returns amount of memory used on success. On error returns negative value wc_Memory** list is the list that new buckets are prepended to */ -static int create_memory_buckets(byte* buffer, word32 bufSz, - word32 buckSz, word32 buckNum, wc_Memory** list) { - word32 i; +static int wc_create_memory_buckets(byte* buffer, word32 bufSz, + word32 buckSz, byte buckNum, wc_Memory** list) { byte* pt = buffer; int ret = 0; - word32 memSz = (word32)sizeof(wc_Memory); - word32 padSz = -(int)memSz & (WOLFSSL_STATIC_ALIGN - 1); + byte memSz = (byte)sizeof(wc_Memory); + word16 padSz = -(int)memSz & (WOLFSSL_STATIC_ALIGN - 1); + word16 i; /* if not enough space available for bucket size then do not try */ if (buckSz + memSz + padSz > bufSz) { @@ -542,6 +571,12 @@ mem->buffer = (byte*)pt + padSz + memSz; mem->next = NULL; + #ifdef WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK + if (DebugCb) { + DebugCb(buckSz, buckSz, WOLFSSL_DEBUG_MEMORY_INIT, 0); + } + #endif + /* add the newly created struct to front of list */ if (*list == NULL) { *list = mem; @@ -562,41 +597,126 @@ return ret; } -int wolfSSL_init_memory_heap(WOLFSSL_HEAP* heap) +static int wc_partition_static_memory(byte* buffer, word32 sz, int flag, + WOLFSSL_HEAP* heap) { - word32 wc_MemSz[WOLFMEM_DEF_BUCKETS] = { WOLFMEM_BUCKETS }; - word32 wc_Dist[WOLFMEM_DEF_BUCKETS] = { WOLFMEM_DIST }; + word32 ava = sz; + byte* pt = buffer; + int ret = 0; + byte memSz = (word32)sizeof(wc_Memory); + byte padSz = -(int)memSz & (WOLFSSL_STATIC_ALIGN - 1); - if (heap == NULL) { - return BAD_FUNC_ARG; + WOLFSSL_ENTER("wc_partition_static_memory"); + + /* align pt */ + while ((wc_ptr_t)pt % WOLFSSL_STATIC_ALIGN && pt < (buffer + sz)) { + *pt = 0x00; + pt++; + ava--; } +#ifdef WOLFSSL_DEBUG_MEMORY + fprintf(stderr, "Allocated %d bytes for static memory @ %p\n", ava, pt); +#endif + + /* divide into chunks of memory and add them to available list */ + while (ava >= (word32)(heap->sizeList[0] + padSz + memSz)) { + #ifndef WOLFSSL_STATIC_MEMORY_LEAN + /* creating only IO buffers from memory passed in, max TLS is 16k */ + if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) { + if ((ret = wc_create_memory_buckets(pt, ava, + WOLFMEM_IO_SZ, 1, &(heap->io))) < 0) { + WOLFSSL_LEAVE("wc_partition_static_memory", ret); + return ret; + } + + /* check if no more room left for creating IO buffers */ + if (ret == 0) { + break; + } + + /* advance pointer in buffer for next buckets and keep track + of how much memory is left available */ + pt += ret; + ava -= ret; + } + else + #endif + { + int i; + /* start at largest and move to smaller buckets */ + for (i = (WOLFMEM_MAX_BUCKETS - 1); i >= 0; i--) { + if ((word32)(heap->sizeList[i] + padSz + memSz) <= ava) { + if ((ret = wc_create_memory_buckets(pt, ava, + heap->sizeList[i], heap->distList[i], + &(heap->ava[i]))) < 0) { + WOLFSSL_LEAVE("wc_partition_static_memory", ret); + return ret; + } + + /* advance pointer in buffer for next buckets and keep track + of how much memory is left available */ + pt += ret; + ava -= ret; + } + } + } + } + + (void)flag; + return 1; +} + +static int wc_init_memory_heap(WOLFSSL_HEAP* heap, unsigned int listSz, + const unsigned int* sizeList, const unsigned int* distList) +{ + unsigned int i; + XMEMSET(heap, 0, sizeof(WOLFSSL_HEAP)); - XMEMCPY(heap->sizeList, wc_MemSz, sizeof(wc_MemSz)); - XMEMCPY(heap->distList, wc_Dist, sizeof(wc_Dist)); + /* avoid XMEMCPY for LEAN static memory build */ + for (i = 0; i < listSz; i++) { + heap->sizeList[i] = sizeList[i]; + } + + for (i = 0; i < listSz; i++) { + heap->distList[i] = distList[i]; + } +#ifndef SINGLE_THREADED if (wc_InitMutex(&(heap->memory_mutex)) != 0) { WOLFSSL_MSG("Error creating heap memory mutex"); return BAD_MUTEX_E; } +#endif return 0; } -int wc_LoadStaticMemory(WOLFSSL_HEAP_HINT** pHint, - unsigned char* buf, unsigned int sz, int flag, int maxSz) -{ +int wc_LoadStaticMemory_ex(WOLFSSL_HEAP_HINT** pHint, + unsigned int listSz, const unsigned int* sizeList, + const unsigned int* distList, unsigned char* buf, + unsigned int sz, int flag, int maxSz) +{ + WOLFSSL_HEAP* heap = NULL; + WOLFSSL_HEAP_HINT* hint = NULL; + word16 idx = 0; int ret; - WOLFSSL_HEAP* heap; - WOLFSSL_HEAP_HINT* hint; - word32 idx = 0; - if (pHint == NULL || buf == NULL) { + WOLFSSL_ENTER("wc_LoadStaticMemory_ex"); + + if (pHint == NULL || buf == NULL || sizeList == NULL || distList == NULL) { return BAD_FUNC_ARG; } + /* Cap the listSz to the actual number of items allocated in the list. */ + if (listSz > WOLFMEM_MAX_BUCKETS) { + WOLFSSL_MSG("Truncating the list of memory buckets"); + listSz = WOLFMEM_MAX_BUCKETS; + } + if ((sizeof(WOLFSSL_HEAP) + sizeof(WOLFSSL_HEAP_HINT)) > sz - idx) { + WOLFSSL_MSG("Not enough memory for partition tracking"); return BUFFER_E; /* not enough memory for structures */ } @@ -607,7 +727,7 @@ hint = (WOLFSSL_HEAP_HINT*)(buf + idx); idx += sizeof(WOLFSSL_HEAP_HINT); - ret = wolfSSL_init_memory_heap(heap); + ret = wc_init_memory_heap(heap, listSz, sizeList, distList); if (ret != 0) { return ret; } @@ -627,12 +747,13 @@ heap = hint->memory; } - ret = wolfSSL_load_static_memory(buf + idx, sz - idx, flag, heap); + ret = wc_partition_static_memory(buf + idx, sz - idx, flag, heap); if (ret != 1) { WOLFSSL_MSG("Error partitioning memory"); - return -1; + return MEMORY_E; } +#ifndef WOLFSSL_STATIC_MEMORY_LEAN /* determine what max applies too */ if ((flag & WOLFMEM_IO_POOL) || (flag & WOLFMEM_IO_POOL_FIXED)) { heap->maxIO = maxSz; @@ -640,85 +761,44 @@ else { /* general memory used in handshakes */ heap->maxHa = maxSz; } - heap->flag |= flag; +#endif *pHint = hint; (void)maxSz; - return 0; } -int wolfSSL_load_static_memory(byte* buffer, word32 sz, int flag, - WOLFSSL_HEAP* heap) +int wc_LoadStaticMemory(WOLFSSL_HEAP_HINT** pHint, + unsigned char* buf, unsigned int sz, int flag, int maxSz) { - word32 ava = sz; - byte* pt = buffer; - int ret = 0; - word32 memSz = (word32)sizeof(wc_Memory); - word32 padSz = -(int)memSz & (WOLFSSL_STATIC_ALIGN - 1); - - WOLFSSL_ENTER("wolfSSL_load_static_memory"); - - if (buffer == NULL) { - return BAD_FUNC_ARG; - } - - /* align pt */ - while ((wc_ptr_t)pt % WOLFSSL_STATIC_ALIGN && pt < (buffer + sz)) { - *pt = 0x00; - pt++; - ava--; - } - -#ifdef WOLFSSL_DEBUG_MEMORY - fprintf(stderr, "Allocated %d bytes for static memory @ %p\n", ava, pt); +#ifdef WOLFSSL_LEAN_STATIC_PSK + word16 sizeList[WOLFMEM_DEF_BUCKETS] = { WOLFMEM_BUCKETS }; + byte distList[WOLFMEM_DEF_BUCKETS] = { WOLFMEM_DIST }; +#else + word32 sizeList[WOLFMEM_DEF_BUCKETS] = { WOLFMEM_BUCKETS }; + word32 distList[WOLFMEM_DEF_BUCKETS] = { WOLFMEM_DIST }; #endif + int ret = 0; - /* divide into chunks of memory and add them to available list */ - while (ava >= (heap->sizeList[0] + padSz + memSz)) { - /* creating only IO buffers from memory passed in, max TLS is 16k */ - if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) { - if ((ret = create_memory_buckets(pt, ava, - WOLFMEM_IO_SZ, 1, &(heap->io))) < 0) { - WOLFSSL_LEAVE("wolfSSL_load_static_memory", ret); - return ret; - } + WOLFSSL_ENTER("wc_LoadStaticMemory"); + ret = wc_LoadStaticMemory_ex(pHint, + WOLFMEM_DEF_BUCKETS, sizeList, distList, + buf, sz, flag, maxSz); + WOLFSSL_LEAVE("wc_LoadStaticMemory", ret); + return ret; +} - /* check if no more room left for creating IO buffers */ - if (ret == 0) { - break; - } - /* advance pointer in buffer for next buckets and keep track - of how much memory is left available */ - pt += ret; - ava -= ret; - } - else { - int i; - /* start at largest and move to smaller buckets */ - for (i = (WOLFMEM_MAX_BUCKETS - 1); i >= 0; i--) { - if ((heap->sizeList[i] + padSz + memSz) <= ava) { - if ((ret = create_memory_buckets(pt, ava, heap->sizeList[i], - heap->distList[i], &(heap->ava[i]))) < 0) { - WOLFSSL_LEAVE("wolfSSL_load_static_memory", ret); - return ret; - } - - /* advance pointer in buffer for next buckets and keep track - of how much memory is left available */ - pt += ret; - ava -= ret; - } - } - } +void wc_UnloadStaticMemory(WOLFSSL_HEAP_HINT* heap) +{ + WOLFSSL_ENTER("wc_UnloadStaticMemory"); + if (heap != NULL && heap->memory != NULL) { + wc_FreeMutex(&heap->memory->memory_mutex); } - - return 1; } - +#ifndef WOLFSSL_STATIC_MEMORY_LEAN /* returns the size of management memory needed for each bucket. * This is memory that is used to keep track of and align memory buckets. */ int wolfSSL_MemoryPaddingSz(void) @@ -731,28 +811,34 @@ /* Used to calculate memory size for optimum use with buckets. returns the suggested size rounded down to the nearest bucket. */ -int wolfSSL_StaticBufferSz(byte* buffer, word32 sz, int flag) +int wolfSSL_StaticBufferSz_ex(unsigned int listSz, + const unsigned int *sizeList, const unsigned int *distList, + byte* buffer, word32 sz, int flag) { - word32 bucketSz[WOLFMEM_MAX_BUCKETS] = {WOLFMEM_BUCKETS}; - word32 distList[WOLFMEM_MAX_BUCKETS] = {WOLFMEM_DIST}; - word32 ava = sz; byte* pt = buffer; word32 memSz = (word32)sizeof(wc_Memory); word32 padSz = -(int)memSz & (WOLFSSL_STATIC_ALIGN - 1); - WOLFSSL_ENTER("wolfSSL_static_size"); + WOLFSSL_ENTER("wolfSSL_StaticBufferSz_ex"); - if (buffer == NULL) { + if (buffer == NULL || sizeList == NULL || distList == NULL) { return BAD_FUNC_ARG; } + /* Cap the listSz to the actual number of items allocated in the list. */ + if (listSz > WOLFMEM_MAX_BUCKETS) { + WOLFSSL_MSG("Truncating the list of memory buckets"); + listSz = WOLFMEM_MAX_BUCKETS; + } + /* align pt */ while ((wc_ptr_t)pt % WOLFSSL_STATIC_ALIGN && pt < (buffer + sz)) { pt++; ava--; } +#ifndef WOLFSSL_STATIC_MEMORY_LEAN /* creating only IO buffers from memory passed in, max TLS is 16k */ if (flag & WOLFMEM_IO_POOL || flag & WOLFMEM_IO_POOL_FIXED) { if (ava < (memSz + padSz + WOLFMEM_IO_SZ)) { @@ -761,29 +847,44 @@ ava = ava % (memSz + padSz + WOLFMEM_IO_SZ); } - else { + else +#endif + { int i, k; - if (ava < (bucketSz[0] + padSz + memSz)) { + if (ava < (sizeList[0] + padSz + memSz)) { return 0; /* not enough room for even one bucket */ } - while ((ava >= (bucketSz[0] + padSz + memSz)) && (ava > 0)) { + while ((ava >= (sizeList[0] + padSz + memSz)) && (ava > 0)) { /* start at largest and move to smaller buckets */ - for (i = (WOLFMEM_MAX_BUCKETS - 1); i >= 0; i--) { + for (i = (listSz - 1); i >= 0; i--) { for (k = distList[i]; k > 0; k--) { - if ((bucketSz[i] + padSz + memSz) <= ava) { - ava -= bucketSz[i] + padSz + memSz; + if ((sizeList[i] + padSz + memSz) <= ava) { + ava -= sizeList[i] + padSz + memSz; } } } } } + WOLFSSL_LEAVE("wolfSSL_StaticBufferSz_ex", sz - ava); return sz - ava; /* round down */ } +/* Calls wolfSSL_StaticBufferSz_ex with the static memory pool config + * used by wolfSSL by default. */ +int wolfSSL_StaticBufferSz(byte* buffer, word32 sz, int flag) +{ + word32 bucketSz[WOLFMEM_DEF_BUCKETS] = {WOLFMEM_BUCKETS}; + word32 distList[WOLFMEM_DEF_BUCKETS] = {WOLFMEM_DIST}; + + return wolfSSL_StaticBufferSz_ex(WOLFMEM_DEF_BUCKETS, bucketSz, distList, + buffer, sz, flag); +} + + int FreeFixedIO(WOLFSSL_HEAP* heap, wc_Memory** io) { WOLFSSL_MSG("Freeing fixed IO buffer"); @@ -855,6 +956,32 @@ return 1; } +#endif /* !WOLFSSL_STATIC_MEMORY_LEAN */ + + +/* global heap hint to fall back on when no heap hint is passed to + * XMALLOC/XFREE + * NOT thread safe, should be set once before any expected XMALLOC XFREE calls + */ +static void* globalHeapHint = NULL; + + +/* Used to set a new global heap hint. Returns a pointer to the current global + * heap hint before being set. */ +void* wolfSSL_SetGlobalHeapHint(void* heap) +{ + void *oldHint = globalHeapHint; + + globalHeapHint = heap; + return oldHint; +} + + +/* returns a pointer to the current global heap hint */ +void* wolfSSL_GetGlobalHeapHint(void) +{ + return globalHeapHint; +} #ifdef WOLFSSL_DEBUG_MEMORY @@ -875,7 +1002,7 @@ #endif /* if no heap hint then use dynamic memory*/ - if (heap == NULL) { + if (heap == NULL && globalHeapHint == NULL) { #ifdef WOLFSSL_HEAP_TEST /* allow using malloc for creating ctx and method */ if (type == DYNAMIC_TYPE_CTX || type == DYNAMIC_TYPE_METHOD || @@ -910,13 +1037,24 @@ } else { WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap; - WOLFSSL_HEAP* mem = hint->memory; + WOLFSSL_HEAP* mem; + + if (hint == NULL) { + hint = (WOLFSSL_HEAP_HINT*)globalHeapHint; + #ifdef WOLFSSL_DEBUG_MEMORY + fprintf(stderr, "(Using global heap hint %p) ", hint); + #endif + } + mem = hint->memory; + #ifndef SINGLE_THREADED if (wc_LockMutex(&(mem->memory_mutex)) != 0) { WOLFSSL_MSG("Bad memory_mutex lock"); return NULL; } + #endif + #ifndef WOLFSSL_STATIC_MEMORY_LEAN /* case of using fixed IO buffers */ if (mem->flag & WOLFMEM_IO_POOL_FIXED && (type == DYNAMIC_TYPE_OUT_BUFFER || @@ -928,7 +1066,10 @@ pt = hint->inBuf; } } - else { + else + #endif + { + #ifndef WOLFSSL_STATIC_MEMORY_LEAN /* check if using IO pool flag */ if (mem->flag & WOLFMEM_IO_POOL && (type == DYNAMIC_TYPE_OUT_BUFFER || @@ -938,6 +1079,7 @@ mem->io = pt->next; } } + #endif /* general static memory */ if (pt == NULL) { @@ -950,7 +1092,7 @@ } #ifdef WOLFSSL_DEBUG_STATIC_MEMORY else { - fprintf(stderr, "Size: %ld, Empty: %d\n", size, + fprintf(stderr, "Size: %lu, Empty: %d\n", (unsigned long) size, mem->sizeList[i]); } #endif @@ -960,14 +1102,21 @@ } if (pt != NULL) { - mem->inUse += pt->sz; + #ifndef WOLFSSL_STATIC_MEMORY_LEAN mem->alloc += 1; + #endif res = pt->buffer; #ifdef WOLFSSL_DEBUG_MEMORY - fprintf(stderr, "Alloc: %p -> %u at %s:%d\n", pt->buffer, pt->sz, func, line); + pt->szUsed = size; + fprintf(stderr, "Alloc: %p -> %lu at %s:%d\n", pt->buffer, size, func, line); #endif - + #ifdef WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK + if (DebugCb) { + DebugCb(size, pt->sz, WOLFSSL_DEBUG_MEMORY_ALLOC, type); + } + #endif + #ifndef WOLFSSL_STATIC_MEMORY_LEAN /* keep track of connection statistics if flag is set */ if (mem->flag & WOLFMEM_TRACK_STATS) { WOLFSSL_MEM_CONN_STATS* stats = hint->stats; @@ -983,15 +1132,24 @@ stats->totalAlloc++; } } + #endif } else { WOLFSSL_MSG("ERROR ran out of static memory"); + res = NULL; #ifdef WOLFSSL_DEBUG_MEMORY - fprintf(stderr, "Looking for %lu bytes at %s:%d\n", size, func, line); + fprintf(stderr, "Looking for %lu bytes at %s:%d\n", (unsigned long) size, func, + line); + #endif + #ifdef WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK + if (DebugCb) { + DebugCb(size, 0, WOLFSSL_DEBUG_MEMORY_FAIL, type); + } #endif } - + #ifndef SINGLE_THREADED wc_UnLockMutex(&(mem->memory_mutex)); + #endif } #ifdef WOLFSSL_MALLOC_CHECK @@ -1030,7 +1188,7 @@ } #endif - if (heap == NULL) { + if (heap == NULL && globalHeapHint == NULL) { #ifdef WOLFSSL_HEAP_TEST /* allow using malloc for creating ctx and method */ if (type == DYNAMIC_TYPE_CTX || type == DYNAMIC_TYPE_METHOD || @@ -1055,16 +1213,31 @@ } else { WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap; - WOLFSSL_HEAP* mem = hint->memory; + WOLFSSL_HEAP* mem; word32 padSz = -(int)sizeof(wc_Memory) & (WOLFSSL_STATIC_ALIGN - 1); + if (hint == NULL) { + hint = (WOLFSSL_HEAP_HINT*)globalHeapHint; + #ifdef WOLFSSL_DEBUG_MEMORY + fprintf(stderr, "(Using global heap hint %p) ", hint); + #endif + } + mem = hint->memory; + if (mem == NULL) { + WOLFSSL_MSG("Bad hint pointer to memory"); + return; + } + /* get memory struct and add it to available list */ pt = (wc_Memory*)((byte*)ptr - sizeof(wc_Memory) - padSz); + #ifndef SINGLE_THREADED if (wc_LockMutex(&(mem->memory_mutex)) != 0) { WOLFSSL_MSG("Bad memory_mutex lock"); return; } + #endif + #ifndef WOLFSSL_STATIC_MEMORY_LEAN /* case of using fixed IO buffers */ if (mem->flag & WOLFMEM_IO_POOL_FIXED && (type == DYNAMIC_TYPE_OUT_BUFFER || @@ -1078,22 +1251,38 @@ pt->next = mem->io; mem->io = pt; } - else { /* general memory free */ + else + #endif + { /* general memory free */ for (i = 0; i < WOLFMEM_MAX_BUCKETS; i++) { if (pt->sz == mem->sizeList[i]) { pt->next = mem->ava[i]; mem->ava[i] = pt; + + #ifdef WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK + if (DebugCb) { + #ifdef WOLFSSL_DEBUG_MEMORY + DebugCb(pt->szUsed, pt->sz, WOLFSSL_DEBUG_MEMORY_FREE, type); + #else + DebugCb(pt->sz, pt->sz, WOLFSSL_DEBUG_MEMORY_FREE, type); + #endif + } + #endif break; } } } + #ifndef WOLFSSL_STATIC_MEMORY_LEAN mem->inUse -= pt->sz; mem->frAlc += 1; + #endif #ifdef WOLFSSL_DEBUG_MEMORY - fprintf(stderr, "Free: %p -> %u at %s:%d\n", pt->buffer, pt->sz, func, line); + fprintf (stderr, "Free: %p -> %u at %s:%d\n", pt->buffer, + pt->szUsed, func, line); #endif + #ifndef WOLFSSL_STATIC_MEMORY_LEAN /* keep track of connection statistics if flag is set */ if (mem->flag & WOLFMEM_TRACK_STATS) { WOLFSSL_MEM_CONN_STATS* stats = hint->stats; @@ -1112,7 +1301,10 @@ stats->totalFr++; } } + #endif + #ifndef SINGLE_THREADED wc_UnLockMutex(&(mem->memory_mutex)); + #endif } } @@ -1121,6 +1313,7 @@ (void)type; } +#ifndef WOLFSSL_NO_REALLOC #ifdef WOLFSSL_DEBUG_MEMORY void* wolfSSL_Realloc(void *ptr, size_t size, void* heap, int type, const char* func, unsigned int line) #else @@ -1138,7 +1331,7 @@ } #endif - if (heap == NULL) { + if (heap == NULL && globalHeapHint == NULL) { #ifdef WOLFSSL_HEAP_TEST WOLFSSL_MSG("ERROR null heap hint passed in to XREALLOC"); #endif @@ -1150,9 +1343,17 @@ } else { WOLFSSL_HEAP_HINT* hint = (WOLFSSL_HEAP_HINT*)heap; - WOLFSSL_HEAP* mem = hint->memory; + WOLFSSL_HEAP* mem; word32 padSz = -(int)sizeof(wc_Memory) & (WOLFSSL_STATIC_ALIGN - 1); + if (hint == NULL) { + hint = (WOLFSSL_HEAP_HINT*)globalHeapHint; + #ifdef WOLFSSL_DEBUG_MEMORY + fprintf(stderr, "(Using global heap hint %p) ", hint); + #endif + } + mem = hint->memory; + if (ptr == NULL) { #ifdef WOLFSSL_DEBUG_MEMORY return wolfSSL_Malloc(size, heap, type, func, line); @@ -1160,12 +1361,14 @@ return wolfSSL_Malloc(size, heap, type); #endif } - + #ifndef SINGLE_THREADED if (wc_LockMutex(&(mem->memory_mutex)) != 0) { WOLFSSL_MSG("Bad memory_mutex lock"); return NULL; } + #endif + #ifndef WOLFSSL_STATIC_MEMORY_LEAN /* case of using fixed IO buffers or IO pool */ if (((mem->flag & WOLFMEM_IO_POOL)||(mem->flag & WOLFMEM_IO_POOL_FIXED)) && (type == DYNAMIC_TYPE_OUT_BUFFER || @@ -1178,7 +1381,9 @@ } res = pt->buffer; } - else { + else + #endif + { /* general memory */ for (i = 0; i < WOLFMEM_MAX_BUCKETS; i++) { if ((word32)size <= mem->sizeList[i]) { @@ -1191,30 +1396,40 @@ } if (pt != NULL && res == NULL) { + word32 prvSz; + res = pt->buffer; /* copy over original information and free ptr */ - word32 prvSz = ((wc_Memory*)((byte*)ptr - padSz - + prvSz = ((wc_Memory*)((byte*)ptr - padSz - sizeof(wc_Memory)))->sz; prvSz = (prvSz > pt->sz)? pt->sz: prvSz; XMEMCPY(pt->buffer, ptr, prvSz); + #ifndef WOLFSSL_STATIC_MEMORY_LEAN mem->inUse += pt->sz; mem->alloc += 1; + #endif /* free memory that was previously being used */ + #ifndef SINGLE_THREADED wc_UnLockMutex(&(mem->memory_mutex)); + #endif wolfSSL_Free(ptr, heap, type #ifdef WOLFSSL_DEBUG_MEMORY , func, line #endif ); + #ifndef SINGLE_THREADED if (wc_LockMutex(&(mem->memory_mutex)) != 0) { WOLFSSL_MSG("Bad memory_mutex lock"); return NULL; } + #endif } } + #ifndef SINGLE_THREADED wc_UnLockMutex(&(mem->memory_mutex)); + #endif } #ifdef WOLFSSL_MALLOC_CHECK @@ -1231,7 +1446,7 @@ return res; } #endif /* WOLFSSL_STATIC_MEMORY */ - +#endif /* WOLFSSL_NO_REALLOC */ #endif /* USE_WOLFSSL_MEMORY */ @@ -1239,7 +1454,6 @@ /* Example for user io pool, shared build may need definitions in lib proper */ -#include #include #ifndef HAVE_THREAD_LS @@ -1324,8 +1538,13 @@ } #endif - if (malloc_function) + if (malloc_function) { +#ifndef WOLFSSL_STATIC_MEMORY p32 = malloc_function(n + sizeof(word32) * 4); +#else + p32 = malloc_function(n + sizeof(word32) * 4, heap, type); +#endif + } else p32 = malloc(n + sizeof(word32) * 4); @@ -1362,8 +1581,13 @@ oldLen = oldp32[0]; } - if (realloc_function) + if (realloc_function) { +#ifndef WOLFSSL_STATIC_MEMORY p32 = realloc_function(oldp32, n + sizeof(word32) * 4); +#else + p32 = realloc_function(oldp32, n + sizeof(word32) * 4, heap, type); +#endif + } else p32 = realloc(oldp32, n + sizeof(word32) * 4); @@ -1403,8 +1627,13 @@ fprintf(stderr, "Free: %p -> %u (%d) at %s:%s:%u\n", p, p32[0], type, func, file, line); - if (free_function) + if (free_function) { +#ifndef WOLFSSL_STATIC_MEMORY free_function(p32); +#else + free_function(p32, heap, type); +#endif + } else free(p32); } @@ -1432,6 +1661,149 @@ } #endif +#ifdef WC_DEBUG_CIPHER_LIFECYCLE +static const byte wc_debug_cipher_lifecycle_tag_value[] = + { 'W', 'o', 'l', 'f' }; + +WOLFSSL_LOCAL int wc_debug_CipherLifecycleInit( + void **CipherLifecycleTag, + void *heap) +{ + if (CipherLifecycleTag == NULL) + return BAD_FUNC_ARG; + *CipherLifecycleTag = (void *)XMALLOC( + sizeof(wc_debug_cipher_lifecycle_tag_value), + heap, + DYNAMIC_TYPE_DEBUG_TAG); + if (*CipherLifecycleTag == NULL) + return MEMORY_E; + XMEMCPY(*CipherLifecycleTag, + wc_debug_cipher_lifecycle_tag_value, + sizeof(wc_debug_cipher_lifecycle_tag_value)); + return 0; +} + +WOLFSSL_LOCAL int wc_debug_CipherLifecycleCheck( + void *CipherLifecycleTag, + int abort_p) +{ + int ret; + if (CipherLifecycleTag == NULL) { + ret = BAD_STATE_E; + goto out; + } + if (XMEMCMP(CipherLifecycleTag, + wc_debug_cipher_lifecycle_tag_value, + sizeof(wc_debug_cipher_lifecycle_tag_value)) != 0) + { + ret = BAD_STATE_E; + goto out; + } + ret = 0; + +out: + if ((ret < 0) && abort_p) + abort(); + + return ret; +} + +WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree( + void **CipherLifecycleTag, + void *heap, + int abort_p) +{ + int ret; + if (CipherLifecycleTag == NULL) + return BAD_FUNC_ARG; + ret = wc_debug_CipherLifecycleCheck(*CipherLifecycleTag, abort_p); + if (ret != 0) + return ret; + XFREE(*CipherLifecycleTag, heap, DYNAMIC_TYPE_DEBUG_TAG); + *CipherLifecycleTag = NULL; + return 0; +} +#endif /* WC_DEBUG_CIPHER_LIFECYCLE */ + +#ifdef DEBUG_VECTOR_REGISTER_ACCESS +THREAD_LS_T int wc_svr_count = 0; +THREAD_LS_T const char *wc_svr_last_file = NULL; +THREAD_LS_T int wc_svr_last_line = -1; +THREAD_LS_T int wc_debug_vector_registers_retval = + WC_DEBUG_VECTOR_REGISTERS_RETVAL_INITVAL; +#endif + +#ifdef DEBUG_VECTOR_REGISTER_ACCESS_FUZZING + +#ifdef HAVE_THREAD_LS + +WOLFSSL_LOCAL int SAVE_VECTOR_REGISTERS2_fuzzer(void) { + static THREAD_LS_T struct drand48_data wc_svr_fuzzing_state; + static THREAD_LS_T int wc_svr_fuzzing_seeded = 0; + long result; + +#ifdef DEBUG_VECTOR_REGISTER_ACCESS + if (wc_debug_vector_registers_retval) + return wc_debug_vector_registers_retval; +#endif + + if (wc_svr_fuzzing_seeded == 0) { + long seed = WC_DEBUG_VECTOR_REGISTERS_FUZZING_SEED; + char *seed_envstr = getenv("WC_DEBUG_VECTOR_REGISTERS_FUZZING_SEED"); + if (seed_envstr) + seed = strtol(seed_envstr, NULL, 0); + (void)srand48_r(seed, &wc_svr_fuzzing_state); + wc_svr_fuzzing_seeded = 1; + } + (void)lrand48_r(&wc_svr_fuzzing_state, &result); + if (result & 1) + return IO_FAILED_E; + else + return 0; +} + +#else /* !HAVE_THREAD_LS */ + +/* alternate implementation useful for testing in the kernel module build, where + * glibc and thread-local storage are unavailable. + * + * note this is not a well-behaved PRNG, but is adequate for fuzzing purposes. + * the prn sequence is incompressible according to ent and xz, and does not + * cycle within 10M iterations with various seeds including zero, but the Chi + * square distribution is poor, and the unconditioned lsb bit balance is ~54% + * regardless of seed. + * + * deterministic only if access is single-threaded, but never degenerate. + */ + +WOLFSSL_LOCAL int SAVE_VECTOR_REGISTERS2_fuzzer(void) { + static unsigned long prn = WC_DEBUG_VECTOR_REGISTERS_FUZZING_SEED; + static int balance_bit = 0; + unsigned long new_prn = prn ^ 0xba86943da66ee701ul; /* note this magic + * random number is + * bit-balanced. + */ + +#ifdef DEBUG_VECTOR_REGISTER_ACCESS + if (wc_debug_vector_registers_retval) + return wc_debug_vector_registers_retval; +#endif + + /* barrel-roll using the bottom 6 bits. */ + if (new_prn & 0x3f) + new_prn = (new_prn << (new_prn & 0x3f)) | + (new_prn >> (0x40 - (new_prn & 0x3f))); + prn = new_prn; + + balance_bit = !balance_bit; + + return ((prn & 1) ^ balance_bit) ? IO_FAILED_E : 0; +} + +#endif /* !HAVE_THREAD_LS */ + +#endif /* DEBUG_VECTOR_REGISTER_ACCESS_FUZZING */ + #ifdef WOLFSSL_LINUXKM #include "../../linuxkm/linuxkm_memory.c" #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/misc.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/misc.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/misc.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/misc.c 2024-08-03 07:30:00.000000000 +0000 @@ -104,13 +104,13 @@ WC_MISC_STATIC WC_INLINE word32 rotlFixed(word32 x, word32 y) { - return (x << y) | (x >> (sizeof(y) * 8 - y)); + return (x << y) | (x >> (sizeof(x) * 8 - y)); } /* This routine performs a right circular arithmetic shift of by value. */ WC_MISC_STATIC WC_INLINE word32 rotrFixed(word32 x, word32 y) { - return (x >> y) | (x << (sizeof(y) * 8 - y)); + return (x >> y) | (x << (sizeof(x) * 8 - y)); } #endif @@ -120,14 +120,14 @@ /* This routine performs a left circular arithmetic shift of by value */ WC_MISC_STATIC WC_INLINE word16 rotlFixed16(word16 x, word16 y) { - return (x << y) | (x >> (sizeof(y) * 8 - y)); + return (x << y) | (x >> (sizeof(x) * 8 - y)); } /* This routine performs a right circular arithmetic shift of by value */ WC_MISC_STATIC WC_INLINE word16 rotrFixed16(word16 x, word16 y) { - return (x >> y) | (x << (sizeof(y) * 8 - y)); + return (x >> y) | (x << (sizeof(x) * 8 - y)); } #endif /* WC_RC2 */ @@ -273,11 +273,11 @@ { word32 i; byte* o; - byte* b; + const byte* b; const byte* m; o = (byte*)out; - b = (byte*)buf; + b = (const byte*)buf; m = (const byte*)mask; @@ -285,6 +285,15 @@ ((wc_ptr_t)b) % WOLFSSL_WORD_SIZE && ((wc_ptr_t)b) % WOLFSSL_WORD_SIZE == ((wc_ptr_t)m) % WOLFSSL_WORD_SIZE) { + /* type-punning helpers */ + union { + byte* bp; + wolfssl_word* wp; + } tpo; + union { + const byte* bp; + const wolfssl_word* wp; + } tpb, tpm; /* Alignment checks out. Possible to XOR words. */ /* Move alignment so that it lines up with a * WOLFSSL_WORD_SIZE boundary */ @@ -292,8 +301,13 @@ *(o++) = (byte)(*(b++) ^ *(m++)); count--; } - XorWordsOut( (wolfssl_word**)&o, (const wolfssl_word**)&b, - (const wolfssl_word**)&m, count / WOLFSSL_WORD_SIZE); + tpo.bp = o; + tpb.bp = b; + tpm.bp = m; + XorWordsOut( &tpo.wp, &tpb.wp, &tpm.wp, count / WOLFSSL_WORD_SIZE); + o = tpo.bp; + b = tpb.bp; + m = tpm.bp; count %= WOLFSSL_WORD_SIZE; } @@ -326,6 +340,15 @@ if (((wc_ptr_t)b) % WOLFSSL_WORD_SIZE == ((wc_ptr_t)m) % WOLFSSL_WORD_SIZE) { + /* type-punning helpers */ + union { + byte* bp; + wolfssl_word* wp; + } tpb; + union { + const byte* bp; + const wolfssl_word* wp; + } tpm; /* Alignment checks out. Possible to XOR words. */ /* Move alignment so that it lines up with a * WOLFSSL_WORD_SIZE boundary */ @@ -333,8 +356,11 @@ *(b++) ^= *(m++); count--; } - XorWords( (wolfssl_word**)&b, - (const wolfssl_word**)&m, count / WOLFSSL_WORD_SIZE); + tpb.bp = b; + tpm.bp = m; + XorWords( &tpb.wp, &tpm.wp, count / WOLFSSL_WORD_SIZE); + b = tpb.bp; + m = tpm.bp; count %= WOLFSSL_WORD_SIZE; } @@ -434,10 +460,16 @@ /* convert 32 bit integer to opaque */ WC_MISC_STATIC WC_INLINE void c32toa(word32 wc_u32, byte* c) { +#ifdef WOLFSSL_USE_ALIGN c[0] = (byte)((wc_u32 >> 24) & 0xff); c[1] = (byte)((wc_u32 >> 16) & 0xff); c[2] = (byte)((wc_u32 >> 8) & 0xff); c[3] = (byte)(wc_u32 & 0xff); +#elif defined(LITTLE_ENDIAN_ORDER) + *(word32*)c = ByteReverseWord32(wc_u32); +#else + *(word32*)c = wc_u32; +#endif } #endif @@ -466,10 +498,25 @@ /* convert opaque to 32 bit integer */ WC_MISC_STATIC WC_INLINE void ato32(const byte* c, word32* wc_u32) { +#ifdef WOLFSSL_USE_ALIGN *wc_u32 = ((word32)c[0] << 24) | ((word32)c[1] << 16) | ((word32)c[2] << 8) | (word32)c[3]; +#elif defined(LITTLE_ENDIAN_ORDER) + *wc_u32 = ByteReverseWord32(*(word32*)c); +#else + *wc_u32 = *(word32*)c; +#endif +} + +/* convert opaque to 32 bit integer. Interpret as little endian. */ +WC_MISC_STATIC WC_INLINE void ato32le(const byte* c, word32* wc_u32) +{ + *wc_u32 = (word32)c[0] | + ((word32)c[1] << 8) | + ((word32)c[2] << 16) | + ((word32)c[3] << 24); } @@ -510,6 +557,18 @@ return 0; } +WC_MISC_STATIC WC_INLINE int CharIsWhiteSpace(char ch) +{ + switch (ch) { + case ' ': + case '\t': + case '\n': + return 1; + default: + return 0; + } +} + #ifndef WOLFSSL_NO_CT_OPS /* Constant time - mask set when a > b. */ WC_MISC_STATIC WC_INLINE byte ctMaskGT(int a, int b) @@ -725,7 +784,20 @@ a->n = 0; } +WC_MISC_STATIC WC_INLINE w64wrapper w64ShiftRight(w64wrapper a, int shift) +{ + a.n >>= shift; + return a; +} + +WC_MISC_STATIC WC_INLINE w64wrapper w64ShiftLeft(w64wrapper a, int shift) +{ + a.n <<= shift; + return a; +} + #else + WC_MISC_STATIC WC_INLINE void w64Increment(w64wrapper *n) { n->n[1]++; @@ -864,6 +936,31 @@ return 0; } +WC_MISC_STATIC WC_INLINE w64wrapper w64ShiftRight(w64wrapper a, int shift) +{ + if (shift < 32) { + a.n[1] = (a.n[1] >> shift) || (a.n[0] << (32 - shift)); + a.n[0] >>= shift; + } + else { + a.n[1] = a.n[0] >> (shift - 32); + a.n[0] = 0; + } + return a; +} +WC_MISC_STATIC WC_INLINE w64wrapper w64ShiftLeft(w64wrapper a, int shift) +{ + if (shift < 32) { + a.n[0] = (a.n[0] << shift) || (a.n[1] >> (32 - shift)); + a.n[1] <<= shift; + } + else { + a.n[0] = a.n[1] << (shift - 32); + a.n[1] = 0; + } + return a; +} + #endif /* WORD64_AVAILABLE && !WOLFSSL_W64_WRAPPER_TEST */ #endif /* WOLFSSL_W64_WRAPPER */ @@ -904,6 +1001,25 @@ #endif /* WOLFCRYPT_ONLY && !NO_HASH_WRAPPER && * (!NO_SESSION_CACHE || HAVE_SESSION_TICKET) */ +WC_MISC_STATIC WC_INLINE char* CopyString(const char* src, int srcLen, + void* heap, int type) { + char* dst = NULL; + + if (src == NULL) + return NULL; + + if (srcLen <= 0) + srcLen = (int)XSTRLEN(src); + + dst = (char*)XMALLOC((size_t)srcLen + 1, heap, type); + if (dst != NULL) { + XMEMCPY(dst, src, (size_t)srcLen); + dst[srcLen] = '\0'; + } + + return dst; +} + #endif /* !WOLFSSL_MISC_INCLUDED && !NO_INLINE */ #endif /* WOLF_CRYPT_MISC_C */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs12.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs12.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs12.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs12.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,7 +28,8 @@ #include #if defined(HAVE_PKCS12) && \ - !defined(NO_ASN) && !defined(NO_PWDBASED) && !defined(NO_HMAC) + !defined(NO_ASN) && !defined(NO_PWDBASED) && !defined(NO_HMAC) && \ + !defined(NO_CERTS) #include #include @@ -130,14 +131,21 @@ WC_PKCS12* wc_PKCS12_new(void) { + return wc_PKCS12_new_ex(NULL); +} + + +WC_PKCS12* wc_PKCS12_new_ex(void* heap) +{ WC_PKCS12* pkcs12 = (WC_PKCS12*)XMALLOC(sizeof(WC_PKCS12), - NULL, DYNAMIC_TYPE_PKCS); + heap, DYNAMIC_TYPE_PKCS); if (pkcs12 == NULL) { WOLFSSL_MSG("Memory issue when creating WC_PKCS12 struct"); return NULL; } XMEMSET(pkcs12, 0, sizeof(WC_PKCS12)); + pkcs12->heap = heap; return pkcs12; } @@ -201,7 +209,7 @@ } #endif - XFREE(pkcs12, NULL, DYNAMIC_TYPE_PKCS); + XFREE(pkcs12, heap, DYNAMIC_TYPE_PKCS); } @@ -289,7 +297,7 @@ #ifdef ASN_BER_TO_DER if (pkcs12->indefinite) { if (wc_BerToDer(input, safe->dataSz, NULL, - &pkcs12->safeDersz) != LENGTH_ONLY_E) { + &pkcs12->safeDersz) != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { WOLFSSL_MSG("Not BER sequence"); return ASN_PARSE_E; } @@ -703,7 +711,7 @@ #ifdef ASN_BER_TO_DER if (size == 0) { if (wc_BerToDer(der, totalSz, NULL, - (word32*)&size) != LENGTH_ONLY_E) { + (word32*)&size) != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { WOLFSSL_MSG("Not BER sequence"); return ASN_PARSE_E; } @@ -1118,8 +1126,8 @@ while (current != NULL) { InitDecodedCert(DeCert, current->buffer, current->bufferSz, heap); - if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL) == 0) { - if (wc_CheckPrivateKeyCert(*pkey, *pkeySz, DeCert) == 1) { + if (ParseCertRelative(DeCert, CERT_TYPE, NO_VERIFY, NULL, NULL) == 0) { + if (wc_CheckPrivateKeyCert(*pkey, *pkeySz, DeCert, 0) == 1) { WOLFSSL_MSG("Key Pair found"); *cert = current->buffer; *certSz = current->bufferSz; @@ -1229,7 +1237,7 @@ static int PKCS12_CoalesceOctetStrings(WC_PKCS12* pkcs12, byte* data, word32 dataSz, word32* idx, int* curIdx) { - byte* mergedData = NULL; /* buffer for concatonated strings */ + byte* mergedData = NULL; /* buffer for concatenated strings */ word32 mergedSz = 0; /* total size of merged strings */ int encryptedContentSz = 0; int originalEncSz = 0; @@ -1243,7 +1251,7 @@ ret = ASN_PARSE_E; } - /* Loop through octet strings and concatonate them without + /* Loop through octet strings and concatenate them without * the tags and length */ while ((int)*idx < originalEncSz + *curIdx) { if (GetASNTag(data, idx, &tag, dataSz) < 0) { @@ -1281,7 +1289,7 @@ *idx += SetLength(mergedSz, &data[*idx]); if (mergedSz > 0) { - /* Copy over concatonated octet strings into data buffer */ + /* Copy over concatenated octet strings into data buffer */ XMEMCPY(&data[*idx], mergedData, mergedSz); XFREE(mergedData, pkcs12->heap, DYNAMIC_TYPE_PKCS); @@ -1818,7 +1826,7 @@ ret = UnTraditionalEnc(key, keySz, pkcs8Key, &sz, pass, passSz, vPKCS, vAlgo, NULL, 0, itt, rng, heap); } - if (ret == LENGTH_ONLY_E) { + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { *outSz = sz + MAX_LENGTH_SZ + 1; return LENGTH_ONLY_E; } @@ -1835,7 +1843,7 @@ /* rewind index and set tag and length */ tmpIdx -= MAX_LENGTH_SZ + 1; - sz = (word32)SetExplicit(0, (word32)ret, out + tmpIdx); + sz = (word32)SetExplicit(0, (word32)ret, out + tmpIdx, 0); tmpIdx += sz; totalSz += sz; XMEMMOVE(out + tmpIdx, out + MAX_LENGTH_SZ + 1, (size_t)ret); @@ -1875,7 +1883,7 @@ /* get max size for shrouded key */ ret = wc_PKCS12_shroud_key(pkcs12, rng, NULL, &length, key, keySz, algo, pass, passSz, iter); - if (ret != LENGTH_ONLY_E && ret < 0) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E) && ret < 0) { return ret; } @@ -2084,7 +2092,7 @@ encSz = contentSz; if ((ret = EncryptContent(NULL, contentSz, NULL, &encSz, pass, passSz, vPKCS, vAlgo, NULL, 0, iter, rng, heap)) < 0) { - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { return ret; } } @@ -2274,7 +2282,7 @@ /* get max size for key bag */ ret = wc_PKCS12_create_key_bag(pkcs12, rng, NULL, &keyBufSz, key, keySz, algo, iter, pass, (int)passSz); - if (ret != LENGTH_ONLY_E && ret < 0) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E) && ret < 0) { WOLFSSL_MSG("Error getting key bag size"); return NULL; } @@ -2311,7 +2319,7 @@ #endif ret = wc_PKCS12_encrypt_content(pkcs12, rng, NULL, keyCiSz, NULL, keyBufSz, algo, pass, (int)passSz, iter, WC_PKCS12_DATA); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { XFREE(keyBuf, heap, DYNAMIC_TYPE_TMP_BUFFER); WOLFSSL_MSG("Error getting key encrypt content size"); return NULL; @@ -2396,7 +2404,7 @@ /* get max size of buffer needed */ ret = wc_PKCS12_create_cert_bag(pkcs12, NULL, &certBufSz, cert, certSz); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { return NULL; } @@ -2408,7 +2416,7 @@ while (current != NULL) { ret = wc_PKCS12_create_cert_bag(pkcs12, NULL, &curBufSz, current->buffer, current->bufferSz); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { return NULL; } certBufSz += curBufSz; @@ -2460,7 +2468,7 @@ /* get buffer size needed for content info */ ret = wc_PKCS12_encrypt_content(pkcs12, rng, NULL, certCiSz, NULL, certBufSz, algo, pass, (int)passSz, iter, type); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { XFREE(certBuf, heap, DYNAMIC_TYPE_TMP_BUFFER); WOLFSSL_LEAVE("wc_PKCS12_create()", ret); return NULL; @@ -2516,7 +2524,7 @@ /* add Content Info structs to safe, key first then cert */ ret = wc_PKCS12_encrypt_content(pkcs12, rng, NULL, &safeDataSz, NULL, innerDataSz, 0, NULL, 0, 0, WC_PKCS12_DATA); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { return ret; } @@ -2603,20 +2611,12 @@ return NULL; } - if ((pkcs12 = wc_PKCS12_new()) == NULL) { + if ((pkcs12 = wc_PKCS12_new_ex(heap)) == NULL) { wc_FreeRng(&rng); WOLFSSL_LEAVE("wc_PKCS12_create", MEMORY_E); return NULL; } - if ((ret = wc_PKCS12_SetHeap(pkcs12, heap)) != 0) { - wc_PKCS12_free(pkcs12); - wc_FreeRng(&rng); - WOLFSSL_LEAVE("wc_PKCS12_create", ret); - (void)ret; - return NULL; - } - if (iter <= 0) { iter = WC_PKCS12_ITT_DEFAULT; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs7.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs7.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs7.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pkcs7.c 2024-08-03 07:30:00.000000000 +0000 @@ -88,6 +88,10 @@ byte* content; byte* buffer; /* main internal read buffer */ + wc_HashAlg hashAlg; + int hashType; + int cntIdfCnt; /* count of in-definite length in content info */ + /* stack variables to store for when returning */ word32 varOne; int varTwo; @@ -105,6 +109,10 @@ word32 aadSz; /* size of additional AEAD data */ word32 tagSz; /* size of tag for AEAD */ word32 contentSz; + word32 currContIdx; /* index of current content */ + word32 currContSz; /* size of current content */ + word32 currContRmnSz; /* remaining size of current content */ + word32 accumContSz; /* size of accumulated content size */ byte tmpIv[MAX_CONTENT_IV_SIZE]; /* store IV if needed */ #ifdef WC_PKCS7_STREAM_DEBUG word32 peakUsed; /* most bytes used for struct at any one time */ @@ -113,6 +121,9 @@ byte multi:1; /* flag for if content is in multiple parts */ byte flagOne:1; byte detached:1; /* flag to indicate detached signature is present */ + byte noContent:1;/* indicates content isn't included in bundle */ + byte degenerate:1; + byte indefLen:1; /* flag to indicate indef-length encoding used */ }; @@ -187,6 +198,15 @@ pkcs7->stream->varOne = 0; pkcs7->stream->varTwo = 0; pkcs7->stream->varThree = 0; + pkcs7->stream->noContent = 0; + pkcs7->stream->indefLen = 0; + pkcs7->stream->cntIdfCnt = 0; + pkcs7->stream->currContIdx = 0; + pkcs7->stream->currContSz = 0; + pkcs7->stream->currContRmnSz= 0; + pkcs7->stream->accumContSz = 0; + pkcs7->stream->contentSz = 0; + pkcs7->stream->hashType = WC_HASH_TYPE_NONE; } } @@ -200,7 +220,6 @@ XFREE(pkcs7->stream->tmpCert, pkcs7->heap, DYNAMIC_TYPE_PKCS7); pkcs7->stream->content = NULL; pkcs7->stream->tmpCert = NULL; - XFREE(pkcs7->stream, pkcs7->heap, DYNAMIC_TYPE_PKCS7); pkcs7->stream = NULL; } @@ -265,12 +284,12 @@ if (rdSz >= inSz) { /* no more input to read, reset input index and request more data */ pkcs7->stream->idx = 0; - return WC_PKCS7_WANT_READ_E; + return WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E); } /* try to store input data into stream buffer */ if (inSz - rdSz > 0 && pkcs7->stream->length < expected) { - int len = min(inSz - rdSz, expected - pkcs7->stream->length); + int len = (int)min(inSz - rdSz, expected - pkcs7->stream->length); /* sanity check that the input buffer is not internal buffer */ if (in == pkcs7->stream->buffer) { @@ -305,7 +324,7 @@ /* if not enough data was read in then request more */ if (pkcs7->stream->length < expected) { pkcs7->stream->idx = 0; - return WC_PKCS7_WANT_READ_E; + return WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E); } /* adjust pointer to read from stored buffer */ @@ -338,11 +357,11 @@ byte* pt; if (pkcs7->stream->length > 0) { - length = pkcs7->stream->length; + length = (int)pkcs7->stream->length; pt = pkcs7->stream->buffer; } else { - length = defSz; + length = (int)defSz; pt = in; } maxIdx = (word32)length; @@ -360,8 +379,8 @@ #ifdef ASN_BER_TO_DER if (length == 0 && ret == 0) { idx = 0; - if ((ret = wc_BerToDer(pt, maxIdx, NULL, - (word32*)&length)) != LENGTH_ONLY_E) { + if ((ret = wc_BerToDer(pt, maxIdx, NULL, (word32*)&length)) + != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { return ret; } } @@ -468,6 +487,7 @@ case WC_PKCS7_VERIFY_STAGE4: return "WC_PKCS7_VERIFY_STAGE4"; case WC_PKCS7_VERIFY_STAGE5: return "WC_PKCS7_VERIFY_STAGE5"; case WC_PKCS7_VERIFY_STAGE6: return "WC_PKCS7_VERIFY_STAGE6"; + case WC_PKCS7_VERIFY_STAGE7: return "WC_PKCS7_VERIFY_STAGE7"; default: return "Unknown state"; @@ -484,7 +504,7 @@ pkcs7->state, wc_PKCS7_GetStateName(pkcs7->state), newState, wc_PKCS7_GetStateName(newState)); #endif - pkcs7->state = newState; + pkcs7->state = (word32)newState; } #define MAX_PKCS7_DIGEST_SZ (MAX_SEQ_SZ + MAX_ALGO_SZ + \ @@ -610,7 +630,7 @@ return BAD_FUNC_ARG; } - idSz = SetLength(typeSz, ID_Length); + idSz = (int)SetLength(typeSz, ID_Length); output[idx++] = ASN_OBJECT_ID; XMEMCPY(output + idx, ID_Length, idSz); idx += idSz; @@ -1021,9 +1041,11 @@ /* Try to decode public key and check with wc_ecc_check_key() */ ret = wc_EccPublicKeyDecode(key, &scratch, ecc, keySz); + #if defined(WOLFSSL_VALIDATE_ECC_IMPORT) if (ret == 0) { ret = wc_ecc_check_key(ecc); } + #endif wc_ecc_free(ecc); break; @@ -1147,9 +1169,9 @@ pkcs7->publicKeyOID = dCert->keyOID; XMEMCPY(pkcs7->issuerHash, dCert->issuerHash, KEYID_SIZE); pkcs7->issuer = dCert->issuerRaw; - pkcs7->issuerSz = dCert->issuerRawLen; + pkcs7->issuerSz = (word32)dCert->issuerRawLen; XMEMCPY(pkcs7->issuerSn, dCert->serial, dCert->serialSz); - pkcs7->issuerSnSz = dCert->serialSz; + pkcs7->issuerSnSz = (word32)dCert->serialSz; XMEMCPY(pkcs7->issuerSubjKeyId, dCert->extSubjKeyId, KEYID_SIZE); /* default to IssuerAndSerialNumber for SignerIdentifier */ @@ -1286,7 +1308,7 @@ return MEMORY_E; } XMEMCPY(pkcs7->signerInfo->sid, in, inSz); - pkcs7->signerInfo->sidSz = inSz; + pkcs7->signerInfo->sidSz = (word32)inSz; return 0; } @@ -1487,6 +1509,7 @@ wc_HashAlg hash; enum wc_HashType hashType; byte contentDigest[WC_MAX_DIGEST_SIZE + 2]; /* content only + ASN.1 heading */ + byte contentDigestSet:1; byte contentAttribsDigest[WC_MAX_DIGEST_SIZE]; byte encContentDigest[MAX_ENCRYPTED_KEY_SZ]; @@ -1533,7 +1556,7 @@ PKCS7Attrib* attribs, int attribsSz) { int i; - int maxSz = min(eaSz, attribsSz); + int maxSz = (int)min((word32)eaSz, attribsSz); int allAttribsSz = 0; for (i = 0; i < maxSz; i++) @@ -1543,14 +1566,14 @@ ea[i].value = attribs[i].value; ea[i].valueSz = attribs[i].valueSz; attribSz += ea[i].valueSz; - ea[i].valueSetSz = SetSet(attribSz, ea[i].valueSet); + ea[i].valueSetSz = SetSet((word32)attribSz, ea[i].valueSet); attribSz += ea[i].valueSetSz; ea[i].oid = attribs[i].oid; ea[i].oidSz = attribs[i].oidSz; attribSz += ea[i].oidSz; - ea[i].valueSeqSz = SetSequence(attribSz, ea[i].valueSeq); + ea[i].valueSeqSz = SetSequence((word32)attribSz, ea[i].valueSeq); attribSz += ea[i].valueSeqSz; - ea[i].totalSz = attribSz; + ea[i].totalSz = (word32)attribSz; allAttribsSz += attribSz; } @@ -1593,7 +1616,7 @@ XFREE(arr[i], pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); } } - ForceZero(arr, rows); + ForceZero(arr, (word32)rows); XFREE(arr, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); } (void)pkcs7; @@ -1616,12 +1639,12 @@ for (i = 0; i < rows; i++) { a = arr[i]; minSz = a->dataSz; - minIdx = i; + minIdx = (word32)i; for (j = i+1; j < rows; j++) { b = arr[j]; if (b->dataSz < minSz) { minSz = b->dataSz; - minIdx = j; + minIdx = (word32)j; } } if (minSz < a->dataSz) { @@ -1674,7 +1697,7 @@ fa = derArr[i]; fa->data = output; - fa->dataSz = sz; + fa->dataSz = (word32)sz; } return 0; @@ -1694,12 +1717,12 @@ } /* create array of FlatAttrib struct pointers to hold DER attribs */ - derArr = (FlatAttrib**) XMALLOC(eaSz * sizeof(FlatAttrib*), pkcs7->heap, + derArr = (FlatAttrib**) XMALLOC((unsigned long)eaSz * sizeof(FlatAttrib*), pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); if (derArr == NULL) { return MEMORY_E; } - XMEMSET(derArr, 0, eaSz * sizeof(FlatAttrib*)); + XMEMSET(derArr, 0, (unsigned long)eaSz * sizeof(FlatAttrib*)); for (i = 0; i < eaSz; i++) { derArr[i] = NewAttrib(pkcs7->heap); @@ -1740,27 +1763,10 @@ #ifndef NO_RSA -/* returns size of signature put into out, negative on error */ -static int wc_PKCS7_RsaSign(PKCS7* pkcs7, byte* in, word32 inSz, ESD* esd) +static int wc_PKCS7_ImportRSA(PKCS7* pkcs7, RsaKey* privKey) { int ret; word32 idx; -#ifdef WOLFSSL_SMALL_STACK - RsaKey* privKey; -#else - RsaKey privKey[1]; -#endif - - if (pkcs7 == NULL || pkcs7->rng == NULL || in == NULL || esd == NULL) { - return BAD_FUNC_ARG; - } - -#ifdef WOLFSSL_SMALL_STACK - privKey = (RsaKey*)XMALLOC(sizeof(RsaKey), pkcs7->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (privKey == NULL) - return MEMORY_E; -#endif ret = wc_InitRsaKey_ex(privKey, pkcs7->heap, pkcs7->devId); if (ret == 0) { @@ -1781,7 +1787,8 @@ #endif } #ifdef WOLF_CRYPTO_CB - else if (ret == ASN_PARSE_E && pkcs7->devId != INVALID_DEVID) { + else if (ret == WC_NO_ERR_TRACE(ASN_PARSE_E) && + pkcs7->devId != INVALID_DEVID) { /* if using crypto callbacks, try public key decode */ idx = 0; ret = wc_RsaPublicKeyDecode(pkcs7->privateKey, &idx, privKey, @@ -1794,6 +1801,32 @@ } } + return ret; +} + + +/* returns size of signature put into out, negative on error */ +static int wc_PKCS7_RsaSign(PKCS7* pkcs7, byte* in, word32 inSz, ESD* esd) +{ + int ret; +#ifdef WOLFSSL_SMALL_STACK + RsaKey* privKey; +#else + RsaKey privKey[1]; +#endif + + if (pkcs7 == NULL || pkcs7->rng == NULL || in == NULL || esd == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + privKey = (RsaKey*)XMALLOC(sizeof(RsaKey), pkcs7->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (privKey == NULL) + return MEMORY_E; +#endif + + ret = wc_PKCS7_ImportRSA(pkcs7, privKey); if (ret == 0) { #ifdef WOLFSSL_ASYNC_CRYPT do { @@ -1807,7 +1840,7 @@ privKey, pkcs7->rng); } #ifdef WOLFSSL_ASYNC_CRYPT - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif } @@ -1824,27 +1857,10 @@ #ifdef HAVE_ECC -/* returns size of signature put into out, negative on error */ -static int wc_PKCS7_EcdsaSign(PKCS7* pkcs7, byte* in, word32 inSz, ESD* esd) +static int wc_PKCS7_ImportECC(PKCS7* pkcs7, ecc_key* privKey) { int ret; - word32 outSz, idx; -#ifdef WOLFSSL_SMALL_STACK - ecc_key* privKey; -#else - ecc_key privKey[1]; -#endif - - if (pkcs7 == NULL || pkcs7->rng == NULL || in == NULL || esd == NULL) { - return BAD_FUNC_ARG; - } - -#ifdef WOLFSSL_SMALL_STACK - privKey = (ecc_key*)XMALLOC(sizeof(ecc_key), pkcs7->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (privKey == NULL) - return MEMORY_E; -#endif + word32 idx; ret = wc_ecc_init_ex(privKey, pkcs7->heap, pkcs7->devId); if (ret == 0) { @@ -1861,7 +1877,8 @@ } } #ifdef WOLF_CRYPTO_CB - else if (ret == ASN_PARSE_E && pkcs7->devId != INVALID_DEVID) { + else if (ret == WC_NO_ERR_TRACE(ASN_PARSE_E) && + pkcs7->devId != INVALID_DEVID) { /* if using crypto callbacks, try public key decode */ idx = 0; ret = wc_EccPublicKeyDecode(pkcs7->privateKey, &idx, privKey, @@ -1874,6 +1891,33 @@ } } + return ret; +} + + +/* returns size of signature put into out, negative on error */ +static int wc_PKCS7_EcdsaSign(PKCS7* pkcs7, byte* in, word32 inSz, ESD* esd) +{ + int ret; + word32 outSz; +#ifdef WOLFSSL_SMALL_STACK + ecc_key* privKey; +#else + ecc_key privKey[1]; +#endif + + if (pkcs7 == NULL || pkcs7->rng == NULL || in == NULL || esd == NULL) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + privKey = (ecc_key*)XMALLOC(sizeof(ecc_key), pkcs7->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (privKey == NULL) + return MEMORY_E; +#endif + + ret = wc_PKCS7_ImportECC(pkcs7, privKey); if (ret == 0) { outSz = sizeof(esd->encContentDigest); #ifdef WOLFSSL_ASYNC_CRYPT @@ -1887,7 +1931,7 @@ &outSz, pkcs7->rng, privKey); } #ifdef WOLFSSL_ASYNC_CRYPT - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif if (ret == 0) ret = (int)outSz; @@ -1903,6 +1947,67 @@ #endif /* HAVE_ECC */ +/* returns encContentDigestSz based on the signature set to be used */ +static int wc_PKCS7_GetSignSize(PKCS7* pkcs7) +{ + int ret = 0; + + switch (pkcs7->publicKeyOID) { + + #ifndef NO_RSA + case RSAk: + { + #ifndef WOLFSSL_SMALL_STACK + RsaKey privKey[1]; + #else + RsaKey* privKey; + privKey = (RsaKey*)XMALLOC(sizeof(RsaKey), pkcs7->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (privKey == NULL) + return MEMORY_E; + #endif + + ret = wc_PKCS7_ImportRSA(pkcs7, privKey); + if (ret == 0) { + ret = wc_RsaEncryptSize(privKey); + } + wc_FreeRsaKey(privKey); + #ifdef WOLFSSL_SMALL_STACK + XFREE(privKey, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + break; + #endif + + #ifdef HAVE_ECC + case ECDSAk: + { + #ifndef WOLFSSL_SMALL_STACK + ecc_key privKey[1]; + #else + ecc_key* privKey; + privKey = (ecc_key*)XMALLOC(sizeof(ecc_key), pkcs7->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (privKey == NULL) + return MEMORY_E; + #endif + + ret = wc_PKCS7_ImportECC(pkcs7, privKey); + if (ret == 0) { + ret = wc_ecc_sig_size(privKey); + } + wc_ecc_free(privKey); + #ifdef WOLFSSL_SMALL_STACK + XFREE(privKey, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + break; + #endif + } + + return ret; +} + /* builds up SignedData signed attributes, including default ones. * @@ -1967,7 +2072,7 @@ cannedAttribs[idx].oid = signingTimeOid; cannedAttribs[idx].oidSz = signingTimeOidSz; cannedAttribs[idx].value = signingTime; - cannedAttribs[idx].valueSz = timeSz; + cannedAttribs[idx].valueSz = (word32)timeSz; idx++; } #endif @@ -1977,13 +2082,13 @@ cannedAttribs[idx].oid = messageDigestOid; cannedAttribs[idx].oidSz = messageDigestOidSz; cannedAttribs[idx].value = esd->contentDigest; - cannedAttribs[idx].valueSz = hashSz + 2; /* ASN.1 heading */ + cannedAttribs[idx].valueSz = (word32)hashSz + 2; /* ASN.1 heading */ idx++; } esd->signedAttribsCount += cannedAttribsCount; esd->signedAttribsSz += EncodeAttributes(&esd->signedAttribs[atrIdx], - idx, cannedAttribs, cannedAttribsCount); + (int)idx, cannedAttribs, cannedAttribsCount); atrIdx += idx; } else { esd->signedAttribsCount = 0; @@ -2229,7 +2334,7 @@ XMEMCPY(digestInfo + digIdx, esd->contentAttribsDigest, hashSz); digIdx += hashSz; - *digestInfoSz = digIdx; + *digestInfoSz = (word32)digIdx; return 0; } @@ -2325,7 +2430,7 @@ /* CMS with ECDSA does not sign DigestInfo structure * like PKCS#7 with RSA does */ ret = wc_PKCS7_EcdsaSign(pkcs7, esd->contentAttribsDigest, - hashSz, esd); + (word32)hashSz, esd); break; #endif @@ -2345,10 +2450,287 @@ return ret; } +#ifndef BER_OCTET_LENGTH + #define BER_OCTET_LENGTH 4096 +#endif + +/** + * This helper function encodes a chunk of content stream and writes it out. + * + * @param pkcs7 Pointer to a PKCS7 structure. + * @param cipherType The type of cipher to use for encryption. + * @param aes Optional pointer to an Aes structure for AES encryption. + * @param encContentOut Buffer to hold the encrypted content. + * @param contentData Buffer holding the content to be encrypted. + * @param contentDataSz Size of the content to be encrypted. + * @param out Buffer to hold the output data. + * @param outIdx Pointer to an index into the output buffer. + * @param esd Pointer to an ESD structure for digest calculation. + * @return Returns 0 on success, and a negative value on failure. + */ +static int wc_PKCS7_EncodeContentStreamHelper(PKCS7* pkcs7, int cipherType, + Aes* aes, byte* encContentOut, byte* contentData, int contentDataSz, + byte* out, word32* outIdx, ESD* esd) +{ + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); + byte encContentOutOct[MAX_OCTET_STR_SZ]; + word32 encContentOutOctSz = 0; + + switch (cipherType) { + case WC_CIPHER_NONE: + XMEMCPY(encContentOut, contentData, contentDataSz); + if (esd && esd->contentDigestSet != 1) { + ret = wc_HashUpdate(&esd->hash, esd->hashType, + contentData, (word32)contentDataSz); + } + break; + + #ifndef NO_AES + case WC_CIPHER_AES_CBC: + ret = wc_AesCbcEncrypt(aes, encContentOut, + contentData, (word32)contentDataSz); + break; + #endif + + #ifdef WOLFSSL_AESGCM_STREAM + case WC_CIPHER_AES_GCM: + ret = wc_AesGcmEncryptUpdate(aes, encContentOut, + contentData, (word32)contentDataSz, NULL, 0); + break; + #endif + } + + #ifdef WOLFSSL_ASYNC_CRYPT + /* async encrypt not available here, so block till done */ + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E) && + cipherType != WC_CIPHER_NONE) { + ret = wc_AsyncWait(ret, &aes->asyncDev, WC_ASYNC_FLAG_NONE); + } + #endif + + if (ret == 0) { + encContentOutOctSz = SetOctetString((word32)contentDataSz, encContentOutOct); + wc_PKCS7_WriteOut(pkcs7, (out)? out + *outIdx: NULL, + encContentOutOct, encContentOutOctSz); + *outIdx += encContentOutOctSz; + wc_PKCS7_WriteOut(pkcs7, (out)? out + *outIdx : NULL, + encContentOut, (word32)contentDataSz); + *outIdx += contentDataSz; + } + + return ret; +} + + +/* Used for encoding the content, potentially one octet chunk at a time if + * in streaming mode with IO callbacks set. + * Can handle the cipher types: + * - WC_CIPHER_NONE, used for encoding signed bundle where no encryption is + * done. + * - WC_CIPHER_AES_CBC + * - WC_CIPHER_AES_GCM, requires WOLFSSL_AESGCM_STREAM for streaming + * encryption + * If ESD is passed in then hash of the conentet is collected as processed. + * + * Returns 0 on success */ +#ifndef NO_AES +static int wc_PKCS7_EncodeContentStream(PKCS7* pkcs7, ESD* esd, Aes* aes, + byte* in, int inSz, byte* out, int cipherType) +#else +static int wc_PKCS7_EncodeContentStream(PKCS7* pkcs7, ESD* esd, void* aes, + byte* in, int inSz, byte* out, int cipherType) +#endif +{ + int ret = 0; + int devId = pkcs7->devId; + void* heap = pkcs7->heap; + + if (pkcs7->encodeStream) { + int sz; + word32 totalSz = 0; + byte* buf; + byte* encContentOut; + byte* contentData; + word32 idx = 0, outIdx = 0; + int padSz = 0; + + if (cipherType != WC_CIPHER_NONE) { + padSz = wc_PKCS7_GetPadSize(pkcs7->contentSz, + (word32)wc_PKCS7_GetOIDBlockSize(pkcs7->encryptOID)); + } + + if (cipherType == WC_CIPHER_NONE && esd && esd->contentDigestSet != 1) { + /* calculate hash for content */ + ret = wc_HashInit(&esd->hash, esd->hashType); + if (ret != 0) { + return ret; + } + } + + encContentOut = (byte *)XMALLOC(BER_OCTET_LENGTH + MAX_OCTET_STR_SZ, + heap, DYNAMIC_TYPE_PKCS7); + contentData = (byte *)XMALLOC(BER_OCTET_LENGTH + padSz, + heap, DYNAMIC_TYPE_PKCS7); + + if (encContentOut == NULL || contentData == NULL) { + XFREE(encContentOut, heap, DYNAMIC_TYPE_PKCS7); + XFREE(contentData, heap, DYNAMIC_TYPE_PKCS7); + WOLFSSL_MSG("Memory allocation failed for content data"); + return MEMORY_E; + } + + /* keep pulling from content until empty */ + do { + int contentDataRead = 0; + + #ifdef ASN_BER_TO_DER + if (pkcs7->getContentCb) { + contentDataRead = pkcs7->getContentCb(pkcs7, + &buf, pkcs7->streamCtx); + + if (buf == NULL) { + WOLFSSL_MSG("Get content callback returned null " + "buffer pointer"); + XFREE(encContentOut, heap, DYNAMIC_TYPE_PKCS7); + XFREE(contentData, heap, DYNAMIC_TYPE_PKCS7); + return BAD_FUNC_ARG; + } + } + else + #endif + { + int szLeft = BER_OCTET_LENGTH; + + if (in == NULL) { + XFREE(encContentOut, heap, DYNAMIC_TYPE_PKCS7); + XFREE(contentData, heap, DYNAMIC_TYPE_PKCS7); + return BAD_FUNC_ARG; + } + + if (szLeft + totalSz > (word32)inSz) + szLeft = inSz - totalSz; + + contentDataRead = szLeft; + buf = in + totalSz; + } + + if (contentDataRead <= 0) { + /* no more data returned from callback */ + break; + } + totalSz += (word32)contentDataRead; + + /* check and handle octet boundary */ + sz = contentDataRead; + if (idx + sz > BER_OCTET_LENGTH) { + sz = BER_OCTET_LENGTH - idx; + contentDataRead -= sz; + + XMEMCPY(contentData + idx, buf, sz); + ret = wc_PKCS7_EncodeContentStreamHelper(pkcs7, cipherType, + aes, encContentOut, contentData, BER_OCTET_LENGTH, out, + &outIdx, esd); + if (ret != 0) { + XFREE(encContentOut, heap, DYNAMIC_TYPE_PKCS7); + XFREE(contentData, heap, DYNAMIC_TYPE_PKCS7); + return ret; + } + + /* copy over any remaining data */ + XMEMCPY(contentData, buf + sz, contentDataRead); + idx = (word32)contentDataRead; + } + else { + /* was not on an octet boundary, copy full + * amount over */ + XMEMCPY(contentData + idx, buf, sz); + idx += sz; + } + } while (totalSz < pkcs7->contentSz); + + /* add in padding to the end */ + if ((cipherType != WC_CIPHER_NONE) && (totalSz == pkcs7->contentSz)) { + int i; + + if (BER_OCTET_LENGTH < idx) { + XFREE(encContentOut, heap, DYNAMIC_TYPE_PKCS7); + XFREE(contentData, heap, DYNAMIC_TYPE_PKCS7); + return BAD_FUNC_ARG; + } + + for (i = 0; i < padSz; i++) { + contentData[idx + i] = (byte)padSz; + } + idx += padSz; + } + + /* encrypt and flush out remainder of content data */ + ret = wc_PKCS7_EncodeContentStreamHelper(pkcs7, cipherType, aes, + encContentOut, contentData, (int)idx, out, &outIdx, esd); + if (ret == 0) { + if (cipherType == WC_CIPHER_NONE && esd && + esd->contentDigestSet != 1) { + ret = wc_HashFinal(&esd->hash, esd->hashType, + esd->contentDigest + 2); + wc_HashFree(&esd->hash, esd->hashType); + } + } + + XFREE(encContentOut, heap, DYNAMIC_TYPE_PKCS7); + XFREE(contentData, heap, DYNAMIC_TYPE_PKCS7); + } + else { + if (in == NULL || out == NULL) { + return BAD_FUNC_ARG; + } + + switch (cipherType) { + case WC_CIPHER_NONE: + if (!pkcs7->detached) { + XMEMCPY(out, in, inSz); + } + if (esd && esd->contentDigestSet != 1) { + ret = wc_HashInit(&esd->hash, esd->hashType); + if (ret == 0) + ret = wc_HashUpdate(&esd->hash, esd->hashType, in, + (word32)inSz); + if (ret == 0) + ret = wc_HashFinal(&esd->hash, esd->hashType, + esd->contentDigest + 2); + wc_HashFree(&esd->hash, esd->hashType); + } + break; + + #ifndef NO_AES + case WC_CIPHER_AES_CBC: + ret = wc_AesCbcEncrypt(aes, out, in, (word32)inSz); + break; + #endif + + #ifdef WOLFSSL_AESGCM_STREAM + case WC_CIPHER_AES_GCM: + ret = wc_AesGcmEncryptUpdate(aes, out, in, (word32)inSz, NULL, 0); + break; + #endif + } + #ifdef WOLFSSL_ASYNC_CRYPT + /* async encrypt not available here, so block till done */ + if (cipherType != WC_CIPHER_NONE) { + ret = wc_AsyncWait(ret, &aes->asyncDev, WC_ASYNC_FLAG_NONE); + } + #endif + } + + (void)devId; + (void)heap; + + return ret; +} + /* build PKCS#7 signedData content type */ /* To get the output size then set output = 0 and *outputSz = 0 */ -static int PKCS7_EncodeSigned(PKCS7* pkcs7, ESD* esd, +static int PKCS7_EncodeSigned(PKCS7* pkcs7, const byte* hashBuf, word32 hashSz, byte* output, word32* outputSz, byte* output2, word32* output2Sz) { @@ -2374,10 +2756,19 @@ word32 totalSz, total2Sz; int idx = 0, ret = 0; int digEncAlgoId, digEncAlgoType; + int keyIdSize; byte* flatSignedAttribs = NULL; word32 flatSignedAttribsSz = 0; #ifdef WOLFSSL_SMALL_STACK + ESD* esd = NULL; +#else + ESD esd[1]; +#endif +#ifdef ASN_BER_TO_DER + word32 streamSz = 0; +#endif +#ifdef WOLFSSL_SMALL_STACK byte *signedDataOid = NULL; #else byte signedDataOid[MAX_OID_SZ]; @@ -2387,11 +2778,31 @@ byte signingTime[MAX_TIME_STRING_SZ]; if (pkcs7 == NULL || pkcs7->hashOID == 0 || - outputSz == NULL || hashSz == 0 || - hashBuf == NULL) { + outputSz == NULL) { + WOLFSSL_MSG("PKCS7 struct / outputSz null, or hashOID is 0"); return BAD_FUNC_ARG; } + if (hashSz == 0 && hashBuf != NULL) { + return BAD_FUNC_ARG; + } + + /* signature size varies with ECDSA, with a varying sign size the content + * hash must be known in order to create the surrounding ASN1 syntax + * properly before writing out the content and generating the hash on the + * fly and then creating the signature */ + if (hashBuf == NULL && pkcs7->publicKeyOID == ECDSAk) { + WOLFSSL_MSG("Pre-calculated content hash is needed in this case"); + return BAD_FUNC_ARG; + } + +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + keyIdSize = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + pkcs7->publicKeyOID))); +#else + keyIdSize = KEYID_SIZE; +#endif + #ifdef WOLFSSL_SMALL_STACK signedDataOid = (byte *)XMALLOC(MAX_OID_SZ, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); if (signedDataOid == NULL) { @@ -2423,7 +2834,7 @@ idx = ret; goto out; } - pkcs7->contentTypeSz = ret; + pkcs7->contentTypeSz = (word32)ret; } /* set signedData outer content type */ @@ -2432,20 +2843,28 @@ idx = ret; goto out; } - signedDataOidSz = ret; + signedDataOidSz = (word32)ret; if (pkcs7->sidType != DEGENERATE_SID) { esd->hashType = wc_OidGetHash(pkcs7->hashOID); - if (wc_HashGetDigestSize(esd->hashType) != (int)hashSz) { + if (hashBuf != NULL && + wc_HashGetDigestSize(esd->hashType) != (int)hashSz) { WOLFSSL_MSG("hashSz did not match hashOID"); idx = BUFFER_E; goto out; } - /* include hash */ + /* include hash if provided, otherwise create hash when processing + * content data */ esd->contentDigest[0] = ASN_OCTET_STRING; - esd->contentDigest[1] = (byte)hashSz; - XMEMCPY(&esd->contentDigest[2], hashBuf, hashSz); + if (hashBuf != NULL) { + esd->contentDigestSet = 1; + esd->contentDigest[1] = (byte)hashSz; + XMEMCPY(&esd->contentDigest[2], hashBuf, hashSz); + } + else { + esd->contentDigest[1] = (byte)wc_HashGetDigestSize(esd->hashType); + } } if (pkcs7->detached == 1) { @@ -2454,19 +2873,23 @@ esd->innerContSeqSz = 0; esd->contentInfoSeqSz = SetSequence(pkcs7->contentTypeSz, esd->contentInfoSeq); - } else { - esd->innerOctetsSz = SetOctetString(pkcs7->contentSz, esd->innerOctets); + } + else { + esd->innerOctetsSz = SetOctetStringEx(pkcs7->contentSz, esd->innerOctets, + pkcs7->encodeStream); esd->innerContSeqSz = SetExplicit(0, esd->innerOctetsSz + - pkcs7->contentSz, esd->innerContSeq); - esd->contentInfoSeqSz = SetSequence(pkcs7->contentSz + + pkcs7->contentSz, esd->innerContSeq, + pkcs7->encodeStream); + esd->contentInfoSeqSz = SetSequenceEx(pkcs7->contentSz + esd->innerOctetsSz + pkcs7->contentTypeSz + - esd->innerContSeqSz, esd->contentInfoSeq); + esd->innerContSeqSz, esd->contentInfoSeq, + pkcs7->encodeStream); } /* SignerIdentifier */ if (pkcs7->sidType == CMS_ISSUER_AND_SERIAL_NUMBER) { /* IssuerAndSerialNumber */ - esd->issuerSnSz = SetSerialNumber(pkcs7->issuerSn, pkcs7->issuerSnSz, + esd->issuerSnSz = (word32)SetSerialNumber(pkcs7->issuerSn, pkcs7->issuerSnSz, esd->issuerSn, MAX_SN_SZ, MAX_SN_SZ); signerInfoSz += esd->issuerSnSz; esd->issuerNameSz = SetSequence(pkcs7->issuerSz, esd->issuerName); @@ -2476,23 +2899,22 @@ if (pkcs7->version == 3) { /* RFC 4108 version MUST be 3 for firmware package signer */ - esd->signerVersionSz = SetMyVersion(3, esd->signerVersion, 0); + esd->signerVersionSz = (word32)SetMyVersion(3, esd->signerVersion, 0); } else { /* version MUST be 1 otherwise*/ - esd->signerVersionSz = SetMyVersion(1, esd->signerVersion, 0); + esd->signerVersionSz = (word32)SetMyVersion(1, esd->signerVersion, 0); } } else if (pkcs7->sidType == CMS_SKID) { /* SubjectKeyIdentifier */ - esd->issuerSKIDSz = SetOctetString(KEYID_SIZE, esd->issuerSKID); - esd->issuerSKIDSeqSz = SetExplicit(0, esd->issuerSKIDSz + KEYID_SIZE, - esd->issuerSKIDSeq); - signerInfoSz += (esd->issuerSKIDSz + esd->issuerSKIDSeqSz + - KEYID_SIZE); + esd->issuerSKIDSz = SetOctetString((word32)keyIdSize, esd->issuerSKID); + esd->issuerSKIDSeqSz = SetExplicit(0, esd->issuerSKIDSz + keyIdSize, + esd->issuerSKIDSeq, 0); + signerInfoSz += (esd->issuerSKIDSz + esd->issuerSKIDSeqSz + keyIdSize); /* version MUST be 3 */ - esd->signerVersionSz = SetMyVersion(3, esd->signerVersion, 0); + esd->signerVersionSz = (word32)SetMyVersion(3, esd->signerVersion, 0); } else if (pkcs7->sidType == DEGENERATE_SID) { /* no signer info added */ } else { @@ -2543,14 +2965,19 @@ FlattenAttributes(pkcs7, flatSignedAttribs, esd->signedAttribs, esd->signedAttribsCount); esd->signedAttribSetSz = SetImplicit(ASN_SET, 0, esd->signedAttribsSz, - esd->signedAttribSet); + esd->signedAttribSet, 0); } else { esd->signedAttribSetSz = 0; } - /* Calculate the final hash and encrypt it. */ - ret = wc_PKCS7_SignedDataBuildSignature(pkcs7, flatSignedAttribs, - flatSignedAttribsSz, esd); + if (pkcs7->publicKeyOID != ECDSAk && hashBuf == NULL) { + ret = wc_PKCS7_GetSignSize(pkcs7); + esd->encContentDigestSz = (word32)ret; + } + else { + ret = wc_PKCS7_SignedDataBuildSignature(pkcs7, flatSignedAttribs, + flatSignedAttribsSz, esd); + } if (ret < 0) { idx = ret; goto out; @@ -2570,15 +2997,17 @@ /* certificates [0] IMPLICIT CertificateSet */ /* get total certificates size */ - certPtr = pkcs7->certList; - while (certPtr != NULL) { - certSetSz += certPtr->derSz; - certPtr = certPtr->next; + if (pkcs7->noCerts != 1) { + certPtr = pkcs7->certList; + while (certPtr != NULL) { + certSetSz += certPtr->derSz; + certPtr = certPtr->next; + } } certPtr = NULL; if (certSetSz > 0) - esd->certsSetSz = SetImplicit(ASN_SET, 0, certSetSz, esd->certsSet); + esd->certsSetSz = SetImplicit(ASN_SET, 0, certSetSz, esd->certsSet, 0); if (pkcs7->sidType != DEGENERATE_SID) { esd->singleDigAlgoIdSz = SetAlgoID(pkcs7->hashOID, esd->singleDigAlgoId, @@ -2588,27 +3017,56 @@ if (pkcs7->version == 3) { /* RFC 4108 version MUST be 3 for firmware package signer */ - esd->versionSz = SetMyVersion(3, esd->version, 0); + esd->versionSz = (word32)SetMyVersion(3, esd->version, 0); } else { - esd->versionSz = SetMyVersion(1, esd->version, 0); + esd->versionSz = (word32)SetMyVersion(1, esd->version, 0); } totalSz = esd->versionSz + esd->singleDigAlgoIdSz + esd->digAlgoIdSetSz + esd->contentInfoSeqSz + pkcs7->contentTypeSz + - esd->innerContSeqSz + esd->innerOctetsSz + pkcs7->contentSz; + esd->innerContSeqSz + esd->innerOctetsSz; + +#ifdef ASN_BER_TO_DER + if (pkcs7->encodeStream) { + word32 tmpIdx = 0; + totalSz += (3 * ASN_INDEF_END_SZ) ; /* 00's for BER with inner content */ + + StreamOctetString(pkcs7->content, pkcs7->contentSz, NULL, &streamSz, + &tmpIdx); + totalSz += streamSz + (3 * ASN_INDEF_END_SZ); + } + else +#endif + { + totalSz += pkcs7->contentSz; + } total2Sz = esd->certsSetSz + certSetSz + signerInfoSz; if (pkcs7->detached) { totalSz -= pkcs7->contentSz; } - esd->innerSeqSz = SetSequence(totalSz + total2Sz, esd->innerSeq); + esd->innerSeqSz = SetSequenceEx(totalSz + total2Sz, esd->innerSeq, + pkcs7->encodeStream); totalSz += esd->innerSeqSz; - esd->outerContentSz = SetExplicit(0, totalSz + total2Sz, esd->outerContent); + if (pkcs7->encodeStream) { + totalSz += ASN_INDEF_END_SZ; + } + + esd->outerContentSz = SetExplicit(0, totalSz + total2Sz, + esd->outerContent, pkcs7->encodeStream); totalSz += esd->outerContentSz + signedDataOidSz; - esd->outerSeqSz = SetSequence(totalSz + total2Sz, esd->outerSeq); + if (pkcs7->encodeStream) { + totalSz += ASN_INDEF_END_SZ; + } + + esd->outerSeqSz = SetSequenceEx(totalSz + total2Sz, esd->outerSeq, + pkcs7->encodeStream); totalSz += esd->outerSeqSz; + if (pkcs7->encodeStream) { + totalSz += ASN_INDEF_END_SZ; + } /* if using header/footer, we are not returning the content */ if (output2 && output2Sz) { @@ -2632,7 +3090,11 @@ totalSz += total2Sz; } - if (totalSz > *outputSz) { + if (totalSz > *outputSz + #ifdef ASN_BER_TO_DER + && pkcs7->streamOutCb == NULL + #endif + ) { if (*outputSz == 0) { #ifdef HAVE_ECC if (pkcs7->publicKeyOID == ECDSAk) { @@ -2640,121 +3102,256 @@ } #endif *outputSz = totalSz; - idx = totalSz; + idx = (int)totalSz; goto out; } idx = BUFFER_E; goto out; } +#ifdef ASN_BER_TO_DER + if (output == NULL && pkcs7->streamOutCb == NULL) { +#else if (output == NULL) { +#endif idx = BUFFER_E; goto out; } idx = 0; - XMEMCPY(output + idx, esd->outerSeq, esd->outerSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->outerSeq, esd->outerSeqSz); idx += esd->outerSeqSz; - XMEMCPY(output + idx, signedDataOid, signedDataOidSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + signedDataOid, signedDataOidSz); idx += signedDataOidSz; - XMEMCPY(output + idx, esd->outerContent, esd->outerContentSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->outerContent, esd->outerContentSz); idx += esd->outerContentSz; - XMEMCPY(output + idx, esd->innerSeq, esd->innerSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->innerSeq, esd->innerSeqSz); idx += esd->innerSeqSz; - XMEMCPY(output + idx, esd->version, esd->versionSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->version, esd->versionSz); idx += esd->versionSz; - XMEMCPY(output + idx, esd->digAlgoIdSet, esd->digAlgoIdSetSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->digAlgoIdSet, esd->digAlgoIdSetSz); idx += esd->digAlgoIdSetSz; - XMEMCPY(output + idx, esd->singleDigAlgoId, esd->singleDigAlgoIdSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->singleDigAlgoId, esd->singleDigAlgoIdSz); idx += esd->singleDigAlgoIdSz; - XMEMCPY(output + idx, esd->contentInfoSeq, esd->contentInfoSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->contentInfoSeq, esd->contentInfoSeqSz); idx += esd->contentInfoSeqSz; - XMEMCPY(output + idx, pkcs7->contentType, pkcs7->contentTypeSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + pkcs7->contentType, pkcs7->contentTypeSz); idx += pkcs7->contentTypeSz; - XMEMCPY(output + idx, esd->innerContSeq, esd->innerContSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->innerContSeq, esd->innerContSeqSz); idx += esd->innerContSeqSz; - XMEMCPY(output + idx, esd->innerOctets, esd->innerOctetsSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + esd->innerOctets, esd->innerOctetsSz); idx += esd->innerOctetsSz; /* support returning header and footer without content */ if (output2 && output2Sz) { - *outputSz = idx; + *outputSz = (word32)idx; idx = 0; } else { - if (!pkcs7->detached && pkcs7->content != NULL && pkcs7->contentSz > 0) { - XMEMCPY(output + idx, pkcs7->content, pkcs7->contentSz); - idx += pkcs7->contentSz; + if ( + #ifdef ASN_BER_TO_DER + (pkcs7->content != NULL || pkcs7->getContentCb != NULL) + #else + pkcs7->content != NULL + #endif + && pkcs7->contentSz > 0) { + wc_PKCS7_EncodeContentStream(pkcs7, esd, NULL, pkcs7->content, + pkcs7->contentSz, (output)? output + idx : NULL, WC_CIPHER_NONE); + if (!pkcs7->detached) { + #ifdef ASN_BER_TO_DER + if (pkcs7->encodeStream) { + byte indefEnd[ASN_INDEF_END_SZ * 3]; + word32 localIdx = 0; + + idx += streamSz; + + /* end of content octet string */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of inner content seq */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of inner content info seq */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + indefEnd, localIdx); + idx += localIdx; + } + else + #endif + { + idx += pkcs7->contentSz; + } + } } output2 = output; } /* certificates */ - XMEMCPY(output2 + idx, esd->certsSet, esd->certsSetSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->certsSet, esd->certsSetSz); idx += esd->certsSetSz; - certPtr = pkcs7->certList; - while (certPtr != NULL) { - XMEMCPY(output2 + idx, certPtr->der, certPtr->derSz); - idx += certPtr->derSz; - certPtr = certPtr->next; + + if (pkcs7->noCerts != 1) { + certPtr = pkcs7->certList; + while (certPtr != NULL) { + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + certPtr->der, certPtr->derSz); + idx += certPtr->derSz; + certPtr = certPtr->next; + } } + wc_PKCS7_FreeCertSet(pkcs7); - XMEMCPY(output2 + idx, esd->signerInfoSet, esd->signerInfoSetSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->signerInfoSet, esd->signerInfoSetSz); idx += esd->signerInfoSetSz; - XMEMCPY(output2 + idx, esd->signerInfoSeq, esd->signerInfoSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->signerInfoSeq, esd->signerInfoSeqSz); idx += esd->signerInfoSeqSz; - XMEMCPY(output2 + idx, esd->signerVersion, esd->signerVersionSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->signerVersion, esd->signerVersionSz); idx += esd->signerVersionSz; /* SignerIdentifier */ if (pkcs7->sidType == CMS_ISSUER_AND_SERIAL_NUMBER) { /* IssuerAndSerialNumber */ - XMEMCPY(output2 + idx, esd->issuerSnSeq, esd->issuerSnSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->issuerSnSeq, esd->issuerSnSeqSz); idx += esd->issuerSnSeqSz; - XMEMCPY(output2 + idx, esd->issuerName, esd->issuerNameSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->issuerName, esd->issuerNameSz); idx += esd->issuerNameSz; - XMEMCPY(output2 + idx, pkcs7->issuer, pkcs7->issuerSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + pkcs7->issuer, pkcs7->issuerSz); idx += pkcs7->issuerSz; - XMEMCPY(output2 + idx, esd->issuerSn, esd->issuerSnSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->issuerSn, esd->issuerSnSz); idx += esd->issuerSnSz; } else if (pkcs7->sidType == CMS_SKID) { /* SubjectKeyIdentifier */ - XMEMCPY(output2 + idx, esd->issuerSKIDSeq, esd->issuerSKIDSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->issuerSKIDSeq, esd->issuerSKIDSeqSz); idx += esd->issuerSKIDSeqSz; - XMEMCPY(output2 + idx, esd->issuerSKID, esd->issuerSKIDSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->issuerSKID, esd->issuerSKIDSz); idx += esd->issuerSKIDSz; - XMEMCPY(output2 + idx, pkcs7->issuerSubjKeyId, KEYID_SIZE); - idx += KEYID_SIZE; + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + pkcs7->issuerSubjKeyId, (word32)keyIdSize); + idx += keyIdSize; } else if (pkcs7->sidType == DEGENERATE_SID) { /* no signer infos in degenerate case */ } else { idx = SKID_E; goto out; } - XMEMCPY(output2 + idx, esd->signerDigAlgoId, esd->signerDigAlgoIdSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->signerDigAlgoId, esd->signerDigAlgoIdSz); idx += esd->signerDigAlgoIdSz; /* SignerInfo:Attributes */ if (flatSignedAttribsSz > 0) { - XMEMCPY(output2 + idx, esd->signedAttribSet, esd->signedAttribSetSz); + /* if the original hash buffer passed in was null then recreate the + * signature */ + if (hashBuf == NULL && pkcs7->sidType != DEGENERATE_SID) { + /* recreate flat attribs after the content hash is known if needed + * build up signed attributes, include contentType, signingTime, and + messageDigest by default */ + esd->signedAttribsCount = 0; + esd->signedAttribsSz = 0; + ret = wc_PKCS7_BuildSignedAttributes(pkcs7, esd, pkcs7->contentType, + pkcs7->contentTypeSz, + contentTypeOid, sizeof(contentTypeOid), + messageDigestOid, sizeof(messageDigestOid), + signingTimeOid, sizeof(signingTimeOid), + signingTime, sizeof(signingTime)); + if (ret < 0) { + idx = ret; + goto out; + } + + if (esd->signedAttribsSz > 0) { + if (flatSignedAttribs == NULL) { + idx = MEMORY_E; + goto out; + } + + flatSignedAttribsSz = esd->signedAttribsSz; + FlattenAttributes(pkcs7, flatSignedAttribs, + esd->signedAttribs, esd->signedAttribsCount); + } else { + esd->signedAttribSetSz = 0; + } + } + + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->signedAttribSet, esd->signedAttribSetSz); idx += esd->signedAttribSetSz; - XMEMCPY(output2 + idx, flatSignedAttribs, flatSignedAttribsSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + flatSignedAttribs, flatSignedAttribsSz); idx += flatSignedAttribsSz; } - XMEMCPY(output2 + idx, esd->digEncAlgoId, esd->digEncAlgoIdSz); + if (hashBuf == NULL && pkcs7->sidType != DEGENERATE_SID) { + /* Calculate the final hash and encrypt it. */ + WOLFSSL_MSG("Recreating signature with new hash"); + ret = wc_PKCS7_SignedDataBuildSignature(pkcs7, flatSignedAttribs, + flatSignedAttribsSz, esd); + if (ret < 0) { + idx = ret; + goto out; + } + } + + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->digEncAlgoId, esd->digEncAlgoIdSz); idx += esd->digEncAlgoIdSz; - XMEMCPY(output2 + idx, esd->signerDigest, esd->signerDigestSz); + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->signerDigest, esd->signerDigestSz); idx += esd->signerDigestSz; - XMEMCPY(output2 + idx, esd->encContentDigest, esd->encContentDigestSz); + + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + esd->encContentDigest, esd->encContentDigestSz); idx += esd->encContentDigestSz; +#ifdef ASN_BER_TO_DER + if (pkcs7->encodeStream) { + byte indefEnd[ASN_INDEF_END_SZ * 3]; + word32 localIdx = 0; + + /* end of signedData seq */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of outer content set */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of outer content info seq */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + wc_PKCS7_WriteOut(pkcs7, (output2)? (output2 + idx) : NULL, + indefEnd, localIdx); + idx += localIdx; + } +#endif + if (output2Sz) { - *output2Sz = idx; + *output2Sz = (word32)idx; idx = 0; /* success */ } else { - *outputSz = idx; + *outputSz = (word32)idx; } out: @@ -2785,32 +3382,25 @@ word32* outputFootSz) { int ret; -#ifdef WOLFSSL_SMALL_STACK - ESD* esd; -#else - ESD esd[1]; -#endif /* other args checked in wc_PKCS7_EncodeSigned_ex */ - if (pkcs7 == NULL || outputFoot == NULL || outputFootSz == NULL) { + if (pkcs7 == NULL) { return BAD_FUNC_ARG; } -#ifdef WOLFSSL_SMALL_STACK - esd = (ESD*)XMALLOC(sizeof(ESD), pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (esd == NULL) - return MEMORY_E; +#ifndef ASN_BER_TO_DER + if (outputFoot == NULL || outputFootSz == NULL) +#else + if (pkcs7->getContentCb == NULL && + (outputFoot == NULL || outputFootSz == NULL)) #endif + { + return BAD_FUNC_ARG; + } - XMEMSET(esd, 0, sizeof(ESD)); - - ret = PKCS7_EncodeSigned(pkcs7, esd, hashBuf, hashSz, + ret = PKCS7_EncodeSigned(pkcs7, hashBuf, hashSz, outputHead, outputHeadSz, outputFoot, outputFootSz); -#ifdef WOLFSSL_SMALL_STACK - XFREE(esd, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); -#endif - return ret; } @@ -2897,55 +3487,50 @@ int wc_PKCS7_EncodeSignedData(PKCS7* pkcs7, byte* output, word32 outputSz) { int ret; - int hashSz; - enum wc_HashType hashType; - byte hashBuf[WC_MAX_DIGEST_SIZE]; -#ifdef WOLFSSL_SMALL_STACK - ESD* esd; -#else - ESD esd[1]; -#endif /* other args checked in wc_PKCS7_EncodeSigned_ex */ - if (pkcs7 == NULL || (pkcs7->contentSz > 0 && pkcs7->content == NULL)) { + if (pkcs7 == NULL || (pkcs7->contentSz > 0 && + #ifdef ASN_BER_TO_DER + (pkcs7->content == NULL && pkcs7->getContentCb == NULL)) + #else + pkcs7->content == NULL) + #endif + ) { return BAD_FUNC_ARG; } - /* get hash type and size, validate hashOID */ - hashType = wc_OidGetHash(pkcs7->hashOID); - hashSz = wc_HashGetDigestSize(hashType); - if (hashSz < 0) - return hashSz; - -#ifdef WOLFSSL_SMALL_STACK - esd = (ESD*)XMALLOC(sizeof(ESD), pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (esd == NULL) - return MEMORY_E; -#endif + /* pre-calculate hash for ECC signatures */ + if (pkcs7->publicKeyOID == ECDSAk) { + int hashSz; + enum wc_HashType hashType; + byte hashBuf[WC_MAX_DIGEST_SIZE]; + wc_HashAlg hash; - XMEMSET(esd, 0, sizeof(ESD)); - esd->hashType = hashType; + /* get hash type and size, validate hashOID */ + hashType = wc_OidGetHash(pkcs7->hashOID); + hashSz = wc_HashGetDigestSize(hashType); + if (hashSz < 0) + return hashSz; - /* calculate hash for content */ - ret = wc_HashInit(&esd->hash, esd->hashType); - if (ret == 0) { - ret = wc_HashUpdate(&esd->hash, esd->hashType, + /* calculate hash for content */ + ret = wc_HashInit(&hash, hashType); + if (ret == 0) { + ret = wc_HashUpdate(&hash, hashType, pkcs7->content, pkcs7->contentSz); + if (ret == 0) { + ret = wc_HashFinal(&hash, hashType, hashBuf); + } + wc_HashFree(&hash, hashType); + } if (ret == 0) { - ret = wc_HashFinal(&esd->hash, esd->hashType, hashBuf); + ret = PKCS7_EncodeSigned(pkcs7, hashBuf, (word32)hashSz, + output, &outputSz, NULL, NULL); } - wc_HashFree(&esd->hash, esd->hashType); } - - if (ret == 0) { - ret = PKCS7_EncodeSigned(pkcs7, esd, hashBuf, hashSz, - output, &outputSz, NULL, NULL); + else { + ret = PKCS7_EncodeSigned(pkcs7, NULL, 0, output, &outputSz, + NULL, NULL); } - -#ifdef WOLFSSL_SMALL_STACK - XFREE(esd, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); -#endif - return ret; } @@ -3090,7 +3675,7 @@ ret = wc_InitRng_ex(&rng, pkcs7->heap, pkcs7->devId); if (ret != 0) { - ForceZero(encrypted, encryptedSz); + ForceZero(encrypted, (word32)encryptedSz); XFREE(encrypted, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } @@ -3098,7 +3683,7 @@ /* 2: build up SignedData, encapsulating EncryptedData */ pkcs7->rng = &rng; pkcs7->content = encrypted; - pkcs7->contentSz = encryptedSz; + pkcs7->contentSz = (word32)encryptedSz; pkcs7->contentOID = ENCRYPTED_DATA; pkcs7->hashOID = hashOID; pkcs7->encryptOID = signOID; @@ -3112,7 +3697,7 @@ WOLFSSL_MSG("Error encoding CMS SignedData content type"); } - ForceZero(encrypted, encryptedSz); + ForceZero(encrypted, (word32)encryptedSz); XFREE(encrypted, pkcs7->heap, DYNAMIC_TYPE_PKCS7); pkcs7->rng = NULL; wc_FreeRng(&rng); @@ -3462,11 +4047,11 @@ WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret >= 0) { - ret = wc_RsaSSL_Verify(sig, sigSz, digest, MAX_PKCS7_DIGEST_SZ, + ret = wc_RsaSSL_Verify(sig, (word32)sigSz, digest, MAX_PKCS7_DIGEST_SZ, key); } #ifdef WOLFSSL_ASYNC_CRYPT - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif FreeDecodedCert(dCert); wc_FreeRsaKey(key); @@ -3590,10 +4175,10 @@ WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret >= 0) { - ret = wc_ecc_verify_hash(sig, sigSz, hash, hashSz, &res, key); + ret = wc_ecc_verify_hash(sig, (word32)sigSz, hash, hashSz, &res, key); } #ifdef WOLFSSL_ASYNC_CRYPT - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif FreeDecodedCert(dCert); @@ -3669,7 +4254,7 @@ ret = wc_HashGetDigestSize(hashType); if (ret < 0) return ret; - hashSz = ret; + hashSz = (word32)ret; if (signedAttribSz > 0) { if (signedAttrib == NULL) @@ -3750,7 +4335,7 @@ digIdx += hashSz; XMEMCPY(pkcs7Digest, digestInfo, digIdx); - *pkcs7DigestSz = digIdx; + *pkcs7DigestSz = (word32)digIdx; /* set plain digest pointer */ *plainDigest = pkcs7Digest + digIdx - hashSz; @@ -3779,7 +4364,10 @@ word32 hashSz) { int ret = 0, digestSz = 0, innerAttribSz = 0; + int contentLen = 0; word32 idx = 0; + word32 contentIdx = 0; + byte* content = NULL; byte* digestBuf = NULL; #ifdef WOLFSSL_SMALL_STACK byte* digest = NULL; @@ -3838,7 +4426,29 @@ #endif XMEMSET(digest, 0, MAX_PKCS7_DIGEST_SZ); - ret = wc_Hash(hashType, pkcs7->content, pkcs7->contentSz, digest, + content = pkcs7->content; + contentLen = (int)pkcs7->contentSz; + + if (pkcs7->contentIsPkcs7Type == 1) { + /* Content follows PKCS#7 RFC, which defines type as ANY. CMS + * mandates OCTET_STRING which has already been stripped off. + * For PKCS#7 message digest calculation, digest is calculated + * only on the "value" of the DER encoding. As such, advance past + * the tag and length */ + if (contentLen > 1) { + contentIdx++; + } + + if (GetLength_ex(content, &contentIdx, &contentLen, + (word32)contentLen, 1) < 0) { + #ifdef WOLFSSL_SMALL_STACK + XFREE(digest, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif + return ASN_PARSE_E; + } + } + + ret = wc_Hash(hashType, content + contentIdx, (word32)contentLen, digest, MAX_PKCS7_DIGEST_SZ); if (ret < 0) { WOLFSSL_MSG("Error hashing PKCS7 content for verification"); @@ -4019,11 +4629,11 @@ #ifndef NO_RSA case RSAk: - ret = wc_PKCS7_RsaVerify(pkcs7, sig, sigSz, pkcs7Digest, + ret = wc_PKCS7_RsaVerify(pkcs7, sig, (int)sigSz, pkcs7Digest, pkcs7DigestSz); if (ret < 0) { WOLFSSL_MSG("PKCS#7 verification failed, trying CMS"); - ret = wc_PKCS7_RsaVerify(pkcs7, sig, sigSz, plainDigest, + ret = wc_PKCS7_RsaVerify(pkcs7, sig, (int)sigSz, plainDigest, plainDigestSz); } break; @@ -4031,7 +4641,7 @@ #ifdef HAVE_ECC case ECDSAk: - ret = wc_PKCS7_EcdsaVerify(pkcs7, sig, sigSz, plainDigest, + ret = wc_PKCS7_EcdsaVerify(pkcs7, sig, (int)sigSz, plainDigest, plainDigestSz); break; #endif @@ -4077,7 +4687,7 @@ /* if sigOID is already RSAk */ case RSAk: - pkcs7->publicKeyOID = sigOID; + pkcs7->publicKeyOID = (word32)sigOID; break; #endif @@ -4089,7 +4699,7 @@ /* if sigOID is already DSAk */ case DSAk: - pkcs7->publicKeyOID = sigOID; + pkcs7->publicKeyOID = (word32)sigOID; break; #endif @@ -4109,7 +4719,7 @@ /* if sigOID is already ECDSAk */ case ECDSAk: - pkcs7->publicKeyOID = sigOID; + pkcs7->publicKeyOID = (word32)sigOID; break; #endif @@ -4153,7 +4763,7 @@ int oidIdx; PKCS7DecodedAttrib* attrib; - if (GetSequence(in, &idx, &length, inSz) < 0) + if (GetSequence(in, &idx, &length, (word32)inSz) < 0) return ASN_PARSE_E; attrib = (PKCS7DecodedAttrib*)XMALLOC(sizeof(PKCS7DecodedAttrib), @@ -4163,8 +4773,8 @@ } XMEMSET(attrib, 0, sizeof(PKCS7DecodedAttrib)); - oidIdx = idx; - if (GetObjectId(in, &idx, &oid, oidIgnoreType, inSz) + oidIdx = (int)idx; + if (GetObjectId(in, &idx, &oid, oidIgnoreType, (word32)inSz) < 0) { XFREE(attrib, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ASN_PARSE_E; @@ -4179,7 +4789,7 @@ XMEMCPY(attrib->oid, in + oidIdx, attrib->oidSz); /* Get Set that contains the printable string value */ - if (GetSet(in, &idx, &length, inSz) < 0) { + if (GetSet(in, &idx, &length, (word32)inSz) < 0) { XFREE(attrib->oid, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(attrib, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ASN_PARSE_E; @@ -4248,8 +4858,8 @@ word32* idxIn, int degenerate, byte** signedAttrib, int* signedAttribSz) { int ret = 0; - int length; - int version; + int length = 0; + int version = 0; word32 sigOID = 0, hashOID = 0; word32 idx = *idxIn, localIdx; byte tag; @@ -4388,7 +4998,7 @@ /* store public key type based on digestEncryptionAlgorithm */ if (ret == 0) { - ret = wc_PKCS7_SetPublicKeyOID(pkcs7, sigOID); + ret = wc_PKCS7_SetPublicKeyOID(pkcs7, (int)sigOID); if (ret < 0) { WOLFSSL_MSG("Failed to set public key OID from signature"); } @@ -4407,7 +5017,245 @@ return ret; } +/* parse input to get single/multiple octet strings. + * get each octet string from stream up to the size defined by + * MAX_PKCS7_STREAM_BUFFER then hash and store them to the content buffer. + * hash is stored to pkcs7->stream->hashBuf and its size in + * pkcs7->stream->hashBufSz if keepContent is true, accumulates content into + * pkcs7->stream->content and stores its size in pkcs7->stream->contentSz. + */ +#ifndef NO_PKCS7_STREAM +static int wc_PKCS7_HandleOctetStrings(PKCS7* pkcs7, byte* in, word32 inSz, + word32* tmpIdx, word32* idx, int keepContent) +{ + int ret, length; + word32 msgSz, i, contBufSz; + byte tag; + byte* msg = NULL; + byte* tempBuf = NULL; + + /* allow 0 for inSz in streaming */ + if (inSz == 0) { + return WC_PKCS7_WANT_READ_E; + } + + if (pkcs7 == NULL || in == NULL || idx == NULL) + return BAD_FUNC_ARG; + + /* no content case, do nothing */ + if (pkcs7->stream->noContent) { + if (pkcs7->content && pkcs7->contentSz > 0) { + if (pkcs7->stream->content != NULL) { + XFREE(pkcs7->stream->content, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + pkcs7->stream->content = NULL; + } + pkcs7->stream->content = (byte*)XMALLOC(pkcs7->contentSz, + pkcs7->heap, DYNAMIC_TYPE_PKCS7); + if (pkcs7->stream->content == NULL) { + WOLFSSL_MSG("Failed to grow content buffer."); + return MEMORY_E; + } + XMEMCPY(pkcs7->stream->content, pkcs7->content, pkcs7->contentSz); + pkcs7->stream->contentSz = pkcs7->contentSz; + } + return 0; + } + + /* free pkcs7->contentDynamic buffer */ + if (pkcs7->contentDynamic != NULL) { + XFREE(pkcs7->contentDynamic, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + pkcs7->contentDynamic = NULL; + } + + while(1) { + if ((ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz, + pkcs7->stream->expected, &msg, idx)) != 0) { + break; + } + + msgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length:inSz; + + if (pkcs7->stream->currContRmnSz == 0) { + + /* processed single OCTET STRING, try to find another one. */ + if ((ret = GetASNTag(msg, idx, &tag, msgSz)) < 0) { + break; + } + + /* if another OCTET STRING is found, get its length */ + if (ret == 0 && tag == ASN_OCTET_STRING) { + + if (ret == 0 && GetLength_ex(msg, idx, &length, msgSz, + NO_USER_CHECK) < 0){ + ret = ASN_PARSE_E; + break; + } + + /* set up for next octet string */ + pkcs7->stream->currContSz = (word32)length; + pkcs7->stream->currContRmnSz = (word32)length; + pkcs7->stream->expected = min(pkcs7->stream->currContRmnSz, + MAX_PKCS7_STREAM_BUFFER); + + /* advance read index */ + if (wc_PKCS7_StreamEndCase(pkcs7, tmpIdx, idx) != 0) { + break; + } + + /* check if expected data is available in stream */ + ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz, + pkcs7->stream->expected, &msg, idx); + if (ret == WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) { + break; /* ask user more input */ + } + + /* data available, continue processing */ + continue; + } + /* reached to the end of contents. trailing zeros may follow. */ + else if (ret == 0 && tag == ASN_EOC) { + + /* ASN_EOC tag and one zero follows to show the end of + * in-definite length encoding. + * number of indef is stored in pkcs7->stream->cntIdfCnt. + */ + pkcs7->stream->expected = (word32)(ASN_TAG_SZ + TRAILING_ZERO) * + pkcs7->stream->cntIdfCnt; + + /* dec idx by one since already consumed to get ASN_EOC */ + (*idx)--; + + if (wc_PKCS7_StreamEndCase(pkcs7, tmpIdx, idx) != 0) { + break; + } + + /* check if expected data is available in stream */ + ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz, + pkcs7->stream->expected, &msg, idx); + if (ret == WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) { + break; /* ask user more input */ + } + + /* data available, continue processing trailing zeros */ + for (i = 0; i < pkcs7->stream->expected; i++) { + if (msg[*idx + i] != 0) { + ret = ASN_PARSE_E; + break; + } + } + /* reset indef-length count */ + pkcs7->stream->cntIdfCnt = 0; + + /* advance read index */ + *idx += pkcs7->stream->expected; + + if (wc_PKCS7_StreamEndCase(pkcs7, tmpIdx, idx) != 0) { + break; + } + + /* handled OCTET STRINGs successfully */ + ret = 0; + break; + } + /* reached to the end of contents without trailing zeros */ + else if (ret == 0) { + + /* dec idx by one since already consumed to get ASN_EOC */ + (*idx)--; + + if (wc_PKCS7_StreamEndCase(pkcs7, tmpIdx, idx) != 0) { + break; + } + + ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz, + pkcs7->stream->expected, &msg, idx); + if (ret == WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) { + break; + } + + /* handled OCTET STRINGs successfully */ + ret = 0; + break; + } + else { + break; + } + } + else { + /* got partial octet string data */ + /* accumulate partial octet string to buffer */ + if (keepContent) { + + /* store current content buffer temporarily */ + tempBuf = pkcs7->stream->content; + pkcs7->stream->content = NULL; + + /* grow content buffer */ + contBufSz = pkcs7->stream->accumContSz; + pkcs7->stream->accumContSz += pkcs7->stream->expected; + + pkcs7->stream->content = + (byte*)XMALLOC(pkcs7->stream->accumContSz, + pkcs7->heap, DYNAMIC_TYPE_PKCS7); + + if (pkcs7->stream->content == NULL) { + WOLFSSL_MSG("failed to grow content buffer."); + if (tempBuf != NULL) { + XFREE(tempBuf, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + tempBuf = NULL; + } + ret = MEMORY_E; + break; + } + else { + /* accumulate content */ + if (tempBuf != NULL && contBufSz != 0) { + XMEMCPY(pkcs7->stream->content, tempBuf, contBufSz); + } + XMEMCPY(pkcs7->stream->content + contBufSz, msg + *idx, + pkcs7->stream->expected); + if (tempBuf != NULL) { + XFREE(tempBuf, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + tempBuf = NULL; + } + } + } + + *idx += pkcs7->stream->expected; + pkcs7->stream->currContRmnSz -= pkcs7->stream->expected; + pkcs7->stream->contentSz += pkcs7->stream->expected; + + if (wc_PKCS7_StreamEndCase(pkcs7, tmpIdx, idx) != 0) { + break; + } + + if (pkcs7->stream->currContRmnSz > 0) { + pkcs7->stream->expected = min(pkcs7->stream->currContRmnSz, + MAX_PKCS7_STREAM_BUFFER); + } + else { + /* Processed current OCTET STRING. Proceed to the next one. */ + pkcs7->stream->currContRmnSz = 0; + pkcs7->stream->currContSz = 0; + pkcs7->stream->expected= ASN_TAG_SZ + MAX_LENGTH_SZ; + + if (pkcs7->stream->maxLen > 0 && + (pkcs7->stream->maxLen - pkcs7->stream->totalRd) + < ASN_TAG_SZ + MAX_LENGTH_SZ) { + /* seems reached to end of content */ + ret = 0; + break; + } + } + + /* data available */ + continue; + } + } + return ret; +} +#endif /* !NO_PKCS7_STREAM */ /* Finds the certificates in the message and saves it. By default allows * degenerate cases which can have no signer. * @@ -4428,11 +5276,14 @@ byte* cert = NULL; byte* signedAttrib = NULL; byte* contentType = NULL; + int encapContentInfoLen = 0; int contentSz = 0, sigSz = 0, certSz = 0, signedAttribSz = 0; word32 localIdx, start; + word32 certIdx, certIdx2; byte degenerate = 0; byte detached = 0; byte tag = 0; + word16 contentIsPkcs7Type = 0; #ifdef ASN_BER_TO_DER byte* der; #endif @@ -4443,11 +5294,14 @@ word32 pkiMsgSz = inSz; #ifndef NO_PKCS7_STREAM word32 stateIdx = 0; + word32 hashOID = 0; + enum wc_HashType hashType = WC_HASH_TYPE_NONE; + byte* src = NULL; + word32 srcSz; #endif - byte* pkiMsg2 = in2; word32 pkiMsg2Sz = in2Sz; - + (void)keepContent; if (pkcs7 == NULL) return BAD_FUNC_ARG; @@ -4490,11 +5344,19 @@ break; } - if ((ret = wc_PKCS7_SetMaxStream(pkcs7, in, inSz)) != 0) { + pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: inSz; + + /* get content info size */ + localIdx = 0; + if (GetSequence_ex(pkiMsg, &localIdx, &length, pkiMsgSz, + NO_USER_CHECK) < 0) { break; } - pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: - inSz; + if (ret == 0 && length > 0) + pkcs7->stream->maxLen = length + localIdx; + else + pkcs7->stream->maxLen = inSz; + #endif /* determine total message size */ @@ -4509,13 +5371,16 @@ ret = ASN_PARSE_E; if (ret == 0 && length == 0 && pkiMsg[idx-1] == ASN_INDEF_LENGTH) { + + #if defined(NO_PKCS7_STREAM) #ifdef ASN_BER_TO_DER word32 len = 0; ret = wc_BerToDer(pkiMsg, pkiMsgSz, NULL, &len); - if (ret != LENGTH_ONLY_E) + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) return ret; - pkcs7->der = (byte*)XMALLOC(len, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + pkcs7->der = (byte*)XMALLOC(len, pkcs7->heap, + DYNAMIC_TYPE_PKCS7); if (pkcs7->der == NULL) return MEMORY_E; ret = wc_BerToDer(pkiMsg, pkiMsgSz, pkcs7->der, &len); @@ -4554,6 +5419,11 @@ #else ret = BER_INDEF_E; #endif + #else + /* the bundle has indefinite length encoding */ + pkcs7->stream->indefLen = 1; + + #endif /* NO_PKCS7_STREAM */ } /* Get the contentInfo contentType */ @@ -4593,15 +5463,53 @@ WOLFSSL_MSG("PKCS#7 signedData needs to be version 1 or 3"); ret = ASN_VERSION_E; } - pkcs7->version = version; + pkcs7->version = (byte)version; /* Get the set of DigestAlgorithmIdentifiers */ if (ret == 0 && GetSet(pkiMsg, &idx, &length, pkiMsgSz) < 0) ret = ASN_PARSE_E; + localIdx = idx; + + #ifndef NO_PKCS7_STREAM + /* initialize hashType*/ + pkcs7->stream->hashType = WC_HASH_TYPE_NONE; + + /* Get the first DigestAlgorithmIdentifier from the SET */ + if (ret == 0 && length > 0) { + if (GetAlgoId(pkiMsg, &idx, &hashOID, oidHashType, pkiMsgSz) + < 0) + ret = ASN_PARSE_E; + + pkcs7->hashOID = (int)hashOID; + /* get hash type */ + hashType = wc_OidGetHash(pkcs7->hashOID); + + if (hashType == WC_HASH_TYPE_NONE) { + WOLFSSL_MSG("Error getting hash type for PKCS7 content" + " verification"); + ret = ASN_PARSE_E; + } + if (wc_HashGetDigestSize(hashType) < 0) { + WOLFSSL_MSG("Error getting digest size"); + ret = ASN_PARSE_E; + } + /* store hashType for later hashing */ + pkcs7->stream->hashType = hashType; + + /* restore idx */ + idx = localIdx; + + WOLFSSL_MSG("DigestAlgorithmIdentifier found in bundle"); + } + #endif /* !NO_PKCS7_STREAM */ + /* Skip the set. */ idx += length; degenerate = (length == 0) ? 1 : 0; + #ifndef NO_PKCS7_STREAM + pkcs7->stream->degenerate = degenerate; + #endif /* !NO_PKCS7_STREAM */ if (pkcs7->noDegenerate == 1 && degenerate == 1) { ret = PKCS7_NO_SIGNER_E; } @@ -4617,18 +5525,24 @@ pkcs7->stream->maxLen += pkiMsg2Sz + pkcs7->contentSz; } wc_PKCS7_StreamStoreVar(pkcs7, totalSz, 0, 0); + #endif wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE2); + + #ifndef NO_PKCS7_STREAM + pkcs7->stream->expected = MAX_SEQ_SZ + MAX_OID_SZ + ASN_TAG_SZ + + MAX_LENGTH_SZ + ASN_TAG_SZ + MAX_LENGTH_SZ; + #endif /* !NO_PKCS7_STREAM */ FALL_THROUGH; case WC_PKCS7_VERIFY_STAGE2: #ifndef NO_PKCS7_STREAM if ((ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz + in2Sz, - MAX_SEQ_SZ + MAX_OID_SZ + ASN_TAG_SZ + MAX_LENGTH_SZ - + ASN_TAG_SZ + MAX_LENGTH_SZ, &pkiMsg, &idx)) != 0) { + pkcs7->stream->expected, &pkiMsg, &idx)) != 0) { break; } + degenerate = pkcs7->stream->degenerate; wc_PKCS7_StreamGetVar(pkcs7, &totalSz, 0, 0); if (pkcs7->stream->length > 0) @@ -4642,7 +5556,7 @@ #endif /* Get the inner ContentInfo sequence */ - if (GetSequence_ex(pkiMsg, &idx, &length, pkiMsgSz, + if (GetSequence_ex(pkiMsg, &idx, &encapContentInfoLen, pkiMsgSz, NO_USER_CHECK) < 0) ret = ASN_PARSE_E; @@ -4650,8 +5564,13 @@ if (ret == 0) { int isIndef = 0; word32 tmpIdx = idx; - if (length == 0 && pkiMsg[idx-1] == ASN_INDEF_LENGTH) { + if (encapContentInfoLen == 0 && + pkiMsg[idx-1] == ASN_INDEF_LENGTH) { isIndef = 1; + #ifndef NO_PKCS7_STREAM + /* count up indef-length count */ + pkcs7->stream->cntIdfCnt++; + #endif } if (GetASNObjectId(pkiMsg, &idx, &length, pkiMsgSz) == 0) { contentType = pkiMsg + tmpIdx; @@ -4668,6 +5587,9 @@ } else if (pkiMsg[idx] == ASN_EOC && pkiMsg[idx+1] == 0) { idx += 2; /* skip EOF + zero byte */ + #ifndef NO_PKCS7_STREAM + pkcs7->stream->cntIdfCnt--; + #endif } } } @@ -4675,7 +5597,7 @@ if (ret != 0) break; - /* Check for content info, it could be omitted when degenerate */ + /* Check for content, it could be omitted when degenerate */ localIdx = idx; ret = 0; if (localIdx + 1 > pkiMsgSz) { @@ -4683,75 +5605,148 @@ break; } + /* Set error state if no more data left in ContentInfo, meaning + * no content - may be detached. Will recover from error below */ + if ((encapContentInfoLen != 0) && + (encapContentInfoLen - contentTypeSz == 0)) { + ret = ASN_PARSE_E; + #ifndef NO_PKCS7_STREAM + pkcs7->stream->noContent = 1; + #endif + } + + /* PKCS#7 spec: + * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL + * CMS spec: + * eContent [0] EXPLICIT OCTET STRING OPTIONAL + */ if (ret == 0 && GetASNTag(pkiMsg, &localIdx, &tag, pkiMsgSz) != 0) ret = ASN_PARSE_E; if (ret == 0 && tag != (ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC | 0)) ret = ASN_PARSE_E; - if (ret == 0 && GetLength_ex(pkiMsg, &localIdx, &length, pkiMsgSz, - NO_USER_CHECK) <= 0) - ret = ASN_PARSE_E; + /* Get length of inner eContent payload. For CMS, spec defines + * OCTET_STRING will be next. If so, we use the length retrieved + * there. PKCS#7 spec defines ANY as eContent type. In this case + * we fall back and save this content length for use later */ + if (ret == 0 && pkiMsg[localIdx] != ASN_INDEF_LENGTH) { + if (GetLength_ex(pkiMsg, &localIdx, &length, pkiMsgSz, + NO_USER_CHECK) <= 0) { + ret = ASN_PARSE_E; + } - if (localIdx >= pkiMsgSz) { - ret = BUFFER_E; + if (localIdx >= pkiMsgSz) { + ret = BUFFER_E; + } + } + else if (ret == 0 && pkiMsg[localIdx] == ASN_INDEF_LENGTH) { + #ifndef NO_PKCS7_STREAM + pkcs7->stream->cntIdfCnt++; /* count up indef-length count */ + #endif + length = 0; + localIdx++; } + else { + length = 0; + localIdx++; + } + + /* Save idx to back up in case of PKCS#7 eContent */ + start = localIdx; /* get length of content in the case that there is multiple parts */ if (ret == 0 && GetASNTag(pkiMsg, &localIdx, &tag, pkiMsgSz) < 0) ret = ASN_PARSE_E; - if (ret == 0 && tag == (ASN_OCTET_STRING | ASN_CONSTRUCTED)) { - multiPart = 1; + if (ret == 0 && + (tag != (ASN_OCTET_STRING | ASN_CONSTRUCTED) && + (tag != ASN_OCTET_STRING))) { - /* Get length of all OCTET_STRINGs. */ - if (GetLength_ex(pkiMsg, &localIdx, &contentLen, pkiMsgSz, - NO_USER_CHECK) < 0) + /* If reached end of ContentInfo, or we see the next element + * ([0] IMPLICIT CertificateSet), set error state. Either + * true error or detached */ + if (tag == (ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC | 0)) { ret = ASN_PARSE_E; - - /* Check whether there is one OCTET_STRING inside. */ - start = localIdx; - if (localIdx >= pkiMsgSz) { - ret = BUFFER_E; } - if (ret == 0 && GetASNTag(pkiMsg, &localIdx, &tag, pkiMsgSz) - != 0) - ret = ASN_PARSE_E; + /* Back up before getting tag, process as PKCS#7 ANY and use + * this as start of content. */ + localIdx = start; + pkcs7->contentIsPkcs7Type = 1; + } + else { + /* CMS eContent OCTET_STRING */ + if (ret == 0 && tag == (ASN_OCTET_STRING | ASN_CONSTRUCTED)) { + multiPart = 1; + + /* Get length of all OCTET_STRINGs. */ + if (GetLength_ex(pkiMsg, &localIdx, &contentLen, pkiMsgSz, + NO_USER_CHECK) < 0) + ret = ASN_PARSE_E; + #ifndef NO_PKCS7_STREAM + if (ret == 0 && pkiMsg[localIdx - 1] == ASN_INDEF_LENGTH) { + pkcs7->stream->cntIdfCnt++; /* indef-length count */ + } + #endif + /* Check whether there is one OCTET_STRING inside. */ + start = localIdx; + if (localIdx >= pkiMsgSz) { + ret = BUFFER_E; + } - if (ret == 0 && tag != ASN_OCTET_STRING) - ret = ASN_PARSE_E; + if (ret == 0 && GetASNTag(pkiMsg, &localIdx, &tag, pkiMsgSz) + != 0) + ret = ASN_PARSE_E; - if (ret == 0 && GetLength_ex(pkiMsg, &localIdx, &length, - pkiMsgSz, NO_USER_CHECK) < 0) - ret = ASN_PARSE_E; + if (ret == 0 && tag != ASN_OCTET_STRING) + ret = ASN_PARSE_E; - if (ret == 0) { - /* Use single OCTET_STRING directly, or reset length. */ - if (localIdx - start + length == (word32)contentLen) { - multiPart = 0; - } else { - /* reset length to outer OCTET_STRING for bundle size - * check below */ - length = contentLen; + if (ret == 0 && GetLength_ex(pkiMsg, &localIdx, &length, + pkiMsgSz, NO_USER_CHECK) < 0) + ret = ASN_PARSE_E; + + if (ret == 0) { + /* Use single OCTET_STRING directly, or reset length. */ + if (localIdx - start + length == (word32)contentLen) { + multiPart = 0; + } else { + #ifndef NO_PKCS7_STREAM + pkcs7->stream->multi = multiPart; + pkcs7->stream->currContIdx = localIdx; + pkcs7->stream->currContSz = (word32)length; + pkcs7->stream->currContRmnSz = (word32)length; + #endif + /* reset length to outer OCTET_STRING for bundle + * size check below */ + length = contentLen; + } + localIdx = start; } - localIdx = start; - } - if (ret != 0) { - /* failed ASN1 parsing during OCTET_STRING checks */ - break; + if (ret != 0) { + /* failed ASN1 parsing during OCTET_STRING checks */ + break; + } } - } - /* get length of content in case of single part */ - if (ret == 0 && !multiPart) { - if (tag != ASN_OCTET_STRING) - ret = ASN_PARSE_E; + /* get length of content in case of single part */ + if (ret == 0 && !multiPart) { + if (tag != ASN_OCTET_STRING) + ret = ASN_PARSE_E; - if (ret == 0 && GetLength_ex(pkiMsg, &localIdx, - &length, pkiMsgSz, NO_USER_CHECK) < 0) - ret = ASN_PARSE_E; + if (ret == 0 && GetLength_ex(pkiMsg, &localIdx, + &length, pkiMsgSz, NO_USER_CHECK) < 0) + ret = ASN_PARSE_E; + #ifndef NO_PKCS7_STREAM + if (ret == 0) { + pkcs7->stream->multi = multiPart; + pkcs7->stream->currContIdx = localIdx; + pkcs7->stream->currContSz = (word32)length; + pkcs7->stream->currContRmnSz = (word32)length; + } + #endif + } } /* update idx if successful */ @@ -4759,16 +5754,10 @@ /* support using header and footer without content */ if (pkiMsg2 && pkiMsg2Sz > 0 && hashBuf && hashSz > 0) { localIdx = 0; + #ifndef NO_PKCS7_STREAM + pkcs7->stream->noContent = 1; + #endif - } else if (pkiMsg2 == NULL && hashBuf == NULL) { - /* header/footer not separate, check content length is - * not larger than total bundle size */ - if ((localIdx + length) > pkiMsgSz) { - WOLFSSL_MSG("Content length detected is larger than " - "total bundle size"); - ret = BUFFER_E; - break; - } } idx = localIdx; } @@ -4816,58 +5805,83 @@ pkcs7->stream->nonceSz = contentTypeSz; XMEMCPY(pkcs7->stream->nonce, contentType, contentTypeSz); } + if (ret < 0) + break; - /* content expected? */ - if ((ret == 0 && length > 0) && - !(pkiMsg2 && pkiMsg2Sz > 0 && hashBuf && hashSz > 0)) { - pkcs7->stream->expected = length + ASN_TAG_SZ + MAX_LENGTH_SZ; + if (pkcs7->stream->noContent) { + pkcs7->stream->expected = 0; } else { - pkcs7->stream->expected = ASN_TAG_SZ + MAX_LENGTH_SZ; - } - - if (pkcs7->stream->expected > (pkcs7->stream->maxLen - idx)) { - pkcs7->stream->expected = pkcs7->stream->maxLen - idx; + if (multiPart) { + idx = pkcs7->stream->currContIdx; + } + if (in2Sz > 0 && hashSz > 0) { + /* seems no content included */ + pkcs7->stream->expected = + ASN_TAG_SZ + MAX_LENGTH_SZ; + } + else { + pkcs7->stream->expected = pkcs7->stream->currContSz; + } } if ((ret = wc_PKCS7_StreamEndCase(pkcs7, &stateIdx, &idx)) != 0) { break; } - wc_PKCS7_StreamStoreVar(pkcs7, pkiMsg2Sz, localIdx, length); + wc_PKCS7_StreamStoreVar(pkcs7, pkiMsg2Sz, (int)localIdx, length); - /* content length is in multiple parts */ - if (multiPart) { - pkcs7->stream->expected = contentLen + ASN_TAG_SZ; - } - pkcs7->stream->multi = multiPart; - #endif + #endif /* !NO_PKCS7_STREAM */ + wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE3); + + #ifndef NO_PKCS7_STREAM + /* free pkcs7->stream->content buffer */ + if (pkcs7->stream->content != NULL) { + XFREE(pkcs7->stream->content, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + pkcs7->stream->content = NULL; + } + #endif /* !NO_PKCS7_STREAM */ + FALL_THROUGH; case WC_PKCS7_VERIFY_STAGE3: + keepContent = !(pkiMsg2 && pkiMsg2Sz > 0 && hashBuf && hashSz > 0); #ifndef NO_PKCS7_STREAM - if ((ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz + in2Sz, - pkcs7->stream->expected, &pkiMsg, &idx)) != 0) { + ret = wc_PKCS7_HandleOctetStrings(pkcs7, in, inSz, + &stateIdx, &idx, keepContent); + if (ret != 0) break; + + /* copy content to pkcs7->contentDynamic */ + if (keepContent && pkcs7->stream->content && + pkcs7->stream->contentSz >0) { + pkcs7->contentDynamic = (byte*)XMALLOC(pkcs7->stream->contentSz, + pkcs7->heap, DYNAMIC_TYPE_PKCS7); + if (pkcs7->contentDynamic == NULL) { + ret = MEMORY_E; + break; + } + XMEMCPY(pkcs7->contentDynamic, pkcs7->stream->content, + pkcs7->stream->contentSz); + + pkcs7->contentSz = pkcs7->stream->contentSz; + pkcs7->content = pkcs7->contentDynamic; } - #ifdef ASN_BER_TO_DER - if (pkcs7->derSz != 0) - pkiMsgSz = pkcs7->derSz; - else - #endif - pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: - inSz; - wc_PKCS7_StreamGetVar(pkcs7, &pkiMsg2Sz, (int*)&localIdx, &length); - if (pkcs7->stream->length > 0) { - localIdx = 0; + /* check if bundle has more elements or footer, if not, set content + * to pkcs7->content and hash to pkcs7->hash. + */ + if (ret == 0 && pkcs7->stream->maxLen > 0 && + (pkcs7->stream->maxLen - pkcs7->stream->totalRd) + < ASN_TAG_SZ + MAX_LENGTH_SZ) { + + ret = 0; + break; } - multiPart = pkcs7->stream->multi; - detached = pkcs7->stream->detached; - maxIdx = idx + pkcs7->stream->expected; - #endif + /* expect data length to be enough to check set and seq of certs */ + pkcs7->stream->expected = (ASN_TAG_SZ + MAX_LENGTH_SZ) * 2; + #else /* Break out before content because it can be optional in degenerate * cases. */ if (ret != 0 && !degenerate) @@ -4876,12 +5890,13 @@ /* get parts of content */ if (ret == 0 && multiPart) { int i = 0; - keepContent = !(pkiMsg2 && pkiMsg2Sz > 0 && hashBuf && hashSz > 0); + keepContent = !(pkiMsg2 && pkiMsg2Sz > 0 && hashBuf && + hashSz > 0); if (keepContent) { /* Create a buffer to hold content of OCTET_STRINGs. */ - pkcs7->contentDynamic = (byte*)XMALLOC(contentLen, pkcs7->heap, - DYNAMIC_TYPE_PKCS7); + pkcs7->contentDynamic = (byte*)XMALLOC(contentLen, + pkcs7->heap, DYNAMIC_TYPE_PKCS7); if (pkcs7->contentDynamic == NULL) ret = MEMORY_E; } @@ -4894,15 +5909,16 @@ if (ret == 0 && tag != ASN_OCTET_STRING) ret = ASN_PARSE_E; - if (ret == 0 && GetLength(pkiMsg, &localIdx, &length, totalSz) < 0) + if (ret == 0 && GetLength(pkiMsg, &localIdx, &length, + totalSz) < 0) ret = ASN_PARSE_E; if (ret == 0 && length + localIdx > start + contentLen) ret = ASN_PARSE_E; if (ret == 0) { if (keepContent) { - XMEMCPY(pkcs7->contentDynamic + i, pkiMsg + localIdx, - length); + XMEMCPY(pkcs7->contentDynamic + i, + pkiMsg + localIdx, length); } i += length; localIdx += length; @@ -4922,7 +5938,8 @@ content = NULL; localIdx = 0; if (contentSz != (int)pkcs7->contentSz) { - WOLFSSL_MSG("Data signed does not match contentSz provided"); + WOLFSSL_MSG("Data signed does not match contentSz" + " provided"); ret = BUFFER_E; } } @@ -4945,26 +5962,16 @@ pkiMsg2 = pkiMsg; pkiMsg2Sz = pkiMsgSz; - #ifndef NO_PKCS7_STREAM - pkiMsg2Sz = pkcs7->stream->maxLen; - pkcs7->stream->varOne = pkiMsg2Sz; - pkcs7->stream->flagOne = 1; - #endif } } else { pkiMsg2 = pkiMsg; pkiMsg2Sz = pkiMsgSz; - #ifndef NO_PKCS7_STREAM - pkiMsg2Sz = pkcs7->stream->maxLen; - pkcs7->stream->varOne = pkiMsg2Sz; - pkcs7->stream->flagOne = 1; - #endif } - /* If getting the content info failed with non degenerate then return the - * error case. Otherwise with a degenerate it is ok if the content - * info was omitted */ + /* If getting the content info failed with non degenerate then + * return the error case. Otherwise with a degenerate it is ok + * if the content info was omitted */ if (!degenerate && !detached && (ret != 0)) { break; } @@ -4978,23 +5985,48 @@ content = pkcs7->content; contentSz = pkcs7->contentSz; } + #endif /* !NO_PKCS7_STREAM */ + wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE4); + FALL_THROUGH; + + case WC_PKCS7_VERIFY_STAGE4: #ifndef NO_PKCS7_STREAM - if (content != NULL) { - XFREE(pkcs7->stream->content, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - pkcs7->stream->content = (byte*)XMALLOC(contentSz, pkcs7->heap, - DYNAMIC_TYPE_PKCS7); - if (pkcs7->stream->content == NULL) { - ret = MEMORY_E; - break; - } - else { - XMEMCPY(pkcs7->stream->content, content, contentSz); - pkcs7->stream->contentSz = contentSz; - } + if (in2 && in2Sz > 0) { + src = in2; + srcSz = in2Sz; + pkiMsg2 = in2; + } + else { + src = in; + srcSz = inSz; + pkiMsg2 = in; + } + if ((ret = wc_PKCS7_AddDataToStream(pkcs7, src, srcSz, + pkcs7->stream->expected, &pkiMsg2, &idx)) != 0) { + break; } + + #ifdef ASN_BER_TO_DER + if (pkcs7->derSz != 0) + pkiMsg2Sz = pkcs7->derSz; + else + #endif + pkiMsg2Sz = (pkcs7->stream->length > 0)? pkcs7->stream->length: + srcSz; + + if (pkcs7->stream->length > 0) { + localIdx = 0; + } + + maxIdx = idx + pkcs7->stream->expected; #endif /* !NO_PKCS7_STREAM */ + if (pkiMsg2 == NULL || pkiMsg2Sz == 0) { + pkiMsg2Sz = pkiMsgSz; + pkiMsg2 = pkiMsg; + } + /* Certificates begin "footer" section (ie pkiMsg2) if being used */ /* Get the implicit[0] set of certificates */ if (ret == 0 && idx >= pkiMsg2Sz) @@ -5002,12 +6034,44 @@ length = 0; /* set length to 0 to check if reading in any certs */ localIdx = idx; + if (ret == 0 && GetASNTag(pkiMsg2, &localIdx, &tag, pkiMsg2Sz) == 0 && tag == (ASN_CONSTRUCTED | ASN_CONTEXT_SPECIFIC | 0)) { idx++; - if (GetLength_ex(pkiMsg2, &idx, &length, maxIdx, NO_USER_CHECK) - < 0) + + /* if certificates set has indefinite length, try to get + * the first certificate length of the set. + */ + if (ret == 0 && pkiMsg2[localIdx] == ASN_INDEF_LENGTH) { + + localIdx++; + certIdx = localIdx; + #ifndef NO_PKCS7_STREAM + /* set indef-length count. used for skipping trailing zeros */ + pkcs7->stream->cntIdfCnt = 1; + #endif + ret = GetASNTag(pkiMsg2, &localIdx, &tag, pkiMsg2Sz); + if (ret == 0 && tag == (ASN_CONSTRUCTED | ASN_SEQUENCE)) { + if (GetLength_ex(pkiMsg2, &localIdx, &length, maxIdx, + NO_USER_CHECK) < 0) ret = ASN_PARSE_E; + + WOLFSSL_MSG("certificate set found"); + + /* adjust cert length */ + length += localIdx - certIdx; + idx = certIdx; + } + } + /* in case certificates set has definite length */ + else { + + if (GetLength_ex(pkiMsg2, &localIdx, &length, maxIdx, + NO_USER_CHECK) < 0) + ret = ASN_PARSE_E; + + idx = localIdx; + } } if (ret != 0) { @@ -5023,39 +6087,52 @@ } wc_PKCS7_StreamStoreVar(pkcs7, pkiMsg2Sz, 0, length); if (length > 0) { - pkcs7->stream->expected = length; + pkcs7->stream->expected = (word32)length; } else { pkcs7->stream->expected = MAX_SEQ_SZ; if (pkcs7->stream->expected > (pkcs7->stream->maxLen - - pkcs7->stream->totalRd) + pkcs7->stream->length) { + pkcs7->stream->totalRd) + pkcs7->stream->length) { pkcs7->stream->expected = (pkcs7->stream->maxLen - pkcs7->stream->totalRd) + pkcs7->stream->length; } } #endif - wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE4); + wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE5); FALL_THROUGH; - case WC_PKCS7_VERIFY_STAGE4: + case WC_PKCS7_VERIFY_STAGE5: #ifndef NO_PKCS7_STREAM - if ((ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz + in2Sz, - pkcs7->stream->expected, &pkiMsg, &idx)) != 0) { + if (in2 && in2Sz > 0) { + src = in2; + srcSz = in2Sz; + pkiMsg2 = in2; + } + else { + src = in; + srcSz = inSz; + pkiMsg2 = in; + } + + if ((ret = wc_PKCS7_AddDataToStream(pkcs7, src, srcSz, + pkcs7->stream->expected, &pkiMsg2, &idx)) != 0) { break; } + pkiMsg2Sz = (pkcs7->stream->length > 0)? pkcs7->stream->length: + srcSz; wc_PKCS7_StreamGetVar(pkcs7, &pkiMsg2Sz, 0, &length); - if (pkcs7->stream->flagOne) { - pkiMsg2 = pkiMsg; - } /* restore content */ content = pkcs7->stream->content; - contentSz = pkcs7->stream->contentSz; + contentSz = (int)pkcs7->stream->contentSz; /* restore detached flag */ detached = pkcs7->stream->detached; + /* store current index to get the signerInfo index later */ + certIdx2 = idx; + /* store certificate if needed */ if (length > 0 && in2Sz == 0) { /* free tmpCert if not NULL */ @@ -5068,9 +6145,12 @@ } XMEMCPY(pkcs7->stream->tmpCert, pkiMsg2 + idx, length); pkiMsg2 = pkcs7->stream->tmpCert; - pkiMsg2Sz = length; + pkiMsg2Sz = (word32)length; idx = 0; } + #else + /* store current index to get the signerInfo index later */ + certIdx2 = idx; #endif if (length > 0) { @@ -5080,7 +6160,7 @@ * certificate. We want to save the first cert if it * is X.509. */ - word32 certIdx = idx; + certIdx = idx; if (length < MAX_LENGTH_SZ + ASN_TAG_SZ) ret = BUFFER_E; @@ -5089,7 +6169,8 @@ ret = GetASNTag(pkiMsg2, &certIdx, &tag, pkiMsg2Sz); if (ret == 0 && tag == (ASN_CONSTRUCTED | ASN_SEQUENCE)) { - if (GetLength(pkiMsg2, &certIdx, &certSz, pkiMsg2Sz) < 0) + if (GetLength_ex(pkiMsg2, &certIdx, &certSz, pkiMsg2Sz, + NO_USER_CHECK) < 0) ret = ASN_PARSE_E; cert = &pkiMsg2[idx]; @@ -5104,6 +6185,7 @@ pkcs7->der = NULL; #endif version = pkcs7->version; + contentIsPkcs7Type = pkcs7->contentIsPkcs7Type; if (ret == 0) { byte isDynamic = (byte)pkcs7->isDynamic; @@ -5117,6 +6199,9 @@ contentDynamic = (byte*)XMALLOC(contentSz, pkcs7->heap, DYNAMIC_TYPE_PKCS7); if (contentDynamic == NULL) { + #ifndef NO_PKCS7_STREAM + pkcs7->stream = stream; + #endif ret = MEMORY_E; break; } @@ -5130,7 +6215,7 @@ pkcs7->isDynamic = isDynamic; /* This will reset PKCS7 structure and then set the * certificate */ - ret = wc_PKCS7_InitWithCert(pkcs7, cert, certSz); + ret = wc_PKCS7_InitWithCert(pkcs7, cert, (word32)certSz); /* Restore pkcs7->contentDynamic from above, will be * freed by application with wc_PKCS7_Free() */ @@ -5139,11 +6224,14 @@ contentDynamic = NULL; } + /* Restore content is PKCS#7 flag */ + pkcs7->contentIsPkcs7Type = contentIsPkcs7Type; + #ifndef NO_PKCS7_STREAM pkcs7->stream = stream; #endif } - pkcs7->version = version; + pkcs7->version = (byte)version; #ifdef ASN_BER_TO_DER pkcs7->der = der; #endif @@ -5156,7 +6244,7 @@ int i; pkcs7->cert[0] = cert; - pkcs7->certSz[0] = certSz; + pkcs7->certSz[0] = (word32)certSz; certIdx = idx + certSz; for (i = 1; i < MAX_PKCS7_CERTS && @@ -5192,27 +6280,8 @@ pkcs7->content = content; pkcs7->contentSz = contentSz; } - #ifndef NO_PKCS7_STREAM - else { - /* save content if detached and using streaming API */ - if (pkcs7->content != NULL) { - XFREE(pkcs7->stream->content, pkcs7->heap, - DYNAMIC_TYPE_PKCS7); - pkcs7->stream->content = (byte*)XMALLOC(pkcs7->contentSz, - pkcs7->heap, - DYNAMIC_TYPE_PKCS7); - if (pkcs7->stream->content == NULL) { - ret = MEMORY_E; - break; - } - else { - XMEMCPY(pkcs7->stream->content, pkcs7->content, - contentSz); - pkcs7->stream->contentSz = pkcs7->contentSz; - } - } - } - #endif + + idx = certIdx2 + length; if (ret != 0) { break; @@ -5229,19 +6298,17 @@ break; } } - else { - stateIdx = idx; /* didn't read any from internal buffer */ - } - if ((ret = wc_PKCS7_StreamEndCase(pkcs7, &stateIdx, &idx)) != 0) { break; } - if (pkcs7->stream->flagOne && pkcs7->stream->length > 0) { - idx = stateIdx + idx; - } pkcs7->stream->expected = MAX_OID_SZ + ASN_TAG_SZ + MAX_LENGTH_SZ + MAX_SET_SZ; + /* if certificate set has indef-length, there maybe trailing zeros. + * add expected size to include size of zeros. */ + if (pkcs7->stream->cntIdfCnt > 0) { + pkcs7->stream->expected += pkcs7->stream->cntIdfCnt * 2; + } if (pkcs7->stream->expected > (pkcs7->stream->maxLen - pkcs7->stream->totalRd) + pkcs7->stream->length) @@ -5251,24 +6318,31 @@ wc_PKCS7_StreamGetVar(pkcs7, &pkiMsg2Sz, 0, 0); wc_PKCS7_StreamStoreVar(pkcs7, pkiMsg2Sz, 0, length); #endif - wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE5); + wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE6); FALL_THROUGH; - case WC_PKCS7_VERIFY_STAGE5: + case WC_PKCS7_VERIFY_STAGE6: #ifndef NO_PKCS7_STREAM - if ((ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz + in2Sz, - pkcs7->stream->expected, &pkiMsg, &idx)) != 0) { + + if (in2 && in2Sz > 0) { + src = in2; + srcSz = in2Sz; + pkiMsg2 = in2; + } + else { + src = in; + srcSz = inSz; + pkiMsg2 = in; + } + if ((ret = wc_PKCS7_AddDataToStream(pkcs7, src, srcSz, + pkcs7->stream->expected, &pkiMsg2, &idx)) != 0) { break; } wc_PKCS7_StreamGetVar(pkcs7, &pkiMsg2Sz, 0, &length); - if (pkcs7->stream->flagOne) { - pkiMsg2 = pkiMsg; - /* check if using internal stream buffer and should adjust sz */ - if (pkiMsg != in && pkcs7->stream->length > 0) { - pkiMsg2Sz = pkcs7->stream->length; - } - } + /* check if using internal stream buffer and should adjust sz */ + pkiMsg2Sz = (pkcs7->stream->length > 0)? pkcs7->stream->length: + srcSz; /* restore content type */ contentType = pkcs7->stream->nonce; @@ -5289,7 +6363,27 @@ if (ret == 0 && wc_PKCS7_SetContentType(pkcs7, contentType, contentTypeSz) < 0) ret = ASN_PARSE_E; - + #ifndef NO_PKCS7_STREAM + /* prior to find set of crls, remove trailing zeros of + * set of certificates */ + if (ret == 0 && pkcs7->stream->cntIdfCnt > 0) { + int i; + localIdx = idx; + for (i = 0; i < pkcs7->stream->cntIdfCnt * ASN_INDEF_END_SZ; + i++) { + if (pkiMsg2[localIdx + i] == 0) + continue; + else { + ret = ASN_PARSE_E; + break; + } + } + if (ret == 0) { + idx += pkcs7->stream->cntIdfCnt * ASN_INDEF_END_SZ; + pkcs7->stream->cntIdfCnt = 0; + } + } + #endif /* !NO_PKCS7_STREAM */ /* Get the implicit[1] set of crls */ if (ret == 0 && idx >= maxIdx) ret = BUFFER_E; @@ -5323,7 +6417,7 @@ if (in2 && in2Sz > 0 && hashBuf && hashSz > 0) { if (length > 0) { - pkcs7->stream->expected = length; + pkcs7->stream->expected = (word32)length; } else { pkcs7->stream->expected = 0; @@ -5334,36 +6428,45 @@ pkcs7->stream->expected = (pkcs7->stream->maxLen - pkcs7->stream->totalRd) + pkcs7->stream->length; } + /* In case of indefinite length used in the bundle, terminating + * zero's should exist at the end of the bundle. + */ + if (pkcs7->stream->indefLen == 1) { + pkcs7->stream->expected = (word32)length + 3 * ASN_INDEF_END_SZ; + } + else { + pkcs7->stream->expected = (word32)length; + } - #endif - wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE6); + wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_VERIFY_STAGE7); + #endif /* !NO_PKCS7_STREAM */ FALL_THROUGH; - case WC_PKCS7_VERIFY_STAGE6: + case WC_PKCS7_VERIFY_STAGE7: #ifndef NO_PKCS7_STREAM - if ((ret = wc_PKCS7_AddDataToStream(pkcs7, in, inSz + in2Sz, - pkcs7->stream->expected, &pkiMsg, &idx)) != 0) { + if (in2 && in2Sz > 0) { + src = in2; + srcSz = in2Sz; + pkiMsg2 = in2; + } + else { + src = in; + srcSz = inSz; + pkiMsg2 = in; + } + if ((ret = wc_PKCS7_AddDataToStream(pkcs7, src, srcSz, + pkcs7->stream->expected, &pkiMsg2, &idx)) != 0) { break; } wc_PKCS7_StreamGetVar(pkcs7, &pkiMsg2Sz, 0, &length); - if (pkcs7->stream->flagOne) { - pkiMsg2 = pkiMsg; - - /* check if using internal stream buffer and should adjust sz */ - if (pkiMsg != in && pkcs7->stream->length > 0) { - pkiMsg2Sz = pkcs7->stream->length; - } - else { - /* if pkiMsg2 is pkiMsg and not using an internal stream - * buffer then the size is limited by inSz */ - pkiMsg2Sz = inSz; - } - } + pkiMsg2Sz = (pkcs7->stream->length > 0)? pkcs7->stream->length: + srcSz; + degenerate = pkcs7->stream->degenerate; /* restore content */ content = pkcs7->stream->content; - contentSz = pkcs7->stream->contentSz; + contentSz = (int)pkcs7->stream->contentSz; #endif ret = wc_PKCS7_ParseSignerInfo(pkcs7, pkiMsg2, pkiMsg2Sz, &idx, @@ -5392,18 +6495,33 @@ } pkcs7->content = content; - pkcs7->contentSz = contentSz; + pkcs7->contentSz = (word32)contentSz; if (ret == 0) { - ret = wc_PKCS7_SignedDataVerifySignature(pkcs7, sig, sigSz, - signedAttrib, signedAttribSz, + ret = wc_PKCS7_SignedDataVerifySignature(pkcs7, sig, (word32)sigSz, + signedAttrib, (word32)signedAttribSz, hashBuf, hashSz); } } + #ifndef NO_PKCS7_STREAM + /* make sure that terminating zero's follow */ + if ((ret == WC_NO_ERR_TRACE(PKCS7_SIGNEEDS_CHECK) || ret >= 0) && + pkcs7->stream->indefLen == 1) { + int i; + for (i = 0; i < 3 * ASN_INDEF_END_SZ; i++) { + if (pkiMsg2[idx + i] != 0) { + ret = ASN_PARSE_E; + break; + } + } + } + #endif /* NO_PKCS7_STREAM */ + if (ret < 0) break; + ret = 0; /* success */ #ifndef NO_PKCS7_STREAM wc_PKCS7_ResetStream(pkcs7); @@ -5416,7 +6534,7 @@ ret = BAD_FUNC_ARG; } - if (ret != 0 && ret != WC_PKCS7_WANT_READ_E) { + if (ret != 0 && ret != WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) { #ifndef NO_PKCS7_STREAM wc_PKCS7_ResetStream(pkcs7); #endif @@ -5661,6 +6779,7 @@ XFREE(kari, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return NULL; } + XMEMSET(kari->decoded, 0, sizeof(DecodedCert)); kari->recipKey = (ecc_key*)XMALLOC(sizeof(ecc_key), pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -5764,29 +6883,30 @@ int ret; word32 idx; - if (kari == NULL || kari->decoded == NULL || - cert == NULL || certSz == 0) + if (kari == NULL || kari->decoded == NULL) { return BAD_FUNC_ARG; + } /* decode certificate */ - InitDecodedCert(kari->decoded, (byte*)cert, certSz, kari->heap); - kari->decodedInit = 1; - ret = ParseCert(kari->decoded, CA_TYPE, NO_VERIFY, 0); - if (ret < 0) - return ret; + if (cert != NULL) { + InitDecodedCert(kari->decoded, (byte*)cert, certSz, kari->heap); + kari->decodedInit = 1; + ret = ParseCert(kari->decoded, CA_TYPE, NO_VERIFY, 0); + if (ret < 0) + return ret; - /* only supports ECDSA for now */ - if (kari->decoded->keyOID != ECDSAk) { - WOLFSSL_MSG("CMS KARI only supports ECDSA key types"); - return BAD_FUNC_ARG; - } + /* only supports ECDSA for now */ + if (kari->decoded->keyOID != ECDSAk) { + WOLFSSL_MSG("CMS KARI only supports ECDSA key types"); + return BAD_FUNC_ARG; + } - /* make sure subject key id was read from cert */ - if (kari->decoded->extSubjKeyIdSet == 0) { - WOLFSSL_MSG("Failed to read subject key ID from recipient cert"); - return BAD_FUNC_ARG; + /* make sure subject key id was read from cert */ + if (kari->decoded->extSubjKeyIdSet == 0) { + WOLFSSL_MSG("Failed to read subject key ID from recipient cert"); + return BAD_FUNC_ARG; + } } - ret = wc_ecc_init_ex(kari->recipKey, kari->heap, kari->devId); if (ret != 0) return ret; @@ -5795,6 +6915,10 @@ /* get recip public key */ if (kari->direction == WC_PKCS7_ENCODE) { + if (cert == NULL) { + WOLFSSL_MSG("Error recipient cert can not be null with encode"); + return BAD_FUNC_ARG; + } idx = 0; ret = wc_EccPublicKeyDecode(kari->decoded->publicKey, &idx, @@ -5919,32 +7043,32 @@ return BAD_FUNC_ARG; /* kekOctet */ - kekOctetSz = SetOctetString(sizeof(word32), kekOctet); + kekOctetSz = (int)SetOctetString(sizeof(word32), kekOctet); sharedInfoSz += (kekOctetSz + sizeof(word32)); /* suppPubInfo */ suppPubInfoSeqSz = SetImplicit(ASN_SEQUENCE, 2, kekOctetSz + sizeof(word32), - suppPubInfoSeq); + suppPubInfoSeq, 0); sharedInfoSz += suppPubInfoSeqSz; /* optional ukm/entityInfo */ if (kari->ukmSz > 0) { - entityUInfoOctetSz = SetOctetString(kari->ukmSz, entityUInfoOctet); + entityUInfoOctetSz = (int)SetOctetString(kari->ukmSz, entityUInfoOctet); sharedInfoSz += (entityUInfoOctetSz + kari->ukmSz); entityUInfoExplicitSz = SetExplicit(0, entityUInfoOctetSz + kari->ukmSz, - entityUInfoExplicitSeq); + entityUInfoExplicitSeq, 0); sharedInfoSz += entityUInfoExplicitSz; } /* keyInfo */ - keyInfoSz = SetAlgoID(keyWrapOID, keyInfo, oidKeyWrapType, 0); + keyInfoSz = (int)SetAlgoID(keyWrapOID, keyInfo, oidKeyWrapType, 0); sharedInfoSz += keyInfoSz; /* sharedInfo */ - sharedInfoSeqSz = SetSequence(sharedInfoSz, sharedInfoSeq); + sharedInfoSeqSz = (int)SetSequence((word32)sharedInfoSz, sharedInfoSeq); sharedInfoSz += sharedInfoSeqSz; kari->sharedInfo = (byte*)XMALLOC(sharedInfoSz, kari->heap, @@ -5952,7 +7076,7 @@ if (kari->sharedInfo == NULL) return MEMORY_E; - kari->sharedInfoSz = sharedInfoSz; + kari->sharedInfoSz = (word32)sharedInfoSz; XMEMCPY(kari->sharedInfo + idx, sharedInfoSeq, sharedInfoSeqSz); idx += sharedInfoSeqSz; @@ -6014,7 +7138,7 @@ return ret; /* generate shared secret */ - secretSz = kari->senderKey->dp->size; + secretSz = (word32)kari->senderKey->dp->size; secret = (byte*)XMALLOC(secretSz, kari->heap, DYNAMIC_TYPE_PKCS7); if (secret == NULL) return MEMORY_E; @@ -6023,11 +7147,15 @@ (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION != 2))) && \ !defined(HAVE_SELFTEST) ret = wc_ecc_set_rng(kari->senderKey, rng); - if (ret != 0) + if (ret != 0) { + XFREE(secret, kari->heap, DYNAMIC_TYPE_PKCS7); return ret; + } ret = wc_ecc_set_rng(kari->recipKey, rng); - if (ret != 0) + if (ret != 0) { + XFREE(secret, kari->heap, DYNAMIC_TYPE_PKCS7); return ret; + } #else (void)rng; #endif @@ -6118,6 +7246,7 @@ int ret = 0; int keySz, direction = 0; int blockKeySz = 0; + int keyIdSize; /* ASN.1 layout */ int totalSz = 0; @@ -6169,6 +7298,13 @@ byte encryptedKey[MAX_ENCRYPTED_KEY_SZ]; #endif +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + keyIdSize = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + pkcs7->publicKeyOID))); +#else + keyIdSize = KEYID_SIZE; +#endif + /* allocate and init memory for recipient */ recip = (Pkcs7EncodedRecip*)XMALLOC(sizeof(Pkcs7EncodedRecip), pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -6191,7 +7327,7 @@ } /* generate random content encryption key, if needed */ - ret = PKCS7_GenerateContentEncryptionKey(pkcs7, blockKeySz); + ret = PKCS7_GenerateContentEncryptionKey(pkcs7, (word32)blockKeySz); if (ret < 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -6290,45 +7426,45 @@ /* Start of RecipientEncryptedKeys */ /* EncryptedKey */ - encryptedKeyOctetSz = SetOctetString(encryptedKeySz, encryptedKeyOctet); + encryptedKeyOctetSz = (int)SetOctetString(encryptedKeySz, encryptedKeyOctet); totalSz += (encryptedKeyOctetSz + encryptedKeySz); /* SubjectKeyIdentifier */ - subjKeyIdOctetSz = SetOctetString(KEYID_SIZE, subjKeyIdOctet); - totalSz += (subjKeyIdOctetSz + KEYID_SIZE); + subjKeyIdOctetSz = (int)SetOctetString((word32)keyIdSize, subjKeyIdOctet); + totalSz += (subjKeyIdOctetSz + keyIdSize); /* RecipientKeyIdentifier IMPLICIT [0] */ recipKeyIdSeqSz = SetImplicit(ASN_SEQUENCE, 0, subjKeyIdOctetSz + - KEYID_SIZE, recipKeyIdSeq); + keyIdSize, recipKeyIdSeq, 0); totalSz += recipKeyIdSeqSz; /* RecipientEncryptedKey */ - recipEncKeySeqSz = SetSequence(totalSz, recipEncKeySeq); + recipEncKeySeqSz = (int)SetSequence((word32)totalSz, recipEncKeySeq); totalSz += recipEncKeySeqSz; /* RecipientEncryptedKeys */ - recipEncKeysSeqSz = SetSequence(totalSz, recipEncKeysSeq); + recipEncKeysSeqSz = (int)SetSequence((word32)totalSz, recipEncKeysSeq); totalSz += recipEncKeysSeqSz; /* Start of optional UserKeyingMaterial */ if (kari->ukmSz > 0) { - ukmOctetSz = SetOctetString(kari->ukmSz, ukmOctetStr); + ukmOctetSz = (int)SetOctetString(kari->ukmSz, ukmOctetStr); totalSz += (ukmOctetSz + kari->ukmSz); ukmExplicitSz = SetExplicit(1, ukmOctetSz + kari->ukmSz, - ukmExplicitSeq); + ukmExplicitSeq, 0); totalSz += ukmExplicitSz; } /* Start of KeyEncryptionAlgorithmIdentifier */ /* KeyWrapAlgorithm */ - keyWrapAlgSz = SetAlgoID(keyWrapOID, keyWrapAlg, oidKeyWrapType, 0); + keyWrapAlgSz = (int)SetAlgoID(keyWrapOID, keyWrapAlg, oidKeyWrapType, 0); totalSz += keyWrapAlgSz; /* KeyEncryptionAlgorithmIdentifier */ - keyEncryptAlgoIdSz = SetAlgoID(keyAgreeOID, keyEncryptAlgoId, + keyEncryptAlgoIdSz = (int)SetAlgoID(keyAgreeOID, keyEncryptAlgoId, oidCmsKeyAgreeType, keyWrapAlgSz); totalSz += keyEncryptAlgoIdSz; @@ -6337,28 +7473,28 @@ /* recipient ECPoint, public key */ XMEMSET(origPubKeyStr, 0, sizeof(origPubKeyStr)); /* no unused bits */ origPubKeyStr[0] = ASN_BIT_STRING; - origPubKeyStrSz = SetLength(kari->senderKeyExportSz + 1, + origPubKeyStrSz = (int)SetLength(kari->senderKeyExportSz + 1, origPubKeyStr + 1) + 2; totalSz += (origPubKeyStrSz + kari->senderKeyExportSz); /* Originator AlgorithmIdentifier, params set to NULL for interop compatibility */ - origAlgIdSz = SetAlgoID(ECDSAk, origAlgId, oidKeyType, 2); + origAlgIdSz = (int)SetAlgoID(ECDSAk, origAlgId, oidKeyType, 2); origAlgId[origAlgIdSz++] = ASN_TAG_NULL; origAlgId[origAlgIdSz++] = 0; totalSz += origAlgIdSz; /* outer OriginatorPublicKey IMPLICIT [1] */ - origPubKeySeqSz = SetImplicit(ASN_SEQUENCE, 1, + origPubKeySeqSz = (int)SetImplicit(ASN_SEQUENCE, 1, origAlgIdSz + origPubKeyStrSz + - kari->senderKeyExportSz, origPubKeySeq); + kari->senderKeyExportSz, origPubKeySeq, 0); totalSz += origPubKeySeqSz; /* outer OriginatorIdentifierOrKey IMPLICIT [0] */ - origIdOrKeySeqSz = SetImplicit(ASN_SEQUENCE, 0, + origIdOrKeySeqSz = (int)SetImplicit(ASN_SEQUENCE, 0, origPubKeySeqSz + origAlgIdSz + origPubKeyStrSz + kari->senderKeyExportSz, - origIdOrKeySeq); + origIdOrKeySeq, 0); totalSz += origIdOrKeySeqSz; /* version, always 3 */ @@ -6367,7 +7503,7 @@ recip->recipVersion = 3; /* outer IMPLICIT [1] kari */ - kariSeqSz = SetImplicit(ASN_SEQUENCE, 1, totalSz, kariSeq); + kariSeqSz = (int)SetImplicit(ASN_SEQUENCE, 1, (word32)totalSz, kariSeq, 0); totalSz += kariSeqSz; if (totalSz > MAX_RECIP_SZ) { @@ -6423,8 +7559,8 @@ XMEMCPY(recip->recip + idx, subjKeyIdOctet, subjKeyIdOctetSz); idx += subjKeyIdOctetSz; /* subject key id */ - XMEMCPY(recip->recip + idx, kari->decoded->extSubjKeyId, KEYID_SIZE); - idx += KEYID_SIZE; + XMEMCPY(recip->recip + idx, kari->decoded->extSubjKeyId, keyIdSize); + idx += keyIdSize; XMEMCPY(recip->recip + idx, encryptedKeyOctet, encryptedKeyOctetSz); idx += encryptedKeyOctetSz; /* encrypted CEK */ @@ -6453,7 +7589,7 @@ (void)options; - return idx; + return (int)idx; } #endif /* HAVE_ECC */ @@ -6473,6 +7609,7 @@ WC_RNG rng; word32 idx = 0; word32 encryptedKeySz = 0; + int keyIdSize; int ret = 0, blockKeySz; int verSz = 0, issuerSz = 0, snSz = 0, keyEncAlgSz = 0; @@ -6573,7 +7710,7 @@ } /* generate random content encryption key, if needed */ - ret = PKCS7_GenerateContentEncryptionKey(pkcs7, blockKeySz); + ret = PKCS7_GenerateContentEncryptionKey(pkcs7, (word32)blockKeySz); if (ret < 0) { #ifdef WOLFSSL_SMALL_STACK XFREE(serial, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -6599,6 +7736,13 @@ return ret; } +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + keyIdSize = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + decoded->signatureOID))); +#else + keyIdSize = KEYID_SIZE; +#endif + if (sidType == CMS_ISSUER_AND_SERIAL_NUMBER) { /* version, must be 0 for IssuerAndSerialNumber */ @@ -6619,7 +7763,7 @@ return -1; } issuerSz = decoded->issuerRawLen; - issuerSeqSz = SetSequence(issuerSz, issuerSeq); + issuerSeqSz = (int)SetSequence((word32)issuerSz, issuerSeq); if (decoded->serialSz == 0) { WOLFSSL_MSG("DecodedCert missing serial number"); @@ -6655,7 +7799,7 @@ verSz = SetMyVersion(2, ver, 0); recip->recipVersion = 2; - issuerSKIDSz = SetLength(KEYID_SIZE, issuerSKID); + issuerSKIDSz = SetLength((word32)keyIdSize, issuerSKID); } else { FreeDecodedCert(decoded); #ifdef WOLFSSL_SMALL_STACK @@ -6768,7 +7912,7 @@ encryptedKeySz, pubKey, &rng); } #ifdef WOLFSSL_ASYNC_CRYPT - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif wc_FreeRsaKey(pubKey); wc_FreeRng(&rng); @@ -6789,13 +7933,13 @@ XFREE(recip, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } - encryptedKeySz = ret; + encryptedKeySz = (word32)ret; - encKeyOctetStrSz = SetOctetString(encryptedKeySz, encKeyOctetStr); + encKeyOctetStrSz = (int)SetOctetString(encryptedKeySz, encKeyOctetStr); /* RecipientInfo */ if (sidType == CMS_ISSUER_AND_SERIAL_NUMBER) { - recipSeqSz = SetSequence(verSz + issuerSerialSeqSz + issuerSeqSz + + recipSeqSz = (int)SetSequence(verSz + issuerSerialSeqSz + issuerSeqSz + issuerSz + snSz + keyEncAlgSz + encKeyOctetStrSz + encryptedKeySz, recipSeq); @@ -6815,10 +7959,10 @@ } else { recipSeqSz = SetSequence(verSz + ASN_TAG_SZ + issuerSKIDSz + - KEYID_SIZE + keyEncAlgSz + encKeyOctetStrSz + + keyIdSize + keyEncAlgSz + encKeyOctetStrSz + encryptedKeySz, recipSeq); - if (recipSeqSz + verSz + ASN_TAG_SZ + issuerSKIDSz + KEYID_SIZE + + if (recipSeqSz + verSz + ASN_TAG_SZ + issuerSKIDSz + keyIdSize + keyEncAlgSz + encKeyOctetStrSz + encryptedKeySz > MAX_RECIP_SZ) { WOLFSSL_MSG("RecipientInfo output buffer too small"); FreeDecodedCert(decoded); @@ -6852,8 +7996,8 @@ idx += ASN_TAG_SZ; XMEMCPY(recip->recip + idx, issuerSKID, issuerSKIDSz); idx += issuerSKIDSz; - XMEMCPY(recip->recip + idx, pkcs7->issuerSubjKeyId, KEYID_SIZE); - idx += KEYID_SIZE; + XMEMCPY(recip->recip + idx, pkcs7->issuerSubjKeyId, keyIdSize); + idx += keyIdSize; } XMEMCPY(recip->recip + idx, keyAlgArray, keyEncAlgSz); idx += keyEncAlgSz; @@ -6886,17 +8030,57 @@ lastRecip->next = recip; } - return idx; + return (int)idx; } #endif /* !NO_RSA */ +/* abstraction for writing out PKCS7 bundle during creation + returns 0 on success + */ +int wc_PKCS7_WriteOut(PKCS7* pkcs7, byte* output, const byte* input, + word32 inputSz) +{ + int ret = 0; + + if (inputSz == 0) + return 0; + + if (input == NULL) { + WOLFSSL_MSG("Internal error, trying to write out NULL buffer"); + return -1; + } + +#ifdef ASN_BER_TO_DER + if (pkcs7->streamOutCb) { + ret = pkcs7->streamOutCb(pkcs7, input, inputSz, pkcs7->streamCtx); + /* sanity check on user provided ret value */ + if (ret < 0) { + WOLFSSL_MSG("Return value error from stream out callback"); + ret = BUFFER_E; + } + } + else +#endif + if (output) { + XMEMCPY(output, input, inputSz); + } + else { + WOLFSSL_MSG("No way provided to output bundle"); + ret = BUFFER_E; + } + + (void)pkcs7; + return ret; +} + /* encrypt content using encryptOID algo */ -static int wc_PKCS7_EncryptContent(int encryptOID, byte* key, int keySz, +static int wc_PKCS7_EncryptContent(PKCS7* pkcs7, int encryptOID, byte* key, + int keySz, byte* iv, int ivSz, byte* aad, word32 aadSz, byte* authTag, word32 authTagSz, byte* in, - int inSz, byte* out, int devId, void* heap) + int inSz, byte* out) { int ret; #ifndef NO_AES @@ -6910,10 +8094,23 @@ Des des; Des3 des3; #endif + int devId = pkcs7->devId; + void* heap = pkcs7->heap; - if (key == NULL || iv == NULL || in == NULL || out == NULL) + if (key == NULL || iv == NULL) return BAD_FUNC_ARG; +#ifdef ASN_BER_TO_DER + if ((in == NULL && pkcs7->getContentCb == NULL) || + (out == NULL && pkcs7->streamOutCb == NULL)) { + WOLFSSL_MSG("No input or output set for encrypt"); + return BAD_FUNC_ARG; + } +#else + if (in == NULL || out == NULL) + return BAD_FUNC_ARG; +#endif + switch (encryptOID) { #ifndef NO_AES #ifdef HAVE_AES_CBC @@ -6946,13 +8143,10 @@ #endif ret = wc_AesInit(aes, heap, devId); if (ret == 0) { - ret = wc_AesSetKey(aes, key, keySz, iv, AES_ENCRYPTION); + ret = wc_AesSetKey(aes, key, (word32)keySz, iv, AES_ENCRYPTION); if (ret == 0) { - ret = wc_AesCbcEncrypt(aes, out, in, inSz); - #ifdef WOLFSSL_ASYNC_CRYPT - /* async encrypt not available here, so block till done */ - ret = wc_AsyncWait(ret, &aes->asyncDev, WC_ASYNC_FLAG_NONE); - #endif + ret = wc_PKCS7_EncodeContentStream(pkcs7, NULL, aes, in, + inSz, out, WC_CIPHER_AES_CBC); } wc_AesFree(aes); } @@ -6983,13 +8177,36 @@ #endif ret = wc_AesInit(aes, heap, devId); if (ret == 0) { - ret = wc_AesGcmSetKey(aes, key, keySz); + ret = wc_AesGcmSetKey(aes, key, (word32)keySz); if (ret == 0) { - ret = wc_AesGcmEncrypt(aes, out, in, inSz, iv, ivSz, + #ifndef WOLFSSL_AESGCM_STREAM + if (pkcs7->encodeStream) { + WOLFSSL_MSG("Not AES-GCM stream support compiled in"); + ret = NOT_COMPILED_IN; + } + else { + ret = wc_AesGcmEncrypt(aes, out, in, inSz, iv, ivSz, authTag, authTagSz, aad, aadSz); - #ifdef WOLFSSL_ASYNC_CRYPT - /* async encrypt not available here, so block till done */ - ret = wc_AsyncWait(ret, &aes->asyncDev, WC_ASYNC_FLAG_NONE); + #ifdef WOLFSSL_ASYNC_CRYPT + /* async encrypt not available here, so block till done */ + ret = wc_AsyncWait(ret, &aes->asyncDev, + WC_ASYNC_FLAG_NONE); + #endif + } + #else + ret = wc_AesGcmEncryptInit(aes, key, (word32)keySz, iv, ivSz); + if (ret == 0) { + ret = wc_AesGcmEncryptUpdate(aes, NULL, NULL, 0, aad, + aadSz); + } + if (ret == 0) { + ret = wc_PKCS7_EncodeContentStream(pkcs7, NULL, aes, in, + inSz, out, WC_CIPHER_AES_GCM); + } + + if (ret == 0) { + ret = wc_AesGcmEncryptFinal(aes, authTag, authTagSz); + } #endif } wc_AesFree(aes); @@ -7015,6 +8232,11 @@ if (authTag == NULL) return BAD_FUNC_ARG; + if (pkcs7->encodeStream) { + WOLFSSL_MSG("Streaming encoding not supported with AES-CCM"); + return BAD_FUNC_ARG; + } + #ifdef WOLFSSL_SMALL_STACK if ((aes = (Aes *)XMALLOC(sizeof *aes, NULL, DYNAMIC_TYPE_AES)) == NULL) @@ -7022,9 +8244,9 @@ #endif ret = wc_AesInit(aes, heap, devId); if (ret == 0) { - ret = wc_AesCcmSetKey(aes, key, keySz); + ret = wc_AesCcmSetKey(aes, key, (word32)keySz); if (ret == 0) { - ret = wc_AesCcmEncrypt(aes, out, in, inSz, iv, ivSz, + ret = wc_AesCcmEncrypt(aes, out, in, (word32)inSz, iv, ivSz, authTag, authTagSz, aad, aadSz); #ifdef WOLFSSL_ASYNC_CRYPT /* async encrypt not available here, so block till done */ @@ -7045,9 +8267,14 @@ if (keySz != DES_KEYLEN || ivSz != DES_BLOCK_SIZE) return BAD_FUNC_ARG; + if (pkcs7->encodeStream) { + WOLFSSL_MSG("Streaming encoding not supported with DES3"); + return BAD_FUNC_ARG; + } + ret = wc_Des_SetKey(&des, key, iv, DES_ENCRYPTION); if (ret == 0) - ret = wc_Des_CbcEncrypt(&des, out, in, inSz); + ret = wc_Des_CbcEncrypt(&des, out, in, (word32)inSz); break; @@ -7055,11 +8282,16 @@ if (keySz != DES3_KEYLEN || ivSz != DES_BLOCK_SIZE) return BAD_FUNC_ARG; + if (pkcs7->encodeStream) { + WOLFSSL_MSG("Streaming encoding not supported with DES3"); + return BAD_FUNC_ARG; + } + ret = wc_Des3Init(&des3, heap, devId); if (ret == 0) { ret = wc_Des3_SetKey(&des3, key, iv, DES_ENCRYPTION); if (ret == 0) { - ret = wc_Des3_CbcEncrypt(&des3, out, in, inSz); + ret = wc_Des3_CbcEncrypt(&des3, out, in, (word32)inSz); #ifdef WOLFSSL_ASYNC_CRYPT /* async encrypt not available here, so block till done */ ret = wc_AsyncWait(ret, &des3.asyncDev, WC_ASYNC_FLAG_NONE); @@ -7146,9 +8378,9 @@ #endif ret = wc_AesInit(aes, heap, devId); if (ret == 0) { - ret = wc_AesSetKey(aes, key, keySz, iv, AES_DECRYPTION); + ret = wc_AesSetKey(aes, key, (word32)keySz, iv, AES_DECRYPTION); if (ret == 0) { - ret = wc_AesCbcDecrypt(aes, out, in, inSz); + ret = wc_AesCbcDecrypt(aes, out, in, (word32)inSz); #ifdef WOLFSSL_ASYNC_CRYPT /* async decrypt not available here, so block till done */ ret = wc_AsyncWait(ret, &aes->asyncDev, WC_ASYNC_FLAG_NONE); @@ -7183,9 +8415,9 @@ #endif ret = wc_AesInit(aes, heap, devId); if (ret == 0) { - ret = wc_AesGcmSetKey(aes, key, keySz); + ret = wc_AesGcmSetKey(aes, key, (word32)keySz); if (ret == 0) { - ret = wc_AesGcmDecrypt(aes, out, in, inSz, iv, ivSz, + ret = wc_AesGcmDecrypt(aes, out, in, (word32)inSz, iv, ivSz, authTag, authTagSz, aad, aadSz); #ifdef WOLFSSL_ASYNC_CRYPT /* async decrypt not available here, so block till done */ @@ -7222,9 +8454,9 @@ #endif ret = wc_AesInit(aes, heap, devId); if (ret == 0) { - ret = wc_AesCcmSetKey(aes, key, keySz); + ret = wc_AesCcmSetKey(aes, key, (word32)keySz); if (ret == 0) { - ret = wc_AesCcmDecrypt(aes, out, in, inSz, iv, ivSz, + ret = wc_AesCcmDecrypt(aes, out, in, (word32)inSz, iv, ivSz, authTag, authTagSz, aad, aadSz); #ifdef WOLFSSL_ASYNC_CRYPT /* async decrypt not available here, so block till done */ @@ -7247,7 +8479,7 @@ ret = wc_Des_SetKey(&des, key, iv, DES_DECRYPTION); if (ret == 0) - ret = wc_Des_CbcDecrypt(&des, out, in, inSz); + ret = wc_Des_CbcDecrypt(&des, out, in, (word32)inSz); break; case DES3b: @@ -7258,7 +8490,7 @@ if (ret == 0) { ret = wc_Des3_SetKey(&des3, key, iv, DES_DECRYPTION); if (ret == 0) { - ret = wc_Des3_CbcDecrypt(&des3, out, in, inSz); + ret = wc_Des3_CbcDecrypt(&des3, out, in, (word32)inSz); #ifdef WOLFSSL_ASYNC_CRYPT /* async decrypt not available here, so block till done */ ret = wc_AsyncWait(ret, &des3.asyncDev, WC_ASYNC_FLAG_NONE); @@ -7402,6 +8634,8 @@ return BAD_FUNC_ARG; padSz = wc_PKCS7_GetPadSize(inSz, blockSz); + if (padSz < 0) + return padSz; if (outSz < (inSz + padSz)) return BAD_FUNC_ARG; @@ -7456,7 +8690,7 @@ } /* generate random content encryption key, if needed */ - ret = PKCS7_GenerateContentEncryptionKey(pkcs7, blockKeySz); + ret = PKCS7_GenerateContentEncryptionKey(pkcs7, (word32)blockKeySz); if (ret < 0) { XFREE(recip, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; @@ -7471,10 +8705,10 @@ return ret; } - oriTypeLenSz = SetLength(oriTypeSz, oriTypeLen); + oriTypeLenSz = (int)SetLength(oriTypeSz, oriTypeLen); recipSeqSz = SetImplicit(ASN_SEQUENCE, 4, 1 + oriTypeLenSz + oriTypeSz + - oriValueSz, recipSeq); + oriValueSz, recipSeq, 0); idx = 0; XMEMCPY(recip->recip + idx, recipSeq, recipSeqSz); @@ -7508,7 +8742,7 @@ (void)options; - return idx; + return (int)idx; } #if !defined(NO_PWDBASED) && !defined(NO_SHA) @@ -7528,8 +8762,8 @@ case PBKDF2_OID: - ret = wc_PBKDF2(out, passwd, pLen, salt, saltSz, iterations, - outSz, prfOID); + ret = wc_PBKDF2(out, passwd, (int)pLen, salt, saltSz, iterations, + (int)outSz, prfOID); if (ret != 0) { return ret; } @@ -7580,7 +8814,7 @@ /* if user set out to NULL, give back required length */ if (out == NULL) { - *outSz = outLen; + *outSz = (word32)outLen; return LENGTH_ONLY_E; } @@ -7588,7 +8822,7 @@ if (*outSz < (word32)outLen) return BUFFER_E; - out[0] = cekSz; + out[0] = (byte)cekSz; out[1] = ~cek[0]; out[2] = ~cek[1]; out[3] = ~cek[2]; @@ -7603,21 +8837,21 @@ if (ret == 0) { /* encrypt, normal */ - ret = wc_PKCS7_EncryptContent(algID, (byte*)kek, kekSz, (byte*)iv, - ivSz, NULL, 0, NULL, 0, out, outLen, out, - pkcs7->devId, pkcs7->heap); + ret = wc_PKCS7_EncryptContent(pkcs7, algID, (byte*)kek, (int)kekSz, + (byte*)iv, (int)ivSz, NULL, 0, NULL, 0, out, + outLen, out); } if (ret == 0) { /* encrypt again, using last ciphertext block as IV */ lastBlock = out + (((outLen / blockSz) - 1) * blockSz); - ret = wc_PKCS7_EncryptContent(algID, (byte*)kek, kekSz, lastBlock, - blockSz, NULL, 0, NULL, 0, out, - outLen, out, pkcs7->devId, pkcs7->heap); + ret = wc_PKCS7_EncryptContent(pkcs7, algID, (byte*)kek, (int)kekSz, + lastBlock, blockSz, NULL, 0, NULL, 0, out, + outLen, out); } if (ret == 0) { - *outSz = outLen; + *outSz = (word32)outLen; } else { outLen = ret; } @@ -7673,21 +8907,21 @@ tmpIv = lastBlock - blockSz; /* decrypt last block */ - ret = wc_PKCS7_DecryptContent(pkcs7, algID, (byte*)kek, kekSz, tmpIv, + ret = wc_PKCS7_DecryptContent(pkcs7, algID, (byte*)kek, (int)kekSz, tmpIv, blockSz, NULL, 0, NULL, 0, lastBlock, blockSz, outTmp + inSz - blockSz, pkcs7->devId, pkcs7->heap); if (ret == 0) { /* using last decrypted block as IV, decrypt [0 ... n-1] blocks */ lastBlock = outTmp + inSz - blockSz; - ret = wc_PKCS7_DecryptContent(pkcs7, algID, (byte*)kek, kekSz, + ret = wc_PKCS7_DecryptContent(pkcs7, algID, (byte*)kek, (int)kekSz, lastBlock, blockSz, NULL, 0, NULL, 0, (byte*)in, inSz - blockSz, outTmp, pkcs7->devId, pkcs7->heap); } if (ret == 0) { /* decrypt using original kek and iv */ - ret = wc_PKCS7_DecryptContent(pkcs7, algID, (byte*)kek, kekSz, + ret = wc_PKCS7_DecryptContent(pkcs7, algID, (byte*)kek, (int)kekSz, (byte*)iv, ivSz, NULL, 0, NULL, 0, outTmp, inSz, outTmp, pkcs7->devId, pkcs7->heap); } @@ -7809,12 +9043,12 @@ return kekBlockSz; /* generate random CEK */ - ret = PKCS7_GenerateContentEncryptionKey(pkcs7, cekKeySz); + ret = PKCS7_GenerateContentEncryptionKey(pkcs7, (word32)cekKeySz); if (ret < 0) return ret; /* generate random IV */ - ret = wc_PKCS7_GenerateBlock(pkcs7, NULL, tmpIv, kekBlockSz); + ret = wc_PKCS7_GenerateBlock(pkcs7, NULL, tmpIv, (word32)kekBlockSz); if (ret != 0) return ret; @@ -7846,7 +9080,7 @@ /* generate KEK: expand password into KEK */ ret = wc_PKCS7_GenerateKEK_PWRI(pkcs7, passwd, pLen, salt, saltSz, kdfOID, hashOID, iterations, kek, - kekKeySz); + (word32)kekKeySz); if (ret < 0) { XFREE(recip, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -7855,23 +9089,23 @@ } /* generate encrypted key: encrypt CEK with KEK */ - ret = wc_PKCS7_PwriKek_KeyWrap(pkcs7, kek, kekKeySz, pkcs7->cek, + ret = wc_PKCS7_PwriKek_KeyWrap(pkcs7, kek, (word32)kekKeySz, pkcs7->cek, pkcs7->cekSz, encryptedKey, &encryptedKeySz, - tmpIv, kekBlockSz, encryptOID); + tmpIv, (word32)kekBlockSz, encryptOID); if (ret < 0) { XFREE(recip, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } - encryptedKeySz = ret; + encryptedKeySz = (word32)ret; /* put together encrypted key OCTET STRING */ encKeyOctetStrSz = SetOctetString(encryptedKeySz, encKeyOctetStr); totalSz += (encKeyOctetStrSz + encryptedKeySz); /* put together IV OCTET STRING */ - ivOctetStringSz = SetOctetString(kekBlockSz, ivOctetString); + ivOctetStringSz = SetOctetString((word32)kekBlockSz, ivOctetString); totalSz += (ivOctetStringSz + kekBlockSz); /* set PWRIAlgorithms AlgorithmIdentifier, adding (ivOctetStringSz + @@ -7888,7 +9122,7 @@ XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } - keyEncAlgoIdSz = ret; + keyEncAlgoIdSz = (word32)ret; totalSz += keyEncAlgoIdSz; /* KeyEncryptionAlgorithm SEQ */ @@ -7902,7 +9136,7 @@ totalSz += (kdfSaltOctetStrSz + saltSz); /* set KDF iteration count */ - kdfIterationsSz = SetMyVersion(iterations, kdfIterations, 0); + kdfIterationsSz = (word32)SetMyVersion((word32)iterations, kdfIterations, 0); totalSz += kdfIterationsSz; /* set KDF params SEQ */ @@ -7918,22 +9152,22 @@ XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } - kdfAlgoIdSz = ret; + kdfAlgoIdSz = (word32)ret; totalSz += kdfAlgoIdSz; /* set KeyDerivationAlgorithmIdentifier EXPLICIT [0] SEQ */ kdfAlgoIdSeqSz = SetExplicit(0, kdfAlgoIdSz + kdfParamsSeqSz + kdfSaltOctetStrSz + saltSz + kdfIterationsSz, - kdfAlgoIdSeq); + kdfAlgoIdSeq, 0); totalSz += kdfAlgoIdSeqSz; /* set PasswordRecipientInfo CMSVersion, MUST be 0 */ - verSz = SetMyVersion(0, ver, 0); + verSz = (word32)SetMyVersion(0, ver, 0); totalSz += verSz; recip->recipVersion = 0; /* set PasswordRecipientInfo SEQ */ - recipSeqSz = SetImplicit(ASN_SEQUENCE, 3, totalSz, recipSeq); + recipSeqSz = SetImplicit(ASN_SEQUENCE, 3, totalSz, recipSeq, 0); totalSz += recipSeqSz; if (totalSz > MAX_RECIP_SZ) { @@ -7976,7 +9210,7 @@ XMEMCPY(recip->recip + idx, encryptedKey, encryptedKeySz); idx += encryptedKeySz; - ForceZero(kek, kekBlockSz); + ForceZero(kek, (word32)kekBlockSz); ForceZero(encryptedKey, encryptedKeySz); XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -7998,7 +9232,7 @@ (void)options; - return idx; + return (int)idx; } /* Import password and KDF settings into a PKCS7 structure. Used for setting @@ -8089,7 +9323,7 @@ } /* generate random content encryption key, if needed */ - ret = PKCS7_GenerateContentEncryptionKey(pkcs7, blockKeySz); + ret = PKCS7_GenerateContentEncryptionKey(pkcs7, (word32)blockKeySz); if (ret < 0) { XFREE(recip, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; @@ -8114,7 +9348,7 @@ #endif encryptedKeySz = wc_PKCS7_KeyWrap(pkcs7->cek, pkcs7->cekSz, kek, kekSz, - encryptedKey, encryptedKeySz, keyWrapOID, + encryptedKey, (word32)encryptedKeySz, keyWrapOID, direction); if (encryptedKeySz < 0) { #ifdef WOLFSSL_SMALL_STACK @@ -8132,7 +9366,7 @@ return WC_KEY_SIZE_E; } - encKeyOctetStrSz = SetOctetString(encryptedKeySz, encKeyOctetStr); + encKeyOctetStrSz = SetOctetString((word32)encryptedKeySz, encKeyOctetStr); totalSz += (encKeyOctetStrSz + encryptedKeySz); /* KeyEncryptionAlgorithmIdentifier */ @@ -8171,12 +9405,12 @@ totalSz += kekIdSeqSz; /* version */ - verSz = SetMyVersion(4, ver, 0); + verSz = (word32)SetMyVersion(4, ver, 0); totalSz += verSz; recip->recipVersion = 4; /* KEKRecipientInfo SEQ */ - recipSeqSz = SetImplicit(ASN_SEQUENCE, 2, totalSz, recipSeq); + recipSeqSz = SetImplicit(ASN_SEQUENCE, 2, totalSz, recipSeq, 0); totalSz += recipSeqSz; if (totalSz > MAX_RECIP_SZ) { @@ -8238,7 +9472,7 @@ (void)options; - return idx; + return (int)idx; } @@ -8301,8 +9535,8 @@ WC_RNG rng; int blockSz, blockKeySz; - byte* plain; - byte* encryptedContent; + byte* plain = NULL; + byte* encryptedContent = NULL; Pkcs7EncodedRecip* tmpRecip = NULL; int recipSz, recipSetSz; @@ -8316,12 +9550,27 @@ byte tmpIv[MAX_CONTENT_IV_SIZE]; byte ivOctetString[MAX_OCTET_STR_SZ]; byte encContentOctet[MAX_OCTET_STR_SZ]; +#ifdef ASN_BER_TO_DER + word32 streamSz = 0; +#endif - if (pkcs7 == NULL || pkcs7->content == NULL || pkcs7->contentSz == 0) + if (pkcs7 == NULL + #ifndef ASN_BER_TO_DER + || pkcs7->content == NULL + #endif + || pkcs7->contentSz == 0) { return BAD_FUNC_ARG; + } +#ifndef ASN_BER_TO_DER if (output == NULL || outputSz == 0) return BAD_FUNC_ARG; +#else + /* if both output and callback are not set then error out */ + if ((output == NULL || outputSz == 0) && (pkcs7->streamOutCb == NULL)) { + return BAD_FUNC_ARG; + } +#endif blockKeySz = wc_PKCS7_GetOIDKeySize(pkcs7->encryptOID); if (blockKeySz < 0) @@ -8342,7 +9591,7 @@ } /* generate random content encryption key */ - ret = PKCS7_GenerateContentEncryptionKey(pkcs7, blockKeySz); + ret = PKCS7_GenerateContentEncryptionKey(pkcs7, (word32)blockKeySz); if (ret != 0) { return ret; } @@ -8385,7 +9634,7 @@ WOLFSSL_MSG("You must add at least one CMS recipient"); return PKCS7_RECIP_E; } - recipSetSz = SetSet(recipSz, recipSet); + recipSetSz = (int)SetSet((word32)recipSz, recipSet); /* version, defined in Section 6.1 of RFC 5652 */ kariVersion = wc_PKCS7_GetCMSVersion(pkcs7, ENVELOPED_DATA); @@ -8395,7 +9644,7 @@ return PKCS7_RECIP_E; } - verSz = SetMyVersion(kariVersion, ver, 0); + verSz = SetMyVersion((word32)kariVersion, ver, 0); ret = wc_InitRng_ex(&rng, pkcs7->heap, pkcs7->devId); if (ret != 0) { @@ -8404,7 +9653,7 @@ } /* generate IV for block cipher */ - ret = wc_PKCS7_GenerateBlock(pkcs7, &rng, tmpIv, blockSz); + ret = wc_PKCS7_GenerateBlock(pkcs7, &rng, tmpIv, (word32)blockSz); wc_FreeRng(&rng); if (ret != 0) { wc_PKCS7_FreeEncodedRecipientSet(pkcs7); @@ -8422,7 +9671,7 @@ contentTypeSz = ret; /* allocate encrypted content buffer and PKCS#7 padding */ - padSz = wc_PKCS7_GetPadSize(pkcs7->contentSz, blockSz); + padSz = wc_PKCS7_GetPadSize(pkcs7->contentSz, (word32)blockSz); if (padSz < 0) { wc_PKCS7_FreeEncodedRecipientSet(pkcs7); return padSz; @@ -8430,34 +9679,45 @@ encryptedOutSz = pkcs7->contentSz + padSz; - plain = (byte*)XMALLOC(encryptedOutSz, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - if (plain == NULL) { - wc_PKCS7_FreeEncodedRecipientSet(pkcs7); - return MEMORY_E; - } +#ifdef ASN_BER_TO_DER + if (pkcs7->getContentCb == NULL) +#endif + { + plain = (byte*)XMALLOC(encryptedOutSz, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + if (plain == NULL) { + wc_PKCS7_FreeEncodedRecipientSet(pkcs7); + return MEMORY_E; + } + + ret = wc_PKCS7_PadData(pkcs7->content, pkcs7->contentSz, plain, + (word32)encryptedOutSz, blockSz); + if (ret < 0) { + XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + wc_PKCS7_FreeEncodedRecipientSet(pkcs7); + return ret; + } - ret = wc_PKCS7_PadData(pkcs7->content, pkcs7->contentSz, plain, - encryptedOutSz, blockSz); - if (ret < 0) { - XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - wc_PKCS7_FreeEncodedRecipientSet(pkcs7); - return ret; } - encryptedContent = (byte*)XMALLOC(encryptedOutSz, pkcs7->heap, - DYNAMIC_TYPE_PKCS7); - if (encryptedContent == NULL) { - XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - wc_PKCS7_FreeEncodedRecipientSet(pkcs7); - return MEMORY_E; +#ifdef ASN_BER_TO_DER + if (pkcs7->streamOutCb == NULL) +#endif + { + encryptedContent = (byte*)XMALLOC(encryptedOutSz, pkcs7->heap, + DYNAMIC_TYPE_PKCS7); + if (encryptedContent == NULL) { + XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + wc_PKCS7_FreeEncodedRecipientSet(pkcs7); + return MEMORY_E; + } } /* put together IV OCTET STRING */ - ivOctetStringSz = SetOctetString(blockSz, ivOctetString); + ivOctetStringSz = (int)SetOctetString((word32)blockSz, ivOctetString); /* build up our ContentEncryptionAlgorithmIdentifier sequence, * adding (ivOctetStringSz + blockSz) for IV OCTET STRING */ - contentEncAlgoSz = SetAlgoID(pkcs7->encryptOID, contentEncAlgo, + contentEncAlgoSz = (int)SetAlgoID(pkcs7->encryptOID, contentEncAlgo, oidBlkType, ivOctetStringSz + blockSz); if (contentEncAlgoSz == 0) { @@ -8467,26 +9727,12 @@ return BAD_FUNC_ARG; } - /* encrypt content */ - ret = wc_PKCS7_EncryptContent(pkcs7->encryptOID, pkcs7->cek, - pkcs7->cekSz, tmpIv, blockSz, NULL, 0, NULL, 0, plain, - encryptedOutSz, encryptedContent, - pkcs7->devId, pkcs7->heap); - - if (ret != 0) { - XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - wc_PKCS7_FreeEncodedRecipientSet(pkcs7); - return ret; - } - - encContentOctetSz = SetImplicit(ASN_OCTET_STRING, 0, encryptedOutSz, - encContentOctet); - - encContentSeqSz = SetSequence(contentTypeSz + contentEncAlgoSz + - ivOctetStringSz + blockSz + - encContentOctetSz + encryptedOutSz, - encContentSeq); + encContentOctetSz = (int)SetImplicit(ASN_OCTET_STRING, 0, (word32)encryptedOutSz, + encContentOctet, pkcs7->encodeStream); + encContentSeqSz = (int)SetSequenceEx(contentTypeSz + contentEncAlgoSz + + ivOctetStringSz + blockSz + + encContentOctetSz + encryptedOutSz, + encContentSeq, pkcs7->encodeStream); /* keep track of sizes for outer wrapper layering */ totalSz = verSz + recipSetSz + recipSz + encContentSeqSz + contentTypeSz + @@ -8494,21 +9740,68 @@ encContentOctetSz + encryptedOutSz; /* EnvelopedData */ - envDataSeqSz = SetSequence(totalSz, envDataSeq); +#ifdef ASN_BER_TO_DER + if (pkcs7->encodeStream) { + word32 tmpIdx = 0; + + /* account for ending of encContentOctet */ + totalSz += ASN_INDEF_END_SZ; + + /* account for ending of encContentSeq */ + totalSz += ASN_INDEF_END_SZ; + + /* account for asn1 syntax around octet strings */ + StreamOctetString(NULL, (word32)encryptedOutSz, NULL, &streamSz, &tmpIdx); + totalSz += (streamSz - encryptedOutSz); + + /* resize encrypted content buffer */ + if (encryptedContent != NULL) { + XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + encryptedContent = (byte*)XMALLOC(streamSz, pkcs7->heap, + DYNAMIC_TYPE_PKCS7); + if (encryptedContent == NULL) { + XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + wc_PKCS7_FreeEncodedRecipientSet(pkcs7); + return MEMORY_E; + } + } + } +#endif + envDataSeqSz = (int)SetSequenceEx((word32)totalSz, envDataSeq, pkcs7->encodeStream); totalSz += envDataSeqSz; +#ifdef ASN_BER_TO_DER + if (pkcs7->encodeStream) { + totalSz += ASN_INDEF_END_SZ; + } +#endif /* outer content */ - outerContentSz = SetExplicit(0, totalSz, outerContent); + outerContentSz = (int)SetExplicit(0, (word32)totalSz, outerContent, pkcs7->encodeStream); +#ifdef ASN_BER_TO_DER + if (pkcs7->encodeStream) { + totalSz += ASN_INDEF_END_SZ; + } +#endif totalSz += outerContentTypeSz; totalSz += outerContentSz; if (pkcs7->contentOID != FIRMWARE_PKG_DATA) { /* ContentInfo */ - contentInfoSeqSz = SetSequence(totalSz, contentInfoSeq); + contentInfoSeqSz = (int)SetSequenceEx((word32)totalSz, contentInfoSeq, + pkcs7->encodeStream); totalSz += contentInfoSeqSz; + #ifdef ASN_BER_TO_DER + if (pkcs7->encodeStream) { + totalSz += ASN_INDEF_END_SZ; + } + #endif } - if (totalSz > (int)outputSz) { + if ((totalSz > (int)outputSz) + #ifdef ASN_BER_TO_DER + && (pkcs7->streamOutCb == NULL) + #endif + ) { WOLFSSL_MSG("Pkcs7_encrypt output buffer too small"); XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -8516,45 +9809,121 @@ return BUFFER_E; } + /* begin writing out PKCS7 bundle */ if (pkcs7->contentOID != FIRMWARE_PKG_DATA) { - XMEMCPY(output + idx, contentInfoSeq, contentInfoSeqSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + contentInfoSeq, (word32)contentInfoSeqSz); idx += contentInfoSeqSz; - XMEMCPY(output + idx, outerContentType, outerContentTypeSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + outerContentType, (word32)outerContentTypeSz); idx += outerContentTypeSz; - XMEMCPY(output + idx, outerContent, outerContentSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + outerContent, (word32)outerContentSz); idx += outerContentSz; } - XMEMCPY(output + idx, envDataSeq, envDataSeqSz); + + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + envDataSeq, (word32)envDataSeqSz); idx += envDataSeqSz; - XMEMCPY(output + idx, ver, verSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + ver, (word32)verSz); idx += verSz; - XMEMCPY(output + idx, recipSet, recipSetSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + recipSet, (word32)recipSetSz); idx += recipSetSz; /* copy in recipients from list */ tmpRecip = pkcs7->recipList; while (tmpRecip != NULL) { - XMEMCPY(output + idx, tmpRecip->recip, tmpRecip->recipSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + tmpRecip->recip, tmpRecip->recipSz); idx += tmpRecip->recipSz; tmpRecip = tmpRecip->next; } wc_PKCS7_FreeEncodedRecipientSet(pkcs7); - XMEMCPY(output + idx, encContentSeq, encContentSeqSz); + + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + encContentSeq, (word32)encContentSeqSz); idx += encContentSeqSz; - XMEMCPY(output + idx, contentType, contentTypeSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + contentType, (word32)contentTypeSz); idx += contentTypeSz; - XMEMCPY(output + idx, contentEncAlgo, contentEncAlgoSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + contentEncAlgo, (word32)contentEncAlgoSz); idx += contentEncAlgoSz; - XMEMCPY(output + idx, ivOctetString, ivOctetStringSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + ivOctetString, (word32)ivOctetStringSz); idx += ivOctetStringSz; - XMEMCPY(output + idx, tmpIv, blockSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + tmpIv, (word32)blockSz); idx += blockSz; - XMEMCPY(output + idx, encContentOctet, encContentOctetSz); + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + encContentOctet, (word32)encContentOctetSz); idx += encContentOctetSz; - XMEMCPY(output + idx, encryptedContent, encryptedOutSz); - idx += encryptedOutSz; - XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + /* encrypt content */ + ret = wc_PKCS7_EncryptContent(pkcs7, pkcs7->encryptOID, pkcs7->cek, + pkcs7->cekSz, tmpIv, blockSz, NULL, 0, NULL, 0, plain, + encryptedOutSz, encryptedContent); + if (ret != 0) { + if (encryptedContent != NULL) { + XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + } + + if (plain != NULL) { + XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + } + + wc_PKCS7_FreeEncodedRecipientSet(pkcs7); + return ret; + } + +#ifdef ASN_BER_TO_DER + /* stream the content (octet string with multiple octet elements) */ + if (pkcs7->encodeStream) { + byte indefEnd[ASN_INDEF_END_SZ * 5]; + word32 localIdx = 0; + + /* advance index past encrypted content */ + if (!pkcs7->streamOutCb) { + wc_PKCS7_WriteOut(pkcs7, (output)? output + idx : NULL, + encryptedContent, streamSz); + } + idx += streamSz; + + /* end of encrypted content */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of encrypted content info */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of Enveloped Data seq */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of outer content set */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + /* end of outer content info seq */ + localIdx += SetIndefEnd(indefEnd + localIdx); + + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + indefEnd, localIdx); + idx += localIdx; + } + else +#endif + { + wc_PKCS7_WriteOut(pkcs7, (output)? (output + idx) : NULL, + encryptedContent, encryptedOutSz); + idx += encryptedOutSz; + } + + if (plain != NULL) { + XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + } + + if (encryptedContent != NULL) { + XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + } return idx; } @@ -8567,6 +9936,7 @@ { int length, encryptedKeySz = 0, ret = 0; int keySz, version, sidType = 0; + int keyIdSize; word32 encOID = 0; word32 keyIdx; byte issuerHash[KEYID_SIZE]; @@ -8592,6 +9962,14 @@ mp_int serialNum[1]; RsaKey privKey[1]; #endif + XMEMSET(issuerHash, 0, sizeof(issuerHash)); + +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + keyIdSize = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + pkcs7->publicKeyOID))); +#else + keyIdSize = KEYID_SIZE; +#endif switch (pkcs7->state) { case WC_PKCS7_DECRYPT_KTRI: @@ -8665,7 +10043,7 @@ return ret; } - pkcs7->stream->expected = sz + MAX_ALGO_SZ + ASN_TAG_SZ + + pkcs7->stream->expected = (word32)sz + MAX_ALGO_SZ + ASN_TAG_SZ + MAX_LENGTH_SZ; if (pkcs7->stream->length > 0 && pkcs7->stream->length < pkcs7->stream->expected) { @@ -8680,11 +10058,12 @@ if (GetSequence(pkiMsg, idx, &length, pkiMsgSz) < 0) return ASN_PARSE_E; - if (GetNameHash(pkiMsg, idx, issuerHash, pkiMsgSz) < 0) + if (GetNameHash_ex(pkiMsg, idx, issuerHash, (int)pkiMsgSz, + pkcs7->publicKeyOID) < 0) return ASN_PARSE_E; /* if we found correct recipient, issuer hashes will match */ - if (XMEMCMP(issuerHash, pkcs7->issuerHash, KEYID_SIZE) == 0) { + if (XMEMCMP(issuerHash, pkcs7->issuerHash, keyIdSize) == 0) { *recipFound = 1; } @@ -8732,15 +10111,15 @@ if (GetLength(pkiMsg, idx, &length, pkiMsgSz) < 0) return ASN_PARSE_E; - if (KEYID_SIZE > pkiMsgSz - (*idx)) + if ((word32)keyIdSize > pkiMsgSz - (*idx)) return BUFFER_E; /* if we found correct recipient, SKID will match */ if (XMEMCMP(pkiMsg + (*idx), pkcs7->issuerSubjKeyId, - KEYID_SIZE) == 0) { + keyIdSize) == 0) { *recipFound = 1; } - (*idx) += KEYID_SIZE; + (*idx) += keyIdSize; } if (GetAlgoId(pkiMsg, idx, &encOID, oidKeyType, pkiMsgSz) < 0) @@ -8785,8 +10164,8 @@ if ((ret = wc_PKCS7_StreamEndCase(pkcs7, &tmpIdx, idx)) != 0) { break; } - wc_PKCS7_StreamStoreVar(pkcs7, encryptedKeySz, sidType, version); - pkcs7->stream->expected = encryptedKeySz; + wc_PKCS7_StreamStoreVar(pkcs7, (word32)encryptedKeySz, sidType, version); + pkcs7->stream->expected = (word32)encryptedKeySz; #endif wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_DECRYPT_KTRI_3); FALL_THROUGH; @@ -8797,7 +10176,7 @@ pkcs7->stream->expected, &pkiMsg, idx)) != 0) { return ret; } - encryptedKeySz = pkcs7->stream->expected; + encryptedKeySz = (int)pkcs7->stream->expected; #endif /* Always allocate to ensure aligned use with RSA */ @@ -8868,12 +10247,12 @@ if (encOID != RSAESOAEPk) { #endif keySz = wc_RsaPrivateDecryptInline(encryptedKey, - encryptedKeySz, &outKey, + (word32)encryptedKeySz, &outKey, privKey); #ifndef WC_NO_RSA_OAEP } else { - word32 outLen = wc_RsaEncryptSize(privKey); + word32 outLen = (word32)wc_RsaEncryptSize(privKey); outKey = (byte*)XMALLOC(outLen, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); if (!outKey) { @@ -8890,14 +10269,14 @@ } keySz = wc_RsaPrivateDecrypt_ex(encryptedKey, - encryptedKeySz, outKey, outLen, privKey, + (word32)encryptedKeySz, outKey, outLen, privKey, WC_RSA_OAEP_PAD, WC_HASH_TYPE_SHA, WC_MGF1SHA1, NULL, 0); } #endif } #ifdef WOLFSSL_ASYNC_CRYPT - } while (keySz == WC_PENDING_E); + } while (keySz == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif #ifdef WC_RSA_BLINDING wc_FreeRng(&rng); @@ -8908,7 +10287,7 @@ wc_FreeRsaKey(privKey); if (keySz <= 0 || outKey == NULL) { - ForceZero(encryptedKey, encryptedKeySz); + ForceZero(encryptedKey, (word32)encryptedKeySz); XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_WOLF_BIGINT); #ifdef WOLFSSL_SMALL_STACK XFREE(privKey, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -8922,9 +10301,9 @@ #endif return keySz; } else { - *decryptedKeySz = keySz; + *decryptedKeySz = (word32)keySz; XMEMCPY(decryptedKey, outKey, keySz); - ForceZero(encryptedKey, encryptedKeySz); + ForceZero(encryptedKey, (word32)encryptedKeySz); } XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_WOLF_BIGINT); @@ -9099,7 +10478,7 @@ } (*idx) += length; - kari->ukmSz = length; + kari->ukmSz = (word32)length; return 0; } @@ -9149,11 +10528,19 @@ { int length; byte tag; + int keyIdSize; if (kari == NULL || pkiMsg == NULL || idx == NULL || recipFound == NULL || rid == NULL) return BAD_FUNC_ARG; +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + keyIdSize = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + kari->decoded->signatureOID))); +#else + keyIdSize = KEYID_SIZE; +#endif + /* remove RecipientKeyIdentifier IMPLICIT [0] */ if (GetASNTag(pkiMsg, idx, &tag, pkiMsgSz) < 0) { return ASN_PARSE_E; @@ -9178,14 +10565,14 @@ if (GetLength(pkiMsg, idx, &length, pkiMsgSz) < 0) return ASN_PARSE_E; - if (length != KEYID_SIZE) + if (length != keyIdSize) return ASN_PARSE_E; - XMEMCPY(rid, pkiMsg + (*idx), KEYID_SIZE); + XMEMCPY(rid, pkiMsg + (*idx), keyIdSize); (*idx) += length; /* subject key id should match if recipient found */ - if (XMEMCMP(rid, kari->decoded->extSubjKeyId, KEYID_SIZE) == 0) { + if (XMEMCMP(rid, kari->decoded->extSubjKeyId, keyIdSize) == 0) { *recipFound = 1; } @@ -9200,6 +10587,7 @@ int* recipFound, byte* rid) { int length, ret; + int keyIdSize; #ifdef WOLFSSL_SMALL_STACK mp_int* serial; mp_int* recipSerial; @@ -9212,15 +10600,31 @@ return BAD_FUNC_ARG; } +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + keyIdSize = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + kari->decoded->signatureOID))); +#else + keyIdSize = KEYID_SIZE; +#endif + /* remove IssuerAndSerialNumber */ if (GetSequence(pkiMsg, idx, &length, pkiMsgSz) < 0) return ASN_PARSE_E; - if (GetNameHash(pkiMsg, idx, rid, pkiMsgSz) < 0) + if (GetNameHash_ex(pkiMsg, idx, rid, (int)pkiMsgSz, + kari->decoded->signatureOID) < 0) { return ASN_PARSE_E; + } /* if we found correct recipient, issuer hashes will match */ - if (XMEMCMP(rid, kari->decoded->issuerHash, KEYID_SIZE) == 0) { + if (kari->decodedInit == 1) { + if (XMEMCMP(rid, kari->decoded->issuerHash, keyIdSize) == 0) { + *recipFound = 1; + } + } + else { + /* can not confirm recipient serial number with no cert provided */ + WOLFSSL_MSG("No recipient cert loaded to match with CMS serial number"); *recipFound = 1; } @@ -9246,7 +10650,9 @@ return ASN_PARSE_E; } - ret = mp_read_unsigned_bin(recipSerial, kari->decoded->serial, + ret = mp_init(recipSerial); + if (ret == MP_OKAY) + ret = mp_read_unsigned_bin(recipSerial, kari->decoded->serial, kari->decoded->serialSz); if (ret != MP_OKAY) { mp_clear(serial); @@ -9258,7 +10664,8 @@ return ret; } - if (mp_cmp(recipSerial, serial) != MP_EQ) { + if (kari->decodedInit == 1 && + mp_cmp(recipSerial, serial) != MP_EQ) { mp_clear(serial); mp_clear(recipSerial); WOLFSSL_MSG("CMS serial number does not match recipient"); @@ -9595,14 +11002,14 @@ return ASN_PARSE_E; } - blockSz = wc_PKCS7_GetOIDBlockSize(pwriEncAlgoId); + blockSz = wc_PKCS7_GetOIDBlockSize((int)pwriEncAlgoId); if (blockSz < 0) { XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return blockSz; } /* get content-encryption key size, based on algorithm */ - kekKeySz = wc_PKCS7_GetOIDKeySize(pwriEncAlgoId); + kekKeySz = wc_PKCS7_GetOIDKeySize((int)pwriEncAlgoId); if (kekKeySz < 0) { XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return kekKeySz; @@ -9650,7 +11057,7 @@ } /* allocate temporary space for decrypted key */ - cekSz = length; + cekSz = (word32)length; cek = (byte*)XMALLOC(cekSz, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); if (cek == NULL) { XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -9666,8 +11073,8 @@ } ret = wc_PKCS7_GenerateKEK_PWRI(pkcs7, pkcs7->pass, pkcs7->passSz, - salt, saltSz, kdfAlgoId, hashOID, - iterations, kek, kekKeySz); + salt, (word32)saltSz, kdfAlgoId, hashOID, + iterations, kek, (word32)kekKeySz); if (ret < 0) { XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -9676,17 +11083,17 @@ } /* decrypt CEK with KEK */ - ret = wc_PKCS7_PwriKek_KeyUnWrap(pkcs7, kek, kekKeySz, - pkiMsg + (*idx), length, cek, - cekSz, tmpIv, blockSz, - pwriEncAlgoId); + ret = wc_PKCS7_PwriKek_KeyUnWrap(pkcs7, kek, (word32)kekKeySz, + pkiMsg + (*idx), (word32)length, cek, + cekSz, tmpIv, (word32)blockSz, + (int)pwriEncAlgoId); if (ret < 0) { XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(cek, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } - cekSz = ret; + cekSz = (word32)ret; if (*decryptedKeySz < cekSz) { WOLFSSL_MSG("Decrypted key buffer too small for CEK"); @@ -9759,7 +11166,7 @@ if (GetSequence(pkiMsg, idx, &length, pkiMsgSz) < 0) return ASN_PARSE_E; - kekIdSz = length; + kekIdSz = (word32)length; if (GetASNTag(pkiMsg, idx, &tag, pkiMsgSz) < 0) return ASN_PARSE_E; @@ -9772,14 +11179,14 @@ /* save keyIdentifier and length */ keyId = pkiMsg + *idx; - keyIdSz = length; + keyIdSz = (word32)length; *idx += keyIdSz; /* may have OPTIONAL GeneralizedTime */ localIdx = *idx; if ((*idx < kekIdSz) && GetASNTag(pkiMsg, &localIdx, &tag, pkiMsgSz) == 0 && tag == ASN_GENERALIZED_TIME) { - if (wc_GetDateInfo(pkiMsg + *idx, pkiMsgSz, &datePtr, &dateFormat, + if (wc_GetDateInfo(pkiMsg + *idx, (int)pkiMsgSz, &datePtr, &dateFormat, &dateLen) != 0) { return ASN_PARSE_E; } @@ -9828,15 +11235,15 @@ /* decrypt CEK with KEK */ if (pkcs7->wrapCEKCb) { - keySz = pkcs7->wrapCEKCb(pkcs7, pkiMsg + *idx, length, keyId, + keySz = pkcs7->wrapCEKCb(pkcs7, pkiMsg + *idx, (word32)length, keyId, keyIdSz, NULL, 0, decryptedKey, - *decryptedKeySz, keyWrapOID, + *decryptedKeySz, (int)keyWrapOID, (int)PKCS7_KEKRI, direction); } else { - keySz = wc_PKCS7_KeyWrap(pkiMsg + *idx, length, pkcs7->privateKey, + keySz = wc_PKCS7_KeyWrap(pkiMsg + *idx, (word32)length, pkcs7->privateKey, pkcs7->privateKeySz, decryptedKey, *decryptedKeySz, - keyWrapOID, direction); + (int)keyWrapOID, direction); } if (keySz <= 0) return keySz; @@ -9876,6 +11283,7 @@ int ret, keySz; int encryptedKeySz; int direction = 0; + int keyIdSize; word32 keyAgreeOID, keyWrapOID; byte rid[KEYID_SIZE]; @@ -9893,12 +11301,17 @@ WOLFSSL_ENTER("wc_PKCS7_DecryptKari"); if (pkcs7 == NULL || pkiMsg == NULL || - ((pkcs7->singleCert == NULL || pkcs7->singleCertSz == 0) && - pkcs7->wrapCEKCb == NULL) || idx == NULL || decryptedKey == NULL || decryptedKeySz == NULL) { return BAD_FUNC_ARG; } +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + keyIdSize = wc_HashGetDigestSize(wc_HashTypeConvert(HashIdAlg( + pkcs7->publicKeyOID))); +#else + keyIdSize = KEYID_SIZE; +#endif + switch (pkcs7->state) { case WC_PKCS7_DECRYPT_KARI: { WC_PKCS7_KARI* kari; @@ -9928,17 +11341,15 @@ encryptedKeySz = MAX_ENCRYPTED_KEY_SZ; /* parse cert and key */ - if (pkcs7->singleCert != NULL) { - ret = wc_PKCS7_KariParseRecipCert(kari, (byte*)pkcs7->singleCert, - pkcs7->singleCertSz, pkcs7->privateKey, - pkcs7->privateKeySz); - if (ret != 0) { - wc_PKCS7_KariFree(kari); - #ifdef WOLFSSL_SMALL_STACK - XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_PKCS7); - #endif - return ret; - } + ret = wc_PKCS7_KariParseRecipCert(kari, (byte*)pkcs7->singleCert, + pkcs7->singleCertSz, pkcs7->privateKey, + pkcs7->privateKeySz); + if (ret != 0) { + wc_PKCS7_KariFree(kari); + #ifdef WOLFSSL_SMALL_STACK + XFREE(encryptedKey, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + #endif + return ret; } /* remove OriginatorIdentifierOrKey */ @@ -9975,7 +11386,7 @@ /* if user has not explicitly set keyAgreeOID, set from one in bundle */ if (pkcs7->keyAgreeOID == 0) - pkcs7->keyAgreeOID = keyAgreeOID; + pkcs7->keyAgreeOID = (int)keyAgreeOID; /* set direction based on key wrap algorithm */ switch (keyWrapOID) { @@ -10027,7 +11438,7 @@ PRIVATE_KEY_UNLOCK(); ret = wc_ecc_export_x963(kari->senderKey, NULL, &tmpKeySz); PRIVATE_KEY_LOCK(); - if (ret != LENGTH_ONLY_E) { + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { return ret; } @@ -10053,10 +11464,10 @@ } tmpKeySz = (word32)ret; - keySz = pkcs7->wrapCEKCb(pkcs7, encryptedKey, encryptedKeySz, - rid, KEYID_SIZE, tmpKeyDer, tmpKeySz, + keySz = pkcs7->wrapCEKCb(pkcs7, encryptedKey, (word32)encryptedKeySz, + rid, (word32)keyIdSize, tmpKeyDer, tmpKeySz, decryptedKey, *decryptedKeySz, - keyWrapOID, (int)PKCS7_KARI, direction); + (int)keyWrapOID, (int)PKCS7_KARI, direction); XFREE(tmpKeyDer, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER); if (keySz > 0) { @@ -10069,7 +11480,7 @@ } else { /* create KEK */ - ret = wc_PKCS7_KariGenerateKEK(kari, pkcs7->rng, keyWrapOID, + ret = wc_PKCS7_KariGenerateKEK(kari, pkcs7->rng, (int)keyWrapOID, pkcs7->keyAgreeOID); if (ret != 0) { wc_PKCS7_KariFree(kari); @@ -10080,9 +11491,9 @@ } /* decrypt CEK with KEK */ - keySz = wc_PKCS7_KeyWrap(encryptedKey, encryptedKeySz, kari->kek, + keySz = wc_PKCS7_KeyWrap(encryptedKey, (word32)encryptedKeySz, kari->kek, kari->kekSz, decryptedKey, *decryptedKeySz, - keyWrapOID, direction); + (int)keyWrapOID, direction); } if (keySz <= 0) { wc_PKCS7_KariFree(kari); @@ -10454,7 +11865,7 @@ len = 0; ret = wc_BerToDer(pkiMsg, pkiMsgSz, NULL, &len); - if (ret != LENGTH_ONLY_E) + if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E)) return ret; pkcs7->der = (byte*)XMALLOC(len, pkcs7->heap, DYNAMIC_TYPE_PKCS7); if (pkcs7->der == NULL) @@ -10557,7 +11968,7 @@ break; } - pkcs7->stream->varOne = version; + pkcs7->stream->varOne = (word32)version; #endif wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_INFOSET_END); FALL_THROUGH; @@ -10569,7 +11980,7 @@ return ret; } pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: inSz; - version = pkcs7->stream->varOne; + version = (int)pkcs7->stream->varOne; #endif if (type == ENVELOPED_DATA) { @@ -10699,7 +12110,7 @@ byte* encryptedContent = NULL; int explicitOctet = 0; word32 localIdx; - byte tag; + byte tag = 0; if (pkcs7 == NULL) return BAD_FUNC_ARG; @@ -10817,7 +12228,7 @@ } if (ret == 0) { - pkcs7->contentOID = contentType; + pkcs7->contentOID = (int)contentType; } if (ret == 0 && GetAlgoId(pkiMsg, &idx, &encOID, oidBlkType, @@ -10825,12 +12236,12 @@ ret = ASN_PARSE_E; } - blockKeySz = wc_PKCS7_GetOIDKeySize(encOID); + blockKeySz = wc_PKCS7_GetOIDKeySize((int)encOID); if (ret == 0 && blockKeySz < 0) { ret = blockKeySz; } - expBlockSz = wc_PKCS7_GetOIDBlockSize(encOID); + expBlockSz = wc_PKCS7_GetOIDBlockSize((int)encOID); if (ret == 0 && expBlockSz < 0) { ret = expBlockSz; } @@ -10861,8 +12272,8 @@ break; } wc_PKCS7_StreamStoreVar(pkcs7, encOID, expBlockSz, length); - pkcs7->stream->contentSz = blockKeySz; - pkcs7->stream->expected = length + MAX_LENGTH_SZ + MAX_LENGTH_SZ + + pkcs7->stream->contentSz = (word32)blockKeySz; + pkcs7->stream->expected = (word32)length + MAX_LENGTH_SZ + MAX_LENGTH_SZ + ASN_TAG_SZ + ASN_TAG_SZ; #endif wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_ENV_4); @@ -10917,7 +12328,7 @@ if ((ret = wc_PKCS7_StreamEndCase(pkcs7, &tmpIdx, &idx)) != 0) { break; } - pkcs7->stream->expected = encryptedContentTotalSz; + pkcs7->stream->expected = (word32)encryptedContentTotalSz; wc_PKCS7_StreamGetVar(pkcs7, &encOID, &expBlockSz, 0); wc_PKCS7_StreamStoreVar(pkcs7, encOID, expBlockSz, explicitOctet); #endif @@ -10934,12 +12345,12 @@ wc_PKCS7_StreamGetVar(pkcs7, &encOID, &expBlockSz, &explicitOctet); tmpIv = pkcs7->stream->tmpIv; - encryptedContentTotalSz = pkcs7->stream->expected; + encryptedContentTotalSz = (int)pkcs7->stream->expected; /* restore decrypted key */ decryptedKey = pkcs7->stream->aad; decryptedKeySz = pkcs7->stream->aadSz; - blockKeySz = pkcs7->stream->contentSz; + blockKeySz = (int)pkcs7->stream->contentSz; #else ret = 0; #endif @@ -10966,7 +12377,7 @@ if (ret == 0) { ret = PKCS7_CacheEncryptedContent(pkcs7, &pkiMsg[idx], - encryptedContentSz); + (word32)encryptedContentSz); } if (ret != 0) { @@ -10984,7 +12395,7 @@ } else { /* cache encrypted content, no OCTET STRING */ ret = PKCS7_CacheEncryptedContent(pkcs7, &pkiMsg[idx], - encryptedContentTotalSz); + (word32)encryptedContentTotalSz); if (ret != 0) { break; } @@ -10993,10 +12404,10 @@ /* use cached content */ encryptedContent = pkcs7->cachedEncryptedContent; - encryptedContentSz = pkcs7->cachedEncryptedContentSz; + encryptedContentSz = (int)pkcs7->cachedEncryptedContentSz; /* decrypt encryptedContent */ - ret = wc_PKCS7_DecryptContent(pkcs7, encOID, decryptedKey, + ret = wc_PKCS7_DecryptContent(pkcs7, (int)encOID, decryptedKey, blockKeySz, tmpIv, expBlockSz, NULL, 0, NULL, 0, encryptedContent, encryptedContentSz, encryptedContent, pkcs7->devId, pkcs7->heap); @@ -11039,7 +12450,7 @@ } #ifndef NO_PKCS7_STREAM - if (ret < 0 && ret != WC_PKCS7_WANT_READ_E) { + if (ret < 0 && ret != WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) { wc_PKCS7_ResetStream(pkcs7); wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_START); if (pkcs7->cachedEncryptedContent != NULL) { @@ -11191,7 +12602,7 @@ verSz = SetMyVersion(0, ver, 0); /* generate random content encryption key */ - ret = PKCS7_GenerateContentEncryptionKey(pkcs7, blockKeySz); + ret = PKCS7_GenerateContentEncryptionKey(pkcs7, (word32)blockKeySz); if (ret != 0) { return ret; } @@ -11234,7 +12645,7 @@ WOLFSSL_MSG("You must add at least one CMS recipient"); return PKCS7_RECIP_E; } - recipSetSz = SetSet(recipSz, recipSet); + recipSetSz = (int)SetSet((word32)recipSz, recipSet); /* generate random nonce and IV for encryption */ switch (pkcs7->encryptOID) { @@ -11306,7 +12717,7 @@ sizeof(contentTypeValue)); if (ret > 0) { contentTypeAttrib.value = contentTypeValue; - contentTypeAttrib.valueSz = ret; + contentTypeAttrib.valueSz = (word32)ret; /* otherwise, try to set from custom content type */ } else { @@ -11343,11 +12754,16 @@ return MEMORY_E; } - FlattenAttributes(pkcs7, flatAuthAttribs, authAttribs, - authAttribsCount); + ret = FlattenAttributes(pkcs7, flatAuthAttribs, authAttribs, + (int)authAttribsCount); + if (ret != 0) { + wc_PKCS7_FreeEncodedRecipientSet(pkcs7); + XFREE(flatAuthAttribs, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + return ret; + } authAttribsSetSz = SetImplicit(ASN_SET, 1, authAttribsSz, - authAttribSet); + authAttribSet, 0); /* From RFC5083, "For the purpose of constructing the AAD, the * IMPLICIT [1] tag in the authAttrs field is not used for the @@ -11391,15 +12807,15 @@ } FlattenAttributes(pkcs7, flatUnauthAttribs, unauthAttribs, - unauthAttribsCount); + (int)unauthAttribsCount); unauthAttribsSetSz = SetImplicit(ASN_SET, 2, unauthAttribsSz, - unauthAttribSet); + unauthAttribSet, 0); } /* AES-GCM/CCM does NOT require padding for plaintext content or * AAD inputs RFC 5084 section 3.1 and 3.2, but we must alloc * full blocks to ensure crypto only gets full blocks */ - encryptedOutSz = pkcs7->contentSz; + encryptedOutSz = (int)pkcs7->contentSz; encryptedAllocSz = (encryptedOutSz % blockSz) ? encryptedOutSz + blockSz - (encryptedOutSz % blockSz) : @@ -11439,10 +12855,9 @@ } /* encrypt content */ - ret = wc_PKCS7_EncryptContent(pkcs7->encryptOID, pkcs7->cek, + ret = wc_PKCS7_EncryptContent(pkcs7, pkcs7->encryptOID, pkcs7->cek, pkcs7->cekSz, nonce, nonceSz, aadBuffer, aadBufferSz, authTag, - sizeof(authTag), plain, encryptedOutSz, encryptedContent, - pkcs7->devId, pkcs7->heap); + sizeof(authTag), plain, encryptedOutSz, encryptedContent); XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); plain = NULL; @@ -11478,10 +12893,10 @@ contentTypeSz = ret; /* put together nonce OCTET STRING */ - nonceOctetStringSz = SetOctetString(nonceSz, nonceOctetString); + nonceOctetStringSz = (int)SetOctetString(nonceSz, nonceOctetString); /* put together aes-ICVlen INTEGER */ - macIntSz = SetMyVersion(sizeof(authTag), macInt, 0); + macIntSz = (word32)SetMyVersion(sizeof(authTag), macInt, 0); /* add nonce and icv len into parameters string RFC5084 */ algoParamSeqSz = SetSequence(nonceOctetStringSz + nonceSz + macIntSz, @@ -11490,7 +12905,7 @@ /* build up our ContentEncryptionAlgorithmIdentifier sequence, * adding (nonceOctetStringSz + blockSz + macIntSz) for nonce OCTET STRING * and tag size */ - contentEncAlgoSz = SetAlgoID(pkcs7->encryptOID, contentEncAlgo, + contentEncAlgoSz = (int)SetAlgoID(pkcs7->encryptOID, contentEncAlgo, oidBlkType, nonceOctetStringSz + nonceSz + macIntSz + algoParamSeqSz); @@ -11504,15 +12919,14 @@ return BAD_FUNC_ARG; } - encContentOctetSz = SetImplicit(ASN_OCTET_STRING, 0, encryptedOutSz, - encContentOctet); - - encContentSeqSz = SetSequence(contentTypeSz + contentEncAlgoSz + + encContentOctetSz = (int)SetImplicit(ASN_OCTET_STRING, 0, (word32)encryptedOutSz, + encContentOctet, 0); + encContentSeqSz = (int)SetSequence(contentTypeSz + contentEncAlgoSz + nonceOctetStringSz + nonceSz + macIntSz + algoParamSeqSz + encContentOctetSz + encryptedOutSz, encContentSeq); - macOctetStringSz = SetOctetString(sizeof(authTag), macOctetString); + macOctetStringSz = (int)SetOctetString(sizeof(authTag), macOctetString); /* keep track of sizes for outer wrapper layering */ totalSz = verSz + recipSetSz + recipSz + encContentSeqSz + contentTypeSz + @@ -11522,16 +12936,16 @@ sizeof(authTag) + unauthAttribsSz + unauthAttribsSetSz; /* EnvelopedData */ - envDataSeqSz = SetSequence(totalSz, envDataSeq); + envDataSeqSz = (int)SetSequence((word32)totalSz, envDataSeq); totalSz += envDataSeqSz; /* outer content */ - outerContentSz = SetExplicit(0, totalSz, outerContent); + outerContentSz = (int)SetExplicit(0, (word32)totalSz, outerContent, 0); totalSz += outerContentTypeSz; totalSz += outerContentSz; /* ContentInfo */ - contentInfoSeqSz = SetSequence(totalSz, contentInfoSeq); + contentInfoSeqSz = (int)SetSequence((word32)totalSz, contentInfoSeq); totalSz += contentInfoSeqSz; if (totalSz > (int)outputSz) { @@ -11579,6 +12993,8 @@ idx += nonceSz; XMEMCPY(output + idx, macInt, macIntSz); idx += macIntSz; + + XMEMCPY(output + idx, encContentOctet, encContentOctetSz); idx += encContentOctetSz; XMEMCPY(output + idx, encryptedContent, encryptedOutSz); @@ -11710,10 +13126,14 @@ ret = MEMORY_E; break; } + else { + XMEMSET(decryptedKey, 0, MAX_ENCRYPTED_KEY_SZ); + } #ifndef NO_PKCS7_STREAM pkcs7->stream->key = decryptedKey; #endif #endif + XMEMSET(decryptedKey, 0, MAX_ENCRYPTED_KEY_SZ); FALL_THROUGH; case WC_PKCS7_DECRYPT_KTRI: @@ -11771,7 +13191,7 @@ } if (ret == 0) { - pkcs7->contentOID = contentType; + pkcs7->contentOID = (int)contentType; } if (ret == 0 && GetAlgoId(pkiMsg, &idx, &encOID, oidBlkType, @@ -11780,14 +13200,14 @@ } if (ret == 0) { - blockKeySz = wc_PKCS7_GetOIDKeySize(encOID); + blockKeySz = wc_PKCS7_GetOIDKeySize((int)encOID); if (blockKeySz < 0) { ret = blockKeySz; } } if (ret == 0) { - expBlockSz = wc_PKCS7_GetOIDBlockSize(encOID); + expBlockSz = wc_PKCS7_GetOIDBlockSize((int)encOID); if (expBlockSz < 0) { ret = expBlockSz; } @@ -11903,7 +13323,7 @@ /* store nonce for later */ if (nonceSz > 0) { - pkcs7->stream->nonceSz = nonceSz; + pkcs7->stream->nonceSz = (word32)nonceSz; pkcs7->stream->nonce = (byte*)XMALLOC(nonceSz, pkcs7->heap, DYNAMIC_TYPE_PKCS7); if (pkcs7->stream->nonce == NULL) { @@ -11915,7 +13335,7 @@ } } - pkcs7->stream->expected = encryptedContentSz; + pkcs7->stream->expected = (word32)encryptedContentSz; wc_PKCS7_StreamStoreVar(pkcs7, encOID, blockKeySz, encryptedContentSz); #endif @@ -11932,7 +13352,7 @@ } pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: inSz; - encryptedContentSz = pkcs7->stream->expected; + encryptedContentSz = (int)pkcs7->stream->expected; #else pkiMsgSz = inSz; #endif @@ -11944,7 +13364,7 @@ if (encOID == 0) expBlockSz = 1; else { - expBlockSz = wc_PKCS7_GetOIDBlockSize(encOID); + expBlockSz = wc_PKCS7_GetOIDBlockSize((int)encOID); if (expBlockSz < 0) { ret = expBlockSz; break; @@ -11982,10 +13402,10 @@ encodedAttribs = pkiMsg + idx; idx++; - if (GetLength(pkiMsg, &idx, &length, pkiMsgSz) < 0) + if (GetLength(pkiMsg, &idx, &length, pkiMsgSz) <= 0) ret = ASN_PARSE_E; #ifndef NO_PKCS7_STREAM - pkcs7->stream->expected = length; + pkcs7->stream->expected = (word32)length; #endif encodedAttribSz = length + (idx - encodedAttribIdx); @@ -12030,7 +13450,7 @@ return ret; } - length = pkcs7->stream->expected; + length = (int)pkcs7->stream->expected; encodedAttribs = pkcs7->stream->aad; #endif @@ -12118,7 +13538,7 @@ /* store tag for later */ if (authTagSz > 0) { - pkcs7->stream->tagSz = authTagSz; + pkcs7->stream->tagSz = (word32)authTagSz; pkcs7->stream->tag = (byte*)XMALLOC(authTagSz, pkcs7->heap, DYNAMIC_TYPE_PKCS7); if (pkcs7->stream->tag == NULL) { @@ -12143,7 +13563,7 @@ /* restore all variables needed */ if (pkcs7->stream->nonceSz > 0) { - nonceSz = pkcs7->stream->nonceSz; + nonceSz = (int)pkcs7->stream->nonceSz; if (nonceSz > GCM_NONCE_MID_SZ) { WOLFSSL_MSG("PKCS7 saved nonce is too large"); ret = BUFFER_E; @@ -12155,7 +13575,7 @@ } if (pkcs7->stream->tagSz > 0) { - authTagSz = pkcs7->stream->tagSz; + authTagSz = (int)pkcs7->stream->tagSz; if (authTagSz > AES_BLOCK_SIZE) { WOLFSSL_MSG("PKCS7 saved tag is too large"); ret = BUFFER_E; @@ -12180,9 +13600,9 @@ #endif /* decrypt encryptedContent */ - ret = wc_PKCS7_DecryptContent(pkcs7, encOID, decryptedKey, + ret = wc_PKCS7_DecryptContent(pkcs7, (int)encOID, decryptedKey, blockKeySz, nonce, nonceSz, encodedAttribs, encodedAttribSz, - authTag, authTagSz, encryptedContent, encryptedContentSz, + authTag, (word32)authTagSz, encryptedContent, encryptedContentSz, encryptedContent, pkcs7->devId, pkcs7->heap); if (ret != 0) { XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -12198,7 +13618,7 @@ XMEMCPY(output, encryptedContent, encryptedContentSz); /* free memory, zero out keys */ - ForceZero(encryptedContent, encryptedContentSz); + ForceZero(encryptedContent, (word32)encryptedContentSz); XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); ForceZero(decryptedKey, MAX_ENCRYPTED_KEY_SZ); #ifdef WOLFSSL_SMALL_STACK @@ -12220,7 +13640,7 @@ } #ifdef WOLFSSL_SMALL_STACK - if (ret != 0 && ret != WC_PKCS7_WANT_READ_E) { + if (ret != 0 && ret != WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) { if (decryptedKey != NULL) { ForceZero(decryptedKey, MAX_ENCRYPTED_KEY_SZ); } @@ -12228,7 +13648,7 @@ } #endif #ifndef NO_PKCS7_STREAM - if (ret != 0 && ret != WC_PKCS7_WANT_READ_E) { + if (ret != 0 && ret != WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) { wc_PKCS7_ResetStream(pkcs7); } #endif @@ -12327,7 +13747,7 @@ if (blockSz < 0) return blockSz; - padSz = wc_PKCS7_GetPadSize(pkcs7->contentSz, blockSz); + padSz = wc_PKCS7_GetPadSize(pkcs7->contentSz, (word32)blockSz); if (padSz < 0) return padSz; @@ -12339,7 +13759,7 @@ return MEMORY_E; ret = wc_PKCS7_PadData(pkcs7->content, pkcs7->contentSz, plain, - encryptedOutSz, blockSz); + (word32)encryptedOutSz, blockSz); if (ret < 0) { XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; @@ -12353,11 +13773,11 @@ } /* put together IV OCTET STRING */ - ivOctetStringSz = SetOctetString(blockSz, ivOctetString); + ivOctetStringSz = (int)SetOctetString((word32)blockSz, ivOctetString); /* build up ContentEncryptionAlgorithmIdentifier sequence, adding (ivOctetStringSz + blockSz) for IV OCTET STRING */ - contentEncAlgoSz = SetAlgoID(pkcs7->encryptOID, contentEncAlgo, + contentEncAlgoSz = (int)SetAlgoID(pkcs7->encryptOID, contentEncAlgo, oidBlkType, ivOctetStringSz + blockSz); if (contentEncAlgoSz == 0) { XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); @@ -12367,27 +13787,26 @@ /* encrypt content */ WOLFSSL_MSG("Encrypting the content"); - ret = wc_PKCS7_GenerateBlock(pkcs7, NULL, tmpIv, blockSz); + ret = wc_PKCS7_GenerateBlock(pkcs7, NULL, tmpIv, (word32)blockSz); if (ret != 0) { XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } - ret = wc_PKCS7_EncryptContent(pkcs7->encryptOID, pkcs7->encryptionKey, - pkcs7->encryptionKeySz, tmpIv, blockSz, NULL, 0, NULL, 0, - plain, encryptedOutSz, encryptedContent, - pkcs7->devId, pkcs7->heap); + ret = wc_PKCS7_EncryptContent(pkcs7, pkcs7->encryptOID, + pkcs7->encryptionKey, pkcs7->encryptionKeySz, tmpIv, blockSz, NULL, + 0, NULL, 0, plain, encryptedOutSz, encryptedContent); if (ret != 0) { XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); return ret; } - encContentOctetSz = SetImplicit(ASN_OCTET_STRING, 0, - encryptedOutSz, encContentOctet); + encContentOctetSz = (int)SetImplicit(ASN_OCTET_STRING, 0, + (word32)encryptedOutSz, encContentOctet, 0); - encContentSeqSz = SetSequence(contentTypeSz + contentEncAlgoSz + + encContentSeqSz = (int)SetSequence(contentTypeSz + contentEncAlgoSz + ivOctetStringSz + blockSz + encContentOctetSz + encryptedOutSz, encContentSeq); @@ -12423,8 +13842,15 @@ return MEMORY_E; } - FlattenAttributes(pkcs7, flatAttribs, attribs, attribsCount); - attribsSetSz = SetImplicit(ASN_SET, 1, attribsSz, attribSet); + ret = FlattenAttributes(pkcs7, flatAttribs, attribs, (int)attribsCount); + if (ret != 0) { + XFREE(attribs, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + XFREE(plain, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + XFREE(flatAttribs, pkcs7->heap, DYNAMIC_TYPE_PKCS7); + return ret; + } + attribsSetSz = SetImplicit(ASN_SET, 1, attribsSz, attribSet, 0); } else { attribsSz = 0; @@ -12437,16 +13863,16 @@ attribsSz + attribsSetSz; /* EncryptedData */ - encDataSeqSz = SetSequence(totalSz, encDataSeq); + encDataSeqSz = (int)SetSequence((word32)totalSz, encDataSeq); totalSz += encDataSeqSz; if (pkcs7->version != 3) { /* outer content */ - outerContentSz = SetExplicit(0, totalSz, outerContent); + outerContentSz = (int)SetExplicit(0, (word32)totalSz, outerContent, 0); totalSz += outerContentTypeSz; totalSz += outerContentSz; /* ContentInfo */ - contentInfoSeqSz = SetSequence(totalSz, contentInfoSeq); + contentInfoSeqSz = (int)SetSequence((word32)totalSz, contentInfoSeq); totalSz += contentInfoSeqSz; } else { contentInfoSeqSz = 0; @@ -12683,27 +14109,27 @@ ret = ASN_PARSE_E; if (ret == 0) { - pkcs7->contentOID = contentType; + pkcs7->contentOID = (int)contentType; } if (ret == 0 && (ret = GetAlgoId(pkiMsg, &idx, &encOID, oidBlkType, pkiMsgSz)) < 0) ret = ASN_PARSE_E; - if (ret == 0 && (expBlockSz = wc_PKCS7_GetOIDBlockSize(encOID)) < 0) + if (ret == 0 && (expBlockSz = wc_PKCS7_GetOIDBlockSize((int)encOID)) < 0) ret = expBlockSz; if (ret != 0) break; #ifndef NO_PKCS7_STREAM /* store expBlockSz for later */ - pkcs7->stream->varOne = expBlockSz; - pkcs7->stream->varTwo = encOID; + pkcs7->stream->varOne = (word32)expBlockSz; + pkcs7->stream->varTwo = (int)encOID; if ((ret = wc_PKCS7_StreamEndCase(pkcs7, &tmpIdx, &idx)) != 0) { break; } /* store version for later */ - pkcs7->stream->vers = version; + pkcs7->stream->vers = (word32)version; #endif wc_PKCS7_ChangeState(pkcs7, WC_PKCS7_STAGE4); FALL_THROUGH; @@ -12719,7 +14145,7 @@ pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: inSz; /* restore saved variables */ - expBlockSz = pkcs7->stream->varOne; + expBlockSz = (int)pkcs7->stream->varOne; #endif if (ret == 0 && GetASNTag(pkiMsg, &idx, &tag, pkiMsgSz) < 0) ret = ASN_PARSE_E; @@ -12737,7 +14163,7 @@ if (ret != 0) break; #ifndef NO_PKCS7_STREAM /* next chunk of data expected should have the IV */ - pkcs7->stream->expected = length; + pkcs7->stream->expected = (word32)length; if ((ret = wc_PKCS7_StreamEndCase(pkcs7, &tmpIdx, &idx)) != 0) { break; @@ -12758,7 +14184,7 @@ /* use IV buffer from stream structure */ tmpIv = pkcs7->stream->tmpIv; - length = pkcs7->stream->expected; + length = (int)pkcs7->stream->expected; #endif XMEMCPY(tmpIv, &pkiMsg[idx], length); idx += length; @@ -12803,10 +14229,10 @@ pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: inSz; /* restore saved variables */ - expBlockSz = pkcs7->stream->varOne; - encOID = pkcs7->stream->varTwo; + expBlockSz = (int)pkcs7->stream->varOne; + encOID = (word32)pkcs7->stream->varTwo; encryptedContentSz = pkcs7->stream->varThree; - version = pkcs7->stream->vers; + version = (int)pkcs7->stream->vers; tmpIv = pkcs7->stream->tmpIv; #endif if (ret == 0 && (encryptedContent = (byte*)XMALLOC( @@ -12820,7 +14246,7 @@ idx += encryptedContentSz; /* decrypt encryptedContent */ - ret = wc_PKCS7_DecryptContent(pkcs7, encOID, + ret = wc_PKCS7_DecryptContent(pkcs7, (int)encOID, pkcs7->encryptionKey, pkcs7->encryptionKeySz, tmpIv, expBlockSz, NULL, 0, NULL, 0, encryptedContent, encryptedContentSz, encryptedContent, @@ -12857,7 +14283,7 @@ ret = wc_PKCS7_DecodeUnprotectedAttributes(pkcs7, pkiMsg, pkiMsgSz, &idx); if (ret != 0) { - ForceZero(encryptedContent, encryptedContentSz); + ForceZero(encryptedContent, (word32)encryptedContentSz); XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); ret = ASN_PARSE_E; } @@ -12865,7 +14291,7 @@ } if (ret == 0) { - ForceZero(encryptedContent, encryptedContentSz); + ForceZero(encryptedContent, (word32)encryptedContentSz); XFREE(encryptedContent, pkcs7->heap, DYNAMIC_TYPE_PKCS7); /* go back and check the version now that attribs have been processed */ @@ -12933,6 +14359,68 @@ } #endif /* NO_PKCS7_ENCRYPTED_DATA */ + +/* set stream mode for encoding and signing + * returns 0 on success */ +int wc_PKCS7_SetStreamMode(PKCS7* pkcs7, byte flag, + CallbackGetContent getContentCb, + CallbackStreamOut streamOutCb, void* ctx) +{ + if (pkcs7 == NULL) { + return BAD_FUNC_ARG; + } +#ifdef ASN_BER_TO_DER + pkcs7->encodeStream = flag; + pkcs7->getContentCb = getContentCb; + pkcs7->streamOutCb = streamOutCb; + pkcs7->streamCtx = ctx; + return 0; +#else + (void)flag; + (void)getContentCb; + (void)streamOutCb; + (void)ctx; + return NOT_COMPILED_IN; +#endif +} + + +/* returns to current stream mode flag on success, negative values on fail */ +int wc_PKCS7_GetStreamMode(PKCS7* pkcs7) +{ + if (pkcs7 == NULL) { + return BAD_FUNC_ARG; + } +#ifdef ASN_BER_TO_DER + return pkcs7->encodeStream; +#else + return 0; +#endif +} + + +/* set option to not include certificates when creating a bundle + * returns 0 on success */ +int wc_PKCS7_SetNoCerts(PKCS7* pkcs7, byte flag) +{ + if (pkcs7 == NULL) { + return BAD_FUNC_ARG; + } + pkcs7->noCerts = flag; + return 0; +} + + +/* returns the current noCerts flag value on success, negative values on fail */ +int wc_PKCS7_GetNoCerts(PKCS7* pkcs7) +{ + if (pkcs7 == NULL) { + return BAD_FUNC_ARG; + } + return pkcs7->noCerts; +} + + #if defined(HAVE_LIBZ) && !defined(NO_PKCS7_COMPRESSED_DATA) /* build PKCS#7 compressedData content type, return encrypted size */ @@ -12987,7 +14475,7 @@ totalSz = contentOctetStrSz + compressedSz; /* EXPLICIT [0] eContentType */ - contentSeqSz = SetExplicit(0, totalSz, contentSeq); + contentSeqSz = SetExplicit(0, totalSz, contentSeq, 0); totalSz += contentSeqSz; /* eContentType OBJECT IDENTIFIER */ @@ -13047,7 +14535,7 @@ */ /* ContentInfo content EXPLICIT SEQUENCE */ - contentInfoContentSeqSz = SetExplicit(0, totalSz, contentInfoContentSeq); + contentInfoContentSeqSz = SetExplicit(0, totalSz, contentInfoContentSeq, 0); totalSz += contentInfoContentSeqSz; ret = wc_SetContentType(COMPRESSED_DATA, contentInfoTypeOid, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305.c 2024-08-03 07:30:00.000000000 +0000 @@ -55,7 +55,7 @@ #pragma warning(disable: 4127) #endif -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP #include #include @@ -70,6 +70,10 @@ #elif defined(__clang__) && defined(NO_AVX2_SUPPORT) #undef NO_AVX2_SUPPORT #endif + #if defined(_MSC_VER) && (_MSC_VER <= 1900) + #undef NO_AVX2_SUPPORT + #define NO_AVX2_SUPPORT + #endif #define HAVE_INTEL_AVX1 #ifndef NO_AVX2_SUPPORT @@ -77,13 +81,12 @@ #endif #endif -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP static word32 intel_flags = 0; static word32 cpu_flags_set = 0; #endif -#if (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP)) || \ - defined(POLY130564) +#if defined(USE_INTEL_POLY1305_SPEEDUP) || defined(POLY130564) #if defined(_MSC_VER) #define POLY1305_NOINLINE __declspec(noinline) #elif defined(__GNUC__) @@ -123,7 +126,7 @@ #endif #endif -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP #ifdef __cplusplus extern "C" { #endif @@ -266,7 +269,7 @@ static int poly1305_blocks(Poly1305* ctx, const unsigned char *m, size_t bytes) { -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP /* AVX2 is handled in wc_Poly1305Update. */ SAVE_VECTOR_REGISTERS(return _svr_ret;); poly1305_blocks_avx(ctx, m, bytes); @@ -400,7 +403,7 @@ */ static int poly1305_block(Poly1305* ctx, const unsigned char *m) { -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP /* No call to poly1305_block when AVX2, AVX2 does 4 blocks at a time. */ SAVE_VECTOR_REGISTERS(return _svr_ret;); poly1305_block_avx(ctx, m); @@ -415,8 +418,7 @@ #if !defined(WOLFSSL_ARMASM) || !defined(__aarch64__) int wc_Poly1305SetKey(Poly1305* ctx, const byte* key, word32 keySz) { -#if defined(POLY130564) && \ - !(defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP)) +#if defined(POLY130564) && !defined(USE_INTEL_POLY1305_SPEEDUP) word64 t0,t1; #endif @@ -437,7 +439,7 @@ if (keySz != 32 || ctx == NULL) return BAD_FUNC_ARG; -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP if (!cpu_flags_set) { intel_flags = cpuid_get_flags(); cpu_flags_set = 1; @@ -504,7 +506,7 @@ int wc_Poly1305Final(Poly1305* ctx, byte* mac) { -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP #elif defined(POLY130564) word64 h0,h1,h2,c; @@ -523,7 +525,7 @@ if (ctx == NULL || mac == NULL) return BAD_FUNC_ARG; -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP SAVE_VECTOR_REGISTERS(return _svr_ret;); #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) @@ -709,7 +711,7 @@ printf("\n"); #endif -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP #ifdef HAVE_INTEL_AVX2 if (IS_INTEL_AVX2(intel_flags)) { SAVE_VECTOR_REGISTERS(return _svr_ret;); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* poly1305_asm - * - * Copyright (C) 2006-2023 wolfSSL Inc. +/* poly1305_asm.S */ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -324,7 +324,7 @@ movq %rcx, %r8 andq $3, %rcx shrq $2, %r8 - # Multily by 5 + # Multiply by 5 leaq 0(%r8,%r8,4), %r8 addq %r8, %rax adcq $0x00, %rdx @@ -699,7 +699,11 @@ #endif /* __APPLE__ */ pushq %r12 pushq %rbx + pushq %r13 + pushq %r14 subq $0x140, %rsp + leaq L_poly1305_avx2_blocks_mask(%rip), %r13 + leaq L_poly1305_avx2_blocks_hibit(%rip), %r14 movq %rsp, %rcx andq $-32, %rcx addq $32, %rcx @@ -720,11 +724,11 @@ vpunpckhdq %ymm15, %ymm1, %ymm1 vpunpckldq %ymm15, %ymm3, %ymm2 vpunpckhdq %ymm15, %ymm3, %ymm3 - vmovdqu L_poly1305_avx2_blocks_hibit(%rip), %ymm4 + vmovdqu (%r14), %ymm4 vpsllq $6, %ymm1, %ymm1 vpsllq $12, %ymm2, %ymm2 vpsllq $18, %ymm3, %ymm3 - vmovdqu L_poly1305_avx2_blocks_mask(%rip), %ymm14 + vmovdqu (%r13), %ymm14 # Reduce, in place, the message data vpsrlq $26, %ymm0, %ymm10 vpsrlq $26, %ymm3, %ymm11 @@ -811,7 +815,7 @@ vmovdqa %ymm7, 64(%rcx) vmovdqa %ymm8, 96(%rcx) vmovdqa %ymm9, 128(%rcx) - vmovdqu L_poly1305_avx2_blocks_mask(%rip), %ymm14 + vmovdqu (%r13), %ymm14 # If not finished then loop over data cmpb $0x01, 616(%rdi) jne L_poly1305_avx2_blocks_start @@ -922,7 +926,7 @@ vpunpckhdq %ymm15, %ymm6, %ymm6 vpunpckldq %ymm15, %ymm8, %ymm7 vpunpckhdq %ymm15, %ymm8, %ymm8 - vmovdqu L_poly1305_avx2_blocks_hibit(%rip), %ymm9 + vmovdqu (%r14), %ymm9 vpsllq $6, %ymm6, %ymm6 vpsllq $12, %ymm7, %ymm7 vpsllq $18, %ymm8, %ymm8 @@ -1038,7 +1042,10 @@ movq %rcx, 40(%rdi) L_poly1305_avx2_blocks_complete: movb $0x01, 617(%rdi) + vzeroupper addq $0x140, %rsp + popq %r14 + popq %r13 popq %rbx popq %r12 repz retq @@ -1099,7 +1106,7 @@ incb %cl incb %dl L_poly1305_avx2_final_cmp_copy: - cmp %rcx, %rax + cmpb %cl, %al jne L_poly1305_avx2_final_start_copy #ifndef __APPLE__ callq poly1305_final_avx@plt @@ -1118,6 +1125,7 @@ vmovdqu %ymm0, 320(%rdi) movq $0x00, 608(%rdi) movw $0x00, 616(%rdi) + vzeroupper repz retq #ifndef __APPLE__ .size poly1305_final_avx2,.-poly1305_final_avx2 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.asm mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.asm --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.asm 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/poly1305_asm.asm 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1060 @@ +; /* poly1305_asm.asm */ +; /* +; * Copyright (C) 2006-2024 wolfSSL Inc. +; * +; * This file is part of wolfSSL. +; * +; * wolfSSL 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 of the License, or +; * (at your option) any later version. +; * +; * wolfSSL 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, write to the Free Software +; * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +; */ +IF @Version LT 1200 +; AVX2 instructions not recognized by old versions of MASM +IFNDEF NO_AVX2_SUPPORT +NO_AVX2_SUPPORT = 1 +ENDIF +; MOVBE instruction not recognized by old versions of MASM +IFNDEF NO_MOVBE_SUPPORT +NO_MOVBE_SUPPORT = 1 +ENDIF +ENDIF + +IFNDEF HAVE_INTEL_AVX1 +HAVE_INTEL_AVX1 = 1 +ENDIF +IFNDEF NO_AVX2_SUPPORT +HAVE_INTEL_AVX2 = 1 +ENDIF + +IFNDEF _WIN64 +_WIN64 = 1 +ENDIF + +IFDEF HAVE_INTEL_AVX1 +_text SEGMENT READONLY PARA +poly1305_setkey_avx PROC + push r12 + push r13 + mov r12, 1152921487695413247 + mov r13, 1152921487695413244 + mov rax, QWORD PTR [rdx] + mov r8, QWORD PTR [rdx+8] + mov r9, QWORD PTR [rdx+16] + mov r10, QWORD PTR [rdx+24] + and rax, r12 + and r8, r13 + mov r12, rax + mov r13, r8 + xor r11, r11 + mov QWORD PTR [rcx], rax + mov QWORD PTR [rcx+8], r8 + mov QWORD PTR [rcx+24], r11 + mov QWORD PTR [rcx+32], r11 + mov QWORD PTR [rcx+40], r11 + mov QWORD PTR [rcx+48], r9 + mov QWORD PTR [rcx+56], r10 + mov QWORD PTR [rcx+352], r11 + mov QWORD PTR [rcx+408], r11 + mov QWORD PTR [rcx+360], rax + mov QWORD PTR [rcx+416], r8 + add r12, rax + add r13, r8 + mov QWORD PTR [rcx+368], r12 + mov QWORD PTR [rcx+424], r13 + add r12, rax + add r13, r8 + mov QWORD PTR [rcx+376], r12 + mov QWORD PTR [rcx+432], r13 + add r12, rax + add r13, r8 + mov QWORD PTR [rcx+384], r12 + mov QWORD PTR [rcx+440], r13 + add r12, rax + add r13, r8 + mov QWORD PTR [rcx+392], r12 + mov QWORD PTR [rcx+448], r13 + add r12, rax + add r13, r8 + mov QWORD PTR [rcx+400], r12 + mov QWORD PTR [rcx+456], r13 + mov QWORD PTR [rcx+608], r11 + mov BYTE PTR [rcx+616], 1 + pop r13 + pop r12 + ret +poly1305_setkey_avx ENDP +_text ENDS +_text SEGMENT READONLY PARA +poly1305_block_avx PROC + push r15 + push rbx + push r12 + push r13 + push r14 + mov r15, QWORD PTR [rcx] + mov rbx, QWORD PTR [rcx+8] + mov r8, QWORD PTR [rcx+24] + mov r9, QWORD PTR [rcx+32] + mov r10, QWORD PTR [rcx+40] + xor r14, r14 + mov r14b, BYTE PTR [rcx+616] + ; h += m + mov r11, QWORD PTR [rdx] + mov r12, QWORD PTR [rdx+8] + add r8, r11 + adc r9, r12 + mov rax, rbx + adc r10, r14 + ; r[1] * h[0] => rdx, rax ==> t2, t1 + mul r8 + mov r12, rax + mov r13, rdx + ; r[0] * h[1] => rdx, rax ++> t2, t1 + mov rax, r15 + mul r9 + add r12, rax + mov rax, r15 + adc r13, rdx + ; r[0] * h[0] => rdx, rax ==> t4, t0 + mul r8 + mov r11, rax + mov r8, rdx + ; r[1] * h[1] => rdx, rax =+> t3, t2 + mov rax, rbx + mul r9 + ; r[0] * h[2] +> t2 + add r13, QWORD PTR [rcx+8*r10+352] + mov r14, rdx + add r12, r8 + adc r13, rax + ; r[1] * h[2] +> t3 + adc r14, QWORD PTR [rcx+8*r10+408] + ; r * h in r14, r13, r12, r11 + ; h = (r * h) mod 2^130 - 5 + mov r10, r13 + and r13, -4 + and r10, 3 + add r11, r13 + mov r8, r13 + adc r12, r14 + adc r10, 0 + shrd r8, r14, 2 + shr r14, 2 + add r8, r11 + adc r12, r14 + mov r9, r12 + adc r10, 0 + ; h in r10, r9, r8 + ; Store h to ctx + mov QWORD PTR [rcx+24], r8 + mov QWORD PTR [rcx+32], r9 + mov QWORD PTR [rcx+40], r10 + pop r14 + pop r13 + pop r12 + pop rbx + pop r15 + ret +poly1305_block_avx ENDP +_text ENDS +_text SEGMENT READONLY PARA +poly1305_blocks_avx PROC + push rdi + push rsi + push r15 + push rbx + push r12 + push r13 + push r14 + mov rdi, rcx + mov rsi, rdx + mov rcx, r8 + mov r15, QWORD PTR [rdi] + mov rbx, QWORD PTR [rdi+8] + mov r8, QWORD PTR [rdi+24] + mov r9, QWORD PTR [rdi+32] + mov r10, QWORD PTR [rdi+40] +L_poly1305_avx_blocks_start: + ; h += m + mov r11, QWORD PTR [rsi] + mov r12, QWORD PTR [rsi+8] + add r8, r11 + adc r9, r12 + mov rax, rbx + adc r10, 0 + ; r[1] * h[0] => rdx, rax ==> t2, t1 + mul r8 + mov r12, rax + mov r13, rdx + ; r[0] * h[1] => rdx, rax ++> t2, t1 + mov rax, r15 + mul r9 + add r12, rax + mov rax, r15 + adc r13, rdx + ; r[0] * h[0] => rdx, rax ==> t4, t0 + mul r8 + mov r11, rax + mov r8, rdx + ; r[1] * h[1] => rdx, rax =+> t3, t2 + mov rax, rbx + mul r9 + ; r[0] * h[2] +> t2 + add r13, QWORD PTR [rdi+8*r10+360] + mov r14, rdx + add r12, r8 + adc r13, rax + ; r[1] * h[2] +> t3 + adc r14, QWORD PTR [rdi+8*r10+416] + ; r * h in r14, r13, r12, r11 + ; h = (r * h) mod 2^130 - 5 + mov r10, r13 + and r13, -4 + and r10, 3 + add r11, r13 + mov r8, r13 + adc r12, r14 + adc r10, 0 + shrd r8, r14, 2 + shr r14, 2 + add r8, r11 + adc r12, r14 + mov r9, r12 + adc r10, 0 + ; h in r10, r9, r8 + ; Next block from message + add rsi, 16 + sub rcx, 16 + jg L_poly1305_avx_blocks_start + ; Store h to ctx + mov QWORD PTR [rdi+24], r8 + mov QWORD PTR [rdi+32], r9 + mov QWORD PTR [rdi+40], r10 + pop r14 + pop r13 + pop r12 + pop rbx + pop r15 + pop rsi + pop rdi + ret +poly1305_blocks_avx ENDP +_text ENDS +_text SEGMENT READONLY PARA +poly1305_final_avx PROC + push rdi + push rbx + push r12 + mov rdi, rcx + mov rbx, rdx + mov rax, QWORD PTR [rdi+608] + test rax, rax + je L_poly1305_avx_final_no_more + mov BYTE PTR [rdi+rax+480], 1 + jmp L_poly1305_avx_final_cmp_rem +L_poly1305_avx_final_zero_rem: + mov BYTE PTR [rdi+rax+480], 0 +L_poly1305_avx_final_cmp_rem: + inc al + cmp rax, 16 + jl L_poly1305_avx_final_zero_rem + mov BYTE PTR [rdi+616], 0 + lea rdx, QWORD PTR [rdi+480] + call poly1305_block_avx +L_poly1305_avx_final_no_more: + mov rax, QWORD PTR [rdi+24] + mov rdx, QWORD PTR [rdi+32] + mov rcx, QWORD PTR [rdi+40] + mov r11, QWORD PTR [rdi+48] + mov r12, QWORD PTR [rdi+56] + ; h %= p + ; h = (h + pad) + ; mod 2^130 - 5 + mov r8, rcx + and rcx, 3 + shr r8, 2 + ; Multiply by 5 + lea r8, QWORD PTR [r8+4*r8+0] + add rax, r8 + adc rdx, 0 + adc rcx, 0 + ; Fixup when between (1 << 130) - 1 and (1 << 130) - 5 + mov r8, rax + mov r9, rdx + mov r10, rcx + add r8, 5 + adc r9, 0 + adc r10, 0 + cmp r10, 4 + cmove rax, r8 + cmove rdx, r9 + ; h += pad + add rax, r11 + adc rdx, r12 + mov QWORD PTR [rbx], rax + mov QWORD PTR [rbx+8], rdx + ; Zero out r + mov QWORD PTR [rdi], 0 + mov QWORD PTR [rdi+8], 0 + ; Zero out h + mov QWORD PTR [rdi+24], 0 + mov QWORD PTR [rdi+32], 0 + mov QWORD PTR [rdi+40], 0 + ; Zero out pad + mov QWORD PTR [rdi+48], 0 + mov QWORD PTR [rdi+56], 0 + pop r12 + pop rbx + pop rdi + ret +poly1305_final_avx ENDP +_text ENDS +ENDIF +IFDEF HAVE_INTEL_AVX2 +_text SEGMENT READONLY PARA +poly1305_calc_powers_avx2 PROC + push r12 + push r13 + push r14 + push r15 + push rdi + push rsi + push rbx + push rbp + mov r8, QWORD PTR [rcx] + mov r9, QWORD PTR [rcx+8] + xor r10, r10 + ; Convert to 26 bits in 32 + mov rax, r8 + mov rdx, r8 + mov rsi, r8 + mov rbx, r9 + mov rbp, r9 + shr rdx, 26 + shrd rsi, r9, 52 + shr rbx, 14 + shrd rbp, r10, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+224], eax + mov DWORD PTR [rcx+228], edx + mov DWORD PTR [rcx+232], esi + mov DWORD PTR [rcx+236], ebx + mov DWORD PTR [rcx+240], ebp + mov DWORD PTR [rcx+244], 0 + ; Square 128-bit + mov rax, r9 + mul r8 + xor r14, r14 + mov r12, rax + mov r13, rdx + add r12, rax + adc r13, rdx + adc r14, 0 + mov rax, r8 + mul rax + mov r11, rax + mov rdi, rdx + mov rax, r9 + mul rax + add r12, rdi + adc r13, rax + adc r14, rdx + ; Reduce 256-bit to 130-bit + mov rax, r13 + mov rdx, r14 + and rax, -4 + and r13, 3 + add r11, rax + adc r12, rdx + adc r13, 0 + shrd rax, rdx, 2 + shr rdx, 2 + add r11, rax + adc r12, rdx + adc r13, 0 + mov rax, r13 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + and r13, 3 + add r11, rax + adc r12, 0 + adc r13, 0 + ; Convert to 26 bits in 32 + mov rax, r11 + mov rdx, r11 + mov rsi, r11 + mov rbx, r12 + mov rbp, r12 + shr rdx, 26 + shrd rsi, r12, 52 + shr rbx, 14 + shrd rbp, r13, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+256], eax + mov DWORD PTR [rcx+260], edx + mov DWORD PTR [rcx+264], esi + mov DWORD PTR [rcx+268], ebx + mov DWORD PTR [rcx+272], ebp + mov DWORD PTR [rcx+276], 0 + ; Multiply 128-bit by 130-bit + ; r1[0] * r2[0] + mov rax, r8 + mul r11 + mov r14, rax + mov r15, rdx + ; r1[0] * r2[1] + mov rax, r8 + mul r12 + mov rdi, 0 + add r15, rax + adc rdi, rdx + ; r1[1] * r2[0] + mov rax, r9 + mul r11 + mov rsi, 0 + add r15, rax + adc rdi, rdx + adc rsi, 0 + ; r1[0] * r2[2] + mov rax, r8 + mul r13 + add rdi, rax + adc rsi, rdx + ; r1[1] * r2[1] + mov rax, r9 + mul r12 + mov rbx, 0 + add rdi, rax + adc rsi, rdx + adc rbx, 0 + ; r1[1] * r2[2] + mov rax, r9 + mul r13 + add rsi, rax + adc rbx, rdx + ; Reduce 260-bit to 130-bit + mov rax, rdi + mov rdx, rsi + mov rbx, rbx + and rax, -4 + and rdi, 3 + add r14, rax + adc r15, rdx + adc rdi, rbx + shrd rax, rdx, 2 + shrd rdx, rbx, 2 + shr rbx, 2 + add r14, rax + adc r15, rdx + adc rdi, rbx + mov rax, rdi + and rdi, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r14, rax + adc r15, 0 + adc rdi, 0 + ; Convert to 26 bits in 32 + mov rax, r14 + mov rdx, r14 + mov rsi, r14 + mov rbx, r15 + mov rbp, r15 + shr rdx, 26 + shrd rsi, r15, 52 + shr rbx, 14 + shrd rbp, rdi, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+288], eax + mov DWORD PTR [rcx+292], edx + mov DWORD PTR [rcx+296], esi + mov DWORD PTR [rcx+300], ebx + mov DWORD PTR [rcx+304], ebp + mov DWORD PTR [rcx+308], 0 + ; Square 130-bit + mov rax, r12 + mul r11 + xor r14, r14 + mov r9, rax + mov r10, rdx + add r9, rax + adc r10, rdx + adc r14, 0 + mov rax, r11 + mul rax + mov r8, rax + mov rdi, rdx + mov rax, r12 + mul rax + add r9, rdi + adc r10, rax + adc r14, rdx + mov rax, r13 + mul rax + mov r15, rax + mov rax, r13 + mul r11 + add r10, rax + adc r14, rdx + adc r15, 0 + add r10, rax + adc r14, rdx + adc r15, 0 + mov rax, r13 + mul r12 + add r14, rax + adc r15, rdx + add r14, rax + adc r15, rdx + ; Reduce 260-bit to 130-bit + mov rax, r10 + mov rdx, r14 + mov rdi, r15 + and rax, -4 + and r10, 3 + add r8, rax + adc r9, rdx + adc r10, rdi + shrd rax, rdx, 2 + shrd rdx, rdi, 2 + shr rdi, 2 + add r8, rax + adc r9, rdx + adc r10, rdi + mov rax, r10 + and r10, 3 + shr rax, 2 + lea rax, QWORD PTR [rax+4*rax+0] + add r8, rax + adc r9, 0 + adc r10, 0 + ; Convert to 26 bits in 32 + mov rax, r8 + mov rdx, r8 + mov rsi, r8 + mov rbx, r9 + mov rbp, r9 + shr rdx, 26 + shrd rsi, r9, 52 + shr rbx, 14 + shrd rbp, r10, 40 + and rax, 67108863 + and rdx, 67108863 + and rsi, 67108863 + and rbx, 67108863 + and rbp, 67108863 + mov DWORD PTR [rcx+320], eax + mov DWORD PTR [rcx+324], edx + mov DWORD PTR [rcx+328], esi + mov DWORD PTR [rcx+332], ebx + mov DWORD PTR [rcx+336], ebp + mov DWORD PTR [rcx+340], 0 + pop rbp + pop rbx + pop rsi + pop rdi + pop r15 + pop r14 + pop r13 + pop r12 + ret +poly1305_calc_powers_avx2 ENDP +_text ENDS +_text SEGMENT READONLY PARA +poly1305_setkey_avx2 PROC + call poly1305_setkey_avx + vpxor ymm0, ymm0, ymm0 + vmovdqu YMMWORD PTR [rcx+64], ymm0 + vmovdqu YMMWORD PTR [rcx+96], ymm0 + vmovdqu YMMWORD PTR [rcx+128], ymm0 + vmovdqu YMMWORD PTR [rcx+160], ymm0 + vmovdqu YMMWORD PTR [rcx+192], ymm0 + mov QWORD PTR [rcx+608], 0 + mov WORD PTR [rcx+616], 0 + ret +poly1305_setkey_avx2 ENDP +_text ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx2_blocks_mask QWORD 67108863, 67108863, + 67108863, 67108863 +ptr_L_poly1305_avx2_blocks_mask QWORD L_poly1305_avx2_blocks_mask +_DATA ENDS +_DATA SEGMENT +ALIGN 16 +L_poly1305_avx2_blocks_hibit QWORD 16777216, 16777216, + 16777216, 16777216 +ptr_L_poly1305_avx2_blocks_hibit QWORD L_poly1305_avx2_blocks_hibit +_DATA ENDS +_text SEGMENT READONLY PARA +poly1305_blocks_avx2 PROC + push r12 + push rdi + push rsi + push rbx + push r13 + push r14 + mov rdi, rcx + mov rsi, rdx + mov rdx, r8 + sub rsp, 480 + vmovdqu OWORD PTR [rsp+320], xmm6 + vmovdqu OWORD PTR [rsp+336], xmm7 + vmovdqu OWORD PTR [rsp+352], xmm8 + vmovdqu OWORD PTR [rsp+368], xmm9 + vmovdqu OWORD PTR [rsp+384], xmm10 + vmovdqu OWORD PTR [rsp+400], xmm11 + vmovdqu OWORD PTR [rsp+416], xmm12 + vmovdqu OWORD PTR [rsp+432], xmm13 + vmovdqu OWORD PTR [rsp+448], xmm14 + vmovdqu OWORD PTR [rsp+464], xmm15 + mov r13, QWORD PTR [ptr_L_poly1305_avx2_blocks_mask] + mov r14, QWORD PTR [ptr_L_poly1305_avx2_blocks_hibit] + mov rcx, rsp + and rcx, -32 + add rcx, 32 + vpxor ymm15, ymm15, ymm15 + mov rbx, rcx + lea rax, QWORD PTR [rdi+64] + add rbx, 160 + cmp WORD PTR [rdi+616], 0 + jne L_poly1305_avx2_blocks_begin_h + ; Load the message data + vmovdqu ymm0, YMMWORD PTR [rsi] + vmovdqu ymm1, YMMWORD PTR [rsi+32] + vperm2i128 ymm2, ymm0, ymm1, 32 + vperm2i128 ymm0, ymm0, ymm1, 49 + vpunpckldq ymm1, ymm2, ymm0 + vpunpckhdq ymm3, ymm2, ymm0 + vpunpckldq ymm0, ymm1, ymm15 + vpunpckhdq ymm1, ymm1, ymm15 + vpunpckldq ymm2, ymm3, ymm15 + vpunpckhdq ymm3, ymm3, ymm15 + vmovdqu ymm4, YMMWORD PTR [r14] + vpsllq ymm1, ymm1, 6 + vpsllq ymm2, ymm2, 12 + vpsllq ymm3, ymm3, 18 + vmovdqu ymm14, YMMWORD PTR [r13] + ; Reduce, in place, the message data + vpsrlq ymm10, ymm0, 26 + vpsrlq ymm11, ymm3, 26 + vpand ymm0, ymm0, ymm14 + vpand ymm3, ymm3, ymm14 + vpaddq ymm1, ymm10, ymm1 + vpaddq ymm4, ymm11, ymm4 + vpsrlq ymm10, ymm1, 26 + vpsrlq ymm11, ymm4, 26 + vpand ymm1, ymm1, ymm14 + vpand ymm4, ymm4, ymm14 + vpaddq ymm2, ymm10, ymm2 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm2, 26 + vpaddq ymm0, ymm12, ymm0 + vpsrlq ymm11, ymm0, 26 + vpand ymm2, ymm2, ymm14 + vpand ymm0, ymm0, ymm14 + vpaddq ymm3, ymm10, ymm3 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm3, 26 + vpand ymm3, ymm3, ymm14 + vpaddq ymm4, ymm10, ymm4 + add rsi, 64 + sub rdx, 64 + jz L_poly1305_avx2_blocks_store + jmp L_poly1305_avx2_blocks_load_r4 +L_poly1305_avx2_blocks_begin_h: + ; Load the H values. + vmovdqu ymm0, YMMWORD PTR [rax] + vmovdqu ymm1, YMMWORD PTR [rax+32] + vmovdqu ymm2, YMMWORD PTR [rax+64] + vmovdqu ymm3, YMMWORD PTR [rax+96] + vmovdqu ymm4, YMMWORD PTR [rax+128] + ; Check if there is a power of r to load - otherwise use r^4. + cmp BYTE PTR [rdi+616], 0 + je L_poly1305_avx2_blocks_load_r4 + ; Load the 4 powers of r - r^4, r^3, r^2, r^1. + vmovdqu ymm8, YMMWORD PTR [rdi+224] + vmovdqu ymm7, YMMWORD PTR [rdi+256] + vmovdqu ymm6, YMMWORD PTR [rdi+288] + vmovdqu ymm5, YMMWORD PTR [rdi+320] + vpermq ymm5, ymm5, 216 + vpermq ymm6, ymm6, 216 + vpermq ymm7, ymm7, 216 + vpermq ymm8, ymm8, 216 + vpunpcklqdq ymm10, ymm5, ymm6 + vpunpckhqdq ymm11, ymm5, ymm6 + vpunpcklqdq ymm12, ymm7, ymm8 + vpunpckhqdq ymm13, ymm7, ymm8 + vperm2i128 ymm5, ymm10, ymm12, 32 + vperm2i128 ymm7, ymm10, ymm12, 49 + vperm2i128 ymm9, ymm11, ymm13, 32 + vpsrlq ymm6, ymm5, 32 + vpsrlq ymm8, ymm7, 32 + jmp L_poly1305_avx2_blocks_mul_5 +L_poly1305_avx2_blocks_load_r4: + ; Load r^4 into all four positions. + vmovdqu ymm13, YMMWORD PTR [rdi+320] + vpermq ymm5, ymm13, 0 + vpsrlq ymm14, ymm13, 32 + vpermq ymm7, ymm13, 85 + vpermq ymm9, ymm13, 170 + vpermq ymm6, ymm14, 0 + vpermq ymm8, ymm14, 85 +L_poly1305_avx2_blocks_mul_5: + ; Multiply top 4 26-bit values of all four H by 5 + vpslld ymm10, ymm6, 2 + vpslld ymm11, ymm7, 2 + vpslld ymm12, ymm8, 2 + vpslld ymm13, ymm9, 2 + vpaddq ymm10, ymm6, ymm10 + vpaddq ymm11, ymm7, ymm11 + vpaddq ymm12, ymm8, ymm12 + vpaddq ymm13, ymm9, ymm13 + ; Store powers of r and multiple of 5 for use in multiply. + vmovdqa YMMWORD PTR [rbx], ymm10 + vmovdqa YMMWORD PTR [rbx+32], ymm11 + vmovdqa YMMWORD PTR [rbx+64], ymm12 + vmovdqa YMMWORD PTR [rbx+96], ymm13 + vmovdqa YMMWORD PTR [rcx], ymm5 + vmovdqa YMMWORD PTR [rcx+32], ymm6 + vmovdqa YMMWORD PTR [rcx+64], ymm7 + vmovdqa YMMWORD PTR [rcx+96], ymm8 + vmovdqa YMMWORD PTR [rcx+128], ymm9 + vmovdqu ymm14, YMMWORD PTR [r13] + ; If not finished then loop over data + cmp BYTE PTR [rdi+616], 1 + jne L_poly1305_avx2_blocks_start + ; Do last multiply, reduce, add the four H together and move to + ; 32-bit registers + vpmuludq ymm5, ymm4, [rbx] + vpmuludq ymm10, ymm3, [rbx+32] + vpmuludq ymm6, ymm4, [rbx+32] + vpmuludq ymm11, ymm3, [rbx+64] + vpmuludq ymm7, ymm4, [rbx+64] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbx+64] + vpmuludq ymm8, ymm4, [rbx+96] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbx+96] + vpmuludq ymm10, ymm2, [rbx+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbx+96] + vpmuludq ymm12, ymm3, [rcx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm9, ymm4, [rcx] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rcx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rcx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rcx] + vpmuludq ymm12, ymm2, [rcx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rcx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rcx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rcx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rcx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rcx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rcx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rcx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rcx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rcx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + vpsrldq ymm5, ymm0, 8 + vpsrldq ymm6, ymm1, 8 + vpsrldq ymm7, ymm2, 8 + vpsrldq ymm8, ymm3, 8 + vpsrldq ymm9, ymm4, 8 + vpaddq ymm0, ymm5, ymm0 + vpaddq ymm1, ymm6, ymm1 + vpaddq ymm2, ymm7, ymm2 + vpaddq ymm3, ymm8, ymm3 + vpaddq ymm4, ymm9, ymm4 + vpermq ymm5, ymm0, 2 + vpermq ymm6, ymm1, 2 + vpermq ymm7, ymm2, 2 + vpermq ymm8, ymm3, 2 + vpermq ymm9, ymm4, 2 + vpaddq ymm0, ymm5, ymm0 + vpaddq ymm1, ymm6, ymm1 + vpaddq ymm2, ymm7, ymm2 + vpaddq ymm3, ymm8, ymm3 + vpaddq ymm4, ymm9, ymm4 + vmovd r8d, xmm0 + vmovd r9d, xmm1 + vmovd r10d, xmm2 + vmovd r11d, xmm3 + vmovd r12d, xmm4 + jmp L_poly1305_avx2_blocks_end_calc +L_poly1305_avx2_blocks_start: + vmovdqu ymm5, YMMWORD PTR [rsi] + vmovdqu ymm6, YMMWORD PTR [rsi+32] + vperm2i128 ymm7, ymm5, ymm6, 32 + vperm2i128 ymm5, ymm5, ymm6, 49 + vpunpckldq ymm6, ymm7, ymm5 + vpunpckhdq ymm8, ymm7, ymm5 + vpunpckldq ymm5, ymm6, ymm15 + vpunpckhdq ymm6, ymm6, ymm15 + vpunpckldq ymm7, ymm8, ymm15 + vpunpckhdq ymm8, ymm8, ymm15 + vmovdqu ymm9, YMMWORD PTR [r14] + vpsllq ymm6, ymm6, 6 + vpsllq ymm7, ymm7, 12 + vpsllq ymm8, ymm8, 18 + vpmuludq ymm10, ymm4, [rbx] + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm10, ymm3, [rbx+32] + vpmuludq ymm11, ymm4, [rbx+32] + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm11, ymm3, [rbx+64] + vpmuludq ymm12, ymm4, [rbx+64] + vpaddq ymm7, ymm12, ymm7 + vpaddq ymm5, ymm10, ymm5 + vpmuludq ymm12, ymm2, [rbx+64] + vpmuludq ymm13, ymm4, [rbx+96] + vpaddq ymm8, ymm13, ymm8 + vpaddq ymm6, ymm11, ymm6 + vpmuludq ymm13, ymm1, [rbx+96] + vpmuludq ymm10, ymm2, [rbx+96] + vpaddq ymm5, ymm12, ymm5 + vpmuludq ymm11, ymm3, [rbx+96] + vpmuludq ymm12, ymm3, [rcx] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm4, [rcx] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm13, ymm0, [rcx] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm10, ymm1, [rcx] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm11, ymm2, [rcx] + vpmuludq ymm12, ymm2, [rcx+32] + vpaddq ymm5, ymm13, ymm5 + vpmuludq ymm13, ymm3, [rcx+32] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rcx+32] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm1, [rcx+32] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rcx+64] + vpaddq ymm9, ymm13, ymm9 + vpmuludq ymm13, ymm2, [rcx+64] + vpaddq ymm6, ymm10, ymm6 + vpmuludq ymm10, ymm0, [rcx+64] + vpaddq ymm7, ymm11, ymm7 + vpmuludq ymm11, ymm0, [rcx+96] + vpaddq ymm8, ymm12, ymm8 + vpmuludq ymm12, ymm1, [rcx+96] + vpaddq ymm9, ymm13, ymm9 + vpaddq ymm7, ymm10, ymm7 + vpmuludq ymm13, ymm0, [rcx+128] + vpaddq ymm8, ymm11, ymm8 + vpaddq ymm9, ymm12, ymm9 + vpaddq ymm9, ymm13, ymm9 + vpsrlq ymm10, ymm5, 26 + vpsrlq ymm11, ymm8, 26 + vpand ymm5, ymm5, ymm14 + vpand ymm8, ymm8, ymm14 + vpaddq ymm6, ymm10, ymm6 + vpaddq ymm9, ymm11, ymm9 + vpsrlq ymm10, ymm6, 26 + vpsrlq ymm11, ymm9, 26 + vpand ymm1, ymm6, ymm14 + vpand ymm4, ymm9, ymm14 + vpaddq ymm7, ymm10, ymm7 + vpslld ymm12, ymm11, 2 + vpaddd ymm12, ymm11, ymm12 + vpsrlq ymm10, ymm7, 26 + vpaddq ymm5, ymm12, ymm5 + vpsrlq ymm11, ymm5, 26 + vpand ymm2, ymm7, ymm14 + vpand ymm0, ymm5, ymm14 + vpaddq ymm8, ymm10, ymm8 + vpaddq ymm1, ymm11, ymm1 + vpsrlq ymm10, ymm8, 26 + vpand ymm3, ymm8, ymm14 + vpaddq ymm4, ymm10, ymm4 + add rsi, 64 + sub rdx, 64 + jnz L_poly1305_avx2_blocks_start +L_poly1305_avx2_blocks_store: + ; Store four H values - state + vmovdqu YMMWORD PTR [rax], ymm0 + vmovdqu YMMWORD PTR [rax+32], ymm1 + vmovdqu YMMWORD PTR [rax+64], ymm2 + vmovdqu YMMWORD PTR [rax+96], ymm3 + vmovdqu YMMWORD PTR [rax+128], ymm4 +L_poly1305_avx2_blocks_end_calc: + cmp BYTE PTR [rdi+616], 0 + je L_poly1305_avx2_blocks_complete + mov rax, r8 + mov rdx, r10 + mov rcx, r12 + shr rdx, 12 + shr rcx, 24 + shl r9, 26 + shl r10, 52 + shl r11, 14 + shl r12, 40 + add rax, r9 + adc rax, r10 + adc rdx, r11 + adc rdx, r12 + adc rcx, 0 + mov r8, rcx + and rcx, 3 + shr r8, 2 + lea r8, QWORD PTR [r8+4*r8+0] + add rax, r8 + adc rdx, 0 + adc rcx, 0 + mov QWORD PTR [rdi+24], rax + mov QWORD PTR [rdi+32], rdx + mov QWORD PTR [rdi+40], rcx +L_poly1305_avx2_blocks_complete: + mov BYTE PTR [rdi+617], 1 + vzeroupper + vmovdqu xmm6, OWORD PTR [rsp+320] + vmovdqu xmm7, OWORD PTR [rsp+336] + vmovdqu xmm8, OWORD PTR [rsp+352] + vmovdqu xmm9, OWORD PTR [rsp+368] + vmovdqu xmm10, OWORD PTR [rsp+384] + vmovdqu xmm11, OWORD PTR [rsp+400] + vmovdqu xmm12, OWORD PTR [rsp+416] + vmovdqu xmm13, OWORD PTR [rsp+432] + vmovdqu xmm14, OWORD PTR [rsp+448] + vmovdqu xmm15, OWORD PTR [rsp+464] + add rsp, 480 + pop r14 + pop r13 + pop rbx + pop rsi + pop rdi + pop r12 + ret +poly1305_blocks_avx2 ENDP +_text ENDS +_text SEGMENT READONLY PARA +poly1305_final_avx2 PROC + push rdi + push rsi + mov rdi, rcx + mov rsi, rdx + mov BYTE PTR [rdi+616], 1 + mov cl, BYTE PTR [rdi+617] + cmp cl, 0 + je L_poly1305_avx2_final_done_blocks_X4 + push rsi + mov r8, 64 + xor rdx, rdx + mov rcx, rdi + call poly1305_blocks_avx2 + pop rsi +L_poly1305_avx2_final_done_blocks_X4: + mov rax, QWORD PTR [rdi+608] + mov rcx, rax + and rcx, -16 + cmp cl, 0 + je L_poly1305_avx2_final_done_blocks + push rcx + push rax + push rsi + mov r8, rcx + lea rdx, QWORD PTR [rdi+480] + mov rcx, rdi + call poly1305_blocks_avx + pop rsi + pop rax + pop rcx +L_poly1305_avx2_final_done_blocks: + sub QWORD PTR [rdi+608], rcx + xor rdx, rdx + jmp L_poly1305_avx2_final_cmp_copy +L_poly1305_avx2_final_start_copy: + mov r8b, BYTE PTR [rdi+rcx+480] + mov BYTE PTR [rdi+rdx+480], r8b + inc cl + inc dl +L_poly1305_avx2_final_cmp_copy: + cmp al, cl + jne L_poly1305_avx2_final_start_copy + mov rcx, rdi + mov rdx, rsi + call poly1305_final_avx + vpxor ymm0, ymm0, ymm0 + vmovdqu YMMWORD PTR [rdi+64], ymm0 + vmovdqu YMMWORD PTR [rdi+96], ymm0 + vmovdqu YMMWORD PTR [rdi+128], ymm0 + vmovdqu YMMWORD PTR [rdi+160], ymm0 + vmovdqu YMMWORD PTR [rdi+192], ymm0 + vmovdqu YMMWORD PTR [rdi+224], ymm0 + vmovdqu YMMWORD PTR [rdi+256], ymm0 + vmovdqu YMMWORD PTR [rdi+288], ymm0 + vmovdqu YMMWORD PTR [rdi+320], ymm0 + mov QWORD PTR [rdi+608], 0 + mov WORD PTR [rdi+616], 0 + vzeroupper + pop rsi + pop rdi + ret +poly1305_final_avx2 ENDP +_text ENDS +ENDIF +END diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -1,34 +1,96 @@ # ESP32 Port -Support for the ESP32-WROOM-32 on-board crypto hardware acceleration for symmetric AES, SHA1/SHA256/SHA384/SHA512 and RSA primitive including mul, mulmod and exptmod. +Support for the ESP32 on-board cryptographic hardware acceleration for symmetric AES, SHA1/SHA256/SHA384/SHA512 and RSA primitive including mul, mulmod and exptmod. + +* ESP32 - Supported +* ESP32S2 - Supported +* ESP32S3 - Supported +* ESP32C2 - Software only (contact support to request hardware acceleration) +* ESP32C3 - Supported +* ESP32C6 - Supported +* ESP32H2 - Software only (contact support to request hardware acceleration) ## ESP32 Acceleration -For detail about ESP32 HW Acceleration, you can find in [Technical Reference Manual](https://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf) +More details about ESP32 HW Accelerationcan be found in: + +* [ESP32 Technical Reference Manual](https://espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf) +* [ESP32-S2 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32-s2_technical_reference_manual_en.pdf) +* [ESP32-S3 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf) +* [ESP32-C2 (aka ESP8684 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp8684_technical_reference_manual_en.pdf) +* [ESP32-C3 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_en.pdf) +* [ESP32-C6 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32-c6_technical_reference_manual_en.pdf) +* [ESP32-H2 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32-h2_technical_reference_manual_en.pdf) ### Building -To enable hw acceleration : +Simply run `ESP-IDF.py` in any of the [Espressif/ESP-IDF/Examples](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples). +See the respective project README files. Examples are also available using wolfssl as a [Managed Component](https://components.espressif.com/components/wolfssl/wolfssl). -* Uncomment out `#define WOLFSSL_ESPIDF` in `/path/to/wolfssl/wolfssl/wolfcrypt/settings.h` -* Uncomment out `#define WOLFSSL_ESPWROOM32` in `/path/to/wolfssl/wolfssl/wolfcrypt/settings.h` +Hardware acceleration is enabled by default. All settings should be adjusted in the respective project component +`user_settings.h` file. See the example in [template example](https://github.com/wolfSSL/wolfssl/blob/master/IDE/Espressif/ESP-IDF/examples/template/components/wolfssl/include/user_settings.h). +In particular, comment out the `NO_[feature_name]` macros to enable hardware encryption: + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* #define NO_WOLFSSL_ESP32_CRYPT_AES */ + /* #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ -To disable portions of the hardware acceleration you can optionally define: +To disable specific portions of the hardware acceleration you can optionally define: ```c -/* Disabled SHA, AES and RSA acceleration */ -#define NO_ESP32WROOM32_CRYPT -/* Disabled AES acceleration */ -#define NO_WOLFSSL_ESP32WROOM32_CRYPT_AES -/* Disabled SHA acceleration */ -#define NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH -/* Disabled RSA Primitive acceleration */ -#define NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI +/* Disable all SHA, AES and RSA acceleration */ +#define NO_ESP32_CRYPT + +/* Disable only AES acceleration */ +#define NO_WOLFSSL_ESP32_CRYPT_AES + +/* Disabled only SHA acceleration */ +#define NO_WOLFSSL_ESP32_CRYPT_HASH + +/* Disabled only RSA Primitive acceleration */ +#define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI ``` +See the [wolfcrypt/port/Espressif/esp32-crypt.h](https://github.com/wolfSSL/wolfssl/blob/master/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h) +for more details on fine tuning and debugging options. + ### Coding -In your application you must include `` before any other wolfSSL headers. If building the sources directly we recommend defining `WOLFSSL_USER_SETTINGS` and adding your own `user_settings.h` file. You can find a good reference for this in `IDE/GCC-ARM/Header/user_settings.h`. +In your application you must include `` before any other wolfSSL headers. +If building the sources directly we recommend defining `WOLFSSL_USER_SETTINGS` (typically defined in the `CMakeLists.txt`) +and adding your own `user_settings.h` file. You can find a good reference in the [Espressif examples](https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples) +as well as other examples such as [IDE/GCC-ARM/Header/user_settings.h](https://github.com/wolfSSL/wolfssl/blob/master/IDE/GCC-ARM/Header/user_settings.h). + +To view disassembly, add `__attribute__((section(".iram1")))` decorator. Foe example: + +To view disassembly, add `__attribute__((section(".iram1")))` decorator. Foe example: + +``` +static int __attribute__((section(".iram1"))) memblock_peek(volatile u_int32_t mem_address) +``` + +### VisualGDB + +Each project example has a `VisuaGDB` directory with sample project files for [Sysprogs VisualGDB](https://visualgdb.com). + +For installing multiple toolchains, see the [documentation](https://visualgdb.com/documentation/espidf/). + +The library naming format used at wolfSSL: + +``` +HKEY_CURRENT_USER\Software\Sysprogs\GNUToolchains +``` + +| Registry String Value Name | Value Data | +| -------------------------------- |----------------------- | +| `SysGCC-xtensa-lx106-elf-8.4.0` | `C:\SysGCC\esp8266` | +| `SysGCC-xtensa-esp32-elf-8.4.0` | `C:\SysGCC\esp32-8.4` | +| `SysGCC-xtensa-esp32-elf-13.2.0` | `C:\SysGCC\esp32` | +| `SysGCC-xtensa-esp32-elf-12.4.0` | `C:\SysGCC\esp32-12.4` | +| `SysGCC-xtensa-esp32-elf-11.2.0` | `C:\SysGCC\esp32-11.2` | + +Note the latest toolchain value is the default install name of `C:\SysGCC\esp32`. ### Benchmarks diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* esp32_aes.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -23,21 +23,23 @@ * WOLFSSL_SUCCESS and WOLFSSL_FAILURE values should only * be used in the ssl layer, not in wolfCrypt **/ -#include -#include #ifdef HAVE_CONFIG_H #include #endif + +/* Reminder: user_settings.h is needed and included from settings.h + * Be sure to define WOLFSSL_USER_SETTINGS, typically in CMakeLists.txt */ #include +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ +#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#include + #ifndef NO_AES -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES) -#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#if defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_AES) #include -#include "wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h" #include /* breadcrumb tag text for ESP_LOG() */ @@ -46,24 +48,31 @@ /* mutex */ static wolfSSL_Mutex aes_mutex; +/* Maximum time to wait for AES HW in FreeRTOS ticks */ +#define WOLFSSL_AES_MUTEX_WAIT 5000 + /* keep track as to whether esp aes is initialized */ static int espaes_CryptHwMutexInit = 0; +#if defined(WOLFSSL_HW_METRICS) + static unsigned long esp_aes_unsupported_length_usage_ct = 0; +#endif + /* * lock hw engine. * this should be called before using engine. * * returns 0 if the hw lock was initialized and mutex lock */ -static int esp_aes_hw_InUse() +static int esp_aes_hw_InUse(void) { - int ret = 0; + int ret = ESP_OK; ESP_LOGV(TAG, "enter esp_aes_hw_InUse"); if (espaes_CryptHwMutexInit == 0) { ret = esp_CryptHwMutexInit(&aes_mutex); - if (ret == 0) { + if (ret == ESP_OK) { /* flag esp aes as initialized */ espaes_CryptHwMutexInit = 1; } @@ -75,24 +84,44 @@ /* esp aes has already been initialized */ } - if (ret == 0) { - /* lock hardware */ - ret = esp_CryptHwMutexLock(&aes_mutex, portMAX_DELAY); + if (ret == ESP_OK) { + /* lock hardware; there should be exactly one instance + * of esp_CryptHwMutexLock(&aes_mutex ...) in code */ + /* TODO - do we really want to wait? + * probably not */ + ret = esp_CryptHwMutexLock(&aes_mutex, WOLFSSL_AES_MUTEX_WAIT); + if (ret == ESP_OK) { + ESP_LOGV(TAG, "esp_CryptHwMutexLock aes success"); + } + else { + ESP_LOGW(TAG, "esp_CryptHwMutexLock aes timeout! %d", ret); + } } else { ESP_LOGE(TAG, "aes engine lock failed."); } - if (ret == 0) { + if (ret == ESP_OK) { /* Enable AES hardware */ periph_module_enable(PERIPH_AES_MODULE); - #if CONFIG_IDF_TARGET_ESP32S3 - /* Select working mode. Can be typical or DMA. - * 0 => typical - * 1 => DMA */ - DPORT_REG_WRITE(AES_DMA_ENABLE_REG, 0); + #if defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + { + /* Select working mode. Can be typical or DMA. + * 0 => typical + * 1 => DMA */ + DPORT_REG_WRITE(AES_DMA_ENABLE_REG, 0); + } + #elif defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + /* Select working mode. Can be typical or DMA. + * 0 => typical + * 1 => DMA */ + DPORT_REG_WRITE(AES_DMA_ENABLE_REG, 0); + } #endif } @@ -117,15 +146,15 @@ /* * set key to hardware key registers. - * return 0 on success; -1 if mode isn't supported. + * return ESP_OK = 0 on success; BAD_FUNC_ARG if mode isn't supported. */ static int esp_aes_hw_Set_KeyMode(Aes *ctx, ESP32_AESPROCESS mode) { - int ret = 0; + int ret = ESP_OK; word32 i; word32 mode_ = 0; - ESP_LOGV(TAG, " enter esp_aes_hw_Set_KeyMode"); + ESP_LOGV(TAG, " enter esp_aes_hw_Set_KeyMode %d", mode); /* check mode */ if (mode == ESP32_AES_UPDATEKEY_ENCRYPT) { @@ -141,38 +170,74 @@ } } /* if mode */ - if (ret == 0) { + /* + ** ESP32: see table 22-1 in ESP32 Technical Reference + ** ESP32-S3: see table 19-2 in ESP32-S3 Technical Reference + ** ESP32-C3: + ** ESP32-C6: see table 18-2 in ESP32-C6 Technical Reference + ** + ** Mode Algorithm ESP32 ESP32S3 ESP32C3 ESP32C6 + ** 0 AES-128 Encryption y y y y + ** 1 AES-192 Encryption y n n n + ** 2 AES-256 Encryption y y y y + ** 3 reserved n n n n + ** 4 AES-128 Decryption y y y y + ** 5 AES-192 Decryption y n n n + ** 6 AES-256 Decryption y y y y + ** 7 reserved n n n n + */ + switch(ctx->keylen){ + case 24: mode_ += 1; break; + case 32: mode_ += 2; break; + default: break; + } + + /* Some specific modes are not supported on some targets. */ +#if defined(CONFIG_IDF_TARGET_ESP32) + #define TARGET_AES_KEY_BASE AES_KEY_BASE + if (mode_ == 3 || mode_ > 6) { + /* this should have been detected in aes.c and fall back to SW */ + ESP_LOGE(TAG, "esp_aes_hw_Set_KeyMode unsupported mode: %i", mode_); + ret = BAD_FUNC_ARG; + } + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + #define TARGET_AES_KEY_BASE AES_KEY_BASE + if (mode_ == 1 || mode_ == 3 || mode_ == 5 || mode_ > 6) { + /* this should have been detected in aes.c and fall back to SW */ + ESP_LOGE(TAG, "esp_aes_hw_Set_KeyMode unsupported mode: %i", mode_); + ret = BAD_FUNC_ARG; + } + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #define TARGET_AES_KEY_BASE AES_KEY_BASE + if (mode_ == 1 || mode_ == 3|| mode_ == 5 || mode_ > 6) { + /* this should have been detected in aes.c and fall back to SW */ + ESP_LOGE(TAG, "esp_aes_hw_Set_KeyMode unsupported mode: %i", mode_); + ret = BAD_FUNC_ARG; + } +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #define TARGET_AES_KEY_BASE AES_KEY_0_REG + if (mode_ == 1 || mode_ == 3 || mode_ == 5 || mode_ > 6) { + /* this should have been detected in aes.c and fall back to SW */ + ESP_LOGE(TAG, "esp_aes_hw_Set_KeyMode unsupported mode: %i", mode_); + ret = BAD_FUNC_ARG; + } +#else + /* assume all modes supported, use AES_KEY_BASE */ + #define TARGET_AES_KEY_BASE AES_KEY_BASE +#endif + /* */ + if (ret == ESP_OK) { /* update key */ for (i = 0; i < (ctx->keylen) / sizeof(word32); i++) { - DPORT_REG_WRITE(AES_KEY_BASE + (i * 4), *(((word32*)ctx->key) + i)); - } - - /* - ** ESP32: see table 22-1 in ESP32 Technical Reference - ** ESP32S3: see table 19-2 in ESP32S3 Technical Reference - ** mode Algorithm ESP32 ESP32S3 - ** 0 AES-128 Encryption y y - ** 1 AES-192 Encryption y n - ** 2 AES-256 Encryption y y - ** 4 AES-128 Decryption y y - ** 5 AES-192 Decryption y n - ** 6 AES-256 Decryption y y - */ - switch(ctx->keylen){ - case 24: mode_ += 1; break; - case 32: mode_ += 2; break; - default: break; - } - - #if CONFIG_IDF_TARGET_ESP32S3 - if (mode_ == 1 || mode_ == 5 || mode_ == 7) { - ESP_LOGE(TAG, "esp_aes_hw_Set_KeyMode unsupported mode: %i", mode_); - ret = BAD_FUNC_ARG; + DPORT_REG_WRITE((volatile word32*)(TARGET_AES_KEY_BASE + (i * 4)), + *(((word32*)ctx->key) + i) + ); } - #endif - if (ret == 0) { + if (ret == ESP_OK) { DPORT_REG_WRITE(AES_MODE_REG, mode_); } ESP_LOGV(TAG, " leave esp_aes_hw_Setkey"); @@ -189,19 +254,38 @@ */ static void esp_aes_bk(const byte* in, byte* out) { - const word32 *inwords = (const word32 *)in; + const word32* inwords; + uint32_t* outwords; -#if ESP_IDF_VERSION_MAJOR >= 4 - uint32_t *outwords = (uint32_t *)out; -#else - word32 *outwords = (word32 *)out; -#endif + inwords = (const word32*)in; + outwords = (uint32_t*)out; ESP_LOGV(TAG, "enter esp_aes_bk"); -#if CONFIG_IDF_TARGET_ESP32S3 - /* See esp32 - s3 technical reference manual: + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* copy text for encrypting/decrypting blocks */ + DPORT_REG_WRITE(AES_TEXT_BASE, inwords[0]); + DPORT_REG_WRITE(AES_TEXT_BASE + 4, inwords[1]); + DPORT_REG_WRITE(AES_TEXT_BASE + 8, inwords[2]); + DPORT_REG_WRITE(AES_TEXT_BASE + 12, inwords[3]); + + /* start engine */ + DPORT_REG_WRITE(AES_START_REG, 1); + + /* wait until finishing the process */ + while (1) { + if (DPORT_REG_READ(AES_IDLE_REG) == 1) { + break; + } + } + + /* read-out blocks */ + esp_dport_access_read_buffer(outwords, AES_TEXT_BASE, 4); + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* See ESP32-C3 technical reference manual: ** 19.4.3 Operation process using CPU working mode. - ** The ESP32-S3 also supports a DMA mode. + ** The ESP32-C3 also supports a DMA mode. (not ywt implemented) ** ** Copy text for encrypting/decrypting blocks: */ DPORT_REG_WRITE(AES_TEXT_IN_BASE, inwords[0]); @@ -214,61 +298,158 @@ /* wait until finishing the process */ while (DPORT_REG_READ(AES_STATE_REG) != 0) { - /* wating for the hardware accelerator to complete operation. */ + /* waiting for the hardware accelerator to complete operation. */ } /* read-out blocks */ - esp_dport_access_read_buffer(outwords, AES_TEXT_OUT_BASE, 4); -#else - /* copy text for encrypting/decrypting blocks */ - DPORT_REG_WRITE(AES_TEXT_BASE, inwords[0]); - DPORT_REG_WRITE(AES_TEXT_BASE + 4, inwords[1]); - DPORT_REG_WRITE(AES_TEXT_BASE + 8, inwords[2]); - DPORT_REG_WRITE(AES_TEXT_BASE + 12, inwords[3]); + esp_dport_access_read_buffer((uint32_t*)outwords, AES_TEXT_OUT_BASE, 4); +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* See ESP32-C6 technical reference manual: + ** 18.4.3 Operation process using CPU working mode. + ** The ESP32-C6 also supports a DMA mode. (not ywt implemented) + ** + ** Copy text for encrypting/decrypting blocks: */ + DPORT_REG_WRITE(AES_TEXT_IN_0_REG, inwords[0]); + DPORT_REG_WRITE(AES_TEXT_IN_1_REG, inwords[1]); + DPORT_REG_WRITE(AES_TEXT_IN_2_REG, inwords[2]); + DPORT_REG_WRITE(AES_TEXT_IN_3_REG, inwords[3]); /* start engine */ - DPORT_REG_WRITE(AES_START_REG, 1); + DPORT_REG_WRITE(AES_TRIGGER_REG, 1); /* wait until finishing the process */ - while (1) { - if (DPORT_REG_READ(AES_IDLE_REG) == 1) { - break; - } + while (DPORT_REG_READ(AES_STATE_REG) != 0) { + /* waiting for the hardware accelerator to complete operation. */ } /* read-out blocks */ - esp_dport_access_read_buffer(outwords, AES_TEXT_BASE, 4); + esp_dport_access_read_buffer(outwords, AES_TEXT_OUT_0_REG, 4); + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + /* See esp32 - s3 technical reference manual: + ** 19.4.3 Operation process using CPU working mode. + ** The ESP32-S3 also supports a DMA mode. + ** + ** Copy text for encrypting/decrypting blocks: */ + DPORT_REG_WRITE(AES_TEXT_IN_BASE, inwords[0]); + DPORT_REG_WRITE(AES_TEXT_IN_BASE + 4, inwords[1]); + DPORT_REG_WRITE(AES_TEXT_IN_BASE + 8, inwords[2]); + DPORT_REG_WRITE(AES_TEXT_IN_BASE + 12, inwords[3]); + + /* start engine */ + DPORT_REG_WRITE(AES_TRIGGER_REG, 1); + + /* wait until finishing the process */ + while (DPORT_REG_READ(AES_STATE_REG) != 0) { + /* waiting for the hardware accelerator to complete operation. */ + } + + /* read-out blocks */ + esp_dport_access_read_buffer(outwords, AES_TEXT_OUT_BASE, 4); + +#else + ESP_LOGW(TAG, "Warning: esp_aes_bk called for unsupported target: %s", + CONFIG_IDF_TARGET) + #endif ESP_LOGV(TAG, "leave esp_aes_bk"); } /* esp_aes_bk */ /* +* wc_esp32AesSupportedKeyLen +* @brief: returns 1 if AES key length supported in HW, 0 if not +* @param aes:a value of a ley length */ +int wc_esp32AesSupportedKeyLenValue(int keylen) +{ + int ret = ESP_OK; + +#if defined(CONFIG_IDF_TARGET_ESP32) + if (keylen == 16 || keylen == 24 || keylen == 32) { + ret = 1; + } + else { + ret = ESP_OK; /* keylen 24 (192 bit) not supported */ + } + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + if (keylen == 16 || keylen == 32) { + ret = 1; + } + else { + ret = ESP_OK; /* keylen 24 (192 bit) not supported */ + } + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + if (keylen == 16 || keylen == 32) { + ret = 1; + } + else { + ret = ESP_OK; /* keylen 24 (192 bit) not supported */ + } + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + ret = ESP_OK; /* not yet implemented */ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + if (keylen == 16 || keylen == 32) { + ret = 1; + } + else { + ret = ESP_OK; /* keylen 24 (192 bit) not supported */ + } + +#else + ret = ESP_OK; /* if we don't know, then it is not supported */ + +#endif + return ret; +} + +/* +* wc_esp32AesSupportedKeyLen +* @brief: returns 1 if AES key length supported in HW, 0 if not +* @param aes: a pointer of the AES object used to encrypt data */ +int wc_esp32AesSupportedKeyLen(struct Aes* aes) +{ + int ret; + if (aes == NULL) { + ret = ESP_OK; /* we need a valid aes object to get its keylength */ + } + else { + ret = wc_esp32AesSupportedKeyLenValue(aes->keylen); + } + return ret; +} + +/* * wc_esp32AesEncrypt * @brief: a one block encrypt of the input block, into the output block * @param aes: a pointer of the AES object used to encrypt data -* @param in : a pointer of the input buffer containing plain text to be encrypted -* @param out: a pointer of the output buffer in which to store the cipher text of -* the encrypted message +* @param in : a pointer of the input buffer containing +* plain text to be encrypted +* @param out: a pointer of the output buffer in which to store the +* cipher text of the encrypted message * @return: 0 on success, BAD_FUNC_ARG if the AES algorithm isn't supported. */ int wc_esp32AesEncrypt(Aes *aes, const byte* in, byte* out) { - int ret = 0; + int ret = ESP_OK; ESP_LOGV(TAG, "enter wc_esp32AesEncrypt"); /* lock the hw engine */ ret = esp_aes_hw_InUse(); - if (ret == 0) { + if (ret == ESP_OK) { ret = esp_aes_hw_Set_KeyMode(aes, ESP32_AES_UPDATEKEY_ENCRYPT); - if (ret != 0) { - ESP_LOGE(TAG, "wc_esp32AesEncrypt failed during esp_aes_hw_Set_KeyMode"); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "wc_esp32AesEncrypt failed " + "during esp_aes_hw_Set_KeyMode"); } } /* load the key into the register */ - if (ret == 0) { + if (ret == ESP_OK) { /* process a one block of AES */ esp_aes_bk(in, out); } @@ -282,9 +463,10 @@ * wc_esp32AesDecrypt * @brief: a one block decrypt of the input block, into the output block * @param aes: a pointer of the AES object used to decrypt data -* @param in : a pointer of the input buffer containing plain text to be decrypted -* @param out: a pointer of the output buffer in which to store the cipher text of -* the decrypted message +* @param in : a pointer of the input buffer containing +* plain text to be decrypted +* @param out: a pointer of the output buffer in which to store the +* cipher text of the decrypted message * @return: 0 on success, BAD_FUNC_ARG if the AES algorithm isn't supported. */ int wc_esp32AesDecrypt(Aes *aes, const byte* in, byte* out) @@ -296,14 +478,15 @@ esp_aes_hw_InUse(); /* load the key into the register */ ret = esp_aes_hw_Set_KeyMode(aes, ESP32_AES_UPDATEKEY_DECRYPT); - if (ret != 0) { - ESP_LOGE(TAG, "wc_esp32AesDecrypt failed during esp_aes_hw_Set_KeyMode"); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "wc_esp32AesDecrypt failed " + "during esp_aes_hw_Set_KeyMode"); /* release hw */ esp_aes_hw_Leave(); ret = BAD_FUNC_ARG; } - if (ret == 0) { + if (ret == ESP_OK) { /* process a one block of AES */ esp_aes_bk(in, out); /* release hw engine */ @@ -316,12 +499,13 @@ /* * wc_esp32AesCbcEncrypt * @brief: Encrypts a plain text message from the input buffer, and places the -* resulting cipher text into the output buffer using cipher block chaining -* with AES. +* resulting cipher text into the output buffer using cipher block +* chaining with AES. * @param aes: a pointer of the AES object used to encrypt data -* @param out: a pointer of the output buffer in which to store the cipher text of -* the encrypted message -* @param in : a pointer of the input buffer containing plain text to be encrypted +* @param out: a pointer of the output buffer in which to store the + cipher text of the encrypted message +* @param in : a pointer of the input buffer containing +* plain text to be encrypted * @param sz : size of input message * @return: 0 on success, BAD_FUNC_ARG if the AES algorithm isn't supported. */ @@ -340,14 +524,14 @@ ret = esp_aes_hw_InUse(); - if (ret == 0) { + if (ret == ESP_OK) { ret = esp_aes_hw_Set_KeyMode(aes, ESP32_AES_UPDATEKEY_ENCRYPT); - if (ret != 0) { - ESP_LOGE(TAG, "wc_esp32AesCbcEncrypt failed HW Set KeyMode"); + if (ret != ESP_OK) { + ESP_LOGW(TAG, "wc_esp32AesCbcEncrypt failed HW Set KeyMode"); } } /* if set esp_aes_hw_InUse successful */ - if (ret == 0) { + if (ret == ESP_OK) { while (blocks--) { XMEMCPY(temp_block, in + offset, AES_BLOCK_SIZE); @@ -363,22 +547,23 @@ /* store IV for next block */ XMEMCPY(iv, out + offset - AES_BLOCK_SIZE, AES_BLOCK_SIZE); } /* while (blocks--) */ - } /* if Set Mode successful (ret == 0) */ + } /* if Set Mode successful (ret == ESP_OK) */ esp_aes_hw_Leave(); ESP_LOGV(TAG, "leave wc_esp32AesCbcEncrypt"); - return 0; + return ret; } /* wc_esp32AesCbcEncrypt */ /* * wc_esp32AesCbcDecrypt * @brief: Encrypts a plain text message from the input buffer, and places the -* resulting cipher text into the output buffer using cipher block chaining -* with AES. +* resulting cipher text into the output buffer using cipher block +* chaining with AES. * @param aes: a pointer of the AES object used to decrypt data -* @param out: a pointer of the output buffer in which to store the cipher text of -* the decrypted message -* @param in : a pointer of the input buffer containing plain text to be decrypted +* @param out: a pointer of the output buffer in which to store the +* cipher text of the decrypted message +* @param in : a pointer of the input buffer containing +* plain text to be decrypted * @param sz : size of input message * @return: 0 on success, BAD_FUNC_ARG if the AES algorithm isn't supported. */ @@ -398,14 +583,14 @@ ret = esp_aes_hw_InUse(); - if (ret == 0) { + if (ret == ESP_OK) { ret = esp_aes_hw_Set_KeyMode(aes, ESP32_AES_UPDATEKEY_DECRYPT); - if (ret != 0) { - ESP_LOGE(TAG, "wc_esp32AesCbcDecrypt failed HW Set KeyMode"); + if (ret != ESP_OK) { + ESP_LOGW(TAG, "wc_esp32AesCbcDecrypt failed HW Set KeyMode"); } } - if (ret == 0) { + if (ret == ESP_OK) { while (blocks--) { XMEMCPY(temp_block, in + offset, AES_BLOCK_SIZE); @@ -421,12 +606,49 @@ offset += AES_BLOCK_SIZE; } /* while (blocks--) */ - } /* if Set Mode was successful (ret == 0) */ + esp_aes_hw_Leave(); + } /* if Set Mode was successful (ret == ESP_OK) */ - esp_aes_hw_Leave(); ESP_LOGV(TAG, "leave wc_esp32AesCbcDecrypt"); - return 0; + return ret; } /* wc_esp32AesCbcDecrypt */ -#endif /* WOLFSSL_ESP32WROOM32_CRYPT */ +#endif /* WOLFSSL_ESP32_CRYPT */ #endif /* NO_AES */ + +/* Metrics */ +#if defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_AES) + +#if defined(WOLFSSL_HW_METRICS) + +/* increment esp_aes_unsupported_length_usage_ct and return current value */ +int wc_esp32AesUnupportedLengthCountAdd(void) { + esp_aes_unsupported_length_usage_ct++; + return esp_aes_unsupported_length_usage_ct; +} + +#endif /* WOLFSSL_HW_METRICS */ + +/* Show AES Metrics when enabled, otherwise callable but no action. */ +int esp_hw_show_aes_metrics(void) +{ + int ret = ESP_OK; + +#if defined(WOLFSSL_HW_METRICS) + + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "------------- wolfSSL ESP HW AES Metrics----------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + + ESP_LOGI(TAG, "esp_aes_unsupported_length_usage_ct = %lu", + esp_aes_unsupported_length_usage_ct); +#else + /* no HW math, no HW math metrics */ + +#endif /* WOLFSSL_HW_METRICS */ + + return ret; +} +#endif /* WOLFSSL_ESP32_CRYPT && !NO_WOLFSSL_ESP32_CRYPT_AES */ + +#endif /* WOLFSSL_ESPIDF */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_mp.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_mp.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_mp.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_mp.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* esp32_mp.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,20 +18,43 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -#include -#include + +/* + * See ESP32 Technical Reference Manual - RSA Accelerator Chapter + * + * esp_mp_exptmod() Large Number Modular Exponentiation Z = X^Y mod M + * esp_mp_mulmod() Large Number Modular Multiplication Z = X * Y mod M + * esp_mp_mul() Large Number Multiplication Z = X * Y + * + * The ESP32 RSA Accelerator supports operand lengths of: + * N in {512, 1024, 1536, 2048, 2560, 3072, 3584, 4096} bits. The bit length + * of arguments Z, X, Y , M, and r can be any one from the N set, but all + * numbers in a calculation must be of the same length. + * + * The bit length of M' is always 32. + * + * Also, beware: "we have uint32_t == unsigned long for both Xtensa and RISC-V" + * see https://github.com/espressif/esp-idf/issues/9511#issuecomment-1207342464 + * https://docs.espressif.com/projects/esp-idf/en/latest/esp32/migration-guides/release-5.x/5.0/gcc.html + */ #ifdef HAVE_CONFIG_H #include #endif + +/* Reminder: user_settings.h is needed and included from settings.h + * Be sure to define WOLFSSL_USER_SETTINGS, typically in CMakeLists.txt */ #include -#include "wolfssl/wolfcrypt/logging.h" +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ +#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#include +#include #if !defined(NO_RSA) || defined(HAVE_ECC) -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI) #ifdef NO_INLINE #include @@ -41,25 +64,138 @@ #endif #include -static const char* const TAG = "wolfssl_mp"; +#ifndef SINGLE_THREADED + /* Espressif freeRTOS */ + #include +#endif #define ESP_HW_RSAMAX_BIT 4096 #define ESP_HW_MULTI_RSAMAX_BITS 2048 #define ESP_HW_RSAMIN_BIT 512 -#define BYTE_TO_WORDS(s) (((s+3)>>2)) /* (s+(4-1))/ 4 */ -#define BITS_TO_WORDS(s) (((s+31)>>3)>>2) /* (s+(32-1))/ 8/ 4*/ + +/* (s+(4-1))/ 4 */ +#define BYTE_TO_WORDS(s) (((s+3)>>2)) + +/* (s+(32-1))/ 8/ 4*/ +#define BITS_TO_WORDS(s) (((s+31)>>3)>>2) + #define BITS_IN_ONE_WORD 32 -#define MP_NG -1 +#ifndef ESP_RSA_MULM_BITS + #define ESP_RSA_MULM_BITS 16 +#endif + +#ifndef ESP_RSA_EXPT_XBITS + #define ESP_RSA_EXPT_XBITS 8 +#endif + +#ifndef ESP_RSA_EXPT_YBITS + #define ESP_RSA_EXPT_YBITS 8 +#endif #define ESP_TIMEOUT(cnt) (cnt >= ESP_RSA_TIMEOUT_CNT) +#if defined(CONFIG_IDF_TARGET_ESP32C3) + #include + #include +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #include +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #include + #include +#endif + +static const char* const TAG = "wolfssl_esp32_mp"; + +#ifdef DEBUG_WOLFSSL + static int hw_validation = 0; /* validating HW and SW? (prevent HW call) */ + #define SET_HW_VALIDATION {hw_validation = 1;} + #define CLR_HW_VALIDATION {hw_validation = 0;} + #define IS_HW_VALIDATION (hw_validation == 1) + #undef WOLFSSL_HW_METRICS + + /* usage metrics always on during debug */ + #define WOLFSSL_HW_METRICS +#endif + +/* For esp_mp_exptmod and esp_mp_mulmod we need a variety of calculated helper +** values to properly setup the hardware. See esp_mp_montgomery_init() */ +struct esp_mp_helper +{ + MATH_INT_T r_inv; /* result of calculated Montgomery helper */ + word32 exp; + word32 Xs; /* how many bits in X operand */ + word32 Ys; /* how many bits in Y operand */ + word32 Ms; /* how many bits in M operand */ + word32 Rs; /* how many bits in R_inv calc */ + word32 maxWords_sz; /* maximum words expected */ + word32 hwWords_sz; + mp_digit mp; /* result of calculated Montgomery M' helper */ +#ifdef DEBUG_WOLFSSL + mp_digit mp2; /* optional compare to alternate Montgomery calc */ +#endif +}; + +static portMUX_TYPE wc_rsa_reg_lock = portMUX_INITIALIZER_UNLOCKED; + +/* usage metrics can be turned on independently of debugging */ +#ifdef WOLFSSL_HW_METRICS + static unsigned long esp_mp_max_used = 0; + + static unsigned long esp_mp_mulmod_small_x_ct = 0; + static unsigned long esp_mp_mulmod_small_y_ct = 0; + + static unsigned long esp_mp_max_timeout = 0; + + #ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + static unsigned long esp_mp_mul_usage_ct = 0; + static unsigned long esp_mp_mul_error_ct = 0; + #endif /* !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + + #ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + static unsigned long esp_mp_mulmod_usage_ct = 0; + static unsigned long esp_mp_mulmod_fallback_ct = 0; + static unsigned long esp_mp_mulmod_even_mod_ct = 0; + static unsigned long esp_mp_mulmod_error_ct = 0; + #endif /* !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + + #ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + static unsigned long esp_mp_exptmod_usage_ct = 0; + static unsigned long esp_mp_exptmod_error_ct = 0; + static unsigned long esp_mp_exptmod_fallback_ct = 0; + #endif /* !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ +#endif + /* mutex */ -static wolfSSL_Mutex mp_mutex; -static int espmp_CryptHwMutexInit = 0; +#ifdef SINGLE_THREADED + int single_thread_locked = 0; +#else + static wolfSSL_Mutex mp_mutex; + static int espmp_CryptHwMutexInit = 0; +#endif + +#ifdef DEBUG_WOLFSSL + /* when debugging, we'll double-check the mutex with call depth */ + #ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + static int esp_mp_exptmod_depth_counter = 0; + #endif /* NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ +#endif /* DEBUG_WOLFSSL */ + /* * check if the HW is ready before accessing it * +* See 24.3.1 Initialization of ESP32 Technical Reference Manual +* https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf +* +* The RSA Accelerator is activated by enabling the corresponding peripheral +* clock, and by clearing the DPORT_RSA_PD bit in the DPORT_RSA_PD_CTRL_REG +* register. This releases the RSA Accelerator from reset. +* +* See esp_mp_hw_lock(). +* +* Note we'll also keep track locally if the lock was called at all. +* For instance, fallback to SW for very small operand and we won't lock HW. +* * When the RSA Accelerator is released from reset, the register RSA_CLEAN_REG * reads 0 and an initialization process begins. Hardware initializes the four * memory blocks by setting them to 0. After initialization is complete, @@ -69,37 +205,92 @@ */ static int esp_mp_hw_wait_clean(void) { - int ret = MP_OKAY; + int ret = MP_OKAY; word32 timeout = 0; -#if CONFIG_IDF_TARGET_ESP32S3 - - while (!ESP_TIMEOUT(++timeout) && DPORT_REG_READ(RSA_QUERY_CLEAN_REG) != 1) - { - /* wait. expected delay 1 to 2 uS */ +#if defined(CONFIG_IDF_TARGET_ESP32) + /* RSA_CLEAN_REG is now called RSA_QUERY_CLEAN_REG. + ** hwcrypto_reg.h maintains RSA_CLEAN_REG for backwards compatibility: + ** so this block _might_ not be needed in some circumstances. */ + ESP_EM__PRE_MP_HW_WAIT_CLEAN + + /* wait until ready, + ** or timeout counter exceeds ESP_RSA_TIMEOUT_CNT in user_settings */ + while(!ESP_TIMEOUT(++timeout) && DPORT_REG_READ(RSA_CLEAN_REG) == 0) { + /* wait. expected delay 1 to 2 uS */ + ESP_EM__MP_HW_WAIT_CLEAN } -#else - /* RSA_CLEAN_REG is now called RSA_QUERY_CLEAN_REG. hwcrypto_reg.h maintains - * RSA_CLEAN_REG for backwards compatibility so this block _might_ be not needed. */ - while(!ESP_TIMEOUT(++timeout) && DPORT_REG_READ(RSA_CLEAN_REG) != 1) { +#elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + ESP_EM__PRE_MP_HW_WAIT_CLEAN + while (!ESP_TIMEOUT(++timeout) && + DPORT_REG_READ(RSA_QUERY_CLEAN_REG) != 1) { + /* wait. expected delay 1 to 2 uS */ + ESP_EM__MP_HW_WAIT_CLEAN + } +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + ESP_EM__PRE_MP_HW_WAIT_CLEAN + while (!ESP_TIMEOUT(++timeout) && + DPORT_REG_READ(RSA_QUERY_CLEAN_REG) != 1) { /* wait. expected delay 1 to 2 uS */ + ESP_EM__MP_HW_WAIT_CLEAN } +#else + /* no HW timeout if we don't know the platform. assumes no HW */ #endif + #if defined(WOLFSSL_HW_METRICS) + { + esp_mp_max_timeout = (timeout > esp_mp_max_timeout) ? timeout : + esp_mp_max_timeout; + } + #endif + if (ESP_TIMEOUT(timeout)) { ESP_LOGE(TAG, "esp_mp_hw_wait_clean waiting HW ready timed out."); - ret = MP_NG; + ret = WC_HW_WAIT_E; /* hardware is busy, MP_HW_BUSY; */ } return ret; } /* +** esp_mp_hw_islocked() - detect if we've locked the HW for use. +** +** WARNING: this does *not* detect separate calls to the +** periph_module_disable() and periph_module_enable(). +*/ +static int esp_mp_hw_islocked(void) +{ + int ret = FALSE; +#ifdef SINGLE_THREADED + if (single_thread_locked == FALSE) { + /* not in use */ + ESP_LOGV(TAG, "SINGLE_THREADED esp_mp_hw_islocked = false"); + } + else { + ESP_LOGV(TAG, "SINGLE_THREADED esp_mp_hw_islocked = true"); + ret = TRUE; + } +#else + TaskHandle_t mutexHolder = xSemaphoreGetMutexHolder(mp_mutex); + if (mutexHolder == NULL) { + /* Mutex is not in use */ + ESP_LOGV(TAG, "multi-threaded esp_mp_hw_islocked = false"); + } + else { + ESP_LOGV(TAG, "multi-threaded esp_mp_hw_islocked = true"); + ret = TRUE; + } +#endif + return ret; +} + +/* * esp_mp_hw_lock() * * Lock HW engine. * This should be called before using engine. * -* Returns 0 if the HW lock was initialized and mutex lock. +* Returns 0 (ESP_OK) if the HW lock was initialized and mutex lock. * * See Chapter 24: * https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf @@ -115,98 +306,294 @@ * after being released from reset, and before writing to any RSA Accelerator * memory blocks or registers for the first time. */ -static int esp_mp_hw_lock() +static int esp_mp_hw_lock(void) { - int ret = 0; + int ret = ESP_OK; ESP_LOGV(TAG, "enter esp_mp_hw_lock"); - - if (espmp_CryptHwMutexInit == 0) { +#ifdef SINGLE_THREADED + single_thread_locked = TRUE; +#else + if (espmp_CryptHwMutexInit == ESP_OK) { ret = esp_CryptHwMutexInit(&mp_mutex); - if (ret == 0) { + if (ret == ESP_OK) { /* flag esp mp as initialized */ - espmp_CryptHwMutexInit = 1; + espmp_CryptHwMutexInit = TRUE; } else { ESP_LOGE(TAG, "mp mutex initialization failed."); } } else { - /* ESP AES has already been initialized */ + /* mp_mutex has already been initialized */ } - if (ret == 0) { - /* lock hardware */ - ret = esp_CryptHwMutexLock(&mp_mutex, portMAX_DELAY); - if (ret != 0) { + /* Set our mutex to indicate the HW is in use */ + if (ret == ESP_OK) { + /* lock hardware; there should be exactly one instance + * of esp_CryptHwMutexLock(&mp_mutex ...) in code */ + /* TODO - do we really want to wait? + * probably not */ + ret = esp_CryptHwMutexLock(&mp_mutex, ESP_MP_HW_LOCK_MAX_DELAY); + if (ret != ESP_OK) { ESP_LOGE(TAG, "mp engine lock failed."); - ret = MP_NG; + ret = WC_HW_WAIT_E; /* caller is expected to fall back to SW */ } } +#endif /* not SINGLE_THREADED */ -#if CONFIG_IDF_TARGET_ESP32S3 - /* Activate the RSA accelerator. See 20.3 of ESP32-S3 technical manual. +#if defined(CONFIG_IDF_TARGET_ESP32) + /* Enable RSA hardware */ + if (ret == ESP_OK) { + periph_module_enable(PERIPH_RSA_MODULE); + portENTER_CRITICAL_SAFE(&wc_rsa_reg_lock); + { + /* clear bit to enable hardware operation; (set to disable) */ + DPORT_REG_CLR_BIT(DPORT_RSA_PD_CTRL_REG, DPORT_RSA_PD); + ESP_EM__POST_SP_MP_HW_LOCK + + } + portEXIT_CRITICAL_SAFE(&wc_rsa_reg_lock); + } +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* Activate the RSA accelerator. See 20.3 of ESP32-C3 technical manual. + * periph_module_enable doesn't seem to be documented and in private folder + * with v5 release. Maybe it will be deprecated? + * + * The ESP32-C3 RSA Accelerator is activated by: + * setting the SYSTEM_CRYPTO_RSA_CLK_EN bit in the SYSTEM_PERIP_CLK_EN1_REG + * register and: + * clearing the SYSTEM_RSA_MEM_PD bit in the SYSTEM_RSA_PD_CTRL_REG reg. + * This releases the RSA Accelerator from reset.*/ + if (ret == ESP_OK) { + periph_module_enable(PERIPH_RSA_MODULE); + portENTER_CRITICAL_SAFE(&wc_rsa_reg_lock); + { + DPORT_REG_SET_BIT((volatile void *)(SYSTEM_PERIP_CLK_EN1_REG), + SYSTEM_CRYPTO_RSA_CLK_EN ); + DPORT_REG_CLR_BIT((volatile void *)(SYSTEM_RSA_PD_CTRL_REG), + SYSTEM_RSA_MEM_PD ); + } + portEXIT_CRITICAL_SAFE(&wc_rsa_reg_lock); + } +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* See: 21.3 Functional Description + * + * The RSA accelerator is activated on the ESP32-C6 by: + * setting the PCR_RSA_CLK_EN bit + * and + * clearing the PCR_RSA_RST_EN bit + * in the PCR_RSA_CONF_REG register. + * + * Additionally, users also need to clear PCR_DS_RST_EN bit to + * reset Digital Signature (DS).*/ + if (ret == ESP_OK) { + periph_module_enable(PERIPH_RSA_MODULE); + portENTER_CRITICAL_SAFE(&wc_rsa_reg_lock); + { + /* TODO: When implementing DS (Digital Signature HW), need to + * check if it is in use before disabling: */ + DPORT_REG_CLR_BIT((volatile void *)(PCR_DS_CONF_REG), + PCR_DS_RST_EN ); + + DPORT_REG_SET_BIT((volatile void *)(PCR_RSA_CONF_REG), + PCR_RSA_CLK_EN ); + DPORT_REG_CLR_BIT((volatile void *)(PCR_RSA_CONF_REG), + PCR_RSA_RST_EN ); + } + portEXIT_CRITICAL_SAFE(&wc_rsa_reg_lock); + } +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + /* Activate the RSA accelerator. See 18.3 of ESP32-S2 technical manual. * periph_module_enable doesn't seem to be documented and in private folder * with v5 release. Maybe it will be deprecated? */ - if (ret == 0) { + if (ret == ESP_OK) { periph_module_enable(PERIPH_RSA_MODULE); - - /* clear bit to enable hardware operation; (set to disable) */ - DPORT_REG_CLR_BIT(SYSTEM_RSA_PD_CTRL_REG, SYSTEM_RSA_MEM_PD); + portENTER_CRITICAL_SAFE(&wc_rsa_reg_lock); + { + /* Note these names are different from those in the documentation! + * + * Documentation lists the same names as the ESP32-C3: + * + * DPORT_REG_SET_BIT((volatile void *)(SYSTEM_PERIP_CLK_EN1_REG), + * SYSTEM_CRYPTO_RSA_CLK_EN ); + * DPORT_REG_CLR_BIT((volatile void *)(SYSTEM_RSA_PD_CTRL_REG), + * SYSTEM_RSA_MEM_PD ); + * + * However, in the sytem_reg.h, the names below were found: + */ + DPORT_REG_SET_BIT((volatile void *)(DPORT_CPU_PERIP_CLK_EN1_REG), + DPORT_CRYPTO_RSA_CLK_EN ); + DPORT_REG_CLR_BIT((volatile void *)(DPORT_RSA_PD_CTRL_REG), + DPORT_RSA_MEM_PD ); + } + portEXIT_CRITICAL_SAFE(&wc_rsa_reg_lock); } -#else - /* Enable RSA hardware */ - if (ret == 0) { +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + /* Activate the RSA accelerator. See 20.3 of ESP32-S3 technical manual. + * periph_module_enable doesn't seem to be documented and in private folder + * with v5 release. Maybe it will be deprecated? */ + if (ret == ESP_OK) { periph_module_enable(PERIPH_RSA_MODULE); - - /* clear bit to enable hardware operation; (set to disable) */ - DPORT_REG_CLR_BIT(DPORT_RSA_PD_CTRL_REG, DPORT_RSA_PD); + portENTER_CRITICAL_SAFE(&wc_rsa_reg_lock); + { + /* clear bit to enable hardware operation; (set to disable) */ + DPORT_REG_CLR_BIT(SYSTEM_RSA_PD_CTRL_REG, SYSTEM_RSA_MEM_PD); + } + portEXIT_CRITICAL_SAFE(&wc_rsa_reg_lock); } +#else + /* when unknown or not implemented, assume there's no HW to lock */ #endif /* reminder: wait until RSA_CLEAN_REG reads 1 - * see esp_mp_hw_wait_clean() - */ - + ** see esp_mp_hw_wait_clean() */ ESP_LOGV(TAG, "leave esp_mp_hw_lock"); return ret; } /* -* Release HW engine +** Release RSA HW engine */ -static void esp_mp_hw_unlock( void ) +static int esp_mp_hw_unlock(void) { -#if CONFIG_IDF_TARGET_ESP32S3 - /* Deactivate the RSA accelerator. See 20.3 of ESP32-S3 technical manual. - * periph_module_enable doesn't seem to be documented and in private folder - * with v5 release. Maybe it will be deprecated? */ - DPORT_REG_SET_BIT(SYSTEM_RSA_PD_CTRL_REG, SYSTEM_RSA_MEM_PD); - periph_module_disable(PERIPH_RSA_MODULE); + int ret = MP_OKAY; + if (esp_mp_hw_islocked()) { + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* set bit to disabled hardware operation; (clear to enable) */ + DPORT_REG_SET_BIT(DPORT_RSA_PD_CTRL_REG, DPORT_RSA_PD); + + /* Disable RSA hardware */ + periph_module_disable(PERIPH_RSA_MODULE); +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* Deactivate the RSA accelerator. + * See 20.3 of ESP32-C3 technical manual. + * periph_module_enable doesn't seem to be documented and in private + * folder with v5 release. Maybe it will be deprecated? + * The ESP32-C3 RSA Accelerator is activated by: + * setting the SYSTEM_CRYPTO_RSA_CLK_EN bit + * in the SYSTEM_PERIP_CLK_EN1_REG register and: + * clearing the SYSTEM_RSA_MEM_PD bit + * in the SYSTEM_RSA_PD_CTRL_REG reg. + * This releases the RSA Accelerator from reset.*/ + portENTER_CRITICAL_SAFE(&wc_rsa_reg_lock); + { + DPORT_REG_CLR_BIT( + (volatile void *)(DR_REG_RSA_BASE + SYSTEM_CRYPTO_RSA_CLK_EN), + SYSTEM_PERIP_CLK_EN1_REG); + DPORT_REG_SET_BIT( + (volatile void *)(DR_REG_RSA_BASE + SYSTEM_RSA_MEM_PD), + SYSTEM_RSA_PD_CTRL_REG); + } + portEXIT_CRITICAL_SAFE(&wc_rsa_reg_lock); +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* TODO: When implementing DS (Digital Signature HW), need to + * notify RSA HW is available. */ + + portENTER_CRITICAL_SAFE(&wc_rsa_reg_lock); + { + DPORT_REG_SET_BIT((volatile void *)(PCR_RSA_CONF_REG), + PCR_RSA_RST_EN); + DPORT_REG_CLR_BIT((volatile void *)(PCR_RSA_CONF_REG), + PCR_RSA_CLK_EN); + } + portEXIT_CRITICAL_SAFE(&wc_rsa_reg_lock); +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + /* Deactivate the RSA accelerator. + * See 20.3 of ESP32-S3 technical manual. + * periph_module_enable doesn't seem to be documented and is + * in private folder with v5 release. Maybe it will be deprecated? */ + DPORT_REG_SET_BIT(DPORT_RSA_PD_CTRL_REG, DPORT_RSA_MEM_PD); + periph_module_disable(PERIPH_RSA_MODULE); + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + /* Deactivate the RSA accelerator. + * See 20.3 of ESP32-S3 technical manual. + * periph_module_enable doesn't seem to be documented and is + * in private folder with v5 release. Maybe it will be deprecated? */ + DPORT_REG_SET_BIT(SYSTEM_RSA_PD_CTRL_REG, SYSTEM_RSA_MEM_PD); + periph_module_disable(PERIPH_RSA_MODULE); #else - /* set bit to disabled hardware operation; (clear to enable) - */ - DPORT_REG_SET_BIT(DPORT_RSA_PD_CTRL_REG, DPORT_RSA_PD); + /* unknown platform, assume no HW to unlock */ + ESP_LOGW(TAG, "Warning: esp_mp_hw_unlock called for unknown target"); +#endif /* per-SoC unlock */ - /* Disable RSA hardware */ - periph_module_disable(PERIPH_RSA_MODULE); -#endif +#if defined(SINGLE_THREADED) + single_thread_locked = FALSE; +#else + esp_CryptHwMutexUnLock(&mp_mutex); +#endif /* SINGLE_THREADED */ - /* unlock */ - esp_CryptHwMutexUnLock(&mp_mutex); + ESP_LOGV(TAG, "exit esp_mp_hw_unlock"); + } + else { + ESP_LOGW(TAG, "Warning: esp_mp_hw_unlock called when not locked."); + } + + return ret; } -/* this is based on an article by Cetin Kaya Koc, - * A New Algorithm for Inversion: mod p^k, June 28 2017 */ +/* Only mulmod and mulexp_mod HW accelerator need Montgomery math prep: M' */ +#if !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) \ + || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD) + static int esp_calc_Mdash(MATH_INT_T *M, word32 k, mp_digit* md) { + int ret = MP_OKAY; + ESP_LOGV(TAG, "\nBegin esp_calc_Mdash \n"); + +#ifdef USE_ALT_MPRIME + /* M' = M^(-1) mod b; b = 2^32 */ + + /* Call Large Number Modular Exponentiation + * + * Z = X^Y mod M + * + * mp_exptmod notation: Y = (G ^ X) mod P + * + * G is our parameter: M + */ + MATH_INT_T X[1] = { }; + MATH_INT_T P[1] = { }; + MATH_INT_T Y[1] = { }; + word32 Xs; + + ESP_LOGV(TAG, "\nBegin esp_calc_Mdash USE_ALT_MPRIME\n"); + + mp_init(X); + mp_init(P); + mp_init(Y); + + /* MATH_INT_T value of (-1) */ + X->dp[0] = 1; + X->sign = MP_NEG; + X->used = 1; + + Xs = mp_count_bits(X); + + /* MATH_INT_T value of 2^32 */ + P->dp[1] = 1; + P->used = 2; + + /* this fails due to even P number; ((b & 1) == 0) in fp_montgomery_setup() + * called from _fp_exptmod_ct, called from fp_exptmod */ + ret = mp_exptmod(M, X, P, Y); + + *md = Y->dp[0]; + ESP_LOGI(TAG, "esp_calc_Mdash %u", *md); +#else + /* this is based on an article by Cetin Kaya Koc, + * A New Algorithm for Inversion: mod p^k, June 28 2017 */ int i; int xi; int b0 = 1; int bi; word32 N = 0; word32 x; + ESP_LOGV(TAG, "\nBegin esp_calc_Mdash\n"); N = M->dp[0]; bi = b0; @@ -222,74 +609,276 @@ } /* 2's complement */ *md = ~x + 1; - return MP_OKAY; +#endif + + ESP_LOGV(TAG, "\nEnd esp_calc_Mdash \n"); + return ret; } +#endif /* !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_[MULMOD/EXPTMOD] for M' */ -/* start HW process */ -static void process_start(word32 reg) +/* the result may need to have extra bytes zeroed or used length adjusted */ +static int esp_clean_result(MATH_INT_T* Z, int used_padding) { - /* clear interrupt */ - DPORT_REG_WRITE(RSA_INTERRUPT_REG, 1); - /* start process */ - DPORT_REG_WRITE(reg, 1); + int ret = MP_OKAY; + uint16_t this_extra; + +/* TODO remove this section if MP_SIZE accepted into sp_int.h +** See https://github.com/wolfSSL/wolfssl/pull/6565 */ + uint16_t dp_length = 0; (void) dp_length; +#ifdef USE_FAST_MATH + #undef MP_SIZE + #define MP_SIZE FP_SIZE + dp_length = FP_SIZE; +#else + #undef MP_SIZE + #define MP_SIZE 128 + dp_length = SP_INT_DIGITS; +#endif +/* TODO end */ + + this_extra = Z->used; + if (this_extra > MP_SIZE) { + ESP_LOGW(TAG, "Warning (Z->used: %d) > (MP_SIZE: %d); adjusting...", + Z->used, MP_SIZE); + this_extra = MP_SIZE; + } + + while (Z->dp[this_extra] > 0 && (this_extra < MP_SIZE)) { + ESP_LOGV(TAG, "Adjust! %d", this_extra); + Z->dp[this_extra] = 0; + this_extra++; + } + + /* trim any trailing zeros and adjust z.used size */ + if (Z->used > 0) { + ESP_LOGV(TAG, "ZTrim: Z->used = %d", Z->used); + for (size_t i = Z->used; i > 0; i--) { + if (Z->dp[i - 1] == 0) { + /* last element in zero based array */ + Z->used = i - 1; + } + else { + break; /* if not zero, nothing else to do */ + } + } + ESP_LOGV(TAG, "New Z->used = %d", Z->used); + } + else { + ESP_LOGV(TAG, "no z-trim needed"); + } + +#if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + if (Z->sign != 0) { + mp_setneg(Z); /* any value other than zero is assumed negative */ + } +#endif + + /* a result of 1 is interesting */ + if ((Z->dp[0] == 1) && (Z->used == 1)) { + /* + * When the exponent is 0: In this case, the result of the modular + * exponentiation operation will always be 1, regardless of the value + * of the base. + * + * When the base is 1: If the base is equal to 1, then the result of + * the modular exponentiation operation will always be 1, regardless + * of the value of the exponent. + * + * When the exponent is equal to the totient of the modulus: If the + * exponent is equal to the totient of the modulus, and the base is + * relatively prime to the modulus, then the result of the modular + * exponentiation operation will be 1. + */ + ESP_LOGV(TAG, "Z->dp[0] == 1"); + } + + return ret; +} + +/* Start HW process. Reg is SoC-specific register. */ +static int process_start(u_int32_t reg) +{ + int ret = MP_OKAY; + /* see 3.16 "software needs to always use the "volatile" + ** attribute when accessing registers in these two address spaces. */ + DPORT_REG_WRITE((volatile word32*)reg, 1); + ESP_EM__POST_PROCESS_START; + + return ret; } -/* wait until done */ +/* wait until RSA math register indicates operation completed */ static int wait_until_done(word32 reg) { + int ret = MP_OKAY; word32 timeout = 0; + /* wait until done && not timeout */ - while (!ESP_TIMEOUT(++timeout) && - DPORT_REG_READ(reg) != 1) { - /* wait */ - } + ESP_EM__MP_HW_WAIT_DONE; + while (!ESP_TIMEOUT(++timeout) && DPORT_REG_READ(reg) != 1) { + asm volatile("nop"); /* wait */ + } + ESP_EM__DPORT_FIFO_READ; + +#if defined(CONFIG_IDF_TARGET_ESP32C6) + /* Write 1 or 0 to the RSA_INT_ENA_REG register to + * enable or disable the interrupt function. */ + DPORT_REG_WRITE(RSA_INT_CLR_REG, 1); /* write 1 to clear */ + DPORT_REG_WRITE(RSA_INT_ENA_REG, 0); /* disable */ +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* not currently clearing / disable on C3 */ + DPORT_REG_WRITE(RSA_INTERRUPT_REG, 1); + +#else /* clear interrupt */ DPORT_REG_WRITE(RSA_INTERRUPT_REG, 1); +#endif + if (ESP_TIMEOUT(timeout)) { - ESP_LOGE(TAG, "rsa operation is timed out."); - return MP_NG; + ESP_LOGE(TAG, "rsa operation timed out."); + ret = WC_HW_E; /* MP_HW_ERROR; */ } - return MP_OKAY; + return ret; } /* read data from memory into mp_init */ -static void esp_memblock_to_mpint(word32 mem_address, - MATH_INT_T* mp, - word32 numwords) +static int esp_memblock_to_mpint(const word32 mem_address, + MATH_INT_T* mp, + word32 numwords) { - esp_dport_access_read_buffer((uint32_t*)mp->dp, mem_address, numwords); + int ret = MP_OKAY; +#ifdef USE_ESP_DPORT_ACCESS_READ_BUFFER + esp_dport_access_read_buffer((word32*)mp->dp, mem_address, numwords); +#else + ESP_EM__PRE_DPORT_READ; + DPORT_INTERRUPT_DISABLE(); + ESP_EM__READ_NON_FIFO_REG; + for (volatile word32 i = 0; i < numwords; ++i) { + ESP_EM__3_16; + mp->dp[i] = DPORT_SEQUENCE_REG_READ( + (volatile word32)(mem_address + i * 4)); + } + DPORT_INTERRUPT_RESTORE(); +#endif mp->used = numwords; + +#if defined(ESP_VERIFY_MEMBLOCK) + ret = XMEMCMP((const word32 *)mem_address, /* HW reg memory */ + (const word32 *)&mp->dp, /* our dp value */ + numwords * sizeof(word32)); + + if (ret != ESP_OK) { + ESP_LOGW(TAG, "Validation Failure esp_memblock_to_mpint.\n" + "Reading %u Words at Address = 0x%08x", + (int)(numwords * sizeof(word32)), + (unsigned int)mem_address); + ESP_LOGI(TAG, "Trying again... "); + esp_dport_access_read_buffer((word32*)mp->dp, mem_address, numwords); + mp->used = numwords; + if (0 != XMEMCMP((const void *)mem_address, + (const void *)&mp->dp, + numwords * sizeof(word32))) { + ESP_LOGE(TAG, "Validation Failure esp_memblock_to_mpint " + "a second time. Giving up."); + ret = MP_VAL; + } + else { + ESP_LOGI(TAG, "Successfully re-read after Validation Failure."); + ret = MP_VAL; + } + } +#endif + return ret; } -/* write mp_init into memory block - */ -static void esp_mpint_to_memblock(word32 mem_address, const MATH_INT_T* mp, - const word32 bits, - const word32 hwords) +#ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL +/* Write 0x00 to [wordSz] words of register memory starting at mem_address */ +#if defined(CONFIG_IDF_TARGET_ESP32) +/* only the classic has memblock clear due to slightly different data layout */ +static int esp_zero_memblock(u_int32_t mem_address, int wordSz) +{ + int ret = MP_OKAY; + + ESP_EM__PRE_DPORT_WRITE; + DPORT_INTERRUPT_DISABLE(); + for (int i=0; i < wordSz; i++) { + DPORT_REG_WRITE( + (volatile u_int32_t *)(mem_address + (i * sizeof(word32))), + (u_int32_t)(0) /* zero memory blocks [wordSz] words long */ + ); + } + DPORT_INTERRUPT_RESTORE(); + return ret; +} +#endif /* CONFIG_IDF_TARGET_ESP32 */ +#endif /* not NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + +/* write MATH_INT_T mp value (dp[]) into memory block */ +static int esp_mpint_to_memblock(u_int32_t mem_address, + const MATH_INT_T* mp, + const word32 bits, + const word32 hwords) { + int ret = MP_OKAY; + /* init */ - word32 i; - word32 len = (bits / 8 + ((bits & 7) != 0 ? 1 : 0)); + word32 i; /* memory offset counter */ + word32 len; /* actual number of words to write to register */ + len = (bits / 8 + ((bits & 7) != 0 ? 1 : 0)); len = (len + sizeof(word32)-1) / sizeof(word32); + /* write */ + ESP_EM__PRE_DPORT_WRITE; + DPORT_INTERRUPT_DISABLE(); for (i=0; i < hwords; i++) { if (i < len) { - DPORT_REG_WRITE(mem_address + (i * sizeof(word32)), mp->dp[i]); + /* write our data */ + ESP_LOGV(TAG, "Write i = %d value.", i); + DPORT_REG_WRITE( + (volatile u_int32_t*)(mem_address + (i * sizeof(word32))), + mp->dp[i] + ); /* DPORT_REG_WRITE */ } else { - DPORT_REG_WRITE(mem_address + (i * sizeof(word32)), 0); + /* write zeros */ + /* TODO we may be able to skip zero in certain circumstances */ + if (i == 0) { + ESP_LOGV(TAG, "esp_mpint_to_memblock zero?"); + } + ESP_LOGV(TAG, "Write i = %d value = zero.", i); + DPORT_REG_WRITE( + (volatile u_int32_t*)(mem_address + (i * sizeof(word32))), + (u_int32_t)0 /* writing 4 bytes of zero */ + ); /* DPORT_REG_WRITE */ } } + DPORT_INTERRUPT_RESTORE(); + + /* optional re-read verify */ +#if defined(ESP_VERIFY_MEMBLOCK) + len = XMEMCMP((const void *)mem_address, /* HW reg memory */ + (const void *)&mp->dp, /* our dp value */ + hwords * sizeof(word32) + ); + if (len != 0) { + ESP_LOGE(TAG, "esp_mpint_to_memblock compare fails at %d", len); + #ifdef DEBUG_WOLFSSL + esp_show_mp("mp", (MATH_INT_T*)mp); + #endif + ret = MP_VAL; + } +#endif + return ret; } /* return needed HW words. * supported words length - * words : {16 , 32, 48, 64, 80, 96, 112, 128} - * bits : {512,1024, 1536, 2048, 2560, 3072, 3584, 4096} + * words : { 16, 32, 48, 64, 80, 96, 112, 128} + * bits : {512, 1024, 1536, 2048, 2560, 3072, 3584, 4096} */ static word32 words2hwords(word32 wd) { @@ -307,143 +896,426 @@ return ((bits + (d - 1)) / d); } +/* exptmod and mulmod helpers as needed */ +#if !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) \ + || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD) +/* rinv and M' only used for mulmod and mulexp_mod */ + /* get rinv */ static int esp_get_rinv(MATH_INT_T *rinv, MATH_INT_T *M, word32 exp) { - int ret = 0; +#ifdef DEBUG_WOLFSSL + MATH_INT_T rinv2[1]; + MATH_INT_T M2[1]; + int reti = MP_OKAY; +#endif + int ret = MP_OKAY; + + ESP_LOGV(TAG, "\nBegin esp_get_rinv \n"); +#ifdef DEBUG_WOLFSSL + mp_copy(M, M2); /* copy (src = M) to (dst = M2) */ + mp_copy(rinv, rinv2); /* copy (src = M) to (dst = M2) */ +#endif - /* 2^(exp)*/ - if ((ret = mp_2expt(rinv, exp)) != MP_OKAY) { + /* 2^(exp) + * + * rinv will have all zeros with a 1 in last word. + * e.g. exp=2048 will have a 1 in dp[0x40] = dp[64] + * this is the 65'th element (zero based) + * Value for used = 0x41 = 65 + **/ + ret = mp_2expt(rinv, exp); + if (ret == MP_OKAY) { + ret = mp_mod(rinv, M, rinv); + } + else { ESP_LOGE(TAG, "failed to calculate mp_2expt()"); - return ret; } /* r_inv = R^2 mod M(=P) */ - if (ret == 0 && (ret = mp_mod(rinv, M, rinv)) != MP_OKAY) { + if (ret == MP_OKAY) { + ESP_LOGV(TAG, "esp_get_rinv compute success"); + } + else { ESP_LOGE(TAG, "failed to calculate mp_mod()"); - return ret; } +#ifdef DEBUG_WOLFSSL + if (ret == MP_OKAY) { + + /* computes a = B**n mod b without division or multiplication useful for + * normalizing numbers in a Montgomery system. */ + reti = mp_montgomery_calc_normalization(rinv2, M2); + if (reti == MP_OKAY) { + ESP_LOGV(TAG, "mp_montgomery_calc_normalization = %d", reti); + } + else { + ESP_LOGW(TAG, "Error Montgomery calc M2 result = %d", reti); + } + } +#endif + + ESP_LOGV(TAG, "\nEnd esp_get_rinv \n"); return ret; } +#endif /* ! xEXPTMOD || ! xMULMOD for rinv */ -/* Z = X * Y; */ -int esp_mp_mul(MATH_INT_T* X, MATH_INT_T* Y, MATH_INT_T* Z) +/* during debug, we'll compare HW to SW results */ +int esp_hw_validation_active(void) { - int ret; +#ifdef DEBUG_WOLFSSL + return IS_HW_VALIDATION; +#else + return 0; /* we're never validating when not debugging */ +#endif +} -#ifdef WOLFSSL_SP_INT_NEGATIVE - /* neg check: X*Y becomes negative */ - int neg; +/* useful during debugging and error display, + * we can show all the mp helper calc values */ +int esp_show_mph(struct esp_mp_helper* mph) +{ + int ret = MP_OKAY; - /* aka (X->sign == Y->sign) ? MP_ZPOS : MP_NEG; , but with mp_isneg(): */ - neg = (mp_isneg(X) == mp_isneg(Y)) ? MP_ZPOS : MP_NEG; - if (neg) { - /* Negative numbers are relatively infrequent. - * May be interesting during verbose debugging: */ - ESP_LOGV(TAG, "mp_isneg(X) = %d; mp_isneg(Y) = %d; neg = %d ", - mp_isneg(X), mp_isneg(Y), neg); + if (mph == NULL) { + /* if a bad mp helper passed, we cannot use HW */ + ESP_LOGE(TAG, "ERROR: Bad esp_mp_helper for esp_show_mph"); + return MP_VAL; + } + + if (mph->Xs != 0) + ESP_LOGI(TAG, "Xs %d", mph->Xs); + if (mph->Ys != 0) + ESP_LOGI(TAG, "Ys %d", mph->Ys); + if (mph->Ms != 0) + ESP_LOGI(TAG, "Ms %d", mph->Ms); + if (mph->Rs != 0) + ESP_LOGI(TAG, "Rs %d", mph->Rs); + if (mph->maxWords_sz != 0) + ESP_LOGI(TAG, "maxWords_sz %d", mph->maxWords_sz); + if (mph->hwWords_sz != 0) + ESP_LOGI(TAG, "hwWords_sz %d", mph->hwWords_sz); + if (mph->mp != 0) + ESP_LOGI(TAG, "mp %d", mph->mp); +#ifdef DEBUG_WOLFSSL + if (mph->mp2 != 0) + ESP_LOGI(TAG, "mp2 %d", mph->mp2); +#endif + if (mph->r_inv.used != 0) + esp_show_mp("r_inv", &(mph->r_inv)); + return ret; +} + +#if !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) \ + || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD) +/* only when using exptmod or mulmod, we have some helper functions. */ + +/* given X, Y, M - setup mp hardware and other helper values.*/ +int esp_mp_montgomery_init(MATH_INT_T* X, MATH_INT_T* Y, MATH_INT_T* M, + struct esp_mp_helper* mph) +{ + int ret = MP_OKAY; + int exp; + + if (mph == NULL) { + /* if a bad mp helper passed, we cannot use HW */ + ESP_LOGE(TAG, "ERROR: Bad esp_mp_helper, falling back to SW"); + return MP_HW_FALLBACK; + } + if ((X == NULL) || (Y == NULL) || (M == NULL) ) { + /* if a bad operand passed, we cannot use HW */ + ESP_LOGE(TAG, "ERROR: Bad Montgomery operand, falling back to SW"); + return MP_HW_FALLBACK; + } + XMEMSET(mph, 0, sizeof(struct esp_mp_helper)); + mph->Xs = mp_count_bits(X); /* X's = the number of bits needed */ + +#if (ESP_PROHIBIT_SMALL_X == TRUE) + /* optionally prohibit small X. + ** note this is very common in ECC: [1] * [Y] mod [M] */ + if ((X->used == 1) && (X->dp[1] < (1 << 8))) { + #ifdef WOLFSSL_HW_METRICS + esp_mp_mulmod_small_x_ct++; + #endif + ESP_LOGW(TAG, "esp_mp_montgomery_init MP_HW_FALLBACK Xs = %d", + mph->Xs); + ret = MP_HW_FALLBACK; } #endif - ret = MP_OKAY; /* assume success until proven wrong */ -#if CONFIG_IDF_TARGET_ESP32S3 + /* prohibit small Y */ + if (ret == MP_OKAY) { + mph->Ys = mp_count_bits(Y); /* init Y's to pass to Montgomery init */ + + if (mph->Xs <= ESP_RSA_EXPT_XBITS) { + /* hard floor 8 bits, problematic in some older ESP32 chips */ + #ifdef WOLFSSL_HW_METRICS + { + /* track how many times we fall back */ + esp_mp_mulmod_small_x_ct++; + } + #endif + ESP_LOGV(TAG, + "esp_mp_montgomery_init MP_HW_FALLBACK Xs = %d", + mph->Xs); + ret = MP_HW_FALLBACK; /* fall back to software calc at exit */ + } /* mph->Xs <= ESP_RSA_EXPT_XBITS */ + else { + if (mph->Ys <= ESP_RSA_EXPT_YBITS) { + /* hard floor 8 bits, problematic in some older ESP32 chips */ + #ifdef WOLFSSL_HW_METRICS + { + /* track how many times we fall back */ + esp_mp_mulmod_small_y_ct++; + } + #endif + ESP_LOGV(TAG, + "esp_mp_montgomery_init MP_HW_FALLBACK Ys = %d", + mph->Ys); + ret = MP_HW_FALLBACK; /* fall back to software calc at exit */ + } /* Ys <= ESP_RSA_EXPT_YBITS */ + else { + /* X and Y size ok, continue... */ + mph->Ms = mp_count_bits(M); + /* maximum bits and words for writing to HW */ + mph->maxWords_sz = bits2words(max(mph->Xs, + max(mph->Ys, mph->Ms))); + mph->hwWords_sz = words2hwords(mph->maxWords_sz); + + if ((mph->hwWords_sz << 5) > ESP_HW_RSAMAX_BIT) { + ESP_LOGW(TAG, "Warning: hwWords_sz = %d (%d bits)" + " exceeds HW maximum bits (%d), " + " falling back to SW.", + mph->hwWords_sz, + mph->hwWords_sz << 5, + ESP_HW_RSAMAX_BIT); + ret = MP_HW_FALLBACK; + } /* hwWords_sz check */ + } /* X and Y size ok */ + } /* X size check */ + } /* Prior operation ok */ - int BitsInX = mp_count_bits(X); - int BitsInY = mp_count_bits(Y); + ESP_LOGV(TAG, "hwWords_sz = %d", mph->hwWords_sz); - /* X & Y must be represented by the same number of bits. Must be - * enough to represent the larger one. */ - int MinXYBits = max(BitsInX, BitsInY); + /* calculate r_inv = R^2 mode M + * where: R = b^n, and b = 2^32 + * accordingly R^2 = 2^(n*32*2) + */ +#if defined(CONFIG_IDF_TARGET_ESP32) + exp = mph->hwWords_sz << 6; +#elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + exp = mph->maxWords_sz * BITS_IN_ONE_WORD * 2; +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + exp = mph->maxWords_sz * BITS_IN_ONE_WORD * 2; +#else + exp = 0; /* no HW, no Montgomery HW init */ +#endif - /* Figure out how many words we need to represent each operand & the result. */ - int WordsForOperand = bits2words(MinXYBits); - int WordsForResult = bits2words(BitsInX + BitsInY); + if (ret == MP_OKAY && (M != NULL)) { + ret = mp_init((mp_int*)&(mph->r_inv)); + if (ret == MP_OKAY) { + ret = esp_get_rinv( (mp_int*)&(mph->r_inv), M, exp); + if (ret == MP_OKAY) { + mph->Rs = mp_count_bits((mp_int*)&(mph->r_inv)); + } + else { + ESP_LOGE(TAG, "calculate r_inv failed."); + ret = MP_VAL; + } /* esp_get_rinv check */ + } /* mp_init success */ + else { + ESP_LOGE(TAG, "calculate r_inv failed mp_init."); + ret = MP_MEM; + } /* mp_init check */ + } /* calculate r_inv */ + + /* if we were successful in r_inv, next get M' */ + if (ret == MP_OKAY) { +#ifdef DEBUG_WOLFSSL + ret = mp_montgomery_setup(M, &(mph->mp2) ); +#endif + /* calc M' */ + /* if Pm is odd, uses mp_montgomery_setup() */ + ret = esp_calc_Mdash(M, 32/* bits */, &(mph->mp)); + if (ret != MP_OKAY) { + ESP_LOGE(TAG, "failed esp_calc_Mdash()"); + } + } - /* Make sure we are within capabilities of hardware. */ - if ( (WordsForOperand * BITS_IN_ONE_WORD) > ESP_HW_MULTI_RSAMAX_BITS ) { - ESP_LOGW(TAG, "exceeds max bit length(2048)"); - return MP_VAL; /* Error: value is not able to be used. */ +#ifdef DEBUG_WOLFSSL + if (ret == MP_OKAY) { + if (mph->mp == mph->mp2) { + ESP_LOGV(TAG, "M' match esp_calc_Mdash vs mp_montgomery_setup " + "= %ul !", mph->mp); + } + else { + ESP_LOGW(TAG, + "\n\n" + "M' MISMATCH esp_calc_Mdash = 0x%08x = %d \n" + "vs mp_montgomery_setup = 0x%08x = %d \n\n", + mph->mp, + mph->mp, + mph->mp2, + mph->mp2); + mph->mp = mph->mp2; + } } + else { + #if 0 + esp_show_mp("X", X); + esp_show_mp("Y", Y); + esp_show_mp("M", M); + esp_show_mph(mph); + #endif - /* Steps to perform large number multiplication. Calculates Z = X x Y. The number of - * bits in the operands (X, Y) is N. N can be 32x, where x = {1,2,3,...64}, so the - * maximum number of bits in the X and Y is 2048. - * See 20.3.3 of ESP32-S3 technical manual - * 1. Lock the hardware so no-one else uses it and wait until it is ready. - * 2. Enable/disable interrupt that signals completion -- we don't use the interrupt. - * 3. Write number of words required for result to the RSA_MODE_REG (now called RSA_LENGTH_REG). - * Number of words required for the result is 2 * words for operand - 1 - * 4. Load X, Y operands to memory blocks. Note the Y value must be written to - * right aligned. - * 5. Start the operation by writing 1 to RSA_MULT_START_REG, then wait for it - * to complete by monitoring RSA_IDLE_REG (which is now called RSA_QUERY_INTERRUPT_REG). - * 6. Read the result out. - * 7. Release the hardware lock so others can use it. - * x. Clear the interrupt flag, if you used it (we don't). */ + if (ret == MP_HW_FALLBACK) { + ESP_LOGV(TAG, "esp_mp_montgomery_init exit falling back."); - /* 1. lock HW for use & wait until it is ready. */ - if ( ((ret = esp_mp_hw_lock()) != MP_OKAY) || - ((ret = esp_mp_hw_wait_clean()) != MP_OKAY) ) { - return ret; + } + else { + ESP_LOGE(TAG, "esp_mp_montgomery_init failed: return code = %d", + ret); + } } +#endif - /* 2. Disable completion interrupt signal; we don't use. - ** 0 => no interrupt; 1 => interrupt on completion. */ - DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); - - /* 3. Write number of words required for result. */ - if ( (WordsForOperand * BITS_IN_ONE_WORD * 2) > ESP_HW_RSAMAX_BIT) { - ESP_LOGW(TAG, "result exceeds max bit length"); - return MP_VAL; /* Error: value is not able to be used. */ - } - DPORT_REG_WRITE(RSA_LENGTH_REG, (WordsForOperand * 2 - 1) ); - - /* 4. Load X, Y operands. Maximum is 64 words (64*8*4 = 2048 bits) */ - esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, - X, BitsInX, WordsForOperand); - esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE + WordsForOperand * 4, - Y, BitsInY, WordsForOperand); - - - /* 5. Start operation and wait until it completes. */ - process_start(RSA_MULT_START_REG); - ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); - if (MP_OKAY != ret) { - return ret; - } + return ret; +} /* esp_mp_montgomery_init */ - /* 6. read the result form MEM_Z */ - esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, WordsForResult); +#endif /* ! NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_[EXPTMOD|MULMOD] */ - /* 7. clear and release HW */ - esp_mp_hw_unlock(); +#ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL +/* Large Number Multiplication + * + * See 24.3.3 of the ESP32 Technical Reference Manual + * + * Z = X * Y; */ +int esp_mp_mul(MATH_INT_T* X, MATH_INT_T* Y, MATH_INT_T* Z) +{ +/* During debug, we may be validating against SW result. */ +#ifdef DEBUG_WOLFSSL + /* create a place to store copies to perform duplicate operations. + ** copies needed as some operations overwrite operands: e.g. X = X * Y */ + MATH_INT_T X2[1]; + MATH_INT_T Y2[1]; + MATH_INT_T Z2[1]; + MATH_INT_T PEEK[1]; +#endif - /* end if CONFIG_IDF_TARGET_ESP32S3 */ + int ret = MP_OKAY; /* assume success until proven wrong */ + int mp_mul_lock_called = FALSE; /* May fall back to SW; track if locked */ -#else /* not CONFIG_IDF_TARGET_ESP32S3 */ - /* assumed to be regular Xtensa here */ + /* we don't use the mph helper for mp_mul, so we'll calculate locally: */ word32 Xs; word32 Ys; word32 Zs; - word32 maxWords_sz; - word32 hwWords_sz; + word32 maxWords_sz = 0; + word32 hwWords_sz = 0; + word32 resultWords_sz = 0; + +#if defined(CONFIG_IDF_TARGET_ESP32) + word32 left_pad_offset = 0; +#endif + +/* if we are supporting negative numbers, check that first since operands + * may be later modified (e.g. Z = Z * X) */ +#if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + /* neg check: X*Y becomes negative */ + int res_sign; + + /* aka (X->sign == Y->sign) ? MP_ZPOS : MP_NEG; , but with mp_isneg(): */ + res_sign = (mp_isneg(X) == mp_isneg(Y)) ? MP_ZPOS : MP_NEG; + if (res_sign) { + /* Negative numbers are relatively infrequent. + * May be interesting during verbose debugging: */ + ESP_LOGV(TAG, "mp_isneg(X) = %d; mp_isneg(Y) = %d; neg = %d ", + mp_isneg(X), mp_isneg(Y), res_sign); + } +#endif + +#ifdef WOLFSSL_HW_METRICS + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : esp_mp_max_used; +#endif + + /* if either operand is zero, there's nothing to do. + * Y checked first, as it was observed to be zero during + * wolfcrypt tests more often than X */ + if (mp_iszero(Y) || mp_iszero(X)) { + mp_forcezero(Z); + return MP_OKAY; + } + +#ifdef DEBUG_WOLFSSL + /* The caller should have checked if the call was for a SW validation. + * During debug, we'll return an error. */ + if (esp_hw_validation_active()) { + return MP_HW_VALIDATION_ACTIVE; + } + + /* these occur many times during RSA calcs */ + if (X == Z) { + ESP_LOGV(TAG, "mp_mul X == Z"); + } + if (Y == Z) { + ESP_LOGV(TAG, "mp_mul Y == Z"); + } + + mp_init(X2); + mp_init(Y2); + mp_init(Z2); + + mp_copy(X, X2); /* copy (src = X) to (dst = X2) */ + mp_copy(Y, Y2); /* copy (src = Y) to (dst = Y2) */ + mp_copy(Z, Z2); /* copy (src = Z) to (dst = Z2) */ + + if (IS_HW_VALIDATION) { + ESP_LOGE(TAG, "Caller must not try HW when validation active."); + } + else { + SET_HW_VALIDATION; /* force next mp_mul to SW for compare */ + mp_mul(X2, Y2, Z2); + CLR_HW_VALIDATION; + } +#endif /* DEBUG_WOLFSSL */ - /* ask bits number */ Xs = mp_count_bits(X); Ys = mp_count_bits(Y); Zs = Xs + Ys; - /* maximum bits and words for writing to HW */ - maxWords_sz = bits2words(max(Xs, Ys)); - hwWords_sz = words2hwords(maxWords_sz); - - /* sanity check */ - if((hwWords_sz<<5) > ESP_HW_MULTI_RSAMAX_BITS) { - ESP_LOGW(TAG, "exceeds max bit length(2048)"); - return MP_VAL; /* Error: value is not able to be used. */ + /* RSA Accelerator only supports Large Number Multiplication + * with operand length N = 32 * x, + * where x in {1, 2, 3, . . . , 64} */ + if (Xs > 64 || Ys > 64) { + return MP_HW_FALLBACK; /* TODO add count metric on size fallback */ } + if (Zs <= sizeof(mp_digit)*8) { + Z->dp[0] = X->dp[0] * Y->dp[0]; + Z->used = 1; +#if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + Z->sign = res_sign; /* See above mp_isneg() for negative detection */ +#endif + return MP_OKAY; + } + + if (ret == MP_OKAY) { + /* maximum bits and words for writing to HW */ + maxWords_sz = bits2words(max(Xs, Ys)); + hwWords_sz = words2hwords(maxWords_sz); + + resultWords_sz = bits2words(Xs + Ys); + /* sanity check */ + if ( (hwWords_sz << 5) > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "exceeds max bit length(2048) (a)"); + ret = MP_HW_FALLBACK; /* Error: value is not able to be used. */ + } + } + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* assumed to be regular ESP32 Xtensa here */ + /*Steps to use HW in the following order: * 1. wait until clean HW engine * 2. Write(2*N/512bits - 1 + 8) to MULT_MODE_REG @@ -451,464 +1323,1771 @@ * need to write data to each memory block only according to the length * of the number. * 4. Write 1 to MUL_START_REG - * 5. Wait for the first operation to be done. Poll INTERRUPT_REG until it reads 1. - * (Or until the INTER interrupt is generated.) + * 5. Wait for the first operation to be done. + * Poll INTERRUPT_REG until it reads 1. + * (Or until the INTER interrupt is generated.) * 6. Write 1 to RSA_INTERRUPT_REG to clear the interrupt. * 7. Read the Z from RSA_Z_MEM * 8. Write 1 to RSA_INTERUPT_REG to clear the interrupt. * 9. Release the HW engine */ - /* lock HW for use */ - if ((ret = esp_mp_hw_lock()) != MP_OKAY) { - return ret; + + /* Y (left-extend) + * Accelerator supports large-number multiplication with only + * four operand lengths of N in {512, 1024, 1536, 2048} */ + left_pad_offset = maxWords_sz << 2; + if (left_pad_offset <= 512 >> 3) { + left_pad_offset = 512 >> 3; /* 64 bytes (16 words) */ + } + else { + if (left_pad_offset <= 1024 >> 3) { + left_pad_offset = 1024 >> 3; /* 128 bytes = 32 words */ + } + else { + if (left_pad_offset <= 1536 >> 3) { + left_pad_offset = 1536 >> 3; /* 192 bytes = 48 words */ + } + else { + if (left_pad_offset <= 2048 >> 3) { + left_pad_offset = 2048 >> 3; /* 256 bytes = 64 words */ + } + else { + ret = MP_VAL; + ESP_LOGE(TAG, "Unsupported operand length: %d", + hwWords_sz); + } + } + } } - if((ret = esp_mp_hw_wait_clean()) != MP_OKAY) { - return ret; + /* lock HW for use, enable peripheral clock */ + if (ret == MP_OKAY) { + mp_mul_lock_called = TRUE; /* we'll not try to unlock + * unless we locked it here. */ + #ifdef WOLFSSL_HW_METRICS + { + /* Only track max values when using HW */ + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : + esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : + esp_mp_max_used; + } + #endif + + ret = esp_mp_hw_lock(); } - /* step.1 (2*N/512) => N/256. 512 bits => 16 words */ - DPORT_REG_WRITE(RSA_MULT_MODE_REG, (hwWords_sz >> 3) - 1 + 8); - /* step.2 write X, M and r_inv into memory */ - esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, - X, - Xs, - hwWords_sz); - /* Y(let-extend) */ - esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE + (hwWords_sz<<2), - Y, - Ys, - hwWords_sz); - /* step.3 start process */ - process_start(RSA_MULT_START_REG); + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + } - /* step.4,5 wait until done */ - ret = wait_until_done(RSA_INTERRUPT_REG); - if (ret != MP_OKAY) { - ESP_LOGE(TAG, "wait_until_done failed."); - return ret; + if (ret == MP_OKAY) { + /* step.1 (2*N/512) => N/256. 512 bits => 16 words */ + /* Write 2*N/512 - 1 + 8 */ + + DPORT_REG_WRITE(RSA_MULT_MODE_REG, + (2 * left_pad_offset * 8 / 512) - 1 + 8); + + /* step.2 write X into memory */ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + Xs, + hwWords_sz); + + /* write zeros from RSA_MEM_Z_BLOCK_BASE to left_pad_offset - 1 */ + esp_zero_memblock(RSA_MEM_Z_BLOCK_BASE, + (left_pad_offset - 1) / sizeof(int)); + + /* write the left-padded Y value into Z */ + esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE + (left_pad_offset), + Y, + Ys, + hwWords_sz); + + #ifdef DEBUG_WOLFSSL + /* save value to peek at the result stored in RSA_MEM_Z_BLOCK_BASE */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, + PEEK, + 128); + #endif + + /* step.3 start process */ + process_start(RSA_MULT_START_REG); + + /* step.4,5 wait until done */ + ret = wait_until_done(RSA_INTERRUPT_REG); + + /* step.6 read the result form MEM_Z */ + if (ret == MP_OKAY) { + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, resultWords_sz); + } +#ifndef DEBUG_WOLFSSL + else { + ESP_LOGE(TAG, "ERROR: wait_until_done failed in esp32_mp"); + } +#endif + } /* end of processing */ +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* Unlike the ESP32 that is limited to only four operand lengths, + * the ESP32-C3 The RSA Accelerator supports large-number modular + * multiplication with operands of 128 different lengths. + * + * X & Y must be represented by the same number of bits. Must be + * enough to represent the larger one. */ + + /* Figure out how many words we need to + * represent each operand & the result. */ + + /* Make sure we are within capabilities of hardware. */ + if ((hwWords_sz * BITS_IN_ONE_WORD) > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "exceeds max bit length(%d)", ESP_HW_MULTI_RSAMAX_BITS); + ret = MP_HW_FALLBACK; /* let SW figure out how to deal with it */ + } + if ((hwWords_sz * BITS_IN_ONE_WORD * 2) > ESP_HW_RSAMAX_BIT) { + ESP_LOGW(TAG, "result exceeds max bit length(%d)", ESP_HW_RSAMAX_BIT ); + ret = MP_HW_FALLBACK; /* let SW figure out how to deal with it */ } - /* step.6 read the result form MEM_Z */ - esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, BITS_TO_WORDS(Zs)); - /* step.7 clear and release HW */ - esp_mp_hw_unlock(); + /* Steps to perform large number multiplication. Calculates Z = X * Y. + * The number of bits in the operands (X, Y) is N. N can be 32x, where + * x = {1,2,3,...64}, so the maximum number of bits in X and Y is 2048. + * See 20.3.3 of ESP32-S3 technical manual + * 1. Lock the hardware so no-one else uses it and wait until it is ready. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write number of words required for result to the RSA_MODE_REG + * (now called RSA_LENGTH_REG). + * Number of words required for the result is 2 * words for operand - 1 + * 4. Load X, Y operands to memory blocks. + * Note the Y value must be written to as right aligned. + * 5. Start the operation by writing 1 to RSA_MULT_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). + * 6. Read the result out. + * 7. Release the hardware lock so others can use it. + * x. Clear the interrupt flag, if you used it (we don't). */ + + /* 1. lock HW for use & wait until it is ready. */ + /* lock HW for use, enable peripheral clock */ + if (ret == MP_OKAY) { + mp_mul_lock_called = TRUE; /* Do not try to unlock unless we locked */ + #ifdef WOLFSSL_HW_METRICS + { + /* Only track max values when using HW */ + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : + esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : + esp_mp_max_used; + } + #endif + + ret = esp_mp_hw_lock(); + } /* the only thing we expect is success or busy */ + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + } + + /* HW multiply */ + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); + + /* 3. Write number of words required for result. */ + DPORT_REG_WRITE(RSA_LENGTH_REG, (hwWords_sz * 2 - 1)); + + /* 4. Load X, Y operands. Maximum is 64 words (64*8*4 = 2048 bits) */ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + Xs, + hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE + hwWords_sz * 4, + Y, + Ys, + hwWords_sz); + + /* 5. Start operation and wait until it completes. */ + process_start(RSA_MULT_START_REG); + ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); + } + if (ret == MP_OKAY) { + /* 6. read the result form MEM_Z */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, resultWords_sz); + } +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* Unlike the ESP32 that is limited to only four operand lengths, + * the ESP32-C6 The RSA Accelerator supports large-number modular + * multiplication with operands of 128 different lengths. + * + * X & Y must be represented by the same number of bits. Must be + * enough to represent the larger one. */ -#endif /* CONFIG_IDF_TARGET_ESP32S3 or not */ + /* Figure out how many words we need to + * represent each operand & the result. */ + + /* Make sure we are within capabilities of hardware. */ + if ((hwWords_sz * BITS_IN_ONE_WORD) > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "exceeds max bit length(%d)", ESP_HW_MULTI_RSAMAX_BITS); + ret = MP_HW_FALLBACK; /* let SW figure out how to deal with it */ + } + if ((hwWords_sz * BITS_IN_ONE_WORD * 2) > ESP_HW_RSAMAX_BIT) { + ESP_LOGW(TAG, "result exceeds max bit length(%d)", ESP_HW_RSAMAX_BIT ); + ret = MP_HW_FALLBACK; /* let SW figure out how to deal with it */ + } + + /* Steps to perform large number multiplication. Calculates Z = X * Y. + * The number of bits in the operands (X, Y) is N. + * N can be 32x, where x = {1,2,3,...64}, + * so the maximum number of bits in the X and Y is 2048. + * See 20.3.3 of ESP32-S3 technical manual + * 1. Lock the hardware so no-one else uses it and wait until it is ready. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write number of words required for result to the RSA_MODE_REG + * (now called RSA_LENGTH_REG). + * Number of words required for the result is 2 * words for operand - 1 + * 4. Load X, Y operands to memory blocks. + * Note the Y value must be written to right aligned. + * 5. Start the operation by writing 1 to RSA_MULT_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). + * 6. Read the result out. + * 7. Release the hardware lock so others can use it. + * x. Clear the interrupt flag, if you used it (we don't). */ + + /* 1. lock HW for use & wait until it is ready. */ + /* lock HW for use, enable peripheral clock */ + if (ret == MP_OKAY) { + mp_mul_lock_called = TRUE; /* Do not try to unlock unless we locked */ + #ifdef WOLFSSL_HW_METRICS + { + /* Only track max values when using HW */ + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : + esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : + esp_mp_max_used; + } + #endif + + ret = esp_mp_hw_lock(); + } /* the only thing we expect is success or busy */ + + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + } + + /* HW multiply */ + if (ret == MP_OKAY) { + /* 1. Disable completion interrupt signal; we don't use. + * Write 1 (enable) or 0 (disable) to the RSA_INT_ENA_REG register. + * 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INT_ENA_REG, 0); + /* 2. Write number of words required for result. */ + /* see 21.3.3 Write (/N16 - 1) to the RSA_MODE_REG register */ + DPORT_REG_WRITE(RSA_MODE_REG, (hwWords_sz * 2 - 1)); + + /* 3. Write Xi and Yi for {0, 1, . . . , n - 1} to memory blocks + * RSA_X_MEM and RSA_Z_MEM + * Maximum is 64 words (64*8*4 = 2048 bits) */ + esp_mpint_to_memblock(RSA_X_MEM, + X, + Xs, + hwWords_sz); + esp_mpint_to_memblock(RSA_Z_MEM + hwWords_sz * 4, + Y, + Ys, + hwWords_sz); + + /* 4. Write 1 to the RSA_SET_START_MULT register */ + ret = process_start(RSA_SET_START_MULT_REG); + + } + /* 5. Wait for the completion of computation, which happens when the + * content of RSA_QUERY_IDLE becomes 1 or the RSA interrupt occurs. */ + if (ret == MP_OKAY) { + ret = wait_until_done(RSA_QUERY_IDLE_REG); + } + + if (ret == MP_OKAY) { + /* 6. read the result from MEM_Z */ + esp_memblock_to_mpint(RSA_Z_MEM, Z, resultWords_sz); + } + /* end ESP32-C6 */ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + /* Unlike the ESP32 that is limited to only four operand lengths, + * the ESP32-S3 The RSA Accelerator supports large-number modular + * multiplication with operands of 128 different lengths. + * + * X & Y must be represented by the same number of bits. Must be + * enough to represent the larger one. */ + + /* Figure out how many words we need to + * represent each operand & the result. */ + + /* Make sure we are within capabilities of hardware. */ + if ((hwWords_sz * BITS_IN_ONE_WORD) > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "exceeds max bit length(%d)", ESP_HW_MULTI_RSAMAX_BITS); + ret = MP_HW_FALLBACK; /* let SW figure out how to deal with it */ + } + if ((hwWords_sz * BITS_IN_ONE_WORD * 2) > ESP_HW_RSAMAX_BIT) { + ESP_LOGW(TAG, "result exceeds max bit length(%d)", ESP_HW_RSAMAX_BIT ); + ret = MP_HW_FALLBACK; /* let SW figure out how to deal with it */ + } + + /* Steps to perform large number multiplication. Calculates Z = X * Y. + * The number of bits in the operands (X, Y) is N. + * N can be 32x, where x = {1,2,3,...64}, + * so the maximum number of bits in the X and Y is 2048. + * See 20.3.3 of ESP32-S3 technical manual + * 1. Lock the hardware so no-one else uses it and wait until it is ready. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write number of words required for result to the RSA_MODE_REG + * (now called RSA_LENGTH_REG). + * Number of words required for the result is 2 * words for operand - 1 + * 4. Load X, Y operands to memory blocks. + * Note the Y value must be written to right aligned. + * 5. Start the operation by writing 1 to RSA_MULT_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). + * 6. Read the result out. + * 7. Release the hardware lock so others can use it. + * x. Clear the interrupt flag, if you used it (we don't). */ + + /* 1. lock HW for use & wait until it is ready. */ + if (ret == MP_OKAY) { + mp_mul_lock_called = TRUE; /* Don't try to unlock unless we locked. */ + #ifdef WOLFSSL_HW_METRICS + { + /* Only track max values when using HW */ + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : + esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : + esp_mp_max_used; + } + #endif + + ret = esp_mp_hw_lock(); + } /* the only thing we expect is success or busy */ + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + } + + /* HW multiply */ + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); + + /* 3. Write number of words required for result. */ + DPORT_REG_WRITE(RSA_LENGTH_REG, (hwWords_sz * 2 - 1)); + + /* 4. Load X, Y operands. Maximum is 64 words (64*8*4 = 2048 bits) */ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + Xs, + hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE + hwWords_sz * 4, + Y, + Ys, + hwWords_sz); + + /* 5. Start operation and wait until it completes. */ + process_start(RSA_MULT_START_REG); + ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); + } + if (ret == MP_OKAY) { + /* 6. read the result form MEM_Z */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, resultWords_sz); + } + + /* + ** end if CONFIG_IDF_TARGET_ESP32S3 + */ +#else + ret = MP_HW_FALLBACK; +#endif /* target HW calcs*/ /* common exit for all chipset types */ -#ifdef WOLFSSL_SP_INT_NEGATIVE - if (!mp_iszero(Z) && neg) { - /* for non-zero negative numbers, set negative flag for our result: - * Z->sign = FP_NEG */ - mp_setneg(Z); + + /* step.7 clear and release HW */ + if (mp_mul_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called"); + } + +#if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + if (ret == MP_OKAY) { + if (!mp_iszero(Z) && res_sign) { + /* for non-zero negative numbers, set negative flag for our result: + * Z->sign = FP_NEG */ + ESP_LOGV(TAG, "Setting Z to negative result!"); + mp_setneg(Z); + } + else { + Z->sign = MP_ZPOS; + } + } +#endif + + if (ret == MP_OKAY) { + /* never clean the result for anything other than success, as we may + * fall back to SW and we don't want to muck up operand values. */ + esp_clean_result(Z, 0); + } + +#ifdef DEBUG_WOLFSSL + if (mp_cmp(X, X2) != 0) { + /* this may be interesting when operands change (e.g. z=x*z mode m) */ + /* ESP_LOGE(TAG, "mp_mul X vs X2 mismatch!"); */ + } + if (mp_cmp(Y, Y2) != 0) { + /* this may be interesting when operands change (e.g. z=y*z mode m) */ + /* ESP_LOGE(TAG, "mp_mul Y vs Y2 mismatch!"); */ + } + if (mp_cmp(Z, Z2) != 0) { + int found_z_used = Z->used; + + ESP_LOGE(TAG, "mp_mul Z vs Z2 mismatch!"); + ESP_LOGI(TAG, "Xs = %d", Xs); + ESP_LOGI(TAG, "Ys = %d", Ys); + ESP_LOGI(TAG, "Zs = %d", Zs); + ESP_LOGI(TAG, "found_z_used = %d", found_z_used); + ESP_LOGI(TAG, "z.used = %d", Z->used); + ESP_LOGI(TAG, "hwWords_sz = %d", hwWords_sz); + ESP_LOGI(TAG, "maxWords_sz = %d", maxWords_sz); +#if defined(CONFIG_IDF_TARGET_ESP32) + ESP_LOGI(TAG, "left_pad_offset = %d", left_pad_offset); +#endif + ESP_LOGI(TAG, "hwWords_sz<<2 = %d", hwWords_sz << 2); + esp_show_mp("X", X2); /* show X2 copy, as X may have been clobbered */ + esp_show_mp("Y", Y2); /* show Y2 copy, as Y may have been clobbered */ + esp_show_mp("Peek Z", PEEK); /* this is the Z before start */ + esp_show_mp("Z", Z); /* this is the HW result */ + esp_show_mp("Z2", Z2); /* this is the SW result */ + #ifndef NO_RECOVER_SOFTWARE_CALC + ESP_LOGW(TAG, "Recovering mp_mul error with software result"); + mp_copy(Z2, Z); /* copy (src = Z2) to (dst = Z) */ + #else + ret = MP_VAL; + #endif + } +#endif + +#ifdef WOLFSSL_HW_METRICS + esp_mp_mul_usage_ct++; + esp_mp_max_used = (Z->used > esp_mp_max_used) ? Z->used : esp_mp_max_used; + if (ret != MP_OKAY) { + esp_mp_mul_error_ct++; /* includes fallback */ } #endif + ESP_LOGV(TAG, "\nEnd esp_mp_mul \n"); + return ret; -} +} /* esp_mp_mul() */ +#endif /* Use HW mp_mul: ! NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL*/ -/* Z = X * Y (mod M) */ +#ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD +/* Large Number Modular Multiplication + * + * See 24.3.3 of the ESP32 Technical Reference Manual + * + * Z = X * Y mod M */ int esp_mp_mulmod(MATH_INT_T* X, MATH_INT_T* Y, MATH_INT_T* M, MATH_INT_T* Z) { - int ret = 0; - int negcheck; - word32 Xs; - word32 Ys; - word32 Ms; - word32 maxWords_sz; - word32 hwWords_sz; - word32 zwords; + struct esp_mp_helper mph[1]; /* we'll save some values in this mp helper */ + MATH_INT_T tmpZ[1] = { }; +#ifdef DEBUG_WOLFSSL + MATH_INT_T X2[1] = { }; + MATH_INT_T Y2[1] = { }; + MATH_INT_T M2[1] = { }; + MATH_INT_T Z2[1] = { }; + MATH_INT_T PEEK[1] = { }; + (void) PEEK; +#endif - MATH_INT_T r_inv; - MATH_INT_T tmpZ; - mp_digit mp; - - uint32_t Exponent; -#if CONFIG_IDF_TARGET_ESP32S3 - uint32_t OperandBits; - int WordsForOperand; -# endif + int ret = MP_OKAY; + int mulmod_lock_called = FALSE; + word32 zwords = 0; + +#if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + int negcheck = 0; +#endif - /* neg check - X*Y becomes negative */ - negcheck = mp_isneg(X) != mp_isneg(Y) ? 1 : 0; +#ifdef DEBUG_WOLFSSL + int reti = 0; /* interim return value used only during HW==SW validation */ +#endif - /* ask bits number */ - Xs = mp_count_bits(X); - Ys = mp_count_bits(Y); - Ms = mp_count_bits(M); +#if defined(CONFIG_IDF_TARGET_ESP32) - /* maximum bits and words for writing to HW */ - maxWords_sz = bits2words(max(Xs, max(Ys, Ms))); - zwords = bits2words(min(Ms, Xs + Ys)); - hwWords_sz = words2hwords(maxWords_sz); - - if ((hwWords_sz << 5) > ESP_HW_RSAMAX_BIT) { - ESP_LOGE(TAG, "exceeds HW maximum bits"); - return MP_VAL; /* Error: value is not able to be used. */ - } - /* calculate r_inv = R^2 mode M - * where: R = b^n, and b = 2^32 - * accordingly R^2 = 2^(n*32*2) - */ -#if CONFIG_IDF_TARGET_ESP32S3 - Exponent = maxWords_sz * BITS_IN_ONE_WORD * 2; +#elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + word32 OperandBits; + int WordsForOperand; +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + word32 OperandBits; + int WordsForOperand; #else - Exponent = hwWords_sz << 6; + ret = MP_HW_FALLBACK; #endif - ret = mp_init_multi(&tmpZ, &r_inv, NULL, NULL, NULL, NULL); - if (ret == 0 && (ret = esp_get_rinv(&r_inv, M, Exponent)) != MP_OKAY) { - ESP_LOGE(TAG, "calculate r_inv failed."); - mp_clear(&tmpZ); - mp_clear(&r_inv); + + ESP_LOGV(TAG, "\nBegin esp_mp_mulmod \n"); + + /* do we have an even moduli? */ + if ((M->dp[0] & 1) == 0) { +#ifndef NO_ESP_MP_MUL_EVEN_ALT_CALC + /* Z = X * Y mod M in mixed HW & SW */ + #if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL) + ret = mp_mul(X, Y, tmpZ); /* SW X * Y */ + #else + ret = esp_mp_mul(X, Y, tmpZ); /* HW X * Y */ + #endif + if (ret == MP_OKAY) { + /* z = tmpZ mod M, 0 <= Z < M */ + ret = mp_mod(tmpZ, M, Z); /* SW mod M */ + } + ESP_LOGV(TAG, "alternate mp_mul calc!"); return ret; +#else + #ifdef WOLFSSL_HW_METRICS + esp_mp_mulmod_even_mod_ct++; + #endif + ESP_LOGV(TAG, "esp_mp_mulmod does not support even numbers"); + ret = MP_HW_FALLBACK; /* let the software figure out what to do */ + return ret; +#endif /* NO_ESP_MP_MUL_EVEN_ALTERNATE */ + } /* even moduli check */ + +#ifdef DEBUG_WOLFSSL + /* we're only validating HW when in debug mode */ + if (esp_hw_validation_active()) { + ESP_LOGV(TAG, "MP_HW_VALIDATION_ACTIVE"); + return MP_HW_VALIDATION_ACTIVE; } +#endif - /* lock HW for use */ - if ((ret = esp_mp_hw_lock()) != MP_OKAY) { - mp_clear(&tmpZ); - mp_clear(&r_inv); - return ret; +#ifdef DEBUG_WOLFSSL + if (IS_HW_VALIDATION) { + ESP_LOGE(TAG, "Caller must not try HW when validation active."); } - /* Calculate M' */ - if ((ret = esp_calc_Mdash(M, 32/* bits */, &mp)) != MP_OKAY) { - ESP_LOGE(TAG, "failed to calculate M dash"); - mp_clear(&tmpZ); - mp_clear(&r_inv); - return ret; + else { + /* when validating, save SW in [V]2 for later comparison to HW */ + mp_init(X2); + mp_init(Y2); + mp_init(M2); + mp_init(Z2); + + mp_copy(X, X2); /* copy (src = X) to (dst = X2) */ + mp_copy(Y, Y2); /* copy (src = Y) to (dst = Y2) */ + mp_copy(M, M2); /* copy (src = M) to (dst = M2) */ + mp_copy(Z, Z2); /* copy (src = Z) to (dst = Z2) */ + + SET_HW_VALIDATION; /* for the next mulmod to be SW for HW validation */ + reti = mp_mulmod(X2, Y2, M2, Z2); + if (reti == 0) { + ESP_LOGV(TAG, "wolfSSL mp_mulmod during validation success"); + } + else { + ESP_LOGE(TAG, "wolfSSL mp_mulmod during validation failed"); + } + CLR_HW_VALIDATION; } +#endif /* DEBUG_WOLFSSL */ -#if CONFIG_IDF_TARGET_ESP32S3 - /* Steps to perform large number modular multiplication. Calculates Z = (X x Y) modulo M. - * The number of bits in the operands (X, Y) is N. N can be 32x, where x = {1,2,3,...64}, so the - * maximum number of bits in the X and Y is 2048. We must use the same number of words to represent - * the bits in X, Y and M. - * See 20.3.3 of ESP32-S3 technical manual + if (ret == MP_OKAY) { + + /* neg check: X*Y becomes negative, we'll need adjustment */ + #if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + negcheck = mp_isneg(X) != mp_isneg(Y) ? 1 : 0; + #endif + + /* calculate r_inv = R^2 mod M + * where: R = b^n, and b = 2^32 + * accordingly R^2 = 2^(n*32*2) + */ + ret = esp_mp_montgomery_init(X, Y, M, mph); + if (ret == MP_OKAY) { + ESP_LOGV(TAG, "esp_mp_exptmod esp_mp_montgomery_init success."); + } + else { + #ifdef WOLFSSL_HW_METRICS + if (ret == MP_HW_FALLBACK) { + esp_mp_mulmod_fallback_ct++; + } + else { + esp_mp_mulmod_error_ct++; + } + #endif + return ret; + } + zwords = bits2words(min(mph->Ms, mph->Xs + mph->Ys)); + } + + /* we'll use hardware only for a minimum number of bits */ + if (mph->Xs <= ESP_RSA_MULM_BITS || mph->Ys <= ESP_RSA_MULM_BITS) { + #ifdef WOLFSSL_HW_METRICS + { + esp_mp_mulmod_small_y_ct++; /* track how many times we fall back */ + } + #endif + ret = MP_HW_FALLBACK; + /* TODO add debug metrics */ + #ifdef WOLFSSL_DEBUG_ESP_RSA_MULM_BITS + { + ESP_LOGV(TAG, "esp_mp_mulmod falling back for ESP_RSA_MULM_BITS!"); + } + #endif + } + + /* lock HW for use, enable peripheral clock */ + if (ret == MP_OKAY) { + #ifdef WOLFSSL_HW_METRICS + { + /* Only track max values when using HW */ + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : + esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : + esp_mp_max_used; + esp_mp_max_used = (M->used > esp_mp_max_used) ? M->used : + esp_mp_max_used; + } + #endif + + ret = esp_mp_hw_lock(); + if (ret == ESP_OK) { + mulmod_lock_called = TRUE; /* Don't try to unlock unless locked */ + } + else { + ret = WC_HW_WAIT_E; + } + } + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* Classic ESP32, non-S3 Xtensa */ + + /*Steps to use HW in the following order: + * prep: wait until clean HW engine + * + * 1. Write (N/512bits - 1) to MULT_MODE_REG + * 2. Write X,M(=G, X, P) to memory blocks + * need to write data to each memory block only according to the length + * of the number. + * 3. Write M' to M_PRIME_REG + * 4. Write 1 to MODEXP_START_REG + * 5. Wait for the first round of the operation to be completed. + * Poll RSA_INTERRUPT_REG until it reads 1, + * or until the RSA_INTR interrupt is generated. + * (Or until the INTER interrupt is generated.) + * 6. Write 1 to RSA_INTERRUPT_REG to clear the interrupt. + * 7. Write Yi (i in [0, n) intersect N) to RSA_X_MEM + * Users need to write to the memory block only according to the length + * of the number. Data beyond this length is ignored. + * 8. Write 1 to RSA_MULT_START_REG + * 9. Wait for the second operation to be completed. + * Poll INTERRUPT_REG until it reads 1. + * 10. Read the Zi (i in [0, n) intersect N) from RSA_Z_MEM + * 11. Write 1 to RSA_INTERUPT_REG to clear the interrupt. + * + * post: Release the HW engine + * + * After the operation, the RSA_MULT_MODE_REG register, and memory blocks + * RSA_M_MEM and RSA_M_PRIME_REG remain unchanged. Users do not need to + * refresh these registers or memory blocks if the values remain the same. + */ + + if (ret == MP_OKAY) { + /* Prep wait for the engine */ + ret = esp_mp_hw_wait_clean(); + } + + if (ret == MP_OKAY) { + /* step.1 + * Write (N/512bits - 1) to MULT_MODE_REG + * 512 bits => 16 words */ + DPORT_REG_WRITE(RSA_MULT_MODE_REG, (mph->hwWords_sz >> 4) - 1); +#if defined(DEBUG_WOLFSSL) + ESP_LOGV(TAG, "RSA_MULT_MODE_REG = %d", (mph->hwWords_sz >> 4) - 1); +#endif /* WOLFSSL_DEBUG */ + + /* step.2 write X, M, and r_inv into memory. + * The capacity of each memory block is 128 words. + * The memory blocks use the little endian format for storage, i.e. + * the least significant digit of each number is in lowest address.*/ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, mph->Xs, mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, + M, mph->Ms, mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE, + &(mph->r_inv), mph->Rs, mph->hwWords_sz); + + /* step.3 write M' into memory */ + /* confirmed that mp2 does not support even modulus. + * indeed we see a failure, but we can predict when modules is odd + * or when mp != mp2[0] */ + DPORT_REG_WRITE(RSA_M_DASH_REG, mph->mp); + ESP_EM__3_16; + + /* step.4 start process */ + process_start(RSA_MULT_START_REG); + + /* step.5,6 wait until done */ + wait_until_done(RSA_INTERRUPT_REG); + + /* step.7 Y to MEM_X */ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + Y, mph->Ys, + mph->hwWords_sz); + +#ifdef DEBUG_WOLFSSL + /* save value to peek at the result stored in RSA_MEM_Z_BLOCK_BASE */ + esp_memblock_to_mpint(RSA_MEM_X_BLOCK_BASE, + PEEK, + 128); + esp_clean_result(PEEK, 0); +#endif /* DEBUG_WOLFSSL */ + + /* step.8 start process */ + process_start(RSA_MULT_START_REG); + + /* step.9,11 wait until done */ + wait_until_done(RSA_INTERRUPT_REG); + + /* step.12 read the result from MEM_Z */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, tmpZ, zwords); + } /* step 1 .. 12 */ + + /* step.13 clear and release HW */ + if (mulmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called"); + } + /* end of ESP32 */ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* Steps to perform large number modular multiplication. + * Calculates Z = (X * Y) modulo M. + * The number of bits in the operands (X, Y) is N. N can be 32x, where + * x = {1,2,3,...64}, so the maximum number of bits in the X and Y is 2048. + * We must use the same number of words to represent bits in X, Y and M. + * See 20.3.3 of ESP32-C3 technical manual * 1. Wait until the hardware is ready. - * 2. Enable/disable interrupt that signals completion -- we don't use the interrupt. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. * 3. Write the number of words required to represent the operands to the * RSA_MODE_REG (now called RSA_LENGTH_REG). * 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG). * 5. Load X, Y, M, r' operands to memory blocks. - * 6. Start the operation by writing 1 to RSA_MOD_MULT_START_REG, then wait for it - * to complete by monitoring RSA_IDLE_REG (which is now called RSA_QUERY_INTERRUPT_REG). + * 6. Start the operation by writing 1 to RSA_MOD_MULT_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). * 7. Read the result out. * 8. Release the hardware lock so others can use it. * x. Clear the interrupt flag, if you used it (we don't). */ /* 1. Wait until hardware is ready. */ - if ((ret = esp_mp_hw_wait_clean()) != MP_OKAY) { - return ret; + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); } - /* 2. Disable completion interrupt signal; we don't use. - ** 0 => no interrupt; 1 => interrupt on completion. */ - DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); - - /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ - OperandBits = max(max(Xs, Ys), Ms); - if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { - ESP_LOGW(TAG, "result exceeds max bit length"); - return MP_VAL; /* Error: value is not able to be used. */ - } - WordsForOperand = bits2words(OperandBits); - DPORT_REG_WRITE(RSA_LENGTH_REG, WordsForOperand - 1); - - /* 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG) */ - DPORT_REG_WRITE(RSA_M_DASH_REG, mp); - - /* Select acceleration options. */ - DPORT_REG_WRITE(RSA_CONSTANT_TIME_REG, 0); - - /* 5. Load X, Y, M, r' operands. - * Note RSA_MEM_RB_BLOCK_BASE == RSA_MEM_Z_BLOC_BASE on ESP32s3*/ - esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, X, Xs, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, Y, Ys, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, M, Ms, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_RB_BLOCK_BASE, &r_inv, mp_count_bits(&r_inv), hwWords_sz); - - /* 6. Start operation and wait until it completes. */ - process_start(RSA_MOD_MULT_START_REG); - ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); - if (MP_OKAY != ret) { - return ret; + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); + + /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ + OperandBits = max(max(mph->Xs, mph->Ys), mph->Ms); + if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "result exceeds max bit length"); + return MP_VAL; /* Error: value is not able to be used. */ + } + WordsForOperand = bits2words(OperandBits); + /* alt inline calc: + * DPORT_REG_WRITE(RSA_MULT_MODE_REG, (mph->hwWords_sz >> 4) - 1); */ + DPORT_REG_WRITE(RSA_LENGTH_REG, WordsForOperand - 1); + + /* 4. Write M' value into RSA_M_PRIME_REG + * (now called RSA_M_DASH_REG) */ + DPORT_REG_WRITE(RSA_M_DASH_REG, mph->mp); + + /* Select acceleration options. */ + DPORT_REG_WRITE(RSA_CONSTANT_TIME_REG, 0); + + /* 5. Load X, Y, M, r' operands. + * Note RSA_MEM_RB_BLOCK_BASE == RSA_MEM_Z_BLOC_BASE on ESP32s3*/ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + mph->Xs, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, + Y, + mph->Ys, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, + M, + mph->Ms, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_RB_BLOCK_BASE, + &(mph->r_inv), + mph->Rs, + mph->hwWords_sz); + + /* 6. Start operation and wait until it completes. */ + process_start(RSA_MOD_MULT_START_REG); /* esp_mp_mulmod */ + } + + if (ret == MP_OKAY) { + ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); + } + + if (ret == MP_OKAY) { + /* 7. read the result from MEM_Z */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, tmpZ, zwords); } - /* 7. read the result form MEM_Z */ - esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, &tmpZ, zwords); + /* 8. clear and release HW */ + if (mulmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called, esp_mp_hw_unlock skipped"); + } + /* end if CONFIG_IDF_TARGET_ESP32C3 */ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* Steps to perform large number modular multiplication. + * Calculates Z = (X * Y) modulo M. + * The number of bits in the operands (X, Y) is N. N can be 32x,where + * x = {1,2,3,...64}, so the maximum number of bits in X and Y is 2048. + * We must use the same number of words to represent the bits X, Y and M. + * See 20.3.3 of ESP32-S3 technical manual + * 1. Wait until the hardware is ready. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write the number of words required to represent the operands to the + * RSA_MODE_REG (now called RSA_LENGTH_REG). + * 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG). + * 5. Load X, Y, M, r' operands to memory blocks. + * 6. Start the operation by writing 1 to RSA_MOD_MULT_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). + * 7. Read the result out. + * 8. Release the hardware lock so others can use it. + * x. Clear the interrupt flag, if you used it (we don't). */ + + /* 1. Wait until hardware is ready for esp_mp_mulmod. */ + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + } + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INT_ENA_REG, 0); + + /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ + OperandBits = max(max(mph->Xs, mph->Ys), mph->Ms); + if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "result exceeds max bit length"); + return MP_VAL; /* Error: value is not able to be used. */ + } + WordsForOperand = bits2words(OperandBits); + /* alt inline calc: + * DPORT_REG_WRITE(RSA_MULT_MODE_REG, (mph->hwWords_sz >> 4) - 1); */ + DPORT_REG_WRITE(RSA_MODE_REG, WordsForOperand - 1); + + /* 4. Write M' value into RSA_M_PRIME_REG + * (now called RSA_M_DASH_REG) */ + DPORT_REG_WRITE(RSA_M_PRIME_REG, mph->mp); + + /* Select acceleration options. */ + DPORT_REG_WRITE(RSA_CONSTANT_TIME_REG, 0); + DPORT_REG_WRITE(RSA_SEARCH_POS_REG, 0); /* or RSA_SEARCH_ENABLE */ + + /* 5. Load X, Y, M, r' operands. + * Note RSA_MEM_RB_BLOCK_BASE == RSA_M_MEM on ESP32-C6*/ + esp_mpint_to_memblock(RSA_X_MEM, + X, + mph->Xs, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_Y_MEM, + Y, + mph->Ys, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_M_MEM, + M, + mph->Ms, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_Z_MEM, + &(mph->r_inv), + mph->Rs, + mph->hwWords_sz); + + /* 6. Start operation and wait until it completes. */ + process_start(RSA_SET_START_MODMULT_REG); /* reminder: esp_mp_mulmod */ + } + + /* 5. Wait for the completion of computation, which happens when the + * content of RSA_QUERY_IDLE becomes 1 or the RSA interrupt occurs. */ + if (ret == MP_OKAY) { + ret = wait_until_done(RSA_QUERY_IDLE_REG); + } + if (ret == MP_OKAY) { + /* 7. read the result from MEM_Z */ + esp_memblock_to_mpint(RSA_Z_MEM, tmpZ, zwords); + } /* 8. clear and release HW */ - esp_mp_hw_unlock(); + if (mulmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called, esp_mp_hw_unlock skipped"); + } - if (negcheck) { - mp_sub(M, &tmpZ, &tmpZ); + /* end if CONFIG_IDF_TARGET_ESP32C3 or CONFIG_IDF_TARGET_ESP32C6 */ +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + /* Steps to perform large number modular multiplication. + * Calculates Z = (X * Y) modulo M. + * The number of bits in the operands (X, Y) is N. N can be 32x, where + * x = {1,2,3,...64}, so the maximum number of bits in the X and Y is 2048. + * We must use the same number of words to represent bits in X, Y and M. + * See 20.3.3 of ESP32-S3 technical manual. + * 1. Wait until the hardware is ready. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write the number of words required to represent the operands to the + * RSA_MODE_REG (now called RSA_LENGTH_REG). + * 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG). + * 5. Load X, Y, M, r' operands to memory blocks. + * 6. Start the operation by writing 1 to RSA_MOD_MULT_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). + * 7. Read the result out. + * 8. Release the hardware lock so others can use it. + * x. Clear the interrupt flag, if you used it (we don't). */ + + /* 1. Wait until hardware is ready. */ + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); } - mp_copy(&tmpZ, Z); - mp_clear(&tmpZ); - mp_clear(&r_inv); + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); + + /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ + OperandBits = max(max(mph->Xs, mph->Ys), mph->Ms); + if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "result exceeds max bit length"); + return MP_VAL; /* Error: value is not able to be used. */ + } + WordsForOperand = bits2words(OperandBits); + /* alt inline calc: + * DPORT_REG_WRITE(RSA_MULT_MODE_REG, (mph->hwWords_sz >> 4) - 1); */ + DPORT_REG_WRITE(RSA_LENGTH_REG, WordsForOperand - 1); + + /* 4. Write M' value into RSA_M_PRIME_REG + * (now called RSA_M_DASH_REG) */ + DPORT_REG_WRITE(RSA_M_DASH_REG, mph->mp); + + /* Select acceleration options. */ + DPORT_REG_WRITE(RSA_CONSTANT_TIME_REG, 0); + + /* 5. Load X, Y, M, r' operands. + * Note RSA_MEM_RB_BLOCK_BASE == RSA_MEM_Z_BLOC_BASE on ESP32s3*/ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + mph->Xs, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, + Y, + mph->Ys, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, + M, + mph->Ms, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_RB_BLOCK_BASE, + &(mph->r_inv), + mph->Rs, + mph->hwWords_sz); + + /* 6. Start operation and wait until it completes. */ + process_start(RSA_MOD_MULT_START_REG); /* Reminder: esp_mp_mulmod() */ + asm volatile("memw"); + asm volatile("nop"); + asm volatile("nop"); + asm volatile("nop"); + asm volatile("nop"); + asm volatile("nop"); + asm volatile("nop"); + } + + if (ret == MP_OKAY) { + ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); + } + + if (ret == MP_OKAY) { + /* 7. read the result from MEM_Z */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, tmpZ, zwords); + } + + /* 8. clear and release HW */ + if (mulmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + if (ret == MP_HW_FALLBACK) { + ESP_LOGV(TAG, "Lock not called due to no-lock MP_HW_FALLBACK"); + } + else { + ESP_LOGW(TAG, "Lock unexpectedly not called"); + } + } - return ret; /* end if CONFIG_IDF_TARGET_ESP32S3 */ #else - /* non-S3 Xtensa */ + /* for all non-supported chipsets, fall back to SW calcs */ + ret = MP_HW_FALLBACK; +#endif - /*Steps to use HW in the following order: - * 1. wait until clean HW engine - * 2. Write(N/512bits - 1) to MULT_MODE_REG - * 3. Write X,M(=G, X, P) to memory blocks - * need to write data to each memory block only according to the length - * of the number. - * 4. Write M' to M_PRIME_REG - * 5. Write 1 to MODEXP_START_REG - * 6. Wait for the first operation to be done. Poll INTERRUPT_REG until it reads 1. - * (Or until the INTER interrupt is generated.) - * 7. Write 1 to RSA_INTERRUPT_REG to clear the interrupt. - * 8. Write Y to RSA_X_MEM - * 9. Write 1 to RSA_MULT_START_REG - * 10. Wait for the second operation to be completed. Poll INTERRUPT_REG until it reads 1. - * 11. Read the Z from RSA_Z_MEM - * 12. Write 1 to RSA_INTERUPT_REG to clear the interrupt. - * 13. Release the HW engine - */ + if (ret == MP_OKAY) { + /* additional steps */ + /* this is needed for known issue when Z is greater than M */ + if (mp_cmp(tmpZ, M) == MP_GT) { + /* Z -= M */ + mp_sub(tmpZ, M, tmpZ); + ESP_LOGV(TAG, "Z is greater than M"); + } + #if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + if (negcheck) { + mp_sub(M, tmpZ, tmpZ); + ESP_LOGV(TAG, "neg check adjustment"); + } + #endif + mp_copy(tmpZ, Z); /* copy tmpZ to result Z */ - if ( (ret = esp_mp_hw_wait_clean()) != MP_OKAY ) { - return ret; + esp_clean_result(Z, 0); } - /* step.1 512 bits => 16 words */ - DPORT_REG_WRITE(RSA_MULT_MODE_REG, (hwWords_sz >> 4) - 1); - - /* step.2 write X, M and r_inv into memory */ - esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, X, Xs, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, M, Ms, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE, - &r_inv, - mp_count_bits(&r_inv), - hwWords_sz); - - /* step.3 write M' into memory */ - DPORT_REG_WRITE(RSA_M_DASH_REG, mp); - - /* step.4 start process */ - process_start(RSA_MULT_START_REG); - - /* step.5,6 wait until done */ - wait_until_done(RSA_INTERRUPT_REG); - /* step.7 Y to MEM_X */ - esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, Y, Ys, hwWords_sz); - /* step.8 start process */ - process_start(RSA_MULT_START_REG); +#ifdef WOLFSSL_HW_METRICS + esp_mp_mulmod_usage_ct++; + if (ret == MP_HW_FALLBACK) { + ESP_LOGV(TAG, "esp_mp_mulmod HW Fallback tick"); + esp_mp_mulmod_fallback_ct++; + } +#endif - /* step.9,11 wait until done */ - wait_until_done(RSA_INTERRUPT_REG); +#ifdef DEBUG_WOLFSSL + if (ret == MP_HW_FALLBACK) { + ESP_LOGI(TAG, "HW Fallback"); + } + else { + if (mp_cmp(X, X2) != 0) { + ESP_LOGV(TAG, "mp_mul X vs X2 mismatch!"); + } + if (mp_cmp(Y, Y2) != 0) { + ESP_LOGV(TAG, "mp_mul Y vs Y2 mismatch!"); + } - /* step.12 read the result from MEM_Z */ - esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, &tmpZ, zwords); + if (mp_cmp(Z, Z2) != 0) { + ESP_LOGE(TAG, "esp_mp_mulmod Z vs Z2 mismatch!"); - /* step.13 clear and release HW */ - esp_mp_hw_unlock(); + esp_mp_mulmod_error_ct++; + int found_z_used = Z->used; - /* additional steps */ - /* this needs for known issue when Z is greater than M */ - if (mp_cmp(&tmpZ, M) == MP_GT) { - /* Z -= M */ - mp_sub(&tmpZ, M, &tmpZ); - } - if (negcheck) { - mp_sub(M, &tmpZ, &tmpZ); + ESP_LOGI(TAG, "Xs = %d", mph->Xs); + ESP_LOGI(TAG, "Ys = %d", mph->Ys); + ESP_LOGI(TAG, "found_z_used = %d", found_z_used); + ESP_LOGI(TAG, "z.used = %d", Z->used); + ESP_LOGI(TAG, "hwWords_sz = %d", mph->hwWords_sz); + ESP_LOGI(TAG, "maxWords_sz = %d", mph->maxWords_sz); + ESP_LOGI(TAG, "hwWords_sz<<2 = %d", mph->hwWords_sz << 2); + + /* parameters may have been collbered; Show cpied values */ + esp_show_mp("X", X2); + esp_show_mp("Y", Y2); + esp_show_mp("M", M2); + + ESP_LOGI(TAG, "Xs = %d", mph->Xs); + ESP_LOGI(TAG, "Ys = %d", mph->Ys); + ESP_LOGI(TAG, "found_z_used = %d", found_z_used); + ESP_LOGI(TAG, "z.used = %d", Z->used); + ESP_LOGI(TAG, "hwWords_sz = %d", mph->hwWords_sz); + ESP_LOGI(TAG, "maxWords_sz = %d", mph->maxWords_sz); + ESP_LOGI(TAG, "hwWords_sz<<2 = %d", mph->hwWords_sz << 2); + esp_show_mp("X", X2); /* X2 copy, as X may have been clobbered */ + esp_show_mp("Y", Y2); /* Y2 copy, as Y may have been clobbered */ + esp_show_mp("M", M2); /* M2 copy, as M may have been clobbered */ + esp_show_mp("r_inv", &(mph->r_inv)); /*show r_inv */ + ESP_LOGI(TAG, "mp = 0x%08x = %u", mph->mp, mph->mp); + + if (mph->mp == mph->mp2) { + ESP_LOGI(TAG, "M' match esp_calc_Mdash vs mp_montgomery_setup" + " = %d !", mph->mp); + } + else { + ESP_LOGW(TAG, + "\n\n" + "M' MISMATCH esp_calc_Mdash = 0x%08x = %d \n" + "vs mp_montgomery_setup = 0x%08x = %d \n\n", + mph->mp, + mph->mp, + mph->mp2, + mph->mp2); + mph->mp = mph->mp2; + } + + + esp_show_mp("HW Z", Z); /* this is the HW result */ + esp_show_mp("SW Z2", Z2); /* this is the SW result */ + ESP_LOGI(TAG, "esp_mp_mulmod_usage_ct = %lu tries", + esp_mp_mulmod_usage_ct); + ESP_LOGI(TAG, "esp_mp_mulmod_error_ct = %lu failures", + esp_mp_mulmod_error_ct); + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); + esp_show_mp("HW Z", Z); /* this is the HW result */ + esp_show_mp("SW Z2", Z2); /* this is the SW result */ + ESP_LOGI(TAG, "esp_mp_mulmod_usage_ct = %lu tries", + esp_mp_mulmod_usage_ct); + ESP_LOGI(TAG, "esp_mp_mulmod_error_ct = %lu failures", + esp_mp_mulmod_error_ct); + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); + + + #ifndef NO_RECOVER_SOFTWARE_CALC + { + ESP_LOGW(TAG, "Recovering mp_mul error with software result"); + mp_copy(Z2, Z); /* copy (src = Z2) to (dst = Z) */ + } + #else + { + /* If we are not recovering, then we have an error. */ + ret = MP_VAL; + } + #endif + } + else { + ESP_LOGV(TAG, "esp_mp_mulmod success!"); + } } - mp_copy(&tmpZ, Z); +#endif /* DEBUG_WOLFSSL */ - mp_clear(&tmpZ); - mp_clear(&r_inv); + /* cleanup and exit */ + mp_clear(tmpZ); + mp_clear(&(mph->r_inv)); + + ESP_LOGV(TAG, "\nEnd esp_mp_mulmod \n"); + if (ret == MP_OKAY || ret == MP_HW_FALLBACK) { + ESP_LOGV(TAG, "esp_mp_mulmod exit success "); + } + else { + ESP_LOGW(TAG, "esp_mp_mulmod exit failed = %d", ret); + } - return ret; +#ifdef WOLFSSL_HW_METRICS + /* calculate max used after any cleanup */ + esp_mp_max_used = (Z->used > esp_mp_max_used) ? Z->used : esp_mp_max_used; #endif -} + return ret; +} /* esp_mp_mulmod */ +#endif /* Use HW mulmod: ! NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + +#ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD /* Large Number Modular Exponentiation * * Z = X^Y mod M * - * See: - * ESP32, Chapter 24, https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf - * ESP32s3, section 20.3.1, https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf + * ESP32, Section 24.3.2 https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf + * ESP32S3, Section 20.3.1, https://www.espressif.com/sites/default/files/documentation/esp32-s3_technical_reference_manual_en.pdf + * * The operation is based on Montgomery multiplication. Aside from the - * arguments X, Y , and M, two additional ones are needed —r and M′ + * arguments X, Y , and M, two additional ones are needed -r and M' .* These arguments are calculated in advance by software. .* -.* The RSA Accelerator supports operand lengths of N ∈ {512, 1024, 1536, 2048, -.* 2560, 3072, 3584, 4096} bits on the ESP32 and N ∈ [32, 4096] bits on the ESP32s3. -.* The bit length of arguments Z, X, Y , M, and r can be any one from the N set, -.* but all numbers in a calculation must be of the same length. -.* The bit length of M′ is always 32. +.* The RSA Accelerator supports operand lengths of N in {512, 1024, 1536, 2048, +.* 2560, 3072, 3584, 4096} bits on the ESP32 and N in [32, 4096] bits + * on the ESP32s3. +.* The bit length of arguments Z, X, Y , M, and r can be any one from + * the N set, but all numbers in a calculation must be of the same length. +.* The bit length of M' is always 32. .* -.* Note some DH references may use: Y = (G ^ X) mod P - */ -int esp_mp_exptmod(MATH_INT_T* X, MATH_INT_T* Y, word32 Ys, MATH_INT_T* M, MATH_INT_T* Z) + * Z = (X ^ Y) mod M : Espressif generic notation + * Y = (G ^ X) mod P : wolfSSL DH reference notation */ +int esp_mp_exptmod(MATH_INT_T* X, MATH_INT_T* Y, MATH_INT_T* M, MATH_INT_T* Z) { - int ret = 0; + /* Danger! Do not initialize any function parameters, not even the result Z. + * Some operations such as (rnd = rnd^e) will wipe out the rnd operand + * value upon initialization. + * (e.g. the address of X and Z could be the same when called) */ + struct esp_mp_helper mph[1]; /* we'll save some mp helper data here */ + int ret = MP_OKAY; + int exptmod_lock_called = FALSE; + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* different calc */ +#elif defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) + word32 OperandBits; + word32 WordsForOperand; +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + word32 OperandBits; + word32 WordsForOperand; +#else + /* no HW */ +#endif - word32 Xs; - word32 Ms; - word32 maxWords_sz; - word32 hwWords_sz; + ESP_LOGV(TAG, "\nBegin esp_mp_exptmod \n"); +#ifdef WOLFSSL_HW_METRICS + esp_mp_exptmod_usage_ct++; + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : esp_mp_max_used; + esp_mp_max_used = (M->used > esp_mp_max_used) ? M->used : esp_mp_max_used; +#endif - MATH_INT_T r_inv; - mp_digit mp; + if (mp_iszero(M)) { +#ifdef DEBUG_WOLFSSL + ESP_LOGI(TAG, "esp_mp_exptmod M is zero!"); +#endif +#ifdef WOLFSSL_HW_METRICS + esp_mp_exptmod_fallback_ct++; +#endif + return MP_HW_FALLBACK; /* fall back and let SW decide how to handle */ + } -#if CONFIG_IDF_TARGET_ESP32S3 - uint32_t OperandBits; - uint32_t WordsForOperand; + if (mp_isone(M)) { +#ifdef DEBUG_WOLFSSL + ESP_LOGI(TAG, "esp_mp_exptmod M is one!"); #endif + mp_clear(Z); + return MP_OKAY; /* mod zero is zero */ + } - /* ask bits number */ - Xs = mp_count_bits(X); - Ms = mp_count_bits(M); - /* maximum bits and words for writing to HW */ - maxWords_sz = bits2words(max(Xs, max(Ys, Ms))); - hwWords_sz = words2hwords(maxWords_sz); - - if ((hwWords_sz << 5) > ESP_HW_RSAMAX_BIT) { - ESP_LOGE(TAG, "exceeds HW maximum bits"); - return MP_VAL; /* Error: value is not able to be used. */ + ret = esp_mp_montgomery_init(X, Y, M, mph); + + if (ret == MP_OKAY) { + ESP_LOGV(TAG, "esp_mp_exptmod esp_mp_montgomery_init success."); } - /* calculate r_inv = R^2 mode M - * where: R = b^n, and b = 2^32 - * accordingly R^2 = 2^(n*32*2) - */ - ret = mp_init(&r_inv); - if ( (ret == 0) && - ((ret = esp_get_rinv(&r_inv, M, (hwWords_sz << 6))) != MP_OKAY) ) { - ESP_LOGE(TAG, "calculate r_inv failed."); - mp_clear(&r_inv); + else { +#ifdef WOLFSSL_HW_METRICS + if (ret == MP_HW_FALLBACK) { + esp_mp_exptmod_fallback_ct++; + } + else { + esp_mp_exptmod_error_ct++; + } +#endif return ret; } + +#ifdef DEBUG_WOLFSSL + if (esp_hw_validation_active()) { + /* recall there's only one HW for all math accelerations */ + return MP_HW_VALIDATION_ACTIVE; + } + + if (esp_mp_exptmod_depth_counter != 0) { + ESP_LOGE(TAG, "esp_mp_exptmod Depth Counter Error!"); + } + esp_mp_exptmod_depth_counter++; +#endif + + /* + max bits = 0x400 = 1024 bits +1024 / 8 = 128 bytes + 128 / 4 = 32 words (0x20) + */ + /* lock and init the HW */ - if ( (ret = esp_mp_hw_lock()) != MP_OKAY ) { - mp_clear(&r_inv); - return ret; + if (ret == MP_OKAY) { + exptmod_lock_called = TRUE; /* Don't try to unlock unless we locked */ + #ifdef WOLFSSL_HW_METRICS + { + /* Only track max values when using HW */ + esp_mp_max_used = (X->used > esp_mp_max_used) ? X->used : + esp_mp_max_used; + esp_mp_max_used = (Y->used > esp_mp_max_used) ? Y->used : + esp_mp_max_used; + } + #endif + + ret = esp_mp_hw_lock(); + if (ret != MP_OKAY) { + ESP_LOGE(TAG, "esp_mp_hw_lock failed"); + #ifdef DEBUG_WOLFSSL + esp_mp_exptmod_depth_counter--; + #endif + } + } /* the only thing we expect is success or busy */ + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* non-ESP32S3 Xtensa (regular ESP32) */ + + /* Steps to use HW in the following order: + * 1. Write(N/512bits - 1) to MODEXP_MODE_REG + * 2. Write X, Y, M and r_inv to memory blocks + * need to write data to each memory block only according to the length + * of the number. + * 3. Write M' to M_PRIME_REG + * 4. Write 1 to MODEXP_START_REG + * 5. Wait for the operation to be done. Poll INTERRUPT_REG until it reads 1. + * (Or until the INTER interrupt is generated.) + * 6. Read the result Z(=Y) from Z_MEM + * 7. Write 1 to INTERRUPT_REG to clear the interrupt. + */ + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + #ifdef WOLFSSL_HW_METRICS + if (ret != MP_OKAY) { + esp_mp_exptmod_error_ct++; + } + #endif } - /* calc M' */ - /* if Pm is odd, uses mp_montgomery_setup() */ - if ( (ret = esp_calc_Mdash(M, 32/* bits */, &mp)) != MP_OKAY ) { - ESP_LOGE(TAG, "failed to calculate M dash"); - mp_clear(&r_inv); - return ret; + + if (ret == MP_OKAY) { + /* step.1 */ + ESP_LOGV(TAG, + "hwWords_sz = %d, num = %d", + mph->hwWords_sz, + (mph->hwWords_sz >> 4) - 1 + ); + + DPORT_REG_WRITE(RSA_MODEXP_MODE_REG, (mph->hwWords_sz >> 4) - 1); + /* step.2 write G, X, P, r_inv and M' into memory */ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + mph->Xs, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, + Y, mph->Ys, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, + M, + mph->Ms, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE, + &(mph->r_inv), + mph->Rs, + mph->hwWords_sz); + + /* step.3 write M' into memory */ + ESP_LOGV(TAG, "M' = %d", mph->mp); + DPORT_REG_WRITE(RSA_M_DASH_REG, mph->mp); + ESP_EM__3_16; + + /* step.4 start process */ + process_start(RSA_MODEXP_START_REG); /* was RSA_START_MODEXP_REG; + * RSA_MODEXP_START_REG in docs? */ + + /* step.5 wait until done */ + wait_until_done(RSA_INTERRUPT_REG); + /* step.6 read a result form memory */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, BITS_TO_WORDS(mph->Ms)); + } + + /* step.7 clear and release expt_mod HW */ + if (exptmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called"); } -#if CONFIG_IDF_TARGET_ESP32S3 - /* Steps to perform large number modular exponentiation. Calculates Z = (X ^ Y) modulo M. - * The number of bits in the operands (X, Y) is N. N can be 32x, where x = {1,2,3,...64}, so the - * maximum number of bits in the X and Y is 2048. +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + /* Steps to perform large number modular exponentiation. + * Calculates Z = (X ^ Y) modulo M. + * The number of bits in the operands (X, Y) is N. N can be 32x, + * where x = {1,2,3,...64}; maximum number of bits in the X and Y is 2048. * See 20.3.3 of ESP32-S3 technical manual * 1. Wait until the hardware is ready. - * 2. Enable/disable interrupt that signals completion -- we don't use the interrupt. - * 3. Write (N_bits/32 - 1) to the RSA_MODE_REG (now called RSA_LENGTH_REG). + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write (N_bits/32 - 1) to the RSA_MODE_REG + * (now called RSA_LENGTH_REG). * Here N_bits is the maximum number of bits in X, Y and M. * 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG). * 5. Load X, Y, M, r' operands to memory blocks. - * 6. Start the operation by writing 1 to RSA_MODEXP_START_REG, then wait for it - * to complete by monitoring RSA_IDLE_REG (which is now called RSA_QUERY_INTERRUPT_REG). + * 6. Start the operation by writing 1 to RSA_MODEXP_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). * 7. Read the result out. * 8. Release the hardware lock so others can use it. * x. Clear the interrupt flag, if you used it (we don't). */ /* 1. Wait until hardware is ready. */ - if ((ret = esp_mp_hw_wait_clean()) != MP_OKAY) { - return ret; + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); } - /* 2. Disable completion interrupt signal; we don't use. - ** 0 => no interrupt; 1 => interrupt on completion. */ - DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); - - /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ - OperandBits = max(max(Xs, Ys), Ms); - if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { - ESP_LOGW(TAG, "result exceeds max bit length"); - return MP_VAL; /* Error: value is not able to be used. */ - } - WordsForOperand = bits2words(OperandBits); - DPORT_REG_WRITE(RSA_LENGTH_REG, WordsForOperand - 1); - - /* 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG) */ - DPORT_REG_WRITE(RSA_M_DASH_REG, mp); - - /* 5. Load X, Y, M, r' operands. */ - esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, X, Xs, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, Y, Ys, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, M, Ms, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE, &r_inv, - mp_count_bits(&r_inv), hwWords_sz); - - /* 6. Start operation and wait until it completes. */ - process_start(RSA_MODEXP_START_REG); - ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); - if (MP_OKAY != ret) { - return ret; + if (ret == MP_OKAY) { + OperandBits = max(max(mph->Xs, mph->Ys), mph->Ms); + if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "result exceeds max bit length"); + ret = MP_VAL; /* Error: value is not able to be used. */ + } + else { + WordsForOperand = bits2words(OperandBits); + } } - /* 7. read the result form MEM_Z */ - esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, BITS_TO_WORDS(Ms)); + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); + + /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ + DPORT_REG_WRITE(RSA_LENGTH_REG, WordsForOperand - 1); + + /* 4. Write M' value into RSA_M_PRIME_REG + * (now called RSA_M_DASH_REG) */ + DPORT_REG_WRITE(RSA_M_DASH_REG, mph->mp); + + /* 5. Load X, Y, M, r' operands. */ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + mph->Xs, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, + Y, + mph->Ys, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, + M, + mph->Ms, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE, + &(mph->r_inv), + mph->Rs, + mph->hwWords_sz); + + /* 6. Start operation and wait until it completes. */ + process_start(RSA_MODEXP_START_REG); + ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); + } + + if (MP_OKAY == ret) { + /* 7. read the result form MEM_Z */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, BITS_TO_WORDS(mph->Ms)); + } /* 8. clear and release HW */ - esp_mp_hw_unlock(); + if (exptmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called"); + } + /* end if CONFIG_IDF_TARGET_ESP32C3 */ - mp_clear(&r_inv); +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + /* Steps to perform large number modular exponentiation. + * Calculates Z = (X ^ Y) modulo M. + * The number of bits in the operands (X, Y) is N. N can be 32x, + * where x = {1,2,3,...64}; maximum number of bits in the X and Y is 2048. + * See 20.3.3 of ESP32-S3 technical manual + * 1. Wait until the hardware is ready. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write (N_bits/32 - 1) to the RSA_MODE_REG + * (now called RSA_LENGTH_REG). + * Here N_bits is the maximum number of bits in X, Y and M. + * 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG). + * 5. Load X, Y, M, r' operands to memory blocks. + * 6. Start the operation by writing 1 to RSA_MODEXP_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). + * 7. Read the result out. + * 8. Release the hardware lock so others can use it. + * x. Clear the interrupt flag, if you used it (we don't). */ + + /* 1. Wait until hardware is ready. */ + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + } + + if (ret == MP_OKAY) { + OperandBits = max(max(mph->Xs, mph->Ys), mph->Ms); + if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "result exceeds max bit length"); + ret = MP_VAL; /* Error: value is not able to be used. */ + } + else { + WordsForOperand = bits2words(OperandBits); + } + } + + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INT_ENA_REG, 0); + + /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ + DPORT_REG_WRITE(RSA_MODE_REG, WordsForOperand - 1); + + /* 4. Write M' value into RSA_M_PRIME_REG */ + DPORT_REG_WRITE(RSA_M_PRIME_REG, mph->mp); + + /* 5. Load X, Y, M, r' operands. */ + esp_mpint_to_memblock(RSA_X_MEM, + X, + mph->Xs, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_Y_MEM, + Y, + mph->Ys, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_M_MEM, + M, + mph->Ms, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_Z_MEM, + &(mph->r_inv), + mph->Rs, + mph->hwWords_sz); + + /* 6. Start operation and wait until it completes. */ + /* Write 1 to the RSA_SET_START_MODEXP field of the + * RSA_SET_START_MODEXP_REG register to start computation.*/ + process_start(RSA_SET_START_MODEXP_REG); + ret = wait_until_done(RSA_QUERY_IDLE_REG); + } + + if (MP_OKAY == ret) { + /* 7. read the result form MEM_Z */ + esp_memblock_to_mpint(RSA_Z_MEM, Z, BITS_TO_WORDS(mph->Ms)); + } + + /* 8. clear and release HW */ + if (exptmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called"); + } + /* end if CONFIG_IDF_TARGET_ESP32C6 */ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + /* Steps to perform large number modular exponentiation. + * Calculates Z = (X ^ Y) modulo M. + * The number of bits in the operands (X, Y) is N. N can be 32x, + * where x = {1,2,3,...64}; the maximum number of bits in X and Y is 2048. + * See 20.3.3 of ESP32-S3 technical manual: + * 1. Wait until the hardware is ready. + * 2. Enable/disable interrupt that signals completion + * -- we don't use the interrupt. + * 3. Write (N_bits/32 - 1) to the RSA_MODE_REG + * (now called RSA_LENGTH_REG). + * Here N_bits is the maximum number of bits in X, Y and M. + * 4. Write M' value into RSA_M_PRIME_REG (now called RSA_M_DASH_REG). + * 5. Load X, Y, M, r' operands to memory blocks. + * 6. Start the operation by writing 1 to RSA_MODEXP_START_REG, + * then wait for it to complete by monitoring RSA_IDLE_REG + * (which is now called RSA_QUERY_INTERRUPT_REG). + * 7. Read the result out. + * 8. Release the hardware lock so others can use it. + * x. Clear the interrupt flag, if you used it (we don't). */ + + /* 1. Wait until hardware is ready. */ + if (ret == MP_OKAY) { + ret = esp_mp_hw_wait_clean(); + } + + if (ret == MP_OKAY) { + OperandBits = max(max(mph->Xs, mph->Ys), mph->Ms); + if (OperandBits > ESP_HW_MULTI_RSAMAX_BITS) { + ESP_LOGW(TAG, "result exceeds max bit length"); + ret = MP_VAL; /* Error: value is not able to be used. */ + } + else { + WordsForOperand = bits2words(OperandBits); + } + } + + if (ret == MP_OKAY) { + /* 2. Disable completion interrupt signal; we don't use. + ** 0 => no interrupt; 1 => interrupt on completion. */ + DPORT_REG_WRITE(RSA_INTERRUPT_REG, 0); + + /* 3. Write (N_result_bits/32 - 1) to the RSA_MODE_REG. */ + DPORT_REG_WRITE(RSA_LENGTH_REG, WordsForOperand - 1); + + /* 4. Write M' value into RSA_M_PRIME_REG + * (now called RSA_M_DASH_REG) */ + DPORT_REG_WRITE(RSA_M_DASH_REG, mph->mp); + + /* 5. Load X, Y, M, r' operands. */ + esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, + X, + mph->Xs, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, + Y, + mph->Ys, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, + M, + mph->Ms, + mph->hwWords_sz); + esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE, + &(mph->r_inv), + mph->Rs, + mph->hwWords_sz); + + /* 6. Start operation and wait until it completes. */ + process_start(RSA_MODEXP_START_REG); + ret = wait_until_done(RSA_QUERY_INTERRUPT_REG); + } + + if (MP_OKAY == ret) { + /* 7. read the result form MEM_Z */ + esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, BITS_TO_WORDS(mph->Ms)); + } + + /* 8. clear and release HW */ + if (exptmod_lock_called) { + ret = esp_mp_hw_unlock(); + } + else { + ESP_LOGV(TAG, "Lock not called"); + } - return ret; /* end if CONFIG_IDF_TARGET_ESP32S3 */ #else - /* non-ESP32S3 Xtensa (regular ESP32) */ + /* unknown or unsupported targets fall back to SW */ + ret = MP_HW_FALLBACK; +#endif - /* Steps to use HW in the following order: - * 1. Write(N/512bits - 1) to MODEXP_MODE_REG - * 2. Write X, Y, M and r_inv to memory blocks - * need to write data to each memory block only according to the length - * of the number. - * 3. Write M' to M_PRIME_REG - * 4. Write 1 to MODEXP_START_REG - * 5. Wait for the operation to be done. Poll INTERRUPT_REG until it reads 1. - * (Or until the INTER interrupt is generated.) - * 6. Read the result Z(=Y) from Z_MEM - * 7. Write 1 to INTERRUPT_REG to clear the interrupt. - */ - if ((ret = esp_mp_hw_wait_clean()) != MP_OKAY) { - return ret; +#ifdef DEBUG_WOLFSSL + if (esp_mp_exptmod_depth_counter != 1) { + ESP_LOGE(TAG, "esp_mp_exptmod exit Depth Counter Error!"); } + esp_mp_exptmod_depth_counter--; +#endif - /* step.1 */ - DPORT_REG_WRITE(RSA_MODEXP_MODE_REG, (hwWords_sz >> 4) - 1); - /* step.2 write G, X, P, r_inv and M' into memory */ - esp_mpint_to_memblock(RSA_MEM_X_BLOCK_BASE, X, Xs, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_Y_BLOCK_BASE, Y, Ys, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_M_BLOCK_BASE, M, Ms, hwWords_sz); - esp_mpint_to_memblock(RSA_MEM_Z_BLOCK_BASE, - &r_inv, - mp_count_bits(&r_inv), - hwWords_sz); - /* step.3 write M' into memory */ - DPORT_REG_WRITE(RSA_M_DASH_REG, mp); - /* step.4 start process */ - process_start(RSA_START_MODEXP_REG); - - /* step.5 wait until done */ - wait_until_done(RSA_INTERRUPT_REG); - /* step.6 read a result form memory */ - esp_memblock_to_mpint(RSA_MEM_Z_BLOCK_BASE, Z, BITS_TO_WORDS(Ms)); - /* step.7 clear and release HW */ - esp_mp_hw_unlock(); - - mp_clear(&r_inv); + /* never modify the result if we are falling back as the result + * may be the same as one of the operands! */ + if (ret == MP_OKAY) { + esp_clean_result(Z, 0); + } +#ifdef WOLFSSL_HW_METRICS + esp_mp_max_used = (Z->used > esp_mp_max_used) ? Z->used : esp_mp_max_used; +#endif return ret; -#endif -} +} /* esp_mp_exptmod */ +#endif /* Use HW expmod: ! NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ -#endif /* WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && - * !NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI */ +#endif /* WOLFSSL_ESP32_CRYPT_RSA_PRI) && + * !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ #endif /* !NO_RSA || HAVE_ECC */ + +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI) && defined(WOLFSSL_HW_METRICS) +int esp_hw_show_mp_metrics(void) +{ + int ret; +#if !defined(NO_ESP32_CRYPT) && defined(HW_MATH_ENABLED) + ret = MP_OKAY; + +#if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL) + ESP_LOGI(TAG, "esp_mp_mul HW disabled with " + "NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL"); +#else + /* Metrics: esp_mp_mul() */ + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); /* mul follows */ + ESP_LOGI(TAG, "esp_mp_mul HW acceleration enabled."); + ESP_LOGI(TAG, "Number of calls to esp_mp_mul: %lu", + esp_mp_mul_usage_ct); + if (esp_mp_mul_error_ct == 0) { + ESP_LOGI(TAG, "Success: no esp_mp_mul() errors."); + } + else { + ESP_LOGW(TAG, "Number of esp_mp_mul failures: %lu", + esp_mp_mul_error_ct); + ret = MP_VAL; + } +#endif + +#if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD) + ESP_LOGI(TAG, "esp_mp_mulmod HW disabled with " + "NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD"); +#else + /* Metrics: esp_mp_mulmod() */ + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); /* mulmod follows */ + + ESP_LOGI(TAG, "esp_mp_mulmod HW acceleration enabled."); + /* Metrics: esp_mp_mulmod() */ + ESP_LOGI(TAG, "Number of calls to esp_mp_mulmod: %lu", + esp_mp_mulmod_usage_ct); + ESP_LOGI(TAG, "Number of fallback to SW mp_mulmod: %lu", + esp_mp_mulmod_fallback_ct); + + if (esp_mp_mulmod_error_ct == 0) { + ESP_LOGI(TAG, "Success: no esp_mp_mulmod errors."); + } + else { + ESP_LOGW(TAG, "Number of esp_mp_mulmod failures: %lu", + esp_mp_mulmod_error_ct); + ret = MP_VAL; + } + + if (esp_mp_mulmod_even_mod_ct == 0) { + ESP_LOGI(TAG, "Success: no esp_mp_mulmod even mod."); + } + else { + ESP_LOGW(TAG, "Number of esp_mp_mulmod even mod: %lu", + esp_mp_mulmod_even_mod_ct); + } + + if (esp_mp_mulmod_error_ct == 0) { + ESP_LOGI(TAG, "Success: no esp_mp_mulmod small x or y."); + } + else { + ESP_LOGW(TAG, "Number of esp_mp_mulmod small x: %lu", + esp_mp_mulmod_small_x_ct); + ESP_LOGW(TAG, "Number of esp_mp_mulmod small y: %lu", + esp_mp_mulmod_small_y_ct); + } +#endif /* MULMOD disabled: !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + +#if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + ESP_LOGI(TAG, "esp_mp_exptmod HW disabled with " + "NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD"); +#else + /* Metrics: sp_mp_exptmod() */ + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); /* exptmod follows */ + + ESP_LOGI(TAG, "Number of calls to esp_mp_exptmod: %lu", + esp_mp_exptmod_usage_ct); + ESP_LOGI(TAG, "Number of fallback to SW mp_exptmod: %lu", + esp_mp_exptmod_fallback_ct); + if (esp_mp_exptmod_error_ct == 0) { + ESP_LOGI(TAG, "Success: no esp_mp_exptmod errors."); + } + else { + ESP_LOGW(TAG, "Number of esp_mp_exptmod errors: %lu", + esp_mp_exptmod_error_ct); + ret = MP_VAL; + } +#endif /* EXPTMOD not disabled !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ + + ESP_LOGI(TAG, "Max N->used: esp_mp_max_used = %lu", esp_mp_max_used); + ESP_LOGI(TAG, "Max timeout: esp_mp_max_timeout = %lu", esp_mp_max_timeout); + +#else + /* no HW math, no HW math metrics */ + ret = ESP_OK; +#endif /* HW_MATH_ENABLED */ + + + return ret; +} +#endif /* WOLFSSL_HW_METRICS */ + +#endif /* WOLFSSL_ESPIDF */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_sha.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_sha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_sha.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_sha.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* esp32_sha.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,11 +18,24 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ + +/* + * ESP32-C3: https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_en.pdf + * see page 335: no SHA-512 + * + */ #ifdef HAVE_CONFIG_H #include #endif +/* Reminder: user_settings.h is needed and included from settings.h + * Be sure to define WOLFSSL_USER_SETTINGS, typically in CMakeLists.txt */ #include + +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ +#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#include + /*****************************************************************************/ /* this entire file content is excluded when NO_SHA, NO_SHA256 * or when using WC_SHA384 or WC_SHA512 @@ -30,16 +43,28 @@ #if !defined(NO_SHA) || !defined(NO_SHA256) || defined(WC_SHA384) || \ defined(WC_SHA512) -#include "wolfssl/wolfcrypt/logging.h" - - /* this entire file content is excluded if not using HW hash acceleration */ -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +#if defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) -/* TODO this may be chip type dependent: add support for others */ -#include /* ESP32-WROOM */ +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + #include + + #include + #include +#elif defined(CONFIG_IDF_TARGET_ESP32) || \ + defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + #include +#else + #include /* ESP32-WROOM */ +#endif +/* wolfSSL */ +#include #include #include #include @@ -54,24 +79,179 @@ #include #endif +/* A value for an initialized, but not-yet-known SHA: */ +#define WC_UNKNOWN_SHA (-1) + +#define WC_ESP_MAX_IDLE_WAIT 10000 + static const char* TAG = "wolf_hw_sha"; +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /* Keep track of the currently active SHA hash object for interleaving. */ + const static word32 ** _active_digest_address = 0; +#endif + #ifdef NO_SHA #define WC_SHA_DIGEST_SIZE 20 #endif +#if defined(DEBUG_WOLFSSL) + /* Only when debugging, we'll keep tracking of SHA block numbers. */ + static int this_block_num = 0; +#endif + /* RTOS mutex or just InUse variable */ #if defined(SINGLE_THREADED) static int InUse = 0; #else static wolfSSL_Mutex sha_mutex = NULL; +#endif - #if defined(DEBUG_WOLFSSL) - /* Only when debugging, we'll keep tracking of block numbers. */ - static int this_block_num = 0; +#ifdef WOLFSSL_DEBUG_MUTEX + #ifdef WOLFSSL_TEST_STRAY + #define WOLFSSL_TEST_STRAY_INJECT (esp_sha_call_count() == 10) + #else + /* unless turned on, we won't be testing for strays */ + #define WOLFSSL_TEST_STRAY 0 + #define WOLFSSL_TEST_STRAY_INJECT 0 #endif #endif +/* usage metrics can be turned on independently of debugging */ +#ifdef WOLFSSL_HW_METRICS + static unsigned long esp_sha_hw_copy_ct = 0; + static unsigned long esp_sha1_hw_usage_ct = 0; + static unsigned long esp_sha1_sw_fallback_usage_ct = 0; + static unsigned long esp_sha_reverse_words_ct = 0; + static unsigned long esp_sha1_hw_hash_usage_ct = 0; + static unsigned long esp_sha2_224_hw_hash_usage_ct = 0; + static unsigned long esp_sha2_256_hw_hash_usage_ct = 0; + static unsigned long esp_sha256_sw_fallback_usage_ct = 0; + static unsigned long esp_byte_reversal_checks_ct = 0; + static unsigned long esp_byte_reversal_needed_ct = 0; +#endif + + static uintptr_t mutex_ctx_owner = NULLPTR; + static portMUX_TYPE sha_crit_sect = portMUX_INITIALIZER_UNLOCKED; + +#if defined(ESP_MONITOR_HW_TASK_LOCK) + #ifdef SINGLE_THREADED + uintptr_t esp_sha_mutex_ctx_owner(void) + { + return mutex_ctx_owner; + } + #else + static TaskHandle_t mutex_ctx_task = NULL; + uintptr_t esp_sha_mutex_ctx_owner(void) + { + uintptr_t ret = 0; + taskENTER_CRITICAL(&sha_crit_sect); + { + ret = mutex_ctx_owner; + } + taskEXIT_CRITICAL(&sha_crit_sect); + return ret; + }; + #endif + + #ifdef WOLFSSL_DEBUG_MUTEX + WC_ESP32SHA* stray_ctx; + /* each ctx keeps track of the initializer for HW. when debugging + * we'll have a global variable to indicate which has the lock. */ + static int _sha_lock_count = 0; + static int _sha_call_count = 0; + + int esp_sha_call_count(void) + { + return _sha_call_count; + } + + int esp_sha_lock_count(void) + { + return _sha_lock_count; + } + + #endif +#endif + +/* esp_set_hw - set hardware lock, but only if there's no other known + * current mutex owner. */ +int esp_set_hw(WC_ESP32SHA* ctx) +{ + int ret = ESP_FAIL; + if ((uintptr_t)ctx == mutex_ctx_owner || mutex_ctx_owner == NULLPTR) { + ESP_LOGV(TAG, "Initializing current mutext owner!"); + if (esp_sha_hw_islocked(ctx)) { + ESP_LOGV(TAG, "esp_set_hw already locked: 0x%x", (intptr_t)ctx); + } + ctx->mode = ESP32_SHA_HW; + mutex_ctx_owner = (uintptr_t)ctx; + ret = ESP_OK; + } + else { + ESP_LOGV(TAG, "esp_sha_init_ctx HW for non-owner 0x%x", (intptr_t)ctx); + } + return ret; +} + +/* +** The wolfCrypt functions for LITTLE_ENDIAN_ORDER typically +** reverse the byte order. Except when the hardware doesn't expect it. +** +** For SoC devices with no HW (Hardware Acceleration) support: +** ctx->sha_type will be SHA_INVALID +** ctx->mode will be ESP32_SHA_SW +** +** Returns 0 (FALSE) or 1 (TRUE); see wolfSSL types.h +*/ +int esp_sha_need_byte_reversal(WC_ESP32SHA* ctx) +{ + int ret = 1; /* Assume we'll need reversal, look for exceptions. */ + CTX_STACK_CHECK(ctx); +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + if (ctx == NULL) { + ESP_LOGE(TAG, " ctx is null"); + /* Return true for bad params */ + } + else { + #ifdef WOLFSSL_HW_METRICS + { + esp_byte_reversal_checks_ct++; + } + #endif + if (ctx->mode == ESP32_SHA_HW) { + ESP_LOGV(TAG, " No reversal, ESP32_SHA_HW"); + ret = 0; + } + else { + ret = 1; + ESP_LOGV(TAG, " Need byte reversal, %d", ctx->mode); + /* Return true for SW; only HW C3 skips reversal at this time. */ + #ifdef WOLFSSL_HW_METRICS + { + esp_byte_reversal_needed_ct++; + } + #endif + if (ctx->mode == ESP32_SHA_INIT) { + ESP_LOGW(TAG, "esp_sha_need_byte_reversal during init?"); + ESP_LOGW(TAG, "forgot to try HW lock first?"); + } + } + } +#else + /* Other platforms always return true. */ +#endif + CTX_STACK_CHECK(ctx); + + return ret; +} + /* esp_sha_init ** ** ctx: any wolfSSL ctx from any hash algo @@ -81,47 +261,78 @@ ** Active HW states, such as from during a copy operation, are demoted to SW. ** For hash_type not available in HW, set SW mode. ** -** See esp_sha_init_ctx(ctx) +** For ctx, mode will be +** ESP32_SHA_INIT - For initialized, hardware-ready +** ESP32_SHA_SW - Software only +** +** See esp_sha_init_ctx(ctx) for common initialization of ctx. */ int esp_sha_init(WC_ESP32SHA* ctx, enum wc_HashType hash_type) { - int ret = 0; + int ret = ESP_OK; + +#ifdef DEBUG_WOLFSSL_SHA_MUTEX + ESP_LOGV(TAG, "\n\nesp_sha_init for ctx %p\n\n", ctx); +#endif + + if (ctx == NULL) { + return ESP_FAIL; + } + +#if defined(WOLFSSL_STACK_CHECK) + ctx->first_word = 0; + ctx->last_word = 0; +#endif + CTX_STACK_CHECK(ctx); + + ret = esp_sha_init_ctx(ctx); -#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) +#if defined(CONFIG_IDF_TARGET_ESP32) || \ + defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + + /* ESP32 Xtensa Architecture SoC. Each has different features: */ switch (hash_type) { /* check each wolfSSL hash type WC_[n] */ + + #ifndef NO_SHA case WC_HASH_TYPE_SHA: ctx->sha_type = SHA1; /* assign Espressif SHA HW type */ - ret = esp_sha_init_ctx(ctx); + break; + #endif + + case WC_HASH_TYPE_SHA224: + #if defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + ctx->sha_type = SHA2_224; /* assign Espressif SHA HW type */ + #else + /* Don't call init, always SW as there's no HW. */ + ctx->mode = ESP32_SHA_SW; + #endif break; case WC_HASH_TYPE_SHA256: ctx->sha_type = SHA2_256; /* assign Espressif SHA HW type */ - ret = esp_sha_init_ctx(ctx); break; - #ifdef CONFIG_IDF_TARGET_ESP32S3 + #if defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) case WC_HASH_TYPE_SHA384: - /* TODO is SHA384 really not supported on -S3? */ ctx->mode = ESP32_SHA_SW; - ctx->sha_type = SHA2_384; /* Espressif type, but we won't use HW */ break; #else case WC_HASH_TYPE_SHA384: ctx->sha_type = SHA2_384; /* assign Espressif SHA HW type */ - ret = esp_sha_init_ctx(ctx); break; #endif case WC_HASH_TYPE_SHA512: ctx->sha_type = SHA2_512; /* assign Espressif SHA HW type */ - ret = esp_sha_init_ctx(ctx); break; #ifndef WOLFSSL_NOSHA512_224 case WC_HASH_TYPE_SHA512_224: /* Don't call init, always SW as there's no HW. */ ctx->mode = ESP32_SHA_SW; - ctx->sha_type = SHA2_512; /* Espressif type, but we won't use HW */ break; #endif @@ -129,174 +340,89 @@ case WC_HASH_TYPE_SHA512_256: /* Don't call init, always SW as there's no HW. */ ctx->mode = ESP32_SHA_SW; - ctx->sha_type = SHA2_512; /* Espressif type, but we won't use HW */ break; #endif default: - ret = esp_sha_init_ctx(ctx); - ESP_LOGW(TAG, "Unexpected hash_type in esp_sha_init"); - break; + ctx->mode = ESP32_SHA_SW; + ESP_LOGW(TAG, "Unexpected hash_type in esp_sha_init"); + break; } -#else - /* other chipsets will be implemented here */ -#endif /* defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) */ - - return ret; -} +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) -/* we'll call a separate init as there's only 1 HW acceleration */ -int esp_sha_init_ctx(WC_ESP32SHA* ctx) -{ - if (ctx->initializer == NULL) { - ESP_LOGV(TAG, "regular init of blank WC_ESP32SHA ctx"); - - /* we'll keep track of who initialized this */ - ctx->initializer = ctx; /* save our address in the initializer */ - ctx->mode = ESP32_SHA_INIT; - } - else { - /* things may be more interesting when previously initialized */ - if (ctx->initializer == ctx) { - /* We're likely re-using an existing object previously initialized. - ** There's of course a non-zero probability that garbage data is - ** the same pointer value, but that's highly unlikely; We'd need - ** to discard, then re-init to same memory location for a matching - ** initializer. */ - ESP_LOGV(TAG, "re-using existing WC_ESP32SHA ctx"); - - /* we should never have an unexpected mode in a known ctx */ - switch (ctx->mode) { - case ESP32_SHA_INIT: - case ESP32_SHA_SW: - /* nothing interesting here */ - break; - - case ESP32_SHA_HW: - /* This will be dealt with below: likely demote to SW */ - break; - - case ESP32_SHA_HW_COPY: - /* This is an interesting mode, caller gave HW mode hint */ - ESP_LOGI(TAG, "ALERT: ESP32_SHA_HW_COPY?"); - break; - - default: - /* This should almost occur. We'd need to have an - ** uninitialized ctx that just happens to include the - ** breadcrumb initializer with the same address. */ - ESP_LOGW(TAG, "ALERT: unexpected WC_ESP32SHA ctx mode: " - "%d. ", ctx->mode); - ctx->mode = ESP32_SHA_INIT; - break; - } - /* We don't need to do anything here, - ** this section for diagnostics only. - ** May need to unlock HW, below. */ - } /* ctx->initializer == ctx */ - else { - /* We may end up here with either dirty memory - ** or copied SHA ctx. - ** - ** Any copy function should have already set mode = ESP32_SHA_INIT. - ** - ** In either case, initialize: */ - ctx->initializer = ctx; /* set a new address */ + /* ESP32 RISC-V Architecture SoC. Each has different features: */ - /* Always set to ESP32_SHA_INIT, but give debug info as to why: */ - switch (ctx->mode) { - case ESP32_SHA_INIT: - /* if we are already in init mode, nothing to do. */ - break; - - case ESP32_SHA_SW: - /* this should rarely, if ever occur */ - ESP_LOGW(TAG, "ALERT: unexpected SW WC_ESP32SHA ctx mode. " - "Copied? Revert to ESP32_SHA_INIT."); - ctx->mode = ESP32_SHA_INIT; - break; - - case ESP32_SHA_HW: - /* this should rarely, if ever occur. */ - ESP_LOGW(TAG, "ALERT: unexpected HW WC_ESP32SHA ctx mode. " - "Copied?"); - ctx->mode = ESP32_SHA_INIT; - break; - - case ESP32_SHA_HW_COPY: - /* This is an interesting but acceptable situation: - ** an anticipated active HW copy that will demote to SW. */ - ESP_LOGV(TAG, "HW WC_ESP32SHA ctx mode = ESP32_SHA_HW_COPY."); - break; - - default: - /* this will frequently occur during new init */ - ESP_LOGV(TAG, "ALERT: unexpected WC_ESP32SHA ctx mode. " - "Uninitialized?"); - ctx->mode = ESP32_SHA_INIT; - break; - } /* switch */ - } /* ctx->initializer != ctx */ - } /* ctx->initializer != NULL */ + switch (hash_type) { /* check each wolfSSL hash type WC_[n] */ + #ifndef NO_SHA + case WC_HASH_TYPE_SHA: + ctx->sha_type = SHA1; /* assign Espressif SHA HW type */ + break; + #endif - /* - ** After possibly changing the mode (above) handle current mode: - */ - switch (ctx->mode) { - case ESP32_SHA_INIT: - /* Likely a fresh, new SHA, as desired. */ - ESP_LOGV(TAG, "Normal ESP32_SHA_INIT"); + case WC_HASH_TYPE_SHA224: + ctx->sha_type = SHA2_224; /* assign Espressif SHA HW type */ break; - case ESP32_SHA_HW: - /* We're already in hardware mode, so release. */ - /* Interesting, but normal. */ - ESP_LOGV(TAG, ">> HW unlock."); - - /* During init is the ONLY TIME we call unlock. - ** If there's a problem, likely some undesired operation - ** outside of wolfSSL. - */ - esp_sha_hw_unlock(ctx); - ctx->mode = ESP32_SHA_INIT; + case WC_HASH_TYPE_SHA256: + ctx->sha_type = SHA2_256; /* assign Espressif SHA HW type */ break; - case ESP32_SHA_HW_COPY: - /* When we init during a known active HW copy, revert to SW. */ - ESP_LOGV(TAG, "Planned revert to SW during copy."); + default: + /* We fall through to SW when there's no enabled HW, above. */ ctx->mode = ESP32_SHA_SW; + ESP_LOGW(TAG, "Unsupported hash_type = %d in esp_sha_init, " + "falling back to SW", hash_type); break; + } - case ESP32_SHA_SW: - /* This is an interesting situation: likely a call when - ** another SHA in progress, but copied. */ - ESP_LOGV(TAG, ">> SW Set to init."); - ctx->mode = ESP32_SHA_INIT; - break; +#else + /* Other chipsets will be implemented here, fallback to SW for now: */ + ESP_LOGW(TAG, "SW Fallback; CONFIG_IDF_TARGET = %s", CONFIG_IDF_TARGET); + ctx->mode = ESP32_SHA_SW; +#endif /* CONFIG_IDF_TARGET_[nnn] */ + CTX_STACK_CHECK(ctx); - case ESP32_SHA_FAIL_NEED_UNROLL: - /* Oh, how did we get here? likely uninitialized SHA memory. - ** User code logic may need attention. */ - ESP_LOGW(TAG, "ALERT: \nESP32_SHA_FAIL_NEED_UNROLL\n"); - ctx->mode = ESP32_SHA_INIT; - break; + return ret; +} - default: - /* Most likely corrupted memory. */ - ESP_LOGW(TAG, "ALERT: \nunexpected mode value: " - "%d \n", ctx->mode); - ctx->mode = ESP32_SHA_INIT; - break; - } /* switch (ctx->mode) */ - - /* reminder: always start isfirstblock = 1 (true) when using HW engine */ - /* we're always on the first block at init time (not zero-based!) */ - ctx->isfirstblock = true; +/* we'll call a common init for non-chip-specific settings */ +int esp_sha_init_ctx(WC_ESP32SHA* ctx) +{ + CTX_STACK_CHECK(ctx); + + ctx->mode = ESP32_SHA_INIT; + + /* This is a generic init; we don't yet know SHA type. */ + ctx->sha_type = WC_UNKNOWN_SHA; + + /* Reminder: always start isfirstblock = 1 (true) when using HW engine. */ + /* We're always on the first block at init time. (not zero-based!) */ + ctx->isfirstblock = 1; ctx->lockDepth = 0; /* new objects will always start with lock depth = 0 */ - return 0; /* Always return success. We assume all issues handled, above. */ +#if defined(MUTEX_DURING_INIT) + if ((uintptr_t)ctx == mutex_ctx_owner || mutex_ctx_owner == NULLPTR) { + ESP_LOGV(TAG, "Initializing current mutext owner!"); + if (esp_sha_hw_islocked(ctx)) { + esp_sha_hw_unlock(ctx); + } + mutex_ctx_owner = (uintptr_t)ctx; + } + else { + ESP_LOGI(TAG, "MUTEX_DURING_INIT esp_sha_init_ctx for non-owner: " + "0x%x", (intptr_t)ctx); + } +#endif + + CTX_STACK_CHECK(ctx); + return ESP_OK; /* Always return success. + * We assume all issues handled, above. */ } /* esp_sha_init_ctx */ +#ifndef NO_SHA /* ** internal SHA ctx copy for ESP HW */ @@ -306,31 +432,47 @@ if (src->ctx.mode == ESP32_SHA_HW) { /* this is an interesting situation to copy HW digest to SW */ ESP_LOGV(TAG, "esp_sha_ctx_copy esp_sha_digest_process"); - + #ifdef WOLFSSL_HW_METRICS + { + esp_sha_hw_copy_ct++; + } + #endif /* Get a copy of the HW digest, but don't process it. */ ret = esp_sha_digest_process(dst, 0); if (ret == 0) { - /* note we arrived here only because the src is already in HW mode */ - dst->ctx.mode = ESP32_SHA_HW_COPY; /* provide init hint to SW revert */ - /* initializer will be set during init */ ret = esp_sha_init(&(dst->ctx), WC_HASH_TYPE_SHA); if (ret != 0) { - ESP_LOGE(TAG, "Error during esp_sha_ctx_copy in esp_sha_init."); + ESP_LOGE(TAG, "Error during esp_sha_ctx_copy " + "in esp_sha_init."); } + /* As src is HW, the copy will be SW. TODO: Future interleave. */ + dst->ctx.mode = ESP32_SHA_SW; } else { - ESP_LOGE(TAG, "Error during esp_sha_ctx_copy in esp_sha_digest_process."); + ESP_LOGE(TAG, "Error during esp_sha_ctx_copy " + "in esp_sha_digest_process."); } if (dst->ctx.mode == ESP32_SHA_SW) { + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /* Reverse digest for C2/C3/C6 RISC-V platform + * only when HW enabled but fallback to SW. */ + ByteReverseWords(dst->digest, dst->digest, WC_SHA_DIGEST_SIZE); + #ifdef WOLFSSL_HW_METRICS + esp_sha_reverse_words_ct++; + #endif + #endif /* The normal revert to SW in copy is expected */ ESP_LOGV(TAG, "Confirmed SHA Copy set to SW"); } else { /* However NOT reverting to SW is not right. ** This should never happen. */ - ESP_LOGW(TAG, "SHA Copy NOT set to SW"); + ESP_LOGW(TAG, "SHA Copy NOT set to SW from %d", dst->ctx.mode); } } /* (src->ctx.mode == ESP32_SHA_HW */ else { /* src not in HW mode, ok to copy. */ @@ -338,28 +480,43 @@ ** reminder XMEMCOPY, above: dst->ctx = src->ctx; ** No special HW init needed in SW mode. ** but we need to set our initializer breadcrumb: */ - dst->ctx.initializer = &(dst->ctx); /* assign new breadcrumb to dst */ + dst->ctx.initializer = (uintptr_t)&(dst->ctx); + #if defined(ESP_MONITOR_HW_TASK_LOCK) && !defined(SINGLE_THREADED) + { + /* not HW mode for copy, so we are not interested in task owner */ + dst->ctx.task_owner = 0; + } + #endif + ret = 0; } return ret; } /* esp_sha_ctx_copy */ +#endif /* -** internal sha224 ctx copy (no ESP HW) +** Internal sha224 ctx copy (no ESP HW) */ +#ifndef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 int esp_sha224_ctx_copy(struct wc_Sha256* src, struct wc_Sha256* dst) { - /* There's no 224 hardware on ESP32 */ - dst->ctx.initializer = &dst->ctx; /* assign the initializer to dst */ + /* There's no 224 hardware on ESP32. + * Initializer for dst is this ctx address for use as a breadcrumb. */ + dst->ctx.initializer = (uintptr_t)&dst->ctx; + #if defined(ESP_MONITOR_HW_TASK_LOCK) && !defined(SINGLE_THREADED) + { + /* not HW mode for copy, so we are not interested in task owner: */ + dst->ctx.task_owner = 0; + } + #endif - /* always set to SW, as there's no ESP32 HW for SHA224. - ** TODO: add support for ESP32-S2. ESP32-S3, ESP32-C3 here. - */ dst->ctx.mode = ESP32_SHA_SW; - return 0; + return ESP_OK; } /* esp_sha224_ctx_copy */ +#endif +#ifndef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 /* ** internal sha256 ctx copy for ESP HW */ @@ -368,45 +525,86 @@ int ret; if (src->ctx.mode == ESP32_SHA_HW) { /* Get a copy of the HW digest, but don't process it. */ - ESP_LOGI(TAG, "esp_sha256_ctx_copy esp_sha512_digest_process"); - ret = esp_sha256_digest_process(dst, 0); - - if (ret == 0) { - /* provide init hint to possibly SW revert */ - dst->ctx.mode = ESP32_SHA_HW_COPY; + #ifdef WOLFSSL_DEBUG_MUTEX + { + ESP_LOGI(TAG, "esp_sha256_ctx_copy esp_sha512_digest_process"); + } + #endif + ret = esp_sha256_digest_process(dst, FALSE); + if (ret == ESP_OK) { /* initializer breadcrumb will be set during init */ - ret = esp_sha_init(&(dst->ctx), WC_HASH_TYPE_SHA256 ); + ret = esp_sha_init(&(dst->ctx), WC_HASH_TYPE_SHA256); + /* As src is HW, the copy will be SW. TODO: Future interleave. */ + dst->ctx.mode = ESP32_SHA_SW; + } + else { + ESP_LOGE(TAG, "Unexpected error during sha256 ctx copy: %d", ret); } if (dst->ctx.mode == ESP32_SHA_SW) { + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + /* Reverse digest byte order for C3 fallback to SW. */ + ByteReverseWords(dst->digest, + dst->digest, + WC_SHA256_DIGEST_SIZE); + } + #endif ESP_LOGV(TAG, "Confirmed wc_Sha256 Copy set to SW"); } else { - ESP_LOGW(TAG, "wc_Sha256 Copy NOT set to SW"); + ESP_LOGW(TAG, "wc_Sha256 Copy (mode = %d) set to SW", + dst->ctx.mode); + dst->ctx.mode = ESP32_SHA_SW; } } /* (src->ctx.mode == ESP32_SHA_HW) */ else { - ret = 0; + ret = ESP_OK; /* ** reminder this happened in XMEMCOPY: dst->ctx = src->ctx; ** No special HW init needed in SW mode. - ** but we need to set our initializer: */ - dst->ctx.initializer = &dst->ctx; /* assign the initializer to dst */ + ** but we need to set our initializer (helpful in multi-task RTOS) */ + dst->ctx.initializer = (uintptr_t)&(dst->ctx); + #if defined(ESP_MONITOR_HW_TASK_LOCK) && !defined(SINGLE_THREADED) + { + /* not HW mode, so we are not interested in task owner */ + dst->ctx.task_owner = 0; + } + #endif } /* not (src->ctx.mode == ESP32_SHA_HW) */ return ret; } /* esp_sha256_ctx_copy */ +#endif +#if !(defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) && \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) \ + ) && \ + (defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)) /* ** internal sha384 ctx copy for ESP HW */ int esp_sha384_ctx_copy(struct wc_Sha512* src, struct wc_Sha512* dst) { - int ret; + int ret = 0; +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + /* We should ever be calling the HW sHA384 copy for this target. */ + ESP_LOGW(TAG, "Warning: esp_sha384_ctx_copy() called for %s!", + CONFIG_IDF_TARGET); + ESP_LOGW(TAG, "There's no SHA384 HW for this CONFIG_IDF_TARGET"); + } +#else if (src->ctx.mode == ESP32_SHA_HW) { /* Get a copy of the HW digest, but don't process it. */ - ESP_LOGI(TAG, "esp_sha384_ctx_copy esp_sha512_digest_process"); + ESP_LOGV(TAG, "esp_sha384_ctx_copy esp_sha512_digest_process"); ret = esp_sha512_digest_process(dst, 0); if (ret == 0) { /* provide init hint to SW revert */ @@ -415,11 +613,13 @@ /* initializer will be set during init */ ret = esp_sha_init(&(dst->ctx), WC_HASH_TYPE_SHA384); if (ret != 0) { - ESP_LOGE(TAG, "Error during esp_sha384_ctx_copy in esp_sha_init."); + ESP_LOGE(TAG, "Error during esp_sha384_ctx_copy " + "in esp_sha_init."); } } else { - ESP_LOGE(TAG, "Error during esp_sha384_ctx_copy in esp_sha512_digest_process."); + ESP_LOGE(TAG, "Error during esp_sha384_ctx_copy " + "in esp_sha512_digest_process."); } /* just some diagnostic runtime info */ @@ -433,28 +633,49 @@ else { ret = 0; /* - ** reminder this happened in XMEMCOPY, above: dst->ctx = src->ctx; + ** Reminder this happened in XMEMCOPY, above: dst->ctx = src->ctx; ** No special HW init needed in SW mode. - ** but we need to set our initializer: */ - dst->ctx.initializer = &dst->ctx; /* assign the initializer to dst */ + ** But we need to set our initializer in dst as a breadcrumb: */ + dst->ctx.initializer = (uintptr_t)&(dst->ctx); + #if defined(ESP_MONITOR_HW_TASK_LOCK) && !defined(SINGLE_THREADED) + { + /* not HW mode for copy, so we are not interested in task owner */ + dst->ctx.task_owner = 0; + } + #endif } /* not (src->ctx.mode == ESP32_SHA_HW) */ - +#endif return ret; } /* esp_sha384_ctx_copy */ +#endif +#if !(defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) && \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) \ + ) && \ + (defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)) /* ** Internal sha512 ctx copy for ESP HW. ** If HW already active, fall back to SW for this ctx. */ int esp_sha512_ctx_copy(struct wc_Sha512* src, struct wc_Sha512* dst) { - int ret; + int ret = ESP_OK; /* Assume success (zero) */ + +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /* There's no SHA512 HW on these RISC-V SoC so there's nothing to do. + * (perhaps a future one will?) */ +#elif defined(CONFIG_IDF_TARGET_ESP32) || \ + defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) if (src->ctx.mode == ESP32_SHA_HW) { /* Get a copy of the HW digest, but don't process it. */ - ESP_LOGI(TAG, "esp_sha512_ctx_copy esp_sha512_digest_process"); - ret = esp_sha512_digest_process(dst, 0); + ESP_LOGV(TAG, "esp_sha512_ctx_copy esp_sha512_digest_process"); + ret = esp_sha512_digest_process(dst, FALSE); - if (ret == 0) { + if (ret == ESP_OK) { /* provide init hint to SW revert */ dst->ctx.mode = ESP32_SHA_HW_COPY; @@ -468,33 +689,46 @@ ESP_LOGV(TAG, "Confirmed wc_Sha512 Copy set to SW"); } else { - ESP_LOGW(TAG, "wc_Sha512 Copy NOT set to SW"); + ESP_LOGW(TAG, "wc_Sha512 Copy set to SW"); + dst->ctx.mode = ESP32_SHA_SW; } } /* src->ctx.mode == ESP32_SHA_HW */ else { - ret = 0; + ret = ESP_OK; /* reminder this happened in XMEMCOPY, above: dst->ctx = src->ctx; ** No special HW init needed when not in active HW mode. ** but we need to set our initializer breadcrumb: */ - dst->ctx.initializer = &dst->ctx; /*breadcrumb is this ctx address */ - } + #if !defined(CONFIG_IDF_TARGET_ESP32C2) && \ + !defined(CONFIG_IDF_TARGET_ESP32C3) && \ + !defined(CONFIG_IDF_TARGET_ESP32C6) + dst->ctx.initializer = (uintptr_t)&(dst->ctx); + #endif + #if defined(ESP_MONITOR_HW_TASK_LOCK) && !defined(SINGLE_THREADED) + { + /* not HW mode for copy, so we are not interested in task owner */ + dst->ctx.task_owner = 0; + } + #endif + } /* else src->ctx.mode != ESP32_SHA_HW */ +#endif return ret; } /* esp_sha512_ctx_copy */ +#endif /* -** determine the digest size, depending on SHA type. +** Determine the digest size, depending on SHA type. ** ** See FIPS PUB 180-4, Instruction Section 1. ** -** see ESP32 shah.h for values: +** See ESP32 sha.h for values: ** ** enum SHA_TYPE { ** SHA1 = 0, ** SHA2_256, ** SHA2_384, ** SHA2_512, -** SHA_INVALID = -1, +** SHA_TYPE_MAX = -1, ** }; ** ** given the SHA_TYPE (see Espressif sha.h) return WC digest size. @@ -502,45 +736,77 @@ ** Returns zero for bad digest size type request. ** */ -static word32 wc_esp_sha_digest_size(enum SHA_TYPE type) +static word32 wc_esp_sha_digest_size(WC_ESP_SHA_TYPE type) { int ret = 0; ESP_LOGV(TAG, " esp_sha_digest_size"); +#if CONFIG_IDF_TARGET_ARCH_RISCV +/* + * SHA1 = 0, + * SHA2_224, + * SHA2_256, + */ switch (type) { #ifndef NO_SHA case SHA1: /* typically 20 bytes */ ret = WC_SHA_DIGEST_SIZE; break; -#endif + #endif #ifdef WOLFSSL_SHA224 - /* - no SHA224 HW at this time. case SHA2_224: ret = WC_SHA224_DIGEST_SIZE; break; - */ #endif #ifndef NO_SHA256 case SHA2_256: /* typically 32 bytes */ ret = WC_SHA256_DIGEST_SIZE; break; -#endif + #endif + default: + ESP_LOGE(TAG, "Bad SHA type in wc_esp_sha_digest_size"); + ret = 0; + break; + } +#else + /* Xtensa */ + switch (type) { + #ifndef NO_SHA + case SHA1: /* typically 20 bytes */ + ret = WC_SHA_DIGEST_SIZE; + break; + #endif + + #ifdef WOLFSSL_SHA224 + #if defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + case SHA2_224: + ret = WC_SHA224_DIGEST_SIZE; + break; + #endif + #endif + + #ifndef NO_SHA256 + case SHA2_256: /* typically 32 bytes */ + ret = WC_SHA256_DIGEST_SIZE; + break; + #endif #ifdef WOLFSSL_SHA384 case SHA2_384: ret = WC_SHA384_DIGEST_SIZE; break; -#endif + #endif #ifdef WOLFSSL_SHA512 case SHA2_512: /* typically 64 bytes */ ret = WC_SHA512_DIGEST_SIZE; break; -#endif + #endif default: ESP_LOGE(TAG, "Bad SHA type in wc_esp_sha_digest_size"); ret = 0; break; } +#endif return ret; /* Return value is a size, not an error code. */ } /* wc_esp_sha_digest_size */ @@ -551,10 +817,18 @@ static int wc_esp_wait_until_idle(void) { int ret = 0; /* assume success */ + int loop_ct = WC_ESP_MAX_IDLE_WAIT; -#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - /* ESP32-C3 RISC-V TODO */ -#elif defined(CONFIG_IDF_TARGET_ESP32S3) +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /* ESP32-C3 and ESP32-C6 RISC-V */ + while ((sha_ll_busy() == 1) && (loop_ct > 0)) { + loop_ct--; + /* do nothing while waiting. */ + } +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) while (REG_READ(SHA_BUSY_REG)) { /* do nothing while waiting. */ } @@ -566,7 +840,10 @@ /* do nothing while waiting. */ } #endif - + if (loop_ct <= 0) + { + ESP_LOGW(TAG, "Too long to exit wc_esp_wait_until_idle"); + } return ret; } /* wc_esp_wait_until_idle */ @@ -581,8 +858,6 @@ ** ** Note that enable / disable only occurs when ref_counts[periph] == 0 ** -** TODO: check if this works with other ESP32 platforms ESP32-C3, -** ESP32-S3, etc. (A: generally, no. RISC-V has different HW accelerator.) */ int esp_unroll_sha_module_enable(WC_ESP32SHA* ctx) { @@ -593,25 +868,33 @@ int max_unroll_count = 1000; /* never get stuck in a hardware wait loop */ #if defined(CONFIG_IDF_TARGET_ESP32) - uint32_t this_sha_mask; /* this is the bit-mask for our SHA CLK_EN_REG */ + word32 this_sha_mask; /* this is the bit-mask for our SHA CLK_EN_REG */ #endif + CTX_STACK_CHECK(ctx); if (ctx == NULL) { ESP_LOGE(TAG, "esp_unroll_sha_module_enable called with null ctx."); return BAD_FUNC_ARG; } -#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - /* RISC-V Architecture: TODO */ +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /************* RISC-V Architecture *************/ + (void)max_unroll_count; + (void)_active_digest_address; + ets_sha_disable(); + /* We don't check for unroll as done below, for Xtensa*/ #else - /* Xtensa Architecture */ + /************* Xtensa Architecture *************/ - /* unwind prior calls to THIS ctx. decrement ref_counts[periph] */ - /* only when ref_counts[periph] == 0 does something actually happen */ + /* unwind prior calls to THIS ctx. decrement ref_counts[periph] + ** only when ref_counts[periph] == 0 does something actually happen. */ /* once the value we read is a 0 in the DPORT_PERI_CLK_EN_REG bit * then we have fully unrolled the enables via ref_counts[periph]==0 */ -#if CONFIG_IDF_TARGET_ESP32S3 +#if defined(CONFIG_IDF_TARGET_ESP32S2) ||defined(CONFIG_IDF_TARGET_ESP32S3) /* once the value we read is a 0 in the DPORT_PERI_CLK_EN_REG bit * then we have fully unrolled the enables via ref_counts[periph]==0 */ while (periph_ll_periph_enabled(PERIPH_SHA_MODULE)) { @@ -624,13 +907,13 @@ periph_module_disable(PERIPH_SHA_MODULE); asm volatile("memw"); actual_unroll_count++; - ESP_LOGI(TAG, "unroll not yet successful. try #%d", + ESP_LOGW(TAG, "unroll not yet successful. try #%d", actual_unroll_count); /* we'll only try this some unreasonable number of times * before giving up */ if (actual_unroll_count > max_unroll_count) { - ret = -1; /* failed to unroll */ + ret = ESP_FAIL; /* failed to unroll */ break; } } @@ -643,7 +926,11 @@ ** This should never happen unless someone else called ** periph_module_disable() or threading not working properly. **/ - ESP_LOGW(TAG, "warning lockDepth mismatch."); + ESP_LOGW(TAG, "warning lockDepth mismatch: %d", ctx->lockDepth); + if (actual_unroll_count == 0 && ctx->lockDepth > 2) { + ESP_LOGW(TAG, "Large lockDepth discrepancy often indicates " + "stack overflow or memory corruption"); + } } ctx->lockDepth = 0; ctx->mode = ESP32_SHA_INIT; @@ -657,9 +944,200 @@ ESP_LOGI(TAG, "Setting ctx->mode = ESP32_SHA_SW"); ctx->mode = ESP32_SHA_SW; } + CTX_STACK_CHECK(ctx); return ret; } /* esp_unroll_sha_module_enable */ +/* Set and return a stray ctx value stray_ctx. Useful for multi-task debugging. + * Returns zero if not debugging. */ +uintptr_t esp_sha_set_stray(WC_ESP32SHA* ctx) +{ + uintptr_t ret = 0; + CTX_STACK_CHECK(ctx); + +#ifdef WOLFSSL_DEBUG_MUTEX + stray_ctx = ctx; + ret = (uintptr_t)stray_ctx; +#endif + CTX_STACK_CHECK(ctx); + return ret; +} + +/* Return 1 if the SHA HW is in use, 0 otherwise. */ +int esp_sha_hw_in_use() +{ + int ret; +#ifdef SINGLE_THREADED + ret = InUse; +#else + ret = (mutex_ctx_owner != NULLPTR); + ESP_LOGV(TAG, "mutex_ctx_owner is 0x%x", mutex_ctx_owner); +#endif + ESP_LOGV(TAG, "esp_sha_hw_in_use is %d", ret); + return ret; +} + +/* +** return HW lock owner, otherwise zero if not locked. +** +** When WOLFSSL_DEBUG_MUTEX is defined, additional +** debugging capabilities are available. +*/ +uintptr_t esp_sha_hw_islocked(WC_ESP32SHA* ctx) +{ + TaskHandle_t mutexHolder; + uintptr_t ret = 0; + CTX_STACK_CHECK(ctx); + +#ifdef WOLFSSL_DEBUG_MUTEX + taskENTER_CRITICAL(&sha_crit_sect); + { + ret = (uintptr_t)mutex_ctx_owner; + if (ctx == 0) { + /* we are not checking if a given ctx has the lock */ + } + else { + if (ret == (uintptr_t)ctx->initializer) { + /* confirmed this object is the owner */ + } + else { + /* this object is not the lock owner */ + } + } + } + taskEXIT_CRITICAL(&sha_crit_sect); +#else + #ifdef SINGLE_THREADED + { + ret = InUse; + } + #else + { + if (sha_mutex == NULL) { + mutexHolder = NULL; + } + else { + mutexHolder = xSemaphoreGetMutexHolder(sha_mutex); + } + + if (mutexHolder == NULL) { + /* Mutex is not in use */ + ESP_LOGV(TAG, "multi-threaded esp_mp_hw_islocked = false"); + ret = 0; + } + else { + ESP_LOGV(TAG, "multi-threaded esp_mp_hw_islocked = true"); + ret = mutex_ctx_owner; + } + + /* Verbose debug diagnostics */ + if (NULLPTR == mutex_ctx_owner) { + ESP_LOGV(TAG, "not esp_sha_hw_islocked, mutex_ctx_owner is Null"); + } + else { + ESP_LOGV(TAG, "esp_sha_hw_islocked for 0x%x", mutex_ctx_owner); + } + } + #endif + return ret; +#endif + + +#ifdef WOLFSSL_DEBUG_MUTEX + if (ret == 0) { + ESP_LOGV(TAG, ">> NOT LOCKED esp_sha_hw_islocked"); + } + else { + ESP_LOGV(TAG, ">> LOCKED esp_sha_hw_islocked for %x", + (int)esp_sha_mutex_ctx_owner()); + } +#endif + CTX_STACK_CHECK(ctx); + return ret; +} + +/* + * The HW is typically unlocked when the SHA hash wc_Sha[nn]Final() is called. + * However, in the case of TLS connections the in-progress hash may at times be + * abandoned. Thus this function should be called at free time. See internal.c + * + * Returns the owner of the current lock, typically used for debugging. + * Returns zero if there was no unfinished lock found to clean up. + */ +uintptr_t esp_sha_release_unfinished_lock(WC_ESP32SHA* ctx) +{ + uintptr_t ret = 0; + CTX_STACK_CHECK(ctx); + + ret = esp_sha_hw_islocked(ctx); /* get the owner of the current lock */ + if (ret == 0) { + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGV(TAG, "No unfinished lock to clean up for ctx %p.", ctx); + #endif + } + else { + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGI(TAG, "Unfinished lock clean up: %p.", ctx); + #endif + if (ret == (uintptr_t)ctx) { + /* found a match for this object */ + if (ret == ctx->initializer) { + /* confirmed match*/ + ESP_LOGW(TAG, "New mutex_ctx_owner = NULL"); + #ifdef ESP_MONITOR_HW_TASK_LOCK + { + mutex_ctx_owner = NULLPTR; + } + #endif + } + else { + /* the only mismatch expected may be in a multi-thread RTOS */ + ESP_LOGE(TAG, "ERROR: Release unfinished lock for %x but " + "found %x", ret, ctx->initializer); + } + #ifdef WOLFSSL_DEBUG_MUTEX + ESP_LOGE(TAG, "\n>>>> esp_sha_release_unfinished_lock %x\n", ret); + #endif + + /* unlock only if this ctx is the initializer of the lock */ + #ifdef SINGLE_THREADED + { + ret = esp_sha_hw_unlock(ctx); + } + #else + #if defined(ESP_MONITOR_HW_TASK_LOCK) + { + if (ctx->task_owner == xTaskGetCurrentTaskHandle()) { + ESP_LOGV(TAG, "esp_sha_hw_unlock!"); + } + else { + /* We cannot free a SHA object lock from a different task. + * So give the ctx a hint for other task to clean it up. */ + ctx->mode = ESP32_SHA_FREED; + ESP_LOGV(TAG, "ESP32_SHA_FREED"); + } + } + #else + /* Here we assume only 1 task, so no ESP32_SHA_FREED hint. */ + ret = esp_sha_hw_unlock(ctx); + #endif /* ESP_MONITOR_HW_TASK_LOCK */ + #endif /* SINGLE_THREADED or not */ + + } /* ret == ctx */ + } /* else not locked */ + + CTX_STACK_CHECK(ctx); + if (ctx->mode != ESP32_SHA_INIT) { +#if defined(WOLFSSL_ESP32_HW_LOCK_DEBUG) + ESP_LOGW(TAG, "esp_sha_release_unfinished_lock mode = %d", ctx->mode); +#endif + if (ctx->mode == ESP32_SHA_HW) { + ESP_LOGW(TAG, "esp_sha_release_unfinished_lock HW!"); + } + } + return ret; +} /* esp_sha_release_unfinished_lock */ + /* ** lock HW engine. ** this should be called before using engine. @@ -667,8 +1145,21 @@ int esp_sha_try_hw_lock(WC_ESP32SHA* ctx) { int ret = 0; + CTX_STACK_CHECK(ctx); + +#ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGI(TAG, "enter esp_sha_hw_lock for %x", + (uintptr_t)ctx->initializer); +#endif - ESP_LOGV(TAG, "enter esp_sha_hw_lock %x", (int)ctx->initializer); + #ifdef WOLFSSL_DEBUG_MUTEX + taskENTER_CRITICAL(&sha_crit_sect); + { + /* let's keep track of how many times we call this */ + _sha_call_count++; + } + taskEXIT_CRITICAL(&sha_crit_sect); + #endif if (ctx == NULL) { ESP_LOGE(TAG, " esp_sha_try_hw_lock called with NULL ctx"); @@ -677,26 +1168,32 @@ /* Init mutex * - * Note that even single thread mode may calculate hashes - * concurrently, so we still need to keep track of the - * engine being busy or not. - **/ + * Note that even single thread mode may calculate separate hashes + * concurrently, so we still need to keep track of the engine being + * busy or not. + */ #if defined(SINGLE_THREADED) if (ctx->mode == ESP32_SHA_INIT) { - if (!InUse) { - ctx->mode = ESP32_SHA_HW; - InUse = 1; + if (InUse) { + /* Revert to SW when HW is busy */ + ctx->mode = ESP32_SHA_SW; } else { - ctx->mode = ESP32_SHA_SW; + /* Set single-threaded hardware mode. */ + ctx->mode = ESP32_SHA_HW; + InUse = 1; + #ifdef WOLFSSL_DEBUG_MUTEX + ESP_LOGW(TAG, "\n\nHW in use\n\n"); + #endif } + ret = ESP_OK; } else { - /* this should not happens */ + /* this should not happen */ ESP_LOGE(TAG, "unexpected error in esp_sha_try_hw_lock."); - return -1; + return ESP_FAIL; } -#else /* not defined(SINGLE_THREADED) */ +#else /* not SINGLE_THREADED */ /* ** there's only one SHA engine for all the hash types ** so when any hash is in use, no others can use it. @@ -721,105 +1218,364 @@ ret = esp_CryptHwMutexInit(&sha_mutex); if (ret == 0) { ESP_LOGV(TAG, "esp_CryptHwMutexInit sha_mutex init success."); - } + mutex_ctx_owner = NULLPTR; /* No one has the mutex yet.*/ + #ifdef WOLFSSL_DEBUG_MUTEX + { + /* Take mutex for lock/unlock test drive to ensure it works: */ + ret = esp_CryptHwMutexLock(&sha_mutex, (TickType_t)0); + if (ret == ESP_OK) { + ret = esp_CryptHwMutexUnLock(&sha_mutex); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "esp_CryptHwMutexInit fail init lock."); + } + } + else { + ESP_LOGE(TAG, "esp_CryptHwMutexInit fail init unlock."); + } + } + #endif + } /* ret == 0 for esp_CryptHwMutexInit */ else { ESP_LOGE(TAG, "esp_CryptHwMutexInit sha_mutex failed."); - sha_mutex = 0; + #ifdef WOLFSSL_DEBUG_MUTEX + { + ESP_LOGV(TAG, "Current mutext owner = %x", + (int)esp_sha_mutex_ctx_owner()); + } + #endif + + sha_mutex = NULL; + + ESP_LOGV(TAG, "Revert to ctx->mode = ESP32_SHA_SW."); - ESP_LOGI(TAG, "Revert to ctx->mode = ESP32_SHA_SW."); ctx->mode = ESP32_SHA_SW; - return 0; /* success, just not using HW */ + return ESP_OK; /* success, just not using HW */ + } + } + +#ifdef ESP_MONITOR_HW_TASK_LOCK + /* Nothing happening here other than messages based on mutex states */ + if (mutex_ctx_task == 0 || mutex_ctx_owner == 0) { + /* no known stray mutex task owner */ + } + else { + if (mutex_ctx_task == xTaskGetCurrentTaskHandle()) { + ESP_LOGV(TAG, "Found mutex_ctx_task"); + if (((WC_ESP32SHA*)mutex_ctx_owner)->mode == ESP32_SHA_FREED) { + ESP_LOGW(TAG, "ESP32_SHA_FREED unlocking mutex_ctx_task = %x" + " for mutex_ctx_owner = %x", + (int)mutex_ctx_task, + (int)mutex_ctx_owner); + } + else { + if (ctx->mode == ESP32_SHA_FREED) { + ESP_LOGW(TAG, "ESP32_SHA_FREED unlocking (disabled) " + "ctx = %x for ctx.initializer = %x", + (uintptr_t)ctx, + (uintptr_t)ctx->initializer); + } + else { + /* Not very interesting during init. */ + if (ctx->mode == ESP32_SHA_INIT) { + ESP_LOGV(TAG, "mutex_ctx_owner = 0x%x", + mutex_ctx_owner); + ESP_LOGV(TAG, "This ctx = 0x%x is ESP32_SHA_INIT", + (uintptr_t)ctx); + } + else { + ESP_LOGW(TAG, "Not Freed!"); + } + } /* ctx ESP32_SHA_FREED check */ + } /* mutex owner ESP32_SHA_FREED check */ + } /* mutex_ctx_task is current task */ + else { + ESP_LOGW(TAG, "Warning: sha mutex unlock from unexpected task"); } } +#endif /* ESP_MONITOR_HW_TASK_LOCK */ /* check if this SHA has been operated as SW or HW, or not yet init */ if (ctx->mode == ESP32_SHA_INIT) { /* try to lock the HW engine */ - ESP_LOGV(TAG, "ESP32_SHA_INIT\n"); +#ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGI(TAG, "ESP32_SHA_INIT for %x\n", (uintptr_t)ctx->initializer); +#endif + ESP_LOGV(TAG, "Init; release unfinished ESP32_SHA_INIT lock " + "for ctx 0x%x", (uintptr_t)ctx); + esp_sha_release_unfinished_lock(ctx); + + /* lock hardware; there should be exactly one instance + * of esp_CryptHwMutexLock(&sha_mutex ...) in code. + * + * we don't wait: + * either the engine is free, or we fall back to SW. + * + * TODO: allow for SHA interleave on chips that support it. + */ + + if ((mutex_ctx_owner == NULLPTR) && + esp_CryptHwMutexLock(&sha_mutex, (TickType_t)0) == ESP_OK) { + /* we've successfully locked */ + mutex_ctx_owner = (uintptr_t)ctx; + ESP_LOGV(TAG, "Assigned mutex_ctx_owner to 0x%x", mutex_ctx_owner); + #ifdef ESP_MONITOR_HW_TASK_LOCK + mutex_ctx_task = xTaskGetCurrentTaskHandle(); + #endif + + #ifdef WOLFSSL_DEBUG_MUTEX + if (WOLFSSL_TEST_STRAY_INJECT) { + ESP_LOGW(TAG, "Introducing SHA stray for testing"); + /* Once we've locked [n] times here, + * we'll force a fallback to SW until other thread unlocks. */ + taskENTER_CRITICAL(&sha_crit_sect); + { + (void)stray_ctx; + if (stray_ctx == NULL) { + /* no peek task */ + } + else { + stray_ctx->initializer = (intptr_t)stray_ctx; + mutex_ctx_owner = (intptr_t)stray_ctx->initializer; + } + } + taskEXIT_CRITICAL(&sha_crit_sect); + if (stray_ctx == NULL) { + ESP_LOGW(TAG, "WOLFSSL_DEBUG_MUTEX on, but stray_ctx " + "is NULL; are you running the peek task to " + "set the stay test?"); + } + else { + ESP_LOGI(TAG, "%x", (uintptr_t)stray_ctx->initializer); + ESP_LOGI(TAG, "%x", (uintptr_t)&stray_ctx); + ESP_LOGW(TAG, + "\n\nLocking with stray\n\n" + "WOLFSSL_DEBUG_MUTEX call count 8, " + "ctx->mode = ESP32_SHA_SW %x\n\n", + (int)mutex_ctx_owner); + ctx->task_owner = xTaskGetCurrentTaskHandle(); + ctx->mode = ESP32_SHA_SW; + return ESP_OK; /* success, but revert to SW */ + } + } + #endif - /* we don't wait: - ** either the engine is free, or we fall back to SW - **/ - if (esp_CryptHwMutexLock(&sha_mutex, (TickType_t)0) == 0) { /* check to see if we had a prior fail and need to unroll enables */ - ret = esp_unroll_sha_module_enable(ctx); - ESP_LOGV(TAG, "Hardware Mode, lock depth = %d, %x", - ctx->lockDepth, (int)ctx->initializer); + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGW(TAG, "Locking for ctx %x, current mutex_ctx_owner = %x", + (uintptr_t)&ctx, esp_sha_mutex_ctx_owner()); + ESP_LOGI(TAG, "ctx->lockDepth = %d", ctx->lockDepth); + #endif + if (ctx->mode == ESP32_SHA_INIT) { + /* Set non-single-threaded hardware mode */ + esp_set_hw(ctx); + } + + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGI(TAG, "Hardware Mode Active, lock depth = %d, for %x", + ctx->lockDepth, (uintptr_t)ctx->initializer); + #endif + #ifdef WOLFSSL_DEBUG_MUTEX + taskENTER_CRITICAL(&sha_crit_sect); + { + mutex_ctx_owner = (uintptr_t)ctx->initializer; + /* let's keep track of how many times we lock this */ + _sha_lock_count++; + } + taskEXIT_CRITICAL(&sha_crit_sect); + #endif if (ctx->lockDepth > 0) { /* it is unlikely that this would ever occur, ** as the mutex should be gate keeping */ ESP_LOGW(TAG, "WARNING: Hardware Mode " - "interesting lock depth = %d, %x", - ctx->lockDepth, (int)ctx->initializer); + "interesting lock depth = %d, for this %x", + ctx->lockDepth, (uintptr_t)ctx->initializer); } } else { - /* We should have otherwise anticipated this; how did we get here? - ** This code should rarely, ideally never be reached. */ - ESP_LOGI(TAG, "\nHardware in use; Mode REVERT to ESP32_SHA_SW\n"); - ctx->mode = ESP32_SHA_SW; - return 0; /* success, but revert to SW */ + /* When the lock is already in use: is it for this ctx? */ + if ((uintptr_t)ctx == esp_sha_mutex_ctx_owner()) { + ESP_LOGV(TAG, "I'm the owner! 0x%x", (uintptr_t)ctx); + ctx->mode = ESP32_SHA_SW; + } + else { + #ifdef WOLFSSL_DEBUG_MUTEX + ESP_LOGW(TAG, "\nHardware in use by %x; " + "Mode REVERT to ESP32_SHA_SW for %x\n", + esp_sha_mutex_ctx_owner(), + (uintptr_t)ctx->initializer); + ESP_LOGI(TAG, "Software Mode, lock depth = %d, for this %x", + ctx->lockDepth, (uintptr_t)ctx->initializer); + ESP_LOGI(TAG, "Current mutext owner = %x", + esp_sha_mutex_ctx_owner()); + #endif + ESP_LOGV(TAG, "I'm not owner! 0x%x; owner = 0x%x", + (uintptr_t)ctx, mutex_ctx_owner); + if (mutex_ctx_owner) { + #ifdef WOLFSSL_DEBUG_MUTEX + ESP_LOGW(TAG, "revert to SW since mutex_ctx_owner = %x" + " but we are currently ctx = %x", + mutex_ctx_owner, (intptr_t)ctx); + #endif + } + else { + /* No ctx mutex owner, so hardware must be free. */ + } + ESP_LOGV(TAG, "Set update ctx->mode = SW (from %d) for 0x%x", + ctx->mode, (uintptr_t)ctx ); + ctx->mode = ESP32_SHA_SW; + } + return ESP_OK; /* success, but revert to SW */ } } /* (ctx->mode == ESP32_SHA_INIT) */ else { /* this should not happen: called during mode != ESP32_SHA_INIT */ ESP_LOGE(TAG, "unexpected error in esp_sha_try_hw_lock."); - return -1; + return ESP_FAIL; } #endif /* not defined(SINGLE_THREADED) */ -#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - /* ESP32-C3 RISC-V TODO */ -#else - if (ret == 0) { + ESP_LOGV(TAG, "ctx->mode = %d", ctx->mode); + if ((ret == ESP_OK) && (ctx->mode == ESP32_SHA_HW)) { ctx->lockDepth++; /* depth for THIS ctx (there could be others!) */ - periph_module_enable(PERIPH_SHA_MODULE); - ctx->mode = ESP32_SHA_HW; + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + { + ESP_LOGI(TAG, "1) Lock depth @ %d = %d for WC_ESP32SHA @ %0x\n", + __LINE__, ctx->lockDepth, (unsigned)ctx); + } + #endif + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + ESP_LOGV(TAG, "ets_sha_enable for RISC-V"); + ets_sha_enable(); + } + #else + ESP_LOGV(TAG, "ets_sha_enable for Xtensa"); + periph_module_enable(PERIPH_SHA_MODULE); + #endif } else { - ESP_LOGW(TAG, ">>>> Other problem; Mode REVERT to ESP32_SHA_SW"); + /* Set to SW */ + #ifdef WOLFSSL_ESP32_CRYPT_DEBUG + if (ret == ESP_OK) { + ESP_LOGW(TAG, "Normal SHA Software fallback mode."); + } + else { + ESP_LOGW(TAG, "Warning: Unexpected Mode REVERT to ESP32_SHA_SW" + ", err = %d", ret); + } + #endif ctx->mode = ESP32_SHA_SW; } -#endif + ESP_LOGV(TAG, "leave esp_sha_hw_lock"); + CTX_STACK_CHECK(ctx); return ret; } /* esp_sha_try_hw_lock */ /* -** release HW engine. when we don't have it locked, SHA module is DISABLED +** Release HW engine. when we don't have it locked, SHA module is DISABLED. +** Note this is not the semaphore tracking who has the HW. */ int esp_sha_hw_unlock(WC_ESP32SHA* ctx) { + int ret = ESP_OK; /* assume success (zero) */ + CTX_STACK_CHECK(ctx); +#ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG ESP_LOGV(TAG, "enter esp_sha_hw_unlock"); - -#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - /* ESP32-C3 RISC-V TODO */ -#else - /* Disable AES hardware */ - periph_module_disable(PERIPH_SHA_MODULE); #endif + /* we'll keep track of our lock depth. * in case of unexpected results, all the periph_module_disable() calls * and periph_module_disable() need to be unwound. * * see ref_counts[periph] in file: periph_ctrl.c */ +#ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGI(TAG, "2) esp_sha_hw_unlock Lock depth @ %d = %d " + "for WC_ESP32SHA ctx @ %p\n", + __LINE__, ctx->lockDepth, ctx); +#endif + + if (ctx->lockDepth > 0) { + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + ets_sha_disable(); /* disable also resets active, ongoing hash */ + ESP_LOGV(TAG, "ets_sha_disable in esp_sha_hw_unlock()"); + #else + periph_module_disable(PERIPH_SHA_MODULE); + #endif ctx->lockDepth--; } else { + ESP_LOGW(TAG, "lockDepth <= 0; Disable SHA module skipped for %x", + (uintptr_t)ctx->initializer); ctx->lockDepth = 0; } -#if defined(SINGLE_THREADED) - InUse = 0; -#else - /* unlock HW engine for next use */ - esp_CryptHwMutexUnLock(&sha_mutex); +#if defined(ESP_MONITOR_HW_TASK_LOCK) && defined(WOLFSSL_ESP32_HW_LOCK_DEBUG) + ESP_LOGI(TAG, "3) esp_sha_hw_unlock Lock depth @ %d = %d " + "for WC_ESP32SHA @ %0x\n", + __LINE__, ctx->lockDepth, (uintptr_t)ctx); #endif - ESP_LOGV(TAG, "leave esp_sha_hw_unlock, %x", (int)ctx->initializer); - return 0; + + if (0 != ctx->lockDepth) { + /* If the lockdepth is not zero, unlock success unknown. */ + ESP_LOGE(TAG, "ERROR Non-zero lockDepth. Stray code lock?"); + ret = ESP_FAIL; + } + else { + #if defined(SINGLE_THREADED) + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + { + ESP_LOGW(TAG, "HW released, not in use."); + } + #endif + InUse = 0; + #else + /* Hardware was unlocked above, now update semaphores. */ + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + { + ESP_LOGW(TAG, "Unlocking for mutex_ctx_owner %x, from ctx 0x%x", + esp_sha_mutex_ctx_owner(), (uintptr_t)ctx); + ESP_LOGV(TAG, "&sha_mutex = %x", (intptr_t)&sha_mutex); + } + #endif /* WOLFSSL_ESP32_HW_LOCK_DEBUG */ + + /* There should be exactly 1 instance of SHA unlock, and it's here: */ + esp_CryptHwMutexUnLock(&sha_mutex); + /* We don't set owner to zero here. The HW is not in use, + * but there may be a WIP hash calc (e.g. sha update). + * NO: mutex_ctx_owner = NULLPTR; */ + + #ifdef ESP_MONITOR_HW_TASK_LOCK + mutex_ctx_task = 0; + #endif + + #endif + + #ifdef WOLFSSL_DEBUG_MUTEX + taskENTER_CRITICAL(&sha_crit_sect); + { + mutex_ctx_owner = 0; + } + taskEXIT_CRITICAL(&sha_crit_sect); + #endif + } + + #ifdef WOLFSSL_ESP32_HW_LOCK_DEBUG + ESP_LOGI(TAG, "leave esp_sha_hw_unlock, %x", + (uintptr_t)ctx->initializer); + #endif + CTX_STACK_CHECK(ctx); + + return ret; } /* esp_sha_hw_unlock */ /* @@ -827,29 +1583,64 @@ * Assumes register already loaded. * Returns a negative value error code upon failure. */ +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /* ESP32-C3 HAL has built-in process start, nothing to declare here. */ +#else + /* Everything else uses esp_sha_start_process() */ static int esp_sha_start_process(WC_ESP32SHA* sha) { - int ret = 0; -#if defined(CONFIG_IDF_TARGET_ESP32S3) + int ret = ESP_OK; +#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) uint8_t HardwareAlgorithm; #endif if (sha == NULL) { return BAD_FUNC_ARG; } + CTX_STACK_CHECK(sha); ESP_LOGV(TAG, " enter esp_sha_start_process"); - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - /* ESP32-C3 RISC-V TODO */ - #elif defined(CONFIG_IDF_TARGET_ESP32S3) +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + ESP_LOGV(TAG, "SHA1 SHA_START_REG"); + if (sha->isfirstblock) { + sha_ll_start_block(SHA2_256); + sha->isfirstblock = 0; + + ESP_LOGV(TAG, " set sha->isfirstblock = 0"); + + #if defined(DEBUG_WOLFSSL) + this_block_num = 1; /* one-based counter, just for debug info */ + #endif + } /* first block */ + else { + sha_ll_continue_block(SHA2_256); + + #if defined(DEBUG_WOLFSSL) + this_block_num++; /* one-based counter */ + ESP_LOGV(TAG, " continue block #%d", this_block_num); + #endif + } /* not first block */ + /***** END CONFIG_IDF_TARGET_ESP32C2 aka ESP8684 or + * CONFIG_IDF_TARGET_ESP32C3 or + * CONFIG_IDF_TARGET_ESP32C6 *****/ +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) /* Translate from Wolf SHA type to hardware algorithm. */ HardwareAlgorithm = 0; switch (sha->sha_type) { case SHA1: HardwareAlgorithm = 0; break; + case SHA2_224: + HardwareAlgorithm = 1; + break; case SHA2_256: HardwareAlgorithm = 2; break; @@ -866,14 +1657,14 @@ default: /* Unsupported SHA mode. */ sha->mode = ESP32_SHA_FAIL_NEED_UNROLL; - return -1; + return ESP_FAIL; } REG_WRITE(SHA_MODE_REG, HardwareAlgorithm); if (sha->isfirstblock) { REG_WRITE(SHA_START_REG, 1); - sha->isfirstblock = false; + sha->isfirstblock = 0; ESP_LOGV(TAG, " set sha->isfirstblock = 0"); @@ -890,7 +1681,9 @@ #endif } /* not first block */ -#else /* not ESP32S3 */ + /* end ESP32S3 */ + +#elif defined(CONFIG_IDF_TARGET_ESP32) if (sha->isfirstblock) { /* start registers for first message block * we don't make any relational memory position assumptions. @@ -918,11 +1711,11 @@ default: sha->mode = ESP32_SHA_FAIL_NEED_UNROLL; - ret = -1; + ret = ESP_FAIL; break; } - sha->isfirstblock = false; + sha->isfirstblock = 0; ESP_LOGV(TAG, " set sha->isfirstblock = 0"); #if defined(DEBUG_WOLFSSL) @@ -960,10 +1753,13 @@ default: /* error for unsupported other values */ sha->mode = ESP32_SHA_FAIL_NEED_UNROLL; - ret = -1; + ret = ESP_FAIL; break; } } + /* end standard ESP32 */ + #else + ESP_LOGE(TAG, "Unsupported hardware"); #endif #if defined(DEBUG_WOLFSSL) @@ -971,10 +1767,12 @@ ESP_LOGV(TAG, " continue block #%d", this_block_num); #endif - ESP_LOGV(TAG, " leave esp_sha_start_process"); + ESP_LOGV(TAG, " leave esp_sha_start_process"); + CTX_STACK_CHECK(sha); - return ret; + return ret; } +#endif /* esp_sha_start_process !CONFIG_IDF_TARGET_ESP32C3/C6 */ /* ** process message block @@ -983,15 +1781,27 @@ const word32* data, word32 len) { - int ret = 0; /* assume success */ + int ret = ESP_OK; /* assume success */ word32 word32_to_save = (len) / (sizeof(word32)); -#ifdef CONFIG_IDF_TARGET_ESP32S3 - uint32_t* MessageSource; - uint32_t* AcceleratorMessage; -#else +#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + word32* MessageSource; + word32* AcceleratorMessage; + #define MAX_SHA_VALUE SHA_TYPE_MAX +#elif CONFIG_IDF_TARGET_ESP32 int i; + /* Only values 0 .. 3 are valid for ESP32; SHA_INVALID = -1 */ + #define MAX_SHA_VALUE 4 +#else + /* Newer SoC devices have a different value: SHA_TYPE_MAX */ + #define MAX_SHA_VALUE SHA_TYPE_MAX #endif ESP_LOGV(TAG, " enter esp_process_block"); + + if ((ctx->sha_type < 0) || (ctx->sha_type > MAX_SHA_VALUE)) { + ESP_LOGE(TAG, "Unexpected sha_type: %d", ctx->sha_type); + } + CTX_STACK_CHECK(ctx); + if (word32_to_save > 0x31) { word32_to_save = 0x31; ESP_LOGE(TAG, " ERROR esp_process_block length exceeds 0x31 words."); @@ -1000,44 +1810,126 @@ /* wait until the engine is available */ ret = wc_esp_wait_until_idle(); -#if CONFIG_IDF_TARGET_ESP32S3 - MessageSource = (uint32_t*)data; - AcceleratorMessage = (uint32_t*)(SHA_TEXT_BASE); - while (word32_to_save--) { - /* Must swap endianness of data loaded into hardware accelerator to produce - * correct result. Using DPORT_REG_WRITE doesn't avoid this for ESP32s3. - * Note: data sheet claims we also need to swap endianness across 64 byte words - * when doing SHA-512, but the SHA-512 result is not correct if you do that. */ - DPORT_REG_WRITE(AcceleratorMessage, __builtin_bswap32(*MessageSource)); - ++AcceleratorMessage; - ++MessageSource; - } /* (word32_to_save--) */ - -#else +#if defined(CONFIG_IDF_TARGET_ESP32) /* load [len] words of message data into HW */ for (i = 0; i < word32_to_save; i++) { - /* by using DPORT_REG_WRITE, we avoid the need + /* By using DPORT_REG_WRITE, we avoid the need * to call __builtin_bswap32 to address endianness. * - * a useful watch array cast to watch at runtime: - * ((uint32_t[32]) (*(volatile uint32_t *)(SHA_TEXT_BASE))) + * A useful watch array cast to watch at runtime: + * ((word32[32]) (*(volatile word32 *)(SHA_TEXT_BASE))) * * Write value to DPORT register (does not require protecting) */ - #if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - /* ESP32-C3 RISC-V TODO */ - #else DPORT_REG_WRITE(SHA_TEXT_BASE + (i*sizeof(word32)), *(data + i)); - #endif /* memw confirmed auto inserted by compiler here */ } -#endif + /* Notify HW to start process + * see ctx->sha_type + * reg data does not change until we are ready to read */ + ret = esp_sha_start_process(ctx); + /***** END CONFIG_IDF_TARGET_ESP32 */ +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /************* RISC-V Architecture ************* + * + * SHA_M_1_REG is not a macro: + * DPORT_REG_WRITE(SHA_M_1_REG + (i*sizeof(word32)), *(data + i)); + * + * but we have this HAL: sha_ll_fill_text_block + * + * Note that unlike the plain ESP32 that has only 1 register, we can write + * the entire block. + * SHA_TEXT_BASE = 0x6003b080 + * SHA_H_BASE = 0x6003b040 + * see hash: (word32[08]) (*(volatile uint32_t *)(SHA_H_BASE)) + * message: (word32[16]) (*(volatile uint32_t *)(SHA_TEXT_BASE)) + * ((word32[16]) (*(volatile uint32_t *)(SHA_TEXT_BASE))) + */ + if (&data != _active_digest_address) { + ESP_LOGV(TAG, "Moving alternate ctx->for_digest"); + /* move last known digest into HW reg during interleave */ + /* sha_ll_write_digest(ctx->sha_type, ctx->for_digest, + WC_SHA256_BLOCK_SIZE); */ + _active_digest_address = &data; + } + if (ctx->isfirstblock) { + ets_sha_enable(); /* will clear initial digest */ + #if defined(DEBUG_WOLFSSL) + { + this_block_num = 1; /* one-based counter, just for debug info */ + } + #endif + } + else { + #if defined(DEBUG_WOLFSSL) + { + this_block_num++; + } + #endif + } + /* call Espressif HAL for this hash*/ + sha_hal_hash_block(ctx->sha_type, + (void *)(data), + word32_to_save, + ctx->isfirstblock); + ctx->isfirstblock = 0; /* once we hash a block, + * we're no longer at the first */ + /***** END CONFIG_IDF_TARGET_ESP32C2 or + * CONFIG_IDF_TARGET_ESP8684 or + * CONFIG_IDF_TARGET_ESP32C3 or + * CONFIG_IDF_TARGET_ESP32C6 */ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + MessageSource = (word32*)data; + AcceleratorMessage = (word32*)(SHA_TEXT_BASE); + while (word32_to_save--) { + /* Must swap endianness of data loaded into hardware accelerator + * to produce correct result. Using DPORT_REG_WRITE doesn't avoid this + * for ESP32s3. + * Note: data sheet claims we also need to swap endianness across + * 64 byte words when doing SHA-512, but the SHA-512 result is not + * correct if you do that. */ + DPORT_REG_WRITE(AcceleratorMessage, __builtin_bswap32(*MessageSource)); + ++AcceleratorMessage; + ++MessageSource; + } /* (word32_to_save--) */ /* notify HW to start process * see ctx->sha_type * reg data does not change until we are ready to read */ ret = esp_sha_start_process(ctx); + /***** END CONFIG_IDF_TARGET_ESP32S2 or CONFIG_IDF_TARGET_ESP32S3 */ + +#else + ret = ESP_FAIL; + ESP_LOGE(TAG, "ERROR: (CONFIG_IDF_TARGET not supported"); +#endif + +#ifdef WOLFSSL_HW_METRICS + switch (ctx->sha_type) { + case SHA1: + esp_sha1_hw_hash_usage_ct++; + break; + + #ifndef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 + case SHA2_224: + esp_sha2_224_hw_hash_usage_ct++; + break; + #endif + + case SHA2_256: + esp_sha2_256_hw_hash_usage_ct++; + break; + + default: + break; + } +#endif + CTX_STACK_CHECK(ctx); ESP_LOGV(TAG, " leave esp_process_block"); return ret; } /* wc_esp_process_block */ @@ -1049,30 +1941,50 @@ { word32 digestSz; -#if CONFIG_IDF_TARGET_ESP32S3 +#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) uint64_t* pHash64Buffer; uint32_t* pHashDestination; size_t szHashWords; size_t szHash64Words; -# endif +#endif ESP_LOGV(TAG, "enter esp_digest_state"); + CTX_STACK_CHECK(ctx); if (ctx == NULL) { return BAD_FUNC_ARG; } /* sanity check */ +#if defined(CONFIG_IDF_TARGET_ESP32) + if (ctx->sha_type == SHA_INVALID) { +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + if (ctx->sha_type >= SHA_TYPE_MAX) { +#else + ESP_LOGE(TAG, "unexpected target for wc_esp_digest_state"); + { +#endif /* conditional sanity check on she_type */ + ctx->mode = ESP32_SHA_FAIL_NEED_UNROLL; + ESP_LOGE(TAG, "error. sha_type %d is invalid.", ctx->sha_type); + return ESP_FAIL; + } + digestSz = wc_esp_sha_digest_size(ctx->sha_type); if (digestSz == 0) { ctx->mode = ESP32_SHA_FAIL_NEED_UNROLL; ESP_LOGE(TAG, "unexpected error. sha_type is invalid."); - return -1; + return ESP_FAIL; } -#if CONFIG_IDF_TARGET_ESP32S3 - if (ctx->isfirstblock == true) { + +#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) + if (ctx->isfirstblock == 1) { /* no hardware use yet. Nothing to do yet */ - return 0; + return ESP_OK; } /* wait until idle */ @@ -1080,7 +1992,7 @@ /* read hash result into buffer & flip endianness */ pHashDestination = (uint32_t*)hash; - szHashWords = wc_esp_sha_digest_size(ctx->sha_type) / sizeof(uint32_t); + szHashWords = wc_esp_sha_digest_size(ctx->sha_type) / sizeof(word32); esp_dport_access_read_buffer(pHashDestination, SHA_H_BASE, szHashWords); if (ctx->sha_type == SHA2_512) { @@ -1101,15 +2013,37 @@ } /* not (ctx->sha_type == SHA2_512) */ /* end if CONFIG_IDF_TARGET_ESP32S3 */ +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + wc_esp_wait_until_idle(); + sha_ll_read_digest( + ctx->sha_type, + (void *)hash, + wc_esp_sha_digest_size(ctx->sha_type) / sizeof(word32) + ); +#elif defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + wc_esp_wait_until_idle(); + sha_ll_read_digest( + ctx->sha_type, + (void *)hash, + wc_esp_sha_digest_size(ctx->sha_type) / sizeof(word32) + ); #else - /* not CONFIG_IDF_TARGET_ESP32S3 */ + /* Not CONFIG_IDF_TARGET_ESP32S3 */ /* wait until idle */ wc_esp_wait_until_idle(); /* each sha_type register is at a different location */ -#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) - /* ESP32-C3 RISC-V TODO */ +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #else + switch (ctx->sha_type) { case SHA1: DPORT_REG_WRITE(SHA_1_LOAD_REG, 1); @@ -1133,12 +2067,12 @@ default: ctx->mode = ESP32_SHA_FAIL_NEED_UNROLL; - return -1; + return ESP_FAIL; } - if (ctx->isfirstblock == true) { + if (ctx->isfirstblock == 1) { /* no hardware use yet. Nothing to do yet */ - return 0; + return ESP_OK; } /* LOAD final digest */ @@ -1160,13 +2094,15 @@ * example: * DPORT_SEQUENCE_REG_READ(address + i * 4); */ - + #ifdef WOLFSSL_ESP32_CRYPT_DEBUG + ESP_LOGW(TAG, "SHA HW read..."); + #endif esp_dport_access_read_buffer( -#if ESP_IDF_VERSION_MAJOR >= 4 + #if ESP_IDF_VERSION_MAJOR >= 4 (uint32_t*)(hash), /* the result will be found in hash upon exit */ -#else + #else (word32*)(hash), /* the result will be found in hash upon exit */ -#endif + #endif SHA_TEXT_BASE, /* there's a fixed reg addr for all SHA */ digestSz / sizeof(word32) /* # 4-byte */ ); @@ -1183,11 +2119,12 @@ pwrd1[i] ^= pwrd1[i + 1]; } } -#endif -#endif /* not CONFIG_IDF_TARGET_ESP32S3 */ +#endif /* SHA512 or SHA384*/ +#endif /* not CONFIG_IDF_TARGET_ESP32S3, C3, else... */ + CTX_STACK_CHECK(ctx); ESP_LOGV(TAG, "leave esp_digest_state"); - return 0; + return ESP_OK; } /* wc_esp_digest_state */ #ifndef NO_SHA @@ -1222,14 +2159,20 @@ ret = wc_esp_digest_state(&sha->ctx, (byte*)sha->digest); + if (blockprocess) { + ESP_LOGV(TAG, "esp_sha_digest_process NEW UNLOCK"); + esp_sha_hw_unlock(&sha->ctx); /* also unlocks mutex */ + ESP_LOGV(TAG, "sha blockprocess mutex_ctx_owner = NULLPTR"); + mutex_ctx_owner = NULLPTR; + } + ESP_LOGV(TAG, "leave esp_sha_digest_process"); return ret; } /* esp_sha_digest_process */ #endif /* NO_SHA */ - -#ifndef NO_SHA256 +#if !defined(NO_SHA256) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) /* ** sha256 process ** @@ -1239,19 +2182,33 @@ { int ret = 0; - ESP_LOGV(TAG, " enter esp_sha256_process"); - - if ((&sha->ctx)->sha_type == SHA2_256) { + switch ((&sha->ctx)->sha_type) { + case SHA2_256: #if defined(DEBUG_WOLFSSL_VERBOSE) - ESP_LOGV(TAG, " confirmed SHA type call match"); + ESP_LOGV(TAG, " confirmed SHA256 type call match"); #endif - } - else { - ret = -1; + wc_esp_process_block(&sha->ctx, + (const word32*)data, + WC_SHA256_BLOCK_SIZE); + break; + +#if defined(WOLFSSL_SHA224) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224) + case SHA2_224: + #if defined(DEBUG_WOLFSSL_VERBOSE) + ESP_LOGV(TAG, " confirmed SHA224 type call match"); + #endif + wc_esp_process_block(&sha->ctx, + (const word32*)data, + WC_SHA224_BLOCK_SIZE); + break; +#endif + + default: + ret = ESP_FAIL; ESP_LOGE(TAG, " ERROR SHA type call mismatch"); + break; } - wc_esp_process_block(&sha->ctx, (const word32*)data, WC_SHA256_BLOCK_SIZE); ESP_LOGV(TAG, " leave esp_sha256_process"); @@ -1266,16 +2223,27 @@ */ int esp_sha256_digest_process(struct wc_Sha256* sha, byte blockprocess) { - int ret = 0; + int ret = ESP_OK; ESP_LOGV(TAG, "enter esp_sha256_digest_process"); +#ifndef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 if (blockprocess) { wc_esp_process_block(&sha->ctx, sha->buffer, WC_SHA256_BLOCK_SIZE); } wc_esp_digest_state(&sha->ctx, (byte*)sha->digest); + if (blockprocess) { + ESP_LOGV(TAG, "esp_sha256_digest_process blockprocess UNLOCK"); + esp_sha_hw_unlock(&sha->ctx); /* also unlocks mutex */ + ESP_LOGV(TAG, "blockprocess mutex_ctx_owner = NULLPTR"); + mutex_ctx_owner = NULLPTR; + } +#else + ESP_LOGE(TAG, "Call esp_sha256_digest_process with " + "NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 "); +#endif ESP_LOGV(TAG, "leave esp_sha256_digest_process"); return ret; } /* esp_sha256_digest_process */ @@ -1283,7 +2251,10 @@ #endif /* NO_SHA256 */ -#if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) +#if !(defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) && \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) \ + ) && \ + (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) /* ** sha512 process. this is used for sha384 too. */ @@ -1293,6 +2264,12 @@ ESP_LOGV(TAG, "enter esp_sha512_block"); /* start register offset */ +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /* No SHA-512 HW on RISC-V SoC, so nothing to do. */ +#else /* note that in SW mode, wolfSSL uses 64 bit words */ if (sha->ctx.mode == ESP32_SHA_SW) { ByteReverseWords64(sha->buffer, @@ -1321,6 +2298,7 @@ ret = wc_esp_process_block(&sha->ctx, data, WC_SHA512_BLOCK_SIZE); } ESP_LOGV(TAG, "leave esp_sha512_block"); +#endif return ret; } /* esp_sha512_block */ @@ -1329,7 +2307,7 @@ */ int esp_sha512_process(struct wc_Sha512* sha) { - int ret = 0; /* assume success */ + int ret = ESP_OK; /* assume success */ word32 *data = (word32*)sha->buffer; ESP_LOGV(TAG, "enter esp_sha512_process"); @@ -1347,12 +2325,21 @@ { int ret = 0; ESP_LOGV(TAG, "enter esp_sha512_digest_process"); - +#if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + { + ESP_LOGW(TAG, "Warning: no SHA512 HW to digest on %s", + CONFIG_IDF_TARGET); + } +#else if (blockproc) { word32* data = (word32*)sha->buffer; ret = esp_sha512_block(sha, data, 1); } + if (sha->ctx.mode == ESP32_SHA_HW) { ret = wc_esp_digest_state(&sha->ctx, (byte*)sha->digest); } @@ -1360,9 +2347,82 @@ ESP_LOGW(TAG, "Call esp_sha512_digest_process in non-HW mode?"); } + if (blockproc) { + ESP_LOGV(TAG, "esp_sha512_digest_process NEW UNLOCK"); + esp_sha_hw_unlock(&sha->ctx); /* also unlocks mutex */ + ESP_LOGV(TAG, "mutex_ctx_owner = NULLPTR"); + mutex_ctx_owner = NULLPTR; + } ESP_LOGV(TAG, "leave esp_sha512_digest_process"); +#endif return ret; } /* esp_sha512_digest_process */ #endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */ -#endif /* WOLFSSL_ESP32WROOM32_CRYPT */ +#endif /* WOLFSSL_ESP32_CRYPT */ #endif /* !defined(NO_SHA) ||... */ + +#if defined(WOLFSSL_ESP32_CRYPT) && defined(WOLFSSL_HW_METRICS) +int esp_sw_sha256_count_add(void) { + int ret = 0; +#if !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + esp_sha256_sw_fallback_usage_ct++; + ret = esp_sha256_sw_fallback_usage_ct; +#endif + return ret; +} + +int esp_hw_show_sha_metrics(void) +{ + int ret = 0; +#if defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + ESP_LOGI(TAG, "--------------------------------------------------------"); + ESP_LOGI(TAG, "------------- wolfSSL ESP HW SHA Metrics----------------"); + ESP_LOGI(TAG, "--------------------------------------------------------"); + + ESP_LOGI(TAG, "esp_sha_hw_copy_ct = %lu", + esp_sha_hw_copy_ct); + ESP_LOGI(TAG, "esp_sha1_hw_usage_ct = %lu", + esp_sha1_hw_usage_ct); + ESP_LOGI(TAG, "esp_sha1_sw_fallback_usage_ct = %lu", + esp_sha1_sw_fallback_usage_ct); + ESP_LOGI(TAG, "esp_sha_reverse_words_ct = %lu", + esp_sha_reverse_words_ct); + ESP_LOGI(TAG, "esp_sha1_hw_hash_usage_ct = %lu", + esp_sha1_hw_hash_usage_ct); + ESP_LOGI(TAG, "esp_sha2_224_hw_hash_usage_ct = %lu", + esp_sha2_224_hw_hash_usage_ct); + ESP_LOGI(TAG, "esp_sha2_256_hw_hash_usage_ct = %lu", + esp_sha2_256_hw_hash_usage_ct); + ESP_LOGI(TAG, "esp_byte_reversal_checks_ct = %lu", + esp_byte_reversal_checks_ct); + ESP_LOGI(TAG, "esp_byte_reversal_needed_ct = %lu", + esp_byte_reversal_needed_ct); + +#else + /* no HW math, no HW math metrics */ + ret = 0; +#endif /* HW_MATH_ENABLED */ + + return ret; +} + +#endif /* WOLFSSL_ESP32_CRYPT and WOLFSSL_HW_METRICS */ + +#if defined(WOLFSSL_STACK_CHECK) +int esp_sha_stack_check(WC_ESP32SHA* sha) { + int ret = ESP_OK; + + if (sha == NULL) { + ESP_LOGW(TAG, "esp_sha_stack_check; sha is NULL"); + } + else { + if (sha->first_word != 0 || sha->last_word != 0) { + ESP_LOGE(TAG, "esp_sha_stack_check warning"); + ret = ESP_FAIL; + } + } + return ret; +} +#endif /* WOLFSSL_STACK_CHECK */ + +#endif /* WOLFSSL_ESPIDF (exclude entire contents for non-Espressif projects. */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_util.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_util.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_util.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp32_util.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* esp32_util.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -18,10 +18,58 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +/* Reminder: user_settings.h is needed and included from settings.h + * Be sure to define WOLFSSL_USER_SETTINGS, typically in CMakeLists.txt */ #include + +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ +#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#include + +/* Espressif */ +#include +#include +#if ESP_IDF_VERSION_MAJOR > 4 + #include + #include +#endif +/* wolfSSL */ +#include /* needed to print MATH_INT_T value */ +#include #include -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ +/* +** Version / Platform info. +** +** This could evolve into a wolfSSL-wide feature. For now, here only. See: +** https://github.com/wolfSSL/wolfssl/pull/6149 +*/ + +#define WOLFSSL_VERSION_PRINTF(...) ESP_LOGI(TAG, __VA_ARGS__) +/* + * If used in other platforms: + * #include + * #define WOLFSSL_VERSION_PRINTF(...) { printf(__VA_ARGS__); printf("\n"); } + */ + +static const char* TAG = "esp32_util"; + +/* Variable holding number of times ESP32 restarted since first boot. + * It is placed into RTC memory using RTC_DATA_ATTR and + * maintains its value when ESP32 wakes from deep sleep. + */ +RTC_DATA_ATTR static int _boot_count = 0; +static int esp_ShowMacroStatus_need_header = 0; +/* Some helpers for macro display */ +#define STRING_OF(macro) #macro +#define STR_IFNDEF(macro) STRING_OF(macro) + +#if defined(WOLFSSL_ESP32_CRYPT) && \ (!defined(NO_AES) || !defined(NO_SHA) || !defined(NO_SHA256) ||\ defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)) @@ -29,6 +77,8 @@ #include #include +/* big nums can be very long, perhaps uninitialized, so limit displayed words */ +#define MAX_WORDS_ESP_SHOW_MP 32 /* * initialize our mutex used to lock hardware access @@ -49,9 +99,10 @@ /* * call the ESP-IDF mutex lock; xSemaphoreTake - * + * this is a general mutex locker, used for different mutex objects for + * different HW acclerators or other single-use HW features. */ -int esp_CryptHwMutexLock(wolfSSL_Mutex* mutex, TickType_t xBlockTime) { +int esp_CryptHwMutexLock(wolfSSL_Mutex* mutex, TickType_t block_time) { if (mutex == NULL) { WOLFSSL_ERROR_MSG("esp_CryptHwMutexLock called with null mutex"); return BAD_MUTEX_E; @@ -60,7 +111,7 @@ #ifdef SINGLE_THREADED return wc_LockMutex(mutex); /* xSemaphoreTake take with portMAX_DELAY */ #else - return ((xSemaphoreTake( *mutex, xBlockTime ) == pdTRUE) ? 0 : BAD_MUTEX_E); + return ((xSemaphoreTake(*mutex, block_time) == pdTRUE) ? 0 : BAD_MUTEX_E); #endif } @@ -68,7 +119,7 @@ * call the ESP-IDF mutex UNlock; xSemaphoreGive * */ -int esp_CryptHwMutexUnLock(wolfSSL_Mutex* mutex) { +esp_err_t esp_CryptHwMutexUnLock(wolfSSL_Mutex* mutex) { if (mutex == NULL) { WOLFSSL_ERROR_MSG("esp_CryptHwMutexLock called with null mutex"); return BAD_MUTEX_E; @@ -78,25 +129,16 @@ return wc_UnLockMutex(mutex); #else xSemaphoreGive(*mutex); - return 0; + return ESP_OK; #endif } +#endif /* WOLFSSL_ESP32_CRYPT, etc. */ -/* -** Version / Platform info. + +/* esp_ShowExtendedSystemInfo and supporting info. ** -** This could evolve into a wolfSSL-wide feature. For now, here only. See: -** https://github.com/wolfSSL/wolfssl/pull/6149 +** available regardless if HW acceleration is turned on or not. */ -#if defined(WOLFSSL_ESPIDF) - #include - #include "sdkconfig.h" - const char* TAG = "Version Info"; - #define WOLFSSL_VERSION_PRINTF(...) ESP_LOGI(TAG, __VA_ARGS__) -#else - #include - #define WOLFSSL_VERSION_PRINTF(...) { printf(__VA_ARGS__); printf("\n"); } -#endif /* ******************************************************************************* @@ -108,8 +150,15 @@ ** Specific platforms: Espressif */ #if defined(WOLFSSL_ESPIDF) -static int ShowExtendedSystemInfo_platform_espressif() +static int ShowExtendedSystemInfo_platform_espressif(void) { +#ifdef WOLFSSL_ESP_NO_WATCHDOG + ESP_LOGI(TAG, "Found WOLFSSL_ESP_NO_WATCHDOG"); +#else + ESP_LOGW(TAG, "Watchdog active; " + "missing WOLFSSL_ESP_NO_WATCHDOG definition."); +#endif + #if defined(CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ) WOLFSSL_VERSION_PRINTF("CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ: %u MHz", CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ); @@ -147,15 +196,24 @@ char thisHWM = 0; WOLFSSL_VERSION_PRINTF("Stack HWM: %x", (size_t) &thisHWM); #else - WOLFSSL_VERSION_PRINTF("Stack HWM: %d", - uxTaskGetStackHighWaterMark(NULL)); + #ifdef INCLUDE_uxTaskGetStackHighWaterMark + { + WOLFSSL_VERSION_PRINTF("Stack HWM: %d", + uxTaskGetStackHighWaterMark(NULL)); + } + #endif /* INCLUDE_uxTaskGetStackHighWaterMark */ + #endif #elif CONFIG_IDF_TARGET_ESP32S2 WOLFSSL_VERSION_PRINTF("Xthal_have_ccount = %u", Xthal_have_ccount); #elif CONFIG_IDF_TARGET_ESP32C6 - /* not supported at this time */ + /* TODO find Xthal for C6 */ +#elif CONFIG_IDF_TARGET_ESP32C2 + /* TODO find Xthal for C6 */ +#elif defined(CONFIG_IDF_TARGET_ESP8684) + /* TODO find Xthal for C6 */ #elif CONFIG_IDF_TARGET_ESP32C3 /* not supported at this time */ #elif CONFIG_IDF_TARGET_ESP32S3 @@ -169,41 +227,74 @@ /* not supported at this time */ #endif - /* check to see if we are using hardware encryption */ -#if defined(NO_ESP32WROOM32_CRYPT) - WOLFSSL_VERSION_PRINTF("NO_ESP32WROOM32_CRYPT defined! " +/* check to see if we are using hardware encryption */ +#if defined(CONFIG_IDF_TARGET_ESP8266) + WOLFSSL_VERSION_PRINTF("No HW acceleration on ESP8266."); +#elif defined(NO_ESP32_CRYPT) + WOLFSSL_VERSION_PRINTF("NO_ESP32_CRYPT defined! " "HW acceleration DISABLED."); #else /* first show what platform hardware acceleration is enabled ** (some new platforms may not be supported yet) */ -#if defined(CONFIG_IDF_TARGET_ESP32) - WOLFSSL_VERSION_PRINTF("ESP32WROOM32_CRYPT is enabled for ESP32."); -#elif defined(CONFIG_IDF_TARGET_ESP32S2) - WOLFSSL_VERSION_PRINTF("ESP32WROOM32_CRYPT is enabled for ESP32-S2."); -#elif defined(CONFIG_IDF_TARGET_ESP32S3) - WOLFSSL_VERSION_PRINTF("ESP32WROOM32_CRYPT is enabled for ESP32-S3."); -#else -#error "ESP32WROOM32_CRYPT not yet supported on this IDF TARGET" -#endif + #if defined(CONFIG_IDF_TARGET_ESP32) + WOLFSSL_VERSION_PRINTF("ESP32_CRYPT is enabled for ESP32."); + #elif defined(CONFIG_IDF_TARGET_ESP32S2) + WOLFSSL_VERSION_PRINTF("ESP32_CRYPT is enabled for ESP32-S2."); + #elif defined(CONFIG_IDF_TARGET_ESP32S3) + WOLFSSL_VERSION_PRINTF("ESP32_CRYPT is enabled for ESP32-S3."); + #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + WOLFSSL_VERSION_PRINTF("ESP32_CRYPT is enabled for ESP32-C2."); + #elif defined(CONFIG_IDF_TARGET_ESP32C3) + WOLFSSL_VERSION_PRINTF("ESP32_CRYPT is enabled for ESP32-C3."); + #elif defined(CONFIG_IDF_TARGET_ESP32C6) + WOLFSSL_VERSION_PRINTF("ESP32_CRYPT is enabled for ESP32-C6."); + #elif defined(CONFIG_IDF_TARGET_ESP32H2) + WOLFSSL_VERSION_PRINTF("ESP32_CRYPT is enabled for ESP32-H2."); + #else + /* This should have been detected & disabled in user_settins.h */ + #error "ESP32_CRYPT not yet supported on this IDF TARGET" + #endif /* Even though enabled, some specifics may be disabled */ -#if defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) - WOLFSSL_VERSION_PRINTF("NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH is defined!" - "(disabled HW SHA)."); + #if defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + WOLFSSL_VERSION_PRINTF("NO_WOLFSSL_ESP32_CRYPT_HASH is defined!" + "(disabled HW SHA)."); + #endif + + #if defined(NO_WOLFSSL_ESP32_CRYPT_AES) + WOLFSSL_VERSION_PRINTF("NO_WOLFSSL_ESP32_CRYPT_AES is defined! " + "(disabled HW AES)."); + #endif + + #if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI) + WOLFSSL_VERSION_PRINTF("NO_WOLFSSL_ESP32_CRYPT_RSA_PRI defined! " + "(disabled HW RSA)"); + #endif +#endif + +#if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + WOLFSSL_VERSION_PRINTF("SM Ciphers enabled"); + #if defined(WOLFSSL_SM2) + WOLFSSL_VERSION_PRINTF(" WOLFSSL_SM2 enabled"); + #else + WOLFSSL_VERSION_PRINTF(" WOLFSSL_SM2 NOT enabled"); + #endif + + #if defined(WOLFSSL_SM3) + WOLFSSL_VERSION_PRINTF(" WOLFSSL_SM3 enabled"); + #else + WOLFSSL_VERSION_PRINTF(" WOLFSSL_SM3 NOT enabled"); + #endif + + #if defined(WOLFSSL_SM4) + WOLFSSL_VERSION_PRINTF(" WOLFSSL_SM4 enabled"); + #else + WOLFSSL_VERSION_PRINTF(" WOLFSSL_SM4 NOT enabled"); + #endif #endif -#if defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES) - WOLFSSL_VERSION_PRINTF("NO_WOLFSSL_ESP32WROOM32_CRYPT_AES is defined!" - "(disabled HW AES)."); -#endif - -#if defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - WOLFSSL_VERSION_PRINTF("NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI defined!" - "(disabled HW RSA)"); -#endif -#endif - - return 0; + return ESP_OK; } #endif @@ -216,22 +307,21 @@ /* ** All platforms: git details */ -static int ShowExtendedSystemInfo_git() +static int ShowExtendedSystemInfo_git(void) { -#if defined(HAVE_WC_INTROSPECTION) && !defined(ALLOW_BINARY_MISMATCH_INTROSPECTION) -#pragma message("WARNING: both HAVE_VERSION_EXTENDED_INFO and " \ - "HAVE_WC_INTROSPECTION are enabled. Some extended " \ - "information details will not be available.") - - WOLFSSL_VERSION_PRINTF("HAVE_WC_INTROSPECTION enabled. " - "Some extended system details not available."); -#else /* Display some interesting git values that may change, ** but not desired for introspection which requires object code to be ** maximally bitwise-invariant. */ + +#if defined(LIBWOLFSSL_VERSION_GIT_TAG) + /* git config describe --tags --abbrev=0 */ + WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_GIT_TAG = %s", + LIBWOLFSSL_VERSION_GIT_TAG); +#endif + #if defined(LIBWOLFSSL_VERSION_GIT_ORIGIN) - /* git config --get remote.origin.url */ + /* git config --get remote.origin.url */ WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_GIT_ORIGIN = %s", LIBWOLFSSL_VERSION_GIT_ORIGIN); #endif @@ -243,28 +333,30 @@ #endif #if defined(LIBWOLFSSL_VERSION_GIT_HASH) + /* git rev-parse HEAD */ WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_GIT_HASH = %s", LIBWOLFSSL_VERSION_GIT_HASH); #endif #if defined(LIBWOLFSSL_VERSION_GIT_SHORT_HASH ) + /* git rev-parse --short HEAD */ WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_GIT_SHORT_HASH = %s", LIBWOLFSSL_VERSION_GIT_SHORT_HASH); #endif #if defined(LIBWOLFSSL_VERSION_GIT_HASH_DATE) + /* git show --no-patch --no-notes --pretty=\'\%cd\' */ WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_GIT_HASH_DATE = %s", LIBWOLFSSL_VERSION_GIT_HASH_DATE); #endif -#endif /* else not HAVE_WC_INTROSPECTION */ - return 0; + return ESP_OK; } /* ** All platforms: thread details */ -static int ShowExtendedSystemInfo_thread() +static int ShowExtendedSystemInfo_thread(void) { /* all platforms: stack high water mark check */ #if defined(SINGLE_THREADED) @@ -272,13 +364,13 @@ #else WOLFSSL_VERSION_PRINTF("NOT SINGLE_THREADED"); #endif - return 0; + return ESP_OK; } /* ** All Platforms: platform details */ -static int ShowExtendedSystemInfo_platform() +static int ShowExtendedSystemInfo_platform(void) { #if defined(WOLFSSL_ESPIDF) #if defined(CONFIG_IDF_TARGET) @@ -287,49 +379,529 @@ ShowExtendedSystemInfo_platform_espressif(); #endif #endif - return 0; + return ESP_OK; +} + +int esp_increment_boot_count(void) +{ + return ++_boot_count; +} + +int esp_current_boot_count(void) +{ + return _boot_count; +} + +/* See macro helpers above; not_defined is macro name when *not* defined */ +static int show_macro(char* s, char* not_defined) +{ + const char hd1[] = "Macro Name Defined Not Defined"; + char hd2[] = "------------------------- --------- -------------"; + char msg[] = "......................... "; + /* 012345678901234567890123456789012345678901234567890 */ + /* 1 2 3 4 5 */ + size_t i = 0; + #define MAX_STATUS_NAME_LENGTH 25 + #define ESP_SMS_ENA_POS 30 + #define ESP_SMS_DIS_POS 42 + + /* save our string (s) into the space-padded message (msg) */ + while (s[i] != '\0' && msg[i] != '\0' && (i < MAX_STATUS_NAME_LENGTH)) { + msg[i] = s[i]; + i++; + } + + /* Depending on if defined, put an "x" in the appropriate column */ + if (not_defined == NULL || not_defined[0] == '\0') { + msg[ESP_SMS_ENA_POS] = 'X'; + msg[ESP_SMS_ENA_POS+1] = 0; /* end of line to eliminate space pad */ + } + else { + msg[ESP_SMS_DIS_POS] = 'X'; + msg[ESP_SMS_DIS_POS+1] = 0; /* end of line to eliminate space pad */ + } + + /* do we need a header? */ + if (esp_ShowMacroStatus_need_header) { + ESP_LOGI(TAG, "%s", hd1); + ESP_LOGI(TAG, "%s", hd2); + esp_ShowMacroStatus_need_header = 0; + } + + /* show the macro name with the "x" in the defined/not defined column */ + ESP_LOGI(TAG, "%s", msg); + return ESP_OK; } +/* Show some interesting settings */ +esp_err_t ShowExtendedSystemInfo_config(void) +{ + esp_ShowMacroStatus_need_header = 1; + + show_macro("NO_ESPIDF_DEFAULT", STR_IFNDEF(NO_ESPIDF_DEFAULT)); + + show_macro("HW_MATH_ENABLED", STR_IFNDEF(HW_MATH_ENABLED)); + + /* Features */ + show_macro("WOLFSSL_SHA224", STR_IFNDEF(WOLFSSL_SHA224)); + show_macro("WOLFSSL_SHA384", STR_IFNDEF(WOLFSSL_SHA384)); + show_macro("WOLFSSL_SHA512", STR_IFNDEF(WOLFSSL_SHA512)); + show_macro("WOLFSSL_SHA3", STR_IFNDEF(WOLFSSL_SHA3)); + show_macro("HAVE_ED25519", STR_IFNDEF(HAVE_ED25519)); + show_macro("HAVE_AES_ECB", STR_IFNDEF(HAVE_AES_ECB)); + show_macro("HAVE_AES_DIRECT", STR_IFNDEF(HAVE_AES_DIRECT)); + + /* Math Library Selection */ + show_macro("USE_FAST_MATH", STR_IFNDEF(USE_FAST_MATH)); + show_macro("WOLFSSL_SP_MATH_ALL", STR_IFNDEF(WOLFSSL_SP_MATH_ALL)); +#ifdef WOLFSSL_SP_RISCV32 + show_macro("WOLFSSL_SP_RISCV32", STR_IFNDEF(WOLFSSL_SP_RISCV32)); +#endif + show_macro("SP_MATH", STR_IFNDEF(SP_MATH)); + + /* Diagnostics */ + show_macro("WOLFSSL_HW_METRICS", STR_IFNDEF(WOLFSSL_HW_METRICS)); + + /* Optimizations */ + show_macro("RSA_LOW_MEM", STR_IFNDEF(RSA_LOW_MEM)); + show_macro("SMALL_SESSION_CACHE", STR_IFNDEF(SMALL_SESSION_CACHE)); + + /* Security Hardening */ + show_macro("WC_NO_HARDEN", STR_IFNDEF(WC_NO_HARDEN)); + show_macro("TFM_TIMING_RESISTANT", STR_IFNDEF(TFM_TIMING_RESISTANT)); + show_macro("ECC_TIMING_RESISTANT", STR_IFNDEF(ECC_TIMING_RESISTANT)); + + /* WC_NO_CACHE_RESISTANT is only important if another process can be + * run on the device. With embedded it is less likely to be exploitable. + * Timing attacks are usually by probe. So typically turn this on: */ + show_macro("WC_NO_CACHE_RESISTANT", STR_IFNDEF(WC_NO_CACHE_RESISTANT)); + + /* Side channel bit slicing */ + show_macro("WC_AES_BITSLICED", STR_IFNDEF(WC_AES_BITSLICED)); + + /* Unrolling will normally improve performance, + * so make sure WOLFSSL_AES_NO_UNROLL isn't defined unless you want it. */ + show_macro("WOLFSSL_AES_NO_UNROLL", STR_IFNDEF(WOLFSSL_AES_NO_UNROLL)); + show_macro("TFM_TIMING_RESISTANT", STR_IFNDEF(TFM_TIMING_RESISTANT)); + show_macro("ECC_TIMING_RESISTANT", STR_IFNDEF(ECC_TIMING_RESISTANT)); + + /* WC_RSA_BLINDING takes up additional space: */ + show_macro("WC_RSA_BLINDING", STR_IFNDEF(WC_RSA_BLINDING)); + show_macro("NO_WRITEV", STR_IFNDEF(NO_WRITEV)); + + /* Environment */ + show_macro("FREERTOS", STR_IFNDEF(FREERTOS)); + show_macro("NO_WOLFSSL_DIR", STR_IFNDEF(NO_WOLFSSL_DIR)); + show_macro("WOLFSSL_NO_CURRDIR", STR_IFNDEF(WOLFSSL_NO_CURRDIR)); + show_macro("WOLFSSL_LWIP", STR_IFNDEF(WOLFSSL_LWIP)); + + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); +#if defined(CONFIG_COMPILER_OPTIMIZATION_DEFAULT) + ESP_LOGI(TAG, "Compiler Optimization: Default"); +#elif defined(CONFIG_COMPILER_OPTIMIZATION_SIZE) + ESP_LOGI(TAG, "Compiler Optimization: Size"); +#elif defined(CONFIG_COMPILER_OPTIMIZATION_PERF) + ESP_LOGI(TAG, "Compiler Optimization: Performance"); +#elif defined(CONFIG_COMPILER_OPTIMIZATION_NONE) + ESP_LOGI(TAG, "Compiler Optimization: None"); +#else + ESP_LOGI(TAG, "Compiler Optimization: Unknown"); +#endif + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); + + return ESP_OK; +} /* ******************************************************************************* -** The public ShowExtendedSystemInfo() +** The internal, portable, but currently private ShowExtendedSystemInfo() ******************************************************************************* */ - int ShowExtendedSystemInfo(void) +{ +#if ESP_IDF_VERSION_MAJOR > 4 + unsigned chip_rev = -1; +#endif + +#ifdef HAVE_ESP_CLK + /* esp_clk.h is private */ + int cpu_freq = 0; +#endif + + WOLFSSL_VERSION_PRINTF("Extended Version and Platform Information."); + +#if defined(HAVE_WC_INTROSPECTION) && \ + !defined(ALLOW_BINARY_MISMATCH_INTROSPECTION) +#pragma message("WARNING: both HAVE_VERSION_EXTENDED_INFO and " \ + "HAVE_WC_INTROSPECTION are enabled. Some extended " \ + "information details will not be available.") + + WOLFSSL_VERSION_PRINTF("HAVE_WC_INTROSPECTION enabled. " + "Some extended system details not available."); +#endif /* else not HAVE_WC_INTROSPECTION */ + +#if ESP_IDF_VERSION_MAJOR > 4 + chip_rev = efuse_hal_chip_revision(); + ESP_LOGI(TAG, "Chip revision: v%d.%d", chip_rev / 100, chip_rev % 100); +#endif + +#ifdef HAVE_ESP_CLK + cpu_freq = esp_clk_cpu_freq(); + ESP_EARLY_LOGI(TAG, "cpu freq: %d Hz", cpu_freq); +#endif + +#if defined(SHOW_SSID_AND_PASSWORD) + ESP_LOGW(TAG, "WARNING: SSID and plain text WiFi " + "password displayed in startup logs. "); + ESP_LOGW(TAG, "Remove SHOW_SSID_AND_PASSWORD from user_settings.h " + "to disable."); +#else + ESP_LOGI(TAG, "SSID and plain text WiFi " + "password not displayed in startup logs."); + ESP_LOGI(TAG, " Define SHOW_SSID_AND_PASSWORD to enable display."); +#endif + +#if defined(WOLFSSL_MULTI_INSTALL_WARNING) + /* CMake may have detected undesired multiple installs, so give warning. */ + WOLFSSL_VERSION_PRINTF(""); + WOLFSSL_VERSION_PRINTF("WARNING: Multiple wolfSSL installs found."); + WOLFSSL_VERSION_PRINTF("Check ESP-IDF components and " + "local project [components] directory."); + WOLFSSL_VERSION_PRINTF(""); +#else + #ifdef WOLFSSL_USER_SETTINGS_DIR { - WOLFSSL_VERSION_PRINTF("Extended Version and Platform Information."); + ESP_LOGI(TAG, "Using wolfSSL user_settings.h in %s", + WOLFSSL_USER_SETTINGS_DIR); + } + #else + { + ESP_LOGW(TAG, "Warning: old cmake, user_settings.h location unknown."); + } + #endif +#endif #if defined(LIBWOLFSSL_VERSION_STRING) - WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_STRING = %s", - LIBWOLFSSL_VERSION_STRING); + WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_STRING = %s", + LIBWOLFSSL_VERSION_STRING); #endif #if defined(LIBWOLFSSL_VERSION_HEX) - WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_HEX = %x", - LIBWOLFSSL_VERSION_HEX); + WOLFSSL_VERSION_PRINTF("LIBWOLFSSL_VERSION_HEX = %x", + LIBWOLFSSL_VERSION_HEX); #endif -#if defined(WOLFSSL_MULTI_INSTALL_WARNING) - /* CMake may have detected undesired multiple installs, so give warning. */ - WOLFSSL_VERSION_PRINTF(""); - WOLFSSL_VERSION_PRINTF("WARNING: Multiple wolfSSL installs found."); - WOLFSSL_VERSION_PRINTF("Check ESP-IDF and local project [components] directory."); - WOLFSSL_VERSION_PRINTF(""); + /* some interesting settings are target specific (ESP32, -C3, -S3, etc */ +#if defined(CONFIG_IDF_TARGET_ESP32) + /* ESP_RSA_MULM_BITS should be set to at least 16 for ESP32 */ + #if defined(ESP_RSA_MULM_BITS) + #if (ESP_RSA_MULM_BITS < 16) + ESP_LOGW(TAG, "Warning: ESP_RSA_MULM_BITS < 16 for ESP32"); + #endif + #else + ESP_LOGW(TAG, "Warning: ESP_RSA_MULM_BITS not defined for ESP32"); + #endif + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP8684) + ESP_LOGI(TAG, "CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ = %u MHz", + CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ + ); +#elif defined(CONFIG_IDF_TARGET_ESP32C3) && \ + defined(CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ) + ESP_LOGI(TAG, "CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ = %u MHz", + CONFIG_ESP32C3_DEFAULT_CPU_FREQ_MHZ + ); + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + ESP_LOGI(TAG, "CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ = %u MHz", + CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ + ); +/* ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); */ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #if defined(CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ) + ESP_LOGI(TAG, "CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ = %u MHz", + CONFIG_ESP32S2_DEFAULT_CPU_FREQ_MHZ + ); + #endif + + ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + #if defined(CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ) + ESP_LOGI(TAG, "CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ = %u MHz", + CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ + ); + #endif + + ESP_LOGI(TAG, "Xthal_have_ccount = %u", Xthal_have_ccount); +#else + #endif - ShowExtendedSystemInfo_git(); /* may be limited during active introspection */ - ShowExtendedSystemInfo_platform(); - ShowExtendedSystemInfo_thread(); - return 0; - } + /* all platforms: stack high water mark check */ +#ifdef INCLUDE_uxTaskGetStackHighWaterMark + ESP_LOGI(TAG, "Stack HWM: %d", uxTaskGetStackHighWaterMark(NULL)); +#endif + ESP_LOGI(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); + ShowExtendedSystemInfo_config(); + ShowExtendedSystemInfo_git(); + ShowExtendedSystemInfo_platform(); + ShowExtendedSystemInfo_thread(); + /* show number of RTC sleep boots */ + esp_increment_boot_count(); + ESP_LOGI(TAG, "Boot count: %d", esp_current_boot_count()); + + return ESP_OK; +} -int esp_ShowExtendedSystemInfo() +esp_err_t esp_ShowExtendedSystemInfo(void) { + /* Someday the ShowExtendedSystemInfo may be global. + * See https://github.com/wolfSSL/wolfssl/pull/6149 */ return ShowExtendedSystemInfo(); } +/* + * Disable the watchdog timer (use with caution) + */ + +esp_err_t esp_DisableWatchdog(void) +{ + esp_err_t ret = ESP_OK; +#if defined(CONFIG_IDF_TARGET_ESP8266) + /* magic bit twiddle to disable WDT on ESP8266 */ + *((volatile uint32_t*) 0x60000900) &= ~(1); +#elif CONFIG_IDF_TARGET_ESP32S3 + ESP_LOGW(TAG, "esp_DisableWatchdog TODO S3"); +#else + #if ESP_IDF_VERSION_MAJOR >= 5 + { + #if defined(CONFIG_IDF_TARGET_ESP32) + rtc_wdt_protect_off(); + rtc_wdt_disable(); + #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) + ESP_LOGW(TAG, "No known rtc_wdt_protect_off for this platform."); + #else + rtc_wdt_protect_off(); + rtc_wdt_disable(); + #endif + } + #else + ESP_LOGW(TAG, "esp_DisableWatchdog not implemented on ESP_OIDF v%d", + ESP_IDF_VERSION_MAJOR); + #endif +#endif + +#ifdef DEBUG_WOLFSSL + ESP_LOGI(TAG, "Watchdog disabled."); +#endif + + return ret; +} + +/* + * Enable the watchdog timer. + */ + +esp_err_t esp_EnabledWatchdog(void) +{ + esp_err_t ret = ESP_OK; +#if defined(CONFIG_IDF_TARGET_ESP8266) + /* magic bit twiddle to enable WDT on ESP8266 */ + *((volatile uint32_t*) 0x60000900) |= 1; +#elif CONFIG_IDF_TARGET_ESP32S3 + ESP_LOGW(TAG, "esp_EnableWatchdog TODO S3"); +#else + #if ESP_IDF_VERSION_MAJOR >= 5 + { + #if defined(CONFIG_IDF_TARGET_ESP32) + rtc_wdt_protect_on(); + rtc_wdt_enable(); + #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) || \ + defined(CONFIG_IDF_TARGET_ESP32H2) + ESP_LOGW(TAG, "No known rtc_wdt_protect_off for this platform."); + #else + rtc_wdt_protect_on(); + rtc_wdt_enable(); + #endif + } + #else + ESP_LOGW(TAG, "esp_DisableWatchdog not implemented on ESP_OIDF v%d", + ESP_IDF_VERSION_MAJOR); + #endif +#endif + +#ifdef DEBUG_WOLFSSL + ESP_LOGI(TAG, "Watchdog enabled."); +#endif + + return ret; +} + +/* Print a MATH_INT_T attribute list. + * + * Note with the right string parameters, the result can be pasted as + * initialization code. + */ +esp_err_t esp_show_mp_attributes(char* c, MATH_INT_T* X) +{ + static const char* MP_TAG = "MATH_INT_T"; + esp_err_t ret = ESP_OK; + + if (X == NULL) { + ret = ESP_FAIL; + ESP_LOGV(MP_TAG, "esp_show_mp_attributes called with X == NULL"); + } + else { + ESP_LOGI(MP_TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); + ESP_LOGI(MP_TAG, "%s.used = %d;", c, X->used); +#if defined(WOLFSSL_SP_INT_NEGATIVE) || defined(USE_FAST_MATH) + ESP_LOGI(MP_TAG, "%s.sign = %d;", c, X->sign); +#endif + } + return ret; +} + +/* Print a MATH_INT_T value. + * + * Note with the right string parameters, the result can be pasted as + * initialization code. + */ +esp_err_t esp_show_mp(char* c, MATH_INT_T* X) +{ + static const char* MP_TAG = "MATH_INT_T"; + esp_err_t ret = ESP_OK; + int words_to_show = 0; + + if (X == NULL) { + ret = ESP_FAIL; + ESP_LOGV(MP_TAG, "esp_show_mp called with X == NULL"); + } + else { + words_to_show = X->used; + /* if too small, we'll show just 1 word */ + if (words_to_show < 1) { + ESP_LOGI(MP_TAG, "Bad word count. Adjusting from %d to %d", + words_to_show, + 1); + words_to_show = 1; + } + #ifdef MAX_WORDS_ESP_SHOW_MP + /* if too big, we'll show MAX_WORDS_ESP_SHOW_MP words */ + if (words_to_show > MAX_WORDS_ESP_SHOW_MP) { + ESP_LOGI(MP_TAG, "Limiting word count from %d to %d", + words_to_show, + MAX_WORDS_ESP_SHOW_MP); + words_to_show = MAX_WORDS_ESP_SHOW_MP; + } + #endif + ESP_LOGI(MP_TAG, "%s:",c); + esp_show_mp_attributes(c, X); + for (size_t i = 0; i < words_to_show; i++) { + ESP_LOGI(MP_TAG, "%s.dp[%2d] = 0x%08x; /* %2d */ ", + c, /* the supplied variable name */ + i, /* the index, i for dp[%d] */ + (unsigned int)X->dp[i], /* the value */ + i /* the index, again, for comment */ + ); + } + ESP_LOGI(MP_TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE); + } + return ret; +} + +/* Perform a full mp_cmp and binary compare. + * (typically only used during debugging) */ +esp_err_t esp_mp_cmp(char* name_A, MATH_INT_T* A, char* name_B, MATH_INT_T* B) +{ + esp_err_t ret = ESP_OK; + int e = memcmp(A, B, sizeof(mp_int)); + if (mp_cmp(A, B) == MP_EQ) { + if (e == 0) { + /* we always want to be here: both esp_show_mp and binary equal! */ + ESP_LOGV(TAG, "fp_cmp and memcmp match for %s and %s!", + name_A, name_B); + } + else { + ret = MP_VAL; + ESP_LOGE(TAG, "fp_cmp match, memcmp mismatch for %s and %s!", + name_A, name_B); + if (A->dp[0] == 1) { + ESP_LOGE(TAG, "Both memcmp and fp_cmp fail for %s and %s!", + name_A, name_B); + } + } + } + else { + ret = MP_VAL; + if (e == 0) { + /* if mp_cmp says different, + * but memcmp says equal, that's a problem */ + ESP_LOGE(TAG, "memcmp error for %s and %s!", + name_A, name_B); + } + else { + /* in the normal case where mp_cmp and memcmp say the + * values are different, we'll optionally show details. */ + ESP_LOGI(TAG, "e = %d", e); + ESP_LOGE(TAG, "fp_cmp mismatch! memcmp " + "offset 0x%02x for %s vs %s!", + e, name_A, name_B); + if (A->dp[0] == 1) { + ESP_LOGE(TAG, "Both memcmp and fp_cmp fail for %s and %s!", + name_A, name_B); + } + } + ESP_LOGV(TAG, "Mismatch for %s and %s!", + name_A, name_B); + } + + if (ret == MP_OKAY) { + ret = ESP_OK; + ESP_LOGV(TAG, "esp_mp_cmp equal for %s and %s!", + name_A, name_B); + } + else { + /* esp_show_mp(name_A, A); */ + /* esp_show_mp(name_B, B); */ + } + return ret; +} + +esp_err_t esp_hw_show_metrics(void) +{ +#if defined(WOLFSSL_HW_METRICS) + #if defined(WOLFSSL_ESP32_CRYPT) + esp_hw_show_sha_metrics(); + #else + ESP_LOGI(TAG, "WOLFSSL_ESP32_CRYPT not defined, " + "HW SHA hash not enabled"); + #endif + + #if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI) + esp_hw_show_mp_metrics(); + #else + ESP_LOGI(TAG, "WOLFSSL_ESP32_CRYPT_RSA_PRI not defined, " + "HW math not enabled"); + #endif + + #if defined(NO_WOLFSSL_ESP32_CRYPT_AES) + ESP_LOGI(TAG, "NO_WOLFSSL_ESP32_CRYPT_AES is defined, " + "HW AES not enabled"); + #else + esp_hw_show_aes_metrics(); + #endif +#else + ESP_LOGV(TAG, "WOLFSSL_HW_METRICS is not enabled"); #endif + return ESP_OK; +} +#endif /* WOLFSSL_ESPIDF */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_mem_lib.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,280 @@ +/* esp_sdk_mem_lib.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +/* wolfSSL */ +/* Always include wolfcrypt/settings.h before any other wolfSSL file. */ +/* Reminder: settings.h pulls in user_settings.h; don't include it here. */ +#ifdef WOLFSSL_USER_SETTINGS + #include +#endif + +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ + +#if defined(WOLFSSL_USER_SETTINGS) + #include +#else + /* Define WOLFSSL_USER_SETTINGS project wide for settings.h to include */ + /* wolfSSL user settings in ./components/wolfssl/include/user_settings.h */ + #error "Missing WOLFSSL_USER_SETTINGS in CMakeLists or Makefile:\ + CFLAGS +=-DWOLFSSL_USER_SETTINGS" +#endif + +#ifndef SINGLE_THREADED + #ifdef PLATFORMIO + #include + #else + #include "semphr.h" + #endif +#endif + +/* Espressif */ +#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#include +#include + +/* wolfSSL */ +#include + +static const char* TAG = "mem lib"; +static intptr_t _starting_stack_pointer = 0; +static int _stack_used = 0; + + +/* see + * C:\SysGCC\esp8266\rtos-sdk\v3.4\components\esp8266\ld\esp8266.project.ld.in + */ +extern wc_ptr_t _data_start[]; +extern wc_ptr_t _data_end[]; +extern wc_ptr_t _rodata_start[]; +extern wc_ptr_t _rodata_end[]; +extern wc_ptr_t _bss_start[]; +extern wc_ptr_t _bss_end[]; +extern wc_ptr_t _rtc_data_start[]; +extern wc_ptr_t _rtc_data_end[]; +extern wc_ptr_t _rtc_bss_start[]; +extern wc_ptr_t _rtc_bss_end[]; +extern wc_ptr_t _iram_start[]; +extern wc_ptr_t _iram_end[]; +#if defined(CONFIG_IDF_TARGET_ESP8266) +extern wc_ptr_t _init_start[]; +extern wc_ptr_t _init_end[]; +#endif +extern wc_ptr_t _iram_text_start[]; +extern wc_ptr_t _iram_text_end[]; +extern wc_ptr_t _iram_bss_start[]; +extern wc_ptr_t _iram_bss_end[]; +extern wc_ptr_t _noinit_start[]; +extern wc_ptr_t _noinit_end[]; +extern wc_ptr_t _text_start[]; +extern wc_ptr_t _text_end[]; +extern wc_ptr_t _heap_start[]; +extern wc_ptr_t _heap_end[]; +extern wc_ptr_t _rtc_data_start[]; +extern wc_ptr_t _rtc_data_end[]; +extern void* _thread_local_start; +extern void* _thread_local_end; + +/* See https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map */ +#define MEM_MAP_IO_START ((void*)(0x3FF00000)) +#define MEM_MAP_IO_END ((void*)(0x3FF0FFFF)) +#define USER_DATA_START ((void*)(0x3FFE8000)) +#define USER_DATA_END ((void*)(0x3FFE8000 + 0x14000)) +#define ETS_SYS_START ((void*)(0x3FFFC000)) +#define ETS_SYS_END ((void*)(0x3FFFC000 + 0x4000)) +#define IRAM1_START ((void*)(0x40100000)) +#define IRAM1_END ((void*)(0x40100000 + 0x8000)) +#define IRAMF1_START ((void*)(0x40108000)) +#define IRAMF1_END ((void*)(0x40108000 + 0x4000)) +#define IRAMF2_START ((void*)(0x4010C000)) +#define IRAMF2_END ((void*)(0x4010C000 + 0x4000)) + +enum sdk_memory_segment +{ + /* Ensure this list exactly matches order in sdk_memory_segment_text */ + mem_map_io = 0, + thread_local, + data, + user_data_ram, + bss, + noinit, + ets_system, + iram1, + iramf1, + iramf2, + iram, + iram_text, + iram_bss, + init, + text, + rodata, + rtc_data, + SDK_MEMORY_SEGMENT_COUNT +}; + +static void* sdk_memory_segment_start[SDK_MEMORY_SEGMENT_COUNT + 1] = {}; +static void* sdk_memory_segment_end[SDK_MEMORY_SEGMENT_COUNT + 1] = {}; +static const char* sdk_memory_segment_text[SDK_MEMORY_SEGMENT_COUNT + 1] = { + "C memory map io ", + "* thread_local ", + "C data ", + "* user data ram ", + "* bss ", + "* noinit ", + "C ets system ", + "C iram1 ", + "C iramf1 ", + "C iramf2 ", + "* iram ", + "* iram_text ", + "* iram_bss ", + "* init ", + "* text ", + "* rodata ", + "* rtc data ", + "last item", +}; + +/* Given a given memory segment [m]: assign text names, starting and ending + * addresses. See also sdk_var_whereis() that requires this initialization. */ +int sdk_log_meminfo(enum sdk_memory_segment m, void* start, void* end) +{ + const char* str; + int len = 0; + str = sdk_memory_segment_text[m]; + sdk_memory_segment_start[m] = start; + sdk_memory_segment_end[m] = end; + /* For ESP8266 See ./build/[Debug|Release]/esp8266/esp8266.project.ld */ + /* For ESP32 See ./build/VisualGDB/Debug/esp-idf/esp_system/ld/ */ + if (m == SDK_MEMORY_SEGMENT_COUNT) { + ESP_LOGI(TAG, " Linker Memory Map"); + ESP_LOGI(TAG, "-----------------------------------------------------"); + ESP_LOGI(TAG, " Start End Length"); + } + else { + len = (uint32_t)end - (uint32_t)start; + ESP_LOGI(TAG, "%s: %p ~ %p : 0x%05x (%d)", str, start, end, len, len ); + } + return ESP_OK; +} + +/* Show all known linker memory segment names, starting & ending addresses. */ +int sdk_init_meminfo(void) { + void* sample_heap_var; + int sample_stack_var = 0; + + sdk_log_meminfo(SDK_MEMORY_SEGMENT_COUNT, NULL, NULL); /* print header */ + sdk_log_meminfo(mem_map_io, MEM_MAP_IO_START, MEM_MAP_IO_END); + sdk_log_meminfo(thread_local, _thread_local_start, _thread_local_end); + sdk_log_meminfo(data, _data_start, _data_end); + sdk_log_meminfo(user_data_ram, USER_DATA_START, USER_DATA_END); + sdk_log_meminfo(bss, _bss_start, _bss_end); + sdk_log_meminfo(noinit, _noinit_start, _noinit_end); + sdk_log_meminfo(ets_system, ETS_SYS_START, ETS_SYS_END); + sdk_log_meminfo(rodata, _rodata_start, _rodata_end); + sdk_log_meminfo(iram1, IRAM1_START, IRAM1_END); + sdk_log_meminfo(iramf1, IRAMF1_START, IRAMF1_END); + sdk_log_meminfo(iramf2, IRAMF2_START, IRAMF2_END); + sdk_log_meminfo(iram, _iram_start, _iram_end); + sdk_log_meminfo(iram_text, _iram_text_start, _iram_text_end); + sdk_log_meminfo(iram_bss, _iram_bss_start, _iram_bss_end); +#if defined(CONFIG_IDF_TARGET_ESP8266) + sdk_log_meminfo(init, _init_start, _init_end); +#endif + sdk_log_meminfo(text, _text_start, _text_end); + sdk_log_meminfo(rtc_data, _rtc_data_start, _rtc_data_end); + ESP_LOGI(TAG, "-----------------------------------------------------"); + sample_heap_var = malloc(1); + if (sample_heap_var == NULL) { + ESP_LOGE(TAG, "Unable to allocate heap memory in sdk_var_whereis()."); + } + else { + sdk_var_whereis("sample_stack_var", (void*)&sample_stack_var); + sdk_var_whereis("sample_heap_var", sample_heap_var); + free(sample_heap_var); + } + return ESP_OK; +} + +/* Returns ESP_OK if found in known memory map, ESP_FAIL otherwise */ +esp_err_t sdk_var_whereis(const char* v_name, void* v) { + esp_err_t ret = ESP_FAIL; + + for (enum sdk_memory_segment m = 0 ;m < SDK_MEMORY_SEGMENT_COUNT; m++) { + if (v >= sdk_memory_segment_start[m] && + v <= sdk_memory_segment_end[m]) { + ret = ESP_OK; + ESP_LOGI(TAG, "Variable [%s] found at %p in %s", v_name, v, + sdk_memory_segment_text[m]); + if (m == user_data_ram) { + + } + } + } + + if (ret == ESP_FAIL) { + ESP_LOGW(TAG, "%s not found in known memory map: %p", v_name, v); + } + return ret; +} + +intptr_t esp_sdk_stack_pointer(void) +{ + intptr_t sp = 0; +#if defined(CONFIG_IDF_TARGET_ARCH_RISCV) + if (CONFIG_IDF_TARGET_ARCH_RISCV == 1) { + __asm volatile("mv %0, sp" : "=r" (sp)); + } +#elif defined(CONFIG_IDF_TARGET_ARCH_XTENSA) + if (CONFIG_IDF_TARGET_ARCH_XTENSA == 1) { + __asm volatile("mov %0, sp" : "=r"(sp)); + } +#endif + if (_starting_stack_pointer == 0) { + _starting_stack_pointer = sp; + } + _stack_used = _starting_stack_pointer - sp; + return sp; +} + +esp_err_t esp_sdk_mem_lib_init(void) +{ + int ret = ESP_OK; + sdk_init_meminfo(); + ESP_LOGI(TAG, "esp_sdk_mem_lib_init Ver %d", ESP_SDK_MEM_LIB_VERSION); + return ret; +} + +void* wc_debug_pvPortMalloc(size_t size, + const char* file, int line, const char* fname) { + void* ret = NULL; + ret = pvPortMalloc(size); + if (ret == NULL) { + ESP_LOGE("malloc", "%s:%d (%s)", file, line, fname); + ESP_LOGE("malloc", "Failed Allocating memory of size: %d bytes", size); + } + return ret; +} + +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_time_lib.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,442 @@ +/* esp_sdk_time_lib.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +/* Reminder: user_settings.h is needed and included from settings.h + * Be sure to define WOLFSSL_USER_SETTINGS, typically in CMakeLists.txt */ +#include + +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ +#if defined(USE_WOLFSSL_ESP_SDK_TIME) +/* Espressif */ +#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#include +#include + +/* wolfSSL */ +#include + +#define ESP_SDK_TIME_LIB_VERSION 1 + +static const char* TAG = "time lib"; + +esp_err_t esp_sdk_time_lib_init(void) +{ + int ret = ESP_OK; + ESP_LOGI(TAG, "esp_sdk_time_lib_init Ver %d", ESP_SDK_TIME_LIB_VERSION); + return ret; +} + +#if defined(CONFIG_IDF_TARGET_ESP8266) + #include + +#elif defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) + #if (ESP_IDF_VERSION_MAJOR == 5) && (ESP_IDF_VERSION_MINOR == 1) + #define HAS_ESP_NETIF_SNTP 1 + #include + #include + #elif (ESP_IDF_VERSION_MAJOR == 5) && (ESP_IDF_VERSION_MINOR > 1) + #define HAS_ESP_NETIF_SNTP 1 + #include + #include + #else + #include + #include + #endif + +#else + /* TODO Consider non ESP-IDF environments */ +#endif + +/* ESP-IDF uses a 64-bit signed integer to represent time_t + * starting from release v5.0 + * See: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#year-2036-and-2038-overflow-issues + */ + +/* see https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html */ +#ifndef TIME_ZONE + /* + * PST represents Pacific Standard Time. + * +8 specifies the offset from UTC (Coordinated Universal Time), + * indicating that Pacific Time is UTC-8 during standard time. + * PDT represents Pacific Daylight Time. + * M3.2.0 indicates that Daylight Saving Time (DST) starts on the + * second (2) Sunday (0) of March (3). + * M11.1.0 indicates that DST ends on the first (1) Sunday (0) + * of November (11) + */ + #define TIME_ZONE "PST+8PDT,M3.2.0,M11.1.0" +#endif /* not defined: TIME_ZONE, so we are setting our own */ + +#define NTP_RETRY_COUNT 10 + +/* NELEMS(x) number of elements + * To determine the number of elements in the array, we can divide the total + * size of the array by the size of the array element. + * See https://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my-array-in-c + **/ +#define NELEMS(x) ( (int)(sizeof(x) / sizeof((x)[0])) ) + +/* See also CONFIG_LWIP_SNTP_MAX_SERVERS in sdkconfig */ +#define NTP_SERVER_LIST ( (char*[]) { \ + "pool.ntp.org", \ + "time.nist.gov", \ + "utcnist.colorado.edu" \ + } \ + ) +/* #define NTP_SERVER_COUNT using NELEMS: + * + * (int)(sizeof(NTP_SERVER_LIST) / sizeof(NTP_SERVER_LIST[0])) + */ +#define NTP_SERVER_COUNT NELEMS(NTP_SERVER_LIST) + +#ifndef CONFIG_LWIP_SNTP_MAX_SERVERS + /* We should find max value in sdkconfig, if not set it to our count:*/ + #define CONFIG_LWIP_SNTP_MAX_SERVERS NTP_SERVER_COUNT +#endif + +/* our NTP server list is global info */ +extern char* ntpServerList[NTP_SERVER_COUNT]; + +char* ntpServerList[NTP_SERVER_COUNT] = NTP_SERVER_LIST; + +/* Show the current date and time */ +int esp_show_current_datetime(void) +{ + time_t now; + char strftime_buf[64]; + struct tm timeinfo; + + time(&now); + setenv("TZ", TIME_ZONE, 1); + tzset(); + + localtime_r(&now, &timeinfo); + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + ESP_LOGI(TAG, "The current date/time is: %s", strftime_buf); + return ESP_OK; +} + +/* the worst-case scenario is a hard-coded date/time */ +int set_fixed_default_time(void) +{ + /* ideally, we'd like to set time from network, + * but let's set a default time, just in case */ + struct tm timeinfo = { + .tm_year = 2024 - 1900, + .tm_mon = 1, + .tm_mday = 05, + .tm_hour = 13, + .tm_min = 01, + .tm_sec = 05 + }; + struct timeval now; + time_t interim_time; + int ret = -1; + + /* set interim static time */ + interim_time = mktime(&timeinfo); + + ESP_LOGI(TAG, "Adjusting time from fixed value"); + now = (struct timeval){ .tv_sec = interim_time }; +#if defined(CONFIG_IDF_TARGET_ESP8266) + (void)now; +#else + ret = settimeofday(&now, NULL); +#endif + ESP_LOGI(TAG, "settimeofday result = %d", ret); + return ret; +} + +/* probably_valid_time_string(s) + * + * some sanity checks on time string before calling sscanf() + * + * returns 0 == ESP_OK == Success if str is likely a valid time. + * -1 == ESP_FAIL otherwise + */ +int probably_valid_time_string(const char* str) +{ + int ret = ESP_OK; + size_t length = 0; + size_t spaces = 0; + size_t colons = 0; + + while (str[length] != '\0') { + if (str[length] == ' ') { + spaces++; + } + if (str[length] == ':') { + colons++; + } + length++; + } + + if ((length > 32) || (spaces < 4) || (spaces > 5) || (colons > 2)) { + ret = ESP_FAIL; + ESP_LOGE(TAG, "ERROR, failed time sanity check: %s", str); + } + return ret; +} + +#if defined(CONFIG_IDF_TARGET_ESP8266) +/* TODO implement time functions for ESP8266 */ +int set_time_from_string(const char* time_buffer) +{ + ESP_LOGE(TAG, "set_time_from_string not implemented for ESP8266"); + return ESP_FAIL; +} + +int set_time(void) +{ + ESP_LOGE(TAG, "set_time not implemented for ESP8266"); + return ESP_FAIL; +} + +int set_time_wait_for_ntp(void) +{ + ESP_LOGE(TAG, "set_time_wait_for_ntp not implemented for ESP8266"); + return ESP_FAIL; +} + +#else +/* ESP32 Time Helpers */ + +/* set_time_from_string(s) + * + * returns 0 = success if able to set the time from the provided string + * error for any other value, typically -1 */ +int set_time_from_string(const char* time_buffer) +{ + /* expecting github default formatting: 'Thu Aug 31 12:41:45 2023 -0700' */ + char offset[28]; /* large arrays, just in case there's still bad data */ + char day_str[28]; + char month_str[28]; + const char *format = "%3s %3s %d %d:%d:%d %d %s"; + struct tm this_timeinfo; + struct timeval now; + time_t interim_time; + int day, year, hour, minute, second; + int quote_offset = 0; + int ret = 0; + + /* perform some basic sanity checks */ + ret = probably_valid_time_string(time_buffer); + if (ret == ESP_OK) { + /* we are expecting the string to be encapsulated in single quotes */ + if (*time_buffer == 0x27) { + quote_offset = 1; + } + + ret = sscanf(time_buffer + quote_offset, + format, + day_str, month_str, + &day, &hour, &minute, &second, &year, &offset); + + if (ret == 8) { + /* we found a match for all components */ + + const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; + + for (int i = 0; i < 12; i++) { + if (strcmp(month_str, months[i]) == 0) { + this_timeinfo.tm_mon = i; + break; + } + } + + this_timeinfo.tm_mday = day; + this_timeinfo.tm_hour = hour; + this_timeinfo.tm_min = minute; + this_timeinfo.tm_sec = second; + this_timeinfo.tm_year = year - 1900; /* Years since 1900 */ + + interim_time = mktime(&this_timeinfo); + now = (struct timeval){ .tv_sec = interim_time }; + ret = settimeofday(&now, NULL); + ESP_LOGI(TAG, "Time updated to %s", time_buffer); + } + else { + ESP_LOGE(TAG, "Failed to convert \"%s\" to a tm date.", + time_buffer); + ESP_LOGI(TAG, "Trying fixed date that was hard-coded...."); + set_fixed_default_time(); + ret = ESP_FAIL; + } + } + + return ret; +} + +/* set time; returns 0 if succecssfully configured with NTP */ +int set_time(void) +{ +#ifndef NTP_SERVER_COUNT + ESP_LOGW(TAG, "Warning: no sntp server names defined. " + "Setting to empty list"); + #define NTP_SERVER_COUNT 0 + #warning "NTP not properly configured" +#endif /* not defined: NTP_SERVER_COUNT */ + +#ifdef HAS_ESP_NETIF_SNTP + #if CONFIG_LWIP_SNTP_MAX_SERVERS > 1 + esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG_MULTIPLE( + NTP_SERVER_COUNT, + ESP_SNTP_SERVER_LIST(ntpServerList[0]) + ); + #else + esp_sntp_config_t config = + ESP_NETIF_SNTP_DEFAULT_CONFIG(ntpServerList[0]); + #endif /* CONFIG_LWIP_SNTP_MAX_SERVERS > 1 */ +#endif /* HAS_ESP_NETIF_SNTP */ + + int ret = 0; + int i = 0; /* counter for time servers */ + + ESP_LOGI(TAG, "Setting the time. Startup time:"); + esp_show_current_datetime(); + +#ifdef LIBWOLFSSL_VERSION_GIT_HASH_DATE + /* initially set a default approximate time from recent git commit */ + ESP_LOGI(TAG, "Found git hash date, attempting to set system date: %s", + LIBWOLFSSL_VERSION_GIT_HASH_DATE); + set_time_from_string(LIBWOLFSSL_VERSION_GIT_HASH_DATE"\0"); + esp_show_current_datetime(); + + ret = -4; +#else + /* otherwise set a fixed time that was hard coded */ + set_fixed_default_time(); + esp_show_current_datetime(); + ret = -3; +#endif + +#ifdef CONFIG_SNTP_TIME_SYNC_METHOD_SMOOTH + config.smooth_sync = true; +#endif + + if (NTP_SERVER_COUNT) { + /* next, let's setup NTP time servers + * + * see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/system_time.html#sntp-time-synchronization + * + * WARNING: do not set operating mode while SNTP client is running! + */ + /* TODO Consider esp_sntp_setoperatingmode(SNTP_OPMODE_POLL); */ + sntp_setoperatingmode(SNTP_OPMODE_POLL); + if (NTP_SERVER_COUNT > CONFIG_LWIP_SNTP_MAX_SERVERS) { + ESP_LOGW(TAG, "WARNING: %d NTP Servers defined, but " + "CONFIG_LWIP_SNTP_MAX_SERVERS = %d", + NTP_SERVER_COUNT,CONFIG_LWIP_SNTP_MAX_SERVERS); + } + ESP_LOGI(TAG, "sntp_setservername:"); + for (i = 0; i < CONFIG_LWIP_SNTP_MAX_SERVERS; i++) { + const char* thisServer = ntpServerList[i]; + if (strncmp(thisServer, "\x00", 1) == 0) { + /* just in case we run out of NTP servers */ + break; + } + ESP_LOGI(TAG, "%s", thisServer); + sntp_setservername(i, thisServer); + ret = ESP_OK; + } + #ifdef HAS_ESP_NETIF_SNTP + ret = esp_netif_sntp_init(&config); + #else + ESP_LOGW(TAG,"Warning: Consider upgrading ESP-IDF to take advantage " + "of updated SNTP libraries"); + #endif + if (ret == ESP_OK) { + ESP_LOGV(TAG, "Successfully called esp_netif_sntp_init"); + } + else { + ESP_LOGE(TAG, "ERROR: esp_netif_sntp_init return = %d", ret); + } + + sntp_init(); + switch (ret) { + case ESP_ERR_INVALID_STATE: + break; + default: + break; + } + ESP_LOGI(TAG, "sntp_init done."); + } + else { + ESP_LOGW(TAG, "No sntp time servers found."); + ret = -1; + } + + esp_show_current_datetime(); + ESP_LOGI(TAG, "time helper existing with result = %d", ret); + return ret; +} + +/* wait for NTP to actually set the time */ +int set_time_wait_for_ntp(void) +{ + int ret = 0; +#ifdef HAS_ESP_NETIF_SNTP + int ntp_retry = 0; + const int ntp_retry_count = NTP_RETRY_COUNT; + + ret = esp_netif_sntp_start(); + + ret = esp_netif_sntp_sync_wait(500 / portTICK_PERIOD_MS); +#else + ESP_LOGE(TAG, "HAS_ESP_NETIF_SNTP not defined"); +#endif /* HAS_ESP_NETIF_SNTP */ + esp_show_current_datetime(); + +#ifdef HAS_ESP_NETIF_SNTP + while (ret == ESP_ERR_TIMEOUT && (ntp_retry++ < ntp_retry_count)) { + ret = esp_netif_sntp_sync_wait(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Waiting for NTP to sync time... (%d/%d)", + ntp_retry, + ntp_retry_count); + esp_show_current_datetime(); + } +#endif /* HAS_ESP_NETIF_SNTP */ + +#ifdef TIME_ZONE + setenv("TZ", TIME_ZONE, 1); + tzset(); +#endif + + if (ret == ESP_OK) { + ESP_LOGI(TAG, "Successfully set time via NTP servers."); + } + else { + ESP_LOGW(TAG, "Warning: Failed to set time with NTP: " + "result = 0x%0x: %s", + ret, esp_err_to_name(ret)); + } + return ret; +} +#endif /* ESP32 or ESP8266 time helpers */ + +#endif /* USE_WOLFSSL_ESP_SDK_TIME */ +#endif /* WOLFSSL_ESPIDF*/ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Espressif/esp_sdk_wifi_lib.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,468 @@ +/* esp_sdk_wifi_lib.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +/* Reminder: user_settings.h is needed and included from settings.h + * Be sure to define WOLFSSL_USER_SETTINGS, typically in CMakeLists.txt */ +#include + +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ +#if defined(USE_WOLFSSL_ESP_SDK_WIFI) + +/* Espressif */ +#include "sdkconfig.h" /* programmatically generated from sdkconfig */ +#include +#include +#include + + +/* wolfSSL */ +#include +#include + +#define ESP_SDK_WIFI_LIB_VERSION 1 + +static const char* TAG = "wifi lib"; + +esp_err_t esp_sdk_wifi_lib_init(void) +{ + int ret = ESP_OK; + ESP_LOGI(TAG, "esp_sdk_wifi_lib_init Ver %d", ESP_SDK_WIFI_LIB_VERSION); + return ret; +} + + +/* When there's too little heap, WiFi quietly refuses to connect */ +#define WIFI_LOW_HEAP_WARNING 21132 + +#if defined(CONFIG_IDF_TARGET_ESP8266) +#elif ESP_IDF_VERSION_MAJOR >= 5 && defined(FOUND_PROTOCOL_EXAMPLES_DIR) + /* example path set in cmake file */ +#elif ESP_IDF_VERSION_MAJOR >= 4 + #include "protocol_examples_common.h" +#else + const static int CONNECTED_BIT = BIT0; + static EventGroupHandle_t wifi_event_group; +#endif + +#if defined(CONFIG_IDF_TARGET_ESP8266) + +#elif defined(ESP_IDF_VERSION_MAJOR) && defined(ESP_IDF_VERSION_MINOR) + #if ESP_IDF_VERSION_MAJOR >= 4 + /* likely using examples, see wifi_connect.h */ + #else + /* TODO - still supporting pre V4 ? */ + const static int CONNECTED_BIT = BIT0; + static EventGroupHandle_t wifi_event_group; + #endif + #if (ESP_IDF_VERSION_MAJOR == 5) + #define HAS_WPA3_FEATURES + #else + #undef HAS_WPA3_FEATURES + #endif +#else + /* TODO Consider pre IDF v5? */ +#endif + +#if defined(CONFIG_IDF_TARGET_ESP8266) +#ifndef CONFIG_ESP_MAX_STA_CONN + #define CONFIG_ESP_MAX_STA_CONN 4 +#endif +#define EXAMPLE_MAX_STA_CONN CONFIG_ESP_MAX_STA_CONN + +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 +#ifndef CONFIG_ESP_MAXIMUM_RETRY + #define CONFIG_ESP_MAXIMUM_RETRY 5 +#endif +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; +static int s_retry_num = 0; + +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY + +#if 0 +static void event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); + } else { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG,"connect to the AP fail"); + } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI(TAG, "got ip:%s", + ip4addr_ntoa(&event->ip_info.ip)); + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} +#else +static void event_handler(void* arg, esp_event_base_t event_base, + int32_t event_id, void* event_data) +{ + if (event_base == WIFI_EVENT) { + if (event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + ESP_LOGV(TAG, "Connect event!!"); + } + else { + if (event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, ">> Retry to connect to the AP"); + } + else { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG, ">> Connect to the AP fail"); + } /* WIFI_EVENT_STA_DISCONNECTED */ + else if(event_id == IP_EVENT_STA_GOT_IP) { + ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data; + ESP_LOGI(TAG, "got ip:%s", ip4addr_ntoa(&event->ip_info.ip)); + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } /* IP_EVENT_STA_GOT_IP */ + } /* not WIFI_EVENT_STA_START */ + } /* event_base == WIFI_EVENT */ +} /* event_handler */ + +#endif +esp_err_t esp_sdk_wifi_init_sta(void) +{ + word32 this_heap; + + s_wifi_event_group = xEventGroupCreate(); + + tcpip_adapter_init(); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, + &event_handler, NULL)); + ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, + &event_handler, NULL)); + + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_ESP_WIFI_SSID, + .password = EXAMPLE_ESP_WIFI_PASS + }, + }; + + /* Setting a password implies station will connect to all security modes + * including WEP/WPA. However these modes are deprecated and not advisable + * to be used. In case your Access point doesn't support WPA2, these mode + * can be enabled by commenting below line */ + if (strlen((char *)wifi_config.sta.password)) { + wifi_config.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK; + } + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) ); + ESP_ERROR_CHECK(esp_wifi_start() ); + + ESP_LOGI(TAG, "wifi_init_sta finished. Connecting..."); + this_heap = esp_get_free_heap_size(); + ESP_LOGI(TAG, "this heap = %d", this_heap); + if (this_heap < WIFI_LOW_HEAP_WARNING) { + ESP_LOGW(TAG, "Warning: WiFi low heap: %d", WIFI_LOW_HEAP_WARNING); + } + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) + * or connection failed for the maximum number of re-tries (WIFI_FAIL_BIT). + * The bits are set by event_handler() + * (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + ESP_LOGI(TAG, "xEventGroupWaitBits finished."); +#if 0 + /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually + * happened. */ + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "connected to ap SSID:%s", + EXAMPLE_ESP_WIFI_SSID); + } else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", + EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); + } else { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } +#else + /* xEventGroupWaitBits() returns the bits before the call returned, + * hence we can test which event actually happened. */ + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "Connected to AP SSID: %s", + EXAMPLE_ESP_WIFI_SSID); + } + else { + if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to SSID: %s, password:%s", + EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS); + } + else { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } + } + +#endif + ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, + &event_handler)); + ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, + &event_handler)); + vEventGroupDelete(s_wifi_event_group); + return ESP_OK; +} + +#elif ESP_IDF_VERSION_MAJOR < 4 +/* event handler for wifi events */ +static esp_err_t wifi_event_handler(void *ctx, system_event_t *event) +{ + switch (event->event_id) + { + case SYSTEM_EVENT_STA_START: + esp_wifi_connect(); + break; + case SYSTEM_EVENT_STA_GOT_IP: + #if ESP_IDF_VERSION_MAJOR >= 4 + ESP_LOGI(TAG, "got ip:" IPSTR "\n", + IP2STR(&event->event_info.got_ip.ip_info.ip)); + #else + ESP_LOGI(TAG, "got ip:%s", + ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip)); + #endif + /* see https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos_idf.html */ + xEventGroupSetBits(wifi_event_group, CONNECTED_BIT); + break; + case SYSTEM_EVENT_STA_DISCONNECTED: + esp_wifi_connect(); + xEventGroupClearBits(wifi_event_group, CONNECTED_BIT); + break; + default: + break; + } + return ESP_OK; +} +#else + +#ifdef CONFIG_ESP_MAXIMUM_RETRY + #define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY +#else + #define CONFIG_ESP_MAXIMUM_RETRY 5 +#endif + +#if CONFIG_ESP_WIFI_AUTH_OPEN +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_OPEN +#elif CONFIG_ESP_WIFI_AUTH_WEP +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WEP +#elif CONFIG_ESP_WIFI_AUTH_WPA_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA2_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA_WPA2_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA_WPA2_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA3_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA3_PSK +#elif CONFIG_ESP_WIFI_AUTH_WPA2_WPA3_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WPA2_WPA3_PSK +#elif CONFIG_ESP_WIFI_AUTH_WAPI_PSK +#define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD WIFI_AUTH_WAPI_PSK +#endif + +#ifndef ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD + #define CONFIG_ESP_WIFI_AUTH_WPA2_PSK 1 + #define ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD CONFIG_ESP_WIFI_AUTH_WPA2_PSK +#endif + +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; + +/* The event group allows multiple bits for each event, + * but we only care about two events: + * - we are connected to the AP with an IP + * - we failed to connect after the maximum amount of retries */ +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 + + +static int s_retry_num = 0; +ip_event_got_ip_t* event; + + +static void event_handler(void* arg, + esp_event_base_t event_base, + int32_t event_id, + void* event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) { + esp_wifi_connect(); + } + else if (event_base == WIFI_EVENT && + event_id == WIFI_EVENT_STA_DISCONNECTED) { + if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "retry to connect to the AP"); + } + else { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + } + ESP_LOGI(TAG, "connect to the AP fail"); + } + else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { + event = (ip_event_got_ip_t*) event_data; + /* wifi_show_ip(); */ + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} + +esp_err_t wc_wifi_init_sta(void) +{ + esp_err_t ret = ESP_OK; + + s_wifi_event_group = xEventGroupCreate(); + + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_create_default_wifi_sta(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + esp_event_handler_instance_t instance_any_id; + esp_event_handler_instance_t instance_got_ip; + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, + ESP_EVENT_ANY_ID, + &event_handler, + NULL, + &instance_any_id)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, + IP_EVENT_STA_GOT_IP, + &event_handler, + NULL, + &instance_got_ip)); + + wifi_config_t wifi_config = { + .sta = { + .ssid = EXAMPLE_ESP_WIFI_SSID, + .password = EXAMPLE_ESP_WIFI_PASS, + /* Authmode threshold resets to WPA2 as default if password matches + * WPA2 standards (password len => 8). If you want to connect the + * device to deprecated WEP/WPA networks, Please set the threshold + * value WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK and set the password with + * length and format matching to WIFI_AUTH_WEP/WIFI_AUTH_WPA_PSK + * standards. */ + .threshold.authmode = ESP_WIFI_SCAN_AUTH_MODE_THRESHOLD, + #ifdef HAS_WPA3_FEATURES + .sae_pwe_h2e = WPA3_SAE_PWE_BOTH, + #endif + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) ); + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) ); + +#ifdef CONFIG_EXAMPLE_WIFI_SSID + if (XSTRCMP(CONFIG_EXAMPLE_WIFI_SSID, "myssid") == 0) { + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID is \"myssid\"."); + ESP_LOGW(TAG, " Do you have a WiFi AP called \"myssid\", "); + ESP_LOGW(TAG, " or did you forget the ESP-IDF configuration?"); + } +#else + ESP_LOGW(TAG, "WARNING: CONFIG_EXAMPLE_WIFI_SSID not defined."); +#endif + + ESP_ERROR_CHECK(esp_wifi_start() ); + + ESP_LOGI(TAG, "wifi_init_sta finished."); + + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) + * or connection failed for the maximum number of re-tries (WIFI_FAIL_BIT). + * The bits are set by event_handler() (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + /* xEventGroupWaitBits() returns the bits before the call returned, + * hence we can test which event actually happened. */ +#if defined(SHOW_SSID_AND_PASSWORD) + ESP_LOGW(TAG, "Undefine SHOW_SSID_AND_PASSWORD to not show SSID/password"); + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "connected to ap SSID:%s password:%s", + EXAMPLE_ESP_WIFI_SSID, + EXAMPLE_ESP_WIFI_PASS); + } + else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s", + EXAMPLE_ESP_WIFI_SSID, + EXAMPLE_ESP_WIFI_PASS); + } + else { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } +#else + if (bits & WIFI_CONNECTED_BIT) { + ESP_LOGI(TAG, "Connected to AP"); + } + else if (bits & WIFI_FAIL_BIT) { + ESP_LOGI(TAG, "Failed to connect to AP"); + ret = -1; + } + else { + ESP_LOGE(TAG, "AP UNEXPECTED EVENT"); + ret = -2; + } +#endif + return ret; +} + +esp_err_t wc_wifi_show_ip(void) +{ + /* TODO Causes panic: ESP_LOGI(TAG, "got ip:" IPSTR, + * IP2STR(&event->ip_info.ip)); */ + return ESP_OK; +} + +#endif + + +#endif /* USE_WOLFSSL_ESP_SDK_WIFI */ +#endif /* WOLFSSL_ESPIDF */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_common.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_common.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_common.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_common.c 2024-08-03 07:30:00.000000000 +0000 @@ -21,19 +21,24 @@ #include -#if defined(WOLFSSL_RENESAS_SCEPROTECT) \ - || defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) \ - || defined(WOLFSSL_RENESAS_TSIP_TLS) - -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - #include - #define cmn_hw_lock wc_sce_hw_lock - #define cmn_hw_unlock wc_sce_hw_unlock -#elif defined(WOLFSSL_RENESAS_TSIP_TLS) +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) \ + || defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) \ + || defined(WOLFSSL_RENESAS_TSIP_TLS) \ + || defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + #include + #define cmn_hw_lock wc_fspsm_hw_lock + #define cmn_hw_unlock wc_fspsm_hw_unlock +#elif defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) #include #define cmn_hw_lock tsip_hw_lock #define cmn_hw_unlock tsip_hw_unlock + + #define FSPSM_ST TsipUserCtx; + #define MAX_FSPSM_CBINDEX 5 #endif #include @@ -43,33 +48,48 @@ #include #include #include +#include uint32_t g_CAscm_Idx = (uint32_t)-1; /* index of CM table */ static int gdevId = 7890; /* initial dev Id for Crypt Callback */ #ifdef WOLF_CRYPTO_CB +/* store callback ctx by devId */ +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) +FSPSM_ST *gCbCtx[MAX_FSPSM_CBINDEX]; +#elif defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) +#define FSPSM_ST TsipUserCtx; +#define MAX_FSPSM_CBINDEX 5 +TsipUserCtx *gCbCtx[MAX_FSPSM_CBINDEX]; +#endif #include + WOLFSSL_LOCAL int Renesas_cmn_Cleanup(WOLFSSL* ssl) { int ret = 0; WOLFSSL_ENTER("Renesas_cmn_Cleanup"); + (void) ssl; #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_TlsCleanup(ssl); #endif - + WOLFSSL_LEAVE("Renesas_cmn_Cleanup", ret); return ret; } + +#if defined(WOLFSSL_RENESAS_TSIP_TLS) WOLFSSL_LOCAL int Renesas_cmn_RsaSignCb(WOLFSSL* ssl, const unsigned char* in, unsigned int inSz, unsigned char* out, word32* outSz, const unsigned char* keyDer, unsigned int keySz, void* ctx) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); WOLFSSL_ENTER("Renesas_cmn_RsaSignCb"); /* This is just a stub function that provides no logic */ @@ -79,7 +99,7 @@ } /* This function is a callback passed to wolfSSL_CTX_SetRsaSignCheckCb. * It tries to verify the signature passed to it by decrypting with a public - * key. + * key. * returns 0 on success, CRYPTOCB_UNAVAILABLE when public key is not set. */ WOLFSSL_LOCAL int Renesas_cmn_RsaSignCheckCb(WOLFSSL* ssl, @@ -88,13 +108,13 @@ const unsigned char* keyDer, unsigned int keySz, void* ctx) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); WOLFSSL_ENTER("Renesas_cmn_RsaSignCheckCb"); #if defined(WOLFSSL_RENESAS_TSIP) - + return tsip_VerifyRsaPkcsCb(ssl, sig, sigSz, out, keyDer, keySz, ctx); - + #endif /* WOLFSSL_RENESAS_TSIP */ WOLFSSL_LEAVE("Renesas_cmn_RsaSignCheckCb", ret); @@ -107,14 +127,16 @@ const unsigned char* keyDer, unsigned int keySz, void* ctx) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); WOLFSSL_ENTER("Renesas_cmn_EccSignCb"); /* This is just a stub function that provides no logic */ - + WOLFSSL_LEAVE("Renesas_cmn_EccSignCb", ret); return ret; } +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ + /* Renesas Security Library Common Callback * For Crypto Callbacks * @@ -125,15 +147,16 @@ */ static int Renesas_cmn_CryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) { - int ret = NOT_COMPILED_IN; /* return this to bypass HW and use SW */ + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); /* return this to bypass HW and use SW */ WOLFSSL_ENTER("Renesas_cmn_CryptoDevCb"); -#if defined(WOLFSSL_RENESAS_TSIP_TLS) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) \ + || defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) TsipUserCtx* cbInfo = (TsipUserCtx*)ctx; -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - User_SCEPKCbInfo* cbInfo = (User_SCEPKCbInfo*)ctx; +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + FSPSM_ST* cbInfo = (FSPSM_ST*)ctx; #endif if (info == NULL || ctx == NULL) @@ -144,15 +167,19 @@ info->algo_type, cbInfo->session_key_set); #endif -#if defined(WOLFSSL_RENESAS_TSIP) +#if defined(WOLFSSL_RENESAS_TSIP) \ + || defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) ret = CRYPTOCB_UNAVAILABLE; if (info->algo_type == WC_ALGO_TYPE_CIPHER) { #if !defined(NO_AES) || !defined(NO_DES3) #ifdef HAVE_AESGCM - if (info->cipher.type == WC_CIPHER_AES_GCM && - cbInfo->session_key_set == 1) { + if (info->cipher.type == WC_CIPHER_AES_GCM + #ifdef WOLFSSL_RENESAS_TSIP_TLS + && cbInfo->session_key_set == 1 + #endif + ) { if (info->cipher.enc) { ret = wc_tsip_AesGcmEncrypt( @@ -186,8 +213,11 @@ } #endif /* HAVE_AESGCM */ #ifdef HAVE_AES_CBC - if (info->cipher.type == WC_CIPHER_AES_CBC && - cbInfo->session_key_set == 1) { + if (info->cipher.type == WC_CIPHER_AES_CBC + #ifdef WOLFSSL_RENESAS_TSIP_TLS + && cbInfo->session_key_set == 1 + #endif + ) { if (info->cipher.enc) { ret = wc_tsip_AesCbcEncrypt( @@ -208,7 +238,15 @@ #endif /* HAVE_AES_CBC */ #endif /* !NO_AES || !NO_DES3 */ } - /* Is called for signing + #if defined(WOLFSSL_KEY_GEN) + if (info->pk.type == WC_PK_TYPE_RSA_KEYGEN && + (info->pk.rsakg.size == 1024 || + info->pk.rsakg.size == 2048)) { + ret = wc_tsip_MakeRsaKey(info->pk.rsakg.size, (void*)ctx); + } + #endif + + /* Is called for signing * Can handle only RSA PkCS#1v1.5 padding scheme here. */ if (info->algo_type == WC_ALGO_TYPE_PK) { @@ -217,16 +255,21 @@ if (info->pk.rsa.type == RSA_PRIVATE_ENCRYPT) { ret = tsip_SignRsaPkcs(info, ctx); } + #if defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + else if (info->pk.rsa.type == RSA_PUBLIC_DECRYPT /* verify */) { + ret = wc_tsip_RsaVerifyPkcs(info, ctx); + } + #endif } #endif /* NO_RSA */ - #if defined(HAVE_ECC) + #if defined(HAVE_ECC) && defined(WOLFSSL_RENESAS_TSIP_TLS) else if (info->pk.type == WC_PK_TYPE_ECDSA_SIGN) { ret = tsip_SignEcdsa(info, ctx); } #endif /* HAVE_ECC */ } -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) ||\ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) ||\ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) if (info->algo_type == WC_ALGO_TYPE_CIPHER) { @@ -241,26 +284,7 @@ (cbInfo->keyflgs_crypt.bits.aes128_installedkey_set == 1 && info->cipher.aesgcm_enc.aes->keylen == 16))) { - if (cbInfo->keyflgs_crypt.bits.aes256_installedkey_set == 1 && - info->cipher.aesgcm_enc.aes->keylen == 32) { - - XMEMCPY(&info->cipher.aesgcm_enc.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes256, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aesgcm_enc.aes->ctx.keySize = 32; - - } - else if ( - cbInfo->keyflgs_crypt.bits.aes128_installedkey_set == 1 && - info->cipher.aesgcm_enc.aes->keylen == 16) { - - XMEMCPY(&info->cipher.aesgcm_enc.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes128, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aesgcm_enc.aes->ctx.keySize = 16; - } - - ret = wc_sce_AesGcmEncrypt( + ret = wc_fspsm_AesGcmEncrypt( info->cipher.aesgcm_enc.aes, (byte*)info->cipher.aesgcm_enc.out, (byte*)info->cipher.aesgcm_enc.in, @@ -280,26 +304,7 @@ (cbInfo->keyflgs_crypt.bits.aes128_installedkey_set == 1 && info->cipher.aesgcm_dec.aes->keylen == 16)) { - if (cbInfo->keyflgs_crypt.bits.aes256_installedkey_set == 1 && - info->cipher.aesgcm_dec.aes->keylen == 32) { - - XMEMCPY(&info->cipher.aesgcm_dec.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes256, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aesgcm_dec.aes->ctx.keySize = 32; - - } - else if ( - cbInfo->keyflgs_crypt.bits.aes128_installedkey_set == 1 && - info->cipher.aesgcm_dec.aes->keylen == 16) { - - XMEMCPY(&info->cipher.aesgcm_dec.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes128, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aesgcm_dec.aes->ctx.keySize = 16; - } - - ret = wc_sce_AesGcmDecrypt( + ret = wc_fspsm_AesGcmDecrypt( info->cipher.aesgcm_dec.aes, (byte*)info->cipher.aesgcm_dec.out, (byte*)info->cipher.aesgcm_dec.in, @@ -321,50 +326,15 @@ info->cipher.aescbc.aes->keylen == 32) || (cbInfo->keyflgs_crypt.bits.aes128_installedkey_set == 1 && info->cipher.aescbc.aes->keylen == 16))) { - if (info->cipher.enc) { - if ( - cbInfo->keyflgs_crypt.bits.aes256_installedkey_set == 1 && - info->cipher.aescbc.aes->keylen == 32) { - XMEMCPY(&info->cipher.aescbc.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes256, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aescbc.aes->ctx.keySize = 32; - - } - else if ( - cbInfo->keyflgs_crypt.bits.aes128_installedkey_set == 1 - && info->cipher.aescbc.aes->keylen == 16) { - XMEMCPY(&info->cipher.aescbc.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes128, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aescbc.aes->ctx.keySize = 16; - } - - ret = wc_sce_AesCbcEncrypt( + ret = wc_fspsm_AesCbcEncrypt( info->cipher.aescbc.aes, (byte*)info->cipher.aescbc.out, (byte*)info->cipher.aescbc.in, info->cipher.aescbc.sz); } else { - if ( - cbInfo->keyflgs_crypt.bits.aes256_installedkey_set == 1 && - info->cipher.aescbc.aes->keylen == 32) { - XMEMCPY(&info->cipher.aescbc.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes256, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aescbc.aes->ctx.keySize = 32; - } else if ( - cbInfo->keyflgs_crypt.bits.aes128_installedkey_set == 1 - && info->cipher.aescbc.aes->keylen == 16) { - XMEMCPY(&info->cipher.aescbc.aes->ctx.sce_wrapped_key, - &cbInfo->sce_wrapped_key_aes128, - sizeof(sce_aes_wrapped_key_t)); - info->cipher.aescbc.aes->ctx.keySize = 16; - } - - ret = wc_sce_AesCbcDecrypt( + ret = wc_fspsm_AesCbcDecrypt( info->cipher.aescbc.aes, (byte*)info->cipher.aescbc.out, (byte*)info->cipher.aescbc.in, @@ -374,45 +344,45 @@ #endif /* HAVE_AES_CBC */ #endif /* !NO_AES || !NO_DES3 */ } - #if !defined(NO_RSA) && defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) + #if !defined(NO_RSA) && defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) else if (info->algo_type == WC_ALGO_TYPE_PK) { - + #if !defined(NO_RSA) #if defined(WOLFSSL_KEY_GEN) if (info->pk.type == WC_PK_TYPE_RSA_KEYGEN && (info->pk.rsakg.size == 1024 || info->pk.rsakg.size == 2048)) { - ret = wc_sce_MakeRsaKey(info->pk.rsakg.size, (void*)ctx); + ret = wc_fspsm_MakeRsaKey(info->pk.rsakg.key, + info->pk.rsakg.size, (void*)ctx); } #endif if (info->pk.type == WC_PK_TYPE_RSA) { - /* to perform RSA on SCE, wrapped keys should be installed + /* to perform RSA on SCE, wrapped keys should be installed * in advance. SCE supports 1024 or 2048 bits key size. * otherwise, falls-through happens. */ - if (cbInfo->keyflgs_crypt.bits.rsapri2048_installedkey_set == 1 - || - cbInfo->keyflgs_crypt.bits.rsapub2048_installedkey_set == 1 - || - cbInfo->keyflgs_crypt.bits.rsapri1024_installedkey_set == 1 - || - cbInfo->keyflgs_crypt.bits.rsapub1024_installedkey_set == 1 - ) { - + if (cbInfo->keyflgs_crypt.bits.rsapri2048_installedkey_set || + cbInfo->keyflgs_crypt.bits.rsapub2048_installedkey_set || + cbInfo->keyflgs_crypt.bits.rsapri1024_installedkey_set || + cbInfo->keyflgs_crypt.bits.rsapub1024_installedkey_set ) { + + ret = wc_fspsm_MakeRsaKey(info->pk.rsa.key, 0, cbInfo); + if (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + if (info->pk.rsa.type == RSA_PRIVATE_DECRYPT || info->pk.rsa.type == RSA_PUBLIC_ENCRYPT ) { - ret = wc_sce_RsaFunction(info->pk.rsa.in, + ret = wc_fspsm_RsaFunction(info->pk.rsa.in, info->pk.rsa.inLen, info->pk.rsa.out, info->pk.rsa.outLen, info->pk.rsa.type, info->pk.rsa.key, - info->pk.rsa.rng, - (void*)ctx); + info->pk.rsa.rng); } else if (info->pk.rsa.type == RSA_PRIVATE_ENCRYPT /* sign */){ - ret = wc_sce_RsaSign(info->pk.rsa.in, + ret = wc_fspsm_RsaSign(info->pk.rsa.in, info->pk.rsa.inLen, info->pk.rsa.out, info->pk.rsa.outLen, @@ -420,7 +390,7 @@ (void*)ctx); } else if (info->pk.rsa.type == RSA_PUBLIC_DECRYPT /* verify */) { - ret = wc_sce_RsaVerify(info->pk.rsa.in, + ret = wc_fspsm_RsaVerify(info->pk.rsa.in, info->pk.rsa.inLen, info->pk.rsa.out, info->pk.rsa.outLen, @@ -436,7 +406,7 @@ "RSA operation falls through to SW operation."); } } - #endif /* NO_RSA && WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY */ + #endif /* NO_RSA && WOLFSSL_RENESAS_FSPSM_CRYPTONLY */ } #endif /* NO_RSA */ #endif /* TSIP or SCE */ @@ -460,21 +430,36 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = tsip_usable(ssl, session_key_generated); - #elif defined(WOLFSSL_RENESAS_SCEPROTECT) ||\ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - ret = wc_sce_usable(ssl, session_key_generated); + #elif defined(WOLFSSL_RENESAS_FSPSM_TLS) ||\ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + ret = wc_fspsm_usable(ssl, session_key_generated); #endif return ret; } /* Renesas Security Library Common Method + * Get Callback ctx by devId + * + * devId : devId to get its CTX + * return asocciated CTX when the method is successfully called. + * otherwise, NULL + */ +WOLFSSL_LOCAL void *Renesas_cmn_GetCbCtxBydevId(int devId) +{ + if (devId >= 7890 && devId <= (MAX_FSPSM_CBINDEX + 7890)) + return gCbCtx[devId - 7890]; + else + return NULL; +} + +/* Renesas Security Library Common Method * Crypt Callback initialization * * ssl : a pointer to WOLFSSL object * ctx : callback context * return valid device Id on success, otherwise INVALID_DEVIID - * device Id starts from 7890, and increases + 1 its number + * device Id starts from 7890, and increases + 1 its number * when the method is successfully called. */ int wc_CryptoCb_CryptInitRenesasCmn(WOLFSSL* ssl, void* ctx) @@ -482,15 +467,17 @@ (void)ssl; (void)ctx; - #if defined(WOLFSSL_RENESAS_TSIP_TLS) + #if defined(WOLFSSL_RENESAS_TSIP_TLS) \ + || defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) TsipUserCtx* cbInfo = (TsipUserCtx*)ctx; - #elif defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - User_SCEPKCbInfo* cbInfo = (User_SCEPKCbInfo*)ctx; + #elif defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + FSPSM_ST* cbInfo = (FSPSM_ST*)ctx; #endif if (cbInfo == NULL - #if !defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) && \ + #if (!defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) &&\ + !defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(HAVE_RENESAS_SYNC) || ssl == NULL) { #else @@ -508,15 +495,16 @@ WOLFSSL_MSG("Failed to lock tsip hw"); return INVALID_DEVID; } - - if (wc_CryptoCb_RegisterDevice(cbInfo->devId, + + if (wc_CryptoCb_RegisterDevice(cbInfo->devId, Renesas_cmn_CryptoDevCb, cbInfo) < 0) { /* undo devId number */ gdevId--; return INVALID_DEVID; } - #if !defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) && \ + #if !defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) && \ + !defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) && \ !defined(HAVE_RENESAS_SYNC) if (ssl) wolfSSL_SetDevId(ssl, cbInfo->devId); @@ -525,7 +513,9 @@ if (gdevId < 0) { gdevId = 7890; } - + + gCbCtx[cbInfo->devId - 7890] = (void*)cbInfo; + return cbInfo->devId; } @@ -542,10 +532,10 @@ } #endif /* WOLF_CRYPTO_CB */ -#endif /* WOLFSSL_RENESAS_SCEPROTECT || WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY - /* WOLFSSL_RENESAS_TSIP_TLS*/ +#endif /* WOLFSSL_RENESAS_FSPSM_TLS|| WOLFSSL_RENESAS_FSPSM_CRYPTONLY + WOLFSSL_RENESAS_TSIP_TLS || WOLFSSL_RENESAS_TSIP_CRYPTONLY */ -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_TSIP_TLS) +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || defined(WOLFSSL_RENESAS_TSIP_TLS) /* Renesas Security Library Common Method * Check CA index if CA can be used for SCE/TSIP because @@ -563,9 +553,9 @@ /* check if the root CA has been verified by TSIP/SCE, * and it exists in the CM table. */ -static byte sce_tsip_rootCAverified(void) +static byte fspsm_tsip_rootCAverified(void) { - WOLFSSL_ENTER("sce_tsip_rootCAverified"); + WOLFSSL_ENTER("fspsm_tsip_rootCAverified"); return (g_CAscm_Idx != (uint32_t)-1 ? 1:0); } /* Renesas Security Library Common Callback @@ -601,16 +591,16 @@ wolfSSL_SetEccSharedSecretCtx(ssl, NULL); } -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) - ret = wc_SCE_RsaVerify(ssl, sig, sigSz, out,key, keySz, ctx); +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + ret = wc_fspsm_RsaVerifyTLS(ssl, sig, sigSz, out,key, keySz, ctx); if (ret == 0) { /* Set Callback for SharedSecret when successful */ - wolfSSL_CTX_SetEccSharedSecretCb(ssl->ctx, SCE_EccSharedSecret); + wolfSSL_CTX_SetEccSharedSecretCb(ssl->ctx, fspsm_EccSharedSecret); wolfSSL_SetEccSharedSecretCtx(ssl, ctx); } else { - WOLFSSL_MSG("failed R_SCE_TLS_ServerKeyExchangeVerify"); + WOLFSSL_MSG("failed R_XXX_TLS_ServerKeyExchangeVerify"); wolfSSL_CTX_SetEccSharedSecretCb(ssl->ctx, NULL); wolfSSL_SetEccSharedSecretCtx(ssl, NULL); } @@ -652,16 +642,16 @@ wolfSSL_CTX_SetEccSharedSecretCb(ssl->ctx, NULL); wolfSSL_SetEccSharedSecretCtx(ssl, NULL); } -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) - ret = wc_SCE_EccVerify(ssl, sig, sigSz, hash, hashSz, key, keySz, +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + ret = wc_fspsm_EccVerifyTLS(ssl, sig, sigSz, hash, hashSz, key, keySz, result, ctx); if (ret == 0 && *result == 1) { /* Set callback for SharedSecret when being successful */ - wolfSSL_CTX_SetEccSharedSecretCb(ssl->ctx, SCE_EccSharedSecret); + wolfSSL_CTX_SetEccSharedSecretCb(ssl->ctx, fspsm_EccSharedSecret); wolfSSL_SetEccSharedSecretCtx(ssl, ctx); } else { - WOLFSSL_MSG("failed R_SCE_TLS_ServerKeyExchangeVerify"); + WOLFSSL_MSG("failed R_XXXX_TLS_ServerKeyExchangeVerify"); wolfSSL_CTX_SetEccSharedSecretCb(ssl->ctx, NULL); wolfSSL_SetEccSharedSecretCtx(ssl, NULL); } @@ -681,15 +671,15 @@ * cm_row CA index * return FSP_SUCCESS(0) on success, otherwise WOLFSSL_FATAL_ERROR */ -int wc_Renesas_cmn_RootCertVerify(const byte* cert, word32 cert_len, - word32 key_n_start, word32 key_n_len, word32 key_e_start, +int wc_Renesas_cmn_RootCertVerify(const byte* cert, word32 cert_len, + word32 key_n_start, word32 key_n_len, word32 key_e_start, word32 key_e_len, word32 cm_row) { int ret; WOLFSSL_ENTER("wc_Renesas_cmn_RootCertVerify"); - if (sce_tsip_rootCAverified() == 0) { + if (fspsm_tsip_rootCAverified() == 0) { #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = wc_tsip_tls_RootCertVerify(cert, cert_len, key_n_start, @@ -697,9 +687,9 @@ if (ret != TSIP_SUCCESS) { ret = WOLFSSL_FATAL_ERROR; } - #elif defined(WOLFSSL_RENESAS_SCEPROTECT) + #elif defined(WOLFSSL_RENESAS_FSPSM_TLS) - ret = wc_sce_tls_RootCertVerify(cert, cert_len, key_n_start, + ret = wc_fspsm_tls_RootCertVerify(cert, cert_len, key_n_start, key_n_len, key_e_start, key_e_len, cm_row); if (ret != FSP_SUCCESS) { ret = WOLFSSL_FATAL_ERROR; @@ -739,8 +729,8 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = wc_tsip_generateVerifyData(ssl->arrays->tsip_masterSecret, side, handshake_hash, hashes); - #elif defined(WOLFSSL_RENESAS_SCEPROTECT) - ret = wc_sce_generateVerifyData(ssl->arrays->sce_masterSecret, + #elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + ret = wc_fspsm_generateVerifyData(ssl->arrays->fspsm_masterSecret, side, handshake_hash, hashes); #endif } @@ -752,7 +742,7 @@ /* Renesas Security Library Common Callback * Callback for setting Encrypt Keys. - * Register callback for setting Encrypt Keys when keys are generated + * Register callback for setting Encrypt Keys when keys are generated * by SCE/TSIP * * ssl the WOLFSSL object @@ -771,10 +761,10 @@ #if defined(WOLFSSL_RENESAS_TSIP_TLS) TsipUserCtx* cbInfo = (TsipUserCtx*)ctx; - + if (cbInfo->session_key_set == 1) { - #elif defined(WOLFSSL_RENESAS_SCEPROTECT) - User_SCEPKCbInfo* cbInfo = (User_SCEPKCbInfo*)ctx; + #elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + FSPSM_ST* cbInfo = (FSPSM_ST*)ctx; if (cbInfo->keyflgs_tls.bits.session_key_set == 1) { @@ -807,23 +797,23 @@ int ret = -1; #if defined(WOLFSSL_RENESAS_TSIP_TLS) TsipUserCtx* cbInfo = (TsipUserCtx*)ctx; -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) - User_SCEPKCbInfo* cbInfo = (User_SCEPKCbInfo*)ctx; +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + FSPSM_ST* cbInfo = (FSPSM_ST*)ctx; #endif (void)ctx; - + WOLFSSL_ENTER("Renesas_cmn_generateSessionKey"); if (Renesas_cmn_usable(ssl, 0)) { #if defined(WOLFSSL_RENESAS_TSIP_TLS) ret = wc_tsip_generateSessionKey(ssl, (TsipUserCtx*)ctx, cbInfo->devId); -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) - ret = wc_sce_generateSessionKey(ssl, ctx, cbInfo->devId); +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + ret = wc_fspsm_generateSessionKey(ssl, ctx, cbInfo->devId); #endif - } + } else { ret = PROTOCOLCB_UNAVAILABLE; } - + if (ret == 0) { wolfSSL_CTX_SetEncryptKeysCb(ssl->ctx, Renesas_cmn_EncryptKeys); wolfSSL_SetEncryptKeysCtx(ssl, ctx); @@ -867,9 +857,9 @@ else ret = PROTOCOLCB_UNAVAILABLE; -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) if (Renesas_cmn_usable(ssl, 0)) { - ret = wc_sce_generatePremasterSecret(premaster, preSz); + ret = wc_fspsm_generatePremasterSecret(premaster, preSz); ssl->arrays->preMasterSz = preSz; } else @@ -892,7 +882,7 @@ */ WOLFSSL_LOCAL int Renesas_cmn_genMasterSecret(struct WOLFSSL* ssl, void* ctx) { - int ret = WOLFSSL_NOT_IMPLEMENTED; + int ret = WC_NO_ERR_TRACE(WOLFSSL_NOT_IMPLEMENTED); (void) ret; (void) ctx; @@ -933,17 +923,17 @@ else ret = PROTOCOLCB_UNAVAILABLE; - #elif defined(WOLFSSL_RENESAS_SCEPROTECT) + #elif defined(WOLFSSL_RENESAS_FSPSM_TLS) if (Renesas_cmn_usable(ssl, 0)) { - ret = wc_sce_generateMasterSecret( + ret = wc_fspsm_generateMasterSecret( ssl->options.cipherSuite0, ssl->options.cipherSuite, ssl->arrays->preMasterSecret, ssl->arrays->clientRandom, ssl->arrays->serverRandom, - ssl->arrays->sce_masterSecret); + ssl->arrays->fspsm_masterSecret); if (ret == 0) { - wc_sce_storeKeyCtx(ssl, ctx); + wc_fspsm_storeKeyCtx(ssl, ctx); /* set Session Key generation Callback for use */ wolfSSL_CTX_SetGenSessionKeyCb(ssl->ctx, Renesas_cmn_generateSessionKey); @@ -1016,9 +1006,10 @@ ret = CRYPTOCB_UNAVAILABLE; } - #elif defined(WOLFSSL_RENESAS_SCEPROTECT) - if (wc_sce_usable(ssl, 0) && EncSz == 256) { - ret = wc_sce_generateEncryptPreMasterSecret(ssl, out, outSz); + #elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + if (wc_fspsm_usable(ssl, 0) && EncSz == 256) { + ret = wc_fspsm_generateEncryptPreMasterSecret(ssl, out, + (uint32_t*)outSz); } else { if (EncSz != 256) @@ -1058,9 +1049,10 @@ } else ret = PROTOCOLCB_UNAVAILABLE; -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) - if (wc_sce_usable(ssl, 1)) { - ret = wc_sce_Sha256VerifyHmac(ssl, message, messageSz, macSz, content); +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) + if (wc_fspsm_usable(ssl, 1)) { + ret = wc_fspsm_Sha256VerifyHmac(ssl, message, + messageSz, macSz, content); } else ret = PROTOCOLCB_UNAVAILABLE; @@ -1114,11 +1106,11 @@ } -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) if (Renesas_cmn_usable(ssl, 1)) { if (ssl->specs.hash_size == WC_SHA256_DIGEST_SIZE) { wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify); - ret = wc_sce_Sha256GenerateHmac(ssl, myInner, + ret = wc_fspsm_Sha256GenerateHmac(ssl, myInner, WOLFSSL_TLS_HMAC_INNER_SZ, in, sz, digest); } else @@ -1189,9 +1181,10 @@ else ret = CRYPTOCB_UNAVAILABLE; -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) if (CertAtt->keyIndex != NULL) { - ret = wc_sce_tls_CertVerify(CertAtt->cert, CertAtt->certSz, sig, sigSz, + ret = wc_fspsm_tls_CertVerify(CertAtt->cert, CertAtt->certSz, + sig, sigSz, CertAtt->pubkey_n_start - CertAtt->certBegin, CertAtt->pubkey_n_len - 1, CertAtt->pubkey_e_start - CertAtt->certBegin, @@ -1273,9 +1266,10 @@ } else ret = CRYPTOCB_UNAVAILABLE; -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) +#elif defined(WOLFSSL_RENESAS_FSPSM_TLS) if (CertAtt->keyIndex != NULL) { - ret = wc_sce_tls_CertVerify(CertAtt->cert, CertAtt->certSz, sig, sigSz, + ret = wc_fspsm_tls_CertVerify(CertAtt->cert, CertAtt->certSz, + sig, sigSz, CertAtt->pubkey_n_start - CertAtt->certBegin, CertAtt->pubkey_n_len - 1, CertAtt->pubkey_e_start - CertAtt->certBegin, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_aes.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,816 @@ +/* renesas_fspsm_aes.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif +#include + +#ifndef NO_AES + +#if (defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY)) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_AES) + +#include +#include +#include +#include +#ifdef WOLF_CRYPTO_CB + #include +#endif +#include "wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h" + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +struct Aes; + +WOLFSSL_LOCAL void *Renesas_cmn_GetCbCtxBydevId(int devId); + +#define SCE_AES_GCM_AUTH_TAG_SIZE 16 + +#if defined(WOLFSSL_RENESAS_RSIP) +extern FSPSM_INSTANCE gFSPSM_ctrl; +#endif + +typedef fsp_err_t (*aesGcmEncInitFn) + (FSPSM_AESGCM_HANDLE*, FSPSM_AES_PWKEY, uint8_t*, uint32_t); +typedef fsp_err_t (*aesGcmEncUpdateFn) + (FSPSM_AESGCM_HANDLE*,uint8_t*, uint8_t*, uint32_t, uint8_t*, uint32_t); +typedef fsp_err_t (*aesGcmEncFinalFn) + (FSPSM_AESGCM_HANDLE*, uint8_t*, uint32_t*, uint8_t*); + +typedef fsp_err_t (*aesGcmDecInitFn) + (FSPSM_AESGCM_HANDLE*, FSPSM_AES_PWKEY, uint8_t*, uint32_t); +typedef fsp_err_t (*aesGcmDecUpdateFn) + (FSPSM_AESGCM_HANDLE*,uint8_t*, uint8_t*, uint32_t, uint8_t*, uint32_t); +typedef fsp_err_t (*aesGcmDecFinalFn) + (FSPSM_AESGCM_HANDLE*, uint8_t*, uint32_t*, uint8_t*, uint32_t); + +#if defined(WOLFSSL_RENESAS_RSIP) +/* wrapper for Gcm encrypt init */ +static fsp_err_t _R_RSIP_AES_GCM_EncryptInit(FSPSM_AESGCM_HANDLE* h, + FSPSM_AES_PWKEY k, uint8_t* iv, + uint32_t iv_l) +{ + (void) h; + return R_RSIP_AES_GCM_EncryptInit(&gFSPSM_ctrl, (FSPSM_AES_PWKEY const)k, + (uint8_t* const)iv, iv_l); +} +/* wrapper for Gcm encrypt update */ +static fsp_err_t _R_RSIP_AES_GCM_EncryptUpdate(FSPSM_AESGCM_HANDLE* h, + uint8_t* p_plain, uint8_t* p_cipher, uint32_t plain_length, + uint8_t* p_add, uint32_t add_len) +{ + (void) h; + return R_RSIP_AES_GCM_EncryptUpdate(&gFSPSM_ctrl, (uint8_t* const) p_plain, + (uint8_t* const) p_cipher, + (uint32_t const) plain_length, + (uint8_t* const) p_add, + (uint32_t const) add_len); +} +/* wrapper for Gcm encrypt final */ +static fsp_err_t _R_RSIP_AES_GCM_EncryptFinal(FSPSM_AESGCM_HANDLE* h, + uint8_t* p_cipher, uint32_t* c_len, + uint8_t* p_atag) +{ + (void) h; + return R_RSIP_AES_GCM_EncryptFinal(&gFSPSM_ctrl, (uint8_t* const) p_cipher, + (uint32_t* const) c_len, + (uint8_t* const) p_atag); +} +/* wrapper for Gcm decrypt init */ +static fsp_err_t _R_RSIP_AES_GCM_DecryptInit(FSPSM_AESGCM_HANDLE* h, + FSPSM_AES_PWKEY k, uint8_t* iv, uint32_t iv_l) +{ + (void) h; + return R_RSIP_AES_GCM_DecryptInit(&gFSPSM_ctrl, (FSPSM_AES_PWKEY const)k, + (uint8_t* const)iv, iv_l); +} +/* wrapper for Gcm decrypt update */ +static fsp_err_t _R_RSIP_AES_GCM_DecryptUpdate(FSPSM_AESGCM_HANDLE* h, + uint8_t* p_cipher, uint8_t* p_plain, uint32_t c_length, + uint8_t* p_add, uint32_t add_len) +{ + (void) h; + return R_RSIP_AES_GCM_DecryptUpdate(&gFSPSM_ctrl, (uint8_t* const) p_cipher, + (uint8_t* const) p_plain, + (uint32_t const) c_length, + (uint8_t* const) p_add, + (uint32_t const) add_len); +} +/* wrapper for Gcm decrypt final */ +static fsp_err_t _R_RSIP_AES_GCM_DecryptFinal(FSPSM_AESGCM_HANDLE* h, + uint8_t* p_plain, uint32_t* plain_len, + uint8_t* p_atag, uint32_t atag_len) +{ + (void) h; + return R_RSIP_AES_GCM_DecryptFinal(&gFSPSM_ctrl, (uint8_t* const) p_plain, + (uint32_t* const) plain_len, + (uint8_t* const) p_atag, + (uint32_t const) atag_len); +} +/* wrapper for aes cbc encrypt init */ +static fsp_err_t _R_RSIP_AESCBC_Cipher_EncryptInit(FSPSM_AES_HANDLE* h, + FSPSM_AES_PWKEY k, + uint8_t* iv) +{ + (void) h; + return R_RSIP_AES_Cipher_EncryptInit(&gFSPSM_ctrl, + RSIP_AES_MODE_CBC, + k, iv); +} +/* wrapper for aes cbc encrypt update */ +static fsp_err_t _R_RSIP_AESCBC_Cipher_EncryptUpdate(FSPSM_AES_HANDLE* h, + uint8_t* p_plain, + uint8_t* p_cipher, + uint32_t plain_length) +{ + (void) h; + return R_RSIP_AES_Cipher_EncryptUpdate(&gFSPSM_ctrl, + (const uint8_t* const)p_plain, + (uint8_t* const)p_cipher, + (const uint32_t)plain_length); +} +/* wrapper for aes cbc encrypt final */ +static fsp_err_t _R_RSIP_AESCBC_Cipher_EncryptFinal(FSPSM_AES_HANDLE* h, + uint8_t* p_cipher, + uint32_t* cipher_lengh) +{ + (void) h; + return R_RSIP_AES_Cipher_EncryptFinal(&gFSPSM_ctrl, + (uint8_t* const)p_cipher, + (uint32_t* const)cipher_lengh); +} +/* wrapper for aes cbc decrypt init */ +static fsp_err_t _R_RSIP_AESCBC_Cipher_DecryptInit(FSPSM_AES_HANDLE* h, + FSPSM_AES_PWKEY k, + uint8_t* iv) +{ + (void) h; + return R_RSIP_AES_Cipher_DecryptInit(&gFSPSM_ctrl, + RSIP_AES_MODE_CBC, + k, iv); +} +/* wrapper for aes cbc decrypt update */ +static fsp_err_t _R_RSIP_AESCBC_Cipher_DecryptUpdate(FSPSM_AES_HANDLE* h, + uint8_t* p_cipher, + uint8_t* p_plain, + uint32_t cipher_lengh) +{ + (void) h; + return R_RSIP_AES_Cipher_DecryptUpdate(&gFSPSM_ctrl, + (const uint8_t* const)p_cipher, + (uint8_t* const)p_plain, + (const uint32_t)cipher_lengh); +} +/* wrapper for aes cbc encrypt final */ +static fsp_err_t _R_RSIP_AESCBC_Cipher_DecryptFinal(FSPSM_AES_HANDLE* h, + uint8_t* p_plain, + uint32_t* plain_lengh) +{ + (void) h; + return R_RSIP_AES_Cipher_DecryptFinal(&gFSPSM_ctrl, + (uint8_t* const)p_plain, + (uint32_t* const)plain_lengh); +} +#endif +/* Perform Aes Gcm encryption by FSP SM + * + * aes The AES object. + * out Buffer to hold cipher text + * in Buffer to hold plaintext + * sz Length of cipher text/plaintext in bytes + * iv Buffer holding IV/nonce + * ivSz Length of IV/nonce in bytes + * authTag Buffer to hold authentication data + * authTagSz Length of authentication data in bytes + * ctx The callback context + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ +WOLFSSL_LOCAL int wc_fspsm_AesGcmEncrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz, + byte* iv, word32 ivSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, + void* ctx) +{ + int ret; + FSPSM_AESGCM_HANDLE _handle; + uint32_t dataLen = sz; + FSPSM_ST *info = (FSPSM_ST*)ctx; + + aesGcmEncInitFn initFn; + aesGcmEncUpdateFn updateFn; + aesGcmEncFinalFn finalFn; + + uint8_t* plainBuf = NULL; + uint8_t* cipherBuf = NULL; + uint8_t* aTagBuf = NULL; + uint8_t delta; + const uint8_t* iv_l = NULL; + uint32_t ivSz_l = 0; + +#ifdef WOLFSSL_RENESAS_FSPSM_TLS + FSPSM_HMAC_WKEY key_client_mac; + FSPSM_HMAC_WKEY key_server_mac; +#endif + FSPSM_AES_PWKEY key_client_aes = NULL; + FSPSM_AES_PWKEY key_server_aes = NULL; + (void) key_server_aes; + + /* sanity check */ + if (aes == NULL || authTagSz > AES_BLOCK_SIZE || ivSz == 0 || ctx == NULL) { + return BAD_FUNC_ARG; + } + + if (authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ) { + WOLFSSL_MSG("GcmEncrypt authTagSz too small error"); + return BAD_FUNC_ARG; + } + + if (aes->ctx.keySize != 16 && aes->ctx.keySize != 32) { + WOLFSSL_MSG("keySize is invalid, neither 16 or 32."); + return BAD_FUNC_ARG; + } + + if (aes->ctx.keySize == 16) { + initFn = FSPSM_AES128GCMEnc_Init; + updateFn = FSPSM_AES128GCMEnc_Up; + finalFn = FSPSM_AES128GCMEnc_Final; + } + else { + initFn = FSPSM_AES256GCMEnc_Init; + updateFn = FSPSM_AES256GCMEnc_Up; + finalFn = FSPSM_AES256GCMEnc_Final; + } + + + /* check if AES GCM can be used by FSP SM */ + if ((ret = wc_fspsm_hw_lock()) == 0) { + + /* allocate buffers for plain text, cipher text and authTag to make sure + * those buffers 32bit aligned as SCE requests. + */ + delta = ((sz % AES_BLOCK_SIZE) == 0) ? 0 : + (byte)(AES_BLOCK_SIZE - (sz % AES_BLOCK_SIZE)); + plainBuf = XMALLOC(sz, aes->heap, DYNAMIC_TYPE_AES); + cipherBuf = XMALLOC(sz + delta, aes->heap, DYNAMIC_TYPE_AES); + aTagBuf = XMALLOC(SCE_AES_GCM_AUTH_TAG_SIZE, aes->heap, + DYNAMIC_TYPE_AES); + + if ((sz > 0 && plainBuf == NULL) || + ((sz + delta) > 0 && cipherBuf == NULL) || aTagBuf == NULL) { + WOLFSSL_MSG("wc_fspsm_AesGcmEncrypt: buffer allocation failed"); + ret = -1; + } + + if (ret == 0) { + XMEMCPY(plainBuf, in, sz); + XMEMSET((void*)cipherBuf, 0, sz + delta); + XMEMSET((void*)authTag, 0, authTagSz); + } + + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) + if (ret == 0 && + info->keyflgs_tls.bits.session_key_set == 1) { + /* generate AES-GCM session key. The key stored in + * Aes.ctx.tsip_keyIdx is not used here. + */ + key_client_aes = (FSPSM_AES_PWKEY)XMALLOC(sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + key_server_aes = (FSPSM_AES_PWKEY)XMALLOC(sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + if (key_client_aes == NULL || key_server_aes == NULL) { + XFREE(plainBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(cipherBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(aTagBuf, aes->heap, DYNAMIC_TYPE_AES); + return MEMORY_E; + } + + ret = FSPSM_SESSIONKEY_GEN_FUNC( + info->cipher, + (uint32_t*)info->masterSecret, + (uint8_t*) info->clientRandom, + (uint8_t*) info->serverRandom, + &iv[AESGCM_IMP_IV_SZ], /* use exp_IV */ + &key_client_mac, + &key_server_mac, + key_client_aes, + key_server_aes, + NULL, NULL); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_XXX_TLS_SessionKeyGenerate failed"); + ret = -1; + } + + } + else { + #else + if (ret == 0) { + #endif + if (info->keyflgs_crypt.bits.aes256_installedkey_set == 1 || + info->keyflgs_crypt.bits.aes128_installedkey_set == 1) { + key_client_aes = aes->ctx.wrapped_key; + iv_l = iv; + ivSz_l = ivSz; + } + else { + WOLFSSL_MSG("AES key for FSP SM is not set."); + ret = -1; + } + } + + if (ret == 0) { + + /* since generated session key is coupled to iv, no need to pass + * them init func. + */ + ret = initFn(&_handle, key_client_aes, (uint8_t*)iv_l, ivSz_l); + + if (ret == FSP_SUCCESS) { + ret = updateFn(&_handle, NULL, NULL, 0UL, (uint8_t*)authIn, + authInSz); + } + if (ret == FSP_SUCCESS) { + ret = updateFn(&_handle, plainBuf, cipherBuf, sz, NULL, 0UL); + } + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_XXXX_AesXXXGcmEncryptUpdate2: failed"); + ret = -1; + } + + if (ret == FSP_SUCCESS) { + /* Once R_SCE_AesxxxGcmEncryptInit or R_SCE_AesxxxEncryptUpdate is + * called, R_SCE_AesxxxGcmEncryptFinal must be called regardless of + * the result of the previous call. Otherwise, SCE can not come out + * from its error state and all the trailing APIs will fail. + */ + dataLen = 0; + ret = finalFn(&_handle, + cipherBuf + (sz + delta - AES_BLOCK_SIZE), + &dataLen, + aTagBuf); + + if (ret == FSP_SUCCESS) { + /* copy encrypted data to out */ + if (sz != dataLen) { + WOLFSSL_MSG("sz is not equal to dataLen!!!!"); + ret = -1; + } else { + XMEMCPY(out, cipherBuf, dataLen); + /* copy auth tag to caller's buffer */ + XMEMCPY((void*)authTag, (void*)aTagBuf, + min(authTagSz, SCE_AES_GCM_AUTH_TAG_SIZE )); + } + } + else { + WOLFSSL_MSG("R_SCE_AesxxxGcmEncryptFinal: failed"); + ret = -1; + } + } + } + + XFREE(plainBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(cipherBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(aTagBuf, aes->heap, DYNAMIC_TYPE_AES); + if (info->keyflgs_tls.bits.session_key_set == 1 && + key_client_aes != NULL) + XFREE(key_client_aes, aes->heap, DYNAMIC_TYPE_AES); + if (info->keyflgs_tls.bits.session_key_set == 1 && + key_server_aes != NULL) + XFREE(key_server_aes, aes->heap, DYNAMIC_TYPE_AES); + wc_fspsm_hw_unlock(); + } + + return ret; +} +/* Perform Aes Gcm decryption by FSP SM + * + * aes The AES object. + * out Buffer to hold plaintext + * in Buffer to hold cipher text + * sz Length of cipher text/plaintext in bytes + * iv Buffer holding IV/nonce + * ivSz Length of IV/nonce in bytes + * authTag Buffer to hold authentication data + * authTagSz Length of authentication data in bytes + * ctx The Callback context + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ +WOLFSSL_LOCAL int wc_fspsm_AesGcmDecrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz, + const byte* iv, word32 ivSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, + void* ctx) +{ + int ret; + FSPSM_AESGCM_HANDLE _handle; + uint32_t dataLen = sz; + FSPSM_ST *info = (FSPSM_ST*)ctx; + + aesGcmDecInitFn initFn; + aesGcmDecUpdateFn updateFn; + aesGcmDecFinalFn finalFn; + + uint8_t* cipherBuf = NULL; + uint8_t* plainBuf = NULL; + uint8_t* aTagBuf = NULL; + uint8_t delta; + const uint8_t* iv_l = NULL; + uint32_t ivSz_l = 0; + +#ifdef WOLFSSL_RENESAS_FSPSM_TLS + FSPSM_HMAC_WKEY key_client_mac; + FSPSM_HMAC_WKEY key_server_mac; +#endif + FSPSM_AES_PWKEY key_client_aes = NULL; + FSPSM_AES_PWKEY key_server_aes = NULL; + (void) key_client_aes; + /* sanity check */ + if (aes == NULL || authTagSz > AES_BLOCK_SIZE || ivSz == 0 || ctx == NULL) { + return BAD_FUNC_ARG; + } + + if (authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ) { + WOLFSSL_MSG("GcmEncrypt authTagSz too small error"); + return BAD_FUNC_ARG; + } + + if (aes->ctx.keySize != 16 && aes->ctx.keySize != 32) { + WOLFSSL_MSG("keySize is invalid, neither 16 or 32."); + return BAD_FUNC_ARG; + } + + if (aes->ctx.keySize == 16) { + initFn = FSPSM_AES128GCMDec_Init; + updateFn = FSPSM_AES128GCMDec_Up; + finalFn = FSPSM_AES128GCMDec_Final; + } + else { + initFn = FSPSM_AES256GCMDec_Init; + updateFn = FSPSM_AES256GCMDec_Up; + finalFn = FSPSM_AES256GCMDec_Final; + } + + + if ((ret = wc_fspsm_hw_lock()) == 0) { + /* allocate buffers for plain-text, cipher-text, authTag and AAD. + * TSIP requests those buffers 32bit aligned. + */ + delta = ((sz % AES_BLOCK_SIZE) == 0) ? 0 : + (byte)(AES_BLOCK_SIZE - (sz % AES_BLOCK_SIZE)); + cipherBuf = XMALLOC(sz, aes->heap, DYNAMIC_TYPE_AES); + plainBuf = XMALLOC(sz + delta, aes->heap, DYNAMIC_TYPE_AES); + aTagBuf = XMALLOC(SCE_AES_GCM_AUTH_TAG_SIZE, aes->heap, + DYNAMIC_TYPE_AES); + + if (plainBuf == NULL || cipherBuf == NULL || aTagBuf == NULL) { + ret = -1; + } + + if (ret == 0) { + XMEMSET((void*)plainBuf, 0, sz); + XMEMCPY(cipherBuf, in, sz); + XMEMCPY(aTagBuf, authTag, authTagSz); + } + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) + if (ret == 0 && + info->keyflgs_tls.bits.session_key_set == 1) { + /* generate AES-GCM session key. The key stored in + * Aes.ctx.tsip_keyIdx is not used here. + */ + key_client_aes = (FSPSM_AES_PWKEY)XMALLOC(sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + key_server_aes = (FSPSM_AES_PWKEY)XMALLOC(sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + if (key_client_aes == NULL || key_server_aes == NULL) { + XFREE(plainBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(cipherBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(aTagBuf, aes->heap, DYNAMIC_TYPE_AES); + return MEMORY_E; + } + + ret = FSPSM_SESSIONKEY_GEN_FUNC( + info->cipher, + (uint32_t*)info->masterSecret, + (uint8_t*) info->clientRandom, + (uint8_t*) info->serverRandom, + (uint8_t*)&iv[AESGCM_IMP_IV_SZ], /* use exp_IV */ + &key_client_mac, + &key_server_mac, + key_client_aes, + key_server_aes, + NULL, NULL); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_XXXX_TLS_SessionKeyGenerate failed"); + ret = -1; + } + } + else { + #else + if (ret == 0) { + #endif + if (info->keyflgs_crypt.bits.aes256_installedkey_set == 1 || + info->keyflgs_crypt.bits.aes128_installedkey_set == 1) { + + key_server_aes = aes->ctx.wrapped_key; + iv_l = iv; + ivSz_l = ivSz; + } + else { + WOLFSSL_MSG("AES key for FSP SM is not set."); + ret = -1; + } + } + + if (ret == 0) { + /* since key_index has iv and ivSz in it, no need to pass them init + * func. Pass NULL and 0 as 3rd and 4th parameter respectively. + */ + ret = initFn(&_handle, key_server_aes, (uint8_t*)iv_l, ivSz_l); + + + if (ret == FSP_SUCCESS) { + /* pass only AAD and it's size before passing cipher text */ + ret = updateFn(&_handle, NULL, NULL, 0UL, (uint8_t*)authIn, + authInSz); + } + if (ret == FSP_SUCCESS) { + ret = updateFn(&_handle, cipherBuf, plainBuf, sz, NULL, 0UL); + } + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_XXXX_AesXXXGcmDecryptUpdate: failed in decrypt"); + ret = -1; + } + + if (ret == FSP_SUCCESS) { + dataLen = 0; + ret = finalFn(&_handle, + plainBuf + (sz + delta - AES_BLOCK_SIZE), + &dataLen, + aTagBuf, + min(16, authTagSz)); + + if (ret == FSP_SUCCESS) { + /* copy plain data to out */ + if (sz != dataLen) { + WOLFSSL_MSG("sz is not equal to dataLen!!!!"); + ret = -1; + } + else { + XMEMCPY(out, plainBuf, dataLen); + } + } + else { + WOLFSSL_MSG("R_XXXX_AesXXXGcmDecryptFinal: failed"); + ret = -1; + } + } + } + + XFREE(aTagBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(plainBuf, aes->heap, DYNAMIC_TYPE_AES); + XFREE(cipherBuf, aes->heap, DYNAMIC_TYPE_AES); + if (info->keyflgs_tls.bits.session_key_set == 1 && + key_client_aes != NULL) + XFREE(key_client_aes, aes->heap, DYNAMIC_TYPE_AES); + if (info->keyflgs_tls.bits.session_key_set == 1 && + key_server_aes != NULL) + XFREE(key_server_aes, aes->heap, DYNAMIC_TYPE_AES); + wc_fspsm_hw_unlock(); + } + + return ret; +} +/* Perform Aes Cbc encryption by FSP SM + * + * aes The AES object. + * out Buffer to hold cipher text + * in Buffer to hold plain text + * sz Length of cipher text/plaintext in bytes + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ +WOLFSSL_LOCAL int wc_fspsm_AesCbcEncrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz) +{ + FSPSM_AES_HANDLE _handle; + int ret; + word32 blocks = (sz / AES_BLOCK_SIZE); + uint32_t dataLength; + byte *iv; + + if ((in == NULL) || (out == NULL) || (aes == NULL)) + return BAD_FUNC_ARG; + + /* while doing TLS handshake, SCE driver keeps true-key and iv * + * on the device. iv is dummy */ + iv = (uint8_t*)aes->reg; + + if ((ret = wc_fspsm_hw_lock()) != 0) { + WOLFSSL_MSG("Failed to lock"); + return ret; + } + + if (aes->ctx.keySize == 16) { + ret = FSPSM_AES128CBCEnc_Init(&_handle, + aes->ctx.wrapped_key, + iv); + } + else if (aes->ctx.keySize == 32) { + ret = FSPSM_AES256CBCEnc_Init(&_handle, + aes->ctx.wrapped_key, + iv); + } + else { + WOLFSSL_MSG("invalid key Size for SCE. Key size is neither 16 or 32."); + wc_fspsm_hw_unlock(); + return -1; + } + + while (ret == FSP_SUCCESS && blocks--) { + + if (aes->ctx.keySize == 16) + ret = FSPSM_AES128CBCEnc_Up(&_handle, (uint8_t*)in, + (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); + else + ret = FSPSM_AES256CBCEnc_Up(&_handle, (uint8_t*)in, + (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); + + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + + if (ret == FSP_SUCCESS) { + if (aes->ctx.keySize == 16) { + ret = FSPSM_AES128CBCEnc_Final(&_handle, out, &dataLength); + } + else { + ret = FSPSM_AES256CBCEnc_Final(&_handle, out, &dataLength); + } + } + else { + WOLFSSL_MSG("SCE AES CBC encryption failed"); + ret = -1; + } + + wc_fspsm_hw_unlock(); + return ret; +} +/* Perform Aes Cbc decryption by SCE + * + * aes The AES object. + * out Buffer to hold plain text + * in Buffer to hold cipher text + * sz Length of cipher text/plaintext in bytes + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ +WOLFSSL_LOCAL int wc_fspsm_AesCbcDecrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz) +{ + FSPSM_AES_HANDLE _handle; + int ret; + word32 blocks = (sz / AES_BLOCK_SIZE); + uint32_t dataLength; + byte *iv; + + if ((in == NULL) || (out == NULL) || (aes == NULL)) + return BAD_FUNC_ARG; + + iv = (uint8_t*)aes->reg; + + if ((ret = wc_fspsm_hw_lock()) != 0) { + WOLFSSL_MSG("Failed to lock"); + return ret; + } + + if (aes->ctx.keySize == 16) { + ret = FSPSM_AES128CBCDec_Init(&_handle, + aes->ctx.wrapped_key, + iv); + } + else if (aes->ctx.keySize == 32) { + ret = FSPSM_AES256CBCDec_Init(&_handle, + aes->ctx.wrapped_key, + iv); + } + else { + wc_fspsm_hw_unlock(); + return -1; + } + + while (ret == FSP_SUCCESS && blocks--) { + + if (aes->ctx.keySize == 16) + ret = FSPSM_AES128CBCDec_Up(&_handle, (uint8_t*)in, + (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); + else + ret = FSPSM_AES256CBCDec_Up(&_handle, (uint8_t*)in, + (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); + + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + + if (ret == FSP_SUCCESS) { + if (aes->ctx.keySize == 16) + ret = FSPSM_AES128CBCDec_Final(&_handle, out, &dataLength); + else + ret = FSPSM_AES256CBCDec_Final(&_handle, out, &dataLength); + } + else { + WOLFSSL_MSG("SCE AES CBC decryption failed"); + ret = -1; + } + + wc_fspsm_hw_unlock(); + return ret; +} + + +/* free contentx related to FSP SM + * + * aes The AES object. + * return none + */ +WOLFSSL_LOCAL void wc_fspsm_Aesfree(Aes* aes) +{ +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) + /* In the case of session key, memory is allocated + * therefore, it should be freed here + */ + if (aes->ctx.setup == 1 && aes->ctx.wrapped_key) { + XFREE(aes->ctx.wrapped_key, aes->heap, DYNAMIC_TYPE_AES); + aes->ctx.setup = 0; + } +#else + if (aes->ctx.wrapped_key) { + /* aes ctx just points user created wrapped key + * in the case of CryptOnly Mode + * therefore, it just sets pointing to NULL. + * user key should be freed by owner(user) + */ + aes->ctx.wrapped_key = NULL; + } +#endif +} + +#if defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) +int wc_AesSetKey(Aes* aes, const byte* userKey, word32 keylen, + const byte* iv, int dir) +{ + (void) userKey; + (void) dir; + + if (aes == NULL || userKey == NULL || + !((keylen == 16) || (keylen == 32))) { + return BAD_FUNC_ARG; + } + + if (aes->devId == INVALID_DEVID) { + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_AES_COUNTER + aes->left = 0; +#endif + + /* if there is previous key, free */ + if(aes->ctx.wrapped_key) + wc_fspsm_Aesfree(aes); + /* Generate aes key based on length */ + aes->ctx.wrapped_key = (FSPSM_AES_PWKEY)userKey; + aes->keylen = (int)keylen; + aes->ctx.keySize = keylen; + + return wc_AesSetIV(aes, iv); +} +#endif +#endif /* WOLFSSL_RENESAS_FSPSM_TLS + WOLFSSL_RENESAS_FSPSM_CRYPTONLY + NO_WOLFSSL_RENESAS_FSPSM_AES */ +#endif /* NO_AES */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_rsa.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_rsa.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,348 @@ +/* renesas_fspsm_rsa.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include + +#if !defined(NO_RSA) && \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + +#include +#include + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include + +#if defined(WOLFSSL_RENESAS_RSIP) +extern FSPSM_INSTANCE gFSPSM_ctrl; +#endif + +/* Set Ctx pointer to NULL. + * A created wrapped key should be freed by user + * + * key RsaKey object + * return none + */ +WOLFSSL_LOCAL void wc_fspsm_RsaKeyFree(RsaKey *key) +{ + if (key == NULL) + return; + + if(key->ctx.wrapped_pri1024_key) + key->ctx.wrapped_pri1024_key = NULL; + + if(key->ctx.wrapped_pub1024_key) + key->ctx.wrapped_pub1024_key = NULL; + + if(key->ctx.wrapped_pri2048_key) + key->ctx.wrapped_pri2048_key = NULL; + + if(key->ctx.wrapped_pub2048_key) + key->ctx.wrapped_pub2048_key = NULL; +} + +/* Set Rsa key by pre-created wrapped user key + * + * key RsaKey object + * size desired keylenth, in bits. supports 1024 or 2048 bits + * ctx Callback context including pointer to hold generated key + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ +WOLFSSL_LOCAL int wc_fspsm_MakeRsaKey(RsaKey *key, int size, void* ctx) +{ + FSPSM_ST *info = (FSPSM_ST*)ctx; + + /* sanity check */ + if (key == NULL || size < 0 || ctx == NULL) + return BAD_FUNC_ARG; + + if (size == 1024) { + if(info->keyflgs_crypt.bits.rsapri1024_installedkey_set != 1 || + info->keyflgs_crypt.bits.rsapub1024_installedkey_set != 1) { + WOLFSSL_MSG("Caller should create user key in advance."); + WOLFSSL_MSG("Caller also need to installedkey to 1."); + return BAD_FUNC_ARG; + } + key->ctx.wrapped_pri1024_key = info->wrapped_key_rsapri1024; + key->ctx.wrapped_pub1024_key = info->wrapped_key_rsapub1024; + key->ctx.keySz = 1024; + } else if (size == 2048) { + if(info->keyflgs_crypt.bits.rsapri2048_installedkey_set != 1 || + info->keyflgs_crypt.bits.rsapub2048_installedkey_set != 1) { + WOLFSSL_MSG("Caller should create user key in advance."); + WOLFSSL_MSG("Caller also need to installedkey to 1."); + return BAD_FUNC_ARG; + } + key->ctx.wrapped_pri2048_key = info->wrapped_key_rsapri2048; + key->ctx.wrapped_pub2048_key = info->wrapped_key_rsapub2048; + key->ctx.keySz = 2048; + } else if (size == 0) { + if((info->keyflgs_crypt.bits.rsapri2048_installedkey_set != 1) && + (info->keyflgs_crypt.bits.rsapub2048_installedkey_set != 1) && + (info->keyflgs_crypt.bits.rsapri1024_installedkey_set != 1) && + (info->keyflgs_crypt.bits.rsapub1024_installedkey_set != 1)) { + WOLFSSL_MSG("Caller should create user key in advance."); + WOLFSSL_MSG("Caller also need to installedkey to 1."); + return BAD_FUNC_ARG; + } + + if (info->keyflgs_crypt.bits.rsapri1024_installedkey_set == 1) { + key->ctx.wrapped_pri1024_key = info->wrapped_key_rsapri1024; + key->ctx.keySz = 1024; + } + if (info->keyflgs_crypt.bits.rsapub1024_installedkey_set == 1) { + key->ctx.wrapped_pub1024_key = info->wrapped_key_rsapub1024; + key->ctx.keySz = 1024; + } + + if (info->keyflgs_crypt.bits.rsapri2048_installedkey_set == 1) { + key->ctx.wrapped_pri2048_key = info->wrapped_key_rsapri2048; + key->ctx.keySz = 2048; + } + if (info->keyflgs_crypt.bits.rsapub2048_installedkey_set == 1) { + key->ctx.wrapped_pub2048_key = info->wrapped_key_rsapub2048; + key->ctx.keySz = 2048; + } + } else + return CRYPTOCB_UNAVAILABLE; + + return 0; +} + +/* Perform rsa encryption/decryption by FSP SM + * Assumes to be called by Crypt Callback + * + * in Buffer to hold plain text + * inLen Length of plain text in bytes + * out Buffer to hold cipher text + * outLen Length of cipher in bytes + * key Rsa key object + * rng rng object + * ctx Callback context + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ +WOLFSSL_LOCAL int wc_fspsm_RsaFunction(const byte* in, word32 inLen, byte* out, + word32 *outLen, int type, struct RsaKey* key, + struct WC_RNG* rng) +{ + int ret; + + FSPSM_RSA_DATA plain; + FSPSM_RSA_DATA cipher; + + int keySize; + + (void) key; + (void) rng; + + /* sanity check */ + if (in == NULL || out == NULL || key == NULL){ + return BAD_FUNC_ARG; + } + + keySize = (int)key->ctx.keySz; + + if (keySize == 0) { + WOLFSSL_MSG("keySize is invalid, neither 128 or 256 bytes, " + "1024 or 2048 bits."); + return BAD_FUNC_ARG; + } + + if ((ret = wc_fspsm_hw_lock()) == 0) { + if (type == RSA_PUBLIC_ENCRYPT) { + + plain.pdata = (byte*)in; + plain.data_length = inLen; + cipher.pdata = out; + cipher.data_length = *outLen; + + if (keySize == 1024) { + ret = FSPSM_RSA1024_PKCSENC_FUNC(&plain, &cipher, + (FSPSM_RSA1024_WPB_KEY*) + key->ctx.wrapped_pub1024_key); + } + else { + ret = FSPSM_RSA2048_PKCSENC_FUNC(&plain, &cipher, + (FSPSM_RSA2048_WPB_KEY*) + key->ctx.wrapped_pub2048_key); + } + } + else if (type == RSA_PRIVATE_DECRYPT) { + plain.pdata = out; + plain.data_length = *outLen; + cipher.pdata = (byte*)in; + cipher.data_length = inLen; + + if (keySize == 1024) { + ret = FSPSM_RSA1024_PKCSDEC_FUNC(&cipher, &plain, + (FSPSM_RSA1024_WPI_KEY*) + key->ctx.wrapped_pri1024_key, &outLen); + } + else { + ret = FSPSM_RSA2048_PKCSDEC_FUNC(&cipher, &plain, + (FSPSM_RSA2048_WPI_KEY*) + key->ctx.wrapped_pri2048_key, &outLen); + } + } + + wc_fspsm_hw_unlock(); + } + return ret; +} + +/* Perform Rsa sign by FSP SM + * Assumes to be called by Crypt Callback + * + * in Buffer to hold plaintext + * inLen Length of plaintext in bytes + * out Buffer to hold generated signature + * outLen Length of signature in bytes + * key rsa key object + * ctx The callback context + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ + +WOLFSSL_LOCAL int wc_fspsm_RsaSign(const byte* in, word32 inLen, byte* out, + word32* outLen, struct RsaKey* key, void* ctx) +{ + int ret; + + FSPSM_RSA_DATA message_hash; + FSPSM_RSA_DATA signature; + FSPSM_ST *info = (FSPSM_ST*)ctx; + int keySize; + + /* sanity check */ + if (in == NULL || out == NULL || *outLen <= 0 || info == NULL || + key == NULL){ + return BAD_FUNC_ARG; + } + + keySize = (int)key->ctx.keySz; + + message_hash.pdata = (byte *)in; + message_hash.data_length = inLen; + message_hash.data_type = + info->keyflgs_crypt.bits.message_type;/* message 0, hash 1 */ + signature.pdata = out; + signature.data_length = (word32*)outLen; + + #if defined(WOLFSSL_RENESAS_RSIP) + message_hash.hash_type = signature.hash_type = + info->hash_type; /* hash type */ + #endif + + if ((ret = wc_fspsm_hw_lock()) == 0) { + if (keySize == 1024) { + + ret = FSPSM_RSA1024_SIGN_FUNC(&message_hash, + &signature, + (FSPSM_RSA1024_WPI_KEY *) + key->ctx.wrapped_pri1024_key, + HW_SCE_RSA_HASH_SHA256); + } + else { + + ret = FSPSM_RSA2048_SIGN_FUNC(&message_hash, + &signature, + (FSPSM_RSA2048_WPI_KEY *) + key->ctx.wrapped_pri2048_key, + HW_SCE_RSA_HASH_SHA256); + } + + wc_fspsm_hw_unlock(); + } + + return ret; +} + +/* Perform Rsa verify by FSP SM + * Assumes to be called by Crypt Callback + * + * in Buffer to hold plaintext + * inLen Length of plaintext in bytes + * out Buffer to hold generated signature + * outLen Length of signature in bytes + * key rsa key object + * ctx The callback context + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ + +WOLFSSL_LOCAL int wc_fspsm_RsaVerify(const byte* in, word32 inLen, byte* out, + word32* outLen,struct RsaKey* key, void* ctx) +{ + int ret; + + FSPSM_RSA_DATA message_hash; + FSPSM_RSA_DATA signature; + FSPSM_ST *info = (FSPSM_ST*)ctx; + int keySize; + + (void) key; + + /* sanity check */ + if (in == NULL || out == NULL || *outLen <= 0 || info == NULL || + key == NULL){ + return BAD_FUNC_ARG; + } + + keySize = (int)key->ctx.keySz; + + + message_hash.pdata =(byte*)in; + message_hash.data_length = inLen; + message_hash.data_type = + info->keyflgs_crypt.bits.message_type;/* message 0, hash 1 */ + + signature.pdata = out; + signature.data_length = (word32)*outLen; + #if defined(WOLFSSL_RENESAS_RSIP) + message_hash.hash_type = signature.hash_type = + info->hash_type; /* hash type */ + #endif + + if ((ret = wc_fspsm_hw_lock()) == 0) { + if (keySize == 1024) { + ret = FSPSM_RSA1024_VRY_FUNC(&signature, + &message_hash, + (FSPSM_RSA1024_WPB_KEY *) + key->ctx.wrapped_pub1024_key, + HW_SCE_RSA_HASH_SHA256); + } + else { + ret = FSPSM_RSA2048_VRY_FUNC(&signature, + &message_hash, + (FSPSM_RSA2048_WPB_KEY *) + key->ctx.wrapped_pub2048_key, + HW_SCE_RSA_HASH_SHA256 ); + } + wc_fspsm_hw_unlock(); + } + + return ret; +} + +#endif /* !NO_RSA && WOLFSSL_RENESAS_FSPSM_CRYPTONLY */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,686 @@ +/* renesas_fspsm_sha.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include +#include + +#ifdef HAVE_CONFIG_H + #include +#endif +#include + +#if !defined(NO_SHA256) + +#include + +#if (defined(WOLFSSL_RENESAS_SCEPROTECT) || \ + defined(WOLFSSL_RENESAS_RSIP)) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) + +#include +#include + +#if defined(WOLFSSL_RENESAS_RSIP) +extern FSPSM_INSTANCE gFSPSM_ctrl; + +/* wrapper for RSIP SHA1 Init */ +static fsp_err_t _R_RSIP_SHA1_GenerateInit(FSPSM_SHA_HANDLE* h) +{ + return R_RSIP_SHA_GenerateInit(&gFSPSM_ctrl, h, RSIP_HASH_TYPE_SHA1 ); +} +/* wrapper for RSIP SHA224 Init */ +static fsp_err_t _R_RSIP_SHA224_GenerateInit(FSPSM_SHA_HANDLE* h) +{ + return R_RSIP_SHA_GenerateInit(&gFSPSM_ctrl, h, RSIP_HASH_TYPE_SHA224 ); +} +/* wrapper for RSIP SHA256 Init */ +static fsp_err_t _R_RSIP_SHA256_GenerateInit(FSPSM_SHA_HANDLE* h) +{ + return R_RSIP_SHA_GenerateInit(&gFSPSM_ctrl, h, RSIP_HASH_TYPE_SHA256 ); +} +/* wrapper for RSIP SHA384 Init */ +static fsp_err_t _R_RSIP_SHA384_GenerateInit(FSPSM_SHA_HANDLE* h) +{ + return R_RSIP_SHA_GenerateInit(&gFSPSM_ctrl, h, RSIP_HASH_TYPE_SHA384 ); +} +/* wrapper for RSIP SHA512 Init */ +static fsp_err_t _R_RSIP_SHA512_GenerateInit(FSPSM_SHA_HANDLE* h) +{ + return R_RSIP_SHA_GenerateInit(&gFSPSM_ctrl, h, RSIP_HASH_TYPE_SHA512 ); +} +/* wrapper for RSIP SHA512_224 Init */ +static fsp_err_t _R_RSIP_SHA512_224_GenerateInit(FSPSM_SHA_HANDLE* h) +{ + return R_RSIP_SHA_GenerateInit(&gFSPSM_ctrl, h, RSIP_HASH_TYPE_SHA512_224 ); +} +/* wrapper for RSIP SHA512_256 Init */ +static fsp_err_t _R_RSIP_SHA512_256_GenerateInit(FSPSM_SHA_HANDLE* h) +{ + return R_RSIP_SHA_GenerateInit(&gFSPSM_ctrl, h, RSIP_HASH_TYPE_SHA512_256 ); +} +/* wrapper for RSIP SHA Update */ +static fsp_err_t _R_RSIP_SHA_GenerateUpdate(FSPSM_SHA_HANDLE* h, + uint8_t* m, uint32_t len) +{ + return R_RSIP_SHA_GenerateUpdate(&gFSPSM_ctrl, h, m, len ); +} +/* wrapper for RSIP SHA Final */ +static fsp_err_t _R_RSIP_SHA_GenerateFinal(FSPSM_SHA_HANDLE* h, + uint8_t* d, uint32_t *sz) +{ + (void) sz; + return R_RSIP_SHA_GenerateFinal(&gFSPSM_ctrl, h, d); +} +#endif /* WOLFSSL_RENESAS_RSIP */ +/* Free up allocation for msg + * + * hash The FSPSM Hash object. + * no return value + */ +static void FSPSM_HashFree(wolfssl_FSPSM_Hash* hash) +{ + if (hash == NULL) + return; + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + if (hash->msg != NULL) { + XFREE(hash->msg, hash->heap, DYNAMIC_TYPE_TMP_BUFFER); + hash->msg = NULL; + } +#endif + +} +/* copy hash result from src to dst */ +static int FSPSM_HashCopy(wolfssl_FSPSM_Hash* src, wolfssl_FSPSM_Hash* dst) +{ + if (src == NULL || dst == NULL) { + return BAD_FUNC_ARG; + } + + XMEMCPY(dst, src, sizeof(wolfssl_FSPSM_Hash)); + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + if (src->len > 0 && src->msg != NULL) { + dst->msg = (byte*)XMALLOC(src->len, dst->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (dst->msg == NULL) { + return MEMORY_E; + } + XMEMCPY(dst->msg, src->msg, src->len); + } +#endif + return 0; +} +/* Initialize Hash object + * + * hash The FSPSM Hash object. + * heap Buffer to hold heap if available + * devId device Id + * return 0 on success, BAD_FUNC_ARG when has is NULL + */ +static int FSPSM_HashInit(wolfssl_FSPSM_Hash* hash, void* heap, int devId, + word32 sha_type) +{ +#if defined(WOLFSSL_RENESAS_RSIP) + int ret; + fsp_err_t (*Init)(FSPSM_SHA_HANDLE*); +#endif + if (hash == NULL) { + return BAD_FUNC_ARG; + } + + (void)devId; + XMEMSET(hash, 0, sizeof(wolfssl_FSPSM_Hash)); + hash->sha_type = sha_type; + hash->heap = heap; + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + hash->len = 0; + hash->used = 0; + hash->msg = NULL; + +#elif defined(WOLFSSL_RENESAS_RSIP) + + switch(hash->sha_type) { + case FSPSM_SHA1: + Init = FSPSM_SHA1_Init; + break; + case FSPSM_SHA256: + Init = FSPSM_SHA256_Init; + break; + case FSPSM_SHA224: + Init = FSPSM_SHA224_Init; + break; + case FSPSM_SHA384: + Init = FSPSM_SHA384_Init; + break; + case FSPSM_SHA512: + Init = FSPSM_SHA512_Init; + break; + case FSPSM_SHA512_224: + Init = FSPSM_SHA512_224_Init; + break; + case FSPSM_SHA512_256: + Init = FSPSM_SHA512_256_Init; + break; + default: + return BAD_FUNC_ARG; + } + wc_fspsm_hw_lock(); + ret = Init(&hash->handle); + wc_fspsm_hw_unlock(); + return ret; +#endif + + return 0; +} + +/* Add data to msg(work buffer) for final hash operation + * + * hash The FSPSM Hash object. + * data Buffer to hold plain text for hash + * sz Length of data + * return 0 on success, otherwise MEMORY_E or BAD_FUNC_ARG on failure + */ +static int FSPSM_HashUpdate(wolfssl_FSPSM_Hash* hash, + const byte* data, word32 sz) +{ +#if defined(WOLFSSL_RENESAS_RSIP) + int ret; + fsp_err_t (*Update)(FSPSM_SHA_HANDLE*, uint8_t*, uint32_t); +#endif + + if (hash == NULL || (sz > 0 && data == NULL)) { + return BAD_FUNC_ARG; + } + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + if (hash->len < hash->used + sz) { + if (hash->msg == NULL) { + hash->msg = (byte*)XMALLOC(hash->used + sz, hash->heap, + DYNAMIC_TYPE_TMP_BUFFER); + } + else { +#ifdef FREERTOS + byte* pt = (byte*)XMALLOC(hash->used + sz, hash->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (pt == NULL) { + return MEMORY_E; + } + XMEMCPY(pt, hash->msg, hash->used); + XFREE(hash->msg, hash->heap, DYNAMIC_TYPE_TMP_BUFFER); + hash->msg = NULL; + hash->msg = pt; +#else + byte* pt = (byte*)XREALLOC(hash->msg, hash->used + sz, hash->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (pt == NULL) { + return MEMORY_E; + } + hash->msg = pt; +#endif + } + if (hash->msg == NULL) { + return MEMORY_E; + } + hash->len = hash->used + sz; + } + XMEMCPY(hash->msg + hash->used, data , sz); + hash->used += sz; +#elif defined(WOLFSSL_RENESAS_RSIP) + + switch(hash->sha_type) { + case FSPSM_SHA1: + Update = FSPSM_SHA1_Up; + break; + case FSPSM_SHA256: + Update = FSPSM_SHA256_Up; + break; + case FSPSM_SHA224: + Update = FSPSM_SHA224_Up; + break; + case FSPSM_SHA384: + Update = FSPSM_SHA384_Up; + break; + case FSPSM_SHA512: + Update = FSPSM_SHA512_Up; + break; + case FSPSM_SHA512_224: + Update = FSPSM_SHA512_224_Up; + break; + case FSPSM_SHA512_256: + Update = FSPSM_SHA512_256_Up; + break; + default: + return BAD_FUNC_ARG; + } + wc_fspsm_hw_lock(); + ret = Update(&hash->handle, (byte*)data, sz); + wc_fspsm_hw_unlock(); + return ret; +#endif + return 0; +} + +/* Perform hash operation using accumulated msg + * + * hash The FSPSM Hash object. + * out Buffer to hold hashed text + * outSz Length of out + * return FSP_SUCCESS(0) on success, + * otherwise BAD_FUNC_ARG or FSP Error code on failure + */ +static int FSPSM_HashFinal(wolfssl_FSPSM_Hash* hash, byte* out, word32 outSz) +{ + int ret = FSP_SUCCESS; + fsp_err_t (*Final )(FSPSM_SHA_HANDLE*, uint8_t*, uint32_t*); + uint32_t sz; + void* heap; + (void) outSz; + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + FSPSM_SHA_HANDLE handle; + fsp_err_t (*Init)(FSPSM_SHA_HANDLE*); + fsp_err_t (*Update)(FSPSM_SHA_HANDLE*, uint8_t*, uint32_t); + + if (hash == NULL || out == NULL) { + return BAD_FUNC_ARG; + } + + if (hash->sha_type == FSPSM_SHA256) { + Init = FSPSM_SHA256_Init; + Update = FSPSM_SHA256_Up; + Final = FSPSM_SHA256_Final; + } else + return BAD_FUNC_ARG; + + wc_fspsm_hw_lock(); + + if (Init(&handle) == FSP_SUCCESS) { + ret = Update(&handle, (uint8_t*)hash->msg, hash->used); + if (ret == FSP_SUCCESS) { + ret = Final(&handle, out, (uint32_t*)&sz); + if (ret != FSP_SUCCESS + #if defined(WOLFSSL_RENESAS_SCEPROTECT) + || sz != outSz + #endif + ) { + WOLFSSL_MSG("Sha operation failed"); + WOLFSSL_ERROR(WC_HW_E); + ret = WC_HW_E; + } + } + } + wc_fspsm_hw_unlock(); + +#elif defined(WOLFSSL_RENESAS_RSIP) + switch(hash->sha_type) { + case FSPSM_SHA1: + Final = FSPSM_SHA1_Final; + break; + case FSPSM_SHA256: + Final = FSPSM_SHA256_Final; + break; + case FSPSM_SHA224: + Final = FSPSM_SHA224_Final; + break; + case FSPSM_SHA384: + Final = FSPSM_SHA384_Final; + break; + case FSPSM_SHA512: + Final = FSPSM_SHA512_Final; + break; + case FSPSM_SHA512_224: + Final = FSPSM_SHA512_224_Final; + break; + case FSPSM_SHA512_256: + Final = FSPSM_SHA512_256_Final; + break; + default: + return BAD_FUNC_ARG; + } + + wc_fspsm_hw_lock(); + ret = Final(&hash->handle, out, (uint32_t*)&sz); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("Sha operation failed"); + WOLFSSL_ERROR(WC_HW_E); + ret = WC_HW_E; + } + wc_fspsm_hw_unlock(); +#endif + + heap = hash->heap; + + FSPSM_HashFree(hash); + FSPSM_HashInit(hash, heap, 0, hash->sha_type); + + return ret; +} +/* Hash operation to message and return a result */ +static int FSPSM_HashGet(wolfssl_FSPSM_Hash* hash, byte* out, word32 outSz) +{ + int ret = FSP_SUCCESS; + fsp_err_t (*Final )(FSPSM_SHA_HANDLE*, uint8_t*, uint32_t*); + uint32_t sz = 0; + (void) outSz; + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + FSPSM_SHA_HANDLE handle; + fsp_err_t (*Init)(FSPSM_SHA_HANDLE*); + fsp_err_t (*Update)(FSPSM_SHA_HANDLE*, uint8_t*, uint32_t); +#elif defined(WOLFSSL_RENESAS_RSIP) + wolfssl_FSPSM_Hash hashCopy; +#endif + + + if (hash == NULL || out == NULL) { + return BAD_FUNC_ARG; + } + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + if (hash->sha_type == FSPSM_SHA256) { + Init = FSPSM_SHA256_Init; + Update = FSPSM_SHA256_Up; + Final = FSPSM_SHA256_Final; + } else + return BAD_FUNC_ARG; + + wc_fspsm_hw_lock(); + if (Init(&handle) == FSP_SUCCESS) { + ret = Update(&handle, (uint8_t*)hash->msg, hash->used); + if (ret == FSP_SUCCESS) { + ret = Final(&handle, out, &sz); + if (ret != FSP_SUCCESS + #if defined(WOLFSSL_RENESAS_SCEPROTECT) + || sz != outSz + #endif + ) { + WOLFSSL_MSG("Sha operation failed"); + WOLFSSL_ERROR(WC_HW_E); + ret = WC_HW_E; + } + } + } + wc_fspsm_hw_unlock(); + +#elif defined(WOLFSSL_RENESAS_RSIP) + switch(hash->sha_type) { + case FSPSM_SHA1: + Final = FSPSM_SHA1_Final; + break; + case FSPSM_SHA256: + Final = FSPSM_SHA256_Final; + break; + case FSPSM_SHA224: + Final = FSPSM_SHA224_Final; + break; + case FSPSM_SHA384: + Final = FSPSM_SHA384_Final; + break; + case FSPSM_SHA512: + Final = FSPSM_SHA512_Final; + break; + case FSPSM_SHA512_224: + Final = FSPSM_SHA512_224_Final; + break; + case FSPSM_SHA512_256: + Final = FSPSM_SHA512_256_Final; + break; + default: + return BAD_FUNC_ARG; + } + + + if(FSPSM_HashCopy(hash, &hashCopy) != 0) { + WOLFSSL_MSG("ShaCopy operation failed"); + WOLFSSL_ERROR(WC_HW_E); + ret = WC_HW_E; + } + wc_fspsm_hw_lock(); + ret = Final(&hashCopy.handle, out, (uint32_t*)&sz); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("Sha operation failed"); + WOLFSSL_ERROR(WC_HW_E); + ret = WC_HW_E; + } + wc_fspsm_hw_unlock(); + +#endif + + return ret; +} + + + +#if !defined(NO_SHA) && defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) +#include + +int wc_InitSha_ex(wc_Sha* sha, void* heap, int devId) +{ + return FSPSM_HashInit(sha, heap, devId, FSPSM_SHA1); +} + +int wc_ShaUpdate(wc_Sha* sha, const byte* in, word32 sz) +{ + return FSPSM_HashUpdate(sha, in, sz); +} + +int wc_ShaFinal(wc_Sha* sha, byte* hash) +{ + return FSPSM_HashFinal(sha, hash, WC_SHA_DIGEST_SIZE); +} + +int wc_ShaGetHash(wc_Sha* sha, byte* hash) +{ + return FSPSM_HashGet(sha, hash, WC_SHA_DIGEST_SIZE); +} + +int wc_ShaCopy(wc_Sha* src, wc_Sha* dst) +{ + return FSPSM_HashCopy(src, dst); +} +#endif /* !NO_SHA && WOLFSSL_RENESAS_RSIP*/ + +#if defined(WOLFSSL_SHA224) && defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) +#include + +/* WolfCrypt wrapper function for RX64 SHA224 Init */ +int wc_InitSha224_ex(wc_Sha224* sha, void* heap, int devId) +{ + return FSPSM_HashInit(sha, heap, devId, FSPSM_SHA224); +} +/* WolfCrypt wrapper function for RX64 SHA224 Update */ +int wc_Sha224Update(wc_Sha224* sha, const byte* in, word32 sz) +{ + return FSPSM_HashUpdate(sha, in, sz); +} +/* WolfCrypt wrapper function for RX64 SHA224 Final */ +int wc_Sha224Final(wc_Sha224* sha, byte* hash) +{ + return FSPSM_HashFinal(sha, hash, WC_SHA224_DIGEST_SIZE); +} +/* WolfCrypt wrapper function for RX64 SHA224 Get */ +int wc_Sha224GetHash(wc_Sha224* sha, byte* hash) +{ + return FSPSM_HashGet(sha, hash, WC_SHA224_DIGEST_SIZE); +} +/* WolfCrypt wrapper function for RX64 SHA224 Copy */ +int wc_Sha224Copy(wc_Sha224* src, wc_Sha224* dst) +{ + return FSPSM_HashCopy(src, dst); +} +#endif /* WOLFSSL_SHA224 */ + +#if !defined(NO_SHA256) +#if (defined(WOLFSSL_RENESAS_SCEPROTECT) || \ + defined(WOLFSSL_RENESAS_RSIP)) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) +#include + +/* wrapper for wc_InitSha256_ex */ +int wc_InitSha256_ex(wc_Sha256* sha, void* heap, int devId) +{ + return FSPSM_HashInit(sha, heap, devId, FSPSM_SHA256); +} +/* wrapper for wc_Sha256Update */ +int wc_Sha256Update(wc_Sha256* sha, const byte* in, word32 sz) +{ + return FSPSM_HashUpdate(sha, in, sz); +} +/* wrapper for wc_Sha256Final */ +int wc_Sha256Final(wc_Sha256* sha, byte* hash) +{ + return FSPSM_HashFinal(sha, hash, WC_SHA256_DIGEST_SIZE); +} +/* wrapper for wc_Sha256GetHash */ +int wc_Sha256GetHash(wc_Sha256* sha, byte* hash) +{ + return FSPSM_HashGet(sha, hash, WC_SHA256_DIGEST_SIZE); +} +/* wrapper for wc_Sha256Copy */ +int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst) +{ + return FSPSM_HashCopy(src, dst); +} +#endif /* !NO_SHA256 */ +#endif /* WOLFSSL_RENESAS_SCEPROTECT) || \ + * WOLFSSL_RENESAS_RSIP */ + +#if defined(WOLFSSL_SHA384) && defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) +#include +/* wrapper for wc_InitSha384_ex */ +int wc_InitSha384_ex(wc_Sha384* sha, void* heap, int devid) +{ + return FSPSM_HashInit(sha, heap, devid, FSPSM_SHA384); +} +/* wrapper for wc_InitSha384_ex */ +int wc_Sha384Update(wc_Sha384* sha, const byte* in, word32 sz) +{ + return FSPSM_HashUpdate(sha, in, sz); +} +/* wrapper for wc_Sha384Final */ +int wc_Sha384Final(wc_Sha384* sha, byte* hash) +{ + return FSPSM_HashFinal(sha, hash, WC_SHA384_DIGEST_SIZE); +} +/* wrapper for wc_Sha384GetHash */ +int wc_Sha384GetHash(wc_Sha384* sha, byte* hash) +{ + return FSPSM_HashGet(sha, hash, WC_SHA384_DIGEST_SIZE); +} +/* wrapper for wc_Sha384Copy */ +int wc_Sha384Copy(wc_Sha384* src, wc_Sha384* dst) +{ + return FSPSM_HashCopy(src, dst); +} +#endif /* WOLFSSL_SHA384 */ + +#if defined(WOLFSSL_SHA512) && defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) +#include + +/* wrapper for wc_InitSha512_ex */ +int wc_InitSha512_ex(wc_Sha512* sha, void* heap, int devid) +{ + return FSPSM_HashInit(sha, heap, devid, FSPSM_SHA512); +} + +/* wrapper for wc_Sha512Update */ +int wc_Sha512Update(wc_Sha512* sha, const byte* in, word32 sz) +{ + return FSPSM_HashUpdate(sha, in, sz); +} + +/* wrapper for wc_Sha512Final */ +int wc_Sha512Final(wc_Sha512* sha, byte* hash) +{ + return FSPSM_HashFinal(sha, hash, WC_SHA512_DIGEST_SIZE); +} +/* wrapper for wc_Sha512GetHash */ +int wc_Sha512GetHash(wc_Sha512* sha, byte* hash) +{ + return FSPSM_HashGet(sha, hash, WC_SHA512_DIGEST_SIZE); +} +/* wrapper for wc_Sha512Copy */ +int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst) +{ + return FSPSM_HashCopy(src, dst); +} + +#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) +#if !defined(WOLFSSL_NOSHA512_224) && \ + (defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) + +/* create KCAPI handle for SHA512 operation */ +int wc_InitSha512_224_ex(wc_Sha512* sha, void* heap, int devid) +{ + return FSPSM_HashInit(sha, heap, devid, FSPSM_SHA512_224); +} + +int wc_Sha512_224Final(wc_Sha512* sha, byte* hash) +{ + return FSPSM_HashFinal(sha, hash, WC_SHA512_224_DIGEST_SIZE); +} +int wc_Sha512_224GetHash(wc_Sha512* sha, byte* hash) +{ + return FSPSM_HashGet(sha, hash, WC_SHA512_224_DIGEST_SIZE); +} + +int wc_Sha512_224Copy(wc_Sha512* src, wc_Sha512* dst) +{ + return FSPSM_HashCopy(src, dst); +} +#endif /* !WOLFSSL_NOSHA512_224 */ + +#if !defined(WOLFSSL_NOSHA512_256) && \ + (defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) + +/* create KCAPI handle for SHA512 operation */ +int wc_InitSha512_256_ex(wc_Sha512* sha, void* heap, int devid) +{ + return FSPSM_HashInit(sha, heap, devid, FSPSM_SHA512_256); +} + +int wc_Sha512_256Final(wc_Sha512* sha, byte* hash) +{ + return FSPSM_HashFinal(sha, hash, WC_SHA512_256_DIGEST_SIZE); +} +int wc_Sha512_256GetHash(wc_Sha512* sha, byte* hash) +{ + return FSPSM_HashGet(sha, hash, WC_SHA512_224_DIGEST_SIZE); +} + +int wc_Sha512_256Copy(wc_Sha512* src, wc_Sha512* dst) +{ + return FSPSM_HashCopy(src, dst); +} +#endif /* !WOLFSSL_NOSHA512_256 */ +#endif /* !HAVE_FIPS && !HAVE_SELFTEST */ + +#endif /* WOLFSSL_SHA512 */ + + +#endif /* WOLFSSL_RENESAS_FSPSM_TLS */ +#endif /* #if !defined(NO_SHA) || !defined(NO_SHA256) */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_util.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_util.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_util.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_fspsm_util.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1252 @@ +/* renesas_fspsm_util.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#include + + +#if defined(WOLFSSL_RENESAS_RSIP) || \ + defined(WOLFSSL_RENESAS_SCEPROTECT) + +#include + +/* expect to have these variables defined at user application */ +extern FSPSM_INSTANCE gFSPSM_ctrl; +extern FSPSM_CONFIG gFSPSM_cfg; + +#if defined(WOLFSSL_RENESAS_FSPSM) + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#if defined(DEBUG_PK_CB) + #define WOLFSSL_PKMSG(_f_, ...) printf(_f_, ##__VA_ARGS__) +#else + #define WOLFSSL_PKMSG(_f_, ...) WC_DO_NOTHING +#endif + +#if defined(WOLFSSL_RENESAS_FSPSM_ECC) +WOLFSSL_GLOBAL FSPSM_ST_PKC gPKCbInfo; +#endif + + +#ifdef WOLFSSL_RENESAS_FSPSM_TLS +static const byte* ca_cert_sig; +static fspsm_key_data g_user_key_info; + +static uint32_t g_encrypted_publicCA_key[HW_SCE_SINST_WORD_SIZE]; +extern uint32_t g_CAscm_Idx; /* index of CM table */ +static uint32_t fspsm_sess_idx = 0; +#endif + +#endif /* WOLFSSL_RENESAS_FSPSM*/ + +wolfSSL_Mutex fspsm_mutex; +static int fspsm_CryptHwMutexInit_ = 0; + + +/* Mutex Init */ +static int fspsm_CryptHwMutexInit(wolfSSL_Mutex* mutex) +{ + return wc_InitMutex(mutex); +} +/* Mutex Lock */ +static int fspsm_CryptHwMutexLock(wolfSSL_Mutex* mutex) +{ + return wc_LockMutex(mutex); +} +/* Mutex Unlock */ +static int fspsm_CryptHwMutexUnLock(wolfSSL_Mutex* mutex) +{ + return wc_UnLockMutex(mutex); +} + +/* +* lock hw engine +* this should be called before using engine. +*/ +WOLFSSL_LOCAL int wc_fspsm_hw_lock() +{ + int ret = 0; + + if (fspsm_CryptHwMutexInit_ == 0) { + + ret = fspsm_CryptHwMutexInit(&fspsm_mutex); + + if (ret == 0) { + fspsm_CryptHwMutexInit_ = 1; + } + else { + WOLFSSL_MSG(" mutex initialization failed."); + return -1; + } + } + if (fspsm_CryptHwMutexLock(&fspsm_mutex) != 0) { + /* this should not happens */ + return -1; + } + + return ret; +} + +/* +* release hw engine +*/ +WOLFSSL_LOCAL void wc_fspsm_hw_unlock(void) +{ + fspsm_CryptHwMutexUnLock(&fspsm_mutex); +} + +/* Open sce driver for use */ +WOLFSSL_LOCAL int wc_fspsm_Open() +{ + WOLFSSL_ENTER("wc_fspsm_Open"); + int ret; + if ((ret = wc_fspsm_hw_lock()) == 0) { + + ret = FSPSM_OPEN(&gFSPSM_ctrl, &gFSPSM_cfg); + + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("RENESAS SCE Open failed"); + } + + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) + if (ret == FSP_SUCCESS && g_user_key_info.encrypted_user_tls_key) { + + ret = FSPSM_ROOTCA_RSA2048( + g_user_key_info.encrypted_provisioning_key, + g_user_key_info.iv, + g_user_key_info.encrypted_user_tls_key, + &g_user_key_info.user_rsa2048_tls_wrappedkey); /* OUT */ + + /* init vars */ + g_CAscm_Idx = (uint32_t)-1; + + } + else { + WOLFSSL_MSG("Failed to lock sce hw "); + } + #endif + } + + /* unlock hw */ + wc_fspsm_hw_unlock(); + + WOLFSSL_LEAVE("wc_fspsm_Open", ret); + return ret; +} + +/* close SCE driver */ +WOLFSSL_LOCAL void wc_fspsm_Close() +{ + WOLFSSL_ENTER("sce Close"); + int ret; + + if ((ret = wc_fspsm_hw_lock()) == 0) { + /* close SCE */ + ret = FSPSM_CLOSE(&gFSPSM_ctrl); + + /* unlock hw */ + wc_fspsm_hw_unlock(); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("RENESAS SCE Close failed"); + } + } + else { + WOLFSSL_MSG("Failed to unlock sce hw "); + } +} + +#define RANDGEN_WORDS 4 +WOLFSSL_LOCAL int wc_fspsm_GenerateRandBlock(byte* output, word32 sz) +{ + /* Generate PRNG based on NIST SP800-90A AES CTR-DRBG */ + int ret = 0; + word32 fspbuf[RANDGEN_WORDS]; + + while (sz > 0) { + word32 len = sizeof(buffer); + + if (sz < len) { + len = sz; + } + /* return 4 words random number*/ + ret = R_RANDOM_GEN((uint8_t* const)fspbuf); + if(ret == FSP_SUCCESS) { + XMEMCPY(output, &fspbuf, len); + output += len; + sz -= len; + } else { + WOLFSSL_MSG_EX("FSP SM Rnd Generate() Returned 0x%08x", ret); + return WC_HW_E; + } + } + return ret; +} + +#if defined(WOLFSSL_RENESAS_FSPSM) && \ + defined(WOLFSSL_RENESAS_FSPSM_TLS) + +#if defined(WOLFSSL_RENESAS_FSPSM_ECC) +/* Verify Server Key Exchange while doing ECDH key exchange */ +static int fspsm_ServerKeyExVerify(uint32_t type, WOLFSSL* ssl, + const uint8_t* sig, + uint32_t sigSz, void* ctx) +{ + int ret = WOLFSSL_FAILURE; + FSPSM_ST* cbInfo; + byte qx[MAX_ECC_BYTES], qy[MAX_ECC_BYTES]; + byte *peerkey = NULL; + + word32 qxLen = sizeof(qx), qyLen = sizeof(qy); + (void) sigSz; + + /* sanity check */ + if (ssl == NULL || sig == NULL || ctx == NULL) + return ret; + + cbInfo = (FSPSM_ST*)ctx; + + /* export public peer public key */ + ret = wc_ecc_export_public_raw(ssl->peerEccKey, qx, &qxLen, qy, &qyLen); + WOLFSSL_PKMSG("qxLen %d qyLen %d\n", qxLen, qyLen); + if (ret != 0) { + WOLFSSL_MSG("failed to export peer ecc key"); + return ret; + } + /* make peer ecc key data for SCE */ + /* 0padding(24bit) || 04(8bit) || Qx(256bit) || Qy(256bit) */ + peerkey = (byte*)XMALLOC((3 + 1 + qxLen + qyLen), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (peerkey == NULL) { + WOLFSSL_MSG("failed to malloc ecc key"); + return WOLFSSL_FAILURE; + } + + XMEMSET(peerkey, 0, (3 + 1 + qxLen + qyLen)); + peerkey[3] = ECC_POINT_UNCOMP; + XMEMCPY(&peerkey[4], qx, qxLen); + XMEMCPY(&peerkey[4+qxLen], qy, qyLen); + + if ((ret = wc_fspsm_hw_lock()) == 0) { + /* 0 : RSA 2048bit, 1 : Reserved, 2 : ECDSA P-256 */ + ret = FSPSM_TLS_SVRKEYExVfy( + type, + (uint8_t*) ssl->arrays->clientRandom, + (uint8_t*) ssl->arrays->serverRandom, + (uint8_t*) peerkey, + (uint8_t*) sig, + (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex, + (uint32_t*)cbInfo->encrypted_ephemeral_ecdh_public_key); + + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("failed R_fspsm_TLS_ServerKeyExchangeVerify"); + cbInfo->keyflgs_tls.bits.pk_key_set = 0; + } + else { + ret = WOLFSSL_SUCCESS; + cbInfo->keyflgs_tls.bits.pk_key_set = 1; + } + } + else { + WOLFSSL_MSG("Failed to lock sce hw "); + } + + /* unlock hw */ + wc_fspsm_hw_unlock(); + + XFREE(peerkey, 0, DYNAMIC_TYPE_TMP_BUFFER); + return ret; +} +/* Callback for Rsa Verify */ +WOLFSSL_LOCAL int wc_fspsm_RsaVerifyTLS(WOLFSSL* ssl, byte* sig, uint32_t sigSz, + uint8_t** out, const byte* key, uint32_t keySz, void* ctx) +{ + int ret = WOLFSSL_FAILURE; + (void) out; + (void) key; + (void) keySz; + + WOLFSSL_PKMSG("SCE RSA Verify: sigSz %d, keySz %d\n", sigSz, keySz); + + if (wc_fspsm_usable(ssl, 0)) + ret = fspsm_ServerKeyExVerify(0, ssl, sig, sigSz, ctx); + else + ret = CRYPTOCB_UNAVAILABLE; + + if (ret == WOLFSSL_SUCCESS) + ret = 0; /* 0 for success */ + + WOLFSSL_PKMSG("SCE RSA Verify: ret %d\n", ret); + + return ret; +} +/* Callback for Ecc Verify */ +WOLFSSL_LOCAL int wc_fspsm_EccVerifyTLS(WOLFSSL* ssl, const uint8_t* sig, + uint32_t sigSz, const uint8_t* hash, uint32_t hashSz, + const uint8_t* key, uint32_t keySz, int* result, void* ctx) +{ + int ret = WOLFSSL_FAILURE; + uint8_t *sigforSCE; + const byte rs_size = HW_SCE_ECDSA_DATA_BYTE_SIZE/2; + byte offset = 0x3; + (void) sigSz; + (void) hash; + (void) hashSz; + (void) key; + (void) keySz; + + sigforSCE = NULL; + + WOLFSSL_PKMSG("SCE ECC Verify: ssl->options.serverState = %d sigSz %d, hashSz %d, keySz %d\n", + ssl->options.serverState, sigSz, hashSz, keySz); + + if (!wc_fspsm_usable(ssl, 0)) { + WOLFSSL_PKMSG("Cannot handle cipher suite by SCE"); + return CRYPTOCB_UNAVAILABLE; + } + + if ((sigforSCE = (uint8_t*)XMALLOC(HW_SCE_ECDSA_DATA_BYTE_SIZE, NULL, + DYNAMIC_TYPE_TEMP)) == NULL) { + WOLFSSL_MSG("failed to malloc memory"); + return MEMORY_E; + } + /* initialization */ + XMEMSET(sigforSCE, 0, HW_SCE_ECDSA_DATA_BYTE_SIZE); + + /* r */ + if (sig[offset] == 0x20) { + XMEMCPY(sigforSCE, &sig[offset+1], rs_size); + + offset = 0x25; + /* s */ + if (sig[offset] == 0x20) { + XMEMCPY(&sigforSCE[rs_size], &sig[offset+1], rs_size); + } + else { + XMEMCPY(&sigforSCE[rs_size], &sig[offset+2], rs_size); + } + } + else { + XMEMCPY(sigforSCE, &sig[offset+2], rs_size); + + offset = 0x26; + /* s */ + if (sig[offset] == rs_size) { + XMEMCPY(&sigforSCE[rs_size], &sig[offset+1], rs_size); + } + else { + XMEMCPY(&sigforSCE[rs_size], &sig[offset+2], rs_size); + } + } + + ret = fspsm_ServerKeyExVerify(2, ssl, sigforSCE, 64, ctx); + + if (sigforSCE) + XFREE(sigforSCE, NULL, DYNAMIC_TYPE_TEMP); + + if (ret == WOLFSSL_SUCCESS) { + *result = 1; + ret = 0; /* for success */ + } + else + *result = 0; + + WOLFSSL_PKMSG("SCE ECC Verify: ret %d, result %d\n", ret, *result); + + return ret; +} + +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + +/* Callback for ECC shared secret */ +WOLFSSL_LOCAL int fspsm_EccSharedSecret(WOLFSSL* ssl, ecc_key* otherKey, + uint8_t* pubKeyDer, unsigned int* pubKeySz, + uint8_t* out, unsigned int* outlen, int side, void* ctx) +{ + int ret = WOLFSSL_SUCCESS; + (void) otherKey; + (void) side; + + FSPSM_ST* cbInfo = (FSPSM_ST*)ctx; + + (void)ssl; + (void)cbInfo; + + /* sanity check */ + if (ssl == NULL || pubKeyDer == NULL || pubKeySz == NULL || + out == NULL || outlen == NULL || ctx == NULL) + return WOLFSSL_FAILURE; + + WOLFSSL_PKMSG("PK ECC PMS: Side %s, Peer Curve %d\n", + side == WOLFSSL_CLIENT_END ? "client" : "server", otherKey->dp->id); + + if (cbInfo->keyflgs_tls.bits.pk_key_set == 1) { + if ((ret = wc_fspsm_hw_lock()) == 0) { + /* Generate ECC PUblic key pair */ + ret = FSPSM_TLS_ECCS256R1_KPG( + &cbInfo->ecc_p256_wrapped_key, + (uint8_t*)&cbInfo->ecc_ecdh_public_key/* Qx 32 bytes and Qy 32 bytes*/ ); + if (ret != FSP_SUCCESS) { + WOLFSSL_PKMSG("Failed secp256r1_EphemeralWrappedKeyPairGenerate %d\n", ret); + return ret; + } + + /* copy generated ecdh public key into buffer */ + pubKeyDer[0] = ECC_POINT_UNCOMP; + *pubKeySz = 1 + sizeof(cbInfo->ecc_ecdh_public_key); + XMEMCPY(&pubKeyDer[1], &cbInfo->ecc_ecdh_public_key, + sizeof(cbInfo->ecc_ecdh_public_key)); + + /* Generate Premaster Secret */ + ret = FSPSM_TLS_PREMASTERGEN( + (uint32_t*)&cbInfo->encrypted_ephemeral_ecdh_public_key, + &cbInfo->ecc_p256_wrapped_key, + (uint32_t*)out/* pre-master secret 64 bytes */); + if (ret != FSP_SUCCESS) { + WOLFSSL_PKMSG("Failed PreMasterSecretGenerateForECC_secp256r1 %d\n", ret); + return ret; + } + else { + /* set master secret generation callback for use */ + wolfSSL_CTX_SetGenMasterSecretCb(ssl->ctx, Renesas_cmn_genMasterSecret); + wolfSSL_SetGenMasterSecretCtx(ssl, cbInfo); + } + } + else { + WOLFSSL_MSG("Failed to lock sce hw "); + } + + /* unlock hw */ + wc_fspsm_hw_unlock(); + + *outlen = 64; + WOLFSSL_PKMSG("PK ECC PMS: ret %d, PubKeySz %d, OutLen %d\n", ret, *pubKeySz, *outlen); + } + + return ret; +} +#endif + +/* Return tls cipher suite enumeration that is supported by SCE library */ +static uint32_t GetSceCipherSuite( + uint8_t cipherSuiteFirst, + uint8_t cipherSuite) +{ + WOLFSSL_ENTER("GetSceCipherSuite"); + uint32_t sceCipher; + + if (cipherSuiteFirst == CIPHER_BYTE) + { + switch(cipherSuite) { + case TLS_RSA_WITH_AES_128_CBC_SHA256: + sceCipher = SCE_TLS_RSA_WITH_AES_128_CBC_SHA256; + break; + + case TLS_RSA_WITH_AES_256_CBC_SHA256: + sceCipher = SCE_TLS_RSA_WITH_AES_256_CBC_SHA256; + break; + + default: + sceCipher = (uint32_t)WOLFSSL_FSPSM_ILLEGAL_CIPHERSUITE; + break; + } + WOLFSSL_MSG("<< GetSceCipherSuite"); + return sceCipher; + } + else if (cipherSuiteFirst == ECC_BYTE) + { + sceCipher = (uint32_t)WOLFSSL_FSPSM_ILLEGAL_CIPHERSUITE; + /* comment out until implementation completes */ + switch(cipherSuite) { + + case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: + sceCipher = SCE_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256; + break; + + case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: + sceCipher = SCE_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256; + break; + + case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: + sceCipher = SCE_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; + break; + + case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: + sceCipher = SCE_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256; + break; + + default: + sceCipher = (uint32_t)WOLFSSL_FSPSM_ILLEGAL_CIPHERSUITE; + break; + } + } + else{ + sceCipher = (uint32_t)WOLFSSL_FSPSM_ILLEGAL_CIPHERSUITE; + } + + WOLFSSL_MSG("<< GetSceCipherSuite"); + + return sceCipher; +} +/* check if sce tls functions can be used for the cipher */ +/* */ +/* ssl : a pointer to WOLFSSL object */ +/* session_key_generated : if session key has been generated */ +/* return 1 for usable, 0 for unusable */ +WOLFSSL_LOCAL int wc_fspsm_usable(const WOLFSSL *ssl, + uint8_t session_key_generated) +{ + WOLFSSL_ENTER("fspsm_usable"); + uint32_t sceCipher; + byte side; + const Ciphers *enc; + const Ciphers *dec; + + /* sanity check */ + if (ssl == NULL) + return BAD_FUNC_ARG; + + /* when rsa key index == NULL, SCE isn't used for cert verification. */ + /* in the case, we cannot use TSIP. */ + if (!ssl->peerSceTsipEncRsaKeyIndex) + return 0; + + /* when enabled Extended Master Secret, we cannot use SCE. */ + if (ssl->options.haveEMS) + return 0; + + /* when session_key_generated is set as 1, expects to be created */ + /* session key already. */ + if (session_key_generated) { + enc = &ssl->encrypt; + dec = &ssl->decrypt; + if (enc == NULL || dec == NULL) { + /* something wrong */ + return 0; + } + if (enc->aes == NULL || dec->aes == NULL) { + return 0; + } + if (enc->aes->ctx.setup == 0) { + /* session key for SCE is not created */ + return 0; + } + } + /* retrieve cipher suite if SCE supports */ + sceCipher = GetSceCipherSuite(ssl->options.cipherSuite0, + ssl->options.cipherSuite); + side = ssl->options.side; + + if (sceCipher != (uint32_t)WOLFSSL_FSPSM_ILLEGAL_CIPHERSUITE + && side == WOLFSSL_CLIENT_END) + return 1; + else + return 0; +} + +/* Generate Hmac by sha256*/ +WOLFSSL_LOCAL int wc_fspsm_Sha256GenerateHmac(const WOLFSSL *ssl, + const uint8_t* myInner, uint32_t innerSz,const uint8_t* in, + uint32_t sz, byte* digest) +{ + WOLFSSL_ENTER("fspsm_Sha256HmacGenerate"); + + FSPSM_HMAC_HANDLE _handle; + FSPSM_HMAC_WKEY wrapped_key; + int ret; + + if ((ssl == NULL) || (myInner == NULL) || (in == NULL) || + (digest == NULL)) + return BAD_FUNC_ARG; + + wrapped_key = ssl->keys.fspsm_client_write_MAC_secret; + + if ((ret = wc_fspsm_hw_lock()) != 0) { + WOLFSSL_MSG("hw lock failed"); + return ret; + } + + ret = FSPSM_S256HMAC_GInt( + &_handle, + &wrapped_key); + + if (ret == FSP_SUCCESS) + ret = FSPSM_S256HMAC_GUp( + &_handle, + (uint8_t*)myInner, + innerSz); + + if (ret == FSP_SUCCESS) + ret = FSPSM_S256HMAC_GUp( + &_handle, + (uint8_t*)in, + sz); + + if (ret == FSP_SUCCESS) + ret = FSPSM_S256HMAC_GFnl( + &_handle, + digest); + + if (ret != FSP_SUCCESS) + ret = WOLFSSL_FAILURE; + + /* unlock hw */ + wc_fspsm_hw_unlock(); + WOLFSSL_LEAVE("fspsm_Sha256HmacGenerate", ret); + return ret; +} + +/* Verify hmac */ +WOLFSSL_LOCAL int wc_fspsm_Sha256VerifyHmac(const WOLFSSL *ssl, + const uint8_t* message, uint32_t messageSz, + uint32_t macSz, uint32_t content) +{ + WOLFSSL_ENTER("fspsm_Sha256HmacVerify"); + + FSPSM_HMAC_HANDLE _handle; + FSPSM_HMAC_WKEY wrapped_key; + byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ]; + int ret; + + if ((ssl == NULL) || (message == NULL)) + return BAD_FUNC_ARG; + + wrapped_key = ssl->keys.fspsm_server_write_MAC_secret; + + if ((ret = wc_fspsm_hw_lock()) != 0) { + WOLFSSL_MSG("hw lock failed"); + return ret; + } + + wolfSSL_SetTlsHmacInner((WOLFSSL*)ssl, myInner, + (word32)messageSz, (int)content, 1); + + ret = FSPSM_S256HMAC_VInt( + &_handle, + &wrapped_key); + + if (ret == FSP_SUCCESS) + ret = FSPSM_S256HMAC_VUp( + &_handle, + (uint8_t*)myInner, + WOLFSSL_TLS_HMAC_INNER_SZ); + + if (ret == FSP_SUCCESS) + ret = FSPSM_S256HMAC_VUp( + &_handle, + (uint8_t*)message, + (uint32_t)messageSz); + + if (ret == FSP_SUCCESS) + ret = FSPSM_S256HMAC_VFnl( + &_handle, + (uint8_t*)(message+messageSz), + (uint32_t)macSz); + + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("FSP SM Mac verification failed"); + } + + /* unlock hw */ + wc_fspsm_hw_unlock(); + WOLFSSL_LEAVE("fspsm_Sha256HmacVerify", ret); + return ret; +} + +/* generate Verify Data based on master secret */ +WOLFSSL_LOCAL int wc_fspsm_generateVerifyData( + const uint8_t *ms, /* master secret */ + const uint8_t *side, const uint8_t *handshake_hash, + uint8_t *hashes /* out */) +{ + WOLFSSL_ENTER("fspsm_generateVerifyData"); + int ret ; + uint32_t l_side = SCE_TLS_GENERATE_CLIENT_VERIFY; + + if ((ms == NULL) || (side == NULL) || (handshake_hash == NULL) || + (hashes == NULL)) + return BAD_FUNC_ARG; + + if (XSTRNCMP((const char*)side, (const char*)kTlsServerFinStr, + FINISHED_LABEL_SZ) == 0) + { + l_side = SCE_TLS_GENERATE_SERVER_VERIFY; + } + + if ((ret = wc_fspsm_hw_lock()) == 0) { + ret = FSPSM_VERIFY_DATA_FUNC(l_side, (uint32_t*)ms, + (uint8_t*)handshake_hash, hashes/* out */); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_fspsm_TLS_VerifyDataGenerate failed"); + } + } + /* unlock hw */ + wc_fspsm_hw_unlock(); + WOLFSSL_LEAVE("fspsm_generateVerifyData", ret); + return ret; +} + +/* generate keys for TLS communication */ +WOLFSSL_LOCAL int wc_fspsm_generateSessionKey(WOLFSSL *ssl, + FSPSM_ST* cbInfo, int devId) +{ + WOLFSSL_MSG("fspsm_generateSessionKey()"); + int ret; + Ciphers *enc; + Ciphers *dec; + FSPSM_HMAC_WKEY key_client_mac; + FSPSM_HMAC_WKEY key_server_mac; + + FSPSM_AES_PWKEY key_client_aes = NULL; + FSPSM_AES_PWKEY key_server_aes = NULL; + + uint32_t sceCS = GetSceCipherSuite(ssl->options.cipherSuite0, + ssl->options.cipherSuite); + + if (ssl== NULL || cbInfo == NULL) + return BAD_FUNC_ARG; + + + if ((ret = wc_fspsm_hw_lock()) == 0) { + if (sceCS == TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 || + sceCS == TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) + { + WOLFSSL_MSG("Session key for AES-GCM generation skipped."); + + wolfSSL_KeepArrays(ssl); + ret = FSP_SUCCESS; + + } + else { + key_client_aes = (FSPSM_AES_PWKEY)XMALLOC(sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + key_server_aes = (FSPSM_AES_PWKEY)XMALLOC(sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + if (key_client_aes == NULL || key_server_aes == NULL) { + return MEMORY_E; + } + + ret = FSPSM_SESSIONKEY_GEN_FUNC( + GetSceCipherSuite( + ssl->options.cipherSuite0, + ssl->options.cipherSuite), + (uint32_t*)ssl->arrays->fspsm_masterSecret, + (uint8_t*) ssl->arrays->clientRandom, + (uint8_t*) ssl->arrays->serverRandom, + NULL, + &key_client_mac, + &key_server_mac, + key_client_aes, + key_server_aes, + NULL, NULL); + } + + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_fspsm_TLS_SessionKeyGenerate failed"); + } + else { + /* succeeded creating session keys */ + /* alloc aes instance for both enc and dec */ + enc = &ssl->encrypt; + dec = &ssl->decrypt; + + if (enc) { + if (enc->aes == NULL) { + enc->aes = (Aes*)XMALLOC(sizeof(Aes), ssl->heap, + DYNAMIC_TYPE_CIPHER); + if (enc->aes == NULL) + return MEMORY_E; + } + XMEMSET(enc->aes, 0, sizeof(Aes)); + enc->aes->ctx.wrapped_key = (FSPSM_AES_PWKEY)XMALLOC + (sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + if (enc->aes->ctx.wrapped_key == NULL) + return MEMORY_E; + } + if (dec) { + if (dec->aes == NULL) { + dec->aes = (Aes*)XMALLOC(sizeof(Aes), ssl->heap, + DYNAMIC_TYPE_CIPHER); + if (dec->aes == NULL) { + if (enc) { + XFREE(enc->aes, NULL, DYNAMIC_TYPE_CIPHER); + } + return MEMORY_E; + } + XMEMSET(dec->aes, 0, sizeof(Aes)); + + dec->aes->ctx.wrapped_key = (FSPSM_AES_PWKEY)XMALLOC + (sizeof(FSPSM_AES_WKEY), + aes->heap, DYNAMIC_TYPE_AE); + if (dec->aes->ctx.wrapped_key == NULL) + return MEMORY_E; + } + } + /* copy key index into aes */ + if (ssl->options.side == PROVISION_CLIENT) { + XMEMCPY(enc->aes->ctx.wrapped_key, key_client_aes, + sizeof(FSPSM_AES_WKEY)); + XMEMCPY(dec->aes->ctx.wrapped_key, key_server_aes, + sizeof(FSPSM_AES_WKEY)); + } + else { + XMEMCPY(enc->aes->ctx.wrapped_key, key_server_aes, + sizeof(FSPSM_AES_WKEY)); + XMEMCPY(dec->aes->ctx.wrapped_key, key_client_aes, + sizeof(FSPSM_AES_WKEY)); + } + /* copy mac key index into keys */ + ssl->keys.fspsm_client_write_MAC_secret = key_client_mac; + ssl->keys.fspsm_server_write_MAC_secret = key_server_mac; + + /* set up key size and marked ready */ + if (enc) { + enc->aes->ctx.keySize = ssl->specs.key_size; + enc->aes->ctx.setup = 1; + /* ready for use */ + enc->setup = 1; + } + /* set up key size and marked ready */ + if (dec) { + dec->aes->ctx.keySize = ssl->specs.key_size; + dec->aes->ctx.setup = 1; + /* ready for use */ + dec->setup = 1; + } + + if (cbInfo->cipher == SCE_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 || + cbInfo->cipher == SCE_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) { + enc->aes->nonceSz = AEAD_MAX_IMP_SZ; + dec->aes->nonceSz = AEAD_MAX_IMP_SZ; + } + enc->aes->devId = devId; + dec->aes->devId = devId; + + /* marked as session key is set */ + cbInfo->keyflgs_tls.bits.session_key_set = 1; + } + + if (key_client_aes) + XFREE(key_client_aes, aes->heap, DYNAMIC_TYPE_AES); + if (key_server_aes) + XFREE(key_server_aes, aes->heap, DYNAMIC_TYPE_AES); + + /* unlock hw */ + wc_fspsm_hw_unlock(); + + } + else { + WOLFSSL_LEAVE("hw lock failed", ret); + } + + WOLFSSL_LEAVE("fspsm_generateSessionKey", ret); + return ret; +} + +/* generate master secret based on pre-master which is generated by SCE */ +WOLFSSL_LOCAL int wc_fspsm_generateMasterSecret( + uint8_t cipherSuiteFirst, + uint8_t cipherSuite, + const uint8_t *pr, /* pre-master */ + const uint8_t *cr, /* client random */ + const uint8_t *sr, /* server random */ + uint8_t *ms) +{ + WOLFSSL_ENTER("fspsm_generateMasterSecretEx"); + int ret; + + if ((pr == NULL) || (cr == NULL) || (sr == NULL) || + (ms == NULL)) + return BAD_FUNC_ARG; + + uint32_t sceCS = GetSceCipherSuite(cipherSuiteFirst, cipherSuite); + if (sceCS == 0xffffffff) + return BAD_FUNC_ARG; + + if ((ret = wc_fspsm_hw_lock()) == 0) { + ret = FSPSM_MASTERSECRET_GEN_FUNC( + sceCS, + (uint32_t*)pr, + (uint8_t*)cr, (uint8_t*)sr, (uint32_t*)ms); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_fspsm_TLS_MasterSecretGenerate failed"); + } + /* unlock hw */ + wc_fspsm_hw_unlock(); + } + else { + WOLFSSL_MSG(" hw lock failed "); + } + WOLFSSL_LEAVE("fspsm_generateMasterSecret", ret); + return ret; +} + +/* generate pre-Master secrete by SCE */ +WOLFSSL_LOCAL int wc_fspsm_generatePremasterSecret(uint8_t *premaster, + uint32_t preSz) +{ + WOLFSSL_ENTER("fspsm_generatePremasterSecret"); + int ret; + + if (premaster == NULL) + return BAD_FUNC_ARG; + + if ((ret = wc_fspsm_hw_lock()) == 0 && preSz >= + (SCE_TLS_MASTER_SECRET_WORD_SIZE*4)) { + /* generate pre-master, 80 bytes */ + ret = FSPSM_PREGEN_FUNC((uint32_t*)premaster); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG(" R_fspsm_TLS_GeneratePreMasterSecret failed"); + } + /* unlock hw */ + wc_fspsm_hw_unlock(); + } + else { + WOLFSSL_MSG(" hw lock failed or preSz is smaller than 80"); + } + + WOLFSSL_LEAVE("fspsm_generatePremasterSecret", ret); + return ret; +} + + +/* +* generate encrypted pre-Master secrete by SCE +*/ +WOLFSSL_LOCAL int wc_fspsm_generateEncryptPreMasterSecret( + WOLFSSL* ssl, + uint8_t* out, + uint32_t* outSz) +{ + WOLFSSL_MSG("fspsm_generateEncryptPreMasterSecret"); + int ret; + + if ((ssl == NULL) || (out == NULL) || (outSz == NULL)) + return BAD_FUNC_ARG; + + if ((ret = wc_fspsm_hw_lock()) == 0) { + if (*outSz >= 256) + ret = FSPSM_PREGENENC_FUNC( + (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex, + (uint32_t*)ssl->arrays->preMasterSecret, + (uint8_t*)out); + else + ret = -1; + + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG("R_fspsm_TLS_PreMasterSecretEncryptWithRSA2048 failed"); + } + else { + *outSz = 256; /* SCE can only handles 2048 RSA */ + /* set GenMaster Callback for Master secret generation */ + void* ctx = wolfSSL_GetRsaVerifyCtx(ssl); + wolfSSL_CTX_SetGenMasterSecretCb(ssl->ctx, + Renesas_cmn_genMasterSecret); + wolfSSL_SetGenMasterSecretCtx(ssl, ctx); + } + wc_fspsm_hw_unlock(); + + } + else { + WOLFSSL_MSG(" hw lock failed "); + } + WOLFSSL_LEAVE("fspsm_generateEncryptPreMasterSecret", ret); + return ret; +} + + +/* Certificate verification by SCE */ +WOLFSSL_LOCAL int wc_fspsm_tls_CertVerify( + const uint8_t* cert, uint32_t certSz, + const uint8_t* signature, uint32_t sigSz, + uint32_t key_n_start,uint32_t key_n_len, + uint32_t key_e_start,uint32_t key_e_len, + uint8_t* fspsm_encPublickey) +{ + WOLFSSL_ENTER("fspsm_tls_CertVerify"); + int ret; + uint8_t *sigforSCE; + uint8_t *pSig; + const byte rs_size = 0x20; + byte offset = 0x3; + (void)sigSz; + + sigforSCE = NULL; + pSig = NULL; + + if (cert == NULL) + return BAD_FUNC_ARG; + + if (!signature) { + WOLFSSL_MSG(" signature for ca verification is not set"); + return -1; + } + if (!fspsm_encPublickey) { + WOLFSSL_MSG(" fspsm_encPublickey is NULL."); + return -1; + } + + if (g_user_key_info.encrypted_user_tls_key_type == + SCE_TLS_PUBLIC_KEY_TYPE_ECDSA_P256/*ECDSA*/) { + + if ((sigforSCE = (uint8_t*)XMALLOC(HW_SCE_ECDSA_DATA_BYTE_SIZE, NULL, + DYNAMIC_TYPE_TEMP)) == NULL) { + WOLFSSL_MSG("failed to malloc memory"); + return MEMORY_E; + } + /* initialization */ + XMEMSET(sigforSCE, 0, HW_SCE_ECDSA_DATA_BYTE_SIZE); + + if (signature[offset] == 0x20) { + XMEMCPY(sigforSCE, &signature[offset+1], rs_size); + + offset = 0x25; + if (signature[offset] == 0x20) { + XMEMCPY(&sigforSCE[rs_size], &signature[offset+1], rs_size); + } + else { + XMEMCPY(&sigforSCE[rs_size], &signature[offset+2], rs_size); + } + } + else { + XMEMCPY(sigforSCE, &signature[offset+2], rs_size); + offset = 0x26; + + if (signature[offset] == rs_size) { + XMEMCPY(&sigforSCE[rs_size], &signature[offset+1], rs_size); + } + else { + XMEMCPY(&sigforSCE[rs_size], &signature[offset+2], rs_size); + } + } + pSig = sigforSCE; + } + else { + pSig = (uint8_t*)signature; + } + + + if ((ret = wc_fspsm_hw_lock()) == 0) { + ret = FSPSM_TLSCERT_VRY( + g_user_key_info.encrypted_user_tls_key_type, + (uint32_t*)g_encrypted_publicCA_key,/* encrypted public key */ + (uint8_t*)cert, /* certificate der */ + certSz, /* length of der */ + (uint8_t*)pSig, /* sign data by RSA PSS */ + key_n_start, /* start position of public key n in bytes */ + (key_n_start + key_n_len), /* length of the public key n */ + key_e_start, /* start pos, key e in bytes */ + (key_e_start + key_e_len), /* length of the public key e */ + (uint32_t*)fspsm_encPublickey /* returned encrypted key */ + ); + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG(" R_XXX_TlsCertificateVerification() failed"); + } + if (sigforSCE) { + XFREE(sigforSCE, NULL, DYNAMIC_TYPE_TEMP); + } + wc_fspsm_hw_unlock(); + } + else { + WOLFSSL_MSG(" hw lock failed "); + } + WOLFSSL_LEAVE("fspsm_tls_CertVerify", ret); + return ret; +} + +/* Root Certificate verification */ +WOLFSSL_LOCAL int wc_fspsm_tls_RootCertVerify( + const uint8_t* cert, uint32_t cert_len, + uint32_t key_n_start, uint32_t key_n_len, + uint32_t key_e_start, uint32_t key_e_len, + uint32_t cm_row) +{ + int ret; + /* call to generate encrypted public key for certificate verification */ + uint8_t *signature = (uint8_t*)ca_cert_sig; + + WOLFSSL_ENTER("wc_fspsm_tls_RootCertVerify"); + + if (cert == NULL) + return BAD_FUNC_ARG; + + if (!signature) { + WOLFSSL_MSG(" signature for ca verification is not set"); + return -1; + } + + if ((ret = wc_fspsm_hw_lock()) == 0) { + ret = FSPSM_TLSROOTCERT_VRY( + g_user_key_info.encrypted_user_tls_key_type, + (uint8_t*)cert, /* CA cert */ + (uint32_t)cert_len, /* length of CA cert */ + key_n_start, /* Byte position of public key */ + (key_n_start + key_n_len), + key_e_start, + (key_e_start + key_e_len), + (uint8_t*)ca_cert_sig, /* RSA 2048 PSS with SHA256 */ + g_encrypted_publicCA_key); /* RSA-2048 public key 560 bytes */ + /* ECDSA 96 bytes */ + if (ret != FSP_SUCCESS) { + WOLFSSL_MSG(" R_fspsm_TLS_RootCertificateVerify() failed"); + } + else { + g_CAscm_Idx = cm_row; + } + wc_fspsm_hw_unlock(); + } + else { + WOLFSSL_MSG(" hw lock failed "); + } + WOLFSSL_LEAVE("wc_fspsm_tls_RootCertVerify", ret); + return ret; +} + +/* store elements for session key generation into ssl->keys. + * return 0 on success, negative value on failure + */ +WOLFSSL_LOCAL int wc_fspsm_storeKeyCtx(WOLFSSL* ssl, FSPSM_ST* info) +{ + int ret = 0; + + WOLFSSL_ENTER("fspsm_storeKeyCtx"); + + if (ssl == NULL || info == NULL) + ret = BAD_FUNC_ARG; + + if (ret == 0) { + XMEMCPY(info->masterSecret, ssl->arrays->fspsm_masterSecret, + FSPSM_TLS_MASTERSECRET_SIZE); + XMEMCPY(info->clientRandom, ssl->arrays->clientRandom, 32); + XMEMCPY(info->serverRandom, ssl->arrays->serverRandom, 32); + + info->cipher = (uint8_t)GetSceCipherSuite(ssl->options.cipherSuite0, + ssl->options.cipherSuite); + } + WOLFSSL_LEAVE("fspsm_storeKeyCtx", ret); + return ret; +} + +/* to inform ca certificate sign */ +/* signature format expects RSA 2048 PSS with SHA256 */ +#if defined(WOLFSSL_RENESAS_SCEPROTECT) +WOLFSSL_API void wc_sce_inform_cert_sign(const uint8_t *sign) +#else +WOLFSSL_API void wc_fspsm_inform_cert_sign(const uint8_t *sign) +#endif +{ + if (sign) + ca_cert_sig = sign; +} + +/* let wolfSSL know user key information using TLS operation by SCE */ +#if defined(WOLFSSL_RENESAS_SCEPROTECT) +WOLFSSL_API void wc_sce_inform_user_keys( +#else +WOLFSSL_API void wc_fspsm_inform_user_keys( +#endif + uint8_t* encrypted_provisioning_key, + uint8_t* iv, + uint8_t* encrypted_user_tls_key, + uint32_t encrypted_user_tls_key_type) +{ + WOLFSSL_ENTER("sce_inform_user_keys"); + g_user_key_info.encrypted_provisioning_key = NULL; + g_user_key_info.iv = NULL; + g_user_key_info.encrypted_user_tls_key = NULL; + + if (encrypted_provisioning_key ) { + g_user_key_info.encrypted_provisioning_key = encrypted_provisioning_key; + } + if (iv) { + g_user_key_info.iv = iv; + } + if (encrypted_user_tls_key) { + g_user_key_info.encrypted_user_tls_key = encrypted_user_tls_key; + } + + g_user_key_info.encrypted_user_tls_key_type = encrypted_user_tls_key_type; + + /* set callback for ECC */ + WOLFSSL_MSG("sce_inform_user_keys_ex"); +} + + +/* Set callbacks needed for sce TLS api handling */ +#if defined(WOLFSSL_RENESAS_SCEPROTECT) +WOLFSSL_API void wc_sce_set_callbacks(WOLFSSL_CTX* ctx) +#else +WOLFSSL_API void wc_fspsm_set_callbacks(WOLFSSL_CTX* ctx) +#endif +{ + wolfSSL_CTX_SetEccVerifyCb(ctx, Renesas_cmn_EccVerify); + wolfSSL_CTX_SetRsaVerifyCb(ctx, Renesas_cmn_RsaVerify); + wolfSSL_CTX_SetGenPreMasterCb(ctx, Renesas_cmn_generatePremasterSecret); + wolfSSL_CTX_SetRsaEncCb(ctx, Renesas_cmn_RsaEnc); + wolfSSL_CTX_SetVerifyMacCb(ctx, Renesas_cmn_VerifyHmac); + + /* reset callbacks */ + wolfSSL_CTX_SetEccSharedSecretCb(ctx, NULL); +} +/* Set callback contexts needed for sce TLS api handling */ +#if defined(WOLFSSL_RENESAS_SCEPROTECT) +WOLFSSL_API int wc_sce_set_callback_ctx(WOLFSSL* ssl, void* user_ctx) +#else +WOLFSSL_API int wc_fspsm_set_callback_ctx(WOLFSSL* ssl, void* user_ctx) +#endif +{ + if (fspsm_sess_idx > MAX_FSPSM_CBINDEX) { + WOLFSSL_MSG("exceeds maximum session index"); + return -1; + } + gPKCbInfo.user_PKCbInfo[fspsm_sess_idx] = (FSPSM_ST*)user_ctx; + gPKCbInfo.user_PKCbInfo[fspsm_sess_idx]->keyflgs_tls.bits.pk_key_set = 0; + gPKCbInfo.user_PKCbInfo[fspsm_sess_idx]->keyflgs_tls.bits.session_key_set + = 0; + + wolfSSL_SetEccVerifyCtx(ssl, user_ctx); + wolfSSL_SetRsaEncCtx(ssl, user_ctx); + wolfSSL_SetRsaVerifyCtx(ssl, user_ctx); + wolfSSL_SetGenPreMasterCtx(ssl, user_ctx); + wolfSSL_SetEccSharedSecretCtx(ssl, NULL); + wolfSSL_SetVerifyMacCtx(ssl, user_ctx); + + /* set up crypt callback */ + wc_CryptoCb_CryptInitRenesasCmn(ssl, user_ctx); + + gPKCbInfo.num_session = ++fspsm_sess_idx; + + return 0; +} +#endif /* !WOLFSSL_RENESAS_FSPSM_CRYPTONLY */ + +#endif /* WOLFSSL_RENESAS_FSPSM_TLS || WOLFSSL_RENESAS_FSPSM_CRYPTONLY */ +#endif /* WOLFSSL_RENESAS_FSPSM) && WOLFSSL_RENESAS_FSPSM_TLS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_aes.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,589 +0,0 @@ -/* renesas_sce_aes.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#ifdef HAVE_CONFIG_H - #include -#endif -#include - -#ifndef NO_AES - -#if (defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY)) && \ - !defined(NO_WOLFSSL_RENESAS_SCEPROTECT_AES) - -#include -#include -#include -#include -#include "wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h" - -#ifdef NO_INLINE - #include -#else - #define WOLFSSL_MISC_INCLUDED - #include -#endif - -struct Aes; - -#define SCE_AES_GCM_AUTH_TAG_SIZE 16 - -typedef fsp_err_t (*aesGcmEncInitFn) - (sce_gcm_handle_t*, sce_aes_wrapped_key_t*, uint8_t*, uint32_t); -typedef fsp_err_t (*aesGcmEncUpdateFn) - (sce_gcm_handle_t*,uint8_t*, uint8_t*, uint32_t, uint8_t*, uint32_t); -typedef fsp_err_t (*aesGcmEncFinalFn) - (sce_gcm_handle_t*, uint8_t*, uint32_t*, uint8_t*); - -typedef fsp_err_t (*aesGcmDecInitFn) - (sce_gcm_handle_t*, sce_aes_wrapped_key_t*, uint8_t*, uint32_t); -typedef fsp_err_t (*aesGcmDecUpdateFn) - (sce_gcm_handle_t*,uint8_t*, uint8_t*, uint32_t, uint8_t*, uint32_t); -typedef fsp_err_t (*aesGcmDecFinalFn) - (sce_gcm_handle_t*, uint8_t*, uint32_t*, uint8_t*, uint32_t); - -/* Perform Aes Gcm encryption by SCE - * - * aes The AES object. - * out Buffer to hold cipher text - * in Buffer to hold plaintext - * sz Length of cipher text/plaintext in bytes - * iv Buffer holding IV/nonce - * ivSz Length of IV/nonce in bytes - * authTag Buffer to hold authentication data - * authTagSz Length of authentication data in bytes - * ctx The callback context - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ -WOLFSSL_LOCAL int wc_sce_AesGcmEncrypt(struct Aes* aes, byte* out, - const byte* in, word32 sz, - byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, - void* ctx) -{ - int ret; - sce_gcm_handle_t _handle; - uint32_t dataLen = sz; - User_SCEPKCbInfo *info = (User_SCEPKCbInfo*)ctx; - - aesGcmEncInitFn initFn; - aesGcmEncUpdateFn updateFn; - aesGcmEncFinalFn finalFn; - - uint8_t* plainBuf = NULL; - uint8_t* cipherBuf = NULL; - uint8_t* aTagBuf = NULL; - uint8_t delta; - const uint8_t* iv_l = NULL; - uint32_t ivSz_l = 0; - - sce_hmac_sha_wrapped_key_t key_client_mac; - sce_hmac_sha_wrapped_key_t key_server_mac; - sce_aes_wrapped_key_t key_client_aes; - sce_aes_wrapped_key_t key_server_aes; - - /* sanity check */ - if (aes == NULL || authTagSz > AES_BLOCK_SIZE || ivSz == 0 || ctx == NULL) { - return BAD_FUNC_ARG; - } - - if (authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ) { - WOLFSSL_MSG("GcmEncrypt authTagSz too small error"); - return BAD_FUNC_ARG; - } - - if (aes->ctx.keySize != 16 && aes->ctx.keySize != 32) { - WOLFSSL_MSG("keySize is invalid, neither 16 or 32."); - return BAD_FUNC_ARG; - } - - if (aes->ctx.keySize == 16) { - initFn = R_SCE_AES128GCM_EncryptInit; - updateFn = R_SCE_AES128GCM_EncryptUpdate; - finalFn = R_SCE_AES128GCM_EncryptFinal; - } - else { - initFn = R_SCE_AES256GCM_EncryptInit; - updateFn = R_SCE_AES256GCM_EncryptUpdate; - finalFn = R_SCE_AES256GCM_EncryptFinal; - } - - - /* check if AES GCM can be used by SCE */ - if ((ret = wc_sce_hw_lock()) == 0) { - - /* allocate buffers for plaintext, ciphertext and authTag to make sure - * those buffers 32bit aligned as SCE requests. - */ - delta = ((sz % AES_BLOCK_SIZE) == 0) ? 0 : - AES_BLOCK_SIZE - (sz % AES_BLOCK_SIZE); - plainBuf = XMALLOC(sz, aes->heap, DYNAMIC_TYPE_AES); - cipherBuf = XMALLOC(sz + delta, aes->heap, DYNAMIC_TYPE_AES); - aTagBuf = XMALLOC(SCE_AES_GCM_AUTH_TAG_SIZE, aes->heap, - DYNAMIC_TYPE_AES); - - if (plainBuf == NULL || cipherBuf == NULL || aTagBuf == NULL) { - WOLFSSL_MSG("wc_sce_AesGcmEncrypt: buffer allocation failed"); - ret = -1; - } - - if (ret == 0) { - XMEMCPY(plainBuf, in, sz); - XMEMSET((void*)cipherBuf, 0, sz + delta); - XMEMSET((void*)authTag, 0, authTagSz); - } - - #if defined(WOLFSSL_RENESAS_SCEPROTECT) - if (ret == 0 && - info->keyflgs_tls.bits.session_key_set == 1) { - /* generate AES-GCM session key. The key stored in - * Aes.ctx.tsip_keyIdx is not used here. - */ - ret = R_SCE_TLS_SessionKeyGenerate( - info->sce_cipher, - (uint32_t*)info->sce_masterSecret, - (uint8_t*) info->sce_clientRandom, - (uint8_t*) info->sce_serverRandom, - &iv[AESGCM_IMP_IV_SZ], /* use exp_IV */ - &key_client_mac, - &key_server_mac, - &key_client_aes, - &key_server_aes, - NULL, NULL); - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_TLS_SessionKeyGenerate failed"); - ret = -1; - } - - } - else { - #else - if (ret == 0) { - #endif - if (info->keyflgs_crypt.bits.aes256_installedkey_set == 1 || - info->keyflgs_crypt.bits.aes128_installedkey_set == 1) { - if (aes->ctx.keySize == 32) { - XMEMCPY(&key_client_aes, - (sce_aes_wrapped_key_t*)info->sce_wrapped_key_aes256, - sizeof(sce_aes_wrapped_key_t)); - } - else { - XMEMCPY(&key_client_aes, - (sce_aes_wrapped_key_t*)info->sce_wrapped_key_aes128, - sizeof(sce_aes_wrapped_key_t)); - } - iv_l = iv; - ivSz_l = ivSz; - } - else { - WOLFSSL_MSG("AES key for SCE is not set."); - ret = -1; - } - } - - if (ret == 0) { - - /* since generated session key is coupled to iv, no need to pass - * them init func. - */ - ret = initFn(&_handle, &key_client_aes, (uint8_t*)iv_l, ivSz_l); - - if (ret == FSP_SUCCESS) { - ret = updateFn(&_handle, NULL, NULL, 0UL, (uint8_t*)authIn, - authInSz); - } - if (ret == FSP_SUCCESS) { - ret = updateFn(&_handle, plainBuf, cipherBuf, sz, NULL, 0UL); - } - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_AesXXXGcmEncryptUpdate2: failed"); - ret = -1; - } - - if (ret == FSP_SUCCESS) { - /* Once R_SCE_AesxxxGcmEncryptInit or R_SCE_AesxxxEncryptUpdate is - * called, R_SCE_AesxxxGcmEncryptFinal must be called regardless of - * the result of the previous call. Otherwise, SCE can not come out - * from its error state and all the trailing APIs will fail. - */ - dataLen = 0; - ret = finalFn(&_handle, - cipherBuf + (sz + delta - AES_BLOCK_SIZE), - &dataLen, - aTagBuf); - - if (ret == FSP_SUCCESS) { - /* copy encrypted data to out */ - if (sz != dataLen) { - WOLFSSL_MSG("sz is not equal to dataLen!!!!"); - ret = -1; - } else { - XMEMCPY(out, cipherBuf, dataLen); - /* copy auth tag to caller's buffer */ - XMEMCPY((void*)authTag, (void*)aTagBuf, - min(authTagSz, SCE_AES_GCM_AUTH_TAG_SIZE )); - } - } - else { - WOLFSSL_MSG("R_SCE_AesxxxGcmEncryptFinal: failed"); - ret = -1; - } - } - } - - XFREE(plainBuf, aes->heap, DYNAMIC_TYPE_AES); - XFREE(cipherBuf, aes->heap, DYNAMIC_TYPE_AES); - XFREE(aTagBuf, aes->heap, DYNAMIC_TYPE_AES); - - wc_sce_hw_unlock(); - - } - - return ret; -} -/* Perform Aes Gcm decryption by SCE - * - * aes The AES object. - * out Buffer to hold plaintext - * in Buffer to hold cipher text - * sz Length of cipher text/plaintext in bytes - * iv Buffer holding IV/nonce - * ivSz Length of IV/nonce in bytes - * authTag Buffer to hold authentication data - * authTagSz Length of authentication data in bytes - * ctx The Callback context - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ -WOLFSSL_LOCAL int wc_sce_AesGcmDecrypt(struct Aes* aes, byte* out, - const byte* in, word32 sz, - const byte* iv, word32 ivSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, - void* ctx) -{ - int ret; - sce_gcm_handle_t _handle; - uint32_t dataLen = sz; - User_SCEPKCbInfo *info = (User_SCEPKCbInfo*)ctx; - - aesGcmDecInitFn initFn; - aesGcmDecUpdateFn updateFn; - aesGcmDecFinalFn finalFn; - - uint8_t* cipherBuf = NULL; - uint8_t* plainBuf = NULL; - uint8_t* aTagBuf = NULL; - uint8_t delta; - const uint8_t* iv_l = NULL; - uint32_t ivSz_l = 0; - - sce_hmac_sha_wrapped_key_t key_client_mac; - sce_hmac_sha_wrapped_key_t key_server_mac; - sce_aes_wrapped_key_t key_client_aes; - sce_aes_wrapped_key_t key_server_aes; - - /* sanity check */ - if (aes == NULL || authTagSz > AES_BLOCK_SIZE || ivSz == 0 || ctx == NULL) { - return BAD_FUNC_ARG; - } - - if (authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ) { - WOLFSSL_MSG("GcmEncrypt authTagSz too small error"); - return BAD_FUNC_ARG; - } - - if (aes->ctx.keySize != 16 && aes->ctx.keySize != 32) { - WOLFSSL_MSG("keySize is invalid, neither 16 or 32."); - return BAD_FUNC_ARG; - } - - if (aes->ctx.keySize == 16) { - initFn = R_SCE_AES128GCM_DecryptInit; - updateFn = R_SCE_AES128GCM_DecryptUpdate; - finalFn = R_SCE_AES128GCM_DecryptFinal; - } - else { - initFn = R_SCE_AES256GCM_DecryptInit; - updateFn = R_SCE_AES256GCM_DecryptUpdate; - finalFn = R_SCE_AES256GCM_DecryptFinal; - } - - - if ((ret = wc_sce_hw_lock()) == 0) { - /* allocate buffers for plain-text, cipher-text, authTag and AAD. - * TSIP requests those buffers 32bit aligned. - */ - delta = ((sz % AES_BLOCK_SIZE) == 0) ? 0 : - AES_BLOCK_SIZE - (sz % AES_BLOCK_SIZE); - cipherBuf = XMALLOC(sz, aes->heap, DYNAMIC_TYPE_AES); - plainBuf = XMALLOC(sz + delta, aes->heap, DYNAMIC_TYPE_AES); - aTagBuf = XMALLOC(SCE_AES_GCM_AUTH_TAG_SIZE, aes->heap, - DYNAMIC_TYPE_AES); - - if (plainBuf == NULL || cipherBuf == NULL || aTagBuf == NULL) { - ret = -1; - } - - if (ret == 0) { - XMEMSET((void*)plainBuf, 0, sz); - XMEMCPY(cipherBuf, in, sz); - XMEMCPY(aTagBuf, authTag, authTagSz); - } - #if defined(WOLFSSL_RENESAS_SCEPROTECT) - if (ret == 0 && - info->keyflgs_tls.bits.session_key_set == 1) { - /* generate AES-GCM session key. The key stored in - * Aes.ctx.tsip_keyIdx is not used here. - */ - ret = R_SCE_TLS_SessionKeyGenerate( - info->sce_cipher, - (uint32_t*)info->sce_masterSecret, - (uint8_t*) info->sce_clientRandom, - (uint8_t*) info->sce_serverRandom, - (uint8_t*)&iv[AESGCM_IMP_IV_SZ], /* use exp_IV */ - &key_client_mac, - &key_server_mac, - &key_client_aes, - &key_server_aes, - NULL, NULL); - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_TLS_SessionKeyGenerate failed"); - ret = -1; - } - } - else { - #else - if (ret == 0) { - #endif - if (info->keyflgs_crypt.bits.aes256_installedkey_set == 1 || - info->keyflgs_crypt.bits.aes128_installedkey_set == 1) { - if (aes->ctx.keySize == 32) { - XMEMCPY(&key_server_aes, - (sce_aes_wrapped_key_t*)info->sce_wrapped_key_aes256, - sizeof(sce_aes_wrapped_key_t)); - } - else { - XMEMCPY(&key_server_aes, - (sce_aes_wrapped_key_t*)info->sce_wrapped_key_aes128, - sizeof(sce_aes_wrapped_key_t)); - } - iv_l = iv; - ivSz_l = ivSz; - } - else { - WOLFSSL_MSG("AES key for SCE is not set."); - ret = -1; - } - } - - if (ret == 0) { - /* since key_index has iv and ivSz in it, no need to pass them init - * func. Pass NULL and 0 as 3rd and 4th parameter respectively. - */ - ret = initFn(&_handle, &key_server_aes, (uint8_t*)iv_l, ivSz_l); - - - if (ret == FSP_SUCCESS) { - /* pass only AAD and it's size before passing cipher text */ - ret = updateFn(&_handle, NULL, NULL, 0UL, (uint8_t*)authIn, - authInSz); - } - if (ret == FSP_SUCCESS) { - ret = updateFn(&_handle, cipherBuf, plainBuf, sz, NULL, 0UL); - } - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_AesXXXGcmDecryptUpdate: failed in decrypt"); - ret = -1; - } - - if (ret == FSP_SUCCESS) { - dataLen = 0; - ret = finalFn(&_handle, - plainBuf + (sz + delta - AES_BLOCK_SIZE), - &dataLen, - aTagBuf, - min(16, authTagSz)); - - if (ret == FSP_SUCCESS) { - /* copy plain data to out */ - if (sz != dataLen) { - WOLFSSL_MSG("sz is not equal to dataLen!!!!"); - ret = -1; - } - else { - XMEMCPY(out, plainBuf, dataLen); - } - } - else { - WOLFSSL_MSG("R_SCE_AesXXXGcmDecryptFinal: failed"); - ret = -1; - } - } - } - - XFREE(aTagBuf, aes->heap, DYNAMIC_TYPE_AES); - XFREE(plainBuf, aes->heap, DYNAMIC_TYPE_AES); - XFREE(cipherBuf, aes->heap, DYNAMIC_TYPE_AES); - - wc_sce_hw_unlock(); - } - - return ret; -} -/* Perform Aes Cbc encryption by SCE - * - * aes The AES object. - * out Buffer to hold cipher text - * in Buffer to hold plain text - * sz Length of cipher text/plaintext in bytes - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ -WOLFSSL_LOCAL int wc_sce_AesCbcEncrypt(struct Aes* aes, byte* out, - const byte* in, word32 sz) -{ - sce_aes_handle_t _handle; - word32 ret; - word32 blocks = (sz / AES_BLOCK_SIZE); - uint32_t dataLength; - byte *iv; - - if ((in == NULL) || (out == NULL) || (aes == NULL)) - return BAD_FUNC_ARG; - - /* while doing TLS handshake, SCE driver keeps true-key and iv * - * on the device. iv is dummy */ - iv = (uint8_t*)aes->reg; - - if ((ret = wc_sce_hw_lock()) != 0) { - WOLFSSL_MSG("Failed to lock"); - return ret; - } - - if (aes->ctx.keySize == 16) { - ret = R_SCE_AES128CBC_EncryptInit(&_handle, &aes->ctx.sce_wrapped_key, iv); - } - else if (aes->ctx.keySize == 32) { - ret = R_SCE_AES256CBC_EncryptInit(&_handle, &aes->ctx.sce_wrapped_key, iv); - } - else { - WOLFSSL_MSG("invalid key Size for SCE. Key size is neither 16 or 32."); - wc_sce_hw_unlock(); - return -1; - } - - while (ret == FSP_SUCCESS && blocks--) { - - if (aes->ctx.keySize == 16) - ret = R_SCE_AES128CBC_EncryptUpdate(&_handle, (uint8_t*)in, - (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); - else - ret = R_SCE_AES256CBC_EncryptUpdate(&_handle, (uint8_t*)in, - (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); - - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } - - if (ret == FSP_SUCCESS) { - if (aes->ctx.keySize == 16) { - ret = R_SCE_AES128CBC_EncryptFinal(&_handle, out, &dataLength); - } - else { - ret = R_SCE_AES256CBC_EncryptFinal(&_handle, out, &dataLength); - } - } - else { - WOLFSSL_MSG("SCE AES CBC encryption failed"); - ret = -1; - } - - wc_sce_hw_unlock(); - return ret; -} -/* Perform Aes Cbc decryption by SCE - * - * aes The AES object. - * out Buffer to hold plain text - * in Buffer to hold cipher text - * sz Length of cipher text/plaintext in bytes - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ -WOLFSSL_LOCAL int wc_sce_AesCbcDecrypt(struct Aes* aes, byte* out, const byte* in, word32 sz) -{ - sce_aes_handle_t _handle; - word32 ret; - word32 blocks = (sz / AES_BLOCK_SIZE); - uint32_t dataLength; - byte *iv; - - if ((in == NULL) || (out == NULL) || (aes == NULL)) - return BAD_FUNC_ARG; - - iv = (uint8_t*)aes->reg; - - if ((ret = wc_sce_hw_lock()) != 0) { - WOLFSSL_MSG("Failed to lock"); - return ret; - } - - if (aes->ctx.keySize == 16) { - ret = R_SCE_AES128CBC_DecryptInit(&_handle, &aes->ctx.sce_wrapped_key, iv); - } - else if (aes->ctx.keySize == 32) { - ret = R_SCE_AES256CBC_DecryptInit(&_handle, &aes->ctx.sce_wrapped_key, iv); - } - else { - wc_sce_hw_unlock(); - return -1; - } - - while (ret == FSP_SUCCESS && blocks--) { - - if (aes->ctx.keySize == 16) - ret = R_SCE_AES128CBC_DecryptUpdate(&_handle, (uint8_t*)in, - (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); - else - ret = R_SCE_AES256CBC_DecryptUpdate(&_handle, (uint8_t*)in, - (uint8_t*)out, (uint32_t)AES_BLOCK_SIZE); - - in += AES_BLOCK_SIZE; - out += AES_BLOCK_SIZE; - } - - if (ret == FSP_SUCCESS) { - if (aes->ctx.keySize == 16) - ret = R_SCE_AES128CBC_DecryptFinal(&_handle, out, &dataLength); - else - ret = R_SCE_AES256CBC_DecryptFinal(&_handle, out, &dataLength); - } - else { - WOLFSSL_MSG("SCE AES CBC decryption failed"); - ret = -1; - } - - wc_sce_hw_unlock(); - return ret; -} - -#endif /* WOLFSSL_RENESAS_TSIP_CRYPT */ -#endif /* NO_AES */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_rsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_rsa.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,437 +0,0 @@ -/* renesas_sce_rsa.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#if !defined(NO_RSA) && \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - -#include -#include - -#ifdef HAVE_CONFIG_H - #include -#endif - -#include -#include -#include -#include -#include - -/* Make Rsa key for SCE and set it to callback ctx - * Assumes to be called by Crypt Callback - * - * size desired keylenth, in bits. supports 1024 or 2048 bits - * ctx Callback context including pointer to hold generated key - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ -WOLFSSL_LOCAL int wc_sce_MakeRsaKey(int size, void* ctx) -{ - fsp_err_t ret; - User_SCEPKCbInfo *info = (User_SCEPKCbInfo*)ctx; - - sce_rsa1024_wrapped_pair_key_t *wrapped_pair1024_key = NULL; - sce_rsa2048_wrapped_pair_key_t *wrapped_pair2048_key = NULL; - - /* sanity check */ - if (ctx == NULL) - return BAD_FUNC_ARG; - - - if ((ret = wc_sce_hw_lock()) == 0) { - if (size == 1024) { - wrapped_pair1024_key = - (sce_rsa1024_wrapped_pair_key_t*)XMALLOC( - sizeof(sce_rsa1024_wrapped_pair_key_t), NULL, - DYNAMIC_TYPE_RSA_BUFFER); - if (wrapped_pair1024_key == NULL) - return MEMORY_E; - - ret = R_SCE_RSA1024_WrappedKeyPairGenerate(wrapped_pair1024_key); - } - else if (size == 2048) { - wrapped_pair2048_key = - (sce_rsa1024_wrapped_pair_key_t*)XMALLOC( - sizeof(sce_rsa2048_wrapped_pair_key_t), NULL, - DYNAMIC_TYPE_RSA_BUFFER); - if (wrapped_pair2048_key == NULL) - return MEMORY_E; - - ret = R_SCE_RSA2048_WrappedKeyPairGenerate(wrapped_pair2048_key); - } - else - return CRYPTOCB_UNAVAILABLE; - - if (ret == FSP_SUCCESS) { - if (size == 1024) { - if (info->sce_wrapped_key_rsapri1024 != NULL) { - XFREE(info->sce_wrapped_key_rsapri1024, NULL, - DYNAMIC_TYPE_RSA_BUFFER); - } - if (info->sce_wrapped_key_rsapub1024 != NULL) { - XFREE(info->sce_wrapped_key_rsapub1024, NULL, - DYNAMIC_TYPE_RSA_BUFFER); - } - info->sce_wrapped_key_rsapri1024 = - (sce_rsa1024_private_wrapped_key_t*)XMALLOC( - sizeof(sce_rsa1024_private_wrapped_key_t), NULL, - DYNAMIC_TYPE_RSA_BUFFER); - - if (info->sce_wrapped_key_rsapri1024 == NULL) { - XFREE(wrapped_pair1024_key, 0, DYNAMIC_TYPE_RSA_BUFFER); - return MEMORY_E; - } - - info->sce_wrapped_key_rsapub1024 = - (sce_rsa1024_public_wrapped_key_t*)XMALLOC( - sizeof(sce_rsa1024_public_wrapped_key_t), NULL, - DYNAMIC_TYPE_RSA_BUFFER); - - if (info->sce_wrapped_key_rsapub1024 == NULL) { - XFREE(wrapped_pair1024_key, 0, DYNAMIC_TYPE_RSA_BUFFER); - XFREE(info->sce_wrapped_key_rsapub1024, 0, - DYNAMIC_TYPE_RSA_BUFFER); - return MEMORY_E; - } - /* copy generated key pair and free malloced key */ - XMEMCPY(info->sce_wrapped_key_rsapri1024, - &wrapped_pair1024_key->priv_key, - sizeof(sce_rsa1024_private_wrapped_key_t)); - XMEMCPY(info->sce_wrapped_key_rsapub1024, - &wrapped_pair1024_key->pub_key, - sizeof(sce_rsa1024_public_wrapped_key_t)); - XFREE(wrapped_pair1024_key, 0, DYNAMIC_TYPE_RSA_BUFFER); - - info->keyflgs_crypt.bits.rsapri1024_installedkey_set = 1; - info->keyflgs_crypt.bits.rsapub1024_installedkey_set = 1; - } - else if (size == 2048) { - if (info->sce_wrapped_key_rsapri2048 != NULL) { - XFREE(info->sce_wrapped_key_rsapri2048, NULL, - DYNAMIC_TYPE_RSA_BUFFER); - } - if (info->sce_wrapped_key_rsapub2048 != NULL) { - XFREE(info->sce_wrapped_key_rsapub2048, NULL, - DYNAMIC_TYPE_RSA_BUFFER); - } - info->sce_wrapped_key_rsapri2048 = - (sce_rsa2048_private_wrapped_key_t*)XMALLOC( - sizeof(sce_rsa2048_private_wrapped_key_t), NULL, - DYNAMIC_TYPE_RSA_BUFFER); - - if (info->sce_wrapped_key_rsapri2048 == NULL) { - XFREE(wrapped_pair2048_key, 0, DYNAMIC_TYPE_RSA_BUFFER); - return MEMORY_E; - } - - info->sce_wrapped_key_rsapub2048 = - (sce_rsa2048_public_wrapped_key_t*)XMALLOC( - sizeof(sce_rsa2048_public_wrapped_key_t), NULL, - DYNAMIC_TYPE_RSA_BUFFER); - - if (info->sce_wrapped_key_rsapub2048 == NULL) { - XFREE(wrapped_pair2048_key, 0, DYNAMIC_TYPE_RSA_BUFFER); - XFREE(info->sce_wrapped_key_rsapub1024, 0, - DYNAMIC_TYPE_RSA_BUFFER); - return MEMORY_E; - } - /* copy generated key pair and free malloced key */ - XMEMCPY(info->sce_wrapped_key_rsapri2048, - &wrapped_pair2048_key->priv_key, - sizeof(sce_rsa2048_private_wrapped_key_t)); - XMEMCPY(info->sce_wrapped_key_rsapub2048, - &wrapped_pair2048_key->pub_key, - sizeof(sce_rsa2048_public_wrapped_key_t)); - XFREE(wrapped_pair2048_key, 0, DYNAMIC_TYPE_RSA_BUFFER); - - info->keyflgs_crypt.bits.rsapri2048_installedkey_set = 1; - info->keyflgs_crypt.bits.rsapub2048_installedkey_set = 1; - - } - } - else { - WOLFSSL_MSG("Failed to generate key pair by SCE"); - return CRYPTOCB_UNAVAILABLE; - } - - wc_sce_hw_unlock(); - } -} - -/* Perform rsa encryption/decryption by SCE - * Assumes to be called by Crypt Callback - * - * in Buffer to hold plain text - * inLen Length of plain text in bytes - * out Buffer to hold cipher text - * outLen Length of cipher in bytes - * key Rsa key object - * rng rng object - * ctx Callback context - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ -WOLFSSL_LOCAL int wc_sce_RsaFunction(const byte* in, word32 inLen, byte* out, - word32 outLen, int type, struct RsaKey* key, - struct WC_RNG* rng, void* ctx) -{ - int ret; - - sce_rsa_byte_data_t plain; - sce_rsa_byte_data_t cipher; - User_SCEPKCbInfo *info = (User_SCEPKCbInfo*)ctx; - - int keySize; - - (void) key; - (void) rng; - - /* sanity check */ - if (in == NULL || out == NULL || outLen == NULL || - ctx == NULL){ - return BAD_FUNC_ARG; - } - - keySize = 0; - if (info->keyflgs_crypt.bits.rsapri2048_installedkey_set == 1 || - info->keyflgs_crypt.bits.rsapub2048_installedkey_set == 1 ) - keySize = 2048; - else if (info->keyflgs_crypt.bits.rsapri1024_installedkey_set == 1 || - info->keyflgs_crypt.bits.rsapub1024_installedkey_set == 1 ) - keySize = 1024; - - if (keySize == 0) { - WOLFSSL_MSG("keySize is invalid, neither 128 or 256 bytes, " - "1024 or 2048 bits."); - return BAD_FUNC_ARG; - } - - if ((ret = wc_sce_hw_lock()) == 0) { - if (type == RSA_PUBLIC_ENCRYPT) { - - plain.pdata = (byte*)in; - plain.data_length = inLen; - cipher.pdata = out; - cipher.data_length = outLen; - - if (keySize == 1024) { - if(info->keyflgs_crypt.bits.rsapub1024_installedkey_set == 1) - ret = R_SCE_RSAES_PKCS1024_Encrypt(&plain, &cipher, - (sce_rsa1024_public_wrapped_key_t*) - info->sce_wrapped_key_rsapub1024); - else { - WOLFSSL_MSG("wrapped public 1024 bits key is not set."); - return BAD_FUNC_ARG; - } - } - else { - if(info->keyflgs_crypt.bits.rsapub2048_installedkey_set == 1) - ret = R_SCE_RSAES_PKCS2048_Encrypt(&plain, &cipher, - (sce_rsa2048_public_wrapped_key_t*) - info->sce_wrapped_key_rsapub2048); - else { - WOLFSSL_MSG("wrapped public 2048 bits key is not set."); - return BAD_FUNC_ARG; - } - } - } - else if (type == RSA_PRIVATE_DECRYPT) { - plain.pdata = out; - plain.data_length = outLen; - cipher.pdata = (byte*)in; - cipher.data_length = inLen; - - if (keySize == 1024) { - if(info->keyflgs_crypt.bits.rsapri1024_installedkey_set == 1) - ret = R_SCE_RSAES_PKCS1024_Decrypt(&cipher, &plain, - (sce_rsa1024_private_wrapped_key_t*) - info->sce_wrapped_key_rsapri1024); - else { - WOLFSSL_MSG("wrapped private 2048 bits key is not set."); - return BAD_FUNC_ARG; - } - } - else { - if(info->keyflgs_crypt.bits.rsapri2048_installedkey_set == 1) - ret = R_SCE_RSAES_PKCS2048_Decrypt(&cipher, &plain, - (sce_rsa2048_private_wrapped_key_t*) - info->sce_wrapped_key_rsapri2048); - else { - WOLFSSL_MSG("wrapped private 2048 bits key is not set."); - return BAD_FUNC_ARG; - } - } - } - - wc_sce_hw_unlock(); - } - return ret; -} - -/* Perform Rsa sign by SCE - * Assumes to be called by Crypt Callback - * - * in Buffer to hold plaintext - * inLen Length of plaintext in bytes - * out Buffer to hold generated signature - * outLen Length of signature in bytes - * key rsa key object - * ctx The callback context - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ - -WOLFSSL_LOCAL int wc_sce_RsaSign(const byte* in, word32 inLen, byte* out, - word32* outLen, struct RsaKey* key, void* ctx) -{ - int ret; - - sce_rsa_byte_data_t message_hash; - sce_rsa_byte_data_t signature; - User_SCEPKCbInfo *info = (User_SCEPKCbInfo*)ctx; - int keySize; - - (void) key; - - /* sanity check */ - if (in == NULL || out == NULL || outLen == NULL || - key == NULL || ctx == NULL){ - return BAD_FUNC_ARG; - } - - keySize = 0; - if (info->keyflgs_crypt.bits.rsapri2048_installedkey_set == 1 || - info->keyflgs_crypt.bits.rsapub2048_installedkey_set == 1 ) - keySize = 2048; - else if (info->keyflgs_crypt.bits.rsapri1024_installedkey_set == 1 || - info->keyflgs_crypt.bits.rsapub1024_installedkey_set == 1 ) - keySize = 1024; - - if (keySize == 0) { - WOLFSSL_MSG("keySize is invalid, neither 1024 or 2048 bits."); - return BAD_FUNC_ARG; - } - - message_hash.pdata = in; - message_hash.data_length = inLen; - message_hash.data_type = - info->keyflgs_crypt.bits.message_type;/* message 0, hash 1 */ - signature.pdata = out; - signature.data_length = outLen; - - if ((ret = wc_sce_hw_lock()) == 0) { - if (keySize == 1024) { - - ret = R_SCE_RSASSA_PKCS1024_SignatureGenerate(&message_hash, - &signature, - (sce_rsa1024_private_wrapped_key_t *) - info->sce_wrapped_key_rsapri1024, - HW_SCE_RSA_HASH_SHA256); - } - else { - - ret = R_SCE_RSASSA_PKCS2048_SignatureGenerate(&message_hash, - &signature, - (sce_rsa2048_private_wrapped_key_t *) - info->sce_wrapped_key_rsapri2048, - HW_SCE_RSA_HASH_SHA256); - } - - wc_sce_hw_unlock(); - } - - return ret; -} - -/* Perform Rsa verify by SCE - * Assumes to be called by Crypt Callback - * - * in Buffer to hold plaintext - * inLen Length of plaintext in bytes - * out Buffer to hold generated signature - * outLen Length of signature in bytes - * key rsa key object - * ctx The callback context - * return FSP_SUCCESS(0) on Success, otherwise negative value - */ - -WOLFSSL_LOCAL int wc_sce_RsaVerify(const byte* in, word32 inLen, byte* out, - word32* outLen,struct RsaKey* key, void* ctx) -{ - int ret; - - sce_rsa_byte_data_t message_hash; - sce_rsa_byte_data_t signature; - User_SCEPKCbInfo *info = (User_SCEPKCbInfo*)ctx; - int keySize; - - (void) key; - - /* sanity check */ - if (in == NULL || out == NULL || outLen == NULL || - key == NULL || ctx == NULL){ - return BAD_FUNC_ARG; - } - - keySize = 0; - if (info->keyflgs_crypt.bits.rsapri2048_installedkey_set == 1 || - info->keyflgs_crypt.bits.rsapub2048_installedkey_set == 1 ) - keySize = 2048; - else if (info->keyflgs_crypt.bits.rsapri1024_installedkey_set == 1 || - info->keyflgs_crypt.bits.rsapub1024_installedkey_set == 1 ) - keySize = 1024; - - if (keySize == 0) { - WOLFSSL_MSG("keySize is invalid, neither 1024 or 2048 bits."); - return BAD_FUNC_ARG; - } - - - message_hash.pdata = in; - message_hash.data_length = inLen; - message_hash.data_type = - info->keyflgs_crypt.bits.message_type;/* message 0, hash 1 */ - - signature.pdata = out; - signature.data_length = outLen; - - if ((ret = wc_sce_hw_lock()) == 0) { - if (keySize == 1024) { - - ret = R_SCE_RSASSA_PKCS1024_SignatureVerify(&signature, - &message_hash, - (sce_rsa1024_public_wrapped_key_t *) - info->sce_wrapped_key_rsapub1024, - HW_SCE_RSA_HASH_SHA256); - } - else { - - ret = R_SCE_RSASSA_PKCS2048_SignatureVerify(&signature, - &message_hash, - (sce_rsa2048_public_wrapped_key_t *) - info->sce_wrapped_key_rsapub2048, - HW_SCE_RSA_HASH_SHA256 ); - } - - wc_sce_hw_unlock(); - } - - return ret; -} - -#endif /* !NO_RSA && WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_sha.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_sha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_sha.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_sha.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,267 +0,0 @@ -/* renesas_sce_sha.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ -#include -#include - -#ifdef HAVE_CONFIG_H - #include -#endif -#include - -#if !defined(NO_SHA256) - -#include - -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - -#include -#include - -/* Free up allocation for msg - * - * hash The SCE Hash object. - * no return value - */ -static void SCEHashFree(wolfssl_SCE_Hash* hash) -{ - if (hash == NULL) - return; - - if (hash->msg != NULL) { - XFREE(hash->msg, hash->heap, DYNAMIC_TYPE_TMP_BUFFER); - hash->msg = NULL; - } -} -/* Initialize Hash object - * - * hash The SCE Hash object. - * heap Buffer to hold heap if available - * devId device Id - * return 0 on success, BAD_FUNC_ARG when has is NULL - */ -static int SCEHashInit(wolfssl_SCE_Hash* hash, void* heap, int devId, - word32 sha_type) -{ - if (hash == NULL) { - return BAD_FUNC_ARG; - } - - (void)devId; - XMEMSET(hash, 0, sizeof(wolfssl_SCE_Hash)); - - hash->heap = heap; - hash->len = 0; - hash->used = 0; - hash->msg = NULL; - hash->sha_type = sha_type; - - return 0; -} - -/* Add data to msg(work buffer) for final hash operation - * - * hash The SCE Hash object. - * data Buffer to hold plain text for hash - * sz Length of data - * return 0 on success, otherwise MEMORY_E or BAD_FUNC_ARG on failure - */ -static int SCEHashUpdate(wolfssl_SCE_Hash* hash, const byte* data, word32 sz) -{ - if (hash == NULL || (sz > 0 && data == NULL)) { - return BAD_FUNC_ARG; - } - - if (hash->len < hash->used + sz) { - if (hash->msg == NULL) { - hash->msg = (byte*)XMALLOC(hash->used + sz, hash->heap, - DYNAMIC_TYPE_TMP_BUFFER); - } - else { -#ifdef FREERTOS - byte* pt = (byte*)XMALLOC(hash->used + sz, hash->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (pt == NULL) { - return MEMORY_E; - } - XMEMCPY(pt, hash->msg, hash->used); - XFREE(hash->msg, hash->heap, DYNAMIC_TYPE_TMP_BUFFER); - hash->msg = NULL; - hash->msg = pt; -#else - byte* pt = (byte*)XREALLOC(hash->msg, hash->used + sz, hash->heap, - DYNAMIC_TYPE_TMP_BUFFER); - if (pt == NULL) { - return MEMORY_E; - } - hash->msg = pt; -#endif - } - if (hash->msg == NULL) { - return MEMORY_E; - } - hash->len = hash->used + sz; - } - XMEMCPY(hash->msg + hash->used, data , sz); - hash->used += sz; - - return 0; -} - -/* Perform hash operation using accumulated msg - * - * hash The SCE Hash object. - * out Buffer to hold hashed text - * outSz Length of out - * return FSP_SUCCESS(0) on success, - * otherwise BAD_FUNC_ARG or FSP Error code on failure - */ -static int SCEHashFinal(wolfssl_SCE_Hash* hash, byte* out, word32 outSz) -{ - int ret; - void* heap; - sce_sha_md5_handle_t handle; - uint32_t sz; - - fsp_err_t (*Init)(sce_sha_md5_handle_t*); - fsp_err_t (*Update)(sce_sha_md5_handle_t*, uint8_t*, uint32_t); - fsp_err_t (*Final )(sce_sha_md5_handle_t*, uint8_t*, uint32_t*); - - if (hash == NULL || out == NULL) { - return BAD_FUNC_ARG; - } - - if (hash->sha_type == SCE_SHA256) { - Init = R_SCE_SHA256_Init; - Update = R_SCE_SHA256_Update; - Final = R_SCE_SHA256_Final; - } - else - return BAD_FUNC_ARG; - - heap = hash->heap; - - wc_sce_hw_lock(); - - if (Init(&handle) == FSP_SUCCESS) { - ret = Update(&handle, (uint8_t*)hash->msg, hash->used); - if (ret == FSP_SUCCESS) { - ret = Final(&handle, out, (uint32_t*)&sz); - if (ret != FSP_SUCCESS || sz != outSz) { - return ret; - } - } - } - wc_sce_hw_unlock(); - - SCEHashFree(hash); - return SCEHashInit(hash, heap, 0, hash->sha_type); -} -/* Hash operation to message and return a result */ -static int SCEHashGet(wolfssl_SCE_Hash* hash, byte* out, word32 outSz) -{ - int ret; - sce_sha_md5_handle_t handle; - uint32_t sz; - - fsp_err_t (*Init)(sce_sha_md5_handle_t*); - fsp_err_t (*Update)(sce_sha_md5_handle_t*, uint8_t*, uint32_t); - fsp_err_t (*Final )(sce_sha_md5_handle_t*, uint8_t*, uint32_t*); - - if (hash == NULL || out == NULL) { - return BAD_FUNC_ARG; - } - - if (hash->sha_type == SCE_SHA256) { - Init = R_SCE_SHA256_Init; - Update = R_SCE_SHA256_Update; - Final = R_SCE_SHA256_Final; - } - else - return BAD_FUNC_ARG; - - wc_sce_hw_lock(); - - if (Init(&handle) == FSP_SUCCESS) { - ret = Update(&handle, (uint8_t*)hash->msg, hash->used); - if (ret == FSP_SUCCESS) { - ret = Final(&handle, out, &sz); - if (ret != FSP_SUCCESS || sz != outSz) { - return ret; - } - } - } - - wc_sce_hw_unlock(); - - return 0; -} -/* copy hash result from src to dst */ -static int SCEHashCopy(wolfssl_SCE_Hash* src, wolfssl_SCE_Hash* dst) -{ - if (src == NULL || dst == NULL) { - return BAD_FUNC_ARG; - } - - XMEMCPY(dst, src, sizeof(wolfssl_SCE_Hash)); - - if (src->len > 0 && src->msg != NULL) { - dst->msg = (byte*)XMALLOC(src->len, dst->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (dst->msg == NULL) { - return MEMORY_E; - } - XMEMCPY(dst->msg, src->msg, src->len); - } - - return 0; -} - -#if !defined(NO_SHA256) -#include - -/* wrapper for wc_InitSha256_ex */ -int wc_InitSha256_ex(wc_Sha256* sha, void* heap, int devId) -{ - return SCEHashInit(sha, heap, devId, SCE_SHA256); -} -/* wrapper for wc_Sha256Update */ -int wc_Sha256Update(wc_Sha256* sha, const byte* in, word32 sz) -{ - return SCEHashUpdate(sha, in, sz); -} -/* wrapper for wc_Sha256Final */ -int wc_Sha256Final(wc_Sha256* sha, byte* hash) -{ - return SCEHashFinal(sha, hash, WC_SHA256_DIGEST_SIZE); -} -/* wrapper for wc_Sha256GetHash */ -int wc_Sha256GetHash(wc_Sha256* sha, byte* hash) -{ - return SCEHashGet(sha, hash, WC_SHA256_DIGEST_SIZE); -} -/* wrapper for wc_Sha256Copy */ -int wc_Sha256Copy(wc_Sha256* src, wc_Sha256* dst) -{ - return SCEHashCopy(src, dst); -} -#endif /* !NO_SHA256 */ -#endif /* WOLFSSL_RENESAS_SCEPROTECT */ -#endif /* #if !defined(NO_SHA) || !defined(NO_SHA256) */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_util.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_util.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_util.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_sce_util.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,1160 +0,0 @@ -/* renesas_sce_util.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ -#include - -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#if defined(DEBUG_PK_CB) - #define WOLFSSL_PKMSG(_f_, ...) printf(_f_, ##__VA_ARGS__) -#else - #define WOLFSSL_PKMSG(_f_, ...) -#endif - -#if defined(WOLFSSL_RENESAS_SCEPROTECT_ECC) -WOLFSSL_GLOBAL SCE_PKCbInfo gSCE_PKCbInfo; -#endif - -/* expect to have these variables defined at user application */ -extern sce_instance_ctrl_t sce_ctrl; -extern sce_cfg_t sce_cfg; - -static const byte* ca_cert_sig; -static sce_key_data g_user_key_info; - -static uint32_t g_encrypted_publicCA_key[HW_SCE_SINST_WORD_SIZE]; -extern uint32_t g_CAscm_Idx; /* index of CM table */ -wolfSSL_Mutex sce_mutex; -static int sce_CryptHwMutexInit_ = 0; -static uint32_t sce_sess_idx = 0; - -/* Mutex Init */ -static int sce_CryptHwMutexInit(wolfSSL_Mutex* mutex) -{ - return wc_InitMutex(mutex); -} -/* Mutex Lock */ -static int sce_CryptHwMutexLock(wolfSSL_Mutex* mutex) -{ - return wc_LockMutex(mutex); -} -/* Mutex Unlock */ -static int sce_CryptHwMutexUnLock(wolfSSL_Mutex* mutex) -{ - return wc_UnLockMutex(mutex); -} - -/* -* lock hw engine -* this should be called before using engine. -*/ -WOLFSSL_LOCAL int wc_sce_hw_lock() -{ - int ret = 0; - - if (sce_CryptHwMutexInit_ == 0) { - - ret = sce_CryptHwMutexInit(&sce_mutex); - - if (ret == 0) { - sce_CryptHwMutexInit_ = 1; - } - else { - WOLFSSL_MSG(" mutex initialization failed."); - return -1; - } - } - if (sce_CryptHwMutexLock(&sce_mutex) != 0) { - /* this should not happens */ - return -1; - } - - return ret; -} - -/* -* release hw engine -*/ -WOLFSSL_LOCAL void wc_sce_hw_unlock(void) -{ - sce_CryptHwMutexUnLock(&sce_mutex); -} - -/* Open sce driver for use */ -WOLFSSL_LOCAL int wc_sce_Open() -{ - WOLFSSL_ENTER("wc_sce_Open"); - int ret; - if ((ret = wc_sce_hw_lock()) == 0) { - - ret = R_SCE_Open(&sce_ctrl, &sce_cfg); - - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("RENESAS SCE Open failed"); - } - if (ret == FSP_SUCCESS && g_user_key_info.encrypted_user_tls_key) { - - ret = R_SCE_TLS_RootCertificateRSA2048PublicKeyInstall( - g_user_key_info.encrypted_provisioning_key, - g_user_key_info.iv, - g_user_key_info.encrypted_user_tls_key, - &g_user_key_info.user_rsa2048_tls_wrappedkey); /* OUT */ - - /* init vars */ - g_CAscm_Idx = (uint32_t)-1; - - } - else { - WOLFSSL_MSG("Failed to lock sce hw "); - } - - } - - /* unlock hw */ - wc_sce_hw_unlock(); - - WOLFSSL_LEAVE("wc_sce_Open", ret); - return ret; -} - -/* close SCE driver */ -WOLFSSL_LOCAL void wc_sce_Close() -{ - WOLFSSL_ENTER("sce Close"); - int ret; - - if ((ret = wc_sce_hw_lock()) == 0) { - /* close SCE */ - ret = R_SCE_Close(&sce_ctrl); - - /* unlock hw */ - wc_sce_hw_unlock(); - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("RENESAS SCE Close failed"); - } - } - else { - WOLFSSL_MSG("Failed to unlock sce hw "); - } -} - -#ifndef WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY - -#if defined(WOLFSSL_RENESAS_SCEPROTECT_ECC) -/* Verify Server Key Exchange while doing ECDH key exchange */ -static int SCE_ServerKeyExVerify(uint32_t type, WOLFSSL* ssl, const uint8_t* sig, - uint32_t sigSz, void* ctx) -{ - int ret = WOLFSSL_FAILURE; - User_SCEPKCbInfo* cbInfo; - byte qx[MAX_ECC_BYTES], qy[MAX_ECC_BYTES]; - byte *peerkey = NULL; - - word32 qxLen = sizeof(qx), qyLen = sizeof(qy); - (void) sigSz; - - /* sanity check */ - if (ssl == NULL || sig == NULL || ctx == NULL) - return ret; - - cbInfo = (User_SCEPKCbInfo*)ctx; - - /* export public peer public key */ - ret = wc_ecc_export_public_raw(ssl->peerEccKey, qx, &qxLen, qy, &qyLen); - WOLFSSL_PKMSG("qxLen %d qyLen %d\n", qxLen, qyLen); - if (ret != 0) { - WOLFSSL_MSG("failed to export peer ecc key"); - return ret; - } - /* make peer ecc key data for SCE */ - /* 0padding(24bit) || 04(8bit) || Qx(256bit) || Qy(256bit) */ - peerkey = (byte*)XMALLOC((3 + 1 + qxLen + qyLen), NULL, DYNAMIC_TYPE_TMP_BUFFER); - if (peerkey == NULL) { - WOLFSSL_MSG("failed to malloc ecc key"); - return WOLFSSL_FAILURE; - } - - XMEMSET(peerkey, 0, (3 + 1 + qxLen + qyLen)); - peerkey[3] = ECC_POINT_UNCOMP; - XMEMCPY(&peerkey[4], qx, qxLen); - XMEMCPY(&peerkey[4+qxLen], qy, qyLen); - - if ((ret = wc_sce_hw_lock()) == 0) { - /* 0 : RSA 2048bit, 1 : Reserved, 2 : ECDSA P-256 */ - ret = R_SCE_TLS_ServerKeyExchangeVerify( - type, - (uint8_t*) ssl->arrays->clientRandom, - (uint8_t*) ssl->arrays->serverRandom, - (uint8_t*) peerkey, - (uint8_t*) sig, - (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex, - (uint32_t*)cbInfo->encrypted_ephemeral_ecdh_public_key); - - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("failed R_SCE_TLS_ServerKeyExchangeVerify"); - cbInfo->keyflgs_tls.bits.pk_key_set = 0; - } - else { - ret = WOLFSSL_SUCCESS; - cbInfo->keyflgs_tls.bits.pk_key_set = 1; - } - } - else { - WOLFSSL_MSG("Failed to lock sce hw "); - } - - /* unlock hw */ - wc_sce_hw_unlock(); - - XFREE(peerkey, 0, DYNAMIC_TYPE_TMP_BUFFER); - return ret; -} -/* Callback for Rsa Verify */ -WOLFSSL_LOCAL int wc_SCE_RsaVerify(WOLFSSL* ssl, byte* sig, uint32_t sigSz, - uint8_t** out, const byte* key, uint32_t keySz, void* ctx) -{ - int ret = WOLFSSL_FAILURE; - (void) out; - (void) key; - (void) keySz; - - WOLFSSL_PKMSG("SCE RSA Verify: sigSz %d, keySz %d\n", sigSz, keySz); - - if (wc_sce_usable(ssl, 0)) - ret = SCE_ServerKeyExVerify(0, ssl, sig, sigSz, ctx); - else - ret = CRYPTOCB_UNAVAILABLE; - - if (ret == WOLFSSL_SUCCESS) - ret = 0; /* 0 for success */ - - WOLFSSL_PKMSG("SCE RSA Verify: ret %d\n", ret); - - return ret; -} -/* Callback for Ecc Verify */ -WOLFSSL_LOCAL int wc_SCE_EccVerify(WOLFSSL* ssl, const uint8_t* sig, - uint32_t sigSz, const uint8_t* hash, uint32_t hashSz, - const uint8_t* key, uint32_t keySz, int* result, void* ctx) -{ - int ret = WOLFSSL_FAILURE; - uint8_t *sigforSCE; - const byte rs_size = HW_SCE_ECDSA_DATA_BYTE_SIZE/2; - byte offset = 0x3; - (void) sigSz; - (void) hash; - (void) hashSz; - (void) key; - (void) keySz; - - sigforSCE = NULL; - - WOLFSSL_PKMSG("SCE ECC Verify: ssl->options.serverState = %d sigSz %d, hashSz %d, keySz %d\n", - ssl->options.serverState, sigSz, hashSz, keySz); - - if (!wc_sce_usable(ssl, 0)) { - WOLFSSL_PKMSG("Cannot handle cipher suite by SCE"); - return CRYPTOCB_UNAVAILABLE; - } - - if ((sigforSCE = (uint8_t*)XMALLOC(HW_SCE_ECDSA_DATA_BYTE_SIZE, NULL, - DYNAMIC_TYPE_TEMP)) == NULL) { - WOLFSSL_MSG("failed to malloc memory"); - return MEMORY_E; - } - /* initialization */ - XMEMSET(sigforSCE, 0, HW_SCE_ECDSA_DATA_BYTE_SIZE); - - /* r */ - if (sig[offset] == 0x20) { - XMEMCPY(sigforSCE, &sig[offset+1], rs_size); - - offset = 0x25; - /* s */ - if (sig[offset] == 0x20) { - XMEMCPY(&sigforSCE[rs_size], &sig[offset+1], rs_size); - } - else { - XMEMCPY(&sigforSCE[rs_size], &sig[offset+2], rs_size); - } - } - else { - XMEMCPY(sigforSCE, &sig[offset+2], rs_size); - - offset = 0x26; - /* s */ - if (sig[offset] == rs_size) { - XMEMCPY(&sigforSCE[rs_size], &sig[offset+1], rs_size); - } - else { - XMEMCPY(&sigforSCE[rs_size], &sig[offset+2], rs_size); - } - } - - ret = SCE_ServerKeyExVerify(2, ssl, sigforSCE, 64, ctx); - - if (sigforSCE) - XFREE(sigforSCE, NULL, DYNAMIC_TYPE_TEMP); - - if (ret == WOLFSSL_SUCCESS) { - *result = 1; - ret = 0; /* for success */ - } - else - *result = 0; - - WOLFSSL_PKMSG("SCE ECC Verify: ret %d, result %d\n", ret, *result); - - return ret; -} - -/* Callback for ECC shared secret */ -WOLFSSL_LOCAL int SCE_EccSharedSecret(WOLFSSL* ssl, ecc_key* otherKey, - uint8_t* pubKeyDer, unsigned int* pubKeySz, - uint8_t* out, unsigned int* outlen, int side, void* ctx) -{ - int ret = WOLFSSL_SUCCESS; - (void) otherKey; - (void) side; - - User_SCEPKCbInfo* cbInfo = (User_SCEPKCbInfo*)ctx; - - (void)ssl; - (void)cbInfo; - - /* sanity check */ - if (ssl == NULL || pubKeyDer == NULL || pubKeySz == NULL || - out == NULL || outlen == NULL || ctx == NULL) - return WOLFSSL_FAILURE; - - WOLFSSL_PKMSG("PK ECC PMS: Side %s, Peer Curve %d\n", - side == WOLFSSL_CLIENT_END ? "client" : "server", otherKey->dp->id); - - if (cbInfo->keyflgs_tls.bits.pk_key_set == 1) { - if ((ret = wc_sce_hw_lock()) == 0) { - /* Generate ECC PUblic key pair */ - ret = R_SCE_TLS_ECC_secp256r1_EphemeralWrappedKeyPairGenerate( - &cbInfo->ecc_p256_wrapped_key, - (uint8_t*)&cbInfo->ecc_ecdh_public_key/* Qx 32 bytes and Qy 32 bytes*/ ); - if (ret != FSP_SUCCESS) { - WOLFSSL_PKMSG("Failed secp256r1_EphemeralWrappedKeyPairGenerate %d\n", ret); - return ret; - } - - /* copy generated ecdh public key inot buffer */ - pubKeyDer[0] = ECC_POINT_UNCOMP; - *pubKeySz = 1 + sizeof(cbInfo->ecc_ecdh_public_key); - XMEMCPY(&pubKeyDer[1], &cbInfo->ecc_ecdh_public_key, - sizeof(cbInfo->ecc_ecdh_public_key)); - - /* Generate Premaster Secret */ - ret = R_SCE_TLS_PreMasterSecretGenerateForECC_secp256r1( - (uint32_t*)&cbInfo->encrypted_ephemeral_ecdh_public_key, - &cbInfo->ecc_p256_wrapped_key, - (uint32_t*)out/* pre-master secret 64 bytes */); - if (ret != FSP_SUCCESS) { - WOLFSSL_PKMSG("Failed PreMasterSecretGenerateForECC_secp256r1 %d\n", ret); - return ret; - } - else { - /* set master secret generation callback for use */ - wolfSSL_CTX_SetGenMasterSecretCb(ssl->ctx, Renesas_cmn_genMasterSecret); - wolfSSL_SetGenMasterSecretCtx(ssl, cbInfo); - } - } - else { - WOLFSSL_MSG("Failed to lock sce hw "); - } - - /* unlock hw */ - wc_sce_hw_unlock(); - - *outlen = 64; - WOLFSSL_PKMSG("PK ECC PMS: ret %d, PubKeySz %d, OutLen %d\n", ret, *pubKeySz, *outlen); - } - - return ret; -} -#endif - -/* Return tls cipher suite enumeration that is supported by SCE library */ -static uint32_t GetSceCipherSuite( - uint8_t cipherSuiteFirst, - uint8_t cipherSuite) -{ - WOLFSSL_ENTER("GetSceCipherSuite"); - uint32_t sceCipher; - - if (cipherSuiteFirst == CIPHER_BYTE) - { - switch(cipherSuite) { - case TLS_RSA_WITH_AES_128_CBC_SHA256: - sceCipher = SCE_TLS_RSA_WITH_AES_128_CBC_SHA256; - break; - - case TLS_RSA_WITH_AES_256_CBC_SHA256: - sceCipher = SCE_TLS_RSA_WITH_AES_256_CBC_SHA256; - break; - - default: - sceCipher = (uint32_t)WOLFSSL_SCE_ILLEGAL_CIPHERSUITE; - break; - } - WOLFSSL_MSG("<< GetSceCipherSuite"); - return sceCipher; - } - else if (cipherSuiteFirst == ECC_BYTE) - { - sceCipher = (uint32_t)WOLFSSL_SCE_ILLEGAL_CIPHERSUITE; - /* comment out until implementation completes */ - switch(cipherSuite) { - - case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256: - sceCipher = SCE_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256; - break; - - case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256: - sceCipher = SCE_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256; - break; - - case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256: - sceCipher = SCE_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256; - break; - - case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: - sceCipher = SCE_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256; - break; - - default: - sceCipher = (uint32_t)WOLFSSL_SCE_ILLEGAL_CIPHERSUITE; - break; - } - } - else{ - sceCipher = (uint32_t)WOLFSSL_SCE_ILLEGAL_CIPHERSUITE; - } - - WOLFSSL_MSG("<< GetSceCipherSuite"); - - return sceCipher; -} -/* check if sce tls functions can be used for the cipher */ -/* */ -/* ssl : a pointer to WOLFSSL object */ -/* session_key_generated : if session key has been generated */ -/* return 1 for usable, 0 for unusable */ -WOLFSSL_LOCAL int wc_sce_usable(const WOLFSSL *ssl, - uint8_t session_key_generated) -{ - WOLFSSL_ENTER("sce_usable"); - uint32_t sceCipher; - byte side; - const Ciphers *enc; - const Ciphers *dec; - - /* sanity check */ - if (ssl == NULL) - return BAD_FUNC_ARG; - - /* when rsa key index == NULL, SCE isn't used for cert verification. */ - /* in the case, we cannot use TSIP. */ - if (!ssl->peerSceTsipEncRsaKeyIndex) - return 0; - - /* when enabled Extended Master Secret, we cannot use SCE. */ - if (ssl->options.haveEMS) - return 0; - - /* when session_key_generated is set as 1, expects to be created */ - /* session key already. */ - if (session_key_generated) { - enc = &ssl->encrypt; - dec = &ssl->decrypt; - if (enc == NULL || dec == NULL) { - /* something wrong */ - return 0; - } - if (enc->aes == NULL || dec->aes == NULL) { - return 0; - } - if (enc->aes->ctx.setup == 0) { - /* session key for SCE is not created */ - return 0; - } - } - /* retrieve cipher suite if SCE supports */ - sceCipher = GetSceCipherSuite(ssl->options.cipherSuite0, - ssl->options.cipherSuite); - side = ssl->options.side; - - if (sceCipher != (uint32_t)WOLFSSL_SCE_ILLEGAL_CIPHERSUITE - && side == WOLFSSL_CLIENT_END) - return 1; - else - return 0; -} - -/* Generate Hmac by sha256*/ -WOLFSSL_LOCAL int wc_sce_Sha256GenerateHmac(const WOLFSSL *ssl,const uint8_t* myInner, - uint32_t innerSz,const uint8_t* in, uint32_t sz, byte* digest) -{ - WOLFSSL_ENTER("sce_Sha256HmacGenerate"); - - sce_hmac_sha_handle_t _handle; - sce_hmac_sha_wrapped_key_t wrapped_key; - int ret; - - if ((ssl == NULL) || (myInner == NULL) || (in == NULL) || - (digest == NULL)) - return BAD_FUNC_ARG; - - wrapped_key = ssl->keys.sce_client_write_MAC_secret; - - if ((ret = wc_sce_hw_lock()) != 0) { - WOLFSSL_MSG("hw lock failed"); - return ret; - } - - ret = R_SCE_SHA256HMAC_GenerateInit( - &_handle, - &wrapped_key); - - if (ret == FSP_SUCCESS) - ret = R_SCE_SHA256HMAC_GenerateUpdate( - &_handle, - (uint8_t*)myInner, - innerSz); - - if (ret == FSP_SUCCESS) - ret = R_SCE_SHA256HMAC_GenerateUpdate( - &_handle, - (uint8_t*)in, - sz); - - if (ret == FSP_SUCCESS) - ret = R_SCE_SHA256HMAC_GenerateFinal( - &_handle, - digest); - - if (ret != FSP_SUCCESS) - ret = WOLFSSL_FAILURE; - - /* unlock hw */ - wc_sce_hw_unlock(); - WOLFSSL_LEAVE("sce_Sha256HmacGenerate", ret); - return ret; -} - -/* Verify hmac */ -WOLFSSL_LOCAL int wc_sce_Sha256VerifyHmac(const WOLFSSL *ssl, - const uint8_t* message, uint32_t messageSz, - uint32_t macSz, uint32_t content) -{ - WOLFSSL_ENTER("sce_Sha256HmacVerify"); - - sce_hmac_sha_handle_t _handle; - sce_hmac_sha_wrapped_key_t wrapped_key; - byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ]; - int ret; - - if ((ssl == NULL) || (message == NULL)) - return BAD_FUNC_ARG; - - wrapped_key = ssl->keys.sce_server_write_MAC_secret; - - if ((ret = wc_sce_hw_lock()) != 0) { - WOLFSSL_MSG("hw lock failed"); - return ret; - } - - wolfSSL_SetTlsHmacInner((WOLFSSL*)ssl, myInner, - (word32)messageSz, (int)content, 1); - - ret = R_SCE_SHA256HMAC_VerifyInit( - &_handle, - &wrapped_key); - - if (ret == FSP_SUCCESS) - ret = R_SCE_SHA256HMAC_VerifyUpdate( - &_handle, - (uint8_t*)myInner, - WOLFSSL_TLS_HMAC_INNER_SZ); - - if (ret == FSP_SUCCESS) - ret = R_SCE_SHA256HMAC_VerifyUpdate( - &_handle, - (uint8_t*)message, - (uint32_t)messageSz); - - if (ret == FSP_SUCCESS) - ret = R_SCE_SHA256HMAC_VerifyFinal( - &_handle, - (uint8_t*)(message+messageSz), - (uint32_t)macSz); - - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("SCE Mac verification failed"); - } - - /* unlock hw */ - wc_sce_hw_unlock(); - WOLFSSL_LEAVE("sce_Sha256HmacVerify", ret); - return ret; -} - -/* generate Verify Data based on master secret */ -WOLFSSL_LOCAL int wc_sce_generateVerifyData(const uint8_t *ms, /* master secret */ - const uint8_t *side, const uint8_t *handshake_hash, - uint8_t *hashes /* out */) -{ - WOLFSSL_ENTER("sce_generateVerifyData"); - int ret ; - uint32_t l_side = SCE_TLS_GENERATE_CLIENT_VERIFY; - - if ((ms == NULL) || (side == NULL) || (handshake_hash == NULL) || - (hashes == NULL)) - return BAD_FUNC_ARG; - - if (XSTRNCMP((const char*)side, (const char*)kTlsServerFinStr, - FINISHED_LABEL_SZ) == 0) - { - l_side = SCE_TLS_GENERATE_SERVER_VERIFY; - } - - if ((ret = wc_sce_hw_lock()) == 0) { - ret = R_SCE_TLS_VerifyDataGenerate(l_side, (uint32_t*)ms, - (uint8_t*)handshake_hash, hashes/* out */); - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_TLS_VerifyDataGenerate failed"); - } - } - /* unlock hw */ - wc_sce_hw_unlock(); - WOLFSSL_LEAVE("sce_generateVerifyData", ret); - return ret; -} - -/* generate keys for TLS communication */ -WOLFSSL_LOCAL int wc_sce_generateSessionKey(WOLFSSL *ssl, - User_SCEPKCbInfo* cbInfo, int devId) -{ - WOLFSSL_MSG("sce_generateSessionKey()"); - int ret; - Ciphers *enc; - Ciphers *dec; - sce_hmac_sha_wrapped_key_t key_client_mac; - sce_hmac_sha_wrapped_key_t key_server_mac; - sce_aes_wrapped_key_t key_client_aes; - sce_aes_wrapped_key_t key_server_aes; - uint32_t sceCS = GetSceCipherSuite(ssl->options.cipherSuite0, - ssl->options.cipherSuite); - - if (ssl== NULL || cbInfo == NULL) - return BAD_FUNC_ARG; - - - if ((ret = wc_sce_hw_lock()) == 0) { - if (sceCS == TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 || - sceCS == TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) - { - WOLFSSL_MSG("Session key for AES-GCM generation skipped."); - - wolfSSL_KeepArrays(ssl); - ret = FSP_SUCCESS; - - } - else { - ret = R_SCE_TLS_SessionKeyGenerate( - GetSceCipherSuite( - ssl->options.cipherSuite0, - ssl->options.cipherSuite), - (uint32_t*)ssl->arrays->sce_masterSecret, - (uint8_t*) ssl->arrays->clientRandom, - (uint8_t*) ssl->arrays->serverRandom, - NULL, - &key_client_mac, - &key_server_mac, - &key_client_aes, - &key_server_aes, - NULL, NULL); - } - - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_TLS_SessionKeyGenerate failed"); - } - else { - /* succeeded creating session keys */ - /* alloc aes instance for both enc and dec */ - enc = &ssl->encrypt; - dec = &ssl->decrypt; - - if (enc) { - if (enc->aes == NULL) { - enc->aes = (Aes*)XMALLOC(sizeof(Aes), ssl->heap, - DYNAMIC_TYPE_CIPHER); - if (enc->aes == NULL) - return MEMORY_E; - } - - XMEMSET(enc->aes, 0, sizeof(Aes)); - } - if (dec) { - if (dec->aes == NULL) { - dec->aes = (Aes*)XMALLOC(sizeof(Aes), ssl->heap, - DYNAMIC_TYPE_CIPHER); - if (dec->aes == NULL) { - if (enc) { - XFREE(enc->aes, NULL, DYNAMIC_TYPE_CIPHER); - } - return MEMORY_E; - } - } - - XMEMSET(dec->aes, 0, sizeof(Aes)); - } - /* copy key index into aes */ - if (ssl->options.side == PROVISION_CLIENT) { - XMEMCPY(&enc->aes->ctx.sce_wrapped_key, &key_client_aes, - sizeof(key_client_aes)); - XMEMCPY(&dec->aes->ctx.sce_wrapped_key, &key_server_aes, - sizeof(key_server_aes)); - } - else { - XMEMCPY(&enc->aes->ctx.sce_wrapped_key, &key_server_aes, - sizeof(key_server_aes)); - XMEMCPY(&dec->aes->ctx.sce_wrapped_key, &key_client_aes, - sizeof(key_client_aes)); - } - /* copy mac key index into keys */ - ssl->keys.sce_client_write_MAC_secret = key_client_mac; - ssl->keys.sce_server_write_MAC_secret = key_server_mac; - - /* set up key size and marked ready */ - if (enc) { - enc->aes->ctx.keySize = ssl->specs.key_size; - enc->aes->ctx.setup = 1; - /* ready for use */ - enc->setup = 1; - } - /* set up key size and marked ready */ - if (dec) { - dec->aes->ctx.keySize = ssl->specs.key_size; - dec->aes->ctx.setup = 1; - /* ready for use */ - dec->setup = 1; - } - - if (cbInfo->sce_cipher == SCE_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 || - cbInfo->sce_cipher == SCE_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256) { - enc->aes->nonceSz = AEAD_MAX_IMP_SZ; - dec->aes->nonceSz = AEAD_MAX_IMP_SZ; - } - enc->aes->devId = devId; - dec->aes->devId = devId; - - /* marked as session key is set */ - cbInfo->keyflgs_tls.bits.session_key_set = 1; - } - /* unlock hw */ - wc_sce_hw_unlock(); - } - else { - WOLFSSL_LEAVE("hw lock failed", ret); - } - - WOLFSSL_LEAVE("sce_generateSessionKey", ret); - return ret; -} - -/* generate master secret based on pre-master which is generated by SCE */ -WOLFSSL_LOCAL int wc_sce_generateMasterSecret( - uint8_t cipherSuiteFirst, - uint8_t cipherSuite, - const uint8_t *pr, /* pre-master */ - const uint8_t *cr, /* client random */ - const uint8_t *sr, /* server random */ - uint8_t *ms) -{ - WOLFSSL_ENTER("sce_generateMasterSecretEx"); - int ret; - - if ((pr == NULL) || (cr == NULL) || (sr == NULL) || - (ms == NULL)) - return BAD_FUNC_ARG; - - uint32_t sceCS = GetSceCipherSuite(cipherSuiteFirst, cipherSuite); - if (sceCS == 0xffffffff) - return BAD_FUNC_ARG; - - if ((ret = wc_sce_hw_lock()) == 0) { - ret = R_SCE_TLS_MasterSecretGenerate( - sceCS, - (uint32_t*)pr, - (uint8_t*)cr, (uint8_t*)sr, (uint32_t*)ms); - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_TLS_MasterSecretGenerate failed"); - } - /* unlock hw */ - wc_sce_hw_unlock(); - } - else { - WOLFSSL_MSG(" hw lock failed "); - } - WOLFSSL_LEAVE("sce_generateMasterSecret", ret); - return ret; -} - -/* generate pre-Master secrete by SCE */ -WOLFSSL_LOCAL int wc_sce_generatePremasterSecret(uint8_t *premaster, - uint32_t preSz) -{ - WOLFSSL_ENTER("sce_generatePremasterSecret"); - int ret; - - if (premaster == NULL) - return BAD_FUNC_ARG; - - if ((ret = wc_sce_hw_lock()) == 0 && preSz >= - (SCE_TLS_MASTER_SECRET_WORD_SIZE*4)) { - /* generate pre-master, 80 bytes */ - ret = R_SCE_TLS_PreMasterSecretGenerateForRSA2048((uint32_t*)premaster); - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG(" R_SCE_TLS_GeneratePreMasterSecret failed"); - } - /* unlock hw */ - wc_sce_hw_unlock(); - } - else { - WOLFSSL_MSG(" hw lock failed or preSz is smaller than 80"); - } - - WOLFSSL_LEAVE("sce_generatePremasterSecret", ret); - return ret; -} - - -/* -* generate encrypted pre-Master secrete by SCE -*/ -WOLFSSL_LOCAL int wc_sce_generateEncryptPreMasterSecret( - WOLFSSL* ssl, - uint8_t* out, - uint32_t* outSz) -{ - WOLFSSL_MSG("sce_generateEncryptPreMasterSecret"); - int ret; - - if ((ssl == NULL) || (out == NULL) || (outSz == NULL)) - return BAD_FUNC_ARG; - - if ((ret = wc_sce_hw_lock()) == 0) { - if (*outSz >= 256) - ret = R_SCE_TLS_PreMasterSecretEncryptWithRSA2048( - (uint32_t*)ssl->peerSceTsipEncRsaKeyIndex, - (uint32_t*)ssl->arrays->preMasterSecret, - (uint8_t*)out); - else - ret = -1; - - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG("R_SCE_TLS_PreMasterSecretEncryptWithRSA2048 failed"); - } - else { - *outSz = 256; /* SCE can only handles 2048 RSA */ - /* set GenMaster Callback for Master secret generation */ - void* ctx = wolfSSL_GetRsaVerifyCtx(ssl); - wolfSSL_CTX_SetGenMasterSecretCb(ssl->ctx, - Renesas_cmn_genMasterSecret); - wolfSSL_SetGenMasterSecretCtx(ssl, ctx); - } - wc_sce_hw_unlock(); - - } - else { - WOLFSSL_MSG(" hw lock failed "); - } - WOLFSSL_LEAVE("sce_generateEncryptPreMasterSecret", ret); - return ret; -} - - -/* Certificate verification by SCE */ -WOLFSSL_LOCAL int wc_sce_tls_CertVerify( - const uint8_t* cert, uint32_t certSz, - const uint8_t* signature, uint32_t sigSz, - uint32_t key_n_start,uint32_t key_n_len, - uint32_t key_e_start,uint32_t key_e_len, - uint8_t* sce_encPublickey) -{ - WOLFSSL_ENTER("sce_tls_CertVerify"); - int ret; - uint8_t *sigforSCE; - uint8_t *pSig; - const byte rs_size = 0x20; - byte offset = 0x3; - (void)sigSz; - - sigforSCE = NULL; - pSig = NULL; - - if (cert == NULL) - return BAD_FUNC_ARG; - - if (!signature) { - WOLFSSL_MSG(" signature for ca verification is not set"); - return -1; - } - if (!sce_encPublickey) { - WOLFSSL_MSG(" sce_encPublickey is NULL."); - return -1; - } - - if (g_user_key_info.encrypted_user_tls_key_type == - SCE_TLS_PUBLIC_KEY_TYPE_ECDSA_P256/*ECDSA*/) { - - if ((sigforSCE = (uint8_t*)XMALLOC(HW_SCE_ECDSA_DATA_BYTE_SIZE, NULL, - DYNAMIC_TYPE_TEMP)) == NULL) { - WOLFSSL_MSG("failed to malloc memory"); - return MEMORY_E; - } - /* initialization */ - XMEMSET(sigforSCE, 0, HW_SCE_ECDSA_DATA_BYTE_SIZE); - - if (signature[offset] == 0x20) { - XMEMCPY(sigforSCE, &signature[offset+1], rs_size); - - offset = 0x25; - if (signature[offset] == 0x20) { - XMEMCPY(&sigforSCE[rs_size], &signature[offset+1], rs_size); - } - else { - XMEMCPY(&sigforSCE[rs_size], &signature[offset+2], rs_size); - } - } - else { - XMEMCPY(sigforSCE, &signature[offset+2], rs_size); - offset = 0x26; - - if (signature[offset] == rs_size) { - XMEMCPY(&sigforSCE[rs_size], &signature[offset+1], rs_size); - } - else { - XMEMCPY(&sigforSCE[rs_size], &signature[offset+2], rs_size); - } - } - pSig = sigforSCE; - } - else { - pSig = (uint8_t*)signature; - } - - - if ((ret = wc_sce_hw_lock()) == 0) { - ret = R_SCE_TLS_CertificateVerify( - g_user_key_info.encrypted_user_tls_key_type, - (uint32_t*)g_encrypted_publicCA_key,/* encrypted public key */ - (uint8_t*)cert, /* certificate der */ - certSz, /* length of der */ - (uint8_t*)pSig, /* sign data by RSA PSS */ - key_n_start, /* start position of public key n in bytes */ - (key_n_start + key_n_len), /* length of the public key n */ - key_e_start, /* start pos, key e in bytes */ - (key_e_start + key_e_len), /* length of the public key e */ - (uint32_t*)sce_encPublickey /* returned encrypted key */ - ); - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG(" R_TSIP_TlsCertificateVerification() failed"); - } - if (sigforSCE) { - XFREE(sigforSCE, NULL, DYNAMIC_TYPE_TEMP); - } - wc_sce_hw_unlock(); - } - else { - WOLFSSL_MSG(" hw lock failed "); - } - WOLFSSL_LEAVE("sce_tls_CertVerify", ret); - return ret; -} - -/* Root Certificate verification */ -WOLFSSL_LOCAL int wc_sce_tls_RootCertVerify( - const uint8_t* cert, uint32_t cert_len, - uint32_t key_n_start, uint32_t key_n_len, - uint32_t key_e_start, uint32_t key_e_len, - uint32_t cm_row) -{ - int ret; - /* call to generate encrypted public key for certificate verification */ - uint8_t *signature = (uint8_t*)ca_cert_sig; - - WOLFSSL_ENTER("wc_sce_tls_RootCertVerify"); - - if (cert == NULL) - return BAD_FUNC_ARG; - - if (!signature) { - WOLFSSL_MSG(" signature for ca verification is not set"); - return -1; - } - - if ((ret = wc_sce_hw_lock()) == 0) { - ret = R_SCE_TLS_RootCertificateVerify( - g_user_key_info.encrypted_user_tls_key_type, - (uint8_t*)cert, /* CA cert */ - (uint32_t)cert_len, /* length of CA cert */ - key_n_start, /* Byte position of public key */ - (key_n_start + key_n_len), - key_e_start, - (key_e_start + key_e_len), - (uint8_t*)ca_cert_sig, /* RSA 2048 PSS with SHA256 */ - g_encrypted_publicCA_key); /* RSA-2048 public key 560 bytes */ - /* ECDSA 96 bytes */ - if (ret != FSP_SUCCESS) { - WOLFSSL_MSG(" R_SCE_TLS_RootCertificateVerify() failed"); - } - else { - g_CAscm_Idx = cm_row; - } - wc_sce_hw_unlock(); - } - else { - WOLFSSL_MSG(" hw lock failed "); - } - WOLFSSL_LEAVE("wc_sce_tls_RootCertVerify", ret); - return ret; -} - -/* store elements for session key generation into ssl->keys. - * return 0 on success, negative value on failure - */ -WOLFSSL_LOCAL int wc_sce_storeKeyCtx(WOLFSSL* ssl, User_SCEPKCbInfo* info) -{ - int ret = 0; - - WOLFSSL_ENTER("sce_storeKeyCtx"); - - if (ssl == NULL || info == NULL) - ret = BAD_FUNC_ARG; - - if (ret == 0) { - XMEMCPY(info->sce_masterSecret, ssl->arrays->sce_masterSecret, - SCE_TLS_MASTERSECRET_SIZE); - XMEMCPY(info->sce_clientRandom, ssl->arrays->clientRandom, 32); - XMEMCPY(info->sce_serverRandom, ssl->arrays->serverRandom, 32); - - info->sce_cipher = (uint8_t)GetSceCipherSuite(ssl->options.cipherSuite0, - ssl->options.cipherSuite); - } - WOLFSSL_LEAVE("sce_storeKeyCtx", ret); - return ret; -} - -/* to inform ca certificate sign */ -/* signature format expects RSA 2048 PSS with SHA256 */ -WOLFSSL_API void wc_sce_inform_cert_sign(const uint8_t *sign) -{ - if (sign) - ca_cert_sig = sign; -} - -/* let wolfSSL know user key information using TLS operation by SCE */ -WOLFSSL_API void wc_sce_inform_user_keys( - uint8_t* encrypted_provisioning_key, - uint8_t* iv, - uint8_t* encrypted_user_tls_key, - uint32_t encrypted_user_tls_key_type) -{ - WOLFSSL_ENTER("sce_inform_user_keys"); - g_user_key_info.encrypted_provisioning_key = NULL; - g_user_key_info.iv = NULL; - g_user_key_info.encrypted_user_tls_key = NULL; - - if (encrypted_provisioning_key ) { - g_user_key_info.encrypted_provisioning_key = encrypted_provisioning_key; - } - if (iv) { - g_user_key_info.iv = iv; - } - if (encrypted_user_tls_key) { - g_user_key_info.encrypted_user_tls_key = encrypted_user_tls_key; - } - - g_user_key_info.encrypted_user_tls_key_type = encrypted_user_tls_key_type; - - /* set callback for ECC */ - WOLFSSL_MSG("sce_inform_user_keys_ex"); -} - - -/* Set callbacks needed for sce TLS api handling */ -WOLFSSL_API void wc_sce_set_callbacks(WOLFSSL_CTX* ctx) -{ - wolfSSL_CTX_SetEccVerifyCb(ctx, Renesas_cmn_EccVerify); - wolfSSL_CTX_SetRsaVerifyCb(ctx, Renesas_cmn_RsaVerify); - wolfSSL_CTX_SetGenPreMasterCb(ctx, Renesas_cmn_generatePremasterSecret); - wolfSSL_CTX_SetRsaEncCb(ctx, Renesas_cmn_RsaEnc); - wolfSSL_CTX_SetVerifyMacCb(ctx, Renesas_cmn_VerifyHmac); - - /* reset callbacks */ - wolfSSL_CTX_SetEccSharedSecretCb(ctx, NULL); -} -/* Set callback contexts needed for sce TLS api handling */ -WOLFSSL_API int wc_sce_set_callback_ctx(WOLFSSL* ssl, void* user_ctx) -{ - if (sce_sess_idx > MAX_SCE_CBINDEX) { - WOLFSSL_MSG("exceeds maximum session index"); - return -1; - } - gSCE_PKCbInfo.user_PKCbInfo[sce_sess_idx] = (User_SCEPKCbInfo*)user_ctx; - gSCE_PKCbInfo.user_PKCbInfo[sce_sess_idx]->keyflgs_tls.bits.pk_key_set = 0; - gSCE_PKCbInfo.user_PKCbInfo[sce_sess_idx]->keyflgs_tls.bits.session_key_set = 0; - - wolfSSL_SetEccVerifyCtx(ssl, user_ctx); - wolfSSL_SetRsaEncCtx(ssl, user_ctx); - wolfSSL_SetRsaVerifyCtx(ssl, user_ctx); - wolfSSL_SetGenPreMasterCtx(ssl, user_ctx); - wolfSSL_SetEccSharedSecretCtx(ssl, NULL); - wolfSSL_SetVerifyMacCtx(ssl, user_ctx); - - /* set up crypt callback */ - wc_CryptoCb_CryptInitRenesasCmn(ssl, user_ctx); - - gSCE_PKCbInfo.num_session = ++sce_sess_idx; - - return 0; -} -#endif /* !WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY */ - -#endif /* WOLFSSL_RENESAS_SCEPROTECT || WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -30,7 +30,8 @@ #ifndef NO_AES -#if defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ +#if (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_AES) #include @@ -60,7 +61,7 @@ typedef e_tsip_err_t (*aesGcmDecFinalFn) (tsip_gcm_handle_t*, uint8_t*, uint32_t*, uint8_t*, uint32_t); - +#ifdef WOLFSSL_RENESAS_TSIP_TLS /* function pointer type defs for TLSv13 handshake AES-GCM/CCM encryption */ typedef e_tsip_err_t (*Tls13AesEncInitFn) @@ -85,9 +86,9 @@ /* encrypt plain data. - * + * * return cipher data size on success, negative value on failure. - * CRYPTOCB_UNAVAILABLE may be returned. + * CRYPTOCB_UNAVAILABLE may be returned. */ WOLFSSL_LOCAL int tsip_Tls13AesEncrypt( struct WOLFSSL* ssl, @@ -109,17 +110,17 @@ tsip_aes_key_index_t* key = NULL; WOLFSSL_ENTER("tsip_Tls13AesEncrypt"); - + if ((ssl == NULL) || (input == NULL) || (output == NULL) || (sz == 0)) { return BAD_FUNC_ARG; - } + } if (ssl->options.side != WOLFSSL_CLIENT_END) { return CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */ } /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); return CRYPTOCB_UNAVAILABLE; @@ -165,7 +166,7 @@ cs, key, sz); - + if (err != TSIP_SUCCESS) { WOLFSSL_MSG("R_TSIP_Tls13DecryptUpdate error"); ret = WC_HW_E; @@ -179,7 +180,7 @@ dataSz = min(remain, AES_BLOCK_SIZE); ForceZero(plain, sizeof(plain)); ForceZero(cipher, sizeof(cipher)); - XMEMCPY(plain, input + idxIn, dataSz); + XMEMCPY(plain, input + idxIn, dataSz); err = R_TSIP_Tls13EncryptUpdate( @@ -187,13 +188,13 @@ (uint8_t*)plain, (uint8_t*)cipher, dataSz); - + if (err == TSIP_SUCCESS) { if (dataSz >= AES_BLOCK_SIZE) { XMEMCPY(output + idxOut, cipher, dataSz); idxOut += dataSz; } - idxIn += dataSz; + idxIn += dataSz; remain -= dataSz; } else { @@ -235,7 +236,7 @@ /* decrypt encrypted handshake data for TLSv1.3 * AES-GCM or AES-CCM can be used * return 0 on success, otherwise on error. - */ + */ WOLFSSL_LOCAL int tsip_Tls13AesDecrypt( struct WOLFSSL* ssl, byte* output, @@ -259,14 +260,14 @@ if ((ssl == NULL) || (input == NULL) || (output == NULL) || (sz == 0)) { return BAD_FUNC_ARG; - } + } if (ssl->options.side != WOLFSSL_CLIENT_END) { return CRYPTOCB_UNAVAILABLE; /* expecting to fallback to S/W */ } /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); return CRYPTOCB_UNAVAILABLE; @@ -304,7 +305,7 @@ blocks = sz / AES_BLOCK_SIZE; remain = sz; conRemain = sz - TSIP_AES_GCM_AUTH_TAG_SIZE; - + if ((ret = tsip_hw_lock()) == 0) { err = R_TSIP_Tls13DecryptInit( @@ -314,7 +315,7 @@ cs, key, sz); - + if (err != TSIP_SUCCESS) { WOLFSSL_MSG("R_TSIP_Tls13DecryptInit error"); ret = WC_HW_E; @@ -334,14 +335,14 @@ (uint8_t*)cipher, (uint8_t*)plain, dataSz); - + if (err == TSIP_SUCCESS) { if (dataSz >= AES_BLOCK_SIZE && conRemain >= AES_BLOCK_SIZE) { XMEMCPY(output + idxOut, plain, dataSz); idxOut += dataSz; conRemain -= min(conRemain, dataSz); } - idxIn += dataSz; + idxIn += dataSz; remain -= dataSz; } else { @@ -374,29 +375,32 @@ WOLFSSL_LEAVE("tsip_Tls13AesDecrypt", ret); return ret; } - +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ #if (WOLFSSL_RENESAS_TSIP_VER >= 109) #ifdef WOLF_CRYPTO_CB -WOLFSSL_LOCAL int wc_tsip_AesCipher(int devIdArg, wc_CryptoInfo* info, +WOLFSSL_LOCAL int wc_tsip_AesCipher(int devIdArg, wc_CryptoInfo* info, void* ctx) { - int ret = NOT_COMPILED_IN; + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); TsipUserCtx* cbInfo = (TsipUserCtx*)ctx; WOLFSSL_ENTER("wc_tsip_AesCipher"); if (info == NULL || ctx == NULL) return BAD_FUNC_ARG; - + if (info->algo_type == WC_ALGO_TYPE_CIPHER) { #if !defined(NO_AES) || !defined(NO_DES3) #ifdef HAVE_AESGCM - if (info->cipher.type == WC_CIPHER_AES_GCM && - cbInfo->session_key_set == 1) { + if (info->cipher.type == WC_CIPHER_AES_GCM + #ifdef WOLFSSL_RENESAS_TSIP_TLS + && cbInfo->session_key_set == 1 + #endif + ) { if (info->cipher.enc) { ret = wc_tsip_AesGcmEncrypt( @@ -430,8 +434,11 @@ } #endif /* HAVE_AESGCM */ #ifdef HAVE_AES_CBC - if (info->cipher.type == WC_CIPHER_AES_CBC && - cbInfo->session_key_set == 1) { + if (info->cipher.type == WC_CIPHER_AES_CBC + #ifdef WOLFSSL_RENESAS_TSIP_TLS + && cbInfo->session_key_set == 1 + #endif + ) { if (info->cipher.enc) { ret = wc_tsip_AesCbcEncrypt( @@ -620,7 +627,7 @@ uint8_t* aadBuf = NULL; const uint8_t* iv_l = NULL; uint32_t ivSz_l = 0; - + tsip_aes_key_index_t key_client_aes; TsipUserCtx *userCtx; @@ -680,7 +687,8 @@ XMEMCPY(aadBuf, authIn, authInSz); } - if (ret == 0 && + #if defined(WOLFSSL_RENESAS_TSIP_TLS) + if (ret == 0 && userCtx->session_key_set == 1) { /* generate AES-GCM session key. The key stored in * Aes.ctx.tsip_keyIdx is not used here. @@ -701,8 +709,11 @@ WOLFSSL_MSG("R_TSIP_TlsGenerateSessionKey failed"); ret = -1; } - } else if (userCtx->user_aes128_key_set == 1 || - userCtx->user_aes256_key_set == 1) { + } else + #endif + if (ret == 0 && + (userCtx->user_aes128_key_set == 1 || + userCtx->user_aes256_key_set == 1)) { if (aes->ctx.keySize == 32) { XMEMCPY(&key_client_aes, &userCtx->user_aes256_key_index, sizeof(tsip_aes_key_index_t)); @@ -711,10 +722,10 @@ XMEMCPY(&key_client_aes, &userCtx->user_aes128_key_index, sizeof(tsip_aes_key_index_t)); } - + iv_l = iv; ivSz_l = ivSz; - + } if (ret == 0) { @@ -726,7 +737,7 @@ err = initFn(&hdl, &key_client_aes, (uint8_t*)iv_l, ivSz_l); if (err == TSIP_SUCCESS) { - err = updateFn(&hdl, NULL, NULL, 0UL, (uint8_t*)aadBuf, authInSz); + err = updateFn(&hdl, NULL, NULL, 0UL, (uint8_t*)aadBuf, authInSz); } if (err == TSIP_SUCCESS) { err = updateFn(&hdl, plainBuf, cipherBuf, sz, NULL, 0UL); @@ -814,14 +825,14 @@ uint8_t* aadBuf = NULL; const uint8_t* iv_l = NULL; uint32_t ivSz_l = 0; - + tsip_aes_key_index_t key_server_aes; TsipUserCtx *userCtx; WOLFSSL_ENTER("wc_tsip_AesGcmDecrypt"); if (aes == NULL || in == NULL || out == NULL || sz == 0 || ctx == NULL || - iv == 0 || + iv == 0 || (authInSz != 0 && authIn == NULL) || (authInSz == 0 && authIn != NULL) || (authTagSz != 0 && authTag == NULL) || @@ -875,7 +886,8 @@ XMEMCPY(aadBuf, authIn, authInSz); } - if (ret == 0 && + #if defined(WOLFSSL_RENESAS_TSIP_TLS) + if (ret == 0 && userCtx->session_key_set == 1) { /* generate AES-GCM session key. The key stored in * Aes.ctx.tsip_keyIdx is not used here. @@ -895,8 +907,12 @@ WOLFSSL_MSG("R_TSIP_TlsGenerateSessionKey failed"); ret = -1; } - } else if (userCtx->user_aes128_key_set == 1 || - userCtx->user_aes256_key_set == 1) { + } else + + #endif + if (ret == 0 && + (userCtx->user_aes128_key_set == 1 || + userCtx->user_aes256_key_set == 1)) { if (aes->ctx.keySize == 32) { XMEMCPY(&key_server_aes, &userCtx->user_aes256_key_index, sizeof(tsip_aes_key_index_t)); @@ -905,10 +921,10 @@ XMEMCPY(&key_server_aes, &userCtx->user_aes128_key_index, sizeof(tsip_aes_key_index_t)); } - + iv_l = iv; ivSz_l = ivSz; - + } if (ret == 0) { @@ -959,5 +975,6 @@ WOLFSSL_LEAVE("wc_tsip_AesGcmDecrypt", ret); return ret; } -#endif /* WOLFSSL_RENESAS_TSIP_CRYPT */ +#endif /* WOLFSSL_RENESAS_TSIP_TLS) || WOLFSSL_RENESAS_TSIP_CRYPTONLY + && NO_WOLFSSL_RENESAS_TSIP_CRYPT_AES */ #endif /* NO_AES */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_rsa.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,302 @@ +/* renesas_sce_rsa.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#include + +#if !defined(NO_RSA) && \ + (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) + +#include +#include + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef WOLFSSL_RENESAS_TSIP_CRYPTONLY +/* Make Rsa key for TSIP and set it to callback ctx + * Assumes to be called by Crypt Callback + * + * size desired keylenth, in bits. supports 1024 or 2048 bits + * ctx Callback context including pointer to hold generated key + * return TSIP_SUCCESS(0) on Success, otherwise negative value + */ +WOLFSSL_LOCAL int wc_tsip_MakeRsaKey(int size, void* ctx) +{ + e_tsip_err_t ret; + TsipUserCtx *info = (TsipUserCtx*)ctx; + + tsip_rsa1024_key_pair_index_t *tsip_pair1024_key = NULL; + tsip_rsa2048_key_pair_index_t *tsip_pair2048_key = NULL; + + /* sanity check */ + if (ctx == NULL) + return BAD_FUNC_ARG; + + if ((ret = tsip_hw_lock()) == 0) { + if (size == 1024) { + tsip_pair1024_key = + (tsip_rsa1024_key_pair_index_t*)XMALLOC( + sizeof(tsip_rsa1024_key_pair_index_t), NULL, + DYNAMIC_TYPE_RSA_BUFFER); + if (tsip_pair1024_key == NULL) + return MEMORY_E; + + ret = R_TSIP_GenerateRsa1024RandomKeyIndex(tsip_pair1024_key); + } + else if (size == 2048) { + tsip_pair2048_key = + (tsip_rsa2048_key_pair_index_t*)XMALLOC( + sizeof(tsip_rsa2048_key_pair_index_t), NULL, + DYNAMIC_TYPE_RSA_BUFFER); + if (tsip_pair2048_key == NULL) + return MEMORY_E; + + ret = R_TSIP_GenerateRsa2048RandomKeyIndex(tsip_pair2048_key); + } + else + return CRYPTOCB_UNAVAILABLE; + + if (ret == TSIP_SUCCESS) { + if (size == 1024) { + if (info->rsa1024pri_keyIdx != NULL) { + XFREE(info->rsa1024pri_keyIdx, NULL, + DYNAMIC_TYPE_RSA_BUFFER); + } + if (info->rsa1024pub_keyIdx != NULL) { + XFREE(info->rsa1024pub_keyIdx, NULL, + DYNAMIC_TYPE_RSA_BUFFER); + } + info->rsa1024pri_keyIdx = + (tsip_rsa1024_private_key_index_t*)XMALLOC( + sizeof(tsip_rsa1024_private_key_index_t), NULL, + DYNAMIC_TYPE_RSA_BUFFER); + + if (info->rsa1024pri_keyIdx == NULL) { + XFREE(tsip_pair1024_key, 0, DYNAMIC_TYPE_RSA_BUFFER); + return MEMORY_E; + } + + info->rsa1024pub_keyIdx = + (tsip_rsa1024_public_key_index_t*)XMALLOC( + sizeof(tsip_rsa1024_public_key_index_t), NULL, + DYNAMIC_TYPE_RSA_BUFFER); + + if (info->rsa1024pub_keyIdx == NULL) { + XFREE(tsip_pair1024_key, 0, DYNAMIC_TYPE_RSA_BUFFER); + XFREE(info->rsa1024pri_keyIdx, 0, + DYNAMIC_TYPE_RSA_BUFFER); + return MEMORY_E; + } + /* copy generated key pair and free malloced key */ + XMEMCPY(info->rsa1024pri_keyIdx, + &tsip_pair1024_key->private, + sizeof(tsip_rsa1024_private_key_index_t)); + XMEMCPY(info->rsa1024pub_keyIdx, + &tsip_pair1024_key->public, + sizeof(tsip_rsa1024_public_key_index_t)); + XFREE(tsip_pair1024_key, 0, DYNAMIC_TYPE_RSA_BUFFER); + + info->keyflgs_crypt.bits.rsapri1024_key_set = 1; + info->keyflgs_crypt.bits.rsapub1024_key_set = 1; + } + else if (size == 2048) { + if (info->rsa2048pri_keyIdx != NULL) { + XFREE(info->rsa2048pri_keyIdx, NULL, + DYNAMIC_TYPE_RSA_BUFFER); + } + if (info->rsa2048pub_keyIdx != NULL) { + XFREE(info->rsa2048pub_keyIdx, NULL, + DYNAMIC_TYPE_RSA_BUFFER); + } + info->rsa2048pri_keyIdx = + (tsip_rsa2048_private_key_index_t*)XMALLOC( + sizeof(tsip_rsa2048_private_key_index_t), NULL, + DYNAMIC_TYPE_RSA_BUFFER); + + if (info->rsa2048pri_keyIdx == NULL) { + XFREE(tsip_pair2048_key, 0, DYNAMIC_TYPE_RSA_BUFFER); + return MEMORY_E; + } + + info->rsa2048pub_keyIdx = + (tsip_rsa2048_public_key_index_t*)XMALLOC( + sizeof(tsip_rsa2048_public_key_index_t), NULL, + DYNAMIC_TYPE_RSA_BUFFER); + + if (info->rsa2048pub_keyIdx == NULL) { + XFREE(tsip_pair2048_key, 0, DYNAMIC_TYPE_RSA_BUFFER); + XFREE(info->rsa2048pri_keyIdx, 0, + DYNAMIC_TYPE_RSA_BUFFER); + return MEMORY_E; + } + /* copy generated key pair and free malloced key */ + XMEMCPY(info->rsa2048pri_keyIdx, + &tsip_pair2048_key->private, + sizeof(tsip_rsa2048_private_key_index_t)); + XMEMCPY(info->rsa2048pub_keyIdx, + &tsip_pair2048_key->public, + sizeof(tsip_rsa2048_public_key_index_t)); + XFREE(tsip_pair2048_key, 0, DYNAMIC_TYPE_RSA_BUFFER); + + info->keyflgs_crypt.bits.rsapri2048_key_set = 1; + info->keyflgs_crypt.bits.rsapub2048_key_set = 1; + + } + } + else { + WOLFSSL_MSG("Failed to generate key pair by TSIP"); + return CRYPTOCB_UNAVAILABLE; + } + + tsip_hw_unlock(); + } + + return 0; +} + + +/* Perform Rsa verify by TSIP + * Assumes to be called by Crypt Callback + * + * in Buffer to hold plaintext + * inLen Length of plaintext in bytes + * out Buffer to hold generated signature + * outLen Length of signature in bytes + * key rsa key object + * ctx The callback context + * return FSP_SUCCESS(0) on Success, otherwise negative value + */ + +WOLFSSL_LOCAL int wc_tsip_RsaVerifyPkcs(wc_CryptoInfo* info, TsipUserCtx* tuc) +{ + int ret = 0; + e_tsip_err_t err = TSIP_SUCCESS; + tsip_rsa_byte_data_t hashData, sigData; + + uint8_t tsip_hash_type; + + + /* sanity check */ + if (info == NULL || tuc == NULL){ + return BAD_FUNC_ARG; + } + + if (ret == 0) { + if (tuc->sing_hash_type == md5_mac) + tsip_hash_type = R_TSIP_RSA_HASH_MD5; + else if (tuc->sing_hash_type == sha_mac) + tsip_hash_type = R_TSIP_RSA_HASH_SHA1; + else if (tuc->sing_hash_type == sha256_mac) + tsip_hash_type = R_TSIP_RSA_HASH_SHA256; + else + ret = CRYPTOCB_UNAVAILABLE; + } + + switch (tuc->wrappedKeyType) { + case TSIP_KEY_TYPE_RSA1024: + if (tuc->keyflgs_crypt.bits.rsapub1024_key_set != 1) + { + ret = tsipImportPublicKey(tuc, tuc->wrappedKeyType); + + WOLFSSL_MSG("tsip rsa private key 1024 not set"); + if (ret != 0) + ret = CRYPTOCB_UNAVAILABLE; + + } + break; + case TSIP_KEY_TYPE_RSA2048: + if (tuc->keyflgs_crypt.bits.rsapub2048_key_set != 1) + { + ret = tsipImportPublicKey(tuc, tuc->wrappedKeyType); + + WOLFSSL_MSG("tsip rsa private key 1024 not set"); + if (ret != 0) + ret = CRYPTOCB_UNAVAILABLE; + } + break; + default: + WOLFSSL_MSG("wrapped private key is not supported"); + ret = CRYPTOCB_UNAVAILABLE; + break; + } + + if (ret == 0) { + hashData.pdata = (uint8_t*)info->pk.rsa.in; + hashData.data_length = info->pk.rsa.inLen; + hashData.data_type = + tuc->keyflgs_crypt.bits.message_type;/* message 0, hash 1 */ + + sigData.pdata = (uint8_t*)info->pk.rsa.out; + sigData.data_length = info->pk.rsa.outLen; + + if ((ret = tsip_hw_lock()) == 0) { + switch (tuc->wrappedKeyType) { + case TSIP_KEY_TYPE_RSA1024: + err = R_TSIP_RsassaPkcs1024SignatureVerification(&sigData, + &hashData, + (tsip_rsa1024_public_key_index_t *) + tuc->rsa1024pub_keyIdx, + tsip_hash_type); + if (err == TSIP_ERR_AUTHENTICATION) { + ret = SIG_VERIFY_E; + } + else if (err == TSIP_SUCCESS) { + ret = 0; + } + else { + ret = WC_HW_E; + } + break; + case TSIP_KEY_TYPE_RSA2048: + err = R_TSIP_RsassaPkcs2048SignatureVerification(&sigData, + &hashData, + (tsip_rsa2048_public_key_index_t *) + tuc->rsa2048pub_keyIdx, + tsip_hash_type); + if (err == TSIP_ERR_AUTHENTICATION) { + ret = SIG_VERIFY_E; + } + else if (err == TSIP_SUCCESS) { + ret = 0; + } + else { + ret = WC_HW_E; + } + break; + } + tsip_hw_unlock(); + } + } + + return ret; +} +#endif /* WOLFSSL_RENESAS_TSIP_CRYPTONLY */ +#endif /* WOLFSSL_RENESAS_TSIP_TLS || \ + WOLFSSL_RENESAS_TSIP_CRYPTONLY */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_sha.c 2024-08-03 07:30:00.000000000 +0000 @@ -36,18 +36,16 @@ #include -#if defined(WOLFSSL_RENESAS_TSIP_CRYPT) +#if (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) #include #include #include -#if !defined(NO_SHA) && !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) -#include - extern struct WOLFSSL_HEAP_HINT* tsip_heap_hint; - +#ifdef WOLFSSL_RENESAS_TSIP_TLS /* get hmac from handshake messages exchanged with server. * */ @@ -66,7 +64,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) isTLS13 = 1; @@ -138,8 +136,8 @@ -/* store handshake message for later hash or hmac operation. - * +/* store handshake message for later hash or hmac operation. + * */ WOLFSSL_LOCAL int tsip_StoreMessage(struct WOLFSSL* ssl, const byte* data, int sz) @@ -156,7 +154,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) isTLS13 = 1; @@ -166,7 +164,7 @@ ret = CRYPTOCB_UNAVAILABLE; } } - /* should work until handshake is done */ + /* should work until handshake is done */ if (ret == 0) { if (ssl->options.handShakeDone) { WOLFSSL_MSG("handshake is done."); @@ -197,12 +195,12 @@ bag = &(tuc->messageBag); - if (bag->msgIdx +1 > MAX_MSGBAG_MESSAGES || + if (bag->msgIdx +1 > MAX_MSGBAG_MESSAGES || bag->buffIdx + sz > MSGBAG_SIZE) { WOLFSSL_MSG("Capacity over error in tsip_StoreMessage"); ret = MEMORY_E; } - + XMEMCPY(bag->buff + bag->buffIdx, data, sz); bag->msgTypes[bag->msgIdx++] = *data; /* store message type */ bag->buffIdx += sz; @@ -231,7 +229,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) isTLS13 = 1; @@ -248,14 +246,14 @@ } bag = &(tuc->messageBag); } - + if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { err = R_TSIP_Sha256Init(&handle); if (err == TSIP_SUCCESS) { - err = R_TSIP_Sha256Update(&handle, (uint8_t*)bag->buff, + err = R_TSIP_Sha256Update(&handle, (uint8_t*)bag->buff, bag->buffIdx); } if (err == TSIP_SUCCESS) { @@ -278,7 +276,7 @@ WOLFSSL_LEAVE("tsip_GetMessageSha256", ret); return ret; } - +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ @@ -311,7 +309,7 @@ else { hash->heap = heap; } - + hash->len = 0; hash->used = 0; hash->msg = NULL; @@ -471,7 +469,9 @@ return 0; } - /* */ +#if !defined(NO_SHA) && !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) +#include + int wc_InitSha_ex(wc_Sha* sha, void* heap, int devId) { return TSIPHashInit(sha, heap, devId, TSIP_SHA1); @@ -496,7 +496,7 @@ { return TSIPHashCopy(src, dst); } -#endif /* !NO_SHA */ +#endif /* !NO_SHA && !NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH*/ #if !defined(NO_SHA256) && !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) #include @@ -527,5 +527,5 @@ return TSIPHashCopy(src, dst); } #endif /* !NO_SHA256 */ -#endif /* WOLFSSL_RENESAS_TSIP_CRYPT */ +#endif /* WOLFSSL_RENESAS_TSIP_TLS || WOLFSSL_RENESAS_TSIP_CRYPTONLY */ #endif /* #if !defined(NO_SHA) || !defined(NO_SHA256) */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_util.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_util.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_util.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/Renesas/renesas_tsip_util.c 2024-08-03 07:30:00.000000000 +0000 @@ -56,22 +56,21 @@ /* ./ca-cert.der.sign, */ /* expect to have these variables defined at user application */ -#if defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER>=109) +#if defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=109) extern uint32_t s_inst2[R_TSIP_SINST2_WORD_SIZE]; -#elif defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER>=106) +#elif defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=106) extern uint32_t s_flash[]; extern uint32_t s_inst1[R_TSIP_SINST_WORD_SIZE]; #endif wolfSSL_Mutex tsip_mutex; static int tsip_CryptHwMutexInit_ = 0; -static const byte* ca_cert_sig = NULL; static tsip_key_data g_user_key_info; - struct WOLFSSL_HEAP_HINT* tsip_heap_hint = NULL; /* tsip only keep one encrypted ca public key */ #if defined(WOLFSSL_RENESAS_TSIP_TLS) +static const byte* ca_cert_sig = NULL; static uint32_t g_encrypted_publicCA_key[R_TSIP_SINST_WORD_SIZE]; /* index of CM table. must be global since renesas_common access it. */ @@ -103,7 +102,38 @@ { return wc_UnLockMutex(mutex); } -#ifdef WOLF_PRIVATE_KEY_ID + +#if defined(WOLFSSL_RENESAS_TSIP_TLS) +/* Set client encrypted public key data. + * parameters: + * ssl WOLFSSL object + * keyBuf buffer holding wrapped key which Renesas key tool generated. + * keyBufLen buffer length + * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256 + * return 0 on success, others on failure. + */ +WOLFSSL_API int tsip_use_PublicKey_buffer_TLS(WOLFSSL* ssl, + const char* keyBuf, int keyBufLen, int keyType) +{ + int ret = 0; + TsipUserCtx* tuc = NULL; + + WOLFSSL_ENTER("tsip_use_PublicKey_buffer_TLS"); + + if (ssl == NULL + || keyBuf == NULL || keyBufLen == 0) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0){ + tuc = ssl->RenesasUserCtx; + tuc->wrappedPublicKey = (uint8_t*)keyBuf; + tuc->wrappedKeyType = keyType; + } + + WOLFSSL_LEAVE("tsip_use_PublicKey_buffer", ret); + return ret; +} /* Set client encrypted private key data. * parameters: * ssl WOLFSSL object @@ -112,13 +142,13 @@ * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256 * return 0 on success, others on failure. */ -WOLFSSL_API int tsip_use_PrivateKey_buffer(struct WOLFSSL* ssl, +WOLFSSL_API int tsip_use_PrivateKey_buffer_TLS(struct WOLFSSL* ssl, const char* keyBuf, int keyBufLen, int keyType) { int ret = 0; TsipUserCtx* tuc = NULL; - - WOLFSSL_ENTER("tsip_use_PrivateKey_buffer"); + + WOLFSSL_ENTER("tsip_use_PrivateKey_buffer_TLS"); if (ssl == NULL || keyBuf == NULL || keyBufLen == 0 ) { ret = BAD_FUNC_ARG; @@ -130,52 +160,86 @@ tuc->wrappedKeyType = keyType; /* store keyType as Id since Id capacity is 32 bytes */ - ret = wolfSSL_use_PrivateKey_Id(ssl, + ret = wolfSSL_use_PrivateKey_Id(ssl, (const unsigned char*)keyBuf, 32, tuc->devId); if (ret == WOLFSSL_SUCCESS) { - ret = 0; - } + ret = 0; + } } - WOLFSSL_LEAVE("tsip_use_PrivateKey_buffer", ret); + WOLFSSL_LEAVE("tsip_use_PrivateKey_buffer_TLS", ret); return ret; } +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ +#if defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) /* Set client encrypted public key data. * parameters: - * ssl WOLFSSL object + * uc Tsip user context * keyBuf buffer holding wrapped key which Renesas key tool generated. * keyBufLen buffer length * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256 * return 0 on success, others on failure. */ -WOLFSSL_API int tsip_use_PublicKey_buffer(WOLFSSL* ssl, +WOLFSSL_API int tsip_use_PublicKey_buffer_crypt(TsipUserCtx *uc, const char* keyBuf, int keyBufLen, int keyType) { int ret = 0; TsipUserCtx* tuc = NULL; - WOLFSSL_ENTER("tsip_use_PublicKey_buffer"); + WOLFSSL_ENTER("tsip_use_PublicKey_buffer_crypt"); - if (ssl == NULL || keyBuf == NULL || keyBufLen == 0) { + if (uc == NULL + || keyBuf == NULL || keyBufLen == 0) { ret = BAD_FUNC_ARG; } if (ret == 0){ - tuc = ssl->RenesasUserCtx; + tuc = uc; tuc->wrappedPublicKey = (uint8_t*)keyBuf; tuc->wrappedKeyType = keyType; } - WOLFSSL_LEAVE("tsip_use_PublicKey_buffer", ret); + WOLFSSL_LEAVE("tsip_use_PublicKey_buffer_crypt", ret); + return ret; +} +/* Set client encrypted private key data. + * parameters: + * uc Tsip user context + * keyBuf buffer holding wrapped key which Renesas key tool generated. + * keyBufLen buffer length + * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256 + * return 0 on success, others on failure. + */ +WOLFSSL_API int tsip_use_PrivateKey_buffer_crypt(TsipUserCtx *uc, + const char* keyBuf, int keyBufLen, int keyType) +{ + int ret = 0; + TsipUserCtx* tuc = NULL; + + WOLFSSL_ENTER("tsip_use_PrivateKey_buffer_crypt"); + + if (uc == NULL || keyBuf == NULL || keyBufLen == 0 ) { + ret = BAD_FUNC_ARG; + } + if (ret == 0){ + tuc = uc; + + tuc->wrappedPrivateKey = (uint8_t*)keyBuf; + tuc->wrappedKeyType = keyType; + } + + WOLFSSL_LEAVE("tsip_use_PrivateKey_buffer_crypt", ret); return ret; } -#endif /* WOLF_PRIVATE_KEY_ID */ +#endif /* WOLFSSL_RENESAS_TSIP_CRYPTONLY */ + +#ifdef WOLFSSL_RENESAS_TSIP_TLS /* Obsolete function. Use tsip_use_PrivateKey_buffer instead. * Set client encrypted private key data. * parameters: - * key Renesas Secure Flash Programmer generated key. + * key Renesas Secure Flash Programmer generated key. * keyType 0: RSA 2048bit, 1: RSA 4096bit, 2 ECC P256 * return 0 on success, others on failure. */ @@ -189,7 +253,7 @@ g_user_key_info.encrypted_user_private_key = (uint8_t*)encKey; g_user_key_info.encrypted_user_private_key_type = keyType; } - + WOLFSSL_LEAVE("tsip_set_clientPrivateKeyEnc", ret); return ret; } @@ -235,7 +299,7 @@ /* free stored messages */ tsipFlushMessages(ssl); - + return ret; } @@ -258,12 +322,12 @@ TsipUserCtx* tuc = NULL; WOLFSSL_ENTER("tsip_Tls13GenEccKeyPair"); - + if (ssl == NULL || kse == NULL) ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -319,7 +383,7 @@ ecckey = (ecc_key*)kse->key; ret = wc_ecc_set_curve(ecckey, kse->keyLen, curveId); } - + kse->pubKey[0] = ECC_POINT_UNCOMP; /* generate ecc key pair with TSIP */ @@ -332,7 +396,7 @@ &(tuc->handle13), TSIP_TLS13_MODE_FULL_HANDSHAKE, &(tuc->EcdhPrivKey13Idx), /* private key index */ - &(kse->pubKey[1])); /* genereted public key */ + &(kse->pubKey[1])); /* generated public key */ if (err != TSIP_SUCCESS){ret = WC_HW_E;} @@ -364,9 +428,9 @@ #if defined(WOLFSSL_TLS13) /* generate shared secret(pre-master secret) * get peer's raw ECDHE public key from KeyShareEntry. - * The pre-master secret generated by TSIP is stored into + * The pre-master secret generated by TSIP is stored into * TsipUserCtx.sharedSecret13Idx as TSIP specific format. - * + * * return 0 on success, CRYPTOCB_UNAVAILABLE when tsip can not handle and is * expecting to fallback to S/W, other negative values on error. */ @@ -384,7 +448,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -404,7 +468,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -422,7 +486,7 @@ if ((ret = tsip_hw_lock()) == 0) { tuc->SharedSecret_set = 0; - pubkeyraw = kse->ke + 1; /* peer's raw publick key data */ + pubkeyraw = kse->ke + 1; /* peer's raw public key data */ /* derive shared secret */ err = R_TSIP_Tls13GenerateEcdheSharedSecret( @@ -466,7 +530,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -475,7 +539,7 @@ tuc->EarlySecret_set = 1; } } - + WOLFSSL_LEAVE("tsip_Tls13DeriveEarlySecret", ret); return ret; } @@ -488,7 +552,7 @@ * get pre-master secret stored in TsipUserCtx.sharedSecret13Idx. * Derived handshake secret is stored into TsipUserCtx.handshakeSecret13Idx * as tsip specific format. - * + * * return 0 on success, CRYPTOCB_UNAVAILABLE when tsip can not handle and is * expecting to fallback to S/W, other negative values on error. */ @@ -504,7 +568,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -516,7 +580,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -533,7 +597,7 @@ if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { - + tuc->HandshakeSecret_set = 0; err = R_TSIP_Tls13GenerateHandshakeSecret( @@ -576,7 +640,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -587,7 +651,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -609,9 +673,9 @@ if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { - + tuc->HandshakeClientTrafficKey_set = 0; - + err = R_TSIP_Tls13GenerateClientHandshakeTrafficKey( &(tuc->handle13), TSIP_TLS13_MODE_FULL_HANDSHAKE, @@ -623,7 +687,7 @@ if (err != TSIP_SUCCESS) { WOLFSSL_MSG( "R_TSIP_Tls13GenerateClientHandshakeTrafficKey error"); - ret = WC_HW_E; + ret = WC_HW_E; } /* key derivation succeeded */ @@ -660,7 +724,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -671,7 +735,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -693,7 +757,7 @@ if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { - + tuc->HandshakeServerTrafficKey_set = 0; err = R_TSIP_Tls13GenerateServerHandshakeTrafficKey( @@ -709,7 +773,7 @@ "R_TSIP_Tls13GenerateServerHandshakeTrafficKey error"); ret = WC_HW_E; } - + /* key derivation succeeded */ if (ret == 0) { tuc->HandshakeServerTrafficKey_set = 1; @@ -744,7 +808,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -755,7 +819,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -777,7 +841,7 @@ if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { - + tuc->ServerTrafficSecret_set = 0; tuc->ClientTrafficSecret_set = 0; tuc->ServerWriteTrafficKey_set = 0; @@ -798,7 +862,7 @@ "R_TSIP_Tls13GenerateApplicationTrafficKey error"); ret = WC_HW_E; } - + /* key derivation succeeded */ if (ret == 0) { tuc->ServerTrafficSecret_set = 1; @@ -835,7 +899,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -846,7 +910,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -907,7 +971,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -918,7 +982,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -978,7 +1042,7 @@ * side ENCRYPT_SIDE_ONLY: when only encryption secret needs to be derived. * DECRYPT_SIDE_ONLY: when only decryption secret needs to be derived. * ENCRYPT_AND_DECRYPT_SIDE: when both secret needs to be derived. - * + * * returns 0 on success, CRYPTOCB_UNAVAILABLE when tsip can not handle and is * expecting to fallback to S/W, other negative values on error. */ @@ -1078,7 +1142,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -1088,7 +1152,7 @@ } if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -1096,7 +1160,7 @@ } if (ret == 0) { /* make sure handshake secret and verify data has been set by TSIP */ - if (!tuc->HandshakeSecret_set || + if (!tuc->HandshakeSecret_set || !tuc->HandshakeVerifiedData_set) { WOLFSSL_MSG("TSIP wasn't involved in the key-exchange."); ret = CRYPTOCB_UNAVAILABLE; @@ -1104,7 +1168,7 @@ } if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { - + tuc->MasterSecret_set = 0; err = R_TSIP_Tls13GenerateMasterSecret( @@ -1119,7 +1183,7 @@ "R_TSIP_Tls13GenerateMasterSecret( error"); ret = WC_HW_E; } - + if (ret == 0) { tuc->MasterSecret_set = 1; } @@ -1142,7 +1206,7 @@ /* verify handshake * ssl WOLFSSL object * hash buffer holding decrypted finished message content from server. - * + * */ static int tsipTls13VerifyHandshake(struct WOLFSSL* ssl, const byte* hash)/*finished message*/ @@ -1159,7 +1223,7 @@ ret = BAD_FUNC_ARG; if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -1170,7 +1234,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx hasn't been set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -1191,7 +1255,7 @@ if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { - + tuc->HandshakeVerifiedData_set = 0; err = R_TSIP_Tls13ServerHandshakeVerification( @@ -1207,7 +1271,7 @@ } else if (err != TSIP_SUCCESS) { WOLFSSL_MSG("R_TSIP_Tls13ServerHandshakeVerification error"); - ret = WC_HW_E; + ret = WC_HW_E; } if (ret == 0) { WOLFSSL_MSG("Verified handshake"); @@ -1230,9 +1294,9 @@ #if defined(WOLFSSL_TLS13) /* handles finished message from server. - * verify hmac in the message. Also output verify data to + * verify hmac in the message. Also output verify data to * TsipUserCtx.verifyDataIdx, which is used for deriving master secret. - * + * * ssl WOLFSSL object * input the buffer holding decrypted finished message, type and padding * inOutIdx On entry, the index into the message content of Finished. @@ -1284,7 +1348,7 @@ * inSz The size of the handshake message (including message header). * type The real content type being put after the message data. * hashOutput Whether to hash the unencrypted record data. - * returns the size of the record including header, CRYPTOCB_UNAVAILABLE + * returns the size of the record including header, CRYPTOCB_UNAVAILABLE * when tsip can not handle and is expecting to fallback to S/W, * other negative values on error. */ @@ -1301,7 +1365,7 @@ int isTLS13 = 0; RecordLayerHeader* rl = NULL; (void)outSz; - + WOLFSSL_ENTER("tsip_Tls13BuildMessage"); if (ssl == NULL || output == NULL || input == NULL) { @@ -1309,7 +1373,7 @@ } if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { isTLS13 = 1; } @@ -1357,7 +1421,7 @@ /* The real record content type goes at the end of the data. */ output[RECORD_HEADER_SZ + inSz] = (byte)type; - ret = tsip_Tls13AesEncrypt(ssl, + ret = tsip_Tls13AesEncrypt(ssl, output + RECORD_HEADER_SZ, /* output */ output + RECORD_HEADER_SZ, /* plain message */ inSz + 1); /* plain data size(= inSz + 1 for type) */ @@ -1376,7 +1440,7 @@ #if defined(WOLFSSL_TLS13) /* Send finished message to the server. - * + * * ssl WOLFSSL object * output buffer to output packet, including packet header and finished message * outSz buffer size of output @@ -1402,7 +1466,7 @@ if (ssl == NULL || output == NULL || input == NULL || outSz == 0) { ret = BAD_FUNC_ARG; } - + if (ret == 0) { finishedSz = ssl->specs.hash_size; @@ -1421,7 +1485,7 @@ output, outSz, input, headerSz + finishedSz, handshake, hashOut); - + if (recordSz > 0) { ssl->options.clientState = CLIENT_FINISHED_COMPLETE; ssl->options.handShakeState = HANDSHAKE_DONE; @@ -1451,7 +1515,7 @@ * return 0 on success, CRYPTOCB_UNAVAILABLE when TSIP can not handle, * other negative values on error. */ -WOLFSSL_LOCAL int tsip_Tls13CertificateVerify(struct WOLFSSL* ssl, +WOLFSSL_LOCAL int tsip_Tls13CertificateVerify(struct WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 totalSz) { @@ -1464,7 +1528,7 @@ e_tsip_err_t err = TSIP_SUCCESS; TsipUserCtx* tuc = NULL; e_tsip_tls13_signature_scheme_type_t sig_scheme; - + WOLFSSL_ENTER("tsip_Tls13CertificateVerify"); @@ -1512,7 +1576,7 @@ if (ret == 0) { /* get user context for TSIP */ - tuc = ssl->RenesasUserCtx; + tuc = ssl->RenesasUserCtx; if (tuc == NULL) { WOLFSSL_MSG("TsipUserCtx is not set to ssl."); ret = CRYPTOCB_UNAVAILABLE; @@ -1532,7 +1596,7 @@ idx = 0; ForceZero(sigData, sizeof(tuc->sigDataCertVerify)); - XMEMSET(sigData, TSIP_SIGNING_DATA_PREFIX_BYTE, + XMEMSET(sigData, TSIP_SIGNING_DATA_PREFIX_BYTE, TSIP_SIGNING_DATA_PREFIX_SZ); idx += TSIP_SIGNING_DATA_PREFIX_SZ; @@ -1541,7 +1605,7 @@ idx += TSIP_CERT_VFY_LABEL_SZ; ret = tsip_GetMessageSha256(ssl, &sigData[idx], &messageSz); } - + if (ret == 0) { if ((ret = tsip_hw_lock()) == 0) { @@ -1553,7 +1617,7 @@ totalSz); if (err == TSIP_SUCCESS) { - + *inOutIdx += totalSz; *inOutIdx += ssl->keys.padSz; ssl->options.peerAuthGood = 1; @@ -1582,199 +1646,21 @@ } #endif /* WOLFSSL_TLS13 */ -/* - * Import wrapped private key then convert it into TSIP key_index format. - * The target key should be set with tsip_use_PrivateKey_buffer in advance. - * Acceptable key types are: - * TSIP_KEY_TYPE_RSA2048 rsa 2048 bit key - * TSIP_KEY_TYPE_RSA4096 rsa 4096 bit key(Not supported as of now) - * TSIP_KEY_TYPE_ECDSAP256 ecdsa p256r1 key - */ -static int tsipImportPrivateKey(TsipUserCtx* tuc, int keyType) -{ - int ret = 0; - e_tsip_err_t err = TSIP_SUCCESS; - uint8_t* provisioning_key = g_user_key_info.encrypted_provisioning_key; - uint8_t* iv = g_user_key_info.iv; - uint8_t* encPrivKey; - - WOLFSSL_ENTER("tsipImportPrivateKey"); - - if (tuc == NULL) - return BAD_FUNC_ARG; - - encPrivKey = tuc->wrappedPrivateKey; - - if (encPrivKey == NULL || provisioning_key == NULL || iv == NULL) { - WOLFSSL_MSG("Missing some key materials used for import" ); - return CRYPTOCB_UNAVAILABLE; - } - - if (ret == 0) { - if (keyType != tuc->wrappedKeyType) { - WOLFSSL_MSG("No public key of specified type is set" ); - return CRYPTOCB_UNAVAILABLE; - } - } - - if ((ret = tsip_hw_lock()) == 0) { - switch (keyType) { - - #if !defined(NO_RSA) - case TSIP_KEY_TYPE_RSA2048: - - tuc->ClientRsa2048PrivKey_set = 0; - err = R_TSIP_GenerateRsa2048PrivateKeyIndex( - provisioning_key, iv, (uint8_t*)encPrivKey, - &(tuc->Rsa2048PrivateKeyIdx)); - if (err == TSIP_SUCCESS) { - tuc->ClientRsa2048PrivKey_set = 1; - } - else { - ret = WC_HW_E; - } - break; - #endif - - case TSIP_KEY_TYPE_RSA4096: - /* not supported as of TSIPv1.15 */ - ret = CRYPTOCB_UNAVAILABLE; - break; - - #if defined(HAVE_ECC) - case TSIP_KEY_TYPE_ECDSAP256: - - tuc->ClientEccP256PrivKey_set = 0; - err = R_TSIP_GenerateEccP256PrivateKeyIndex( - provisioning_key, iv, (uint8_t*)encPrivKey, - &(tuc->EcdsaP256PrivateKeyIdx)); - if (err == TSIP_SUCCESS) { - tuc->ClientEccP256PrivKey_set = 1; - } - else { - ret = WC_HW_E; - } - break; - #endif - - default: - ret = BAD_FUNC_ARG; - break; - } - tsip_hw_unlock(); - } - else { - WOLFSSL_MSG("mutex locking error"); - } - WOLFSSL_LEAVE("tsipImportPrivateKey", ret); - return ret; -} -/* - * Import wrapped public key then convert it into TSIP key_index format. - * The target key should be set with tsip_use_PublicKey_buffer in advance. - * Acceptable key types are: - * TSIP_KEY_TYPE_RSA2048 rsa 2048 bit key - * TSIP_KEY_TYPE_RSA4096 rsa 4096 bit key(Not supported as of now) - * TSIP_KEY_TYPE_ECDSAP256 ecdsa p256r1 key - */ -static int tsipImportPublicKey(TsipUserCtx* tuc, int keyType) -{ - int ret = 0; - e_tsip_err_t err = TSIP_SUCCESS; - uint8_t* provisioning_key = g_user_key_info.encrypted_provisioning_key; - uint8_t* iv = g_user_key_info.iv; - uint8_t* encPubKey; - - WOLFSSL_ENTER("tsipImportPublicKey"); - - if (tuc == NULL ) { - return BAD_FUNC_ARG; - } - - encPubKey = tuc->wrappedPublicKey; - - if (encPubKey == NULL || provisioning_key == NULL || iv == NULL) { - WOLFSSL_MSG("Missing some key materials used for import" ); - return CRYPTOCB_UNAVAILABLE; - } - - if (ret == 0) { - if (keyType != tuc->wrappedKeyType) { - WOLFSSL_MSG("No public key of specified type is set" ); - return CRYPTOCB_UNAVAILABLE; - } - } - - if ((ret = tsip_hw_lock()) == 0) { - switch(keyType) { - - #if !defined(NO_RSA) - case TSIP_KEY_TYPE_RSA2048: - - tuc->ClientRsa2048PubKey_set = 0; - err = R_TSIP_GenerateRsa2048PublicKeyIndex( - provisioning_key, iv, (uint8_t*)encPubKey, - &(tuc->Rsa2048PublicKeyIdx)); - if (err == TSIP_SUCCESS) { - tuc->ClientRsa2048PubKey_set = 1; - } - else { - ret = WC_HW_E; - } - break; - #endif - - #if !defined(NO_RSA) - case TSIP_KEY_TYPE_RSA4096: - /* not supported as of TSIPv1.15 */ - ret = CRYPTOCB_UNAVAILABLE; - break; - #endif - - #if defined(HAVE_ECC) - case TSIP_KEY_TYPE_ECDSAP256: - - tuc->ClientEccP256PubKey_set = 0; - err = R_TSIP_GenerateEccP256PublicKeyIndex( - provisioning_key, iv, (uint8_t*)encPubKey, - &(tuc->EcdsaP256PublicKeyIdx)); - if (err == TSIP_SUCCESS) { - tuc->ClientEccP256PubKey_set = 1; - } - else { - ret = WC_HW_E; - } - break; - #endif - - default: - ret = BAD_FUNC_ARG; - break; - } - tsip_hw_unlock(); - } - else { - WOLFSSL_MSG("mutex locking error"); - } - WOLFSSL_LEAVE("tsipImportPublicKey", ret); - return ret; -} - - #if defined(WOLFSSL_TLS13) /* Send the TLS v1.3 CertificateVerify message. A part of the message is * processed by TSIP for acceleration. * - * Prior to this function call, the appropriate key-pair should be set via - * tsip_use_PrivateKey_buffer and tsip_use_PublicKey_buffer APIs. Those key pair - * can be generated by the tool named "Renesas secure flash programmer". + * Prior to this function call, the appropriate key-pair should be set via + * tsip_use_PrivateKey_buffer_TLS and tsip_use_PublicKey_buffer_TLS APIs. + * Those key pair can be generated by the tool named + * "Renesas secure flash programmer". * When RSA certificate is used, both public and private keys should be set. * The public key is used for self-verify the generated certificateVerify * message. When ECC certificate is used, the self-verify will be performed only * WOLFSSL_CHECK_SIG_FAULTS is defined. - * - * Returns 0 on success, CRYPTOCB_UNAVAILABLE when the required key is not - * provided or unsupported algo is specified and otherwise failure. + * + * Returns 0 on success, CRYPTOCB_UNAVAILABLE when the required key is not + * provided or unsupported algo is specified and otherwise failure. */ WOLFSSL_LOCAL int tsip_Tls13SendCertVerify(WOLFSSL* ssl) { @@ -1807,7 +1693,7 @@ } if (ret == 0) { - if (ssl->version.major == SSLv3_MAJOR && + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) isTLS13 = 1; @@ -1816,7 +1702,7 @@ ret = CRYPTOCB_UNAVAILABLE; } } - + if (ret == 0) { /* get user context for TSIP */ tuc = ssl->RenesasUserCtx; @@ -1826,10 +1712,10 @@ } if (ret == 0) { - #if !defined(NO_RSA) + #if !defined(NO_RSA) if (ssl->options.haveRSA) isRsa = 1; - else + else #endif #ifdef HAVE_ECC if (ssl->options.haveECC) @@ -1860,7 +1746,7 @@ } } - if (ret == 0) { + if (ret == 0) { /* get message hash */ ForceZero(hash, sizeof(hash)); ret = tsip_GetMessageSha256(ssl, hash, (int*)&hashSz); @@ -1891,7 +1777,7 @@ TSIP_TLS13_SIGNATURE_SCHEME_RSA_PSS_RSAE_SHA256, hash, message + HANDSHAKE_HEADER_SZ, - &messageSz); + &messageSz); } else { err = R_TSIP_Tls13CertificateVerifyGenerate( @@ -1899,7 +1785,7 @@ TSIP_TLS13_SIGNATURE_SCHEME_ECDSA_SECP256R1_SHA256, hash, message + HANDSHAKE_HEADER_SZ, - &messageSz); + &messageSz); } if (err != TSIP_SUCCESS) { WOLFSSL_MSG("failed to make certificate verify message"); @@ -1930,7 +1816,7 @@ } } else { -#if defined(WOLFSSL_CHECK_SIG_FAULTS) +#if defined(WOLFSSL_CHECK_SIG_FAULTS) if (!tuc->ClientEccP256PubKey_set) { ret = NO_PRIVATE_KEY; } @@ -1943,7 +1829,7 @@ idx = 0; ForceZero(sigData, sizeof(tuc->sigDataCertVerify)); - XMEMSET(sigData, TSIP_SIGNING_DATA_PREFIX_BYTE, + XMEMSET(sigData, TSIP_SIGNING_DATA_PREFIX_BYTE, TSIP_SIGNING_DATA_PREFIX_SZ); idx += TSIP_SIGNING_DATA_PREFIX_SZ; @@ -1956,9 +1842,9 @@ if (ret == 0) { /* extract signature data from generated CertificateVerify message */ if (!isRsa) { -#if defined(WOLFSSL_CHECK_SIG_FAULTS) - idx = 4; - derSig = message + +#if defined(WOLFSSL_CHECK_SIG_FAULTS) + idx = 4; + derSig = message + HANDSHAKE_HEADER_SZ + HASH_SIG_SIZE + VERIFY_HEADER; if (derSig[idx] == 0x00) idx++; @@ -2021,8 +1907,8 @@ ((HandShakeHeader*)message)->type = certificate_verify; c32to24(messageSz, ((HandShakeHeader*)message)->length); - - recordSz = tsip_Tls13BuildMessage(ssl, output, 0, message, + + recordSz = tsip_Tls13BuildMessage(ssl, output, 0, message, messageSz + HANDSHAKE_HEADER_SZ, handshake, 1); @@ -2039,7 +1925,7 @@ return ret; } #endif /* WOLFSSL_TLS13 */ - +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ #if defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER >=109) @@ -2113,7 +1999,7 @@ return tsipCipher; } -/* Attempt to get a public key exchaged with the peer in ECDHE. +/* Attempt to get a public key exchanged with the peer in ECDHE. * the public key is verified by given signature then stored into ctx. * * return WOLFSSL_SUCCESS on success, WOLFSSL_FAILURE on failure. @@ -2228,8 +2114,8 @@ * key buffer holding peer's public key (NOT used in this function) * keySz public key size((NOT used in this function)) * result address of the variable to output result - * ctx context - * return 0 on success, CRYPTOCB_UNAVAILABLE in case TSIP cannot handle + * ctx context + * return 0 on success, CRYPTOCB_UNAVAILABLE in case TSIP cannot handle */ int wc_tsip_EccVerify( WOLFSSL* ssl, @@ -2252,8 +2138,8 @@ return CRYPTOCB_UNAVAILABLE; } - /* in TLS1.3 */ - if (ssl->version.major == SSLv3_MAJOR && + /* in TLS1.3 */ + if (ssl->version.major == SSLv3_MAJOR && ssl->version.minor == TLSv1_3_MINOR) { WOLFSSL_LEAVE("wc_tsip_EccVerify", CRYPTOCB_UNAVAILABLE); return CRYPTOCB_UNAVAILABLE; @@ -2375,7 +2261,7 @@ #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */ wolfSSL_CTX_SetEccSharedSecretCb(ctx, NULL); /* Set ssl-> options.sendVerify to SEND_CERT by the following two - * registrations. This will allow the client certificate to be sent to + * registrations. This will allow the client certificate to be sent to * the server even if the private key is empty. The two callbacks do * virtually nothing. */ @@ -2421,7 +2307,7 @@ wolfSSL_SetRsaSignCtx(ssl, user_ctx); wolfSSL_SetGenPreMasterCtx(ssl, user_ctx); wolfSSL_SetEccSharedSecretCtx(ssl, NULL); -#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY) +#if !defined(WOLFSSL_NO_TLS12) && !defined(WOLFSSL_AEAD_ONLY) wolfSSL_SetVerifyMacCtx(ssl, user_ctx); #endif /* !WOLFSSL_NO_TLS12 && !WOLFSSL_AEAD_ONLY */ /* set up crypt callback */ @@ -2453,6 +2339,212 @@ return def; } #endif + +#ifdef WOLFSSL_RENESAS_TSIP_TLS +/* + * Import wrapped private key then convert it into TSIP key_index format. + * The target key should be set with tsip_use_PrivateKey_buffer in advance. + * Acceptable key types are: + * TSIP_KEY_TYPE_RSA2048 rsa 2048 bit key + * TSIP_KEY_TYPE_RSA4096 rsa 4096 bit key(Not supported as of now) + * TSIP_KEY_TYPE_ECDSAP256 ecdsa p256r1 key + */ +static int tsipImportPrivateKey(TsipUserCtx* tuc, int keyType) +{ + int ret = 0; + e_tsip_err_t err = TSIP_SUCCESS; + uint8_t* provisioning_key = g_user_key_info.encrypted_provisioning_key; + uint8_t* iv = g_user_key_info.iv; + uint8_t* encPrivKey; + + WOLFSSL_ENTER("tsipImportPrivateKey"); + + if (tuc == NULL) + return BAD_FUNC_ARG; + + encPrivKey = tuc->wrappedPrivateKey; + + if (encPrivKey == NULL || provisioning_key == NULL || iv == NULL) { + WOLFSSL_MSG("Missing some key materials used for import" ); + return CRYPTOCB_UNAVAILABLE; + } + + if (ret == 0) { + if (keyType != tuc->wrappedKeyType) { + WOLFSSL_MSG("No public key of specified type is set" ); + return CRYPTOCB_UNAVAILABLE; + } + } + + if ((ret = tsip_hw_lock()) == 0) { + switch (keyType) { + + #if !defined(NO_RSA) + case TSIP_KEY_TYPE_RSA2048: + + tuc->ClientRsa2048PrivKey_set = 0; + err = R_TSIP_GenerateRsa2048PrivateKeyIndex( + provisioning_key, iv, (uint8_t*)encPrivKey, + &(tuc->Rsa2048PrivateKeyIdx)); + if (err == TSIP_SUCCESS) { + tuc->ClientRsa2048PrivKey_set = 1; + } + else { + ret = WC_HW_E; + } + break; + #endif + + case TSIP_KEY_TYPE_RSA4096: + /* not supported as of TSIPv1.15 */ + ret = CRYPTOCB_UNAVAILABLE; + break; + + #if defined(HAVE_ECC) + case TSIP_KEY_TYPE_ECDSAP256: + + tuc->ClientEccP256PrivKey_set = 0; + err = R_TSIP_GenerateEccP256PrivateKeyIndex( + provisioning_key, iv, (uint8_t*)encPrivKey, + &(tuc->EcdsaP256PrivateKeyIdx)); + if (err == TSIP_SUCCESS) { + tuc->ClientEccP256PrivKey_set = 1; + } + else { + ret = WC_HW_E; + } + break; + #endif + + default: + ret = BAD_FUNC_ARG; + break; + } + tsip_hw_unlock(); + } + else { + WOLFSSL_MSG("mutex locking error"); + } + WOLFSSL_LEAVE("tsipImportPrivateKey", ret); + return ret; +} + +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ + +/* + * Import wrapped public key then convert it into TSIP key_index format. + * The target key should be set with tsip_use_PublicKey_buffer in advance. + * Acceptable key types are: + * TSIP_KEY_TYPE_RSA2048 rsa 2048 bit key + * TSIP_KEY_TYPE_RSA4096 rsa 4096 bit key(Not supported as of now) + * TSIP_KEY_TYPE_ECDSAP256 ecdsa p256r1 key + */ +WOLFSSL_LOCAL int tsipImportPublicKey(TsipUserCtx* tuc, int keyType) +{ + int ret = 0; + e_tsip_err_t err = TSIP_SUCCESS; + uint8_t* provisioning_key = g_user_key_info.encrypted_provisioning_key; + uint8_t* iv = g_user_key_info.iv; + uint8_t* encPubKey; + + WOLFSSL_ENTER("tsipImportPublicKey"); + + if (tuc == NULL ) { + return BAD_FUNC_ARG; + } + + encPubKey = tuc->wrappedPublicKey; + + if (encPubKey == NULL || provisioning_key == NULL || iv == NULL) { + WOLFSSL_MSG("Missing some key materials used for import" ); + return CRYPTOCB_UNAVAILABLE; + } + + if (ret == 0) { + if (keyType != tuc->wrappedKeyType) { + WOLFSSL_MSG("No public key of specified type is set" ); + return CRYPTOCB_UNAVAILABLE; + } + } + + if ((ret = tsip_hw_lock()) == 0) { + switch(keyType) { + + #if !defined(NO_RSA) + case TSIP_KEY_TYPE_RSA2048: + #if defined(WOLFSSL_RENESAS_TSIP_TLS) + tuc->ClientRsa2048PubKey_set = 0; + #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + if (tuc->rsa2048pub_keyIdx != NULL) { + XFREE(tuc->rsa2048pub_keyIdx, NULL, + DYNAMIC_TYPE_RSA_BUFFER); + } + + tuc->rsa2048pub_keyIdx = + (tsip_rsa2048_public_key_index_t*)XMALLOC( + sizeof(tsip_rsa2048_public_key_index_t), NULL, + DYNAMIC_TYPE_RSA_BUFFER); + if (tuc->rsa2048pub_keyIdx == NULL) { + return MEMORY_E; + } + #endif + err = R_TSIP_GenerateRsa2048PublicKeyIndex( + provisioning_key, iv, (uint8_t*)encPubKey, + #if defined(WOLFSSL_RENESAS_TSIP_TLS) + &(tuc->Rsa2048PublicKeyIdx) + #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + tuc->rsa2048pub_keyIdx + #endif + ); + if (err == TSIP_SUCCESS) { + #if defined(WOLFSSL_RENESAS_TSIP_TLS) + tuc->ClientRsa2048PubKey_set = 1; + #elif defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + tuc->keyflgs_crypt.bits.rsapub2048_key_set = 1; + #endif + } + else { + ret = WC_HW_E; + } + break; + #endif + + #if !defined(NO_RSA) + case TSIP_KEY_TYPE_RSA4096: + /* not supported as of TSIPv1.15 */ + ret = CRYPTOCB_UNAVAILABLE; + break; + #endif + + #if defined(HAVE_ECC) && \ + defined(WOLFSSL_RENESAS_TSIP_TLS) + case TSIP_KEY_TYPE_ECDSAP256: + + tuc->ClientEccP256PubKey_set = 0; + err = R_TSIP_GenerateEccP256PublicKeyIndex( + provisioning_key, iv, (uint8_t*)encPubKey, + &(tuc->EcdsaP256PublicKeyIdx)); + if (err == TSIP_SUCCESS) { + tuc->ClientEccP256PubKey_set = 1; + } + else { + ret = WC_HW_E; + } + break; + #endif + + default: + ret = BAD_FUNC_ARG; + break; + } + tsip_hw_unlock(); + } + else { + WOLFSSL_MSG("mutex locking error"); + } + WOLFSSL_LEAVE("tsipImportPublicKey", ret); + return ret; +} /* * lock hw engine. * this should be called before using engine. @@ -2488,7 +2580,7 @@ { tsip_CryptHwMutexUnLock(&tsip_mutex); } - +#if defined(WOLFSSL_RENESAS_TSIP_TLS) /* check if tsip tls functions can be used for the cipher */ /* return :1 when tsip can be used , 0 not be used. */ int tsip_usable(const WOLFSSL *ssl, uint8_t session_key_generated) @@ -2584,7 +2676,7 @@ WOLFSSL_LEAVE("tsip_usable", ret); return ret; } - +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ /* open TSIP driver @@ -2598,13 +2690,13 @@ if ((ret = tsip_hw_lock()) == 0) { -#if defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER>=109) +#if defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=109) ret = R_TSIP_Open(NULL,NULL); if (ret != TSIP_SUCCESS) { WOLFSSL_MSG("RENESAS TSIP Open failed"); } - + #if defined(WOLFSSL_RENESAS_TSIP_TLS) if (ret == TSIP_SUCCESS && g_user_key_info.encrypted_user_tls_key) { ret = R_TSIP_GenerateTlsRsaPublicKeyIndex( @@ -2634,14 +2726,14 @@ g_CAscm_Idx = (uint32_t)-1; } } - -#elif defined(WOLFSSL_RENESAS_TSIP_TLS) && (WOLFSSL_RENESAS_TSIP_VER>=106) + #endif +#elif defined(WOLFSSL_RENESAS_TSIP) && (WOLFSSL_RENESAS_TSIP_VER>=106) ret = R_TSIP_Open((uint32_t*)s_flash, s_inst1, s_inst2); if (ret != TSIP_SUCCESS) { WOLFSSL_MSG("RENESAS TSIP Open failed"); } - + #if defined(WOLFSSL_RENESAS_TLS) /* generate TLS Rsa public key for Certificate verification */ if (ret == TSIP_SUCCESS && g_user_key_info.encrypted_user_tls_key) { ret = R_TSIP_GenerateTlsRsaPublicKeyIndex( @@ -2668,6 +2760,7 @@ g_CAscm_Idx = (uint32_t)-1; } } + #endif #else ret = R_TSIP_Open((uint32_t*)s_flash, s_inst1, s_inst2); if (ret != TSIP_SUCCESS) { @@ -2707,16 +2800,30 @@ WOLFSSL_LEAVE("tsip_Close", 0); } -/* Support functions for TSIP TLS Capability */ -#if defined(WOLFSSL_RENESAS_TSIP_TLS) - -/* to inform ca certificate sign */ -/* signature format expects RSA 2048 PSS with SHA256 */ -void tsip_inform_cert_sign(const byte *sign) +int wc_tsip_GenerateRandBlock(byte* output, word32 sz) { - if (sign) - ca_cert_sig = sign; + /* Generate PRNG based on NIST SP800-90A AES CTR-DRBG */ + int ret = 0; + word32 buffer[4]; + + while (sz > 0) { + word32 len = sizeof(buffer); + + if (sz < len) { + len = sz; + } + /* return 4 words random number*/ + ret = R_TSIP_GenerateRandomNumber((uint32_t*)buffer); + if(ret == TSIP_SUCCESS) { + XMEMCPY(output, &buffer, len); + output += len; + sz -= len; + } else + return ret; + } + return ret; } + #if (WOLFSSL_RENESAS_TSIP_VER>=109) void tsip_inform_user_keys_ex( byte* encrypted_provisioning_key, @@ -2767,8 +2874,16 @@ } #endif +/* Support functions for TSIP TLS Capability */ +#if defined(WOLFSSL_RENESAS_TSIP_TLS) - +/* to inform ca certificate sign */ +/* signature format expects RSA 2048 PSS with SHA256 */ +void tsip_inform_cert_sign(const byte *sign) +{ + if (sign) + ca_cert_sig = sign; +} /* Sha1Hmac */ int wc_tsip_Sha1HmacGenerate( const WOLFSSL *ssl, @@ -2986,7 +3101,7 @@ WOLFSSL_LEAVE("tsip_generateVerifyData", BAD_FUNC_ARG); return BAD_FUNC_ARG; } - if (XSTRNCMP((const char*)side, (const char*)kTlsServerFinStr, + if (XSTRNCMP((const char*)side, (const char*)kTlsServerFinStr, FINISHED_LABEL_SZ) == 0) { l_side = R_TSIP_TLS_GENERATE_SERVER_VERIFY; } @@ -3552,15 +3667,20 @@ WOLFSSL_ENTER("tsip_SignRsaPkcs"); - if (info == NULL || tuc == NULL || tuc->ssl == NULL) { + if (info == NULL || tuc == NULL + #ifndef WOLFSSL_RENESAS_TSIP_CRYPTONLY + || tuc->ssl == NULL + #endif + ) { ret = BAD_FUNC_ARG; } +#ifdef WOLFSSL_RENESAS_TSIP_TLS if (ret == 0) { ssl = tuc->ssl; if (ssl->version.major == SSLv3_MAJOR && - ssl->version.minor == TLSv1_3_MINOR) { + ssl->version.minor == TLSv1_3_MINOR) { ret = CRYPTOCB_UNAVAILABLE; } } @@ -3570,6 +3690,7 @@ ret = tsipImportPrivateKey(tuc, tuc->wrappedKeyType); } + if (ret == 0) { if (ssl->options.hashAlgo == md5_mac) tsip_hash_type = R_TSIP_RSA_HASH_MD5; @@ -3578,27 +3699,87 @@ else if (ssl->options.hashAlgo == sha256_mac) tsip_hash_type = R_TSIP_RSA_HASH_SHA256; else - ret = CRYPTOCB_UNAVAILABLE; + ret = CRYPTOCB_UNAVAILABLE; + } +#else + (void)ssl; + + if (ret == 0) { + if (tuc->sing_hash_type == md5_mac) + tsip_hash_type = R_TSIP_RSA_HASH_MD5; + else if (tuc->sing_hash_type == sha_mac) + tsip_hash_type = R_TSIP_RSA_HASH_SHA1; + else if (tuc->sing_hash_type == sha256_mac) + tsip_hash_type = R_TSIP_RSA_HASH_SHA256; + else + ret = CRYPTOCB_UNAVAILABLE; + } + + switch (tuc->wrappedKeyType) { + case TSIP_KEY_TYPE_RSA1024: + if (tuc->keyflgs_crypt.bits.rsapri1024_key_set != 1) + { + WOLFSSL_MSG("tsip rsa private key 2048 not set"); + ret = CRYPTOCB_UNAVAILABLE; + } + break; + case TSIP_KEY_TYPE_RSA2048: + if (tuc->keyflgs_crypt.bits.rsapri2048_key_set != 1) + { + WOLFSSL_MSG("tsip rsa private key 2048 not set"); + ret = CRYPTOCB_UNAVAILABLE; + } + break; + default: + WOLFSSL_MSG("wrapped private key is not supported"); + ret = CRYPTOCB_UNAVAILABLE; + break; } +#endif + if (ret == 0) { + #ifdef WOLFSSL_RENESAS_TSIP_TLS hashData.pdata = (uint8_t*)ssl->buffers.digest.buffer; hashData.data_type = 1; sigData.pdata = (uint8_t*)info->pk.rsa.in; sigData.data_length = 0; /* signature size will be returned here */ - + #else + hashData.pdata = (uint8_t*)info->pk.rsa.in; + hashData.data_length= info->pk.rsa.inLen; + hashData.data_type = tuc->keyflgs_crypt.bits.message_type; + sigData.pdata = (uint8_t*)info->pk.rsa.out; + sigData.data_length = 0; + #endif if ((ret = tsip_hw_lock()) == 0) { switch (tuc->wrappedKeyType) { - + #ifdef WOLFSSL_RENESAS_TSIP_CRYPTONLY + case TSIP_KEY_TYPE_RSA1024: + err = R_TSIP_RsassaPkcs1024SignatureGenerate( + &hashData, &sigData, + (tsip_rsa1024_private_key_index_t*) + tuc->rsa1024pri_keyIdx, + tsip_hash_type); + + if (err != TSIP_SUCCESS) { + ret = WC_HW_E; + } + break; + #endif case TSIP_KEY_TYPE_RSA2048: err = R_TSIP_RsassaPkcs2048SignatureGenerate( &hashData, &sigData, + #ifdef WOLFSSL_RENESAS_TSIP_TLS &tuc->Rsa2048PrivateKeyIdx, + #else + (tsip_rsa2048_private_key_index_t*) + tuc->rsa2048pri_keyIdx, + #endif tsip_hash_type); if (err != TSIP_SUCCESS) { - ret = WC_HW_E; + ret = WC_HW_E; } break; @@ -3624,9 +3805,9 @@ } #endif /* !NO_RSA */ -#if !defined(NO_RSA) +#if !defined(NO_RSA) && defined(WOLFSSL_RENESAS_TSIP_TLS) WOLFSSL_LOCAL int tsip_VerifyRsaPkcsCb( - WOLFSSL* ssl, + WOLFSSL* ssl, unsigned char* sig, unsigned int sigSz, unsigned char** out, const unsigned char* keyDer, unsigned int keySz, @@ -3647,7 +3828,7 @@ } if (ssl->version.major == SSLv3_MAJOR && - ssl->version.minor == TLSv1_3_MINOR) { + ssl->version.minor == TLSv1_3_MINOR) { ret = CRYPTOCB_UNAVAILABLE; } @@ -3661,7 +3842,7 @@ /* import public key_index from wrapped key */ ret = tsipImportPublicKey(tuc, tuc->wrappedKeyType); } - + if (ret == 0) { if (ssl->options.hashAlgo == md5_mac) tsip_hash_type = R_TSIP_RSA_HASH_MD5; @@ -3671,7 +3852,7 @@ tsip_hash_type = R_TSIP_RSA_HASH_SHA256; else { ret = CRYPTOCB_UNAVAILABLE; - } + } } if (ret == 0) { @@ -3682,7 +3863,7 @@ if ((ret = tsip_hw_lock()) == 0) { switch (tuc->wrappedKeyType) { - + case TSIP_KEY_TYPE_RSA2048: sigData.data_length = 256; err = R_TSIP_RsassaPkcs2048SignatureVerification( @@ -3719,11 +3900,11 @@ WOLFSSL_LEAVE("tsip_VerifyRsaPkcsCb", ret); return ret; } -#endif /* !NO_RSA */ +#endif /* !NO_RSA && TSIP_TLS */ -#if defined(HAVE_ECC) +#if defined(HAVE_ECC) && defined(WOLFSSL_RENESAS_TSIP_TLS) /* Perform signing with the client's ECC private key on hash value of messages - * exchanged with server. + * exchanged with server. * * parameters * info->pk.eccsign.in : the buffer holding hash value of messages @@ -3761,7 +3942,7 @@ ssl = tuc->ssl; if (ssl->version.major == SSLv3_MAJOR && - ssl->version.minor == TLSv1_3_MINOR) { + ssl->version.minor == TLSv1_3_MINOR) { ret = CRYPTOCB_UNAVAILABLE; } } @@ -3770,33 +3951,33 @@ /* import private key_index from wrapped key */ ret = tsipImportPrivateKey(tuc, tuc->wrappedKeyType); } - + if (ret == 0) { hashData.pdata = (uint8_t*)info->pk.eccsign.in; hashData.data_type = 1; sigData.pdata = (uint8_t*)info->pk.eccsign.out; sigData.data_length = 0; /* signature size will be returned here */ - if ((ret = tsip_hw_lock()) == 0) { + if ((ret = tsip_hw_lock()) == 0) { switch (tuc->wrappedKeyType) { #if defined(HAVE_ECC) case TSIP_KEY_TYPE_ECDSAP256: offsetForWork = R_TSIP_ECDSA_DATA_BYTE_SIZE + 32; - if (*(info->pk.eccsign.outlen) < + if (*(info->pk.eccsign.outlen) < R_TSIP_ECDSA_DATA_BYTE_SIZE + offsetForWork) { ret = BUFFER_E; break; } - sigData.pdata = (uint8_t*)info->pk.eccsign.out + + sigData.pdata = (uint8_t*)info->pk.eccsign.out + offsetForWork; err = R_TSIP_EcdsaP256SignatureGenerate( &hashData, &sigData, &tuc->EcdsaP256PrivateKeyIdx); if (err != TSIP_SUCCESS) { ret = WC_HW_E; - break; + break; } out = info->pk.eccsign.out; @@ -3810,7 +3991,7 @@ /* encode ASN sequence */ out[idx++] = ASN_SEQUENCE | ASN_CONSTRUCTED; out[idx++] = sz; - + /* copy r part */ out[idx++] = ASN_INTEGER; out[idx++] = rSz; @@ -3825,7 +4006,7 @@ if (sSz > R_TSIP_ECDSA_DATA_BYTE_SIZE / 2) out[idx++] = 0x00; XMEMCPY(&out[idx], sig, R_TSIP_ECDSA_DATA_BYTE_SIZE / 2); - + /* out size */ *(info->pk.eccsign.outlen) = ASN_TAG_SZ + 1 + sz; break; @@ -3861,25 +4042,27 @@ WOLFSSL_LEAVE("tsip_SignEcdsa", ret); return ret; } -#endif /* HAVE_ECC */ +#endif /* HAVE_ECC && TSIP_TLS */ #ifdef WOLFSSL_RENESAS_TSIP_CRYPT_DEBUG -/* err - * e_tsip_err +#if 0 + /* this is here for documentation purposes. */ + enum e_tsip_err { TSIP_SUCCESS = 0, - TSIP_ERR_SELF_CHECK1, // Self-check 1 fail or TSIP function internal err. - TSIP_ERR_RESOURCE_CONFLICT, // A resource conflict occurred. - TSIP_ERR_SELF_CHECK2, // Self-check 2 fail. - TSIP_ERR_KEY_SET, // setting the invalid key. - TSIP_ERR_AUTHENTICATION, // Authentication failed. - TSIP_ERR_CALLBACK_UNREGIST, // Callback function is not registered. - TSIP_ERR_PARAMETER, // Illegal Input data. - TSIP_ERR_PROHIBIT_FUNCTION, // An invalid function call occurred. - * TSIP_RESUME_FIRMWARE_GENERATE_MAC, - // There is a continuation of R_TSIP_GenerateFirmwareMAC. -*/ + TSIP_ERR_SELF_CHECK1, /* Self-check 1 fail or TSIP function internal err. */ + TSIP_ERR_RESOURCE_CONFLICT, /* A resource conflict occurred. */ + TSIP_ERR_SELF_CHECK2, /* Self-check 2 fail. */ + TSIP_ERR_KEY_SET, /* setting the invalid key. */ + TSIP_ERR_AUTHENTICATION, /* Authentication failed. */ + TSIP_ERR_CALLBACK_UNREGIST, /* Callback function is not registered. */ + TSIP_ERR_PARAMETER, /* Illegal Input data. */ + TSIP_ERR_PROHIBIT_FUNCTION, /* An invalid function call occurred. */ + TSIP_RESUME_FIRMWARE_GENERATE_MAC + /* There is a continuation of R_TSIP_GenerateFirmwareMAC. */ + }; +#endif static void hexdump(const uint8_t* in, uint32_t len) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/afalg_aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/afalg_aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/afalg_aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/afalg_aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -58,6 +58,14 @@ byte* key = (byte*)aes->key; #endif + if (aes->alFd <= 0) { + aes->alFd = wc_Afalg_Socket(); + if (aes->alFd < 0) { + WOLFSSL_MSG("Unable to open an AF_ALG socket"); + return WC_AFALG_SOCK_E; + } + } + aes->rdFd = wc_Afalg_CreateRead(aes->alFd, type, name); if (aes->rdFd < 0) { WOLFSSL_MSG("Unable to accept and get AF_ALG read socket"); @@ -71,7 +79,11 @@ aes->rdFd = WC_SOCK_NOTSET; return WC_AFALG_SOCK_E; } +#ifdef WOLFSSL_AFALG_XILINX_AES + ForceZero(key, sizeof(aes->msgBuf)); +#else ForceZero(key, sizeof(aes->key)); +#endif /* set up CMSG headers */ XMEMSET((byte*)&(aes->msg), 0, sizeof(struct msghdr)); @@ -669,7 +681,7 @@ XMEMSET(initalCounter, 0, AES_BLOCK_SIZE); XMEMCPY(initalCounter, iv, ivSz); initalCounter[AES_BLOCK_SIZE - 1] = 1; - GHASH(aes, authIn, authInSz, out, sz, authTag, authTagSz); + GHASH(&aes->gcm, authIn, authInSz, out, sz, authTag, authTagSz); ret = wc_AesEncryptDirect(aes, scratch, initalCounter); if (ret < 0) { return ret; @@ -822,7 +834,7 @@ XMEMCPY(initalCounter, iv, ivSz); initalCounter[AES_BLOCK_SIZE - 1] = 1; tag = buf; - GHASH(aes, NULL, 0, in, sz, tag, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, in, sz, tag, AES_BLOCK_SIZE); ret = wc_AesEncryptDirect(aes, scratch, initalCounter); if (ret < 0) return ret; @@ -874,7 +886,7 @@ /* check on tag */ if (authIn != NULL && authInSz > 0) { - GHASH(aes, authIn, authInSz, in, sz, tag, AES_BLOCK_SIZE); + GHASH(&aes->gcm, authIn, authInSz, in, sz, tag, AES_BLOCK_SIZE); ret = wc_AesEncryptDirect(aes, scratch, initalCounter); if (ret < 0) return ret; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/wc_afalg.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/wc_afalg.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/wc_afalg.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/af_alg/wc_afalg.c 2024-08-03 07:30:00.000000000 +0000 @@ -40,7 +40,7 @@ int nameSz = (int)XSTRLEN(name) + 1; /* +1 for null terminator */ if (typeSz > (int)sizeof(in->salg_type) || - nameSz > (int)sizeof(in->salg_name)) { + nameSz > (int)sizeof(in->salg_name)) { WOLFSSL_MSG("type or name was too large"); return; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-crypt.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-crypt.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-crypt.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-crypt.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,303 @@ +/* aria-crypt.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* + +DESCRIPTION +This library provides the interfaces to the ARIA cipher, an encryption algorithm +developed by the Korean Agency for Technology (KATS). It uses a 128-bit block +size and a key size of 128, 192, or 256 bits. + +*/ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef HAVE_ARIA + +#include +#include +#include +#include +#include + +/* return 0 on success or WC_INIT_E on failure */ +int wc_AriaInitCrypt(wc_Aria* aria, MC_ALGID algo) +{ + MC_RV rv = MC_OK; + + MC_APIMODE gApimode = MC_MODE_KCMV; + MC_ALGMODE algMode = MC_ALGMODE_GCM; + MC_PADTYPE algPad = MC_PADTYPE_NONE; + + if (aria == NULL) + return BAD_FUNC_ARG; + + if (rv == MC_OK) + rv = MC_Initialize(NULL); + + if (rv == MC_OK) + rv = wc_AriaFreeCrypt(aria); + + if (rv == MC_OK) + rv = MC_OpenSession(&(aria->hSession)); + + if (rv == MC_OK) + rv = MC_SetApiMode(aria->hSession, gApimode); + + if (rv == MC_OK) + rv = MC_SetOption(aria->hSession, algMode, algPad); + + if (rv == MC_OK) { + aria->algo = algo; + XMEMSET(aria->nonce,0,sizeof(aria->nonce)); + aria->nonceSz = 0; + } + + if (rv != MC_OK) { + if (aria->hSession != NULL) { + MC_CloseSession(aria->hSession); + aria->hSession = NULL; + } + WOLFSSL_MSG(MC_GetErrorString(rv)); + return WC_INIT_E; + } + return 0; +} + +/* return 0 on success or BAD_STATE_E on failure */ +int wc_AriaFreeCrypt(wc_Aria* aria) +{ + MC_RV rv = MC_OK; + + if (aria == NULL) + return 0; + + if (aria->hKey != NULL) { + if (rv == MC_OK) rv = MC_DestroyObject(aria->hSession, aria->hKey); + if (rv == MC_OK) aria->hKey = NULL; + } + if (aria->hSession != NULL) { + if (rv == MC_OK) rv = MC_CloseSession(aria->hSession); + if (rv == MC_OK) aria->hSession = NULL; + } + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_STATE_E; + } + return 0; +} + +/* return 0 on success or BAD_FUNC_ARG/PUBLIC_KEY_E on failure */ +int wc_AriaSetKey(wc_Aria* aria, byte* key) +{ + MC_RV rv = MC_OK; + MC_UINT keylen; + + if (aria == NULL || key == NULL) { + return BAD_FUNC_ARG; + } + + if (aria->algo == MC_ALGID_ARIA_128BITKEY) { + keylen = ARIA_128_KEY_SIZE; + } else if (aria->algo == MC_ALGID_ARIA_192BITKEY) { + keylen = ARIA_192_KEY_SIZE; + } else if (aria->algo == MC_ALGID_ARIA_256BITKEY) { + keylen = ARIA_256_KEY_SIZE; + } else { + WOLFSSL_MSG_EX("Unsupported algorithm: %d", aria->algo); + return PUBLIC_KEY_E; + } + + if (aria->hKey != NULL) { + if (rv == MC_OK) + rv = MC_DestroyObject(aria->hSession, aria->hKey); + if (rv == MC_OK) + aria->hKey = NULL; + } + if (rv == MC_OK) + rv = MC_CreateObject(aria->hSession, (MC_UCHAR*)key, keylen, &(aria->hKey)); + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_FUNC_ARG; + } + return 0; +} + +static WARN_UNUSED_RESULT WC_INLINE int CheckAriaGcmIvSize(int ivSz) { + return (ivSz == GCM_NONCE_MIN_SZ || + ivSz == GCM_NONCE_MID_SZ || + ivSz == GCM_NONCE_MAX_SZ); +} + +/* return 0 on success or BAD_FUNC_ARG on failure */ +int wc_AriaGcmSetExtIV(wc_Aria* aria, const byte* iv, word32 ivSz) +{ + int ret = 0; + + if (aria == NULL || iv == NULL || !CheckAriaGcmIvSize((int)ivSz)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + XMEMCPY((byte*)aria->nonce, iv, ivSz); + aria->nonceSz = ivSz; + } + + return ret; +} + +/* return 0 on success or BAD_FUNC_ARG on failure */ +int wc_AriaGcmSetIV(wc_Aria* aria, word32 ivSz, + const byte* ivFixed, word32 ivFixedSz, + WC_RNG* rng) +{ + int ret = 0; + + if (aria == NULL || rng == NULL || !CheckAriaGcmIvSize((int)ivSz) || + (ivFixed == NULL && ivFixedSz != 0) || + (ivFixed != NULL && ivFixedSz != AES_IV_FIXED_SZ)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + byte* iv = (byte*)aria->nonce; + + if (ivFixedSz) + XMEMCPY(iv, ivFixed, ivFixedSz); + + ret = wc_RNG_GenerateBlock(rng, iv + ivFixedSz, ivSz - ivFixedSz); + } + + if (ret == 0) { + aria->nonceSz = ivSz; + } + + return ret; +} + +/* 'out' buffer is expected to be 'inSz + authTagSz' + * return 0 on success or BAD_FUNC_ARG/ENCRYPT_ERROR on failure */ +int wc_AriaEncrypt(wc_Aria* aria, byte* out, byte* in, word32 inSz, + byte* iv, word32 ivSz, byte* aad, word32 aadSz, + byte* authTag, word32 authTagSz) +{ + MC_RV rv = MC_OK; + + MC_ALGPARAM param; + MC_UINT outSz = inSz + authTagSz; + MC_ALGORITHM mcAlg; + XMEMSET(¶m,0,sizeof(MC_ALGPARAM)); + param.pNonce = iv; + param.pAData = aad; + param.nNonce = ivSz; + param.nAData = aadSz; + param.nTLen = authTagSz; + param.nDataLen = inSz; + XMEMSET(&mcAlg,0,sizeof(MC_ALGORITHM)); + mcAlg.mcAlgId = aria->algo; + mcAlg.pParam = (MC_UCHAR*)¶m; + mcAlg.nParam = sizeof(param); + + if (authTag == NULL || iv == NULL || authTagSz > ARIA_BLOCK_SIZE || + authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ || + ivSz == 0 || ivSz > ARIA_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + if (out == NULL || in == NULL || inSz == 0) { + return BAD_FUNC_ARG; + } + if (out <= in + inSz && in <= out + inSz) { /* check for overlapping range */ + return BAD_FUNC_ARG; + } + + if (rv == MC_OK) + rv = MC_EncryptInit(aria->hSession, &mcAlg, aria->hKey); + + if (rv == MC_OK) + rv = MC_Encrypt(aria->hSession, in, inSz, out, &outSz); + + if (rv == MC_OK) + XMEMCPY(authTag, out + inSz, authTagSz); + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return ENCRYPT_ERROR; + } + return 0; +} + +/* 'in' buffer is expected to be 'inSz + authTagSz' + * return 0 on success or BAD_FUNC_ARG/ENCRYPT_ERROR on failure */ +int wc_AriaDecrypt(wc_Aria* aria, byte* out, byte* in, word32 inSz, + byte* iv, word32 ivSz, byte* aad, word32 aadSz, + byte* authTag, word32 authTagSz) +{ + MC_RV rv = MC_OK; + + MC_ALGPARAM param; + MC_UINT outSz = inSz; + MC_ALGORITHM mcAlg; + XMEMSET(¶m,0,sizeof(MC_ALGPARAM)); + param.pNonce = iv; + param.pAData = aad; + param.nNonce = ivSz; + param.nAData = aadSz; + param.nTLen = authTagSz; + param.nDataLen = inSz; + XMEMSET(&mcAlg,0,sizeof(MC_ALGORITHM)); + mcAlg.mcAlgId = aria->algo; + mcAlg.pParam = (MC_UCHAR*)¶m; + mcAlg.nParam = sizeof(param); + + if (authTag == NULL || iv == NULL || authTagSz > ARIA_BLOCK_SIZE || + authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ || + ivSz == 0 || ivSz > ARIA_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + if (out == NULL || in == NULL || inSz == 0) { + return BAD_FUNC_ARG; + } + if (out <= in + inSz && in <= out + inSz) { /* check for overlapping range */ + return BAD_FUNC_ARG; + } + + if (rv == MC_OK) + rv = MC_DecryptInit(aria->hSession, &mcAlg, aria->hKey); + + if (rv == MC_OK) { + XMEMCPY((byte*)in + inSz, authTag, authTagSz); + inSz += authTagSz; + } + if (rv == MC_OK) + rv = MC_Decrypt(aria->hSession, in, inSz, out, &outSz); + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return DECRYPT_ERROR; + } + return 0; +} +#endif /* HAVE_ARIA */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-cryptocb.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-cryptocb.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-cryptocb.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/aria/aria-cryptocb.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,603 @@ +/* aria-cryptocb.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* + +DESCRIPTION +This library provides the interfaces to the ARIA cipher, an encryption algorithm +developed by the Korean Agency for Technology (KATS). It uses a 128-bit block +size and a key size of 128, 192, or 256 bits. + +*/ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef HAVE_ARIA + +#include +#include +#include +#include +#include + +int wc_AriaInit(void) +{ + MC_RV rv = MC_OK; + static char isInit = 0; + + if (isInit == 0) { + if (rv == MC_OK) + rv = MC_Initialize(NULL); + if (rv == MC_OK) + isInit = 1; + + #ifdef WOLF_CRYPTO_CB + if (rv == MC_OK) { + rv = wc_CryptoDev_RegisterDevice(WOLFSSL_ARIA_DEVID, wc_AriaCryptoCb, NULL); + } + #endif + } + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return WC_INIT_E; + } + return 0; +} + +/* return 0 on success or WC_INIT_E on failure */ +int wc_AriaInitSha(MC_HSESSION* hSession, MC_ALGID algo) +{ + MC_RV rv = MC_OK; + + MC_APIMODE gApimode = MC_MODE_KCMV; + MC_ALGORITHM mcAlg = {algo, NULL, 0}; + + WOLFSSL_MSG_EX("AriaInitSha(0x%X)",algo); + + if (hSession == NULL) { + return BAD_FUNC_ARG; + } + + if (rv == MC_OK) + rv = wc_AriaInit(); + + if (rv == MC_OK) + rv = MC_OpenSession(hSession); + + if (rv == MC_OK) + rv = MC_SetApiMode(*hSession, gApimode); + + if (rv == MC_OK) + rv = MC_DigestInit(*hSession, &mcAlg); + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return WC_INIT_E; + } + return 0; +} + +/* return 0 on success or BAD_FUNC_ARG on failure */ +int wc_AriaShaUpdate(MC_HSESSION hSession, byte* data, word32 len) +{ + MC_RV rv = MC_OK; + WOLFSSL_ENTER("AriaShaUpdate"); + + if (data == NULL) { + return BAD_FUNC_ARG; + } + + if (rv == MC_OK) + rv = MC_DigestUpdate(hSession, data, len); + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_FUNC_ARG; + } + return 0; +} + +/* return 0 on success or BAD_FUNC_ARG on failure */ +int wc_AriaShaFinal(MC_HSESSION hSession, byte* out, word32* len) +{ + MC_RV rv = MC_OK; + WOLFSSL_ENTER("AriaShaFinal"); + + if (out == NULL || len == NULL) { + return BAD_FUNC_ARG; + } + + /* Do an extra DigestUpdate noop just in case it is never explicitly called. */ + if (rv == MC_OK) + rv = MC_DigestUpdate(hSession, NULL, 0); + + if (rv == MC_OK) + rv = MC_DigestFinal(hSession, out, len); + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_FUNC_ARG; + } + /* WOLFSSL_MSG_EX("Digest len: %d", *len); */ + return 0; +} + +/* return 0 on success or BAD_STATE_E on failure */ +int wc_AriaFree(MC_HSESSION* hSession, MC_HOBJECT *obj1) +{ + MC_RV rv = MC_OK; + WOLFSSL_ENTER("AriaFree"); + + if (hSession == NULL && obj1 != NULL) { + return BAD_FUNC_ARG; + } + + if (obj1 != NULL) { + if (rv == MC_OK) + rv = MC_DestroyObject(*hSession, *obj1); + if (rv == MC_OK) + *obj1 = NULL; + } + + if (hSession != NULL) { + if (rv == MC_OK) + rv = MC_CloseSession(*hSession); + if (rv == MC_OK) + *hSession = NULL; + } + + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_STATE_E; + } + return 0; +} + +int wc_AriaSign(byte* in, word32 inSz, byte* out, word32* outSz, ecc_key* key) +{ + MC_HOBJECT hPrikey = 0; + MC_HSESSION hSession = 0; + + const ecc_set_type* dp; + MC_RV rv = MC_OK; + + MC_APIMODE gApimode = MC_MODE_KCMV; + MC_ALGORITHM mcAlg = {MC_ALGID_NONE, NULL, 0}; + byte keyarr[ARIA_KEYASN1_MAXSZ]; + word32 keySz=(word32)sizeof(keyarr); + + WOLFSSL_ENTER("AriaSign"); + + if (in == NULL || out == NULL || outSz == NULL || key == NULL) { + return BAD_FUNC_ARG; + } + + if (rv == MC_OK) + rv = wc_AriaInit(); + + if (rv == MC_OK) + rv = MC_OpenSession(&hSession); + + if (rv == MC_OK) + rv = MC_SetApiMode(hSession, gApimode); + + if (rv == MC_OK) { + int ret = wc_EccPrivateKeyToDer(key, keyarr, keySz); + if (ret < 0) { rv = ret; } + else { keySz = ret; } + } + + WOLFSSL_MSG_EX("AriaSign key(%d):",keySz); + WOLFSSL_BUFFER(keyarr,keySz); + + WOLFSSL_MSG_EX("AriaSign rv=%d",rv); + + if (key->dp != NULL) { + dp = key->dp; + } + else { + dp = wc_ecc_get_curve_params(key->idx); + } + + if (dp->id == ECC_SECP256R1) { + mcAlg.mcAlgId = MC_ALGID_SHA256WithECDSA_P256_r1; + } else if (dp->id == ECC_SECP224R1) { + mcAlg.mcAlgId = MC_ALGID_SHA256WithECDSA_P224_12; + } else { + rv = MC_ERR_UNSUPPORTED_ALGORITHM; + } + + if (rv == MC_OK) + rv = MC_CreateObject(hSession, keyarr, keySz, &hPrikey); + WOLFSSL_MSG_EX("AriaSign CreateObject rv=%d",rv); + + if (rv == MC_OK) + rv = MC_SignInit(hSession, &mcAlg, hPrikey); + WOLFSSL_MSG_EX("AriaSign SignInit rv=%d",rv); + + if (rv == MC_OK) + rv = MC_Sign(hSession, in, inSz, out, outSz); + WOLFSSL_MSG_EX("AriaSign Sign rv=%d",rv); + + wc_AriaFree(&hSession, &hPrikey); + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_STATE_E; + } + return 0; +} + +int wc_AriaVerify(byte* sig, word32 sigSz, byte* hash, word32 hashSz, + int* res, ecc_key* key) +{ + MC_HOBJECT hPubkey = 0; + MC_HSESSION hSession = 0; + + const ecc_set_type* dp; + MC_RV rv = MC_OK; + + MC_APIMODE gApimode = MC_MODE_KCMV; + MC_ALGORITHM mcAlg = {MC_ALGID_NONE, NULL, 0}; + byte keyarr[ARIA_KEYASN1_MAXSZ]; + word32 keySz=sizeof(keyarr); + + WOLFSSL_ENTER("AriaVerify"); + + if (sig == NULL || hash == NULL || res == NULL || key == NULL) { + return BAD_FUNC_ARG; + } + + *res = 0; /* Default to invalid signature */ + + if (rv == MC_OK) + rv = wc_AriaInit(); + + if (rv == MC_OK) + rv = MC_OpenSession(&hSession); + + if (rv == MC_OK) + rv = MC_SetApiMode(hSession, gApimode); + + if (rv == MC_OK) { + int ret = wc_EccPublicKeyToDer(key, keyarr, keySz, 0); + if (ret < 0) { rv = ret; } + else { keySz = ret; } + } + + WOLFSSL_MSG_EX("AriaVerify key(%d):",keySz); + WOLFSSL_BUFFER(keyarr,keySz); + + WOLFSSL_MSG_EX("AriaVerify rv=%d",rv); + + if (key->dp != NULL) { + dp = key->dp; + } + else { + dp = wc_ecc_get_curve_params(key->idx); + } + + if (dp->id == ECC_SECP256R1) { + mcAlg.mcAlgId = MC_ALGID_SHA256WithECDSA_P256_r1; + } else if (dp->id == ECC_SECP224R1) { + mcAlg.mcAlgId = MC_ALGID_SHA256WithECDSA_P224_12; + } else { + rv = MC_ERR_UNSUPPORTED_ALGORITHM; + } + + if (rv == MC_OK) + rv = MC_CreateObject(hSession, keyarr, keySz, &hPubkey); + WOLFSSL_MSG_EX("AriaVerify CreateObject rv=%d",rv); + + if (rv == MC_OK) + rv = MC_VerifyInit(hSession, &mcAlg, hPubkey); + WOLFSSL_MSG_EX("AriaVerify VerifyInit rv=%d",rv); + + if (rv == MC_OK) + rv = MC_Verify(hSession, hash, hashSz, sig, sigSz); + WOLFSSL_MSG_EX("AriaVerify Verify rv=%d",rv); + + wc_AriaFree(&hSession, &hPubkey); + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_STATE_E; + } + *res = 1; /* Valid signature */ + return 0; +} + +int wc_AriaDerive(ecc_key* private_key, ecc_key* public_key, + byte* out, word32* outSz) +{ + MC_HOBJECT hPrikey = 0; + MC_HSESSION hSession = 0; + + const ecc_set_type* dp; + MC_RV rv = MC_OK; + + MC_APIMODE gApimode = MC_MODE_KCMV; + MC_ALGORITHM mcAlg = {MC_ALGID_NONE, NULL, 0}; + byte pubAsn1[ARIA_KEYASN1_MAXSZ]; + word32 pubAsn1Sz=sizeof(pubAsn1); + byte privAsn1[ARIA_KEYASN1_MAXSZ]; + word32 privAsn1Sz=sizeof(privAsn1); + + WOLFSSL_ENTER("AriaDerive"); + + if (private_key == NULL || public_key == NULL || + out == NULL || outSz == NULL) { + return BAD_FUNC_ARG; + } + + if (rv == MC_OK) + rv = wc_AriaInit(); + + if (rv == MC_OK) + rv = MC_OpenSession(&hSession); + + if (rv == MC_OK) + rv = MC_SetApiMode(hSession, gApimode); + + if (rv == MC_OK) { + int ret = wc_EccPublicKeyToDer(public_key,pubAsn1,pubAsn1Sz,0); + if (ret < 0) { + rv = ret; + } else { + pubAsn1Sz = ret; + } + WOLFSSL_MSG_EX("AriaDerive PublicKeyToDer ret=%d",ret); + } + WOLFSSL_MSG_EX("AriaVerify pubAsn1(%d):",pubAsn1Sz); + WOLFSSL_BUFFER(pubAsn1,pubAsn1Sz); + mcAlg.pParam=pubAsn1; + mcAlg.nParam=pubAsn1Sz; + + if (rv == MC_OK) { + int ret = wc_BuildEccKeyDer(private_key,privAsn1,&privAsn1Sz,0,0); + if (ret < 0) { + rv = ret; + } else { + privAsn1Sz = ret; + } + WOLFSSL_MSG_EX("AriaDerive PrivateKeyToDer ret=%d",ret); + } + WOLFSSL_MSG_EX("AriaVerify privAsn1(%d):",privAsn1Sz); + WOLFSSL_BUFFER(privAsn1,privAsn1Sz); + + if (private_key->dp != NULL) { + dp = private_key->dp; + } + else { + dp = wc_ecc_get_curve_params(private_key->idx); + } + + if (dp->id == ECC_SECP256R1) { + mcAlg.mcAlgId = MC_ALGID_ECDH_P256_r1; + } else if (dp->id == ECC_SECP224R1) { + mcAlg.mcAlgId = MC_ALGID_ECDH_P224_12; + } else { + rv = MC_ERR_UNSUPPORTED_ALGORITHM; + } + + if (rv == MC_OK) + rv = MC_CreateObject(hSession, privAsn1, privAsn1Sz, &hPrikey); + WOLFSSL_MSG_EX("AriaDerive CreateObject rv=%d",rv); + + if (rv == MC_OK) + rv = MC_DeriveKey(hSession, &mcAlg, hPrikey, out, outSz); + WOLFSSL_MSG_EX("AriaDerive DeriveKey rv=%d",rv); + + wc_AriaFree(&hSession, &hPrikey); + if (rv != MC_OK) { + WOLFSSL_MSG(MC_GetErrorString(rv)); + return BAD_STATE_E; + } + return 0; +} + +#ifdef WOLF_CRYPTO_CB + static void printOutput(const char* strName, unsigned char* data, + unsigned int dataSz) + { + #ifdef DEBUG_WOLFSSL + WOLFSSL_MSG_EX("%s (%d):", strName,dataSz); + WOLFSSL_BUFFER(data,dataSz); + #else + #if 0 + unsigned int i; + int line = 1; + + printf("%s:\n",strName); + printf(" "); + for(i=1; i<=dataSz; i++) + { + printf(",0x%02X", data[i-1]); + if(!(i%16) && i!= dataSz) printf("\n "); + else if(!(i%4)) printf(" "); + } + printf("\n"); + #else + (void)strName; + (void)data; + (void)dataSz; + #endif + #endif + } + + int wc_AriaCryptoCb(int devIdArg, wc_CryptoInfo* info, void* ctx) + { + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); /* return this to bypass HW and use SW */ + (void)ctx; + + if (info == NULL) + return BAD_FUNC_ARG; + + #ifdef DEBUG_CRYPTOCB + wc_CryptoCb_InfoString(info); + #endif + + if (info->algo_type == WC_ALGO_TYPE_PK) { + if (info->pk.type == WC_PK_TYPE_ECDSA_SIGN) { + /* set devId to invalid, so software is used */ + info->pk.eccsign.key->devId = INVALID_DEVID; + + printOutput((char *)"eccsign.in (before)", + (byte *)info->pk.eccsign.in,info->pk.eccsign.inlen); + printOutput((char *)"eccsign.out(before)", + (byte *)info->pk.eccsign.out,*(info->pk.eccsign.outlen)); + printOutput((char *)"eccsign.key(before)", + (byte *)info->pk.eccsign.key,sizeof(info->pk.eccsign.key)); + + byte buf[ARIA_KEYASN1_MAXSZ]; + word32 bufSz = sizeof(buf); + ret = wc_AriaSign((byte *)info->pk.eccsign.in,info->pk.eccsign.inlen, + buf,&bufSz, + info->pk.eccsign.key); + if (ret != 0) { + ret = CRYPTOCB_UNAVAILABLE; + } else { + memcpy(info->pk.eccsign.out, buf, bufSz); + *(info->pk.eccsign.outlen) = bufSz; + } + + printOutput((char *)"eccsign.in (after)", + (byte *)info->pk.eccsign.in,info->pk.eccsign.inlen); + printOutput((char *)"eccsign.out(after)", + (byte *)info->pk.eccsign.out,*(info->pk.eccsign.outlen)); + printOutput((char *)"eccsign.key(after)", + (byte *)info->pk.eccsign.key,sizeof(info->pk.eccsign.key)); + + /* reset devId */ + info->pk.eccsign.key->devId = devIdArg; + } + else if (info->pk.type == WC_PK_TYPE_ECDSA_VERIFY) { + /* set devId to invalid, so software is used */ + info->pk.eccverify.key->devId = INVALID_DEVID; + + printOutput((char *)"eccverify.sig (before)", + (byte *)info->pk.eccverify.sig,info->pk.eccverify.siglen); + printOutput((char *)"eccverify.hash(before)", + (byte *)info->pk.eccverify.hash,info->pk.eccverify.hashlen); + printOutput((char *)"eccverify.key (before)", + (byte *)info->pk.eccverify.key,sizeof(info->pk.eccverify.key)); + + ret = wc_AriaVerify((byte *)info->pk.eccverify.sig,info->pk.eccverify.siglen, + (byte *)info->pk.eccverify.hash, info->pk.eccverify.hashlen, + info->pk.eccverify.res, info->pk.eccverify.key); + + printOutput((char *)"eccverify.sig (after)", + (byte *)info->pk.eccverify.sig,info->pk.eccverify.siglen); + printOutput((char *)"eccverify.hash(after)", + (byte *)info->pk.eccverify.hash,info->pk.eccverify.hashlen); + printOutput((char *)"eccverify.key (after)", + (byte *)info->pk.eccverify.key,sizeof(info->pk.eccverify.key)); + + if (ret != 0) + ret = CRYPTOCB_UNAVAILABLE; + /* reset devId */ + info->pk.eccverify.key->devId = devIdArg; + } + else if (info->pk.type == WC_PK_TYPE_ECDH) { + /* set devId to invalid, so software is used */ + info->pk.ecdh.private_key->devId = INVALID_DEVID; + + ret = wc_AriaDerive( + info->pk.ecdh.private_key, info->pk.ecdh.public_key, + info->pk.ecdh.out, info->pk.ecdh.outlen); + + if (ret != 0) + ret = CRYPTOCB_UNAVAILABLE; + /* reset devId */ + info->pk.ecdh.private_key->devId = devIdArg; + } + } + else if (info->algo_type == WC_ALGO_TYPE_HASH) { + if (info->hash.type == WC_HASH_TYPE_SHA256) { + if (info->hash.sha256 == NULL) + return CRYPTOCB_UNAVAILABLE; + + /* set devId to invalid, so software is used */ + info->hash.sha256->devId = INVALID_DEVID; + + if (info->hash.sha256->hSession == NULL) { + ret = wc_AriaInitSha(&(info->hash.sha256->hSession), MC_ALGID_SHA256); + } + + if ((ret == 0) || + (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))) { + ret = wc_AriaShaUpdate(info->hash.sha256->hSession, + (byte *) info->hash.in, info->hash.inSz); + } + if ((ret == 0) || + (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))) { + MC_UINT digestSz = 32; + ret = wc_AriaShaFinal(info->hash.sha256->hSession, + info->hash.digest, &digestSz); + if ((ret == 0) || + (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))) + ret = wc_AriaFree(&(info->hash.sha256->hSession),NULL); + } + if (ret != 0) + ret = CRYPTOCB_UNAVAILABLE; + /* reset devId */ + info->hash.sha256->devId = devIdArg; + } + else if (info->hash.type == WC_HASH_TYPE_SHA384) { + if (info->hash.sha384 == NULL) + return CRYPTOCB_UNAVAILABLE; + + /* set devId to invalid, so software is used */ + info->hash.sha384->devId = INVALID_DEVID; + + if (info->hash.sha384->hSession == NULL) { + ret = wc_AriaInitSha(&(info->hash.sha384->hSession), MC_ALGID_SHA384); + } + + if ((ret == 0) || + (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))) { + ret = wc_AriaShaUpdate(info->hash.sha384->hSession, + (byte *) info->hash.in, info->hash.inSz); + } + if ((ret == 0) || + (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))) { + MC_UINT digestSz = 48; + ret = wc_AriaShaFinal(info->hash.sha384->hSession, + info->hash.digest, &digestSz); + if ((ret == 0) || + (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE))) + { + ret = wc_AriaFree(&(info->hash.sha384->hSession),NULL); + } + } + if (ret != 0) ret = CRYPTOCB_UNAVAILABLE; + /* reset devId */ + info->hash.sha384->devId = devIdArg; + } + } + + return ret; + } +#endif /* WOLF_CRYPTO_CB */ + +#endif /* HAVE_ARIA */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,12 +30,278 @@ #include #ifdef WOLFSSL_ARMASM -#ifndef __aarch64__ +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE +#ifndef NO_AES +#ifdef HAVE_AES_DECRYPT .text - .type L_AES_ARM32_te, %object - .size L_AES_ARM32_te, 1024 + .type L_AES_ARM32_td_data, %object + .size L_AES_ARM32_td_data, 1024 .align 4 -L_AES_ARM32_te: +L_AES_ARM32_td_data: + .word 0x5051f4a7 + .word 0x537e4165 + .word 0xc31a17a4 + .word 0x963a275e + .word 0xcb3bab6b + .word 0xf11f9d45 + .word 0xabacfa58 + .word 0x934be303 + .word 0x552030fa + .word 0xf6ad766d + .word 0x9188cc76 + .word 0x25f5024c + .word 0xfc4fe5d7 + .word 0xd7c52acb + .word 0x80263544 + .word 0x8fb562a3 + .word 0x49deb15a + .word 0x6725ba1b + .word 0x9845ea0e + .word 0xe15dfec0 + .word 0x2c32f75 + .word 0x12814cf0 + .word 0xa38d4697 + .word 0xc66bd3f9 + .word 0xe7038f5f + .word 0x9515929c + .word 0xebbf6d7a + .word 0xda955259 + .word 0x2dd4be83 + .word 0xd3587421 + .word 0x2949e069 + .word 0x448ec9c8 + .word 0x6a75c289 + .word 0x78f48e79 + .word 0x6b99583e + .word 0xdd27b971 + .word 0xb6bee14f + .word 0x17f088ad + .word 0x66c920ac + .word 0xb47dce3a + .word 0x1863df4a + .word 0x82e51a31 + .word 0x60975133 + .word 0x4562537f + .word 0xe0b16477 + .word 0x84bb6bae + .word 0x1cfe81a0 + .word 0x94f9082b + .word 0x58704868 + .word 0x198f45fd + .word 0x8794de6c + .word 0xb7527bf8 + .word 0x23ab73d3 + .word 0xe2724b02 + .word 0x57e31f8f + .word 0x2a6655ab + .word 0x7b2eb28 + .word 0x32fb5c2 + .word 0x9a86c57b + .word 0xa5d33708 + .word 0xf2302887 + .word 0xb223bfa5 + .word 0xba02036a + .word 0x5ced1682 + .word 0x2b8acf1c + .word 0x92a779b4 + .word 0xf0f307f2 + .word 0xa14e69e2 + .word 0xcd65daf4 + .word 0xd50605be + .word 0x1fd13462 + .word 0x8ac4a6fe + .word 0x9d342e53 + .word 0xa0a2f355 + .word 0x32058ae1 + .word 0x75a4f6eb + .word 0x390b83ec + .word 0xaa4060ef + .word 0x65e719f + .word 0x51bd6e10 + .word 0xf93e218a + .word 0x3d96dd06 + .word 0xaedd3e05 + .word 0x464de6bd + .word 0xb591548d + .word 0x571c45d + .word 0x6f0406d4 + .word 0xff605015 + .word 0x241998fb + .word 0x97d6bde9 + .word 0xcc894043 + .word 0x7767d99e + .word 0xbdb0e842 + .word 0x8807898b + .word 0x38e7195b + .word 0xdb79c8ee + .word 0x47a17c0a + .word 0xe97c420f + .word 0xc9f8841e + .word 0x0 + .word 0x83098086 + .word 0x48322bed + .word 0xac1e1170 + .word 0x4e6c5a72 + .word 0xfbfd0eff + .word 0x560f8538 + .word 0x1e3daed5 + .word 0x27362d39 + .word 0x640a0fd9 + .word 0x21685ca6 + .word 0xd19b5b54 + .word 0x3a24362e + .word 0xb10c0a67 + .word 0xf9357e7 + .word 0xd2b4ee96 + .word 0x9e1b9b91 + .word 0x4f80c0c5 + .word 0xa261dc20 + .word 0x695a774b + .word 0x161c121a + .word 0xae293ba + .word 0xe5c0a02a + .word 0x433c22e0 + .word 0x1d121b17 + .word 0xb0e090d + .word 0xadf28bc7 + .word 0xb92db6a8 + .word 0xc8141ea9 + .word 0x8557f119 + .word 0x4caf7507 + .word 0xbbee99dd + .word 0xfda37f60 + .word 0x9ff70126 + .word 0xbc5c72f5 + .word 0xc544663b + .word 0x345bfb7e + .word 0x768b4329 + .word 0xdccb23c6 + .word 0x68b6edfc + .word 0x63b8e4f1 + .word 0xcad731dc + .word 0x10426385 + .word 0x40139722 + .word 0x2084c611 + .word 0x7d854a24 + .word 0xf8d2bb3d + .word 0x11aef932 + .word 0x6dc729a1 + .word 0x4b1d9e2f + .word 0xf3dcb230 + .word 0xec0d8652 + .word 0xd077c1e3 + .word 0x6c2bb316 + .word 0x99a970b9 + .word 0xfa119448 + .word 0x2247e964 + .word 0xc4a8fc8c + .word 0x1aa0f03f + .word 0xd8567d2c + .word 0xef223390 + .word 0xc787494e + .word 0xc1d938d1 + .word 0xfe8ccaa2 + .word 0x3698d40b + .word 0xcfa6f581 + .word 0x28a57ade + .word 0x26dab78e + .word 0xa43fadbf + .word 0xe42c3a9d + .word 0xd507892 + .word 0x9b6a5fcc + .word 0x62547e46 + .word 0xc2f68d13 + .word 0xe890d8b8 + .word 0x5e2e39f7 + .word 0xf582c3af + .word 0xbe9f5d80 + .word 0x7c69d093 + .word 0xa96fd52d + .word 0xb3cf2512 + .word 0x3bc8ac99 + .word 0xa710187d + .word 0x6ee89c63 + .word 0x7bdb3bbb + .word 0x9cd2678 + .word 0xf46e5918 + .word 0x1ec9ab7 + .word 0xa8834f9a + .word 0x65e6956e + .word 0x7eaaffe6 + .word 0x821bccf + .word 0xe6ef15e8 + .word 0xd9bae79b + .word 0xce4a6f36 + .word 0xd4ea9f09 + .word 0xd629b07c + .word 0xaf31a4b2 + .word 0x312a3f23 + .word 0x30c6a594 + .word 0xc035a266 + .word 0x37744ebc + .word 0xa6fc82ca + .word 0xb0e090d0 + .word 0x1533a7d8 + .word 0x4af10498 + .word 0xf741ecda + .word 0xe7fcd50 + .word 0x2f1791f6 + .word 0x8d764dd6 + .word 0x4d43efb0 + .word 0x54ccaa4d + .word 0xdfe49604 + .word 0xe39ed1b5 + .word 0x1b4c6a88 + .word 0xb8c12c1f + .word 0x7f466551 + .word 0x49d5eea + .word 0x5d018c35 + .word 0x73fa8774 + .word 0x2efb0b41 + .word 0x5ab3671d + .word 0x5292dbd2 + .word 0x33e91056 + .word 0x136dd647 + .word 0x8c9ad761 + .word 0x7a37a10c + .word 0x8e59f814 + .word 0x89eb133c + .word 0xeecea927 + .word 0x35b761c9 + .word 0xede11ce5 + .word 0x3c7a47b1 + .word 0x599cd2df + .word 0x3f55f273 + .word 0x791814ce + .word 0xbf73c737 + .word 0xea53f7cd + .word 0x5b5ffdaa + .word 0x14df3d6f + .word 0x867844db + .word 0x81caaff3 + .word 0x3eb968c4 + .word 0x2c382434 + .word 0x5fc2a340 + .word 0x72161dc3 + .word 0xcbce225 + .word 0x8b283c49 + .word 0x41ff0d95 + .word 0x7139a801 + .word 0xde080cb3 + .word 0x9cd8b4e4 + .word 0x906456c1 + .word 0x617bcb84 + .word 0x70d532b6 + .word 0x74486c5c + .word 0x42d0b857 +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) + .text + .type L_AES_ARM32_te_data, %object + .size L_AES_ARM32_te_data, 1024 + .align 4 +L_AES_ARM32_te_data: .word 0xa5c66363 .word 0x84f87c7c .word 0x99ee7777 @@ -292,273 +558,231 @@ .word 0xfca85454 .word 0xd66dbbbb .word 0x3a2c1616 +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT .text .type L_AES_ARM32_td, %object - .size L_AES_ARM32_td, 1024 + .size L_AES_ARM32_td, 12 .align 4 L_AES_ARM32_td: - .word 0x5051f4a7 - .word 0x537e4165 - .word 0xc31a17a4 - .word 0x963a275e - .word 0xcb3bab6b - .word 0xf11f9d45 - .word 0xabacfa58 - .word 0x934be303 - .word 0x552030fa - .word 0xf6ad766d - .word 0x9188cc76 - .word 0x25f5024c - .word 0xfc4fe5d7 - .word 0xd7c52acb - .word 0x80263544 - .word 0x8fb562a3 - .word 0x49deb15a - .word 0x6725ba1b - .word 0x9845ea0e - .word 0xe15dfec0 - .word 0x2c32f75 - .word 0x12814cf0 - .word 0xa38d4697 - .word 0xc66bd3f9 - .word 0xe7038f5f - .word 0x9515929c - .word 0xebbf6d7a - .word 0xda955259 - .word 0x2dd4be83 - .word 0xd3587421 - .word 0x2949e069 - .word 0x448ec9c8 - .word 0x6a75c289 - .word 0x78f48e79 - .word 0x6b99583e - .word 0xdd27b971 - .word 0xb6bee14f - .word 0x17f088ad - .word 0x66c920ac - .word 0xb47dce3a - .word 0x1863df4a - .word 0x82e51a31 - .word 0x60975133 - .word 0x4562537f - .word 0xe0b16477 - .word 0x84bb6bae - .word 0x1cfe81a0 - .word 0x94f9082b - .word 0x58704868 - .word 0x198f45fd - .word 0x8794de6c - .word 0xb7527bf8 - .word 0x23ab73d3 - .word 0xe2724b02 - .word 0x57e31f8f - .word 0x2a6655ab - .word 0x7b2eb28 - .word 0x32fb5c2 - .word 0x9a86c57b - .word 0xa5d33708 - .word 0xf2302887 - .word 0xb223bfa5 - .word 0xba02036a - .word 0x5ced1682 - .word 0x2b8acf1c - .word 0x92a779b4 - .word 0xf0f307f2 - .word 0xa14e69e2 - .word 0xcd65daf4 - .word 0xd50605be - .word 0x1fd13462 - .word 0x8ac4a6fe - .word 0x9d342e53 - .word 0xa0a2f355 - .word 0x32058ae1 - .word 0x75a4f6eb - .word 0x390b83ec - .word 0xaa4060ef - .word 0x65e719f - .word 0x51bd6e10 - .word 0xf93e218a - .word 0x3d96dd06 - .word 0xaedd3e05 - .word 0x464de6bd - .word 0xb591548d - .word 0x571c45d - .word 0x6f0406d4 - .word 0xff605015 - .word 0x241998fb - .word 0x97d6bde9 - .word 0xcc894043 - .word 0x7767d99e - .word 0xbdb0e842 - .word 0x8807898b - .word 0x38e7195b - .word 0xdb79c8ee - .word 0x47a17c0a - .word 0xe97c420f - .word 0xc9f8841e - .word 0x0 - .word 0x83098086 - .word 0x48322bed - .word 0xac1e1170 - .word 0x4e6c5a72 - .word 0xfbfd0eff - .word 0x560f8538 - .word 0x1e3daed5 - .word 0x27362d39 - .word 0x640a0fd9 - .word 0x21685ca6 - .word 0xd19b5b54 - .word 0x3a24362e - .word 0xb10c0a67 - .word 0xf9357e7 - .word 0xd2b4ee96 - .word 0x9e1b9b91 - .word 0x4f80c0c5 - .word 0xa261dc20 - .word 0x695a774b - .word 0x161c121a - .word 0xae293ba - .word 0xe5c0a02a - .word 0x433c22e0 - .word 0x1d121b17 - .word 0xb0e090d - .word 0xadf28bc7 - .word 0xb92db6a8 - .word 0xc8141ea9 - .word 0x8557f119 - .word 0x4caf7507 - .word 0xbbee99dd - .word 0xfda37f60 - .word 0x9ff70126 - .word 0xbc5c72f5 - .word 0xc544663b - .word 0x345bfb7e - .word 0x768b4329 - .word 0xdccb23c6 - .word 0x68b6edfc - .word 0x63b8e4f1 - .word 0xcad731dc - .word 0x10426385 - .word 0x40139722 - .word 0x2084c611 - .word 0x7d854a24 - .word 0xf8d2bb3d - .word 0x11aef932 - .word 0x6dc729a1 - .word 0x4b1d9e2f - .word 0xf3dcb230 - .word 0xec0d8652 - .word 0xd077c1e3 - .word 0x6c2bb316 - .word 0x99a970b9 - .word 0xfa119448 - .word 0x2247e964 - .word 0xc4a8fc8c - .word 0x1aa0f03f - .word 0xd8567d2c - .word 0xef223390 - .word 0xc787494e - .word 0xc1d938d1 - .word 0xfe8ccaa2 - .word 0x3698d40b - .word 0xcfa6f581 - .word 0x28a57ade - .word 0x26dab78e - .word 0xa43fadbf - .word 0xe42c3a9d - .word 0xd507892 - .word 0x9b6a5fcc - .word 0x62547e46 - .word 0xc2f68d13 - .word 0xe890d8b8 - .word 0x5e2e39f7 - .word 0xf582c3af - .word 0xbe9f5d80 - .word 0x7c69d093 - .word 0xa96fd52d - .word 0xb3cf2512 - .word 0x3bc8ac99 - .word 0xa710187d - .word 0x6ee89c63 - .word 0x7bdb3bbb - .word 0x9cd2678 - .word 0xf46e5918 - .word 0x1ec9ab7 - .word 0xa8834f9a - .word 0x65e6956e - .word 0x7eaaffe6 - .word 0x821bccf - .word 0xe6ef15e8 - .word 0xd9bae79b - .word 0xce4a6f36 - .word 0xd4ea9f09 - .word 0xd629b07c - .word 0xaf31a4b2 - .word 0x312a3f23 - .word 0x30c6a594 - .word 0xc035a266 - .word 0x37744ebc - .word 0xa6fc82ca - .word 0xb0e090d0 - .word 0x1533a7d8 - .word 0x4af10498 - .word 0xf741ecda - .word 0xe7fcd50 - .word 0x2f1791f6 - .word 0x8d764dd6 - .word 0x4d43efb0 - .word 0x54ccaa4d - .word 0xdfe49604 - .word 0xe39ed1b5 - .word 0x1b4c6a88 - .word 0xb8c12c1f - .word 0x7f466551 - .word 0x49d5eea - .word 0x5d018c35 - .word 0x73fa8774 - .word 0x2efb0b41 - .word 0x5ab3671d - .word 0x5292dbd2 - .word 0x33e91056 - .word 0x136dd647 - .word 0x8c9ad761 - .word 0x7a37a10c - .word 0x8e59f814 - .word 0x89eb133c - .word 0xeecea927 - .word 0x35b761c9 - .word 0xede11ce5 - .word 0x3c7a47b1 - .word 0x599cd2df - .word 0x3f55f273 - .word 0x791814ce - .word 0xbf73c737 - .word 0xea53f7cd - .word 0x5b5ffdaa - .word 0x14df3d6f - .word 0x867844db - .word 0x81caaff3 - .word 0x3eb968c4 - .word 0x2c382434 - .word 0x5fc2a340 - .word 0x72161dc3 - .word 0xcbce225 - .word 0x8b283c49 - .word 0x41ff0d95 - .word 0x7139a801 - .word 0xde080cb3 - .word 0x9cd8b4e4 - .word 0x906456c1 - .word 0x617bcb84 - .word 0x70d532b6 - .word 0x74486c5c - .word 0x42d0b857 -#ifndef NO_AES + .word L_AES_ARM32_td_data +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) + .text + .type L_AES_ARM32_te, %object + .size L_AES_ARM32_te, 12 + .align 4 +L_AES_ARM32_te: + .word L_AES_ARM32_te_data +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT + .text + .align 4 + .globl AES_invert_key + .type AES_invert_key, %function +AES_invert_key: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + adr r12, L_AES_ARM32_te + ldr r12, [r12] + adr lr, L_AES_ARM32_td + ldr lr, [lr] + add r10, r0, r1, lsl #4 + mov r11, r1 +L_AES_invert_key_loop: + ldm r0, {r2, r3, r4, r5} + ldm r10, {r6, r7, r8, r9} + stm r10, {r2, r3, r4, r5} + stm r0!, {r6, r7, r8, r9} + subs r11, r11, #2 + sub r10, r10, #16 + bne L_AES_invert_key_loop + sub r0, r0, r1, lsl #3 + add r0, r0, #16 + sub r11, r1, #1 +L_AES_invert_key_mix_loop: + ldm r0, {r2, r3, r4, r5} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r2, #24 + lsr r6, r6, #24 +#else + uxtb r6, r2 +#endif +#else + ubfx r6, r2, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r2, #16 + lsr r7, r7, #24 +#else + uxtb r7, r2, ror #8 +#endif +#else + ubfx r7, r2, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r2, #8 + lsr r8, r8, #24 +#else + uxtb r8, r2, ror #16 +#endif +#else + ubfx r8, r2, #16, #8 +#endif + lsr r9, r2, #24 + ldrb r6, [r12, r6, lsl #2] + ldrb r7, [r12, r7, lsl #2] + ldrb r8, [r12, r8, lsl #2] + ldrb r9, [r12, r9, lsl #2] + ldr r6, [lr, r6, lsl #2] + ldr r7, [lr, r7, lsl #2] + ldr r8, [lr, r8, lsl #2] + ldr r9, [lr, r9, lsl #2] + eor r8, r8, r6, ror #16 + eor r8, r8, r7, ror #8 + eor r8, r8, r9, ror #24 + str r8, [r0], #4 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r3, #24 + lsr r6, r6, #24 +#else + uxtb r6, r3 +#endif +#else + ubfx r6, r3, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r3, #16 + lsr r7, r7, #24 +#else + uxtb r7, r3, ror #8 +#endif +#else + ubfx r7, r3, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r3, #8 + lsr r8, r8, #24 +#else + uxtb r8, r3, ror #16 +#endif +#else + ubfx r8, r3, #16, #8 +#endif + lsr r9, r3, #24 + ldrb r6, [r12, r6, lsl #2] + ldrb r7, [r12, r7, lsl #2] + ldrb r8, [r12, r8, lsl #2] + ldrb r9, [r12, r9, lsl #2] + ldr r6, [lr, r6, lsl #2] + ldr r7, [lr, r7, lsl #2] + ldr r8, [lr, r8, lsl #2] + ldr r9, [lr, r9, lsl #2] + eor r8, r8, r6, ror #16 + eor r8, r8, r7, ror #8 + eor r8, r8, r9, ror #24 + str r8, [r0], #4 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r4, #24 + lsr r6, r6, #24 +#else + uxtb r6, r4 +#endif +#else + ubfx r6, r4, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r4, #16 + lsr r7, r7, #24 +#else + uxtb r7, r4, ror #8 +#endif +#else + ubfx r7, r4, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r4, #8 + lsr r8, r8, #24 +#else + uxtb r8, r4, ror #16 +#endif +#else + ubfx r8, r4, #16, #8 +#endif + lsr r9, r4, #24 + ldrb r6, [r12, r6, lsl #2] + ldrb r7, [r12, r7, lsl #2] + ldrb r8, [r12, r8, lsl #2] + ldrb r9, [r12, r9, lsl #2] + ldr r6, [lr, r6, lsl #2] + ldr r7, [lr, r7, lsl #2] + ldr r8, [lr, r8, lsl #2] + ldr r9, [lr, r9, lsl #2] + eor r8, r8, r6, ror #16 + eor r8, r8, r7, ror #8 + eor r8, r8, r9, ror #24 + str r8, [r0], #4 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r5, #24 + lsr r6, r6, #24 +#else + uxtb r6, r5 +#endif +#else + ubfx r6, r5, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r5, #16 + lsr r7, r7, #24 +#else + uxtb r7, r5, ror #8 +#endif +#else + ubfx r7, r5, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r5, #8 + lsr r8, r8, #24 +#else + uxtb r8, r5, ror #16 +#endif +#else + ubfx r8, r5, #16, #8 +#endif + lsr r9, r5, #24 + ldrb r6, [r12, r6, lsl #2] + ldrb r7, [r12, r7, lsl #2] + ldrb r8, [r12, r8, lsl #2] + ldrb r9, [r12, r9, lsl #2] + ldr r6, [lr, r6, lsl #2] + ldr r7, [lr, r7, lsl #2] + ldr r8, [lr, r8, lsl #2] + ldr r9, [lr, r9, lsl #2] + eor r8, r8, r6, ror #16 + eor r8, r8, r7, ror #8 + eor r8, r8, r9, ror #24 + str r8, [r0], #4 + subs r11, r11, #1 + bne L_AES_invert_key_mix_loop + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size AES_invert_key,.-AES_invert_key +#endif /* HAVE_AES_DECRYPT */ .text - .type L_AES_SEK_ARM32_rcon, %object - .size L_AES_SEK_ARM32_rcon, 40 + .type L_AES_ARM32_rcon, %object + .size L_AES_ARM32_rcon, 40 .align 4 -L_AES_SEK_ARM32_rcon: +L_AES_ARM32_rcon: .word 0x1000000 .word 0x2000000 .word 0x4000000 @@ -575,62 +799,132 @@ .type AES_set_encrypt_key, %function AES_set_encrypt_key: push {r4, r5, r6, r7, r8, lr} - adr r4, AES_set_encrypt_key - mov r8, #AES_set_encrypt_key-L_AES_ARM32_te - sub r8, r4, r8 - adr lr, L_AES_SEK_ARM32_rcon + adr r8, L_AES_ARM32_te + ldr r8, [r8] + adr lr, L_AES_ARM32_rcon cmp r1, #0x80 beq L_AES_set_encrypt_key_start_128 cmp r1, #0xc0 beq L_AES_set_encrypt_key_start_192 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + # REV r4, r4 + eor r3, r4, r4, ror #16 + bic r3, r3, #0xff0000 + ror r4, r4, #8 + eor r4, r4, r3, lsr #8 + # REV r5, r5 + eor r3, r5, r5, ror #16 + bic r3, r3, #0xff0000 + ror r5, r5, #8 + eor r5, r5, r3, lsr #8 + # REV r6, r6 + eor r3, r6, r6, ror #16 + bic r3, r3, #0xff0000 + ror r6, r6, #8 + eor r6, r6, r3, lsr #8 + # REV r7, r7 + eor r3, r7, r7, ror #16 + bic r3, r3, #0xff0000 + ror r7, r7, #8 + eor r7, r7, r3, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ stm r2!, {r4, r5, r6, r7} -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + # REV r4, r4 + eor r3, r4, r4, ror #16 + bic r3, r3, #0xff0000 + ror r4, r4, #8 + eor r4, r4, r3, lsr #8 + # REV r5, r5 + eor r3, r5, r5, ror #16 + bic r3, r3, #0xff0000 + ror r5, r5, #8 + eor r5, r5, r3, lsr #8 + # REV r6, r6 + eor r3, r6, r6, ror #16 + bic r3, r3, #0xff0000 + ror r6, r6, #8 + eor r6, r6, r3, lsr #8 + # REV r7, r7 + eor r3, r7, r7, ror #16 + bic r3, r3, #0xff0000 + ror r7, r7, #8 + eor r7, r7, r3, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ stm r2, {r4, r5, r6, r7} sub r2, r2, #16 mov r12, #6 L_AES_set_encrypt_key_loop_256: - mov r3, r7 - mov r7, #0xff - and r5, r7, r3, lsr #8 - and r4, r7, r3 - and r6, r7, r3, lsr #16 - lsr r3, r3, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r7, #24 + lsr r4, r4, #24 +#else + uxtb r4, r7 +#endif +#else + ubfx r4, r7, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r7, #16 + lsr r5, r5, #24 +#else + uxtb r5, r7, ror #8 +#endif +#else + ubfx r5, r7, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r7, #8 + lsr r6, r6, #24 +#else + uxtb r6, r7, ror #16 +#endif +#else + ubfx r6, r7, #16, #8 +#endif + lsr r7, r7, #24 ldrb r4, [r8, r4, lsl #2] - ldrb r6, [r8, r6, lsl #2] ldrb r5, [r8, r5, lsl #2] - ldrb r3, [r8, r3, lsl #2] - eor r3, r3, r4, lsl #8 + ldrb r6, [r8, r6, lsl #2] + ldrb r7, [r8, r7, lsl #2] + eor r3, r7, r4, lsl #8 eor r3, r3, r5, lsl #16 eor r3, r3, r6, lsl #24 ldm r2!, {r4, r5, r6, r7} @@ -644,11 +938,37 @@ stm r2, {r4, r5, r6, r7} sub r2, r2, #16 mov r3, r7 - mov r7, #0xff - and r4, r7, r3, lsr #8 - and r5, r7, r3, lsr #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r3, #16 + lsr r4, r4, #24 +#else + uxtb r4, r3, ror #8 +#endif +#else + ubfx r4, r3, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r3, #8 + lsr r5, r5, #24 +#else + uxtb r5, r3, ror #16 +#endif +#else + ubfx r5, r3, #16, #8 +#endif lsr r6, r3, #24 - and r3, r7, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r3, r3, #24 + lsr r3, r3, #24 +#else + uxtb r3, r3 +#endif +#else + ubfx r3, r3, #0, #8 +#endif ldrb r4, [r8, r4, lsl #2] ldrb r6, [r8, r6, lsl #2] ldrb r5, [r8, r5, lsl #2] @@ -666,17 +986,42 @@ sub r2, r2, #16 subs r12, r12, #1 bne L_AES_set_encrypt_key_loop_256 - mov r3, r7 - mov r7, #0xff - and r5, r7, r3, lsr #8 - and r4, r7, r3 - and r6, r7, r3, lsr #16 - lsr r3, r3, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r7, #24 + lsr r4, r4, #24 +#else + uxtb r4, r7 +#endif +#else + ubfx r4, r7, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r7, #16 + lsr r5, r5, #24 +#else + uxtb r5, r7, ror #8 +#endif +#else + ubfx r5, r7, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r7, #8 + lsr r6, r6, #24 +#else + uxtb r6, r7, ror #16 +#endif +#else + ubfx r6, r7, #16, #8 +#endif + lsr r7, r7, #24 ldrb r4, [r8, r4, lsl #2] - ldrb r6, [r8, r6, lsl #2] ldrb r5, [r8, r5, lsl #2] - ldrb r3, [r8, r3, lsl #2] - eor r3, r3, r4, lsl #8 + ldrb r6, [r8, r6, lsl #2] + ldrb r7, [r8, r7, lsl #2] + eor r3, r7, r4, lsl #8 eor r3, r3, r5, lsl #16 eor r3, r3, r6, lsl #24 ldm r2!, {r4, r5, r6, r7} @@ -691,32 +1036,65 @@ sub r2, r2, #16 b L_AES_set_encrypt_key_end L_AES_set_encrypt_key_start_192: -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r1, [r0, #20] ldr r0, [r0, #16] #else ldrd r0, r1, [r0, #16] #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + # REV r4, r4 + eor r3, r4, r4, ror #16 + bic r3, r3, #0xff0000 + ror r4, r4, #8 + eor r4, r4, r3, lsr #8 + # REV r5, r5 + eor r3, r5, r5, ror #16 + bic r3, r3, #0xff0000 + ror r5, r5, #8 + eor r5, r5, r3, lsr #8 + # REV r6, r6 + eor r3, r6, r6, ror #16 + bic r3, r3, #0xff0000 + ror r6, r6, #8 + eor r6, r6, r3, lsr #8 + # REV r7, r7 + eor r3, r7, r7, ror #16 + bic r3, r3, #0xff0000 + ror r7, r7, #8 + eor r7, r7, r3, lsr #8 + # REV r0, r0 + eor r3, r0, r0, ror #16 + bic r3, r3, #0xff0000 + ror r0, r0, #8 + eor r0, r0, r3, lsr #8 + # REV r1, r1 + eor r3, r1, r1, ror #16 + bic r3, r3, #0xff0000 + ror r1, r1, #8 + eor r1, r1, r3, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 rev r0, r0 rev r1, r1 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ stm r2, {r4, r5, r6, r7} -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r0, [r2, #16] str r1, [r2, #20] #else @@ -725,17 +1103,42 @@ mov r7, r1 mov r12, #7 L_AES_set_encrypt_key_loop_192: - mov r3, r7 - mov r5, #0xff - and r1, r5, r3, lsr #8 - and r0, r5, r3 - and r4, r5, r3, lsr #16 - lsr r3, r3, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r0, r7, #24 + lsr r0, r0, #24 +#else + uxtb r0, r7 +#endif +#else + ubfx r0, r7, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r1, r7, #16 + lsr r1, r1, #24 +#else + uxtb r1, r7, ror #8 +#endif +#else + ubfx r1, r7, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r7, #8 + lsr r4, r4, #24 +#else + uxtb r4, r7, ror #16 +#endif +#else + ubfx r4, r7, #16, #8 +#endif + lsr r7, r7, #24 ldrb r0, [r8, r0, lsl #2] - ldrb r4, [r8, r4, lsl #2] ldrb r1, [r8, r1, lsl #2] - ldrb r3, [r8, r3, lsl #2] - eor r3, r3, r0, lsl #8 + ldrb r4, [r8, r4, lsl #2] + ldrb r7, [r8, r7, lsl #2] + eor r3, r7, r0, lsl #8 eor r3, r3, r1, lsl #16 eor r3, r3, r4, lsl #24 ldm r2!, {r0, r1, r4, r5, r6, r7} @@ -750,17 +1153,42 @@ stm r2, {r0, r1, r4, r5, r6, r7} subs r12, r12, #1 bne L_AES_set_encrypt_key_loop_192 - mov r3, r7 - mov r5, #0xff - and r1, r5, r3, lsr #8 - and r0, r5, r3 - and r4, r5, r3, lsr #16 - lsr r3, r3, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r0, r7, #24 + lsr r0, r0, #24 +#else + uxtb r0, r7 +#endif +#else + ubfx r0, r7, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r1, r7, #16 + lsr r1, r1, #24 +#else + uxtb r1, r7, ror #8 +#endif +#else + ubfx r1, r7, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r7, #8 + lsr r4, r4, #24 +#else + uxtb r4, r7, ror #16 +#endif +#else + ubfx r4, r7, #16, #8 +#endif + lsr r7, r7, #24 ldrb r0, [r8, r0, lsl #2] - ldrb r4, [r8, r4, lsl #2] ldrb r1, [r8, r1, lsl #2] - ldrb r3, [r8, r3, lsl #2] - eor r3, r3, r0, lsl #8 + ldrb r4, [r8, r4, lsl #2] + ldrb r7, [r8, r7, lsl #2] + eor r3, r7, r0, lsl #8 eor r3, r3, r1, lsl #16 eor r3, r3, r4, lsl #24 ldm r2!, {r0, r1, r4, r5, r6, r7} @@ -773,36 +1201,84 @@ stm r2, {r0, r1, r4, r5} b L_AES_set_encrypt_key_end L_AES_set_encrypt_key_start_128: -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + # REV r4, r4 + eor r3, r4, r4, ror #16 + bic r3, r3, #0xff0000 + ror r4, r4, #8 + eor r4, r4, r3, lsr #8 + # REV r5, r5 + eor r3, r5, r5, ror #16 + bic r3, r3, #0xff0000 + ror r5, r5, #8 + eor r5, r5, r3, lsr #8 + # REV r6, r6 + eor r3, r6, r6, ror #16 + bic r3, r3, #0xff0000 + ror r6, r6, #8 + eor r6, r6, r3, lsr #8 + # REV r7, r7 + eor r3, r7, r7, ror #16 + bic r3, r3, #0xff0000 + ror r7, r7, #8 + eor r7, r7, r3, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ stm r2, {r4, r5, r6, r7} mov r12, #10 L_AES_set_encrypt_key_loop_128: - mov r3, r7 - mov r7, #0xff - and r5, r7, r3, lsr #8 - and r4, r7, r3 - and r6, r7, r3, lsr #16 - lsr r3, r3, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r7, #24 + lsr r4, r4, #24 +#else + uxtb r4, r7 +#endif +#else + ubfx r4, r7, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r7, #16 + lsr r5, r5, #24 +#else + uxtb r5, r7, ror #8 +#endif +#else + ubfx r5, r7, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r7, #8 + lsr r6, r6, #24 +#else + uxtb r6, r7, ror #16 +#endif +#else + ubfx r6, r7, #16, #8 +#endif + lsr r7, r7, #24 ldrb r4, [r8, r4, lsl #2] - ldrb r6, [r8, r6, lsl #2] ldrb r5, [r8, r5, lsl #2] - ldrb r3, [r8, r3, lsl #2] - eor r3, r3, r4, lsl #8 + ldrb r6, [r8, r6, lsl #2] + ldrb r7, [r8, r7, lsl #2] + eor r3, r7, r4, lsl #8 eor r3, r3, r5, lsl #16 eor r3, r3, r6, lsl #24 ldm r2!, {r4, r5, r6, r7} @@ -818,756 +1294,2056 @@ L_AES_set_encrypt_key_end: pop {r4, r5, r6, r7, r8, pc} .size AES_set_encrypt_key,.-AES_set_encrypt_key -#ifdef HAVE_AES_DECRYPT - .text - .align 4 - .globl AES_invert_key - .type AES_invert_key, %function -AES_invert_key: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - adr r4, AES_invert_key - mov r9, #AES_invert_key-L_AES_ARM32_te - mov r10, #AES_invert_key-L_AES_ARM32_td - sub r9, r4, r9 - sub r10, r4, r10 - add r8, r0, r1, lsl #4 - mov r11, r1 -L_AES_invert_key_loop: - ldm r0, {r2, r3, r12, lr} - ldm r8, {r4, r5, r6, r7} - stm r8, {r2, r3, r12, lr} - stm r0!, {r4, r5, r6, r7} - subs r11, r11, #2 - sub r8, r8, #16 - bne L_AES_invert_key_loop - sub r0, r0, r1, lsl #3 - add r0, r0, #16 - sub r11, r1, #1 - mov r1, #0xff -L_AES_invert_key_mix_loop: - ldm r0, {r2, r3, r12, lr} - lsr r4, r2, #24 - and r7, r1, r2 - and r8, r1, r2, lsr #16 - and r6, r1, r2, lsr #8 - ldrb r4, [r9, r4, lsl #2] - ldrb r7, [r9, r7, lsl #2] - ldrb r8, [r9, r8, lsl #2] - ldrb r6, [r9, r6, lsl #2] - ldr r4, [r10, r4, lsl #2] - ldr r7, [r10, r7, lsl #2] - ldr r8, [r10, r8, lsl #2] - ldr r6, [r10, r6, lsl #2] - eor r8, r8, r4, ror #24 - eor r8, r8, r7, ror #16 - eor r8, r8, r6, ror #8 - str r8, [r0], #4 - lsr r4, r3, #24 - and r7, r1, r3 - and r8, r1, r3, lsr #16 - and r6, r1, r3, lsr #8 - ldrb r4, [r9, r4, lsl #2] - ldrb r7, [r9, r7, lsl #2] - ldrb r8, [r9, r8, lsl #2] - ldrb r6, [r9, r6, lsl #2] - ldr r4, [r10, r4, lsl #2] - ldr r7, [r10, r7, lsl #2] - ldr r8, [r10, r8, lsl #2] - ldr r6, [r10, r6, lsl #2] - eor r8, r8, r4, ror #24 - eor r8, r8, r7, ror #16 - eor r8, r8, r6, ror #8 - str r8, [r0], #4 - lsr r4, r12, #24 - and r7, r1, r12 - and r8, r1, r12, lsr #16 - and r6, r1, r12, lsr #8 - ldrb r4, [r9, r4, lsl #2] - ldrb r7, [r9, r7, lsl #2] - ldrb r8, [r9, r8, lsl #2] - ldrb r6, [r9, r6, lsl #2] - ldr r4, [r10, r4, lsl #2] - ldr r7, [r10, r7, lsl #2] - ldr r8, [r10, r8, lsl #2] - ldr r6, [r10, r6, lsl #2] - eor r8, r8, r4, ror #24 - eor r8, r8, r7, ror #16 - eor r8, r8, r6, ror #8 - str r8, [r0], #4 - lsr r4, lr, #24 - and r7, r1, lr - and r8, r1, lr, lsr #16 - and r6, r1, lr, lsr #8 - ldrb r4, [r9, r4, lsl #2] - ldrb r7, [r9, r7, lsl #2] - ldrb r8, [r9, r8, lsl #2] - ldrb r6, [r9, r6, lsl #2] - ldr r4, [r10, r4, lsl #2] - ldr r7, [r10, r7, lsl #2] - ldr r8, [r10, r8, lsl #2] - ldr r6, [r10, r6, lsl #2] - eor r8, r8, r4, ror #24 - eor r8, r8, r7, ror #16 - eor r8, r8, r6, ror #8 - str r8, [r0], #4 - subs r11, r11, #1 - bne L_AES_invert_key_mix_loop - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size AES_invert_key,.-AES_invert_key -#endif /* HAVE_AES_DECRYPT */ -#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) .text .align 4 .globl AES_encrypt_block .type AES_encrypt_block, %function AES_encrypt_block: -L_AES_encrypt_block_14: - push {r2, lr} - ldr lr, [sp, #12] - mov r2, #6 - b L_AES_encrypt_block_nr -L_AES_encrypt_block_12: - push {r2, lr} - ldr lr, [sp, #12] - mov r2, #5 - b L_AES_encrypt_block_nr -L_AES_encrypt_block_10: - push {r2, lr} - ldr lr, [sp, #12] - mov r2, #4 + push {lr} L_AES_encrypt_block_nr: +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r5, #8 + lsr r8, r8, #24 +#else + uxtb r8, r5, ror #16 +#endif +#else + ubfx r8, r5, #16, #8 +#endif lsr r11, r4, #24 - and r1, r12, r7 - and r8, r12, r5, lsr #16 - and r0, r12, r6, lsr #8 - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - ldr r8, [lr, r8, lsl #2] - ldr r0, [lr, r0, lsl #2] - and r9, r12, r6, lsr #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r6, #16 + lsr lr, lr, #24 +#else + uxtb lr, r6, ror #8 +#endif +#else + ubfx lr, r6, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r7, #24 + lsr r2, r2, #24 +#else + uxtb r2, r7 +#endif +#else + ubfx r2, r7, #0, #8 +#endif + ldr r8, [r0, r8, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r9, r6, #8 + lsr r9, r9, #24 +#else + uxtb r9, r6, ror #16 +#endif +#else + ubfx r9, r6, #16, #8 +#endif eor r8, r8, r11, ror #24 lsr r11, r5, #24 - eor r8, r8, r0, ror #8 - and r0, r12, r7, lsr #8 - eor r8, r8, r1, ror #16 - and r1, r12, r4 - ldr r9, [lr, r9, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r10, r12, r7, lsr #16 + eor r8, r8, lr, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r7, #16 + lsr lr, lr, #24 +#else + uxtb lr, r7, ror #8 +#endif +#else + ubfx lr, r7, #8, #8 +#endif + eor r8, r8, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r4, #24 + lsr r2, r2, #24 +#else + uxtb r2, r4 +#endif +#else + ubfx r2, r4, #0, #8 +#endif + ldr r9, [r0, r9, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r10, r7, #8 + lsr r10, r10, #24 +#else + uxtb r10, r7, ror #16 +#endif +#else + ubfx r10, r7, #16, #8 +#endif eor r9, r9, r11, ror #24 lsr r11, r6, #24 - eor r9, r9, r0, ror #8 - and r0, r12, r4, lsr #8 - eor r9, r9, r1, ror #16 - and r1, r12, r5 - ldr r10, [lr, r10, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r6, r12, r6 + eor r9, r9, lr, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r4, #16 + lsr lr, lr, #24 +#else + uxtb lr, r4, ror #8 +#endif +#else + ubfx lr, r4, #8, #8 +#endif + eor r9, r9, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r5, #24 + lsr r2, r2, #24 +#else + uxtb r2, r5 +#endif +#else + ubfx r2, r5, #0, #8 +#endif + ldr r10, [r0, r10, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r6, #24 + lsr r6, r6, #24 +#else + uxtb r6, r6 +#endif +#else + ubfx r6, r6, #0, #8 +#endif eor r10, r10, r11, ror #24 - and r11, r12, r4, lsr #16 - eor r10, r10, r0, ror #8 - lsr r0, r7, #24 - eor r10, r10, r1, ror #16 - and r1, r12, r5, lsr #8 - ldr r6, [lr, r6, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - eor r0, r0, r6, ror #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r11, r4, #8 + lsr r11, r11, #24 +#else + uxtb r11, r4, ror #16 +#endif +#else + ubfx r11, r4, #16, #8 +#endif + eor r10, r10, lr, ror #8 + lsr lr, r7, #24 + eor r10, r10, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r5, #16 + lsr r2, r2, #24 +#else + uxtb r2, r5, ror #8 +#endif +#else + ubfx r2, r5, #8, #8 +#endif + ldr r6, [r0, r6, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r2, [r0, r2, lsl #2] + eor lr, lr, r6, ror #24 ldm r3!, {r4, r5, r6, r7} - eor r11, r11, r0, ror #24 - eor r11, r11, r1, ror #8 + eor r11, r11, lr, ror #24 + eor r11, r11, r2, ror #8 # XOR in Key Schedule eor r8, r8, r4 eor r9, r9, r5 eor r10, r10, r6 eor r11, r11, r7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r9, #8 + lsr r4, r4, #24 +#else + uxtb r4, r9, ror #16 +#endif +#else + ubfx r4, r9, #16, #8 +#endif lsr r7, r8, #24 - and r1, r12, r11 - and r4, r12, r9, lsr #16 - and r0, r12, r10, lsr #8 - ldr r7, [lr, r7, lsl #2] - ldr r1, [lr, r1, lsl #2] - ldr r4, [lr, r4, lsl #2] - ldr r0, [lr, r0, lsl #2] - and r5, r12, r10, lsr #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r10, #16 + lsr lr, lr, #24 +#else + uxtb lr, r10, ror #8 +#endif +#else + ubfx lr, r10, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r11, #24 + lsr r2, r2, #24 +#else + uxtb r2, r11 +#endif +#else + ubfx r2, r11, #0, #8 +#endif + ldr r4, [r0, r4, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r10, #8 + lsr r5, r5, #24 +#else + uxtb r5, r10, ror #16 +#endif +#else + ubfx r5, r10, #16, #8 +#endif eor r4, r4, r7, ror #24 lsr r7, r9, #24 - eor r4, r4, r0, ror #8 - and r0, r12, r11, lsr #8 - eor r4, r4, r1, ror #16 - and r1, r12, r8 - ldr r5, [lr, r5, lsl #2] - ldr r7, [lr, r7, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r6, r12, r11, lsr #16 + eor r4, r4, lr, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r11, #16 + lsr lr, lr, #24 +#else + uxtb lr, r11, ror #8 +#endif +#else + ubfx lr, r11, #8, #8 +#endif + eor r4, r4, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r8, #24 + lsr r2, r2, #24 +#else + uxtb r2, r8 +#endif +#else + ubfx r2, r8, #0, #8 +#endif + ldr r5, [r0, r5, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r11, #8 + lsr r6, r6, #24 +#else + uxtb r6, r11, ror #16 +#endif +#else + ubfx r6, r11, #16, #8 +#endif eor r5, r5, r7, ror #24 lsr r7, r10, #24 - eor r5, r5, r0, ror #8 - and r0, r12, r8, lsr #8 - eor r5, r5, r1, ror #16 - and r1, r12, r9 - ldr r6, [lr, r6, lsl #2] - ldr r7, [lr, r7, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r10, r12, r10 + eor r5, r5, lr, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r8, #16 + lsr lr, lr, #24 +#else + uxtb lr, r8, ror #8 +#endif +#else + ubfx lr, r8, #8, #8 +#endif + eor r5, r5, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r9, #24 + lsr r2, r2, #24 +#else + uxtb r2, r9 +#endif +#else + ubfx r2, r9, #0, #8 +#endif + ldr r6, [r0, r6, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r10, r10, #24 + lsr r10, r10, #24 +#else + uxtb r10, r10 +#endif +#else + ubfx r10, r10, #0, #8 +#endif eor r6, r6, r7, ror #24 - and r7, r12, r8, lsr #16 - eor r6, r6, r0, ror #8 - lsr r0, r11, #24 - eor r6, r6, r1, ror #16 - and r1, r12, r9, lsr #8 - ldr r10, [lr, r10, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r7, [lr, r7, lsl #2] - ldr r1, [lr, r1, lsl #2] - eor r0, r0, r10, ror #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r8, #8 + lsr r7, r7, #24 +#else + uxtb r7, r8, ror #16 +#endif +#else + ubfx r7, r8, #16, #8 +#endif + eor r6, r6, lr, ror #8 + lsr lr, r11, #24 + eor r6, r6, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r9, #16 + lsr r2, r2, #24 +#else + uxtb r2, r9, ror #8 +#endif +#else + ubfx r2, r9, #8, #8 +#endif + ldr r10, [r0, r10, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr r2, [r0, r2, lsl #2] + eor lr, lr, r10, ror #24 ldm r3!, {r8, r9, r10, r11} - eor r7, r7, r0, ror #24 - eor r7, r7, r1, ror #8 + eor r7, r7, lr, ror #24 + eor r7, r7, r2, ror #8 # XOR in Key Schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - subs r2, r2, #1 + subs r1, r1, #1 bne L_AES_encrypt_block_nr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r5, #8 + lsr r8, r8, #24 +#else + uxtb r8, r5, ror #16 +#endif +#else + ubfx r8, r5, #16, #8 +#endif lsr r11, r4, #24 - and r1, r12, r7 - and r8, r12, r5, lsr #16 - and r0, r12, r6, lsr #8 - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - ldr r8, [lr, r8, lsl #2] - ldr r0, [lr, r0, lsl #2] - and r9, r12, r6, lsr #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r6, #16 + lsr lr, lr, #24 +#else + uxtb lr, r6, ror #8 +#endif +#else + ubfx lr, r6, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r7, #24 + lsr r2, r2, #24 +#else + uxtb r2, r7 +#endif +#else + ubfx r2, r7, #0, #8 +#endif + ldr r8, [r0, r8, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r9, r6, #8 + lsr r9, r9, #24 +#else + uxtb r9, r6, ror #16 +#endif +#else + ubfx r9, r6, #16, #8 +#endif eor r8, r8, r11, ror #24 lsr r11, r5, #24 - eor r8, r8, r0, ror #8 - and r0, r12, r7, lsr #8 - eor r8, r8, r1, ror #16 - and r1, r12, r4 - ldr r9, [lr, r9, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r10, r12, r7, lsr #16 + eor r8, r8, lr, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r7, #16 + lsr lr, lr, #24 +#else + uxtb lr, r7, ror #8 +#endif +#else + ubfx lr, r7, #8, #8 +#endif + eor r8, r8, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r4, #24 + lsr r2, r2, #24 +#else + uxtb r2, r4 +#endif +#else + ubfx r2, r4, #0, #8 +#endif + ldr r9, [r0, r9, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r10, r7, #8 + lsr r10, r10, #24 +#else + uxtb r10, r7, ror #16 +#endif +#else + ubfx r10, r7, #16, #8 +#endif eor r9, r9, r11, ror #24 lsr r11, r6, #24 - eor r9, r9, r0, ror #8 - and r0, r12, r4, lsr #8 - eor r9, r9, r1, ror #16 - and r1, r12, r5 - ldr r10, [lr, r10, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r6, r12, r6 + eor r9, r9, lr, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r4, #16 + lsr lr, lr, #24 +#else + uxtb lr, r4, ror #8 +#endif +#else + ubfx lr, r4, #8, #8 +#endif + eor r9, r9, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r5, #24 + lsr r2, r2, #24 +#else + uxtb r2, r5 +#endif +#else + ubfx r2, r5, #0, #8 +#endif + ldr r10, [r0, r10, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r6, #24 + lsr r6, r6, #24 +#else + uxtb r6, r6 +#endif +#else + ubfx r6, r6, #0, #8 +#endif eor r10, r10, r11, ror #24 - and r11, r12, r4, lsr #16 - eor r10, r10, r0, ror #8 - lsr r0, r7, #24 - eor r10, r10, r1, ror #16 - and r1, r12, r5, lsr #8 - ldr r6, [lr, r6, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - eor r0, r0, r6, ror #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r11, r4, #8 + lsr r11, r11, #24 +#else + uxtb r11, r4, ror #16 +#endif +#else + ubfx r11, r4, #16, #8 +#endif + eor r10, r10, lr, ror #8 + lsr lr, r7, #24 + eor r10, r10, r2, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r5, #16 + lsr r2, r2, #24 +#else + uxtb r2, r5, ror #8 +#endif +#else + ubfx r2, r5, #8, #8 +#endif + ldr r6, [r0, r6, lsl #2] + ldr lr, [r0, lr, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r2, [r0, r2, lsl #2] + eor lr, lr, r6, ror #24 ldm r3!, {r4, r5, r6, r7} - eor r11, r11, r0, ror #24 - eor r11, r11, r1, ror #8 + eor r11, r11, lr, ror #24 + eor r11, r11, r2, ror #8 # XOR in Key Schedule eor r8, r8, r4 eor r9, r9, r5 eor r10, r10, r6 eor r11, r11, r7 - and r7, r12, r10, lsr #8 - lsr r1, r8, #24 - and r4, r12, r11 - and r0, r12, r9, lsr #16 - ldrb r7, [lr, r7, lsl #2] - ldrb r1, [lr, r1, lsl #2] - ldrb r4, [lr, r4, lsl #2] - ldrb r0, [lr, r0, lsl #2] - and r5, r12, r8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r11, #24 + lsr r4, r4, #24 +#else + uxtb r4, r11 +#endif +#else + ubfx r4, r11, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r10, #16 + lsr r7, r7, #24 +#else + uxtb r7, r10, ror #8 +#endif +#else + ubfx r7, r10, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r9, #8 + lsr lr, lr, #24 +#else + uxtb lr, r9, ror #16 +#endif +#else + ubfx lr, r9, #16, #8 +#endif + lsr r2, r8, #24 + ldrb r4, [r0, r4, lsl #2] + ldrb r7, [r0, r7, lsl #2] + ldrb lr, [r0, lr, lsl #2] + ldrb r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r8, #24 + lsr r5, r5, #24 +#else + uxtb r5, r8 +#endif +#else + ubfx r5, r8, #0, #8 +#endif eor r4, r4, r7, lsl #8 - and r7, r12, r11, lsr #8 - eor r4, r4, r0, lsl #16 - and r0, r12, r10, lsr #16 - eor r4, r4, r1, lsl #24 - lsr r1, r9, #24 - ldrb r7, [lr, r7, lsl #2] - ldrb r1, [lr, r1, lsl #2] - ldrb r5, [lr, r5, lsl #2] - ldrb r0, [lr, r0, lsl #2] - and r6, r12, r9 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r11, #16 + lsr r7, r7, #24 +#else + uxtb r7, r11, ror #8 +#endif +#else + ubfx r7, r11, #8, #8 +#endif + eor r4, r4, lr, lsl #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r10, #8 + lsr lr, lr, #24 +#else + uxtb lr, r10, ror #16 +#endif +#else + ubfx lr, r10, #16, #8 +#endif + eor r4, r4, r2, lsl #24 + lsr r2, r9, #24 + ldrb r5, [r0, r5, lsl #2] + ldrb r7, [r0, r7, lsl #2] + ldrb lr, [r0, lr, lsl #2] + ldrb r2, [r0, r2, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r9, #24 + lsr r6, r6, #24 +#else + uxtb r6, r9 +#endif +#else + ubfx r6, r9, #0, #8 +#endif eor r5, r5, r7, lsl #8 - and r7, r12, r8, lsr #8 - eor r5, r5, r0, lsl #16 - and r0, r12, r11, lsr #16 - eor r5, r5, r1, lsl #24 - lsr r1, r10, #24 - ldrb r7, [lr, r7, lsl #2] - ldrb r1, [lr, r1, lsl #2] - ldrb r6, [lr, r6, lsl #2] - ldrb r0, [lr, r0, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r8, #16 + lsr r7, r7, #24 +#else + uxtb r7, r8, ror #8 +#endif +#else + ubfx r7, r8, #8, #8 +#endif + eor r5, r5, lr, lsl #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r11, #8 + lsr lr, lr, #24 +#else + uxtb lr, r11, ror #16 +#endif +#else + ubfx lr, r11, #16, #8 +#endif + eor r5, r5, r2, lsl #24 + lsr r2, r10, #24 + ldrb r6, [r0, r6, lsl #2] + ldrb r7, [r0, r7, lsl #2] + ldrb lr, [r0, lr, lsl #2] + ldrb r2, [r0, r2, lsl #2] lsr r11, r11, #24 eor r6, r6, r7, lsl #8 - and r7, r12, r10 - eor r6, r6, r0, lsl #16 - and r0, r12, r9, lsr #8 - eor r6, r6, r1, lsl #24 - and r1, r12, r8, lsr #16 - ldrb r11, [lr, r11, lsl #2] - ldrb r0, [lr, r0, lsl #2] - ldrb r7, [lr, r7, lsl #2] - ldrb r1, [lr, r1, lsl #2] - eor r0, r0, r11, lsl #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r10, #24 + lsr r7, r7, #24 +#else + uxtb r7, r10 +#endif +#else + ubfx r7, r10, #0, #8 +#endif + eor r6, r6, lr, lsl #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r9, #16 + lsr lr, lr, #24 +#else + uxtb lr, r9, ror #8 +#endif +#else + ubfx lr, r9, #8, #8 +#endif + eor r6, r6, r2, lsl #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r8, #8 + lsr r2, r2, #24 +#else + uxtb r2, r8, ror #16 +#endif +#else + ubfx r2, r8, #16, #8 +#endif + ldrb r11, [r0, r11, lsl #2] + ldrb r7, [r0, r7, lsl #2] + ldrb lr, [r0, lr, lsl #2] + ldrb r2, [r0, r2, lsl #2] + eor lr, lr, r11, lsl #16 ldm r3, {r8, r9, r10, r11} - eor r7, r7, r0, lsl #8 - eor r7, r7, r1, lsl #16 + eor r7, r7, lr, lsl #8 + eor r7, r7, r2, lsl #16 # XOR in Key Schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - str lr, [sp, #12] - pop {r2, lr} - bx lr - bx lr + pop {pc} .size AES_encrypt_block,.-AES_encrypt_block #if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) .text + .type L_AES_ARM32_te_ecb, %object + .size L_AES_ARM32_te_ecb, 12 + .align 4 +L_AES_ARM32_te_ecb: + .word L_AES_ARM32_te_data + .text .align 4 .globl AES_ECB_encrypt .type AES_ECB_encrypt, %function AES_ECB_encrypt: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - adr r4, AES_ECB_encrypt - mov lr, #AES_ECB_encrypt-L_AES_ARM32_te - sub lr, r4, lr + mov lr, r0 + adr r0, L_AES_ARM32_te_ecb + ldr r0, [r0] ldr r12, [sp, #36] + push {r3} cmp r12, #10 beq L_AES_ECB_encrypt_start_block_128 cmp r12, #12 beq L_AES_ECB_encrypt_start_block_192 - mov r12, #0xff L_AES_ECB_encrypt_loop_block_256: - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - push {r0, r1} - push {r3, lr} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + push {r1, r2, lr} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_14 - pop {r3, lr} - pop {r0, r1} + mov r1, #6 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_ECB_encrypt_loop_block_256 b L_AES_ECB_encrypt_end L_AES_ECB_encrypt_start_block_192: - mov r12, #0xff L_AES_ECB_encrypt_loop_block_192: - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - push {r0, r1} - push {r3, lr} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + push {r1, r2, lr} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_12 - pop {r3, lr} - pop {r0, r1} + mov r1, #5 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_ECB_encrypt_loop_block_192 b L_AES_ECB_encrypt_end L_AES_ECB_encrypt_start_block_128: - mov r12, #0xff L_AES_ECB_encrypt_loop_block_128: - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - push {r0, r1} - push {r3, lr} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + push {r1, r2, lr} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_10 - pop {r3, lr} - pop {r0, r1} + mov r1, #4 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_ECB_encrypt_loop_block_128 L_AES_ECB_encrypt_end: + pop {r3} pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size AES_ECB_encrypt,.-AES_ECB_encrypt #endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ #ifdef HAVE_AES_CBC .text + .type L_AES_ARM32_te_cbc, %object + .size L_AES_ARM32_te_cbc, 12 + .align 4 +L_AES_ARM32_te_cbc: + .word L_AES_ARM32_te_data + .text .align 4 .globl AES_CBC_encrypt .type AES_CBC_encrypt, %function AES_CBC_encrypt: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - ldr r12, [sp, #36] - ldr lr, [sp, #40] - ldm lr, {r4, r5, r6, r7} - push {lr} - adr r8, AES_CBC_encrypt - mov lr, #AES_CBC_encrypt-L_AES_ARM32_te - sub lr, r8, lr - cmp r12, #10 + ldr r8, [sp, #36] + ldr r9, [sp, #40] + mov lr, r0 + adr r0, L_AES_ARM32_te_cbc + ldr r0, [r0] + ldm r9, {r4, r5, r6, r7} + push {r3, r9} + cmp r8, #10 beq L_AES_CBC_encrypt_start_block_128 - cmp r12, #12 + cmp r8, #12 beq L_AES_CBC_encrypt_start_block_192 - mov r12, #0xff L_AES_CBC_encrypt_loop_block_256: - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - push {r0, r1} - push {r3, lr} - ldm r3!, {r8, r9, r10, r11} + push {r1, r2, lr} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_14 - pop {r3, lr} - pop {r0, r1} + mov r1, #6 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CBC_encrypt_loop_block_256 b L_AES_CBC_encrypt_end L_AES_CBC_encrypt_start_block_192: - mov r12, #0xff L_AES_CBC_encrypt_loop_block_192: - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - push {r0, r1} - push {r3, lr} - ldm r3!, {r8, r9, r10, r11} + push {r1, r2, lr} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_12 - pop {r3, lr} - pop {r0, r1} + mov r1, #5 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CBC_encrypt_loop_block_192 b L_AES_CBC_encrypt_end L_AES_CBC_encrypt_start_block_128: - mov r12, #0xff L_AES_CBC_encrypt_loop_block_128: - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - push {r0, r1} - push {r3, lr} - ldm r3!, {r8, r9, r10, r11} + push {r1, r2, lr} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_10 - pop {r3, lr} - pop {r0, r1} + mov r1, #4 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CBC_encrypt_loop_block_128 L_AES_CBC_encrypt_end: - pop {lr} - stm lr, {r4, r5, r6, r7} + pop {r3, r9} + stm r9, {r4, r5, r6, r7} pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size AES_CBC_encrypt,.-AES_CBC_encrypt #endif /* HAVE_AES_CBC */ #ifdef WOLFSSL_AES_COUNTER .text + .type L_AES_ARM32_te_ctr, %object + .size L_AES_ARM32_te_ctr, 12 + .align 4 +L_AES_ARM32_te_ctr: + .word L_AES_ARM32_te_data + .text .align 4 .globl AES_CTR_encrypt .type AES_CTR_encrypt, %function AES_CTR_encrypt: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} ldr r12, [sp, #36] - ldr lr, [sp, #40] - ldm lr, {r4, r5, r6, r7} + ldr r8, [sp, #40] + mov lr, r0 + adr r0, L_AES_ARM32_te_ctr + ldr r0, [r0] + ldm r8, {r4, r5, r6, r7} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r10, r4, r4, ror #16 + eor r11, r5, r5, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + eor r4, r4, r10, lsr #8 + eor r5, r5, r11, lsr #8 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r6, r6, #8 + ror r7, r7, #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - stm lr, {r4, r5, r6, r7} - push {lr} - adr r8, AES_CTR_encrypt - mov lr, #AES_CTR_encrypt-L_AES_ARM32_te - sub lr, r8, lr +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + stm r8, {r4, r5, r6, r7} + push {r3, r8} cmp r12, #10 beq L_AES_CTR_encrypt_start_block_128 cmp r12, #12 beq L_AES_CTR_encrypt_start_block_192 - mov r12, #0xff L_AES_CTR_encrypt_loop_block_256: - push {r0, r1} - ldr r0, [sp, #8] + push {r1, r2, lr} + ldr lr, [sp, #16] adds r11, r7, #1 adcs r10, r6, #0 adcs r9, r5, #0 adc r8, r4, #0 - stm r0, {r8, r9, r10, r11} - push {r3, lr} + stm lr, {r8, r9, r10, r11} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_14 - pop {r3, lr} - pop {r0, r1} + mov r1, #6 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] - eor r4, r8 - eor r5, r9 - eor r6, r10 - eor r7, r11 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + ldr r8, [sp, #4] str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - ldr r8, [sp] ldm r8, {r4, r5, r6, r7} subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CTR_encrypt_loop_block_256 b L_AES_CTR_encrypt_end L_AES_CTR_encrypt_start_block_192: - mov r12, #0xff L_AES_CTR_encrypt_loop_block_192: - push {r0, r1} - ldr r0, [sp, #8] + push {r1, r2, lr} + ldr lr, [sp, #16] adds r11, r7, #1 adcs r10, r6, #0 adcs r9, r5, #0 adc r8, r4, #0 - stm r0, {r8, r9, r10, r11} - push {r3, lr} + stm lr, {r8, r9, r10, r11} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_12 - pop {r3, lr} - pop {r0, r1} + mov r1, #5 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] - eor r4, r8 - eor r5, r9 - eor r6, r10 - eor r7, r11 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + ldr r8, [sp, #4] str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - ldr r8, [sp] ldm r8, {r4, r5, r6, r7} subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CTR_encrypt_loop_block_192 b L_AES_CTR_encrypt_end L_AES_CTR_encrypt_start_block_128: - mov r12, #0xff L_AES_CTR_encrypt_loop_block_128: - push {r0, r1} - ldr r0, [sp, #8] + push {r1, r2, lr} + ldr lr, [sp, #16] adds r11, r7, #1 adcs r10, r6, #0 adcs r9, r5, #0 adc r8, r4, #0 - stm r0, {r8, r9, r10, r11} - push {r3, lr} + stm lr, {r8, r9, r10, r11} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_10 - pop {r3, lr} - pop {r0, r1} + mov r1, #4 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] - eor r4, r8 - eor r5, r9 - eor r6, r10 - eor r7, r11 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + ldr r8, [sp, #4] str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - ldr r8, [sp] ldm r8, {r4, r5, r6, r7} subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CTR_encrypt_loop_block_128 L_AES_CTR_encrypt_end: - pop {lr} + pop {r3, r8} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r10, r4, r4, ror #16 + eor r11, r5, r5, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + eor r4, r4, r10, lsr #8 + eor r5, r5, r11, lsr #8 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r6, r6, #8 + ror r7, r7, #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - stm lr, {r4, r5, r6, r7} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + stm r8, {r4, r5, r6, r7} pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size AES_CTR_encrypt,.-AES_CTR_encrypt #endif /* WOLFSSL_AES_COUNTER */ -#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ #ifdef HAVE_AES_DECRYPT #if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC) .text + .align 4 + .globl AES_decrypt_block + .type AES_decrypt_block, %function +AES_decrypt_block: + push {lr} +L_AES_decrypt_block_nr: +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r7, #8 + lsr r8, r8, #24 +#else + uxtb r8, r7, ror #16 +#endif +#else + ubfx r8, r7, #16, #8 +#endif + lsr r11, r4, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r6, #16 + lsr r12, r12, #24 +#else + uxtb r12, r6, ror #8 +#endif +#else + ubfx r12, r6, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r5, #24 + lsr lr, lr, #24 +#else + uxtb lr, r5 +#endif +#else + ubfx lr, r5, #0, #8 +#endif + ldr r8, [r0, r8, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r9, r4, #8 + lsr r9, r9, #24 +#else + uxtb r9, r4, ror #16 +#endif +#else + ubfx r9, r4, #16, #8 +#endif + eor r8, r8, r11, ror #24 + lsr r11, r5, #24 + eor r8, r8, r12, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r7, #16 + lsr r12, r12, #24 +#else + uxtb r12, r7, ror #8 +#endif +#else + ubfx r12, r7, #8, #8 +#endif + eor r8, r8, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r6, #24 + lsr lr, lr, #24 +#else + uxtb lr, r6 +#endif +#else + ubfx lr, r6, #0, #8 +#endif + ldr r9, [r0, r9, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r10, r5, #8 + lsr r10, r10, #24 +#else + uxtb r10, r5, ror #16 +#endif +#else + ubfx r10, r5, #16, #8 +#endif + eor r9, r9, r11, ror #24 + lsr r11, r6, #24 + eor r9, r9, r12, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r4, #16 + lsr r12, r12, #24 +#else + uxtb r12, r4, ror #8 +#endif +#else + ubfx r12, r4, #8, #8 +#endif + eor r9, r9, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r7, #24 + lsr lr, lr, #24 +#else + uxtb lr, r7 +#endif +#else + ubfx lr, r7, #0, #8 +#endif + ldr r10, [r0, r10, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r4, #24 + lsr r4, r4, #24 +#else + uxtb r4, r4 +#endif +#else + ubfx r4, r4, #0, #8 +#endif + eor r10, r10, r11, ror #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r11, r6, #8 + lsr r11, r11, #24 +#else + uxtb r11, r6, ror #16 +#endif +#else + ubfx r11, r6, #16, #8 +#endif + eor r10, r10, r12, ror #8 + lsr r12, r7, #24 + eor r10, r10, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r5, #16 + lsr lr, lr, #24 +#else + uxtb lr, r5, ror #8 +#endif +#else + ubfx lr, r5, #8, #8 +#endif + ldr r4, [r0, r4, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + eor r12, r12, r4, ror #24 + ldm r3!, {r4, r5, r6, r7} + eor r11, r11, lr, ror #8 + eor r11, r11, r12, ror #24 + # XOR in Key Schedule + eor r8, r8, r4 + eor r9, r9, r5 + eor r10, r10, r6 + eor r11, r11, r7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r11, #8 + lsr r4, r4, #24 +#else + uxtb r4, r11, ror #16 +#endif +#else + ubfx r4, r11, #16, #8 +#endif + lsr r7, r8, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r10, #16 + lsr r12, r12, #24 +#else + uxtb r12, r10, ror #8 +#endif +#else + ubfx r12, r10, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r9, #24 + lsr lr, lr, #24 +#else + uxtb lr, r9 +#endif +#else + ubfx lr, r9, #0, #8 +#endif + ldr r4, [r0, r4, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r8, #8 + lsr r5, r5, #24 +#else + uxtb r5, r8, ror #16 +#endif +#else + ubfx r5, r8, #16, #8 +#endif + eor r4, r4, r7, ror #24 + lsr r7, r9, #24 + eor r4, r4, r12, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r11, #16 + lsr r12, r12, #24 +#else + uxtb r12, r11, ror #8 +#endif +#else + ubfx r12, r11, #8, #8 +#endif + eor r4, r4, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r10, #24 + lsr lr, lr, #24 +#else + uxtb lr, r10 +#endif +#else + ubfx lr, r10, #0, #8 +#endif + ldr r5, [r0, r5, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r9, #8 + lsr r6, r6, #24 +#else + uxtb r6, r9, ror #16 +#endif +#else + ubfx r6, r9, #16, #8 +#endif + eor r5, r5, r7, ror #24 + lsr r7, r10, #24 + eor r5, r5, r12, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r8, #16 + lsr r12, r12, #24 +#else + uxtb r12, r8, ror #8 +#endif +#else + ubfx r12, r8, #8, #8 +#endif + eor r5, r5, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r11, #24 + lsr lr, lr, #24 +#else + uxtb lr, r11 +#endif +#else + ubfx lr, r11, #0, #8 +#endif + ldr r6, [r0, r6, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r8, #24 + lsr r8, r8, #24 +#else + uxtb r8, r8 +#endif +#else + ubfx r8, r8, #0, #8 +#endif + eor r6, r6, r7, ror #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r10, #8 + lsr r7, r7, #24 +#else + uxtb r7, r10, ror #16 +#endif +#else + ubfx r7, r10, #16, #8 +#endif + eor r6, r6, r12, ror #8 + lsr r12, r11, #24 + eor r6, r6, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r9, #16 + lsr lr, lr, #24 +#else + uxtb lr, r9, ror #8 +#endif +#else + ubfx lr, r9, #8, #8 +#endif + ldr r8, [r0, r8, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr r7, [r0, r7, lsl #2] + ldr lr, [r0, lr, lsl #2] + eor r12, r12, r8, ror #24 + ldm r3!, {r8, r9, r10, r11} + eor r7, r7, lr, ror #8 + eor r7, r7, r12, ror #24 + # XOR in Key Schedule + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + subs r1, r1, #1 + bne L_AES_decrypt_block_nr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r8, r7, #8 + lsr r8, r8, #24 +#else + uxtb r8, r7, ror #16 +#endif +#else + ubfx r8, r7, #16, #8 +#endif + lsr r11, r4, #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r6, #16 + lsr r12, r12, #24 +#else + uxtb r12, r6, ror #8 +#endif +#else + ubfx r12, r6, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r5, #24 + lsr lr, lr, #24 +#else + uxtb lr, r5 +#endif +#else + ubfx lr, r5, #0, #8 +#endif + ldr r8, [r0, r8, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r9, r4, #8 + lsr r9, r9, #24 +#else + uxtb r9, r4, ror #16 +#endif +#else + ubfx r9, r4, #16, #8 +#endif + eor r8, r8, r11, ror #24 + lsr r11, r5, #24 + eor r8, r8, r12, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r7, #16 + lsr r12, r12, #24 +#else + uxtb r12, r7, ror #8 +#endif +#else + ubfx r12, r7, #8, #8 +#endif + eor r8, r8, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r6, #24 + lsr lr, lr, #24 +#else + uxtb lr, r6 +#endif +#else + ubfx lr, r6, #0, #8 +#endif + ldr r9, [r0, r9, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r10, r5, #8 + lsr r10, r10, #24 +#else + uxtb r10, r5, ror #16 +#endif +#else + ubfx r10, r5, #16, #8 +#endif + eor r9, r9, r11, ror #24 + lsr r11, r6, #24 + eor r9, r9, r12, ror #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r4, #16 + lsr r12, r12, #24 +#else + uxtb r12, r4, ror #8 +#endif +#else + ubfx r12, r4, #8, #8 +#endif + eor r9, r9, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r7, #24 + lsr lr, lr, #24 +#else + uxtb lr, r7 +#endif +#else + ubfx lr, r7, #0, #8 +#endif + ldr r10, [r0, r10, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr lr, [r0, lr, lsl #2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r4, #24 + lsr r4, r4, #24 +#else + uxtb r4, r4 +#endif +#else + ubfx r4, r4, #0, #8 +#endif + eor r10, r10, r11, ror #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r11, r6, #8 + lsr r11, r11, #24 +#else + uxtb r11, r6, ror #16 +#endif +#else + ubfx r11, r6, #16, #8 +#endif + eor r10, r10, r12, ror #8 + lsr r12, r7, #24 + eor r10, r10, lr, ror #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r5, #16 + lsr lr, lr, #24 +#else + uxtb lr, r5, ror #8 +#endif +#else + ubfx lr, r5, #8, #8 +#endif + ldr r4, [r0, r4, lsl #2] + ldr r12, [r0, r12, lsl #2] + ldr r11, [r0, r11, lsl #2] + ldr lr, [r0, lr, lsl #2] + eor r12, r12, r4, ror #24 + ldm r3!, {r4, r5, r6, r7} + eor r11, r11, lr, ror #8 + eor r11, r11, r12, ror #24 + # XOR in Key Schedule + eor r8, r8, r4 + eor r9, r9, r5 + eor r10, r10, r6 + eor r11, r11, r7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r4, r9, #24 + lsr r4, r4, #24 +#else + uxtb r4, r9 +#endif +#else + ubfx r4, r9, #0, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r10, #16 + lsr r7, r7, #24 +#else + uxtb r7, r10, ror #8 +#endif +#else + ubfx r7, r10, #8, #8 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r11, #8 + lsr r12, r12, #24 +#else + uxtb r12, r11, ror #16 +#endif +#else + ubfx r12, r11, #16, #8 +#endif + lsr lr, r8, #24 + ldrb r4, [r2, r4] + ldrb r7, [r2, r7] + ldrb r12, [r2, r12] + ldrb lr, [r2, lr] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r5, r10, #24 + lsr r5, r5, #24 +#else + uxtb r5, r10 +#endif +#else + ubfx r5, r10, #0, #8 +#endif + eor r4, r4, r7, lsl #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r11, #16 + lsr r7, r7, #24 +#else + uxtb r7, r11, ror #8 +#endif +#else + ubfx r7, r11, #8, #8 +#endif + eor r4, r4, r12, lsl #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r8, #8 + lsr r12, r12, #24 +#else + uxtb r12, r8, ror #16 +#endif +#else + ubfx r12, r8, #16, #8 +#endif + eor r4, r4, lr, lsl #24 + lsr lr, r9, #24 + ldrb r7, [r2, r7] + ldrb lr, [r2, lr] + ldrb r5, [r2, r5] + ldrb r12, [r2, r12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r6, r11, #24 + lsr r6, r6, #24 +#else + uxtb r6, r11 +#endif +#else + ubfx r6, r11, #0, #8 +#endif + eor r5, r5, r7, lsl #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r8, #16 + lsr r7, r7, #24 +#else + uxtb r7, r8, ror #8 +#endif +#else + ubfx r7, r8, #8, #8 +#endif + eor r5, r5, r12, lsl #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r9, #8 + lsr r12, r12, #24 +#else + uxtb r12, r9, ror #16 +#endif +#else + ubfx r12, r9, #16, #8 +#endif + eor r5, r5, lr, lsl #24 + lsr lr, r10, #24 + ldrb r7, [r2, r7] + ldrb lr, [r2, lr] + ldrb r6, [r2, r6] + ldrb r12, [r2, r12] + lsr r11, r11, #24 + eor r6, r6, r7, lsl #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r7, r8, #24 + lsr r7, r7, #24 +#else + uxtb r7, r8 +#endif +#else + ubfx r7, r8, #0, #8 +#endif + eor r6, r6, r12, lsl #16 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r12, r9, #16 + lsr r12, r12, #24 +#else + uxtb r12, r9, ror #8 +#endif +#else + ubfx r12, r9, #8, #8 +#endif + eor r6, r6, lr, lsl #24 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl lr, r10, #8 + lsr lr, lr, #24 +#else + uxtb lr, r10, ror #16 +#endif +#else + ubfx lr, r10, #16, #8 +#endif + ldrb r11, [r2, r11] + ldrb r12, [r2, r12] + ldrb r7, [r2, r7] + ldrb lr, [r2, lr] + eor r12, r12, r11, lsl #16 + ldm r3, {r8, r9, r10, r11} + eor r7, r7, r12, lsl #8 + eor r7, r7, lr, lsl #16 + # XOR in Key Schedule + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + pop {pc} + .size AES_decrypt_block,.-AES_decrypt_block + .text + .type L_AES_ARM32_td_ecb, %object + .size L_AES_ARM32_td_ecb, 12 + .align 4 +L_AES_ARM32_td_ecb: + .word L_AES_ARM32_td_data + .text .type L_AES_ARM32_td4, %object .size L_AES_ARM32_td4, 256 .align 4 @@ -1828,234 +3604,6 @@ .byte 0x21 .byte 0xc .byte 0x7d - .text - .align 4 - .globl AES_decrypt_block - .type AES_decrypt_block, %function -AES_decrypt_block: -L_AES_decrypt_block_14: - push {lr} - ldr lr, [sp, #8] - mov r12, #6 - b L_AES_decrypt_block_nr -L_AES_decrypt_block_12: - push {lr} - ldr lr, [sp, #8] - mov r12, #5 - b L_AES_decrypt_block_nr -L_AES_decrypt_block_10: - push {lr} - ldr lr, [sp, #8] - mov r12, #4 -L_AES_decrypt_block_nr: - lsr r11, r4, #24 - and r1, r2, r5 - and r8, r2, r7, lsr #16 - and r0, r2, r6, lsr #8 - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - ldr r8, [lr, r8, lsl #2] - ldr r0, [lr, r0, lsl #2] - and r9, r2, r4, lsr #16 - eor r8, r8, r11, ror #24 - lsr r11, r5, #24 - eor r8, r8, r0, ror #8 - and r0, r2, r7, lsr #8 - eor r8, r8, r1, ror #16 - and r1, r2, r6 - ldr r9, [lr, r9, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r10, r2, r5, lsr #16 - eor r9, r9, r11, ror #24 - lsr r11, r6, #24 - eor r9, r9, r0, ror #8 - and r0, r2, r4, lsr #8 - eor r9, r9, r1, ror #16 - and r1, r2, r7 - ldr r10, [lr, r10, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r4, r2, r4 - eor r10, r10, r11, ror #24 - and r11, r2, r6, lsr #16 - eor r10, r10, r0, ror #8 - lsr r0, r7, #24 - eor r10, r10, r1, ror #16 - and r1, r2, r5, lsr #8 - ldr r4, [lr, r4, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - eor r0, r0, r4, ror #24 - ldm r3!, {r4, r5, r6, r7} - eor r11, r11, r1, ror #8 - eor r11, r11, r0, ror #24 - # XOR in Key Schedule - eor r8, r8, r4 - eor r9, r9, r5 - eor r10, r10, r6 - eor r11, r11, r7 - lsr r7, r8, #24 - and r1, r2, r9 - and r4, r2, r11, lsr #16 - and r0, r2, r10, lsr #8 - ldr r7, [lr, r7, lsl #2] - ldr r1, [lr, r1, lsl #2] - ldr r4, [lr, r4, lsl #2] - ldr r0, [lr, r0, lsl #2] - and r5, r2, r8, lsr #16 - eor r4, r4, r7, ror #24 - lsr r7, r9, #24 - eor r4, r4, r0, ror #8 - and r0, r2, r11, lsr #8 - eor r4, r4, r1, ror #16 - and r1, r2, r10 - ldr r5, [lr, r5, lsl #2] - ldr r7, [lr, r7, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r6, r2, r9, lsr #16 - eor r5, r5, r7, ror #24 - lsr r7, r10, #24 - eor r5, r5, r0, ror #8 - and r0, r2, r8, lsr #8 - eor r5, r5, r1, ror #16 - and r1, r2, r11 - ldr r6, [lr, r6, lsl #2] - ldr r7, [lr, r7, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r8, r2, r8 - eor r6, r6, r7, ror #24 - and r7, r2, r10, lsr #16 - eor r6, r6, r0, ror #8 - lsr r0, r11, #24 - eor r6, r6, r1, ror #16 - and r1, r2, r9, lsr #8 - ldr r8, [lr, r8, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r7, [lr, r7, lsl #2] - ldr r1, [lr, r1, lsl #2] - eor r0, r0, r8, ror #24 - ldm r3!, {r8, r9, r10, r11} - eor r7, r7, r1, ror #8 - eor r7, r7, r0, ror #24 - # XOR in Key Schedule - eor r4, r4, r8 - eor r5, r5, r9 - eor r6, r6, r10 - eor r7, r7, r11 - subs r12, r12, #1 - bne L_AES_decrypt_block_nr - lsr r11, r4, #24 - and r1, r2, r5 - and r8, r2, r7, lsr #16 - and r0, r2, r6, lsr #8 - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - ldr r8, [lr, r8, lsl #2] - ldr r0, [lr, r0, lsl #2] - and r9, r2, r4, lsr #16 - eor r8, r8, r11, ror #24 - lsr r11, r5, #24 - eor r8, r8, r0, ror #8 - and r0, r2, r7, lsr #8 - eor r8, r8, r1, ror #16 - and r1, r2, r6 - ldr r9, [lr, r9, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r10, r2, r5, lsr #16 - eor r9, r9, r11, ror #24 - lsr r11, r6, #24 - eor r9, r9, r0, ror #8 - and r0, r2, r4, lsr #8 - eor r9, r9, r1, ror #16 - and r1, r2, r7 - ldr r10, [lr, r10, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r1, [lr, r1, lsl #2] - and r4, r2, r4 - eor r10, r10, r11, ror #24 - and r11, r2, r6, lsr #16 - eor r10, r10, r0, ror #8 - lsr r0, r7, #24 - eor r10, r10, r1, ror #16 - and r1, r2, r5, lsr #8 - ldr r4, [lr, r4, lsl #2] - ldr r0, [lr, r0, lsl #2] - ldr r11, [lr, r11, lsl #2] - ldr r1, [lr, r1, lsl #2] - eor r0, r0, r4, ror #24 - ldm r3!, {r4, r5, r6, r7} - eor r11, r11, r1, ror #8 - eor r11, r11, r0, ror #24 - # XOR in Key Schedule - eor r8, r8, r4 - eor r9, r9, r5 - eor r10, r10, r6 - eor r11, r11, r7 - adr r12, L_AES_ARM32_td4 - and r7, r2, r10, lsr #8 - lsr r1, r8, #24 - and r4, r2, r9 - and r0, r2, r11, lsr #16 - ldrb r7, [r12, r7] - ldrb r1, [r12, r1] - ldrb r4, [r12, r4] - ldrb r0, [r12, r0] - and r5, r2, r10 - eor r4, r4, r7, lsl #8 - and r7, r2, r11, lsr #8 - eor r4, r4, r0, lsl #16 - and r0, r2, r8, lsr #16 - eor r4, r4, r1, lsl #24 - lsr r1, r9, #24 - ldrb r7, [r12, r7] - ldrb r1, [r12, r1] - ldrb r5, [r12, r5] - ldrb r0, [r12, r0] - and r6, r2, r11 - eor r5, r5, r7, lsl #8 - and r7, r2, r8, lsr #8 - eor r5, r5, r0, lsl #16 - and r0, r2, r9, lsr #16 - eor r5, r5, r1, lsl #24 - lsr r1, r10, #24 - ldrb r7, [r12, r7] - ldrb r1, [r12, r1] - ldrb r6, [r12, r6] - ldrb r0, [r12, r0] - lsr r11, r11, #24 - eor r6, r6, r7, lsl #8 - and r7, r2, r8 - eor r6, r6, r0, lsl #16 - and r0, r2, r9, lsr #8 - eor r6, r6, r1, lsl #24 - and r1, r2, r10, lsr #16 - ldrb r11, [r12, r11] - ldrb r0, [r12, r0] - ldrb r7, [r12, r7] - ldrb r1, [r12, r1] - eor r0, r0, r11, lsl #16 - ldm r3, {r8, r9, r10, r11} - eor r7, r7, r0, lsl #8 - eor r7, r7, r1, lsl #16 - # XOR in Key Schedule - eor r4, r4, r8 - eor r5, r5, r9 - eor r6, r6, r10 - eor r7, r7, r11 - str lr, [sp, #8] - pop {lr} - bx lr - bx lr - .size AES_decrypt_block,.-AES_decrypt_block #if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) .text .align 4 @@ -2063,116 +3611,225 @@ .type AES_ECB_decrypt, %function AES_ECB_decrypt: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - ldr r12, [sp, #36] - mov r8, r12 - adr r4, AES_ECB_decrypt - mov lr, #AES_ECB_decrypt-L_AES_ARM32_td - sub lr, r4, lr + ldr r8, [sp, #36] + mov lr, r0 + adr r0, L_AES_ARM32_td_ecb + ldr r0, [r0] + mov r12, r2 + adr r2, L_AES_ARM32_td4 cmp r8, #10 beq L_AES_ECB_decrypt_start_block_128 cmp r8, #12 beq L_AES_ECB_decrypt_start_block_192 L_AES_ECB_decrypt_loop_block_256: - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - push {r0, r1, r2} - mov r2, #0xff - push {r3, lr} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + push {r1, r3, r12, lr} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_14 - pop {r3, lr} - pop {r0, r1, r2} + mov r1, #6 + bl AES_decrypt_block + pop {r1, r3, r12, lr} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_ECB_decrypt_loop_block_256 b L_AES_ECB_decrypt_end L_AES_ECB_decrypt_start_block_192: L_AES_ECB_decrypt_loop_block_192: - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - push {r0, r1, r2} - mov r2, #0xff - push {r3, lr} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + push {r1, r3, r12, lr} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_12 - pop {r3, lr} - pop {r0, r1, r2} + mov r1, #5 + bl AES_decrypt_block + pop {r1, r3, r12, lr} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_ECB_decrypt_loop_block_192 b L_AES_ECB_decrypt_end L_AES_ECB_decrypt_start_block_128: L_AES_ECB_decrypt_loop_block_128: - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - push {r0, r1, r2} - mov r2, #0xff - push {r3, lr} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + push {r1, r3, r12, lr} ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_10 - pop {r3, lr} - pop {r0, r1, r2} + mov r1, #4 + bl AES_decrypt_block + pop {r1, r3, r12, lr} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_ECB_decrypt_loop_block_128 L_AES_ECB_decrypt_end: @@ -2186,71 +3843,95 @@ .type AES_CBC_decrypt, %function AES_CBC_decrypt: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #24 - ldr r12, [sp, #60] - ldr lr, [sp, #64] - str lr, [sp, #20] - str r3, [sp] - adr r8, AES_CBC_decrypt - mov lr, #AES_CBC_decrypt-L_AES_ARM32_td - sub lr, r8, lr - mov r8, r12 - str lr, [sp, #4] + ldr r8, [sp, #36] + ldr r4, [sp, #40] + mov lr, r0 + adr r0, L_AES_ARM32_td_ecb + ldr r0, [r0] + mov r12, r2 + adr r2, L_AES_ARM32_td4 + push {r3, r4} cmp r8, #10 beq L_AES_CBC_decrypt_loop_block_128 cmp r8, #12 beq L_AES_CBC_decrypt_loop_block_192 L_AES_CBC_decrypt_loop_block_256: -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r0, [sp, #8] - str r1, [sp, #12] -#else - strd r0, r1, [sp, #8] -#endif - str r2, [sp, #16] - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #24] - str r7, [r0, #28] + push {r1, r12, lr} + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [lr, #16] + str r5, [lr, #20] +#else + strd r4, r5, [lr, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [lr, #24] + str r7, [lr, #28] +#else + strd r6, r7, [lr, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 #else - strd r6, r7, [r0, #24] -#endif - mov r2, #0xff - ldm r3!, {r8, r9, r10, r11} rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_14 + mov r1, #6 + bl AES_decrypt_block + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r0, [sp, #20] - ldm r0, {r8, r9, r10, r11} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm lr, {r8, r9, r10, r11} + pop {r1, r12, lr} ldr r3, [sp] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r0, [sp, #8] - ldr r1, [sp, #12] -#else - ldrd r0, r1, [sp, #8] -#endif - ldr r2, [sp, #16] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 @@ -2259,71 +3940,97 @@ str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 beq L_AES_CBC_decrypt_end_odd -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r0, [sp, #8] - str r1, [sp, #12] -#else - strd r0, r1, [sp, #8] -#endif - str r2, [sp, #16] - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] + push {r1, r12, lr} + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [lr] + str r5, [lr, #4] +#else + strd r4, r5, [lr] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [lr, #8] + str r7, [lr, #12] +#else + strd r6, r7, [lr, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 #else - strd r6, r7, [r0, #8] -#endif - mov r2, #0xff - ldm r3!, {r8, r9, r10, r11} rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_14 + mov r1, #6 + bl AES_decrypt_block + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r0, #16] - ldr r9, [r0, #20] +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [lr, #16] + ldr r9, [lr, #20] #else - ldrd r8, r9, [r0, #16] + ldrd r8, r9, [lr, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r0, #24] - ldr r11, [r0, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [lr, #24] + ldr r11, [lr, #28] #else - ldrd r10, r11, [r0, #24] + ldrd r10, r11, [lr, #24] #endif + pop {r1, r12, lr} ldr r3, [sp] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r0, [sp, #8] - ldr r1, [sp, #12] -#else - ldrd r0, r1, [sp, #8] -#endif - ldr r2, [sp, #16] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 @@ -2332,62 +4039,88 @@ str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CBC_decrypt_loop_block_256 b L_AES_CBC_decrypt_end L_AES_CBC_decrypt_loop_block_192: -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r0, [sp, #8] - str r1, [sp, #12] -#else - strd r0, r1, [sp, #8] -#endif - str r2, [sp, #16] - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] + push {r1, r12, lr} + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [lr, #16] + str r5, [lr, #20] +#else + strd r4, r5, [lr, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [lr, #24] + str r7, [lr, #28] +#else + strd r6, r7, [lr, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 #else - strd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #24] - str r7, [r0, #28] -#else - strd r6, r7, [r0, #24] -#endif - mov r2, #0xff - ldm r3!, {r8, r9, r10, r11} rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_12 + mov r1, #5 + bl AES_decrypt_block + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r0, [sp, #20] - ldm r0, {r8, r9, r10, r11} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm lr, {r8, r9, r10, r11} + pop {r1, r12, lr} ldr r3, [sp] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r0, [sp, #8] - ldr r1, [sp, #12] -#else - ldrd r0, r1, [sp, #8] -#endif - ldr r2, [sp, #16] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 @@ -2396,71 +4129,97 @@ str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 beq L_AES_CBC_decrypt_end_odd -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r0, [sp, #8] - str r1, [sp, #12] -#else - strd r0, r1, [sp, #8] -#endif - str r2, [sp, #16] - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] + push {r1, r12, lr} + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [lr] + str r5, [lr, #4] +#else + strd r4, r5, [lr] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [lr, #8] + str r7, [lr, #12] +#else + strd r6, r7, [lr, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 #else - strd r6, r7, [r0, #8] -#endif - mov r2, #0xff - ldm r3!, {r8, r9, r10, r11} rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_12 + mov r1, #5 + bl AES_decrypt_block + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r0, #16] - ldr r9, [r0, #20] +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [lr, #16] + ldr r9, [lr, #20] #else - ldrd r8, r9, [r0, #16] + ldrd r8, r9, [lr, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r0, #24] - ldr r11, [r0, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [lr, #24] + ldr r11, [lr, #28] #else - ldrd r10, r11, [r0, #24] + ldrd r10, r11, [lr, #24] #endif + pop {r1, r12, lr} ldr r3, [sp] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r0, [sp, #8] - ldr r1, [sp, #12] -#else - ldrd r0, r1, [sp, #8] -#endif - ldr r2, [sp, #16] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 @@ -2469,62 +4228,88 @@ str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CBC_decrypt_loop_block_192 b L_AES_CBC_decrypt_end L_AES_CBC_decrypt_loop_block_128: -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r0, [sp, #8] - str r1, [sp, #12] -#else - strd r0, r1, [sp, #8] -#endif - str r2, [sp, #16] - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #24] - str r7, [r0, #28] + push {r1, r12, lr} + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [lr, #16] + str r5, [lr, #20] +#else + strd r4, r5, [lr, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [lr, #24] + str r7, [lr, #28] +#else + strd r6, r7, [lr, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 #else - strd r6, r7, [r0, #24] -#endif - mov r2, #0xff - ldm r3!, {r8, r9, r10, r11} rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_10 + mov r1, #4 + bl AES_decrypt_block + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r0, [sp, #20] - ldm r0, {r8, r9, r10, r11} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm lr, {r8, r9, r10, r11} + pop {r1, r12, lr} ldr r3, [sp] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r0, [sp, #8] - ldr r1, [sp, #12] -#else - ldrd r0, r1, [sp, #8] -#endif - ldr r2, [sp, #16] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 @@ -2533,71 +4318,97 @@ str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 beq L_AES_CBC_decrypt_end_odd -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r0, [sp, #8] - str r1, [sp, #12] -#else - strd r0, r1, [sp, #8] -#endif - str r2, [sp, #16] - ldr r4, [r0] - ldr r5, [r0, #4] - ldr r6, [r0, #8] - ldr r7, [r0, #12] - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] + push {r1, r12, lr} + ldr r4, [lr] + ldr r5, [lr, #4] + ldr r6, [lr, #8] + ldr r7, [lr, #12] + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [lr] + str r5, [lr, #4] +#else + strd r4, r5, [lr] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [lr, #8] + str r7, [lr, #12] +#else + strd r6, r7, [lr, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 #else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif - mov r2, #0xff - ldm r3!, {r8, r9, r10, r11} rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldm r3!, {r8, r9, r10, r11} # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_decrypt_block_10 + mov r1, #4 + bl AES_decrypt_block + ldr lr, [sp, #16] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r0, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r0, #16] - ldr r9, [r0, #20] +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [lr, #16] + ldr r9, [lr, #20] #else - ldrd r8, r9, [r0, #16] + ldrd r8, r9, [lr, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r0, #24] - ldr r11, [r0, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [lr, #24] + ldr r11, [lr, #28] #else - ldrd r10, r11, [r0, #24] + ldrd r10, r11, [lr, #24] #endif + pop {r1, r12, lr} ldr r3, [sp] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r0, [sp, #8] - ldr r1, [sp, #12] -#else - ldrd r0, r1, [sp, #8] -#endif - ldr r2, [sp, #16] eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 @@ -2606,40 +4417,39 @@ str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - subs r2, r2, #16 - add r0, r0, #16 + subs r12, r12, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_CBC_decrypt_loop_block_128 b L_AES_CBC_decrypt_end L_AES_CBC_decrypt_end_odd: - ldr lr, [sp, #20] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [lr, #16] - ldr r9, [lr, #20] + ldr r4, [sp, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r4, #16] + ldr r9, [r4, #20] #else - ldrd r8, r9, [lr, #16] + ldrd r8, r9, [r4, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [lr, #24] - ldr r11, [lr, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r4, #24] + ldr r11, [r4, #28] #else - ldrd r10, r11, [lr, #24] + ldrd r10, r11, [r4, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [lr] - str r9, [lr, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r4] + str r9, [r4, #4] #else - strd r8, r9, [lr] + strd r8, r9, [r4] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [lr, #8] - str r11, [lr, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r4, #8] + str r11, [r4, #12] #else - strd r10, r11, [lr, #8] + strd r10, r11, [r4, #8] #endif L_AES_CBC_decrypt_end: - ldr lr, [sp, #4] - add sp, sp, #24 + pop {r3, r4} pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size AES_CBC_decrypt,.-AES_CBC_decrypt #endif /* HAVE_AES_CBC */ @@ -3211,10 +5021,33 @@ eor r9, r9, r5 eor r10, r10, r6 eor r11, r11, r7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + # REV r8, r8 + eor r3, r8, r8, ror #16 + bic r3, r3, #0xff0000 + ror r8, r8, #8 + eor r8, r8, r3, lsr #8 + # REV r9, r9 + eor r3, r9, r9, ror #16 + bic r3, r3, #0xff0000 + ror r9, r9, #8 + eor r9, r9, r3, lsr #8 + # REV r10, r10 + eor r3, r10, r10, ror #16 + bic r3, r3, #0xff0000 + ror r10, r10, #8 + eor r10, r10, r3, lsr #8 + # REV r11, r11 + eor r3, r11, r11, ror #16 + bic r3, r3, #0xff0000 + ror r11, r11, #8 + eor r11, r11, r3, lsr #8 +#else rev r8, r8 rev r9, r9 rev r10, r10 rev r11, r11 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ stm r0, {r8, r9, r10, r11} pop {r3} subs r3, r3, #16 @@ -3223,159 +5056,258 @@ pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size GCM_gmult_len,.-GCM_gmult_len .text + .type L_AES_ARM32_te_gcm, %object + .size L_AES_ARM32_te_gcm, 12 + .align 4 +L_AES_ARM32_te_gcm: + .word L_AES_ARM32_te_data + .text .align 4 .globl AES_GCM_encrypt .type AES_GCM_encrypt, %function AES_GCM_encrypt: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} ldr r12, [sp, #36] - ldr lr, [sp, #40] - ldm lr, {r4, r5, r6, r7} + ldr r8, [sp, #40] + mov lr, r0 + adr r0, L_AES_ARM32_te_gcm + ldr r0, [r0] + ldm r8, {r4, r5, r6, r7} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r10, r4, r4, ror #16 + eor r11, r5, r5, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + eor r4, r4, r10, lsr #8 + eor r5, r5, r11, lsr #8 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r6, r6, #8 + ror r7, r7, #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - stm lr, {r4, r5, r6, r7} - push {lr} - adr r8, AES_GCM_encrypt - mov lr, #AES_GCM_encrypt-L_AES_ARM32_te - sub lr, r8, lr +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + stm r8, {r4, r5, r6, r7} + push {r3, r8} cmp r12, #10 beq L_AES_GCM_encrypt_start_block_128 cmp r12, #12 beq L_AES_GCM_encrypt_start_block_192 - mov r12, #0xff L_AES_GCM_encrypt_loop_block_256: - push {r0, r1} - ldr r0, [sp, #8] + push {r1, r2, lr} + ldr lr, [sp, #16] add r7, r7, #1 - str r7, [r0, #12] - push {r3, lr} ldm r3!, {r8, r9, r10, r11} + str r7, [lr, #12] # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_14 - pop {r3, lr} - pop {r0, r1} + mov r1, #6 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] - eor r4, r8 - eor r5, r9 - eor r6, r10 - eor r7, r11 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + ldr r8, [sp, #4] str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - ldr r8, [sp] ldm r8, {r4, r5, r6, r7} subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_GCM_encrypt_loop_block_256 b L_AES_GCM_encrypt_end L_AES_GCM_encrypt_start_block_192: - mov r12, #0xff L_AES_GCM_encrypt_loop_block_192: - push {r0, r1} - ldr r0, [sp, #8] + push {r1, r2, lr} + ldr lr, [sp, #16] add r7, r7, #1 - str r7, [r0, #12] - push {r3, lr} ldm r3!, {r8, r9, r10, r11} + str r7, [lr, #12] # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_12 - pop {r3, lr} - pop {r0, r1} + mov r1, #5 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] - eor r4, r8 - eor r5, r9 - eor r6, r10 - eor r7, r11 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + ldr r8, [sp, #4] str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - ldr r8, [sp] ldm r8, {r4, r5, r6, r7} subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_GCM_encrypt_loop_block_192 b L_AES_GCM_encrypt_end L_AES_GCM_encrypt_start_block_128: - mov r12, #0xff L_AES_GCM_encrypt_loop_block_128: - push {r0, r1} - ldr r0, [sp, #8] + push {r1, r2, lr} + ldr lr, [sp, #16] add r7, r7, #1 - str r7, [r0, #12] - push {r3, lr} ldm r3!, {r8, r9, r10, r11} + str r7, [lr, #12] # Round: 0 - XOR in key schedule eor r4, r4, r8 eor r5, r5, r9 eor r6, r6, r10 eor r7, r7, r11 - bl L_AES_encrypt_block_10 - pop {r3, lr} - pop {r0, r1} + mov r1, #4 + bl AES_encrypt_block + pop {r1, r2, lr} + ldr r3, [sp] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - ldr r8, [r0] - ldr r9, [r0, #4] - ldr r10, [r0, #8] - ldr r11, [r0, #12] - eor r4, r8 - eor r5, r9 - eor r6, r10 - eor r7, r11 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + ldr r8, [lr] + ldr r9, [lr, #4] + ldr r10, [lr, #8] + ldr r11, [lr, #12] + eor r4, r4, r8 + eor r5, r5, r9 + eor r6, r6, r10 + eor r7, r7, r11 + ldr r8, [sp, #4] str r4, [r1] str r5, [r1, #4] str r6, [r1, #8] str r7, [r1, #12] - ldr r8, [sp] ldm r8, {r4, r5, r6, r7} subs r2, r2, #16 - add r0, r0, #16 + add lr, lr, #16 add r1, r1, #16 bne L_AES_GCM_encrypt_loop_block_128 L_AES_GCM_encrypt_end: - pop {lr} + pop {r3, r8} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + eor r10, r4, r4, ror #16 + eor r11, r5, r5, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + eor r4, r4, r10, lsr #8 + eor r5, r5, r11, lsr #8 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r6, r6, #8 + ror r7, r7, #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#else rev r4, r4 rev r5, r5 rev r6, r6 rev r7, r7 - stm lr, {r4, r5, r6, r7} +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + stm r8, {r4, r5, r6, r7} pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size AES_GCM_encrypt,.-AES_GCM_encrypt #endif /* HAVE_AESGCM */ #endif /* !NO_AES */ -#endif /* !__aarch64__ */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ #endif /* WOLFSSL_ARMASM */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4794 @@ +/* armv8-32-aes-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./aes/aes.rb arm32 ../wolfssl/wolfcrypt/src/port/arm/armv8-32-aes-asm.c + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) +#include +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +#ifndef NO_AES +#include + +#ifdef HAVE_AES_DECRYPT +static const uint32_t L_AES_ARM32_td_data[] = { + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +static const uint32_t L_AES_ARM32_te_data[] = { + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT +static const uint32_t* L_AES_ARM32_td = L_AES_ARM32_td_data; +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +static const uint32_t* L_AES_ARM32_te = L_AES_ARM32_te_data; +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT +void AES_invert_key(unsigned char* ks, word32 rounds); +void AES_invert_key(unsigned char* ks_p, word32 rounds_p) +{ + register unsigned char* ks asm ("r0") = (unsigned char*)ks_p; + register word32 rounds asm ("r1") = (word32)rounds_p; + register uint32_t* L_AES_ARM32_te_c asm ("r2") = (uint32_t*)L_AES_ARM32_te; + register uint32_t* L_AES_ARM32_td_c asm ("r3") = (uint32_t*)L_AES_ARM32_td; + + __asm__ __volatile__ ( + "mov r12, %[L_AES_ARM32_te]\n\t" + "mov lr, %[L_AES_ARM32_td]\n\t" + "add r10, %[ks], %[rounds], lsl #4\n\t" + "mov r11, %[rounds]\n\t" + "\n" + "L_AES_invert_key_loop_%=: \n\t" + "ldm %[ks], {r2, r3, r4, r5}\n\t" + "ldm r10, {r6, r7, r8, r9}\n\t" + "stm r10, {r2, r3, r4, r5}\n\t" + "stm %[ks]!, {r6, r7, r8, r9}\n\t" + "subs r11, r11, #2\n\t" + "sub r10, r10, #16\n\t" + "bne L_AES_invert_key_loop_%=\n\t" + "sub %[ks], %[ks], %[rounds], lsl #3\n\t" + "add %[ks], %[ks], #16\n\t" + "sub r11, %[rounds], #1\n\t" + "\n" + "L_AES_invert_key_mix_loop_%=: \n\t" + "ldm %[ks], {r2, r3, r4, r5}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r2, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r2\n\t" +#endif +#else + "ubfx r6, r2, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r2, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r2, ror #8\n\t" +#endif +#else + "ubfx r7, r2, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r2, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r2, ror #16\n\t" +#endif +#else + "ubfx r8, r2, #16, #8\n\t" +#endif + "lsr r9, r2, #24\n\t" + "ldrb r6, [r12, r6, lsl #2]\n\t" + "ldrb r7, [r12, r7, lsl #2]\n\t" + "ldrb r8, [r12, r8, lsl #2]\n\t" + "ldrb r9, [r12, r9, lsl #2]\n\t" + "ldr r6, [lr, r6, lsl #2]\n\t" + "ldr r7, [lr, r7, lsl #2]\n\t" + "ldr r8, [lr, r8, lsl #2]\n\t" + "ldr r9, [lr, r9, lsl #2]\n\t" + "eor r8, r8, r6, ror #16\n\t" + "eor r8, r8, r7, ror #8\n\t" + "eor r8, r8, r9, ror #24\n\t" + "str r8, [%[ks]], #4\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r3, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r3\n\t" +#endif +#else + "ubfx r6, r3, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r3, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r3, ror #8\n\t" +#endif +#else + "ubfx r7, r3, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r3, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r3, ror #16\n\t" +#endif +#else + "ubfx r8, r3, #16, #8\n\t" +#endif + "lsr r9, r3, #24\n\t" + "ldrb r6, [r12, r6, lsl #2]\n\t" + "ldrb r7, [r12, r7, lsl #2]\n\t" + "ldrb r8, [r12, r8, lsl #2]\n\t" + "ldrb r9, [r12, r9, lsl #2]\n\t" + "ldr r6, [lr, r6, lsl #2]\n\t" + "ldr r7, [lr, r7, lsl #2]\n\t" + "ldr r8, [lr, r8, lsl #2]\n\t" + "ldr r9, [lr, r9, lsl #2]\n\t" + "eor r8, r8, r6, ror #16\n\t" + "eor r8, r8, r7, ror #8\n\t" + "eor r8, r8, r9, ror #24\n\t" + "str r8, [%[ks]], #4\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r4, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r4\n\t" +#endif +#else + "ubfx r6, r4, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r4, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r4, ror #8\n\t" +#endif +#else + "ubfx r7, r4, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r4, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r4, ror #16\n\t" +#endif +#else + "ubfx r8, r4, #16, #8\n\t" +#endif + "lsr r9, r4, #24\n\t" + "ldrb r6, [r12, r6, lsl #2]\n\t" + "ldrb r7, [r12, r7, lsl #2]\n\t" + "ldrb r8, [r12, r8, lsl #2]\n\t" + "ldrb r9, [r12, r9, lsl #2]\n\t" + "ldr r6, [lr, r6, lsl #2]\n\t" + "ldr r7, [lr, r7, lsl #2]\n\t" + "ldr r8, [lr, r8, lsl #2]\n\t" + "ldr r9, [lr, r9, lsl #2]\n\t" + "eor r8, r8, r6, ror #16\n\t" + "eor r8, r8, r7, ror #8\n\t" + "eor r8, r8, r9, ror #24\n\t" + "str r8, [%[ks]], #4\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r5, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r5\n\t" +#endif +#else + "ubfx r6, r5, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r5, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r5, ror #8\n\t" +#endif +#else + "ubfx r7, r5, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r5, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r5, ror #16\n\t" +#endif +#else + "ubfx r8, r5, #16, #8\n\t" +#endif + "lsr r9, r5, #24\n\t" + "ldrb r6, [r12, r6, lsl #2]\n\t" + "ldrb r7, [r12, r7, lsl #2]\n\t" + "ldrb r8, [r12, r8, lsl #2]\n\t" + "ldrb r9, [r12, r9, lsl #2]\n\t" + "ldr r6, [lr, r6, lsl #2]\n\t" + "ldr r7, [lr, r7, lsl #2]\n\t" + "ldr r8, [lr, r8, lsl #2]\n\t" + "ldr r9, [lr, r9, lsl #2]\n\t" + "eor r8, r8, r6, ror #16\n\t" + "eor r8, r8, r7, ror #8\n\t" + "eor r8, r8, r9, ror #24\n\t" + "str r8, [%[ks]], #4\n\t" + "subs r11, r11, #1\n\t" + "bne L_AES_invert_key_mix_loop_%=\n\t" + : [ks] "+r" (ks), [rounds] "+r" (rounds), [L_AES_ARM32_te] "+r" (L_AES_ARM32_te_c), [L_AES_ARM32_td] "+r" (L_AES_ARM32_td_c) + : + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* HAVE_AES_DECRYPT */ +static const uint32_t L_AES_ARM32_rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +void AES_set_encrypt_key(const unsigned char* key, word32 len, unsigned char* ks); +void AES_set_encrypt_key(const unsigned char* key_p, word32 len_p, unsigned char* ks_p) +{ + register const unsigned char* key asm ("r0") = (const unsigned char*)key_p; + register word32 len asm ("r1") = (word32)len_p; + register unsigned char* ks asm ("r2") = (unsigned char*)ks_p; + register uint32_t* L_AES_ARM32_te_c asm ("r3") = (uint32_t*)L_AES_ARM32_te; + register uint32_t* L_AES_ARM32_rcon_c asm ("r4") = (uint32_t*)&L_AES_ARM32_rcon; + + __asm__ __volatile__ ( + "mov r8, %[L_AES_ARM32_te]\n\t" + "mov lr, %[L_AES_ARM32_rcon]\n\t" + "cmp %[len], #0x80\n\t" + "beq L_AES_set_encrypt_key_start_128_%=\n\t" + "cmp %[len], #0xc0\n\t" + "beq L_AES_set_encrypt_key_start_192_%=\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[key]]\n\t" + "ldr r5, [%[key], #4]\n\t" +#else + "ldrd r4, r5, [%[key]]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[key], #8]\n\t" + "ldr r7, [%[key], #12]\n\t" +#else + "ldrd r6, r7, [%[key], #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + /* REV r4, r4 */ + "eor r3, r4, r4, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "eor r4, r4, r3, lsr #8\n\t" + /* REV r5, r5 */ + "eor r3, r5, r5, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r5, r5, #8\n\t" + "eor r5, r5, r3, lsr #8\n\t" + /* REV r6, r6 */ + "eor r3, r6, r6, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "eor r6, r6, r3, lsr #8\n\t" + /* REV r7, r7 */ + "eor r3, r7, r7, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r7, r7, #8\n\t" + "eor r7, r7, r3, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm %[ks]!, {r4, r5, r6, r7}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[key], #16]\n\t" + "ldr r5, [%[key], #20]\n\t" +#else + "ldrd r4, r5, [%[key], #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[key], #24]\n\t" + "ldr r7, [%[key], #28]\n\t" +#else + "ldrd r6, r7, [%[key], #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + /* REV r4, r4 */ + "eor r3, r4, r4, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "eor r4, r4, r3, lsr #8\n\t" + /* REV r5, r5 */ + "eor r3, r5, r5, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r5, r5, #8\n\t" + "eor r5, r5, r3, lsr #8\n\t" + /* REV r6, r6 */ + "eor r3, r6, r6, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "eor r6, r6, r3, lsr #8\n\t" + /* REV r7, r7 */ + "eor r3, r7, r7, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r7, r7, #8\n\t" + "eor r7, r7, r3, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm %[ks], {r4, r5, r6, r7}\n\t" + "sub %[ks], %[ks], #16\n\t" + "mov r12, #6\n\t" + "\n" + "L_AES_set_encrypt_key_loop_256_%=: \n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r7, #24\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r7\n\t" +#endif +#else + "ubfx r4, r7, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r7, #16\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r7, ror #8\n\t" +#endif +#else + "ubfx r5, r7, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r7, #8\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r7, ror #16\n\t" +#endif +#else + "ubfx r6, r7, #16, #8\n\t" +#endif + "lsr r7, r7, #24\n\t" + "ldrb r4, [r8, r4, lsl #2]\n\t" + "ldrb r5, [r8, r5, lsl #2]\n\t" + "ldrb r6, [r8, r6, lsl #2]\n\t" + "ldrb r7, [r8, r7, lsl #2]\n\t" + "eor r3, r7, r4, lsl #8\n\t" + "eor r3, r3, r5, lsl #16\n\t" + "eor r3, r3, r6, lsl #24\n\t" + "ldm %[ks]!, {r4, r5, r6, r7}\n\t" + "eor r4, r4, r3\n\t" + "ldm lr!, {r3}\n\t" + "eor r4, r4, r3\n\t" + "eor r5, r5, r4\n\t" + "eor r6, r6, r5\n\t" + "eor r7, r7, r6\n\t" + "add %[ks], %[ks], #16\n\t" + "stm %[ks], {r4, r5, r6, r7}\n\t" + "sub %[ks], %[ks], #16\n\t" + "mov r3, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r3, #16\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r3, ror #8\n\t" +#endif +#else + "ubfx r4, r3, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r3, #8\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r3, ror #16\n\t" +#endif +#else + "ubfx r5, r3, #16, #8\n\t" +#endif + "lsr r6, r3, #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r3, r3, #24\n\t" + "lsr r3, r3, #24\n\t" +#else + "uxtb r3, r3\n\t" +#endif +#else + "ubfx r3, r3, #0, #8\n\t" +#endif + "ldrb r4, [r8, r4, lsl #2]\n\t" + "ldrb r6, [r8, r6, lsl #2]\n\t" + "ldrb r5, [r8, r5, lsl #2]\n\t" + "ldrb r3, [r8, r3, lsl #2]\n\t" + "eor r3, r3, r4, lsl #8\n\t" + "eor r3, r3, r5, lsl #16\n\t" + "eor r3, r3, r6, lsl #24\n\t" + "ldm %[ks]!, {r4, r5, r6, r7}\n\t" + "eor r4, r4, r3\n\t" + "eor r5, r5, r4\n\t" + "eor r6, r6, r5\n\t" + "eor r7, r7, r6\n\t" + "add %[ks], %[ks], #16\n\t" + "stm %[ks], {r4, r5, r6, r7}\n\t" + "sub %[ks], %[ks], #16\n\t" + "subs r12, r12, #1\n\t" + "bne L_AES_set_encrypt_key_loop_256_%=\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r7, #24\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r7\n\t" +#endif +#else + "ubfx r4, r7, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r7, #16\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r7, ror #8\n\t" +#endif +#else + "ubfx r5, r7, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r7, #8\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r7, ror #16\n\t" +#endif +#else + "ubfx r6, r7, #16, #8\n\t" +#endif + "lsr r7, r7, #24\n\t" + "ldrb r4, [r8, r4, lsl #2]\n\t" + "ldrb r5, [r8, r5, lsl #2]\n\t" + "ldrb r6, [r8, r6, lsl #2]\n\t" + "ldrb r7, [r8, r7, lsl #2]\n\t" + "eor r3, r7, r4, lsl #8\n\t" + "eor r3, r3, r5, lsl #16\n\t" + "eor r3, r3, r6, lsl #24\n\t" + "ldm %[ks]!, {r4, r5, r6, r7}\n\t" + "eor r4, r4, r3\n\t" + "ldm lr!, {r3}\n\t" + "eor r4, r4, r3\n\t" + "eor r5, r5, r4\n\t" + "eor r6, r6, r5\n\t" + "eor r7, r7, r6\n\t" + "add %[ks], %[ks], #16\n\t" + "stm %[ks], {r4, r5, r6, r7}\n\t" + "sub %[ks], %[ks], #16\n\t" + "b L_AES_set_encrypt_key_end_%=\n\t" + "\n" + "L_AES_set_encrypt_key_start_192_%=: \n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[key]]\n\t" + "ldr r5, [%[key], #4]\n\t" +#else + "ldrd r4, r5, [%[key]]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[key], #8]\n\t" + "ldr r7, [%[key], #12]\n\t" +#else + "ldrd r6, r7, [%[key], #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr %[len], [%[key], #20]\n\t" + "ldr %[key], [%[key], #16]\n\t" +#else + "ldrd %[key], %[len], [%[key], #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + /* REV r4, r4 */ + "eor r3, r4, r4, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "eor r4, r4, r3, lsr #8\n\t" + /* REV r5, r5 */ + "eor r3, r5, r5, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r5, r5, #8\n\t" + "eor r5, r5, r3, lsr #8\n\t" + /* REV r6, r6 */ + "eor r3, r6, r6, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "eor r6, r6, r3, lsr #8\n\t" + /* REV r7, r7 */ + "eor r3, r7, r7, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r7, r7, #8\n\t" + "eor r7, r7, r3, lsr #8\n\t" + /* REV r0, r0 */ + "eor r3, %[key], %[key], ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror %[key], %[key], #8\n\t" + "eor %[key], %[key], r3, lsr #8\n\t" + /* REV r1, r1 */ + "eor r3, %[len], %[len], ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror %[len], %[len], #8\n\t" + "eor %[len], %[len], r3, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" + "rev %[key], %[key]\n\t" + "rev %[len], %[len]\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm %[ks], {r4, r5, r6, r7}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str %[key], [%[ks], #16]\n\t" + "str %[len], [%[ks], #20]\n\t" +#else + "strd %[key], %[len], [%[ks], #16]\n\t" +#endif + "mov r7, %[len]\n\t" + "mov r12, #7\n\t" + "\n" + "L_AES_set_encrypt_key_loop_192_%=: \n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r0, r7, #24\n\t" + "lsr r0, r0, #24\n\t" +#else + "uxtb r0, r7\n\t" +#endif +#else + "ubfx r0, r7, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r1, r7, #16\n\t" + "lsr r1, r1, #24\n\t" +#else + "uxtb r1, r7, ror #8\n\t" +#endif +#else + "ubfx r1, r7, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r7, #8\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r7, ror #16\n\t" +#endif +#else + "ubfx r4, r7, #16, #8\n\t" +#endif + "lsr r7, r7, #24\n\t" + "ldrb r0, [r8, r0, lsl #2]\n\t" + "ldrb r1, [r8, r1, lsl #2]\n\t" + "ldrb r4, [r8, r4, lsl #2]\n\t" + "ldrb r7, [r8, r7, lsl #2]\n\t" + "eor r3, r7, r0, lsl #8\n\t" + "eor r3, r3, r1, lsl #16\n\t" + "eor r3, r3, r4, lsl #24\n\t" + "ldm %[ks]!, {r0, r1, r4, r5, r6, r7}\n\t" + "eor r0, r0, r3\n\t" + "ldm lr!, {r3}\n\t" + "eor r0, r0, r3\n\t" + "eor r1, r1, r0\n\t" + "eor r4, r4, r1\n\t" + "eor r5, r5, r4\n\t" + "eor r6, r6, r5\n\t" + "eor r7, r7, r6\n\t" + "stm %[ks], {r0, r1, r4, r5, r6, r7}\n\t" + "subs r12, r12, #1\n\t" + "bne L_AES_set_encrypt_key_loop_192_%=\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r0, r7, #24\n\t" + "lsr r0, r0, #24\n\t" +#else + "uxtb r0, r7\n\t" +#endif +#else + "ubfx r0, r7, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r1, r7, #16\n\t" + "lsr r1, r1, #24\n\t" +#else + "uxtb r1, r7, ror #8\n\t" +#endif +#else + "ubfx r1, r7, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r7, #8\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r7, ror #16\n\t" +#endif +#else + "ubfx r4, r7, #16, #8\n\t" +#endif + "lsr r7, r7, #24\n\t" + "ldrb r0, [r8, r0, lsl #2]\n\t" + "ldrb r1, [r8, r1, lsl #2]\n\t" + "ldrb r4, [r8, r4, lsl #2]\n\t" + "ldrb r7, [r8, r7, lsl #2]\n\t" + "eor r3, r7, r0, lsl #8\n\t" + "eor r3, r3, r1, lsl #16\n\t" + "eor r3, r3, r4, lsl #24\n\t" + "ldm %[ks]!, {r0, r1, r4, r5, r6, r7}\n\t" + "eor r0, r0, r3\n\t" + "ldm lr!, {r3}\n\t" + "eor r0, r0, r3\n\t" + "eor r1, r1, r0\n\t" + "eor r4, r4, r1\n\t" + "eor r5, r5, r4\n\t" + "stm %[ks], {r0, r1, r4, r5}\n\t" + "b L_AES_set_encrypt_key_end_%=\n\t" + "\n" + "L_AES_set_encrypt_key_start_128_%=: \n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[key]]\n\t" + "ldr r5, [%[key], #4]\n\t" +#else + "ldrd r4, r5, [%[key]]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[key], #8]\n\t" + "ldr r7, [%[key], #12]\n\t" +#else + "ldrd r6, r7, [%[key], #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + /* REV r4, r4 */ + "eor r3, r4, r4, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "eor r4, r4, r3, lsr #8\n\t" + /* REV r5, r5 */ + "eor r3, r5, r5, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r5, r5, #8\n\t" + "eor r5, r5, r3, lsr #8\n\t" + /* REV r6, r6 */ + "eor r3, r6, r6, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "eor r6, r6, r3, lsr #8\n\t" + /* REV r7, r7 */ + "eor r3, r7, r7, ror #16\n\t" + "bic r3, r3, #0xff0000\n\t" + "ror r7, r7, #8\n\t" + "eor r7, r7, r3, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm %[ks], {r4, r5, r6, r7}\n\t" + "mov r12, #10\n\t" + "\n" + "L_AES_set_encrypt_key_loop_128_%=: \n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r7, #24\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r7\n\t" +#endif +#else + "ubfx r4, r7, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r7, #16\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r7, ror #8\n\t" +#endif +#else + "ubfx r5, r7, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r7, #8\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r7, ror #16\n\t" +#endif +#else + "ubfx r6, r7, #16, #8\n\t" +#endif + "lsr r7, r7, #24\n\t" + "ldrb r4, [r8, r4, lsl #2]\n\t" + "ldrb r5, [r8, r5, lsl #2]\n\t" + "ldrb r6, [r8, r6, lsl #2]\n\t" + "ldrb r7, [r8, r7, lsl #2]\n\t" + "eor r3, r7, r4, lsl #8\n\t" + "eor r3, r3, r5, lsl #16\n\t" + "eor r3, r3, r6, lsl #24\n\t" + "ldm %[ks]!, {r4, r5, r6, r7}\n\t" + "eor r4, r4, r3\n\t" + "ldm lr!, {r3}\n\t" + "eor r4, r4, r3\n\t" + "eor r5, r5, r4\n\t" + "eor r6, r6, r5\n\t" + "eor r7, r7, r6\n\t" + "stm %[ks], {r4, r5, r6, r7}\n\t" + "subs r12, r12, #1\n\t" + "bne L_AES_set_encrypt_key_loop_128_%=\n\t" + "\n" + "L_AES_set_encrypt_key_end_%=: \n\t" + : [key] "+r" (key), [len] "+r" (len), [ks] "+r" (ks), [L_AES_ARM32_te] "+r" (L_AES_ARM32_te_c), [L_AES_ARM32_rcon] "+r" (L_AES_ARM32_rcon_c) + : + : "memory", "r12", "lr", "r5", "r6", "r7", "r8", "cc" + ); +} + +void AES_encrypt_block(const uint32_t* te, int nr, int len, const uint32_t* ks); +void AES_encrypt_block(const uint32_t* te_p, int nr_p, int len_p, const uint32_t* ks_p) +{ + register const uint32_t* te asm ("r0") = (const uint32_t*)te_p; + register int nr asm ("r1") = (int)nr_p; + register int len asm ("r2") = (int)len_p; + register const uint32_t* ks asm ("r3") = (const uint32_t*)ks_p; + + __asm__ __volatile__ ( + "\n" + "L_AES_encrypt_block_nr_%=: \n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r5, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r5, ror #16\n\t" +#endif +#else + "ubfx r8, r5, #16, #8\n\t" +#endif + "lsr r11, r4, #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r6, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r6, ror #8\n\t" +#endif +#else + "ubfx lr, r6, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r7, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r7\n\t" +#endif +#else + "ubfx r2, r7, #0, #8\n\t" +#endif + "ldr r8, [%[te], r8, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r9, r6, #8\n\t" + "lsr r9, r9, #24\n\t" +#else + "uxtb r9, r6, ror #16\n\t" +#endif +#else + "ubfx r9, r6, #16, #8\n\t" +#endif + "eor r8, r8, r11, ror #24\n\t" + "lsr r11, r5, #24\n\t" + "eor r8, r8, lr, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r7, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r7, ror #8\n\t" +#endif +#else + "ubfx lr, r7, #8, #8\n\t" +#endif + "eor r8, r8, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r4, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r4\n\t" +#endif +#else + "ubfx r2, r4, #0, #8\n\t" +#endif + "ldr r9, [%[te], r9, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r10, r7, #8\n\t" + "lsr r10, r10, #24\n\t" +#else + "uxtb r10, r7, ror #16\n\t" +#endif +#else + "ubfx r10, r7, #16, #8\n\t" +#endif + "eor r9, r9, r11, ror #24\n\t" + "lsr r11, r6, #24\n\t" + "eor r9, r9, lr, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r4, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r4, ror #8\n\t" +#endif +#else + "ubfx lr, r4, #8, #8\n\t" +#endif + "eor r9, r9, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r5, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r5\n\t" +#endif +#else + "ubfx r2, r5, #0, #8\n\t" +#endif + "ldr r10, [%[te], r10, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r6, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r6\n\t" +#endif +#else + "ubfx r6, r6, #0, #8\n\t" +#endif + "eor r10, r10, r11, ror #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r11, r4, #8\n\t" + "lsr r11, r11, #24\n\t" +#else + "uxtb r11, r4, ror #16\n\t" +#endif +#else + "ubfx r11, r4, #16, #8\n\t" +#endif + "eor r10, r10, lr, ror #8\n\t" + "lsr lr, r7, #24\n\t" + "eor r10, r10, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r5, #16\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r5, ror #8\n\t" +#endif +#else + "ubfx r2, r5, #8, #8\n\t" +#endif + "ldr r6, [%[te], r6, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" + "eor lr, lr, r6, ror #24\n\t" + "ldm %[ks]!, {r4, r5, r6, r7}\n\t" + "eor r11, r11, lr, ror #24\n\t" + "eor r11, r11, r2, ror #8\n\t" + /* XOR in Key Schedule */ + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r9, #8\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r9, ror #16\n\t" +#endif +#else + "ubfx r4, r9, #16, #8\n\t" +#endif + "lsr r7, r8, #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r10, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r10, ror #8\n\t" +#endif +#else + "ubfx lr, r10, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r11, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r11\n\t" +#endif +#else + "ubfx r2, r11, #0, #8\n\t" +#endif + "ldr r4, [%[te], r4, lsl #2]\n\t" + "ldr r7, [%[te], r7, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r10, #8\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r10, ror #16\n\t" +#endif +#else + "ubfx r5, r10, #16, #8\n\t" +#endif + "eor r4, r4, r7, ror #24\n\t" + "lsr r7, r9, #24\n\t" + "eor r4, r4, lr, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r11, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r11, ror #8\n\t" +#endif +#else + "ubfx lr, r11, #8, #8\n\t" +#endif + "eor r4, r4, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r8, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r8\n\t" +#endif +#else + "ubfx r2, r8, #0, #8\n\t" +#endif + "ldr r5, [%[te], r5, lsl #2]\n\t" + "ldr r7, [%[te], r7, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r11, #8\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r11, ror #16\n\t" +#endif +#else + "ubfx r6, r11, #16, #8\n\t" +#endif + "eor r5, r5, r7, ror #24\n\t" + "lsr r7, r10, #24\n\t" + "eor r5, r5, lr, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r8, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r8, ror #8\n\t" +#endif +#else + "ubfx lr, r8, #8, #8\n\t" +#endif + "eor r5, r5, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r9, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r9\n\t" +#endif +#else + "ubfx r2, r9, #0, #8\n\t" +#endif + "ldr r6, [%[te], r6, lsl #2]\n\t" + "ldr r7, [%[te], r7, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r10, r10, #24\n\t" + "lsr r10, r10, #24\n\t" +#else + "uxtb r10, r10\n\t" +#endif +#else + "ubfx r10, r10, #0, #8\n\t" +#endif + "eor r6, r6, r7, ror #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r8, #8\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r8, ror #16\n\t" +#endif +#else + "ubfx r7, r8, #16, #8\n\t" +#endif + "eor r6, r6, lr, ror #8\n\t" + "lsr lr, r11, #24\n\t" + "eor r6, r6, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r9, #16\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r9, ror #8\n\t" +#endif +#else + "ubfx r2, r9, #8, #8\n\t" +#endif + "ldr r10, [%[te], r10, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r7, [%[te], r7, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" + "eor lr, lr, r10, ror #24\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + "eor r7, r7, lr, ror #24\n\t" + "eor r7, r7, r2, ror #8\n\t" + /* XOR in Key Schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "subs %[nr], %[nr], #1\n\t" + "bne L_AES_encrypt_block_nr_%=\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r5, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r5, ror #16\n\t" +#endif +#else + "ubfx r8, r5, #16, #8\n\t" +#endif + "lsr r11, r4, #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r6, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r6, ror #8\n\t" +#endif +#else + "ubfx lr, r6, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r7, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r7\n\t" +#endif +#else + "ubfx r2, r7, #0, #8\n\t" +#endif + "ldr r8, [%[te], r8, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r9, r6, #8\n\t" + "lsr r9, r9, #24\n\t" +#else + "uxtb r9, r6, ror #16\n\t" +#endif +#else + "ubfx r9, r6, #16, #8\n\t" +#endif + "eor r8, r8, r11, ror #24\n\t" + "lsr r11, r5, #24\n\t" + "eor r8, r8, lr, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r7, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r7, ror #8\n\t" +#endif +#else + "ubfx lr, r7, #8, #8\n\t" +#endif + "eor r8, r8, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r4, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r4\n\t" +#endif +#else + "ubfx r2, r4, #0, #8\n\t" +#endif + "ldr r9, [%[te], r9, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r10, r7, #8\n\t" + "lsr r10, r10, #24\n\t" +#else + "uxtb r10, r7, ror #16\n\t" +#endif +#else + "ubfx r10, r7, #16, #8\n\t" +#endif + "eor r9, r9, r11, ror #24\n\t" + "lsr r11, r6, #24\n\t" + "eor r9, r9, lr, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r4, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r4, ror #8\n\t" +#endif +#else + "ubfx lr, r4, #8, #8\n\t" +#endif + "eor r9, r9, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r5, #24\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r5\n\t" +#endif +#else + "ubfx r2, r5, #0, #8\n\t" +#endif + "ldr r10, [%[te], r10, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r6, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r6\n\t" +#endif +#else + "ubfx r6, r6, #0, #8\n\t" +#endif + "eor r10, r10, r11, ror #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r11, r4, #8\n\t" + "lsr r11, r11, #24\n\t" +#else + "uxtb r11, r4, ror #16\n\t" +#endif +#else + "ubfx r11, r4, #16, #8\n\t" +#endif + "eor r10, r10, lr, ror #8\n\t" + "lsr lr, r7, #24\n\t" + "eor r10, r10, r2, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r5, #16\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r5, ror #8\n\t" +#endif +#else + "ubfx r2, r5, #8, #8\n\t" +#endif + "ldr r6, [%[te], r6, lsl #2]\n\t" + "ldr lr, [%[te], lr, lsl #2]\n\t" + "ldr r11, [%[te], r11, lsl #2]\n\t" + "ldr r2, [%[te], r2, lsl #2]\n\t" + "eor lr, lr, r6, ror #24\n\t" + "ldm %[ks]!, {r4, r5, r6, r7}\n\t" + "eor r11, r11, lr, ror #24\n\t" + "eor r11, r11, r2, ror #8\n\t" + /* XOR in Key Schedule */ + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r11, #24\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r11\n\t" +#endif +#else + "ubfx r4, r11, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r10, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r10, ror #8\n\t" +#endif +#else + "ubfx r7, r10, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r9, #8\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r9, ror #16\n\t" +#endif +#else + "ubfx lr, r9, #16, #8\n\t" +#endif + "lsr r2, r8, #24\n\t" + "ldrb r4, [%[te], r4, lsl #2]\n\t" + "ldrb r7, [%[te], r7, lsl #2]\n\t" + "ldrb lr, [%[te], lr, lsl #2]\n\t" + "ldrb r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r8, #24\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r8\n\t" +#endif +#else + "ubfx r5, r8, #0, #8\n\t" +#endif + "eor r4, r4, r7, lsl #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r11, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r11, ror #8\n\t" +#endif +#else + "ubfx r7, r11, #8, #8\n\t" +#endif + "eor r4, r4, lr, lsl #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r10, #8\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r10, ror #16\n\t" +#endif +#else + "ubfx lr, r10, #16, #8\n\t" +#endif + "eor r4, r4, r2, lsl #24\n\t" + "lsr r2, r9, #24\n\t" + "ldrb r5, [%[te], r5, lsl #2]\n\t" + "ldrb r7, [%[te], r7, lsl #2]\n\t" + "ldrb lr, [%[te], lr, lsl #2]\n\t" + "ldrb r2, [%[te], r2, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r9, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r9\n\t" +#endif +#else + "ubfx r6, r9, #0, #8\n\t" +#endif + "eor r5, r5, r7, lsl #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r8, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r8, ror #8\n\t" +#endif +#else + "ubfx r7, r8, #8, #8\n\t" +#endif + "eor r5, r5, lr, lsl #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r11, #8\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r11, ror #16\n\t" +#endif +#else + "ubfx lr, r11, #16, #8\n\t" +#endif + "eor r5, r5, r2, lsl #24\n\t" + "lsr r2, r10, #24\n\t" + "ldrb r6, [%[te], r6, lsl #2]\n\t" + "ldrb r7, [%[te], r7, lsl #2]\n\t" + "ldrb lr, [%[te], lr, lsl #2]\n\t" + "ldrb r2, [%[te], r2, lsl #2]\n\t" + "lsr r11, r11, #24\n\t" + "eor r6, r6, r7, lsl #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r10, #24\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r10\n\t" +#endif +#else + "ubfx r7, r10, #0, #8\n\t" +#endif + "eor r6, r6, lr, lsl #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r9, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r9, ror #8\n\t" +#endif +#else + "ubfx lr, r9, #8, #8\n\t" +#endif + "eor r6, r6, r2, lsl #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r2, r8, #8\n\t" + "lsr r2, r2, #24\n\t" +#else + "uxtb r2, r8, ror #16\n\t" +#endif +#else + "ubfx r2, r8, #16, #8\n\t" +#endif + "ldrb r11, [%[te], r11, lsl #2]\n\t" + "ldrb r7, [%[te], r7, lsl #2]\n\t" + "ldrb lr, [%[te], lr, lsl #2]\n\t" + "ldrb r2, [%[te], r2, lsl #2]\n\t" + "eor lr, lr, r11, lsl #16\n\t" + "ldm %[ks], {r8, r9, r10, r11}\n\t" + "eor r7, r7, lr, lsl #8\n\t" + "eor r7, r7, r2, lsl #16\n\t" + /* XOR in Key Schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + : [te] "+r" (te), [nr] "+r" (nr), [len] "+r" (len), [ks] "+r" (ks) + : + : "memory", "lr", "cc" + ); +} + +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +static const uint32_t* L_AES_ARM32_te_ecb = L_AES_ARM32_te_data; +void AES_ECB_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr); +void AES_ECB_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p) +{ + register const unsigned char* in asm ("r0") = (const unsigned char*)in_p; + register unsigned char* out asm ("r1") = (unsigned char*)out_p; + register unsigned long len asm ("r2") = (unsigned long)len_p; + register const unsigned char* ks asm ("r3") = (const unsigned char*)ks_p; + register int nr asm ("r4") = (int)nr_p; + register uint32_t* L_AES_ARM32_te_ecb_c asm ("r5") = (uint32_t*)L_AES_ARM32_te_ecb; + + __asm__ __volatile__ ( + "mov lr, %[in]\n\t" + "mov r0, %[L_AES_ARM32_te_ecb]\n\t" + "mov r12, r4\n\t" + "push {%[ks]}\n\t" + "cmp r12, #10\n\t" + "beq L_AES_ECB_encrypt_start_block_128_%=\n\t" + "cmp r12, #12\n\t" + "beq L_AES_ECB_encrypt_start_block_192_%=\n\t" + "\n" + "L_AES_ECB_encrypt_loop_block_256_%=: \n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "push {r1, %[len], lr}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #6\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_ECB_encrypt_loop_block_256_%=\n\t" + "b L_AES_ECB_encrypt_end_%=\n\t" + "\n" + "L_AES_ECB_encrypt_start_block_192_%=: \n\t" + "\n" + "L_AES_ECB_encrypt_loop_block_192_%=: \n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "push {r1, %[len], lr}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #5\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_ECB_encrypt_loop_block_192_%=\n\t" + "b L_AES_ECB_encrypt_end_%=\n\t" + "\n" + "L_AES_ECB_encrypt_start_block_128_%=: \n\t" + "\n" + "L_AES_ECB_encrypt_loop_block_128_%=: \n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "push {r1, %[len], lr}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #4\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_ECB_encrypt_loop_block_128_%=\n\t" + "\n" + "L_AES_ECB_encrypt_end_%=: \n\t" + "pop {%[ks]}\n\t" + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [L_AES_ARM32_te_ecb] "+r" (L_AES_ARM32_te_ecb_c) + : + : "memory", "r12", "lr", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_CBC +static const uint32_t* L_AES_ARM32_te_cbc = L_AES_ARM32_te_data; +void AES_CBC_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* iv); +void AES_CBC_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* iv_p) +{ + register const unsigned char* in asm ("r0") = (const unsigned char*)in_p; + register unsigned char* out asm ("r1") = (unsigned char*)out_p; + register unsigned long len asm ("r2") = (unsigned long)len_p; + register const unsigned char* ks asm ("r3") = (const unsigned char*)ks_p; + register int nr asm ("r4") = (int)nr_p; + register unsigned char* iv asm ("r5") = (unsigned char*)iv_p; + register uint32_t* L_AES_ARM32_te_cbc_c asm ("r6") = (uint32_t*)L_AES_ARM32_te_cbc; + + __asm__ __volatile__ ( + "mov r8, r4\n\t" + "mov r9, r5\n\t" + "mov lr, %[in]\n\t" + "mov r0, %[L_AES_ARM32_te_cbc]\n\t" + "ldm r9, {r4, r5, r6, r7}\n\t" + "push {%[ks], r9}\n\t" + "cmp r8, #10\n\t" + "beq L_AES_CBC_encrypt_start_block_128_%=\n\t" + "cmp r8, #12\n\t" + "beq L_AES_CBC_encrypt_start_block_192_%=\n\t" + "\n" + "L_AES_CBC_encrypt_loop_block_256_%=: \n\t" + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "push {r1, %[len], lr}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #6\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CBC_encrypt_loop_block_256_%=\n\t" + "b L_AES_CBC_encrypt_end_%=\n\t" + "\n" + "L_AES_CBC_encrypt_start_block_192_%=: \n\t" + "\n" + "L_AES_CBC_encrypt_loop_block_192_%=: \n\t" + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "push {r1, %[len], lr}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #5\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CBC_encrypt_loop_block_192_%=\n\t" + "b L_AES_CBC_encrypt_end_%=\n\t" + "\n" + "L_AES_CBC_encrypt_start_block_128_%=: \n\t" + "\n" + "L_AES_CBC_encrypt_loop_block_128_%=: \n\t" + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "push {r1, %[len], lr}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #4\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CBC_encrypt_loop_block_128_%=\n\t" + "\n" + "L_AES_CBC_encrypt_end_%=: \n\t" + "pop {%[ks], r9}\n\t" + "stm r9, {r4, r5, r6, r7}\n\t" + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [iv] "+r" (iv), [L_AES_ARM32_te_cbc] "+r" (L_AES_ARM32_te_cbc_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER +static const uint32_t* L_AES_ARM32_te_ctr = L_AES_ARM32_te_data; +void AES_CTR_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr); +void AES_CTR_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* ctr_p) +{ + register const unsigned char* in asm ("r0") = (const unsigned char*)in_p; + register unsigned char* out asm ("r1") = (unsigned char*)out_p; + register unsigned long len asm ("r2") = (unsigned long)len_p; + register const unsigned char* ks asm ("r3") = (const unsigned char*)ks_p; + register int nr asm ("r4") = (int)nr_p; + register unsigned char* ctr asm ("r5") = (unsigned char*)ctr_p; + register uint32_t* L_AES_ARM32_te_ctr_c asm ("r6") = (uint32_t*)L_AES_ARM32_te_ctr; + + __asm__ __volatile__ ( + "mov r12, r4\n\t" + "mov r8, r5\n\t" + "mov lr, %[in]\n\t" + "mov r0, %[L_AES_ARM32_te_ctr]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r10, r4, r4, ror #16\n\t" + "eor r11, r5, r5, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "eor r4, r4, r10, lsr #8\n\t" + "eor r5, r5, r11, lsr #8\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm r8, {r4, r5, r6, r7}\n\t" + "push {%[ks], r8}\n\t" + "cmp r12, #10\n\t" + "beq L_AES_CTR_encrypt_start_block_128_%=\n\t" + "cmp r12, #12\n\t" + "beq L_AES_CTR_encrypt_start_block_192_%=\n\t" + "\n" + "L_AES_CTR_encrypt_loop_block_256_%=: \n\t" + "push {r1, %[len], lr}\n\t" + "ldr lr, [sp, #16]\n\t" + "adds r11, r7, #1\n\t" + "adcs r10, r6, #0\n\t" + "adcs r9, r5, #0\n\t" + "adc r8, r4, #0\n\t" + "stm lr, {r8, r9, r10, r11}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #6\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "ldr r8, [sp, #4]\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CTR_encrypt_loop_block_256_%=\n\t" + "b L_AES_CTR_encrypt_end_%=\n\t" + "\n" + "L_AES_CTR_encrypt_start_block_192_%=: \n\t" + "\n" + "L_AES_CTR_encrypt_loop_block_192_%=: \n\t" + "push {r1, %[len], lr}\n\t" + "ldr lr, [sp, #16]\n\t" + "adds r11, r7, #1\n\t" + "adcs r10, r6, #0\n\t" + "adcs r9, r5, #0\n\t" + "adc r8, r4, #0\n\t" + "stm lr, {r8, r9, r10, r11}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #5\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "ldr r8, [sp, #4]\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CTR_encrypt_loop_block_192_%=\n\t" + "b L_AES_CTR_encrypt_end_%=\n\t" + "\n" + "L_AES_CTR_encrypt_start_block_128_%=: \n\t" + "\n" + "L_AES_CTR_encrypt_loop_block_128_%=: \n\t" + "push {r1, %[len], lr}\n\t" + "ldr lr, [sp, #16]\n\t" + "adds r11, r7, #1\n\t" + "adcs r10, r6, #0\n\t" + "adcs r9, r5, #0\n\t" + "adc r8, r4, #0\n\t" + "stm lr, {r8, r9, r10, r11}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #4\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "ldr r8, [sp, #4]\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CTR_encrypt_loop_block_128_%=\n\t" + "\n" + "L_AES_CTR_encrypt_end_%=: \n\t" + "pop {%[ks], r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r10, r4, r4, ror #16\n\t" + "eor r11, r5, r5, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "eor r4, r4, r10, lsr #8\n\t" + "eor r5, r5, r11, lsr #8\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm r8, {r4, r5, r6, r7}\n\t" + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [ctr] "+r" (ctr), [L_AES_ARM32_te_ctr] "+r" (L_AES_ARM32_te_ctr_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT +#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC) +void AES_decrypt_block(const uint32_t* td, int nr, const uint8_t* td4); +void AES_decrypt_block(const uint32_t* td_p, int nr_p, const uint8_t* td4_p) +{ + register const uint32_t* td asm ("r0") = (const uint32_t*)td_p; + register int nr asm ("r1") = (int)nr_p; + register const uint8_t* td4 asm ("r2") = (const uint8_t*)td4_p; + + __asm__ __volatile__ ( + "\n" + "L_AES_decrypt_block_nr_%=: \n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r7, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r7, ror #16\n\t" +#endif +#else + "ubfx r8, r7, #16, #8\n\t" +#endif + "lsr r11, r4, #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r6, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r6, ror #8\n\t" +#endif +#else + "ubfx r12, r6, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r5, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r5\n\t" +#endif +#else + "ubfx lr, r5, #0, #8\n\t" +#endif + "ldr r8, [%[td], r8, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r9, r4, #8\n\t" + "lsr r9, r9, #24\n\t" +#else + "uxtb r9, r4, ror #16\n\t" +#endif +#else + "ubfx r9, r4, #16, #8\n\t" +#endif + "eor r8, r8, r11, ror #24\n\t" + "lsr r11, r5, #24\n\t" + "eor r8, r8, r12, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r7, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r7, ror #8\n\t" +#endif +#else + "ubfx r12, r7, #8, #8\n\t" +#endif + "eor r8, r8, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r6, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r6\n\t" +#endif +#else + "ubfx lr, r6, #0, #8\n\t" +#endif + "ldr r9, [%[td], r9, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r10, r5, #8\n\t" + "lsr r10, r10, #24\n\t" +#else + "uxtb r10, r5, ror #16\n\t" +#endif +#else + "ubfx r10, r5, #16, #8\n\t" +#endif + "eor r9, r9, r11, ror #24\n\t" + "lsr r11, r6, #24\n\t" + "eor r9, r9, r12, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r4, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r4, ror #8\n\t" +#endif +#else + "ubfx r12, r4, #8, #8\n\t" +#endif + "eor r9, r9, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r7, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r7\n\t" +#endif +#else + "ubfx lr, r7, #0, #8\n\t" +#endif + "ldr r10, [%[td], r10, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r4, #24\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r4\n\t" +#endif +#else + "ubfx r4, r4, #0, #8\n\t" +#endif + "eor r10, r10, r11, ror #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r11, r6, #8\n\t" + "lsr r11, r11, #24\n\t" +#else + "uxtb r11, r6, ror #16\n\t" +#endif +#else + "ubfx r11, r6, #16, #8\n\t" +#endif + "eor r10, r10, r12, ror #8\n\t" + "lsr r12, r7, #24\n\t" + "eor r10, r10, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r5, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r5, ror #8\n\t" +#endif +#else + "ubfx lr, r5, #8, #8\n\t" +#endif + "ldr r4, [%[td], r4, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" + "eor r12, r12, r4, ror #24\n\t" + "ldm r3!, {r4, r5, r6, r7}\n\t" + "eor r11, r11, lr, ror #8\n\t" + "eor r11, r11, r12, ror #24\n\t" + /* XOR in Key Schedule */ + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r11, #8\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r11, ror #16\n\t" +#endif +#else + "ubfx r4, r11, #16, #8\n\t" +#endif + "lsr r7, r8, #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r10, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r10, ror #8\n\t" +#endif +#else + "ubfx r12, r10, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r9, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r9\n\t" +#endif +#else + "ubfx lr, r9, #0, #8\n\t" +#endif + "ldr r4, [%[td], r4, lsl #2]\n\t" + "ldr r7, [%[td], r7, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r8, #8\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r8, ror #16\n\t" +#endif +#else + "ubfx r5, r8, #16, #8\n\t" +#endif + "eor r4, r4, r7, ror #24\n\t" + "lsr r7, r9, #24\n\t" + "eor r4, r4, r12, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r11, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r11, ror #8\n\t" +#endif +#else + "ubfx r12, r11, #8, #8\n\t" +#endif + "eor r4, r4, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r10, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r10\n\t" +#endif +#else + "ubfx lr, r10, #0, #8\n\t" +#endif + "ldr r5, [%[td], r5, lsl #2]\n\t" + "ldr r7, [%[td], r7, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r9, #8\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r9, ror #16\n\t" +#endif +#else + "ubfx r6, r9, #16, #8\n\t" +#endif + "eor r5, r5, r7, ror #24\n\t" + "lsr r7, r10, #24\n\t" + "eor r5, r5, r12, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r8, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r8, ror #8\n\t" +#endif +#else + "ubfx r12, r8, #8, #8\n\t" +#endif + "eor r5, r5, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r11, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r11\n\t" +#endif +#else + "ubfx lr, r11, #0, #8\n\t" +#endif + "ldr r6, [%[td], r6, lsl #2]\n\t" + "ldr r7, [%[td], r7, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r8, #24\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r8\n\t" +#endif +#else + "ubfx r8, r8, #0, #8\n\t" +#endif + "eor r6, r6, r7, ror #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r10, #8\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r10, ror #16\n\t" +#endif +#else + "ubfx r7, r10, #16, #8\n\t" +#endif + "eor r6, r6, r12, ror #8\n\t" + "lsr r12, r11, #24\n\t" + "eor r6, r6, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r9, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r9, ror #8\n\t" +#endif +#else + "ubfx lr, r9, #8, #8\n\t" +#endif + "ldr r8, [%[td], r8, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr r7, [%[td], r7, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" + "eor r12, r12, r8, ror #24\n\t" + "ldm r3!, {r8, r9, r10, r11}\n\t" + "eor r7, r7, lr, ror #8\n\t" + "eor r7, r7, r12, ror #24\n\t" + /* XOR in Key Schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "subs %[nr], %[nr], #1\n\t" + "bne L_AES_decrypt_block_nr_%=\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r8, r7, #8\n\t" + "lsr r8, r8, #24\n\t" +#else + "uxtb r8, r7, ror #16\n\t" +#endif +#else + "ubfx r8, r7, #16, #8\n\t" +#endif + "lsr r11, r4, #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r6, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r6, ror #8\n\t" +#endif +#else + "ubfx r12, r6, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r5, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r5\n\t" +#endif +#else + "ubfx lr, r5, #0, #8\n\t" +#endif + "ldr r8, [%[td], r8, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r9, r4, #8\n\t" + "lsr r9, r9, #24\n\t" +#else + "uxtb r9, r4, ror #16\n\t" +#endif +#else + "ubfx r9, r4, #16, #8\n\t" +#endif + "eor r8, r8, r11, ror #24\n\t" + "lsr r11, r5, #24\n\t" + "eor r8, r8, r12, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r7, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r7, ror #8\n\t" +#endif +#else + "ubfx r12, r7, #8, #8\n\t" +#endif + "eor r8, r8, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r6, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r6\n\t" +#endif +#else + "ubfx lr, r6, #0, #8\n\t" +#endif + "ldr r9, [%[td], r9, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r10, r5, #8\n\t" + "lsr r10, r10, #24\n\t" +#else + "uxtb r10, r5, ror #16\n\t" +#endif +#else + "ubfx r10, r5, #16, #8\n\t" +#endif + "eor r9, r9, r11, ror #24\n\t" + "lsr r11, r6, #24\n\t" + "eor r9, r9, r12, ror #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r4, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r4, ror #8\n\t" +#endif +#else + "ubfx r12, r4, #8, #8\n\t" +#endif + "eor r9, r9, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r7, #24\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r7\n\t" +#endif +#else + "ubfx lr, r7, #0, #8\n\t" +#endif + "ldr r10, [%[td], r10, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r4, #24\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r4\n\t" +#endif +#else + "ubfx r4, r4, #0, #8\n\t" +#endif + "eor r10, r10, r11, ror #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r11, r6, #8\n\t" + "lsr r11, r11, #24\n\t" +#else + "uxtb r11, r6, ror #16\n\t" +#endif +#else + "ubfx r11, r6, #16, #8\n\t" +#endif + "eor r10, r10, r12, ror #8\n\t" + "lsr r12, r7, #24\n\t" + "eor r10, r10, lr, ror #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r5, #16\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r5, ror #8\n\t" +#endif +#else + "ubfx lr, r5, #8, #8\n\t" +#endif + "ldr r4, [%[td], r4, lsl #2]\n\t" + "ldr r12, [%[td], r12, lsl #2]\n\t" + "ldr r11, [%[td], r11, lsl #2]\n\t" + "ldr lr, [%[td], lr, lsl #2]\n\t" + "eor r12, r12, r4, ror #24\n\t" + "ldm r3!, {r4, r5, r6, r7}\n\t" + "eor r11, r11, lr, ror #8\n\t" + "eor r11, r11, r12, ror #24\n\t" + /* XOR in Key Schedule */ + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r4, r9, #24\n\t" + "lsr r4, r4, #24\n\t" +#else + "uxtb r4, r9\n\t" +#endif +#else + "ubfx r4, r9, #0, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r10, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r10, ror #8\n\t" +#endif +#else + "ubfx r7, r10, #8, #8\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r11, #8\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r11, ror #16\n\t" +#endif +#else + "ubfx r12, r11, #16, #8\n\t" +#endif + "lsr lr, r8, #24\n\t" + "ldrb r4, [%[td4], r4]\n\t" + "ldrb r7, [%[td4], r7]\n\t" + "ldrb r12, [%[td4], r12]\n\t" + "ldrb lr, [%[td4], lr]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r5, r10, #24\n\t" + "lsr r5, r5, #24\n\t" +#else + "uxtb r5, r10\n\t" +#endif +#else + "ubfx r5, r10, #0, #8\n\t" +#endif + "eor r4, r4, r7, lsl #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r11, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r11, ror #8\n\t" +#endif +#else + "ubfx r7, r11, #8, #8\n\t" +#endif + "eor r4, r4, r12, lsl #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r8, #8\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r8, ror #16\n\t" +#endif +#else + "ubfx r12, r8, #16, #8\n\t" +#endif + "eor r4, r4, lr, lsl #24\n\t" + "lsr lr, r9, #24\n\t" + "ldrb r7, [%[td4], r7]\n\t" + "ldrb lr, [%[td4], lr]\n\t" + "ldrb r5, [%[td4], r5]\n\t" + "ldrb r12, [%[td4], r12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r6, r11, #24\n\t" + "lsr r6, r6, #24\n\t" +#else + "uxtb r6, r11\n\t" +#endif +#else + "ubfx r6, r11, #0, #8\n\t" +#endif + "eor r5, r5, r7, lsl #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r8, #16\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r8, ror #8\n\t" +#endif +#else + "ubfx r7, r8, #8, #8\n\t" +#endif + "eor r5, r5, r12, lsl #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r9, #8\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r9, ror #16\n\t" +#endif +#else + "ubfx r12, r9, #16, #8\n\t" +#endif + "eor r5, r5, lr, lsl #24\n\t" + "lsr lr, r10, #24\n\t" + "ldrb r7, [%[td4], r7]\n\t" + "ldrb lr, [%[td4], lr]\n\t" + "ldrb r6, [%[td4], r6]\n\t" + "ldrb r12, [%[td4], r12]\n\t" + "lsr r11, r11, #24\n\t" + "eor r6, r6, r7, lsl #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r7, r8, #24\n\t" + "lsr r7, r7, #24\n\t" +#else + "uxtb r7, r8\n\t" +#endif +#else + "ubfx r7, r8, #0, #8\n\t" +#endif + "eor r6, r6, r12, lsl #16\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl r12, r9, #16\n\t" + "lsr r12, r12, #24\n\t" +#else + "uxtb r12, r9, ror #8\n\t" +#endif +#else + "ubfx r12, r9, #8, #8\n\t" +#endif + "eor r6, r6, lr, lsl #24\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl lr, r10, #8\n\t" + "lsr lr, lr, #24\n\t" +#else + "uxtb lr, r10, ror #16\n\t" +#endif +#else + "ubfx lr, r10, #16, #8\n\t" +#endif + "ldrb r11, [%[td4], r11]\n\t" + "ldrb r12, [%[td4], r12]\n\t" + "ldrb r7, [%[td4], r7]\n\t" + "ldrb lr, [%[td4], lr]\n\t" + "eor r12, r12, r11, lsl #16\n\t" + "ldm r3, {r8, r9, r10, r11}\n\t" + "eor r7, r7, r12, lsl #8\n\t" + "eor r7, r7, lr, lsl #16\n\t" + /* XOR in Key Schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + : [td] "+r" (td), [nr] "+r" (nr), [td4] "+r" (td4) + : + : "memory", "lr", "cc" + ); +} + +static const uint32_t* L_AES_ARM32_td_ecb = L_AES_ARM32_td_data; +static const unsigned char L_AES_ARM32_td4[] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, + 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, + 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, + 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, + 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, + 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, + 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, + 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, + 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, + 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, + 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, + 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, + 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, + 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, + 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, + 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, +}; + +#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +void AES_ECB_decrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr); +void AES_ECB_decrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p) +{ + register const unsigned char* in asm ("r0") = (const unsigned char*)in_p; + register unsigned char* out asm ("r1") = (unsigned char*)out_p; + register unsigned long len asm ("r2") = (unsigned long)len_p; + register const unsigned char* ks asm ("r3") = (const unsigned char*)ks_p; + register int nr asm ("r4") = (int)nr_p; + register uint32_t* L_AES_ARM32_td_ecb_c asm ("r5") = (uint32_t*)L_AES_ARM32_td_ecb; + register unsigned char* L_AES_ARM32_td4_c asm ("r6") = (unsigned char*)&L_AES_ARM32_td4; + + __asm__ __volatile__ ( + "mov r8, r4\n\t" + "mov lr, %[in]\n\t" + "mov r0, %[L_AES_ARM32_td_ecb]\n\t" + "mov r12, %[len]\n\t" + "mov r2, %[L_AES_ARM32_td4]\n\t" + "cmp r8, #10\n\t" + "beq L_AES_ECB_decrypt_start_block_128_%=\n\t" + "cmp r8, #12\n\t" + "beq L_AES_ECB_decrypt_start_block_192_%=\n\t" + "\n" + "L_AES_ECB_decrypt_loop_block_256_%=: \n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "push {r1, %[ks], r12, lr}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #6\n\t" + "bl AES_decrypt_block\n\t" + "pop {r1, %[ks], r12, lr}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_ECB_decrypt_loop_block_256_%=\n\t" + "b L_AES_ECB_decrypt_end_%=\n\t" + "\n" + "L_AES_ECB_decrypt_start_block_192_%=: \n\t" + "\n" + "L_AES_ECB_decrypt_loop_block_192_%=: \n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "push {r1, %[ks], r12, lr}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #5\n\t" + "bl AES_decrypt_block\n\t" + "pop {r1, %[ks], r12, lr}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_ECB_decrypt_loop_block_192_%=\n\t" + "b L_AES_ECB_decrypt_end_%=\n\t" + "\n" + "L_AES_ECB_decrypt_start_block_128_%=: \n\t" + "\n" + "L_AES_ECB_decrypt_loop_block_128_%=: \n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "push {r1, %[ks], r12, lr}\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #4\n\t" + "bl AES_decrypt_block\n\t" + "pop {r1, %[ks], r12, lr}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_ECB_decrypt_loop_block_128_%=\n\t" + "\n" + "L_AES_ECB_decrypt_end_%=: \n\t" + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [L_AES_ARM32_td_ecb] "+r" (L_AES_ARM32_td_ecb_c), [L_AES_ARM32_td4] "+r" (L_AES_ARM32_td4_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_CBC +void AES_CBC_decrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* iv); +void AES_CBC_decrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* iv_p) +{ + register const unsigned char* in asm ("r0") = (const unsigned char*)in_p; + register unsigned char* out asm ("r1") = (unsigned char*)out_p; + register unsigned long len asm ("r2") = (unsigned long)len_p; + register const unsigned char* ks asm ("r3") = (const unsigned char*)ks_p; + register int nr asm ("r4") = (int)nr_p; + register unsigned char* iv asm ("r5") = (unsigned char*)iv_p; + register uint32_t* L_AES_ARM32_td_ecb_c asm ("r6") = (uint32_t*)L_AES_ARM32_td_ecb; + register unsigned char* L_AES_ARM32_td4_c asm ("r7") = (unsigned char*)&L_AES_ARM32_td4; + + __asm__ __volatile__ ( + "mov r8, r4\n\t" + "mov r4, r5\n\t" + "mov lr, %[in]\n\t" + "mov r0, %[L_AES_ARM32_td_ecb]\n\t" + "mov r12, %[len]\n\t" + "mov r2, %[L_AES_ARM32_td4]\n\t" + "push {%[ks]-r4}\n\t" + "cmp r8, #10\n\t" + "beq L_AES_CBC_decrypt_loop_block_128_%=\n\t" + "cmp r8, #12\n\t" + "beq L_AES_CBC_decrypt_loop_block_192_%=\n\t" + "\n" + "L_AES_CBC_decrypt_loop_block_256_%=: \n\t" + "push {r1, r12, lr}\n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [lr, #16]\n\t" + "str r5, [lr, #20]\n\t" +#else + "strd r4, r5, [lr, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [lr, #24]\n\t" + "str r7, [lr, #28]\n\t" +#else + "strd r6, r7, [lr, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #6\n\t" + "bl AES_decrypt_block\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm lr, {r8, r9, r10, r11}\n\t" + "pop {r1, r12, lr}\n\t" + "ldr %[ks], [sp]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "beq L_AES_CBC_decrypt_end_odd_%=\n\t" + "push {r1, r12, lr}\n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [lr]\n\t" + "str r5, [lr, #4]\n\t" +#else + "strd r4, r5, [lr]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [lr, #8]\n\t" + "str r7, [lr, #12]\n\t" +#else + "strd r6, r7, [lr, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #6\n\t" + "bl AES_decrypt_block\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [lr, #16]\n\t" + "ldr r9, [lr, #20]\n\t" +#else + "ldrd r8, r9, [lr, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [lr, #24]\n\t" + "ldr r11, [lr, #28]\n\t" +#else + "ldrd r10, r11, [lr, #24]\n\t" +#endif + "pop {r1, r12, lr}\n\t" + "ldr %[ks], [sp]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CBC_decrypt_loop_block_256_%=\n\t" + "b L_AES_CBC_decrypt_end_%=\n\t" + "\n" + "L_AES_CBC_decrypt_loop_block_192_%=: \n\t" + "push {r1, r12, lr}\n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [lr, #16]\n\t" + "str r5, [lr, #20]\n\t" +#else + "strd r4, r5, [lr, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [lr, #24]\n\t" + "str r7, [lr, #28]\n\t" +#else + "strd r6, r7, [lr, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #5\n\t" + "bl AES_decrypt_block\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm lr, {r8, r9, r10, r11}\n\t" + "pop {r1, r12, lr}\n\t" + "ldr %[ks], [sp]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "beq L_AES_CBC_decrypt_end_odd_%=\n\t" + "push {r1, r12, lr}\n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [lr]\n\t" + "str r5, [lr, #4]\n\t" +#else + "strd r4, r5, [lr]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [lr, #8]\n\t" + "str r7, [lr, #12]\n\t" +#else + "strd r6, r7, [lr, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #5\n\t" + "bl AES_decrypt_block\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [lr, #16]\n\t" + "ldr r9, [lr, #20]\n\t" +#else + "ldrd r8, r9, [lr, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [lr, #24]\n\t" + "ldr r11, [lr, #28]\n\t" +#else + "ldrd r10, r11, [lr, #24]\n\t" +#endif + "pop {r1, r12, lr}\n\t" + "ldr %[ks], [sp]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CBC_decrypt_loop_block_192_%=\n\t" + "b L_AES_CBC_decrypt_end_%=\n\t" + "\n" + "L_AES_CBC_decrypt_loop_block_128_%=: \n\t" + "push {r1, r12, lr}\n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [lr, #16]\n\t" + "str r5, [lr, #20]\n\t" +#else + "strd r4, r5, [lr, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [lr, #24]\n\t" + "str r7, [lr, #28]\n\t" +#else + "strd r6, r7, [lr, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #4\n\t" + "bl AES_decrypt_block\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm lr, {r8, r9, r10, r11}\n\t" + "pop {r1, r12, lr}\n\t" + "ldr %[ks], [sp]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "beq L_AES_CBC_decrypt_end_odd_%=\n\t" + "push {r1, r12, lr}\n\t" + "ldr r4, [lr]\n\t" + "ldr r5, [lr, #4]\n\t" + "ldr r6, [lr, #8]\n\t" + "ldr r7, [lr, #12]\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [lr]\n\t" + "str r5, [lr, #4]\n\t" +#else + "strd r4, r5, [lr]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [lr, #8]\n\t" + "str r7, [lr, #12]\n\t" +#else + "strd r6, r7, [lr, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #4\n\t" + "bl AES_decrypt_block\n\t" + "ldr lr, [sp, #16]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [lr, #16]\n\t" + "ldr r9, [lr, #20]\n\t" +#else + "ldrd r8, r9, [lr, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [lr, #24]\n\t" + "ldr r11, [lr, #28]\n\t" +#else + "ldrd r10, r11, [lr, #24]\n\t" +#endif + "pop {r1, r12, lr}\n\t" + "ldr %[ks], [sp]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "subs r12, r12, #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_CBC_decrypt_loop_block_128_%=\n\t" + "b L_AES_CBC_decrypt_end_%=\n\t" + "\n" + "L_AES_CBC_decrypt_end_odd_%=: \n\t" + "ldr r4, [sp, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [r4, #16]\n\t" + "ldr r9, [r4, #20]\n\t" +#else + "ldrd r8, r9, [r4, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [r4, #24]\n\t" + "ldr r11, [r4, #28]\n\t" +#else + "ldrd r10, r11, [r4, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [r4]\n\t" + "str r9, [r4, #4]\n\t" +#else + "strd r8, r9, [r4]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [r4, #8]\n\t" + "str r11, [r4, #12]\n\t" +#else + "strd r10, r11, [r4, #8]\n\t" +#endif + "\n" + "L_AES_CBC_decrypt_end_%=: \n\t" + "pop {%[ks]-r4}\n\t" + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [iv] "+r" (iv), [L_AES_ARM32_td_ecb] "+r" (L_AES_ARM32_td_ecb_c), [L_AES_ARM32_td4] "+r" (L_AES_ARM32_td4_c) + : + : "memory", "r12", "lr", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* HAVE_AES_CBC */ +#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#endif /* HAVE_AES_DECRYPT */ +#ifdef HAVE_AESGCM +static const uint32_t L_GCM_gmult_len_r[] = { + 0x00000000, 0x1c200000, 0x38400000, 0x24600000, + 0x70800000, 0x6ca00000, 0x48c00000, 0x54e00000, + 0xe1000000, 0xfd200000, 0xd9400000, 0xc5600000, + 0x91800000, 0x8da00000, 0xa9c00000, 0xb5e00000, +}; + +void GCM_gmult_len(unsigned char* x, const unsigned char** m, const unsigned char* data, unsigned long len); +void GCM_gmult_len(unsigned char* x_p, const unsigned char** m_p, const unsigned char* data_p, unsigned long len_p) +{ + register unsigned char* x asm ("r0") = (unsigned char*)x_p; + register const unsigned char** m asm ("r1") = (const unsigned char**)m_p; + register const unsigned char* data asm ("r2") = (const unsigned char*)data_p; + register unsigned long len asm ("r3") = (unsigned long)len_p; + register uint32_t* L_GCM_gmult_len_r_c asm ("r4") = (uint32_t*)&L_GCM_gmult_len_r; + + __asm__ __volatile__ ( + "mov lr, %[L_GCM_gmult_len_r]\n\t" + "\n" + "L_GCM_gmult_len_start_block_%=: \n\t" + "push {r3}\n\t" + "ldr r12, [r0, #12]\n\t" + "ldr %[len], [r2, #12]\n\t" + "eor r12, r12, %[len]\n\t" + "lsr %[len], r12, #24\n\t" + "and %[len], %[len], #15\n\t" + "add %[len], %[m], %[len], lsl #4\n\t" + "ldm %[len], {r8, r9, r10, r11}\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #28\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #16\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #20\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #8\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #12\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "and r4, r12, #15\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #4\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "ldr r12, [r0, #8]\n\t" + "ldr %[len], [r2, #8]\n\t" + "eor r12, r12, %[len]\n\t" + "lsr %[len], r12, #24\n\t" + "and %[len], %[len], #15\n\t" + "add %[len], %[m], %[len], lsl #4\n\t" + "ldm %[len], {r4, r5, r6, r7}\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #28\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #16\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #20\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #8\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #12\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "and r4, r12, #15\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #4\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "ldr r12, [r0, #4]\n\t" + "ldr %[len], [r2, #4]\n\t" + "eor r12, r12, %[len]\n\t" + "lsr %[len], r12, #24\n\t" + "and %[len], %[len], #15\n\t" + "add %[len], %[m], %[len], lsl #4\n\t" + "ldm %[len], {r4, r5, r6, r7}\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #28\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #16\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #20\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #8\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #12\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "and r4, r12, #15\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #4\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "ldr r12, [r0]\n\t" + "ldr %[len], [r2]\n\t" + "eor r12, r12, %[len]\n\t" + "lsr %[len], r12, #24\n\t" + "and %[len], %[len], #15\n\t" + "add %[len], %[m], %[len], lsl #4\n\t" + "ldm %[len], {r4, r5, r6, r7}\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #28\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #16\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #20\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #8\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #12\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "and r4, r12, #15\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" + "lsr r6, r10, #4\n\t" + "and %[len], r11, #15\n\t" + "lsr r11, r11, #4\n\t" + "lsr r4, r12, #4\n\t" + "eor r11, r11, r10, lsl #28\n\t" + "and r4, r4, #15\n\t" + "ldr %[len], [lr, r3, lsl #2]\n\t" + "add r4, %[m], r4, lsl #4\n\t" + "eor r10, r6, r9, lsl #28\n\t" + "lsr r9, r9, #4\n\t" + "ldm r4, {r4, r5, r6, r7}\n\t" + "eor r9, r9, r8, lsl #28\n\t" + "eor r8, %[len], r8, lsr #4\n\t" + "eor r8, r8, r4\n\t" + "eor r9, r9, r5\n\t" + "eor r10, r10, r6\n\t" + "eor r11, r11, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + /* REV r8, r8 */ + "eor %[len], r8, r8, ror #16\n\t" + "bic %[len], %[len], #0xff0000\n\t" + "ror r8, r8, #8\n\t" + "eor r8, r8, %[len], lsr #8\n\t" + /* REV r9, r9 */ + "eor %[len], r9, r9, ror #16\n\t" + "bic %[len], %[len], #0xff0000\n\t" + "ror r9, r9, #8\n\t" + "eor r9, r9, %[len], lsr #8\n\t" + /* REV r10, r10 */ + "eor %[len], r10, r10, ror #16\n\t" + "bic %[len], %[len], #0xff0000\n\t" + "ror r10, r10, #8\n\t" + "eor r10, r10, %[len], lsr #8\n\t" + /* REV r11, r11 */ + "eor %[len], r11, r11, ror #16\n\t" + "bic %[len], %[len], #0xff0000\n\t" + "ror r11, r11, #8\n\t" + "eor r11, r11, %[len], lsr #8\n\t" +#else + "rev r8, r8\n\t" + "rev r9, r9\n\t" + "rev r10, r10\n\t" + "rev r11, r11\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm %[x], {r8, r9, r10, r11}\n\t" + "pop {r3}\n\t" + "subs %[len], %[len], #16\n\t" + "add %[data], %[data], #16\n\t" + "bne L_GCM_gmult_len_start_block_%=\n\t" + : [x] "+r" (x), [m] "+r" (m), [data] "+r" (data), [len] "+r" (len), [L_GCM_gmult_len_r] "+r" (L_GCM_gmult_len_r_c) + : + : "memory", "r12", "lr", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +static const uint32_t* L_AES_ARM32_te_gcm = L_AES_ARM32_te_data; +void AES_GCM_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr); +void AES_GCM_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* ctr_p) +{ + register const unsigned char* in asm ("r0") = (const unsigned char*)in_p; + register unsigned char* out asm ("r1") = (unsigned char*)out_p; + register unsigned long len asm ("r2") = (unsigned long)len_p; + register const unsigned char* ks asm ("r3") = (const unsigned char*)ks_p; + register int nr asm ("r4") = (int)nr_p; + register unsigned char* ctr asm ("r5") = (unsigned char*)ctr_p; + register uint32_t* L_AES_ARM32_te_gcm_c asm ("r6") = (uint32_t*)L_AES_ARM32_te_gcm; + + __asm__ __volatile__ ( + "mov r12, r4\n\t" + "mov r8, r5\n\t" + "mov lr, %[in]\n\t" + "mov r0, %[L_AES_ARM32_te_gcm]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r10, r4, r4, ror #16\n\t" + "eor r11, r5, r5, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "eor r4, r4, r10, lsr #8\n\t" + "eor r5, r5, r11, lsr #8\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm r8, {r4, r5, r6, r7}\n\t" + "push {%[ks], r8}\n\t" + "cmp r12, #10\n\t" + "beq L_AES_GCM_encrypt_start_block_128_%=\n\t" + "cmp r12, #12\n\t" + "beq L_AES_GCM_encrypt_start_block_192_%=\n\t" + "\n" + "L_AES_GCM_encrypt_loop_block_256_%=: \n\t" + "push {r1, %[len], lr}\n\t" + "ldr lr, [sp, #16]\n\t" + "add r7, r7, #1\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + "str r7, [lr, #12]\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #6\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "ldr r8, [sp, #4]\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_GCM_encrypt_loop_block_256_%=\n\t" + "b L_AES_GCM_encrypt_end_%=\n\t" + "\n" + "L_AES_GCM_encrypt_start_block_192_%=: \n\t" + "\n" + "L_AES_GCM_encrypt_loop_block_192_%=: \n\t" + "push {r1, %[len], lr}\n\t" + "ldr lr, [sp, #16]\n\t" + "add r7, r7, #1\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + "str r7, [lr, #12]\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #5\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "ldr r8, [sp, #4]\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_GCM_encrypt_loop_block_192_%=\n\t" + "b L_AES_GCM_encrypt_end_%=\n\t" + "\n" + "L_AES_GCM_encrypt_start_block_128_%=: \n\t" + "\n" + "L_AES_GCM_encrypt_loop_block_128_%=: \n\t" + "push {r1, %[len], lr}\n\t" + "ldr lr, [sp, #16]\n\t" + "add r7, r7, #1\n\t" + "ldm %[ks]!, {r8, r9, r10, r11}\n\t" + "str r7, [lr, #12]\n\t" + /* Round: 0 - XOR in key schedule */ + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "mov r1, #4\n\t" + "bl AES_encrypt_block\n\t" + "pop {r1, %[len], lr}\n\t" + "ldr %[ks], [sp]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "ldr r8, [lr]\n\t" + "ldr r9, [lr, #4]\n\t" + "ldr r10, [lr, #8]\n\t" + "ldr r11, [lr, #12]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r6, r6, r10\n\t" + "eor r7, r7, r11\n\t" + "ldr r8, [sp, #4]\n\t" + "str r4, [%[out]]\n\t" + "str r5, [%[out], #4]\n\t" + "str r6, [%[out], #8]\n\t" + "str r7, [%[out], #12]\n\t" + "ldm r8, {r4, r5, r6, r7}\n\t" + "subs %[len], %[len], #16\n\t" + "add lr, lr, #16\n\t" + "add %[out], %[out], #16\n\t" + "bne L_AES_GCM_encrypt_loop_block_128_%=\n\t" + "\n" + "L_AES_GCM_encrypt_end_%=: \n\t" + "pop {%[ks], r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "eor r10, r4, r4, ror #16\n\t" + "eor r11, r5, r5, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "eor r4, r4, r10, lsr #8\n\t" + "eor r5, r5, r11, lsr #8\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#else + "rev r4, r4\n\t" + "rev r5, r5\n\t" + "rev r6, r6\n\t" + "rev r7, r7\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + "stm r8, {r4, r5, r6, r7}\n\t" + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [ctr] "+r" (ctr), [L_AES_ARM32_te_gcm] "+r" (L_AES_ARM32_te_gcm_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* HAVE_AESGCM */ +#endif /* !NO_AES */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */ +#endif /* WOLFSSL_ARMASM */ + +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,8 +30,10 @@ #include #ifdef WOLFSSL_ARMASM -#ifndef __aarch64__ -#ifdef HAVE_CURVE25519 +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE +#if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) +#if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) .text .align 4 @@ -42,6 +44,318 @@ .size fe_init,.-fe_init .text .align 4 + .globl fe_add_sub_op + .type fe_add_sub_op, %function +fe_add_sub_op: + push {lr} + # Add-Sub +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r2] + ldr r5, [r2, #4] +#else + ldrd r4, r5, [r2] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r3] + ldr r7, [r3, #4] +#else + ldrd r6, r7, [r3] +#endif + # Add + adds r8, r4, r6 + mov r12, #0 + adcs r9, r5, r7 + adc r12, r12, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0] + str r9, [r0, #4] +#else + strd r8, r9, [r0] +#endif + # Sub + subs r10, r4, r6 + sbcs r11, r5, r7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r1] + str r11, [r1, #4] +#else + strd r10, r11, [r1] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r2, #8] + ldr r5, [r2, #12] +#else + ldrd r4, r5, [r2, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r3, #8] + ldr r7, [r3, #12] +#else + ldrd r6, r7, [r3, #8] +#endif + # Sub + sbcs r10, r4, r6 + mov lr, #0 + sbcs r11, r5, r7 + adc lr, lr, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r1, #8] + str r11, [r1, #12] +#else + strd r10, r11, [r1, #8] +#endif + # Add + subs r12, r12, #1 + adcs r8, r4, r6 + adcs r9, r5, r7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #8] + str r9, [r0, #12] +#else + strd r8, r9, [r0, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r2, #16] + ldr r5, [r2, #20] +#else + ldrd r4, r5, [r2, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r3, #16] + ldr r7, [r3, #20] +#else + ldrd r6, r7, [r3, #16] +#endif + # Add + adcs r8, r4, r6 + mov r12, #0 + adcs r9, r5, r7 + adc r12, r12, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #16] + str r9, [r0, #20] +#else + strd r8, r9, [r0, #16] +#endif + # Sub + subs lr, lr, #1 + sbcs r10, r4, r6 + sbcs r11, r5, r7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r1, #16] + str r11, [r1, #20] +#else + strd r10, r11, [r1, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r2, #24] + ldr r5, [r2, #28] +#else + ldrd r4, r5, [r2, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r3, #24] + ldr r7, [r3, #28] +#else + ldrd r6, r7, [r3, #24] +#endif + # Sub + sbcs r10, r4, r6 + sbcs r11, r5, r7 + sbc lr, lr, lr + # Add + subs r12, r12, #1 + adcs r8, r4, r6 + mov r12, #0 + adcs r9, r5, r7 + adc r12, r12, #0 + # Multiply -modulus by overflow + lsl r3, r12, #1 + mov r12, #19 + orr r3, r3, r9, lsr #31 + mul r12, r3, r12 + # Add -x*modulus (if overflow) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0] + ldr r5, [r0, #4] +#else + ldrd r4, r5, [r0] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #8] + ldr r7, [r0, #12] +#else + ldrd r6, r7, [r0, #8] +#endif + adds r4, r4, r12 + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0] + str r5, [r0, #4] +#else + strd r4, r5, [r0] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [r0, #8] + str r7, [r0, #12] +#else + strd r6, r7, [r0, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #16] + ldr r5, [r0, #20] +#else + ldrd r4, r5, [r0, #16] +#endif + adcs r4, r4, #0 + adcs r5, r5, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0, #16] + str r5, [r0, #20] +#else + strd r4, r5, [r0, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0x80000000 +#else + bfc r9, #31, #1 +#endif + adcs r8, r8, #0 + adc r9, r9, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #24] + str r9, [r0, #28] +#else + strd r8, r9, [r0, #24] +#endif + # Multiply -modulus by underflow + lsl r3, lr, #1 + mvn lr, #18 + orr r3, r3, r11, lsr #31 + mul lr, r3, lr + # Sub -x*modulus (if overflow) + ldm r1, {r4, r5, r6, r7, r8, r9} + subs r4, r4, lr + sbcs r5, r5, #0 + sbcs r6, r6, #0 + sbcs r7, r7, #0 + sbcs r8, r8, #0 + sbcs r9, r9, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0x80000000 +#else + bfc r11, #31, #1 +#endif + sbcs r10, r10, #0 + sbc r11, r11, #0 + stm r1, {r4, r5, r6, r7, r8, r9, r10, r11} + # Done Add-Sub + pop {pc} + .size fe_add_sub_op,.-fe_add_sub_op + .text + .align 4 + .globl fe_sub_op + .type fe_sub_op, %function +fe_sub_op: + push {lr} + # Sub + ldm r2!, {r6, r7, r8, r9, r10, r11, r12, lr} + ldm r1!, {r2, r3, r4, r5} + subs r6, r2, r6 + sbcs r7, r3, r7 + sbcs r8, r4, r8 + sbcs r9, r5, r9 + ldm r1!, {r2, r3, r4, r5} + sbcs r10, r2, r10 + sbcs r11, r3, r11 + sbcs r12, r4, r12 + sbcs lr, r5, lr + sbc r3, r3, r3 + mvn r2, #18 + lsl r3, r3, #1 + orr r3, r3, lr, lsr #31 + mul r2, r3, r2 + subs r6, r6, r2 + sbcs r7, r7, #0 + sbcs r8, r8, #0 + sbcs r9, r9, #0 + sbcs r10, r10, #0 + sbcs r11, r11, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic lr, lr, #0x80000000 +#else + bfc lr, #31, #1 +#endif + sbcs r12, r12, #0 + sbc lr, lr, #0 + stm r0, {r6, r7, r8, r9, r10, r11, r12, lr} + # Done Sub + pop {pc} + .size fe_sub_op,.-fe_sub_op + .text + .align 4 + .globl fe_sub + .type fe_sub, %function +fe_sub: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + bl fe_sub_op + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size fe_sub,.-fe_sub + .text + .align 4 + .globl fe_add_op + .type fe_add_op, %function +fe_add_op: + push {lr} + # Add + ldm r2!, {r6, r7, r8, r9, r10, r11, r12, lr} + ldm r1!, {r2, r3, r4, r5} + adds r6, r2, r6 + adcs r7, r3, r7 + adcs r8, r4, r8 + adcs r9, r5, r9 + ldm r1!, {r2, r3, r4, r5} + adcs r10, r2, r10 + adcs r11, r3, r11 + adcs r12, r4, r12 + mov r3, #0 + adcs lr, r5, lr + adc r3, r3, #0 + mov r2, #19 + lsl r3, r3, #1 + orr r3, r3, lr, lsr #31 + mul r2, r3, r2 + adds r6, r6, r2 + adcs r7, r7, #0 + adcs r8, r8, #0 + adcs r9, r9, #0 + adcs r10, r10, #0 + adcs r11, r11, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic lr, lr, #0x80000000 +#else + bfc lr, #31, #1 +#endif + adcs r12, r12, #0 + adc lr, lr, #0 + stm r0, {r6, r7, r8, r9, r10, r11, r12, lr} + # Done Add + pop {pc} + .size fe_add_op,.-fe_add_op + .text + .align 4 + .globl fe_add + .type fe_add, %function +fe_add: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + bl fe_add_op + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size fe_add,.-fe_add +#ifdef HAVE_ED25519 + .text + .align 4 .globl fe_frombytes .type fe_frombytes, %function fe_frombytes: @@ -54,31 +368,19 @@ ldr r7, [r1, #20] ldr r8, [r1, #24] ldr r9, [r1, #28] - and r9, r9, #0x7fffffff -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0] - str r3, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0x80000000 #else - strd r2, r3, [r0] + bfc r9, #31, #1 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + str r2, [r0] + str r3, [r0, #4] str r4, [r0, #8] str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) str r6, [r0, #16] str r7, [r0, #20] -#else - strd r6, r7, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) str r8, [r0, #24] str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] -#endif pop {r4, r5, r6, r7, r8, r9, pc} .size fe_frombytes,.-fe_frombytes .text @@ -87,30 +389,7 @@ .type fe_tobytes, %function fe_tobytes: push {r4, r5, r6, r7, r8, r9, lr} -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r2, [r1] - ldr r3, [r1, #4] -#else - ldrd r2, r3, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #16] - ldr r7, [r1, #20] -#else - ldrd r6, r7, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #24] - ldr r9, [r1, #28] -#else - ldrd r8, r9, [r1, #24] -#endif + ldm r1, {r2, r3, r4, r5, r6, r7, r8, r9} adds r12, r2, #19 adcs r12, r3, #0 adcs r12, r4, #0 @@ -129,31 +408,19 @@ adcs r7, r7, #0 adcs r8, r8, #0 adc r9, r9, #0 - and r9, r9, #0x7fffffff -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0] - str r3, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0x80000000 #else - strd r2, r3, [r0] + bfc r9, #31, #1 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + str r2, [r0] + str r3, [r0, #4] str r4, [r0, #8] str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) str r6, [r0, #16] str r7, [r0, #20] -#else - strd r6, r7, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) str r8, [r0, #24] str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] -#endif pop {r4, r5, r6, r7, r8, r9, pc} .size fe_tobytes,.-fe_tobytes .text @@ -161,69 +428,36 @@ .globl fe_1 .type fe_1, %function fe_1: + push {r4, r5, r6, r7, r8, r9, lr} # Set one mov r2, #1 mov r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0] - str r3, [r0, #4] -#else - strd r2, r3, [r0] -#endif - mov r2, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0, #8] - str r3, [r0, #12] -#else - strd r2, r3, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0, #16] - str r3, [r0, #20] -#else - strd r2, r3, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0, #24] - str r3, [r0, #28] -#else - strd r2, r3, [r0, #24] -#endif - bx lr + mov r4, #0 + mov r5, #0 + mov r6, #0 + mov r7, #0 + mov r8, #0 + mov r9, #0 + stm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + pop {r4, r5, r6, r7, r8, r9, pc} .size fe_1,.-fe_1 .text .align 4 .globl fe_0 .type fe_0, %function fe_0: + push {r4, r5, r6, r7, r8, r9, lr} # Set zero mov r2, #0 mov r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0] - str r3, [r0, #4] -#else - strd r2, r3, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0, #8] - str r3, [r0, #12] -#else - strd r2, r3, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0, #16] - str r3, [r0, #20] -#else - strd r2, r3, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0, #24] - str r3, [r0, #28] -#else - strd r2, r3, [r0, #24] -#endif - bx lr + mov r4, #0 + mov r5, #0 + mov r6, #0 + mov r7, #0 + mov r8, #0 + mov r9, #0 + stm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + pop {r4, r5, r6, r7, r8, r9, pc} .size fe_0,.-fe_0 .text .align 4 @@ -232,49 +466,49 @@ fe_copy: push {r4, r5, lr} # Copy -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r2, [r1] ldr r3, [r1, #4] #else ldrd r2, r3, [r1] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r1, #8] ldr r5, [r1, #12] #else ldrd r4, r5, [r1, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r2, [r0] str r3, [r0, #4] #else strd r2, r3, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else strd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r2, [r1, #16] ldr r3, [r1, #20] #else ldrd r2, r3, [r1, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r1, #24] ldr r5, [r1, #28] #else ldrd r4, r5, [r1, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r2, [r0, #16] str r3, [r0, #20] #else strd r2, r3, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -284,329 +518,25 @@ .size fe_copy,.-fe_copy .text .align 4 - .globl fe_sub - .type fe_sub, %function -fe_sub: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] -#endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 - adcs r6, r6, r3 - adcs r7, r7, r3 - adcs r8, r8, r3 - adcs r9, r9, r3 - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_sub,.-fe_sub - .text - .align 4 - .globl fe_add - .type fe_add, %function -fe_add: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] -#endif - adds r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - adcs r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_add,.-fe_add - .text - .align 4 .globl fe_neg .type fe_neg, %function fe_neg: push {r4, r5, lr} - mov lr, #-1 - mov r12, #-19 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r2, [r1] - ldr r3, [r1, #4] -#else - ldrd r2, r3, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif + mvn lr, #0 + mvn r12, #18 + ldm r1!, {r2, r3, r4, r5} subs r2, r12, r2 sbcs r3, lr, r3 sbcs r4, lr, r4 sbcs r5, lr, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0] - str r3, [r0, #4] -#else - strd r2, r3, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - mov r12, #0x7fffff - lsl r12, r12, #8 - add r12, r12, #0xff -#else - mov r12, #0x7fffffff -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r2, [r1, #16] - ldr r3, [r1, #20] -#else - ldrd r2, r3, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #24] - ldr r5, [r1, #28] -#else - ldrd r4, r5, [r1, #24] -#endif + stm r0!, {r2, r3, r4, r5} + mvn r12, #0x80000000 + ldm r1!, {r2, r3, r4, r5} sbcs r2, lr, r2 sbcs r3, lr, r3 sbcs r4, lr, r4 sbc r5, r12, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0, #16] - str r3, [r0, #20] -#else - strd r2, r3, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #24] - str r5, [r0, #28] -#else - strd r4, r5, [r0, #24] -#endif + stm r0!, {r2, r3, r4, r5} pop {r4, r5, pc} .size fe_neg,.-fe_neg .text @@ -615,30 +545,7 @@ .type fe_isnonzero, %function fe_isnonzero: push {r4, r5, r6, r7, r8, r9, lr} -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r2, [r0] - ldr r3, [r0, #4] -#else - ldrd r2, r3, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #16] - ldr r7, [r0, #20] -#else - ldrd r6, r7, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r0, #24] - ldr r9, [r0, #28] -#else - ldrd r8, r9, [r0, #24] -#endif + ldm r0, {r2, r3, r4, r5, r6, r7, r8, r9} adds r1, r2, #19 adcs r1, r3, #0 adcs r1, r4, #0 @@ -657,7 +564,11 @@ adcs r7, r7, #0 adcs r8, r8, #0 adc r9, r9, #0 - and r9, r9, #0x7fffffff +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0x80000000 +#else + bfc r9, #31, #1 +#endif orr r2, r2, r3 orr r4, r4, r5 orr r6, r6, r7 @@ -673,52 +584,42 @@ .type fe_isnegative, %function fe_isnegative: push {r4, r5, lr} -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r2, [r0] - ldr r3, [r0, #4] -#else - ldrd r2, r3, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif + ldm r0!, {r2, r3, r4, r5} adds r1, r2, #19 adcs r1, r3, #0 adcs r1, r4, #0 adcs r1, r5, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r2, [r0, #16] - ldr r3, [r0, #20] -#else - ldrd r2, r3, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #24] - ldr r5, [r0, #28] -#else - ldrd r4, r5, [r0, #24] -#endif + ldm r0, {r2, r3, r4, r5} adcs r1, r2, #0 adcs r1, r3, #0 adcs r1, r4, #0 - ldr r2, [r0] + ldr r2, [r0, #-16] adc r1, r5, #0 and r0, r2, #1 lsr r1, r1, #31 eor r0, r0, r1 pop {r4, r5, pc} .size fe_isnegative,.-fe_isnegative +#if defined(HAVE_ED25519_MAKE_KEY) || defined(HAVE_ED25519_SIGN) +#ifndef WC_NO_CACHE_RESISTANT .text .align 4 .globl fe_cmov_table .type fe_cmov_table, %function fe_cmov_table: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r2, #24 + asr r2, r2, #24 +#else sxtb r2, r2 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + lsl r3, r2, #24 + asr r3, r2, #31 +#else sbfx r3, r2, #7, #1 +#endif eor r12, r2, r3 sub r12, r12, r3 mov r4, #1 @@ -727,7 +628,7 @@ mov r7, #0 mov r8, #0 mov r9, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -737,7 +638,7 @@ ror r3, r3, #31 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -749,7 +650,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -761,7 +662,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -774,7 +675,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -784,7 +685,7 @@ ror r3, r3, #30 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -796,7 +697,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -808,7 +709,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -821,7 +722,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -831,7 +732,7 @@ ror r3, r3, #29 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -843,7 +744,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -855,7 +756,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -868,7 +769,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -878,7 +779,7 @@ ror r3, r3, #28 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -890,7 +791,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -902,7 +803,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -915,7 +816,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -925,7 +826,7 @@ ror r3, r3, #27 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -937,7 +838,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -949,7 +850,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -962,7 +863,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -972,7 +873,7 @@ ror r3, r3, #26 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -984,7 +885,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -996,7 +897,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -1009,7 +910,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1019,7 +920,7 @@ ror r3, r3, #25 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -1031,7 +932,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -1043,7 +944,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -1056,7 +957,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1066,7 +967,7 @@ ror r3, r3, #24 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1] ldr r11, [r1, #4] #else @@ -1078,7 +979,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #32] ldr r11, [r1, #36] #else @@ -1090,7 +991,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #64] ldr r11, [r1, #68] #else @@ -1103,8 +1004,8 @@ eor r8, r8, r10 eor r9, r9, r11 sub r1, r1, #0x2a0 - mov r10, #-19 - mov r11, #-1 + mvn r10, #18 + mvn r11, #0 subs r10, r10, r8 sbcs r11, r11, r9 sbc lr, lr, lr @@ -1123,25 +1024,30 @@ eor r11, r11, r9 and r11, r11, r12 eor r9, r9, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else strd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #32] str r7, [r0, #36] #else strd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #64] str r9, [r0, #68] #else strd r8, r9, [r0, #64] #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + lsl r3, r2, #24 + asr r3, r2, #31 +#else sbfx r3, r2, #7, #1 +#endif eor r12, r2, r3 sub r12, r12, r3 mov r4, #0 @@ -1150,7 +1056,7 @@ mov r7, #0 mov r8, #0 mov r9, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1160,7 +1066,7 @@ ror r3, r3, #31 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1172,7 +1078,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1184,7 +1090,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1197,7 +1103,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1207,7 +1113,7 @@ ror r3, r3, #30 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1219,7 +1125,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1231,7 +1137,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1244,7 +1150,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1254,7 +1160,7 @@ ror r3, r3, #29 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1266,7 +1172,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1278,7 +1184,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1291,7 +1197,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1301,7 +1207,7 @@ ror r3, r3, #28 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1313,7 +1219,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1325,7 +1231,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1338,7 +1244,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1348,7 +1254,7 @@ ror r3, r3, #27 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1360,7 +1266,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1372,7 +1278,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1385,7 +1291,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1395,7 +1301,7 @@ ror r3, r3, #26 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1407,7 +1313,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1419,7 +1325,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1432,7 +1338,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1442,7 +1348,7 @@ ror r3, r3, #25 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1454,7 +1360,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1466,7 +1372,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1479,7 +1385,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1489,7 +1395,7 @@ ror r3, r3, #24 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #8] ldr r11, [r1, #12] #else @@ -1501,7 +1407,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #40] ldr r11, [r1, #44] #else @@ -1513,7 +1419,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #72] ldr r11, [r1, #76] #else @@ -1526,8 +1432,8 @@ eor r8, r8, r10 eor r9, r9, r11 sub r1, r1, #0x2a0 - mov r10, #-1 - mov r11, #-1 + mvn r10, #0 + mvn r11, #0 rsbs lr, lr, #0 sbcs r10, r10, r8 sbcs r11, r11, r9 @@ -1547,25 +1453,30 @@ eor r11, r11, r9 and r11, r11, r12 eor r9, r9, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else strd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #40] str r7, [r0, #44] #else strd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #72] str r9, [r0, #76] #else strd r8, r9, [r0, #72] #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + lsl r3, r2, #24 + asr r3, r2, #31 +#else sbfx r3, r2, #7, #1 +#endif eor r12, r2, r3 sub r12, r12, r3 mov r4, #0 @@ -1574,7 +1485,7 @@ mov r7, #0 mov r8, #0 mov r9, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1584,7 +1495,7 @@ ror r3, r3, #31 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1596,7 +1507,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1608,7 +1519,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1621,7 +1532,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1631,7 +1542,7 @@ ror r3, r3, #30 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1643,7 +1554,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1655,7 +1566,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1668,7 +1579,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1678,7 +1589,7 @@ ror r3, r3, #29 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1690,7 +1601,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1702,7 +1613,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1715,7 +1626,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1725,7 +1636,7 @@ ror r3, r3, #28 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1737,7 +1648,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1749,7 +1660,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1762,7 +1673,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1772,7 +1683,7 @@ ror r3, r3, #27 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1784,7 +1695,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1796,7 +1707,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1809,7 +1720,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1819,7 +1730,7 @@ ror r3, r3, #26 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1831,7 +1742,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1843,7 +1754,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1856,7 +1767,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1866,7 +1777,7 @@ ror r3, r3, #25 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1878,7 +1789,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1890,7 +1801,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1903,7 +1814,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -1913,7 +1824,7 @@ ror r3, r3, #24 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #16] ldr r11, [r1, #20] #else @@ -1925,7 +1836,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #48] ldr r11, [r1, #52] #else @@ -1937,7 +1848,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #80] ldr r11, [r1, #84] #else @@ -1950,8 +1861,8 @@ eor r8, r8, r10 eor r9, r9, r11 sub r1, r1, #0x2a0 - mov r10, #-1 - mov r11, #-1 + mvn r10, #0 + mvn r11, #0 rsbs lr, lr, #0 sbcs r10, r10, r8 sbcs r11, r11, r9 @@ -1971,25 +1882,30 @@ eor r11, r11, r9 and r11, r11, r12 eor r9, r9, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else strd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #48] str r7, [r0, #52] #else strd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #80] str r9, [r0, #84] #else strd r8, r9, [r0, #80] #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + lsl r3, r2, #24 + asr r3, r2, #31 +#else sbfx r3, r2, #7, #1 +#endif eor r12, r2, r3 sub r12, r12, r3 mov r4, #0 @@ -1998,7 +1914,7 @@ mov r7, #0 mov r8, #0 mov r9, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2008,7 +1924,7 @@ ror r3, r3, #31 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2020,7 +1936,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2032,7 +1948,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2045,7 +1961,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2055,7 +1971,7 @@ ror r3, r3, #30 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2067,7 +1983,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2079,7 +1995,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2092,7 +2008,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2102,7 +2018,7 @@ ror r3, r3, #29 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2114,7 +2030,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2126,7 +2042,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2139,7 +2055,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2149,7 +2065,7 @@ ror r3, r3, #28 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2161,7 +2077,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2173,7 +2089,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2186,7 +2102,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2196,7 +2112,7 @@ ror r3, r3, #27 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2208,7 +2124,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2220,7 +2136,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2233,7 +2149,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2243,7 +2159,7 @@ ror r3, r3, #26 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2255,7 +2171,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2267,7 +2183,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2280,7 +2196,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2290,7 +2206,7 @@ ror r3, r3, #25 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2302,7 +2218,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2314,7 +2230,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2327,7 +2243,7 @@ eor r8, r8, r10 eor r9, r9, r11 add r1, r1, #0x60 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) mov r3, #0x800000 lsl r3, r3, #8 add r3, r3, #0x0 @@ -2337,7 +2253,7 @@ ror r3, r3, #24 ror r3, r3, r12 asr r3, r3, #31 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] #else @@ -2349,7 +2265,7 @@ and r11, r11, r3 eor r4, r4, r10 eor r5, r5, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] #else @@ -2361,7 +2277,7 @@ and r11, r11, r3 eor r6, r6, r10 eor r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] #else @@ -2374,14 +2290,8 @@ eor r8, r8, r10 eor r9, r9, r11 sub r1, r1, #0x2a0 - mov r10, #-1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - mov r11, #0x7fffff - lsl r11, r11, #8 - add r11, r11, #0xff -#else - mov r11, #0x7fffffff -#endif + mvn r10, #0 + mvn r11, #0x80000000 rsbs lr, lr, #0 sbcs r10, r10, r8 sbc r11, r11, r9 @@ -2400,19 +2310,19 @@ eor r11, r11, r9 and r11, r11, r12 eor r9, r9, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else strd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #56] str r7, [r0, #60] #else strd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #88] str r9, [r0, #92] #else @@ -2420,1036 +2330,1071 @@ #endif pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size fe_cmov_table,.-fe_cmov_table +#else .text .align 4 - .globl fe_mul - .type fe_mul, %function -fe_mul: + .globl fe_cmov_table + .type fe_cmov_table, %function +fe_cmov_table: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #0x40 - # Multiply - ldr r7, [r1] - ldr r8, [r1, #4] - ldr r9, [r2] - ldr lr, [r2, #4] - # A[0] * B[0] = 0 - umull r4, r5, r7, r9 - str r4, [sp] - # A[0] * B[1] = 1 - umull r3, r6, r7, lr - adds r5, r5, r3 - adc r6, r6, #0 - # A[1] * B[0] = 1 - umull r3, r12, r8, r9 - adds r5, r5, r3 - mov r4, #0 - adcs r6, r6, r12 - adc r4, r4, #0 - str r5, [sp, #4] - # A[2] * B[0] = 2 - ldr r10, [r1, #8] - umull r3, r12, r10, r9 - adds r6, r6, r3 - adc r4, r4, r12 - # A[1] * B[1] = 2 - umull r3, r12, r8, lr - adds r6, r6, r3 - mov r5, #0 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[0] * B[2] = 2 - ldr r11, [r2, #8] - umull r3, r12, r7, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - str r6, [sp, #8] - # A[0] * B[3] = 3 - ldr r11, [r2, #12] - umull r3, r12, r7, r11 - adds r4, r4, r3 - mov r6, #0 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[1] * B[2] = 3 - ldr r11, [r2, #8] - umull r3, r12, r8, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[2] * B[1] = 3 - umull r3, r12, r10, lr - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[3] * B[0] = 3 - ldr r10, [r1, #12] - umull r3, r12, r10, r9 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - str r4, [sp, #12] - # A[4] * B[0] = 4 - ldr r10, [r1, #16] - umull r3, r12, r10, r9 - adds r5, r5, r3 - mov r4, #0 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[3] * B[1] = 4 - ldr r10, [r1, #12] - umull r3, r12, r10, lr - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[2] * B[2] = 4 - ldr r10, [r1, #8] - umull r3, r12, r10, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[1] * B[3] = 4 - ldr r11, [r2, #12] - umull r3, r12, r8, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[0] * B[4] = 4 - ldr r11, [r2, #16] - umull r3, r12, r7, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - str r5, [sp, #16] - # A[0] * B[5] = 5 - ldr r11, [r2, #20] - umull r3, r12, r7, r11 - adds r6, r6, r3 - mov r5, #0 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[1] * B[4] = 5 - ldr r11, [r2, #16] - umull r3, r12, r8, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[2] * B[3] = 5 - ldr r11, [r2, #12] - umull r3, r12, r10, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[3] * B[2] = 5 - ldr r10, [r1, #12] - ldr r11, [r2, #8] - umull r3, r12, r10, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[4] * B[1] = 5 - ldr r10, [r1, #16] - umull r3, r12, r10, lr - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[5] * B[0] = 5 - ldr r10, [r1, #20] - umull r3, r12, r10, r9 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - str r6, [sp, #20] - # A[6] * B[0] = 6 - ldr r10, [r1, #24] - umull r3, r12, r10, r9 - adds r4, r4, r3 - mov r6, #0 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[5] * B[1] = 6 - ldr r10, [r1, #20] - umull r3, r12, r10, lr - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[4] * B[2] = 6 - ldr r10, [r1, #16] - umull r3, r12, r10, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[3] * B[3] = 6 - ldr r10, [r1, #12] - ldr r11, [r2, #12] - umull r3, r12, r10, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[2] * B[4] = 6 - ldr r10, [r1, #8] - ldr r11, [r2, #16] - umull r3, r12, r10, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[1] * B[5] = 6 - ldr r11, [r2, #20] - umull r3, r12, r8, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[0] * B[6] = 6 - ldr r11, [r2, #24] - umull r3, r12, r7, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - str r4, [sp, #24] - # A[0] * B[7] = 7 - ldr r11, [r2, #28] - umull r3, r12, r7, r11 - adds r5, r5, r3 - mov r4, #0 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[1] * B[6] = 7 - ldr r11, [r2, #24] - umull r3, r12, r8, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[2] * B[5] = 7 - ldr r11, [r2, #20] - umull r3, r12, r10, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[3] * B[4] = 7 - ldr r10, [r1, #12] - ldr r11, [r2, #16] - umull r3, r12, r10, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[4] * B[3] = 7 - ldr r10, [r1, #16] - ldr r11, [r2, #12] - umull r3, r12, r10, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[5] * B[2] = 7 - ldr r10, [r1, #20] - ldr r11, [r2, #8] - umull r3, r12, r10, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[6] * B[1] = 7 - ldr r10, [r1, #24] - umull r3, r12, r10, lr - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[7] * B[0] = 7 - ldr r10, [r1, #28] - umull r3, r12, r10, r9 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - str r5, [sp, #28] - ldr r7, [r1, #24] - ldr r9, [r2, #24] - # A[7] * B[1] = 8 - umull r3, r12, r10, lr - adds r6, r6, r3 - mov r5, #0 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[6] * B[2] = 8 - umull r3, r12, r7, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[5] * B[3] = 8 - ldr r10, [r1, #20] - ldr r11, [r2, #12] - umull r3, r12, r10, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[4] * B[4] = 8 - ldr r10, [r1, #16] - ldr r11, [r2, #16] - umull r3, r12, r10, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[3] * B[5] = 8 - ldr r10, [r1, #12] - ldr r11, [r2, #20] - umull r3, r12, r10, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[2] * B[6] = 8 - ldr r10, [r1, #8] - umull r3, r12, r10, r9 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[1] * B[7] = 8 - ldr r11, [r2, #28] - umull r3, r12, r8, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - str r6, [sp, #32] - ldr r8, [r1, #28] - mov lr, r11 - # A[2] * B[7] = 9 - umull r3, r12, r10, lr - adds r4, r4, r3 - mov r6, #0 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[3] * B[6] = 9 - ldr r10, [r1, #12] - umull r3, r12, r10, r9 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[4] * B[5] = 9 - ldr r10, [r1, #16] - ldr r11, [r2, #20] - umull r3, r12, r10, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[5] * B[4] = 9 - ldr r10, [r1, #20] - ldr r11, [r2, #16] - umull r3, r12, r10, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[6] * B[3] = 9 - ldr r11, [r2, #12] - umull r3, r12, r7, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[7] * B[2] = 9 - ldr r11, [r2, #8] - umull r3, r12, r8, r11 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - str r4, [sp, #36] - # A[7] * B[3] = 10 - ldr r11, [r2, #12] - umull r3, r12, r8, r11 - adds r5, r5, r3 - mov r4, #0 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[6] * B[4] = 10 - ldr r11, [r2, #16] - umull r3, r12, r7, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[5] * B[5] = 10 - ldr r11, [r2, #20] - umull r3, r12, r10, r11 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[4] * B[6] = 10 - ldr r10, [r1, #16] - umull r3, r12, r10, r9 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[3] * B[7] = 10 - ldr r10, [r1, #12] - umull r3, r12, r10, lr - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - str r5, [sp, #40] - # A[4] * B[7] = 11 - ldr r10, [r1, #16] - umull r3, r12, r10, lr - adds r6, r6, r3 - mov r5, #0 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[5] * B[6] = 11 - ldr r10, [r1, #20] - umull r3, r12, r10, r9 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[6] * B[5] = 11 - umull r3, r12, r7, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - # A[7] * B[4] = 11 - ldr r11, [r2, #16] - umull r3, r12, r8, r11 - adds r6, r6, r3 - adcs r4, r4, r12 - adc r5, r5, #0 - str r6, [sp, #44] - # A[7] * B[5] = 12 - ldr r11, [r2, #20] - umull r3, r12, r8, r11 - adds r4, r4, r3 - mov r6, #0 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[6] * B[6] = 12 - umull r3, r12, r7, r9 - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - # A[5] * B[7] = 12 - umull r3, r12, r10, lr - adds r4, r4, r3 - adcs r5, r5, r12 - adc r6, r6, #0 - str r4, [sp, #48] - # A[6] * B[7] = 13 - umull r3, r12, r7, lr - adds r5, r5, r3 - mov r4, #0 - adcs r6, r6, r12 - adc r4, r4, #0 - # A[7] * B[6] = 13 - umull r3, r12, r8, r9 - adds r5, r5, r3 - adcs r6, r6, r12 - adc r4, r4, #0 - str r5, [sp, #52] - # A[7] * B[7] = 14 - umull r3, r12, r8, lr - adds r6, r6, r3 - adc r4, r4, r12 - str r6, [sp, #56] - str r4, [sp, #60] - # Reduce - # Load bottom half -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp] - ldr r5, [sp, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + lsl r2, r2, #24 + asr r2, r2, #24 #else - ldrd r4, r5, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #8] - ldr r7, [sp, #12] -#else - ldrd r6, r7, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #16] - ldr r9, [sp, #20] -#else - ldrd r8, r9, [sp, #16] + sxtb r2, r2 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #24] - ldr r11, [sp, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + lsl r3, r2, #24 + asr r3, r2, #31 #else - ldrd r10, r11, [sp, #24] + sbfx r3, r2, #7, #1 #endif - lsr r3, r11, #31 - and r11, r11, #0x7fffffff - mov lr, #19 - ldr r1, [sp, #32] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - adds r4, r4, r3 - mov r2, #0 - adcs r5, r5, r12 - adc r2, r2, #0 - lsr r3, r1, #31 - ldr r1, [sp, #36] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - add r12, r12, r2 - adds r5, r5, r3 - mov r2, #0 - adcs r6, r6, r12 - adc r2, r2, #0 - lsr r3, r1, #31 - ldr r1, [sp, #40] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - add r12, r12, r2 - adds r6, r6, r3 - mov r2, #0 - adcs r7, r7, r12 - adc r2, r2, #0 - lsr r3, r1, #31 - ldr r1, [sp, #44] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - add r12, r12, r2 - adds r7, r7, r3 - mov r2, #0 - adcs r8, r8, r12 - adc r2, r2, #0 - lsr r3, r1, #31 - ldr r1, [sp, #48] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - add r12, r12, r2 - adds r8, r8, r3 - mov r2, #0 - adcs r9, r9, r12 - adc r2, r2, #0 - lsr r3, r1, #31 - ldr r1, [sp, #52] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - add r12, r12, r2 - adds r9, r9, r3 - mov r2, #0 - adcs r10, r10, r12 - adc r2, r2, #0 - lsr r3, r1, #31 - ldr r1, [sp, #56] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - add r12, r12, r2 - adds r10, r10, r3 - mov r2, #0 - adcs r11, r11, r12 - adc r2, r2, #0 - lsr r3, r1, #31 - ldr r1, [sp, #60] - orr r3, r3, r1, lsl #1 - umull r3, r12, lr, r3 - adds r11, r11, r3 - adc r3, r12, r2 - # Overflow - lsl r3, r3, #1 - orr r3, r3, r11, lsr #31 - mul r3, r3, lr - and r11, r11, #0x7fffffff - adds r4, r4, r3 - adcs r5, r5, #0 - adcs r6, r6, #0 - adcs r7, r7, #0 - adcs r8, r8, #0 - adcs r9, r9, #0 - adcs r10, r10, #0 - adc r11, r11, #0 - # Reduce if top bit set - asr r3, r11, #31 - and r3, r3, lr - and r11, r11, #0x7fffffff - adds r4, r4, r3 - adcs r5, r5, #0 + eor r2, r2, r3 + sub r2, r2, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + sub lr, r2, #1 +#else + clz lr, r2 + lsl lr, lr, #26 +#endif /* defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) */ + asr lr, lr, #31 + mvn lr, lr + add r2, r2, lr + mov r12, #0x60 + mul r2, r2, r12 + add r1, r1, r2 + ldm r1!, {r4, r5, r6, r7, r8, r9, r10, r11} + and r4, r4, lr + and r5, r5, lr + and r6, r6, lr + and r7, r7, lr + and r8, r8, lr + and r9, r9, lr + and r10, r10, lr + and r11, r11, lr + mvn r12, lr + sub r4, r4, r12 + mov r12, #32 + and r12, r12, r3 + add r0, r0, r12 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + sub r0, r0, r12 + ldm r1!, {r4, r5, r6, r7, r8, r9, r10, r11} + and r4, r4, lr + and r5, r5, lr + and r6, r6, lr + and r7, r7, lr + and r8, r8, lr + and r9, r9, lr + and r10, r10, lr + and r11, r11, lr + mvn r12, lr + sub r4, r4, r12 + mov r12, #32 + bic r12, r12, r3 + add r0, r0, r12 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + sub r0, r0, r12 + add r0, r0, #0x40 + ldm r1!, {r4, r5, r6, r7} + mvn r12, #18 + subs r8, r12, r4 + sbcs r9, r3, r5 + sbcs r10, r3, r6 + sbcs r11, r3, r7 + bic r4, r4, r3 + bic r5, r5, r3 + bic r6, r6, r3 + bic r7, r7, r3 + and r8, r8, r3 + and r9, r9, r3 + and r10, r10, r3 + and r11, r11, r3 + orr r4, r4, r8 + orr r5, r5, r9 + orr r6, r6, r10 + orr r7, r7, r11 + and r4, r4, lr + and r5, r5, lr + and r6, r6, lr + and r7, r7, lr + stm r0!, {r4, r5, r6, r7} + ldm r1!, {r4, r5, r6, r7} + mvn r12, #0x80000000 + sbcs r8, r3, r4 + sbcs r9, r3, r5 + sbcs r10, r3, r6 + sbc r11, r12, r7 + bic r4, r4, r3 + bic r5, r5, r3 + bic r6, r6, r3 + bic r7, r7, r3 + and r8, r8, r3 + and r9, r9, r3 + and r10, r10, r3 + and r11, r11, r3 + orr r4, r4, r8 + orr r5, r5, r9 + orr r6, r6, r10 + orr r7, r7, r11 + and r4, r4, lr + and r5, r5, lr + and r6, r6, lr + and r7, r7, lr + stm r0!, {r4, r5, r6, r7} + sub r1, r1, r2 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size fe_cmov_table,.-fe_cmov_table +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_ED25519_MAKE_KEY || HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + .text + .align 4 + .globl fe_mul_op + .type fe_mul_op, %function +fe_mul_op: + push {lr} + sub sp, sp, #40 + str r0, [sp, #36] + mov r0, #0 + ldr r12, [r1] + # A[0] * B[0] + ldr lr, [r2] + umull r3, r4, r12, lr + # A[0] * B[2] + ldr lr, [r2, #8] + umull r5, r6, r12, lr + # A[0] * B[4] + ldr lr, [r2, #16] + umull r7, r8, r12, lr + # A[0] * B[6] + ldr lr, [r2, #24] + umull r9, r10, r12, lr + str r3, [sp] + # A[0] * B[1] + ldr lr, [r2, #4] + mov r11, r0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[0] * B[3] + ldr lr, [r2, #12] adcs r6, r6, #0 - adcs r7, r7, #0 + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[0] * B[5] + ldr lr, [r2, #20] adcs r8, r8, #0 - adcs r9, r9, #0 + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[0] * B[7] + ldr lr, [r2, #28] adcs r10, r10, #0 + adc r3, r0, #0 + umlal r10, r3, r12, lr + # A[1] * B[0] + ldr r12, [r1, #4] + ldr lr, [r2] + mov r11, #0 + umlal r4, r11, r12, lr + str r4, [sp, #4] + adds r5, r5, r11 + # A[1] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[1] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[1] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[1] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[1] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[1] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[1] * B[7] + ldr lr, [r2, #28] + adc r4, r0, #0 + umlal r3, r4, r12, lr + # A[2] * B[0] + ldr r12, [r1, #8] + ldr lr, [r2] + mov r11, #0 + umlal r5, r11, r12, lr + str r5, [sp, #8] + adds r6, r6, r11 + # A[2] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[2] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[2] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[2] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[2] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[2] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[2] * B[7] + ldr lr, [r2, #28] + adc r5, r0, #0 + umlal r4, r5, r12, lr + # A[3] * B[0] + ldr r12, [r1, #12] + ldr lr, [r2] + mov r11, #0 + umlal r6, r11, r12, lr + str r6, [sp, #12] + adds r7, r7, r11 + # A[3] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[3] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[3] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[3] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[3] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[3] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[3] * B[7] + ldr lr, [r2, #28] + adc r6, r0, #0 + umlal r5, r6, r12, lr + # A[4] * B[0] + ldr r12, [r1, #16] + ldr lr, [r2] + mov r11, #0 + umlal r7, r11, r12, lr + str r7, [sp, #16] + adds r8, r8, r11 + # A[4] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[4] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[4] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[4] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[4] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[4] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[4] * B[7] + ldr lr, [r2, #28] + adc r7, r0, #0 + umlal r6, r7, r12, lr + # A[5] * B[0] + ldr r12, [r1, #20] + ldr lr, [r2] + mov r11, #0 + umlal r8, r11, r12, lr + str r8, [sp, #20] + adds r9, r9, r11 + # A[5] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[5] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[5] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[5] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[5] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[5] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[5] * B[7] + ldr lr, [r2, #28] + adc r8, r0, #0 + umlal r7, r8, r12, lr + # A[6] * B[0] + ldr r12, [r1, #24] + ldr lr, [r2] + mov r11, #0 + umlal r9, r11, r12, lr + str r9, [sp, #24] + adds r10, r10, r11 + # A[6] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[6] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[6] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[6] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[6] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[6] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[6] * B[7] + ldr lr, [r2, #28] + adc r9, r0, #0 + umlal r8, r9, r12, lr + # A[7] * B[0] + ldr r12, [r1, #28] + ldr lr, [r2] + mov r11, #0 + umlal r10, r11, r12, lr + str r10, [sp, #28] + adds r3, r3, r11 + # A[7] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[7] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[7] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[7] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[7] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[7] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[7] * B[7] + ldr lr, [r2, #28] + adc r10, r0, #0 + umlal r9, r10, r12, lr + # Reduce + ldr r2, [sp, #28] + mov lr, sp + mov r12, #38 + umull r10, r11, r12, r10 + adds r10, r10, r2 adc r11, r11, #0 - # Store -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] + mov r12, #19 + lsl r11, r11, #1 + orr r11, r11, r10, LSR #31 + mul r11, r12, r11 + ldm lr!, {r1, r2} + mov r12, #38 + adds r1, r1, r11 + adc r11, r0, #0 + umlal r1, r11, r3, r12 + adds r2, r2, r11 + adc r11, r0, #0 + umlal r2, r11, r4, r12 + ldm lr!, {r3, r4} + adds r3, r3, r11 + adc r11, r0, #0 + umlal r3, r11, r5, r12 + adds r4, r4, r11 + adc r11, r0, #0 + umlal r4, r11, r6, r12 + ldm lr!, {r5, r6} + adds r5, r5, r11 + adc r11, r0, #0 + umlal r5, r11, r7, r12 + adds r6, r6, r11 + adc r11, r0, #0 + umlal r6, r11, r8, r12 + ldm lr!, {r7, r8} + adds r7, r7, r11 + adc r11, r0, #0 + umlal r7, r11, r9, r12 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r10, r10, #0x80000000 #else - strd r8, r9, [r0, #16] + bfc r10, #31, #1 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] + adds r8, r10, r11 + # Store + ldr r0, [sp, #36] + stm r0, {r1, r2, r3, r4, r5, r6, r7, r8} + add sp, sp, #40 + pop {pc} + .size fe_mul_op,.-fe_mul_op #else - strd r10, r11, [r0, #24] -#endif - add sp, sp, #0x40 - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_mul,.-fe_mul .text .align 4 - .globl fe_sq - .type fe_sq, %function -fe_sq: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #0x40 - # Square - ldr r7, [r1] - ldr r8, [r1, #4] - ldr r9, [r1, #8] - ldr r10, [r1, #12] - ldr r12, [r1, #16] - # A[0] * A[0] = 0 - umull r4, r5, r7, r7 - str r4, [sp] - # A[0] * A[1] = 1 - umull r2, r3, r7, r8 - mov r6, #0 - adds r5, r5, r2 - adc r6, r6, r3 - adds r5, r5, r2 + .globl fe_mul_op + .type fe_mul_op, %function +fe_mul_op: + push {lr} + sub sp, sp, #44 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r0, [sp, #36] + str r1, [sp, #40] +#else + strd r0, r1, [sp, #36] +#endif + mov lr, r2 + ldm r1, {r0, r1, r2, r3} + ldm lr!, {r4, r5, r6} + umull r10, r11, r0, r4 + umull r12, r7, r1, r4 + umaal r11, r12, r0, r5 + umull r8, r9, r2, r4 + umaal r12, r8, r1, r5 + umaal r12, r7, r0, r6 + umaal r8, r9, r3, r4 + stm sp, {r10, r11, r12} + umaal r7, r8, r2, r5 + ldm lr!, {r4} + umull r10, r11, r1, r6 + umaal r8, r9, r2, r6 + umaal r7, r10, r0, r4 + umaal r8, r11, r3, r5 + str r7, [sp, #12] + umaal r8, r10, r1, r4 + umaal r9, r11, r3, r6 + umaal r9, r10, r2, r4 + umaal r10, r11, r3, r4 + ldm lr, {r4, r5, r6, r7} + mov r12, #0 + umlal r8, r12, r0, r4 + umaal r9, r12, r1, r4 + umaal r10, r12, r2, r4 + umaal r11, r12, r3, r4 mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #4] - # A[1] * A[1] = 2 - umull r2, r3, r8, r8 - adds r6, r6, r2 - adc r4, r4, r3 - # A[0] * A[2] = 2 - umull r2, r3, r7, r9 - adds r6, r6, r2 + umlal r9, r4, r0, r5 + umaal r10, r4, r1, r5 + umaal r11, r4, r2, r5 + umaal r12, r4, r3, r5 mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - str r6, [sp, #8] - # A[0] * A[3] = 3 - umull r2, r3, r7, r10 - adds r4, r4, r2 - adc r5, r5, r3 - adds r4, r4, r2 + umlal r10, r5, r0, r6 + umaal r11, r5, r1, r6 + umaal r12, r5, r2, r6 + umaal r4, r5, r3, r6 mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[1] * A[2] = 3 - umull r2, r3, r8, r9 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #12] - # A[2] * A[2] = 4 - umull r2, r3, r9, r9 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[1] * A[3] = 4 - umull r2, r3, r8, r10 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[0] * A[4] = 4 - umull r2, r3, r7, r12 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #16] - # A[0] * A[5] = 5 - ldr r11, [r1, #20] - umull r2, r3, r7, r11 - adds r6, r6, r2 - mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[1] * A[4] = 5 - umull r2, r3, r8, r12 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[2] * A[3] = 5 - umull r2, r3, r9, r10 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - str r6, [sp, #20] - # A[3] * A[3] = 6 - umull r2, r3, r10, r10 - adds r4, r4, r2 - mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[2] * A[4] = 6 - umull r2, r3, r9, r12 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[1] * A[5] = 6 - umull r2, r3, r8, r11 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[0] * A[6] = 6 - ldr r11, [r1, #24] - umull r2, r3, r7, r11 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #24] - # A[0] * A[7] = 7 - ldr r11, [r1, #28] - umull r2, r3, r7, r11 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[1] * A[6] = 7 - ldr r11, [r1, #24] - umull r2, r3, r8, r11 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[2] * A[5] = 7 - ldr r11, [r1, #20] - umull r2, r3, r9, r11 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[3] * A[4] = 7 - umull r2, r3, r10, r12 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #28] - # A[4] * A[4] = 8 - umull r2, r3, r12, r12 - adds r6, r6, r2 - mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[3] * A[5] = 8 - umull r2, r3, r10, r11 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[2] * A[6] = 8 - ldr r11, [r1, #24] - umull r2, r3, r9, r11 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[1] * A[7] = 8 - ldr r11, [r1, #28] - umull r2, r3, r8, r11 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 + umlal r11, r6, r0, r7 + ldr r0, [sp, #40] + umaal r12, r6, r1, r7 + add r0, r0, #16 + umaal r4, r6, r2, r7 + sub lr, lr, #16 + umaal r5, r6, r3, r7 + ldm r0, {r0, r1, r2, r3} str r6, [sp, #32] - ldr r7, [r1, #20] - # A[2] * A[7] = 9 - umull r2, r3, r9, r11 - adds r4, r4, r2 - mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[3] * A[6] = 9 - ldr r11, [r1, #24] - umull r2, r3, r10, r11 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[4] * A[5] = 9 - umull r2, r3, r12, r7 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #36] - mov r8, r11 - # A[5] * A[5] = 10 - umull r2, r3, r7, r7 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[4] * A[6] = 10 - umull r2, r3, r12, r8 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[3] * A[7] = 10 - ldr r11, [r1, #28] - umull r2, r3, r10, r11 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #40] - mov r9, r11 - # A[4] * A[7] = 11 - umull r2, r3, r12, r9 - adds r6, r6, r2 - mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[5] * A[6] = 11 - umull r2, r3, r7, r8 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - str r6, [sp, #44] - # A[6] * A[6] = 12 - umull r2, r3, r8, r8 - adds r4, r4, r2 - mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[5] * A[7] = 12 - umull r2, r3, r7, r9 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #48] - # A[6] * A[7] = 13 - umull r2, r3, r8, r9 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #52] - # A[7] * A[7] = 14 - umull r2, r3, r9, r9 - adds r6, r6, r2 - adc r4, r4, r3 - str r6, [sp, #56] - str r4, [sp, #60] + ldm lr!, {r6} + mov r7, #0 + umlal r8, r7, r0, r6 + umaal r9, r7, r1, r6 + str r8, [sp, #16] + umaal r10, r7, r2, r6 + umaal r11, r7, r3, r6 + ldm lr!, {r6} + mov r8, #0 + umlal r9, r8, r0, r6 + umaal r10, r8, r1, r6 + str r9, [sp, #20] + umaal r11, r8, r2, r6 + umaal r12, r8, r3, r6 + ldm lr!, {r6} + mov r9, #0 + umlal r10, r9, r0, r6 + umaal r11, r9, r1, r6 + str r10, [sp, #24] + umaal r12, r9, r2, r6 + umaal r4, r9, r3, r6 + ldm lr!, {r6} + mov r10, #0 + umlal r11, r10, r0, r6 + umaal r12, r10, r1, r6 + str r11, [sp, #28] + umaal r4, r10, r2, r6 + umaal r5, r10, r3, r6 + ldm lr!, {r11} + umaal r12, r7, r0, r11 + umaal r4, r7, r1, r11 + ldr r6, [sp, #32] + umaal r5, r7, r2, r11 + umaal r6, r7, r3, r11 + ldm lr!, {r11} + umaal r4, r8, r0, r11 + umaal r5, r8, r1, r11 + umaal r6, r8, r2, r11 + umaal r7, r8, r3, r11 + ldm lr, {r11, lr} + umaal r5, r9, r0, r11 + umaal r6, r10, r0, lr + umaal r6, r9, r1, r11 + umaal r7, r10, r1, lr + umaal r7, r9, r2, r11 + umaal r8, r10, r2, lr + umaal r8, r9, r3, r11 + umaal r9, r10, r3, lr # Reduce - # Load bottom half -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp] - ldr r5, [sp, #4] -#else - ldrd r4, r5, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #8] - ldr r7, [sp, #12] -#else - ldrd r6, r7, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #16] - ldr r9, [sp, #20] -#else - ldrd r8, r9, [sp, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #24] - ldr r11, [sp, #28] -#else - ldrd r10, r11, [sp, #24] -#endif - lsr r2, r11, #31 - and r11, r11, #0x7fffffff - mov r12, #19 - ldr r1, [sp, #32] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - adds r4, r4, r2 - mov lr, #0 - adcs r5, r5, r3 - adc lr, lr, #0 - lsr r2, r1, #31 - ldr r1, [sp, #36] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r5, r5, r2 - mov lr, #0 - adcs r6, r6, r3 - adc lr, lr, #0 - lsr r2, r1, #31 - ldr r1, [sp, #40] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r6, r6, r2 - mov lr, #0 - adcs r7, r7, r3 - adc lr, lr, #0 - lsr r2, r1, #31 - ldr r1, [sp, #44] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r7, r7, r2 - mov lr, #0 - adcs r8, r8, r3 - adc lr, lr, #0 - lsr r2, r1, #31 - ldr r1, [sp, #48] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r8, r8, r2 - mov lr, #0 - adcs r9, r9, r3 - adc lr, lr, #0 - lsr r2, r1, #31 - ldr r1, [sp, #52] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r9, r9, r2 - mov lr, #0 - adcs r10, r10, r3 - adc lr, lr, #0 - lsr r2, r1, #31 - ldr r1, [sp, #56] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r10, r10, r2 - mov lr, #0 - adcs r11, r11, r3 - adc lr, lr, #0 - lsr r2, r1, #31 - ldr r1, [sp, #60] - orr r2, r2, r1, lsl #1 - umull r2, r3, r12, r2 - adds r11, r11, r2 - adc r2, r3, lr - # Overflow - lsl r2, r2, #1 - orr r2, r2, r11, lsr #31 - mul r2, r2, r12 - and r11, r11, #0x7fffffff - adds r4, r4, r2 + ldr r0, [sp, #28] + mov lr, #37 + umaal r10, r0, r10, lr + mov lr, #19 + lsl r0, r0, #1 + orr r0, r0, r10, lsr #31 + mul r11, r0, lr + pop {r0, r1, r2} + mov lr, #38 + umaal r0, r11, r12, lr + umaal r1, r11, r4, lr + umaal r2, r11, r5, lr + pop {r3, r4, r5} + umaal r3, r11, r6, lr + umaal r4, r11, r7, lr + umaal r5, r11, r8, lr + pop {r6} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r10, r10, #0x80000000 +#else + bfc r10, #31, #1 +#endif + umaal r6, r11, r9, lr + add r7, r10, r11 + ldr lr, [sp, #8] + # Store + stm lr, {r0, r1, r2, r3, r4, r5, r6, r7} + add sp, sp, #16 + pop {pc} + .size fe_mul_op,.-fe_mul_op +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + .text + .align 4 + .globl fe_mul + .type fe_mul, %function +fe_mul: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + bl fe_mul_op + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size fe_mul,.-fe_mul +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + .text + .align 4 + .globl fe_sq_op + .type fe_sq_op, %function +fe_sq_op: + push {lr} + sub sp, sp, #0x44 + str r0, [sp, #64] + # Square + mov r0, #0 + ldr r12, [r1] + # A[0] * A[1] + ldr lr, [r1, #4] + umull r4, r5, r12, lr + # A[0] * A[3] + ldr lr, [r1, #12] + umull r6, r7, r12, lr + # A[0] * A[5] + ldr lr, [r1, #20] + umull r8, r9, r12, lr + # A[0] * A[7] + ldr lr, [r1, #28] + umull r10, r3, r12, lr + # A[0] * A[2] + ldr lr, [r1, #8] + mov r11, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[0] * A[4] + ldr lr, [r1, #16] + adcs r7, r7, #0 + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[0] * A[6] + ldr lr, [r1, #24] + adcs r9, r9, #0 + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + adcs r3, r3, #0 + str r4, [sp, #4] + str r5, [sp, #8] + # A[1] * A[2] + ldr r12, [r1, #4] + ldr lr, [r1, #8] + mov r11, #0 + umlal r6, r11, r12, lr + str r6, [sp, #12] + adds r7, r7, r11 + # A[1] * A[3] + ldr lr, [r1, #12] + adc r11, r0, #0 + umlal r7, r11, r12, lr + str r7, [sp, #16] + adds r8, r8, r11 + # A[1] * A[4] + ldr lr, [r1, #16] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[1] * A[5] + ldr lr, [r1, #20] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[1] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[1] * A[7] + ldr lr, [r1, #28] + adc r4, r0, #0 + umlal r3, r4, r12, lr + # A[2] * A[3] + ldr r12, [r1, #8] + ldr lr, [r1, #12] + mov r11, #0 + umlal r8, r11, r12, lr + str r8, [sp, #20] + adds r9, r9, r11 + # A[2] * A[4] + ldr lr, [r1, #16] + adc r11, r0, #0 + umlal r9, r11, r12, lr + str r9, [sp, #24] + adds r10, r10, r11 + # A[2] * A[5] + ldr lr, [r1, #20] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[2] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[2] * A[7] + ldr lr, [r1, #28] + adc r5, r0, #0 + umlal r4, r5, r12, lr + # A[3] * A[4] + ldr r12, [r1, #12] + ldr lr, [r1, #16] + mov r11, #0 + umlal r10, r11, r12, lr + str r10, [sp, #28] + adds r3, r3, r11 + # A[3] * A[5] + ldr lr, [r1, #20] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[3] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[3] * A[7] + ldr lr, [r1, #28] + adc r6, r0, #0 + umlal r5, r6, r12, lr + # A[4] * A[5] + ldr r12, [r1, #16] + ldr lr, [r1, #20] + mov r11, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[4] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[4] * A[7] + ldr lr, [r1, #28] + adc r7, r0, #0 + umlal r6, r7, r12, lr + # A[5] * A[6] + ldr r12, [r1, #20] + ldr lr, [r1, #24] + mov r11, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[5] * A[7] + ldr lr, [r1, #28] + adc r8, r0, #0 + umlal r7, r8, r12, lr + # A[6] * A[7] + ldr r12, [r1, #24] + ldr lr, [r1, #28] + mov r9, #0 + umlal r8, r9, r12, lr + add lr, sp, #32 + stm lr, {r3, r4, r5, r6, r7, r8, r9} + add lr, sp, #4 + ldm lr, {r4, r5, r6, r7, r8, r9, r10} + adds r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adcs r8, r8, r8 + adcs r9, r9, r9 + adcs r10, r10, r10 + stm lr!, {r4, r5, r6, r7, r8, r9, r10} + ldm lr, {r3, r4, r5, r6, r7, r8, r9} + adcs r3, r3, r3 + adcs r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adcs r8, r8, r8 + adcs r9, r9, r9 + adc r10, r0, #0 + stm lr, {r3, r4, r5, r6, r7, r8, r9, r10} + add lr, sp, #4 + ldm lr, {r4, r5, r6, r7, r8, r9, r10} + mov lr, sp + # A[0] * A[0] + ldr r12, [r1] + umull r3, r11, r12, r12 + adds r4, r4, r11 + # A[1] * A[1] + ldr r12, [r1, #4] adcs r5, r5, #0 - adcs r6, r6, #0 + adc r11, r0, #0 + umlal r5, r11, r12, r12 + adds r6, r6, r11 + # A[2] * A[2] + ldr r12, [r1, #8] adcs r7, r7, #0 - adcs r8, r8, #0 + adc r11, r0, #0 + umlal r7, r11, r12, r12 + adds r8, r8, r11 + # A[3] * A[3] + ldr r12, [r1, #12] adcs r9, r9, #0 - adcs r10, r10, #0 - adc r11, r11, #0 - # Reduce if top bit set - asr r2, r11, #31 - and r2, r2, r12 - and r11, r11, #0x7fffffff - adds r4, r4, r2 + adc r11, r0, #0 + umlal r9, r11, r12, r12 + adds r10, r10, r11 + stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10} + ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10} + # A[4] * A[4] + ldr r12, [r1, #16] + adcs r3, r3, #0 + adc r11, r0, #0 + umlal r3, r11, r12, r12 + adds r4, r4, r11 + # A[5] * A[5] + ldr r12, [r1, #20] adcs r5, r5, #0 - adcs r6, r6, #0 + adc r11, r0, #0 + umlal r5, r11, r12, r12 + adds r6, r6, r11 + # A[6] * A[6] + ldr r12, [r1, #24] adcs r7, r7, #0 - adcs r8, r8, #0 + adc r11, r0, #0 + umlal r7, r11, r12, r12 + adds r8, r8, r11 + # A[7] * A[7] + ldr r12, [r1, #28] adcs r9, r9, #0 - adcs r10, r10, #0 + adc r10, r10, #0 + umlal r9, r10, r12, r12 + # Reduce + ldr r2, [sp, #28] + mov lr, sp + mov r12, #38 + umull r10, r11, r12, r10 + adds r10, r10, r2 adc r11, r11, #0 - # Store -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] + mov r12, #19 + lsl r11, r11, #1 + orr r11, r11, r10, LSR #31 + mul r11, r12, r11 + ldm lr!, {r1, r2} + mov r12, #38 + adds r1, r1, r11 + adc r11, r0, #0 + umlal r1, r11, r3, r12 + adds r2, r2, r11 + adc r11, r0, #0 + umlal r2, r11, r4, r12 + ldm lr!, {r3, r4} + adds r3, r3, r11 + adc r11, r0, #0 + umlal r3, r11, r5, r12 + adds r4, r4, r11 + adc r11, r0, #0 + umlal r4, r11, r6, r12 + ldm lr!, {r5, r6} + adds r5, r5, r11 + adc r11, r0, #0 + umlal r5, r11, r7, r12 + adds r6, r6, r11 + adc r11, r0, #0 + umlal r6, r11, r8, r12 + ldm lr!, {r7, r8} + adds r7, r7, r11 + adc r11, r0, #0 + umlal r7, r11, r9, r12 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r10, r10, #0x80000000 #else - strd r6, r7, [r0, #8] + bfc r10, #31, #1 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] + adds r8, r10, r11 + # Store + ldr r0, [sp, #64] + stm r0, {r1, r2, r3, r4, r5, r6, r7, r8} + add sp, sp, #0x44 + pop {pc} + .size fe_sq_op,.-fe_sq_op #else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] + .text + .align 4 + .globl fe_sq_op + .type fe_sq_op, %function +fe_sq_op: + push {lr} + sub sp, sp, #32 + str r0, [sp, #28] + ldm r1, {r0, r1, r2, r3, r4, r5, r6, r7} + # Square + umull r9, r10, r0, r0 + umull r11, r12, r0, r1 + adds r11, r11, r11 + mov lr, #0 + umaal r10, r11, lr, lr + stm sp, {r9, r10} + mov r8, lr + umaal r8, r12, r0, r2 + adcs r8, r8, r8 + umaal r8, r11, r1, r1 + umull r9, r10, r0, r3 + umaal r9, r12, r1, r2 + adcs r9, r9, r9 + umaal r9, r11, lr, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [sp, #8] + str r9, [sp, #12] #else - strd r10, r11, [r0, #24] + strd r8, r9, [sp, #8] #endif - add sp, sp, #0x40 + mov r9, lr + umaal r9, r10, r0, r4 + umaal r9, r12, r1, r3 + adcs r9, r9, r9 + umaal r9, r11, r2, r2 + str r9, [sp, #16] + umull r9, r8, r0, r5 + umaal r9, r12, r1, r4 + umaal r9, r10, r2, r3 + adcs r9, r9, r9 + umaal r9, r11, lr, lr + str r9, [sp, #20] + mov r9, lr + umaal r9, r8, r0, r6 + umaal r9, r12, r1, r5 + umaal r9, r10, r2, r4 + adcs r9, r9, r9 + umaal r9, r11, r3, r3 + str r9, [sp, #24] + umull r0, r9, r0, r7 + umaal r0, r8, r1, r6 + umaal r0, r12, r2, r5 + umaal r0, r10, r3, r4 + adcs r0, r0, r0 + umaal r0, r11, lr, lr + # R[7] = r0 + umaal r9, r8, r1, r7 + umaal r9, r10, r2, r6 + umaal r12, r9, r3, r5 + adcs r12, r12, r12 + umaal r12, r11, r4, r4 + # R[8] = r12 + umaal r9, r8, r2, r7 + umaal r10, r9, r3, r6 + mov r2, lr + umaal r10, r2, r4, r5 + adcs r10, r10, r10 + umaal r11, r10, lr, lr + # R[9] = r11 + umaal r2, r8, r3, r7 + umaal r2, r9, r4, r6 + adcs r3, r2, r2 + umaal r10, r3, r5, r5 + # R[10] = r10 + mov r1, lr + umaal r1, r8, r4, r7 + umaal r1, r9, r5, r6 + adcs r4, r1, r1 + umaal r3, r4, lr, lr + # R[11] = r3 + umaal r8, r9, r5, r7 + adcs r8, r8, r8 + umaal r4, r8, r6, r6 + # R[12] = r4 + mov r5, lr + umaal r5, r9, r6, r7 + adcs r5, r5, r5 + umaal r8, r5, lr, lr + # R[13] = r8 + adcs r9, r9, r9 + umaal r9, r5, r7, r7 + adcs r7, r5, lr + # R[14] = r9 + # R[15] = r7 + # Reduce + mov r6, #37 + umaal r7, r0, r7, r6 + mov r6, #19 + lsl r0, r0, #1 + orr r0, r0, r7, lsr #31 + mul lr, r0, r6 + pop {r0, r1} + mov r6, #38 + umaal r0, lr, r12, r6 + umaal r1, lr, r11, r6 + mov r12, r3 + mov r11, r4 + pop {r2, r3, r4} + umaal r2, lr, r10, r6 + umaal r3, lr, r12, r6 + umaal r4, lr, r11, r6 + mov r12, r6 + pop {r5, r6} + umaal r5, lr, r8, r12 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r7, r7, #0x80000000 +#else + bfc r7, #31, #1 +#endif + umaal r6, lr, r9, r12 + add r7, r7, lr + pop {lr} + # Store + stm lr, {r0, r1, r2, r3, r4, r5, r6, r7} + pop {pc} + .size fe_sq_op,.-fe_sq_op +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ + .text + .align 4 + .globl fe_sq + .type fe_sq, %function +fe_sq: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + bl fe_sq_op pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size fe_sq,.-fe_sq +#ifdef HAVE_CURVE25519 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) .text .align 4 .globl fe_mul121666 @@ -3457,719 +3402,121 @@ fe_mul121666: push {r4, r5, r6, r7, r8, r9, r10, lr} # Multiply by 121666 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r2, [r1] - ldr r3, [r1, #4] -#else - ldrd r2, r3, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #16] - ldr r7, [r1, #20] -#else - ldrd r6, r7, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #24] - ldr r9, [r1, #28] -#else - ldrd r8, r9, [r1, #24] -#endif - movw lr, #0xdb42 - movt lr, #1 - umull r2, r10, r2, lr - umull r3, r12, r3, lr - adds r3, r3, r10 - adc r10, r12, #0 - umull r4, r12, r4, lr - adds r4, r4, r10 - adc r10, r12, #0 - umull r5, r12, r5, lr - adds r5, r5, r10 - adc r10, r12, #0 - umull r6, r12, r6, lr - adds r6, r6, r10 - adc r10, r12, #0 - umull r7, r12, r7, lr - adds r7, r7, r10 - adc r10, r12, #0 - umull r8, r12, r8, lr - adds r8, r8, r10 - adc r10, r12, #0 - umull r9, r12, r9, lr - adds r9, r9, r10 - adc r10, r12, #0 - mov lr, #19 - lsl r10, r10, #1 - orr r10, r10, r9, lsr #31 - mul r10, r10, lr - and r9, r9, #0x7fffffff - adds r2, r2, r10 + ldm r1, {r2, r3, r4, r5, r6, r7, r8, r9} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #1 + lsl r10, r10, #8 + orr r10, r10, #0xdb + lsl r10, r10, #8 + orr r10, r10, #0x42 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xdb + lsl r10, r10, #8 + add r10, r10, #0x42 +#else + mov r10, #0xdb42 +#endif + movt r10, #1 +#endif + umull r2, r12, r10, r2 + umull r3, lr, r10, r3 + adds r3, r3, r12 + adc lr, lr, #0 + umull r4, r12, r10, r4 + adds r4, r4, lr + adc r12, r12, #0 + umull r5, lr, r10, r5 + adds r5, r5, r12 + adc lr, lr, #0 + umull r6, r12, r10, r6 + adds r6, r6, lr + adc r12, r12, #0 + umull r7, lr, r10, r7 + adds r7, r7, r12 + adc lr, lr, #0 + umull r8, r12, r10, r8 + adds r8, r8, lr + adc r12, r12, #0 + umull r9, lr, r10, r9 + adds r9, r9, r12 + mov r10, #19 + adc lr, lr, #0 + lsl lr, lr, #1 + orr lr, lr, r9, LSR #31 + mul lr, r10, lr + adds r2, r2, lr adcs r3, r3, #0 adcs r4, r4, #0 adcs r5, r5, #0 adcs r6, r6, #0 adcs r7, r7, #0 - adcs r8, r8, #0 - adc r9, r9, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r2, [r0] - str r3, [r0, #4] -#else - strd r2, r3, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #16] - str r7, [r0, #20] -#else - strd r6, r7, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0x80000000 #else - strd r8, r9, [r0, #24] + bfc r9, #31, #1 #endif + adcs r8, r8, #0 + adc r9, r9, #0 + stm r0, {r2, r3, r4, r5, r6, r7, r8, r9} pop {r4, r5, r6, r7, r8, r9, r10, pc} .size fe_mul121666,.-fe_mul121666 +#else .text .align 4 - .globl fe_sq2 - .type fe_sq2, %function -fe_sq2: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #0x40 - # Square * 2 - ldr r7, [r1] - ldr r8, [r1, #4] - ldr r9, [r1, #8] - ldr r10, [r1, #12] - ldr r12, [r1, #16] - # A[0] * A[0] = 0 - umull r4, r5, r7, r7 - str r4, [sp] - # A[0] * A[1] = 1 - umull r2, r3, r7, r8 - mov r6, #0 - adds r5, r5, r2 - adc r6, r6, r3 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #4] - # A[1] * A[1] = 2 - umull r2, r3, r8, r8 - adds r6, r6, r2 - adc r4, r4, r3 - # A[0] * A[2] = 2 - umull r2, r3, r7, r9 - adds r6, r6, r2 - mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - str r6, [sp, #8] - # A[0] * A[3] = 3 - umull r2, r3, r7, r10 - adds r4, r4, r2 - adc r5, r5, r3 - adds r4, r4, r2 - mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[1] * A[2] = 3 - umull r2, r3, r8, r9 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #12] - # A[2] * A[2] = 4 - umull r2, r3, r9, r9 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[1] * A[3] = 4 - umull r2, r3, r8, r10 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[0] * A[4] = 4 - umull r2, r3, r7, r12 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #16] - # A[0] * A[5] = 5 - ldr r11, [r1, #20] - umull r2, r3, r7, r11 - adds r6, r6, r2 - mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[1] * A[4] = 5 - umull r2, r3, r8, r12 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[2] * A[3] = 5 - umull r2, r3, r9, r10 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - str r6, [sp, #20] - # A[3] * A[3] = 6 - umull r2, r3, r10, r10 - adds r4, r4, r2 - mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[2] * A[4] = 6 - umull r2, r3, r9, r12 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[1] * A[5] = 6 - umull r2, r3, r8, r11 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[0] * A[6] = 6 - ldr r11, [r1, #24] - umull r2, r3, r7, r11 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #24] - # A[0] * A[7] = 7 - ldr r11, [r1, #28] - umull r2, r3, r7, r11 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[1] * A[6] = 7 - ldr r11, [r1, #24] - umull r2, r3, r8, r11 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[2] * A[5] = 7 - ldr r11, [r1, #20] - umull r2, r3, r9, r11 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[3] * A[4] = 7 - umull r2, r3, r10, r12 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #28] - # A[4] * A[4] = 8 - umull r2, r3, r12, r12 - adds r6, r6, r2 - mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[3] * A[5] = 8 - umull r2, r3, r10, r11 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[2] * A[6] = 8 - ldr r11, [r1, #24] - umull r2, r3, r9, r11 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[1] * A[7] = 8 - ldr r11, [r1, #28] - umull r2, r3, r8, r11 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - str r6, [sp, #32] - ldr r7, [r1, #20] - # A[2] * A[7] = 9 - umull r2, r3, r9, r11 - adds r4, r4, r2 - mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[3] * A[6] = 9 - ldr r11, [r1, #24] - umull r2, r3, r10, r11 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[4] * A[5] = 9 - umull r2, r3, r12, r7 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #36] - mov r8, r11 - # A[5] * A[5] = 10 - umull r2, r3, r7, r7 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[4] * A[6] = 10 - umull r2, r3, r12, r8 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - # A[3] * A[7] = 10 - ldr r11, [r1, #28] - umull r2, r3, r10, r11 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #40] - mov r9, r11 - # A[4] * A[7] = 11 - umull r2, r3, r12, r9 - adds r6, r6, r2 - mov r5, #0 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - # A[5] * A[6] = 11 - umull r2, r3, r7, r8 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - adds r6, r6, r2 - adcs r4, r4, r3 - adc r5, r5, #0 - str r6, [sp, #44] - # A[6] * A[6] = 12 - umull r2, r3, r8, r8 - adds r4, r4, r2 - mov r6, #0 - adcs r5, r5, r3 - adc r6, r6, #0 - # A[5] * A[7] = 12 - umull r2, r3, r7, r9 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - adds r4, r4, r2 - adcs r5, r5, r3 - adc r6, r6, #0 - str r4, [sp, #48] - # A[6] * A[7] = 13 - umull r2, r3, r8, r9 - adds r5, r5, r2 - mov r4, #0 - adcs r6, r6, r3 - adc r4, r4, #0 - adds r5, r5, r2 - adcs r6, r6, r3 - adc r4, r4, #0 - str r5, [sp, #52] - # A[7] * A[7] = 14 - umull r2, r3, r9, r9 - adds r6, r6, r2 - adc r4, r4, r3 - str r6, [sp, #56] - str r4, [sp, #60] - # Double and Reduce - # Load bottom half -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp] - ldr r5, [sp, #4] -#else - ldrd r4, r5, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #8] - ldr r7, [sp, #12] -#else - ldrd r6, r7, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #16] - ldr r9, [sp, #20] + .globl fe_mul121666 + .type fe_mul121666, %function +fe_mul121666: + push {r4, r5, r6, r7, r8, r9, r10, lr} + # Multiply by 121666 + ldm r1, {r2, r3, r4, r5, r6, r7, r8, r9} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #1 + lsl lr, lr, #8 + orr lr, lr, #0xdb + lsl lr, lr, #8 + orr lr, lr, #0x42 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #0xdb + lsl lr, lr, #8 + add lr, lr, #0x42 #else - ldrd r8, r9, [sp, #16] + mov lr, #0xdb42 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #24] - ldr r11, [sp, #28] -#else - ldrd r10, r11, [sp, #24] + movt lr, #1 #endif - lsr r2, r11, #30 - lsl r11, r11, #1 - orr r11, r11, r10, lsr #31 + umull r2, r10, lr, r2 + sub r12, lr, #1 + umaal r3, r10, r12, r3 + umaal r4, r10, r12, r4 + umaal r5, r10, r12, r5 + umaal r6, r10, r12, r6 + umaal r7, r10, r12, r7 + umaal r8, r10, r12, r8 + mov lr, #19 + umaal r9, r10, r12, r9 lsl r10, r10, #1 orr r10, r10, r9, lsr #31 - lsl r9, r9, #1 - orr r9, r9, r8, lsr #31 - lsl r8, r8, #1 - orr r8, r8, r7, lsr #31 - lsl r7, r7, #1 - orr r7, r7, r6, lsr #31 - lsl r6, r6, #1 - orr r6, r6, r5, lsr #31 - lsl r5, r5, #1 - orr r5, r5, r4, lsr #31 - lsl r4, r4, #1 - and r11, r11, #0x7fffffff - mov r12, #19 - ldr r1, [sp, #32] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - adds r4, r4, r2 - mov lr, #0 - adcs r5, r5, r3 - adc lr, lr, #0 - lsr r2, r1, #30 - ldr r1, [sp, #36] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r5, r5, r2 - mov lr, #0 - adcs r6, r6, r3 - adc lr, lr, #0 - lsr r2, r1, #30 - ldr r1, [sp, #40] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r6, r6, r2 - mov lr, #0 - adcs r7, r7, r3 - adc lr, lr, #0 - lsr r2, r1, #30 - ldr r1, [sp, #44] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r7, r7, r2 - mov lr, #0 - adcs r8, r8, r3 - adc lr, lr, #0 - lsr r2, r1, #30 - ldr r1, [sp, #48] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r8, r8, r2 - mov lr, #0 - adcs r9, r9, r3 - adc lr, lr, #0 - lsr r2, r1, #30 - ldr r1, [sp, #52] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r9, r9, r2 - mov lr, #0 - adcs r10, r10, r3 - adc lr, lr, #0 - lsr r2, r1, #30 - ldr r1, [sp, #56] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - add r3, r3, lr - adds r10, r10, r2 - mov lr, #0 - adcs r11, r11, r3 - adc lr, lr, #0 - lsr r2, r1, #30 - ldr r1, [sp, #60] - orr r2, r2, r1, lsl #2 - umull r2, r3, r12, r2 - adds r11, r11, r2 - adc r2, r3, lr - # Overflow - lsl r2, r2, #1 - orr r2, r2, r11, lsr #31 - mul r2, r2, r12 - and r11, r11, #0x7fffffff - adds r4, r4, r2 - adcs r5, r5, #0 - adcs r6, r6, #0 - adcs r7, r7, #0 - adcs r8, r8, #0 - adcs r9, r9, #0 - adcs r10, r10, #0 - adc r11, r11, #0 - # Reduce if top bit set - asr r2, r11, #31 - and r2, r2, r12 - and r11, r11, #0x7fffffff - adds r4, r4, r2 + mul r10, lr, r10 + adds r2, r2, r10 + adcs r3, r3, #0 + adcs r4, r4, #0 adcs r5, r5, #0 adcs r6, r6, #0 adcs r7, r7, #0 - adcs r8, r8, #0 - adcs r9, r9, #0 - adcs r10, r10, #0 - adc r11, r11, #0 - # Store -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0x80000000 #else - strd r4, r5, [r0] + bfc r9, #31, #1 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - add sp, sp, #0x40 - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_sq2,.-fe_sq2 - .text - .align 4 - .globl fe_invert - .type fe_invert, %function -fe_invert: - push {r4, lr} - sub sp, sp, #0x88 - # Invert - str r0, [sp, #128] - str r1, [sp, #132] - mov r0, sp - ldr r1, [sp, #132] - bl fe_sq - add r0, sp, #32 - mov r1, sp - bl fe_sq - add r0, sp, #32 - add r1, sp, #32 - bl fe_sq - add r0, sp, #32 - ldr r1, [sp, #132] - add r2, sp, #32 - bl fe_mul - mov r0, sp - mov r1, sp - add r2, sp, #32 - bl fe_mul - add r0, sp, #0x40 - mov r1, sp - bl fe_sq - add r0, sp, #32 - add r1, sp, #32 - add r2, sp, #0x40 - bl fe_mul - add r0, sp, #0x40 - add r1, sp, #32 - bl fe_sq - mov r4, #4 -L_fe_invert1: - add r0, sp, #0x40 - add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert1 - add r0, sp, #32 - add r1, sp, #0x40 - add r2, sp, #32 - bl fe_mul - add r0, sp, #0x40 - add r1, sp, #32 - bl fe_sq - mov r4, #9 -L_fe_invert2: - add r0, sp, #0x40 - add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert2 - add r0, sp, #0x40 - add r1, sp, #0x40 - add r2, sp, #32 - bl fe_mul - add r0, sp, #0x60 - add r1, sp, #0x40 - bl fe_sq - mov r4, #19 -L_fe_invert3: - add r0, sp, #0x60 - add r1, sp, #0x60 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert3 - add r0, sp, #0x40 - add r1, sp, #0x60 - add r2, sp, #0x40 - bl fe_mul - mov r4, #10 -L_fe_invert4: - add r0, sp, #0x40 - add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert4 - add r0, sp, #32 - add r1, sp, #0x40 - add r2, sp, #32 - bl fe_mul - add r0, sp, #0x40 - add r1, sp, #32 - bl fe_sq - mov r4, #49 -L_fe_invert5: - add r0, sp, #0x40 - add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert5 - add r0, sp, #0x40 - add r1, sp, #0x40 - add r2, sp, #32 - bl fe_mul - add r0, sp, #0x60 - add r1, sp, #0x40 - bl fe_sq - mov r4, #0x63 -L_fe_invert6: - add r0, sp, #0x60 - add r1, sp, #0x60 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert6 - add r0, sp, #0x40 - add r1, sp, #0x60 - add r2, sp, #0x40 - bl fe_mul - mov r4, #50 -L_fe_invert7: - add r0, sp, #0x40 - add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert7 - add r0, sp, #32 - add r1, sp, #0x40 - add r2, sp, #32 - bl fe_mul - mov r4, #5 -L_fe_invert8: - add r0, sp, #32 - add r1, sp, #32 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_fe_invert8 - ldr r0, [sp, #128] - add r1, sp, #32 - mov r2, sp - bl fe_mul - ldr r1, [sp, #132] - ldr r0, [sp, #128] - add sp, sp, #0x88 - pop {r4, pc} - .size fe_invert,.-fe_invert + adcs r8, r8, #0 + adc r9, r9, #0 + stm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + pop {r4, r5, r6, r7, r8, r9, r10, pc} + .size fe_mul121666,.-fe_mul121666 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#ifndef WC_NO_CACHE_RESISTANT .text .align 4 .globl curve25519 @@ -4182,138 +3529,24 @@ str r2, [sp, #168] mov r1, #0 str r1, [sp, #172] - # Set one - mov r10, #1 - mov r11, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0] - str r11, [r0, #4] -#else - strd r10, r11, [r0] -#endif - mov r10, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #16] - str r11, [r0, #20] -#else - strd r10, r11, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - # Set zero + mov r4, #1 + mov r5, #0 + mov r6, #0 + mov r7, #0 + mov r8, #0 + mov r9, #0 mov r10, #0 mov r11, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp] - str r11, [sp, #4] -#else - strd r10, r11, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #8] - str r11, [sp, #12] -#else - strd r10, r11, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #16] - str r11, [sp, #20] -#else - strd r10, r11, [sp, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #24] - str r11, [sp, #28] -#else - strd r10, r11, [sp, #24] -#endif - # Set one - mov r10, #1 - mov r11, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #32] - str r11, [sp, #36] -#else - strd r10, r11, [sp, #32] -#endif - mov r10, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #40] - str r11, [sp, #44] -#else - strd r10, r11, [sp, #40] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #48] - str r11, [sp, #52] -#else - strd r10, r11, [sp, #48] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #56] - str r11, [sp, #60] -#else - strd r10, r11, [sp, #56] -#endif + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + add r3, sp, #32 + stm r3, {r4, r5, r6, r7, r8, r9, r10, r11} + mov r4, #0 + mov r3, sp + stm r3, {r4, r5, r6, r7, r8, r9, r10, r11} + add r3, sp, #0x40 # Copy -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2] - ldr r5, [r2, #4] -#else - ldrd r4, r5, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r2, #8] - ldr r7, [r2, #12] -#else - ldrd r6, r7, [r2, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #64] - str r5, [sp, #68] -#else - strd r4, r5, [sp, #64] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #72] - str r7, [sp, #76] -#else - strd r6, r7, [sp, #72] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #16] - ldr r5, [r2, #20] -#else - ldrd r4, r5, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r2, #24] - ldr r7, [r2, #28] -#else - ldrd r6, r7, [r2, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #80] - str r5, [sp, #84] -#else - strd r4, r5, [sp, #80] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #88] - str r7, [sp, #92] -#else - strd r6, r7, [sp, #88] -#endif + ldm r2, {r4, r5, r6, r7, r8, r9, r10, r11} + stm r3, {r4, r5, r6, r7, r8, r9, r10, r11} mov r1, #30 str r1, [sp, #180] mov r2, #28 @@ -4331,19 +3564,11 @@ str r1, [sp, #172] ldr r0, [sp, #160] # Conditional Swap - neg r1, r1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #64] - ldr r7, [sp, #68] -#else - ldrd r6, r7, [sp, #64] -#endif + rsb r1, r1, #0 + mov r3, r0 + add r12, sp, #0x40 + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4352,30 +3577,10 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #64] - str r7, [sp, #68] -#else - strd r6, r7, [sp, #64] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #72] - ldr r7, [sp, #76] -#else - ldrd r6, r7, [sp, #72] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4384,30 +3589,10 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #72] - str r7, [sp, #76] -#else - strd r6, r7, [sp, #72] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #80] - ldr r7, [sp, #84] -#else - ldrd r6, r7, [sp, #80] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4416,30 +3601,10 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #80] - str r7, [sp, #84] -#else - strd r6, r7, [sp, #80] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #24] - ldr r5, [r0, #28] -#else - ldrd r4, r5, [r0, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #88] - ldr r7, [sp, #92] -#else - ldrd r6, r7, [sp, #88] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4448,33 +3613,15 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #24] - str r5, [r0, #28] -#else - strd r4, r5, [r0, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #88] - str r7, [sp, #92] -#else - strd r6, r7, [sp, #88] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} ldr r1, [sp, #172] # Conditional Swap - neg r1, r1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp] - ldr r5, [sp, #4] -#else - ldrd r4, r5, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #32] - ldr r7, [sp, #36] -#else - ldrd r6, r7, [sp, #32] -#endif + rsb r1, r1, #0 + mov r3, sp + add r12, sp, #32 + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4483,30 +3630,10 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp] - str r5, [sp, #4] -#else - strd r4, r5, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #32] - str r7, [sp, #36] -#else - strd r6, r7, [sp, #32] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #8] - ldr r5, [sp, #12] -#else - ldrd r4, r5, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #40] - ldr r7, [sp, #44] -#else - ldrd r6, r7, [sp, #40] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4515,30 +3642,10 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #8] - str r5, [sp, #12] -#else - strd r4, r5, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #40] - str r7, [sp, #44] -#else - strd r6, r7, [sp, #40] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #16] - ldr r5, [sp, #20] -#else - ldrd r4, r5, [sp, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #48] - ldr r7, [sp, #52] -#else - ldrd r6, r7, [sp, #48] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4547,30 +3654,10 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #16] - str r5, [sp, #20] -#else - strd r4, r5, [sp, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #48] - str r7, [sp, #52] -#else - strd r6, r7, [sp, #48] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #24] - ldr r5, [sp, #28] -#else - ldrd r4, r5, [sp, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #56] - ldr r7, [sp, #60] -#else - ldrd r6, r7, [sp, #56] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} + ldm r3, {r4, r5} + ldm r12, {r6, r7} eor r8, r4, r6 eor r9, r5, r7 and r8, r8, r1 @@ -4579,1093 +3666,68 @@ eor r5, r5, r9 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #24] - str r5, [sp, #28] -#else - strd r4, r5, [sp, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #56] - str r7, [sp, #60] -#else - strd r6, r7, [sp, #56] -#endif + stm r3!, {r4, r5} + stm r12!, {r6, r7} ldr r1, [sp, #184] str r1, [sp, #172] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp] - ldr r7, [sp, #4] -#else - ldrd r6, r7, [sp] -#endif - adds r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif - # Sub - subs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #128] - str r11, [sp, #132] -#else - strd r10, r11, [sp, #128] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #8] - ldr r7, [sp, #12] -#else - ldrd r6, r7, [sp, #8] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] -#endif - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #136] - str r11, [sp, #140] -#else - strd r10, r11, [sp, #136] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #16] - ldr r7, [sp, #20] -#else - ldrd r6, r7, [sp, #16] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #144] - str r11, [sp, #148] -#else - strd r10, r11, [sp, #144] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #24] - ldr r5, [r0, #28] -#else - ldrd r4, r5, [r0, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #24] - ldr r7, [sp, #28] -#else - ldrd r6, r7, [sp, #24] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r3, #-19 - asr r2, r9, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r3 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r2 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r2 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif - sbcs r8, r8, r2 - sbc r9, r9, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] -#endif - mov r3, #-19 - asr r2, r11, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #128] - ldr r5, [sp, #132] -#else - ldrd r4, r5, [sp, #128] -#endif - adds r4, r4, r3 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #128] - str r5, [sp, #132] -#else - strd r4, r5, [sp, #128] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #136] - ldr r5, [sp, #140] -#else - ldrd r4, r5, [sp, #136] -#endif - adcs r4, r4, r2 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #136] - str r5, [sp, #140] -#else - strd r4, r5, [sp, #136] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #144] - ldr r5, [sp, #148] -#else - ldrd r4, r5, [sp, #144] -#endif - adcs r4, r4, r2 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #144] - str r5, [sp, #148] -#else - strd r4, r5, [sp, #144] -#endif - adcs r10, r10, r2 - adc r11, r11, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #152] - str r11, [sp, #156] -#else - strd r10, r11, [sp, #152] -#endif - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #64] - ldr r5, [sp, #68] -#else - ldrd r4, r5, [sp, #64] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #32] - ldr r7, [sp, #36] -#else - ldrd r6, r7, [sp, #32] -#endif - adds r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp] - str r9, [sp, #4] -#else - strd r8, r9, [sp] -#endif - # Sub - subs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #96] - str r11, [sp, #100] -#else - strd r10, r11, [sp, #96] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #72] - ldr r5, [sp, #76] -#else - ldrd r4, r5, [sp, #72] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #40] - ldr r7, [sp, #44] -#else - ldrd r6, r7, [sp, #40] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #8] - str r9, [sp, #12] -#else - strd r8, r9, [sp, #8] -#endif - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #104] - str r11, [sp, #108] -#else - strd r10, r11, [sp, #104] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #80] - ldr r5, [sp, #84] -#else - ldrd r4, r5, [sp, #80] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #48] - ldr r7, [sp, #52] -#else - ldrd r6, r7, [sp, #48] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #16] - str r9, [sp, #20] -#else - strd r8, r9, [sp, #16] -#endif - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #112] - str r11, [sp, #116] -#else - strd r10, r11, [sp, #112] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #88] - ldr r5, [sp, #92] -#else - ldrd r4, r5, [sp, #88] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #56] - ldr r7, [sp, #60] -#else - ldrd r6, r7, [sp, #56] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r3, #-19 - asr r2, r9, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp] - ldr r5, [sp, #4] -#else - ldrd r4, r5, [sp] -#endif - subs r4, r4, r3 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp] - str r5, [sp, #4] -#else - strd r4, r5, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #8] - ldr r5, [sp, #12] -#else - ldrd r4, r5, [sp, #8] -#endif - sbcs r4, r4, r2 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #8] - str r5, [sp, #12] -#else - strd r4, r5, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #16] - ldr r5, [sp, #20] -#else - ldrd r4, r5, [sp, #16] -#endif - sbcs r4, r4, r2 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #16] - str r5, [sp, #20] -#else - strd r4, r5, [sp, #16] -#endif - sbcs r8, r8, r2 - sbc r9, r9, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #24] - str r9, [sp, #28] -#else - strd r8, r9, [sp, #24] -#endif - mov r3, #-19 - asr r2, r11, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #96] - ldr r5, [sp, #100] -#else - ldrd r4, r5, [sp, #96] -#endif - adds r4, r4, r3 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #96] - str r5, [sp, #100] -#else - strd r4, r5, [sp, #96] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #104] - ldr r5, [sp, #108] -#else - ldrd r4, r5, [sp, #104] -#endif - adcs r4, r4, r2 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #104] - str r5, [sp, #108] -#else - strd r4, r5, [sp, #104] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #112] - ldr r5, [sp, #116] -#else - ldrd r4, r5, [sp, #112] -#endif - adcs r4, r4, r2 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #112] - str r5, [sp, #116] -#else - strd r4, r5, [sp, #112] -#endif - adcs r10, r10, r2 - adc r11, r11, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #120] - str r11, [sp, #124] -#else - strd r10, r11, [sp, #120] -#endif + mov r3, sp + ldr r2, [sp, #160] + add r1, sp, #0x80 + ldr r0, [sp, #160] + bl fe_add_sub_op + add r3, sp, #32 + add r2, sp, #0x40 + add r1, sp, #0x60 + mov r0, sp + bl fe_add_sub_op ldr r2, [sp, #160] add r1, sp, #0x60 add r0, sp, #32 - bl fe_mul + bl fe_mul_op add r2, sp, #0x80 - add r1, sp, #0 - add r0, sp, #0 - bl fe_mul + mov r1, sp + mov r0, sp + bl fe_mul_op add r1, sp, #0x80 - add r0, sp, #0x60 - bl fe_sq - ldr r1, [sp, #160] add r0, sp, #0x80 - bl fe_sq - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #32] - ldr r5, [sp, #36] -#else - ldrd r4, r5, [sp, #32] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp] - ldr r7, [sp, #4] -#else - ldrd r6, r7, [sp] -#endif - adds r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #64] - str r9, [sp, #68] -#else - strd r8, r9, [sp, #64] -#endif - # Sub - subs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp] - str r11, [sp, #4] -#else - strd r10, r11, [sp] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #40] - ldr r5, [sp, #44] -#else - ldrd r4, r5, [sp, #40] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #8] - ldr r7, [sp, #12] -#else - ldrd r6, r7, [sp, #8] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #72] - str r9, [sp, #76] -#else - strd r8, r9, [sp, #72] -#endif - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #8] - str r11, [sp, #12] -#else - strd r10, r11, [sp, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #48] - ldr r5, [sp, #52] -#else - ldrd r4, r5, [sp, #48] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #16] - ldr r7, [sp, #20] -#else - ldrd r6, r7, [sp, #16] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - mov r3, #0 - adcs r9, r5, r7 - adc r3, r3, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #80] - str r9, [sp, #84] -#else - strd r8, r9, [sp, #80] -#endif - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - mov r12, #0 - sbcs r11, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #16] - str r11, [sp, #20] -#else - strd r10, r11, [sp, #16] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #56] - ldr r5, [sp, #60] -#else - ldrd r4, r5, [sp, #56] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #24] - ldr r7, [sp, #28] -#else - ldrd r6, r7, [sp, #24] -#endif - adds r3, r3, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds r12, r12, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r3, #-19 - asr r2, r9, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #64] - ldr r5, [sp, #68] -#else - ldrd r4, r5, [sp, #64] -#endif - subs r4, r4, r3 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #64] - str r5, [sp, #68] -#else - strd r4, r5, [sp, #64] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #72] - ldr r5, [sp, #76] -#else - ldrd r4, r5, [sp, #72] -#endif - sbcs r4, r4, r2 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #72] - str r5, [sp, #76] -#else - strd r4, r5, [sp, #72] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #80] - ldr r5, [sp, #84] -#else - ldrd r4, r5, [sp, #80] -#endif - sbcs r4, r4, r2 - sbcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #80] - str r5, [sp, #84] -#else - strd r4, r5, [sp, #80] -#endif - sbcs r8, r8, r2 - sbc r9, r9, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #88] - str r9, [sp, #92] -#else - strd r8, r9, [sp, #88] -#endif - mov r3, #-19 - asr r2, r11, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp] - ldr r5, [sp, #4] -#else - ldrd r4, r5, [sp] -#endif - adds r4, r4, r3 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp] - str r5, [sp, #4] -#else - strd r4, r5, [sp] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #8] - ldr r5, [sp, #12] -#else - ldrd r4, r5, [sp, #8] -#endif - adcs r4, r4, r2 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #8] - str r5, [sp, #12] -#else - strd r4, r5, [sp, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #16] - ldr r5, [sp, #20] -#else - ldrd r4, r5, [sp, #16] -#endif - adcs r4, r4, r2 - adcs r5, r5, r2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #16] - str r5, [sp, #20] -#else - strd r4, r5, [sp, #16] -#endif - adcs r10, r10, r2 - adc r11, r11, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #24] - str r11, [sp, #28] -#else - strd r10, r11, [sp, #24] -#endif - add r2, sp, #0x60 - add r1, sp, #0x80 + bl fe_sq_op + ldr r1, [sp, #160] + add r0, sp, #0x60 + bl fe_sq_op + mov r3, sp + add r2, sp, #32 + mov r1, sp + add r0, sp, #0x40 + bl fe_add_sub_op + add r2, sp, #0x80 + add r1, sp, #0x60 ldr r0, [sp, #160] - bl fe_mul - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #128] - ldr r5, [sp, #132] -#else - ldrd r4, r5, [sp, #128] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #136] - ldr r7, [sp, #140] -#else - ldrd r6, r7, [sp, #136] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #96] - ldr r9, [sp, #100] -#else - ldrd r8, r9, [sp, #96] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #104] - ldr r11, [sp, #108] -#else - ldrd r10, r11, [sp, #104] -#endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #128] - str r9, [sp, #132] -#else - strd r8, r9, [sp, #128] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #136] - str r11, [sp, #140] -#else - strd r10, r11, [sp, #136] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #144] - ldr r5, [sp, #148] -#else - ldrd r4, r5, [sp, #144] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #152] - ldr r7, [sp, #156] -#else - ldrd r6, r7, [sp, #152] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #112] - ldr r9, [sp, #116] -#else - ldrd r8, r9, [sp, #112] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #120] - ldr r11, [sp, #124] -#else - ldrd r10, r11, [sp, #120] -#endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r3, #-19 - asr r2, r11, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #128] - ldr r5, [sp, #132] -#else - ldrd r4, r5, [sp, #128] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #136] - ldr r7, [sp, #140] -#else - ldrd r6, r7, [sp, #136] -#endif - adds r4, r4, r3 - adcs r5, r5, r2 - adcs r6, r6, r2 - adcs r7, r7, r2 - adcs r8, r8, r2 - adcs r9, r9, r2 - adcs r10, r10, r2 - adc r11, r11, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #128] - str r5, [sp, #132] -#else - strd r4, r5, [sp, #128] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #136] - str r7, [sp, #140] -#else - strd r6, r7, [sp, #136] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #144] - str r9, [sp, #148] -#else - strd r8, r9, [sp, #144] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #152] - str r11, [sp, #156] -#else - strd r10, r11, [sp, #152] -#endif - add r1, sp, #0 - add r0, sp, #0 - bl fe_sq - # Multiply by 121666 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #128] - ldr r5, [sp, #132] -#else - ldrd r4, r5, [sp, #128] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #136] - ldr r7, [sp, #140] -#else - ldrd r6, r7, [sp, #136] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #144] - ldr r9, [sp, #148] -#else - ldrd r8, r9, [sp, #144] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #152] - ldr r11, [sp, #156] -#else - ldrd r10, r11, [sp, #152] -#endif - movw r12, #0xdb42 - movt r12, #1 - umull r4, r2, r4, r12 - umull r5, r3, r5, r12 - adds r5, r5, r2 - adc r2, r3, #0 - umull r6, r3, r6, r12 - adds r6, r6, r2 - adc r2, r3, #0 - umull r7, r3, r7, r12 - adds r7, r7, r2 - adc r2, r3, #0 - umull r8, r3, r8, r12 - adds r8, r8, r2 - adc r2, r3, #0 - umull r9, r3, r9, r12 - adds r9, r9, r2 - adc r2, r3, #0 - umull r10, r3, r10, r12 - adds r10, r10, r2 - adc r2, r3, #0 - umull r11, r3, r11, r12 - adds r11, r11, r2 - adc r2, r3, #0 - mov r12, #19 - lsl r2, r2, #1 - orr r2, r2, r11, lsr #31 - mul r2, r2, r12 - and r11, r11, #0x7fffffff - adds r4, r4, r2 - adcs r5, r5, #0 - adcs r6, r6, #0 - adcs r7, r7, #0 - adcs r8, r8, #0 - adcs r9, r9, #0 - adcs r10, r10, #0 - adc r11, r11, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #32] - str r5, [sp, #36] -#else - strd r4, r5, [sp, #32] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #40] - str r7, [sp, #44] -#else - strd r6, r7, [sp, #40] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #48] - str r9, [sp, #52] -#else - strd r8, r9, [sp, #48] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #56] - str r11, [sp, #60] -#else - strd r10, r11, [sp, #56] -#endif + bl fe_mul_op + add r2, sp, #0x80 + add r1, sp, #0x60 + add r0, sp, #0x60 + bl fe_sub_op + mov r1, sp + mov r0, sp + bl fe_sq_op + add r1, sp, #0x60 + add r0, sp, #32 + bl fe_mul121666 add r1, sp, #0x40 add r0, sp, #0x40 - bl fe_sq - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #96] - ldr r5, [sp, #100] -#else - ldrd r4, r5, [sp, #96] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #104] - ldr r7, [sp, #108] -#else - ldrd r6, r7, [sp, #104] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #32] - ldr r9, [sp, #36] -#else - ldrd r8, r9, [sp, #32] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #40] - ldr r11, [sp, #44] -#else - ldrd r10, r11, [sp, #40] -#endif - adds r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #96] - str r9, [sp, #100] -#else - strd r8, r9, [sp, #96] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #104] - str r11, [sp, #108] -#else - strd r10, r11, [sp, #104] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #112] - ldr r5, [sp, #116] -#else - ldrd r4, r5, [sp, #112] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #120] - ldr r7, [sp, #124] -#else - ldrd r6, r7, [sp, #120] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [sp, #48] - ldr r9, [sp, #52] -#else - ldrd r8, r9, [sp, #48] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [sp, #56] - ldr r11, [sp, #60] -#else - ldrd r10, r11, [sp, #56] -#endif - adcs r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adc r11, r7, r11 - mov r3, #-19 - asr r2, r11, #31 - # Mask the modulus - and r3, r2, r3 - and r12, r2, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [sp, #96] - ldr r5, [sp, #100] -#else - ldrd r4, r5, [sp, #96] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [sp, #104] - ldr r7, [sp, #108] -#else - ldrd r6, r7, [sp, #104] -#endif - subs r4, r4, r3 - sbcs r5, r5, r2 - sbcs r6, r6, r2 - sbcs r7, r7, r2 - sbcs r8, r8, r2 - sbcs r9, r9, r2 - sbcs r10, r10, r2 - sbc r11, r11, r12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [sp, #96] - str r5, [sp, #100] -#else - strd r4, r5, [sp, #96] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [sp, #104] - str r7, [sp, #108] -#else - strd r6, r7, [sp, #104] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [sp, #112] - str r9, [sp, #116] -#else - strd r8, r9, [sp, #112] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [sp, #120] - str r11, [sp, #124] -#else - strd r10, r11, [sp, #120] -#endif - add r2, sp, #0 + bl fe_sq_op + add r2, sp, #32 + add r1, sp, #0x80 + add r0, sp, #0x80 + bl fe_add_op + mov r2, sp ldr r1, [sp, #168] add r0, sp, #32 - bl fe_mul - add r2, sp, #0x60 - add r1, sp, #0x80 - add r0, sp, #0 - bl fe_mul + bl fe_mul_op + add r2, sp, #0x80 + add r1, sp, #0x60 + mov r0, sp + bl fe_mul_op ldr r2, [sp, #176] ldr r1, [sp, #180] subs r1, r1, #1 @@ -5677,1524 +3739,1570 @@ str r2, [sp, #176] bge L_curve25519_words # Invert - add r0, sp, #32 add r1, sp, #0 - bl fe_sq - add r0, sp, #0x40 + add r0, sp, #32 + bl fe_sq_op add r1, sp, #32 - bl fe_sq add r0, sp, #0x40 + bl fe_sq_op add r1, sp, #0x40 - bl fe_sq add r0, sp, #0x40 + bl fe_sq_op + add r2, sp, #0x40 add r1, sp, #0 + add r0, sp, #0x40 + bl fe_mul_op add r2, sp, #0x40 - bl fe_mul + add r1, sp, #32 add r0, sp, #32 + bl fe_mul_op add r1, sp, #32 - add r2, sp, #0x40 - bl fe_mul add r0, sp, #0x60 - add r1, sp, #32 - bl fe_sq + bl fe_sq_op + add r2, sp, #0x60 + add r1, sp, #0x40 add r0, sp, #0x40 + bl fe_mul_op add r1, sp, #0x40 - add r2, sp, #0x60 - bl fe_mul add r0, sp, #0x60 - add r1, sp, #0x40 - bl fe_sq - mov r4, #4 + bl fe_sq_op + mov r12, #4 L_curve25519_inv_1: - add r0, sp, #0x60 add r1, sp, #0x60 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_curve25519_inv_1 + add r2, sp, #0x40 + add r1, sp, #0x60 add r0, sp, #0x40 + bl fe_mul_op + add r1, sp, #0x40 + add r0, sp, #0x60 + bl fe_sq_op + mov r12, #9 +L_curve25519_inv_2: add r1, sp, #0x60 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_2 add r2, sp, #0x40 - bl fe_mul + add r1, sp, #0x60 add r0, sp, #0x60 - add r1, sp, #0x40 - bl fe_sq - mov r4, #9 -L_curve25519_inv_2: + bl fe_mul_op + add r1, sp, #0x60 + add r0, sp, #0x80 + bl fe_sq_op + mov r12, #19 +L_curve25519_inv_3: + add r1, sp, #0x80 + add r0, sp, #0x80 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_3 + add r2, sp, #0x60 + add r1, sp, #0x80 add r0, sp, #0x60 + bl fe_mul_op + mov r12, #10 +L_curve25519_inv_4: add r1, sp, #0x60 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_curve25519_inv_2 add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_4 + add r2, sp, #0x40 add r1, sp, #0x60 + add r0, sp, #0x40 + bl fe_mul_op + add r1, sp, #0x40 + add r0, sp, #0x60 + bl fe_sq_op + mov r12, #49 +L_curve25519_inv_5: + add r1, sp, #0x60 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_5 add r2, sp, #0x40 - bl fe_mul + add r1, sp, #0x60 + add r0, sp, #0x60 + bl fe_mul_op + add r1, sp, #0x60 + add r0, sp, #0x80 + bl fe_sq_op + mov r12, #0x63 +L_curve25519_inv_6: + add r1, sp, #0x80 add r0, sp, #0x80 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_6 + add r2, sp, #0x60 + add r1, sp, #0x80 + add r0, sp, #0x60 + bl fe_mul_op + mov r12, #50 +L_curve25519_inv_7: add r1, sp, #0x60 - bl fe_sq - mov r4, #19 -L_curve25519_inv_3: + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_7 + add r2, sp, #0x40 + add r1, sp, #0x60 + add r0, sp, #0x40 + bl fe_mul_op + mov r12, #5 +L_curve25519_inv_8: + add r1, sp, #0x40 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_8 + add r2, sp, #32 + add r1, sp, #0x40 + add r0, sp, #0 + bl fe_mul_op + mov r2, sp + ldr r1, [sp, #160] + ldr r0, [sp, #160] + bl fe_mul_op + mov r0, #0 + add sp, sp, #0xbc + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size curve25519,.-curve25519 +#else + .text + .align 4 + .globl curve25519 + .type curve25519, %function +curve25519: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #0xc0 + str r0, [sp, #176] + str r1, [sp, #160] + str r2, [sp, #172] + add r5, sp, #0x40 + add r4, sp, #32 + str sp, [sp, #184] + str r5, [sp, #180] + str r4, [sp, #188] + mov r1, #0 + str r1, [sp, #164] + mov r4, #1 + mov r5, #0 + mov r6, #0 + mov r7, #0 + mov r8, #0 + mov r9, #0 + mov r10, #0 + mov r11, #0 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + add r3, sp, #32 + stm r3, {r4, r5, r6, r7, r8, r9, r10, r11} + mov r4, #0 + mov r3, sp + stm r3, {r4, r5, r6, r7, r8, r9, r10, r11} + add r3, sp, #0x40 + # Copy + ldm r2, {r4, r5, r6, r7, r8, r9, r10, r11} + stm r3, {r4, r5, r6, r7, r8, r9, r10, r11} + mov r2, #0xfe +L_curve25519_bits: + str r2, [sp, #168] + ldr r1, [sp, #160] + and r4, r2, #31 + lsr r2, r2, #5 + ldr r2, [r1, r2, lsl #2] + rsb r4, r4, #31 + lsl r2, r2, r4 + ldr r1, [sp, #164] + eor r1, r1, r2 + asr r1, r1, #31 + str r2, [sp, #164] + # Conditional Swap + add r11, sp, #0xb0 + ldm r11, {r4, r5, r6, r7} + eor r8, r4, r5 + eor r9, r6, r7 + and r8, r8, r1 + and r9, r9, r1 + eor r4, r4, r8 + eor r5, r5, r8 + eor r6, r6, r9 + eor r7, r7, r9 + stm r11, {r4, r5, r6, r7} + # Ladder step + ldr r3, [sp, #184] + ldr r2, [sp, #176] + add r1, sp, #0x80 + ldr r0, [sp, #176] + bl fe_add_sub_op + ldr r3, [sp, #188] + ldr r2, [sp, #180] + add r1, sp, #0x60 + ldr r0, [sp, #184] + bl fe_add_sub_op + ldr r2, [sp, #176] + add r1, sp, #0x60 + ldr r0, [sp, #188] + bl fe_mul_op + add r2, sp, #0x80 + ldr r1, [sp, #184] + ldr r0, [sp, #184] + bl fe_mul_op + add r1, sp, #0x80 + add r0, sp, #0x60 + bl fe_sq_op + ldr r1, [sp, #176] add r0, sp, #0x80 + bl fe_sq_op + ldr r3, [sp, #184] + ldr r2, [sp, #188] + ldr r1, [sp, #184] + ldr r0, [sp, #180] + bl fe_add_sub_op + add r2, sp, #0x60 add r1, sp, #0x80 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_curve25519_inv_3 + ldr r0, [sp, #176] + bl fe_mul_op + add r2, sp, #0x60 + add r1, sp, #0x80 + add r0, sp, #0x80 + bl fe_sub_op + ldr r1, [sp, #184] + ldr r0, [sp, #184] + bl fe_sq_op + add r1, sp, #0x80 + ldr r0, [sp, #188] + bl fe_mul121666 + ldr r1, [sp, #180] + ldr r0, [sp, #180] + bl fe_sq_op + ldr r2, [sp, #188] + add r1, sp, #0x60 add r0, sp, #0x60 + bl fe_add_op + ldr r2, [sp, #184] + ldr r1, [sp, #172] + ldr r0, [sp, #188] + bl fe_mul_op + add r2, sp, #0x60 add r1, sp, #0x80 + ldr r0, [sp, #184] + bl fe_mul_op + ldr r2, [sp, #168] + subs r2, r2, #1 + bge L_curve25519_bits + ldr r1, [sp, #184] + # Copy + ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11} + stm sp, {r4, r5, r6, r7, r8, r9, r10, r11} + # Invert + add r1, sp, #0 + add r0, sp, #32 + bl fe_sq_op + add r1, sp, #32 + add r0, sp, #0x40 + bl fe_sq_op + add r1, sp, #0x40 + add r0, sp, #0x40 + bl fe_sq_op + add r2, sp, #0x40 + add r1, sp, #0 + add r0, sp, #0x40 + bl fe_mul_op + add r2, sp, #0x40 + add r1, sp, #32 + add r0, sp, #32 + bl fe_mul_op + add r1, sp, #32 + add r0, sp, #0x60 + bl fe_sq_op add r2, sp, #0x60 - bl fe_mul - mov r4, #10 -L_curve25519_inv_4: + add r1, sp, #0x40 + add r0, sp, #0x40 + bl fe_mul_op + add r1, sp, #0x40 add r0, sp, #0x60 + bl fe_sq_op + mov r12, #4 +L_curve25519_inv_1: + add r1, sp, #0x60 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_1 + add r2, sp, #0x40 add r1, sp, #0x60 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 - bne L_curve25519_inv_4 add r0, sp, #0x40 + bl fe_mul_op + add r1, sp, #0x40 + add r0, sp, #0x60 + bl fe_sq_op + mov r12, #9 +L_curve25519_inv_2: add r1, sp, #0x60 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_2 add r2, sp, #0x40 - bl fe_mul + add r1, sp, #0x60 + add r0, sp, #0x60 + bl fe_mul_op + add r1, sp, #0x60 + add r0, sp, #0x80 + bl fe_sq_op + mov r12, #19 +L_curve25519_inv_3: + add r1, sp, #0x80 + add r0, sp, #0x80 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_3 + add r2, sp, #0x60 + add r1, sp, #0x80 + add r0, sp, #0x60 + bl fe_mul_op + mov r12, #10 +L_curve25519_inv_4: + add r1, sp, #0x60 add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_curve25519_inv_4 + add r2, sp, #0x40 + add r1, sp, #0x60 + add r0, sp, #0x40 + bl fe_mul_op add r1, sp, #0x40 - bl fe_sq - mov r4, #49 -L_curve25519_inv_5: add r0, sp, #0x60 + bl fe_sq_op + mov r12, #49 +L_curve25519_inv_5: add r1, sp, #0x60 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_curve25519_inv_5 + add r2, sp, #0x40 + add r1, sp, #0x60 add r0, sp, #0x60 + bl fe_mul_op add r1, sp, #0x60 - add r2, sp, #0x40 - bl fe_mul add r0, sp, #0x80 - add r1, sp, #0x60 - bl fe_sq - mov r4, #0x63 + bl fe_sq_op + mov r12, #0x63 L_curve25519_inv_6: - add r0, sp, #0x80 add r1, sp, #0x80 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #0x80 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_curve25519_inv_6 - add r0, sp, #0x60 - add r1, sp, #0x80 add r2, sp, #0x60 - bl fe_mul - mov r4, #50 -L_curve25519_inv_7: + add r1, sp, #0x80 add r0, sp, #0x60 + bl fe_mul_op + mov r12, #50 +L_curve25519_inv_7: add r1, sp, #0x60 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_curve25519_inv_7 - add r0, sp, #0x40 - add r1, sp, #0x60 add r2, sp, #0x40 - bl fe_mul - mov r4, #5 -L_curve25519_inv_8: + add r1, sp, #0x60 add r0, sp, #0x40 + bl fe_mul_op + mov r12, #5 +L_curve25519_inv_8: add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_curve25519_inv_8 - add r0, sp, #0 - add r1, sp, #0x40 add r2, sp, #32 - bl fe_mul - add r2, sp, #0 - ldr r1, [sp, #160] - ldr r0, [sp, #160] - bl fe_mul + add r1, sp, #0x40 + add r0, sp, #0 + bl fe_mul_op + ldr r2, [sp, #184] + ldr r1, [sp, #176] + ldr r0, [sp, #176] + bl fe_mul_op + # Ensure result is less than modulus + ldr r0, [sp, #176] + ldm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + mov r2, #19 + and r2, r2, r11, asr #31 + adds r4, r4, r2 + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 + adcs r8, r8, #0 + adcs r9, r9, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0x80000000 +#else + bfc r11, #31, #1 +#endif + adcs r10, r10, #0 + adc r11, r11, #0 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} mov r0, #0 - add sp, sp, #0xbc + add sp, sp, #0xc0 pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size curve25519,.-curve25519 +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_CURVE25519 */ +#ifdef HAVE_ED25519 + .text + .align 4 + .globl fe_invert + .type fe_invert, %function +fe_invert: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #0x88 + # Invert + str r0, [sp, #128] + str r1, [sp, #132] + ldr r1, [sp, #132] + mov r0, sp + bl fe_sq_op + mov r1, sp + add r0, sp, #32 + bl fe_sq_op + add r1, sp, #32 + add r0, sp, #32 + bl fe_sq_op + add r2, sp, #32 + ldr r1, [sp, #132] + add r0, sp, #32 + bl fe_mul_op + add r2, sp, #32 + mov r1, sp + mov r0, sp + bl fe_mul_op + mov r1, sp + add r0, sp, #0x40 + bl fe_sq_op + add r2, sp, #0x40 + add r1, sp, #32 + add r0, sp, #32 + bl fe_mul_op + add r1, sp, #32 + add r0, sp, #0x40 + bl fe_sq_op + mov r12, #4 +L_fe_invert1: + add r1, sp, #0x40 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert1 + add r2, sp, #32 + add r1, sp, #0x40 + add r0, sp, #32 + bl fe_mul_op + add r1, sp, #32 + add r0, sp, #0x40 + bl fe_sq_op + mov r12, #9 +L_fe_invert2: + add r1, sp, #0x40 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert2 + add r2, sp, #32 + add r1, sp, #0x40 + add r0, sp, #0x40 + bl fe_mul_op + add r1, sp, #0x40 + add r0, sp, #0x60 + bl fe_sq_op + mov r12, #19 +L_fe_invert3: + add r1, sp, #0x60 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert3 + add r2, sp, #0x40 + add r1, sp, #0x60 + add r0, sp, #0x40 + bl fe_mul_op + mov r12, #10 +L_fe_invert4: + add r1, sp, #0x40 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert4 + add r2, sp, #32 + add r1, sp, #0x40 + add r0, sp, #32 + bl fe_mul_op + add r1, sp, #32 + add r0, sp, #0x40 + bl fe_sq_op + mov r12, #49 +L_fe_invert5: + add r1, sp, #0x40 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert5 + add r2, sp, #32 + add r1, sp, #0x40 + add r0, sp, #0x40 + bl fe_mul_op + add r1, sp, #0x40 + add r0, sp, #0x60 + bl fe_sq_op + mov r12, #0x63 +L_fe_invert6: + add r1, sp, #0x60 + add r0, sp, #0x60 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert6 + add r2, sp, #0x40 + add r1, sp, #0x60 + add r0, sp, #0x40 + bl fe_mul_op + mov r12, #50 +L_fe_invert7: + add r1, sp, #0x40 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert7 + add r2, sp, #32 + add r1, sp, #0x40 + add r0, sp, #32 + bl fe_mul_op + mov r12, #5 +L_fe_invert8: + add r1, sp, #32 + add r0, sp, #32 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 + bne L_fe_invert8 + mov r2, sp + add r1, sp, #32 + ldr r0, [sp, #128] + bl fe_mul_op + ldr r1, [sp, #132] + ldr r0, [sp, #128] + add sp, sp, #0x88 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size fe_invert,.-fe_invert +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + .text + .align 4 + .globl fe_sq2 + .type fe_sq2, %function +fe_sq2: + push {lr} + sub sp, sp, #0x44 + str r0, [sp, #64] + # Square * 2 + mov r0, #0 + ldr r12, [r1] + # A[0] * A[1] + ldr lr, [r1, #4] + umull r4, r5, r12, lr + # A[0] * A[3] + ldr lr, [r1, #12] + umull r6, r7, r12, lr + # A[0] * A[5] + ldr lr, [r1, #20] + umull r8, r9, r12, lr + # A[0] * A[7] + ldr lr, [r1, #28] + umull r10, r3, r12, lr + # A[0] * A[2] + ldr lr, [r1, #8] + mov r11, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[0] * A[4] + ldr lr, [r1, #16] + adcs r7, r7, #0 + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[0] * A[6] + ldr lr, [r1, #24] + adcs r9, r9, #0 + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + adcs r3, r3, #0 + str r4, [sp, #4] + str r5, [sp, #8] + # A[1] * A[2] + ldr r12, [r1, #4] + ldr lr, [r1, #8] + mov r11, #0 + umlal r6, r11, r12, lr + str r6, [sp, #12] + adds r7, r7, r11 + # A[1] * A[3] + ldr lr, [r1, #12] + adc r11, r0, #0 + umlal r7, r11, r12, lr + str r7, [sp, #16] + adds r8, r8, r11 + # A[1] * A[4] + ldr lr, [r1, #16] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[1] * A[5] + ldr lr, [r1, #20] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[1] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[1] * A[7] + ldr lr, [r1, #28] + adc r4, r0, #0 + umlal r3, r4, r12, lr + # A[2] * A[3] + ldr r12, [r1, #8] + ldr lr, [r1, #12] + mov r11, #0 + umlal r8, r11, r12, lr + str r8, [sp, #20] + adds r9, r9, r11 + # A[2] * A[4] + ldr lr, [r1, #16] + adc r11, r0, #0 + umlal r9, r11, r12, lr + str r9, [sp, #24] + adds r10, r10, r11 + # A[2] * A[5] + ldr lr, [r1, #20] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[2] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[2] * A[7] + ldr lr, [r1, #28] + adc r5, r0, #0 + umlal r4, r5, r12, lr + # A[3] * A[4] + ldr r12, [r1, #12] + ldr lr, [r1, #16] + mov r11, #0 + umlal r10, r11, r12, lr + str r10, [sp, #28] + adds r3, r3, r11 + # A[3] * A[5] + ldr lr, [r1, #20] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[3] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[3] * A[7] + ldr lr, [r1, #28] + adc r6, r0, #0 + umlal r5, r6, r12, lr + # A[4] * A[5] + ldr r12, [r1, #16] + ldr lr, [r1, #20] + mov r11, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[4] * A[6] + ldr lr, [r1, #24] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[4] * A[7] + ldr lr, [r1, #28] + adc r7, r0, #0 + umlal r6, r7, r12, lr + # A[5] * A[6] + ldr r12, [r1, #20] + ldr lr, [r1, #24] + mov r11, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[5] * A[7] + ldr lr, [r1, #28] + adc r8, r0, #0 + umlal r7, r8, r12, lr + # A[6] * A[7] + ldr r12, [r1, #24] + ldr lr, [r1, #28] + mov r9, #0 + umlal r8, r9, r12, lr + add lr, sp, #32 + stm lr, {r3, r4, r5, r6, r7, r8, r9} + add lr, sp, #4 + ldm lr, {r4, r5, r6, r7, r8, r9, r10} + adds r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adcs r8, r8, r8 + adcs r9, r9, r9 + adcs r10, r10, r10 + stm lr!, {r4, r5, r6, r7, r8, r9, r10} + ldm lr, {r3, r4, r5, r6, r7, r8, r9} + adcs r3, r3, r3 + adcs r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adcs r8, r8, r8 + adcs r9, r9, r9 + adc r10, r0, #0 + stm lr, {r3, r4, r5, r6, r7, r8, r9, r10} + add lr, sp, #4 + ldm lr, {r4, r5, r6, r7, r8, r9, r10} + mov lr, sp + # A[0] * A[0] + ldr r12, [r1] + umull r3, r11, r12, r12 + adds r4, r4, r11 + # A[1] * A[1] + ldr r12, [r1, #4] + adcs r5, r5, #0 + adc r11, r0, #0 + umlal r5, r11, r12, r12 + adds r6, r6, r11 + # A[2] * A[2] + ldr r12, [r1, #8] + adcs r7, r7, #0 + adc r11, r0, #0 + umlal r7, r11, r12, r12 + adds r8, r8, r11 + # A[3] * A[3] + ldr r12, [r1, #12] + adcs r9, r9, #0 + adc r11, r0, #0 + umlal r9, r11, r12, r12 + adds r10, r10, r11 + stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10} + ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10} + # A[4] * A[4] + ldr r12, [r1, #16] + adcs r3, r3, #0 + adc r11, r0, #0 + umlal r3, r11, r12, r12 + adds r4, r4, r11 + # A[5] * A[5] + ldr r12, [r1, #20] + adcs r5, r5, #0 + adc r11, r0, #0 + umlal r5, r11, r12, r12 + adds r6, r6, r11 + # A[6] * A[6] + ldr r12, [r1, #24] + adcs r7, r7, #0 + adc r11, r0, #0 + umlal r7, r11, r12, r12 + adds r8, r8, r11 + # A[7] * A[7] + ldr r12, [r1, #28] + adcs r9, r9, #0 + adc r10, r10, #0 + umlal r9, r10, r12, r12 + # Reduce + ldr r2, [sp, #28] + mov lr, sp + mov r12, #38 + umull r10, r11, r12, r10 + adds r10, r10, r2 + adc r11, r11, #0 + mov r12, #19 + lsl r11, r11, #1 + orr r11, r11, r10, LSR #31 + mul r11, r12, r11 + ldm lr!, {r1, r2} + mov r12, #38 + adds r1, r1, r11 + adc r11, r0, #0 + umlal r1, r11, r3, r12 + adds r2, r2, r11 + adc r11, r0, #0 + umlal r2, r11, r4, r12 + ldm lr!, {r3, r4} + adds r3, r3, r11 + adc r11, r0, #0 + umlal r3, r11, r5, r12 + adds r4, r4, r11 + adc r11, r0, #0 + umlal r4, r11, r6, r12 + ldm lr!, {r5, r6} + adds r5, r5, r11 + adc r11, r0, #0 + umlal r5, r11, r7, r12 + adds r6, r6, r11 + adc r11, r0, #0 + umlal r6, r11, r8, r12 + ldm lr!, {r7, r8} + adds r7, r7, r11 + adc r11, r0, #0 + umlal r7, r11, r9, r12 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r10, r10, #0x80000000 +#else + bfc r10, #31, #1 +#endif + adds r8, r10, r11 + # Reduce if top bit set + mov r12, #19 + and r11, r12, r8, ASR #31 + adds r1, r1, r11 + adcs r2, r2, #0 + adcs r3, r3, #0 + adcs r4, r4, #0 + adcs r5, r5, #0 + adcs r6, r6, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r8, r8, #0x80000000 +#else + bfc r8, #31, #1 +#endif + adcs r7, r7, #0 + adc r8, r8, #0 + # Double + adds r1, r1, r1 + adcs r2, r2, r2 + adcs r3, r3, r3 + adcs r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adc r8, r8, r8 + # Reduce if top bit set + mov r12, #19 + and r11, r12, r8, ASR #31 + adds r1, r1, r11 + adcs r2, r2, #0 + adcs r3, r3, #0 + adcs r4, r4, #0 + adcs r5, r5, #0 + adcs r6, r6, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r8, r8, #0x80000000 +#else + bfc r8, #31, #1 +#endif + adcs r7, r7, #0 + adc r8, r8, #0 + # Store + ldr r0, [sp, #64] + stm r0, {r1, r2, r3, r4, r5, r6, r7, r8} + add sp, sp, #0x44 + pop {pc} + .size fe_sq2,.-fe_sq2 +#else + .text + .align 4 + .globl fe_sq2 + .type fe_sq2, %function +fe_sq2: + push {lr} + sub sp, sp, #36 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r0, [sp, #28] + str r1, [sp, #32] +#else + strd r0, r1, [sp, #28] +#endif + ldm r1, {r0, r1, r2, r3, r4, r5, r6, r7} + # Square * 2 + umull r9, r10, r0, r0 + umull r11, r12, r0, r1 + adds r11, r11, r11 + mov lr, #0 + umaal r10, r11, lr, lr + stm sp, {r9, r10} + mov r8, lr + umaal r8, r12, r0, r2 + adcs r8, r8, r8 + umaal r8, r11, r1, r1 + umull r9, r10, r0, r3 + umaal r9, r12, r1, r2 + adcs r9, r9, r9 + umaal r9, r11, lr, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [sp, #8] + str r9, [sp, #12] +#else + strd r8, r9, [sp, #8] +#endif + mov r9, lr + umaal r9, r10, r0, r4 + umaal r9, r12, r1, r3 + adcs r9, r9, r9 + umaal r9, r11, r2, r2 + str r9, [sp, #16] + umull r9, r8, r0, r5 + umaal r9, r12, r1, r4 + umaal r9, r10, r2, r3 + adcs r9, r9, r9 + umaal r9, r11, lr, lr + str r9, [sp, #20] + mov r9, lr + umaal r9, r8, r0, r6 + umaal r9, r12, r1, r5 + umaal r9, r10, r2, r4 + adcs r9, r9, r9 + umaal r9, r11, r3, r3 + str r9, [sp, #24] + umull r0, r9, r0, r7 + umaal r0, r8, r1, r6 + umaal r0, r12, r2, r5 + umaal r0, r10, r3, r4 + adcs r0, r0, r0 + umaal r0, r11, lr, lr + # R[7] = r0 + umaal r9, r8, r1, r7 + umaal r9, r10, r2, r6 + umaal r12, r9, r3, r5 + adcs r12, r12, r12 + umaal r12, r11, r4, r4 + # R[8] = r12 + umaal r9, r8, r2, r7 + umaal r10, r9, r3, r6 + mov r2, lr + umaal r10, r2, r4, r5 + adcs r10, r10, r10 + umaal r11, r10, lr, lr + # R[9] = r11 + umaal r2, r8, r3, r7 + umaal r2, r9, r4, r6 + adcs r3, r2, r2 + umaal r10, r3, r5, r5 + # R[10] = r10 + mov r1, lr + umaal r1, r8, r4, r7 + umaal r1, r9, r5, r6 + adcs r4, r1, r1 + umaal r3, r4, lr, lr + # R[11] = r3 + umaal r8, r9, r5, r7 + adcs r8, r8, r8 + umaal r4, r8, r6, r6 + # R[12] = r4 + mov r5, lr + umaal r5, r9, r6, r7 + adcs r5, r5, r5 + umaal r8, r5, lr, lr + # R[13] = r8 + adcs r9, r9, r9 + umaal r9, r5, r7, r7 + adcs r7, r5, lr + # R[14] = r9 + # R[15] = r7 + # Reduce + mov r6, #37 + umaal r7, r0, r7, r6 + mov r6, #19 + lsl r0, r0, #1 + orr r0, r0, r7, lsr #31 + mul lr, r0, r6 + pop {r0, r1} + mov r6, #38 + umaal r0, lr, r12, r6 + umaal r1, lr, r11, r6 + mov r12, r3 + mov r11, r4 + pop {r2, r3, r4} + umaal r2, lr, r10, r6 + umaal r3, lr, r12, r6 + umaal r4, lr, r11, r6 + mov r12, r6 + pop {r5, r6} + umaal r5, lr, r8, r12 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r7, r7, #0x80000000 +#else + bfc r7, #31, #1 +#endif + umaal r6, lr, r9, r12 + add r7, r7, lr + # Reduce if top bit set + mov r11, #19 + and r12, r11, r7, ASR #31 + adds r0, r0, r12 + adcs r1, r1, #0 + adcs r2, r2, #0 + adcs r3, r3, #0 + adcs r4, r4, #0 + adcs r5, r5, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r7, r7, #0x80000000 +#else + bfc r7, #31, #1 +#endif + adcs r6, r6, #0 + adc r7, r7, #0 + # Double + adds r0, r0, r0 + adcs r1, r1, r1 + adcs r2, r2, r2 + adcs r3, r3, r3 + adcs r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adc r7, r7, r7 + # Reduce if top bit set + mov r11, #19 + and r12, r11, r7, ASR #31 + adds r0, r0, r12 + adcs r1, r1, #0 + adcs r2, r2, #0 + adcs r3, r3, #0 + adcs r4, r4, #0 + adcs r5, r5, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r7, r7, #0x80000000 +#else + bfc r7, #31, #1 +#endif + adcs r6, r6, #0 + adc r7, r7, #0 + pop {r12, lr} + # Store + stm r12, {r0, r1, r2, r3, r4, r5, r6, r7} + mov r0, r12 + mov r1, lr + pop {pc} + .size fe_sq2,.-fe_sq2 +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ .text .align 4 .globl fe_pow22523 .type fe_pow22523, %function fe_pow22523: - push {r4, lr} + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} sub sp, sp, #0x68 # pow22523 str r0, [sp, #96] str r1, [sp, #100] - mov r0, sp ldr r1, [sp, #100] - bl fe_sq - add r0, sp, #32 + mov r0, sp + bl fe_sq_op mov r1, sp - bl fe_sq add r0, sp, #32 + bl fe_sq_op add r1, sp, #32 - bl fe_sq add r0, sp, #32 + bl fe_sq_op + add r2, sp, #32 ldr r1, [sp, #100] + add r0, sp, #32 + bl fe_mul_op add r2, sp, #32 - bl fe_mul - mov r0, sp mov r1, sp - add r2, sp, #32 - bl fe_mul mov r0, sp + bl fe_mul_op mov r1, sp - bl fe_sq mov r0, sp - add r1, sp, #32 + bl fe_sq_op mov r2, sp - bl fe_mul - add r0, sp, #32 + add r1, sp, #32 + mov r0, sp + bl fe_mul_op mov r1, sp - bl fe_sq - mov r4, #4 -L_fe_pow22523_1: add r0, sp, #32 + bl fe_sq_op + mov r12, #4 +L_fe_pow22523_1: add r1, sp, #32 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #32 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_1 - mov r0, sp - add r1, sp, #32 mov r2, sp - bl fe_mul - add r0, sp, #32 + add r1, sp, #32 + mov r0, sp + bl fe_mul_op mov r1, sp - bl fe_sq - mov r4, #9 -L_fe_pow22523_2: add r0, sp, #32 + bl fe_sq_op + mov r12, #9 +L_fe_pow22523_2: add r1, sp, #32 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #32 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_2 + mov r2, sp + add r1, sp, #32 add r0, sp, #32 + bl fe_mul_op add r1, sp, #32 - mov r2, sp - bl fe_mul add r0, sp, #0x40 - add r1, sp, #32 - bl fe_sq - mov r4, #19 + bl fe_sq_op + mov r12, #19 L_fe_pow22523_3: - add r0, sp, #0x40 add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_3 - add r0, sp, #32 - add r1, sp, #0x40 add r2, sp, #32 - bl fe_mul - mov r4, #10 -L_fe_pow22523_4: + add r1, sp, #0x40 add r0, sp, #32 + bl fe_mul_op + mov r12, #10 +L_fe_pow22523_4: add r1, sp, #32 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #32 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_4 - mov r0, sp - add r1, sp, #32 mov r2, sp - bl fe_mul - add r0, sp, #32 + add r1, sp, #32 + mov r0, sp + bl fe_mul_op mov r1, sp - bl fe_sq - mov r4, #49 -L_fe_pow22523_5: add r0, sp, #32 + bl fe_sq_op + mov r12, #49 +L_fe_pow22523_5: add r1, sp, #32 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #32 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_5 + mov r2, sp + add r1, sp, #32 add r0, sp, #32 + bl fe_mul_op add r1, sp, #32 - mov r2, sp - bl fe_mul add r0, sp, #0x40 - add r1, sp, #32 - bl fe_sq - mov r4, #0x63 + bl fe_sq_op + mov r12, #0x63 L_fe_pow22523_6: - add r0, sp, #0x40 add r1, sp, #0x40 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #0x40 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_6 - add r0, sp, #32 - add r1, sp, #0x40 add r2, sp, #32 - bl fe_mul - mov r4, #50 -L_fe_pow22523_7: + add r1, sp, #0x40 add r0, sp, #32 + bl fe_mul_op + mov r12, #50 +L_fe_pow22523_7: add r1, sp, #32 - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + add r0, sp, #32 + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_7 - mov r0, sp - add r1, sp, #32 mov r2, sp - bl fe_mul - mov r4, #2 -L_fe_pow22523_8: + add r1, sp, #32 mov r0, sp + bl fe_mul_op + mov r12, #2 +L_fe_pow22523_8: mov r1, sp - bl fe_sq - sub r4, r4, #1 - cmp r4, #0 + mov r0, sp + push {r12} + bl fe_sq_op + pop {r12} + subs r12, r12, #1 bne L_fe_pow22523_8 - ldr r0, [sp, #96] - mov r1, sp ldr r2, [sp, #100] - bl fe_mul + mov r1, sp + ldr r0, [sp, #96] + bl fe_mul_op ldr r1, [sp, #100] ldr r0, [sp, #96] add sp, sp, #0x68 - pop {r4, pc} + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} .size fe_pow22523,.-fe_pow22523 .text .align 4 - .globl fe_ge_to_p2 - .type fe_ge_to_p2, %function -fe_ge_to_p2: - push {lr} - sub sp, sp, #16 + .globl ge_p1p1_to_p2 + .type ge_p1p1_to_p2, %function +ge_p1p1_to_p2: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #8 str r0, [sp] str r1, [sp, #4] - str r2, [sp, #8] - str r3, [sp, #12] - ldr r2, [sp, #28] - ldr r1, [sp, #12] + add r2, r1, #0x60 + bl fe_mul_op ldr r0, [sp] - bl fe_mul - ldr r2, [sp, #24] - ldr r1, [sp, #20] - ldr r0, [sp, #4] - bl fe_mul - ldr r2, [sp, #28] - ldr r1, [sp, #24] - ldr r0, [sp, #8] - bl fe_mul - add sp, sp, #16 - pop {pc} - .size fe_ge_to_p2,.-fe_ge_to_p2 + ldr r1, [sp, #4] + add r2, r1, #0x40 + add r1, r1, #32 + add r0, r0, #32 + bl fe_mul_op + ldr r0, [sp] + ldr r1, [sp, #4] + add r2, r1, #0x60 + add r1, r1, #0x40 + add r0, r0, #0x40 + bl fe_mul_op + add sp, sp, #8 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size ge_p1p1_to_p2,.-ge_p1p1_to_p2 .text .align 4 - .globl fe_ge_to_p3 - .type fe_ge_to_p3, %function -fe_ge_to_p3: - push {lr} - sub sp, sp, #16 + .globl ge_p1p1_to_p3 + .type ge_p1p1_to_p3, %function +ge_p1p1_to_p3: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #8 str r0, [sp] str r1, [sp, #4] - str r2, [sp, #8] - str r3, [sp, #12] - ldr r2, [sp, #32] - ldr r1, [sp, #20] + add r2, r1, #0x60 + bl fe_mul_op ldr r0, [sp] - bl fe_mul - ldr r2, [sp, #28] - ldr r1, [sp, #24] - ldr r0, [sp, #4] - bl fe_mul - ldr r2, [sp, #32] - ldr r1, [sp, #28] - ldr r0, [sp, #8] - bl fe_mul - ldr r2, [sp, #24] - ldr r1, [sp, #20] - ldr r0, [sp, #12] - bl fe_mul - add sp, sp, #16 - pop {pc} - .size fe_ge_to_p3,.-fe_ge_to_p3 + ldr r1, [sp, #4] + add r2, r1, #0x40 + add r1, r1, #32 + add r0, r0, #32 + bl fe_mul_op + ldr r0, [sp] + ldr r1, [sp, #4] + add r2, r1, #0x60 + add r1, r1, #0x40 + add r0, r0, #0x40 + bl fe_mul_op + ldr r0, [sp] + ldr r1, [sp, #4] + add r2, r1, #32 + add r0, r0, #0x60 + bl fe_mul_op + add sp, sp, #8 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size ge_p1p1_to_p3,.-ge_p1p1_to_p3 .text .align 4 - .globl fe_ge_dbl - .type fe_ge_dbl, %function -fe_ge_dbl: + .globl ge_p2_dbl + .type ge_p2_dbl, %function +ge_p2_dbl: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #16 + sub sp, sp, #8 str r0, [sp] str r1, [sp, #4] - str r2, [sp, #8] - str r3, [sp, #12] - ldr r1, [sp, #52] + bl fe_sq_op + ldr r0, [sp] + ldr r1, [sp, #4] + add r1, r1, #32 + add r0, r0, #0x40 + bl fe_sq_op ldr r0, [sp] - bl fe_sq - ldr r1, [sp, #56] - ldr r0, [sp, #8] - bl fe_sq - ldr r0, [sp, #4] - ldr r1, [sp, #52] - ldr r2, [sp, #56] - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] -#endif - adds r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - adcs r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif ldr r1, [sp, #4] - ldr r0, [sp, #12] - bl fe_sq - ldr r0, [sp, #4] + add r2, r1, #32 + add r0, r0, #32 + bl fe_add_op + mov r1, r0 + add r0, r0, #0x40 + bl fe_sq_op + ldr r0, [sp] + mov r3, r0 + add r2, r0, #0x40 + add r1, r0, #0x40 + add r0, r0, #32 + bl fe_add_sub_op + mov r2, r0 + add r1, r0, #0x40 + sub r0, r0, #32 + bl fe_sub_op + ldr r1, [sp, #4] + add r1, r1, #0x40 + add r0, r0, #0x60 + bl fe_sq2 + sub r2, r0, #32 + mov r1, r0 + bl fe_sub_op + add sp, sp, #8 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size ge_p2_dbl,.-ge_p2_dbl + .text + .align 4 + .globl ge_madd + .type ge_madd, %function +ge_madd: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #12 + str r0, [sp] + str r1, [sp, #4] + str r2, [sp, #8] + mov r2, r1 + add r1, r1, #32 + bl fe_add_op + ldr r1, [sp, #4] + mov r2, r1 + add r1, r1, #32 + add r0, r0, #32 + bl fe_sub_op + ldr r2, [sp, #8] + sub r1, r0, #32 + add r0, r0, #32 + bl fe_mul_op + ldr r0, [sp] + ldr r2, [sp, #8] + add r2, r2, #32 + add r1, r0, #32 + add r0, r0, #32 + bl fe_mul_op + ldr r0, [sp] ldr r1, [sp, #8] - ldr r2, [sp] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r2] - ldr r7, [r2, #4] -#else - ldrd r6, r7, [r2] -#endif - adds r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif - # Sub - subs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r2, #8] - ldr r7, [r2, #12] -#else - ldrd r6, r7, [r2, #8] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] -#else - strd r10, r11, [r1, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r2, #16] - ldr r7, [r2, #20] -#else - ldrd r6, r7, [r2, #16] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 + ldr r2, [sp, #4] + add r2, r2, #0x60 + add r1, r1, #0x40 + add r0, r0, #0x60 + bl fe_mul_op + ldr r0, [sp] + add r3, r0, #32 + add r2, r0, #0x40 + mov r1, r0 + add r0, r0, #32 + bl fe_add_sub_op + ldr r1, [sp, #4] + add r1, r1, #0x40 + add r0, r0, #32 + # Double + ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11} + adds r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adcs r8, r8, r8 + adcs r9, r9, r9 + adcs r10, r10, r10 mov lr, #0 - sbcs r11, r5, r7 + adcs r11, r11, r11 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] -#else - strd r10, r11, [r1, #16] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #24] - ldr r5, [r1, #28] -#else - ldrd r4, r5, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r2, #24] - ldr r7, [r2, #28] -#else - ldrd r6, r7, [r2, #24] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] -#endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif + mov r12, #19 + lsl lr, lr, #1 + orr lr, lr, r11, lsr #31 + mul r12, lr, r12 adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] -#else - strd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] -#else - strd r4, r5, [r1, #16] -#endif - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 + adcs r8, r8, #0 + adcs r9, r9, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0x80000000 #else - strd r10, r11, [r1, #24] + bfc r11, #31, #1 #endif + adcs r10, r10, #0 + adc r11, r11, #0 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + # Done Double + add r3, r0, #32 + add r1, r0, #32 + bl fe_add_sub_op + add sp, sp, #12 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size ge_madd,.-ge_madd + .text + .align 4 + .globl ge_msub + .type ge_msub, %function +ge_msub: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #12 + str r0, [sp] + str r1, [sp, #4] + str r2, [sp, #8] + mov r2, r1 + add r1, r1, #32 + bl fe_add_op + ldr r1, [sp, #4] + mov r2, r1 + add r1, r1, #32 + add r0, r0, #32 + bl fe_sub_op + ldr r2, [sp, #8] + add r2, r2, #32 + sub r1, r0, #32 + add r0, r0, #32 + bl fe_mul_op + ldr r0, [sp] + ldr r2, [sp, #8] + add r1, r0, #32 + add r0, r0, #32 + bl fe_mul_op ldr r0, [sp] - ldr r1, [sp, #12] - ldr r2, [sp, #4] - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] -#endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 - adcs r6, r6, r3 - adcs r7, r7, r3 - adcs r8, r8, r3 - adcs r9, r9, r3 - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r1, [sp, #60] - ldr r0, [sp, #12] - bl fe_sq2 - ldr r0, [sp, #12] ldr r1, [sp, #8] - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1] - ldr r9, [r1, #4] -#else - ldrd r8, r9, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r1, #8] - ldr r11, [r1, #12] -#else - ldrd r10, r11, [r1, #8] -#endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #24] - ldr r7, [r0, #28] -#else - ldrd r6, r7, [r0, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #16] - ldr r9, [r1, #20] -#else - ldrd r8, r9, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r1, #24] - ldr r11, [r1, #28] -#else - ldrd r10, r11, [r1, #24] -#endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif + ldr r2, [sp, #4] + add r2, r2, #0x60 + add r1, r1, #0x40 + add r0, r0, #0x60 + bl fe_mul_op + ldr r0, [sp] + add r3, r0, #32 + add r2, r0, #0x40 + mov r1, r0 + add r0, r0, #32 + bl fe_add_sub_op + ldr r1, [sp, #4] + add r1, r1, #0x40 + add r0, r0, #32 + # Double + ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11} + adds r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adcs r8, r8, r8 + adcs r9, r9, r9 + adcs r10, r10, r10 + mov lr, #0 + adcs r11, r11, r11 + adc lr, lr, #0 + mov r12, #19 + lsl lr, lr, #1 + orr lr, lr, r11, lsr #31 + mul r12, lr, r12 adds r4, r4, r12 - adcs r5, r5, r3 - adcs r6, r6, r3 - adcs r7, r7, r3 - adcs r8, r8, r3 - adcs r9, r9, r3 - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 + adcs r8, r8, #0 + adcs r9, r9, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0x80000000 #else - strd r10, r11, [r0, #24] + bfc r11, #31, #1 #endif - add sp, sp, #16 + adcs r10, r10, #0 + adc r11, r11, #0 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + # Done Double + add r3, r0, #32 + mov r1, r0 + add r0, r0, #32 + bl fe_add_sub_op + add sp, sp, #12 pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_ge_dbl,.-fe_ge_dbl + .size ge_msub,.-ge_msub .text .align 4 - .globl fe_ge_madd - .type fe_ge_madd, %function -fe_ge_madd: + .globl ge_add + .type ge_add, %function +ge_add: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #32 + sub sp, sp, #44 str r0, [sp] str r1, [sp, #4] str r2, [sp, #8] - str r3, [sp, #12] + mov r3, r1 + add r2, r1, #32 + add r1, r0, #32 + bl fe_add_sub_op + ldr r2, [sp, #8] + mov r1, r0 + add r0, r0, #0x40 + bl fe_mul_op + ldr r0, [sp] + ldr r2, [sp, #8] + add r2, r2, #32 + add r1, r0, #32 + add r0, r0, #32 + bl fe_mul_op + ldr r0, [sp] + ldr r1, [sp, #8] + ldr r2, [sp, #4] + add r2, r2, #0x60 + add r1, r1, #0x60 + add r0, r0, #0x60 + bl fe_mul_op ldr r0, [sp] - ldr r1, [sp, #72] - ldr r2, [sp, #68] - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] -#endif - adds r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - adcs r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r0, [sp, #4] - ldr r1, [sp, #72] - ldr r2, [sp, #68] - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] -#endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 - adcs r6, r6, r3 - adcs r7, r7, r3 - adcs r8, r8, r3 - adcs r9, r9, r3 - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r2, [sp, #88] - ldr r1, [sp] - ldr r0, [sp, #8] - bl fe_mul - ldr r2, [sp, #92] ldr r1, [sp, #4] - ldr r0, [sp, #4] - bl fe_mul - ldr r2, [sp, #80] - ldr r1, [sp, #84] - ldr r0, [sp, #12] - bl fe_mul - ldr r0, [sp, #4] - ldr r1, [sp] ldr r2, [sp, #8] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2] - ldr r5, [r2, #4] -#else - ldrd r4, r5, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0] - ldr r7, [r0, #4] -#else - ldrd r6, r7, [r0] -#endif - adds r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif - # Sub - subs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #8] - ldr r5, [r2, #12] -#else - ldrd r4, r5, [r2, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] -#else - strd r10, r11, [r1, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #16] - ldr r5, [r2, #20] -#else - ldrd r4, r5, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #16] - ldr r7, [r0, #20] -#else - ldrd r6, r7, [r0, #16] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] -#else - strd r10, r11, [r1, #16] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #24] - ldr r5, [r2, #28] -#else - ldrd r4, r5, [r2, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #24] - ldr r7, [r0, #28] -#else - ldrd r6, r7, [r0, #24] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] -#endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] -#else - strd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] -#else - strd r4, r5, [r1, #16] -#endif - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] -#else - strd r10, r11, [r1, #24] -#endif - ldr r0, [sp, #8] - ldr r1, [sp, #76] + add r2, r2, #0x40 + add r1, r1, #0x40 + bl fe_mul_op + ldr r1, [sp] + add r0, sp, #12 # Double -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #16] - ldr r9, [r1, #20] -#else - ldrd r8, r9, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r1, #24] - ldr r11, [r1, #28] -#else - ldrd r10, r11, [r1, #24] -#endif + ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11} adds r4, r4, r4 adcs r5, r5, r5 adcs r6, r6, r6 @@ -7202,2782 +5310,3471 @@ adcs r8, r8, r8 adcs r9, r9, r9 adcs r10, r10, r10 - adc r11, r11, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r0, [sp, #8] - ldr r1, [sp, #12] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1] - ldr r7, [r1, #4] -#else - ldrd r6, r7, [r1] -#endif - adds r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif - # Sub - subs r10, r4, r6 mov lr, #0 - sbcs r11, r5, r7 + adcs r11, r11, r11 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] -#else - strd r10, r11, [r1, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #16] - ldr r7, [r1, #20] -#else - ldrd r6, r7, [r1, #16] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] -#else - strd r10, r11, [r1, #16] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #24] - ldr r5, [r0, #28] -#else - ldrd r4, r5, [r0, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] -#endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif + mov r12, #19 + lsl lr, lr, #1 + orr lr, lr, r11, lsr #31 + mul r12, lr, r12 adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] -#else - strd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] -#else - strd r4, r5, [r1, #16] -#endif - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 + adcs r8, r8, #0 + adcs r9, r9, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0x80000000 #else - strd r10, r11, [r1, #24] + bfc r11, #31, #1 #endif - add sp, sp, #32 + adcs r10, r10, #0 + adc r11, r11, #0 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + # Done Double + add r3, r1, #32 + add r2, r1, #0x40 + add r0, r1, #32 + bl fe_add_sub_op + add r3, r0, #0x40 + add r2, sp, #12 + add r1, r0, #0x40 + add r0, r0, #32 + bl fe_add_sub_op + add sp, sp, #44 pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_ge_madd,.-fe_ge_madd + .size ge_add,.-ge_add .text .align 4 - .globl fe_ge_msub - .type fe_ge_msub, %function -fe_ge_msub: + .globl ge_sub + .type ge_sub, %function +ge_sub: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #32 + sub sp, sp, #44 str r0, [sp] str r1, [sp, #4] str r2, [sp, #8] - str r3, [sp, #12] + mov r3, r1 + add r2, r1, #32 + add r1, r0, #32 + bl fe_add_sub_op + ldr r2, [sp, #8] + add r2, r2, #32 + mov r1, r0 + add r0, r0, #0x40 + bl fe_mul_op ldr r0, [sp] - ldr r1, [sp, #72] - ldr r2, [sp, #68] - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] -#endif - adds r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - adcs r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r0, [sp, #4] - ldr r1, [sp, #72] - ldr r2, [sp, #68] - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] + ldr r2, [sp, #8] + add r1, r0, #32 + add r0, r0, #32 + bl fe_mul_op + ldr r0, [sp] + ldr r1, [sp, #8] + ldr r2, [sp, #4] + add r2, r2, #0x60 + add r1, r1, #0x60 + add r0, r0, #0x60 + bl fe_mul_op + ldr r0, [sp] + ldr r1, [sp, #4] + ldr r2, [sp, #8] + add r2, r2, #0x40 + add r1, r1, #0x40 + bl fe_mul_op + ldr r1, [sp] + add r0, sp, #12 + # Double + ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11} + adds r4, r4, r4 + adcs r5, r5, r5 + adcs r6, r6, r6 + adcs r7, r7, r7 + adcs r8, r8, r8 + adcs r9, r9, r9 + adcs r10, r10, r10 + mov lr, #0 + adcs r11, r11, r11 + adc lr, lr, #0 + mov r12, #19 + lsl lr, lr, #1 + orr lr, lr, r11, lsr #31 + mul r12, lr, r12 + adds r4, r4, r12 + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 + adcs r8, r8, #0 + adcs r9, r9, #0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0x80000000 #else - ldrd r6, r7, [r1, #8] + bfc r11, #31, #1 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] + adcs r10, r10, #0 + adc r11, r11, #0 + stm r0, {r4, r5, r6, r7, r8, r9, r10, r11} + # Done Double + add r3, r1, #32 + add r2, r1, #0x40 + add r0, r1, #32 + bl fe_add_sub_op + add r3, r0, #0x40 + add r2, sp, #12 + add r1, r0, #32 + add r0, r0, #0x40 + bl fe_add_sub_op + add sp, sp, #44 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size ge_sub,.-ge_sub +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + .text + .align 4 + .globl sc_reduce + .type sc_reduce, %function +sc_reduce: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #56 + str r0, [sp, #52] + # Load bits 252-511 + add r0, r0, #28 + ldm r0, {r1, r2, r3, r4, r5, r6, r7, r8, r9} + lsr lr, r9, #24 + lsl r9, r9, #4 + orr r9, r9, r8, LSR #28 + lsl r8, r8, #4 + orr r8, r8, r7, LSR #28 + lsl r7, r7, #4 + orr r7, r7, r6, LSR #28 + lsl r6, r6, #4 + orr r6, r6, r5, LSR #28 + lsl r5, r5, #4 + orr r5, r5, r4, LSR #28 + lsl r4, r4, #4 + orr r4, r4, r3, LSR #28 + lsl r3, r3, #4 + orr r3, r3, r2, LSR #28 + lsl r2, r2, #4 + orr r2, r2, r1, LSR #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + sub r0, r0, #28 + # Add order times bits 504..511 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xa3 + lsl r10, r10, #8 + orr r10, r10, #10 + lsl r10, r10, #8 + orr r10, r10, #44 + lsl r10, r10, #8 + orr r10, r10, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x2c + lsl r10, r10, #8 + add r10, r10, #0x13 #else - ldrd r8, r9, [r2] + mov r10, #0x2c13 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] + movt r10, #0xa30a #endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xa7 + lsl r11, r11, #8 + orr r11, r11, #0xed + lsl r11, r11, #8 + orr r11, r11, #0x9c + lsl r11, r11, #8 + orr r11, r11, #0xe5 #else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x9c + lsl r11, r11, #8 + add r11, r11, #0xe5 #else - strd r10, r11, [r0, #8] + mov r11, #0x9ce5 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] + movt r11, #0xa7ed #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] + mov r1, #0 + umlal r2, r1, r10, lr + adds r3, r3, r1 + mov r1, #0 + adc r1, r1, #0 + umlal r3, r1, r11, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5d + lsl r10, r10, #8 + orr r10, r10, #8 + lsl r10, r10, #8 + orr r10, r10, #0x63 + lsl r10, r10, #8 + orr r10, r10, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x63 + lsl r10, r10, #8 + add r10, r10, #0x29 #else - ldrd r6, r7, [r1, #24] + mov r10, #0x6329 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] + movt r10, #0x5d08 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xeb + lsl r11, r11, #8 + orr r11, r11, #33 + lsl r11, r11, #8 + orr r11, r11, #6 + lsl r11, r11, #8 + orr r11, r11, #33 #else - ldrd r10, r11, [r2, #24] -#endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x6 + lsl r11, r11, #8 + add r11, r11, #0x21 #else - ldrd r4, r5, [r0] + mov r11, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] + movt r11, #0xeb21 #endif - adds r4, r4, r12 - adcs r5, r5, r3 - adcs r6, r6, r3 - adcs r7, r7, r3 - adcs r8, r8, r3 - adcs r9, r9, r3 - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] + adds r4, r4, r1 + mov r1, #0 + adc r1, r1, #0 + umlal r4, r1, r10, lr + adds r5, r5, r1 + mov r1, #0 + adc r1, r1, #0 + umlal r5, r1, r11, lr + adds r6, r6, r1 + adcs r7, r7, #0 + adcs r8, r8, #0 + adc r9, r9, #0 + subs r6, r6, lr + sbcs r7, r7, #0 + sbcs r8, r8, #0 + sbc r9, r9, #0 + # Sub product of top 8 words and order + mov r12, sp +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 #else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 #else - strd r6, r7, [r0, #8] + mov r1, #0x2c13 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] + movt r1, #0xa30a #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] + mov lr, #0 + ldm r0!, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0xf0000000 #else - strd r10, r11, [r0, #24] + bfc r11, #28, #4 #endif - ldr r2, [sp, #92] - ldr r1, [sp] - ldr r0, [sp, #8] - bl fe_mul - ldr r2, [sp, #88] - ldr r1, [sp, #4] - ldr r0, [sp, #4] - bl fe_mul - ldr r2, [sp, #80] - ldr r1, [sp, #84] - ldr r0, [sp, #12] - bl fe_mul - ldr r0, [sp, #4] - ldr r1, [sp] - ldr r2, [sp, #8] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2] - ldr r5, [r2, #4] + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r0, r0, #16 + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 #else - ldrd r4, r5, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0] - ldr r7, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 #else - ldrd r6, r7, [r0] + mov r1, #0x9ce5 #endif - adds r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] + movt r1, #0xa7ed #endif - # Sub - subs r10, r4, r6 mov lr, #0 - sbcs r11, r5, r7 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #8] - ldr r5, [r2, #12] + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 #else - ldrd r4, r5, [r2, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 #else - ldrd r6, r7, [r0, #8] + mov r1, #0x6329 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] + movt r1, #0x5d08 #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 mov lr, #0 - sbcs r11, r5, r7 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 #else - strd r10, r11, [r1, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #16] - ldr r5, [r2, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 #else - ldrd r4, r5, [r2, #16] + mov r1, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #16] - ldr r7, [r0, #20] -#else - ldrd r6, r7, [r0, #16] + movt r1, #0xeb21 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 mov lr, #0 - sbcs r11, r5, r7 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 + # Subtract at 4 * 32 + ldm r12, {r10, r11} + subs r10, r10, r2 + sbcs r11, r11, r3 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r4 + sbcs r11, r11, r5 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r6 + sbcs r11, r11, r7 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r8 + sbc r11, r11, r9 + stm r12!, {r10, r11} + sub r12, r12, #36 + asr lr, r11, #25 + # Conditionally subtract order starting at bit 125 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa00000 + lsl r1, r1, #8 + add r1, r1, #0x0 +#else + mov r1, #0xa0000000 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0x4b + lsl r2, r2, #8 + orr r2, r2, #0x9e + lsl r2, r2, #8 + orr r2, r2, #0xba + lsl r2, r2, #8 + orr r2, r2, #0x7d +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0xba + lsl r2, r2, #8 + add r2, r2, #0x7d #else - strd r10, r11, [r1, #16] + mov r2, #0xba7d #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #24] - ldr r5, [r2, #28] -#else - ldrd r4, r5, [r2, #24] + movt r2, #0x4b9e #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #24] - ldr r7, [r0, #28] -#else - ldrd r6, r7, [r0, #24] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0xcb + lsl r3, r3, #8 + orr r3, r3, #2 + lsl r3, r3, #8 + orr r3, r3, #0x4c + lsl r3, r3, #8 + orr r3, r3, #0x63 #else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0x4c + lsl r3, r3, #8 + add r3, r3, #0x63 #else - strd r4, r5, [r0] + mov r3, #0x4c63 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] + movt r3, #0xcb02 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xd4 + lsl r4, r4, #8 + orr r4, r4, #0x5e + lsl r4, r4, #8 + orr r4, r4, #0xf3 + lsl r4, r4, #8 + orr r4, r4, #0x9a #else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xf3 + lsl r4, r4, #8 + add r4, r4, #0x9a #else - strd r4, r5, [r0, #16] + mov r4, #0xf39a #endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] + movt r4, #0xd45e #endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #2 + lsl r5, r5, #8 + orr r5, r5, #0x9b + lsl r5, r5, #8 + orr r5, r5, #0xdf + lsl r5, r5, #8 + orr r5, r5, #59 #else - ldrd r4, r5, [r1] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #0xdf + lsl r5, r5, #8 + add r5, r5, #0x3b #else - strd r4, r5, [r1] + mov r5, #0xdf3b #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] + movt r5, #0x29b #endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r9, #0x20000 + lsl r9, r9, #8 + add r9, r9, #0x0 #else - strd r4, r5, [r1, #16] + mov r9, #0x2000000 #endif + and r1, r1, lr + and r2, r2, lr + and r3, r3, lr + and r4, r4, lr + and r5, r5, lr + and r9, r9, lr + ldm r12, {r10, r11} + adds r10, r10, r1 + adcs r11, r11, r2 + stm r12!, {r10, r11} + ldm r12, {r10, r11} adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] + adcs r11, r11, r4 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, r5 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, #0 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10} + adcs r10, r10, #0 + stm r12!, {r10} + sub r0, r0, #16 + mov r12, sp + # Load bits 252-376 + add r12, r12, #28 + ldm r12, {r1, r2, r3, r4, r5} + lsl r5, r5, #4 + orr r5, r5, r4, lsr #28 + lsl r4, r4, #4 + orr r4, r4, r3, lsr #28 + lsl r3, r3, #4 + orr r3, r3, r2, lsr #28 + lsl r2, r2, #4 + orr r2, r2, r1, lsr #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r5, r5, #0xe0000000 #else - strd r10, r11, [r1, #24] + bfc r5, #29, #3 #endif - ldr r0, [sp, #8] - ldr r1, [sp, #76] - # Double -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] + sub r12, r12, #28 + # Sub product of top 4 words and order + mov r0, sp + # * -5cf5d3ed +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 #else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 #else - ldrd r6, r7, [r1, #8] + mov r1, #0x2c13 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #16] - ldr r9, [r1, #20] -#else - ldrd r8, r9, [r1, #16] + movt r1, #0xa30a #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r1, #24] - ldr r11, [r1, #28] + mov lr, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, lr, r2, r1 + adds r7, r7, lr + mov lr, #0 + adc lr, lr, #0 + umlal r7, lr, r3, r1 + adds r8, r8, lr + mov lr, #0 + adc lr, lr, #0 + umlal r8, lr, r4, r1 + adds r9, r9, lr + mov lr, #0 + adc lr, lr, #0 + umlal r9, lr, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -5812631b +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 #else - ldrd r10, r11, [r1, #24] -#endif - adds r4, r4, r4 - adcs r5, r5, r5 - adcs r6, r6, r6 - adcs r7, r7, r7 - adcs r8, r8, r8 - adcs r9, r9, r9 - adcs r10, r10, r10 - adc r11, r11, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 #else - strd r4, r5, [r0] + mov r1, #0x9ce5 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] + movt r1, #0xa7ed #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] + mov r10, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r10, r2, r1 + adds r7, r7, r10 + mov r10, #0 + adc r10, r10, #0 + umlal r7, r10, r3, r1 + adds r8, r8, r10 + mov r10, #0 + adc r10, r10, #0 + umlal r8, r10, r4, r1 + adds r9, r9, r10 + mov r10, #0 + adc r10, r10, #0 + umlal r9, r10, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -a2f79cd7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 #else - strd r8, r9, [r0, #16] + mov r1, #0x6329 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] + movt r1, #0x5d08 #endif - ldr r0, [sp, #12] - ldr r1, [sp, #8] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] + mov r11, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r11, r2, r1 + adds r7, r7, r11 + mov r11, #0 + adc r11, r11, #0 + umlal r7, r11, r3, r1 + adds r8, r8, r11 + mov r11, #0 + adc r11, r11, #0 + umlal r8, r11, r4, r1 + adds r9, r9, r11 + mov r11, #0 + adc r11, r11, #0 + umlal r9, r11, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -14def9df +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 #else - ldrd r4, r5, [r1] + mov r1, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0] - ldr r7, [r0, #4] -#else - ldrd r6, r7, [r0] + movt r1, #0xeb21 #endif - adds r8, r4, r6 mov r12, #0 - adcs r9, r5, r7 + ldm r0, {r6, r7, r8, r9} + umlal r6, r12, r2, r1 + adds r7, r7, r12 + mov r12, #0 adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif - # Sub - subs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 + umlal r7, r12, r3, r1 + adds r8, r8, r12 mov r12, #0 - adcs r9, r5, r7 adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] -#else - strd r10, r11, [r1, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #16] - ldr r7, [r0, #20] -#else - ldrd r6, r7, [r0, #16] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 + umlal r8, r12, r4, r1 + adds r9, r9, r12 mov r12, #0 - adcs r9, r5, r7 adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] -#else - strd r10, r11, [r1, #16] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #24] - ldr r5, [r1, #28] -#else - ldrd r4, r5, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #24] - ldr r7, [r0, #28] -#else - ldrd r6, r7, [r0, #24] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] + umlal r9, r12, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # Add overflows at 4 * 32 + ldm r0, {r6, r7, r8, r9} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + adds r6, r6, lr + adcs r7, r7, r10 + adcs r8, r8, r11 + adc r9, r9, r12 + # Subtract top at 4 * 32 + subs r6, r6, r2 + sbcs r7, r7, r3 + sbcs r8, r8, r4 + sbcs r9, r9, r5 + sbc r1, r1, r1 + sub r0, r0, #16 + ldm r0, {r2, r3, r4, r5} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5c + lsl r10, r10, #8 + orr r10, r10, #0xf5 + lsl r10, r10, #8 + orr r10, r10, #0xd3 + lsl r10, r10, #8 + orr r10, r10, #0xed +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xd3 + lsl r10, r10, #8 + add r10, r10, #0xed #else - ldrd r4, r5, [r0, #16] + mov r10, #0xd3ed #endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] + movt r10, #0x5cf5 #endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x58 + lsl r11, r11, #8 + orr r11, r11, #18 + lsl r11, r11, #8 + orr r11, r11, #0x63 + lsl r11, r11, #8 + orr r11, r11, #26 #else - strd r8, r9, [r0, #24] -#endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x63 + lsl r11, r11, #8 + add r11, r11, #0x1a #else - ldrd r4, r5, [r1] + mov r11, #0x631a #endif - adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] -#else - strd r4, r5, [r1] + movt r11, #0x5812 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0xa2 + lsl r12, r12, #8 + orr r12, r12, #0xf7 + lsl r12, r12, #8 + orr r12, r12, #0x9c + lsl r12, r12, #8 + orr r12, r12, #0xd6 #else - ldrd r4, r5, [r1, #8] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0x9c + lsl r12, r12, #8 + add r12, r12, #0xd6 #else - strd r4, r5, [r1, #16] + mov r12, #0x9cd6 #endif - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] -#else - strd r10, r11, [r1, #24] + movt r12, #0xa2f7 #endif - add sp, sp, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #20 + lsl lr, lr, #8 + orr lr, lr, #0xde + lsl lr, lr, #8 + orr lr, lr, #0xf9 + lsl lr, lr, #8 + orr lr, lr, #0xde +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #0xf9 + lsl lr, lr, #8 + add lr, lr, #0xde +#else + mov lr, #0xf9de +#endif + movt lr, #0x14de +#endif + and r10, r10, r1 + and r11, r11, r1 + and r12, r12, r1 + and lr, lr, r1 + adds r2, r2, r10 + adcs r3, r3, r11 + adcs r4, r4, r12 + adcs r5, r5, lr + adcs r6, r6, #0 + adcs r7, r7, #0 + and r1, r1, #0x10000000 + adcs r8, r8, #0 + adc r9, r9, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + # Store result + ldr r0, [sp, #52] + stm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + add sp, sp, #56 pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_ge_msub,.-fe_ge_msub + .size sc_reduce,.-sc_reduce +#else .text .align 4 - .globl fe_ge_add - .type fe_ge_add, %function -fe_ge_add: + .globl sc_reduce + .type sc_reduce, %function +sc_reduce: push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #0x60 - str r0, [sp] - str r1, [sp, #4] - str r2, [sp, #8] - str r3, [sp, #12] - ldr r0, [sp] - ldr r1, [sp, #136] - ldr r2, [sp, #132] - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] + sub sp, sp, #56 + str r0, [sp, #52] + # Load bits 252-511 + add r0, r0, #28 + ldm r0, {r1, r2, r3, r4, r5, r6, r7, r8, r9} + lsr lr, r9, #24 + lsl r9, r9, #4 + orr r9, r9, r8, LSR #28 + lsl r8, r8, #4 + orr r8, r8, r7, LSR #28 + lsl r7, r7, #4 + orr r7, r7, r6, LSR #28 + lsl r6, r6, #4 + orr r6, r6, r5, LSR #28 + lsl r5, r5, #4 + orr r5, r5, r4, LSR #28 + lsl r4, r4, #4 + orr r4, r4, r3, LSR #28 + lsl r3, r3, #4 + orr r3, r3, r2, LSR #28 + lsl r2, r2, #4 + orr r2, r2, r1, LSR #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + sub r0, r0, #28 + # Add order times bits 504..511 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xa3 + lsl r10, r10, #8 + orr r10, r10, #10 + lsl r10, r10, #8 + orr r10, r10, #44 + lsl r10, r10, #8 + orr r10, r10, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x2c + lsl r10, r10, #8 + add r10, r10, #0x13 #else - ldrd r4, r5, [r1] + mov r10, #0x2c13 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] + movt r10, #0xa30a #endif - adds r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xa7 + lsl r11, r11, #8 + orr r11, r11, #0xed + lsl r11, r11, #8 + orr r11, r11, #0x9c + lsl r11, r11, #8 + orr r11, r11, #0xe5 #else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x9c + lsl r11, r11, #8 + add r11, r11, #0xe5 #else - ldrd r8, r9, [r2, #16] + mov r11, #0x9ce5 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] + movt r11, #0xa7ed #endif - adcs r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] + mov r1, #0 + umlal r2, r1, r10, lr + umaal r3, r1, r11, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5d + lsl r10, r10, #8 + orr r10, r10, #8 + lsl r10, r10, #8 + orr r10, r10, #0x63 + lsl r10, r10, #8 + orr r10, r10, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x63 + lsl r10, r10, #8 + add r10, r10, #0x29 #else - ldrd r4, r5, [r0] + mov r10, #0x6329 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] + movt r10, #0x5d08 #endif - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xeb + lsl r11, r11, #8 + orr r11, r11, #33 + lsl r11, r11, #8 + orr r11, r11, #6 + lsl r11, r11, #8 + orr r11, r11, #33 #else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x6 + lsl r11, r11, #8 + add r11, r11, #0x21 #else - strd r6, r7, [r0, #8] + mov r11, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] + movt r11, #0xeb21 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r0, [sp, #4] - ldr r1, [sp, #136] - ldr r2, [sp, #132] - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] + umaal r4, r1, r10, lr + umaal r5, r1, r11, lr + adds r6, r6, r1 + adcs r7, r7, #0 + adcs r8, r8, #0 + adc r9, r9, #0 + subs r6, r6, lr + sbcs r7, r7, #0 + sbcs r8, r8, #0 + sbc r9, r9, #0 + # Sub product of top 8 words and order + mov r12, sp +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 +#else + mov r1, #0x2c13 +#endif + movt r1, #0xa30a +#endif + mov lr, #0 + ldm r0!, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + umaal r10, lr, r8, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0xf0000000 +#else + bfc r11, #28, #4 +#endif + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r0, r0, #16 + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 +#else + mov r1, #0x9ce5 +#endif + movt r1, #0xa7ed +#endif + mov lr, #0 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r8, r1 + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 +#else + mov r1, #0x6329 +#endif + movt r1, #0x5d08 +#endif + mov lr, #0 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r8, r1 + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 +#else + mov r1, #0x621 +#endif + movt r1, #0xeb21 +#endif + mov lr, #0 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r8, r1 + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 + # Subtract at 4 * 32 + ldm r12, {r10, r11} + subs r10, r10, r2 + sbcs r11, r11, r3 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r4 + sbcs r11, r11, r5 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r6 + sbcs r11, r11, r7 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r8 + sbc r11, r11, r9 + stm r12!, {r10, r11} + sub r12, r12, #36 + asr lr, r11, #25 + # Conditionally subtract order starting at bit 125 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa00000 + lsl r1, r1, #8 + add r1, r1, #0x0 +#else + mov r1, #0xa0000000 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0x4b + lsl r2, r2, #8 + orr r2, r2, #0x9e + lsl r2, r2, #8 + orr r2, r2, #0xba + lsl r2, r2, #8 + orr r2, r2, #0x7d +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0xba + lsl r2, r2, #8 + add r2, r2, #0x7d #else - ldrd r4, r5, [r1] + mov r2, #0xba7d #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] + movt r2, #0x4b9e #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0xcb + lsl r3, r3, #8 + orr r3, r3, #2 + lsl r3, r3, #8 + orr r3, r3, #0x4c + lsl r3, r3, #8 + orr r3, r3, #0x63 #else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0x4c + lsl r3, r3, #8 + add r3, r3, #0x63 #else - ldrd r10, r11, [r2, #8] + mov r3, #0x4c63 #endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] + movt r3, #0xcb02 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xd4 + lsl r4, r4, #8 + orr r4, r4, #0x5e + lsl r4, r4, #8 + orr r4, r4, #0xf3 + lsl r4, r4, #8 + orr r4, r4, #0x9a #else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xf3 + lsl r4, r4, #8 + add r4, r4, #0x9a #else - ldrd r4, r5, [r1, #16] + mov r4, #0xf39a #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] + movt r4, #0xd45e #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #2 + lsl r5, r5, #8 + orr r5, r5, #0x9b + lsl r5, r5, #8 + orr r5, r5, #0xdf + lsl r5, r5, #8 + orr r5, r5, #59 #else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #0xdf + lsl r5, r5, #8 + add r5, r5, #0x3b #else - ldrd r10, r11, [r2, #24] + mov r5, #0xdf3b #endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] + movt r5, #0x29b #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r9, #0x20000 + lsl r9, r9, #8 + add r9, r9, #0x0 #else - ldrd r6, r7, [r0, #8] + mov r9, #0x2000000 #endif - adds r4, r4, r12 - adcs r5, r5, r3 - adcs r6, r6, r3 - adcs r7, r7, r3 - adcs r8, r8, r3 - adcs r9, r9, r3 + and r1, r1, lr + and r2, r2, lr + and r3, r3, lr + and r4, r4, lr + and r5, r5, lr + and r9, r9, lr + ldm r12, {r10, r11} + adds r10, r10, r1 + adcs r11, r11, r2 + stm r12!, {r10, r11} + ldm r12, {r10, r11} adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r2, [sp, #156] - ldr r1, [sp] - ldr r0, [sp, #8] - bl fe_mul - ldr r2, [sp, #160] - ldr r1, [sp, #4] - ldr r0, [sp, #4] - bl fe_mul - ldr r2, [sp, #144] - ldr r1, [sp, #152] - ldr r0, [sp, #12] - bl fe_mul - ldr r2, [sp, #148] - ldr r1, [sp, #140] - ldr r0, [sp] - bl fe_mul - add r0, sp, #16 - ldr r1, [sp] - # Double -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #16] - ldr r9, [r1, #20] + adcs r11, r11, r4 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, r5 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, #0 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10} + adcs r10, r10, #0 + stm r12!, {r10} + sub r0, r0, #16 + mov r12, sp + # Load bits 252-376 + add r12, r12, #28 + ldm r12, {r1, r2, r3, r4, r5} + lsl r5, r5, #4 + orr r5, r5, r4, lsr #28 + lsl r4, r4, #4 + orr r4, r4, r3, lsr #28 + lsl r3, r3, #4 + orr r3, r3, r2, lsr #28 + lsl r2, r2, #4 + orr r2, r2, r1, lsr #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r5, r5, #0xe0000000 #else - ldrd r8, r9, [r1, #16] + bfc r5, #29, #3 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r1, #24] - ldr r11, [r1, #28] -#else - ldrd r10, r11, [r1, #24] -#endif - adds r4, r4, r4 - adcs r5, r5, r5 - adcs r6, r6, r6 - adcs r7, r7, r7 - adcs r8, r8, r8 - adcs r9, r9, r9 - adcs r10, r10, r10 - adc r11, r11, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] + sub r12, r12, #28 + # Sub product of top 4 words and order + mov r0, sp + # * -5cf5d3ed +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 +#else + mov r1, #0x2c13 +#endif + movt r1, #0xa30a +#endif + mov lr, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, lr, r2, r1 + umaal r7, lr, r3, r1 + umaal r8, lr, r4, r1 + umaal r9, lr, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -5812631b +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 #else - strd r4, r5, [r0] + mov r1, #0x9ce5 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] + movt r1, #0xa7ed #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] + mov r10, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r10, r2, r1 + umaal r7, r10, r3, r1 + umaal r8, r10, r4, r1 + umaal r9, r10, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -a2f79cd7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 #else - strd r8, r9, [r0, #16] + mov r1, #0x6329 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] + movt r1, #0x5d08 #endif - ldr r0, [sp, #4] - ldr r1, [sp] - ldr r2, [sp, #8] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2] - ldr r5, [r2, #4] + mov r11, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r11, r2, r1 + umaal r7, r11, r3, r1 + umaal r8, r11, r4, r1 + umaal r9, r11, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -14def9df +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 #else - ldrd r4, r5, [r2] + mov r1, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0] - ldr r7, [r0, #4] -#else - ldrd r6, r7, [r0] + movt r1, #0xeb21 #endif - adds r8, r4, r6 mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] + ldm r0, {r6, r7, r8, r9} + umlal r6, r12, r2, r1 + umaal r7, r12, r3, r1 + umaal r8, r12, r4, r1 + umaal r9, r12, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # Add overflows at 4 * 32 + ldm r0, {r6, r7, r8, r9} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + adds r6, r6, lr + adcs r7, r7, r10 + adcs r8, r8, r11 + adc r9, r9, r12 + # Subtract top at 4 * 32 + subs r6, r6, r2 + sbcs r7, r7, r3 + sbcs r8, r8, r4 + sbcs r9, r9, r5 + sbc r1, r1, r1 + sub r0, r0, #16 + ldm r0, {r2, r3, r4, r5} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5c + lsl r10, r10, #8 + orr r10, r10, #0xf5 + lsl r10, r10, #8 + orr r10, r10, #0xd3 + lsl r10, r10, #8 + orr r10, r10, #0xed +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xd3 + lsl r10, r10, #8 + add r10, r10, #0xed #else - strd r8, r9, [r0] + mov r10, #0xd3ed #endif - # Sub - subs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] + movt r10, #0x5cf5 #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #8] - ldr r5, [r2, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x58 + lsl r11, r11, #8 + orr r11, r11, #18 + lsl r11, r11, #8 + orr r11, r11, #0x63 + lsl r11, r11, #8 + orr r11, r11, #26 #else - ldrd r4, r5, [r2, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x63 + lsl r11, r11, #8 + add r11, r11, #0x1a #else - ldrd r6, r7, [r0, #8] + mov r11, #0x631a #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] + movt r11, #0x5812 #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0xa2 + lsl r12, r12, #8 + orr r12, r12, #0xf7 + lsl r12, r12, #8 + orr r12, r12, #0x9c + lsl r12, r12, #8 + orr r12, r12, #0xd6 #else - strd r10, r11, [r1, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #16] - ldr r5, [r2, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0x9c + lsl r12, r12, #8 + add r12, r12, #0xd6 #else - ldrd r4, r5, [r2, #16] + mov r12, #0x9cd6 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #16] - ldr r7, [r0, #20] -#else - ldrd r6, r7, [r0, #16] + movt r12, #0xa2f7 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #20 + lsl lr, lr, #8 + orr lr, lr, #0xde + lsl lr, lr, #8 + orr lr, lr, #0xf9 + lsl lr, lr, #8 + orr lr, lr, #0xde +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #0xf9 + lsl lr, lr, #8 + add lr, lr, #0xde +#else + mov lr, #0xf9de +#endif + movt lr, #0x14de +#endif + and r10, r10, r1 + and r11, r11, r1 + and r12, r12, r1 + and lr, lr, r1 + adds r2, r2, r10 + adcs r3, r3, r11 + adcs r4, r4, r12 + adcs r5, r5, lr + adcs r6, r6, #0 + adcs r7, r7, #0 + and r1, r1, #0x10000000 + adcs r8, r8, #0 + adc r9, r9, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + # Store result + ldr r0, [sp, #52] + stm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + add sp, sp, #56 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size sc_reduce,.-sc_reduce +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#ifdef HAVE_ED25519_SIGN +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + .text + .align 4 + .globl sc_muladd + .type sc_muladd, %function +sc_muladd: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #0x50 + add lr, sp, #0x44 + stm lr, {r0, r1, r3} + mov r0, #0 + ldr r12, [r1] + # A[0] * B[0] + ldr lr, [r2] + umull r3, r4, r12, lr + # A[0] * B[2] + ldr lr, [r2, #8] + umull r5, r6, r12, lr + # A[0] * B[4] + ldr lr, [r2, #16] + umull r7, r8, r12, lr + # A[0] * B[6] + ldr lr, [r2, #24] + umull r9, r10, r12, lr + str r3, [sp] + # A[0] * B[1] + ldr lr, [r2, #4] + mov r11, r0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[0] * B[3] + ldr lr, [r2, #12] + adcs r6, r6, #0 + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[0] * B[5] + ldr lr, [r2, #20] + adcs r8, r8, #0 + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[0] * B[7] + ldr lr, [r2, #28] + adcs r10, r10, #0 + adc r3, r0, #0 + umlal r10, r3, r12, lr + # A[1] * B[0] + ldr r12, [r1, #4] + ldr lr, [r2] + mov r11, #0 + umlal r4, r11, r12, lr + str r4, [sp, #4] + adds r5, r5, r11 + # A[1] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[1] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[1] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[1] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[1] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[1] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[1] * B[7] + ldr lr, [r2, #28] + adc r4, r0, #0 + umlal r3, r4, r12, lr + # A[2] * B[0] + ldr r12, [r1, #8] + ldr lr, [r2] + mov r11, #0 + umlal r5, r11, r12, lr + str r5, [sp, #8] + adds r6, r6, r11 + # A[2] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[2] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[2] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[2] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[2] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[2] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[2] * B[7] + ldr lr, [r2, #28] + adc r5, r0, #0 + umlal r4, r5, r12, lr + # A[3] * B[0] + ldr r12, [r1, #12] + ldr lr, [r2] + mov r11, #0 + umlal r6, r11, r12, lr + str r6, [sp, #12] + adds r7, r7, r11 + # A[3] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[3] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[3] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[3] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[3] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[3] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[3] * B[7] + ldr lr, [r2, #28] + adc r6, r0, #0 + umlal r5, r6, r12, lr + # A[4] * B[0] + ldr r12, [r1, #16] + ldr lr, [r2] + mov r11, #0 + umlal r7, r11, r12, lr + str r7, [sp, #16] + adds r8, r8, r11 + # A[4] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[4] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[4] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[4] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[4] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[4] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[4] * B[7] + ldr lr, [r2, #28] + adc r7, r0, #0 + umlal r6, r7, r12, lr + # A[5] * B[0] + ldr r12, [r1, #20] + ldr lr, [r2] + mov r11, #0 + umlal r8, r11, r12, lr + str r8, [sp, #20] + adds r9, r9, r11 + # A[5] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r9, r11, r12, lr + adds r10, r10, r11 + # A[5] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[5] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[5] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[5] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[5] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[5] * B[7] + ldr lr, [r2, #28] + adc r8, r0, #0 + umlal r7, r8, r12, lr + # A[6] * B[0] + ldr r12, [r1, #24] + ldr lr, [r2] + mov r11, #0 + umlal r9, r11, r12, lr + str r9, [sp, #24] + adds r10, r10, r11 + # A[6] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r10, r11, r12, lr + adds r3, r3, r11 + # A[6] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[6] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[6] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[6] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[6] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[6] * B[7] + ldr lr, [r2, #28] + adc r9, r0, #0 + umlal r8, r9, r12, lr + # A[7] * B[0] + ldr r12, [r1, #28] + ldr lr, [r2] + mov r11, #0 + umlal r10, r11, r12, lr + str r10, [sp, #28] + adds r3, r3, r11 + # A[7] * B[1] + ldr lr, [r2, #4] + adc r11, r0, #0 + umlal r3, r11, r12, lr + adds r4, r4, r11 + # A[7] * B[2] + ldr lr, [r2, #8] + adc r11, r0, #0 + umlal r4, r11, r12, lr + adds r5, r5, r11 + # A[7] * B[3] + ldr lr, [r2, #12] + adc r11, r0, #0 + umlal r5, r11, r12, lr + adds r6, r6, r11 + # A[7] * B[4] + ldr lr, [r2, #16] + adc r11, r0, #0 + umlal r6, r11, r12, lr + adds r7, r7, r11 + # A[7] * B[5] + ldr lr, [r2, #20] + adc r11, r0, #0 + umlal r7, r11, r12, lr + adds r8, r8, r11 + # A[7] * B[6] + ldr lr, [r2, #24] + adc r11, r0, #0 + umlal r8, r11, r12, lr + adds r9, r9, r11 + # A[7] * B[7] + ldr lr, [r2, #28] + adc r10, r0, #0 + umlal r9, r10, r12, lr + add lr, sp, #32 + stm lr, {r3, r4, r5, r6, r7, r8, r9, r10} + mov r0, sp + # Add c to a * b + ldr lr, [sp, #76] + ldm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + ldm lr!, {r1, r10, r11, r12} + adds r2, r2, r1 + adcs r3, r3, r10 + adcs r4, r4, r11 + adcs r5, r5, r12 + ldm lr!, {r1, r10, r11, r12} + adcs r6, r6, r1 + adcs r7, r7, r10 + adcs r8, r8, r11 + adcs r9, r9, r12 + mov r1, r9 + stm r0!, {r2, r3, r4, r5, r6, r7, r8, r9} + ldm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + adcs r2, r2, #0 + adcs r3, r3, #0 + adcs r4, r4, #0 + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 + adcs r8, r8, #0 + adc r9, r9, #0 + sub r0, r0, #32 + # Get 252..503 and 504..507 + lsr lr, r9, #24 + lsl r9, r9, #4 + orr r9, r9, r8, LSR #28 + lsl r8, r8, #4 + orr r8, r8, r7, LSR #28 + lsl r7, r7, #4 + orr r7, r7, r6, LSR #28 + lsl r6, r6, #4 + orr r6, r6, r5, LSR #28 + lsl r5, r5, #4 + orr r5, r5, r4, LSR #28 + lsl r4, r4, #4 + orr r4, r4, r3, LSR #28 + lsl r3, r3, #4 + orr r3, r3, r2, LSR #28 + lsl r2, r2, #4 + orr r2, r2, r1, LSR #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + # Add order times bits 504..507 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xa3 + lsl r10, r10, #8 + orr r10, r10, #10 + lsl r10, r10, #8 + orr r10, r10, #44 + lsl r10, r10, #8 + orr r10, r10, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x2c + lsl r10, r10, #8 + add r10, r10, #0x13 #else - strd r8, r9, [r0, #16] + mov r10, #0x2c13 #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] -#else - strd r10, r11, [r1, #16] + movt r10, #0xa30a #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #24] - ldr r5, [r2, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xa7 + lsl r11, r11, #8 + orr r11, r11, #0xed + lsl r11, r11, #8 + orr r11, r11, #0x9c + lsl r11, r11, #8 + orr r11, r11, #0xe5 #else - ldrd r4, r5, [r2, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #24] - ldr r7, [r0, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x9c + lsl r11, r11, #8 + add r11, r11, #0xe5 #else - ldrd r6, r7, [r0, #24] + mov r11, #0x9ce5 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] + movt r11, #0xa7ed #endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] + mov r1, #0 + umlal r2, r1, r10, lr + adds r3, r3, r1 + mov r1, #0 + adc r1, r1, #0 + umlal r3, r1, r11, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5d + lsl r10, r10, #8 + orr r10, r10, #8 + lsl r10, r10, #8 + orr r10, r10, #0x63 + lsl r10, r10, #8 + orr r10, r10, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x63 + lsl r10, r10, #8 + add r10, r10, #0x29 #else - strd r4, r5, [r0] + mov r10, #0x6329 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] + movt r10, #0x5d08 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xeb + lsl r11, r11, #8 + orr r11, r11, #33 + lsl r11, r11, #8 + orr r11, r11, #6 + lsl r11, r11, #8 + orr r11, r11, #33 #else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x6 + lsl r11, r11, #8 + add r11, r11, #0x21 #else - strd r4, r5, [r0, #16] + mov r11, #0x621 #endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] + movt r11, #0xeb21 #endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] + adds r4, r4, r1 + mov r1, #0 + adc r1, r1, #0 + umlal r4, r1, r10, lr + adds r5, r5, r1 + mov r1, #0 + adc r1, r1, #0 + umlal r5, r1, r11, lr + adds r6, r6, r1 + adcs r7, r7, #0 + adcs r8, r8, #0 + adc r9, r9, #0 + subs r6, r6, lr + sbcs r7, r7, #0 + sbcs r8, r8, #0 + sbc r9, r9, #0 + # Sub product of top 8 words and order + mov r12, sp +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 #else - ldrd r4, r5, [r1] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 #else - strd r4, r5, [r1] + mov r1, #0x2c13 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] + movt r1, #0xa30a #endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] + mov lr, #0 + ldm r0!, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0xf0000000 #else - strd r4, r5, [r1, #16] + bfc r11, #28, #4 #endif - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] -#else - strd r10, r11, [r1, #24] -#endif - ldr r0, [sp, #8] - ldr r1, [sp, #12] - add r2, sp, #16 - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2] - ldr r5, [r2, #4] + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r0, r0, #16 + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 #else - ldrd r4, r5, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1] - ldr r7, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 #else - ldrd r6, r7, [r1] + mov r1, #0x9ce5 #endif - adds r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] + movt r1, #0xa7ed #endif - # Sub - subs r10, r4, r6 mov lr, #0 - sbcs r11, r5, r7 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #8] - ldr r5, [r2, #12] + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 #else - ldrd r4, r5, [r2, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 #else - ldrd r6, r7, [r1, #8] + mov r1, #0x6329 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] + movt r1, #0x5d08 #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 mov lr, #0 - sbcs r11, r5, r7 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 #else - strd r10, r11, [r1, #8] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #16] - ldr r5, [r2, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 #else - ldrd r4, r5, [r2, #16] + mov r1, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #16] - ldr r7, [r1, #20] -#else - ldrd r6, r7, [r1, #16] + movt r1, #0xeb21 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 mov lr, #0 - sbcs r11, r5, r7 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + adds r11, r11, lr + mov lr, #0 adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] + umlal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r4, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r6, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adds r10, r10, lr + mov lr, #0 + adc lr, lr, #0 + umlal r10, lr, r8, r1 + adds r11, r11, lr + mov lr, #0 + adc lr, lr, #0 + umlal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 + # Subtract at 4 * 32 + ldm r12, {r10, r11} + subs r10, r10, r2 + sbcs r11, r11, r3 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r4 + sbcs r11, r11, r5 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r6 + sbcs r11, r11, r7 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r8 + sbc r11, r11, r9 + stm r12!, {r10, r11} + sub r12, r12, #36 + asr lr, r11, #25 + # Conditionally subtract order starting at bit 125 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa00000 + lsl r1, r1, #8 + add r1, r1, #0x0 +#else + mov r1, #0xa0000000 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0x4b + lsl r2, r2, #8 + orr r2, r2, #0x9e + lsl r2, r2, #8 + orr r2, r2, #0xba + lsl r2, r2, #8 + orr r2, r2, #0x7d +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0xba + lsl r2, r2, #8 + add r2, r2, #0x7d #else - strd r10, r11, [r1, #16] + mov r2, #0xba7d #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #24] - ldr r5, [r2, #28] -#else - ldrd r4, r5, [r2, #24] + movt r2, #0x4b9e #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0xcb + lsl r3, r3, #8 + orr r3, r3, #2 + lsl r3, r3, #8 + orr r3, r3, #0x4c + lsl r3, r3, #8 + orr r3, r3, #0x63 #else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0x4c + lsl r3, r3, #8 + add r3, r3, #0x63 #else - strd r4, r5, [r0] + mov r3, #0x4c63 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] + movt r3, #0xcb02 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xd4 + lsl r4, r4, #8 + orr r4, r4, #0x5e + lsl r4, r4, #8 + orr r4, r4, #0xf3 + lsl r4, r4, #8 + orr r4, r4, #0x9a #else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xf3 + lsl r4, r4, #8 + add r4, r4, #0x9a #else - strd r4, r5, [r0, #16] + mov r4, #0xf39a #endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] + movt r4, #0xd45e #endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #2 + lsl r5, r5, #8 + orr r5, r5, #0x9b + lsl r5, r5, #8 + orr r5, r5, #0xdf + lsl r5, r5, #8 + orr r5, r5, #59 #else - ldrd r4, r5, [r1] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #0xdf + lsl r5, r5, #8 + add r5, r5, #0x3b #else - strd r4, r5, [r1] + mov r5, #0xdf3b #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] + movt r5, #0x29b #endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r9, #0x20000 + lsl r9, r9, #8 + add r9, r9, #0x0 #else - strd r4, r5, [r1, #16] + mov r9, #0x2000000 #endif + and r1, r1, lr + and r2, r2, lr + and r3, r3, lr + and r4, r4, lr + and r5, r5, lr + and r9, r9, lr + ldm r12, {r10, r11} + adds r10, r10, r1 + adcs r11, r11, r2 + stm r12!, {r10, r11} + ldm r12, {r10, r11} adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] -#else - strd r10, r11, [r1, #24] -#endif - add sp, sp, #0x60 - pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_ge_add,.-fe_ge_add - .text - .align 4 - .globl fe_ge_sub - .type fe_ge_sub, %function -fe_ge_sub: - push {r4, r5, r6, r7, r8, r9, r10, r11, lr} - sub sp, sp, #0x60 - str r0, [sp] - str r1, [sp, #4] - str r2, [sp, #8] - str r3, [sp, #12] - ldr r0, [sp] - ldr r1, [sp, #136] - ldr r2, [sp, #132] - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] + adcs r11, r11, r4 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, r5 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, #0 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10} + adcs r10, r10, #0 + stm r12!, {r10} + sub r0, r0, #16 + mov r12, sp + # Load bits 252-376 + add r12, r12, #28 + ldm r12, {r1, r2, r3, r4, r5} + lsl r5, r5, #4 + orr r5, r5, r4, lsr #28 + lsl r4, r4, #4 + orr r4, r4, r3, lsr #28 + lsl r3, r3, #4 + orr r3, r3, r2, lsr #28 + lsl r2, r2, #4 + orr r2, r2, r1, lsr #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r5, r5, #0xe0000000 #else - ldrd r6, r7, [r1, #8] + bfc r5, #29, #3 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] + sub r12, r12, #28 + # Sub product of top 4 words and order + mov r0, sp + # * -5cf5d3ed +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 #else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 #else - ldrd r10, r11, [r2, #8] + mov r1, #0x2c13 #endif - adds r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] + movt r1, #0xa30a #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] + mov lr, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, lr, r2, r1 + adds r7, r7, lr + mov lr, #0 + adc lr, lr, #0 + umlal r7, lr, r3, r1 + adds r8, r8, lr + mov lr, #0 + adc lr, lr, #0 + umlal r8, lr, r4, r1 + adds r9, r9, lr + mov lr, #0 + adc lr, lr, #0 + umlal r9, lr, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -5812631b +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 #else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 #else - ldrd r4, r5, [r1, #16] + mov r1, #0x9ce5 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] + movt r1, #0xa7ed #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] + mov r10, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r10, r2, r1 + adds r7, r7, r10 + mov r10, #0 + adc r10, r10, #0 + umlal r7, r10, r3, r1 + adds r8, r8, r10 + mov r10, #0 + adc r10, r10, #0 + umlal r8, r10, r4, r1 + adds r9, r9, r10 + mov r10, #0 + adc r10, r10, #0 + umlal r9, r10, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -a2f79cd7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 #else - ldrd r8, r9, [r2, #16] + mov r1, #0x6329 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] + movt r1, #0x5d08 #endif - adcs r8, r4, r8 - adcs r9, r5, r9 - adcs r10, r6, r10 - adc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] + mov r11, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r11, r2, r1 + adds r7, r7, r11 + mov r11, #0 + adc r11, r11, #0 + umlal r7, r11, r3, r1 + adds r8, r8, r11 + mov r11, #0 + adc r11, r11, #0 + umlal r8, r11, r4, r1 + adds r9, r9, r11 + mov r11, #0 + adc r11, r11, #0 + umlal r9, r11, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -14def9df +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 #else - ldrd r4, r5, [r0] + mov r1, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] + movt r1, #0xeb21 #endif - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 + mov r12, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r12, r2, r1 + adds r7, r7, r12 + mov r12, #0 + adc r12, r12, #0 + umlal r7, r12, r3, r1 + adds r8, r8, r12 + mov r12, #0 + adc r12, r12, #0 + umlal r8, r12, r4, r1 + adds r9, r9, r12 + mov r12, #0 + adc r12, r12, #0 + umlal r9, r12, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # Add overflows at 4 * 32 + ldm r0, {r6, r7, r8, r9} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + adds r6, r6, lr + adcs r7, r7, r10 + adcs r8, r8, r11 + adc r9, r9, r12 + # Subtract top at 4 * 32 + subs r6, r6, r2 sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] + sbcs r8, r8, r4 + sbcs r9, r9, r5 + sbc r1, r1, r1 + sub r0, r0, #16 + ldm r0, {r2, r3, r4, r5} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5c + lsl r10, r10, #8 + orr r10, r10, #0xf5 + lsl r10, r10, #8 + orr r10, r10, #0xd3 + lsl r10, r10, #8 + orr r10, r10, #0xed +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xd3 + lsl r10, r10, #8 + add r10, r10, #0xed #else - strd r4, r5, [r0] + mov r10, #0xd3ed #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r0, [sp, #4] - ldr r1, [sp, #136] - ldr r2, [sp, #132] - # Sub -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2] - ldr r9, [r2, #4] -#else - ldrd r8, r9, [r2] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #8] - ldr r11, [r2, #12] -#else - ldrd r10, r11, [r2, #8] + movt r10, #0x5cf5 #endif - subs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbcs r11, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] -#else - strd r8, r9, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #8] - str r11, [r0, #12] -#else - strd r10, r11, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #24] - ldr r7, [r1, #28] -#else - ldrd r6, r7, [r1, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r2, #16] - ldr r9, [r2, #20] -#else - ldrd r8, r9, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r2, #24] - ldr r11, [r2, #28] -#else - ldrd r10, r11, [r2, #24] -#endif - sbcs r8, r4, r8 - sbcs r9, r5, r9 - sbcs r10, r6, r10 - sbc r11, r7, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 - adcs r6, r6, r3 - adcs r7, r7, r3 - adcs r8, r8, r3 - adcs r9, r9, r3 - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] -#else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] -#endif - ldr r2, [sp, #160] - ldr r1, [sp] - ldr r0, [sp, #8] - bl fe_mul - ldr r2, [sp, #156] - ldr r1, [sp, #4] - ldr r0, [sp, #4] - bl fe_mul - ldr r2, [sp, #144] - ldr r1, [sp, #152] - ldr r0, [sp, #12] - bl fe_mul - ldr r2, [sp, #148] - ldr r1, [sp, #140] - ldr r0, [sp] - bl fe_mul - add r0, sp, #16 - ldr r1, [sp] - # Double -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r1, #8] - ldr r7, [r1, #12] -#else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #16] - ldr r9, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x58 + lsl r11, r11, #8 + orr r11, r11, #18 + lsl r11, r11, #8 + orr r11, r11, #0x63 + lsl r11, r11, #8 + orr r11, r11, #26 #else - ldrd r8, r9, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r1, #24] - ldr r11, [r1, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x63 + lsl r11, r11, #8 + add r11, r11, #0x1a #else - ldrd r10, r11, [r1, #24] + mov r11, #0x631a #endif - adds r4, r4, r4 - adcs r5, r5, r5 - adcs r6, r6, r6 - adcs r7, r7, r7 - adcs r8, r8, r8 - adcs r9, r9, r9 - adcs r10, r10, r10 - adc r11, r11, r11 - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) - subs r4, r4, r12 - sbcs r5, r5, r3 - sbcs r6, r6, r3 - sbcs r7, r7, r3 - sbcs r8, r8, r3 - sbcs r9, r9, r3 - sbcs r10, r10, r3 - sbc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] -#else - strd r4, r5, [r0] + movt r11, #0x5812 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r6, [r0, #8] - str r7, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0xa2 + lsl r12, r12, #8 + orr r12, r12, #0xf7 + lsl r12, r12, #8 + orr r12, r12, #0x9c + lsl r12, r12, #8 + orr r12, r12, #0xd6 #else - strd r6, r7, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0x9c + lsl r12, r12, #8 + add r12, r12, #0xd6 #else - strd r8, r9, [r0, #16] + mov r12, #0x9cd6 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r0, #24] - str r11, [r0, #28] -#else - strd r10, r11, [r0, #24] + movt r12, #0xa2f7 #endif - ldr r0, [sp, #4] - ldr r1, [sp] - ldr r2, [sp, #8] - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2] - ldr r5, [r2, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #20 + lsl lr, lr, #8 + orr lr, lr, #0xde + lsl lr, lr, #8 + orr lr, lr, #0xf9 + lsl lr, lr, #8 + orr lr, lr, #0xde +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #0xf9 + lsl lr, lr, #8 + add lr, lr, #0xde +#else + mov lr, #0xf9de +#endif + movt lr, #0x14de +#endif + and r10, r10, r1 + and r11, r11, r1 + and r12, r12, r1 + and lr, lr, r1 + adds r2, r2, r10 + adcs r3, r3, r11 + adcs r4, r4, r12 + adcs r5, r5, lr + adcs r6, r6, #0 + adcs r7, r7, #0 + and r1, r1, #0x10000000 + adcs r8, r8, #0 + adc r9, r9, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 #else - ldrd r4, r5, [r2] + bfc r9, #28, #4 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0] - ldr r7, [r0, #4] + ldr r0, [sp, #68] + # Store result + str r2, [r0] + str r3, [r0, #4] + str r4, [r0, #8] + str r5, [r0, #12] + str r6, [r0, #16] + str r7, [r0, #20] + str r8, [r0, #24] + str r9, [r0, #28] + add sp, sp, #0x50 + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size sc_muladd,.-sc_muladd #else - ldrd r6, r7, [r0] -#endif - adds r8, r4, r6 + .text + .align 4 + .globl sc_muladd + .type sc_muladd, %function +sc_muladd: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #0x50 + add lr, sp, #0x44 + stm lr, {r0, r1, r3} + mov lr, r2 + ldm r1, {r0, r1, r2, r3} + ldm lr!, {r4, r5, r6} + umull r10, r11, r0, r4 + umull r12, r7, r1, r4 + umaal r11, r12, r0, r5 + umull r8, r9, r2, r4 + umaal r12, r8, r1, r5 + umaal r12, r7, r0, r6 + umaal r8, r9, r3, r4 + stm sp, {r10, r11, r12} + umaal r7, r8, r2, r5 + ldm lr!, {r4} + umull r10, r11, r1, r6 + umaal r8, r9, r2, r6 + umaal r7, r10, r0, r4 + umaal r8, r11, r3, r5 + str r7, [sp, #12] + umaal r8, r10, r1, r4 + umaal r9, r11, r3, r6 + umaal r9, r10, r2, r4 + umaal r10, r11, r3, r4 + ldm lr, {r4, r5, r6, r7} mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] + umlal r8, r12, r0, r4 + umaal r9, r12, r1, r4 + umaal r10, r12, r2, r4 + umaal r11, r12, r3, r4 + mov r4, #0 + umlal r9, r4, r0, r5 + umaal r10, r4, r1, r5 + umaal r11, r4, r2, r5 + umaal r12, r4, r3, r5 + mov r5, #0 + umlal r10, r5, r0, r6 + umaal r11, r5, r1, r6 + umaal r12, r5, r2, r6 + umaal r4, r5, r3, r6 + mov r6, #0 + umlal r11, r6, r0, r7 + ldr r0, [sp, #72] + umaal r12, r6, r1, r7 + add r0, r0, #16 + umaal r4, r6, r2, r7 + sub lr, lr, #16 + umaal r5, r6, r3, r7 + ldm r0, {r0, r1, r2, r3} + str r6, [sp, #64] + ldm lr!, {r6} + mov r7, #0 + umlal r8, r7, r0, r6 + umaal r9, r7, r1, r6 + str r8, [sp, #16] + umaal r10, r7, r2, r6 + umaal r11, r7, r3, r6 + ldm lr!, {r6} + mov r8, #0 + umlal r9, r8, r0, r6 + umaal r10, r8, r1, r6 + str r9, [sp, #20] + umaal r11, r8, r2, r6 + umaal r12, r8, r3, r6 + ldm lr!, {r6} + mov r9, #0 + umlal r10, r9, r0, r6 + umaal r11, r9, r1, r6 + str r10, [sp, #24] + umaal r12, r9, r2, r6 + umaal r4, r9, r3, r6 + ldm lr!, {r6} + mov r10, #0 + umlal r11, r10, r0, r6 + umaal r12, r10, r1, r6 + str r11, [sp, #28] + umaal r4, r10, r2, r6 + umaal r5, r10, r3, r6 + ldm lr!, {r11} + umaal r12, r7, r0, r11 + umaal r4, r7, r1, r11 + ldr r6, [sp, #64] + umaal r5, r7, r2, r11 + umaal r6, r7, r3, r11 + ldm lr!, {r11} + umaal r4, r8, r0, r11 + umaal r5, r8, r1, r11 + umaal r6, r8, r2, r11 + umaal r7, r8, r3, r11 + ldm lr, {r11, lr} + umaal r5, r9, r0, r11 + umaal r6, r10, r0, lr + umaal r6, r9, r1, r11 + umaal r7, r10, r1, lr + umaal r7, r9, r2, r11 + umaal r8, r10, r2, lr + umaal r8, r9, r3, r11 + umaal r9, r10, r3, lr + mov r3, r12 + add lr, sp, #32 + stm lr, {r3, r4, r5, r6, r7, r8, r9, r10} + mov r0, sp + # Add c to a * b + ldr lr, [sp, #76] + ldm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + ldm lr!, {r1, r10, r11, r12} + adds r2, r2, r1 + adcs r3, r3, r10 + adcs r4, r4, r11 + adcs r5, r5, r12 + ldm lr!, {r1, r10, r11, r12} + adcs r6, r6, r1 + adcs r7, r7, r10 + adcs r8, r8, r11 + adcs r9, r9, r12 + mov r1, r9 + stm r0!, {r2, r3, r4, r5, r6, r7, r8, r9} + ldm r0, {r2, r3, r4, r5, r6, r7, r8, r9} + adcs r2, r2, #0 + adcs r3, r3, #0 + adcs r4, r4, #0 + adcs r5, r5, #0 + adcs r6, r6, #0 + adcs r7, r7, #0 + adcs r8, r8, #0 + adc r9, r9, #0 + sub r0, r0, #32 + # Get 252..503 and 504..507 + lsr lr, r9, #24 + lsl r9, r9, #4 + orr r9, r9, r8, LSR #28 + lsl r8, r8, #4 + orr r8, r8, r7, LSR #28 + lsl r7, r7, #4 + orr r7, r7, r6, LSR #28 + lsl r6, r6, #4 + orr r6, r6, r5, LSR #28 + lsl r5, r5, #4 + orr r5, r5, r4, LSR #28 + lsl r4, r4, #4 + orr r4, r4, r3, LSR #28 + lsl r3, r3, #4 + orr r3, r3, r2, LSR #28 + lsl r2, r2, #4 + orr r2, r2, r1, LSR #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + # Add order times bits 504..507 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xa3 + lsl r10, r10, #8 + orr r10, r10, #10 + lsl r10, r10, #8 + orr r10, r10, #44 + lsl r10, r10, #8 + orr r10, r10, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x2c + lsl r10, r10, #8 + add r10, r10, #0x13 #else - strd r8, r9, [r0] + mov r10, #0x2c13 #endif - # Sub - subs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] + movt r10, #0xa30a #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #8] - ldr r5, [r2, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xa7 + lsl r11, r11, #8 + orr r11, r11, #0xed + lsl r11, r11, #8 + orr r11, r11, #0x9c + lsl r11, r11, #8 + orr r11, r11, #0xe5 #else - ldrd r4, r5, [r2, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x9c + lsl r11, r11, #8 + add r11, r11, #0xe5 #else - ldrd r6, r7, [r0, #8] + mov r11, #0x9ce5 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] -#else - strd r8, r9, [r0, #8] + movt r11, #0xa7ed #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] + mov r1, #0 + umlal r2, r1, r10, lr + umaal r3, r1, r11, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5d + lsl r10, r10, #8 + orr r10, r10, #8 + lsl r10, r10, #8 + orr r10, r10, #0x63 + lsl r10, r10, #8 + orr r10, r10, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x63 + lsl r10, r10, #8 + add r10, r10, #0x29 #else - strd r10, r11, [r1, #8] + mov r10, #0x6329 #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #16] - ldr r5, [r2, #20] -#else - ldrd r4, r5, [r2, #16] + movt r10, #0x5d08 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #16] - ldr r7, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0xeb + lsl r11, r11, #8 + orr r11, r11, #33 + lsl r11, r11, #8 + orr r11, r11, #6 + lsl r11, r11, #8 + orr r11, r11, #33 #else - ldrd r6, r7, [r0, #16] -#endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x6 + lsl r11, r11, #8 + add r11, r11, #0x21 #else - strd r8, r9, [r0, #16] + mov r11, #0x621 #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] -#else - strd r10, r11, [r1, #16] + movt r11, #0xeb21 #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #24] - ldr r5, [r2, #28] + umaal r4, r1, r10, lr + umaal r5, r1, r11, lr + adds r6, r6, r1 + adcs r7, r7, #0 + adcs r8, r8, #0 + adc r9, r9, #0 + subs r6, r6, lr + sbcs r7, r7, #0 + sbcs r8, r8, #0 + sbc r9, r9, #0 + # Sub product of top 8 words and order + mov r12, sp +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 +#else + mov r1, #0x2c13 +#endif + movt r1, #0xa30a +#endif + mov lr, #0 + ldm r0!, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r0!, {r10, r11} + umaal r10, lr, r8, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r11, r11, #0xf0000000 +#else + bfc r11, #28, #4 +#endif + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r0, r0, #16 + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 +#else + mov r1, #0x9ce5 +#endif + movt r1, #0xa7ed +#endif + mov lr, #0 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r8, r1 + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 +#else + mov r1, #0x6329 +#endif + movt r1, #0x5d08 +#endif + mov lr, #0 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r8, r1 + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 +#else + mov r1, #0x621 +#endif + movt r1, #0xeb21 +#endif + mov lr, #0 + ldm r12, {r10, r11} + umlal r10, lr, r2, r1 + umaal r11, lr, r3, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r4, r1 + umaal r11, lr, r5, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r6, r1 + umaal r11, lr, r7, r1 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + umaal r10, lr, r8, r1 + umaal r11, lr, r9, r1 + stm r12!, {r10, r11, lr} + sub r12, r12, #32 + # Subtract at 4 * 32 + ldm r12, {r10, r11} + subs r10, r10, r2 + sbcs r11, r11, r3 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r4 + sbcs r11, r11, r5 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r6 + sbcs r11, r11, r7 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + sbcs r10, r10, r8 + sbc r11, r11, r9 + stm r12!, {r10, r11} + sub r12, r12, #36 + asr lr, r11, #25 + # Conditionally subtract order starting at bit 125 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa00000 + lsl r1, r1, #8 + add r1, r1, #0x0 +#else + mov r1, #0xa0000000 +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0x4b + lsl r2, r2, #8 + orr r2, r2, #0x9e + lsl r2, r2, #8 + orr r2, r2, #0xba + lsl r2, r2, #8 + orr r2, r2, #0x7d +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r2, #0xba + lsl r2, r2, #8 + add r2, r2, #0x7d #else - ldrd r4, r5, [r2, #24] + mov r2, #0xba7d #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #24] - ldr r7, [r0, #28] -#else - ldrd r6, r7, [r0, #24] + movt r2, #0x4b9e #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0xcb + lsl r3, r3, #8 + orr r3, r3, #2 + lsl r3, r3, #8 + orr r3, r3, #0x4c + lsl r3, r3, #8 + orr r3, r3, #0x63 #else - ldrd r4, r5, [r0] -#endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r3, #0x4c + lsl r3, r3, #8 + add r3, r3, #0x63 #else - strd r4, r5, [r0] + mov r3, #0x4c63 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #8] - str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] + movt r3, #0xcb02 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xd4 + lsl r4, r4, #8 + orr r4, r4, #0x5e + lsl r4, r4, #8 + orr r4, r4, #0xf3 + lsl r4, r4, #8 + orr r4, r4, #0x9a #else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r4, #0xf3 + lsl r4, r4, #8 + add r4, r4, #0x9a #else - strd r4, r5, [r0, #16] + mov r4, #0xf39a #endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #24] - str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] + movt r4, #0xd45e #endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #2 + lsl r5, r5, #8 + orr r5, r5, #0x9b + lsl r5, r5, #8 + orr r5, r5, #0xdf + lsl r5, r5, #8 + orr r5, r5, #59 #else - ldrd r4, r5, [r1] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r5, #0xdf + lsl r5, r5, #8 + add r5, r5, #0x3b #else - strd r4, r5, [r1] + mov r5, #0xdf3b #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] + movt r5, #0x29b #endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r9, #0x20000 + lsl r9, r9, #8 + add r9, r9, #0x0 #else - strd r4, r5, [r1, #16] + mov r9, #0x2000000 #endif + and r1, r1, lr + and r2, r2, lr + and r3, r3, lr + and r4, r4, lr + and r5, r5, lr + and r9, r9, lr + ldm r12, {r10, r11} + adds r10, r10, r1 + adcs r11, r11, r2 + stm r12!, {r10, r11} + ldm r12, {r10, r11} adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] + adcs r11, r11, r4 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, r5 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10, r11} + adcs r10, r10, #0 + adcs r11, r11, #0 + stm r12!, {r10, r11} + ldm r12, {r10} + adcs r10, r10, #0 + stm r12!, {r10} + sub r0, r0, #16 + mov r12, sp + # Load bits 252-376 + add r12, r12, #28 + ldm r12, {r1, r2, r3, r4, r5} + lsl r5, r5, #4 + orr r5, r5, r4, lsr #28 + lsl r4, r4, #4 + orr r4, r4, r3, lsr #28 + lsl r3, r3, #4 + orr r3, r3, r2, lsr #28 + lsl r2, r2, #4 + orr r2, r2, r1, lsr #28 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r5, r5, #0xe0000000 #else - strd r10, r11, [r1, #24] + bfc r5, #29, #3 #endif - ldr r0, [sp, #12] - ldr r1, [sp, #8] - add r2, sp, #16 - # Add-Sub - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2] - ldr r5, [r2, #4] + sub r12, r12, #28 + # Sub product of top 4 words and order + mov r0, sp + # * -5cf5d3ed +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa3 + lsl r1, r1, #8 + orr r1, r1, #10 + lsl r1, r1, #8 + orr r1, r1, #44 + lsl r1, r1, #8 + orr r1, r1, #19 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x2c + lsl r1, r1, #8 + add r1, r1, #0x13 +#else + mov r1, #0x2c13 +#endif + movt r1, #0xa30a +#endif + mov lr, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, lr, r2, r1 + umaal r7, lr, r3, r1 + umaal r8, lr, r4, r1 + umaal r9, lr, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -5812631b +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xa7 + lsl r1, r1, #8 + orr r1, r1, #0xed + lsl r1, r1, #8 + orr r1, r1, #0x9c + lsl r1, r1, #8 + orr r1, r1, #0xe5 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x9c + lsl r1, r1, #8 + add r1, r1, #0xe5 #else - ldrd r4, r5, [r2] + mov r1, #0x9ce5 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0] - ldr r7, [r0, #4] -#else - ldrd r6, r7, [r0] + movt r1, #0xa7ed #endif - adds r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0] - str r9, [r0, #4] + mov r10, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r10, r2, r1 + umaal r7, r10, r3, r1 + umaal r8, r10, r4, r1 + umaal r9, r10, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -a2f79cd7 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x5d + lsl r1, r1, #8 + orr r1, r1, #8 + lsl r1, r1, #8 + orr r1, r1, #0x63 + lsl r1, r1, #8 + orr r1, r1, #41 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x63 + lsl r1, r1, #8 + add r1, r1, #0x29 #else - strd r8, r9, [r0] + mov r1, #0x6329 #endif - # Sub - subs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1] - str r11, [r1, #4] -#else - strd r10, r11, [r1] + movt r1, #0x5d08 #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #8] - ldr r5, [r2, #12] + mov r11, #0 + ldm r0, {r6, r7, r8, r9} + umlal r6, r11, r2, r1 + umaal r7, r11, r3, r1 + umaal r8, r11, r4, r1 + umaal r9, r11, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # * -14def9df +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0xeb + lsl r1, r1, #8 + orr r1, r1, #33 + lsl r1, r1, #8 + orr r1, r1, #6 + lsl r1, r1, #8 + orr r1, r1, #33 +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r1, #0x6 + lsl r1, r1, #8 + add r1, r1, #0x21 #else - ldrd r4, r5, [r2, #8] + mov r1, #0x621 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #8] - ldr r7, [r0, #12] -#else - ldrd r6, r7, [r0, #8] + movt r1, #0xeb21 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #8] - str r9, [r0, #12] + ldm r0, {r6, r7, r8, r9} + umlal r6, r12, r2, r1 + umaal r7, r12, r3, r1 + umaal r8, r12, r4, r1 + umaal r9, r12, r5, r1 + stm r0, {r6, r7, r8, r9} + add r0, r0, #4 + # Add overflows at 4 * 32 + ldm r0, {r6, r7, r8, r9} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 +#else + bfc r9, #28, #4 +#endif + adds r6, r6, lr + adcs r7, r7, r10 + adcs r8, r8, r11 + adc r9, r9, r12 + # Subtract top at 4 * 32 + subs r6, r6, r2 + sbcs r7, r7, r3 + sbcs r8, r8, r4 + sbcs r9, r9, r5 + sbc r1, r1, r1 + sub r0, r0, #16 + ldm r0, {r2, r3, r4, r5} +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0x5c + lsl r10, r10, #8 + orr r10, r10, #0xf5 + lsl r10, r10, #8 + orr r10, r10, #0xd3 + lsl r10, r10, #8 + orr r10, r10, #0xed +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r10, #0xd3 + lsl r10, r10, #8 + add r10, r10, #0xed #else - strd r8, r9, [r0, #8] + mov r10, #0xd3ed #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #8] - str r11, [r1, #12] -#else - strd r10, r11, [r1, #8] + movt r10, #0x5cf5 #endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #16] - ldr r5, [r2, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x58 + lsl r11, r11, #8 + orr r11, r11, #18 + lsl r11, r11, #8 + orr r11, r11, #0x63 + lsl r11, r11, #8 + orr r11, r11, #26 #else - ldrd r4, r5, [r2, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #16] - ldr r7, [r0, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r11, #0x63 + lsl r11, r11, #8 + add r11, r11, #0x1a #else - ldrd r6, r7, [r0, #16] + mov r11, #0x631a #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - mov r12, #0 - adcs r9, r5, r7 - adc r12, r12, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r8, [r0, #16] - str r9, [r0, #20] -#else - strd r8, r9, [r0, #16] + movt r11, #0x5812 #endif - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - mov lr, #0 - sbcs r11, r5, r7 - adc lr, lr, #0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #16] - str r11, [r1, #20] -#else - strd r10, r11, [r1, #16] -#endif - # Add -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r2, #24] - ldr r5, [r2, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0xa2 + lsl r12, r12, #8 + orr r12, r12, #0xf7 + lsl r12, r12, #8 + orr r12, r12, #0x9c + lsl r12, r12, #8 + orr r12, r12, #0xd6 #else - ldrd r4, r5, [r2, #24] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r6, [r0, #24] - ldr r7, [r0, #28] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov r12, #0x9c + lsl r12, r12, #8 + add r12, r12, #0xd6 #else - ldrd r6, r7, [r0, #24] + mov r12, #0x9cd6 #endif - adds r12, r12, #-1 - adcs r8, r4, r6 - adc r9, r5, r7 - # Sub - adds lr, lr, #-1 - sbcs r10, r4, r6 - sbc r11, r5, r7 - mov r12, #-19 - asr r3, r9, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Sub modulus (if overflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0] - ldr r5, [r0, #4] -#else - ldrd r4, r5, [r0] + movt r12, #0xa2f7 #endif - subs r4, r4, r12 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0] - str r5, [r0, #4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #20 + lsl lr, lr, #8 + orr lr, lr, #0xde + lsl lr, lr, #8 + orr lr, lr, #0xf9 + lsl lr, lr, #8 + orr lr, lr, #0xde +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + mov lr, #0xf9 + lsl lr, lr, #8 + add lr, lr, #0xde +#else + mov lr, #0xf9de +#endif + movt lr, #0x14de +#endif + and r10, r10, r1 + and r11, r11, r1 + and r12, r12, r1 + and lr, lr, r1 + adds r2, r2, r10 + adcs r3, r3, r11 + adcs r4, r4, r12 + adcs r5, r5, lr + adcs r6, r6, #0 + adcs r7, r7, #0 + and r1, r1, #0x10000000 + adcs r8, r8, #0 + adc r9, r9, r1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + bic r9, r9, #0xf0000000 #else - strd r4, r5, [r0] + bfc r9, #28, #4 #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #8] - ldr r5, [r0, #12] -#else - ldrd r4, r5, [r0, #8] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + ldr r0, [sp, #68] + # Store result + str r2, [r0] + str r3, [r0, #4] str r4, [r0, #8] str r5, [r0, #12] -#else - strd r4, r5, [r0, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r0, #16] - ldr r5, [r0, #20] -#else - ldrd r4, r5, [r0, #16] -#endif - sbcs r4, r4, r3 - sbcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r0, #16] - str r5, [r0, #20] -#else - strd r4, r5, [r0, #16] -#endif - sbcs r8, r8, r3 - sbc r9, r9, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + str r6, [r0, #16] + str r7, [r0, #20] str r8, [r0, #24] str r9, [r0, #28] -#else - strd r8, r9, [r0, #24] -#endif - mov r12, #-19 - asr r3, r11, #31 - # Mask the modulus - and r12, r3, r12 - and lr, r3, #0x7fffffff - # Add modulus (if underflow) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1] - ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif - adds r4, r4, r12 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1] - str r5, [r1, #4] -#else - strd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #8] - ldr r5, [r1, #12] -#else - ldrd r4, r5, [r1, #8] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #8] - str r5, [r1, #12] -#else - strd r4, r5, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r4, [r1, #16] - ldr r5, [r1, #20] -#else - ldrd r4, r5, [r1, #16] -#endif - adcs r4, r4, r3 - adcs r5, r5, r3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r4, [r1, #16] - str r5, [r1, #20] -#else - strd r4, r5, [r1, #16] -#endif - adcs r10, r10, r3 - adc r11, r11, lr -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - str r10, [r1, #24] - str r11, [r1, #28] -#else - strd r10, r11, [r1, #24] -#endif - add sp, sp, #0x60 + add sp, sp, #0x50 pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} - .size fe_ge_sub,.-fe_ge_sub + .size sc_muladd,.-sc_muladd +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#endif /* HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ -#endif /* HAVE_CURVE25519 */ -#endif /* !__aarch64__ */ +#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ +#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ #endif /* WOLFSSL_ARMASM */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519_c.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-curve25519_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,33 +28,382 @@ #include #endif /* HAVE_CONFIG_H */ #include +#include #ifdef WOLFSSL_ARMASM -#ifndef __aarch64__ +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) #include #ifdef HAVE_CONFIG_H #include #endif /* HAVE_CONFIG_H */ #include +#include +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +/* Based on work by: Emil Lenngren + * https://github.com/pornin/X25519-Cortex-M4 + */ + #include +#define CURVED25519_ASM +#include -#ifdef HAVE_CURVE25519 +#if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) +#if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) void fe_init() { - __asm__ __volatile__ ( "\n\t" - : : - : "memory" + : + : "memory", "cc" + ); +} + +void fe_add_sub_op(void); +void fe_add_sub_op() +{ + __asm__ __volatile__ ( + /* Add-Sub */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [r2]\n\t" + "ldr r5, [r2, #4]\n\t" +#else + "ldrd r4, r5, [r2]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [r3]\n\t" + "ldr r7, [r3, #4]\n\t" +#else + "ldrd r6, r7, [r3]\n\t" +#endif + /* Add */ + "adds r8, r4, r6\n\t" + "mov r12, #0\n\t" + "adcs r9, r5, r7\n\t" + "adc r12, r12, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [r0]\n\t" + "str r9, [r0, #4]\n\t" +#else + "strd r8, r9, [r0]\n\t" +#endif + /* Sub */ + "subs r10, r4, r6\n\t" + "sbcs r11, r5, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [r1]\n\t" + "str r11, [r1, #4]\n\t" +#else + "strd r10, r11, [r1]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [r2, #8]\n\t" + "ldr r5, [r2, #12]\n\t" +#else + "ldrd r4, r5, [r2, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [r3, #8]\n\t" + "ldr r7, [r3, #12]\n\t" +#else + "ldrd r6, r7, [r3, #8]\n\t" +#endif + /* Sub */ + "sbcs r10, r4, r6\n\t" + "mov lr, #0\n\t" + "sbcs r11, r5, r7\n\t" + "adc lr, lr, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [r1, #8]\n\t" + "str r11, [r1, #12]\n\t" +#else + "strd r10, r11, [r1, #8]\n\t" +#endif + /* Add */ + "subs r12, r12, #1\n\t" + "adcs r8, r4, r6\n\t" + "adcs r9, r5, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [r0, #8]\n\t" + "str r9, [r0, #12]\n\t" +#else + "strd r8, r9, [r0, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [r2, #16]\n\t" + "ldr r5, [r2, #20]\n\t" +#else + "ldrd r4, r5, [r2, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [r3, #16]\n\t" + "ldr r7, [r3, #20]\n\t" +#else + "ldrd r6, r7, [r3, #16]\n\t" +#endif + /* Add */ + "adcs r8, r4, r6\n\t" + "mov r12, #0\n\t" + "adcs r9, r5, r7\n\t" + "adc r12, r12, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [r0, #16]\n\t" + "str r9, [r0, #20]\n\t" +#else + "strd r8, r9, [r0, #16]\n\t" +#endif + /* Sub */ + "subs lr, lr, #1\n\t" + "sbcs r10, r4, r6\n\t" + "sbcs r11, r5, r7\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [r1, #16]\n\t" + "str r11, [r1, #20]\n\t" +#else + "strd r10, r11, [r1, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [r2, #24]\n\t" + "ldr r5, [r2, #28]\n\t" +#else + "ldrd r4, r5, [r2, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [r3, #24]\n\t" + "ldr r7, [r3, #28]\n\t" +#else + "ldrd r6, r7, [r3, #24]\n\t" +#endif + /* Sub */ + "sbcs r10, r4, r6\n\t" + "sbcs r11, r5, r7\n\t" + "sbc lr, lr, lr\n\t" + /* Add */ + "subs r12, r12, #1\n\t" + "adcs r8, r4, r6\n\t" + "mov r12, #0\n\t" + "adcs r9, r5, r7\n\t" + "adc r12, r12, #0\n\t" + /* Multiply -modulus by overflow */ + "lsl r3, r12, #1\n\t" + "mov r12, #19\n\t" + "orr r3, r3, r9, lsr #31\n\t" + "mul r12, r3, r12\n\t" + /* Add -x*modulus (if overflow) */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [r0]\n\t" + "ldr r5, [r0, #4]\n\t" +#else + "ldrd r4, r5, [r0]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [r0, #8]\n\t" + "ldr r7, [r0, #12]\n\t" +#else + "ldrd r6, r7, [r0, #8]\n\t" +#endif + "adds r4, r4, r12\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [r0]\n\t" + "str r5, [r0, #4]\n\t" +#else + "strd r4, r5, [r0]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [r0, #8]\n\t" + "str r7, [r0, #12]\n\t" +#else + "strd r6, r7, [r0, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [r0, #16]\n\t" + "ldr r5, [r0, #20]\n\t" +#else + "ldrd r4, r5, [r0, #16]\n\t" +#endif + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [r0, #16]\n\t" + "str r5, [r0, #20]\n\t" +#else + "strd r4, r5, [r0, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0x80000000\n\t" +#else + "bfc r9, #31, #1\n\t" +#endif + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [r0, #24]\n\t" + "str r9, [r0, #28]\n\t" +#else + "strd r8, r9, [r0, #24]\n\t" +#endif + /* Multiply -modulus by underflow */ + "lsl r3, lr, #1\n\t" + "mvn lr, #18\n\t" + "orr r3, r3, r11, lsr #31\n\t" + "mul lr, r3, lr\n\t" + /* Sub -x*modulus (if overflow) */ + "ldm r1, {r4, r5, r6, r7, r8, r9}\n\t" + "subs r4, r4, lr\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0x80000000\n\t" +#else + "bfc r11, #31, #1\n\t" +#endif + "sbcs r10, r10, #0\n\t" + "sbc r11, r11, #0\n\t" + "stm r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Add-Sub */ + : + : + : "memory", "lr", "cc" + ); +} + +void fe_sub_op(void); +void fe_sub_op() +{ + __asm__ __volatile__ ( + /* Sub */ + "ldm r2!, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + "ldm r1!, {r2, r3, r4, r5}\n\t" + "subs r6, r2, r6\n\t" + "sbcs r7, r3, r7\n\t" + "sbcs r8, r4, r8\n\t" + "sbcs r9, r5, r9\n\t" + "ldm r1!, {r2, r3, r4, r5}\n\t" + "sbcs r10, r2, r10\n\t" + "sbcs r11, r3, r11\n\t" + "sbcs r12, r4, r12\n\t" + "sbcs lr, r5, lr\n\t" + "sbc r3, r3, r3\n\t" + "mvn r2, #18\n\t" + "lsl r3, r3, #1\n\t" + "orr r3, r3, lr, lsr #31\n\t" + "mul r2, r3, r2\n\t" + "subs r6, r6, r2\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, #0\n\t" + "sbcs r11, r11, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic lr, lr, #0x80000000\n\t" +#else + "bfc lr, #31, #1\n\t" +#endif + "sbcs r12, r12, #0\n\t" + "sbc lr, lr, #0\n\t" + "stm r0, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + /* Done Sub */ + : + : + : "memory", "lr", "cc" + ); +} + +void fe_sub(fe r_p, const fe a_p, const fe b_p) +{ + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; + register const sword32* b asm ("r2") = (const sword32*)b_p; + + __asm__ __volatile__ ( + "bl fe_sub_op\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +void fe_add_op(void); +void fe_add_op() +{ + __asm__ __volatile__ ( + /* Add */ + "ldm r2!, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + "ldm r1!, {r2, r3, r4, r5}\n\t" + "adds r6, r2, r6\n\t" + "adcs r7, r3, r7\n\t" + "adcs r8, r4, r8\n\t" + "adcs r9, r5, r9\n\t" + "ldm r1!, {r2, r3, r4, r5}\n\t" + "adcs r10, r2, r10\n\t" + "adcs r11, r3, r11\n\t" + "adcs r12, r4, r12\n\t" + "mov r3, #0\n\t" + "adcs lr, r5, lr\n\t" + "adc r3, r3, #0\n\t" + "mov r2, #19\n\t" + "lsl r3, r3, #1\n\t" + "orr r3, r3, lr, lsr #31\n\t" + "mul r2, r3, r2\n\t" + "adds r6, r6, r2\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, #0\n\t" + "adcs r10, r10, #0\n\t" + "adcs r11, r11, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic lr, lr, #0x80000000\n\t" +#else + "bfc lr, #31, #1\n\t" +#endif + "adcs r12, r12, #0\n\t" + "adc lr, lr, #0\n\t" + "stm r0, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + /* Done Add */ + : + : + : "memory", "lr", "cc" ); } +void fe_add(fe r_p, const fe a_p, const fe b_p) +{ + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; + register const sword32* b asm ("r2") = (const sword32*)b_p; + + __asm__ __volatile__ ( + "bl fe_add_op\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifdef HAVE_ED25519 void fe_frombytes(fe out_p, const unsigned char* in_p) { - register fe out asm ("r0") = out_p; - register const unsigned char* in asm ("r1") = in_p; + register sword32* out asm ("r0") = (sword32*)out_p; + register const unsigned char* in asm ("r1") = (const unsigned char*)in_p; __asm__ __volatile__ ( "ldr r2, [%[in]]\n\t" @@ -65,67 +414,32 @@ "ldr r7, [%[in], #20]\n\t" "ldr r8, [%[in], #24]\n\t" "ldr r9, [%[in], #28]\n\t" - "and r9, r9, #0x7fffffff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[out]]\n\t" - "str r3, [%[out], #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0x80000000\n\t" #else - "strd r2, r3, [%[out]]\n\t" + "bfc r9, #31, #1\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + "str r2, [%[out]]\n\t" + "str r3, [%[out], #4]\n\t" "str r4, [%[out], #8]\n\t" "str r5, [%[out], #12]\n\t" -#else - "strd r4, r5, [%[out], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "str r6, [%[out], #16]\n\t" "str r7, [%[out], #20]\n\t" -#else - "strd r6, r7, [%[out], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "str r8, [%[out], #24]\n\t" "str r9, [%[out], #28]\n\t" -#else - "strd r8, r9, [%[out], #24]\n\t" -#endif : [out] "+r" (out), [in] "+r" (in) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } void fe_tobytes(unsigned char* out_p, const fe n_p) { - register unsigned char* out asm ("r0") = out_p; - register const fe n asm ("r1") = n_p; + register unsigned char* out asm ("r0") = (unsigned char*)out_p; + register const sword32* n asm ("r1") = (const sword32*)n_p; __asm__ __volatile__ ( -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r2, [%[n]]\n\t" - "ldr r3, [%[n], #4]\n\t" -#else - "ldrd r2, r3, [%[n]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[n], #8]\n\t" - "ldr r5, [%[n], #12]\n\t" -#else - "ldrd r4, r5, [%[n], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[n], #16]\n\t" - "ldr r7, [%[n], #20]\n\t" -#else - "ldrd r6, r7, [%[n], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[n], #24]\n\t" - "ldr r9, [%[n], #28]\n\t" -#else - "ldrd r8, r9, [%[n], #24]\n\t" -#endif + "ldm %[n], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" "adds r12, r2, #19\n\t" "adcs r12, r3, #0\n\t" "adcs r12, r4, #0\n\t" @@ -144,164 +458,117 @@ "adcs r7, r7, #0\n\t" "adcs r8, r8, #0\n\t" "adc r9, r9, #0\n\t" - "and r9, r9, #0x7fffffff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[out]]\n\t" - "str r3, [%[out], #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0x80000000\n\t" #else - "strd r2, r3, [%[out]]\n\t" + "bfc r9, #31, #1\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + "str r2, [%[out]]\n\t" + "str r3, [%[out], #4]\n\t" "str r4, [%[out], #8]\n\t" "str r5, [%[out], #12]\n\t" -#else - "strd r4, r5, [%[out], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "str r6, [%[out], #16]\n\t" "str r7, [%[out], #20]\n\t" -#else - "strd r6, r7, [%[out], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "str r8, [%[out], #24]\n\t" "str r9, [%[out], #28]\n\t" -#else - "strd r8, r9, [%[out], #24]\n\t" -#endif : [out] "+r" (out), [n] "+r" (n) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "cc" ); } void fe_1(fe n_p) { - register fe n asm ("r0") = n_p; + register sword32* n asm ("r0") = (sword32*)n_p; __asm__ __volatile__ ( /* Set one */ "mov r2, #1\n\t" "mov r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n]]\n\t" - "str r3, [%[n], #4]\n\t" -#else - "strd r2, r3, [%[n]]\n\t" -#endif - "mov r2, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n], #8]\n\t" - "str r3, [%[n], #12]\n\t" -#else - "strd r2, r3, [%[n], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n], #16]\n\t" - "str r3, [%[n], #20]\n\t" -#else - "strd r2, r3, [%[n], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n], #24]\n\t" - "str r3, [%[n], #28]\n\t" -#else - "strd r2, r3, [%[n], #24]\n\t" -#endif + "mov r4, #0\n\t" + "mov r5, #0\n\t" + "mov r6, #0\n\t" + "mov r7, #0\n\t" + "mov r8, #0\n\t" + "mov r9, #0\n\t" + "stm %[n], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" : [n] "+r" (n) : - : "memory", "r2", "r3" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } void fe_0(fe n_p) { - register fe n asm ("r0") = n_p; + register sword32* n asm ("r0") = (sword32*)n_p; __asm__ __volatile__ ( /* Set zero */ "mov r2, #0\n\t" "mov r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n]]\n\t" - "str r3, [%[n], #4]\n\t" -#else - "strd r2, r3, [%[n]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n], #8]\n\t" - "str r3, [%[n], #12]\n\t" -#else - "strd r2, r3, [%[n], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n], #16]\n\t" - "str r3, [%[n], #20]\n\t" -#else - "strd r2, r3, [%[n], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[n], #24]\n\t" - "str r3, [%[n], #28]\n\t" -#else - "strd r2, r3, [%[n], #24]\n\t" -#endif + "mov r4, #0\n\t" + "mov r5, #0\n\t" + "mov r6, #0\n\t" + "mov r7, #0\n\t" + "mov r8, #0\n\t" + "mov r9, #0\n\t" + "stm %[n], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" : [n] "+r" (n) : - : "memory", "r2", "r3" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } void fe_copy(fe r_p, const fe a_p) { - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; __asm__ __volatile__ ( /* Copy */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r2, [%[a]]\n\t" "ldr r3, [%[a], #4]\n\t" #else "ldrd r2, r3, [%[a]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[a], #8]\n\t" "ldr r5, [%[a], #12]\n\t" #else "ldrd r4, r5, [%[a], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r2, [%[r]]\n\t" "str r3, [%[r], #4]\n\t" #else "strd r2, r3, [%[r]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[r], #8]\n\t" "str r5, [%[r], #12]\n\t" #else "strd r4, r5, [%[r], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r2, [%[a], #16]\n\t" "ldr r3, [%[a], #20]\n\t" #else "ldrd r2, r3, [%[a], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[a], #24]\n\t" "ldr r5, [%[a], #28]\n\t" #else "ldrd r4, r5, [%[a], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r2, [%[r], #16]\n\t" "str r3, [%[r], #20]\n\t" #else "strd r2, r3, [%[r], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[r], #24]\n\t" "str r5, [%[r], #28]\n\t" #else @@ -309,380 +576,43 @@ #endif : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5" - ); -} - -void fe_sub(fe r_p, const fe a_p, const fe b_p) -{ - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; - register const fe b asm ("r2") = b_p; - - __asm__ __volatile__ ( - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[a], #4]\n\t" -#else - "ldrd r4, r5, [%[a]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #8]\n\t" - "ldr r7, [%[a], #12]\n\t" -#else - "ldrd r6, r7, [%[a], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[b]]\n\t" - "ldr r9, [%[b], #4]\n\t" -#else - "ldrd r8, r9, [%[b]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [%[b], #8]\n\t" - "ldr r11, [%[b], #12]\n\t" -#else - "ldrd r10, r11, [%[b], #8]\n\t" -#endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r]]\n\t" - "str r9, [%[r], #4]\n\t" -#else - "strd r8, r9, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #8]\n\t" - "str r11, [%[r], #12]\n\t" -#else - "strd r10, r11, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #20]\n\t" -#else - "ldrd r4, r5, [%[a], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #24]\n\t" - "ldr r7, [%[a], #28]\n\t" -#else - "ldrd r6, r7, [%[a], #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[b], #16]\n\t" - "ldr r9, [%[b], #20]\n\t" -#else - "ldrd r8, r9, [%[b], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [%[b], #24]\n\t" - "ldr r11, [%[b], #28]\n\t" -#else - "ldrd r10, r11, [%[b], #24]\n\t" -#endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr r3, r11, #31\n\t" - /* Mask the modulus */ - "and r12, r3, r12\n\t" - "and lr, r3, #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r]]\n\t" - "ldr r5, [%[r], #4]\n\t" -#else - "ldrd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[r], #8]\n\t" - "ldr r7, [%[r], #12]\n\t" -#else - "ldrd r6, r7, [%[r], #8]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, r3\n\t" - "adcs r6, r6, r3\n\t" - "adcs r7, r7, r3\n\t" - "adcs r8, r8, r3\n\t" - "adcs r9, r9, r3\n\t" - "adcs r10, r10, r3\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r]]\n\t" - "str r5, [%[r], #4]\n\t" -#else - "strd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" -#else - "strd r6, r7, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" -#else - "strd r8, r9, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" -#else - "strd r10, r11, [%[r], #24]\n\t" -#endif - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" - ); -} - -void fe_add(fe r_p, const fe a_p, const fe b_p) -{ - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; - register const fe b asm ("r2") = b_p; - - __asm__ __volatile__ ( - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[a], #4]\n\t" -#else - "ldrd r4, r5, [%[a]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #8]\n\t" - "ldr r7, [%[a], #12]\n\t" -#else - "ldrd r6, r7, [%[a], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[b]]\n\t" - "ldr r9, [%[b], #4]\n\t" -#else - "ldrd r8, r9, [%[b]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [%[b], #8]\n\t" - "ldr r11, [%[b], #12]\n\t" -#else - "ldrd r10, r11, [%[b], #8]\n\t" -#endif - "adds r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r]]\n\t" - "str r9, [%[r], #4]\n\t" -#else - "strd r8, r9, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #8]\n\t" - "str r11, [%[r], #12]\n\t" -#else - "strd r10, r11, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #20]\n\t" -#else - "ldrd r4, r5, [%[a], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #24]\n\t" - "ldr r7, [%[a], #28]\n\t" -#else - "ldrd r6, r7, [%[a], #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[b], #16]\n\t" - "ldr r9, [%[b], #20]\n\t" -#else - "ldrd r8, r9, [%[b], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [%[b], #24]\n\t" - "ldr r11, [%[b], #28]\n\t" -#else - "ldrd r10, r11, [%[b], #24]\n\t" -#endif - "adcs r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr r3, r11, #31\n\t" - /* Mask the modulus */ - "and r12, r3, r12\n\t" - "and lr, r3, #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r]]\n\t" - "ldr r5, [%[r], #4]\n\t" -#else - "ldrd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[r], #8]\n\t" - "ldr r7, [%[r], #12]\n\t" -#else - "ldrd r6, r7, [%[r], #8]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, r3\n\t" - "sbcs r6, r6, r3\n\t" - "sbcs r7, r7, r3\n\t" - "sbcs r8, r8, r3\n\t" - "sbcs r9, r9, r3\n\t" - "sbcs r10, r10, r3\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r]]\n\t" - "str r5, [%[r], #4]\n\t" -#else - "strd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" -#else - "strd r6, r7, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" -#else - "strd r8, r9, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" -#else - "strd r10, r11, [%[r], #24]\n\t" -#endif - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r2", "r3", "r4", "r5", "cc" ); } void fe_neg(fe r_p, const fe a_p) { - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; __asm__ __volatile__ ( - "mov lr, #-1\n\t" - "mov r12, #-19\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r2, [%[a]]\n\t" - "ldr r3, [%[a], #4]\n\t" -#else - "ldrd r2, r3, [%[a]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[a], #12]\n\t" -#else - "ldrd r4, r5, [%[a], #8]\n\t" -#endif + "mvn lr, #0\n\t" + "mvn r12, #18\n\t" + "ldm %[a]!, {r2, r3, r4, r5}\n\t" "subs r2, r12, r2\n\t" "sbcs r3, lr, r3\n\t" "sbcs r4, lr, r4\n\t" "sbcs r5, lr, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[r]]\n\t" - "str r3, [%[r], #4]\n\t" -#else - "strd r2, r3, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #12]\n\t" -#else - "strd r4, r5, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "mov r12, #0x7fffff\n\t" - "lsl r12, r12, #8\n\t" - "add r12, r12, #0xff\n\t" -#else - "mov r12, #0x7fffffff\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r2, [%[a], #16]\n\t" - "ldr r3, [%[a], #20]\n\t" -#else - "ldrd r2, r3, [%[a], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #24]\n\t" - "ldr r5, [%[a], #28]\n\t" -#else - "ldrd r4, r5, [%[a], #24]\n\t" -#endif + "stm %[r]!, {r2, r3, r4, r5}\n\t" + "mvn r12, #0x80000000\n\t" + "ldm %[a]!, {r2, r3, r4, r5}\n\t" "sbcs r2, lr, r2\n\t" "sbcs r3, lr, r3\n\t" "sbcs r4, lr, r4\n\t" "sbc r5, r12, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[r], #16]\n\t" - "str r3, [%[r], #20]\n\t" -#else - "strd r2, r3, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #24]\n\t" - "str r5, [%[r], #28]\n\t" -#else - "strd r4, r5, [%[r], #24]\n\t" -#endif + "stm %[r]!, {r2, r3, r4, r5}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r12", "lr" + : "memory", "r2", "r3", "r4", "r5", "r12", "lr", "cc" ); } int fe_isnonzero(const fe a_p) { - register const fe a asm ("r0") = a_p; + register const sword32* a asm ("r0") = (const sword32*)a_p; __asm__ __volatile__ ( -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r2, [%[a]]\n\t" - "ldr r3, [%[a], #4]\n\t" -#else - "ldrd r2, r3, [%[a]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[a], #12]\n\t" -#else - "ldrd r4, r5, [%[a], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #16]\n\t" - "ldr r7, [%[a], #20]\n\t" -#else - "ldrd r6, r7, [%[a], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[a], #28]\n\t" -#else - "ldrd r8, r9, [%[a], #24]\n\t" -#endif + "ldm %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" "adds r1, r2, #19\n\t" "adcs r1, r3, #0\n\t" "adcs r1, r4, #0\n\t" @@ -701,7 +631,11 @@ "adcs r7, r7, #0\n\t" "adcs r8, r8, #0\n\t" "adc r9, r9, #0\n\t" - "and r9, r9, #0x7fffffff\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0x80000000\n\t" +#else + "bfc r9, #31, #1\n\t" +#endif "orr r2, r2, r3\n\t" "orr r4, r4, r5\n\t" "orr r6, r6, r7\n\t" @@ -711,68 +645,58 @@ "orr %[a], r2, r4\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12" + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "cc" ); return (uint32_t)(size_t)a; } int fe_isnegative(const fe a_p) { - register const fe a asm ("r0") = a_p; + register const sword32* a asm ("r0") = (const sword32*)a_p; __asm__ __volatile__ ( -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r2, [%[a]]\n\t" - "ldr r3, [%[a], #4]\n\t" -#else - "ldrd r2, r3, [%[a]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[a], #12]\n\t" -#else - "ldrd r4, r5, [%[a], #8]\n\t" -#endif + "ldm %[a]!, {r2, r3, r4, r5}\n\t" "adds r1, r2, #19\n\t" "adcs r1, r3, #0\n\t" "adcs r1, r4, #0\n\t" "adcs r1, r5, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r2, [%[a], #16]\n\t" - "ldr r3, [%[a], #20]\n\t" -#else - "ldrd r2, r3, [%[a], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #24]\n\t" - "ldr r5, [%[a], #28]\n\t" -#else - "ldrd r4, r5, [%[a], #24]\n\t" -#endif + "ldm %[a], {r2, r3, r4, r5}\n\t" "adcs r1, r2, #0\n\t" "adcs r1, r3, #0\n\t" "adcs r1, r4, #0\n\t" - "ldr r2, [%[a]]\n\t" + "ldr r2, [%[a], #-16]\n\t" "adc r1, r5, #0\n\t" "and %[a], r2, #1\n\t" "lsr r1, r1, #31\n\t" "eor %[a], %[a], r1\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r4", "r5" + : "memory", "r1", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } +#if defined(HAVE_ED25519_MAKE_KEY) || defined(HAVE_ED25519_SIGN) +#ifndef WC_NO_CACHE_RESISTANT void fe_cmov_table(fe* r_p, fe* base_p, signed char b_p) { - register fe* r asm ("r0") = r_p; - register fe* base asm ("r1") = base_p; - register signed char b asm ("r2") = b_p; + register fe* r asm ("r0") = (fe*)r_p; + register fe* base asm ("r1") = (fe*)base_p; + register signed char b asm ("r2") = (signed char)b_p; __asm__ __volatile__ ( +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl %[b], %[b], #24\n\t" + "asr %[b], %[b], #24\n\t" +#else "sxtb %[b], %[b]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "lsl r3, %[b], #24\n\t" + "asr r3, %[b], #31\n\t" +#else "sbfx r3, %[b], #7, #1\n\t" +#endif "eor r12, %[b], r3\n\t" "sub r12, r12, r3\n\t" "mov r4, #1\n\t" @@ -781,7 +705,7 @@ "mov r7, #0\n\t" "mov r8, #0\n\t" "mov r9, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -791,7 +715,7 @@ "ror r3, r3, #31\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -803,7 +727,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -815,7 +739,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -828,7 +752,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -838,7 +762,7 @@ "ror r3, r3, #30\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -850,7 +774,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -862,7 +786,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -875,7 +799,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -885,7 +809,7 @@ "ror r3, r3, #29\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -897,7 +821,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -909,7 +833,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -922,7 +846,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -932,7 +856,7 @@ "ror r3, r3, #28\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -944,7 +868,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -956,7 +880,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -969,7 +893,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -979,7 +903,7 @@ "ror r3, r3, #27\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -991,7 +915,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -1003,7 +927,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -1016,7 +940,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1026,7 +950,7 @@ "ror r3, r3, #26\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -1038,7 +962,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -1050,7 +974,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -1063,7 +987,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1073,7 +997,7 @@ "ror r3, r3, #25\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -1085,7 +1009,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -1097,7 +1021,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -1110,7 +1034,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1120,7 +1044,7 @@ "ror r3, r3, #24\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base]]\n\t" "ldr r11, [%[base], #4]\n\t" #else @@ -1132,7 +1056,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #32]\n\t" "ldr r11, [%[base], #36]\n\t" #else @@ -1144,7 +1068,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #64]\n\t" "ldr r11, [%[base], #68]\n\t" #else @@ -1157,8 +1081,8 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "sub %[base], %[base], #0x2a0\n\t" - "mov r10, #-19\n\t" - "mov r11, #-1\n\t" + "mvn r10, #18\n\t" + "mvn r11, #0\n\t" "subs r10, r10, r8\n\t" "sbcs r11, r11, r9\n\t" "sbc lr, lr, lr\n\t" @@ -1177,25 +1101,30 @@ "eor r11, r11, r9\n\t" "and r11, r11, r12\n\t" "eor r9, r9, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[r]]\n\t" "str r5, [%[r], #4]\n\t" #else "strd r4, r5, [%[r]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[r], #32]\n\t" "str r7, [%[r], #36]\n\t" #else "strd r6, r7, [%[r], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #64]\n\t" "str r9, [%[r], #68]\n\t" #else "strd r8, r9, [%[r], #64]\n\t" #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "lsl r3, %[b], #24\n\t" + "asr r3, %[b], #31\n\t" +#else "sbfx r3, %[b], #7, #1\n\t" +#endif "eor r12, %[b], r3\n\t" "sub r12, r12, r3\n\t" "mov r4, #0\n\t" @@ -1204,7 +1133,7 @@ "mov r7, #0\n\t" "mov r8, #0\n\t" "mov r9, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1214,7 +1143,7 @@ "ror r3, r3, #31\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1226,7 +1155,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1238,7 +1167,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1251,7 +1180,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1261,7 +1190,7 @@ "ror r3, r3, #30\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1273,7 +1202,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1285,7 +1214,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1298,7 +1227,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1308,7 +1237,7 @@ "ror r3, r3, #29\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1320,7 +1249,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1332,7 +1261,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1345,7 +1274,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1355,7 +1284,7 @@ "ror r3, r3, #28\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1367,7 +1296,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1379,7 +1308,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1392,7 +1321,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1402,7 +1331,7 @@ "ror r3, r3, #27\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1414,7 +1343,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1426,7 +1355,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1439,7 +1368,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1449,7 +1378,7 @@ "ror r3, r3, #26\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1461,7 +1390,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1473,7 +1402,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1486,7 +1415,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1496,7 +1425,7 @@ "ror r3, r3, #25\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1508,7 +1437,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1520,7 +1449,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1533,7 +1462,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1543,7 +1472,7 @@ "ror r3, r3, #24\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #8]\n\t" "ldr r11, [%[base], #12]\n\t" #else @@ -1555,7 +1484,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #40]\n\t" "ldr r11, [%[base], #44]\n\t" #else @@ -1567,7 +1496,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #72]\n\t" "ldr r11, [%[base], #76]\n\t" #else @@ -1580,8 +1509,8 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "sub %[base], %[base], #0x2a0\n\t" - "mov r10, #-1\n\t" - "mov r11, #-1\n\t" + "mvn r10, #0\n\t" + "mvn r11, #0\n\t" "rsbs lr, lr, #0\n\t" "sbcs r10, r10, r8\n\t" "sbcs r11, r11, r9\n\t" @@ -1601,25 +1530,30 @@ "eor r11, r11, r9\n\t" "and r11, r11, r12\n\t" "eor r9, r9, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[r], #8]\n\t" "str r5, [%[r], #12]\n\t" #else "strd r4, r5, [%[r], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[r], #40]\n\t" "str r7, [%[r], #44]\n\t" #else "strd r6, r7, [%[r], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #72]\n\t" "str r9, [%[r], #76]\n\t" #else "strd r8, r9, [%[r], #72]\n\t" #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "lsl r3, %[b], #24\n\t" + "asr r3, %[b], #31\n\t" +#else "sbfx r3, %[b], #7, #1\n\t" +#endif "eor r12, %[b], r3\n\t" "sub r12, r12, r3\n\t" "mov r4, #0\n\t" @@ -1628,7 +1562,7 @@ "mov r7, #0\n\t" "mov r8, #0\n\t" "mov r9, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1638,7 +1572,7 @@ "ror r3, r3, #31\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1650,7 +1584,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1662,7 +1596,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -1675,7 +1609,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1685,7 +1619,7 @@ "ror r3, r3, #30\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1697,7 +1631,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1709,7 +1643,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -1722,7 +1656,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1732,7 +1666,7 @@ "ror r3, r3, #29\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1744,7 +1678,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1756,7 +1690,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -1769,7 +1703,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1779,7 +1713,7 @@ "ror r3, r3, #28\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1791,7 +1725,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1803,7 +1737,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -1816,7 +1750,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1826,7 +1760,7 @@ "ror r3, r3, #27\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1838,7 +1772,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1850,7 +1784,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -1863,7 +1797,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1873,7 +1807,7 @@ "ror r3, r3, #26\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1885,7 +1819,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1897,7 +1831,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -1910,7 +1844,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1920,7 +1854,7 @@ "ror r3, r3, #25\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1932,7 +1866,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1944,7 +1878,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -1957,7 +1891,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -1967,7 +1901,7 @@ "ror r3, r3, #24\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #16]\n\t" "ldr r11, [%[base], #20]\n\t" #else @@ -1979,7 +1913,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #48]\n\t" "ldr r11, [%[base], #52]\n\t" #else @@ -1991,7 +1925,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #80]\n\t" "ldr r11, [%[base], #84]\n\t" #else @@ -2004,8 +1938,8 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "sub %[base], %[base], #0x2a0\n\t" - "mov r10, #-1\n\t" - "mov r11, #-1\n\t" + "mvn r10, #0\n\t" + "mvn r11, #0\n\t" "rsbs lr, lr, #0\n\t" "sbcs r10, r10, r8\n\t" "sbcs r11, r11, r9\n\t" @@ -2025,25 +1959,30 @@ "eor r11, r11, r9\n\t" "and r11, r11, r12\n\t" "eor r9, r9, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[r], #16]\n\t" "str r5, [%[r], #20]\n\t" #else "strd r4, r5, [%[r], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[r], #48]\n\t" "str r7, [%[r], #52]\n\t" #else "strd r6, r7, [%[r], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #80]\n\t" "str r9, [%[r], #84]\n\t" #else "strd r8, r9, [%[r], #80]\n\t" #endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "lsl r3, %[b], #24\n\t" + "asr r3, %[b], #31\n\t" +#else "sbfx r3, %[b], #7, #1\n\t" +#endif "eor r12, %[b], r3\n\t" "sub r12, r12, r3\n\t" "mov r4, #0\n\t" @@ -2052,7 +1991,7 @@ "mov r7, #0\n\t" "mov r8, #0\n\t" "mov r9, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2062,7 +2001,7 @@ "ror r3, r3, #31\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2074,7 +2013,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2086,7 +2025,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2099,7 +2038,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2109,7 +2048,7 @@ "ror r3, r3, #30\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2121,7 +2060,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2133,7 +2072,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2146,7 +2085,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2156,7 +2095,7 @@ "ror r3, r3, #29\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2168,7 +2107,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2180,7 +2119,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2193,7 +2132,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2203,7 +2142,7 @@ "ror r3, r3, #28\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2215,7 +2154,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2227,7 +2166,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2240,7 +2179,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2250,7 +2189,7 @@ "ror r3, r3, #27\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2262,7 +2201,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2274,7 +2213,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2287,7 +2226,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2297,7 +2236,7 @@ "ror r3, r3, #26\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2309,7 +2248,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2321,7 +2260,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2334,7 +2273,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2344,7 +2283,7 @@ "ror r3, r3, #25\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2356,7 +2295,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2368,7 +2307,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2381,7 +2320,7 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "add %[base], %[base], #0x60\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x800000\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0x0\n\t" @@ -2391,7 +2330,7 @@ "ror r3, r3, #24\n\t" "ror r3, r3, r12\n\t" "asr r3, r3, #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #24]\n\t" "ldr r11, [%[base], #28]\n\t" #else @@ -2403,7 +2342,7 @@ "and r11, r11, r3\n\t" "eor r4, r4, r10\n\t" "eor r5, r5, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #56]\n\t" "ldr r11, [%[base], #60]\n\t" #else @@ -2415,7 +2354,7 @@ "and r11, r11, r3\n\t" "eor r6, r6, r10\n\t" "eor r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[base], #88]\n\t" "ldr r11, [%[base], #92]\n\t" #else @@ -2428,14 +2367,8 @@ "eor r8, r8, r10\n\t" "eor r9, r9, r11\n\t" "sub %[base], %[base], #0x2a0\n\t" - "mov r10, #-1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "mov r11, #0x7fffff\n\t" - "lsl r11, r11, #8\n\t" - "add r11, r11, #0xff\n\t" -#else - "mov r11, #0x7fffffff\n\t" -#endif + "mvn r10, #0\n\t" + "mvn r11, #0x80000000\n\t" "rsbs lr, lr, #0\n\t" "sbcs r10, r10, r8\n\t" "sbc r11, r11, r9\n\t" @@ -2454,19 +2387,19 @@ "eor r11, r11, r9\n\t" "and r11, r11, r12\n\t" "eor r9, r9, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[r], #24]\n\t" "str r5, [%[r], #28]\n\t" #else "strd r4, r5, [%[r], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[r], #56]\n\t" "str r7, [%[r], #60]\n\t" #else "strd r6, r7, [%[r], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #88]\n\t" "str r9, [%[r], #92]\n\t" #else @@ -2474,1794 +2407,1232 @@ #endif : [r] "+r" (r), [base] "+r" (base), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r3", "r10", "r11", "r12", "lr" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r3", "r10", "r11", "r12", "lr", "cc" ); } -void fe_mul(fe r_p, const fe a_p, const fe b_p) +#else +void fe_cmov_table(fe* r_p, fe* base_p, signed char b_p) { - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; - register const fe b asm ("r2") = b_p; + register fe* r asm ("r0") = (fe*)r_p; + register fe* base asm ("r1") = (fe*)base_p; + register signed char b asm ("r2") = (signed char)b_p; __asm__ __volatile__ ( - "sub sp, sp, #0x40\n\t" - /* Multiply */ - "ldr r7, [%[a]]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[b]]\n\t" - "ldr lr, [%[b], #4]\n\t" - /* A[0] * B[0] = 0 */ - "umull r4, r5, r7, r9\n\t" - "str r4, [sp]\n\t" - /* A[0] * B[1] = 1 */ - "umull r3, r6, r7, lr\n\t" - "adds r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[1] * B[0] = 1 */ - "umull r3, r12, r8, r9\n\t" - "adds r5, r5, r3\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #4]\n\t" - /* A[2] * B[0] = 2 */ - "ldr r10, [%[a], #8]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r6, r6, r3\n\t" - "adc r4, r4, r12\n\t" - /* A[1] * B[1] = 2 */ - "umull r3, r12, r8, lr\n\t" - "adds r6, r6, r3\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[0] * B[2] = 2 */ - "ldr r11, [%[b], #8]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #8]\n\t" - /* A[0] * B[3] = 3 */ - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r4, r4, r3\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[1] * B[2] = 3 */ - "ldr r11, [%[b], #8]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[2] * B[1] = 3 */ - "umull r3, r12, r10, lr\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[3] * B[0] = 3 */ - "ldr r10, [%[a], #12]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #12]\n\t" - /* A[4] * B[0] = 4 */ - "ldr r10, [%[a], #16]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r5, r5, r3\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[1] = 4 */ - "ldr r10, [%[a], #12]\n\t" - "umull r3, r12, r10, lr\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[2] = 4 */ - "ldr r10, [%[a], #8]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * B[3] = 4 */ - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[0] * B[4] = 4 */ - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #16]\n\t" - /* A[0] * B[5] = 5 */ - "ldr r11, [%[b], #20]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r6, r6, r3\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * B[4] = 5 */ - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[3] = 5 */ - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[2] = 5 */ - "ldr r10, [%[a], #12]\n\t" - "ldr r11, [%[b], #8]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[1] = 5 */ - "ldr r10, [%[a], #16]\n\t" - "umull r3, r12, r10, lr\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[0] = 5 */ - "ldr r10, [%[a], #20]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #20]\n\t" - /* A[6] * B[0] = 6 */ - "ldr r10, [%[a], #24]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r4, r4, r3\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[5] * B[1] = 6 */ - "ldr r10, [%[a], #20]\n\t" - "umull r3, r12, r10, lr\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[4] * B[2] = 6 */ - "ldr r10, [%[a], #16]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[3] * B[3] = 6 */ - "ldr r10, [%[a], #12]\n\t" - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[2] * B[4] = 6 */ - "ldr r10, [%[a], #8]\n\t" - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[1] * B[5] = 6 */ - "ldr r11, [%[b], #20]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[0] * B[6] = 6 */ - "ldr r11, [%[b], #24]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #24]\n\t" - /* A[0] * B[7] = 7 */ - "ldr r11, [%[b], #28]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r5, r5, r3\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * B[6] = 7 */ - "ldr r11, [%[b], #24]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[5] = 7 */ - "ldr r11, [%[b], #20]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[4] = 7 */ - "ldr r10, [%[a], #12]\n\t" - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[3] = 7 */ - "ldr r10, [%[a], #16]\n\t" - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[2] = 7 */ - "ldr r10, [%[a], #20]\n\t" - "ldr r11, [%[b], #8]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[1] = 7 */ - "ldr r10, [%[a], #24]\n\t" - "umull r3, r12, r10, lr\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[0] = 7 */ - "ldr r10, [%[a], #28]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #28]\n\t" - "ldr r7, [%[a], #24]\n\t" - "ldr r9, [%[b], #24]\n\t" - /* A[7] * B[1] = 8 */ - "umull r3, r12, r10, lr\n\t" - "adds r6, r6, r3\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[2] = 8 */ - "umull r3, r12, r7, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[3] = 8 */ - "ldr r10, [%[a], #20]\n\t" - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[4] = 8 */ - "ldr r10, [%[a], #16]\n\t" - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[5] = 8 */ - "ldr r10, [%[a], #12]\n\t" - "ldr r11, [%[b], #20]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[6] = 8 */ - "ldr r10, [%[a], #8]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * B[7] = 8 */ - "ldr r11, [%[b], #28]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #32]\n\t" - "ldr r8, [%[a], #28]\n\t" - "mov lr, r11\n\t" - /* A[2] * B[7] = 9 */ - "umull r3, r12, r10, lr\n\t" - "adds r4, r4, r3\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[3] * B[6] = 9 */ - "ldr r10, [%[a], #12]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[4] * B[5] = 9 */ - "ldr r10, [%[a], #16]\n\t" - "ldr r11, [%[b], #20]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[5] * B[4] = 9 */ - "ldr r10, [%[a], #20]\n\t" - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[6] * B[3] = 9 */ - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[7] * B[2] = 9 */ - "ldr r11, [%[b], #8]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #36]\n\t" - /* A[7] * B[3] = 10 */ - "ldr r11, [%[b], #12]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r5, r5, r3\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[4] = 10 */ - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r7, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[5] = 10 */ - "ldr r11, [%[b], #20]\n\t" - "umull r3, r12, r10, r11\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[6] = 10 */ - "ldr r10, [%[a], #16]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[7] = 10 */ - "ldr r10, [%[a], #12]\n\t" - "umull r3, r12, r10, lr\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #40]\n\t" - /* A[4] * B[7] = 11 */ - "ldr r10, [%[a], #16]\n\t" - "umull r3, r12, r10, lr\n\t" - "adds r6, r6, r3\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[6] = 11 */ - "ldr r10, [%[a], #20]\n\t" - "umull r3, r12, r10, r9\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[5] = 11 */ - "umull r3, r12, r7, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - /* A[7] * B[4] = 11 */ - "ldr r11, [%[b], #16]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r6, r6, r3\n\t" - "adcs r4, r4, r12\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #44]\n\t" - /* A[7] * B[5] = 12 */ - "ldr r11, [%[b], #20]\n\t" - "umull r3, r12, r8, r11\n\t" - "adds r4, r4, r3\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[6] * B[6] = 12 */ - "umull r3, r12, r7, r9\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - /* A[5] * B[7] = 12 */ - "umull r3, r12, r10, lr\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r12\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #48]\n\t" - /* A[6] * B[7] = 13 */ - "umull r3, r12, r7, lr\n\t" - "adds r5, r5, r3\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[6] = 13 */ - "umull r3, r12, r8, r9\n\t" - "adds r5, r5, r3\n\t" - "adcs r6, r6, r12\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #52]\n\t" - /* A[7] * B[7] = 14 */ - "umull r3, r12, r8, lr\n\t" - "adds r6, r6, r3\n\t" - "adc r4, r4, r12\n\t" - "str r6, [sp, #56]\n\t" - "str r4, [sp, #60]\n\t" - /* Reduce */ - /* Load bottom half */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" -#else - "ldrd r4, r5, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #8]\n\t" - "ldr r7, [sp, #12]\n\t" -#else - "ldrd r6, r7, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #16]\n\t" - "ldr r9, [sp, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "lsl %[b], %[b], #24\n\t" + "asr %[b], %[b], #24\n\t" #else - "ldrd r8, r9, [sp, #16]\n\t" + "sxtb %[b], %[b]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #24]\n\t" - "ldr r11, [sp, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "lsl r3, %[b], #24\n\t" + "asr r3, %[b], #31\n\t" #else - "ldrd r10, r11, [sp, #24]\n\t" + "sbfx r3, %[b], #7, #1\n\t" #endif - "lsr r3, r11, #31\n\t" - "and r11, r11, #0x7fffffff\n\t" - "mov lr, #19\n\t" - "ldr %[a], [sp, #32]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "adds r4, r4, r3\n\t" - "mov %[b], #0\n\t" - "adcs r5, r5, r12\n\t" - "adc %[b], %[b], #0\n\t" - "lsr r3, %[a], #31\n\t" - "ldr %[a], [sp, #36]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "add r12, r12, %[b]\n\t" - "adds r5, r5, r3\n\t" - "mov %[b], #0\n\t" - "adcs r6, r6, r12\n\t" - "adc %[b], %[b], #0\n\t" - "lsr r3, %[a], #31\n\t" - "ldr %[a], [sp, #40]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "add r12, r12, %[b]\n\t" - "adds r6, r6, r3\n\t" - "mov %[b], #0\n\t" - "adcs r7, r7, r12\n\t" - "adc %[b], %[b], #0\n\t" - "lsr r3, %[a], #31\n\t" - "ldr %[a], [sp, #44]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "add r12, r12, %[b]\n\t" - "adds r7, r7, r3\n\t" - "mov %[b], #0\n\t" - "adcs r8, r8, r12\n\t" - "adc %[b], %[b], #0\n\t" - "lsr r3, %[a], #31\n\t" - "ldr %[a], [sp, #48]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "add r12, r12, %[b]\n\t" - "adds r8, r8, r3\n\t" - "mov %[b], #0\n\t" - "adcs r9, r9, r12\n\t" - "adc %[b], %[b], #0\n\t" - "lsr r3, %[a], #31\n\t" - "ldr %[a], [sp, #52]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "add r12, r12, %[b]\n\t" - "adds r9, r9, r3\n\t" - "mov %[b], #0\n\t" - "adcs r10, r10, r12\n\t" - "adc %[b], %[b], #0\n\t" - "lsr r3, %[a], #31\n\t" - "ldr %[a], [sp, #56]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "add r12, r12, %[b]\n\t" - "adds r10, r10, r3\n\t" - "mov %[b], #0\n\t" - "adcs r11, r11, r12\n\t" - "adc %[b], %[b], #0\n\t" - "lsr r3, %[a], #31\n\t" - "ldr %[a], [sp, #60]\n\t" - "orr r3, r3, %[a], lsl #1\n\t" - "umull r3, r12, lr, r3\n\t" - "adds r11, r11, r3\n\t" - "adc r3, r12, %[b]\n\t" - /* Overflow */ - "lsl r3, r3, #1\n\t" - "orr r3, r3, r11, lsr #31\n\t" - "mul r3, r3, lr\n\t" - "and r11, r11, #0x7fffffff\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, #0\n\t" - "adcs r6, r6, #0\n\t" - "adcs r7, r7, #0\n\t" - "adcs r8, r8, #0\n\t" - "adcs r9, r9, #0\n\t" - "adcs r10, r10, #0\n\t" - "adc r11, r11, #0\n\t" - /* Reduce if top bit set */ - "asr r3, r11, #31\n\t" - "and r3, r3, lr\n\t" - "and r11, r11, #0x7fffffff\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, #0\n\t" + "eor %[b], %[b], r3\n\t" + "sub %[b], %[b], r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) + "sub lr, %[b], #1\n\t" +#else + "clz lr, %[b]\n\t" + "lsl lr, lr, #26\n\t" +#endif /* defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) */ + "asr lr, lr, #31\n\t" + "mvn lr, lr\n\t" + "add %[b], %[b], lr\n\t" + "mov r12, #0x60\n\t" + "mul %[b], %[b], r12\n\t" + "add %[base], %[base], %[b]\n\t" + "ldm %[base]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r6, r6, lr\n\t" + "and r7, r7, lr\n\t" + "and r8, r8, lr\n\t" + "and r9, r9, lr\n\t" + "and r10, r10, lr\n\t" + "and r11, r11, lr\n\t" + "mvn r12, lr\n\t" + "sub r4, r4, r12\n\t" + "mov r12, #32\n\t" + "and r12, r12, r3\n\t" + "add %[r], %[r], r12\n\t" + "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "sub %[r], %[r], r12\n\t" + "ldm %[base]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r6, r6, lr\n\t" + "and r7, r7, lr\n\t" + "and r8, r8, lr\n\t" + "and r9, r9, lr\n\t" + "and r10, r10, lr\n\t" + "and r11, r11, lr\n\t" + "mvn r12, lr\n\t" + "sub r4, r4, r12\n\t" + "mov r12, #32\n\t" + "bic r12, r12, r3\n\t" + "add %[r], %[r], r12\n\t" + "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "sub %[r], %[r], r12\n\t" + "add %[r], %[r], #0x40\n\t" + "ldm %[base]!, {r4, r5, r6, r7}\n\t" + "mvn r12, #18\n\t" + "subs r8, r12, r4\n\t" + "sbcs r9, r3, r5\n\t" + "sbcs r10, r3, r6\n\t" + "sbcs r11, r3, r7\n\t" + "bic r4, r4, r3\n\t" + "bic r5, r5, r3\n\t" + "bic r6, r6, r3\n\t" + "bic r7, r7, r3\n\t" + "and r8, r8, r3\n\t" + "and r9, r9, r3\n\t" + "and r10, r10, r3\n\t" + "and r11, r11, r3\n\t" + "orr r4, r4, r8\n\t" + "orr r5, r5, r9\n\t" + "orr r6, r6, r10\n\t" + "orr r7, r7, r11\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r6, r6, lr\n\t" + "and r7, r7, lr\n\t" + "stm %[r]!, {r4, r5, r6, r7}\n\t" + "ldm %[base]!, {r4, r5, r6, r7}\n\t" + "mvn r12, #0x80000000\n\t" + "sbcs r8, r3, r4\n\t" + "sbcs r9, r3, r5\n\t" + "sbcs r10, r3, r6\n\t" + "sbc r11, r12, r7\n\t" + "bic r4, r4, r3\n\t" + "bic r5, r5, r3\n\t" + "bic r6, r6, r3\n\t" + "bic r7, r7, r3\n\t" + "and r8, r8, r3\n\t" + "and r9, r9, r3\n\t" + "and r10, r10, r3\n\t" + "and r11, r11, r3\n\t" + "orr r4, r4, r8\n\t" + "orr r5, r5, r9\n\t" + "orr r6, r6, r10\n\t" + "orr r7, r7, r11\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r6, r6, lr\n\t" + "and r7, r7, lr\n\t" + "stm %[r]!, {r4, r5, r6, r7}\n\t" + "sub %[base], %[base], %[b]\n\t" + : [r] "+r" (r), [base] "+r" (base), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_ED25519_MAKE_KEY || HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) +void fe_mul_op(void); +void fe_mul_op() +{ + __asm__ __volatile__ ( + "sub sp, sp, #40\n\t" + "str r0, [sp, #36]\n\t" + "mov r0, #0\n\t" + "ldr r12, [r1]\n\t" + /* A[0] * B[0] */ + "ldr lr, [r2]\n\t" + "umull r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "umull r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "umull r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "umull r9, r10, r12, lr\n\t" + "str r3, [sp]\n\t" + /* A[0] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "mov r11, r0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[0] * B[3] */ + "ldr lr, [r2, #12]\n\t" "adcs r6, r6, #0\n\t" - "adcs r7, r7, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[0] * B[5] */ + "ldr lr, [r2, #20]\n\t" "adcs r8, r8, #0\n\t" - "adcs r9, r9, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[0] * B[7] */ + "ldr lr, [r2, #28]\n\t" "adcs r10, r10, #0\n\t" + "adc r3, r0, #0\n\t" + "umlal r10, r3, r12, lr\n\t" + /* A[1] * B[0] */ + "ldr r12, [r1, #4]\n\t" + "ldr lr, [r2]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "str r4, [sp, #4]\n\t" + "adds r5, r5, r11\n\t" + /* A[1] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[1] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * B[3] */ + "ldr lr, [r2, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * B[5] */ + "ldr lr, [r2, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * B[7] */ + "ldr lr, [r2, #28]\n\t" + "adc r4, r0, #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "ldr r12, [r1, #8]\n\t" + "ldr lr, [r2]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "str r5, [sp, #8]\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[2] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[2] * B[3] */ + "ldr lr, [r2, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * B[5] */ + "ldr lr, [r2, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * B[7] */ + "ldr lr, [r2, #28]\n\t" + "adc r5, r0, #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "ldr r12, [r1, #12]\n\t" + "ldr lr, [r2]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[3] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[3] * B[3] */ + "ldr lr, [r2, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[3] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * B[5] */ + "ldr lr, [r2, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * B[7] */ + "ldr lr, [r2, #28]\n\t" + "adc r6, r0, #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "ldr r12, [r1, #16]\n\t" + "ldr lr, [r2]\n\t" + "mov r11, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[4] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[4] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[4] * B[3] */ + "ldr lr, [r2, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[4] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[4] * B[5] */ + "ldr lr, [r2, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * B[7] */ + "ldr lr, [r2, #28]\n\t" + "adc r7, r0, #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "ldr r12, [r1, #20]\n\t" + "ldr lr, [r2]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[5] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[5] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[5] * B[3] */ + "ldr lr, [r2, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[5] * B[5] */ + "ldr lr, [r2, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[5] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * B[7] */ + "ldr lr, [r2, #28]\n\t" + "adc r8, r0, #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "ldr r12, [r1, #24]\n\t" + "ldr lr, [r2]\n\t" + "mov r11, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[6] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[6] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[6] * B[3] */ + "ldr lr, [r2, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[6] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * B[5] */ + "ldr lr, [r2, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[6] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[6] * B[7] */ + "ldr lr, [r2, #28]\n\t" + "adc r9, r0, #0\n\t" + "umlal r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "ldr r12, [r1, #28]\n\t" + "ldr lr, [r2]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[7] * B[1] */ + "ldr lr, [r2, #4]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[7] * B[2] */ + "ldr lr, [r2, #8]\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[7] * B[3] */ + "ldr lr, [r2, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[7] * B[4] */ + "ldr lr, [r2, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[7] * B[5] */ + "ldr lr, [r2, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * B[6] */ + "ldr lr, [r2, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[7] * B[7] */ + "ldr lr, [r2, #28]\n\t" + "adc r10, r0, #0\n\t" + "umlal r9, r10, r12, lr\n\t" + /* Reduce */ + "ldr r2, [sp, #28]\n\t" + "mov lr, sp\n\t" + "mov r12, #38\n\t" + "umull r10, r11, r12, r10\n\t" + "adds r10, r10, r2\n\t" "adc r11, r11, #0\n\t" - /* Store */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r]]\n\t" - "str r5, [%[r], #4]\n\t" -#else - "strd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" -#else - "strd r6, r7, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" -#else - "strd r8, r9, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" + "mov r12, #19\n\t" + "lsl r11, r11, #1\n\t" + "orr r11, r11, r10, LSR #31\n\t" + "mul r11, r12, r11\n\t" + "ldm lr!, {r1, r2}\n\t" + "mov r12, #38\n\t" + "adds r1, r1, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r1, r11, r3, r12\n\t" + "adds r2, r2, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r2, r11, r4, r12\n\t" + "ldm lr!, {r3, r4}\n\t" + "adds r3, r3, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r5, r12\n\t" + "adds r4, r4, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r6, r12\n\t" + "ldm lr!, {r5, r6}\n\t" + "adds r5, r5, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r7, r12\n\t" + "adds r6, r6, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r8, r12\n\t" + "ldm lr!, {r7, r8}\n\t" + "adds r7, r7, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r9, r12\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r10, r10, #0x80000000\n\t" #else - "strd r10, r11, [%[r], #24]\n\t" + "bfc r10, #31, #1\n\t" #endif - "add sp, sp, #0x40\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + "adds r8, r10, r11\n\t" + /* Store */ + "ldr r0, [sp, #36]\n\t" + "stm r0, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #40\n\t" + : : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "lr", "cc" ); } -void fe_sq(fe r_p, const fe a_p) +#else +void fe_mul_op(void); +void fe_mul_op() { - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; - __asm__ __volatile__ ( - "sub sp, sp, #0x40\n\t" - /* Square */ - "ldr r7, [%[a]]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[a], #8]\n\t" - "ldr r10, [%[a], #12]\n\t" - "ldr r12, [%[a], #16]\n\t" - /* A[0] * A[0] = 0 */ - "umull r4, r5, r7, r7\n\t" - "str r4, [sp]\n\t" - /* A[0] * A[1] = 1 */ - "umull r2, r3, r7, r8\n\t" - "mov r6, #0\n\t" - "adds r5, r5, r2\n\t" - "adc r6, r6, r3\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #4]\n\t" - /* A[1] * A[1] = 2 */ - "umull r2, r3, r8, r8\n\t" - "adds r6, r6, r2\n\t" - "adc r4, r4, r3\n\t" - /* A[0] * A[2] = 2 */ - "umull r2, r3, r7, r9\n\t" - "adds r6, r6, r2\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #8]\n\t" - /* A[0] * A[3] = 3 */ - "umull r2, r3, r7, r10\n\t" - "adds r4, r4, r2\n\t" - "adc r5, r5, r3\n\t" - "adds r4, r4, r2\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[1] * A[2] = 3 */ - "umull r2, r3, r8, r9\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #12]\n\t" - /* A[2] * A[2] = 4 */ - "umull r2, r3, r9, r9\n\t" - "adds r5, r5, r2\n\t" + "sub sp, sp, #44\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r0, [sp, #36]\n\t" + "str r1, [sp, #40]\n\t" +#else + "strd r0, r1, [sp, #36]\n\t" +#endif + "mov lr, r2\n\t" + "ldm r1, {r0, r1, r2, r3}\n\t" + "ldm lr!, {r4, r5, r6}\n\t" + "umull r10, r11, r0, r4\n\t" + "umull r12, r7, r1, r4\n\t" + "umaal r11, r12, r0, r5\n\t" + "umull r8, r9, r2, r4\n\t" + "umaal r12, r8, r1, r5\n\t" + "umaal r12, r7, r0, r6\n\t" + "umaal r8, r9, r3, r4\n\t" + "stm sp, {r10, r11, r12}\n\t" + "umaal r7, r8, r2, r5\n\t" + "ldm lr!, {r4}\n\t" + "umull r10, r11, r1, r6\n\t" + "umaal r8, r9, r2, r6\n\t" + "umaal r7, r10, r0, r4\n\t" + "umaal r8, r11, r3, r5\n\t" + "str r7, [sp, #12]\n\t" + "umaal r8, r10, r1, r4\n\t" + "umaal r9, r11, r3, r6\n\t" + "umaal r9, r10, r2, r4\n\t" + "umaal r10, r11, r3, r4\n\t" + "ldm lr, {r4, r5, r6, r7}\n\t" + "mov r12, #0\n\t" + "umlal r8, r12, r0, r4\n\t" + "umaal r9, r12, r1, r4\n\t" + "umaal r10, r12, r2, r4\n\t" + "umaal r11, r12, r3, r4\n\t" "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * A[3] = 4 */ - "umull r2, r3, r8, r10\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[0] * A[4] = 4 */ - "umull r2, r3, r7, r12\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #16]\n\t" - /* A[0] * A[5] = 5 */ - "ldr r11, [%[a], #20]\n\t" - "umull r2, r3, r7, r11\n\t" - "adds r6, r6, r2\n\t" + "umlal r9, r4, r0, r5\n\t" + "umaal r10, r4, r1, r5\n\t" + "umaal r11, r4, r2, r5\n\t" + "umaal r12, r4, r3, r5\n\t" "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * A[4] = 5 */ - "umull r2, r3, r8, r12\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * A[3] = 5 */ - "umull r2, r3, r9, r10\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #20]\n\t" - /* A[3] * A[3] = 6 */ - "umull r2, r3, r10, r10\n\t" - "adds r4, r4, r2\n\t" + "umlal r10, r5, r0, r6\n\t" + "umaal r11, r5, r1, r6\n\t" + "umaal r12, r5, r2, r6\n\t" + "umaal r4, r5, r3, r6\n\t" "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[2] * A[4] = 6 */ - "umull r2, r3, r9, r12\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[1] * A[5] = 6 */ - "umull r2, r3, r8, r11\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[0] * A[6] = 6 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r7, r11\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #24]\n\t" - /* A[0] * A[7] = 7 */ - "ldr r11, [%[a], #28]\n\t" - "umull r2, r3, r7, r11\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * A[6] = 7 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r8, r11\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * A[5] = 7 */ - "ldr r11, [%[a], #20]\n\t" - "umull r2, r3, r9, r11\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * A[4] = 7 */ - "umull r2, r3, r10, r12\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #28]\n\t" - /* A[4] * A[4] = 8 */ - "umull r2, r3, r12, r12\n\t" - "adds r6, r6, r2\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * A[5] = 8 */ - "umull r2, r3, r10, r11\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * A[6] = 8 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r9, r11\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * A[7] = 8 */ - "ldr r11, [%[a], #28]\n\t" - "umull r2, r3, r8, r11\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" + "umlal r11, r6, r0, r7\n\t" + "ldr r0, [sp, #40]\n\t" + "umaal r12, r6, r1, r7\n\t" + "add r0, r0, #16\n\t" + "umaal r4, r6, r2, r7\n\t" + "sub lr, lr, #16\n\t" + "umaal r5, r6, r3, r7\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" "str r6, [sp, #32]\n\t" - "ldr r7, [%[a], #20]\n\t" - /* A[2] * A[7] = 9 */ - "umull r2, r3, r9, r11\n\t" - "adds r4, r4, r2\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[3] * A[6] = 9 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r10, r11\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[4] * A[5] = 9 */ - "umull r2, r3, r12, r7\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #36]\n\t" - "mov r8, r11\n\t" - /* A[5] * A[5] = 10 */ - "umull r2, r3, r7, r7\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * A[6] = 10 */ - "umull r2, r3, r12, r8\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * A[7] = 10 */ - "ldr r11, [%[a], #28]\n\t" - "umull r2, r3, r10, r11\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #40]\n\t" - "mov r9, r11\n\t" - /* A[4] * A[7] = 11 */ - "umull r2, r3, r12, r9\n\t" - "adds r6, r6, r2\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * A[6] = 11 */ - "umull r2, r3, r7, r8\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #44]\n\t" - /* A[6] * A[6] = 12 */ - "umull r2, r3, r8, r8\n\t" - "adds r4, r4, r2\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[5] * A[7] = 12 */ - "umull r2, r3, r7, r9\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #48]\n\t" - /* A[6] * A[7] = 13 */ - "umull r2, r3, r8, r9\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #52]\n\t" - /* A[7] * A[7] = 14 */ - "umull r2, r3, r9, r9\n\t" - "adds r6, r6, r2\n\t" - "adc r4, r4, r3\n\t" - "str r6, [sp, #56]\n\t" - "str r4, [sp, #60]\n\t" + "ldm lr!, {r6}\n\t" + "mov r7, #0\n\t" + "umlal r8, r7, r0, r6\n\t" + "umaal r9, r7, r1, r6\n\t" + "str r8, [sp, #16]\n\t" + "umaal r10, r7, r2, r6\n\t" + "umaal r11, r7, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r8, #0\n\t" + "umlal r9, r8, r0, r6\n\t" + "umaal r10, r8, r1, r6\n\t" + "str r9, [sp, #20]\n\t" + "umaal r11, r8, r2, r6\n\t" + "umaal r12, r8, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r9, #0\n\t" + "umlal r10, r9, r0, r6\n\t" + "umaal r11, r9, r1, r6\n\t" + "str r10, [sp, #24]\n\t" + "umaal r12, r9, r2, r6\n\t" + "umaal r4, r9, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r10, #0\n\t" + "umlal r11, r10, r0, r6\n\t" + "umaal r12, r10, r1, r6\n\t" + "str r11, [sp, #28]\n\t" + "umaal r4, r10, r2, r6\n\t" + "umaal r5, r10, r3, r6\n\t" + "ldm lr!, {r11}\n\t" + "umaal r12, r7, r0, r11\n\t" + "umaal r4, r7, r1, r11\n\t" + "ldr r6, [sp, #32]\n\t" + "umaal r5, r7, r2, r11\n\t" + "umaal r6, r7, r3, r11\n\t" + "ldm lr!, {r11}\n\t" + "umaal r4, r8, r0, r11\n\t" + "umaal r5, r8, r1, r11\n\t" + "umaal r6, r8, r2, r11\n\t" + "umaal r7, r8, r3, r11\n\t" + "ldm lr, {r11, lr}\n\t" + "umaal r5, r9, r0, r11\n\t" + "umaal r6, r10, r0, lr\n\t" + "umaal r6, r9, r1, r11\n\t" + "umaal r7, r10, r1, lr\n\t" + "umaal r7, r9, r2, r11\n\t" + "umaal r8, r10, r2, lr\n\t" + "umaal r8, r9, r3, r11\n\t" + "umaal r9, r10, r3, lr\n\t" /* Reduce */ - /* Load bottom half */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" -#else - "ldrd r4, r5, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #8]\n\t" - "ldr r7, [sp, #12]\n\t" -#else - "ldrd r6, r7, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #16]\n\t" - "ldr r9, [sp, #20]\n\t" -#else - "ldrd r8, r9, [sp, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #24]\n\t" - "ldr r11, [sp, #28]\n\t" -#else - "ldrd r10, r11, [sp, #24]\n\t" -#endif - "lsr r2, r11, #31\n\t" - "and r11, r11, #0x7fffffff\n\t" - "mov r12, #19\n\t" - "ldr %[a], [sp, #32]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "adds r4, r4, r2\n\t" - "mov lr, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #31\n\t" - "ldr %[a], [sp, #36]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r5, r5, r2\n\t" - "mov lr, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #31\n\t" - "ldr %[a], [sp, #40]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r6, r6, r2\n\t" - "mov lr, #0\n\t" - "adcs r7, r7, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #31\n\t" - "ldr %[a], [sp, #44]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r7, r7, r2\n\t" - "mov lr, #0\n\t" - "adcs r8, r8, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #31\n\t" - "ldr %[a], [sp, #48]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r8, r8, r2\n\t" - "mov lr, #0\n\t" - "adcs r9, r9, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #31\n\t" - "ldr %[a], [sp, #52]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r9, r9, r2\n\t" - "mov lr, #0\n\t" - "adcs r10, r10, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #31\n\t" - "ldr %[a], [sp, #56]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r10, r10, r2\n\t" - "mov lr, #0\n\t" - "adcs r11, r11, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #31\n\t" - "ldr %[a], [sp, #60]\n\t" - "orr r2, r2, %[a], lsl #1\n\t" - "umull r2, r3, r12, r2\n\t" - "adds r11, r11, r2\n\t" - "adc r2, r3, lr\n\t" - /* Overflow */ - "lsl r2, r2, #1\n\t" - "orr r2, r2, r11, lsr #31\n\t" - "mul r2, r2, r12\n\t" - "and r11, r11, #0x7fffffff\n\t" - "adds r4, r4, r2\n\t" + "ldr r0, [sp, #28]\n\t" + "mov lr, #37\n\t" + "umaal r10, r0, r10, lr\n\t" + "mov lr, #19\n\t" + "lsl r0, r0, #1\n\t" + "orr r0, r0, r10, lsr #31\n\t" + "mul r11, r0, lr\n\t" + "pop {r0-r2}\n\t" + "mov lr, #38\n\t" + "umaal r0, r11, r12, lr\n\t" + "umaal r1, r11, r4, lr\n\t" + "umaal r2, r11, r5, lr\n\t" + "pop {r3-r5}\n\t" + "umaal r3, r11, r6, lr\n\t" + "umaal r4, r11, r7, lr\n\t" + "umaal r5, r11, r8, lr\n\t" + "pop {r6}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r10, r10, #0x80000000\n\t" +#else + "bfc r10, #31, #1\n\t" +#endif + "umaal r6, r11, r9, lr\n\t" + "add r7, r10, r11\n\t" + "ldr lr, [sp, #8]\n\t" + /* Store */ + "stm lr, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + "add sp, sp, #16\n\t" + : + : + : "memory", "lr", "cc" + ); +} + +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +void fe_mul(fe r_p, const fe a_p, const fe b_p) +{ + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; + register const sword32* b asm ("r2") = (const sword32*)b_p; + + __asm__ __volatile__ ( + "bl fe_mul_op\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) +void fe_sq_op(void); +void fe_sq_op() +{ + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str r0, [sp, #64]\n\t" + /* Square */ + "mov r0, #0\n\t" + "ldr r12, [r1]\n\t" + /* A[0] * A[1] */ + "ldr lr, [r1, #4]\n\t" + "umull r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "ldr lr, [r1, #12]\n\t" + "umull r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "umull r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "umull r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "ldr lr, [r1, #8]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[0] * A[4] */ + "ldr lr, [r1, #16]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[0] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + "adcs r3, r3, #0\n\t" + "str r4, [sp, #4]\n\t" + "str r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "ldr r12, [r1, #4]\n\t" + "ldr lr, [r1, #8]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * A[3] */ + "ldr lr, [r1, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * A[4] */ + "ldr lr, [r1, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r4, r0, #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "ldr r12, [r1, #8]\n\t" + "ldr lr, [r1, #12]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * A[4] */ + "ldr lr, [r1, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r5, r0, #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "ldr r12, [r1, #12]\n\t" + "ldr lr, [r1, #16]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r6, r0, #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "ldr r12, [r1, #16]\n\t" + "ldr lr, [r1, #20]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r7, r0, #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "ldr r12, [r1, #20]\n\t" + "ldr lr, [r1, #24]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r8, r0, #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "ldr r12, [r1, #24]\n\t" + "ldr lr, [r1, #28]\n\t" + "mov r9, #0\n\t" + "umlal r8, r9, r12, lr\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "adcs r3, r3, r3\n\t" + "adcs r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adc r10, r0, #0\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "mov lr, sp\n\t" + /* A[0] * A[0] */ + "ldr r12, [r1]\n\t" + "umull r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[1] * A[1] */ + "ldr r12, [r1, #4]\n\t" "adcs r5, r5, #0\n\t" - "adcs r6, r6, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * A[2] */ + "ldr r12, [r1, #8]\n\t" "adcs r7, r7, #0\n\t" - "adcs r8, r8, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * A[3] */ + "ldr r12, [r1, #12]\n\t" "adcs r9, r9, #0\n\t" - "adcs r10, r10, #0\n\t" - "adc r11, r11, #0\n\t" - /* Reduce if top bit set */ - "asr r2, r11, #31\n\t" - "and r2, r2, r12\n\t" - "and r11, r11, #0x7fffffff\n\t" - "adds r4, r4, r2\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, r12\n\t" + "adds r10, r10, r11\n\t" + "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "ldr r12, [r1, #16]\n\t" + "adcs r3, r3, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * A[5] */ + "ldr r12, [r1, #20]\n\t" "adcs r5, r5, #0\n\t" - "adcs r6, r6, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * A[6] */ + "ldr r12, [r1, #24]\n\t" "adcs r7, r7, #0\n\t" - "adcs r8, r8, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * A[7] */ + "ldr r12, [r1, #28]\n\t" "adcs r9, r9, #0\n\t" - "adcs r10, r10, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r9, r10, r12, r12\n\t" + /* Reduce */ + "ldr r2, [sp, #28]\n\t" + "mov lr, sp\n\t" + "mov r12, #38\n\t" + "umull r10, r11, r12, r10\n\t" + "adds r10, r10, r2\n\t" "adc r11, r11, #0\n\t" - /* Store */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r]]\n\t" - "str r5, [%[r], #4]\n\t" -#else - "strd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" + "mov r12, #19\n\t" + "lsl r11, r11, #1\n\t" + "orr r11, r11, r10, LSR #31\n\t" + "mul r11, r12, r11\n\t" + "ldm lr!, {r1, r2}\n\t" + "mov r12, #38\n\t" + "adds r1, r1, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r1, r11, r3, r12\n\t" + "adds r2, r2, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r2, r11, r4, r12\n\t" + "ldm lr!, {r3, r4}\n\t" + "adds r3, r3, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r5, r12\n\t" + "adds r4, r4, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r6, r12\n\t" + "ldm lr!, {r5, r6}\n\t" + "adds r5, r5, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r7, r12\n\t" + "adds r6, r6, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r8, r12\n\t" + "ldm lr!, {r7, r8}\n\t" + "adds r7, r7, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r9, r12\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r10, r10, #0x80000000\n\t" #else - "strd r6, r7, [%[r], #8]\n\t" + "bfc r10, #31, #1\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" + "adds r8, r10, r11\n\t" + /* Store */ + "ldr r0, [sp, #64]\n\t" + "stm r0, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #0x44\n\t" + : + : + : "memory", "lr", "cc" + ); +} + #else - "strd r8, r9, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" +void fe_sq_op(void); +void fe_sq_op() +{ + __asm__ __volatile__ ( + "sub sp, sp, #32\n\t" + "str r0, [sp, #28]\n\t" + "ldm r1, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + /* Square */ + "umull r9, r10, r0, r0\n\t" + "umull r11, r12, r0, r1\n\t" + "adds r11, r11, r11\n\t" + "mov lr, #0\n\t" + "umaal r10, r11, lr, lr\n\t" + "stm sp, {r9, r10}\n\t" + "mov r8, lr\n\t" + "umaal r8, r12, r0, r2\n\t" + "adcs r8, r8, r8\n\t" + "umaal r8, r11, r1, r1\n\t" + "umull r9, r10, r0, r3\n\t" + "umaal r9, r12, r1, r2\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #8]\n\t" + "str r9, [sp, #12]\n\t" #else - "strd r10, r11, [%[r], #24]\n\t" + "strd r8, r9, [sp, #8]\n\t" #endif - "add sp, sp, #0x40\n\t" + "mov r9, lr\n\t" + "umaal r9, r10, r0, r4\n\t" + "umaal r9, r12, r1, r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r2, r2\n\t" + "str r9, [sp, #16]\n\t" + "umull r9, r8, r0, r5\n\t" + "umaal r9, r12, r1, r4\n\t" + "umaal r9, r10, r2, r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" + "str r9, [sp, #20]\n\t" + "mov r9, lr\n\t" + "umaal r9, r8, r0, r6\n\t" + "umaal r9, r12, r1, r5\n\t" + "umaal r9, r10, r2, r4\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r3, r3\n\t" + "str r9, [sp, #24]\n\t" + "umull r0, r9, r0, r7\n\t" + "umaal r0, r8, r1, r6\n\t" + "umaal r0, r12, r2, r5\n\t" + "umaal r0, r10, r3, r4\n\t" + "adcs r0, r0, r0\n\t" + "umaal r0, r11, lr, lr\n\t" + /* R[7] = r0 */ + "umaal r9, r8, r1, r7\n\t" + "umaal r9, r10, r2, r6\n\t" + "umaal r12, r9, r3, r5\n\t" + "adcs r12, r12, r12\n\t" + "umaal r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "umaal r9, r8, r2, r7\n\t" + "umaal r10, r9, r3, r6\n\t" + "mov r2, lr\n\t" + "umaal r10, r2, r4, r5\n\t" + "adcs r10, r10, r10\n\t" + "umaal r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "umaal r2, r8, r3, r7\n\t" + "umaal r2, r9, r4, r6\n\t" + "adcs r3, r2, r2\n\t" + "umaal r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "mov r1, lr\n\t" + "umaal r1, r8, r4, r7\n\t" + "umaal r1, r9, r5, r6\n\t" + "adcs r4, r1, r1\n\t" + "umaal r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "umaal r8, r9, r5, r7\n\t" + "adcs r8, r8, r8\n\t" + "umaal r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "mov r5, lr\n\t" + "umaal r5, r9, r6, r7\n\t" + "adcs r5, r5, r5\n\t" + "umaal r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "adcs r9, r9, r9\n\t" + "umaal r9, r5, r7, r7\n\t" + "adcs r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + /* Reduce */ + "mov r6, #37\n\t" + "umaal r7, r0, r7, r6\n\t" + "mov r6, #19\n\t" + "lsl r0, r0, #1\n\t" + "orr r0, r0, r7, lsr #31\n\t" + "mul lr, r0, r6\n\t" + "pop {r0-r1}\n\t" + "mov r6, #38\n\t" + "umaal r0, lr, r12, r6\n\t" + "umaal r1, lr, r11, r6\n\t" + "mov r12, r3\n\t" + "mov r11, r4\n\t" + "pop {r2-r4}\n\t" + "umaal r2, lr, r10, r6\n\t" + "umaal r3, lr, r12, r6\n\t" + "umaal r4, lr, r11, r6\n\t" + "mov r12, r6\n\t" + "pop {r5-r6}\n\t" + "umaal r5, lr, r8, r12\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r7, r7, #0x80000000\n\t" +#else + "bfc r7, #31, #1\n\t" +#endif + "umaal r6, lr, r9, r12\n\t" + "add r7, r7, lr\n\t" + "pop {lr}\n\t" + /* Store */ + "stm lr, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + : + : + : "memory", "lr", "cc" + ); +} + +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +void fe_sq(fe r_p, const fe a_p) +{ + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; + + __asm__ __volatile__ ( + "bl fe_sq_op\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "r11", "cc" ); } +#ifdef HAVE_CURVE25519 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) void fe_mul121666(fe r_p, fe a_p) { - register fe r asm ("r0") = r_p; - register fe a asm ("r1") = a_p; + register sword32* r asm ("r0") = (sword32*)r_p; + register sword32* a asm ("r1") = (sword32*)a_p; __asm__ __volatile__ ( /* Multiply by 121666 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r2, [%[a]]\n\t" - "ldr r3, [%[a], #4]\n\t" -#else - "ldrd r2, r3, [%[a]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[a], #12]\n\t" -#else - "ldrd r4, r5, [%[a], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #16]\n\t" - "ldr r7, [%[a], #20]\n\t" -#else - "ldrd r6, r7, [%[a], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[a], #24]\n\t" - "ldr r9, [%[a], #28]\n\t" -#else - "ldrd r8, r9, [%[a], #24]\n\t" -#endif - "movw lr, #0xdb42\n\t" - "movt lr, #1\n\t" - "umull r2, r10, r2, lr\n\t" - "umull r3, r12, r3, lr\n\t" - "adds r3, r3, r10\n\t" - "adc r10, r12, #0\n\t" - "umull r4, r12, r4, lr\n\t" - "adds r4, r4, r10\n\t" - "adc r10, r12, #0\n\t" - "umull r5, r12, r5, lr\n\t" - "adds r5, r5, r10\n\t" - "adc r10, r12, #0\n\t" - "umull r6, r12, r6, lr\n\t" - "adds r6, r6, r10\n\t" - "adc r10, r12, #0\n\t" - "umull r7, r12, r7, lr\n\t" - "adds r7, r7, r10\n\t" - "adc r10, r12, #0\n\t" - "umull r8, r12, r8, lr\n\t" - "adds r8, r8, r10\n\t" - "adc r10, r12, #0\n\t" - "umull r9, r12, r9, lr\n\t" - "adds r9, r9, r10\n\t" - "adc r10, r12, #0\n\t" - "mov lr, #19\n\t" - "lsl r10, r10, #1\n\t" - "orr r10, r10, r9, lsr #31\n\t" - "mul r10, r10, lr\n\t" - "and r9, r9, #0x7fffffff\n\t" - "adds r2, r2, r10\n\t" + "ldm %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #1\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xdb\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0x42\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xdb\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x42\n\t" +#else + "mov r10, #0xdb42\n\t" +#endif + "movt r10, #1\n\t" +#endif + "umull r2, r12, r10, r2\n\t" + "umull r3, lr, r10, r3\n\t" + "adds r3, r3, r12\n\t" + "adc lr, lr, #0\n\t" + "umull r4, r12, r10, r4\n\t" + "adds r4, r4, lr\n\t" + "adc r12, r12, #0\n\t" + "umull r5, lr, r10, r5\n\t" + "adds r5, r5, r12\n\t" + "adc lr, lr, #0\n\t" + "umull r6, r12, r10, r6\n\t" + "adds r6, r6, lr\n\t" + "adc r12, r12, #0\n\t" + "umull r7, lr, r10, r7\n\t" + "adds r7, r7, r12\n\t" + "adc lr, lr, #0\n\t" + "umull r8, r12, r10, r8\n\t" + "adds r8, r8, lr\n\t" + "adc r12, r12, #0\n\t" + "umull r9, lr, r10, r9\n\t" + "adds r9, r9, r12\n\t" + "mov r10, #19\n\t" + "adc lr, lr, #0\n\t" + "lsl lr, lr, #1\n\t" + "orr lr, lr, r9, LSR #31\n\t" + "mul lr, r10, lr\n\t" + "adds r2, r2, lr\n\t" "adcs r3, r3, #0\n\t" "adcs r4, r4, #0\n\t" "adcs r5, r5, #0\n\t" "adcs r6, r6, #0\n\t" "adcs r7, r7, #0\n\t" - "adcs r8, r8, #0\n\t" - "adc r9, r9, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r2, [%[r]]\n\t" - "str r3, [%[r], #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0x80000000\n\t" #else - "strd r2, r3, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #12]\n\t" -#else - "strd r4, r5, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [%[r], #16]\n\t" - "str r7, [%[r], #20]\n\t" -#else - "strd r6, r7, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #24]\n\t" - "str r9, [%[r], #28]\n\t" -#else - "strd r8, r9, [%[r], #24]\n\t" + "bfc r9, #31, #1\n\t" #endif + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "stm %[r], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc" ); } -void fe_sq2(fe r_p, const fe a_p) +#else +void fe_mul121666(fe r_p, fe a_p) { - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; + register sword32* r asm ("r0") = (sword32*)r_p; + register sword32* a asm ("r1") = (sword32*)a_p; __asm__ __volatile__ ( - "sub sp, sp, #0x40\n\t" - /* Square * 2 */ - "ldr r7, [%[a]]\n\t" - "ldr r8, [%[a], #4]\n\t" - "ldr r9, [%[a], #8]\n\t" - "ldr r10, [%[a], #12]\n\t" - "ldr r12, [%[a], #16]\n\t" - /* A[0] * A[0] = 0 */ - "umull r4, r5, r7, r7\n\t" - "str r4, [sp]\n\t" - /* A[0] * A[1] = 1 */ - "umull r2, r3, r7, r8\n\t" - "mov r6, #0\n\t" - "adds r5, r5, r2\n\t" - "adc r6, r6, r3\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #4]\n\t" - /* A[1] * A[1] = 2 */ - "umull r2, r3, r8, r8\n\t" - "adds r6, r6, r2\n\t" - "adc r4, r4, r3\n\t" - /* A[0] * A[2] = 2 */ - "umull r2, r3, r7, r9\n\t" - "adds r6, r6, r2\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #8]\n\t" - /* A[0] * A[3] = 3 */ - "umull r2, r3, r7, r10\n\t" - "adds r4, r4, r2\n\t" - "adc r5, r5, r3\n\t" - "adds r4, r4, r2\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[1] * A[2] = 3 */ - "umull r2, r3, r8, r9\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #12]\n\t" - /* A[2] * A[2] = 4 */ - "umull r2, r3, r9, r9\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * A[3] = 4 */ - "umull r2, r3, r8, r10\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[0] * A[4] = 4 */ - "umull r2, r3, r7, r12\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #16]\n\t" - /* A[0] * A[5] = 5 */ - "ldr r11, [%[a], #20]\n\t" - "umull r2, r3, r7, r11\n\t" - "adds r6, r6, r2\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * A[4] = 5 */ - "umull r2, r3, r8, r12\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * A[3] = 5 */ - "umull r2, r3, r9, r10\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #20]\n\t" - /* A[3] * A[3] = 6 */ - "umull r2, r3, r10, r10\n\t" - "adds r4, r4, r2\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[2] * A[4] = 6 */ - "umull r2, r3, r9, r12\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[1] * A[5] = 6 */ - "umull r2, r3, r8, r11\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[0] * A[6] = 6 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r7, r11\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #24]\n\t" - /* A[0] * A[7] = 7 */ - "ldr r11, [%[a], #28]\n\t" - "umull r2, r3, r7, r11\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * A[6] = 7 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r8, r11\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * A[5] = 7 */ - "ldr r11, [%[a], #20]\n\t" - "umull r2, r3, r9, r11\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * A[4] = 7 */ - "umull r2, r3, r10, r12\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #28]\n\t" - /* A[4] * A[4] = 8 */ - "umull r2, r3, r12, r12\n\t" - "adds r6, r6, r2\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * A[5] = 8 */ - "umull r2, r3, r10, r11\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * A[6] = 8 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r9, r11\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[1] * A[7] = 8 */ - "ldr r11, [%[a], #28]\n\t" - "umull r2, r3, r8, r11\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #32]\n\t" - "ldr r7, [%[a], #20]\n\t" - /* A[2] * A[7] = 9 */ - "umull r2, r3, r9, r11\n\t" - "adds r4, r4, r2\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[3] * A[6] = 9 */ - "ldr r11, [%[a], #24]\n\t" - "umull r2, r3, r10, r11\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[4] * A[5] = 9 */ - "umull r2, r3, r12, r7\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #36]\n\t" - "mov r8, r11\n\t" - /* A[5] * A[5] = 10 */ - "umull r2, r3, r7, r7\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * A[6] = 10 */ - "umull r2, r3, r12, r8\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * A[7] = 10 */ - "ldr r11, [%[a], #28]\n\t" - "umull r2, r3, r10, r11\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #40]\n\t" - "mov r9, r11\n\t" - /* A[4] * A[7] = 11 */ - "umull r2, r3, r12, r9\n\t" - "adds r6, r6, r2\n\t" - "mov r5, #0\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * A[6] = 11 */ - "umull r2, r3, r7, r8\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "adds r6, r6, r2\n\t" - "adcs r4, r4, r3\n\t" - "adc r5, r5, #0\n\t" - "str r6, [sp, #44]\n\t" - /* A[6] * A[6] = 12 */ - "umull r2, r3, r8, r8\n\t" - "adds r4, r4, r2\n\t" - "mov r6, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - /* A[5] * A[7] = 12 */ - "umull r2, r3, r7, r9\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, r3\n\t" - "adc r6, r6, #0\n\t" - "str r4, [sp, #48]\n\t" - /* A[6] * A[7] = 13 */ - "umull r2, r3, r8, r9\n\t" - "adds r5, r5, r2\n\t" - "mov r4, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r2\n\t" - "adcs r6, r6, r3\n\t" - "adc r4, r4, #0\n\t" - "str r5, [sp, #52]\n\t" - /* A[7] * A[7] = 14 */ - "umull r2, r3, r9, r9\n\t" - "adds r6, r6, r2\n\t" - "adc r4, r4, r3\n\t" - "str r6, [sp, #56]\n\t" - "str r4, [sp, #60]\n\t" - /* Double and Reduce */ - /* Load bottom half */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" -#else - "ldrd r4, r5, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #8]\n\t" - "ldr r7, [sp, #12]\n\t" -#else - "ldrd r6, r7, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #16]\n\t" - "ldr r9, [sp, #20]\n\t" + /* Multiply by 121666 */ + "ldm %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #1\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xdb\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0x42\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #0xdb\n\t" + "lsl lr, lr, #8\n\t" + "add lr, lr, #0x42\n\t" #else - "ldrd r8, r9, [sp, #16]\n\t" + "mov lr, #0xdb42\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #24]\n\t" - "ldr r11, [sp, #28]\n\t" -#else - "ldrd r10, r11, [sp, #24]\n\t" + "movt lr, #1\n\t" #endif - "lsr r2, r11, #30\n\t" - "lsl r11, r11, #1\n\t" - "orr r11, r11, r10, lsr #31\n\t" + "umull r2, r10, lr, r2\n\t" + "sub r12, lr, #1\n\t" + "umaal r3, r10, r12, r3\n\t" + "umaal r4, r10, r12, r4\n\t" + "umaal r5, r10, r12, r5\n\t" + "umaal r6, r10, r12, r6\n\t" + "umaal r7, r10, r12, r7\n\t" + "umaal r8, r10, r12, r8\n\t" + "mov lr, #19\n\t" + "umaal r9, r10, r12, r9\n\t" "lsl r10, r10, #1\n\t" "orr r10, r10, r9, lsr #31\n\t" - "lsl r9, r9, #1\n\t" - "orr r9, r9, r8, lsr #31\n\t" - "lsl r8, r8, #1\n\t" - "orr r8, r8, r7, lsr #31\n\t" - "lsl r7, r7, #1\n\t" - "orr r7, r7, r6, lsr #31\n\t" - "lsl r6, r6, #1\n\t" - "orr r6, r6, r5, lsr #31\n\t" - "lsl r5, r5, #1\n\t" - "orr r5, r5, r4, lsr #31\n\t" - "lsl r4, r4, #1\n\t" - "and r11, r11, #0x7fffffff\n\t" - "mov r12, #19\n\t" - "ldr %[a], [sp, #32]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "adds r4, r4, r2\n\t" - "mov lr, #0\n\t" - "adcs r5, r5, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #30\n\t" - "ldr %[a], [sp, #36]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r5, r5, r2\n\t" - "mov lr, #0\n\t" - "adcs r6, r6, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #30\n\t" - "ldr %[a], [sp, #40]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r6, r6, r2\n\t" - "mov lr, #0\n\t" - "adcs r7, r7, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #30\n\t" - "ldr %[a], [sp, #44]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r7, r7, r2\n\t" - "mov lr, #0\n\t" - "adcs r8, r8, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #30\n\t" - "ldr %[a], [sp, #48]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r8, r8, r2\n\t" - "mov lr, #0\n\t" - "adcs r9, r9, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #30\n\t" - "ldr %[a], [sp, #52]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r9, r9, r2\n\t" - "mov lr, #0\n\t" - "adcs r10, r10, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #30\n\t" - "ldr %[a], [sp, #56]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "add r3, r3, lr\n\t" - "adds r10, r10, r2\n\t" - "mov lr, #0\n\t" - "adcs r11, r11, r3\n\t" - "adc lr, lr, #0\n\t" - "lsr r2, %[a], #30\n\t" - "ldr %[a], [sp, #60]\n\t" - "orr r2, r2, %[a], lsl #2\n\t" - "umull r2, r3, r12, r2\n\t" - "adds r11, r11, r2\n\t" - "adc r2, r3, lr\n\t" - /* Overflow */ - "lsl r2, r2, #1\n\t" - "orr r2, r2, r11, lsr #31\n\t" - "mul r2, r2, r12\n\t" - "and r11, r11, #0x7fffffff\n\t" - "adds r4, r4, r2\n\t" - "adcs r5, r5, #0\n\t" - "adcs r6, r6, #0\n\t" - "adcs r7, r7, #0\n\t" - "adcs r8, r8, #0\n\t" - "adcs r9, r9, #0\n\t" - "adcs r10, r10, #0\n\t" - "adc r11, r11, #0\n\t" - /* Reduce if top bit set */ - "asr r2, r11, #31\n\t" - "and r2, r2, r12\n\t" - "and r11, r11, #0x7fffffff\n\t" - "adds r4, r4, r2\n\t" + "mul r10, lr, r10\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" "adcs r5, r5, #0\n\t" "adcs r6, r6, #0\n\t" "adcs r7, r7, #0\n\t" - "adcs r8, r8, #0\n\t" - "adcs r9, r9, #0\n\t" - "adcs r10, r10, #0\n\t" - "adc r11, r11, #0\n\t" - /* Store */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r]]\n\t" - "str r5, [%[r], #4]\n\t" -#else - "strd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" -#else - "strd r6, r7, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" -#else - "strd r8, r9, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0x80000000\n\t" #else - "strd r10, r11, [%[r], #24]\n\t" + "bfc r9, #31, #1\n\t" #endif - "add sp, sp, #0x40\n\t" - : [r] "+r" (r), [a] "+r" (a) - : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" - ); -} - -void fe_invert(fe r_p, const fe a_p) -{ - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; - - __asm__ __volatile__ ( - "sub sp, sp, #0x88\n\t" - /* Invert */ - "str %[r], [sp, #128]\n\t" - "str %[a], [sp, #132]\n\t" - "mov r0, sp\n\t" - "ldr r1, [sp, #132]\n\t" - "bl fe_sq\n\t" - "add r0, sp, #32\n\t" - "mov r1, sp\n\t" - "bl fe_sq\n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "add r0, sp, #32\n\t" - "ldr r1, [sp, #132]\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "mov r0, sp\n\t" - "mov r1, sp\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "add r0, sp, #0x40\n\t" - "mov r1, sp\n\t" - "bl fe_sq\n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #32\n\t" - "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "mov r4, #4\n\t" - "\n" - "L_fe_invert1_%=: \n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert1_%=\n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #0x40\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "mov r4, #9\n\t" - "\n" - "L_fe_invert2_%=: \n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert2_%=\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x40\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "add r0, sp, #0x60\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "mov r4, #19\n\t" - "\n" - "L_fe_invert3_%=: \n\t" - "add r0, sp, #0x60\n\t" - "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert3_%=\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x60\n\t" - "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" - "mov r4, #10\n\t" - "\n" - "L_fe_invert4_%=: \n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert4_%=\n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #0x40\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "mov r4, #49\n\t" - "\n" - "L_fe_invert5_%=: \n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert5_%=\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x40\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "add r0, sp, #0x60\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "mov r4, #0x63\n\t" - "\n" - "L_fe_invert6_%=: \n\t" - "add r0, sp, #0x60\n\t" - "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert6_%=\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x60\n\t" - "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" - "mov r4, #50\n\t" - "\n" - "L_fe_invert7_%=: \n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert7_%=\n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #0x40\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "mov r4, #5\n\t" - "\n" - "L_fe_invert8_%=: \n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_fe_invert8_%=\n\t" - "ldr r0, [sp, #128]\n\t" - "add r1, sp, #32\n\t" - "mov r2, sp\n\t" - "bl fe_mul\n\t" - "ldr %[a], [sp, #132]\n\t" - "ldr %[r], [sp, #128]\n\t" - "add sp, sp, #0x88\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "stm %[r], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "lr", "r4" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc" ); } +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#ifndef WC_NO_CACHE_RESISTANT int curve25519(byte* r_p, const byte* n_p, const byte* a_p) { - register byte* r asm ("r0") = r_p; - register const byte* n asm ("r1") = n_p; - register const byte* a asm ("r2") = a_p; + register byte* r asm ("r0") = (byte*)r_p; + register const byte* n asm ("r1") = (const byte*)n_p; + register const byte* a asm ("r2") = (const byte*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0xbc\n\t" @@ -4270,138 +3641,24 @@ "str %[a], [sp, #168]\n\t" "mov %[n], #0\n\t" "str %[n], [sp, #172]\n\t" - /* Set one */ - "mov r10, #1\n\t" - "mov r11, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r]]\n\t" - "str r11, [%[r], #4]\n\t" -#else - "strd r10, r11, [%[r]]\n\t" -#endif - "mov r10, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #8]\n\t" - "str r11, [%[r], #12]\n\t" -#else - "strd r10, r11, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #16]\n\t" - "str r11, [%[r], #20]\n\t" -#else - "strd r10, r11, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" -#else - "strd r10, r11, [%[r], #24]\n\t" -#endif - /* Set zero */ + "mov r4, #1\n\t" + "mov r5, #0\n\t" + "mov r6, #0\n\t" + "mov r7, #0\n\t" + "mov r8, #0\n\t" + "mov r9, #0\n\t" "mov r10, #0\n\t" "mov r11, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp]\n\t" - "str r11, [sp, #4]\n\t" -#else - "strd r10, r11, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #8]\n\t" - "str r11, [sp, #12]\n\t" -#else - "strd r10, r11, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #16]\n\t" - "str r11, [sp, #20]\n\t" -#else - "strd r10, r11, [sp, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #24]\n\t" - "str r11, [sp, #28]\n\t" -#else - "strd r10, r11, [sp, #24]\n\t" -#endif - /* Set one */ - "mov r10, #1\n\t" - "mov r11, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #32]\n\t" - "str r11, [sp, #36]\n\t" -#else - "strd r10, r11, [sp, #32]\n\t" -#endif - "mov r10, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #40]\n\t" - "str r11, [sp, #44]\n\t" -#else - "strd r10, r11, [sp, #40]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #48]\n\t" - "str r11, [sp, #52]\n\t" -#else - "strd r10, r11, [sp, #48]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #56]\n\t" - "str r11, [sp, #60]\n\t" -#else - "strd r10, r11, [sp, #56]\n\t" -#endif + "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "add r3, sp, #32\n\t" + "stm r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "mov r4, #0\n\t" + "mov r3, sp\n\t" + "stm r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "add r3, sp, #0x40\n\t" /* Copy */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[a], #4]\n\t" -#else - "ldrd r4, r5, [%[a]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #8]\n\t" - "ldr r7, [%[a], #12]\n\t" -#else - "ldrd r6, r7, [%[a], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #64]\n\t" - "str r5, [sp, #68]\n\t" -#else - "strd r4, r5, [sp, #64]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #72]\n\t" - "str r7, [sp, #76]\n\t" -#else - "strd r6, r7, [sp, #72]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #20]\n\t" -#else - "ldrd r4, r5, [%[a], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [%[a], #24]\n\t" - "ldr r7, [%[a], #28]\n\t" -#else - "ldrd r6, r7, [%[a], #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #80]\n\t" - "str r5, [sp, #84]\n\t" -#else - "strd r4, r5, [sp, #80]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #88]\n\t" - "str r7, [sp, #92]\n\t" -#else - "strd r6, r7, [sp, #88]\n\t" -#endif + "ldm r2, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "stm r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" "mov %[n], #30\n\t" "str %[n], [sp, #180]\n\t" "mov %[a], #28\n\t" @@ -4421,19 +3678,11 @@ "str %[n], [sp, #172]\n\t" "ldr %[r], [sp, #160]\n\t" /* Conditional Swap */ - "neg %[n], %[n]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r]]\n\t" - "ldr r5, [%[r], #4]\n\t" -#else - "ldrd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #64]\n\t" - "ldr r7, [sp, #68]\n\t" -#else - "ldrd r6, r7, [sp, #64]\n\t" -#endif + "rsb %[n], %[n], #0\n\t" + "mov r3, r0\n\t" + "add r12, sp, #0x40\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4442,30 +3691,10 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r]]\n\t" - "str r5, [%[r], #4]\n\t" -#else - "strd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #64]\n\t" - "str r7, [sp, #68]\n\t" -#else - "strd r6, r7, [sp, #64]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #8]\n\t" - "ldr r5, [%[r], #12]\n\t" -#else - "ldrd r4, r5, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #72]\n\t" - "ldr r7, [sp, #76]\n\t" -#else - "ldrd r6, r7, [sp, #72]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4474,30 +3703,10 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #12]\n\t" -#else - "strd r4, r5, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #72]\n\t" - "str r7, [sp, #76]\n\t" -#else - "strd r6, r7, [sp, #72]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #16]\n\t" - "ldr r5, [%[r], #20]\n\t" -#else - "ldrd r4, r5, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #80]\n\t" - "ldr r7, [sp, #84]\n\t" -#else - "ldrd r6, r7, [sp, #80]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4506,30 +3715,10 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #16]\n\t" - "str r5, [%[r], #20]\n\t" -#else - "strd r4, r5, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #80]\n\t" - "str r7, [sp, #84]\n\t" -#else - "strd r6, r7, [sp, #80]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #24]\n\t" - "ldr r5, [%[r], #28]\n\t" -#else - "ldrd r4, r5, [%[r], #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #88]\n\t" - "ldr r7, [sp, #92]\n\t" -#else - "ldrd r6, r7, [sp, #88]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4538,33 +3727,15 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #24]\n\t" - "str r5, [%[r], #28]\n\t" -#else - "strd r4, r5, [%[r], #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #88]\n\t" - "str r7, [sp, #92]\n\t" -#else - "strd r6, r7, [sp, #88]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" "ldr %[n], [sp, #172]\n\t" /* Conditional Swap */ - "neg %[n], %[n]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" -#else - "ldrd r4, r5, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #32]\n\t" - "ldr r7, [sp, #36]\n\t" -#else - "ldrd r6, r7, [sp, #32]\n\t" -#endif + "rsb %[n], %[n], #0\n\t" + "mov r3, sp\n\t" + "add r12, sp, #32\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4573,30 +3744,10 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp]\n\t" - "str r5, [sp, #4]\n\t" -#else - "strd r4, r5, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #32]\n\t" - "str r7, [sp, #36]\n\t" -#else - "strd r6, r7, [sp, #32]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #8]\n\t" - "ldr r5, [sp, #12]\n\t" -#else - "ldrd r4, r5, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #40]\n\t" - "ldr r7, [sp, #44]\n\t" -#else - "ldrd r6, r7, [sp, #40]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4605,30 +3756,10 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #8]\n\t" - "str r5, [sp, #12]\n\t" -#else - "strd r4, r5, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #40]\n\t" - "str r7, [sp, #44]\n\t" -#else - "strd r6, r7, [sp, #40]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #16]\n\t" - "ldr r5, [sp, #20]\n\t" -#else - "ldrd r4, r5, [sp, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #48]\n\t" - "ldr r7, [sp, #52]\n\t" -#else - "ldrd r6, r7, [sp, #48]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4637,30 +3768,10 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #16]\n\t" - "str r5, [sp, #20]\n\t" -#else - "strd r4, r5, [sp, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #48]\n\t" - "str r7, [sp, #52]\n\t" -#else - "strd r6, r7, [sp, #48]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #24]\n\t" - "ldr r5, [sp, #28]\n\t" -#else - "ldrd r4, r5, [sp, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #56]\n\t" - "ldr r7, [sp, #60]\n\t" -#else - "ldrd r6, r7, [sp, #56]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" + "ldm r3, {r4, r5}\n\t" + "ldm r12, {r6, r7}\n\t" "eor r8, r4, r6\n\t" "eor r9, r5, r7\n\t" "and r8, r8, %[n]\n\t" @@ -4669,1093 +3780,68 @@ "eor r5, r5, r9\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #24]\n\t" - "str r5, [sp, #28]\n\t" -#else - "strd r4, r5, [sp, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #56]\n\t" - "str r7, [sp, #60]\n\t" -#else - "strd r6, r7, [sp, #56]\n\t" -#endif + "stm r3!, {r4, r5}\n\t" + "stm r12!, {r6, r7}\n\t" "ldr %[n], [sp, #184]\n\t" "str %[n], [sp, #172]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r]]\n\t" - "ldr r5, [%[r], #4]\n\t" -#else - "ldrd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp]\n\t" - "ldr r7, [sp, #4]\n\t" -#else - "ldrd r6, r7, [sp]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r]]\n\t" - "str r9, [%[r], #4]\n\t" -#else - "strd r8, r9, [%[r]]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #128]\n\t" - "str r11, [sp, #132]\n\t" -#else - "strd r10, r11, [sp, #128]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #8]\n\t" - "ldr r5, [%[r], #12]\n\t" -#else - "ldrd r4, r5, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #8]\n\t" - "ldr r7, [sp, #12]\n\t" -#else - "ldrd r6, r7, [sp, #8]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #8]\n\t" - "str r9, [%[r], #12]\n\t" -#else - "strd r8, r9, [%[r], #8]\n\t" -#endif - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #136]\n\t" - "str r11, [sp, #140]\n\t" -#else - "strd r10, r11, [sp, #136]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #16]\n\t" - "ldr r5, [%[r], #20]\n\t" -#else - "ldrd r4, r5, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #16]\n\t" - "ldr r7, [sp, #20]\n\t" -#else - "ldrd r6, r7, [sp, #16]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" -#else - "strd r8, r9, [%[r], #16]\n\t" -#endif - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #144]\n\t" - "str r11, [sp, #148]\n\t" -#else - "strd r10, r11, [sp, #144]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #24]\n\t" - "ldr r5, [%[r], #28]\n\t" -#else - "ldrd r4, r5, [%[r], #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #24]\n\t" - "ldr r7, [sp, #28]\n\t" -#else - "ldrd r6, r7, [sp, #24]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r3, #-19\n\t" - "asr %[a], r9, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r]]\n\t" - "ldr r5, [%[r], #4]\n\t" -#else - "ldrd r4, r5, [%[r]]\n\t" -#endif - "subs r4, r4, r3\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r]]\n\t" - "str r5, [%[r], #4]\n\t" -#else - "strd r4, r5, [%[r]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #8]\n\t" - "ldr r5, [%[r], #12]\n\t" -#else - "ldrd r4, r5, [%[r], #8]\n\t" -#endif - "sbcs r4, r4, %[a]\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #12]\n\t" -#else - "strd r4, r5, [%[r], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [%[r], #16]\n\t" - "ldr r5, [%[r], #20]\n\t" -#else - "ldrd r4, r5, [%[r], #16]\n\t" -#endif - "sbcs r4, r4, %[a]\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [%[r], #16]\n\t" - "str r5, [%[r], #20]\n\t" -#else - "strd r4, r5, [%[r], #16]\n\t" -#endif - "sbcs r8, r8, %[a]\n\t" - "sbc r9, r9, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #24]\n\t" - "str r9, [%[r], #28]\n\t" -#else - "strd r8, r9, [%[r], #24]\n\t" -#endif - "mov r3, #-19\n\t" - "asr %[a], r11, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #128]\n\t" - "ldr r5, [sp, #132]\n\t" -#else - "ldrd r4, r5, [sp, #128]\n\t" -#endif - "adds r4, r4, r3\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #128]\n\t" - "str r5, [sp, #132]\n\t" -#else - "strd r4, r5, [sp, #128]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #136]\n\t" - "ldr r5, [sp, #140]\n\t" -#else - "ldrd r4, r5, [sp, #136]\n\t" -#endif - "adcs r4, r4, %[a]\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #136]\n\t" - "str r5, [sp, #140]\n\t" -#else - "strd r4, r5, [sp, #136]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #144]\n\t" - "ldr r5, [sp, #148]\n\t" -#else - "ldrd r4, r5, [sp, #144]\n\t" -#endif - "adcs r4, r4, %[a]\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #144]\n\t" - "str r5, [sp, #148]\n\t" -#else - "strd r4, r5, [sp, #144]\n\t" -#endif - "adcs r10, r10, %[a]\n\t" - "adc r11, r11, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #152]\n\t" - "str r11, [sp, #156]\n\t" -#else - "strd r10, r11, [sp, #152]\n\t" -#endif - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #64]\n\t" - "ldr r5, [sp, #68]\n\t" -#else - "ldrd r4, r5, [sp, #64]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #32]\n\t" - "ldr r7, [sp, #36]\n\t" -#else - "ldrd r6, r7, [sp, #32]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp]\n\t" - "str r9, [sp, #4]\n\t" -#else - "strd r8, r9, [sp]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #96]\n\t" - "str r11, [sp, #100]\n\t" -#else - "strd r10, r11, [sp, #96]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #72]\n\t" - "ldr r5, [sp, #76]\n\t" -#else - "ldrd r4, r5, [sp, #72]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #40]\n\t" - "ldr r7, [sp, #44]\n\t" -#else - "ldrd r6, r7, [sp, #40]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #8]\n\t" - "str r9, [sp, #12]\n\t" -#else - "strd r8, r9, [sp, #8]\n\t" -#endif - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #104]\n\t" - "str r11, [sp, #108]\n\t" -#else - "strd r10, r11, [sp, #104]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #80]\n\t" - "ldr r5, [sp, #84]\n\t" -#else - "ldrd r4, r5, [sp, #80]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #48]\n\t" - "ldr r7, [sp, #52]\n\t" -#else - "ldrd r6, r7, [sp, #48]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #16]\n\t" - "str r9, [sp, #20]\n\t" -#else - "strd r8, r9, [sp, #16]\n\t" -#endif - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #112]\n\t" - "str r11, [sp, #116]\n\t" -#else - "strd r10, r11, [sp, #112]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #88]\n\t" - "ldr r5, [sp, #92]\n\t" -#else - "ldrd r4, r5, [sp, #88]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #56]\n\t" - "ldr r7, [sp, #60]\n\t" -#else - "ldrd r6, r7, [sp, #56]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r3, #-19\n\t" - "asr %[a], r9, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" -#else - "ldrd r4, r5, [sp]\n\t" -#endif - "subs r4, r4, r3\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp]\n\t" - "str r5, [sp, #4]\n\t" -#else - "strd r4, r5, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #8]\n\t" - "ldr r5, [sp, #12]\n\t" -#else - "ldrd r4, r5, [sp, #8]\n\t" -#endif - "sbcs r4, r4, %[a]\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #8]\n\t" - "str r5, [sp, #12]\n\t" -#else - "strd r4, r5, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #16]\n\t" - "ldr r5, [sp, #20]\n\t" -#else - "ldrd r4, r5, [sp, #16]\n\t" -#endif - "sbcs r4, r4, %[a]\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #16]\n\t" - "str r5, [sp, #20]\n\t" -#else - "strd r4, r5, [sp, #16]\n\t" -#endif - "sbcs r8, r8, %[a]\n\t" - "sbc r9, r9, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #24]\n\t" - "str r9, [sp, #28]\n\t" -#else - "strd r8, r9, [sp, #24]\n\t" -#endif - "mov r3, #-19\n\t" - "asr %[a], r11, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #96]\n\t" - "ldr r5, [sp, #100]\n\t" -#else - "ldrd r4, r5, [sp, #96]\n\t" -#endif - "adds r4, r4, r3\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #96]\n\t" - "str r5, [sp, #100]\n\t" -#else - "strd r4, r5, [sp, #96]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #104]\n\t" - "ldr r5, [sp, #108]\n\t" -#else - "ldrd r4, r5, [sp, #104]\n\t" -#endif - "adcs r4, r4, %[a]\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #104]\n\t" - "str r5, [sp, #108]\n\t" -#else - "strd r4, r5, [sp, #104]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #112]\n\t" - "ldr r5, [sp, #116]\n\t" -#else - "ldrd r4, r5, [sp, #112]\n\t" -#endif - "adcs r4, r4, %[a]\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #112]\n\t" - "str r5, [sp, #116]\n\t" -#else - "strd r4, r5, [sp, #112]\n\t" -#endif - "adcs r10, r10, %[a]\n\t" - "adc r11, r11, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #120]\n\t" - "str r11, [sp, #124]\n\t" -#else - "strd r10, r11, [sp, #120]\n\t" -#endif + "mov r3, sp\n\t" + "ldr r2, [sp, #160]\n\t" + "add r1, sp, #0x80\n\t" + "ldr r0, [sp, #160]\n\t" + "bl fe_add_sub_op\n\t" + "add r3, sp, #32\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0x60\n\t" + "mov r0, sp\n\t" + "bl fe_add_sub_op\n\t" "ldr r2, [sp, #160]\n\t" "add r1, sp, #0x60\n\t" "add r0, sp, #32\n\t" - "bl fe_mul\n\t" + "bl fe_mul_op\n\t" "add r2, sp, #0x80\n\t" - "add r1, sp, #0\n\t" - "add r0, sp, #0\n\t" - "bl fe_mul\n\t" + "mov r1, sp\n\t" + "mov r0, sp\n\t" + "bl fe_mul_op\n\t" "add r1, sp, #0x80\n\t" - "add r0, sp, #0x60\n\t" - "bl fe_sq\n\t" - "ldr r1, [sp, #160]\n\t" "add r0, sp, #0x80\n\t" - "bl fe_sq\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #32]\n\t" - "ldr r5, [sp, #36]\n\t" -#else - "ldrd r4, r5, [sp, #32]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp]\n\t" - "ldr r7, [sp, #4]\n\t" -#else - "ldrd r6, r7, [sp]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #64]\n\t" - "str r9, [sp, #68]\n\t" -#else - "strd r8, r9, [sp, #64]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp]\n\t" - "str r11, [sp, #4]\n\t" -#else - "strd r10, r11, [sp]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #40]\n\t" - "ldr r5, [sp, #44]\n\t" -#else - "ldrd r4, r5, [sp, #40]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #8]\n\t" - "ldr r7, [sp, #12]\n\t" -#else - "ldrd r6, r7, [sp, #8]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #72]\n\t" - "str r9, [sp, #76]\n\t" -#else - "strd r8, r9, [sp, #72]\n\t" -#endif - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #8]\n\t" - "str r11, [sp, #12]\n\t" -#else - "strd r10, r11, [sp, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #48]\n\t" - "ldr r5, [sp, #52]\n\t" -#else - "ldrd r4, r5, [sp, #48]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #16]\n\t" - "ldr r7, [sp, #20]\n\t" -#else - "ldrd r6, r7, [sp, #16]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r3, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #80]\n\t" - "str r9, [sp, #84]\n\t" -#else - "strd r8, r9, [sp, #80]\n\t" -#endif - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov r12, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #16]\n\t" - "str r11, [sp, #20]\n\t" -#else - "strd r10, r11, [sp, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #56]\n\t" - "ldr r5, [sp, #60]\n\t" -#else - "ldrd r4, r5, [sp, #56]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #24]\n\t" - "ldr r7, [sp, #28]\n\t" -#else - "ldrd r6, r7, [sp, #24]\n\t" -#endif - "adds r3, r3, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds r12, r12, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r3, #-19\n\t" - "asr %[a], r9, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #64]\n\t" - "ldr r5, [sp, #68]\n\t" -#else - "ldrd r4, r5, [sp, #64]\n\t" -#endif - "subs r4, r4, r3\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #64]\n\t" - "str r5, [sp, #68]\n\t" -#else - "strd r4, r5, [sp, #64]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #72]\n\t" - "ldr r5, [sp, #76]\n\t" -#else - "ldrd r4, r5, [sp, #72]\n\t" -#endif - "sbcs r4, r4, %[a]\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #72]\n\t" - "str r5, [sp, #76]\n\t" -#else - "strd r4, r5, [sp, #72]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #80]\n\t" - "ldr r5, [sp, #84]\n\t" -#else - "ldrd r4, r5, [sp, #80]\n\t" -#endif - "sbcs r4, r4, %[a]\n\t" - "sbcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #80]\n\t" - "str r5, [sp, #84]\n\t" -#else - "strd r4, r5, [sp, #80]\n\t" -#endif - "sbcs r8, r8, %[a]\n\t" - "sbc r9, r9, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #88]\n\t" - "str r9, [sp, #92]\n\t" -#else - "strd r8, r9, [sp, #88]\n\t" -#endif - "mov r3, #-19\n\t" - "asr %[a], r11, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" -#else - "ldrd r4, r5, [sp]\n\t" -#endif - "adds r4, r4, r3\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp]\n\t" - "str r5, [sp, #4]\n\t" -#else - "strd r4, r5, [sp]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #8]\n\t" - "ldr r5, [sp, #12]\n\t" -#else - "ldrd r4, r5, [sp, #8]\n\t" -#endif - "adcs r4, r4, %[a]\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #8]\n\t" - "str r5, [sp, #12]\n\t" -#else - "strd r4, r5, [sp, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #16]\n\t" - "ldr r5, [sp, #20]\n\t" -#else - "ldrd r4, r5, [sp, #16]\n\t" -#endif - "adcs r4, r4, %[a]\n\t" - "adcs r5, r5, %[a]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #16]\n\t" - "str r5, [sp, #20]\n\t" -#else - "strd r4, r5, [sp, #16]\n\t" -#endif - "adcs r10, r10, %[a]\n\t" - "adc r11, r11, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #24]\n\t" - "str r11, [sp, #28]\n\t" -#else - "strd r10, r11, [sp, #24]\n\t" -#endif - "add r2, sp, #0x60\n\t" - "add r1, sp, #0x80\n\t" + "bl fe_sq_op\n\t" + "ldr r1, [sp, #160]\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r3, sp\n\t" + "add r2, sp, #32\n\t" + "mov r1, sp\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_add_sub_op\n\t" + "add r2, sp, #0x80\n\t" + "add r1, sp, #0x60\n\t" "ldr r0, [sp, #160]\n\t" - "bl fe_mul\n\t" - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #128]\n\t" - "ldr r5, [sp, #132]\n\t" -#else - "ldrd r4, r5, [sp, #128]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #136]\n\t" - "ldr r7, [sp, #140]\n\t" -#else - "ldrd r6, r7, [sp, #136]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #96]\n\t" - "ldr r9, [sp, #100]\n\t" -#else - "ldrd r8, r9, [sp, #96]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #104]\n\t" - "ldr r11, [sp, #108]\n\t" -#else - "ldrd r10, r11, [sp, #104]\n\t" -#endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #128]\n\t" - "str r9, [sp, #132]\n\t" -#else - "strd r8, r9, [sp, #128]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #136]\n\t" - "str r11, [sp, #140]\n\t" -#else - "strd r10, r11, [sp, #136]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #144]\n\t" - "ldr r5, [sp, #148]\n\t" -#else - "ldrd r4, r5, [sp, #144]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #152]\n\t" - "ldr r7, [sp, #156]\n\t" -#else - "ldrd r6, r7, [sp, #152]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #112]\n\t" - "ldr r9, [sp, #116]\n\t" -#else - "ldrd r8, r9, [sp, #112]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #120]\n\t" - "ldr r11, [sp, #124]\n\t" -#else - "ldrd r10, r11, [sp, #120]\n\t" -#endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r3, #-19\n\t" - "asr %[a], r11, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #128]\n\t" - "ldr r5, [sp, #132]\n\t" -#else - "ldrd r4, r5, [sp, #128]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #136]\n\t" - "ldr r7, [sp, #140]\n\t" -#else - "ldrd r6, r7, [sp, #136]\n\t" -#endif - "adds r4, r4, r3\n\t" - "adcs r5, r5, %[a]\n\t" - "adcs r6, r6, %[a]\n\t" - "adcs r7, r7, %[a]\n\t" - "adcs r8, r8, %[a]\n\t" - "adcs r9, r9, %[a]\n\t" - "adcs r10, r10, %[a]\n\t" - "adc r11, r11, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #128]\n\t" - "str r5, [sp, #132]\n\t" -#else - "strd r4, r5, [sp, #128]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #136]\n\t" - "str r7, [sp, #140]\n\t" -#else - "strd r6, r7, [sp, #136]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #144]\n\t" - "str r9, [sp, #148]\n\t" -#else - "strd r8, r9, [sp, #144]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #152]\n\t" - "str r11, [sp, #156]\n\t" -#else - "strd r10, r11, [sp, #152]\n\t" -#endif - "add r1, sp, #0\n\t" - "add r0, sp, #0\n\t" - "bl fe_sq\n\t" - /* Multiply by 121666 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #128]\n\t" - "ldr r5, [sp, #132]\n\t" -#else - "ldrd r4, r5, [sp, #128]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #136]\n\t" - "ldr r7, [sp, #140]\n\t" -#else - "ldrd r6, r7, [sp, #136]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #144]\n\t" - "ldr r9, [sp, #148]\n\t" -#else - "ldrd r8, r9, [sp, #144]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #152]\n\t" - "ldr r11, [sp, #156]\n\t" -#else - "ldrd r10, r11, [sp, #152]\n\t" -#endif - "movw r12, #0xdb42\n\t" - "movt r12, #1\n\t" - "umull r4, %[a], r4, r12\n\t" - "umull r5, r3, r5, r12\n\t" - "adds r5, r5, %[a]\n\t" - "adc %[a], r3, #0\n\t" - "umull r6, r3, r6, r12\n\t" - "adds r6, r6, %[a]\n\t" - "adc %[a], r3, #0\n\t" - "umull r7, r3, r7, r12\n\t" - "adds r7, r7, %[a]\n\t" - "adc %[a], r3, #0\n\t" - "umull r8, r3, r8, r12\n\t" - "adds r8, r8, %[a]\n\t" - "adc %[a], r3, #0\n\t" - "umull r9, r3, r9, r12\n\t" - "adds r9, r9, %[a]\n\t" - "adc %[a], r3, #0\n\t" - "umull r10, r3, r10, r12\n\t" - "adds r10, r10, %[a]\n\t" - "adc %[a], r3, #0\n\t" - "umull r11, r3, r11, r12\n\t" - "adds r11, r11, %[a]\n\t" - "adc %[a], r3, #0\n\t" - "mov r12, #19\n\t" - "lsl %[a], %[a], #1\n\t" - "orr %[a], %[a], r11, lsr #31\n\t" - "mul %[a], %[a], r12\n\t" - "and r11, r11, #0x7fffffff\n\t" - "adds r4, r4, %[a]\n\t" - "adcs r5, r5, #0\n\t" - "adcs r6, r6, #0\n\t" - "adcs r7, r7, #0\n\t" - "adcs r8, r8, #0\n\t" - "adcs r9, r9, #0\n\t" - "adcs r10, r10, #0\n\t" - "adc r11, r11, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #32]\n\t" - "str r5, [sp, #36]\n\t" -#else - "strd r4, r5, [sp, #32]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #40]\n\t" - "str r7, [sp, #44]\n\t" -#else - "strd r6, r7, [sp, #40]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #48]\n\t" - "str r9, [sp, #52]\n\t" -#else - "strd r8, r9, [sp, #48]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #56]\n\t" - "str r11, [sp, #60]\n\t" -#else - "strd r10, r11, [sp, #56]\n\t" -#endif + "bl fe_mul_op\n\t" + "add r2, sp, #0x80\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sub_op\n\t" + "mov r1, sp\n\t" + "mov r0, sp\n\t" + "bl fe_sq_op\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul121666\n\t" "add r1, sp, #0x40\n\t" "add r0, sp, #0x40\n\t" - "bl fe_sq\n\t" - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #96]\n\t" - "ldr r5, [sp, #100]\n\t" -#else - "ldrd r4, r5, [sp, #96]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #104]\n\t" - "ldr r7, [sp, #108]\n\t" -#else - "ldrd r6, r7, [sp, #104]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #32]\n\t" - "ldr r9, [sp, #36]\n\t" -#else - "ldrd r8, r9, [sp, #32]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #40]\n\t" - "ldr r11, [sp, #44]\n\t" -#else - "ldrd r10, r11, [sp, #40]\n\t" -#endif - "adds r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #96]\n\t" - "str r9, [sp, #100]\n\t" -#else - "strd r8, r9, [sp, #96]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #104]\n\t" - "str r11, [sp, #108]\n\t" -#else - "strd r10, r11, [sp, #104]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #112]\n\t" - "ldr r5, [sp, #116]\n\t" -#else - "ldrd r4, r5, [sp, #112]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #120]\n\t" - "ldr r7, [sp, #124]\n\t" -#else - "ldrd r6, r7, [sp, #120]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [sp, #48]\n\t" - "ldr r9, [sp, #52]\n\t" -#else - "ldrd r8, r9, [sp, #48]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [sp, #56]\n\t" - "ldr r11, [sp, #60]\n\t" -#else - "ldrd r10, r11, [sp, #56]\n\t" -#endif - "adcs r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adc r11, r7, r11\n\t" - "mov r3, #-19\n\t" - "asr %[a], r11, #31\n\t" - /* Mask the modulus */ - "and r3, %[a], r3\n\t" - "and r12, %[a], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [sp, #96]\n\t" - "ldr r5, [sp, #100]\n\t" -#else - "ldrd r4, r5, [sp, #96]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [sp, #104]\n\t" - "ldr r7, [sp, #108]\n\t" -#else - "ldrd r6, r7, [sp, #104]\n\t" -#endif - "subs r4, r4, r3\n\t" - "sbcs r5, r5, %[a]\n\t" - "sbcs r6, r6, %[a]\n\t" - "sbcs r7, r7, %[a]\n\t" - "sbcs r8, r8, %[a]\n\t" - "sbcs r9, r9, %[a]\n\t" - "sbcs r10, r10, %[a]\n\t" - "sbc r11, r11, r12\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [sp, #96]\n\t" - "str r5, [sp, #100]\n\t" -#else - "strd r4, r5, [sp, #96]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [sp, #104]\n\t" - "str r7, [sp, #108]\n\t" -#else - "strd r6, r7, [sp, #104]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [sp, #112]\n\t" - "str r9, [sp, #116]\n\t" -#else - "strd r8, r9, [sp, #112]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [sp, #120]\n\t" - "str r11, [sp, #124]\n\t" -#else - "strd r10, r11, [sp, #120]\n\t" -#endif - "add r2, sp, #0\n\t" + "bl fe_sq_op\n\t" + "add r2, sp, #32\n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x80\n\t" + "bl fe_add_op\n\t" + "mov r2, sp\n\t" "ldr r1, [sp, #168]\n\t" "add r0, sp, #32\n\t" - "bl fe_mul\n\t" - "add r2, sp, #0x60\n\t" - "add r1, sp, #0x80\n\t" - "add r0, sp, #0\n\t" - "bl fe_mul\n\t" + "bl fe_mul_op\n\t" + "add r2, sp, #0x80\n\t" + "add r1, sp, #0x60\n\t" + "mov r0, sp\n\t" + "bl fe_mul_op\n\t" "ldr %[a], [sp, #176]\n\t" "ldr %[n], [sp, #180]\n\t" "subs %[n], %[n], #1\n\t" @@ -5767,1596 +3853,1740 @@ "str %[a], [sp, #176]\n\t" "bge L_curve25519_words_%=\n\t" /* Invert */ - "add r0, sp, #32\n\t" "add r1, sp, #0\n\t" - "bl fe_sq\n\t" - "add r0, sp, #0x40\n\t" + "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" "add r1, sp, #32\n\t" - "bl fe_sq\n\t" "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" + "add r2, sp, #0x40\n\t" "add r1, sp, #0\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" + "add r1, sp, #32\n\t" "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" "add r1, sp, #32\n\t" - "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" "add r0, sp, #0x60\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" + "bl fe_sq_op\n\t" + "add r2, sp, #0x60\n\t" + "add r1, sp, #0x40\n\t" "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" "add r1, sp, #0x40\n\t" - "add r2, sp, #0x60\n\t" - "bl fe_mul\n\t" "add r0, sp, #0x60\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "mov r4, #4\n\t" + "bl fe_sq_op\n\t" + "mov r12, #4\n\t" "\n" "L_curve25519_inv_1_%=: \n\t" - "add r0, sp, #0x60\n\t" "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_curve25519_inv_1_%=\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0x60\n\t" "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r12, #9\n\t" + "\n" + "L_curve25519_inv_2_%=: \n\t" "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_2_%=\n\t" "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" + "add r1, sp, #0x60\n\t" "add r0, sp, #0x60\n\t" - "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "mov r4, #9\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x80\n\t" + "bl fe_sq_op\n\t" + "mov r12, #19\n\t" "\n" - "L_curve25519_inv_2_%=: \n\t" + "L_curve25519_inv_3_%=: \n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x80\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_3_%=\n\t" + "add r2, sp, #0x60\n\t" + "add r1, sp, #0x80\n\t" "add r0, sp, #0x60\n\t" + "bl fe_mul_op\n\t" + "mov r12, #10\n\t" + "\n" + "L_curve25519_inv_4_%=: \n\t" "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_curve25519_inv_2_%=\n\t" "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_4_%=\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r12, #49\n\t" + "\n" + "L_curve25519_inv_5_%=: \n\t" "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_5_%=\n\t" "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x80\n\t" + "bl fe_sq_op\n\t" + "mov r12, #0x63\n\t" + "\n" + "L_curve25519_inv_6_%=: \n\t" + "add r1, sp, #0x80\n\t" "add r0, sp, #0x80\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_6_%=\n\t" + "add r2, sp, #0x60\n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_mul_op\n\t" + "mov r12, #50\n\t" + "\n" + "L_curve25519_inv_7_%=: \n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_7_%=\n\t" + "add r2, sp, #0x40\n\t" "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "mov r4, #19\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "mov r12, #5\n\t" "\n" - "L_curve25519_inv_3_%=: \n\t" + "L_curve25519_inv_8_%=: \n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_8_%=\n\t" + "add r2, sp, #32\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0\n\t" + "bl fe_mul_op\n\t" + "mov r2, sp\n\t" + "ldr r1, [sp, #160]\n\t" + "ldr r0, [sp, #160]\n\t" + "bl fe_mul_op\n\t" + "mov r0, #0\n\t" + "add sp, sp, #0xbc\n\t" + : [r] "+r" (r), [n] "+r" (n), [a] "+r" (a) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "lr", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +int curve25519(byte* r_p, const byte* n_p, const byte* a_p) +{ + register byte* r asm ("r0") = (byte*)r_p; + register const byte* n asm ("r1") = (const byte*)n_p; + register const byte* a asm ("r2") = (const byte*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0xc0\n\t" + "str %[r], [sp, #176]\n\t" + "str %[n], [sp, #160]\n\t" + "str %[a], [sp, #172]\n\t" + "add r5, sp, #0x40\n\t" + "add r4, sp, #32\n\t" + "str sp, [sp, #184]\n\t" + "str r5, [sp, #180]\n\t" + "str r4, [sp, #188]\n\t" + "mov %[n], #0\n\t" + "str %[n], [sp, #164]\n\t" + "mov r4, #1\n\t" + "mov r5, #0\n\t" + "mov r6, #0\n\t" + "mov r7, #0\n\t" + "mov r8, #0\n\t" + "mov r9, #0\n\t" + "mov r10, #0\n\t" + "mov r11, #0\n\t" + "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "add r3, sp, #32\n\t" + "stm r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "mov r4, #0\n\t" + "mov r3, sp\n\t" + "stm r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "add r3, sp, #0x40\n\t" + /* Copy */ + "ldm r2, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "stm r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "mov %[a], #0xfe\n\t" + "\n" + "L_curve25519_bits_%=: \n\t" + "str %[a], [sp, #168]\n\t" + "ldr %[n], [sp, #160]\n\t" + "and r4, %[a], #31\n\t" + "lsr %[a], %[a], #5\n\t" + "ldr %[a], [%[n], r2, lsl #2]\n\t" + "rsb r4, r4, #31\n\t" + "lsl %[a], %[a], r4\n\t" + "ldr %[n], [sp, #164]\n\t" + "eor %[n], %[n], %[a]\n\t" + "asr %[n], %[n], #31\n\t" + "str %[a], [sp, #164]\n\t" + /* Conditional Swap */ + "add r11, sp, #0xb0\n\t" + "ldm r11, {r4, r5, r6, r7}\n\t" + "eor r8, r4, r5\n\t" + "eor r9, r6, r7\n\t" + "and r8, r8, %[n]\n\t" + "and r9, r9, %[n]\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r8\n\t" + "eor r6, r6, r9\n\t" + "eor r7, r7, r9\n\t" + "stm r11, {r4, r5, r6, r7}\n\t" + /* Ladder step */ + "ldr r3, [sp, #184]\n\t" + "ldr r2, [sp, #176]\n\t" + "add r1, sp, #0x80\n\t" + "ldr r0, [sp, #176]\n\t" + "bl fe_add_sub_op\n\t" + "ldr r3, [sp, #188]\n\t" + "ldr r2, [sp, #180]\n\t" + "add r1, sp, #0x60\n\t" + "ldr r0, [sp, #184]\n\t" + "bl fe_add_sub_op\n\t" + "ldr r2, [sp, #176]\n\t" + "add r1, sp, #0x60\n\t" + "ldr r0, [sp, #188]\n\t" + "bl fe_mul_op\n\t" + "add r2, sp, #0x80\n\t" + "ldr r1, [sp, #184]\n\t" + "ldr r0, [sp, #184]\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "ldr r1, [sp, #176]\n\t" "add r0, sp, #0x80\n\t" + "bl fe_sq_op\n\t" + "ldr r3, [sp, #184]\n\t" + "ldr r2, [sp, #188]\n\t" + "ldr r1, [sp, #184]\n\t" + "ldr r0, [sp, #180]\n\t" + "bl fe_add_sub_op\n\t" + "add r2, sp, #0x60\n\t" "add r1, sp, #0x80\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_curve25519_inv_3_%=\n\t" + "ldr r0, [sp, #176]\n\t" + "bl fe_mul_op\n\t" + "add r2, sp, #0x60\n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x80\n\t" + "bl fe_sub_op\n\t" + "ldr r1, [sp, #184]\n\t" + "ldr r0, [sp, #184]\n\t" + "bl fe_sq_op\n\t" + "add r1, sp, #0x80\n\t" + "ldr r0, [sp, #188]\n\t" + "bl fe_mul121666\n\t" + "ldr r1, [sp, #180]\n\t" + "ldr r0, [sp, #180]\n\t" + "bl fe_sq_op\n\t" + "ldr r2, [sp, #188]\n\t" + "add r1, sp, #0x60\n\t" "add r0, sp, #0x60\n\t" + "bl fe_add_op\n\t" + "ldr r2, [sp, #184]\n\t" + "ldr r1, [sp, #172]\n\t" + "ldr r0, [sp, #188]\n\t" + "bl fe_mul_op\n\t" + "add r2, sp, #0x60\n\t" "add r1, sp, #0x80\n\t" + "ldr r0, [sp, #184]\n\t" + "bl fe_mul_op\n\t" + "ldr %[a], [sp, #168]\n\t" + "subs %[a], %[a], #1\n\t" + "bge L_curve25519_bits_%=\n\t" + "ldr %[n], [sp, #184]\n\t" + /* Copy */ + "ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "stm sp, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Invert */ + "add r1, sp, #0\n\t" + "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" "add r2, sp, #0x60\n\t" - "bl fe_mul\n\t" - "mov r4, #10\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r12, #4\n\t" "\n" - "L_curve25519_inv_4_%=: \n\t" + "L_curve25519_inv_1_%=: \n\t" + "add r1, sp, #0x60\n\t" "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_1_%=\n\t" + "add r2, sp, #0x40\n\t" "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" - "bne L_curve25519_inv_4_%=\n\t" "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r12, #9\n\t" + "\n" + "L_curve25519_inv_2_%=: \n\t" "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_2_%=\n\t" "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" + "add r1, sp, #0x60\n\t" "add r0, sp, #0x60\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x80\n\t" + "bl fe_sq_op\n\t" + "mov r12, #19\n\t" + "\n" + "L_curve25519_inv_3_%=: \n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x80\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_3_%=\n\t" + "add r2, sp, #0x60\n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_mul_op\n\t" + "mov r12, #10\n\t" + "\n" + "L_curve25519_inv_4_%=: \n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_curve25519_inv_4_%=\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "mov r4, #49\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r12, #49\n\t" "\n" "L_curve25519_inv_5_%=: \n\t" - "add r0, sp, #0x60\n\t" "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_curve25519_inv_5_%=\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0x60\n\t" "add r0, sp, #0x60\n\t" + "bl fe_mul_op\n\t" "add r1, sp, #0x60\n\t" - "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" "add r0, sp, #0x80\n\t" - "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "mov r4, #0x63\n\t" + "bl fe_sq_op\n\t" + "mov r12, #0x63\n\t" "\n" "L_curve25519_inv_6_%=: \n\t" - "add r0, sp, #0x80\n\t" "add r1, sp, #0x80\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #0x80\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_curve25519_inv_6_%=\n\t" - "add r0, sp, #0x60\n\t" - "add r1, sp, #0x80\n\t" "add r2, sp, #0x60\n\t" - "bl fe_mul\n\t" - "mov r4, #50\n\t" + "add r1, sp, #0x80\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_mul_op\n\t" + "mov r12, #50\n\t" "\n" "L_curve25519_inv_7_%=: \n\t" - "add r0, sp, #0x60\n\t" "add r1, sp, #0x60\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_curve25519_inv_7_%=\n\t" - "add r0, sp, #0x40\n\t" - "add r1, sp, #0x60\n\t" "add r2, sp, #0x40\n\t" - "bl fe_mul\n\t" - "mov r4, #5\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "mov r12, #5\n\t" "\n" "L_curve25519_inv_8_%=: \n\t" - "add r0, sp, #0x40\n\t" "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_curve25519_inv_8_%=\n\t" - "add r0, sp, #0\n\t" - "add r1, sp, #0x40\n\t" "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "add r2, sp, #0\n\t" - "ldr r1, [sp, #160]\n\t" - "ldr r0, [sp, #160]\n\t" - "bl fe_mul\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0\n\t" + "bl fe_mul_op\n\t" + "ldr r2, [sp, #184]\n\t" + "ldr r1, [sp, #176]\n\t" + "ldr r0, [sp, #176]\n\t" + "bl fe_mul_op\n\t" + /* Ensure result is less than modulus */ + "ldr %[r], [sp, #176]\n\t" + "ldm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "mov %[a], #19\n\t" + "and %[a], %[a], r11, asr #31\n\t" + "adds r4, r4, %[a]\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0x80000000\n\t" +#else + "bfc r11, #31, #1\n\t" +#endif + "adcs r10, r10, #0\n\t" + "adc r11, r11, #0\n\t" + "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" "mov r0, #0\n\t" - "add sp, sp, #0xbc\n\t" + "add sp, sp, #0xc0\n\t" : [r] "+r" (r), [n] "+r" (n), [a] "+r" (a) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "lr", "cc" ); return (uint32_t)(size_t)r; } +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_CURVE25519 */ +#ifdef HAVE_ED25519 +void fe_invert(fe r_p, const fe a_p) +{ + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x88\n\t" + /* Invert */ + "str %[r], [sp, #128]\n\t" + "str %[a], [sp, #132]\n\t" + "ldr r1, [sp, #132]\n\t" + "mov r0, sp\n\t" + "bl fe_sq_op\n\t" + "mov r1, sp\n\t" + "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" + "add r2, sp, #32\n\t" + "ldr r1, [sp, #132]\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "add r2, sp, #32\n\t" + "mov r1, sp\n\t" + "mov r0, sp\n\t" + "bl fe_mul_op\n\t" + "mov r1, sp\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" + "mov r12, #4\n\t" + "\n" + "L_fe_invert1_%=: \n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert1_%=\n\t" + "add r2, sp, #32\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" + "mov r12, #9\n\t" + "\n" + "L_fe_invert2_%=: \n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert2_%=\n\t" + "add r2, sp, #32\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r12, #19\n\t" + "\n" + "L_fe_invert3_%=: \n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert3_%=\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "mov r12, #10\n\t" + "\n" + "L_fe_invert4_%=: \n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert4_%=\n\t" + "add r2, sp, #32\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_sq_op\n\t" + "mov r12, #49\n\t" + "\n" + "L_fe_invert5_%=: \n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert5_%=\n\t" + "add r2, sp, #32\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x60\n\t" + "bl fe_sq_op\n\t" + "mov r12, #0x63\n\t" + "\n" + "L_fe_invert6_%=: \n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x60\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert6_%=\n\t" + "add r2, sp, #0x40\n\t" + "add r1, sp, #0x60\n\t" + "add r0, sp, #0x40\n\t" + "bl fe_mul_op\n\t" + "mov r12, #50\n\t" + "\n" + "L_fe_invert7_%=: \n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert7_%=\n\t" + "add r2, sp, #32\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "mov r12, #5\n\t" + "\n" + "L_fe_invert8_%=: \n\t" + "add r1, sp, #32\n\t" + "add r0, sp, #32\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" + "bne L_fe_invert8_%=\n\t" + "mov r2, sp\n\t" + "add r1, sp, #32\n\t" + "ldr r0, [sp, #128]\n\t" + "bl fe_mul_op\n\t" + "ldr %[a], [sp, #132]\n\t" + "ldr %[r], [sp, #128]\n\t" + "add sp, sp, #0x88\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "lr", "r12", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) +void fe_sq2(fe r_p, const fe a_p) +{ + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str r0, [sp, #64]\n\t" + /* Square * 2 */ + "mov r0, #0\n\t" + "ldr r12, [r1]\n\t" + /* A[0] * A[1] */ + "ldr lr, [r1, #4]\n\t" + "umull r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "ldr lr, [r1, #12]\n\t" + "umull r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "umull r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "umull r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "ldr lr, [r1, #8]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[0] * A[4] */ + "ldr lr, [r1, #16]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[0] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + "adcs r3, r3, #0\n\t" + "str r4, [sp, #4]\n\t" + "str r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "ldr r12, [r1, #4]\n\t" + "ldr lr, [r1, #8]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * A[3] */ + "ldr lr, [r1, #12]\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * A[4] */ + "ldr lr, [r1, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r4, r0, #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "ldr r12, [r1, #8]\n\t" + "ldr lr, [r1, #12]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * A[4] */ + "ldr lr, [r1, #16]\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r5, r0, #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "ldr r12, [r1, #12]\n\t" + "ldr lr, [r1, #16]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * A[5] */ + "ldr lr, [r1, #20]\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r6, r0, #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "ldr r12, [r1, #16]\n\t" + "ldr lr, [r1, #20]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * A[6] */ + "ldr lr, [r1, #24]\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r7, r0, #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "ldr r12, [r1, #20]\n\t" + "ldr lr, [r1, #24]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * A[7] */ + "ldr lr, [r1, #28]\n\t" + "adc r8, r0, #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "ldr r12, [r1, #24]\n\t" + "ldr lr, [r1, #28]\n\t" + "mov r9, #0\n\t" + "umlal r8, r9, r12, lr\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "adcs r3, r3, r3\n\t" + "adcs r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adc r10, r0, #0\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "mov lr, sp\n\t" + /* A[0] * A[0] */ + "ldr r12, [r1]\n\t" + "umull r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[1] * A[1] */ + "ldr r12, [r1, #4]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * A[2] */ + "ldr r12, [r1, #8]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * A[3] */ + "ldr r12, [r1, #12]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r9, r11, r12, r12\n\t" + "adds r10, r10, r11\n\t" + "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "ldr r12, [r1, #16]\n\t" + "adcs r3, r3, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * A[5] */ + "ldr r12, [r1, #20]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * A[6] */ + "ldr r12, [r1, #24]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * A[7] */ + "ldr r12, [r1, #28]\n\t" + "adcs r9, r9, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r9, r10, r12, r12\n\t" + /* Reduce */ + "ldr r2, [sp, #28]\n\t" + "mov lr, sp\n\t" + "mov r12, #38\n\t" + "umull r10, r11, r12, r10\n\t" + "adds r10, r10, r2\n\t" + "adc r11, r11, #0\n\t" + "mov r12, #19\n\t" + "lsl r11, r11, #1\n\t" + "orr r11, r11, r10, LSR #31\n\t" + "mul r11, r12, r11\n\t" + "ldm lr!, {r1, r2}\n\t" + "mov r12, #38\n\t" + "adds r1, r1, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r1, r11, r3, r12\n\t" + "adds r2, r2, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r2, r11, r4, r12\n\t" + "ldm lr!, {r3, r4}\n\t" + "adds r3, r3, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r3, r11, r5, r12\n\t" + "adds r4, r4, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r4, r11, r6, r12\n\t" + "ldm lr!, {r5, r6}\n\t" + "adds r5, r5, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r5, r11, r7, r12\n\t" + "adds r6, r6, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r6, r11, r8, r12\n\t" + "ldm lr!, {r7, r8}\n\t" + "adds r7, r7, r11\n\t" + "adc r11, r0, #0\n\t" + "umlal r7, r11, r9, r12\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r10, r10, #0x80000000\n\t" +#else + "bfc r10, #31, #1\n\t" +#endif + "adds r8, r10, r11\n\t" + /* Reduce if top bit set */ + "mov r12, #19\n\t" + "and r11, r12, r8, ASR #31\n\t" + "adds r1, r1, r11\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r8, r8, #0x80000000\n\t" +#else + "bfc r8, #31, #1\n\t" +#endif + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + /* Double */ + "adds r1, r1, r1\n\t" + "adcs r2, r2, r2\n\t" + "adcs r3, r3, r3\n\t" + "adcs r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adc r8, r8, r8\n\t" + /* Reduce if top bit set */ + "mov r12, #19\n\t" + "and r11, r12, r8, ASR #31\n\t" + "adds r1, r1, r11\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r8, r8, #0x80000000\n\t" +#else + "bfc r8, #31, #1\n\t" +#endif + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + /* Store */ + "ldr r0, [sp, #64]\n\t" + "stm r0, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "lr", "cc" + ); +} + +#else +void fe_sq2(fe r_p, const fe a_p) +{ + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #36\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r0, [sp, #28]\n\t" + "str r1, [sp, #32]\n\t" +#else + "strd r0, r1, [sp, #28]\n\t" +#endif + "ldm r1, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + /* Square * 2 */ + "umull r9, r10, r0, r0\n\t" + "umull r11, r12, r0, r1\n\t" + "adds r11, r11, r11\n\t" + "mov lr, #0\n\t" + "umaal r10, r11, lr, lr\n\t" + "stm sp, {r9, r10}\n\t" + "mov r8, lr\n\t" + "umaal r8, r12, r0, r2\n\t" + "adcs r8, r8, r8\n\t" + "umaal r8, r11, r1, r1\n\t" + "umull r9, r10, r0, r3\n\t" + "umaal r9, r12, r1, r2\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #8]\n\t" + "str r9, [sp, #12]\n\t" +#else + "strd r8, r9, [sp, #8]\n\t" +#endif + "mov r9, lr\n\t" + "umaal r9, r10, r0, r4\n\t" + "umaal r9, r12, r1, r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r2, r2\n\t" + "str r9, [sp, #16]\n\t" + "umull r9, r8, r0, r5\n\t" + "umaal r9, r12, r1, r4\n\t" + "umaal r9, r10, r2, r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" + "str r9, [sp, #20]\n\t" + "mov r9, lr\n\t" + "umaal r9, r8, r0, r6\n\t" + "umaal r9, r12, r1, r5\n\t" + "umaal r9, r10, r2, r4\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r3, r3\n\t" + "str r9, [sp, #24]\n\t" + "umull r0, r9, r0, r7\n\t" + "umaal r0, r8, r1, r6\n\t" + "umaal r0, r12, r2, r5\n\t" + "umaal r0, r10, r3, r4\n\t" + "adcs r0, r0, r0\n\t" + "umaal r0, r11, lr, lr\n\t" + /* R[7] = r0 */ + "umaal r9, r8, r1, r7\n\t" + "umaal r9, r10, r2, r6\n\t" + "umaal r12, r9, r3, r5\n\t" + "adcs r12, r12, r12\n\t" + "umaal r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "umaal r9, r8, r2, r7\n\t" + "umaal r10, r9, r3, r6\n\t" + "mov r2, lr\n\t" + "umaal r10, r2, r4, r5\n\t" + "adcs r10, r10, r10\n\t" + "umaal r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "umaal r2, r8, r3, r7\n\t" + "umaal r2, r9, r4, r6\n\t" + "adcs r3, r2, r2\n\t" + "umaal r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "mov r1, lr\n\t" + "umaal r1, r8, r4, r7\n\t" + "umaal r1, r9, r5, r6\n\t" + "adcs r4, r1, r1\n\t" + "umaal r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "umaal r8, r9, r5, r7\n\t" + "adcs r8, r8, r8\n\t" + "umaal r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "mov r5, lr\n\t" + "umaal r5, r9, r6, r7\n\t" + "adcs r5, r5, r5\n\t" + "umaal r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "adcs r9, r9, r9\n\t" + "umaal r9, r5, r7, r7\n\t" + "adcs r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + /* Reduce */ + "mov r6, #37\n\t" + "umaal r7, r0, r7, r6\n\t" + "mov r6, #19\n\t" + "lsl r0, r0, #1\n\t" + "orr r0, r0, r7, lsr #31\n\t" + "mul lr, r0, r6\n\t" + "pop {r0-r1}\n\t" + "mov r6, #38\n\t" + "umaal r0, lr, r12, r6\n\t" + "umaal r1, lr, r11, r6\n\t" + "mov r12, r3\n\t" + "mov r11, r4\n\t" + "pop {r2-r4}\n\t" + "umaal r2, lr, r10, r6\n\t" + "umaal r3, lr, r12, r6\n\t" + "umaal r4, lr, r11, r6\n\t" + "mov r12, r6\n\t" + "pop {r5-r6}\n\t" + "umaal r5, lr, r8, r12\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r7, r7, #0x80000000\n\t" +#else + "bfc r7, #31, #1\n\t" +#endif + "umaal r6, lr, r9, r12\n\t" + "add r7, r7, lr\n\t" + /* Reduce if top bit set */ + "mov r11, #19\n\t" + "and r12, r11, r7, ASR #31\n\t" + "adds r0, r0, r12\n\t" + "adcs r1, r1, #0\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r7, r7, #0x80000000\n\t" +#else + "bfc r7, #31, #1\n\t" +#endif + "adcs r6, r6, #0\n\t" + "adc r7, r7, #0\n\t" + /* Double */ + "adds r0, r0, r0\n\t" + "adcs r1, r1, r1\n\t" + "adcs r2, r2, r2\n\t" + "adcs r3, r3, r3\n\t" + "adcs r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adc r7, r7, r7\n\t" + /* Reduce if top bit set */ + "mov r11, #19\n\t" + "and r12, r11, r7, ASR #31\n\t" + "adds r0, r0, r12\n\t" + "adcs r1, r1, #0\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r7, r7, #0x80000000\n\t" +#else + "bfc r7, #31, #1\n\t" +#endif + "adcs r6, r6, #0\n\t" + "adc r7, r7, #0\n\t" + "pop {r12, lr}\n\t" + /* Store */ + "stm r12, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + "mov r0, r12\n\t" + "mov r1, lr\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "lr", "cc" + ); +} + +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ void fe_pow22523(fe r_p, const fe a_p) { - register fe r asm ("r0") = r_p; - register const fe a asm ("r1") = a_p; + register sword32* r asm ("r0") = (sword32*)r_p; + register const sword32* a asm ("r1") = (const sword32*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x68\n\t" /* pow22523 */ "str %[r], [sp, #96]\n\t" "str %[a], [sp, #100]\n\t" - "mov r0, sp\n\t" "ldr r1, [sp, #100]\n\t" - "bl fe_sq\n\t" - "add r0, sp, #32\n\t" + "mov r0, sp\n\t" + "bl fe_sq_op\n\t" "mov r1, sp\n\t" - "bl fe_sq\n\t" "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" "add r1, sp, #32\n\t" - "bl fe_sq\n\t" "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" + "add r2, sp, #32\n\t" "ldr r1, [sp, #100]\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "mov r0, sp\n\t" "mov r1, sp\n\t" - "add r2, sp, #32\n\t" - "bl fe_mul\n\t" "mov r0, sp\n\t" + "bl fe_mul_op\n\t" "mov r1, sp\n\t" - "bl fe_sq\n\t" "mov r0, sp\n\t" - "add r1, sp, #32\n\t" + "bl fe_sq_op\n\t" "mov r2, sp\n\t" - "bl fe_mul\n\t" - "add r0, sp, #32\n\t" + "add r1, sp, #32\n\t" + "mov r0, sp\n\t" + "bl fe_mul_op\n\t" "mov r1, sp\n\t" - "bl fe_sq\n\t" - "mov r4, #4\n\t" + "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" + "mov r12, #4\n\t" "\n" "L_fe_pow22523_1_%=: \n\t" - "add r0, sp, #32\n\t" "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #32\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_1_%=\n\t" - "mov r0, sp\n\t" - "add r1, sp, #32\n\t" "mov r2, sp\n\t" - "bl fe_mul\n\t" - "add r0, sp, #32\n\t" + "add r1, sp, #32\n\t" + "mov r0, sp\n\t" + "bl fe_mul_op\n\t" "mov r1, sp\n\t" - "bl fe_sq\n\t" - "mov r4, #9\n\t" + "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" + "mov r12, #9\n\t" "\n" "L_fe_pow22523_2_%=: \n\t" - "add r0, sp, #32\n\t" "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #32\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_2_%=\n\t" + "mov r2, sp\n\t" + "add r1, sp, #32\n\t" "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" "add r1, sp, #32\n\t" - "mov r2, sp\n\t" - "bl fe_mul\n\t" "add r0, sp, #0x40\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "mov r4, #19\n\t" + "bl fe_sq_op\n\t" + "mov r12, #19\n\t" "\n" "L_fe_pow22523_3_%=: \n\t" - "add r0, sp, #0x40\n\t" "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_3_%=\n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #0x40\n\t" "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "mov r4, #10\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "mov r12, #10\n\t" "\n" "L_fe_pow22523_4_%=: \n\t" - "add r0, sp, #32\n\t" "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #32\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_4_%=\n\t" - "mov r0, sp\n\t" - "add r1, sp, #32\n\t" "mov r2, sp\n\t" - "bl fe_mul\n\t" - "add r0, sp, #32\n\t" + "add r1, sp, #32\n\t" + "mov r0, sp\n\t" + "bl fe_mul_op\n\t" "mov r1, sp\n\t" - "bl fe_sq\n\t" - "mov r4, #49\n\t" + "add r0, sp, #32\n\t" + "bl fe_sq_op\n\t" + "mov r12, #49\n\t" "\n" "L_fe_pow22523_5_%=: \n\t" - "add r0, sp, #32\n\t" "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #32\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_5_%=\n\t" + "mov r2, sp\n\t" + "add r1, sp, #32\n\t" "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" "add r1, sp, #32\n\t" - "mov r2, sp\n\t" - "bl fe_mul\n\t" "add r0, sp, #0x40\n\t" - "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "mov r4, #0x63\n\t" + "bl fe_sq_op\n\t" + "mov r12, #0x63\n\t" "\n" "L_fe_pow22523_6_%=: \n\t" - "add r0, sp, #0x40\n\t" "add r1, sp, #0x40\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #0x40\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_6_%=\n\t" - "add r0, sp, #32\n\t" - "add r1, sp, #0x40\n\t" "add r2, sp, #32\n\t" - "bl fe_mul\n\t" - "mov r4, #50\n\t" + "add r1, sp, #0x40\n\t" + "add r0, sp, #32\n\t" + "bl fe_mul_op\n\t" + "mov r12, #50\n\t" "\n" "L_fe_pow22523_7_%=: \n\t" - "add r0, sp, #32\n\t" "add r1, sp, #32\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "add r0, sp, #32\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_7_%=\n\t" - "mov r0, sp\n\t" - "add r1, sp, #32\n\t" "mov r2, sp\n\t" - "bl fe_mul\n\t" - "mov r4, #2\n\t" + "add r1, sp, #32\n\t" + "mov r0, sp\n\t" + "bl fe_mul_op\n\t" + "mov r12, #2\n\t" "\n" "L_fe_pow22523_8_%=: \n\t" - "mov r0, sp\n\t" "mov r1, sp\n\t" - "bl fe_sq\n\t" - "sub r4, r4, #1\n\t" - "cmp r4, #0\n\t" + "mov r0, sp\n\t" + "push {r12}\n\t" + "bl fe_sq_op\n\t" + "pop {r12}\n\t" + "subs r12, r12, #1\n\t" "bne L_fe_pow22523_8_%=\n\t" - "ldr r0, [sp, #96]\n\t" - "mov r1, sp\n\t" "ldr r2, [sp, #100]\n\t" - "bl fe_mul\n\t" + "mov r1, sp\n\t" + "ldr r0, [sp, #96]\n\t" + "bl fe_mul_op\n\t" "ldr %[a], [sp, #100]\n\t" "ldr %[r], [sp, #96]\n\t" "add sp, sp, #0x68\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "lr", "r4" + : "memory", "lr", "r12", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); } -void fe_ge_to_p2(fe rx_p, fe ry_p, fe rz_p, const fe px_p, const fe py_p, const fe pz_p, const fe pt_p) +void ge_p1p1_to_p2(ge_p2 * r_p, const ge_p1p1 * p_p) { - register fe rx asm ("r0") = rx_p; - register fe ry asm ("r1") = ry_p; - register fe rz asm ("r2") = rz_p; - register const fe px asm ("r3") = px_p; - register const fe py asm ("r4") = py_p; - register const fe pz asm ("r5") = pz_p; - register const fe pt asm ("r6") = pt_p; + register ge_p2 * r asm ("r0") = (ge_p2 *)r_p; + register const ge_p1p1 * p asm ("r1") = (const ge_p1p1 *)p_p; __asm__ __volatile__ ( - "sub sp, sp, #16\n\t" - "str %[rx], [sp]\n\t" - "str %[ry], [sp, #4]\n\t" - "str %[rz], [sp, #8]\n\t" - "str %[px], [sp, #12]\n\t" - "ldr r2, [sp, #28]\n\t" - "ldr r1, [sp, #12]\n\t" + "sub sp, sp, #8\n\t" + "str %[r], [sp]\n\t" + "str %[p], [sp, #4]\n\t" + "add r2, r1, #0x60\n\t" + "bl fe_mul_op\n\t" "ldr r0, [sp]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #24]\n\t" - "ldr r1, [sp, #20]\n\t" - "ldr r0, [sp, #4]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #28]\n\t" - "ldr r1, [sp, #24]\n\t" - "ldr r0, [sp, #8]\n\t" - "bl fe_mul\n\t" - "add sp, sp, #16\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [px] "+r" (px) + "ldr r1, [sp, #4]\n\t" + "add r2, r1, #0x40\n\t" + "add r1, r1, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r1, [sp, #4]\n\t" + "add r2, r1, #0x60\n\t" + "add r1, r1, #0x40\n\t" + "add r0, r0, #0x40\n\t" + "bl fe_mul_op\n\t" + "add sp, sp, #8\n\t" + : [r] "+r" (r), [p] "+r" (p) : - : "memory", "lr" + : "memory", "lr", "r2", "r3", "r12", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - (void)py_p; - (void)pz_p; - (void)pt_p; -} - -void fe_ge_to_p3(fe rx_p, fe ry_p, fe rz_p, fe rt_p, const fe px_p, const fe py_p, const fe pz_p, const fe pt_p) -{ - register fe rx asm ("r0") = rx_p; - register fe ry asm ("r1") = ry_p; - register fe rz asm ("r2") = rz_p; - register fe rt asm ("r3") = rt_p; - register const fe px asm ("r4") = px_p; - register const fe py asm ("r5") = py_p; - register const fe pz asm ("r6") = pz_p; - register const fe pt asm ("r7") = pt_p; - - __asm__ __volatile__ ( - "sub sp, sp, #16\n\t" - "str %[rx], [sp]\n\t" - "str %[ry], [sp, #4]\n\t" - "str %[rz], [sp, #8]\n\t" - "str %[rt], [sp, #12]\n\t" - "ldr r2, [sp, #32]\n\t" - "ldr r1, [sp, #20]\n\t" +} + +void ge_p1p1_to_p3(ge_p3 * r_p, const ge_p1p1 * p_p) +{ + register ge_p3 * r asm ("r0") = (ge_p3 *)r_p; + register const ge_p1p1 * p asm ("r1") = (const ge_p1p1 *)p_p; + + __asm__ __volatile__ ( + "sub sp, sp, #8\n\t" + "str %[r], [sp]\n\t" + "str %[p], [sp, #4]\n\t" + "add r2, r1, #0x60\n\t" + "bl fe_mul_op\n\t" "ldr r0, [sp]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #28]\n\t" - "ldr r1, [sp, #24]\n\t" - "ldr r0, [sp, #4]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #32]\n\t" - "ldr r1, [sp, #28]\n\t" - "ldr r0, [sp, #8]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #24]\n\t" - "ldr r1, [sp, #20]\n\t" - "ldr r0, [sp, #12]\n\t" - "bl fe_mul\n\t" - "add sp, sp, #16\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt) + "ldr r1, [sp, #4]\n\t" + "add r2, r1, #0x40\n\t" + "add r1, r1, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r1, [sp, #4]\n\t" + "add r2, r1, #0x60\n\t" + "add r1, r1, #0x40\n\t" + "add r0, r0, #0x40\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r1, [sp, #4]\n\t" + "add r2, r1, #32\n\t" + "add r0, r0, #0x60\n\t" + "bl fe_mul_op\n\t" + "add sp, sp, #8\n\t" + : [r] "+r" (r), [p] "+r" (p) : - : "memory", "lr" + : "memory", "lr", "r2", "r3", "r12", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - (void)px_p; - (void)py_p; - (void)pz_p; - (void)pt_p; } -void fe_ge_dbl(fe rx_p, fe ry_p, fe rz_p, fe rt_p, const fe px_p, const fe py_p, const fe pz_p) +void ge_p2_dbl(ge_p1p1 * r_p, const ge_p2 * p_p) { - register fe rx asm ("r0") = rx_p; - register fe ry asm ("r1") = ry_p; - register fe rz asm ("r2") = rz_p; - register fe rt asm ("r3") = rt_p; - register const fe px asm ("r4") = px_p; - register const fe py asm ("r5") = py_p; - register const fe pz asm ("r6") = pz_p; + register ge_p1p1 * r asm ("r0") = (ge_p1p1 *)r_p; + register const ge_p2 * p asm ("r1") = (const ge_p2 *)p_p; __asm__ __volatile__ ( - "sub sp, sp, #16\n\t" - "str %[rx], [sp]\n\t" - "str %[ry], [sp, #4]\n\t" - "str %[rz], [sp, #8]\n\t" - "str %[rt], [sp, #12]\n\t" - "ldr r1, [sp, #52]\n\t" + "sub sp, sp, #8\n\t" + "str %[r], [sp]\n\t" + "str %[p], [sp, #4]\n\t" + "bl fe_sq_op\n\t" "ldr r0, [sp]\n\t" - "bl fe_sq\n\t" - "ldr r1, [sp, #56]\n\t" - "ldr r0, [sp, #8]\n\t" - "bl fe_sq\n\t" - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp, #52]\n\t" - "ldr r2, [sp, #56]\n\t" - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "adds r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" -#endif - "adcs r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif "ldr r1, [sp, #4]\n\t" - "ldr r0, [sp, #12]\n\t" - "bl fe_sq\n\t" - "ldr r0, [sp, #4]\n\t" + "add r1, r1, #32\n\t" + "add r0, r0, #0x40\n\t" + "bl fe_sq_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r1, [sp, #4]\n\t" + "add r2, r1, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_add_op\n\t" + "mov r1, r0\n\t" + "add r0, r0, #0x40\n\t" + "bl fe_sq_op\n\t" + "ldr r0, [sp]\n\t" + "mov r3, r0\n\t" + "add r2, r0, #0x40\n\t" + "add r1, r0, #0x40\n\t" + "add r0, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "mov r2, r0\n\t" + "add r1, r0, #0x40\n\t" + "sub r0, r0, #32\n\t" + "bl fe_sub_op\n\t" + "ldr r1, [sp, #4]\n\t" + "add r1, r1, #0x40\n\t" + "add r0, r0, #0x60\n\t" + "bl fe_sq2\n\t" + "sub r2, r0, #32\n\t" + "mov r1, r0\n\t" + "bl fe_sub_op\n\t" + "add sp, sp, #8\n\t" + : [r] "+r" (r), [p] "+r" (p) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +void ge_madd(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_precomp * q_p) +{ + register ge_p1p1 * r asm ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p asm ("r1") = (const ge_p3 *)p_p; + register const ge_precomp * q asm ("r2") = (const ge_precomp *)q_p; + + __asm__ __volatile__ ( + "sub sp, sp, #12\n\t" + "str %[r], [sp]\n\t" + "str %[p], [sp, #4]\n\t" + "str %[q], [sp, #8]\n\t" + "mov r2, r1\n\t" + "add r1, r1, #32\n\t" + "bl fe_add_op\n\t" + "ldr r1, [sp, #4]\n\t" + "mov r2, r1\n\t" + "add r1, r1, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_sub_op\n\t" + "ldr r2, [sp, #8]\n\t" + "sub r1, r0, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r2, [sp, #8]\n\t" + "add r2, r2, #32\n\t" + "add r1, r0, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" "ldr r1, [sp, #8]\n\t" - "ldr r2, [sp]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r2]\n\t" - "ldr r7, [r2, #4]\n\t" -#else - "ldrd r6, r7, [r2]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r2, #8]\n\t" - "ldr r7, [r2, #12]\n\t" -#else - "ldrd r6, r7, [r2, #8]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r2, #16]\n\t" - "ldr r7, [r2, #20]\n\t" -#else - "ldrd r6, r7, [r2, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" + "ldr r2, [sp, #4]\n\t" + "add r2, r2, #0x60\n\t" + "add r1, r1, #0x40\n\t" + "add r0, r0, #0x60\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "add r3, r0, #32\n\t" + "add r2, r0, #0x40\n\t" + "mov r1, r0\n\t" + "add r0, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "ldr r1, [sp, #4]\n\t" + "add r1, r1, #0x40\n\t" + "add r0, r0, #32\n\t" + /* Double */ + "ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" + "adcs r11, r11, r11\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #24]\n\t" - "ldr r5, [r1, #28]\n\t" -#else - "ldrd r4, r5, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r2, #24]\n\t" - "ldr r7, [r2, #28]\n\t" -#else - "ldrd r6, r7, [r2, #24]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" -#else - "ldrd r4, r5, [r0, #8]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" -#else - "strd r4, r5, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" -#else - "strd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" -#else - "strd r8, r9, [r0, #24]\n\t" -#endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif + "mov r12, #19\n\t" + "lsl lr, lr, #1\n\t" + "orr lr, lr, r11, lsr #31\n\t" + "mul r12, lr, r12\n\t" "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" -#else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" -#endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0x80000000\n\t" #else - "strd r10, r11, [r1, #24]\n\t" + "bfc r11, #31, #1\n\t" #endif + "adcs r10, r10, #0\n\t" + "adc r11, r11, #0\n\t" + "stm r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "add r3, r0, #32\n\t" + "add r1, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "add sp, sp, #12\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +void ge_msub(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_precomp * q_p) +{ + register ge_p1p1 * r asm ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p asm ("r1") = (const ge_p3 *)p_p; + register const ge_precomp * q asm ("r2") = (const ge_precomp *)q_p; + + __asm__ __volatile__ ( + "sub sp, sp, #12\n\t" + "str %[r], [sp]\n\t" + "str %[p], [sp, #4]\n\t" + "str %[q], [sp, #8]\n\t" + "mov r2, r1\n\t" + "add r1, r1, #32\n\t" + "bl fe_add_op\n\t" + "ldr r1, [sp, #4]\n\t" + "mov r2, r1\n\t" + "add r1, r1, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_sub_op\n\t" + "ldr r2, [sp, #8]\n\t" + "add r2, r2, #32\n\t" + "sub r1, r0, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r2, [sp, #8]\n\t" + "add r1, r0, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" "ldr r0, [sp]\n\t" - "ldr r1, [sp, #12]\n\t" - "ldr r2, [sp, #4]\n\t" - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" -#endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" - "adcs r6, r6, %[rt]\n\t" - "adcs r7, r7, %[rt]\n\t" - "adcs r8, r8, %[rt]\n\t" - "adcs r9, r9, %[rt]\n\t" - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r1, [sp, #60]\n\t" - "ldr r0, [sp, #12]\n\t" - "bl fe_sq2\n\t" - "ldr r0, [sp, #12]\n\t" "ldr r1, [sp, #8]\n\t" - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r1]\n\t" - "ldr r9, [r1, #4]\n\t" -#else - "ldrd r8, r9, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r1, #8]\n\t" - "ldr r11, [r1, #12]\n\t" -#else - "ldrd r10, r11, [r1, #8]\n\t" -#endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #24]\n\t" - "ldr r7, [r0, #28]\n\t" -#else - "ldrd r6, r7, [r0, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r1, #16]\n\t" - "ldr r9, [r1, #20]\n\t" -#else - "ldrd r8, r9, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r1, #24]\n\t" - "ldr r11, [r1, #28]\n\t" -#else - "ldrd r10, r11, [r1, #24]\n\t" -#endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif + "ldr r2, [sp, #4]\n\t" + "add r2, r2, #0x60\n\t" + "add r1, r1, #0x40\n\t" + "add r0, r0, #0x60\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "add r3, r0, #32\n\t" + "add r2, r0, #0x40\n\t" + "mov r1, r0\n\t" + "add r0, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "ldr r1, [sp, #4]\n\t" + "add r1, r1, #0x40\n\t" + "add r0, r0, #32\n\t" + /* Double */ + "ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "mov lr, #0\n\t" + "adcs r11, r11, r11\n\t" + "adc lr, lr, #0\n\t" + "mov r12, #19\n\t" + "lsl lr, lr, #1\n\t" + "orr lr, lr, r11, lsr #31\n\t" + "mul r12, lr, r12\n\t" "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" - "adcs r6, r6, %[rt]\n\t" - "adcs r7, r7, %[rt]\n\t" - "adcs r8, r8, %[rt]\n\t" - "adcs r9, r9, %[rt]\n\t" - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0x80000000\n\t" #else - "strd r10, r11, [r0, #24]\n\t" + "bfc r11, #31, #1\n\t" #endif - "add sp, sp, #16\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt) + "adcs r10, r10, #0\n\t" + "adc r11, r11, #0\n\t" + "stm r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "add r3, r0, #32\n\t" + "mov r1, r0\n\t" + "add r0, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "add sp, sp, #12\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); - (void)px_p; - (void)py_p; - (void)pz_p; -} - -void fe_ge_madd(fe rx_p, fe ry_p, fe rz_p, fe rt_p, const fe px_p, const fe py_p, const fe pz_p, const fe pt_p, const fe qxy2d_p, const fe qyplusx_p, const fe qyminusx_p) -{ - register fe rx asm ("r0") = rx_p; - register fe ry asm ("r1") = ry_p; - register fe rz asm ("r2") = rz_p; - register fe rt asm ("r3") = rt_p; - register const fe px asm ("r4") = px_p; - register const fe py asm ("r5") = py_p; - register const fe pz asm ("r6") = pz_p; - register const fe pt asm ("r7") = pt_p; - register const fe qxy2d asm ("r8") = qxy2d_p; - register const fe qyplusx asm ("r9") = qyplusx_p; - register const fe qyminusx asm ("r10") = qyminusx_p; +} + +void ge_add(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_cached* q_p) +{ + register ge_p1p1 * r asm ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p asm ("r1") = (const ge_p3 *)p_p; + register const ge_cached* q asm ("r2") = (const ge_cached*)q_p; __asm__ __volatile__ ( - "sub sp, sp, #32\n\t" - "str %[rx], [sp]\n\t" - "str %[ry], [sp, #4]\n\t" - "str %[rz], [sp, #8]\n\t" - "str %[rt], [sp, #12]\n\t" + "sub sp, sp, #44\n\t" + "str %[r], [sp]\n\t" + "str %[p], [sp, #4]\n\t" + "str %[q], [sp, #8]\n\t" + "mov r3, r1\n\t" + "add r2, r1, #32\n\t" + "add r1, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "ldr r2, [sp, #8]\n\t" + "mov r1, r0\n\t" + "add r0, r0, #0x40\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r2, [sp, #8]\n\t" + "add r2, r2, #32\n\t" + "add r1, r0, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r1, [sp, #8]\n\t" + "ldr r2, [sp, #4]\n\t" + "add r2, r2, #0x60\n\t" + "add r1, r1, #0x60\n\t" + "add r0, r0, #0x60\n\t" + "bl fe_mul_op\n\t" "ldr r0, [sp]\n\t" - "ldr r1, [sp, #72]\n\t" - "ldr r2, [sp, #68]\n\t" - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "adds r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" -#endif - "adcs r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp, #72]\n\t" - "ldr r2, [sp, #68]\n\t" - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" -#endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" - "adcs r6, r6, %[rt]\n\t" - "adcs r7, r7, %[rt]\n\t" - "adcs r8, r8, %[rt]\n\t" - "adcs r9, r9, %[rt]\n\t" - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r2, [sp, #88]\n\t" - "ldr r1, [sp]\n\t" - "ldr r0, [sp, #8]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #92]\n\t" "ldr r1, [sp, #4]\n\t" - "ldr r0, [sp, #4]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #80]\n\t" - "ldr r1, [sp, #84]\n\t" - "ldr r0, [sp, #12]\n\t" - "bl fe_mul\n\t" - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp]\n\t" "ldr r2, [sp, #8]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2]\n\t" - "ldr r5, [r2, #4]\n\t" -#else - "ldrd r4, r5, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0]\n\t" - "ldr r7, [r0, #4]\n\t" -#else - "ldrd r6, r7, [r0]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #8]\n\t" - "ldr r5, [r2, #12]\n\t" -#else - "ldrd r4, r5, [r2, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #16]\n\t" - "ldr r5, [r2, #20]\n\t" -#else - "ldrd r4, r5, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #16]\n\t" - "ldr r7, [r0, #20]\n\t" -#else - "ldrd r6, r7, [r0, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" + "add r2, r2, #0x40\n\t" + "add r1, r1, #0x40\n\t" + "bl fe_mul_op\n\t" + "ldr r1, [sp]\n\t" + "add r0, sp, #12\n\t" + /* Double */ + "ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" + "adcs r11, r11, r11\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #24]\n\t" - "ldr r5, [r2, #28]\n\t" -#else - "ldrd r4, r5, [r2, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #24]\n\t" - "ldr r7, [r0, #28]\n\t" -#else - "ldrd r6, r7, [r0, #24]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" -#else - "ldrd r4, r5, [r0, #8]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" -#else - "strd r4, r5, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" -#else - "strd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" -#else - "strd r8, r9, [r0, #24]\n\t" -#endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif + "mov r12, #19\n\t" + "lsl lr, lr, #1\n\t" + "orr lr, lr, r11, lsr #31\n\t" + "mul r12, lr, r12\n\t" "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" -#else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" -#endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0x80000000\n\t" #else - "strd r10, r11, [r1, #24]\n\t" + "bfc r11, #31, #1\n\t" #endif - "ldr r0, [sp, #8]\n\t" - "ldr r1, [sp, #76]\n\t" + "adcs r10, r10, #0\n\t" + "adc r11, r11, #0\n\t" + "stm r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "add r3, r1, #32\n\t" + "add r2, r1, #0x40\n\t" + "add r0, r1, #32\n\t" + "bl fe_add_sub_op\n\t" + "add r3, r0, #0x40\n\t" + "add r2, sp, #12\n\t" + "add r1, r0, #0x40\n\t" + "add r0, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "add sp, sp, #44\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +void ge_sub(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_cached* q_p) +{ + register ge_p1p1 * r asm ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p asm ("r1") = (const ge_p3 *)p_p; + register const ge_cached* q asm ("r2") = (const ge_cached*)q_p; + + __asm__ __volatile__ ( + "sub sp, sp, #44\n\t" + "str %[r], [sp]\n\t" + "str %[p], [sp, #4]\n\t" + "str %[q], [sp, #8]\n\t" + "mov r3, r1\n\t" + "add r2, r1, #32\n\t" + "add r1, r0, #32\n\t" + "bl fe_add_sub_op\n\t" + "ldr r2, [sp, #8]\n\t" + "add r2, r2, #32\n\t" + "mov r1, r0\n\t" + "add r0, r0, #0x40\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r2, [sp, #8]\n\t" + "add r1, r0, #32\n\t" + "add r0, r0, #32\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r1, [sp, #8]\n\t" + "ldr r2, [sp, #4]\n\t" + "add r2, r2, #0x60\n\t" + "add r1, r1, #0x60\n\t" + "add r0, r0, #0x60\n\t" + "bl fe_mul_op\n\t" + "ldr r0, [sp]\n\t" + "ldr r1, [sp, #4]\n\t" + "ldr r2, [sp, #8]\n\t" + "add r2, r2, #0x40\n\t" + "add r1, r1, #0x40\n\t" + "bl fe_mul_op\n\t" + "ldr r1, [sp]\n\t" + "add r0, sp, #12\n\t" /* Double */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r1, #16]\n\t" - "ldr r9, [r1, #20]\n\t" -#else - "ldrd r8, r9, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r1, #24]\n\t" - "ldr r11, [r1, #28]\n\t" -#else - "ldrd r10, r11, [r1, #24]\n\t" -#endif + "ldm r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" "adds r4, r4, r4\n\t" "adcs r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" @@ -7364,2853 +5594,3410 @@ "adcs r8, r8, r8\n\t" "adcs r9, r9, r9\n\t" "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r0, [sp, #8]\n\t" - "ldr r1, [sp, #12]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1]\n\t" - "ldr r7, [r1, #4]\n\t" -#else - "ldrd r6, r7, [r1]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" -#else - "ldrd r4, r5, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #16]\n\t" - "ldr r7, [r1, #20]\n\t" -#else - "ldrd r6, r7, [r1, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" + "adcs r11, r11, r11\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #24]\n\t" - "ldr r5, [r0, #28]\n\t" -#else - "ldrd r4, r5, [r0, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" -#else - "ldrd r4, r5, [r0, #8]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" -#else - "strd r4, r5, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" -#else - "strd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" -#else - "strd r8, r9, [r0, #24]\n\t" -#endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" + "mov r12, #19\n\t" + "lsl lr, lr, #1\n\t" + "orr lr, lr, r11, lsr #31\n\t" + "mul r12, lr, r12\n\t" + "adds r4, r4, r12\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, #0\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0x80000000\n\t" #else - "ldrd r4, r5, [r1]\n\t" + "bfc r11, #31, #1\n\t" #endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" -#else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" -#endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" -#else - "strd r10, r11, [r1, #24]\n\t" -#endif - "add sp, sp, #32\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt) - : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" - ); - (void)px_p; - (void)py_p; - (void)pz_p; - (void)pt_p; - (void)qxy2d_p; - (void)qyplusx_p; - (void)qyminusx_p; -} - -void fe_ge_msub(fe rx_p, fe ry_p, fe rz_p, fe rt_p, const fe px_p, const fe py_p, const fe pz_p, const fe pt_p, const fe qxy2d_p, const fe qyplusx_p, const fe qyminusx_p) -{ - register fe rx asm ("r0") = rx_p; - register fe ry asm ("r1") = ry_p; - register fe rz asm ("r2") = rz_p; - register fe rt asm ("r3") = rt_p; - register const fe px asm ("r4") = px_p; - register const fe py asm ("r5") = py_p; - register const fe pz asm ("r6") = pz_p; - register const fe pt asm ("r7") = pt_p; - register const fe qxy2d asm ("r8") = qxy2d_p; - register const fe qyplusx asm ("r9") = qyplusx_p; - register const fe qyminusx asm ("r10") = qyminusx_p; + "adcs r10, r10, #0\n\t" + "adc r11, r11, #0\n\t" + "stm r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "add r3, r1, #32\n\t" + "add r2, r1, #0x40\n\t" + "add r0, r1, #32\n\t" + "bl fe_add_sub_op\n\t" + "add r3, r0, #0x40\n\t" + "add r2, sp, #12\n\t" + "add r1, r0, #32\n\t" + "add r0, r0, #0x40\n\t" + "bl fe_add_sub_op\n\t" + "add sp, sp, #44\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) +void sc_reduce(byte* s_p) +{ + register byte* s asm ("r0") = (byte*)s_p; __asm__ __volatile__ ( - "sub sp, sp, #32\n\t" - "str %[rx], [sp]\n\t" - "str %[ry], [sp, #4]\n\t" - "str %[rz], [sp, #8]\n\t" - "str %[rt], [sp, #12]\n\t" - "ldr r0, [sp]\n\t" - "ldr r1, [sp, #72]\n\t" - "ldr r2, [sp, #68]\n\t" - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "adds r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" + "sub sp, sp, #56\n\t" + "str %[s], [sp, #52]\n\t" + /* Load bits 252-511 */ + "add %[s], %[s], #28\n\t" + "ldm %[s], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "lsr lr, r9, #24\n\t" + "lsl r9, r9, #4\n\t" + "orr r9, r9, r8, LSR #28\n\t" + "lsl r8, r8, #4\n\t" + "orr r8, r8, r7, LSR #28\n\t" + "lsl r7, r7, #4\n\t" + "orr r7, r7, r6, LSR #28\n\t" + "lsl r6, r6, #4\n\t" + "orr r6, r6, r5, LSR #28\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, LSR #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, r3, LSR #28\n\t" + "lsl r3, r3, #4\n\t" + "orr r3, r3, r2, LSR #28\n\t" + "lsl r2, r2, #4\n\t" + "orr r2, r2, r1, LSR #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "sub %[s], %[s], #28\n\t" + /* Add order times bits 504..511 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xa3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #10\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #44\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x2c\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x13\n\t" #else - "ldrd r10, r11, [r2, #24]\n\t" + "mov r10, #0x2c13\n\t" #endif - "adcs r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" + "movt r10, #0xa30a\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp, #72]\n\t" - "ldr r2, [sp, #68]\n\t" - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xa7\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xed\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xe5\n\t" #else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0xe5\n\t" #else - "ldrd r8, r9, [r2, #16]\n\t" + "mov r11, #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" + "movt r11, #0xa7ed\n\t" #endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" + "mov r1, #0\n\t" + "umlal r2, r1, r10, lr\n\t" + "adds r3, r3, r1\n\t" + "mov r1, #0\n\t" + "adc r1, r1, #0\n\t" + "umlal r3, r1, r11, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5d\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #8\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x29\n\t" #else - "ldrd r4, r5, [r0]\n\t" + "mov r10, #0x6329\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" + "movt r10, #0x5d08\n\t" #endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" - "adcs r6, r6, %[rt]\n\t" - "adcs r7, r7, %[rt]\n\t" - "adcs r8, r8, %[rt]\n\t" - "adcs r9, r9, %[rt]\n\t" - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xeb\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #6\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" #else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x6\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x21\n\t" #else - "strd r6, r7, [r0, #8]\n\t" + "mov r11, #0x621\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" + "movt r11, #0xeb21\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" + "adds r4, r4, r1\n\t" + "mov r1, #0\n\t" + "adc r1, r1, #0\n\t" + "umlal r4, r1, r10, lr\n\t" + "adds r5, r5, r1\n\t" + "mov r1, #0\n\t" + "adc r1, r1, #0\n\t" + "umlal r5, r1, r11, lr\n\t" + "adds r6, r6, r1\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "subs r6, r6, lr\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbc r9, r9, #0\n\t" + /* Sub product of top 8 words and order */ + "mov r12, sp\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa3\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #10\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #44\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #19\n\t" #else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r2, [sp, #92]\n\t" - "ldr r1, [sp]\n\t" - "ldr r0, [sp, #8]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #88]\n\t" - "ldr r1, [sp, #4]\n\t" - "ldr r0, [sp, #4]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #80]\n\t" - "ldr r1, [sp, #84]\n\t" - "ldr r0, [sp, #12]\n\t" - "bl fe_mul\n\t" - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp]\n\t" - "ldr r2, [sp, #8]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2]\n\t" - "ldr r5, [r2, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x2c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x13\n\t" #else - "ldrd r4, r5, [r2]\n\t" + "mov r1, #0x2c13\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0]\n\t" - "ldr r7, [r0, #4]\n\t" -#else - "ldrd r6, r7, [r0]\n\t" + "movt r1, #0xa30a\n\t" #endif - "adds r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #8]\n\t" - "ldr r5, [r2, #12]\n\t" -#else - "ldrd r4, r5, [r2, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" + "umlal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #16]\n\t" - "ldr r5, [r2, #20]\n\t" -#else - "ldrd r4, r5, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #16]\n\t" - "ldr r7, [r0, #20]\n\t" -#else - "ldrd r6, r7, [r0, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" + "umlal r10, lr, r4, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r6, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, r1\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0xf0000000\n\t" #else - "strd r8, r9, [r0, #16]\n\t" + "bfc r11, #28, #4\n\t" #endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" + "adds r11, r11, lr\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" + "umlal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub %[s], %[s], #16\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa7\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xed\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xe5\n\t" #else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #24]\n\t" - "ldr r5, [r2, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0xe5\n\t" #else - "ldrd r4, r5, [r2, #24]\n\t" + "mov r1, #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #24]\n\t" - "ldr r7, [r0, #28]\n\t" -#else - "ldrd r6, r7, [r0, #24]\n\t" + "movt r1, #0xa7ed\n\t" #endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r4, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r6, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x5d\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #8\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #41\n\t" #else - "ldrd r4, r5, [r0]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x29\n\t" #else - "strd r4, r5, [r0]\n\t" + "mov r1, #0x6329\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" -#else - "ldrd r4, r5, [r0, #8]\n\t" + "movt r1, #0x5d08\n\t" #endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r4, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r6, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xeb\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #6\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" #else - "strd r4, r5, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x6\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x21\n\t" #else - "ldrd r4, r5, [r0, #16]\n\t" + "mov r1, #0x621\n\t" #endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" -#else - "strd r4, r5, [r0, #16]\n\t" + "movt r1, #0xeb21\n\t" #endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r4, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r6, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, r1\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" + /* Subtract at 4 * 32 */ + "ldm r12, {r10, r11}\n\t" + "subs r10, r10, r2\n\t" + "sbcs r11, r11, r3\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r4\n\t" + "sbcs r11, r11, r5\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r6\n\t" + "sbcs r11, r11, r7\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r8\n\t" + "sbc r11, r11, r9\n\t" + "stm r12!, {r10, r11}\n\t" + "sub r12, r12, #36\n\t" + "asr lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa00000\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x0\n\t" +#else + "mov r1, #0xa0000000\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r2, #0x4b\n\t" + "lsl r2, r2, #8\n\t" + "orr r2, r2, #0x9e\n\t" + "lsl r2, r2, #8\n\t" + "orr r2, r2, #0xba\n\t" + "lsl r2, r2, #8\n\t" + "orr r2, r2, #0x7d\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r2, #0xba\n\t" + "lsl r2, r2, #8\n\t" + "add r2, r2, #0x7d\n\t" #else - "strd r8, r9, [r0, #24]\n\t" + "mov r2, #0xba7d\n\t" #endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" + "movt r2, #0x4b9e\n\t" #endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r3, #0xcb\n\t" + "lsl r3, r3, #8\n\t" + "orr r3, r3, #2\n\t" + "lsl r3, r3, #8\n\t" + "orr r3, r3, #0x4c\n\t" + "lsl r3, r3, #8\n\t" + "orr r3, r3, #0x63\n\t" #else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r3, #0x4c\n\t" + "lsl r3, r3, #8\n\t" + "add r3, r3, #0x63\n\t" #else - "ldrd r4, r5, [r1, #8]\n\t" + "mov r3, #0x4c63\n\t" #endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" + "movt r3, #0xcb02\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xd4\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x5e\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x9a\n\t" #else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "add r4, r4, #0x9a\n\t" #else - "strd r4, r5, [r1, #16]\n\t" + "mov r4, #0xf39a\n\t" #endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" -#else - "strd r10, r11, [r1, #24]\n\t" + "movt r4, #0xd45e\n\t" #endif - "ldr r0, [sp, #8]\n\t" - "ldr r1, [sp, #76]\n\t" - /* Double */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #2\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0x9b\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #59\n\t" #else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "add r5, r5, #0x3b\n\t" #else - "ldrd r6, r7, [r1, #8]\n\t" + "mov r5, #0xdf3b\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r1, #16]\n\t" - "ldr r9, [r1, #20]\n\t" -#else - "ldrd r8, r9, [r1, #16]\n\t" + "movt r5, #0x29b\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r1, #24]\n\t" - "ldr r11, [r1, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r9, #0x20000\n\t" + "lsl r9, r9, #8\n\t" + "add r9, r9, #0x0\n\t" #else - "ldrd r10, r11, [r1, #24]\n\t" + "mov r9, #0x2000000\n\t" #endif - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" + "and r1, r1, lr\n\t" + "and r2, r2, lr\n\t" + "and r3, r3, lr\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r9, r9, lr\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, r1\n\t" + "adcs r11, r11, r2\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, r3\n\t" + "adcs r11, r11, r4\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, r5\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, #0\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10}\n\t" + "adcs r10, r10, #0\n\t" + "stm r12!, {r10}\n\t" + "sub %[s], %[s], #16\n\t" + "mov r12, sp\n\t" + /* Load bits 252-376 */ + "add r12, r12, #28\n\t" + "ldm r12, {r1, r2, r3, r4, r5}\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, lsr #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, r3, lsr #28\n\t" + "lsl r3, r3, #4\n\t" + "orr r3, r3, r2, lsr #28\n\t" + "lsl r2, r2, #4\n\t" + "orr r2, r2, r1, lsr #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r5, r5, #0xe0000000\n\t" +#else + "bfc r5, #29, #3\n\t" +#endif + "sub r12, r12, #28\n\t" + /* Sub product of top 4 words and order */ + "mov %[s], sp\n\t" + /* * -5cf5d3ed */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa3\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #10\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #44\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x2c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x13\n\t" +#else + "mov r1, #0x2c13\n\t" +#endif + "movt r1, #0xa30a\n\t" +#endif + "mov lr, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, lr, r2, r1\n\t" + "adds r7, r7, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r7, lr, r3, r1\n\t" + "adds r8, r8, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r8, lr, r4, r1\n\t" + "adds r9, r9, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r9, lr, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -5812631b */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa7\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xed\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xe5\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0xe5\n\t" #else - "strd r4, r5, [r0]\n\t" + "mov r1, #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" + "movt r1, #0xa7ed\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" + "mov r10, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r10, r2, r1\n\t" + "adds r7, r7, r10\n\t" + "mov r10, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r7, r10, r3, r1\n\t" + "adds r8, r8, r10\n\t" + "mov r10, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r8, r10, r4, r1\n\t" + "adds r9, r9, r10\n\t" + "mov r10, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r9, r10, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -a2f79cd7 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x5d\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #8\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x29\n\t" #else - "strd r8, r9, [r0, #16]\n\t" + "mov r1, #0x6329\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" + "movt r1, #0x5d08\n\t" #endif - "ldr r0, [sp, #12]\n\t" - "ldr r1, [sp, #8]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" + "mov r11, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r11, r2, r1\n\t" + "adds r7, r7, r11\n\t" + "mov r11, #0\n\t" + "adc r11, r11, #0\n\t" + "umlal r7, r11, r3, r1\n\t" + "adds r8, r8, r11\n\t" + "mov r11, #0\n\t" + "adc r11, r11, #0\n\t" + "umlal r8, r11, r4, r1\n\t" + "adds r9, r9, r11\n\t" + "mov r11, #0\n\t" + "adc r11, r11, #0\n\t" + "umlal r9, r11, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -14def9df */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xeb\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #6\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x6\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x21\n\t" #else - "ldrd r4, r5, [r1]\n\t" + "mov r1, #0x621\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0]\n\t" - "ldr r7, [r0, #4]\n\t" -#else - "ldrd r6, r7, [r0]\n\t" + "movt r1, #0xeb21\n\t" #endif - "adds r8, r4, r6\n\t" "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r12, r2, r1\n\t" + "adds r7, r7, r12\n\t" + "mov r12, #0\n\t" "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" + "umlal r7, r12, r3, r1\n\t" + "adds r8, r8, r12\n\t" "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #16]\n\t" - "ldr r7, [r0, #20]\n\t" -#else - "ldrd r6, r7, [r0, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" + "umlal r8, r12, r4, r1\n\t" + "adds r9, r9, r12\n\t" "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" + "umlal r9, r12, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* Add overflows at 4 * 32 */ + "ldm %[s], {r6, r7, r8, r9}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "adds r6, r6, lr\n\t" + "adcs r7, r7, r10\n\t" + "adcs r8, r8, r11\n\t" + "adc r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "subs r6, r6, r2\n\t" + "sbcs r7, r7, r3\n\t" + "sbcs r8, r8, r4\n\t" + "sbcs r9, r9, r5\n\t" + "sbc r1, r1, r1\n\t" + "sub %[s], %[s], #16\n\t" + "ldm %[s], {r2, r3, r4, r5}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5c\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xf5\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xed\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0xed\n\t" #else - "strd r8, r9, [r0, #16]\n\t" + "mov r10, #0xd3ed\n\t" #endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" + "movt r10, #0x5cf5\n\t" #endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #24]\n\t" - "ldr r5, [r1, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x58\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #18\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #26\n\t" #else - "ldrd r4, r5, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #24]\n\t" - "ldr r7, [r0, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x1a\n\t" #else - "ldrd r6, r7, [r0, #24]\n\t" + "mov r11, #0x631a\n\t" #endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" + "movt r11, #0x5812\n\t" #endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0xa2\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xf7\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xd6\n\t" #else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "add r12, r12, #0xd6\n\t" #else - "ldrd r4, r5, [r0, #8]\n\t" + "mov r12, #0x9cd6\n\t" #endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" -#else - "strd r4, r5, [r0, #8]\n\t" + "movt r12, #0xa2f7\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #20\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "add lr, lr, #0xde\n\t" +#else + "mov lr, #0xf9de\n\t" +#endif + "movt lr, #0x14de\n\t" +#endif + "and r10, r10, r1\n\t" + "and r11, r11, r1\n\t" + "and r12, r12, r1\n\t" + "and lr, lr, r1\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adcs r5, r5, lr\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "and r1, r1, #0x10000000\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, r1\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + /* Store result */ + "ldr %[s], [sp, #52]\n\t" + "stm %[s], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "add sp, sp, #56\n\t" + : [s] "+r" (s) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + #else - "ldrd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" +void sc_reduce(byte* s_p) +{ + register byte* s asm ("r0") = (byte*)s_p; + + __asm__ __volatile__ ( + "sub sp, sp, #56\n\t" + "str %[s], [sp, #52]\n\t" + /* Load bits 252-511 */ + "add %[s], %[s], #28\n\t" + "ldm %[s], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "lsr lr, r9, #24\n\t" + "lsl r9, r9, #4\n\t" + "orr r9, r9, r8, LSR #28\n\t" + "lsl r8, r8, #4\n\t" + "orr r8, r8, r7, LSR #28\n\t" + "lsl r7, r7, #4\n\t" + "orr r7, r7, r6, LSR #28\n\t" + "lsl r6, r6, #4\n\t" + "orr r6, r6, r5, LSR #28\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, LSR #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, r3, LSR #28\n\t" + "lsl r3, r3, #4\n\t" + "orr r3, r3, r2, LSR #28\n\t" + "lsl r2, r2, #4\n\t" + "orr r2, r2, r1, LSR #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "sub %[s], %[s], #28\n\t" + /* Add order times bits 504..511 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xa3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #10\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #44\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x2c\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x13\n\t" #else - "strd r4, r5, [r0, #16]\n\t" + "mov r10, #0x2c13\n\t" #endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" -#else - "strd r8, r9, [r0, #24]\n\t" + "movt r10, #0xa30a\n\t" #endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xa7\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xed\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xe5\n\t" #else - "ldrd r4, r5, [r1]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" -#else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" -#endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" -#else - "strd r10, r11, [r1, #24]\n\t" -#endif - "add sp, sp, #32\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt) - : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" - ); - (void)px_p; - (void)py_p; - (void)pz_p; - (void)pt_p; - (void)qxy2d_p; - (void)qyplusx_p; - (void)qyminusx_p; -} - -void fe_ge_add(fe rx_p, fe ry_p, fe rz_p, fe rt_p, const fe px_p, const fe py_p, const fe pz_p, const fe pt_p, const fe qz_p, const fe qt2d_p, const fe qyplusx_p, const fe qyminusx_p) -{ - register fe rx asm ("r0") = rx_p; - register fe ry asm ("r1") = ry_p; - register fe rz asm ("r2") = rz_p; - register fe rt asm ("r3") = rt_p; - register const fe px asm ("r4") = px_p; - register const fe py asm ("r5") = py_p; - register const fe pz asm ("r6") = pz_p; - register const fe pt asm ("r7") = pt_p; - register const fe qz asm ("r8") = qz_p; - register const fe qt2d asm ("r9") = qt2d_p; - register const fe qyplusx asm ("r10") = qyplusx_p; - register const fe qyminusx asm ("r11") = qyminusx_p; - - __asm__ __volatile__ ( - "sub sp, sp, #0x60\n\t" - "str %[rx], [sp]\n\t" - "str %[ry], [sp, #4]\n\t" - "str %[rz], [sp, #8]\n\t" - "str %[rt], [sp, #12]\n\t" - "ldr r0, [sp]\n\t" - "ldr r1, [sp, #136]\n\t" - "ldr r2, [sp, #132]\n\t" - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0xe5\n\t" #else - "ldrd r4, r5, [r1]\n\t" + "mov r11, #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" + "movt r11, #0xa7ed\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" + "mov r1, #0\n\t" + "umlal r2, r1, r10, lr\n\t" + "umaal r3, r1, r11, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5d\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #8\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x29\n\t" #else - "ldrd r8, r9, [r2]\n\t" + "mov r10, #0x6329\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" + "movt r10, #0x5d08\n\t" #endif - "adds r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xeb\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #6\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" #else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x6\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x21\n\t" #else - "strd r10, r11, [r0, #8]\n\t" + "mov r11, #0x621\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" + "movt r11, #0xeb21\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" + "umaal r4, r1, r10, lr\n\t" + "umaal r5, r1, r11, lr\n\t" + "adds r6, r6, r1\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "subs r6, r6, lr\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbc r9, r9, #0\n\t" + /* Sub product of top 8 words and order */ + "mov r12, sp\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa3\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #10\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #44\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x2c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x13\n\t" +#else + "mov r1, #0x2c13\n\t" +#endif + "movt r1, #0xa30a\n\t" +#endif + "mov lr, #0\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "umaal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umaal r10, lr, r4, r1\n\t" + "umaal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umaal r10, lr, r6, r1\n\t" + "umaal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umaal r10, lr, r8, r1\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0xf0000000\n\t" +#else + "bfc r11, #28, #4\n\t" +#endif + "umaal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub %[s], %[s], #16\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa7\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xed\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xe5\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0xe5\n\t" +#else + "mov r1, #0x9ce5\n\t" +#endif + "movt r1, #0xa7ed\n\t" +#endif + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "umaal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r4, r1\n\t" + "umaal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r6, r1\n\t" + "umaal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r8, r1\n\t" + "umaal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x5d\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #8\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x29\n\t" +#else + "mov r1, #0x6329\n\t" +#endif + "movt r1, #0x5d08\n\t" +#endif + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "umaal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r4, r1\n\t" + "umaal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r6, r1\n\t" + "umaal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r8, r1\n\t" + "umaal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xeb\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #6\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x6\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x21\n\t" +#else + "mov r1, #0x621\n\t" +#endif + "movt r1, #0xeb21\n\t" +#endif + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, r2, r1\n\t" + "umaal r11, lr, r3, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r4, r1\n\t" + "umaal r11, lr, r5, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r6, r1\n\t" + "umaal r11, lr, r7, r1\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r8, r1\n\t" + "umaal r11, lr, r9, r1\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" + /* Subtract at 4 * 32 */ + "ldm r12, {r10, r11}\n\t" + "subs r10, r10, r2\n\t" + "sbcs r11, r11, r3\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r4\n\t" + "sbcs r11, r11, r5\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r6\n\t" + "sbcs r11, r11, r7\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r8\n\t" + "sbc r11, r11, r9\n\t" + "stm r12!, {r10, r11}\n\t" + "sub r12, r12, #36\n\t" + "asr lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa00000\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x0\n\t" +#else + "mov r1, #0xa0000000\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r2, #0x4b\n\t" + "lsl r2, r2, #8\n\t" + "orr r2, r2, #0x9e\n\t" + "lsl r2, r2, #8\n\t" + "orr r2, r2, #0xba\n\t" + "lsl r2, r2, #8\n\t" + "orr r2, r2, #0x7d\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r2, #0xba\n\t" + "lsl r2, r2, #8\n\t" + "add r2, r2, #0x7d\n\t" #else - "ldrd r6, r7, [r1, #24]\n\t" + "mov r2, #0xba7d\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" + "movt r2, #0x4b9e\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r3, #0xcb\n\t" + "lsl r3, r3, #8\n\t" + "orr r3, r3, #2\n\t" + "lsl r3, r3, #8\n\t" + "orr r3, r3, #0x4c\n\t" + "lsl r3, r3, #8\n\t" + "orr r3, r3, #0x63\n\t" #else - "ldrd r10, r11, [r2, #24]\n\t" -#endif - "adcs r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r3, #0x4c\n\t" + "lsl r3, r3, #8\n\t" + "add r3, r3, #0x63\n\t" #else - "ldrd r4, r5, [r0]\n\t" + "mov r3, #0x4c63\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" + "movt r3, #0xcb02\n\t" #endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xd4\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x5e\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x9a\n\t" #else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "add r4, r4, #0x9a\n\t" #else - "strd r6, r7, [r0, #8]\n\t" + "mov r4, #0xf39a\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" + "movt r4, #0xd45e\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp, #136]\n\t" - "ldr r2, [sp, #132]\n\t" - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #2\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0x9b\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #59\n\t" #else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "add r5, r5, #0x3b\n\t" #else - "ldrd r6, r7, [r1, #8]\n\t" + "mov r5, #0xdf3b\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" + "movt r5, #0x29b\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r9, #0x20000\n\t" + "lsl r9, r9, #8\n\t" + "add r9, r9, #0x0\n\t" #else - "ldrd r10, r11, [r2, #8]\n\t" + "mov r9, #0x2000000\n\t" #endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" + "and r1, r1, lr\n\t" + "and r2, r2, lr\n\t" + "and r3, r3, lr\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r9, r9, lr\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, r1\n\t" + "adcs r11, r11, r2\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, r3\n\t" + "adcs r11, r11, r4\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, r5\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, #0\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10}\n\t" + "adcs r10, r10, #0\n\t" + "stm r12!, {r10}\n\t" + "sub %[s], %[s], #16\n\t" + "mov r12, sp\n\t" + /* Load bits 252-376 */ + "add r12, r12, #28\n\t" + "ldm r12, {r1, r2, r3, r4, r5}\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, lsr #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, r3, lsr #28\n\t" + "lsl r3, r3, #4\n\t" + "orr r3, r3, r2, lsr #28\n\t" + "lsl r2, r2, #4\n\t" + "orr r2, r2, r1, lsr #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r5, r5, #0xe0000000\n\t" +#else + "bfc r5, #29, #3\n\t" +#endif + "sub r12, r12, #28\n\t" + /* Sub product of top 4 words and order */ + "mov %[s], sp\n\t" + /* * -5cf5d3ed */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa3\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #10\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #44\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x2c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x13\n\t" +#else + "mov r1, #0x2c13\n\t" +#endif + "movt r1, #0xa30a\n\t" +#endif + "mov lr, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, lr, r2, r1\n\t" + "umaal r7, lr, r3, r1\n\t" + "umaal r8, lr, r4, r1\n\t" + "umaal r9, lr, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -5812631b */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xa7\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xed\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0xe5\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x9c\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0xe5\n\t" #else - "strd r8, r9, [r0]\n\t" + "mov r1, #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" + "movt r1, #0xa7ed\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" + "mov r10, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r10, r2, r1\n\t" + "umaal r7, r10, r3, r1\n\t" + "umaal r8, r10, r4, r1\n\t" + "umaal r9, r10, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -a2f79cd7 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x5d\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #8\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x63\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x29\n\t" #else - "ldrd r4, r5, [r1, #16]\n\t" + "mov r1, #0x6329\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" + "movt r1, #0x5d08\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" + "mov r11, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r11, r2, r1\n\t" + "umaal r7, r11, r3, r1\n\t" + "umaal r8, r11, r4, r1\n\t" + "umaal r9, r11, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -14def9df */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0xeb\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #6\n\t" + "lsl r1, r1, #8\n\t" + "orr r1, r1, #33\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r1, #0x6\n\t" + "lsl r1, r1, #8\n\t" + "add r1, r1, #0x21\n\t" #else - "ldrd r8, r9, [r2, #16]\n\t" + "mov r1, #0x621\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" + "movt r1, #0xeb21\n\t" #endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" + "mov r12, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r12, r2, r1\n\t" + "umaal r7, r12, r3, r1\n\t" + "umaal r8, r12, r4, r1\n\t" + "umaal r9, r12, r5, r1\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* Add overflows at 4 * 32 */ + "ldm %[s], {r6, r7, r8, r9}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "adds r6, r6, lr\n\t" + "adcs r7, r7, r10\n\t" + "adcs r8, r8, r11\n\t" + "adc r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "subs r6, r6, r2\n\t" + "sbcs r7, r7, r3\n\t" + "sbcs r8, r8, r4\n\t" + "sbcs r9, r9, r5\n\t" + "sbc r1, r1, r1\n\t" + "sub %[s], %[s], #16\n\t" + "ldm %[s], {r2, r3, r4, r5}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5c\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xf5\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xed\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0xed\n\t" #else - "ldrd r4, r5, [r0]\n\t" + "mov r10, #0xd3ed\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" + "movt r10, #0x5cf5\n\t" #endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" - "adcs r6, r6, %[rt]\n\t" - "adcs r7, r7, %[rt]\n\t" - "adcs r8, r8, %[rt]\n\t" - "adcs r9, r9, %[rt]\n\t" - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x58\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #18\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #26\n\t" #else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x1a\n\t" #else - "strd r6, r7, [r0, #8]\n\t" + "mov r11, #0x631a\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" + "movt r11, #0x5812\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0xa2\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xf7\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xd6\n\t" #else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r2, [sp, #156]\n\t" - "ldr r1, [sp]\n\t" - "ldr r0, [sp, #8]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #160]\n\t" - "ldr r1, [sp, #4]\n\t" - "ldr r0, [sp, #4]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #144]\n\t" - "ldr r1, [sp, #152]\n\t" - "ldr r0, [sp, #12]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #148]\n\t" - "ldr r1, [sp, #140]\n\t" - "ldr r0, [sp]\n\t" - "bl fe_mul\n\t" - "add r0, sp, #16\n\t" - "ldr r1, [sp]\n\t" - /* Double */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "add r12, r12, #0xd6\n\t" #else - "ldrd r4, r5, [r1]\n\t" + "mov r12, #0x9cd6\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" + "movt r12, #0xa2f7\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r1, #16]\n\t" - "ldr r9, [r1, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #20\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "add lr, lr, #0xde\n\t" +#else + "mov lr, #0xf9de\n\t" +#endif + "movt lr, #0x14de\n\t" +#endif + "and r10, r10, r1\n\t" + "and r11, r11, r1\n\t" + "and r12, r12, r1\n\t" + "and lr, lr, r1\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adcs r5, r5, lr\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "and r1, r1, #0x10000000\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, r1\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + /* Store result */ + "ldr %[s], [sp, #52]\n\t" + "stm %[s], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "add sp, sp, #56\n\t" + : [s] "+r" (s) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#ifdef HAVE_ED25519_SIGN +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) +void sc_muladd(byte* s_p, const byte* a_p, const byte* b_p, const byte* c_p) +{ + register byte* s asm ("r0") = (byte*)s_p; + register const byte* a asm ("r1") = (const byte*)a_p; + register const byte* b asm ("r2") = (const byte*)b_p; + register const byte* c asm ("r3") = (const byte*)c_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x50\n\t" + "add lr, sp, #0x44\n\t" + "stm lr, {%[s], %[a], %[c]}\n\t" + "mov %[s], #0\n\t" + "ldr r12, [%[a]]\n\t" + /* A[0] * B[0] */ + "ldr lr, [%[b]]\n\t" + "umull %[c], r4, r12, lr\n\t" + /* A[0] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "umull r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "umull r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "umull r9, r10, r12, lr\n\t" + "str %[c], [sp]\n\t" + /* A[0] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "mov r11, %[s]\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[0] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adcs r6, r6, #0\n\t" + "adc r11, %[s], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[0] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adcs r8, r8, #0\n\t" + "adc r11, %[s], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[0] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adcs r10, r10, #0\n\t" + "adc %[c], %[s], #0\n\t" + "umlal r10, %[c], r12, lr\n\t" + /* A[1] * B[0] */ + "ldr r12, [%[a], #4]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "str r4, [sp, #4]\n\t" + "adds r5, r5, r11\n\t" + /* A[1] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[1] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds %[c], %[c], r11\n\t" + /* A[1] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r4, %[s], #0\n\t" + "umlal %[c], r4, r12, lr\n\t" + /* A[2] * B[0] */ + "ldr r12, [%[a], #8]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "str r5, [sp, #8]\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[2] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[2] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds %[c], %[c], r11\n\t" + /* A[2] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[s], #0\n\t" + "umlal %[c], r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r5, %[s], #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "ldr r12, [%[a], #12]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[3] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[3] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[3] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds %[c], %[c], r11\n\t" + /* A[3] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[s], #0\n\t" + "umlal %[c], r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r6, %[s], #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "ldr r12, [%[a], #16]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[4] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[4] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[4] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds %[c], %[c], r11\n\t" + /* A[4] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[s], #0\n\t" + "umlal %[c], r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[4] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r7, %[s], #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "ldr r12, [%[a], #20]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[5] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[5] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds %[c], %[c], r11\n\t" + /* A[5] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[s], #0\n\t" + "umlal %[c], r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[5] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[5] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r8, %[s], #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "ldr r12, [%[a], #24]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[6] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds %[c], %[c], r11\n\t" + /* A[6] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[s], #0\n\t" + "umlal %[c], r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[6] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[6] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[6] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[6] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r9, %[s], #0\n\t" + "umlal r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "ldr r12, [%[a], #28]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds %[c], %[c], r11\n\t" + /* A[7] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[s], #0\n\t" + "umlal %[c], r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[7] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[7] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[7] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[7] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[s], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[7] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r10, %[s], #0\n\t" + "umlal r9, r10, r12, lr\n\t" + "add lr, sp, #32\n\t" + "stm lr, {%[c], r4, r5, r6, r7, r8, r9, r10}\n\t" + "mov %[s], sp\n\t" + /* Add c to a * b */ + "ldr lr, [sp, #76]\n\t" + "ldm %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "ldm lr!, {%[a], r10, r11, r12}\n\t" + "adds %[b], %[b], %[a]\n\t" + "adcs %[c], %[c], r10\n\t" + "adcs r4, r4, r11\n\t" + "adcs r5, r5, r12\n\t" + "ldm lr!, {%[a], r10, r11, r12}\n\t" + "adcs r6, r6, %[a]\n\t" + "adcs r7, r7, r10\n\t" + "adcs r8, r8, r11\n\t" + "adcs r9, r9, r12\n\t" + "mov %[a], r9\n\t" + "stm %[s]!, {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "ldm %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "adcs %[b], %[b], #0\n\t" + "adcs %[c], %[c], #0\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "sub %[s], %[s], #32\n\t" + /* Get 252..503 and 504..507 */ + "lsr lr, r9, #24\n\t" + "lsl r9, r9, #4\n\t" + "orr r9, r9, r8, LSR #28\n\t" + "lsl r8, r8, #4\n\t" + "orr r8, r8, r7, LSR #28\n\t" + "lsl r7, r7, #4\n\t" + "orr r7, r7, r6, LSR #28\n\t" + "lsl r6, r6, #4\n\t" + "orr r6, r6, r5, LSR #28\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, LSR #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, %[c], LSR #28\n\t" + "lsl %[c], %[c], #4\n\t" + "orr %[c], %[c], %[b], LSR #28\n\t" + "lsl %[b], %[b], #4\n\t" + "orr %[b], %[b], %[a], LSR #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + /* Add order times bits 504..507 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xa3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #10\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #44\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x2c\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x13\n\t" #else - "ldrd r8, r9, [r1, #16]\n\t" + "mov r10, #0x2c13\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r1, #24]\n\t" - "ldr r11, [r1, #28]\n\t" -#else - "ldrd r10, r11, [r1, #24]\n\t" + "movt r10, #0xa30a\n\t" #endif - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xa7\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xed\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xe5\n\t" #else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0xe5\n\t" #else - "strd r6, r7, [r0, #8]\n\t" + "mov r11, #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" + "movt r11, #0xa7ed\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" + "mov %[a], #0\n\t" + "umlal %[b], %[a], r10, lr\n\t" + "adds %[c], %[c], %[a]\n\t" + "mov %[a], #0\n\t" + "adc %[a], %[a], #0\n\t" + "umlal %[c], %[a], r11, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5d\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #8\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x29\n\t" #else - "strd r10, r11, [r0, #24]\n\t" + "mov r10, #0x6329\n\t" #endif - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp]\n\t" - "ldr r2, [sp, #8]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2]\n\t" - "ldr r5, [r2, #4]\n\t" -#else - "ldrd r4, r5, [r2]\n\t" + "movt r10, #0x5d08\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0]\n\t" - "ldr r7, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xeb\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #6\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" #else - "ldrd r6, r7, [r0]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x6\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x21\n\t" #else - "strd r8, r9, [r0]\n\t" + "mov r11, #0x621\n\t" #endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" + "movt r11, #0xeb21\n\t" #endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #8]\n\t" - "ldr r5, [r2, #12]\n\t" + "adds r4, r4, %[a]\n\t" + "mov %[a], #0\n\t" + "adc %[a], %[a], #0\n\t" + "umlal r4, %[a], r10, lr\n\t" + "adds r5, r5, %[a]\n\t" + "mov %[a], #0\n\t" + "adc %[a], %[a], #0\n\t" + "umlal r5, %[a], r11, lr\n\t" + "adds r6, r6, %[a]\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "subs r6, r6, lr\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbc r9, r9, #0\n\t" + /* Sub product of top 8 words and order */ + "mov r12, sp\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa3\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #10\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #44\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #19\n\t" #else - "ldrd r4, r5, [r2, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x2c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x13\n\t" #else - "ldrd r6, r7, [r0, #8]\n\t" + "mov %[a], #0x2c13\n\t" #endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" + "movt %[a], #0xa30a\n\t" #endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #16]\n\t" - "ldr r5, [r2, #20]\n\t" -#else - "ldrd r4, r5, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #16]\n\t" - "ldr r7, [r0, #20]\n\t" -#else - "ldrd r6, r7, [r0, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" + "umlal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #24]\n\t" - "ldr r5, [r2, #28]\n\t" -#else - "ldrd r4, r5, [r2, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #24]\n\t" - "ldr r7, [r0, #28]\n\t" -#else - "ldrd r6, r7, [r0, #24]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" -#else - "ldrd r4, r5, [r0, #8]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" -#else - "strd r4, r5, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" -#else - "strd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" -#else - "strd r8, r9, [r0, #24]\n\t" -#endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" -#else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" -#endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" -#else - "strd r10, r11, [r1, #24]\n\t" -#endif - "ldr r0, [sp, #8]\n\t" - "ldr r1, [sp, #12]\n\t" - "add r2, sp, #16\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2]\n\t" - "ldr r5, [r2, #4]\n\t" -#else - "ldrd r4, r5, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1]\n\t" - "ldr r7, [r1, #4]\n\t" -#else - "ldrd r6, r7, [r1]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" + "umlal r10, lr, r4, %[a]\n\t" + "adds r11, r11, lr\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #8]\n\t" - "ldr r5, [r2, #12]\n\t" -#else - "ldrd r4, r5, [r2, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" + "umlal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #16]\n\t" - "ldr r5, [r2, #20]\n\t" -#else - "ldrd r4, r5, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #16]\n\t" - "ldr r7, [r1, #20]\n\t" -#else - "ldrd r6, r7, [r1, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" + "umlal r10, lr, r6, %[a]\n\t" + "adds r11, r11, lr\n\t" "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #24]\n\t" - "ldr r5, [r2, #28]\n\t" -#else - "ldrd r4, r5, [r2, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" -#else - "ldrd r4, r5, [r0, #8]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" -#else - "strd r4, r5, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" -#else - "strd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" -#else - "strd r8, r9, [r0, #24]\n\t" -#endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" -#else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" -#endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" -#else - "strd r10, r11, [r1, #24]\n\t" -#endif - "add sp, sp, #0x60\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt) - : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" - ); - (void)px_p; - (void)py_p; - (void)pz_p; - (void)pt_p; - (void)qz_p; - (void)qt2d_p; - (void)qyplusx_p; - (void)qyminusx_p; -} - -void fe_ge_sub(fe rx_p, fe ry_p, fe rz_p, fe rt_p, const fe px_p, const fe py_p, const fe pz_p, const fe pt_p, const fe qz_p, const fe qt2d_p, const fe qyplusx_p, const fe qyminusx_p) -{ - register fe rx asm ("r0") = rx_p; - register fe ry asm ("r1") = ry_p; - register fe rz asm ("r2") = rz_p; - register fe rt asm ("r3") = rt_p; - register const fe px asm ("r4") = px_p; - register const fe py asm ("r5") = py_p; - register const fe pz asm ("r6") = pz_p; - register const fe pt asm ("r7") = pt_p; - register const fe qz asm ("r8") = qz_p; - register const fe qt2d asm ("r9") = qt2d_p; - register const fe qyplusx asm ("r10") = qyplusx_p; - register const fe qyminusx asm ("r11") = qyminusx_p; - - __asm__ __volatile__ ( - "sub sp, sp, #0x60\n\t" - "str %[rx], [sp]\n\t" - "str %[ry], [sp, #4]\n\t" - "str %[rz], [sp, #8]\n\t" - "str %[rt], [sp, #12]\n\t" - "ldr r0, [sp]\n\t" - "ldr r1, [sp, #136]\n\t" - "ldr r2, [sp, #132]\n\t" - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "adds r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" -#endif - "adcs r8, r4, r8\n\t" - "adcs r9, r5, r9\n\t" - "adcs r10, r6, r10\n\t" - "adc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" -#endif - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp, #136]\n\t" - "ldr r2, [sp, #132]\n\t" - /* Sub */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" -#else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2]\n\t" - "ldr r9, [r2, #4]\n\t" -#else - "ldrd r8, r9, [r2]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #8]\n\t" - "ldr r11, [r2, #12]\n\t" -#else - "ldrd r10, r11, [r2, #8]\n\t" -#endif - "subs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbcs r11, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #8]\n\t" - "str r11, [r0, #12]\n\t" -#else - "strd r10, r11, [r0, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #24]\n\t" - "ldr r7, [r1, #28]\n\t" -#else - "ldrd r6, r7, [r1, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r2, #16]\n\t" - "ldr r9, [r2, #20]\n\t" -#else - "ldrd r8, r9, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r2, #24]\n\t" - "ldr r11, [r2, #28]\n\t" -#else - "ldrd r10, r11, [r2, #24]\n\t" -#endif - "sbcs r8, r4, r8\n\t" - "sbcs r9, r5, r9\n\t" - "sbcs r10, r6, r10\n\t" - "sbc r11, r7, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" + "umlal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, %[a]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0xf0000000\n\t" #else - "ldrd r4, r5, [r0]\n\t" + "bfc r11, #28, #4\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub %[s], %[s], #16\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa7\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xed\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xe5\n\t" #else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" - "adcs r6, r6, %[rt]\n\t" - "adcs r7, r7, %[rt]\n\t" - "adcs r8, r8, %[rt]\n\t" - "adcs r9, r9, %[rt]\n\t" - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0xe5\n\t" #else - "strd r4, r5, [r0]\n\t" + "mov %[a], #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" + "movt %[a], #0xa7ed\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r4, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r6, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x5d\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #8\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #41\n\t" #else - "strd r8, r9, [r0, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x29\n\t" #else - "strd r10, r11, [r0, #24]\n\t" + "mov %[a], #0x6329\n\t" #endif - "ldr r2, [sp, #160]\n\t" - "ldr r1, [sp]\n\t" - "ldr r0, [sp, #8]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #156]\n\t" - "ldr r1, [sp, #4]\n\t" - "ldr r0, [sp, #4]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #144]\n\t" - "ldr r1, [sp, #152]\n\t" - "ldr r0, [sp, #12]\n\t" - "bl fe_mul\n\t" - "ldr r2, [sp, #148]\n\t" - "ldr r1, [sp, #140]\n\t" - "ldr r0, [sp]\n\t" - "bl fe_mul\n\t" - "add r0, sp, #16\n\t" - "ldr r1, [sp]\n\t" - /* Double */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" + "movt %[a], #0x5d08\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r1, #8]\n\t" - "ldr r7, [r1, #12]\n\t" + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r4, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r6, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xeb\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #6\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" #else - "ldrd r6, r7, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [r1, #16]\n\t" - "ldr r9, [r1, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x6\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x21\n\t" #else - "ldrd r8, r9, [r1, #16]\n\t" + "mov %[a], #0x621\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [r1, #24]\n\t" - "ldr r11, [r1, #28]\n\t" -#else - "ldrd r10, r11, [r1, #24]\n\t" + "movt %[a], #0xeb21\n\t" #endif - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" - "sbcs r6, r6, %[rt]\n\t" - "sbcs r7, r7, %[rt]\n\t" - "sbcs r8, r8, %[rt]\n\t" - "sbcs r9, r9, %[rt]\n\t" - "sbcs r10, r10, %[rt]\n\t" - "sbc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r4, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r6, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r10, lr, r8, %[a]\n\t" + "adds r11, r11, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" + /* Subtract at 4 * 32 */ + "ldm r12, {r10, r11}\n\t" + "subs r10, r10, %[b]\n\t" + "sbcs r11, r11, %[c]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r4\n\t" + "sbcs r11, r11, r5\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r6\n\t" + "sbcs r11, r11, r7\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r8\n\t" + "sbc r11, r11, r9\n\t" + "stm r12!, {r10, r11}\n\t" + "sub r12, r12, #36\n\t" + "asr lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa00000\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x0\n\t" +#else + "mov %[a], #0xa0000000\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[b], #0x4b\n\t" + "lsl %[b], %[b], #8\n\t" + "orr %[b], %[b], #0x9e\n\t" + "lsl %[b], %[b], #8\n\t" + "orr %[b], %[b], #0xba\n\t" + "lsl %[b], %[b], #8\n\t" + "orr %[b], %[b], #0x7d\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[b], #0xba\n\t" + "lsl %[b], %[b], #8\n\t" + "add %[b], %[b], #0x7d\n\t" +#else + "mov %[b], #0xba7d\n\t" +#endif + "movt %[b], #0x4b9e\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[c], #0xcb\n\t" + "lsl %[c], %[c], #8\n\t" + "orr %[c], %[c], #2\n\t" + "lsl %[c], %[c], #8\n\t" + "orr %[c], %[c], #0x4c\n\t" + "lsl %[c], %[c], #8\n\t" + "orr %[c], %[c], #0x63\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[c], #0x4c\n\t" + "lsl %[c], %[c], #8\n\t" + "add %[c], %[c], #0x63\n\t" +#else + "mov %[c], #0x4c63\n\t" +#endif + "movt %[c], #0xcb02\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xd4\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x5e\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x9a\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "add r4, r4, #0x9a\n\t" +#else + "mov r4, #0xf39a\n\t" +#endif + "movt r4, #0xd45e\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #2\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0x9b\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #59\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "add r5, r5, #0x3b\n\t" +#else + "mov r5, #0xdf3b\n\t" +#endif + "movt r5, #0x29b\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r9, #0x20000\n\t" + "lsl r9, r9, #8\n\t" + "add r9, r9, #0x0\n\t" +#else + "mov r9, #0x2000000\n\t" +#endif + "and %[a], %[a], lr\n\t" + "and %[b], %[b], lr\n\t" + "and %[c], %[c], lr\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r9, r9, lr\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, %[a]\n\t" + "adcs r11, r11, %[b]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, %[c]\n\t" + "adcs r11, r11, r4\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, r5\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, #0\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10}\n\t" + "adcs r10, r10, #0\n\t" + "stm r12!, {r10}\n\t" + "sub %[s], %[s], #16\n\t" + "mov r12, sp\n\t" + /* Load bits 252-376 */ + "add r12, r12, #28\n\t" + "ldm r12, {%[a], %[b], %[c], r4, r5}\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, lsr #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, %[c], lsr #28\n\t" + "lsl %[c], %[c], #4\n\t" + "orr %[c], %[c], %[b], lsr #28\n\t" + "lsl %[b], %[b], #4\n\t" + "orr %[b], %[b], %[a], lsr #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r5, r5, #0xe0000000\n\t" +#else + "bfc r5, #29, #3\n\t" +#endif + "sub r12, r12, #28\n\t" + /* Sub product of top 4 words and order */ + "mov %[s], sp\n\t" + /* * -5cf5d3ed */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa3\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #10\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #44\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x2c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x13\n\t" +#else + "mov %[a], #0x2c13\n\t" +#endif + "movt %[a], #0xa30a\n\t" +#endif + "mov lr, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, lr, %[b], %[a]\n\t" + "adds r7, r7, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r7, lr, %[c], %[a]\n\t" + "adds r8, r8, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r8, lr, r4, %[a]\n\t" + "adds r9, r9, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "umlal r9, lr, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -5812631b */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa7\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xed\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xe5\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0xe5\n\t" #else - "strd r4, r5, [r0]\n\t" + "mov %[a], #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r6, [r0, #8]\n\t" - "str r7, [r0, #12]\n\t" -#else - "strd r6, r7, [r0, #8]\n\t" + "movt %[a], #0xa7ed\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" + "mov r10, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r10, %[b], %[a]\n\t" + "adds r7, r7, r10\n\t" + "mov r10, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r7, r10, %[c], %[a]\n\t" + "adds r8, r8, r10\n\t" + "mov r10, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r8, r10, r4, %[a]\n\t" + "adds r9, r9, r10\n\t" + "mov r10, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r9, r10, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -a2f79cd7 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x5d\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #8\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x29\n\t" #else - "strd r8, r9, [r0, #16]\n\t" + "mov %[a], #0x6329\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r0, #24]\n\t" - "str r11, [r0, #28]\n\t" -#else - "strd r10, r11, [r0, #24]\n\t" + "movt %[a], #0x5d08\n\t" #endif - "ldr r0, [sp, #4]\n\t" - "ldr r1, [sp]\n\t" - "ldr r2, [sp, #8]\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2]\n\t" - "ldr r5, [r2, #4]\n\t" + "mov r11, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r11, %[b], %[a]\n\t" + "adds r7, r7, r11\n\t" + "mov r11, #0\n\t" + "adc r11, r11, #0\n\t" + "umlal r7, r11, %[c], %[a]\n\t" + "adds r8, r8, r11\n\t" + "mov r11, #0\n\t" + "adc r11, r11, #0\n\t" + "umlal r8, r11, r4, %[a]\n\t" + "adds r9, r9, r11\n\t" + "mov r11, #0\n\t" + "adc r11, r11, #0\n\t" + "umlal r9, r11, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -14def9df */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xeb\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #6\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x6\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x21\n\t" #else - "ldrd r4, r5, [r2]\n\t" + "mov %[a], #0x621\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0]\n\t" - "ldr r7, [r0, #4]\n\t" -#else - "ldrd r6, r7, [r0]\n\t" + "movt %[a], #0xeb21\n\t" #endif - "adds r8, r4, r6\n\t" "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r12, %[b], %[a]\n\t" + "adds r7, r7, r12\n\t" + "mov r12, #0\n\t" "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" -#else - "strd r8, r9, [r0]\n\t" -#endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #8]\n\t" - "ldr r5, [r2, #12]\n\t" -#else - "ldrd r4, r5, [r2, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" + "umlal r7, r12, %[c], %[a]\n\t" + "adds r8, r8, r12\n\t" "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" -#else - "strd r8, r9, [r0, #8]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #16]\n\t" - "ldr r5, [r2, #20]\n\t" -#else - "ldrd r4, r5, [r2, #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #16]\n\t" - "ldr r7, [r0, #20]\n\t" -#else - "ldrd r6, r7, [r0, #16]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" + "umlal r8, r12, r4, %[a]\n\t" + "adds r9, r9, r12\n\t" "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" + "umlal r9, r12, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* Add overflows at 4 * 32 */ + "ldm %[s], {r6, r7, r8, r9}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "adds r6, r6, lr\n\t" + "adcs r7, r7, r10\n\t" + "adcs r8, r8, r11\n\t" + "adc r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "subs r6, r6, %[b]\n\t" + "sbcs r7, r7, %[c]\n\t" + "sbcs r8, r8, r4\n\t" + "sbcs r9, r9, r5\n\t" + "sbc %[a], %[a], %[a]\n\t" + "sub %[s], %[s], #16\n\t" + "ldm %[s], {%[b], %[c], r4, r5}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5c\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xf5\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xed\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0xed\n\t" #else - "strd r8, r9, [r0, #16]\n\t" + "mov r10, #0xd3ed\n\t" #endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #24]\n\t" - "ldr r5, [r2, #28]\n\t" -#else - "ldrd r4, r5, [r2, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #24]\n\t" - "ldr r7, [r0, #28]\n\t" -#else - "ldrd r6, r7, [r0, #24]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" -#else - "ldrd r4, r5, [r0]\n\t" + "movt r10, #0x5cf5\n\t" #endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x58\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #18\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #26\n\t" #else - "strd r4, r5, [r0]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x1a\n\t" #else - "ldrd r4, r5, [r0, #8]\n\t" + "mov r11, #0x631a\n\t" #endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" -#else - "strd r4, r5, [r0, #8]\n\t" + "movt r11, #0x5812\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0xa2\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xf7\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xd6\n\t" #else - "ldrd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "add r12, r12, #0xd6\n\t" #else - "strd r4, r5, [r0, #16]\n\t" + "mov r12, #0x9cd6\n\t" #endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" -#else - "strd r8, r9, [r0, #24]\n\t" + "movt r12, #0xa2f7\n\t" #endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #20\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "add lr, lr, #0xde\n\t" +#else + "mov lr, #0xf9de\n\t" +#endif + "movt lr, #0x14de\n\t" +#endif + "and r10, r10, %[a]\n\t" + "and r11, r11, %[a]\n\t" + "and r12, r12, %[a]\n\t" + "and lr, lr, %[a]\n\t" + "adds %[b], %[b], r10\n\t" + "adcs %[c], %[c], r11\n\t" + "adcs r4, r4, r12\n\t" + "adcs r5, r5, lr\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "and %[a], %[a], #0x10000000\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, %[a]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "ldr %[s], [sp, #68]\n\t" + /* Store result */ + "str %[b], [%[s]]\n\t" + "str %[c], [%[s], #4]\n\t" + "str r4, [%[s], #8]\n\t" + "str r5, [%[s], #12]\n\t" + "str r6, [%[s], #16]\n\t" + "str r7, [%[s], #20]\n\t" + "str r8, [%[s], #24]\n\t" + "str r9, [%[s], #28]\n\t" + "add sp, sp, #0x50\n\t" + : [s] "+r" (s), [a] "+r" (a), [b] "+r" (b), [c] "+r" (c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + #else - "ldrd r4, r5, [r1]\n\t" -#endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" +void sc_muladd(byte* s_p, const byte* a_p, const byte* b_p, const byte* c_p) +{ + register byte* s asm ("r0") = (byte*)s_p; + register const byte* a asm ("r1") = (const byte*)a_p; + register const byte* b asm ("r2") = (const byte*)b_p; + register const byte* c asm ("r3") = (const byte*)c_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x50\n\t" + "add lr, sp, #0x44\n\t" + "stm lr, {%[s], %[a], %[c]}\n\t" + "mov lr, %[b]\n\t" + "ldm %[a], {%[s], %[a], %[b], %[c]}\n\t" + "ldm lr!, {r4, r5, r6}\n\t" + "umull r10, r11, %[s], r4\n\t" + "umull r12, r7, %[a], r4\n\t" + "umaal r11, r12, %[s], r5\n\t" + "umull r8, r9, %[b], r4\n\t" + "umaal r12, r8, %[a], r5\n\t" + "umaal r12, r7, %[s], r6\n\t" + "umaal r8, r9, %[c], r4\n\t" + "stm sp, {r10, r11, r12}\n\t" + "umaal r7, r8, %[b], r5\n\t" + "ldm lr!, {r4}\n\t" + "umull r10, r11, %[a], r6\n\t" + "umaal r8, r9, %[b], r6\n\t" + "umaal r7, r10, %[s], r4\n\t" + "umaal r8, r11, %[c], r5\n\t" + "str r7, [sp, #12]\n\t" + "umaal r8, r10, %[a], r4\n\t" + "umaal r9, r11, %[c], r6\n\t" + "umaal r9, r10, %[b], r4\n\t" + "umaal r10, r11, %[c], r4\n\t" + "ldm lr, {r4, r5, r6, r7}\n\t" + "mov r12, #0\n\t" + "umlal r8, r12, %[s], r4\n\t" + "umaal r9, r12, %[a], r4\n\t" + "umaal r10, r12, %[b], r4\n\t" + "umaal r11, r12, %[c], r4\n\t" + "mov r4, #0\n\t" + "umlal r9, r4, %[s], r5\n\t" + "umaal r10, r4, %[a], r5\n\t" + "umaal r11, r4, %[b], r5\n\t" + "umaal r12, r4, %[c], r5\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, %[s], r6\n\t" + "umaal r11, r5, %[a], r6\n\t" + "umaal r12, r5, %[b], r6\n\t" + "umaal r4, r5, %[c], r6\n\t" + "mov r6, #0\n\t" + "umlal r11, r6, %[s], r7\n\t" + "ldr %[s], [sp, #72]\n\t" + "umaal r12, r6, %[a], r7\n\t" + "add %[s], %[s], #16\n\t" + "umaal r4, r6, %[b], r7\n\t" + "sub lr, lr, #16\n\t" + "umaal r5, r6, %[c], r7\n\t" + "ldm %[s], {%[s], %[a], %[b], %[c]}\n\t" + "str r6, [sp, #64]\n\t" + "ldm lr!, {r6}\n\t" + "mov r7, #0\n\t" + "umlal r8, r7, %[s], r6\n\t" + "umaal r9, r7, %[a], r6\n\t" + "str r8, [sp, #16]\n\t" + "umaal r10, r7, %[b], r6\n\t" + "umaal r11, r7, %[c], r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r8, #0\n\t" + "umlal r9, r8, %[s], r6\n\t" + "umaal r10, r8, %[a], r6\n\t" + "str r9, [sp, #20]\n\t" + "umaal r11, r8, %[b], r6\n\t" + "umaal r12, r8, %[c], r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r9, #0\n\t" + "umlal r10, r9, %[s], r6\n\t" + "umaal r11, r9, %[a], r6\n\t" + "str r10, [sp, #24]\n\t" + "umaal r12, r9, %[b], r6\n\t" + "umaal r4, r9, %[c], r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r10, #0\n\t" + "umlal r11, r10, %[s], r6\n\t" + "umaal r12, r10, %[a], r6\n\t" + "str r11, [sp, #28]\n\t" + "umaal r4, r10, %[b], r6\n\t" + "umaal r5, r10, %[c], r6\n\t" + "ldm lr!, {r11}\n\t" + "umaal r12, r7, %[s], r11\n\t" + "umaal r4, r7, %[a], r11\n\t" + "ldr r6, [sp, #64]\n\t" + "umaal r5, r7, %[b], r11\n\t" + "umaal r6, r7, %[c], r11\n\t" + "ldm lr!, {r11}\n\t" + "umaal r4, r8, %[s], r11\n\t" + "umaal r5, r8, %[a], r11\n\t" + "umaal r6, r8, %[b], r11\n\t" + "umaal r7, r8, %[c], r11\n\t" + "ldm lr, {r11, lr}\n\t" + "umaal r5, r9, %[s], r11\n\t" + "umaal r6, r10, %[s], lr\n\t" + "umaal r6, r9, %[a], r11\n\t" + "umaal r7, r10, %[a], lr\n\t" + "umaal r7, r9, %[b], r11\n\t" + "umaal r8, r10, %[b], lr\n\t" + "umaal r8, r9, %[c], r11\n\t" + "umaal r9, r10, %[c], lr\n\t" + "mov %[c], r12\n\t" + "add lr, sp, #32\n\t" + "stm lr, {%[c], r4, r5, r6, r7, r8, r9, r10}\n\t" + "mov %[s], sp\n\t" + /* Add c to a * b */ + "ldr lr, [sp, #76]\n\t" + "ldm %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "ldm lr!, {%[a], r10, r11, r12}\n\t" + "adds %[b], %[b], %[a]\n\t" + "adcs %[c], %[c], r10\n\t" + "adcs r4, r4, r11\n\t" + "adcs r5, r5, r12\n\t" + "ldm lr!, {%[a], r10, r11, r12}\n\t" + "adcs r6, r6, %[a]\n\t" + "adcs r7, r7, r10\n\t" + "adcs r8, r8, r11\n\t" + "adcs r9, r9, r12\n\t" + "mov %[a], r9\n\t" + "stm %[s]!, {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "ldm %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "adcs %[b], %[b], #0\n\t" + "adcs %[c], %[c], #0\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "sub %[s], %[s], #32\n\t" + /* Get 252..503 and 504..507 */ + "lsr lr, r9, #24\n\t" + "lsl r9, r9, #4\n\t" + "orr r9, r9, r8, LSR #28\n\t" + "lsl r8, r8, #4\n\t" + "orr r8, r8, r7, LSR #28\n\t" + "lsl r7, r7, #4\n\t" + "orr r7, r7, r6, LSR #28\n\t" + "lsl r6, r6, #4\n\t" + "orr r6, r6, r5, LSR #28\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, LSR #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, %[c], LSR #28\n\t" + "lsl %[c], %[c], #4\n\t" + "orr %[c], %[c], %[b], LSR #28\n\t" + "lsl %[b], %[b], #4\n\t" + "orr %[b], %[b], %[a], LSR #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + /* Add order times bits 504..507 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xa3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #10\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #44\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x2c\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x13\n\t" #else - "strd r4, r5, [r1]\n\t" + "mov r10, #0x2c13\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" + "movt r10, #0xa30a\n\t" #endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xa7\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xed\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0xe5\n\t" #else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x9c\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0xe5\n\t" #else - "ldrd r4, r5, [r1, #16]\n\t" + "mov r11, #0x9ce5\n\t" #endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" + "movt r11, #0xa7ed\n\t" #endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" + "mov %[a], #0\n\t" + "umlal %[b], %[a], r10, lr\n\t" + "umaal %[c], %[a], r11, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5d\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #8\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x63\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0x29\n\t" #else - "strd r10, r11, [r1, #24]\n\t" + "mov r10, #0x6329\n\t" #endif - "ldr r0, [sp, #12]\n\t" - "ldr r1, [sp, #8]\n\t" - "add r2, sp, #16\n\t" - /* Add-Sub */ - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2]\n\t" - "ldr r5, [r2, #4]\n\t" -#else - "ldrd r4, r5, [r2]\n\t" + "movt r10, #0x5d08\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0]\n\t" - "ldr r7, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0xeb\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #6\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #33\n\t" #else - "ldrd r6, r7, [r0]\n\t" -#endif - "adds r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0]\n\t" - "str r9, [r0, #4]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x6\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x21\n\t" #else - "strd r8, r9, [r0]\n\t" + "mov r11, #0x621\n\t" #endif - /* Sub */ - "subs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1]\n\t" - "str r11, [r1, #4]\n\t" -#else - "strd r10, r11, [r1]\n\t" + "movt r11, #0xeb21\n\t" #endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #8]\n\t" - "ldr r5, [r2, #12]\n\t" + "umaal r4, %[a], r10, lr\n\t" + "umaal r5, %[a], r11, lr\n\t" + "adds r6, r6, %[a]\n\t" + "adcs r7, r7, #0\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, #0\n\t" + "subs r6, r6, lr\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbc r9, r9, #0\n\t" + /* Sub product of top 8 words and order */ + "mov r12, sp\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa3\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #10\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #44\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x2c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x13\n\t" +#else + "mov %[a], #0x2c13\n\t" +#endif + "movt %[a], #0xa30a\n\t" +#endif + "mov lr, #0\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "umaal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umaal r10, lr, r4, %[a]\n\t" + "umaal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umaal r10, lr, r6, %[a]\n\t" + "umaal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm %[s]!, {r10, r11}\n\t" + "umaal r10, lr, r8, %[a]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r11, r11, #0xf0000000\n\t" +#else + "bfc r11, #28, #4\n\t" +#endif + "umaal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub %[s], %[s], #16\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa7\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xed\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xe5\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0xe5\n\t" +#else + "mov %[a], #0x9ce5\n\t" +#endif + "movt %[a], #0xa7ed\n\t" +#endif + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "umaal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r4, %[a]\n\t" + "umaal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r6, %[a]\n\t" + "umaal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r8, %[a]\n\t" + "umaal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x5d\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #8\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x29\n\t" +#else + "mov %[a], #0x6329\n\t" +#endif + "movt %[a], #0x5d08\n\t" +#endif + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "umaal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r4, %[a]\n\t" + "umaal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r6, %[a]\n\t" + "umaal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r8, %[a]\n\t" + "umaal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xeb\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #6\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x6\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x21\n\t" +#else + "mov %[a], #0x621\n\t" +#endif + "movt %[a], #0xeb21\n\t" +#endif + "mov lr, #0\n\t" + "ldm r12, {r10, r11}\n\t" + "umlal r10, lr, %[b], %[a]\n\t" + "umaal r11, lr, %[c], %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r4, %[a]\n\t" + "umaal r11, lr, r5, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r6, %[a]\n\t" + "umaal r11, lr, r7, %[a]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "umaal r10, lr, r8, %[a]\n\t" + "umaal r11, lr, r9, %[a]\n\t" + "stm r12!, {r10, r11, lr}\n\t" + "sub r12, r12, #32\n\t" + /* Subtract at 4 * 32 */ + "ldm r12, {r10, r11}\n\t" + "subs r10, r10, %[b]\n\t" + "sbcs r11, r11, %[c]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r4\n\t" + "sbcs r11, r11, r5\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r6\n\t" + "sbcs r11, r11, r7\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "sbcs r10, r10, r8\n\t" + "sbc r11, r11, r9\n\t" + "stm r12!, {r10, r11}\n\t" + "sub r12, r12, #36\n\t" + "asr lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa00000\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x0\n\t" +#else + "mov %[a], #0xa0000000\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[b], #0x4b\n\t" + "lsl %[b], %[b], #8\n\t" + "orr %[b], %[b], #0x9e\n\t" + "lsl %[b], %[b], #8\n\t" + "orr %[b], %[b], #0xba\n\t" + "lsl %[b], %[b], #8\n\t" + "orr %[b], %[b], #0x7d\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[b], #0xba\n\t" + "lsl %[b], %[b], #8\n\t" + "add %[b], %[b], #0x7d\n\t" +#else + "mov %[b], #0xba7d\n\t" +#endif + "movt %[b], #0x4b9e\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[c], #0xcb\n\t" + "lsl %[c], %[c], #8\n\t" + "orr %[c], %[c], #2\n\t" + "lsl %[c], %[c], #8\n\t" + "orr %[c], %[c], #0x4c\n\t" + "lsl %[c], %[c], #8\n\t" + "orr %[c], %[c], #0x63\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[c], #0x4c\n\t" + "lsl %[c], %[c], #8\n\t" + "add %[c], %[c], #0x63\n\t" +#else + "mov %[c], #0x4c63\n\t" +#endif + "movt %[c], #0xcb02\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xd4\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x5e\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "orr r4, r4, #0x9a\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r4, #0xf3\n\t" + "lsl r4, r4, #8\n\t" + "add r4, r4, #0x9a\n\t" +#else + "mov r4, #0xf39a\n\t" +#endif + "movt r4, #0xd45e\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #2\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0x9b\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "orr r5, r5, #59\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r5, #0xdf\n\t" + "lsl r5, r5, #8\n\t" + "add r5, r5, #0x3b\n\t" +#else + "mov r5, #0xdf3b\n\t" +#endif + "movt r5, #0x29b\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r9, #0x20000\n\t" + "lsl r9, r9, #8\n\t" + "add r9, r9, #0x0\n\t" +#else + "mov r9, #0x2000000\n\t" +#endif + "and %[a], %[a], lr\n\t" + "and %[b], %[b], lr\n\t" + "and %[c], %[c], lr\n\t" + "and r4, r4, lr\n\t" + "and r5, r5, lr\n\t" + "and r9, r9, lr\n\t" + "ldm r12, {r10, r11}\n\t" + "adds r10, r10, %[a]\n\t" + "adcs r11, r11, %[b]\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, %[c]\n\t" + "adcs r11, r11, r4\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, r5\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10, r11}\n\t" + "adcs r10, r10, #0\n\t" + "adcs r11, r11, #0\n\t" + "stm r12!, {r10, r11}\n\t" + "ldm r12, {r10}\n\t" + "adcs r10, r10, #0\n\t" + "stm r12!, {r10}\n\t" + "sub %[s], %[s], #16\n\t" + "mov r12, sp\n\t" + /* Load bits 252-376 */ + "add r12, r12, #28\n\t" + "ldm r12, {%[a], %[b], %[c], r4, r5}\n\t" + "lsl r5, r5, #4\n\t" + "orr r5, r5, r4, lsr #28\n\t" + "lsl r4, r4, #4\n\t" + "orr r4, r4, %[c], lsr #28\n\t" + "lsl %[c], %[c], #4\n\t" + "orr %[c], %[c], %[b], lsr #28\n\t" + "lsl %[b], %[b], #4\n\t" + "orr %[b], %[b], %[a], lsr #28\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r5, r5, #0xe0000000\n\t" +#else + "bfc r5, #29, #3\n\t" +#endif + "sub r12, r12, #28\n\t" + /* Sub product of top 4 words and order */ + "mov %[s], sp\n\t" + /* * -5cf5d3ed */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa3\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #10\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #44\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #19\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x2c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x13\n\t" +#else + "mov %[a], #0x2c13\n\t" +#endif + "movt %[a], #0xa30a\n\t" +#endif + "mov lr, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, lr, %[b], %[a]\n\t" + "umaal r7, lr, %[c], %[a]\n\t" + "umaal r8, lr, r4, %[a]\n\t" + "umaal r9, lr, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -5812631b */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xa7\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xed\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0xe5\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x9c\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0xe5\n\t" #else - "ldrd r4, r5, [r2, #8]\n\t" + "mov %[a], #0x9ce5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #8]\n\t" - "ldr r7, [r0, #12]\n\t" -#else - "ldrd r6, r7, [r0, #8]\n\t" + "movt %[a], #0xa7ed\n\t" #endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #8]\n\t" - "str r9, [r0, #12]\n\t" + "mov r10, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r10, %[b], %[a]\n\t" + "umaal r7, r10, %[c], %[a]\n\t" + "umaal r8, r10, r4, %[a]\n\t" + "umaal r9, r10, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -a2f79cd7 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x5d\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #8\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #41\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x63\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x29\n\t" #else - "strd r8, r9, [r0, #8]\n\t" + "mov %[a], #0x6329\n\t" #endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #8]\n\t" - "str r11, [r1, #12]\n\t" -#else - "strd r10, r11, [r1, #8]\n\t" + "movt %[a], #0x5d08\n\t" #endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #16]\n\t" - "ldr r5, [r2, #20]\n\t" + "mov r11, #0\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r11, %[b], %[a]\n\t" + "umaal r7, r11, %[c], %[a]\n\t" + "umaal r8, r11, r4, %[a]\n\t" + "umaal r9, r11, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* * -14def9df */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0xeb\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #6\n\t" + "lsl %[a], %[a], #8\n\t" + "orr %[a], %[a], #33\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov %[a], #0x6\n\t" + "lsl %[a], %[a], #8\n\t" + "add %[a], %[a], #0x21\n\t" #else - "ldrd r4, r5, [r2, #16]\n\t" + "mov %[a], #0x621\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #16]\n\t" - "ldr r7, [r0, #20]\n\t" -#else - "ldrd r6, r7, [r0, #16]\n\t" + "movt %[a], #0xeb21\n\t" #endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" "mov r12, #0\n\t" - "adcs r9, r5, r7\n\t" - "adc r12, r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #16]\n\t" - "str r9, [r0, #20]\n\t" -#else - "strd r8, r9, [r0, #16]\n\t" -#endif - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "mov lr, #0\n\t" - "sbcs r11, r5, r7\n\t" - "adc lr, lr, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #16]\n\t" - "str r11, [r1, #20]\n\t" -#else - "strd r10, r11, [r1, #16]\n\t" -#endif - /* Add */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r2, #24]\n\t" - "ldr r5, [r2, #28]\n\t" -#else - "ldrd r4, r5, [r2, #24]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r6, [r0, #24]\n\t" - "ldr r7, [r0, #28]\n\t" -#else - "ldrd r6, r7, [r0, #24]\n\t" -#endif - "adds r12, r12, #-1\n\t" - "adcs r8, r4, r6\n\t" - "adc r9, r5, r7\n\t" - /* Sub */ - "adds lr, lr, #-1\n\t" - "sbcs r10, r4, r6\n\t" - "sbc r11, r5, r7\n\t" - "mov r12, #-19\n\t" - "asr %[rt], r9, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Sub modulus (if overflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0]\n\t" - "ldr r5, [r0, #4]\n\t" + "ldm %[s], {r6, r7, r8, r9}\n\t" + "umlal r6, r12, %[b], %[a]\n\t" + "umaal r7, r12, %[c], %[a]\n\t" + "umaal r8, r12, r4, %[a]\n\t" + "umaal r9, r12, r5, %[a]\n\t" + "stm %[s], {r6, r7, r8, r9}\n\t" + "add %[s], %[s], #4\n\t" + /* Add overflows at 4 * 32 */ + "ldm %[s], {r6, r7, r8, r9}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "adds r6, r6, lr\n\t" + "adcs r7, r7, r10\n\t" + "adcs r8, r8, r11\n\t" + "adc r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "subs r6, r6, %[b]\n\t" + "sbcs r7, r7, %[c]\n\t" + "sbcs r8, r8, r4\n\t" + "sbcs r9, r9, r5\n\t" + "sbc %[a], %[a], %[a]\n\t" + "sub %[s], %[s], #16\n\t" + "ldm %[s], {%[b], %[c], r4, r5}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x5c\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xf5\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "orr r10, r10, #0xed\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0xd3\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0xed\n\t" #else - "ldrd r4, r5, [r0]\n\t" + "mov r10, #0xd3ed\n\t" #endif - "subs r4, r4, r12\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0]\n\t" - "str r5, [r0, #4]\n\t" -#else - "strd r4, r5, [r0]\n\t" + "movt r10, #0x5cf5\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #8]\n\t" - "ldr r5, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x58\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #18\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "orr r11, r11, #26\n\t" #else - "ldrd r4, r5, [r0, #8]\n\t" -#endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #8]\n\t" - "str r5, [r0, #12]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r11, #0x63\n\t" + "lsl r11, r11, #8\n\t" + "add r11, r11, #0x1a\n\t" #else - "strd r4, r5, [r0, #8]\n\t" + "mov r11, #0x631a\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r0, #16]\n\t" - "ldr r5, [r0, #20]\n\t" -#else - "ldrd r4, r5, [r0, #16]\n\t" + "movt r11, #0x5812\n\t" #endif - "sbcs r4, r4, %[rt]\n\t" - "sbcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r0, #16]\n\t" - "str r5, [r0, #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0xa2\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xf7\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "orr r12, r12, #0xd6\n\t" #else - "strd r4, r5, [r0, #16]\n\t" -#endif - "sbcs r8, r8, %[rt]\n\t" - "sbc r9, r9, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [r0, #24]\n\t" - "str r9, [r0, #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r12, #0x9c\n\t" + "lsl r12, r12, #8\n\t" + "add r12, r12, #0xd6\n\t" #else - "strd r8, r9, [r0, #24]\n\t" + "mov r12, #0x9cd6\n\t" #endif - "mov r12, #-19\n\t" - "asr %[rt], r11, #31\n\t" - /* Mask the modulus */ - "and r12, %[rt], r12\n\t" - "and lr, %[rt], #0x7fffffff\n\t" - /* Add modulus (if underflow) */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1]\n\t" - "ldr r5, [r1, #4]\n\t" -#else - "ldrd r4, r5, [r1]\n\t" + "movt r12, #0xa2f7\n\t" #endif - "adds r4, r4, r12\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1]\n\t" - "str r5, [r1, #4]\n\t" -#else - "strd r4, r5, [r1]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #8]\n\t" - "ldr r5, [r1, #12]\n\t" -#else - "ldrd r4, r5, [r1, #8]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #8]\n\t" - "str r5, [r1, #12]\n\t" -#else - "strd r4, r5, [r1, #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r4, [r1, #16]\n\t" - "ldr r5, [r1, #20]\n\t" -#else - "ldrd r4, r5, [r1, #16]\n\t" -#endif - "adcs r4, r4, %[rt]\n\t" - "adcs r5, r5, %[rt]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r4, [r1, #16]\n\t" - "str r5, [r1, #20]\n\t" -#else - "strd r4, r5, [r1, #16]\n\t" -#endif - "adcs r10, r10, %[rt]\n\t" - "adc r11, r11, lr\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [r1, #24]\n\t" - "str r11, [r1, #28]\n\t" -#else - "strd r10, r11, [r1, #24]\n\t" -#endif - "add sp, sp, #0x60\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt) - : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" - ); - (void)px_p; - (void)py_p; - (void)pz_p; - (void)pt_p; - (void)qz_p; - (void)qt2d_p; - (void)qyplusx_p; - (void)qyminusx_p; +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #20\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "orr lr, lr, #0xde\n\t" +#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov lr, #0xf9\n\t" + "lsl lr, lr, #8\n\t" + "add lr, lr, #0xde\n\t" +#else + "mov lr, #0xf9de\n\t" +#endif + "movt lr, #0x14de\n\t" +#endif + "and r10, r10, %[a]\n\t" + "and r11, r11, %[a]\n\t" + "and r12, r12, %[a]\n\t" + "and lr, lr, %[a]\n\t" + "adds %[b], %[b], r10\n\t" + "adcs %[c], %[c], r11\n\t" + "adcs r4, r4, r12\n\t" + "adcs r5, r5, lr\n\t" + "adcs r6, r6, #0\n\t" + "adcs r7, r7, #0\n\t" + "and %[a], %[a], #0x10000000\n\t" + "adcs r8, r8, #0\n\t" + "adc r9, r9, %[a]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "bic r9, r9, #0xf0000000\n\t" +#else + "bfc r9, #28, #4\n\t" +#endif + "ldr %[s], [sp, #68]\n\t" + /* Store result */ + "str %[b], [%[s]]\n\t" + "str %[c], [%[s], #4]\n\t" + "str r4, [%[s], #8]\n\t" + "str r5, [%[s], #12]\n\t" + "str r6, [%[s], #16]\n\t" + "str r7, [%[s], #20]\n\t" + "str r8, [%[s], #24]\n\t" + "str r9, [%[s], #28]\n\t" + "add sp, sp, #0x50\n\t" + : [s] "+r" (s), [a] "+r" (a), [b] "+r" (b), [c] "+r" (c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); } - -#endif /* HAVE_CURVE25519 */ -#endif /* !__aarch64__ */ +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ +#endif /* HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ + +#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ +#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ #endif /* WOLFSSL_ARMASM */ +#endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */ +#endif /* WOLFSSL_ARMASM */ + +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,7 +30,8 @@ #include #ifdef WOLFSSL_ARMASM -#ifndef __aarch64__ +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE #ifndef NO_SHA256 #ifdef WOLFSSL_ARMASM_NO_NEON .text @@ -111,49 +112,49 @@ sub sp, sp, #0xc0 adr r3, L_SHA256_transform_len_k # Copy digest to add in at end -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else ldrd r8, r9, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r0, #24] ldr r11, [r0, #28] #else ldrd r10, r11, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #64] str r5, [sp, #68] #else strd r4, r5, [sp, #64] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #72] str r7, [sp, #76] #else strd r6, r7, [sp, #72] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [sp, #80] str r9, [sp, #84] #else strd r8, r9, [sp, #80] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r10, [sp, #88] str r11, [sp, #92] #else @@ -162,30 +163,144 @@ # Start of loop processing a block L_SHA256_transform_len_begin: # Load, Reverse and Store W - 64 bytes -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) ldr r4, [r1] ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r6, [r1, #8] ldr r7, [r1, #12] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp] + str r5, [sp, #4] #else - ldrd r6, r7, [r1, #8] + strd r4, r5, [sp] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r8, [r1, #16] - ldr r9, [r1, #20] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #8] + str r7, [sp, #12] #else - ldrd r8, r9, [r1, #16] + strd r6, r7, [sp, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - ldr r10, [r1, #24] - ldr r11, [r1, #28] + ldr r4, [r1, #16] + ldr r5, [r1, #20] + ldr r6, [r1, #24] + ldr r7, [r1, #28] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #16] + str r5, [sp, #20] +#else + strd r4, r5, [sp, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #24] + str r7, [sp, #28] #else - ldrd r10, r11, [r1, #24] + strd r6, r7, [sp, #24] #endif + ldr r4, [r1, #32] + ldr r5, [r1, #36] + ldr r6, [r1, #40] + ldr r7, [r1, #44] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #32] + str r5, [sp, #36] +#else + strd r4, r5, [sp, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #40] + str r7, [sp, #44] +#else + strd r6, r7, [sp, #40] +#endif + ldr r4, [r1, #48] + ldr r5, [r1, #52] + ldr r6, [r1, #56] + ldr r7, [r1, #60] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #48] + str r5, [sp, #52] +#else + strd r4, r5, [sp, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #56] + str r7, [sp, #60] +#else + strd r6, r7, [sp, #56] +#endif +#else + ldr r4, [r1] + ldr r5, [r1, #4] + ldr r6, [r1, #8] + ldr r7, [r1, #12] + ldr r8, [r1, #16] + ldr r9, [r1, #20] + ldr r10, [r1, #24] + ldr r11, [r1, #28] rev r4, r4 rev r5, r5 rev r6, r6 @@ -194,54 +309,38 @@ rev r9, r9 rev r10, r10 rev r11, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp] str r5, [sp, #4] #else strd r4, r5, [sp] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #8] str r7, [sp, #12] #else strd r6, r7, [sp, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [sp, #16] str r9, [sp, #20] #else strd r8, r9, [sp, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r10, [sp, #24] str r11, [sp, #28] #else strd r10, r11, [sp, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r4, [r1, #32] ldr r5, [r1, #36] -#else - ldrd r4, r5, [r1, #32] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r6, [r1, #40] ldr r7, [r1, #44] -#else - ldrd r6, r7, [r1, #40] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r8, [r1, #48] ldr r9, [r1, #52] -#else - ldrd r8, r9, [r1, #48] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] -#else - ldrd r10, r11, [r1, #56] -#endif rev r4, r4 rev r5, r5 rev r6, r6 @@ -250,30 +349,31 @@ rev r9, r9 rev r10, r10 rev r11, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #32] str r5, [sp, #36] #else strd r4, r5, [sp, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #40] str r7, [sp, #44] #else strd r6, r7, [sp, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [sp, #48] str r9, [sp, #52] #else strd r8, r9, [sp, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r10, [sp, #56] str r11, [sp, #60] #else strd r10, r11, [sp, #56] #endif +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ ldr r11, [r0, #4] ldr r4, [r0, #8] eor r11, r11, r4 @@ -1548,25 +1648,25 @@ str r8, [r0, #16] str r9, [r0] # Add in digest from start -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #64] ldr r9, [sp, #68] #else ldrd r8, r9, [sp, #64] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [sp, #72] ldr r11, [sp, #76] #else @@ -1576,49 +1676,49 @@ add r5, r5, r9 add r6, r6, r10 add r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else strd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #8] str r7, [r0, #12] #else strd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #64] str r5, [sp, #68] #else strd r4, r5, [sp, #64] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #72] str r7, [sp, #76] #else strd r6, r7, [sp, #72] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #80] ldr r9, [sp, #84] #else ldrd r8, r9, [sp, #80] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [sp, #88] ldr r11, [sp, #92] #else @@ -1628,25 +1728,25 @@ add r5, r5, r9 add r6, r6, r10 add r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else strd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #24] str r7, [r0, #28] #else strd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #80] str r5, [sp, #84] #else strd r4, r5, [sp, #80] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #88] str r7, [sp, #92] #else @@ -1739,7 +1839,7 @@ push {r4, r5, r6, r7, r8, r9, r10, lr} vpush {d8-d11} sub sp, sp, #24 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r0, [sp] str r1, [sp, #4] #else @@ -1748,25 +1848,25 @@ str r2, [sp, #8] adr r12, L_SHA256_transform_neon_len_k # Load digest into registers -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r2, [r0] ldr r3, [r0, #4] #else ldrd r2, r3, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -1797,7 +1897,7 @@ # Start of 16 rounds L_SHA256_transform_neon_len_start: # Round 0 - vmov r10, d0[0] + vmov.32 r10, d0[0] ror r0, r6, #6 eor r1, r7, r8 eor r0, r0, r6, ror #11 @@ -1820,7 +1920,7 @@ add r9, r9, r0 add r9, r9, r1 # Round 1 - vmov r10, d0[1] + vmov.32 r10, d0[1] # Calc new W[0]-W[1] vext.8 d10, d0, d1, #4 ror r0, r5, #6 @@ -1863,7 +1963,7 @@ add r8, r8, r0 add r8, r8, r1 # Round 2 - vmov r10, d1[0] + vmov.32 r10, d1[0] ror r0, r4, #6 eor r1, r5, r6 eor r0, r0, r4, ror #11 @@ -1886,7 +1986,7 @@ add r7, r7, r0 add r7, r7, r1 # Round 3 - vmov r10, d1[1] + vmov.32 r10, d1[1] # Calc new W[2]-W[3] vext.8 d10, d1, d2, #4 ror r0, r3, #6 @@ -1929,7 +2029,7 @@ add r6, r6, r0 add r6, r6, r1 # Round 4 - vmov r10, d2[0] + vmov.32 r10, d2[0] ror r0, r2, #6 eor r1, r3, r4 eor r0, r0, r2, ror #11 @@ -1952,7 +2052,7 @@ add r5, r5, r0 add r5, r5, r1 # Round 5 - vmov r10, d2[1] + vmov.32 r10, d2[1] # Calc new W[4]-W[5] vext.8 d10, d2, d3, #4 ror r0, r9, #6 @@ -1995,7 +2095,7 @@ add r4, r4, r0 add r4, r4, r1 # Round 6 - vmov r10, d3[0] + vmov.32 r10, d3[0] ror r0, r8, #6 eor r1, r9, r2 eor r0, r0, r8, ror #11 @@ -2018,7 +2118,7 @@ add r3, r3, r0 add r3, r3, r1 # Round 7 - vmov r10, d3[1] + vmov.32 r10, d3[1] # Calc new W[6]-W[7] vext.8 d10, d3, d4, #4 ror r0, r7, #6 @@ -2061,7 +2161,7 @@ add r2, r2, r0 add r2, r2, r1 # Round 8 - vmov r10, d4[0] + vmov.32 r10, d4[0] ror r0, r6, #6 eor r1, r7, r8 eor r0, r0, r6, ror #11 @@ -2084,7 +2184,7 @@ add r9, r9, r0 add r9, r9, r1 # Round 9 - vmov r10, d4[1] + vmov.32 r10, d4[1] # Calc new W[8]-W[9] vext.8 d10, d4, d5, #4 ror r0, r5, #6 @@ -2127,7 +2227,7 @@ add r8, r8, r0 add r8, r8, r1 # Round 10 - vmov r10, d5[0] + vmov.32 r10, d5[0] ror r0, r4, #6 eor r1, r5, r6 eor r0, r0, r4, ror #11 @@ -2150,7 +2250,7 @@ add r7, r7, r0 add r7, r7, r1 # Round 11 - vmov r10, d5[1] + vmov.32 r10, d5[1] # Calc new W[10]-W[11] vext.8 d10, d5, d6, #4 ror r0, r3, #6 @@ -2193,7 +2293,7 @@ add r6, r6, r0 add r6, r6, r1 # Round 12 - vmov r10, d6[0] + vmov.32 r10, d6[0] ror r0, r2, #6 eor r1, r3, r4 eor r0, r0, r2, ror #11 @@ -2216,7 +2316,7 @@ add r5, r5, r0 add r5, r5, r1 # Round 13 - vmov r10, d6[1] + vmov.32 r10, d6[1] # Calc new W[12]-W[13] vext.8 d10, d6, d7, #4 ror r0, r9, #6 @@ -2259,7 +2359,7 @@ add r4, r4, r0 add r4, r4, r1 # Round 14 - vmov r10, d7[0] + vmov.32 r10, d7[0] ror r0, r8, #6 eor r1, r9, r2 eor r0, r0, r8, ror #11 @@ -2282,7 +2382,7 @@ add r3, r3, r0 add r3, r3, r1 # Round 15 - vmov r10, d7[1] + vmov.32 r10, d7[1] # Calc new W[14]-W[15] vext.8 d10, d7, d0, #4 ror r0, r7, #6 @@ -2328,7 +2428,7 @@ subs lr, lr, #1 bne L_SHA256_transform_neon_len_start # Round 0 - vmov r10, d0[0] + vmov.32 r10, d0[0] ror r0, r6, #6 eor r1, r7, r8 eor r0, r0, r6, ror #11 @@ -2351,7 +2451,7 @@ add r9, r9, r0 add r9, r9, r1 # Round 1 - vmov r10, d0[1] + vmov.32 r10, d0[1] ror r0, r5, #6 eor r1, r6, r7 eor r0, r0, r5, ror #11 @@ -2374,7 +2474,7 @@ add r8, r8, r0 add r8, r8, r1 # Round 2 - vmov r10, d1[0] + vmov.32 r10, d1[0] ror r0, r4, #6 eor r1, r5, r6 eor r0, r0, r4, ror #11 @@ -2397,7 +2497,7 @@ add r7, r7, r0 add r7, r7, r1 # Round 3 - vmov r10, d1[1] + vmov.32 r10, d1[1] ror r0, r3, #6 eor r1, r4, r5 eor r0, r0, r3, ror #11 @@ -2420,7 +2520,7 @@ add r6, r6, r0 add r6, r6, r1 # Round 4 - vmov r10, d2[0] + vmov.32 r10, d2[0] ror r0, r2, #6 eor r1, r3, r4 eor r0, r0, r2, ror #11 @@ -2443,7 +2543,7 @@ add r5, r5, r0 add r5, r5, r1 # Round 5 - vmov r10, d2[1] + vmov.32 r10, d2[1] ror r0, r9, #6 eor r1, r2, r3 eor r0, r0, r9, ror #11 @@ -2466,7 +2566,7 @@ add r4, r4, r0 add r4, r4, r1 # Round 6 - vmov r10, d3[0] + vmov.32 r10, d3[0] ror r0, r8, #6 eor r1, r9, r2 eor r0, r0, r8, ror #11 @@ -2489,7 +2589,7 @@ add r3, r3, r0 add r3, r3, r1 # Round 7 - vmov r10, d3[1] + vmov.32 r10, d3[1] ror r0, r7, #6 eor r1, r8, r9 eor r0, r0, r7, ror #11 @@ -2512,7 +2612,7 @@ add r2, r2, r0 add r2, r2, r1 # Round 8 - vmov r10, d4[0] + vmov.32 r10, d4[0] ror r0, r6, #6 eor r1, r7, r8 eor r0, r0, r6, ror #11 @@ -2535,7 +2635,7 @@ add r9, r9, r0 add r9, r9, r1 # Round 9 - vmov r10, d4[1] + vmov.32 r10, d4[1] ror r0, r5, #6 eor r1, r6, r7 eor r0, r0, r5, ror #11 @@ -2558,7 +2658,7 @@ add r8, r8, r0 add r8, r8, r1 # Round 10 - vmov r10, d5[0] + vmov.32 r10, d5[0] ror r0, r4, #6 eor r1, r5, r6 eor r0, r0, r4, ror #11 @@ -2581,7 +2681,7 @@ add r7, r7, r0 add r7, r7, r1 # Round 11 - vmov r10, d5[1] + vmov.32 r10, d5[1] ror r0, r3, #6 eor r1, r4, r5 eor r0, r0, r3, ror #11 @@ -2604,7 +2704,7 @@ add r6, r6, r0 add r6, r6, r1 # Round 12 - vmov r10, d6[0] + vmov.32 r10, d6[0] ror r0, r2, #6 eor r1, r3, r4 eor r0, r0, r2, ror #11 @@ -2627,7 +2727,7 @@ add r5, r5, r0 add r5, r5, r1 # Round 13 - vmov r10, d6[1] + vmov.32 r10, d6[1] ror r0, r9, #6 eor r1, r2, r3 eor r0, r0, r9, ror #11 @@ -2650,7 +2750,7 @@ add r4, r4, r0 add r4, r4, r1 # Round 14 - vmov r10, d7[0] + vmov.32 r10, d7[0] ror r0, r8, #6 eor r1, r9, r2 eor r0, r0, r8, ror #11 @@ -2673,7 +2773,7 @@ add r3, r3, r0 add r3, r3, r1 # Round 15 - vmov r10, d7[1] + vmov.32 r10, d7[1] ror r0, r7, #6 eor r1, r8, r9 eor r0, r0, r7, ror #11 @@ -2697,7 +2797,7 @@ add r2, r2, r1 ldr r10, [sp] # Add in digest from start -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r0, [r10] ldr r1, [r10, #4] #else @@ -2705,13 +2805,13 @@ #endif add r2, r2, r0 add r3, r3, r1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r2, [r10] str r3, [r10, #4] #else strd r2, r3, [r10] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r0, [r10, #8] ldr r1, [r10, #12] #else @@ -2719,13 +2819,13 @@ #endif add r4, r4, r0 add r5, r5, r1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r10, #8] str r5, [r10, #12] #else strd r4, r5, [r10, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r0, [r10, #16] ldr r1, [r10, #20] #else @@ -2733,13 +2833,13 @@ #endif add r6, r6, r0 add r7, r7, r1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r10, #16] str r7, [r10, #20] #else strd r6, r7, [r10, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r0, [r10, #24] ldr r1, [r10, #28] #else @@ -2747,7 +2847,7 @@ #endif add r8, r8, r0 add r9, r9, r1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r10, #24] str r9, [r10, #28] #else @@ -2765,9 +2865,10 @@ .size Transform_Sha256_Len,.-Transform_Sha256_Len #endif /* WOLFSSL_ARMASM_NO_NEON */ #endif /* !NO_SHA256 */ -#endif /* !__aarch64__ */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ #endif /* WOLFSSL_ARMASM */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,139 +28,106 @@ #include #endif /* HAVE_CONFIG_H */ #include +#include #ifdef WOLFSSL_ARMASM -#ifndef __aarch64__ +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) #include #ifdef HAVE_CONFIG_H #include #endif /* HAVE_CONFIG_H */ #include +#include +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ #ifndef NO_SHA256 #include #ifdef WOLFSSL_ARMASM_NO_NEON static const uint32_t L_SHA256_transform_len_k[] = { - 0x428a2f98, - 0x71374491, - 0xb5c0fbcf, - 0xe9b5dba5, - 0x3956c25b, - 0x59f111f1, - 0x923f82a4, - 0xab1c5ed5, - 0xd807aa98, - 0x12835b01, - 0x243185be, - 0x550c7dc3, - 0x72be5d74, - 0x80deb1fe, - 0x9bdc06a7, - 0xc19bf174, - 0xe49b69c1, - 0xefbe4786, - 0xfc19dc6, - 0x240ca1cc, - 0x2de92c6f, - 0x4a7484aa, - 0x5cb0a9dc, - 0x76f988da, - 0x983e5152, - 0xa831c66d, - 0xb00327c8, - 0xbf597fc7, - 0xc6e00bf3, - 0xd5a79147, - 0x6ca6351, - 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, + 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, }; -void Transform_Sha256_Len(wc_Sha256* sha256_p, const byte* data_p, word32 len_p); +void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, word32 len); void Transform_Sha256_Len(wc_Sha256* sha256_p, const byte* data_p, word32 len_p) { - register wc_Sha256* sha256 asm ("r0") = sha256_p; - register const byte* data asm ("r1") = data_p; - register word32 len asm ("r2") = len_p; + register wc_Sha256* sha256 asm ("r0") = (wc_Sha256*)sha256_p; + register const byte* data asm ("r1") = (const byte*)data_p; + register word32 len asm ("r2") = (word32)len_p; + register uint32_t* L_SHA256_transform_len_k_c asm ("r3") = (uint32_t*)&L_SHA256_transform_len_k; __asm__ __volatile__ ( "sub sp, sp, #0xc0\n\t" - "mov r3, %[L_SHA256_transform_len_k]\n\t" /* Copy digest to add in at end */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha256]]\n\t" "ldr r5, [%[sha256], #4]\n\t" #else "ldrd r4, r5, [%[sha256]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha256], #8]\n\t" "ldr r7, [%[sha256], #12]\n\t" #else "ldrd r6, r7, [%[sha256], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha256], #16]\n\t" "ldr r9, [%[sha256], #20]\n\t" #else "ldrd r8, r9, [%[sha256], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[sha256], #24]\n\t" "ldr r11, [%[sha256], #28]\n\t" #else "ldrd r10, r11, [%[sha256], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #64]\n\t" "str r5, [sp, #68]\n\t" #else "strd r4, r5, [sp, #64]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #72]\n\t" "str r7, [sp, #76]\n\t" #else "strd r6, r7, [sp, #72]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [sp, #80]\n\t" "str r9, [sp, #84]\n\t" #else "strd r8, r9, [sp, #80]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r10, [sp, #88]\n\t" "str r11, [sp, #92]\n\t" #else @@ -170,30 +137,144 @@ "\n" "L_SHA256_transform_len_begin_%=: \n\t" /* Load, Reverse and Store W - 64 bytes */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) "ldr r4, [%[data]]\n\t" "ldr r5, [%[data], #4]\n\t" -#else - "ldrd r4, r5, [%[data]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r6, [%[data], #8]\n\t" "ldr r7, [%[data], #12]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp]\n\t" + "str r5, [sp, #4]\n\t" #else - "ldrd r6, r7, [%[data], #8]\n\t" + "strd r4, r5, [sp]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r8, [%[data], #16]\n\t" - "ldr r9, [%[data], #20]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #8]\n\t" + "str r7, [sp, #12]\n\t" #else - "ldrd r8, r9, [%[data], #16]\n\t" + "strd r6, r7, [sp, #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "ldr r10, [%[data], #24]\n\t" - "ldr r11, [%[data], #28]\n\t" + "ldr r4, [%[data], #16]\n\t" + "ldr r5, [%[data], #20]\n\t" + "ldr r6, [%[data], #24]\n\t" + "ldr r7, [%[data], #28]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #16]\n\t" + "str r5, [sp, #20]\n\t" +#else + "strd r4, r5, [sp, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #24]\n\t" + "str r7, [sp, #28]\n\t" +#else + "strd r6, r7, [sp, #24]\n\t" +#endif + "ldr r4, [%[data], #32]\n\t" + "ldr r5, [%[data], #36]\n\t" + "ldr r6, [%[data], #40]\n\t" + "ldr r7, [%[data], #44]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #32]\n\t" + "str r5, [sp, #36]\n\t" +#else + "strd r4, r5, [sp, #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #40]\n\t" + "str r7, [sp, #44]\n\t" #else - "ldrd r10, r11, [%[data], #24]\n\t" + "strd r6, r7, [sp, #40]\n\t" #endif + "ldr r4, [%[data], #48]\n\t" + "ldr r5, [%[data], #52]\n\t" + "ldr r6, [%[data], #56]\n\t" + "ldr r7, [%[data], #60]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #48]\n\t" + "str r5, [sp, #52]\n\t" +#else + "strd r4, r5, [sp, #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #56]\n\t" + "str r7, [sp, #60]\n\t" +#else + "strd r6, r7, [sp, #56]\n\t" +#endif +#else + "ldr r4, [%[data]]\n\t" + "ldr r5, [%[data], #4]\n\t" + "ldr r6, [%[data], #8]\n\t" + "ldr r7, [%[data], #12]\n\t" + "ldr r8, [%[data], #16]\n\t" + "ldr r9, [%[data], #20]\n\t" + "ldr r10, [%[data], #24]\n\t" + "ldr r11, [%[data], #28]\n\t" "rev r4, r4\n\t" "rev r5, r5\n\t" "rev r6, r6\n\t" @@ -202,54 +283,38 @@ "rev r9, r9\n\t" "rev r10, r10\n\t" "rev r11, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp]\n\t" "str r5, [sp, #4]\n\t" #else "strd r4, r5, [sp]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #8]\n\t" "str r7, [sp, #12]\n\t" #else "strd r6, r7, [sp, #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [sp, #16]\n\t" "str r9, [sp, #20]\n\t" #else "strd r8, r9, [sp, #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r10, [sp, #24]\n\t" "str r11, [sp, #28]\n\t" #else "strd r10, r11, [sp, #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r4, [%[data], #32]\n\t" "ldr r5, [%[data], #36]\n\t" -#else - "ldrd r4, r5, [%[data], #32]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r6, [%[data], #40]\n\t" "ldr r7, [%[data], #44]\n\t" -#else - "ldrd r6, r7, [%[data], #40]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r8, [%[data], #48]\n\t" "ldr r9, [%[data], #52]\n\t" -#else - "ldrd r8, r9, [%[data], #48]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r10, [%[data], #56]\n\t" "ldr r11, [%[data], #60]\n\t" -#else - "ldrd r10, r11, [%[data], #56]\n\t" -#endif "rev r4, r4\n\t" "rev r5, r5\n\t" "rev r6, r6\n\t" @@ -258,30 +323,31 @@ "rev r9, r9\n\t" "rev r10, r10\n\t" "rev r11, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #32]\n\t" "str r5, [sp, #36]\n\t" #else "strd r4, r5, [sp, #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #40]\n\t" "str r7, [sp, #44]\n\t" #else "strd r6, r7, [sp, #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [sp, #48]\n\t" "str r9, [sp, #52]\n\t" #else "strd r8, r9, [sp, #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r10, [sp, #56]\n\t" "str r11, [sp, #60]\n\t" #else "strd r10, r11, [sp, #56]\n\t" #endif +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ "ldr r11, [%[sha256], #4]\n\t" "ldr r4, [%[sha256], #8]\n\t" "eor r11, r11, r4\n\t" @@ -1557,25 +1623,25 @@ "str r8, [%[sha256], #16]\n\t" "str r9, [%[sha256]]\n\t" /* Add in digest from start */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha256]]\n\t" "ldr r5, [%[sha256], #4]\n\t" #else "ldrd r4, r5, [%[sha256]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha256], #8]\n\t" "ldr r7, [%[sha256], #12]\n\t" #else "ldrd r6, r7, [%[sha256], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #64]\n\t" "ldr r9, [sp, #68]\n\t" #else "ldrd r8, r9, [sp, #64]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [sp, #72]\n\t" "ldr r11, [sp, #76]\n\t" #else @@ -1585,49 +1651,49 @@ "add r5, r5, r9\n\t" "add r6, r6, r10\n\t" "add r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha256]]\n\t" "str r5, [%[sha256], #4]\n\t" #else "strd r4, r5, [%[sha256]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha256], #8]\n\t" "str r7, [%[sha256], #12]\n\t" #else "strd r6, r7, [%[sha256], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #64]\n\t" "str r5, [sp, #68]\n\t" #else "strd r4, r5, [sp, #64]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #72]\n\t" "str r7, [sp, #76]\n\t" #else "strd r6, r7, [sp, #72]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha256], #16]\n\t" "ldr r5, [%[sha256], #20]\n\t" #else "ldrd r4, r5, [%[sha256], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha256], #24]\n\t" "ldr r7, [%[sha256], #28]\n\t" #else "ldrd r6, r7, [%[sha256], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #80]\n\t" "ldr r9, [sp, #84]\n\t" #else "ldrd r8, r9, [sp, #80]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [sp, #88]\n\t" "ldr r11, [sp, #92]\n\t" #else @@ -1637,25 +1703,25 @@ "add r5, r5, r9\n\t" "add r6, r6, r10\n\t" "add r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha256], #16]\n\t" "str r5, [%[sha256], #20]\n\t" #else "strd r4, r5, [%[sha256], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha256], #24]\n\t" "str r7, [%[sha256], #28]\n\t" #else "strd r6, r7, [%[sha256], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #80]\n\t" "str r5, [sp, #84]\n\t" #else "strd r4, r5, [sp, #80]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #88]\n\t" "str r7, [sp, #92]\n\t" #else @@ -1666,9 +1732,9 @@ "add %[data], %[data], #0x40\n\t" "bne L_SHA256_transform_len_begin_%=\n\t" "add sp, sp, #0xc0\n\t" - : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len) - : [L_SHA256_transform_len_k] "r" (L_SHA256_transform_len_k) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len), [L_SHA256_transform_len_k] "+r" (L_SHA256_transform_len_k_c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -1677,82 +1743,35 @@ #ifndef WOLFSSL_ARMASM_NO_NEON static const uint32_t L_SHA256_transform_neon_len_k[] = { - 0x428a2f98, - 0x71374491, - 0xb5c0fbcf, - 0xe9b5dba5, - 0x3956c25b, - 0x59f111f1, - 0x923f82a4, - 0xab1c5ed5, - 0xd807aa98, - 0x12835b01, - 0x243185be, - 0x550c7dc3, - 0x72be5d74, - 0x80deb1fe, - 0x9bdc06a7, - 0xc19bf174, - 0xe49b69c1, - 0xefbe4786, - 0xfc19dc6, - 0x240ca1cc, - 0x2de92c6f, - 0x4a7484aa, - 0x5cb0a9dc, - 0x76f988da, - 0x983e5152, - 0xa831c66d, - 0xb00327c8, - 0xbf597fc7, - 0xc6e00bf3, - 0xd5a79147, - 0x6ca6351, - 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, + 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, }; -void Transform_Sha256_Len(wc_Sha256* sha256_p, const byte* data_p, word32 len_p); +void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, word32 len); void Transform_Sha256_Len(wc_Sha256* sha256_p, const byte* data_p, word32 len_p) { - register wc_Sha256* sha256 asm ("r0") = sha256_p; - register const byte* data asm ("r1") = data_p; - register word32 len asm ("r2") = len_p; + register wc_Sha256* sha256 asm ("r0") = (wc_Sha256*)sha256_p; + register const byte* data asm ("r1") = (const byte*)data_p; + register word32 len asm ("r2") = (word32)len_p; + register uint32_t* L_SHA256_transform_neon_len_k_c asm ("r3") = (uint32_t*)&L_SHA256_transform_neon_len_k; __asm__ __volatile__ ( "sub sp, sp, #24\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str %[sha256], [sp]\n\t" "str %[data], [sp, #4]\n\t" #else @@ -1761,25 +1780,25 @@ "str %[len], [sp, #8]\n\t" "mov r12, %[L_SHA256_transform_neon_len_k]\n\t" /* Load digest into registers */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr %[len], [%[sha256]]\n\t" "ldr r3, [%[sha256], #4]\n\t" #else "ldrd %[len], r3, [%[sha256]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha256], #8]\n\t" "ldr r5, [%[sha256], #12]\n\t" #else "ldrd r4, r5, [%[sha256], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha256], #16]\n\t" "ldr r7, [%[sha256], #20]\n\t" #else "ldrd r6, r7, [%[sha256], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha256], #24]\n\t" "ldr r9, [%[sha256], #28]\n\t" #else @@ -1812,7 +1831,7 @@ "\n" "L_SHA256_transform_neon_len_start_%=: \n\t" /* Round 0 */ - "vmov r10, d0[0]\n\t" + "vmov.32 r10, d0[0]\n\t" "ror %[sha256], r6, #6\n\t" "eor %[data], r7, r8\n\t" "eor %[sha256], %[sha256], r6, ror #11\n\t" @@ -1835,7 +1854,7 @@ "add r9, r9, %[sha256]\n\t" "add r9, r9, %[data]\n\t" /* Round 1 */ - "vmov r10, d0[1]\n\t" + "vmov.32 r10, d0[1]\n\t" /* Calc new W[0]-W[1] */ "vext.8 d10, d0, d1, #4\n\t" "ror %[sha256], r5, #6\n\t" @@ -1878,7 +1897,7 @@ "add r8, r8, %[sha256]\n\t" "add r8, r8, %[data]\n\t" /* Round 2 */ - "vmov r10, d1[0]\n\t" + "vmov.32 r10, d1[0]\n\t" "ror %[sha256], r4, #6\n\t" "eor %[data], r5, r6\n\t" "eor %[sha256], %[sha256], r4, ror #11\n\t" @@ -1901,7 +1920,7 @@ "add r7, r7, %[sha256]\n\t" "add r7, r7, %[data]\n\t" /* Round 3 */ - "vmov r10, d1[1]\n\t" + "vmov.32 r10, d1[1]\n\t" /* Calc new W[2]-W[3] */ "vext.8 d10, d1, d2, #4\n\t" "ror %[sha256], r3, #6\n\t" @@ -1944,7 +1963,7 @@ "add r6, r6, %[sha256]\n\t" "add r6, r6, %[data]\n\t" /* Round 4 */ - "vmov r10, d2[0]\n\t" + "vmov.32 r10, d2[0]\n\t" "ror %[sha256], %[len], #6\n\t" "eor %[data], r3, r4\n\t" "eor %[sha256], %[sha256], %[len], ror #11\n\t" @@ -1967,7 +1986,7 @@ "add r5, r5, %[sha256]\n\t" "add r5, r5, %[data]\n\t" /* Round 5 */ - "vmov r10, d2[1]\n\t" + "vmov.32 r10, d2[1]\n\t" /* Calc new W[4]-W[5] */ "vext.8 d10, d2, d3, #4\n\t" "ror %[sha256], r9, #6\n\t" @@ -2010,7 +2029,7 @@ "add r4, r4, %[sha256]\n\t" "add r4, r4, %[data]\n\t" /* Round 6 */ - "vmov r10, d3[0]\n\t" + "vmov.32 r10, d3[0]\n\t" "ror %[sha256], r8, #6\n\t" "eor %[data], r9, %[len]\n\t" "eor %[sha256], %[sha256], r8, ror #11\n\t" @@ -2033,7 +2052,7 @@ "add r3, r3, %[sha256]\n\t" "add r3, r3, %[data]\n\t" /* Round 7 */ - "vmov r10, d3[1]\n\t" + "vmov.32 r10, d3[1]\n\t" /* Calc new W[6]-W[7] */ "vext.8 d10, d3, d4, #4\n\t" "ror %[sha256], r7, #6\n\t" @@ -2076,7 +2095,7 @@ "add %[len], %[len], %[sha256]\n\t" "add %[len], %[len], %[data]\n\t" /* Round 8 */ - "vmov r10, d4[0]\n\t" + "vmov.32 r10, d4[0]\n\t" "ror %[sha256], r6, #6\n\t" "eor %[data], r7, r8\n\t" "eor %[sha256], %[sha256], r6, ror #11\n\t" @@ -2099,7 +2118,7 @@ "add r9, r9, %[sha256]\n\t" "add r9, r9, %[data]\n\t" /* Round 9 */ - "vmov r10, d4[1]\n\t" + "vmov.32 r10, d4[1]\n\t" /* Calc new W[8]-W[9] */ "vext.8 d10, d4, d5, #4\n\t" "ror %[sha256], r5, #6\n\t" @@ -2142,7 +2161,7 @@ "add r8, r8, %[sha256]\n\t" "add r8, r8, %[data]\n\t" /* Round 10 */ - "vmov r10, d5[0]\n\t" + "vmov.32 r10, d5[0]\n\t" "ror %[sha256], r4, #6\n\t" "eor %[data], r5, r6\n\t" "eor %[sha256], %[sha256], r4, ror #11\n\t" @@ -2165,7 +2184,7 @@ "add r7, r7, %[sha256]\n\t" "add r7, r7, %[data]\n\t" /* Round 11 */ - "vmov r10, d5[1]\n\t" + "vmov.32 r10, d5[1]\n\t" /* Calc new W[10]-W[11] */ "vext.8 d10, d5, d6, #4\n\t" "ror %[sha256], r3, #6\n\t" @@ -2208,7 +2227,7 @@ "add r6, r6, %[sha256]\n\t" "add r6, r6, %[data]\n\t" /* Round 12 */ - "vmov r10, d6[0]\n\t" + "vmov.32 r10, d6[0]\n\t" "ror %[sha256], %[len], #6\n\t" "eor %[data], r3, r4\n\t" "eor %[sha256], %[sha256], %[len], ror #11\n\t" @@ -2231,7 +2250,7 @@ "add r5, r5, %[sha256]\n\t" "add r5, r5, %[data]\n\t" /* Round 13 */ - "vmov r10, d6[1]\n\t" + "vmov.32 r10, d6[1]\n\t" /* Calc new W[12]-W[13] */ "vext.8 d10, d6, d7, #4\n\t" "ror %[sha256], r9, #6\n\t" @@ -2274,7 +2293,7 @@ "add r4, r4, %[sha256]\n\t" "add r4, r4, %[data]\n\t" /* Round 14 */ - "vmov r10, d7[0]\n\t" + "vmov.32 r10, d7[0]\n\t" "ror %[sha256], r8, #6\n\t" "eor %[data], r9, %[len]\n\t" "eor %[sha256], %[sha256], r8, ror #11\n\t" @@ -2297,7 +2316,7 @@ "add r3, r3, %[sha256]\n\t" "add r3, r3, %[data]\n\t" /* Round 15 */ - "vmov r10, d7[1]\n\t" + "vmov.32 r10, d7[1]\n\t" /* Calc new W[14]-W[15] */ "vext.8 d10, d7, d0, #4\n\t" "ror %[sha256], r7, #6\n\t" @@ -2343,7 +2362,7 @@ "subs lr, lr, #1\n\t" "bne L_SHA256_transform_neon_len_start_%=\n\t" /* Round 0 */ - "vmov r10, d0[0]\n\t" + "vmov.32 r10, d0[0]\n\t" "ror %[sha256], r6, #6\n\t" "eor %[data], r7, r8\n\t" "eor %[sha256], %[sha256], r6, ror #11\n\t" @@ -2366,7 +2385,7 @@ "add r9, r9, %[sha256]\n\t" "add r9, r9, %[data]\n\t" /* Round 1 */ - "vmov r10, d0[1]\n\t" + "vmov.32 r10, d0[1]\n\t" "ror %[sha256], r5, #6\n\t" "eor %[data], r6, r7\n\t" "eor %[sha256], %[sha256], r5, ror #11\n\t" @@ -2389,7 +2408,7 @@ "add r8, r8, %[sha256]\n\t" "add r8, r8, %[data]\n\t" /* Round 2 */ - "vmov r10, d1[0]\n\t" + "vmov.32 r10, d1[0]\n\t" "ror %[sha256], r4, #6\n\t" "eor %[data], r5, r6\n\t" "eor %[sha256], %[sha256], r4, ror #11\n\t" @@ -2412,7 +2431,7 @@ "add r7, r7, %[sha256]\n\t" "add r7, r7, %[data]\n\t" /* Round 3 */ - "vmov r10, d1[1]\n\t" + "vmov.32 r10, d1[1]\n\t" "ror %[sha256], r3, #6\n\t" "eor %[data], r4, r5\n\t" "eor %[sha256], %[sha256], r3, ror #11\n\t" @@ -2435,7 +2454,7 @@ "add r6, r6, %[sha256]\n\t" "add r6, r6, %[data]\n\t" /* Round 4 */ - "vmov r10, d2[0]\n\t" + "vmov.32 r10, d2[0]\n\t" "ror %[sha256], %[len], #6\n\t" "eor %[data], r3, r4\n\t" "eor %[sha256], %[sha256], %[len], ror #11\n\t" @@ -2458,7 +2477,7 @@ "add r5, r5, %[sha256]\n\t" "add r5, r5, %[data]\n\t" /* Round 5 */ - "vmov r10, d2[1]\n\t" + "vmov.32 r10, d2[1]\n\t" "ror %[sha256], r9, #6\n\t" "eor %[data], %[len], r3\n\t" "eor %[sha256], %[sha256], r9, ror #11\n\t" @@ -2481,7 +2500,7 @@ "add r4, r4, %[sha256]\n\t" "add r4, r4, %[data]\n\t" /* Round 6 */ - "vmov r10, d3[0]\n\t" + "vmov.32 r10, d3[0]\n\t" "ror %[sha256], r8, #6\n\t" "eor %[data], r9, %[len]\n\t" "eor %[sha256], %[sha256], r8, ror #11\n\t" @@ -2504,7 +2523,7 @@ "add r3, r3, %[sha256]\n\t" "add r3, r3, %[data]\n\t" /* Round 7 */ - "vmov r10, d3[1]\n\t" + "vmov.32 r10, d3[1]\n\t" "ror %[sha256], r7, #6\n\t" "eor %[data], r8, r9\n\t" "eor %[sha256], %[sha256], r7, ror #11\n\t" @@ -2527,7 +2546,7 @@ "add %[len], %[len], %[sha256]\n\t" "add %[len], %[len], %[data]\n\t" /* Round 8 */ - "vmov r10, d4[0]\n\t" + "vmov.32 r10, d4[0]\n\t" "ror %[sha256], r6, #6\n\t" "eor %[data], r7, r8\n\t" "eor %[sha256], %[sha256], r6, ror #11\n\t" @@ -2550,7 +2569,7 @@ "add r9, r9, %[sha256]\n\t" "add r9, r9, %[data]\n\t" /* Round 9 */ - "vmov r10, d4[1]\n\t" + "vmov.32 r10, d4[1]\n\t" "ror %[sha256], r5, #6\n\t" "eor %[data], r6, r7\n\t" "eor %[sha256], %[sha256], r5, ror #11\n\t" @@ -2573,7 +2592,7 @@ "add r8, r8, %[sha256]\n\t" "add r8, r8, %[data]\n\t" /* Round 10 */ - "vmov r10, d5[0]\n\t" + "vmov.32 r10, d5[0]\n\t" "ror %[sha256], r4, #6\n\t" "eor %[data], r5, r6\n\t" "eor %[sha256], %[sha256], r4, ror #11\n\t" @@ -2596,7 +2615,7 @@ "add r7, r7, %[sha256]\n\t" "add r7, r7, %[data]\n\t" /* Round 11 */ - "vmov r10, d5[1]\n\t" + "vmov.32 r10, d5[1]\n\t" "ror %[sha256], r3, #6\n\t" "eor %[data], r4, r5\n\t" "eor %[sha256], %[sha256], r3, ror #11\n\t" @@ -2619,7 +2638,7 @@ "add r6, r6, %[sha256]\n\t" "add r6, r6, %[data]\n\t" /* Round 12 */ - "vmov r10, d6[0]\n\t" + "vmov.32 r10, d6[0]\n\t" "ror %[sha256], %[len], #6\n\t" "eor %[data], r3, r4\n\t" "eor %[sha256], %[sha256], %[len], ror #11\n\t" @@ -2642,7 +2661,7 @@ "add r5, r5, %[sha256]\n\t" "add r5, r5, %[data]\n\t" /* Round 13 */ - "vmov r10, d6[1]\n\t" + "vmov.32 r10, d6[1]\n\t" "ror %[sha256], r9, #6\n\t" "eor %[data], %[len], r3\n\t" "eor %[sha256], %[sha256], r9, ror #11\n\t" @@ -2665,7 +2684,7 @@ "add r4, r4, %[sha256]\n\t" "add r4, r4, %[data]\n\t" /* Round 14 */ - "vmov r10, d7[0]\n\t" + "vmov.32 r10, d7[0]\n\t" "ror %[sha256], r8, #6\n\t" "eor %[data], r9, %[len]\n\t" "eor %[sha256], %[sha256], r8, ror #11\n\t" @@ -2688,7 +2707,7 @@ "add r3, r3, %[sha256]\n\t" "add r3, r3, %[data]\n\t" /* Round 15 */ - "vmov r10, d7[1]\n\t" + "vmov.32 r10, d7[1]\n\t" "ror %[sha256], r7, #6\n\t" "eor %[data], r8, r9\n\t" "eor %[sha256], %[sha256], r7, ror #11\n\t" @@ -2712,7 +2731,7 @@ "add %[len], %[len], %[data]\n\t" "ldr r10, [sp]\n\t" /* Add in digest from start */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr %[sha256], [r10]\n\t" "ldr %[data], [r10, #4]\n\t" #else @@ -2720,13 +2739,13 @@ #endif "add %[len], %[len], %[sha256]\n\t" "add r3, r3, %[data]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str %[len], [r10]\n\t" "str r3, [r10, #4]\n\t" #else "strd %[len], r3, [r10]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr %[sha256], [r10, #8]\n\t" "ldr %[data], [r10, #12]\n\t" #else @@ -2734,13 +2753,13 @@ #endif "add r4, r4, %[sha256]\n\t" "add r5, r5, %[data]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [r10, #8]\n\t" "str r5, [r10, #12]\n\t" #else "strd r4, r5, [r10, #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr %[sha256], [r10, #16]\n\t" "ldr %[data], [r10, #20]\n\t" #else @@ -2748,13 +2767,13 @@ #endif "add r6, r6, %[sha256]\n\t" "add r7, r7, %[data]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [r10, #16]\n\t" "str r7, [r10, #20]\n\t" #else "strd r6, r7, [r10, #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr %[sha256], [r10, #24]\n\t" "ldr %[data], [r10, #28]\n\t" #else @@ -2762,7 +2781,7 @@ #endif "add r8, r8, %[sha256]\n\t" "add r9, r9, %[data]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [r10, #24]\n\t" "str r9, [r10, #28]\n\t" #else @@ -2775,13 +2794,17 @@ "str r10, [sp, #8]\n\t" "bne L_SHA256_transform_neon_len_begin_%=\n\t" "add sp, sp, #24\n\t" - : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len) - : [L_SHA256_transform_neon_len_k] "r" (L_SHA256_transform_neon_len_k) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11" + : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len), [L_SHA256_transform_neon_len_k] "+r" (L_SHA256_transform_neon_len_k_c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "cc" ); } #endif /* WOLFSSL_ARMASM_NO_NEON */ #endif /* !NO_SHA256 */ -#endif /* !__aarch64__ */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */ #endif /* WOLFSSL_ARMASM */ + +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2400 @@ +/* armv8-32-sha3-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha3/sha3.rb arm32 ../wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm.S + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE + .text + .type L_sha3_arm2_neon_rt, %object + .size L_sha3_arm2_neon_rt, 192 + .align 4 +L_sha3_arm2_neon_rt: + .word 0x1 + .word 0x0 + .word 0x8082 + .word 0x0 + .word 0x808a + .word 0x80000000 + .word 0x80008000 + .word 0x80000000 + .word 0x808b + .word 0x0 + .word 0x80000001 + .word 0x0 + .word 0x80008081 + .word 0x80000000 + .word 0x8009 + .word 0x80000000 + .word 0x8a + .word 0x0 + .word 0x88 + .word 0x0 + .word 0x80008009 + .word 0x0 + .word 0x8000000a + .word 0x0 + .word 0x8000808b + .word 0x0 + .word 0x8b + .word 0x80000000 + .word 0x8089 + .word 0x80000000 + .word 0x8003 + .word 0x80000000 + .word 0x8002 + .word 0x80000000 + .word 0x80 + .word 0x80000000 + .word 0x800a + .word 0x0 + .word 0x8000000a + .word 0x80000000 + .word 0x80008081 + .word 0x80000000 + .word 0x8080 + .word 0x80000000 + .word 0x80000001 + .word 0x0 + .word 0x80008008 + .word 0x80000000 + .text + .type L_sha3_arm2_rt, %object + .size L_sha3_arm2_rt, 192 + .align 4 +L_sha3_arm2_rt: + .word 0x1 + .word 0x0 + .word 0x8082 + .word 0x0 + .word 0x808a + .word 0x80000000 + .word 0x80008000 + .word 0x80000000 + .word 0x808b + .word 0x0 + .word 0x80000001 + .word 0x0 + .word 0x80008081 + .word 0x80000000 + .word 0x8009 + .word 0x80000000 + .word 0x8a + .word 0x0 + .word 0x88 + .word 0x0 + .word 0x80008009 + .word 0x0 + .word 0x8000000a + .word 0x0 + .word 0x8000808b + .word 0x0 + .word 0x8b + .word 0x80000000 + .word 0x8089 + .word 0x80000000 + .word 0x8003 + .word 0x80000000 + .word 0x8002 + .word 0x80000000 + .word 0x80 + .word 0x80000000 + .word 0x800a + .word 0x0 + .word 0x8000000a + .word 0x80000000 + .word 0x80008081 + .word 0x80000000 + .word 0x8080 + .word 0x80000000 + .word 0x80000001 + .word 0x0 + .word 0x80008008 + .word 0x80000000 +#ifndef WOLFSSL_ARMASM_NO_NEON + .text + .align 4 + .globl BlockSha3 + .type BlockSha3, %function +BlockSha3: + vpush {d8-d15} + sub sp, sp, #16 + adr r1, L_sha3_arm2_neon_rt + mov r2, #24 + mov r3, sp + vld1.8 {d0-d3}, [r0]! + vld1.8 {d4-d7}, [r0]! + vld1.8 {d8-d11}, [r0]! + vld1.8 {d12-d15}, [r0]! + vld1.8 {d16-d19}, [r0]! + vld1.8 {d20-d23}, [r0]! + vld1.8 {d24}, [r0] + sub r0, r0, #0xc0 +L_sha3_arm32_neon_begin: + # Calc b[0..4] + veor d26, d0, d5 + veor d27, d1, d6 + veor d28, d2, d7 + veor d29, d3, d8 + veor d25, d4, d9 + veor d26, d26, d10 + veor d27, d27, d11 + veor d28, d28, d12 + veor d29, d29, d13 + veor d25, d25, d14 + veor d26, d26, d15 + veor d27, d27, d16 + veor d28, d28, d17 + veor d29, d29, d18 + veor d25, d25, d19 + veor d26, d26, d20 + veor d27, d27, d21 + veor d28, d28, d22 + veor d29, d29, d23 + veor d25, d25, d24 + vst1.8 {d25, d26}, [r3] + # Calc t[0..4] and XOR into s[i*5..i*5+4] + # t[0] + vshr.u64 d30, d27, #63 + vshl.u64 d31, d27, #1 + veor d25, d25, d30 + veor d25, d25, d31 + # t[1] + vshr.u64 d30, d28, #63 + vshl.u64 d31, d28, #1 + veor d26, d26, d30 + veor d26, d26, d31 + # t[2] + vshr.u64 d30, d29, #63 + vshl.u64 d31, d29, #1 + veor d27, d27, d30 + veor d27, d27, d31 + # t[3] + vldr.8 d31, [r3] + vshr.u64 d30, d31, #63 + vshl.u64 d31, d31, #1 + veor d28, d28, d30 + veor d28, d28, d31 + # t[4] + vldr.8 d31, [r3, #8] + vshr.u64 d30, d31, #63 + vshl.u64 d31, d31, #1 + veor d29, d29, d30 + veor d29, d29, d31 + sub r3, r3, #16 + veor d0, d0, d25 + # s[1] => s[10] (tmp) + veor d30, d1, d26 + vshr.u64 d31, d30, #63 + vshl.u64 d30, d30, #1 + veor d30, d30, d31 + # s[6] => s[1] + veor d1, d6, d26 + vshr.u64 d31, d1, #20 + vshl.u64 d1, d1, #44 + veor d1, d1, d31 + # s[9] => s[6] + veor d6, d9, d29 + vshr.u64 d31, d6, #44 + vshl.u64 d6, d6, #20 + veor d6, d6, d31 + # s[22] => s[9] + veor d9, d22, d27 + vshr.u64 d31, d9, #3 + vshl.u64 d9, d9, #61 + veor d9, d9, d31 + # s[14] => s[22] + veor d22, d14, d29 + vshr.u64 d31, d22, #25 + vshl.u64 d22, d22, #39 + veor d22, d22, d31 + # s[20] => s[14] + veor d14, d20, d25 + vshr.u64 d31, d14, #46 + vshl.u64 d14, d14, #18 + veor d14, d14, d31 + # s[2] => s[20] + veor d20, d2, d27 + vshr.u64 d31, d20, #2 + vshl.u64 d20, d20, #62 + veor d20, d20, d31 + # s[12] => s[2] + veor d2, d12, d27 + vshr.u64 d31, d2, #21 + vshl.u64 d2, d2, #43 + veor d2, d2, d31 + # s[13] => s[12] + veor d12, d13, d28 + vshr.u64 d31, d12, #39 + vshl.u64 d12, d12, #25 + veor d12, d12, d31 + # s[19] => s[13] + veor d13, d19, d29 + vshr.u64 d31, d13, #56 + vshl.u64 d13, d13, #8 + veor d13, d13, d31 + # s[23] => s[19] + veor d19, d23, d28 + vshr.u64 d31, d19, #8 + vshl.u64 d19, d19, #56 + veor d19, d19, d31 + # s[15] => s[23] + veor d23, d15, d25 + vshr.u64 d31, d23, #23 + vshl.u64 d23, d23, #41 + veor d23, d23, d31 + # s[4] => s[15] + veor d15, d4, d29 + vshr.u64 d31, d15, #37 + vshl.u64 d15, d15, #27 + veor d15, d15, d31 + # s[24] => s[4] + veor d4, d24, d29 + vshr.u64 d31, d4, #50 + vshl.u64 d4, d4, #14 + veor d4, d4, d31 + # s[21] => s[24] + veor d24, d21, d26 + vshr.u64 d31, d24, #62 + vshl.u64 d24, d24, #2 + veor d24, d24, d31 + # s[8] => s[21] + veor d21, d8, d28 + vshr.u64 d31, d21, #9 + vshl.u64 d21, d21, #55 + veor d21, d21, d31 + # s[16] => s[8] + veor d8, d16, d26 + vshr.u64 d31, d8, #19 + vshl.u64 d8, d8, #45 + veor d8, d8, d31 + # s[5] => s[16] + veor d16, d5, d25 + vshr.u64 d31, d16, #28 + vshl.u64 d16, d16, #36 + veor d16, d16, d31 + # s[3] => s[5] + veor d5, d3, d28 + vshr.u64 d31, d5, #36 + vshl.u64 d5, d5, #28 + veor d5, d5, d31 + # s[18] => s[3] + veor d3, d18, d28 + vshr.u64 d31, d3, #43 + vshl.u64 d3, d3, #21 + veor d3, d3, d31 + # s[17] => s[18] + veor d18, d17, d27 + vshr.u64 d31, d18, #49 + vshl.u64 d18, d18, #15 + veor d18, d18, d31 + # s[11] => s[17] + veor d17, d11, d26 + vshr.u64 d31, d17, #54 + vshl.u64 d17, d17, #10 + veor d17, d17, d31 + # s[7] => s[11] + veor d11, d7, d27 + vshr.u64 d31, d11, #58 + vshl.u64 d11, d11, #6 + veor d11, d11, d31 + # s[10] => s[7] + veor d7, d10, d25 + vshr.u64 d31, d7, #61 + vshl.u64 d7, d7, #3 + veor d7, d7, d31 + # Row Mix + vmov d25, d0 + vmov d26, d1 + vbic d31, d2, d26 + veor d0, d25, d31 + vbic d31, d3, d2 + veor d1, d26, d31 + vbic d31, d4, d3 + veor d2, d2, d31 + vbic d31, d25, d4 + veor d3, d3, d31 + vbic d31, d26, d25 + veor d4, d4, d31 + vmov d25, d5 + vmov d26, d6 + vbic d31, d7, d26 + veor d5, d25, d31 + vbic d31, d8, d7 + veor d6, d26, d31 + vbic d31, d9, d8 + veor d7, d7, d31 + vbic d31, d25, d9 + veor d8, d8, d31 + vbic d31, d26, d25 + veor d9, d9, d31 + vmov d26, d11 + vbic d31, d12, d26 + veor d10, d30, d31 + vbic d31, d13, d12 + veor d11, d26, d31 + vbic d31, d14, d13 + veor d12, d12, d31 + vbic d31, d30, d14 + veor d13, d13, d31 + vbic d31, d26, d30 + veor d14, d14, d31 + vmov d25, d15 + vmov d26, d16 + vbic d31, d17, d26 + veor d15, d25, d31 + vbic d31, d18, d17 + veor d16, d26, d31 + vbic d31, d19, d18 + veor d17, d17, d31 + vbic d31, d25, d19 + veor d18, d18, d31 + vbic d31, d26, d25 + veor d19, d19, d31 + vmov d25, d20 + vmov d26, d21 + vbic d31, d22, d26 + veor d20, d25, d31 + vbic d31, d23, d22 + veor d21, d26, d31 + vbic d31, d24, d23 + veor d22, d22, d31 + vbic d31, d25, d24 + veor d23, d23, d31 + vbic d31, d26, d25 + veor d24, d24, d31 + vld1.8 {d30}, [r1]! + subs r2, r2, #1 + veor d0, d0, d30 + bne L_sha3_arm32_neon_begin + vst1.8 {d0-d3}, [r0]! + vst1.8 {d4-d7}, [r0]! + vst1.8 {d8-d11}, [r0]! + vst1.8 {d12-d15}, [r0]! + vst1.8 {d16-d19}, [r0]! + vst1.8 {d20-d23}, [r0]! + vst1.8 {d24}, [r0] + add sp, sp, #16 + vpop {d8-d15} + bx lr + .size BlockSha3,.-BlockSha3 +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#ifdef WOLFSSL_ARMASM_NO_NEON + .text + .align 4 + .globl BlockSha3 + .type BlockSha3, %function +BlockSha3: + push {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #0xcc + adr r1, L_sha3_arm2_rt + mov r2, #12 +L_sha3_arm32_begin: + str r2, [sp, #200] + # Round even + # Calc b[4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #32] + ldr r5, [r0, #36] +#else + ldrd r4, r5, [r0, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #72] + ldr r7, [r0, #76] +#else + ldrd r6, r7, [r0, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #112] + ldr r9, [r0, #116] +#else + ldrd r8, r9, [r0, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #152] + ldr r11, [r0, #156] +#else + ldrd r10, r11, [r0, #152] +#endif + ldr r12, [r0, #192] + ldr lr, [r0, #196] + eor r2, r4, r6 + eor r3, r5, r7 + eor r2, r2, r8 + eor r3, r3, r9 + eor r2, r2, r10 + eor r3, r3, r11 + eor r2, r2, r12 + eor r3, r3, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r2, [sp, #32] + str r3, [sp, #36] +#else + strd r2, r3, [sp, #32] +#endif + # Calc b[1] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #8] + ldr r5, [r0, #12] +#else + ldrd r4, r5, [r0, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #48] + ldr r7, [r0, #52] +#else + ldrd r6, r7, [r0, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #88] + ldr r9, [r0, #92] +#else + ldrd r8, r9, [r0, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #128] + ldr r11, [r0, #132] +#else + ldrd r10, r11, [r0, #128] +#endif + ldr r12, [r0, #168] + ldr lr, [r0, #172] + eor r4, r4, r6 + eor r5, r5, r7 + eor r4, r4, r8 + eor r5, r5, r9 + eor r4, r4, r10 + eor r5, r5, r11 + eor r4, r4, r12 + eor r5, r5, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #8] + str r5, [sp, #12] +#else + strd r4, r5, [sp, #8] +#endif + # Calc t[0] + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # Calc b[0] and XOR t[0] into s[x*5+0] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0] + ldr r5, [r0, #4] +#else + ldrd r4, r5, [r0] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #40] + ldr r7, [r0, #44] +#else + ldrd r6, r7, [r0, #40] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #80] + ldr r9, [r0, #84] +#else + ldrd r8, r9, [r0, #80] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #120] + ldr r11, [r0, #124] +#else + ldrd r10, r11, [r0, #120] +#endif + eor r12, r4, r6 + eor lr, r5, r7 + eor r12, r12, r8 + eor lr, lr, r9 + eor r12, r12, r10 + eor lr, lr, r11 + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0] + str r5, [r0, #4] +#else + strd r4, r5, [r0] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [r0, #40] + str r7, [r0, #44] +#else + strd r6, r7, [r0, #40] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #80] + str r9, [r0, #84] +#else + strd r8, r9, [r0, #80] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r0, #120] + str r11, [r0, #124] +#else + strd r10, r11, [r0, #120] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #160] + ldr r11, [r0, #164] +#else + ldrd r10, r11, [r0, #160] +#endif + eor r12, r12, r10 + eor lr, lr, r11 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r0, #160] + str r11, [r0, #164] +#else + strd r10, r11, [r0, #160] +#endif + str r12, [sp] + str lr, [sp, #4] + # Calc b[3] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #24] + ldr r5, [r0, #28] +#else + ldrd r4, r5, [r0, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #64] + ldr r7, [r0, #68] +#else + ldrd r6, r7, [r0, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #104] + ldr r9, [r0, #108] +#else + ldrd r8, r9, [r0, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #144] + ldr r11, [r0, #148] +#else + ldrd r10, r11, [r0, #144] +#endif + ldr r12, [r0, #184] + ldr lr, [r0, #188] + eor r4, r4, r6 + eor r5, r5, r7 + eor r4, r4, r8 + eor r5, r5, r9 + eor r4, r4, r10 + eor r5, r5, r11 + eor r4, r4, r12 + eor r5, r5, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #24] + str r5, [sp, #28] +#else + strd r4, r5, [sp, #24] +#endif + # Calc t[2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp, #8] + ldr r3, [sp, #12] +#else + ldrd r2, r3, [sp, #8] +#endif + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # Calc b[2] and XOR t[2] into s[x*5+2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #16] + ldr r5, [r0, #20] +#else + ldrd r4, r5, [r0, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #56] + ldr r7, [r0, #60] +#else + ldrd r6, r7, [r0, #56] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #96] + ldr r9, [r0, #100] +#else + ldrd r8, r9, [r0, #96] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #136] + ldr r11, [r0, #140] +#else + ldrd r10, r11, [r0, #136] +#endif + eor r12, r4, r6 + eor lr, r5, r7 + eor r12, r12, r8 + eor lr, lr, r9 + eor r12, r12, r10 + eor lr, lr, r11 + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0, #16] + str r5, [r0, #20] +#else + strd r4, r5, [r0, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [r0, #56] + str r7, [r0, #60] +#else + strd r6, r7, [r0, #56] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #96] + str r9, [r0, #100] +#else + strd r8, r9, [r0, #96] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r0, #136] + str r11, [r0, #140] +#else + strd r10, r11, [r0, #136] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #176] + ldr r11, [r0, #180] +#else + ldrd r10, r11, [r0, #176] +#endif + eor r12, r12, r10 + eor lr, lr, r11 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r0, #176] + str r11, [r0, #180] +#else + strd r10, r11, [r0, #176] +#endif + str r12, [sp, #16] + str lr, [sp, #20] + # Calc t[1] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp] + ldr r3, [sp, #4] +#else + ldrd r2, r3, [sp] +#endif + eor r2, r2, lr, lsr #31 + eor r3, r3, r12, lsr #31 + eor r2, r2, r12, lsl #1 + eor r3, r3, lr, lsl #1 + # XOR t[1] into s[x*5+1] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #8] + ldr r5, [r0, #12] +#else + ldrd r4, r5, [r0, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #48] + ldr r7, [r0, #52] +#else + ldrd r6, r7, [r0, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #88] + ldr r9, [r0, #92] +#else + ldrd r8, r9, [r0, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #128] + ldr r11, [r0, #132] +#else + ldrd r10, r11, [r0, #128] +#endif + ldr r12, [r0, #168] + ldr lr, [r0, #172] + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 + eor r12, r12, r2 + eor lr, lr, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0, #8] + str r5, [r0, #12] +#else + strd r4, r5, [r0, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [r0, #48] + str r7, [r0, #52] +#else + strd r6, r7, [r0, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #88] + str r9, [r0, #92] +#else + strd r8, r9, [r0, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r0, #128] + str r11, [r0, #132] +#else + strd r10, r11, [r0, #128] +#endif + str r12, [r0, #168] + str lr, [r0, #172] + # Calc t[3] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp, #16] + ldr r3, [sp, #20] +#else + ldrd r2, r3, [sp, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #32] + ldr r5, [sp, #36] +#else + ldrd r4, r5, [sp, #32] +#endif + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # XOR t[3] into s[x*5+3] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #24] + ldr r5, [r0, #28] +#else + ldrd r4, r5, [r0, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #64] + ldr r7, [r0, #68] +#else + ldrd r6, r7, [r0, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #104] + ldr r9, [r0, #108] +#else + ldrd r8, r9, [r0, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #144] + ldr r11, [r0, #148] +#else + ldrd r10, r11, [r0, #144] +#endif + ldr r12, [r0, #184] + ldr lr, [r0, #188] + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 + eor r12, r12, r2 + eor lr, lr, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0, #24] + str r5, [r0, #28] +#else + strd r4, r5, [r0, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [r0, #64] + str r7, [r0, #68] +#else + strd r6, r7, [r0, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #104] + str r9, [r0, #108] +#else + strd r8, r9, [r0, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r0, #144] + str r11, [r0, #148] +#else + strd r10, r11, [r0, #144] +#endif + str r12, [r0, #184] + str lr, [r0, #188] + # Calc t[4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp, #24] + ldr r3, [sp, #28] +#else + ldrd r2, r3, [sp, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp] + ldr r5, [sp, #4] +#else + ldrd r4, r5, [sp] +#endif + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # XOR t[4] into s[x*5+4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #32] + ldr r5, [r0, #36] +#else + ldrd r4, r5, [r0, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #72] + ldr r7, [r0, #76] +#else + ldrd r6, r7, [r0, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #112] + ldr r9, [r0, #116] +#else + ldrd r8, r9, [r0, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #152] + ldr r11, [r0, #156] +#else + ldrd r10, r11, [r0, #152] +#endif + ldr r12, [r0, #192] + ldr lr, [r0, #196] + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 + eor r12, r12, r2 + eor lr, lr, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0, #32] + str r5, [r0, #36] +#else + strd r4, r5, [r0, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [r0, #72] + str r7, [r0, #76] +#else + strd r6, r7, [r0, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [r0, #112] + str r9, [r0, #116] +#else + strd r8, r9, [r0, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [r0, #152] + str r11, [r0, #156] +#else + strd r10, r11, [r0, #152] +#endif + str r12, [r0, #192] + str lr, [r0, #196] + # Row Mix + # Row 0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0] + ldr r3, [r0, #4] +#else + ldrd r2, r3, [r0] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #48] + ldr r5, [r0, #52] +#else + ldrd r4, r5, [r0, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #96] + ldr r7, [r0, #100] +#else + ldrd r6, r7, [r0, #96] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #144] + ldr r9, [r0, #148] +#else + ldrd r8, r9, [r0, #144] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #192] + ldr r11, [r0, #196] +#else + ldrd r10, r11, [r0, #192] +#endif + # s[1] <<< 44 + mov lr, r4 + lsr r12, r5, #20 + lsr r4, r4, #20 + orr r4, r4, r5, lsl #12 + orr r5, r12, lr, lsl #12 + # s[2] <<< 43 + mov lr, r6 + lsr r12, r7, #21 + lsr r6, r6, #21 + orr r6, r6, r7, lsl #11 + orr r7, r12, lr, lsl #11 + # s[3] <<< 21 + lsr r12, r9, #11 + lsr lr, r8, #11 + orr r8, r12, r8, lsl #21 + orr r9, lr, r9, lsl #21 + # s[4] <<< 14 + lsr r12, r11, #18 + lsr lr, r10, #18 + orr r10, r12, r10, lsl #14 + orr r11, lr, r11, lsl #14 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [sp, #8] + str lr, [sp, #12] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [sp, #16] + str lr, [sp, #20] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [sp, #24] + str lr, [sp, #28] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [sp, #32] + str lr, [sp, #36] + # Get constant +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r1] + ldr r11, [r1, #4] +#else + ldrd r10, r11, [r1] +#endif + add r1, r1, #8 + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + # XOR in constant + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [sp] + str lr, [sp, #4] + # Row 1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0, #24] + ldr r3, [r0, #28] +#else + ldrd r2, r3, [r0, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #72] + ldr r5, [r0, #76] +#else + ldrd r4, r5, [r0, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #80] + ldr r7, [r0, #84] +#else + ldrd r6, r7, [r0, #80] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #128] + ldr r9, [r0, #132] +#else + ldrd r8, r9, [r0, #128] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #176] + ldr r11, [r0, #180] +#else + ldrd r10, r11, [r0, #176] +#endif + # s[0] <<< 28 + lsr r12, r3, #4 + lsr lr, r2, #4 + orr r2, r12, r2, lsl #28 + orr r3, lr, r3, lsl #28 + # s[1] <<< 20 + lsr r12, r5, #12 + lsr lr, r4, #12 + orr r4, r12, r4, lsl #20 + orr r5, lr, r5, lsl #20 + # s[2] <<< 3 + lsr r12, r7, #29 + lsr lr, r6, #29 + orr r6, r12, r6, lsl #3 + orr r7, lr, r7, lsl #3 + # s[3] <<< 45 + mov lr, r8 + lsr r12, r9, #19 + lsr r8, r8, #19 + orr r8, r8, r9, lsl #13 + orr r9, r12, lr, lsl #13 + # s[4] <<< 61 + mov lr, r10 + lsr r12, r11, #3 + lsr r10, r10, #3 + orr r10, r10, r11, lsl #29 + orr r11, r12, lr, lsl #29 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [sp, #48] + str lr, [sp, #52] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [sp, #56] + str lr, [sp, #60] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [sp, #64] + str lr, [sp, #68] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [sp, #72] + str lr, [sp, #76] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [sp, #40] + str lr, [sp, #44] + # Row 2 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0, #8] + ldr r3, [r0, #12] +#else + ldrd r2, r3, [r0, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #56] + ldr r5, [r0, #60] +#else + ldrd r4, r5, [r0, #56] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #104] + ldr r7, [r0, #108] +#else + ldrd r6, r7, [r0, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #152] + ldr r9, [r0, #156] +#else + ldrd r8, r9, [r0, #152] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #160] + ldr r11, [r0, #164] +#else + ldrd r10, r11, [r0, #160] +#endif + # s[0] <<< 1 + lsr r12, r3, #31 + lsr lr, r2, #31 + orr r2, r12, r2, lsl #1 + orr r3, lr, r3, lsl #1 + # s[1] <<< 6 + lsr r12, r5, #26 + lsr lr, r4, #26 + orr r4, r12, r4, lsl #6 + orr r5, lr, r5, lsl #6 + # s[2] <<< 25 + lsr r12, r7, #7 + lsr lr, r6, #7 + orr r6, r12, r6, lsl #25 + orr r7, lr, r7, lsl #25 + # s[3] <<< 8 + lsr r12, r9, #24 + lsr lr, r8, #24 + orr r8, r12, r8, lsl #8 + orr r9, lr, r9, lsl #8 + # s[4] <<< 18 + lsr r12, r11, #14 + lsr lr, r10, #14 + orr r10, r12, r10, lsl #18 + orr r11, lr, r11, lsl #18 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [sp, #88] + str lr, [sp, #92] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [sp, #96] + str lr, [sp, #100] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [sp, #104] + str lr, [sp, #108] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [sp, #112] + str lr, [sp, #116] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [sp, #80] + str lr, [sp, #84] + # Row 3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0, #32] + ldr r3, [r0, #36] +#else + ldrd r2, r3, [r0, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #40] + ldr r5, [r0, #44] +#else + ldrd r4, r5, [r0, #40] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #88] + ldr r7, [r0, #92] +#else + ldrd r6, r7, [r0, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #136] + ldr r9, [r0, #140] +#else + ldrd r8, r9, [r0, #136] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #184] + ldr r11, [r0, #188] +#else + ldrd r10, r11, [r0, #184] +#endif + # s[0] <<< 27 + lsr r12, r3, #5 + lsr lr, r2, #5 + orr r2, r12, r2, lsl #27 + orr r3, lr, r3, lsl #27 + # s[1] <<< 36 + mov lr, r4 + lsr r12, r5, #28 + lsr r4, r4, #28 + orr r4, r4, r5, lsl #4 + orr r5, r12, lr, lsl #4 + # s[2] <<< 10 + lsr r12, r7, #22 + lsr lr, r6, #22 + orr r6, r12, r6, lsl #10 + orr r7, lr, r7, lsl #10 + # s[3] <<< 15 + lsr r12, r9, #17 + lsr lr, r8, #17 + orr r8, r12, r8, lsl #15 + orr r9, lr, r9, lsl #15 + # s[4] <<< 56 + mov lr, r10 + lsr r12, r11, #8 + lsr r10, r10, #8 + orr r10, r10, r11, lsl #24 + orr r11, r12, lr, lsl #24 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [sp, #128] + str lr, [sp, #132] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [sp, #136] + str lr, [sp, #140] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [sp, #144] + str lr, [sp, #148] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [sp, #152] + str lr, [sp, #156] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [sp, #120] + str lr, [sp, #124] + # Row 4 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0, #16] + ldr r3, [r0, #20] +#else + ldrd r2, r3, [r0, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #64] + ldr r5, [r0, #68] +#else + ldrd r4, r5, [r0, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [r0, #112] + ldr r7, [r0, #116] +#else + ldrd r6, r7, [r0, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [r0, #120] + ldr r9, [r0, #124] +#else + ldrd r8, r9, [r0, #120] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r0, #168] + ldr r11, [r0, #172] +#else + ldrd r10, r11, [r0, #168] +#endif + # s[0] <<< 62 + mov lr, r2 + lsr r12, r3, #2 + lsr r2, r2, #2 + orr r2, r2, r3, lsl #30 + orr r3, r12, lr, lsl #30 + # s[1] <<< 55 + mov lr, r4 + lsr r12, r5, #9 + lsr r4, r4, #9 + orr r4, r4, r5, lsl #23 + orr r5, r12, lr, lsl #23 + # s[2] <<< 39 + mov lr, r6 + lsr r12, r7, #25 + lsr r6, r6, #25 + orr r6, r6, r7, lsl #7 + orr r7, r12, lr, lsl #7 + # s[3] <<< 41 + mov lr, r8 + lsr r12, r9, #23 + lsr r8, r8, #23 + orr r8, r8, r9, lsl #9 + orr r9, r12, lr, lsl #9 + # s[4] <<< 2 + lsr r12, r11, #30 + lsr lr, r10, #30 + orr r10, r12, r10, lsl #2 + orr r11, lr, r11, lsl #2 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [sp, #168] + str lr, [sp, #172] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [sp, #176] + str lr, [sp, #180] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [sp, #184] + str lr, [sp, #188] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [sp, #192] + str lr, [sp, #196] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [sp, #160] + str lr, [sp, #164] + # Round odd + # Calc b[4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #32] + ldr r5, [sp, #36] +#else + ldrd r4, r5, [sp, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #72] + ldr r7, [sp, #76] +#else + ldrd r6, r7, [sp, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #112] + ldr r9, [sp, #116] +#else + ldrd r8, r9, [sp, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #152] + ldr r11, [sp, #156] +#else + ldrd r10, r11, [sp, #152] +#endif + ldr r12, [sp, #192] + ldr lr, [sp, #196] + eor r2, r4, r6 + eor r3, r5, r7 + eor r2, r2, r8 + eor r3, r3, r9 + eor r2, r2, r10 + eor r3, r3, r11 + eor r2, r2, r12 + eor r3, r3, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r2, [r0, #32] + str r3, [r0, #36] +#else + strd r2, r3, [r0, #32] +#endif + # Calc b[1] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #8] + ldr r5, [sp, #12] +#else + ldrd r4, r5, [sp, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #48] + ldr r7, [sp, #52] +#else + ldrd r6, r7, [sp, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #88] + ldr r9, [sp, #92] +#else + ldrd r8, r9, [sp, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #128] + ldr r11, [sp, #132] +#else + ldrd r10, r11, [sp, #128] +#endif + ldr r12, [sp, #168] + ldr lr, [sp, #172] + eor r4, r4, r6 + eor r5, r5, r7 + eor r4, r4, r8 + eor r5, r5, r9 + eor r4, r4, r10 + eor r5, r5, r11 + eor r4, r4, r12 + eor r5, r5, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0, #8] + str r5, [r0, #12] +#else + strd r4, r5, [r0, #8] +#endif + # Calc t[0] + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # Calc b[0] and XOR t[0] into s[x*5+0] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp] + ldr r5, [sp, #4] +#else + ldrd r4, r5, [sp] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #40] + ldr r7, [sp, #44] +#else + ldrd r6, r7, [sp, #40] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #80] + ldr r9, [sp, #84] +#else + ldrd r8, r9, [sp, #80] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #120] + ldr r11, [sp, #124] +#else + ldrd r10, r11, [sp, #120] +#endif + eor r12, r4, r6 + eor lr, r5, r7 + eor r12, r12, r8 + eor lr, lr, r9 + eor r12, r12, r10 + eor lr, lr, r11 + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp] + str r5, [sp, #4] +#else + strd r4, r5, [sp] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #40] + str r7, [sp, #44] +#else + strd r6, r7, [sp, #40] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [sp, #80] + str r9, [sp, #84] +#else + strd r8, r9, [sp, #80] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [sp, #120] + str r11, [sp, #124] +#else + strd r10, r11, [sp, #120] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #160] + ldr r11, [sp, #164] +#else + ldrd r10, r11, [sp, #160] +#endif + eor r12, r12, r10 + eor lr, lr, r11 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [sp, #160] + str r11, [sp, #164] +#else + strd r10, r11, [sp, #160] +#endif + str r12, [r0] + str lr, [r0, #4] + # Calc b[3] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #24] + ldr r5, [sp, #28] +#else + ldrd r4, r5, [sp, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #64] + ldr r7, [sp, #68] +#else + ldrd r6, r7, [sp, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #104] + ldr r9, [sp, #108] +#else + ldrd r8, r9, [sp, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #144] + ldr r11, [sp, #148] +#else + ldrd r10, r11, [sp, #144] +#endif + ldr r12, [sp, #184] + ldr lr, [sp, #188] + eor r4, r4, r6 + eor r5, r5, r7 + eor r4, r4, r8 + eor r5, r5, r9 + eor r4, r4, r10 + eor r5, r5, r11 + eor r4, r4, r12 + eor r5, r5, lr +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [r0, #24] + str r5, [r0, #28] +#else + strd r4, r5, [r0, #24] +#endif + # Calc t[2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0, #8] + ldr r3, [r0, #12] +#else + ldrd r2, r3, [r0, #8] +#endif + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # Calc b[2] and XOR t[2] into s[x*5+2] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #16] + ldr r5, [sp, #20] +#else + ldrd r4, r5, [sp, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #56] + ldr r7, [sp, #60] +#else + ldrd r6, r7, [sp, #56] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #96] + ldr r9, [sp, #100] +#else + ldrd r8, r9, [sp, #96] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #136] + ldr r11, [sp, #140] +#else + ldrd r10, r11, [sp, #136] +#endif + eor r12, r4, r6 + eor lr, r5, r7 + eor r12, r12, r8 + eor lr, lr, r9 + eor r12, r12, r10 + eor lr, lr, r11 + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #16] + str r5, [sp, #20] +#else + strd r4, r5, [sp, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #56] + str r7, [sp, #60] +#else + strd r6, r7, [sp, #56] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [sp, #96] + str r9, [sp, #100] +#else + strd r8, r9, [sp, #96] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [sp, #136] + str r11, [sp, #140] +#else + strd r10, r11, [sp, #136] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #176] + ldr r11, [sp, #180] +#else + ldrd r10, r11, [sp, #176] +#endif + eor r12, r12, r10 + eor lr, lr, r11 + eor r10, r10, r2 + eor r11, r11, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [sp, #176] + str r11, [sp, #180] +#else + strd r10, r11, [sp, #176] +#endif + str r12, [r0, #16] + str lr, [r0, #20] + # Calc t[1] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0] + ldr r3, [r0, #4] +#else + ldrd r2, r3, [r0] +#endif + eor r2, r2, lr, lsr #31 + eor r3, r3, r12, lsr #31 + eor r2, r2, r12, lsl #1 + eor r3, r3, lr, lsl #1 + # XOR t[1] into s[x*5+1] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #8] + ldr r5, [sp, #12] +#else + ldrd r4, r5, [sp, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #48] + ldr r7, [sp, #52] +#else + ldrd r6, r7, [sp, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #88] + ldr r9, [sp, #92] +#else + ldrd r8, r9, [sp, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #128] + ldr r11, [sp, #132] +#else + ldrd r10, r11, [sp, #128] +#endif + ldr r12, [sp, #168] + ldr lr, [sp, #172] + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 + eor r12, r12, r2 + eor lr, lr, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #8] + str r5, [sp, #12] +#else + strd r4, r5, [sp, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #48] + str r7, [sp, #52] +#else + strd r6, r7, [sp, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [sp, #88] + str r9, [sp, #92] +#else + strd r8, r9, [sp, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [sp, #128] + str r11, [sp, #132] +#else + strd r10, r11, [sp, #128] +#endif + str r12, [sp, #168] + str lr, [sp, #172] + # Calc t[3] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0, #16] + ldr r3, [r0, #20] +#else + ldrd r2, r3, [r0, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0, #32] + ldr r5, [r0, #36] +#else + ldrd r4, r5, [r0, #32] +#endif + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # XOR t[3] into s[x*5+3] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #24] + ldr r5, [sp, #28] +#else + ldrd r4, r5, [sp, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #64] + ldr r7, [sp, #68] +#else + ldrd r6, r7, [sp, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #104] + ldr r9, [sp, #108] +#else + ldrd r8, r9, [sp, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #144] + ldr r11, [sp, #148] +#else + ldrd r10, r11, [sp, #144] +#endif + ldr r12, [sp, #184] + ldr lr, [sp, #188] + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 + eor r12, r12, r2 + eor lr, lr, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #24] + str r5, [sp, #28] +#else + strd r4, r5, [sp, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #64] + str r7, [sp, #68] +#else + strd r6, r7, [sp, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [sp, #104] + str r9, [sp, #108] +#else + strd r8, r9, [sp, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [sp, #144] + str r11, [sp, #148] +#else + strd r10, r11, [sp, #144] +#endif + str r12, [sp, #184] + str lr, [sp, #188] + # Calc t[4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [r0, #24] + ldr r3, [r0, #28] +#else + ldrd r2, r3, [r0, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [r0] + ldr r5, [r0, #4] +#else + ldrd r4, r5, [r0] +#endif + eor r2, r2, r5, lsr #31 + eor r3, r3, r4, lsr #31 + eor r2, r2, r4, lsl #1 + eor r3, r3, r5, lsl #1 + # XOR t[4] into s[x*5+4] +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #32] + ldr r5, [sp, #36] +#else + ldrd r4, r5, [sp, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #72] + ldr r7, [sp, #76] +#else + ldrd r6, r7, [sp, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #112] + ldr r9, [sp, #116] +#else + ldrd r8, r9, [sp, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #152] + ldr r11, [sp, #156] +#else + ldrd r10, r11, [sp, #152] +#endif + ldr r12, [sp, #192] + ldr lr, [sp, #196] + eor r4, r4, r2 + eor r5, r5, r3 + eor r6, r6, r2 + eor r7, r7, r3 + eor r8, r8, r2 + eor r9, r9, r3 + eor r10, r10, r2 + eor r11, r11, r3 + eor r12, r12, r2 + eor lr, lr, r3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r4, [sp, #32] + str r5, [sp, #36] +#else + strd r4, r5, [sp, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r6, [sp, #72] + str r7, [sp, #76] +#else + strd r6, r7, [sp, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r8, [sp, #112] + str r9, [sp, #116] +#else + strd r8, r9, [sp, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + str r10, [sp, #152] + str r11, [sp, #156] +#else + strd r10, r11, [sp, #152] +#endif + str r12, [sp, #192] + str lr, [sp, #196] + # Row Mix + # Row 0 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp] + ldr r3, [sp, #4] +#else + ldrd r2, r3, [sp] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #48] + ldr r5, [sp, #52] +#else + ldrd r4, r5, [sp, #48] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #96] + ldr r7, [sp, #100] +#else + ldrd r6, r7, [sp, #96] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #144] + ldr r9, [sp, #148] +#else + ldrd r8, r9, [sp, #144] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #192] + ldr r11, [sp, #196] +#else + ldrd r10, r11, [sp, #192] +#endif + # s[1] <<< 44 + mov lr, r4 + lsr r12, r5, #20 + lsr r4, r4, #20 + orr r4, r4, r5, lsl #12 + orr r5, r12, lr, lsl #12 + # s[2] <<< 43 + mov lr, r6 + lsr r12, r7, #21 + lsr r6, r6, #21 + orr r6, r6, r7, lsl #11 + orr r7, r12, lr, lsl #11 + # s[3] <<< 21 + lsr r12, r9, #11 + lsr lr, r8, #11 + orr r8, r12, r8, lsl #21 + orr r9, lr, r9, lsl #21 + # s[4] <<< 14 + lsr r12, r11, #18 + lsr lr, r10, #18 + orr r10, r12, r10, lsl #14 + orr r11, lr, r11, lsl #14 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [r0, #8] + str lr, [r0, #12] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [r0, #16] + str lr, [r0, #20] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [r0, #24] + str lr, [r0, #28] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [r0, #32] + str lr, [r0, #36] + # Get constant +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [r1] + ldr r11, [r1, #4] +#else + ldrd r10, r11, [r1] +#endif + add r1, r1, #8 + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + # XOR in constant + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [r0] + str lr, [r0, #4] + # Row 1 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp, #24] + ldr r3, [sp, #28] +#else + ldrd r2, r3, [sp, #24] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #72] + ldr r5, [sp, #76] +#else + ldrd r4, r5, [sp, #72] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #80] + ldr r7, [sp, #84] +#else + ldrd r6, r7, [sp, #80] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #128] + ldr r9, [sp, #132] +#else + ldrd r8, r9, [sp, #128] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #176] + ldr r11, [sp, #180] +#else + ldrd r10, r11, [sp, #176] +#endif + # s[0] <<< 28 + lsr r12, r3, #4 + lsr lr, r2, #4 + orr r2, r12, r2, lsl #28 + orr r3, lr, r3, lsl #28 + # s[1] <<< 20 + lsr r12, r5, #12 + lsr lr, r4, #12 + orr r4, r12, r4, lsl #20 + orr r5, lr, r5, lsl #20 + # s[2] <<< 3 + lsr r12, r7, #29 + lsr lr, r6, #29 + orr r6, r12, r6, lsl #3 + orr r7, lr, r7, lsl #3 + # s[3] <<< 45 + mov lr, r8 + lsr r12, r9, #19 + lsr r8, r8, #19 + orr r8, r8, r9, lsl #13 + orr r9, r12, lr, lsl #13 + # s[4] <<< 61 + mov lr, r10 + lsr r12, r11, #3 + lsr r10, r10, #3 + orr r10, r10, r11, lsl #29 + orr r11, r12, lr, lsl #29 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [r0, #48] + str lr, [r0, #52] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [r0, #56] + str lr, [r0, #60] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [r0, #64] + str lr, [r0, #68] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [r0, #72] + str lr, [r0, #76] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [r0, #40] + str lr, [r0, #44] + # Row 2 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp, #8] + ldr r3, [sp, #12] +#else + ldrd r2, r3, [sp, #8] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #56] + ldr r5, [sp, #60] +#else + ldrd r4, r5, [sp, #56] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #104] + ldr r7, [sp, #108] +#else + ldrd r6, r7, [sp, #104] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #152] + ldr r9, [sp, #156] +#else + ldrd r8, r9, [sp, #152] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #160] + ldr r11, [sp, #164] +#else + ldrd r10, r11, [sp, #160] +#endif + # s[0] <<< 1 + lsr r12, r3, #31 + lsr lr, r2, #31 + orr r2, r12, r2, lsl #1 + orr r3, lr, r3, lsl #1 + # s[1] <<< 6 + lsr r12, r5, #26 + lsr lr, r4, #26 + orr r4, r12, r4, lsl #6 + orr r5, lr, r5, lsl #6 + # s[2] <<< 25 + lsr r12, r7, #7 + lsr lr, r6, #7 + orr r6, r12, r6, lsl #25 + orr r7, lr, r7, lsl #25 + # s[3] <<< 8 + lsr r12, r9, #24 + lsr lr, r8, #24 + orr r8, r12, r8, lsl #8 + orr r9, lr, r9, lsl #8 + # s[4] <<< 18 + lsr r12, r11, #14 + lsr lr, r10, #14 + orr r10, r12, r10, lsl #18 + orr r11, lr, r11, lsl #18 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [r0, #88] + str lr, [r0, #92] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [r0, #96] + str lr, [r0, #100] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [r0, #104] + str lr, [r0, #108] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [r0, #112] + str lr, [r0, #116] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [r0, #80] + str lr, [r0, #84] + # Row 3 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp, #32] + ldr r3, [sp, #36] +#else + ldrd r2, r3, [sp, #32] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #40] + ldr r5, [sp, #44] +#else + ldrd r4, r5, [sp, #40] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #88] + ldr r7, [sp, #92] +#else + ldrd r6, r7, [sp, #88] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #136] + ldr r9, [sp, #140] +#else + ldrd r8, r9, [sp, #136] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #184] + ldr r11, [sp, #188] +#else + ldrd r10, r11, [sp, #184] +#endif + # s[0] <<< 27 + lsr r12, r3, #5 + lsr lr, r2, #5 + orr r2, r12, r2, lsl #27 + orr r3, lr, r3, lsl #27 + # s[1] <<< 36 + mov lr, r4 + lsr r12, r5, #28 + lsr r4, r4, #28 + orr r4, r4, r5, lsl #4 + orr r5, r12, lr, lsl #4 + # s[2] <<< 10 + lsr r12, r7, #22 + lsr lr, r6, #22 + orr r6, r12, r6, lsl #10 + orr r7, lr, r7, lsl #10 + # s[3] <<< 15 + lsr r12, r9, #17 + lsr lr, r8, #17 + orr r8, r12, r8, lsl #15 + orr r9, lr, r9, lsl #15 + # s[4] <<< 56 + mov lr, r10 + lsr r12, r11, #8 + lsr r10, r10, #8 + orr r10, r10, r11, lsl #24 + orr r11, r12, lr, lsl #24 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [r0, #128] + str lr, [r0, #132] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [r0, #136] + str lr, [r0, #140] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [r0, #144] + str lr, [r0, #148] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [r0, #152] + str lr, [r0, #156] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [r0, #120] + str lr, [r0, #124] + # Row 4 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r2, [sp, #16] + ldr r3, [sp, #20] +#else + ldrd r2, r3, [sp, #16] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r4, [sp, #64] + ldr r5, [sp, #68] +#else + ldrd r4, r5, [sp, #64] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r6, [sp, #112] + ldr r7, [sp, #116] +#else + ldrd r6, r7, [sp, #112] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r8, [sp, #120] + ldr r9, [sp, #124] +#else + ldrd r8, r9, [sp, #120] +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + ldr r10, [sp, #168] + ldr r11, [sp, #172] +#else + ldrd r10, r11, [sp, #168] +#endif + # s[0] <<< 62 + mov lr, r2 + lsr r12, r3, #2 + lsr r2, r2, #2 + orr r2, r2, r3, lsl #30 + orr r3, r12, lr, lsl #30 + # s[1] <<< 55 + mov lr, r4 + lsr r12, r5, #9 + lsr r4, r4, #9 + orr r4, r4, r5, lsl #23 + orr r5, r12, lr, lsl #23 + # s[2] <<< 39 + mov lr, r6 + lsr r12, r7, #25 + lsr r6, r6, #25 + orr r6, r6, r7, lsl #7 + orr r7, r12, lr, lsl #7 + # s[3] <<< 41 + mov lr, r8 + lsr r12, r9, #23 + lsr r8, r8, #23 + orr r8, r8, r9, lsl #9 + orr r9, r12, lr, lsl #9 + # s[4] <<< 2 + lsr r12, r11, #30 + lsr lr, r10, #30 + orr r10, r12, r10, lsl #2 + orr r11, lr, r11, lsl #2 + bic r12, r8, r6 + bic lr, r9, r7 + eor r12, r12, r4 + eor lr, lr, r5 + str r12, [r0, #168] + str lr, [r0, #172] + bic r12, r10, r8 + bic lr, r11, r9 + eor r12, r12, r6 + eor lr, lr, r7 + str r12, [r0, #176] + str lr, [r0, #180] + bic r12, r2, r10 + bic lr, r3, r11 + eor r12, r12, r8 + eor lr, lr, r9 + str r12, [r0, #184] + str lr, [r0, #188] + bic r12, r4, r2 + bic lr, r5, r3 + eor r12, r12, r10 + eor lr, lr, r11 + str r12, [r0, #192] + str lr, [r0, #196] + bic r12, r6, r4 + bic lr, r7, r5 + eor r12, r12, r2 + eor lr, lr, r3 + str r12, [r0, #160] + str lr, [r0, #164] + ldr r2, [sp, #200] + subs r2, r2, #1 + bne L_sha3_arm32_begin + add sp, sp, #0xcc + pop {r4, r5, r6, r7, r8, r9, r10, r11, pc} + .size BlockSha3,.-BlockSha3 +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ +#endif /* WOLFSSL_ARMASM */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,2356 @@ +/* armv8-32-sha3-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha3/sha3.rb arm32 ../wolfssl/wolfcrypt/src/port/arm/armv8-32-sha3-asm.c + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) +#include +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +static const uint64_t L_sha3_arm2_neon_rt[] = { + 0x0000000000000001UL, 0x0000000000008082UL, + 0x800000000000808aUL, 0x8000000080008000UL, + 0x000000000000808bUL, 0x0000000080000001UL, + 0x8000000080008081UL, 0x8000000000008009UL, + 0x000000000000008aUL, 0x0000000000000088UL, + 0x0000000080008009UL, 0x000000008000000aUL, + 0x000000008000808bUL, 0x800000000000008bUL, + 0x8000000000008089UL, 0x8000000000008003UL, + 0x8000000000008002UL, 0x8000000000000080UL, + 0x000000000000800aUL, 0x800000008000000aUL, + 0x8000000080008081UL, 0x8000000000008080UL, + 0x0000000080000001UL, 0x8000000080008008UL, +}; + +static const uint64_t L_sha3_arm2_rt[] = { + 0x0000000000000001UL, 0x0000000000008082UL, + 0x800000000000808aUL, 0x8000000080008000UL, + 0x000000000000808bUL, 0x0000000080000001UL, + 0x8000000080008081UL, 0x8000000000008009UL, + 0x000000000000008aUL, 0x0000000000000088UL, + 0x0000000080008009UL, 0x000000008000000aUL, + 0x000000008000808bUL, 0x800000000000008bUL, + 0x8000000000008089UL, 0x8000000000008003UL, + 0x8000000000008002UL, 0x8000000000000080UL, + 0x000000000000800aUL, 0x800000008000000aUL, + 0x8000000080008081UL, 0x8000000000008080UL, + 0x0000000080000001UL, 0x8000000080008008UL, +}; + +#include + +#ifndef WOLFSSL_ARMASM_NO_NEON +void BlockSha3(word64* state_p) +{ + register word64* state asm ("r0") = (word64*)state_p; + register uint64_t* L_sha3_arm2_neon_rt_c asm ("r1") = (uint64_t*)&L_sha3_arm2_neon_rt; + register uint64_t* L_sha3_arm2_rt_c asm ("r2") = (uint64_t*)&L_sha3_arm2_rt; + + __asm__ __volatile__ ( + "sub sp, sp, #16\n\t" + "mov r2, #24\n\t" + "mov r3, sp\n\t" + "vld1.8 {d0-d3}, [%[state]]!\n\t" + "vld1.8 {d4-d7}, [%[state]]!\n\t" + "vld1.8 {d8-d11}, [%[state]]!\n\t" + "vld1.8 {d12-d15}, [%[state]]!\n\t" + "vld1.8 {d16-d19}, [%[state]]!\n\t" + "vld1.8 {d20-d23}, [%[state]]!\n\t" + "vld1.8 {d24}, [%[state]]\n\t" + "sub %[state], %[state], #0xc0\n\t" + "\n" + "L_sha3_arm32_neon_begin_%=: \n\t" + /* Calc b[0..4] */ + "veor d26, d0, d5\n\t" + "veor d27, d1, d6\n\t" + "veor d28, d2, d7\n\t" + "veor d29, d3, d8\n\t" + "veor d25, d4, d9\n\t" + "veor d26, d26, d10\n\t" + "veor d27, d27, d11\n\t" + "veor d28, d28, d12\n\t" + "veor d29, d29, d13\n\t" + "veor d25, d25, d14\n\t" + "veor d26, d26, d15\n\t" + "veor d27, d27, d16\n\t" + "veor d28, d28, d17\n\t" + "veor d29, d29, d18\n\t" + "veor d25, d25, d19\n\t" + "veor d26, d26, d20\n\t" + "veor d27, d27, d21\n\t" + "veor d28, d28, d22\n\t" + "veor d29, d29, d23\n\t" + "veor d25, d25, d24\n\t" + "vst1.8 {d25-d26}, [r3]\n\t" + /* Calc t[0..4] and XOR into s[i*5..i*5+4] */ + /* t[0] */ + "vshr.u64 d30, d27, #63\n\t" + "vshl.u64 d31, d27, #1\n\t" + "veor d25, d25, d30\n\t" + "veor d25, d25, d31\n\t" + /* t[1] */ + "vshr.u64 d30, d28, #63\n\t" + "vshl.u64 d31, d28, #1\n\t" + "veor d26, d26, d30\n\t" + "veor d26, d26, d31\n\t" + /* t[2] */ + "vshr.u64 d30, d29, #63\n\t" + "vshl.u64 d31, d29, #1\n\t" + "veor d27, d27, d30\n\t" + "veor d27, d27, d31\n\t" + /* t[3] */ + "vldr.8 d31, [r3]\n\t" + "vshr.u64 d30, d31, #63\n\t" + "vshl.u64 d31, d31, #1\n\t" + "veor d28, d28, d30\n\t" + "veor d28, d28, d31\n\t" + /* t[4] */ + "vldr.8 d31, [r3, #8]\n\t" + "vshr.u64 d30, d31, #63\n\t" + "vshl.u64 d31, d31, #1\n\t" + "veor d29, d29, d30\n\t" + "veor d29, d29, d31\n\t" + "sub r3, r3, #16\n\t" + "veor d0, d0, d25\n\t" + /* s[1] => s[10] (tmp) */ + "veor d30, d1, d26\n\t" + "vshr.u64 d31, d30, #63\n\t" + "vshl.u64 d30, d30, #1\n\t" + "veor d30, d30, d31\n\t" + /* s[6] => s[1] */ + "veor d1, d6, d26\n\t" + "vshr.u64 d31, d1, #20\n\t" + "vshl.u64 d1, d1, #44\n\t" + "veor d1, d1, d31\n\t" + /* s[9] => s[6] */ + "veor d6, d9, d29\n\t" + "vshr.u64 d31, d6, #44\n\t" + "vshl.u64 d6, d6, #20\n\t" + "veor d6, d6, d31\n\t" + /* s[22] => s[9] */ + "veor d9, d22, d27\n\t" + "vshr.u64 d31, d9, #3\n\t" + "vshl.u64 d9, d9, #61\n\t" + "veor d9, d9, d31\n\t" + /* s[14] => s[22] */ + "veor d22, d14, d29\n\t" + "vshr.u64 d31, d22, #25\n\t" + "vshl.u64 d22, d22, #39\n\t" + "veor d22, d22, d31\n\t" + /* s[20] => s[14] */ + "veor d14, d20, d25\n\t" + "vshr.u64 d31, d14, #46\n\t" + "vshl.u64 d14, d14, #18\n\t" + "veor d14, d14, d31\n\t" + /* s[2] => s[20] */ + "veor d20, d2, d27\n\t" + "vshr.u64 d31, d20, #2\n\t" + "vshl.u64 d20, d20, #62\n\t" + "veor d20, d20, d31\n\t" + /* s[12] => s[2] */ + "veor d2, d12, d27\n\t" + "vshr.u64 d31, d2, #21\n\t" + "vshl.u64 d2, d2, #43\n\t" + "veor d2, d2, d31\n\t" + /* s[13] => s[12] */ + "veor d12, d13, d28\n\t" + "vshr.u64 d31, d12, #39\n\t" + "vshl.u64 d12, d12, #25\n\t" + "veor d12, d12, d31\n\t" + /* s[19] => s[13] */ + "veor d13, d19, d29\n\t" + "vshr.u64 d31, d13, #56\n\t" + "vshl.u64 d13, d13, #8\n\t" + "veor d13, d13, d31\n\t" + /* s[23] => s[19] */ + "veor d19, d23, d28\n\t" + "vshr.u64 d31, d19, #8\n\t" + "vshl.u64 d19, d19, #56\n\t" + "veor d19, d19, d31\n\t" + /* s[15] => s[23] */ + "veor d23, d15, d25\n\t" + "vshr.u64 d31, d23, #23\n\t" + "vshl.u64 d23, d23, #41\n\t" + "veor d23, d23, d31\n\t" + /* s[4] => s[15] */ + "veor d15, d4, d29\n\t" + "vshr.u64 d31, d15, #37\n\t" + "vshl.u64 d15, d15, #27\n\t" + "veor d15, d15, d31\n\t" + /* s[24] => s[4] */ + "veor d4, d24, d29\n\t" + "vshr.u64 d31, d4, #50\n\t" + "vshl.u64 d4, d4, #14\n\t" + "veor d4, d4, d31\n\t" + /* s[21] => s[24] */ + "veor d24, d21, d26\n\t" + "vshr.u64 d31, d24, #62\n\t" + "vshl.u64 d24, d24, #2\n\t" + "veor d24, d24, d31\n\t" + /* s[8] => s[21] */ + "veor d21, d8, d28\n\t" + "vshr.u64 d31, d21, #9\n\t" + "vshl.u64 d21, d21, #55\n\t" + "veor d21, d21, d31\n\t" + /* s[16] => s[8] */ + "veor d8, d16, d26\n\t" + "vshr.u64 d31, d8, #19\n\t" + "vshl.u64 d8, d8, #45\n\t" + "veor d8, d8, d31\n\t" + /* s[5] => s[16] */ + "veor d16, d5, d25\n\t" + "vshr.u64 d31, d16, #28\n\t" + "vshl.u64 d16, d16, #36\n\t" + "veor d16, d16, d31\n\t" + /* s[3] => s[5] */ + "veor d5, d3, d28\n\t" + "vshr.u64 d31, d5, #36\n\t" + "vshl.u64 d5, d5, #28\n\t" + "veor d5, d5, d31\n\t" + /* s[18] => s[3] */ + "veor d3, d18, d28\n\t" + "vshr.u64 d31, d3, #43\n\t" + "vshl.u64 d3, d3, #21\n\t" + "veor d3, d3, d31\n\t" + /* s[17] => s[18] */ + "veor d18, d17, d27\n\t" + "vshr.u64 d31, d18, #49\n\t" + "vshl.u64 d18, d18, #15\n\t" + "veor d18, d18, d31\n\t" + /* s[11] => s[17] */ + "veor d17, d11, d26\n\t" + "vshr.u64 d31, d17, #54\n\t" + "vshl.u64 d17, d17, #10\n\t" + "veor d17, d17, d31\n\t" + /* s[7] => s[11] */ + "veor d11, d7, d27\n\t" + "vshr.u64 d31, d11, #58\n\t" + "vshl.u64 d11, d11, #6\n\t" + "veor d11, d11, d31\n\t" + /* s[10] => s[7] */ + "veor d7, d10, d25\n\t" + "vshr.u64 d31, d7, #61\n\t" + "vshl.u64 d7, d7, #3\n\t" + "veor d7, d7, d31\n\t" + /* Row Mix */ + "vmov d25, d0\n\t" + "vmov d26, d1\n\t" + "vbic d31, d2, d26\n\t" + "veor d0, d25, d31\n\t" + "vbic d31, d3, d2\n\t" + "veor d1, d26, d31\n\t" + "vbic d31, d4, d3\n\t" + "veor d2, d2, d31\n\t" + "vbic d31, d25, d4\n\t" + "veor d3, d3, d31\n\t" + "vbic d31, d26, d25\n\t" + "veor d4, d4, d31\n\t" + "vmov d25, d5\n\t" + "vmov d26, d6\n\t" + "vbic d31, d7, d26\n\t" + "veor d5, d25, d31\n\t" + "vbic d31, d8, d7\n\t" + "veor d6, d26, d31\n\t" + "vbic d31, d9, d8\n\t" + "veor d7, d7, d31\n\t" + "vbic d31, d25, d9\n\t" + "veor d8, d8, d31\n\t" + "vbic d31, d26, d25\n\t" + "veor d9, d9, d31\n\t" + "vmov d26, d11\n\t" + "vbic d31, d12, d26\n\t" + "veor d10, d30, d31\n\t" + "vbic d31, d13, d12\n\t" + "veor d11, d26, d31\n\t" + "vbic d31, d14, d13\n\t" + "veor d12, d12, d31\n\t" + "vbic d31, d30, d14\n\t" + "veor d13, d13, d31\n\t" + "vbic d31, d26, d30\n\t" + "veor d14, d14, d31\n\t" + "vmov d25, d15\n\t" + "vmov d26, d16\n\t" + "vbic d31, d17, d26\n\t" + "veor d15, d25, d31\n\t" + "vbic d31, d18, d17\n\t" + "veor d16, d26, d31\n\t" + "vbic d31, d19, d18\n\t" + "veor d17, d17, d31\n\t" + "vbic d31, d25, d19\n\t" + "veor d18, d18, d31\n\t" + "vbic d31, d26, d25\n\t" + "veor d19, d19, d31\n\t" + "vmov d25, d20\n\t" + "vmov d26, d21\n\t" + "vbic d31, d22, d26\n\t" + "veor d20, d25, d31\n\t" + "vbic d31, d23, d22\n\t" + "veor d21, d26, d31\n\t" + "vbic d31, d24, d23\n\t" + "veor d22, d22, d31\n\t" + "vbic d31, d25, d24\n\t" + "veor d23, d23, d31\n\t" + "vbic d31, d26, d25\n\t" + "veor d24, d24, d31\n\t" + "vld1.8 {d30}, [r1]!\n\t" + "subs r2, r2, #1\n\t" + "veor d0, d0, d30\n\t" + "bne L_sha3_arm32_neon_begin_%=\n\t" + "vst1.8 {d0-d3}, [%[state]]!\n\t" + "vst1.8 {d4-d7}, [%[state]]!\n\t" + "vst1.8 {d8-d11}, [%[state]]!\n\t" + "vst1.8 {d12-d15}, [%[state]]!\n\t" + "vst1.8 {d16-d19}, [%[state]]!\n\t" + "vst1.8 {d20-d23}, [%[state]]!\n\t" + "vst1.8 {d24}, [%[state]]\n\t" + "add sp, sp, #16\n\t" + : [state] "+r" (state), [L_sha3_arm2_neon_rt] "+r" (L_sha3_arm2_neon_rt_c), [L_sha3_arm2_rt] "+r" (L_sha3_arm2_rt_c) + : + : "memory", "r3", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc" + ); +} + +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#include + +#ifdef WOLFSSL_ARMASM_NO_NEON +void BlockSha3(word64* state_p) +{ + register word64* state asm ("r0") = (word64*)state_p; + register uint64_t* L_sha3_arm2_neon_rt_c asm ("r1") = (uint64_t*)&L_sha3_arm2_neon_rt; + register uint64_t* L_sha3_arm2_rt_c asm ("r2") = (uint64_t*)&L_sha3_arm2_rt; + + __asm__ __volatile__ ( + "sub sp, sp, #0xcc\n\t" + "mov r1, %[L_sha3_arm2_rt]\n\t" + "mov r2, #12\n\t" + "\n" + "L_sha3_arm32_begin_%=: \n\t" + "str r2, [sp, #200]\n\t" + /* Round even */ + /* Calc b[4] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #32]\n\t" + "ldr r5, [%[state], #36]\n\t" +#else + "ldrd r4, r5, [%[state], #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #72]\n\t" + "ldr r7, [%[state], #76]\n\t" +#else + "ldrd r6, r7, [%[state], #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #112]\n\t" + "ldr r9, [%[state], #116]\n\t" +#else + "ldrd r8, r9, [%[state], #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #152]\n\t" + "ldr r11, [%[state], #156]\n\t" +#else + "ldrd r10, r11, [%[state], #152]\n\t" +#endif + "ldr r12, [%[state], #192]\n\t" + "ldr lr, [%[state], #196]\n\t" + "eor r2, r4, r6\n\t" + "eor r3, r5, r7\n\t" + "eor r2, r2, r8\n\t" + "eor r3, r3, r9\n\t" + "eor r2, r2, r10\n\t" + "eor r3, r3, r11\n\t" + "eor r2, r2, r12\n\t" + "eor r3, r3, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r2, [sp, #32]\n\t" + "str r3, [sp, #36]\n\t" +#else + "strd r2, r3, [sp, #32]\n\t" +#endif + /* Calc b[1] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #8]\n\t" + "ldr r5, [%[state], #12]\n\t" +#else + "ldrd r4, r5, [%[state], #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #48]\n\t" + "ldr r7, [%[state], #52]\n\t" +#else + "ldrd r6, r7, [%[state], #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #88]\n\t" + "ldr r9, [%[state], #92]\n\t" +#else + "ldrd r8, r9, [%[state], #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #128]\n\t" + "ldr r11, [%[state], #132]\n\t" +#else + "ldrd r10, r11, [%[state], #128]\n\t" +#endif + "ldr r12, [%[state], #168]\n\t" + "ldr lr, [%[state], #172]\n\t" + "eor r4, r4, r6\n\t" + "eor r5, r5, r7\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r4, r4, r10\n\t" + "eor r5, r5, r11\n\t" + "eor r4, r4, r12\n\t" + "eor r5, r5, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #8]\n\t" + "str r5, [sp, #12]\n\t" +#else + "strd r4, r5, [sp, #8]\n\t" +#endif + /* Calc t[0] */ + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* Calc b[0] and XOR t[0] into s[x*5+0] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state]]\n\t" + "ldr r5, [%[state], #4]\n\t" +#else + "ldrd r4, r5, [%[state]]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #40]\n\t" + "ldr r7, [%[state], #44]\n\t" +#else + "ldrd r6, r7, [%[state], #40]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #80]\n\t" + "ldr r9, [%[state], #84]\n\t" +#else + "ldrd r8, r9, [%[state], #80]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #120]\n\t" + "ldr r11, [%[state], #124]\n\t" +#else + "ldrd r10, r11, [%[state], #120]\n\t" +#endif + "eor r12, r4, r6\n\t" + "eor lr, r5, r7\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [%[state]]\n\t" + "str r5, [%[state], #4]\n\t" +#else + "strd r4, r5, [%[state]]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [%[state], #40]\n\t" + "str r7, [%[state], #44]\n\t" +#else + "strd r6, r7, [%[state], #40]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [%[state], #80]\n\t" + "str r9, [%[state], #84]\n\t" +#else + "strd r8, r9, [%[state], #80]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [%[state], #120]\n\t" + "str r11, [%[state], #124]\n\t" +#else + "strd r10, r11, [%[state], #120]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #160]\n\t" + "ldr r11, [%[state], #164]\n\t" +#else + "ldrd r10, r11, [%[state], #160]\n\t" +#endif + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [%[state], #160]\n\t" + "str r11, [%[state], #164]\n\t" +#else + "strd r10, r11, [%[state], #160]\n\t" +#endif + "str r12, [sp]\n\t" + "str lr, [sp, #4]\n\t" + /* Calc b[3] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #24]\n\t" + "ldr r5, [%[state], #28]\n\t" +#else + "ldrd r4, r5, [%[state], #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #64]\n\t" + "ldr r7, [%[state], #68]\n\t" +#else + "ldrd r6, r7, [%[state], #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #104]\n\t" + "ldr r9, [%[state], #108]\n\t" +#else + "ldrd r8, r9, [%[state], #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #144]\n\t" + "ldr r11, [%[state], #148]\n\t" +#else + "ldrd r10, r11, [%[state], #144]\n\t" +#endif + "ldr r12, [%[state], #184]\n\t" + "ldr lr, [%[state], #188]\n\t" + "eor r4, r4, r6\n\t" + "eor r5, r5, r7\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r4, r4, r10\n\t" + "eor r5, r5, r11\n\t" + "eor r4, r4, r12\n\t" + "eor r5, r5, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #24]\n\t" + "str r5, [sp, #28]\n\t" +#else + "strd r4, r5, [sp, #24]\n\t" +#endif + /* Calc t[2] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp, #8]\n\t" + "ldr r3, [sp, #12]\n\t" +#else + "ldrd r2, r3, [sp, #8]\n\t" +#endif + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* Calc b[2] and XOR t[2] into s[x*5+2] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #16]\n\t" + "ldr r5, [%[state], #20]\n\t" +#else + "ldrd r4, r5, [%[state], #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #56]\n\t" + "ldr r7, [%[state], #60]\n\t" +#else + "ldrd r6, r7, [%[state], #56]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #96]\n\t" + "ldr r9, [%[state], #100]\n\t" +#else + "ldrd r8, r9, [%[state], #96]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #136]\n\t" + "ldr r11, [%[state], #140]\n\t" +#else + "ldrd r10, r11, [%[state], #136]\n\t" +#endif + "eor r12, r4, r6\n\t" + "eor lr, r5, r7\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [%[state], #16]\n\t" + "str r5, [%[state], #20]\n\t" +#else + "strd r4, r5, [%[state], #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [%[state], #56]\n\t" + "str r7, [%[state], #60]\n\t" +#else + "strd r6, r7, [%[state], #56]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [%[state], #96]\n\t" + "str r9, [%[state], #100]\n\t" +#else + "strd r8, r9, [%[state], #96]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [%[state], #136]\n\t" + "str r11, [%[state], #140]\n\t" +#else + "strd r10, r11, [%[state], #136]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #176]\n\t" + "ldr r11, [%[state], #180]\n\t" +#else + "ldrd r10, r11, [%[state], #176]\n\t" +#endif + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [%[state], #176]\n\t" + "str r11, [%[state], #180]\n\t" +#else + "strd r10, r11, [%[state], #176]\n\t" +#endif + "str r12, [sp, #16]\n\t" + "str lr, [sp, #20]\n\t" + /* Calc t[1] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp]\n\t" + "ldr r3, [sp, #4]\n\t" +#else + "ldrd r2, r3, [sp]\n\t" +#endif + "eor r2, r2, lr, lsr #31\n\t" + "eor r3, r3, r12, lsr #31\n\t" + "eor r2, r2, r12, lsl #1\n\t" + "eor r3, r3, lr, lsl #1\n\t" + /* XOR t[1] into s[x*5+1] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #8]\n\t" + "ldr r5, [%[state], #12]\n\t" +#else + "ldrd r4, r5, [%[state], #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #48]\n\t" + "ldr r7, [%[state], #52]\n\t" +#else + "ldrd r6, r7, [%[state], #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #88]\n\t" + "ldr r9, [%[state], #92]\n\t" +#else + "ldrd r8, r9, [%[state], #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #128]\n\t" + "ldr r11, [%[state], #132]\n\t" +#else + "ldrd r10, r11, [%[state], #128]\n\t" +#endif + "ldr r12, [%[state], #168]\n\t" + "ldr lr, [%[state], #172]\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [%[state], #8]\n\t" + "str r5, [%[state], #12]\n\t" +#else + "strd r4, r5, [%[state], #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [%[state], #48]\n\t" + "str r7, [%[state], #52]\n\t" +#else + "strd r6, r7, [%[state], #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [%[state], #88]\n\t" + "str r9, [%[state], #92]\n\t" +#else + "strd r8, r9, [%[state], #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [%[state], #128]\n\t" + "str r11, [%[state], #132]\n\t" +#else + "strd r10, r11, [%[state], #128]\n\t" +#endif + "str r12, [%[state], #168]\n\t" + "str lr, [%[state], #172]\n\t" + /* Calc t[3] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp, #16]\n\t" + "ldr r3, [sp, #20]\n\t" +#else + "ldrd r2, r3, [sp, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #32]\n\t" + "ldr r5, [sp, #36]\n\t" +#else + "ldrd r4, r5, [sp, #32]\n\t" +#endif + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* XOR t[3] into s[x*5+3] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #24]\n\t" + "ldr r5, [%[state], #28]\n\t" +#else + "ldrd r4, r5, [%[state], #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #64]\n\t" + "ldr r7, [%[state], #68]\n\t" +#else + "ldrd r6, r7, [%[state], #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #104]\n\t" + "ldr r9, [%[state], #108]\n\t" +#else + "ldrd r8, r9, [%[state], #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #144]\n\t" + "ldr r11, [%[state], #148]\n\t" +#else + "ldrd r10, r11, [%[state], #144]\n\t" +#endif + "ldr r12, [%[state], #184]\n\t" + "ldr lr, [%[state], #188]\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [%[state], #24]\n\t" + "str r5, [%[state], #28]\n\t" +#else + "strd r4, r5, [%[state], #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [%[state], #64]\n\t" + "str r7, [%[state], #68]\n\t" +#else + "strd r6, r7, [%[state], #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [%[state], #104]\n\t" + "str r9, [%[state], #108]\n\t" +#else + "strd r8, r9, [%[state], #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [%[state], #144]\n\t" + "str r11, [%[state], #148]\n\t" +#else + "strd r10, r11, [%[state], #144]\n\t" +#endif + "str r12, [%[state], #184]\n\t" + "str lr, [%[state], #188]\n\t" + /* Calc t[4] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp, #24]\n\t" + "ldr r3, [sp, #28]\n\t" +#else + "ldrd r2, r3, [sp, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp]\n\t" + "ldr r5, [sp, #4]\n\t" +#else + "ldrd r4, r5, [sp]\n\t" +#endif + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* XOR t[4] into s[x*5+4] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #32]\n\t" + "ldr r5, [%[state], #36]\n\t" +#else + "ldrd r4, r5, [%[state], #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #72]\n\t" + "ldr r7, [%[state], #76]\n\t" +#else + "ldrd r6, r7, [%[state], #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #112]\n\t" + "ldr r9, [%[state], #116]\n\t" +#else + "ldrd r8, r9, [%[state], #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #152]\n\t" + "ldr r11, [%[state], #156]\n\t" +#else + "ldrd r10, r11, [%[state], #152]\n\t" +#endif + "ldr r12, [%[state], #192]\n\t" + "ldr lr, [%[state], #196]\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [%[state], #32]\n\t" + "str r5, [%[state], #36]\n\t" +#else + "strd r4, r5, [%[state], #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [%[state], #72]\n\t" + "str r7, [%[state], #76]\n\t" +#else + "strd r6, r7, [%[state], #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [%[state], #112]\n\t" + "str r9, [%[state], #116]\n\t" +#else + "strd r8, r9, [%[state], #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [%[state], #152]\n\t" + "str r11, [%[state], #156]\n\t" +#else + "strd r10, r11, [%[state], #152]\n\t" +#endif + "str r12, [%[state], #192]\n\t" + "str lr, [%[state], #196]\n\t" + /* Row Mix */ + /* Row 0 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state]]\n\t" + "ldr r3, [%[state], #4]\n\t" +#else + "ldrd r2, r3, [%[state]]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #48]\n\t" + "ldr r5, [%[state], #52]\n\t" +#else + "ldrd r4, r5, [%[state], #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #96]\n\t" + "ldr r7, [%[state], #100]\n\t" +#else + "ldrd r6, r7, [%[state], #96]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #144]\n\t" + "ldr r9, [%[state], #148]\n\t" +#else + "ldrd r8, r9, [%[state], #144]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #192]\n\t" + "ldr r11, [%[state], #196]\n\t" +#else + "ldrd r10, r11, [%[state], #192]\n\t" +#endif + /* s[1] <<< 44 */ + "mov lr, r4\n\t" + "lsr r12, r5, #20\n\t" + "lsr r4, r4, #20\n\t" + "orr r4, r4, r5, lsl #12\n\t" + "orr r5, r12, lr, lsl #12\n\t" + /* s[2] <<< 43 */ + "mov lr, r6\n\t" + "lsr r12, r7, #21\n\t" + "lsr r6, r6, #21\n\t" + "orr r6, r6, r7, lsl #11\n\t" + "orr r7, r12, lr, lsl #11\n\t" + /* s[3] <<< 21 */ + "lsr r12, r9, #11\n\t" + "lsr lr, r8, #11\n\t" + "orr r8, r12, r8, lsl #21\n\t" + "orr r9, lr, r9, lsl #21\n\t" + /* s[4] <<< 14 */ + "lsr r12, r11, #18\n\t" + "lsr lr, r10, #18\n\t" + "orr r10, r12, r10, lsl #14\n\t" + "orr r11, lr, r11, lsl #14\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [sp, #8]\n\t" + "str lr, [sp, #12]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [sp, #16]\n\t" + "str lr, [sp, #20]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [sp, #24]\n\t" + "str lr, [sp, #28]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [sp, #32]\n\t" + "str lr, [sp, #36]\n\t" + /* Get constant */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [r1]\n\t" + "ldr r11, [r1, #4]\n\t" +#else + "ldrd r10, r11, [r1]\n\t" +#endif + "add r1, r1, #8\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + /* XOR in constant */ + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [sp]\n\t" + "str lr, [sp, #4]\n\t" + /* Row 1 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state], #24]\n\t" + "ldr r3, [%[state], #28]\n\t" +#else + "ldrd r2, r3, [%[state], #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #72]\n\t" + "ldr r5, [%[state], #76]\n\t" +#else + "ldrd r4, r5, [%[state], #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #80]\n\t" + "ldr r7, [%[state], #84]\n\t" +#else + "ldrd r6, r7, [%[state], #80]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #128]\n\t" + "ldr r9, [%[state], #132]\n\t" +#else + "ldrd r8, r9, [%[state], #128]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #176]\n\t" + "ldr r11, [%[state], #180]\n\t" +#else + "ldrd r10, r11, [%[state], #176]\n\t" +#endif + /* s[0] <<< 28 */ + "lsr r12, r3, #4\n\t" + "lsr lr, r2, #4\n\t" + "orr r2, r12, r2, lsl #28\n\t" + "orr r3, lr, r3, lsl #28\n\t" + /* s[1] <<< 20 */ + "lsr r12, r5, #12\n\t" + "lsr lr, r4, #12\n\t" + "orr r4, r12, r4, lsl #20\n\t" + "orr r5, lr, r5, lsl #20\n\t" + /* s[2] <<< 3 */ + "lsr r12, r7, #29\n\t" + "lsr lr, r6, #29\n\t" + "orr r6, r12, r6, lsl #3\n\t" + "orr r7, lr, r7, lsl #3\n\t" + /* s[3] <<< 45 */ + "mov lr, r8\n\t" + "lsr r12, r9, #19\n\t" + "lsr r8, r8, #19\n\t" + "orr r8, r8, r9, lsl #13\n\t" + "orr r9, r12, lr, lsl #13\n\t" + /* s[4] <<< 61 */ + "mov lr, r10\n\t" + "lsr r12, r11, #3\n\t" + "lsr r10, r10, #3\n\t" + "orr r10, r10, r11, lsl #29\n\t" + "orr r11, r12, lr, lsl #29\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [sp, #48]\n\t" + "str lr, [sp, #52]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [sp, #56]\n\t" + "str lr, [sp, #60]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [sp, #64]\n\t" + "str lr, [sp, #68]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [sp, #72]\n\t" + "str lr, [sp, #76]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [sp, #40]\n\t" + "str lr, [sp, #44]\n\t" + /* Row 2 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state], #8]\n\t" + "ldr r3, [%[state], #12]\n\t" +#else + "ldrd r2, r3, [%[state], #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #56]\n\t" + "ldr r5, [%[state], #60]\n\t" +#else + "ldrd r4, r5, [%[state], #56]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #104]\n\t" + "ldr r7, [%[state], #108]\n\t" +#else + "ldrd r6, r7, [%[state], #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #152]\n\t" + "ldr r9, [%[state], #156]\n\t" +#else + "ldrd r8, r9, [%[state], #152]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #160]\n\t" + "ldr r11, [%[state], #164]\n\t" +#else + "ldrd r10, r11, [%[state], #160]\n\t" +#endif + /* s[0] <<< 1 */ + "lsr r12, r3, #31\n\t" + "lsr lr, r2, #31\n\t" + "orr r2, r12, r2, lsl #1\n\t" + "orr r3, lr, r3, lsl #1\n\t" + /* s[1] <<< 6 */ + "lsr r12, r5, #26\n\t" + "lsr lr, r4, #26\n\t" + "orr r4, r12, r4, lsl #6\n\t" + "orr r5, lr, r5, lsl #6\n\t" + /* s[2] <<< 25 */ + "lsr r12, r7, #7\n\t" + "lsr lr, r6, #7\n\t" + "orr r6, r12, r6, lsl #25\n\t" + "orr r7, lr, r7, lsl #25\n\t" + /* s[3] <<< 8 */ + "lsr r12, r9, #24\n\t" + "lsr lr, r8, #24\n\t" + "orr r8, r12, r8, lsl #8\n\t" + "orr r9, lr, r9, lsl #8\n\t" + /* s[4] <<< 18 */ + "lsr r12, r11, #14\n\t" + "lsr lr, r10, #14\n\t" + "orr r10, r12, r10, lsl #18\n\t" + "orr r11, lr, r11, lsl #18\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [sp, #88]\n\t" + "str lr, [sp, #92]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [sp, #96]\n\t" + "str lr, [sp, #100]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [sp, #104]\n\t" + "str lr, [sp, #108]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [sp, #112]\n\t" + "str lr, [sp, #116]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [sp, #80]\n\t" + "str lr, [sp, #84]\n\t" + /* Row 3 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state], #32]\n\t" + "ldr r3, [%[state], #36]\n\t" +#else + "ldrd r2, r3, [%[state], #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #40]\n\t" + "ldr r5, [%[state], #44]\n\t" +#else + "ldrd r4, r5, [%[state], #40]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #88]\n\t" + "ldr r7, [%[state], #92]\n\t" +#else + "ldrd r6, r7, [%[state], #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #136]\n\t" + "ldr r9, [%[state], #140]\n\t" +#else + "ldrd r8, r9, [%[state], #136]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #184]\n\t" + "ldr r11, [%[state], #188]\n\t" +#else + "ldrd r10, r11, [%[state], #184]\n\t" +#endif + /* s[0] <<< 27 */ + "lsr r12, r3, #5\n\t" + "lsr lr, r2, #5\n\t" + "orr r2, r12, r2, lsl #27\n\t" + "orr r3, lr, r3, lsl #27\n\t" + /* s[1] <<< 36 */ + "mov lr, r4\n\t" + "lsr r12, r5, #28\n\t" + "lsr r4, r4, #28\n\t" + "orr r4, r4, r5, lsl #4\n\t" + "orr r5, r12, lr, lsl #4\n\t" + /* s[2] <<< 10 */ + "lsr r12, r7, #22\n\t" + "lsr lr, r6, #22\n\t" + "orr r6, r12, r6, lsl #10\n\t" + "orr r7, lr, r7, lsl #10\n\t" + /* s[3] <<< 15 */ + "lsr r12, r9, #17\n\t" + "lsr lr, r8, #17\n\t" + "orr r8, r12, r8, lsl #15\n\t" + "orr r9, lr, r9, lsl #15\n\t" + /* s[4] <<< 56 */ + "mov lr, r10\n\t" + "lsr r12, r11, #8\n\t" + "lsr r10, r10, #8\n\t" + "orr r10, r10, r11, lsl #24\n\t" + "orr r11, r12, lr, lsl #24\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [sp, #128]\n\t" + "str lr, [sp, #132]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [sp, #136]\n\t" + "str lr, [sp, #140]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [sp, #144]\n\t" + "str lr, [sp, #148]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [sp, #152]\n\t" + "str lr, [sp, #156]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [sp, #120]\n\t" + "str lr, [sp, #124]\n\t" + /* Row 4 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state], #16]\n\t" + "ldr r3, [%[state], #20]\n\t" +#else + "ldrd r2, r3, [%[state], #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #64]\n\t" + "ldr r5, [%[state], #68]\n\t" +#else + "ldrd r4, r5, [%[state], #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [%[state], #112]\n\t" + "ldr r7, [%[state], #116]\n\t" +#else + "ldrd r6, r7, [%[state], #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [%[state], #120]\n\t" + "ldr r9, [%[state], #124]\n\t" +#else + "ldrd r8, r9, [%[state], #120]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [%[state], #168]\n\t" + "ldr r11, [%[state], #172]\n\t" +#else + "ldrd r10, r11, [%[state], #168]\n\t" +#endif + /* s[0] <<< 62 */ + "mov lr, r2\n\t" + "lsr r12, r3, #2\n\t" + "lsr r2, r2, #2\n\t" + "orr r2, r2, r3, lsl #30\n\t" + "orr r3, r12, lr, lsl #30\n\t" + /* s[1] <<< 55 */ + "mov lr, r4\n\t" + "lsr r12, r5, #9\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "orr r5, r12, lr, lsl #23\n\t" + /* s[2] <<< 39 */ + "mov lr, r6\n\t" + "lsr r12, r7, #25\n\t" + "lsr r6, r6, #25\n\t" + "orr r6, r6, r7, lsl #7\n\t" + "orr r7, r12, lr, lsl #7\n\t" + /* s[3] <<< 41 */ + "mov lr, r8\n\t" + "lsr r12, r9, #23\n\t" + "lsr r8, r8, #23\n\t" + "orr r8, r8, r9, lsl #9\n\t" + "orr r9, r12, lr, lsl #9\n\t" + /* s[4] <<< 2 */ + "lsr r12, r11, #30\n\t" + "lsr lr, r10, #30\n\t" + "orr r10, r12, r10, lsl #2\n\t" + "orr r11, lr, r11, lsl #2\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [sp, #168]\n\t" + "str lr, [sp, #172]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [sp, #176]\n\t" + "str lr, [sp, #180]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [sp, #184]\n\t" + "str lr, [sp, #188]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [sp, #192]\n\t" + "str lr, [sp, #196]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [sp, #160]\n\t" + "str lr, [sp, #164]\n\t" + /* Round odd */ + /* Calc b[4] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #32]\n\t" + "ldr r5, [sp, #36]\n\t" +#else + "ldrd r4, r5, [sp, #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #72]\n\t" + "ldr r7, [sp, #76]\n\t" +#else + "ldrd r6, r7, [sp, #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #112]\n\t" + "ldr r9, [sp, #116]\n\t" +#else + "ldrd r8, r9, [sp, #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #152]\n\t" + "ldr r11, [sp, #156]\n\t" +#else + "ldrd r10, r11, [sp, #152]\n\t" +#endif + "ldr r12, [sp, #192]\n\t" + "ldr lr, [sp, #196]\n\t" + "eor r2, r4, r6\n\t" + "eor r3, r5, r7\n\t" + "eor r2, r2, r8\n\t" + "eor r3, r3, r9\n\t" + "eor r2, r2, r10\n\t" + "eor r3, r3, r11\n\t" + "eor r2, r2, r12\n\t" + "eor r3, r3, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r2, [%[state], #32]\n\t" + "str r3, [%[state], #36]\n\t" +#else + "strd r2, r3, [%[state], #32]\n\t" +#endif + /* Calc b[1] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #8]\n\t" + "ldr r5, [sp, #12]\n\t" +#else + "ldrd r4, r5, [sp, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #48]\n\t" + "ldr r7, [sp, #52]\n\t" +#else + "ldrd r6, r7, [sp, #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #88]\n\t" + "ldr r9, [sp, #92]\n\t" +#else + "ldrd r8, r9, [sp, #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #128]\n\t" + "ldr r11, [sp, #132]\n\t" +#else + "ldrd r10, r11, [sp, #128]\n\t" +#endif + "ldr r12, [sp, #168]\n\t" + "ldr lr, [sp, #172]\n\t" + "eor r4, r4, r6\n\t" + "eor r5, r5, r7\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r4, r4, r10\n\t" + "eor r5, r5, r11\n\t" + "eor r4, r4, r12\n\t" + "eor r5, r5, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [%[state], #8]\n\t" + "str r5, [%[state], #12]\n\t" +#else + "strd r4, r5, [%[state], #8]\n\t" +#endif + /* Calc t[0] */ + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* Calc b[0] and XOR t[0] into s[x*5+0] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp]\n\t" + "ldr r5, [sp, #4]\n\t" +#else + "ldrd r4, r5, [sp]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #40]\n\t" + "ldr r7, [sp, #44]\n\t" +#else + "ldrd r6, r7, [sp, #40]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #80]\n\t" + "ldr r9, [sp, #84]\n\t" +#else + "ldrd r8, r9, [sp, #80]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #120]\n\t" + "ldr r11, [sp, #124]\n\t" +#else + "ldrd r10, r11, [sp, #120]\n\t" +#endif + "eor r12, r4, r6\n\t" + "eor lr, r5, r7\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp]\n\t" + "str r5, [sp, #4]\n\t" +#else + "strd r4, r5, [sp]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #40]\n\t" + "str r7, [sp, #44]\n\t" +#else + "strd r6, r7, [sp, #40]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #80]\n\t" + "str r9, [sp, #84]\n\t" +#else + "strd r8, r9, [sp, #80]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [sp, #120]\n\t" + "str r11, [sp, #124]\n\t" +#else + "strd r10, r11, [sp, #120]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #160]\n\t" + "ldr r11, [sp, #164]\n\t" +#else + "ldrd r10, r11, [sp, #160]\n\t" +#endif + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [sp, #160]\n\t" + "str r11, [sp, #164]\n\t" +#else + "strd r10, r11, [sp, #160]\n\t" +#endif + "str r12, [%[state]]\n\t" + "str lr, [%[state], #4]\n\t" + /* Calc b[3] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #24]\n\t" + "ldr r5, [sp, #28]\n\t" +#else + "ldrd r4, r5, [sp, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #64]\n\t" + "ldr r7, [sp, #68]\n\t" +#else + "ldrd r6, r7, [sp, #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #104]\n\t" + "ldr r9, [sp, #108]\n\t" +#else + "ldrd r8, r9, [sp, #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #144]\n\t" + "ldr r11, [sp, #148]\n\t" +#else + "ldrd r10, r11, [sp, #144]\n\t" +#endif + "ldr r12, [sp, #184]\n\t" + "ldr lr, [sp, #188]\n\t" + "eor r4, r4, r6\n\t" + "eor r5, r5, r7\n\t" + "eor r4, r4, r8\n\t" + "eor r5, r5, r9\n\t" + "eor r4, r4, r10\n\t" + "eor r5, r5, r11\n\t" + "eor r4, r4, r12\n\t" + "eor r5, r5, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [%[state], #24]\n\t" + "str r5, [%[state], #28]\n\t" +#else + "strd r4, r5, [%[state], #24]\n\t" +#endif + /* Calc t[2] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state], #8]\n\t" + "ldr r3, [%[state], #12]\n\t" +#else + "ldrd r2, r3, [%[state], #8]\n\t" +#endif + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* Calc b[2] and XOR t[2] into s[x*5+2] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #16]\n\t" + "ldr r5, [sp, #20]\n\t" +#else + "ldrd r4, r5, [sp, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #56]\n\t" + "ldr r7, [sp, #60]\n\t" +#else + "ldrd r6, r7, [sp, #56]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #96]\n\t" + "ldr r9, [sp, #100]\n\t" +#else + "ldrd r8, r9, [sp, #96]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #136]\n\t" + "ldr r11, [sp, #140]\n\t" +#else + "ldrd r10, r11, [sp, #136]\n\t" +#endif + "eor r12, r4, r6\n\t" + "eor lr, r5, r7\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #16]\n\t" + "str r5, [sp, #20]\n\t" +#else + "strd r4, r5, [sp, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #56]\n\t" + "str r7, [sp, #60]\n\t" +#else + "strd r6, r7, [sp, #56]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #96]\n\t" + "str r9, [sp, #100]\n\t" +#else + "strd r8, r9, [sp, #96]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [sp, #136]\n\t" + "str r11, [sp, #140]\n\t" +#else + "strd r10, r11, [sp, #136]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #176]\n\t" + "ldr r11, [sp, #180]\n\t" +#else + "ldrd r10, r11, [sp, #176]\n\t" +#endif + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [sp, #176]\n\t" + "str r11, [sp, #180]\n\t" +#else + "strd r10, r11, [sp, #176]\n\t" +#endif + "str r12, [%[state], #16]\n\t" + "str lr, [%[state], #20]\n\t" + /* Calc t[1] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state]]\n\t" + "ldr r3, [%[state], #4]\n\t" +#else + "ldrd r2, r3, [%[state]]\n\t" +#endif + "eor r2, r2, lr, lsr #31\n\t" + "eor r3, r3, r12, lsr #31\n\t" + "eor r2, r2, r12, lsl #1\n\t" + "eor r3, r3, lr, lsl #1\n\t" + /* XOR t[1] into s[x*5+1] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #8]\n\t" + "ldr r5, [sp, #12]\n\t" +#else + "ldrd r4, r5, [sp, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #48]\n\t" + "ldr r7, [sp, #52]\n\t" +#else + "ldrd r6, r7, [sp, #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #88]\n\t" + "ldr r9, [sp, #92]\n\t" +#else + "ldrd r8, r9, [sp, #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #128]\n\t" + "ldr r11, [sp, #132]\n\t" +#else + "ldrd r10, r11, [sp, #128]\n\t" +#endif + "ldr r12, [sp, #168]\n\t" + "ldr lr, [sp, #172]\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #8]\n\t" + "str r5, [sp, #12]\n\t" +#else + "strd r4, r5, [sp, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #48]\n\t" + "str r7, [sp, #52]\n\t" +#else + "strd r6, r7, [sp, #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #88]\n\t" + "str r9, [sp, #92]\n\t" +#else + "strd r8, r9, [sp, #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [sp, #128]\n\t" + "str r11, [sp, #132]\n\t" +#else + "strd r10, r11, [sp, #128]\n\t" +#endif + "str r12, [sp, #168]\n\t" + "str lr, [sp, #172]\n\t" + /* Calc t[3] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state], #16]\n\t" + "ldr r3, [%[state], #20]\n\t" +#else + "ldrd r2, r3, [%[state], #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state], #32]\n\t" + "ldr r5, [%[state], #36]\n\t" +#else + "ldrd r4, r5, [%[state], #32]\n\t" +#endif + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* XOR t[3] into s[x*5+3] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #24]\n\t" + "ldr r5, [sp, #28]\n\t" +#else + "ldrd r4, r5, [sp, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #64]\n\t" + "ldr r7, [sp, #68]\n\t" +#else + "ldrd r6, r7, [sp, #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #104]\n\t" + "ldr r9, [sp, #108]\n\t" +#else + "ldrd r8, r9, [sp, #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #144]\n\t" + "ldr r11, [sp, #148]\n\t" +#else + "ldrd r10, r11, [sp, #144]\n\t" +#endif + "ldr r12, [sp, #184]\n\t" + "ldr lr, [sp, #188]\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #24]\n\t" + "str r5, [sp, #28]\n\t" +#else + "strd r4, r5, [sp, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #64]\n\t" + "str r7, [sp, #68]\n\t" +#else + "strd r6, r7, [sp, #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #104]\n\t" + "str r9, [sp, #108]\n\t" +#else + "strd r8, r9, [sp, #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [sp, #144]\n\t" + "str r11, [sp, #148]\n\t" +#else + "strd r10, r11, [sp, #144]\n\t" +#endif + "str r12, [sp, #184]\n\t" + "str lr, [sp, #188]\n\t" + /* Calc t[4] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [%[state], #24]\n\t" + "ldr r3, [%[state], #28]\n\t" +#else + "ldrd r2, r3, [%[state], #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [%[state]]\n\t" + "ldr r5, [%[state], #4]\n\t" +#else + "ldrd r4, r5, [%[state]]\n\t" +#endif + "eor r2, r2, r5, lsr #31\n\t" + "eor r3, r3, r4, lsr #31\n\t" + "eor r2, r2, r4, lsl #1\n\t" + "eor r3, r3, r5, lsl #1\n\t" + /* XOR t[4] into s[x*5+4] */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #32]\n\t" + "ldr r5, [sp, #36]\n\t" +#else + "ldrd r4, r5, [sp, #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #72]\n\t" + "ldr r7, [sp, #76]\n\t" +#else + "ldrd r6, r7, [sp, #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #112]\n\t" + "ldr r9, [sp, #116]\n\t" +#else + "ldrd r8, r9, [sp, #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #152]\n\t" + "ldr r11, [sp, #156]\n\t" +#else + "ldrd r10, r11, [sp, #152]\n\t" +#endif + "ldr r12, [sp, #192]\n\t" + "ldr lr, [sp, #196]\n\t" + "eor r4, r4, r2\n\t" + "eor r5, r5, r3\n\t" + "eor r6, r6, r2\n\t" + "eor r7, r7, r3\n\t" + "eor r8, r8, r2\n\t" + "eor r9, r9, r3\n\t" + "eor r10, r10, r2\n\t" + "eor r11, r11, r3\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r4, [sp, #32]\n\t" + "str r5, [sp, #36]\n\t" +#else + "strd r4, r5, [sp, #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r6, [sp, #72]\n\t" + "str r7, [sp, #76]\n\t" +#else + "strd r6, r7, [sp, #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #112]\n\t" + "str r9, [sp, #116]\n\t" +#else + "strd r8, r9, [sp, #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r10, [sp, #152]\n\t" + "str r11, [sp, #156]\n\t" +#else + "strd r10, r11, [sp, #152]\n\t" +#endif + "str r12, [sp, #192]\n\t" + "str lr, [sp, #196]\n\t" + /* Row Mix */ + /* Row 0 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp]\n\t" + "ldr r3, [sp, #4]\n\t" +#else + "ldrd r2, r3, [sp]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #48]\n\t" + "ldr r5, [sp, #52]\n\t" +#else + "ldrd r4, r5, [sp, #48]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #96]\n\t" + "ldr r7, [sp, #100]\n\t" +#else + "ldrd r6, r7, [sp, #96]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #144]\n\t" + "ldr r9, [sp, #148]\n\t" +#else + "ldrd r8, r9, [sp, #144]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #192]\n\t" + "ldr r11, [sp, #196]\n\t" +#else + "ldrd r10, r11, [sp, #192]\n\t" +#endif + /* s[1] <<< 44 */ + "mov lr, r4\n\t" + "lsr r12, r5, #20\n\t" + "lsr r4, r4, #20\n\t" + "orr r4, r4, r5, lsl #12\n\t" + "orr r5, r12, lr, lsl #12\n\t" + /* s[2] <<< 43 */ + "mov lr, r6\n\t" + "lsr r12, r7, #21\n\t" + "lsr r6, r6, #21\n\t" + "orr r6, r6, r7, lsl #11\n\t" + "orr r7, r12, lr, lsl #11\n\t" + /* s[3] <<< 21 */ + "lsr r12, r9, #11\n\t" + "lsr lr, r8, #11\n\t" + "orr r8, r12, r8, lsl #21\n\t" + "orr r9, lr, r9, lsl #21\n\t" + /* s[4] <<< 14 */ + "lsr r12, r11, #18\n\t" + "lsr lr, r10, #18\n\t" + "orr r10, r12, r10, lsl #14\n\t" + "orr r11, lr, r11, lsl #14\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [%[state], #8]\n\t" + "str lr, [%[state], #12]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [%[state], #16]\n\t" + "str lr, [%[state], #20]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [%[state], #24]\n\t" + "str lr, [%[state], #28]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [%[state], #32]\n\t" + "str lr, [%[state], #36]\n\t" + /* Get constant */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [r1]\n\t" + "ldr r11, [r1, #4]\n\t" +#else + "ldrd r10, r11, [r1]\n\t" +#endif + "add r1, r1, #8\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + /* XOR in constant */ + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [%[state]]\n\t" + "str lr, [%[state], #4]\n\t" + /* Row 1 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp, #24]\n\t" + "ldr r3, [sp, #28]\n\t" +#else + "ldrd r2, r3, [sp, #24]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #72]\n\t" + "ldr r5, [sp, #76]\n\t" +#else + "ldrd r4, r5, [sp, #72]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #80]\n\t" + "ldr r7, [sp, #84]\n\t" +#else + "ldrd r6, r7, [sp, #80]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #128]\n\t" + "ldr r9, [sp, #132]\n\t" +#else + "ldrd r8, r9, [sp, #128]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #176]\n\t" + "ldr r11, [sp, #180]\n\t" +#else + "ldrd r10, r11, [sp, #176]\n\t" +#endif + /* s[0] <<< 28 */ + "lsr r12, r3, #4\n\t" + "lsr lr, r2, #4\n\t" + "orr r2, r12, r2, lsl #28\n\t" + "orr r3, lr, r3, lsl #28\n\t" + /* s[1] <<< 20 */ + "lsr r12, r5, #12\n\t" + "lsr lr, r4, #12\n\t" + "orr r4, r12, r4, lsl #20\n\t" + "orr r5, lr, r5, lsl #20\n\t" + /* s[2] <<< 3 */ + "lsr r12, r7, #29\n\t" + "lsr lr, r6, #29\n\t" + "orr r6, r12, r6, lsl #3\n\t" + "orr r7, lr, r7, lsl #3\n\t" + /* s[3] <<< 45 */ + "mov lr, r8\n\t" + "lsr r12, r9, #19\n\t" + "lsr r8, r8, #19\n\t" + "orr r8, r8, r9, lsl #13\n\t" + "orr r9, r12, lr, lsl #13\n\t" + /* s[4] <<< 61 */ + "mov lr, r10\n\t" + "lsr r12, r11, #3\n\t" + "lsr r10, r10, #3\n\t" + "orr r10, r10, r11, lsl #29\n\t" + "orr r11, r12, lr, lsl #29\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [%[state], #48]\n\t" + "str lr, [%[state], #52]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [%[state], #56]\n\t" + "str lr, [%[state], #60]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [%[state], #64]\n\t" + "str lr, [%[state], #68]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [%[state], #72]\n\t" + "str lr, [%[state], #76]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [%[state], #40]\n\t" + "str lr, [%[state], #44]\n\t" + /* Row 2 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp, #8]\n\t" + "ldr r3, [sp, #12]\n\t" +#else + "ldrd r2, r3, [sp, #8]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #56]\n\t" + "ldr r5, [sp, #60]\n\t" +#else + "ldrd r4, r5, [sp, #56]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #104]\n\t" + "ldr r7, [sp, #108]\n\t" +#else + "ldrd r6, r7, [sp, #104]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #152]\n\t" + "ldr r9, [sp, #156]\n\t" +#else + "ldrd r8, r9, [sp, #152]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #160]\n\t" + "ldr r11, [sp, #164]\n\t" +#else + "ldrd r10, r11, [sp, #160]\n\t" +#endif + /* s[0] <<< 1 */ + "lsr r12, r3, #31\n\t" + "lsr lr, r2, #31\n\t" + "orr r2, r12, r2, lsl #1\n\t" + "orr r3, lr, r3, lsl #1\n\t" + /* s[1] <<< 6 */ + "lsr r12, r5, #26\n\t" + "lsr lr, r4, #26\n\t" + "orr r4, r12, r4, lsl #6\n\t" + "orr r5, lr, r5, lsl #6\n\t" + /* s[2] <<< 25 */ + "lsr r12, r7, #7\n\t" + "lsr lr, r6, #7\n\t" + "orr r6, r12, r6, lsl #25\n\t" + "orr r7, lr, r7, lsl #25\n\t" + /* s[3] <<< 8 */ + "lsr r12, r9, #24\n\t" + "lsr lr, r8, #24\n\t" + "orr r8, r12, r8, lsl #8\n\t" + "orr r9, lr, r9, lsl #8\n\t" + /* s[4] <<< 18 */ + "lsr r12, r11, #14\n\t" + "lsr lr, r10, #14\n\t" + "orr r10, r12, r10, lsl #18\n\t" + "orr r11, lr, r11, lsl #18\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [%[state], #88]\n\t" + "str lr, [%[state], #92]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [%[state], #96]\n\t" + "str lr, [%[state], #100]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [%[state], #104]\n\t" + "str lr, [%[state], #108]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [%[state], #112]\n\t" + "str lr, [%[state], #116]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [%[state], #80]\n\t" + "str lr, [%[state], #84]\n\t" + /* Row 3 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp, #32]\n\t" + "ldr r3, [sp, #36]\n\t" +#else + "ldrd r2, r3, [sp, #32]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #40]\n\t" + "ldr r5, [sp, #44]\n\t" +#else + "ldrd r4, r5, [sp, #40]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #88]\n\t" + "ldr r7, [sp, #92]\n\t" +#else + "ldrd r6, r7, [sp, #88]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #136]\n\t" + "ldr r9, [sp, #140]\n\t" +#else + "ldrd r8, r9, [sp, #136]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #184]\n\t" + "ldr r11, [sp, #188]\n\t" +#else + "ldrd r10, r11, [sp, #184]\n\t" +#endif + /* s[0] <<< 27 */ + "lsr r12, r3, #5\n\t" + "lsr lr, r2, #5\n\t" + "orr r2, r12, r2, lsl #27\n\t" + "orr r3, lr, r3, lsl #27\n\t" + /* s[1] <<< 36 */ + "mov lr, r4\n\t" + "lsr r12, r5, #28\n\t" + "lsr r4, r4, #28\n\t" + "orr r4, r4, r5, lsl #4\n\t" + "orr r5, r12, lr, lsl #4\n\t" + /* s[2] <<< 10 */ + "lsr r12, r7, #22\n\t" + "lsr lr, r6, #22\n\t" + "orr r6, r12, r6, lsl #10\n\t" + "orr r7, lr, r7, lsl #10\n\t" + /* s[3] <<< 15 */ + "lsr r12, r9, #17\n\t" + "lsr lr, r8, #17\n\t" + "orr r8, r12, r8, lsl #15\n\t" + "orr r9, lr, r9, lsl #15\n\t" + /* s[4] <<< 56 */ + "mov lr, r10\n\t" + "lsr r12, r11, #8\n\t" + "lsr r10, r10, #8\n\t" + "orr r10, r10, r11, lsl #24\n\t" + "orr r11, r12, lr, lsl #24\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [%[state], #128]\n\t" + "str lr, [%[state], #132]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [%[state], #136]\n\t" + "str lr, [%[state], #140]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [%[state], #144]\n\t" + "str lr, [%[state], #148]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [%[state], #152]\n\t" + "str lr, [%[state], #156]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [%[state], #120]\n\t" + "str lr, [%[state], #124]\n\t" + /* Row 4 */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r2, [sp, #16]\n\t" + "ldr r3, [sp, #20]\n\t" +#else + "ldrd r2, r3, [sp, #16]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r4, [sp, #64]\n\t" + "ldr r5, [sp, #68]\n\t" +#else + "ldrd r4, r5, [sp, #64]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r6, [sp, #112]\n\t" + "ldr r7, [sp, #116]\n\t" +#else + "ldrd r6, r7, [sp, #112]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r8, [sp, #120]\n\t" + "ldr r9, [sp, #124]\n\t" +#else + "ldrd r8, r9, [sp, #120]\n\t" +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "ldr r10, [sp, #168]\n\t" + "ldr r11, [sp, #172]\n\t" +#else + "ldrd r10, r11, [sp, #168]\n\t" +#endif + /* s[0] <<< 62 */ + "mov lr, r2\n\t" + "lsr r12, r3, #2\n\t" + "lsr r2, r2, #2\n\t" + "orr r2, r2, r3, lsl #30\n\t" + "orr r3, r12, lr, lsl #30\n\t" + /* s[1] <<< 55 */ + "mov lr, r4\n\t" + "lsr r12, r5, #9\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "orr r5, r12, lr, lsl #23\n\t" + /* s[2] <<< 39 */ + "mov lr, r6\n\t" + "lsr r12, r7, #25\n\t" + "lsr r6, r6, #25\n\t" + "orr r6, r6, r7, lsl #7\n\t" + "orr r7, r12, lr, lsl #7\n\t" + /* s[3] <<< 41 */ + "mov lr, r8\n\t" + "lsr r12, r9, #23\n\t" + "lsr r8, r8, #23\n\t" + "orr r8, r8, r9, lsl #9\n\t" + "orr r9, r12, lr, lsl #9\n\t" + /* s[4] <<< 2 */ + "lsr r12, r11, #30\n\t" + "lsr lr, r10, #30\n\t" + "orr r10, r12, r10, lsl #2\n\t" + "orr r11, lr, r11, lsl #2\n\t" + "bic r12, r8, r6\n\t" + "bic lr, r9, r7\n\t" + "eor r12, r12, r4\n\t" + "eor lr, lr, r5\n\t" + "str r12, [%[state], #168]\n\t" + "str lr, [%[state], #172]\n\t" + "bic r12, r10, r8\n\t" + "bic lr, r11, r9\n\t" + "eor r12, r12, r6\n\t" + "eor lr, lr, r7\n\t" + "str r12, [%[state], #176]\n\t" + "str lr, [%[state], #180]\n\t" + "bic r12, r2, r10\n\t" + "bic lr, r3, r11\n\t" + "eor r12, r12, r8\n\t" + "eor lr, lr, r9\n\t" + "str r12, [%[state], #184]\n\t" + "str lr, [%[state], #188]\n\t" + "bic r12, r4, r2\n\t" + "bic lr, r5, r3\n\t" + "eor r12, r12, r10\n\t" + "eor lr, lr, r11\n\t" + "str r12, [%[state], #192]\n\t" + "str lr, [%[state], #196]\n\t" + "bic r12, r6, r4\n\t" + "bic lr, r7, r5\n\t" + "eor r12, r12, r2\n\t" + "eor lr, lr, r3\n\t" + "str r12, [%[state], #160]\n\t" + "str lr, [%[state], #164]\n\t" + "ldr r2, [sp, #200]\n\t" + "subs r2, r2, #1\n\t" + "bne L_sha3_arm32_begin_%=\n\t" + "add sp, sp, #0xcc\n\t" + : [state] "+r" (state), [L_sha3_arm2_neon_rt] "+r" (L_sha3_arm2_neon_rt_c), [L_sha3_arm2_rt] "+r" (L_sha3_arm2_rt_c) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */ +#endif /* WOLFSSL_ARMASM */ + +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,7 +30,8 @@ #include #ifdef WOLFSSL_ARMASM -#ifndef __aarch64__ +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE #ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_ARMASM_NO_NEON .text @@ -207,97 +208,97 @@ sub sp, sp, #0xc0 adr r3, L_SHA512_transform_len_k # Copy digest to add in at end -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else ldrd r8, r9, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r0, #24] ldr r11, [r0, #28] #else ldrd r10, r11, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #128] str r5, [sp, #132] #else strd r4, r5, [sp, #128] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #136] str r7, [sp, #140] #else strd r6, r7, [sp, #136] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [sp, #144] str r9, [sp, #148] #else strd r8, r9, [sp, #144] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r10, [sp, #152] str r11, [sp, #156] #else strd r10, r11, [sp, #152] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else ldrd r8, r9, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r0, #56] ldr r11, [r0, #60] #else ldrd r10, r11, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #160] str r5, [sp, #164] #else strd r4, r5, [sp, #160] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #168] str r7, [sp, #172] #else strd r6, r7, [sp, #168] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [sp, #176] str r9, [sp, #180] #else strd r8, r9, [sp, #176] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r10, [sp, #184] str r11, [sp, #188] #else @@ -305,31 +306,209 @@ #endif # Start of loop processing a block L_SHA512_transform_len_begin: - # Load, Reverse and Store W -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + # Load, Reverse and Store W - 64 bytes +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) ldr r4, [r1] ldr r5, [r1, #4] -#else - ldrd r4, r5, [r1] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r6, [r1, #8] ldr r7, [r1, #12] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp] + str r4, [sp, #4] + str r7, [sp, #8] + str r6, [sp, #12] + ldr r4, [r1, #16] + ldr r5, [r1, #20] + ldr r6, [r1, #24] + ldr r7, [r1, #28] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp, #16] + str r4, [sp, #20] + str r7, [sp, #24] + str r6, [sp, #28] + ldr r4, [r1, #32] + ldr r5, [r1, #36] + ldr r6, [r1, #40] + ldr r7, [r1, #44] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp, #32] + str r4, [sp, #36] + str r7, [sp, #40] + str r6, [sp, #44] + ldr r4, [r1, #48] + ldr r5, [r1, #52] + ldr r6, [r1, #56] + ldr r7, [r1, #60] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp, #48] + str r4, [sp, #52] + str r7, [sp, #56] + str r6, [sp, #60] + ldr r4, [r1, #64] + ldr r5, [r1, #68] + ldr r6, [r1, #72] + ldr r7, [r1, #76] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp, #64] + str r4, [sp, #68] + str r7, [sp, #72] + str r6, [sp, #76] + ldr r4, [r1, #80] + ldr r5, [r1, #84] + ldr r6, [r1, #88] + ldr r7, [r1, #92] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp, #80] + str r4, [sp, #84] + str r7, [sp, #88] + str r6, [sp, #92] + ldr r4, [r1, #96] + ldr r5, [r1, #100] + ldr r6, [r1, #104] + ldr r7, [r1, #108] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp, #96] + str r4, [sp, #100] + str r7, [sp, #104] + str r6, [sp, #108] + ldr r4, [r1, #112] + ldr r5, [r1, #116] + ldr r6, [r1, #120] + ldr r7, [r1, #124] + eor r8, r4, r4, ror #16 + eor r9, r5, r5, ror #16 + eor r10, r6, r6, ror #16 + eor r11, r7, r7, ror #16 + bic r8, r8, #0xff0000 + bic r9, r9, #0xff0000 + bic r10, r10, #0xff0000 + bic r11, r11, #0xff0000 + ror r4, r4, #8 + ror r5, r5, #8 + ror r6, r6, #8 + ror r7, r7, #8 + eor r4, r4, r8, lsr #8 + eor r5, r5, r9, lsr #8 + eor r6, r6, r10, lsr #8 + eor r7, r7, r11, lsr #8 + str r5, [sp, #112] + str r4, [sp, #116] + str r7, [sp, #120] + str r6, [sp, #124] #else - ldrd r6, r7, [r1, #8] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + ldr r4, [r1] + ldr r5, [r1, #4] + ldr r6, [r1, #8] + ldr r7, [r1, #12] ldr r8, [r1, #16] ldr r9, [r1, #20] -#else - ldrd r8, r9, [r1, #16] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r10, [r1, #24] ldr r11, [r1, #28] -#else - ldrd r10, r11, [r1, #24] -#endif rev r4, r4 rev r5, r5 rev r6, r6 @@ -346,30 +525,14 @@ str r8, [sp, #20] str r11, [sp, #24] str r10, [sp, #28] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r4, [r1, #32] ldr r5, [r1, #36] -#else - ldrd r4, r5, [r1, #32] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r6, [r1, #40] ldr r7, [r1, #44] -#else - ldrd r6, r7, [r1, #40] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r8, [r1, #48] ldr r9, [r1, #52] -#else - ldrd r8, r9, [r1, #48] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r10, [r1, #56] ldr r11, [r1, #60] -#else - ldrd r10, r11, [r1, #56] -#endif rev r4, r4 rev r5, r5 rev r6, r6 @@ -386,30 +549,14 @@ str r8, [sp, #52] str r11, [sp, #56] str r10, [sp, #60] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r4, [r1, #64] ldr r5, [r1, #68] -#else - ldrd r4, r5, [r1, #64] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r6, [r1, #72] ldr r7, [r1, #76] -#else - ldrd r6, r7, [r1, #72] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r8, [r1, #80] ldr r9, [r1, #84] -#else - ldrd r8, r9, [r1, #80] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r10, [r1, #88] ldr r11, [r1, #92] -#else - ldrd r10, r11, [r1, #88] -#endif rev r4, r4 rev r5, r5 rev r6, r6 @@ -426,30 +573,14 @@ str r8, [sp, #84] str r11, [sp, #88] str r10, [sp, #92] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r4, [r1, #96] ldr r5, [r1, #100] -#else - ldrd r4, r5, [r1, #96] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r6, [r1, #104] ldr r7, [r1, #108] -#else - ldrd r6, r7, [r1, #104] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r8, [r1, #112] ldr r9, [r1, #116] -#else - ldrd r8, r9, [r1, #112] -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) ldr r10, [r1, #120] ldr r11, [r1, #124] -#else - ldrd r10, r11, [r1, #120] -#endif rev r4, r4 rev r5, r5 rev r6, r6 @@ -466,14 +597,15 @@ str r8, [sp, #116] str r11, [sp, #120] str r10, [sp, #124] +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ # Pre-calc: b ^ c -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [r0, #8] ldr r11, [r0, #12] #else ldrd r10, r11, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -485,7 +617,7 @@ # Start of 16 rounds L_SHA512_transform_len_start: # Round 0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -505,7 +637,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -515,25 +647,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else strd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -545,13 +677,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp] ldr r9, [sp, #4] #else @@ -559,7 +691,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3] ldr r7, [r3, #4] #else @@ -567,7 +699,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -575,7 +707,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -583,13 +715,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #24] str r9, [r0, #28] #else @@ -609,7 +741,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -619,19 +751,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else ldrd r8, r9, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -643,7 +775,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else @@ -651,7 +783,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #56] str r7, [r0, #60] #else @@ -660,7 +792,7 @@ mov r10, r8 mov r11, r9 # Calc new W[0] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #112] ldr r5, [sp, #116] #else @@ -681,13 +813,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp] ldr r5, [sp, #4] #else ldrd r4, r5, [sp] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #72] ldr r9, [sp, #76] #else @@ -697,13 +829,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp] str r5, [sp, #4] #else strd r4, r5, [sp] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #8] ldr r5, [sp, #12] #else @@ -724,7 +856,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp] ldr r5, [sp, #4] #else @@ -732,14 +864,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp] str r5, [sp, #4] #else strd r4, r5, [sp] #endif # Round 1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -759,7 +891,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -769,25 +901,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else strd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -799,13 +931,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #8] ldr r9, [sp, #12] #else @@ -813,7 +945,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #8] ldr r7, [r3, #12] #else @@ -821,7 +953,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -829,7 +961,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -837,13 +969,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #16] str r9, [r0, #20] #else @@ -863,7 +995,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -873,19 +1005,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else ldrd r8, r9, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -897,7 +1029,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else @@ -905,7 +1037,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #48] str r7, [r0, #52] #else @@ -914,7 +1046,7 @@ mov r10, r8 mov r11, r9 # Calc new W[1] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #120] ldr r5, [sp, #124] #else @@ -935,13 +1067,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #8] ldr r5, [sp, #12] #else ldrd r4, r5, [sp, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #80] ldr r9, [sp, #84] #else @@ -951,13 +1083,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #8] str r5, [sp, #12] #else strd r4, r5, [sp, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #16] ldr r5, [sp, #20] #else @@ -978,7 +1110,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #8] ldr r5, [sp, #12] #else @@ -986,14 +1118,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #8] str r5, [sp, #12] #else strd r4, r5, [sp, #8] #endif # Round 2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -1013,7 +1145,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -1023,25 +1155,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else strd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -1053,13 +1185,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #16] ldr r9, [sp, #20] #else @@ -1067,7 +1199,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #16] ldr r7, [r3, #20] #else @@ -1075,7 +1207,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -1083,7 +1215,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -1091,13 +1223,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #8] str r9, [r0, #12] #else @@ -1117,7 +1249,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -1127,19 +1259,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else ldrd r8, r9, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -1151,7 +1283,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else @@ -1159,7 +1291,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #40] str r7, [r0, #44] #else @@ -1168,7 +1300,7 @@ mov r10, r8 mov r11, r9 # Calc new W[2] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp] ldr r5, [sp, #4] #else @@ -1189,13 +1321,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #16] ldr r5, [sp, #20] #else ldrd r4, r5, [sp, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #88] ldr r9, [sp, #92] #else @@ -1205,13 +1337,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #16] str r5, [sp, #20] #else strd r4, r5, [sp, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #24] ldr r5, [sp, #28] #else @@ -1232,7 +1364,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #16] ldr r5, [sp, #20] #else @@ -1240,14 +1372,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #16] str r5, [sp, #20] #else strd r4, r5, [sp, #16] #endif # Round 3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -1267,7 +1399,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -1277,25 +1409,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else strd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -1307,13 +1439,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #24] ldr r9, [sp, #28] #else @@ -1321,7 +1453,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #24] ldr r7, [r3, #28] #else @@ -1329,7 +1461,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -1337,7 +1469,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -1345,13 +1477,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0] str r9, [r0, #4] #else @@ -1371,7 +1503,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -1381,19 +1513,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else ldrd r8, r9, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -1405,7 +1537,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else @@ -1413,7 +1545,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #32] str r7, [r0, #36] #else @@ -1422,7 +1554,7 @@ mov r10, r8 mov r11, r9 # Calc new W[3] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #8] ldr r5, [sp, #12] #else @@ -1443,13 +1575,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #24] ldr r5, [sp, #28] #else ldrd r4, r5, [sp, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #96] ldr r9, [sp, #100] #else @@ -1459,13 +1591,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #24] str r5, [sp, #28] #else strd r4, r5, [sp, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #32] ldr r5, [sp, #36] #else @@ -1486,7 +1618,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #24] ldr r5, [sp, #28] #else @@ -1494,14 +1626,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #24] str r5, [sp, #28] #else strd r4, r5, [sp, #24] #endif # Round 4 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -1521,7 +1653,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -1531,25 +1663,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else strd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -1561,13 +1693,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #32] ldr r9, [sp, #36] #else @@ -1575,7 +1707,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #32] ldr r7, [r3, #36] #else @@ -1583,7 +1715,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -1591,7 +1723,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -1599,13 +1731,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #56] str r9, [r0, #60] #else @@ -1625,7 +1757,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -1635,19 +1767,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else ldrd r8, r9, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -1659,7 +1791,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else @@ -1667,7 +1799,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #24] str r7, [r0, #28] #else @@ -1676,7 +1808,7 @@ mov r10, r8 mov r11, r9 # Calc new W[4] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #16] ldr r5, [sp, #20] #else @@ -1697,13 +1829,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #32] ldr r5, [sp, #36] #else ldrd r4, r5, [sp, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #104] ldr r9, [sp, #108] #else @@ -1713,13 +1845,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #32] str r5, [sp, #36] #else strd r4, r5, [sp, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #40] ldr r5, [sp, #44] #else @@ -1740,7 +1872,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #32] ldr r5, [sp, #36] #else @@ -1748,14 +1880,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #32] str r5, [sp, #36] #else strd r4, r5, [sp, #32] #endif # Round 5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -1775,7 +1907,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -1785,25 +1917,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else strd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -1815,13 +1947,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #40] ldr r9, [sp, #44] #else @@ -1829,7 +1961,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #40] ldr r7, [r3, #44] #else @@ -1837,7 +1969,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -1845,7 +1977,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -1853,13 +1985,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #48] str r9, [r0, #52] #else @@ -1879,7 +2011,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -1889,19 +2021,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else ldrd r8, r9, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -1913,7 +2045,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else @@ -1921,7 +2053,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #16] str r7, [r0, #20] #else @@ -1930,7 +2062,7 @@ mov r10, r8 mov r11, r9 # Calc new W[5] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #24] ldr r5, [sp, #28] #else @@ -1951,13 +2083,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #40] ldr r5, [sp, #44] #else ldrd r4, r5, [sp, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #112] ldr r9, [sp, #116] #else @@ -1967,13 +2099,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #40] str r5, [sp, #44] #else strd r4, r5, [sp, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #48] ldr r5, [sp, #52] #else @@ -1994,7 +2126,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #40] ldr r5, [sp, #44] #else @@ -2002,14 +2134,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #40] str r5, [sp, #44] #else strd r4, r5, [sp, #40] #endif # Round 6 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -2029,7 +2161,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -2039,25 +2171,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else strd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -2069,13 +2201,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #48] ldr r9, [sp, #52] #else @@ -2083,7 +2215,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #48] ldr r7, [r3, #52] #else @@ -2091,7 +2223,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -2099,7 +2231,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -2107,13 +2239,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #40] str r9, [r0, #44] #else @@ -2133,7 +2265,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -2143,19 +2275,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else ldrd r8, r9, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -2167,7 +2299,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else @@ -2175,7 +2307,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #8] str r7, [r0, #12] #else @@ -2184,7 +2316,7 @@ mov r10, r8 mov r11, r9 # Calc new W[6] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #32] ldr r5, [sp, #36] #else @@ -2205,13 +2337,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #48] ldr r5, [sp, #52] #else ldrd r4, r5, [sp, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #120] ldr r9, [sp, #124] #else @@ -2221,13 +2353,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #48] str r5, [sp, #52] #else strd r4, r5, [sp, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #56] ldr r5, [sp, #60] #else @@ -2248,7 +2380,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #48] ldr r5, [sp, #52] #else @@ -2256,14 +2388,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #48] str r5, [sp, #52] #else strd r4, r5, [sp, #48] #endif # Round 7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -2283,7 +2415,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -2293,25 +2425,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else strd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -2323,13 +2455,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #56] ldr r9, [sp, #60] #else @@ -2337,7 +2469,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #56] ldr r7, [r3, #60] #else @@ -2345,7 +2477,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -2353,7 +2485,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -2361,13 +2493,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #32] str r9, [r0, #36] #else @@ -2387,7 +2519,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -2397,19 +2529,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else ldrd r8, r9, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -2421,7 +2553,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else @@ -2429,7 +2561,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0] str r7, [r0, #4] #else @@ -2438,7 +2570,7 @@ mov r10, r8 mov r11, r9 # Calc new W[7] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #40] ldr r5, [sp, #44] #else @@ -2459,13 +2591,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #56] ldr r5, [sp, #60] #else ldrd r4, r5, [sp, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp] ldr r9, [sp, #4] #else @@ -2475,13 +2607,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #56] str r5, [sp, #60] #else strd r4, r5, [sp, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #64] ldr r5, [sp, #68] #else @@ -2502,7 +2634,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #56] ldr r5, [sp, #60] #else @@ -2510,14 +2642,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #56] str r5, [sp, #60] #else strd r4, r5, [sp, #56] #endif # Round 8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -2537,7 +2669,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -2547,25 +2679,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else strd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -2577,13 +2709,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #64] ldr r9, [sp, #68] #else @@ -2591,7 +2723,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #64] ldr r7, [r3, #68] #else @@ -2599,7 +2731,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -2607,7 +2739,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -2615,13 +2747,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #24] str r9, [r0, #28] #else @@ -2641,7 +2773,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -2651,19 +2783,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else ldrd r8, r9, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -2675,7 +2807,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else @@ -2683,7 +2815,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #56] str r7, [r0, #60] #else @@ -2692,7 +2824,7 @@ mov r10, r8 mov r11, r9 # Calc new W[8] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #48] ldr r5, [sp, #52] #else @@ -2713,13 +2845,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #64] ldr r5, [sp, #68] #else ldrd r4, r5, [sp, #64] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #8] ldr r9, [sp, #12] #else @@ -2729,13 +2861,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #64] str r5, [sp, #68] #else strd r4, r5, [sp, #64] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #72] ldr r5, [sp, #76] #else @@ -2756,7 +2888,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #64] ldr r5, [sp, #68] #else @@ -2764,14 +2896,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #64] str r5, [sp, #68] #else strd r4, r5, [sp, #64] #endif # Round 9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -2791,7 +2923,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -2801,25 +2933,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else strd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -2831,13 +2963,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #72] ldr r9, [sp, #76] #else @@ -2845,7 +2977,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #72] ldr r7, [r3, #76] #else @@ -2853,7 +2985,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -2861,7 +2993,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -2869,13 +3001,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #16] str r9, [r0, #20] #else @@ -2895,7 +3027,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -2905,19 +3037,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else ldrd r8, r9, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -2929,7 +3061,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else @@ -2937,7 +3069,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #48] str r7, [r0, #52] #else @@ -2946,7 +3078,7 @@ mov r10, r8 mov r11, r9 # Calc new W[9] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #56] ldr r5, [sp, #60] #else @@ -2967,13 +3099,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #72] ldr r5, [sp, #76] #else ldrd r4, r5, [sp, #72] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #16] ldr r9, [sp, #20] #else @@ -2983,13 +3115,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #72] str r5, [sp, #76] #else strd r4, r5, [sp, #72] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #80] ldr r5, [sp, #84] #else @@ -3010,7 +3142,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #72] ldr r5, [sp, #76] #else @@ -3018,14 +3150,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #72] str r5, [sp, #76] #else strd r4, r5, [sp, #72] #endif # Round 10 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -3045,7 +3177,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -3055,25 +3187,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else strd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -3085,13 +3217,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #80] ldr r9, [sp, #84] #else @@ -3099,7 +3231,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #80] ldr r7, [r3, #84] #else @@ -3107,7 +3239,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -3115,7 +3247,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -3123,13 +3255,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #8] str r9, [r0, #12] #else @@ -3149,7 +3281,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -3159,19 +3291,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else ldrd r8, r9, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -3183,7 +3315,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else @@ -3191,7 +3323,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #40] str r7, [r0, #44] #else @@ -3200,7 +3332,7 @@ mov r10, r8 mov r11, r9 # Calc new W[10] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #64] ldr r5, [sp, #68] #else @@ -3221,13 +3353,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #80] ldr r5, [sp, #84] #else ldrd r4, r5, [sp, #80] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #24] ldr r9, [sp, #28] #else @@ -3237,13 +3369,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #80] str r5, [sp, #84] #else strd r4, r5, [sp, #80] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #88] ldr r5, [sp, #92] #else @@ -3264,7 +3396,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #80] ldr r5, [sp, #84] #else @@ -3272,14 +3404,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #80] str r5, [sp, #84] #else strd r4, r5, [sp, #80] #endif # Round 11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -3299,7 +3431,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -3309,25 +3441,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else strd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -3339,13 +3471,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #88] ldr r9, [sp, #92] #else @@ -3353,7 +3485,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #88] ldr r7, [r3, #92] #else @@ -3361,7 +3493,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -3369,7 +3501,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -3377,13 +3509,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0] str r9, [r0, #4] #else @@ -3403,7 +3535,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -3413,19 +3545,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else ldrd r8, r9, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -3437,7 +3569,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else @@ -3445,7 +3577,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #32] str r7, [r0, #36] #else @@ -3454,7 +3586,7 @@ mov r10, r8 mov r11, r9 # Calc new W[11] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #72] ldr r5, [sp, #76] #else @@ -3475,13 +3607,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #88] ldr r5, [sp, #92] #else ldrd r4, r5, [sp, #88] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #32] ldr r9, [sp, #36] #else @@ -3491,13 +3623,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #88] str r5, [sp, #92] #else strd r4, r5, [sp, #88] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #96] ldr r5, [sp, #100] #else @@ -3518,7 +3650,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #88] ldr r5, [sp, #92] #else @@ -3526,14 +3658,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #88] str r5, [sp, #92] #else strd r4, r5, [sp, #88] #endif # Round 12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -3553,7 +3685,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -3563,25 +3695,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else strd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -3593,13 +3725,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #96] ldr r9, [sp, #100] #else @@ -3607,7 +3739,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #96] ldr r7, [r3, #100] #else @@ -3615,7 +3747,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -3623,7 +3755,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -3631,13 +3763,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #56] str r9, [r0, #60] #else @@ -3657,7 +3789,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -3667,19 +3799,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else ldrd r8, r9, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -3691,7 +3823,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else @@ -3699,7 +3831,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #24] str r7, [r0, #28] #else @@ -3708,7 +3840,7 @@ mov r10, r8 mov r11, r9 # Calc new W[12] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #80] ldr r5, [sp, #84] #else @@ -3729,13 +3861,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #96] ldr r5, [sp, #100] #else ldrd r4, r5, [sp, #96] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #40] ldr r9, [sp, #44] #else @@ -3745,13 +3877,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #96] str r5, [sp, #100] #else strd r4, r5, [sp, #96] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #104] ldr r5, [sp, #108] #else @@ -3772,7 +3904,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #96] ldr r5, [sp, #100] #else @@ -3780,14 +3912,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #96] str r5, [sp, #100] #else strd r4, r5, [sp, #96] #endif # Round 13 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -3807,7 +3939,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -3817,25 +3949,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else strd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -3847,13 +3979,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #104] ldr r9, [sp, #108] #else @@ -3861,7 +3993,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #104] ldr r7, [r3, #108] #else @@ -3869,7 +4001,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -3877,7 +4009,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -3885,13 +4017,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #48] str r9, [r0, #52] #else @@ -3911,7 +4043,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -3921,19 +4053,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else ldrd r8, r9, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -3945,7 +4077,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else @@ -3953,7 +4085,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #16] str r7, [r0, #20] #else @@ -3962,7 +4094,7 @@ mov r10, r8 mov r11, r9 # Calc new W[13] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #88] ldr r5, [sp, #92] #else @@ -3983,13 +4115,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #104] ldr r5, [sp, #108] #else ldrd r4, r5, [sp, #104] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #48] ldr r9, [sp, #52] #else @@ -3999,13 +4131,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #104] str r5, [sp, #108] #else strd r4, r5, [sp, #104] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #112] ldr r5, [sp, #116] #else @@ -4026,7 +4158,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #104] ldr r5, [sp, #108] #else @@ -4034,14 +4166,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #104] str r5, [sp, #108] #else strd r4, r5, [sp, #104] #endif # Round 14 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -4061,7 +4193,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -4071,25 +4203,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else strd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -4101,13 +4233,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #112] ldr r9, [sp, #116] #else @@ -4115,7 +4247,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #112] ldr r7, [r3, #116] #else @@ -4123,7 +4255,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -4131,7 +4263,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -4139,13 +4271,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #40] str r9, [r0, #44] #else @@ -4165,7 +4297,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -4175,19 +4307,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else ldrd r8, r9, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -4199,7 +4331,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else @@ -4207,7 +4339,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #8] str r7, [r0, #12] #else @@ -4216,7 +4348,7 @@ mov r10, r8 mov r11, r9 # Calc new W[14] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #96] ldr r5, [sp, #100] #else @@ -4237,13 +4369,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #112] ldr r5, [sp, #116] #else ldrd r4, r5, [sp, #112] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #56] ldr r9, [sp, #60] #else @@ -4253,13 +4385,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #112] str r5, [sp, #116] #else strd r4, r5, [sp, #112] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #120] ldr r5, [sp, #124] #else @@ -4280,7 +4412,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #112] ldr r5, [sp, #116] #else @@ -4288,14 +4420,14 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #112] str r5, [sp, #116] #else strd r4, r5, [sp, #112] #endif # Round 15 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -4315,7 +4447,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -4325,25 +4457,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else strd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -4355,13 +4487,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #120] ldr r9, [sp, #124] #else @@ -4369,7 +4501,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #120] ldr r7, [r3, #124] #else @@ -4377,7 +4509,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -4385,7 +4517,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -4393,13 +4525,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #32] str r9, [r0, #36] #else @@ -4419,7 +4551,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -4429,19 +4561,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else ldrd r8, r9, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -4453,7 +4585,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else @@ -4461,7 +4593,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0] str r7, [r0, #4] #else @@ -4470,7 +4602,7 @@ mov r10, r8 mov r11, r9 # Calc new W[15] -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #104] ldr r5, [sp, #108] #else @@ -4491,13 +4623,13 @@ orr r8, r8, r5, lsl #26 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #120] ldr r5, [sp, #124] #else ldrd r4, r5, [sp, #120] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #64] ldr r9, [sp, #68] #else @@ -4507,13 +4639,13 @@ adc r5, r5, r7 adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #120] str r5, [sp, #124] #else strd r4, r5, [sp, #120] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp] ldr r5, [sp, #4] #else @@ -4534,7 +4666,7 @@ orr r8, r8, r5, lsl #25 eor r7, r7, r9 eor r6, r6, r8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [sp, #120] ldr r5, [sp, #124] #else @@ -4542,7 +4674,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #120] str r5, [sp, #124] #else @@ -4552,7 +4684,7 @@ subs r12, r12, #1 bne L_SHA512_transform_len_start # Round 0 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -4572,7 +4704,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -4582,25 +4714,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else strd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -4612,13 +4744,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp] ldr r9, [sp, #4] #else @@ -4626,7 +4758,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3] ldr r7, [r3, #4] #else @@ -4634,7 +4766,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -4642,7 +4774,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -4650,13 +4782,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #24] str r9, [r0, #28] #else @@ -4676,7 +4808,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -4686,19 +4818,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else ldrd r8, r9, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -4710,7 +4842,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else @@ -4718,7 +4850,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #56] str r7, [r0, #60] #else @@ -4727,7 +4859,7 @@ mov r10, r8 mov r11, r9 # Round 1 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -4747,7 +4879,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -4757,25 +4889,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else strd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -4787,13 +4919,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #8] ldr r9, [sp, #12] #else @@ -4801,7 +4933,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #8] ldr r7, [r3, #12] #else @@ -4809,7 +4941,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -4817,7 +4949,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -4825,13 +4957,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #16] str r9, [r0, #20] #else @@ -4851,7 +4983,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -4861,19 +4993,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else ldrd r8, r9, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -4885,7 +5017,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else @@ -4893,7 +5025,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #48] str r7, [r0, #52] #else @@ -4902,7 +5034,7 @@ mov r10, r8 mov r11, r9 # Round 2 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -4922,7 +5054,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -4932,25 +5064,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else strd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -4962,13 +5094,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #16] ldr r9, [sp, #20] #else @@ -4976,7 +5108,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #16] ldr r7, [r3, #20] #else @@ -4984,7 +5116,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -4992,7 +5124,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -5000,13 +5132,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #8] str r9, [r0, #12] #else @@ -5026,7 +5158,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -5036,19 +5168,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else ldrd r8, r9, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -5060,7 +5192,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else @@ -5068,7 +5200,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #40] str r7, [r0, #44] #else @@ -5077,7 +5209,7 @@ mov r10, r8 mov r11, r9 # Round 3 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -5097,7 +5229,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -5107,25 +5239,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else strd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -5137,13 +5269,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #24] ldr r9, [sp, #28] #else @@ -5151,7 +5283,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #24] ldr r7, [r3, #28] #else @@ -5159,7 +5291,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -5167,7 +5299,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -5175,13 +5307,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0] str r9, [r0, #4] #else @@ -5201,7 +5333,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -5211,19 +5343,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else ldrd r8, r9, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -5235,7 +5367,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else @@ -5243,7 +5375,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #32] str r7, [r0, #36] #else @@ -5252,7 +5384,7 @@ mov r10, r8 mov r11, r9 # Round 4 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -5272,7 +5404,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -5282,25 +5414,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else strd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -5312,13 +5444,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #32] ldr r9, [sp, #36] #else @@ -5326,7 +5458,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #32] ldr r7, [r3, #36] #else @@ -5334,7 +5466,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -5342,7 +5474,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -5350,13 +5482,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #56] str r9, [r0, #60] #else @@ -5376,7 +5508,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -5386,19 +5518,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else ldrd r8, r9, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -5410,7 +5542,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else @@ -5418,7 +5550,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #24] str r7, [r0, #28] #else @@ -5427,7 +5559,7 @@ mov r10, r8 mov r11, r9 # Round 5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -5447,7 +5579,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -5457,25 +5589,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else strd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -5487,13 +5619,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #40] ldr r9, [sp, #44] #else @@ -5501,7 +5633,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #40] ldr r7, [r3, #44] #else @@ -5509,7 +5641,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -5517,7 +5649,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -5525,13 +5657,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #48] str r9, [r0, #52] #else @@ -5551,7 +5683,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -5561,19 +5693,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else ldrd r8, r9, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -5585,7 +5717,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else @@ -5593,7 +5725,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #16] str r7, [r0, #20] #else @@ -5602,7 +5734,7 @@ mov r10, r8 mov r11, r9 # Round 6 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -5622,7 +5754,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -5632,25 +5764,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else strd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -5662,13 +5794,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #48] ldr r9, [sp, #52] #else @@ -5676,7 +5808,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #48] ldr r7, [r3, #52] #else @@ -5684,7 +5816,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -5692,7 +5824,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -5700,13 +5832,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #40] str r9, [r0, #44] #else @@ -5726,7 +5858,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -5736,19 +5868,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else ldrd r8, r9, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -5760,7 +5892,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else @@ -5768,7 +5900,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #8] str r7, [r0, #12] #else @@ -5777,7 +5909,7 @@ mov r10, r8 mov r11, r9 # Round 7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -5797,7 +5929,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -5807,25 +5939,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else strd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -5837,13 +5969,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #56] ldr r9, [sp, #60] #else @@ -5851,7 +5983,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #56] ldr r7, [r3, #60] #else @@ -5859,7 +5991,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -5867,7 +5999,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -5875,13 +6007,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #32] str r9, [r0, #36] #else @@ -5901,7 +6033,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -5911,19 +6043,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else ldrd r8, r9, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -5935,7 +6067,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else @@ -5943,7 +6075,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0] str r7, [r0, #4] #else @@ -5952,7 +6084,7 @@ mov r10, r8 mov r11, r9 # Round 8 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -5972,7 +6104,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -5982,25 +6114,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else strd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -6012,13 +6144,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #64] ldr r9, [sp, #68] #else @@ -6026,7 +6158,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #64] ldr r7, [r3, #68] #else @@ -6034,7 +6166,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -6042,7 +6174,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -6050,13 +6182,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #24] str r9, [r0, #28] #else @@ -6076,7 +6208,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -6086,19 +6218,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else ldrd r8, r9, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #56] str r5, [r0, #60] #else @@ -6110,7 +6242,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else @@ -6118,7 +6250,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #56] str r7, [r0, #60] #else @@ -6127,7 +6259,7 @@ mov r10, r8 mov r11, r9 # Round 9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -6147,7 +6279,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -6157,25 +6289,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else strd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -6187,13 +6319,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #72] ldr r9, [sp, #76] #else @@ -6201,7 +6333,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #72] ldr r7, [r3, #76] #else @@ -6209,7 +6341,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -6217,7 +6349,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -6225,13 +6357,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #16] str r9, [r0, #20] #else @@ -6251,7 +6383,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -6261,19 +6393,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else ldrd r8, r9, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else @@ -6285,7 +6417,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else @@ -6293,7 +6425,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #48] str r7, [r0, #52] #else @@ -6302,7 +6434,7 @@ mov r10, r8 mov r11, r9 # Round 10 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -6322,7 +6454,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -6332,25 +6464,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else strd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -6362,13 +6494,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #80] ldr r9, [sp, #84] #else @@ -6376,7 +6508,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #80] ldr r7, [r3, #84] #else @@ -6384,7 +6516,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -6392,7 +6524,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -6400,13 +6532,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #8] str r9, [r0, #12] #else @@ -6426,7 +6558,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -6436,19 +6568,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else ldrd r8, r9, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #40] str r5, [r0, #44] #else @@ -6460,7 +6592,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else @@ -6468,7 +6600,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #40] str r7, [r0, #44] #else @@ -6477,7 +6609,7 @@ mov r10, r8 mov r11, r9 # Round 11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -6497,7 +6629,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -6507,25 +6639,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else strd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else @@ -6537,13 +6669,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #88] ldr r9, [sp, #92] #else @@ -6551,7 +6683,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #88] ldr r7, [r3, #92] #else @@ -6559,7 +6691,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -6567,7 +6699,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -6575,13 +6707,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0] str r9, [r0, #4] #else @@ -6601,7 +6733,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else @@ -6611,19 +6743,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else ldrd r8, r9, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else @@ -6635,7 +6767,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else @@ -6643,7 +6775,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #32] str r7, [r0, #36] #else @@ -6652,7 +6784,7 @@ mov r10, r8 mov r11, r9 # Round 12 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -6672,7 +6804,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -6682,25 +6814,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else strd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else @@ -6712,13 +6844,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #96] ldr r9, [sp, #100] #else @@ -6726,7 +6858,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #96] ldr r7, [r3, #100] #else @@ -6734,7 +6866,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -6742,7 +6874,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -6750,13 +6882,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #56] str r9, [r0, #60] #else @@ -6776,7 +6908,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else @@ -6786,19 +6918,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else ldrd r8, r9, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #24] str r5, [r0, #28] #else @@ -6810,7 +6942,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else @@ -6818,7 +6950,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #24] str r7, [r0, #28] #else @@ -6827,7 +6959,7 @@ mov r10, r8 mov r11, r9 # Round 13 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else @@ -6847,7 +6979,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -6857,25 +6989,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else strd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #56] ldr r5, [r0, #60] #else ldrd r4, r5, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else ldrd r6, r7, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else @@ -6887,13 +7019,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #104] ldr r9, [sp, #108] #else @@ -6901,7 +7033,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #104] ldr r7, [r3, #108] #else @@ -6909,7 +7041,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #48] ldr r9, [r0, #52] #else @@ -6917,7 +7049,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -6925,13 +7057,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #24] ldr r5, [r0, #28] #else ldrd r4, r5, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #48] str r9, [r0, #52] #else @@ -6951,7 +7083,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else @@ -6961,19 +7093,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #24] ldr r9, [r0, #28] #else ldrd r8, r9, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #32] ldr r7, [r0, #36] #else ldrd r6, r7, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else @@ -6985,7 +7117,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else @@ -6993,7 +7125,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #16] str r7, [r0, #20] #else @@ -7002,7 +7134,7 @@ mov r10, r8 mov r11, r9 # Round 14 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else @@ -7022,7 +7154,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -7032,25 +7164,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else strd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0] ldr r9, [r0, #4] #else @@ -7062,13 +7194,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #112] ldr r9, [sp, #116] #else @@ -7076,7 +7208,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #112] ldr r7, [r3, #116] #else @@ -7084,7 +7216,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #40] ldr r9, [r0, #44] #else @@ -7092,7 +7224,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -7100,13 +7232,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #40] str r9, [r0, #44] #else @@ -7126,7 +7258,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else @@ -7136,19 +7268,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #16] ldr r9, [r0, #20] #else ldrd r8, r9, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #8] str r5, [r0, #12] #else @@ -7160,7 +7292,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else @@ -7168,7 +7300,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #8] str r7, [r0, #12] #else @@ -7177,7 +7309,7 @@ mov r10, r8 mov r11, r9 # Round 15 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else @@ -7197,7 +7329,7 @@ lsls r9, r5, #23 orr r9, r9, r4, lsr #9 orr r8, r8, r5, lsr #9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -7207,25 +7339,25 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else strd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #40] ldr r5, [r0, #44] #else ldrd r4, r5, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #48] ldr r7, [r0, #52] #else ldrd r6, r7, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #56] ldr r9, [r0, #60] #else @@ -7237,13 +7369,13 @@ and r7, r7, r5 eor r6, r6, r8 eor r7, r7, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #120] ldr r9, [sp, #124] #else @@ -7251,7 +7383,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r3, #120] ldr r7, [r3, #124] #else @@ -7259,7 +7391,7 @@ #endif adds r4, r4, r8 adc r5, r5, r9 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #32] ldr r9, [r0, #36] #else @@ -7267,7 +7399,7 @@ #endif adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -7275,13 +7407,13 @@ #endif adds r8, r8, r4 adc r9, r9, r5 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #8] ldr r5, [r0, #12] #else ldrd r4, r5, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r8, [r0, #32] str r9, [r0, #36] #else @@ -7301,7 +7433,7 @@ lsls r9, r5, #25 orr r9, r9, r4, lsr #7 orr r8, r8, r5, lsr #7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else @@ -7311,19 +7443,19 @@ eor r7, r7, r9 adds r4, r4, r6 adc r5, r5, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [r0, #8] ldr r9, [r0, #12] #else ldrd r8, r9, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #16] ldr r7, [r0, #20] #else ldrd r6, r7, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else @@ -7335,7 +7467,7 @@ and r11, r11, r9 eor r10, r10, r6 eor r11, r11, r7 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0] ldr r7, [r0, #4] #else @@ -7343,7 +7475,7 @@ #endif adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0] str r7, [r0, #4] #else @@ -7352,25 +7484,25 @@ mov r10, r8 mov r11, r9 # Add in digest from start -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0] ldr r5, [r0, #4] #else ldrd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #8] ldr r7, [r0, #12] #else ldrd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #128] ldr r9, [sp, #132] #else ldrd r8, r9, [sp, #128] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [sp, #136] ldr r11, [sp, #140] #else @@ -7380,49 +7512,49 @@ adc r5, r5, r9 adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0] str r5, [r0, #4] #else strd r4, r5, [r0] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #8] str r7, [r0, #12] #else strd r6, r7, [r0, #8] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #128] str r5, [sp, #132] #else strd r4, r5, [sp, #128] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #136] str r7, [sp, #140] #else strd r6, r7, [sp, #136] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #16] ldr r5, [r0, #20] #else ldrd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #24] ldr r7, [r0, #28] #else ldrd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #144] ldr r9, [sp, #148] #else ldrd r8, r9, [sp, #144] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [sp, #152] ldr r11, [sp, #156] #else @@ -7432,49 +7564,49 @@ adc r5, r5, r9 adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #16] str r5, [r0, #20] #else strd r4, r5, [r0, #16] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #24] str r7, [r0, #28] #else strd r6, r7, [r0, #24] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #144] str r5, [sp, #148] #else strd r4, r5, [sp, #144] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #152] str r7, [sp, #156] #else strd r6, r7, [sp, #152] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #32] ldr r5, [r0, #36] #else ldrd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #40] ldr r7, [r0, #44] #else ldrd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #160] ldr r9, [sp, #164] #else ldrd r8, r9, [sp, #160] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [sp, #168] ldr r11, [sp, #172] #else @@ -7484,49 +7616,49 @@ adc r5, r5, r9 adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #32] str r5, [r0, #36] #else strd r4, r5, [r0, #32] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #40] str r7, [r0, #44] #else strd r6, r7, [r0, #40] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #160] str r5, [sp, #164] #else strd r4, r5, [sp, #160] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #168] str r7, [sp, #172] #else strd r6, r7, [sp, #168] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r4, [r0, #48] ldr r5, [r0, #52] #else ldrd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r6, [r0, #56] ldr r7, [r0, #60] #else ldrd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r8, [sp, #176] ldr r9, [sp, #180] #else ldrd r8, r9, [sp, #176] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) ldr r10, [sp, #184] ldr r11, [sp, #188] #else @@ -7536,25 +7668,25 @@ adc r5, r5, r9 adds r6, r6, r10 adc r7, r7, r11 -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [r0, #48] str r5, [r0, #52] #else strd r4, r5, [r0, #48] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [r0, #56] str r7, [r0, #60] #else strd r6, r7, [r0, #56] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r4, [sp, #176] str r5, [sp, #180] #else strd r4, r5, [sp, #176] #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) str r6, [sp, #184] str r7, [sp, #188] #else @@ -7742,6 +7874,7 @@ .type Transform_Sha512_Len, %function Transform_Sha512_Len: vpush {d8-d15} + adr r3, L_SHA512_transform_neon_len_k # Load digest into working vars vldm.64 r0, {d0-d7} # Start of loop processing a block @@ -7778,7 +7911,6 @@ vrev64.8 d30, d30 vrev64.8 d31, d31 #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ - adr r3, L_SHA512_transform_neon_len_k mov r12, #4 # Start of 16 rounds L_SHA512_transform_neon_len_start: @@ -9227,15 +9359,17 @@ #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ vstm.64 r0, {d0-d7} subs r2, r2, #0x80 + sub r3, r3, #0x280 bne L_SHA512_transform_neon_len_begin vpop {d8-d15} bx lr .size Transform_Sha512_Len,.-Transform_Sha512_Len #endif /* !WOLFSSL_ARMASM_NO_NEON */ #endif /* WOLFSSL_SHA512 */ -#endif /* !__aarch64__ */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ #endif /* WOLFSSL_ARMASM */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,203 +28,178 @@ #include #endif /* HAVE_CONFIG_H */ #include +#include #ifdef WOLFSSL_ARMASM -#ifndef __aarch64__ +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) #include #ifdef HAVE_CONFIG_H #include #endif /* HAVE_CONFIG_H */ #include +#include +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ #ifdef WOLFSSL_SHA512 #include #ifdef WOLFSSL_ARMASM_NO_NEON static const uint64_t L_SHA512_transform_len_k[] = { - 0x428a2f98d728ae22UL, - 0x7137449123ef65cdUL, - 0xb5c0fbcfec4d3b2fUL, - 0xe9b5dba58189dbbcUL, - 0x3956c25bf348b538UL, - 0x59f111f1b605d019UL, - 0x923f82a4af194f9bUL, - 0xab1c5ed5da6d8118UL, - 0xd807aa98a3030242UL, - 0x12835b0145706fbeUL, - 0x243185be4ee4b28cUL, - 0x550c7dc3d5ffb4e2UL, - 0x72be5d74f27b896fUL, - 0x80deb1fe3b1696b1UL, - 0x9bdc06a725c71235UL, - 0xc19bf174cf692694UL, - 0xe49b69c19ef14ad2UL, - 0xefbe4786384f25e3UL, - 0xfc19dc68b8cd5b5UL, - 0x240ca1cc77ac9c65UL, - 0x2de92c6f592b0275UL, - 0x4a7484aa6ea6e483UL, - 0x5cb0a9dcbd41fbd4UL, - 0x76f988da831153b5UL, - 0x983e5152ee66dfabUL, - 0xa831c66d2db43210UL, - 0xb00327c898fb213fUL, - 0xbf597fc7beef0ee4UL, - 0xc6e00bf33da88fc2UL, - 0xd5a79147930aa725UL, - 0x6ca6351e003826fUL, - 0x142929670a0e6e70UL, - 0x27b70a8546d22ffcUL, - 0x2e1b21385c26c926UL, - 0x4d2c6dfc5ac42aedUL, - 0x53380d139d95b3dfUL, - 0x650a73548baf63deUL, - 0x766a0abb3c77b2a8UL, - 0x81c2c92e47edaee6UL, - 0x92722c851482353bUL, - 0xa2bfe8a14cf10364UL, - 0xa81a664bbc423001UL, - 0xc24b8b70d0f89791UL, - 0xc76c51a30654be30UL, - 0xd192e819d6ef5218UL, - 0xd69906245565a910UL, - 0xf40e35855771202aUL, - 0x106aa07032bbd1b8UL, - 0x19a4c116b8d2d0c8UL, - 0x1e376c085141ab53UL, - 0x2748774cdf8eeb99UL, - 0x34b0bcb5e19b48a8UL, - 0x391c0cb3c5c95a63UL, - 0x4ed8aa4ae3418acbUL, - 0x5b9cca4f7763e373UL, - 0x682e6ff3d6b2b8a3UL, - 0x748f82ee5defb2fcUL, - 0x78a5636f43172f60UL, - 0x84c87814a1f0ab72UL, - 0x8cc702081a6439ecUL, - 0x90befffa23631e28UL, - 0xa4506cebde82bde9UL, - 0xbef9a3f7b2c67915UL, - 0xc67178f2e372532bUL, - 0xca273eceea26619cUL, - 0xd186b8c721c0c207UL, - 0xeada7dd6cde0eb1eUL, - 0xf57d4f7fee6ed178UL, - 0x6f067aa72176fbaUL, - 0xa637dc5a2c898a6UL, - 0x113f9804bef90daeUL, - 0x1b710b35131c471bUL, - 0x28db77f523047d84UL, - 0x32caab7b40c72493UL, - 0x3c9ebe0a15c9bebcUL, - 0x431d67c49c100d4cUL, - 0x4cc5d4becb3e42b6UL, - 0x597f299cfc657e2aUL, - 0x5fcb6fab3ad6faecUL, - 0x6c44198c4a475817UL, + 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, + 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, + 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, + 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, + 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, + 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, + 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, + 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL, + 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL, + 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL, + 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL, + 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL, + 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL, + 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL, + 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL, + 0x06ca6351e003826fUL, 0x142929670a0e6e70UL, + 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL, + 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL, + 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL, + 0x81c2c92e47edaee6UL, 0x92722c851482353bUL, + 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL, + 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL, + 0xd192e819d6ef5218UL, 0xd69906245565a910UL, + 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL, + 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL, + 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL, + 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL, + 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL, + 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL, + 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL, + 0x90befffa23631e28UL, 0xa4506cebde82bde9UL, + 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL, + 0xca273eceea26619cUL, 0xd186b8c721c0c207UL, + 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL, + 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL, + 0x113f9804bef90daeUL, 0x1b710b35131c471bUL, + 0x28db77f523047d84UL, 0x32caab7b40c72493UL, + 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL, + 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL, + 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL, }; -void Transform_Sha512_Len(wc_Sha512* sha512_p, const byte* data_p, word32 len_p); +void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len); void Transform_Sha512_Len(wc_Sha512* sha512_p, const byte* data_p, word32 len_p) { - register wc_Sha512* sha512 asm ("r0") = sha512_p; - register const byte* data asm ("r1") = data_p; - register word32 len asm ("r2") = len_p; + register wc_Sha512* sha512 asm ("r0") = (wc_Sha512*)sha512_p; + register const byte* data asm ("r1") = (const byte*)data_p; + register word32 len asm ("r2") = (word32)len_p; + register uint64_t* L_SHA512_transform_len_k_c asm ("r3") = (uint64_t*)&L_SHA512_transform_len_k; __asm__ __volatile__ ( "sub sp, sp, #0xc0\n\t" - "mov r3, %[L_SHA512_transform_len_k]\n\t" /* Copy digest to add in at end */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else "ldrd r8, r9, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[sha512], #24]\n\t" "ldr r11, [%[sha512], #28]\n\t" #else "ldrd r10, r11, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #128]\n\t" "str r5, [sp, #132]\n\t" #else "strd r4, r5, [sp, #128]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #136]\n\t" "str r7, [sp, #140]\n\t" #else "strd r6, r7, [sp, #136]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [sp, #144]\n\t" "str r9, [sp, #148]\n\t" #else "strd r8, r9, [sp, #144]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r10, [sp, #152]\n\t" "str r11, [sp, #156]\n\t" #else "strd r10, r11, [sp, #152]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else "ldrd r8, r9, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[sha512], #56]\n\t" "ldr r11, [%[sha512], #60]\n\t" #else "ldrd r10, r11, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #160]\n\t" "str r5, [sp, #164]\n\t" #else "strd r4, r5, [sp, #160]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #168]\n\t" "str r7, [sp, #172]\n\t" #else "strd r6, r7, [sp, #168]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [sp, #176]\n\t" "str r9, [sp, #180]\n\t" #else "strd r8, r9, [sp, #176]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r10, [sp, #184]\n\t" "str r11, [sp, #188]\n\t" #else @@ -233,31 +208,209 @@ /* Start of loop processing a block */ "\n" "L_SHA512_transform_len_begin_%=: \n\t" - /* Load, Reverse and Store W */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + /* Load, Reverse and Store W - 64 bytes */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 6) "ldr r4, [%[data]]\n\t" "ldr r5, [%[data], #4]\n\t" -#else - "ldrd r4, r5, [%[data]]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r6, [%[data], #8]\n\t" "ldr r7, [%[data], #12]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp]\n\t" + "str r4, [sp, #4]\n\t" + "str r7, [sp, #8]\n\t" + "str r6, [sp, #12]\n\t" + "ldr r4, [%[data], #16]\n\t" + "ldr r5, [%[data], #20]\n\t" + "ldr r6, [%[data], #24]\n\t" + "ldr r7, [%[data], #28]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp, #16]\n\t" + "str r4, [sp, #20]\n\t" + "str r7, [sp, #24]\n\t" + "str r6, [sp, #28]\n\t" + "ldr r4, [%[data], #32]\n\t" + "ldr r5, [%[data], #36]\n\t" + "ldr r6, [%[data], #40]\n\t" + "ldr r7, [%[data], #44]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp, #32]\n\t" + "str r4, [sp, #36]\n\t" + "str r7, [sp, #40]\n\t" + "str r6, [sp, #44]\n\t" + "ldr r4, [%[data], #48]\n\t" + "ldr r5, [%[data], #52]\n\t" + "ldr r6, [%[data], #56]\n\t" + "ldr r7, [%[data], #60]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp, #48]\n\t" + "str r4, [sp, #52]\n\t" + "str r7, [sp, #56]\n\t" + "str r6, [sp, #60]\n\t" + "ldr r4, [%[data], #64]\n\t" + "ldr r5, [%[data], #68]\n\t" + "ldr r6, [%[data], #72]\n\t" + "ldr r7, [%[data], #76]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp, #64]\n\t" + "str r4, [sp, #68]\n\t" + "str r7, [sp, #72]\n\t" + "str r6, [sp, #76]\n\t" + "ldr r4, [%[data], #80]\n\t" + "ldr r5, [%[data], #84]\n\t" + "ldr r6, [%[data], #88]\n\t" + "ldr r7, [%[data], #92]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp, #80]\n\t" + "str r4, [sp, #84]\n\t" + "str r7, [sp, #88]\n\t" + "str r6, [sp, #92]\n\t" + "ldr r4, [%[data], #96]\n\t" + "ldr r5, [%[data], #100]\n\t" + "ldr r6, [%[data], #104]\n\t" + "ldr r7, [%[data], #108]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp, #96]\n\t" + "str r4, [sp, #100]\n\t" + "str r7, [sp, #104]\n\t" + "str r6, [sp, #108]\n\t" + "ldr r4, [%[data], #112]\n\t" + "ldr r5, [%[data], #116]\n\t" + "ldr r6, [%[data], #120]\n\t" + "ldr r7, [%[data], #124]\n\t" + "eor r8, r4, r4, ror #16\n\t" + "eor r9, r5, r5, ror #16\n\t" + "eor r10, r6, r6, ror #16\n\t" + "eor r11, r7, r7, ror #16\n\t" + "bic r8, r8, #0xff0000\n\t" + "bic r9, r9, #0xff0000\n\t" + "bic r10, r10, #0xff0000\n\t" + "bic r11, r11, #0xff0000\n\t" + "ror r4, r4, #8\n\t" + "ror r5, r5, #8\n\t" + "ror r6, r6, #8\n\t" + "ror r7, r7, #8\n\t" + "eor r4, r4, r8, lsr #8\n\t" + "eor r5, r5, r9, lsr #8\n\t" + "eor r6, r6, r10, lsr #8\n\t" + "eor r7, r7, r11, lsr #8\n\t" + "str r5, [sp, #112]\n\t" + "str r4, [sp, #116]\n\t" + "str r7, [sp, #120]\n\t" + "str r6, [sp, #124]\n\t" #else - "ldrd r6, r7, [%[data], #8]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + "ldr r4, [%[data]]\n\t" + "ldr r5, [%[data], #4]\n\t" + "ldr r6, [%[data], #8]\n\t" + "ldr r7, [%[data], #12]\n\t" "ldr r8, [%[data], #16]\n\t" "ldr r9, [%[data], #20]\n\t" -#else - "ldrd r8, r9, [%[data], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r10, [%[data], #24]\n\t" "ldr r11, [%[data], #28]\n\t" -#else - "ldrd r10, r11, [%[data], #24]\n\t" -#endif "rev r4, r4\n\t" "rev r5, r5\n\t" "rev r6, r6\n\t" @@ -274,30 +427,14 @@ "str r8, [sp, #20]\n\t" "str r11, [sp, #24]\n\t" "str r10, [sp, #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r4, [%[data], #32]\n\t" "ldr r5, [%[data], #36]\n\t" -#else - "ldrd r4, r5, [%[data], #32]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r6, [%[data], #40]\n\t" "ldr r7, [%[data], #44]\n\t" -#else - "ldrd r6, r7, [%[data], #40]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r8, [%[data], #48]\n\t" "ldr r9, [%[data], #52]\n\t" -#else - "ldrd r8, r9, [%[data], #48]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r10, [%[data], #56]\n\t" "ldr r11, [%[data], #60]\n\t" -#else - "ldrd r10, r11, [%[data], #56]\n\t" -#endif "rev r4, r4\n\t" "rev r5, r5\n\t" "rev r6, r6\n\t" @@ -314,30 +451,14 @@ "str r8, [sp, #52]\n\t" "str r11, [sp, #56]\n\t" "str r10, [sp, #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r4, [%[data], #64]\n\t" "ldr r5, [%[data], #68]\n\t" -#else - "ldrd r4, r5, [%[data], #64]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r6, [%[data], #72]\n\t" "ldr r7, [%[data], #76]\n\t" -#else - "ldrd r6, r7, [%[data], #72]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r8, [%[data], #80]\n\t" "ldr r9, [%[data], #84]\n\t" -#else - "ldrd r8, r9, [%[data], #80]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r10, [%[data], #88]\n\t" "ldr r11, [%[data], #92]\n\t" -#else - "ldrd r10, r11, [%[data], #88]\n\t" -#endif "rev r4, r4\n\t" "rev r5, r5\n\t" "rev r6, r6\n\t" @@ -354,30 +475,14 @@ "str r8, [sp, #84]\n\t" "str r11, [sp, #88]\n\t" "str r10, [sp, #92]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r4, [%[data], #96]\n\t" "ldr r5, [%[data], #100]\n\t" -#else - "ldrd r4, r5, [%[data], #96]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r6, [%[data], #104]\n\t" "ldr r7, [%[data], #108]\n\t" -#else - "ldrd r6, r7, [%[data], #104]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r8, [%[data], #112]\n\t" "ldr r9, [%[data], #116]\n\t" -#else - "ldrd r8, r9, [%[data], #112]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) "ldr r10, [%[data], #120]\n\t" "ldr r11, [%[data], #124]\n\t" -#else - "ldrd r10, r11, [%[data], #120]\n\t" -#endif "rev r4, r4\n\t" "rev r5, r5\n\t" "rev r6, r6\n\t" @@ -394,14 +499,15 @@ "str r8, [sp, #116]\n\t" "str r11, [sp, #120]\n\t" "str r10, [sp, #124]\n\t" +#endif /* WOLFSSL_ARM_ARCH && WOLFSSL_ARM_ARCH < 6 */ /* Pre-calc: b ^ c */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [%[sha512], #8]\n\t" "ldr r11, [%[sha512], #12]\n\t" #else "ldrd r10, r11, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -414,7 +520,7 @@ "\n" "L_SHA512_transform_len_start_%=: \n\t" /* Round 0 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -434,7 +540,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -444,25 +550,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else "strd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -474,13 +580,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp]\n\t" "ldr r9, [sp, #4]\n\t" #else @@ -488,7 +594,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3]\n\t" "ldr r7, [r3, #4]\n\t" #else @@ -496,7 +602,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -504,7 +610,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -512,13 +618,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #24]\n\t" "str r9, [%[sha512], #28]\n\t" #else @@ -538,7 +644,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -548,19 +654,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else "ldrd r8, r9, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -572,7 +678,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else @@ -580,7 +686,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #56]\n\t" "str r7, [%[sha512], #60]\n\t" #else @@ -589,7 +695,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[0] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #112]\n\t" "ldr r5, [sp, #116]\n\t" #else @@ -610,13 +716,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp]\n\t" "ldr r5, [sp, #4]\n\t" #else "ldrd r4, r5, [sp]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #72]\n\t" "ldr r9, [sp, #76]\n\t" #else @@ -626,13 +732,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp]\n\t" "str r5, [sp, #4]\n\t" #else "strd r4, r5, [sp]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #8]\n\t" "ldr r5, [sp, #12]\n\t" #else @@ -653,7 +759,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp]\n\t" "ldr r5, [sp, #4]\n\t" #else @@ -661,14 +767,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp]\n\t" "str r5, [sp, #4]\n\t" #else "strd r4, r5, [sp]\n\t" #endif /* Round 1 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -688,7 +794,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -698,25 +804,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else "strd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -728,13 +834,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #8]\n\t" "ldr r9, [sp, #12]\n\t" #else @@ -742,7 +848,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #8]\n\t" "ldr r7, [r3, #12]\n\t" #else @@ -750,7 +856,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -758,7 +864,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -766,13 +872,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #16]\n\t" "str r9, [%[sha512], #20]\n\t" #else @@ -792,7 +898,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -802,19 +908,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else "ldrd r8, r9, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -826,7 +932,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else @@ -834,7 +940,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #48]\n\t" "str r7, [%[sha512], #52]\n\t" #else @@ -843,7 +949,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[1] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #120]\n\t" "ldr r5, [sp, #124]\n\t" #else @@ -864,13 +970,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #8]\n\t" "ldr r5, [sp, #12]\n\t" #else "ldrd r4, r5, [sp, #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #80]\n\t" "ldr r9, [sp, #84]\n\t" #else @@ -880,13 +986,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #8]\n\t" "str r5, [sp, #12]\n\t" #else "strd r4, r5, [sp, #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #16]\n\t" "ldr r5, [sp, #20]\n\t" #else @@ -907,7 +1013,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #8]\n\t" "ldr r5, [sp, #12]\n\t" #else @@ -915,14 +1021,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #8]\n\t" "str r5, [sp, #12]\n\t" #else "strd r4, r5, [sp, #8]\n\t" #endif /* Round 2 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -942,7 +1048,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -952,25 +1058,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else "strd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -982,13 +1088,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #16]\n\t" "ldr r9, [sp, #20]\n\t" #else @@ -996,7 +1102,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #16]\n\t" "ldr r7, [r3, #20]\n\t" #else @@ -1004,7 +1110,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -1012,7 +1118,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -1020,13 +1126,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #8]\n\t" "str r9, [%[sha512], #12]\n\t" #else @@ -1046,7 +1152,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -1056,19 +1162,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else "ldrd r8, r9, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -1080,7 +1186,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else @@ -1088,7 +1194,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #40]\n\t" "str r7, [%[sha512], #44]\n\t" #else @@ -1097,7 +1203,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[2] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp]\n\t" "ldr r5, [sp, #4]\n\t" #else @@ -1118,13 +1224,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #16]\n\t" "ldr r5, [sp, #20]\n\t" #else "ldrd r4, r5, [sp, #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #88]\n\t" "ldr r9, [sp, #92]\n\t" #else @@ -1134,13 +1240,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #16]\n\t" "str r5, [sp, #20]\n\t" #else "strd r4, r5, [sp, #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #24]\n\t" "ldr r5, [sp, #28]\n\t" #else @@ -1161,7 +1267,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #16]\n\t" "ldr r5, [sp, #20]\n\t" #else @@ -1169,14 +1275,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #16]\n\t" "str r5, [sp, #20]\n\t" #else "strd r4, r5, [sp, #16]\n\t" #endif /* Round 3 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -1196,7 +1302,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -1206,25 +1312,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else "strd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -1236,13 +1342,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #24]\n\t" "ldr r9, [sp, #28]\n\t" #else @@ -1250,7 +1356,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #24]\n\t" "ldr r7, [r3, #28]\n\t" #else @@ -1258,7 +1364,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -1266,7 +1372,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -1274,13 +1380,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512]]\n\t" "str r9, [%[sha512], #4]\n\t" #else @@ -1300,7 +1406,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -1310,19 +1416,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else "ldrd r8, r9, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -1334,7 +1440,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else @@ -1342,7 +1448,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #32]\n\t" "str r7, [%[sha512], #36]\n\t" #else @@ -1351,7 +1457,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[3] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #8]\n\t" "ldr r5, [sp, #12]\n\t" #else @@ -1372,13 +1478,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #24]\n\t" "ldr r5, [sp, #28]\n\t" #else "ldrd r4, r5, [sp, #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #96]\n\t" "ldr r9, [sp, #100]\n\t" #else @@ -1388,13 +1494,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #24]\n\t" "str r5, [sp, #28]\n\t" #else "strd r4, r5, [sp, #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #32]\n\t" "ldr r5, [sp, #36]\n\t" #else @@ -1415,7 +1521,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #24]\n\t" "ldr r5, [sp, #28]\n\t" #else @@ -1423,14 +1529,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #24]\n\t" "str r5, [sp, #28]\n\t" #else "strd r4, r5, [sp, #24]\n\t" #endif /* Round 4 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -1450,7 +1556,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -1460,25 +1566,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else "strd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -1490,13 +1596,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #32]\n\t" "ldr r9, [sp, #36]\n\t" #else @@ -1504,7 +1610,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #32]\n\t" "ldr r7, [r3, #36]\n\t" #else @@ -1512,7 +1618,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -1520,7 +1626,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -1528,13 +1634,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #56]\n\t" "str r9, [%[sha512], #60]\n\t" #else @@ -1554,7 +1660,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -1564,19 +1670,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else "ldrd r8, r9, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -1588,7 +1694,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else @@ -1596,7 +1702,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #24]\n\t" "str r7, [%[sha512], #28]\n\t" #else @@ -1605,7 +1711,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[4] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #16]\n\t" "ldr r5, [sp, #20]\n\t" #else @@ -1626,13 +1732,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #32]\n\t" "ldr r5, [sp, #36]\n\t" #else "ldrd r4, r5, [sp, #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #104]\n\t" "ldr r9, [sp, #108]\n\t" #else @@ -1642,13 +1748,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #32]\n\t" "str r5, [sp, #36]\n\t" #else "strd r4, r5, [sp, #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #40]\n\t" "ldr r5, [sp, #44]\n\t" #else @@ -1669,7 +1775,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #32]\n\t" "ldr r5, [sp, #36]\n\t" #else @@ -1677,14 +1783,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #32]\n\t" "str r5, [sp, #36]\n\t" #else "strd r4, r5, [sp, #32]\n\t" #endif /* Round 5 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -1704,7 +1810,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -1714,25 +1820,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else "strd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -1744,13 +1850,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #40]\n\t" "ldr r9, [sp, #44]\n\t" #else @@ -1758,7 +1864,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #40]\n\t" "ldr r7, [r3, #44]\n\t" #else @@ -1766,7 +1872,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -1774,7 +1880,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -1782,13 +1888,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #48]\n\t" "str r9, [%[sha512], #52]\n\t" #else @@ -1808,7 +1914,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -1818,19 +1924,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else "ldrd r8, r9, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -1842,7 +1948,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else @@ -1850,7 +1956,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #16]\n\t" "str r7, [%[sha512], #20]\n\t" #else @@ -1859,7 +1965,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[5] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #24]\n\t" "ldr r5, [sp, #28]\n\t" #else @@ -1880,13 +1986,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #40]\n\t" "ldr r5, [sp, #44]\n\t" #else "ldrd r4, r5, [sp, #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #112]\n\t" "ldr r9, [sp, #116]\n\t" #else @@ -1896,13 +2002,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #40]\n\t" "str r5, [sp, #44]\n\t" #else "strd r4, r5, [sp, #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #48]\n\t" "ldr r5, [sp, #52]\n\t" #else @@ -1923,7 +2029,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #40]\n\t" "ldr r5, [sp, #44]\n\t" #else @@ -1931,14 +2037,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #40]\n\t" "str r5, [sp, #44]\n\t" #else "strd r4, r5, [sp, #40]\n\t" #endif /* Round 6 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -1958,7 +2064,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -1968,25 +2074,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else "strd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -1998,13 +2104,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #48]\n\t" "ldr r9, [sp, #52]\n\t" #else @@ -2012,7 +2118,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #48]\n\t" "ldr r7, [r3, #52]\n\t" #else @@ -2020,7 +2126,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -2028,7 +2134,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -2036,13 +2142,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #40]\n\t" "str r9, [%[sha512], #44]\n\t" #else @@ -2062,7 +2168,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -2072,19 +2178,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else "ldrd r8, r9, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -2096,7 +2202,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else @@ -2104,7 +2210,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #8]\n\t" "str r7, [%[sha512], #12]\n\t" #else @@ -2113,7 +2219,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[6] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #32]\n\t" "ldr r5, [sp, #36]\n\t" #else @@ -2134,13 +2240,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #48]\n\t" "ldr r5, [sp, #52]\n\t" #else "ldrd r4, r5, [sp, #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #120]\n\t" "ldr r9, [sp, #124]\n\t" #else @@ -2150,13 +2256,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #48]\n\t" "str r5, [sp, #52]\n\t" #else "strd r4, r5, [sp, #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #56]\n\t" "ldr r5, [sp, #60]\n\t" #else @@ -2177,7 +2283,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #48]\n\t" "ldr r5, [sp, #52]\n\t" #else @@ -2185,14 +2291,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #48]\n\t" "str r5, [sp, #52]\n\t" #else "strd r4, r5, [sp, #48]\n\t" #endif /* Round 7 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -2212,7 +2318,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -2222,25 +2328,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else "strd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -2252,13 +2358,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #56]\n\t" "ldr r9, [sp, #60]\n\t" #else @@ -2266,7 +2372,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #56]\n\t" "ldr r7, [r3, #60]\n\t" #else @@ -2274,7 +2380,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -2282,7 +2388,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -2290,13 +2396,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #32]\n\t" "str r9, [%[sha512], #36]\n\t" #else @@ -2316,7 +2422,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -2326,19 +2432,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else "ldrd r8, r9, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -2350,7 +2456,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else @@ -2358,7 +2464,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512]]\n\t" "str r7, [%[sha512], #4]\n\t" #else @@ -2367,7 +2473,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[7] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #40]\n\t" "ldr r5, [sp, #44]\n\t" #else @@ -2388,13 +2494,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #56]\n\t" "ldr r5, [sp, #60]\n\t" #else "ldrd r4, r5, [sp, #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp]\n\t" "ldr r9, [sp, #4]\n\t" #else @@ -2404,13 +2510,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #56]\n\t" "str r5, [sp, #60]\n\t" #else "strd r4, r5, [sp, #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #64]\n\t" "ldr r5, [sp, #68]\n\t" #else @@ -2431,7 +2537,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #56]\n\t" "ldr r5, [sp, #60]\n\t" #else @@ -2439,14 +2545,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #56]\n\t" "str r5, [sp, #60]\n\t" #else "strd r4, r5, [sp, #56]\n\t" #endif /* Round 8 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -2466,7 +2572,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -2476,25 +2582,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else "strd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -2506,13 +2612,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #64]\n\t" "ldr r9, [sp, #68]\n\t" #else @@ -2520,7 +2626,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #64]\n\t" "ldr r7, [r3, #68]\n\t" #else @@ -2528,7 +2634,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -2536,7 +2642,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -2544,13 +2650,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #24]\n\t" "str r9, [%[sha512], #28]\n\t" #else @@ -2570,7 +2676,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -2580,19 +2686,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else "ldrd r8, r9, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -2604,7 +2710,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else @@ -2612,7 +2718,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #56]\n\t" "str r7, [%[sha512], #60]\n\t" #else @@ -2621,7 +2727,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[8] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #48]\n\t" "ldr r5, [sp, #52]\n\t" #else @@ -2642,13 +2748,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #64]\n\t" "ldr r5, [sp, #68]\n\t" #else "ldrd r4, r5, [sp, #64]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #8]\n\t" "ldr r9, [sp, #12]\n\t" #else @@ -2658,13 +2764,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #64]\n\t" "str r5, [sp, #68]\n\t" #else "strd r4, r5, [sp, #64]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #72]\n\t" "ldr r5, [sp, #76]\n\t" #else @@ -2685,7 +2791,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #64]\n\t" "ldr r5, [sp, #68]\n\t" #else @@ -2693,14 +2799,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #64]\n\t" "str r5, [sp, #68]\n\t" #else "strd r4, r5, [sp, #64]\n\t" #endif /* Round 9 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -2720,7 +2826,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -2730,25 +2836,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else "strd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -2760,13 +2866,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #72]\n\t" "ldr r9, [sp, #76]\n\t" #else @@ -2774,7 +2880,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #72]\n\t" "ldr r7, [r3, #76]\n\t" #else @@ -2782,7 +2888,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -2790,7 +2896,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -2798,13 +2904,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #16]\n\t" "str r9, [%[sha512], #20]\n\t" #else @@ -2824,7 +2930,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -2834,19 +2940,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else "ldrd r8, r9, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -2858,7 +2964,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else @@ -2866,7 +2972,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #48]\n\t" "str r7, [%[sha512], #52]\n\t" #else @@ -2875,7 +2981,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[9] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #56]\n\t" "ldr r5, [sp, #60]\n\t" #else @@ -2896,13 +3002,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #72]\n\t" "ldr r5, [sp, #76]\n\t" #else "ldrd r4, r5, [sp, #72]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #16]\n\t" "ldr r9, [sp, #20]\n\t" #else @@ -2912,13 +3018,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #72]\n\t" "str r5, [sp, #76]\n\t" #else "strd r4, r5, [sp, #72]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #80]\n\t" "ldr r5, [sp, #84]\n\t" #else @@ -2939,7 +3045,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #72]\n\t" "ldr r5, [sp, #76]\n\t" #else @@ -2947,14 +3053,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #72]\n\t" "str r5, [sp, #76]\n\t" #else "strd r4, r5, [sp, #72]\n\t" #endif /* Round 10 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -2974,7 +3080,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -2984,25 +3090,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else "strd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -3014,13 +3120,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #80]\n\t" "ldr r9, [sp, #84]\n\t" #else @@ -3028,7 +3134,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #80]\n\t" "ldr r7, [r3, #84]\n\t" #else @@ -3036,7 +3142,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -3044,7 +3150,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -3052,13 +3158,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #8]\n\t" "str r9, [%[sha512], #12]\n\t" #else @@ -3078,7 +3184,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -3088,19 +3194,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else "ldrd r8, r9, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -3112,7 +3218,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else @@ -3120,7 +3226,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #40]\n\t" "str r7, [%[sha512], #44]\n\t" #else @@ -3129,7 +3235,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[10] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #64]\n\t" "ldr r5, [sp, #68]\n\t" #else @@ -3150,13 +3256,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #80]\n\t" "ldr r5, [sp, #84]\n\t" #else "ldrd r4, r5, [sp, #80]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #24]\n\t" "ldr r9, [sp, #28]\n\t" #else @@ -3166,13 +3272,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #80]\n\t" "str r5, [sp, #84]\n\t" #else "strd r4, r5, [sp, #80]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #88]\n\t" "ldr r5, [sp, #92]\n\t" #else @@ -3193,7 +3299,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #80]\n\t" "ldr r5, [sp, #84]\n\t" #else @@ -3201,14 +3307,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #80]\n\t" "str r5, [sp, #84]\n\t" #else "strd r4, r5, [sp, #80]\n\t" #endif /* Round 11 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -3228,7 +3334,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -3238,25 +3344,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else "strd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -3268,13 +3374,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #88]\n\t" "ldr r9, [sp, #92]\n\t" #else @@ -3282,7 +3388,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #88]\n\t" "ldr r7, [r3, #92]\n\t" #else @@ -3290,7 +3396,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -3298,7 +3404,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -3306,13 +3412,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512]]\n\t" "str r9, [%[sha512], #4]\n\t" #else @@ -3332,7 +3438,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -3342,19 +3448,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else "ldrd r8, r9, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -3366,7 +3472,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else @@ -3374,7 +3480,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #32]\n\t" "str r7, [%[sha512], #36]\n\t" #else @@ -3383,7 +3489,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[11] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #72]\n\t" "ldr r5, [sp, #76]\n\t" #else @@ -3404,13 +3510,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #88]\n\t" "ldr r5, [sp, #92]\n\t" #else "ldrd r4, r5, [sp, #88]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #32]\n\t" "ldr r9, [sp, #36]\n\t" #else @@ -3420,13 +3526,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #88]\n\t" "str r5, [sp, #92]\n\t" #else "strd r4, r5, [sp, #88]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #96]\n\t" "ldr r5, [sp, #100]\n\t" #else @@ -3447,7 +3553,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #88]\n\t" "ldr r5, [sp, #92]\n\t" #else @@ -3455,14 +3561,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #88]\n\t" "str r5, [sp, #92]\n\t" #else "strd r4, r5, [sp, #88]\n\t" #endif /* Round 12 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -3482,7 +3588,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -3492,25 +3598,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else "strd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -3522,13 +3628,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #96]\n\t" "ldr r9, [sp, #100]\n\t" #else @@ -3536,7 +3642,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #96]\n\t" "ldr r7, [r3, #100]\n\t" #else @@ -3544,7 +3650,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -3552,7 +3658,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -3560,13 +3666,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #56]\n\t" "str r9, [%[sha512], #60]\n\t" #else @@ -3586,7 +3692,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -3596,19 +3702,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else "ldrd r8, r9, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -3620,7 +3726,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else @@ -3628,7 +3734,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #24]\n\t" "str r7, [%[sha512], #28]\n\t" #else @@ -3637,7 +3743,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[12] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #80]\n\t" "ldr r5, [sp, #84]\n\t" #else @@ -3658,13 +3764,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #96]\n\t" "ldr r5, [sp, #100]\n\t" #else "ldrd r4, r5, [sp, #96]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #40]\n\t" "ldr r9, [sp, #44]\n\t" #else @@ -3674,13 +3780,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #96]\n\t" "str r5, [sp, #100]\n\t" #else "strd r4, r5, [sp, #96]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #104]\n\t" "ldr r5, [sp, #108]\n\t" #else @@ -3701,7 +3807,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #96]\n\t" "ldr r5, [sp, #100]\n\t" #else @@ -3709,14 +3815,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #96]\n\t" "str r5, [sp, #100]\n\t" #else "strd r4, r5, [sp, #96]\n\t" #endif /* Round 13 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -3736,7 +3842,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -3746,25 +3852,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else "strd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -3776,13 +3882,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #104]\n\t" "ldr r9, [sp, #108]\n\t" #else @@ -3790,7 +3896,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #104]\n\t" "ldr r7, [r3, #108]\n\t" #else @@ -3798,7 +3904,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -3806,7 +3912,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -3814,13 +3920,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #48]\n\t" "str r9, [%[sha512], #52]\n\t" #else @@ -3840,7 +3946,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -3850,19 +3956,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else "ldrd r8, r9, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -3874,7 +3980,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else @@ -3882,7 +3988,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #16]\n\t" "str r7, [%[sha512], #20]\n\t" #else @@ -3891,7 +3997,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[13] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #88]\n\t" "ldr r5, [sp, #92]\n\t" #else @@ -3912,13 +4018,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #104]\n\t" "ldr r5, [sp, #108]\n\t" #else "ldrd r4, r5, [sp, #104]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #48]\n\t" "ldr r9, [sp, #52]\n\t" #else @@ -3928,13 +4034,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #104]\n\t" "str r5, [sp, #108]\n\t" #else "strd r4, r5, [sp, #104]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #112]\n\t" "ldr r5, [sp, #116]\n\t" #else @@ -3955,7 +4061,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #104]\n\t" "ldr r5, [sp, #108]\n\t" #else @@ -3963,14 +4069,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #104]\n\t" "str r5, [sp, #108]\n\t" #else "strd r4, r5, [sp, #104]\n\t" #endif /* Round 14 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -3990,7 +4096,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -4000,25 +4106,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else "strd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -4030,13 +4136,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #112]\n\t" "ldr r9, [sp, #116]\n\t" #else @@ -4044,7 +4150,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #112]\n\t" "ldr r7, [r3, #116]\n\t" #else @@ -4052,7 +4158,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -4060,7 +4166,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -4068,13 +4174,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #40]\n\t" "str r9, [%[sha512], #44]\n\t" #else @@ -4094,7 +4200,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -4104,19 +4210,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else "ldrd r8, r9, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -4128,7 +4234,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else @@ -4136,7 +4242,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #8]\n\t" "str r7, [%[sha512], #12]\n\t" #else @@ -4145,7 +4251,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[14] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #96]\n\t" "ldr r5, [sp, #100]\n\t" #else @@ -4166,13 +4272,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #112]\n\t" "ldr r5, [sp, #116]\n\t" #else "ldrd r4, r5, [sp, #112]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #56]\n\t" "ldr r9, [sp, #60]\n\t" #else @@ -4182,13 +4288,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #112]\n\t" "str r5, [sp, #116]\n\t" #else "strd r4, r5, [sp, #112]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #120]\n\t" "ldr r5, [sp, #124]\n\t" #else @@ -4209,7 +4315,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #112]\n\t" "ldr r5, [sp, #116]\n\t" #else @@ -4217,14 +4323,14 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #112]\n\t" "str r5, [sp, #116]\n\t" #else "strd r4, r5, [sp, #112]\n\t" #endif /* Round 15 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -4244,7 +4350,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -4254,25 +4360,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else "strd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -4284,13 +4390,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #120]\n\t" "ldr r9, [sp, #124]\n\t" #else @@ -4298,7 +4404,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #120]\n\t" "ldr r7, [r3, #124]\n\t" #else @@ -4306,7 +4412,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -4314,7 +4420,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -4322,13 +4428,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #32]\n\t" "str r9, [%[sha512], #36]\n\t" #else @@ -4348,7 +4454,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -4358,19 +4464,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else "ldrd r8, r9, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -4382,7 +4488,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else @@ -4390,7 +4496,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512]]\n\t" "str r7, [%[sha512], #4]\n\t" #else @@ -4399,7 +4505,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Calc new W[15] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #104]\n\t" "ldr r5, [sp, #108]\n\t" #else @@ -4420,13 +4526,13 @@ "orr r8, r8, r5, lsl #26\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #120]\n\t" "ldr r5, [sp, #124]\n\t" #else "ldrd r4, r5, [sp, #120]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #64]\n\t" "ldr r9, [sp, #68]\n\t" #else @@ -4436,13 +4542,13 @@ "adc r5, r5, r7\n\t" "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #120]\n\t" "str r5, [sp, #124]\n\t" #else "strd r4, r5, [sp, #120]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp]\n\t" "ldr r5, [sp, #4]\n\t" #else @@ -4463,7 +4569,7 @@ "orr r8, r8, r5, lsl #25\n\t" "eor r7, r7, r9\n\t" "eor r6, r6, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [sp, #120]\n\t" "ldr r5, [sp, #124]\n\t" #else @@ -4471,7 +4577,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #120]\n\t" "str r5, [sp, #124]\n\t" #else @@ -4481,7 +4587,7 @@ "subs r12, r12, #1\n\t" "bne L_SHA512_transform_len_start_%=\n\t" /* Round 0 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -4501,7 +4607,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -4511,25 +4617,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else "strd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -4541,13 +4647,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp]\n\t" "ldr r9, [sp, #4]\n\t" #else @@ -4555,7 +4661,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3]\n\t" "ldr r7, [r3, #4]\n\t" #else @@ -4563,7 +4669,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -4571,7 +4677,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -4579,13 +4685,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #24]\n\t" "str r9, [%[sha512], #28]\n\t" #else @@ -4605,7 +4711,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -4615,19 +4721,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else "ldrd r8, r9, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -4639,7 +4745,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else @@ -4647,7 +4753,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #56]\n\t" "str r7, [%[sha512], #60]\n\t" #else @@ -4656,7 +4762,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 1 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -4676,7 +4782,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -4686,25 +4792,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else "strd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -4716,13 +4822,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #8]\n\t" "ldr r9, [sp, #12]\n\t" #else @@ -4730,7 +4836,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #8]\n\t" "ldr r7, [r3, #12]\n\t" #else @@ -4738,7 +4844,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -4746,7 +4852,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -4754,13 +4860,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #16]\n\t" "str r9, [%[sha512], #20]\n\t" #else @@ -4780,7 +4886,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -4790,19 +4896,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else "ldrd r8, r9, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -4814,7 +4920,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else @@ -4822,7 +4928,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #48]\n\t" "str r7, [%[sha512], #52]\n\t" #else @@ -4831,7 +4937,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 2 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -4851,7 +4957,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -4861,25 +4967,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else "strd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -4891,13 +4997,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #16]\n\t" "ldr r9, [sp, #20]\n\t" #else @@ -4905,7 +5011,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #16]\n\t" "ldr r7, [r3, #20]\n\t" #else @@ -4913,7 +5019,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -4921,7 +5027,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -4929,13 +5035,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #8]\n\t" "str r9, [%[sha512], #12]\n\t" #else @@ -4955,7 +5061,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -4965,19 +5071,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else "ldrd r8, r9, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -4989,7 +5095,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else @@ -4997,7 +5103,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #40]\n\t" "str r7, [%[sha512], #44]\n\t" #else @@ -5006,7 +5112,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 3 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -5026,7 +5132,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -5036,25 +5142,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else "strd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -5066,13 +5172,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #24]\n\t" "ldr r9, [sp, #28]\n\t" #else @@ -5080,7 +5186,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #24]\n\t" "ldr r7, [r3, #28]\n\t" #else @@ -5088,7 +5194,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -5096,7 +5202,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -5104,13 +5210,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512]]\n\t" "str r9, [%[sha512], #4]\n\t" #else @@ -5130,7 +5236,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -5140,19 +5246,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else "ldrd r8, r9, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -5164,7 +5270,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else @@ -5172,7 +5278,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #32]\n\t" "str r7, [%[sha512], #36]\n\t" #else @@ -5181,7 +5287,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 4 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -5201,7 +5307,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -5211,25 +5317,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else "strd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -5241,13 +5347,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #32]\n\t" "ldr r9, [sp, #36]\n\t" #else @@ -5255,7 +5361,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #32]\n\t" "ldr r7, [r3, #36]\n\t" #else @@ -5263,7 +5369,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -5271,7 +5377,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -5279,13 +5385,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #56]\n\t" "str r9, [%[sha512], #60]\n\t" #else @@ -5305,7 +5411,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -5315,19 +5421,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else "ldrd r8, r9, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -5339,7 +5445,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else @@ -5347,7 +5453,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #24]\n\t" "str r7, [%[sha512], #28]\n\t" #else @@ -5356,7 +5462,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 5 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -5376,7 +5482,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -5386,25 +5492,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else "strd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -5416,13 +5522,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #40]\n\t" "ldr r9, [sp, #44]\n\t" #else @@ -5430,7 +5536,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #40]\n\t" "ldr r7, [r3, #44]\n\t" #else @@ -5438,7 +5544,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -5446,7 +5552,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -5454,13 +5560,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #48]\n\t" "str r9, [%[sha512], #52]\n\t" #else @@ -5480,7 +5586,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -5490,19 +5596,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else "ldrd r8, r9, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -5514,7 +5620,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else @@ -5522,7 +5628,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #16]\n\t" "str r7, [%[sha512], #20]\n\t" #else @@ -5531,7 +5637,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 6 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -5551,7 +5657,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -5561,25 +5667,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else "strd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -5591,13 +5697,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #48]\n\t" "ldr r9, [sp, #52]\n\t" #else @@ -5605,7 +5711,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #48]\n\t" "ldr r7, [r3, #52]\n\t" #else @@ -5613,7 +5719,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -5621,7 +5727,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -5629,13 +5735,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #40]\n\t" "str r9, [%[sha512], #44]\n\t" #else @@ -5655,7 +5761,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -5665,19 +5771,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else "ldrd r8, r9, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -5689,7 +5795,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else @@ -5697,7 +5803,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #8]\n\t" "str r7, [%[sha512], #12]\n\t" #else @@ -5706,7 +5812,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 7 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -5726,7 +5832,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -5736,25 +5842,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else "strd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -5766,13 +5872,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #56]\n\t" "ldr r9, [sp, #60]\n\t" #else @@ -5780,7 +5886,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #56]\n\t" "ldr r7, [r3, #60]\n\t" #else @@ -5788,7 +5894,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -5796,7 +5902,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -5804,13 +5910,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #32]\n\t" "str r9, [%[sha512], #36]\n\t" #else @@ -5830,7 +5936,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -5840,19 +5946,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else "ldrd r8, r9, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -5864,7 +5970,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else @@ -5872,7 +5978,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512]]\n\t" "str r7, [%[sha512], #4]\n\t" #else @@ -5881,7 +5987,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 8 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -5901,7 +6007,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -5911,25 +6017,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else "strd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -5941,13 +6047,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #64]\n\t" "ldr r9, [sp, #68]\n\t" #else @@ -5955,7 +6061,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #64]\n\t" "ldr r7, [r3, #68]\n\t" #else @@ -5963,7 +6069,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -5971,7 +6077,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -5979,13 +6085,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #24]\n\t" "str r9, [%[sha512], #28]\n\t" #else @@ -6005,7 +6111,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -6015,19 +6121,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else "ldrd r8, r9, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #56]\n\t" "str r5, [%[sha512], #60]\n\t" #else @@ -6039,7 +6145,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else @@ -6047,7 +6153,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #56]\n\t" "str r7, [%[sha512], #60]\n\t" #else @@ -6056,7 +6162,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 9 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -6076,7 +6182,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -6086,25 +6192,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else "strd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -6116,13 +6222,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #72]\n\t" "ldr r9, [sp, #76]\n\t" #else @@ -6130,7 +6236,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #72]\n\t" "ldr r7, [r3, #76]\n\t" #else @@ -6138,7 +6244,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -6146,7 +6252,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -6154,13 +6260,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #16]\n\t" "str r9, [%[sha512], #20]\n\t" #else @@ -6180,7 +6286,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -6190,19 +6296,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else "ldrd r8, r9, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else @@ -6214,7 +6320,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else @@ -6222,7 +6328,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #48]\n\t" "str r7, [%[sha512], #52]\n\t" #else @@ -6231,7 +6337,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 10 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -6251,7 +6357,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -6261,25 +6367,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else "strd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -6291,13 +6397,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #80]\n\t" "ldr r9, [sp, #84]\n\t" #else @@ -6305,7 +6411,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #80]\n\t" "ldr r7, [r3, #84]\n\t" #else @@ -6313,7 +6419,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -6321,7 +6427,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -6329,13 +6435,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #8]\n\t" "str r9, [%[sha512], #12]\n\t" #else @@ -6355,7 +6461,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -6365,19 +6471,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else "ldrd r8, r9, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #40]\n\t" "str r5, [%[sha512], #44]\n\t" #else @@ -6389,7 +6495,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else @@ -6397,7 +6503,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #40]\n\t" "str r7, [%[sha512], #44]\n\t" #else @@ -6406,7 +6512,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 11 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -6426,7 +6532,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -6436,25 +6542,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else "strd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else @@ -6466,13 +6572,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #88]\n\t" "ldr r9, [sp, #92]\n\t" #else @@ -6480,7 +6586,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #88]\n\t" "ldr r7, [r3, #92]\n\t" #else @@ -6488,7 +6594,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -6496,7 +6602,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -6504,13 +6610,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512]]\n\t" "str r9, [%[sha512], #4]\n\t" #else @@ -6530,7 +6636,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else @@ -6540,19 +6646,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else "ldrd r8, r9, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else @@ -6564,7 +6670,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else @@ -6572,7 +6678,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #32]\n\t" "str r7, [%[sha512], #36]\n\t" #else @@ -6581,7 +6687,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 12 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -6601,7 +6707,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -6611,25 +6717,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else "strd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else @@ -6641,13 +6747,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #96]\n\t" "ldr r9, [sp, #100]\n\t" #else @@ -6655,7 +6761,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #96]\n\t" "ldr r7, [r3, #100]\n\t" #else @@ -6663,7 +6769,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -6671,7 +6777,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -6679,13 +6785,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #56]\n\t" "str r9, [%[sha512], #60]\n\t" #else @@ -6705,7 +6811,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else @@ -6715,19 +6821,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else "ldrd r8, r9, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #24]\n\t" "str r5, [%[sha512], #28]\n\t" #else @@ -6739,7 +6845,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else @@ -6747,7 +6853,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #24]\n\t" "str r7, [%[sha512], #28]\n\t" #else @@ -6756,7 +6862,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 13 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else @@ -6776,7 +6882,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -6786,25 +6892,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else "strd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #56]\n\t" "ldr r5, [%[sha512], #60]\n\t" #else "ldrd r4, r5, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else "ldrd r6, r7, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else @@ -6816,13 +6922,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #104]\n\t" "ldr r9, [sp, #108]\n\t" #else @@ -6830,7 +6936,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #104]\n\t" "ldr r7, [r3, #108]\n\t" #else @@ -6838,7 +6944,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #48]\n\t" "ldr r9, [%[sha512], #52]\n\t" #else @@ -6846,7 +6952,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -6854,13 +6960,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #24]\n\t" "ldr r5, [%[sha512], #28]\n\t" #else "ldrd r4, r5, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #48]\n\t" "str r9, [%[sha512], #52]\n\t" #else @@ -6880,7 +6986,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else @@ -6890,19 +6996,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #24]\n\t" "ldr r9, [%[sha512], #28]\n\t" #else "ldrd r8, r9, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #32]\n\t" "ldr r7, [%[sha512], #36]\n\t" #else "ldrd r6, r7, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else @@ -6914,7 +7020,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else @@ -6922,7 +7028,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #16]\n\t" "str r7, [%[sha512], #20]\n\t" #else @@ -6931,7 +7037,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 14 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else @@ -6951,7 +7057,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -6961,25 +7067,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else "strd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512]]\n\t" "ldr r9, [%[sha512], #4]\n\t" #else @@ -6991,13 +7097,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #112]\n\t" "ldr r9, [sp, #116]\n\t" #else @@ -7005,7 +7111,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #112]\n\t" "ldr r7, [r3, #116]\n\t" #else @@ -7013,7 +7119,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #40]\n\t" "ldr r9, [%[sha512], #44]\n\t" #else @@ -7021,7 +7127,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -7029,13 +7135,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #40]\n\t" "str r9, [%[sha512], #44]\n\t" #else @@ -7055,7 +7161,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else @@ -7065,19 +7171,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #16]\n\t" "ldr r9, [%[sha512], #20]\n\t" #else "ldrd r8, r9, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #8]\n\t" "str r5, [%[sha512], #12]\n\t" #else @@ -7089,7 +7195,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else @@ -7097,7 +7203,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #8]\n\t" "str r7, [%[sha512], #12]\n\t" #else @@ -7106,7 +7212,7 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Round 15 */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else @@ -7126,7 +7232,7 @@ "lsls r9, r5, #23\n\t" "orr r9, r9, r4, lsr #9\n\t" "orr r8, r8, r5, lsr #9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -7136,25 +7242,25 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else "strd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #40]\n\t" "ldr r5, [%[sha512], #44]\n\t" #else "ldrd r4, r5, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #48]\n\t" "ldr r7, [%[sha512], #52]\n\t" #else "ldrd r6, r7, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #56]\n\t" "ldr r9, [%[sha512], #60]\n\t" #else @@ -7166,13 +7272,13 @@ "and r7, r7, r5\n\t" "eor r6, r6, r8\n\t" "eor r7, r7, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #120]\n\t" "ldr r9, [sp, #124]\n\t" #else @@ -7180,7 +7286,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [r3, #120]\n\t" "ldr r7, [r3, #124]\n\t" #else @@ -7188,7 +7294,7 @@ #endif "adds r4, r4, r8\n\t" "adc r5, r5, r9\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #32]\n\t" "ldr r9, [%[sha512], #36]\n\t" #else @@ -7196,7 +7302,7 @@ #endif "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -7204,13 +7310,13 @@ #endif "adds r8, r8, r4\n\t" "adc r9, r9, r5\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #8]\n\t" "ldr r5, [%[sha512], #12]\n\t" #else "ldrd r4, r5, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[sha512], #32]\n\t" "str r9, [%[sha512], #36]\n\t" #else @@ -7230,7 +7336,7 @@ "lsls r9, r5, #25\n\t" "orr r9, r9, r4, lsr #7\n\t" "orr r8, r8, r5, lsr #7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else @@ -7240,19 +7346,19 @@ "eor r7, r7, r9\n\t" "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[sha512], #8]\n\t" "ldr r9, [%[sha512], #12]\n\t" #else "ldrd r8, r9, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #16]\n\t" "ldr r7, [%[sha512], #20]\n\t" #else "ldrd r6, r7, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else @@ -7264,7 +7370,7 @@ "and r11, r11, r9\n\t" "eor r10, r10, r6\n\t" "eor r11, r11, r7\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512]]\n\t" "ldr r7, [%[sha512], #4]\n\t" #else @@ -7272,7 +7378,7 @@ #endif "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512]]\n\t" "str r7, [%[sha512], #4]\n\t" #else @@ -7281,25 +7387,25 @@ "mov r10, r8\n\t" "mov r11, r9\n\t" /* Add in digest from start */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512]]\n\t" "ldr r5, [%[sha512], #4]\n\t" #else "ldrd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #8]\n\t" "ldr r7, [%[sha512], #12]\n\t" #else "ldrd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #128]\n\t" "ldr r9, [sp, #132]\n\t" #else "ldrd r8, r9, [sp, #128]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [sp, #136]\n\t" "ldr r11, [sp, #140]\n\t" #else @@ -7309,49 +7415,49 @@ "adc r5, r5, r9\n\t" "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512]]\n\t" "str r5, [%[sha512], #4]\n\t" #else "strd r4, r5, [%[sha512]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #8]\n\t" "str r7, [%[sha512], #12]\n\t" #else "strd r6, r7, [%[sha512], #8]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #128]\n\t" "str r5, [sp, #132]\n\t" #else "strd r4, r5, [sp, #128]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #136]\n\t" "str r7, [sp, #140]\n\t" #else "strd r6, r7, [sp, #136]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #16]\n\t" "ldr r5, [%[sha512], #20]\n\t" #else "ldrd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #24]\n\t" "ldr r7, [%[sha512], #28]\n\t" #else "ldrd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #144]\n\t" "ldr r9, [sp, #148]\n\t" #else "ldrd r8, r9, [sp, #144]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [sp, #152]\n\t" "ldr r11, [sp, #156]\n\t" #else @@ -7361,49 +7467,49 @@ "adc r5, r5, r9\n\t" "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #16]\n\t" "str r5, [%[sha512], #20]\n\t" #else "strd r4, r5, [%[sha512], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #24]\n\t" "str r7, [%[sha512], #28]\n\t" #else "strd r6, r7, [%[sha512], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #144]\n\t" "str r5, [sp, #148]\n\t" #else "strd r4, r5, [sp, #144]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #152]\n\t" "str r7, [sp, #156]\n\t" #else "strd r6, r7, [sp, #152]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #32]\n\t" "ldr r5, [%[sha512], #36]\n\t" #else "ldrd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #40]\n\t" "ldr r7, [%[sha512], #44]\n\t" #else "ldrd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #160]\n\t" "ldr r9, [sp, #164]\n\t" #else "ldrd r8, r9, [sp, #160]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [sp, #168]\n\t" "ldr r11, [sp, #172]\n\t" #else @@ -7413,49 +7519,49 @@ "adc r5, r5, r9\n\t" "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #32]\n\t" "str r5, [%[sha512], #36]\n\t" #else "strd r4, r5, [%[sha512], #32]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #40]\n\t" "str r7, [%[sha512], #44]\n\t" #else "strd r6, r7, [%[sha512], #40]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #160]\n\t" "str r5, [sp, #164]\n\t" #else "strd r4, r5, [sp, #160]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #168]\n\t" "str r7, [sp, #172]\n\t" #else "strd r6, r7, [sp, #168]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[sha512], #48]\n\t" "ldr r5, [%[sha512], #52]\n\t" #else "ldrd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[sha512], #56]\n\t" "ldr r7, [%[sha512], #60]\n\t" #else "ldrd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [sp, #176]\n\t" "ldr r9, [sp, #180]\n\t" #else "ldrd r8, r9, [sp, #176]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r10, [sp, #184]\n\t" "ldr r11, [sp, #188]\n\t" #else @@ -7465,25 +7571,25 @@ "adc r5, r5, r9\n\t" "adds r6, r6, r10\n\t" "adc r7, r7, r11\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[sha512], #48]\n\t" "str r5, [%[sha512], #52]\n\t" #else "strd r4, r5, [%[sha512], #48]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[sha512], #56]\n\t" "str r7, [%[sha512], #60]\n\t" #else "strd r6, r7, [%[sha512], #56]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [sp, #176]\n\t" "str r5, [sp, #180]\n\t" #else "strd r4, r5, [sp, #176]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [sp, #184]\n\t" "str r7, [sp, #188]\n\t" #else @@ -7495,9 +7601,9 @@ "bne L_SHA512_transform_len_begin_%=\n\t" "eor r0, r0, r0\n\t" "add sp, sp, #0xc0\n\t" - : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) - : [L_SHA512_transform_len_k] "r" (L_SHA512_transform_len_k) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len), [L_SHA512_transform_len_k] "+r" (L_SHA512_transform_len_k_c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -7506,94 +7612,55 @@ #ifndef WOLFSSL_ARMASM_NO_NEON static const uint64_t L_SHA512_transform_neon_len_k[] = { - 0x428a2f98d728ae22UL, - 0x7137449123ef65cdUL, - 0xb5c0fbcfec4d3b2fUL, - 0xe9b5dba58189dbbcUL, - 0x3956c25bf348b538UL, - 0x59f111f1b605d019UL, - 0x923f82a4af194f9bUL, - 0xab1c5ed5da6d8118UL, - 0xd807aa98a3030242UL, - 0x12835b0145706fbeUL, - 0x243185be4ee4b28cUL, - 0x550c7dc3d5ffb4e2UL, - 0x72be5d74f27b896fUL, - 0x80deb1fe3b1696b1UL, - 0x9bdc06a725c71235UL, - 0xc19bf174cf692694UL, - 0xe49b69c19ef14ad2UL, - 0xefbe4786384f25e3UL, - 0xfc19dc68b8cd5b5UL, - 0x240ca1cc77ac9c65UL, - 0x2de92c6f592b0275UL, - 0x4a7484aa6ea6e483UL, - 0x5cb0a9dcbd41fbd4UL, - 0x76f988da831153b5UL, - 0x983e5152ee66dfabUL, - 0xa831c66d2db43210UL, - 0xb00327c898fb213fUL, - 0xbf597fc7beef0ee4UL, - 0xc6e00bf33da88fc2UL, - 0xd5a79147930aa725UL, - 0x6ca6351e003826fUL, - 0x142929670a0e6e70UL, - 0x27b70a8546d22ffcUL, - 0x2e1b21385c26c926UL, - 0x4d2c6dfc5ac42aedUL, - 0x53380d139d95b3dfUL, - 0x650a73548baf63deUL, - 0x766a0abb3c77b2a8UL, - 0x81c2c92e47edaee6UL, - 0x92722c851482353bUL, - 0xa2bfe8a14cf10364UL, - 0xa81a664bbc423001UL, - 0xc24b8b70d0f89791UL, - 0xc76c51a30654be30UL, - 0xd192e819d6ef5218UL, - 0xd69906245565a910UL, - 0xf40e35855771202aUL, - 0x106aa07032bbd1b8UL, - 0x19a4c116b8d2d0c8UL, - 0x1e376c085141ab53UL, - 0x2748774cdf8eeb99UL, - 0x34b0bcb5e19b48a8UL, - 0x391c0cb3c5c95a63UL, - 0x4ed8aa4ae3418acbUL, - 0x5b9cca4f7763e373UL, - 0x682e6ff3d6b2b8a3UL, - 0x748f82ee5defb2fcUL, - 0x78a5636f43172f60UL, - 0x84c87814a1f0ab72UL, - 0x8cc702081a6439ecUL, - 0x90befffa23631e28UL, - 0xa4506cebde82bde9UL, - 0xbef9a3f7b2c67915UL, - 0xc67178f2e372532bUL, - 0xca273eceea26619cUL, - 0xd186b8c721c0c207UL, - 0xeada7dd6cde0eb1eUL, - 0xf57d4f7fee6ed178UL, - 0x6f067aa72176fbaUL, - 0xa637dc5a2c898a6UL, - 0x113f9804bef90daeUL, - 0x1b710b35131c471bUL, - 0x28db77f523047d84UL, - 0x32caab7b40c72493UL, - 0x3c9ebe0a15c9bebcUL, - 0x431d67c49c100d4cUL, - 0x4cc5d4becb3e42b6UL, - 0x597f299cfc657e2aUL, - 0x5fcb6fab3ad6faecUL, - 0x6c44198c4a475817UL, + 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, + 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, + 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, + 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, + 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, + 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, + 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, + 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL, + 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL, + 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL, + 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL, + 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL, + 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL, + 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL, + 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL, + 0x06ca6351e003826fUL, 0x142929670a0e6e70UL, + 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL, + 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL, + 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL, + 0x81c2c92e47edaee6UL, 0x92722c851482353bUL, + 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL, + 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL, + 0xd192e819d6ef5218UL, 0xd69906245565a910UL, + 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL, + 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL, + 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL, + 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL, + 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL, + 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL, + 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL, + 0x90befffa23631e28UL, 0xa4506cebde82bde9UL, + 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL, + 0xca273eceea26619cUL, 0xd186b8c721c0c207UL, + 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL, + 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL, + 0x113f9804bef90daeUL, 0x1b710b35131c471bUL, + 0x28db77f523047d84UL, 0x32caab7b40c72493UL, + 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL, + 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL, + 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL, }; -void Transform_Sha512_Len(wc_Sha512* sha512_p, const byte* data_p, word32 len_p); +void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len); void Transform_Sha512_Len(wc_Sha512* sha512_p, const byte* data_p, word32 len_p) { - register wc_Sha512* sha512 asm ("r0") = sha512_p; - register const byte* data asm ("r1") = data_p; - register word32 len asm ("r2") = len_p; + register wc_Sha512* sha512 asm ("r0") = (wc_Sha512*)sha512_p; + register const byte* data asm ("r1") = (const byte*)data_p; + register word32 len asm ("r2") = (word32)len_p; + register uint64_t* L_SHA512_transform_neon_len_k_c asm ("r3") = (uint64_t*)&L_SHA512_transform_neon_len_k; __asm__ __volatile__ ( /* Load digest into working vars */ @@ -7633,13 +7700,12 @@ "vrev64.8 d30, d30\n\t" "vrev64.8 d31, d31\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ - "mov r3, %[L_SHA512_transform_neon_len_k]\n\t" "mov r12, #4\n\t" /* Start of 16 rounds */ "\n" "L_SHA512_transform_neon_len_start_%=: \n\t" /* Round 0 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d4, #50\n\t" "vsri.u64 d8, d4, #14\n\t" "vshl.u64 d9, d0, #36\n\t" @@ -7668,7 +7734,7 @@ "vadd.i64 d3, d7\n\t" "vadd.i64 d7, d10\n\t" /* Round 1 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d3, #50\n\t" "vsri.u64 d8, d3, #14\n\t" "vshl.u64 d9, d7, #36\n\t" @@ -7759,7 +7825,7 @@ "vadd.i64 d17, d11\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 2 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d2, #50\n\t" "vsri.u64 d8, d2, #14\n\t" "vshl.u64 d9, d6, #36\n\t" @@ -7788,7 +7854,7 @@ "vadd.i64 d1, d5\n\t" "vadd.i64 d5, d10\n\t" /* Round 3 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d1, #50\n\t" "vsri.u64 d8, d1, #14\n\t" "vshl.u64 d9, d5, #36\n\t" @@ -7879,7 +7945,7 @@ "vadd.i64 d19, d11\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 4 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d0, #50\n\t" "vsri.u64 d8, d0, #14\n\t" "vshl.u64 d9, d4, #36\n\t" @@ -7908,7 +7974,7 @@ "vadd.i64 d7, d3\n\t" "vadd.i64 d3, d10\n\t" /* Round 5 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d7, #50\n\t" "vsri.u64 d8, d7, #14\n\t" "vshl.u64 d9, d3, #36\n\t" @@ -7999,7 +8065,7 @@ "vadd.i64 d21, d11\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 6 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d6, #50\n\t" "vsri.u64 d8, d6, #14\n\t" "vshl.u64 d9, d2, #36\n\t" @@ -8028,7 +8094,7 @@ "vadd.i64 d5, d1\n\t" "vadd.i64 d1, d10\n\t" /* Round 7 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d5, #50\n\t" "vsri.u64 d8, d5, #14\n\t" "vshl.u64 d9, d1, #36\n\t" @@ -8119,7 +8185,7 @@ "vadd.i64 d23, d11\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 8 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d4, #50\n\t" "vsri.u64 d8, d4, #14\n\t" "vshl.u64 d9, d0, #36\n\t" @@ -8148,7 +8214,7 @@ "vadd.i64 d3, d7\n\t" "vadd.i64 d7, d10\n\t" /* Round 9 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d3, #50\n\t" "vsri.u64 d8, d3, #14\n\t" "vshl.u64 d9, d7, #36\n\t" @@ -8239,7 +8305,7 @@ "vadd.i64 d25, d11\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 10 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d2, #50\n\t" "vsri.u64 d8, d2, #14\n\t" "vshl.u64 d9, d6, #36\n\t" @@ -8268,7 +8334,7 @@ "vadd.i64 d1, d5\n\t" "vadd.i64 d5, d10\n\t" /* Round 11 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d1, #50\n\t" "vsri.u64 d8, d1, #14\n\t" "vshl.u64 d9, d5, #36\n\t" @@ -8359,7 +8425,7 @@ "vadd.i64 d27, d11\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 12 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d0, #50\n\t" "vsri.u64 d8, d0, #14\n\t" "vshl.u64 d9, d4, #36\n\t" @@ -8388,7 +8454,7 @@ "vadd.i64 d7, d3\n\t" "vadd.i64 d3, d10\n\t" /* Round 13 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d7, #50\n\t" "vsri.u64 d8, d7, #14\n\t" "vshl.u64 d9, d3, #36\n\t" @@ -8479,7 +8545,7 @@ "vadd.i64 d29, d11\n\t" #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 14 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d6, #50\n\t" "vsri.u64 d8, d6, #14\n\t" "vshl.u64 d9, d2, #36\n\t" @@ -8508,7 +8574,7 @@ "vadd.i64 d5, d1\n\t" "vadd.i64 d1, d10\n\t" /* Round 15 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d5, #50\n\t" "vsri.u64 d8, d5, #14\n\t" "vshl.u64 d9, d1, #36\n\t" @@ -8601,7 +8667,7 @@ "subs r12, r12, #1\n\t" "bne L_SHA512_transform_neon_len_start_%=\n\t" /* Round 0 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d4, #50\n\t" "vsri.u64 d8, d4, #14\n\t" "vshl.u64 d9, d0, #36\n\t" @@ -8630,7 +8696,7 @@ "vadd.i64 d3, d7\n\t" "vadd.i64 d7, d10\n\t" /* Round 1 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d3, #50\n\t" "vsri.u64 d8, d3, #14\n\t" "vshl.u64 d9, d7, #36\n\t" @@ -8659,7 +8725,7 @@ "vadd.i64 d2, d6\n\t" "vadd.i64 d6, d10\n\t" /* Round 2 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d2, #50\n\t" "vsri.u64 d8, d2, #14\n\t" "vshl.u64 d9, d6, #36\n\t" @@ -8688,7 +8754,7 @@ "vadd.i64 d1, d5\n\t" "vadd.i64 d5, d10\n\t" /* Round 3 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d1, #50\n\t" "vsri.u64 d8, d1, #14\n\t" "vshl.u64 d9, d5, #36\n\t" @@ -8717,7 +8783,7 @@ "vadd.i64 d0, d4\n\t" "vadd.i64 d4, d10\n\t" /* Round 4 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d0, #50\n\t" "vsri.u64 d8, d0, #14\n\t" "vshl.u64 d9, d4, #36\n\t" @@ -8746,7 +8812,7 @@ "vadd.i64 d7, d3\n\t" "vadd.i64 d3, d10\n\t" /* Round 5 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d7, #50\n\t" "vsri.u64 d8, d7, #14\n\t" "vshl.u64 d9, d3, #36\n\t" @@ -8775,7 +8841,7 @@ "vadd.i64 d6, d2\n\t" "vadd.i64 d2, d10\n\t" /* Round 6 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d6, #50\n\t" "vsri.u64 d8, d6, #14\n\t" "vshl.u64 d9, d2, #36\n\t" @@ -8804,7 +8870,7 @@ "vadd.i64 d5, d1\n\t" "vadd.i64 d1, d10\n\t" /* Round 7 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d5, #50\n\t" "vsri.u64 d8, d5, #14\n\t" "vshl.u64 d9, d1, #36\n\t" @@ -8833,7 +8899,7 @@ "vadd.i64 d4, d0\n\t" "vadd.i64 d0, d10\n\t" /* Round 8 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d4, #50\n\t" "vsri.u64 d8, d4, #14\n\t" "vshl.u64 d9, d0, #36\n\t" @@ -8862,7 +8928,7 @@ "vadd.i64 d3, d7\n\t" "vadd.i64 d7, d10\n\t" /* Round 9 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d3, #50\n\t" "vsri.u64 d8, d3, #14\n\t" "vshl.u64 d9, d7, #36\n\t" @@ -8891,7 +8957,7 @@ "vadd.i64 d2, d6\n\t" "vadd.i64 d6, d10\n\t" /* Round 10 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d2, #50\n\t" "vsri.u64 d8, d2, #14\n\t" "vshl.u64 d9, d6, #36\n\t" @@ -8920,7 +8986,7 @@ "vadd.i64 d1, d5\n\t" "vadd.i64 d5, d10\n\t" /* Round 11 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d1, #50\n\t" "vsri.u64 d8, d1, #14\n\t" "vshl.u64 d9, d5, #36\n\t" @@ -8949,7 +9015,7 @@ "vadd.i64 d0, d4\n\t" "vadd.i64 d4, d10\n\t" /* Round 12 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d0, #50\n\t" "vsri.u64 d8, d0, #14\n\t" "vshl.u64 d9, d4, #36\n\t" @@ -8978,7 +9044,7 @@ "vadd.i64 d7, d3\n\t" "vadd.i64 d3, d10\n\t" /* Round 13 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d7, #50\n\t" "vsri.u64 d8, d7, #14\n\t" "vshl.u64 d9, d3, #36\n\t" @@ -9007,7 +9073,7 @@ "vadd.i64 d6, d2\n\t" "vadd.i64 d2, d10\n\t" /* Round 14 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d6, #50\n\t" "vsri.u64 d8, d6, #14\n\t" "vshl.u64 d9, d2, #36\n\t" @@ -9036,7 +9102,7 @@ "vadd.i64 d5, d1\n\t" "vadd.i64 d1, d10\n\t" /* Round 15 */ - "vld1.64 {d12}, [r3]!\n\t" + "vld1.64 {d12}, [r3:64]!\n\t" "vshl.u64 d8, d5, #50\n\t" "vsri.u64 d8, d5, #14\n\t" "vshl.u64 d9, d1, #36\n\t" @@ -9083,14 +9149,19 @@ #endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ "vstm.64 %[sha512], {d0-d7}\n\t" "subs %[len], %[len], #0x80\n\t" + "sub r3, r3, #0x280\n\t" "bne L_SHA512_transform_neon_len_begin_%=\n\t" - : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) - : [L_SHA512_transform_neon_len_k] "r" (L_SHA512_transform_neon_len_k) - : "memory", "r3", "r12", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len), [L_SHA512_transform_neon_len_k] "+r" (L_SHA512_transform_neon_len_k_c) + : + : "memory", "r12", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15", "cc" ); } #endif /* !WOLFSSL_ARMASM_NO_NEON */ #endif /* WOLFSSL_SHA512 */ -#endif /* !__aarch64__ */ +#endif /* !__aarch64__ && __arm__ && !__thumb__ */ #endif /* WOLFSSL_ARMASM */ +#endif /* !defined(__aarch64__) && defined(__arm__) && !defined(__thumb__) */ +#endif /* WOLFSSL_ARMASM */ + +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -21,7 +21,7 @@ /* - * There are two versions one for 64 (Aarch64) and one for 32 bit (Aarch32). + * There are two versions one for 64 (Aarch64) and one for 32 bit (Aarch32). * If changing one check the other. */ @@ -31,18 +31,33 @@ #endif #include +#include #if !defined(NO_AES) && defined(WOLFSSL_ARMASM) -#if defined(HAVE_FIPS) && !defined(FIPS_NO_WRAPPERS) -#define FIPS_NO_WRAPPERS +#if FIPS_VERSION3_LT(6,0,0) && defined(HAVE_FIPS) + #undef HAVE_FIPS +#else + #if defined(HAVE_FIPS) && FIPS_VERSION3_GE(6,0,0) + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS + #endif #endif -#ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO - #include -#include #include + +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_aes_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000002 }; + int wolfCrypt_FIPS_AES_sanity(void) + { + return 0; + } +#endif + +#ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO + #ifdef NO_INLINE #include #else @@ -116,6 +131,7 @@ #ifdef HAVE_AESGCM +#if !defined(__aarch64__) || defined(WOLFSSL_AESGCM_STREAM) static WC_INLINE void IncrementGcmCounter(byte* inOutCtr) { int i; @@ -144,6 +160,7 @@ buf[6] = (sz >> 8) & 0xff; buf[7] = sz & 0xff; } +#endif #endif /* HAVE_AESGCM */ @@ -1452,6 +1469,13 @@ return 0; } +int wc_AesCtrSetKey(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir) +{ + (void)dir; + return wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); +} + #endif /* WOLFSSL_AES_COUNTER */ #ifdef HAVE_AESGCM @@ -1460,1109 +1484,5716 @@ * Based from GCM implementation in wolfcrypt/src/aes.c */ +/* START script replace AES-GCM Aarch64 with hardware crypto. */ + /* PMULL and RBIT only with AArch64 */ /* Use ARM hardware for polynomial multiply */ -static void GMULT(byte* X, byte* Y) +void GMULT(byte* X, byte* Y) { __asm__ volatile ( - "LD1 {v0.16b}, [%[inX]] \n" - "LD1 {v1.16b}, [%[inY]] \n" /* v1 already reflected from set key */ + "LD1 {v0.16b}, [%[X]] \n" + "LD1 {v1.16b}, [%[Y]] \n" /* v1 already reflected from set key */ + "MOVI v2.16b, #0x87 \n" "RBIT v0.16b, v0.16b \n" + "USHR v2.2d, v2.2d, #56 \n" + "PMULL v3.1q, v0.1d, v1.1d \n" + "PMULL2 v4.1q, v0.2d, v1.2d \n" + "EXT v5.16b, v1.16b, v1.16b, #8 \n" + "PMULL v6.1q, v0.1d, v5.1d \n" + "PMULL2 v5.1q, v0.2d, v5.2d \n" + "EOR v5.16b, v5.16b, v6.16b \n" + "EXT v6.16b, v3.16b, v4.16b, #8 \n" + "EOR v6.16b, v6.16b, v5.16b \n" + "# Reduce \n" + "PMULL2 v5.1q, v4.2d, v2.2d \n" + "EOR v6.16b, v6.16b, v5.16b \n" + "PMULL2 v5.1q, v6.2d, v2.2d \n" + "MOV v3.D[1], v6.D[0] \n" + "EOR v0.16b, v3.16b, v5.16b \n" - /* Algorithm 1 from Intel GCM white paper. - "Carry-Less Multiplication and Its Usage for Computing the GCM Mode" - */ - "PMULL v3.1q, v0.1d, v1.1d \n" /* a0 * b0 = C */ - "PMULL2 v4.1q, v0.2d, v1.2d \n" /* a1 * b1 = D */ - "EXT v5.16b, v1.16b, v1.16b, #8 \n" /* b0b1 -> b1b0 */ - "PMULL v6.1q, v0.1d, v5.1d \n" /* a0 * b1 = E */ - "PMULL2 v5.1q, v0.2d, v5.2d \n" /* a1 * b0 = F */ - - "#Set a register to all 0s using EOR \n" - "EOR v7.16b, v7.16b, v7.16b \n" - "EOR v5.16b, v5.16b, v6.16b \n" /* F ^ E */ - "EXT v6.16b, v7.16b, v5.16b, #8 \n" /* get (F^E)[0] */ - "EOR v3.16b, v3.16b, v6.16b \n" /* low 128 bits in v3 */ - "EXT v6.16b, v5.16b, v7.16b, #8 \n" /* get (F^E)[1] */ - "EOR v4.16b, v4.16b, v6.16b \n" /* high 128 bits in v4 */ - - - /* Based from White Paper "Implementing GCM on ARMv8" - by Conrado P.L. Gouvea and Julio Lopez - reduction on 256bit value using Algorithm 5 */ - "MOVI v8.16b, #0x87 \n" - "USHR v8.2d, v8.2d, #56 \n" - /* v8 is now 0x00000000000000870000000000000087 reflected 0xe1....*/ - "PMULL2 v5.1q, v4.2d, v8.2d \n" - "EXT v6.16b, v5.16b, v7.16b, #8 \n" /* v7 is all 0's */ - "EOR v4.16b, v4.16b, v6.16b \n" - "EXT v6.16b, v7.16b, v5.16b, #8 \n" - "EOR v3.16b, v3.16b, v6.16b \n" - "PMULL v5.1q, v4.1d, v8.1d \n" - "EOR v4.16b, v3.16b, v5.16b \n" - - "RBIT v4.16b, v4.16b \n" - "STR q4, [%[out]] \n" - : [out] "=r" (X), "=r" (Y) - : [inX] "0" (X), [inY] "1" (Y) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8" + "RBIT v0.16b, v0.16b \n" + "STR q0, [%[X]] \n" + : + : [X] "r" (X), [Y] "r" (Y) + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6" ); } - -void GHASH(Aes* aes, const byte* a, word32 aSz, - const byte* c, word32 cSz, byte* s, word32 sSz) +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, + word32 cSz, byte* s, word32 sSz) { - byte x[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE]; - word32 blocks, partial; - byte* h = aes->H; - - XMEMSET(x, 0, AES_BLOCK_SIZE); - /* Hash in A, the Additional Authentication Data */ - if (aSz != 0 && a != NULL) { - blocks = aSz / AES_BLOCK_SIZE; - partial = aSz % AES_BLOCK_SIZE; - /* do as many blocks as possible */ - while (blocks--) { - xorbuf(x, a, AES_BLOCK_SIZE); - GMULT(x, h); - a += AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, a, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, h); - } - } - - /* Hash in C, the Ciphertext */ - if (cSz != 0 && c != NULL) { - blocks = cSz / AES_BLOCK_SIZE; - partial = cSz % AES_BLOCK_SIZE; - while (blocks--) { - xorbuf(x, c, AES_BLOCK_SIZE); - GMULT(x, h); - c += AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, c, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, h); - } - } - - /* Hash in the lengths of A and C in bits */ - FlattenSzInBits(&scratch[0], aSz); - FlattenSzInBits(&scratch[8], cSz); - xorbuf(x, scratch, AES_BLOCK_SIZE); + __asm__ __volatile__ ( + "LD1 {v3.16b}, %[h] \n" + "MOVI v7.16b, #0x87 \n" + "EOR v0.16b, v0.16b, v0.16b \n" + "USHR v7.2d, v7.2d, #56 \n" + + "# AAD \n" + "CBZ %[a], 20f \n" + "CBZ %w[aSz], 20f \n" + "MOV w12, %w[aSz] \n" + + "CMP x12, #64 \n" + "BLT 15f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v11.1q, v3.2d, v3.2d \n" + "PMULL v10.1q, v3.1d, v3.1d \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v11.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v4.16b, v10.16b, v11.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v10.1q, v4.1d, v3.1d \n" + "PMULL2 v11.1q, v4.2d, v3.2d \n" + "EXT v12.16b, v3.16b, v3.16b, #8 \n" + "PMULL v13.1q, v4.1d, v12.1d \n" + "PMULL2 v12.1q, v4.2d, v12.2d \n" + "EOR v12.16b, v12.16b, v13.16b \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "# Reduce \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v12.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v5.16b, v10.16b, v12.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v11.1q, v4.2d, v4.2d \n" + "PMULL v10.1q, v4.1d, v4.1d \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v11.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v6.16b, v10.16b, v11.16b \n" + "14: \n" + "LD1 {v10.2d-v13.2d}, [%[a]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v10.16b, v10.16b \n" + "RBIT v11.16b, v11.16b \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "EOR v10.16b, v10.16b, v0.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v0.1q, v13.1d, v3.1d \n" + "PMULL2 v1.1q, v13.2d, v3.2d \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v2.1q, v13.1d, v3.1d \n" + "PMULL2 v9.1q, v13.2d, v3.2d \n" + "EOR v2.16b, v2.16b, v9.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v8.1q, v12.1d, v4.1d \n" + "PMULL2 v9.1q, v12.2d, v4.2d \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "EOR v1.16b, v1.16b, v9.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v9.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v2.16b, v2.16b, v12.16b, v9.16b \n" +#else + "EOR v12.16b, v12.16b, v9.16b \n" + "EOR v2.16b, v2.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v8.1q, v11.1d, v5.1d \n" + "PMULL2 v9.1q, v11.2d, v5.2d \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "EOR v1.16b, v1.16b, v9.16b \n" + "EXT v11.16b, v11.16b, v11.16b, #8 \n" + "PMULL v9.1q, v11.1d, v5.1d \n" + "PMULL2 v11.1q, v11.2d, v5.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v2.16b, v2.16b, v11.16b, v9.16b \n" +#else + "EOR v11.16b, v11.16b, v9.16b \n" + "EOR v2.16b, v2.16b, v11.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v8.1q, v10.1d, v6.1d \n" + "PMULL2 v9.1q, v10.2d, v6.2d \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "EOR v1.16b, v1.16b, v9.16b \n" + "EXT v10.16b, v10.16b, v10.16b, #8 \n" + "PMULL v9.1q, v10.1d, v6.1d \n" + "PMULL2 v10.1q, v10.2d, v6.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v2.16b, v2.16b, v10.16b, v9.16b \n" +#else + "EOR v10.16b, v10.16b, v9.16b \n" + "EOR v2.16b, v2.16b, v10.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v9.16b, v0.16b, v1.16b, #8 \n" + "PMULL2 v8.1q, v1.2d, v7.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v9.16b, v9.16b, v2.16b, v8.16b \n" +#else + "EOR v9.16b, v9.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v9.16b, v9.16b, v8.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v8.1q, v9.2d, v7.2d \n" + "MOV v0.D[1], v9.D[0] \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "CMP x12, #64 \n" + "BGE 14b \n" + "CBZ x12, 20f \n" + "15: \n" + "CMP x12, #16 \n" + "BLT 12f \n" + "11: \n" + "LD1 {v14.2d}, [%[a]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v14.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v14.16b \n" + "PMULL v10.1q, v0.1d, v3.1d \n" + "PMULL2 v11.1q, v0.2d, v3.2d \n" + "EXT v12.16b, v3.16b, v3.16b, #8 \n" + "PMULL v13.1q, v0.1d, v12.1d \n" + "PMULL2 v12.1q, v0.2d, v12.2d \n" + "EOR v12.16b, v12.16b, v13.16b \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "# Reduce \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v12.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v0.16b, v10.16b, v12.16b \n" + "CMP x12, #16 \n" + "BGE 11b \n" + "CBZ x12, 120f \n" + "12: \n" + "# Partial AAD \n" + "EOR v14.16b, v14.16b, v14.16b \n" + "MOV x14, x12 \n" + "ST1 {v14.2d}, [%[scratch]] \n" + "13: \n" + "LDRB w13, [%[a]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 13b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v14.2d}, [%[scratch]] \n" + "RBIT v14.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v14.16b \n" + "PMULL v10.1q, v0.1d, v3.1d \n" + "PMULL2 v11.1q, v0.2d, v3.2d \n" + "EXT v12.16b, v3.16b, v3.16b, #8 \n" + "PMULL v13.1q, v0.1d, v12.1d \n" + "PMULL2 v12.1q, v0.2d, v12.2d \n" + "EOR v12.16b, v12.16b, v13.16b \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "# Reduce \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v12.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v0.16b, v10.16b, v12.16b \n" + + "20: \n" + "# Cipher Text \n" + "CBZ %[c], 120f \n" + "CBZ %w[cSz], 120f \n" + "MOV w12, %w[cSz] \n" + + "CMP x12, #64 \n" + "BLT 115f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v11.1q, v3.2d, v3.2d \n" + "PMULL v10.1q, v3.1d, v3.1d \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v11.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v4.16b, v10.16b, v11.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v10.1q, v4.1d, v3.1d \n" + "PMULL2 v11.1q, v4.2d, v3.2d \n" + "EXT v12.16b, v3.16b, v3.16b, #8 \n" + "PMULL v13.1q, v4.1d, v12.1d \n" + "PMULL2 v12.1q, v4.2d, v12.2d \n" + "EOR v12.16b, v12.16b, v13.16b \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "# Reduce \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v12.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v5.16b, v10.16b, v12.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v11.1q, v4.2d, v4.2d \n" + "PMULL v10.1q, v4.1d, v4.1d \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v11.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v6.16b, v10.16b, v11.16b \n" + "114: \n" + "LD1 {v10.2d-v13.2d}, [%[c]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v10.16b, v10.16b \n" + "RBIT v11.16b, v11.16b \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "EOR v10.16b, v10.16b, v0.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v0.1q, v13.1d, v3.1d \n" + "PMULL2 v1.1q, v13.2d, v3.2d \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v2.1q, v13.1d, v3.1d \n" + "PMULL2 v9.1q, v13.2d, v3.2d \n" + "EOR v2.16b, v2.16b, v9.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v8.1q, v12.1d, v4.1d \n" + "PMULL2 v9.1q, v12.2d, v4.2d \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "EOR v1.16b, v1.16b, v9.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v9.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v2.16b, v2.16b, v12.16b, v9.16b \n" +#else + "EOR v12.16b, v12.16b, v9.16b \n" + "EOR v2.16b, v2.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v8.1q, v11.1d, v5.1d \n" + "PMULL2 v9.1q, v11.2d, v5.2d \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "EOR v1.16b, v1.16b, v9.16b \n" + "EXT v11.16b, v11.16b, v11.16b, #8 \n" + "PMULL v9.1q, v11.1d, v5.1d \n" + "PMULL2 v11.1q, v11.2d, v5.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v2.16b, v2.16b, v11.16b, v9.16b \n" +#else + "EOR v11.16b, v11.16b, v9.16b \n" + "EOR v2.16b, v2.16b, v11.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v8.1q, v10.1d, v6.1d \n" + "PMULL2 v9.1q, v10.2d, v6.2d \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "EOR v1.16b, v1.16b, v9.16b \n" + "EXT v10.16b, v10.16b, v10.16b, #8 \n" + "PMULL v9.1q, v10.1d, v6.1d \n" + "PMULL2 v10.1q, v10.2d, v6.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v2.16b, v2.16b, v10.16b, v9.16b \n" +#else + "EOR v10.16b, v10.16b, v9.16b \n" + "EOR v2.16b, v2.16b, v10.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v9.16b, v0.16b, v1.16b, #8 \n" + "PMULL2 v8.1q, v1.2d, v7.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v9.16b, v9.16b, v2.16b, v8.16b \n" +#else + "EOR v9.16b, v9.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v9.16b, v9.16b, v8.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v8.1q, v9.2d, v7.2d \n" + "MOV v0.D[1], v9.D[0] \n" + "EOR v0.16b, v0.16b, v8.16b \n" + "CMP x12, #64 \n" + "BGE 114b \n" + "CBZ x12, 120f \n" + "115: \n" + "CMP x12, #16 \n" + "BLT 112f \n" + "111: \n" + "LD1 {v14.2d}, [%[c]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v14.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v14.16b \n" + "PMULL v10.1q, v0.1d, v3.1d \n" + "PMULL2 v11.1q, v0.2d, v3.2d \n" + "EXT v12.16b, v3.16b, v3.16b, #8 \n" + "PMULL v13.1q, v0.1d, v12.1d \n" + "PMULL2 v12.1q, v0.2d, v12.2d \n" + "EOR v12.16b, v12.16b, v13.16b \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "# Reduce \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v12.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v0.16b, v10.16b, v12.16b \n" + "CMP x12, #16 \n" + "BGE 111b \n" + "CBZ x12, 120f \n" + "112: \n" + "# Partial cipher text \n" + "EOR v14.16b, v14.16b, v14.16b \n" + "MOV x14, x12 \n" + "ST1 {v14.2d}, [%[scratch]] \n" + "113: \n" + "LDRB w13, [%[c]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 113b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v14.2d}, [%[scratch]] \n" + "RBIT v14.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v14.16b \n" + "PMULL v10.1q, v0.1d, v3.1d \n" + "PMULL2 v11.1q, v0.2d, v3.2d \n" + "EXT v12.16b, v3.16b, v3.16b, #8 \n" + "PMULL v13.1q, v0.1d, v12.1d \n" + "PMULL2 v12.1q, v0.2d, v12.2d \n" + "EOR v12.16b, v12.16b, v13.16b \n" + "EXT v13.16b, v10.16b, v11.16b, #8 \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "# Reduce \n" + "PMULL2 v12.1q, v11.2d, v7.2d \n" + "EOR v13.16b, v13.16b, v12.16b \n" + "PMULL2 v12.1q, v13.2d, v7.2d \n" + "MOV v10.D[1], v13.D[0] \n" + "EOR v0.16b, v10.16b, v12.16b \n" + "120: \n" + "RBIT v0.16b, v0.16b \n" + "LSL %x[aSz], %x[aSz], #3 \n" + "LSL %x[cSz], %x[cSz], #3 \n" + "MOV v10.D[0], %x[aSz] \n" + "MOV v10.D[1], %x[cSz] \n" + "REV64 v10.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v10.16b \n" + "ST1 {v0.16b}, [%[scratch]] \n" + : [cSz] "+r" (cSz), [c] "+r" (c), [aSz] "+r" (aSz), [a] "+r" (a) + : [scratch] "r" (scratch), [h] "m" (gcm->H) + : "cc", "memory", "w12", "w13", "x14", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14" + ); - /* Copy the result (minus last GMULT) into s. */ - XMEMCPY(s, x, sSz); + XMEMCPY(s, scratch, sSz); } - #ifdef WOLFSSL_AES_128 /* internal function : see wc_AesGcmEncrypt */ static int Aes128GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) + const byte* iv, word32 ivSz, byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) { - word32 blocks; - word32 partial; byte counter[AES_BLOCK_SIZE]; - byte initialCounter[AES_BLOCK_SIZE]; - byte x[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - Some cases was stack pointer plus offset others was a regester containing - address. To make uniform for passing in to inline assembly code am using - pointers to the head of each local array. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. */ byte* ctr = counter; - byte* iCtr = initialCounter; - byte* xPt = x; - byte* sPt = scratch; - byte* keyPt; /* pointer to handle pointer advencment */ + byte* keyPt = (byte*)aes->key; - XMEMSET(initialCounter, 0, AES_BLOCK_SIZE); + XMEMSET(counter, 0, AES_BLOCK_SIZE); if (ivSz == GCM_NONCE_MID_SZ) { - XMEMCPY(initialCounter, iv, ivSz); - initialCounter[AES_BLOCK_SIZE - 1] = 1; + XMEMCPY(counter, iv, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); - GMULT(initialCounter, aes->H); - } - XMEMCPY(counter, initialCounter, AES_BLOCK_SIZE); - - - /* Hash in the Additional Authentication Data */ - XMEMSET(x, 0, AES_BLOCK_SIZE); - if (authInSz != 0 && authIn != NULL) { - blocks = authInSz / AES_BLOCK_SIZE; - partial = authInSz % AES_BLOCK_SIZE; - /* do as many blocks as possible */ - while (blocks--) { - xorbuf(x, authIn, AES_BLOCK_SIZE); - GMULT(x, aes->H); - authIn += AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, authIn, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->H); - } + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GMULT(counter, aes->gcm.H); } - /* do as many blocks as possible */ - blocks = sz / AES_BLOCK_SIZE; - partial = sz % AES_BLOCK_SIZE; - if (blocks > 0) { - keyPt = (byte*)aes->key; - __asm__ __volatile__ ( - "MOV w11, %w[blocks] \n" - "LD1 {v13.2d}, [%[ctr]] \n" + __asm__ __volatile__ ( + "LD1 {v16.16b}, %[h] \n" + "# v23 = 0x00000000000000870000000000000087 reflected 0xe1.... \n" + "MOVI v23.16b, #0x87 \n" + "EOR v17.16b, v17.16b, v17.16b \n" + "USHR v23.2d, v23.2d, #56 \n" + "CBZ %w[aSz], 120f \n" - "#Create vector with the value 1 \n" - "MOVI v14.16b, #1 \n" - "USHR v14.2d, v14.2d, #56 \n" - "EOR v22.16b, v22.16b, v22.16b \n" - "EXT v14.16b, v14.16b, v22.16b, #8\n" - - - /*************************************************** - Get first out block for GHASH using AES encrypt - ***************************************************/ - "REV64 v13.16b, v13.16b \n" /* network order */ - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "ADD v13.4s, v13.4s, v14.4s \n" /* add 1 to counter */ - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "REV64 v13.16b, v13.16b \n" /* revert from network order */ - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "MOV v0.16b, v13.16b \n" - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v16.2d}, %[inY] \n" - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "SUB w11, w11, #1 \n" - "LD1 {v9.2d-v11.2d}, [%[Key]], #48\n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "MOVI v23.16b, #0x87 \n" - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v17.2d}, [%[inX]] \n" /* account for additional data */ - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "USHR v23.2d, v23.2d, #56 \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v12.2d}, [%[input]], #16 \n" - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "EOR v0.16b, v0.16b, v11.16b \n" - - "EOR v0.16b, v0.16b, v12.16b \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - "MOV v15.16b, v0.16b \n" - - "CBZ w11, 1f \n" /* only one block jump to final GHASH */ - - "LD1 {v12.2d}, [%[input]], #16 \n" - - /*************************************************** - Interweave GHASH and encrypt if more then 1 block - ***************************************************/ - "2: \n" - "REV64 v13.16b, v13.16b \n" /* network order */ - "EOR v15.16b, v17.16b, v15.16b \n" - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "ADD v13.4s, v13.4s, v14.4s \n" /* add 1 to counter */ - "RBIT v15.16b, v15.16b \n" /* v15 is encrypted out block (c) */ - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "REV64 v13.16b, v13.16b \n" /* revert from network order */ - "PMULL v18.1q, v15.1d, v16.1d \n" /* a0 * b0 = C */ - "MOV v0.16b, v13.16b \n" - "PMULL2 v19.1q, v15.2d, v16.2d \n" /* a1 * b1 = D */ - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v20.16b, v16.16b, v16.16b, #8 \n" /* b0b1 -> b1b0 */ - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "PMULL v21.1q, v15.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v15.2d, v20.2d \n" /* a1 * b0 = F */ - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "SUB w11, w11, #1 \n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "PMULL2 v20.1q, v19.2d, v23.2d \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* v22 is all 0's */ - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" - "AESE v0.16b, v10.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "EOR v0.16b, v0.16b, v11.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" - - "EOR v0.16b, v0.16b, v12.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "MOV v15.16b, v0.16b \n" - "RBIT v17.16b, v19.16b \n" - - "CBZ w11, 1f \n" - "LD1 {v12.2d}, [%[input]], #16 \n" - "B 2b \n" - - /*************************************************** - GHASH on last block - ***************************************************/ - "1: \n" - "EOR v15.16b, v17.16b, v15.16b \n" - "RBIT v15.16b, v15.16b \n" /* v15 is encrypted out block */ - - "#store current AES counter value \n" - "ST1 {v13.2d}, [%[ctrOut]] \n" - "PMULL v18.1q, v15.1d, v16.1d \n" /* a0 * b0 = C */ - "PMULL2 v19.1q, v15.2d, v16.2d \n" /* a1 * b1 = D */ - "EXT v20.16b, v16.16b, v16.16b, #8 \n" /* b0b1 -> b1b0 */ - "PMULL v21.1q, v15.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v15.2d, v20.2d \n" /* a1 * b0 = F */ - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - - "#Reduce product from multiplication \n" - "PMULL2 v20.1q, v19.2d, v23.2d \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* v22 is all 0's */ - "EOR v19.16b, v19.16b, v21.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "EOR v18.16b, v18.16b, v21.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "RBIT v17.16b, v19.16b \n" - "STR q17, [%[xOut]] \n" /* GHASH x value for partial blocks */ - - :[out] "=r" (out), "=r" (keyPt), [ctrOut] "=r" (ctr), "=r" (in) - ,[xOut] "=r" (xPt),"=m" (aes->H) - :"0" (out), [Key] "1" (keyPt), [ctr] "2" (ctr), [blocks] "r" (blocks), - [input] "3" (in) - ,[inX] "4" (xPt), [inY] "m" (aes->H) - : "cc", "w11", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14" - ,"v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24" - ); - } + "MOV w12, %w[aSz] \n" - /* take care of partial block sizes leftover */ - if (partial != 0) { - IncrementGcmCounter(counter); - wc_AesEncrypt(aes, counter, scratch); - xorbuf(scratch, in, partial); - XMEMCPY(out, scratch, partial); + "# GHASH AAD \n" + "CMP x12, #64 \n" + "BLT 115f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "114: \n" + "LD1 {v18.2d-v21.2d}, [%[aad]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v30.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v30.16b, #8 \n" + "PMULL2 v14.1q, v30.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "CMP x12, #64 \n" + "BGE 114b \n" + "CBZ x12, 120f \n" + "115: \n" + "CMP x12, #16 \n" + "BLT 112f \n" + "111: \n" + "LD1 {v15.2d}, [%[aad]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "CMP x12, #16 \n" + "BGE 111b \n" + "CBZ x12, 120f \n" + "112: \n" + "# Partial AAD \n" + "EOR v15.16b, v15.16b, v15.16b \n" + "MOV x14, x12 \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "113: \n" + "LDRB w13, [%[aad]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 113b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "120: \n" + + "# Encrypt plaintext and GHASH ciphertext \n" + "LDR w12, [%[ctr], #12] \n" + "MOV w11, %w[sz] \n" + "REV w12, w12 \n" + "CMP w11, #64 \n" + "BLT 80f \n" + "CMP %w[aSz], #64 \n" + "BGE 82f \n" + + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "82: \n" + "# Should we do 8 blocks at a time? \n" + "CMP w11, #512 \n" + "BLT 80f \n" + + "# Calculate H^[5-8] - GMULT partials \n" + "# Multiply H and H^4 => H^5 \n" + "PMULL v18.1q, v26.1d, v16.1d \n" + "PMULL2 v19.1q, v26.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v26.1d, v20.1d \n" + "PMULL2 v20.1q, v26.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v9.16b, v18.16b, v20.16b \n" + "# Square H^3 - H^6 \n" + "PMULL2 v19.1q, v25.2d, v25.2d \n" + "PMULL v18.1q, v25.1d, v25.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v10.16b, v18.16b, v19.16b \n" + "# Multiply H and H^6 => H^7 \n" + "PMULL v18.1q, v10.1d, v16.1d \n" + "PMULL2 v19.1q, v10.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v10.1d, v20.1d \n" + "PMULL2 v20.1q, v10.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v11.16b, v18.16b, v20.16b \n" + "# Square H^4 => H^8 \n" + "PMULL2 v19.1q, v26.2d, v26.2d \n" + "PMULL v18.1q, v26.1d, v26.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v4.16b, v18.16b, v19.16b \n" + + "# First encrypt - no GHASH \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v12.16b, v12.16b, v5.16b \n" + "EOR v13.16b, v13.16b, v6.16b \n" + "EOR v14.16b, v14.16b, v7.16b \n" + "EOR v15.16b, v15.16b, v8.16b \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "ST1 {v12.2d-v15.2d}, [%[out]], #64 \n \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + + "81: \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "REV w15, w15 \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "REV w14, w14 \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "REV w13, w13 \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "REV w15, w15 \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "REV w14, w14 \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "REV w13, w13 \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v9.1d \n" + "PMULL2 v3.1q, v15.2d, v9.2d \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "PMULL v3.1q, v15.1d, v9.1d \n" + "PMULL2 v15.1q, v15.2d, v9.2d \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v10.1d \n" + "PMULL2 v3.1q, v14.2d, v10.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v3.1q, v14.1d, v10.1d \n" + "PMULL2 v14.1q, v14.2d, v10.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v11.1d \n" + "PMULL2 v3.1q, v13.2d, v11.2d \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL v3.1q, v13.1d, v11.1d \n" + "PMULL2 v13.1q, v13.2d, v11.2d \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v4.1d \n" + "PMULL2 v3.1q, v12.2d, v4.2d \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v3.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v12.16b, v12.16b, v5.16b \n" + "EOR v13.16b, v13.16b, v6.16b \n" + "EOR v14.16b, v14.16b, v7.16b \n" + "EOR v15.16b, v15.16b, v8.16b \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "ST1 {v12.2d-v15.2d}, [%[out]], #64 \n \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + + "CMP w11, #128 \n" + "BGE 81b \n" + + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v9.1d \n" + "PMULL2 v3.1q, v15.2d, v9.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "PMULL v3.1q, v15.1d, v9.1d \n" + "PMULL2 v15.1q, v15.2d, v9.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v10.1d \n" + "PMULL2 v3.1q, v14.2d, v10.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "PMULL v3.1q, v14.1d, v10.1d \n" + "PMULL2 v14.1q, v14.2d, v10.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v11.1d \n" + "PMULL2 v3.1q, v13.2d, v11.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v3.1q, v13.1d, v11.1d \n" + "PMULL2 v13.1q, v13.2d, v11.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v4.1d \n" + "PMULL2 v3.1q, v12.2d, v4.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v3.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "EOR v17.16b, v17.16b, v2.16b \n" - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, out, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->H); - } + "80: \n" + "LD1 {v22.2d}, [%[ctr]] \n" + "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" + "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" + "LD1 {v9.2d-v11.2d}, [%[Key]], #48 \n" + "# Can we do 4 blocks at a time? \n" + "CMP w11, #64 \n" + "BLT 10f \n" + + "# First encrypt - no GHASH \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "EOR v27.16b, v27.16b, v11.16b \n" + "AESE v28.16b, v10.16b \n" + "EOR v28.16b, v28.16b, v11.16b \n" + "AESE v29.16b, v10.16b \n" + "EOR v29.16b, v29.16b, v11.16b \n" + "AESE v30.16b, v10.16b \n" + "EOR v30.16b, v30.16b, v11.16b \n" + + "# XOR in input \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "# Store cipher text \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BLT 12f \n" + + "11: \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "REV w15, w15 \n" + "RBIT v19.16b, v19.16b \n" + "REV w14, w14 \n" + "RBIT v20.16b, v20.16b \n" + "REV w13, w13 \n" + "RBIT v21.16b, v21.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "EOR v27.16b, v27.16b, v11.16b \n" + "AESE v28.16b, v10.16b \n" + "EOR v28.16b, v28.16b, v11.16b \n" + "AESE v29.16b, v10.16b \n" + "EOR v29.16b, v29.16b, v11.16b \n" + "AESE v30.16b, v10.16b \n" + "EOR v30.16b, v30.16b, v11.16b \n" + + "# XOR in input \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "# Store cipher text \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BGE 11b \n" + + "12: \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" - /* Hash in the lengths of A and C in bits */ - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - FlattenSzInBits(&scratch[0], authInSz); - FlattenSzInBits(&scratch[8], sz); - xorbuf(x, scratch, AES_BLOCK_SIZE); - XMEMCPY(scratch, x, AES_BLOCK_SIZE); + "10: \n" + "CBZ w11, 30f \n" + "CMP w11, #16 \n" + "BLT 20f \n" + "# Encrypt first block for GHASH \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v31.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[out]], #16 \n" - keyPt = (byte*)aes->key; - __asm__ __volatile__ ( + "# When only one full block to encrypt go straight to GHASH \n" + "CMP w11, 16 \n" + "BLT 1f \n" - "LD1 {v16.16b}, [%[tag]] \n" - "LD1 {v17.16b}, %[h] \n" - "RBIT v16.16b, v16.16b \n" + "LD1 {v31.2d}, [%[input]], #16 \n" - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - "PMULL v18.1q, v16.1d, v17.1d \n" /* a0 * b0 = C */ - "PMULL2 v19.1q, v16.2d, v17.2d \n" /* a1 * b1 = D */ - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "EXT v20.16b, v17.16b, v17.16b, #8 \n" /* b0b1 -> b1b0 */ - "LD1 {v9.2d-v11.2d}, [%[Key]], #48\n" - "PMULL v21.1q, v16.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v16.2d, v20.2d \n" /* a1 * b0 = F */ - "LD1 {v0.2d}, [%[ctr]] \n" - - "#Set a register to all 0s using EOR \n" - "EOR v22.16b, v22.16b, v22.16b \n" - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "AESE v0.16b, v1.16b \n" + "# Interweave GHASH and encrypt if more then 1 block \n" + "2: \n" + "RBIT v15.16b, v15.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "AESE v0.16b, v2.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "AESE v0.16b, v3.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - "MOVI v23.16b, #0x87 \n" - "AESE v0.16b, v4.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" "AESMC v0.16b, v0.16b \n" - "USHR v23.2d, v23.2d, #56 \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[out]], #16 \n" + "CMP w11, 16 \n" + "BLT 1f \n" + + "LD1 {v31.2d}, [%[input]], #16 \n" + "B 2b \n" + + "# GHASH on last block \n" + "1: \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" "PMULL2 v20.1q, v19.2d, v23.2d \n" - "AESE v0.16b, v5.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "20: \n" + "CBZ w11, 30f \n" + "EOR v31.16b, v31.16b, v31.16b \n" + "MOV x15, x11 \n" + "ST1 {v31.2d}, [%[scratch]] \n" + "23: \n" + "LDRB w14, [%[input]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 23b \n" + "SUB %[scratch], %[scratch], x11 \n" + "LD1 {v31.2d}, [%[scratch]] \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v5.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" - "AESE v0.16b, v6.16b \n" + "AESE v0.16b, v6.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" - "AESE v0.16b, v7.16b \n" + "AESE v0.16b, v7.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "AESE v0.16b, v8.16b \n" + "AESE v0.16b, v8.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" - "AESE v0.16b, v9.16b \n" + "AESE v0.16b, v9.16b \n" "AESMC v0.16b, v0.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "EOR v19.16b, v18.16b, v20.16b \n" "AESE v0.16b, v10.16b \n" - "RBIT v19.16b, v19.16b \n" - "EOR v0.16b, v0.16b, v11.16b \n" - "EOR v19.16b, v19.16b, v0.16b \n" - "STR q19, [%[out]] \n" - - :[out] "=r" (sPt), "=r" (keyPt), "=r" (iCtr) - :[tag] "0" (sPt), [Key] "1" (keyPt), - [ctr] "2" (iCtr) , [h] "m" (aes->H) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10","v11","v12","v13","v14", - "v15", "v16", "v17","v18", "v19", "v20","v21","v22","v23","v24" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "MOV x15, x11 \n" + "24: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[out]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 24b \n" + "MOV x15, #16 \n" + "EOR w14, w14, w14 \n" + "SUB x15, x15, x11 \n" + "25: \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 25b \n" + "SUB %[scratch], %[scratch], #16 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "30: \n" + "# store current counter value at the end \n" + "REV w13, w12 \n" + "MOV v22.S[3], w13 \n" + "LD1 {v0.2d}, [%[ctr]] \n" + "ST1 {v22.2d}, [%[ctr]] \n" + + "LSL %x[aSz], %x[aSz], #3 \n" + "LSL %x[sz], %x[sz], #3 \n" + "MOV v15.d[0], %x[aSz] \n" + "MOV v15.d[1], %x[sz] \n" + "REV64 v15.16b, v15.16b \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "RBIT v17.16b, v17.16b \n" + "EOR v0.16b, v0.16b, v17.16b \n \n" + "CMP %w[tagSz], #16 \n" + "BNE 40f \n" + "ST1 {v0.2d}, [%[tag]] \n" + "B 41f \n" + "40: \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV x15, %x[tagSz] \n" + "44: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[tag]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 44b \n" + "SUB %[scratch], %[scratch], %x[tagSz] \n" + "41: \n" + + : [out] "+r" (out), [input] "+r" (in), [Key] "+r" (keyPt), + [aSz] "+r" (authInSz), [sz] "+r" (sz), [aad] "+r" (authIn) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "m" (aes->gcm.H), [tag] "r" (authTag), [tagSz] "r" (authTagSz) + : "cc", "memory", "x11", "x12", "w13", "x14", "x15", "w16", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" ); - if (authTagSz > AES_BLOCK_SIZE) { - XMEMCPY(authTag, scratch, AES_BLOCK_SIZE); - } - else { - /* authTagSz can be smaller than AES_BLOCK_SIZE */ - XMEMCPY(authTag, scratch, authTagSz); - } return 0; } #endif /* WOLFSSL_AES_128 */ - #ifdef WOLFSSL_AES_192 /* internal function : see wc_AesGcmEncrypt */ static int Aes192GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) + const byte* iv, word32 ivSz, byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) { - word32 blocks; - word32 partial; byte counter[AES_BLOCK_SIZE]; - byte initialCounter[AES_BLOCK_SIZE]; - byte x[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - Some cases was stack pointer plus offset others was a regester containing - address. To make uniform for passing in to inline assembly code am using - pointers to the head of each local array. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. */ byte* ctr = counter; - byte* iCtr = initialCounter; - byte* xPt = x; - byte* sPt = scratch; - byte* keyPt; /* pointer to handle pointer advencment */ + byte* keyPt = (byte*)aes->key; - XMEMSET(initialCounter, 0, AES_BLOCK_SIZE); + XMEMSET(counter, 0, AES_BLOCK_SIZE); if (ivSz == GCM_NONCE_MID_SZ) { - XMEMCPY(initialCounter, iv, ivSz); - initialCounter[AES_BLOCK_SIZE - 1] = 1; + XMEMCPY(counter, iv, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); - GMULT(initialCounter, aes->H); - } - XMEMCPY(counter, initialCounter, AES_BLOCK_SIZE); - - - /* Hash in the Additional Authentication Data */ - XMEMSET(x, 0, AES_BLOCK_SIZE); - if (authInSz != 0 && authIn != NULL) { - blocks = authInSz / AES_BLOCK_SIZE; - partial = authInSz % AES_BLOCK_SIZE; - /* do as many blocks as possible */ - while (blocks--) { - xorbuf(x, authIn, AES_BLOCK_SIZE); - GMULT(x, aes->H); - authIn += AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, authIn, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->H); - } + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GMULT(counter, aes->gcm.H); } - /* do as many blocks as possible */ - blocks = sz / AES_BLOCK_SIZE; - partial = sz % AES_BLOCK_SIZE; - if (blocks > 0) { - keyPt = (byte*)aes->key; - __asm__ __volatile__ ( - "MOV w11, %w[blocks] \n" - "LD1 {v13.2d}, [%[ctr]] \n" + __asm__ __volatile__ ( + "LD1 {v16.16b}, %[h] \n" + "# v23 = 0x00000000000000870000000000000087 reflected 0xe1.... \n" + "MOVI v23.16b, #0x87 \n" + "EOR v17.16b, v17.16b, v17.16b \n" + "USHR v23.2d, v23.2d, #56 \n" + "CBZ %w[aSz], 120f \n" - "#Create vector with the value 1 \n" - "MOVI v14.16b, #1 \n" - "USHR v14.2d, v14.2d, #56 \n" - "EOR v22.16b, v22.16b, v22.16b \n" - "EXT v14.16b, v14.16b, v22.16b, #8\n" - - - /*************************************************** - Get first out block for GHASH using AES encrypt - ***************************************************/ - "REV64 v13.16b, v13.16b \n" /* network order */ - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "ADD v13.4s, v13.4s, v14.4s \n" /* add 1 to counter */ - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "REV64 v13.16b, v13.16b \n" /* revert from network order */ - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "MOV v0.16b, v13.16b \n" - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v16.2d}, %[inY] \n" - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "SUB w11, w11, #1 \n" - "LD1 {v9.2d-v11.2d}, [%[Key]], #48\n" - "LD1 {v30.2d-v31.2d}, [%[Key]], #32\n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "MOVI v23.16b, #0x87 \n" - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v17.2d}, [%[inX]] \n" /* account for additional data */ - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "USHR v23.2d, v23.2d, #56 \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v12.2d}, [%[input]], #16 \n" - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v30.16b \n" - "EOR v0.16b, v0.16b, v31.16b \n" - - "EOR v0.16b, v0.16b, v12.16b \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - "MOV v15.16b, v0.16b \n" - - "CBZ w11, 1f \n" /* only one block jump to final GHASH */ - "LD1 {v12.2d}, [%[input]], #16 \n" - - /*************************************************** - Interweave GHASH and encrypt if more then 1 block - ***************************************************/ - "2: \n" - "REV64 v13.16b, v13.16b \n" /* network order */ - "EOR v15.16b, v17.16b, v15.16b \n" - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "ADD v13.4s, v13.4s, v14.4s \n" /* add 1 to counter */ - "RBIT v15.16b, v15.16b \n" /* v15 is encrypted out block (c) */ - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "REV64 v13.16b, v13.16b \n" /* revert from network order */ - "PMULL v18.1q, v15.1d, v16.1d \n" /* a0 * b0 = C */ - "MOV v0.16b, v13.16b \n" - "PMULL2 v19.1q, v15.2d, v16.2d \n" /* a1 * b1 = D */ - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v20.16b, v16.16b, v16.16b, #8 \n" /* b0b1 -> b1b0 */ - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "PMULL v21.1q, v15.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v15.2d, v20.2d \n" /* a1 * b0 = F */ - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "SUB w11, w11, #1 \n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "PMULL2 v20.1q, v19.2d, v23.2d \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* v22 is all 0's */ - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" - "AESE v0.16b, v30.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "EOR v0.16b, v0.16b, v31.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" - - "EOR v0.16b, v0.16b, v12.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "MOV v15.16b, v0.16b \n" - "RBIT v17.16b, v19.16b \n" - - "CBZ w11, 1f \n" - "LD1 {v12.2d}, [%[input]], #16 \n" - "B 2b \n" - - /*************************************************** - GHASH on last block - ***************************************************/ - "1: \n" - "EOR v15.16b, v17.16b, v15.16b \n" - "RBIT v15.16b, v15.16b \n" /* v15 is encrypted out block */ - - "#store current AES counter value \n" - "ST1 {v13.2d}, [%[ctrOut]] \n" - "PMULL v18.1q, v15.1d, v16.1d \n" /* a0 * b0 = C */ - "PMULL2 v19.1q, v15.2d, v16.2d \n" /* a1 * b1 = D */ - "EXT v20.16b, v16.16b, v16.16b, #8 \n" /* b0b1 -> b1b0 */ - "PMULL v21.1q, v15.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v15.2d, v20.2d \n" /* a1 * b0 = F */ - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - - "#Reduce product from multiplication \n" - "PMULL2 v20.1q, v19.2d, v23.2d \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* v22 is all 0's */ - "EOR v19.16b, v19.16b, v21.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "EOR v18.16b, v18.16b, v21.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "RBIT v17.16b, v19.16b \n" - "STR q17, [%[xOut]] \n" /* GHASH x value for partial blocks */ - - :[out] "=r" (out), "=r" (keyPt), [ctrOut] "=r" (ctr), "=r" (in) - ,[xOut] "=r" (xPt),"=m" (aes->H) - :"0" (out), [Key] "1" (keyPt), [ctr] "2" (ctr), [blocks] "r" (blocks), - [input] "3" (in) - ,[inX] "4" (xPt), [inY] "m" (aes->H) - : "cc", "w11", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14" - ,"v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", - "v24","v25","v26","v27","v28","v29","v30","v31" - ); - } + "MOV w12, %w[aSz] \n" - /* take care of partial block sizes leftover */ - if (partial != 0) { - IncrementGcmCounter(counter); - wc_AesEncrypt(aes, counter, scratch); - xorbuf(scratch, in, partial); - XMEMCPY(out, scratch, partial); + "# GHASH AAD \n" + "CMP x12, #64 \n" + "BLT 115f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "114: \n" + "LD1 {v18.2d-v21.2d}, [%[aad]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v30.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v30.16b, #8 \n" + "PMULL2 v14.1q, v30.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "CMP x12, #64 \n" + "BGE 114b \n" + "CBZ x12, 120f \n" + "115: \n" + "CMP x12, #16 \n" + "BLT 112f \n" + "111: \n" + "LD1 {v15.2d}, [%[aad]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "CMP x12, #16 \n" + "BGE 111b \n" + "CBZ x12, 120f \n" + "112: \n" + "# Partial AAD \n" + "EOR v15.16b, v15.16b, v15.16b \n" + "MOV x14, x12 \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "113: \n" + "LDRB w13, [%[aad]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 113b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "120: \n" + + "# Encrypt plaintext and GHASH ciphertext \n" + "LDR w12, [%[ctr], #12] \n" + "MOV w11, %w[sz] \n" + "REV w12, w12 \n" + "CMP w11, #64 \n" + "BLT 80f \n" + "CMP %w[aSz], #64 \n" + "BGE 82f \n" + + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "82: \n" + "# Should we do 8 blocks at a time? \n" + "CMP w11, #512 \n" + "BLT 80f \n" + + "# Calculate H^[5-8] - GMULT partials \n" + "# Multiply H and H^4 => H^5 \n" + "PMULL v18.1q, v26.1d, v16.1d \n" + "PMULL2 v19.1q, v26.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v26.1d, v20.1d \n" + "PMULL2 v20.1q, v26.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v9.16b, v18.16b, v20.16b \n" + "# Square H^3 - H^6 \n" + "PMULL2 v19.1q, v25.2d, v25.2d \n" + "PMULL v18.1q, v25.1d, v25.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v10.16b, v18.16b, v19.16b \n" + "# Multiply H and H^6 => H^7 \n" + "PMULL v18.1q, v10.1d, v16.1d \n" + "PMULL2 v19.1q, v10.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v10.1d, v20.1d \n" + "PMULL2 v20.1q, v10.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v11.16b, v18.16b, v20.16b \n" + "# Square H^4 => H^8 \n" + "PMULL2 v19.1q, v26.2d, v26.2d \n" + "PMULL v18.1q, v26.1d, v26.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v4.16b, v18.16b, v19.16b \n" + + "# First encrypt - no GHASH \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v12.16b, v12.16b, v5.16b \n" + "EOR v13.16b, v13.16b, v6.16b \n" + "EOR v14.16b, v14.16b, v7.16b \n" + "EOR v15.16b, v15.16b, v8.16b \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "ST1 {v12.2d-v15.2d}, [%[out]], #64 \n \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + + "81: \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "REV w15, w15 \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "REV w14, w14 \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "REV w13, w13 \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "REV w15, w15 \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "REV w14, w14 \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "REV w13, w13 \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v9.1d \n" + "PMULL2 v3.1q, v15.2d, v9.2d \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "PMULL v3.1q, v15.1d, v9.1d \n" + "PMULL2 v15.1q, v15.2d, v9.2d \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v10.1d \n" + "PMULL2 v3.1q, v14.2d, v10.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v3.1q, v14.1d, v10.1d \n" + "PMULL2 v14.1q, v14.2d, v10.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v11.1d \n" + "PMULL2 v3.1q, v13.2d, v11.2d \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL v3.1q, v13.1d, v11.1d \n" + "PMULL2 v13.1q, v13.2d, v11.2d \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v4.1d \n" + "PMULL2 v3.1q, v12.2d, v4.2d \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v3.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v12.16b, v12.16b, v5.16b \n" + "EOR v13.16b, v13.16b, v6.16b \n" + "EOR v14.16b, v14.16b, v7.16b \n" + "EOR v15.16b, v15.16b, v8.16b \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "ST1 {v12.2d-v15.2d}, [%[out]], #64 \n \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + + "CMP w11, #128 \n" + "BGE 81b \n" + + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v9.1d \n" + "PMULL2 v3.1q, v15.2d, v9.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "PMULL v3.1q, v15.1d, v9.1d \n" + "PMULL2 v15.1q, v15.2d, v9.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v10.1d \n" + "PMULL2 v3.1q, v14.2d, v10.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "PMULL v3.1q, v14.1d, v10.1d \n" + "PMULL2 v14.1q, v14.2d, v10.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v11.1d \n" + "PMULL2 v3.1q, v13.2d, v11.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v3.1q, v13.1d, v11.1d \n" + "PMULL2 v13.1q, v13.2d, v11.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v4.1d \n" + "PMULL2 v3.1q, v12.2d, v4.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v3.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "EOR v17.16b, v17.16b, v2.16b \n" - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, out, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->H); - } + "80: \n" + "LD1 {v22.2d}, [%[ctr]] \n" + "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" + "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" + "LD1 {v9.2d-v11.2d}, [%[Key]], #48 \n" + "LD1 {v12.2d-v13.2d}, [%[Key]], #32 \n" + "# Can we do 4 blocks at a time? \n" + "CMP w11, #64 \n" + "BLT 10f \n" + + "# First encrypt - no GHASH \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v12.16b \n" + "EOR v27.16b, v27.16b, v13.16b \n" + "AESE v28.16b, v12.16b \n" + "EOR v28.16b, v28.16b, v13.16b \n" + "AESE v29.16b, v12.16b \n" + "EOR v29.16b, v29.16b, v13.16b \n" + "AESE v30.16b, v12.16b \n" + "EOR v30.16b, v30.16b, v13.16b \n" + + "# XOR in input \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "# Store cipher text \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BLT 12f \n" + + "11: \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "REV w15, w15 \n" + "RBIT v19.16b, v19.16b \n" + "REV w14, w14 \n" + "RBIT v20.16b, v20.16b \n" + "REV w13, w13 \n" + "RBIT v21.16b, v21.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v12.16b \n" + "EOR v27.16b, v27.16b, v13.16b \n" + "AESE v28.16b, v12.16b \n" + "EOR v28.16b, v28.16b, v13.16b \n" + "AESE v29.16b, v12.16b \n" + "EOR v29.16b, v29.16b, v13.16b \n" + "AESE v30.16b, v12.16b \n" + "EOR v30.16b, v30.16b, v13.16b \n" + + "# XOR in input \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "# Store cipher text \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BGE 11b \n" + + "12: \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" - /* Hash in the lengths of A and C in bits */ - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - FlattenSzInBits(&scratch[0], authInSz); - FlattenSzInBits(&scratch[8], sz); - xorbuf(x, scratch, AES_BLOCK_SIZE); - XMEMCPY(scratch, x, AES_BLOCK_SIZE); + "10: \n" + "CBZ w11, 30f \n" + "CMP w11, #16 \n" + "BLT 20f \n" + "# Encrypt first block for GHASH \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v31.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[out]], #16 \n" - keyPt = (byte*)aes->key; - __asm__ __volatile__ ( + "# When only one full block to encrypt go straight to GHASH \n" + "CMP w11, 16 \n" + "BLT 1f \n" - "LD1 {v16.16b}, [%[tag]] \n" - "LD1 {v17.16b}, %[h] \n" - "RBIT v16.16b, v16.16b \n" + "LD1 {v31.2d}, [%[input]], #16 \n" - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - "PMULL v18.1q, v16.1d, v17.1d \n" /* a0 * b0 = C */ - "PMULL2 v19.1q, v16.2d, v17.2d \n" /* a1 * b1 = D */ - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "EXT v20.16b, v17.16b, v17.16b, #8 \n" /* b0b1 -> b1b0 */ - "LD1 {v9.2d-v11.2d}, [%[Key]], #48\n" - "LD1 {v30.2d-v31.2d}, [%[Key]], #32\n" - "PMULL v21.1q, v16.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v16.2d, v20.2d \n" /* a1 * b0 = F */ - "LD1 {v0.2d}, [%[ctr]] \n" - - "#Set a register to all 0s using EOR \n" - "EOR v22.16b, v22.16b, v22.16b \n" - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "AESE v0.16b, v1.16b \n" + "# Interweave GHASH and encrypt if more then 1 block \n" + "2: \n" + "RBIT v15.16b, v15.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "AESE v0.16b, v2.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "AESE v0.16b, v3.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - "MOVI v23.16b, #0x87 \n" - "AESE v0.16b, v4.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" "AESMC v0.16b, v0.16b \n" - "USHR v23.2d, v23.2d, #56 \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[out]], #16 \n" + "CMP w11, 16 \n" + "BLT 1f \n" + + "LD1 {v31.2d}, [%[input]], #16 \n" + "B 2b \n" + + "# GHASH on last block \n" + "1: \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" "PMULL2 v20.1q, v19.2d, v23.2d \n" - "AESE v0.16b, v5.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "20: \n" + "CBZ w11, 30f \n" + "EOR v31.16b, v31.16b, v31.16b \n" + "MOV x15, x11 \n" + "ST1 {v31.2d}, [%[scratch]] \n" + "23: \n" + "LDRB w14, [%[input]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 23b \n" + "SUB %[scratch], %[scratch], x11 \n" + "LD1 {v31.2d}, [%[scratch]] \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v5.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" - "AESE v0.16b, v6.16b \n" + "AESE v0.16b, v6.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" - "AESE v0.16b, v7.16b \n" + "AESE v0.16b, v7.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "AESE v0.16b, v8.16b \n" + "AESE v0.16b, v8.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" - "AESE v0.16b, v9.16b \n" + "AESE v0.16b, v9.16b \n" "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" + "AESE v0.16b, v10.16b \n" "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" + "AESE v0.16b, v11.16b \n" "AESMC v0.16b, v0.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "AESE v0.16b, v30.16b \n" - "RBIT v19.16b, v19.16b \n" - "EOR v0.16b, v0.16b, v31.16b \n" - "EOR v19.16b, v19.16b, v0.16b \n" - "STR q19, [%[out]] \n" - - :[out] "=r" (sPt), "=r" (keyPt), "=r" (iCtr) - :[tag] "0" (sPt), [Key] "1" (keyPt), - [ctr] "2" (iCtr) , [h] "m" (aes->H) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10","v11","v12","v13","v14", - "v15", "v16", "v17","v18", "v19", "v20","v21","v22","v23","v24" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "MOV x15, x11 \n" + "24: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[out]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 24b \n" + "MOV x15, #16 \n" + "EOR w14, w14, w14 \n" + "SUB x15, x15, x11 \n" + "25: \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 25b \n" + "SUB %[scratch], %[scratch], #16 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "30: \n" + "# store current counter value at the end \n" + "REV w13, w12 \n" + "MOV v22.S[3], w13 \n" + "LD1 {v0.2d}, [%[ctr]] \n" + "ST1 {v22.2d}, [%[ctr]] \n" + + "LSL %x[aSz], %x[aSz], #3 \n" + "LSL %x[sz], %x[sz], #3 \n" + "MOV v15.d[0], %x[aSz] \n" + "MOV v15.d[1], %x[sz] \n" + "REV64 v15.16b, v15.16b \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "RBIT v17.16b, v17.16b \n" + "EOR v0.16b, v0.16b, v17.16b \n \n" + "CMP %w[tagSz], #16 \n" + "BNE 40f \n" + "ST1 {v0.2d}, [%[tag]] \n" + "B 41f \n" + "40: \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV x15, %x[tagSz] \n" + "44: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[tag]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 44b \n" + "SUB %[scratch], %[scratch], %x[tagSz] \n" + "41: \n" + + : [out] "+r" (out), [input] "+r" (in), [Key] "+r" (keyPt), + [aSz] "+r" (authInSz), [sz] "+r" (sz), [aad] "+r" (authIn) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "m" (aes->gcm.H), [tag] "r" (authTag), [tagSz] "r" (authTagSz) + : "cc", "memory", "x11", "x12", "w13", "x14", "x15", "w16", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" ); - if (authTagSz > AES_BLOCK_SIZE) { - XMEMCPY(authTag, scratch, AES_BLOCK_SIZE); - } - else { - /* authTagSz can be smaller than AES_BLOCK_SIZE */ - XMEMCPY(authTag, scratch, authTagSz); - } - return 0; } #endif /* WOLFSSL_AES_192 */ - #ifdef WOLFSSL_AES_256 /* internal function : see wc_AesGcmEncrypt */ static int Aes256GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) + const byte* iv, word32 ivSz, byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) { - word32 blocks; - word32 partial; byte counter[AES_BLOCK_SIZE]; - byte initialCounter[AES_BLOCK_SIZE]; - byte x[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE]; - /* Noticed different optimization levels treated head of array different. - Some cases was stack pointer plus offset others was a regester containing - address. To make uniform for passing in to inline assembly code am using - pointers to the head of each local array. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. */ byte* ctr = counter; - byte* iCtr = initialCounter; - byte* xPt = x; - byte* sPt = scratch; - byte* keyPt; /* pointer to handle pointer advencment */ + byte* keyPt = (byte*)aes->key; - XMEMSET(initialCounter, 0, AES_BLOCK_SIZE); + XMEMSET(counter, 0, AES_BLOCK_SIZE); if (ivSz == GCM_NONCE_MID_SZ) { - XMEMCPY(initialCounter, iv, ivSz); - initialCounter[AES_BLOCK_SIZE - 1] = 1; + XMEMCPY(counter, iv, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); - GMULT(initialCounter, aes->H); - } - XMEMCPY(counter, initialCounter, AES_BLOCK_SIZE); - - - /* Hash in the Additional Authentication Data */ - XMEMSET(x, 0, AES_BLOCK_SIZE); - if (authInSz != 0 && authIn != NULL) { - blocks = authInSz / AES_BLOCK_SIZE; - partial = authInSz % AES_BLOCK_SIZE; - /* do as many blocks as possible */ - while (blocks--) { - xorbuf(x, authIn, AES_BLOCK_SIZE); - GMULT(x, aes->H); - authIn += AES_BLOCK_SIZE; - } - if (partial != 0) { - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, authIn, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->H); - } + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GMULT(counter, aes->gcm.H); } - /* do as many blocks as possible */ - blocks = sz / AES_BLOCK_SIZE; - partial = sz % AES_BLOCK_SIZE; - if (blocks > 0) { - keyPt = (byte*)aes->key; - __asm__ __volatile__ ( - "MOV w11, %w[blocks] \n" - "LD1 {v13.2d}, [%[ctr]] \n" + __asm__ __volatile__ ( + "LD1 {v16.16b}, %[h] \n" + "# v23 = 0x00000000000000870000000000000087 reflected 0xe1.... \n" + "MOVI v23.16b, #0x87 \n" + "EOR v17.16b, v17.16b, v17.16b \n" + "USHR v23.2d, v23.2d, #56 \n" + "CBZ %w[aSz], 120f \n" - "#Create vector with the value 1 \n" - "MOVI v14.16b, #1 \n" - "USHR v14.2d, v14.2d, #56 \n" - "EOR v22.16b, v22.16b, v22.16b \n" - "EXT v14.16b, v14.16b, v22.16b, #8\n" - - - /*************************************************** - Get first out block for GHASH using AES encrypt - ***************************************************/ - "REV64 v13.16b, v13.16b \n" /* network order */ - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "ADD v13.4s, v13.4s, v14.4s \n" /* add 1 to counter */ - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "REV64 v13.16b, v13.16b \n" /* revert from network order */ - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "MOV v0.16b, v13.16b \n" - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v16.2d}, %[inY] \n" - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "SUB w11, w11, #1 \n" - "LD1 {v9.2d-v11.2d}, [%[Key]], #48\n" - "LD1 {v28.2d-v31.2d}, [%[Key]], #64\n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "MOVI v23.16b, #0x87 \n" - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v17.2d}, [%[inX]] \n" /* account for additional data */ - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "USHR v23.2d, v23.2d, #56 \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "LD1 {v12.2d}, [%[input]], #16 \n" - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v28.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v29.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v30.16b \n" - "EOR v0.16b, v0.16b, v31.16b \n" - - "EOR v0.16b, v0.16b, v12.16b \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - "MOV v15.16b, v0.16b \n" - - "CBZ w11, 1f \n" /* only one block jump to final GHASH */ - "LD1 {v12.2d}, [%[input]], #16 \n" - - /*************************************************** - Interweave GHASH and encrypt if more then 1 block - ***************************************************/ - "2: \n" - "REV64 v13.16b, v13.16b \n" /* network order */ - "EOR v15.16b, v17.16b, v15.16b \n" - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "ADD v13.4s, v13.4s, v14.4s \n" /* add 1 to counter */ - "RBIT v15.16b, v15.16b \n" /* v15 is encrypted out block (c) */ - "EXT v13.16b, v13.16b, v13.16b, #8 \n" - "REV64 v13.16b, v13.16b \n" /* revert from network order */ - "PMULL v18.1q, v15.1d, v16.1d \n" /* a0 * b0 = C */ - "MOV v0.16b, v13.16b \n" - "PMULL2 v19.1q, v15.2d, v16.2d \n" /* a1 * b1 = D */ - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v20.16b, v16.16b, v16.16b, #8 \n" /* b0b1 -> b1b0 */ - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "PMULL v21.1q, v15.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v15.2d, v20.2d \n" /* a1 * b0 = F */ - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "SUB w11, w11, #1 \n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "PMULL2 v20.1q, v19.2d, v23.2d \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* v22 is all 0's */ - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v28.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v29.16b \n" - "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" - "AESE v0.16b, v30.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "EOR v0.16b, v0.16b, v31.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" - - "EOR v0.16b, v0.16b, v12.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "MOV v15.16b, v0.16b \n" - "RBIT v17.16b, v19.16b \n" - - "CBZ w11, 1f \n" - "LD1 {v12.2d}, [%[input]], #16 \n" - "B 2b \n" - - /*************************************************** - GHASH on last block - ***************************************************/ - "1: \n" - "EOR v15.16b, v17.16b, v15.16b \n" - "RBIT v15.16b, v15.16b \n" /* v15 is encrypted out block */ - - "#store current AES counter value \n" - "ST1 {v13.2d}, [%[ctrOut]] \n" - "PMULL v18.1q, v15.1d, v16.1d \n" /* a0 * b0 = C */ - "PMULL2 v19.1q, v15.2d, v16.2d \n" /* a1 * b1 = D */ - "EXT v20.16b, v16.16b, v16.16b, #8 \n" /* b0b1 -> b1b0 */ - "PMULL v21.1q, v15.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v15.2d, v20.2d \n" /* a1 * b0 = F */ - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - - "#Reduce product from multiplication \n" - "PMULL2 v20.1q, v19.2d, v23.2d \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* v22 is all 0's */ - "EOR v19.16b, v19.16b, v21.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "EOR v18.16b, v18.16b, v21.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "RBIT v17.16b, v19.16b \n" - "STR q17, [%[xOut]] \n" /* GHASH x value for partial blocks */ - - :[out] "=r" (out), "=r" (keyPt), [ctrOut] "=r" (ctr), "=r" (in) - ,[xOut] "=r" (xPt),"=m" (aes->H) - :"0" (out), [Key] "1" (keyPt), [ctr] "2" (ctr), [blocks] "r" (blocks), - [input] "3" (in) - ,[inX] "4" (xPt), [inY] "m" (aes->H) - : "cc", "w11", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14" - ,"v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24" - ); - } + "MOV w12, %w[aSz] \n" - /* take care of partial block sizes leftover */ - if (partial != 0) { - IncrementGcmCounter(counter); - wc_AesEncrypt(aes, counter, scratch); - xorbuf(scratch, in, partial); - XMEMCPY(out, scratch, partial); + "# GHASH AAD \n" + "CMP x12, #64 \n" + "BLT 115f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "114: \n" + "LD1 {v18.2d-v21.2d}, [%[aad]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v30.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v30.16b, #8 \n" + "PMULL2 v14.1q, v30.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "CMP x12, #64 \n" + "BGE 114b \n" + "CBZ x12, 120f \n" + "115: \n" + "CMP x12, #16 \n" + "BLT 112f \n" + "111: \n" + "LD1 {v15.2d}, [%[aad]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "CMP x12, #16 \n" + "BGE 111b \n" + "CBZ x12, 120f \n" + "112: \n" + "# Partial AAD \n" + "EOR v15.16b, v15.16b, v15.16b \n" + "MOV x14, x12 \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "113: \n" + "LDRB w13, [%[aad]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 113b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "120: \n" + + "# Encrypt plaintext and GHASH ciphertext \n" + "LDR w12, [%[ctr], #12] \n" + "MOV w11, %w[sz] \n" + "REV w12, w12 \n" + "CMP w11, #64 \n" + "BLT 80f \n" + "CMP %w[aSz], #64 \n" + "BGE 82f \n" + + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "82: \n" + "# Should we do 8 blocks at a time? \n" + "CMP w11, #512 \n" + "BLT 80f \n" + + "# Calculate H^[5-8] - GMULT partials \n" + "# Multiply H and H^4 => H^5 \n" + "PMULL v18.1q, v26.1d, v16.1d \n" + "PMULL2 v19.1q, v26.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v26.1d, v20.1d \n" + "PMULL2 v20.1q, v26.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v9.16b, v18.16b, v20.16b \n" + "# Square H^3 - H^6 \n" + "PMULL2 v19.1q, v25.2d, v25.2d \n" + "PMULL v18.1q, v25.1d, v25.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v10.16b, v18.16b, v19.16b \n" + "# Multiply H and H^6 => H^7 \n" + "PMULL v18.1q, v10.1d, v16.1d \n" + "PMULL2 v19.1q, v10.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v10.1d, v20.1d \n" + "PMULL2 v20.1q, v10.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v11.16b, v18.16b, v20.16b \n" + "# Square H^4 => H^8 \n" + "PMULL2 v19.1q, v26.2d, v26.2d \n" + "PMULL v18.1q, v26.1d, v26.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v4.16b, v18.16b, v19.16b \n" + + "# First encrypt - no GHASH \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #192] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #208] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v12.16b, v12.16b, v5.16b \n" + "EOR v13.16b, v13.16b, v6.16b \n" + "EOR v14.16b, v14.16b, v7.16b \n" + "EOR v15.16b, v15.16b, v8.16b \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "ST1 {v12.2d-v15.2d}, [%[out]], #64 \n \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + + "81: \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "REV w15, w15 \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "REV w14, w14 \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "REV w13, w13 \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "REV w15, w15 \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "REV w14, w14 \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "REV w13, w13 \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v9.1d \n" + "PMULL2 v3.1q, v15.2d, v9.2d \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "PMULL v3.1q, v15.1d, v9.1d \n" + "PMULL2 v15.1q, v15.2d, v9.2d \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v10.1d \n" + "PMULL2 v3.1q, v14.2d, v10.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v3.1q, v14.1d, v10.1d \n" + "PMULL2 v14.1q, v14.2d, v10.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v11.1d \n" + "PMULL2 v3.1q, v13.2d, v11.2d \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL v3.1q, v13.1d, v11.1d \n" + "PMULL2 v13.1q, v13.2d, v11.2d \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v4.1d \n" + "PMULL2 v3.1q, v12.2d, v4.2d \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v3.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #192] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #208] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v12.16b, v12.16b, v5.16b \n" + "EOR v13.16b, v13.16b, v6.16b \n" + "EOR v14.16b, v14.16b, v7.16b \n" + "EOR v15.16b, v15.16b, v8.16b \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "ST1 {v12.2d-v15.2d}, [%[out]], #64 \n \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + + "CMP w11, #128 \n" + "BGE 81b \n" + + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v9.1d \n" + "PMULL2 v3.1q, v15.2d, v9.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "PMULL v3.1q, v15.1d, v9.1d \n" + "PMULL2 v15.1q, v15.2d, v9.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v10.1d \n" + "PMULL2 v3.1q, v14.2d, v10.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "PMULL v3.1q, v14.1d, v10.1d \n" + "PMULL2 v14.1q, v14.2d, v10.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v11.1d \n" + "PMULL2 v3.1q, v13.2d, v11.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v3.1q, v13.1d, v11.1d \n" + "PMULL2 v13.1q, v13.2d, v11.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v4.1d \n" + "PMULL2 v3.1q, v12.2d, v4.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v3.1q, v12.1d, v4.1d \n" + "PMULL2 v12.1q, v12.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "EOR v17.16b, v17.16b, v2.16b \n" - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - XMEMCPY(scratch, out, partial); - xorbuf(x, scratch, AES_BLOCK_SIZE); - GMULT(x, aes->H); - } + "80: \n" + "LD1 {v22.2d}, [%[ctr]] \n" + "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" + "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" + "LD1 {v9.2d-v11.2d}, [%[Key]], #48 \n" + "LD1 {v12.2d-v13.2d}, [%[Key]], #32 \n" + "# Can we do 4 blocks at a time? \n" + "CMP w11, #64 \n" + "BLT 10f \n" + + "# First encrypt - no GHASH \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v12.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v12.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v12.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v12.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v14.2d, v15.2d}, [%[Key]] \n" + "AESE v27.16b, v13.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v13.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v13.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v13.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v14.16b \n" + "EOR v27.16b, v27.16b, v15.16b \n" + "AESE v28.16b, v14.16b \n" + "EOR v28.16b, v28.16b, v15.16b \n" + "AESE v29.16b, v14.16b \n" + "EOR v29.16b, v29.16b, v15.16b \n" + "AESE v30.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + + "# XOR in input \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "# Store cipher text \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BLT 12f \n" + + "11: \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "REV w15, w15 \n" + "RBIT v19.16b, v19.16b \n" + "REV w14, w14 \n" + "RBIT v20.16b, v20.16b \n" + "REV w13, w13 \n" + "RBIT v21.16b, v21.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v12.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v12.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v12.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v12.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v14.2d, v15.2d}, [%[Key]] \n" + "AESE v27.16b, v13.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v13.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v13.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v13.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v14.16b \n" + "EOR v27.16b, v27.16b, v15.16b \n" + "AESE v28.16b, v14.16b \n" + "EOR v28.16b, v28.16b, v15.16b \n" + "AESE v29.16b, v14.16b \n" + "EOR v29.16b, v29.16b, v15.16b \n" + "AESE v30.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + + "# XOR in input \n" + "EOR v18.16b, v18.16b, v27.16b \n" + "EOR v19.16b, v19.16b, v28.16b \n" + "EOR v20.16b, v20.16b, v29.16b \n" + "EOR v21.16b, v21.16b, v30.16b \n" + "# Store cipher text \n" + "ST1 {v18.2d-v21.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BGE 11b \n" + + "12: \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" - /* Hash in the lengths of A and C in bits */ - XMEMSET(scratch, 0, AES_BLOCK_SIZE); - FlattenSzInBits(&scratch[0], authInSz); - FlattenSzInBits(&scratch[8], sz); - xorbuf(x, scratch, AES_BLOCK_SIZE); - XMEMCPY(scratch, x, AES_BLOCK_SIZE); + "10: \n" + "SUB %[Key], %[Key], #32 \n" + "CBZ w11, 30f \n" + "CMP w11, #16 \n" + "BLT 20f \n" + "# Encrypt first block for GHASH \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v31.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v12.2d, v13.2d}, [%[Key]], #32 \n" + "AESE v0.16b, v12.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v13.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v12.2d, v13.2d}, [%[Key]] \n" + "SUB %[Key], %[Key], #32 \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[out]], #16 \n" - keyPt = (byte*)aes->key; - __asm__ __volatile__ ( + "# When only one full block to encrypt go straight to GHASH \n" + "CMP w11, 16 \n" + "BLT 1f \n" - "LD1 {v16.16b}, [%[tag]] \n" - "LD1 {v17.16b}, %[h] \n" - "RBIT v16.16b, v16.16b \n" + "LD1 {v31.2d}, [%[input]], #16 \n" - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - "PMULL v18.1q, v16.1d, v17.1d \n" /* a0 * b0 = C */ - "PMULL2 v19.1q, v16.2d, v17.2d \n" /* a1 * b1 = D */ - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "EXT v20.16b, v17.16b, v17.16b, #8 \n" /* b0b1 -> b1b0 */ - "LD1 {v9.2d-v11.2d}, [%[Key]], #48\n" - "LD1 {v28.2d-v31.2d}, [%[Key]], #64\n" - "PMULL v21.1q, v16.1d, v20.1d \n" /* a0 * b1 = E */ - "PMULL2 v20.1q, v16.2d, v20.2d \n" /* a1 * b0 = F */ - "LD1 {v0.2d}, [%[ctr]] \n" - - "#Set a register to all 0s using EOR \n" - "EOR v22.16b, v22.16b, v22.16b \n" - "EOR v20.16b, v20.16b, v21.16b \n" /* F ^ E */ - "AESE v0.16b, v1.16b \n" + "# Interweave GHASH and encrypt if more then 1 block \n" + "2: \n" + "RBIT v15.16b, v15.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" /* get (F^E)[0] */ - "AESE v0.16b, v2.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" /* low 128 bits in v3 */ - "EXT v21.16b, v20.16b, v22.16b, #8 \n" /* get (F^E)[1] */ - "AESE v0.16b, v3.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" /* high 128 bits in v4 */ - "MOVI v23.16b, #0x87 \n" - "AESE v0.16b, v4.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" "AESMC v0.16b, v0.16b \n" - "USHR v23.2d, v23.2d, #56 \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v12.2d, v13.2d}, [%[Key]], #32 \n" + "AESE v0.16b, v12.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v13.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v12.2d, v13.2d}, [%[Key]] \n" + "SUB %[Key], %[Key], #32 \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[out]], #16 \n" + "CMP w11, 16 \n" + "BLT 1f \n" + + "LD1 {v31.2d}, [%[input]], #16 \n" + "B 2b \n" + + "# GHASH on last block \n" + "1: \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" "PMULL2 v20.1q, v19.2d, v23.2d \n" - "AESE v0.16b, v5.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "20: \n" + "CBZ w11, 30f \n" + "EOR v31.16b, v31.16b, v31.16b \n" + "MOV x15, x11 \n" + "ST1 {v31.2d}, [%[scratch]] \n" + "23: \n" + "LDRB w14, [%[input]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 23b \n" + "SUB %[scratch], %[scratch], x11 \n" + "LD1 {v31.2d}, [%[scratch]] \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v5.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v20.16b, v22.16b, #8 \n" - "AESE v0.16b, v6.16b \n" + "AESE v0.16b, v6.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v19.16b, v19.16b, v21.16b \n" - "AESE v0.16b, v7.16b \n" + "AESE v0.16b, v7.16b \n" "AESMC v0.16b, v0.16b \n" - "EXT v21.16b, v22.16b, v20.16b, #8 \n" - "AESE v0.16b, v8.16b \n" + "AESE v0.16b, v8.16b \n" "AESMC v0.16b, v0.16b \n" - "EOR v18.16b, v18.16b, v21.16b \n" - "AESE v0.16b, v9.16b \n" + "AESE v0.16b, v9.16b \n" "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" + "AESE v0.16b, v10.16b \n" "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" + "AESE v0.16b, v11.16b \n" "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v28.16b \n" + "LD1 {v12.2d, v13.2d}, [%[Key]], #32 \n" + "AESE v0.16b, v12.16b \n" "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v29.16b \n" + "AESE v0.16b, v13.16b \n" "AESMC v0.16b, v0.16b \n" - "PMULL v20.1q, v19.1d, v23.1d \n" - "EOR v19.16b, v18.16b, v20.16b \n" - "AESE v0.16b, v30.16b \n" - "RBIT v19.16b, v19.16b \n" - "EOR v0.16b, v0.16b, v31.16b \n" - "EOR v19.16b, v19.16b, v0.16b \n" - "STR q19, [%[out]] \n" - - :[out] "=r" (sPt), "=r" (keyPt), "=r" (iCtr) - :[tag] "0" (sPt), [Key] "1" (keyPt), - [ctr] "2" (iCtr) , [h] "m" (aes->H) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10","v11","v12","v13","v14", - "v15", "v16", "v17","v18", "v19", "v20","v21","v22","v23", - "v24","v25","v26","v27","v28","v29","v30","v31" + "LD1 {v12.2d, v13.2d}, [%[Key]] \n" + "SUB %[Key], %[Key], #32 \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v15.16b, v0.16b, v31.16b \n \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "MOV x15, x11 \n" + "24: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[out]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 24b \n" + "MOV x15, #16 \n" + "EOR w14, w14, w14 \n" + "SUB x15, x15, x11 \n" + "25: \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 25b \n" + "SUB %[scratch], %[scratch], #16 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "30: \n" + "# store current counter value at the end \n" + "REV w13, w12 \n" + "MOV v22.S[3], w13 \n" + "LD1 {v0.2d}, [%[ctr]] \n" + "ST1 {v22.2d}, [%[ctr]] \n" + + "LSL %x[aSz], %x[aSz], #3 \n" + "LSL %x[sz], %x[sz], #3 \n" + "MOV v15.d[0], %x[aSz] \n" + "MOV v15.d[1], %x[sz] \n" + "REV64 v15.16b, v15.16b \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v12.2d, v13.2d}, [%[Key]], #32 \n" + "AESE v0.16b, v12.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v13.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v12.2d, v13.2d}, [%[Key]] \n" + "SUB %[Key], %[Key], #32 \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "RBIT v17.16b, v17.16b \n" + "EOR v0.16b, v0.16b, v17.16b \n \n" + "CMP %w[tagSz], #16 \n" + "BNE 40f \n" + "ST1 {v0.2d}, [%[tag]] \n" + "B 41f \n" + "40: \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV x15, %x[tagSz] \n" + "44: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[tag]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 44b \n" + "SUB %[scratch], %[scratch], %x[tagSz] \n" + "41: \n" + + : [out] "+r" (out), [input] "+r" (in), [Key] "+r" (keyPt), + [aSz] "+r" (authInSz), [sz] "+r" (sz), [aad] "+r" (authIn) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "m" (aes->gcm.H), [tag] "r" (authTag), [tagSz] "r" (authTagSz) + : "cc", "memory", "x11", "x12", "w13", "x14", "x15", "w16", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" ); - if (authTagSz > AES_BLOCK_SIZE) { - XMEMCPY(authTag, scratch, AES_BLOCK_SIZE); - } - else { - /* authTagSz can be smaller than AES_BLOCK_SIZE */ - XMEMCPY(authTag, scratch, authTagSz); - } - return 0; } #endif /* WOLFSSL_AES_256 */ - /* aarch64 with PMULL and PMULL2 * Encrypt and tag data using AES with GCM mode. * aes: Aes structure having already been set with set key function @@ -2585,20 +7216,17 @@ * Algorithm 5 */ int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) + const byte* iv, word32 ivSz, byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) { /* sanity checks */ - if (aes == NULL || (iv == NULL && ivSz > 0) || - (authTag == NULL) || - (authIn == NULL && authInSz > 0) || - (ivSz == 0)) { + if ((aes == NULL) || (iv == NULL && ivSz > 0) || (authTag == NULL) || + ((authIn == NULL) && (authInSz > 0)) || (ivSz == 0)) { WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); return BAD_FUNC_ARG; } - if (authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ || authTagSz > AES_BLOCK_SIZE) { + if ((authTagSz < WOLFSSL_MIN_AUTH_TAG_SZ) || (authTagSz > AES_BLOCK_SIZE)) { WOLFSSL_MSG("GcmEncrypt authTagSz error"); return BAD_FUNC_ARG; } @@ -2625,8 +7253,5315 @@ } } - #ifdef HAVE_AES_DECRYPT +#ifdef WOLFSSL_AES_128 +/* internal function : see wc_AesGcmDecrypt */ +static int Aes128GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + byte *ctr = counter; + byte* keyPt = (byte*)aes->key; + int ret = 0; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (ivSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, iv, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GMULT(counter, aes->gcm.H); + } + + __asm__ __volatile__ ( + "LD1 {v16.16b}, %[h] \n" + "# v23 = 0x00000000000000870000000000000087 reflected 0xe1.... \n" + "MOVI v23.16b, #0x87 \n" + "EOR v17.16b, v17.16b, v17.16b \n" + "USHR v23.2d, v23.2d, #56 \n" + "CBZ %w[aSz], 120f \n" + + "MOV w12, %w[aSz] \n" + + "# GHASH AAD \n" + "CMP x12, #64 \n" + "BLT 115f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "114: \n" + "LD1 {v18.2d-v21.2d}, [%[aad]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v30.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v30.16b, #8 \n" + "PMULL2 v14.1q, v30.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "CMP x12, #64 \n" + "BGE 114b \n" + "CBZ x12, 120f \n" + "115: \n" + "CMP x12, #16 \n" + "BLT 112f \n" + "111: \n" + "LD1 {v15.2d}, [%[aad]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "CMP x12, #16 \n" + "BGE 111b \n" + "CBZ x12, 120f \n" + "112: \n" + "# Partial AAD \n" + "EOR v15.16b, v15.16b, v15.16b \n" + "MOV x14, x12 \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "113: \n" + "LDRB w13, [%[aad]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 113b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "120: \n" + + "# Decrypt ciphertext and GHASH ciphertext \n" + "LDR w12, [%[ctr], #12] \n" + "MOV w11, %w[sz] \n" + "REV w12, w12 \n" + "CMP w11, #64 \n" + "BLT 80f \n" + "CMP %w[aSz], #64 \n" + "BGE 82f \n" + + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "82: \n" + "# Should we do 8 blocks at a time? \n" + "CMP w11, #512 \n" + "BLT 80f \n" + + "# Calculate H^[5-8] - GMULT partials \n" + "# Multiply H and H^4 => H^5 \n" + "PMULL v18.1q, v26.1d, v16.1d \n" + "PMULL2 v19.1q, v26.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v26.1d, v20.1d \n" + "PMULL2 v20.1q, v26.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v4.16b, v18.16b, v20.16b \n" + "# Square H^3 - H^6 \n" + "PMULL2 v19.1q, v25.2d, v25.2d \n" + "PMULL v18.1q, v25.1d, v25.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v9.16b, v18.16b, v19.16b \n" + "# Multiply H and H^6 => H^7 \n" + "PMULL v18.1q, v9.1d, v16.1d \n" + "PMULL2 v19.1q, v9.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v9.1d, v20.1d \n" + "PMULL2 v20.1q, v9.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v10.16b, v18.16b, v20.16b \n" + "# Square H^4 => H^8 \n" + "PMULL2 v19.1q, v26.2d, v26.2d \n" + "PMULL v18.1q, v26.1d, v26.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v11.16b, v18.16b, v19.16b \n" + + "# First decrypt - no GHASH \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v5.16b, v5.16b, v12.16b \n" + "EOR v6.16b, v6.16b, v13.16b \n" + "EOR v7.16b, v7.16b, v14.16b \n" + "EOR v8.16b, v8.16b, v15.16b \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "ST1 {v5.2d-v8.2d}, [%[out]], #64 \n \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + + "81: \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "REV w15, w15 \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "REV w14, w14 \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "REV w13, w13 \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "REV w15, w15 \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "REV w14, w14 \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "REV w13, w13 \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v4.1d \n" + "PMULL2 v3.1q, v15.2d, v4.2d \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "PMULL v3.1q, v15.1d, v4.1d \n" + "PMULL2 v15.1q, v15.2d, v4.2d \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v9.1d \n" + "PMULL2 v3.1q, v14.2d, v9.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v3.1q, v14.1d, v9.1d \n" + "PMULL2 v14.1q, v14.2d, v9.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v10.1d \n" + "PMULL2 v3.1q, v13.2d, v10.2d \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL v3.1q, v13.1d, v10.1d \n" + "PMULL2 v13.1q, v13.2d, v10.2d \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v11.1d \n" + "PMULL2 v3.1q, v12.2d, v11.2d \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v3.1q, v12.1d, v11.1d \n" + "PMULL2 v12.1q, v12.2d, v11.2d \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v5.16b, v5.16b, v12.16b \n" + "EOR v6.16b, v6.16b, v13.16b \n" + "EOR v7.16b, v7.16b, v14.16b \n" + "EOR v8.16b, v8.16b, v15.16b \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "ST1 {v5.2d-v8.2d}, [%[out]], #64 \n \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + + "CMP w11, #128 \n" + "BGE 81b \n" + + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v4.1d \n" + "PMULL2 v3.1q, v15.2d, v4.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "PMULL v3.1q, v15.1d, v4.1d \n" + "PMULL2 v15.1q, v15.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v9.1d \n" + "PMULL2 v3.1q, v14.2d, v9.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "PMULL v3.1q, v14.1d, v9.1d \n" + "PMULL2 v14.1q, v14.2d, v9.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v10.1d \n" + "PMULL2 v3.1q, v13.2d, v10.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v3.1q, v13.1d, v10.1d \n" + "PMULL2 v13.1q, v13.2d, v10.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v11.1d \n" + "PMULL2 v3.1q, v12.2d, v11.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v3.1q, v12.1d, v11.1d \n" + "PMULL2 v12.1q, v12.2d, v11.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "EOR v17.16b, v17.16b, v2.16b \n" + + "80: \n" + "LD1 {v22.2d}, [%[ctr]] \n" + "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" + "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" + "LD1 {v9.2d-v11.2d}, [%[Key]], #48 \n" + "# Can we do 4 blocks at a time? \n" + "CMP w11, #64 \n" + "BLT 10f \n" + + "# First decrypt - no GHASH \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "EOR v27.16b, v27.16b, v11.16b \n" + "AESE v28.16b, v10.16b \n" + "EOR v28.16b, v28.16b, v11.16b \n" + "AESE v29.16b, v10.16b \n" + "EOR v29.16b, v29.16b, v11.16b \n" + "AESE v30.16b, v10.16b \n" + "EOR v30.16b, v30.16b, v11.16b \n" + + "# XOR in input \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "# Store cipher text \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BLT 12f \n" + + "11: \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "REV w15, w15 \n" + "RBIT v19.16b, v19.16b \n" + "REV w14, w14 \n" + "RBIT v20.16b, v20.16b \n" + "REV w13, w13 \n" + "RBIT v21.16b, v21.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "EOR v27.16b, v27.16b, v11.16b \n" + "AESE v28.16b, v10.16b \n" + "EOR v28.16b, v28.16b, v11.16b \n" + "AESE v29.16b, v10.16b \n" + "EOR v29.16b, v29.16b, v11.16b \n" + "AESE v30.16b, v10.16b \n" + "EOR v30.16b, v30.16b, v11.16b \n" + + "# XOR in input \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "# Store cipher text \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BGE 11b \n" + + "12: \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + + "10: \n" + "CBZ w11, 30f \n" + "CMP w11, #16 \n" + "BLT 20f \n" + "# Decrypt first block for GHASH \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v28.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "EOR v0.16b, v0.16b, v28.16b \n \n" + "ST1 {v0.2d}, [%[out]], #16 \n" + + "# When only one full block to decrypt go straight to GHASH \n" + "CMP w11, 16 \n" + "BLT 1f \n" + + "# Interweave GHASH and decrypt if more then 1 block \n" + "2: \n" + "RBIT v28.16b, v28.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "LD1 {v28.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "EOR v0.16b, v0.16b, v28.16b \n \n" + "ST1 {v0.2d}, [%[out]], #16 \n" + "CMP w11, #16 \n" + "BGE 2b \n" + + "# GHASH on last block \n" + "1: \n" + "RBIT v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "20: \n" + "CBZ w11, 30f \n" + "EOR v31.16b, v31.16b, v31.16b \n" + "MOV x15, x11 \n" + "ST1 {v31.2d}, [%[scratch]] \n" + "23: \n" + "LDRB w14, [%[input]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 23b \n" + "SUB %[scratch], %[scratch], x11 \n" + "LD1 {v31.2d}, [%[scratch]] \n" + "RBIT v31.16b, v31.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v31.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "RBIT v31.16b, v31.16b \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "EOR v0.16b, v0.16b, v31.16b \n \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV x15, x11 \n" + "24: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[out]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 24b \n" + "SUB %[scratch], %[scratch], x11 \n" + + "30: \n" + "# store current counter value at the end \n" + "REV w13, w12 \n" + "MOV v22.S[3], w13 \n" + "LD1 {v0.16b}, [%[ctr]] \n" + "ST1 {v22.16b}, [%[ctr]] \n" + + "LSL %x[aSz], %x[aSz], #3 \n" + "LSL %x[sz], %x[sz], #3 \n" + "MOV v28.d[0], %x[aSz] \n" + "MOV v28.d[1], %x[sz] \n" + "REV64 v28.16b, v28.16b \n" + "RBIT v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v10.16b \n" + "EOR v0.16b, v0.16b, v11.16b \n \n" + "RBIT v17.16b, v17.16b \n" + "EOR v0.16b, v0.16b, v17.16b \n \n" + "CMP %w[tagSz], #16 \n" + "BNE 40f \n" + "LD1 {v1.2d}, [%[tag]] \n" + "B 41f \n" + "40: \n" + "EOR v1.16b, v1.16b, v1.16b \n" + "MOV x15, %x[tagSz] \n" + "ST1 {v1.2d}, [%[scratch]] \n" + "43: \n" + "LDRB w14, [%[tag]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 43b \n" + "SUB %[scratch], %[scratch], %x[tagSz] \n" + "LD1 {v1.2d}, [%[scratch]] \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV w14, #16 \n" + "SUB w14, w14, %w[tagSz] \n" + "ADD %[scratch], %[scratch], %x[tagSz] \n" + "44: \n" + "STRB wzr, [%[scratch]], #1 \n" + "SUB w14, w14, #1 \n" + "CBNZ w14, 44b \n" + "SUB %[scratch], %[scratch], #16 \n" + "LD1 {v0.2d}, [%[scratch]] \n" + "41: \n" + "EOR v0.16b, v0.16b, v1.16b \n" + "MOV v1.D[0], v0.D[1] \n" + "EOR v0.8b, v0.8b, v1.8b \n" + "MOV %x[ret], v0.D[0] \n" + "CMP %x[ret], #0 \n" + "MOV w11, #-180 \n" + "CSETM %w[ret], ne \n" + "AND %w[ret], %w[ret], w11 \n" + + : [out] "+r" (out), [input] "+r" (in), [Key] "+r" (keyPt), + [aSz] "+r" (authInSz), [sz] "+r" (sz), [aad] "+r" (authIn), + [ret] "+r" (ret) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "m" (aes->gcm.H), [tag] "r" (authTag), [tagSz] "r" (authTagSz) + : "cc", "memory", "x11", "x12", "w13", "x14", "x15", "w16", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + ); + + return ret; +} +#endif /* WOLFSSL_AES_128 */ +#ifdef WOLFSSL_AES_192 +/* internal function : see wc_AesGcmDecrypt */ +static int Aes192GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + byte *ctr = counter; + byte* keyPt = (byte*)aes->key; + int ret = 0; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (ivSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, iv, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GMULT(counter, aes->gcm.H); + } + + __asm__ __volatile__ ( + "LD1 {v16.16b}, %[h] \n" + "# v23 = 0x00000000000000870000000000000087 reflected 0xe1.... \n" + "MOVI v23.16b, #0x87 \n" + "EOR v17.16b, v17.16b, v17.16b \n" + "USHR v23.2d, v23.2d, #56 \n" + "CBZ %w[aSz], 120f \n" + + "MOV w12, %w[aSz] \n" + + "# GHASH AAD \n" + "CMP x12, #64 \n" + "BLT 115f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "114: \n" + "LD1 {v18.2d-v21.2d}, [%[aad]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v30.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v30.16b, #8 \n" + "PMULL2 v14.1q, v30.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "CMP x12, #64 \n" + "BGE 114b \n" + "CBZ x12, 120f \n" + "115: \n" + "CMP x12, #16 \n" + "BLT 112f \n" + "111: \n" + "LD1 {v15.2d}, [%[aad]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "CMP x12, #16 \n" + "BGE 111b \n" + "CBZ x12, 120f \n" + "112: \n" + "# Partial AAD \n" + "EOR v15.16b, v15.16b, v15.16b \n" + "MOV x14, x12 \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "113: \n" + "LDRB w13, [%[aad]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 113b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "120: \n" + + "# Decrypt ciphertext and GHASH ciphertext \n" + "LDR w12, [%[ctr], #12] \n" + "MOV w11, %w[sz] \n" + "REV w12, w12 \n" + "CMP w11, #64 \n" + "BLT 80f \n" + "CMP %w[aSz], #64 \n" + "BGE 82f \n" + + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "82: \n" + "# Should we do 8 blocks at a time? \n" + "CMP w11, #512 \n" + "BLT 80f \n" + + "# Calculate H^[5-8] - GMULT partials \n" + "# Multiply H and H^4 => H^5 \n" + "PMULL v18.1q, v26.1d, v16.1d \n" + "PMULL2 v19.1q, v26.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v26.1d, v20.1d \n" + "PMULL2 v20.1q, v26.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v4.16b, v18.16b, v20.16b \n" + "# Square H^3 - H^6 \n" + "PMULL2 v19.1q, v25.2d, v25.2d \n" + "PMULL v18.1q, v25.1d, v25.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v9.16b, v18.16b, v19.16b \n" + "# Multiply H and H^6 => H^7 \n" + "PMULL v18.1q, v9.1d, v16.1d \n" + "PMULL2 v19.1q, v9.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v9.1d, v20.1d \n" + "PMULL2 v20.1q, v9.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v10.16b, v18.16b, v20.16b \n" + "# Square H^4 => H^8 \n" + "PMULL2 v19.1q, v26.2d, v26.2d \n" + "PMULL v18.1q, v26.1d, v26.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v11.16b, v18.16b, v19.16b \n" + + "# First decrypt - no GHASH \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v5.16b, v5.16b, v12.16b \n" + "EOR v6.16b, v6.16b, v13.16b \n" + "EOR v7.16b, v7.16b, v14.16b \n" + "EOR v8.16b, v8.16b, v15.16b \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "ST1 {v5.2d-v8.2d}, [%[out]], #64 \n \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + + "81: \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "REV w15, w15 \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "REV w14, w14 \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "REV w13, w13 \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "REV w15, w15 \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "REV w14, w14 \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "REV w13, w13 \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v4.1d \n" + "PMULL2 v3.1q, v15.2d, v4.2d \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "PMULL v3.1q, v15.1d, v4.1d \n" + "PMULL2 v15.1q, v15.2d, v4.2d \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v9.1d \n" + "PMULL2 v3.1q, v14.2d, v9.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v3.1q, v14.1d, v9.1d \n" + "PMULL2 v14.1q, v14.2d, v9.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v10.1d \n" + "PMULL2 v3.1q, v13.2d, v10.2d \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL v3.1q, v13.1d, v10.1d \n" + "PMULL2 v13.1q, v13.2d, v10.2d \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v11.1d \n" + "PMULL2 v3.1q, v12.2d, v11.2d \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v3.1q, v12.1d, v11.1d \n" + "PMULL2 v12.1q, v12.2d, v11.2d \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v5.16b, v5.16b, v12.16b \n" + "EOR v6.16b, v6.16b, v13.16b \n" + "EOR v7.16b, v7.16b, v14.16b \n" + "EOR v8.16b, v8.16b, v15.16b \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "ST1 {v5.2d-v8.2d}, [%[out]], #64 \n \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + + "CMP w11, #128 \n" + "BGE 81b \n" + + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v4.1d \n" + "PMULL2 v3.1q, v15.2d, v4.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "PMULL v3.1q, v15.1d, v4.1d \n" + "PMULL2 v15.1q, v15.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v9.1d \n" + "PMULL2 v3.1q, v14.2d, v9.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "PMULL v3.1q, v14.1d, v9.1d \n" + "PMULL2 v14.1q, v14.2d, v9.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v10.1d \n" + "PMULL2 v3.1q, v13.2d, v10.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v3.1q, v13.1d, v10.1d \n" + "PMULL2 v13.1q, v13.2d, v10.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v11.1d \n" + "PMULL2 v3.1q, v12.2d, v11.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v3.1q, v12.1d, v11.1d \n" + "PMULL2 v12.1q, v12.2d, v11.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "EOR v17.16b, v17.16b, v2.16b \n" + + "80: \n" + "LD1 {v22.2d}, [%[ctr]] \n" + "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" + "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" + "LD1 {v9.2d-v11.2d}, [%[Key]], #48 \n" + "LD1 {v12.2d-v13.2d}, [%[Key]], #32 \n" + "# Can we do 4 blocks at a time? \n" + "CMP w11, #64 \n" + "BLT 10f \n" + + "# First decrypt - no GHASH \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v12.16b \n" + "EOR v27.16b, v27.16b, v13.16b \n" + "AESE v28.16b, v12.16b \n" + "EOR v28.16b, v28.16b, v13.16b \n" + "AESE v29.16b, v12.16b \n" + "EOR v29.16b, v29.16b, v13.16b \n" + "AESE v30.16b, v12.16b \n" + "EOR v30.16b, v30.16b, v13.16b \n" + + "# XOR in input \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "# Store cipher text \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BLT 12f \n" + + "11: \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "REV w15, w15 \n" + "RBIT v19.16b, v19.16b \n" + "REV w14, w14 \n" + "RBIT v20.16b, v20.16b \n" + "REV w13, w13 \n" + "RBIT v21.16b, v21.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v12.16b \n" + "EOR v27.16b, v27.16b, v13.16b \n" + "AESE v28.16b, v12.16b \n" + "EOR v28.16b, v28.16b, v13.16b \n" + "AESE v29.16b, v12.16b \n" + "EOR v29.16b, v29.16b, v13.16b \n" + "AESE v30.16b, v12.16b \n" + "EOR v30.16b, v30.16b, v13.16b \n" + + "# XOR in input \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "# Store cipher text \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BGE 11b \n" + + "12: \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + + "10: \n" + "CBZ w11, 30f \n" + "CMP w11, #16 \n" + "BLT 20f \n" + "# Decrypt first block for GHASH \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v28.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v0.16b, v0.16b, v28.16b \n \n" + "ST1 {v0.2d}, [%[out]], #16 \n" + + "# When only one full block to decrypt go straight to GHASH \n" + "CMP w11, 16 \n" + "BLT 1f \n" + + "# Interweave GHASH and decrypt if more then 1 block \n" + "2: \n" + "RBIT v28.16b, v28.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "LD1 {v28.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v0.16b, v0.16b, v28.16b \n \n" + "ST1 {v0.2d}, [%[out]], #16 \n" + "CMP w11, #16 \n" + "BGE 2b \n" + + "# GHASH on last block \n" + "1: \n" + "RBIT v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "20: \n" + "CBZ w11, 30f \n" + "EOR v31.16b, v31.16b, v31.16b \n" + "MOV x15, x11 \n" + "ST1 {v31.2d}, [%[scratch]] \n" + "23: \n" + "LDRB w14, [%[input]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 23b \n" + "SUB %[scratch], %[scratch], x11 \n" + "LD1 {v31.2d}, [%[scratch]] \n" + "RBIT v31.16b, v31.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v31.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "RBIT v31.16b, v31.16b \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "EOR v0.16b, v0.16b, v31.16b \n \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV x15, x11 \n" + "24: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[out]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 24b \n" + "SUB %[scratch], %[scratch], x11 \n" + + "30: \n" + "# store current counter value at the end \n" + "REV w13, w12 \n" + "MOV v22.S[3], w13 \n" + "LD1 {v0.16b}, [%[ctr]] \n" + "ST1 {v22.16b}, [%[ctr]] \n" + + "LSL %x[aSz], %x[aSz], #3 \n" + "LSL %x[sz], %x[sz], #3 \n" + "MOV v28.d[0], %x[aSz] \n" + "MOV v28.d[1], %x[sz] \n" + "REV64 v28.16b, v28.16b \n" + "RBIT v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "EOR v0.16b, v0.16b, v13.16b \n \n" + "RBIT v17.16b, v17.16b \n" + "EOR v0.16b, v0.16b, v17.16b \n \n" + "CMP %w[tagSz], #16 \n" + "BNE 40f \n" + "LD1 {v1.2d}, [%[tag]] \n" + "B 41f \n" + "40: \n" + "EOR v1.16b, v1.16b, v1.16b \n" + "MOV x15, %x[tagSz] \n" + "ST1 {v1.2d}, [%[scratch]] \n" + "43: \n" + "LDRB w14, [%[tag]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 43b \n" + "SUB %[scratch], %[scratch], %x[tagSz] \n" + "LD1 {v1.2d}, [%[scratch]] \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV w14, #16 \n" + "SUB w14, w14, %w[tagSz] \n" + "ADD %[scratch], %[scratch], %x[tagSz] \n" + "44: \n" + "STRB wzr, [%[scratch]], #1 \n" + "SUB w14, w14, #1 \n" + "CBNZ w14, 44b \n" + "SUB %[scratch], %[scratch], #16 \n" + "LD1 {v0.2d}, [%[scratch]] \n" + "41: \n" + "EOR v0.16b, v0.16b, v1.16b \n" + "MOV v1.D[0], v0.D[1] \n" + "EOR v0.8b, v0.8b, v1.8b \n" + "MOV %x[ret], v0.D[0] \n" + "CMP %x[ret], #0 \n" + "MOV w11, #-180 \n" + "CSETM %w[ret], ne \n" + "AND %w[ret], %w[ret], w11 \n" + + : [out] "+r" (out), [input] "+r" (in), [Key] "+r" (keyPt), + [aSz] "+r" (authInSz), [sz] "+r" (sz), [aad] "+r" (authIn), + [ret] "+r" (ret) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "m" (aes->gcm.H), [tag] "r" (authTag), [tagSz] "r" (authTagSz) + : "cc", "memory", "x11", "x12", "w13", "x14", "x15", "w16", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + ); + + return ret; +} +#endif /* WOLFSSL_AES_192 */ +#ifdef WOLFSSL_AES_256 +/* internal function : see wc_AesGcmDecrypt */ +static int Aes256GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + byte *ctr = counter; + byte* keyPt = (byte*)aes->key; + int ret = 0; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (ivSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, iv, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GMULT(counter, aes->gcm.H); + } + + __asm__ __volatile__ ( + "LD1 {v16.16b}, %[h] \n" + "# v23 = 0x00000000000000870000000000000087 reflected 0xe1.... \n" + "MOVI v23.16b, #0x87 \n" + "EOR v17.16b, v17.16b, v17.16b \n" + "USHR v23.2d, v23.2d, #56 \n" + "CBZ %w[aSz], 120f \n" + + "MOV w12, %w[aSz] \n" + + "# GHASH AAD \n" + "CMP x12, #64 \n" + "BLT 115f \n" + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "114: \n" + "LD1 {v18.2d-v21.2d}, [%[aad]], #64 \n" + "SUB x12, x12, #64 \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v30.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v30.16b, #8 \n" + "PMULL2 v14.1q, v30.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "CMP x12, #64 \n" + "BGE 114b \n" + "CBZ x12, 120f \n" + "115: \n" + "CMP x12, #16 \n" + "BLT 112f \n" + "111: \n" + "LD1 {v15.2d}, [%[aad]], #16 \n" + "SUB x12, x12, #16 \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "CMP x12, #16 \n" + "BGE 111b \n" + "CBZ x12, 120f \n" + "112: \n" + "# Partial AAD \n" + "EOR v15.16b, v15.16b, v15.16b \n" + "MOV x14, x12 \n" + "ST1 {v15.2d}, [%[scratch]] \n" + "113: \n" + "LDRB w13, [%[aad]], #1 \n" + "STRB w13, [%[scratch]], #1 \n" + "SUB x14, x14, #1 \n" + "CBNZ x14, 113b \n" + "SUB %[scratch], %[scratch], x12 \n" + "LD1 {v15.2d}, [%[scratch]] \n" + "RBIT v15.16b, v15.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "120: \n" + + "# Decrypt ciphertext and GHASH ciphertext \n" + "LDR w12, [%[ctr], #12] \n" + "MOV w11, %w[sz] \n" + "REV w12, w12 \n" + "CMP w11, #64 \n" + "BLT 80f \n" + "CMP %w[aSz], #64 \n" + "BGE 82f \n" + + "# Calculate H^[1-4] - GMULT partials \n" + "# Square H => H^2 \n" + "PMULL2 v19.1q, v16.2d, v16.2d \n" + "PMULL v18.1q, v16.1d, v16.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v24.16b, v18.16b, v19.16b \n" + "# Multiply H and H^2 => H^3 \n" + "PMULL v18.1q, v24.1d, v16.1d \n" + "PMULL2 v19.1q, v24.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v24.1d, v20.1d \n" + "PMULL2 v20.1q, v24.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v25.16b, v18.16b, v20.16b \n" + "# Square H^2 => H^4 \n" + "PMULL2 v19.1q, v24.2d, v24.2d \n" + "PMULL v18.1q, v24.1d, v24.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v26.16b, v18.16b, v19.16b \n" + "82: \n" + "# Should we do 8 blocks at a time? \n" + "CMP w11, #512 \n" + "BLT 80f \n" + + "# Calculate H^[5-8] - GMULT partials \n" + "# Multiply H and H^4 => H^5 \n" + "PMULL v18.1q, v26.1d, v16.1d \n" + "PMULL2 v19.1q, v26.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v26.1d, v20.1d \n" + "PMULL2 v20.1q, v26.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v4.16b, v18.16b, v20.16b \n" + "# Square H^3 - H^6 \n" + "PMULL2 v19.1q, v25.2d, v25.2d \n" + "PMULL v18.1q, v25.1d, v25.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v9.16b, v18.16b, v19.16b \n" + "# Multiply H and H^6 => H^7 \n" + "PMULL v18.1q, v9.1d, v16.1d \n" + "PMULL2 v19.1q, v9.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v9.1d, v20.1d \n" + "PMULL2 v20.1q, v9.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v10.16b, v18.16b, v20.16b \n" + "# Square H^4 => H^8 \n" + "PMULL2 v19.1q, v26.2d, v26.2d \n" + "PMULL v18.1q, v26.1d, v26.1d \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v19.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v11.16b, v18.16b, v19.16b \n" + + "# First decrypt - no GHASH \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #192] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #208] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v5.16b, v5.16b, v12.16b \n" + "EOR v6.16b, v6.16b, v13.16b \n" + "EOR v7.16b, v7.16b, v14.16b \n" + "EOR v8.16b, v8.16b, v15.16b \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "ST1 {v5.2d-v8.2d}, [%[out]], #64 \n \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + + "81: \n" + "LDR q1, [%[Key]] \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "LD1 {v5.2d}, [%[ctr]] \n" + "ADD w14, w12, #2 \n" + "MOV v6.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v7.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v8.16b, v5.16b \n" + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "REV w15, w15 \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "REV w14, w14 \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "REV w13, w13 \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "REV w16, w12 \n" + "MOV v5.S[3], w15 \n" + "MOV v6.S[3], w14 \n" + "MOV v7.S[3], w13 \n" + "MOV v8.S[3], w16 \n" + "# Calculate next 4 counters (+5-8) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v5.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v5.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v5.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v5.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "REV w15, w15 \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "REV w14, w14 \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "REV w13, w13 \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 8 counters \n" + "LDR q22, [%[Key], #16] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "LDR q1, [%[Key], #32] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v4.1d \n" + "PMULL2 v3.1q, v15.2d, v4.2d \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "LDR q22, [%[Key], #48] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "PMULL v3.1q, v15.1d, v4.1d \n" + "PMULL2 v15.1q, v15.2d, v4.2d \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v9.1d \n" + "PMULL2 v3.1q, v14.2d, v9.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v3.1q, v14.1d, v9.1d \n" + "PMULL2 v14.1q, v14.2d, v9.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v10.1d \n" + "PMULL2 v3.1q, v13.2d, v10.2d \n" + "LDR q1, [%[Key], #64] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL v3.1q, v13.1d, v10.1d \n" + "PMULL2 v13.1q, v13.2d, v10.2d \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v11.1d \n" + "PMULL2 v3.1q, v12.2d, v11.2d \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v3.1q, v12.1d, v11.1d \n" + "PMULL2 v12.1q, v12.2d, v11.2d \n" + "LDR q22, [%[Key], #80] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #128 \n" + "LDR q1, [%[Key], #96] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #112] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #128] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #144] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #160] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q22, [%[Key], #176] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LDR q1, [%[Key], #192] \n" + "AESE v5.16b, v22.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v22.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v22.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v22.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v22.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v22.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v22.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v22.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v12.2d-v15.2d}, [%[input]], #64 \n" + "LDP q22, q31, [%[Key], #208] \n" + "AESE v5.16b, v1.16b \n" + "AESMC v5.16b, v5.16b \n" + "AESE v6.16b, v1.16b \n" + "AESMC v6.16b, v6.16b \n" + "AESE v7.16b, v1.16b \n" + "AESMC v7.16b, v7.16b \n" + "AESE v8.16b, v1.16b \n" + "AESMC v8.16b, v8.16b \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v5.16b, v22.16b \n" + "EOR v5.16b, v5.16b, v31.16b \n" + "AESE v6.16b, v22.16b \n" + "EOR v6.16b, v6.16b, v31.16b \n" + "AESE v7.16b, v22.16b \n" + "EOR v7.16b, v7.16b, v31.16b \n" + "AESE v8.16b, v22.16b \n" + "EOR v8.16b, v8.16b, v31.16b \n" + "AESE v27.16b, v22.16b \n" + "EOR v27.16b, v27.16b, v31.16b \n" + "AESE v28.16b, v22.16b \n" + "EOR v28.16b, v28.16b, v31.16b \n" + "AESE v29.16b, v22.16b \n" + "EOR v29.16b, v29.16b, v31.16b \n" + "AESE v30.16b, v22.16b \n" + "EOR v30.16b, v30.16b, v31.16b \n" + + "# XOR in input \n" + "EOR v5.16b, v5.16b, v12.16b \n" + "EOR v6.16b, v6.16b, v13.16b \n" + "EOR v7.16b, v7.16b, v14.16b \n" + "EOR v8.16b, v8.16b, v15.16b \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "ST1 {v5.2d-v8.2d}, [%[out]], #64 \n \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + + "CMP w11, #128 \n" + "BGE 81b \n" + + "# GHASH - 8 blocks \n" + "RBIT v12.16b, v12.16b \n" + "RBIT v13.16b, v13.16b \n" + "RBIT v14.16b, v14.16b \n" + "RBIT v15.16b, v15.16b \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v12.16b, v12.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v3.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v3.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v2.1q, v20.1d, v24.1d \n" + "PMULL2 v3.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v3.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v3.16b \n" +#else + "EOR v20.16b, v20.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v2.1q, v19.1d, v25.1d \n" + "PMULL2 v3.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v3.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v3.16b \n" +#else + "EOR v19.16b, v19.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v2.1q, v18.1d, v26.1d \n" + "PMULL2 v3.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v3.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v3.16b \n" +#else + "EOR v18.16b, v18.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^5 \n" + "PMULL v2.1q, v15.1d, v4.1d \n" + "PMULL2 v3.1q, v15.2d, v4.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v15.16b, v15.16b, v15.16b, #8 \n" + "PMULL v3.1q, v15.1d, v4.1d \n" + "PMULL2 v15.1q, v15.2d, v4.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v15.16b, v3.16b \n" +#else + "EOR v15.16b, v15.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^6 \n" + "PMULL v2.1q, v14.1d, v9.1d \n" + "PMULL2 v3.1q, v14.2d, v9.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v14.16b, v14.16b, v14.16b, #8 \n" + "PMULL v3.1q, v14.1d, v9.1d \n" + "PMULL2 v14.1q, v14.2d, v9.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v14.16b, v3.16b \n" +#else + "EOR v14.16b, v14.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^7 \n" + "PMULL v2.1q, v13.1d, v10.1d \n" + "PMULL2 v3.1q, v13.2d, v10.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v13.16b, v13.16b, v13.16b, #8 \n" + "PMULL v3.1q, v13.1d, v10.1d \n" + "PMULL2 v13.1q, v13.2d, v10.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v13.16b, v3.16b \n" +#else + "EOR v13.16b, v13.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v13.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^8 \n" + "PMULL v2.1q, v12.1d, v11.1d \n" + "PMULL2 v3.1q, v12.2d, v11.2d \n" + "EOR v17.16b, v17.16b, v2.16b \n" + "EOR v0.16b, v0.16b, v3.16b \n" + "EXT v12.16b, v12.16b, v12.16b, #8 \n" + "PMULL v3.1q, v12.1d, v11.1d \n" + "PMULL2 v12.1q, v12.2d, v11.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v12.16b, v3.16b \n" +#else + "EOR v12.16b, v12.16b, v3.16b \n" + "EOR v31.16b, v31.16b, v12.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v3.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v2.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v3.16b, v3.16b, v31.16b, v2.16b \n" +#else + "EOR v3.16b, v3.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v3.16b, v3.16b, v2.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v2.1q, v3.2d, v23.2d \n" + "MOV v17.D[1], v3.D[0] \n" + "EOR v17.16b, v17.16b, v2.16b \n" + + "80: \n" + "LD1 {v22.2d}, [%[ctr]] \n" + "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" + "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" + "LD1 {v9.2d-v11.2d}, [%[Key]], #48 \n" + "LD1 {v12.2d-v13.2d}, [%[Key]], #32 \n" + "LD1 {v14.2d-v15.2d}, [%[Key]] \n" + "# Can we do 4 blocks at a time? \n" + "CMP w11, #64 \n" + "BLT 10f \n" + + "# First decrypt - no GHASH \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "REV w15, w15 \n" + "REV w14, w14 \n" + "REV w13, w13 \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v12.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v12.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v12.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v12.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v14.2d, v15.2d}, [%[Key]] \n" + "AESE v27.16b, v13.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v13.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v13.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v13.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v14.16b \n" + "EOR v27.16b, v27.16b, v15.16b \n" + "AESE v28.16b, v14.16b \n" + "EOR v28.16b, v28.16b, v15.16b \n" + "AESE v29.16b, v14.16b \n" + "EOR v29.16b, v29.16b, v15.16b \n" + "AESE v30.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + + "# XOR in input \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "# Store cipher text \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BLT 12f \n" + + "11: \n" + "# Calculate next 4 counters (+1-4) \n" + "ADD w15, w12, #1 \n" + "MOV v27.16b, v22.16b \n" + "ADD w14, w12, #2 \n" + "MOV v28.16b, v22.16b \n" + "ADD w13, w12, #3 \n" + "MOV v29.16b, v22.16b \n" + "ADD w12, w12, #4 \n" + "MOV v30.16b, v22.16b \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "REV w15, w15 \n" + "RBIT v19.16b, v19.16b \n" + "REV w14, w14 \n" + "RBIT v20.16b, v20.16b \n" + "REV w13, w13 \n" + "RBIT v21.16b, v21.16b \n" + "REV w16, w12 \n" + "MOV v27.S[3], w15 \n" + "MOV v28.S[3], w14 \n" + "MOV v29.S[3], w13 \n" + "MOV v30.S[3], w16 \n" + + "# Encrypt 4 counters \n" + "AESE v27.16b, v1.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "AESE v28.16b, v1.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "AESE v29.16b, v1.16b \n" + "AESMC v29.16b, v29.16b \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "AESE v30.16b, v1.16b \n" + "AESMC v30.16b, v30.16b \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "AESE v27.16b, v2.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "AESE v28.16b, v2.16b \n" + "AESMC v28.16b, v28.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "AESE v29.16b, v2.16b \n" + "AESMC v29.16b, v29.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v30.16b, v2.16b \n" + "AESMC v30.16b, v30.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "AESE v27.16b, v3.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" + "AESE v28.16b, v3.16b \n" + "AESMC v28.16b, v28.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v29.16b, v3.16b \n" + "AESMC v29.16b, v29.16b \n" + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "AESE v30.16b, v3.16b \n" + "AESMC v30.16b, v30.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v27.16b, v4.16b \n" + "AESMC v27.16b, v27.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "AESE v28.16b, v4.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" + "AESE v29.16b, v4.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v4.16b \n" + "AESMC v30.16b, v30.16b \n" + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "AESE v27.16b, v5.16b \n" + "AESMC v27.16b, v27.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "AESE v28.16b, v5.16b \n" + "AESMC v28.16b, v28.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "AESE v29.16b, v5.16b \n" + "AESMC v29.16b, v29.16b \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" + "AESE v30.16b, v5.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "SUB w11, w11, #64 \n" + "AESE v27.16b, v6.16b \n" + "AESMC v27.16b, v27.16b \n" + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "AESE v28.16b, v6.16b \n" + "AESMC v28.16b, v28.16b \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" + "AESE v29.16b, v6.16b \n" + "AESMC v29.16b, v29.16b \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v30.16b, v6.16b \n" + "AESMC v30.16b, v30.16b \n" +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "AESE v27.16b, v7.16b \n" + "AESMC v27.16b, v27.16b \n" + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "AESE v28.16b, v7.16b \n" + "AESMC v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "AESE v29.16b, v7.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v7.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v8.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v8.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v8.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v8.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v9.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v9.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v9.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v9.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v10.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v10.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v10.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v10.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v11.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v11.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v11.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v11.16b \n" + "AESMC v30.16b, v30.16b \n" + "# Load plaintext \n" + "LD1 {v18.2d-v21.2d}, [%[input]], #64 \n" + "AESE v27.16b, v12.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v12.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v12.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v12.16b \n" + "AESMC v30.16b, v30.16b \n" + "LD1 {v14.2d, v15.2d}, [%[Key]] \n" + "AESE v27.16b, v13.16b \n" + "AESMC v27.16b, v27.16b \n" + "AESE v28.16b, v13.16b \n" + "AESMC v28.16b, v28.16b \n" + "AESE v29.16b, v13.16b \n" + "AESMC v29.16b, v29.16b \n" + "AESE v30.16b, v13.16b \n" + "AESMC v30.16b, v30.16b \n" + "AESE v27.16b, v14.16b \n" + "EOR v27.16b, v27.16b, v15.16b \n" + "AESE v28.16b, v14.16b \n" + "EOR v28.16b, v28.16b, v15.16b \n" + "AESE v29.16b, v14.16b \n" + "EOR v29.16b, v29.16b, v15.16b \n" + "AESE v30.16b, v14.16b \n" + "EOR v30.16b, v30.16b, v15.16b \n" + + "# XOR in input \n" + "EOR v27.16b, v27.16b, v18.16b \n" + "EOR v28.16b, v28.16b, v19.16b \n" + "EOR v29.16b, v29.16b, v20.16b \n" + "EOR v30.16b, v30.16b, v21.16b \n" + "# Store cipher text \n" + "ST1 {v27.2d-v30.2d}, [%[out]], #64 \n \n" + "CMP w11, #64 \n" + "BGE 11b \n" + + "12: \n" + "# GHASH - 4 blocks \n" + "RBIT v18.16b, v18.16b \n" + "RBIT v19.16b, v19.16b \n" + "RBIT v20.16b, v20.16b \n" + "RBIT v21.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v17.16b \n" + "# x[0-2] = C * H^1 \n" + "PMULL v17.1q, v21.1d, v16.1d \n" + "PMULL2 v0.1q, v21.2d, v16.2d \n" + "EXT v21.16b, v21.16b, v21.16b, #8 \n" + "PMULL v31.1q, v21.1d, v16.1d \n" + "PMULL2 v15.1q, v21.2d, v16.2d \n" + "EOR v31.16b, v31.16b, v15.16b \n" + "# x[0-2] += C * H^2 \n" + "PMULL v14.1q, v20.1d, v24.1d \n" + "PMULL2 v15.1q, v20.2d, v24.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v20.16b, v20.16b, v20.16b, #8 \n" + "PMULL v15.1q, v20.1d, v24.1d \n" + "PMULL2 v20.1q, v20.2d, v24.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v20.16b, v15.16b \n" +#else + "EOR v20.16b, v20.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v20.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^3 \n" + "PMULL v14.1q, v19.1d, v25.1d \n" + "PMULL2 v15.1q, v19.2d, v25.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v19.16b, v19.16b, v19.16b, #8 \n" + "PMULL v15.1q, v19.1d, v25.1d \n" + "PMULL2 v19.1q, v19.2d, v25.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v19.16b, v15.16b \n" +#else + "EOR v19.16b, v19.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v19.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# x[0-2] += C * H^4 \n" + "PMULL v14.1q, v18.1d, v26.1d \n" + "PMULL2 v15.1q, v18.2d, v26.2d \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n" + "EXT v18.16b, v18.16b, v18.16b, #8 \n" + "PMULL v15.1q, v18.1d, v26.1d \n" + "PMULL2 v18.1q, v18.2d, v26.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v31.16b, v31.16b, v18.16b, v15.16b \n" +#else + "EOR v18.16b, v18.16b, v15.16b \n" + "EOR v31.16b, v31.16b, v18.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "# Reduce X = x[0-2] \n" + "EXT v15.16b, v17.16b, v0.16b, #8 \n" + "PMULL2 v14.1q, v0.2d, v23.2d \n" +#ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR3 v15.16b, v15.16b, v31.16b, v14.16b \n" +#else + "EOR v15.16b, v15.16b, v31.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA3 + "EOR v15.16b, v15.16b, v14.16b \n" +#endif /* WOLFSSL_ARMASM_CRYPTO_SHA3 */ + "PMULL2 v14.1q, v15.2d, v23.2d \n" + "MOV v17.D[1], v15.D[0] \n" + "EOR v17.16b, v17.16b, v14.16b \n" + "LD1 {v14.2d, v15.2d}, [%[Key]] \n" + + "10: \n" + "CBZ w11, 30f \n" + "CMP w11, #16 \n" + "BLT 20f \n" + "LD1 {v14.2d, v15.2d}, [%[Key]] \n" + "# Decrypt first block for GHASH \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "LD1 {v28.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v13.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n \n" + "EOR v0.16b, v0.16b, v28.16b \n \n" + "ST1 {v0.2d}, [%[out]], #16 \n" + + "# When only one full block to decrypt go straight to GHASH \n" + "CMP w11, 16 \n" + "BLT 1f \n" + + "# Interweave GHASH and decrypt if more then 1 block \n" + "2: \n" + "RBIT v28.16b, v28.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "SUB w11, w11, #16 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "LD1 {v28.2d}, [%[input]], #16 \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v13.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n \n" + "EOR v0.16b, v0.16b, v28.16b \n \n" + "ST1 {v0.2d}, [%[out]], #16 \n" + "CMP w11, #16 \n" + "BGE 2b \n" + + "# GHASH on last block \n" + "1: \n" + "RBIT v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "MOV v18.D[1], v21.D[0] \n" + "EOR v17.16b, v18.16b, v20.16b \n" + + "20: \n" + "CBZ w11, 30f \n" + "EOR v31.16b, v31.16b, v31.16b \n" + "MOV x15, x11 \n" + "ST1 {v31.2d}, [%[scratch]] \n" + "23: \n" + "LDRB w14, [%[input]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 23b \n" + "SUB %[scratch], %[scratch], x11 \n" + "LD1 {v31.2d}, [%[scratch]] \n" + "RBIT v31.16b, v31.16b \n" + "ADD w12, w12, #1 \n" + "MOV v0.16b, v22.16b \n" + "REV w13, w12 \n" + "MOV v0.S[3], w13 \n" + "EOR v17.16b, v17.16b, v31.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "RBIT v31.16b, v31.16b \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v13.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n \n" + "EOR v0.16b, v0.16b, v31.16b \n \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV x15, x11 \n" + "24: \n" + "LDRB w14, [%[scratch]], #1 \n" + "STRB w14, [%[out]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 24b \n" + "SUB %[scratch], %[scratch], x11 \n" + + "30: \n" + "# store current counter value at the end \n" + "REV w13, w12 \n" + "MOV v22.S[3], w13 \n" + "LD1 {v0.16b}, [%[ctr]] \n" + "ST1 {v22.16b}, [%[ctr]] \n" + + "LSL %x[aSz], %x[aSz], #3 \n" + "LSL %x[sz], %x[sz], #3 \n" + "MOV v28.d[0], %x[aSz] \n" + "MOV v28.d[1], %x[sz] \n" + "REV64 v28.16b, v28.16b \n" + "RBIT v28.16b, v28.16b \n" + "EOR v17.16b, v17.16b, v28.16b \n" + "PMULL v18.1q, v17.1d, v16.1d \n" + "PMULL2 v19.1q, v17.2d, v16.2d \n" + "EXT v20.16b, v16.16b, v16.16b, #8 \n" + "AESE v0.16b, v1.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL v21.1q, v17.1d, v20.1d \n" + "PMULL2 v20.1q, v17.2d, v20.2d \n" + "AESE v0.16b, v2.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v20.16b, v20.16b, v21.16b \n" + "AESE v0.16b, v3.16b \n" + "AESMC v0.16b, v0.16b \n" + "EXT v21.16b, v18.16b, v19.16b, #8 \n" + "AESE v0.16b, v4.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v5.16b \n" + "AESMC v0.16b, v0.16b \n" + "# Reduce \n" + "PMULL2 v20.1q, v19.2d, v23.2d \n" + "AESE v0.16b, v6.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v21.16b, v21.16b, v20.16b \n" + "AESE v0.16b, v7.16b \n" + "AESMC v0.16b, v0.16b \n" + "PMULL2 v20.1q, v21.2d, v23.2d \n" + "AESE v0.16b, v8.16b \n" + "AESMC v0.16b, v0.16b \n" + "MOV v18.D[1], v21.D[0] \n" + "AESE v0.16b, v9.16b \n" + "AESMC v0.16b, v0.16b \n" + "EOR v17.16b, v18.16b, v20.16b \n" + "AESE v0.16b, v10.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v11.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v12.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v13.16b \n" + "AESMC v0.16b, v0.16b \n" + "AESE v0.16b, v14.16b \n" + "EOR v0.16b, v0.16b, v15.16b \n \n" + "RBIT v17.16b, v17.16b \n" + "EOR v0.16b, v0.16b, v17.16b \n \n" + "CMP %w[tagSz], #16 \n" + "BNE 40f \n" + "LD1 {v1.2d}, [%[tag]] \n" + "B 41f \n" + "40: \n" + "EOR v1.16b, v1.16b, v1.16b \n" + "MOV x15, %x[tagSz] \n" + "ST1 {v1.2d}, [%[scratch]] \n" + "43: \n" + "LDRB w14, [%[tag]], #1 \n" + "STRB w14, [%[scratch]], #1 \n" + "SUB x15, x15, #1 \n" + "CBNZ x15, 43b \n" + "SUB %[scratch], %[scratch], %x[tagSz] \n" + "LD1 {v1.2d}, [%[scratch]] \n" + "ST1 {v0.2d}, [%[scratch]] \n" + "MOV w14, #16 \n" + "SUB w14, w14, %w[tagSz] \n" + "ADD %[scratch], %[scratch], %x[tagSz] \n" + "44: \n" + "STRB wzr, [%[scratch]], #1 \n" + "SUB w14, w14, #1 \n" + "CBNZ w14, 44b \n" + "SUB %[scratch], %[scratch], #16 \n" + "LD1 {v0.2d}, [%[scratch]] \n" + "41: \n" + "EOR v0.16b, v0.16b, v1.16b \n" + "MOV v1.D[0], v0.D[1] \n" + "EOR v0.8b, v0.8b, v1.8b \n" + "MOV %x[ret], v0.D[0] \n" + "CMP %x[ret], #0 \n" + "MOV w11, #-180 \n" + "CSETM %w[ret], ne \n" + "AND %w[ret], %w[ret], w11 \n" + + : [out] "+r" (out), [input] "+r" (in), [Key] "+r" (keyPt), + [aSz] "+r" (authInSz), [sz] "+r" (sz), [aad] "+r" (authIn), + [ret] "+r" (ret) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "m" (aes->gcm.H), [tag] "r" (authTag), [tagSz] "r" (authTagSz) + : "cc", "memory", "x11", "x12", "w13", "x14", "x15", "w16", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", + "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + ); + + return ret; +} +#endif /* WOLFSSL_AES_256 */ /* * Check tag and decrypt data using AES with GCM mode. * aes: Aes structure having already been set with set key function @@ -2640,295 +12575,44 @@ * authIn: additional data buffer * authInSz: size of additional data buffer */ -int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, - const byte* iv, word32 ivSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz) +int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* iv, word32 ivSz, const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) { - word32 blocks = sz / AES_BLOCK_SIZE; - word32 partial = sz % AES_BLOCK_SIZE; - const byte* c = in; - byte* p = out; - byte counter[AES_BLOCK_SIZE]; - byte initialCounter[AES_BLOCK_SIZE]; - byte *ctr ; - byte scratch[AES_BLOCK_SIZE]; - - ctr = counter ; - /* sanity checks */ - if (aes == NULL || iv == NULL || (sz != 0 && (in == NULL || out == NULL)) || - authTag == NULL || authTagSz > AES_BLOCK_SIZE || authTagSz == 0 || - ivSz == 0) { + if ((aes == NULL) || (iv == NULL) || (authTag == NULL) || + (authTagSz > AES_BLOCK_SIZE) || (authTagSz == 0) || (ivSz == 0) || + ((sz != 0) && ((in == NULL) || (out == NULL)))) { WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); return BAD_FUNC_ARG; } - XMEMSET(initialCounter, 0, AES_BLOCK_SIZE); - if (ivSz == GCM_NONCE_MID_SZ) { - XMEMCPY(initialCounter, iv, ivSz); - initialCounter[AES_BLOCK_SIZE - 1] = 1; - } - else { - GHASH(aes, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); - GMULT(initialCounter, aes->H); - } - XMEMCPY(ctr, initialCounter, AES_BLOCK_SIZE); - - /* Calculate the authTag again using the received auth data and the - * cipher text. */ - { - byte Tprime[AES_BLOCK_SIZE]; - byte EKY0[AES_BLOCK_SIZE]; - - GHASH(aes, authIn, authInSz, in, sz, Tprime, sizeof(Tprime)); - GMULT(Tprime, aes->H); - wc_AesEncrypt(aes, ctr, EKY0); - xorbuf(Tprime, EKY0, sizeof(Tprime)); - - if (ConstantCompare(authTag, Tprime, authTagSz) != 0) { - return AES_GCM_AUTH_E; - } - } - - /* do as many blocks as possible */ - if (blocks > 0) { - /* pointer needed because it is incremented when read, causing - * an issue with call to encrypt/decrypt leftovers */ - byte* keyPt = (byte*)aes->key; - switch(aes->rounds) { + switch (aes->rounds) { #ifdef WOLFSSL_AES_128 - case 10: /* AES 128 BLOCK */ - __asm__ __volatile__ ( - "MOV w11, %w[blocks] \n" - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - - "#Create vector with the value 1 \n" - "MOVI v14.16b, #1 \n" - "USHR v14.2d, v14.2d, #56 \n" - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "EOR v13.16b, v13.16b, v13.16b \n" - "EXT v14.16b, v14.16b, v13.16b, #8 \n" - - "LD1 {v9.2d-v11.2d}, [%[Key]], #48 \n" - "LD1 {v12.2d}, [%[ctr]] \n" - "LD1 {v13.2d}, [%[input]], #16 \n" - - "1: \n" - "REV64 v12.16b, v12.16b \n" /* network order */ - "EXT v12.16b, v12.16b, v12.16b, #8 \n" - "ADD v12.4s, v12.4s, v14.4s \n" /* add 1 to counter */ - "EXT v12.16b, v12.16b, v12.16b, #8 \n" - "REV64 v12.16b, v12.16b \n" /* revert from network order */ - "MOV v0.16b, v12.16b \n" - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "SUB w11, w11, #1 \n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "EOR v0.16b, v0.16b, v11.16b \n" - - "EOR v0.16b, v0.16b, v13.16b \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - - "CBZ w11, 2f \n" - "LD1 {v13.2d}, [%[input]], #16 \n" - "B 1b \n" - - "2: \n" - "#store current counter value at the end \n" - "ST1 {v12.16b}, [%[ctrOut]] \n" - - :[out] "=r" (p), "=r" (keyPt), [ctrOut] "=r" (ctr), "=r" (c) - :"0" (p), [Key] "1" (keyPt), [ctr] "2" (ctr), [blocks] "r" (blocks), - [input] "3" (c) - : "cc", "memory", "w11", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14" - ); - break; + case 10: + return Aes128GcmDecrypt(aes, out, in, sz, iv, ivSz, + authTag, authTagSz, authIn, authInSz); #endif #ifdef WOLFSSL_AES_192 - case 12: /* AES 192 BLOCK */ - __asm__ __volatile__ ( - "MOV w11, %w[blocks] \n" - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - - "#Create vector with the value 1 \n" - "MOVI v16.16b, #1 \n" - "USHR v16.2d, v16.2d, #56 \n" - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "EOR v14.16b, v14.16b, v14.16b \n" - "EXT v16.16b, v16.16b, v14.16b, #8 \n" - - "LD1 {v9.2d-v12.2d}, [%[Key]], #64 \n" - "LD1 {v13.2d}, [%[Key]], #16 \n" - "LD1 {v14.2d}, [%[ctr]] \n" - "LD1 {v15.2d}, [%[input]], #16 \n" - - "1: \n" - "REV64 v14.16b, v14.16b \n" /* network order */ - "EXT v14.16b, v14.16b, v14.16b, #8 \n" - "ADD v14.4s, v14.4s, v16.4s \n" /* add 1 to counter */ - "EXT v14.16b, v14.16b, v14.16b, #8 \n" - "REV64 v14.16b, v14.16b \n" /* revert from network order */ - "MOV v0.16b, v14.16b \n" - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "SUB w11, w11, #1 \n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v12.16b \n" - "EOR v0.16b, v0.16b, v13.16b \n" - - "EOR v0.16b, v0.16b, v15.16b \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - - "CBZ w11, 2f \n" - "LD1 {v15.2d}, [%[input]], #16 \n" - "B 1b \n" - - "2: \n" - "#store current counter value at the end \n" - "ST1 {v14.2d}, [%[ctrOut]] \n" - - :[out] "=r" (p), "=r" (keyPt), [ctrOut] "=r" (ctr), "=r" (c) - :"0" (p), [Key] "1" (keyPt), [ctr] "2" (ctr), [blocks] "r" (blocks), - [input] "3" (c) - : "cc", "memory", "w11", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", - "v16" - ); - break; -#endif /* WOLFSSL_AES_192 */ + case 12: + return Aes192GcmDecrypt(aes, out, in, sz, iv, ivSz, + authTag, authTagSz, authIn, authInSz); +#endif #ifdef WOLFSSL_AES_256 - case 14: /* AES 256 BLOCK */ - __asm__ __volatile__ ( - "MOV w11, %w[blocks] \n" - "LD1 {v1.2d-v4.2d}, [%[Key]], #64 \n" - - "#Create vector with the value 1 \n" - "MOVI v18.16b, #1 \n" - "USHR v18.2d, v18.2d, #56 \n" - "LD1 {v5.2d-v8.2d}, [%[Key]], #64 \n" - "EOR v19.16b, v19.16b, v19.16b \n" - "EXT v18.16b, v18.16b, v19.16b, #8 \n" - - "LD1 {v9.2d-v12.2d}, [%[Key]], #64 \n" - "LD1 {v13.2d-v15.2d}, [%[Key]], #48 \n" - "LD1 {v17.2d}, [%[ctr]] \n" - "LD1 {v16.2d}, [%[input]], #16 \n" - - "1: \n" - "REV64 v17.16b, v17.16b \n" /* network order */ - "EXT v17.16b, v17.16b, v17.16b, #8 \n" - "ADD v17.4s, v17.4s, v18.4s \n" /* add 1 to counter */ - "EXT v17.16b, v17.16b, v17.16b, #8 \n" - "REV64 v17.16b, v17.16b \n" /* revert from network order */ - "MOV v0.16b, v17.16b \n" - "AESE v0.16b, v1.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v2.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v3.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v4.16b \n" - "AESMC v0.16b, v0.16b \n" - "SUB w11, w11, #1 \n" - "AESE v0.16b, v5.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v6.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v7.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v8.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v9.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v10.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v11.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v12.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v13.16b \n" - "AESMC v0.16b, v0.16b \n" - "AESE v0.16b, v14.16b \n" - "EOR v0.16b, v0.16b, v15.16b \n" - - "EOR v0.16b, v0.16b, v16.16b \n" - "ST1 {v0.2d}, [%[out]], #16 \n" - - "CBZ w11, 2f \n" - "LD1 {v16.2d}, [%[input]], #16 \n" - "B 1b \n" - - "2: \n" - "#store current counter value at the end \n" - "ST1 {v17.2d}, [%[ctrOut]] \n" - - :[out] "=r" (p), "=r" (keyPt), [ctrOut] "=r" (ctr), "=r" (c) - :"0" (p), [Key] "1" (keyPt), [ctr] "2" (ctr), [blocks] "r" (blocks), - [input] "3" (c) - : "cc", "memory", "w11", "v0", "v1", "v2", "v3", "v4", "v5", - "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", - "v16", "v17", "v18", "v19" - ); - break; -#endif /* WOLFSSL_AES_256 */ + case 14: + return Aes256GcmDecrypt(aes, out, in, sz, iv, ivSz, + authTag, authTagSz, authIn, authInSz); +#endif default: - WOLFSSL_MSG("Bad AES-GCM round value"); + WOLFSSL_MSG("AES-GCM invalid round number"); return BAD_FUNC_ARG; - } } - if (partial != 0) { - IncrementGcmCounter(ctr); - wc_AesEncrypt(aes, ctr, scratch); - - /* check if pointer is null after main AES-GCM blocks - * helps static analysis */ - if (p == NULL || c == NULL) { - return BAD_STATE_E; - } - xorbuf(scratch, c, partial); - XMEMCPY(p, scratch, partial); - } - return 0; } #endif /* HAVE_AES_DECRYPT */ + +/* END script replace AES-GCM Aarch64 with hardware crypto. */ + #endif /* HAVE_AESGCM */ @@ -4207,6 +13891,13 @@ return 0; } +int wc_AesCtrSetKey(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir) +{ + (void)dir; + return wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); +} + #endif /* WOLFSSL_AES_COUNTER */ #ifdef HAVE_AESGCM @@ -4215,7 +13906,7 @@ * on ARMv8". Shifting left to account for bit reflection is based on * "Carry-Less Multiplication and Its Usage for Computing the GCM mode" */ -static void GMULT(byte* X, byte* Y) +void GMULT(byte* X, byte* Y) { __asm__ __volatile__ ( "VLD1.32 {q0}, [%[x]] \n" @@ -4274,13 +13965,13 @@ } -void GHASH(Aes* aes, const byte* a, word32 aSz, - const byte* c, word32 cSz, byte* s, word32 sSz) +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, + byte* s, word32 sSz) { byte x[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE]; word32 blocks, partial; - byte* h = aes->H; + byte* h = gcm->H; XMEMSET(x, 0, AES_BLOCK_SIZE); @@ -4377,7 +14068,7 @@ initialCounter[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); } XMEMCPY(ctr, initialCounter, AES_BLOCK_SIZE); @@ -4398,7 +14089,7 @@ } - GHASH(aes, authIn, authInSz, out, sz, authTag, authTagSz); + GHASH(&aes->gcm, authIn, authInSz, out, sz, authTag, authTagSz); wc_AesEncrypt(aes, initialCounter, scratch); if (authTagSz > AES_BLOCK_SIZE) { xorbuf(authTag, scratch, AES_BLOCK_SIZE); @@ -4454,7 +14145,7 @@ initialCounter[AES_BLOCK_SIZE - 1] = 1; } else { - GHASH(aes, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, initialCounter, AES_BLOCK_SIZE); } XMEMCPY(ctr, initialCounter, AES_BLOCK_SIZE); @@ -4464,7 +14155,7 @@ byte Tprime[AES_BLOCK_SIZE]; byte EKY0[AES_BLOCK_SIZE]; - GHASH(aes, authIn, authInSz, in, sz, Tprime, sizeof(Tprime)); + GHASH(&aes->gcm, authIn, authInSz, in, sz, Tprime, sizeof(Tprime)); wc_AesEncrypt(aes, ctr, EKY0); xorbuf(Tprime, EKY0, sizeof(Tprime)); @@ -4523,7 +14214,7 @@ #define GHASH_ONE_BLOCK(aes, block) \ do { \ xorbuf(AES_TAG(aes), block, AES_BLOCK_SIZE); \ - GMULT(AES_TAG(aes), aes->H); \ + GMULT(AES_TAG(aes), aes->gcm.H); \ } \ while (0) @@ -4638,7 +14329,7 @@ sz = cSz; } XMEMCPY(AES_LASTGBLOCK(aes) + aes->cOver, c, sz); - /* Update count of unsed encrypted counter. */ + /* Update count of unused encrypted counter. */ aes->cOver += sz; if (aes->cOver == AES_BLOCK_SIZE) { /* We have filled up the block and can process. */ @@ -4682,7 +14373,7 @@ if (aes->cOver > 0) { /* Cipher text block incomplete. */ - over = aes->cOver; + over = aes->cOver; } if (over > 0) { /* Zeroize the unused part of the block. */ @@ -4716,13 +14407,13 @@ else { /* Counter is GHASH of IV. */ #ifdef OPENSSL_EXTRA - word32 aadTemp = aes->aadLen; - aes->aadLen = 0; + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; #endif - GHASH(aes, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); - GMULT(counter, aes->H); + GHASH(&aes->gcm, NULL, 0, iv, ivSz, counter, AES_BLOCK_SIZE); + GMULT(counter, aes->gcm.H); #ifdef OPENSSL_EXTRA - aes->aadLen = aadTemp; + aes->gcm.aadLen = aadTemp; #endif } @@ -4811,7 +14502,7 @@ xorbuf(authTag, AES_INITCTR(aes), authTagSz); #ifdef OPENSSL_EXTRA /* store AAD size for next call */ - aes->aadLen = aes->aSz; + aes->gcm.aadLen = aes->aSz; #endif /* Zeroize last block to protect sensitive data. */ ForceZero(AES_LASTBLOCK(aes), AES_BLOCK_SIZE); @@ -4838,8 +14529,7 @@ /* Check validity of parameters. */ if ((aes == NULL) || ((len > 0) && (key == NULL)) || - ((ivSz == 0) && (iv != NULL)) || - ((ivSz > 0) && (iv == NULL))) { + ((ivSz == 0) && (iv != NULL)) || ((ivSz > 0) && (iv == NULL))) { ret = BAD_FUNC_ARG; } @@ -4860,14 +14550,14 @@ } if (ret == 0) { - /* Setup with IV if needed. */ - if (iv != NULL) { - /* Cache the IV in AES GCM object. */ - XMEMCPY((byte*)aes->reg, iv, ivSz); + /* Set the IV passed in if it is smaller than a block. */ + if ((iv != NULL) && (ivSz <= AES_BLOCK_SIZE)) { + XMEMMOVE((byte*)aes->reg, iv, ivSz); aes->nonceSz = ivSz; } - else if (aes->nonceSz != 0) { - /* Copy out the cached copy. */ + /* No IV passed in, check for cached IV. */ + if ((iv == NULL) && (aes->nonceSz != 0)) { + /* Use the cached copy. */ iv = (byte*)aes->reg; ivSz = aes->nonceSz; } @@ -4972,7 +14662,7 @@ if (ret == 0) { /* Encrypt the plaintext. */ AesGcmCryptUpdate_C(aes, out, in, sz); - /* Update the authenication tag with any authentication data and the + /* Update the authentication tag with any authentication data and the * new cipher text. */ GHASH_UPDATE(aes, authIn, authInSz, out, sz); } @@ -5081,7 +14771,7 @@ if (ret == 0) { /* Decrypt with AAD and/or cipher text. */ - /* Update the authenication tag with any authentication data and + /* Update the authentication tag with any authentication data and * cipher text. */ GHASH_UPDATE(aes, authIn, authInSz, in, sz); /* Decrypt the cipher text. */ @@ -5401,10 +15091,10 @@ aes->gcmKeySet = 1; #endif - wc_AesEncrypt(aes, iv, aes->H); + wc_AesEncrypt(aes, iv, aes->gcm.H); #if defined(__aarch64__) { - word32* pt = (word32*)aes->H; + word32* pt = (word32*)aes->gcm.H; __asm__ volatile ( "LD1 {v0.16b}, [%[h]] \n" "RBIT v0.16b, v0.16b \n" @@ -5416,7 +15106,7 @@ } #else { - word32* pt = (word32*)aes->H; + word32* pt = (word32*)aes->gcm.H; __asm__ volatile ( "VLD1.32 {q0}, [%[h]] \n" "VREV64.8 q0, q0 \n" @@ -5459,11 +15149,1345 @@ #endif /* HAVE_AES_DECRYPT */ #endif /* WOLFSSL_AES_DIRECT */ +#ifdef WOLFSSL_AES_XTS + +#ifdef __aarch64__ + +#define AES_ENCRYPT_UPDATE_TWEAK(label) \ + "AESE v0.16b, v1.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AND x11, x19, x10, ASR #63\n" \ + "AESE v0.16b, v2.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v3.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "EXTR x10, x10, x9, #63 \n" \ + "AESE v0.16b, v4.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "AESE v0.16b, v5.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "EOR x9, x11, x9, LSL #1 \n" \ + "AESE v0.16b, v6.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v7.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v8.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "AESE v0.16b, v9.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESE v0.16b, v10.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v11.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESE v0.16b, v12.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v13.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + #label ": \n" \ + "AESE v0.16b, v14.16b \n" \ + "EOR v0.16b, v0.16b, v15.16b \n" + +#define AES_ENCRYPT(label) \ + "AESE v0.16b, v1.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v2.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v3.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v4.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "AESE v0.16b, v5.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v6.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v7.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v8.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "AESE v0.16b, v9.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESE v0.16b, v10.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v11.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESE v0.16b, v12.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + "AESE v0.16b, v13.16b \n" \ + "AESMC v0.16b, v0.16b \n" \ + \ + #label ": \n" \ + "AESE v0.16b, v14.16b \n" \ + "EOR v0.16b, v0.16b, v15.16b \n" + +#define AES_DECRYPT_UPDATE_TWEAK(label) \ + "AESD v0.16b, v1.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AND x11, x19, x10, ASR #63\n" \ + "AESD v0.16b, v2.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v3.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "EXTR x10, x10, x9, #63 \n" \ + "AESD v0.16b, v4.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "AESD v0.16b, v5.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "EOR x9, x11, x9, LSL #1 \n" \ + "AESD v0.16b, v6.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v7.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v8.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "AESD v0.16b, v9.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESD v0.16b, v10.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v11.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESD v0.16b, v12.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v13.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + #label ": \n" \ + "AESD v0.16b, v14.16b \n" \ + "EOR v0.16b, v0.16b, v15.16b \n" + +#define AES_DECRYPT(label) \ + "AESD v0.16b, v1.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v2.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v3.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v4.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "AESD v0.16b, v5.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v6.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v7.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v8.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "AESD v0.16b, v9.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESD v0.16b, v10.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v11.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + "SUBS WZR, %w[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESD v0.16b, v12.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + "AESD v0.16b, v13.16b \n" \ + "AESIMC v0.16b, v0.16b \n" \ + \ + #label ": \n" \ + "AESD v0.16b, v14.16b \n" \ + "EOR v0.16b, v0.16b, v15.16b \n" + +/* AES with XTS mode. (XTS) XEX encryption with Tweak and cipher text Stealing. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold cipher text + * in input plain text buffer to encrypt + * sz size of both out and in buffers + * i value to use for tweak + * iSz size of i buffer, should always be AES_BLOCK_SIZE but having this input + * adds a sanity check on how the user calls the function. + * + * returns 0 on success + */ +int wc_AesXtsEncrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, + const byte* i, word32 iSz) +{ + int ret = 0; + word32 blocks = (sz / AES_BLOCK_SIZE); + byte tmp[AES_BLOCK_SIZE]; + + if (xaes == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + if (blocks == 0) { + WOLFSSL_MSG("Plain text input too small for encryption"); + return BAD_FUNC_ARG; + } + + __asm__ __volatile__ ( + "MOV x19, 0x87 \n" + + "# Load tweak calculation key\n" + "LD1 {v0.16b}, [%[i]] \n" + "MOV x10, %[key2] \n" + "LD1 {v1.2d-v4.2d}, [x10], #64 \n" + "LD1 {v5.2d-v8.2d}, [x10], #64 \n" + "LD1 {v9.2d-v12.2d}, [x10], #64 \n" + "LD1 {v13.2d-v15.2d}, [x10] \n" + + "# Put last 2 blocks of keys based on rounds into v14, v15\n" + "SUBS WZR, %w[rounds], #14 \n" + "BEQ 40f \n" + "SUBS WZR, %w[rounds], #12 \n" + "MOV v14.16b, v12.16b \n" + "MOV v15.16b, v13.16b \n" + "BEQ 40f \n" + "MOV v14.16b, v10.16b \n" + "MOV v15.16b, v11.16b \n" + "40: \n" + + AES_ENCRYPT(10) + + "MOV x9, v0.d[0] \n" + "MOV x10, v0.d[1] \n" + "MOV v20.16b, v0.16b \n" + + "# Load encryption key\n" + "MOV x11, %[key] \n" + "LD1 {v1.2d-v4.2d}, [x11], #64 \n" + "LD1 {v5.2d-v8.2d}, [x11], #64 \n" + "LD1 {v9.2d-v12.2d}, [x11], #64 \n" + "LD1 {v13.2d-v15.2d}, [x11] \n" + + "# Put last 2 blocks of keys based on rounds into v14, v15\n" + "SUBS WZR, %w[rounds], #14 \n" + "BEQ 41f \n" + "SUBS WZR, %w[rounds], #10 \n" + "MOV v14.16b, v10.16b \n" + "MOV v15.16b, v11.16b \n" + "BEQ 41f \n" + "MOV v14.16b, v12.16b \n" + "MOV v15.16b, v13.16b \n" + "41: \n" + + "SUBS WZR, %w[blocks], #4 \n" + "BLT 1f \n" + + "AND %w[sz], %w[sz], 0x3f \n" + + "AND x17, x19, x10, ASR #63\n" + "EXTR x12, x10, x9, #63 \n" + "EOR x11, x17, x9, LSL #1 \n" + + "AND x17, x19, x12, ASR #63\n" + "EXTR x14, x12, x11, #63 \n" + "EOR x13, x17, x11, LSL #1 \n" + + "AND x17, x19, x14, ASR #63\n" + "EXTR x16, x14, x13, #63 \n" + "EOR x15, x17, x13, LSL #1 \n" + + "SUB %w[blocks], %w[blocks], #4 \n" + + "#Four blocks at a time\n" + "20:\n" + + "LD1 {v16.16b-v19.16b}, [%[in]], #64 \n" + + "MOV v21.d[0], x11 \n" + "MOV v21.d[1], x12 \n" + "MOV v22.d[0], x13 \n" + "MOV v22.d[1], x14 \n" + "MOV v23.d[0], x15 \n" + "MOV v23.d[1], x16 \n" + + "EOR v16.16b, v16.16b, v20.16b \n" + "EOR v17.16b, v17.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v22.16b \n" + "EOR v19.16b, v19.16b, v23.16b \n" + + "AESE v16.16b, v1.16b \n" + "AESMC v16.16b, v16.16b \n" + "AND x17, x19, x16, ASR #63\n" + "AESE v17.16b, v1.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v1.16b \n" + "AESMC v18.16b, v18.16b \n" + "EXTR x10, x16, x15, #63 \n" + "AESE v19.16b, v1.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v2.16b \n" + "AESMC v16.16b, v16.16b \n" + "EOR x9, x17, x15, LSL #1 \n" + "AESE v17.16b, v2.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v2.16b \n" + "AESMC v18.16b, v18.16b \n" + "AND x17, x19, x10, ASR #63\n" + "AESE v19.16b, v2.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v3.16b \n" + "AESMC v16.16b, v16.16b \n" + "EXTR x12, x10, x9, #63 \n" + "AESE v17.16b, v3.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v3.16b \n" + "AESMC v18.16b, v18.16b \n" + "EOR x11, x17, x9, LSL #1 \n" + "AESE v19.16b, v3.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v4.16b \n" + "AESMC v16.16b, v16.16b \n" + "AND x17, x19, x12, ASR #63\n" + "AESE v17.16b, v4.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v4.16b \n" + "AESMC v18.16b, v18.16b \n" + "EXTR x14, x12, x11, #63 \n" + "AESE v19.16b, v4.16b \n" + "AESMC v19.16b, v19.16b \n" + + "AESE v16.16b, v5.16b \n" + "AESMC v16.16b, v16.16b \n" + "EOR x13, x17, x11, LSL #1 \n" + "AESE v17.16b, v5.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v5.16b \n" + "AESMC v18.16b, v18.16b \n" + "AND x17, x19, x14, ASR #63\n" + "AESE v19.16b, v5.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v6.16b \n" + "AESMC v16.16b, v16.16b \n" + "EXTR x16, x14, x13, #63 \n" + "AESE v17.16b, v6.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v6.16b \n" + "AESMC v18.16b, v18.16b \n" + "EOR x15, x17, x13, LSL #1 \n" + "AESE v19.16b, v6.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v7.16b \n" + "AESMC v16.16b, v16.16b \n" + "AESE v17.16b, v7.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v7.16b \n" + "AESMC v18.16b, v18.16b \n" + "AESE v19.16b, v7.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v8.16b \n" + "AESMC v16.16b, v16.16b \n" + "AESE v17.16b, v8.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v8.16b \n" + "AESMC v18.16b, v18.16b \n" + "AESE v19.16b, v8.16b \n" + "AESMC v19.16b, v19.16b \n" + + "AESE v16.16b, v9.16b \n" + "AESMC v16.16b, v16.16b \n" + "AESE v17.16b, v9.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v9.16b \n" + "AESMC v18.16b, v18.16b \n" + "AESE v19.16b, v9.16b \n" + "AESMC v19.16b, v19.16b \n" + + "SUBS WZR, %w[rounds], #10 \n" + "BEQ 21f \n" + "AESE v16.16b, v10.16b \n" + "AESMC v16.16b, v16.16b \n" + "AESE v17.16b, v10.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v10.16b \n" + "AESMC v18.16b, v18.16b \n" + "AESE v19.16b, v10.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v11.16b \n" + "AESMC v16.16b, v16.16b \n" + "AESE v17.16b, v11.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v11.16b \n" + "AESMC v18.16b, v18.16b \n" + "AESE v19.16b, v11.16b \n" + "AESMC v19.16b, v19.16b \n" + + "SUBS WZR, %w[rounds], #12 \n" + "BEQ 21f \n" + "AESE v16.16b, v12.16b \n" + "AESMC v16.16b, v16.16b \n" + "AESE v17.16b, v12.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v12.16b \n" + "AESMC v18.16b, v18.16b \n" + "AESE v19.16b, v12.16b \n" + "AESMC v19.16b, v19.16b \n" + "AESE v16.16b, v13.16b \n" + "AESMC v16.16b, v16.16b \n" + "AESE v17.16b, v13.16b \n" + "AESMC v17.16b, v17.16b \n" + "AESE v18.16b, v13.16b \n" + "AESMC v18.16b, v18.16b \n" + "AESE v19.16b, v13.16b \n" + "AESMC v19.16b, v19.16b \n" + + "21: \n" + "AESE v16.16b, v14.16b \n" + "EOR v16.16b, v16.16b, v15.16b \n" + "AESE v17.16b, v14.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "AESE v18.16b, v14.16b \n" + "EOR v18.16b, v18.16b, v15.16b \n" + "AESE v19.16b, v14.16b \n" + "EOR v19.16b, v19.16b, v15.16b \n" + + "EOR v16.16b, v16.16b, v20.16b \n" + "EOR v17.16b, v17.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v22.16b \n" + "EOR v19.16b, v19.16b, v23.16b \n" + "MOV v20.d[0], x9 \n" + "MOV v20.d[1], x10 \n" + + "ST1 {v16.16b-v19.16b}, [%[out]], #64 \n" + + "SUBS %w[blocks], %w[blocks], #4 \n" + "BGE 20b \n" + "ADD %w[blocks], %w[blocks], #4 \n" + + "CBZ %w[sz], 3f \n" + + "CBZ %w[blocks], 30f \n" + + "1: \n" + "LD1 {v0.16b}, [%[in]], #16 \n" + + "MOV x9, v20.d[0] \n" + "MOV x10, v20.d[1] \n" + + "EOR v0.16b, v0.16b, v20.16b \n" + + AES_ENCRYPT_UPDATE_TWEAK(2) + + "EOR v0.16b, v0.16b, v20.16b \n" + + "ST1 {v0.16b}, [%[out]], #16 \n" + + "MOV v20.d[0], x9 \n" + "MOV v20.d[1], x10 \n" + + "SUBS %w[blocks], %w[blocks], #1 \n" + "SUB %w[sz], %w[sz], #16 \n" + "BGT 1b \n" + + "CBZ %w[sz], 3f \n" + + "30: \n" + "#Partial block \n" + "SUB %[out], %[out], #16 \n" + "LD1 {v0.16b}, [%[out]], #16 \n" + "ST1 {v0.16b}, [%[tmp]] \n" + + "MOV w12, %w[sz] \n" + "4: \n" + "LDRB w13, [%[tmp]] \n" + "LDRB w14, [%[in]], #1 \n" + "STRB w13, [%[out]], #1 \n" + "STRB w14, [%[tmp]], #1 \n" + "SUBS w12, w12, #1 \n" + "BGT 4b \n" + + "SUB %[out], %[out], %x[sz] \n" + "SUB %[tmp], %[tmp], %x[sz] \n" + "SUB %[out], %[out], #16 \n" + + "LD1 {v0.16b}, [%[tmp]] \n" + + "EOR v0.16b, v0.16b, v20.16b \n" + + AES_ENCRYPT(5) + + "EOR v0.16b, v0.16b, v20.16b \n" + + "STR q0, [%[out]] \n" + + "3: \n" + + : [blocks] "+r" (blocks), [in] "+r" (in), [out] "+r" (out), + [sz] "+r" (sz) + : [key] "r" (xaes->aes.key), [rounds] "r" (xaes->aes.rounds), + [key2] "r" (xaes->tweak.key), [i] "r" (i), + [tmp] "r" (tmp) + : "cc", "memory", + "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", + "x17", "x19", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23" + ); + + return ret; +} + +/* Same process as encryption but Aes key is AES_DECRYPTION type. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold plain text + * in input cipher text buffer to decrypt + * sz size of both out and in buffers + * i value to use for tweak + * iSz size of i buffer, should always be AES_BLOCK_SIZE but having this input + * adds a sanity check on how the user calls the function. + * + * returns 0 on success + */ +int wc_AesXtsDecrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, + const byte* i, word32 iSz) +{ + int ret = 0; + word32 blocks = (sz / AES_BLOCK_SIZE); + byte tmp[AES_BLOCK_SIZE]; + byte stl = (sz % AES_BLOCK_SIZE); + + if (xaes == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + if (blocks == 0) { + WOLFSSL_MSG("Plain text input too small for encryption"); + return BAD_FUNC_ARG; + } + + /* if Stealing then break out of loop one block early to handle special + * case */ + blocks -= (stl > 0); + + __asm__ __volatile__ ( + "MOV x19, 0x87 \n" + + "LD1 {v0.16b}, [%[i]] \n" + "MOV x10, %[key2] \n" + "LD1 {v1.2d-v4.2d}, [x10], #64 \n" + "LD1 {v5.2d-v8.2d}, [x10], #64 \n" + "LD1 {v9.2d-v12.2d}, [x10], #64 \n" + "LD1 {v13.2d-v15.2d}, [x10] \n" + + "SUBS WZR, %w[rounds], #14 \n" + "BEQ 40f \n" + "SUBS WZR, %w[rounds], #12 \n" + "MOV v14.16b, v12.16b \n" + "MOV v15.16b, v13.16b \n" + "BEQ 40f \n" + "MOV v14.16b, v10.16b \n" + "MOV v15.16b, v11.16b \n" + "40: \n" + + AES_ENCRYPT(10) + + "MOV x9, v0.d[0] \n" + "MOV x10, v0.d[1] \n" + "MOV v20.16b, v0.16b \n" + + "MOV x11, %[key] \n" + "LD1 {v1.2d-v4.2d}, [x11], #64 \n" + "LD1 {v5.2d-v8.2d}, [x11], #64 \n" + "LD1 {v9.2d-v12.2d}, [x11], #64 \n" + "LD1 {v13.2d-v15.2d}, [x11] \n" + + "SUBS WZR, %w[rounds], #14 \n" + "BEQ 41f \n" + "SUBS WZR, %w[rounds], #12 \n" + "MOV v14.16b, v12.16b \n" + "MOV v15.16b, v13.16b \n" + "BEQ 41f \n" + "MOV v14.16b, v10.16b \n" + "MOV v15.16b, v11.16b \n" + "41: \n" + + "CBZ %w[blocks], 3f \n" + + "SUBS WZR, %w[blocks], #4 \n" + "BLT 1f \n" + + "AND x17, x19, x10, ASR #63\n" + "EXTR x12, x10, x9, #63 \n" + "EOR x11, x17, x9, LSL #1 \n" + + "AND x17, x19, x12, ASR #63\n" + "EXTR x14, x12, x11, #63 \n" + "EOR x13, x17, x11, LSL #1 \n" + + "AND x17, x19, x14, ASR #63\n" + "EXTR x16, x14, x13, #63 \n" + "EOR x15, x17, x13, LSL #1 \n" + + "SUB %w[blocks], %w[blocks], #4 \n" + + "#Four blocks at a time\n" + "20:\n" + + "LD1 {v16.16b-v19.16b}, [%[in]], #64 \n" + + "MOV v21.d[0], x11 \n" + "MOV v21.d[1], x12 \n" + "MOV v22.d[0], x13 \n" + "MOV v22.d[1], x14 \n" + "MOV v23.d[0], x15 \n" + "MOV v23.d[1], x16 \n" + + "EOR v16.16b, v16.16b, v20.16b \n" + "EOR v17.16b, v17.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v22.16b \n" + "EOR v19.16b, v19.16b, v23.16b \n" + + "AESD v16.16b, v1.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AND x17, x19, x16, ASR #63\n" + "AESD v17.16b, v1.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v1.16b \n" + "AESIMC v18.16b, v18.16b \n" + "EXTR x10, x16, x15, #63 \n" + "AESD v19.16b, v1.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v2.16b \n" + "AESIMC v16.16b, v16.16b \n" + "EOR x9, x17, x15, LSL #1 \n" + "AESD v17.16b, v2.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v2.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AND x17, x19, x10, ASR #63\n" + "AESD v19.16b, v2.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v3.16b \n" + "AESIMC v16.16b, v16.16b \n" + "EXTR x12, x10, x9, #63 \n" + "AESD v17.16b, v3.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v3.16b \n" + "AESIMC v18.16b, v18.16b \n" + "EOR x11, x17, x9, LSL #1 \n" + "AESD v19.16b, v3.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v4.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AND x17, x19, x12, ASR #63\n" + "AESD v17.16b, v4.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v4.16b \n" + "AESIMC v18.16b, v18.16b \n" + "EXTR x14, x12, x11, #63 \n" + "AESD v19.16b, v4.16b \n" + "AESIMC v19.16b, v19.16b \n" + + "AESD v16.16b, v5.16b \n" + "AESIMC v16.16b, v16.16b \n" + "EOR x13, x17, x11, LSL #1 \n" + "AESD v17.16b, v5.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v5.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AND x17, x19, x14, ASR #63\n" + "AESD v19.16b, v5.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v6.16b \n" + "AESIMC v16.16b, v16.16b \n" + "EXTR x16, x14, x13, #63 \n" + "AESD v17.16b, v6.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v6.16b \n" + "AESIMC v18.16b, v18.16b \n" + "EOR x15, x17, x13, LSL #1 \n" + "AESD v19.16b, v6.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v7.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AESD v17.16b, v7.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v7.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AESD v19.16b, v7.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v8.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AESD v17.16b, v8.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v8.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AESD v19.16b, v8.16b \n" + "AESIMC v19.16b, v19.16b \n" + + "AESD v16.16b, v9.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AESD v17.16b, v9.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v9.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AESD v19.16b, v9.16b \n" + "AESIMC v19.16b, v19.16b \n" + + "SUBS WZR, %w[rounds], #10 \n" + "BEQ 21f \n" + "AESD v16.16b, v10.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AESD v17.16b, v10.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v10.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AESD v19.16b, v10.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v11.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AESD v17.16b, v11.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v11.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AESD v19.16b, v11.16b \n" + "AESIMC v19.16b, v19.16b \n" + + "SUBS WZR, %w[rounds], #12 \n" + "BEQ 21f \n" + "AESD v16.16b, v12.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AESD v17.16b, v12.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v12.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AESD v19.16b, v12.16b \n" + "AESIMC v19.16b, v19.16b \n" + "AESD v16.16b, v13.16b \n" + "AESIMC v16.16b, v16.16b \n" + "AESD v17.16b, v13.16b \n" + "AESIMC v17.16b, v17.16b \n" + "AESD v18.16b, v13.16b \n" + "AESIMC v18.16b, v18.16b \n" + "AESD v19.16b, v13.16b \n" + "AESIMC v19.16b, v19.16b \n" + + "21: \n" + "AESD v16.16b, v14.16b \n" + "EOR v16.16b, v16.16b, v15.16b \n" + "AESD v17.16b, v14.16b \n" + "EOR v17.16b, v17.16b, v15.16b \n" + "AESD v18.16b, v14.16b \n" + "EOR v18.16b, v18.16b, v15.16b \n" + "AESD v19.16b, v14.16b \n" + "EOR v19.16b, v19.16b, v15.16b \n" + + "EOR v16.16b, v16.16b, v20.16b \n" + "EOR v17.16b, v17.16b, v21.16b \n" + "EOR v18.16b, v18.16b, v22.16b \n" + "EOR v19.16b, v19.16b, v23.16b \n" + "MOV v20.d[0], x9 \n" + "MOV v20.d[1], x10 \n" + + "ST1 {v16.16b-v19.16b}, [%[out]], #64 \n" + + "SUBS %w[blocks], %w[blocks], #4 \n" + "SUB %w[sz], %w[sz], #64 \n" + "BGE 20b \n" + "ADD %w[blocks], %w[blocks], #4 \n" + + "CBZ %w[sz], 4f \n" + + "CBZ %w[blocks], 3f \n" + + "1: \n" + "LD1 {v0.16b}, [%[in]], #16 \n" + + "EOR v0.16b, v0.16b, v20.16b \n" + + AES_DECRYPT_UPDATE_TWEAK(2) + + "EOR v0.16b, v0.16b, v20.16b \n" + + "ST1 {v0.16b}, [%[out]], #16 \n" + + "MOV v20.d[0], x9 \n" + "MOV v20.d[1], x10 \n" + + "SUBS %w[blocks], %w[blocks], #1 \n" + "SUB %w[sz], %w[sz], #16 \n" + "BGT 1b \n" + + "CBZ %w[sz], 4f \n" + + "3: \n" + + "AND x11, x19, x10, ASR #63\n" + "EXTR x10, x10, x9, #63 \n" + "EOR x9, x11, x9, LSL #1 \n" + "MOV v21.d[0], x9 \n" + "MOV v21.d[1], x10 \n" + + "LD1 {v0.16b}, [%[in]], #16 \n" + + "EOR v0.16b, v0.16b, v21.16b \n" + + AES_DECRYPT(5) + + "EOR v0.16b, v0.16b, v21.16b \n" + + "SUB %w[sz], %w[sz], #16 \n" + + "ST1 {v0.16b}, [%[tmp]] \n" + "ADD %[out], %[out], #16 \n" + "MOV w12, %w[sz] \n" + "6: \n" + "LDRB w13, [%[tmp]] \n" + "LDRB w14, [%[in]], #1 \n" + "STRB w13, [%[out]], #1 \n" + "STRB w14, [%[tmp]], #1 \n" + "SUBS w12, w12, #1 \n" + "BGT 6b \n" + "SUB %[out], %[out], %x[sz] \n" + "SUB %[tmp], %[tmp], %x[sz] \n" + "SUB %[out], %[out], #16 \n" + + "LD1 {v0.16b}, [%[tmp]] \n" + + "EOR v0.16b, v0.16b, v20.16b \n" + + AES_DECRYPT(7) + + "EOR v0.16b, v0.16b, v20.16b \n" + + "ST1 {v0.16b}, [%[out]] \n" + + "4: \n" + + : [blocks] "+r" (blocks), [in] "+r" (in), [out] "+r" (out), + [sz] "+r" (sz) + : [key] "r" (xaes->aes.key), [rounds] "r" (xaes->aes.rounds), + [key2] "r" (xaes->tweak.key), [i] "r" (i), + [tmp] "r" (tmp) + : "cc", "memory", + "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", + "x17", "x19", + "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", + "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23" + ); + + return ret; +} +#else + +#define AES_ENCRYPT_UPDATE_TWEAK(label) \ + "AESE.8 q0, q1 \n" \ + "AESMC.8 q0, q0 \n" \ + "AND %[i], r14, r12, ASR #31 \n" \ + "AESE.8 q0, q2 \n" \ + "AESMC.8 q0, q0 \n" \ + "LSL r12, r12, #1 \n" \ + "AESE.8 q0, q3 \n" \ + "AESMC.8 q0, q0 \n" \ + "ORR r12, r12, r11, LSR #31 \n" \ + "AESE.8 q0, q4 \n" \ + "AESMC.8 q0, q0 \n" \ + "LSL r11, r11, #1 \n" \ + \ + "AESE.8 q0, q5 \n" \ + "AESMC.8 q0, q0 \n" \ + "ORR r11, r11, r10, LSR #31 \n" \ + "AESE.8 q0, q6 \n" \ + "AESMC.8 q0, q0 \n" \ + "LSL r10, r10, #1 \n" \ + "AESE.8 q0, q7 \n" \ + "AESMC.8 q0, q0 \n" \ + "ORR r10, r10, r9, LSR #31 \n" \ + "AESE.8 q0, q8 \n" \ + "AESMC.8 q0, q0 \n" \ + "EOR r9, %[i], r9, LSL #1 \n" \ + \ + "AESE.8 q0, q9 \n" \ + "AESMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESE.8 q0, q10 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q11 \n" \ + "AESMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESE.8 q0, q10 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q11 \n" \ + "AESMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + #label ": \n" \ + "AESE.8 q0, q10 \n" \ + "VEOR q0, q0, q11 \n" + +#define AES_ENCRYPT(label) \ + "AESE.8 q0, q1 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q2 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q3 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q4 \n" \ + "AESMC.8 q0, q0 \n" \ + \ + "AESE.8 q0, q5 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q6 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q7 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q8 \n" \ + "AESMC.8 q0, q0 \n" \ + \ + "AESE.8 q0, q9 \n" \ + "AESMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESE.8 q0, q10 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q11 \n" \ + "AESMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESE.8 q0, q10 \n" \ + "AESMC.8 q0, q0 \n" \ + "AESE.8 q0, q11 \n" \ + "AESMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + #label ": \n" \ + "AESE.8 q0, q10 \n" \ + "VEOR q0, q0, q11 \n" + +#define AES_DECRYPT_UPDATE_TWEAK(label) \ + "AESD.8 q0, q1 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AND %[i], r14, r12, ASR #31 \n" \ + "AESD.8 q0, q2 \n" \ + "AESIMC.8 q0, q0 \n" \ + "LSL r12, r12, #1 \n" \ + "AESD.8 q0, q3 \n" \ + "AESIMC.8 q0, q0 \n" \ + "ORR r12, r12, r11, LSR #31 \n" \ + "AESD.8 q0, q4 \n" \ + "AESIMC.8 q0, q0 \n" \ + "LSL r11, r11, #1 \n" \ + \ + "AESD.8 q0, q5 \n" \ + "AESIMC.8 q0, q0 \n" \ + "ORR r11, r11, r10, LSR #31 \n" \ + "AESD.8 q0, q6 \n" \ + "AESIMC.8 q0, q0 \n" \ + "LSL r10, r10, #1 \n" \ + "AESD.8 q0, q7 \n" \ + "AESIMC.8 q0, q0 \n" \ + "ORR r10, r10, r9, LSR #31 \n" \ + "AESD.8 q0, q8 \n" \ + "AESIMC.8 q0, q0 \n" \ + "EOR r9, %[i], r9, LSL #1 \n" \ + \ + "AESD.8 q0, q9 \n" \ + "AESIMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESD.8 q0, q10 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q11 \n" \ + "AESIMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESD.8 q0, q10 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q11 \n" \ + "AESIMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + #label ": \n" \ + "AESD.8 q0, q10 \n" \ + "VEOR q0, q0, q11 \n" + +#define AES_DECRYPT(label) \ + "AESD.8 q0, q1 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q2 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q3 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q4 \n" \ + "AESIMC.8 q0, q0 \n" \ + \ + "AESD.8 q0, q5 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q6 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q7 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q8 \n" \ + "AESIMC.8 q0, q0 \n" \ + \ + "AESD.8 q0, q9 \n" \ + "AESIMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #10 \n" \ + "BLE " #label "f \n" \ + "AESD.8 q0, q10 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q11 \n" \ + "AESIMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + "CMP %[rounds], #12 \n" \ + "BLE " #label "f \n" \ + "AESD.8 q0, q10 \n" \ + "AESIMC.8 q0, q0 \n" \ + "AESD.8 q0, q11 \n" \ + "AESIMC.8 q0, q0 \n" \ + "VLD1.32 {d20, d21, d22, d23}, [%[key2]]! \n" \ + \ + #label ": \n" \ + "AESD.8 q0, q10 \n" \ + "VEOR q0, q0, q11 \n" + +/* AES with XTS mode. (XTS) XEX encryption with Tweak and cipher text Stealing. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold cipher text + * in input plain text buffer to encrypt + * sz size of both out and in buffers + * i value to use for tweak + * iSz size of i buffer, should always be AES_BLOCK_SIZE but having this input + * adds a sanity check on how the user calls the function. + * + * returns 0 on success + */ +int wc_AesXtsEncrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, + const byte* i, word32 iSz) +{ + int ret = 0; + word32 blocks = (sz / AES_BLOCK_SIZE); + byte tmp[AES_BLOCK_SIZE]; + word32* key2 = xaes->tweak.key; + + if (xaes == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + if (blocks == 0) { + WOLFSSL_MSG("Plain text input too small for encryption"); + return BAD_FUNC_ARG; + } + + __asm__ __volatile__ ( + "MOV r14, #0x87 \n" + + "# Load tweak calculation key\n" + "VLD1.32 {q0}, [%[i]] \n" + "VLD1.32 {d2, d3, d4, d5}, [%[key2]]! \n" + "VLD1.32 {d6, d7, d8, d9}, [%[key2]]! \n" + "VLD1.32 {d10, d11, d12, d13}, [%[key2]]! \n" + "VLD1.32 {d14, d15, d16, d17}, [%[key2]]! \n" + "VLD1.32 {d18, d19}, [%[key2]]! \n" + + AES_ENCRYPT(10) + + "VMOV.32 r9, d0[0] \n" + "VMOV.32 r10, d0[1] \n" + "VMOV.32 r11, d1[0] \n" + "VMOV.32 r12, d1[1] \n" + "VMOV q14, q0 \n" + + "# Load encryption key\n" + "MOV %[key2], %[key] \n" + "VLD1.32 {d2, d3, d4, d5}, [%[key2]]! \n" + "VLD1.32 {d6, d7, d8, d9}, [%[key2]]! \n" + "VLD1.32 {d10, d11, d12, d13}, [%[key2]]! \n" + "VLD1.32 {d14, d15, d16, d17}, [%[key2]]! \n" + "VLD1.32 {d18, d19}, [%[key2]]! \n" + + "1: \n" + "VLD1.32 {q0}, [%[in]]! \n" + "ADD %[key2], %[key], #144 \n" + + "VMOV.32 r9, d28[0] \n" + "VMOV.32 r10, d28[1] \n" + "VMOV.32 r11, d29[0] \n" + "VMOV.32 r12, d29[1] \n" + + "VEOR q0, q0, q14 \n" + + AES_ENCRYPT_UPDATE_TWEAK(2) + + "VEOR q0, q0, q14 \n" + + "VST1.32 {q0}, [%[out]]! \n" + + "VMOV.32 d28[0], r9 \n" + "VMOV.32 d28[1], r10 \n" + "VMOV.32 d29[0], r11 \n" + "VMOV.32 d29[1], r12 \n" + + "SUBS %[blocks], %[blocks], #1 \n" + "SUB %[sz], %[sz], #16 \n" + "BGT 1b \n" + + "CMP %[sz], #0 \n" + "BEQ 3f \n" + + "30: \n" + "#Partial block \n" + "SUB %[out], %[out], #16 \n" + "VLD1.32 {q0}, [%[out]]! \n" + "VST1.32 {q0}, [%[tmp]] \n" + + "MOV r9, %[sz] \n" + "4: \n" + "LDRB r10, [%[tmp]] \n" + "LDRB r11, [%[in]], #1 \n" + "STRB r10, [%[out]], #1 \n" + "STRB r11, [%[tmp]], #1 \n" + "SUBS r9, r9, #1 \n" + "BGT 4b \n" + + "SUB %[out], %[out], %[sz] \n" + "SUB %[tmp], %[tmp], %[sz] \n" + "SUB %[out], %[out], #16 \n" + + "VLD1.32 {q0}, [%[tmp]] \n" + "ADD %[key2], %[key], #144 \n" + + "VEOR q0, q0, q14 \n" + + AES_ENCRYPT(5) + + "VEOR q0, q0, q14 \n" + + "VST1.32 {q0}, [%[out]] \n" + + "3: \n" + + : [blocks] "+r" (blocks), [in] "+r" (in), [out] "+r" (out), + [sz] "+r" (sz), [i] "+r" (i), [key2] "+r" (key2) + : [key] "r" (xaes->aes.key), [rounds] "r" (xaes->aes.rounds), + [tmp] "r" (tmp) + : "cc", "memory", + "r9", "r10", "r11", "r12", "r14", + "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", + "q8", "q9", "q10", "q11", "q14" + ); + + return ret; +} + +/* Same process as encryption but Aes key is AES_DECRYPTION type. + * + * xaes AES keys to use for block encrypt/decrypt + * out output buffer to hold plain text + * in input cipher text buffer to decrypt + * sz size of both out and in buffers + * i value to use for tweak + * iSz size of i buffer, should always be AES_BLOCK_SIZE but having this input + * adds a sanity check on how the user calls the function. + * + * returns 0 on success + */ +int wc_AesXtsDecrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz, + const byte* i, word32 iSz) +{ + int ret = 0; + word32 blocks = (sz / AES_BLOCK_SIZE); + byte tmp[AES_BLOCK_SIZE]; + byte stl = (sz % AES_BLOCK_SIZE); + word32* key2 = xaes->tweak.key; + + if (xaes == NULL || out == NULL || in == NULL) { + return BAD_FUNC_ARG; + } + + if (iSz < AES_BLOCK_SIZE) { + return BAD_FUNC_ARG; + } + + if (blocks == 0) { + WOLFSSL_MSG("Plain text input too small for encryption"); + return BAD_FUNC_ARG; + } + + /* if Stealing then break out of loop one block early to handle special + * case */ + blocks -= (stl > 0); + + __asm__ __volatile__ ( + "MOV r14, #0x87 \n" + + "VLD1.32 {q0}, [%[i]] \n" + "VLD1.32 {d2, d3, d4, d5}, [%[key2]]! \n" + "VLD1.32 {d6, d7, d8, d9}, [%[key2]]! \n" + "VLD1.32 {d10, d11, d12, d13}, [%[key2]]! \n" + "VLD1.32 {d14, d15, d16, d17}, [%[key2]]! \n" + "VLD1.32 {d18, d19}, [%[key2]]! \n" + + AES_ENCRYPT(10) + + "VMOV.32 r9, d0[0] \n" + "VMOV.32 r10, d0[1] \n" + "VMOV.32 r11, d1[0] \n" + "VMOV.32 r12, d1[1] \n" + "VMOV q14, q0 \n" + + "# Load decryption key\n" + "MOV %[key2], %[key] \n" + "VLD1.32 {d2, d3, d4, d5}, [%[key2]]! \n" + "VLD1.32 {d6, d7, d8, d9}, [%[key2]]! \n" + "VLD1.32 {d10, d11, d12, d13}, [%[key2]]! \n" + "VLD1.32 {d14, d15, d16, d17}, [%[key2]]! \n" + "VLD1.32 {d18, d19}, [%[key2]]! \n" + + "CMP %[blocks], #0 \n" + "BEQ 3f \n" + + "1: \n" + "VLD1.32 {q0}, [%[in]]! \n" + "ADD %[key2], %[key], #144 \n" + + "VEOR q0, q0, q14 \n" + + AES_DECRYPT_UPDATE_TWEAK(2) + + "VEOR q0, q0, q14 \n" + + "VST1.32 {q0}, [%[out]]! \n" + + "VMOV.32 d28[0], r9 \n" + "VMOV.32 d28[1], r10 \n" + "VMOV.32 d29[0], r11 \n" + "VMOV.32 d29[1], r12 \n" + + "SUBS %[blocks], %[blocks], #1 \n" + "SUB %[sz], %[sz], #16 \n" + "BGT 1b \n" + + "CMP %[sz], #0 \n" + "BEQ 4f \n" + + "3: \n" + + "AND %[i], r14, r12, ASR #31 \n" + "LSL r12, r12, #1 \n" + "ORR r12, r12, r11, LSR #31 \n" + "LSL r11, r11, #1 \n" + "ORR r11, r11, r10, LSR #31 \n" + "LSL r10, r10, #1 \n" + "ORR r10, r10, r9, LSR #31 \n"\ + "EOR r9, %[i], r9, LSL #1 \n" + "VMOV.32 d30[0], r9 \n" + "VMOV.32 d30[1], r10 \n" + "VMOV.32 d31[0], r11 \n" + "VMOV.32 d31[1], r12 \n" + + "VLD1.32 {q0}, [%[in]]! \n" + "ADD %[key2], %[key], #144 \n" + + "VEOR q0, q0, q15 \n" + + AES_DECRYPT(5) + + "VEOR q0, q0, q15 \n" + + "SUB %[sz], %[sz], #16 \n" + + "VST1.32 {q0}, [%[tmp]] \n" + "ADD %[out], %[out], #16 \n" + "MOV r9, %[sz] \n" + "6: \n" + "LDRB r10, [%[tmp]] \n" + "LDRB r11, [%[in]], #1 \n" + "STRB r10, [%[out]], #1 \n" + "STRB r11, [%[tmp]], #1 \n" + "SUBS r9, r9, #1 \n" + "BGT 6b \n" + "SUB %[out], %[out], %[sz] \n" + "SUB %[tmp], %[tmp], %[sz] \n" + "SUB %[out], %[out], #16 \n" + + "VLD1.32 {q0}, [%[tmp]] \n" + "ADD %[key2], %[key], #144 \n" + + "VEOR q0, q0, q14 \n" + + AES_DECRYPT(7) + + "VEOR q0, q0, q14 \n" + + "VST1.32 {q0}, [%[out]] \n" + + "4: \n" + + : [blocks] "+r" (blocks), [in] "+r" (in), [out] "+r" (out), + [sz] "+r" (sz), [i] "+r" (i), [key2] "+r" (key2) + : [key] "r" (xaes->aes.key), [rounds] "r" (xaes->aes.rounds), + [tmp] "r" (tmp) + : "cc", "memory", + "r9", "r10", "r11", "r12", "r14", + "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", + "q8", "q9", "q10", "q11", "q14", "q15" + ); + + return ret; +} + +#endif /* __aach64__ */ +#endif /* WOLFSSL_AES_XTS */ + #else /* !WOLFSSL_ARMASM_NO_HW_CRYPTO */ -#include -#include -#include #ifdef NO_INLINE #include #else @@ -5484,9 +16508,11 @@ unsigned long len, const unsigned char* ks, int nr, unsigned char* iv); extern void AES_CTR_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr); +#if defined(GCM_TABLE) || defined(GCM_TABLE_4BIT) /* in pre-C2x C, constness conflicts for dimensioned arrays can't be resolved. */ extern void GCM_gmult_len(byte* x, /* const */ byte m[32][AES_BLOCK_SIZE], const unsigned char* data, unsigned long len); +#endif extern void AES_GCM_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr); @@ -5618,6 +16644,13 @@ if (sz == 0) { return 0; } + if (sz % AES_BLOCK_SIZE) { +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + return BAD_LENGTH_E; +#else + return BAD_FUNC_ARG; +#endif + } AES_CBC_encrypt(in, out, sz, (const unsigned char*)aes->key, aes->rounds, (unsigned char*)aes->reg); @@ -5640,6 +16673,13 @@ if (sz == 0) { return 0; } + if (sz % AES_BLOCK_SIZE) { +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + return BAD_LENGTH_E; +#else + return BAD_FUNC_ARG; +#endif + } AES_CBC_decrypt(in, out, sz, (const unsigned char*)aes->key, aes->rounds, (unsigned char*)aes->reg); @@ -5701,6 +16741,13 @@ } return 0; } + +int wc_AesCtrSetKey(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir) +{ + (void)dir; + return wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); +} #endif /* WOLFSSL_AES_COUNTER */ #ifdef HAVE_AESCCM @@ -5962,15 +17009,16 @@ x[0] ^= borrow; } -static void GenerateM0(Aes* aes) +#if defined(GCM_TABLE) || defined(GCM_TABLE_4BIT) +void GenerateM0(Gcm* gcm) { int i; - byte (*m)[AES_BLOCK_SIZE] = aes->M0; + byte (*m)[AES_BLOCK_SIZE] = gcm->M0; /* 0 times -> 0x0 */ XMEMSET(m[0x0], 0, AES_BLOCK_SIZE); /* 1 times -> 0x8 */ - XMEMCPY(m[0x8], aes->H, AES_BLOCK_SIZE); + XMEMCPY(m[0x8], gcm->H, AES_BLOCK_SIZE); /* 2 times -> 0x4 */ XMEMCPY(m[0x4], m[0x8], AES_BLOCK_SIZE); RIGHTSHIFTX(m[0x4]); @@ -6010,13 +17058,14 @@ xorbuf (m[0xf], m[0x7], AES_BLOCK_SIZE); for (i = 0; i < 16; i++) { - word32* m32 = (word32*)aes->M0[i]; + word32* m32 = (word32*)gcm->M0[i]; m32[0] = ByteReverseWord32(m32[0]); m32[1] = ByteReverseWord32(m32[1]); m32[2] = ByteReverseWord32(m32[2]); m32[3] = ByteReverseWord32(m32[3]); } } +#endif /* GCM_TABLE */ int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) { @@ -6033,11 +17082,13 @@ XMEMSET(iv, 0, AES_BLOCK_SIZE); ret = wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); - + if (ret == 0) { - AES_ECB_encrypt(iv, aes->H, AES_BLOCK_SIZE, + AES_ECB_encrypt(iv, aes->gcm.H, AES_BLOCK_SIZE, (const unsigned char*)aes->key, aes->rounds); - GenerateM0(aes); + #if defined(GCM_TABLE) || defined(GCM_TABLE_4BIT) + GenerateM0(&aes->gcm); + #endif /* GCM_TABLE */ } return ret; @@ -6071,6 +17122,44 @@ buf[7] = sz & 0xff; } +#if defined(GCM_TABLE) || defined(GCM_TABLE_4BIT) + /* GCM_gmult_len implementation in armv8-32-aes-asm or thumb2-aes-asm */ + #define GCM_GMULT_LEN(aes, x, a, len) GCM_gmult_len(x, aes->gcm.M0, a, len) +#elif defined(GCM_SMALL) + static void GCM_gmult_len(byte* x, const byte* h, + const unsigned char* a, unsigned long len) + { + byte Z[AES_BLOCK_SIZE]; + byte V[AES_BLOCK_SIZE]; + int i, j; + + while (len >= AES_BLOCK_SIZE) { + xorbuf(x, a, AES_BLOCK_SIZE); + + XMEMSET(Z, 0, AES_BLOCK_SIZE); + XMEMCPY(V, x, AES_BLOCK_SIZE); + for (i = 0; i < AES_BLOCK_SIZE; i++) { + byte y = h[i]; + for (j = 0; j < 8; j++) { + if (y & 0x80) { + xorbuf(Z, V, AES_BLOCK_SIZE); + } + + RIGHTSHIFTX(V); + y = y << 1; + } + } + XMEMCPY(x, Z, AES_BLOCK_SIZE); + + len -= AES_BLOCK_SIZE; + a += AES_BLOCK_SIZE; + } + } + #define GCM_GMULT_LEN(aes, x, a, len) GCM_gmult_len(x, aes->gcm.H, a, len) +#else + #error ARMv8 AES only supports GCM_TABLE or GCM_TABLE_4BIT or GCM_SMALL +#endif /* GCM_TABLE */ + static void gcm_ghash_arm32(Aes* aes, const byte* a, word32 aSz, const byte* c, word32 cSz, byte* s, word32 sSz) { @@ -6089,13 +17178,13 @@ blocks = aSz / AES_BLOCK_SIZE; partial = aSz % AES_BLOCK_SIZE; if (blocks > 0) { - GCM_gmult_len(x, aes->M0, a, blocks * AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, a, blocks * AES_BLOCK_SIZE); a += blocks * AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, a, partial); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); } } @@ -6104,20 +17193,20 @@ blocks = cSz / AES_BLOCK_SIZE; partial = cSz % AES_BLOCK_SIZE; if (blocks > 0) { - GCM_gmult_len(x, aes->M0, c, blocks * AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, c, blocks * AES_BLOCK_SIZE); c += blocks * AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, c, partial); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); } } /* Hash in the lengths of A and C in bits */ FlattenSzInBits(&scratch[0], aSz); FlattenSzInBits(&scratch[8], cSz); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); /* Copy the result into s. */ XMEMCPY(s, x, sSz); @@ -6168,13 +17257,13 @@ blocks = authInSz / AES_BLOCK_SIZE; partial = authInSz % AES_BLOCK_SIZE; if (blocks > 0) { - GCM_gmult_len(x, aes->M0, authIn, blocks * AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, authIn, blocks * AES_BLOCK_SIZE); authIn += blocks * AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, authIn, partial); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); } } @@ -6184,7 +17273,7 @@ if (blocks > 0) { AES_GCM_encrypt(in, out, blocks * AES_BLOCK_SIZE, (const unsigned char*)aes->key, aes->rounds, counter); - GCM_gmult_len(x, aes->M0, out, blocks * AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, out, blocks * AES_BLOCK_SIZE); in += blocks * AES_BLOCK_SIZE; out += blocks * AES_BLOCK_SIZE; } @@ -6197,14 +17286,14 @@ XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, out, partial); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); } /* Hash in the lengths of A and C in bits */ XMEMSET(scratch, 0, AES_BLOCK_SIZE); FlattenSzInBits(&scratch[0], authInSz); FlattenSzInBits(&scratch[8], sz); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); if (authTagSz > AES_BLOCK_SIZE) { XMEMCPY(authTag, x, AES_BLOCK_SIZE); } @@ -6256,13 +17345,13 @@ blocks = authInSz / AES_BLOCK_SIZE; partial = authInSz % AES_BLOCK_SIZE; if (blocks > 0) { - GCM_gmult_len(x, aes->M0, authIn, blocks * AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, authIn, blocks * AES_BLOCK_SIZE); authIn += blocks * AES_BLOCK_SIZE; } if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, authIn, partial); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); } } @@ -6270,7 +17359,7 @@ partial = sz % AES_BLOCK_SIZE; /* do as many blocks as possible */ if (blocks > 0) { - GCM_gmult_len(x, aes->M0, in, blocks * AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, in, blocks * AES_BLOCK_SIZE); AES_GCM_encrypt(in, out, blocks * AES_BLOCK_SIZE, (const unsigned char*)aes->key, aes->rounds, counter); @@ -6280,7 +17369,7 @@ if (partial != 0) { XMEMSET(scratch, 0, AES_BLOCK_SIZE); XMEMCPY(scratch, in, partial); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); AES_GCM_encrypt(in, scratch, AES_BLOCK_SIZE, (const unsigned char*)aes->key, aes->rounds, counter); @@ -6290,7 +17379,7 @@ XMEMSET(scratch, 0, AES_BLOCK_SIZE); FlattenSzInBits(&scratch[0], authInSz); FlattenSzInBits(&scratch[8], sz); - GCM_gmult_len(x, aes->M0, scratch, AES_BLOCK_SIZE); + GCM_GMULT_LEN(aes, x, scratch, AES_BLOCK_SIZE); AES_ECB_encrypt(initialCounter, scratch, AES_BLOCK_SIZE, (const unsigned char*)aes->key, aes->rounds); xorbuf(x, scratch, authTagSz); @@ -6303,5 +17392,6 @@ return 0; } #endif /* HAVE_AESGCM */ + #endif /* !WOLFSSL_ARMASM_NO_HW_CRYPTO */ #endif /* !NO_AES && WOLFSSL_ARMASM */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-chacha.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-chacha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-chacha.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-chacha.c 2024-08-03 07:30:00.000000000 +0000 @@ -29,7 +29,7 @@ #include -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_ARMASM_NO_NEON) #ifdef HAVE_CHACHA #include @@ -1666,7 +1666,10 @@ "VADD.I32 q6, q6, q12 \n\t" "VADD.I32 q7, q7, q13 \n\t" - "VLDM %[m], { q8-q15 } \n\t" + "VLD1.8 { q8, q9 }, [%[m]]! \n\t" + "VLD1.8 { q10, q11 }, [%[m]]! \n\t" + "VLD1.8 { q12, q13 }, [%[m]]! \n\t" + "VLD1.8 { q14, q15 }, [%[m]]! \n\t" "VEOR q0, q0, q8 \n\t" "VEOR q1, q1, q9 \n\t" "VEOR q2, q2, q10 \n\t" @@ -1675,7 +1678,10 @@ "VEOR q5, q5, q13 \n\t" "VEOR q6, q6, q14 \n\t" "VEOR q7, q7, q15 \n\t" - "VSTM %[c], { q0-q7 } \n\t" + "VST1.8 { q0, q1 }, [%[c]]! \n\t" + "VST1.8 { q2, q3 }, [%[c]]! \n\t" + "VST1.8 { q4, q5 }, [%[c]]! \n\t" + "VST1.8 { q6, q7 }, [%[c]]! \n\t" : [c] "+r" (c), [m] "+r" (m) : [rounds] "I" (ROUNDS/2), [input] "r" (input), @@ -2725,14 +2731,14 @@ "CMP %[bytes], #64 \n\t" "BLT L_chacha20_arm32_64_lt_64_%= \n\t" /* XOR full 64 byte block */ - "VLDM %[m], { q4-q7 } \n\t" - "ADD %[m], %[m], #64 \n\t" + "VLD1.8 { q4, q5 }, [%[m]]! \n\t" + "VLD1.8 { q6, q7 }, [%[m]]! \n\t" "VEOR q0, q0, q4 \n\t" "VEOR q1, q1, q5 \n\t" "VEOR q2, q2, q6 \n\t" "VEOR q3, q3, q7 \n\t" - "VSTM %[c], { q0-q3 } \n\t" - "ADD %[c], %[c], #64 \n\t" + "VST1.8 { q0, q1 }, [%[c]]! \n\t" + "VST1.8 { q2, q3 }, [%[c]]! \n\t" "SUBS %[bytes], %[bytes], #64 \n\t" "VADD.I32 q11, q11, q14 \n\t" "BNE L_chacha20_arm32_64_outer_loop_%= \n\t" @@ -2743,12 +2749,10 @@ /* XOR 32 bytes */ "CMP %[bytes], #32 \n\t" "BLT L_chacha20_arm32_64_lt_32_%= \n\t" - "VLDM %[m], { q4-q5 } \n\t" - "ADD %[m], %[m], #32 \n\t" + "VLD1.8 { q4, q5 }, [%[m]]! \n\t" "VEOR q4, q4, q0 \n\t" "VEOR q5, q5, q1 \n\t" - "VSTM %[c], { q4-q5 } \n\t" - "ADD %[c], %[c], #32 \n\t" + "VST1.8 { q4, q5 }, [%[c]]! \n\t" "SUBS %[bytes], %[bytes], #32 \n\t" "VMOV q0, q2 \n\t" "VMOV q1, q3 \n\t" @@ -2758,11 +2762,9 @@ /* XOR 16 bytes */ "CMP %[bytes], #16 \n\t" "BLT L_chacha20_arm32_64_lt_16_%= \n\t" - "VLDM %[m], { q4 } \n\t" - "ADD %[m], %[m], #16 \n\t" + "VLD1.8 { q4 }, [%[m]]! \n\t" "VEOR q4, q4, q0 \n\t" - "VSTM %[c], { q4 } \n\t" - "ADD %[c], %[c], #16 \n\t" + "VST1.8 { q4 }, [%[c]]! \n\t" "SUBS %[bytes], %[bytes], #16 \n\t" "VMOV q0, q1 \n\t" "BEQ L_chacha20_arm32_64_done_%= \n\t" @@ -2771,9 +2773,9 @@ /* XOR 8 bytes */ "CMP %[bytes], #8 \n\t" "BLT L_chacha20_arm32_64_lt_8_%= \n\t" - "VLD1.64 { d8 }, [%[m]]! \n\t" + "VLD1.8 { d8 }, [%[m]]! \n\t" "VEOR d8, d8, d0 \n\t" - "VST1.64 { d8 }, [%[c]]! \n\t" + "VST1.8 { d8 }, [%[c]]! \n\t" "SUBS %[bytes], %[bytes], #8 \n\t" "VMOV d0, d1 \n\t" "BEQ L_chacha20_arm32_64_done_%= \n\t" @@ -2896,4 +2898,4 @@ } #endif /* HAVE_CHACHA */ -#endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM && !WOLFSSL_ARMASM_NO_NEON */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,7 +30,9 @@ */ #ifdef WOLFSSL_ARMASM #ifdef __aarch64__ -#ifdef HAVE_CURVE25519 +#ifndef WOLFSSL_ARMASM_INLINE +#if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) +#if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) #ifndef __APPLE__ .text .globl fe_init @@ -47,6 +49,7 @@ #ifndef __APPLE__ .size fe_init,.-fe_init #endif /* __APPLE__ */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text .globl fe_frombytes @@ -180,16 +183,17 @@ sbcs x4, x4, x8 sbcs x5, x5, x9 sbcs x6, x6, x10 - mov x12, #-19 csetm x11, cc + mov x12, #-19 # Mask the modulus - and x12, x11, x12 - and x13, x11, #0x7fffffffffffffff + extr x11, x11, x6, #63 + mul x12, x11, x12 # Add modulus (if underflow) - adds x3, x3, x12 - adcs x4, x4, x11 - adcs x5, x5, x11 - adc x6, x6, x13 + subs x3, x3, x12 + sbcs x4, x4, xzr + and x6, x6, #0x7fffffffffffffff + sbcs x5, x5, xzr + sbc x6, x6, xzr stp x3, x4, [x0] stp x5, x6, [x0, #16] ret @@ -216,17 +220,18 @@ adds x3, x3, x7 adcs x4, x4, x8 adcs x5, x5, x9 - adc x6, x6, x10 - mov x12, #-19 - asr x11, x6, #63 + adcs x6, x6, x10 + cset x11, cs + mov x12, #19 # Mask the modulus - and x12, x11, x12 - and x13, x11, #0x7fffffffffffffff + extr x11, x11, x6, #63 + mul x12, x11, x12 # Sub modulus (if overflow) - subs x3, x3, x12 - sbcs x4, x4, x11 - sbcs x5, x5, x11 - sbc x6, x6, x13 + adds x3, x3, x12 + adcs x4, x4, xzr + and x6, x6, #0x7fffffffffffffff + adcs x5, x5, xzr + adc x6, x6, xzr stp x3, x4, [x0] stp x5, x6, [x0, #16] ret @@ -553,6 +558,7 @@ #ifndef __APPLE__ .size fe_cmov_table,.-fe_cmov_table #endif /* __APPLE__ */ +#endif /* HAVE_ED25519 */ #ifndef __APPLE__ .text .globl fe_mul @@ -576,136 +582,122 @@ ldp x16, x17, [x1, #16] ldp x19, x20, [x2] ldp x21, x22, [x2, #16] - # A[0] * B[0] - mul x6, x14, x19 + # A[0] * B[0] umulh x7, x14, x19 - # A[0] * B[1] - mul x3, x14, x20 - umulh x8, x14, x20 - adds x7, x7, x3 - adc x8, x8, xzr - # A[1] * B[0] + mul x6, x14, x19 + # A[2] * B[0] + umulh x9, x16, x19 + mul x8, x16, x19 + # A[1] * B[0] mul x3, x15, x19 + adds x7, x7, x3 umulh x4, x15, x19 + adcs x8, x8, x4 + # A[1] * B[3] + umulh x11, x15, x22 + adc x9, x9, xzr + mul x10, x15, x22 + # A[0] * B[1] + mul x3, x14, x20 adds x7, x7, x3 + umulh x4, x14, x20 adcs x8, x8, x4 - adc x9, xzr, xzr - # A[0] * B[2] - mul x3, x14, x21 - umulh x4, x14, x21 - adds x8, x8, x3 - adc x9, x9, x4 - # A[1] * B[1] - mul x3, x15, x20 - umulh x4, x15, x20 - adds x8, x8, x3 - adcs x9, x9, x4 - adc x10, xzr, xzr - # A[2] * B[0] - mul x3, x16, x19 - umulh x4, x16, x19 - adds x8, x8, x3 - adcs x9, x9, x4 - adc x10, x10, xzr - # A[0] * B[3] - mul x3, x14, x22 - umulh x4, x14, x22 - adds x9, x9, x3 - adcs x10, x10, x4 - adc x11, xzr, xzr - # A[1] * B[2] - mul x3, x15, x21 - umulh x4, x15, x21 - adds x9, x9, x3 - adcs x10, x10, x4 - adc x11, x11, xzr - # A[2] * B[1] + # A[2] * B[1] mul x3, x16, x20 + adcs x9, x9, x3 umulh x4, x16, x20 - adds x9, x9, x3 adcs x10, x10, x4 adc x11, x11, xzr - # A[3] * B[0] - mul x3, x17, x19 - umulh x4, x17, x19 + # A[1] * B[2] + mul x3, x15, x21 adds x9, x9, x3 + umulh x4, x15, x21 adcs x10, x10, x4 - adc x11, x11, xzr - # A[1] * B[3] - mul x3, x15, x22 - umulh x4, x15, x22 - adds x10, x10, x3 - adcs x11, x11, x4 + adcs x11, x11, xzr adc x12, xzr, xzr - # A[2] * B[2] - mul x3, x16, x21 - umulh x4, x16, x21 - adds x10, x10, x3 - adcs x11, x11, x4 + # A[0] * B[2] + mul x3, x14, x21 + adds x8, x8, x3 + umulh x4, x14, x21 + adcs x9, x9, x4 + adcs x10, x10, xzr + adcs x11, x11, xzr adc x12, x12, xzr - # A[3] * B[1] + # A[1] * B[1] + mul x3, x15, x20 + adds x8, x8, x3 + umulh x4, x15, x20 + adcs x9, x9, x4 + # A[3] * B[1] mul x3, x17, x20 + adcs x10, x10, x3 umulh x4, x17, x20 - adds x10, x10, x3 adcs x11, x11, x4 adc x12, x12, xzr - # A[2] * B[3] + # A[2] * B[2] + mul x3, x16, x21 + adds x10, x10, x3 + umulh x4, x16, x21 + adcs x11, x11, x4 + # A[3] * B[3] + mul x3, x17, x22 + adcs x12, x12, x3 + umulh x13, x17, x22 + adc x13, x13, xzr + # A[0] * B[3] + mul x3, x14, x22 + adds x9, x9, x3 + umulh x4, x14, x22 + adcs x10, x10, x4 + # A[2] * B[3] mul x3, x16, x22 + adcs x11, x11, x3 umulh x4, x16, x22 - adds x11, x11, x3 adcs x12, x12, x4 - adc x13, xzr, xzr - # A[3] * B[2] + adc x13, x13, xzr + # A[3] * B[0] + mul x3, x17, x19 + adds x9, x9, x3 + umulh x4, x17, x19 + adcs x10, x10, x4 + # A[3] * B[2] mul x3, x17, x21 + adcs x11, x11, x3 umulh x4, x17, x21 - adds x11, x11, x3 adcs x12, x12, x4 adc x13, x13, xzr - # A[3] * B[3] - mul x3, x17, x22 - umulh x4, x17, x22 - adds x12, x12, x3 - adc x13, x13, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x13, x13, x12, #63 - extr x12, x12, x11, #63 - extr x11, x11, x10, #63 - extr x10, x10, x9, #63 - and x9, x9, #0x7fffffffffffffff - # Multiply top half by 19 + mov x3, #38 + mul x4, x3, x13 + adds x9, x9, x4 + umulh x5, x3, x13 + adc x5, x5, xzr mov x3, #19 + extr x5, x5, x9, #63 + mul x5, x5, x3 + and x9, x9, #0x7fffffffffffffff + mov x3, #38 mul x4, x3, x10 - umulh x10, x3, x10 adds x6, x6, x4 + umulh x10, x3, x10 mul x4, x3, x11 - umulh x11, x3, x11 adcs x7, x7, x4 + umulh x11, x3, x11 mul x4, x3, x12 - umulh x12, x3, x12 adcs x8, x8, x4 - mul x4, x3, x13 - umulh x5, x3, x13 - adcs x9, x9, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x7, x7, x10 - adcs x8, x8, x11 - adcs x9, x9, x12 - adc x5, x5, xzr - # Overflow - extr x5, x5, x9, #63 - mul x5, x5, x3 - and x9, x9, #0x7fffffffffffffff - adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr + umulh x12, x3, x12 adc x9, x9, xzr - # Reduce if top bit set - and x5, x3, x9, asr 63 - and x9, x9, #0x7fffffffffffffff + # Add high product results in adds x6, x6, x5 + adcs x7, x7, x10 + adcs x8, x8, x11 + adc x9, x9, x12 + # Reduce if top bit set + mov x3, #19 + and x4, x3, x9, asr 63 + adds x6, x6, x4 adcs x7, x7, xzr + and x9, x9, #0x7fffffffffffffff adcs x8, x8, xzr adc x9, x9, xzr # Store @@ -736,33 +728,30 @@ ldp x13, x14, [x1] ldp x15, x16, [x1, #16] # A[0] * A[1] - mul x6, x13, x14 umulh x7, x13, x14 + mul x6, x13, x14 + # A[0] * A[3] + umulh x9, x13, x16 + mul x8, x13, x16 # A[0] * A[2] mul x2, x13, x15 - umulh x8, x13, x15 adds x7, x7, x2 - adc x8, x8, xzr - # A[0] * A[3] - mul x2, x13, x16 - umulh x9, x13, x16 - adds x8, x8, x2 - adc x9, x9, xzr + umulh x3, x13, x15 + adcs x8, x8, x3 + # A[1] * A[3] + mul x2, x14, x16 + adcs x9, x9, x2 + umulh x10, x14, x16 + adc x10, x10, xzr # A[1] * A[2] mul x2, x14, x15 - umulh x3, x14, x15 adds x8, x8, x2 + umulh x3, x14, x15 adcs x9, x9, x3 - adc x10, xzr, xzr - # A[1] * A[3] - mul x2, x14, x16 - umulh x3, x14, x16 - adds x9, x9, x2 - adc x10, x10, x3 # A[2] * A[3] mul x2, x15, x16 + adcs x10, x10, x2 umulh x11, x15, x16 - adds x10, x10, x2 adc x11, x11, xzr # Double adds x6, x6, x6 @@ -773,66 +762,56 @@ adcs x11, x11, x11 adc x12, xzr, xzr # A[0] * A[0] + umulh x3, x13, x13 mul x5, x13, x13 - umulh x4, x13, x13 # A[1] * A[1] mul x2, x14, x14 + adds x6, x6, x3 umulh x3, x14, x14 - adds x6, x6, x4 adcs x7, x7, x2 - adc x4, x3, xzr # A[2] * A[2] mul x2, x15, x15 + adcs x8, x8, x3 umulh x3, x15, x15 - adds x8, x8, x4 adcs x9, x9, x2 - adc x4, x3, xzr # A[3] * A[3] mul x2, x16, x16 + adcs x10, x10, x3 umulh x3, x16, x16 - adds x10, x10, x4 adcs x11, x11, x2 adc x12, x12, x3 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x12, x12, x11, #63 - extr x11, x11, x10, #63 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - and x8, x8, #0x7fffffffffffffff - # Multiply top half by 19 + mov x2, #38 + mul x3, x2, x12 + adds x8, x8, x3 + umulh x4, x2, x12 + adc x4, x4, xzr mov x2, #19 + extr x4, x4, x8, #63 + mul x4, x4, x2 + and x8, x8, #0x7fffffffffffffff + mov x2, #38 mul x3, x2, x9 - umulh x9, x2, x9 adds x5, x5, x3 + umulh x9, x2, x9 mul x3, x2, x10 - umulh x10, x2, x10 adcs x6, x6, x3 + umulh x10, x2, x10 mul x3, x2, x11 - umulh x11, x2, x11 adcs x7, x7, x3 - mul x3, x2, x12 - umulh x4, x2, x12 - adcs x8, x8, x3 - adc x4, x4, xzr - # Add remaining product results in - adds x6, x6, x9 - adcs x7, x7, x10 - adcs x8, x8, x11 - adc x4, x4, xzr - # Overflow - extr x4, x4, x8, #63 - mul x4, x4, x2 - and x8, x8, #0x7fffffffffffffff - adds x5, x5, x4 - adcs x6, x6, xzr - adcs x7, x7, xzr + umulh x11, x2, x11 adc x8, x8, xzr - # Reduce if top bit set - and x4, x2, x8, asr 63 - and x8, x8, #0x7fffffffffffffff + # Add high product results in adds x5, x5, x4 + adcs x6, x6, x9 + adcs x7, x7, x10 + adc x8, x8, x11 + # Reduce if top bit set + mov x2, #19 + and x3, x2, x8, asr 63 + adds x5, x5, x3 adcs x6, x6, xzr + and x8, x8, #0x7fffffffffffffff adcs x7, x7, xzr adc x8, x8, xzr # Store @@ -856,6 +835,7 @@ #endif /* __APPLE__ */ stp x29, x30, [sp, #-176]! add x29, sp, #0 + str x17, [x29, #160] str x20, [x29, #168] # Invert str x0, [x29, #144] @@ -920,61 +900,197 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x50 -#ifndef NDEBUG - add x1, x29, #48 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x20, #3 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 5 times + mov x20, #5 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_invert1: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert1 - add x0, x29, #48 + bne L_fe_invert1 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] #ifndef NDEBUG - add x1, x29, #0x50 + add x0, x29, #48 #endif /* !NDEBUG */ + add x1, x29, #0x50 add x2, x29, #48 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x50 - add x1, x29, #48 -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x20, #8 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 10 times + mov x20, #10 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_invert2: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert2 -#ifndef NDEBUG + bne L_fe_invert2 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] add x0, x29, #0x50 -#endif /* !NDEBUG */ #ifndef NDEBUG add x1, x29, #0x50 #endif /* !NDEBUG */ @@ -984,84 +1100,295 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x70 -#ifndef NDEBUG - add x1, x29, #0x50 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x20, #18 -#ifndef NDEBUG - add x0, x29, #0x70 -#endif /* !NDEBUG */ - add x1, x29, #0x70 + # Loop: 20 times + mov x20, #20 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_fe_invert3: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert3 - add x0, x29, #0x50 + bne L_fe_invert3 + # Store + stp x6, x7, [x29, #112] + stp x8, x9, [x29, #128] #ifndef NDEBUG - add x1, x29, #0x70 + add x0, x29, #0x50 #endif /* !NDEBUG */ + add x1, x29, #0x70 add x2, x29, #0x50 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x20, #9 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 10 times + mov x20, #10 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_fe_invert4: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert4 + bne L_fe_invert4 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] add x0, x29, #48 -#ifndef NDEBUG add x1, x29, #0x50 -#endif /* !NDEBUG */ add x2, x29, #48 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x50 - add x1, x29, #48 -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x20, #48 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 50 times + mov x20, #50 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_invert5: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert5 -#ifndef NDEBUG + bne L_fe_invert5 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] add x0, x29, #0x50 -#endif /* !NDEBUG */ #ifndef NDEBUG add x1, x29, #0x50 #endif /* !NDEBUG */ @@ -1071,84 +1398,303 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x70 -#ifndef NDEBUG - add x1, x29, #0x50 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x20, #0x62 -#ifndef NDEBUG - add x0, x29, #0x70 -#endif /* !NDEBUG */ - add x1, x29, #0x70 + # Loop: 100 times + mov x20, #0x64 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_fe_invert6: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert6 - add x0, x29, #0x50 + bne L_fe_invert6 + # Store + stp x6, x7, [x29, #112] + stp x8, x9, [x29, #128] #ifndef NDEBUG - add x1, x29, #0x70 + add x0, x29, #0x50 #endif /* !NDEBUG */ + add x1, x29, #0x70 add x2, x29, #0x50 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x20, #49 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 50 times + mov x20, #50 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_fe_invert7: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert7 + bne L_fe_invert7 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] add x0, x29, #48 -#ifndef NDEBUG add x1, x29, #0x50 -#endif /* !NDEBUG */ add x2, x29, #48 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x20, #4 -#ifndef NDEBUG - add x0, x29, #48 -#endif /* !NDEBUG */ - add x1, x29, #48 + # Loop: 5 times + mov x20, #5 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_invert8: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x20, x20, #1 - bcs L_fe_invert8 + bne L_fe_invert8 + # Store + stp x6, x7, [x29, #48] + stp x8, x9, [x29, #64] ldr x0, [x29, #144] -#ifndef NDEBUG add x1, x29, #48 -#endif /* !NDEBUG */ add x2, x29, #16 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ + ldr x17, [x29, #160] ldr x20, [x29, #168] ldp x29, x30, [sp], #0xb0 ret @@ -1179,422 +1725,364 @@ mov x23, xzr str x0, [x29, #176] str x2, [x29, #184] - # Copy ldp x6, x7, [x2] ldp x8, x9, [x2, #16] - stp x6, x7, [x29, #80] - stp x8, x9, [x29, #96] - # Set one - mov x2, #1 - stp x2, xzr, [x0] - stp xzr, xzr, [x0, #16] + mov x10, #1 + mov x11, xzr + mov x12, xzr + mov x13, xzr + stp x10, x11, [x0] + stp x12, x13, [x0, #16] # Set zero stp xzr, xzr, [x29, #16] stp xzr, xzr, [x29, #32] - # Set one - mov x2, #1 - stp x2, xzr, [x29, #48] - stp xzr, xzr, [x29, #64] - mov x25, #62 - mov x24, #24 -L_curve25519_words: + mov x24, #0xfe L_curve25519_bits: - ldr x2, [x1, x24] - lsr x2, x2, x25 - and x2, x2, #1 - eor x23, x23, x2 + lsr x3, x24, #6 + and x4, x24, #63 + ldr x5, [x1, x3, LSL 3] + lsr x5, x5, x4 + eor x23, x23, x5 + # Conditional Swap + subs xzr, xzr, x23, lsl 63 + ldp x25, x26, [x29, #16] + ldp x27, x28, [x29, #32] + csel x19, x25, x10, ne + csel x25, x10, x25, ne + csel x20, x26, x11, ne + csel x26, x11, x26, ne + csel x21, x27, x12, ne + csel x27, x12, x27, ne + csel x22, x28, x13, ne + csel x28, x13, x28, ne # Conditional Swap - cmp x23, #1 + subs xzr, xzr, x23, lsl 63 ldp x10, x11, [x0] ldp x12, x13, [x0, #16] - ldp x6, x7, [x29, #80] - ldp x8, x9, [x29, #96] - csel x14, x10, x6, eq - csel x10, x6, x10, eq - csel x15, x11, x7, eq - csel x11, x7, x11, eq - csel x16, x12, x8, eq - csel x12, x8, x12, eq - csel x17, x13, x9, eq - csel x13, x9, x13, eq - # Conditional Swap - cmp x23, #1 - ldp x19, x20, [x29, #16] - ldp x21, x22, [x29, #32] - ldp x6, x7, [x29, #48] - ldp x8, x9, [x29, #64] - csel x5, x19, x6, eq - csel x19, x6, x19, eq - csel x26, x20, x7, eq - csel x20, x7, x20, eq - csel x27, x21, x8, eq - csel x21, x8, x21, eq - csel x28, x22, x9, eq - csel x22, x9, x22, eq - mov x23, x2 + csel x14, x10, x6, ne + csel x10, x6, x10, ne + csel x15, x11, x7, ne + csel x11, x7, x11, ne + csel x16, x12, x8, ne + csel x12, x8, x12, ne + csel x17, x13, x9, ne + csel x13, x9, x13, ne + mov x23, x5 # Add - adds x6, x10, x19 - adcs x7, x11, x20 - adcs x8, x12, x21 - adc x9, x13, x22 - mov x3, #-19 - asr x2, x9, #63 - # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + adds x6, x10, x25 + adcs x7, x11, x26 + adcs x8, x12, x27 + adcs x9, x13, x28 + cset x5, cs + mov x3, #19 + extr x5, x5, x9, #63 + mul x3, x5, x3 # Sub modulus (if overflow) - subs x6, x6, x3 - sbcs x7, x7, x2 - sbcs x8, x8, x2 - sbc x9, x9, x4 + adds x6, x6, x3 + adcs x7, x7, xzr + and x9, x9, #0x7fffffffffffffff + adcs x8, x8, xzr + adc x9, x9, xzr # Sub - subs x19, x10, x19 - sbcs x20, x11, x20 - sbcs x21, x12, x21 - sbcs x22, x13, x22 + subs x25, x10, x25 + sbcs x26, x11, x26 + sbcs x27, x12, x27 + sbcs x28, x13, x28 + csetm x5, cc mov x3, #-19 - csetm x2, cc - # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + extr x5, x5, x28, #63 + mul x3, x5, x3 # Add modulus (if underflow) - adds x19, x19, x3 - adcs x20, x20, x2 - adcs x21, x21, x2 - adc x22, x22, x4 - stp x19, x20, [x29, #144] - stp x21, x22, [x29, #160] + subs x25, x25, x3 + sbcs x26, x26, xzr + and x28, x28, #0x7fffffffffffffff + sbcs x27, x27, xzr + sbc x28, x28, xzr + stp x25, x26, [x29, #80] + stp x27, x28, [x29, #96] # Add - adds x10, x14, x5 - adcs x11, x15, x26 - adcs x12, x16, x27 - adc x13, x17, x28 - mov x3, #-19 - asr x2, x13, #63 - # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + adds x10, x14, x19 + adcs x11, x15, x20 + adcs x12, x16, x21 + adcs x13, x17, x22 + cset x5, cs + mov x3, #19 + extr x5, x5, x13, #63 + mul x3, x5, x3 # Sub modulus (if overflow) - subs x10, x10, x3 - sbcs x11, x11, x2 - sbcs x12, x12, x2 - sbc x13, x13, x4 + adds x10, x10, x3 + adcs x11, x11, xzr + and x13, x13, #0x7fffffffffffffff + adcs x12, x12, xzr + adc x13, x13, xzr # Sub - subs x14, x14, x5 - sbcs x15, x15, x26 - sbcs x16, x16, x27 - sbcs x17, x17, x28 + subs x14, x14, x19 + sbcs x15, x15, x20 + sbcs x16, x16, x21 + sbcs x17, x17, x22 + csetm x5, cc mov x3, #-19 - csetm x2, cc - # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + extr x5, x5, x17, #63 + mul x3, x5, x3 # Add modulus (if underflow) - adds x14, x14, x3 - adcs x15, x15, x2 - adcs x16, x16, x2 - adc x17, x17, x4 + subs x14, x14, x3 + sbcs x15, x15, xzr + and x17, x17, #0x7fffffffffffffff + sbcs x16, x16, xzr + sbc x17, x17, xzr # Multiply - # A[0] * B[0] - mul x19, x14, x6 + # A[0] * B[0] umulh x20, x14, x6 - # A[0] * B[1] - mul x3, x14, x7 - umulh x21, x14, x7 - adds x20, x20, x3 - adc x21, x21, xzr - # A[1] * B[0] + mul x19, x14, x6 + # A[2] * B[0] + umulh x22, x16, x6 + mul x21, x16, x6 + # A[1] * B[0] mul x3, x15, x6 + adds x20, x20, x3 umulh x4, x15, x6 + adcs x21, x21, x4 + # A[1] * B[3] + umulh x26, x15, x9 + adc x22, x22, xzr + mul x25, x15, x9 + # A[0] * B[1] + mul x3, x14, x7 adds x20, x20, x3 + umulh x4, x14, x7 adcs x21, x21, x4 - adc x22, xzr, xzr - # A[0] * B[2] - mul x3, x14, x8 - umulh x4, x14, x8 - adds x21, x21, x3 - adc x22, x22, x4 - # A[1] * B[1] - mul x3, x15, x7 - umulh x4, x15, x7 - adds x21, x21, x3 - adcs x22, x22, x4 - adc x2, xzr, xzr - # A[2] * B[0] - mul x3, x16, x6 - umulh x4, x16, x6 - adds x21, x21, x3 - adcs x22, x22, x4 - adc x2, x2, xzr - # A[0] * B[3] - mul x3, x14, x9 - umulh x4, x14, x9 - adds x22, x22, x3 - adcs x2, x2, x4 - adc x26, xzr, xzr - # A[1] * B[2] - mul x3, x15, x8 - umulh x4, x15, x8 - adds x22, x22, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[2] * B[1] + # A[2] * B[1] mul x3, x16, x7 + adcs x22, x22, x3 umulh x4, x16, x7 - adds x22, x22, x3 - adcs x2, x2, x4 + adcs x25, x25, x4 adc x26, x26, xzr - # A[3] * B[0] - mul x3, x17, x6 - umulh x4, x17, x6 + # A[1] * B[2] + mul x3, x15, x8 adds x22, x22, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[1] * B[3] - mul x3, x15, x9 - umulh x4, x15, x9 - adds x2, x2, x3 - adcs x26, x26, x4 + umulh x4, x15, x8 + adcs x25, x25, x4 + adcs x26, x26, xzr adc x27, xzr, xzr - # A[2] * B[2] - mul x3, x16, x8 - umulh x4, x16, x8 - adds x2, x2, x3 - adcs x26, x26, x4 + # A[0] * B[2] + mul x3, x14, x8 + adds x21, x21, x3 + umulh x4, x14, x8 + adcs x22, x22, x4 + adcs x25, x25, xzr + adcs x26, x26, xzr adc x27, x27, xzr - # A[3] * B[1] + # A[1] * B[1] + mul x3, x15, x7 + adds x21, x21, x3 + umulh x4, x15, x7 + adcs x22, x22, x4 + # A[3] * B[1] mul x3, x17, x7 + adcs x25, x25, x3 umulh x4, x17, x7 - adds x2, x2, x3 adcs x26, x26, x4 adc x27, x27, xzr - # A[2] * B[3] + # A[2] * B[2] + mul x3, x16, x8 + adds x25, x25, x3 + umulh x4, x16, x8 + adcs x26, x26, x4 + # A[3] * B[3] + mul x3, x17, x9 + adcs x27, x27, x3 + umulh x28, x17, x9 + adc x28, x28, xzr + # A[0] * B[3] + mul x3, x14, x9 + adds x22, x22, x3 + umulh x4, x14, x9 + adcs x25, x25, x4 + # A[2] * B[3] mul x3, x16, x9 + adcs x26, x26, x3 umulh x4, x16, x9 - adds x26, x26, x3 adcs x27, x27, x4 - adc x28, xzr, xzr - # A[3] * B[2] + adc x28, x28, xzr + # A[3] * B[0] + mul x3, x17, x6 + adds x22, x22, x3 + umulh x4, x17, x6 + adcs x25, x25, x4 + # A[3] * B[2] mul x3, x17, x8 + adcs x26, x26, x3 umulh x4, x17, x8 - adds x26, x26, x3 adcs x27, x27, x4 adc x28, x28, xzr - # A[3] * B[3] - mul x3, x17, x9 - umulh x4, x17, x9 - adds x27, x27, x3 - adc x28, x28, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x28, x28, x27, #63 - extr x27, x27, x26, #63 - extr x26, x26, x2, #63 - extr x2, x2, x22, #63 - and x22, x22, #0x7fffffffffffffff - # Multiply top half by 19 - mov x3, #19 - mul x4, x3, x2 - umulh x2, x3, x2 - adds x19, x19, x4 - mul x4, x3, x26 - umulh x26, x3, x26 - adcs x20, x20, x4 - mul x4, x3, x27 - umulh x27, x3, x27 - adcs x21, x21, x4 + mov x3, #38 mul x4, x3, x28 + adds x22, x22, x4 umulh x5, x3, x28 - adcs x22, x22, x4 adc x5, x5, xzr - # Add remaining product results in - adds x20, x20, x2 - adcs x21, x21, x26 - adcs x22, x22, x27 - adc x5, x5, xzr - # Overflow + mov x3, #19 extr x5, x5, x22, #63 mul x5, x5, x3 and x22, x22, #0x7fffffffffffffff - adds x19, x19, x5 - adcs x20, x20, xzr - adcs x21, x21, xzr + mov x3, #38 + mul x4, x3, x25 + adds x19, x19, x4 + umulh x25, x3, x25 + mul x4, x3, x26 + adcs x20, x20, x4 + umulh x26, x3, x26 + mul x4, x3, x27 + adcs x21, x21, x4 + umulh x27, x3, x27 adc x22, x22, xzr - # Reduce if top bit set - and x5, x3, x22, asr 63 - and x22, x22, #0x7fffffffffffffff + # Add high product results in adds x19, x19, x5 - adcs x20, x20, xzr - adcs x21, x21, xzr - adc x22, x22, xzr + adcs x20, x20, x25 + adcs x21, x21, x26 + adc x22, x22, x27 # Store - stp x19, x20, [x29, #112] - stp x21, x22, [x29, #128] + stp x19, x20, [x29, #48] + stp x21, x22, [x29, #64] # Multiply - ldp x2, x26, [x29, #144] - ldp x27, x28, [x29, #160] - # A[0] * B[0] - mul x19, x10, x2 - umulh x20, x10, x2 - # A[0] * B[1] - mul x3, x10, x26 - umulh x21, x10, x26 + ldp x25, x26, [x29, #80] + ldp x27, x28, [x29, #96] + # A[0] * B[0] + umulh x20, x10, x25 + mul x19, x10, x25 + # A[2] * B[0] + umulh x22, x12, x25 + mul x21, x12, x25 + # A[1] * B[0] + mul x3, x11, x25 adds x20, x20, x3 - adc x21, x21, xzr - # A[1] * B[0] - mul x3, x11, x2 - umulh x4, x11, x2 + umulh x4, x11, x25 + adcs x21, x21, x4 + # A[1] * B[3] + umulh x15, x11, x28 + adc x22, x22, xzr + mul x14, x11, x28 + # A[0] * B[1] + mul x3, x10, x26 adds x20, x20, x3 + umulh x4, x10, x26 adcs x21, x21, x4 - adc x22, xzr, xzr - # A[0] * B[2] - mul x3, x10, x27 - umulh x4, x10, x27 - adds x21, x21, x3 - adc x22, x22, x4 - # A[1] * B[1] - mul x3, x11, x26 - umulh x4, x11, x26 - adds x21, x21, x3 - adcs x22, x22, x4 - adc x14, xzr, xzr - # A[2] * B[0] - mul x3, x12, x2 - umulh x4, x12, x2 - adds x21, x21, x3 - adcs x22, x22, x4 - adc x14, x14, xzr - # A[0] * B[3] - mul x3, x10, x28 - umulh x4, x10, x28 - adds x22, x22, x3 - adcs x14, x14, x4 - adc x15, xzr, xzr - # A[1] * B[2] - mul x3, x11, x27 - umulh x4, x11, x27 - adds x22, x22, x3 - adcs x14, x14, x4 - adc x15, x15, xzr - # A[2] * B[1] + # A[2] * B[1] mul x3, x12, x26 + adcs x22, x22, x3 umulh x4, x12, x26 - adds x22, x22, x3 adcs x14, x14, x4 adc x15, x15, xzr - # A[3] * B[0] - mul x3, x13, x2 - umulh x4, x13, x2 + # A[1] * B[2] + mul x3, x11, x27 adds x22, x22, x3 + umulh x4, x11, x27 adcs x14, x14, x4 - adc x15, x15, xzr - # A[1] * B[3] - mul x3, x11, x28 - umulh x4, x11, x28 - adds x14, x14, x3 - adcs x15, x15, x4 + adcs x15, x15, xzr adc x16, xzr, xzr - # A[2] * B[2] - mul x3, x12, x27 - umulh x4, x12, x27 - adds x14, x14, x3 - adcs x15, x15, x4 + # A[0] * B[2] + mul x3, x10, x27 + adds x21, x21, x3 + umulh x4, x10, x27 + adcs x22, x22, x4 + adcs x14, x14, xzr + adcs x15, x15, xzr adc x16, x16, xzr - # A[3] * B[1] + # A[1] * B[1] + mul x3, x11, x26 + adds x21, x21, x3 + umulh x4, x11, x26 + adcs x22, x22, x4 + # A[3] * B[1] mul x3, x13, x26 + adcs x14, x14, x3 umulh x4, x13, x26 - adds x14, x14, x3 adcs x15, x15, x4 adc x16, x16, xzr - # A[2] * B[3] + # A[2] * B[2] + mul x3, x12, x27 + adds x14, x14, x3 + umulh x4, x12, x27 + adcs x15, x15, x4 + # A[3] * B[3] + mul x3, x13, x28 + adcs x16, x16, x3 + umulh x17, x13, x28 + adc x17, x17, xzr + # A[0] * B[3] + mul x3, x10, x28 + adds x22, x22, x3 + umulh x4, x10, x28 + adcs x14, x14, x4 + # A[2] * B[3] mul x3, x12, x28 + adcs x15, x15, x3 umulh x4, x12, x28 - adds x15, x15, x3 adcs x16, x16, x4 - adc x17, xzr, xzr - # A[3] * B[2] + adc x17, x17, xzr + # A[3] * B[0] + mul x3, x13, x25 + adds x22, x22, x3 + umulh x4, x13, x25 + adcs x14, x14, x4 + # A[3] * B[2] mul x3, x13, x27 + adcs x15, x15, x3 umulh x4, x13, x27 - adds x15, x15, x3 adcs x16, x16, x4 adc x17, x17, xzr - # A[3] * B[3] - mul x3, x13, x28 - umulh x4, x13, x28 - adds x16, x16, x3 - adc x17, x17, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x17, x17, x16, #63 - extr x16, x16, x15, #63 - extr x15, x15, x14, #63 - extr x14, x14, x22, #63 - and x22, x22, #0x7fffffffffffffff - # Multiply top half by 19 + mov x3, #38 + mul x4, x3, x17 + adds x22, x22, x4 + umulh x5, x3, x17 + adc x5, x5, xzr mov x3, #19 + extr x5, x5, x22, #63 + mul x5, x5, x3 + and x22, x22, #0x7fffffffffffffff + mov x3, #38 mul x4, x3, x14 - umulh x14, x3, x14 adds x19, x19, x4 + umulh x14, x3, x14 mul x4, x3, x15 - umulh x15, x3, x15 adcs x20, x20, x4 + umulh x15, x3, x15 mul x4, x3, x16 - umulh x16, x3, x16 adcs x21, x21, x4 - mul x4, x3, x17 - umulh x5, x3, x17 - adcs x22, x22, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x20, x20, x14 - adcs x21, x21, x15 - adcs x22, x22, x16 - adc x5, x5, xzr - # Overflow - extr x5, x5, x22, #63 - mul x5, x5, x3 - and x22, x22, #0x7fffffffffffffff - adds x19, x19, x5 - adcs x20, x20, xzr - adcs x21, x21, xzr + umulh x16, x3, x16 adc x22, x22, xzr - # Reduce if top bit set - and x5, x3, x22, asr 63 - and x22, x22, #0x7fffffffffffffff + # Add high product results in adds x19, x19, x5 - adcs x20, x20, xzr - adcs x21, x21, xzr - adc x22, x22, xzr - # Store + adcs x20, x20, x14 + adcs x21, x21, x15 + adc x22, x22, x16 # Square # A[0] * A[1] - mul x11, x2, x26 - umulh x12, x2, x26 + umulh x12, x25, x26 + mul x11, x25, x26 + # A[0] * A[3] + umulh x14, x25, x28 + mul x13, x25, x28 # A[0] * A[2] - mul x3, x2, x27 - umulh x13, x2, x27 + mul x3, x25, x27 adds x12, x12, x3 - adc x13, x13, xzr - # A[0] * A[3] - mul x3, x2, x28 - umulh x14, x2, x28 - adds x13, x13, x3 - adc x14, x14, xzr + umulh x4, x25, x27 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x26, x28 + adcs x14, x14, x3 + umulh x15, x26, x28 + adc x15, x15, xzr # A[1] * A[2] mul x3, x26, x27 - umulh x4, x26, x27 adds x13, x13, x3 + umulh x4, x26, x27 adcs x14, x14, x4 - adc x15, xzr, xzr - # A[1] * A[3] - mul x3, x26, x28 - umulh x4, x26, x28 - adds x14, x14, x3 - adc x15, x15, x4 # A[2] * A[3] mul x3, x27, x28 + adcs x15, x15, x3 umulh x16, x27, x28 - adds x15, x15, x3 adc x16, x16, xzr # Double adds x11, x11, x11 @@ -1605,304 +2093,241 @@ adcs x16, x16, x16 adc x17, xzr, xzr # A[0] * A[0] - mul x10, x2, x2 - umulh x5, x2, x2 + umulh x4, x25, x25 + mul x10, x25, x25 # A[1] * A[1] mul x3, x26, x26 + adds x11, x11, x4 umulh x4, x26, x26 - adds x11, x11, x5 adcs x12, x12, x3 - adc x5, x4, xzr # A[2] * A[2] mul x3, x27, x27 + adcs x13, x13, x4 umulh x4, x27, x27 - adds x13, x13, x5 adcs x14, x14, x3 - adc x5, x4, xzr # A[3] * A[3] mul x3, x28, x28 + adcs x15, x15, x4 umulh x4, x28, x28 - adds x15, x15, x5 adcs x16, x16, x3 adc x17, x17, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x17, x17, x16, #63 - extr x16, x16, x15, #63 - extr x15, x15, x14, #63 - extr x14, x14, x13, #63 - and x13, x13, #0x7fffffffffffffff - # Multiply top half by 19 + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 mul x4, x3, x14 - umulh x14, x3, x14 adds x10, x10, x4 + umulh x14, x3, x14 mul x4, x3, x15 - umulh x15, x3, x15 adcs x11, x11, x4 + umulh x15, x3, x15 mul x4, x3, x16 - umulh x16, x3, x16 adcs x12, x12, x4 - mul x4, x3, x17 - umulh x5, x3, x17 - adcs x13, x13, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x11, x11, x14 - adcs x12, x12, x15 - adcs x13, x13, x16 - adc x5, x5, xzr - # Overflow - extr x5, x5, x13, #63 - mul x5, x5, x3 - and x13, x13, #0x7fffffffffffffff - adds x10, x10, x5 - adcs x11, x11, xzr - adcs x12, x12, xzr + umulh x16, x3, x16 adc x13, x13, xzr - # Reduce if top bit set - and x5, x3, x13, asr 63 - and x13, x13, #0x7fffffffffffffff + # Add high product results in adds x10, x10, x5 - adcs x11, x11, xzr - adcs x12, x12, xzr - adc x13, x13, xzr - # Store + adcs x11, x11, x14 + adcs x12, x12, x15 + adc x13, x13, x16 # Square # A[0] * A[1] - mul x15, x6, x7 umulh x16, x6, x7 + mul x15, x6, x7 + # A[0] * A[3] + umulh x25, x6, x9 + mul x17, x6, x9 # A[0] * A[2] mul x3, x6, x8 - umulh x17, x6, x8 adds x16, x16, x3 - adc x17, x17, xzr - # A[0] * A[3] - mul x3, x6, x9 - umulh x2, x6, x9 - adds x17, x17, x3 - adc x2, x2, xzr + umulh x4, x6, x8 + adcs x17, x17, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x25, x25, x3 + umulh x26, x7, x9 + adc x26, x26, xzr # A[1] * A[2] mul x3, x7, x8 - umulh x4, x7, x8 adds x17, x17, x3 - adcs x2, x2, x4 - adc x26, xzr, xzr - # A[1] * A[3] - mul x3, x7, x9 - umulh x4, x7, x9 - adds x2, x2, x3 - adc x26, x26, x4 + umulh x4, x7, x8 + adcs x25, x25, x4 # A[2] * A[3] mul x3, x8, x9 + adcs x26, x26, x3 umulh x27, x8, x9 - adds x26, x26, x3 adc x27, x27, xzr # Double adds x15, x15, x15 adcs x16, x16, x16 adcs x17, x17, x17 - adcs x2, x2, x2 + adcs x25, x25, x25 adcs x26, x26, x26 adcs x27, x27, x27 adc x28, xzr, xzr # A[0] * A[0] + umulh x4, x6, x6 mul x14, x6, x6 - umulh x5, x6, x6 # A[1] * A[1] mul x3, x7, x7 + adds x15, x15, x4 umulh x4, x7, x7 - adds x15, x15, x5 adcs x16, x16, x3 - adc x5, x4, xzr # A[2] * A[2] mul x3, x8, x8 + adcs x17, x17, x4 umulh x4, x8, x8 - adds x17, x17, x5 - adcs x2, x2, x3 - adc x5, x4, xzr + adcs x25, x25, x3 # A[3] * A[3] mul x3, x9, x9 + adcs x26, x26, x4 umulh x4, x9, x9 - adds x26, x26, x5 adcs x27, x27, x3 adc x28, x28, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x28, x28, x27, #63 - extr x27, x27, x26, #63 - extr x26, x26, x2, #63 - extr x2, x2, x17, #63 - and x17, x17, #0x7fffffffffffffff - # Multiply top half by 19 - mov x3, #19 - mul x4, x3, x2 - umulh x2, x3, x2 - adds x14, x14, x4 - mul x4, x3, x26 - umulh x26, x3, x26 - adcs x15, x15, x4 - mul x4, x3, x27 - umulh x27, x3, x27 - adcs x16, x16, x4 + mov x3, #38 mul x4, x3, x28 + adds x17, x17, x4 umulh x5, x3, x28 - adcs x17, x17, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x15, x15, x2 - adcs x16, x16, x26 - adcs x17, x17, x27 adc x5, x5, xzr - # Overflow + mov x3, #19 extr x5, x5, x17, #63 mul x5, x5, x3 and x17, x17, #0x7fffffffffffffff - adds x14, x14, x5 - adcs x15, x15, xzr - adcs x16, x16, xzr + mov x3, #38 + mul x4, x3, x25 + adds x14, x14, x4 + umulh x25, x3, x25 + mul x4, x3, x26 + adcs x15, x15, x4 + umulh x26, x3, x26 + mul x4, x3, x27 + adcs x16, x16, x4 + umulh x27, x3, x27 adc x17, x17, xzr - # Reduce if top bit set - and x5, x3, x17, asr 63 - and x17, x17, #0x7fffffffffffffff + # Add high product results in adds x14, x14, x5 - adcs x15, x15, xzr - adcs x16, x16, xzr - adc x17, x17, xzr - # Store + adcs x15, x15, x25 + adcs x16, x16, x26 + adc x17, x17, x27 # Multiply - # A[0] * B[0] - mul x6, x14, x10 + # A[0] * B[0] umulh x7, x14, x10 - # A[0] * B[1] - mul x3, x14, x11 - umulh x8, x14, x11 - adds x7, x7, x3 - adc x8, x8, xzr - # A[1] * B[0] + mul x6, x14, x10 + # A[2] * B[0] + umulh x9, x16, x10 + mul x8, x16, x10 + # A[1] * B[0] mul x3, x15, x10 + adds x7, x7, x3 umulh x4, x15, x10 + adcs x8, x8, x4 + # A[1] * B[3] + umulh x26, x15, x13 + adc x9, x9, xzr + mul x25, x15, x13 + # A[0] * B[1] + mul x3, x14, x11 adds x7, x7, x3 + umulh x4, x14, x11 adcs x8, x8, x4 - adc x9, xzr, xzr - # A[0] * B[2] - mul x3, x14, x12 - umulh x4, x14, x12 - adds x8, x8, x3 - adc x9, x9, x4 - # A[1] * B[1] - mul x3, x15, x11 - umulh x4, x15, x11 - adds x8, x8, x3 - adcs x9, x9, x4 - adc x2, xzr, xzr - # A[2] * B[0] - mul x3, x16, x10 - umulh x4, x16, x10 - adds x8, x8, x3 - adcs x9, x9, x4 - adc x2, x2, xzr - # A[0] * B[3] - mul x3, x14, x13 - umulh x4, x14, x13 - adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, xzr, xzr - # A[1] * B[2] - mul x3, x15, x12 - umulh x4, x15, x12 - adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[2] * B[1] + # A[2] * B[1] mul x3, x16, x11 + adcs x9, x9, x3 umulh x4, x16, x11 - adds x9, x9, x3 - adcs x2, x2, x4 + adcs x25, x25, x4 adc x26, x26, xzr - # A[3] * B[0] - mul x3, x17, x10 - umulh x4, x17, x10 + # A[1] * B[2] + mul x3, x15, x12 adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[1] * B[3] - mul x3, x15, x13 - umulh x4, x15, x13 - adds x2, x2, x3 - adcs x26, x26, x4 + umulh x4, x15, x12 + adcs x25, x25, x4 + adcs x26, x26, xzr adc x27, xzr, xzr - # A[2] * B[2] - mul x3, x16, x12 - umulh x4, x16, x12 - adds x2, x2, x3 - adcs x26, x26, x4 + # A[0] * B[2] + mul x3, x14, x12 + adds x8, x8, x3 + umulh x4, x14, x12 + adcs x9, x9, x4 + adcs x25, x25, xzr + adcs x26, x26, xzr adc x27, x27, xzr - # A[3] * B[1] + # A[1] * B[1] + mul x3, x15, x11 + adds x8, x8, x3 + umulh x4, x15, x11 + adcs x9, x9, x4 + # A[3] * B[1] mul x3, x17, x11 + adcs x25, x25, x3 umulh x4, x17, x11 - adds x2, x2, x3 adcs x26, x26, x4 adc x27, x27, xzr - # A[2] * B[3] + # A[2] * B[2] + mul x3, x16, x12 + adds x25, x25, x3 + umulh x4, x16, x12 + adcs x26, x26, x4 + # A[3] * B[3] + mul x3, x17, x13 + adcs x27, x27, x3 + umulh x28, x17, x13 + adc x28, x28, xzr + # A[0] * B[3] + mul x3, x14, x13 + adds x9, x9, x3 + umulh x4, x14, x13 + adcs x25, x25, x4 + # A[2] * B[3] mul x3, x16, x13 + adcs x26, x26, x3 umulh x4, x16, x13 - adds x26, x26, x3 adcs x27, x27, x4 - adc x28, xzr, xzr - # A[3] * B[2] + adc x28, x28, xzr + # A[3] * B[0] + mul x3, x17, x10 + adds x9, x9, x3 + umulh x4, x17, x10 + adcs x25, x25, x4 + # A[3] * B[2] mul x3, x17, x12 + adcs x26, x26, x3 umulh x4, x17, x12 - adds x26, x26, x3 adcs x27, x27, x4 adc x28, x28, xzr - # A[3] * B[3] - mul x3, x17, x13 - umulh x4, x17, x13 - adds x27, x27, x3 - adc x28, x28, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x28, x28, x27, #63 - extr x27, x27, x26, #63 - extr x26, x26, x2, #63 - extr x2, x2, x9, #63 - and x9, x9, #0x7fffffffffffffff - # Multiply top half by 19 - mov x3, #19 - mul x4, x3, x2 - umulh x2, x3, x2 - adds x6, x6, x4 - mul x4, x3, x26 - umulh x26, x3, x26 - adcs x7, x7, x4 - mul x4, x3, x27 - umulh x27, x3, x27 - adcs x8, x8, x4 + mov x3, #38 mul x4, x3, x28 + adds x9, x9, x4 umulh x5, x3, x28 - adcs x9, x9, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x7, x7, x2 - adcs x8, x8, x26 - adcs x9, x9, x27 adc x5, x5, xzr - # Overflow + mov x3, #19 extr x5, x5, x9, #63 mul x5, x5, x3 and x9, x9, #0x7fffffffffffffff - adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr + mov x3, #38 + mul x4, x3, x25 + adds x6, x6, x4 + umulh x25, x3, x25 + mul x4, x3, x26 + adcs x7, x7, x4 + umulh x26, x3, x26 + mul x4, x3, x27 + adcs x8, x8, x4 + umulh x27, x3, x27 adc x9, x9, xzr - # Reduce if top bit set - and x5, x3, x9, asr 63 - and x9, x9, #0x7fffffffffffffff + # Add high product results in adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr - adc x9, x9, xzr + adcs x7, x7, x25 + adcs x8, x8, x26 + adc x9, x9, x27 # Store stp x6, x7, [x0] stp x8, x9, [x0, #16] @@ -1911,576 +2336,479 @@ sbcs x15, x15, x11 sbcs x16, x16, x12 sbcs x17, x17, x13 + csetm x5, cc mov x3, #-19 - csetm x2, cc # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + extr x5, x5, x17, #63 + mul x3, x5, x3 # Add modulus (if underflow) - adds x14, x14, x3 - adcs x15, x15, x2 - adcs x16, x16, x2 - adc x17, x17, x4 + subs x14, x14, x3 + sbcs x15, x15, xzr + and x17, x17, #0x7fffffffffffffff + sbcs x16, x16, xzr + sbc x17, x17, xzr # Multiply by 121666 mov x5, #0xdb42 movk x5, #1, lsl 16 mul x6, x14, x5 umulh x7, x14, x5 mul x3, x15, x5 - umulh x4, x15, x5 + umulh x8, x15, x5 adds x7, x7, x3 - adc x8, xzr, x4 + adc x8, x8, xzr mul x3, x16, x5 - umulh x4, x16, x5 + umulh x9, x16, x5 adds x8, x8, x3 - adc x9, xzr, x4 + adc x9, x9, xzr mul x3, x17, x5 umulh x4, x17, x5 adds x9, x9, x3 - adc x4, xzr, x4 + adc x4, x4, xzr mov x5, #19 extr x4, x4, x9, #63 mul x4, x4, x5 - and x9, x9, #0x7fffffffffffffff adds x6, x6, x4 adcs x7, x7, xzr + and x9, x9, #0x7fffffffffffffff adcs x8, x8, xzr adc x9, x9, xzr # Add adds x10, x10, x6 adcs x11, x11, x7 adcs x12, x12, x8 - adc x13, x13, x9 - mov x3, #-19 - asr x2, x13, #63 + adcs x13, x13, x9 + cset x5, cs + mov x3, #19 # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + extr x5, x5, x13, #63 + mul x3, x5, x3 # Sub modulus (if overflow) - subs x10, x10, x3 - sbcs x11, x11, x2 - sbcs x12, x12, x2 - sbc x13, x13, x4 + adds x10, x10, x3 + adcs x11, x11, xzr + and x13, x13, #0x7fffffffffffffff + adcs x12, x12, xzr + adc x13, x13, xzr # Multiply - # A[0] * B[0] - mul x6, x14, x10 + # A[0] * B[0] umulh x7, x14, x10 - # A[0] * B[1] - mul x3, x14, x11 - umulh x8, x14, x11 - adds x7, x7, x3 - adc x8, x8, xzr - # A[1] * B[0] + mul x6, x14, x10 + # A[2] * B[0] + umulh x9, x16, x10 + mul x8, x16, x10 + # A[1] * B[0] mul x3, x15, x10 + adds x7, x7, x3 umulh x4, x15, x10 + adcs x8, x8, x4 + # A[1] * B[3] + umulh x26, x15, x13 + adc x9, x9, xzr + mul x25, x15, x13 + # A[0] * B[1] + mul x3, x14, x11 adds x7, x7, x3 + umulh x4, x14, x11 adcs x8, x8, x4 - adc x9, xzr, xzr - # A[0] * B[2] - mul x3, x14, x12 - umulh x4, x14, x12 - adds x8, x8, x3 - adc x9, x9, x4 - # A[1] * B[1] - mul x3, x15, x11 - umulh x4, x15, x11 - adds x8, x8, x3 - adcs x9, x9, x4 - adc x2, xzr, xzr - # A[2] * B[0] - mul x3, x16, x10 - umulh x4, x16, x10 - adds x8, x8, x3 - adcs x9, x9, x4 - adc x2, x2, xzr - # A[0] * B[3] - mul x3, x14, x13 - umulh x4, x14, x13 - adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, xzr, xzr - # A[1] * B[2] - mul x3, x15, x12 - umulh x4, x15, x12 - adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[2] * B[1] + # A[2] * B[1] mul x3, x16, x11 + adcs x9, x9, x3 umulh x4, x16, x11 - adds x9, x9, x3 - adcs x2, x2, x4 + adcs x25, x25, x4 adc x26, x26, xzr - # A[3] * B[0] - mul x3, x17, x10 - umulh x4, x17, x10 + # A[1] * B[2] + mul x3, x15, x12 adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[1] * B[3] - mul x3, x15, x13 - umulh x4, x15, x13 - adds x2, x2, x3 - adcs x26, x26, x4 + umulh x4, x15, x12 + adcs x25, x25, x4 + adcs x26, x26, xzr adc x27, xzr, xzr - # A[2] * B[2] - mul x3, x16, x12 - umulh x4, x16, x12 - adds x2, x2, x3 - adcs x26, x26, x4 + # A[0] * B[2] + mul x3, x14, x12 + adds x8, x8, x3 + umulh x4, x14, x12 + adcs x9, x9, x4 + adcs x25, x25, xzr + adcs x26, x26, xzr adc x27, x27, xzr - # A[3] * B[1] + # A[1] * B[1] + mul x3, x15, x11 + adds x8, x8, x3 + umulh x4, x15, x11 + adcs x9, x9, x4 + # A[3] * B[1] mul x3, x17, x11 + adcs x25, x25, x3 umulh x4, x17, x11 - adds x2, x2, x3 adcs x26, x26, x4 adc x27, x27, xzr - # A[2] * B[3] + # A[2] * B[2] + mul x3, x16, x12 + adds x25, x25, x3 + umulh x4, x16, x12 + adcs x26, x26, x4 + # A[3] * B[3] + mul x3, x17, x13 + adcs x27, x27, x3 + umulh x28, x17, x13 + adc x28, x28, xzr + # A[0] * B[3] + mul x3, x14, x13 + adds x9, x9, x3 + umulh x4, x14, x13 + adcs x25, x25, x4 + # A[2] * B[3] mul x3, x16, x13 + adcs x26, x26, x3 umulh x4, x16, x13 - adds x26, x26, x3 adcs x27, x27, x4 - adc x28, xzr, xzr - # A[3] * B[2] + adc x28, x28, xzr + # A[3] * B[0] + mul x3, x17, x10 + adds x9, x9, x3 + umulh x4, x17, x10 + adcs x25, x25, x4 + # A[3] * B[2] mul x3, x17, x12 + adcs x26, x26, x3 umulh x4, x17, x12 - adds x26, x26, x3 adcs x27, x27, x4 adc x28, x28, xzr - # A[3] * B[3] - mul x3, x17, x13 - umulh x4, x17, x13 - adds x27, x27, x3 - adc x28, x28, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x28, x28, x27, #63 - extr x27, x27, x26, #63 - extr x26, x26, x2, #63 - extr x2, x2, x9, #63 - and x9, x9, #0x7fffffffffffffff - # Multiply top half by 19 - mov x3, #19 - mul x4, x3, x2 - umulh x2, x3, x2 - adds x6, x6, x4 - mul x4, x3, x26 - umulh x26, x3, x26 - adcs x7, x7, x4 - mul x4, x3, x27 - umulh x27, x3, x27 - adcs x8, x8, x4 + mov x3, #38 mul x4, x3, x28 + adds x9, x9, x4 umulh x5, x3, x28 - adcs x9, x9, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x7, x7, x2 - adcs x8, x8, x26 - adcs x9, x9, x27 adc x5, x5, xzr - # Overflow + mov x3, #19 extr x5, x5, x9, #63 mul x5, x5, x3 and x9, x9, #0x7fffffffffffffff - adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr + mov x3, #38 + mul x4, x3, x25 + adds x6, x6, x4 + umulh x25, x3, x25 + mul x4, x3, x26 + adcs x7, x7, x4 + umulh x26, x3, x26 + mul x4, x3, x27 + adcs x8, x8, x4 + umulh x27, x3, x27 adc x9, x9, xzr - # Reduce if top bit set - and x5, x3, x9, asr 63 - and x9, x9, #0x7fffffffffffffff + # Add high product results in adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr - adc x9, x9, xzr + adcs x7, x7, x25 + adcs x8, x8, x26 + adc x9, x9, x27 # Store stp x6, x7, [x29, #16] stp x8, x9, [x29, #32] # Add - ldp x6, x7, [x29, #112] - ldp x8, x9, [x29, #128] - adds x10, x6, x19 - adcs x11, x7, x20 - adcs x12, x8, x21 - adc x13, x9, x22 - mov x3, #-19 - asr x2, x13, #63 - # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + ldp x25, x26, [x29, #48] + ldp x27, x28, [x29, #64] + adds x10, x25, x19 + adcs x11, x26, x20 + adcs x12, x27, x21 + adcs x13, x28, x22 + cset x5, cs + mov x3, #19 + extr x5, x5, x13, #63 + mul x3, x5, x3 # Sub modulus (if overflow) - subs x10, x10, x3 - sbcs x11, x11, x2 - sbcs x12, x12, x2 - sbc x13, x13, x4 + adds x10, x10, x3 + adcs x11, x11, xzr + and x13, x13, #0x7fffffffffffffff + adcs x12, x12, xzr + adc x13, x13, xzr # Sub - subs x19, x6, x19 - sbcs x20, x7, x20 - sbcs x21, x8, x21 - sbcs x22, x9, x22 + subs x19, x25, x19 + sbcs x20, x26, x20 + sbcs x21, x27, x21 + sbcs x22, x28, x22 + csetm x5, cc mov x3, #-19 - csetm x2, cc - # Mask the modulus - and x3, x2, x3 - and x4, x2, #0x7fffffffffffffff + extr x5, x5, x22, #63 + mul x3, x5, x3 # Add modulus (if underflow) - adds x19, x19, x3 - adcs x20, x20, x2 - adcs x21, x21, x2 - adc x22, x22, x4 + subs x19, x19, x3 + sbcs x20, x20, xzr + and x22, x22, #0x7fffffffffffffff + sbcs x21, x21, xzr + sbc x22, x22, xzr # Square # A[0] * A[1] - mul x7, x10, x11 umulh x8, x10, x11 + mul x7, x10, x11 + # A[0] * A[3] + umulh x25, x10, x13 + mul x9, x10, x13 # A[0] * A[2] mul x3, x10, x12 - umulh x9, x10, x12 adds x8, x8, x3 - adc x9, x9, xzr - # A[0] * A[3] - mul x3, x10, x13 - umulh x2, x10, x13 - adds x9, x9, x3 - adc x2, x2, xzr + umulh x4, x10, x12 + adcs x9, x9, x4 + # A[1] * A[3] + mul x3, x11, x13 + adcs x25, x25, x3 + umulh x26, x11, x13 + adc x26, x26, xzr # A[1] * A[2] mul x3, x11, x12 - umulh x4, x11, x12 adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, xzr, xzr - # A[1] * A[3] - mul x3, x11, x13 - umulh x4, x11, x13 - adds x2, x2, x3 - adc x26, x26, x4 + umulh x4, x11, x12 + adcs x25, x25, x4 # A[2] * A[3] mul x3, x12, x13 + adcs x26, x26, x3 umulh x27, x12, x13 - adds x26, x26, x3 adc x27, x27, xzr # Double adds x7, x7, x7 adcs x8, x8, x8 adcs x9, x9, x9 - adcs x2, x2, x2 + adcs x25, x25, x25 adcs x26, x26, x26 adcs x27, x27, x27 adc x28, xzr, xzr # A[0] * A[0] + umulh x4, x10, x10 mul x6, x10, x10 - umulh x5, x10, x10 # A[1] * A[1] mul x3, x11, x11 + adds x7, x7, x4 umulh x4, x11, x11 - adds x7, x7, x5 adcs x8, x8, x3 - adc x5, x4, xzr # A[2] * A[2] mul x3, x12, x12 + adcs x9, x9, x4 umulh x4, x12, x12 - adds x9, x9, x5 - adcs x2, x2, x3 - adc x5, x4, xzr + adcs x25, x25, x3 # A[3] * A[3] mul x3, x13, x13 + adcs x26, x26, x4 umulh x4, x13, x13 - adds x26, x26, x5 adcs x27, x27, x3 adc x28, x28, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x28, x28, x27, #63 - extr x27, x27, x26, #63 - extr x26, x26, x2, #63 - extr x2, x2, x9, #63 - and x9, x9, #0x7fffffffffffffff - # Multiply top half by 19 - mov x3, #19 - mul x4, x3, x2 - umulh x2, x3, x2 - adds x6, x6, x4 - mul x4, x3, x26 - umulh x26, x3, x26 - adcs x7, x7, x4 - mul x4, x3, x27 - umulh x27, x3, x27 - adcs x8, x8, x4 + mov x3, #38 mul x4, x3, x28 + adds x9, x9, x4 umulh x5, x3, x28 - adcs x9, x9, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x7, x7, x2 - adcs x8, x8, x26 - adcs x9, x9, x27 adc x5, x5, xzr - # Overflow + mov x3, #19 extr x5, x5, x9, #63 mul x5, x5, x3 and x9, x9, #0x7fffffffffffffff - adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr + mov x3, #38 + mul x4, x3, x25 + adds x6, x6, x4 + umulh x25, x3, x25 + mul x4, x3, x26 + adcs x7, x7, x4 + umulh x26, x3, x26 + mul x4, x3, x27 + adcs x8, x8, x4 + umulh x27, x3, x27 adc x9, x9, xzr - # Reduce if top bit set - and x5, x3, x9, asr 63 - and x9, x9, #0x7fffffffffffffff + # Add high product results in adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr - adc x9, x9, xzr - # Store - stp x6, x7, [x29, #80] - stp x8, x9, [x29, #96] + adcs x7, x7, x25 + adcs x8, x8, x26 + adc x9, x9, x27 # Square # A[0] * A[1] - mul x7, x19, x20 - umulh x8, x19, x20 + umulh x16, x19, x20 + mul x15, x19, x20 + # A[0] * A[3] + umulh x25, x19, x22 + mul x17, x19, x22 # A[0] * A[2] mul x3, x19, x21 - umulh x9, x19, x21 - adds x8, x8, x3 - adc x9, x9, xzr - # A[0] * A[3] - mul x3, x19, x22 - umulh x2, x19, x22 - adds x9, x9, x3 - adc x2, x2, xzr + adds x16, x16, x3 + umulh x4, x19, x21 + adcs x17, x17, x4 + # A[1] * A[3] + mul x3, x20, x22 + adcs x25, x25, x3 + umulh x26, x20, x22 + adc x26, x26, xzr # A[1] * A[2] mul x3, x20, x21 + adds x17, x17, x3 umulh x4, x20, x21 - adds x9, x9, x3 - adcs x2, x2, x4 - adc x26, xzr, xzr - # A[1] * A[3] - mul x3, x20, x22 - umulh x4, x20, x22 - adds x2, x2, x3 - adc x26, x26, x4 + adcs x25, x25, x4 # A[2] * A[3] mul x3, x21, x22 + adcs x26, x26, x3 umulh x27, x21, x22 - adds x26, x26, x3 adc x27, x27, xzr # Double - adds x7, x7, x7 - adcs x8, x8, x8 - adcs x9, x9, x9 - adcs x2, x2, x2 + adds x15, x15, x15 + adcs x16, x16, x16 + adcs x17, x17, x17 + adcs x25, x25, x25 adcs x26, x26, x26 adcs x27, x27, x27 adc x28, xzr, xzr # A[0] * A[0] - mul x6, x19, x19 - umulh x5, x19, x19 + umulh x4, x19, x19 + mul x14, x19, x19 # A[1] * A[1] mul x3, x20, x20 + adds x15, x15, x4 umulh x4, x20, x20 - adds x7, x7, x5 - adcs x8, x8, x3 - adc x5, x4, xzr + adcs x16, x16, x3 # A[2] * A[2] mul x3, x21, x21 + adcs x17, x17, x4 umulh x4, x21, x21 - adds x9, x9, x5 - adcs x2, x2, x3 - adc x5, x4, xzr + adcs x25, x25, x3 # A[3] * A[3] mul x3, x22, x22 + adcs x26, x26, x4 umulh x4, x22, x22 - adds x26, x26, x5 adcs x27, x27, x3 adc x28, x28, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x28, x28, x27, #63 - extr x27, x27, x26, #63 - extr x26, x26, x2, #63 - extr x2, x2, x9, #63 - and x9, x9, #0x7fffffffffffffff - # Multiply top half by 19 + mov x3, #38 + mul x4, x3, x28 + adds x17, x17, x4 + umulh x5, x3, x28 + adc x5, x5, xzr mov x3, #19 - mul x4, x3, x2 - umulh x2, x3, x2 - adds x6, x6, x4 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x25 + adds x14, x14, x4 + umulh x25, x3, x25 mul x4, x3, x26 + adcs x15, x15, x4 umulh x26, x3, x26 - adcs x7, x7, x4 mul x4, x3, x27 + adcs x16, x16, x4 umulh x27, x3, x27 - adcs x8, x8, x4 - mul x4, x3, x28 - umulh x5, x3, x28 - adcs x9, x9, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x7, x7, x2 - adcs x8, x8, x26 - adcs x9, x9, x27 - adc x5, x5, xzr - # Overflow - extr x5, x5, x9, #63 - mul x5, x5, x3 - and x9, x9, #0x7fffffffffffffff - adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr - adc x9, x9, xzr - # Reduce if top bit set - and x5, x3, x9, asr 63 - and x9, x9, #0x7fffffffffffffff - adds x6, x6, x5 - adcs x7, x7, xzr - adcs x8, x8, xzr - adc x9, x9, xzr - # Store - ldr x2, [x29, #184] + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x25 + adcs x16, x16, x26 + adc x17, x17, x27 # Multiply - ldp x14, x15, [x2] - ldp x16, x17, [x2, #16] - # A[0] * B[0] - mul x10, x14, x6 - umulh x11, x14, x6 - # A[0] * B[1] - mul x3, x14, x7 - umulh x12, x14, x7 + ldp x19, x20, [x2] + ldp x21, x22, [x2, #16] + # A[0] * B[0] + umulh x11, x19, x14 + mul x10, x19, x14 + # A[2] * B[0] + umulh x13, x21, x14 + mul x12, x21, x14 + # A[1] * B[0] + mul x3, x20, x14 adds x11, x11, x3 - adc x12, x12, xzr - # A[1] * B[0] - mul x3, x15, x6 - umulh x4, x15, x6 + umulh x4, x20, x14 + adcs x12, x12, x4 + # A[1] * B[3] + umulh x26, x20, x17 + adc x13, x13, xzr + mul x25, x20, x17 + # A[0] * B[1] + mul x3, x19, x15 adds x11, x11, x3 + umulh x4, x19, x15 adcs x12, x12, x4 - adc x13, xzr, xzr - # A[0] * B[2] - mul x3, x14, x8 - umulh x4, x14, x8 - adds x12, x12, x3 - adc x13, x13, x4 - # A[1] * B[1] - mul x3, x15, x7 - umulh x4, x15, x7 + # A[2] * B[1] + mul x3, x21, x15 + adcs x13, x13, x3 + umulh x4, x21, x15 + adcs x25, x25, x4 + adc x26, x26, xzr + # A[1] * B[2] + mul x3, x20, x16 + adds x13, x13, x3 + umulh x4, x20, x16 + adcs x25, x25, x4 + adcs x26, x26, xzr + adc x27, xzr, xzr + # A[0] * B[2] + mul x3, x19, x16 adds x12, x12, x3 + umulh x4, x19, x16 adcs x13, x13, x4 - adc x2, xzr, xzr - # A[2] * B[0] - mul x3, x16, x6 - umulh x4, x16, x6 + adcs x25, x25, xzr + adcs x26, x26, xzr + adc x27, x27, xzr + # A[1] * B[1] + mul x3, x20, x15 adds x12, x12, x3 + umulh x4, x20, x15 adcs x13, x13, x4 - adc x2, x2, xzr - # A[0] * B[3] - mul x3, x14, x9 - umulh x4, x14, x9 - adds x13, x13, x3 - adcs x2, x2, x4 - adc x26, xzr, xzr - # A[1] * B[2] - mul x3, x15, x8 - umulh x4, x15, x8 - adds x13, x13, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[2] * B[1] - mul x3, x16, x7 - umulh x4, x16, x7 - adds x13, x13, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[3] * B[0] - mul x3, x17, x6 - umulh x4, x17, x6 - adds x13, x13, x3 - adcs x2, x2, x4 - adc x26, x26, xzr - # A[1] * B[3] - mul x3, x15, x9 - umulh x4, x15, x9 - adds x2, x2, x3 - adcs x26, x26, x4 - adc x27, xzr, xzr - # A[2] * B[2] - mul x3, x16, x8 - umulh x4, x16, x8 - adds x2, x2, x3 + # A[3] * B[1] + mul x3, x22, x15 + adcs x25, x25, x3 + umulh x4, x22, x15 adcs x26, x26, x4 adc x27, x27, xzr - # A[3] * B[1] - mul x3, x17, x7 - umulh x4, x17, x7 - adds x2, x2, x3 + # A[2] * B[2] + mul x3, x21, x16 + adds x25, x25, x3 + umulh x4, x21, x16 adcs x26, x26, x4 - adc x27, x27, xzr - # A[2] * B[3] - mul x3, x16, x9 - umulh x4, x16, x9 - adds x26, x26, x3 + # A[3] * B[3] + mul x3, x22, x17 + adcs x27, x27, x3 + umulh x28, x22, x17 + adc x28, x28, xzr + # A[0] * B[3] + mul x3, x19, x17 + adds x13, x13, x3 + umulh x4, x19, x17 + adcs x25, x25, x4 + # A[2] * B[3] + mul x3, x21, x17 + adcs x26, x26, x3 + umulh x4, x21, x17 adcs x27, x27, x4 - adc x28, xzr, xzr - # A[3] * B[2] - mul x3, x17, x8 - umulh x4, x17, x8 - adds x26, x26, x3 + adc x28, x28, xzr + # A[3] * B[0] + mul x3, x22, x14 + adds x13, x13, x3 + umulh x4, x22, x14 + adcs x25, x25, x4 + # A[3] * B[2] + mul x3, x22, x16 + adcs x26, x26, x3 + umulh x4, x22, x16 adcs x27, x27, x4 adc x28, x28, xzr - # A[3] * B[3] - mul x3, x17, x9 - umulh x4, x17, x9 - adds x27, x27, x3 - adc x28, x28, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x28, x28, x27, #63 - extr x27, x27, x26, #63 - extr x26, x26, x2, #63 - extr x2, x2, x13, #63 - and x13, x13, #0x7fffffffffffffff - # Multiply top half by 19 - mov x3, #19 - mul x4, x3, x2 - umulh x2, x3, x2 - adds x10, x10, x4 - mul x4, x3, x26 - umulh x26, x3, x26 - adcs x11, x11, x4 - mul x4, x3, x27 - umulh x27, x3, x27 - adcs x12, x12, x4 + mov x3, #38 mul x4, x3, x28 + adds x13, x13, x4 umulh x5, x3, x28 - adcs x13, x13, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x11, x11, x2 - adcs x12, x12, x26 - adcs x13, x13, x27 adc x5, x5, xzr - # Overflow + mov x3, #19 extr x5, x5, x13, #63 mul x5, x5, x3 and x13, x13, #0x7fffffffffffffff - adds x10, x10, x5 - adcs x11, x11, xzr - adcs x12, x12, xzr + mov x3, #38 + mul x4, x3, x25 + adds x10, x10, x4 + umulh x25, x3, x25 + mul x4, x3, x26 + adcs x11, x11, x4 + umulh x26, x3, x26 + mul x4, x3, x27 + adcs x12, x12, x4 + umulh x27, x3, x27 adc x13, x13, xzr - # Reduce if top bit set - and x5, x3, x13, asr 63 - and x13, x13, #0x7fffffffffffffff + # Add high product results in adds x10, x10, x5 - adcs x11, x11, xzr - adcs x12, x12, xzr - adc x13, x13, xzr - # Store - stp x10, x11, [x29, #48] - stp x12, x13, [x29, #64] - sub x25, x25, #1 - cmp x25, #0 + adcs x11, x11, x25 + adcs x12, x12, x26 + adc x13, x13, x27 + subs x24, x24, #1 bge L_curve25519_bits - mov x25, #63 - sub x24, x24, #8 - cmp x24, #0 - bge L_curve25519_words # Invert add x0, x29, #48 add x1, x29, #16 @@ -2540,61 +2868,197 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x70 -#ifndef NDEBUG - add x1, x29, #0x50 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x24, #3 -#ifndef NDEBUG - add x0, x29, #0x70 -#endif /* !NDEBUG */ - add x1, x29, #0x70 + # Loop: 5 times + mov x24, #5 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_curve25519_inv_1: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_1 - add x0, x29, #0x50 + bne L_curve25519_inv_1 + # Store + stp x6, x7, [x29, #112] + stp x8, x9, [x29, #128] #ifndef NDEBUG - add x1, x29, #0x70 + add x0, x29, #0x50 #endif /* !NDEBUG */ + add x1, x29, #0x70 add x2, x29, #0x50 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x70 - add x1, x29, #0x50 -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x24, #8 -#ifndef NDEBUG - add x0, x29, #0x70 -#endif /* !NDEBUG */ - add x1, x29, #0x70 + # Loop: 10 times + mov x24, #10 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_curve25519_inv_2: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_2 -#ifndef NDEBUG + bne L_curve25519_inv_2 + # Store + stp x6, x7, [x29, #112] + stp x8, x9, [x29, #128] add x0, x29, #0x70 -#endif /* !NDEBUG */ #ifndef NDEBUG add x1, x29, #0x70 #endif /* !NDEBUG */ @@ -2604,84 +3068,295 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x90 -#ifndef NDEBUG - add x1, x29, #0x70 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x24, #18 -#ifndef NDEBUG - add x0, x29, #0x90 -#endif /* !NDEBUG */ - add x1, x29, #0x90 + # Loop: 20 times + mov x24, #20 + ldp x6, x7, [x29, #112] + ldp x8, x9, [x29, #128] L_curve25519_inv_3: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_3 - add x0, x29, #0x70 + bne L_curve25519_inv_3 + # Store + stp x6, x7, [x29, #144] + stp x8, x9, [x29, #160] #ifndef NDEBUG - add x1, x29, #0x90 + add x0, x29, #0x70 #endif /* !NDEBUG */ + add x1, x29, #0x90 add x2, x29, #0x70 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x24, #9 -#ifndef NDEBUG - add x0, x29, #0x70 -#endif /* !NDEBUG */ - add x1, x29, #0x70 + # Loop: 10 times + mov x24, #10 + ldp x6, x7, [x29, #112] + ldp x8, x9, [x29, #128] L_curve25519_inv_4: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_4 + bne L_curve25519_inv_4 + # Store + stp x6, x7, [x29, #112] + stp x8, x9, [x29, #128] add x0, x29, #0x50 -#ifndef NDEBUG add x1, x29, #0x70 -#endif /* !NDEBUG */ add x2, x29, #0x50 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x70 - add x1, x29, #0x50 -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x24, #48 -#ifndef NDEBUG - add x0, x29, #0x70 -#endif /* !NDEBUG */ - add x1, x29, #0x70 + # Loop: 50 times + mov x24, #50 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_curve25519_inv_5: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_5 -#ifndef NDEBUG + bne L_curve25519_inv_5 + # Store + stp x6, x7, [x29, #112] + stp x8, x9, [x29, #128] add x0, x29, #0x70 -#endif /* !NDEBUG */ #ifndef NDEBUG add x1, x29, #0x70 #endif /* !NDEBUG */ @@ -2691,78 +3366,296 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x90 -#ifndef NDEBUG - add x1, x29, #0x70 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x24, #0x62 -#ifndef NDEBUG - add x0, x29, #0x90 -#endif /* !NDEBUG */ - add x1, x29, #0x90 + # Loop: 100 times + mov x24, #0x64 + ldp x6, x7, [x29, #112] + ldp x8, x9, [x29, #128] L_curve25519_inv_6: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_6 - add x0, x29, #0x70 + bne L_curve25519_inv_6 + # Store + stp x6, x7, [x29, #144] + stp x8, x9, [x29, #160] #ifndef NDEBUG - add x1, x29, #0x90 + add x0, x29, #0x70 #endif /* !NDEBUG */ + add x1, x29, #0x90 add x2, x29, #0x70 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x24, #49 -#ifndef NDEBUG - add x0, x29, #0x70 -#endif /* !NDEBUG */ - add x1, x29, #0x70 + # Loop: 50 times + mov x24, #50 + ldp x6, x7, [x29, #112] + ldp x8, x9, [x29, #128] L_curve25519_inv_7: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_7 + bne L_curve25519_inv_7 + # Store + stp x6, x7, [x29, #112] + stp x8, x9, [x29, #128] add x0, x29, #0x50 -#ifndef NDEBUG add x1, x29, #0x70 -#endif /* !NDEBUG */ add x2, x29, #0x50 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x24, #4 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 5 times + mov x24, #5 + ldp x6, x7, [x29, #80] + ldp x8, x9, [x29, #96] L_curve25519_inv_8: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x24, x24, #1 - bcs L_curve25519_inv_8 + bne L_curve25519_inv_8 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] add x0, x29, #16 -#ifndef NDEBUG add x1, x29, #0x50 -#endif /* !NDEBUG */ add x2, x29, #48 #ifndef __APPLE__ bl fe_mul @@ -2775,136 +3668,122 @@ ldp x8, x9, [x0, #16] ldp x10, x11, [x29, #16] ldp x12, x13, [x29, #32] - # A[0] * B[0] - mul x14, x6, x10 + # A[0] * B[0] umulh x15, x6, x10 - # A[0] * B[1] - mul x3, x6, x11 - umulh x16, x6, x11 - adds x15, x15, x3 - adc x16, x16, xzr - # A[1] * B[0] + mul x14, x6, x10 + # A[2] * B[0] + umulh x17, x8, x10 + mul x16, x8, x10 + # A[1] * B[0] mul x3, x7, x10 + adds x15, x15, x3 umulh x4, x7, x10 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x7, x13 + adc x17, x17, xzr + mul x19, x7, x13 + # A[0] * B[1] + mul x3, x6, x11 adds x15, x15, x3 + umulh x4, x6, x11 adcs x16, x16, x4 - adc x17, xzr, xzr - # A[0] * B[2] - mul x3, x6, x12 - umulh x4, x6, x12 - adds x16, x16, x3 - adc x17, x17, x4 - # A[1] * B[1] - mul x3, x7, x11 - umulh x4, x7, x11 - adds x16, x16, x3 - adcs x17, x17, x4 - adc x19, xzr, xzr - # A[2] * B[0] - mul x3, x8, x10 - umulh x4, x8, x10 - adds x16, x16, x3 - adcs x17, x17, x4 - adc x19, x19, xzr - # A[0] * B[3] - mul x3, x6, x13 - umulh x4, x6, x13 - adds x17, x17, x3 - adcs x19, x19, x4 - adc x20, xzr, xzr - # A[1] * B[2] - mul x3, x7, x12 - umulh x4, x7, x12 - adds x17, x17, x3 - adcs x19, x19, x4 - adc x20, x20, xzr - # A[2] * B[1] + # A[2] * B[1] mul x3, x8, x11 + adcs x17, x17, x3 umulh x4, x8, x11 - adds x17, x17, x3 adcs x19, x19, x4 adc x20, x20, xzr - # A[3] * B[0] - mul x3, x9, x10 - umulh x4, x9, x10 + # A[1] * B[2] + mul x3, x7, x12 adds x17, x17, x3 + umulh x4, x7, x12 adcs x19, x19, x4 - adc x20, x20, xzr - # A[1] * B[3] - mul x3, x7, x13 - umulh x4, x7, x13 - adds x19, x19, x3 - adcs x20, x20, x4 + adcs x20, x20, xzr adc x21, xzr, xzr - # A[2] * B[2] - mul x3, x8, x12 - umulh x4, x8, x12 - adds x19, x19, x3 - adcs x20, x20, x4 + # A[0] * B[2] + mul x3, x6, x12 + adds x16, x16, x3 + umulh x4, x6, x12 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr adc x21, x21, xzr - # A[3] * B[1] + # A[1] * B[1] + mul x3, x7, x11 + adds x16, x16, x3 + umulh x4, x7, x11 + adcs x17, x17, x4 + # A[3] * B[1] mul x3, x9, x11 + adcs x19, x19, x3 umulh x4, x9, x11 - adds x19, x19, x3 adcs x20, x20, x4 adc x21, x21, xzr - # A[2] * B[3] + # A[2] * B[2] + mul x3, x8, x12 + adds x19, x19, x3 + umulh x4, x8, x12 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x9, x13 + adcs x21, x21, x3 + umulh x22, x9, x13 + adc x22, x22, xzr + # A[0] * B[3] + mul x3, x6, x13 + adds x17, x17, x3 + umulh x4, x6, x13 + adcs x19, x19, x4 + # A[2] * B[3] mul x3, x8, x13 + adcs x20, x20, x3 umulh x4, x8, x13 - adds x20, x20, x3 adcs x21, x21, x4 - adc x22, xzr, xzr - # A[3] * B[2] + adc x22, x22, xzr + # A[3] * B[0] + mul x3, x9, x10 + adds x17, x17, x3 + umulh x4, x9, x10 + adcs x19, x19, x4 + # A[3] * B[2] mul x3, x9, x12 + adcs x20, x20, x3 umulh x4, x9, x12 - adds x20, x20, x3 adcs x21, x21, x4 adc x22, x22, xzr - # A[3] * B[3] - mul x3, x9, x13 - umulh x4, x9, x13 - adds x21, x21, x3 - adc x22, x22, x4 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x22, x22, x21, #63 - extr x21, x21, x20, #63 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - and x17, x17, #0x7fffffffffffffff - # Multiply top half by 19 + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 mul x4, x3, x19 - umulh x19, x3, x19 adds x14, x14, x4 + umulh x19, x3, x19 mul x4, x3, x20 - umulh x20, x3, x20 adcs x15, x15, x4 + umulh x20, x3, x20 mul x4, x3, x21 - umulh x21, x3, x21 adcs x16, x16, x4 - mul x4, x3, x22 - umulh x5, x3, x22 - adcs x17, x17, x4 - adc x5, x5, xzr - # Add remaining product results in - adds x15, x15, x19 - adcs x16, x16, x20 - adcs x17, x17, x21 - adc x5, x5, xzr - # Overflow - extr x5, x5, x17, #63 - mul x5, x5, x3 - and x17, x17, #0x7fffffffffffffff - adds x14, x14, x5 - adcs x15, x15, xzr - adcs x16, x16, xzr + umulh x21, x3, x21 adc x17, x17, xzr - # Reduce if top bit set - and x5, x3, x17, asr 63 - and x17, x17, #0x7fffffffffffffff + # Add high product results in adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 + # Reduce if top bit set + mov x3, #19 + and x4, x3, x17, asr 63 + adds x14, x14, x4 adcs x15, x15, xzr + and x17, x17, #0x7fffffffffffffff adcs x16, x16, xzr adc x17, x17, xzr adds x4, x14, x3 @@ -2934,6 +3813,7 @@ #ifndef __APPLE__ .size curve25519,.-curve25519 #endif /* __APPLE__ */ +#ifdef HAVE_ED25519 #ifndef __APPLE__ .text .globl fe_pow22523 @@ -2948,6 +3828,7 @@ #endif /* __APPLE__ */ stp x29, x30, [sp, #-144]! add x29, sp, #0 + str x17, [x29, #128] str x23, [x29, #136] # pow22523 str x0, [x29, #112] @@ -3016,27 +3897,99 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #48 - add x1, x29, #16 -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x23, #3 -#ifndef NDEBUG - add x0, x29, #48 -#endif /* !NDEBUG */ - add x1, x29, #48 + # Loop: 5 times + mov x23, #5 + ldp x6, x7, [x29, #16] + ldp x8, x9, [x29, #32] L_fe_pow22523_1: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x23, x23, #1 - bcs L_fe_pow22523_1 + bne L_fe_pow22523_1 + # Store + stp x6, x7, [x29, #48] + stp x8, x9, [x29, #64] +#ifndef NDEBUG add x0, x29, #16 +#endif /* !NDEBUG */ #ifndef NDEBUG add x1, x29, #48 #endif /* !NDEBUG */ @@ -3046,29 +3999,97 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #48 - add x1, x29, #16 -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x23, #8 -#ifndef NDEBUG - add x0, x29, #48 -#endif /* !NDEBUG */ - add x1, x29, #48 + # Loop: 10 times + mov x23, #10 + ldp x6, x7, [x29, #16] + ldp x8, x9, [x29, #32] L_fe_pow22523_2: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x23, x23, #1 - bcs L_fe_pow22523_2 -#ifndef NDEBUG + bne L_fe_pow22523_2 + # Store + stp x6, x7, [x29, #48] + stp x8, x9, [x29, #64] add x0, x29, #48 -#endif /* !NDEBUG */ #ifndef NDEBUG add x1, x29, #48 #endif /* !NDEBUG */ @@ -3078,84 +4099,295 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x50 -#ifndef NDEBUG - add x1, x29, #48 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x23, #18 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 20 times + mov x23, #20 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_pow22523_3: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x23, x23, #1 - bcs L_fe_pow22523_3 - add x0, x29, #48 + bne L_fe_pow22523_3 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] #ifndef NDEBUG - add x1, x29, #0x50 + add x0, x29, #48 #endif /* !NDEBUG */ + add x1, x29, #0x50 add x2, x29, #48 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x23, #9 -#ifndef NDEBUG - add x0, x29, #48 -#endif /* !NDEBUG */ - add x1, x29, #48 + # Loop: 10 times + mov x23, #10 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_pow22523_4: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x23, x23, #1 - bcs L_fe_pow22523_4 + bne L_fe_pow22523_4 + # Store + stp x6, x7, [x29, #48] + stp x8, x9, [x29, #64] add x0, x29, #16 -#ifndef NDEBUG add x1, x29, #48 -#endif /* !NDEBUG */ add x2, x29, #16 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #48 - add x1, x29, #16 -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x23, #48 -#ifndef NDEBUG - add x0, x29, #48 -#endif /* !NDEBUG */ - add x1, x29, #48 + # Loop: 50 times + mov x23, #50 + ldp x6, x7, [x29, #16] + ldp x8, x9, [x29, #32] L_fe_pow22523_5: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x23, x23, #1 - bcs L_fe_pow22523_5 -#ifndef NDEBUG + bne L_fe_pow22523_5 + # Store + stp x6, x7, [x29, #48] + stp x8, x9, [x29, #64] add x0, x29, #48 -#endif /* !NDEBUG */ #ifndef NDEBUG add x1, x29, #48 #endif /* !NDEBUG */ @@ -3165,74 +4397,218 @@ #else bl _fe_mul #endif /* __APPLE__ */ - add x0, x29, #0x50 -#ifndef NDEBUG - add x1, x29, #48 -#endif /* !NDEBUG */ -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ - mov x23, #0x62 -#ifndef NDEBUG - add x0, x29, #0x50 -#endif /* !NDEBUG */ - add x1, x29, #0x50 + # Loop: 100 times + mov x23, #0x64 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_pow22523_6: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x23, x23, #1 - bcs L_fe_pow22523_6 - add x0, x29, #48 + bne L_fe_pow22523_6 + # Store + stp x6, x7, [x29, #80] + stp x8, x9, [x29, #96] #ifndef NDEBUG - add x1, x29, #0x50 + add x0, x29, #48 #endif /* !NDEBUG */ + add x1, x29, #0x50 add x2, x29, #48 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x23, #49 -#ifndef NDEBUG - add x0, x29, #48 -#endif /* !NDEBUG */ - add x1, x29, #48 + # Loop: 50 times + mov x23, #50 + ldp x6, x7, [x29, #48] + ldp x8, x9, [x29, #64] L_fe_pow22523_7: -#ifndef __APPLE__ - bl fe_sq -#else - bl _fe_sq -#endif /* __APPLE__ */ + # Square + # A[0] * A[1] + umulh x12, x6, x7 + mul x11, x6, x7 + # A[0] * A[3] + umulh x14, x6, x9 + mul x13, x6, x9 + # A[0] * A[2] + mul x3, x6, x8 + adds x12, x12, x3 + umulh x4, x6, x8 + adcs x13, x13, x4 + # A[1] * A[3] + mul x3, x7, x9 + adcs x14, x14, x3 + umulh x15, x7, x9 + adc x15, x15, xzr + # A[1] * A[2] + mul x3, x7, x8 + adds x13, x13, x3 + umulh x4, x7, x8 + adcs x14, x14, x4 + # A[2] * A[3] + mul x3, x8, x9 + adcs x15, x15, x3 + umulh x16, x8, x9 + adc x16, x16, xzr + # Double + adds x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adcs x15, x15, x15 + adcs x16, x16, x16 + adc x17, xzr, xzr + # A[0] * A[0] + umulh x4, x6, x6 + mul x10, x6, x6 + # A[1] * A[1] + mul x3, x7, x7 + adds x11, x11, x4 + umulh x4, x7, x7 + adcs x12, x12, x3 + # A[2] * A[2] + mul x3, x8, x8 + adcs x13, x13, x4 + umulh x4, x8, x8 + adcs x14, x14, x3 + # A[3] * A[3] + mul x3, x9, x9 + adcs x15, x15, x4 + umulh x4, x9, x9 + adcs x16, x16, x3 + adc x17, x17, x4 + # Reduce + mov x3, #38 + mul x4, x3, x17 + adds x13, x13, x4 + umulh x5, x3, x17 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x13, #63 + mul x5, x5, x3 + and x13, x13, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x14 + adds x10, x10, x4 + umulh x14, x3, x14 + mul x4, x3, x15 + adcs x11, x11, x4 + umulh x15, x3, x15 + mul x4, x3, x16 + adcs x12, x12, x4 + umulh x16, x3, x16 + adc x13, x13, xzr + # Add high product results in + adds x6, x10, x5 + adcs x7, x11, x14 + adcs x8, x12, x15 + adc x9, x13, x16 subs x23, x23, #1 - bcs L_fe_pow22523_7 + bne L_fe_pow22523_7 + # Store + stp x6, x7, [x29, #48] + stp x8, x9, [x29, #64] add x0, x29, #16 -#ifndef NDEBUG add x1, x29, #48 -#endif /* !NDEBUG */ add x2, x29, #16 #ifndef __APPLE__ bl fe_mul #else bl _fe_mul #endif /* __APPLE__ */ - mov x23, #1 #ifndef NDEBUG add x0, x29, #16 #endif /* !NDEBUG */ add x1, x29, #16 -L_fe_pow22523_8: #ifndef __APPLE__ bl fe_sq #else bl _fe_sq #endif /* __APPLE__ */ - subs x23, x23, #1 - bcs L_fe_pow22523_8 +#ifndef __APPLE__ + bl fe_sq +#else + bl _fe_sq +#endif /* __APPLE__ */ ldr x0, [x29, #112] #ifndef NDEBUG add x1, x29, #16 @@ -3243,6 +4619,7 @@ #else bl _fe_mul #endif /* __APPLE__ */ + ldr x17, [x29, #128] ldr x23, [x29, #136] ldp x29, x30, [sp], #0x90 ret @@ -3251,1510 +4628,1278 @@ #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_to_p2 -.type fe_ge_to_p2,@function +.globl ge_p1p1_to_p2 +.type ge_p1p1_to_p2,@function .align 2 -fe_ge_to_p2: +ge_p1p1_to_p2: #else .section __TEXT,__text -.globl _fe_ge_to_p2 +.globl _ge_p1p1_to_p2 .p2align 2 -_fe_ge_to_p2: +_ge_p1p1_to_p2: #endif /* __APPLE__ */ - stp x29, x30, [sp, #-112]! + stp x29, x30, [sp, #-80]! add x29, sp, #0 - str x17, [x29, #72] - str x19, [x29, #80] - stp x20, x21, [x29, #88] - str x22, [x29, #104] - str x1, [x29, #16] - str x2, [x29, #24] - str x3, [x29, #32] - str x4, [x29, #40] - str x5, [x29, #48] - str x6, [x29, #56] - ldr x1, [x29, #32] - ldr x2, [x29, #56] + str x17, [x29, #40] + str x19, [x29, #48] + stp x20, x21, [x29, #56] + str x22, [x29, #72] + str x0, [x29, #16] + str x1, [x29, #24] + mov x2, x1 + add x1, x1, #0x60 # Multiply - ldp x11, x12, [x1] - ldp x13, x14, [x1, #16] - ldp x15, x16, [x2] - ldp x17, x19, [x2, #16] - # A[0] * B[0] - mul x3, x11, x15 - umulh x4, x11, x15 - # A[0] * B[1] - mul x20, x11, x16 - umulh x5, x11, x16 - adds x4, x4, x20 - adc x5, x5, xzr - # A[1] * B[0] - mul x20, x12, x15 - umulh x21, x12, x15 - adds x4, x4, x20 - adcs x5, x5, x21 - adc x6, xzr, xzr - # A[0] * B[2] - mul x20, x11, x17 - umulh x21, x11, x17 - adds x5, x5, x20 - adc x6, x6, x21 - # A[1] * B[1] - mul x20, x12, x16 - umulh x21, x12, x16 - adds x5, x5, x20 - adcs x6, x6, x21 - adc x7, xzr, xzr - # A[2] * B[0] - mul x20, x13, x15 - umulh x21, x13, x15 - adds x5, x5, x20 - adcs x6, x6, x21 - adc x7, x7, xzr - # A[0] * B[3] - mul x20, x11, x19 - umulh x21, x11, x19 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, xzr, xzr - # A[1] * B[2] - mul x20, x12, x17 - umulh x21, x12, x17 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[2] * B[1] - mul x20, x13, x16 - umulh x21, x13, x16 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[3] * B[0] - mul x20, x14, x15 - umulh x21, x14, x15 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[1] * B[3] - mul x20, x12, x19 - umulh x21, x12, x19 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, xzr, xzr - # A[2] * B[2] - mul x20, x13, x17 - umulh x21, x13, x17 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, x9, xzr - # A[3] * B[1] - mul x20, x14, x16 - umulh x21, x14, x16 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, x9, xzr - # A[2] * B[3] - mul x20, x13, x19 - umulh x21, x13, x19 - adds x8, x8, x20 - adcs x9, x9, x21 - adc x10, xzr, xzr - # A[3] * B[2] - mul x20, x14, x17 - umulh x21, x14, x17 - adds x8, x8, x20 - adcs x9, x9, x21 - adc x10, x10, xzr - # A[3] * B[3] - mul x20, x14, x19 - umulh x21, x14, x19 - adds x9, x9, x20 - adc x10, x10, x21 - # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - extr x7, x7, x6, #63 - and x6, x6, #0x7fffffffffffffff - # Multiply top half by 19 - mov x20, #19 - mul x21, x20, x7 - umulh x7, x20, x7 - adds x3, x3, x21 - mul x21, x20, x8 - umulh x8, x20, x8 - adcs x4, x4, x21 - mul x21, x20, x9 - umulh x9, x20, x9 - adcs x5, x5, x21 - mul x21, x20, x10 - umulh x22, x20, x10 - adcs x6, x6, x21 + ldp x10, x11, [x1] + ldp x12, x13, [x1, #16] + ldp x6, x7, [x2] + ldp x8, x9, [x2, #16] + # A[0] * B[0] + umulh x15, x10, x6 + mul x14, x10, x6 + # A[2] * B[0] + umulh x17, x12, x6 + mul x16, x12, x6 + # A[1] * B[0] + mul x3, x11, x6 + adds x15, x15, x3 + umulh x4, x11, x6 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x11, x9 + adc x17, x17, xzr + mul x19, x11, x9 + # A[0] * B[1] + mul x3, x10, x7 + adds x15, x15, x3 + umulh x4, x10, x7 + adcs x16, x16, x4 + # A[2] * B[1] + mul x3, x12, x7 + adcs x17, x17, x3 + umulh x4, x12, x7 + adcs x19, x19, x4 + adc x20, x20, xzr + # A[1] * B[2] + mul x3, x11, x8 + adds x17, x17, x3 + umulh x4, x11, x8 + adcs x19, x19, x4 + adcs x20, x20, xzr + adc x21, xzr, xzr + # A[0] * B[2] + mul x3, x10, x8 + adds x16, x16, x3 + umulh x4, x10, x8 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr + adc x21, x21, xzr + # A[1] * B[1] + mul x3, x11, x7 + adds x16, x16, x3 + umulh x4, x11, x7 + adcs x17, x17, x4 + # A[3] * B[1] + mul x3, x13, x7 + adcs x19, x19, x3 + umulh x4, x13, x7 + adcs x20, x20, x4 + adc x21, x21, xzr + # A[2] * B[2] + mul x3, x12, x8 + adds x19, x19, x3 + umulh x4, x12, x8 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x13, x9 + adcs x21, x21, x3 + umulh x22, x13, x9 adc x22, x22, xzr - # Add remaining product results in - adds x4, x4, x7 - adcs x5, x5, x8 - adcs x6, x6, x9 + # A[0] * B[3] + mul x3, x10, x9 + adds x17, x17, x3 + umulh x4, x10, x9 + adcs x19, x19, x4 + # A[2] * B[3] + mul x3, x12, x9 + adcs x20, x20, x3 + umulh x4, x12, x9 + adcs x21, x21, x4 adc x22, x22, xzr - # Overflow - extr x22, x22, x6, #63 - mul x22, x22, x20 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x22 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr - # Reduce if top bit set - and x22, x20, x6, asr 63 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x22 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr + # A[3] * B[0] + mul x3, x13, x6 + adds x17, x17, x3 + umulh x4, x13, x6 + adcs x19, x19, x4 + # A[3] * B[2] + mul x3, x13, x8 + adcs x20, x20, x3 + umulh x4, x13, x8 + adcs x21, x21, x4 + adc x22, x22, xzr + # Reduce + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x19 + adds x14, x14, x4 + umulh x19, x3, x19 + mul x4, x3, x20 + adcs x15, x15, x4 + umulh x20, x3, x20 + mul x4, x3, x21 + adcs x16, x16, x4 + umulh x21, x3, x21 + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 # Store - stp x3, x4, [x0] - stp x5, x6, [x0, #16] - ldr x0, [x29, #16] - ldr x1, [x29, #40] - ldr x2, [x29, #48] + stp x14, x15, [x0] + stp x16, x17, [x0, #16] + sub x2, x1, #32 + add x0, x0, #0x40 # Multiply - ldp x11, x12, [x1] - ldp x13, x14, [x1, #16] - ldp x15, x16, [x2] - ldp x17, x19, [x2, #16] - # A[0] * B[0] - mul x3, x11, x15 - umulh x4, x11, x15 - # A[0] * B[1] - mul x20, x11, x16 - umulh x5, x11, x16 - adds x4, x4, x20 - adc x5, x5, xzr - # A[1] * B[0] - mul x20, x12, x15 - umulh x21, x12, x15 - adds x4, x4, x20 - adcs x5, x5, x21 - adc x6, xzr, xzr - # A[0] * B[2] - mul x20, x11, x17 - umulh x21, x11, x17 - adds x5, x5, x20 - adc x6, x6, x21 - # A[1] * B[1] - mul x20, x12, x16 - umulh x21, x12, x16 - adds x5, x5, x20 - adcs x6, x6, x21 - adc x7, xzr, xzr - # A[2] * B[0] - mul x20, x13, x15 - umulh x21, x13, x15 - adds x5, x5, x20 - adcs x6, x6, x21 - adc x7, x7, xzr - # A[0] * B[3] - mul x20, x11, x19 - umulh x21, x11, x19 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, xzr, xzr - # A[1] * B[2] - mul x20, x12, x17 - umulh x21, x12, x17 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[2] * B[1] - mul x20, x13, x16 - umulh x21, x13, x16 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[3] * B[0] - mul x20, x14, x15 - umulh x21, x14, x15 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[1] * B[3] - mul x20, x12, x19 - umulh x21, x12, x19 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, xzr, xzr - # A[2] * B[2] - mul x20, x13, x17 - umulh x21, x13, x17 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, x9, xzr - # A[3] * B[1] - mul x20, x14, x16 - umulh x21, x14, x16 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, x9, xzr - # A[2] * B[3] - mul x20, x13, x19 - umulh x21, x13, x19 - adds x8, x8, x20 - adcs x9, x9, x21 - adc x10, xzr, xzr - # A[3] * B[2] - mul x20, x14, x17 - umulh x21, x14, x17 - adds x8, x8, x20 - adcs x9, x9, x21 - adc x10, x10, xzr - # A[3] * B[3] - mul x20, x14, x19 - umulh x21, x14, x19 - adds x9, x9, x20 - adc x10, x10, x21 - # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - extr x7, x7, x6, #63 - and x6, x6, #0x7fffffffffffffff - # Multiply top half by 19 - mov x20, #19 - mul x21, x20, x7 - umulh x7, x20, x7 - adds x3, x3, x21 - mul x21, x20, x8 - umulh x8, x20, x8 - adcs x4, x4, x21 - mul x21, x20, x9 - umulh x9, x20, x9 - adcs x5, x5, x21 - mul x21, x20, x10 - umulh x22, x20, x10 - adcs x6, x6, x21 + ldp x6, x7, [x2] + ldp x8, x9, [x2, #16] + # A[0] * B[0] + umulh x15, x10, x6 + mul x14, x10, x6 + # A[2] * B[0] + umulh x17, x12, x6 + mul x16, x12, x6 + # A[1] * B[0] + mul x3, x11, x6 + adds x15, x15, x3 + umulh x4, x11, x6 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x11, x9 + adc x17, x17, xzr + mul x19, x11, x9 + # A[0] * B[1] + mul x3, x10, x7 + adds x15, x15, x3 + umulh x4, x10, x7 + adcs x16, x16, x4 + # A[2] * B[1] + mul x3, x12, x7 + adcs x17, x17, x3 + umulh x4, x12, x7 + adcs x19, x19, x4 + adc x20, x20, xzr + # A[1] * B[2] + mul x3, x11, x8 + adds x17, x17, x3 + umulh x4, x11, x8 + adcs x19, x19, x4 + adcs x20, x20, xzr + adc x21, xzr, xzr + # A[0] * B[2] + mul x3, x10, x8 + adds x16, x16, x3 + umulh x4, x10, x8 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr + adc x21, x21, xzr + # A[1] * B[1] + mul x3, x11, x7 + adds x16, x16, x3 + umulh x4, x11, x7 + adcs x17, x17, x4 + # A[3] * B[1] + mul x3, x13, x7 + adcs x19, x19, x3 + umulh x4, x13, x7 + adcs x20, x20, x4 + adc x21, x21, xzr + # A[2] * B[2] + mul x3, x12, x8 + adds x19, x19, x3 + umulh x4, x12, x8 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x13, x9 + adcs x21, x21, x3 + umulh x22, x13, x9 adc x22, x22, xzr - # Add remaining product results in - adds x4, x4, x7 - adcs x5, x5, x8 - adcs x6, x6, x9 + # A[0] * B[3] + mul x3, x10, x9 + adds x17, x17, x3 + umulh x4, x10, x9 + adcs x19, x19, x4 + # A[2] * B[3] + mul x3, x12, x9 + adcs x20, x20, x3 + umulh x4, x12, x9 + adcs x21, x21, x4 adc x22, x22, xzr - # Overflow - extr x22, x22, x6, #63 - mul x22, x22, x20 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x22 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr - # Reduce if top bit set - and x22, x20, x6, asr 63 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x22 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr + # A[3] * B[0] + mul x3, x13, x6 + adds x17, x17, x3 + umulh x4, x13, x6 + adcs x19, x19, x4 + # A[3] * B[2] + mul x3, x13, x8 + adcs x20, x20, x3 + umulh x4, x13, x8 + adcs x21, x21, x4 + adc x22, x22, xzr + # Reduce + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x19 + adds x14, x14, x4 + umulh x19, x3, x19 + mul x4, x3, x20 + adcs x15, x15, x4 + umulh x20, x3, x20 + mul x4, x3, x21 + adcs x16, x16, x4 + umulh x21, x3, x21 + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 # Store - stp x3, x4, [x0] - stp x5, x6, [x0, #16] - ldr x0, [x29, #24] - ldr x2, [x29, #56] + stp x14, x15, [x0] + stp x16, x17, [x0, #16] + sub x1, x1, #0x40 + sub x0, x0, #32 # Multiply - ldp x11, x12, [x2] - ldp x13, x14, [x2, #16] - # A[0] * B[0] - mul x3, x15, x11 - umulh x4, x15, x11 - # A[0] * B[1] - mul x20, x15, x12 - umulh x5, x15, x12 - adds x4, x4, x20 - adc x5, x5, xzr - # A[1] * B[0] - mul x20, x16, x11 - umulh x21, x16, x11 - adds x4, x4, x20 - adcs x5, x5, x21 - adc x6, xzr, xzr - # A[0] * B[2] - mul x20, x15, x13 - umulh x21, x15, x13 - adds x5, x5, x20 - adc x6, x6, x21 - # A[1] * B[1] - mul x20, x16, x12 - umulh x21, x16, x12 - adds x5, x5, x20 - adcs x6, x6, x21 - adc x7, xzr, xzr - # A[2] * B[0] - mul x20, x17, x11 - umulh x21, x17, x11 - adds x5, x5, x20 - adcs x6, x6, x21 - adc x7, x7, xzr - # A[0] * B[3] - mul x20, x15, x14 - umulh x21, x15, x14 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, xzr, xzr - # A[1] * B[2] - mul x20, x16, x13 - umulh x21, x16, x13 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[2] * B[1] - mul x20, x17, x12 - umulh x21, x17, x12 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[3] * B[0] - mul x20, x19, x11 - umulh x21, x19, x11 - adds x6, x6, x20 - adcs x7, x7, x21 - adc x8, x8, xzr - # A[1] * B[3] - mul x20, x16, x14 - umulh x21, x16, x14 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, xzr, xzr - # A[2] * B[2] - mul x20, x17, x13 - umulh x21, x17, x13 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, x9, xzr - # A[3] * B[1] - mul x20, x19, x12 - umulh x21, x19, x12 - adds x7, x7, x20 - adcs x8, x8, x21 - adc x9, x9, xzr - # A[2] * B[3] - mul x20, x17, x14 - umulh x21, x17, x14 - adds x8, x8, x20 - adcs x9, x9, x21 - adc x10, xzr, xzr - # A[3] * B[2] - mul x20, x19, x13 - umulh x21, x19, x13 - adds x8, x8, x20 - adcs x9, x9, x21 - adc x10, x10, xzr - # A[3] * B[3] - mul x20, x19, x14 - umulh x21, x19, x14 - adds x9, x9, x20 - adc x10, x10, x21 - # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - extr x7, x7, x6, #63 - and x6, x6, #0x7fffffffffffffff - # Multiply top half by 19 - mov x20, #19 - mul x21, x20, x7 - umulh x7, x20, x7 - adds x3, x3, x21 - mul x21, x20, x8 - umulh x8, x20, x8 - adcs x4, x4, x21 - mul x21, x20, x9 - umulh x9, x20, x9 - adcs x5, x5, x21 - mul x21, x20, x10 - umulh x22, x20, x10 - adcs x6, x6, x21 + ldp x10, x11, [x1] + ldp x12, x13, [x1, #16] + # A[0] * B[0] + umulh x15, x10, x6 + mul x14, x10, x6 + # A[2] * B[0] + umulh x17, x12, x6 + mul x16, x12, x6 + # A[1] * B[0] + mul x3, x11, x6 + adds x15, x15, x3 + umulh x4, x11, x6 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x11, x9 + adc x17, x17, xzr + mul x19, x11, x9 + # A[0] * B[1] + mul x3, x10, x7 + adds x15, x15, x3 + umulh x4, x10, x7 + adcs x16, x16, x4 + # A[2] * B[1] + mul x3, x12, x7 + adcs x17, x17, x3 + umulh x4, x12, x7 + adcs x19, x19, x4 + adc x20, x20, xzr + # A[1] * B[2] + mul x3, x11, x8 + adds x17, x17, x3 + umulh x4, x11, x8 + adcs x19, x19, x4 + adcs x20, x20, xzr + adc x21, xzr, xzr + # A[0] * B[2] + mul x3, x10, x8 + adds x16, x16, x3 + umulh x4, x10, x8 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr + adc x21, x21, xzr + # A[1] * B[1] + mul x3, x11, x7 + adds x16, x16, x3 + umulh x4, x11, x7 + adcs x17, x17, x4 + # A[3] * B[1] + mul x3, x13, x7 + adcs x19, x19, x3 + umulh x4, x13, x7 + adcs x20, x20, x4 + adc x21, x21, xzr + # A[2] * B[2] + mul x3, x12, x8 + adds x19, x19, x3 + umulh x4, x12, x8 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x13, x9 + adcs x21, x21, x3 + umulh x22, x13, x9 adc x22, x22, xzr - # Add remaining product results in - adds x4, x4, x7 - adcs x5, x5, x8 - adcs x6, x6, x9 + # A[0] * B[3] + mul x3, x10, x9 + adds x17, x17, x3 + umulh x4, x10, x9 + adcs x19, x19, x4 + # A[2] * B[3] + mul x3, x12, x9 + adcs x20, x20, x3 + umulh x4, x12, x9 + adcs x21, x21, x4 adc x22, x22, xzr - # Overflow - extr x22, x22, x6, #63 - mul x22, x22, x20 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x22 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr - # Reduce if top bit set - and x22, x20, x6, asr 63 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x22 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr + # A[3] * B[0] + mul x3, x13, x6 + adds x17, x17, x3 + umulh x4, x13, x6 + adcs x19, x19, x4 + # A[3] * B[2] + mul x3, x13, x8 + adcs x20, x20, x3 + umulh x4, x13, x8 + adcs x21, x21, x4 + adc x22, x22, xzr + # Reduce + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x19 + adds x14, x14, x4 + umulh x19, x3, x19 + mul x4, x3, x20 + adcs x15, x15, x4 + umulh x20, x3, x20 + mul x4, x3, x21 + adcs x16, x16, x4 + umulh x21, x3, x21 + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 # Store - stp x3, x4, [x0] - stp x5, x6, [x0, #16] - ldr x17, [x29, #72] - ldr x19, [x29, #80] - ldp x20, x21, [x29, #88] - ldr x22, [x29, #104] - ldp x29, x30, [sp], #0x70 + stp x14, x15, [x0] + stp x16, x17, [x0, #16] + ldr x17, [x29, #40] + ldr x19, [x29, #48] + ldp x20, x21, [x29, #56] + ldr x22, [x29, #72] + ldp x29, x30, [sp], #0x50 ret #ifndef __APPLE__ - .size fe_ge_to_p2,.-fe_ge_to_p2 + .size ge_p1p1_to_p2,.-ge_p1p1_to_p2 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_to_p3 -.type fe_ge_to_p3,@function +.globl ge_p1p1_to_p3 +.type ge_p1p1_to_p3,@function .align 2 -fe_ge_to_p3: +ge_p1p1_to_p3: #else .section __TEXT,__text -.globl _fe_ge_to_p3 +.globl _ge_p1p1_to_p3 .p2align 2 -_fe_ge_to_p3: +_ge_p1p1_to_p3: #endif /* __APPLE__ */ - stp x29, x30, [sp, #-160]! + stp x29, x30, [sp, #-112]! add x29, sp, #0 - str x17, [x29, #88] - str x19, [x29, #96] - stp x20, x21, [x29, #104] - stp x22, x23, [x29, #120] - stp x24, x25, [x29, #136] - str x26, [x29, #152] - str x1, [x29, #16] - str x2, [x29, #24] - str x3, [x29, #32] - str x4, [x29, #40] - str x5, [x29, #48] - str x6, [x29, #56] - str x7, [x29, #64] - ldr x1, [x29, #40] - ldr x2, [x29, #64] + str x17, [x29, #40] + str x19, [x29, #48] + stp x20, x21, [x29, #56] + stp x22, x23, [x29, #72] + stp x24, x25, [x29, #88] + str x26, [x29, #104] + str x0, [x29, #16] + str x1, [x29, #24] + mov x2, x1 + add x1, x1, #0x60 # Multiply - ldp x11, x12, [x1] - ldp x13, x14, [x1, #16] - ldp x15, x16, [x2] - ldp x17, x19, [x2, #16] - # A[0] * B[0] - mul x3, x11, x15 - umulh x4, x11, x15 - # A[0] * B[1] - mul x24, x11, x16 - umulh x5, x11, x16 - adds x4, x4, x24 - adc x5, x5, xzr - # A[1] * B[0] - mul x24, x12, x15 - umulh x25, x12, x15 - adds x4, x4, x24 - adcs x5, x5, x25 - adc x6, xzr, xzr - # A[0] * B[2] - mul x24, x11, x17 - umulh x25, x11, x17 - adds x5, x5, x24 - adc x6, x6, x25 - # A[1] * B[1] - mul x24, x12, x16 - umulh x25, x12, x16 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, xzr, xzr - # A[2] * B[0] - mul x24, x13, x15 - umulh x25, x13, x15 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, x7, xzr - # A[0] * B[3] - mul x24, x11, x19 - umulh x25, x11, x19 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, xzr, xzr - # A[1] * B[2] - mul x24, x12, x17 - umulh x25, x12, x17 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[2] * B[1] - mul x24, x13, x16 - umulh x25, x13, x16 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[3] * B[0] - mul x24, x14, x15 - umulh x25, x14, x15 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[1] * B[3] - mul x24, x12, x19 - umulh x25, x12, x19 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, xzr, xzr - # A[2] * B[2] - mul x24, x13, x17 - umulh x25, x13, x17 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[3] * B[1] - mul x24, x14, x16 - umulh x25, x14, x16 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[2] * B[3] - mul x24, x13, x19 - umulh x25, x13, x19 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, xzr, xzr - # A[3] * B[2] - mul x24, x14, x17 - umulh x25, x14, x17 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, x10, xzr - # A[3] * B[3] - mul x24, x14, x19 - umulh x25, x14, x19 - adds x9, x9, x24 - adc x10, x10, x25 - # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - extr x7, x7, x6, #63 - and x6, x6, #0x7fffffffffffffff - # Multiply top half by 19 - mov x24, #19 - mul x25, x24, x7 - umulh x7, x24, x7 - adds x3, x3, x25 - mul x25, x24, x8 - umulh x8, x24, x8 - adcs x4, x4, x25 - mul x25, x24, x9 - umulh x9, x24, x9 - adcs x5, x5, x25 - mul x25, x24, x10 - umulh x26, x24, x10 - adcs x6, x6, x25 - adc x26, x26, xzr - # Add remaining product results in - adds x4, x4, x7 - adcs x5, x5, x8 - adcs x6, x6, x9 - adc x26, x26, xzr - # Overflow - extr x26, x26, x6, #63 - mul x26, x26, x24 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr - # Reduce if top bit set - and x26, x24, x6, asr 63 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr + ldp x10, x11, [x1] + ldp x12, x13, [x1, #16] + ldp x6, x7, [x2] + ldp x8, x9, [x2, #16] + # A[0] * B[0] + umulh x15, x10, x6 + mul x14, x10, x6 + # A[2] * B[0] + umulh x17, x12, x6 + mul x16, x12, x6 + # A[1] * B[0] + mul x3, x11, x6 + adds x15, x15, x3 + umulh x4, x11, x6 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x11, x9 + adc x17, x17, xzr + mul x19, x11, x9 + # A[0] * B[1] + mul x3, x10, x7 + adds x15, x15, x3 + umulh x4, x10, x7 + adcs x16, x16, x4 + # A[2] * B[1] + mul x3, x12, x7 + adcs x17, x17, x3 + umulh x4, x12, x7 + adcs x19, x19, x4 + adc x20, x20, xzr + # A[1] * B[2] + mul x3, x11, x8 + adds x17, x17, x3 + umulh x4, x11, x8 + adcs x19, x19, x4 + adcs x20, x20, xzr + adc x21, xzr, xzr + # A[0] * B[2] + mul x3, x10, x8 + adds x16, x16, x3 + umulh x4, x10, x8 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr + adc x21, x21, xzr + # A[1] * B[1] + mul x3, x11, x7 + adds x16, x16, x3 + umulh x4, x11, x7 + adcs x17, x17, x4 + # A[3] * B[1] + mul x3, x13, x7 + adcs x19, x19, x3 + umulh x4, x13, x7 + adcs x20, x20, x4 + adc x21, x21, xzr + # A[2] * B[2] + mul x3, x12, x8 + adds x19, x19, x3 + umulh x4, x12, x8 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x13, x9 + adcs x21, x21, x3 + umulh x22, x13, x9 + adc x22, x22, xzr + # A[0] * B[3] + mul x3, x10, x9 + adds x17, x17, x3 + umulh x4, x10, x9 + adcs x19, x19, x4 + # A[2] * B[3] + mul x3, x12, x9 + adcs x20, x20, x3 + umulh x4, x12, x9 + adcs x21, x21, x4 + adc x22, x22, xzr + # A[3] * B[0] + mul x3, x13, x6 + adds x17, x17, x3 + umulh x4, x13, x6 + adcs x19, x19, x4 + # A[3] * B[2] + mul x3, x13, x8 + adcs x20, x20, x3 + umulh x4, x13, x8 + adcs x21, x21, x4 + adc x22, x22, xzr + # Reduce + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x19 + adds x14, x14, x4 + umulh x19, x3, x19 + mul x4, x3, x20 + adcs x15, x15, x4 + umulh x20, x3, x20 + mul x4, x3, x21 + adcs x16, x16, x4 + umulh x21, x3, x21 + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 # Store - stp x3, x4, [x0] - stp x5, x6, [x0, #16] - ldr x0, [x29, #32] - ldr x2, [x29, #48] + stp x14, x15, [x0] + stp x16, x17, [x0, #16] + sub x1, x1, #0x40 + add x0, x0, #0x60 # Multiply - ldp x20, x21, [x2] - ldp x22, x23, [x2, #16] - # A[0] * B[0] - mul x3, x11, x20 - umulh x4, x11, x20 - # A[0] * B[1] - mul x24, x11, x21 - umulh x5, x11, x21 - adds x4, x4, x24 - adc x5, x5, xzr - # A[1] * B[0] - mul x24, x12, x20 - umulh x25, x12, x20 - adds x4, x4, x24 - adcs x5, x5, x25 - adc x6, xzr, xzr - # A[0] * B[2] - mul x24, x11, x22 - umulh x25, x11, x22 - adds x5, x5, x24 - adc x6, x6, x25 - # A[1] * B[1] - mul x24, x12, x21 - umulh x25, x12, x21 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, xzr, xzr - # A[2] * B[0] - mul x24, x13, x20 - umulh x25, x13, x20 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, x7, xzr - # A[0] * B[3] - mul x24, x11, x23 - umulh x25, x11, x23 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, xzr, xzr - # A[1] * B[2] - mul x24, x12, x22 - umulh x25, x12, x22 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[2] * B[1] - mul x24, x13, x21 - umulh x25, x13, x21 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[3] * B[0] - mul x24, x14, x20 - umulh x25, x14, x20 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[1] * B[3] - mul x24, x12, x23 - umulh x25, x12, x23 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, xzr, xzr - # A[2] * B[2] - mul x24, x13, x22 - umulh x25, x13, x22 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[3] * B[1] - mul x24, x14, x21 - umulh x25, x14, x21 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[2] * B[3] - mul x24, x13, x23 - umulh x25, x13, x23 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, xzr, xzr - # A[3] * B[2] - mul x24, x14, x22 - umulh x25, x14, x22 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, x10, xzr - # A[3] * B[3] - mul x24, x14, x23 - umulh x25, x14, x23 - adds x9, x9, x24 - adc x10, x10, x25 - # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - extr x7, x7, x6, #63 - and x6, x6, #0x7fffffffffffffff - # Multiply top half by 19 - mov x24, #19 - mul x25, x24, x7 - umulh x7, x24, x7 - adds x3, x3, x25 - mul x25, x24, x8 - umulh x8, x24, x8 - adcs x4, x4, x25 - mul x25, x24, x9 - umulh x9, x24, x9 - adcs x5, x5, x25 - mul x25, x24, x10 - umulh x26, x24, x10 - adcs x6, x6, x25 - adc x26, x26, xzr - # Add remaining product results in - adds x4, x4, x7 - adcs x5, x5, x8 - adcs x6, x6, x9 - adc x26, x26, xzr - # Overflow - extr x26, x26, x6, #63 - mul x26, x26, x24 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr - # Reduce if top bit set - and x26, x24, x6, asr 63 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr + ldp x23, x24, [x1] + ldp x25, x26, [x1, #16] + # A[0] * B[0] + umulh x15, x23, x6 + mul x14, x23, x6 + # A[2] * B[0] + umulh x17, x25, x6 + mul x16, x25, x6 + # A[1] * B[0] + mul x3, x24, x6 + adds x15, x15, x3 + umulh x4, x24, x6 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x24, x9 + adc x17, x17, xzr + mul x19, x24, x9 + # A[0] * B[1] + mul x3, x23, x7 + adds x15, x15, x3 + umulh x4, x23, x7 + adcs x16, x16, x4 + # A[2] * B[1] + mul x3, x25, x7 + adcs x17, x17, x3 + umulh x4, x25, x7 + adcs x19, x19, x4 + adc x20, x20, xzr + # A[1] * B[2] + mul x3, x24, x8 + adds x17, x17, x3 + umulh x4, x24, x8 + adcs x19, x19, x4 + adcs x20, x20, xzr + adc x21, xzr, xzr + # A[0] * B[2] + mul x3, x23, x8 + adds x16, x16, x3 + umulh x4, x23, x8 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr + adc x21, x21, xzr + # A[1] * B[1] + mul x3, x24, x7 + adds x16, x16, x3 + umulh x4, x24, x7 + adcs x17, x17, x4 + # A[3] * B[1] + mul x3, x26, x7 + adcs x19, x19, x3 + umulh x4, x26, x7 + adcs x20, x20, x4 + adc x21, x21, xzr + # A[2] * B[2] + mul x3, x25, x8 + adds x19, x19, x3 + umulh x4, x25, x8 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x26, x9 + adcs x21, x21, x3 + umulh x22, x26, x9 + adc x22, x22, xzr + # A[0] * B[3] + mul x3, x23, x9 + adds x17, x17, x3 + umulh x4, x23, x9 + adcs x19, x19, x4 + # A[2] * B[3] + mul x3, x25, x9 + adcs x20, x20, x3 + umulh x4, x25, x9 + adcs x21, x21, x4 + adc x22, x22, xzr + # A[3] * B[0] + mul x3, x26, x6 + adds x17, x17, x3 + umulh x4, x26, x6 + adcs x19, x19, x4 + # A[3] * B[2] + mul x3, x26, x8 + adcs x20, x20, x3 + umulh x4, x26, x8 + adcs x21, x21, x4 + adc x22, x22, xzr + # Reduce + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x19 + adds x14, x14, x4 + umulh x19, x3, x19 + mul x4, x3, x20 + adcs x15, x15, x4 + umulh x20, x3, x20 + mul x4, x3, x21 + adcs x16, x16, x4 + umulh x21, x3, x21 + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 # Store - stp x3, x4, [x0] - stp x5, x6, [x0, #16] - ldr x0, [x29, #16] - ldr x2, [x29, #56] + stp x14, x15, [x0] + stp x16, x17, [x0, #16] + add x2, x1, #32 + sub x0, x0, #0x40 # Multiply - ldp x11, x12, [x2] - ldp x13, x14, [x2, #16] - # A[0] * B[0] - mul x3, x20, x11 - umulh x4, x20, x11 - # A[0] * B[1] - mul x24, x20, x12 - umulh x5, x20, x12 - adds x4, x4, x24 - adc x5, x5, xzr - # A[1] * B[0] - mul x24, x21, x11 - umulh x25, x21, x11 - adds x4, x4, x24 - adcs x5, x5, x25 - adc x6, xzr, xzr - # A[0] * B[2] - mul x24, x20, x13 - umulh x25, x20, x13 - adds x5, x5, x24 - adc x6, x6, x25 - # A[1] * B[1] - mul x24, x21, x12 - umulh x25, x21, x12 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, xzr, xzr - # A[2] * B[0] - mul x24, x22, x11 - umulh x25, x22, x11 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, x7, xzr - # A[0] * B[3] - mul x24, x20, x14 - umulh x25, x20, x14 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, xzr, xzr - # A[1] * B[2] - mul x24, x21, x13 - umulh x25, x21, x13 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[2] * B[1] - mul x24, x22, x12 - umulh x25, x22, x12 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[3] * B[0] - mul x24, x23, x11 - umulh x25, x23, x11 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[1] * B[3] - mul x24, x21, x14 - umulh x25, x21, x14 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, xzr, xzr - # A[2] * B[2] - mul x24, x22, x13 - umulh x25, x22, x13 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[3] * B[1] - mul x24, x23, x12 - umulh x25, x23, x12 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[2] * B[3] - mul x24, x22, x14 - umulh x25, x22, x14 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, xzr, xzr - # A[3] * B[2] - mul x24, x23, x13 - umulh x25, x23, x13 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, x10, xzr - # A[3] * B[3] - mul x24, x23, x14 - umulh x25, x23, x14 - adds x9, x9, x24 - adc x10, x10, x25 - # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - extr x7, x7, x6, #63 - and x6, x6, #0x7fffffffffffffff - # Multiply top half by 19 - mov x24, #19 - mul x25, x24, x7 - umulh x7, x24, x7 - adds x3, x3, x25 - mul x25, x24, x8 - umulh x8, x24, x8 - adcs x4, x4, x25 - mul x25, x24, x9 - umulh x9, x24, x9 - adcs x5, x5, x25 - mul x25, x24, x10 - umulh x26, x24, x10 - adcs x6, x6, x25 - adc x26, x26, xzr - # Add remaining product results in - adds x4, x4, x7 - adcs x5, x5, x8 - adcs x6, x6, x9 - adc x26, x26, xzr - # Overflow - extr x26, x26, x6, #63 - mul x26, x26, x24 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr - # Reduce if top bit set - and x26, x24, x6, asr 63 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr + ldp x6, x7, [x2] + ldp x8, x9, [x2, #16] + # A[0] * B[0] + umulh x15, x23, x6 + mul x14, x23, x6 + # A[2] * B[0] + umulh x17, x25, x6 + mul x16, x25, x6 + # A[1] * B[0] + mul x3, x24, x6 + adds x15, x15, x3 + umulh x4, x24, x6 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x24, x9 + adc x17, x17, xzr + mul x19, x24, x9 + # A[0] * B[1] + mul x3, x23, x7 + adds x15, x15, x3 + umulh x4, x23, x7 + adcs x16, x16, x4 + # A[2] * B[1] + mul x3, x25, x7 + adcs x17, x17, x3 + umulh x4, x25, x7 + adcs x19, x19, x4 + adc x20, x20, xzr + # A[1] * B[2] + mul x3, x24, x8 + adds x17, x17, x3 + umulh x4, x24, x8 + adcs x19, x19, x4 + adcs x20, x20, xzr + adc x21, xzr, xzr + # A[0] * B[2] + mul x3, x23, x8 + adds x16, x16, x3 + umulh x4, x23, x8 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr + adc x21, x21, xzr + # A[1] * B[1] + mul x3, x24, x7 + adds x16, x16, x3 + umulh x4, x24, x7 + adcs x17, x17, x4 + # A[3] * B[1] + mul x3, x26, x7 + adcs x19, x19, x3 + umulh x4, x26, x7 + adcs x20, x20, x4 + adc x21, x21, xzr + # A[2] * B[2] + mul x3, x25, x8 + adds x19, x19, x3 + umulh x4, x25, x8 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x26, x9 + adcs x21, x21, x3 + umulh x22, x26, x9 + adc x22, x22, xzr + # A[0] * B[3] + mul x3, x23, x9 + adds x17, x17, x3 + umulh x4, x23, x9 + adcs x19, x19, x4 + # A[2] * B[3] + mul x3, x25, x9 + adcs x20, x20, x3 + umulh x4, x25, x9 + adcs x21, x21, x4 + adc x22, x22, xzr + # A[3] * B[0] + mul x3, x26, x6 + adds x17, x17, x3 + umulh x4, x26, x6 + adcs x19, x19, x4 + # A[3] * B[2] + mul x3, x26, x8 + adcs x20, x20, x3 + umulh x4, x26, x8 + adcs x21, x21, x4 + adc x22, x22, xzr + # Reduce + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x19 + adds x14, x14, x4 + umulh x19, x3, x19 + mul x4, x3, x20 + adcs x15, x15, x4 + umulh x20, x3, x20 + mul x4, x3, x21 + adcs x16, x16, x4 + umulh x21, x3, x21 + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 # Store - stp x3, x4, [x0] - stp x5, x6, [x0, #16] - ldr x0, [x29, #24] + stp x14, x15, [x0] + stp x16, x17, [x0, #16] + add x1, x1, #0x40 + add x0, x0, #32 # Multiply - # A[0] * B[0] - mul x3, x11, x15 - umulh x4, x11, x15 - # A[0] * B[1] - mul x24, x11, x16 - umulh x5, x11, x16 - adds x4, x4, x24 - adc x5, x5, xzr - # A[1] * B[0] - mul x24, x12, x15 - umulh x25, x12, x15 - adds x4, x4, x24 - adcs x5, x5, x25 - adc x6, xzr, xzr - # A[0] * B[2] - mul x24, x11, x17 - umulh x25, x11, x17 - adds x5, x5, x24 - adc x6, x6, x25 - # A[1] * B[1] - mul x24, x12, x16 - umulh x25, x12, x16 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, xzr, xzr - # A[2] * B[0] - mul x24, x13, x15 - umulh x25, x13, x15 - adds x5, x5, x24 - adcs x6, x6, x25 - adc x7, x7, xzr - # A[0] * B[3] - mul x24, x11, x19 - umulh x25, x11, x19 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, xzr, xzr - # A[1] * B[2] - mul x24, x12, x17 - umulh x25, x12, x17 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[2] * B[1] - mul x24, x13, x16 - umulh x25, x13, x16 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[3] * B[0] - mul x24, x14, x15 - umulh x25, x14, x15 - adds x6, x6, x24 - adcs x7, x7, x25 - adc x8, x8, xzr - # A[1] * B[3] - mul x24, x12, x19 - umulh x25, x12, x19 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, xzr, xzr - # A[2] * B[2] - mul x24, x13, x17 - umulh x25, x13, x17 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[3] * B[1] - mul x24, x14, x16 - umulh x25, x14, x16 - adds x7, x7, x24 - adcs x8, x8, x25 - adc x9, x9, xzr - # A[2] * B[3] - mul x24, x13, x19 - umulh x25, x13, x19 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, xzr, xzr - # A[3] * B[2] - mul x24, x14, x17 - umulh x25, x14, x17 - adds x8, x8, x24 - adcs x9, x9, x25 - adc x10, x10, xzr - # A[3] * B[3] - mul x24, x14, x19 - umulh x25, x14, x19 - adds x9, x9, x24 - adc x10, x10, x25 - # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - extr x7, x7, x6, #63 - and x6, x6, #0x7fffffffffffffff - # Multiply top half by 19 - mov x24, #19 - mul x25, x24, x7 - umulh x7, x24, x7 - adds x3, x3, x25 - mul x25, x24, x8 - umulh x8, x24, x8 - adcs x4, x4, x25 - mul x25, x24, x9 - umulh x9, x24, x9 - adcs x5, x5, x25 - mul x25, x24, x10 - umulh x26, x24, x10 - adcs x6, x6, x25 - adc x26, x26, xzr - # Add remaining product results in - adds x4, x4, x7 - adcs x5, x5, x8 - adcs x6, x6, x9 - adc x26, x26, xzr - # Overflow - extr x26, x26, x6, #63 - mul x26, x26, x24 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr - # Reduce if top bit set - and x26, x24, x6, asr 63 - and x6, x6, #0x7fffffffffffffff - adds x3, x3, x26 - adcs x4, x4, xzr - adcs x5, x5, xzr - adc x6, x6, xzr + # A[0] * B[0] + umulh x15, x10, x6 + mul x14, x10, x6 + # A[2] * B[0] + umulh x17, x12, x6 + mul x16, x12, x6 + # A[1] * B[0] + mul x3, x11, x6 + adds x15, x15, x3 + umulh x4, x11, x6 + adcs x16, x16, x4 + # A[1] * B[3] + umulh x20, x11, x9 + adc x17, x17, xzr + mul x19, x11, x9 + # A[0] * B[1] + mul x3, x10, x7 + adds x15, x15, x3 + umulh x4, x10, x7 + adcs x16, x16, x4 + # A[2] * B[1] + mul x3, x12, x7 + adcs x17, x17, x3 + umulh x4, x12, x7 + adcs x19, x19, x4 + adc x20, x20, xzr + # A[1] * B[2] + mul x3, x11, x8 + adds x17, x17, x3 + umulh x4, x11, x8 + adcs x19, x19, x4 + adcs x20, x20, xzr + adc x21, xzr, xzr + # A[0] * B[2] + mul x3, x10, x8 + adds x16, x16, x3 + umulh x4, x10, x8 + adcs x17, x17, x4 + adcs x19, x19, xzr + adcs x20, x20, xzr + adc x21, x21, xzr + # A[1] * B[1] + mul x3, x11, x7 + adds x16, x16, x3 + umulh x4, x11, x7 + adcs x17, x17, x4 + # A[3] * B[1] + mul x3, x13, x7 + adcs x19, x19, x3 + umulh x4, x13, x7 + adcs x20, x20, x4 + adc x21, x21, xzr + # A[2] * B[2] + mul x3, x12, x8 + adds x19, x19, x3 + umulh x4, x12, x8 + adcs x20, x20, x4 + # A[3] * B[3] + mul x3, x13, x9 + adcs x21, x21, x3 + umulh x22, x13, x9 + adc x22, x22, xzr + # A[0] * B[3] + mul x3, x10, x9 + adds x17, x17, x3 + umulh x4, x10, x9 + adcs x19, x19, x4 + # A[2] * B[3] + mul x3, x12, x9 + adcs x20, x20, x3 + umulh x4, x12, x9 + adcs x21, x21, x4 + adc x22, x22, xzr + # A[3] * B[0] + mul x3, x13, x6 + adds x17, x17, x3 + umulh x4, x13, x6 + adcs x19, x19, x4 + # A[3] * B[2] + mul x3, x13, x8 + adcs x20, x20, x3 + umulh x4, x13, x8 + adcs x21, x21, x4 + adc x22, x22, xzr + # Reduce + mov x3, #38 + mul x4, x3, x22 + adds x17, x17, x4 + umulh x5, x3, x22 + adc x5, x5, xzr + mov x3, #19 + extr x5, x5, x17, #63 + mul x5, x5, x3 + and x17, x17, #0x7fffffffffffffff + mov x3, #38 + mul x4, x3, x19 + adds x14, x14, x4 + umulh x19, x3, x19 + mul x4, x3, x20 + adcs x15, x15, x4 + umulh x20, x3, x20 + mul x4, x3, x21 + adcs x16, x16, x4 + umulh x21, x3, x21 + adc x17, x17, xzr + # Add high product results in + adds x14, x14, x5 + adcs x15, x15, x19 + adcs x16, x16, x20 + adc x17, x17, x21 # Store - stp x3, x4, [x0] - stp x5, x6, [x0, #16] - ldr x17, [x29, #88] - ldr x19, [x29, #96] - ldp x20, x21, [x29, #104] - ldp x22, x23, [x29, #120] - ldp x24, x25, [x29, #136] - ldr x26, [x29, #152] - ldp x29, x30, [sp], #0xa0 + stp x14, x15, [x0] + stp x16, x17, [x0, #16] + ldr x17, [x29, #40] + ldr x19, [x29, #48] + ldp x20, x21, [x29, #56] + ldp x22, x23, [x29, #72] + ldp x24, x25, [x29, #88] + ldr x26, [x29, #104] + ldp x29, x30, [sp], #0x70 ret #ifndef __APPLE__ - .size fe_ge_to_p3,.-fe_ge_to_p3 + .size ge_p1p1_to_p3,.-ge_p1p1_to_p3 #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_dbl -.type fe_ge_dbl,@function +.globl ge_p2_dbl +.type ge_p2_dbl,@function .align 2 -fe_ge_dbl: +ge_p2_dbl: #else .section __TEXT,__text -.globl _fe_ge_dbl +.globl _ge_p2_dbl .p2align 2 -_fe_ge_dbl: +_ge_p2_dbl: #endif /* __APPLE__ */ - stp x29, x30, [sp, #-176]! + stp x29, x30, [sp, #-128]! add x29, sp, #0 - str x17, [x29, #88] - str x19, [x29, #96] - stp x20, x21, [x29, #104] - stp x22, x23, [x29, #120] - stp x24, x25, [x29, #136] - stp x26, x27, [x29, #152] - str x28, [x29, #168] + str x17, [x29, #40] + str x19, [x29, #48] + stp x20, x21, [x29, #56] + stp x22, x23, [x29, #72] + stp x24, x25, [x29, #88] + stp x26, x27, [x29, #104] + str x28, [x29, #120] str x0, [x29, #16] str x1, [x29, #24] - str x2, [x29, #32] - str x3, [x29, #40] - str x4, [x29, #48] - str x5, [x29, #56] - str x6, [x29, #64] - ldr x1, [x29, #48] + add x0, x0, #0x40 # Square - ldp x12, x13, [x1] - ldp x14, x15, [x1, #16] + ldp x4, x5, [x1] + ldp x6, x7, [x1, #16] # A[0] * A[1] - mul x5, x12, x13 - umulh x6, x12, x13 - # A[0] * A[2] - mul x25, x12, x14 - umulh x7, x12, x14 - adds x6, x6, x25 - adc x7, x7, xzr + umulh x10, x4, x5 + mul x9, x4, x5 # A[0] * A[3] - mul x25, x12, x15 - umulh x8, x12, x15 - adds x7, x7, x25 - adc x8, x8, xzr - # A[1] * A[2] - mul x25, x13, x14 - umulh x26, x13, x14 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, xzr, xzr + umulh x12, x4, x7 + mul x11, x4, x7 + # A[0] * A[2] + mul x25, x4, x6 + adds x10, x10, x25 + umulh x26, x4, x6 + adcs x11, x11, x26 # A[1] * A[3] - mul x25, x13, x15 - umulh x26, x13, x15 - adds x8, x8, x25 - adc x9, x9, x26 + mul x25, x5, x7 + adcs x12, x12, x25 + umulh x13, x5, x7 + adc x13, x13, xzr + # A[1] * A[2] + mul x25, x5, x6 + adds x11, x11, x25 + umulh x26, x5, x6 + adcs x12, x12, x26 # A[2] * A[3] - mul x25, x14, x15 - umulh x10, x14, x15 - adds x9, x9, x25 - adc x10, x10, xzr + mul x25, x6, x7 + adcs x13, x13, x25 + umulh x14, x6, x7 + adc x14, x14, xzr # Double - adds x5, x5, x5 - adcs x6, x6, x6 - adcs x7, x7, x7 - adcs x8, x8, x8 - adcs x9, x9, x9 + adds x9, x9, x9 adcs x10, x10, x10 - adc x11, xzr, xzr + adcs x11, x11, x11 + adcs x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adc x15, xzr, xzr # A[0] * A[0] - mul x4, x12, x12 - umulh x27, x12, x12 + umulh x26, x4, x4 + mul x8, x4, x4 # A[1] * A[1] - mul x25, x13, x13 - umulh x26, x13, x13 - adds x5, x5, x27 - adcs x6, x6, x25 - adc x27, x26, xzr + mul x25, x5, x5 + adds x9, x9, x26 + umulh x26, x5, x5 + adcs x10, x10, x25 # A[2] * A[2] - mul x25, x14, x14 - umulh x26, x14, x14 - adds x7, x7, x27 - adcs x8, x8, x25 - adc x27, x26, xzr + mul x25, x6, x6 + adcs x11, x11, x26 + umulh x26, x6, x6 + adcs x12, x12, x25 # A[3] * A[3] - mul x25, x15, x15 - umulh x26, x15, x15 - adds x9, x9, x27 - adcs x10, x10, x25 - adc x11, x11, x26 + mul x25, x7, x7 + adcs x13, x13, x26 + umulh x26, x7, x7 + adcs x14, x14, x25 + adc x15, x15, x26 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x11, x11, x10, #63 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x8 - umulh x8, x25, x8 - adds x4, x4, x26 - mul x26, x25, x9 - umulh x9, x25, x9 - adcs x5, x5, x26 - mul x26, x25, x10 - umulh x10, x25, x10 - adcs x6, x6, x26 - mul x26, x25, x11 - umulh x27, x25, x11 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x8 - adcs x6, x6, x9 - adcs x7, x7, x10 + mov x25, #38 + mul x26, x25, x15 + adds x11, x11, x26 + umulh x27, x25, x15 adc x27, x27, xzr - # Overflow - extr x27, x27, x7, #63 + mov x25, #19 + extr x27, x27, x11, #63 mul x27, x27, x25 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr + and x11, x11, #0x7fffffffffffffff + mov x25, #38 + mul x26, x25, x12 + adds x8, x8, x26 + umulh x12, x25, x12 + mul x26, x25, x13 + adcs x9, x9, x26 + umulh x13, x25, x13 + mul x26, x25, x14 + adcs x10, x10, x26 + umulh x14, x25, x14 + adc x11, x11, xzr + # Add high product results in + adds x8, x8, x27 + adcs x9, x9, x12 + adcs x10, x10, x13 + adc x11, x11, x14 # Store - stp x4, x5, [x0] - stp x6, x7, [x0, #16] - ldr x0, [x29, #32] - ldr x1, [x29, #56] + stp x8, x9, [x0] + stp x10, x11, [x0, #16] + add x2, x1, #32 + sub x0, x0, #32 # Square - ldp x21, x22, [x1] - ldp x23, x24, [x1, #16] + ldp x16, x17, [x2] + ldp x19, x20, [x2, #16] # A[0] * A[1] - mul x9, x21, x22 - umulh x10, x21, x22 - # A[0] * A[2] - mul x25, x21, x23 - umulh x11, x21, x23 - adds x10, x10, x25 - adc x11, x11, xzr + umulh x23, x16, x17 + mul x22, x16, x17 # A[0] * A[3] - mul x25, x21, x24 - umulh x16, x21, x24 - adds x11, x11, x25 - adc x16, x16, xzr - # A[1] * A[2] - mul x25, x22, x23 - umulh x26, x22, x23 - adds x11, x11, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr + umulh x4, x16, x20 + mul x24, x16, x20 + # A[0] * A[2] + mul x25, x16, x19 + adds x23, x23, x25 + umulh x26, x16, x19 + adcs x24, x24, x26 # A[1] * A[3] - mul x25, x22, x24 - umulh x26, x22, x24 - adds x16, x16, x25 - adc x17, x17, x26 + mul x25, x17, x20 + adcs x4, x4, x25 + umulh x5, x17, x20 + adc x5, x5, xzr + # A[1] * A[2] + mul x25, x17, x19 + adds x24, x24, x25 + umulh x26, x17, x19 + adcs x4, x4, x26 # A[2] * A[3] - mul x25, x23, x24 - umulh x19, x23, x24 - adds x17, x17, x25 - adc x19, x19, xzr + mul x25, x19, x20 + adcs x5, x5, x25 + umulh x6, x19, x20 + adc x6, x6, xzr # Double - adds x9, x9, x9 - adcs x10, x10, x10 - adcs x11, x11, x11 - adcs x16, x16, x16 - adcs x17, x17, x17 - adcs x19, x19, x19 - adc x20, xzr, xzr + adds x22, x22, x22 + adcs x23, x23, x23 + adcs x24, x24, x24 + adcs x4, x4, x4 + adcs x5, x5, x5 + adcs x6, x6, x6 + adc x7, xzr, xzr # A[0] * A[0] - mul x8, x21, x21 - umulh x27, x21, x21 + umulh x26, x16, x16 + mul x21, x16, x16 # A[1] * A[1] - mul x25, x22, x22 - umulh x26, x22, x22 - adds x9, x9, x27 - adcs x10, x10, x25 - adc x27, x26, xzr + mul x25, x17, x17 + adds x22, x22, x26 + umulh x26, x17, x17 + adcs x23, x23, x25 # A[2] * A[2] - mul x25, x23, x23 - umulh x26, x23, x23 - adds x11, x11, x27 - adcs x16, x16, x25 - adc x27, x26, xzr + mul x25, x19, x19 + adcs x24, x24, x26 + umulh x26, x19, x19 + adcs x4, x4, x25 # A[3] * A[3] - mul x25, x24, x24 - umulh x26, x24, x24 - adds x17, x17, x27 - adcs x19, x19, x25 - adc x20, x20, x26 + mul x25, x20, x20 + adcs x5, x5, x26 + umulh x26, x20, x20 + adcs x6, x6, x25 + adc x7, x7, x26 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x11, #63 - and x11, x11, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x8, x8, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x9, x9, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x10, x10, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x11, x11, x26 + mov x25, #38 + mul x26, x25, x7 + adds x24, x24, x26 + umulh x27, x25, x7 adc x27, x27, xzr - # Add remaining product results in - adds x9, x9, x16 - adcs x10, x10, x17 - adcs x11, x11, x19 - adc x27, x27, xzr - # Overflow - extr x27, x27, x11, #63 + mov x25, #19 + extr x27, x27, x24, #63 mul x27, x27, x25 - and x11, x11, #0x7fffffffffffffff - adds x8, x8, x27 - adcs x9, x9, xzr - adcs x10, x10, xzr - adc x11, x11, xzr - # Reduce if top bit set - and x27, x25, x11, asr 63 - and x11, x11, #0x7fffffffffffffff - adds x8, x8, x27 - adcs x9, x9, xzr - adcs x10, x10, xzr - adc x11, x11, xzr - # Store - stp x8, x9, [x0] - stp x10, x11, [x0, #16] - ldr x0, [x29, #24] + and x24, x24, #0x7fffffffffffffff + mov x25, #38 + mul x26, x25, x4 + adds x21, x21, x26 + umulh x4, x25, x4 + mul x26, x25, x5 + adcs x22, x22, x26 + umulh x5, x25, x5 + mul x26, x25, x6 + adcs x23, x23, x26 + umulh x6, x25, x6 + adc x24, x24, xzr + # Add high product results in + adds x21, x21, x27 + adcs x22, x22, x4 + adcs x23, x23, x5 + adc x24, x24, x6 + add x3, x0, #32 + mov x2, x0 + add x1, x0, #32 # Add - adds x12, x12, x21 - adcs x13, x13, x22 - adcs x14, x14, x23 - adc x15, x15, x24 + adds x4, x21, x8 + adcs x5, x22, x9 + adcs x6, x23, x10 + adcs x7, x24, x11 + cset x28, cs + mov x25, #19 + extr x28, x28, x7, #63 + mul x25, x28, x25 + # Sub modulus (if overflow) + adds x4, x4, x25 + adcs x5, x5, xzr + and x7, x7, #0x7fffffffffffffff + adcs x6, x6, xzr + adc x7, x7, xzr + # Sub + subs x12, x21, x8 + sbcs x13, x22, x9 + sbcs x14, x23, x10 + sbcs x15, x24, x11 + csetm x28, cc mov x25, #-19 - asr x28, x15, #63 + extr x28, x28, x15, #63 + mul x25, x28, x25 + # Add modulus (if underflow) + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr + stp x4, x5, [x0] + stp x6, x7, [x0, #16] + stp x12, x13, [x1] + stp x14, x15, [x1, #16] + ldr x1, [x29, #24] + add x2, x1, #32 + sub x0, x0, #32 + # Add + ldp x8, x9, [x1] + ldp x10, x11, [x1, #16] + adds x8, x8, x16 + adcs x9, x9, x17 + adcs x10, x10, x19 + adcs x11, x11, x20 + cset x28, cs + mov x25, #19 # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + extr x28, x28, x11, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x12, x12, x25 - sbcs x13, x13, x28 - sbcs x14, x14, x28 - sbc x15, x15, x26 - ldr x0, [x29, #40] + adds x8, x8, x25 + adcs x9, x9, xzr + and x11, x11, #0x7fffffffffffffff + adcs x10, x10, xzr + adc x11, x11, xzr + mov x1, x0 # Square # A[0] * A[1] - mul x17, x12, x13 - umulh x19, x12, x13 - # A[0] * A[2] - mul x25, x12, x14 - umulh x20, x12, x14 - adds x19, x19, x25 - adc x20, x20, xzr + umulh x23, x8, x9 + mul x22, x8, x9 # A[0] * A[3] - mul x25, x12, x15 - umulh x21, x12, x15 - adds x20, x20, x25 - adc x21, x21, xzr - # A[1] * A[2] - mul x25, x13, x14 - umulh x26, x13, x14 - adds x20, x20, x25 - adcs x21, x21, x26 - adc x22, xzr, xzr + umulh x4, x8, x11 + mul x24, x8, x11 + # A[0] * A[2] + mul x25, x8, x10 + adds x23, x23, x25 + umulh x26, x8, x10 + adcs x24, x24, x26 # A[1] * A[3] - mul x25, x13, x15 - umulh x26, x13, x15 - adds x21, x21, x25 - adc x22, x22, x26 + mul x25, x9, x11 + adcs x4, x4, x25 + umulh x5, x9, x11 + adc x5, x5, xzr + # A[1] * A[2] + mul x25, x9, x10 + adds x24, x24, x25 + umulh x26, x9, x10 + adcs x4, x4, x26 # A[2] * A[3] - mul x25, x14, x15 - umulh x23, x14, x15 - adds x22, x22, x25 - adc x23, x23, xzr + mul x25, x10, x11 + adcs x5, x5, x25 + umulh x6, x10, x11 + adc x6, x6, xzr # Double - adds x17, x17, x17 - adcs x19, x19, x19 - adcs x20, x20, x20 - adcs x21, x21, x21 - adcs x22, x22, x22 + adds x22, x22, x22 adcs x23, x23, x23 - adc x24, xzr, xzr + adcs x24, x24, x24 + adcs x4, x4, x4 + adcs x5, x5, x5 + adcs x6, x6, x6 + adc x7, xzr, xzr # A[0] * A[0] - mul x16, x12, x12 - umulh x27, x12, x12 + umulh x26, x8, x8 + mul x21, x8, x8 # A[1] * A[1] - mul x25, x13, x13 - umulh x26, x13, x13 - adds x17, x17, x27 - adcs x19, x19, x25 - adc x27, x26, xzr + mul x25, x9, x9 + adds x22, x22, x26 + umulh x26, x9, x9 + adcs x23, x23, x25 # A[2] * A[2] - mul x25, x14, x14 - umulh x26, x14, x14 - adds x20, x20, x27 - adcs x21, x21, x25 - adc x27, x26, xzr + mul x25, x10, x10 + adcs x24, x24, x26 + umulh x26, x10, x10 + adcs x4, x4, x25 # A[3] * A[3] - mul x25, x15, x15 - umulh x26, x15, x15 - adds x22, x22, x27 - adcs x23, x23, x25 - adc x24, x24, x26 + mul x25, x11, x11 + adcs x5, x5, x26 + umulh x26, x11, x11 + adcs x6, x6, x25 + adc x7, x7, x26 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x24, x24, x23, #63 - extr x23, x23, x22, #63 - extr x22, x22, x21, #63 - extr x21, x21, x20, #63 - and x20, x20, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x21 - umulh x21, x25, x21 - adds x16, x16, x26 - mul x26, x25, x22 - umulh x22, x25, x22 - adcs x17, x17, x26 - mul x26, x25, x23 - umulh x23, x25, x23 - adcs x19, x19, x26 - mul x26, x25, x24 - umulh x27, x25, x24 - adcs x20, x20, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x17, x17, x21 - adcs x19, x19, x22 - adcs x20, x20, x23 + mov x25, #38 + mul x26, x25, x7 + adds x24, x24, x26 + umulh x27, x25, x7 adc x27, x27, xzr - # Overflow - extr x27, x27, x20, #63 + mov x25, #19 + extr x27, x27, x24, #63 mul x27, x27, x25 - and x20, x20, #0x7fffffffffffffff - adds x16, x16, x27 - adcs x17, x17, xzr - adcs x19, x19, xzr - adc x20, x20, xzr - # Reduce if top bit set - and x27, x25, x20, asr 63 - and x20, x20, #0x7fffffffffffffff - adds x16, x16, x27 - adcs x17, x17, xzr - adcs x19, x19, xzr - adc x20, x20, xzr - # Store - stp x16, x17, [x0] - stp x19, x20, [x0, #16] - ldr x0, [x29, #24] - ldr x1, [x29, #32] - # Add - adds x12, x8, x4 - adcs x13, x9, x5 - adcs x14, x10, x6 - adc x15, x11, x7 - mov x25, #-19 - asr x28, x15, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff - # Sub modulus (if overflow) - subs x12, x12, x25 - sbcs x13, x13, x28 - sbcs x14, x14, x28 - sbc x15, x15, x26 + and x24, x24, #0x7fffffffffffffff + mov x25, #38 + mul x26, x25, x4 + adds x21, x21, x26 + umulh x4, x25, x4 + mul x26, x25, x5 + adcs x22, x22, x26 + umulh x5, x25, x5 + mul x26, x25, x6 + adcs x23, x23, x26 + umulh x6, x25, x6 + adc x24, x24, xzr + # Add high product results in + adds x21, x21, x27 + adcs x22, x22, x4 + adcs x23, x23, x5 + adc x24, x24, x6 + add x2, x0, #32 # Sub - subs x21, x8, x4 - sbcs x22, x9, x5 - sbcs x23, x10, x6 - sbcs x24, x11, x7 - mov x25, #-19 + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + subs x21, x21, x8 + sbcs x22, x22, x9 + sbcs x23, x23, x10 + sbcs x24, x24, x11 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff - # Add modulus (if underflow) - adds x21, x21, x25 - adcs x22, x22, x28 - adcs x23, x23, x28 - adc x24, x24, x26 - stp x12, x13, [x0] - stp x14, x15, [x0, #16] - stp x21, x22, [x1] - stp x23, x24, [x1, #16] - ldr x0, [x29, #16] - # Sub - subs x16, x16, x12 - sbcs x17, x17, x13 - sbcs x19, x19, x14 - sbcs x20, x20, x15 mov x25, #-19 - csetm x28, cc # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + extr x28, x28, x24, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 - stp x16, x17, [x0] - stp x19, x20, [x0, #16] - ldr x0, [x29, #40] - ldr x1, [x29, #64] + subs x21, x21, x25 + sbcs x22, x22, xzr + and x24, x24, #0x7fffffffffffffff + sbcs x23, x23, xzr + sbc x24, x24, xzr + stp x21, x22, [x0] + stp x23, x24, [x0, #16] + ldr x2, [x29, #24] + add x2, x2, #0x40 + add x0, x0, #0x60 # Square * 2 - ldp x12, x13, [x1] - ldp x14, x15, [x1, #16] + ldp x16, x17, [x2] + ldp x19, x20, [x2, #16] # A[0] * A[1] - mul x5, x12, x13 - umulh x6, x12, x13 + umulh x6, x16, x17 + mul x5, x16, x17 + # A[0] * A[3] + umulh x8, x16, x20 + mul x7, x16, x20 # A[0] * A[2] - mul x25, x12, x14 - umulh x7, x12, x14 + mul x25, x16, x19 adds x6, x6, x25 - adc x7, x7, xzr - # A[0] * A[3] - mul x25, x12, x15 - umulh x8, x12, x15 - adds x7, x7, x25 - adc x8, x8, xzr + umulh x26, x16, x19 + adcs x7, x7, x26 + # A[1] * A[3] + mul x25, x17, x20 + adcs x8, x8, x25 + umulh x9, x17, x20 + adc x9, x9, xzr # A[1] * A[2] - mul x25, x13, x14 - umulh x26, x13, x14 + mul x25, x17, x19 adds x7, x7, x25 + umulh x26, x17, x19 adcs x8, x8, x26 - adc x9, xzr, xzr - # A[1] * A[3] - mul x25, x13, x15 - umulh x26, x13, x15 - adds x8, x8, x25 - adc x9, x9, x26 # A[2] * A[3] - mul x25, x14, x15 - umulh x10, x14, x15 - adds x9, x9, x25 + mul x25, x19, x20 + adcs x9, x9, x25 + umulh x10, x19, x20 adc x10, x10, xzr # Double adds x5, x5, x5 @@ -4765,653 +5910,551 @@ adcs x10, x10, x10 adc x11, xzr, xzr # A[0] * A[0] - mul x4, x12, x12 - umulh x28, x12, x12 + umulh x26, x16, x16 + mul x4, x16, x16 # A[1] * A[1] - mul x25, x13, x13 - umulh x26, x13, x13 - adds x5, x5, x28 + mul x25, x17, x17 + adds x5, x5, x26 + umulh x26, x17, x17 adcs x6, x6, x25 - adc x28, x26, xzr # A[2] * A[2] - mul x25, x14, x14 - umulh x26, x14, x14 - adds x7, x7, x28 + mul x25, x19, x19 + adcs x7, x7, x26 + umulh x26, x19, x19 adcs x8, x8, x25 - adc x28, x26, xzr # A[3] * A[3] - mul x25, x15, x15 - umulh x26, x15, x15 - adds x9, x9, x28 + mul x25, x20, x20 + adcs x9, x9, x26 + umulh x26, x20, x20 adcs x10, x10, x25 adc x11, x11, x26 - # Double and Reduce - mov x25, #0x169 - # Move top half into t4-t7 and remove top bit from t3 - lsr x28, x11, #61 - extr x11, x11, x10, #62 - extr x10, x10, x9, #62 - extr x9, x9, x8, #62 - extr x8, x8, x7, #62 - extr x7, x7, x6, #63 - extr x6, x6, x5, #63 - extr x5, x5, x4, #63 - lsl x4, x4, #1 - and x7, x7, #0x7fffffffffffffff - # Two left, only one right - and x11, x11, #0x7fffffffffffffff - # Multiply top bits by 19*19 - mul x28, x28, x25 - # Multiply top half by 19 + # Reduce + mov x25, #38 + mul x26, x25, x11 + adds x7, x7, x26 + umulh x27, x25, x11 + adc x27, x27, xzr mov x25, #19 + extr x27, x27, x7, #63 + mul x27, x27, x25 + and x7, x7, #0x7fffffffffffffff + mov x25, #38 mul x26, x25, x8 - umulh x8, x25, x8 adds x4, x4, x26 + umulh x8, x25, x8 mul x26, x25, x9 - umulh x9, x25, x9 adcs x5, x5, x26 + umulh x9, x25, x9 mul x26, x25, x10 - umulh x10, x25, x10 adcs x6, x6, x26 - mul x26, x25, x11 - umulh x27, x25, x11 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x4, x4, x28 + umulh x10, x25, x10 + adc x7, x7, xzr + # Add high product results in + adds x4, x4, x27 adcs x5, x5, x8 adcs x6, x6, x9 - adcs x7, x7, x10 - adc x27, x27, xzr - # Overflow - extr x27, x27, x7, #63 - mul x27, x27, x25 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 + adc x7, x7, x10 + mov x25, #19 + lsr x26, x7, #62 + extr x7, x7, x6, #63 + extr x6, x6, x5, #63 + extr x5, x5, x4, #63 + lsl x4, x4, #1 + mul x26, x26, x25 + adds x4, x4, x26 adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr adcs x6, x6, xzr adc x7, x7, xzr # Store - ldr x0, [x29, #40] + sub x1, x0, #32 # Sub - subs x4, x4, x21 - sbcs x5, x5, x22 - sbcs x6, x6, x23 - sbcs x7, x7, x24 - mov x25, #-19 + subs x4, x4, x12 + sbcs x5, x5, x13 + sbcs x6, x6, x14 + sbcs x7, x7, x15 csetm x28, cc + mov x25, #-19 # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + extr x28, x28, x7, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x4, x4, x25 - adcs x5, x5, x28 - adcs x6, x6, x28 - adc x7, x7, x26 + subs x4, x4, x25 + sbcs x5, x5, xzr + and x7, x7, #0x7fffffffffffffff + sbcs x6, x6, xzr + sbc x7, x7, xzr stp x4, x5, [x0] stp x6, x7, [x0, #16] - ldr x17, [x29, #88] - ldr x19, [x29, #96] - ldp x20, x21, [x29, #104] - ldp x22, x23, [x29, #120] - ldp x24, x25, [x29, #136] - ldp x26, x27, [x29, #152] - ldr x28, [x29, #168] - ldp x29, x30, [sp], #0xb0 + ldr x17, [x29, #40] + ldr x19, [x29, #48] + ldp x20, x21, [x29, #56] + ldp x22, x23, [x29, #72] + ldp x24, x25, [x29, #88] + ldp x26, x27, [x29, #104] + ldr x28, [x29, #120] + ldp x29, x30, [sp], #0x80 ret #ifndef __APPLE__ - .size fe_ge_dbl,.-fe_ge_dbl + .size ge_p2_dbl,.-ge_p2_dbl #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_madd -.type fe_ge_madd,@function +.globl ge_madd +.type ge_madd,@function .align 2 -fe_ge_madd: +ge_madd: #else .section __TEXT,__text -.globl _fe_ge_madd +.globl _ge_madd .p2align 2 -_fe_ge_madd: +_ge_madd: #endif /* __APPLE__ */ - stp x29, x30, [sp, #-176]! + stp x29, x30, [sp, #-144]! add x29, sp, #0 - str x17, [x29, #88] - str x19, [x29, #96] - stp x20, x21, [x29, #104] - stp x22, x23, [x29, #120] - stp x24, x25, [x29, #136] - stp x26, x27, [x29, #152] - str x28, [x29, #168] + str x17, [x29, #56] + str x19, [x29, #64] + stp x20, x21, [x29, #72] + stp x22, x23, [x29, #88] + stp x24, x25, [x29, #104] + stp x26, x27, [x29, #120] + str x28, [x29, #136] str x0, [x29, #16] str x1, [x29, #24] str x2, [x29, #32] - str x3, [x29, #40] - str x4, [x29, #48] - str x5, [x29, #56] - str x6, [x29, #64] - str x7, [x29, #72] - ldr x2, [x29, #56] - ldr x3, [x29, #48] + mov x3, x1 + add x2, x1, #32 + add x1, x0, #32 # Add - ldp x12, x13, [x2] - ldp x14, x15, [x2, #16] - ldp x16, x17, [x3] - ldp x19, x20, [x3, #16] - adds x4, x12, x16 - adcs x5, x13, x17 - adcs x6, x14, x19 - adc x7, x15, x20 - mov x25, #-19 - asr x28, x7, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + ldp x4, x5, [x3] + ldp x6, x7, [x3, #16] + adds x16, x8, x4 + adcs x17, x9, x5 + adcs x19, x10, x6 + adcs x20, x11, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x20, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x4, x4, x25 - sbcs x5, x5, x28 - sbcs x6, x6, x28 - sbc x7, x7, x26 + adds x16, x16, x25 + adcs x17, x17, xzr + and x20, x20, #0x7fffffffffffffff + adcs x19, x19, xzr + adc x20, x20, xzr # Sub - subs x8, x12, x16 - sbcs x9, x13, x17 - sbcs x10, x14, x19 - sbcs x11, x15, x20 - mov x25, #-19 + subs x12, x8, x4 + sbcs x13, x9, x5 + sbcs x14, x10, x6 + sbcs x15, x11, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x8, x8, x25 - adcs x9, x9, x28 - adcs x10, x10, x28 - adc x11, x11, x26 - ldr x0, [x29, #32] - ldr x2, [x29, #184] + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr + ldr x2, [x29, #32] + mov x1, x0 # Multiply - ldp x21, x22, [x2] - ldp x23, x24, [x2, #16] - # A[0] * B[0] - mul x12, x4, x21 - umulh x13, x4, x21 - # A[0] * B[1] - mul x25, x4, x22 - umulh x14, x4, x22 - adds x13, x13, x25 - adc x14, x14, xzr - # A[1] * B[0] - mul x25, x5, x21 - umulh x26, x5, x21 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, xzr, xzr - # A[0] * B[2] - mul x25, x4, x23 - umulh x26, x4, x23 - adds x14, x14, x25 - adc x15, x15, x26 - # A[1] * B[1] - mul x25, x5, x22 - umulh x26, x5, x22 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x6, x21 - umulh x26, x6, x21 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x4, x24 - umulh x26, x4, x24 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x5, x23 - umulh x26, x5, x23 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x6, x22 - umulh x26, x6, x22 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x7, x21 - umulh x26, x7, x21 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x5, x24 - umulh x26, x5, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x6, x23 - umulh x26, x6, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x7, x22 - umulh x26, x7, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x6, x24 - umulh x26, x6, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x7, x23 - umulh x26, x7, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x7, x24 - umulh x26, x7, x24 - adds x19, x19, x25 - adc x20, x20, x26 + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + # A[0] * B[0] + umulh x22, x16, x8 + mul x21, x16, x8 + # A[2] * B[0] + umulh x24, x19, x8 + mul x23, x19, x8 + # A[1] * B[0] + mul x25, x17, x8 + adds x22, x22, x25 + umulh x26, x17, x8 + adcs x23, x23, x26 + # A[1] * B[3] + umulh x5, x17, x11 + adc x24, x24, xzr + mul x4, x17, x11 + # A[0] * B[1] + mul x25, x16, x9 + adds x22, x22, x25 + umulh x26, x16, x9 + adcs x23, x23, x26 + # A[2] * B[1] + mul x25, x19, x9 + adcs x24, x24, x25 + umulh x26, x19, x9 + adcs x4, x4, x26 + adc x5, x5, xzr + # A[1] * B[2] + mul x25, x17, x10 + adds x24, x24, x25 + umulh x26, x17, x10 + adcs x4, x4, x26 + adcs x5, x5, xzr + adc x6, xzr, xzr + # A[0] * B[2] + mul x25, x16, x10 + adds x23, x23, x25 + umulh x26, x16, x10 + adcs x24, x24, x26 + adcs x4, x4, xzr + adcs x5, x5, xzr + adc x6, x6, xzr + # A[1] * B[1] + mul x25, x17, x9 + adds x23, x23, x25 + umulh x26, x17, x9 + adcs x24, x24, x26 + # A[3] * B[1] + mul x25, x20, x9 + adcs x4, x4, x25 + umulh x26, x20, x9 + adcs x5, x5, x26 + adc x6, x6, xzr + # A[2] * B[2] + mul x25, x19, x10 + adds x4, x4, x25 + umulh x26, x19, x10 + adcs x5, x5, x26 + # A[3] * B[3] + mul x25, x20, x11 + adcs x6, x6, x25 + umulh x7, x20, x11 + adc x7, x7, xzr + # A[0] * B[3] + mul x25, x16, x11 + adds x24, x24, x25 + umulh x26, x16, x11 + adcs x4, x4, x26 + # A[2] * B[3] + mul x25, x19, x11 + adcs x5, x5, x25 + umulh x26, x19, x11 + adcs x6, x6, x26 + adc x7, x7, xzr + # A[3] * B[0] + mul x25, x20, x8 + adds x24, x24, x25 + umulh x26, x20, x8 + adcs x4, x4, x26 + # A[3] * B[2] + mul x25, x20, x10 + adcs x5, x5, x25 + umulh x26, x20, x10 + adcs x6, x6, x26 + adc x7, x7, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x15, #63 - and x15, x15, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x12, x12, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x13, x13, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x14, x14, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x15, x15, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x13, x13, x16 - adcs x14, x14, x17 - adcs x15, x15, x19 + mov x25, #38 + mul x26, x25, x7 + adds x24, x24, x26 + umulh x27, x25, x7 adc x27, x27, xzr - # Overflow - extr x27, x27, x15, #63 + mov x25, #19 + extr x27, x27, x24, #63 mul x27, x27, x25 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr - # Reduce if top bit set - and x27, x25, x15, asr 63 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr - # Store - ldr x0, [x29, #24] - ldr x1, [x29, #192] + and x24, x24, #0x7fffffffffffffff + mov x25, #38 + mul x26, x25, x4 + adds x21, x21, x26 + umulh x4, x25, x4 + mul x26, x25, x5 + adcs x22, x22, x26 + umulh x5, x25, x5 + mul x26, x25, x6 + adcs x23, x23, x26 + umulh x6, x25, x6 + adc x24, x24, xzr + # Add high product results in + adds x21, x21, x27 + adcs x22, x22, x4 + adcs x23, x23, x5 + adc x24, x24, x6 + add x2, x2, #32 + add x1, x0, #32 + add x0, x0, #32 # Multiply - ldp x21, x22, [x1] - ldp x23, x24, [x1, #16] - # A[0] * B[0] - mul x4, x8, x21 - umulh x5, x8, x21 - # A[0] * B[1] - mul x25, x8, x22 - umulh x6, x8, x22 + ldp x16, x17, [x2] + ldp x19, x20, [x2, #16] + # A[0] * B[0] + umulh x5, x12, x16 + mul x4, x12, x16 + # A[2] * B[0] + umulh x7, x14, x16 + mul x6, x14, x16 + # A[1] * B[0] + mul x25, x13, x16 adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x9, x21 - umulh x26, x9, x21 + umulh x26, x13, x16 + adcs x6, x6, x26 + # A[1] * B[3] + umulh x9, x13, x20 + adc x7, x7, xzr + mul x8, x13, x20 + # A[0] * B[1] + mul x25, x12, x17 adds x5, x5, x25 + umulh x26, x12, x17 adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x8, x23 - umulh x26, x8, x23 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x9, x22 - umulh x26, x9, x22 + # A[2] * B[1] + mul x25, x14, x17 + adcs x7, x7, x25 + umulh x26, x14, x17 + adcs x8, x8, x26 + adc x9, x9, xzr + # A[1] * B[2] + mul x25, x13, x19 + adds x7, x7, x25 + umulh x26, x13, x19 + adcs x8, x8, x26 + adcs x9, x9, xzr + adc x10, xzr, xzr + # A[0] * B[2] + mul x25, x12, x19 adds x6, x6, x25 + umulh x26, x12, x19 adcs x7, x7, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x10, x21 - umulh x26, x10, x21 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x13, x17 adds x6, x6, x25 + umulh x26, x13, x17 adcs x7, x7, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x8, x24 - umulh x26, x8, x24 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x9, x23 - umulh x26, x9, x23 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x10, x22 - umulh x26, x10, x22 + # A[3] * B[1] + mul x25, x15, x17 + adcs x8, x8, x25 + umulh x26, x15, x17 + adcs x9, x9, x26 + adc x10, x10, xzr + # A[2] * B[2] + mul x25, x14, x19 + adds x8, x8, x25 + umulh x26, x14, x19 + adcs x9, x9, x26 + # A[3] * B[3] + mul x25, x15, x20 + adcs x10, x10, x25 + umulh x11, x15, x20 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x12, x20 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x11, x21 - umulh x26, x11, x21 + umulh x26, x12, x20 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x14, x20 + adcs x9, x9, x25 + umulh x26, x14, x20 + adcs x10, x10, x26 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x15, x16 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x9, x24 - umulh x26, x9, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x10, x23 - umulh x26, x10, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x11, x22 - umulh x26, x11, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x10, x24 - umulh x26, x10, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x11, x23 - umulh x26, x11, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x11, x24 - umulh x26, x11, x24 - adds x19, x19, x25 - adc x20, x20, x26 + umulh x26, x15, x16 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x15, x19 + adcs x9, x9, x25 + umulh x26, x15, x19 + adcs x10, x10, x26 + adc x11, x11, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x4, x4, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x5, x5, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x6, x6, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x16 - adcs x6, x6, x17 - adcs x7, x7, x19 + mov x25, #38 + mul x26, x25, x11 + adds x7, x7, x26 + umulh x27, x25, x11 adc x27, x27, xzr - # Overflow + mov x25, #19 extr x27, x27, x7, #63 mul x27, x27, x25 and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr + mov x25, #38 + mul x26, x25, x8 + adds x4, x4, x26 + umulh x8, x25, x8 + mul x26, x25, x9 + adcs x5, x5, x26 + umulh x9, x25, x9 + mul x26, x25, x10 + adcs x6, x6, x26 + umulh x10, x25, x10 adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff + # Add high product results in adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Store - ldr x0, [x29, #24] - ldr x1, [x29, #16] + adcs x5, x5, x8 + adcs x6, x6, x9 + adc x7, x7, x10 + mov x3, x0 + sub x2, x0, #32 + sub x1, x0, #32 # Add - adds x8, x12, x4 - adcs x9, x13, x5 - adcs x10, x14, x6 - adc x11, x15, x7 - mov x25, #-19 - asr x28, x11, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + adds x8, x21, x4 + adcs x9, x22, x5 + adcs x10, x23, x6 + adcs x11, x24, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x11, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x8, x8, x25 - sbcs x9, x9, x28 - sbcs x10, x10, x28 - sbc x11, x11, x26 + adds x8, x8, x25 + adcs x9, x9, xzr + and x11, x11, #0x7fffffffffffffff + adcs x10, x10, xzr + adc x11, x11, xzr # Sub - subs x16, x12, x4 - sbcs x17, x13, x5 - sbcs x19, x14, x6 - sbcs x20, x15, x7 - mov x25, #-19 + subs x12, x21, x4 + sbcs x13, x22, x5 + sbcs x14, x23, x6 + sbcs x15, x24, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr stp x8, x9, [x0] stp x10, x11, [x0, #16] - stp x16, x17, [x1] - stp x19, x20, [x1, #16] - ldr x0, [x29, #40] - ldr x1, [x29, #176] - ldr x3, [x29, #72] + stp x12, x13, [x1] + stp x14, x15, [x1, #16] + ldr x1, [x29, #24] + ldr x2, [x29, #32] + add x2, x2, #0x40 + add x1, x1, #0x60 + add x0, x0, #0x40 # Multiply - ldp x16, x17, [x1] - ldp x19, x20, [x1, #16] - ldp x21, x22, [x3] - ldp x23, x24, [x3, #16] - # A[0] * B[0] - mul x4, x16, x21 - umulh x5, x16, x21 - # A[0] * B[1] - mul x25, x16, x22 - umulh x6, x16, x22 - adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x17, x21 - umulh x26, x17, x21 - adds x5, x5, x25 - adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x16, x23 - umulh x26, x16, x23 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x17, x22 - umulh x26, x17, x22 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, xzr, xzr - # A[2] * B[0] - mul x25, x19, x21 - umulh x26, x19, x21 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, x8, xzr - # A[0] * B[3] - mul x25, x16, x24 - umulh x26, x16, x24 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, xzr, xzr - # A[1] * B[2] - mul x25, x17, x23 - umulh x26, x17, x23 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, x9, xzr - # A[2] * B[1] - mul x25, x19, x22 - umulh x26, x19, x22 - adds x7, x7, x25 + ldp x21, x22, [x1] + ldp x23, x24, [x1, #16] + ldp x4, x5, [x2] + ldp x6, x7, [x2, #16] + # A[0] * B[0] + umulh x17, x21, x4 + mul x16, x21, x4 + # A[2] * B[0] + umulh x20, x23, x4 + mul x19, x23, x4 + # A[1] * B[0] + mul x25, x22, x4 + adds x17, x17, x25 + umulh x26, x22, x4 + adcs x19, x19, x26 + # A[1] * B[3] + umulh x9, x22, x7 + adc x20, x20, xzr + mul x8, x22, x7 + # A[0] * B[1] + mul x25, x21, x5 + adds x17, x17, x25 + umulh x26, x21, x5 + adcs x19, x19, x26 + # A[2] * B[1] + mul x25, x23, x5 + adcs x20, x20, x25 + umulh x26, x23, x5 adcs x8, x8, x26 adc x9, x9, xzr - # A[3] * B[0] - mul x25, x20, x21 - umulh x26, x20, x21 - adds x7, x7, x25 + # A[1] * B[2] + mul x25, x22, x6 + adds x20, x20, x25 + umulh x26, x22, x6 adcs x8, x8, x26 - adc x9, x9, xzr - # A[1] * B[3] - mul x25, x17, x24 - umulh x26, x17, x24 - adds x8, x8, x25 - adcs x9, x9, x26 + adcs x9, x9, xzr adc x10, xzr, xzr - # A[2] * B[2] - mul x25, x19, x23 - umulh x26, x19, x23 - adds x8, x8, x25 + # A[0] * B[2] + mul x25, x21, x6 + adds x19, x19, x25 + umulh x26, x21, x6 + adcs x20, x20, x26 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x22, x5 + adds x19, x19, x25 + umulh x26, x22, x5 + adcs x20, x20, x26 + # A[3] * B[1] + mul x25, x24, x5 + adcs x8, x8, x25 + umulh x26, x24, x5 adcs x9, x9, x26 adc x10, x10, xzr - # A[3] * B[1] - mul x25, x20, x22 - umulh x26, x20, x22 + # A[2] * B[2] + mul x25, x23, x6 adds x8, x8, x25 + umulh x26, x23, x6 adcs x9, x9, x26 - adc x10, x10, xzr - # A[2] * B[3] - mul x25, x19, x24 - umulh x26, x19, x24 - adds x9, x9, x25 + # A[3] * B[3] + mul x25, x24, x7 + adcs x10, x10, x25 + umulh x11, x24, x7 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x21, x7 + adds x20, x20, x25 + umulh x26, x21, x7 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x23, x7 + adcs x9, x9, x25 + umulh x26, x23, x7 adcs x10, x10, x26 - adc x11, xzr, xzr - # A[3] * B[2] - mul x25, x20, x23 - umulh x26, x20, x23 - adds x9, x9, x25 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x24, x4 + adds x20, x20, x25 + umulh x26, x24, x4 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x24, x6 + adcs x9, x9, x25 + umulh x26, x24, x6 adcs x10, x10, x26 adc x11, x11, xzr - # A[3] * B[3] - mul x25, x20, x24 - umulh x26, x20, x24 - adds x10, x10, x25 - adc x11, x11, x26 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x11, x11, x10, #63 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 + mov x25, #38 + mul x26, x25, x11 + adds x20, x20, x26 + umulh x27, x25, x11 + adc x27, x27, xzr mov x25, #19 + extr x27, x27, x20, #63 + mul x27, x27, x25 + and x20, x20, #0x7fffffffffffffff + mov x25, #38 mul x26, x25, x8 + adds x16, x16, x26 umulh x8, x25, x8 - adds x4, x4, x26 mul x26, x25, x9 + adcs x17, x17, x26 umulh x9, x25, x9 - adcs x5, x5, x26 mul x26, x25, x10 + adcs x19, x19, x26 umulh x10, x25, x10 - adcs x6, x6, x26 - mul x26, x25, x11 - umulh x27, x25, x11 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x8 - adcs x6, x6, x9 - adcs x7, x7, x10 - adc x27, x27, xzr - # Overflow - extr x27, x27, x7, #63 - mul x27, x27, x25 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Store - ldr x0, [x29, #32] - ldr x1, [x29, #64] + adc x20, x20, xzr + # Add high product results in + adds x16, x16, x27 + adcs x17, x17, x8 + adcs x19, x19, x9 + adc x20, x20, x10 + sub x1, x1, #32 # Double - ldp x8, x9, [x1] - ldp x10, x11, [x1, #16] - adds x8, x8, x8 - adcs x9, x9, x9 - adcs x10, x10, x10 - adc x11, x11, x11 - mov x25, #-19 - asr x28, x11, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff - # Sub modulus (if overflow) - subs x8, x8, x25 - sbcs x9, x9, x28 - sbcs x10, x10, x28 - sbc x11, x11, x26 - ldr x1, [x29, #40] - # Add - adds x12, x8, x4 - adcs x13, x9, x5 - adcs x14, x10, x6 - adc x15, x11, x7 + ldp x12, x13, [x1] + ldp x14, x15, [x1, #16] + adds x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adc x15, x15, x15 mov x25, #-19 asr x28, x15, #63 # Mask the modulus @@ -5422,580 +6465,514 @@ sbcs x13, x13, x28 sbcs x14, x14, x28 sbc x15, x15, x26 + mov x3, x0 + sub x2, x0, #32 + mov x1, x0 + sub x0, x0, #32 + # Add + adds x8, x12, x16 + adcs x9, x13, x17 + adcs x10, x14, x19 + adcs x11, x15, x20 + cset x28, cs + mov x25, #19 + extr x28, x28, x11, #63 + mul x25, x28, x25 + # Sub modulus (if overflow) + adds x8, x8, x25 + adcs x9, x9, xzr + and x11, x11, #0x7fffffffffffffff + adcs x10, x10, xzr + adc x11, x11, xzr # Sub - subs x16, x8, x4 - sbcs x17, x9, x5 - sbcs x19, x10, x6 - sbcs x20, x11, x7 - mov x25, #-19 + subs x4, x12, x16 + sbcs x5, x13, x17 + sbcs x6, x14, x19 + sbcs x7, x15, x20 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x7, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 - stp x12, x13, [x0] - stp x14, x15, [x0, #16] - stp x16, x17, [x1] - stp x19, x20, [x1, #16] - ldr x17, [x29, #88] - ldr x19, [x29, #96] - ldp x20, x21, [x29, #104] - ldp x22, x23, [x29, #120] - ldp x24, x25, [x29, #136] - ldp x26, x27, [x29, #152] - ldr x28, [x29, #168] - ldp x29, x30, [sp], #0xb0 + subs x4, x4, x25 + sbcs x5, x5, xzr + and x7, x7, #0x7fffffffffffffff + sbcs x6, x6, xzr + sbc x7, x7, xzr + stp x8, x9, [x0] + stp x10, x11, [x0, #16] + stp x4, x5, [x1] + stp x6, x7, [x1, #16] + ldr x17, [x29, #56] + ldr x19, [x29, #64] + ldp x20, x21, [x29, #72] + ldp x22, x23, [x29, #88] + ldp x24, x25, [x29, #104] + ldp x26, x27, [x29, #120] + ldr x28, [x29, #136] + ldp x29, x30, [sp], #0x90 ret #ifndef __APPLE__ - .size fe_ge_madd,.-fe_ge_madd + .size ge_madd,.-ge_madd #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_msub -.type fe_ge_msub,@function +.globl ge_msub +.type ge_msub,@function .align 2 -fe_ge_msub: +ge_msub: #else .section __TEXT,__text -.globl _fe_ge_msub +.globl _ge_msub .p2align 2 -_fe_ge_msub: +_ge_msub: #endif /* __APPLE__ */ - stp x29, x30, [sp, #-176]! + stp x29, x30, [sp, #-144]! add x29, sp, #0 - str x17, [x29, #88] - str x19, [x29, #96] - stp x20, x21, [x29, #104] - stp x22, x23, [x29, #120] - stp x24, x25, [x29, #136] - stp x26, x27, [x29, #152] - str x28, [x29, #168] + str x17, [x29, #56] + str x19, [x29, #64] + stp x20, x21, [x29, #72] + stp x22, x23, [x29, #88] + stp x24, x25, [x29, #104] + stp x26, x27, [x29, #120] + str x28, [x29, #136] str x0, [x29, #16] str x1, [x29, #24] str x2, [x29, #32] - str x3, [x29, #40] - str x4, [x29, #48] - str x5, [x29, #56] - str x6, [x29, #64] - str x7, [x29, #72] - ldr x2, [x29, #56] - ldr x3, [x29, #48] + mov x3, x1 + add x2, x1, #32 + add x1, x0, #32 # Add - ldp x12, x13, [x2] - ldp x14, x15, [x2, #16] - ldp x16, x17, [x3] - ldp x19, x20, [x3, #16] - adds x4, x12, x16 - adcs x5, x13, x17 - adcs x6, x14, x19 - adc x7, x15, x20 - mov x25, #-19 - asr x28, x7, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + ldp x4, x5, [x3] + ldp x6, x7, [x3, #16] + adds x16, x8, x4 + adcs x17, x9, x5 + adcs x19, x10, x6 + adcs x20, x11, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x20, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x4, x4, x25 - sbcs x5, x5, x28 - sbcs x6, x6, x28 - sbc x7, x7, x26 + adds x16, x16, x25 + adcs x17, x17, xzr + and x20, x20, #0x7fffffffffffffff + adcs x19, x19, xzr + adc x20, x20, xzr # Sub - subs x8, x12, x16 - sbcs x9, x13, x17 - sbcs x10, x14, x19 - sbcs x11, x15, x20 - mov x25, #-19 + subs x12, x8, x4 + sbcs x13, x9, x5 + sbcs x14, x10, x6 + sbcs x15, x11, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x8, x8, x25 - adcs x9, x9, x28 - adcs x10, x10, x28 - adc x11, x11, x26 - ldr x0, [x29, #32] - ldr x2, [x29, #192] + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr + ldr x2, [x29, #32] + add x2, x2, #32 + mov x1, x0 # Multiply - ldp x21, x22, [x2] - ldp x23, x24, [x2, #16] - # A[0] * B[0] - mul x12, x4, x21 - umulh x13, x4, x21 - # A[0] * B[1] - mul x25, x4, x22 - umulh x14, x4, x22 - adds x13, x13, x25 - adc x14, x14, xzr - # A[1] * B[0] - mul x25, x5, x21 - umulh x26, x5, x21 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, xzr, xzr - # A[0] * B[2] - mul x25, x4, x23 - umulh x26, x4, x23 - adds x14, x14, x25 - adc x15, x15, x26 - # A[1] * B[1] - mul x25, x5, x22 - umulh x26, x5, x22 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x6, x21 - umulh x26, x6, x21 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x4, x24 - umulh x26, x4, x24 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x5, x23 - umulh x26, x5, x23 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x6, x22 - umulh x26, x6, x22 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x7, x21 - umulh x26, x7, x21 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x5, x24 - umulh x26, x5, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x6, x23 - umulh x26, x6, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x7, x22 - umulh x26, x7, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x6, x24 - umulh x26, x6, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x7, x23 - umulh x26, x7, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x7, x24 - umulh x26, x7, x24 - adds x19, x19, x25 - adc x20, x20, x26 + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + # A[0] * B[0] + umulh x22, x16, x8 + mul x21, x16, x8 + # A[2] * B[0] + umulh x24, x19, x8 + mul x23, x19, x8 + # A[1] * B[0] + mul x25, x17, x8 + adds x22, x22, x25 + umulh x26, x17, x8 + adcs x23, x23, x26 + # A[1] * B[3] + umulh x5, x17, x11 + adc x24, x24, xzr + mul x4, x17, x11 + # A[0] * B[1] + mul x25, x16, x9 + adds x22, x22, x25 + umulh x26, x16, x9 + adcs x23, x23, x26 + # A[2] * B[1] + mul x25, x19, x9 + adcs x24, x24, x25 + umulh x26, x19, x9 + adcs x4, x4, x26 + adc x5, x5, xzr + # A[1] * B[2] + mul x25, x17, x10 + adds x24, x24, x25 + umulh x26, x17, x10 + adcs x4, x4, x26 + adcs x5, x5, xzr + adc x6, xzr, xzr + # A[0] * B[2] + mul x25, x16, x10 + adds x23, x23, x25 + umulh x26, x16, x10 + adcs x24, x24, x26 + adcs x4, x4, xzr + adcs x5, x5, xzr + adc x6, x6, xzr + # A[1] * B[1] + mul x25, x17, x9 + adds x23, x23, x25 + umulh x26, x17, x9 + adcs x24, x24, x26 + # A[3] * B[1] + mul x25, x20, x9 + adcs x4, x4, x25 + umulh x26, x20, x9 + adcs x5, x5, x26 + adc x6, x6, xzr + # A[2] * B[2] + mul x25, x19, x10 + adds x4, x4, x25 + umulh x26, x19, x10 + adcs x5, x5, x26 + # A[3] * B[3] + mul x25, x20, x11 + adcs x6, x6, x25 + umulh x7, x20, x11 + adc x7, x7, xzr + # A[0] * B[3] + mul x25, x16, x11 + adds x24, x24, x25 + umulh x26, x16, x11 + adcs x4, x4, x26 + # A[2] * B[3] + mul x25, x19, x11 + adcs x5, x5, x25 + umulh x26, x19, x11 + adcs x6, x6, x26 + adc x7, x7, xzr + # A[3] * B[0] + mul x25, x20, x8 + adds x24, x24, x25 + umulh x26, x20, x8 + adcs x4, x4, x26 + # A[3] * B[2] + mul x25, x20, x10 + adcs x5, x5, x25 + umulh x26, x20, x10 + adcs x6, x6, x26 + adc x7, x7, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x15, #63 - and x15, x15, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x12, x12, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x13, x13, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x14, x14, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x15, x15, x26 + mov x25, #38 + mul x26, x25, x7 + adds x24, x24, x26 + umulh x27, x25, x7 adc x27, x27, xzr - # Add remaining product results in - adds x13, x13, x16 - adcs x14, x14, x17 - adcs x15, x15, x19 - adc x27, x27, xzr - # Overflow - extr x27, x27, x15, #63 + mov x25, #19 + extr x27, x27, x24, #63 mul x27, x27, x25 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr - # Reduce if top bit set - and x27, x25, x15, asr 63 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr - # Store - ldr x0, [x29, #24] - ldr x1, [x29, #184] + and x24, x24, #0x7fffffffffffffff + mov x25, #38 + mul x26, x25, x4 + adds x21, x21, x26 + umulh x4, x25, x4 + mul x26, x25, x5 + adcs x22, x22, x26 + umulh x5, x25, x5 + mul x26, x25, x6 + adcs x23, x23, x26 + umulh x6, x25, x6 + adc x24, x24, xzr + # Add high product results in + adds x21, x21, x27 + adcs x22, x22, x4 + adcs x23, x23, x5 + adc x24, x24, x6 + sub x2, x2, #32 + add x1, x0, #32 + add x0, x0, #32 # Multiply - ldp x21, x22, [x1] - ldp x23, x24, [x1, #16] - # A[0] * B[0] - mul x4, x8, x21 - umulh x5, x8, x21 - # A[0] * B[1] - mul x25, x8, x22 - umulh x6, x8, x22 + ldp x16, x17, [x2] + ldp x19, x20, [x2, #16] + # A[0] * B[0] + umulh x5, x12, x16 + mul x4, x12, x16 + # A[2] * B[0] + umulh x7, x14, x16 + mul x6, x14, x16 + # A[1] * B[0] + mul x25, x13, x16 adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x9, x21 - umulh x26, x9, x21 + umulh x26, x13, x16 + adcs x6, x6, x26 + # A[1] * B[3] + umulh x9, x13, x20 + adc x7, x7, xzr + mul x8, x13, x20 + # A[0] * B[1] + mul x25, x12, x17 adds x5, x5, x25 + umulh x26, x12, x17 adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x8, x23 - umulh x26, x8, x23 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x9, x22 - umulh x26, x9, x22 + # A[2] * B[1] + mul x25, x14, x17 + adcs x7, x7, x25 + umulh x26, x14, x17 + adcs x8, x8, x26 + adc x9, x9, xzr + # A[1] * B[2] + mul x25, x13, x19 + adds x7, x7, x25 + umulh x26, x13, x19 + adcs x8, x8, x26 + adcs x9, x9, xzr + adc x10, xzr, xzr + # A[0] * B[2] + mul x25, x12, x19 adds x6, x6, x25 + umulh x26, x12, x19 adcs x7, x7, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x10, x21 - umulh x26, x10, x21 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x13, x17 adds x6, x6, x25 + umulh x26, x13, x17 adcs x7, x7, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x8, x24 - umulh x26, x8, x24 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x9, x23 - umulh x26, x9, x23 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x10, x22 - umulh x26, x10, x22 + # A[3] * B[1] + mul x25, x15, x17 + adcs x8, x8, x25 + umulh x26, x15, x17 + adcs x9, x9, x26 + adc x10, x10, xzr + # A[2] * B[2] + mul x25, x14, x19 + adds x8, x8, x25 + umulh x26, x14, x19 + adcs x9, x9, x26 + # A[3] * B[3] + mul x25, x15, x20 + adcs x10, x10, x25 + umulh x11, x15, x20 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x12, x20 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x11, x21 - umulh x26, x11, x21 + umulh x26, x12, x20 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x14, x20 + adcs x9, x9, x25 + umulh x26, x14, x20 + adcs x10, x10, x26 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x15, x16 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x9, x24 - umulh x26, x9, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x10, x23 - umulh x26, x10, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x11, x22 - umulh x26, x11, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x10, x24 - umulh x26, x10, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x11, x23 - umulh x26, x11, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x11, x24 - umulh x26, x11, x24 - adds x19, x19, x25 - adc x20, x20, x26 + umulh x26, x15, x16 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x15, x19 + adcs x9, x9, x25 + umulh x26, x15, x19 + adcs x10, x10, x26 + adc x11, x11, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x4, x4, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x5, x5, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x6, x6, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x16 - adcs x6, x6, x17 - adcs x7, x7, x19 + mov x25, #38 + mul x26, x25, x11 + adds x7, x7, x26 + umulh x27, x25, x11 adc x27, x27, xzr - # Overflow + mov x25, #19 extr x27, x27, x7, #63 mul x27, x27, x25 and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr + mov x25, #38 + mul x26, x25, x8 + adds x4, x4, x26 + umulh x8, x25, x8 + mul x26, x25, x9 + adcs x5, x5, x26 + umulh x9, x25, x9 + mul x26, x25, x10 + adcs x6, x6, x26 + umulh x10, x25, x10 adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff + # Add high product results in adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Store - ldr x0, [x29, #24] - ldr x1, [x29, #16] + adcs x5, x5, x8 + adcs x6, x6, x9 + adc x7, x7, x10 + mov x3, x0 + sub x2, x0, #32 + sub x1, x0, #32 # Add - adds x8, x12, x4 - adcs x9, x13, x5 - adcs x10, x14, x6 - adc x11, x15, x7 - mov x25, #-19 - asr x28, x11, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + adds x8, x21, x4 + adcs x9, x22, x5 + adcs x10, x23, x6 + adcs x11, x24, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x11, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x8, x8, x25 - sbcs x9, x9, x28 - sbcs x10, x10, x28 - sbc x11, x11, x26 + adds x8, x8, x25 + adcs x9, x9, xzr + and x11, x11, #0x7fffffffffffffff + adcs x10, x10, xzr + adc x11, x11, xzr # Sub - subs x16, x12, x4 - sbcs x17, x13, x5 - sbcs x19, x14, x6 - sbcs x20, x15, x7 - mov x25, #-19 + subs x12, x21, x4 + sbcs x13, x22, x5 + sbcs x14, x23, x6 + sbcs x15, x24, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr stp x8, x9, [x0] stp x10, x11, [x0, #16] - stp x16, x17, [x1] - stp x19, x20, [x1, #16] - ldr x0, [x29, #40] - ldr x1, [x29, #176] - ldr x3, [x29, #72] + stp x12, x13, [x1] + stp x14, x15, [x1, #16] + ldr x1, [x29, #24] + ldr x2, [x29, #32] + add x2, x2, #0x40 + add x1, x1, #0x60 + add x0, x0, #0x40 # Multiply - ldp x16, x17, [x1] - ldp x19, x20, [x1, #16] - ldp x21, x22, [x3] - ldp x23, x24, [x3, #16] - # A[0] * B[0] - mul x4, x16, x21 - umulh x5, x16, x21 - # A[0] * B[1] - mul x25, x16, x22 - umulh x6, x16, x22 - adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x17, x21 - umulh x26, x17, x21 - adds x5, x5, x25 - adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x16, x23 - umulh x26, x16, x23 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x17, x22 - umulh x26, x17, x22 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, xzr, xzr - # A[2] * B[0] - mul x25, x19, x21 - umulh x26, x19, x21 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, x8, xzr - # A[0] * B[3] - mul x25, x16, x24 - umulh x26, x16, x24 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, xzr, xzr - # A[1] * B[2] - mul x25, x17, x23 - umulh x26, x17, x23 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, x9, xzr - # A[2] * B[1] - mul x25, x19, x22 - umulh x26, x19, x22 - adds x7, x7, x25 + ldp x21, x22, [x1] + ldp x23, x24, [x1, #16] + ldp x4, x5, [x2] + ldp x6, x7, [x2, #16] + # A[0] * B[0] + umulh x17, x21, x4 + mul x16, x21, x4 + # A[2] * B[0] + umulh x20, x23, x4 + mul x19, x23, x4 + # A[1] * B[0] + mul x25, x22, x4 + adds x17, x17, x25 + umulh x26, x22, x4 + adcs x19, x19, x26 + # A[1] * B[3] + umulh x9, x22, x7 + adc x20, x20, xzr + mul x8, x22, x7 + # A[0] * B[1] + mul x25, x21, x5 + adds x17, x17, x25 + umulh x26, x21, x5 + adcs x19, x19, x26 + # A[2] * B[1] + mul x25, x23, x5 + adcs x20, x20, x25 + umulh x26, x23, x5 adcs x8, x8, x26 adc x9, x9, xzr - # A[3] * B[0] - mul x25, x20, x21 - umulh x26, x20, x21 - adds x7, x7, x25 + # A[1] * B[2] + mul x25, x22, x6 + adds x20, x20, x25 + umulh x26, x22, x6 adcs x8, x8, x26 - adc x9, x9, xzr - # A[1] * B[3] - mul x25, x17, x24 - umulh x26, x17, x24 - adds x8, x8, x25 - adcs x9, x9, x26 + adcs x9, x9, xzr adc x10, xzr, xzr - # A[2] * B[2] - mul x25, x19, x23 - umulh x26, x19, x23 - adds x8, x8, x25 + # A[0] * B[2] + mul x25, x21, x6 + adds x19, x19, x25 + umulh x26, x21, x6 + adcs x20, x20, x26 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x22, x5 + adds x19, x19, x25 + umulh x26, x22, x5 + adcs x20, x20, x26 + # A[3] * B[1] + mul x25, x24, x5 + adcs x8, x8, x25 + umulh x26, x24, x5 adcs x9, x9, x26 adc x10, x10, xzr - # A[3] * B[1] - mul x25, x20, x22 - umulh x26, x20, x22 + # A[2] * B[2] + mul x25, x23, x6 adds x8, x8, x25 + umulh x26, x23, x6 adcs x9, x9, x26 - adc x10, x10, xzr - # A[2] * B[3] - mul x25, x19, x24 - umulh x26, x19, x24 - adds x9, x9, x25 + # A[3] * B[3] + mul x25, x24, x7 + adcs x10, x10, x25 + umulh x11, x24, x7 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x21, x7 + adds x20, x20, x25 + umulh x26, x21, x7 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x23, x7 + adcs x9, x9, x25 + umulh x26, x23, x7 adcs x10, x10, x26 - adc x11, xzr, xzr - # A[3] * B[2] - mul x25, x20, x23 - umulh x26, x20, x23 - adds x9, x9, x25 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x24, x4 + adds x20, x20, x25 + umulh x26, x24, x4 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x24, x6 + adcs x9, x9, x25 + umulh x26, x24, x6 adcs x10, x10, x26 adc x11, x11, xzr - # A[3] * B[3] - mul x25, x20, x24 - umulh x26, x20, x24 - adds x10, x10, x25 - adc x11, x11, x26 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x11, x11, x10, #63 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 + mov x25, #38 + mul x26, x25, x11 + adds x20, x20, x26 + umulh x27, x25, x11 + adc x27, x27, xzr mov x25, #19 + extr x27, x27, x20, #63 + mul x27, x27, x25 + and x20, x20, #0x7fffffffffffffff + mov x25, #38 mul x26, x25, x8 + adds x16, x16, x26 umulh x8, x25, x8 - adds x4, x4, x26 mul x26, x25, x9 + adcs x17, x17, x26 umulh x9, x25, x9 - adcs x5, x5, x26 mul x26, x25, x10 + adcs x19, x19, x26 umulh x10, x25, x10 - adcs x6, x6, x26 - mul x26, x25, x11 - umulh x27, x25, x11 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x8 - adcs x6, x6, x9 - adcs x7, x7, x10 - adc x27, x27, xzr - # Overflow - extr x27, x27, x7, #63 - mul x27, x27, x25 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Store - ldr x0, [x29, #32] - ldr x1, [x29, #64] + adc x20, x20, xzr + # Add high product results in + adds x16, x16, x27 + adcs x17, x17, x8 + adcs x19, x19, x9 + adc x20, x20, x10 + sub x1, x1, #32 # Double - ldp x8, x9, [x1] - ldp x10, x11, [x1, #16] - adds x8, x8, x8 - adcs x9, x9, x9 - adcs x10, x10, x10 - adc x11, x11, x11 - mov x25, #-19 - asr x28, x11, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff - # Sub modulus (if overflow) - subs x8, x8, x25 - sbcs x9, x9, x28 - sbcs x10, x10, x28 - sbc x11, x11, x26 - ldr x1, [x29, #40] - # Add - adds x12, x8, x4 - adcs x13, x9, x5 - adcs x14, x10, x6 - adc x15, x11, x7 + ldp x12, x13, [x1] + ldp x14, x15, [x1, #16] + adds x12, x12, x12 + adcs x13, x13, x13 + adcs x14, x14, x14 + adc x15, x15, x15 mov x25, #-19 asr x28, x15, #63 # Mask the modulus @@ -6006,1487 +6983,1865 @@ sbcs x13, x13, x28 sbcs x14, x14, x28 sbc x15, x15, x26 + mov x3, x0 + sub x2, x0, #32 + sub x1, x0, #32 + # Add + adds x8, x12, x16 + adcs x9, x13, x17 + adcs x10, x14, x19 + adcs x11, x15, x20 + cset x28, cs + mov x25, #19 + extr x28, x28, x11, #63 + mul x25, x28, x25 + # Sub modulus (if overflow) + adds x8, x8, x25 + adcs x9, x9, xzr + and x11, x11, #0x7fffffffffffffff + adcs x10, x10, xzr + adc x11, x11, xzr # Sub - subs x16, x8, x4 - sbcs x17, x9, x5 - sbcs x19, x10, x6 - sbcs x20, x11, x7 - mov x25, #-19 + subs x4, x12, x16 + sbcs x5, x13, x17 + sbcs x6, x14, x19 + sbcs x7, x15, x20 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x7, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 - stp x12, x13, [x1] - stp x14, x15, [x1, #16] - stp x16, x17, [x0] - stp x19, x20, [x0, #16] - ldr x17, [x29, #88] - ldr x19, [x29, #96] - ldp x20, x21, [x29, #104] - ldp x22, x23, [x29, #120] - ldp x24, x25, [x29, #136] - ldp x26, x27, [x29, #152] - ldr x28, [x29, #168] - ldp x29, x30, [sp], #0xb0 + subs x4, x4, x25 + sbcs x5, x5, xzr + and x7, x7, #0x7fffffffffffffff + sbcs x6, x6, xzr + sbc x7, x7, xzr + stp x8, x9, [x0] + stp x10, x11, [x0, #16] + stp x4, x5, [x1] + stp x6, x7, [x1, #16] + ldr x17, [x29, #56] + ldr x19, [x29, #64] + ldp x20, x21, [x29, #72] + ldp x22, x23, [x29, #88] + ldp x24, x25, [x29, #104] + ldp x26, x27, [x29, #120] + ldr x28, [x29, #136] + ldp x29, x30, [sp], #0x90 ret #ifndef __APPLE__ - .size fe_ge_msub,.-fe_ge_msub + .size ge_msub,.-ge_msub #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_add -.type fe_ge_add,@function +.globl ge_add +.type ge_add,@function .align 2 -fe_ge_add: +ge_add: #else .section __TEXT,__text -.globl _fe_ge_add +.globl _ge_add .p2align 2 -_fe_ge_add: +_ge_add: #endif /* __APPLE__ */ - stp x29, x30, [sp, #-176]! + stp x29, x30, [sp, #-144]! add x29, sp, #0 - str x17, [x29, #88] - str x19, [x29, #96] - stp x20, x21, [x29, #104] - stp x22, x23, [x29, #120] - stp x24, x25, [x29, #136] - stp x26, x27, [x29, #152] - str x28, [x29, #168] + str x17, [x29, #56] + str x19, [x29, #64] + stp x20, x21, [x29, #72] + stp x22, x23, [x29, #88] + stp x24, x25, [x29, #104] + stp x26, x27, [x29, #120] + str x28, [x29, #136] str x0, [x29, #16] str x1, [x29, #24] str x2, [x29, #32] - str x3, [x29, #40] - str x4, [x29, #48] - str x5, [x29, #56] - str x6, [x29, #64] - str x7, [x29, #72] - ldr x2, [x29, #56] - ldr x3, [x29, #48] + mov x3, x1 + add x2, x1, #32 + add x1, x0, #32 # Add - ldp x12, x13, [x2] - ldp x14, x15, [x2, #16] - ldp x16, x17, [x3] - ldp x19, x20, [x3, #16] - adds x4, x12, x16 - adcs x5, x13, x17 - adcs x6, x14, x19 - adc x7, x15, x20 - mov x25, #-19 - asr x28, x7, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + ldp x4, x5, [x3] + ldp x6, x7, [x3, #16] + adds x16, x8, x4 + adcs x17, x9, x5 + adcs x19, x10, x6 + adcs x20, x11, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x20, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x4, x4, x25 - sbcs x5, x5, x28 - sbcs x6, x6, x28 - sbc x7, x7, x26 + adds x16, x16, x25 + adcs x17, x17, xzr + and x20, x20, #0x7fffffffffffffff + adcs x19, x19, xzr + adc x20, x20, xzr # Sub - subs x8, x12, x16 - sbcs x9, x13, x17 - sbcs x10, x14, x19 - sbcs x11, x15, x20 - mov x25, #-19 + subs x12, x8, x4 + sbcs x13, x9, x5 + sbcs x14, x10, x6 + sbcs x15, x11, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x8, x8, x25 - adcs x9, x9, x28 - adcs x10, x10, x28 - adc x11, x11, x26 - ldr x0, [x29, #32] - ldr x2, [x29, #192] + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr + ldr x2, [x29, #32] + mov x1, x0 # Multiply - ldp x21, x22, [x2] - ldp x23, x24, [x2, #16] - # A[0] * B[0] - mul x12, x4, x21 - umulh x13, x4, x21 - # A[0] * B[1] - mul x25, x4, x22 - umulh x14, x4, x22 - adds x13, x13, x25 - adc x14, x14, xzr - # A[1] * B[0] - mul x25, x5, x21 - umulh x26, x5, x21 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, xzr, xzr - # A[0] * B[2] - mul x25, x4, x23 - umulh x26, x4, x23 - adds x14, x14, x25 - adc x15, x15, x26 - # A[1] * B[1] - mul x25, x5, x22 - umulh x26, x5, x22 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x6, x21 - umulh x26, x6, x21 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x4, x24 - umulh x26, x4, x24 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x5, x23 - umulh x26, x5, x23 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x6, x22 - umulh x26, x6, x22 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x7, x21 - umulh x26, x7, x21 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x5, x24 - umulh x26, x5, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x6, x23 - umulh x26, x6, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x7, x22 - umulh x26, x7, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x6, x24 - umulh x26, x6, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x7, x23 - umulh x26, x7, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x7, x24 - umulh x26, x7, x24 - adds x19, x19, x25 - adc x20, x20, x26 + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + # A[0] * B[0] + umulh x22, x16, x8 + mul x21, x16, x8 + # A[2] * B[0] + umulh x24, x19, x8 + mul x23, x19, x8 + # A[1] * B[0] + mul x25, x17, x8 + adds x22, x22, x25 + umulh x26, x17, x8 + adcs x23, x23, x26 + # A[1] * B[3] + umulh x5, x17, x11 + adc x24, x24, xzr + mul x4, x17, x11 + # A[0] * B[1] + mul x25, x16, x9 + adds x22, x22, x25 + umulh x26, x16, x9 + adcs x23, x23, x26 + # A[2] * B[1] + mul x25, x19, x9 + adcs x24, x24, x25 + umulh x26, x19, x9 + adcs x4, x4, x26 + adc x5, x5, xzr + # A[1] * B[2] + mul x25, x17, x10 + adds x24, x24, x25 + umulh x26, x17, x10 + adcs x4, x4, x26 + adcs x5, x5, xzr + adc x6, xzr, xzr + # A[0] * B[2] + mul x25, x16, x10 + adds x23, x23, x25 + umulh x26, x16, x10 + adcs x24, x24, x26 + adcs x4, x4, xzr + adcs x5, x5, xzr + adc x6, x6, xzr + # A[1] * B[1] + mul x25, x17, x9 + adds x23, x23, x25 + umulh x26, x17, x9 + adcs x24, x24, x26 + # A[3] * B[1] + mul x25, x20, x9 + adcs x4, x4, x25 + umulh x26, x20, x9 + adcs x5, x5, x26 + adc x6, x6, xzr + # A[2] * B[2] + mul x25, x19, x10 + adds x4, x4, x25 + umulh x26, x19, x10 + adcs x5, x5, x26 + # A[3] * B[3] + mul x25, x20, x11 + adcs x6, x6, x25 + umulh x7, x20, x11 + adc x7, x7, xzr + # A[0] * B[3] + mul x25, x16, x11 + adds x24, x24, x25 + umulh x26, x16, x11 + adcs x4, x4, x26 + # A[2] * B[3] + mul x25, x19, x11 + adcs x5, x5, x25 + umulh x26, x19, x11 + adcs x6, x6, x26 + adc x7, x7, xzr + # A[3] * B[0] + mul x25, x20, x8 + adds x24, x24, x25 + umulh x26, x20, x8 + adcs x4, x4, x26 + # A[3] * B[2] + mul x25, x20, x10 + adcs x5, x5, x25 + umulh x26, x20, x10 + adcs x6, x6, x26 + adc x7, x7, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x15, #63 - and x15, x15, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x12, x12, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x13, x13, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x14, x14, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x15, x15, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x13, x13, x16 - adcs x14, x14, x17 - adcs x15, x15, x19 + mov x25, #38 + mul x26, x25, x7 + adds x24, x24, x26 + umulh x27, x25, x7 adc x27, x27, xzr - # Overflow - extr x27, x27, x15, #63 + mov x25, #19 + extr x27, x27, x24, #63 mul x27, x27, x25 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr - # Reduce if top bit set - and x27, x25, x15, asr 63 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr + and x24, x24, #0x7fffffffffffffff + mov x25, #38 + mul x26, x25, x4 + adds x21, x21, x26 + umulh x4, x25, x4 + mul x26, x25, x5 + adcs x22, x22, x26 + umulh x5, x25, x5 + mul x26, x25, x6 + adcs x23, x23, x26 + umulh x6, x25, x6 + adc x24, x24, xzr + # Add high product results in + adds x21, x21, x27 + adcs x22, x22, x4 + adcs x23, x23, x5 + adc x24, x24, x6 # Store - ldr x0, [x29, #24] - ldr x1, [x29, #200] + stp x21, x22, [x0] + stp x23, x24, [x0, #16] + add x2, x2, #32 + add x1, x0, #32 + add x0, x0, #32 # Multiply - ldp x21, x22, [x1] - ldp x23, x24, [x1, #16] - # A[0] * B[0] - mul x4, x8, x21 - umulh x5, x8, x21 - # A[0] * B[1] - mul x25, x8, x22 - umulh x6, x8, x22 + ldp x16, x17, [x2] + ldp x19, x20, [x2, #16] + # A[0] * B[0] + umulh x5, x12, x16 + mul x4, x12, x16 + # A[2] * B[0] + umulh x7, x14, x16 + mul x6, x14, x16 + # A[1] * B[0] + mul x25, x13, x16 adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x9, x21 - umulh x26, x9, x21 + umulh x26, x13, x16 + adcs x6, x6, x26 + # A[1] * B[3] + umulh x9, x13, x20 + adc x7, x7, xzr + mul x8, x13, x20 + # A[0] * B[1] + mul x25, x12, x17 adds x5, x5, x25 + umulh x26, x12, x17 adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x8, x23 - umulh x26, x8, x23 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x9, x22 - umulh x26, x9, x22 + # A[2] * B[1] + mul x25, x14, x17 + adcs x7, x7, x25 + umulh x26, x14, x17 + adcs x8, x8, x26 + adc x9, x9, xzr + # A[1] * B[2] + mul x25, x13, x19 + adds x7, x7, x25 + umulh x26, x13, x19 + adcs x8, x8, x26 + adcs x9, x9, xzr + adc x10, xzr, xzr + # A[0] * B[2] + mul x25, x12, x19 adds x6, x6, x25 + umulh x26, x12, x19 adcs x7, x7, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x10, x21 - umulh x26, x10, x21 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x13, x17 adds x6, x6, x25 + umulh x26, x13, x17 adcs x7, x7, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x8, x24 - umulh x26, x8, x24 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x9, x23 - umulh x26, x9, x23 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x10, x22 - umulh x26, x10, x22 + # A[3] * B[1] + mul x25, x15, x17 + adcs x8, x8, x25 + umulh x26, x15, x17 + adcs x9, x9, x26 + adc x10, x10, xzr + # A[2] * B[2] + mul x25, x14, x19 + adds x8, x8, x25 + umulh x26, x14, x19 + adcs x9, x9, x26 + # A[3] * B[3] + mul x25, x15, x20 + adcs x10, x10, x25 + umulh x11, x15, x20 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x12, x20 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x11, x21 - umulh x26, x11, x21 + umulh x26, x12, x20 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x14, x20 + adcs x9, x9, x25 + umulh x26, x14, x20 + adcs x10, x10, x26 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x15, x16 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x9, x24 - umulh x26, x9, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x10, x23 - umulh x26, x10, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x11, x22 - umulh x26, x11, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x10, x24 - umulh x26, x10, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x11, x23 - umulh x26, x11, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x11, x24 - umulh x26, x11, x24 - adds x19, x19, x25 - adc x20, x20, x26 + umulh x26, x15, x16 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x15, x19 + adcs x9, x9, x25 + umulh x26, x15, x19 + adcs x10, x10, x26 + adc x11, x11, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x4, x4, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x5, x5, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x6, x6, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x16 - adcs x6, x6, x17 - adcs x7, x7, x19 + mov x25, #38 + mul x26, x25, x11 + adds x7, x7, x26 + umulh x27, x25, x11 adc x27, x27, xzr - # Overflow + mov x25, #19 extr x27, x27, x7, #63 mul x27, x27, x25 and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr + mov x25, #38 + mul x26, x25, x8 + adds x4, x4, x26 + umulh x8, x25, x8 + mul x26, x25, x9 + adcs x5, x5, x26 + umulh x9, x25, x9 + mul x26, x25, x10 + adcs x6, x6, x26 + umulh x10, x25, x10 adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff + # Add high product results in adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr + adcs x5, x5, x8 + adcs x6, x6, x9 + adc x7, x7, x10 # Store - ldr x0, [x29, #24] - ldr x1, [x29, #16] + stp x4, x5, [x0] + stp x6, x7, [x0, #16] + mov x3, x0 + sub x2, x0, #32 + sub x1, x0, #32 # Add - adds x8, x12, x4 - adcs x9, x13, x5 - adcs x10, x14, x6 - adc x11, x15, x7 - mov x25, #-19 - asr x28, x11, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + adds x8, x21, x4 + adcs x9, x22, x5 + adcs x10, x23, x6 + adcs x11, x24, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x11, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x8, x8, x25 - sbcs x9, x9, x28 - sbcs x10, x10, x28 - sbc x11, x11, x26 + adds x8, x8, x25 + adcs x9, x9, xzr + and x11, x11, #0x7fffffffffffffff + adcs x10, x10, xzr + adc x11, x11, xzr # Sub - subs x16, x12, x4 - sbcs x17, x13, x5 - sbcs x19, x14, x6 - sbcs x20, x15, x7 - mov x25, #-19 + subs x12, x21, x4 + sbcs x13, x22, x5 + sbcs x14, x23, x6 + sbcs x15, x24, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr stp x8, x9, [x0] stp x10, x11, [x0, #16] - stp x16, x17, [x1] - stp x19, x20, [x1, #16] - ldr x0, [x29, #48] - ldr x1, [x29, #64] - ldr x2, [x29, #176] + stp x12, x13, [x1] + stp x14, x15, [x1, #16] + ldr x1, [x29, #24] + ldr x2, [x29, #32] + add x2, x2, #0x60 + add x1, x1, #0x60 + add x0, x0, #0x40 # Multiply - ldp x12, x13, [x1] - ldp x14, x15, [x1, #16] - ldp x16, x17, [x2] - ldp x19, x20, [x2, #16] - # A[0] * B[0] - mul x4, x12, x16 - umulh x5, x12, x16 - # A[0] * B[1] - mul x25, x12, x17 - umulh x6, x12, x17 - adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x13, x16 - umulh x26, x13, x16 - adds x5, x5, x25 - adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x12, x19 - umulh x26, x12, x19 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x13, x17 - umulh x26, x13, x17 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, xzr, xzr - # A[2] * B[0] - mul x25, x14, x16 - umulh x26, x14, x16 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, x8, xzr - # A[0] * B[3] - mul x25, x12, x20 - umulh x26, x12, x20 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, xzr, xzr - # A[1] * B[2] - mul x25, x13, x19 - umulh x26, x13, x19 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, x9, xzr - # A[2] * B[1] - mul x25, x14, x17 - umulh x26, x14, x17 - adds x7, x7, x25 + ldp x21, x22, [x1] + ldp x23, x24, [x1, #16] + ldp x4, x5, [x2] + ldp x6, x7, [x2, #16] + # A[0] * B[0] + umulh x17, x21, x4 + mul x16, x21, x4 + # A[2] * B[0] + umulh x20, x23, x4 + mul x19, x23, x4 + # A[1] * B[0] + mul x25, x22, x4 + adds x17, x17, x25 + umulh x26, x22, x4 + adcs x19, x19, x26 + # A[1] * B[3] + umulh x9, x22, x7 + adc x20, x20, xzr + mul x8, x22, x7 + # A[0] * B[1] + mul x25, x21, x5 + adds x17, x17, x25 + umulh x26, x21, x5 + adcs x19, x19, x26 + # A[2] * B[1] + mul x25, x23, x5 + adcs x20, x20, x25 + umulh x26, x23, x5 adcs x8, x8, x26 adc x9, x9, xzr - # A[3] * B[0] - mul x25, x15, x16 - umulh x26, x15, x16 - adds x7, x7, x25 + # A[1] * B[2] + mul x25, x22, x6 + adds x20, x20, x25 + umulh x26, x22, x6 adcs x8, x8, x26 - adc x9, x9, xzr - # A[1] * B[3] - mul x25, x13, x20 - umulh x26, x13, x20 - adds x8, x8, x25 - adcs x9, x9, x26 + adcs x9, x9, xzr adc x10, xzr, xzr - # A[2] * B[2] - mul x25, x14, x19 - umulh x26, x14, x19 - adds x8, x8, x25 + # A[0] * B[2] + mul x25, x21, x6 + adds x19, x19, x25 + umulh x26, x21, x6 + adcs x20, x20, x26 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x22, x5 + adds x19, x19, x25 + umulh x26, x22, x5 + adcs x20, x20, x26 + # A[3] * B[1] + mul x25, x24, x5 + adcs x8, x8, x25 + umulh x26, x24, x5 adcs x9, x9, x26 adc x10, x10, xzr - # A[3] * B[1] - mul x25, x15, x17 - umulh x26, x15, x17 + # A[2] * B[2] + mul x25, x23, x6 adds x8, x8, x25 + umulh x26, x23, x6 adcs x9, x9, x26 - adc x10, x10, xzr - # A[2] * B[3] - mul x25, x14, x20 - umulh x26, x14, x20 - adds x9, x9, x25 + # A[3] * B[3] + mul x25, x24, x7 + adcs x10, x10, x25 + umulh x11, x24, x7 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x21, x7 + adds x20, x20, x25 + umulh x26, x21, x7 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x23, x7 + adcs x9, x9, x25 + umulh x26, x23, x7 adcs x10, x10, x26 - adc x11, xzr, xzr - # A[3] * B[2] - mul x25, x15, x19 - umulh x26, x15, x19 - adds x9, x9, x25 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x24, x4 + adds x20, x20, x25 + umulh x26, x24, x4 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x24, x6 + adcs x9, x9, x25 + umulh x26, x24, x6 adcs x10, x10, x26 adc x11, x11, xzr - # A[3] * B[3] - mul x25, x15, x20 - umulh x26, x15, x20 - adds x10, x10, x25 - adc x11, x11, x26 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x11, x11, x10, #63 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 + mov x25, #38 + mul x26, x25, x11 + adds x20, x20, x26 + umulh x27, x25, x11 + adc x27, x27, xzr mov x25, #19 + extr x27, x27, x20, #63 + mul x27, x27, x25 + and x20, x20, #0x7fffffffffffffff + mov x25, #38 mul x26, x25, x8 + adds x16, x16, x26 umulh x8, x25, x8 - adds x4, x4, x26 mul x26, x25, x9 + adcs x17, x17, x26 umulh x9, x25, x9 - adcs x5, x5, x26 mul x26, x25, x10 + adcs x19, x19, x26 umulh x10, x25, x10 - adcs x6, x6, x26 - mul x26, x25, x11 - umulh x27, x25, x11 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x8 - adcs x6, x6, x9 - adcs x7, x7, x10 - adc x27, x27, xzr - # Overflow - extr x27, x27, x7, #63 - mul x27, x27, x25 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr + adc x20, x20, xzr + # Add high product results in + adds x16, x16, x27 + adcs x17, x17, x8 + adcs x19, x19, x9 + adc x20, x20, x10 # Store - ldr x0, [x29, #48] - # Double - adds x4, x4, x4 - adcs x5, x5, x5 - adcs x6, x6, x6 - adc x7, x7, x7 - mov x25, #-19 - asr x28, x7, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff - # Sub modulus (if overflow) - subs x4, x4, x25 - sbcs x5, x5, x28 - sbcs x6, x6, x28 - sbc x7, x7, x26 - ldr x0, [x29, #40] - ldr x1, [x29, #184] - ldr x2, [x29, #72] + stp x16, x17, [x0] + stp x19, x20, [x0, #16] + sub x3, x2, #32 + sub x2, x1, #32 + sub x1, x0, #32 # Multiply - ldp x16, x17, [x1] - ldp x19, x20, [x1, #16] - ldp x21, x22, [x2] - ldp x23, x24, [x2, #16] - # A[0] * B[0] - mul x8, x16, x21 - umulh x9, x16, x21 - # A[0] * B[1] - mul x25, x16, x22 - umulh x10, x16, x22 + ldp x4, x5, [x2] + ldp x6, x7, [x2, #16] + ldp x12, x13, [x3] + ldp x14, x15, [x3, #16] + # A[0] * B[0] + umulh x9, x4, x12 + mul x8, x4, x12 + # A[2] * B[0] + umulh x11, x6, x12 + mul x10, x6, x12 + # A[1] * B[0] + mul x25, x5, x12 adds x9, x9, x25 - adc x10, x10, xzr - # A[1] * B[0] - mul x25, x17, x21 - umulh x26, x17, x21 + umulh x26, x5, x12 + adcs x10, x10, x26 + # A[1] * B[3] + umulh x17, x5, x15 + adc x11, x11, xzr + mul x16, x5, x15 + # A[0] * B[1] + mul x25, x4, x13 adds x9, x9, x25 + umulh x26, x4, x13 adcs x10, x10, x26 - adc x11, xzr, xzr - # A[0] * B[2] - mul x25, x16, x23 - umulh x26, x16, x23 - adds x10, x10, x25 - adc x11, x11, x26 - # A[1] * B[1] - mul x25, x17, x22 - umulh x26, x17, x22 + # A[2] * B[1] + mul x25, x6, x13 + adcs x11, x11, x25 + umulh x26, x6, x13 + adcs x16, x16, x26 + adc x17, x17, xzr + # A[1] * B[2] + mul x25, x5, x14 + adds x11, x11, x25 + umulh x26, x5, x14 + adcs x16, x16, x26 + adcs x17, x17, xzr + adc x19, xzr, xzr + # A[0] * B[2] + mul x25, x4, x14 adds x10, x10, x25 + umulh x26, x4, x14 adcs x11, x11, x26 - adc x12, xzr, xzr - # A[2] * B[0] - mul x25, x19, x21 - umulh x26, x19, x21 + adcs x16, x16, xzr + adcs x17, x17, xzr + adc x19, x19, xzr + # A[1] * B[1] + mul x25, x5, x13 adds x10, x10, x25 + umulh x26, x5, x13 adcs x11, x11, x26 - adc x12, x12, xzr - # A[0] * B[3] - mul x25, x16, x24 - umulh x26, x16, x24 - adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, xzr, xzr - # A[1] * B[2] - mul x25, x17, x23 - umulh x26, x17, x23 - adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, x13, xzr - # A[2] * B[1] - mul x25, x19, x22 - umulh x26, x19, x22 + # A[3] * B[1] + mul x25, x7, x13 + adcs x16, x16, x25 + umulh x26, x7, x13 + adcs x17, x17, x26 + adc x19, x19, xzr + # A[2] * B[2] + mul x25, x6, x14 + adds x16, x16, x25 + umulh x26, x6, x14 + adcs x17, x17, x26 + # A[3] * B[3] + mul x25, x7, x15 + adcs x19, x19, x25 + umulh x20, x7, x15 + adc x20, x20, xzr + # A[0] * B[3] + mul x25, x4, x15 adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, x13, xzr - # A[3] * B[0] - mul x25, x20, x21 - umulh x26, x20, x21 + umulh x26, x4, x15 + adcs x16, x16, x26 + # A[2] * B[3] + mul x25, x6, x15 + adcs x17, x17, x25 + umulh x26, x6, x15 + adcs x19, x19, x26 + adc x20, x20, xzr + # A[3] * B[0] + mul x25, x7, x12 adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, x13, xzr - # A[1] * B[3] - mul x25, x17, x24 - umulh x26, x17, x24 - adds x12, x12, x25 - adcs x13, x13, x26 - adc x14, xzr, xzr - # A[2] * B[2] - mul x25, x19, x23 - umulh x26, x19, x23 - adds x12, x12, x25 - adcs x13, x13, x26 - adc x14, x14, xzr - # A[3] * B[1] - mul x25, x20, x22 - umulh x26, x20, x22 - adds x12, x12, x25 - adcs x13, x13, x26 - adc x14, x14, xzr - # A[2] * B[3] - mul x25, x19, x24 - umulh x26, x19, x24 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, xzr, xzr - # A[3] * B[2] - mul x25, x20, x23 - umulh x26, x20, x23 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, x15, xzr - # A[3] * B[3] - mul x25, x20, x24 - umulh x26, x20, x24 - adds x14, x14, x25 - adc x15, x15, x26 + umulh x26, x7, x12 + adcs x16, x16, x26 + # A[3] * B[2] + mul x25, x7, x14 + adcs x17, x17, x25 + umulh x26, x7, x14 + adcs x19, x19, x26 + adc x20, x20, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x15, x15, x14, #63 - extr x14, x14, x13, #63 - extr x13, x13, x12, #63 - extr x12, x12, x11, #63 - and x11, x11, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x12 - umulh x12, x25, x12 - adds x8, x8, x26 - mul x26, x25, x13 - umulh x13, x25, x13 - adcs x9, x9, x26 - mul x26, x25, x14 - umulh x14, x25, x14 - adcs x10, x10, x26 - mul x26, x25, x15 - umulh x27, x25, x15 - adcs x11, x11, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x9, x9, x12 - adcs x10, x10, x13 - adcs x11, x11, x14 + mov x25, #38 + mul x26, x25, x20 + adds x11, x11, x26 + umulh x27, x25, x20 adc x27, x27, xzr - # Overflow + mov x25, #19 extr x27, x27, x11, #63 mul x27, x27, x25 and x11, x11, #0x7fffffffffffffff - adds x8, x8, x27 - adcs x9, x9, xzr - adcs x10, x10, xzr + mov x25, #38 + mul x26, x25, x16 + adds x8, x8, x26 + umulh x16, x25, x16 + mul x26, x25, x17 + adcs x9, x9, x26 + umulh x17, x25, x17 + mul x26, x25, x19 + adcs x10, x10, x26 + umulh x19, x25, x19 adc x11, x11, xzr - # Reduce if top bit set - and x27, x25, x11, asr 63 - and x11, x11, #0x7fffffffffffffff + # Add high product results in adds x8, x8, x27 - adcs x9, x9, xzr - adcs x10, x10, xzr - adc x11, x11, xzr - # Store - ldr x0, [x29, #32] - ldr x1, [x29, #40] - # Add - adds x12, x4, x8 - adcs x13, x5, x9 - adcs x14, x6, x10 - adc x15, x7, x11 + adcs x9, x9, x16 + adcs x10, x10, x17 + adc x11, x11, x19 + # Double + adds x8, x8, x8 + adcs x9, x9, x9 + adcs x10, x10, x10 + adc x11, x11, x11 mov x25, #-19 - asr x28, x15, #63 + asr x28, x11, #63 # Mask the modulus and x25, x28, x25 and x26, x28, #0x7fffffffffffffff # Sub modulus (if overflow) - subs x12, x12, x25 - sbcs x13, x13, x28 - sbcs x14, x14, x28 - sbc x15, x15, x26 + subs x8, x8, x25 + sbcs x9, x9, x28 + sbcs x10, x10, x28 + sbc x11, x11, x26 + mov x3, x0 + sub x2, x0, #32 + mov x1, x0 + sub x0, x0, #32 + # Add + ldp x4, x5, [x3] + ldp x6, x7, [x3, #16] + adds x21, x8, x4 + adcs x22, x9, x5 + adcs x23, x10, x6 + adcs x24, x11, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x24, #63 + mul x25, x28, x25 + # Sub modulus (if overflow) + adds x21, x21, x25 + adcs x22, x22, xzr + and x24, x24, #0x7fffffffffffffff + adcs x23, x23, xzr + adc x24, x24, xzr # Sub - subs x16, x4, x8 - sbcs x17, x5, x9 - sbcs x19, x6, x10 - sbcs x20, x7, x11 - mov x25, #-19 + subs x12, x8, x4 + sbcs x13, x9, x5 + sbcs x14, x10, x6 + sbcs x15, x11, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 - stp x12, x13, [x0] - stp x14, x15, [x0, #16] - stp x16, x17, [x1] - stp x19, x20, [x1, #16] - ldr x17, [x29, #88] - ldr x19, [x29, #96] - ldp x20, x21, [x29, #104] - ldp x22, x23, [x29, #120] - ldp x24, x25, [x29, #136] - ldp x26, x27, [x29, #152] - ldr x28, [x29, #168] - ldp x29, x30, [sp], #0xb0 + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr + stp x21, x22, [x0] + stp x23, x24, [x0, #16] + stp x12, x13, [x1] + stp x14, x15, [x1, #16] + ldr x17, [x29, #56] + ldr x19, [x29, #64] + ldp x20, x21, [x29, #72] + ldp x22, x23, [x29, #88] + ldp x24, x25, [x29, #104] + ldp x26, x27, [x29, #120] + ldr x28, [x29, #136] + ldp x29, x30, [sp], #0x90 ret #ifndef __APPLE__ - .size fe_ge_add,.-fe_ge_add + .size ge_add,.-ge_add #endif /* __APPLE__ */ #ifndef __APPLE__ .text -.globl fe_ge_sub -.type fe_ge_sub,@function +.globl ge_sub +.type ge_sub,@function .align 2 -fe_ge_sub: +ge_sub: #else .section __TEXT,__text -.globl _fe_ge_sub +.globl _ge_sub .p2align 2 -_fe_ge_sub: +_ge_sub: #endif /* __APPLE__ */ - stp x29, x30, [sp, #-176]! + stp x29, x30, [sp, #-144]! add x29, sp, #0 - str x17, [x29, #88] - str x19, [x29, #96] - stp x20, x21, [x29, #104] - stp x22, x23, [x29, #120] - stp x24, x25, [x29, #136] - stp x26, x27, [x29, #152] - str x28, [x29, #168] + str x17, [x29, #56] + str x19, [x29, #64] + stp x20, x21, [x29, #72] + stp x22, x23, [x29, #88] + stp x24, x25, [x29, #104] + stp x26, x27, [x29, #120] + str x28, [x29, #136] str x0, [x29, #16] str x1, [x29, #24] str x2, [x29, #32] - str x3, [x29, #40] - str x4, [x29, #48] - str x5, [x29, #56] - str x6, [x29, #64] - str x7, [x29, #72] - ldr x2, [x29, #56] - ldr x3, [x29, #48] + mov x3, x1 + add x2, x1, #32 + add x1, x0, #32 # Add - ldp x12, x13, [x2] - ldp x14, x15, [x2, #16] - ldp x16, x17, [x3] - ldp x19, x20, [x3, #16] - adds x4, x12, x16 - adcs x5, x13, x17 - adcs x6, x14, x19 - adc x7, x15, x20 - mov x25, #-19 - asr x28, x7, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + ldp x4, x5, [x3] + ldp x6, x7, [x3, #16] + adds x16, x8, x4 + adcs x17, x9, x5 + adcs x19, x10, x6 + adcs x20, x11, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x20, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x4, x4, x25 - sbcs x5, x5, x28 - sbcs x6, x6, x28 - sbc x7, x7, x26 + adds x16, x16, x25 + adcs x17, x17, xzr + and x20, x20, #0x7fffffffffffffff + adcs x19, x19, xzr + adc x20, x20, xzr # Sub - subs x8, x12, x16 - sbcs x9, x13, x17 - sbcs x10, x14, x19 - sbcs x11, x15, x20 - mov x25, #-19 + subs x12, x8, x4 + sbcs x13, x9, x5 + sbcs x14, x10, x6 + sbcs x15, x11, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x8, x8, x25 - adcs x9, x9, x28 - adcs x10, x10, x28 - adc x11, x11, x26 - ldr x0, [x29, #32] - ldr x2, [x29, #200] + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr + ldr x2, [x29, #32] + add x2, x2, #32 + mov x1, x0 # Multiply - ldp x21, x22, [x2] - ldp x23, x24, [x2, #16] - # A[0] * B[0] - mul x12, x4, x21 - umulh x13, x4, x21 - # A[0] * B[1] - mul x25, x4, x22 - umulh x14, x4, x22 - adds x13, x13, x25 - adc x14, x14, xzr - # A[1] * B[0] - mul x25, x5, x21 - umulh x26, x5, x21 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, xzr, xzr - # A[0] * B[2] - mul x25, x4, x23 - umulh x26, x4, x23 - adds x14, x14, x25 - adc x15, x15, x26 - # A[1] * B[1] - mul x25, x5, x22 - umulh x26, x5, x22 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x6, x21 - umulh x26, x6, x21 - adds x14, x14, x25 - adcs x15, x15, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x4, x24 - umulh x26, x4, x24 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x5, x23 - umulh x26, x5, x23 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x6, x22 - umulh x26, x6, x22 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x7, x21 - umulh x26, x7, x21 - adds x15, x15, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x5, x24 - umulh x26, x5, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x6, x23 - umulh x26, x6, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x7, x22 - umulh x26, x7, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x6, x24 - umulh x26, x6, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x7, x23 - umulh x26, x7, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x7, x24 - umulh x26, x7, x24 - adds x19, x19, x25 - adc x20, x20, x26 + ldp x8, x9, [x2] + ldp x10, x11, [x2, #16] + # A[0] * B[0] + umulh x22, x16, x8 + mul x21, x16, x8 + # A[2] * B[0] + umulh x24, x19, x8 + mul x23, x19, x8 + # A[1] * B[0] + mul x25, x17, x8 + adds x22, x22, x25 + umulh x26, x17, x8 + adcs x23, x23, x26 + # A[1] * B[3] + umulh x5, x17, x11 + adc x24, x24, xzr + mul x4, x17, x11 + # A[0] * B[1] + mul x25, x16, x9 + adds x22, x22, x25 + umulh x26, x16, x9 + adcs x23, x23, x26 + # A[2] * B[1] + mul x25, x19, x9 + adcs x24, x24, x25 + umulh x26, x19, x9 + adcs x4, x4, x26 + adc x5, x5, xzr + # A[1] * B[2] + mul x25, x17, x10 + adds x24, x24, x25 + umulh x26, x17, x10 + adcs x4, x4, x26 + adcs x5, x5, xzr + adc x6, xzr, xzr + # A[0] * B[2] + mul x25, x16, x10 + adds x23, x23, x25 + umulh x26, x16, x10 + adcs x24, x24, x26 + adcs x4, x4, xzr + adcs x5, x5, xzr + adc x6, x6, xzr + # A[1] * B[1] + mul x25, x17, x9 + adds x23, x23, x25 + umulh x26, x17, x9 + adcs x24, x24, x26 + # A[3] * B[1] + mul x25, x20, x9 + adcs x4, x4, x25 + umulh x26, x20, x9 + adcs x5, x5, x26 + adc x6, x6, xzr + # A[2] * B[2] + mul x25, x19, x10 + adds x4, x4, x25 + umulh x26, x19, x10 + adcs x5, x5, x26 + # A[3] * B[3] + mul x25, x20, x11 + adcs x6, x6, x25 + umulh x7, x20, x11 + adc x7, x7, xzr + # A[0] * B[3] + mul x25, x16, x11 + adds x24, x24, x25 + umulh x26, x16, x11 + adcs x4, x4, x26 + # A[2] * B[3] + mul x25, x19, x11 + adcs x5, x5, x25 + umulh x26, x19, x11 + adcs x6, x6, x26 + adc x7, x7, xzr + # A[3] * B[0] + mul x25, x20, x8 + adds x24, x24, x25 + umulh x26, x20, x8 + adcs x4, x4, x26 + # A[3] * B[2] + mul x25, x20, x10 + adcs x5, x5, x25 + umulh x26, x20, x10 + adcs x6, x6, x26 + adc x7, x7, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x15, #63 - and x15, x15, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x12, x12, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x13, x13, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x14, x14, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x15, x15, x26 + mov x25, #38 + mul x26, x25, x7 + adds x24, x24, x26 + umulh x27, x25, x7 adc x27, x27, xzr - # Add remaining product results in - adds x13, x13, x16 - adcs x14, x14, x17 - adcs x15, x15, x19 - adc x27, x27, xzr - # Overflow - extr x27, x27, x15, #63 + mov x25, #19 + extr x27, x27, x24, #63 mul x27, x27, x25 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr + and x24, x24, #0x7fffffffffffffff + mov x25, #38 + mul x26, x25, x4 + adds x21, x21, x26 + umulh x4, x25, x4 + mul x26, x25, x5 + adcs x22, x22, x26 + umulh x5, x25, x5 + mul x26, x25, x6 + adcs x23, x23, x26 + umulh x6, x25, x6 + adc x24, x24, xzr + # Add high product results in + adds x21, x21, x27 + adcs x22, x22, x4 + adcs x23, x23, x5 + adc x24, x24, x6 # Reduce if top bit set - and x27, x25, x15, asr 63 - and x15, x15, #0x7fffffffffffffff - adds x12, x12, x27 - adcs x13, x13, xzr - adcs x14, x14, xzr - adc x15, x15, xzr + mov x25, #19 + and x26, x25, x24, asr 63 + adds x21, x21, x26 + adcs x22, x22, xzr + and x24, x24, #0x7fffffffffffffff + adcs x23, x23, xzr + adc x24, x24, xzr # Store - ldr x0, [x29, #24] - ldr x1, [x29, #192] + stp x21, x22, [x0] + stp x23, x24, [x0, #16] + sub x2, x2, #32 + add x1, x0, #32 + add x0, x0, #32 # Multiply - ldp x21, x22, [x1] - ldp x23, x24, [x1, #16] - # A[0] * B[0] - mul x4, x8, x21 - umulh x5, x8, x21 - # A[0] * B[1] - mul x25, x8, x22 - umulh x6, x8, x22 + ldp x16, x17, [x2] + ldp x19, x20, [x2, #16] + # A[0] * B[0] + umulh x5, x12, x16 + mul x4, x12, x16 + # A[2] * B[0] + umulh x7, x14, x16 + mul x6, x14, x16 + # A[1] * B[0] + mul x25, x13, x16 adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x9, x21 - umulh x26, x9, x21 + umulh x26, x13, x16 + adcs x6, x6, x26 + # A[1] * B[3] + umulh x9, x13, x20 + adc x7, x7, xzr + mul x8, x13, x20 + # A[0] * B[1] + mul x25, x12, x17 adds x5, x5, x25 + umulh x26, x12, x17 adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x8, x23 - umulh x26, x8, x23 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x9, x22 - umulh x26, x9, x22 + # A[2] * B[1] + mul x25, x14, x17 + adcs x7, x7, x25 + umulh x26, x14, x17 + adcs x8, x8, x26 + adc x9, x9, xzr + # A[1] * B[2] + mul x25, x13, x19 + adds x7, x7, x25 + umulh x26, x13, x19 + adcs x8, x8, x26 + adcs x9, x9, xzr + adc x10, xzr, xzr + # A[0] * B[2] + mul x25, x12, x19 adds x6, x6, x25 + umulh x26, x12, x19 adcs x7, x7, x26 - adc x16, xzr, xzr - # A[2] * B[0] - mul x25, x10, x21 - umulh x26, x10, x21 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x13, x17 adds x6, x6, x25 + umulh x26, x13, x17 adcs x7, x7, x26 - adc x16, x16, xzr - # A[0] * B[3] - mul x25, x8, x24 - umulh x26, x8, x24 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, xzr, xzr - # A[1] * B[2] - mul x25, x9, x23 - umulh x26, x9, x23 - adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[2] * B[1] - mul x25, x10, x22 - umulh x26, x10, x22 + # A[3] * B[1] + mul x25, x15, x17 + adcs x8, x8, x25 + umulh x26, x15, x17 + adcs x9, x9, x26 + adc x10, x10, xzr + # A[2] * B[2] + mul x25, x14, x19 + adds x8, x8, x25 + umulh x26, x14, x19 + adcs x9, x9, x26 + # A[3] * B[3] + mul x25, x15, x20 + adcs x10, x10, x25 + umulh x11, x15, x20 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x12, x20 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[3] * B[0] - mul x25, x11, x21 - umulh x26, x11, x21 + umulh x26, x12, x20 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x14, x20 + adcs x9, x9, x25 + umulh x26, x14, x20 + adcs x10, x10, x26 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x15, x16 adds x7, x7, x25 - adcs x16, x16, x26 - adc x17, x17, xzr - # A[1] * B[3] - mul x25, x9, x24 - umulh x26, x9, x24 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, xzr, xzr - # A[2] * B[2] - mul x25, x10, x23 - umulh x26, x10, x23 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[3] * B[1] - mul x25, x11, x22 - umulh x26, x11, x22 - adds x16, x16, x25 - adcs x17, x17, x26 - adc x19, x19, xzr - # A[2] * B[3] - mul x25, x10, x24 - umulh x26, x10, x24 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, xzr, xzr - # A[3] * B[2] - mul x25, x11, x23 - umulh x26, x11, x23 - adds x17, x17, x25 - adcs x19, x19, x26 - adc x20, x20, xzr - # A[3] * B[3] - mul x25, x11, x24 - umulh x26, x11, x24 - adds x19, x19, x25 - adc x20, x20, x26 + umulh x26, x15, x16 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x15, x19 + adcs x9, x9, x25 + umulh x26, x15, x19 + adcs x10, x10, x26 + adc x11, x11, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x20, x20, x19, #63 - extr x19, x19, x17, #63 - extr x17, x17, x16, #63 - extr x16, x16, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x16 - umulh x16, x25, x16 - adds x4, x4, x26 - mul x26, x25, x17 - umulh x17, x25, x17 - adcs x5, x5, x26 - mul x26, x25, x19 - umulh x19, x25, x19 - adcs x6, x6, x26 - mul x26, x25, x20 - umulh x27, x25, x20 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x16 - adcs x6, x6, x17 - adcs x7, x7, x19 + mov x25, #38 + mul x26, x25, x11 + adds x7, x7, x26 + umulh x27, x25, x11 adc x27, x27, xzr - # Overflow + mov x25, #19 extr x27, x27, x7, #63 mul x27, x27, x25 and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr + mov x25, #38 + mul x26, x25, x8 + adds x4, x4, x26 + umulh x8, x25, x8 + mul x26, x25, x9 + adcs x5, x5, x26 + umulh x9, x25, x9 + mul x26, x25, x10 + adcs x6, x6, x26 + umulh x10, x25, x10 adc x7, x7, xzr - # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff + # Add high product results in adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr + adcs x5, x5, x8 + adcs x6, x6, x9 + adc x7, x7, x10 # Store - ldr x0, [x29, #24] - ldr x1, [x29, #16] + stp x4, x5, [x0] + stp x6, x7, [x0, #16] + mov x3, x0 + sub x2, x0, #32 + sub x1, x0, #32 # Add - adds x8, x12, x4 - adcs x9, x13, x5 - adcs x10, x14, x6 - adc x11, x15, x7 - mov x25, #-19 - asr x28, x11, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + adds x8, x21, x4 + adcs x9, x22, x5 + adcs x10, x23, x6 + adcs x11, x24, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x11, #63 + mul x25, x28, x25 # Sub modulus (if overflow) - subs x8, x8, x25 - sbcs x9, x9, x28 - sbcs x10, x10, x28 - sbc x11, x11, x26 + adds x8, x8, x25 + adcs x9, x9, xzr + and x11, x11, #0x7fffffffffffffff + adcs x10, x10, xzr + adc x11, x11, xzr # Sub - subs x16, x12, x4 - sbcs x17, x13, x5 - sbcs x19, x14, x6 - sbcs x20, x15, x7 - mov x25, #-19 + subs x12, x21, x4 + sbcs x13, x22, x5 + sbcs x14, x23, x6 + sbcs x15, x24, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x15, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 + subs x12, x12, x25 + sbcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + sbcs x14, x14, xzr + sbc x15, x15, xzr stp x8, x9, [x0] stp x10, x11, [x0, #16] - stp x16, x17, [x1] - stp x19, x20, [x1, #16] - ldr x0, [x29, #48] - ldr x1, [x29, #64] - ldr x2, [x29, #176] + stp x12, x13, [x1] + stp x14, x15, [x1, #16] + ldr x1, [x29, #24] + ldr x2, [x29, #32] + add x2, x2, #0x60 + add x1, x1, #0x60 + add x0, x0, #0x40 # Multiply - ldp x12, x13, [x1] - ldp x14, x15, [x1, #16] - ldp x16, x17, [x2] - ldp x19, x20, [x2, #16] - # A[0] * B[0] - mul x4, x12, x16 - umulh x5, x12, x16 - # A[0] * B[1] - mul x25, x12, x17 - umulh x6, x12, x17 - adds x5, x5, x25 - adc x6, x6, xzr - # A[1] * B[0] - mul x25, x13, x16 - umulh x26, x13, x16 - adds x5, x5, x25 - adcs x6, x6, x26 - adc x7, xzr, xzr - # A[0] * B[2] - mul x25, x12, x19 - umulh x26, x12, x19 - adds x6, x6, x25 - adc x7, x7, x26 - # A[1] * B[1] - mul x25, x13, x17 - umulh x26, x13, x17 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, xzr, xzr - # A[2] * B[0] - mul x25, x14, x16 - umulh x26, x14, x16 - adds x6, x6, x25 - adcs x7, x7, x26 - adc x8, x8, xzr - # A[0] * B[3] - mul x25, x12, x20 - umulh x26, x12, x20 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, xzr, xzr - # A[1] * B[2] - mul x25, x13, x19 - umulh x26, x13, x19 - adds x7, x7, x25 - adcs x8, x8, x26 - adc x9, x9, xzr - # A[2] * B[1] - mul x25, x14, x17 - umulh x26, x14, x17 - adds x7, x7, x25 + ldp x21, x22, [x1] + ldp x23, x24, [x1, #16] + ldp x4, x5, [x2] + ldp x6, x7, [x2, #16] + # A[0] * B[0] + umulh x17, x21, x4 + mul x16, x21, x4 + # A[2] * B[0] + umulh x20, x23, x4 + mul x19, x23, x4 + # A[1] * B[0] + mul x25, x22, x4 + adds x17, x17, x25 + umulh x26, x22, x4 + adcs x19, x19, x26 + # A[1] * B[3] + umulh x9, x22, x7 + adc x20, x20, xzr + mul x8, x22, x7 + # A[0] * B[1] + mul x25, x21, x5 + adds x17, x17, x25 + umulh x26, x21, x5 + adcs x19, x19, x26 + # A[2] * B[1] + mul x25, x23, x5 + adcs x20, x20, x25 + umulh x26, x23, x5 adcs x8, x8, x26 adc x9, x9, xzr - # A[3] * B[0] - mul x25, x15, x16 - umulh x26, x15, x16 - adds x7, x7, x25 + # A[1] * B[2] + mul x25, x22, x6 + adds x20, x20, x25 + umulh x26, x22, x6 adcs x8, x8, x26 - adc x9, x9, xzr - # A[1] * B[3] - mul x25, x13, x20 - umulh x26, x13, x20 - adds x8, x8, x25 - adcs x9, x9, x26 + adcs x9, x9, xzr adc x10, xzr, xzr - # A[2] * B[2] - mul x25, x14, x19 - umulh x26, x14, x19 - adds x8, x8, x25 + # A[0] * B[2] + mul x25, x21, x6 + adds x19, x19, x25 + umulh x26, x21, x6 + adcs x20, x20, x26 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x25, x22, x5 + adds x19, x19, x25 + umulh x26, x22, x5 + adcs x20, x20, x26 + # A[3] * B[1] + mul x25, x24, x5 + adcs x8, x8, x25 + umulh x26, x24, x5 adcs x9, x9, x26 adc x10, x10, xzr - # A[3] * B[1] - mul x25, x15, x17 - umulh x26, x15, x17 + # A[2] * B[2] + mul x25, x23, x6 adds x8, x8, x25 + umulh x26, x23, x6 adcs x9, x9, x26 - adc x10, x10, xzr - # A[2] * B[3] - mul x25, x14, x20 - umulh x26, x14, x20 - adds x9, x9, x25 + # A[3] * B[3] + mul x25, x24, x7 + adcs x10, x10, x25 + umulh x11, x24, x7 + adc x11, x11, xzr + # A[0] * B[3] + mul x25, x21, x7 + adds x20, x20, x25 + umulh x26, x21, x7 + adcs x8, x8, x26 + # A[2] * B[3] + mul x25, x23, x7 + adcs x9, x9, x25 + umulh x26, x23, x7 adcs x10, x10, x26 - adc x11, xzr, xzr - # A[3] * B[2] - mul x25, x15, x19 - umulh x26, x15, x19 - adds x9, x9, x25 + adc x11, x11, xzr + # A[3] * B[0] + mul x25, x24, x4 + adds x20, x20, x25 + umulh x26, x24, x4 + adcs x8, x8, x26 + # A[3] * B[2] + mul x25, x24, x6 + adcs x9, x9, x25 + umulh x26, x24, x6 adcs x10, x10, x26 adc x11, x11, xzr - # A[3] * B[3] - mul x25, x15, x20 - umulh x26, x15, x20 - adds x10, x10, x25 - adc x11, x11, x26 # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x11, x11, x10, #63 - extr x10, x10, x9, #63 - extr x9, x9, x8, #63 - extr x8, x8, x7, #63 - and x7, x7, #0x7fffffffffffffff - # Multiply top half by 19 + mov x25, #38 + mul x26, x25, x11 + adds x20, x20, x26 + umulh x27, x25, x11 + adc x27, x27, xzr mov x25, #19 + extr x27, x27, x20, #63 + mul x27, x27, x25 + and x20, x20, #0x7fffffffffffffff + mov x25, #38 mul x26, x25, x8 + adds x16, x16, x26 umulh x8, x25, x8 - adds x4, x4, x26 mul x26, x25, x9 + adcs x17, x17, x26 umulh x9, x25, x9 - adcs x5, x5, x26 mul x26, x25, x10 + adcs x19, x19, x26 umulh x10, x25, x10 - adcs x6, x6, x26 - mul x26, x25, x11 - umulh x27, x25, x11 - adcs x7, x7, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x5, x5, x8 - adcs x6, x6, x9 - adcs x7, x7, x10 - adc x27, x27, xzr - # Overflow - extr x27, x27, x7, #63 - mul x27, x27, x25 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr + adc x20, x20, xzr + # Add high product results in + adds x16, x16, x27 + adcs x17, x17, x8 + adcs x19, x19, x9 + adc x20, x20, x10 # Reduce if top bit set - and x27, x25, x7, asr 63 - and x7, x7, #0x7fffffffffffffff - adds x4, x4, x27 - adcs x5, x5, xzr - adcs x6, x6, xzr - adc x7, x7, xzr + mov x25, #19 + and x26, x25, x20, asr 63 + adds x16, x16, x26 + adcs x17, x17, xzr + and x20, x20, #0x7fffffffffffffff + adcs x19, x19, xzr + adc x20, x20, xzr # Store - ldr x0, [x29, #48] - # Double - adds x4, x4, x4 - adcs x5, x5, x5 - adcs x6, x6, x6 - adc x7, x7, x7 - mov x25, #-19 - asr x28, x7, #63 - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff - # Sub modulus (if overflow) - subs x4, x4, x25 - sbcs x5, x5, x28 - sbcs x6, x6, x28 - sbc x7, x7, x26 - ldr x0, [x29, #40] - ldr x1, [x29, #184] - ldr x2, [x29, #72] + stp x16, x17, [x0] + stp x19, x20, [x0, #16] + sub x3, x2, #32 + sub x2, x1, #32 + sub x1, x0, #32 # Multiply - ldp x16, x17, [x1] - ldp x19, x20, [x1, #16] - ldp x21, x22, [x2] - ldp x23, x24, [x2, #16] - # A[0] * B[0] - mul x8, x16, x21 - umulh x9, x16, x21 - # A[0] * B[1] - mul x25, x16, x22 - umulh x10, x16, x22 + ldp x4, x5, [x2] + ldp x6, x7, [x2, #16] + ldp x12, x13, [x3] + ldp x14, x15, [x3, #16] + # A[0] * B[0] + umulh x9, x4, x12 + mul x8, x4, x12 + # A[2] * B[0] + umulh x11, x6, x12 + mul x10, x6, x12 + # A[1] * B[0] + mul x25, x5, x12 adds x9, x9, x25 - adc x10, x10, xzr - # A[1] * B[0] - mul x25, x17, x21 - umulh x26, x17, x21 + umulh x26, x5, x12 + adcs x10, x10, x26 + # A[1] * B[3] + umulh x17, x5, x15 + adc x11, x11, xzr + mul x16, x5, x15 + # A[0] * B[1] + mul x25, x4, x13 adds x9, x9, x25 + umulh x26, x4, x13 adcs x10, x10, x26 - adc x11, xzr, xzr - # A[0] * B[2] - mul x25, x16, x23 - umulh x26, x16, x23 - adds x10, x10, x25 - adc x11, x11, x26 - # A[1] * B[1] - mul x25, x17, x22 - umulh x26, x17, x22 + # A[2] * B[1] + mul x25, x6, x13 + adcs x11, x11, x25 + umulh x26, x6, x13 + adcs x16, x16, x26 + adc x17, x17, xzr + # A[1] * B[2] + mul x25, x5, x14 + adds x11, x11, x25 + umulh x26, x5, x14 + adcs x16, x16, x26 + adcs x17, x17, xzr + adc x19, xzr, xzr + # A[0] * B[2] + mul x25, x4, x14 adds x10, x10, x25 + umulh x26, x4, x14 adcs x11, x11, x26 - adc x12, xzr, xzr - # A[2] * B[0] - mul x25, x19, x21 - umulh x26, x19, x21 + adcs x16, x16, xzr + adcs x17, x17, xzr + adc x19, x19, xzr + # A[1] * B[1] + mul x25, x5, x13 adds x10, x10, x25 + umulh x26, x5, x13 adcs x11, x11, x26 - adc x12, x12, xzr - # A[0] * B[3] - mul x25, x16, x24 - umulh x26, x16, x24 - adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, xzr, xzr - # A[1] * B[2] - mul x25, x17, x23 - umulh x26, x17, x23 - adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, x13, xzr - # A[2] * B[1] - mul x25, x19, x22 - umulh x26, x19, x22 + # A[3] * B[1] + mul x25, x7, x13 + adcs x16, x16, x25 + umulh x26, x7, x13 + adcs x17, x17, x26 + adc x19, x19, xzr + # A[2] * B[2] + mul x25, x6, x14 + adds x16, x16, x25 + umulh x26, x6, x14 + adcs x17, x17, x26 + # A[3] * B[3] + mul x25, x7, x15 + adcs x19, x19, x25 + umulh x20, x7, x15 + adc x20, x20, xzr + # A[0] * B[3] + mul x25, x4, x15 adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, x13, xzr - # A[3] * B[0] - mul x25, x20, x21 - umulh x26, x20, x21 + umulh x26, x4, x15 + adcs x16, x16, x26 + # A[2] * B[3] + mul x25, x6, x15 + adcs x17, x17, x25 + umulh x26, x6, x15 + adcs x19, x19, x26 + adc x20, x20, xzr + # A[3] * B[0] + mul x25, x7, x12 adds x11, x11, x25 - adcs x12, x12, x26 - adc x13, x13, xzr - # A[1] * B[3] - mul x25, x17, x24 - umulh x26, x17, x24 - adds x12, x12, x25 - adcs x13, x13, x26 - adc x14, xzr, xzr - # A[2] * B[2] - mul x25, x19, x23 - umulh x26, x19, x23 - adds x12, x12, x25 - adcs x13, x13, x26 - adc x14, x14, xzr - # A[3] * B[1] - mul x25, x20, x22 - umulh x26, x20, x22 - adds x12, x12, x25 - adcs x13, x13, x26 - adc x14, x14, xzr - # A[2] * B[3] - mul x25, x19, x24 - umulh x26, x19, x24 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, xzr, xzr - # A[3] * B[2] - mul x25, x20, x23 - umulh x26, x20, x23 - adds x13, x13, x25 - adcs x14, x14, x26 - adc x15, x15, xzr - # A[3] * B[3] - mul x25, x20, x24 - umulh x26, x20, x24 - adds x14, x14, x25 - adc x15, x15, x26 + umulh x26, x7, x12 + adcs x16, x16, x26 + # A[3] * B[2] + mul x25, x7, x14 + adcs x17, x17, x25 + umulh x26, x7, x14 + adcs x19, x19, x26 + adc x20, x20, xzr # Reduce - # Move top half into t4-t7 and remove top bit from t3 - extr x15, x15, x14, #63 - extr x14, x14, x13, #63 - extr x13, x13, x12, #63 - extr x12, x12, x11, #63 - and x11, x11, #0x7fffffffffffffff - # Multiply top half by 19 - mov x25, #19 - mul x26, x25, x12 - umulh x12, x25, x12 - adds x8, x8, x26 - mul x26, x25, x13 - umulh x13, x25, x13 - adcs x9, x9, x26 - mul x26, x25, x14 - umulh x14, x25, x14 - adcs x10, x10, x26 - mul x26, x25, x15 - umulh x27, x25, x15 - adcs x11, x11, x26 - adc x27, x27, xzr - # Add remaining product results in - adds x9, x9, x12 - adcs x10, x10, x13 - adcs x11, x11, x14 + mov x25, #38 + mul x26, x25, x20 + adds x11, x11, x26 + umulh x27, x25, x20 adc x27, x27, xzr - # Overflow + mov x25, #19 extr x27, x27, x11, #63 mul x27, x27, x25 and x11, x11, #0x7fffffffffffffff - adds x8, x8, x27 - adcs x9, x9, xzr - adcs x10, x10, xzr + mov x25, #38 + mul x26, x25, x16 + adds x8, x8, x26 + umulh x16, x25, x16 + mul x26, x25, x17 + adcs x9, x9, x26 + umulh x17, x25, x17 + mul x26, x25, x19 + adcs x10, x10, x26 + umulh x19, x25, x19 adc x11, x11, xzr - # Reduce if top bit set - and x27, x25, x11, asr 63 - and x11, x11, #0x7fffffffffffffff + # Add high product results in adds x8, x8, x27 - adcs x9, x9, xzr - adcs x10, x10, xzr - adc x11, x11, xzr - # Store - ldr x0, [x29, #40] - ldr x1, [x29, #32] - # Add - adds x12, x4, x8 - adcs x13, x5, x9 - adcs x14, x6, x10 - adc x15, x7, x11 + adcs x9, x9, x16 + adcs x10, x10, x17 + adc x11, x11, x19 + # Double + adds x8, x8, x8 + adcs x9, x9, x9 + adcs x10, x10, x10 + adc x11, x11, x11 mov x25, #-19 - asr x28, x15, #63 + asr x28, x11, #63 # Mask the modulus and x25, x28, x25 and x26, x28, #0x7fffffffffffffff # Sub modulus (if overflow) - subs x12, x12, x25 - sbcs x13, x13, x28 - sbcs x14, x14, x28 - sbc x15, x15, x26 + subs x8, x8, x25 + sbcs x9, x9, x28 + sbcs x10, x10, x28 + sbc x11, x11, x26 + mov x3, x0 + sub x2, x0, #32 + # Add + ldp x4, x5, [x3] + ldp x6, x7, [x3, #16] + adds x12, x8, x4 + adcs x13, x9, x5 + adcs x14, x10, x6 + adcs x15, x11, x7 + cset x28, cs + mov x25, #19 + extr x28, x28, x15, #63 + mul x25, x28, x25 + # Sub modulus (if overflow) + adds x12, x12, x25 + adcs x13, x13, xzr + and x15, x15, #0x7fffffffffffffff + adcs x14, x14, xzr + adc x15, x15, xzr # Sub - subs x16, x4, x8 - sbcs x17, x5, x9 - sbcs x19, x6, x10 - sbcs x20, x7, x11 - mov x25, #-19 + subs x21, x8, x4 + sbcs x22, x9, x5 + sbcs x23, x10, x6 + sbcs x24, x11, x7 csetm x28, cc - # Mask the modulus - and x25, x28, x25 - and x26, x28, #0x7fffffffffffffff + mov x25, #-19 + extr x28, x28, x24, #63 + mul x25, x28, x25 # Add modulus (if underflow) - adds x16, x16, x25 - adcs x17, x17, x28 - adcs x19, x19, x28 - adc x20, x20, x26 + subs x21, x21, x25 + sbcs x22, x22, xzr + and x24, x24, #0x7fffffffffffffff + sbcs x23, x23, xzr + sbc x24, x24, xzr stp x12, x13, [x0] stp x14, x15, [x0, #16] - stp x16, x17, [x1] - stp x19, x20, [x1, #16] - ldr x17, [x29, #88] - ldr x19, [x29, #96] - ldp x20, x21, [x29, #104] - ldp x22, x23, [x29, #120] - ldp x24, x25, [x29, #136] - ldp x26, x27, [x29, #152] - ldr x28, [x29, #168] - ldp x29, x30, [sp], #0xb0 + stp x21, x22, [x1] + stp x23, x24, [x1, #16] + ldr x17, [x29, #56] + ldr x19, [x29, #64] + ldp x20, x21, [x29, #72] + ldp x22, x23, [x29, #88] + ldp x24, x25, [x29, #104] + ldp x26, x27, [x29, #120] + ldr x28, [x29, #136] + ldp x29, x30, [sp], #0x90 + ret +#ifndef __APPLE__ + .size ge_sub,.-ge_sub +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl sc_reduce +.type sc_reduce,@function +.align 2 +sc_reduce: +#else +.section __TEXT,__text +.globl _sc_reduce +.p2align 2 +_sc_reduce: +#endif /* __APPLE__ */ + stp x29, x30, [sp, #-64]! + add x29, sp, #0 + str x17, [x29, #16] + str x19, [x29, #24] + stp x20, x21, [x29, #32] + stp x22, x23, [x29, #48] + ldp x2, x3, [x0] + ldp x4, x5, [x0, #16] + ldp x6, x7, [x0, #32] + ldp x8, x9, [x0, #48] + lsr x23, x9, #56 + lsl x9, x9, #4 + orr x9, x9, x8, lsr 60 + lsl x8, x8, #4 + orr x8, x8, x7, lsr 60 + lsl x7, x7, #4 + orr x7, x7, x6, lsr 60 + lsl x6, x6, #4 + mov x1, #15 + orr x6, x6, x5, lsr 60 + bic x5, x5, x1, lsl 60 + bic x9, x9, x1, lsl 60 + # Add order times bits 504..511 + mov x11, #0x2c13 + movk x11, #0xa30a, lsl 16 + movk x11, #0x9ce5, lsl 32 + movk x11, #0xa7ed, lsl 48 + mov x13, #0x6329 + movk x13, #0x5d08, lsl 16 + movk x13, #0x621, lsl 32 + movk x13, #0xeb21, lsl 48 + mul x10, x23, x11 + umulh x11, x23, x11 + mul x12, x23, x13 + umulh x13, x23, x13 + adds x6, x6, x10 + adcs x7, x7, x11 + adcs x8, x8, xzr + adc x9, x9, xzr + adds x7, x7, x12 + adcs x8, x8, x13 + adc x9, x9, xzr + subs x8, x8, x23 + sbc x9, x9, xzr + # Sub product of top 4 words and order + mov x1, #0x2c13 + movk x1, #0xa30a, lsl 16 + movk x1, #0x9ce5, lsl 32 + movk x1, #0xa7ed, lsl 48 + mul x10, x6, x1 + umulh x11, x6, x1 + mul x12, x7, x1 + umulh x13, x7, x1 + mul x14, x8, x1 + umulh x15, x8, x1 + mul x16, x9, x1 + umulh x17, x9, x1 + adds x2, x2, x10 + adcs x3, x3, x11 + adcs x4, x4, x14 + adcs x5, x5, x15 + adc x19, xzr, xzr + adds x3, x3, x12 + adcs x4, x4, x13 + adcs x5, x5, x16 + adc x19, x19, x17 + mov x1, #0x6329 + movk x1, #0x5d08, lsl 16 + movk x1, #0x621, lsl 32 + movk x1, #0xeb21, lsl 48 + mul x10, x6, x1 + umulh x11, x6, x1 + mul x12, x7, x1 + umulh x13, x7, x1 + mul x14, x8, x1 + umulh x15, x8, x1 + mul x16, x9, x1 + umulh x17, x9, x1 + adds x3, x3, x10 + adcs x4, x4, x11 + adcs x5, x5, x14 + adcs x19, x19, x15 + adc x20, xzr, xzr + adds x4, x4, x12 + adcs x5, x5, x13 + adcs x19, x19, x16 + adc x20, x20, x17 + subs x4, x4, x6 + sbcs x5, x5, x7 + sbcs x6, x19, x8 + sbc x7, x20, x9 + asr x23, x7, #57 + # Conditionally subtract order starting at bit 125 + mov x10, xzr + mov x13, xzr + mov x11, #0xba7d + movk x11, #0x4b9e, lsl 16 + movk x11, #0x4c63, lsl 32 + movk x11, #0xcb02, lsl 48 + mov x12, #0xf39a + movk x12, #0xd45e, lsl 16 + movk x12, #0xdf3b, lsl 32 + movk x12, #0x29b, lsl 48 + movk x10, #0xa000, lsl 48 + movk x13, #0x200, lsl 48 + and x10, x10, x23 + and x11, x11, x23 + and x12, x12, x23 + and x13, x13, x23 + adds x3, x3, x10 + adcs x4, x4, x11 + adcs x5, x5, x12 + adcs x6, x6, xzr + adc x7, x7, x13 + # Move bits 252-376 to own registers + lsl x7, x7, #4 + orr x7, x7, x6, lsr 60 + lsl x6, x6, #4 + mov x23, #15 + orr x6, x6, x5, lsr 60 + bic x5, x5, x23, lsl 60 + # Sub product of top 2 words and order + # * -5812631a5cf5d3ed + mov x1, #0x2c13 + movk x1, #0xa30a, lsl 16 + movk x1, #0x9ce5, lsl 32 + movk x1, #0xa7ed, lsl 48 + mul x10, x6, x1 + umulh x11, x6, x1 + mul x12, x7, x1 + umulh x13, x7, x1 + adds x2, x2, x10 + adcs x3, x3, x11 + adc x19, xzr, xzr + adds x3, x3, x12 + adc x19, x19, x13 + # * -14def9dea2f79cd7 + mov x1, #0x6329 + movk x1, #0x5d08, lsl 16 + movk x1, #0x621, lsl 32 + movk x1, #0xeb21, lsl 48 + mul x10, x6, x1 + umulh x11, x6, x1 + mul x12, x7, x1 + umulh x13, x7, x1 + adds x3, x3, x10 + adcs x4, x4, x11 + adc x20, xzr, xzr + adds x4, x4, x12 + adc x20, x20, x13 + # Add overflows at 2 * 64 + mov x1, #15 + bic x5, x5, x1, lsl 60 + adds x4, x4, x19 + adc x5, x5, x20 + # Subtract top at 2 * 64 + subs x4, x4, x6 + sbcs x5, x5, x7 + sbc x1, x1, x1 + # Conditional sub order + mov x10, #0xd3ed + movk x10, #0x5cf5, lsl 16 + movk x10, #0x631a, lsl 32 + movk x10, #0x5812, lsl 48 + mov x11, #0x9cd6 + movk x11, #0xa2f7, lsl 16 + movk x11, #0xf9de, lsl 32 + movk x11, #0x14de, lsl 48 + and x10, x10, x1 + and x11, x11, x1 + adds x2, x2, x10 + adcs x3, x3, x11 + and x1, x1, #0x1000000000000000 + adcs x4, x4, xzr + mov x23, #15 + adc x5, x5, x1 + bic x5, x5, x23, lsl 60 + # Store result + stp x2, x3, [x0] + stp x4, x5, [x0, #16] + ldr x17, [x29, #16] + ldr x19, [x29, #24] + ldp x20, x21, [x29, #32] + ldp x22, x23, [x29, #48] + ldp x29, x30, [sp], #0x40 + ret +#ifndef __APPLE__ + .size sc_reduce,.-sc_reduce +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl sc_muladd +.type sc_muladd,@function +.align 2 +sc_muladd: +#else +.section __TEXT,__text +.globl _sc_muladd +.p2align 2 +_sc_muladd: +#endif /* __APPLE__ */ + stp x29, x30, [sp, #-96]! + add x29, sp, #0 + str x17, [x29, #24] + str x19, [x29, #32] + stp x20, x21, [x29, #40] + stp x22, x23, [x29, #56] + stp x24, x25, [x29, #72] + str x26, [x29, #88] + # Multiply + ldp x12, x13, [x1] + ldp x14, x15, [x1, #16] + ldp x16, x17, [x2] + ldp x19, x20, [x2, #16] + # A[0] * B[0] + umulh x5, x12, x16 + mul x4, x12, x16 + # A[2] * B[0] + umulh x7, x14, x16 + mul x6, x14, x16 + # A[1] * B[0] + mul x21, x13, x16 + adds x5, x5, x21 + umulh x22, x13, x16 + adcs x6, x6, x22 + # A[1] * B[3] + umulh x9, x13, x20 + adc x7, x7, xzr + mul x8, x13, x20 + # A[0] * B[1] + mul x21, x12, x17 + adds x5, x5, x21 + umulh x22, x12, x17 + adcs x6, x6, x22 + # A[2] * B[1] + mul x21, x14, x17 + adcs x7, x7, x21 + umulh x22, x14, x17 + adcs x8, x8, x22 + adc x9, x9, xzr + # A[1] * B[2] + mul x21, x13, x19 + adds x7, x7, x21 + umulh x22, x13, x19 + adcs x8, x8, x22 + adcs x9, x9, xzr + adc x10, xzr, xzr + # A[0] * B[2] + mul x21, x12, x19 + adds x6, x6, x21 + umulh x22, x12, x19 + adcs x7, x7, x22 + adcs x8, x8, xzr + adcs x9, x9, xzr + adc x10, x10, xzr + # A[1] * B[1] + mul x21, x13, x17 + adds x6, x6, x21 + umulh x22, x13, x17 + adcs x7, x7, x22 + # A[3] * B[1] + mul x21, x15, x17 + adcs x8, x8, x21 + umulh x22, x15, x17 + adcs x9, x9, x22 + adc x10, x10, xzr + # A[2] * B[2] + mul x21, x14, x19 + adds x8, x8, x21 + umulh x22, x14, x19 + adcs x9, x9, x22 + # A[3] * B[3] + mul x21, x15, x20 + adcs x10, x10, x21 + umulh x11, x15, x20 + adc x11, x11, xzr + # A[0] * B[3] + mul x21, x12, x20 + adds x7, x7, x21 + umulh x22, x12, x20 + adcs x8, x8, x22 + # A[2] * B[3] + mul x21, x14, x20 + adcs x9, x9, x21 + umulh x22, x14, x20 + adcs x10, x10, x22 + adc x11, x11, xzr + # A[3] * B[0] + mul x21, x15, x16 + adds x7, x7, x21 + umulh x22, x15, x16 + adcs x8, x8, x22 + # A[3] * B[2] + mul x21, x15, x19 + adcs x9, x9, x21 + umulh x22, x15, x19 + adcs x10, x10, x22 + adc x11, x11, xzr + # Add c to a * b + ldp x12, x13, [x3] + ldp x14, x15, [x3, #16] + adds x4, x4, x12 + adcs x5, x5, x13 + adcs x6, x6, x14 + adcs x7, x7, x15 + adcs x8, x8, xzr + adcs x9, x9, xzr + adcs x10, x10, xzr + adc x11, x11, xzr + lsr x25, x11, #56 + lsl x11, x11, #4 + orr x11, x11, x10, lsr 60 + lsl x10, x10, #4 + orr x10, x10, x9, lsr 60 + lsl x9, x9, #4 + orr x9, x9, x8, lsr 60 + lsl x8, x8, #4 + mov x26, #15 + orr x8, x8, x7, lsr 60 + bic x7, x7, x26, lsl 60 + bic x11, x11, x26, lsl 60 + # Add order times bits 504..507 + mov x22, #0x2c13 + movk x22, #0xa30a, lsl 16 + movk x22, #0x9ce5, lsl 32 + movk x22, #0xa7ed, lsl 48 + mov x24, #0x6329 + movk x24, #0x5d08, lsl 16 + movk x24, #0x621, lsl 32 + movk x24, #0xeb21, lsl 48 + mul x21, x25, x22 + umulh x22, x25, x22 + mul x23, x25, x24 + umulh x24, x25, x24 + adds x8, x8, x21 + adcs x9, x9, x22 + adcs x10, x10, xzr + adc x11, x11, xzr + adds x9, x9, x23 + adcs x10, x10, x24 + adc x11, x11, xzr + subs x10, x10, x25 + sbc x11, x11, xzr + # Sub product of top 4 words and order + mov x26, #0x2c13 + movk x26, #0xa30a, lsl 16 + movk x26, #0x9ce5, lsl 32 + movk x26, #0xa7ed, lsl 48 + mul x16, x8, x26 + umulh x17, x8, x26 + mul x19, x9, x26 + umulh x20, x9, x26 + mul x21, x10, x26 + umulh x22, x10, x26 + mul x23, x11, x26 + umulh x24, x11, x26 + adds x4, x4, x16 + adcs x5, x5, x17 + adcs x6, x6, x21 + adcs x7, x7, x22 + adc x12, xzr, xzr + adds x5, x5, x19 + adcs x6, x6, x20 + adcs x7, x7, x23 + adc x12, x12, x24 + mov x26, #0x6329 + movk x26, #0x5d08, lsl 16 + movk x26, #0x621, lsl 32 + movk x26, #0xeb21, lsl 48 + mul x16, x8, x26 + umulh x17, x8, x26 + mul x19, x9, x26 + umulh x20, x9, x26 + mul x21, x10, x26 + umulh x22, x10, x26 + mul x23, x11, x26 + umulh x24, x11, x26 + adds x5, x5, x16 + adcs x6, x6, x17 + adcs x7, x7, x21 + adcs x12, x12, x22 + adc x13, xzr, xzr + adds x6, x6, x19 + adcs x7, x7, x20 + adcs x12, x12, x23 + adc x13, x13, x24 + subs x6, x6, x8 + sbcs x7, x7, x9 + sbcs x8, x12, x10 + sbc x9, x13, x11 + asr x25, x9, #57 + # Conditionally subtract order starting at bit 125 + mov x16, xzr + mov x20, xzr + mov x17, #0xba7d + movk x17, #0x4b9e, lsl 16 + movk x17, #0x4c63, lsl 32 + movk x17, #0xcb02, lsl 48 + mov x19, #0xf39a + movk x19, #0xd45e, lsl 16 + movk x19, #0xdf3b, lsl 32 + movk x19, #0x29b, lsl 48 + movk x16, #0xa000, lsl 48 + movk x20, #0x200, lsl 48 + and x16, x16, x25 + and x17, x17, x25 + and x19, x19, x25 + and x20, x20, x25 + adds x5, x5, x16 + adcs x6, x6, x17 + adcs x7, x7, x19 + adcs x8, x8, xzr + adc x9, x9, x20 + # Move bits 252-376 to own registers + lsl x9, x9, #4 + orr x9, x9, x8, lsr 60 + lsl x8, x8, #4 + mov x25, #15 + orr x8, x8, x7, lsr 60 + bic x7, x7, x25, lsl 60 + # Sub product of top 2 words and order + # * -5812631a5cf5d3ed + mov x26, #0x2c13 + movk x26, #0xa30a, lsl 16 + movk x26, #0x9ce5, lsl 32 + movk x26, #0xa7ed, lsl 48 + mul x16, x8, x26 + umulh x17, x8, x26 + mul x19, x9, x26 + umulh x20, x9, x26 + adds x4, x4, x16 + adcs x5, x5, x17 + adc x12, xzr, xzr + adds x5, x5, x19 + adc x12, x12, x20 + # * -14def9dea2f79cd7 + mov x26, #0x6329 + movk x26, #0x5d08, lsl 16 + movk x26, #0x621, lsl 32 + movk x26, #0xeb21, lsl 48 + mul x16, x8, x26 + umulh x17, x8, x26 + mul x19, x9, x26 + umulh x20, x9, x26 + adds x5, x5, x16 + adcs x6, x6, x17 + adc x13, xzr, xzr + adds x6, x6, x19 + adc x13, x13, x20 + # Add overflows at 2 * 64 + mov x26, #15 + bic x7, x7, x26, lsl 60 + adds x6, x6, x12 + adc x7, x7, x13 + # Subtract top at 2 * 64 + subs x6, x6, x8 + sbcs x7, x7, x9 + sbc x26, x26, x26 + # Conditional sub order + mov x16, #0xd3ed + movk x16, #0x5cf5, lsl 16 + movk x16, #0x631a, lsl 32 + movk x16, #0x5812, lsl 48 + mov x17, #0x9cd6 + movk x17, #0xa2f7, lsl 16 + movk x17, #0xf9de, lsl 32 + movk x17, #0x14de, lsl 48 + and x16, x16, x26 + and x17, x17, x26 + adds x4, x4, x16 + adcs x5, x5, x17 + and x26, x26, #0x1000000000000000 + adcs x6, x6, xzr + mov x25, #15 + adc x7, x7, x26 + bic x7, x7, x25, lsl 60 + # Store result + stp x4, x5, [x0] + stp x6, x7, [x0, #16] + ldr x17, [x29, #24] + ldr x19, [x29, #32] + ldp x20, x21, [x29, #40] + ldp x22, x23, [x29, #56] + ldp x24, x25, [x29, #72] + ldr x26, [x29, #88] + ldp x29, x30, [sp], #0x60 ret #ifndef __APPLE__ - .size fe_ge_sub,.-fe_ge_sub + .size sc_muladd,.-sc_muladd #endif /* __APPLE__ */ -#endif /* HAVE_CURVE25519 */ +#endif /* HAVE_ED25519 */ +#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ +#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ #endif /* __aarch64__ */ #endif /* WOLFSSL_ARMASM */ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519_c.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-curve25519_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -23,6 +23,7 @@ #include #endif /* HAVE_CONFIG_H */ #include +#include /* Generated using (from wolfssl): * cd ../scripts @@ -30,19 +31,26 @@ */ #ifdef WOLFSSL_ARMASM #ifdef __aarch64__ -#ifdef HAVE_CURVE25519 +#ifdef WOLFSSL_ARMASM_INLINE +#include +#define CURVED25519_ASM +#include + +#if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) +#if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) #include void fe_init() { __asm__ __volatile__ ( "\n\t" - : : - : "memory" + : + : "memory", "cc" ); } +#ifdef HAVE_ED25519 void fe_frombytes(fe out, const unsigned char* in) { __asm__ __volatile__ ( @@ -53,7 +61,7 @@ "stp x4, x5, [%x[out], #16]\n\t" : [out] "+r" (out), [in] "+r" (in) : - : "memory", "x2", "x3", "x4", "x5", "x6" + : "memory", "x2", "x3", "x4", "x5", "x6", "cc" ); } @@ -77,7 +85,7 @@ "stp x4, x5, [%x[out], #16]\n\t" : [out] "+r" (out), [n] "+r" (n) : - : "memory", "x2", "x3", "x4", "x5", "x6", "x7" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "cc" ); } @@ -90,7 +98,7 @@ "stp xzr, xzr, [%x[n], #16]\n\t" : [n] "+r" (n) : - : "memory", "x1" + : "memory", "x1", "cc" ); } @@ -102,7 +110,7 @@ "stp xzr, xzr, [%x[n], #16]\n\t" : [n] "+r" (n) : - : "memory" + : "memory", "cc" ); } @@ -116,7 +124,7 @@ "stp x4, x5, [%x[r], #16]\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "x2", "x3", "x4", "x5" + : "memory", "x2", "x3", "x4", "x5", "cc" ); } @@ -132,21 +140,22 @@ "sbcs x4, x4, x8\n\t" "sbcs x5, x5, x9\n\t" "sbcs x6, x6, x10\n\t" - "mov x12, #-19\n\t" "csetm x11, cc\n\t" + "mov x12, #-19\n\t" /* Mask the modulus */ - "and x12, x11, x12\n\t" - "and x13, x11, #0x7fffffffffffffff\n\t" + "extr x11, x11, x6, #63\n\t" + "mul x12, x11, x12\n\t" /* Add modulus (if underflow) */ - "adds x3, x3, x12\n\t" - "adcs x4, x4, x11\n\t" - "adcs x5, x5, x11\n\t" - "adc x6, x6, x13\n\t" + "subs x3, x3, x12\n\t" + "sbcs x4, x4, xzr\n\t" + "and x6, x6, #0x7fffffffffffffff\n\t" + "sbcs x5, x5, xzr\n\t" + "sbc x6, x6, xzr\n\t" "stp x3, x4, [%x[r]]\n\t" "stp x5, x6, [%x[r], #16]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "cc" ); } @@ -161,22 +170,23 @@ "adds x3, x3, x7\n\t" "adcs x4, x4, x8\n\t" "adcs x5, x5, x9\n\t" - "adc x6, x6, x10\n\t" - "mov x12, #-19\n\t" - "asr x11, x6, #63\n\t" + "adcs x6, x6, x10\n\t" + "cset x11, cs\n\t" + "mov x12, #19\n\t" /* Mask the modulus */ - "and x12, x11, x12\n\t" - "and x13, x11, #0x7fffffffffffffff\n\t" + "extr x11, x11, x6, #63\n\t" + "mul x12, x11, x12\n\t" /* Sub modulus (if overflow) */ - "subs x3, x3, x12\n\t" - "sbcs x4, x4, x11\n\t" - "sbcs x5, x5, x11\n\t" - "sbc x6, x6, x13\n\t" + "adds x3, x3, x12\n\t" + "adcs x4, x4, xzr\n\t" + "and x6, x6, #0x7fffffffffffffff\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, x6, xzr\n\t" "stp x3, x4, [%x[r]]\n\t" "stp x5, x6, [%x[r], #16]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "cc" ); } @@ -197,7 +207,7 @@ "stp x8, x9, [%x[r], #16]\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "cc" ); } @@ -222,7 +232,7 @@ "orr %x[a], %x[a], x3\n\t" : [a] "+r" (a) : - : "memory", "x1", "x2", "x3", "x4", "x5", "x6" + : "memory", "x1", "x2", "x3", "x4", "x5", "x6", "cc" ); return (uint32_t)(size_t)a; } @@ -241,7 +251,7 @@ "eor %x[a], %x[a], x5, lsr 63\n\t" : [a] "+r" (a) : - : "memory", "x1", "x2", "x3", "x4", "x5", "x6" + : "memory", "x1", "x2", "x3", "x4", "x5", "x6", "cc" ); return (uint32_t)(size_t)a; } @@ -456,10 +466,11 @@ "ldp x29, x30, [sp], #32\n\t" : [r] "+r" (r), [base] "+r" (base), [b] "+r" (b) : - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "cc" ); } +#endif /* HAVE_ED25519 */ void fe_mul(fe r, const fe a, const fe b) { __asm__ __volatile__ ( @@ -468,136 +479,122 @@ "ldp x16, x17, [%x[a], #16]\n\t" "ldp x19, x20, [%x[b]]\n\t" "ldp x21, x22, [%x[b], #16]\n\t" - /* A[0] * B[0] */ - "mul x6, x14, x19\n\t" + /* A[0] * B[0] */ "umulh x7, x14, x19\n\t" - /* A[0] * B[1] */ - "mul x3, x14, x20\n\t" - "umulh x8, x14, x20\n\t" - "adds x7, x7, x3\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[0] */ + "mul x6, x14, x19\n\t" + /* A[2] * B[0] */ + "umulh x9, x16, x19\n\t" + "mul x8, x16, x19\n\t" + /* A[1] * B[0] */ "mul x3, x15, x19\n\t" + "adds x7, x7, x3\n\t" "umulh x4, x15, x19\n\t" + "adcs x8, x8, x4\n\t" + /* A[1] * B[3] */ + "umulh x11, x15, x22\n\t" + "adc x9, x9, xzr\n\t" + "mul x10, x15, x22\n\t" + /* A[0] * B[1] */ + "mul x3, x14, x20\n\t" "adds x7, x7, x3\n\t" + "umulh x4, x14, x20\n\t" "adcs x8, x8, x4\n\t" - "adc x9, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x3, x14, x21\n\t" - "umulh x4, x14, x21\n\t" - "adds x8, x8, x3\n\t" - "adc x9, x9, x4\n\t" - /* A[1] * B[1] */ - "mul x3, x15, x20\n\t" - "umulh x4, x15, x20\n\t" - "adds x8, x8, x3\n\t" - "adcs x9, x9, x4\n\t" - "adc x10, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x3, x16, x19\n\t" - "umulh x4, x16, x19\n\t" - "adds x8, x8, x3\n\t" - "adcs x9, x9, x4\n\t" - "adc x10, x10, xzr\n\t" - /* A[0] * B[3] */ - "mul x3, x14, x22\n\t" - "umulh x4, x14, x22\n\t" - "adds x9, x9, x3\n\t" - "adcs x10, x10, x4\n\t" - "adc x11, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x3, x15, x21\n\t" - "umulh x4, x15, x21\n\t" - "adds x9, x9, x3\n\t" - "adcs x10, x10, x4\n\t" - "adc x11, x11, xzr\n\t" - /* A[2] * B[1] */ + /* A[2] * B[1] */ "mul x3, x16, x20\n\t" + "adcs x9, x9, x3\n\t" "umulh x4, x16, x20\n\t" - "adds x9, x9, x3\n\t" "adcs x10, x10, x4\n\t" "adc x11, x11, xzr\n\t" - /* A[3] * B[0] */ - "mul x3, x17, x19\n\t" - "umulh x4, x17, x19\n\t" + /* A[1] * B[2] */ + "mul x3, x15, x21\n\t" "adds x9, x9, x3\n\t" + "umulh x4, x15, x21\n\t" "adcs x10, x10, x4\n\t" - "adc x11, x11, xzr\n\t" - /* A[1] * B[3] */ - "mul x3, x15, x22\n\t" - "umulh x4, x15, x22\n\t" - "adds x10, x10, x3\n\t" - "adcs x11, x11, x4\n\t" + "adcs x11, x11, xzr\n\t" "adc x12, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x3, x16, x21\n\t" - "umulh x4, x16, x21\n\t" - "adds x10, x10, x3\n\t" - "adcs x11, x11, x4\n\t" + /* A[0] * B[2] */ + "mul x3, x14, x21\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x14, x21\n\t" + "adcs x9, x9, x4\n\t" + "adcs x10, x10, xzr\n\t" + "adcs x11, x11, xzr\n\t" "adc x12, x12, xzr\n\t" - /* A[3] * B[1] */ + /* A[1] * B[1] */ + "mul x3, x15, x20\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x15, x20\n\t" + "adcs x9, x9, x4\n\t" + /* A[3] * B[1] */ "mul x3, x17, x20\n\t" + "adcs x10, x10, x3\n\t" "umulh x4, x17, x20\n\t" - "adds x10, x10, x3\n\t" "adcs x11, x11, x4\n\t" "adc x12, x12, xzr\n\t" - /* A[2] * B[3] */ + /* A[2] * B[2] */ + "mul x3, x16, x21\n\t" + "adds x10, x10, x3\n\t" + "umulh x4, x16, x21\n\t" + "adcs x11, x11, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x17, x22\n\t" + "adcs x12, x12, x3\n\t" + "umulh x13, x17, x22\n\t" + "adc x13, x13, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x14, x22\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x14, x22\n\t" + "adcs x10, x10, x4\n\t" + /* A[2] * B[3] */ "mul x3, x16, x22\n\t" + "adcs x11, x11, x3\n\t" "umulh x4, x16, x22\n\t" - "adds x11, x11, x3\n\t" "adcs x12, x12, x4\n\t" - "adc x13, xzr, xzr\n\t" - /* A[3] * B[2] */ + "adc x13, x13, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x17, x19\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x17, x19\n\t" + "adcs x10, x10, x4\n\t" + /* A[3] * B[2] */ "mul x3, x17, x21\n\t" + "adcs x11, x11, x3\n\t" "umulh x4, x17, x21\n\t" - "adds x11, x11, x3\n\t" "adcs x12, x12, x4\n\t" "adc x13, x13, xzr\n\t" - /* A[3] * B[3] */ - "mul x3, x17, x22\n\t" - "umulh x4, x17, x22\n\t" - "adds x12, x12, x3\n\t" - "adc x13, x13, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x13, x13, x12, #63\n\t" - "extr x12, x12, x11, #63\n\t" - "extr x11, x11, x10, #63\n\t" - "extr x10, x10, x9, #63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x3, #38\n\t" + "mul x4, x3, x13\n\t" + "adds x9, x9, x4\n\t" + "umulh x5, x3, x13\n\t" + "adc x5, x5, xzr\n\t" "mov x3, #19\n\t" + "extr x5, x5, x9, #63\n\t" + "mul x5, x5, x3\n\t" + "and x9, x9, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" "mul x4, x3, x10\n\t" - "umulh x10, x3, x10\n\t" "adds x6, x6, x4\n\t" + "umulh x10, x3, x10\n\t" "mul x4, x3, x11\n\t" - "umulh x11, x3, x11\n\t" "adcs x7, x7, x4\n\t" + "umulh x11, x3, x11\n\t" "mul x4, x3, x12\n\t" - "umulh x12, x3, x12\n\t" "adcs x8, x8, x4\n\t" - "mul x4, x3, x13\n\t" - "umulh x5, x3, x13\n\t" - "adcs x9, x9, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x7, x7, x10\n\t" - "adcs x8, x8, x11\n\t" - "adcs x9, x9, x12\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ - "extr x5, x5, x9, #63\n\t" - "mul x5, x5, x3\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" + "umulh x12, x3, x12\n\t" "adc x9, x9, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x9, asr 63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x6, x6, x5\n\t" + "adcs x7, x7, x10\n\t" + "adcs x8, x8, x11\n\t" + "adc x9, x9, x12\n\t" + /* Reduce if top bit set */ + "mov x3, #19\n\t" + "and x4, x3, x9, asr 63\n\t" + "adds x6, x6, x4\n\t" "adcs x7, x7, xzr\n\t" + "and x9, x9, #0x7fffffffffffffff\n\t" "adcs x8, x8, xzr\n\t" "adc x9, x9, xzr\n\t" /* Store */ @@ -605,7 +602,7 @@ "stp x8, x9, [%x[r], #16]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "cc" ); } @@ -616,33 +613,30 @@ "ldp x13, x14, [%x[a]]\n\t" "ldp x15, x16, [%x[a], #16]\n\t" /* A[0] * A[1] */ - "mul x6, x13, x14\n\t" "umulh x7, x13, x14\n\t" + "mul x6, x13, x14\n\t" + /* A[0] * A[3] */ + "umulh x9, x13, x16\n\t" + "mul x8, x13, x16\n\t" /* A[0] * A[2] */ "mul x2, x13, x15\n\t" - "umulh x8, x13, x15\n\t" "adds x7, x7, x2\n\t" - "adc x8, x8, xzr\n\t" - /* A[0] * A[3] */ - "mul x2, x13, x16\n\t" - "umulh x9, x13, x16\n\t" - "adds x8, x8, x2\n\t" - "adc x9, x9, xzr\n\t" + "umulh x3, x13, x15\n\t" + "adcs x8, x8, x3\n\t" + /* A[1] * A[3] */ + "mul x2, x14, x16\n\t" + "adcs x9, x9, x2\n\t" + "umulh x10, x14, x16\n\t" + "adc x10, x10, xzr\n\t" /* A[1] * A[2] */ "mul x2, x14, x15\n\t" - "umulh x3, x14, x15\n\t" "adds x8, x8, x2\n\t" + "umulh x3, x14, x15\n\t" "adcs x9, x9, x3\n\t" - "adc x10, xzr, xzr\n\t" - /* A[1] * A[3] */ - "mul x2, x14, x16\n\t" - "umulh x3, x14, x16\n\t" - "adds x9, x9, x2\n\t" - "adc x10, x10, x3\n\t" /* A[2] * A[3] */ "mul x2, x15, x16\n\t" + "adcs x10, x10, x2\n\t" "umulh x11, x15, x16\n\t" - "adds x10, x10, x2\n\t" "adc x11, x11, xzr\n\t" /* Double */ "adds x6, x6, x6\n\t" @@ -653,66 +647,56 @@ "adcs x11, x11, x11\n\t" "adc x12, xzr, xzr\n\t" /* A[0] * A[0] */ + "umulh x3, x13, x13\n\t" "mul x5, x13, x13\n\t" - "umulh x4, x13, x13\n\t" /* A[1] * A[1] */ "mul x2, x14, x14\n\t" + "adds x6, x6, x3\n\t" "umulh x3, x14, x14\n\t" - "adds x6, x6, x4\n\t" "adcs x7, x7, x2\n\t" - "adc x4, x3, xzr\n\t" /* A[2] * A[2] */ "mul x2, x15, x15\n\t" + "adcs x8, x8, x3\n\t" "umulh x3, x15, x15\n\t" - "adds x8, x8, x4\n\t" "adcs x9, x9, x2\n\t" - "adc x4, x3, xzr\n\t" /* A[3] * A[3] */ "mul x2, x16, x16\n\t" + "adcs x10, x10, x3\n\t" "umulh x3, x16, x16\n\t" - "adds x10, x10, x4\n\t" "adcs x11, x11, x2\n\t" "adc x12, x12, x3\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x12, x12, x11, #63\n\t" - "extr x11, x11, x10, #63\n\t" - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "and x8, x8, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x2, #38\n\t" + "mul x3, x2, x12\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x2, x12\n\t" + "adc x4, x4, xzr\n\t" "mov x2, #19\n\t" + "extr x4, x4, x8, #63\n\t" + "mul x4, x4, x2\n\t" + "and x8, x8, #0x7fffffffffffffff\n\t" + "mov x2, #38\n\t" "mul x3, x2, x9\n\t" - "umulh x9, x2, x9\n\t" "adds x5, x5, x3\n\t" + "umulh x9, x2, x9\n\t" "mul x3, x2, x10\n\t" - "umulh x10, x2, x10\n\t" "adcs x6, x6, x3\n\t" + "umulh x10, x2, x10\n\t" "mul x3, x2, x11\n\t" - "umulh x11, x2, x11\n\t" "adcs x7, x7, x3\n\t" - "mul x3, x2, x12\n\t" - "umulh x4, x2, x12\n\t" - "adcs x8, x8, x3\n\t" - "adc x4, x4, xzr\n\t" - /* Add remaining product results in */ - "adds x6, x6, x9\n\t" - "adcs x7, x7, x10\n\t" - "adcs x8, x8, x11\n\t" - "adc x4, x4, xzr\n\t" - /* Overflow */ - "extr x4, x4, x8, #63\n\t" - "mul x4, x4, x2\n\t" - "and x8, x8, #0x7fffffffffffffff\n\t" - "adds x5, x5, x4\n\t" - "adcs x6, x6, xzr\n\t" - "adcs x7, x7, xzr\n\t" + "umulh x11, x2, x11\n\t" "adc x8, x8, xzr\n\t" - /* Reduce if top bit set */ - "and x4, x2, x8, asr 63\n\t" - "and x8, x8, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x5, x5, x4\n\t" + "adcs x6, x6, x9\n\t" + "adcs x7, x7, x10\n\t" + "adc x8, x8, x11\n\t" + /* Reduce if top bit set */ + "mov x2, #19\n\t" + "and x3, x2, x8, asr 63\n\t" + "adds x5, x5, x3\n\t" "adcs x6, x6, xzr\n\t" + "and x8, x8, #0x7fffffffffffffff\n\t" "adcs x7, x7, xzr\n\t" "adc x8, x8, xzr\n\t" /* Store */ @@ -720,7 +704,7 @@ "stp x7, x8, [%x[r], #16]\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "cc" ); } @@ -792,63 +776,199 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x50\n\t" -#ifndef NDEBUG - "add x1, x29, #48\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x20, #3\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 5 times */ + "mov x20, #5\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_invert1_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert1_%=\n\t" - "add x0, x29, #48\n\t" + "bne L_fe_invert1_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" #ifndef NDEBUG - "add x1, x29, #0x50\n\t" + "add x0, x29, #48\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x50\n\t" "add x2, x29, #48\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x50\n\t" - "add x1, x29, #48\n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x20, #8\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 10 times */ + "mov x20, #10\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_invert2_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert2_%=\n\t" -#ifndef NDEBUG + "bne L_fe_invert2_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ #ifndef NDEBUG "add x1, x29, #0x50\n\t" #endif /* !NDEBUG */ @@ -858,87 +978,298 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x70\n\t" -#ifndef NDEBUG - "add x1, x29, #0x50\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x20, #18\n\t" -#ifndef NDEBUG - "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x70\n\t" + /* Loop: 20 times */ + "mov x20, #20\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_fe_invert3_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert3_%=\n\t" - "add x0, x29, #0x50\n\t" + "bne L_fe_invert3_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #112]\n\t" + "stp x8, x9, [x29, #128]\n\t" #ifndef NDEBUG - "add x1, x29, #0x70\n\t" + "add x0, x29, #0x50\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x70\n\t" "add x2, x29, #0x50\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x20, #9\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 10 times */ + "mov x20, #10\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_fe_invert4_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert4_%=\n\t" + "bne L_fe_invert4_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" "add x0, x29, #48\n\t" -#ifndef NDEBUG "add x1, x29, #0x50\n\t" -#endif /* !NDEBUG */ "add x2, x29, #48\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x50\n\t" - "add x1, x29, #48\n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x20, #48\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 50 times */ + "mov x20, #50\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_invert5_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert5_%=\n\t" -#ifndef NDEBUG + "bne L_fe_invert5_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ #ifndef NDEBUG "add x1, x29, #0x50\n\t" #endif /* !NDEBUG */ @@ -948,81 +1279,299 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x70\n\t" -#ifndef NDEBUG - "add x1, x29, #0x50\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x20, #0x62\n\t" -#ifndef NDEBUG - "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x70\n\t" + /* Loop: 100 times */ + "mov x20, #0x64\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_fe_invert6_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert6_%=\n\t" - "add x0, x29, #0x50\n\t" + "bne L_fe_invert6_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #112]\n\t" + "stp x8, x9, [x29, #128]\n\t" #ifndef NDEBUG - "add x1, x29, #0x70\n\t" + "add x0, x29, #0x50\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x70\n\t" "add x2, x29, #0x50\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x20, #49\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 50 times */ + "mov x20, #50\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_fe_invert7_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert7_%=\n\t" + "bne L_fe_invert7_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" "add x0, x29, #48\n\t" -#ifndef NDEBUG "add x1, x29, #0x50\n\t" -#endif /* !NDEBUG */ "add x2, x29, #48\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x20, #4\n\t" -#ifndef NDEBUG - "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #48\n\t" + /* Loop: 5 times */ + "mov x20, #5\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_invert8_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x20, x20, #1\n\t" - "bcs L_fe_invert8_%=\n\t" + "bne L_fe_invert8_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #48]\n\t" + "stp x8, x9, [x29, #64]\n\t" "ldr x0, [x29, #144]\n\t" -#ifndef NDEBUG "add x1, x29, #48\n\t" -#endif /* !NDEBUG */ "add x2, x29, #16\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" @@ -1032,7 +1581,7 @@ "ldp x29, x30, [sp], #0xa0\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "x2", "x20" + : "memory", "x2", "x20", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "cc" ); } @@ -1044,424 +1593,365 @@ "mov x23, xzr\n\t" "str %x[r], [x29, #176]\n\t" "str %x[a], [x29, #184]\n\t" - /* Copy */ "ldp x6, x7, [%x[a]]\n\t" "ldp x8, x9, [%x[a], #16]\n\t" - "stp x6, x7, [x29, #80]\n\t" - "stp x8, x9, [x29, #96]\n\t" - /* Set one */ - "mov %x[a], #1\n\t" - "stp %x[a], xzr, [%x[r]]\n\t" - "stp xzr, xzr, [%x[r], #16]\n\t" + "mov x10, #1\n\t" + "mov x11, xzr\n\t" + "mov x12, xzr\n\t" + "mov x13, xzr\n\t" + "stp x10, x11, [%x[r]]\n\t" + "stp x12, x13, [%x[r], #16]\n\t" /* Set zero */ "stp xzr, xzr, [x29, #16]\n\t" "stp xzr, xzr, [x29, #32]\n\t" - /* Set one */ - "mov %x[a], #1\n\t" - "stp %x[a], xzr, [x29, #48]\n\t" - "stp xzr, xzr, [x29, #64]\n\t" - "mov x25, #62\n\t" - "mov x24, #24\n\t" - "\n" - "L_curve25519_words_%=: \n\t" + "mov x24, #0xfe\n\t" "\n" "L_curve25519_bits_%=: \n\t" - "ldr %x[a], [%x[n], x24]\n\t" - "lsr %x[a], %x[a], x25\n\t" - "and %x[a], %x[a], #1\n\t" - "eor x23, x23, %x[a]\n\t" + "lsr x3, x24, #6\n\t" + "and x4, x24, #63\n\t" + "ldr x5, [%x[n], x3, LSL 3]\n\t" + "lsr x5, x5, x4\n\t" + "eor x23, x23, x5\n\t" /* Conditional Swap */ - "cmp x23, #1\n\t" + "subs xzr, xzr, x23, lsl 63\n\t" + "ldp x25, x26, [x29, #16]\n\t" + "ldp x27, x28, [x29, #32]\n\t" + "csel x19, x25, x10, ne\n\t" + "csel x25, x10, x25, ne\n\t" + "csel x20, x26, x11, ne\n\t" + "csel x26, x11, x26, ne\n\t" + "csel x21, x27, x12, ne\n\t" + "csel x27, x12, x27, ne\n\t" + "csel x22, x28, x13, ne\n\t" + "csel x28, x13, x28, ne\n\t" + /* Conditional Swap */ + "subs xzr, xzr, x23, lsl 63\n\t" "ldp x10, x11, [%x[r]]\n\t" "ldp x12, x13, [%x[r], #16]\n\t" - "ldp x6, x7, [x29, #80]\n\t" - "ldp x8, x9, [x29, #96]\n\t" - "csel x14, x10, x6, eq\n\t" - "csel x10, x6, x10, eq\n\t" - "csel x15, x11, x7, eq\n\t" - "csel x11, x7, x11, eq\n\t" - "csel x16, x12, x8, eq\n\t" - "csel x12, x8, x12, eq\n\t" - "csel x17, x13, x9, eq\n\t" - "csel x13, x9, x13, eq\n\t" - /* Conditional Swap */ - "cmp x23, #1\n\t" - "ldp x19, x20, [x29, #16]\n\t" - "ldp x21, x22, [x29, #32]\n\t" - "ldp x6, x7, [x29, #48]\n\t" - "ldp x8, x9, [x29, #64]\n\t" - "csel x5, x19, x6, eq\n\t" - "csel x19, x6, x19, eq\n\t" - "csel x26, x20, x7, eq\n\t" - "csel x20, x7, x20, eq\n\t" - "csel x27, x21, x8, eq\n\t" - "csel x21, x8, x21, eq\n\t" - "csel x28, x22, x9, eq\n\t" - "csel x22, x9, x22, eq\n\t" - "mov x23, %x[a]\n\t" + "csel x14, x10, x6, ne\n\t" + "csel x10, x6, x10, ne\n\t" + "csel x15, x11, x7, ne\n\t" + "csel x11, x7, x11, ne\n\t" + "csel x16, x12, x8, ne\n\t" + "csel x12, x8, x12, ne\n\t" + "csel x17, x13, x9, ne\n\t" + "csel x13, x9, x13, ne\n\t" + "mov x23, x5\n\t" /* Add */ - "adds x6, x10, x19\n\t" - "adcs x7, x11, x20\n\t" - "adcs x8, x12, x21\n\t" - "adc x9, x13, x22\n\t" - "mov x3, #-19\n\t" - "asr %x[a], x9, #63\n\t" - /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "adds x6, x10, x25\n\t" + "adcs x7, x11, x26\n\t" + "adcs x8, x12, x27\n\t" + "adcs x9, x13, x28\n\t" + "cset x5, cs\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x9, #63\n\t" + "mul x3, x5, x3\n\t" /* Sub modulus (if overflow) */ - "subs x6, x6, x3\n\t" - "sbcs x7, x7, %x[a]\n\t" - "sbcs x8, x8, %x[a]\n\t" - "sbc x9, x9, x4\n\t" + "adds x6, x6, x3\n\t" + "adcs x7, x7, xzr\n\t" + "and x9, x9, #0x7fffffffffffffff\n\t" + "adcs x8, x8, xzr\n\t" + "adc x9, x9, xzr\n\t" /* Sub */ - "subs x19, x10, x19\n\t" - "sbcs x20, x11, x20\n\t" - "sbcs x21, x12, x21\n\t" - "sbcs x22, x13, x22\n\t" + "subs x25, x10, x25\n\t" + "sbcs x26, x11, x26\n\t" + "sbcs x27, x12, x27\n\t" + "sbcs x28, x13, x28\n\t" + "csetm x5, cc\n\t" "mov x3, #-19\n\t" - "csetm %x[a], cc\n\t" - /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "extr x5, x5, x28, #63\n\t" + "mul x3, x5, x3\n\t" /* Add modulus (if underflow) */ - "adds x19, x19, x3\n\t" - "adcs x20, x20, %x[a]\n\t" - "adcs x21, x21, %x[a]\n\t" - "adc x22, x22, x4\n\t" - "stp x19, x20, [x29, #144]\n\t" - "stp x21, x22, [x29, #160]\n\t" + "subs x25, x25, x3\n\t" + "sbcs x26, x26, xzr\n\t" + "and x28, x28, #0x7fffffffffffffff\n\t" + "sbcs x27, x27, xzr\n\t" + "sbc x28, x28, xzr\n\t" + "stp x25, x26, [x29, #80]\n\t" + "stp x27, x28, [x29, #96]\n\t" /* Add */ - "adds x10, x14, x5\n\t" - "adcs x11, x15, x26\n\t" - "adcs x12, x16, x27\n\t" - "adc x13, x17, x28\n\t" - "mov x3, #-19\n\t" - "asr %x[a], x13, #63\n\t" - /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "adds x10, x14, x19\n\t" + "adcs x11, x15, x20\n\t" + "adcs x12, x16, x21\n\t" + "adcs x13, x17, x22\n\t" + "cset x5, cs\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x3, x5, x3\n\t" /* Sub modulus (if overflow) */ - "subs x10, x10, x3\n\t" - "sbcs x11, x11, %x[a]\n\t" - "sbcs x12, x12, %x[a]\n\t" - "sbc x13, x13, x4\n\t" + "adds x10, x10, x3\n\t" + "adcs x11, x11, xzr\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "adcs x12, x12, xzr\n\t" + "adc x13, x13, xzr\n\t" /* Sub */ - "subs x14, x14, x5\n\t" - "sbcs x15, x15, x26\n\t" - "sbcs x16, x16, x27\n\t" - "sbcs x17, x17, x28\n\t" + "subs x14, x14, x19\n\t" + "sbcs x15, x15, x20\n\t" + "sbcs x16, x16, x21\n\t" + "sbcs x17, x17, x22\n\t" + "csetm x5, cc\n\t" "mov x3, #-19\n\t" - "csetm %x[a], cc\n\t" - /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x3, x5, x3\n\t" /* Add modulus (if underflow) */ - "adds x14, x14, x3\n\t" - "adcs x15, x15, %x[a]\n\t" - "adcs x16, x16, %x[a]\n\t" - "adc x17, x17, x4\n\t" + "subs x14, x14, x3\n\t" + "sbcs x15, x15, xzr\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "sbcs x16, x16, xzr\n\t" + "sbc x17, x17, xzr\n\t" /* Multiply */ - /* A[0] * B[0] */ - "mul x19, x14, x6\n\t" + /* A[0] * B[0] */ "umulh x20, x14, x6\n\t" - /* A[0] * B[1] */ - "mul x3, x14, x7\n\t" - "umulh x21, x14, x7\n\t" - "adds x20, x20, x3\n\t" - "adc x21, x21, xzr\n\t" - /* A[1] * B[0] */ + "mul x19, x14, x6\n\t" + /* A[2] * B[0] */ + "umulh x22, x16, x6\n\t" + "mul x21, x16, x6\n\t" + /* A[1] * B[0] */ "mul x3, x15, x6\n\t" + "adds x20, x20, x3\n\t" "umulh x4, x15, x6\n\t" + "adcs x21, x21, x4\n\t" + /* A[1] * B[3] */ + "umulh x26, x15, x9\n\t" + "adc x22, x22, xzr\n\t" + "mul x25, x15, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x14, x7\n\t" "adds x20, x20, x3\n\t" + "umulh x4, x14, x7\n\t" "adcs x21, x21, x4\n\t" - "adc x22, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x3, x14, x8\n\t" - "umulh x4, x14, x8\n\t" - "adds x21, x21, x3\n\t" - "adc x22, x22, x4\n\t" - /* A[1] * B[1] */ - "mul x3, x15, x7\n\t" - "umulh x4, x15, x7\n\t" - "adds x21, x21, x3\n\t" - "adcs x22, x22, x4\n\t" - "adc %x[a], xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x3, x16, x6\n\t" - "umulh x4, x16, x6\n\t" - "adds x21, x21, x3\n\t" - "adcs x22, x22, x4\n\t" - "adc %x[a], %x[a], xzr\n\t" - /* A[0] * B[3] */ - "mul x3, x14, x9\n\t" - "umulh x4, x14, x9\n\t" - "adds x22, x22, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x3, x15, x8\n\t" - "umulh x4, x15, x8\n\t" - "adds x22, x22, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[2] * B[1] */ + /* A[2] * B[1] */ "mul x3, x16, x7\n\t" + "adcs x22, x22, x3\n\t" "umulh x4, x16, x7\n\t" - "adds x22, x22, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" + "adcs x25, x25, x4\n\t" "adc x26, x26, xzr\n\t" - /* A[3] * B[0] */ - "mul x3, x17, x6\n\t" - "umulh x4, x17, x6\n\t" + /* A[1] * B[2] */ + "mul x3, x15, x8\n\t" "adds x22, x22, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[1] * B[3] */ - "mul x3, x15, x9\n\t" - "umulh x4, x15, x9\n\t" - "adds %x[a], %x[a], x3\n\t" - "adcs x26, x26, x4\n\t" + "umulh x4, x15, x8\n\t" + "adcs x25, x25, x4\n\t" + "adcs x26, x26, xzr\n\t" "adc x27, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x3, x16, x8\n\t" - "umulh x4, x16, x8\n\t" - "adds %x[a], %x[a], x3\n\t" - "adcs x26, x26, x4\n\t" + /* A[0] * B[2] */ + "mul x3, x14, x8\n\t" + "adds x21, x21, x3\n\t" + "umulh x4, x14, x8\n\t" + "adcs x22, x22, x4\n\t" + "adcs x25, x25, xzr\n\t" + "adcs x26, x26, xzr\n\t" "adc x27, x27, xzr\n\t" - /* A[3] * B[1] */ + /* A[1] * B[1] */ + "mul x3, x15, x7\n\t" + "adds x21, x21, x3\n\t" + "umulh x4, x15, x7\n\t" + "adcs x22, x22, x4\n\t" + /* A[3] * B[1] */ "mul x3, x17, x7\n\t" + "adcs x25, x25, x3\n\t" "umulh x4, x17, x7\n\t" - "adds %x[a], %x[a], x3\n\t" "adcs x26, x26, x4\n\t" "adc x27, x27, xzr\n\t" - /* A[2] * B[3] */ + /* A[2] * B[2] */ + "mul x3, x16, x8\n\t" + "adds x25, x25, x3\n\t" + "umulh x4, x16, x8\n\t" + "adcs x26, x26, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x17, x9\n\t" + "adcs x27, x27, x3\n\t" + "umulh x28, x17, x9\n\t" + "adc x28, x28, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x14, x9\n\t" + "adds x22, x22, x3\n\t" + "umulh x4, x14, x9\n\t" + "adcs x25, x25, x4\n\t" + /* A[2] * B[3] */ "mul x3, x16, x9\n\t" + "adcs x26, x26, x3\n\t" "umulh x4, x16, x9\n\t" - "adds x26, x26, x3\n\t" "adcs x27, x27, x4\n\t" - "adc x28, xzr, xzr\n\t" - /* A[3] * B[2] */ + "adc x28, x28, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x17, x6\n\t" + "adds x22, x22, x3\n\t" + "umulh x4, x17, x6\n\t" + "adcs x25, x25, x4\n\t" + /* A[3] * B[2] */ "mul x3, x17, x8\n\t" + "adcs x26, x26, x3\n\t" "umulh x4, x17, x8\n\t" - "adds x26, x26, x3\n\t" "adcs x27, x27, x4\n\t" "adc x28, x28, xzr\n\t" - /* A[3] * B[3] */ - "mul x3, x17, x9\n\t" - "umulh x4, x17, x9\n\t" - "adds x27, x27, x3\n\t" - "adc x28, x28, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x28, x28, x27, #63\n\t" - "extr x27, x27, x26, #63\n\t" - "extr x26, x26, %x[a], #63\n\t" - "extr %x[a], %x[a], x22, #63\n\t" - "and x22, x22, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x3, #19\n\t" - "mul x4, x3, %x[a]\n\t" - "umulh %x[a], x3, %x[a]\n\t" - "adds x19, x19, x4\n\t" - "mul x4, x3, x26\n\t" - "umulh x26, x3, x26\n\t" - "adcs x20, x20, x4\n\t" - "mul x4, x3, x27\n\t" - "umulh x27, x3, x27\n\t" - "adcs x21, x21, x4\n\t" + "mov x3, #38\n\t" "mul x4, x3, x28\n\t" + "adds x22, x22, x4\n\t" "umulh x5, x3, x28\n\t" - "adcs x22, x22, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x20, x20, %x[a]\n\t" - "adcs x21, x21, x26\n\t" - "adcs x22, x22, x27\n\t" "adc x5, x5, xzr\n\t" - /* Overflow */ + "mov x3, #19\n\t" "extr x5, x5, x22, #63\n\t" "mul x5, x5, x3\n\t" "and x22, x22, #0x7fffffffffffffff\n\t" - "adds x19, x19, x5\n\t" - "adcs x20, x20, xzr\n\t" - "adcs x21, x21, xzr\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x25\n\t" + "adds x19, x19, x4\n\t" + "umulh x25, x3, x25\n\t" + "mul x4, x3, x26\n\t" + "adcs x20, x20, x4\n\t" + "umulh x26, x3, x26\n\t" + "mul x4, x3, x27\n\t" + "adcs x21, x21, x4\n\t" + "umulh x27, x3, x27\n\t" "adc x22, x22, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x22, asr 63\n\t" - "and x22, x22, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x19, x19, x5\n\t" - "adcs x20, x20, xzr\n\t" - "adcs x21, x21, xzr\n\t" - "adc x22, x22, xzr\n\t" + "adcs x20, x20, x25\n\t" + "adcs x21, x21, x26\n\t" + "adc x22, x22, x27\n\t" /* Store */ - "stp x19, x20, [x29, #112]\n\t" - "stp x21, x22, [x29, #128]\n\t" + "stp x19, x20, [x29, #48]\n\t" + "stp x21, x22, [x29, #64]\n\t" /* Multiply */ - "ldp %x[a], x26, [x29, #144]\n\t" - "ldp x27, x28, [x29, #160]\n\t" - /* A[0] * B[0] */ - "mul x19, x10, %x[a]\n\t" - "umulh x20, x10, %x[a]\n\t" - /* A[0] * B[1] */ - "mul x3, x10, x26\n\t" - "umulh x21, x10, x26\n\t" + "ldp x25, x26, [x29, #80]\n\t" + "ldp x27, x28, [x29, #96]\n\t" + /* A[0] * B[0] */ + "umulh x20, x10, x25\n\t" + "mul x19, x10, x25\n\t" + /* A[2] * B[0] */ + "umulh x22, x12, x25\n\t" + "mul x21, x12, x25\n\t" + /* A[1] * B[0] */ + "mul x3, x11, x25\n\t" "adds x20, x20, x3\n\t" - "adc x21, x21, xzr\n\t" - /* A[1] * B[0] */ - "mul x3, x11, %x[a]\n\t" - "umulh x4, x11, %x[a]\n\t" + "umulh x4, x11, x25\n\t" + "adcs x21, x21, x4\n\t" + /* A[1] * B[3] */ + "umulh x15, x11, x28\n\t" + "adc x22, x22, xzr\n\t" + "mul x14, x11, x28\n\t" + /* A[0] * B[1] */ + "mul x3, x10, x26\n\t" "adds x20, x20, x3\n\t" + "umulh x4, x10, x26\n\t" "adcs x21, x21, x4\n\t" - "adc x22, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x3, x10, x27\n\t" - "umulh x4, x10, x27\n\t" - "adds x21, x21, x3\n\t" - "adc x22, x22, x4\n\t" - /* A[1] * B[1] */ - "mul x3, x11, x26\n\t" - "umulh x4, x11, x26\n\t" - "adds x21, x21, x3\n\t" - "adcs x22, x22, x4\n\t" - "adc x14, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x3, x12, %x[a]\n\t" - "umulh x4, x12, %x[a]\n\t" - "adds x21, x21, x3\n\t" - "adcs x22, x22, x4\n\t" - "adc x14, x14, xzr\n\t" - /* A[0] * B[3] */ - "mul x3, x10, x28\n\t" - "umulh x4, x10, x28\n\t" - "adds x22, x22, x3\n\t" - "adcs x14, x14, x4\n\t" - "adc x15, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x3, x11, x27\n\t" - "umulh x4, x11, x27\n\t" - "adds x22, x22, x3\n\t" - "adcs x14, x14, x4\n\t" - "adc x15, x15, xzr\n\t" - /* A[2] * B[1] */ + /* A[2] * B[1] */ "mul x3, x12, x26\n\t" + "adcs x22, x22, x3\n\t" "umulh x4, x12, x26\n\t" - "adds x22, x22, x3\n\t" "adcs x14, x14, x4\n\t" "adc x15, x15, xzr\n\t" - /* A[3] * B[0] */ - "mul x3, x13, %x[a]\n\t" - "umulh x4, x13, %x[a]\n\t" + /* A[1] * B[2] */ + "mul x3, x11, x27\n\t" "adds x22, x22, x3\n\t" + "umulh x4, x11, x27\n\t" "adcs x14, x14, x4\n\t" - "adc x15, x15, xzr\n\t" - /* A[1] * B[3] */ - "mul x3, x11, x28\n\t" - "umulh x4, x11, x28\n\t" - "adds x14, x14, x3\n\t" - "adcs x15, x15, x4\n\t" + "adcs x15, x15, xzr\n\t" "adc x16, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x3, x12, x27\n\t" - "umulh x4, x12, x27\n\t" - "adds x14, x14, x3\n\t" - "adcs x15, x15, x4\n\t" + /* A[0] * B[2] */ + "mul x3, x10, x27\n\t" + "adds x21, x21, x3\n\t" + "umulh x4, x10, x27\n\t" + "adcs x22, x22, x4\n\t" + "adcs x14, x14, xzr\n\t" + "adcs x15, x15, xzr\n\t" "adc x16, x16, xzr\n\t" - /* A[3] * B[1] */ + /* A[1] * B[1] */ + "mul x3, x11, x26\n\t" + "adds x21, x21, x3\n\t" + "umulh x4, x11, x26\n\t" + "adcs x22, x22, x4\n\t" + /* A[3] * B[1] */ "mul x3, x13, x26\n\t" + "adcs x14, x14, x3\n\t" "umulh x4, x13, x26\n\t" - "adds x14, x14, x3\n\t" "adcs x15, x15, x4\n\t" "adc x16, x16, xzr\n\t" - /* A[2] * B[3] */ + /* A[2] * B[2] */ + "mul x3, x12, x27\n\t" + "adds x14, x14, x3\n\t" + "umulh x4, x12, x27\n\t" + "adcs x15, x15, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x13, x28\n\t" + "adcs x16, x16, x3\n\t" + "umulh x17, x13, x28\n\t" + "adc x17, x17, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x10, x28\n\t" + "adds x22, x22, x3\n\t" + "umulh x4, x10, x28\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * B[3] */ "mul x3, x12, x28\n\t" + "adcs x15, x15, x3\n\t" "umulh x4, x12, x28\n\t" - "adds x15, x15, x3\n\t" "adcs x16, x16, x4\n\t" - "adc x17, xzr, xzr\n\t" - /* A[3] * B[2] */ + "adc x17, x17, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x13, x25\n\t" + "adds x22, x22, x3\n\t" + "umulh x4, x13, x25\n\t" + "adcs x14, x14, x4\n\t" + /* A[3] * B[2] */ "mul x3, x13, x27\n\t" + "adcs x15, x15, x3\n\t" "umulh x4, x13, x27\n\t" - "adds x15, x15, x3\n\t" "adcs x16, x16, x4\n\t" "adc x17, x17, xzr\n\t" - /* A[3] * B[3] */ - "mul x3, x13, x28\n\t" - "umulh x4, x13, x28\n\t" - "adds x16, x16, x3\n\t" - "adc x17, x17, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x15, #63\n\t" - "extr x15, x15, x14, #63\n\t" - "extr x14, x14, x22, #63\n\t" - "and x22, x22, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x22, x22, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" "mov x3, #19\n\t" + "extr x5, x5, x22, #63\n\t" + "mul x5, x5, x3\n\t" + "and x22, x22, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" "mul x4, x3, x14\n\t" - "umulh x14, x3, x14\n\t" "adds x19, x19, x4\n\t" + "umulh x14, x3, x14\n\t" "mul x4, x3, x15\n\t" - "umulh x15, x3, x15\n\t" "adcs x20, x20, x4\n\t" + "umulh x15, x3, x15\n\t" "mul x4, x3, x16\n\t" - "umulh x16, x3, x16\n\t" "adcs x21, x21, x4\n\t" - "mul x4, x3, x17\n\t" - "umulh x5, x3, x17\n\t" - "adcs x22, x22, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x20, x20, x14\n\t" - "adcs x21, x21, x15\n\t" - "adcs x22, x22, x16\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ - "extr x5, x5, x22, #63\n\t" - "mul x5, x5, x3\n\t" - "and x22, x22, #0x7fffffffffffffff\n\t" - "adds x19, x19, x5\n\t" - "adcs x20, x20, xzr\n\t" - "adcs x21, x21, xzr\n\t" + "umulh x16, x3, x16\n\t" "adc x22, x22, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x22, asr 63\n\t" - "and x22, x22, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x19, x19, x5\n\t" - "adcs x20, x20, xzr\n\t" - "adcs x21, x21, xzr\n\t" - "adc x22, x22, xzr\n\t" - /* Store */ + "adcs x20, x20, x14\n\t" + "adcs x21, x21, x15\n\t" + "adc x22, x22, x16\n\t" /* Square */ /* A[0] * A[1] */ - "mul x11, %x[a], x26\n\t" - "umulh x12, %x[a], x26\n\t" + "umulh x12, x25, x26\n\t" + "mul x11, x25, x26\n\t" + /* A[0] * A[3] */ + "umulh x14, x25, x28\n\t" + "mul x13, x25, x28\n\t" /* A[0] * A[2] */ - "mul x3, %x[a], x27\n\t" - "umulh x13, %x[a], x27\n\t" + "mul x3, x25, x27\n\t" "adds x12, x12, x3\n\t" - "adc x13, x13, xzr\n\t" - /* A[0] * A[3] */ - "mul x3, %x[a], x28\n\t" - "umulh x14, %x[a], x28\n\t" - "adds x13, x13, x3\n\t" - "adc x14, x14, xzr\n\t" + "umulh x4, x25, x27\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x26, x28\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x26, x28\n\t" + "adc x15, x15, xzr\n\t" /* A[1] * A[2] */ "mul x3, x26, x27\n\t" - "umulh x4, x26, x27\n\t" "adds x13, x13, x3\n\t" + "umulh x4, x26, x27\n\t" "adcs x14, x14, x4\n\t" - "adc x15, xzr, xzr\n\t" - /* A[1] * A[3] */ - "mul x3, x26, x28\n\t" - "umulh x4, x26, x28\n\t" - "adds x14, x14, x3\n\t" - "adc x15, x15, x4\n\t" /* A[2] * A[3] */ "mul x3, x27, x28\n\t" + "adcs x15, x15, x3\n\t" "umulh x16, x27, x28\n\t" - "adds x15, x15, x3\n\t" "adc x16, x16, xzr\n\t" /* Double */ "adds x11, x11, x11\n\t" @@ -1472,304 +1962,241 @@ "adcs x16, x16, x16\n\t" "adc x17, xzr, xzr\n\t" /* A[0] * A[0] */ - "mul x10, %x[a], %x[a]\n\t" - "umulh x5, %x[a], %x[a]\n\t" + "umulh x4, x25, x25\n\t" + "mul x10, x25, x25\n\t" /* A[1] * A[1] */ "mul x3, x26, x26\n\t" + "adds x11, x11, x4\n\t" "umulh x4, x26, x26\n\t" - "adds x11, x11, x5\n\t" "adcs x12, x12, x3\n\t" - "adc x5, x4, xzr\n\t" /* A[2] * A[2] */ "mul x3, x27, x27\n\t" + "adcs x13, x13, x4\n\t" "umulh x4, x27, x27\n\t" - "adds x13, x13, x5\n\t" "adcs x14, x14, x3\n\t" - "adc x5, x4, xzr\n\t" /* A[3] * A[3] */ "mul x3, x28, x28\n\t" + "adcs x15, x15, x4\n\t" "umulh x4, x28, x28\n\t" - "adds x15, x15, x5\n\t" "adcs x16, x16, x3\n\t" "adc x17, x17, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x15, #63\n\t" - "extr x15, x15, x14, #63\n\t" - "extr x14, x14, x13, #63\n\t" - "and x13, x13, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" "mul x4, x3, x14\n\t" - "umulh x14, x3, x14\n\t" "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" "mul x4, x3, x15\n\t" - "umulh x15, x3, x15\n\t" "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" "mul x4, x3, x16\n\t" - "umulh x16, x3, x16\n\t" "adcs x12, x12, x4\n\t" - "mul x4, x3, x17\n\t" - "umulh x5, x3, x17\n\t" - "adcs x13, x13, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x11, x11, x14\n\t" - "adcs x12, x12, x15\n\t" - "adcs x13, x13, x16\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ - "extr x5, x5, x13, #63\n\t" - "mul x5, x5, x3\n\t" - "and x13, x13, #0x7fffffffffffffff\n\t" - "adds x10, x10, x5\n\t" - "adcs x11, x11, xzr\n\t" - "adcs x12, x12, xzr\n\t" + "umulh x16, x3, x16\n\t" "adc x13, x13, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x13, asr 63\n\t" - "and x13, x13, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x10, x10, x5\n\t" - "adcs x11, x11, xzr\n\t" - "adcs x12, x12, xzr\n\t" - "adc x13, x13, xzr\n\t" - /* Store */ + "adcs x11, x11, x14\n\t" + "adcs x12, x12, x15\n\t" + "adc x13, x13, x16\n\t" /* Square */ /* A[0] * A[1] */ - "mul x15, x6, x7\n\t" "umulh x16, x6, x7\n\t" + "mul x15, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x25, x6, x9\n\t" + "mul x17, x6, x9\n\t" /* A[0] * A[2] */ "mul x3, x6, x8\n\t" - "umulh x17, x6, x8\n\t" "adds x16, x16, x3\n\t" - "adc x17, x17, xzr\n\t" - /* A[0] * A[3] */ - "mul x3, x6, x9\n\t" - "umulh %x[a], x6, x9\n\t" - "adds x17, x17, x3\n\t" - "adc %x[a], %x[a], xzr\n\t" + "umulh x4, x6, x8\n\t" + "adcs x17, x17, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x25, x25, x3\n\t" + "umulh x26, x7, x9\n\t" + "adc x26, x26, xzr\n\t" /* A[1] * A[2] */ "mul x3, x7, x8\n\t" - "umulh x4, x7, x8\n\t" "adds x17, x17, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, xzr, xzr\n\t" - /* A[1] * A[3] */ - "mul x3, x7, x9\n\t" - "umulh x4, x7, x9\n\t" - "adds %x[a], %x[a], x3\n\t" - "adc x26, x26, x4\n\t" + "umulh x4, x7, x8\n\t" + "adcs x25, x25, x4\n\t" /* A[2] * A[3] */ "mul x3, x8, x9\n\t" + "adcs x26, x26, x3\n\t" "umulh x27, x8, x9\n\t" - "adds x26, x26, x3\n\t" "adc x27, x27, xzr\n\t" /* Double */ "adds x15, x15, x15\n\t" "adcs x16, x16, x16\n\t" "adcs x17, x17, x17\n\t" - "adcs %x[a], %x[a], %x[a]\n\t" + "adcs x25, x25, x25\n\t" "adcs x26, x26, x26\n\t" "adcs x27, x27, x27\n\t" "adc x28, xzr, xzr\n\t" /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" "mul x14, x6, x6\n\t" - "umulh x5, x6, x6\n\t" /* A[1] * A[1] */ "mul x3, x7, x7\n\t" + "adds x15, x15, x4\n\t" "umulh x4, x7, x7\n\t" - "adds x15, x15, x5\n\t" "adcs x16, x16, x3\n\t" - "adc x5, x4, xzr\n\t" /* A[2] * A[2] */ "mul x3, x8, x8\n\t" + "adcs x17, x17, x4\n\t" "umulh x4, x8, x8\n\t" - "adds x17, x17, x5\n\t" - "adcs %x[a], %x[a], x3\n\t" - "adc x5, x4, xzr\n\t" + "adcs x25, x25, x3\n\t" /* A[3] * A[3] */ "mul x3, x9, x9\n\t" + "adcs x26, x26, x4\n\t" "umulh x4, x9, x9\n\t" - "adds x26, x26, x5\n\t" "adcs x27, x27, x3\n\t" "adc x28, x28, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x28, x28, x27, #63\n\t" - "extr x27, x27, x26, #63\n\t" - "extr x26, x26, %x[a], #63\n\t" - "extr %x[a], %x[a], x17, #63\n\t" - "and x17, x17, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x3, #19\n\t" - "mul x4, x3, %x[a]\n\t" - "umulh %x[a], x3, %x[a]\n\t" - "adds x14, x14, x4\n\t" - "mul x4, x3, x26\n\t" - "umulh x26, x3, x26\n\t" - "adcs x15, x15, x4\n\t" - "mul x4, x3, x27\n\t" - "umulh x27, x3, x27\n\t" - "adcs x16, x16, x4\n\t" + "mov x3, #38\n\t" "mul x4, x3, x28\n\t" + "adds x17, x17, x4\n\t" "umulh x5, x3, x28\n\t" - "adcs x17, x17, x4\n\t" "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x15, x15, %x[a]\n\t" - "adcs x16, x16, x26\n\t" - "adcs x17, x17, x27\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ + "mov x3, #19\n\t" "extr x5, x5, x17, #63\n\t" "mul x5, x5, x3\n\t" "and x17, x17, #0x7fffffffffffffff\n\t" - "adds x14, x14, x5\n\t" - "adcs x15, x15, xzr\n\t" - "adcs x16, x16, xzr\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x25\n\t" + "adds x14, x14, x4\n\t" + "umulh x25, x3, x25\n\t" + "mul x4, x3, x26\n\t" + "adcs x15, x15, x4\n\t" + "umulh x26, x3, x26\n\t" + "mul x4, x3, x27\n\t" + "adcs x16, x16, x4\n\t" + "umulh x27, x3, x27\n\t" "adc x17, x17, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x17, asr 63\n\t" - "and x17, x17, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x14, x14, x5\n\t" - "adcs x15, x15, xzr\n\t" - "adcs x16, x16, xzr\n\t" - "adc x17, x17, xzr\n\t" - /* Store */ + "adcs x15, x15, x25\n\t" + "adcs x16, x16, x26\n\t" + "adc x17, x17, x27\n\t" /* Multiply */ - /* A[0] * B[0] */ - "mul x6, x14, x10\n\t" + /* A[0] * B[0] */ "umulh x7, x14, x10\n\t" - /* A[0] * B[1] */ - "mul x3, x14, x11\n\t" - "umulh x8, x14, x11\n\t" - "adds x7, x7, x3\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[0] */ + "mul x6, x14, x10\n\t" + /* A[2] * B[0] */ + "umulh x9, x16, x10\n\t" + "mul x8, x16, x10\n\t" + /* A[1] * B[0] */ "mul x3, x15, x10\n\t" + "adds x7, x7, x3\n\t" "umulh x4, x15, x10\n\t" + "adcs x8, x8, x4\n\t" + /* A[1] * B[3] */ + "umulh x26, x15, x13\n\t" + "adc x9, x9, xzr\n\t" + "mul x25, x15, x13\n\t" + /* A[0] * B[1] */ + "mul x3, x14, x11\n\t" "adds x7, x7, x3\n\t" + "umulh x4, x14, x11\n\t" "adcs x8, x8, x4\n\t" - "adc x9, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x3, x14, x12\n\t" - "umulh x4, x14, x12\n\t" - "adds x8, x8, x3\n\t" - "adc x9, x9, x4\n\t" - /* A[1] * B[1] */ - "mul x3, x15, x11\n\t" - "umulh x4, x15, x11\n\t" - "adds x8, x8, x3\n\t" - "adcs x9, x9, x4\n\t" - "adc %x[a], xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x3, x16, x10\n\t" - "umulh x4, x16, x10\n\t" - "adds x8, x8, x3\n\t" - "adcs x9, x9, x4\n\t" - "adc %x[a], %x[a], xzr\n\t" - /* A[0] * B[3] */ - "mul x3, x14, x13\n\t" - "umulh x4, x14, x13\n\t" - "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x3, x15, x12\n\t" - "umulh x4, x15, x12\n\t" - "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[2] * B[1] */ + /* A[2] * B[1] */ "mul x3, x16, x11\n\t" + "adcs x9, x9, x3\n\t" "umulh x4, x16, x11\n\t" - "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" + "adcs x25, x25, x4\n\t" "adc x26, x26, xzr\n\t" - /* A[3] * B[0] */ - "mul x3, x17, x10\n\t" - "umulh x4, x17, x10\n\t" + /* A[1] * B[2] */ + "mul x3, x15, x12\n\t" "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[1] * B[3] */ - "mul x3, x15, x13\n\t" - "umulh x4, x15, x13\n\t" - "adds %x[a], %x[a], x3\n\t" - "adcs x26, x26, x4\n\t" + "umulh x4, x15, x12\n\t" + "adcs x25, x25, x4\n\t" + "adcs x26, x26, xzr\n\t" "adc x27, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x3, x16, x12\n\t" - "umulh x4, x16, x12\n\t" - "adds %x[a], %x[a], x3\n\t" - "adcs x26, x26, x4\n\t" + /* A[0] * B[2] */ + "mul x3, x14, x12\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x14, x12\n\t" + "adcs x9, x9, x4\n\t" + "adcs x25, x25, xzr\n\t" + "adcs x26, x26, xzr\n\t" "adc x27, x27, xzr\n\t" - /* A[3] * B[1] */ + /* A[1] * B[1] */ + "mul x3, x15, x11\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x15, x11\n\t" + "adcs x9, x9, x4\n\t" + /* A[3] * B[1] */ "mul x3, x17, x11\n\t" + "adcs x25, x25, x3\n\t" "umulh x4, x17, x11\n\t" - "adds %x[a], %x[a], x3\n\t" "adcs x26, x26, x4\n\t" "adc x27, x27, xzr\n\t" - /* A[2] * B[3] */ + /* A[2] * B[2] */ + "mul x3, x16, x12\n\t" + "adds x25, x25, x3\n\t" + "umulh x4, x16, x12\n\t" + "adcs x26, x26, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x17, x13\n\t" + "adcs x27, x27, x3\n\t" + "umulh x28, x17, x13\n\t" + "adc x28, x28, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x14, x13\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x14, x13\n\t" + "adcs x25, x25, x4\n\t" + /* A[2] * B[3] */ "mul x3, x16, x13\n\t" + "adcs x26, x26, x3\n\t" "umulh x4, x16, x13\n\t" - "adds x26, x26, x3\n\t" "adcs x27, x27, x4\n\t" - "adc x28, xzr, xzr\n\t" - /* A[3] * B[2] */ + "adc x28, x28, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x17, x10\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x17, x10\n\t" + "adcs x25, x25, x4\n\t" + /* A[3] * B[2] */ "mul x3, x17, x12\n\t" + "adcs x26, x26, x3\n\t" "umulh x4, x17, x12\n\t" - "adds x26, x26, x3\n\t" "adcs x27, x27, x4\n\t" "adc x28, x28, xzr\n\t" - /* A[3] * B[3] */ - "mul x3, x17, x13\n\t" - "umulh x4, x17, x13\n\t" - "adds x27, x27, x3\n\t" - "adc x28, x28, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x28, x28, x27, #63\n\t" - "extr x27, x27, x26, #63\n\t" - "extr x26, x26, %x[a], #63\n\t" - "extr %x[a], %x[a], x9, #63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x3, #19\n\t" - "mul x4, x3, %x[a]\n\t" - "umulh %x[a], x3, %x[a]\n\t" - "adds x6, x6, x4\n\t" - "mul x4, x3, x26\n\t" - "umulh x26, x3, x26\n\t" - "adcs x7, x7, x4\n\t" - "mul x4, x3, x27\n\t" - "umulh x27, x3, x27\n\t" - "adcs x8, x8, x4\n\t" + "mov x3, #38\n\t" "mul x4, x3, x28\n\t" + "adds x9, x9, x4\n\t" "umulh x5, x3, x28\n\t" - "adcs x9, x9, x4\n\t" "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x7, x7, %x[a]\n\t" - "adcs x8, x8, x26\n\t" - "adcs x9, x9, x27\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ + "mov x3, #19\n\t" "extr x5, x5, x9, #63\n\t" "mul x5, x5, x3\n\t" "and x9, x9, #0x7fffffffffffffff\n\t" - "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x25\n\t" + "adds x6, x6, x4\n\t" + "umulh x25, x3, x25\n\t" + "mul x4, x3, x26\n\t" + "adcs x7, x7, x4\n\t" + "umulh x26, x3, x26\n\t" + "mul x4, x3, x27\n\t" + "adcs x8, x8, x4\n\t" + "umulh x27, x3, x27\n\t" "adc x9, x9, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x9, asr 63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" - "adc x9, x9, xzr\n\t" + "adcs x7, x7, x25\n\t" + "adcs x8, x8, x26\n\t" + "adc x9, x9, x27\n\t" /* Store */ "stp x6, x7, [%x[r]]\n\t" "stp x8, x9, [%x[r], #16]\n\t" @@ -1778,576 +2205,479 @@ "sbcs x15, x15, x11\n\t" "sbcs x16, x16, x12\n\t" "sbcs x17, x17, x13\n\t" + "csetm x5, cc\n\t" "mov x3, #-19\n\t" - "csetm %x[a], cc\n\t" /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x3, x5, x3\n\t" /* Add modulus (if underflow) */ - "adds x14, x14, x3\n\t" - "adcs x15, x15, %x[a]\n\t" - "adcs x16, x16, %x[a]\n\t" - "adc x17, x17, x4\n\t" + "subs x14, x14, x3\n\t" + "sbcs x15, x15, xzr\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "sbcs x16, x16, xzr\n\t" + "sbc x17, x17, xzr\n\t" /* Multiply by 121666 */ "mov x5, #0xdb42\n\t" "movk x5, #1, lsl 16\n\t" "mul x6, x14, x5\n\t" "umulh x7, x14, x5\n\t" "mul x3, x15, x5\n\t" - "umulh x4, x15, x5\n\t" + "umulh x8, x15, x5\n\t" "adds x7, x7, x3\n\t" - "adc x8, xzr, x4\n\t" + "adc x8, x8, xzr\n\t" "mul x3, x16, x5\n\t" - "umulh x4, x16, x5\n\t" + "umulh x9, x16, x5\n\t" "adds x8, x8, x3\n\t" - "adc x9, xzr, x4\n\t" + "adc x9, x9, xzr\n\t" "mul x3, x17, x5\n\t" "umulh x4, x17, x5\n\t" "adds x9, x9, x3\n\t" - "adc x4, xzr, x4\n\t" + "adc x4, x4, xzr\n\t" "mov x5, #19\n\t" "extr x4, x4, x9, #63\n\t" "mul x4, x4, x5\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" "adds x6, x6, x4\n\t" "adcs x7, x7, xzr\n\t" + "and x9, x9, #0x7fffffffffffffff\n\t" "adcs x8, x8, xzr\n\t" "adc x9, x9, xzr\n\t" /* Add */ "adds x10, x10, x6\n\t" "adcs x11, x11, x7\n\t" "adcs x12, x12, x8\n\t" - "adc x13, x13, x9\n\t" - "mov x3, #-19\n\t" - "asr %x[a], x13, #63\n\t" + "adcs x13, x13, x9\n\t" + "cset x5, cs\n\t" + "mov x3, #19\n\t" /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x3, x5, x3\n\t" /* Sub modulus (if overflow) */ - "subs x10, x10, x3\n\t" - "sbcs x11, x11, %x[a]\n\t" - "sbcs x12, x12, %x[a]\n\t" - "sbc x13, x13, x4\n\t" + "adds x10, x10, x3\n\t" + "adcs x11, x11, xzr\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "adcs x12, x12, xzr\n\t" + "adc x13, x13, xzr\n\t" /* Multiply */ - /* A[0] * B[0] */ - "mul x6, x14, x10\n\t" + /* A[0] * B[0] */ "umulh x7, x14, x10\n\t" - /* A[0] * B[1] */ - "mul x3, x14, x11\n\t" - "umulh x8, x14, x11\n\t" - "adds x7, x7, x3\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[0] */ + "mul x6, x14, x10\n\t" + /* A[2] * B[0] */ + "umulh x9, x16, x10\n\t" + "mul x8, x16, x10\n\t" + /* A[1] * B[0] */ "mul x3, x15, x10\n\t" + "adds x7, x7, x3\n\t" "umulh x4, x15, x10\n\t" + "adcs x8, x8, x4\n\t" + /* A[1] * B[3] */ + "umulh x26, x15, x13\n\t" + "adc x9, x9, xzr\n\t" + "mul x25, x15, x13\n\t" + /* A[0] * B[1] */ + "mul x3, x14, x11\n\t" "adds x7, x7, x3\n\t" + "umulh x4, x14, x11\n\t" "adcs x8, x8, x4\n\t" - "adc x9, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x3, x14, x12\n\t" - "umulh x4, x14, x12\n\t" - "adds x8, x8, x3\n\t" - "adc x9, x9, x4\n\t" - /* A[1] * B[1] */ - "mul x3, x15, x11\n\t" - "umulh x4, x15, x11\n\t" - "adds x8, x8, x3\n\t" - "adcs x9, x9, x4\n\t" - "adc %x[a], xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x3, x16, x10\n\t" - "umulh x4, x16, x10\n\t" - "adds x8, x8, x3\n\t" - "adcs x9, x9, x4\n\t" - "adc %x[a], %x[a], xzr\n\t" - /* A[0] * B[3] */ - "mul x3, x14, x13\n\t" - "umulh x4, x14, x13\n\t" - "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x3, x15, x12\n\t" - "umulh x4, x15, x12\n\t" - "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[2] * B[1] */ + /* A[2] * B[1] */ "mul x3, x16, x11\n\t" + "adcs x9, x9, x3\n\t" "umulh x4, x16, x11\n\t" - "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" + "adcs x25, x25, x4\n\t" "adc x26, x26, xzr\n\t" - /* A[3] * B[0] */ - "mul x3, x17, x10\n\t" - "umulh x4, x17, x10\n\t" + /* A[1] * B[2] */ + "mul x3, x15, x12\n\t" "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[1] * B[3] */ - "mul x3, x15, x13\n\t" - "umulh x4, x15, x13\n\t" - "adds %x[a], %x[a], x3\n\t" - "adcs x26, x26, x4\n\t" + "umulh x4, x15, x12\n\t" + "adcs x25, x25, x4\n\t" + "adcs x26, x26, xzr\n\t" "adc x27, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x3, x16, x12\n\t" - "umulh x4, x16, x12\n\t" - "adds %x[a], %x[a], x3\n\t" - "adcs x26, x26, x4\n\t" + /* A[0] * B[2] */ + "mul x3, x14, x12\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x14, x12\n\t" + "adcs x9, x9, x4\n\t" + "adcs x25, x25, xzr\n\t" + "adcs x26, x26, xzr\n\t" "adc x27, x27, xzr\n\t" - /* A[3] * B[1] */ + /* A[1] * B[1] */ + "mul x3, x15, x11\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x15, x11\n\t" + "adcs x9, x9, x4\n\t" + /* A[3] * B[1] */ "mul x3, x17, x11\n\t" + "adcs x25, x25, x3\n\t" "umulh x4, x17, x11\n\t" - "adds %x[a], %x[a], x3\n\t" "adcs x26, x26, x4\n\t" "adc x27, x27, xzr\n\t" - /* A[2] * B[3] */ + /* A[2] * B[2] */ + "mul x3, x16, x12\n\t" + "adds x25, x25, x3\n\t" + "umulh x4, x16, x12\n\t" + "adcs x26, x26, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x17, x13\n\t" + "adcs x27, x27, x3\n\t" + "umulh x28, x17, x13\n\t" + "adc x28, x28, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x14, x13\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x14, x13\n\t" + "adcs x25, x25, x4\n\t" + /* A[2] * B[3] */ "mul x3, x16, x13\n\t" + "adcs x26, x26, x3\n\t" "umulh x4, x16, x13\n\t" - "adds x26, x26, x3\n\t" "adcs x27, x27, x4\n\t" - "adc x28, xzr, xzr\n\t" - /* A[3] * B[2] */ + "adc x28, x28, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x17, x10\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x17, x10\n\t" + "adcs x25, x25, x4\n\t" + /* A[3] * B[2] */ "mul x3, x17, x12\n\t" + "adcs x26, x26, x3\n\t" "umulh x4, x17, x12\n\t" - "adds x26, x26, x3\n\t" "adcs x27, x27, x4\n\t" "adc x28, x28, xzr\n\t" - /* A[3] * B[3] */ - "mul x3, x17, x13\n\t" - "umulh x4, x17, x13\n\t" - "adds x27, x27, x3\n\t" - "adc x28, x28, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x28, x28, x27, #63\n\t" - "extr x27, x27, x26, #63\n\t" - "extr x26, x26, %x[a], #63\n\t" - "extr %x[a], %x[a], x9, #63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x3, #19\n\t" - "mul x4, x3, %x[a]\n\t" - "umulh %x[a], x3, %x[a]\n\t" - "adds x6, x6, x4\n\t" - "mul x4, x3, x26\n\t" - "umulh x26, x3, x26\n\t" - "adcs x7, x7, x4\n\t" - "mul x4, x3, x27\n\t" - "umulh x27, x3, x27\n\t" - "adcs x8, x8, x4\n\t" + "mov x3, #38\n\t" "mul x4, x3, x28\n\t" + "adds x9, x9, x4\n\t" "umulh x5, x3, x28\n\t" - "adcs x9, x9, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x7, x7, %x[a]\n\t" - "adcs x8, x8, x26\n\t" - "adcs x9, x9, x27\n\t" "adc x5, x5, xzr\n\t" - /* Overflow */ + "mov x3, #19\n\t" "extr x5, x5, x9, #63\n\t" "mul x5, x5, x3\n\t" "and x9, x9, #0x7fffffffffffffff\n\t" - "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x25\n\t" + "adds x6, x6, x4\n\t" + "umulh x25, x3, x25\n\t" + "mul x4, x3, x26\n\t" + "adcs x7, x7, x4\n\t" + "umulh x26, x3, x26\n\t" + "mul x4, x3, x27\n\t" + "adcs x8, x8, x4\n\t" + "umulh x27, x3, x27\n\t" "adc x9, x9, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x9, asr 63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" - "adc x9, x9, xzr\n\t" + "adcs x7, x7, x25\n\t" + "adcs x8, x8, x26\n\t" + "adc x9, x9, x27\n\t" /* Store */ "stp x6, x7, [x29, #16]\n\t" "stp x8, x9, [x29, #32]\n\t" /* Add */ - "ldp x6, x7, [x29, #112]\n\t" - "ldp x8, x9, [x29, #128]\n\t" - "adds x10, x6, x19\n\t" - "adcs x11, x7, x20\n\t" - "adcs x12, x8, x21\n\t" - "adc x13, x9, x22\n\t" - "mov x3, #-19\n\t" - "asr %x[a], x13, #63\n\t" - /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "ldp x25, x26, [x29, #48]\n\t" + "ldp x27, x28, [x29, #64]\n\t" + "adds x10, x25, x19\n\t" + "adcs x11, x26, x20\n\t" + "adcs x12, x27, x21\n\t" + "adcs x13, x28, x22\n\t" + "cset x5, cs\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x3, x5, x3\n\t" /* Sub modulus (if overflow) */ - "subs x10, x10, x3\n\t" - "sbcs x11, x11, %x[a]\n\t" - "sbcs x12, x12, %x[a]\n\t" - "sbc x13, x13, x4\n\t" + "adds x10, x10, x3\n\t" + "adcs x11, x11, xzr\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "adcs x12, x12, xzr\n\t" + "adc x13, x13, xzr\n\t" /* Sub */ - "subs x19, x6, x19\n\t" - "sbcs x20, x7, x20\n\t" - "sbcs x21, x8, x21\n\t" - "sbcs x22, x9, x22\n\t" + "subs x19, x25, x19\n\t" + "sbcs x20, x26, x20\n\t" + "sbcs x21, x27, x21\n\t" + "sbcs x22, x28, x22\n\t" + "csetm x5, cc\n\t" "mov x3, #-19\n\t" - "csetm %x[a], cc\n\t" - /* Mask the modulus */ - "and x3, %x[a], x3\n\t" - "and x4, %x[a], #0x7fffffffffffffff\n\t" + "extr x5, x5, x22, #63\n\t" + "mul x3, x5, x3\n\t" /* Add modulus (if underflow) */ - "adds x19, x19, x3\n\t" - "adcs x20, x20, %x[a]\n\t" - "adcs x21, x21, %x[a]\n\t" - "adc x22, x22, x4\n\t" + "subs x19, x19, x3\n\t" + "sbcs x20, x20, xzr\n\t" + "and x22, x22, #0x7fffffffffffffff\n\t" + "sbcs x21, x21, xzr\n\t" + "sbc x22, x22, xzr\n\t" /* Square */ /* A[0] * A[1] */ - "mul x7, x10, x11\n\t" "umulh x8, x10, x11\n\t" + "mul x7, x10, x11\n\t" + /* A[0] * A[3] */ + "umulh x25, x10, x13\n\t" + "mul x9, x10, x13\n\t" /* A[0] * A[2] */ "mul x3, x10, x12\n\t" - "umulh x9, x10, x12\n\t" "adds x8, x8, x3\n\t" - "adc x9, x9, xzr\n\t" - /* A[0] * A[3] */ - "mul x3, x10, x13\n\t" - "umulh %x[a], x10, x13\n\t" - "adds x9, x9, x3\n\t" - "adc %x[a], %x[a], xzr\n\t" + "umulh x4, x10, x12\n\t" + "adcs x9, x9, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x11, x13\n\t" + "adcs x25, x25, x3\n\t" + "umulh x26, x11, x13\n\t" + "adc x26, x26, xzr\n\t" /* A[1] * A[2] */ "mul x3, x11, x12\n\t" - "umulh x4, x11, x12\n\t" "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, xzr, xzr\n\t" - /* A[1] * A[3] */ - "mul x3, x11, x13\n\t" - "umulh x4, x11, x13\n\t" - "adds %x[a], %x[a], x3\n\t" - "adc x26, x26, x4\n\t" + "umulh x4, x11, x12\n\t" + "adcs x25, x25, x4\n\t" /* A[2] * A[3] */ "mul x3, x12, x13\n\t" + "adcs x26, x26, x3\n\t" "umulh x27, x12, x13\n\t" - "adds x26, x26, x3\n\t" "adc x27, x27, xzr\n\t" /* Double */ "adds x7, x7, x7\n\t" "adcs x8, x8, x8\n\t" "adcs x9, x9, x9\n\t" - "adcs %x[a], %x[a], %x[a]\n\t" + "adcs x25, x25, x25\n\t" "adcs x26, x26, x26\n\t" "adcs x27, x27, x27\n\t" "adc x28, xzr, xzr\n\t" /* A[0] * A[0] */ + "umulh x4, x10, x10\n\t" "mul x6, x10, x10\n\t" - "umulh x5, x10, x10\n\t" /* A[1] * A[1] */ "mul x3, x11, x11\n\t" + "adds x7, x7, x4\n\t" "umulh x4, x11, x11\n\t" - "adds x7, x7, x5\n\t" "adcs x8, x8, x3\n\t" - "adc x5, x4, xzr\n\t" /* A[2] * A[2] */ "mul x3, x12, x12\n\t" + "adcs x9, x9, x4\n\t" "umulh x4, x12, x12\n\t" - "adds x9, x9, x5\n\t" - "adcs %x[a], %x[a], x3\n\t" - "adc x5, x4, xzr\n\t" + "adcs x25, x25, x3\n\t" /* A[3] * A[3] */ "mul x3, x13, x13\n\t" + "adcs x26, x26, x4\n\t" "umulh x4, x13, x13\n\t" - "adds x26, x26, x5\n\t" "adcs x27, x27, x3\n\t" "adc x28, x28, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x28, x28, x27, #63\n\t" - "extr x27, x27, x26, #63\n\t" - "extr x26, x26, %x[a], #63\n\t" - "extr %x[a], %x[a], x9, #63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x3, #19\n\t" - "mul x4, x3, %x[a]\n\t" - "umulh %x[a], x3, %x[a]\n\t" - "adds x6, x6, x4\n\t" - "mul x4, x3, x26\n\t" - "umulh x26, x3, x26\n\t" - "adcs x7, x7, x4\n\t" - "mul x4, x3, x27\n\t" - "umulh x27, x3, x27\n\t" - "adcs x8, x8, x4\n\t" + "mov x3, #38\n\t" "mul x4, x3, x28\n\t" + "adds x9, x9, x4\n\t" "umulh x5, x3, x28\n\t" - "adcs x9, x9, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x7, x7, %x[a]\n\t" - "adcs x8, x8, x26\n\t" - "adcs x9, x9, x27\n\t" "adc x5, x5, xzr\n\t" - /* Overflow */ + "mov x3, #19\n\t" "extr x5, x5, x9, #63\n\t" "mul x5, x5, x3\n\t" "and x9, x9, #0x7fffffffffffffff\n\t" - "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x25\n\t" + "adds x6, x6, x4\n\t" + "umulh x25, x3, x25\n\t" + "mul x4, x3, x26\n\t" + "adcs x7, x7, x4\n\t" + "umulh x26, x3, x26\n\t" + "mul x4, x3, x27\n\t" + "adcs x8, x8, x4\n\t" + "umulh x27, x3, x27\n\t" "adc x9, x9, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x9, asr 63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" - "adc x9, x9, xzr\n\t" - /* Store */ - "stp x6, x7, [x29, #80]\n\t" - "stp x8, x9, [x29, #96]\n\t" + "adcs x7, x7, x25\n\t" + "adcs x8, x8, x26\n\t" + "adc x9, x9, x27\n\t" /* Square */ /* A[0] * A[1] */ - "mul x7, x19, x20\n\t" - "umulh x8, x19, x20\n\t" + "umulh x16, x19, x20\n\t" + "mul x15, x19, x20\n\t" + /* A[0] * A[3] */ + "umulh x25, x19, x22\n\t" + "mul x17, x19, x22\n\t" /* A[0] * A[2] */ "mul x3, x19, x21\n\t" - "umulh x9, x19, x21\n\t" - "adds x8, x8, x3\n\t" - "adc x9, x9, xzr\n\t" - /* A[0] * A[3] */ - "mul x3, x19, x22\n\t" - "umulh %x[a], x19, x22\n\t" - "adds x9, x9, x3\n\t" - "adc %x[a], %x[a], xzr\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x19, x21\n\t" + "adcs x17, x17, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x20, x22\n\t" + "adcs x25, x25, x3\n\t" + "umulh x26, x20, x22\n\t" + "adc x26, x26, xzr\n\t" /* A[1] * A[2] */ "mul x3, x20, x21\n\t" + "adds x17, x17, x3\n\t" "umulh x4, x20, x21\n\t" - "adds x9, x9, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, xzr, xzr\n\t" - /* A[1] * A[3] */ - "mul x3, x20, x22\n\t" - "umulh x4, x20, x22\n\t" - "adds %x[a], %x[a], x3\n\t" - "adc x26, x26, x4\n\t" + "adcs x25, x25, x4\n\t" /* A[2] * A[3] */ "mul x3, x21, x22\n\t" + "adcs x26, x26, x3\n\t" "umulh x27, x21, x22\n\t" - "adds x26, x26, x3\n\t" "adc x27, x27, xzr\n\t" /* Double */ - "adds x7, x7, x7\n\t" - "adcs x8, x8, x8\n\t" - "adcs x9, x9, x9\n\t" - "adcs %x[a], %x[a], %x[a]\n\t" + "adds x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adcs x17, x17, x17\n\t" + "adcs x25, x25, x25\n\t" "adcs x26, x26, x26\n\t" "adcs x27, x27, x27\n\t" "adc x28, xzr, xzr\n\t" /* A[0] * A[0] */ - "mul x6, x19, x19\n\t" - "umulh x5, x19, x19\n\t" + "umulh x4, x19, x19\n\t" + "mul x14, x19, x19\n\t" /* A[1] * A[1] */ "mul x3, x20, x20\n\t" + "adds x15, x15, x4\n\t" "umulh x4, x20, x20\n\t" - "adds x7, x7, x5\n\t" - "adcs x8, x8, x3\n\t" - "adc x5, x4, xzr\n\t" + "adcs x16, x16, x3\n\t" /* A[2] * A[2] */ "mul x3, x21, x21\n\t" + "adcs x17, x17, x4\n\t" "umulh x4, x21, x21\n\t" - "adds x9, x9, x5\n\t" - "adcs %x[a], %x[a], x3\n\t" - "adc x5, x4, xzr\n\t" + "adcs x25, x25, x3\n\t" /* A[3] * A[3] */ "mul x3, x22, x22\n\t" + "adcs x26, x26, x4\n\t" "umulh x4, x22, x22\n\t" - "adds x26, x26, x5\n\t" "adcs x27, x27, x3\n\t" "adc x28, x28, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x28, x28, x27, #63\n\t" - "extr x27, x27, x26, #63\n\t" - "extr x26, x26, %x[a], #63\n\t" - "extr %x[a], %x[a], x9, #63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x3, #38\n\t" + "mul x4, x3, x28\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x28\n\t" + "adc x5, x5, xzr\n\t" "mov x3, #19\n\t" - "mul x4, x3, %x[a]\n\t" - "umulh %x[a], x3, %x[a]\n\t" - "adds x6, x6, x4\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x25\n\t" + "adds x14, x14, x4\n\t" + "umulh x25, x3, x25\n\t" "mul x4, x3, x26\n\t" + "adcs x15, x15, x4\n\t" "umulh x26, x3, x26\n\t" - "adcs x7, x7, x4\n\t" "mul x4, x3, x27\n\t" + "adcs x16, x16, x4\n\t" "umulh x27, x3, x27\n\t" - "adcs x8, x8, x4\n\t" - "mul x4, x3, x28\n\t" - "umulh x5, x3, x28\n\t" - "adcs x9, x9, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x7, x7, %x[a]\n\t" - "adcs x8, x8, x26\n\t" - "adcs x9, x9, x27\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ - "extr x5, x5, x9, #63\n\t" - "mul x5, x5, x3\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" - "adc x9, x9, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x9, asr 63\n\t" - "and x9, x9, #0x7fffffffffffffff\n\t" - "adds x6, x6, x5\n\t" - "adcs x7, x7, xzr\n\t" - "adcs x8, x8, xzr\n\t" - "adc x9, x9, xzr\n\t" - /* Store */ - "ldr %x[a], [x29, #184]\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x25\n\t" + "adcs x16, x16, x26\n\t" + "adc x17, x17, x27\n\t" /* Multiply */ - "ldp x14, x15, [%x[a]]\n\t" - "ldp x16, x17, [%x[a], #16]\n\t" - /* A[0] * B[0] */ - "mul x10, x14, x6\n\t" - "umulh x11, x14, x6\n\t" - /* A[0] * B[1] */ - "mul x3, x14, x7\n\t" - "umulh x12, x14, x7\n\t" + "ldp x19, x20, [%x[a]]\n\t" + "ldp x21, x22, [%x[a], #16]\n\t" + /* A[0] * B[0] */ + "umulh x11, x19, x14\n\t" + "mul x10, x19, x14\n\t" + /* A[2] * B[0] */ + "umulh x13, x21, x14\n\t" + "mul x12, x21, x14\n\t" + /* A[1] * B[0] */ + "mul x3, x20, x14\n\t" "adds x11, x11, x3\n\t" - "adc x12, x12, xzr\n\t" - /* A[1] * B[0] */ - "mul x3, x15, x6\n\t" - "umulh x4, x15, x6\n\t" + "umulh x4, x20, x14\n\t" + "adcs x12, x12, x4\n\t" + /* A[1] * B[3] */ + "umulh x26, x20, x17\n\t" + "adc x13, x13, xzr\n\t" + "mul x25, x20, x17\n\t" + /* A[0] * B[1] */ + "mul x3, x19, x15\n\t" "adds x11, x11, x3\n\t" + "umulh x4, x19, x15\n\t" "adcs x12, x12, x4\n\t" - "adc x13, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x3, x14, x8\n\t" - "umulh x4, x14, x8\n\t" - "adds x12, x12, x3\n\t" - "adc x13, x13, x4\n\t" - /* A[1] * B[1] */ - "mul x3, x15, x7\n\t" - "umulh x4, x15, x7\n\t" + /* A[2] * B[1] */ + "mul x3, x21, x15\n\t" + "adcs x13, x13, x3\n\t" + "umulh x4, x21, x15\n\t" + "adcs x25, x25, x4\n\t" + "adc x26, x26, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x20, x16\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x20, x16\n\t" + "adcs x25, x25, x4\n\t" + "adcs x26, x26, xzr\n\t" + "adc x27, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x19, x16\n\t" "adds x12, x12, x3\n\t" + "umulh x4, x19, x16\n\t" "adcs x13, x13, x4\n\t" - "adc %x[a], xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x3, x16, x6\n\t" - "umulh x4, x16, x6\n\t" + "adcs x25, x25, xzr\n\t" + "adcs x26, x26, xzr\n\t" + "adc x27, x27, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x20, x15\n\t" "adds x12, x12, x3\n\t" + "umulh x4, x20, x15\n\t" "adcs x13, x13, x4\n\t" - "adc %x[a], %x[a], xzr\n\t" - /* A[0] * B[3] */ - "mul x3, x14, x9\n\t" - "umulh x4, x14, x9\n\t" - "adds x13, x13, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x3, x15, x8\n\t" - "umulh x4, x15, x8\n\t" - "adds x13, x13, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[2] * B[1] */ - "mul x3, x16, x7\n\t" - "umulh x4, x16, x7\n\t" - "adds x13, x13, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[3] * B[0] */ - "mul x3, x17, x6\n\t" - "umulh x4, x17, x6\n\t" - "adds x13, x13, x3\n\t" - "adcs %x[a], %x[a], x4\n\t" - "adc x26, x26, xzr\n\t" - /* A[1] * B[3] */ - "mul x3, x15, x9\n\t" - "umulh x4, x15, x9\n\t" - "adds %x[a], %x[a], x3\n\t" - "adcs x26, x26, x4\n\t" - "adc x27, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x3, x16, x8\n\t" - "umulh x4, x16, x8\n\t" - "adds %x[a], %x[a], x3\n\t" + /* A[3] * B[1] */ + "mul x3, x22, x15\n\t" + "adcs x25, x25, x3\n\t" + "umulh x4, x22, x15\n\t" "adcs x26, x26, x4\n\t" "adc x27, x27, xzr\n\t" - /* A[3] * B[1] */ - "mul x3, x17, x7\n\t" - "umulh x4, x17, x7\n\t" - "adds %x[a], %x[a], x3\n\t" + /* A[2] * B[2] */ + "mul x3, x21, x16\n\t" + "adds x25, x25, x3\n\t" + "umulh x4, x21, x16\n\t" "adcs x26, x26, x4\n\t" - "adc x27, x27, xzr\n\t" - /* A[2] * B[3] */ - "mul x3, x16, x9\n\t" - "umulh x4, x16, x9\n\t" - "adds x26, x26, x3\n\t" + /* A[3] * B[3] */ + "mul x3, x22, x17\n\t" + "adcs x27, x27, x3\n\t" + "umulh x28, x22, x17\n\t" + "adc x28, x28, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x19, x17\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x19, x17\n\t" + "adcs x25, x25, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x21, x17\n\t" + "adcs x26, x26, x3\n\t" + "umulh x4, x21, x17\n\t" "adcs x27, x27, x4\n\t" - "adc x28, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x3, x17, x8\n\t" - "umulh x4, x17, x8\n\t" - "adds x26, x26, x3\n\t" + "adc x28, x28, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x22, x14\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x22, x14\n\t" + "adcs x25, x25, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x22, x16\n\t" + "adcs x26, x26, x3\n\t" + "umulh x4, x22, x16\n\t" "adcs x27, x27, x4\n\t" "adc x28, x28, xzr\n\t" - /* A[3] * B[3] */ - "mul x3, x17, x9\n\t" - "umulh x4, x17, x9\n\t" - "adds x27, x27, x3\n\t" - "adc x28, x28, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x28, x28, x27, #63\n\t" - "extr x27, x27, x26, #63\n\t" - "extr x26, x26, %x[a], #63\n\t" - "extr %x[a], %x[a], x13, #63\n\t" - "and x13, x13, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x3, #19\n\t" - "mul x4, x3, %x[a]\n\t" - "umulh %x[a], x3, %x[a]\n\t" - "adds x10, x10, x4\n\t" - "mul x4, x3, x26\n\t" - "umulh x26, x3, x26\n\t" - "adcs x11, x11, x4\n\t" - "mul x4, x3, x27\n\t" - "umulh x27, x3, x27\n\t" - "adcs x12, x12, x4\n\t" + "mov x3, #38\n\t" "mul x4, x3, x28\n\t" + "adds x13, x13, x4\n\t" "umulh x5, x3, x28\n\t" - "adcs x13, x13, x4\n\t" "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x11, x11, %x[a]\n\t" - "adcs x12, x12, x26\n\t" - "adcs x13, x13, x27\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ + "mov x3, #19\n\t" "extr x5, x5, x13, #63\n\t" "mul x5, x5, x3\n\t" "and x13, x13, #0x7fffffffffffffff\n\t" - "adds x10, x10, x5\n\t" - "adcs x11, x11, xzr\n\t" - "adcs x12, x12, xzr\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x25\n\t" + "adds x10, x10, x4\n\t" + "umulh x25, x3, x25\n\t" + "mul x4, x3, x26\n\t" + "adcs x11, x11, x4\n\t" + "umulh x26, x3, x26\n\t" + "mul x4, x3, x27\n\t" + "adcs x12, x12, x4\n\t" + "umulh x27, x3, x27\n\t" "adc x13, x13, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x13, asr 63\n\t" - "and x13, x13, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x10, x10, x5\n\t" - "adcs x11, x11, xzr\n\t" - "adcs x12, x12, xzr\n\t" - "adc x13, x13, xzr\n\t" - /* Store */ - "stp x10, x11, [x29, #48]\n\t" - "stp x12, x13, [x29, #64]\n\t" - "sub x25, x25, #1\n\t" - "cmp x25, #0\n\t" + "adcs x11, x11, x25\n\t" + "adcs x12, x12, x26\n\t" + "adc x13, x13, x27\n\t" + "subs x24, x24, #1\n\t" "bge L_curve25519_bits_%=\n\t" - "mov x25, #63\n\t" - "sub x24, x24, #8\n\t" - "cmp x24, #0\n\t" - "bge L_curve25519_words_%=\n\t" /* Invert */ "add x0, x29, #48\n\t" "add x1, x29, #16\n\t" @@ -2407,63 +2737,199 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x70\n\t" -#ifndef NDEBUG - "add x1, x29, #0x50\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x24, #3\n\t" -#ifndef NDEBUG - "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x70\n\t" + /* Loop: 5 times */ + "mov x24, #5\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_curve25519_inv_1_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_1_%=\n\t" - "add x0, x29, #0x50\n\t" + "bne L_curve25519_inv_1_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #112]\n\t" + "stp x8, x9, [x29, #128]\n\t" #ifndef NDEBUG - "add x1, x29, #0x70\n\t" + "add x0, x29, #0x50\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x70\n\t" "add x2, x29, #0x50\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x70\n\t" - "add x1, x29, #0x50\n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x24, #8\n\t" -#ifndef NDEBUG - "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x70\n\t" + /* Loop: 10 times */ + "mov x24, #10\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_curve25519_inv_2_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_2_%=\n\t" -#ifndef NDEBUG + "bne L_curve25519_inv_2_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #112]\n\t" + "stp x8, x9, [x29, #128]\n\t" "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ #ifndef NDEBUG "add x1, x29, #0x70\n\t" #endif /* !NDEBUG */ @@ -2473,87 +2939,298 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x90\n\t" -#ifndef NDEBUG - "add x1, x29, #0x70\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x24, #18\n\t" -#ifndef NDEBUG - "add x0, x29, #0x90\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x90\n\t" + /* Loop: 20 times */ + "mov x24, #20\n\t" + "ldp x6, x7, [x29, #112]\n\t" + "ldp x8, x9, [x29, #128]\n\t" "\n" "L_curve25519_inv_3_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_3_%=\n\t" - "add x0, x29, #0x70\n\t" + "bne L_curve25519_inv_3_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #144]\n\t" + "stp x8, x9, [x29, #160]\n\t" #ifndef NDEBUG - "add x1, x29, #0x90\n\t" + "add x0, x29, #0x70\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x90\n\t" "add x2, x29, #0x70\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x24, #9\n\t" -#ifndef NDEBUG - "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x70\n\t" + /* Loop: 10 times */ + "mov x24, #10\n\t" + "ldp x6, x7, [x29, #112]\n\t" + "ldp x8, x9, [x29, #128]\n\t" "\n" "L_curve25519_inv_4_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_4_%=\n\t" + "bne L_curve25519_inv_4_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #112]\n\t" + "stp x8, x9, [x29, #128]\n\t" "add x0, x29, #0x50\n\t" -#ifndef NDEBUG "add x1, x29, #0x70\n\t" -#endif /* !NDEBUG */ "add x2, x29, #0x50\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x70\n\t" - "add x1, x29, #0x50\n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x24, #48\n\t" -#ifndef NDEBUG - "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x70\n\t" + /* Loop: 50 times */ + "mov x24, #50\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_curve25519_inv_5_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_5_%=\n\t" -#ifndef NDEBUG + "bne L_curve25519_inv_5_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #112]\n\t" + "stp x8, x9, [x29, #128]\n\t" "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ #ifndef NDEBUG "add x1, x29, #0x70\n\t" #endif /* !NDEBUG */ @@ -2563,81 +3240,299 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x90\n\t" -#ifndef NDEBUG - "add x1, x29, #0x70\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x24, #0x62\n\t" -#ifndef NDEBUG - "add x0, x29, #0x90\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x90\n\t" + /* Loop: 100 times */ + "mov x24, #0x64\n\t" + "ldp x6, x7, [x29, #112]\n\t" + "ldp x8, x9, [x29, #128]\n\t" "\n" "L_curve25519_inv_6_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_6_%=\n\t" - "add x0, x29, #0x70\n\t" + "bne L_curve25519_inv_6_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #144]\n\t" + "stp x8, x9, [x29, #160]\n\t" #ifndef NDEBUG - "add x1, x29, #0x90\n\t" + "add x0, x29, #0x70\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x90\n\t" "add x2, x29, #0x70\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x24, #49\n\t" -#ifndef NDEBUG - "add x0, x29, #0x70\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x70\n\t" + /* Loop: 50 times */ + "mov x24, #50\n\t" + "ldp x6, x7, [x29, #112]\n\t" + "ldp x8, x9, [x29, #128]\n\t" "\n" "L_curve25519_inv_7_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_7_%=\n\t" + "bne L_curve25519_inv_7_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #112]\n\t" + "stp x8, x9, [x29, #128]\n\t" "add x0, x29, #0x50\n\t" -#ifndef NDEBUG "add x1, x29, #0x70\n\t" -#endif /* !NDEBUG */ "add x2, x29, #0x50\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x24, #4\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 5 times */ + "mov x24, #5\n\t" + "ldp x6, x7, [x29, #80]\n\t" + "ldp x8, x9, [x29, #96]\n\t" "\n" "L_curve25519_inv_8_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x24, x24, #1\n\t" - "bcs L_curve25519_inv_8_%=\n\t" + "bne L_curve25519_inv_8_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" "add x0, x29, #16\n\t" -#ifndef NDEBUG "add x1, x29, #0x50\n\t" -#endif /* !NDEBUG */ "add x2, x29, #48\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" @@ -2650,136 +3545,122 @@ "ldp x8, x9, [%x[r], #16]\n\t" "ldp x10, x11, [x29, #16]\n\t" "ldp x12, x13, [x29, #32]\n\t" - /* A[0] * B[0] */ - "mul x14, x6, x10\n\t" + /* A[0] * B[0] */ "umulh x15, x6, x10\n\t" - /* A[0] * B[1] */ - "mul x3, x6, x11\n\t" - "umulh x16, x6, x11\n\t" - "adds x15, x15, x3\n\t" - "adc x16, x16, xzr\n\t" - /* A[1] * B[0] */ + "mul x14, x6, x10\n\t" + /* A[2] * B[0] */ + "umulh x17, x8, x10\n\t" + "mul x16, x8, x10\n\t" + /* A[1] * B[0] */ "mul x3, x7, x10\n\t" + "adds x15, x15, x3\n\t" "umulh x4, x7, x10\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x7, x13\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x7, x13\n\t" + /* A[0] * B[1] */ + "mul x3, x6, x11\n\t" "adds x15, x15, x3\n\t" + "umulh x4, x6, x11\n\t" "adcs x16, x16, x4\n\t" - "adc x17, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x3, x6, x12\n\t" - "umulh x4, x6, x12\n\t" - "adds x16, x16, x3\n\t" - "adc x17, x17, x4\n\t" - /* A[1] * B[1] */ - "mul x3, x7, x11\n\t" - "umulh x4, x7, x11\n\t" - "adds x16, x16, x3\n\t" - "adcs x17, x17, x4\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x3, x8, x10\n\t" - "umulh x4, x8, x10\n\t" - "adds x16, x16, x3\n\t" - "adcs x17, x17, x4\n\t" - "adc x19, x19, xzr\n\t" - /* A[0] * B[3] */ - "mul x3, x6, x13\n\t" - "umulh x4, x6, x13\n\t" - "adds x17, x17, x3\n\t" - "adcs x19, x19, x4\n\t" - "adc x20, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x3, x7, x12\n\t" - "umulh x4, x7, x12\n\t" - "adds x17, x17, x3\n\t" - "adcs x19, x19, x4\n\t" - "adc x20, x20, xzr\n\t" - /* A[2] * B[1] */ + /* A[2] * B[1] */ "mul x3, x8, x11\n\t" + "adcs x17, x17, x3\n\t" "umulh x4, x8, x11\n\t" - "adds x17, x17, x3\n\t" "adcs x19, x19, x4\n\t" "adc x20, x20, xzr\n\t" - /* A[3] * B[0] */ - "mul x3, x9, x10\n\t" - "umulh x4, x9, x10\n\t" + /* A[1] * B[2] */ + "mul x3, x7, x12\n\t" "adds x17, x17, x3\n\t" + "umulh x4, x7, x12\n\t" "adcs x19, x19, x4\n\t" - "adc x20, x20, xzr\n\t" - /* A[1] * B[3] */ - "mul x3, x7, x13\n\t" - "umulh x4, x7, x13\n\t" - "adds x19, x19, x3\n\t" - "adcs x20, x20, x4\n\t" + "adcs x20, x20, xzr\n\t" "adc x21, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x3, x8, x12\n\t" - "umulh x4, x8, x12\n\t" - "adds x19, x19, x3\n\t" - "adcs x20, x20, x4\n\t" + /* A[0] * B[2] */ + "mul x3, x6, x12\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x6, x12\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" "adc x21, x21, xzr\n\t" - /* A[3] * B[1] */ + /* A[1] * B[1] */ + "mul x3, x7, x11\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x7, x11\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ "mul x3, x9, x11\n\t" + "adcs x19, x19, x3\n\t" "umulh x4, x9, x11\n\t" - "adds x19, x19, x3\n\t" "adcs x20, x20, x4\n\t" "adc x21, x21, xzr\n\t" - /* A[2] * B[3] */ + /* A[2] * B[2] */ + "mul x3, x8, x12\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x8, x12\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x9, x13\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x9, x13\n\t" + "adc x22, x22, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x6, x13\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x6, x13\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ "mul x3, x8, x13\n\t" + "adcs x20, x20, x3\n\t" "umulh x4, x8, x13\n\t" - "adds x20, x20, x3\n\t" "adcs x21, x21, x4\n\t" - "adc x22, xzr, xzr\n\t" - /* A[3] * B[2] */ + "adc x22, x22, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x9, x10\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x9, x10\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ "mul x3, x9, x12\n\t" + "adcs x20, x20, x3\n\t" "umulh x4, x9, x12\n\t" - "adds x20, x20, x3\n\t" "adcs x21, x21, x4\n\t" "adc x22, x22, xzr\n\t" - /* A[3] * B[3] */ - "mul x3, x9, x13\n\t" - "umulh x4, x9, x13\n\t" - "adds x21, x21, x3\n\t" - "adc x22, x22, x4\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x22, x22, x21, #63\n\t" - "extr x21, x21, x20, #63\n\t" - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "and x17, x17, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" "mul x4, x3, x19\n\t" - "umulh x19, x3, x19\n\t" "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" "mul x4, x3, x20\n\t" - "umulh x20, x3, x20\n\t" "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" "mul x4, x3, x21\n\t" - "umulh x21, x3, x21\n\t" "adcs x16, x16, x4\n\t" - "mul x4, x3, x22\n\t" - "umulh x5, x3, x22\n\t" - "adcs x17, x17, x4\n\t" - "adc x5, x5, xzr\n\t" - /* Add remaining product results in */ - "adds x15, x15, x19\n\t" - "adcs x16, x16, x20\n\t" - "adcs x17, x17, x21\n\t" - "adc x5, x5, xzr\n\t" - /* Overflow */ - "extr x5, x5, x17, #63\n\t" - "mul x5, x5, x3\n\t" - "and x17, x17, #0x7fffffffffffffff\n\t" - "adds x14, x14, x5\n\t" - "adcs x15, x15, xzr\n\t" - "adcs x16, x16, xzr\n\t" + "umulh x21, x3, x21\n\t" "adc x17, x17, xzr\n\t" - /* Reduce if top bit set */ - "and x5, x3, x17, asr 63\n\t" - "and x17, x17, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" + /* Reduce if top bit set */ + "mov x3, #19\n\t" + "and x4, x3, x17, asr 63\n\t" + "adds x14, x14, x4\n\t" "adcs x15, x15, xzr\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" "adcs x16, x16, xzr\n\t" "adc x17, x17, xzr\n\t" "adds x4, x14, x3\n\t" @@ -2800,11 +3681,12 @@ "ldp x29, x30, [sp], #0xc0\n\t" : [r] "+r" (r), [n] "+r" (n), [a] "+r" (a) : - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "cc" ); return (uint32_t)(size_t)r; } +#ifdef HAVE_ED25519 void fe_pow22523(fe r, const fe a) { __asm__ __volatile__ ( @@ -2877,28 +3759,100 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #48\n\t" - "add x1, x29, #16\n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x23, #3\n\t" -#ifndef NDEBUG - "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #48\n\t" + /* Loop: 5 times */ + "mov x23, #5\n\t" + "ldp x6, x7, [x29, #16]\n\t" + "ldp x8, x9, [x29, #32]\n\t" "\n" "L_fe_pow22523_1_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_1_%=\n\t" + "bne L_fe_pow22523_1_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #48]\n\t" + "stp x8, x9, [x29, #64]\n\t" +#ifndef NDEBUG "add x0, x29, #16\n\t" +#endif /* !NDEBUG */ #ifndef NDEBUG "add x1, x29, #48\n\t" #endif /* !NDEBUG */ @@ -2908,30 +3862,98 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #48\n\t" - "add x1, x29, #16\n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x23, #8\n\t" -#ifndef NDEBUG - "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #48\n\t" + /* Loop: 10 times */ + "mov x23, #10\n\t" + "ldp x6, x7, [x29, #16]\n\t" + "ldp x8, x9, [x29, #32]\n\t" "\n" "L_fe_pow22523_2_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_2_%=\n\t" -#ifndef NDEBUG + "bne L_fe_pow22523_2_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #48]\n\t" + "stp x8, x9, [x29, #64]\n\t" "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ #ifndef NDEBUG "add x1, x29, #48\n\t" #endif /* !NDEBUG */ @@ -2941,87 +3963,298 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x50\n\t" -#ifndef NDEBUG - "add x1, x29, #48\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x23, #18\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 20 times */ + "mov x23, #20\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_pow22523_3_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_3_%=\n\t" - "add x0, x29, #48\n\t" + "bne L_fe_pow22523_3_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" #ifndef NDEBUG - "add x1, x29, #0x50\n\t" + "add x0, x29, #48\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x50\n\t" "add x2, x29, #48\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x23, #9\n\t" -#ifndef NDEBUG - "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #48\n\t" + /* Loop: 10 times */ + "mov x23, #10\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_pow22523_4_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_4_%=\n\t" + "bne L_fe_pow22523_4_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #48]\n\t" + "stp x8, x9, [x29, #64]\n\t" "add x0, x29, #16\n\t" -#ifndef NDEBUG "add x1, x29, #48\n\t" -#endif /* !NDEBUG */ "add x2, x29, #16\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #48\n\t" - "add x1, x29, #16\n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x23, #48\n\t" -#ifndef NDEBUG - "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #48\n\t" + /* Loop: 50 times */ + "mov x23, #50\n\t" + "ldp x6, x7, [x29, #16]\n\t" + "ldp x8, x9, [x29, #32]\n\t" "\n" "L_fe_pow22523_5_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_5_%=\n\t" -#ifndef NDEBUG + "bne L_fe_pow22523_5_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #48]\n\t" + "stp x8, x9, [x29, #64]\n\t" "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ #ifndef NDEBUG "add x1, x29, #48\n\t" #endif /* !NDEBUG */ @@ -3031,77 +4264,220 @@ #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "add x0, x29, #0x50\n\t" -#ifndef NDEBUG - "add x1, x29, #48\n\t" -#endif /* !NDEBUG */ -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ - "mov x23, #0x62\n\t" -#ifndef NDEBUG - "add x0, x29, #0x50\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #0x50\n\t" + /* Loop: 100 times */ + "mov x23, #0x64\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_pow22523_6_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_6_%=\n\t" - "add x0, x29, #48\n\t" + "bne L_fe_pow22523_6_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #80]\n\t" + "stp x8, x9, [x29, #96]\n\t" #ifndef NDEBUG - "add x1, x29, #0x50\n\t" + "add x0, x29, #48\n\t" #endif /* !NDEBUG */ + "add x1, x29, #0x50\n\t" "add x2, x29, #48\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x23, #49\n\t" -#ifndef NDEBUG - "add x0, x29, #48\n\t" -#endif /* !NDEBUG */ - "add x1, x29, #48\n\t" + /* Loop: 50 times */ + "mov x23, #50\n\t" + "ldp x6, x7, [x29, #48]\n\t" + "ldp x8, x9, [x29, #64]\n\t" "\n" "L_fe_pow22523_7_%=: \n\t" -#ifndef __APPLE__ - "bl fe_sq\n\t" -#else - "bl _fe_sq\n\t" -#endif /* __APPLE__ */ + /* Square */ + /* A[0] * A[1] */ + "umulh x12, x6, x7\n\t" + "mul x11, x6, x7\n\t" + /* A[0] * A[3] */ + "umulh x14, x6, x9\n\t" + "mul x13, x6, x9\n\t" + /* A[0] * A[2] */ + "mul x3, x6, x8\n\t" + "adds x12, x12, x3\n\t" + "umulh x4, x6, x8\n\t" + "adcs x13, x13, x4\n\t" + /* A[1] * A[3] */ + "mul x3, x7, x9\n\t" + "adcs x14, x14, x3\n\t" + "umulh x15, x7, x9\n\t" + "adc x15, x15, xzr\n\t" + /* A[1] * A[2] */ + "mul x3, x7, x8\n\t" + "adds x13, x13, x3\n\t" + "umulh x4, x7, x8\n\t" + "adcs x14, x14, x4\n\t" + /* A[2] * A[3] */ + "mul x3, x8, x9\n\t" + "adcs x15, x15, x3\n\t" + "umulh x16, x8, x9\n\t" + "adc x16, x16, xzr\n\t" + /* Double */ + "adds x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adcs x15, x15, x15\n\t" + "adcs x16, x16, x16\n\t" + "adc x17, xzr, xzr\n\t" + /* A[0] * A[0] */ + "umulh x4, x6, x6\n\t" + "mul x10, x6, x6\n\t" + /* A[1] * A[1] */ + "mul x3, x7, x7\n\t" + "adds x11, x11, x4\n\t" + "umulh x4, x7, x7\n\t" + "adcs x12, x12, x3\n\t" + /* A[2] * A[2] */ + "mul x3, x8, x8\n\t" + "adcs x13, x13, x4\n\t" + "umulh x4, x8, x8\n\t" + "adcs x14, x14, x3\n\t" + /* A[3] * A[3] */ + "mul x3, x9, x9\n\t" + "adcs x15, x15, x4\n\t" + "umulh x4, x9, x9\n\t" + "adcs x16, x16, x3\n\t" + "adc x17, x17, x4\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x17\n\t" + "adds x13, x13, x4\n\t" + "umulh x5, x3, x17\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x13, #63\n\t" + "mul x5, x5, x3\n\t" + "and x13, x13, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x14\n\t" + "adds x10, x10, x4\n\t" + "umulh x14, x3, x14\n\t" + "mul x4, x3, x15\n\t" + "adcs x11, x11, x4\n\t" + "umulh x15, x3, x15\n\t" + "mul x4, x3, x16\n\t" + "adcs x12, x12, x4\n\t" + "umulh x16, x3, x16\n\t" + "adc x13, x13, xzr\n\t" + /* Add high product results in */ + "adds x6, x10, x5\n\t" + "adcs x7, x11, x14\n\t" + "adcs x8, x12, x15\n\t" + "adc x9, x13, x16\n\t" "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_7_%=\n\t" + "bne L_fe_pow22523_7_%=\n\t" + /* Store */ + "stp x6, x7, [x29, #48]\n\t" + "stp x8, x9, [x29, #64]\n\t" "add x0, x29, #16\n\t" -#ifndef NDEBUG "add x1, x29, #48\n\t" -#endif /* !NDEBUG */ "add x2, x29, #16\n\t" #ifndef __APPLE__ "bl fe_mul\n\t" #else "bl _fe_mul\n\t" #endif /* __APPLE__ */ - "mov x23, #1\n\t" #ifndef NDEBUG "add x0, x29, #16\n\t" #endif /* !NDEBUG */ "add x1, x29, #16\n\t" - "\n" - "L_fe_pow22523_8_%=: \n\t" #ifndef __APPLE__ "bl fe_sq\n\t" #else "bl _fe_sq\n\t" #endif /* __APPLE__ */ - "subs x23, x23, #1\n\t" - "bcs L_fe_pow22523_8_%=\n\t" +#ifndef __APPLE__ + "bl fe_sq\n\t" +#else + "bl _fe_sq\n\t" +#endif /* __APPLE__ */ "ldr x0, [x29, #112]\n\t" #ifndef NDEBUG "add x1, x29, #16\n\t" @@ -3115,1466 +4491,1234 @@ "ldp x29, x30, [sp], #0x80\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "x2", "x23" + : "memory", "x2", "x23", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "cc" ); } -void fe_ge_to_p2(fe rx, fe ry, fe rz, const fe px, const fe py, const fe pz, const fe pt) +void ge_p1p1_to_p2(ge_p2* r, const ge_p1p1* p) { __asm__ __volatile__ ( - "stp x29, x30, [sp, #-64]!\n\t" + "stp x29, x30, [sp, #-32]!\n\t" "add x29, sp, #0\n\t" - "str %x[ry], [x29, #16]\n\t" - "str %x[rz], [x29, #24]\n\t" - "str %x[px], [x29, #32]\n\t" - "str %x[py], [x29, #40]\n\t" - "str %x[pz], [x29, #48]\n\t" - "str %x[pt], [x29, #56]\n\t" - "ldr x1, [x29, #32]\n\t" - "ldr x2, [x29, #56]\n\t" + "str %x[r], [x29, #16]\n\t" + "str %x[p], [x29, #24]\n\t" + "mov x2, x1\n\t" + "add x1, x1, #0x60\n\t" /* Multiply */ - "ldp x11, x12, [x1]\n\t" - "ldp x13, x14, [x1, #16]\n\t" - "ldp x15, x16, [x2]\n\t" - "ldp x17, x19, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x3, x11, x15\n\t" - "umulh x4, x11, x15\n\t" - /* A[0] * B[1] */ - "mul x20, x11, x16\n\t" - "umulh x5, x11, x16\n\t" - "adds x4, x4, x20\n\t" - "adc x5, x5, xzr\n\t" - /* A[1] * B[0] */ - "mul x20, x12, x15\n\t" - "umulh x21, x12, x15\n\t" - "adds x4, x4, x20\n\t" - "adcs x5, x5, x21\n\t" - "adc x6, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x20, x11, x17\n\t" - "umulh x21, x11, x17\n\t" - "adds x5, x5, x20\n\t" - "adc x6, x6, x21\n\t" - /* A[1] * B[1] */ - "mul x20, x12, x16\n\t" - "umulh x21, x12, x16\n\t" - "adds x5, x5, x20\n\t" - "adcs x6, x6, x21\n\t" - "adc x7, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x20, x13, x15\n\t" - "umulh x21, x13, x15\n\t" - "adds x5, x5, x20\n\t" - "adcs x6, x6, x21\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * B[3] */ - "mul x20, x11, x19\n\t" - "umulh x21, x11, x19\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x20, x12, x17\n\t" - "umulh x21, x12, x17\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[2] * B[1] */ - "mul x20, x13, x16\n\t" - "umulh x21, x13, x16\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[3] * B[0] */ - "mul x20, x14, x15\n\t" - "umulh x21, x14, x15\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[3] */ - "mul x20, x12, x19\n\t" - "umulh x21, x12, x19\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x20, x13, x17\n\t" - "umulh x21, x13, x17\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, x9, xzr\n\t" - /* A[3] * B[1] */ - "mul x20, x14, x16\n\t" - "umulh x21, x14, x16\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[3] */ - "mul x20, x13, x19\n\t" - "umulh x21, x13, x19\n\t" - "adds x8, x8, x20\n\t" - "adcs x9, x9, x21\n\t" - "adc x10, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x20, x14, x17\n\t" - "umulh x21, x14, x17\n\t" - "adds x8, x8, x20\n\t" - "adcs x9, x9, x21\n\t" - "adc x10, x10, xzr\n\t" - /* A[3] * B[3] */ - "mul x20, x14, x19\n\t" - "umulh x21, x14, x19\n\t" - "adds x9, x9, x20\n\t" - "adc x10, x10, x21\n\t" - /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "extr x7, x7, x6, #63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x20, #19\n\t" - "mul x21, x20, x7\n\t" - "umulh x7, x20, x7\n\t" - "adds x3, x3, x21\n\t" - "mul x21, x20, x8\n\t" - "umulh x8, x20, x8\n\t" - "adcs x4, x4, x21\n\t" - "mul x21, x20, x9\n\t" - "umulh x9, x20, x9\n\t" - "adcs x5, x5, x21\n\t" - "mul x21, x20, x10\n\t" - "umulh x22, x20, x10\n\t" - "adcs x6, x6, x21\n\t" + "ldp x10, x11, [x1]\n\t" + "ldp x12, x13, [x1, #16]\n\t" + "ldp x6, x7, [x2]\n\t" + "ldp x8, x9, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x15, x10, x6\n\t" + "mul x14, x10, x6\n\t" + /* A[2] * B[0] */ + "umulh x17, x12, x6\n\t" + "mul x16, x12, x6\n\t" + /* A[1] * B[0] */ + "mul x3, x11, x6\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x11, x6\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x11, x9\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x11, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x10, x7\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x10, x7\n\t" + "adcs x16, x16, x4\n\t" + /* A[2] * B[1] */ + "mul x3, x12, x7\n\t" + "adcs x17, x17, x3\n\t" + "umulh x4, x12, x7\n\t" + "adcs x19, x19, x4\n\t" + "adc x20, x20, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x11, x8\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x11, x8\n\t" + "adcs x19, x19, x4\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x10, x8\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x10, x8\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, x21, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x11, x7\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x11, x7\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ + "mul x3, x13, x7\n\t" + "adcs x19, x19, x3\n\t" + "umulh x4, x13, x7\n\t" + "adcs x20, x20, x4\n\t" + "adc x21, x21, xzr\n\t" + /* A[2] * B[2] */ + "mul x3, x12, x8\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x12, x8\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x13, x9\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x13, x9\n\t" "adc x22, x22, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x7\n\t" - "adcs x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" + /* A[0] * B[3] */ + "mul x3, x10, x9\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x10, x9\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x12, x9\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x12, x9\n\t" + "adcs x21, x21, x4\n\t" "adc x22, x22, xzr\n\t" - /* Overflow */ - "extr x22, x22, x6, #63\n\t" - "mul x22, x22, x20\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x22\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" - /* Reduce if top bit set */ - "and x22, x20, x6, asr 63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x22\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x13, x6\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x13, x6\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x13, x8\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x13, x8\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x19\n\t" + "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" + "mul x4, x3, x20\n\t" + "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" + "mul x4, x3, x21\n\t" + "adcs x16, x16, x4\n\t" + "umulh x21, x3, x21\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" /* Store */ - "stp x3, x4, [x0]\n\t" - "stp x5, x6, [x0, #16]\n\t" - "ldr x0, [x29, #16]\n\t" - "ldr x1, [x29, #40]\n\t" - "ldr x2, [x29, #48]\n\t" + "stp x14, x15, [x0]\n\t" + "stp x16, x17, [x0, #16]\n\t" + "sub x2, x1, #32\n\t" + "add x0, x0, #0x40\n\t" /* Multiply */ - "ldp x11, x12, [x1]\n\t" - "ldp x13, x14, [x1, #16]\n\t" - "ldp x15, x16, [x2]\n\t" - "ldp x17, x19, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x3, x11, x15\n\t" - "umulh x4, x11, x15\n\t" - /* A[0] * B[1] */ - "mul x20, x11, x16\n\t" - "umulh x5, x11, x16\n\t" - "adds x4, x4, x20\n\t" - "adc x5, x5, xzr\n\t" - /* A[1] * B[0] */ - "mul x20, x12, x15\n\t" - "umulh x21, x12, x15\n\t" - "adds x4, x4, x20\n\t" - "adcs x5, x5, x21\n\t" - "adc x6, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x20, x11, x17\n\t" - "umulh x21, x11, x17\n\t" - "adds x5, x5, x20\n\t" - "adc x6, x6, x21\n\t" - /* A[1] * B[1] */ - "mul x20, x12, x16\n\t" - "umulh x21, x12, x16\n\t" - "adds x5, x5, x20\n\t" - "adcs x6, x6, x21\n\t" - "adc x7, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x20, x13, x15\n\t" - "umulh x21, x13, x15\n\t" - "adds x5, x5, x20\n\t" - "adcs x6, x6, x21\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * B[3] */ - "mul x20, x11, x19\n\t" - "umulh x21, x11, x19\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x20, x12, x17\n\t" - "umulh x21, x12, x17\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[2] * B[1] */ - "mul x20, x13, x16\n\t" - "umulh x21, x13, x16\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[3] * B[0] */ - "mul x20, x14, x15\n\t" - "umulh x21, x14, x15\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[3] */ - "mul x20, x12, x19\n\t" - "umulh x21, x12, x19\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x20, x13, x17\n\t" - "umulh x21, x13, x17\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, x9, xzr\n\t" - /* A[3] * B[1] */ - "mul x20, x14, x16\n\t" - "umulh x21, x14, x16\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[3] */ - "mul x20, x13, x19\n\t" - "umulh x21, x13, x19\n\t" - "adds x8, x8, x20\n\t" - "adcs x9, x9, x21\n\t" - "adc x10, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x20, x14, x17\n\t" - "umulh x21, x14, x17\n\t" - "adds x8, x8, x20\n\t" - "adcs x9, x9, x21\n\t" - "adc x10, x10, xzr\n\t" - /* A[3] * B[3] */ - "mul x20, x14, x19\n\t" - "umulh x21, x14, x19\n\t" - "adds x9, x9, x20\n\t" - "adc x10, x10, x21\n\t" - /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "extr x7, x7, x6, #63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x20, #19\n\t" - "mul x21, x20, x7\n\t" - "umulh x7, x20, x7\n\t" - "adds x3, x3, x21\n\t" - "mul x21, x20, x8\n\t" - "umulh x8, x20, x8\n\t" - "adcs x4, x4, x21\n\t" - "mul x21, x20, x9\n\t" - "umulh x9, x20, x9\n\t" - "adcs x5, x5, x21\n\t" - "mul x21, x20, x10\n\t" - "umulh x22, x20, x10\n\t" - "adcs x6, x6, x21\n\t" + "ldp x6, x7, [x2]\n\t" + "ldp x8, x9, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x15, x10, x6\n\t" + "mul x14, x10, x6\n\t" + /* A[2] * B[0] */ + "umulh x17, x12, x6\n\t" + "mul x16, x12, x6\n\t" + /* A[1] * B[0] */ + "mul x3, x11, x6\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x11, x6\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x11, x9\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x11, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x10, x7\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x10, x7\n\t" + "adcs x16, x16, x4\n\t" + /* A[2] * B[1] */ + "mul x3, x12, x7\n\t" + "adcs x17, x17, x3\n\t" + "umulh x4, x12, x7\n\t" + "adcs x19, x19, x4\n\t" + "adc x20, x20, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x11, x8\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x11, x8\n\t" + "adcs x19, x19, x4\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x10, x8\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x10, x8\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, x21, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x11, x7\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x11, x7\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ + "mul x3, x13, x7\n\t" + "adcs x19, x19, x3\n\t" + "umulh x4, x13, x7\n\t" + "adcs x20, x20, x4\n\t" + "adc x21, x21, xzr\n\t" + /* A[2] * B[2] */ + "mul x3, x12, x8\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x12, x8\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x13, x9\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x13, x9\n\t" "adc x22, x22, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x7\n\t" - "adcs x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" + /* A[0] * B[3] */ + "mul x3, x10, x9\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x10, x9\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x12, x9\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x12, x9\n\t" + "adcs x21, x21, x4\n\t" "adc x22, x22, xzr\n\t" - /* Overflow */ - "extr x22, x22, x6, #63\n\t" - "mul x22, x22, x20\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x22\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" - /* Reduce if top bit set */ - "and x22, x20, x6, asr 63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x22\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x13, x6\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x13, x6\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x13, x8\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x13, x8\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x19\n\t" + "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" + "mul x4, x3, x20\n\t" + "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" + "mul x4, x3, x21\n\t" + "adcs x16, x16, x4\n\t" + "umulh x21, x3, x21\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" /* Store */ - "stp x3, x4, [x0]\n\t" - "stp x5, x6, [x0, #16]\n\t" - "ldr x0, [x29, #24]\n\t" - "ldr x2, [x29, #56]\n\t" + "stp x14, x15, [x0]\n\t" + "stp x16, x17, [x0, #16]\n\t" + "sub x1, x1, #0x40\n\t" + "sub x0, x0, #32\n\t" /* Multiply */ - "ldp x11, x12, [x2]\n\t" - "ldp x13, x14, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x3, x15, x11\n\t" - "umulh x4, x15, x11\n\t" - /* A[0] * B[1] */ - "mul x20, x15, x12\n\t" - "umulh x5, x15, x12\n\t" - "adds x4, x4, x20\n\t" - "adc x5, x5, xzr\n\t" - /* A[1] * B[0] */ - "mul x20, x16, x11\n\t" - "umulh x21, x16, x11\n\t" - "adds x4, x4, x20\n\t" - "adcs x5, x5, x21\n\t" - "adc x6, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x20, x15, x13\n\t" - "umulh x21, x15, x13\n\t" - "adds x5, x5, x20\n\t" - "adc x6, x6, x21\n\t" - /* A[1] * B[1] */ - "mul x20, x16, x12\n\t" - "umulh x21, x16, x12\n\t" - "adds x5, x5, x20\n\t" - "adcs x6, x6, x21\n\t" - "adc x7, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x20, x17, x11\n\t" - "umulh x21, x17, x11\n\t" - "adds x5, x5, x20\n\t" - "adcs x6, x6, x21\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * B[3] */ - "mul x20, x15, x14\n\t" - "umulh x21, x15, x14\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x20, x16, x13\n\t" - "umulh x21, x16, x13\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[2] * B[1] */ - "mul x20, x17, x12\n\t" - "umulh x21, x17, x12\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[3] * B[0] */ - "mul x20, x19, x11\n\t" - "umulh x21, x19, x11\n\t" - "adds x6, x6, x20\n\t" - "adcs x7, x7, x21\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[3] */ - "mul x20, x16, x14\n\t" - "umulh x21, x16, x14\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x20, x17, x13\n\t" - "umulh x21, x17, x13\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, x9, xzr\n\t" - /* A[3] * B[1] */ - "mul x20, x19, x12\n\t" - "umulh x21, x19, x12\n\t" - "adds x7, x7, x20\n\t" - "adcs x8, x8, x21\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[3] */ - "mul x20, x17, x14\n\t" - "umulh x21, x17, x14\n\t" - "adds x8, x8, x20\n\t" - "adcs x9, x9, x21\n\t" - "adc x10, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x20, x19, x13\n\t" - "umulh x21, x19, x13\n\t" - "adds x8, x8, x20\n\t" - "adcs x9, x9, x21\n\t" - "adc x10, x10, xzr\n\t" - /* A[3] * B[3] */ - "mul x20, x19, x14\n\t" - "umulh x21, x19, x14\n\t" - "adds x9, x9, x20\n\t" - "adc x10, x10, x21\n\t" - /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "extr x7, x7, x6, #63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x20, #19\n\t" - "mul x21, x20, x7\n\t" - "umulh x7, x20, x7\n\t" - "adds x3, x3, x21\n\t" - "mul x21, x20, x8\n\t" - "umulh x8, x20, x8\n\t" - "adcs x4, x4, x21\n\t" - "mul x21, x20, x9\n\t" - "umulh x9, x20, x9\n\t" - "adcs x5, x5, x21\n\t" - "mul x21, x20, x10\n\t" - "umulh x22, x20, x10\n\t" - "adcs x6, x6, x21\n\t" + "ldp x10, x11, [x1]\n\t" + "ldp x12, x13, [x1, #16]\n\t" + /* A[0] * B[0] */ + "umulh x15, x10, x6\n\t" + "mul x14, x10, x6\n\t" + /* A[2] * B[0] */ + "umulh x17, x12, x6\n\t" + "mul x16, x12, x6\n\t" + /* A[1] * B[0] */ + "mul x3, x11, x6\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x11, x6\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x11, x9\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x11, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x10, x7\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x10, x7\n\t" + "adcs x16, x16, x4\n\t" + /* A[2] * B[1] */ + "mul x3, x12, x7\n\t" + "adcs x17, x17, x3\n\t" + "umulh x4, x12, x7\n\t" + "adcs x19, x19, x4\n\t" + "adc x20, x20, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x11, x8\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x11, x8\n\t" + "adcs x19, x19, x4\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x10, x8\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x10, x8\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, x21, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x11, x7\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x11, x7\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ + "mul x3, x13, x7\n\t" + "adcs x19, x19, x3\n\t" + "umulh x4, x13, x7\n\t" + "adcs x20, x20, x4\n\t" + "adc x21, x21, xzr\n\t" + /* A[2] * B[2] */ + "mul x3, x12, x8\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x12, x8\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x13, x9\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x13, x9\n\t" "adc x22, x22, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x7\n\t" - "adcs x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" + /* A[0] * B[3] */ + "mul x3, x10, x9\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x10, x9\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x12, x9\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x12, x9\n\t" + "adcs x21, x21, x4\n\t" "adc x22, x22, xzr\n\t" - /* Overflow */ - "extr x22, x22, x6, #63\n\t" - "mul x22, x22, x20\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x22\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" - /* Reduce if top bit set */ - "and x22, x20, x6, asr 63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x22\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x13, x6\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x13, x6\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x13, x8\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x13, x8\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x19\n\t" + "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" + "mul x4, x3, x20\n\t" + "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" + "mul x4, x3, x21\n\t" + "adcs x16, x16, x4\n\t" + "umulh x21, x3, x21\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" /* Store */ - "stp x3, x4, [x0]\n\t" - "stp x5, x6, [x0, #16]\n\t" - "ldp x29, x30, [sp], #0x40\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [px] "+r" (px), [py] "+r" (py), [pz] "+r" (pz), [pt] "+r" (pt) + "stp x14, x15, [x0]\n\t" + "stp x16, x17, [x0, #16]\n\t" + "ldp x29, x30, [sp], #32\n\t" + : [r] "+r" (r), [p] "+r" (p) : - : "memory", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "cc" ); } -void fe_ge_to_p3(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py, const fe pz, const fe pt) +void ge_p1p1_to_p3(ge_p3* r, const ge_p1p1* p) { __asm__ __volatile__ ( - "stp x29, x30, [sp, #-96]!\n\t" + "stp x29, x30, [sp, #-32]!\n\t" "add x29, sp, #0\n\t" - "str %x[ry], [x29, #16]\n\t" - "str %x[rz], [x29, #24]\n\t" - "str %x[rt], [x29, #32]\n\t" - "str %x[px], [x29, #40]\n\t" - "str %x[py], [x29, #48]\n\t" - "str %x[pz], [x29, #56]\n\t" - "str %x[pt], [x29, #64]\n\t" - "ldr x1, [x29, #40]\n\t" - "ldr x2, [x29, #64]\n\t" + "str %x[r], [x29, #16]\n\t" + "str %x[p], [x29, #24]\n\t" + "mov x2, x1\n\t" + "add x1, x1, #0x60\n\t" /* Multiply */ - "ldp x11, x12, [x1]\n\t" - "ldp x13, x14, [x1, #16]\n\t" - "ldp x15, x16, [x2]\n\t" - "ldp x17, x19, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x3, x11, x15\n\t" - "umulh x4, x11, x15\n\t" - /* A[0] * B[1] */ - "mul x24, x11, x16\n\t" - "umulh x5, x11, x16\n\t" - "adds x4, x4, x24\n\t" - "adc x5, x5, xzr\n\t" - /* A[1] * B[0] */ - "mul x24, x12, x15\n\t" - "umulh x25, x12, x15\n\t" - "adds x4, x4, x24\n\t" - "adcs x5, x5, x25\n\t" - "adc x6, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x24, x11, x17\n\t" - "umulh x25, x11, x17\n\t" - "adds x5, x5, x24\n\t" - "adc x6, x6, x25\n\t" - /* A[1] * B[1] */ - "mul x24, x12, x16\n\t" - "umulh x25, x12, x16\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x24, x13, x15\n\t" - "umulh x25, x13, x15\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * B[3] */ - "mul x24, x11, x19\n\t" - "umulh x25, x11, x19\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x24, x12, x17\n\t" - "umulh x25, x12, x17\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[2] * B[1] */ - "mul x24, x13, x16\n\t" - "umulh x25, x13, x16\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[3] * B[0] */ - "mul x24, x14, x15\n\t" - "umulh x25, x14, x15\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[3] */ - "mul x24, x12, x19\n\t" - "umulh x25, x12, x19\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x24, x13, x17\n\t" - "umulh x25, x13, x17\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[3] * B[1] */ - "mul x24, x14, x16\n\t" - "umulh x25, x14, x16\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[3] */ - "mul x24, x13, x19\n\t" - "umulh x25, x13, x19\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x24, x14, x17\n\t" - "umulh x25, x14, x17\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, x10, xzr\n\t" - /* A[3] * B[3] */ - "mul x24, x14, x19\n\t" - "umulh x25, x14, x19\n\t" - "adds x9, x9, x24\n\t" - "adc x10, x10, x25\n\t" - /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "extr x7, x7, x6, #63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x24, #19\n\t" - "mul x25, x24, x7\n\t" - "umulh x7, x24, x7\n\t" - "adds x3, x3, x25\n\t" - "mul x25, x24, x8\n\t" - "umulh x8, x24, x8\n\t" - "adcs x4, x4, x25\n\t" - "mul x25, x24, x9\n\t" - "umulh x9, x24, x9\n\t" - "adcs x5, x5, x25\n\t" - "mul x25, x24, x10\n\t" - "umulh x26, x24, x10\n\t" - "adcs x6, x6, x25\n\t" - "adc x26, x26, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x7\n\t" - "adcs x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adc x26, x26, xzr\n\t" - /* Overflow */ - "extr x26, x26, x6, #63\n\t" - "mul x26, x26, x24\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" - /* Reduce if top bit set */ - "and x26, x24, x6, asr 63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" + "ldp x10, x11, [x1]\n\t" + "ldp x12, x13, [x1, #16]\n\t" + "ldp x6, x7, [x2]\n\t" + "ldp x8, x9, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x15, x10, x6\n\t" + "mul x14, x10, x6\n\t" + /* A[2] * B[0] */ + "umulh x17, x12, x6\n\t" + "mul x16, x12, x6\n\t" + /* A[1] * B[0] */ + "mul x3, x11, x6\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x11, x6\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x11, x9\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x11, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x10, x7\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x10, x7\n\t" + "adcs x16, x16, x4\n\t" + /* A[2] * B[1] */ + "mul x3, x12, x7\n\t" + "adcs x17, x17, x3\n\t" + "umulh x4, x12, x7\n\t" + "adcs x19, x19, x4\n\t" + "adc x20, x20, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x11, x8\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x11, x8\n\t" + "adcs x19, x19, x4\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x10, x8\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x10, x8\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, x21, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x11, x7\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x11, x7\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ + "mul x3, x13, x7\n\t" + "adcs x19, x19, x3\n\t" + "umulh x4, x13, x7\n\t" + "adcs x20, x20, x4\n\t" + "adc x21, x21, xzr\n\t" + /* A[2] * B[2] */ + "mul x3, x12, x8\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x12, x8\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x13, x9\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x13, x9\n\t" + "adc x22, x22, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x10, x9\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x10, x9\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x12, x9\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x12, x9\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x13, x6\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x13, x6\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x13, x8\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x13, x8\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x19\n\t" + "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" + "mul x4, x3, x20\n\t" + "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" + "mul x4, x3, x21\n\t" + "adcs x16, x16, x4\n\t" + "umulh x21, x3, x21\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" /* Store */ - "stp x3, x4, [x0]\n\t" - "stp x5, x6, [x0, #16]\n\t" - "ldr x0, [x29, #32]\n\t" - "ldr x2, [x29, #48]\n\t" + "stp x14, x15, [x0]\n\t" + "stp x16, x17, [x0, #16]\n\t" + "sub x1, x1, #0x40\n\t" + "add x0, x0, #0x60\n\t" /* Multiply */ - "ldp x20, x21, [x2]\n\t" - "ldp x22, x23, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x3, x11, x20\n\t" - "umulh x4, x11, x20\n\t" - /* A[0] * B[1] */ - "mul x24, x11, x21\n\t" - "umulh x5, x11, x21\n\t" - "adds x4, x4, x24\n\t" - "adc x5, x5, xzr\n\t" - /* A[1] * B[0] */ - "mul x24, x12, x20\n\t" - "umulh x25, x12, x20\n\t" - "adds x4, x4, x24\n\t" - "adcs x5, x5, x25\n\t" - "adc x6, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x24, x11, x22\n\t" - "umulh x25, x11, x22\n\t" - "adds x5, x5, x24\n\t" - "adc x6, x6, x25\n\t" - /* A[1] * B[1] */ - "mul x24, x12, x21\n\t" - "umulh x25, x12, x21\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x24, x13, x20\n\t" - "umulh x25, x13, x20\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * B[3] */ - "mul x24, x11, x23\n\t" - "umulh x25, x11, x23\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x24, x12, x22\n\t" - "umulh x25, x12, x22\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[2] * B[1] */ - "mul x24, x13, x21\n\t" - "umulh x25, x13, x21\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[3] * B[0] */ - "mul x24, x14, x20\n\t" - "umulh x25, x14, x20\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[3] */ - "mul x24, x12, x23\n\t" - "umulh x25, x12, x23\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x24, x13, x22\n\t" - "umulh x25, x13, x22\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[3] * B[1] */ - "mul x24, x14, x21\n\t" - "umulh x25, x14, x21\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[3] */ - "mul x24, x13, x23\n\t" - "umulh x25, x13, x23\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x24, x14, x22\n\t" - "umulh x25, x14, x22\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, x10, xzr\n\t" - /* A[3] * B[3] */ - "mul x24, x14, x23\n\t" - "umulh x25, x14, x23\n\t" - "adds x9, x9, x24\n\t" - "adc x10, x10, x25\n\t" - /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "extr x7, x7, x6, #63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x24, #19\n\t" - "mul x25, x24, x7\n\t" - "umulh x7, x24, x7\n\t" - "adds x3, x3, x25\n\t" - "mul x25, x24, x8\n\t" - "umulh x8, x24, x8\n\t" - "adcs x4, x4, x25\n\t" - "mul x25, x24, x9\n\t" - "umulh x9, x24, x9\n\t" - "adcs x5, x5, x25\n\t" - "mul x25, x24, x10\n\t" - "umulh x26, x24, x10\n\t" - "adcs x6, x6, x25\n\t" - "adc x26, x26, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x7\n\t" - "adcs x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adc x26, x26, xzr\n\t" - /* Overflow */ - "extr x26, x26, x6, #63\n\t" - "mul x26, x26, x24\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" - /* Reduce if top bit set */ - "and x26, x24, x6, asr 63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" + "ldp x23, x24, [x1]\n\t" + "ldp x25, x26, [x1, #16]\n\t" + /* A[0] * B[0] */ + "umulh x15, x23, x6\n\t" + "mul x14, x23, x6\n\t" + /* A[2] * B[0] */ + "umulh x17, x25, x6\n\t" + "mul x16, x25, x6\n\t" + /* A[1] * B[0] */ + "mul x3, x24, x6\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x24, x6\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x24, x9\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x24, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x23, x7\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x23, x7\n\t" + "adcs x16, x16, x4\n\t" + /* A[2] * B[1] */ + "mul x3, x25, x7\n\t" + "adcs x17, x17, x3\n\t" + "umulh x4, x25, x7\n\t" + "adcs x19, x19, x4\n\t" + "adc x20, x20, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x24, x8\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x24, x8\n\t" + "adcs x19, x19, x4\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x23, x8\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x23, x8\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, x21, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x24, x7\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x24, x7\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ + "mul x3, x26, x7\n\t" + "adcs x19, x19, x3\n\t" + "umulh x4, x26, x7\n\t" + "adcs x20, x20, x4\n\t" + "adc x21, x21, xzr\n\t" + /* A[2] * B[2] */ + "mul x3, x25, x8\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x25, x8\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x26, x9\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x26, x9\n\t" + "adc x22, x22, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x23, x9\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x23, x9\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x25, x9\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x25, x9\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x26, x6\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x26, x6\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x26, x8\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x26, x8\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x19\n\t" + "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" + "mul x4, x3, x20\n\t" + "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" + "mul x4, x3, x21\n\t" + "adcs x16, x16, x4\n\t" + "umulh x21, x3, x21\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" /* Store */ - "stp x3, x4, [x0]\n\t" - "stp x5, x6, [x0, #16]\n\t" - "ldr x0, [x29, #16]\n\t" - "ldr x2, [x29, #56]\n\t" + "stp x14, x15, [x0]\n\t" + "stp x16, x17, [x0, #16]\n\t" + "add x2, x1, #32\n\t" + "sub x0, x0, #0x40\n\t" /* Multiply */ - "ldp x11, x12, [x2]\n\t" - "ldp x13, x14, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x3, x20, x11\n\t" - "umulh x4, x20, x11\n\t" - /* A[0] * B[1] */ - "mul x24, x20, x12\n\t" - "umulh x5, x20, x12\n\t" - "adds x4, x4, x24\n\t" - "adc x5, x5, xzr\n\t" - /* A[1] * B[0] */ - "mul x24, x21, x11\n\t" - "umulh x25, x21, x11\n\t" - "adds x4, x4, x24\n\t" - "adcs x5, x5, x25\n\t" - "adc x6, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x24, x20, x13\n\t" - "umulh x25, x20, x13\n\t" - "adds x5, x5, x24\n\t" - "adc x6, x6, x25\n\t" - /* A[1] * B[1] */ - "mul x24, x21, x12\n\t" - "umulh x25, x21, x12\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x24, x22, x11\n\t" - "umulh x25, x22, x11\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * B[3] */ - "mul x24, x20, x14\n\t" - "umulh x25, x20, x14\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x24, x21, x13\n\t" - "umulh x25, x21, x13\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[2] * B[1] */ - "mul x24, x22, x12\n\t" - "umulh x25, x22, x12\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[3] * B[0] */ - "mul x24, x23, x11\n\t" - "umulh x25, x23, x11\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[3] */ - "mul x24, x21, x14\n\t" - "umulh x25, x21, x14\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x24, x22, x13\n\t" - "umulh x25, x22, x13\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[3] * B[1] */ - "mul x24, x23, x12\n\t" - "umulh x25, x23, x12\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[3] */ - "mul x24, x22, x14\n\t" - "umulh x25, x22, x14\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x24, x23, x13\n\t" - "umulh x25, x23, x13\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, x10, xzr\n\t" - /* A[3] * B[3] */ - "mul x24, x23, x14\n\t" - "umulh x25, x23, x14\n\t" - "adds x9, x9, x24\n\t" - "adc x10, x10, x25\n\t" - /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "extr x7, x7, x6, #63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x24, #19\n\t" - "mul x25, x24, x7\n\t" - "umulh x7, x24, x7\n\t" - "adds x3, x3, x25\n\t" - "mul x25, x24, x8\n\t" - "umulh x8, x24, x8\n\t" - "adcs x4, x4, x25\n\t" - "mul x25, x24, x9\n\t" - "umulh x9, x24, x9\n\t" - "adcs x5, x5, x25\n\t" - "mul x25, x24, x10\n\t" - "umulh x26, x24, x10\n\t" - "adcs x6, x6, x25\n\t" - "adc x26, x26, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x7\n\t" - "adcs x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adc x26, x26, xzr\n\t" - /* Overflow */ - "extr x26, x26, x6, #63\n\t" - "mul x26, x26, x24\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" - /* Reduce if top bit set */ - "and x26, x24, x6, asr 63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" + "ldp x6, x7, [x2]\n\t" + "ldp x8, x9, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x15, x23, x6\n\t" + "mul x14, x23, x6\n\t" + /* A[2] * B[0] */ + "umulh x17, x25, x6\n\t" + "mul x16, x25, x6\n\t" + /* A[1] * B[0] */ + "mul x3, x24, x6\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x24, x6\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x24, x9\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x24, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x23, x7\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x23, x7\n\t" + "adcs x16, x16, x4\n\t" + /* A[2] * B[1] */ + "mul x3, x25, x7\n\t" + "adcs x17, x17, x3\n\t" + "umulh x4, x25, x7\n\t" + "adcs x19, x19, x4\n\t" + "adc x20, x20, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x24, x8\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x24, x8\n\t" + "adcs x19, x19, x4\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x23, x8\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x23, x8\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, x21, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x24, x7\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x24, x7\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ + "mul x3, x26, x7\n\t" + "adcs x19, x19, x3\n\t" + "umulh x4, x26, x7\n\t" + "adcs x20, x20, x4\n\t" + "adc x21, x21, xzr\n\t" + /* A[2] * B[2] */ + "mul x3, x25, x8\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x25, x8\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x26, x9\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x26, x9\n\t" + "adc x22, x22, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x23, x9\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x23, x9\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x25, x9\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x25, x9\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x26, x6\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x26, x6\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x26, x8\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x26, x8\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x19\n\t" + "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" + "mul x4, x3, x20\n\t" + "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" + "mul x4, x3, x21\n\t" + "adcs x16, x16, x4\n\t" + "umulh x21, x3, x21\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" /* Store */ - "stp x3, x4, [x0]\n\t" - "stp x5, x6, [x0, #16]\n\t" - "ldr x0, [x29, #24]\n\t" + "stp x14, x15, [x0]\n\t" + "stp x16, x17, [x0, #16]\n\t" + "add x1, x1, #0x40\n\t" + "add x0, x0, #32\n\t" /* Multiply */ - /* A[0] * B[0] */ - "mul x3, x11, x15\n\t" - "umulh x4, x11, x15\n\t" - /* A[0] * B[1] */ - "mul x24, x11, x16\n\t" - "umulh x5, x11, x16\n\t" - "adds x4, x4, x24\n\t" - "adc x5, x5, xzr\n\t" - /* A[1] * B[0] */ - "mul x24, x12, x15\n\t" - "umulh x25, x12, x15\n\t" - "adds x4, x4, x24\n\t" - "adcs x5, x5, x25\n\t" - "adc x6, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x24, x11, x17\n\t" - "umulh x25, x11, x17\n\t" - "adds x5, x5, x24\n\t" - "adc x6, x6, x25\n\t" - /* A[1] * B[1] */ - "mul x24, x12, x16\n\t" - "umulh x25, x12, x16\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x24, x13, x15\n\t" - "umulh x25, x13, x15\n\t" - "adds x5, x5, x24\n\t" - "adcs x6, x6, x25\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * B[3] */ - "mul x24, x11, x19\n\t" - "umulh x25, x11, x19\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x24, x12, x17\n\t" - "umulh x25, x12, x17\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[2] * B[1] */ - "mul x24, x13, x16\n\t" - "umulh x25, x13, x16\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[3] * B[0] */ - "mul x24, x14, x15\n\t" - "umulh x25, x14, x15\n\t" - "adds x6, x6, x24\n\t" - "adcs x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * B[3] */ - "mul x24, x12, x19\n\t" - "umulh x25, x12, x19\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x24, x13, x17\n\t" - "umulh x25, x13, x17\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[3] * B[1] */ - "mul x24, x14, x16\n\t" - "umulh x25, x14, x16\n\t" - "adds x7, x7, x24\n\t" - "adcs x8, x8, x25\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[3] */ - "mul x24, x13, x19\n\t" - "umulh x25, x13, x19\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x24, x14, x17\n\t" - "umulh x25, x14, x17\n\t" - "adds x8, x8, x24\n\t" - "adcs x9, x9, x25\n\t" - "adc x10, x10, xzr\n\t" - /* A[3] * B[3] */ - "mul x24, x14, x19\n\t" - "umulh x25, x14, x19\n\t" - "adds x9, x9, x24\n\t" - "adc x10, x10, x25\n\t" - /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "extr x7, x7, x6, #63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x24, #19\n\t" - "mul x25, x24, x7\n\t" - "umulh x7, x24, x7\n\t" - "adds x3, x3, x25\n\t" - "mul x25, x24, x8\n\t" - "umulh x8, x24, x8\n\t" - "adcs x4, x4, x25\n\t" - "mul x25, x24, x9\n\t" - "umulh x9, x24, x9\n\t" - "adcs x5, x5, x25\n\t" - "mul x25, x24, x10\n\t" - "umulh x26, x24, x10\n\t" - "adcs x6, x6, x25\n\t" - "adc x26, x26, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x7\n\t" - "adcs x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adc x26, x26, xzr\n\t" - /* Overflow */ - "extr x26, x26, x6, #63\n\t" - "mul x26, x26, x24\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" - /* Reduce if top bit set */ - "and x26, x24, x6, asr 63\n\t" - "and x6, x6, #0x7fffffffffffffff\n\t" - "adds x3, x3, x26\n\t" - "adcs x4, x4, xzr\n\t" - "adcs x5, x5, xzr\n\t" - "adc x6, x6, xzr\n\t" + /* A[0] * B[0] */ + "umulh x15, x10, x6\n\t" + "mul x14, x10, x6\n\t" + /* A[2] * B[0] */ + "umulh x17, x12, x6\n\t" + "mul x16, x12, x6\n\t" + /* A[1] * B[0] */ + "mul x3, x11, x6\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x11, x6\n\t" + "adcs x16, x16, x4\n\t" + /* A[1] * B[3] */ + "umulh x20, x11, x9\n\t" + "adc x17, x17, xzr\n\t" + "mul x19, x11, x9\n\t" + /* A[0] * B[1] */ + "mul x3, x10, x7\n\t" + "adds x15, x15, x3\n\t" + "umulh x4, x10, x7\n\t" + "adcs x16, x16, x4\n\t" + /* A[2] * B[1] */ + "mul x3, x12, x7\n\t" + "adcs x17, x17, x3\n\t" + "umulh x4, x12, x7\n\t" + "adcs x19, x19, x4\n\t" + "adc x20, x20, xzr\n\t" + /* A[1] * B[2] */ + "mul x3, x11, x8\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x11, x8\n\t" + "adcs x19, x19, x4\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x3, x10, x8\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x10, x8\n\t" + "adcs x17, x17, x4\n\t" + "adcs x19, x19, xzr\n\t" + "adcs x20, x20, xzr\n\t" + "adc x21, x21, xzr\n\t" + /* A[1] * B[1] */ + "mul x3, x11, x7\n\t" + "adds x16, x16, x3\n\t" + "umulh x4, x11, x7\n\t" + "adcs x17, x17, x4\n\t" + /* A[3] * B[1] */ + "mul x3, x13, x7\n\t" + "adcs x19, x19, x3\n\t" + "umulh x4, x13, x7\n\t" + "adcs x20, x20, x4\n\t" + "adc x21, x21, xzr\n\t" + /* A[2] * B[2] */ + "mul x3, x12, x8\n\t" + "adds x19, x19, x3\n\t" + "umulh x4, x12, x8\n\t" + "adcs x20, x20, x4\n\t" + /* A[3] * B[3] */ + "mul x3, x13, x9\n\t" + "adcs x21, x21, x3\n\t" + "umulh x22, x13, x9\n\t" + "adc x22, x22, xzr\n\t" + /* A[0] * B[3] */ + "mul x3, x10, x9\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x10, x9\n\t" + "adcs x19, x19, x4\n\t" + /* A[2] * B[3] */ + "mul x3, x12, x9\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x12, x9\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* A[3] * B[0] */ + "mul x3, x13, x6\n\t" + "adds x17, x17, x3\n\t" + "umulh x4, x13, x6\n\t" + "adcs x19, x19, x4\n\t" + /* A[3] * B[2] */ + "mul x3, x13, x8\n\t" + "adcs x20, x20, x3\n\t" + "umulh x4, x13, x8\n\t" + "adcs x21, x21, x4\n\t" + "adc x22, x22, xzr\n\t" + /* Reduce */ + "mov x3, #38\n\t" + "mul x4, x3, x22\n\t" + "adds x17, x17, x4\n\t" + "umulh x5, x3, x22\n\t" + "adc x5, x5, xzr\n\t" + "mov x3, #19\n\t" + "extr x5, x5, x17, #63\n\t" + "mul x5, x5, x3\n\t" + "and x17, x17, #0x7fffffffffffffff\n\t" + "mov x3, #38\n\t" + "mul x4, x3, x19\n\t" + "adds x14, x14, x4\n\t" + "umulh x19, x3, x19\n\t" + "mul x4, x3, x20\n\t" + "adcs x15, x15, x4\n\t" + "umulh x20, x3, x20\n\t" + "mul x4, x3, x21\n\t" + "adcs x16, x16, x4\n\t" + "umulh x21, x3, x21\n\t" + "adc x17, x17, xzr\n\t" + /* Add high product results in */ + "adds x14, x14, x5\n\t" + "adcs x15, x15, x19\n\t" + "adcs x16, x16, x20\n\t" + "adc x17, x17, x21\n\t" /* Store */ - "stp x3, x4, [x0]\n\t" - "stp x5, x6, [x0, #16]\n\t" - "ldp x29, x30, [sp], #0x60\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt), [px] "+r" (px), [py] "+r" (py), [pz] "+r" (pz), [pt] "+r" (pt) + "stp x14, x15, [x0]\n\t" + "stp x16, x17, [x0, #16]\n\t" + "ldp x29, x30, [sp], #32\n\t" + : [r] "+r" (r), [p] "+r" (p) : - : "memory", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "cc" ); } -void fe_ge_dbl(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py, const fe pz) +void ge_p2_dbl(ge_p1p1* r, const ge_p2* p) { __asm__ __volatile__ ( - "stp x29, x30, [sp, #-80]!\n\t" + "stp x29, x30, [sp, #-32]!\n\t" "add x29, sp, #0\n\t" - "str %x[rx], [x29, #16]\n\t" - "str %x[ry], [x29, #24]\n\t" - "str %x[rz], [x29, #32]\n\t" - "str %x[rt], [x29, #40]\n\t" - "str %x[px], [x29, #48]\n\t" - "str %x[py], [x29, #56]\n\t" - "str %x[pz], [x29, #64]\n\t" - "ldr x1, [x29, #48]\n\t" + "str %x[r], [x29, #16]\n\t" + "str %x[p], [x29, #24]\n\t" + "add x0, x0, #0x40\n\t" /* Square */ - "ldp x12, x13, [x1]\n\t" - "ldp x14, x15, [x1, #16]\n\t" + "ldp x4, x5, [x1]\n\t" + "ldp x6, x7, [x1, #16]\n\t" /* A[0] * A[1] */ - "mul x5, x12, x13\n\t" - "umulh x6, x12, x13\n\t" - /* A[0] * A[2] */ - "mul x25, x12, x14\n\t" - "umulh x7, x12, x14\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, xzr\n\t" + "umulh x10, x4, x5\n\t" + "mul x9, x4, x5\n\t" /* A[0] * A[3] */ - "mul x25, x12, x15\n\t" - "umulh x8, x12, x15\n\t" - "adds x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" - /* A[1] * A[2] */ - "mul x25, x13, x14\n\t" - "umulh x26, x13, x14\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, xzr, xzr\n\t" + "umulh x12, x4, x7\n\t" + "mul x11, x4, x7\n\t" + /* A[0] * A[2] */ + "mul x25, x4, x6\n\t" + "adds x10, x10, x25\n\t" + "umulh x26, x4, x6\n\t" + "adcs x11, x11, x26\n\t" /* A[1] * A[3] */ - "mul x25, x13, x15\n\t" - "umulh x26, x13, x15\n\t" - "adds x8, x8, x25\n\t" - "adc x9, x9, x26\n\t" + "mul x25, x5, x7\n\t" + "adcs x12, x12, x25\n\t" + "umulh x13, x5, x7\n\t" + "adc x13, x13, xzr\n\t" + /* A[1] * A[2] */ + "mul x25, x5, x6\n\t" + "adds x11, x11, x25\n\t" + "umulh x26, x5, x6\n\t" + "adcs x12, x12, x26\n\t" /* A[2] * A[3] */ - "mul x25, x14, x15\n\t" - "umulh x10, x14, x15\n\t" - "adds x9, x9, x25\n\t" - "adc x10, x10, xzr\n\t" + "mul x25, x6, x7\n\t" + "adcs x13, x13, x25\n\t" + "umulh x14, x6, x7\n\t" + "adc x14, x14, xzr\n\t" /* Double */ - "adds x5, x5, x5\n\t" - "adcs x6, x6, x6\n\t" - "adcs x7, x7, x7\n\t" - "adcs x8, x8, x8\n\t" - "adcs x9, x9, x9\n\t" + "adds x9, x9, x9\n\t" "adcs x10, x10, x10\n\t" - "adc x11, xzr, xzr\n\t" + "adcs x11, x11, x11\n\t" + "adcs x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adc x15, xzr, xzr\n\t" /* A[0] * A[0] */ - "mul x4, x12, x12\n\t" - "umulh x27, x12, x12\n\t" + "umulh x26, x4, x4\n\t" + "mul x8, x4, x4\n\t" /* A[1] * A[1] */ - "mul x25, x13, x13\n\t" - "umulh x26, x13, x13\n\t" - "adds x5, x5, x27\n\t" - "adcs x6, x6, x25\n\t" - "adc x27, x26, xzr\n\t" + "mul x25, x5, x5\n\t" + "adds x9, x9, x26\n\t" + "umulh x26, x5, x5\n\t" + "adcs x10, x10, x25\n\t" /* A[2] * A[2] */ - "mul x25, x14, x14\n\t" - "umulh x26, x14, x14\n\t" - "adds x7, x7, x27\n\t" - "adcs x8, x8, x25\n\t" - "adc x27, x26, xzr\n\t" + "mul x25, x6, x6\n\t" + "adcs x11, x11, x26\n\t" + "umulh x26, x6, x6\n\t" + "adcs x12, x12, x25\n\t" /* A[3] * A[3] */ - "mul x25, x15, x15\n\t" - "umulh x26, x15, x15\n\t" - "adds x9, x9, x27\n\t" - "adcs x10, x10, x25\n\t" - "adc x11, x11, x26\n\t" + "mul x25, x7, x7\n\t" + "adcs x13, x13, x26\n\t" + "umulh x26, x7, x7\n\t" + "adcs x14, x14, x25\n\t" + "adc x15, x15, x26\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x11, x11, x10, #63\n\t" - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x8\n\t" - "umulh x8, x25, x8\n\t" - "adds x4, x4, x26\n\t" - "mul x26, x25, x9\n\t" - "umulh x9, x25, x9\n\t" - "adcs x5, x5, x26\n\t" - "mul x26, x25, x10\n\t" - "umulh x10, x25, x10\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x11\n\t" - "umulh x27, x25, x11\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adcs x7, x7, x10\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x15\n\t" + "adds x11, x11, x26\n\t" + "umulh x27, x25, x15\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x7, #63\n\t" + "mov x25, #19\n\t" + "extr x27, x27, x11, #63\n\t" "mul x27, x27, x25\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x12\n\t" + "adds x8, x8, x26\n\t" + "umulh x12, x25, x12\n\t" + "mul x26, x25, x13\n\t" + "adcs x9, x9, x26\n\t" + "umulh x13, x25, x13\n\t" + "mul x26, x25, x14\n\t" + "adcs x10, x10, x26\n\t" + "umulh x14, x25, x14\n\t" + "adc x11, x11, xzr\n\t" + /* Add high product results in */ + "adds x8, x8, x27\n\t" + "adcs x9, x9, x12\n\t" + "adcs x10, x10, x13\n\t" + "adc x11, x11, x14\n\t" /* Store */ - "stp x4, x5, [x0]\n\t" - "stp x6, x7, [x0, #16]\n\t" - "ldr x0, [x29, #32]\n\t" - "ldr x1, [x29, #56]\n\t" + "stp x8, x9, [x0]\n\t" + "stp x10, x11, [x0, #16]\n\t" + "add x2, x1, #32\n\t" + "sub x0, x0, #32\n\t" /* Square */ - "ldp x21, x22, [x1]\n\t" - "ldp x23, x24, [x1, #16]\n\t" + "ldp x16, x17, [x2]\n\t" + "ldp x19, x20, [x2, #16]\n\t" /* A[0] * A[1] */ - "mul x9, x21, x22\n\t" - "umulh x10, x21, x22\n\t" - /* A[0] * A[2] */ - "mul x25, x21, x23\n\t" - "umulh x11, x21, x23\n\t" - "adds x10, x10, x25\n\t" - "adc x11, x11, xzr\n\t" + "umulh x23, x16, x17\n\t" + "mul x22, x16, x17\n\t" /* A[0] * A[3] */ - "mul x25, x21, x24\n\t" - "umulh x16, x21, x24\n\t" - "adds x11, x11, x25\n\t" - "adc x16, x16, xzr\n\t" - /* A[1] * A[2] */ - "mul x25, x22, x23\n\t" - "umulh x26, x22, x23\n\t" - "adds x11, x11, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" + "umulh x4, x16, x20\n\t" + "mul x24, x16, x20\n\t" + /* A[0] * A[2] */ + "mul x25, x16, x19\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x16, x19\n\t" + "adcs x24, x24, x26\n\t" /* A[1] * A[3] */ - "mul x25, x22, x24\n\t" - "umulh x26, x22, x24\n\t" - "adds x16, x16, x25\n\t" - "adc x17, x17, x26\n\t" + "mul x25, x17, x20\n\t" + "adcs x4, x4, x25\n\t" + "umulh x5, x17, x20\n\t" + "adc x5, x5, xzr\n\t" + /* A[1] * A[2] */ + "mul x25, x17, x19\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x17, x19\n\t" + "adcs x4, x4, x26\n\t" /* A[2] * A[3] */ - "mul x25, x23, x24\n\t" - "umulh x19, x23, x24\n\t" - "adds x17, x17, x25\n\t" - "adc x19, x19, xzr\n\t" + "mul x25, x19, x20\n\t" + "adcs x5, x5, x25\n\t" + "umulh x6, x19, x20\n\t" + "adc x6, x6, xzr\n\t" /* Double */ - "adds x9, x9, x9\n\t" - "adcs x10, x10, x10\n\t" - "adcs x11, x11, x11\n\t" - "adcs x16, x16, x16\n\t" - "adcs x17, x17, x17\n\t" - "adcs x19, x19, x19\n\t" - "adc x20, xzr, xzr\n\t" + "adds x22, x22, x22\n\t" + "adcs x23, x23, x23\n\t" + "adcs x24, x24, x24\n\t" + "adcs x4, x4, x4\n\t" + "adcs x5, x5, x5\n\t" + "adcs x6, x6, x6\n\t" + "adc x7, xzr, xzr\n\t" /* A[0] * A[0] */ - "mul x8, x21, x21\n\t" - "umulh x27, x21, x21\n\t" + "umulh x26, x16, x16\n\t" + "mul x21, x16, x16\n\t" /* A[1] * A[1] */ - "mul x25, x22, x22\n\t" - "umulh x26, x22, x22\n\t" - "adds x9, x9, x27\n\t" - "adcs x10, x10, x25\n\t" - "adc x27, x26, xzr\n\t" + "mul x25, x17, x17\n\t" + "adds x22, x22, x26\n\t" + "umulh x26, x17, x17\n\t" + "adcs x23, x23, x25\n\t" /* A[2] * A[2] */ - "mul x25, x23, x23\n\t" - "umulh x26, x23, x23\n\t" - "adds x11, x11, x27\n\t" - "adcs x16, x16, x25\n\t" - "adc x27, x26, xzr\n\t" + "mul x25, x19, x19\n\t" + "adcs x24, x24, x26\n\t" + "umulh x26, x19, x19\n\t" + "adcs x4, x4, x25\n\t" /* A[3] * A[3] */ - "mul x25, x24, x24\n\t" - "umulh x26, x24, x24\n\t" - "adds x17, x17, x27\n\t" - "adcs x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "mul x25, x20, x20\n\t" + "adcs x5, x5, x26\n\t" + "umulh x26, x20, x20\n\t" + "adcs x6, x6, x25\n\t" + "adc x7, x7, x26\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x11, #63\n\t" - "and x11, x11, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x8, x8, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x9, x9, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x10, x10, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x11, x11, x26\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x7\n\t" + "adds x24, x24, x26\n\t" + "umulh x27, x25, x7\n\t" "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x9, x9, x16\n\t" - "adcs x10, x10, x17\n\t" - "adcs x11, x11, x19\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x11, #63\n\t" + "mov x25, #19\n\t" + "extr x27, x27, x24, #63\n\t" "mul x27, x27, x25\n\t" - "and x11, x11, #0x7fffffffffffffff\n\t" - "adds x8, x8, x27\n\t" - "adcs x9, x9, xzr\n\t" - "adcs x10, x10, xzr\n\t" - "adc x11, x11, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x11, asr 63\n\t" - "and x11, x11, #0x7fffffffffffffff\n\t" - "adds x8, x8, x27\n\t" - "adcs x9, x9, xzr\n\t" - "adcs x10, x10, xzr\n\t" - "adc x11, x11, xzr\n\t" - /* Store */ - "stp x8, x9, [x0]\n\t" - "stp x10, x11, [x0, #16]\n\t" - "ldr x0, [x29, #24]\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x4\n\t" + "adds x21, x21, x26\n\t" + "umulh x4, x25, x4\n\t" + "mul x26, x25, x5\n\t" + "adcs x22, x22, x26\n\t" + "umulh x5, x25, x5\n\t" + "mul x26, x25, x6\n\t" + "adcs x23, x23, x26\n\t" + "umulh x6, x25, x6\n\t" + "adc x24, x24, xzr\n\t" + /* Add high product results in */ + "adds x21, x21, x27\n\t" + "adcs x22, x22, x4\n\t" + "adcs x23, x23, x5\n\t" + "adc x24, x24, x6\n\t" + "add x3, x0, #32\n\t" + "mov x2, x0\n\t" + "add x1, x0, #32\n\t" /* Add */ - "adds x12, x12, x21\n\t" - "adcs x13, x13, x22\n\t" - "adcs x14, x14, x23\n\t" - "adc x15, x15, x24\n\t" + "adds x4, x21, x8\n\t" + "adcs x5, x22, x9\n\t" + "adcs x6, x23, x10\n\t" + "adcs x7, x24, x11\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x7, #63\n\t" + "mul x25, x28, x25\n\t" + /* Sub modulus (if overflow) */ + "adds x4, x4, x25\n\t" + "adcs x5, x5, xzr\n\t" + "and x7, x7, #0x7fffffffffffffff\n\t" + "adcs x6, x6, xzr\n\t" + "adc x7, x7, xzr\n\t" + /* Sub */ + "subs x12, x21, x8\n\t" + "sbcs x13, x22, x9\n\t" + "sbcs x14, x23, x10\n\t" + "sbcs x15, x24, x11\n\t" + "csetm x28, cc\n\t" "mov x25, #-19\n\t" - "asr x28, x15, #63\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" + /* Add modulus (if underflow) */ + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" + "stp x4, x5, [x0]\n\t" + "stp x6, x7, [x0, #16]\n\t" + "stp x12, x13, [x1]\n\t" + "stp x14, x15, [x1, #16]\n\t" + "ldr x1, [x29, #24]\n\t" + "add x2, x1, #32\n\t" + "sub x0, x0, #32\n\t" + /* Add */ + "ldp x8, x9, [x1]\n\t" + "ldp x10, x11, [x1, #16]\n\t" + "adds x8, x8, x16\n\t" + "adcs x9, x9, x17\n\t" + "adcs x10, x10, x19\n\t" + "adcs x11, x11, x20\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "extr x28, x28, x11, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x12, x12, x25\n\t" - "sbcs x13, x13, x28\n\t" - "sbcs x14, x14, x28\n\t" - "sbc x15, x15, x26\n\t" - "ldr x0, [x29, #40]\n\t" + "adds x8, x8, x25\n\t" + "adcs x9, x9, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" + "mov x1, x0\n\t" /* Square */ /* A[0] * A[1] */ - "mul x17, x12, x13\n\t" - "umulh x19, x12, x13\n\t" - /* A[0] * A[2] */ - "mul x25, x12, x14\n\t" - "umulh x20, x12, x14\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, xzr\n\t" + "umulh x23, x8, x9\n\t" + "mul x22, x8, x9\n\t" /* A[0] * A[3] */ - "mul x25, x12, x15\n\t" - "umulh x21, x12, x15\n\t" - "adds x20, x20, x25\n\t" - "adc x21, x21, xzr\n\t" - /* A[1] * A[2] */ - "mul x25, x13, x14\n\t" - "umulh x26, x13, x14\n\t" - "adds x20, x20, x25\n\t" - "adcs x21, x21, x26\n\t" - "adc x22, xzr, xzr\n\t" + "umulh x4, x8, x11\n\t" + "mul x24, x8, x11\n\t" + /* A[0] * A[2] */ + "mul x25, x8, x10\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x8, x10\n\t" + "adcs x24, x24, x26\n\t" /* A[1] * A[3] */ - "mul x25, x13, x15\n\t" - "umulh x26, x13, x15\n\t" - "adds x21, x21, x25\n\t" - "adc x22, x22, x26\n\t" + "mul x25, x9, x11\n\t" + "adcs x4, x4, x25\n\t" + "umulh x5, x9, x11\n\t" + "adc x5, x5, xzr\n\t" + /* A[1] * A[2] */ + "mul x25, x9, x10\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x9, x10\n\t" + "adcs x4, x4, x26\n\t" /* A[2] * A[3] */ - "mul x25, x14, x15\n\t" - "umulh x23, x14, x15\n\t" - "adds x22, x22, x25\n\t" - "adc x23, x23, xzr\n\t" + "mul x25, x10, x11\n\t" + "adcs x5, x5, x25\n\t" + "umulh x6, x10, x11\n\t" + "adc x6, x6, xzr\n\t" /* Double */ - "adds x17, x17, x17\n\t" - "adcs x19, x19, x19\n\t" - "adcs x20, x20, x20\n\t" - "adcs x21, x21, x21\n\t" - "adcs x22, x22, x22\n\t" + "adds x22, x22, x22\n\t" "adcs x23, x23, x23\n\t" - "adc x24, xzr, xzr\n\t" + "adcs x24, x24, x24\n\t" + "adcs x4, x4, x4\n\t" + "adcs x5, x5, x5\n\t" + "adcs x6, x6, x6\n\t" + "adc x7, xzr, xzr\n\t" /* A[0] * A[0] */ - "mul x16, x12, x12\n\t" - "umulh x27, x12, x12\n\t" + "umulh x26, x8, x8\n\t" + "mul x21, x8, x8\n\t" /* A[1] * A[1] */ - "mul x25, x13, x13\n\t" - "umulh x26, x13, x13\n\t" - "adds x17, x17, x27\n\t" - "adcs x19, x19, x25\n\t" - "adc x27, x26, xzr\n\t" + "mul x25, x9, x9\n\t" + "adds x22, x22, x26\n\t" + "umulh x26, x9, x9\n\t" + "adcs x23, x23, x25\n\t" /* A[2] * A[2] */ - "mul x25, x14, x14\n\t" - "umulh x26, x14, x14\n\t" - "adds x20, x20, x27\n\t" - "adcs x21, x21, x25\n\t" - "adc x27, x26, xzr\n\t" + "mul x25, x10, x10\n\t" + "adcs x24, x24, x26\n\t" + "umulh x26, x10, x10\n\t" + "adcs x4, x4, x25\n\t" /* A[3] * A[3] */ - "mul x25, x15, x15\n\t" - "umulh x26, x15, x15\n\t" - "adds x22, x22, x27\n\t" - "adcs x23, x23, x25\n\t" - "adc x24, x24, x26\n\t" + "mul x25, x11, x11\n\t" + "adcs x5, x5, x26\n\t" + "umulh x26, x11, x11\n\t" + "adcs x6, x6, x25\n\t" + "adc x7, x7, x26\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x24, x24, x23, #63\n\t" - "extr x23, x23, x22, #63\n\t" - "extr x22, x22, x21, #63\n\t" - "extr x21, x21, x20, #63\n\t" - "and x20, x20, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x21\n\t" - "umulh x21, x25, x21\n\t" - "adds x16, x16, x26\n\t" - "mul x26, x25, x22\n\t" - "umulh x22, x25, x22\n\t" - "adcs x17, x17, x26\n\t" - "mul x26, x25, x23\n\t" - "umulh x23, x25, x23\n\t" - "adcs x19, x19, x26\n\t" - "mul x26, x25, x24\n\t" - "umulh x27, x25, x24\n\t" - "adcs x20, x20, x26\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x7\n\t" + "adds x24, x24, x26\n\t" + "umulh x27, x25, x7\n\t" "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x17, x17, x21\n\t" - "adcs x19, x19, x22\n\t" - "adcs x20, x20, x23\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x20, #63\n\t" + "mov x25, #19\n\t" + "extr x27, x27, x24, #63\n\t" "mul x27, x27, x25\n\t" - "and x20, x20, #0x7fffffffffffffff\n\t" - "adds x16, x16, x27\n\t" - "adcs x17, x17, xzr\n\t" - "adcs x19, x19, xzr\n\t" - "adc x20, x20, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x20, asr 63\n\t" - "and x20, x20, #0x7fffffffffffffff\n\t" - "adds x16, x16, x27\n\t" - "adcs x17, x17, xzr\n\t" - "adcs x19, x19, xzr\n\t" - "adc x20, x20, xzr\n\t" - /* Store */ - "stp x16, x17, [x0]\n\t" - "stp x19, x20, [x0, #16]\n\t" - "ldr x0, [x29, #24]\n\t" - "ldr x1, [x29, #32]\n\t" - /* Add */ - "adds x12, x8, x4\n\t" - "adcs x13, x9, x5\n\t" - "adcs x14, x10, x6\n\t" - "adc x15, x11, x7\n\t" - "mov x25, #-19\n\t" - "asr x28, x15, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" - /* Sub modulus (if overflow) */ - "subs x12, x12, x25\n\t" - "sbcs x13, x13, x28\n\t" - "sbcs x14, x14, x28\n\t" - "sbc x15, x15, x26\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x4\n\t" + "adds x21, x21, x26\n\t" + "umulh x4, x25, x4\n\t" + "mul x26, x25, x5\n\t" + "adcs x22, x22, x26\n\t" + "umulh x5, x25, x5\n\t" + "mul x26, x25, x6\n\t" + "adcs x23, x23, x26\n\t" + "umulh x6, x25, x6\n\t" + "adc x24, x24, xzr\n\t" + /* Add high product results in */ + "adds x21, x21, x27\n\t" + "adcs x22, x22, x4\n\t" + "adcs x23, x23, x5\n\t" + "adc x24, x24, x6\n\t" + "add x2, x0, #32\n\t" /* Sub */ - "subs x21, x8, x4\n\t" - "sbcs x22, x9, x5\n\t" - "sbcs x23, x10, x6\n\t" - "sbcs x24, x11, x7\n\t" - "mov x25, #-19\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + "subs x21, x21, x8\n\t" + "sbcs x22, x22, x9\n\t" + "sbcs x23, x23, x10\n\t" + "sbcs x24, x24, x11\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" - /* Add modulus (if underflow) */ - "adds x21, x21, x25\n\t" - "adcs x22, x22, x28\n\t" - "adcs x23, x23, x28\n\t" - "adc x24, x24, x26\n\t" - "stp x12, x13, [x0]\n\t" - "stp x14, x15, [x0, #16]\n\t" - "stp x21, x22, [x1]\n\t" - "stp x23, x24, [x1, #16]\n\t" - "ldr x0, [x29, #16]\n\t" - /* Sub */ - "subs x16, x16, x12\n\t" - "sbcs x17, x17, x13\n\t" - "sbcs x19, x19, x14\n\t" - "sbcs x20, x20, x15\n\t" "mov x25, #-19\n\t" - "csetm x28, cc\n\t" /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "extr x28, x28, x24, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" - "stp x16, x17, [x0]\n\t" - "stp x19, x20, [x0, #16]\n\t" - "ldr x0, [x29, #40]\n\t" - "ldr x1, [x29, #64]\n\t" + "subs x21, x21, x25\n\t" + "sbcs x22, x22, xzr\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "sbcs x23, x23, xzr\n\t" + "sbc x24, x24, xzr\n\t" + "stp x21, x22, [x0]\n\t" + "stp x23, x24, [x0, #16]\n\t" + "ldr x2, [x29, #24]\n\t" + "add x2, x2, #0x40\n\t" + "add x0, x0, #0x60\n\t" /* Square * 2 */ - "ldp x12, x13, [x1]\n\t" - "ldp x14, x15, [x1, #16]\n\t" + "ldp x16, x17, [x2]\n\t" + "ldp x19, x20, [x2, #16]\n\t" /* A[0] * A[1] */ - "mul x5, x12, x13\n\t" - "umulh x6, x12, x13\n\t" + "umulh x6, x16, x17\n\t" + "mul x5, x16, x17\n\t" + /* A[0] * A[3] */ + "umulh x8, x16, x20\n\t" + "mul x7, x16, x20\n\t" /* A[0] * A[2] */ - "mul x25, x12, x14\n\t" - "umulh x7, x12, x14\n\t" + "mul x25, x16, x19\n\t" "adds x6, x6, x25\n\t" - "adc x7, x7, xzr\n\t" - /* A[0] * A[3] */ - "mul x25, x12, x15\n\t" - "umulh x8, x12, x15\n\t" - "adds x7, x7, x25\n\t" - "adc x8, x8, xzr\n\t" + "umulh x26, x16, x19\n\t" + "adcs x7, x7, x26\n\t" + /* A[1] * A[3] */ + "mul x25, x17, x20\n\t" + "adcs x8, x8, x25\n\t" + "umulh x9, x17, x20\n\t" + "adc x9, x9, xzr\n\t" /* A[1] * A[2] */ - "mul x25, x13, x14\n\t" - "umulh x26, x13, x14\n\t" + "mul x25, x17, x19\n\t" "adds x7, x7, x25\n\t" + "umulh x26, x17, x19\n\t" "adcs x8, x8, x26\n\t" - "adc x9, xzr, xzr\n\t" - /* A[1] * A[3] */ - "mul x25, x13, x15\n\t" - "umulh x26, x13, x15\n\t" - "adds x8, x8, x25\n\t" - "adc x9, x9, x26\n\t" /* A[2] * A[3] */ - "mul x25, x14, x15\n\t" - "umulh x10, x14, x15\n\t" - "adds x9, x9, x25\n\t" + "mul x25, x19, x20\n\t" + "adcs x9, x9, x25\n\t" + "umulh x10, x19, x20\n\t" "adc x10, x10, xzr\n\t" /* Double */ "adds x5, x5, x5\n\t" @@ -4585,635 +5729,530 @@ "adcs x10, x10, x10\n\t" "adc x11, xzr, xzr\n\t" /* A[0] * A[0] */ - "mul x4, x12, x12\n\t" - "umulh x28, x12, x12\n\t" + "umulh x26, x16, x16\n\t" + "mul x4, x16, x16\n\t" /* A[1] * A[1] */ - "mul x25, x13, x13\n\t" - "umulh x26, x13, x13\n\t" - "adds x5, x5, x28\n\t" + "mul x25, x17, x17\n\t" + "adds x5, x5, x26\n\t" + "umulh x26, x17, x17\n\t" "adcs x6, x6, x25\n\t" - "adc x28, x26, xzr\n\t" /* A[2] * A[2] */ - "mul x25, x14, x14\n\t" - "umulh x26, x14, x14\n\t" - "adds x7, x7, x28\n\t" + "mul x25, x19, x19\n\t" + "adcs x7, x7, x26\n\t" + "umulh x26, x19, x19\n\t" "adcs x8, x8, x25\n\t" - "adc x28, x26, xzr\n\t" /* A[3] * A[3] */ - "mul x25, x15, x15\n\t" - "umulh x26, x15, x15\n\t" - "adds x9, x9, x28\n\t" + "mul x25, x20, x20\n\t" + "adcs x9, x9, x26\n\t" + "umulh x26, x20, x20\n\t" "adcs x10, x10, x25\n\t" "adc x11, x11, x26\n\t" - /* Double and Reduce */ - "mov x25, #0x169\n\t" - /* Move top half into t4-t7 and remove top bit from t3 */ - "lsr x28, x11, #61\n\t" - "extr x11, x11, x10, #62\n\t" - "extr x10, x10, x9, #62\n\t" - "extr x9, x9, x8, #62\n\t" - "extr x8, x8, x7, #62\n\t" - "extr x7, x7, x6, #63\n\t" - "extr x6, x6, x5, #63\n\t" - "extr x5, x5, x4, #63\n\t" - "lsl x4, x4, #1\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Two left, only one right */ - "and x11, x11, #0x7fffffffffffffff\n\t" - /* Multiply top bits by 19*19 */ - "mul x28, x28, x25\n\t" - /* Multiply top half by 19 */ + /* Reduce */ + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x7, x7, x26\n\t" + "umulh x27, x25, x11\n\t" + "adc x27, x27, xzr\n\t" "mov x25, #19\n\t" + "extr x27, x27, x7, #63\n\t" + "mul x27, x27, x25\n\t" + "and x7, x7, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" "mul x26, x25, x8\n\t" - "umulh x8, x25, x8\n\t" "adds x4, x4, x26\n\t" + "umulh x8, x25, x8\n\t" "mul x26, x25, x9\n\t" - "umulh x9, x25, x9\n\t" "adcs x5, x5, x26\n\t" + "umulh x9, x25, x9\n\t" "mul x26, x25, x10\n\t" - "umulh x10, x25, x10\n\t" "adcs x6, x6, x26\n\t" - "mul x26, x25, x11\n\t" - "umulh x27, x25, x11\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x4, x4, x28\n\t" + "umulh x10, x25, x10\n\t" + "adc x7, x7, xzr\n\t" + /* Add high product results in */ + "adds x4, x4, x27\n\t" "adcs x5, x5, x8\n\t" "adcs x6, x6, x9\n\t" - "adcs x7, x7, x10\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x7, #63\n\t" - "mul x27, x27, x25\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" + "adc x7, x7, x10\n\t" + "mov x25, #19\n\t" + "lsr x26, x7, #62\n\t" + "extr x7, x7, x6, #63\n\t" + "extr x6, x6, x5, #63\n\t" + "extr x5, x5, x4, #63\n\t" + "lsl x4, x4, #1\n\t" + "mul x26, x26, x25\n\t" + "adds x4, x4, x26\n\t" "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" "adcs x6, x6, xzr\n\t" "adc x7, x7, xzr\n\t" /* Store */ - "ldr x0, [x29, #40]\n\t" + "sub x1, x0, #32\n\t" /* Sub */ - "subs x4, x4, x21\n\t" - "sbcs x5, x5, x22\n\t" - "sbcs x6, x6, x23\n\t" - "sbcs x7, x7, x24\n\t" - "mov x25, #-19\n\t" + "subs x4, x4, x12\n\t" + "sbcs x5, x5, x13\n\t" + "sbcs x6, x6, x14\n\t" + "sbcs x7, x7, x15\n\t" "csetm x28, cc\n\t" + "mov x25, #-19\n\t" /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "extr x28, x28, x7, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x4, x4, x25\n\t" - "adcs x5, x5, x28\n\t" - "adcs x6, x6, x28\n\t" - "adc x7, x7, x26\n\t" + "subs x4, x4, x25\n\t" + "sbcs x5, x5, xzr\n\t" + "and x7, x7, #0x7fffffffffffffff\n\t" + "sbcs x6, x6, xzr\n\t" + "sbc x7, x7, xzr\n\t" "stp x4, x5, [x0]\n\t" "stp x6, x7, [x0, #16]\n\t" - "ldp x29, x30, [sp], #0x50\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt), [px] "+r" (px), [py] "+r" (py), [pz] "+r" (pz) + "ldp x29, x30, [sp], #32\n\t" + : [r] "+r" (r), [p] "+r" (p) : - : "memory", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "cc" ); } -void fe_ge_madd(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py, const fe pz, const fe pt, const fe qxy2d, const fe qyplusx, const fe qyminusx) +void ge_madd(ge_p1p1* r, const ge_p3* p, const ge_precomp* q) { __asm__ __volatile__ ( - "stp x29, x30, [sp, #-112]!\n\t" + "stp x29, x30, [sp, #-48]!\n\t" "add x29, sp, #0\n\t" - "str %x[qyminusx], [sp, #104]\n\t" - "str %x[qyplusx], [sp, #96]\n\t" - "str %x[qxy2d], [sp, #88]\n\t" - "str %x[rx], [x29, #16]\n\t" - "str %x[ry], [x29, #24]\n\t" - "str %x[rz], [x29, #32]\n\t" - "str %x[rt], [x29, #40]\n\t" - "str %x[px], [x29, #48]\n\t" - "str %x[py], [x29, #56]\n\t" - "str %x[pz], [x29, #64]\n\t" - "str %x[pt], [x29, #72]\n\t" - "ldr x2, [x29, #56]\n\t" - "ldr x3, [x29, #48]\n\t" + "str %x[r], [x29, #16]\n\t" + "str %x[p], [x29, #24]\n\t" + "str %x[q], [x29, #32]\n\t" + "mov x3, x1\n\t" + "add x2, x1, #32\n\t" + "add x1, x0, #32\n\t" /* Add */ - "ldp x12, x13, [x2]\n\t" - "ldp x14, x15, [x2, #16]\n\t" - "ldp x16, x17, [x3]\n\t" - "ldp x19, x20, [x3, #16]\n\t" - "adds x4, x12, x16\n\t" - "adcs x5, x13, x17\n\t" - "adcs x6, x14, x19\n\t" - "adc x7, x15, x20\n\t" - "mov x25, #-19\n\t" - "asr x28, x7, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + "ldp x4, x5, [x3]\n\t" + "ldp x6, x7, [x3, #16]\n\t" + "adds x16, x8, x4\n\t" + "adcs x17, x9, x5\n\t" + "adcs x19, x10, x6\n\t" + "adcs x20, x11, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x20, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x4, x4, x25\n\t" - "sbcs x5, x5, x28\n\t" - "sbcs x6, x6, x28\n\t" - "sbc x7, x7, x26\n\t" + "adds x16, x16, x25\n\t" + "adcs x17, x17, xzr\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "adcs x19, x19, xzr\n\t" + "adc x20, x20, xzr\n\t" /* Sub */ - "subs x8, x12, x16\n\t" - "sbcs x9, x13, x17\n\t" - "sbcs x10, x14, x19\n\t" - "sbcs x11, x15, x20\n\t" - "mov x25, #-19\n\t" + "subs x12, x8, x4\n\t" + "sbcs x13, x9, x5\n\t" + "sbcs x14, x10, x6\n\t" + "sbcs x15, x11, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x8, x8, x25\n\t" - "adcs x9, x9, x28\n\t" - "adcs x10, x10, x28\n\t" - "adc x11, x11, x26\n\t" - "ldr x0, [x29, #32]\n\t" - "ldr x2, [sp, #96]\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" + "ldr x2, [x29, #32]\n\t" + "mov x1, x0\n\t" /* Multiply */ - "ldp x21, x22, [x2]\n\t" - "ldp x23, x24, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x12, x4, x21\n\t" - "umulh x13, x4, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x4, x22\n\t" - "umulh x14, x4, x22\n\t" - "adds x13, x13, x25\n\t" - "adc x14, x14, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x5, x21\n\t" - "umulh x26, x5, x21\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x4, x23\n\t" - "umulh x26, x4, x23\n\t" - "adds x14, x14, x25\n\t" - "adc x15, x15, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x5, x22\n\t" - "umulh x26, x5, x22\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x6, x21\n\t" - "umulh x26, x6, x21\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x4, x24\n\t" - "umulh x26, x4, x24\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x5, x23\n\t" - "umulh x26, x5, x23\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x6, x22\n\t" - "umulh x26, x6, x22\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x7, x21\n\t" - "umulh x26, x7, x21\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x5, x24\n\t" - "umulh x26, x5, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x6, x23\n\t" - "umulh x26, x6, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x7, x22\n\t" - "umulh x26, x7, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x6, x24\n\t" - "umulh x26, x6, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x7, x23\n\t" - "umulh x26, x7, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x7, x24\n\t" - "umulh x26, x7, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x22, x16, x8\n\t" + "mul x21, x16, x8\n\t" + /* A[2] * B[0] */ + "umulh x24, x19, x8\n\t" + "mul x23, x19, x8\n\t" + /* A[1] * B[0] */ + "mul x25, x17, x8\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x17, x8\n\t" + "adcs x23, x23, x26\n\t" + /* A[1] * B[3] */ + "umulh x5, x17, x11\n\t" + "adc x24, x24, xzr\n\t" + "mul x4, x17, x11\n\t" + /* A[0] * B[1] */ + "mul x25, x16, x9\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x16, x9\n\t" + "adcs x23, x23, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x19, x9\n\t" + "adcs x24, x24, x25\n\t" + "umulh x26, x19, x9\n\t" + "adcs x4, x4, x26\n\t" + "adc x5, x5, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x17, x10\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x17, x10\n\t" + "adcs x4, x4, x26\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x16, x10\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x16, x10\n\t" + "adcs x24, x24, x26\n\t" + "adcs x4, x4, xzr\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, x6, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x17, x9\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x17, x9\n\t" + "adcs x24, x24, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x20, x9\n\t" + "adcs x4, x4, x25\n\t" + "umulh x26, x20, x9\n\t" + "adcs x5, x5, x26\n\t" + "adc x6, x6, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x19, x10\n\t" + "adds x4, x4, x25\n\t" + "umulh x26, x19, x10\n\t" + "adcs x5, x5, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x20, x11\n\t" + "adcs x6, x6, x25\n\t" + "umulh x7, x20, x11\n\t" + "adc x7, x7, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x16, x11\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x16, x11\n\t" + "adcs x4, x4, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x19, x11\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x19, x11\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x20, x8\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x20, x8\n\t" + "adcs x4, x4, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x20, x10\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x20, x10\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x15, #63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x12, x12, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x13, x13, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x14, x14, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x15, x15, x26\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x7\n\t" + "adds x24, x24, x26\n\t" + "umulh x27, x25, x7\n\t" "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x13, x13, x16\n\t" - "adcs x14, x14, x17\n\t" - "adcs x15, x15, x19\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x15, #63\n\t" + "mov x25, #19\n\t" + "extr x27, x27, x24, #63\n\t" "mul x27, x27, x25\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x15, asr 63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" - /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [sp, #104]\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x4\n\t" + "adds x21, x21, x26\n\t" + "umulh x4, x25, x4\n\t" + "mul x26, x25, x5\n\t" + "adcs x22, x22, x26\n\t" + "umulh x5, x25, x5\n\t" + "mul x26, x25, x6\n\t" + "adcs x23, x23, x26\n\t" + "umulh x6, x25, x6\n\t" + "adc x24, x24, xzr\n\t" + /* Add high product results in */ + "adds x21, x21, x27\n\t" + "adcs x22, x22, x4\n\t" + "adcs x23, x23, x5\n\t" + "adc x24, x24, x6\n\t" + "add x2, x2, #32\n\t" + "add x1, x0, #32\n\t" + "add x0, x0, #32\n\t" /* Multiply */ - "ldp x21, x22, [x1]\n\t" - "ldp x23, x24, [x1, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x8, x21\n\t" - "umulh x5, x8, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x8, x22\n\t" - "umulh x6, x8, x22\n\t" + "ldp x16, x17, [x2]\n\t" + "ldp x19, x20, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x5, x12, x16\n\t" + "mul x4, x12, x16\n\t" + /* A[2] * B[0] */ + "umulh x7, x14, x16\n\t" + "mul x6, x14, x16\n\t" + /* A[1] * B[0] */ + "mul x25, x13, x16\n\t" "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x9, x21\n\t" - "umulh x26, x9, x21\n\t" + "umulh x26, x13, x16\n\t" + "adcs x6, x6, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x13, x20\n\t" + "adc x7, x7, xzr\n\t" + "mul x8, x13, x20\n\t" + /* A[0] * B[1] */ + "mul x25, x12, x17\n\t" "adds x5, x5, x25\n\t" + "umulh x26, x12, x17\n\t" "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x8, x23\n\t" - "umulh x26, x8, x23\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x9, x22\n\t" - "umulh x26, x9, x22\n\t" + /* A[2] * B[1] */ + "mul x25, x14, x17\n\t" + "adcs x7, x7, x25\n\t" + "umulh x26, x14, x17\n\t" + "adcs x8, x8, x26\n\t" + "adc x9, x9, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x13, x19\n\t" + "adds x7, x7, x25\n\t" + "umulh x26, x13, x19\n\t" + "adcs x8, x8, x26\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x12, x19\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x12, x19\n\t" "adcs x7, x7, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x10, x21\n\t" - "umulh x26, x10, x21\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x13, x17\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x13, x17\n\t" "adcs x7, x7, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x8, x24\n\t" - "umulh x26, x8, x24\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x9, x23\n\t" - "umulh x26, x9, x23\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x10, x22\n\t" - "umulh x26, x10, x22\n\t" + /* A[3] * B[1] */ + "mul x25, x15, x17\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x15, x17\n\t" + "adcs x9, x9, x26\n\t" + "adc x10, x10, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x14, x19\n\t" + "adds x8, x8, x25\n\t" + "umulh x26, x14, x19\n\t" + "adcs x9, x9, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x15, x20\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x15, x20\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x12, x20\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x11, x21\n\t" - "umulh x26, x11, x21\n\t" + "umulh x26, x12, x20\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x14, x20\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x14, x20\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x15, x16\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x9, x24\n\t" - "umulh x26, x9, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x10, x23\n\t" - "umulh x26, x10, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x11, x22\n\t" - "umulh x26, x11, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x10, x24\n\t" - "umulh x26, x10, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x11, x23\n\t" - "umulh x26, x11, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x11, x24\n\t" - "umulh x26, x11, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "umulh x26, x15, x16\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x15, x19\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x15, x19\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x4, x4, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x5, x5, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x16\n\t" - "adcs x6, x6, x17\n\t" - "adcs x7, x7, x19\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x7, x7, x26\n\t" + "umulh x27, x25, x11\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ + "mov x25, #19\n\t" "extr x27, x27, x7, #63\n\t" "mul x27, x27, x25\n\t" "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x8\n\t" + "adds x4, x4, x26\n\t" + "umulh x8, x25, x8\n\t" + "mul x26, x25, x9\n\t" + "adcs x5, x5, x26\n\t" + "umulh x9, x25, x9\n\t" + "mul x26, x25, x10\n\t" + "adcs x6, x6, x26\n\t" + "umulh x10, x25, x10\n\t" "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [x29, #16]\n\t" + "adcs x5, x5, x8\n\t" + "adcs x6, x6, x9\n\t" + "adc x7, x7, x10\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + "sub x1, x0, #32\n\t" /* Add */ - "adds x8, x12, x4\n\t" - "adcs x9, x13, x5\n\t" - "adcs x10, x14, x6\n\t" - "adc x11, x15, x7\n\t" - "mov x25, #-19\n\t" - "asr x28, x11, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "adds x8, x21, x4\n\t" + "adcs x9, x22, x5\n\t" + "adcs x10, x23, x6\n\t" + "adcs x11, x24, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x11, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x8, x8, x25\n\t" - "sbcs x9, x9, x28\n\t" - "sbcs x10, x10, x28\n\t" - "sbc x11, x11, x26\n\t" + "adds x8, x8, x25\n\t" + "adcs x9, x9, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" /* Sub */ - "subs x16, x12, x4\n\t" - "sbcs x17, x13, x5\n\t" - "sbcs x19, x14, x6\n\t" - "sbcs x20, x15, x7\n\t" - "mov x25, #-19\n\t" + "subs x12, x21, x4\n\t" + "sbcs x13, x22, x5\n\t" + "sbcs x14, x23, x6\n\t" + "sbcs x15, x24, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" "stp x8, x9, [x0]\n\t" "stp x10, x11, [x0, #16]\n\t" - "stp x16, x17, [x1]\n\t" - "stp x19, x20, [x1, #16]\n\t" - "ldr x0, [x29, #40]\n\t" - "ldr x1, [sp, #88]\n\t" - "ldr x3, [x29, #72]\n\t" + "stp x12, x13, [x1]\n\t" + "stp x14, x15, [x1, #16]\n\t" + "ldr x1, [x29, #24]\n\t" + "ldr x2, [x29, #32]\n\t" + "add x2, x2, #0x40\n\t" + "add x1, x1, #0x60\n\t" + "add x0, x0, #0x40\n\t" /* Multiply */ - "ldp x16, x17, [x1]\n\t" - "ldp x19, x20, [x1, #16]\n\t" - "ldp x21, x22, [x3]\n\t" - "ldp x23, x24, [x3, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x16, x21\n\t" - "umulh x5, x16, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x16, x22\n\t" - "umulh x6, x16, x22\n\t" - "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x17, x21\n\t" - "umulh x26, x17, x21\n\t" - "adds x5, x5, x25\n\t" - "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x16, x23\n\t" - "umulh x26, x16, x23\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x17, x22\n\t" - "umulh x26, x17, x22\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x19, x21\n\t" - "umulh x26, x19, x21\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, x8, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x16, x24\n\t" - "umulh x26, x16, x24\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x17, x23\n\t" - "umulh x26, x17, x23\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x19, x22\n\t" - "umulh x26, x19, x22\n\t" - "adds x7, x7, x25\n\t" + "ldp x21, x22, [x1]\n\t" + "ldp x23, x24, [x1, #16]\n\t" + "ldp x4, x5, [x2]\n\t" + "ldp x6, x7, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x17, x21, x4\n\t" + "mul x16, x21, x4\n\t" + /* A[2] * B[0] */ + "umulh x20, x23, x4\n\t" + "mul x19, x23, x4\n\t" + /* A[1] * B[0] */ + "mul x25, x22, x4\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x22, x4\n\t" + "adcs x19, x19, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x22, x7\n\t" + "adc x20, x20, xzr\n\t" + "mul x8, x22, x7\n\t" + /* A[0] * B[1] */ + "mul x25, x21, x5\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x21, x5\n\t" + "adcs x19, x19, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x23, x5\n\t" + "adcs x20, x20, x25\n\t" + "umulh x26, x23, x5\n\t" "adcs x8, x8, x26\n\t" "adc x9, x9, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x20, x21\n\t" - "umulh x26, x20, x21\n\t" - "adds x7, x7, x25\n\t" + /* A[1] * B[2] */ + "mul x25, x22, x6\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x22, x6\n\t" "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x17, x24\n\t" - "umulh x26, x17, x24\n\t" - "adds x8, x8, x25\n\t" - "adcs x9, x9, x26\n\t" + "adcs x9, x9, xzr\n\t" "adc x10, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x19, x23\n\t" - "umulh x26, x19, x23\n\t" - "adds x8, x8, x25\n\t" + /* A[0] * B[2] */ + "mul x25, x21, x6\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x21, x6\n\t" + "adcs x20, x20, x26\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x22, x5\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x22, x5\n\t" + "adcs x20, x20, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x24, x5\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x24, x5\n\t" "adcs x9, x9, x26\n\t" "adc x10, x10, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x20, x22\n\t" - "umulh x26, x20, x22\n\t" + /* A[2] * B[2] */ + "mul x25, x23, x6\n\t" "adds x8, x8, x25\n\t" + "umulh x26, x23, x6\n\t" "adcs x9, x9, x26\n\t" - "adc x10, x10, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x19, x24\n\t" - "umulh x26, x19, x24\n\t" - "adds x9, x9, x25\n\t" + /* A[3] * B[3] */ + "mul x25, x24, x7\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x24, x7\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x21, x7\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x21, x7\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x23, x7\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x23, x7\n\t" "adcs x10, x10, x26\n\t" - "adc x11, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x20, x23\n\t" - "umulh x26, x20, x23\n\t" - "adds x9, x9, x25\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x24, x4\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x24, x4\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x24, x6\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x24, x6\n\t" "adcs x10, x10, x26\n\t" "adc x11, x11, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x20, x24\n\t" - "umulh x26, x20, x24\n\t" - "adds x10, x10, x25\n\t" - "adc x11, x11, x26\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x11, x11, x10, #63\n\t" - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x20, x20, x26\n\t" + "umulh x27, x25, x11\n\t" + "adc x27, x27, xzr\n\t" "mov x25, #19\n\t" + "extr x27, x27, x20, #63\n\t" + "mul x27, x27, x25\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" "mul x26, x25, x8\n\t" + "adds x16, x16, x26\n\t" "umulh x8, x25, x8\n\t" - "adds x4, x4, x26\n\t" "mul x26, x25, x9\n\t" + "adcs x17, x17, x26\n\t" "umulh x9, x25, x9\n\t" - "adcs x5, x5, x26\n\t" "mul x26, x25, x10\n\t" + "adcs x19, x19, x26\n\t" "umulh x10, x25, x10\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x11\n\t" - "umulh x27, x25, x11\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adcs x7, x7, x10\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x7, #63\n\t" - "mul x27, x27, x25\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Store */ - "ldr x0, [x29, #32]\n\t" - "ldr x1, [x29, #64]\n\t" + "adc x20, x20, xzr\n\t" + /* Add high product results in */ + "adds x16, x16, x27\n\t" + "adcs x17, x17, x8\n\t" + "adcs x19, x19, x9\n\t" + "adc x20, x20, x10\n\t" + "sub x1, x1, #32\n\t" /* Double */ - "ldp x8, x9, [x1]\n\t" - "ldp x10, x11, [x1, #16]\n\t" - "adds x8, x8, x8\n\t" - "adcs x9, x9, x9\n\t" - "adcs x10, x10, x10\n\t" - "adc x11, x11, x11\n\t" - "mov x25, #-19\n\t" - "asr x28, x11, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" - /* Sub modulus (if overflow) */ - "subs x8, x8, x25\n\t" - "sbcs x9, x9, x28\n\t" - "sbcs x10, x10, x28\n\t" - "sbc x11, x11, x26\n\t" - "ldr x1, [x29, #40]\n\t" - /* Add */ - "adds x12, x8, x4\n\t" - "adcs x13, x9, x5\n\t" - "adcs x14, x10, x6\n\t" - "adc x15, x11, x7\n\t" + "ldp x12, x13, [x1]\n\t" + "ldp x14, x15, [x1, #16]\n\t" + "adds x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adc x15, x15, x15\n\t" "mov x25, #-19\n\t" "asr x28, x15, #63\n\t" /* Mask the modulus */ @@ -5224,562 +6263,493 @@ "sbcs x13, x13, x28\n\t" "sbcs x14, x14, x28\n\t" "sbc x15, x15, x26\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + "mov x1, x0\n\t" + "sub x0, x0, #32\n\t" + /* Add */ + "adds x8, x12, x16\n\t" + "adcs x9, x13, x17\n\t" + "adcs x10, x14, x19\n\t" + "adcs x11, x15, x20\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x11, #63\n\t" + "mul x25, x28, x25\n\t" + /* Sub modulus (if overflow) */ + "adds x8, x8, x25\n\t" + "adcs x9, x9, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" /* Sub */ - "subs x16, x8, x4\n\t" - "sbcs x17, x9, x5\n\t" - "sbcs x19, x10, x6\n\t" - "sbcs x20, x11, x7\n\t" - "mov x25, #-19\n\t" + "subs x4, x12, x16\n\t" + "sbcs x5, x13, x17\n\t" + "sbcs x6, x14, x19\n\t" + "sbcs x7, x15, x20\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x7, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" - "stp x12, x13, [x0]\n\t" - "stp x14, x15, [x0, #16]\n\t" - "stp x16, x17, [x1]\n\t" - "stp x19, x20, [x1, #16]\n\t" - "ldp x29, x30, [sp], #0x70\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt), [px] "+r" (px), [py] "+r" (py), [pz] "+r" (pz), [pt] "+r" (pt), [qxy2d] "+r" (qxy2d), [qyplusx] "+r" (qyplusx), [qyminusx] "+r" (qyminusx) + "subs x4, x4, x25\n\t" + "sbcs x5, x5, xzr\n\t" + "and x7, x7, #0x7fffffffffffffff\n\t" + "sbcs x6, x6, xzr\n\t" + "sbc x7, x7, xzr\n\t" + "stp x8, x9, [x0]\n\t" + "stp x10, x11, [x0, #16]\n\t" + "stp x4, x5, [x1]\n\t" + "stp x6, x7, [x1, #16]\n\t" + "ldp x29, x30, [sp], #48\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) : - : "memory", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "cc" ); } -void fe_ge_msub(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py, const fe pz, const fe pt, const fe qxy2d, const fe qyplusx, const fe qyminusx) +void ge_msub(ge_p1p1* r, const ge_p3* p, const ge_precomp* q) { __asm__ __volatile__ ( - "stp x29, x30, [sp, #-112]!\n\t" + "stp x29, x30, [sp, #-48]!\n\t" "add x29, sp, #0\n\t" - "str %x[qyminusx], [sp, #104]\n\t" - "str %x[qyplusx], [sp, #96]\n\t" - "str %x[qxy2d], [sp, #88]\n\t" - "str %x[rx], [x29, #16]\n\t" - "str %x[ry], [x29, #24]\n\t" - "str %x[rz], [x29, #32]\n\t" - "str %x[rt], [x29, #40]\n\t" - "str %x[px], [x29, #48]\n\t" - "str %x[py], [x29, #56]\n\t" - "str %x[pz], [x29, #64]\n\t" - "str %x[pt], [x29, #72]\n\t" - "ldr x2, [x29, #56]\n\t" - "ldr x3, [x29, #48]\n\t" + "str %x[r], [x29, #16]\n\t" + "str %x[p], [x29, #24]\n\t" + "str %x[q], [x29, #32]\n\t" + "mov x3, x1\n\t" + "add x2, x1, #32\n\t" + "add x1, x0, #32\n\t" /* Add */ - "ldp x12, x13, [x2]\n\t" - "ldp x14, x15, [x2, #16]\n\t" - "ldp x16, x17, [x3]\n\t" - "ldp x19, x20, [x3, #16]\n\t" - "adds x4, x12, x16\n\t" - "adcs x5, x13, x17\n\t" - "adcs x6, x14, x19\n\t" - "adc x7, x15, x20\n\t" - "mov x25, #-19\n\t" - "asr x28, x7, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + "ldp x4, x5, [x3]\n\t" + "ldp x6, x7, [x3, #16]\n\t" + "adds x16, x8, x4\n\t" + "adcs x17, x9, x5\n\t" + "adcs x19, x10, x6\n\t" + "adcs x20, x11, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x20, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x4, x4, x25\n\t" - "sbcs x5, x5, x28\n\t" - "sbcs x6, x6, x28\n\t" - "sbc x7, x7, x26\n\t" + "adds x16, x16, x25\n\t" + "adcs x17, x17, xzr\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "adcs x19, x19, xzr\n\t" + "adc x20, x20, xzr\n\t" /* Sub */ - "subs x8, x12, x16\n\t" - "sbcs x9, x13, x17\n\t" - "sbcs x10, x14, x19\n\t" - "sbcs x11, x15, x20\n\t" - "mov x25, #-19\n\t" + "subs x12, x8, x4\n\t" + "sbcs x13, x9, x5\n\t" + "sbcs x14, x10, x6\n\t" + "sbcs x15, x11, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x8, x8, x25\n\t" - "adcs x9, x9, x28\n\t" - "adcs x10, x10, x28\n\t" - "adc x11, x11, x26\n\t" - "ldr x0, [x29, #32]\n\t" - "ldr x2, [sp, #104]\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" + "ldr x2, [x29, #32]\n\t" + "add x2, x2, #32\n\t" + "mov x1, x0\n\t" /* Multiply */ - "ldp x21, x22, [x2]\n\t" - "ldp x23, x24, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x12, x4, x21\n\t" - "umulh x13, x4, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x4, x22\n\t" - "umulh x14, x4, x22\n\t" - "adds x13, x13, x25\n\t" - "adc x14, x14, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x5, x21\n\t" - "umulh x26, x5, x21\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x4, x23\n\t" - "umulh x26, x4, x23\n\t" - "adds x14, x14, x25\n\t" - "adc x15, x15, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x5, x22\n\t" - "umulh x26, x5, x22\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x6, x21\n\t" - "umulh x26, x6, x21\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x4, x24\n\t" - "umulh x26, x4, x24\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x5, x23\n\t" - "umulh x26, x5, x23\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x6, x22\n\t" - "umulh x26, x6, x22\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x7, x21\n\t" - "umulh x26, x7, x21\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x5, x24\n\t" - "umulh x26, x5, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x6, x23\n\t" - "umulh x26, x6, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x7, x22\n\t" - "umulh x26, x7, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x6, x24\n\t" - "umulh x26, x6, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x7, x23\n\t" - "umulh x26, x7, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x7, x24\n\t" - "umulh x26, x7, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x22, x16, x8\n\t" + "mul x21, x16, x8\n\t" + /* A[2] * B[0] */ + "umulh x24, x19, x8\n\t" + "mul x23, x19, x8\n\t" + /* A[1] * B[0] */ + "mul x25, x17, x8\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x17, x8\n\t" + "adcs x23, x23, x26\n\t" + /* A[1] * B[3] */ + "umulh x5, x17, x11\n\t" + "adc x24, x24, xzr\n\t" + "mul x4, x17, x11\n\t" + /* A[0] * B[1] */ + "mul x25, x16, x9\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x16, x9\n\t" + "adcs x23, x23, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x19, x9\n\t" + "adcs x24, x24, x25\n\t" + "umulh x26, x19, x9\n\t" + "adcs x4, x4, x26\n\t" + "adc x5, x5, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x17, x10\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x17, x10\n\t" + "adcs x4, x4, x26\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x16, x10\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x16, x10\n\t" + "adcs x24, x24, x26\n\t" + "adcs x4, x4, xzr\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, x6, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x17, x9\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x17, x9\n\t" + "adcs x24, x24, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x20, x9\n\t" + "adcs x4, x4, x25\n\t" + "umulh x26, x20, x9\n\t" + "adcs x5, x5, x26\n\t" + "adc x6, x6, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x19, x10\n\t" + "adds x4, x4, x25\n\t" + "umulh x26, x19, x10\n\t" + "adcs x5, x5, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x20, x11\n\t" + "adcs x6, x6, x25\n\t" + "umulh x7, x20, x11\n\t" + "adc x7, x7, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x16, x11\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x16, x11\n\t" + "adcs x4, x4, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x19, x11\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x19, x11\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x20, x8\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x20, x8\n\t" + "adcs x4, x4, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x20, x10\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x20, x10\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x15, #63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x12, x12, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x13, x13, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x14, x14, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x15, x15, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x13, x13, x16\n\t" - "adcs x14, x14, x17\n\t" - "adcs x15, x15, x19\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x7\n\t" + "adds x24, x24, x26\n\t" + "umulh x27, x25, x7\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x15, #63\n\t" + "mov x25, #19\n\t" + "extr x27, x27, x24, #63\n\t" "mul x27, x27, x25\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x15, asr 63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" - /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [sp, #96]\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x4\n\t" + "adds x21, x21, x26\n\t" + "umulh x4, x25, x4\n\t" + "mul x26, x25, x5\n\t" + "adcs x22, x22, x26\n\t" + "umulh x5, x25, x5\n\t" + "mul x26, x25, x6\n\t" + "adcs x23, x23, x26\n\t" + "umulh x6, x25, x6\n\t" + "adc x24, x24, xzr\n\t" + /* Add high product results in */ + "adds x21, x21, x27\n\t" + "adcs x22, x22, x4\n\t" + "adcs x23, x23, x5\n\t" + "adc x24, x24, x6\n\t" + "sub x2, x2, #32\n\t" + "add x1, x0, #32\n\t" + "add x0, x0, #32\n\t" /* Multiply */ - "ldp x21, x22, [x1]\n\t" - "ldp x23, x24, [x1, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x8, x21\n\t" - "umulh x5, x8, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x8, x22\n\t" - "umulh x6, x8, x22\n\t" + "ldp x16, x17, [x2]\n\t" + "ldp x19, x20, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x5, x12, x16\n\t" + "mul x4, x12, x16\n\t" + /* A[2] * B[0] */ + "umulh x7, x14, x16\n\t" + "mul x6, x14, x16\n\t" + /* A[1] * B[0] */ + "mul x25, x13, x16\n\t" "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x9, x21\n\t" - "umulh x26, x9, x21\n\t" + "umulh x26, x13, x16\n\t" + "adcs x6, x6, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x13, x20\n\t" + "adc x7, x7, xzr\n\t" + "mul x8, x13, x20\n\t" + /* A[0] * B[1] */ + "mul x25, x12, x17\n\t" "adds x5, x5, x25\n\t" + "umulh x26, x12, x17\n\t" "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x8, x23\n\t" - "umulh x26, x8, x23\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x9, x22\n\t" - "umulh x26, x9, x22\n\t" + /* A[2] * B[1] */ + "mul x25, x14, x17\n\t" + "adcs x7, x7, x25\n\t" + "umulh x26, x14, x17\n\t" + "adcs x8, x8, x26\n\t" + "adc x9, x9, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x13, x19\n\t" + "adds x7, x7, x25\n\t" + "umulh x26, x13, x19\n\t" + "adcs x8, x8, x26\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x12, x19\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x12, x19\n\t" "adcs x7, x7, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x10, x21\n\t" - "umulh x26, x10, x21\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x13, x17\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x13, x17\n\t" "adcs x7, x7, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x8, x24\n\t" - "umulh x26, x8, x24\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x9, x23\n\t" - "umulh x26, x9, x23\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x10, x22\n\t" - "umulh x26, x10, x22\n\t" + /* A[3] * B[1] */ + "mul x25, x15, x17\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x15, x17\n\t" + "adcs x9, x9, x26\n\t" + "adc x10, x10, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x14, x19\n\t" + "adds x8, x8, x25\n\t" + "umulh x26, x14, x19\n\t" + "adcs x9, x9, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x15, x20\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x15, x20\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x12, x20\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x11, x21\n\t" - "umulh x26, x11, x21\n\t" + "umulh x26, x12, x20\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x14, x20\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x14, x20\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x15, x16\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x9, x24\n\t" - "umulh x26, x9, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x10, x23\n\t" - "umulh x26, x10, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x11, x22\n\t" - "umulh x26, x11, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x10, x24\n\t" - "umulh x26, x10, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x11, x23\n\t" - "umulh x26, x11, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x11, x24\n\t" - "umulh x26, x11, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "umulh x26, x15, x16\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x15, x19\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x15, x19\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x4, x4, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x5, x5, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x16\n\t" - "adcs x6, x6, x17\n\t" - "adcs x7, x7, x19\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x7, x7, x26\n\t" + "umulh x27, x25, x11\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ + "mov x25, #19\n\t" "extr x27, x27, x7, #63\n\t" "mul x27, x27, x25\n\t" "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x8\n\t" + "adds x4, x4, x26\n\t" + "umulh x8, x25, x8\n\t" + "mul x26, x25, x9\n\t" + "adcs x5, x5, x26\n\t" + "umulh x9, x25, x9\n\t" + "mul x26, x25, x10\n\t" + "adcs x6, x6, x26\n\t" + "umulh x10, x25, x10\n\t" "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [x29, #16]\n\t" + "adcs x5, x5, x8\n\t" + "adcs x6, x6, x9\n\t" + "adc x7, x7, x10\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + "sub x1, x0, #32\n\t" /* Add */ - "adds x8, x12, x4\n\t" - "adcs x9, x13, x5\n\t" - "adcs x10, x14, x6\n\t" - "adc x11, x15, x7\n\t" - "mov x25, #-19\n\t" - "asr x28, x11, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "adds x8, x21, x4\n\t" + "adcs x9, x22, x5\n\t" + "adcs x10, x23, x6\n\t" + "adcs x11, x24, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x11, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x8, x8, x25\n\t" - "sbcs x9, x9, x28\n\t" - "sbcs x10, x10, x28\n\t" - "sbc x11, x11, x26\n\t" + "adds x8, x8, x25\n\t" + "adcs x9, x9, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" /* Sub */ - "subs x16, x12, x4\n\t" - "sbcs x17, x13, x5\n\t" - "sbcs x19, x14, x6\n\t" - "sbcs x20, x15, x7\n\t" - "mov x25, #-19\n\t" + "subs x12, x21, x4\n\t" + "sbcs x13, x22, x5\n\t" + "sbcs x14, x23, x6\n\t" + "sbcs x15, x24, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" "stp x8, x9, [x0]\n\t" "stp x10, x11, [x0, #16]\n\t" - "stp x16, x17, [x1]\n\t" - "stp x19, x20, [x1, #16]\n\t" - "ldr x0, [x29, #40]\n\t" - "ldr x1, [sp, #88]\n\t" - "ldr x3, [x29, #72]\n\t" + "stp x12, x13, [x1]\n\t" + "stp x14, x15, [x1, #16]\n\t" + "ldr x1, [x29, #24]\n\t" + "ldr x2, [x29, #32]\n\t" + "add x2, x2, #0x40\n\t" + "add x1, x1, #0x60\n\t" + "add x0, x0, #0x40\n\t" /* Multiply */ - "ldp x16, x17, [x1]\n\t" - "ldp x19, x20, [x1, #16]\n\t" - "ldp x21, x22, [x3]\n\t" - "ldp x23, x24, [x3, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x16, x21\n\t" - "umulh x5, x16, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x16, x22\n\t" - "umulh x6, x16, x22\n\t" - "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x17, x21\n\t" - "umulh x26, x17, x21\n\t" - "adds x5, x5, x25\n\t" - "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x16, x23\n\t" - "umulh x26, x16, x23\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x17, x22\n\t" - "umulh x26, x17, x22\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x19, x21\n\t" - "umulh x26, x19, x21\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, x8, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x16, x24\n\t" - "umulh x26, x16, x24\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x17, x23\n\t" - "umulh x26, x17, x23\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x19, x22\n\t" - "umulh x26, x19, x22\n\t" - "adds x7, x7, x25\n\t" + "ldp x21, x22, [x1]\n\t" + "ldp x23, x24, [x1, #16]\n\t" + "ldp x4, x5, [x2]\n\t" + "ldp x6, x7, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x17, x21, x4\n\t" + "mul x16, x21, x4\n\t" + /* A[2] * B[0] */ + "umulh x20, x23, x4\n\t" + "mul x19, x23, x4\n\t" + /* A[1] * B[0] */ + "mul x25, x22, x4\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x22, x4\n\t" + "adcs x19, x19, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x22, x7\n\t" + "adc x20, x20, xzr\n\t" + "mul x8, x22, x7\n\t" + /* A[0] * B[1] */ + "mul x25, x21, x5\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x21, x5\n\t" + "adcs x19, x19, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x23, x5\n\t" + "adcs x20, x20, x25\n\t" + "umulh x26, x23, x5\n\t" "adcs x8, x8, x26\n\t" "adc x9, x9, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x20, x21\n\t" - "umulh x26, x20, x21\n\t" - "adds x7, x7, x25\n\t" + /* A[1] * B[2] */ + "mul x25, x22, x6\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x22, x6\n\t" "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x17, x24\n\t" - "umulh x26, x17, x24\n\t" - "adds x8, x8, x25\n\t" - "adcs x9, x9, x26\n\t" + "adcs x9, x9, xzr\n\t" "adc x10, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x19, x23\n\t" - "umulh x26, x19, x23\n\t" - "adds x8, x8, x25\n\t" + /* A[0] * B[2] */ + "mul x25, x21, x6\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x21, x6\n\t" + "adcs x20, x20, x26\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x22, x5\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x22, x5\n\t" + "adcs x20, x20, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x24, x5\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x24, x5\n\t" "adcs x9, x9, x26\n\t" "adc x10, x10, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x20, x22\n\t" - "umulh x26, x20, x22\n\t" + /* A[2] * B[2] */ + "mul x25, x23, x6\n\t" "adds x8, x8, x25\n\t" + "umulh x26, x23, x6\n\t" "adcs x9, x9, x26\n\t" - "adc x10, x10, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x19, x24\n\t" - "umulh x26, x19, x24\n\t" - "adds x9, x9, x25\n\t" + /* A[3] * B[3] */ + "mul x25, x24, x7\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x24, x7\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x21, x7\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x21, x7\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x23, x7\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x23, x7\n\t" "adcs x10, x10, x26\n\t" - "adc x11, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x20, x23\n\t" - "umulh x26, x20, x23\n\t" - "adds x9, x9, x25\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x24, x4\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x24, x4\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x24, x6\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x24, x6\n\t" "adcs x10, x10, x26\n\t" "adc x11, x11, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x20, x24\n\t" - "umulh x26, x20, x24\n\t" - "adds x10, x10, x25\n\t" - "adc x11, x11, x26\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x11, x11, x10, #63\n\t" - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x20, x20, x26\n\t" + "umulh x27, x25, x11\n\t" + "adc x27, x27, xzr\n\t" "mov x25, #19\n\t" + "extr x27, x27, x20, #63\n\t" + "mul x27, x27, x25\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" "mul x26, x25, x8\n\t" + "adds x16, x16, x26\n\t" "umulh x8, x25, x8\n\t" - "adds x4, x4, x26\n\t" "mul x26, x25, x9\n\t" + "adcs x17, x17, x26\n\t" "umulh x9, x25, x9\n\t" - "adcs x5, x5, x26\n\t" "mul x26, x25, x10\n\t" + "adcs x19, x19, x26\n\t" "umulh x10, x25, x10\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x11\n\t" - "umulh x27, x25, x11\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adcs x7, x7, x10\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x7, #63\n\t" - "mul x27, x27, x25\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Store */ - "ldr x0, [x29, #32]\n\t" - "ldr x1, [x29, #64]\n\t" + "adc x20, x20, xzr\n\t" + /* Add high product results in */ + "adds x16, x16, x27\n\t" + "adcs x17, x17, x8\n\t" + "adcs x19, x19, x9\n\t" + "adc x20, x20, x10\n\t" + "sub x1, x1, #32\n\t" /* Double */ - "ldp x8, x9, [x1]\n\t" - "ldp x10, x11, [x1, #16]\n\t" - "adds x8, x8, x8\n\t" - "adcs x9, x9, x9\n\t" - "adcs x10, x10, x10\n\t" - "adc x11, x11, x11\n\t" - "mov x25, #-19\n\t" - "asr x28, x11, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" - /* Sub modulus (if overflow) */ - "subs x8, x8, x25\n\t" - "sbcs x9, x9, x28\n\t" - "sbcs x10, x10, x28\n\t" - "sbc x11, x11, x26\n\t" - "ldr x1, [x29, #40]\n\t" - /* Add */ - "adds x12, x8, x4\n\t" - "adcs x13, x9, x5\n\t" - "adcs x14, x10, x6\n\t" - "adc x15, x11, x7\n\t" + "ldp x12, x13, [x1]\n\t" + "ldp x14, x15, [x1, #16]\n\t" + "adds x12, x12, x12\n\t" + "adcs x13, x13, x13\n\t" + "adcs x14, x14, x14\n\t" + "adc x15, x15, x15\n\t" "mov x25, #-19\n\t" "asr x28, x15, #63\n\t" /* Mask the modulus */ @@ -5790,1444 +6760,1774 @@ "sbcs x13, x13, x28\n\t" "sbcs x14, x14, x28\n\t" "sbc x15, x15, x26\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + "sub x1, x0, #32\n\t" + /* Add */ + "adds x8, x12, x16\n\t" + "adcs x9, x13, x17\n\t" + "adcs x10, x14, x19\n\t" + "adcs x11, x15, x20\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x11, #63\n\t" + "mul x25, x28, x25\n\t" + /* Sub modulus (if overflow) */ + "adds x8, x8, x25\n\t" + "adcs x9, x9, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" /* Sub */ - "subs x16, x8, x4\n\t" - "sbcs x17, x9, x5\n\t" - "sbcs x19, x10, x6\n\t" - "sbcs x20, x11, x7\n\t" - "mov x25, #-19\n\t" + "subs x4, x12, x16\n\t" + "sbcs x5, x13, x17\n\t" + "sbcs x6, x14, x19\n\t" + "sbcs x7, x15, x20\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x7, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" - "stp x12, x13, [x1]\n\t" - "stp x14, x15, [x1, #16]\n\t" - "stp x16, x17, [x0]\n\t" - "stp x19, x20, [x0, #16]\n\t" - "ldp x29, x30, [sp], #0x70\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt), [px] "+r" (px), [py] "+r" (py), [pz] "+r" (pz), [pt] "+r" (pt), [qxy2d] "+r" (qxy2d), [qyplusx] "+r" (qyplusx), [qyminusx] "+r" (qyminusx) + "subs x4, x4, x25\n\t" + "sbcs x5, x5, xzr\n\t" + "and x7, x7, #0x7fffffffffffffff\n\t" + "sbcs x6, x6, xzr\n\t" + "sbc x7, x7, xzr\n\t" + "stp x8, x9, [x0]\n\t" + "stp x10, x11, [x0, #16]\n\t" + "stp x4, x5, [x1]\n\t" + "stp x6, x7, [x1, #16]\n\t" + "ldp x29, x30, [sp], #48\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) : - : "memory", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "cc" ); } -void fe_ge_add(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py, const fe pz, const fe pt, const fe qz, const fe qt2d, const fe qyplusx, const fe qyminusx) +void ge_add(ge_p1p1* r, const ge_p3* p, const ge_cached* q) { __asm__ __volatile__ ( - "stp x29, x30, [sp, #-128]!\n\t" + "stp x29, x30, [sp, #-48]!\n\t" "add x29, sp, #0\n\t" - "str %x[qyminusx], [sp, #120]\n\t" - "str %x[qyplusx], [sp, #112]\n\t" - "str %x[qt2d], [sp, #104]\n\t" - "str %x[qz], [sp, #96]\n\t" - "str %x[rx], [x29, #16]\n\t" - "str %x[ry], [x29, #24]\n\t" - "str %x[rz], [x29, #32]\n\t" - "str %x[rt], [x29, #40]\n\t" - "str %x[px], [x29, #48]\n\t" - "str %x[py], [x29, #56]\n\t" - "str %x[pz], [x29, #64]\n\t" - "str %x[pt], [x29, #72]\n\t" - "ldr x2, [x29, #56]\n\t" - "ldr x3, [x29, #48]\n\t" + "str %x[r], [x29, #16]\n\t" + "str %x[p], [x29, #24]\n\t" + "str %x[q], [x29, #32]\n\t" + "mov x3, x1\n\t" + "add x2, x1, #32\n\t" + "add x1, x0, #32\n\t" /* Add */ - "ldp x12, x13, [x2]\n\t" - "ldp x14, x15, [x2, #16]\n\t" - "ldp x16, x17, [x3]\n\t" - "ldp x19, x20, [x3, #16]\n\t" - "adds x4, x12, x16\n\t" - "adcs x5, x13, x17\n\t" - "adcs x6, x14, x19\n\t" - "adc x7, x15, x20\n\t" - "mov x25, #-19\n\t" - "asr x28, x7, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + "ldp x4, x5, [x3]\n\t" + "ldp x6, x7, [x3, #16]\n\t" + "adds x16, x8, x4\n\t" + "adcs x17, x9, x5\n\t" + "adcs x19, x10, x6\n\t" + "adcs x20, x11, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x20, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x4, x4, x25\n\t" - "sbcs x5, x5, x28\n\t" - "sbcs x6, x6, x28\n\t" - "sbc x7, x7, x26\n\t" + "adds x16, x16, x25\n\t" + "adcs x17, x17, xzr\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "adcs x19, x19, xzr\n\t" + "adc x20, x20, xzr\n\t" /* Sub */ - "subs x8, x12, x16\n\t" - "sbcs x9, x13, x17\n\t" - "sbcs x10, x14, x19\n\t" - "sbcs x11, x15, x20\n\t" - "mov x25, #-19\n\t" + "subs x12, x8, x4\n\t" + "sbcs x13, x9, x5\n\t" + "sbcs x14, x10, x6\n\t" + "sbcs x15, x11, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x8, x8, x25\n\t" - "adcs x9, x9, x28\n\t" - "adcs x10, x10, x28\n\t" - "adc x11, x11, x26\n\t" - "ldr x0, [x29, #32]\n\t" - "ldr x2, [sp, #112]\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" + "ldr x2, [x29, #32]\n\t" + "mov x1, x0\n\t" /* Multiply */ - "ldp x21, x22, [x2]\n\t" - "ldp x23, x24, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x12, x4, x21\n\t" - "umulh x13, x4, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x4, x22\n\t" - "umulh x14, x4, x22\n\t" - "adds x13, x13, x25\n\t" - "adc x14, x14, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x5, x21\n\t" - "umulh x26, x5, x21\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x4, x23\n\t" - "umulh x26, x4, x23\n\t" - "adds x14, x14, x25\n\t" - "adc x15, x15, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x5, x22\n\t" - "umulh x26, x5, x22\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x6, x21\n\t" - "umulh x26, x6, x21\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x4, x24\n\t" - "umulh x26, x4, x24\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x5, x23\n\t" - "umulh x26, x5, x23\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x6, x22\n\t" - "umulh x26, x6, x22\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x7, x21\n\t" - "umulh x26, x7, x21\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x5, x24\n\t" - "umulh x26, x5, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x6, x23\n\t" - "umulh x26, x6, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x7, x22\n\t" - "umulh x26, x7, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x6, x24\n\t" - "umulh x26, x6, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x7, x23\n\t" - "umulh x26, x7, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x7, x24\n\t" - "umulh x26, x7, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x22, x16, x8\n\t" + "mul x21, x16, x8\n\t" + /* A[2] * B[0] */ + "umulh x24, x19, x8\n\t" + "mul x23, x19, x8\n\t" + /* A[1] * B[0] */ + "mul x25, x17, x8\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x17, x8\n\t" + "adcs x23, x23, x26\n\t" + /* A[1] * B[3] */ + "umulh x5, x17, x11\n\t" + "adc x24, x24, xzr\n\t" + "mul x4, x17, x11\n\t" + /* A[0] * B[1] */ + "mul x25, x16, x9\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x16, x9\n\t" + "adcs x23, x23, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x19, x9\n\t" + "adcs x24, x24, x25\n\t" + "umulh x26, x19, x9\n\t" + "adcs x4, x4, x26\n\t" + "adc x5, x5, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x17, x10\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x17, x10\n\t" + "adcs x4, x4, x26\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x16, x10\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x16, x10\n\t" + "adcs x24, x24, x26\n\t" + "adcs x4, x4, xzr\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, x6, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x17, x9\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x17, x9\n\t" + "adcs x24, x24, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x20, x9\n\t" + "adcs x4, x4, x25\n\t" + "umulh x26, x20, x9\n\t" + "adcs x5, x5, x26\n\t" + "adc x6, x6, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x19, x10\n\t" + "adds x4, x4, x25\n\t" + "umulh x26, x19, x10\n\t" + "adcs x5, x5, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x20, x11\n\t" + "adcs x6, x6, x25\n\t" + "umulh x7, x20, x11\n\t" + "adc x7, x7, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x16, x11\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x16, x11\n\t" + "adcs x4, x4, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x19, x11\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x19, x11\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x20, x8\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x20, x8\n\t" + "adcs x4, x4, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x20, x10\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x20, x10\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x15, #63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x12, x12, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x13, x13, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x14, x14, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x15, x15, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x13, x13, x16\n\t" - "adcs x14, x14, x17\n\t" - "adcs x15, x15, x19\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x7\n\t" + "adds x24, x24, x26\n\t" + "umulh x27, x25, x7\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x15, #63\n\t" + "mov x25, #19\n\t" + "extr x27, x27, x24, #63\n\t" "mul x27, x27, x25\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x15, asr 63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x4\n\t" + "adds x21, x21, x26\n\t" + "umulh x4, x25, x4\n\t" + "mul x26, x25, x5\n\t" + "adcs x22, x22, x26\n\t" + "umulh x5, x25, x5\n\t" + "mul x26, x25, x6\n\t" + "adcs x23, x23, x26\n\t" + "umulh x6, x25, x6\n\t" + "adc x24, x24, xzr\n\t" + /* Add high product results in */ + "adds x21, x21, x27\n\t" + "adcs x22, x22, x4\n\t" + "adcs x23, x23, x5\n\t" + "adc x24, x24, x6\n\t" /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [sp, #120]\n\t" + "stp x21, x22, [x0]\n\t" + "stp x23, x24, [x0, #16]\n\t" + "add x2, x2, #32\n\t" + "add x1, x0, #32\n\t" + "add x0, x0, #32\n\t" /* Multiply */ - "ldp x21, x22, [x1]\n\t" - "ldp x23, x24, [x1, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x8, x21\n\t" - "umulh x5, x8, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x8, x22\n\t" - "umulh x6, x8, x22\n\t" + "ldp x16, x17, [x2]\n\t" + "ldp x19, x20, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x5, x12, x16\n\t" + "mul x4, x12, x16\n\t" + /* A[2] * B[0] */ + "umulh x7, x14, x16\n\t" + "mul x6, x14, x16\n\t" + /* A[1] * B[0] */ + "mul x25, x13, x16\n\t" "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x9, x21\n\t" - "umulh x26, x9, x21\n\t" + "umulh x26, x13, x16\n\t" + "adcs x6, x6, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x13, x20\n\t" + "adc x7, x7, xzr\n\t" + "mul x8, x13, x20\n\t" + /* A[0] * B[1] */ + "mul x25, x12, x17\n\t" "adds x5, x5, x25\n\t" + "umulh x26, x12, x17\n\t" "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x8, x23\n\t" - "umulh x26, x8, x23\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x9, x22\n\t" - "umulh x26, x9, x22\n\t" + /* A[2] * B[1] */ + "mul x25, x14, x17\n\t" + "adcs x7, x7, x25\n\t" + "umulh x26, x14, x17\n\t" + "adcs x8, x8, x26\n\t" + "adc x9, x9, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x13, x19\n\t" + "adds x7, x7, x25\n\t" + "umulh x26, x13, x19\n\t" + "adcs x8, x8, x26\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x12, x19\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x12, x19\n\t" "adcs x7, x7, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x10, x21\n\t" - "umulh x26, x10, x21\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x13, x17\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x13, x17\n\t" "adcs x7, x7, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x8, x24\n\t" - "umulh x26, x8, x24\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x9, x23\n\t" - "umulh x26, x9, x23\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x10, x22\n\t" - "umulh x26, x10, x22\n\t" + /* A[3] * B[1] */ + "mul x25, x15, x17\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x15, x17\n\t" + "adcs x9, x9, x26\n\t" + "adc x10, x10, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x14, x19\n\t" + "adds x8, x8, x25\n\t" + "umulh x26, x14, x19\n\t" + "adcs x9, x9, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x15, x20\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x15, x20\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x12, x20\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x11, x21\n\t" - "umulh x26, x11, x21\n\t" + "umulh x26, x12, x20\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x14, x20\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x14, x20\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x15, x16\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x9, x24\n\t" - "umulh x26, x9, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x10, x23\n\t" - "umulh x26, x10, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x11, x22\n\t" - "umulh x26, x11, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x10, x24\n\t" - "umulh x26, x10, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x11, x23\n\t" - "umulh x26, x11, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x11, x24\n\t" - "umulh x26, x11, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "umulh x26, x15, x16\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x15, x19\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x15, x19\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x4, x4, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x5, x5, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x16\n\t" - "adcs x6, x6, x17\n\t" - "adcs x7, x7, x19\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x7, x7, x26\n\t" + "umulh x27, x25, x11\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ + "mov x25, #19\n\t" "extr x27, x27, x7, #63\n\t" "mul x27, x27, x25\n\t" "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x8\n\t" + "adds x4, x4, x26\n\t" + "umulh x8, x25, x8\n\t" + "mul x26, x25, x9\n\t" + "adcs x5, x5, x26\n\t" + "umulh x9, x25, x9\n\t" + "mul x26, x25, x10\n\t" + "adcs x6, x6, x26\n\t" + "umulh x10, x25, x10\n\t" "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" + "adcs x5, x5, x8\n\t" + "adcs x6, x6, x9\n\t" + "adc x7, x7, x10\n\t" /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [x29, #16]\n\t" + "stp x4, x5, [x0]\n\t" + "stp x6, x7, [x0, #16]\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + "sub x1, x0, #32\n\t" /* Add */ - "adds x8, x12, x4\n\t" - "adcs x9, x13, x5\n\t" - "adcs x10, x14, x6\n\t" - "adc x11, x15, x7\n\t" - "mov x25, #-19\n\t" - "asr x28, x11, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "adds x8, x21, x4\n\t" + "adcs x9, x22, x5\n\t" + "adcs x10, x23, x6\n\t" + "adcs x11, x24, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x11, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x8, x8, x25\n\t" - "sbcs x9, x9, x28\n\t" - "sbcs x10, x10, x28\n\t" - "sbc x11, x11, x26\n\t" + "adds x8, x8, x25\n\t" + "adcs x9, x9, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" /* Sub */ - "subs x16, x12, x4\n\t" - "sbcs x17, x13, x5\n\t" - "sbcs x19, x14, x6\n\t" - "sbcs x20, x15, x7\n\t" - "mov x25, #-19\n\t" + "subs x12, x21, x4\n\t" + "sbcs x13, x22, x5\n\t" + "sbcs x14, x23, x6\n\t" + "sbcs x15, x24, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" "stp x8, x9, [x0]\n\t" "stp x10, x11, [x0, #16]\n\t" - "stp x16, x17, [x1]\n\t" - "stp x19, x20, [x1, #16]\n\t" - "ldr x0, [x29, #48]\n\t" - "ldr x1, [x29, #64]\n\t" - "ldr x2, [sp, #96]\n\t" + "stp x12, x13, [x1]\n\t" + "stp x14, x15, [x1, #16]\n\t" + "ldr x1, [x29, #24]\n\t" + "ldr x2, [x29, #32]\n\t" + "add x2, x2, #0x60\n\t" + "add x1, x1, #0x60\n\t" + "add x0, x0, #0x40\n\t" /* Multiply */ - "ldp x12, x13, [x1]\n\t" - "ldp x14, x15, [x1, #16]\n\t" - "ldp x16, x17, [x2]\n\t" - "ldp x19, x20, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x12, x16\n\t" - "umulh x5, x12, x16\n\t" - /* A[0] * B[1] */ - "mul x25, x12, x17\n\t" - "umulh x6, x12, x17\n\t" - "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x13, x16\n\t" - "umulh x26, x13, x16\n\t" - "adds x5, x5, x25\n\t" - "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x12, x19\n\t" - "umulh x26, x12, x19\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x13, x17\n\t" - "umulh x26, x13, x17\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x14, x16\n\t" - "umulh x26, x14, x16\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, x8, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x12, x20\n\t" - "umulh x26, x12, x20\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x13, x19\n\t" - "umulh x26, x13, x19\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x14, x17\n\t" - "umulh x26, x14, x17\n\t" - "adds x7, x7, x25\n\t" + "ldp x21, x22, [x1]\n\t" + "ldp x23, x24, [x1, #16]\n\t" + "ldp x4, x5, [x2]\n\t" + "ldp x6, x7, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x17, x21, x4\n\t" + "mul x16, x21, x4\n\t" + /* A[2] * B[0] */ + "umulh x20, x23, x4\n\t" + "mul x19, x23, x4\n\t" + /* A[1] * B[0] */ + "mul x25, x22, x4\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x22, x4\n\t" + "adcs x19, x19, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x22, x7\n\t" + "adc x20, x20, xzr\n\t" + "mul x8, x22, x7\n\t" + /* A[0] * B[1] */ + "mul x25, x21, x5\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x21, x5\n\t" + "adcs x19, x19, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x23, x5\n\t" + "adcs x20, x20, x25\n\t" + "umulh x26, x23, x5\n\t" "adcs x8, x8, x26\n\t" "adc x9, x9, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x15, x16\n\t" - "umulh x26, x15, x16\n\t" - "adds x7, x7, x25\n\t" + /* A[1] * B[2] */ + "mul x25, x22, x6\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x22, x6\n\t" "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x13, x20\n\t" - "umulh x26, x13, x20\n\t" - "adds x8, x8, x25\n\t" - "adcs x9, x9, x26\n\t" + "adcs x9, x9, xzr\n\t" "adc x10, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x14, x19\n\t" - "umulh x26, x14, x19\n\t" - "adds x8, x8, x25\n\t" + /* A[0] * B[2] */ + "mul x25, x21, x6\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x21, x6\n\t" + "adcs x20, x20, x26\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x22, x5\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x22, x5\n\t" + "adcs x20, x20, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x24, x5\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x24, x5\n\t" "adcs x9, x9, x26\n\t" "adc x10, x10, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x15, x17\n\t" - "umulh x26, x15, x17\n\t" + /* A[2] * B[2] */ + "mul x25, x23, x6\n\t" "adds x8, x8, x25\n\t" + "umulh x26, x23, x6\n\t" "adcs x9, x9, x26\n\t" - "adc x10, x10, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x14, x20\n\t" - "umulh x26, x14, x20\n\t" - "adds x9, x9, x25\n\t" + /* A[3] * B[3] */ + "mul x25, x24, x7\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x24, x7\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x21, x7\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x21, x7\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x23, x7\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x23, x7\n\t" "adcs x10, x10, x26\n\t" - "adc x11, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x15, x19\n\t" - "umulh x26, x15, x19\n\t" - "adds x9, x9, x25\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x24, x4\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x24, x4\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x24, x6\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x24, x6\n\t" "adcs x10, x10, x26\n\t" "adc x11, x11, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x15, x20\n\t" - "umulh x26, x15, x20\n\t" - "adds x10, x10, x25\n\t" - "adc x11, x11, x26\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x11, x11, x10, #63\n\t" - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x20, x20, x26\n\t" + "umulh x27, x25, x11\n\t" + "adc x27, x27, xzr\n\t" "mov x25, #19\n\t" + "extr x27, x27, x20, #63\n\t" + "mul x27, x27, x25\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" "mul x26, x25, x8\n\t" + "adds x16, x16, x26\n\t" "umulh x8, x25, x8\n\t" - "adds x4, x4, x26\n\t" "mul x26, x25, x9\n\t" + "adcs x17, x17, x26\n\t" "umulh x9, x25, x9\n\t" - "adcs x5, x5, x26\n\t" "mul x26, x25, x10\n\t" + "adcs x19, x19, x26\n\t" "umulh x10, x25, x10\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x11\n\t" - "umulh x27, x25, x11\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adcs x7, x7, x10\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x7, #63\n\t" - "mul x27, x27, x25\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" + "adc x20, x20, xzr\n\t" + /* Add high product results in */ + "adds x16, x16, x27\n\t" + "adcs x17, x17, x8\n\t" + "adcs x19, x19, x9\n\t" + "adc x20, x20, x10\n\t" /* Store */ - "ldr x0, [x29, #48]\n\t" - /* Double */ - "adds x4, x4, x4\n\t" - "adcs x5, x5, x5\n\t" - "adcs x6, x6, x6\n\t" - "adc x7, x7, x7\n\t" - "mov x25, #-19\n\t" - "asr x28, x7, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" - /* Sub modulus (if overflow) */ - "subs x4, x4, x25\n\t" - "sbcs x5, x5, x28\n\t" - "sbcs x6, x6, x28\n\t" - "sbc x7, x7, x26\n\t" - "ldr x0, [x29, #40]\n\t" - "ldr x1, [sp, #104]\n\t" - "ldr x2, [x29, #72]\n\t" + "stp x16, x17, [x0]\n\t" + "stp x19, x20, [x0, #16]\n\t" + "sub x3, x2, #32\n\t" + "sub x2, x1, #32\n\t" + "sub x1, x0, #32\n\t" /* Multiply */ - "ldp x16, x17, [x1]\n\t" - "ldp x19, x20, [x1, #16]\n\t" - "ldp x21, x22, [x2]\n\t" - "ldp x23, x24, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x8, x16, x21\n\t" - "umulh x9, x16, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x16, x22\n\t" - "umulh x10, x16, x22\n\t" + "ldp x4, x5, [x2]\n\t" + "ldp x6, x7, [x2, #16]\n\t" + "ldp x12, x13, [x3]\n\t" + "ldp x14, x15, [x3, #16]\n\t" + /* A[0] * B[0] */ + "umulh x9, x4, x12\n\t" + "mul x8, x4, x12\n\t" + /* A[2] * B[0] */ + "umulh x11, x6, x12\n\t" + "mul x10, x6, x12\n\t" + /* A[1] * B[0] */ + "mul x25, x5, x12\n\t" "adds x9, x9, x25\n\t" - "adc x10, x10, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x17, x21\n\t" - "umulh x26, x17, x21\n\t" + "umulh x26, x5, x12\n\t" + "adcs x10, x10, x26\n\t" + /* A[1] * B[3] */ + "umulh x17, x5, x15\n\t" + "adc x11, x11, xzr\n\t" + "mul x16, x5, x15\n\t" + /* A[0] * B[1] */ + "mul x25, x4, x13\n\t" "adds x9, x9, x25\n\t" + "umulh x26, x4, x13\n\t" "adcs x10, x10, x26\n\t" - "adc x11, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x16, x23\n\t" - "umulh x26, x16, x23\n\t" - "adds x10, x10, x25\n\t" - "adc x11, x11, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x17, x22\n\t" - "umulh x26, x17, x22\n\t" + /* A[2] * B[1] */ + "mul x25, x6, x13\n\t" + "adcs x11, x11, x25\n\t" + "umulh x26, x6, x13\n\t" + "adcs x16, x16, x26\n\t" + "adc x17, x17, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x5, x14\n\t" + "adds x11, x11, x25\n\t" + "umulh x26, x5, x14\n\t" + "adcs x16, x16, x26\n\t" + "adcs x17, x17, xzr\n\t" + "adc x19, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x4, x14\n\t" "adds x10, x10, x25\n\t" + "umulh x26, x4, x14\n\t" "adcs x11, x11, x26\n\t" - "adc x12, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x19, x21\n\t" - "umulh x26, x19, x21\n\t" + "adcs x16, x16, xzr\n\t" + "adcs x17, x17, xzr\n\t" + "adc x19, x19, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x5, x13\n\t" "adds x10, x10, x25\n\t" + "umulh x26, x5, x13\n\t" "adcs x11, x11, x26\n\t" - "adc x12, x12, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x16, x24\n\t" - "umulh x26, x16, x24\n\t" - "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x17, x23\n\t" - "umulh x26, x17, x23\n\t" - "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, x13, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x19, x22\n\t" - "umulh x26, x19, x22\n\t" + /* A[3] * B[1] */ + "mul x25, x7, x13\n\t" + "adcs x16, x16, x25\n\t" + "umulh x26, x7, x13\n\t" + "adcs x17, x17, x26\n\t" + "adc x19, x19, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x6, x14\n\t" + "adds x16, x16, x25\n\t" + "umulh x26, x6, x14\n\t" + "adcs x17, x17, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x7, x15\n\t" + "adcs x19, x19, x25\n\t" + "umulh x20, x7, x15\n\t" + "adc x20, x20, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x4, x15\n\t" "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, x13, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x20, x21\n\t" - "umulh x26, x20, x21\n\t" + "umulh x26, x4, x15\n\t" + "adcs x16, x16, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x6, x15\n\t" + "adcs x17, x17, x25\n\t" + "umulh x26, x6, x15\n\t" + "adcs x19, x19, x26\n\t" + "adc x20, x20, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x7, x12\n\t" "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, x13, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x17, x24\n\t" - "umulh x26, x17, x24\n\t" - "adds x12, x12, x25\n\t" - "adcs x13, x13, x26\n\t" - "adc x14, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x19, x23\n\t" - "umulh x26, x19, x23\n\t" - "adds x12, x12, x25\n\t" - "adcs x13, x13, x26\n\t" - "adc x14, x14, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x20, x22\n\t" - "umulh x26, x20, x22\n\t" - "adds x12, x12, x25\n\t" - "adcs x13, x13, x26\n\t" - "adc x14, x14, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x19, x24\n\t" - "umulh x26, x19, x24\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x20, x23\n\t" - "umulh x26, x20, x23\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, x15, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x20, x24\n\t" - "umulh x26, x20, x24\n\t" - "adds x14, x14, x25\n\t" - "adc x15, x15, x26\n\t" + "umulh x26, x7, x12\n\t" + "adcs x16, x16, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x7, x14\n\t" + "adcs x17, x17, x25\n\t" + "umulh x26, x7, x14\n\t" + "adcs x19, x19, x26\n\t" + "adc x20, x20, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x15, x15, x14, #63\n\t" - "extr x14, x14, x13, #63\n\t" - "extr x13, x13, x12, #63\n\t" - "extr x12, x12, x11, #63\n\t" - "and x11, x11, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x12\n\t" - "umulh x12, x25, x12\n\t" - "adds x8, x8, x26\n\t" - "mul x26, x25, x13\n\t" - "umulh x13, x25, x13\n\t" - "adcs x9, x9, x26\n\t" - "mul x26, x25, x14\n\t" - "umulh x14, x25, x14\n\t" - "adcs x10, x10, x26\n\t" - "mul x26, x25, x15\n\t" - "umulh x27, x25, x15\n\t" - "adcs x11, x11, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x9, x9, x12\n\t" - "adcs x10, x10, x13\n\t" - "adcs x11, x11, x14\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x20\n\t" + "adds x11, x11, x26\n\t" + "umulh x27, x25, x20\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ + "mov x25, #19\n\t" "extr x27, x27, x11, #63\n\t" "mul x27, x27, x25\n\t" "and x11, x11, #0x7fffffffffffffff\n\t" - "adds x8, x8, x27\n\t" - "adcs x9, x9, xzr\n\t" - "adcs x10, x10, xzr\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x16\n\t" + "adds x8, x8, x26\n\t" + "umulh x16, x25, x16\n\t" + "mul x26, x25, x17\n\t" + "adcs x9, x9, x26\n\t" + "umulh x17, x25, x17\n\t" + "mul x26, x25, x19\n\t" + "adcs x10, x10, x26\n\t" + "umulh x19, x25, x19\n\t" "adc x11, x11, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x11, asr 63\n\t" - "and x11, x11, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x8, x8, x27\n\t" - "adcs x9, x9, xzr\n\t" - "adcs x10, x10, xzr\n\t" - "adc x11, x11, xzr\n\t" - /* Store */ - "ldr x0, [x29, #32]\n\t" - "ldr x1, [x29, #40]\n\t" - /* Add */ - "adds x12, x4, x8\n\t" - "adcs x13, x5, x9\n\t" - "adcs x14, x6, x10\n\t" - "adc x15, x7, x11\n\t" + "adcs x9, x9, x16\n\t" + "adcs x10, x10, x17\n\t" + "adc x11, x11, x19\n\t" + /* Double */ + "adds x8, x8, x8\n\t" + "adcs x9, x9, x9\n\t" + "adcs x10, x10, x10\n\t" + "adc x11, x11, x11\n\t" "mov x25, #-19\n\t" - "asr x28, x15, #63\n\t" + "asr x28, x11, #63\n\t" /* Mask the modulus */ "and x25, x28, x25\n\t" "and x26, x28, #0x7fffffffffffffff\n\t" /* Sub modulus (if overflow) */ - "subs x12, x12, x25\n\t" - "sbcs x13, x13, x28\n\t" - "sbcs x14, x14, x28\n\t" - "sbc x15, x15, x26\n\t" + "subs x8, x8, x25\n\t" + "sbcs x9, x9, x28\n\t" + "sbcs x10, x10, x28\n\t" + "sbc x11, x11, x26\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + "mov x1, x0\n\t" + "sub x0, x0, #32\n\t" + /* Add */ + "ldp x4, x5, [x3]\n\t" + "ldp x6, x7, [x3, #16]\n\t" + "adds x21, x8, x4\n\t" + "adcs x22, x9, x5\n\t" + "adcs x23, x10, x6\n\t" + "adcs x24, x11, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x24, #63\n\t" + "mul x25, x28, x25\n\t" + /* Sub modulus (if overflow) */ + "adds x21, x21, x25\n\t" + "adcs x22, x22, xzr\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "adcs x23, x23, xzr\n\t" + "adc x24, x24, xzr\n\t" /* Sub */ - "subs x16, x4, x8\n\t" - "sbcs x17, x5, x9\n\t" - "sbcs x19, x6, x10\n\t" - "sbcs x20, x7, x11\n\t" - "mov x25, #-19\n\t" + "subs x12, x8, x4\n\t" + "sbcs x13, x9, x5\n\t" + "sbcs x14, x10, x6\n\t" + "sbcs x15, x11, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" - "stp x12, x13, [x0]\n\t" - "stp x14, x15, [x0, #16]\n\t" - "stp x16, x17, [x1]\n\t" - "stp x19, x20, [x1, #16]\n\t" - "ldp x29, x30, [sp], #0x80\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt), [px] "+r" (px), [py] "+r" (py), [pz] "+r" (pz), [pt] "+r" (pt), [qz] "+r" (qz), [qt2d] "+r" (qt2d), [qyplusx] "+r" (qyplusx), [qyminusx] "+r" (qyminusx) + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" + "stp x21, x22, [x0]\n\t" + "stp x23, x24, [x0, #16]\n\t" + "stp x12, x13, [x1]\n\t" + "stp x14, x15, [x1, #16]\n\t" + "ldp x29, x30, [sp], #48\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) : - : "memory", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "cc" ); } -void fe_ge_sub(fe rx, fe ry, fe rz, fe rt, const fe px, const fe py, const fe pz, const fe pt, const fe qz, const fe qt2d, const fe qyplusx, const fe qyminusx) +void ge_sub(ge_p1p1* r, const ge_p3* p, const ge_cached* q) { __asm__ __volatile__ ( - "stp x29, x30, [sp, #-128]!\n\t" + "stp x29, x30, [sp, #-48]!\n\t" "add x29, sp, #0\n\t" - "str %x[qyminusx], [sp, #120]\n\t" - "str %x[qyplusx], [sp, #112]\n\t" - "str %x[qt2d], [sp, #104]\n\t" - "str %x[qz], [sp, #96]\n\t" - "str %x[rx], [x29, #16]\n\t" - "str %x[ry], [x29, #24]\n\t" - "str %x[rz], [x29, #32]\n\t" - "str %x[rt], [x29, #40]\n\t" - "str %x[px], [x29, #48]\n\t" - "str %x[py], [x29, #56]\n\t" - "str %x[pz], [x29, #64]\n\t" - "str %x[pt], [x29, #72]\n\t" - "ldr x2, [x29, #56]\n\t" - "ldr x3, [x29, #48]\n\t" + "str %x[r], [x29, #16]\n\t" + "str %x[p], [x29, #24]\n\t" + "str %x[q], [x29, #32]\n\t" + "mov x3, x1\n\t" + "add x2, x1, #32\n\t" + "add x1, x0, #32\n\t" /* Add */ - "ldp x12, x13, [x2]\n\t" - "ldp x14, x15, [x2, #16]\n\t" - "ldp x16, x17, [x3]\n\t" - "ldp x19, x20, [x3, #16]\n\t" - "adds x4, x12, x16\n\t" - "adcs x5, x13, x17\n\t" - "adcs x6, x14, x19\n\t" - "adc x7, x15, x20\n\t" - "mov x25, #-19\n\t" - "asr x28, x7, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + "ldp x4, x5, [x3]\n\t" + "ldp x6, x7, [x3, #16]\n\t" + "adds x16, x8, x4\n\t" + "adcs x17, x9, x5\n\t" + "adcs x19, x10, x6\n\t" + "adcs x20, x11, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x20, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x4, x4, x25\n\t" - "sbcs x5, x5, x28\n\t" - "sbcs x6, x6, x28\n\t" - "sbc x7, x7, x26\n\t" + "adds x16, x16, x25\n\t" + "adcs x17, x17, xzr\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "adcs x19, x19, xzr\n\t" + "adc x20, x20, xzr\n\t" /* Sub */ - "subs x8, x12, x16\n\t" - "sbcs x9, x13, x17\n\t" - "sbcs x10, x14, x19\n\t" - "sbcs x11, x15, x20\n\t" - "mov x25, #-19\n\t" + "subs x12, x8, x4\n\t" + "sbcs x13, x9, x5\n\t" + "sbcs x14, x10, x6\n\t" + "sbcs x15, x11, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x8, x8, x25\n\t" - "adcs x9, x9, x28\n\t" - "adcs x10, x10, x28\n\t" - "adc x11, x11, x26\n\t" - "ldr x0, [x29, #32]\n\t" - "ldr x2, [sp, #120]\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" + "ldr x2, [x29, #32]\n\t" + "add x2, x2, #32\n\t" + "mov x1, x0\n\t" /* Multiply */ - "ldp x21, x22, [x2]\n\t" - "ldp x23, x24, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x12, x4, x21\n\t" - "umulh x13, x4, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x4, x22\n\t" - "umulh x14, x4, x22\n\t" - "adds x13, x13, x25\n\t" - "adc x14, x14, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x5, x21\n\t" - "umulh x26, x5, x21\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x4, x23\n\t" - "umulh x26, x4, x23\n\t" - "adds x14, x14, x25\n\t" - "adc x15, x15, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x5, x22\n\t" - "umulh x26, x5, x22\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x6, x21\n\t" - "umulh x26, x6, x21\n\t" - "adds x14, x14, x25\n\t" - "adcs x15, x15, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x4, x24\n\t" - "umulh x26, x4, x24\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x5, x23\n\t" - "umulh x26, x5, x23\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x6, x22\n\t" - "umulh x26, x6, x22\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x7, x21\n\t" - "umulh x26, x7, x21\n\t" - "adds x15, x15, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x5, x24\n\t" - "umulh x26, x5, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x6, x23\n\t" - "umulh x26, x6, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x7, x22\n\t" - "umulh x26, x7, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x6, x24\n\t" - "umulh x26, x6, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x7, x23\n\t" - "umulh x26, x7, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x7, x24\n\t" - "umulh x26, x7, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "ldp x8, x9, [x2]\n\t" + "ldp x10, x11, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x22, x16, x8\n\t" + "mul x21, x16, x8\n\t" + /* A[2] * B[0] */ + "umulh x24, x19, x8\n\t" + "mul x23, x19, x8\n\t" + /* A[1] * B[0] */ + "mul x25, x17, x8\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x17, x8\n\t" + "adcs x23, x23, x26\n\t" + /* A[1] * B[3] */ + "umulh x5, x17, x11\n\t" + "adc x24, x24, xzr\n\t" + "mul x4, x17, x11\n\t" + /* A[0] * B[1] */ + "mul x25, x16, x9\n\t" + "adds x22, x22, x25\n\t" + "umulh x26, x16, x9\n\t" + "adcs x23, x23, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x19, x9\n\t" + "adcs x24, x24, x25\n\t" + "umulh x26, x19, x9\n\t" + "adcs x4, x4, x26\n\t" + "adc x5, x5, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x17, x10\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x17, x10\n\t" + "adcs x4, x4, x26\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x16, x10\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x16, x10\n\t" + "adcs x24, x24, x26\n\t" + "adcs x4, x4, xzr\n\t" + "adcs x5, x5, xzr\n\t" + "adc x6, x6, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x17, x9\n\t" + "adds x23, x23, x25\n\t" + "umulh x26, x17, x9\n\t" + "adcs x24, x24, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x20, x9\n\t" + "adcs x4, x4, x25\n\t" + "umulh x26, x20, x9\n\t" + "adcs x5, x5, x26\n\t" + "adc x6, x6, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x19, x10\n\t" + "adds x4, x4, x25\n\t" + "umulh x26, x19, x10\n\t" + "adcs x5, x5, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x20, x11\n\t" + "adcs x6, x6, x25\n\t" + "umulh x7, x20, x11\n\t" + "adc x7, x7, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x16, x11\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x16, x11\n\t" + "adcs x4, x4, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x19, x11\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x19, x11\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x20, x8\n\t" + "adds x24, x24, x25\n\t" + "umulh x26, x20, x8\n\t" + "adcs x4, x4, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x20, x10\n\t" + "adcs x5, x5, x25\n\t" + "umulh x26, x20, x10\n\t" + "adcs x6, x6, x26\n\t" + "adc x7, x7, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x15, #63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x12, x12, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x13, x13, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x14, x14, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x15, x15, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x13, x13, x16\n\t" - "adcs x14, x14, x17\n\t" - "adcs x15, x15, x19\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x7\n\t" + "adds x24, x24, x26\n\t" + "umulh x27, x25, x7\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x15, #63\n\t" + "mov x25, #19\n\t" + "extr x27, x27, x24, #63\n\t" "mul x27, x27, x25\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x4\n\t" + "adds x21, x21, x26\n\t" + "umulh x4, x25, x4\n\t" + "mul x26, x25, x5\n\t" + "adcs x22, x22, x26\n\t" + "umulh x5, x25, x5\n\t" + "mul x26, x25, x6\n\t" + "adcs x23, x23, x26\n\t" + "umulh x6, x25, x6\n\t" + "adc x24, x24, xzr\n\t" + /* Add high product results in */ + "adds x21, x21, x27\n\t" + "adcs x22, x22, x4\n\t" + "adcs x23, x23, x5\n\t" + "adc x24, x24, x6\n\t" /* Reduce if top bit set */ - "and x27, x25, x15, asr 63\n\t" - "and x15, x15, #0x7fffffffffffffff\n\t" - "adds x12, x12, x27\n\t" - "adcs x13, x13, xzr\n\t" - "adcs x14, x14, xzr\n\t" - "adc x15, x15, xzr\n\t" + "mov x25, #19\n\t" + "and x26, x25, x24, asr 63\n\t" + "adds x21, x21, x26\n\t" + "adcs x22, x22, xzr\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "adcs x23, x23, xzr\n\t" + "adc x24, x24, xzr\n\t" /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [sp, #112]\n\t" + "stp x21, x22, [x0]\n\t" + "stp x23, x24, [x0, #16]\n\t" + "sub x2, x2, #32\n\t" + "add x1, x0, #32\n\t" + "add x0, x0, #32\n\t" /* Multiply */ - "ldp x21, x22, [x1]\n\t" - "ldp x23, x24, [x1, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x8, x21\n\t" - "umulh x5, x8, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x8, x22\n\t" - "umulh x6, x8, x22\n\t" + "ldp x16, x17, [x2]\n\t" + "ldp x19, x20, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x5, x12, x16\n\t" + "mul x4, x12, x16\n\t" + /* A[2] * B[0] */ + "umulh x7, x14, x16\n\t" + "mul x6, x14, x16\n\t" + /* A[1] * B[0] */ + "mul x25, x13, x16\n\t" "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x9, x21\n\t" - "umulh x26, x9, x21\n\t" + "umulh x26, x13, x16\n\t" + "adcs x6, x6, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x13, x20\n\t" + "adc x7, x7, xzr\n\t" + "mul x8, x13, x20\n\t" + /* A[0] * B[1] */ + "mul x25, x12, x17\n\t" "adds x5, x5, x25\n\t" + "umulh x26, x12, x17\n\t" "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x8, x23\n\t" - "umulh x26, x8, x23\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x9, x22\n\t" - "umulh x26, x9, x22\n\t" + /* A[2] * B[1] */ + "mul x25, x14, x17\n\t" + "adcs x7, x7, x25\n\t" + "umulh x26, x14, x17\n\t" + "adcs x8, x8, x26\n\t" + "adc x9, x9, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x13, x19\n\t" + "adds x7, x7, x25\n\t" + "umulh x26, x13, x19\n\t" + "adcs x8, x8, x26\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x12, x19\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x12, x19\n\t" "adcs x7, x7, x26\n\t" - "adc x16, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x10, x21\n\t" - "umulh x26, x10, x21\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x13, x17\n\t" "adds x6, x6, x25\n\t" + "umulh x26, x13, x17\n\t" "adcs x7, x7, x26\n\t" - "adc x16, x16, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x8, x24\n\t" - "umulh x26, x8, x24\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x9, x23\n\t" - "umulh x26, x9, x23\n\t" - "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x10, x22\n\t" - "umulh x26, x10, x22\n\t" + /* A[3] * B[1] */ + "mul x25, x15, x17\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x15, x17\n\t" + "adcs x9, x9, x26\n\t" + "adc x10, x10, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x14, x19\n\t" + "adds x8, x8, x25\n\t" + "umulh x26, x14, x19\n\t" + "adcs x9, x9, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x15, x20\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x15, x20\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x12, x20\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x11, x21\n\t" - "umulh x26, x11, x21\n\t" + "umulh x26, x12, x20\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x14, x20\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x14, x20\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x15, x16\n\t" "adds x7, x7, x25\n\t" - "adcs x16, x16, x26\n\t" - "adc x17, x17, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x9, x24\n\t" - "umulh x26, x9, x24\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x10, x23\n\t" - "umulh x26, x10, x23\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x11, x22\n\t" - "umulh x26, x11, x22\n\t" - "adds x16, x16, x25\n\t" - "adcs x17, x17, x26\n\t" - "adc x19, x19, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x10, x24\n\t" - "umulh x26, x10, x24\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x11, x23\n\t" - "umulh x26, x11, x23\n\t" - "adds x17, x17, x25\n\t" - "adcs x19, x19, x26\n\t" - "adc x20, x20, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x11, x24\n\t" - "umulh x26, x11, x24\n\t" - "adds x19, x19, x25\n\t" - "adc x20, x20, x26\n\t" + "umulh x26, x15, x16\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x15, x19\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x15, x19\n\t" + "adcs x10, x10, x26\n\t" + "adc x11, x11, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x20, x20, x19, #63\n\t" - "extr x19, x19, x17, #63\n\t" - "extr x17, x17, x16, #63\n\t" - "extr x16, x16, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x16\n\t" - "umulh x16, x25, x16\n\t" - "adds x4, x4, x26\n\t" - "mul x26, x25, x17\n\t" - "umulh x17, x25, x17\n\t" - "adcs x5, x5, x26\n\t" - "mul x26, x25, x19\n\t" - "umulh x19, x25, x19\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x20\n\t" - "umulh x27, x25, x20\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x16\n\t" - "adcs x6, x6, x17\n\t" - "adcs x7, x7, x19\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x7, x7, x26\n\t" + "umulh x27, x25, x11\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ + "mov x25, #19\n\t" "extr x27, x27, x7, #63\n\t" "mul x27, x27, x25\n\t" "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x8\n\t" + "adds x4, x4, x26\n\t" + "umulh x8, x25, x8\n\t" + "mul x26, x25, x9\n\t" + "adcs x5, x5, x26\n\t" + "umulh x9, x25, x9\n\t" + "mul x26, x25, x10\n\t" + "adcs x6, x6, x26\n\t" + "umulh x10, x25, x10\n\t" "adc x7, x7, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" + "adcs x5, x5, x8\n\t" + "adcs x6, x6, x9\n\t" + "adc x7, x7, x10\n\t" /* Store */ - "ldr x0, [x29, #24]\n\t" - "ldr x1, [x29, #16]\n\t" + "stp x4, x5, [x0]\n\t" + "stp x6, x7, [x0, #16]\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + "sub x1, x0, #32\n\t" /* Add */ - "adds x8, x12, x4\n\t" - "adcs x9, x13, x5\n\t" - "adcs x10, x14, x6\n\t" - "adc x11, x15, x7\n\t" - "mov x25, #-19\n\t" - "asr x28, x11, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "adds x8, x21, x4\n\t" + "adcs x9, x22, x5\n\t" + "adcs x10, x23, x6\n\t" + "adcs x11, x24, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x11, #63\n\t" + "mul x25, x28, x25\n\t" /* Sub modulus (if overflow) */ - "subs x8, x8, x25\n\t" - "sbcs x9, x9, x28\n\t" - "sbcs x10, x10, x28\n\t" - "sbc x11, x11, x26\n\t" + "adds x8, x8, x25\n\t" + "adcs x9, x9, xzr\n\t" + "and x11, x11, #0x7fffffffffffffff\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" /* Sub */ - "subs x16, x12, x4\n\t" - "sbcs x17, x13, x5\n\t" - "sbcs x19, x14, x6\n\t" - "sbcs x20, x15, x7\n\t" - "mov x25, #-19\n\t" + "subs x12, x21, x4\n\t" + "sbcs x13, x22, x5\n\t" + "sbcs x14, x23, x6\n\t" + "sbcs x15, x24, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" + "subs x12, x12, x25\n\t" + "sbcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "sbcs x14, x14, xzr\n\t" + "sbc x15, x15, xzr\n\t" "stp x8, x9, [x0]\n\t" "stp x10, x11, [x0, #16]\n\t" - "stp x16, x17, [x1]\n\t" - "stp x19, x20, [x1, #16]\n\t" - "ldr x0, [x29, #48]\n\t" - "ldr x1, [x29, #64]\n\t" - "ldr x2, [sp, #96]\n\t" + "stp x12, x13, [x1]\n\t" + "stp x14, x15, [x1, #16]\n\t" + "ldr x1, [x29, #24]\n\t" + "ldr x2, [x29, #32]\n\t" + "add x2, x2, #0x60\n\t" + "add x1, x1, #0x60\n\t" + "add x0, x0, #0x40\n\t" /* Multiply */ - "ldp x12, x13, [x1]\n\t" - "ldp x14, x15, [x1, #16]\n\t" - "ldp x16, x17, [x2]\n\t" - "ldp x19, x20, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x4, x12, x16\n\t" - "umulh x5, x12, x16\n\t" - /* A[0] * B[1] */ - "mul x25, x12, x17\n\t" - "umulh x6, x12, x17\n\t" - "adds x5, x5, x25\n\t" - "adc x6, x6, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x13, x16\n\t" - "umulh x26, x13, x16\n\t" - "adds x5, x5, x25\n\t" - "adcs x6, x6, x26\n\t" - "adc x7, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x12, x19\n\t" - "umulh x26, x12, x19\n\t" - "adds x6, x6, x25\n\t" - "adc x7, x7, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x13, x17\n\t" - "umulh x26, x13, x17\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x14, x16\n\t" - "umulh x26, x14, x16\n\t" - "adds x6, x6, x25\n\t" - "adcs x7, x7, x26\n\t" - "adc x8, x8, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x12, x20\n\t" - "umulh x26, x12, x20\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x13, x19\n\t" - "umulh x26, x13, x19\n\t" - "adds x7, x7, x25\n\t" - "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x14, x17\n\t" - "umulh x26, x14, x17\n\t" - "adds x7, x7, x25\n\t" + "ldp x21, x22, [x1]\n\t" + "ldp x23, x24, [x1, #16]\n\t" + "ldp x4, x5, [x2]\n\t" + "ldp x6, x7, [x2, #16]\n\t" + /* A[0] * B[0] */ + "umulh x17, x21, x4\n\t" + "mul x16, x21, x4\n\t" + /* A[2] * B[0] */ + "umulh x20, x23, x4\n\t" + "mul x19, x23, x4\n\t" + /* A[1] * B[0] */ + "mul x25, x22, x4\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x22, x4\n\t" + "adcs x19, x19, x26\n\t" + /* A[1] * B[3] */ + "umulh x9, x22, x7\n\t" + "adc x20, x20, xzr\n\t" + "mul x8, x22, x7\n\t" + /* A[0] * B[1] */ + "mul x25, x21, x5\n\t" + "adds x17, x17, x25\n\t" + "umulh x26, x21, x5\n\t" + "adcs x19, x19, x26\n\t" + /* A[2] * B[1] */ + "mul x25, x23, x5\n\t" + "adcs x20, x20, x25\n\t" + "umulh x26, x23, x5\n\t" "adcs x8, x8, x26\n\t" "adc x9, x9, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x15, x16\n\t" - "umulh x26, x15, x16\n\t" - "adds x7, x7, x25\n\t" + /* A[1] * B[2] */ + "mul x25, x22, x6\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x22, x6\n\t" "adcs x8, x8, x26\n\t" - "adc x9, x9, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x13, x20\n\t" - "umulh x26, x13, x20\n\t" - "adds x8, x8, x25\n\t" - "adcs x9, x9, x26\n\t" + "adcs x9, x9, xzr\n\t" "adc x10, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x14, x19\n\t" - "umulh x26, x14, x19\n\t" - "adds x8, x8, x25\n\t" + /* A[0] * B[2] */ + "mul x25, x21, x6\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x21, x6\n\t" + "adcs x20, x20, x26\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x22, x5\n\t" + "adds x19, x19, x25\n\t" + "umulh x26, x22, x5\n\t" + "adcs x20, x20, x26\n\t" + /* A[3] * B[1] */ + "mul x25, x24, x5\n\t" + "adcs x8, x8, x25\n\t" + "umulh x26, x24, x5\n\t" "adcs x9, x9, x26\n\t" "adc x10, x10, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x15, x17\n\t" - "umulh x26, x15, x17\n\t" + /* A[2] * B[2] */ + "mul x25, x23, x6\n\t" "adds x8, x8, x25\n\t" + "umulh x26, x23, x6\n\t" "adcs x9, x9, x26\n\t" - "adc x10, x10, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x14, x20\n\t" - "umulh x26, x14, x20\n\t" - "adds x9, x9, x25\n\t" + /* A[3] * B[3] */ + "mul x25, x24, x7\n\t" + "adcs x10, x10, x25\n\t" + "umulh x11, x24, x7\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x21, x7\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x21, x7\n\t" + "adcs x8, x8, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x23, x7\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x23, x7\n\t" "adcs x10, x10, x26\n\t" - "adc x11, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x15, x19\n\t" - "umulh x26, x15, x19\n\t" - "adds x9, x9, x25\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x24, x4\n\t" + "adds x20, x20, x25\n\t" + "umulh x26, x24, x4\n\t" + "adcs x8, x8, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x24, x6\n\t" + "adcs x9, x9, x25\n\t" + "umulh x26, x24, x6\n\t" "adcs x10, x10, x26\n\t" "adc x11, x11, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x15, x20\n\t" - "umulh x26, x15, x20\n\t" - "adds x10, x10, x25\n\t" - "adc x11, x11, x26\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x11, x11, x10, #63\n\t" - "extr x10, x10, x9, #63\n\t" - "extr x9, x9, x8, #63\n\t" - "extr x8, x8, x7, #63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ + "mov x25, #38\n\t" + "mul x26, x25, x11\n\t" + "adds x20, x20, x26\n\t" + "umulh x27, x25, x11\n\t" + "adc x27, x27, xzr\n\t" "mov x25, #19\n\t" + "extr x27, x27, x20, #63\n\t" + "mul x27, x27, x25\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "mov x25, #38\n\t" "mul x26, x25, x8\n\t" + "adds x16, x16, x26\n\t" "umulh x8, x25, x8\n\t" - "adds x4, x4, x26\n\t" "mul x26, x25, x9\n\t" + "adcs x17, x17, x26\n\t" "umulh x9, x25, x9\n\t" - "adcs x5, x5, x26\n\t" "mul x26, x25, x10\n\t" + "adcs x19, x19, x26\n\t" "umulh x10, x25, x10\n\t" - "adcs x6, x6, x26\n\t" - "mul x26, x25, x11\n\t" - "umulh x27, x25, x11\n\t" - "adcs x7, x7, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x5, x5, x8\n\t" - "adcs x6, x6, x9\n\t" - "adcs x7, x7, x10\n\t" - "adc x27, x27, xzr\n\t" - /* Overflow */ - "extr x27, x27, x7, #63\n\t" - "mul x27, x27, x25\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" + "adc x20, x20, xzr\n\t" + /* Add high product results in */ + "adds x16, x16, x27\n\t" + "adcs x17, x17, x8\n\t" + "adcs x19, x19, x9\n\t" + "adc x20, x20, x10\n\t" /* Reduce if top bit set */ - "and x27, x25, x7, asr 63\n\t" - "and x7, x7, #0x7fffffffffffffff\n\t" - "adds x4, x4, x27\n\t" - "adcs x5, x5, xzr\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, xzr\n\t" + "mov x25, #19\n\t" + "and x26, x25, x20, asr 63\n\t" + "adds x16, x16, x26\n\t" + "adcs x17, x17, xzr\n\t" + "and x20, x20, #0x7fffffffffffffff\n\t" + "adcs x19, x19, xzr\n\t" + "adc x20, x20, xzr\n\t" /* Store */ - "ldr x0, [x29, #48]\n\t" - /* Double */ - "adds x4, x4, x4\n\t" - "adcs x5, x5, x5\n\t" - "adcs x6, x6, x6\n\t" - "adc x7, x7, x7\n\t" - "mov x25, #-19\n\t" - "asr x28, x7, #63\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" - /* Sub modulus (if overflow) */ - "subs x4, x4, x25\n\t" - "sbcs x5, x5, x28\n\t" - "sbcs x6, x6, x28\n\t" - "sbc x7, x7, x26\n\t" - "ldr x0, [x29, #40]\n\t" - "ldr x1, [sp, #104]\n\t" - "ldr x2, [x29, #72]\n\t" + "stp x16, x17, [x0]\n\t" + "stp x19, x20, [x0, #16]\n\t" + "sub x3, x2, #32\n\t" + "sub x2, x1, #32\n\t" + "sub x1, x0, #32\n\t" /* Multiply */ - "ldp x16, x17, [x1]\n\t" - "ldp x19, x20, [x1, #16]\n\t" - "ldp x21, x22, [x2]\n\t" - "ldp x23, x24, [x2, #16]\n\t" - /* A[0] * B[0] */ - "mul x8, x16, x21\n\t" - "umulh x9, x16, x21\n\t" - /* A[0] * B[1] */ - "mul x25, x16, x22\n\t" - "umulh x10, x16, x22\n\t" + "ldp x4, x5, [x2]\n\t" + "ldp x6, x7, [x2, #16]\n\t" + "ldp x12, x13, [x3]\n\t" + "ldp x14, x15, [x3, #16]\n\t" + /* A[0] * B[0] */ + "umulh x9, x4, x12\n\t" + "mul x8, x4, x12\n\t" + /* A[2] * B[0] */ + "umulh x11, x6, x12\n\t" + "mul x10, x6, x12\n\t" + /* A[1] * B[0] */ + "mul x25, x5, x12\n\t" "adds x9, x9, x25\n\t" - "adc x10, x10, xzr\n\t" - /* A[1] * B[0] */ - "mul x25, x17, x21\n\t" - "umulh x26, x17, x21\n\t" + "umulh x26, x5, x12\n\t" + "adcs x10, x10, x26\n\t" + /* A[1] * B[3] */ + "umulh x17, x5, x15\n\t" + "adc x11, x11, xzr\n\t" + "mul x16, x5, x15\n\t" + /* A[0] * B[1] */ + "mul x25, x4, x13\n\t" "adds x9, x9, x25\n\t" + "umulh x26, x4, x13\n\t" "adcs x10, x10, x26\n\t" - "adc x11, xzr, xzr\n\t" - /* A[0] * B[2] */ - "mul x25, x16, x23\n\t" - "umulh x26, x16, x23\n\t" - "adds x10, x10, x25\n\t" - "adc x11, x11, x26\n\t" - /* A[1] * B[1] */ - "mul x25, x17, x22\n\t" - "umulh x26, x17, x22\n\t" + /* A[2] * B[1] */ + "mul x25, x6, x13\n\t" + "adcs x11, x11, x25\n\t" + "umulh x26, x6, x13\n\t" + "adcs x16, x16, x26\n\t" + "adc x17, x17, xzr\n\t" + /* A[1] * B[2] */ + "mul x25, x5, x14\n\t" + "adds x11, x11, x25\n\t" + "umulh x26, x5, x14\n\t" + "adcs x16, x16, x26\n\t" + "adcs x17, x17, xzr\n\t" + "adc x19, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x25, x4, x14\n\t" "adds x10, x10, x25\n\t" + "umulh x26, x4, x14\n\t" "adcs x11, x11, x26\n\t" - "adc x12, xzr, xzr\n\t" - /* A[2] * B[0] */ - "mul x25, x19, x21\n\t" - "umulh x26, x19, x21\n\t" + "adcs x16, x16, xzr\n\t" + "adcs x17, x17, xzr\n\t" + "adc x19, x19, xzr\n\t" + /* A[1] * B[1] */ + "mul x25, x5, x13\n\t" "adds x10, x10, x25\n\t" + "umulh x26, x5, x13\n\t" "adcs x11, x11, x26\n\t" - "adc x12, x12, xzr\n\t" - /* A[0] * B[3] */ - "mul x25, x16, x24\n\t" - "umulh x26, x16, x24\n\t" - "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, xzr, xzr\n\t" - /* A[1] * B[2] */ - "mul x25, x17, x23\n\t" - "umulh x26, x17, x23\n\t" - "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, x13, xzr\n\t" - /* A[2] * B[1] */ - "mul x25, x19, x22\n\t" - "umulh x26, x19, x22\n\t" + /* A[3] * B[1] */ + "mul x25, x7, x13\n\t" + "adcs x16, x16, x25\n\t" + "umulh x26, x7, x13\n\t" + "adcs x17, x17, x26\n\t" + "adc x19, x19, xzr\n\t" + /* A[2] * B[2] */ + "mul x25, x6, x14\n\t" + "adds x16, x16, x25\n\t" + "umulh x26, x6, x14\n\t" + "adcs x17, x17, x26\n\t" + /* A[3] * B[3] */ + "mul x25, x7, x15\n\t" + "adcs x19, x19, x25\n\t" + "umulh x20, x7, x15\n\t" + "adc x20, x20, xzr\n\t" + /* A[0] * B[3] */ + "mul x25, x4, x15\n\t" "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, x13, xzr\n\t" - /* A[3] * B[0] */ - "mul x25, x20, x21\n\t" - "umulh x26, x20, x21\n\t" + "umulh x26, x4, x15\n\t" + "adcs x16, x16, x26\n\t" + /* A[2] * B[3] */ + "mul x25, x6, x15\n\t" + "adcs x17, x17, x25\n\t" + "umulh x26, x6, x15\n\t" + "adcs x19, x19, x26\n\t" + "adc x20, x20, xzr\n\t" + /* A[3] * B[0] */ + "mul x25, x7, x12\n\t" "adds x11, x11, x25\n\t" - "adcs x12, x12, x26\n\t" - "adc x13, x13, xzr\n\t" - /* A[1] * B[3] */ - "mul x25, x17, x24\n\t" - "umulh x26, x17, x24\n\t" - "adds x12, x12, x25\n\t" - "adcs x13, x13, x26\n\t" - "adc x14, xzr, xzr\n\t" - /* A[2] * B[2] */ - "mul x25, x19, x23\n\t" - "umulh x26, x19, x23\n\t" - "adds x12, x12, x25\n\t" - "adcs x13, x13, x26\n\t" - "adc x14, x14, xzr\n\t" - /* A[3] * B[1] */ - "mul x25, x20, x22\n\t" - "umulh x26, x20, x22\n\t" - "adds x12, x12, x25\n\t" - "adcs x13, x13, x26\n\t" - "adc x14, x14, xzr\n\t" - /* A[2] * B[3] */ - "mul x25, x19, x24\n\t" - "umulh x26, x19, x24\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, xzr, xzr\n\t" - /* A[3] * B[2] */ - "mul x25, x20, x23\n\t" - "umulh x26, x20, x23\n\t" - "adds x13, x13, x25\n\t" - "adcs x14, x14, x26\n\t" - "adc x15, x15, xzr\n\t" - /* A[3] * B[3] */ - "mul x25, x20, x24\n\t" - "umulh x26, x20, x24\n\t" - "adds x14, x14, x25\n\t" - "adc x15, x15, x26\n\t" + "umulh x26, x7, x12\n\t" + "adcs x16, x16, x26\n\t" + /* A[3] * B[2] */ + "mul x25, x7, x14\n\t" + "adcs x17, x17, x25\n\t" + "umulh x26, x7, x14\n\t" + "adcs x19, x19, x26\n\t" + "adc x20, x20, xzr\n\t" /* Reduce */ - /* Move top half into t4-t7 and remove top bit from t3 */ - "extr x15, x15, x14, #63\n\t" - "extr x14, x14, x13, #63\n\t" - "extr x13, x13, x12, #63\n\t" - "extr x12, x12, x11, #63\n\t" - "and x11, x11, #0x7fffffffffffffff\n\t" - /* Multiply top half by 19 */ - "mov x25, #19\n\t" - "mul x26, x25, x12\n\t" - "umulh x12, x25, x12\n\t" - "adds x8, x8, x26\n\t" - "mul x26, x25, x13\n\t" - "umulh x13, x25, x13\n\t" - "adcs x9, x9, x26\n\t" - "mul x26, x25, x14\n\t" - "umulh x14, x25, x14\n\t" - "adcs x10, x10, x26\n\t" - "mul x26, x25, x15\n\t" - "umulh x27, x25, x15\n\t" - "adcs x11, x11, x26\n\t" - "adc x27, x27, xzr\n\t" - /* Add remaining product results in */ - "adds x9, x9, x12\n\t" - "adcs x10, x10, x13\n\t" - "adcs x11, x11, x14\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x20\n\t" + "adds x11, x11, x26\n\t" + "umulh x27, x25, x20\n\t" "adc x27, x27, xzr\n\t" - /* Overflow */ + "mov x25, #19\n\t" "extr x27, x27, x11, #63\n\t" "mul x27, x27, x25\n\t" "and x11, x11, #0x7fffffffffffffff\n\t" - "adds x8, x8, x27\n\t" - "adcs x9, x9, xzr\n\t" - "adcs x10, x10, xzr\n\t" + "mov x25, #38\n\t" + "mul x26, x25, x16\n\t" + "adds x8, x8, x26\n\t" + "umulh x16, x25, x16\n\t" + "mul x26, x25, x17\n\t" + "adcs x9, x9, x26\n\t" + "umulh x17, x25, x17\n\t" + "mul x26, x25, x19\n\t" + "adcs x10, x10, x26\n\t" + "umulh x19, x25, x19\n\t" "adc x11, x11, xzr\n\t" - /* Reduce if top bit set */ - "and x27, x25, x11, asr 63\n\t" - "and x11, x11, #0x7fffffffffffffff\n\t" + /* Add high product results in */ "adds x8, x8, x27\n\t" - "adcs x9, x9, xzr\n\t" - "adcs x10, x10, xzr\n\t" - "adc x11, x11, xzr\n\t" - /* Store */ - "ldr x0, [x29, #40]\n\t" - "ldr x1, [x29, #32]\n\t" - /* Add */ - "adds x12, x4, x8\n\t" - "adcs x13, x5, x9\n\t" - "adcs x14, x6, x10\n\t" - "adc x15, x7, x11\n\t" + "adcs x9, x9, x16\n\t" + "adcs x10, x10, x17\n\t" + "adc x11, x11, x19\n\t" + /* Double */ + "adds x8, x8, x8\n\t" + "adcs x9, x9, x9\n\t" + "adcs x10, x10, x10\n\t" + "adc x11, x11, x11\n\t" "mov x25, #-19\n\t" - "asr x28, x15, #63\n\t" + "asr x28, x11, #63\n\t" /* Mask the modulus */ "and x25, x28, x25\n\t" "and x26, x28, #0x7fffffffffffffff\n\t" /* Sub modulus (if overflow) */ - "subs x12, x12, x25\n\t" - "sbcs x13, x13, x28\n\t" - "sbcs x14, x14, x28\n\t" - "sbc x15, x15, x26\n\t" + "subs x8, x8, x25\n\t" + "sbcs x9, x9, x28\n\t" + "sbcs x10, x10, x28\n\t" + "sbc x11, x11, x26\n\t" + "mov x3, x0\n\t" + "sub x2, x0, #32\n\t" + /* Add */ + "ldp x4, x5, [x3]\n\t" + "ldp x6, x7, [x3, #16]\n\t" + "adds x12, x8, x4\n\t" + "adcs x13, x9, x5\n\t" + "adcs x14, x10, x6\n\t" + "adcs x15, x11, x7\n\t" + "cset x28, cs\n\t" + "mov x25, #19\n\t" + "extr x28, x28, x15, #63\n\t" + "mul x25, x28, x25\n\t" + /* Sub modulus (if overflow) */ + "adds x12, x12, x25\n\t" + "adcs x13, x13, xzr\n\t" + "and x15, x15, #0x7fffffffffffffff\n\t" + "adcs x14, x14, xzr\n\t" + "adc x15, x15, xzr\n\t" /* Sub */ - "subs x16, x4, x8\n\t" - "sbcs x17, x5, x9\n\t" - "sbcs x19, x6, x10\n\t" - "sbcs x20, x7, x11\n\t" - "mov x25, #-19\n\t" + "subs x21, x8, x4\n\t" + "sbcs x22, x9, x5\n\t" + "sbcs x23, x10, x6\n\t" + "sbcs x24, x11, x7\n\t" "csetm x28, cc\n\t" - /* Mask the modulus */ - "and x25, x28, x25\n\t" - "and x26, x28, #0x7fffffffffffffff\n\t" + "mov x25, #-19\n\t" + "extr x28, x28, x24, #63\n\t" + "mul x25, x28, x25\n\t" /* Add modulus (if underflow) */ - "adds x16, x16, x25\n\t" - "adcs x17, x17, x28\n\t" - "adcs x19, x19, x28\n\t" - "adc x20, x20, x26\n\t" + "subs x21, x21, x25\n\t" + "sbcs x22, x22, xzr\n\t" + "and x24, x24, #0x7fffffffffffffff\n\t" + "sbcs x23, x23, xzr\n\t" + "sbc x24, x24, xzr\n\t" "stp x12, x13, [x0]\n\t" "stp x14, x15, [x0, #16]\n\t" - "stp x16, x17, [x1]\n\t" - "stp x19, x20, [x1, #16]\n\t" - "ldp x29, x30, [sp], #0x80\n\t" - : [rx] "+r" (rx), [ry] "+r" (ry), [rz] "+r" (rz), [rt] "+r" (rt), [px] "+r" (px), [py] "+r" (py), [pz] "+r" (pz), [pt] "+r" (pt), [qz] "+r" (qz), [qt2d] "+r" (qt2d), [qyplusx] "+r" (qyplusx), [qyminusx] "+r" (qyminusx) + "stp x21, x22, [x1]\n\t" + "stp x23, x24, [x1, #16]\n\t" + "ldp x29, x30, [sp], #48\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", "cc" + ); +} + +void sc_reduce(byte* s) +{ + __asm__ __volatile__ ( + "ldp x2, x3, [%x[s]]\n\t" + "ldp x4, x5, [%x[s], #16]\n\t" + "ldp x6, x7, [%x[s], #32]\n\t" + "ldp x8, x9, [%x[s], #48]\n\t" + "lsr x23, x9, #56\n\t" + "lsl x9, x9, #4\n\t" + "orr x9, x9, x8, lsr 60\n\t" + "lsl x8, x8, #4\n\t" + "orr x8, x8, x7, lsr 60\n\t" + "lsl x7, x7, #4\n\t" + "orr x7, x7, x6, lsr 60\n\t" + "lsl x6, x6, #4\n\t" + "mov x1, #15\n\t" + "orr x6, x6, x5, lsr 60\n\t" + "bic x5, x5, x1, lsl 60\n\t" + "bic x9, x9, x1, lsl 60\n\t" + /* Add order times bits 504..511 */ + "mov x11, #0x2c13\n\t" + "movk x11, #0xa30a, lsl 16\n\t" + "movk x11, #0x9ce5, lsl 32\n\t" + "movk x11, #0xa7ed, lsl 48\n\t" + "mov x13, #0x6329\n\t" + "movk x13, #0x5d08, lsl 16\n\t" + "movk x13, #0x621, lsl 32\n\t" + "movk x13, #0xeb21, lsl 48\n\t" + "mul x10, x23, x11\n\t" + "umulh x11, x23, x11\n\t" + "mul x12, x23, x13\n\t" + "umulh x13, x23, x13\n\t" + "adds x6, x6, x10\n\t" + "adcs x7, x7, x11\n\t" + "adcs x8, x8, xzr\n\t" + "adc x9, x9, xzr\n\t" + "adds x7, x7, x12\n\t" + "adcs x8, x8, x13\n\t" + "adc x9, x9, xzr\n\t" + "subs x8, x8, x23\n\t" + "sbc x9, x9, xzr\n\t" + /* Sub product of top 4 words and order */ + "mov x1, #0x2c13\n\t" + "movk x1, #0xa30a, lsl 16\n\t" + "movk x1, #0x9ce5, lsl 32\n\t" + "movk x1, #0xa7ed, lsl 48\n\t" + "mul x10, x6, x1\n\t" + "umulh x11, x6, x1\n\t" + "mul x12, x7, x1\n\t" + "umulh x13, x7, x1\n\t" + "mul x14, x8, x1\n\t" + "umulh x15, x8, x1\n\t" + "mul x16, x9, x1\n\t" + "umulh x17, x9, x1\n\t" + "adds x2, x2, x10\n\t" + "adcs x3, x3, x11\n\t" + "adcs x4, x4, x14\n\t" + "adcs x5, x5, x15\n\t" + "adc x19, xzr, xzr\n\t" + "adds x3, x3, x12\n\t" + "adcs x4, x4, x13\n\t" + "adcs x5, x5, x16\n\t" + "adc x19, x19, x17\n\t" + "mov x1, #0x6329\n\t" + "movk x1, #0x5d08, lsl 16\n\t" + "movk x1, #0x621, lsl 32\n\t" + "movk x1, #0xeb21, lsl 48\n\t" + "mul x10, x6, x1\n\t" + "umulh x11, x6, x1\n\t" + "mul x12, x7, x1\n\t" + "umulh x13, x7, x1\n\t" + "mul x14, x8, x1\n\t" + "umulh x15, x8, x1\n\t" + "mul x16, x9, x1\n\t" + "umulh x17, x9, x1\n\t" + "adds x3, x3, x10\n\t" + "adcs x4, x4, x11\n\t" + "adcs x5, x5, x14\n\t" + "adcs x19, x19, x15\n\t" + "adc x20, xzr, xzr\n\t" + "adds x4, x4, x12\n\t" + "adcs x5, x5, x13\n\t" + "adcs x19, x19, x16\n\t" + "adc x20, x20, x17\n\t" + "subs x4, x4, x6\n\t" + "sbcs x5, x5, x7\n\t" + "sbcs x6, x19, x8\n\t" + "sbc x7, x20, x9\n\t" + "asr x23, x7, #57\n\t" + /* Conditionally subtract order starting at bit 125 */ + "mov x10, xzr\n\t" + "mov x13, xzr\n\t" + "mov x11, #0xba7d\n\t" + "movk x11, #0x4b9e, lsl 16\n\t" + "movk x11, #0x4c63, lsl 32\n\t" + "movk x11, #0xcb02, lsl 48\n\t" + "mov x12, #0xf39a\n\t" + "movk x12, #0xd45e, lsl 16\n\t" + "movk x12, #0xdf3b, lsl 32\n\t" + "movk x12, #0x29b, lsl 48\n\t" + "movk x10, #0xa000, lsl 48\n\t" + "movk x13, #0x200, lsl 48\n\t" + "and x10, x10, x23\n\t" + "and x11, x11, x23\n\t" + "and x12, x12, x23\n\t" + "and x13, x13, x23\n\t" + "adds x3, x3, x10\n\t" + "adcs x4, x4, x11\n\t" + "adcs x5, x5, x12\n\t" + "adcs x6, x6, xzr\n\t" + "adc x7, x7, x13\n\t" + /* Move bits 252-376 to own registers */ + "lsl x7, x7, #4\n\t" + "orr x7, x7, x6, lsr 60\n\t" + "lsl x6, x6, #4\n\t" + "mov x23, #15\n\t" + "orr x6, x6, x5, lsr 60\n\t" + "bic x5, x5, x23, lsl 60\n\t" + /* Sub product of top 2 words and order */ + /* * -5812631a5cf5d3ed */ + "mov x1, #0x2c13\n\t" + "movk x1, #0xa30a, lsl 16\n\t" + "movk x1, #0x9ce5, lsl 32\n\t" + "movk x1, #0xa7ed, lsl 48\n\t" + "mul x10, x6, x1\n\t" + "umulh x11, x6, x1\n\t" + "mul x12, x7, x1\n\t" + "umulh x13, x7, x1\n\t" + "adds x2, x2, x10\n\t" + "adcs x3, x3, x11\n\t" + "adc x19, xzr, xzr\n\t" + "adds x3, x3, x12\n\t" + "adc x19, x19, x13\n\t" + /* * -14def9dea2f79cd7 */ + "mov x1, #0x6329\n\t" + "movk x1, #0x5d08, lsl 16\n\t" + "movk x1, #0x621, lsl 32\n\t" + "movk x1, #0xeb21, lsl 48\n\t" + "mul x10, x6, x1\n\t" + "umulh x11, x6, x1\n\t" + "mul x12, x7, x1\n\t" + "umulh x13, x7, x1\n\t" + "adds x3, x3, x10\n\t" + "adcs x4, x4, x11\n\t" + "adc x20, xzr, xzr\n\t" + "adds x4, x4, x12\n\t" + "adc x20, x20, x13\n\t" + /* Add overflows at 2 * 64 */ + "mov x1, #15\n\t" + "bic x5, x5, x1, lsl 60\n\t" + "adds x4, x4, x19\n\t" + "adc x5, x5, x20\n\t" + /* Subtract top at 2 * 64 */ + "subs x4, x4, x6\n\t" + "sbcs x5, x5, x7\n\t" + "sbc x1, x1, x1\n\t" + /* Conditional sub order */ + "mov x10, #0xd3ed\n\t" + "movk x10, #0x5cf5, lsl 16\n\t" + "movk x10, #0x631a, lsl 32\n\t" + "movk x10, #0x5812, lsl 48\n\t" + "mov x11, #0x9cd6\n\t" + "movk x11, #0xa2f7, lsl 16\n\t" + "movk x11, #0xf9de, lsl 32\n\t" + "movk x11, #0x14de, lsl 48\n\t" + "and x10, x10, x1\n\t" + "and x11, x11, x1\n\t" + "adds x2, x2, x10\n\t" + "adcs x3, x3, x11\n\t" + "and x1, x1, #0x1000000000000000\n\t" + "adcs x4, x4, xzr\n\t" + "mov x23, #15\n\t" + "adc x5, x5, x1\n\t" + "bic x5, x5, x23, lsl 60\n\t" + /* Store result */ + "stp x2, x3, [%x[s]]\n\t" + "stp x4, x5, [%x[s], #16]\n\t" + : [s] "+r" (s) + : + : "memory", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "cc" + ); +} + +void sc_muladd(byte* s, const byte* a, const byte* b, const byte* c) +{ + __asm__ __volatile__ ( + /* Multiply */ + "ldp x12, x13, [%x[a]]\n\t" + "ldp x14, x15, [%x[a], #16]\n\t" + "ldp x16, x17, [%x[b]]\n\t" + "ldp x19, x20, [%x[b], #16]\n\t" + /* A[0] * B[0] */ + "umulh x5, x12, x16\n\t" + "mul x4, x12, x16\n\t" + /* A[2] * B[0] */ + "umulh x7, x14, x16\n\t" + "mul x6, x14, x16\n\t" + /* A[1] * B[0] */ + "mul x21, x13, x16\n\t" + "adds x5, x5, x21\n\t" + "umulh x22, x13, x16\n\t" + "adcs x6, x6, x22\n\t" + /* A[1] * B[3] */ + "umulh x9, x13, x20\n\t" + "adc x7, x7, xzr\n\t" + "mul x8, x13, x20\n\t" + /* A[0] * B[1] */ + "mul x21, x12, x17\n\t" + "adds x5, x5, x21\n\t" + "umulh x22, x12, x17\n\t" + "adcs x6, x6, x22\n\t" + /* A[2] * B[1] */ + "mul x21, x14, x17\n\t" + "adcs x7, x7, x21\n\t" + "umulh x22, x14, x17\n\t" + "adcs x8, x8, x22\n\t" + "adc x9, x9, xzr\n\t" + /* A[1] * B[2] */ + "mul x21, x13, x19\n\t" + "adds x7, x7, x21\n\t" + "umulh x22, x13, x19\n\t" + "adcs x8, x8, x22\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, xzr, xzr\n\t" + /* A[0] * B[2] */ + "mul x21, x12, x19\n\t" + "adds x6, x6, x21\n\t" + "umulh x22, x12, x19\n\t" + "adcs x7, x7, x22\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adc x10, x10, xzr\n\t" + /* A[1] * B[1] */ + "mul x21, x13, x17\n\t" + "adds x6, x6, x21\n\t" + "umulh x22, x13, x17\n\t" + "adcs x7, x7, x22\n\t" + /* A[3] * B[1] */ + "mul x21, x15, x17\n\t" + "adcs x8, x8, x21\n\t" + "umulh x22, x15, x17\n\t" + "adcs x9, x9, x22\n\t" + "adc x10, x10, xzr\n\t" + /* A[2] * B[2] */ + "mul x21, x14, x19\n\t" + "adds x8, x8, x21\n\t" + "umulh x22, x14, x19\n\t" + "adcs x9, x9, x22\n\t" + /* A[3] * B[3] */ + "mul x21, x15, x20\n\t" + "adcs x10, x10, x21\n\t" + "umulh x11, x15, x20\n\t" + "adc x11, x11, xzr\n\t" + /* A[0] * B[3] */ + "mul x21, x12, x20\n\t" + "adds x7, x7, x21\n\t" + "umulh x22, x12, x20\n\t" + "adcs x8, x8, x22\n\t" + /* A[2] * B[3] */ + "mul x21, x14, x20\n\t" + "adcs x9, x9, x21\n\t" + "umulh x22, x14, x20\n\t" + "adcs x10, x10, x22\n\t" + "adc x11, x11, xzr\n\t" + /* A[3] * B[0] */ + "mul x21, x15, x16\n\t" + "adds x7, x7, x21\n\t" + "umulh x22, x15, x16\n\t" + "adcs x8, x8, x22\n\t" + /* A[3] * B[2] */ + "mul x21, x15, x19\n\t" + "adcs x9, x9, x21\n\t" + "umulh x22, x15, x19\n\t" + "adcs x10, x10, x22\n\t" + "adc x11, x11, xzr\n\t" + /* Add c to a * b */ + "ldp x12, x13, [%x[c]]\n\t" + "ldp x14, x15, [%x[c], #16]\n\t" + "adds x4, x4, x12\n\t" + "adcs x5, x5, x13\n\t" + "adcs x6, x6, x14\n\t" + "adcs x7, x7, x15\n\t" + "adcs x8, x8, xzr\n\t" + "adcs x9, x9, xzr\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" + "lsr x25, x11, #56\n\t" + "lsl x11, x11, #4\n\t" + "orr x11, x11, x10, lsr 60\n\t" + "lsl x10, x10, #4\n\t" + "orr x10, x10, x9, lsr 60\n\t" + "lsl x9, x9, #4\n\t" + "orr x9, x9, x8, lsr 60\n\t" + "lsl x8, x8, #4\n\t" + "mov x26, #15\n\t" + "orr x8, x8, x7, lsr 60\n\t" + "bic x7, x7, x26, lsl 60\n\t" + "bic x11, x11, x26, lsl 60\n\t" + /* Add order times bits 504..507 */ + "mov x22, #0x2c13\n\t" + "movk x22, #0xa30a, lsl 16\n\t" + "movk x22, #0x9ce5, lsl 32\n\t" + "movk x22, #0xa7ed, lsl 48\n\t" + "mov x24, #0x6329\n\t" + "movk x24, #0x5d08, lsl 16\n\t" + "movk x24, #0x621, lsl 32\n\t" + "movk x24, #0xeb21, lsl 48\n\t" + "mul x21, x25, x22\n\t" + "umulh x22, x25, x22\n\t" + "mul x23, x25, x24\n\t" + "umulh x24, x25, x24\n\t" + "adds x8, x8, x21\n\t" + "adcs x9, x9, x22\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, x11, xzr\n\t" + "adds x9, x9, x23\n\t" + "adcs x10, x10, x24\n\t" + "adc x11, x11, xzr\n\t" + "subs x10, x10, x25\n\t" + "sbc x11, x11, xzr\n\t" + /* Sub product of top 4 words and order */ + "mov x26, #0x2c13\n\t" + "movk x26, #0xa30a, lsl 16\n\t" + "movk x26, #0x9ce5, lsl 32\n\t" + "movk x26, #0xa7ed, lsl 48\n\t" + "mul x16, x8, x26\n\t" + "umulh x17, x8, x26\n\t" + "mul x19, x9, x26\n\t" + "umulh x20, x9, x26\n\t" + "mul x21, x10, x26\n\t" + "umulh x22, x10, x26\n\t" + "mul x23, x11, x26\n\t" + "umulh x24, x11, x26\n\t" + "adds x4, x4, x16\n\t" + "adcs x5, x5, x17\n\t" + "adcs x6, x6, x21\n\t" + "adcs x7, x7, x22\n\t" + "adc x12, xzr, xzr\n\t" + "adds x5, x5, x19\n\t" + "adcs x6, x6, x20\n\t" + "adcs x7, x7, x23\n\t" + "adc x12, x12, x24\n\t" + "mov x26, #0x6329\n\t" + "movk x26, #0x5d08, lsl 16\n\t" + "movk x26, #0x621, lsl 32\n\t" + "movk x26, #0xeb21, lsl 48\n\t" + "mul x16, x8, x26\n\t" + "umulh x17, x8, x26\n\t" + "mul x19, x9, x26\n\t" + "umulh x20, x9, x26\n\t" + "mul x21, x10, x26\n\t" + "umulh x22, x10, x26\n\t" + "mul x23, x11, x26\n\t" + "umulh x24, x11, x26\n\t" + "adds x5, x5, x16\n\t" + "adcs x6, x6, x17\n\t" + "adcs x7, x7, x21\n\t" + "adcs x12, x12, x22\n\t" + "adc x13, xzr, xzr\n\t" + "adds x6, x6, x19\n\t" + "adcs x7, x7, x20\n\t" + "adcs x12, x12, x23\n\t" + "adc x13, x13, x24\n\t" + "subs x6, x6, x8\n\t" + "sbcs x7, x7, x9\n\t" + "sbcs x8, x12, x10\n\t" + "sbc x9, x13, x11\n\t" + "asr x25, x9, #57\n\t" + /* Conditionally subtract order starting at bit 125 */ + "mov x16, xzr\n\t" + "mov x20, xzr\n\t" + "mov x17, #0xba7d\n\t" + "movk x17, #0x4b9e, lsl 16\n\t" + "movk x17, #0x4c63, lsl 32\n\t" + "movk x17, #0xcb02, lsl 48\n\t" + "mov x19, #0xf39a\n\t" + "movk x19, #0xd45e, lsl 16\n\t" + "movk x19, #0xdf3b, lsl 32\n\t" + "movk x19, #0x29b, lsl 48\n\t" + "movk x16, #0xa000, lsl 48\n\t" + "movk x20, #0x200, lsl 48\n\t" + "and x16, x16, x25\n\t" + "and x17, x17, x25\n\t" + "and x19, x19, x25\n\t" + "and x20, x20, x25\n\t" + "adds x5, x5, x16\n\t" + "adcs x6, x6, x17\n\t" + "adcs x7, x7, x19\n\t" + "adcs x8, x8, xzr\n\t" + "adc x9, x9, x20\n\t" + /* Move bits 252-376 to own registers */ + "lsl x9, x9, #4\n\t" + "orr x9, x9, x8, lsr 60\n\t" + "lsl x8, x8, #4\n\t" + "mov x25, #15\n\t" + "orr x8, x8, x7, lsr 60\n\t" + "bic x7, x7, x25, lsl 60\n\t" + /* Sub product of top 2 words and order */ + /* * -5812631a5cf5d3ed */ + "mov x26, #0x2c13\n\t" + "movk x26, #0xa30a, lsl 16\n\t" + "movk x26, #0x9ce5, lsl 32\n\t" + "movk x26, #0xa7ed, lsl 48\n\t" + "mul x16, x8, x26\n\t" + "umulh x17, x8, x26\n\t" + "mul x19, x9, x26\n\t" + "umulh x20, x9, x26\n\t" + "adds x4, x4, x16\n\t" + "adcs x5, x5, x17\n\t" + "adc x12, xzr, xzr\n\t" + "adds x5, x5, x19\n\t" + "adc x12, x12, x20\n\t" + /* * -14def9dea2f79cd7 */ + "mov x26, #0x6329\n\t" + "movk x26, #0x5d08, lsl 16\n\t" + "movk x26, #0x621, lsl 32\n\t" + "movk x26, #0xeb21, lsl 48\n\t" + "mul x16, x8, x26\n\t" + "umulh x17, x8, x26\n\t" + "mul x19, x9, x26\n\t" + "umulh x20, x9, x26\n\t" + "adds x5, x5, x16\n\t" + "adcs x6, x6, x17\n\t" + "adc x13, xzr, xzr\n\t" + "adds x6, x6, x19\n\t" + "adc x13, x13, x20\n\t" + /* Add overflows at 2 * 64 */ + "mov x26, #15\n\t" + "bic x7, x7, x26, lsl 60\n\t" + "adds x6, x6, x12\n\t" + "adc x7, x7, x13\n\t" + /* Subtract top at 2 * 64 */ + "subs x6, x6, x8\n\t" + "sbcs x7, x7, x9\n\t" + "sbc x26, x26, x26\n\t" + /* Conditional sub order */ + "mov x16, #0xd3ed\n\t" + "movk x16, #0x5cf5, lsl 16\n\t" + "movk x16, #0x631a, lsl 32\n\t" + "movk x16, #0x5812, lsl 48\n\t" + "mov x17, #0x9cd6\n\t" + "movk x17, #0xa2f7, lsl 16\n\t" + "movk x17, #0xf9de, lsl 32\n\t" + "movk x17, #0x14de, lsl 48\n\t" + "and x16, x16, x26\n\t" + "and x17, x17, x26\n\t" + "adds x4, x4, x16\n\t" + "adcs x5, x5, x17\n\t" + "and x26, x26, #0x1000000000000000\n\t" + "adcs x6, x6, xzr\n\t" + "mov x25, #15\n\t" + "adc x7, x7, x26\n\t" + "bic x7, x7, x25, lsl 60\n\t" + /* Store result */ + "stp x4, x5, [%x[s]]\n\t" + "stp x6, x7, [%x[s], #16]\n\t" + : [s] "+r" (s), [a] "+r" (a), [b] "+r" (b), [c] "+r" (c) : - : "memory", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28" + : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "cc" ); } -#endif /* HAVE_CURVE25519 */ +#endif /* HAVE_ED25519 */ +#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ +#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ #endif /* __aarch64__ */ #endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha256.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha256.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha256.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha256.c 2024-08-03 07:30:00.000000000 +0000 @@ -29,11 +29,24 @@ #ifdef WOLFSSL_ARMASM #if !defined(NO_SHA256) || defined(WOLFSSL_SHA224) -#ifdef HAVE_FIPS -#undef HAVE_FIPS +#if FIPS_VERSION3_LT(6,0,0) && defined(HAVE_FIPS) + #undef HAVE_FIPS +#else + #if defined(HAVE_FIPS) && FIPS_VERSION3_GE(6,0,0) + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS + #endif #endif #include +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_sha256_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000014 }; + int wolfCrypt_FIPS_SHA256_sanity(void) + { + return 0; + } +#endif #include #include @@ -44,6 +57,13 @@ #include #endif +#if defined(FREESCALE_MMCAU_SHA) + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + #include "cau_api.h" + #else + #include "fsl_mmcau.h" + #endif +#endif #ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO static const ALIGN32 word32 K[64] = { @@ -72,6 +92,17 @@ return BAD_FUNC_ARG; } +#ifdef FREESCALE_MMCAU_SHA + ret = wolfSSL_CryptHwMutexLock(); + if (ret == 0) { + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha256_initialize_output(sha256->digest); + #else + MMCAU_SHA256_InitializeOutput((uint32_t*)sha256->digest); + #endif + wolfSSL_CryptHwMutexUnLock(); + } +#else sha256->digest[0] = 0x6A09E667L; sha256->digest[1] = 0xBB67AE85L; sha256->digest[2] = 0x3C6EF372L; @@ -80,11 +111,16 @@ sha256->digest[5] = 0x9B05688CL; sha256->digest[6] = 0x1F83D9ABL; sha256->digest[7] = 0x5BE0CD19L; +#endif sha256->buffLen = 0; sha256->loLen = 0; sha256->hiLen = 0; +#ifdef WOLFSSL_HASH_FLAGS + sha256->flags = 0; +#endif + return ret; } @@ -107,8 +143,8 @@ word32* k = (word32*)K; __asm__ volatile ( - "#load leftover data\n" - "LD1 {v0.2d-v3.2d}, %[buffer] \n" + "# load first block of data\n" + "LD1 {v0.16b-v3.16b}, [%[dataIn]], #64 \n" "#load current digest\n" "LD1 {v12.2d-v13.2d}, %[digest] \n" @@ -258,7 +294,7 @@ "CBZ w8, 2f \n" "#load in message and schedule updates \n" - "LD1 {v0.2d-v3.2d}, [%[dataIn]], #64 \n" + "LD1 {v0.16b-v3.16b}, [%[dataIn]], #64 \n" "MOV v14.16b, v12.16b \n" "MOV v15.16b, v13.16b \n" "REV32 v0.16b, v0.16b \n" @@ -268,12 +304,11 @@ "B 1b \n" /* do another block */ "2:\n" - "STP q12, q13, %[out] \n" + "ST1 {v12.2d-v13.2d}, %[out] \n" - : [out] "=m" (sha256->digest), "=m" (sha256->buffer), "=r" (numBlocks), - "=r" (data), "=r" (k) - : [k] "4" (k), [digest] "m" (sha256->digest), [buffer] "m" (sha256->buffer), - [blocks] "2" (numBlocks), [dataIn] "3" (data) + : [out] "=m" (sha256->digest), "=r" (numBlocks), "=r" (data), "=r" (k) + : [k] "3" (k), [digest] "m" (sha256->digest), [blocks] "1" (numBlocks), + [dataIn] "2" (data) : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", @@ -283,35 +318,42 @@ } /* ARMv8 hardware acceleration */ -static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, word32 len) +static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, + word32 len) { word32 add; word32 numBlocks; /* only perform actions if a buffer is passed in */ if (len > 0) { - /* fill leftover buffer with data */ - add = min(len, WC_SHA256_BLOCK_SIZE - sha256->buffLen); - XMEMCPY((byte*)(sha256->buffer) + sha256->buffLen, data, add); - sha256->buffLen += add; - data += add; - len -= add; + AddLength(sha256, len); + + if (sha256->buffLen > 0) { + /* fill leftover buffer with data */ + add = min(len, WC_SHA256_BLOCK_SIZE - sha256->buffLen); + XMEMCPY((byte*)(sha256->buffer) + sha256->buffLen, data, add); + sha256->buffLen += add; + data += add; + len -= add; + if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) { + Sha256Transform(sha256, (byte*)sha256->buffer, 1); + sha256->buffLen = 0; + } + } /* number of blocks in a row to complete */ numBlocks = (len + sha256->buffLen)/WC_SHA256_BLOCK_SIZE; if (numBlocks > 0) { - /* get leftover amount after blocks */ - add = (len + sha256->buffLen) - numBlocks * WC_SHA256_BLOCK_SIZE; - Sha256Transform(sha256, data, numBlocks); - data += numBlocks * WC_SHA256_BLOCK_SIZE - sha256->buffLen; - - AddLength(sha256, WC_SHA256_BLOCK_SIZE * numBlocks); + data += numBlocks * WC_SHA256_BLOCK_SIZE; + len -= numBlocks * WC_SHA256_BLOCK_SIZE; + } + if (len > 0) { /* copy over any remaining data leftover */ - XMEMCPY(sha256->buffer, data, add); - sha256->buffLen = add; + XMEMCPY(sha256->buffer, data, len); + sha256->buffLen = len; } } @@ -329,8 +371,6 @@ const word32* k; local = (byte*)sha256->buffer; - AddLength(sha256, sha256->buffLen); /* before adding pads */ - local[sha256->buffLen++] = 0x80; /* add 1 */ /* pad with zeros */ @@ -357,7 +397,7 @@ "MOV v16.16b, v20.16b \n" "MOV v17.16b, v21.16b \n" - "LD1 {v22.16b-v25.16b}, [%[k]], #64 \n" + "LD1 {v22.4s-v25.4s}, [%[k]], #64 \n" "SHA256SU0 v4.4s, v1.4s \n" "ADD v0.4s, v0.4s, v22.4s \n" "MOV v6.16b, v2.16b \n" @@ -390,7 +430,7 @@ "SHA256H q16, q17, v3.4s \n" "SHA256H2 q17, q18, v3.4s \n" - "LD1 {v22.16b-v25.16b}, [%[k]], #64 \n" + "LD1 {v22.4s-v25.4s}, [%[k]], #64 \n" "SHA256SU0 v8.4s, v5.4s \n" "ADD v4.4s, v4.4s, v22.4s \n" "MOV v18.16b, v16.16b \n" @@ -423,7 +463,7 @@ "SHA256H q16, q17, v7.4s \n" "SHA256H2 q17, q18, v7.4s \n" - "LD1 {v22.16b-v25.16b}, [%[k]], #64 \n" + "LD1 {v22.4s-v25.4s}, [%[k]], #64 \n" "SHA256SU0 v12.4s, v9.4s \n" "ADD v8.4s, v8.4s, v22.4s \n" "MOV v18.16b, v16.16b \n" @@ -454,7 +494,7 @@ "SHA256H q16, q17, v11.4s \n" "SHA256H2 q17, q18, v11.4s \n" - "LD1 {v22.16b-v25.16b}, [%[k]] \n" + "LD1 {v22.4s-v25.4s}, [%[k]] \n" "ADD v12.4s, v12.4s, v22.4s \n" "MOV v18.16b, v16.16b \n" "SHA256H q16, q17, v12.4s \n" @@ -478,7 +518,7 @@ "#Add working vars back into digest state \n" "ADD v16.4s, v16.4s, v20.4s \n" "ADD v17.4s, v17.4s, v21.4s \n" - "STP q16, q17, %[out] \n" + "ST1 {v16.2d-v17.2d}, %[out] \n" : [out] "=m" (sha256->digest), [k] "+r" (k) : [digest] "m" (sha256->digest), @@ -528,7 +568,7 @@ "MOV v16.16b, v20.16b \n" "MOV v17.16b, v21.16b \n" - "LD1 {v22.16b-v25.16b}, [%[k]], #64 \n" + "LD1 {v22.4s-v25.4s}, [%[k]], #64 \n" "SHA256SU0 v4.4s, v1.4s \n" "ADD v0.4s, v0.4s, v22.4s \n" "MOV v6.16b, v2.16b \n" @@ -561,7 +601,7 @@ "SHA256H q16, q17, v3.4s \n" "SHA256H2 q17, q18, v3.4s \n" - "LD1 {v22.16b-v25.16b}, [%[k]], #64 \n" + "LD1 {v22.4s-v25.4s}, [%[k]], #64 \n" "SHA256SU0 v8.4s, v5.4s \n" "ADD v4.4s, v4.4s, v22.4s \n" "MOV v18.16b, v16.16b \n" @@ -594,7 +634,7 @@ "SHA256H q16, q17, v7.4s \n" "SHA256H2 q17, q18, v7.4s \n" - "LD1 {v22.16b-v25.16b}, [%[k]], #64 \n" + "LD1 {v22.4s-v25.4s}, [%[k]], #64 \n" "SHA256SU0 v12.4s, v9.4s \n" "ADD v8.4s, v8.4s, v22.4s \n" "MOV v18.16b, v16.16b \n" @@ -625,7 +665,7 @@ "SHA256H q16, q17, v11.4s \n" "SHA256H2 q17, q18, v11.4s \n" - "LD1 {v22.16b-v25.16b}, [%[k]] \n" + "LD1 {v22.4s-v25.4s}, [%[k]] \n" "ADD v12.4s, v12.4s, v22.4s \n" "MOV v18.16b, v16.16b \n" "SHA256H q16, q17, v12.4s \n" @@ -681,8 +721,9 @@ word32* digPt = sha256->digest; __asm__ volatile ( - "#load leftover data\n" - "VLDM %[buffer]!, {q0-q3} \n" + "# load first block of data\n" + "VLD1.8 {d0-d3}, [%[dataIn]]! \n" + "VLD1.8 {d4-d7}, [%[dataIn]]! \n" "#load current digest\n" "VLDM %[digest], {q12-q13} \n" @@ -842,10 +883,8 @@ "BEQ 2f \n" "#load in message and schedule updates \n" - "VLD1.32 {q0}, [%[dataIn]]! \n" - "VLD1.32 {q1}, [%[dataIn]]! \n" - "VLD1.32 {q2}, [%[dataIn]]! \n" - "VLD1.32 {q3}, [%[dataIn]]! \n" + "VLD1.8 {d0-d3}, [%[dataIn]]! \n" + "VLD1.8 {d4-d7}, [%[dataIn]]! \n" /* reset K pointer */ "SUB %[k], %[k], #160 \n" @@ -871,35 +910,42 @@ } /* ARMv8 hardware acceleration Aarch32 */ -static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, word32 len) +static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, + word32 len) { word32 add; word32 numBlocks; /* only perform actions if a buffer is passed in */ if (len > 0) { - /* fill leftover buffer with data */ - add = min(len, WC_SHA256_BLOCK_SIZE - sha256->buffLen); - XMEMCPY((byte*)(sha256->buffer) + sha256->buffLen, data, add); - sha256->buffLen += add; - data += add; - len -= add; + AddLength(sha256, len); + + if (sha256->buffLen > 0) { + /* fill leftover buffer with data */ + add = min(len, WC_SHA256_BLOCK_SIZE - sha256->buffLen); + XMEMCPY((byte*)(sha256->buffer) + sha256->buffLen, data, add); + sha256->buffLen += add; + data += add; + len -= add; + if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) { + Sha256Transform(sha256, (byte*)sha256->buffer, 1); + sha256->buffLen = 0; + } + } /* number of blocks in a row to complete */ numBlocks = (len + sha256->buffLen)/WC_SHA256_BLOCK_SIZE; if (numBlocks > 0) { - /* get leftover amount after blocks */ - add = (len + sha256->buffLen) - numBlocks * WC_SHA256_BLOCK_SIZE; - Sha256Transform(sha256, data, numBlocks); - data += numBlocks * WC_SHA256_BLOCK_SIZE - sha256->buffLen; - - AddLength(sha256, WC_SHA256_BLOCK_SIZE * numBlocks); + data += numBlocks * WC_SHA256_BLOCK_SIZE; + len -= numBlocks * WC_SHA256_BLOCK_SIZE; + } + if (len > 0) { /* copy over any remaining data leftover */ - XMEMCPY(sha256->buffer, data, add); - sha256->buffLen = add; + XMEMCPY(sha256->buffer, data, len); + sha256->buffLen = len; } } @@ -920,8 +966,6 @@ } local = (byte*)sha256->buffer; - AddLength(sha256, sha256->buffLen); /* before adding pads */ - local[sha256->buffLen++] = 0x80; /* add 1 */ /* pad with zeros */ @@ -1313,12 +1357,60 @@ #endif /* __aarch64__ */ -#else +#else /* WOLFSSL_ARMASM_NO_HW_CRYPTO */ + +#if defined(FREESCALE_MMCAU_SHA) + + #ifndef WC_HASH_DATA_ALIGNMENT + /* these hardware API's require 4 byte (word32) alignment */ + #define WC_HASH_DATA_ALIGNMENT 4 + #endif + + static int Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, + word32 len) + { + int ret = wolfSSL_CryptHwMutexLock(); + if (ret == 0) { + #if defined(WC_HASH_DATA_ALIGNMENT) && WC_HASH_DATA_ALIGNMENT > 0 + if ((wc_ptr_t)data % WC_HASH_DATA_ALIGNMENT) { + /* data pointer is NOT aligned, + * so copy and perform one block at a time */ + byte* local = (byte*)sha256->buffer; + while (len >= WC_SHA256_BLOCK_SIZE) { + XMEMCPY(local, data, WC_SHA256_BLOCK_SIZE); + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha256_hash_n(local, 1, sha256->digest); + #else + MMCAU_SHA256_HashN(local, 1, (uint32_t*)sha256->digest); + #endif + data += WC_SHA256_BLOCK_SIZE; + len -= WC_SHA256_BLOCK_SIZE; + } + } + else + #endif + { + #ifdef FREESCALE_MMCAU_CLASSIC_SHA + cau_sha256_hash_n((byte*)data, len/WC_SHA256_BLOCK_SIZE, + sha256->digest); + #else + MMCAU_SHA256_HashN((byte*)data, len/WC_SHA256_BLOCK_SIZE, + (uint32_t*)sha256->digest); + #endif + } + wolfSSL_CryptHwMutexUnLock(); + } + return ret; + } + +#else /* */ extern void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, word32 len); -/* ARMv8 hardware acceleration Aarch32 */ +#endif + +/* ARMv8 hardware acceleration Aarch32 and Thumb2 */ static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, word32 len) { int ret = 0; @@ -1425,6 +1517,9 @@ return BAD_FUNC_ARG; sha256->heap = heap; +#ifdef WOLF_CRYPTO_CB + sha256->devId = devId; +#endif (void)devId; return InitSha256(sha256); @@ -1541,14 +1636,86 @@ XMEMCPY(sha256->buffer, data, WC_SHA256_BLOCK_SIZE); #endif #ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO - Sha256Transform(sha256, data, 1); + Sha256Transform(sha256, (byte*)sha256->buffer, 1); #else - Transform_Sha256_Len(sha256, data, WC_SHA256_BLOCK_SIZE); + Transform_Sha256_Len(sha256, (byte*)sha256->buffer, WC_SHA256_BLOCK_SIZE); #endif return 0; } #endif +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH) +/* One block will be used from data. + * hash must be big enough to hold all of digest output. + */ +int wc_Sha256HashBlock(wc_Sha256* sha256, const unsigned char* data, + unsigned char* hash) +{ + int ret = 0; + + if ((sha256 == NULL) || (data == NULL)) { + return BAD_FUNC_ARG; + } + +#ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO + Sha256Transform(sha256, data, 1); +#else + Transform_Sha256_Len(sha256, data, WC_SHA256_BLOCK_SIZE); +#endif + + if (hash != NULL) { +#ifdef LITTLE_ENDIAN_ORDER + #ifndef WOLFSSL_ARMASM_NO_HW_CRYPTO + #ifdef __aarch64__ + __asm__ __volatile__ ( + "LD1 {v0.2d-v1.2d}, [%[digest]] \n" + "REV32 v0.16b, v0.16b \n" + "REV32 v1.16b, v1.16b \n" + "ST1 {v0.16b-v1.16b}, [%[hash]] \n" + : + : [digest] "r" (sha256->digest), [hash] "r" (hash) + : "memory", "v0", "v1" + ); + #else + __asm__ __volatile__ ( + "VLDM %[digest], {q0-q1} \n" + "VREV32.8 q0, q0 \n" + "VREV32.8 q1, q1 \n" + "VST1.8 {d0-d3}, [%[hash]] \n" + : + : [digest] "r" (sha256->digest), [hash] "r" (hash) + : "memory", "q0", "q1" + ); + #endif + #else + word32* hash32 = (word32*)hash; + word32* digest = (word32*)sha256->digest; + hash32[0] = ByteReverseWord32(digest[0]); + hash32[1] = ByteReverseWord32(digest[1]); + hash32[2] = ByteReverseWord32(digest[2]); + hash32[3] = ByteReverseWord32(digest[3]); + hash32[4] = ByteReverseWord32(digest[4]); + hash32[5] = ByteReverseWord32(digest[5]); + hash32[6] = ByteReverseWord32(digest[6]); + hash32[7] = ByteReverseWord32(digest[7]); + #endif /* !WOLFSSL_ARMASM_NO_HW_CRYPTO */ +#else + XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE); +#endif + sha256->digest[0] = 0x6A09E667L; + sha256->digest[1] = 0xBB67AE85L; + sha256->digest[2] = 0x3C6EF372L; + sha256->digest[3] = 0xA54FF53AL; + sha256->digest[4] = 0x510E527FL; + sha256->digest[5] = 0x9B05688CL; + sha256->digest[6] = 0x1F83D9ABL; + sha256->digest[7] = 0x5BE0CD19L; + } + + return ret; +} +#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_FULL_HASH */ + #endif /* !NO_SHA256 */ @@ -1575,6 +1742,9 @@ sha224->loLen = 0; sha224->hiLen = 0; + #ifdef WOLFSSL_HASH_FLAGS + sha224->flags = 0; + #endif return ret; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,6 +30,7 @@ */ #ifdef WOLFSSL_ARMASM #ifdef __aarch64__ +#ifndef WOLFSSL_ARMASM_INLINE #ifdef WOLFSSL_SHA3 #ifdef WOLFSSL_ARMASM_CRYPTO_SHA3 #ifndef __APPLE__ @@ -213,3 +214,4 @@ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -23,6 +23,7 @@ #include #endif /* HAVE_CONFIG_H */ #include +#include /* Generated using (from wolfssl): * cd ../scripts @@ -30,6 +31,7 @@ */ #ifdef WOLFSSL_ARMASM #ifdef __aarch64__ +#ifdef WOLFSSL_ARMASM_INLINE #include #ifdef WOLFSSL_SHA3 @@ -175,7 +177,7 @@ "st1 {v24.1d}, [%x[state]]\n\t" : [state] "+r" (state) : [L_SHA3_transform_crypto_r] "S" (L_SHA3_transform_crypto_r) - : "memory", "x1", "x2", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + : "memory", "x1", "x2", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "cc" ); } @@ -183,3 +185,4 @@ #endif /* WOLFSSL_SHA3 */ #endif /* __aarch64__ */ #endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -30,6 +30,7 @@ */ #ifdef WOLFSSL_ARMASM #ifdef __aarch64__ +#ifndef WOLFSSL_ARMASM_INLINE #ifdef WOLFSSL_SHA512 #ifndef WOLFSSL_ARMASM_CRYPTO_SHA512 #ifndef __APPLE__ @@ -1217,7 +1218,7 @@ adrp x4, L_SHA512_transform_crypto_len_k@PAGE add x4, x4, :lo12:L_SHA512_transform_crypto_len_k@PAGEOFF #endif /* __APPLE__ */ - # Load first 16 64-bit words of K permantly + # Load first 16 64-bit words of K permanently ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x4], #0x40 ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [x4], #0x40 # Load digest into working vars @@ -1739,3 +1740,4 @@ #if defined(__linux__) && defined(__ELF__) .section .note.GNU-stack,"",%progbits #endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -23,6 +23,7 @@ #include #endif /* HAVE_CONFIG_H */ #include +#include /* Generated using (from wolfssl): * cd ../scripts @@ -30,6 +31,7 @@ */ #ifdef WOLFSSL_ARMASM #ifdef __aarch64__ +#ifdef WOLFSSL_ARMASM_INLINE #include #ifdef WOLFSSL_SHA512 @@ -1047,7 +1049,7 @@ "stp x10, x11, [%x[sha512], #48]\n\t" : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) : [L_SHA512_transform_neon_len_k] "S" (L_SHA512_transform_neon_len_k), [L_SHA512_transform_neon_len_ror8] "S" (L_SHA512_transform_neon_len_ror8) - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "cc" ); } @@ -1149,7 +1151,7 @@ "adrp x4, %[L_SHA512_transform_crypto_len_k]@PAGE\n\t" "add x4, x4, %[L_SHA512_transform_crypto_len_k]@PAGEOFF\n\t" #endif /* __APPLE__ */ - /* Load first 16 64-bit words of K permantly */ + /* Load first 16 64-bit words of K permanently */ "ld1 {v8.2d, v9.2d, v10.2d, v11.2d}, [x4], #0x40\n\t" "ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [x4], #0x40\n\t" /* Load digest into working vars */ @@ -1657,7 +1659,7 @@ "st1 {v24.2d, v25.2d, v26.2d, v27.2d}, [%x[sha512]]\n\t" : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) : [L_SHA512_transform_crypto_len_k] "S" (L_SHA512_transform_crypto_len_k) - : "memory", "x3", "x4", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31" + : "memory", "x3", "x4", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "cc" ); } @@ -1665,3 +1667,4 @@ #endif /* WOLFSSL_SHA512 */ #endif /* __aarch64__ */ #endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/armv8-sha512.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,11 +28,25 @@ #ifdef WOLFSSL_ARMASM #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) -#ifdef HAVE_FIPS -#undef HAVE_FIPS +#if FIPS_VERSION3_LT(6,0,0) && defined(HAVE_FIPS) + #undef HAVE_FIPS +#else + #if defined(HAVE_FIPS) && FIPS_VERSION3_GE(6,0,0) + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS + #endif #endif + #include +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_sha512_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000015 }; + int wolfCrypt_FIPS_SHA512_sanity(void) + { + return 0; + } +#endif #include #include @@ -146,23 +160,6 @@ #ifdef WOLFSSL_SHA512 -#ifdef WOLFSSL_ARMASM -#ifdef __aarch64__ -#ifndef WOLFSSL_ARMASM_CRYPTO_SHA512 - extern void Transform_Sha512_Len_neon(wc_Sha512* sha512, const byte* data, - word32 len); - #define Transform_Sha512_Len Transform_Sha512_Len_neon -#else - extern void Transform_Sha512_Len_crypto(wc_Sha512* sha512, const byte* data, - word32 len); - #define Transform_Sha512_Len Transform_Sha512_Len_crypto -#endif -#else -extern void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, - word32 len); -#endif -#endif - static int InitSha512_Family(wc_Sha512* sha512, void* heap, int devId, enum wc_HashType type) { @@ -631,7 +628,7 @@ #ifdef WOLF_CRYPTO_CB if (sha512->devId != INVALID_DEVID) { ret = wc_CryptoCb_Sha512Hash(sha512, NULL, 0, hash); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3369 @@ +/* thumb2-aes-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./aes/aes.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm.S + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE + .thumb + .syntax unified +#ifndef NO_AES +#ifdef HAVE_AES_DECRYPT + .text + .type L_AES_Thumb2_td_data, %object + .size L_AES_Thumb2_td_data, 1024 + .align 4 +L_AES_Thumb2_td_data: + .word 0x5051f4a7 + .word 0x537e4165 + .word 0xc31a17a4 + .word 0x963a275e + .word 0xcb3bab6b + .word 0xf11f9d45 + .word 0xabacfa58 + .word 0x934be303 + .word 0x552030fa + .word 0xf6ad766d + .word 0x9188cc76 + .word 0x25f5024c + .word 0xfc4fe5d7 + .word 0xd7c52acb + .word 0x80263544 + .word 0x8fb562a3 + .word 0x49deb15a + .word 0x6725ba1b + .word 0x9845ea0e + .word 0xe15dfec0 + .word 0x2c32f75 + .word 0x12814cf0 + .word 0xa38d4697 + .word 0xc66bd3f9 + .word 0xe7038f5f + .word 0x9515929c + .word 0xebbf6d7a + .word 0xda955259 + .word 0x2dd4be83 + .word 0xd3587421 + .word 0x2949e069 + .word 0x448ec9c8 + .word 0x6a75c289 + .word 0x78f48e79 + .word 0x6b99583e + .word 0xdd27b971 + .word 0xb6bee14f + .word 0x17f088ad + .word 0x66c920ac + .word 0xb47dce3a + .word 0x1863df4a + .word 0x82e51a31 + .word 0x60975133 + .word 0x4562537f + .word 0xe0b16477 + .word 0x84bb6bae + .word 0x1cfe81a0 + .word 0x94f9082b + .word 0x58704868 + .word 0x198f45fd + .word 0x8794de6c + .word 0xb7527bf8 + .word 0x23ab73d3 + .word 0xe2724b02 + .word 0x57e31f8f + .word 0x2a6655ab + .word 0x7b2eb28 + .word 0x32fb5c2 + .word 0x9a86c57b + .word 0xa5d33708 + .word 0xf2302887 + .word 0xb223bfa5 + .word 0xba02036a + .word 0x5ced1682 + .word 0x2b8acf1c + .word 0x92a779b4 + .word 0xf0f307f2 + .word 0xa14e69e2 + .word 0xcd65daf4 + .word 0xd50605be + .word 0x1fd13462 + .word 0x8ac4a6fe + .word 0x9d342e53 + .word 0xa0a2f355 + .word 0x32058ae1 + .word 0x75a4f6eb + .word 0x390b83ec + .word 0xaa4060ef + .word 0x65e719f + .word 0x51bd6e10 + .word 0xf93e218a + .word 0x3d96dd06 + .word 0xaedd3e05 + .word 0x464de6bd + .word 0xb591548d + .word 0x571c45d + .word 0x6f0406d4 + .word 0xff605015 + .word 0x241998fb + .word 0x97d6bde9 + .word 0xcc894043 + .word 0x7767d99e + .word 0xbdb0e842 + .word 0x8807898b + .word 0x38e7195b + .word 0xdb79c8ee + .word 0x47a17c0a + .word 0xe97c420f + .word 0xc9f8841e + .word 0x0 + .word 0x83098086 + .word 0x48322bed + .word 0xac1e1170 + .word 0x4e6c5a72 + .word 0xfbfd0eff + .word 0x560f8538 + .word 0x1e3daed5 + .word 0x27362d39 + .word 0x640a0fd9 + .word 0x21685ca6 + .word 0xd19b5b54 + .word 0x3a24362e + .word 0xb10c0a67 + .word 0xf9357e7 + .word 0xd2b4ee96 + .word 0x9e1b9b91 + .word 0x4f80c0c5 + .word 0xa261dc20 + .word 0x695a774b + .word 0x161c121a + .word 0xae293ba + .word 0xe5c0a02a + .word 0x433c22e0 + .word 0x1d121b17 + .word 0xb0e090d + .word 0xadf28bc7 + .word 0xb92db6a8 + .word 0xc8141ea9 + .word 0x8557f119 + .word 0x4caf7507 + .word 0xbbee99dd + .word 0xfda37f60 + .word 0x9ff70126 + .word 0xbc5c72f5 + .word 0xc544663b + .word 0x345bfb7e + .word 0x768b4329 + .word 0xdccb23c6 + .word 0x68b6edfc + .word 0x63b8e4f1 + .word 0xcad731dc + .word 0x10426385 + .word 0x40139722 + .word 0x2084c611 + .word 0x7d854a24 + .word 0xf8d2bb3d + .word 0x11aef932 + .word 0x6dc729a1 + .word 0x4b1d9e2f + .word 0xf3dcb230 + .word 0xec0d8652 + .word 0xd077c1e3 + .word 0x6c2bb316 + .word 0x99a970b9 + .word 0xfa119448 + .word 0x2247e964 + .word 0xc4a8fc8c + .word 0x1aa0f03f + .word 0xd8567d2c + .word 0xef223390 + .word 0xc787494e + .word 0xc1d938d1 + .word 0xfe8ccaa2 + .word 0x3698d40b + .word 0xcfa6f581 + .word 0x28a57ade + .word 0x26dab78e + .word 0xa43fadbf + .word 0xe42c3a9d + .word 0xd507892 + .word 0x9b6a5fcc + .word 0x62547e46 + .word 0xc2f68d13 + .word 0xe890d8b8 + .word 0x5e2e39f7 + .word 0xf582c3af + .word 0xbe9f5d80 + .word 0x7c69d093 + .word 0xa96fd52d + .word 0xb3cf2512 + .word 0x3bc8ac99 + .word 0xa710187d + .word 0x6ee89c63 + .word 0x7bdb3bbb + .word 0x9cd2678 + .word 0xf46e5918 + .word 0x1ec9ab7 + .word 0xa8834f9a + .word 0x65e6956e + .word 0x7eaaffe6 + .word 0x821bccf + .word 0xe6ef15e8 + .word 0xd9bae79b + .word 0xce4a6f36 + .word 0xd4ea9f09 + .word 0xd629b07c + .word 0xaf31a4b2 + .word 0x312a3f23 + .word 0x30c6a594 + .word 0xc035a266 + .word 0x37744ebc + .word 0xa6fc82ca + .word 0xb0e090d0 + .word 0x1533a7d8 + .word 0x4af10498 + .word 0xf741ecda + .word 0xe7fcd50 + .word 0x2f1791f6 + .word 0x8d764dd6 + .word 0x4d43efb0 + .word 0x54ccaa4d + .word 0xdfe49604 + .word 0xe39ed1b5 + .word 0x1b4c6a88 + .word 0xb8c12c1f + .word 0x7f466551 + .word 0x49d5eea + .word 0x5d018c35 + .word 0x73fa8774 + .word 0x2efb0b41 + .word 0x5ab3671d + .word 0x5292dbd2 + .word 0x33e91056 + .word 0x136dd647 + .word 0x8c9ad761 + .word 0x7a37a10c + .word 0x8e59f814 + .word 0x89eb133c + .word 0xeecea927 + .word 0x35b761c9 + .word 0xede11ce5 + .word 0x3c7a47b1 + .word 0x599cd2df + .word 0x3f55f273 + .word 0x791814ce + .word 0xbf73c737 + .word 0xea53f7cd + .word 0x5b5ffdaa + .word 0x14df3d6f + .word 0x867844db + .word 0x81caaff3 + .word 0x3eb968c4 + .word 0x2c382434 + .word 0x5fc2a340 + .word 0x72161dc3 + .word 0xcbce225 + .word 0x8b283c49 + .word 0x41ff0d95 + .word 0x7139a801 + .word 0xde080cb3 + .word 0x9cd8b4e4 + .word 0x906456c1 + .word 0x617bcb84 + .word 0x70d532b6 + .word 0x74486c5c + .word 0x42d0b857 +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) + .text + .type L_AES_Thumb2_te_data, %object + .size L_AES_Thumb2_te_data, 1024 + .align 4 +L_AES_Thumb2_te_data: + .word 0xa5c66363 + .word 0x84f87c7c + .word 0x99ee7777 + .word 0x8df67b7b + .word 0xdfff2f2 + .word 0xbdd66b6b + .word 0xb1de6f6f + .word 0x5491c5c5 + .word 0x50603030 + .word 0x3020101 + .word 0xa9ce6767 + .word 0x7d562b2b + .word 0x19e7fefe + .word 0x62b5d7d7 + .word 0xe64dabab + .word 0x9aec7676 + .word 0x458fcaca + .word 0x9d1f8282 + .word 0x4089c9c9 + .word 0x87fa7d7d + .word 0x15effafa + .word 0xebb25959 + .word 0xc98e4747 + .word 0xbfbf0f0 + .word 0xec41adad + .word 0x67b3d4d4 + .word 0xfd5fa2a2 + .word 0xea45afaf + .word 0xbf239c9c + .word 0xf753a4a4 + .word 0x96e47272 + .word 0x5b9bc0c0 + .word 0xc275b7b7 + .word 0x1ce1fdfd + .word 0xae3d9393 + .word 0x6a4c2626 + .word 0x5a6c3636 + .word 0x417e3f3f + .word 0x2f5f7f7 + .word 0x4f83cccc + .word 0x5c683434 + .word 0xf451a5a5 + .word 0x34d1e5e5 + .word 0x8f9f1f1 + .word 0x93e27171 + .word 0x73abd8d8 + .word 0x53623131 + .word 0x3f2a1515 + .word 0xc080404 + .word 0x5295c7c7 + .word 0x65462323 + .word 0x5e9dc3c3 + .word 0x28301818 + .word 0xa1379696 + .word 0xf0a0505 + .word 0xb52f9a9a + .word 0x90e0707 + .word 0x36241212 + .word 0x9b1b8080 + .word 0x3ddfe2e2 + .word 0x26cdebeb + .word 0x694e2727 + .word 0xcd7fb2b2 + .word 0x9fea7575 + .word 0x1b120909 + .word 0x9e1d8383 + .word 0x74582c2c + .word 0x2e341a1a + .word 0x2d361b1b + .word 0xb2dc6e6e + .word 0xeeb45a5a + .word 0xfb5ba0a0 + .word 0xf6a45252 + .word 0x4d763b3b + .word 0x61b7d6d6 + .word 0xce7db3b3 + .word 0x7b522929 + .word 0x3edde3e3 + .word 0x715e2f2f + .word 0x97138484 + .word 0xf5a65353 + .word 0x68b9d1d1 + .word 0x0 + .word 0x2cc1eded + .word 0x60402020 + .word 0x1fe3fcfc + .word 0xc879b1b1 + .word 0xedb65b5b + .word 0xbed46a6a + .word 0x468dcbcb + .word 0xd967bebe + .word 0x4b723939 + .word 0xde944a4a + .word 0xd4984c4c + .word 0xe8b05858 + .word 0x4a85cfcf + .word 0x6bbbd0d0 + .word 0x2ac5efef + .word 0xe54faaaa + .word 0x16edfbfb + .word 0xc5864343 + .word 0xd79a4d4d + .word 0x55663333 + .word 0x94118585 + .word 0xcf8a4545 + .word 0x10e9f9f9 + .word 0x6040202 + .word 0x81fe7f7f + .word 0xf0a05050 + .word 0x44783c3c + .word 0xba259f9f + .word 0xe34ba8a8 + .word 0xf3a25151 + .word 0xfe5da3a3 + .word 0xc0804040 + .word 0x8a058f8f + .word 0xad3f9292 + .word 0xbc219d9d + .word 0x48703838 + .word 0x4f1f5f5 + .word 0xdf63bcbc + .word 0xc177b6b6 + .word 0x75afdada + .word 0x63422121 + .word 0x30201010 + .word 0x1ae5ffff + .word 0xefdf3f3 + .word 0x6dbfd2d2 + .word 0x4c81cdcd + .word 0x14180c0c + .word 0x35261313 + .word 0x2fc3ecec + .word 0xe1be5f5f + .word 0xa2359797 + .word 0xcc884444 + .word 0x392e1717 + .word 0x5793c4c4 + .word 0xf255a7a7 + .word 0x82fc7e7e + .word 0x477a3d3d + .word 0xacc86464 + .word 0xe7ba5d5d + .word 0x2b321919 + .word 0x95e67373 + .word 0xa0c06060 + .word 0x98198181 + .word 0xd19e4f4f + .word 0x7fa3dcdc + .word 0x66442222 + .word 0x7e542a2a + .word 0xab3b9090 + .word 0x830b8888 + .word 0xca8c4646 + .word 0x29c7eeee + .word 0xd36bb8b8 + .word 0x3c281414 + .word 0x79a7dede + .word 0xe2bc5e5e + .word 0x1d160b0b + .word 0x76addbdb + .word 0x3bdbe0e0 + .word 0x56643232 + .word 0x4e743a3a + .word 0x1e140a0a + .word 0xdb924949 + .word 0xa0c0606 + .word 0x6c482424 + .word 0xe4b85c5c + .word 0x5d9fc2c2 + .word 0x6ebdd3d3 + .word 0xef43acac + .word 0xa6c46262 + .word 0xa8399191 + .word 0xa4319595 + .word 0x37d3e4e4 + .word 0x8bf27979 + .word 0x32d5e7e7 + .word 0x438bc8c8 + .word 0x596e3737 + .word 0xb7da6d6d + .word 0x8c018d8d + .word 0x64b1d5d5 + .word 0xd29c4e4e + .word 0xe049a9a9 + .word 0xb4d86c6c + .word 0xfaac5656 + .word 0x7f3f4f4 + .word 0x25cfeaea + .word 0xafca6565 + .word 0x8ef47a7a + .word 0xe947aeae + .word 0x18100808 + .word 0xd56fbaba + .word 0x88f07878 + .word 0x6f4a2525 + .word 0x725c2e2e + .word 0x24381c1c + .word 0xf157a6a6 + .word 0xc773b4b4 + .word 0x5197c6c6 + .word 0x23cbe8e8 + .word 0x7ca1dddd + .word 0x9ce87474 + .word 0x213e1f1f + .word 0xdd964b4b + .word 0xdc61bdbd + .word 0x860d8b8b + .word 0x850f8a8a + .word 0x90e07070 + .word 0x427c3e3e + .word 0xc471b5b5 + .word 0xaacc6666 + .word 0xd8904848 + .word 0x5060303 + .word 0x1f7f6f6 + .word 0x121c0e0e + .word 0xa3c26161 + .word 0x5f6a3535 + .word 0xf9ae5757 + .word 0xd069b9b9 + .word 0x91178686 + .word 0x5899c1c1 + .word 0x273a1d1d + .word 0xb9279e9e + .word 0x38d9e1e1 + .word 0x13ebf8f8 + .word 0xb32b9898 + .word 0x33221111 + .word 0xbbd26969 + .word 0x70a9d9d9 + .word 0x89078e8e + .word 0xa7339494 + .word 0xb62d9b9b + .word 0x223c1e1e + .word 0x92158787 + .word 0x20c9e9e9 + .word 0x4987cece + .word 0xffaa5555 + .word 0x78502828 + .word 0x7aa5dfdf + .word 0x8f038c8c + .word 0xf859a1a1 + .word 0x80098989 + .word 0x171a0d0d + .word 0xda65bfbf + .word 0x31d7e6e6 + .word 0xc6844242 + .word 0xb8d06868 + .word 0xc3824141 + .word 0xb0299999 + .word 0x775a2d2d + .word 0x111e0f0f + .word 0xcb7bb0b0 + .word 0xfca85454 + .word 0xd66dbbbb + .word 0x3a2c1616 +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT + .text + .type L_AES_Thumb2_td, %object + .size L_AES_Thumb2_td, 12 + .align 4 +L_AES_Thumb2_td: + .word L_AES_Thumb2_td_data +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) + .text + .type L_AES_Thumb2_te, %object + .size L_AES_Thumb2_te, 12 + .align 4 +L_AES_Thumb2_te: + .word L_AES_Thumb2_te_data +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT + .text + .align 4 + .globl AES_invert_key + .type AES_invert_key, %function +AES_invert_key: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + LDR r12, L_AES_Thumb2_te + LDR lr, L_AES_Thumb2_td + ADD r10, r0, r1, LSL #4 + MOV r11, r1 +L_AES_invert_key_loop: + LDM r0, {r2, r3, r4, r5} + LDM r10, {r6, r7, r8, r9} + STM r10, {r2, r3, r4, r5} + STM r0!, {r6, r7, r8, r9} + SUBS r11, r11, #0x2 + SUB r10, r10, #0x10 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_AES_invert_key_loop +#else + BNE.N L_AES_invert_key_loop +#endif + SUB r0, r0, r1, LSL #3 + ADD r0, r0, #0x10 + SUB r11, r1, #0x1 +L_AES_invert_key_mix_loop: + LDM r0, {r2, r3, r4, r5} + UBFX r6, r2, #0, #8 + UBFX r7, r2, #8, #8 + UBFX r8, r2, #16, #8 + LSR r9, r2, #24 + LDRB r6, [r12, r6, LSL #2] + LDRB r7, [r12, r7, LSL #2] + LDRB r8, [r12, r8, LSL #2] + LDRB r9, [r12, r9, LSL #2] + LDR r6, [lr, r6, LSL #2] + LDR r7, [lr, r7, LSL #2] + LDR r8, [lr, r8, LSL #2] + LDR r9, [lr, r9, LSL #2] + EOR r8, r8, r6, ROR #16 + EOR r8, r8, r7, ROR #8 + EOR r8, r8, r9, ROR #24 + STR r8, [r0], #4 + UBFX r6, r3, #0, #8 + UBFX r7, r3, #8, #8 + UBFX r8, r3, #16, #8 + LSR r9, r3, #24 + LDRB r6, [r12, r6, LSL #2] + LDRB r7, [r12, r7, LSL #2] + LDRB r8, [r12, r8, LSL #2] + LDRB r9, [r12, r9, LSL #2] + LDR r6, [lr, r6, LSL #2] + LDR r7, [lr, r7, LSL #2] + LDR r8, [lr, r8, LSL #2] + LDR r9, [lr, r9, LSL #2] + EOR r8, r8, r6, ROR #16 + EOR r8, r8, r7, ROR #8 + EOR r8, r8, r9, ROR #24 + STR r8, [r0], #4 + UBFX r6, r4, #0, #8 + UBFX r7, r4, #8, #8 + UBFX r8, r4, #16, #8 + LSR r9, r4, #24 + LDRB r6, [r12, r6, LSL #2] + LDRB r7, [r12, r7, LSL #2] + LDRB r8, [r12, r8, LSL #2] + LDRB r9, [r12, r9, LSL #2] + LDR r6, [lr, r6, LSL #2] + LDR r7, [lr, r7, LSL #2] + LDR r8, [lr, r8, LSL #2] + LDR r9, [lr, r9, LSL #2] + EOR r8, r8, r6, ROR #16 + EOR r8, r8, r7, ROR #8 + EOR r8, r8, r9, ROR #24 + STR r8, [r0], #4 + UBFX r6, r5, #0, #8 + UBFX r7, r5, #8, #8 + UBFX r8, r5, #16, #8 + LSR r9, r5, #24 + LDRB r6, [r12, r6, LSL #2] + LDRB r7, [r12, r7, LSL #2] + LDRB r8, [r12, r8, LSL #2] + LDRB r9, [r12, r9, LSL #2] + LDR r6, [lr, r6, LSL #2] + LDR r7, [lr, r7, LSL #2] + LDR r8, [lr, r8, LSL #2] + LDR r9, [lr, r9, LSL #2] + EOR r8, r8, r6, ROR #16 + EOR r8, r8, r7, ROR #8 + EOR r8, r8, r9, ROR #24 + STR r8, [r0], #4 + SUBS r11, r11, #0x1 +#ifdef __GNUC__ + BNE L_AES_invert_key_mix_loop +#else + BNE.W L_AES_invert_key_mix_loop +#endif + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 165 */ + .size AES_invert_key,.-AES_invert_key +#endif /* HAVE_AES_DECRYPT */ + .text + .type L_AES_Thumb2_rcon, %object + .size L_AES_Thumb2_rcon, 40 + .align 4 +L_AES_Thumb2_rcon: + .word 0x1000000 + .word 0x2000000 + .word 0x4000000 + .word 0x8000000 + .word 0x10000000 + .word 0x20000000 + .word 0x40000000 + .word 0x80000000 + .word 0x1b000000 + .word 0x36000000 + .text + .align 4 + .globl AES_set_encrypt_key + .type AES_set_encrypt_key, %function +AES_set_encrypt_key: + PUSH {r4, r5, r6, r7, r8, r9, r10, lr} + LDR r10, L_AES_Thumb2_te + ADR lr, L_AES_Thumb2_rcon + CMP r1, #0x80 +#ifdef __GNUC__ + BEQ L_AES_set_encrypt_key_start_128 +#else + BEQ.W L_AES_set_encrypt_key_start_128 +#endif + CMP r1, #0xc0 +#ifdef __GNUC__ + BEQ L_AES_set_encrypt_key_start_192 +#else + BEQ.W L_AES_set_encrypt_key_start_192 +#endif + LDR r4, [r0] + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STM r2!, {r4, r5, r6, r7} + LDR r4, [r0, #16] + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STM r2, {r4, r5, r6, r7} + SUB r2, r2, #0x10 + MOV r12, #0x6 +L_AES_set_encrypt_key_loop_256: + UBFX r4, r7, #0, #8 + UBFX r5, r7, #8, #8 + UBFX r6, r7, #16, #8 + LSR r7, r7, #24 + LDRB r4, [r10, r4, LSL #2] + LDRB r5, [r10, r5, LSL #2] + LDRB r6, [r10, r6, LSL #2] + LDRB r7, [r10, r7, LSL #2] + EOR r3, r7, r4, LSL #8 + EOR r3, r3, r5, LSL #16 + EOR r3, r3, r6, LSL #24 + LDM r2!, {r4, r5, r6, r7} + EOR r4, r4, r3 + LDM lr!, {r3} + EOR r4, r4, r3 + EOR r5, r5, r4 + EOR r6, r6, r5 + EOR r7, r7, r6 + ADD r2, r2, #0x10 + STM r2, {r4, r5, r6, r7} + SUB r2, r2, #0x10 + MOV r3, r7 + UBFX r4, r3, #8, #8 + UBFX r5, r3, #16, #8 + LSR r6, r3, #24 + UBFX r3, r3, #0, #8 + LDRB r4, [r10, r4, LSL #2] + LDRB r6, [r10, r6, LSL #2] + LDRB r5, [r10, r5, LSL #2] + LDRB r3, [r10, r3, LSL #2] + EOR r3, r3, r4, LSL #8 + EOR r3, r3, r5, LSL #16 + EOR r3, r3, r6, LSL #24 + LDM r2!, {r4, r5, r6, r7} + EOR r4, r4, r3 + EOR r5, r5, r4 + EOR r6, r6, r5 + EOR r7, r7, r6 + ADD r2, r2, #0x10 + STM r2, {r4, r5, r6, r7} + SUB r2, r2, #0x10 + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_AES_set_encrypt_key_loop_256 +#else + BNE.N L_AES_set_encrypt_key_loop_256 +#endif + UBFX r4, r7, #0, #8 + UBFX r5, r7, #8, #8 + UBFX r6, r7, #16, #8 + LSR r7, r7, #24 + LDRB r4, [r10, r4, LSL #2] + LDRB r5, [r10, r5, LSL #2] + LDRB r6, [r10, r6, LSL #2] + LDRB r7, [r10, r7, LSL #2] + EOR r3, r7, r4, LSL #8 + EOR r3, r3, r5, LSL #16 + EOR r3, r3, r6, LSL #24 + LDM r2!, {r4, r5, r6, r7} + EOR r4, r4, r3 + LDM lr!, {r3} + EOR r4, r4, r3 + EOR r5, r5, r4 + EOR r6, r6, r5 + EOR r7, r7, r6 + ADD r2, r2, #0x10 + STM r2, {r4, r5, r6, r7} + SUB r2, r2, #0x10 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_set_encrypt_key_end +#else + B.N L_AES_set_encrypt_key_end +#endif +L_AES_set_encrypt_key_start_192: + LDR r4, [r0] + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r8, [r0, #16] + LDR r9, [r0, #20] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + REV r8, r8 + REV r9, r9 + STM r2, {r4, r5, r6, r7} + STRD r8, r9, [r2, #16] + MOV r7, r9 + MOV r12, #0x7 +L_AES_set_encrypt_key_loop_192: + UBFX r4, r9, #0, #8 + UBFX r5, r9, #8, #8 + UBFX r6, r9, #16, #8 + LSR r9, r9, #24 + LDRB r4, [r10, r4, LSL #2] + LDRB r5, [r10, r5, LSL #2] + LDRB r6, [r10, r6, LSL #2] + LDRB r9, [r10, r9, LSL #2] + EOR r3, r9, r4, LSL #8 + EOR r3, r3, r5, LSL #16 + EOR r3, r3, r6, LSL #24 + LDM r2!, {r4, r5, r6, r7, r8, r9} + EOR r4, r4, r3 + LDM lr!, {r3} + EOR r4, r4, r3 + EOR r5, r5, r4 + EOR r6, r6, r5 + EOR r7, r7, r6 + EOR r8, r8, r7 + EOR r9, r9, r8 + STM r2, {r4, r5, r6, r7, r8, r9} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_AES_set_encrypt_key_loop_192 +#else + BNE.N L_AES_set_encrypt_key_loop_192 +#endif + UBFX r4, r9, #0, #8 + UBFX r5, r9, #8, #8 + UBFX r6, r9, #16, #8 + LSR r9, r9, #24 + LDRB r4, [r10, r4, LSL #2] + LDRB r5, [r10, r5, LSL #2] + LDRB r6, [r10, r6, LSL #2] + LDRB r9, [r10, r9, LSL #2] + EOR r3, r9, r4, LSL #8 + EOR r3, r3, r5, LSL #16 + EOR r3, r3, r6, LSL #24 + LDM r2!, {r4, r5, r6, r7, r8, r9} + EOR r4, r4, r3 + LDM lr!, {r3} + EOR r4, r4, r3 + EOR r5, r5, r4 + EOR r6, r6, r5 + EOR r7, r7, r6 + STM r2, {r4, r5, r6, r7} +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_set_encrypt_key_end +#else + B.N L_AES_set_encrypt_key_end +#endif +L_AES_set_encrypt_key_start_128: + LDR r4, [r0] + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STM r2, {r4, r5, r6, r7} + MOV r12, #0xa +L_AES_set_encrypt_key_loop_128: + UBFX r4, r7, #0, #8 + UBFX r5, r7, #8, #8 + UBFX r6, r7, #16, #8 + LSR r7, r7, #24 + LDRB r4, [r10, r4, LSL #2] + LDRB r5, [r10, r5, LSL #2] + LDRB r6, [r10, r6, LSL #2] + LDRB r7, [r10, r7, LSL #2] + EOR r3, r7, r4, LSL #8 + EOR r3, r3, r5, LSL #16 + EOR r3, r3, r6, LSL #24 + LDM r2!, {r4, r5, r6, r7} + EOR r4, r4, r3 + LDM lr!, {r3} + EOR r4, r4, r3 + EOR r5, r5, r4 + EOR r6, r6, r5 + EOR r7, r7, r6 + STM r2, {r4, r5, r6, r7} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_AES_set_encrypt_key_loop_128 +#else + BNE.N L_AES_set_encrypt_key_loop_128 +#endif +L_AES_set_encrypt_key_end: + POP {r4, r5, r6, r7, r8, r9, r10, pc} + /* Cycle Count = 340 */ + .size AES_set_encrypt_key,.-AES_set_encrypt_key + .text + .align 4 + .globl AES_encrypt_block + .type AES_encrypt_block, %function +AES_encrypt_block: + PUSH {lr} +L_AES_encrypt_block_nr: + UBFX r8, r5, #16, #8 + LSR r11, r4, #24 + UBFX lr, r6, #8, #8 + UBFX r2, r7, #0, #8 + LDR r8, [r0, r8, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r9, r6, #16, #8 + EOR r8, r8, r11, ROR #24 + LSR r11, r5, #24 + EOR r8, r8, lr, ROR #8 + UBFX lr, r7, #8, #8 + EOR r8, r8, r2, ROR #16 + UBFX r2, r4, #0, #8 + LDR r9, [r0, r9, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r10, r7, #16, #8 + EOR r9, r9, r11, ROR #24 + LSR r11, r6, #24 + EOR r9, r9, lr, ROR #8 + UBFX lr, r4, #8, #8 + EOR r9, r9, r2, ROR #16 + UBFX r2, r5, #0, #8 + LDR r10, [r0, r10, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r6, r6, #0, #8 + EOR r10, r10, r11, ROR #24 + UBFX r11, r4, #16, #8 + EOR r10, r10, lr, ROR #8 + LSR lr, r7, #24 + EOR r10, r10, r2, ROR #16 + UBFX r2, r5, #8, #8 + LDR r6, [r0, r6, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r2, [r0, r2, LSL #2] + EOR lr, lr, r6, ROR #24 + LDM r3!, {r4, r5, r6, r7} + EOR r11, r11, lr, ROR #24 + EOR r11, r11, r2, ROR #8 + /* XOR in Key Schedule */ + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + UBFX r4, r9, #16, #8 + LSR r7, r8, #24 + UBFX lr, r10, #8, #8 + UBFX r2, r11, #0, #8 + LDR r4, [r0, r4, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r5, r10, #16, #8 + EOR r4, r4, r7, ROR #24 + LSR r7, r9, #24 + EOR r4, r4, lr, ROR #8 + UBFX lr, r11, #8, #8 + EOR r4, r4, r2, ROR #16 + UBFX r2, r8, #0, #8 + LDR r5, [r0, r5, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r6, r11, #16, #8 + EOR r5, r5, r7, ROR #24 + LSR r7, r10, #24 + EOR r5, r5, lr, ROR #8 + UBFX lr, r8, #8, #8 + EOR r5, r5, r2, ROR #16 + UBFX r2, r9, #0, #8 + LDR r6, [r0, r6, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r10, r10, #0, #8 + EOR r6, r6, r7, ROR #24 + UBFX r7, r8, #16, #8 + EOR r6, r6, lr, ROR #8 + LSR lr, r11, #24 + EOR r6, r6, r2, ROR #16 + UBFX r2, r9, #8, #8 + LDR r10, [r0, r10, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR r2, [r0, r2, LSL #2] + EOR lr, lr, r10, ROR #24 + LDM r3!, {r8, r9, r10, r11} + EOR r7, r7, lr, ROR #24 + EOR r7, r7, r2, ROR #8 + /* XOR in Key Schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + SUBS r1, r1, #0x1 +#ifdef __GNUC__ + BNE L_AES_encrypt_block_nr +#else + BNE.W L_AES_encrypt_block_nr +#endif + UBFX r8, r5, #16, #8 + LSR r11, r4, #24 + UBFX lr, r6, #8, #8 + UBFX r2, r7, #0, #8 + LDR r8, [r0, r8, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r9, r6, #16, #8 + EOR r8, r8, r11, ROR #24 + LSR r11, r5, #24 + EOR r8, r8, lr, ROR #8 + UBFX lr, r7, #8, #8 + EOR r8, r8, r2, ROR #16 + UBFX r2, r4, #0, #8 + LDR r9, [r0, r9, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r10, r7, #16, #8 + EOR r9, r9, r11, ROR #24 + LSR r11, r6, #24 + EOR r9, r9, lr, ROR #8 + UBFX lr, r4, #8, #8 + EOR r9, r9, r2, ROR #16 + UBFX r2, r5, #0, #8 + LDR r10, [r0, r10, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r2, [r0, r2, LSL #2] + UBFX r6, r6, #0, #8 + EOR r10, r10, r11, ROR #24 + UBFX r11, r4, #16, #8 + EOR r10, r10, lr, ROR #8 + LSR lr, r7, #24 + EOR r10, r10, r2, ROR #16 + UBFX r2, r5, #8, #8 + LDR r6, [r0, r6, LSL #2] + LDR lr, [r0, lr, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r2, [r0, r2, LSL #2] + EOR lr, lr, r6, ROR #24 + LDM r3!, {r4, r5, r6, r7} + EOR r11, r11, lr, ROR #24 + EOR r11, r11, r2, ROR #8 + /* XOR in Key Schedule */ + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + UBFX r4, r11, #0, #8 + UBFX r7, r10, #8, #8 + UBFX lr, r9, #16, #8 + LSR r2, r8, #24 + LDRB r4, [r0, r4, LSL #2] + LDRB r7, [r0, r7, LSL #2] + LDRB lr, [r0, lr, LSL #2] + LDRB r2, [r0, r2, LSL #2] + UBFX r5, r8, #0, #8 + EOR r4, r4, r7, LSL #8 + UBFX r7, r11, #8, #8 + EOR r4, r4, lr, LSL #16 + UBFX lr, r10, #16, #8 + EOR r4, r4, r2, LSL #24 + LSR r2, r9, #24 + LDRB r5, [r0, r5, LSL #2] + LDRB r7, [r0, r7, LSL #2] + LDRB lr, [r0, lr, LSL #2] + LDRB r2, [r0, r2, LSL #2] + UBFX r6, r9, #0, #8 + EOR r5, r5, r7, LSL #8 + UBFX r7, r8, #8, #8 + EOR r5, r5, lr, LSL #16 + UBFX lr, r11, #16, #8 + EOR r5, r5, r2, LSL #24 + LSR r2, r10, #24 + LDRB r6, [r0, r6, LSL #2] + LDRB r7, [r0, r7, LSL #2] + LDRB lr, [r0, lr, LSL #2] + LDRB r2, [r0, r2, LSL #2] + LSR r11, r11, #24 + EOR r6, r6, r7, LSL #8 + UBFX r7, r10, #0, #8 + EOR r6, r6, lr, LSL #16 + UBFX lr, r9, #8, #8 + EOR r6, r6, r2, LSL #24 + UBFX r2, r8, #16, #8 + LDRB r11, [r0, r11, LSL #2] + LDRB r7, [r0, r7, LSL #2] + LDRB lr, [r0, lr, LSL #2] + LDRB r2, [r0, r2, LSL #2] + EOR lr, lr, r11, LSL #16 + LDM r3, {r8, r9, r10, r11} + EOR r7, r7, lr, LSL #8 + EOR r7, r7, r2, LSL #16 + /* XOR in Key Schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + POP {pc} + /* Cycle Count = 285 */ + .size AES_encrypt_block,.-AES_encrypt_block +#if defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) + .text + .type L_AES_Thumb2_te_ecb, %object + .size L_AES_Thumb2_te_ecb, 12 + .align 4 +L_AES_Thumb2_te_ecb: + .word L_AES_Thumb2_te_data +#endif /* HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) + .text + .align 4 + .globl AES_ECB_encrypt + .type AES_ECB_encrypt, %function +AES_ECB_encrypt: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + MOV lr, r0 + LDR r0, L_AES_Thumb2_te_ecb + LDR r12, [sp, #36] + PUSH {r3} + CMP r12, #0xa +#ifdef __GNUC__ + BEQ L_AES_ECB_encrypt_start_block_128 +#else + BEQ.W L_AES_ECB_encrypt_start_block_128 +#endif + CMP r12, #0xc +#ifdef __GNUC__ + BEQ L_AES_ECB_encrypt_start_block_192 +#else + BEQ.W L_AES_ECB_encrypt_start_block_192 +#endif +L_AES_ECB_encrypt_loop_block_256: + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + PUSH {r1, r2, lr} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x6 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_ECB_encrypt_loop_block_256 +#else + BNE.W L_AES_ECB_encrypt_loop_block_256 +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_ECB_encrypt_end +#else + B.N L_AES_ECB_encrypt_end +#endif +L_AES_ECB_encrypt_start_block_192: +L_AES_ECB_encrypt_loop_block_192: + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + PUSH {r1, r2, lr} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x5 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_ECB_encrypt_loop_block_192 +#else + BNE.W L_AES_ECB_encrypt_loop_block_192 +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_ECB_encrypt_end +#else + B.N L_AES_ECB_encrypt_end +#endif +L_AES_ECB_encrypt_start_block_128: +L_AES_ECB_encrypt_loop_block_128: + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + PUSH {r1, r2, lr} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x4 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_ECB_encrypt_loop_block_128 +#else + BNE.W L_AES_ECB_encrypt_loop_block_128 +#endif +L_AES_ECB_encrypt_end: + POP {r3} + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 212 */ + .size AES_ECB_encrypt,.-AES_ECB_encrypt +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_CBC + .text + .align 4 + .globl AES_CBC_encrypt + .type AES_CBC_encrypt, %function +AES_CBC_encrypt: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + LDR r8, [sp, #36] + LDR r9, [sp, #40] + MOV lr, r0 + LDR r0, L_AES_Thumb2_te_ecb + LDM r9, {r4, r5, r6, r7} + PUSH {r3, r9} + CMP r8, #0xa +#ifdef __GNUC__ + BEQ L_AES_CBC_encrypt_start_block_128 +#else + BEQ.W L_AES_CBC_encrypt_start_block_128 +#endif + CMP r8, #0xc +#ifdef __GNUC__ + BEQ L_AES_CBC_encrypt_start_block_192 +#else + BEQ.W L_AES_CBC_encrypt_start_block_192 +#endif +L_AES_CBC_encrypt_loop_block_256: + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + PUSH {r1, r2, lr} + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x6 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CBC_encrypt_loop_block_256 +#else + BNE.W L_AES_CBC_encrypt_loop_block_256 +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_CBC_encrypt_end +#else + B.N L_AES_CBC_encrypt_end +#endif +L_AES_CBC_encrypt_start_block_192: +L_AES_CBC_encrypt_loop_block_192: + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + PUSH {r1, r2, lr} + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x5 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CBC_encrypt_loop_block_192 +#else + BNE.W L_AES_CBC_encrypt_loop_block_192 +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_CBC_encrypt_end +#else + B.N L_AES_CBC_encrypt_end +#endif +L_AES_CBC_encrypt_start_block_128: +L_AES_CBC_encrypt_loop_block_128: + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + PUSH {r1, r2, lr} + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x4 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CBC_encrypt_loop_block_128 +#else + BNE.W L_AES_CBC_encrypt_loop_block_128 +#endif +L_AES_CBC_encrypt_end: + POP {r3, r9} + STM r9, {r4, r5, r6, r7} + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 238 */ + .size AES_CBC_encrypt,.-AES_CBC_encrypt +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER + .text + .align 4 + .globl AES_CTR_encrypt + .type AES_CTR_encrypt, %function +AES_CTR_encrypt: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + LDR r12, [sp, #36] + LDR r8, [sp, #40] + MOV lr, r0 + LDR r0, L_AES_Thumb2_te_ecb + LDM r8, {r4, r5, r6, r7} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STM r8, {r4, r5, r6, r7} + PUSH {r3, r8} + CMP r12, #0xa +#ifdef __GNUC__ + BEQ L_AES_CTR_encrypt_start_block_128 +#else + BEQ.W L_AES_CTR_encrypt_start_block_128 +#endif + CMP r12, #0xc +#ifdef __GNUC__ + BEQ L_AES_CTR_encrypt_start_block_192 +#else + BEQ.W L_AES_CTR_encrypt_start_block_192 +#endif +L_AES_CTR_encrypt_loop_block_256: + PUSH {r1, r2, lr} + LDR lr, [sp, #16] + ADDS r11, r7, #0x1 + ADCS r10, r6, #0x0 + ADCS r9, r5, #0x0 + ADC r8, r4, #0x0 + STM lr, {r8, r9, r10, r11} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x6 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDR r8, [sp, #4] + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + LDM r8, {r4, r5, r6, r7} + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CTR_encrypt_loop_block_256 +#else + BNE.W L_AES_CTR_encrypt_loop_block_256 +#endif +#ifdef __GNUC__ + B L_AES_CTR_encrypt_end +#else + B.W L_AES_CTR_encrypt_end +#endif +L_AES_CTR_encrypt_start_block_192: +L_AES_CTR_encrypt_loop_block_192: + PUSH {r1, r2, lr} + LDR lr, [sp, #16] + ADDS r11, r7, #0x1 + ADCS r10, r6, #0x0 + ADCS r9, r5, #0x0 + ADC r8, r4, #0x0 + STM lr, {r8, r9, r10, r11} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x5 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDR r8, [sp, #4] + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + LDM r8, {r4, r5, r6, r7} + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CTR_encrypt_loop_block_192 +#else + BNE.W L_AES_CTR_encrypt_loop_block_192 +#endif +#ifdef __GNUC__ + B L_AES_CTR_encrypt_end +#else + B.W L_AES_CTR_encrypt_end +#endif +L_AES_CTR_encrypt_start_block_128: +L_AES_CTR_encrypt_loop_block_128: + PUSH {r1, r2, lr} + LDR lr, [sp, #16] + ADDS r11, r7, #0x1 + ADCS r10, r6, #0x0 + ADCS r9, r5, #0x0 + ADC r8, r4, #0x0 + STM lr, {r8, r9, r10, r11} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x4 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDR r8, [sp, #4] + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + LDM r8, {r4, r5, r6, r7} + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CTR_encrypt_loop_block_128 +#else + BNE.W L_AES_CTR_encrypt_loop_block_128 +#endif +L_AES_CTR_encrypt_end: + POP {r3, r8} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STM r8, {r4, r5, r6, r7} + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 293 */ + .size AES_CTR_encrypt,.-AES_CTR_encrypt +#endif /* WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT +#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC) + .text + .align 4 + .globl AES_decrypt_block + .type AES_decrypt_block, %function +AES_decrypt_block: + PUSH {lr} +L_AES_decrypt_block_nr: + UBFX r8, r7, #16, #8 + LSR r11, r4, #24 + UBFX r12, r6, #8, #8 + UBFX lr, r5, #0, #8 + LDR r8, [r0, r8, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r9, r4, #16, #8 + EOR r8, r8, r11, ROR #24 + LSR r11, r5, #24 + EOR r8, r8, r12, ROR #8 + UBFX r12, r7, #8, #8 + EOR r8, r8, lr, ROR #16 + UBFX lr, r6, #0, #8 + LDR r9, [r0, r9, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r10, r5, #16, #8 + EOR r9, r9, r11, ROR #24 + LSR r11, r6, #24 + EOR r9, r9, r12, ROR #8 + UBFX r12, r4, #8, #8 + EOR r9, r9, lr, ROR #16 + UBFX lr, r7, #0, #8 + LDR r10, [r0, r10, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r4, r4, #0, #8 + EOR r10, r10, r11, ROR #24 + UBFX r11, r6, #16, #8 + EOR r10, r10, r12, ROR #8 + LSR r12, r7, #24 + EOR r10, r10, lr, ROR #16 + UBFX lr, r5, #8, #8 + LDR r4, [r0, r4, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + EOR r12, r12, r4, ROR #24 + LDM r3!, {r4, r5, r6, r7} + EOR r11, r11, lr, ROR #8 + EOR r11, r11, r12, ROR #24 + /* XOR in Key Schedule */ + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + UBFX r4, r11, #16, #8 + LSR r7, r8, #24 + UBFX r12, r10, #8, #8 + UBFX lr, r9, #0, #8 + LDR r4, [r0, r4, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r5, r8, #16, #8 + EOR r4, r4, r7, ROR #24 + LSR r7, r9, #24 + EOR r4, r4, r12, ROR #8 + UBFX r12, r11, #8, #8 + EOR r4, r4, lr, ROR #16 + UBFX lr, r10, #0, #8 + LDR r5, [r0, r5, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r6, r9, #16, #8 + EOR r5, r5, r7, ROR #24 + LSR r7, r10, #24 + EOR r5, r5, r12, ROR #8 + UBFX r12, r8, #8, #8 + EOR r5, r5, lr, ROR #16 + UBFX lr, r11, #0, #8 + LDR r6, [r0, r6, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r8, r8, #0, #8 + EOR r6, r6, r7, ROR #24 + UBFX r7, r10, #16, #8 + EOR r6, r6, r12, ROR #8 + LSR r12, r11, #24 + EOR r6, r6, lr, ROR #16 + UBFX lr, r9, #8, #8 + LDR r8, [r0, r8, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR r7, [r0, r7, LSL #2] + LDR lr, [r0, lr, LSL #2] + EOR r12, r12, r8, ROR #24 + LDM r3!, {r8, r9, r10, r11} + EOR r7, r7, lr, ROR #8 + EOR r7, r7, r12, ROR #24 + /* XOR in Key Schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + SUBS r1, r1, #0x1 +#ifdef __GNUC__ + BNE L_AES_decrypt_block_nr +#else + BNE.W L_AES_decrypt_block_nr +#endif + UBFX r8, r7, #16, #8 + LSR r11, r4, #24 + UBFX r12, r6, #8, #8 + UBFX lr, r5, #0, #8 + LDR r8, [r0, r8, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r9, r4, #16, #8 + EOR r8, r8, r11, ROR #24 + LSR r11, r5, #24 + EOR r8, r8, r12, ROR #8 + UBFX r12, r7, #8, #8 + EOR r8, r8, lr, ROR #16 + UBFX lr, r6, #0, #8 + LDR r9, [r0, r9, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r10, r5, #16, #8 + EOR r9, r9, r11, ROR #24 + LSR r11, r6, #24 + EOR r9, r9, r12, ROR #8 + UBFX r12, r4, #8, #8 + EOR r9, r9, lr, ROR #16 + UBFX lr, r7, #0, #8 + LDR r10, [r0, r10, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR lr, [r0, lr, LSL #2] + UBFX r4, r4, #0, #8 + EOR r10, r10, r11, ROR #24 + UBFX r11, r6, #16, #8 + EOR r10, r10, r12, ROR #8 + LSR r12, r7, #24 + EOR r10, r10, lr, ROR #16 + UBFX lr, r5, #8, #8 + LDR r4, [r0, r4, LSL #2] + LDR r12, [r0, r12, LSL #2] + LDR r11, [r0, r11, LSL #2] + LDR lr, [r0, lr, LSL #2] + EOR r12, r12, r4, ROR #24 + LDM r3!, {r4, r5, r6, r7} + EOR r11, r11, lr, ROR #8 + EOR r11, r11, r12, ROR #24 + /* XOR in Key Schedule */ + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + UBFX r4, r9, #0, #8 + UBFX r7, r10, #8, #8 + UBFX r12, r11, #16, #8 + LSR lr, r8, #24 + LDRB r4, [r2, r4] + LDRB r7, [r2, r7] + LDRB r12, [r2, r12] + LDRB lr, [r2, lr] + UBFX r5, r10, #0, #8 + EOR r4, r4, r7, LSL #8 + UBFX r7, r11, #8, #8 + EOR r4, r4, r12, LSL #16 + UBFX r12, r8, #16, #8 + EOR r4, r4, lr, LSL #24 + LSR lr, r9, #24 + LDRB r7, [r2, r7] + LDRB lr, [r2, lr] + LDRB r5, [r2, r5] + LDRB r12, [r2, r12] + UBFX r6, r11, #0, #8 + EOR r5, r5, r7, LSL #8 + UBFX r7, r8, #8, #8 + EOR r5, r5, r12, LSL #16 + UBFX r12, r9, #16, #8 + EOR r5, r5, lr, LSL #24 + LSR lr, r10, #24 + LDRB r7, [r2, r7] + LDRB lr, [r2, lr] + LDRB r6, [r2, r6] + LDRB r12, [r2, r12] + LSR r11, r11, #24 + EOR r6, r6, r7, LSL #8 + UBFX r7, r8, #0, #8 + EOR r6, r6, r12, LSL #16 + UBFX r12, r9, #8, #8 + EOR r6, r6, lr, LSL #24 + UBFX lr, r10, #16, #8 + LDRB r11, [r2, r11] + LDRB r12, [r2, r12] + LDRB r7, [r2, r7] + LDRB lr, [r2, lr] + EOR r12, r12, r11, LSL #16 + LDM r3, {r8, r9, r10, r11} + EOR r7, r7, r12, LSL #8 + EOR r7, r7, lr, LSL #16 + /* XOR in Key Schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + POP {pc} + /* Cycle Count = 285 */ + .size AES_decrypt_block,.-AES_decrypt_block + .text + .type L_AES_Thumb2_td_ecb, %object + .size L_AES_Thumb2_td_ecb, 12 + .align 4 +L_AES_Thumb2_td_ecb: + .word L_AES_Thumb2_td_data + .text + .type L_AES_Thumb2_td4, %object + .size L_AES_Thumb2_td4, 256 + .align 4 +L_AES_Thumb2_td4: + .byte 0x52 + .byte 0x9 + .byte 0x6a + .byte 0xd5 + .byte 0x30 + .byte 0x36 + .byte 0xa5 + .byte 0x38 + .byte 0xbf + .byte 0x40 + .byte 0xa3 + .byte 0x9e + .byte 0x81 + .byte 0xf3 + .byte 0xd7 + .byte 0xfb + .byte 0x7c + .byte 0xe3 + .byte 0x39 + .byte 0x82 + .byte 0x9b + .byte 0x2f + .byte 0xff + .byte 0x87 + .byte 0x34 + .byte 0x8e + .byte 0x43 + .byte 0x44 + .byte 0xc4 + .byte 0xde + .byte 0xe9 + .byte 0xcb + .byte 0x54 + .byte 0x7b + .byte 0x94 + .byte 0x32 + .byte 0xa6 + .byte 0xc2 + .byte 0x23 + .byte 0x3d + .byte 0xee + .byte 0x4c + .byte 0x95 + .byte 0xb + .byte 0x42 + .byte 0xfa + .byte 0xc3 + .byte 0x4e + .byte 0x8 + .byte 0x2e + .byte 0xa1 + .byte 0x66 + .byte 0x28 + .byte 0xd9 + .byte 0x24 + .byte 0xb2 + .byte 0x76 + .byte 0x5b + .byte 0xa2 + .byte 0x49 + .byte 0x6d + .byte 0x8b + .byte 0xd1 + .byte 0x25 + .byte 0x72 + .byte 0xf8 + .byte 0xf6 + .byte 0x64 + .byte 0x86 + .byte 0x68 + .byte 0x98 + .byte 0x16 + .byte 0xd4 + .byte 0xa4 + .byte 0x5c + .byte 0xcc + .byte 0x5d + .byte 0x65 + .byte 0xb6 + .byte 0x92 + .byte 0x6c + .byte 0x70 + .byte 0x48 + .byte 0x50 + .byte 0xfd + .byte 0xed + .byte 0xb9 + .byte 0xda + .byte 0x5e + .byte 0x15 + .byte 0x46 + .byte 0x57 + .byte 0xa7 + .byte 0x8d + .byte 0x9d + .byte 0x84 + .byte 0x90 + .byte 0xd8 + .byte 0xab + .byte 0x0 + .byte 0x8c + .byte 0xbc + .byte 0xd3 + .byte 0xa + .byte 0xf7 + .byte 0xe4 + .byte 0x58 + .byte 0x5 + .byte 0xb8 + .byte 0xb3 + .byte 0x45 + .byte 0x6 + .byte 0xd0 + .byte 0x2c + .byte 0x1e + .byte 0x8f + .byte 0xca + .byte 0x3f + .byte 0xf + .byte 0x2 + .byte 0xc1 + .byte 0xaf + .byte 0xbd + .byte 0x3 + .byte 0x1 + .byte 0x13 + .byte 0x8a + .byte 0x6b + .byte 0x3a + .byte 0x91 + .byte 0x11 + .byte 0x41 + .byte 0x4f + .byte 0x67 + .byte 0xdc + .byte 0xea + .byte 0x97 + .byte 0xf2 + .byte 0xcf + .byte 0xce + .byte 0xf0 + .byte 0xb4 + .byte 0xe6 + .byte 0x73 + .byte 0x96 + .byte 0xac + .byte 0x74 + .byte 0x22 + .byte 0xe7 + .byte 0xad + .byte 0x35 + .byte 0x85 + .byte 0xe2 + .byte 0xf9 + .byte 0x37 + .byte 0xe8 + .byte 0x1c + .byte 0x75 + .byte 0xdf + .byte 0x6e + .byte 0x47 + .byte 0xf1 + .byte 0x1a + .byte 0x71 + .byte 0x1d + .byte 0x29 + .byte 0xc5 + .byte 0x89 + .byte 0x6f + .byte 0xb7 + .byte 0x62 + .byte 0xe + .byte 0xaa + .byte 0x18 + .byte 0xbe + .byte 0x1b + .byte 0xfc + .byte 0x56 + .byte 0x3e + .byte 0x4b + .byte 0xc6 + .byte 0xd2 + .byte 0x79 + .byte 0x20 + .byte 0x9a + .byte 0xdb + .byte 0xc0 + .byte 0xfe + .byte 0x78 + .byte 0xcd + .byte 0x5a + .byte 0xf4 + .byte 0x1f + .byte 0xdd + .byte 0xa8 + .byte 0x33 + .byte 0x88 + .byte 0x7 + .byte 0xc7 + .byte 0x31 + .byte 0xb1 + .byte 0x12 + .byte 0x10 + .byte 0x59 + .byte 0x27 + .byte 0x80 + .byte 0xec + .byte 0x5f + .byte 0x60 + .byte 0x51 + .byte 0x7f + .byte 0xa9 + .byte 0x19 + .byte 0xb5 + .byte 0x4a + .byte 0xd + .byte 0x2d + .byte 0xe5 + .byte 0x7a + .byte 0x9f + .byte 0x93 + .byte 0xc9 + .byte 0x9c + .byte 0xef + .byte 0xa0 + .byte 0xe0 + .byte 0x3b + .byte 0x4d + .byte 0xae + .byte 0x2a + .byte 0xf5 + .byte 0xb0 + .byte 0xc8 + .byte 0xeb + .byte 0xbb + .byte 0x3c + .byte 0x83 + .byte 0x53 + .byte 0x99 + .byte 0x61 + .byte 0x17 + .byte 0x2b + .byte 0x4 + .byte 0x7e + .byte 0xba + .byte 0x77 + .byte 0xd6 + .byte 0x26 + .byte 0xe1 + .byte 0x69 + .byte 0x14 + .byte 0x63 + .byte 0x55 + .byte 0x21 + .byte 0xc + .byte 0x7d +#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) + .text + .align 4 + .globl AES_ECB_decrypt + .type AES_ECB_decrypt, %function +AES_ECB_decrypt: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + LDR r8, [sp, #36] + MOV lr, r0 + LDR r0, L_AES_Thumb2_td_ecb + MOV r12, r2 + ADR r2, L_AES_Thumb2_td4 + CMP r8, #0xa +#ifdef __GNUC__ + BEQ L_AES_ECB_decrypt_start_block_128 +#else + BEQ.W L_AES_ECB_decrypt_start_block_128 +#endif + CMP r8, #0xc +#ifdef __GNUC__ + BEQ L_AES_ECB_decrypt_start_block_192 +#else + BEQ.W L_AES_ECB_decrypt_start_block_192 +#endif +L_AES_ECB_decrypt_loop_block_256: + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + PUSH {r1, r3, r12, lr} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x6 + BL AES_decrypt_block + POP {r1, r3, r12, lr} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_ECB_decrypt_loop_block_256 +#else + BNE.W L_AES_ECB_decrypt_loop_block_256 +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_ECB_decrypt_end +#else + B.N L_AES_ECB_decrypt_end +#endif +L_AES_ECB_decrypt_start_block_192: +L_AES_ECB_decrypt_loop_block_192: + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + PUSH {r1, r3, r12, lr} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x5 + BL AES_decrypt_block + POP {r1, r3, r12, lr} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_ECB_decrypt_loop_block_192 +#else + BNE.W L_AES_ECB_decrypt_loop_block_192 +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_ECB_decrypt_end +#else + B.N L_AES_ECB_decrypt_end +#endif +L_AES_ECB_decrypt_start_block_128: +L_AES_ECB_decrypt_loop_block_128: + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + PUSH {r1, r3, r12, lr} + LDM r3!, {r8, r9, r10, r11} + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x4 + BL AES_decrypt_block + POP {r1, r3, r12, lr} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_ECB_decrypt_loop_block_128 +#else + BNE.W L_AES_ECB_decrypt_loop_block_128 +#endif +L_AES_ECB_decrypt_end: + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 210 */ + .size AES_ECB_decrypt,.-AES_ECB_decrypt +#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_CBC + .text + .align 4 + .globl AES_CBC_decrypt + .type AES_CBC_decrypt, %function +AES_CBC_decrypt: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + LDR r8, [sp, #36] + LDR r4, [sp, #40] + MOV lr, r0 + LDR r0, L_AES_Thumb2_td_ecb + MOV r12, r2 + ADR r2, L_AES_Thumb2_td4 + PUSH {r3, r4} + CMP r8, #0xa +#ifdef __GNUC__ + BEQ L_AES_CBC_decrypt_loop_block_128 +#else + BEQ.W L_AES_CBC_decrypt_loop_block_128 +#endif + CMP r8, #0xc +#ifdef __GNUC__ + BEQ L_AES_CBC_decrypt_loop_block_192 +#else + BEQ.W L_AES_CBC_decrypt_loop_block_192 +#endif +L_AES_CBC_decrypt_loop_block_256: + PUSH {r1, r12, lr} + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + LDR lr, [sp, #16] + STRD r4, r5, [lr, #16] + STRD r6, r7, [lr, #24] + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x6 + BL AES_decrypt_block + LDR lr, [sp, #16] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDM lr, {r8, r9, r10, r11} + POP {r1, r12, lr} + LDR r3, [sp] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BEQ L_AES_CBC_decrypt_end_odd +#else + BEQ.W L_AES_CBC_decrypt_end_odd +#endif + PUSH {r1, r12, lr} + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + LDR lr, [sp, #16] + STRD r4, r5, [lr] + STRD r6, r7, [lr, #8] + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x6 + BL AES_decrypt_block + LDR lr, [sp, #16] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDRD r8, r9, [lr, #16] + LDRD r10, r11, [lr, #24] + POP {r1, r12, lr} + LDR r3, [sp] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CBC_decrypt_loop_block_256 +#else + BNE.W L_AES_CBC_decrypt_loop_block_256 +#endif +#ifdef __GNUC__ + B L_AES_CBC_decrypt_end +#else + B.W L_AES_CBC_decrypt_end +#endif +L_AES_CBC_decrypt_loop_block_192: + PUSH {r1, r12, lr} + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + LDR lr, [sp, #16] + STRD r4, r5, [lr, #16] + STRD r6, r7, [lr, #24] + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x5 + BL AES_decrypt_block + LDR lr, [sp, #16] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDM lr, {r8, r9, r10, r11} + POP {r1, r12, lr} + LDR r3, [sp] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BEQ L_AES_CBC_decrypt_end_odd +#else + BEQ.W L_AES_CBC_decrypt_end_odd +#endif + PUSH {r1, r12, lr} + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + LDR lr, [sp, #16] + STRD r4, r5, [lr] + STRD r6, r7, [lr, #8] + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x5 + BL AES_decrypt_block + LDR lr, [sp, #16] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDRD r8, r9, [lr, #16] + LDRD r10, r11, [lr, #24] + POP {r1, r12, lr} + LDR r3, [sp] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CBC_decrypt_loop_block_192 +#else + BNE.W L_AES_CBC_decrypt_loop_block_192 +#endif +#ifdef __GNUC__ + B L_AES_CBC_decrypt_end +#else + B.W L_AES_CBC_decrypt_end +#endif +L_AES_CBC_decrypt_loop_block_128: + PUSH {r1, r12, lr} + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + LDR lr, [sp, #16] + STRD r4, r5, [lr, #16] + STRD r6, r7, [lr, #24] + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x4 + BL AES_decrypt_block + LDR lr, [sp, #16] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDM lr, {r8, r9, r10, r11} + POP {r1, r12, lr} + LDR r3, [sp] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BEQ L_AES_CBC_decrypt_end_odd +#else + BEQ.W L_AES_CBC_decrypt_end_odd +#endif + PUSH {r1, r12, lr} + LDR r4, [lr] + LDR r5, [lr, #4] + LDR r6, [lr, #8] + LDR r7, [lr, #12] + LDR lr, [sp, #16] + STRD r4, r5, [lr] + STRD r6, r7, [lr, #8] + LDM r3!, {r8, r9, r10, r11} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x4 + BL AES_decrypt_block + LDR lr, [sp, #16] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDRD r8, r9, [lr, #16] + LDRD r10, r11, [lr, #24] + POP {r1, r12, lr} + LDR r3, [sp] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + SUBS r12, r12, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_CBC_decrypt_loop_block_128 +#else + BNE.W L_AES_CBC_decrypt_loop_block_128 +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + B L_AES_CBC_decrypt_end +#else + B.N L_AES_CBC_decrypt_end +#endif +L_AES_CBC_decrypt_end_odd: + LDR r4, [sp, #4] + LDRD r8, r9, [r4, #16] + LDRD r10, r11, [r4, #24] + STRD r8, r9, [r4] + STRD r10, r11, [r4, #8] +L_AES_CBC_decrypt_end: + POP {r3, r4} + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 518 */ + .size AES_CBC_decrypt,.-AES_CBC_decrypt +#endif /* HAVE_AES_CBC */ +#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#endif /* HAVE_AES_DECRYPT */ +#ifdef HAVE_AESGCM + .text + .type L_GCM_gmult_len_r, %object + .size L_GCM_gmult_len_r, 64 + .align 4 +L_GCM_gmult_len_r: + .word 0x0 + .word 0x1c200000 + .word 0x38400000 + .word 0x24600000 + .word 0x70800000 + .word 0x6ca00000 + .word 0x48c00000 + .word 0x54e00000 + .word 0xe1000000 + .word 0xfd200000 + .word 0xd9400000 + .word 0xc5600000 + .word 0x91800000 + .word 0x8da00000 + .word 0xa9c00000 + .word 0xb5e00000 + .text + .align 4 + .globl GCM_gmult_len + .type GCM_gmult_len, %function +GCM_gmult_len: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + ADR lr, L_GCM_gmult_len_r +L_GCM_gmult_len_start_block: + PUSH {r3} + LDR r12, [r0, #12] + LDR r3, [r2, #12] + EOR r12, r12, r3 + LSR r3, r12, #24 + AND r3, r3, #0xf + ADD r3, r1, r3, LSL #4 + LDM r3, {r8, r9, r10, r11} + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #28 + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #16 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #20 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #8 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #12 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + AND r4, r12, #0xf + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #4 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + LDR r12, [r0, #8] + LDR r3, [r2, #8] + EOR r12, r12, r3 + LSR r3, r12, #24 + AND r3, r3, #0xf + ADD r3, r1, r3, LSL #4 + LDM r3, {r4, r5, r6, r7} + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #28 + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #16 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #20 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #8 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #12 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + AND r4, r12, #0xf + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #4 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + LDR r12, [r0, #4] + LDR r3, [r2, #4] + EOR r12, r12, r3 + LSR r3, r12, #24 + AND r3, r3, #0xf + ADD r3, r1, r3, LSL #4 + LDM r3, {r4, r5, r6, r7} + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #28 + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #16 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #20 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #8 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #12 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + AND r4, r12, #0xf + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #4 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + LDR r12, [r0] + LDR r3, [r2] + EOR r12, r12, r3 + LSR r3, r12, #24 + AND r3, r3, #0xf + ADD r3, r1, r3, LSL #4 + LDM r3, {r4, r5, r6, r7} + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #28 + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #16 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #20 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #8 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #12 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + AND r4, r12, #0xf + EOR r11, r11, r10, LSL #28 + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + LSR r6, r10, #4 + AND r3, r11, #0xf + LSR r11, r11, #4 + LSR r4, r12, #4 + EOR r11, r11, r10, LSL #28 + AND r4, r4, #0xf + LDR r3, [lr, r3, LSL #2] + ADD r4, r1, r4, LSL #4 + EOR r10, r6, r9, LSL #28 + LSR r9, r9, #4 + LDM r4, {r4, r5, r6, r7} + EOR r9, r9, r8, LSL #28 + EOR r8, r3, r8, LSR #4 + EOR r8, r8, r4 + EOR r9, r9, r5 + EOR r10, r10, r6 + EOR r11, r11, r7 + REV r8, r8 + REV r9, r9 + REV r10, r10 + REV r11, r11 + STM r0, {r8, r9, r10, r11} + POP {r3} + SUBS r3, r3, #0x10 + ADD r2, r2, #0x10 +#ifdef __GNUC__ + BNE L_GCM_gmult_len_start_block +#else + BNE.W L_GCM_gmult_len_start_block +#endif + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 742 */ + .size GCM_gmult_len,.-GCM_gmult_len + .text + .type L_AES_Thumb2_te_gcm, %object + .size L_AES_Thumb2_te_gcm, 12 + .align 4 +L_AES_Thumb2_te_gcm: + .word L_AES_Thumb2_te_data + .text + .align 4 + .globl AES_GCM_encrypt + .type AES_GCM_encrypt, %function +AES_GCM_encrypt: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + LDR r12, [sp, #36] + LDR r8, [sp, #40] + MOV lr, r0 + LDR r0, L_AES_Thumb2_te_gcm + LDM r8, {r4, r5, r6, r7} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STM r8, {r4, r5, r6, r7} + PUSH {r3, r8} + CMP r12, #0xa +#ifdef __GNUC__ + BEQ L_AES_GCM_encrypt_start_block_128 +#else + BEQ.W L_AES_GCM_encrypt_start_block_128 +#endif + CMP r12, #0xc +#ifdef __GNUC__ + BEQ L_AES_GCM_encrypt_start_block_192 +#else + BEQ.W L_AES_GCM_encrypt_start_block_192 +#endif +L_AES_GCM_encrypt_loop_block_256: + PUSH {r1, r2, lr} + LDR lr, [sp, #16] + ADD r7, r7, #0x1 + LDM r3!, {r8, r9, r10, r11} + STR r7, [lr, #12] + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x6 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDR r8, [sp, #4] + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + LDM r8, {r4, r5, r6, r7} + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_GCM_encrypt_loop_block_256 +#else + BNE.W L_AES_GCM_encrypt_loop_block_256 +#endif +#ifdef __GNUC__ + B L_AES_GCM_encrypt_end +#else + B.W L_AES_GCM_encrypt_end +#endif +L_AES_GCM_encrypt_start_block_192: +L_AES_GCM_encrypt_loop_block_192: + PUSH {r1, r2, lr} + LDR lr, [sp, #16] + ADD r7, r7, #0x1 + LDM r3!, {r8, r9, r10, r11} + STR r7, [lr, #12] + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x5 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDR r8, [sp, #4] + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + LDM r8, {r4, r5, r6, r7} + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_GCM_encrypt_loop_block_192 +#else + BNE.W L_AES_GCM_encrypt_loop_block_192 +#endif +#ifdef __GNUC__ + B L_AES_GCM_encrypt_end +#else + B.W L_AES_GCM_encrypt_end +#endif +L_AES_GCM_encrypt_start_block_128: +L_AES_GCM_encrypt_loop_block_128: + PUSH {r1, r2, lr} + LDR lr, [sp, #16] + ADD r7, r7, #0x1 + LDM r3!, {r8, r9, r10, r11} + STR r7, [lr, #12] + /* Round: 0 - XOR in key schedule */ + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + MOV r1, #0x4 + BL AES_encrypt_block + POP {r1, r2, lr} + LDR r3, [sp] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + LDR r8, [lr] + LDR r9, [lr, #4] + LDR r10, [lr, #8] + LDR r11, [lr, #12] + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDR r8, [sp, #4] + STR r4, [r1] + STR r5, [r1, #4] + STR r6, [r1, #8] + STR r7, [r1, #12] + LDM r8, {r4, r5, r6, r7} + SUBS r2, r2, #0x10 + ADD lr, lr, #0x10 + ADD r1, r1, #0x10 +#ifdef __GNUC__ + BNE L_AES_GCM_encrypt_loop_block_128 +#else + BNE.W L_AES_GCM_encrypt_loop_block_128 +#endif +L_AES_GCM_encrypt_end: + POP {r3, r8} + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + STM r8, {r4, r5, r6, r7} + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 275 */ + .size AES_GCM_encrypt,.-AES_GCM_encrypt +#endif /* HAVE_AESGCM */ +#endif /* !NO_AES */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm_c.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3052 @@ +/* thumb2-aes-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./aes/aes.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-aes-asm.c + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +#ifndef NO_AES +#include + +#ifdef HAVE_AES_DECRYPT +XALIGNED(16) static const uint32_t L_AES_Thumb2_td_data[] = { + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +XALIGNED(16) static const uint32_t L_AES_Thumb2_te_data[] = { + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT +static const uint32_t* L_AES_Thumb2_td = L_AES_Thumb2_td_data; +#endif /* HAVE_AES_DECRYPT */ +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +static const uint32_t* L_AES_Thumb2_te = L_AES_Thumb2_te_data; +#endif /* HAVE_AES_DECRYPT || HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT +void AES_invert_key(unsigned char* ks, word32 rounds); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_invert_key(unsigned char* ks_p, word32 rounds_p) +#else +void AES_invert_key(unsigned char* ks, word32 rounds) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register unsigned char* ks __asm__ ("r0") = (unsigned char*)ks_p; + register word32 rounds __asm__ ("r1") = (word32)rounds_p; + register uint32_t* L_AES_Thumb2_te_c __asm__ ("r2") = (uint32_t*)L_AES_Thumb2_te; + register uint32_t* L_AES_Thumb2_td_c __asm__ ("r3") = (uint32_t*)L_AES_Thumb2_td; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r12, %[L_AES_Thumb2_te]\n\t" + "MOV lr, %[L_AES_Thumb2_td]\n\t" + "ADD r10, %[ks], %[rounds], LSL #4\n\t" + "MOV r11, %[rounds]\n\t" + "\n" + "L_AES_invert_key_loop%=:\n\t" + "LDM %[ks], {r2, r3, r4, r5}\n\t" + "LDM r10, {r6, r7, r8, r9}\n\t" + "STM r10, {r2, r3, r4, r5}\n\t" + "STM %[ks]!, {r6, r7, r8, r9}\n\t" + "SUBS r11, r11, #0x2\n\t" + "SUB r10, r10, #0x10\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_AES_invert_key_loop%=\n\t" +#else + "BNE.N L_AES_invert_key_loop%=\n\t" +#endif + "SUB %[ks], %[ks], %[rounds], LSL #3\n\t" + "ADD %[ks], %[ks], #0x10\n\t" + "SUB r11, %[rounds], #0x1\n\t" + "\n" + "L_AES_invert_key_mix_loop%=:\n\t" + "LDM %[ks], {r2, r3, r4, r5}\n\t" + "UBFX r6, r2, #0, #8\n\t" + "UBFX r7, r2, #8, #8\n\t" + "UBFX r8, r2, #16, #8\n\t" + "LSR r9, r2, #24\n\t" + "LDRB r6, [r12, r6, LSL #2]\n\t" + "LDRB r7, [r12, r7, LSL #2]\n\t" + "LDRB r8, [r12, r8, LSL #2]\n\t" + "LDRB r9, [r12, r9, LSL #2]\n\t" + "LDR r6, [lr, r6, LSL #2]\n\t" + "LDR r7, [lr, r7, LSL #2]\n\t" + "LDR r8, [lr, r8, LSL #2]\n\t" + "LDR r9, [lr, r9, LSL #2]\n\t" + "EOR r8, r8, r6, ROR #16\n\t" + "EOR r8, r8, r7, ROR #8\n\t" + "EOR r8, r8, r9, ROR #24\n\t" + "STR r8, [%[ks]], #4\n\t" + "UBFX r6, r3, #0, #8\n\t" + "UBFX r7, r3, #8, #8\n\t" + "UBFX r8, r3, #16, #8\n\t" + "LSR r9, r3, #24\n\t" + "LDRB r6, [r12, r6, LSL #2]\n\t" + "LDRB r7, [r12, r7, LSL #2]\n\t" + "LDRB r8, [r12, r8, LSL #2]\n\t" + "LDRB r9, [r12, r9, LSL #2]\n\t" + "LDR r6, [lr, r6, LSL #2]\n\t" + "LDR r7, [lr, r7, LSL #2]\n\t" + "LDR r8, [lr, r8, LSL #2]\n\t" + "LDR r9, [lr, r9, LSL #2]\n\t" + "EOR r8, r8, r6, ROR #16\n\t" + "EOR r8, r8, r7, ROR #8\n\t" + "EOR r8, r8, r9, ROR #24\n\t" + "STR r8, [%[ks]], #4\n\t" + "UBFX r6, r4, #0, #8\n\t" + "UBFX r7, r4, #8, #8\n\t" + "UBFX r8, r4, #16, #8\n\t" + "LSR r9, r4, #24\n\t" + "LDRB r6, [r12, r6, LSL #2]\n\t" + "LDRB r7, [r12, r7, LSL #2]\n\t" + "LDRB r8, [r12, r8, LSL #2]\n\t" + "LDRB r9, [r12, r9, LSL #2]\n\t" + "LDR r6, [lr, r6, LSL #2]\n\t" + "LDR r7, [lr, r7, LSL #2]\n\t" + "LDR r8, [lr, r8, LSL #2]\n\t" + "LDR r9, [lr, r9, LSL #2]\n\t" + "EOR r8, r8, r6, ROR #16\n\t" + "EOR r8, r8, r7, ROR #8\n\t" + "EOR r8, r8, r9, ROR #24\n\t" + "STR r8, [%[ks]], #4\n\t" + "UBFX r6, r5, #0, #8\n\t" + "UBFX r7, r5, #8, #8\n\t" + "UBFX r8, r5, #16, #8\n\t" + "LSR r9, r5, #24\n\t" + "LDRB r6, [r12, r6, LSL #2]\n\t" + "LDRB r7, [r12, r7, LSL #2]\n\t" + "LDRB r8, [r12, r8, LSL #2]\n\t" + "LDRB r9, [r12, r9, LSL #2]\n\t" + "LDR r6, [lr, r6, LSL #2]\n\t" + "LDR r7, [lr, r7, LSL #2]\n\t" + "LDR r8, [lr, r8, LSL #2]\n\t" + "LDR r9, [lr, r9, LSL #2]\n\t" + "EOR r8, r8, r6, ROR #16\n\t" + "EOR r8, r8, r7, ROR #8\n\t" + "EOR r8, r8, r9, ROR #24\n\t" + "STR r8, [%[ks]], #4\n\t" + "SUBS r11, r11, #0x1\n\t" +#ifdef __GNUC__ + "BNE L_AES_invert_key_mix_loop%=\n\t" +#else + "BNE.W L_AES_invert_key_mix_loop%=\n\t" +#endif +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [ks] "+r" (ks), [rounds] "+r" (rounds), + [L_AES_Thumb2_te] "+r" (L_AES_Thumb2_te_c), [L_AES_Thumb2_td] "+r" (L_AES_Thumb2_td_c) + : + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" +#else + : [ks] "+r" (ks), [rounds] "+r" (rounds) + : [L_AES_Thumb2_te] "r" (L_AES_Thumb2_te), [L_AES_Thumb2_td] "r" (L_AES_Thumb2_td) + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +} + +#endif /* HAVE_AES_DECRYPT */ +XALIGNED(16) static const uint32_t L_AES_Thumb2_rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000 +}; + +void AES_set_encrypt_key(const unsigned char* key, word32 len, + unsigned char* ks); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_set_encrypt_key(const unsigned char* key_p, word32 len_p, unsigned char* ks_p) +#else +void AES_set_encrypt_key(const unsigned char* key, word32 len, unsigned char* ks) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const unsigned char* key __asm__ ("r0") = (const unsigned char*)key_p; + register word32 len __asm__ ("r1") = (word32)len_p; + register unsigned char* ks __asm__ ("r2") = (unsigned char*)ks_p; + register uint32_t* L_AES_Thumb2_te_c __asm__ ("r3") = (uint32_t*)L_AES_Thumb2_te; + register uint32_t* L_AES_Thumb2_rcon_c __asm__ ("r4") = (uint32_t*)&L_AES_Thumb2_rcon; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, %[L_AES_Thumb2_te]\n\t" + "MOV lr, %[L_AES_Thumb2_rcon]\n\t" + "CMP %[len], #0x80\n\t" +#ifdef __GNUC__ + "BEQ L_AES_set_encrypt_key_start_128%=\n\t" +#else + "BEQ.W L_AES_set_encrypt_key_start_128%=\n\t" +#endif + "CMP %[len], #0xc0\n\t" +#ifdef __GNUC__ + "BEQ L_AES_set_encrypt_key_start_192%=\n\t" +#else + "BEQ.W L_AES_set_encrypt_key_start_192%=\n\t" +#endif + "LDR r4, [%[key]]\n\t" + "LDR r5, [%[key], #4]\n\t" + "LDR r6, [%[key], #8]\n\t" + "LDR r7, [%[key], #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STM %[ks]!, {r4, r5, r6, r7}\n\t" + "LDR r4, [%[key], #16]\n\t" + "LDR r5, [%[key], #20]\n\t" + "LDR r6, [%[key], #24]\n\t" + "LDR r7, [%[key], #28]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" + "SUB %[ks], %[ks], #0x10\n\t" + "MOV r12, #0x6\n\t" + "\n" + "L_AES_set_encrypt_key_loop_256%=:\n\t" + "UBFX r4, r7, #0, #8\n\t" + "UBFX r5, r7, #8, #8\n\t" + "UBFX r6, r7, #16, #8\n\t" + "LSR r7, r7, #24\n\t" + "LDRB r4, [r10, r4, LSL #2]\n\t" + "LDRB r5, [r10, r5, LSL #2]\n\t" + "LDRB r6, [r10, r6, LSL #2]\n\t" + "LDRB r7, [r10, r7, LSL #2]\n\t" + "EOR r3, r7, r4, LSL #8\n\t" + "EOR r3, r3, r5, LSL #16\n\t" + "EOR r3, r3, r6, LSL #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7}\n\t" + "EOR r4, r4, r3\n\t" + "LDM lr!, {r3}\n\t" + "EOR r4, r4, r3\n\t" + "EOR r5, r5, r4\n\t" + "EOR r6, r6, r5\n\t" + "EOR r7, r7, r6\n\t" + "ADD %[ks], %[ks], #0x10\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" + "SUB %[ks], %[ks], #0x10\n\t" + "MOV r3, r7\n\t" + "UBFX r4, r3, #8, #8\n\t" + "UBFX r5, r3, #16, #8\n\t" + "LSR r6, r3, #24\n\t" + "UBFX r3, r3, #0, #8\n\t" + "LDRB r4, [r10, r4, LSL #2]\n\t" + "LDRB r6, [r10, r6, LSL #2]\n\t" + "LDRB r5, [r10, r5, LSL #2]\n\t" + "LDRB r3, [r10, r3, LSL #2]\n\t" + "EOR r3, r3, r4, LSL #8\n\t" + "EOR r3, r3, r5, LSL #16\n\t" + "EOR r3, r3, r6, LSL #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7}\n\t" + "EOR r4, r4, r3\n\t" + "EOR r5, r5, r4\n\t" + "EOR r6, r6, r5\n\t" + "EOR r7, r7, r6\n\t" + "ADD %[ks], %[ks], #0x10\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" + "SUB %[ks], %[ks], #0x10\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_AES_set_encrypt_key_loop_256%=\n\t" +#else + "BNE.N L_AES_set_encrypt_key_loop_256%=\n\t" +#endif + "UBFX r4, r7, #0, #8\n\t" + "UBFX r5, r7, #8, #8\n\t" + "UBFX r6, r7, #16, #8\n\t" + "LSR r7, r7, #24\n\t" + "LDRB r4, [r10, r4, LSL #2]\n\t" + "LDRB r5, [r10, r5, LSL #2]\n\t" + "LDRB r6, [r10, r6, LSL #2]\n\t" + "LDRB r7, [r10, r7, LSL #2]\n\t" + "EOR r3, r7, r4, LSL #8\n\t" + "EOR r3, r3, r5, LSL #16\n\t" + "EOR r3, r3, r6, LSL #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7}\n\t" + "EOR r4, r4, r3\n\t" + "LDM lr!, {r3}\n\t" + "EOR r4, r4, r3\n\t" + "EOR r5, r5, r4\n\t" + "EOR r6, r6, r5\n\t" + "EOR r7, r7, r6\n\t" + "ADD %[ks], %[ks], #0x10\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" + "SUB %[ks], %[ks], #0x10\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_set_encrypt_key_end%=\n\t" +#else + "B.N L_AES_set_encrypt_key_end%=\n\t" +#endif + "\n" + "L_AES_set_encrypt_key_start_192%=:\n\t" + "LDR r4, [%[key]]\n\t" + "LDR r5, [%[key], #4]\n\t" + "LDR r6, [%[key], #8]\n\t" + "LDR r7, [%[key], #12]\n\t" + "LDR r8, [%[key], #16]\n\t" + "LDR r9, [%[key], #20]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" + "STRD r8, r9, [%[ks], #16]\n\t" + "MOV r7, r9\n\t" + "MOV r12, #0x7\n\t" + "\n" + "L_AES_set_encrypt_key_loop_192%=:\n\t" + "UBFX r4, r9, #0, #8\n\t" + "UBFX r5, r9, #8, #8\n\t" + "UBFX r6, r9, #16, #8\n\t" + "LSR r9, r9, #24\n\t" + "LDRB r4, [r10, r4, LSL #2]\n\t" + "LDRB r5, [r10, r5, LSL #2]\n\t" + "LDRB r6, [r10, r6, LSL #2]\n\t" + "LDRB r9, [r10, r9, LSL #2]\n\t" + "EOR r3, r9, r4, LSL #8\n\t" + "EOR r3, r3, r5, LSL #16\n\t" + "EOR r3, r3, r6, LSL #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7, r8, r9}\n\t" + "EOR r4, r4, r3\n\t" + "LDM lr!, {r3}\n\t" + "EOR r4, r4, r3\n\t" + "EOR r5, r5, r4\n\t" + "EOR r6, r6, r5\n\t" + "EOR r7, r7, r6\n\t" + "EOR r8, r8, r7\n\t" + "EOR r9, r9, r8\n\t" + "STM %[ks], {r4, r5, r6, r7, r8, r9}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_AES_set_encrypt_key_loop_192%=\n\t" +#else + "BNE.N L_AES_set_encrypt_key_loop_192%=\n\t" +#endif + "UBFX r4, r9, #0, #8\n\t" + "UBFX r5, r9, #8, #8\n\t" + "UBFX r6, r9, #16, #8\n\t" + "LSR r9, r9, #24\n\t" + "LDRB r4, [r10, r4, LSL #2]\n\t" + "LDRB r5, [r10, r5, LSL #2]\n\t" + "LDRB r6, [r10, r6, LSL #2]\n\t" + "LDRB r9, [r10, r9, LSL #2]\n\t" + "EOR r3, r9, r4, LSL #8\n\t" + "EOR r3, r3, r5, LSL #16\n\t" + "EOR r3, r3, r6, LSL #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7, r8, r9}\n\t" + "EOR r4, r4, r3\n\t" + "LDM lr!, {r3}\n\t" + "EOR r4, r4, r3\n\t" + "EOR r5, r5, r4\n\t" + "EOR r6, r6, r5\n\t" + "EOR r7, r7, r6\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_set_encrypt_key_end%=\n\t" +#else + "B.N L_AES_set_encrypt_key_end%=\n\t" +#endif + "\n" + "L_AES_set_encrypt_key_start_128%=:\n\t" + "LDR r4, [%[key]]\n\t" + "LDR r5, [%[key], #4]\n\t" + "LDR r6, [%[key], #8]\n\t" + "LDR r7, [%[key], #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" + "MOV r12, #0xa\n\t" + "\n" + "L_AES_set_encrypt_key_loop_128%=:\n\t" + "UBFX r4, r7, #0, #8\n\t" + "UBFX r5, r7, #8, #8\n\t" + "UBFX r6, r7, #16, #8\n\t" + "LSR r7, r7, #24\n\t" + "LDRB r4, [r10, r4, LSL #2]\n\t" + "LDRB r5, [r10, r5, LSL #2]\n\t" + "LDRB r6, [r10, r6, LSL #2]\n\t" + "LDRB r7, [r10, r7, LSL #2]\n\t" + "EOR r3, r7, r4, LSL #8\n\t" + "EOR r3, r3, r5, LSL #16\n\t" + "EOR r3, r3, r6, LSL #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7}\n\t" + "EOR r4, r4, r3\n\t" + "LDM lr!, {r3}\n\t" + "EOR r4, r4, r3\n\t" + "EOR r5, r5, r4\n\t" + "EOR r6, r6, r5\n\t" + "EOR r7, r7, r6\n\t" + "STM %[ks], {r4, r5, r6, r7}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_AES_set_encrypt_key_loop_128%=\n\t" +#else + "BNE.N L_AES_set_encrypt_key_loop_128%=\n\t" +#endif + "\n" + "L_AES_set_encrypt_key_end%=:\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [key] "+r" (key), [len] "+r" (len), [ks] "+r" (ks), + [L_AES_Thumb2_te] "+r" (L_AES_Thumb2_te_c), [L_AES_Thumb2_rcon] "+r" (L_AES_Thumb2_rcon_c) + : + : "memory", "r12", "lr", "r5", "r6", "r7", "r8", "r9", "r10", "cc" +#else + : [key] "+r" (key), [len] "+r" (len), [ks] "+r" (ks) + : [L_AES_Thumb2_te] "r" (L_AES_Thumb2_te), [L_AES_Thumb2_rcon] "r" (L_AES_Thumb2_rcon) + : "memory", "r12", "lr", "r5", "r6", "r7", "r8", "r9", "r10", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +} + +void AES_encrypt_block(const uint32_t* te, int nr, int len, const uint32_t* ks); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_encrypt_block(const uint32_t* te_p, int nr_p, int len_p, const uint32_t* ks_p) +#else +void AES_encrypt_block(const uint32_t* te, int nr, int len, const uint32_t* ks) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const uint32_t* te __asm__ ("r0") = (const uint32_t*)te_p; + register int nr __asm__ ("r1") = (int)nr_p; + register int len __asm__ ("r2") = (int)len_p; + register const uint32_t* ks __asm__ ("r3") = (const uint32_t*)ks_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "\n" + "L_AES_encrypt_block_nr%=:\n\t" + "UBFX r8, r5, #16, #8\n\t" + "LSR r11, r4, #24\n\t" + "UBFX lr, r6, #8, #8\n\t" + "UBFX r2, r7, #0, #8\n\t" + "LDR r8, [%[te], r8, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r9, r6, #16, #8\n\t" + "EOR r8, r8, r11, ROR #24\n\t" + "LSR r11, r5, #24\n\t" + "EOR r8, r8, lr, ROR #8\n\t" + "UBFX lr, r7, #8, #8\n\t" + "EOR r8, r8, r2, ROR #16\n\t" + "UBFX r2, r4, #0, #8\n\t" + "LDR r9, [%[te], r9, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r10, r7, #16, #8\n\t" + "EOR r9, r9, r11, ROR #24\n\t" + "LSR r11, r6, #24\n\t" + "EOR r9, r9, lr, ROR #8\n\t" + "UBFX lr, r4, #8, #8\n\t" + "EOR r9, r9, r2, ROR #16\n\t" + "UBFX r2, r5, #0, #8\n\t" + "LDR r10, [%[te], r10, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r6, r6, #0, #8\n\t" + "EOR r10, r10, r11, ROR #24\n\t" + "UBFX r11, r4, #16, #8\n\t" + "EOR r10, r10, lr, ROR #8\n\t" + "LSR lr, r7, #24\n\t" + "EOR r10, r10, r2, ROR #16\n\t" + "UBFX r2, r5, #8, #8\n\t" + "LDR r6, [%[te], r6, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "EOR lr, lr, r6, ROR #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7}\n\t" + "EOR r11, r11, lr, ROR #24\n\t" + "EOR r11, r11, r2, ROR #8\n\t" + /* XOR in Key Schedule */ + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "UBFX r4, r9, #16, #8\n\t" + "LSR r7, r8, #24\n\t" + "UBFX lr, r10, #8, #8\n\t" + "UBFX r2, r11, #0, #8\n\t" + "LDR r4, [%[te], r4, LSL #2]\n\t" + "LDR r7, [%[te], r7, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r5, r10, #16, #8\n\t" + "EOR r4, r4, r7, ROR #24\n\t" + "LSR r7, r9, #24\n\t" + "EOR r4, r4, lr, ROR #8\n\t" + "UBFX lr, r11, #8, #8\n\t" + "EOR r4, r4, r2, ROR #16\n\t" + "UBFX r2, r8, #0, #8\n\t" + "LDR r5, [%[te], r5, LSL #2]\n\t" + "LDR r7, [%[te], r7, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r6, r11, #16, #8\n\t" + "EOR r5, r5, r7, ROR #24\n\t" + "LSR r7, r10, #24\n\t" + "EOR r5, r5, lr, ROR #8\n\t" + "UBFX lr, r8, #8, #8\n\t" + "EOR r5, r5, r2, ROR #16\n\t" + "UBFX r2, r9, #0, #8\n\t" + "LDR r6, [%[te], r6, LSL #2]\n\t" + "LDR r7, [%[te], r7, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r10, r10, #0, #8\n\t" + "EOR r6, r6, r7, ROR #24\n\t" + "UBFX r7, r8, #16, #8\n\t" + "EOR r6, r6, lr, ROR #8\n\t" + "LSR lr, r11, #24\n\t" + "EOR r6, r6, r2, ROR #16\n\t" + "UBFX r2, r9, #8, #8\n\t" + "LDR r10, [%[te], r10, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r7, [%[te], r7, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "EOR lr, lr, r10, ROR #24\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "EOR r7, r7, lr, ROR #24\n\t" + "EOR r7, r7, r2, ROR #8\n\t" + /* XOR in Key Schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "SUBS %[nr], %[nr], #0x1\n\t" +#ifdef __GNUC__ + "BNE L_AES_encrypt_block_nr%=\n\t" +#else + "BNE.W L_AES_encrypt_block_nr%=\n\t" +#endif + "UBFX r8, r5, #16, #8\n\t" + "LSR r11, r4, #24\n\t" + "UBFX lr, r6, #8, #8\n\t" + "UBFX r2, r7, #0, #8\n\t" + "LDR r8, [%[te], r8, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r9, r6, #16, #8\n\t" + "EOR r8, r8, r11, ROR #24\n\t" + "LSR r11, r5, #24\n\t" + "EOR r8, r8, lr, ROR #8\n\t" + "UBFX lr, r7, #8, #8\n\t" + "EOR r8, r8, r2, ROR #16\n\t" + "UBFX r2, r4, #0, #8\n\t" + "LDR r9, [%[te], r9, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r10, r7, #16, #8\n\t" + "EOR r9, r9, r11, ROR #24\n\t" + "LSR r11, r6, #24\n\t" + "EOR r9, r9, lr, ROR #8\n\t" + "UBFX lr, r4, #8, #8\n\t" + "EOR r9, r9, r2, ROR #16\n\t" + "UBFX r2, r5, #0, #8\n\t" + "LDR r10, [%[te], r10, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "UBFX r6, r6, #0, #8\n\t" + "EOR r10, r10, r11, ROR #24\n\t" + "UBFX r11, r4, #16, #8\n\t" + "EOR r10, r10, lr, ROR #8\n\t" + "LSR lr, r7, #24\n\t" + "EOR r10, r10, r2, ROR #16\n\t" + "UBFX r2, r5, #8, #8\n\t" + "LDR r6, [%[te], r6, LSL #2]\n\t" + "LDR lr, [%[te], lr, LSL #2]\n\t" + "LDR r11, [%[te], r11, LSL #2]\n\t" + "LDR r2, [%[te], r2, LSL #2]\n\t" + "EOR lr, lr, r6, ROR #24\n\t" + "LDM %[ks]!, {r4, r5, r6, r7}\n\t" + "EOR r11, r11, lr, ROR #24\n\t" + "EOR r11, r11, r2, ROR #8\n\t" + /* XOR in Key Schedule */ + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "UBFX r4, r11, #0, #8\n\t" + "UBFX r7, r10, #8, #8\n\t" + "UBFX lr, r9, #16, #8\n\t" + "LSR r2, r8, #24\n\t" + "LDRB r4, [%[te], r4, LSL #2]\n\t" + "LDRB r7, [%[te], r7, LSL #2]\n\t" + "LDRB lr, [%[te], lr, LSL #2]\n\t" + "LDRB r2, [%[te], r2, LSL #2]\n\t" + "UBFX r5, r8, #0, #8\n\t" + "EOR r4, r4, r7, LSL #8\n\t" + "UBFX r7, r11, #8, #8\n\t" + "EOR r4, r4, lr, LSL #16\n\t" + "UBFX lr, r10, #16, #8\n\t" + "EOR r4, r4, r2, LSL #24\n\t" + "LSR r2, r9, #24\n\t" + "LDRB r5, [%[te], r5, LSL #2]\n\t" + "LDRB r7, [%[te], r7, LSL #2]\n\t" + "LDRB lr, [%[te], lr, LSL #2]\n\t" + "LDRB r2, [%[te], r2, LSL #2]\n\t" + "UBFX r6, r9, #0, #8\n\t" + "EOR r5, r5, r7, LSL #8\n\t" + "UBFX r7, r8, #8, #8\n\t" + "EOR r5, r5, lr, LSL #16\n\t" + "UBFX lr, r11, #16, #8\n\t" + "EOR r5, r5, r2, LSL #24\n\t" + "LSR r2, r10, #24\n\t" + "LDRB r6, [%[te], r6, LSL #2]\n\t" + "LDRB r7, [%[te], r7, LSL #2]\n\t" + "LDRB lr, [%[te], lr, LSL #2]\n\t" + "LDRB r2, [%[te], r2, LSL #2]\n\t" + "LSR r11, r11, #24\n\t" + "EOR r6, r6, r7, LSL #8\n\t" + "UBFX r7, r10, #0, #8\n\t" + "EOR r6, r6, lr, LSL #16\n\t" + "UBFX lr, r9, #8, #8\n\t" + "EOR r6, r6, r2, LSL #24\n\t" + "UBFX r2, r8, #16, #8\n\t" + "LDRB r11, [%[te], r11, LSL #2]\n\t" + "LDRB r7, [%[te], r7, LSL #2]\n\t" + "LDRB lr, [%[te], lr, LSL #2]\n\t" + "LDRB r2, [%[te], r2, LSL #2]\n\t" + "EOR lr, lr, r11, LSL #16\n\t" + "LDM %[ks], {r8, r9, r10, r11}\n\t" + "EOR r7, r7, lr, LSL #8\n\t" + "EOR r7, r7, r2, LSL #16\n\t" + /* XOR in Key Schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + : [te] "+r" (te), [nr] "+r" (nr), [len] "+r" (len), [ks] "+r" (ks) + : + : "memory", "lr", "cc" + ); +} + +#if defined(HAVE_AES_CBC) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +static const uint32_t* L_AES_Thumb2_te_ecb = L_AES_Thumb2_te_data; +#endif /* HAVE_AES_CBC || HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#if defined(HAVE_AESCCM) || defined(HAVE_AESGCM) || defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +void AES_ECB_encrypt(const unsigned char* in, unsigned char* out, + unsigned long len, const unsigned char* ks, int nr); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_ECB_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p) +#else +void AES_ECB_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const unsigned char* in __asm__ ("r0") = (const unsigned char*)in_p; + register unsigned char* out __asm__ ("r1") = (unsigned char*)out_p; + register unsigned long len __asm__ ("r2") = (unsigned long)len_p; + register const unsigned char* ks __asm__ ("r3") = (const unsigned char*)ks_p; + register int nr __asm__ ("r4") = (int)nr_p; + register uint32_t* L_AES_Thumb2_te_ecb_c __asm__ ("r5") = (uint32_t*)L_AES_Thumb2_te_ecb; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV lr, %[in]\n\t" + "MOV r0, %[L_AES_Thumb2_te_ecb]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r12, r4\n\t" +#else + "LDR r12, [sp, #36]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + "PUSH {%[ks]}\n\t" + "CMP r12, #0xa\n\t" +#ifdef __GNUC__ + "BEQ L_AES_ECB_encrypt_start_block_128%=\n\t" +#else + "BEQ.W L_AES_ECB_encrypt_start_block_128%=\n\t" +#endif + "CMP r12, #0xc\n\t" +#ifdef __GNUC__ + "BEQ L_AES_ECB_encrypt_start_block_192%=\n\t" +#else + "BEQ.W L_AES_ECB_encrypt_start_block_192%=\n\t" +#endif + "\n" + "L_AES_ECB_encrypt_loop_block_256%=:\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x6\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_ECB_encrypt_loop_block_256%=\n\t" +#else + "BNE.W L_AES_ECB_encrypt_loop_block_256%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_ECB_encrypt_end%=\n\t" +#else + "B.N L_AES_ECB_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_ECB_encrypt_start_block_192%=:\n\t" + "\n" + "L_AES_ECB_encrypt_loop_block_192%=:\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x5\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_ECB_encrypt_loop_block_192%=\n\t" +#else + "BNE.W L_AES_ECB_encrypt_loop_block_192%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_ECB_encrypt_end%=\n\t" +#else + "B.N L_AES_ECB_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_ECB_encrypt_start_block_128%=:\n\t" + "\n" + "L_AES_ECB_encrypt_loop_block_128%=:\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x4\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_ECB_encrypt_loop_block_128%=\n\t" +#else + "BNE.W L_AES_ECB_encrypt_loop_block_128%=\n\t" +#endif + "\n" + "L_AES_ECB_encrypt_end%=:\n\t" + "POP {%[ks]}\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), + [L_AES_Thumb2_te_ecb] "+r" (L_AES_Thumb2_te_ecb_c) + : + : "memory", "r12", "lr", "r6", "r7", "r8", "r9", "r10", "r11", "cc" +#else + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks) + : [L_AES_Thumb2_te_ecb] "r" (L_AES_Thumb2_te_ecb) + : "memory", "r12", "lr", "r4", "r6", "r7", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)nr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#endif /* HAVE_AESCCM || HAVE_AESGCM || WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_CBC +void AES_CBC_encrypt(const unsigned char* in, unsigned char* out, + unsigned long len, const unsigned char* ks, int nr, unsigned char* iv); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_CBC_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* iv_p) +#else +void AES_CBC_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* iv) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const unsigned char* in __asm__ ("r0") = (const unsigned char*)in_p; + register unsigned char* out __asm__ ("r1") = (unsigned char*)out_p; + register unsigned long len __asm__ ("r2") = (unsigned long)len_p; + register const unsigned char* ks __asm__ ("r3") = (const unsigned char*)ks_p; + register int nr __asm__ ("r4") = (int)nr_p; + register unsigned char* iv __asm__ ("r5") = (unsigned char*)iv_p; + register uint32_t* L_AES_Thumb2_te_ecb_c __asm__ ("r6") = (uint32_t*)L_AES_Thumb2_te_ecb; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r8, r4\n\t" +#else + "LDR r8, [sp, #36]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r9, r5\n\t" +#else + "LDR r9, [sp, #40]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[in]\n\t" + "MOV r0, %[L_AES_Thumb2_te_ecb]\n\t" + "LDM r9, {r4, r5, r6, r7}\n\t" + "PUSH {%[ks], r9}\n\t" + "CMP r8, #0xa\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CBC_encrypt_start_block_128%=\n\t" +#else + "BEQ.W L_AES_CBC_encrypt_start_block_128%=\n\t" +#endif + "CMP r8, #0xc\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CBC_encrypt_start_block_192%=\n\t" +#else + "BEQ.W L_AES_CBC_encrypt_start_block_192%=\n\t" +#endif + "\n" + "L_AES_CBC_encrypt_loop_block_256%=:\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x6\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CBC_encrypt_loop_block_256%=\n\t" +#else + "BNE.W L_AES_CBC_encrypt_loop_block_256%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_CBC_encrypt_end%=\n\t" +#else + "B.N L_AES_CBC_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_CBC_encrypt_start_block_192%=:\n\t" + "\n" + "L_AES_CBC_encrypt_loop_block_192%=:\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x5\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CBC_encrypt_loop_block_192%=\n\t" +#else + "BNE.W L_AES_CBC_encrypt_loop_block_192%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_CBC_encrypt_end%=\n\t" +#else + "B.N L_AES_CBC_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_CBC_encrypt_start_block_128%=:\n\t" + "\n" + "L_AES_CBC_encrypt_loop_block_128%=:\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x4\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CBC_encrypt_loop_block_128%=\n\t" +#else + "BNE.W L_AES_CBC_encrypt_loop_block_128%=\n\t" +#endif + "\n" + "L_AES_CBC_encrypt_end%=:\n\t" + "POP {%[ks], r9}\n\t" + "STM r9, {r4, r5, r6, r7}\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [iv] "+r" (iv), + [L_AES_Thumb2_te_ecb] "+r" (L_AES_Thumb2_te_ecb_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" +#else + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks) + : [L_AES_Thumb2_te_ecb] "r" (L_AES_Thumb2_te_ecb) + : "memory", "r12", "lr", "r4", "r5", "r7", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)nr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)iv; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#endif /* HAVE_AES_CBC */ +#ifdef WOLFSSL_AES_COUNTER +void AES_CTR_encrypt(const unsigned char* in, unsigned char* out, + unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_CTR_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* ctr_p) +#else +void AES_CTR_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const unsigned char* in __asm__ ("r0") = (const unsigned char*)in_p; + register unsigned char* out __asm__ ("r1") = (unsigned char*)out_p; + register unsigned long len __asm__ ("r2") = (unsigned long)len_p; + register const unsigned char* ks __asm__ ("r3") = (const unsigned char*)ks_p; + register int nr __asm__ ("r4") = (int)nr_p; + register unsigned char* ctr __asm__ ("r5") = (unsigned char*)ctr_p; + register uint32_t* L_AES_Thumb2_te_ecb_c __asm__ ("r6") = (uint32_t*)L_AES_Thumb2_te_ecb; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r12, r4\n\t" +#else + "LDR r12, [sp, #36]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r8, r5\n\t" +#else + "LDR r8, [sp, #40]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[in]\n\t" + "MOV r0, %[L_AES_Thumb2_te_ecb]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STM r8, {r4, r5, r6, r7}\n\t" + "PUSH {%[ks], r8}\n\t" + "CMP r12, #0xa\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CTR_encrypt_start_block_128%=\n\t" +#else + "BEQ.W L_AES_CTR_encrypt_start_block_128%=\n\t" +#endif + "CMP r12, #0xc\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CTR_encrypt_start_block_192%=\n\t" +#else + "BEQ.W L_AES_CTR_encrypt_start_block_192%=\n\t" +#endif + "\n" + "L_AES_CTR_encrypt_loop_block_256%=:\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDR lr, [sp, #16]\n\t" + "ADDS r11, r7, #0x1\n\t" + "ADCS r10, r6, #0x0\n\t" + "ADCS r9, r5, #0x0\n\t" + "ADC r8, r4, #0x0\n\t" + "STM lr, {r8, r9, r10, r11}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x6\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDR r8, [sp, #4]\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CTR_encrypt_loop_block_256%=\n\t" +#else + "BNE.W L_AES_CTR_encrypt_loop_block_256%=\n\t" +#endif +#ifdef __GNUC__ + "B L_AES_CTR_encrypt_end%=\n\t" +#else + "B.W L_AES_CTR_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_CTR_encrypt_start_block_192%=:\n\t" + "\n" + "L_AES_CTR_encrypt_loop_block_192%=:\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDR lr, [sp, #16]\n\t" + "ADDS r11, r7, #0x1\n\t" + "ADCS r10, r6, #0x0\n\t" + "ADCS r9, r5, #0x0\n\t" + "ADC r8, r4, #0x0\n\t" + "STM lr, {r8, r9, r10, r11}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x5\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDR r8, [sp, #4]\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CTR_encrypt_loop_block_192%=\n\t" +#else + "BNE.W L_AES_CTR_encrypt_loop_block_192%=\n\t" +#endif +#ifdef __GNUC__ + "B L_AES_CTR_encrypt_end%=\n\t" +#else + "B.W L_AES_CTR_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_CTR_encrypt_start_block_128%=:\n\t" + "\n" + "L_AES_CTR_encrypt_loop_block_128%=:\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDR lr, [sp, #16]\n\t" + "ADDS r11, r7, #0x1\n\t" + "ADCS r10, r6, #0x0\n\t" + "ADCS r9, r5, #0x0\n\t" + "ADC r8, r4, #0x0\n\t" + "STM lr, {r8, r9, r10, r11}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x4\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDR r8, [sp, #4]\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CTR_encrypt_loop_block_128%=\n\t" +#else + "BNE.W L_AES_CTR_encrypt_loop_block_128%=\n\t" +#endif + "\n" + "L_AES_CTR_encrypt_end%=:\n\t" + "POP {%[ks], r8}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STM r8, {r4, r5, r6, r7}\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [ctr] "+r" (ctr), + [L_AES_Thumb2_te_ecb] "+r" (L_AES_Thumb2_te_ecb_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" +#else + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks) + : [L_AES_Thumb2_te_ecb] "r" (L_AES_Thumb2_te_ecb) + : "memory", "r12", "lr", "r4", "r5", "r7", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)nr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)ctr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#endif /* WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_DECRYPT +#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) || defined(HAVE_AES_CBC) +void AES_decrypt_block(const uint32_t* td, int nr, const uint8_t* td4); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_decrypt_block(const uint32_t* td_p, int nr_p, const uint8_t* td4_p) +#else +void AES_decrypt_block(const uint32_t* td, int nr, const uint8_t* td4) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const uint32_t* td __asm__ ("r0") = (const uint32_t*)td_p; + register int nr __asm__ ("r1") = (int)nr_p; + register const uint8_t* td4 __asm__ ("r2") = (const uint8_t*)td4_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "\n" + "L_AES_decrypt_block_nr%=:\n\t" + "UBFX r8, r7, #16, #8\n\t" + "LSR r11, r4, #24\n\t" + "UBFX r12, r6, #8, #8\n\t" + "UBFX lr, r5, #0, #8\n\t" + "LDR r8, [%[td], r8, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r9, r4, #16, #8\n\t" + "EOR r8, r8, r11, ROR #24\n\t" + "LSR r11, r5, #24\n\t" + "EOR r8, r8, r12, ROR #8\n\t" + "UBFX r12, r7, #8, #8\n\t" + "EOR r8, r8, lr, ROR #16\n\t" + "UBFX lr, r6, #0, #8\n\t" + "LDR r9, [%[td], r9, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r10, r5, #16, #8\n\t" + "EOR r9, r9, r11, ROR #24\n\t" + "LSR r11, r6, #24\n\t" + "EOR r9, r9, r12, ROR #8\n\t" + "UBFX r12, r4, #8, #8\n\t" + "EOR r9, r9, lr, ROR #16\n\t" + "UBFX lr, r7, #0, #8\n\t" + "LDR r10, [%[td], r10, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r4, r4, #0, #8\n\t" + "EOR r10, r10, r11, ROR #24\n\t" + "UBFX r11, r6, #16, #8\n\t" + "EOR r10, r10, r12, ROR #8\n\t" + "LSR r12, r7, #24\n\t" + "EOR r10, r10, lr, ROR #16\n\t" + "UBFX lr, r5, #8, #8\n\t" + "LDR r4, [%[td], r4, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "EOR r12, r12, r4, ROR #24\n\t" + "LDM r3!, {r4, r5, r6, r7}\n\t" + "EOR r11, r11, lr, ROR #8\n\t" + "EOR r11, r11, r12, ROR #24\n\t" + /* XOR in Key Schedule */ + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "UBFX r4, r11, #16, #8\n\t" + "LSR r7, r8, #24\n\t" + "UBFX r12, r10, #8, #8\n\t" + "UBFX lr, r9, #0, #8\n\t" + "LDR r4, [%[td], r4, LSL #2]\n\t" + "LDR r7, [%[td], r7, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r5, r8, #16, #8\n\t" + "EOR r4, r4, r7, ROR #24\n\t" + "LSR r7, r9, #24\n\t" + "EOR r4, r4, r12, ROR #8\n\t" + "UBFX r12, r11, #8, #8\n\t" + "EOR r4, r4, lr, ROR #16\n\t" + "UBFX lr, r10, #0, #8\n\t" + "LDR r5, [%[td], r5, LSL #2]\n\t" + "LDR r7, [%[td], r7, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r6, r9, #16, #8\n\t" + "EOR r5, r5, r7, ROR #24\n\t" + "LSR r7, r10, #24\n\t" + "EOR r5, r5, r12, ROR #8\n\t" + "UBFX r12, r8, #8, #8\n\t" + "EOR r5, r5, lr, ROR #16\n\t" + "UBFX lr, r11, #0, #8\n\t" + "LDR r6, [%[td], r6, LSL #2]\n\t" + "LDR r7, [%[td], r7, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r8, r8, #0, #8\n\t" + "EOR r6, r6, r7, ROR #24\n\t" + "UBFX r7, r10, #16, #8\n\t" + "EOR r6, r6, r12, ROR #8\n\t" + "LSR r12, r11, #24\n\t" + "EOR r6, r6, lr, ROR #16\n\t" + "UBFX lr, r9, #8, #8\n\t" + "LDR r8, [%[td], r8, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR r7, [%[td], r7, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "EOR r12, r12, r8, ROR #24\n\t" + "LDM r3!, {r8, r9, r10, r11}\n\t" + "EOR r7, r7, lr, ROR #8\n\t" + "EOR r7, r7, r12, ROR #24\n\t" + /* XOR in Key Schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "SUBS %[nr], %[nr], #0x1\n\t" +#ifdef __GNUC__ + "BNE L_AES_decrypt_block_nr%=\n\t" +#else + "BNE.W L_AES_decrypt_block_nr%=\n\t" +#endif + "UBFX r8, r7, #16, #8\n\t" + "LSR r11, r4, #24\n\t" + "UBFX r12, r6, #8, #8\n\t" + "UBFX lr, r5, #0, #8\n\t" + "LDR r8, [%[td], r8, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r9, r4, #16, #8\n\t" + "EOR r8, r8, r11, ROR #24\n\t" + "LSR r11, r5, #24\n\t" + "EOR r8, r8, r12, ROR #8\n\t" + "UBFX r12, r7, #8, #8\n\t" + "EOR r8, r8, lr, ROR #16\n\t" + "UBFX lr, r6, #0, #8\n\t" + "LDR r9, [%[td], r9, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r10, r5, #16, #8\n\t" + "EOR r9, r9, r11, ROR #24\n\t" + "LSR r11, r6, #24\n\t" + "EOR r9, r9, r12, ROR #8\n\t" + "UBFX r12, r4, #8, #8\n\t" + "EOR r9, r9, lr, ROR #16\n\t" + "UBFX lr, r7, #0, #8\n\t" + "LDR r10, [%[td], r10, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "UBFX r4, r4, #0, #8\n\t" + "EOR r10, r10, r11, ROR #24\n\t" + "UBFX r11, r6, #16, #8\n\t" + "EOR r10, r10, r12, ROR #8\n\t" + "LSR r12, r7, #24\n\t" + "EOR r10, r10, lr, ROR #16\n\t" + "UBFX lr, r5, #8, #8\n\t" + "LDR r4, [%[td], r4, LSL #2]\n\t" + "LDR r12, [%[td], r12, LSL #2]\n\t" + "LDR r11, [%[td], r11, LSL #2]\n\t" + "LDR lr, [%[td], lr, LSL #2]\n\t" + "EOR r12, r12, r4, ROR #24\n\t" + "LDM r3!, {r4, r5, r6, r7}\n\t" + "EOR r11, r11, lr, ROR #8\n\t" + "EOR r11, r11, r12, ROR #24\n\t" + /* XOR in Key Schedule */ + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "UBFX r4, r9, #0, #8\n\t" + "UBFX r7, r10, #8, #8\n\t" + "UBFX r12, r11, #16, #8\n\t" + "LSR lr, r8, #24\n\t" + "LDRB r4, [%[td4], r4]\n\t" + "LDRB r7, [%[td4], r7]\n\t" + "LDRB r12, [%[td4], r12]\n\t" + "LDRB lr, [%[td4], lr]\n\t" + "UBFX r5, r10, #0, #8\n\t" + "EOR r4, r4, r7, LSL #8\n\t" + "UBFX r7, r11, #8, #8\n\t" + "EOR r4, r4, r12, LSL #16\n\t" + "UBFX r12, r8, #16, #8\n\t" + "EOR r4, r4, lr, LSL #24\n\t" + "LSR lr, r9, #24\n\t" + "LDRB r7, [%[td4], r7]\n\t" + "LDRB lr, [%[td4], lr]\n\t" + "LDRB r5, [%[td4], r5]\n\t" + "LDRB r12, [%[td4], r12]\n\t" + "UBFX r6, r11, #0, #8\n\t" + "EOR r5, r5, r7, LSL #8\n\t" + "UBFX r7, r8, #8, #8\n\t" + "EOR r5, r5, r12, LSL #16\n\t" + "UBFX r12, r9, #16, #8\n\t" + "EOR r5, r5, lr, LSL #24\n\t" + "LSR lr, r10, #24\n\t" + "LDRB r7, [%[td4], r7]\n\t" + "LDRB lr, [%[td4], lr]\n\t" + "LDRB r6, [%[td4], r6]\n\t" + "LDRB r12, [%[td4], r12]\n\t" + "LSR r11, r11, #24\n\t" + "EOR r6, r6, r7, LSL #8\n\t" + "UBFX r7, r8, #0, #8\n\t" + "EOR r6, r6, r12, LSL #16\n\t" + "UBFX r12, r9, #8, #8\n\t" + "EOR r6, r6, lr, LSL #24\n\t" + "UBFX lr, r10, #16, #8\n\t" + "LDRB r11, [%[td4], r11]\n\t" + "LDRB r12, [%[td4], r12]\n\t" + "LDRB r7, [%[td4], r7]\n\t" + "LDRB lr, [%[td4], lr]\n\t" + "EOR r12, r12, r11, LSL #16\n\t" + "LDM r3, {r8, r9, r10, r11}\n\t" + "EOR r7, r7, r12, LSL #8\n\t" + "EOR r7, r7, lr, LSL #16\n\t" + /* XOR in Key Schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + : [td] "+r" (td), [nr] "+r" (nr), [td4] "+r" (td4) + : + : "memory", "lr", "cc" + ); +} + +static const uint32_t* L_AES_Thumb2_td_ecb = L_AES_Thumb2_td_data; +static const unsigned char L_AES_Thumb2_td4[] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, + 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, + 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, + 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, + 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, + 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, + 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, + 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, + 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, + 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, + 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, + 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, + 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, + 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, + 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, + 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, +}; + +#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +void AES_ECB_decrypt(const unsigned char* in, unsigned char* out, + unsigned long len, const unsigned char* ks, int nr); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_ECB_decrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p) +#else +void AES_ECB_decrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const unsigned char* in __asm__ ("r0") = (const unsigned char*)in_p; + register unsigned char* out __asm__ ("r1") = (unsigned char*)out_p; + register unsigned long len __asm__ ("r2") = (unsigned long)len_p; + register const unsigned char* ks __asm__ ("r3") = (const unsigned char*)ks_p; + register int nr __asm__ ("r4") = (int)nr_p; + register uint32_t* L_AES_Thumb2_td_ecb_c __asm__ ("r5") = (uint32_t*)L_AES_Thumb2_td_ecb; + register unsigned char* L_AES_Thumb2_td4_c __asm__ ("r6") = (unsigned char*)&L_AES_Thumb2_td4; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r8, r4\n\t" +#else + "LDR r8, [sp, #36]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[in]\n\t" + "MOV r0, %[L_AES_Thumb2_td_ecb]\n\t" + "MOV r12, %[len]\n\t" + "MOV r2, %[L_AES_Thumb2_td4]\n\t" + "CMP r8, #0xa\n\t" +#ifdef __GNUC__ + "BEQ L_AES_ECB_decrypt_start_block_128%=\n\t" +#else + "BEQ.W L_AES_ECB_decrypt_start_block_128%=\n\t" +#endif + "CMP r8, #0xc\n\t" +#ifdef __GNUC__ + "BEQ L_AES_ECB_decrypt_start_block_192%=\n\t" +#else + "BEQ.W L_AES_ECB_decrypt_start_block_192%=\n\t" +#endif + "\n" + "L_AES_ECB_decrypt_loop_block_256%=:\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "PUSH {r1, %[ks], r12, lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x6\n\t" + "BL AES_decrypt_block\n\t" + "POP {r1, %[ks], r12, lr}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_ECB_decrypt_loop_block_256%=\n\t" +#else + "BNE.W L_AES_ECB_decrypt_loop_block_256%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_ECB_decrypt_end%=\n\t" +#else + "B.N L_AES_ECB_decrypt_end%=\n\t" +#endif + "\n" + "L_AES_ECB_decrypt_start_block_192%=:\n\t" + "\n" + "L_AES_ECB_decrypt_loop_block_192%=:\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "PUSH {r1, %[ks], r12, lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x5\n\t" + "BL AES_decrypt_block\n\t" + "POP {r1, %[ks], r12, lr}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_ECB_decrypt_loop_block_192%=\n\t" +#else + "BNE.W L_AES_ECB_decrypt_loop_block_192%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_ECB_decrypt_end%=\n\t" +#else + "B.N L_AES_ECB_decrypt_end%=\n\t" +#endif + "\n" + "L_AES_ECB_decrypt_start_block_128%=:\n\t" + "\n" + "L_AES_ECB_decrypt_loop_block_128%=:\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "PUSH {r1, %[ks], r12, lr}\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x4\n\t" + "BL AES_decrypt_block\n\t" + "POP {r1, %[ks], r12, lr}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_ECB_decrypt_loop_block_128%=\n\t" +#else + "BNE.W L_AES_ECB_decrypt_loop_block_128%=\n\t" +#endif + "\n" + "L_AES_ECB_decrypt_end%=:\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), + [L_AES_Thumb2_td_ecb] "+r" (L_AES_Thumb2_td_ecb_c), [L_AES_Thumb2_td4] "+r" (L_AES_Thumb2_td4_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" +#else + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks) + : [L_AES_Thumb2_td_ecb] "r" (L_AES_Thumb2_td_ecb), [L_AES_Thumb2_td4] "r" (L_AES_Thumb2_td4) + : "memory", "r12", "lr", "r4", "r7", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)nr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_CBC +void AES_CBC_decrypt(const unsigned char* in, unsigned char* out, + unsigned long len, const unsigned char* ks, int nr, unsigned char* iv); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_CBC_decrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* iv_p) +#else +void AES_CBC_decrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* iv) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const unsigned char* in __asm__ ("r0") = (const unsigned char*)in_p; + register unsigned char* out __asm__ ("r1") = (unsigned char*)out_p; + register unsigned long len __asm__ ("r2") = (unsigned long)len_p; + register const unsigned char* ks __asm__ ("r3") = (const unsigned char*)ks_p; + register int nr __asm__ ("r4") = (int)nr_p; + register unsigned char* iv __asm__ ("r5") = (unsigned char*)iv_p; + register uint32_t* L_AES_Thumb2_td_ecb_c __asm__ ("r6") = (uint32_t*)L_AES_Thumb2_td_ecb; + register unsigned char* L_AES_Thumb2_td4_c __asm__ ("r7") = (unsigned char*)&L_AES_Thumb2_td4; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r8, r4\n\t" +#else + "LDR r8, [sp, #36]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r4, r5\n\t" +#else + "LDR r4, [sp, #40]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[in]\n\t" + "MOV r0, %[L_AES_Thumb2_td_ecb]\n\t" + "MOV r12, %[len]\n\t" + "MOV r2, %[L_AES_Thumb2_td4]\n\t" + "PUSH {%[ks], r4}\n\t" + "CMP r8, #0xa\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CBC_decrypt_loop_block_128%=\n\t" +#else + "BEQ.W L_AES_CBC_decrypt_loop_block_128%=\n\t" +#endif + "CMP r8, #0xc\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CBC_decrypt_loop_block_192%=\n\t" +#else + "BEQ.W L_AES_CBC_decrypt_loop_block_192%=\n\t" +#endif + "\n" + "L_AES_CBC_decrypt_loop_block_256%=:\n\t" + "PUSH {r1, r12, lr}\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "LDR lr, [sp, #16]\n\t" + "STRD r4, r5, [lr, #16]\n\t" + "STRD r6, r7, [lr, #24]\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x6\n\t" + "BL AES_decrypt_block\n\t" + "LDR lr, [sp, #16]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDM lr, {r8, r9, r10, r11}\n\t" + "POP {r1, r12, lr}\n\t" + "LDR %[ks], [sp]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CBC_decrypt_end_odd%=\n\t" +#else + "BEQ.W L_AES_CBC_decrypt_end_odd%=\n\t" +#endif + "PUSH {r1, r12, lr}\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "LDR lr, [sp, #16]\n\t" + "STRD r4, r5, [lr]\n\t" + "STRD r6, r7, [lr, #8]\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x6\n\t" + "BL AES_decrypt_block\n\t" + "LDR lr, [sp, #16]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDRD r8, r9, [lr, #16]\n\t" + "LDRD r10, r11, [lr, #24]\n\t" + "POP {r1, r12, lr}\n\t" + "LDR %[ks], [sp]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CBC_decrypt_loop_block_256%=\n\t" +#else + "BNE.W L_AES_CBC_decrypt_loop_block_256%=\n\t" +#endif +#ifdef __GNUC__ + "B L_AES_CBC_decrypt_end%=\n\t" +#else + "B.W L_AES_CBC_decrypt_end%=\n\t" +#endif + "\n" + "L_AES_CBC_decrypt_loop_block_192%=:\n\t" + "PUSH {r1, r12, lr}\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "LDR lr, [sp, #16]\n\t" + "STRD r4, r5, [lr, #16]\n\t" + "STRD r6, r7, [lr, #24]\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x5\n\t" + "BL AES_decrypt_block\n\t" + "LDR lr, [sp, #16]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDM lr, {r8, r9, r10, r11}\n\t" + "POP {r1, r12, lr}\n\t" + "LDR %[ks], [sp]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CBC_decrypt_end_odd%=\n\t" +#else + "BEQ.W L_AES_CBC_decrypt_end_odd%=\n\t" +#endif + "PUSH {r1, r12, lr}\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "LDR lr, [sp, #16]\n\t" + "STRD r4, r5, [lr]\n\t" + "STRD r6, r7, [lr, #8]\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x5\n\t" + "BL AES_decrypt_block\n\t" + "LDR lr, [sp, #16]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDRD r8, r9, [lr, #16]\n\t" + "LDRD r10, r11, [lr, #24]\n\t" + "POP {r1, r12, lr}\n\t" + "LDR %[ks], [sp]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CBC_decrypt_loop_block_192%=\n\t" +#else + "BNE.W L_AES_CBC_decrypt_loop_block_192%=\n\t" +#endif +#ifdef __GNUC__ + "B L_AES_CBC_decrypt_end%=\n\t" +#else + "B.W L_AES_CBC_decrypt_end%=\n\t" +#endif + "\n" + "L_AES_CBC_decrypt_loop_block_128%=:\n\t" + "PUSH {r1, r12, lr}\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "LDR lr, [sp, #16]\n\t" + "STRD r4, r5, [lr, #16]\n\t" + "STRD r6, r7, [lr, #24]\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x4\n\t" + "BL AES_decrypt_block\n\t" + "LDR lr, [sp, #16]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDM lr, {r8, r9, r10, r11}\n\t" + "POP {r1, r12, lr}\n\t" + "LDR %[ks], [sp]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BEQ L_AES_CBC_decrypt_end_odd%=\n\t" +#else + "BEQ.W L_AES_CBC_decrypt_end_odd%=\n\t" +#endif + "PUSH {r1, r12, lr}\n\t" + "LDR r4, [lr]\n\t" + "LDR r5, [lr, #4]\n\t" + "LDR r6, [lr, #8]\n\t" + "LDR r7, [lr, #12]\n\t" + "LDR lr, [sp, #16]\n\t" + "STRD r4, r5, [lr]\n\t" + "STRD r6, r7, [lr, #8]\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x4\n\t" + "BL AES_decrypt_block\n\t" + "LDR lr, [sp, #16]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDRD r8, r9, [lr, #16]\n\t" + "LDRD r10, r11, [lr, #24]\n\t" + "POP {r1, r12, lr}\n\t" + "LDR %[ks], [sp]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "SUBS r12, r12, #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_CBC_decrypt_loop_block_128%=\n\t" +#else + "BNE.W L_AES_CBC_decrypt_loop_block_128%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_AES_CBC_decrypt_end%=\n\t" +#else + "B.N L_AES_CBC_decrypt_end%=\n\t" +#endif + "\n" + "L_AES_CBC_decrypt_end_odd%=:\n\t" + "LDR r4, [sp, #4]\n\t" + "LDRD r8, r9, [r4, #16]\n\t" + "LDRD r10, r11, [r4, #24]\n\t" + "STRD r8, r9, [r4]\n\t" + "STRD r10, r11, [r4, #8]\n\t" + "\n" + "L_AES_CBC_decrypt_end%=:\n\t" + "POP {%[ks], r4}\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [iv] "+r" (iv), + [L_AES_Thumb2_td_ecb] "+r" (L_AES_Thumb2_td_ecb_c), [L_AES_Thumb2_td4] "+r" (L_AES_Thumb2_td4_c) + : + : "memory", "r12", "lr", "r8", "r9", "r10", "r11", "cc" +#else + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks) + : [L_AES_Thumb2_td_ecb] "r" (L_AES_Thumb2_td_ecb), [L_AES_Thumb2_td4] "r" (L_AES_Thumb2_td4) + : "memory", "r12", "lr", "r4", "r5", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)nr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)iv; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#endif /* HAVE_AES_CBC */ +#endif /* WOLFSSL_AES_DIRECT || WOLFSSL_AES_COUNTER || HAVE_AES_CBC */ +#endif /* HAVE_AES_DECRYPT */ +#ifdef HAVE_AESGCM +XALIGNED(16) static const uint32_t L_GCM_gmult_len_r[] = { + 0x00000000, 0x1c200000, 0x38400000, 0x24600000, + 0x70800000, 0x6ca00000, 0x48c00000, 0x54e00000, + 0xe1000000, 0xfd200000, 0xd9400000, 0xc5600000, + 0x91800000, 0x8da00000, 0xa9c00000, 0xb5e00000, +}; + +void GCM_gmult_len(unsigned char* x, const unsigned char** m, + const unsigned char* data, unsigned long len); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void GCM_gmult_len(unsigned char* x_p, const unsigned char** m_p, const unsigned char* data_p, unsigned long len_p) +#else +void GCM_gmult_len(unsigned char* x, const unsigned char** m, const unsigned char* data, unsigned long len) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register unsigned char* x __asm__ ("r0") = (unsigned char*)x_p; + register const unsigned char** m __asm__ ("r1") = (const unsigned char**)m_p; + register const unsigned char* data __asm__ ("r2") = (const unsigned char*)data_p; + register unsigned long len __asm__ ("r3") = (unsigned long)len_p; + register uint32_t* L_GCM_gmult_len_r_c __asm__ ("r4") = (uint32_t*)&L_GCM_gmult_len_r; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV lr, %[L_GCM_gmult_len_r]\n\t" + "\n" + "L_GCM_gmult_len_start_block%=:\n\t" + "PUSH {r3}\n\t" + "LDR r12, [r0, #12]\n\t" + "LDR %[len], [r2, #12]\n\t" + "EOR r12, r12, %[len]\n\t" + "LSR %[len], r12, #24\n\t" + "AND %[len], %[len], #0xf\n\t" + "ADD %[len], %[m], %[len], LSL #4\n\t" + "LDM %[len], {r8, r9, r10, r11}\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #28\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #16\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #20\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #8\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #12\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "AND r4, r12, #0xf\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #4\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "LDR r12, [r0, #8]\n\t" + "LDR %[len], [r2, #8]\n\t" + "EOR r12, r12, %[len]\n\t" + "LSR %[len], r12, #24\n\t" + "AND %[len], %[len], #0xf\n\t" + "ADD %[len], %[m], %[len], LSL #4\n\t" + "LDM %[len], {r4, r5, r6, r7}\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #28\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #16\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #20\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #8\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #12\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "AND r4, r12, #0xf\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #4\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "LDR r12, [r0, #4]\n\t" + "LDR %[len], [r2, #4]\n\t" + "EOR r12, r12, %[len]\n\t" + "LSR %[len], r12, #24\n\t" + "AND %[len], %[len], #0xf\n\t" + "ADD %[len], %[m], %[len], LSL #4\n\t" + "LDM %[len], {r4, r5, r6, r7}\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #28\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #16\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #20\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #8\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #12\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "AND r4, r12, #0xf\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #4\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "LDR r12, [r0]\n\t" + "LDR %[len], [r2]\n\t" + "EOR r12, r12, %[len]\n\t" + "LSR %[len], r12, #24\n\t" + "AND %[len], %[len], #0xf\n\t" + "ADD %[len], %[m], %[len], LSL #4\n\t" + "LDM %[len], {r4, r5, r6, r7}\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #28\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #16\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #20\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #8\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #12\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "AND r4, r12, #0xf\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LSR r6, r10, #4\n\t" + "AND %[len], r11, #0xf\n\t" + "LSR r11, r11, #4\n\t" + "LSR r4, r12, #4\n\t" + "EOR r11, r11, r10, LSL #28\n\t" + "AND r4, r4, #0xf\n\t" + "LDR %[len], [lr, r3, LSL #2]\n\t" + "ADD r4, %[m], r4, LSL #4\n\t" + "EOR r10, r6, r9, LSL #28\n\t" + "LSR r9, r9, #4\n\t" + "LDM r4, {r4, r5, r6, r7}\n\t" + "EOR r9, r9, r8, LSL #28\n\t" + "EOR r8, %[len], r8, LSR #4\n\t" + "EOR r8, r8, r4\n\t" + "EOR r9, r9, r5\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "REV r10, r10\n\t" + "REV r11, r11\n\t" + "STM %[x], {r8, r9, r10, r11}\n\t" + "POP {r3}\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD %[data], %[data], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_GCM_gmult_len_start_block%=\n\t" +#else + "BNE.W L_GCM_gmult_len_start_block%=\n\t" +#endif +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [x] "+r" (x), [m] "+r" (m), [data] "+r" (data), [len] "+r" (len), + [L_GCM_gmult_len_r] "+r" (L_GCM_gmult_len_r_c) + : + : "memory", "r12", "lr", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" +#else + : [x] "+r" (x), [m] "+r" (m), [data] "+r" (data), [len] "+r" (len) + : [L_GCM_gmult_len_r] "r" (L_GCM_gmult_len_r) + : "memory", "r12", "lr", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +} + +static const uint32_t* L_AES_Thumb2_te_gcm = L_AES_Thumb2_te_data; +void AES_GCM_encrypt(const unsigned char* in, unsigned char* out, + unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void AES_GCM_encrypt(const unsigned char* in_p, unsigned char* out_p, unsigned long len_p, const unsigned char* ks_p, int nr_p, unsigned char* ctr_p) +#else +void AES_GCM_encrypt(const unsigned char* in, unsigned char* out, unsigned long len, const unsigned char* ks, int nr, unsigned char* ctr) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const unsigned char* in __asm__ ("r0") = (const unsigned char*)in_p; + register unsigned char* out __asm__ ("r1") = (unsigned char*)out_p; + register unsigned long len __asm__ ("r2") = (unsigned long)len_p; + register const unsigned char* ks __asm__ ("r3") = (const unsigned char*)ks_p; + register int nr __asm__ ("r4") = (int)nr_p; + register unsigned char* ctr __asm__ ("r5") = (unsigned char*)ctr_p; + register uint32_t* L_AES_Thumb2_te_gcm_c __asm__ ("r6") = (uint32_t*)L_AES_Thumb2_te_gcm; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r12, r4\n\t" +#else + "LDR r12, [sp, #36]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "MOV r8, r5\n\t" +#else + "LDR r8, [sp, #40]\n\t" +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[in]\n\t" + "MOV r0, %[L_AES_Thumb2_te_gcm]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STM r8, {r4, r5, r6, r7}\n\t" + "PUSH {%[ks], r8}\n\t" + "CMP r12, #0xa\n\t" +#ifdef __GNUC__ + "BEQ L_AES_GCM_encrypt_start_block_128%=\n\t" +#else + "BEQ.W L_AES_GCM_encrypt_start_block_128%=\n\t" +#endif + "CMP r12, #0xc\n\t" +#ifdef __GNUC__ + "BEQ L_AES_GCM_encrypt_start_block_192%=\n\t" +#else + "BEQ.W L_AES_GCM_encrypt_start_block_192%=\n\t" +#endif + "\n" + "L_AES_GCM_encrypt_loop_block_256%=:\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDR lr, [sp, #16]\n\t" + "ADD r7, r7, #0x1\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "STR r7, [lr, #12]\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x6\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDR r8, [sp, #4]\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_GCM_encrypt_loop_block_256%=\n\t" +#else + "BNE.W L_AES_GCM_encrypt_loop_block_256%=\n\t" +#endif +#ifdef __GNUC__ + "B L_AES_GCM_encrypt_end%=\n\t" +#else + "B.W L_AES_GCM_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_GCM_encrypt_start_block_192%=:\n\t" + "\n" + "L_AES_GCM_encrypt_loop_block_192%=:\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDR lr, [sp, #16]\n\t" + "ADD r7, r7, #0x1\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "STR r7, [lr, #12]\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x5\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDR r8, [sp, #4]\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_GCM_encrypt_loop_block_192%=\n\t" +#else + "BNE.W L_AES_GCM_encrypt_loop_block_192%=\n\t" +#endif +#ifdef __GNUC__ + "B L_AES_GCM_encrypt_end%=\n\t" +#else + "B.W L_AES_GCM_encrypt_end%=\n\t" +#endif + "\n" + "L_AES_GCM_encrypt_start_block_128%=:\n\t" + "\n" + "L_AES_GCM_encrypt_loop_block_128%=:\n\t" + "PUSH {r1, %[len], lr}\n\t" + "LDR lr, [sp, #16]\n\t" + "ADD r7, r7, #0x1\n\t" + "LDM %[ks]!, {r8, r9, r10, r11}\n\t" + "STR r7, [lr, #12]\n\t" + /* Round: 0 - XOR in key schedule */ + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "MOV r1, #0x4\n\t" + "BL AES_encrypt_block\n\t" + "POP {r1, %[len], lr}\n\t" + "LDR %[ks], [sp]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "LDR r8, [lr]\n\t" + "LDR r9, [lr, #4]\n\t" + "LDR r10, [lr, #8]\n\t" + "LDR r11, [lr, #12]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDR r8, [sp, #4]\n\t" + "STR r4, [%[out]]\n\t" + "STR r5, [%[out], #4]\n\t" + "STR r6, [%[out], #8]\n\t" + "STR r7, [%[out], #12]\n\t" + "LDM r8, {r4, r5, r6, r7}\n\t" + "SUBS %[len], %[len], #0x10\n\t" + "ADD lr, lr, #0x10\n\t" + "ADD %[out], %[out], #0x10\n\t" +#ifdef __GNUC__ + "BNE L_AES_GCM_encrypt_loop_block_128%=\n\t" +#else + "BNE.W L_AES_GCM_encrypt_loop_block_128%=\n\t" +#endif + "\n" + "L_AES_GCM_encrypt_end%=:\n\t" + "POP {%[ks], r8}\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "STM r8, {r4, r5, r6, r7}\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks), [nr] "+r" (nr), [ctr] "+r" (ctr), + [L_AES_Thumb2_te_gcm] "+r" (L_AES_Thumb2_te_gcm_c) + : + : "memory", "r12", "lr", "r7", "r8", "r9", "r10", "r11", "cc" +#else + : [in] "+r" (in), [out] "+r" (out), [len] "+r" (len), [ks] "+r" (ks) + : [L_AES_Thumb2_te_gcm] "r" (L_AES_Thumb2_te_gcm) + : "memory", "r12", "lr", "r4", "r5", "r7", "r8", "r9", "r10", "r11", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)nr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifdef WOLFSSL_NO_VAR_ASSIGN_REG + (void)ctr; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#endif /* HAVE_AESGCM */ +#endif /* !NO_AES */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,6485 @@ +/* thumb2-curve25519 + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./x25519/x25519.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519.S + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE + .thumb + .syntax unified +#if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) +#if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) + + .text + .align 4 + .globl fe_init + .type fe_init, %function +fe_init: + BX lr + /* Cycle Count = 4 */ + .size fe_init,.-fe_init + .text + .align 4 + .globl fe_add_sub_op + .type fe_add_sub_op, %function +fe_add_sub_op: + PUSH {lr} + /* Add-Sub */ + LDRD r4, r5, [r2] + LDRD r6, r7, [r3] + /* Add */ + ADDS r8, r4, r6 + MOV r12, #0x0 + ADCS r9, r5, r7 + ADC r12, r12, #0x0 + STRD r8, r9, [r0] + /* Sub */ + SUBS r10, r4, r6 + SBCS r11, r5, r7 + STRD r10, r11, [r1] + LDRD r4, r5, [r2, #8] + LDRD r6, r7, [r3, #8] + /* Sub */ + SBCS r10, r4, r6 + MOV lr, #0x0 + SBCS r11, r5, r7 + ADC lr, lr, #0x0 + STRD r10, r11, [r1, #8] + /* Add */ + SUBS r12, r12, #0x1 + ADCS r8, r4, r6 + ADCS r9, r5, r7 + STRD r8, r9, [r0, #8] + LDRD r4, r5, [r2, #16] + LDRD r6, r7, [r3, #16] + /* Add */ + ADCS r8, r4, r6 + MOV r12, #0x0 + ADCS r9, r5, r7 + ADC r12, r12, #0x0 + STRD r8, r9, [r0, #16] + /* Sub */ + SUBS lr, lr, #0x1 + SBCS r10, r4, r6 + SBCS r11, r5, r7 + STRD r10, r11, [r1, #16] + LDRD r4, r5, [r2, #24] + LDRD r6, r7, [r3, #24] + /* Sub */ + SBCS r10, r4, r6 + SBC r11, r5, r7 + /* Add */ + SUBS r12, r12, #0x1 + ADCS r8, r4, r6 + MOV r12, #0x0 + ADCS r9, r5, r7 + ADC r12, r12, #0x0 + /* Multiply -modulus by overflow */ + LSL r3, r12, #1 + MOV r12, #0x13 + ORR r3, r3, r9, LSR #31 + MUL r12, r3, r12 + /* Add -x*modulus (if overflow) */ + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + ADDS r4, r4, r12 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + STRD r4, r5, [r0] + STRD r6, r7, [r0, #8] + LDRD r4, r5, [r0, #16] + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + STRD r4, r5, [r0, #16] + BFC r9, #31, #1 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + STRD r8, r9, [r0, #24] + /* Add -modulus on underflow */ + MOV lr, #0x13 + AND lr, lr, r11, ASR #31 + LDM r1, {r4, r5, r6, r7, r8, r9} + SUBS r4, r4, lr + SBCS r5, r5, #0x0 + SBCS r6, r6, #0x0 + SBCS r7, r7, #0x0 + SBCS r8, r8, #0x0 + SBCS r9, r9, #0x0 + BFC r11, #31, #1 + SBCS r10, r10, #0x0 + SBC r11, r11, #0x0 + STM r1, {r4, r5, r6, r7, r8, r9, r10, r11} + /* Done Add-Sub */ + POP {pc} + /* Cycle Count = 134 */ + .size fe_add_sub_op,.-fe_add_sub_op + .text + .align 4 + .globl fe_sub_op + .type fe_sub_op, %function +fe_sub_op: + PUSH {lr} + /* Sub */ + LDM r2!, {r6, r7, r8, r9, r10, r11, r12, lr} + LDM r1!, {r2, r3, r4, r5} + SUBS r6, r2, r6 + SBCS r7, r3, r7 + SBCS r8, r4, r8 + SBCS r9, r5, r9 + LDM r1!, {r2, r3, r4, r5} + SBCS r10, r2, r10 + SBCS r11, r3, r11 + SBCS r12, r4, r12 + SBC lr, r5, lr + MOV r2, #0x13 + AND r2, r2, lr, ASR #31 + SUBS r6, r6, r2 + SBCS r7, r7, #0x0 + SBCS r8, r8, #0x0 + SBCS r9, r9, #0x0 + SBCS r10, r10, #0x0 + SBCS r11, r11, #0x0 + BFC lr, #31, #1 + SBCS r12, r12, #0x0 + SBC lr, lr, #0x0 + STM r0, {r6, r7, r8, r9, r10, r11, r12, lr} + /* Done Sub */ + POP {pc} + /* Cycle Count = 51 */ + .size fe_sub_op,.-fe_sub_op + .text + .align 4 + .globl fe_sub + .type fe_sub, %function +fe_sub: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + BL fe_sub_op + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 24 */ + .size fe_sub,.-fe_sub + .text + .align 4 + .globl fe_add_op + .type fe_add_op, %function +fe_add_op: + PUSH {lr} + /* Add */ + LDM r2!, {r6, r7, r8, r9, r10, r11, r12, lr} + LDM r1!, {r2, r3, r4, r5} + ADDS r6, r2, r6 + ADCS r7, r3, r7 + ADCS r8, r4, r8 + ADCS r9, r5, r9 + LDM r1!, {r2, r3, r4, r5} + ADCS r10, r2, r10 + ADCS r11, r3, r11 + ADCS r12, r4, r12 + ADC lr, r5, lr + MOV r2, #0x13 + AND r2, r2, lr, ASR #31 + ADDS r6, r6, r2 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADCS r9, r9, #0x0 + ADCS r10, r10, #0x0 + ADCS r11, r11, #0x0 + BFC lr, #31, #1 + ADCS r12, r12, #0x0 + ADC lr, lr, #0x0 + STM r0, {r6, r7, r8, r9, r10, r11, r12, lr} + /* Done Add */ + POP {pc} + /* Cycle Count = 51 */ + .size fe_add_op,.-fe_add_op + .text + .align 4 + .globl fe_add + .type fe_add, %function +fe_add: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + BL fe_add_op + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 24 */ + .size fe_add,.-fe_add +#ifdef HAVE_ED25519 + .text + .align 4 + .globl fe_frombytes + .type fe_frombytes, %function +fe_frombytes: + PUSH {r4, r5, r6, r7, r8, r9, lr} + LDR r2, [r1] + LDR r3, [r1, #4] + LDR r4, [r1, #8] + LDR r5, [r1, #12] + LDR r6, [r1, #16] + LDR r7, [r1, #20] + LDR r8, [r1, #24] + LDR r9, [r1, #28] + BFC r9, #31, #1 + STR r2, [r0] + STR r3, [r0, #4] + STR r4, [r0, #8] + STR r5, [r0, #12] + STR r6, [r0, #16] + STR r7, [r0, #20] + STR r8, [r0, #24] + STR r9, [r0, #28] + POP {r4, r5, r6, r7, r8, r9, pc} + /* Cycle Count = 49 */ + .size fe_frombytes,.-fe_frombytes + .text + .align 4 + .globl fe_tobytes + .type fe_tobytes, %function +fe_tobytes: + PUSH {r4, r5, r6, r7, r8, r9, r10, lr} + LDM r1, {r2, r3, r4, r5, r6, r7, r8, r9} + ADDS r10, r2, #0x13 + ADCS r10, r3, #0x0 + ADCS r10, r4, #0x0 + ADCS r10, r5, #0x0 + ADCS r10, r6, #0x0 + ADCS r10, r7, #0x0 + ADCS r10, r8, #0x0 + ADC r10, r9, #0x0 + ASR r10, r10, #31 + AND r10, r10, #0x13 + ADDS r2, r2, r10 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + BFC r9, #31, #1 + STR r2, [r0] + STR r3, [r0, #4] + STR r4, [r0, #8] + STR r5, [r0, #12] + STR r6, [r0, #16] + STR r7, [r0, #20] + STR r8, [r0, #24] + STR r9, [r0, #28] + POP {r4, r5, r6, r7, r8, r9, r10, pc} + /* Cycle Count = 62 */ + .size fe_tobytes,.-fe_tobytes + .text + .align 4 + .globl fe_1 + .type fe_1, %function +fe_1: + PUSH {r4, r5, r6, r7, r8, r9, lr} + /* Set one */ + MOV r2, #0x1 + MOV r3, #0x0 + MOV r4, #0x0 + MOV r5, #0x0 + MOV r6, #0x0 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + STM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + POP {r4, r5, r6, r7, r8, r9, pc} + /* Cycle Count = 33 */ + .size fe_1,.-fe_1 + .text + .align 4 + .globl fe_0 + .type fe_0, %function +fe_0: + PUSH {r4, r5, r6, r7, r8, r9, lr} + /* Set zero */ + MOV r2, #0x0 + MOV r3, #0x0 + MOV r4, #0x0 + MOV r5, #0x0 + MOV r6, #0x0 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + STM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + POP {r4, r5, r6, r7, r8, r9, pc} + /* Cycle Count = 33 */ + .size fe_0,.-fe_0 + .text + .align 4 + .globl fe_copy + .type fe_copy, %function +fe_copy: + PUSH {r4, r5, lr} + /* Copy */ + LDRD r2, r3, [r1] + LDRD r4, r5, [r1, #8] + STRD r2, r3, [r0] + STRD r4, r5, [r0, #8] + LDRD r2, r3, [r1, #16] + LDRD r4, r5, [r1, #24] + STRD r2, r3, [r0, #16] + STRD r4, r5, [r0, #24] + POP {r4, r5, pc} + /* Cycle Count = 32 */ + .size fe_copy,.-fe_copy + .text + .align 4 + .globl fe_neg + .type fe_neg, %function +fe_neg: + PUSH {r4, r5, r6, r7, lr} + MVN r7, #0x0 + MVN r6, #0x12 + LDM r1!, {r2, r3, r4, r5} + SUBS r2, r6, r2 + SBCS r3, r7, r3 + SBCS r4, r7, r4 + SBCS r5, r7, r5 + STM r0!, {r2, r3, r4, r5} + MVN r6, #0x80000000 + LDM r1!, {r2, r3, r4, r5} + SBCS r2, r7, r2 + SBCS r3, r7, r3 + SBCS r4, r7, r4 + SBC r5, r6, r5 + STM r0!, {r2, r3, r4, r5} + POP {r4, r5, r6, r7, pc} + /* Cycle Count = 43 */ + .size fe_neg,.-fe_neg + .text + .align 4 + .globl fe_isnonzero + .type fe_isnonzero, %function +fe_isnonzero: + PUSH {r4, r5, r6, r7, r8, r9, r10, lr} + LDM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + ADDS r1, r2, #0x13 + ADCS r1, r3, #0x0 + ADCS r1, r4, #0x0 + ADCS r1, r5, #0x0 + ADCS r1, r6, #0x0 + ADCS r1, r7, #0x0 + ADCS r1, r8, #0x0 + ADC r1, r9, #0x0 + ASR r1, r1, #31 + AND r1, r1, #0x13 + ADDS r2, r2, r1 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + BFC r9, #31, #1 + ORR r2, r2, r3 + ORR r4, r4, r5 + ORR r6, r6, r7 + ORR r8, r8, r9 + ORR r4, r4, r6 + ORR r2, r2, r8 + ORR r0, r2, r4 + POP {r4, r5, r6, r7, r8, r9, r10, pc} + /* Cycle Count = 53 */ + .size fe_isnonzero,.-fe_isnonzero + .text + .align 4 + .globl fe_isnegative + .type fe_isnegative, %function +fe_isnegative: + PUSH {r4, r5, lr} + LDM r0!, {r2, r3, r4, r5} + ADDS r1, r2, #0x13 + ADCS r1, r3, #0x0 + ADCS r1, r4, #0x0 + ADCS r1, r5, #0x0 + LDM r0, {r2, r3, r4, r5} + ADCS r1, r2, #0x0 + ADCS r1, r3, #0x0 + ADCS r1, r4, #0x0 + LDR r2, [r0, #-16] + ADC r1, r5, #0x0 + AND r0, r2, #0x1 + LSR r1, r1, #31 + EOR r0, r0, r1 + POP {r4, r5, pc} + /* Cycle Count = 31 */ + .size fe_isnegative,.-fe_isnegative +#if defined(HAVE_ED25519_MAKE_KEY) || defined(HAVE_ED25519_SIGN) +#ifndef WC_NO_CACHE_RESISTANT + .text + .align 4 + .globl fe_cmov_table + .type fe_cmov_table, %function +fe_cmov_table: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SXTB r2, r2 + SBFX r3, r2, #7, #1 + EOR r12, r2, r3 + SUB r12, r12, r3 + MOV r4, #0x1 + MOV r5, #0x0 + MOV r6, #0x1 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + MOV r3, #0x80000000 + ROR r3, r3, #31 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #30 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #29 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #28 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #27 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #26 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #25 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #24 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #32] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #64] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + SUB r1, r1, #0x2a0 + MVN r10, #0x12 + MVN r11, #0x0 + SUBS r10, r10, r8 + SBCS r11, r11, r9 + SBC lr, lr, lr + ASR r12, r2, #31 + EOR r3, r4, r6 + AND r3, r3, r12 + EOR r4, r4, r3 + EOR r6, r6, r3 + EOR r3, r5, r7 + AND r3, r3, r12 + EOR r5, r5, r3 + EOR r7, r7, r3 + EOR r10, r10, r8 + AND r10, r10, r12 + EOR r8, r8, r10 + EOR r11, r11, r9 + AND r11, r11, r12 + EOR r9, r9, r11 + STRD r4, r5, [r0] + STRD r6, r7, [r0, #32] + STRD r8, r9, [r0, #64] + SBFX r3, r2, #7, #1 + EOR r12, r2, r3 + SUB r12, r12, r3 + MOV r4, #0x0 + MOV r5, #0x0 + MOV r6, #0x0 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + MOV r3, #0x80000000 + ROR r3, r3, #31 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #30 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #29 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #28 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #27 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #26 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #25 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #24 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #8] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #40] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #72] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + SUB r1, r1, #0x2a0 + MVN r10, #0x0 + MVN r11, #0x0 + RSBS lr, lr, #0x0 + SBCS r10, r10, r8 + SBCS r11, r11, r9 + SBC lr, lr, lr + ASR r12, r2, #31 + EOR r3, r4, r6 + AND r3, r3, r12 + EOR r4, r4, r3 + EOR r6, r6, r3 + EOR r3, r5, r7 + AND r3, r3, r12 + EOR r5, r5, r3 + EOR r7, r7, r3 + EOR r10, r10, r8 + AND r10, r10, r12 + EOR r8, r8, r10 + EOR r11, r11, r9 + AND r11, r11, r12 + EOR r9, r9, r11 + STRD r4, r5, [r0, #8] + STRD r6, r7, [r0, #40] + STRD r8, r9, [r0, #72] + SBFX r3, r2, #7, #1 + EOR r12, r2, r3 + SUB r12, r12, r3 + MOV r4, #0x0 + MOV r5, #0x0 + MOV r6, #0x0 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + MOV r3, #0x80000000 + ROR r3, r3, #31 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #30 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #29 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #28 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #27 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #26 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #25 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #24 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #48] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #80] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + SUB r1, r1, #0x2a0 + MVN r10, #0x0 + MVN r11, #0x0 + RSBS lr, lr, #0x0 + SBCS r10, r10, r8 + SBCS r11, r11, r9 + SBC lr, lr, lr + ASR r12, r2, #31 + EOR r3, r4, r6 + AND r3, r3, r12 + EOR r4, r4, r3 + EOR r6, r6, r3 + EOR r3, r5, r7 + AND r3, r3, r12 + EOR r5, r5, r3 + EOR r7, r7, r3 + EOR r10, r10, r8 + AND r10, r10, r12 + EOR r8, r8, r10 + EOR r11, r11, r9 + AND r11, r11, r12 + EOR r9, r9, r11 + STRD r4, r5, [r0, #16] + STRD r6, r7, [r0, #48] + STRD r8, r9, [r0, #80] + SBFX r3, r2, #7, #1 + EOR r12, r2, r3 + SUB r12, r12, r3 + MOV r4, #0x0 + MOV r5, #0x0 + MOV r6, #0x0 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + MOV r3, #0x80000000 + ROR r3, r3, #31 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #30 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #29 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #28 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #27 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #26 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #25 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + ADD r1, r1, #0x60 + MOV r3, #0x80000000 + ROR r3, r3, #24 + ROR r3, r3, r12 + ASR r3, r3, #31 + LDRD r10, r11, [r1, #24] + EOR r10, r10, r4 + EOR r11, r11, r5 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r4, r4, r10 + EOR r5, r5, r11 + LDRD r10, r11, [r1, #56] + EOR r10, r10, r6 + EOR r11, r11, r7 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r6, r6, r10 + EOR r7, r7, r11 + LDRD r10, r11, [r1, #88] + EOR r10, r10, r8 + EOR r11, r11, r9 + AND r10, r10, r3 + AND r11, r11, r3 + EOR r8, r8, r10 + EOR r9, r9, r11 + SUB r1, r1, #0x2a0 + MVN r10, #0x0 + MVN r11, #0x80000000 + RSBS lr, lr, #0x0 + SBCS r10, r10, r8 + SBC r11, r11, r9 + ASR r12, r2, #31 + EOR r3, r4, r6 + AND r3, r3, r12 + EOR r4, r4, r3 + EOR r6, r6, r3 + EOR r3, r5, r7 + AND r3, r3, r12 + EOR r5, r5, r3 + EOR r7, r7, r3 + EOR r10, r10, r8 + AND r10, r10, r12 + EOR r8, r8, r10 + EOR r11, r11, r9 + AND r11, r11, r12 + EOR r9, r9, r11 + STRD r4, r5, [r0, #24] + STRD r6, r7, [r0, #56] + STRD r8, r9, [r0, #88] + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 1195 */ + .size fe_cmov_table,.-fe_cmov_table +#else + .text + .align 4 + .globl fe_cmov_table + .type fe_cmov_table, %function +fe_cmov_table: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SXTB r2, r2 + SBFX r3, r2, #7, #1 + EOR r2, r2, r3 + SUB r2, r2, r3 + CLZ lr, r2 + LSL lr, lr, #26 + ASR lr, lr, #31 + MVN lr, lr + ADD r2, r2, lr + MOV r12, #0x60 + MUL r2, r2, r12 + ADD r1, r1, r2 + LDM r1!, {r4, r5, r6, r7, r8, r9, r10, r11} + AND r4, r4, lr + AND r5, r5, lr + AND r6, r6, lr + AND r7, r7, lr + AND r8, r8, lr + AND r9, r9, lr + AND r10, r10, lr + AND r11, r11, lr + MVN r12, lr + SUB r4, r4, r12 + MOV r12, #0x20 + AND r12, r12, r3 + ADD r0, r0, r12 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + SUB r0, r0, r12 + LDM r1!, {r4, r5, r6, r7, r8, r9, r10, r11} + AND r4, r4, lr + AND r5, r5, lr + AND r6, r6, lr + AND r7, r7, lr + AND r8, r8, lr + AND r9, r9, lr + AND r10, r10, lr + AND r11, r11, lr + MVN r12, lr + SUB r4, r4, r12 + MOV r12, #0x20 + BIC r12, r12, r3 + ADD r0, r0, r12 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + SUB r0, r0, r12 + ADD r0, r0, #0x40 + LDM r1!, {r4, r5, r6, r7} + MVN r12, #0x12 + SUBS r8, r12, r4 + SBCS r9, r3, r5 + SBCS r10, r3, r6 + SBCS r11, r3, r7 + BIC r4, r4, r3 + BIC r5, r5, r3 + BIC r6, r6, r3 + BIC r7, r7, r3 + AND r8, r8, r3 + AND r9, r9, r3 + AND r10, r10, r3 + AND r11, r11, r3 + ORR r4, r4, r8 + ORR r5, r5, r9 + ORR r6, r6, r10 + ORR r7, r7, r11 + AND r4, r4, lr + AND r5, r5, lr + AND r6, r6, lr + AND r7, r7, lr + STM r0!, {r4, r5, r6, r7} + LDM r1!, {r4, r5, r6, r7} + MVN r12, #0x80000000 + SBCS r8, r3, r4 + SBCS r9, r3, r5 + SBCS r10, r3, r6 + SBC r11, r12, r7 + BIC r4, r4, r3 + BIC r5, r5, r3 + BIC r6, r6, r3 + BIC r7, r7, r3 + AND r8, r8, r3 + AND r9, r9, r3 + AND r10, r10, r3 + AND r11, r11, r3 + ORR r4, r4, r8 + ORR r5, r5, r9 + ORR r6, r6, r10 + ORR r7, r7, r11 + AND r4, r4, lr + AND r5, r5, lr + AND r6, r6, lr + AND r7, r7, lr + STM r0!, {r4, r5, r6, r7} + SUB r1, r1, r2 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 160 */ + .size fe_cmov_table,.-fe_cmov_table +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_ED25519_MAKE_KEY || HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ +#ifdef WOLFSSL_SP_NO_UMAAL + .text + .align 4 + .globl fe_mul_op + .type fe_mul_op, %function +fe_mul_op: + PUSH {lr} + SUB sp, sp, #0x28 + STR r0, [sp, #36] + MOV r0, #0x0 + LDR r12, [r1] + /* A[0] * B[0] */ + LDR lr, [r2] + UMULL r3, r4, r12, lr + /* A[0] * B[2] */ + LDR lr, [r2, #8] + UMULL r5, r6, r12, lr + /* A[0] * B[4] */ + LDR lr, [r2, #16] + UMULL r7, r8, r12, lr + /* A[0] * B[6] */ + LDR lr, [r2, #24] + UMULL r9, r10, r12, lr + STR r3, [sp] + /* A[0] * B[1] */ + LDR lr, [r2, #4] + MOV r11, r0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[0] * B[3] */ + LDR lr, [r2, #12] + ADCS r6, r6, #0x0 + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[0] * B[5] */ + LDR lr, [r2, #20] + ADCS r8, r8, #0x0 + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[0] * B[7] */ + LDR lr, [r2, #28] + ADCS r10, r10, #0x0 + ADC r3, r0, #0x0 + UMLAL r10, r3, r12, lr + /* A[1] * B[0] */ + LDR r12, [r1, #4] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r4, r11, r12, lr + STR r4, [sp, #4] + ADDS r5, r5, r11 + /* A[1] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[1] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[1] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[1] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[1] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[1] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[1] * B[7] */ + LDR lr, [r2, #28] + ADC r4, r0, #0x0 + UMLAL r3, r4, r12, lr + /* A[2] * B[0] */ + LDR r12, [r1, #8] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r5, r11, r12, lr + STR r5, [sp, #8] + ADDS r6, r6, r11 + /* A[2] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[2] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[2] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[2] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[2] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[2] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[2] * B[7] */ + LDR lr, [r2, #28] + ADC r5, r0, #0x0 + UMLAL r4, r5, r12, lr + /* A[3] * B[0] */ + LDR r12, [r1, #12] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r6, r11, r12, lr + STR r6, [sp, #12] + ADDS r7, r7, r11 + /* A[3] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[3] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[3] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[3] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[3] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[3] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[3] * B[7] */ + LDR lr, [r2, #28] + ADC r6, r0, #0x0 + UMLAL r5, r6, r12, lr + /* A[4] * B[0] */ + LDR r12, [r1, #16] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r7, r11, r12, lr + STR r7, [sp, #16] + ADDS r8, r8, r11 + /* A[4] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[4] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[4] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[4] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[4] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[4] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[4] * B[7] */ + LDR lr, [r2, #28] + ADC r7, r0, #0x0 + UMLAL r6, r7, r12, lr + /* A[5] * B[0] */ + LDR r12, [r1, #20] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r8, r11, r12, lr + STR r8, [sp, #20] + ADDS r9, r9, r11 + /* A[5] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[5] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[5] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[5] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[5] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[5] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[5] * B[7] */ + LDR lr, [r2, #28] + ADC r8, r0, #0x0 + UMLAL r7, r8, r12, lr + /* A[6] * B[0] */ + LDR r12, [r1, #24] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r9, r11, r12, lr + STR r9, [sp, #24] + ADDS r10, r10, r11 + /* A[6] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[6] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[6] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[6] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[6] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[6] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[6] * B[7] */ + LDR lr, [r2, #28] + ADC r9, r0, #0x0 + UMLAL r8, r9, r12, lr + /* A[7] * B[0] */ + LDR r12, [r1, #28] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r10, r11, r12, lr + STR r10, [sp, #28] + ADDS r3, r3, r11 + /* A[7] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[7] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[7] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[7] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[7] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[7] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[7] * B[7] */ + LDR lr, [r2, #28] + ADC r10, r0, #0x0 + UMLAL r9, r10, r12, lr + /* Reduce */ + LDR r2, [sp, #28] + MOV lr, sp + MOV r12, #0x26 + UMULL r10, r11, r10, r12 + ADDS r10, r10, r2 + ADC r11, r11, #0x0 + MOV r12, #0x13 + LSL r11, r11, #1 + ORR r11, r11, r10, LSR #31 + MUL r11, r11, r12 + LDM lr!, {r1, r2} + MOV r12, #0x26 + ADDS r1, r1, r11 + ADC r11, r0, #0x0 + UMLAL r1, r11, r3, r12 + ADDS r2, r2, r11 + ADC r11, r0, #0x0 + UMLAL r2, r11, r4, r12 + LDM lr!, {r3, r4} + ADDS r3, r3, r11 + ADC r11, r0, #0x0 + UMLAL r3, r11, r5, r12 + ADDS r4, r4, r11 + ADC r11, r0, #0x0 + UMLAL r4, r11, r6, r12 + LDM lr!, {r5, r6} + ADDS r5, r5, r11 + ADC r11, r0, #0x0 + UMLAL r5, r11, r7, r12 + ADDS r6, r6, r11 + ADC r11, r0, #0x0 + UMLAL r6, r11, r8, r12 + LDM lr!, {r7, r8} + ADDS r7, r7, r11 + ADC r11, r0, #0x0 + UMLAL r7, r11, r9, r12 + BFC r10, #31, #1 + ADDS r8, r10, r11 + /* Store */ + LDR r0, [sp, #36] + STM r0, {r1, r2, r3, r4, r5, r6, r7, r8} + ADD sp, sp, #0x28 + POP {pc} + /* Cycle Count = 406 */ + .size fe_mul_op,.-fe_mul_op +#else + .text + .align 4 + .globl fe_mul_op + .type fe_mul_op, %function +fe_mul_op: + PUSH {lr} + SUB sp, sp, #0x2c + STRD r0, r1, [sp, #36] + MOV lr, r2 + LDM r1, {r0, r1, r2, r3} + LDM lr!, {r4, r5, r6} + UMULL r10, r11, r0, r4 + UMULL r12, r7, r1, r4 + UMAAL r11, r12, r0, r5 + UMULL r8, r9, r2, r4 + UMAAL r12, r8, r1, r5 + UMAAL r12, r7, r0, r6 + UMAAL r8, r9, r3, r4 + STM sp, {r10, r11, r12} + UMAAL r7, r8, r2, r5 + LDM lr!, {r4} + UMULL r10, r11, r1, r6 + UMAAL r8, r9, r2, r6 + UMAAL r7, r10, r0, r4 + UMAAL r8, r11, r3, r5 + STR r7, [sp, #12] + UMAAL r8, r10, r1, r4 + UMAAL r9, r11, r3, r6 + UMAAL r9, r10, r2, r4 + UMAAL r10, r11, r3, r4 + LDM lr, {r4, r5, r6, r7} + MOV r12, #0x0 + UMLAL r8, r12, r0, r4 + UMAAL r9, r12, r1, r4 + UMAAL r10, r12, r2, r4 + UMAAL r11, r12, r3, r4 + MOV r4, #0x0 + UMLAL r9, r4, r0, r5 + UMAAL r10, r4, r1, r5 + UMAAL r11, r4, r2, r5 + UMAAL r12, r4, r3, r5 + MOV r5, #0x0 + UMLAL r10, r5, r0, r6 + UMAAL r11, r5, r1, r6 + UMAAL r12, r5, r2, r6 + UMAAL r4, r5, r3, r6 + MOV r6, #0x0 + UMLAL r11, r6, r0, r7 + LDR r0, [sp, #40] + UMAAL r12, r6, r1, r7 + ADD r0, r0, #0x10 + UMAAL r4, r6, r2, r7 + SUB lr, lr, #0x10 + UMAAL r5, r6, r3, r7 + LDM r0, {r0, r1, r2, r3} + STR r6, [sp, #32] + LDM lr!, {r6} + MOV r7, #0x0 + UMLAL r8, r7, r0, r6 + UMAAL r9, r7, r1, r6 + STR r8, [sp, #16] + UMAAL r10, r7, r2, r6 + UMAAL r11, r7, r3, r6 + LDM lr!, {r6} + MOV r8, #0x0 + UMLAL r9, r8, r0, r6 + UMAAL r10, r8, r1, r6 + STR r9, [sp, #20] + UMAAL r11, r8, r2, r6 + UMAAL r12, r8, r3, r6 + LDM lr!, {r6} + MOV r9, #0x0 + UMLAL r10, r9, r0, r6 + UMAAL r11, r9, r1, r6 + STR r10, [sp, #24] + UMAAL r12, r9, r2, r6 + UMAAL r4, r9, r3, r6 + LDM lr!, {r6} + MOV r10, #0x0 + UMLAL r11, r10, r0, r6 + UMAAL r12, r10, r1, r6 + STR r11, [sp, #28] + UMAAL r4, r10, r2, r6 + UMAAL r5, r10, r3, r6 + LDM lr!, {r11} + UMAAL r12, r7, r0, r11 + UMAAL r4, r7, r1, r11 + LDR r6, [sp, #32] + UMAAL r5, r7, r2, r11 + UMAAL r6, r7, r3, r11 + LDM lr!, {r11} + UMAAL r4, r8, r0, r11 + UMAAL r5, r8, r1, r11 + UMAAL r6, r8, r2, r11 + UMAAL r7, r8, r3, r11 + LDM lr, {r11, lr} + UMAAL r5, r9, r0, r11 + UMAAL r6, r10, r0, lr + UMAAL r6, r9, r1, r11 + UMAAL r7, r10, r1, lr + UMAAL r7, r9, r2, r11 + UMAAL r8, r10, r2, lr + UMAAL r8, r9, r3, r11 + UMAAL r9, r10, r3, lr + /* Reduce */ + LDR r0, [sp, #28] + MOV lr, #0x25 + UMAAL r10, r0, r10, lr + MOV lr, #0x13 + LSL r0, r0, #1 + ORR r0, r0, r10, LSR #31 + MUL r11, r0, lr + POP {r0, r1, r2} + MOV lr, #0x26 + UMAAL r0, r11, r12, lr + UMAAL r1, r11, r4, lr + UMAAL r2, r11, r5, lr + POP {r3, r4, r5} + UMAAL r3, r11, r6, lr + UMAAL r4, r11, r7, lr + UMAAL r5, r11, r8, lr + POP {r6} + BFC r10, #31, #1 + UMAAL r6, r11, r9, lr + ADD r7, r10, r11 + LDR lr, [sp, #8] + /* Store */ + STM lr, {r0, r1, r2, r3, r4, r5, r6, r7} + ADD sp, sp, #0x10 + POP {pc} + /* Cycle Count = 239 */ + .size fe_mul_op,.-fe_mul_op +#endif /* WOLFSSL_SP_NO_UMAAL */ + .text + .align 4 + .globl fe_mul + .type fe_mul, %function +fe_mul: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + BL fe_mul_op + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 24 */ + .size fe_mul,.-fe_mul +#ifdef WOLFSSL_SP_NO_UMAAL + .text + .align 4 + .globl fe_sq_op + .type fe_sq_op, %function +fe_sq_op: + PUSH {lr} + SUB sp, sp, #0x44 + STR r0, [sp, #64] + /* Square */ + MOV r0, #0x0 + LDR r12, [r1] + /* A[0] * A[1] */ + LDR lr, [r1, #4] + UMULL r4, r5, r12, lr + /* A[0] * A[3] */ + LDR lr, [r1, #12] + UMULL r6, r7, r12, lr + /* A[0] * A[5] */ + LDR lr, [r1, #20] + UMULL r8, r9, r12, lr + /* A[0] * A[7] */ + LDR lr, [r1, #28] + UMULL r10, r3, r12, lr + /* A[0] * A[2] */ + LDR lr, [r1, #8] + MOV r11, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[0] * A[4] */ + LDR lr, [r1, #16] + ADCS r7, r7, #0x0 + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[0] * A[6] */ + LDR lr, [r1, #24] + ADCS r9, r9, #0x0 + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + ADCS r3, r3, #0x0 + STR r4, [sp, #4] + STR r5, [sp, #8] + /* A[1] * A[2] */ + LDR r12, [r1, #4] + LDR lr, [r1, #8] + MOV r11, #0x0 + UMLAL r6, r11, r12, lr + STR r6, [sp, #12] + ADDS r7, r7, r11 + /* A[1] * A[3] */ + LDR lr, [r1, #12] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + STR r7, [sp, #16] + ADDS r8, r8, r11 + /* A[1] * A[4] */ + LDR lr, [r1, #16] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[1] * A[5] */ + LDR lr, [r1, #20] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[1] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[1] * A[7] */ + LDR lr, [r1, #28] + ADC r4, r0, #0x0 + UMLAL r3, r4, r12, lr + /* A[2] * A[3] */ + LDR r12, [r1, #8] + LDR lr, [r1, #12] + MOV r11, #0x0 + UMLAL r8, r11, r12, lr + STR r8, [sp, #20] + ADDS r9, r9, r11 + /* A[2] * A[4] */ + LDR lr, [r1, #16] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + STR r9, [sp, #24] + ADDS r10, r10, r11 + /* A[2] * A[5] */ + LDR lr, [r1, #20] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[2] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[2] * A[7] */ + LDR lr, [r1, #28] + ADC r5, r0, #0x0 + UMLAL r4, r5, r12, lr + /* A[3] * A[4] */ + LDR r12, [r1, #12] + LDR lr, [r1, #16] + MOV r11, #0x0 + UMLAL r10, r11, r12, lr + STR r10, [sp, #28] + ADDS r3, r3, r11 + /* A[3] * A[5] */ + LDR lr, [r1, #20] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[3] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[3] * A[7] */ + LDR lr, [r1, #28] + ADC r6, r0, #0x0 + UMLAL r5, r6, r12, lr + /* A[4] * A[5] */ + LDR r12, [r1, #16] + LDR lr, [r1, #20] + MOV r11, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[4] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[4] * A[7] */ + LDR lr, [r1, #28] + ADC r7, r0, #0x0 + UMLAL r6, r7, r12, lr + /* A[5] * A[6] */ + LDR r12, [r1, #20] + LDR lr, [r1, #24] + MOV r11, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[5] * A[7] */ + LDR lr, [r1, #28] + ADC r8, r0, #0x0 + UMLAL r7, r8, r12, lr + /* A[6] * A[7] */ + LDR r12, [r1, #24] + LDR lr, [r1, #28] + MOV r9, #0x0 + UMLAL r8, r9, r12, lr + ADD lr, sp, #0x20 + STM lr, {r3, r4, r5, r6, r7, r8, r9} + ADD lr, sp, #0x4 + LDM lr, {r4, r5, r6, r7, r8, r9, r10} + ADDS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADCS r10, r10, r10 + STM lr!, {r4, r5, r6, r7, r8, r9, r10} + LDM lr, {r3, r4, r5, r6, r7, r8, r9} + ADCS r3, r3, r3 + ADCS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADC r10, r0, #0x0 + STM lr, {r3, r4, r5, r6, r7, r8, r9, r10} + ADD lr, sp, #0x4 + LDM lr, {r4, r5, r6, r7, r8, r9, r10} + MOV lr, sp + /* A[0] * A[0] */ + LDR r12, [r1] + UMULL r3, r11, r12, r12 + ADDS r4, r4, r11 + /* A[1] * A[1] */ + LDR r12, [r1, #4] + ADCS r5, r5, #0x0 + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, r12 + ADDS r6, r6, r11 + /* A[2] * A[2] */ + LDR r12, [r1, #8] + ADCS r7, r7, #0x0 + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, r12 + ADDS r8, r8, r11 + /* A[3] * A[3] */ + LDR r12, [r1, #12] + ADCS r9, r9, #0x0 + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, r12 + ADDS r10, r10, r11 + STM lr!, {r3, r4, r5, r6, r7, r8, r9, r10} + LDM lr, {r3, r4, r5, r6, r7, r8, r9, r10} + /* A[4] * A[4] */ + LDR r12, [r1, #16] + ADCS r3, r3, #0x0 + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, r12 + ADDS r4, r4, r11 + /* A[5] * A[5] */ + LDR r12, [r1, #20] + ADCS r5, r5, #0x0 + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, r12 + ADDS r6, r6, r11 + /* A[6] * A[6] */ + LDR r12, [r1, #24] + ADCS r7, r7, #0x0 + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, r12 + ADDS r8, r8, r11 + /* A[7] * A[7] */ + LDR r12, [r1, #28] + ADCS r9, r9, #0x0 + ADC r10, r10, #0x0 + UMLAL r9, r10, r12, r12 + /* Reduce */ + LDR r2, [sp, #28] + MOV lr, sp + MOV r12, #0x26 + UMULL r10, r11, r10, r12 + ADDS r10, r10, r2 + ADC r11, r11, #0x0 + MOV r12, #0x13 + LSL r11, r11, #1 + ORR r11, r11, r10, LSR #31 + MUL r11, r11, r12 + LDM lr!, {r1, r2} + MOV r12, #0x26 + ADDS r1, r1, r11 + ADC r11, r0, #0x0 + UMLAL r1, r11, r3, r12 + ADDS r2, r2, r11 + ADC r11, r0, #0x0 + UMLAL r2, r11, r4, r12 + LDM lr!, {r3, r4} + ADDS r3, r3, r11 + ADC r11, r0, #0x0 + UMLAL r3, r11, r5, r12 + ADDS r4, r4, r11 + ADC r11, r0, #0x0 + UMLAL r4, r11, r6, r12 + LDM lr!, {r5, r6} + ADDS r5, r5, r11 + ADC r11, r0, #0x0 + UMLAL r5, r11, r7, r12 + ADDS r6, r6, r11 + ADC r11, r0, #0x0 + UMLAL r6, r11, r8, r12 + LDM lr!, {r7, r8} + ADDS r7, r7, r11 + ADC r11, r0, #0x0 + UMLAL r7, r11, r9, r12 + BFC r10, #31, #1 + ADDS r8, r10, r11 + /* Store */ + LDR r0, [sp, #64] + STM r0, {r1, r2, r3, r4, r5, r6, r7, r8} + ADD sp, sp, #0x44 + POP {pc} + /* Cycle Count = 355 */ + .size fe_sq_op,.-fe_sq_op +#else + .text + .align 4 + .globl fe_sq_op + .type fe_sq_op, %function +fe_sq_op: + PUSH {lr} + SUB sp, sp, #0x20 + STR r0, [sp, #28] + LDM r1, {r0, r1, r2, r3, r4, r5, r6, r7} + /* Square */ + UMULL r9, r10, r0, r0 + UMULL r11, r12, r0, r1 + ADDS r11, r11, r11 + MOV lr, #0x0 + UMAAL r10, r11, lr, lr + STM sp, {r9, r10} + MOV r8, lr + UMAAL r8, r12, r0, r2 + ADCS r8, r8, r8 + UMAAL r8, r11, r1, r1 + UMULL r9, r10, r0, r3 + UMAAL r9, r12, r1, r2 + ADCS r9, r9, r9 + UMAAL r9, r11, lr, lr + STRD r8, r9, [sp, #8] + MOV r9, lr + UMAAL r9, r10, r0, r4 + UMAAL r9, r12, r1, r3 + ADCS r9, r9, r9 + UMAAL r9, r11, r2, r2 + STR r9, [sp, #16] + UMULL r9, r8, r0, r5 + UMAAL r9, r12, r1, r4 + UMAAL r9, r10, r2, r3 + ADCS r9, r9, r9 + UMAAL r9, r11, lr, lr + STR r9, [sp, #20] + MOV r9, lr + UMAAL r9, r8, r0, r6 + UMAAL r9, r12, r1, r5 + UMAAL r9, r10, r2, r4 + ADCS r9, r9, r9 + UMAAL r9, r11, r3, r3 + STR r9, [sp, #24] + UMULL r0, r9, r0, r7 + UMAAL r0, r8, r1, r6 + UMAAL r0, r12, r2, r5 + UMAAL r0, r10, r3, r4 + ADCS r0, r0, r0 + UMAAL r0, r11, lr, lr + /* R[7] = r0 */ + UMAAL r9, r8, r1, r7 + UMAAL r9, r10, r2, r6 + UMAAL r12, r9, r3, r5 + ADCS r12, r12, r12 + UMAAL r12, r11, r4, r4 + /* R[8] = r12 */ + UMAAL r9, r8, r2, r7 + UMAAL r10, r9, r3, r6 + MOV r2, lr + UMAAL r10, r2, r4, r5 + ADCS r10, r10, r10 + UMAAL r11, r10, lr, lr + /* R[9] = r11 */ + UMAAL r2, r8, r3, r7 + UMAAL r2, r9, r4, r6 + ADCS r3, r2, r2 + UMAAL r10, r3, r5, r5 + /* R[10] = r10 */ + MOV r1, lr + UMAAL r1, r8, r4, r7 + UMAAL r1, r9, r5, r6 + ADCS r4, r1, r1 + UMAAL r3, r4, lr, lr + /* R[11] = r3 */ + UMAAL r8, r9, r5, r7 + ADCS r8, r8, r8 + UMAAL r4, r8, r6, r6 + /* R[12] = r4 */ + MOV r5, lr + UMAAL r5, r9, r6, r7 + ADCS r5, r5, r5 + UMAAL r8, r5, lr, lr + /* R[13] = r8 */ + ADCS r9, r9, r9 + UMAAL r9, r5, r7, r7 + ADCS r7, r5, lr + /* R[14] = r9 */ + /* R[15] = r7 */ + /* Reduce */ + MOV r6, #0x25 + UMAAL r7, r0, r7, r6 + MOV r6, #0x13 + LSL r0, r0, #1 + ORR r0, r0, r7, LSR #31 + MUL lr, r0, r6 + POP {r0, r1} + MOV r6, #0x26 + UMAAL r0, lr, r12, r6 + UMAAL r1, lr, r11, r6 + MOV r12, r3 + MOV r11, r4 + POP {r2, r3, r4} + UMAAL r2, lr, r10, r6 + UMAAL r3, lr, r12, r6 + UMAAL r4, lr, r11, r6 + MOV r12, r6 + POP {r5, r6} + UMAAL r5, lr, r8, r12 + BFC r7, #31, #1 + UMAAL r6, lr, r9, r12 + ADD r7, r7, lr + POP {lr} + /* Store */ + STM lr, {r0, r1, r2, r3, r4, r5, r6, r7} + POP {pc} + /* Cycle Count = 179 */ + .size fe_sq_op,.-fe_sq_op +#endif /* WOLFSSL_SP_NO_UMAAL */ + .text + .align 4 + .globl fe_sq + .type fe_sq, %function +fe_sq: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + BL fe_sq_op + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 24 */ + .size fe_sq,.-fe_sq +#ifdef HAVE_CURVE25519 +#ifdef WOLFSSL_SP_NO_UMAAL + .text + .align 4 + .globl fe_mul121666 + .type fe_mul121666, %function +fe_mul121666: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + /* Multiply by 121666 */ + LDM r1, {r2, r3, r4, r5, r6, r7, r8, r9} + MOV r12, #0xdb42 + MOVT r12, #0x1 + UMULL r2, r10, r2, r12 + UMULL r3, r11, r3, r12 + ADDS r3, r3, r10 + ADC r11, r11, #0x0 + UMULL r4, r10, r4, r12 + ADDS r4, r4, r11 + ADC r10, r10, #0x0 + UMULL r5, r11, r5, r12 + ADDS r5, r5, r10 + ADC r11, r11, #0x0 + UMULL r6, r10, r6, r12 + ADDS r6, r6, r11 + ADC r10, r10, #0x0 + UMULL r7, r11, r7, r12 + ADDS r7, r7, r10 + ADC r11, r11, #0x0 + UMULL r8, r10, r8, r12 + ADDS r8, r8, r11 + ADC r10, r10, #0x0 + UMULL r9, r11, r9, r12 + ADDS r9, r9, r10 + MOV r12, #0x13 + ADC r11, r11, #0x0 + LSL r11, r11, #1 + ORR r11, r11, r9, LSR #31 + MUL r11, r11, r12 + ADDS r2, r2, r11 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + BFC r9, #31, #1 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + STM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 75 */ + .size fe_mul121666,.-fe_mul121666 +#else + .text + .align 4 + .globl fe_mul121666 + .type fe_mul121666, %function +fe_mul121666: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + /* Multiply by 121666 */ + LDM r1, {r2, r3, r4, r5, r6, r7, r8, r9} + MOV r11, #0xdb42 + MOVT r11, #0x1 + UMULL r2, r12, r2, r11 + SUB r10, r11, #0x1 + UMAAL r3, r12, r3, r10 + UMAAL r4, r12, r4, r10 + UMAAL r5, r12, r5, r10 + UMAAL r6, r12, r6, r10 + UMAAL r7, r12, r7, r10 + UMAAL r8, r12, r8, r10 + MOV r11, #0x13 + UMAAL r9, r12, r9, r10 + LSL r12, r12, #1 + ORR r12, r12, r9, LSR #31 + MUL r12, r12, r11 + ADDS r2, r2, r12 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + BFC r9, #31, #1 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + STM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 69 */ + .size fe_mul121666,.-fe_mul121666 +#endif /* WOLFSSL_SP_NO_UMAAL */ +#ifndef WC_NO_CACHE_RESISTANT + .text + .align 4 + .globl curve25519 + .type curve25519, %function +curve25519: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0xbc + STR r0, [sp, #160] + STR r1, [sp, #164] + STR r2, [sp, #168] + MOV r1, #0x0 + STR r1, [sp, #172] + MOV r4, #0x1 + MOV r5, #0x0 + MOV r6, #0x0 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + MOV r10, #0x0 + MOV r11, #0x0 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + ADD r3, sp, #0x20 + STM r3, {r4, r5, r6, r7, r8, r9, r10, r11} + MOV r4, #0x0 + MOV r3, sp + STM r3, {r4, r5, r6, r7, r8, r9, r10, r11} + ADD r3, sp, #0x40 + /* Copy */ + LDM r2, {r4, r5, r6, r7, r8, r9, r10, r11} + STM r3, {r4, r5, r6, r7, r8, r9, r10, r11} + MOV r1, #0x1e + STR r1, [sp, #180] + MOV r2, #0x1c + STR r2, [sp, #176] +L_curve25519_words: +L_curve25519_bits: + LDR r1, [sp, #164] + LDR r2, [r1, r2] + LDR r1, [sp, #180] + LSR r2, r2, r1 + AND r2, r2, #0x1 + STR r2, [sp, #184] + LDR r1, [sp, #172] + EOR r1, r1, r2 + STR r1, [sp, #172] + LDR r0, [sp, #160] + /* Conditional Swap */ + RSB r1, r1, #0x0 + MOV r3, r0 + ADD r12, sp, #0x40 + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDR r1, [sp, #172] + /* Conditional Swap */ + RSB r1, r1, #0x0 + MOV r3, sp + ADD r12, sp, #0x20 + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDM r3, {r4, r5} + LDM r12, {r6, r7} + EOR r8, r4, r6 + EOR r9, r5, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r6, r6, r8 + EOR r7, r7, r9 + STM r3!, {r4, r5} + STM r12!, {r6, r7} + LDR r1, [sp, #184] + STR r1, [sp, #172] + MOV r3, sp + LDR r2, [sp, #160] + ADD r1, sp, #0x80 + LDR r0, [sp, #160] + BL fe_add_sub_op + ADD r3, sp, #0x20 + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + MOV r0, sp + BL fe_add_sub_op + LDR r2, [sp, #160] + ADD r1, sp, #0x60 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r2, sp, #0x80 + MOV r1, sp + MOV r0, sp + BL fe_mul_op + ADD r1, sp, #0x80 + ADD r0, sp, #0x80 + BL fe_sq_op + LDR r1, [sp, #160] + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r3, sp + ADD r2, sp, #0x20 + MOV r1, sp + ADD r0, sp, #0x40 + BL fe_add_sub_op + ADD r2, sp, #0x80 + ADD r1, sp, #0x60 + LDR r0, [sp, #160] + BL fe_mul_op + ADD r2, sp, #0x80 + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + BL fe_sub_op + MOV r1, sp + MOV r0, sp + BL fe_sq_op + ADD r1, sp, #0x60 + ADD r0, sp, #0x20 + BL fe_mul121666 + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + BL fe_sq_op + ADD r2, sp, #0x20 + ADD r1, sp, #0x80 + ADD r0, sp, #0x80 + BL fe_add_op + MOV r2, sp + LDR r1, [sp, #168] + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r2, sp, #0x80 + ADD r1, sp, #0x60 + MOV r0, sp + BL fe_mul_op + LDR r2, [sp, #176] + LDR r1, [sp, #180] + SUBS r1, r1, #0x1 + STR r1, [sp, #180] +#ifdef __GNUC__ + BGE L_curve25519_bits +#else + BGE.W L_curve25519_bits +#endif + MOV r1, #0x1f + STR r1, [sp, #180] + SUBS r2, r2, #0x4 + STR r2, [sp, #176] +#ifdef __GNUC__ + BGE L_curve25519_words +#else + BGE.W L_curve25519_words +#endif + /* Invert */ + ADD r1, sp, #0x0 + ADD r0, sp, #0x20 + BL fe_sq_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x40 + BL fe_sq_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + BL fe_sq_op + ADD r2, sp, #0x40 + ADD r1, sp, #0x0 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r2, sp, #0x40 + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x60 + BL fe_sq_op + ADD r2, sp, #0x60 + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x4 +L_curve25519_inv_1: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_1 +#else + BNE.N L_curve25519_inv_1 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x9 +L_curve25519_inv_2: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_2 +#else + BNE.N L_curve25519_inv_2 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + BL fe_mul_op + ADD r1, sp, #0x60 + ADD r0, sp, #0x80 + BL fe_sq_op + MOV r12, #0x13 +L_curve25519_inv_3: + ADD r1, sp, #0x80 + ADD r0, sp, #0x80 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_3 +#else + BNE.N L_curve25519_inv_3 +#endif + ADD r2, sp, #0x60 + ADD r1, sp, #0x80 + ADD r0, sp, #0x60 + BL fe_mul_op + MOV r12, #0xa +L_curve25519_inv_4: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_4 +#else + BNE.N L_curve25519_inv_4 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x31 +L_curve25519_inv_5: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_5 +#else + BNE.N L_curve25519_inv_5 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + BL fe_mul_op + ADD r1, sp, #0x60 + ADD r0, sp, #0x80 + BL fe_sq_op + MOV r12, #0x63 +L_curve25519_inv_6: + ADD r1, sp, #0x80 + ADD r0, sp, #0x80 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_6 +#else + BNE.N L_curve25519_inv_6 +#endif + ADD r2, sp, #0x60 + ADD r1, sp, #0x80 + ADD r0, sp, #0x60 + BL fe_mul_op + MOV r12, #0x32 +L_curve25519_inv_7: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_7 +#else + BNE.N L_curve25519_inv_7 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + MOV r12, #0x5 +L_curve25519_inv_8: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_8 +#else + BNE.N L_curve25519_inv_8 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x0 + BL fe_mul_op + MOV r2, sp + LDR r1, [sp, #160] + LDR r0, [sp, #160] + BL fe_mul_op + MOV r0, #0x0 + ADD sp, sp, #0xbc + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 682 */ + .size curve25519,.-curve25519 +#else + .text + .align 4 + .globl curve25519 + .type curve25519, %function +curve25519: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0xc0 + STR r0, [sp, #176] + STR r1, [sp, #160] + STR r2, [sp, #172] + ADD r5, sp, #0x40 + ADD r4, sp, #0x20 + STR sp, [sp, #184] + STR r5, [sp, #180] + STR r4, [sp, #188] + MOV r1, #0x0 + STR r1, [sp, #164] + MOV r4, #0x1 + MOV r5, #0x0 + MOV r6, #0x0 + MOV r7, #0x0 + MOV r8, #0x0 + MOV r9, #0x0 + MOV r10, #0x0 + MOV r11, #0x0 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + ADD r3, sp, #0x20 + STM r3, {r4, r5, r6, r7, r8, r9, r10, r11} + MOV r4, #0x0 + MOV r3, sp + STM r3, {r4, r5, r6, r7, r8, r9, r10, r11} + ADD r3, sp, #0x40 + /* Copy */ + LDM r2, {r4, r5, r6, r7, r8, r9, r10, r11} + STM r3, {r4, r5, r6, r7, r8, r9, r10, r11} + MOV r2, #0xfe +L_curve25519_bits: + STR r2, [sp, #168] + LDR r1, [sp, #160] + AND r4, r2, #0x1f + LSR r2, r2, #5 + LDR r2, [r1, r2, LSL #2] + RSB r4, r4, #0x1f + LSL r2, r2, r4 + LDR r1, [sp, #164] + EOR r1, r1, r2 + ASR r1, r1, #31 + STR r2, [sp, #164] + /* Conditional Swap */ + ADD r11, sp, #0xb0 + LDM r11, {r4, r5, r6, r7} + EOR r8, r4, r5 + EOR r9, r6, r7 + AND r8, r8, r1 + AND r9, r9, r1 + EOR r4, r4, r8 + EOR r5, r5, r8 + EOR r6, r6, r9 + EOR r7, r7, r9 + STM r11, {r4, r5, r6, r7} + /* Ladder step */ + LDR r3, [sp, #184] + LDR r2, [sp, #176] + ADD r1, sp, #0x80 + LDR r0, [sp, #176] + BL fe_add_sub_op + LDR r3, [sp, #188] + LDR r2, [sp, #180] + ADD r1, sp, #0x60 + LDR r0, [sp, #184] + BL fe_add_sub_op + LDR r2, [sp, #176] + ADD r1, sp, #0x60 + LDR r0, [sp, #188] + BL fe_mul_op + ADD r2, sp, #0x80 + LDR r1, [sp, #184] + LDR r0, [sp, #184] + BL fe_mul_op + ADD r1, sp, #0x80 + ADD r0, sp, #0x60 + BL fe_sq_op + LDR r1, [sp, #176] + ADD r0, sp, #0x80 + BL fe_sq_op + LDR r3, [sp, #184] + LDR r2, [sp, #188] + LDR r1, [sp, #184] + LDR r0, [sp, #180] + BL fe_add_sub_op + ADD r2, sp, #0x60 + ADD r1, sp, #0x80 + LDR r0, [sp, #176] + BL fe_mul_op + ADD r2, sp, #0x60 + ADD r1, sp, #0x80 + ADD r0, sp, #0x80 + BL fe_sub_op + LDR r1, [sp, #184] + LDR r0, [sp, #184] + BL fe_sq_op + ADD r1, sp, #0x80 + LDR r0, [sp, #188] + BL fe_mul121666 + LDR r1, [sp, #180] + LDR r0, [sp, #180] + BL fe_sq_op + LDR r2, [sp, #188] + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + BL fe_add_op + LDR r2, [sp, #184] + LDR r1, [sp, #172] + LDR r0, [sp, #188] + BL fe_mul_op + ADD r2, sp, #0x60 + ADD r1, sp, #0x80 + LDR r0, [sp, #184] + BL fe_mul_op + LDR r2, [sp, #168] + SUBS r2, r2, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BGE L_curve25519_bits +#else + BGE.N L_curve25519_bits +#endif + /* Cycle Count: 171 */ + LDR r1, [sp, #184] + /* Copy */ + LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11} + STM sp, {r4, r5, r6, r7, r8, r9, r10, r11} + /* Invert */ + ADD r1, sp, #0x0 + ADD r0, sp, #0x20 + BL fe_sq_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x40 + BL fe_sq_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + BL fe_sq_op + ADD r2, sp, #0x40 + ADD r1, sp, #0x0 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r2, sp, #0x40 + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x60 + BL fe_sq_op + ADD r2, sp, #0x60 + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x4 +L_curve25519_inv_1: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_1 +#else + BNE.N L_curve25519_inv_1 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x9 +L_curve25519_inv_2: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_2 +#else + BNE.N L_curve25519_inv_2 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + BL fe_mul_op + ADD r1, sp, #0x60 + ADD r0, sp, #0x80 + BL fe_sq_op + MOV r12, #0x13 +L_curve25519_inv_3: + ADD r1, sp, #0x80 + ADD r0, sp, #0x80 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_3 +#else + BNE.N L_curve25519_inv_3 +#endif + ADD r2, sp, #0x60 + ADD r1, sp, #0x80 + ADD r0, sp, #0x60 + BL fe_mul_op + MOV r12, #0xa +L_curve25519_inv_4: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_4 +#else + BNE.N L_curve25519_inv_4 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x31 +L_curve25519_inv_5: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_5 +#else + BNE.N L_curve25519_inv_5 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + BL fe_mul_op + ADD r1, sp, #0x60 + ADD r0, sp, #0x80 + BL fe_sq_op + MOV r12, #0x63 +L_curve25519_inv_6: + ADD r1, sp, #0x80 + ADD r0, sp, #0x80 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_6 +#else + BNE.N L_curve25519_inv_6 +#endif + ADD r2, sp, #0x60 + ADD r1, sp, #0x80 + ADD r0, sp, #0x60 + BL fe_mul_op + MOV r12, #0x32 +L_curve25519_inv_7: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_7 +#else + BNE.N L_curve25519_inv_7 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + MOV r12, #0x5 +L_curve25519_inv_8: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_curve25519_inv_8 +#else + BNE.N L_curve25519_inv_8 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x0 + BL fe_mul_op + LDR r2, [sp, #184] + LDR r1, [sp, #176] + LDR r0, [sp, #176] + BL fe_mul_op + /* Ensure result is less than modulus */ + LDR r0, [sp, #176] + LDM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + MOV r2, #0x13 + AND r2, r2, r11, ASR #31 + ADDS r4, r4, r2 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADCS r9, r9, #0x0 + BFC r11, #31, #1 + ADCS r10, r10, #0x0 + ADC r11, r11, #0x0 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + MOV r0, #0x0 + ADD sp, sp, #0xc0 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 589 */ + .size curve25519,.-curve25519 +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_CURVE25519 */ +#ifdef HAVE_ED25519 + .text + .align 4 + .globl fe_invert + .type fe_invert, %function +fe_invert: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x88 + /* Invert */ + STR r0, [sp, #128] + STR r1, [sp, #132] + LDR r1, [sp, #132] + MOV r0, sp + BL fe_sq_op + MOV r1, sp + ADD r0, sp, #0x20 + BL fe_sq_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + BL fe_sq_op + ADD r2, sp, #0x20 + LDR r1, [sp, #132] + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r2, sp, #0x20 + MOV r1, sp + MOV r0, sp + BL fe_mul_op + MOV r1, sp + ADD r0, sp, #0x40 + BL fe_sq_op + ADD r2, sp, #0x40 + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x40 + BL fe_sq_op + MOV r12, #0x4 +L_fe_invert1: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert1 +#else + BNE.N L_fe_invert1 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x40 + BL fe_sq_op + MOV r12, #0x9 +L_fe_invert2: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert2 +#else + BNE.N L_fe_invert2 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x13 +L_fe_invert3: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert3 +#else + BNE.N L_fe_invert3 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + MOV r12, #0xa +L_fe_invert4: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert4 +#else + BNE.N L_fe_invert4 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x40 + BL fe_sq_op + MOV r12, #0x31 +L_fe_invert5: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert5 +#else + BNE.N L_fe_invert5 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + BL fe_mul_op + ADD r1, sp, #0x40 + ADD r0, sp, #0x60 + BL fe_sq_op + MOV r12, #0x63 +L_fe_invert6: + ADD r1, sp, #0x60 + ADD r0, sp, #0x60 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert6 +#else + BNE.N L_fe_invert6 +#endif + ADD r2, sp, #0x40 + ADD r1, sp, #0x60 + ADD r0, sp, #0x40 + BL fe_mul_op + MOV r12, #0x32 +L_fe_invert7: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert7 +#else + BNE.N L_fe_invert7 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x20 + BL fe_mul_op + MOV r12, #0x5 +L_fe_invert8: + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_invert8 +#else + BNE.N L_fe_invert8 +#endif + MOV r2, sp + ADD r1, sp, #0x20 + LDR r0, [sp, #128] + BL fe_mul_op + LDR r1, [sp, #132] + LDR r0, [sp, #128] + ADD sp, sp, #0x88 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 292 */ + .size fe_invert,.-fe_invert +#ifdef WOLFSSL_SP_NO_UMAAL + .text + .align 4 + .globl fe_sq2 + .type fe_sq2, %function +fe_sq2: + PUSH {lr} + SUB sp, sp, #0x44 + STR r0, [sp, #64] + /* Square * 2 */ + MOV r0, #0x0 + LDR r12, [r1] + /* A[0] * A[1] */ + LDR lr, [r1, #4] + UMULL r4, r5, r12, lr + /* A[0] * A[3] */ + LDR lr, [r1, #12] + UMULL r6, r7, r12, lr + /* A[0] * A[5] */ + LDR lr, [r1, #20] + UMULL r8, r9, r12, lr + /* A[0] * A[7] */ + LDR lr, [r1, #28] + UMULL r10, r3, r12, lr + /* A[0] * A[2] */ + LDR lr, [r1, #8] + MOV r11, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[0] * A[4] */ + LDR lr, [r1, #16] + ADCS r7, r7, #0x0 + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[0] * A[6] */ + LDR lr, [r1, #24] + ADCS r9, r9, #0x0 + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + ADCS r3, r3, #0x0 + STR r4, [sp, #4] + STR r5, [sp, #8] + /* A[1] * A[2] */ + LDR r12, [r1, #4] + LDR lr, [r1, #8] + MOV r11, #0x0 + UMLAL r6, r11, r12, lr + STR r6, [sp, #12] + ADDS r7, r7, r11 + /* A[1] * A[3] */ + LDR lr, [r1, #12] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + STR r7, [sp, #16] + ADDS r8, r8, r11 + /* A[1] * A[4] */ + LDR lr, [r1, #16] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[1] * A[5] */ + LDR lr, [r1, #20] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[1] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[1] * A[7] */ + LDR lr, [r1, #28] + ADC r4, r0, #0x0 + UMLAL r3, r4, r12, lr + /* A[2] * A[3] */ + LDR r12, [r1, #8] + LDR lr, [r1, #12] + MOV r11, #0x0 + UMLAL r8, r11, r12, lr + STR r8, [sp, #20] + ADDS r9, r9, r11 + /* A[2] * A[4] */ + LDR lr, [r1, #16] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + STR r9, [sp, #24] + ADDS r10, r10, r11 + /* A[2] * A[5] */ + LDR lr, [r1, #20] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[2] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[2] * A[7] */ + LDR lr, [r1, #28] + ADC r5, r0, #0x0 + UMLAL r4, r5, r12, lr + /* A[3] * A[4] */ + LDR r12, [r1, #12] + LDR lr, [r1, #16] + MOV r11, #0x0 + UMLAL r10, r11, r12, lr + STR r10, [sp, #28] + ADDS r3, r3, r11 + /* A[3] * A[5] */ + LDR lr, [r1, #20] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[3] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[3] * A[7] */ + LDR lr, [r1, #28] + ADC r6, r0, #0x0 + UMLAL r5, r6, r12, lr + /* A[4] * A[5] */ + LDR r12, [r1, #16] + LDR lr, [r1, #20] + MOV r11, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[4] * A[6] */ + LDR lr, [r1, #24] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[4] * A[7] */ + LDR lr, [r1, #28] + ADC r7, r0, #0x0 + UMLAL r6, r7, r12, lr + /* A[5] * A[6] */ + LDR r12, [r1, #20] + LDR lr, [r1, #24] + MOV r11, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[5] * A[7] */ + LDR lr, [r1, #28] + ADC r8, r0, #0x0 + UMLAL r7, r8, r12, lr + /* A[6] * A[7] */ + LDR r12, [r1, #24] + LDR lr, [r1, #28] + MOV r9, #0x0 + UMLAL r8, r9, r12, lr + ADD lr, sp, #0x20 + STM lr, {r3, r4, r5, r6, r7, r8, r9} + ADD lr, sp, #0x4 + LDM lr, {r4, r5, r6, r7, r8, r9, r10} + ADDS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADCS r10, r10, r10 + STM lr!, {r4, r5, r6, r7, r8, r9, r10} + LDM lr, {r3, r4, r5, r6, r7, r8, r9} + ADCS r3, r3, r3 + ADCS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADC r10, r0, #0x0 + STM lr, {r3, r4, r5, r6, r7, r8, r9, r10} + ADD lr, sp, #0x4 + LDM lr, {r4, r5, r6, r7, r8, r9, r10} + MOV lr, sp + /* A[0] * A[0] */ + LDR r12, [r1] + UMULL r3, r11, r12, r12 + ADDS r4, r4, r11 + /* A[1] * A[1] */ + LDR r12, [r1, #4] + ADCS r5, r5, #0x0 + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, r12 + ADDS r6, r6, r11 + /* A[2] * A[2] */ + LDR r12, [r1, #8] + ADCS r7, r7, #0x0 + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, r12 + ADDS r8, r8, r11 + /* A[3] * A[3] */ + LDR r12, [r1, #12] + ADCS r9, r9, #0x0 + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, r12 + ADDS r10, r10, r11 + STM lr!, {r3, r4, r5, r6, r7, r8, r9, r10} + LDM lr, {r3, r4, r5, r6, r7, r8, r9, r10} + /* A[4] * A[4] */ + LDR r12, [r1, #16] + ADCS r3, r3, #0x0 + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, r12 + ADDS r4, r4, r11 + /* A[5] * A[5] */ + LDR r12, [r1, #20] + ADCS r5, r5, #0x0 + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, r12 + ADDS r6, r6, r11 + /* A[6] * A[6] */ + LDR r12, [r1, #24] + ADCS r7, r7, #0x0 + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, r12 + ADDS r8, r8, r11 + /* A[7] * A[7] */ + LDR r12, [r1, #28] + ADCS r9, r9, #0x0 + ADC r10, r10, #0x0 + UMLAL r9, r10, r12, r12 + /* Reduce */ + LDR r2, [sp, #28] + MOV lr, sp + MOV r12, #0x26 + UMULL r10, r11, r10, r12 + ADDS r10, r10, r2 + ADC r11, r11, #0x0 + MOV r12, #0x13 + LSL r11, r11, #1 + ORR r11, r11, r10, LSR #31 + MUL r11, r11, r12 + LDM lr!, {r1, r2} + MOV r12, #0x26 + ADDS r1, r1, r11 + ADC r11, r0, #0x0 + UMLAL r1, r11, r3, r12 + ADDS r2, r2, r11 + ADC r11, r0, #0x0 + UMLAL r2, r11, r4, r12 + LDM lr!, {r3, r4} + ADDS r3, r3, r11 + ADC r11, r0, #0x0 + UMLAL r3, r11, r5, r12 + ADDS r4, r4, r11 + ADC r11, r0, #0x0 + UMLAL r4, r11, r6, r12 + LDM lr!, {r5, r6} + ADDS r5, r5, r11 + ADC r11, r0, #0x0 + UMLAL r5, r11, r7, r12 + ADDS r6, r6, r11 + ADC r11, r0, #0x0 + UMLAL r6, r11, r8, r12 + LDM lr!, {r7, r8} + ADDS r7, r7, r11 + ADC r11, r0, #0x0 + UMLAL r7, r11, r9, r12 + BFC r10, #31, #1 + ADDS r8, r10, r11 + /* Reduce if top bit set */ + MOV r12, #0x13 + AND r11, r12, r8, ASR #31 + ADDS r1, r1, r11 + ADCS r2, r2, #0x0 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + BFC r8, #31, #1 + ADCS r7, r7, #0x0 + ADC r8, r8, #0x0 + /* Double */ + ADDS r1, r1, r1 + ADCS r2, r2, r2 + ADCS r3, r3, r3 + ADCS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADC r8, r8, r8 + /* Reduce if top bit set */ + MOV r12, #0x13 + AND r11, r12, r8, ASR #31 + ADDS r1, r1, r11 + ADCS r2, r2, #0x0 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + BFC r8, #31, #1 + ADCS r7, r7, #0x0 + ADC r8, r8, #0x0 + /* Store */ + LDR r0, [sp, #64] + STM r0, {r1, r2, r3, r4, r5, r6, r7, r8} + ADD sp, sp, #0x44 + POP {pc} + /* Cycle Count = 385 */ + .size fe_sq2,.-fe_sq2 +#else + .text + .align 4 + .globl fe_sq2 + .type fe_sq2, %function +fe_sq2: + PUSH {lr} + SUB sp, sp, #0x24 + STRD r0, r1, [sp, #28] + LDM r1, {r0, r1, r2, r3, r4, r5, r6, r7} + /* Square * 2 */ + UMULL r9, r10, r0, r0 + UMULL r11, r12, r0, r1 + ADDS r11, r11, r11 + MOV lr, #0x0 + UMAAL r10, r11, lr, lr + STM sp, {r9, r10} + MOV r8, lr + UMAAL r8, r12, r0, r2 + ADCS r8, r8, r8 + UMAAL r8, r11, r1, r1 + UMULL r9, r10, r0, r3 + UMAAL r9, r12, r1, r2 + ADCS r9, r9, r9 + UMAAL r9, r11, lr, lr + STRD r8, r9, [sp, #8] + MOV r9, lr + UMAAL r9, r10, r0, r4 + UMAAL r9, r12, r1, r3 + ADCS r9, r9, r9 + UMAAL r9, r11, r2, r2 + STR r9, [sp, #16] + UMULL r9, r8, r0, r5 + UMAAL r9, r12, r1, r4 + UMAAL r9, r10, r2, r3 + ADCS r9, r9, r9 + UMAAL r9, r11, lr, lr + STR r9, [sp, #20] + MOV r9, lr + UMAAL r9, r8, r0, r6 + UMAAL r9, r12, r1, r5 + UMAAL r9, r10, r2, r4 + ADCS r9, r9, r9 + UMAAL r9, r11, r3, r3 + STR r9, [sp, #24] + UMULL r0, r9, r0, r7 + UMAAL r0, r8, r1, r6 + UMAAL r0, r12, r2, r5 + UMAAL r0, r10, r3, r4 + ADCS r0, r0, r0 + UMAAL r0, r11, lr, lr + /* R[7] = r0 */ + UMAAL r9, r8, r1, r7 + UMAAL r9, r10, r2, r6 + UMAAL r12, r9, r3, r5 + ADCS r12, r12, r12 + UMAAL r12, r11, r4, r4 + /* R[8] = r12 */ + UMAAL r9, r8, r2, r7 + UMAAL r10, r9, r3, r6 + MOV r2, lr + UMAAL r10, r2, r4, r5 + ADCS r10, r10, r10 + UMAAL r11, r10, lr, lr + /* R[9] = r11 */ + UMAAL r2, r8, r3, r7 + UMAAL r2, r9, r4, r6 + ADCS r3, r2, r2 + UMAAL r10, r3, r5, r5 + /* R[10] = r10 */ + MOV r1, lr + UMAAL r1, r8, r4, r7 + UMAAL r1, r9, r5, r6 + ADCS r4, r1, r1 + UMAAL r3, r4, lr, lr + /* R[11] = r3 */ + UMAAL r8, r9, r5, r7 + ADCS r8, r8, r8 + UMAAL r4, r8, r6, r6 + /* R[12] = r4 */ + MOV r5, lr + UMAAL r5, r9, r6, r7 + ADCS r5, r5, r5 + UMAAL r8, r5, lr, lr + /* R[13] = r8 */ + ADCS r9, r9, r9 + UMAAL r9, r5, r7, r7 + ADCS r7, r5, lr + /* R[14] = r9 */ + /* R[15] = r7 */ + /* Reduce */ + MOV r6, #0x25 + UMAAL r7, r0, r7, r6 + MOV r6, #0x13 + LSL r0, r0, #1 + ORR r0, r0, r7, LSR #31 + MUL lr, r0, r6 + POP {r0, r1} + MOV r6, #0x26 + UMAAL r0, lr, r12, r6 + UMAAL r1, lr, r11, r6 + MOV r12, r3 + MOV r11, r4 + POP {r2, r3, r4} + UMAAL r2, lr, r10, r6 + UMAAL r3, lr, r12, r6 + UMAAL r4, lr, r11, r6 + MOV r12, r6 + POP {r5, r6} + UMAAL r5, lr, r8, r12 + BFC r7, #31, #1 + UMAAL r6, lr, r9, r12 + ADD r7, r7, lr + /* Reduce if top bit set */ + MOV r11, #0x13 + AND r12, r11, r7, ASR #31 + ADDS r0, r0, r12 + ADCS r1, r1, #0x0 + ADCS r2, r2, #0x0 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + BFC r7, #31, #1 + ADCS r6, r6, #0x0 + ADC r7, r7, #0x0 + /* Double */ + ADDS r0, r0, r0 + ADCS r1, r1, r1 + ADCS r2, r2, r2 + ADCS r3, r3, r3 + ADCS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADC r7, r7, r7 + /* Reduce if top bit set */ + MOV r11, #0x13 + AND r12, r11, r7, ASR #31 + ADDS r0, r0, r12 + ADCS r1, r1, #0x0 + ADCS r2, r2, #0x0 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + BFC r7, #31, #1 + ADCS r6, r6, #0x0 + ADC r7, r7, #0x0 + POP {r12, lr} + /* Store */ + STM r12, {r0, r1, r2, r3, r4, r5, r6, r7} + MOV r0, r12 + MOV r1, lr + POP {pc} + /* Cycle Count = 213 */ + .size fe_sq2,.-fe_sq2 +#endif /* WOLFSSL_SP_NO_UMAAL */ + .text + .align 4 + .globl fe_pow22523 + .type fe_pow22523, %function +fe_pow22523: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x68 + /* pow22523 */ + STR r0, [sp, #96] + STR r1, [sp, #100] + LDR r1, [sp, #100] + MOV r0, sp + BL fe_sq_op + MOV r1, sp + ADD r0, sp, #0x20 + BL fe_sq_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + BL fe_sq_op + ADD r2, sp, #0x20 + LDR r1, [sp, #100] + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r2, sp, #0x20 + MOV r1, sp + MOV r0, sp + BL fe_mul_op + MOV r1, sp + MOV r0, sp + BL fe_sq_op + MOV r2, sp + ADD r1, sp, #0x20 + MOV r0, sp + BL fe_mul_op + MOV r1, sp + ADD r0, sp, #0x20 + BL fe_sq_op + MOV r12, #0x4 +L_fe_pow22523_1: + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_1 +#else + BNE.N L_fe_pow22523_1 +#endif + MOV r2, sp + ADD r1, sp, #0x20 + MOV r0, sp + BL fe_mul_op + MOV r1, sp + ADD r0, sp, #0x20 + BL fe_sq_op + MOV r12, #0x9 +L_fe_pow22523_2: + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_2 +#else + BNE.N L_fe_pow22523_2 +#endif + MOV r2, sp + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x40 + BL fe_sq_op + MOV r12, #0x13 +L_fe_pow22523_3: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_3 +#else + BNE.N L_fe_pow22523_3 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x20 + BL fe_mul_op + MOV r12, #0xa +L_fe_pow22523_4: + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_4 +#else + BNE.N L_fe_pow22523_4 +#endif + MOV r2, sp + ADD r1, sp, #0x20 + MOV r0, sp + BL fe_mul_op + MOV r1, sp + ADD r0, sp, #0x20 + BL fe_sq_op + MOV r12, #0x31 +L_fe_pow22523_5: + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_5 +#else + BNE.N L_fe_pow22523_5 +#endif + MOV r2, sp + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + BL fe_mul_op + ADD r1, sp, #0x20 + ADD r0, sp, #0x40 + BL fe_sq_op + MOV r12, #0x63 +L_fe_pow22523_6: + ADD r1, sp, #0x40 + ADD r0, sp, #0x40 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_6 +#else + BNE.N L_fe_pow22523_6 +#endif + ADD r2, sp, #0x20 + ADD r1, sp, #0x40 + ADD r0, sp, #0x20 + BL fe_mul_op + MOV r12, #0x32 +L_fe_pow22523_7: + ADD r1, sp, #0x20 + ADD r0, sp, #0x20 + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_7 +#else + BNE.N L_fe_pow22523_7 +#endif + MOV r2, sp + ADD r1, sp, #0x20 + MOV r0, sp + BL fe_mul_op + MOV r12, #0x2 +L_fe_pow22523_8: + MOV r1, sp + MOV r0, sp + PUSH {r12} + BL fe_sq_op + POP {r12} + SUBS r12, r12, #0x1 +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + BNE L_fe_pow22523_8 +#else + BNE.N L_fe_pow22523_8 +#endif + LDR r2, [sp, #100] + MOV r1, sp + LDR r0, [sp, #96] + BL fe_mul_op + LDR r1, [sp, #100] + LDR r0, [sp, #96] + ADD sp, sp, #0x68 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 293 */ + .size fe_pow22523,.-fe_pow22523 + .text + .align 4 + .globl ge_p1p1_to_p2 + .type ge_p1p1_to_p2, %function +ge_p1p1_to_p2: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x8 + STR r0, [sp] + STR r1, [sp, #4] + ADD r2, r1, #0x60 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #4] + ADD r2, r1, #0x40 + ADD r1, r1, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #4] + ADD r2, r1, #0x60 + ADD r1, r1, #0x40 + ADD r0, r0, #0x40 + BL fe_mul_op + ADD sp, sp, #0x8 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 53 */ + .size ge_p1p1_to_p2,.-ge_p1p1_to_p2 + .text + .align 4 + .globl ge_p1p1_to_p3 + .type ge_p1p1_to_p3, %function +ge_p1p1_to_p3: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x8 + STR r0, [sp] + STR r1, [sp, #4] + ADD r2, r1, #0x60 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #4] + ADD r2, r1, #0x40 + ADD r1, r1, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #4] + ADD r2, r1, #0x60 + ADD r1, r1, #0x40 + ADD r0, r0, #0x40 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #4] + ADD r2, r1, #0x20 + ADD r0, r0, #0x60 + BL fe_mul_op + ADD sp, sp, #0x8 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 63 */ + .size ge_p1p1_to_p3,.-ge_p1p1_to_p3 + .text + .align 4 + .globl ge_p2_dbl + .type ge_p2_dbl, %function +ge_p2_dbl: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x8 + STR r0, [sp] + STR r1, [sp, #4] + BL fe_sq_op + LDR r0, [sp] + LDR r1, [sp, #4] + ADD r1, r1, #0x20 + ADD r0, r0, #0x40 + BL fe_sq_op + LDR r0, [sp] + LDR r1, [sp, #4] + ADD r2, r1, #0x20 + ADD r0, r0, #0x20 + BL fe_add_op + MOV r1, r0 + ADD r0, r0, #0x40 + BL fe_sq_op + LDR r0, [sp] + MOV r3, r0 + ADD r2, r0, #0x40 + ADD r1, r0, #0x40 + ADD r0, r0, #0x20 + BL fe_add_sub_op + MOV r2, r0 + ADD r1, r0, #0x40 + SUB r0, r0, #0x20 + BL fe_sub_op + LDR r1, [sp, #4] + ADD r1, r1, #0x40 + ADD r0, r0, #0x60 + BL fe_sq2 + SUB r2, r0, #0x20 + MOV r1, r0 + BL fe_sub_op + ADD sp, sp, #0x8 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 87 */ + .size ge_p2_dbl,.-ge_p2_dbl + .text + .align 4 + .globl ge_madd + .type ge_madd, %function +ge_madd: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0xc + STR r0, [sp] + STR r1, [sp, #4] + STR r2, [sp, #8] + MOV r2, r1 + ADD r1, r1, #0x20 + BL fe_add_op + LDR r1, [sp, #4] + MOV r2, r1 + ADD r1, r1, #0x20 + ADD r0, r0, #0x20 + BL fe_sub_op + LDR r2, [sp, #8] + SUB r1, r0, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r2, [sp, #8] + ADD r2, r2, #0x20 + ADD r1, r0, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #8] + LDR r2, [sp, #4] + ADD r2, r2, #0x60 + ADD r1, r1, #0x40 + ADD r0, r0, #0x60 + BL fe_mul_op + LDR r0, [sp] + ADD r3, r0, #0x20 + ADD r2, r0, #0x40 + MOV r1, r0 + ADD r0, r0, #0x20 + BL fe_add_sub_op + LDR r1, [sp, #4] + ADD r1, r1, #0x40 + ADD r0, r0, #0x20 + /* Double */ + LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11} + ADDS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADCS r10, r10, r10 + MOV lr, #0x0 + ADCS r11, r11, r11 + ADC lr, lr, #0x0 + MOV r12, #0x13 + LSL lr, lr, #1 + ORR lr, lr, r11, LSR #31 + MUL r12, lr, r12 + ADDS r4, r4, r12 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADCS r9, r9, #0x0 + BFC r11, #31, #1 + ADCS r10, r10, #0x0 + ADC r11, r11, #0x0 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + /* Done Double */ + ADD r3, r0, #0x20 + ADD r1, r0, #0x20 + BL fe_add_sub_op + ADD sp, sp, #0xc + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 136 */ + .size ge_madd,.-ge_madd + .text + .align 4 + .globl ge_msub + .type ge_msub, %function +ge_msub: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0xc + STR r0, [sp] + STR r1, [sp, #4] + STR r2, [sp, #8] + MOV r2, r1 + ADD r1, r1, #0x20 + BL fe_add_op + LDR r1, [sp, #4] + MOV r2, r1 + ADD r1, r1, #0x20 + ADD r0, r0, #0x20 + BL fe_sub_op + LDR r2, [sp, #8] + ADD r2, r2, #0x20 + SUB r1, r0, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r2, [sp, #8] + ADD r1, r0, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #8] + LDR r2, [sp, #4] + ADD r2, r2, #0x60 + ADD r1, r1, #0x40 + ADD r0, r0, #0x60 + BL fe_mul_op + LDR r0, [sp] + ADD r3, r0, #0x20 + ADD r2, r0, #0x40 + MOV r1, r0 + ADD r0, r0, #0x20 + BL fe_add_sub_op + LDR r1, [sp, #4] + ADD r1, r1, #0x40 + ADD r0, r0, #0x20 + /* Double */ + LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11} + ADDS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADCS r10, r10, r10 + MOV lr, #0x0 + ADCS r11, r11, r11 + ADC lr, lr, #0x0 + MOV r12, #0x13 + LSL lr, lr, #1 + ORR lr, lr, r11, LSR #31 + MUL r12, lr, r12 + ADDS r4, r4, r12 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADCS r9, r9, #0x0 + BFC r11, #31, #1 + ADCS r10, r10, #0x0 + ADC r11, r11, #0x0 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + /* Done Double */ + ADD r3, r0, #0x20 + MOV r1, r0 + ADD r0, r0, #0x20 + BL fe_add_sub_op + ADD sp, sp, #0xc + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 137 */ + .size ge_msub,.-ge_msub + .text + .align 4 + .globl ge_add + .type ge_add, %function +ge_add: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x2c + STR r0, [sp] + STR r1, [sp, #4] + STR r2, [sp, #8] + MOV r3, r1 + ADD r2, r1, #0x20 + ADD r1, r0, #0x20 + BL fe_add_sub_op + LDR r2, [sp, #8] + MOV r1, r0 + ADD r0, r0, #0x40 + BL fe_mul_op + LDR r0, [sp] + LDR r2, [sp, #8] + ADD r2, r2, #0x20 + ADD r1, r0, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #8] + LDR r2, [sp, #4] + ADD r2, r2, #0x60 + ADD r1, r1, #0x60 + ADD r0, r0, #0x60 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #4] + LDR r2, [sp, #8] + ADD r2, r2, #0x40 + ADD r1, r1, #0x40 + BL fe_mul_op + LDR r1, [sp] + ADD r0, sp, #0xc + /* Double */ + LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11} + ADDS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADCS r10, r10, r10 + MOV lr, #0x0 + ADCS r11, r11, r11 + ADC lr, lr, #0x0 + MOV r12, #0x13 + LSL lr, lr, #1 + ORR lr, lr, r11, LSR #31 + MUL r12, lr, r12 + ADDS r4, r4, r12 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADCS r9, r9, #0x0 + BFC r11, #31, #1 + ADCS r10, r10, #0x0 + ADC r11, r11, #0x0 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + /* Done Double */ + ADD r3, r1, #0x20 + ADD r2, r1, #0x40 + ADD r0, r1, #0x20 + BL fe_add_sub_op + ADD r3, r0, #0x40 + ADD r2, sp, #0xc + ADD r1, r0, #0x40 + ADD r0, r0, #0x20 + BL fe_add_sub_op + ADD sp, sp, #0x2c + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 138 */ + .size ge_add,.-ge_add + .text + .align 4 + .globl ge_sub + .type ge_sub, %function +ge_sub: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x2c + STR r0, [sp] + STR r1, [sp, #4] + STR r2, [sp, #8] + MOV r3, r1 + ADD r2, r1, #0x20 + ADD r1, r0, #0x20 + BL fe_add_sub_op + LDR r2, [sp, #8] + ADD r2, r2, #0x20 + MOV r1, r0 + ADD r0, r0, #0x40 + BL fe_mul_op + LDR r0, [sp] + LDR r2, [sp, #8] + ADD r1, r0, #0x20 + ADD r0, r0, #0x20 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #8] + LDR r2, [sp, #4] + ADD r2, r2, #0x60 + ADD r1, r1, #0x60 + ADD r0, r0, #0x60 + BL fe_mul_op + LDR r0, [sp] + LDR r1, [sp, #4] + LDR r2, [sp, #8] + ADD r2, r2, #0x40 + ADD r1, r1, #0x40 + BL fe_mul_op + LDR r1, [sp] + ADD r0, sp, #0xc + /* Double */ + LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11} + ADDS r4, r4, r4 + ADCS r5, r5, r5 + ADCS r6, r6, r6 + ADCS r7, r7, r7 + ADCS r8, r8, r8 + ADCS r9, r9, r9 + ADCS r10, r10, r10 + MOV lr, #0x0 + ADCS r11, r11, r11 + ADC lr, lr, #0x0 + MOV r12, #0x13 + LSL lr, lr, #1 + ORR lr, lr, r11, LSR #31 + MUL r12, lr, r12 + ADDS r4, r4, r12 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADCS r9, r9, #0x0 + BFC r11, #31, #1 + ADCS r10, r10, #0x0 + ADC r11, r11, #0x0 + STM r0, {r4, r5, r6, r7, r8, r9, r10, r11} + /* Done Double */ + ADD r3, r1, #0x20 + ADD r2, r1, #0x40 + ADD r0, r1, #0x20 + BL fe_add_sub_op + ADD r3, r0, #0x40 + ADD r2, sp, #0xc + ADD r1, r0, #0x20 + ADD r0, r0, #0x40 + BL fe_add_sub_op + ADD sp, sp, #0x2c + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 138 */ + .size ge_sub,.-ge_sub +#ifdef WOLFSSL_SP_NO_UMAAL + .text + .align 4 + .globl sc_reduce + .type sc_reduce, %function +sc_reduce: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x38 + STR r0, [sp, #52] + /* Load bits 252-511 */ + ADD r0, r0, #0x1c + LDM r0, {r1, r2, r3, r4, r5, r6, r7, r8, r9} + LSR lr, r9, #24 + LSL r9, r9, #4 + ORR r9, r9, r8, LSR #28 + LSL r8, r8, #4 + ORR r8, r8, r7, LSR #28 + LSL r7, r7, #4 + ORR r7, r7, r6, LSR #28 + LSL r6, r6, #4 + ORR r6, r6, r5, LSR #28 + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r9, #28, #4 + SUB r0, r0, #0x1c + /* Add order times bits 504..511 */ + MOV r10, #0x2c13 + MOVT r10, #0xa30a + MOV r11, #0x9ce5 + MOVT r11, #0xa7ed + MOV r1, #0x0 + UMLAL r2, r1, r10, lr + ADDS r3, r3, r1 + MOV r1, #0x0 + ADC r1, r1, #0x0 + UMLAL r3, r1, r11, lr + MOV r10, #0x6329 + MOVT r10, #0x5d08 + MOV r11, #0x621 + MOVT r11, #0xeb21 + ADDS r4, r4, r1 + MOV r1, #0x0 + ADC r1, r1, #0x0 + UMLAL r4, r1, r10, lr + ADDS r5, r5, r1 + MOV r1, #0x0 + ADC r1, r1, #0x0 + UMLAL r5, r1, r11, lr + ADDS r6, r6, r1 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + SUBS r6, r6, lr + SBCS r7, r7, #0x0 + SBCS r8, r8, #0x0 + SBC r9, r9, #0x0 + /* Sub product of top 8 words and order */ + MOV r12, sp + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0!, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + BFC r11, #28, #4 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r0, r0, #0x10 + SUB r12, r12, #0x20 + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + /* Subtract at 4 * 32 */ + LDM r12, {r10, r11} + SUBS r10, r10, r2 + SBCS r11, r11, r3 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r4 + SBCS r11, r11, r5 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r6 + SBCS r11, r11, r7 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r8 + SBC r11, r11, r9 + STM r12!, {r10, r11} + SUB r12, r12, #0x24 + ASR lr, r11, #25 + /* Conditionally subtract order starting at bit 125 */ + MOV r1, #0xa0000000 + MOV r2, #0xba7d + MOVT r2, #0x4b9e + MOV r3, #0x4c63 + MOVT r3, #0xcb02 + MOV r4, #0xf39a + MOVT r4, #0xd45e + MOV r5, #0xdf3b + MOVT r5, #0x29b + MOV r9, #0x2000000 + AND r1, r1, lr + AND r2, r2, lr + AND r3, r3, lr + AND r4, r4, lr + AND r5, r5, lr + AND r9, r9, lr + LDM r12, {r10, r11} + ADDS r10, r10, r1 + ADCS r11, r11, r2 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r3 + ADCS r11, r11, r4 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r5 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, #0x0 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10} + ADCS r10, r10, #0x0 + STM r12!, {r10} + SUB r0, r0, #0x10 + MOV r12, sp + /* Load bits 252-376 */ + ADD r12, r12, #0x1c + LDM r12, {r1, r2, r3, r4, r5} + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r5, #29, #3 + SUB r12, r12, #0x1c + /* Sub product of top 4 words and order */ + MOV r0, sp + /* * -5cf5d3ed */ + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, lr, r2, r1 + ADDS r7, r7, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r7, lr, r3, r1 + ADDS r8, r8, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r8, lr, r4, r1 + ADDS r9, r9, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r9, lr, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -5812631b */ + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV r10, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r10, r2, r1 + ADDS r7, r7, r10 + MOV r10, #0x0 + ADC r10, r10, #0x0 + UMLAL r7, r10, r3, r1 + ADDS r8, r8, r10 + MOV r10, #0x0 + ADC r10, r10, #0x0 + UMLAL r8, r10, r4, r1 + ADDS r9, r9, r10 + MOV r10, #0x0 + ADC r10, r10, #0x0 + UMLAL r9, r10, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -a2f79cd7 */ + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV r11, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r11, r2, r1 + ADDS r7, r7, r11 + MOV r11, #0x0 + ADC r11, r11, #0x0 + UMLAL r7, r11, r3, r1 + ADDS r8, r8, r11 + MOV r11, #0x0 + ADC r11, r11, #0x0 + UMLAL r8, r11, r4, r1 + ADDS r9, r9, r11 + MOV r11, #0x0 + ADC r11, r11, #0x0 + UMLAL r9, r11, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -14def9df */ + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV r12, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r12, r2, r1 + ADDS r7, r7, r12 + MOV r12, #0x0 + ADC r12, r12, #0x0 + UMLAL r7, r12, r3, r1 + ADDS r8, r8, r12 + MOV r12, #0x0 + ADC r12, r12, #0x0 + UMLAL r8, r12, r4, r1 + ADDS r9, r9, r12 + MOV r12, #0x0 + ADC r12, r12, #0x0 + UMLAL r9, r12, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* Add overflows at 4 * 32 */ + LDM r0, {r6, r7, r8, r9} + BFC r9, #28, #4 + ADDS r6, r6, lr + ADCS r7, r7, r10 + ADCS r8, r8, r11 + ADC r9, r9, r12 + /* Subtract top at 4 * 32 */ + SUBS r6, r6, r2 + SBCS r7, r7, r3 + SBCS r8, r8, r4 + SBCS r9, r9, r5 + SBC r1, r1, r1 + SUB r0, r0, #0x10 + LDM r0, {r2, r3, r4, r5} + MOV r10, #0xd3ed + MOVT r10, #0x5cf5 + MOV r11, #0x631a + MOVT r11, #0x5812 + MOV r12, #0x9cd6 + MOVT r12, #0xa2f7 + MOV lr, #0xf9de + MOVT lr, #0x14de + AND r10, r10, r1 + AND r11, r11, r1 + AND r12, r12, r1 + AND lr, lr, r1 + ADDS r2, r2, r10 + ADCS r3, r3, r11 + ADCS r4, r4, r12 + ADCS r5, r5, lr + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + AND r1, r1, #0x10000000 + ADCS r8, r8, #0x0 + ADC r9, r9, r1 + BFC r9, #28, #4 + /* Store result */ + LDR r0, [sp, #52] + STM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + ADD sp, sp, #0x38 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 588 */ + .size sc_reduce,.-sc_reduce +#else + .text + .align 4 + .globl sc_reduce + .type sc_reduce, %function +sc_reduce: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x38 + STR r0, [sp, #52] + /* Load bits 252-511 */ + ADD r0, r0, #0x1c + LDM r0, {r1, r2, r3, r4, r5, r6, r7, r8, r9} + LSR lr, r9, #24 + LSL r9, r9, #4 + ORR r9, r9, r8, LSR #28 + LSL r8, r8, #4 + ORR r8, r8, r7, LSR #28 + LSL r7, r7, #4 + ORR r7, r7, r6, LSR #28 + LSL r6, r6, #4 + ORR r6, r6, r5, LSR #28 + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r9, #28, #4 + SUB r0, r0, #0x1c + /* Add order times bits 504..511 */ + MOV r10, #0x2c13 + MOVT r10, #0xa30a + MOV r11, #0x9ce5 + MOVT r11, #0xa7ed + MOV r1, #0x0 + UMLAL r2, r1, r10, lr + UMAAL r3, r1, r11, lr + MOV r10, #0x6329 + MOVT r10, #0x5d08 + MOV r11, #0x621 + MOVT r11, #0xeb21 + UMAAL r4, r1, r10, lr + UMAAL r5, r1, r11, lr + ADDS r6, r6, r1 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + SUBS r6, r6, lr + SBCS r7, r7, #0x0 + SBCS r8, r8, #0x0 + SBC r9, r9, #0x0 + /* Sub product of top 8 words and order */ + MOV r12, sp + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0!, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + UMAAL r10, lr, r8, r1 + BFC r11, #28, #4 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r0, r0, #0x10 + SUB r12, r12, #0x20 + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r8, r1 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r8, r1 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r8, r1 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + /* Subtract at 4 * 32 */ + LDM r12, {r10, r11} + SUBS r10, r10, r2 + SBCS r11, r11, r3 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r4 + SBCS r11, r11, r5 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r6 + SBCS r11, r11, r7 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r8 + SBC r11, r11, r9 + STM r12!, {r10, r11} + SUB r12, r12, #0x24 + ASR lr, r11, #25 + /* Conditionally subtract order starting at bit 125 */ + MOV r1, #0xa0000000 + MOV r2, #0xba7d + MOVT r2, #0x4b9e + MOV r3, #0x4c63 + MOVT r3, #0xcb02 + MOV r4, #0xf39a + MOVT r4, #0xd45e + MOV r5, #0xdf3b + MOVT r5, #0x29b + MOV r9, #0x2000000 + AND r1, r1, lr + AND r2, r2, lr + AND r3, r3, lr + AND r4, r4, lr + AND r5, r5, lr + AND r9, r9, lr + LDM r12, {r10, r11} + ADDS r10, r10, r1 + ADCS r11, r11, r2 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r3 + ADCS r11, r11, r4 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r5 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, #0x0 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10} + ADCS r10, r10, #0x0 + STM r12!, {r10} + SUB r0, r0, #0x10 + MOV r12, sp + /* Load bits 252-376 */ + ADD r12, r12, #0x1c + LDM r12, {r1, r2, r3, r4, r5} + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r5, #29, #3 + SUB r12, r12, #0x1c + /* Sub product of top 4 words and order */ + MOV r0, sp + /* * -5cf5d3ed */ + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, lr, r2, r1 + UMAAL r7, lr, r3, r1 + UMAAL r8, lr, r4, r1 + UMAAL r9, lr, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -5812631b */ + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV r10, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r10, r2, r1 + UMAAL r7, r10, r3, r1 + UMAAL r8, r10, r4, r1 + UMAAL r9, r10, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -a2f79cd7 */ + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV r11, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r11, r2, r1 + UMAAL r7, r11, r3, r1 + UMAAL r8, r11, r4, r1 + UMAAL r9, r11, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -14def9df */ + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV r12, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r12, r2, r1 + UMAAL r7, r12, r3, r1 + UMAAL r8, r12, r4, r1 + UMAAL r9, r12, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* Add overflows at 4 * 32 */ + LDM r0, {r6, r7, r8, r9} + BFC r9, #28, #4 + ADDS r6, r6, lr + ADCS r7, r7, r10 + ADCS r8, r8, r11 + ADC r9, r9, r12 + /* Subtract top at 4 * 32 */ + SUBS r6, r6, r2 + SBCS r7, r7, r3 + SBCS r8, r8, r4 + SBCS r9, r9, r5 + SBC r1, r1, r1 + SUB r0, r0, #0x10 + LDM r0, {r2, r3, r4, r5} + MOV r10, #0xd3ed + MOVT r10, #0x5cf5 + MOV r11, #0x631a + MOVT r11, #0x5812 + MOV r12, #0x9cd6 + MOVT r12, #0xa2f7 + MOV lr, #0xf9de + MOVT lr, #0x14de + AND r10, r10, r1 + AND r11, r11, r1 + AND r12, r12, r1 + AND lr, lr, r1 + ADDS r2, r2, r10 + ADCS r3, r3, r11 + ADCS r4, r4, r12 + ADCS r5, r5, lr + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + AND r1, r1, #0x10000000 + ADCS r8, r8, #0x0 + ADC r9, r9, r1 + BFC r9, #28, #4 + /* Store result */ + LDR r0, [sp, #52] + STM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + ADD sp, sp, #0x38 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 502 */ + .size sc_reduce,.-sc_reduce +#endif /* WOLFSSL_SP_NO_UMAAL */ +#ifdef HAVE_ED25519_SIGN +#ifdef WOLFSSL_SP_NO_UMAAL + .text + .align 4 + .globl sc_muladd + .type sc_muladd, %function +sc_muladd: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x50 + ADD lr, sp, #0x44 + STM lr, {r0, r1, r3} + MOV r0, #0x0 + LDR r12, [r1] + /* A[0] * B[0] */ + LDR lr, [r2] + UMULL r3, r4, r12, lr + /* A[0] * B[2] */ + LDR lr, [r2, #8] + UMULL r5, r6, r12, lr + /* A[0] * B[4] */ + LDR lr, [r2, #16] + UMULL r7, r8, r12, lr + /* A[0] * B[6] */ + LDR lr, [r2, #24] + UMULL r9, r10, r12, lr + STR r3, [sp] + /* A[0] * B[1] */ + LDR lr, [r2, #4] + MOV r11, r0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[0] * B[3] */ + LDR lr, [r2, #12] + ADCS r6, r6, #0x0 + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[0] * B[5] */ + LDR lr, [r2, #20] + ADCS r8, r8, #0x0 + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[0] * B[7] */ + LDR lr, [r2, #28] + ADCS r10, r10, #0x0 + ADC r3, r0, #0x0 + UMLAL r10, r3, r12, lr + /* A[1] * B[0] */ + LDR r12, [r1, #4] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r4, r11, r12, lr + STR r4, [sp, #4] + ADDS r5, r5, r11 + /* A[1] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[1] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[1] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[1] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[1] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[1] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[1] * B[7] */ + LDR lr, [r2, #28] + ADC r4, r0, #0x0 + UMLAL r3, r4, r12, lr + /* A[2] * B[0] */ + LDR r12, [r1, #8] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r5, r11, r12, lr + STR r5, [sp, #8] + ADDS r6, r6, r11 + /* A[2] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[2] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[2] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[2] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[2] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[2] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[2] * B[7] */ + LDR lr, [r2, #28] + ADC r5, r0, #0x0 + UMLAL r4, r5, r12, lr + /* A[3] * B[0] */ + LDR r12, [r1, #12] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r6, r11, r12, lr + STR r6, [sp, #12] + ADDS r7, r7, r11 + /* A[3] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[3] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[3] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[3] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[3] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[3] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[3] * B[7] */ + LDR lr, [r2, #28] + ADC r6, r0, #0x0 + UMLAL r5, r6, r12, lr + /* A[4] * B[0] */ + LDR r12, [r1, #16] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r7, r11, r12, lr + STR r7, [sp, #16] + ADDS r8, r8, r11 + /* A[4] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[4] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[4] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[4] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[4] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[4] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[4] * B[7] */ + LDR lr, [r2, #28] + ADC r7, r0, #0x0 + UMLAL r6, r7, r12, lr + /* A[5] * B[0] */ + LDR r12, [r1, #20] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r8, r11, r12, lr + STR r8, [sp, #20] + ADDS r9, r9, r11 + /* A[5] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r9, r11, r12, lr + ADDS r10, r10, r11 + /* A[5] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[5] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[5] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[5] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[5] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[5] * B[7] */ + LDR lr, [r2, #28] + ADC r8, r0, #0x0 + UMLAL r7, r8, r12, lr + /* A[6] * B[0] */ + LDR r12, [r1, #24] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r9, r11, r12, lr + STR r9, [sp, #24] + ADDS r10, r10, r11 + /* A[6] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r10, r11, r12, lr + ADDS r3, r3, r11 + /* A[6] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[6] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[6] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[6] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[6] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[6] * B[7] */ + LDR lr, [r2, #28] + ADC r9, r0, #0x0 + UMLAL r8, r9, r12, lr + /* A[7] * B[0] */ + LDR r12, [r1, #28] + LDR lr, [r2] + MOV r11, #0x0 + UMLAL r10, r11, r12, lr + STR r10, [sp, #28] + ADDS r3, r3, r11 + /* A[7] * B[1] */ + LDR lr, [r2, #4] + ADC r11, r0, #0x0 + UMLAL r3, r11, r12, lr + ADDS r4, r4, r11 + /* A[7] * B[2] */ + LDR lr, [r2, #8] + ADC r11, r0, #0x0 + UMLAL r4, r11, r12, lr + ADDS r5, r5, r11 + /* A[7] * B[3] */ + LDR lr, [r2, #12] + ADC r11, r0, #0x0 + UMLAL r5, r11, r12, lr + ADDS r6, r6, r11 + /* A[7] * B[4] */ + LDR lr, [r2, #16] + ADC r11, r0, #0x0 + UMLAL r6, r11, r12, lr + ADDS r7, r7, r11 + /* A[7] * B[5] */ + LDR lr, [r2, #20] + ADC r11, r0, #0x0 + UMLAL r7, r11, r12, lr + ADDS r8, r8, r11 + /* A[7] * B[6] */ + LDR lr, [r2, #24] + ADC r11, r0, #0x0 + UMLAL r8, r11, r12, lr + ADDS r9, r9, r11 + /* A[7] * B[7] */ + LDR lr, [r2, #28] + ADC r10, r0, #0x0 + UMLAL r9, r10, r12, lr + ADD lr, sp, #0x20 + STM lr, {r3, r4, r5, r6, r7, r8, r9, r10} + MOV r0, sp + /* Add c to a * b */ + LDR lr, [sp, #76] + LDM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + LDM lr!, {r1, r10, r11, r12} + ADDS r2, r2, r1 + ADCS r3, r3, r10 + ADCS r4, r4, r11 + ADCS r5, r5, r12 + LDM lr!, {r1, r10, r11, r12} + ADCS r6, r6, r1 + ADCS r7, r7, r10 + ADCS r8, r8, r11 + ADCS r9, r9, r12 + MOV r1, r9 + STM r0!, {r2, r3, r4, r5, r6, r7, r8, r9} + LDM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + ADCS r2, r2, #0x0 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + SUB r0, r0, #0x20 + /* Get 252..503 and 504..507 */ + LSR lr, r9, #24 + LSL r9, r9, #4 + ORR r9, r9, r8, LSR #28 + LSL r8, r8, #4 + ORR r8, r8, r7, LSR #28 + LSL r7, r7, #4 + ORR r7, r7, r6, LSR #28 + LSL r6, r6, #4 + ORR r6, r6, r5, LSR #28 + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r9, #28, #4 + /* Add order times bits 504..507 */ + MOV r10, #0x2c13 + MOVT r10, #0xa30a + MOV r11, #0x9ce5 + MOVT r11, #0xa7ed + MOV r1, #0x0 + UMLAL r2, r1, r10, lr + ADDS r3, r3, r1 + MOV r1, #0x0 + ADC r1, r1, #0x0 + UMLAL r3, r1, r11, lr + MOV r10, #0x6329 + MOVT r10, #0x5d08 + MOV r11, #0x621 + MOVT r11, #0xeb21 + ADDS r4, r4, r1 + MOV r1, #0x0 + ADC r1, r1, #0x0 + UMLAL r4, r1, r10, lr + ADDS r5, r5, r1 + MOV r1, #0x0 + ADC r1, r1, #0x0 + UMLAL r5, r1, r11, lr + ADDS r6, r6, r1 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + SUBS r6, r6, lr + SBCS r7, r7, #0x0 + SBCS r8, r8, #0x0 + SBC r9, r9, #0x0 + /* Sub product of top 8 words and order */ + MOV r12, sp + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0!, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + BFC r11, #28, #4 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r0, r0, #0x10 + SUB r12, r12, #0x20 + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r4, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r6, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADDS r10, r10, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r10, lr, r8, r1 + ADDS r11, r11, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + /* Subtract at 4 * 32 */ + LDM r12, {r10, r11} + SUBS r10, r10, r2 + SBCS r11, r11, r3 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r4 + SBCS r11, r11, r5 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r6 + SBCS r11, r11, r7 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r8 + SBC r11, r11, r9 + STM r12!, {r10, r11} + SUB r12, r12, #0x24 + ASR lr, r11, #25 + /* Conditionally subtract order starting at bit 125 */ + MOV r1, #0xa0000000 + MOV r2, #0xba7d + MOVT r2, #0x4b9e + MOV r3, #0x4c63 + MOVT r3, #0xcb02 + MOV r4, #0xf39a + MOVT r4, #0xd45e + MOV r5, #0xdf3b + MOVT r5, #0x29b + MOV r9, #0x2000000 + AND r1, r1, lr + AND r2, r2, lr + AND r3, r3, lr + AND r4, r4, lr + AND r5, r5, lr + AND r9, r9, lr + LDM r12, {r10, r11} + ADDS r10, r10, r1 + ADCS r11, r11, r2 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r3 + ADCS r11, r11, r4 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r5 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, #0x0 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10} + ADCS r10, r10, #0x0 + STM r12!, {r10} + SUB r0, r0, #0x10 + MOV r12, sp + /* Load bits 252-376 */ + ADD r12, r12, #0x1c + LDM r12, {r1, r2, r3, r4, r5} + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r5, #29, #3 + SUB r12, r12, #0x1c + /* Sub product of top 4 words and order */ + MOV r0, sp + /* * -5cf5d3ed */ + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, lr, r2, r1 + ADDS r7, r7, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r7, lr, r3, r1 + ADDS r8, r8, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r8, lr, r4, r1 + ADDS r9, r9, lr + MOV lr, #0x0 + ADC lr, lr, #0x0 + UMLAL r9, lr, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -5812631b */ + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV r10, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r10, r2, r1 + ADDS r7, r7, r10 + MOV r10, #0x0 + ADC r10, r10, #0x0 + UMLAL r7, r10, r3, r1 + ADDS r8, r8, r10 + MOV r10, #0x0 + ADC r10, r10, #0x0 + UMLAL r8, r10, r4, r1 + ADDS r9, r9, r10 + MOV r10, #0x0 + ADC r10, r10, #0x0 + UMLAL r9, r10, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -a2f79cd7 */ + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV r11, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r11, r2, r1 + ADDS r7, r7, r11 + MOV r11, #0x0 + ADC r11, r11, #0x0 + UMLAL r7, r11, r3, r1 + ADDS r8, r8, r11 + MOV r11, #0x0 + ADC r11, r11, #0x0 + UMLAL r8, r11, r4, r1 + ADDS r9, r9, r11 + MOV r11, #0x0 + ADC r11, r11, #0x0 + UMLAL r9, r11, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -14def9df */ + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV r12, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r12, r2, r1 + ADDS r7, r7, r12 + MOV r12, #0x0 + ADC r12, r12, #0x0 + UMLAL r7, r12, r3, r1 + ADDS r8, r8, r12 + MOV r12, #0x0 + ADC r12, r12, #0x0 + UMLAL r8, r12, r4, r1 + ADDS r9, r9, r12 + MOV r12, #0x0 + ADC r12, r12, #0x0 + UMLAL r9, r12, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* Add overflows at 4 * 32 */ + LDM r0, {r6, r7, r8, r9} + BFC r9, #28, #4 + ADDS r6, r6, lr + ADCS r7, r7, r10 + ADCS r8, r8, r11 + ADC r9, r9, r12 + /* Subtract top at 4 * 32 */ + SUBS r6, r6, r2 + SBCS r7, r7, r3 + SBCS r8, r8, r4 + SBCS r9, r9, r5 + SBC r1, r1, r1 + SUB r0, r0, #0x10 + LDM r0, {r2, r3, r4, r5} + MOV r10, #0xd3ed + MOVT r10, #0x5cf5 + MOV r11, #0x631a + MOVT r11, #0x5812 + MOV r12, #0x9cd6 + MOVT r12, #0xa2f7 + MOV lr, #0xf9de + MOVT lr, #0x14de + AND r10, r10, r1 + AND r11, r11, r1 + AND r12, r12, r1 + AND lr, lr, r1 + ADDS r2, r2, r10 + ADCS r3, r3, r11 + ADCS r4, r4, r12 + ADCS r5, r5, lr + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + AND r1, r1, #0x10000000 + ADCS r8, r8, #0x0 + ADC r9, r9, r1 + BFC r9, #28, #4 + LDR r0, [sp, #68] + /* Store result */ + STR r2, [r0] + STR r3, [r0, #4] + STR r4, [r0, #8] + STR r5, [r0, #12] + STR r6, [r0, #16] + STR r7, [r0, #20] + STR r8, [r0, #24] + STR r9, [r0, #28] + ADD sp, sp, #0x50 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 994 */ + .size sc_muladd,.-sc_muladd +#else + .text + .align 4 + .globl sc_muladd + .type sc_muladd, %function +sc_muladd: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0x50 + ADD lr, sp, #0x44 + STM lr, {r0, r1, r3} + MOV lr, r2 + LDM r1, {r0, r1, r2, r3} + LDM lr!, {r4, r5, r6} + UMULL r10, r11, r0, r4 + UMULL r12, r7, r1, r4 + UMAAL r11, r12, r0, r5 + UMULL r8, r9, r2, r4 + UMAAL r12, r8, r1, r5 + UMAAL r12, r7, r0, r6 + UMAAL r8, r9, r3, r4 + STM sp, {r10, r11, r12} + UMAAL r7, r8, r2, r5 + LDM lr!, {r4} + UMULL r10, r11, r1, r6 + UMAAL r8, r9, r2, r6 + UMAAL r7, r10, r0, r4 + UMAAL r8, r11, r3, r5 + STR r7, [sp, #12] + UMAAL r8, r10, r1, r4 + UMAAL r9, r11, r3, r6 + UMAAL r9, r10, r2, r4 + UMAAL r10, r11, r3, r4 + LDM lr, {r4, r5, r6, r7} + MOV r12, #0x0 + UMLAL r8, r12, r0, r4 + UMAAL r9, r12, r1, r4 + UMAAL r10, r12, r2, r4 + UMAAL r11, r12, r3, r4 + MOV r4, #0x0 + UMLAL r9, r4, r0, r5 + UMAAL r10, r4, r1, r5 + UMAAL r11, r4, r2, r5 + UMAAL r12, r4, r3, r5 + MOV r5, #0x0 + UMLAL r10, r5, r0, r6 + UMAAL r11, r5, r1, r6 + UMAAL r12, r5, r2, r6 + UMAAL r4, r5, r3, r6 + MOV r6, #0x0 + UMLAL r11, r6, r0, r7 + LDR r0, [sp, #72] + UMAAL r12, r6, r1, r7 + ADD r0, r0, #0x10 + UMAAL r4, r6, r2, r7 + SUB lr, lr, #0x10 + UMAAL r5, r6, r3, r7 + LDM r0, {r0, r1, r2, r3} + STR r6, [sp, #64] + LDM lr!, {r6} + MOV r7, #0x0 + UMLAL r8, r7, r0, r6 + UMAAL r9, r7, r1, r6 + STR r8, [sp, #16] + UMAAL r10, r7, r2, r6 + UMAAL r11, r7, r3, r6 + LDM lr!, {r6} + MOV r8, #0x0 + UMLAL r9, r8, r0, r6 + UMAAL r10, r8, r1, r6 + STR r9, [sp, #20] + UMAAL r11, r8, r2, r6 + UMAAL r12, r8, r3, r6 + LDM lr!, {r6} + MOV r9, #0x0 + UMLAL r10, r9, r0, r6 + UMAAL r11, r9, r1, r6 + STR r10, [sp, #24] + UMAAL r12, r9, r2, r6 + UMAAL r4, r9, r3, r6 + LDM lr!, {r6} + MOV r10, #0x0 + UMLAL r11, r10, r0, r6 + UMAAL r12, r10, r1, r6 + STR r11, [sp, #28] + UMAAL r4, r10, r2, r6 + UMAAL r5, r10, r3, r6 + LDM lr!, {r11} + UMAAL r12, r7, r0, r11 + UMAAL r4, r7, r1, r11 + LDR r6, [sp, #64] + UMAAL r5, r7, r2, r11 + UMAAL r6, r7, r3, r11 + LDM lr!, {r11} + UMAAL r4, r8, r0, r11 + UMAAL r5, r8, r1, r11 + UMAAL r6, r8, r2, r11 + UMAAL r7, r8, r3, r11 + LDM lr, {r11, lr} + UMAAL r5, r9, r0, r11 + UMAAL r6, r10, r0, lr + UMAAL r6, r9, r1, r11 + UMAAL r7, r10, r1, lr + UMAAL r7, r9, r2, r11 + UMAAL r8, r10, r2, lr + UMAAL r8, r9, r3, r11 + UMAAL r9, r10, r3, lr + MOV r3, r12 + ADD lr, sp, #0x20 + STM lr, {r3, r4, r5, r6, r7, r8, r9, r10} + MOV r0, sp + /* Add c to a * b */ + LDR lr, [sp, #76] + LDM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + LDM lr!, {r1, r10, r11, r12} + ADDS r2, r2, r1 + ADCS r3, r3, r10 + ADCS r4, r4, r11 + ADCS r5, r5, r12 + LDM lr!, {r1, r10, r11, r12} + ADCS r6, r6, r1 + ADCS r7, r7, r10 + ADCS r8, r8, r11 + ADCS r9, r9, r12 + MOV r1, r9 + STM r0!, {r2, r3, r4, r5, r6, r7, r8, r9} + LDM r0, {r2, r3, r4, r5, r6, r7, r8, r9} + ADCS r2, r2, #0x0 + ADCS r3, r3, #0x0 + ADCS r4, r4, #0x0 + ADCS r5, r5, #0x0 + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + SUB r0, r0, #0x20 + /* Get 252..503 and 504..507 */ + LSR lr, r9, #24 + LSL r9, r9, #4 + ORR r9, r9, r8, LSR #28 + LSL r8, r8, #4 + ORR r8, r8, r7, LSR #28 + LSL r7, r7, #4 + ORR r7, r7, r6, LSR #28 + LSL r6, r6, #4 + ORR r6, r6, r5, LSR #28 + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r9, #28, #4 + /* Add order times bits 504..507 */ + MOV r10, #0x2c13 + MOVT r10, #0xa30a + MOV r11, #0x9ce5 + MOVT r11, #0xa7ed + MOV r1, #0x0 + UMLAL r2, r1, r10, lr + UMAAL r3, r1, r11, lr + MOV r10, #0x6329 + MOVT r10, #0x5d08 + MOV r11, #0x621 + MOVT r11, #0xeb21 + UMAAL r4, r1, r10, lr + UMAAL r5, r1, r11, lr + ADDS r6, r6, r1 + ADCS r7, r7, #0x0 + ADCS r8, r8, #0x0 + ADC r9, r9, #0x0 + SUBS r6, r6, lr + SBCS r7, r7, #0x0 + SBCS r8, r8, #0x0 + SBC r9, r9, #0x0 + /* Sub product of top 8 words and order */ + MOV r12, sp + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0!, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r0!, {r10, r11} + UMAAL r10, lr, r8, r1 + BFC r11, #28, #4 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r0, r0, #0x10 + SUB r12, r12, #0x20 + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r8, r1 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r8, r1 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV lr, #0x0 + LDM r12, {r10, r11} + UMLAL r10, lr, r2, r1 + UMAAL r11, lr, r3, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r4, r1 + UMAAL r11, lr, r5, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r6, r1 + UMAAL r11, lr, r7, r1 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + UMAAL r10, lr, r8, r1 + UMAAL r11, lr, r9, r1 + STM r12!, {r10, r11, lr} + SUB r12, r12, #0x20 + /* Subtract at 4 * 32 */ + LDM r12, {r10, r11} + SUBS r10, r10, r2 + SBCS r11, r11, r3 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r4 + SBCS r11, r11, r5 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r6 + SBCS r11, r11, r7 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + SBCS r10, r10, r8 + SBC r11, r11, r9 + STM r12!, {r10, r11} + SUB r12, r12, #0x24 + ASR lr, r11, #25 + /* Conditionally subtract order starting at bit 125 */ + MOV r1, #0xa0000000 + MOV r2, #0xba7d + MOVT r2, #0x4b9e + MOV r3, #0x4c63 + MOVT r3, #0xcb02 + MOV r4, #0xf39a + MOVT r4, #0xd45e + MOV r5, #0xdf3b + MOVT r5, #0x29b + MOV r9, #0x2000000 + AND r1, r1, lr + AND r2, r2, lr + AND r3, r3, lr + AND r4, r4, lr + AND r5, r5, lr + AND r9, r9, lr + LDM r12, {r10, r11} + ADDS r10, r10, r1 + ADCS r11, r11, r2 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r3 + ADCS r11, r11, r4 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, r5 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10, r11} + ADCS r10, r10, #0x0 + ADCS r11, r11, #0x0 + STM r12!, {r10, r11} + LDM r12, {r10} + ADCS r10, r10, #0x0 + STM r12!, {r10} + SUB r0, r0, #0x10 + MOV r12, sp + /* Load bits 252-376 */ + ADD r12, r12, #0x1c + LDM r12, {r1, r2, r3, r4, r5} + LSL r5, r5, #4 + ORR r5, r5, r4, LSR #28 + LSL r4, r4, #4 + ORR r4, r4, r3, LSR #28 + LSL r3, r3, #4 + ORR r3, r3, r2, LSR #28 + LSL r2, r2, #4 + ORR r2, r2, r1, LSR #28 + BFC r5, #29, #3 + SUB r12, r12, #0x1c + /* Sub product of top 4 words and order */ + MOV r0, sp + /* * -5cf5d3ed */ + MOV r1, #0x2c13 + MOVT r1, #0xa30a + MOV lr, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, lr, r2, r1 + UMAAL r7, lr, r3, r1 + UMAAL r8, lr, r4, r1 + UMAAL r9, lr, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -5812631b */ + MOV r1, #0x9ce5 + MOVT r1, #0xa7ed + MOV r10, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r10, r2, r1 + UMAAL r7, r10, r3, r1 + UMAAL r8, r10, r4, r1 + UMAAL r9, r10, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -a2f79cd7 */ + MOV r1, #0x6329 + MOVT r1, #0x5d08 + MOV r11, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r11, r2, r1 + UMAAL r7, r11, r3, r1 + UMAAL r8, r11, r4, r1 + UMAAL r9, r11, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* * -14def9df */ + MOV r1, #0x621 + MOVT r1, #0xeb21 + MOV r12, #0x0 + LDM r0, {r6, r7, r8, r9} + UMLAL r6, r12, r2, r1 + UMAAL r7, r12, r3, r1 + UMAAL r8, r12, r4, r1 + UMAAL r9, r12, r5, r1 + STM r0, {r6, r7, r8, r9} + ADD r0, r0, #0x4 + /* Add overflows at 4 * 32 */ + LDM r0, {r6, r7, r8, r9} + BFC r9, #28, #4 + ADDS r6, r6, lr + ADCS r7, r7, r10 + ADCS r8, r8, r11 + ADC r9, r9, r12 + /* Subtract top at 4 * 32 */ + SUBS r6, r6, r2 + SBCS r7, r7, r3 + SBCS r8, r8, r4 + SBCS r9, r9, r5 + SBC r1, r1, r1 + SUB r0, r0, #0x10 + LDM r0, {r2, r3, r4, r5} + MOV r10, #0xd3ed + MOVT r10, #0x5cf5 + MOV r11, #0x631a + MOVT r11, #0x5812 + MOV r12, #0x9cd6 + MOVT r12, #0xa2f7 + MOV lr, #0xf9de + MOVT lr, #0x14de + AND r10, r10, r1 + AND r11, r11, r1 + AND r12, r12, r1 + AND lr, lr, r1 + ADDS r2, r2, r10 + ADCS r3, r3, r11 + ADCS r4, r4, r12 + ADCS r5, r5, lr + ADCS r6, r6, #0x0 + ADCS r7, r7, #0x0 + AND r1, r1, #0x10000000 + ADCS r8, r8, #0x0 + ADC r9, r9, r1 + BFC r9, #28, #4 + LDR r0, [sp, #68] + /* Store result */ + STR r2, [r0] + STR r3, [r0, #4] + STR r4, [r0, #8] + STR r5, [r0, #12] + STR r6, [r0, #16] + STR r7, [r0, #20] + STR r8, [r0, #24] + STR r9, [r0, #28] + ADD sp, sp, #0x50 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 752 */ + .size sc_muladd,.-sc_muladd +#endif /* WOLFSSL_SP_NO_UMAAL */ +#endif /* HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ + +#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ +#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519_c.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,6900 @@ +/* thumb2-curve25519 + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./x25519/x25519.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-curve25519.c + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +/* Based on work by: Emil Lenngren + * https://github.com/pornin/X25519-Cortex-M4 + */ + +#include +#define CURVED25519_ASM +#include + +#if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) +#if !defined(CURVE25519_SMALL) || !defined(ED25519_SMALL) + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_init() +#else +void fe_init() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + "\n\t" + : + : + : "memory", "cc" + ); +} + +void fe_add_sub_op(void); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_add_sub_op() +#else +void fe_add_sub_op() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + /* Add-Sub */ + "LDRD r4, r5, [r2]\n\t" + "LDRD r6, r7, [r3]\n\t" + /* Add */ + "ADDS r8, r4, r6\n\t" + "MOV r12, #0x0\n\t" + "ADCS r9, r5, r7\n\t" + "ADC r12, r12, #0x0\n\t" + "STRD r8, r9, [r0]\n\t" + /* Sub */ + "SUBS r10, r4, r6\n\t" + "SBCS r11, r5, r7\n\t" + "STRD r10, r11, [r1]\n\t" + "LDRD r4, r5, [r2, #8]\n\t" + "LDRD r6, r7, [r3, #8]\n\t" + /* Sub */ + "SBCS r10, r4, r6\n\t" + "MOV lr, #0x0\n\t" + "SBCS r11, r5, r7\n\t" + "ADC lr, lr, #0x0\n\t" + "STRD r10, r11, [r1, #8]\n\t" + /* Add */ + "SUBS r12, r12, #0x1\n\t" + "ADCS r8, r4, r6\n\t" + "ADCS r9, r5, r7\n\t" + "STRD r8, r9, [r0, #8]\n\t" + "LDRD r4, r5, [r2, #16]\n\t" + "LDRD r6, r7, [r3, #16]\n\t" + /* Add */ + "ADCS r8, r4, r6\n\t" + "MOV r12, #0x0\n\t" + "ADCS r9, r5, r7\n\t" + "ADC r12, r12, #0x0\n\t" + "STRD r8, r9, [r0, #16]\n\t" + /* Sub */ + "SUBS lr, lr, #0x1\n\t" + "SBCS r10, r4, r6\n\t" + "SBCS r11, r5, r7\n\t" + "STRD r10, r11, [r1, #16]\n\t" + "LDRD r4, r5, [r2, #24]\n\t" + "LDRD r6, r7, [r3, #24]\n\t" + /* Sub */ + "SBCS r10, r4, r6\n\t" + "SBC r11, r5, r7\n\t" + /* Add */ + "SUBS r12, r12, #0x1\n\t" + "ADCS r8, r4, r6\n\t" + "MOV r12, #0x0\n\t" + "ADCS r9, r5, r7\n\t" + "ADC r12, r12, #0x0\n\t" + /* Multiply -modulus by overflow */ + "LSL r3, r12, #1\n\t" + "MOV r12, #0x13\n\t" + "ORR r3, r3, r9, LSR #31\n\t" + "MUL r12, r3, r12\n\t" + /* Add -x*modulus (if overflow) */ + "LDRD r4, r5, [r0]\n\t" + "LDRD r6, r7, [r0, #8]\n\t" + "ADDS r4, r4, r12\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "STRD r4, r5, [r0]\n\t" + "STRD r6, r7, [r0, #8]\n\t" + "LDRD r4, r5, [r0, #16]\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "STRD r4, r5, [r0, #16]\n\t" + "BFC r9, #31, #1\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "STRD r8, r9, [r0, #24]\n\t" + /* Add -modulus on underflow */ + "MOV lr, #0x13\n\t" + "AND lr, lr, r11, ASR #31\n\t" + "LDM r1, {r4, r5, r6, r7, r8, r9}\n\t" + "SUBS r4, r4, lr\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "BFC r11, #31, #1\n\t" + "SBCS r10, r10, #0x0\n\t" + "SBC r11, r11, #0x0\n\t" + "STM r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Add-Sub */ + : + : + : "memory", "lr", "cc" + ); +} + +void fe_sub_op(void); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_sub_op() +#else +void fe_sub_op() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + /* Sub */ + "LDM r2!, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + "LDM r1!, {r2, r3, r4, r5}\n\t" + "SUBS r6, r2, r6\n\t" + "SBCS r7, r3, r7\n\t" + "SBCS r8, r4, r8\n\t" + "SBCS r9, r5, r9\n\t" + "LDM r1!, {r2, r3, r4, r5}\n\t" + "SBCS r10, r2, r10\n\t" + "SBCS r11, r3, r11\n\t" + "SBCS r12, r4, r12\n\t" + "SBC lr, r5, lr\n\t" + "MOV r2, #0x13\n\t" + "AND r2, r2, lr, ASR #31\n\t" + "SUBS r6, r6, r2\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, #0x0\n\t" + "SBCS r11, r11, #0x0\n\t" + "BFC lr, #31, #1\n\t" + "SBCS r12, r12, #0x0\n\t" + "SBC lr, lr, #0x0\n\t" + "STM r0, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + /* Done Sub */ + : + : + : "memory", "lr", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_sub(fe r_p, const fe a_p, const fe b_p) +#else +void fe_sub(fe r, const fe a, const fe b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; + register const sword32* b __asm__ ("r2") = (const sword32*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "BL fe_sub_op\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +void fe_add_op(void); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_add_op() +#else +void fe_add_op() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + /* Add */ + "LDM r2!, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + "LDM r1!, {r2, r3, r4, r5}\n\t" + "ADDS r6, r2, r6\n\t" + "ADCS r7, r3, r7\n\t" + "ADCS r8, r4, r8\n\t" + "ADCS r9, r5, r9\n\t" + "LDM r1!, {r2, r3, r4, r5}\n\t" + "ADCS r10, r2, r10\n\t" + "ADCS r11, r3, r11\n\t" + "ADCS r12, r4, r12\n\t" + "ADC lr, r5, lr\n\t" + "MOV r2, #0x13\n\t" + "AND r2, r2, lr, ASR #31\n\t" + "ADDS r6, r6, r2\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "BFC lr, #31, #1\n\t" + "ADCS r12, r12, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "STM r0, {r6, r7, r8, r9, r10, r11, r12, lr}\n\t" + /* Done Add */ + : + : + : "memory", "lr", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_add(fe r_p, const fe a_p, const fe b_p) +#else +void fe_add(fe r, const fe a, const fe b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; + register const sword32* b __asm__ ("r2") = (const sword32*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "BL fe_add_op\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifdef HAVE_ED25519 +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_frombytes(fe out_p, const unsigned char* in_p) +#else +void fe_frombytes(fe out, const unsigned char* in) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* out __asm__ ("r0") = (sword32*)out_p; + register const unsigned char* in __asm__ ("r1") = (const unsigned char*)in_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR r2, [%[in]]\n\t" + "LDR r3, [%[in], #4]\n\t" + "LDR r4, [%[in], #8]\n\t" + "LDR r5, [%[in], #12]\n\t" + "LDR r6, [%[in], #16]\n\t" + "LDR r7, [%[in], #20]\n\t" + "LDR r8, [%[in], #24]\n\t" + "LDR r9, [%[in], #28]\n\t" + "BFC r9, #31, #1\n\t" + "STR r2, [%[out]]\n\t" + "STR r3, [%[out], #4]\n\t" + "STR r4, [%[out], #8]\n\t" + "STR r5, [%[out], #12]\n\t" + "STR r6, [%[out], #16]\n\t" + "STR r7, [%[out], #20]\n\t" + "STR r8, [%[out], #24]\n\t" + "STR r9, [%[out], #28]\n\t" + : [out] "+r" (out), [in] "+r" (in) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_tobytes(unsigned char* out_p, const fe n_p) +#else +void fe_tobytes(unsigned char* out, const fe n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register unsigned char* out __asm__ ("r0") = (unsigned char*)out_p; + register const sword32* n __asm__ ("r1") = (const sword32*)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[n], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADDS r10, r2, #0x13\n\t" + "ADCS r10, r3, #0x0\n\t" + "ADCS r10, r4, #0x0\n\t" + "ADCS r10, r5, #0x0\n\t" + "ADCS r10, r6, #0x0\n\t" + "ADCS r10, r7, #0x0\n\t" + "ADCS r10, r8, #0x0\n\t" + "ADC r10, r9, #0x0\n\t" + "ASR r10, r10, #31\n\t" + "AND r10, r10, #0x13\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "BFC r9, #31, #1\n\t" + "STR r2, [%[out]]\n\t" + "STR r3, [%[out], #4]\n\t" + "STR r4, [%[out], #8]\n\t" + "STR r5, [%[out], #12]\n\t" + "STR r6, [%[out], #16]\n\t" + "STR r7, [%[out], #20]\n\t" + "STR r8, [%[out], #24]\n\t" + "STR r9, [%[out], #28]\n\t" + : [out] "+r" (out), [n] "+r" (n) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_1(fe n_p) +#else +void fe_1(fe n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* n __asm__ ("r0") = (sword32*)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* Set one */ + "MOV r2, #0x1\n\t" + "MOV r3, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x0\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "STM %[n], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + : [n] "+r" (n) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_0(fe n_p) +#else +void fe_0(fe n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* n __asm__ ("r0") = (sword32*)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* Set zero */ + "MOV r2, #0x0\n\t" + "MOV r3, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x0\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "STM %[n], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + : [n] "+r" (n) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_copy(fe r_p, const fe a_p) +#else +void fe_copy(fe r, const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* Copy */ + "LDRD r2, r3, [%[a]]\n\t" + "LDRD r4, r5, [%[a], #8]\n\t" + "STRD r2, r3, [%[r]]\n\t" + "STRD r4, r5, [%[r], #8]\n\t" + "LDRD r2, r3, [%[a], #16]\n\t" + "LDRD r4, r5, [%[a], #24]\n\t" + "STRD r2, r3, [%[r], #16]\n\t" + "STRD r4, r5, [%[r], #24]\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_neg(fe r_p, const fe a_p) +#else +void fe_neg(fe r, const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MVN r7, #0x0\n\t" + "MVN r6, #0x12\n\t" + "LDM %[a]!, {r2, r3, r4, r5}\n\t" + "SUBS r2, r6, r2\n\t" + "SBCS r3, r7, r3\n\t" + "SBCS r4, r7, r4\n\t" + "SBCS r5, r7, r5\n\t" + "STM %[r]!, {r2, r3, r4, r5}\n\t" + "MVN r6, #0x80000000\n\t" + "LDM %[a]!, {r2, r3, r4, r5}\n\t" + "SBCS r2, r7, r2\n\t" + "SBCS r3, r7, r3\n\t" + "SBCS r4, r7, r4\n\t" + "SBC r5, r6, r5\n\t" + "STM %[r]!, {r2, r3, r4, r5}\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +int fe_isnonzero(const fe a_p) +#else +int fe_isnonzero(const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sword32* a __asm__ ("r0") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADDS r1, r2, #0x13\n\t" + "ADCS r1, r3, #0x0\n\t" + "ADCS r1, r4, #0x0\n\t" + "ADCS r1, r5, #0x0\n\t" + "ADCS r1, r6, #0x0\n\t" + "ADCS r1, r7, #0x0\n\t" + "ADCS r1, r8, #0x0\n\t" + "ADC r1, r9, #0x0\n\t" + "ASR r1, r1, #31\n\t" + "AND r1, r1, #0x13\n\t" + "ADDS r2, r2, r1\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "BFC r9, #31, #1\n\t" + "ORR r2, r2, r3\n\t" + "ORR r4, r4, r5\n\t" + "ORR r6, r6, r7\n\t" + "ORR r8, r8, r9\n\t" + "ORR r4, r4, r6\n\t" + "ORR r2, r2, r8\n\t" + "ORR %[a], r2, r4\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)a; +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +int fe_isnegative(const fe a_p) +#else +int fe_isnegative(const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sword32* a __asm__ ("r0") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r2, r3, r4, r5}\n\t" + "ADDS r1, r2, #0x13\n\t" + "ADCS r1, r3, #0x0\n\t" + "ADCS r1, r4, #0x0\n\t" + "ADCS r1, r5, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "ADCS r1, r2, #0x0\n\t" + "ADCS r1, r3, #0x0\n\t" + "ADCS r1, r4, #0x0\n\t" + "LDR r2, [%[a], #-16]\n\t" + "ADC r1, r5, #0x0\n\t" + "AND %[a], r2, #0x1\n\t" + "LSR r1, r1, #31\n\t" + "EOR %[a], %[a], r1\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "cc" + ); + return (uint32_t)(size_t)a; +} + +#if defined(HAVE_ED25519_MAKE_KEY) || defined(HAVE_ED25519_SIGN) +#ifndef WC_NO_CACHE_RESISTANT +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_cmov_table(fe* r_p, fe* base_p, signed char b_p) +#else +void fe_cmov_table(fe* r, fe* base, signed char b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register fe* r __asm__ ("r0") = (fe*)r_p; + register fe* base __asm__ ("r1") = (fe*)base_p; + register signed char b __asm__ ("r2") = (signed char)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SXTB %[b], %[b]\n\t" + "SBFX r3, %[b], #7, #1\n\t" + "EOR r12, %[b], r3\n\t" + "SUB r12, r12, r3\n\t" + "MOV r4, #0x1\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #31\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #30\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #29\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #28\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #27\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #26\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #25\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #24\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base]]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #32]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #64]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "SUB %[base], %[base], #0x2a0\n\t" + "MVN r10, #0x12\n\t" + "MVN r11, #0x0\n\t" + "SUBS r10, r10, r8\n\t" + "SBCS r11, r11, r9\n\t" + "SBC lr, lr, lr\n\t" + "ASR r12, %[b], #31\n\t" + "EOR r3, r4, r6\n\t" + "AND r3, r3, r12\n\t" + "EOR r4, r4, r3\n\t" + "EOR r6, r6, r3\n\t" + "EOR r3, r5, r7\n\t" + "AND r3, r3, r12\n\t" + "EOR r5, r5, r3\n\t" + "EOR r7, r7, r3\n\t" + "EOR r10, r10, r8\n\t" + "AND r10, r10, r12\n\t" + "EOR r8, r8, r10\n\t" + "EOR r11, r11, r9\n\t" + "AND r11, r11, r12\n\t" + "EOR r9, r9, r11\n\t" + "STRD r4, r5, [%[r]]\n\t" + "STRD r6, r7, [%[r], #32]\n\t" + "STRD r8, r9, [%[r], #64]\n\t" + "SBFX r3, %[b], #7, #1\n\t" + "EOR r12, %[b], r3\n\t" + "SUB r12, r12, r3\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x0\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #31\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #30\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #29\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #28\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #27\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #26\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #25\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #24\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #8]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #40]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #72]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "SUB %[base], %[base], #0x2a0\n\t" + "MVN r10, #0x0\n\t" + "MVN r11, #0x0\n\t" + "RSBS lr, lr, #0x0\n\t" + "SBCS r10, r10, r8\n\t" + "SBCS r11, r11, r9\n\t" + "SBC lr, lr, lr\n\t" + "ASR r12, %[b], #31\n\t" + "EOR r3, r4, r6\n\t" + "AND r3, r3, r12\n\t" + "EOR r4, r4, r3\n\t" + "EOR r6, r6, r3\n\t" + "EOR r3, r5, r7\n\t" + "AND r3, r3, r12\n\t" + "EOR r5, r5, r3\n\t" + "EOR r7, r7, r3\n\t" + "EOR r10, r10, r8\n\t" + "AND r10, r10, r12\n\t" + "EOR r8, r8, r10\n\t" + "EOR r11, r11, r9\n\t" + "AND r11, r11, r12\n\t" + "EOR r9, r9, r11\n\t" + "STRD r4, r5, [%[r], #8]\n\t" + "STRD r6, r7, [%[r], #40]\n\t" + "STRD r8, r9, [%[r], #72]\n\t" + "SBFX r3, %[b], #7, #1\n\t" + "EOR r12, %[b], r3\n\t" + "SUB r12, r12, r3\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x0\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #31\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #30\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #29\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #28\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #27\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #26\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #25\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #24\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #48]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #80]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "SUB %[base], %[base], #0x2a0\n\t" + "MVN r10, #0x0\n\t" + "MVN r11, #0x0\n\t" + "RSBS lr, lr, #0x0\n\t" + "SBCS r10, r10, r8\n\t" + "SBCS r11, r11, r9\n\t" + "SBC lr, lr, lr\n\t" + "ASR r12, %[b], #31\n\t" + "EOR r3, r4, r6\n\t" + "AND r3, r3, r12\n\t" + "EOR r4, r4, r3\n\t" + "EOR r6, r6, r3\n\t" + "EOR r3, r5, r7\n\t" + "AND r3, r3, r12\n\t" + "EOR r5, r5, r3\n\t" + "EOR r7, r7, r3\n\t" + "EOR r10, r10, r8\n\t" + "AND r10, r10, r12\n\t" + "EOR r8, r8, r10\n\t" + "EOR r11, r11, r9\n\t" + "AND r11, r11, r12\n\t" + "EOR r9, r9, r11\n\t" + "STRD r4, r5, [%[r], #16]\n\t" + "STRD r6, r7, [%[r], #48]\n\t" + "STRD r8, r9, [%[r], #80]\n\t" + "SBFX r3, %[b], #7, #1\n\t" + "EOR r12, %[b], r3\n\t" + "SUB r12, r12, r3\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x0\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #31\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #30\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #29\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #28\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #27\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #26\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #25\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "ADD %[base], %[base], #0x60\n\t" + "MOV r3, #0x80000000\n\t" + "ROR r3, r3, #24\n\t" + "ROR r3, r3, r12\n\t" + "ASR r3, r3, #31\n\t" + "LDRD r10, r11, [%[base], #24]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "LDRD r10, r11, [%[base], #56]\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r6, r6, r10\n\t" + "EOR r7, r7, r11\n\t" + "LDRD r10, r11, [%[base], #88]\n\t" + "EOR r10, r10, r8\n\t" + "EOR r11, r11, r9\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "EOR r8, r8, r10\n\t" + "EOR r9, r9, r11\n\t" + "SUB %[base], %[base], #0x2a0\n\t" + "MVN r10, #0x0\n\t" + "MVN r11, #0x80000000\n\t" + "RSBS lr, lr, #0x0\n\t" + "SBCS r10, r10, r8\n\t" + "SBC r11, r11, r9\n\t" + "ASR r12, %[b], #31\n\t" + "EOR r3, r4, r6\n\t" + "AND r3, r3, r12\n\t" + "EOR r4, r4, r3\n\t" + "EOR r6, r6, r3\n\t" + "EOR r3, r5, r7\n\t" + "AND r3, r3, r12\n\t" + "EOR r5, r5, r3\n\t" + "EOR r7, r7, r3\n\t" + "EOR r10, r10, r8\n\t" + "AND r10, r10, r12\n\t" + "EOR r8, r8, r10\n\t" + "EOR r11, r11, r9\n\t" + "AND r11, r11, r12\n\t" + "EOR r9, r9, r11\n\t" + "STRD r4, r5, [%[r], #24]\n\t" + "STRD r6, r7, [%[r], #56]\n\t" + "STRD r8, r9, [%[r], #88]\n\t" + : [r] "+r" (r), [base] "+r" (base), [b] "+r" (b) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r3", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_cmov_table(fe* r_p, fe* base_p, signed char b_p) +#else +void fe_cmov_table(fe* r, fe* base, signed char b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register fe* r __asm__ ("r0") = (fe*)r_p; + register fe* base __asm__ ("r1") = (fe*)base_p; + register signed char b __asm__ ("r2") = (signed char)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SXTB %[b], %[b]\n\t" + "SBFX r3, %[b], #7, #1\n\t" + "EOR %[b], %[b], r3\n\t" + "SUB %[b], %[b], r3\n\t" + "CLZ lr, %[b]\n\t" + "LSL lr, lr, #26\n\t" + "ASR lr, lr, #31\n\t" + "MVN lr, lr\n\t" + "ADD %[b], %[b], lr\n\t" + "MOV r12, #0x60\n\t" + "MUL %[b], %[b], r12\n\t" + "ADD %[base], %[base], %[b]\n\t" + "LDM %[base]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r6, r6, lr\n\t" + "AND r7, r7, lr\n\t" + "AND r8, r8, lr\n\t" + "AND r9, r9, lr\n\t" + "AND r10, r10, lr\n\t" + "AND r11, r11, lr\n\t" + "MVN r12, lr\n\t" + "SUB r4, r4, r12\n\t" + "MOV r12, #0x20\n\t" + "AND r12, r12, r3\n\t" + "ADD %[r], %[r], r12\n\t" + "STM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "SUB %[r], %[r], r12\n\t" + "LDM %[base]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r6, r6, lr\n\t" + "AND r7, r7, lr\n\t" + "AND r8, r8, lr\n\t" + "AND r9, r9, lr\n\t" + "AND r10, r10, lr\n\t" + "AND r11, r11, lr\n\t" + "MVN r12, lr\n\t" + "SUB r4, r4, r12\n\t" + "MOV r12, #0x20\n\t" + "BIC r12, r12, r3\n\t" + "ADD %[r], %[r], r12\n\t" + "STM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "SUB %[r], %[r], r12\n\t" + "ADD %[r], %[r], #0x40\n\t" + "LDM %[base]!, {r4, r5, r6, r7}\n\t" + "MVN r12, #0x12\n\t" + "SUBS r8, r12, r4\n\t" + "SBCS r9, r3, r5\n\t" + "SBCS r10, r3, r6\n\t" + "SBCS r11, r3, r7\n\t" + "BIC r4, r4, r3\n\t" + "BIC r5, r5, r3\n\t" + "BIC r6, r6, r3\n\t" + "BIC r7, r7, r3\n\t" + "AND r8, r8, r3\n\t" + "AND r9, r9, r3\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "ORR r4, r4, r8\n\t" + "ORR r5, r5, r9\n\t" + "ORR r6, r6, r10\n\t" + "ORR r7, r7, r11\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r6, r6, lr\n\t" + "AND r7, r7, lr\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[base]!, {r4, r5, r6, r7}\n\t" + "MVN r12, #0x80000000\n\t" + "SBCS r8, r3, r4\n\t" + "SBCS r9, r3, r5\n\t" + "SBCS r10, r3, r6\n\t" + "SBC r11, r12, r7\n\t" + "BIC r4, r4, r3\n\t" + "BIC r5, r5, r3\n\t" + "BIC r6, r6, r3\n\t" + "BIC r7, r7, r3\n\t" + "AND r8, r8, r3\n\t" + "AND r9, r9, r3\n\t" + "AND r10, r10, r3\n\t" + "AND r11, r11, r3\n\t" + "ORR r4, r4, r8\n\t" + "ORR r5, r5, r9\n\t" + "ORR r6, r6, r10\n\t" + "ORR r7, r7, r11\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r6, r6, lr\n\t" + "AND r7, r7, lr\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "SUB %[base], %[base], %[b]\n\t" + : [r] "+r" (r), [base] "+r" (base), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_ED25519_MAKE_KEY || HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ +#ifdef WOLFSSL_SP_NO_UMAAL +void fe_mul_op(void); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_mul_op() +#else +void fe_mul_op() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + "SUB sp, sp, #0x28\n\t" + "STR r0, [sp, #36]\n\t" + "MOV r0, #0x0\n\t" + "LDR r12, [r1]\n\t" + /* A[0] * B[0] */ + "LDR lr, [r2]\n\t" + "UMULL r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "UMULL r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "UMULL r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "UMULL r9, r10, r12, lr\n\t" + "STR r3, [sp]\n\t" + /* A[0] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "MOV r11, r0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[0] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[0] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[0] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r3, r0, #0x0\n\t" + "UMLAL r10, r3, r12, lr\n\t" + /* A[1] * B[0] */ + "LDR r12, [r1, #4]\n\t" + "LDR lr, [r2]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "STR r4, [sp, #4]\n\t" + "ADDS r5, r5, r11\n\t" + /* A[1] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[1] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[1] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[1] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[1] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[1] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[1] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADC r4, r0, #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "LDR r12, [r1, #8]\n\t" + "LDR lr, [r2]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "STR r5, [sp, #8]\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[2] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[2] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[2] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[2] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADC r5, r0, #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "LDR r12, [r1, #12]\n\t" + "LDR lr, [r2]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[3] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[3] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[3] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[3] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[3] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADC r6, r0, #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "LDR r12, [r1, #16]\n\t" + "LDR lr, [r2]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[4] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[4] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[4] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[4] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[4] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[4] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[4] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADC r7, r0, #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "LDR r12, [r1, #20]\n\t" + "LDR lr, [r2]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[5] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[5] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[5] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[5] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[5] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[5] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADC r8, r0, #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "LDR r12, [r1, #24]\n\t" + "LDR lr, [r2]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[6] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[6] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[6] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[6] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[6] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[6] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADC r9, r0, #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "LDR r12, [r1, #28]\n\t" + "LDR lr, [r2]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[7] * B[1] */ + "LDR lr, [r2, #4]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[7] * B[2] */ + "LDR lr, [r2, #8]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[7] * B[3] */ + "LDR lr, [r2, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[7] * B[4] */ + "LDR lr, [r2, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[7] * B[5] */ + "LDR lr, [r2, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[7] * B[6] */ + "LDR lr, [r2, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[7] * B[7] */ + "LDR lr, [r2, #28]\n\t" + "ADC r10, r0, #0x0\n\t" + "UMLAL r9, r10, r12, lr\n\t" + /* Reduce */ + "LDR r2, [sp, #28]\n\t" + "MOV lr, sp\n\t" + "MOV r12, #0x26\n\t" + "UMULL r10, r11, r10, r12\n\t" + "ADDS r10, r10, r2\n\t" + "ADC r11, r11, #0x0\n\t" + "MOV r12, #0x13\n\t" + "LSL r11, r11, #1\n\t" + "ORR r11, r11, r10, LSR #31\n\t" + "MUL r11, r11, r12\n\t" + "LDM lr!, {r1, r2}\n\t" + "MOV r12, #0x26\n\t" + "ADDS r1, r1, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r1, r11, r3, r12\n\t" + "ADDS r2, r2, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r2, r11, r4, r12\n\t" + "LDM lr!, {r3, r4}\n\t" + "ADDS r3, r3, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r5, r12\n\t" + "ADDS r4, r4, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r6, r12\n\t" + "LDM lr!, {r5, r6}\n\t" + "ADDS r5, r5, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r7, r12\n\t" + "ADDS r6, r6, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r8, r12\n\t" + "LDM lr!, {r7, r8}\n\t" + "ADDS r7, r7, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r9, r12\n\t" + "BFC r10, #31, #1\n\t" + "ADDS r8, r10, r11\n\t" + /* Store */ + "LDR r0, [sp, #36]\n\t" + "STM r0, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x28\n\t" + : + : + : "memory", "lr", "cc" + ); +} + +#else +void fe_mul_op(void); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_mul_op() +#else +void fe_mul_op() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + "SUB sp, sp, #0x2c\n\t" + "STRD r0, r1, [sp, #36]\n\t" + "MOV lr, r2\n\t" + "LDM r1, {r0, r1, r2, r3}\n\t" + "LDM lr!, {r4, r5, r6}\n\t" + "UMULL r10, r11, r0, r4\n\t" + "UMULL r12, r7, r1, r4\n\t" + "UMAAL r11, r12, r0, r5\n\t" + "UMULL r8, r9, r2, r4\n\t" + "UMAAL r12, r8, r1, r5\n\t" + "UMAAL r12, r7, r0, r6\n\t" + "UMAAL r8, r9, r3, r4\n\t" + "STM sp, {r10, r11, r12}\n\t" + "UMAAL r7, r8, r2, r5\n\t" + "LDM lr!, {r4}\n\t" + "UMULL r10, r11, r1, r6\n\t" + "UMAAL r8, r9, r2, r6\n\t" + "UMAAL r7, r10, r0, r4\n\t" + "UMAAL r8, r11, r3, r5\n\t" + "STR r7, [sp, #12]\n\t" + "UMAAL r8, r10, r1, r4\n\t" + "UMAAL r9, r11, r3, r6\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "UMAAL r10, r11, r3, r4\n\t" + "LDM lr, {r4, r5, r6, r7}\n\t" + "MOV r12, #0x0\n\t" + "UMLAL r8, r12, r0, r4\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r10, r12, r2, r4\n\t" + "UMAAL r11, r12, r3, r4\n\t" + "MOV r4, #0x0\n\t" + "UMLAL r9, r4, r0, r5\n\t" + "UMAAL r10, r4, r1, r5\n\t" + "UMAAL r11, r4, r2, r5\n\t" + "UMAAL r12, r4, r3, r5\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r0, r6\n\t" + "UMAAL r11, r5, r1, r6\n\t" + "UMAAL r12, r5, r2, r6\n\t" + "UMAAL r4, r5, r3, r6\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r11, r6, r0, r7\n\t" + "LDR r0, [sp, #40]\n\t" + "UMAAL r12, r6, r1, r7\n\t" + "ADD r0, r0, #0x10\n\t" + "UMAAL r4, r6, r2, r7\n\t" + "SUB lr, lr, #0x10\n\t" + "UMAAL r5, r6, r3, r7\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "STR r6, [sp, #32]\n\t" + "LDM lr!, {r6}\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r8, r7, r0, r6\n\t" + "UMAAL r9, r7, r1, r6\n\t" + "STR r8, [sp, #16]\n\t" + "UMAAL r10, r7, r2, r6\n\t" + "UMAAL r11, r7, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r8, #0x0\n\t" + "UMLAL r9, r8, r0, r6\n\t" + "UMAAL r10, r8, r1, r6\n\t" + "STR r9, [sp, #20]\n\t" + "UMAAL r11, r8, r2, r6\n\t" + "UMAAL r12, r8, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r10, r9, r0, r6\n\t" + "UMAAL r11, r9, r1, r6\n\t" + "STR r10, [sp, #24]\n\t" + "UMAAL r12, r9, r2, r6\n\t" + "UMAAL r4, r9, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r10, #0x0\n\t" + "UMLAL r11, r10, r0, r6\n\t" + "UMAAL r12, r10, r1, r6\n\t" + "STR r11, [sp, #28]\n\t" + "UMAAL r4, r10, r2, r6\n\t" + "UMAAL r5, r10, r3, r6\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r12, r7, r0, r11\n\t" + "UMAAL r4, r7, r1, r11\n\t" + "LDR r6, [sp, #32]\n\t" + "UMAAL r5, r7, r2, r11\n\t" + "UMAAL r6, r7, r3, r11\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r4, r8, r0, r11\n\t" + "UMAAL r5, r8, r1, r11\n\t" + "UMAAL r6, r8, r2, r11\n\t" + "UMAAL r7, r8, r3, r11\n\t" + "LDM lr, {r11, lr}\n\t" + "UMAAL r5, r9, r0, r11\n\t" + "UMAAL r6, r10, r0, lr\n\t" + "UMAAL r6, r9, r1, r11\n\t" + "UMAAL r7, r10, r1, lr\n\t" + "UMAAL r7, r9, r2, r11\n\t" + "UMAAL r8, r10, r2, lr\n\t" + "UMAAL r8, r9, r3, r11\n\t" + "UMAAL r9, r10, r3, lr\n\t" + /* Reduce */ + "LDR r0, [sp, #28]\n\t" + "MOV lr, #0x25\n\t" + "UMAAL r10, r0, r10, lr\n\t" + "MOV lr, #0x13\n\t" + "LSL r0, r0, #1\n\t" + "ORR r0, r0, r10, LSR #31\n\t" + "MUL r11, r0, lr\n\t" + "POP {r0, r1, r2}\n\t" + "MOV lr, #0x26\n\t" + "UMAAL r0, r11, r12, lr\n\t" + "UMAAL r1, r11, r4, lr\n\t" + "UMAAL r2, r11, r5, lr\n\t" + "POP {r3, r4, r5}\n\t" + "UMAAL r3, r11, r6, lr\n\t" + "UMAAL r4, r11, r7, lr\n\t" + "UMAAL r5, r11, r8, lr\n\t" + "POP {r6}\n\t" + "BFC r10, #31, #1\n\t" + "UMAAL r6, r11, r9, lr\n\t" + "ADD r7, r10, r11\n\t" + "LDR lr, [sp, #8]\n\t" + /* Store */ + "STM lr, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + "ADD sp, sp, #0x10\n\t" + : + : + : "memory", "lr", "cc" + ); +} + +#endif /* WOLFSSL_SP_NO_UMAAL */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_mul(fe r_p, const fe a_p, const fe b_p) +#else +void fe_mul(fe r, const fe a, const fe b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; + register const sword32* b __asm__ ("r2") = (const sword32*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "BL fe_mul_op\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifdef WOLFSSL_SP_NO_UMAAL +void fe_sq_op(void); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_sq_op() +#else +void fe_sq_op() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + "SUB sp, sp, #0x44\n\t" + "STR r0, [sp, #64]\n\t" + /* Square */ + "MOV r0, #0x0\n\t" + "LDR r12, [r1]\n\t" + /* A[0] * A[1] */ + "LDR lr, [r1, #4]\n\t" + "UMULL r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "LDR lr, [r1, #12]\n\t" + "UMULL r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "UMULL r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "UMULL r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "LDR lr, [r1, #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[0] * A[4] */ + "LDR lr, [r1, #16]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[0] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + "ADCS r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + "STR r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "LDR r12, [r1, #4]\n\t" + "LDR lr, [r1, #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[1] * A[3] */ + "LDR lr, [r1, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[1] * A[4] */ + "LDR lr, [r1, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[1] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[1] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[1] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r4, r0, #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "LDR r12, [r1, #8]\n\t" + "LDR lr, [r1, #12]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * A[4] */ + "LDR lr, [r1, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[2] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[2] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r5, r0, #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "LDR r12, [r1, #12]\n\t" + "LDR lr, [r1, #16]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[3] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[3] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r6, r0, #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "LDR r12, [r1, #16]\n\t" + "LDR lr, [r1, #20]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[4] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[4] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r7, r0, #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "LDR r12, [r1, #20]\n\t" + "LDR lr, [r1, #24]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[5] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r8, r0, #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "LDR r12, [r1, #24]\n\t" + "LDR lr, [r1, #28]\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "STM lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADCS r3, r3, r3\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADC r10, r0, #0x0\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "MOV lr, sp\n\t" + /* A[0] * A[0] */ + "LDR r12, [r1]\n\t" + "UMULL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[1] * A[1] */ + "LDR r12, [r1, #4]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * A[2] */ + "LDR r12, [r1, #8]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * A[3] */ + "LDR r12, [r1, #12]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, r12\n\t" + "ADDS r10, r10, r11\n\t" + "STM lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "LDR r12, [r1, #16]\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * A[5] */ + "LDR r12, [r1, #20]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * A[6] */ + "LDR r12, [r1, #24]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[7] * A[7] */ + "LDR r12, [r1, #28]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r9, r10, r12, r12\n\t" + /* Reduce */ + "LDR r2, [sp, #28]\n\t" + "MOV lr, sp\n\t" + "MOV r12, #0x26\n\t" + "UMULL r10, r11, r10, r12\n\t" + "ADDS r10, r10, r2\n\t" + "ADC r11, r11, #0x0\n\t" + "MOV r12, #0x13\n\t" + "LSL r11, r11, #1\n\t" + "ORR r11, r11, r10, LSR #31\n\t" + "MUL r11, r11, r12\n\t" + "LDM lr!, {r1, r2}\n\t" + "MOV r12, #0x26\n\t" + "ADDS r1, r1, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r1, r11, r3, r12\n\t" + "ADDS r2, r2, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r2, r11, r4, r12\n\t" + "LDM lr!, {r3, r4}\n\t" + "ADDS r3, r3, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r5, r12\n\t" + "ADDS r4, r4, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r6, r12\n\t" + "LDM lr!, {r5, r6}\n\t" + "ADDS r5, r5, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r7, r12\n\t" + "ADDS r6, r6, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r8, r12\n\t" + "LDM lr!, {r7, r8}\n\t" + "ADDS r7, r7, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r9, r12\n\t" + "BFC r10, #31, #1\n\t" + "ADDS r8, r10, r11\n\t" + /* Store */ + "LDR r0, [sp, #64]\n\t" + "STM r0, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x44\n\t" + : + : + : "memory", "lr", "cc" + ); +} + +#else +void fe_sq_op(void); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_sq_op() +#else +void fe_sq_op() +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + "SUB sp, sp, #0x20\n\t" + "STR r0, [sp, #28]\n\t" + "LDM r1, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + /* Square */ + "UMULL r9, r10, r0, r0\n\t" + "UMULL r11, r12, r0, r1\n\t" + "ADDS r11, r11, r11\n\t" + "MOV lr, #0x0\n\t" + "UMAAL r10, r11, lr, lr\n\t" + "STM sp, {r9, r10}\n\t" + "MOV r8, lr\n\t" + "UMAAL r8, r12, r0, r2\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r8, r11, r1, r1\n\t" + "UMULL r9, r10, r0, r3\n\t" + "UMAAL r9, r12, r1, r2\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STRD r8, r9, [sp, #8]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r10, r0, r4\n\t" + "UMAAL r9, r12, r1, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r2, r2\n\t" + "STR r9, [sp, #16]\n\t" + "UMULL r9, r8, r0, r5\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r9, r10, r2, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STR r9, [sp, #20]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r8, r0, r6\n\t" + "UMAAL r9, r12, r1, r5\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r3, r3\n\t" + "STR r9, [sp, #24]\n\t" + "UMULL r0, r9, r0, r7\n\t" + "UMAAL r0, r8, r1, r6\n\t" + "UMAAL r0, r12, r2, r5\n\t" + "UMAAL r0, r10, r3, r4\n\t" + "ADCS r0, r0, r0\n\t" + "UMAAL r0, r11, lr, lr\n\t" + /* R[7] = r0 */ + "UMAAL r9, r8, r1, r7\n\t" + "UMAAL r9, r10, r2, r6\n\t" + "UMAAL r12, r9, r3, r5\n\t" + "ADCS r12, r12, r12\n\t" + "UMAAL r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "UMAAL r9, r8, r2, r7\n\t" + "UMAAL r10, r9, r3, r6\n\t" + "MOV r2, lr\n\t" + "UMAAL r10, r2, r4, r5\n\t" + "ADCS r10, r10, r10\n\t" + "UMAAL r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "UMAAL r2, r8, r3, r7\n\t" + "UMAAL r2, r9, r4, r6\n\t" + "ADCS r3, r2, r2\n\t" + "UMAAL r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "MOV r1, lr\n\t" + "UMAAL r1, r8, r4, r7\n\t" + "UMAAL r1, r9, r5, r6\n\t" + "ADCS r4, r1, r1\n\t" + "UMAAL r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "UMAAL r8, r9, r5, r7\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "MOV r5, lr\n\t" + "UMAAL r5, r9, r6, r7\n\t" + "ADCS r5, r5, r5\n\t" + "UMAAL r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r5, r7, r7\n\t" + "ADCS r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + /* Reduce */ + "MOV r6, #0x25\n\t" + "UMAAL r7, r0, r7, r6\n\t" + "MOV r6, #0x13\n\t" + "LSL r0, r0, #1\n\t" + "ORR r0, r0, r7, LSR #31\n\t" + "MUL lr, r0, r6\n\t" + "POP {r0, r1}\n\t" + "MOV r6, #0x26\n\t" + "UMAAL r0, lr, r12, r6\n\t" + "UMAAL r1, lr, r11, r6\n\t" + "MOV r12, r3\n\t" + "MOV r11, r4\n\t" + "POP {r2, r3, r4}\n\t" + "UMAAL r2, lr, r10, r6\n\t" + "UMAAL r3, lr, r12, r6\n\t" + "UMAAL r4, lr, r11, r6\n\t" + "MOV r12, r6\n\t" + "POP {r5, r6}\n\t" + "UMAAL r5, lr, r8, r12\n\t" + "BFC r7, #31, #1\n\t" + "UMAAL r6, lr, r9, r12\n\t" + "ADD r7, r7, lr\n\t" + "POP {lr}\n\t" + /* Store */ + "STM lr, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + : + : + : "memory", "lr", "cc" + ); +} + +#endif /* WOLFSSL_SP_NO_UMAAL */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_sq(fe r_p, const fe a_p) +#else +void fe_sq(fe r, const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "BL fe_sq_op\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifdef HAVE_CURVE25519 +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_mul121666(fe r_p, fe a_p) +#else +void fe_mul121666(fe r, fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register sword32* a __asm__ ("r1") = (sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* Multiply by 121666 */ + "LDM %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "MOV r12, #0xdb42\n\t" + "MOVT r12, #0x1\n\t" + "UMULL r2, r10, r2, r12\n\t" + "UMULL r3, r11, r3, r12\n\t" + "ADDS r3, r3, r10\n\t" + "ADC r11, r11, #0x0\n\t" + "UMULL r4, r10, r4, r12\n\t" + "ADDS r4, r4, r11\n\t" + "ADC r10, r10, #0x0\n\t" + "UMULL r5, r11, r5, r12\n\t" + "ADDS r5, r5, r10\n\t" + "ADC r11, r11, #0x0\n\t" + "UMULL r6, r10, r6, r12\n\t" + "ADDS r6, r6, r11\n\t" + "ADC r10, r10, #0x0\n\t" + "UMULL r7, r11, r7, r12\n\t" + "ADDS r7, r7, r10\n\t" + "ADC r11, r11, #0x0\n\t" + "UMULL r8, r10, r8, r12\n\t" + "ADDS r8, r8, r11\n\t" + "ADC r10, r10, #0x0\n\t" + "UMULL r9, r11, r9, r12\n\t" + "ADDS r9, r9, r10\n\t" + "MOV r12, #0x13\n\t" + "ADC r11, r11, #0x0\n\t" + "LSL r11, r11, #1\n\t" + "ORR r11, r11, r9, LSR #31\n\t" + "MUL r11, r11, r12\n\t" + "ADDS r2, r2, r11\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "BFC r9, #31, #1\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "STM %[r], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); +} + +#else +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_mul121666(fe r_p, fe a_p) +#else +void fe_mul121666(fe r, fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register sword32* a __asm__ ("r1") = (sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* Multiply by 121666 */ + "LDM %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "MOV r11, #0xdb42\n\t" + "MOVT r11, #0x1\n\t" + "UMULL r2, r12, r2, r11\n\t" + "SUB r10, r11, #0x1\n\t" + "UMAAL r3, r12, r3, r10\n\t" + "UMAAL r4, r12, r4, r10\n\t" + "UMAAL r5, r12, r5, r10\n\t" + "UMAAL r6, r12, r6, r10\n\t" + "UMAAL r7, r12, r7, r10\n\t" + "UMAAL r8, r12, r8, r10\n\t" + "MOV r11, #0x13\n\t" + "UMAAL r9, r12, r9, r10\n\t" + "LSL r12, r12, #1\n\t" + "ORR r12, r12, r9, LSR #31\n\t" + "MUL r12, r12, r11\n\t" + "ADDS r2, r2, r12\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "BFC r9, #31, #1\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "STM %[r], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); +} + +#endif /* WOLFSSL_SP_NO_UMAAL */ +#ifndef WC_NO_CACHE_RESISTANT +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +int curve25519(byte* r_p, const byte* n_p, const byte* a_p) +#else +int curve25519(byte* r, const byte* n, const byte* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register byte* r __asm__ ("r0") = (byte*)r_p; + register const byte* n __asm__ ("r1") = (const byte*)n_p; + register const byte* a __asm__ ("r2") = (const byte*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0xbc\n\t" + "STR %[r], [sp, #160]\n\t" + "STR %[n], [sp, #164]\n\t" + "STR %[a], [sp, #168]\n\t" + "MOV %[n], #0x0\n\t" + "STR %[n], [sp, #172]\n\t" + "MOV r4, #0x1\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x0\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "MOV r10, #0x0\n\t" + "MOV r11, #0x0\n\t" + "STM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADD r3, sp, #0x20\n\t" + "STM r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "MOV r4, #0x0\n\t" + "MOV r3, sp\n\t" + "STM r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADD r3, sp, #0x40\n\t" + /* Copy */ + "LDM r2, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "STM r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "MOV %[n], #0x1e\n\t" + "STR %[n], [sp, #180]\n\t" + "MOV %[a], #0x1c\n\t" + "STR %[a], [sp, #176]\n\t" + "\n" + "L_curve25519_words%=:\n\t" + "\n" + "L_curve25519_bits%=:\n\t" + "LDR %[n], [sp, #164]\n\t" + "LDR %[a], [%[n], r2]\n\t" + "LDR %[n], [sp, #180]\n\t" + "LSR %[a], %[a], %[n]\n\t" + "AND %[a], %[a], #0x1\n\t" + "STR %[a], [sp, #184]\n\t" + "LDR %[n], [sp, #172]\n\t" + "EOR %[n], %[n], %[a]\n\t" + "STR %[n], [sp, #172]\n\t" + "LDR %[r], [sp, #160]\n\t" + /* Conditional Swap */ + "RSB %[n], %[n], #0x0\n\t" + "MOV r3, r0\n\t" + "ADD r12, sp, #0x40\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDR %[n], [sp, #172]\n\t" + /* Conditional Swap */ + "RSB %[n], %[n], #0x0\n\t" + "MOV r3, sp\n\t" + "ADD r12, sp, #0x20\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDM r3, {r4, r5}\n\t" + "LDM r12, {r6, r7}\n\t" + "EOR r8, r4, r6\n\t" + "EOR r9, r5, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "STM r3!, {r4, r5}\n\t" + "STM r12!, {r6, r7}\n\t" + "LDR %[n], [sp, #184]\n\t" + "STR %[n], [sp, #172]\n\t" + "MOV r3, sp\n\t" + "LDR r2, [sp, #160]\n\t" + "ADD r1, sp, #0x80\n\t" + "LDR r0, [sp, #160]\n\t" + "BL fe_add_sub_op\n\t" + "ADD r3, sp, #0x20\n\t" + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "MOV r0, sp\n\t" + "BL fe_add_sub_op\n\t" + "LDR r2, [sp, #160]\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x80\n\t" + "MOV r1, sp\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_sq_op\n\t" + "LDR r1, [sp, #160]\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r3, sp\n\t" + "ADD r2, sp, #0x20\n\t" + "MOV r1, sp\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_add_sub_op\n\t" + "ADD r2, sp, #0x80\n\t" + "ADD r1, sp, #0x60\n\t" + "LDR r0, [sp, #160]\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x80\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sub_op\n\t" + "MOV r1, sp\n\t" + "MOV r0, sp\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul121666\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_add_op\n\t" + "MOV r2, sp\n\t" + "LDR r1, [sp, #168]\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x80\n\t" + "ADD r1, sp, #0x60\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "LDR %[a], [sp, #176]\n\t" + "LDR %[n], [sp, #180]\n\t" + "SUBS %[n], %[n], #0x1\n\t" + "STR %[n], [sp, #180]\n\t" +#ifdef __GNUC__ + "BGE L_curve25519_bits%=\n\t" +#else + "BGE.W L_curve25519_bits%=\n\t" +#endif + "MOV %[n], #0x1f\n\t" + "STR %[n], [sp, #180]\n\t" + "SUBS %[a], %[a], #0x4\n\t" + "STR %[a], [sp, #176]\n\t" +#ifdef __GNUC__ + "BGE L_curve25519_words%=\n\t" +#else + "BGE.W L_curve25519_words%=\n\t" +#endif + /* Invert */ + "ADD r1, sp, #0x0\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x0\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x4\n\t" + "\n" + "L_curve25519_inv_1%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_1%=\n\t" +#else + "BNE.N L_curve25519_inv_1%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x9\n\t" + "\n" + "L_curve25519_inv_2%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_2%=\n\t" +#else + "BNE.N L_curve25519_inv_2%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x13\n\t" + "\n" + "L_curve25519_inv_3%=:\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x80\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_3%=\n\t" +#else + "BNE.N L_curve25519_inv_3%=\n\t" +#endif + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0xa\n\t" + "\n" + "L_curve25519_inv_4%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_4%=\n\t" +#else + "BNE.N L_curve25519_inv_4%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x31\n\t" + "\n" + "L_curve25519_inv_5%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_5%=\n\t" +#else + "BNE.N L_curve25519_inv_5%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x63\n\t" + "\n" + "L_curve25519_inv_6%=:\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x80\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_6%=\n\t" +#else + "BNE.N L_curve25519_inv_6%=\n\t" +#endif + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x32\n\t" + "\n" + "L_curve25519_inv_7%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_7%=\n\t" +#else + "BNE.N L_curve25519_inv_7%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x5\n\t" + "\n" + "L_curve25519_inv_8%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_8%=\n\t" +#else + "BNE.N L_curve25519_inv_8%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x0\n\t" + "BL fe_mul_op\n\t" + "MOV r2, sp\n\t" + "LDR r1, [sp, #160]\n\t" + "LDR r0, [sp, #160]\n\t" + "BL fe_mul_op\n\t" + "MOV r0, #0x0\n\t" + "ADD sp, sp, #0xbc\n\t" + : [r] "+r" (r), [n] "+r" (n), [a] "+r" (a) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "lr", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +int curve25519(byte* r_p, const byte* n_p, const byte* a_p) +#else +int curve25519(byte* r, const byte* n, const byte* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register byte* r __asm__ ("r0") = (byte*)r_p; + register const byte* n __asm__ ("r1") = (const byte*)n_p; + register const byte* a __asm__ ("r2") = (const byte*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0xc0\n\t" + "STR %[r], [sp, #176]\n\t" + "STR %[n], [sp, #160]\n\t" + "STR %[a], [sp, #172]\n\t" + "ADD r5, sp, #0x40\n\t" + "ADD r4, sp, #0x20\n\t" + "STR sp, [sp, #184]\n\t" + "STR r5, [sp, #180]\n\t" + "STR r4, [sp, #188]\n\t" + "MOV %[n], #0x0\n\t" + "STR %[n], [sp, #164]\n\t" + "MOV r4, #0x1\n\t" + "MOV r5, #0x0\n\t" + "MOV r6, #0x0\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r9, #0x0\n\t" + "MOV r10, #0x0\n\t" + "MOV r11, #0x0\n\t" + "STM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADD r3, sp, #0x20\n\t" + "STM r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "MOV r4, #0x0\n\t" + "MOV r3, sp\n\t" + "STM r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADD r3, sp, #0x40\n\t" + /* Copy */ + "LDM r2, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "STM r3, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "MOV %[a], #0xfe\n\t" + "\n" + "L_curve25519_bits%=:\n\t" + "STR %[a], [sp, #168]\n\t" + "LDR %[n], [sp, #160]\n\t" + "AND r4, %[a], #0x1f\n\t" + "LSR %[a], %[a], #5\n\t" + "LDR %[a], [%[n], r2, LSL #2]\n\t" + "RSB r4, r4, #0x1f\n\t" + "LSL %[a], %[a], r4\n\t" + "LDR %[n], [sp, #164]\n\t" + "EOR %[n], %[n], %[a]\n\t" + "ASR %[n], %[n], #31\n\t" + "STR %[a], [sp, #164]\n\t" + /* Conditional Swap */ + "ADD r11, sp, #0xb0\n\t" + "LDM r11, {r4, r5, r6, r7}\n\t" + "EOR r8, r4, r5\n\t" + "EOR r9, r6, r7\n\t" + "AND r8, r8, %[n]\n\t" + "AND r9, r9, %[n]\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r8\n\t" + "EOR r6, r6, r9\n\t" + "EOR r7, r7, r9\n\t" + "STM r11, {r4, r5, r6, r7}\n\t" + /* Ladder step */ + "LDR r3, [sp, #184]\n\t" + "LDR r2, [sp, #176]\n\t" + "ADD r1, sp, #0x80\n\t" + "LDR r0, [sp, #176]\n\t" + "BL fe_add_sub_op\n\t" + "LDR r3, [sp, #188]\n\t" + "LDR r2, [sp, #180]\n\t" + "ADD r1, sp, #0x60\n\t" + "LDR r0, [sp, #184]\n\t" + "BL fe_add_sub_op\n\t" + "LDR r2, [sp, #176]\n\t" + "ADD r1, sp, #0x60\n\t" + "LDR r0, [sp, #188]\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x80\n\t" + "LDR r1, [sp, #184]\n\t" + "LDR r0, [sp, #184]\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "LDR r1, [sp, #176]\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_sq_op\n\t" + "LDR r3, [sp, #184]\n\t" + "LDR r2, [sp, #188]\n\t" + "LDR r1, [sp, #184]\n\t" + "LDR r0, [sp, #180]\n\t" + "BL fe_add_sub_op\n\t" + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x80\n\t" + "LDR r0, [sp, #176]\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_sub_op\n\t" + "LDR r1, [sp, #184]\n\t" + "LDR r0, [sp, #184]\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x80\n\t" + "LDR r0, [sp, #188]\n\t" + "BL fe_mul121666\n\t" + "LDR r1, [sp, #180]\n\t" + "LDR r0, [sp, #180]\n\t" + "BL fe_sq_op\n\t" + "LDR r2, [sp, #188]\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_add_op\n\t" + "LDR r2, [sp, #184]\n\t" + "LDR r1, [sp, #172]\n\t" + "LDR r0, [sp, #188]\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x80\n\t" + "LDR r0, [sp, #184]\n\t" + "BL fe_mul_op\n\t" + "LDR %[a], [sp, #168]\n\t" + "SUBS %[a], %[a], #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGE L_curve25519_bits%=\n\t" +#else + "BGE.N L_curve25519_bits%=\n\t" +#endif + /* Cycle Count: 171 */ + "LDR %[n], [sp, #184]\n\t" + /* Copy */ + "LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "STM sp, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Invert */ + "ADD r1, sp, #0x0\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x0\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x4\n\t" + "\n" + "L_curve25519_inv_1%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_1%=\n\t" +#else + "BNE.N L_curve25519_inv_1%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x9\n\t" + "\n" + "L_curve25519_inv_2%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_2%=\n\t" +#else + "BNE.N L_curve25519_inv_2%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x13\n\t" + "\n" + "L_curve25519_inv_3%=:\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x80\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_3%=\n\t" +#else + "BNE.N L_curve25519_inv_3%=\n\t" +#endif + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0xa\n\t" + "\n" + "L_curve25519_inv_4%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_4%=\n\t" +#else + "BNE.N L_curve25519_inv_4%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x31\n\t" + "\n" + "L_curve25519_inv_5%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_5%=\n\t" +#else + "BNE.N L_curve25519_inv_5%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x80\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x63\n\t" + "\n" + "L_curve25519_inv_6%=:\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x80\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_6%=\n\t" +#else + "BNE.N L_curve25519_inv_6%=\n\t" +#endif + "ADD r2, sp, #0x60\n\t" + "ADD r1, sp, #0x80\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x32\n\t" + "\n" + "L_curve25519_inv_7%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_7%=\n\t" +#else + "BNE.N L_curve25519_inv_7%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x5\n\t" + "\n" + "L_curve25519_inv_8%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_curve25519_inv_8%=\n\t" +#else + "BNE.N L_curve25519_inv_8%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x0\n\t" + "BL fe_mul_op\n\t" + "LDR r2, [sp, #184]\n\t" + "LDR r1, [sp, #176]\n\t" + "LDR r0, [sp, #176]\n\t" + "BL fe_mul_op\n\t" + /* Ensure result is less than modulus */ + "LDR %[r], [sp, #176]\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "MOV %[a], #0x13\n\t" + "AND %[a], %[a], r11, ASR #31\n\t" + "ADDS r4, r4, %[a]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "BFC r11, #31, #1\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "STM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "MOV r0, #0x0\n\t" + "ADD sp, sp, #0xc0\n\t" + : [r] "+r" (r), [n] "+r" (n), [a] "+r" (a) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "lr", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WC_NO_CACHE_RESISTANT */ +#endif /* HAVE_CURVE25519 */ +#ifdef HAVE_ED25519 +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_invert(fe r_p, const fe a_p) +#else +void fe_invert(fe r, const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x88\n\t" + /* Invert */ + "STR %[r], [sp, #128]\n\t" + "STR %[a], [sp, #132]\n\t" + "LDR r1, [sp, #132]\n\t" + "MOV r0, sp\n\t" + "BL fe_sq_op\n\t" + "MOV r1, sp\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x20\n\t" + "LDR r1, [sp, #132]\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x20\n\t" + "MOV r1, sp\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "MOV r1, sp\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x4\n\t" + "\n" + "L_fe_invert1%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert1%=\n\t" +#else + "BNE.N L_fe_invert1%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x9\n\t" + "\n" + "L_fe_invert2%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert2%=\n\t" +#else + "BNE.N L_fe_invert2%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x13\n\t" + "\n" + "L_fe_invert3%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert3%=\n\t" +#else + "BNE.N L_fe_invert3%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0xa\n\t" + "\n" + "L_fe_invert4%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert4%=\n\t" +#else + "BNE.N L_fe_invert4%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x31\n\t" + "\n" + "L_fe_invert5%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert5%=\n\t" +#else + "BNE.N L_fe_invert5%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x60\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x63\n\t" + "\n" + "L_fe_invert6%=:\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x60\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert6%=\n\t" +#else + "BNE.N L_fe_invert6%=\n\t" +#endif + "ADD r2, sp, #0x40\n\t" + "ADD r1, sp, #0x60\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x32\n\t" + "\n" + "L_fe_invert7%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert7%=\n\t" +#else + "BNE.N L_fe_invert7%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x5\n\t" + "\n" + "L_fe_invert8%=:\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_invert8%=\n\t" +#else + "BNE.N L_fe_invert8%=\n\t" +#endif + "MOV r2, sp\n\t" + "ADD r1, sp, #0x20\n\t" + "LDR r0, [sp, #128]\n\t" + "BL fe_mul_op\n\t" + "LDR %[a], [sp, #132]\n\t" + "LDR %[r], [sp, #128]\n\t" + "ADD sp, sp, #0x88\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "lr", "r12", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_sq2(fe r_p, const fe a_p) +#else +void fe_sq2(fe r, const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x44\n\t" + "STR r0, [sp, #64]\n\t" + /* Square * 2 */ + "MOV r0, #0x0\n\t" + "LDR r12, [r1]\n\t" + /* A[0] * A[1] */ + "LDR lr, [r1, #4]\n\t" + "UMULL r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "LDR lr, [r1, #12]\n\t" + "UMULL r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "UMULL r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "UMULL r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "LDR lr, [r1, #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[0] * A[4] */ + "LDR lr, [r1, #16]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[0] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + "ADCS r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + "STR r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "LDR r12, [r1, #4]\n\t" + "LDR lr, [r1, #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[1] * A[3] */ + "LDR lr, [r1, #12]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[1] * A[4] */ + "LDR lr, [r1, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[1] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[1] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[1] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r4, r0, #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "LDR r12, [r1, #8]\n\t" + "LDR lr, [r1, #12]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * A[4] */ + "LDR lr, [r1, #16]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[2] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[2] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r5, r0, #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "LDR r12, [r1, #12]\n\t" + "LDR lr, [r1, #16]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * A[5] */ + "LDR lr, [r1, #20]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[3] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[3] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r6, r0, #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "LDR r12, [r1, #16]\n\t" + "LDR lr, [r1, #20]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[4] * A[6] */ + "LDR lr, [r1, #24]\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[4] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r7, r0, #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "LDR r12, [r1, #20]\n\t" + "LDR lr, [r1, #24]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[5] * A[7] */ + "LDR lr, [r1, #28]\n\t" + "ADC r8, r0, #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "LDR r12, [r1, #24]\n\t" + "LDR lr, [r1, #28]\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "STM lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADCS r3, r3, r3\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADC r10, r0, #0x0\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "MOV lr, sp\n\t" + /* A[0] * A[0] */ + "LDR r12, [r1]\n\t" + "UMULL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[1] * A[1] */ + "LDR r12, [r1, #4]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * A[2] */ + "LDR r12, [r1, #8]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * A[3] */ + "LDR r12, [r1, #12]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r9, r11, r12, r12\n\t" + "ADDS r10, r10, r11\n\t" + "STM lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "LDR r12, [r1, #16]\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * A[5] */ + "LDR r12, [r1, #20]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * A[6] */ + "LDR r12, [r1, #24]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[7] * A[7] */ + "LDR r12, [r1, #28]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r9, r10, r12, r12\n\t" + /* Reduce */ + "LDR r2, [sp, #28]\n\t" + "MOV lr, sp\n\t" + "MOV r12, #0x26\n\t" + "UMULL r10, r11, r10, r12\n\t" + "ADDS r10, r10, r2\n\t" + "ADC r11, r11, #0x0\n\t" + "MOV r12, #0x13\n\t" + "LSL r11, r11, #1\n\t" + "ORR r11, r11, r10, LSR #31\n\t" + "MUL r11, r11, r12\n\t" + "LDM lr!, {r1, r2}\n\t" + "MOV r12, #0x26\n\t" + "ADDS r1, r1, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r1, r11, r3, r12\n\t" + "ADDS r2, r2, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r2, r11, r4, r12\n\t" + "LDM lr!, {r3, r4}\n\t" + "ADDS r3, r3, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r3, r11, r5, r12\n\t" + "ADDS r4, r4, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r4, r11, r6, r12\n\t" + "LDM lr!, {r5, r6}\n\t" + "ADDS r5, r5, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r5, r11, r7, r12\n\t" + "ADDS r6, r6, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r6, r11, r8, r12\n\t" + "LDM lr!, {r7, r8}\n\t" + "ADDS r7, r7, r11\n\t" + "ADC r11, r0, #0x0\n\t" + "UMLAL r7, r11, r9, r12\n\t" + "BFC r10, #31, #1\n\t" + "ADDS r8, r10, r11\n\t" + /* Reduce if top bit set */ + "MOV r12, #0x13\n\t" + "AND r11, r12, r8, ASR #31\n\t" + "ADDS r1, r1, r11\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "BFC r8, #31, #1\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r8, r8, #0x0\n\t" + /* Double */ + "ADDS r1, r1, r1\n\t" + "ADCS r2, r2, r2\n\t" + "ADCS r3, r3, r3\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADC r8, r8, r8\n\t" + /* Reduce if top bit set */ + "MOV r12, #0x13\n\t" + "AND r11, r12, r8, ASR #31\n\t" + "ADDS r1, r1, r11\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "BFC r8, #31, #1\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r8, r8, #0x0\n\t" + /* Store */ + "LDR r0, [sp, #64]\n\t" + "STM r0, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "lr", "cc" + ); +} + +#else +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_sq2(fe r_p, const fe a_p) +#else +void fe_sq2(fe r, const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x24\n\t" + "STRD r0, r1, [sp, #28]\n\t" + "LDM r1, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + /* Square * 2 */ + "UMULL r9, r10, r0, r0\n\t" + "UMULL r11, r12, r0, r1\n\t" + "ADDS r11, r11, r11\n\t" + "MOV lr, #0x0\n\t" + "UMAAL r10, r11, lr, lr\n\t" + "STM sp, {r9, r10}\n\t" + "MOV r8, lr\n\t" + "UMAAL r8, r12, r0, r2\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r8, r11, r1, r1\n\t" + "UMULL r9, r10, r0, r3\n\t" + "UMAAL r9, r12, r1, r2\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STRD r8, r9, [sp, #8]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r10, r0, r4\n\t" + "UMAAL r9, r12, r1, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r2, r2\n\t" + "STR r9, [sp, #16]\n\t" + "UMULL r9, r8, r0, r5\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r9, r10, r2, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STR r9, [sp, #20]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r8, r0, r6\n\t" + "UMAAL r9, r12, r1, r5\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r3, r3\n\t" + "STR r9, [sp, #24]\n\t" + "UMULL r0, r9, r0, r7\n\t" + "UMAAL r0, r8, r1, r6\n\t" + "UMAAL r0, r12, r2, r5\n\t" + "UMAAL r0, r10, r3, r4\n\t" + "ADCS r0, r0, r0\n\t" + "UMAAL r0, r11, lr, lr\n\t" + /* R[7] = r0 */ + "UMAAL r9, r8, r1, r7\n\t" + "UMAAL r9, r10, r2, r6\n\t" + "UMAAL r12, r9, r3, r5\n\t" + "ADCS r12, r12, r12\n\t" + "UMAAL r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "UMAAL r9, r8, r2, r7\n\t" + "UMAAL r10, r9, r3, r6\n\t" + "MOV r2, lr\n\t" + "UMAAL r10, r2, r4, r5\n\t" + "ADCS r10, r10, r10\n\t" + "UMAAL r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "UMAAL r2, r8, r3, r7\n\t" + "UMAAL r2, r9, r4, r6\n\t" + "ADCS r3, r2, r2\n\t" + "UMAAL r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "MOV r1, lr\n\t" + "UMAAL r1, r8, r4, r7\n\t" + "UMAAL r1, r9, r5, r6\n\t" + "ADCS r4, r1, r1\n\t" + "UMAAL r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "UMAAL r8, r9, r5, r7\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "MOV r5, lr\n\t" + "UMAAL r5, r9, r6, r7\n\t" + "ADCS r5, r5, r5\n\t" + "UMAAL r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r5, r7, r7\n\t" + "ADCS r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + /* Reduce */ + "MOV r6, #0x25\n\t" + "UMAAL r7, r0, r7, r6\n\t" + "MOV r6, #0x13\n\t" + "LSL r0, r0, #1\n\t" + "ORR r0, r0, r7, LSR #31\n\t" + "MUL lr, r0, r6\n\t" + "POP {r0, r1}\n\t" + "MOV r6, #0x26\n\t" + "UMAAL r0, lr, r12, r6\n\t" + "UMAAL r1, lr, r11, r6\n\t" + "MOV r12, r3\n\t" + "MOV r11, r4\n\t" + "POP {r2, r3, r4}\n\t" + "UMAAL r2, lr, r10, r6\n\t" + "UMAAL r3, lr, r12, r6\n\t" + "UMAAL r4, lr, r11, r6\n\t" + "MOV r12, r6\n\t" + "POP {r5, r6}\n\t" + "UMAAL r5, lr, r8, r12\n\t" + "BFC r7, #31, #1\n\t" + "UMAAL r6, lr, r9, r12\n\t" + "ADD r7, r7, lr\n\t" + /* Reduce if top bit set */ + "MOV r11, #0x13\n\t" + "AND r12, r11, r7, ASR #31\n\t" + "ADDS r0, r0, r12\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "BFC r7, #31, #1\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADC r7, r7, #0x0\n\t" + /* Double */ + "ADDS r0, r0, r0\n\t" + "ADCS r1, r1, r1\n\t" + "ADCS r2, r2, r2\n\t" + "ADCS r3, r3, r3\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + /* Reduce if top bit set */ + "MOV r11, #0x13\n\t" + "AND r12, r11, r7, ASR #31\n\t" + "ADDS r0, r0, r12\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "BFC r7, #31, #1\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADC r7, r7, #0x0\n\t" + "POP {r12, lr}\n\t" + /* Store */ + "STM r12, {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + "MOV r0, r12\n\t" + "MOV r1, lr\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "lr", "cc" + ); +} + +#endif /* WOLFSSL_SP_NO_UMAAL */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void fe_pow22523(fe r_p, const fe a_p) +#else +void fe_pow22523(fe r, const fe a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sword32* r __asm__ ("r0") = (sword32*)r_p; + register const sword32* a __asm__ ("r1") = (const sword32*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x68\n\t" + /* pow22523 */ + "STR %[r], [sp, #96]\n\t" + "STR %[a], [sp, #100]\n\t" + "LDR r1, [sp, #100]\n\t" + "MOV r0, sp\n\t" + "BL fe_sq_op\n\t" + "MOV r1, sp\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "ADD r2, sp, #0x20\n\t" + "LDR r1, [sp, #100]\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r2, sp, #0x20\n\t" + "MOV r1, sp\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "MOV r1, sp\n\t" + "MOV r0, sp\n\t" + "BL fe_sq_op\n\t" + "MOV r2, sp\n\t" + "ADD r1, sp, #0x20\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "MOV r1, sp\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x4\n\t" + "\n" + "L_fe_pow22523_1%=:\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_1%=\n\t" +#else + "BNE.N L_fe_pow22523_1%=\n\t" +#endif + "MOV r2, sp\n\t" + "ADD r1, sp, #0x20\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "MOV r1, sp\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x9\n\t" + "\n" + "L_fe_pow22523_2%=:\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_2%=\n\t" +#else + "BNE.N L_fe_pow22523_2%=\n\t" +#endif + "MOV r2, sp\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x13\n\t" + "\n" + "L_fe_pow22523_3%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_3%=\n\t" +#else + "BNE.N L_fe_pow22523_3%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0xa\n\t" + "\n" + "L_fe_pow22523_4%=:\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_4%=\n\t" +#else + "BNE.N L_fe_pow22523_4%=\n\t" +#endif + "MOV r2, sp\n\t" + "ADD r1, sp, #0x20\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "MOV r1, sp\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x31\n\t" + "\n" + "L_fe_pow22523_5%=:\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_5%=\n\t" +#else + "BNE.N L_fe_pow22523_5%=\n\t" +#endif + "MOV r2, sp\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x40\n\t" + "BL fe_sq_op\n\t" + "MOV r12, #0x63\n\t" + "\n" + "L_fe_pow22523_6%=:\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x40\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_6%=\n\t" +#else + "BNE.N L_fe_pow22523_6%=\n\t" +#endif + "ADD r2, sp, #0x20\n\t" + "ADD r1, sp, #0x40\n\t" + "ADD r0, sp, #0x20\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x32\n\t" + "\n" + "L_fe_pow22523_7%=:\n\t" + "ADD r1, sp, #0x20\n\t" + "ADD r0, sp, #0x20\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_7%=\n\t" +#else + "BNE.N L_fe_pow22523_7%=\n\t" +#endif + "MOV r2, sp\n\t" + "ADD r1, sp, #0x20\n\t" + "MOV r0, sp\n\t" + "BL fe_mul_op\n\t" + "MOV r12, #0x2\n\t" + "\n" + "L_fe_pow22523_8%=:\n\t" + "MOV r1, sp\n\t" + "MOV r0, sp\n\t" + "PUSH {r12}\n\t" + "BL fe_sq_op\n\t" + "POP {r12}\n\t" + "SUBS r12, r12, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_fe_pow22523_8%=\n\t" +#else + "BNE.N L_fe_pow22523_8%=\n\t" +#endif + "LDR r2, [sp, #100]\n\t" + "MOV r1, sp\n\t" + "LDR r0, [sp, #96]\n\t" + "BL fe_mul_op\n\t" + "LDR %[a], [sp, #100]\n\t" + "LDR %[r], [sp, #96]\n\t" + "ADD sp, sp, #0x68\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "lr", "r12", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void ge_p1p1_to_p2(ge_p2 * r_p, const ge_p1p1 * p_p) +#else +void ge_p1p1_to_p2(ge_p2 * r, const ge_p1p1 * p) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register ge_p2 * r __asm__ ("r0") = (ge_p2 *)r_p; + register const ge_p1p1 * p __asm__ ("r1") = (const ge_p1p1 *)p_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x8\n\t" + "STR %[r], [sp]\n\t" + "STR %[p], [sp, #4]\n\t" + "ADD r2, r1, #0x60\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r2, r1, #0x40\n\t" + "ADD r1, r1, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r2, r1, #0x60\n\t" + "ADD r1, r1, #0x40\n\t" + "ADD r0, r0, #0x40\n\t" + "BL fe_mul_op\n\t" + "ADD sp, sp, #0x8\n\t" + : [r] "+r" (r), [p] "+r" (p) + : + : "memory", "lr", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void ge_p1p1_to_p3(ge_p3 * r_p, const ge_p1p1 * p_p) +#else +void ge_p1p1_to_p3(ge_p3 * r, const ge_p1p1 * p) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register ge_p3 * r __asm__ ("r0") = (ge_p3 *)r_p; + register const ge_p1p1 * p __asm__ ("r1") = (const ge_p1p1 *)p_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x8\n\t" + "STR %[r], [sp]\n\t" + "STR %[p], [sp, #4]\n\t" + "ADD r2, r1, #0x60\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r2, r1, #0x40\n\t" + "ADD r1, r1, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r2, r1, #0x60\n\t" + "ADD r1, r1, #0x40\n\t" + "ADD r0, r0, #0x40\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r2, r1, #0x20\n\t" + "ADD r0, r0, #0x60\n\t" + "BL fe_mul_op\n\t" + "ADD sp, sp, #0x8\n\t" + : [r] "+r" (r), [p] "+r" (p) + : + : "memory", "lr", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void ge_p2_dbl(ge_p1p1 * r_p, const ge_p2 * p_p) +#else +void ge_p2_dbl(ge_p1p1 * r, const ge_p2 * p) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register ge_p1p1 * r __asm__ ("r0") = (ge_p1p1 *)r_p; + register const ge_p2 * p __asm__ ("r1") = (const ge_p2 *)p_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x8\n\t" + "STR %[r], [sp]\n\t" + "STR %[p], [sp, #4]\n\t" + "BL fe_sq_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r1, r1, #0x20\n\t" + "ADD r0, r0, #0x40\n\t" + "BL fe_sq_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r2, r1, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_add_op\n\t" + "MOV r1, r0\n\t" + "ADD r0, r0, #0x40\n\t" + "BL fe_sq_op\n\t" + "LDR r0, [sp]\n\t" + "MOV r3, r0\n\t" + "ADD r2, r0, #0x40\n\t" + "ADD r1, r0, #0x40\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "MOV r2, r0\n\t" + "ADD r1, r0, #0x40\n\t" + "SUB r0, r0, #0x20\n\t" + "BL fe_sub_op\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r1, r1, #0x40\n\t" + "ADD r0, r0, #0x60\n\t" + "BL fe_sq2\n\t" + "SUB r2, r0, #0x20\n\t" + "MOV r1, r0\n\t" + "BL fe_sub_op\n\t" + "ADD sp, sp, #0x8\n\t" + : [r] "+r" (r), [p] "+r" (p) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void ge_madd(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_precomp * q_p) +#else +void ge_madd(ge_p1p1 * r, const ge_p3 * p, const ge_precomp * q) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register ge_p1p1 * r __asm__ ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p __asm__ ("r1") = (const ge_p3 *)p_p; + register const ge_precomp * q __asm__ ("r2") = (const ge_precomp *)q_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0xc\n\t" + "STR %[r], [sp]\n\t" + "STR %[p], [sp, #4]\n\t" + "STR %[q], [sp, #8]\n\t" + "MOV r2, r1\n\t" + "ADD r1, r1, #0x20\n\t" + "BL fe_add_op\n\t" + "LDR r1, [sp, #4]\n\t" + "MOV r2, r1\n\t" + "ADD r1, r1, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_sub_op\n\t" + "LDR r2, [sp, #8]\n\t" + "SUB r1, r0, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r2, r2, #0x20\n\t" + "ADD r1, r0, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #8]\n\t" + "LDR r2, [sp, #4]\n\t" + "ADD r2, r2, #0x60\n\t" + "ADD r1, r1, #0x40\n\t" + "ADD r0, r0, #0x60\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "ADD r3, r0, #0x20\n\t" + "ADD r2, r0, #0x40\n\t" + "MOV r1, r0\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r1, r1, #0x40\n\t" + "ADD r0, r0, #0x20\n\t" + /* Double */ + "LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "MOV lr, #0x0\n\t" + "ADCS r11, r11, r11\n\t" + "ADC lr, lr, #0x0\n\t" + "MOV r12, #0x13\n\t" + "LSL lr, lr, #1\n\t" + "ORR lr, lr, r11, LSR #31\n\t" + "MUL r12, lr, r12\n\t" + "ADDS r4, r4, r12\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "BFC r11, #31, #1\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "STM r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "ADD r3, r0, #0x20\n\t" + "ADD r1, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "ADD sp, sp, #0xc\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void ge_msub(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_precomp * q_p) +#else +void ge_msub(ge_p1p1 * r, const ge_p3 * p, const ge_precomp * q) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register ge_p1p1 * r __asm__ ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p __asm__ ("r1") = (const ge_p3 *)p_p; + register const ge_precomp * q __asm__ ("r2") = (const ge_precomp *)q_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0xc\n\t" + "STR %[r], [sp]\n\t" + "STR %[p], [sp, #4]\n\t" + "STR %[q], [sp, #8]\n\t" + "MOV r2, r1\n\t" + "ADD r1, r1, #0x20\n\t" + "BL fe_add_op\n\t" + "LDR r1, [sp, #4]\n\t" + "MOV r2, r1\n\t" + "ADD r1, r1, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_sub_op\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r2, r2, #0x20\n\t" + "SUB r1, r0, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r1, r0, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #8]\n\t" + "LDR r2, [sp, #4]\n\t" + "ADD r2, r2, #0x60\n\t" + "ADD r1, r1, #0x40\n\t" + "ADD r0, r0, #0x60\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "ADD r3, r0, #0x20\n\t" + "ADD r2, r0, #0x40\n\t" + "MOV r1, r0\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "LDR r1, [sp, #4]\n\t" + "ADD r1, r1, #0x40\n\t" + "ADD r0, r0, #0x20\n\t" + /* Double */ + "LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "MOV lr, #0x0\n\t" + "ADCS r11, r11, r11\n\t" + "ADC lr, lr, #0x0\n\t" + "MOV r12, #0x13\n\t" + "LSL lr, lr, #1\n\t" + "ORR lr, lr, r11, LSR #31\n\t" + "MUL r12, lr, r12\n\t" + "ADDS r4, r4, r12\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "BFC r11, #31, #1\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "STM r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "ADD r3, r0, #0x20\n\t" + "MOV r1, r0\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "ADD sp, sp, #0xc\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void ge_add(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_cached* q_p) +#else +void ge_add(ge_p1p1 * r, const ge_p3 * p, const ge_cached* q) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register ge_p1p1 * r __asm__ ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p __asm__ ("r1") = (const ge_p3 *)p_p; + register const ge_cached* q __asm__ ("r2") = (const ge_cached*)q_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x2c\n\t" + "STR %[r], [sp]\n\t" + "STR %[p], [sp, #4]\n\t" + "STR %[q], [sp, #8]\n\t" + "MOV r3, r1\n\t" + "ADD r2, r1, #0x20\n\t" + "ADD r1, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "LDR r2, [sp, #8]\n\t" + "MOV r1, r0\n\t" + "ADD r0, r0, #0x40\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r2, r2, #0x20\n\t" + "ADD r1, r0, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #8]\n\t" + "LDR r2, [sp, #4]\n\t" + "ADD r2, r2, #0x60\n\t" + "ADD r1, r1, #0x60\n\t" + "ADD r0, r0, #0x60\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r2, r2, #0x40\n\t" + "ADD r1, r1, #0x40\n\t" + "BL fe_mul_op\n\t" + "LDR r1, [sp]\n\t" + "ADD r0, sp, #0xc\n\t" + /* Double */ + "LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "MOV lr, #0x0\n\t" + "ADCS r11, r11, r11\n\t" + "ADC lr, lr, #0x0\n\t" + "MOV r12, #0x13\n\t" + "LSL lr, lr, #1\n\t" + "ORR lr, lr, r11, LSR #31\n\t" + "MUL r12, lr, r12\n\t" + "ADDS r4, r4, r12\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "BFC r11, #31, #1\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "STM r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "ADD r3, r1, #0x20\n\t" + "ADD r2, r1, #0x40\n\t" + "ADD r0, r1, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "ADD r3, r0, #0x40\n\t" + "ADD r2, sp, #0xc\n\t" + "ADD r1, r0, #0x40\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "ADD sp, sp, #0x2c\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void ge_sub(ge_p1p1 * r_p, const ge_p3 * p_p, const ge_cached* q_p) +#else +void ge_sub(ge_p1p1 * r, const ge_p3 * p, const ge_cached* q) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register ge_p1p1 * r __asm__ ("r0") = (ge_p1p1 *)r_p; + register const ge_p3 * p __asm__ ("r1") = (const ge_p3 *)p_p; + register const ge_cached* q __asm__ ("r2") = (const ge_cached*)q_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x2c\n\t" + "STR %[r], [sp]\n\t" + "STR %[p], [sp, #4]\n\t" + "STR %[q], [sp, #8]\n\t" + "MOV r3, r1\n\t" + "ADD r2, r1, #0x20\n\t" + "ADD r1, r0, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r2, r2, #0x20\n\t" + "MOV r1, r0\n\t" + "ADD r0, r0, #0x40\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r1, r0, #0x20\n\t" + "ADD r0, r0, #0x20\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #8]\n\t" + "LDR r2, [sp, #4]\n\t" + "ADD r2, r2, #0x60\n\t" + "ADD r1, r1, #0x60\n\t" + "ADD r0, r0, #0x60\n\t" + "BL fe_mul_op\n\t" + "LDR r0, [sp]\n\t" + "LDR r1, [sp, #4]\n\t" + "LDR r2, [sp, #8]\n\t" + "ADD r2, r2, #0x40\n\t" + "ADD r1, r1, #0x40\n\t" + "BL fe_mul_op\n\t" + "LDR r1, [sp]\n\t" + "ADD r0, sp, #0xc\n\t" + /* Double */ + "LDM r1, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "MOV lr, #0x0\n\t" + "ADCS r11, r11, r11\n\t" + "ADC lr, lr, #0x0\n\t" + "MOV r12, #0x13\n\t" + "LSL lr, lr, #1\n\t" + "ORR lr, lr, r11, LSR #31\n\t" + "MUL r12, lr, r12\n\t" + "ADDS r4, r4, r12\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "BFC r11, #31, #1\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "STM r0, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + /* Done Double */ + "ADD r3, r1, #0x20\n\t" + "ADD r2, r1, #0x40\n\t" + "ADD r0, r1, #0x20\n\t" + "BL fe_add_sub_op\n\t" + "ADD r3, r0, #0x40\n\t" + "ADD r2, sp, #0xc\n\t" + "ADD r1, r0, #0x20\n\t" + "ADD r0, r0, #0x40\n\t" + "BL fe_add_sub_op\n\t" + "ADD sp, sp, #0x2c\n\t" + : [r] "+r" (r), [p] "+r" (p), [q] "+r" (q) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void sc_reduce(byte* s_p) +#else +void sc_reduce(byte* s) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register byte* s __asm__ ("r0") = (byte*)s_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x38\n\t" + "STR %[s], [sp, #52]\n\t" + /* Load bits 252-511 */ + "ADD %[s], %[s], #0x1c\n\t" + "LDM %[s], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "LSR lr, r9, #24\n\t" + "LSL r9, r9, #4\n\t" + "ORR r9, r9, r8, LSR #28\n\t" + "LSL r8, r8, #4\n\t" + "ORR r8, r8, r7, LSR #28\n\t" + "LSL r7, r7, #4\n\t" + "ORR r7, r7, r6, LSR #28\n\t" + "LSL r6, r6, #4\n\t" + "ORR r6, r6, r5, LSR #28\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, r3, LSR #28\n\t" + "LSL r3, r3, #4\n\t" + "ORR r3, r3, r2, LSR #28\n\t" + "LSL r2, r2, #4\n\t" + "ORR r2, r2, r1, LSR #28\n\t" + "BFC r9, #28, #4\n\t" + "SUB %[s], %[s], #0x1c\n\t" + /* Add order times bits 504..511 */ + "MOV r10, #0x2c13\n\t" + "MOVT r10, #0xa30a\n\t" + "MOV r11, #0x9ce5\n\t" + "MOVT r11, #0xa7ed\n\t" + "MOV r1, #0x0\n\t" + "UMLAL r2, r1, r10, lr\n\t" + "ADDS r3, r3, r1\n\t" + "MOV r1, #0x0\n\t" + "ADC r1, r1, #0x0\n\t" + "UMLAL r3, r1, r11, lr\n\t" + "MOV r10, #0x6329\n\t" + "MOVT r10, #0x5d08\n\t" + "MOV r11, #0x621\n\t" + "MOVT r11, #0xeb21\n\t" + "ADDS r4, r4, r1\n\t" + "MOV r1, #0x0\n\t" + "ADC r1, r1, #0x0\n\t" + "UMLAL r4, r1, r10, lr\n\t" + "ADDS r5, r5, r1\n\t" + "MOV r1, #0x0\n\t" + "ADC r1, r1, #0x0\n\t" + "UMLAL r5, r1, r11, lr\n\t" + "ADDS r6, r6, r1\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "SUBS r6, r6, lr\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC r9, r9, #0x0\n\t" + /* Sub product of top 8 words and order */ + "MOV r12, sp\n\t" + "MOV r1, #0x2c13\n\t" + "MOVT r1, #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, r1\n\t" + "BFC r11, #28, #4\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV r1, #0x9ce5\n\t" + "MOVT r1, #0xa7ed\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV r1, #0x6329\n\t" + "MOVT r1, #0x5d08\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV r1, #0x621\n\t" + "MOVT r1, #0xeb21\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, r1\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + /* Subtract at 4 * 32 */ + "LDM r12, {r10, r11}\n\t" + "SUBS r10, r10, r2\n\t" + "SBCS r11, r11, r3\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r4\n\t" + "SBCS r11, r11, r5\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r8\n\t" + "SBC r11, r11, r9\n\t" + "STM r12!, {r10, r11}\n\t" + "SUB r12, r12, #0x24\n\t" + "ASR lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ + "MOV r1, #0xa0000000\n\t" + "MOV r2, #0xba7d\n\t" + "MOVT r2, #0x4b9e\n\t" + "MOV r3, #0x4c63\n\t" + "MOVT r3, #0xcb02\n\t" + "MOV r4, #0xf39a\n\t" + "MOVT r4, #0xd45e\n\t" + "MOV r5, #0xdf3b\n\t" + "MOVT r5, #0x29b\n\t" + "MOV r9, #0x2000000\n\t" + "AND r1, r1, lr\n\t" + "AND r2, r2, lr\n\t" + "AND r3, r3, lr\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r9, r9, lr\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, r1\n\t" + "ADCS r11, r11, r2\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, r3\n\t" + "ADCS r11, r11, r4\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, r5\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10}\n\t" + "ADCS r10, r10, #0x0\n\t" + "STM r12!, {r10}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "MOV r12, sp\n\t" + /* Load bits 252-376 */ + "ADD r12, r12, #0x1c\n\t" + "LDM r12, {r1, r2, r3, r4, r5}\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, r3, LSR #28\n\t" + "LSL r3, r3, #4\n\t" + "ORR r3, r3, r2, LSR #28\n\t" + "LSL r2, r2, #4\n\t" + "ORR r2, r2, r1, LSR #28\n\t" + "BFC r5, #29, #3\n\t" + "SUB r12, r12, #0x1c\n\t" + /* Sub product of top 4 words and order */ + "MOV %[s], sp\n\t" + /* * -5cf5d3ed */ + "MOV r1, #0x2c13\n\t" + "MOVT r1, #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, lr, r2, r1\n\t" + "ADDS r7, r7, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r7, lr, r3, r1\n\t" + "ADDS r8, r8, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r8, lr, r4, r1\n\t" + "ADDS r9, r9, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r9, lr, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -5812631b */ + "MOV r1, #0x9ce5\n\t" + "MOVT r1, #0xa7ed\n\t" + "MOV r10, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r10, r2, r1\n\t" + "ADDS r7, r7, r10\n\t" + "MOV r10, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r7, r10, r3, r1\n\t" + "ADDS r8, r8, r10\n\t" + "MOV r10, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r8, r10, r4, r1\n\t" + "ADDS r9, r9, r10\n\t" + "MOV r10, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r9, r10, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -a2f79cd7 */ + "MOV r1, #0x6329\n\t" + "MOVT r1, #0x5d08\n\t" + "MOV r11, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r11, r2, r1\n\t" + "ADDS r7, r7, r11\n\t" + "MOV r11, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "UMLAL r7, r11, r3, r1\n\t" + "ADDS r8, r8, r11\n\t" + "MOV r11, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "UMLAL r8, r11, r4, r1\n\t" + "ADDS r9, r9, r11\n\t" + "MOV r11, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "UMLAL r9, r11, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -14def9df */ + "MOV r1, #0x621\n\t" + "MOVT r1, #0xeb21\n\t" + "MOV r12, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r12, r2, r1\n\t" + "ADDS r7, r7, r12\n\t" + "MOV r12, #0x0\n\t" + "ADC r12, r12, #0x0\n\t" + "UMLAL r7, r12, r3, r1\n\t" + "ADDS r8, r8, r12\n\t" + "MOV r12, #0x0\n\t" + "ADC r12, r12, #0x0\n\t" + "UMLAL r8, r12, r4, r1\n\t" + "ADDS r9, r9, r12\n\t" + "MOV r12, #0x0\n\t" + "ADC r12, r12, #0x0\n\t" + "UMLAL r9, r12, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* Add overflows at 4 * 32 */ + "LDM %[s], {r6, r7, r8, r9}\n\t" + "BFC r9, #28, #4\n\t" + "ADDS r6, r6, lr\n\t" + "ADCS r7, r7, r10\n\t" + "ADCS r8, r8, r11\n\t" + "ADC r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "SUBS r6, r6, r2\n\t" + "SBCS r7, r7, r3\n\t" + "SBCS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBC r1, r1, r1\n\t" + "SUB %[s], %[s], #0x10\n\t" + "LDM %[s], {r2, r3, r4, r5}\n\t" + "MOV r10, #0xd3ed\n\t" + "MOVT r10, #0x5cf5\n\t" + "MOV r11, #0x631a\n\t" + "MOVT r11, #0x5812\n\t" + "MOV r12, #0x9cd6\n\t" + "MOVT r12, #0xa2f7\n\t" + "MOV lr, #0xf9de\n\t" + "MOVT lr, #0x14de\n\t" + "AND r10, r10, r1\n\t" + "AND r11, r11, r1\n\t" + "AND r12, r12, r1\n\t" + "AND lr, lr, r1\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADCS r5, r5, lr\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "AND r1, r1, #0x10000000\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, r1\n\t" + "BFC r9, #28, #4\n\t" + /* Store result */ + "LDR %[s], [sp, #52]\n\t" + "STM %[s], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADD sp, sp, #0x38\n\t" + : [s] "+r" (s) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void sc_reduce(byte* s_p) +#else +void sc_reduce(byte* s) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register byte* s __asm__ ("r0") = (byte*)s_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x38\n\t" + "STR %[s], [sp, #52]\n\t" + /* Load bits 252-511 */ + "ADD %[s], %[s], #0x1c\n\t" + "LDM %[s], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "LSR lr, r9, #24\n\t" + "LSL r9, r9, #4\n\t" + "ORR r9, r9, r8, LSR #28\n\t" + "LSL r8, r8, #4\n\t" + "ORR r8, r8, r7, LSR #28\n\t" + "LSL r7, r7, #4\n\t" + "ORR r7, r7, r6, LSR #28\n\t" + "LSL r6, r6, #4\n\t" + "ORR r6, r6, r5, LSR #28\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, r3, LSR #28\n\t" + "LSL r3, r3, #4\n\t" + "ORR r3, r3, r2, LSR #28\n\t" + "LSL r2, r2, #4\n\t" + "ORR r2, r2, r1, LSR #28\n\t" + "BFC r9, #28, #4\n\t" + "SUB %[s], %[s], #0x1c\n\t" + /* Add order times bits 504..511 */ + "MOV r10, #0x2c13\n\t" + "MOVT r10, #0xa30a\n\t" + "MOV r11, #0x9ce5\n\t" + "MOVT r11, #0xa7ed\n\t" + "MOV r1, #0x0\n\t" + "UMLAL r2, r1, r10, lr\n\t" + "UMAAL r3, r1, r11, lr\n\t" + "MOV r10, #0x6329\n\t" + "MOVT r10, #0x5d08\n\t" + "MOV r11, #0x621\n\t" + "MOVT r11, #0xeb21\n\t" + "UMAAL r4, r1, r10, lr\n\t" + "UMAAL r5, r1, r11, lr\n\t" + "ADDS r6, r6, r1\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "SUBS r6, r6, lr\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC r9, r9, #0x0\n\t" + /* Sub product of top 8 words and order */ + "MOV r12, sp\n\t" + "MOV r1, #0x2c13\n\t" + "MOVT r1, #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "UMAAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMAAL r10, lr, r4, r1\n\t" + "UMAAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMAAL r10, lr, r6, r1\n\t" + "UMAAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMAAL r10, lr, r8, r1\n\t" + "BFC r11, #28, #4\n\t" + "UMAAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV r1, #0x9ce5\n\t" + "MOVT r1, #0xa7ed\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "UMAAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r4, r1\n\t" + "UMAAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r6, r1\n\t" + "UMAAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r8, r1\n\t" + "UMAAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV r1, #0x6329\n\t" + "MOVT r1, #0x5d08\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "UMAAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r4, r1\n\t" + "UMAAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r6, r1\n\t" + "UMAAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r8, r1\n\t" + "UMAAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV r1, #0x621\n\t" + "MOVT r1, #0xeb21\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, r2, r1\n\t" + "UMAAL r11, lr, r3, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r4, r1\n\t" + "UMAAL r11, lr, r5, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r6, r1\n\t" + "UMAAL r11, lr, r7, r1\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r8, r1\n\t" + "UMAAL r11, lr, r9, r1\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + /* Subtract at 4 * 32 */ + "LDM r12, {r10, r11}\n\t" + "SUBS r10, r10, r2\n\t" + "SBCS r11, r11, r3\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r4\n\t" + "SBCS r11, r11, r5\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r8\n\t" + "SBC r11, r11, r9\n\t" + "STM r12!, {r10, r11}\n\t" + "SUB r12, r12, #0x24\n\t" + "ASR lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ + "MOV r1, #0xa0000000\n\t" + "MOV r2, #0xba7d\n\t" + "MOVT r2, #0x4b9e\n\t" + "MOV r3, #0x4c63\n\t" + "MOVT r3, #0xcb02\n\t" + "MOV r4, #0xf39a\n\t" + "MOVT r4, #0xd45e\n\t" + "MOV r5, #0xdf3b\n\t" + "MOVT r5, #0x29b\n\t" + "MOV r9, #0x2000000\n\t" + "AND r1, r1, lr\n\t" + "AND r2, r2, lr\n\t" + "AND r3, r3, lr\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r9, r9, lr\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, r1\n\t" + "ADCS r11, r11, r2\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, r3\n\t" + "ADCS r11, r11, r4\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, r5\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10}\n\t" + "ADCS r10, r10, #0x0\n\t" + "STM r12!, {r10}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "MOV r12, sp\n\t" + /* Load bits 252-376 */ + "ADD r12, r12, #0x1c\n\t" + "LDM r12, {r1, r2, r3, r4, r5}\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, r3, LSR #28\n\t" + "LSL r3, r3, #4\n\t" + "ORR r3, r3, r2, LSR #28\n\t" + "LSL r2, r2, #4\n\t" + "ORR r2, r2, r1, LSR #28\n\t" + "BFC r5, #29, #3\n\t" + "SUB r12, r12, #0x1c\n\t" + /* Sub product of top 4 words and order */ + "MOV %[s], sp\n\t" + /* * -5cf5d3ed */ + "MOV r1, #0x2c13\n\t" + "MOVT r1, #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, lr, r2, r1\n\t" + "UMAAL r7, lr, r3, r1\n\t" + "UMAAL r8, lr, r4, r1\n\t" + "UMAAL r9, lr, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -5812631b */ + "MOV r1, #0x9ce5\n\t" + "MOVT r1, #0xa7ed\n\t" + "MOV r10, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r10, r2, r1\n\t" + "UMAAL r7, r10, r3, r1\n\t" + "UMAAL r8, r10, r4, r1\n\t" + "UMAAL r9, r10, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -a2f79cd7 */ + "MOV r1, #0x6329\n\t" + "MOVT r1, #0x5d08\n\t" + "MOV r11, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r11, r2, r1\n\t" + "UMAAL r7, r11, r3, r1\n\t" + "UMAAL r8, r11, r4, r1\n\t" + "UMAAL r9, r11, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -14def9df */ + "MOV r1, #0x621\n\t" + "MOVT r1, #0xeb21\n\t" + "MOV r12, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r12, r2, r1\n\t" + "UMAAL r7, r12, r3, r1\n\t" + "UMAAL r8, r12, r4, r1\n\t" + "UMAAL r9, r12, r5, r1\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* Add overflows at 4 * 32 */ + "LDM %[s], {r6, r7, r8, r9}\n\t" + "BFC r9, #28, #4\n\t" + "ADDS r6, r6, lr\n\t" + "ADCS r7, r7, r10\n\t" + "ADCS r8, r8, r11\n\t" + "ADC r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "SUBS r6, r6, r2\n\t" + "SBCS r7, r7, r3\n\t" + "SBCS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBC r1, r1, r1\n\t" + "SUB %[s], %[s], #0x10\n\t" + "LDM %[s], {r2, r3, r4, r5}\n\t" + "MOV r10, #0xd3ed\n\t" + "MOVT r10, #0x5cf5\n\t" + "MOV r11, #0x631a\n\t" + "MOVT r11, #0x5812\n\t" + "MOV r12, #0x9cd6\n\t" + "MOVT r12, #0xa2f7\n\t" + "MOV lr, #0xf9de\n\t" + "MOVT lr, #0x14de\n\t" + "AND r10, r10, r1\n\t" + "AND r11, r11, r1\n\t" + "AND r12, r12, r1\n\t" + "AND lr, lr, r1\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADCS r5, r5, lr\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "AND r1, r1, #0x10000000\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, r1\n\t" + "BFC r9, #28, #4\n\t" + /* Store result */ + "LDR %[s], [sp, #52]\n\t" + "STM %[s], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADD sp, sp, #0x38\n\t" + : [s] "+r" (s) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#endif /* WOLFSSL_SP_NO_UMAAL */ +#ifdef HAVE_ED25519_SIGN +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void sc_muladd(byte* s_p, const byte* a_p, const byte* b_p, const byte* c_p) +#else +void sc_muladd(byte* s, const byte* a, const byte* b, const byte* c) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register byte* s __asm__ ("r0") = (byte*)s_p; + register const byte* a __asm__ ("r1") = (const byte*)a_p; + register const byte* b __asm__ ("r2") = (const byte*)b_p; + register const byte* c __asm__ ("r3") = (const byte*)c_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x50\n\t" + "ADD lr, sp, #0x44\n\t" + "STM lr, {%[s], %[a], %[c]}\n\t" + "MOV %[s], #0x0\n\t" + "LDR r12, [%[a]]\n\t" + /* A[0] * B[0] */ + "LDR lr, [%[b]]\n\t" + "UMULL %[c], r4, r12, lr\n\t" + /* A[0] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "UMULL r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "UMULL r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "UMULL r9, r10, r12, lr\n\t" + "STR %[c], [sp]\n\t" + /* A[0] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "MOV r11, %[s]\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[0] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[0] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[0] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC %[c], %[s], #0x0\n\t" + "UMLAL r10, %[c], r12, lr\n\t" + /* A[1] * B[0] */ + "LDR r12, [%[a], #4]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "STR r4, [sp, #4]\n\t" + "ADDS r5, r5, r11\n\t" + /* A[1] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[1] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[1] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[1] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[1] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[1] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS %[c], %[c], r11\n\t" + /* A[1] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r4, %[s], #0x0\n\t" + "UMLAL %[c], r4, r12, lr\n\t" + /* A[2] * B[0] */ + "LDR r12, [%[a], #8]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "STR r5, [sp, #8]\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[2] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[2] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS %[c], %[c], r11\n\t" + /* A[2] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL %[c], r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[2] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r5, %[s], #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "LDR r12, [%[a], #12]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[3] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[3] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[3] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS %[c], %[c], r11\n\t" + /* A[3] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL %[c], r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[3] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[3] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r6, %[s], #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "LDR r12, [%[a], #16]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[4] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[4] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[4] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS %[c], %[c], r11\n\t" + /* A[4] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL %[c], r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[4] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[4] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[4] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r7, %[s], #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "LDR r12, [%[a], #20]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[5] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[5] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS %[c], %[c], r11\n\t" + /* A[5] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL %[c], r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[5] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[5] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[5] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r8, %[s], #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "LDR r12, [%[a], #24]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[6] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS %[c], %[c], r11\n\t" + /* A[6] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL %[c], r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[6] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[6] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[6] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[6] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r9, %[s], #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "LDR r12, [%[a], #28]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS %[c], %[c], r11\n\t" + /* A[7] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL %[c], r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[7] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[7] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[7] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[7] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[7] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[s], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[7] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r10, %[s], #0x0\n\t" + "UMLAL r9, r10, r12, lr\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {%[c], r4, r5, r6, r7, r8, r9, r10}\n\t" + "MOV %[s], sp\n\t" + /* Add c to a * b */ + "LDR lr, [sp, #76]\n\t" + "LDM %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "LDM lr!, {%[a], r10, r11, r12}\n\t" + "ADDS %[b], %[b], %[a]\n\t" + "ADCS %[c], %[c], r10\n\t" + "ADCS r4, r4, r11\n\t" + "ADCS r5, r5, r12\n\t" + "LDM lr!, {%[a], r10, r11, r12}\n\t" + "ADCS r6, r6, %[a]\n\t" + "ADCS r7, r7, r10\n\t" + "ADCS r8, r8, r11\n\t" + "ADCS r9, r9, r12\n\t" + "MOV %[a], r9\n\t" + "STM %[s]!, {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "LDM %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "ADCS %[b], %[b], #0x0\n\t" + "ADCS %[c], %[c], #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "SUB %[s], %[s], #0x20\n\t" + /* Get 252..503 and 504..507 */ + "LSR lr, r9, #24\n\t" + "LSL r9, r9, #4\n\t" + "ORR r9, r9, r8, LSR #28\n\t" + "LSL r8, r8, #4\n\t" + "ORR r8, r8, r7, LSR #28\n\t" + "LSL r7, r7, #4\n\t" + "ORR r7, r7, r6, LSR #28\n\t" + "LSL r6, r6, #4\n\t" + "ORR r6, r6, r5, LSR #28\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, %[c], LSR #28\n\t" + "LSL %[c], %[c], #4\n\t" + "ORR %[c], %[c], %[b], LSR #28\n\t" + "LSL %[b], %[b], #4\n\t" + "ORR %[b], %[b], %[a], LSR #28\n\t" + "BFC r9, #28, #4\n\t" + /* Add order times bits 504..507 */ + "MOV r10, #0x2c13\n\t" + "MOVT r10, #0xa30a\n\t" + "MOV r11, #0x9ce5\n\t" + "MOVT r11, #0xa7ed\n\t" + "MOV %[a], #0x0\n\t" + "UMLAL %[b], %[a], r10, lr\n\t" + "ADDS %[c], %[c], %[a]\n\t" + "MOV %[a], #0x0\n\t" + "ADC %[a], %[a], #0x0\n\t" + "UMLAL %[c], %[a], r11, lr\n\t" + "MOV r10, #0x6329\n\t" + "MOVT r10, #0x5d08\n\t" + "MOV r11, #0x621\n\t" + "MOVT r11, #0xeb21\n\t" + "ADDS r4, r4, %[a]\n\t" + "MOV %[a], #0x0\n\t" + "ADC %[a], %[a], #0x0\n\t" + "UMLAL r4, %[a], r10, lr\n\t" + "ADDS r5, r5, %[a]\n\t" + "MOV %[a], #0x0\n\t" + "ADC %[a], %[a], #0x0\n\t" + "UMLAL r5, %[a], r11, lr\n\t" + "ADDS r6, r6, %[a]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "SUBS r6, r6, lr\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC r9, r9, #0x0\n\t" + /* Sub product of top 8 words and order */ + "MOV r12, sp\n\t" + "MOV %[a], #0x2c13\n\t" + "MOVT %[a], #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, %[a]\n\t" + "BFC r11, #28, #4\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV %[a], #0x9ce5\n\t" + "MOVT %[a], #0xa7ed\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV %[a], #0x6329\n\t" + "MOVT %[a], #0x5d08\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV %[a], #0x621\n\t" + "MOVT %[a], #0xeb21\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r4, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r6, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r10, lr, r8, %[a]\n\t" + "ADDS r11, r11, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + /* Subtract at 4 * 32 */ + "LDM r12, {r10, r11}\n\t" + "SUBS r10, r10, %[b]\n\t" + "SBCS r11, r11, %[c]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r4\n\t" + "SBCS r11, r11, r5\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r8\n\t" + "SBC r11, r11, r9\n\t" + "STM r12!, {r10, r11}\n\t" + "SUB r12, r12, #0x24\n\t" + "ASR lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ + "MOV %[a], #0xa0000000\n\t" + "MOV %[b], #0xba7d\n\t" + "MOVT %[b], #0x4b9e\n\t" + "MOV %[c], #0x4c63\n\t" + "MOVT %[c], #0xcb02\n\t" + "MOV r4, #0xf39a\n\t" + "MOVT r4, #0xd45e\n\t" + "MOV r5, #0xdf3b\n\t" + "MOVT r5, #0x29b\n\t" + "MOV r9, #0x2000000\n\t" + "AND %[a], %[a], lr\n\t" + "AND %[b], %[b], lr\n\t" + "AND %[c], %[c], lr\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r9, r9, lr\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, %[a]\n\t" + "ADCS r11, r11, %[b]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, %[c]\n\t" + "ADCS r11, r11, r4\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, r5\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10}\n\t" + "ADCS r10, r10, #0x0\n\t" + "STM r12!, {r10}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "MOV r12, sp\n\t" + /* Load bits 252-376 */ + "ADD r12, r12, #0x1c\n\t" + "LDM r12, {%[a], %[b], %[c], r4, r5}\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, %[c], LSR #28\n\t" + "LSL %[c], %[c], #4\n\t" + "ORR %[c], %[c], %[b], LSR #28\n\t" + "LSL %[b], %[b], #4\n\t" + "ORR %[b], %[b], %[a], LSR #28\n\t" + "BFC r5, #29, #3\n\t" + "SUB r12, r12, #0x1c\n\t" + /* Sub product of top 4 words and order */ + "MOV %[s], sp\n\t" + /* * -5cf5d3ed */ + "MOV %[a], #0x2c13\n\t" + "MOVT %[a], #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, lr, %[b], %[a]\n\t" + "ADDS r7, r7, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r7, lr, %[c], %[a]\n\t" + "ADDS r8, r8, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r8, lr, r4, %[a]\n\t" + "ADDS r9, r9, lr\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "UMLAL r9, lr, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -5812631b */ + "MOV %[a], #0x9ce5\n\t" + "MOVT %[a], #0xa7ed\n\t" + "MOV r10, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r10, %[b], %[a]\n\t" + "ADDS r7, r7, r10\n\t" + "MOV r10, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r7, r10, %[c], %[a]\n\t" + "ADDS r8, r8, r10\n\t" + "MOV r10, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r8, r10, r4, %[a]\n\t" + "ADDS r9, r9, r10\n\t" + "MOV r10, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r9, r10, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -a2f79cd7 */ + "MOV %[a], #0x6329\n\t" + "MOVT %[a], #0x5d08\n\t" + "MOV r11, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r11, %[b], %[a]\n\t" + "ADDS r7, r7, r11\n\t" + "MOV r11, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "UMLAL r7, r11, %[c], %[a]\n\t" + "ADDS r8, r8, r11\n\t" + "MOV r11, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "UMLAL r8, r11, r4, %[a]\n\t" + "ADDS r9, r9, r11\n\t" + "MOV r11, #0x0\n\t" + "ADC r11, r11, #0x0\n\t" + "UMLAL r9, r11, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -14def9df */ + "MOV %[a], #0x621\n\t" + "MOVT %[a], #0xeb21\n\t" + "MOV r12, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r12, %[b], %[a]\n\t" + "ADDS r7, r7, r12\n\t" + "MOV r12, #0x0\n\t" + "ADC r12, r12, #0x0\n\t" + "UMLAL r7, r12, %[c], %[a]\n\t" + "ADDS r8, r8, r12\n\t" + "MOV r12, #0x0\n\t" + "ADC r12, r12, #0x0\n\t" + "UMLAL r8, r12, r4, %[a]\n\t" + "ADDS r9, r9, r12\n\t" + "MOV r12, #0x0\n\t" + "ADC r12, r12, #0x0\n\t" + "UMLAL r9, r12, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* Add overflows at 4 * 32 */ + "LDM %[s], {r6, r7, r8, r9}\n\t" + "BFC r9, #28, #4\n\t" + "ADDS r6, r6, lr\n\t" + "ADCS r7, r7, r10\n\t" + "ADCS r8, r8, r11\n\t" + "ADC r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "SUBS r6, r6, %[b]\n\t" + "SBCS r7, r7, %[c]\n\t" + "SBCS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBC %[a], %[a], %[a]\n\t" + "SUB %[s], %[s], #0x10\n\t" + "LDM %[s], {%[b], %[c], r4, r5}\n\t" + "MOV r10, #0xd3ed\n\t" + "MOVT r10, #0x5cf5\n\t" + "MOV r11, #0x631a\n\t" + "MOVT r11, #0x5812\n\t" + "MOV r12, #0x9cd6\n\t" + "MOVT r12, #0xa2f7\n\t" + "MOV lr, #0xf9de\n\t" + "MOVT lr, #0x14de\n\t" + "AND r10, r10, %[a]\n\t" + "AND r11, r11, %[a]\n\t" + "AND r12, r12, %[a]\n\t" + "AND lr, lr, %[a]\n\t" + "ADDS %[b], %[b], r10\n\t" + "ADCS %[c], %[c], r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADCS r5, r5, lr\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "AND %[a], %[a], #0x10000000\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, %[a]\n\t" + "BFC r9, #28, #4\n\t" + "LDR %[s], [sp, #68]\n\t" + /* Store result */ + "STR %[b], [%[s]]\n\t" + "STR %[c], [%[s], #4]\n\t" + "STR r4, [%[s], #8]\n\t" + "STR r5, [%[s], #12]\n\t" + "STR r6, [%[s], #16]\n\t" + "STR r7, [%[s], #20]\n\t" + "STR r8, [%[s], #24]\n\t" + "STR r9, [%[s], #28]\n\t" + "ADD sp, sp, #0x50\n\t" + : [s] "+r" (s), [a] "+r" (a), [b] "+r" (b), [c] "+r" (c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void sc_muladd(byte* s_p, const byte* a_p, const byte* b_p, const byte* c_p) +#else +void sc_muladd(byte* s, const byte* a, const byte* b, const byte* c) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register byte* s __asm__ ("r0") = (byte*)s_p; + register const byte* a __asm__ ("r1") = (const byte*)a_p; + register const byte* b __asm__ ("r2") = (const byte*)b_p; + register const byte* c __asm__ ("r3") = (const byte*)c_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x50\n\t" + "ADD lr, sp, #0x44\n\t" + "STM lr, {%[s], %[a], %[c]}\n\t" + "MOV lr, %[b]\n\t" + "LDM %[a], {%[s], %[a], %[b], %[c]}\n\t" + "LDM lr!, {r4, r5, r6}\n\t" + "UMULL r10, r11, %[s], r4\n\t" + "UMULL r12, r7, %[a], r4\n\t" + "UMAAL r11, r12, %[s], r5\n\t" + "UMULL r8, r9, %[b], r4\n\t" + "UMAAL r12, r8, %[a], r5\n\t" + "UMAAL r12, r7, %[s], r6\n\t" + "UMAAL r8, r9, %[c], r4\n\t" + "STM sp, {r10, r11, r12}\n\t" + "UMAAL r7, r8, %[b], r5\n\t" + "LDM lr!, {r4}\n\t" + "UMULL r10, r11, %[a], r6\n\t" + "UMAAL r8, r9, %[b], r6\n\t" + "UMAAL r7, r10, %[s], r4\n\t" + "UMAAL r8, r11, %[c], r5\n\t" + "STR r7, [sp, #12]\n\t" + "UMAAL r8, r10, %[a], r4\n\t" + "UMAAL r9, r11, %[c], r6\n\t" + "UMAAL r9, r10, %[b], r4\n\t" + "UMAAL r10, r11, %[c], r4\n\t" + "LDM lr, {r4, r5, r6, r7}\n\t" + "MOV r12, #0x0\n\t" + "UMLAL r8, r12, %[s], r4\n\t" + "UMAAL r9, r12, %[a], r4\n\t" + "UMAAL r10, r12, %[b], r4\n\t" + "UMAAL r11, r12, %[c], r4\n\t" + "MOV r4, #0x0\n\t" + "UMLAL r9, r4, %[s], r5\n\t" + "UMAAL r10, r4, %[a], r5\n\t" + "UMAAL r11, r4, %[b], r5\n\t" + "UMAAL r12, r4, %[c], r5\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, %[s], r6\n\t" + "UMAAL r11, r5, %[a], r6\n\t" + "UMAAL r12, r5, %[b], r6\n\t" + "UMAAL r4, r5, %[c], r6\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r11, r6, %[s], r7\n\t" + "LDR %[s], [sp, #72]\n\t" + "UMAAL r12, r6, %[a], r7\n\t" + "ADD %[s], %[s], #0x10\n\t" + "UMAAL r4, r6, %[b], r7\n\t" + "SUB lr, lr, #0x10\n\t" + "UMAAL r5, r6, %[c], r7\n\t" + "LDM %[s], {%[s], %[a], %[b], %[c]}\n\t" + "STR r6, [sp, #64]\n\t" + "LDM lr!, {r6}\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r8, r7, %[s], r6\n\t" + "UMAAL r9, r7, %[a], r6\n\t" + "STR r8, [sp, #16]\n\t" + "UMAAL r10, r7, %[b], r6\n\t" + "UMAAL r11, r7, %[c], r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r8, #0x0\n\t" + "UMLAL r9, r8, %[s], r6\n\t" + "UMAAL r10, r8, %[a], r6\n\t" + "STR r9, [sp, #20]\n\t" + "UMAAL r11, r8, %[b], r6\n\t" + "UMAAL r12, r8, %[c], r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r10, r9, %[s], r6\n\t" + "UMAAL r11, r9, %[a], r6\n\t" + "STR r10, [sp, #24]\n\t" + "UMAAL r12, r9, %[b], r6\n\t" + "UMAAL r4, r9, %[c], r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r10, #0x0\n\t" + "UMLAL r11, r10, %[s], r6\n\t" + "UMAAL r12, r10, %[a], r6\n\t" + "STR r11, [sp, #28]\n\t" + "UMAAL r4, r10, %[b], r6\n\t" + "UMAAL r5, r10, %[c], r6\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r12, r7, %[s], r11\n\t" + "UMAAL r4, r7, %[a], r11\n\t" + "LDR r6, [sp, #64]\n\t" + "UMAAL r5, r7, %[b], r11\n\t" + "UMAAL r6, r7, %[c], r11\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r4, r8, %[s], r11\n\t" + "UMAAL r5, r8, %[a], r11\n\t" + "UMAAL r6, r8, %[b], r11\n\t" + "UMAAL r7, r8, %[c], r11\n\t" + "LDM lr, {r11, lr}\n\t" + "UMAAL r5, r9, %[s], r11\n\t" + "UMAAL r6, r10, %[s], lr\n\t" + "UMAAL r6, r9, %[a], r11\n\t" + "UMAAL r7, r10, %[a], lr\n\t" + "UMAAL r7, r9, %[b], r11\n\t" + "UMAAL r8, r10, %[b], lr\n\t" + "UMAAL r8, r9, %[c], r11\n\t" + "UMAAL r9, r10, %[c], lr\n\t" + "MOV %[c], r12\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {%[c], r4, r5, r6, r7, r8, r9, r10}\n\t" + "MOV %[s], sp\n\t" + /* Add c to a * b */ + "LDR lr, [sp, #76]\n\t" + "LDM %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "LDM lr!, {%[a], r10, r11, r12}\n\t" + "ADDS %[b], %[b], %[a]\n\t" + "ADCS %[c], %[c], r10\n\t" + "ADCS r4, r4, r11\n\t" + "ADCS r5, r5, r12\n\t" + "LDM lr!, {%[a], r10, r11, r12}\n\t" + "ADCS r6, r6, %[a]\n\t" + "ADCS r7, r7, r10\n\t" + "ADCS r8, r8, r11\n\t" + "ADCS r9, r9, r12\n\t" + "MOV %[a], r9\n\t" + "STM %[s]!, {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "LDM %[s], {%[b], %[c], r4, r5, r6, r7, r8, r9}\n\t" + "ADCS %[b], %[b], #0x0\n\t" + "ADCS %[c], %[c], #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "SUB %[s], %[s], #0x20\n\t" + /* Get 252..503 and 504..507 */ + "LSR lr, r9, #24\n\t" + "LSL r9, r9, #4\n\t" + "ORR r9, r9, r8, LSR #28\n\t" + "LSL r8, r8, #4\n\t" + "ORR r8, r8, r7, LSR #28\n\t" + "LSL r7, r7, #4\n\t" + "ORR r7, r7, r6, LSR #28\n\t" + "LSL r6, r6, #4\n\t" + "ORR r6, r6, r5, LSR #28\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, %[c], LSR #28\n\t" + "LSL %[c], %[c], #4\n\t" + "ORR %[c], %[c], %[b], LSR #28\n\t" + "LSL %[b], %[b], #4\n\t" + "ORR %[b], %[b], %[a], LSR #28\n\t" + "BFC r9, #28, #4\n\t" + /* Add order times bits 504..507 */ + "MOV r10, #0x2c13\n\t" + "MOVT r10, #0xa30a\n\t" + "MOV r11, #0x9ce5\n\t" + "MOVT r11, #0xa7ed\n\t" + "MOV %[a], #0x0\n\t" + "UMLAL %[b], %[a], r10, lr\n\t" + "UMAAL %[c], %[a], r11, lr\n\t" + "MOV r10, #0x6329\n\t" + "MOVT r10, #0x5d08\n\t" + "MOV r11, #0x621\n\t" + "MOVT r11, #0xeb21\n\t" + "UMAAL r4, %[a], r10, lr\n\t" + "UMAAL r5, %[a], r11, lr\n\t" + "ADDS r6, r6, %[a]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" + "SUBS r6, r6, lr\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC r9, r9, #0x0\n\t" + /* Sub product of top 8 words and order */ + "MOV r12, sp\n\t" + "MOV %[a], #0x2c13\n\t" + "MOVT %[a], #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "UMAAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMAAL r10, lr, r4, %[a]\n\t" + "UMAAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMAAL r10, lr, r6, %[a]\n\t" + "UMAAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM %[s]!, {r10, r11}\n\t" + "UMAAL r10, lr, r8, %[a]\n\t" + "BFC r11, #28, #4\n\t" + "UMAAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV %[a], #0x9ce5\n\t" + "MOVT %[a], #0xa7ed\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "UMAAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r4, %[a]\n\t" + "UMAAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r6, %[a]\n\t" + "UMAAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r8, %[a]\n\t" + "UMAAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV %[a], #0x6329\n\t" + "MOVT %[a], #0x5d08\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "UMAAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r4, %[a]\n\t" + "UMAAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r6, %[a]\n\t" + "UMAAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r8, %[a]\n\t" + "UMAAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + "MOV %[a], #0x621\n\t" + "MOVT %[a], #0xeb21\n\t" + "MOV lr, #0x0\n\t" + "LDM r12, {r10, r11}\n\t" + "UMLAL r10, lr, %[b], %[a]\n\t" + "UMAAL r11, lr, %[c], %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r4, %[a]\n\t" + "UMAAL r11, lr, r5, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r6, %[a]\n\t" + "UMAAL r11, lr, r7, %[a]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "UMAAL r10, lr, r8, %[a]\n\t" + "UMAAL r11, lr, r9, %[a]\n\t" + "STM r12!, {r10, r11, lr}\n\t" + "SUB r12, r12, #0x20\n\t" + /* Subtract at 4 * 32 */ + "LDM r12, {r10, r11}\n\t" + "SUBS r10, r10, %[b]\n\t" + "SBCS r11, r11, %[c]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r4\n\t" + "SBCS r11, r11, r5\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "SBCS r10, r10, r8\n\t" + "SBC r11, r11, r9\n\t" + "STM r12!, {r10, r11}\n\t" + "SUB r12, r12, #0x24\n\t" + "ASR lr, r11, #25\n\t" + /* Conditionally subtract order starting at bit 125 */ + "MOV %[a], #0xa0000000\n\t" + "MOV %[b], #0xba7d\n\t" + "MOVT %[b], #0x4b9e\n\t" + "MOV %[c], #0x4c63\n\t" + "MOVT %[c], #0xcb02\n\t" + "MOV r4, #0xf39a\n\t" + "MOVT r4, #0xd45e\n\t" + "MOV r5, #0xdf3b\n\t" + "MOVT r5, #0x29b\n\t" + "MOV r9, #0x2000000\n\t" + "AND %[a], %[a], lr\n\t" + "AND %[b], %[b], lr\n\t" + "AND %[c], %[c], lr\n\t" + "AND r4, r4, lr\n\t" + "AND r5, r5, lr\n\t" + "AND r9, r9, lr\n\t" + "LDM r12, {r10, r11}\n\t" + "ADDS r10, r10, %[a]\n\t" + "ADCS r11, r11, %[b]\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, %[c]\n\t" + "ADCS r11, r11, r4\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, r5\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10, r11}\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM r12!, {r10, r11}\n\t" + "LDM r12, {r10}\n\t" + "ADCS r10, r10, #0x0\n\t" + "STM r12!, {r10}\n\t" + "SUB %[s], %[s], #0x10\n\t" + "MOV r12, sp\n\t" + /* Load bits 252-376 */ + "ADD r12, r12, #0x1c\n\t" + "LDM r12, {%[a], %[b], %[c], r4, r5}\n\t" + "LSL r5, r5, #4\n\t" + "ORR r5, r5, r4, LSR #28\n\t" + "LSL r4, r4, #4\n\t" + "ORR r4, r4, %[c], LSR #28\n\t" + "LSL %[c], %[c], #4\n\t" + "ORR %[c], %[c], %[b], LSR #28\n\t" + "LSL %[b], %[b], #4\n\t" + "ORR %[b], %[b], %[a], LSR #28\n\t" + "BFC r5, #29, #3\n\t" + "SUB r12, r12, #0x1c\n\t" + /* Sub product of top 4 words and order */ + "MOV %[s], sp\n\t" + /* * -5cf5d3ed */ + "MOV %[a], #0x2c13\n\t" + "MOVT %[a], #0xa30a\n\t" + "MOV lr, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, lr, %[b], %[a]\n\t" + "UMAAL r7, lr, %[c], %[a]\n\t" + "UMAAL r8, lr, r4, %[a]\n\t" + "UMAAL r9, lr, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -5812631b */ + "MOV %[a], #0x9ce5\n\t" + "MOVT %[a], #0xa7ed\n\t" + "MOV r10, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r10, %[b], %[a]\n\t" + "UMAAL r7, r10, %[c], %[a]\n\t" + "UMAAL r8, r10, r4, %[a]\n\t" + "UMAAL r9, r10, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -a2f79cd7 */ + "MOV %[a], #0x6329\n\t" + "MOVT %[a], #0x5d08\n\t" + "MOV r11, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r11, %[b], %[a]\n\t" + "UMAAL r7, r11, %[c], %[a]\n\t" + "UMAAL r8, r11, r4, %[a]\n\t" + "UMAAL r9, r11, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* * -14def9df */ + "MOV %[a], #0x621\n\t" + "MOVT %[a], #0xeb21\n\t" + "MOV r12, #0x0\n\t" + "LDM %[s], {r6, r7, r8, r9}\n\t" + "UMLAL r6, r12, %[b], %[a]\n\t" + "UMAAL r7, r12, %[c], %[a]\n\t" + "UMAAL r8, r12, r4, %[a]\n\t" + "UMAAL r9, r12, r5, %[a]\n\t" + "STM %[s], {r6, r7, r8, r9}\n\t" + "ADD %[s], %[s], #0x4\n\t" + /* Add overflows at 4 * 32 */ + "LDM %[s], {r6, r7, r8, r9}\n\t" + "BFC r9, #28, #4\n\t" + "ADDS r6, r6, lr\n\t" + "ADCS r7, r7, r10\n\t" + "ADCS r8, r8, r11\n\t" + "ADC r9, r9, r12\n\t" + /* Subtract top at 4 * 32 */ + "SUBS r6, r6, %[b]\n\t" + "SBCS r7, r7, %[c]\n\t" + "SBCS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBC %[a], %[a], %[a]\n\t" + "SUB %[s], %[s], #0x10\n\t" + "LDM %[s], {%[b], %[c], r4, r5}\n\t" + "MOV r10, #0xd3ed\n\t" + "MOVT r10, #0x5cf5\n\t" + "MOV r11, #0x631a\n\t" + "MOVT r11, #0x5812\n\t" + "MOV r12, #0x9cd6\n\t" + "MOVT r12, #0xa2f7\n\t" + "MOV lr, #0xf9de\n\t" + "MOVT lr, #0x14de\n\t" + "AND r10, r10, %[a]\n\t" + "AND r11, r11, %[a]\n\t" + "AND r12, r12, %[a]\n\t" + "AND lr, lr, %[a]\n\t" + "ADDS %[b], %[b], r10\n\t" + "ADCS %[c], %[c], r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADCS r5, r5, lr\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "AND %[a], %[a], #0x10000000\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r9, r9, %[a]\n\t" + "BFC r9, #28, #4\n\t" + "LDR %[s], [sp, #68]\n\t" + /* Store result */ + "STR %[b], [%[s]]\n\t" + "STR %[c], [%[s], #4]\n\t" + "STR r4, [%[s], #8]\n\t" + "STR r5, [%[s], #12]\n\t" + "STR r6, [%[s], #16]\n\t" + "STR r7, [%[s], #20]\n\t" + "STR r8, [%[s], #24]\n\t" + "STR r9, [%[s], #28]\n\t" + "ADD sp, sp, #0x50\n\t" + : [s] "+r" (s), [a] "+r" (a), [b] "+r" (b), [c] "+r" (c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#endif /* WOLFSSL_SP_NO_UMAAL */ +#endif /* HAVE_ED25519_SIGN */ +#endif /* HAVE_ED25519 */ + +#endif /* !CURVE25519_SMALL || !ED25519_SMALL */ +#endif /* HAVE_CURVE25519 || HAVE_ED25519 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1490 @@ +/* thumb2-sha256-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha256.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm.S + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE + .thumb + .syntax unified +#ifndef NO_SHA256 +#ifdef WOLFSSL_ARMASM_NO_NEON + .text + .type L_SHA256_transform_len_k, %object + .size L_SHA256_transform_len_k, 256 + .align 4 +L_SHA256_transform_len_k: + .word 0x428a2f98 + .word 0x71374491 + .word 0xb5c0fbcf + .word 0xe9b5dba5 + .word 0x3956c25b + .word 0x59f111f1 + .word 0x923f82a4 + .word 0xab1c5ed5 + .word 0xd807aa98 + .word 0x12835b01 + .word 0x243185be + .word 0x550c7dc3 + .word 0x72be5d74 + .word 0x80deb1fe + .word 0x9bdc06a7 + .word 0xc19bf174 + .word 0xe49b69c1 + .word 0xefbe4786 + .word 0xfc19dc6 + .word 0x240ca1cc + .word 0x2de92c6f + .word 0x4a7484aa + .word 0x5cb0a9dc + .word 0x76f988da + .word 0x983e5152 + .word 0xa831c66d + .word 0xb00327c8 + .word 0xbf597fc7 + .word 0xc6e00bf3 + .word 0xd5a79147 + .word 0x6ca6351 + .word 0x14292967 + .word 0x27b70a85 + .word 0x2e1b2138 + .word 0x4d2c6dfc + .word 0x53380d13 + .word 0x650a7354 + .word 0x766a0abb + .word 0x81c2c92e + .word 0x92722c85 + .word 0xa2bfe8a1 + .word 0xa81a664b + .word 0xc24b8b70 + .word 0xc76c51a3 + .word 0xd192e819 + .word 0xd6990624 + .word 0xf40e3585 + .word 0x106aa070 + .word 0x19a4c116 + .word 0x1e376c08 + .word 0x2748774c + .word 0x34b0bcb5 + .word 0x391c0cb3 + .word 0x4ed8aa4a + .word 0x5b9cca4f + .word 0x682e6ff3 + .word 0x748f82ee + .word 0x78a5636f + .word 0x84c87814 + .word 0x8cc70208 + .word 0x90befffa + .word 0xa4506ceb + .word 0xbef9a3f7 + .word 0xc67178f2 + .text + .align 4 + .globl Transform_Sha256_Len + .type Transform_Sha256_Len, %function +Transform_Sha256_Len: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0xc0 + ADR r3, L_SHA256_transform_len_k + /* Copy digest to add in at end */ + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [r0, #16] + LDRD r10, r11, [r0, #24] + STRD r4, r5, [sp, #64] + STRD r6, r7, [sp, #72] + STRD r8, r9, [sp, #80] + STRD r10, r11, [sp, #88] + /* Start of loop processing a block */ +L_SHA256_transform_len_begin: + /* Load, Reverse and Store W - 64 bytes */ + LDR r4, [r1] + LDR r5, [r1, #4] + LDR r6, [r1, #8] + LDR r7, [r1, #12] + LDR r8, [r1, #16] + LDR r9, [r1, #20] + LDR r10, [r1, #24] + LDR r11, [r1, #28] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + REV r8, r8 + REV r9, r9 + REV r10, r10 + REV r11, r11 + STRD r4, r5, [sp] + STRD r6, r7, [sp, #8] + STRD r8, r9, [sp, #16] + STRD r10, r11, [sp, #24] + LDR r4, [r1, #32] + LDR r5, [r1, #36] + LDR r6, [r1, #40] + LDR r7, [r1, #44] + LDR r8, [r1, #48] + LDR r9, [r1, #52] + LDR r10, [r1, #56] + LDR r11, [r1, #60] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + REV r8, r8 + REV r9, r9 + REV r10, r10 + REV r11, r11 + STRD r4, r5, [sp, #32] + STRD r6, r7, [sp, #40] + STRD r8, r9, [sp, #48] + STRD r10, r11, [sp, #56] + LDR r11, [r0, #4] + LDR r4, [r0, #8] + EOR r11, r11, r4 + MOV r12, #0x3 + /* Start of 16 rounds */ +L_SHA256_transform_len_start: + /* Round 0 */ + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r9, [r0, #28] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp] + LDR r6, [r3] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r8, [r0, #12] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #12] + STR r9, [r0, #28] + /* Calc new W[0] */ + LDR r6, [sp, #56] + LDR r7, [sp, #36] + LDR r8, [sp, #4] + LDR r9, [sp] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp] + /* Round 1 */ + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r9, [r0, #24] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #4] + LDR r6, [r3, #4] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r8, [r0, #8] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #8] + STR r9, [r0, #24] + /* Calc new W[1] */ + LDR r6, [sp, #60] + LDR r7, [sp, #40] + LDR r8, [sp, #8] + LDR r9, [sp, #4] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #4] + /* Round 2 */ + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r9, [r0, #20] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #8] + LDR r6, [r3, #8] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r8, [r0, #4] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #4] + STR r9, [r0, #20] + /* Calc new W[2] */ + LDR r6, [sp] + LDR r7, [sp, #44] + LDR r8, [sp, #12] + LDR r9, [sp, #8] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #8] + /* Round 3 */ + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r9, [r0, #16] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #12] + LDR r6, [r3, #12] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r8, [r0] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0] + STR r9, [r0, #16] + /* Calc new W[3] */ + LDR r6, [sp, #4] + LDR r7, [sp, #48] + LDR r8, [sp, #16] + LDR r9, [sp, #12] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #12] + /* Round 4 */ + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r9, [r0, #12] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #16] + LDR r6, [r3, #16] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r8, [r0, #28] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #28] + STR r9, [r0, #12] + /* Calc new W[4] */ + LDR r6, [sp, #8] + LDR r7, [sp, #52] + LDR r8, [sp, #20] + LDR r9, [sp, #16] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #16] + /* Round 5 */ + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r9, [r0, #8] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #20] + LDR r6, [r3, #20] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r8, [r0, #24] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #24] + STR r9, [r0, #8] + /* Calc new W[5] */ + LDR r6, [sp, #12] + LDR r7, [sp, #56] + LDR r8, [sp, #24] + LDR r9, [sp, #20] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #20] + /* Round 6 */ + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r9, [r0, #4] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #24] + LDR r6, [r3, #24] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r8, [r0, #20] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #20] + STR r9, [r0, #4] + /* Calc new W[6] */ + LDR r6, [sp, #16] + LDR r7, [sp, #60] + LDR r8, [sp, #28] + LDR r9, [sp, #24] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #24] + /* Round 7 */ + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r9, [r0] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #28] + LDR r6, [r3, #28] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r8, [r0, #16] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #16] + STR r9, [r0] + /* Calc new W[7] */ + LDR r6, [sp, #20] + LDR r7, [sp] + LDR r8, [sp, #32] + LDR r9, [sp, #28] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #28] + /* Round 8 */ + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r9, [r0, #28] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #32] + LDR r6, [r3, #32] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r8, [r0, #12] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #12] + STR r9, [r0, #28] + /* Calc new W[8] */ + LDR r6, [sp, #24] + LDR r7, [sp, #4] + LDR r8, [sp, #36] + LDR r9, [sp, #32] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #32] + /* Round 9 */ + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r9, [r0, #24] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #36] + LDR r6, [r3, #36] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r8, [r0, #8] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #8] + STR r9, [r0, #24] + /* Calc new W[9] */ + LDR r6, [sp, #28] + LDR r7, [sp, #8] + LDR r8, [sp, #40] + LDR r9, [sp, #36] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #36] + /* Round 10 */ + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r9, [r0, #20] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #40] + LDR r6, [r3, #40] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r8, [r0, #4] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #4] + STR r9, [r0, #20] + /* Calc new W[10] */ + LDR r6, [sp, #32] + LDR r7, [sp, #12] + LDR r8, [sp, #44] + LDR r9, [sp, #40] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #40] + /* Round 11 */ + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r9, [r0, #16] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #44] + LDR r6, [r3, #44] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r8, [r0] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0] + STR r9, [r0, #16] + /* Calc new W[11] */ + LDR r6, [sp, #36] + LDR r7, [sp, #16] + LDR r8, [sp, #48] + LDR r9, [sp, #44] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #44] + /* Round 12 */ + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r9, [r0, #12] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #48] + LDR r6, [r3, #48] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r8, [r0, #28] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #28] + STR r9, [r0, #12] + /* Calc new W[12] */ + LDR r6, [sp, #40] + LDR r7, [sp, #20] + LDR r8, [sp, #52] + LDR r9, [sp, #48] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #48] + /* Round 13 */ + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r9, [r0, #8] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #52] + LDR r6, [r3, #52] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r8, [r0, #24] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #24] + STR r9, [r0, #8] + /* Calc new W[13] */ + LDR r6, [sp, #44] + LDR r7, [sp, #24] + LDR r8, [sp, #56] + LDR r9, [sp, #52] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #52] + /* Round 14 */ + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r9, [r0, #4] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #56] + LDR r6, [r3, #56] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r8, [r0, #20] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #20] + STR r9, [r0, #4] + /* Calc new W[14] */ + LDR r6, [sp, #48] + LDR r7, [sp, #28] + LDR r8, [sp, #60] + LDR r9, [sp, #56] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #56] + /* Round 15 */ + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r9, [r0] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #60] + LDR r6, [r3, #60] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r8, [r0, #16] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #16] + STR r9, [r0] + /* Calc new W[15] */ + LDR r6, [sp, #52] + LDR r7, [sp, #32] + LDR r8, [sp] + LDR r9, [sp, #60] + ROR r4, r6, #17 + ROR r5, r8, #7 + EOR r4, r4, r6, ROR #19 + EOR r5, r5, r8, ROR #18 + EOR r4, r4, r6, LSR #10 + EOR r5, r5, r8, LSR #3 + ADD r9, r9, r7 + ADD r4, r4, r5 + ADD r9, r9, r4 + STR r9, [sp, #60] + ADD r3, r3, #0x40 + SUBS r12, r12, #0x1 +#ifdef __GNUC__ + BNE L_SHA256_transform_len_start +#else + BNE.W L_SHA256_transform_len_start +#endif + /* Round 0 */ + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r9, [r0, #28] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp] + LDR r6, [r3] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r8, [r0, #12] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #12] + STR r9, [r0, #28] + /* Round 1 */ + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r9, [r0, #24] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #4] + LDR r6, [r3, #4] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r8, [r0, #8] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #8] + STR r9, [r0, #24] + /* Round 2 */ + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r9, [r0, #20] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #8] + LDR r6, [r3, #8] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r8, [r0, #4] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #4] + STR r9, [r0, #20] + /* Round 3 */ + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r9, [r0, #16] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #12] + LDR r6, [r3, #12] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r8, [r0] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0] + STR r9, [r0, #16] + /* Round 4 */ + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r9, [r0, #12] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #16] + LDR r6, [r3, #16] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r8, [r0, #28] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #28] + STR r9, [r0, #12] + /* Round 5 */ + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r9, [r0, #8] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #20] + LDR r6, [r3, #20] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r8, [r0, #24] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #24] + STR r9, [r0, #8] + /* Round 6 */ + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r9, [r0, #4] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #24] + LDR r6, [r3, #24] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r8, [r0, #20] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #20] + STR r9, [r0, #4] + /* Round 7 */ + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r9, [r0] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #28] + LDR r6, [r3, #28] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r8, [r0, #16] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #16] + STR r9, [r0] + /* Round 8 */ + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r9, [r0, #28] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #32] + LDR r6, [r3, #32] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r8, [r0, #12] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #12] + STR r9, [r0, #28] + /* Round 9 */ + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r9, [r0, #24] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #36] + LDR r6, [r3, #36] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r8, [r0, #8] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #8] + STR r9, [r0, #24] + /* Round 10 */ + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r9, [r0, #20] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #40] + LDR r6, [r3, #40] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r8, [r0, #4] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #4] + STR r9, [r0, #20] + /* Round 11 */ + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r9, [r0, #16] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #44] + LDR r6, [r3, #44] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r8, [r0] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0] + STR r9, [r0, #16] + /* Round 12 */ + LDR r5, [r0] + LDR r6, [r0, #4] + LDR r7, [r0, #8] + LDR r9, [r0, #12] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #48] + LDR r6, [r3, #48] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #16] + LDR r6, [r0, #20] + LDR r7, [r0, #24] + LDR r8, [r0, #28] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #28] + STR r9, [r0, #12] + /* Round 13 */ + LDR r5, [r0, #28] + LDR r6, [r0] + LDR r7, [r0, #4] + LDR r9, [r0, #8] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #52] + LDR r6, [r3, #52] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #12] + LDR r6, [r0, #16] + LDR r7, [r0, #20] + LDR r8, [r0, #24] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #24] + STR r9, [r0, #8] + /* Round 14 */ + LDR r5, [r0, #24] + LDR r6, [r0, #28] + LDR r7, [r0] + LDR r9, [r0, #4] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #56] + LDR r6, [r3, #56] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #8] + LDR r6, [r0, #12] + LDR r7, [r0, #16] + LDR r8, [r0, #20] + ROR r4, r5, #2 + EOR r10, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r11, r11, r10 + EOR r4, r4, r5, ROR #22 + EOR r11, r11, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r11 + STR r8, [r0, #20] + STR r9, [r0, #4] + /* Round 15 */ + LDR r5, [r0, #20] + LDR r6, [r0, #24] + LDR r7, [r0, #28] + LDR r9, [r0] + ROR r4, r5, #6 + EOR r6, r6, r7 + EOR r4, r4, r5, ROR #11 + AND r6, r6, r5 + EOR r4, r4, r5, ROR #25 + EOR r6, r6, r7 + ADD r9, r9, r4 + ADD r9, r9, r6 + LDR r5, [sp, #60] + LDR r6, [r3, #60] + ADD r9, r9, r5 + ADD r9, r9, r6 + LDR r5, [r0, #4] + LDR r6, [r0, #8] + LDR r7, [r0, #12] + LDR r8, [r0, #16] + ROR r4, r5, #2 + EOR r11, r5, r6 + EOR r4, r4, r5, ROR #13 + AND r10, r10, r11 + EOR r4, r4, r5, ROR #22 + EOR r10, r10, r6 + ADD r8, r8, r9 + ADD r9, r9, r4 + ADD r9, r9, r10 + STR r8, [r0, #16] + STR r9, [r0] + /* Add in digest from start */ + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [sp, #64] + LDRD r10, r11, [sp, #72] + ADD r4, r4, r8 + ADD r5, r5, r9 + ADD r6, r6, r10 + ADD r7, r7, r11 + STRD r4, r5, [r0] + STRD r6, r7, [r0, #8] + STRD r4, r5, [sp, #64] + STRD r6, r7, [sp, #72] + LDRD r4, r5, [r0, #16] + LDRD r6, r7, [r0, #24] + LDRD r8, r9, [sp, #80] + LDRD r10, r11, [sp, #88] + ADD r4, r4, r8 + ADD r5, r5, r9 + ADD r6, r6, r10 + ADD r7, r7, r11 + STRD r4, r5, [r0, #16] + STRD r6, r7, [r0, #24] + STRD r4, r5, [sp, #80] + STRD r6, r7, [sp, #88] + SUBS r2, r2, #0x40 + SUB r3, r3, #0xc0 + ADD r1, r1, #0x40 +#ifdef __GNUC__ + BNE L_SHA256_transform_len_begin +#else + BNE.W L_SHA256_transform_len_begin +#endif + ADD sp, sp, #0xc0 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 1874 */ + .size Transform_Sha256_Len,.-Transform_Sha256_Len +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#endif /* !NO_SHA256 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1468 @@ +/* thumb2-sha256-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha256.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-sha256-asm.c + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +#ifndef NO_SHA256 +#include + +#ifdef WOLFSSL_ARMASM_NO_NEON +XALIGNED(16) static const uint32_t L_SHA256_transform_len_k[] = { + 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, +}; + +void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, word32 len); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void Transform_Sha256_Len(wc_Sha256* sha256_p, const byte* data_p, word32 len_p) +#else +void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, word32 len) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register wc_Sha256* sha256 __asm__ ("r0") = (wc_Sha256*)sha256_p; + register const byte* data __asm__ ("r1") = (const byte*)data_p; + register word32 len __asm__ ("r2") = (word32)len_p; + register uint32_t* L_SHA256_transform_len_k_c __asm__ ("r3") = (uint32_t*)&L_SHA256_transform_len_k; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0xc0\n\t" + "MOV r3, %[L_SHA256_transform_len_k]\n\t" + /* Copy digest to add in at end */ + "LDRD r4, r5, [%[sha256]]\n\t" + "LDRD r6, r7, [%[sha256], #8]\n\t" + "LDRD r8, r9, [%[sha256], #16]\n\t" + "LDRD r10, r11, [%[sha256], #24]\n\t" + "STRD r4, r5, [sp, #64]\n\t" + "STRD r6, r7, [sp, #72]\n\t" + "STRD r8, r9, [sp, #80]\n\t" + "STRD r10, r11, [sp, #88]\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA256_transform_len_begin%=:\n\t" + /* Load, Reverse and Store W - 64 bytes */ + "LDR r4, [%[data]]\n\t" + "LDR r5, [%[data], #4]\n\t" + "LDR r6, [%[data], #8]\n\t" + "LDR r7, [%[data], #12]\n\t" + "LDR r8, [%[data], #16]\n\t" + "LDR r9, [%[data], #20]\n\t" + "LDR r10, [%[data], #24]\n\t" + "LDR r11, [%[data], #28]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "REV r10, r10\n\t" + "REV r11, r11\n\t" + "STRD r4, r5, [sp]\n\t" + "STRD r6, r7, [sp, #8]\n\t" + "STRD r8, r9, [sp, #16]\n\t" + "STRD r10, r11, [sp, #24]\n\t" + "LDR r4, [%[data], #32]\n\t" + "LDR r5, [%[data], #36]\n\t" + "LDR r6, [%[data], #40]\n\t" + "LDR r7, [%[data], #44]\n\t" + "LDR r8, [%[data], #48]\n\t" + "LDR r9, [%[data], #52]\n\t" + "LDR r10, [%[data], #56]\n\t" + "LDR r11, [%[data], #60]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "REV r10, r10\n\t" + "REV r11, r11\n\t" + "STRD r4, r5, [sp, #32]\n\t" + "STRD r6, r7, [sp, #40]\n\t" + "STRD r8, r9, [sp, #48]\n\t" + "STRD r10, r11, [sp, #56]\n\t" + "LDR r11, [%[sha256], #4]\n\t" + "LDR r4, [%[sha256], #8]\n\t" + "EOR r11, r11, r4\n\t" + "MOV r12, #0x3\n\t" + /* Start of 16 rounds */ + "\n" + "L_SHA256_transform_len_start%=:\n\t" + /* Round 0 */ + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r9, [%[sha256], #28]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp]\n\t" + "LDR r6, [r3]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r8, [%[sha256], #12]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #12]\n\t" + "STR r9, [%[sha256], #28]\n\t" + /* Calc new W[0] */ + "LDR r6, [sp, #56]\n\t" + "LDR r7, [sp, #36]\n\t" + "LDR r8, [sp, #4]\n\t" + "LDR r9, [sp]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp]\n\t" + /* Round 1 */ + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r9, [%[sha256], #24]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #4]\n\t" + "LDR r6, [r3, #4]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r8, [%[sha256], #8]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #8]\n\t" + "STR r9, [%[sha256], #24]\n\t" + /* Calc new W[1] */ + "LDR r6, [sp, #60]\n\t" + "LDR r7, [sp, #40]\n\t" + "LDR r8, [sp, #8]\n\t" + "LDR r9, [sp, #4]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #4]\n\t" + /* Round 2 */ + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r9, [%[sha256], #20]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #8]\n\t" + "LDR r6, [r3, #8]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r8, [%[sha256], #4]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #4]\n\t" + "STR r9, [%[sha256], #20]\n\t" + /* Calc new W[2] */ + "LDR r6, [sp]\n\t" + "LDR r7, [sp, #44]\n\t" + "LDR r8, [sp, #12]\n\t" + "LDR r9, [sp, #8]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #8]\n\t" + /* Round 3 */ + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r9, [%[sha256], #16]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #12]\n\t" + "LDR r6, [r3, #12]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r8, [%[sha256]]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256]]\n\t" + "STR r9, [%[sha256], #16]\n\t" + /* Calc new W[3] */ + "LDR r6, [sp, #4]\n\t" + "LDR r7, [sp, #48]\n\t" + "LDR r8, [sp, #16]\n\t" + "LDR r9, [sp, #12]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #12]\n\t" + /* Round 4 */ + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r9, [%[sha256], #12]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #16]\n\t" + "LDR r6, [r3, #16]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r8, [%[sha256], #28]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #28]\n\t" + "STR r9, [%[sha256], #12]\n\t" + /* Calc new W[4] */ + "LDR r6, [sp, #8]\n\t" + "LDR r7, [sp, #52]\n\t" + "LDR r8, [sp, #20]\n\t" + "LDR r9, [sp, #16]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #16]\n\t" + /* Round 5 */ + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r9, [%[sha256], #8]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #20]\n\t" + "LDR r6, [r3, #20]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r8, [%[sha256], #24]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #24]\n\t" + "STR r9, [%[sha256], #8]\n\t" + /* Calc new W[5] */ + "LDR r6, [sp, #12]\n\t" + "LDR r7, [sp, #56]\n\t" + "LDR r8, [sp, #24]\n\t" + "LDR r9, [sp, #20]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #20]\n\t" + /* Round 6 */ + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r9, [%[sha256], #4]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #24]\n\t" + "LDR r6, [r3, #24]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r8, [%[sha256], #20]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #20]\n\t" + "STR r9, [%[sha256], #4]\n\t" + /* Calc new W[6] */ + "LDR r6, [sp, #16]\n\t" + "LDR r7, [sp, #60]\n\t" + "LDR r8, [sp, #28]\n\t" + "LDR r9, [sp, #24]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #24]\n\t" + /* Round 7 */ + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r9, [%[sha256]]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #28]\n\t" + "LDR r6, [r3, #28]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r8, [%[sha256], #16]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #16]\n\t" + "STR r9, [%[sha256]]\n\t" + /* Calc new W[7] */ + "LDR r6, [sp, #20]\n\t" + "LDR r7, [sp]\n\t" + "LDR r8, [sp, #32]\n\t" + "LDR r9, [sp, #28]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #28]\n\t" + /* Round 8 */ + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r9, [%[sha256], #28]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #32]\n\t" + "LDR r6, [r3, #32]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r8, [%[sha256], #12]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #12]\n\t" + "STR r9, [%[sha256], #28]\n\t" + /* Calc new W[8] */ + "LDR r6, [sp, #24]\n\t" + "LDR r7, [sp, #4]\n\t" + "LDR r8, [sp, #36]\n\t" + "LDR r9, [sp, #32]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #32]\n\t" + /* Round 9 */ + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r9, [%[sha256], #24]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #36]\n\t" + "LDR r6, [r3, #36]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r8, [%[sha256], #8]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #8]\n\t" + "STR r9, [%[sha256], #24]\n\t" + /* Calc new W[9] */ + "LDR r6, [sp, #28]\n\t" + "LDR r7, [sp, #8]\n\t" + "LDR r8, [sp, #40]\n\t" + "LDR r9, [sp, #36]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #36]\n\t" + /* Round 10 */ + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r9, [%[sha256], #20]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #40]\n\t" + "LDR r6, [r3, #40]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r8, [%[sha256], #4]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #4]\n\t" + "STR r9, [%[sha256], #20]\n\t" + /* Calc new W[10] */ + "LDR r6, [sp, #32]\n\t" + "LDR r7, [sp, #12]\n\t" + "LDR r8, [sp, #44]\n\t" + "LDR r9, [sp, #40]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #40]\n\t" + /* Round 11 */ + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r9, [%[sha256], #16]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #44]\n\t" + "LDR r6, [r3, #44]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r8, [%[sha256]]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256]]\n\t" + "STR r9, [%[sha256], #16]\n\t" + /* Calc new W[11] */ + "LDR r6, [sp, #36]\n\t" + "LDR r7, [sp, #16]\n\t" + "LDR r8, [sp, #48]\n\t" + "LDR r9, [sp, #44]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #44]\n\t" + /* Round 12 */ + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r9, [%[sha256], #12]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #48]\n\t" + "LDR r6, [r3, #48]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r8, [%[sha256], #28]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #28]\n\t" + "STR r9, [%[sha256], #12]\n\t" + /* Calc new W[12] */ + "LDR r6, [sp, #40]\n\t" + "LDR r7, [sp, #20]\n\t" + "LDR r8, [sp, #52]\n\t" + "LDR r9, [sp, #48]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #48]\n\t" + /* Round 13 */ + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r9, [%[sha256], #8]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #52]\n\t" + "LDR r6, [r3, #52]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r8, [%[sha256], #24]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #24]\n\t" + "STR r9, [%[sha256], #8]\n\t" + /* Calc new W[13] */ + "LDR r6, [sp, #44]\n\t" + "LDR r7, [sp, #24]\n\t" + "LDR r8, [sp, #56]\n\t" + "LDR r9, [sp, #52]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #52]\n\t" + /* Round 14 */ + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r9, [%[sha256], #4]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #56]\n\t" + "LDR r6, [r3, #56]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r8, [%[sha256], #20]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #20]\n\t" + "STR r9, [%[sha256], #4]\n\t" + /* Calc new W[14] */ + "LDR r6, [sp, #48]\n\t" + "LDR r7, [sp, #28]\n\t" + "LDR r8, [sp, #60]\n\t" + "LDR r9, [sp, #56]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #56]\n\t" + /* Round 15 */ + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r9, [%[sha256]]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #60]\n\t" + "LDR r6, [r3, #60]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r8, [%[sha256], #16]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #16]\n\t" + "STR r9, [%[sha256]]\n\t" + /* Calc new W[15] */ + "LDR r6, [sp, #52]\n\t" + "LDR r7, [sp, #32]\n\t" + "LDR r8, [sp]\n\t" + "LDR r9, [sp, #60]\n\t" + "ROR r4, r6, #17\n\t" + "ROR r5, r8, #7\n\t" + "EOR r4, r4, r6, ROR #19\n\t" + "EOR r5, r5, r8, ROR #18\n\t" + "EOR r4, r4, r6, LSR #10\n\t" + "EOR r5, r5, r8, LSR #3\n\t" + "ADD r9, r9, r7\n\t" + "ADD r4, r4, r5\n\t" + "ADD r9, r9, r4\n\t" + "STR r9, [sp, #60]\n\t" + "ADD r3, r3, #0x40\n\t" + "SUBS r12, r12, #0x1\n\t" +#ifdef __GNUC__ + "BNE L_SHA256_transform_len_start%=\n\t" +#else + "BNE.W L_SHA256_transform_len_start%=\n\t" +#endif + /* Round 0 */ + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r9, [%[sha256], #28]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp]\n\t" + "LDR r6, [r3]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r8, [%[sha256], #12]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #12]\n\t" + "STR r9, [%[sha256], #28]\n\t" + /* Round 1 */ + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r9, [%[sha256], #24]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #4]\n\t" + "LDR r6, [r3, #4]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r8, [%[sha256], #8]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #8]\n\t" + "STR r9, [%[sha256], #24]\n\t" + /* Round 2 */ + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r9, [%[sha256], #20]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #8]\n\t" + "LDR r6, [r3, #8]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r8, [%[sha256], #4]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #4]\n\t" + "STR r9, [%[sha256], #20]\n\t" + /* Round 3 */ + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r9, [%[sha256], #16]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #12]\n\t" + "LDR r6, [r3, #12]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r8, [%[sha256]]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256]]\n\t" + "STR r9, [%[sha256], #16]\n\t" + /* Round 4 */ + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r9, [%[sha256], #12]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #16]\n\t" + "LDR r6, [r3, #16]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r8, [%[sha256], #28]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #28]\n\t" + "STR r9, [%[sha256], #12]\n\t" + /* Round 5 */ + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r9, [%[sha256], #8]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #20]\n\t" + "LDR r6, [r3, #20]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r8, [%[sha256], #24]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #24]\n\t" + "STR r9, [%[sha256], #8]\n\t" + /* Round 6 */ + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r9, [%[sha256], #4]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #24]\n\t" + "LDR r6, [r3, #24]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r8, [%[sha256], #20]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #20]\n\t" + "STR r9, [%[sha256], #4]\n\t" + /* Round 7 */ + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r9, [%[sha256]]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #28]\n\t" + "LDR r6, [r3, #28]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r8, [%[sha256], #16]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #16]\n\t" + "STR r9, [%[sha256]]\n\t" + /* Round 8 */ + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r9, [%[sha256], #28]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #32]\n\t" + "LDR r6, [r3, #32]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r8, [%[sha256], #12]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #12]\n\t" + "STR r9, [%[sha256], #28]\n\t" + /* Round 9 */ + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r9, [%[sha256], #24]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #36]\n\t" + "LDR r6, [r3, #36]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r8, [%[sha256], #8]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #8]\n\t" + "STR r9, [%[sha256], #24]\n\t" + /* Round 10 */ + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r9, [%[sha256], #20]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #40]\n\t" + "LDR r6, [r3, #40]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r8, [%[sha256], #4]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #4]\n\t" + "STR r9, [%[sha256], #20]\n\t" + /* Round 11 */ + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r9, [%[sha256], #16]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #44]\n\t" + "LDR r6, [r3, #44]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r8, [%[sha256]]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256]]\n\t" + "STR r9, [%[sha256], #16]\n\t" + /* Round 12 */ + "LDR r5, [%[sha256]]\n\t" + "LDR r6, [%[sha256], #4]\n\t" + "LDR r7, [%[sha256], #8]\n\t" + "LDR r9, [%[sha256], #12]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #48]\n\t" + "LDR r6, [r3, #48]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #16]\n\t" + "LDR r6, [%[sha256], #20]\n\t" + "LDR r7, [%[sha256], #24]\n\t" + "LDR r8, [%[sha256], #28]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #28]\n\t" + "STR r9, [%[sha256], #12]\n\t" + /* Round 13 */ + "LDR r5, [%[sha256], #28]\n\t" + "LDR r6, [%[sha256]]\n\t" + "LDR r7, [%[sha256], #4]\n\t" + "LDR r9, [%[sha256], #8]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #52]\n\t" + "LDR r6, [r3, #52]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #12]\n\t" + "LDR r6, [%[sha256], #16]\n\t" + "LDR r7, [%[sha256], #20]\n\t" + "LDR r8, [%[sha256], #24]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #24]\n\t" + "STR r9, [%[sha256], #8]\n\t" + /* Round 14 */ + "LDR r5, [%[sha256], #24]\n\t" + "LDR r6, [%[sha256], #28]\n\t" + "LDR r7, [%[sha256]]\n\t" + "LDR r9, [%[sha256], #4]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #56]\n\t" + "LDR r6, [r3, #56]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #8]\n\t" + "LDR r6, [%[sha256], #12]\n\t" + "LDR r7, [%[sha256], #16]\n\t" + "LDR r8, [%[sha256], #20]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r10, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r11, r11, r10\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r11, r11, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r11\n\t" + "STR r8, [%[sha256], #20]\n\t" + "STR r9, [%[sha256], #4]\n\t" + /* Round 15 */ + "LDR r5, [%[sha256], #20]\n\t" + "LDR r6, [%[sha256], #24]\n\t" + "LDR r7, [%[sha256], #28]\n\t" + "LDR r9, [%[sha256]]\n\t" + "ROR r4, r5, #6\n\t" + "EOR r6, r6, r7\n\t" + "EOR r4, r4, r5, ROR #11\n\t" + "AND r6, r6, r5\n\t" + "EOR r4, r4, r5, ROR #25\n\t" + "EOR r6, r6, r7\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [sp, #60]\n\t" + "LDR r6, [r3, #60]\n\t" + "ADD r9, r9, r5\n\t" + "ADD r9, r9, r6\n\t" + "LDR r5, [%[sha256], #4]\n\t" + "LDR r6, [%[sha256], #8]\n\t" + "LDR r7, [%[sha256], #12]\n\t" + "LDR r8, [%[sha256], #16]\n\t" + "ROR r4, r5, #2\n\t" + "EOR r11, r5, r6\n\t" + "EOR r4, r4, r5, ROR #13\n\t" + "AND r10, r10, r11\n\t" + "EOR r4, r4, r5, ROR #22\n\t" + "EOR r10, r10, r6\n\t" + "ADD r8, r8, r9\n\t" + "ADD r9, r9, r4\n\t" + "ADD r9, r9, r10\n\t" + "STR r8, [%[sha256], #16]\n\t" + "STR r9, [%[sha256]]\n\t" + /* Add in digest from start */ + "LDRD r4, r5, [%[sha256]]\n\t" + "LDRD r6, r7, [%[sha256], #8]\n\t" + "LDRD r8, r9, [sp, #64]\n\t" + "LDRD r10, r11, [sp, #72]\n\t" + "ADD r4, r4, r8\n\t" + "ADD r5, r5, r9\n\t" + "ADD r6, r6, r10\n\t" + "ADD r7, r7, r11\n\t" + "STRD r4, r5, [%[sha256]]\n\t" + "STRD r6, r7, [%[sha256], #8]\n\t" + "STRD r4, r5, [sp, #64]\n\t" + "STRD r6, r7, [sp, #72]\n\t" + "LDRD r4, r5, [%[sha256], #16]\n\t" + "LDRD r6, r7, [%[sha256], #24]\n\t" + "LDRD r8, r9, [sp, #80]\n\t" + "LDRD r10, r11, [sp, #88]\n\t" + "ADD r4, r4, r8\n\t" + "ADD r5, r5, r9\n\t" + "ADD r6, r6, r10\n\t" + "ADD r7, r7, r11\n\t" + "STRD r4, r5, [%[sha256], #16]\n\t" + "STRD r6, r7, [%[sha256], #24]\n\t" + "STRD r4, r5, [sp, #80]\n\t" + "STRD r6, r7, [sp, #88]\n\t" + "SUBS %[len], %[len], #0x40\n\t" + "SUB r3, r3, #0xc0\n\t" + "ADD %[data], %[data], #0x40\n\t" +#ifdef __GNUC__ + "BNE L_SHA256_transform_len_begin%=\n\t" +#else + "BNE.W L_SHA256_transform_len_begin%=\n\t" +#endif + "ADD sp, sp, #0xc0\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len), + [L_SHA256_transform_len_k] "+r" (L_SHA256_transform_len_k_c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" +#else + : [sha256] "+r" (sha256), [data] "+r" (data), [len] "+r" (len) + : [L_SHA256_transform_len_k] "r" (L_SHA256_transform_len_k) + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +} + +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#endif /* !NO_SHA256 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1176 @@ +/* thumb2-sha3-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha3/sha3.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm.S + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE + .thumb + .syntax unified +#ifdef WOLFSSL_SHA3 + .text + .type L_sha3_thumb2_rt, %object + .size L_sha3_thumb2_rt, 192 + .align 8 +L_sha3_thumb2_rt: + .word 0x1 + .word 0x0 + .word 0x8082 + .word 0x0 + .word 0x808a + .word 0x80000000 + .word 0x80008000 + .word 0x80000000 + .word 0x808b + .word 0x0 + .word 0x80000001 + .word 0x0 + .word 0x80008081 + .word 0x80000000 + .word 0x8009 + .word 0x80000000 + .word 0x8a + .word 0x0 + .word 0x88 + .word 0x0 + .word 0x80008009 + .word 0x0 + .word 0x8000000a + .word 0x0 + .word 0x8000808b + .word 0x0 + .word 0x8b + .word 0x80000000 + .word 0x8089 + .word 0x80000000 + .word 0x8003 + .word 0x80000000 + .word 0x8002 + .word 0x80000000 + .word 0x80 + .word 0x80000000 + .word 0x800a + .word 0x0 + .word 0x8000000a + .word 0x80000000 + .word 0x80008081 + .word 0x80000000 + .word 0x8080 + .word 0x80000000 + .word 0x80000001 + .word 0x0 + .word 0x80008008 + .word 0x80000000 + .text + .align 4 + .globl BlockSha3 + .type BlockSha3, %function +BlockSha3: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0xcc + ADR r1, L_sha3_thumb2_rt + MOV r2, #0xc +L_sha3_thumb2_begin: + STR r2, [sp, #200] + /* Round even */ + /* Calc b[4] */ + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #72] + LDRD r8, r9, [r0, #112] + LDRD r10, r11, [r0, #152] + LDR r12, [r0, #192] + LDR lr, [r0, #196] + EOR r2, r4, r6 + EOR r3, r5, r7 + EOR r2, r2, r8 + EOR r3, r3, r9 + EOR r2, r2, r10 + EOR r3, r3, r11 + EOR r2, r2, r12 + EOR r3, r3, lr + STRD r2, r3, [sp, #32] + /* Calc b[1] */ + LDRD r4, r5, [r0, #8] + LDRD r6, r7, [r0, #48] + LDRD r8, r9, [r0, #88] + LDRD r10, r11, [r0, #128] + LDR r12, [r0, #168] + LDR lr, [r0, #172] + EOR r4, r4, r6 + EOR r5, r5, r7 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r4, r4, r10 + EOR r5, r5, r11 + EOR r4, r4, r12 + EOR r5, r5, lr + STRD r4, r5, [sp, #8] + /* Calc t[0] */ + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* Calc b[0] and XOR t[0] into s[x*5+0] */ + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #40] + LDRD r8, r9, [r0, #80] + LDRD r10, r11, [r0, #120] + EOR r12, r4, r6 + EOR lr, r5, r7 + EOR r12, r12, r8 + EOR lr, lr, r9 + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r4, r5, [r0] + STRD r6, r7, [r0, #40] + STRD r8, r9, [r0, #80] + STRD r10, r11, [r0, #120] + LDRD r10, r11, [r0, #160] + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r10, r11, [r0, #160] + STR r12, [sp] + STR lr, [sp, #4] + /* Calc b[3] */ + LDRD r4, r5, [r0, #24] + LDRD r6, r7, [r0, #64] + LDRD r8, r9, [r0, #104] + LDRD r10, r11, [r0, #144] + LDR r12, [r0, #184] + LDR lr, [r0, #188] + EOR r4, r4, r6 + EOR r5, r5, r7 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r4, r4, r10 + EOR r5, r5, r11 + EOR r4, r4, r12 + EOR r5, r5, lr + STRD r4, r5, [sp, #24] + /* Calc t[2] */ + LDRD r2, r3, [sp, #8] + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* Calc b[2] and XOR t[2] into s[x*5+2] */ + LDRD r4, r5, [r0, #16] + LDRD r6, r7, [r0, #56] + LDRD r8, r9, [r0, #96] + LDRD r10, r11, [r0, #136] + EOR r12, r4, r6 + EOR lr, r5, r7 + EOR r12, r12, r8 + EOR lr, lr, r9 + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r4, r5, [r0, #16] + STRD r6, r7, [r0, #56] + STRD r8, r9, [r0, #96] + STRD r10, r11, [r0, #136] + LDRD r10, r11, [r0, #176] + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r10, r11, [r0, #176] + STR r12, [sp, #16] + STR lr, [sp, #20] + /* Calc t[1] */ + LDRD r2, r3, [sp] + EOR r2, r2, lr, LSR #31 + EOR r3, r3, r12, LSR #31 + EOR r2, r2, r12, LSL #1 + EOR r3, r3, lr, LSL #1 + /* XOR t[1] into s[x*5+1] */ + LDRD r4, r5, [r0, #8] + LDRD r6, r7, [r0, #48] + LDRD r8, r9, [r0, #88] + LDRD r10, r11, [r0, #128] + LDR r12, [r0, #168] + LDR lr, [r0, #172] + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + EOR r12, r12, r2 + EOR lr, lr, r3 + STRD r4, r5, [r0, #8] + STRD r6, r7, [r0, #48] + STRD r8, r9, [r0, #88] + STRD r10, r11, [r0, #128] + STR r12, [r0, #168] + STR lr, [r0, #172] + /* Calc t[3] */ + LDRD r2, r3, [sp, #16] + LDRD r4, r5, [sp, #32] + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* XOR t[3] into s[x*5+3] */ + LDRD r4, r5, [r0, #24] + LDRD r6, r7, [r0, #64] + LDRD r8, r9, [r0, #104] + LDRD r10, r11, [r0, #144] + LDR r12, [r0, #184] + LDR lr, [r0, #188] + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + EOR r12, r12, r2 + EOR lr, lr, r3 + STRD r4, r5, [r0, #24] + STRD r6, r7, [r0, #64] + STRD r8, r9, [r0, #104] + STRD r10, r11, [r0, #144] + STR r12, [r0, #184] + STR lr, [r0, #188] + /* Calc t[4] */ + LDRD r2, r3, [sp, #24] + LDRD r4, r5, [sp] + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* XOR t[4] into s[x*5+4] */ + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #72] + LDRD r8, r9, [r0, #112] + LDRD r10, r11, [r0, #152] + LDR r12, [r0, #192] + LDR lr, [r0, #196] + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + EOR r12, r12, r2 + EOR lr, lr, r3 + STRD r4, r5, [r0, #32] + STRD r6, r7, [r0, #72] + STRD r8, r9, [r0, #112] + STRD r10, r11, [r0, #152] + STR r12, [r0, #192] + STR lr, [r0, #196] + /* Row Mix */ + /* Row 0 */ + LDRD r2, r3, [r0] + LDRD r4, r5, [r0, #48] + LDRD r6, r7, [r0, #96] + LDRD r8, r9, [r0, #144] + LDRD r10, r11, [r0, #192] + /* s[1] <<< 44 */ + MOV lr, r4 + LSR r12, r5, #20 + LSR r4, r4, #20 + ORR r4, r4, r5, LSL #12 + ORR r5, r12, lr, LSL #12 + /* s[2] <<< 43 */ + MOV lr, r6 + LSR r12, r7, #21 + LSR r6, r6, #21 + ORR r6, r6, r7, LSL #11 + ORR r7, r12, lr, LSL #11 + /* s[3] <<< 21 */ + LSR r12, r9, #11 + LSR lr, r8, #11 + ORR r8, r12, r8, LSL #21 + ORR r9, lr, r9, LSL #21 + /* s[4] <<< 14 */ + LSR r12, r11, #18 + LSR lr, r10, #18 + ORR r10, r12, r10, LSL #14 + ORR r11, lr, r11, LSL #14 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [sp, #8] + STR lr, [sp, #12] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [sp, #16] + STR lr, [sp, #20] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [sp, #24] + STR lr, [sp, #28] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [sp, #32] + STR lr, [sp, #36] + /* Get constant */ + LDRD r10, r11, [r1] + ADD r1, r1, #0x8 + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + /* XOR in constant */ + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [sp] + STR lr, [sp, #4] + /* Row 1 */ + LDRD r2, r3, [r0, #24] + LDRD r4, r5, [r0, #72] + LDRD r6, r7, [r0, #80] + LDRD r8, r9, [r0, #128] + LDRD r10, r11, [r0, #176] + /* s[0] <<< 28 */ + LSR r12, r3, #4 + LSR lr, r2, #4 + ORR r2, r12, r2, LSL #28 + ORR r3, lr, r3, LSL #28 + /* s[1] <<< 20 */ + LSR r12, r5, #12 + LSR lr, r4, #12 + ORR r4, r12, r4, LSL #20 + ORR r5, lr, r5, LSL #20 + /* s[2] <<< 3 */ + LSR r12, r7, #29 + LSR lr, r6, #29 + ORR r6, r12, r6, LSL #3 + ORR r7, lr, r7, LSL #3 + /* s[3] <<< 45 */ + MOV lr, r8 + LSR r12, r9, #19 + LSR r8, r8, #19 + ORR r8, r8, r9, LSL #13 + ORR r9, r12, lr, LSL #13 + /* s[4] <<< 61 */ + MOV lr, r10 + LSR r12, r11, #3 + LSR r10, r10, #3 + ORR r10, r10, r11, LSL #29 + ORR r11, r12, lr, LSL #29 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [sp, #48] + STR lr, [sp, #52] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [sp, #56] + STR lr, [sp, #60] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [sp, #64] + STR lr, [sp, #68] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [sp, #72] + STR lr, [sp, #76] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [sp, #40] + STR lr, [sp, #44] + /* Row 2 */ + LDRD r2, r3, [r0, #8] + LDRD r4, r5, [r0, #56] + LDRD r6, r7, [r0, #104] + LDRD r8, r9, [r0, #152] + LDRD r10, r11, [r0, #160] + /* s[0] <<< 1 */ + LSR r12, r3, #31 + LSR lr, r2, #31 + ORR r2, r12, r2, LSL #1 + ORR r3, lr, r3, LSL #1 + /* s[1] <<< 6 */ + LSR r12, r5, #26 + LSR lr, r4, #26 + ORR r4, r12, r4, LSL #6 + ORR r5, lr, r5, LSL #6 + /* s[2] <<< 25 */ + LSR r12, r7, #7 + LSR lr, r6, #7 + ORR r6, r12, r6, LSL #25 + ORR r7, lr, r7, LSL #25 + /* s[3] <<< 8 */ + LSR r12, r9, #24 + LSR lr, r8, #24 + ORR r8, r12, r8, LSL #8 + ORR r9, lr, r9, LSL #8 + /* s[4] <<< 18 */ + LSR r12, r11, #14 + LSR lr, r10, #14 + ORR r10, r12, r10, LSL #18 + ORR r11, lr, r11, LSL #18 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [sp, #88] + STR lr, [sp, #92] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [sp, #96] + STR lr, [sp, #100] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [sp, #104] + STR lr, [sp, #108] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [sp, #112] + STR lr, [sp, #116] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [sp, #80] + STR lr, [sp, #84] + /* Row 3 */ + LDRD r2, r3, [r0, #32] + LDRD r4, r5, [r0, #40] + LDRD r6, r7, [r0, #88] + LDRD r8, r9, [r0, #136] + LDRD r10, r11, [r0, #184] + /* s[0] <<< 27 */ + LSR r12, r3, #5 + LSR lr, r2, #5 + ORR r2, r12, r2, LSL #27 + ORR r3, lr, r3, LSL #27 + /* s[1] <<< 36 */ + MOV lr, r4 + LSR r12, r5, #28 + LSR r4, r4, #28 + ORR r4, r4, r5, LSL #4 + ORR r5, r12, lr, LSL #4 + /* s[2] <<< 10 */ + LSR r12, r7, #22 + LSR lr, r6, #22 + ORR r6, r12, r6, LSL #10 + ORR r7, lr, r7, LSL #10 + /* s[3] <<< 15 */ + LSR r12, r9, #17 + LSR lr, r8, #17 + ORR r8, r12, r8, LSL #15 + ORR r9, lr, r9, LSL #15 + /* s[4] <<< 56 */ + MOV lr, r10 + LSR r12, r11, #8 + LSR r10, r10, #8 + ORR r10, r10, r11, LSL #24 + ORR r11, r12, lr, LSL #24 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [sp, #128] + STR lr, [sp, #132] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [sp, #136] + STR lr, [sp, #140] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [sp, #144] + STR lr, [sp, #148] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [sp, #152] + STR lr, [sp, #156] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [sp, #120] + STR lr, [sp, #124] + /* Row 4 */ + LDRD r2, r3, [r0, #16] + LDRD r4, r5, [r0, #64] + LDRD r6, r7, [r0, #112] + LDRD r8, r9, [r0, #120] + LDRD r10, r11, [r0, #168] + /* s[0] <<< 62 */ + MOV lr, r2 + LSR r12, r3, #2 + LSR r2, r2, #2 + ORR r2, r2, r3, LSL #30 + ORR r3, r12, lr, LSL #30 + /* s[1] <<< 55 */ + MOV lr, r4 + LSR r12, r5, #9 + LSR r4, r4, #9 + ORR r4, r4, r5, LSL #23 + ORR r5, r12, lr, LSL #23 + /* s[2] <<< 39 */ + MOV lr, r6 + LSR r12, r7, #25 + LSR r6, r6, #25 + ORR r6, r6, r7, LSL #7 + ORR r7, r12, lr, LSL #7 + /* s[3] <<< 41 */ + MOV lr, r8 + LSR r12, r9, #23 + LSR r8, r8, #23 + ORR r8, r8, r9, LSL #9 + ORR r9, r12, lr, LSL #9 + /* s[4] <<< 2 */ + LSR r12, r11, #30 + LSR lr, r10, #30 + ORR r10, r12, r10, LSL #2 + ORR r11, lr, r11, LSL #2 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [sp, #168] + STR lr, [sp, #172] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [sp, #176] + STR lr, [sp, #180] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [sp, #184] + STR lr, [sp, #188] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [sp, #192] + STR lr, [sp, #196] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [sp, #160] + STR lr, [sp, #164] + /* Round odd */ + /* Calc b[4] */ + LDRD r4, r5, [sp, #32] + LDRD r6, r7, [sp, #72] + LDRD r8, r9, [sp, #112] + LDRD r10, r11, [sp, #152] + LDR r12, [sp, #192] + LDR lr, [sp, #196] + EOR r2, r4, r6 + EOR r3, r5, r7 + EOR r2, r2, r8 + EOR r3, r3, r9 + EOR r2, r2, r10 + EOR r3, r3, r11 + EOR r2, r2, r12 + EOR r3, r3, lr + STRD r2, r3, [r0, #32] + /* Calc b[1] */ + LDRD r4, r5, [sp, #8] + LDRD r6, r7, [sp, #48] + LDRD r8, r9, [sp, #88] + LDRD r10, r11, [sp, #128] + LDR r12, [sp, #168] + LDR lr, [sp, #172] + EOR r4, r4, r6 + EOR r5, r5, r7 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r4, r4, r10 + EOR r5, r5, r11 + EOR r4, r4, r12 + EOR r5, r5, lr + STRD r4, r5, [r0, #8] + /* Calc t[0] */ + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* Calc b[0] and XOR t[0] into s[x*5+0] */ + LDRD r4, r5, [sp] + LDRD r6, r7, [sp, #40] + LDRD r8, r9, [sp, #80] + LDRD r10, r11, [sp, #120] + EOR r12, r4, r6 + EOR lr, r5, r7 + EOR r12, r12, r8 + EOR lr, lr, r9 + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r4, r5, [sp] + STRD r6, r7, [sp, #40] + STRD r8, r9, [sp, #80] + STRD r10, r11, [sp, #120] + LDRD r10, r11, [sp, #160] + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r10, r11, [sp, #160] + STR r12, [r0] + STR lr, [r0, #4] + /* Calc b[3] */ + LDRD r4, r5, [sp, #24] + LDRD r6, r7, [sp, #64] + LDRD r8, r9, [sp, #104] + LDRD r10, r11, [sp, #144] + LDR r12, [sp, #184] + LDR lr, [sp, #188] + EOR r4, r4, r6 + EOR r5, r5, r7 + EOR r4, r4, r8 + EOR r5, r5, r9 + EOR r4, r4, r10 + EOR r5, r5, r11 + EOR r4, r4, r12 + EOR r5, r5, lr + STRD r4, r5, [r0, #24] + /* Calc t[2] */ + LDRD r2, r3, [r0, #8] + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* Calc b[2] and XOR t[2] into s[x*5+2] */ + LDRD r4, r5, [sp, #16] + LDRD r6, r7, [sp, #56] + LDRD r8, r9, [sp, #96] + LDRD r10, r11, [sp, #136] + EOR r12, r4, r6 + EOR lr, r5, r7 + EOR r12, r12, r8 + EOR lr, lr, r9 + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r4, r5, [sp, #16] + STRD r6, r7, [sp, #56] + STRD r8, r9, [sp, #96] + STRD r10, r11, [sp, #136] + LDRD r10, r11, [sp, #176] + EOR r12, r12, r10 + EOR lr, lr, r11 + EOR r10, r10, r2 + EOR r11, r11, r3 + STRD r10, r11, [sp, #176] + STR r12, [r0, #16] + STR lr, [r0, #20] + /* Calc t[1] */ + LDRD r2, r3, [r0] + EOR r2, r2, lr, LSR #31 + EOR r3, r3, r12, LSR #31 + EOR r2, r2, r12, LSL #1 + EOR r3, r3, lr, LSL #1 + /* XOR t[1] into s[x*5+1] */ + LDRD r4, r5, [sp, #8] + LDRD r6, r7, [sp, #48] + LDRD r8, r9, [sp, #88] + LDRD r10, r11, [sp, #128] + LDR r12, [sp, #168] + LDR lr, [sp, #172] + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + EOR r12, r12, r2 + EOR lr, lr, r3 + STRD r4, r5, [sp, #8] + STRD r6, r7, [sp, #48] + STRD r8, r9, [sp, #88] + STRD r10, r11, [sp, #128] + STR r12, [sp, #168] + STR lr, [sp, #172] + /* Calc t[3] */ + LDRD r2, r3, [r0, #16] + LDRD r4, r5, [r0, #32] + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* XOR t[3] into s[x*5+3] */ + LDRD r4, r5, [sp, #24] + LDRD r6, r7, [sp, #64] + LDRD r8, r9, [sp, #104] + LDRD r10, r11, [sp, #144] + LDR r12, [sp, #184] + LDR lr, [sp, #188] + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + EOR r12, r12, r2 + EOR lr, lr, r3 + STRD r4, r5, [sp, #24] + STRD r6, r7, [sp, #64] + STRD r8, r9, [sp, #104] + STRD r10, r11, [sp, #144] + STR r12, [sp, #184] + STR lr, [sp, #188] + /* Calc t[4] */ + LDRD r2, r3, [r0, #24] + LDRD r4, r5, [r0] + EOR r2, r2, r5, LSR #31 + EOR r3, r3, r4, LSR #31 + EOR r2, r2, r4, LSL #1 + EOR r3, r3, r5, LSL #1 + /* XOR t[4] into s[x*5+4] */ + LDRD r4, r5, [sp, #32] + LDRD r6, r7, [sp, #72] + LDRD r8, r9, [sp, #112] + LDRD r10, r11, [sp, #152] + LDR r12, [sp, #192] + LDR lr, [sp, #196] + EOR r4, r4, r2 + EOR r5, r5, r3 + EOR r6, r6, r2 + EOR r7, r7, r3 + EOR r8, r8, r2 + EOR r9, r9, r3 + EOR r10, r10, r2 + EOR r11, r11, r3 + EOR r12, r12, r2 + EOR lr, lr, r3 + STRD r4, r5, [sp, #32] + STRD r6, r7, [sp, #72] + STRD r8, r9, [sp, #112] + STRD r10, r11, [sp, #152] + STR r12, [sp, #192] + STR lr, [sp, #196] + /* Row Mix */ + /* Row 0 */ + LDRD r2, r3, [sp] + LDRD r4, r5, [sp, #48] + LDRD r6, r7, [sp, #96] + LDRD r8, r9, [sp, #144] + LDRD r10, r11, [sp, #192] + /* s[1] <<< 44 */ + MOV lr, r4 + LSR r12, r5, #20 + LSR r4, r4, #20 + ORR r4, r4, r5, LSL #12 + ORR r5, r12, lr, LSL #12 + /* s[2] <<< 43 */ + MOV lr, r6 + LSR r12, r7, #21 + LSR r6, r6, #21 + ORR r6, r6, r7, LSL #11 + ORR r7, r12, lr, LSL #11 + /* s[3] <<< 21 */ + LSR r12, r9, #11 + LSR lr, r8, #11 + ORR r8, r12, r8, LSL #21 + ORR r9, lr, r9, LSL #21 + /* s[4] <<< 14 */ + LSR r12, r11, #18 + LSR lr, r10, #18 + ORR r10, r12, r10, LSL #14 + ORR r11, lr, r11, LSL #14 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [r0, #8] + STR lr, [r0, #12] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [r0, #16] + STR lr, [r0, #20] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [r0, #24] + STR lr, [r0, #28] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [r0, #32] + STR lr, [r0, #36] + /* Get constant */ + LDRD r10, r11, [r1] + ADD r1, r1, #0x8 + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + /* XOR in constant */ + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [r0] + STR lr, [r0, #4] + /* Row 1 */ + LDRD r2, r3, [sp, #24] + LDRD r4, r5, [sp, #72] + LDRD r6, r7, [sp, #80] + LDRD r8, r9, [sp, #128] + LDRD r10, r11, [sp, #176] + /* s[0] <<< 28 */ + LSR r12, r3, #4 + LSR lr, r2, #4 + ORR r2, r12, r2, LSL #28 + ORR r3, lr, r3, LSL #28 + /* s[1] <<< 20 */ + LSR r12, r5, #12 + LSR lr, r4, #12 + ORR r4, r12, r4, LSL #20 + ORR r5, lr, r5, LSL #20 + /* s[2] <<< 3 */ + LSR r12, r7, #29 + LSR lr, r6, #29 + ORR r6, r12, r6, LSL #3 + ORR r7, lr, r7, LSL #3 + /* s[3] <<< 45 */ + MOV lr, r8 + LSR r12, r9, #19 + LSR r8, r8, #19 + ORR r8, r8, r9, LSL #13 + ORR r9, r12, lr, LSL #13 + /* s[4] <<< 61 */ + MOV lr, r10 + LSR r12, r11, #3 + LSR r10, r10, #3 + ORR r10, r10, r11, LSL #29 + ORR r11, r12, lr, LSL #29 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [r0, #48] + STR lr, [r0, #52] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [r0, #56] + STR lr, [r0, #60] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [r0, #64] + STR lr, [r0, #68] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [r0, #72] + STR lr, [r0, #76] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [r0, #40] + STR lr, [r0, #44] + /* Row 2 */ + LDRD r2, r3, [sp, #8] + LDRD r4, r5, [sp, #56] + LDRD r6, r7, [sp, #104] + LDRD r8, r9, [sp, #152] + LDRD r10, r11, [sp, #160] + /* s[0] <<< 1 */ + LSR r12, r3, #31 + LSR lr, r2, #31 + ORR r2, r12, r2, LSL #1 + ORR r3, lr, r3, LSL #1 + /* s[1] <<< 6 */ + LSR r12, r5, #26 + LSR lr, r4, #26 + ORR r4, r12, r4, LSL #6 + ORR r5, lr, r5, LSL #6 + /* s[2] <<< 25 */ + LSR r12, r7, #7 + LSR lr, r6, #7 + ORR r6, r12, r6, LSL #25 + ORR r7, lr, r7, LSL #25 + /* s[3] <<< 8 */ + LSR r12, r9, #24 + LSR lr, r8, #24 + ORR r8, r12, r8, LSL #8 + ORR r9, lr, r9, LSL #8 + /* s[4] <<< 18 */ + LSR r12, r11, #14 + LSR lr, r10, #14 + ORR r10, r12, r10, LSL #18 + ORR r11, lr, r11, LSL #18 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [r0, #88] + STR lr, [r0, #92] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [r0, #96] + STR lr, [r0, #100] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [r0, #104] + STR lr, [r0, #108] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [r0, #112] + STR lr, [r0, #116] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [r0, #80] + STR lr, [r0, #84] + /* Row 3 */ + LDRD r2, r3, [sp, #32] + LDRD r4, r5, [sp, #40] + LDRD r6, r7, [sp, #88] + LDRD r8, r9, [sp, #136] + LDRD r10, r11, [sp, #184] + /* s[0] <<< 27 */ + LSR r12, r3, #5 + LSR lr, r2, #5 + ORR r2, r12, r2, LSL #27 + ORR r3, lr, r3, LSL #27 + /* s[1] <<< 36 */ + MOV lr, r4 + LSR r12, r5, #28 + LSR r4, r4, #28 + ORR r4, r4, r5, LSL #4 + ORR r5, r12, lr, LSL #4 + /* s[2] <<< 10 */ + LSR r12, r7, #22 + LSR lr, r6, #22 + ORR r6, r12, r6, LSL #10 + ORR r7, lr, r7, LSL #10 + /* s[3] <<< 15 */ + LSR r12, r9, #17 + LSR lr, r8, #17 + ORR r8, r12, r8, LSL #15 + ORR r9, lr, r9, LSL #15 + /* s[4] <<< 56 */ + MOV lr, r10 + LSR r12, r11, #8 + LSR r10, r10, #8 + ORR r10, r10, r11, LSL #24 + ORR r11, r12, lr, LSL #24 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [r0, #128] + STR lr, [r0, #132] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [r0, #136] + STR lr, [r0, #140] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [r0, #144] + STR lr, [r0, #148] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [r0, #152] + STR lr, [r0, #156] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [r0, #120] + STR lr, [r0, #124] + /* Row 4 */ + LDRD r2, r3, [sp, #16] + LDRD r4, r5, [sp, #64] + LDRD r6, r7, [sp, #112] + LDRD r8, r9, [sp, #120] + LDRD r10, r11, [sp, #168] + /* s[0] <<< 62 */ + MOV lr, r2 + LSR r12, r3, #2 + LSR r2, r2, #2 + ORR r2, r2, r3, LSL #30 + ORR r3, r12, lr, LSL #30 + /* s[1] <<< 55 */ + MOV lr, r4 + LSR r12, r5, #9 + LSR r4, r4, #9 + ORR r4, r4, r5, LSL #23 + ORR r5, r12, lr, LSL #23 + /* s[2] <<< 39 */ + MOV lr, r6 + LSR r12, r7, #25 + LSR r6, r6, #25 + ORR r6, r6, r7, LSL #7 + ORR r7, r12, lr, LSL #7 + /* s[3] <<< 41 */ + MOV lr, r8 + LSR r12, r9, #23 + LSR r8, r8, #23 + ORR r8, r8, r9, LSL #9 + ORR r9, r12, lr, LSL #9 + /* s[4] <<< 2 */ + LSR r12, r11, #30 + LSR lr, r10, #30 + ORR r10, r12, r10, LSL #2 + ORR r11, lr, r11, LSL #2 + BIC r12, r8, r6 + BIC lr, r9, r7 + EOR r12, r12, r4 + EOR lr, lr, r5 + STR r12, [r0, #168] + STR lr, [r0, #172] + BIC r12, r10, r8 + BIC lr, r11, r9 + EOR r12, r12, r6 + EOR lr, lr, r7 + STR r12, [r0, #176] + STR lr, [r0, #180] + BIC r12, r2, r10 + BIC lr, r3, r11 + EOR r12, r12, r8 + EOR lr, lr, r9 + STR r12, [r0, #184] + STR lr, [r0, #188] + BIC r12, r4, r2 + BIC lr, r5, r3 + EOR r12, r12, r10 + EOR lr, lr, r11 + STR r12, [r0, #192] + STR lr, [r0, #196] + BIC r12, r6, r4 + BIC lr, r7, r5 + EOR r12, r12, r2 + EOR lr, lr, r3 + STR r12, [r0, #160] + STR lr, [r0, #164] + LDR r2, [sp, #200] + SUBS r2, r2, #0x1 +#ifdef __GNUC__ + BNE L_sha3_thumb2_begin +#else + BNE.W L_sha3_thumb2_begin +#endif + ADD sp, sp, #0xcc + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 1505 */ + .size BlockSha3,.-BlockSha3 +#endif /* WOLFSSL_SHA3 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1162 @@ +/* thumb2-sha3-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha3/sha3.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-sha3-asm.c + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +#ifdef WOLFSSL_SHA3 +static const uint64_t L_sha3_thumb2_rt[] = { + 0x0000000000000001UL, 0x0000000000008082UL, + 0x800000000000808aUL, 0x8000000080008000UL, + 0x000000000000808bUL, 0x0000000080000001UL, + 0x8000000080008081UL, 0x8000000000008009UL, + 0x000000000000008aUL, 0x0000000000000088UL, + 0x0000000080008009UL, 0x000000008000000aUL, + 0x000000008000808bUL, 0x800000000000008bUL, + 0x8000000000008089UL, 0x8000000000008003UL, + 0x8000000000008002UL, 0x8000000000000080UL, + 0x000000000000800aUL, 0x800000008000000aUL, + 0x8000000080008081UL, 0x8000000000008080UL, + 0x0000000080000001UL, 0x8000000080008008UL, +}; + +#include + +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void BlockSha3(word64* state_p) +#else +void BlockSha3(word64* state) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register word64* state __asm__ ("r0") = (word64*)state_p; + register uint64_t* L_sha3_thumb2_rt_c __asm__ ("r1") = (uint64_t*)&L_sha3_thumb2_rt; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0xcc\n\t" + "MOV r1, %[L_sha3_thumb2_rt]\n\t" + "MOV r2, #0xc\n\t" + "\n" + "L_sha3_thumb2_begin%=:\n\t" + "STR r2, [sp, #200]\n\t" + /* Round even */ + /* Calc b[4] */ + "LDRD r4, r5, [%[state], #32]\n\t" + "LDRD r6, r7, [%[state], #72]\n\t" + "LDRD r8, r9, [%[state], #112]\n\t" + "LDRD r10, r11, [%[state], #152]\n\t" + "LDR r12, [%[state], #192]\n\t" + "LDR lr, [%[state], #196]\n\t" + "EOR r2, r4, r6\n\t" + "EOR r3, r5, r7\n\t" + "EOR r2, r2, r8\n\t" + "EOR r3, r3, r9\n\t" + "EOR r2, r2, r10\n\t" + "EOR r3, r3, r11\n\t" + "EOR r2, r2, r12\n\t" + "EOR r3, r3, lr\n\t" + "STRD r2, r3, [sp, #32]\n\t" + /* Calc b[1] */ + "LDRD r4, r5, [%[state], #8]\n\t" + "LDRD r6, r7, [%[state], #48]\n\t" + "LDRD r8, r9, [%[state], #88]\n\t" + "LDRD r10, r11, [%[state], #128]\n\t" + "LDR r12, [%[state], #168]\n\t" + "LDR lr, [%[state], #172]\n\t" + "EOR r4, r4, r6\n\t" + "EOR r5, r5, r7\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "EOR r4, r4, r12\n\t" + "EOR r5, r5, lr\n\t" + "STRD r4, r5, [sp, #8]\n\t" + /* Calc t[0] */ + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* Calc b[0] and XOR t[0] into s[x*5+0] */ + "LDRD r4, r5, [%[state]]\n\t" + "LDRD r6, r7, [%[state], #40]\n\t" + "LDRD r8, r9, [%[state], #80]\n\t" + "LDRD r10, r11, [%[state], #120]\n\t" + "EOR r12, r4, r6\n\t" + "EOR lr, r5, r7\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r4, r5, [%[state]]\n\t" + "STRD r6, r7, [%[state], #40]\n\t" + "STRD r8, r9, [%[state], #80]\n\t" + "STRD r10, r11, [%[state], #120]\n\t" + "LDRD r10, r11, [%[state], #160]\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r10, r11, [%[state], #160]\n\t" + "STR r12, [sp]\n\t" + "STR lr, [sp, #4]\n\t" + /* Calc b[3] */ + "LDRD r4, r5, [%[state], #24]\n\t" + "LDRD r6, r7, [%[state], #64]\n\t" + "LDRD r8, r9, [%[state], #104]\n\t" + "LDRD r10, r11, [%[state], #144]\n\t" + "LDR r12, [%[state], #184]\n\t" + "LDR lr, [%[state], #188]\n\t" + "EOR r4, r4, r6\n\t" + "EOR r5, r5, r7\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "EOR r4, r4, r12\n\t" + "EOR r5, r5, lr\n\t" + "STRD r4, r5, [sp, #24]\n\t" + /* Calc t[2] */ + "LDRD r2, r3, [sp, #8]\n\t" + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* Calc b[2] and XOR t[2] into s[x*5+2] */ + "LDRD r4, r5, [%[state], #16]\n\t" + "LDRD r6, r7, [%[state], #56]\n\t" + "LDRD r8, r9, [%[state], #96]\n\t" + "LDRD r10, r11, [%[state], #136]\n\t" + "EOR r12, r4, r6\n\t" + "EOR lr, r5, r7\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r4, r5, [%[state], #16]\n\t" + "STRD r6, r7, [%[state], #56]\n\t" + "STRD r8, r9, [%[state], #96]\n\t" + "STRD r10, r11, [%[state], #136]\n\t" + "LDRD r10, r11, [%[state], #176]\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r10, r11, [%[state], #176]\n\t" + "STR r12, [sp, #16]\n\t" + "STR lr, [sp, #20]\n\t" + /* Calc t[1] */ + "LDRD r2, r3, [sp]\n\t" + "EOR r2, r2, lr, LSR #31\n\t" + "EOR r3, r3, r12, LSR #31\n\t" + "EOR r2, r2, r12, LSL #1\n\t" + "EOR r3, r3, lr, LSL #1\n\t" + /* XOR t[1] into s[x*5+1] */ + "LDRD r4, r5, [%[state], #8]\n\t" + "LDRD r6, r7, [%[state], #48]\n\t" + "LDRD r8, r9, [%[state], #88]\n\t" + "LDRD r10, r11, [%[state], #128]\n\t" + "LDR r12, [%[state], #168]\n\t" + "LDR lr, [%[state], #172]\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STRD r4, r5, [%[state], #8]\n\t" + "STRD r6, r7, [%[state], #48]\n\t" + "STRD r8, r9, [%[state], #88]\n\t" + "STRD r10, r11, [%[state], #128]\n\t" + "STR r12, [%[state], #168]\n\t" + "STR lr, [%[state], #172]\n\t" + /* Calc t[3] */ + "LDRD r2, r3, [sp, #16]\n\t" + "LDRD r4, r5, [sp, #32]\n\t" + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* XOR t[3] into s[x*5+3] */ + "LDRD r4, r5, [%[state], #24]\n\t" + "LDRD r6, r7, [%[state], #64]\n\t" + "LDRD r8, r9, [%[state], #104]\n\t" + "LDRD r10, r11, [%[state], #144]\n\t" + "LDR r12, [%[state], #184]\n\t" + "LDR lr, [%[state], #188]\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STRD r4, r5, [%[state], #24]\n\t" + "STRD r6, r7, [%[state], #64]\n\t" + "STRD r8, r9, [%[state], #104]\n\t" + "STRD r10, r11, [%[state], #144]\n\t" + "STR r12, [%[state], #184]\n\t" + "STR lr, [%[state], #188]\n\t" + /* Calc t[4] */ + "LDRD r2, r3, [sp, #24]\n\t" + "LDRD r4, r5, [sp]\n\t" + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* XOR t[4] into s[x*5+4] */ + "LDRD r4, r5, [%[state], #32]\n\t" + "LDRD r6, r7, [%[state], #72]\n\t" + "LDRD r8, r9, [%[state], #112]\n\t" + "LDRD r10, r11, [%[state], #152]\n\t" + "LDR r12, [%[state], #192]\n\t" + "LDR lr, [%[state], #196]\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STRD r4, r5, [%[state], #32]\n\t" + "STRD r6, r7, [%[state], #72]\n\t" + "STRD r8, r9, [%[state], #112]\n\t" + "STRD r10, r11, [%[state], #152]\n\t" + "STR r12, [%[state], #192]\n\t" + "STR lr, [%[state], #196]\n\t" + /* Row Mix */ + /* Row 0 */ + "LDRD r2, r3, [%[state]]\n\t" + "LDRD r4, r5, [%[state], #48]\n\t" + "LDRD r6, r7, [%[state], #96]\n\t" + "LDRD r8, r9, [%[state], #144]\n\t" + "LDRD r10, r11, [%[state], #192]\n\t" + /* s[1] <<< 44 */ + "MOV lr, r4\n\t" + "LSR r12, r5, #20\n\t" + "LSR r4, r4, #20\n\t" + "ORR r4, r4, r5, LSL #12\n\t" + "ORR r5, r12, lr, LSL #12\n\t" + /* s[2] <<< 43 */ + "MOV lr, r6\n\t" + "LSR r12, r7, #21\n\t" + "LSR r6, r6, #21\n\t" + "ORR r6, r6, r7, LSL #11\n\t" + "ORR r7, r12, lr, LSL #11\n\t" + /* s[3] <<< 21 */ + "LSR r12, r9, #11\n\t" + "LSR lr, r8, #11\n\t" + "ORR r8, r12, r8, LSL #21\n\t" + "ORR r9, lr, r9, LSL #21\n\t" + /* s[4] <<< 14 */ + "LSR r12, r11, #18\n\t" + "LSR lr, r10, #18\n\t" + "ORR r10, r12, r10, LSL #14\n\t" + "ORR r11, lr, r11, LSL #14\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [sp, #8]\n\t" + "STR lr, [sp, #12]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [sp, #16]\n\t" + "STR lr, [sp, #20]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [sp, #24]\n\t" + "STR lr, [sp, #28]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [sp, #32]\n\t" + "STR lr, [sp, #36]\n\t" + /* Get constant */ + "LDRD r10, r11, [r1]\n\t" + "ADD r1, r1, #0x8\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + /* XOR in constant */ + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [sp]\n\t" + "STR lr, [sp, #4]\n\t" + /* Row 1 */ + "LDRD r2, r3, [%[state], #24]\n\t" + "LDRD r4, r5, [%[state], #72]\n\t" + "LDRD r6, r7, [%[state], #80]\n\t" + "LDRD r8, r9, [%[state], #128]\n\t" + "LDRD r10, r11, [%[state], #176]\n\t" + /* s[0] <<< 28 */ + "LSR r12, r3, #4\n\t" + "LSR lr, r2, #4\n\t" + "ORR r2, r12, r2, LSL #28\n\t" + "ORR r3, lr, r3, LSL #28\n\t" + /* s[1] <<< 20 */ + "LSR r12, r5, #12\n\t" + "LSR lr, r4, #12\n\t" + "ORR r4, r12, r4, LSL #20\n\t" + "ORR r5, lr, r5, LSL #20\n\t" + /* s[2] <<< 3 */ + "LSR r12, r7, #29\n\t" + "LSR lr, r6, #29\n\t" + "ORR r6, r12, r6, LSL #3\n\t" + "ORR r7, lr, r7, LSL #3\n\t" + /* s[3] <<< 45 */ + "MOV lr, r8\n\t" + "LSR r12, r9, #19\n\t" + "LSR r8, r8, #19\n\t" + "ORR r8, r8, r9, LSL #13\n\t" + "ORR r9, r12, lr, LSL #13\n\t" + /* s[4] <<< 61 */ + "MOV lr, r10\n\t" + "LSR r12, r11, #3\n\t" + "LSR r10, r10, #3\n\t" + "ORR r10, r10, r11, LSL #29\n\t" + "ORR r11, r12, lr, LSL #29\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [sp, #48]\n\t" + "STR lr, [sp, #52]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [sp, #56]\n\t" + "STR lr, [sp, #60]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [sp, #64]\n\t" + "STR lr, [sp, #68]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [sp, #72]\n\t" + "STR lr, [sp, #76]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [sp, #40]\n\t" + "STR lr, [sp, #44]\n\t" + /* Row 2 */ + "LDRD r2, r3, [%[state], #8]\n\t" + "LDRD r4, r5, [%[state], #56]\n\t" + "LDRD r6, r7, [%[state], #104]\n\t" + "LDRD r8, r9, [%[state], #152]\n\t" + "LDRD r10, r11, [%[state], #160]\n\t" + /* s[0] <<< 1 */ + "LSR r12, r3, #31\n\t" + "LSR lr, r2, #31\n\t" + "ORR r2, r12, r2, LSL #1\n\t" + "ORR r3, lr, r3, LSL #1\n\t" + /* s[1] <<< 6 */ + "LSR r12, r5, #26\n\t" + "LSR lr, r4, #26\n\t" + "ORR r4, r12, r4, LSL #6\n\t" + "ORR r5, lr, r5, LSL #6\n\t" + /* s[2] <<< 25 */ + "LSR r12, r7, #7\n\t" + "LSR lr, r6, #7\n\t" + "ORR r6, r12, r6, LSL #25\n\t" + "ORR r7, lr, r7, LSL #25\n\t" + /* s[3] <<< 8 */ + "LSR r12, r9, #24\n\t" + "LSR lr, r8, #24\n\t" + "ORR r8, r12, r8, LSL #8\n\t" + "ORR r9, lr, r9, LSL #8\n\t" + /* s[4] <<< 18 */ + "LSR r12, r11, #14\n\t" + "LSR lr, r10, #14\n\t" + "ORR r10, r12, r10, LSL #18\n\t" + "ORR r11, lr, r11, LSL #18\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [sp, #88]\n\t" + "STR lr, [sp, #92]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [sp, #96]\n\t" + "STR lr, [sp, #100]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [sp, #104]\n\t" + "STR lr, [sp, #108]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [sp, #112]\n\t" + "STR lr, [sp, #116]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [sp, #80]\n\t" + "STR lr, [sp, #84]\n\t" + /* Row 3 */ + "LDRD r2, r3, [%[state], #32]\n\t" + "LDRD r4, r5, [%[state], #40]\n\t" + "LDRD r6, r7, [%[state], #88]\n\t" + "LDRD r8, r9, [%[state], #136]\n\t" + "LDRD r10, r11, [%[state], #184]\n\t" + /* s[0] <<< 27 */ + "LSR r12, r3, #5\n\t" + "LSR lr, r2, #5\n\t" + "ORR r2, r12, r2, LSL #27\n\t" + "ORR r3, lr, r3, LSL #27\n\t" + /* s[1] <<< 36 */ + "MOV lr, r4\n\t" + "LSR r12, r5, #28\n\t" + "LSR r4, r4, #28\n\t" + "ORR r4, r4, r5, LSL #4\n\t" + "ORR r5, r12, lr, LSL #4\n\t" + /* s[2] <<< 10 */ + "LSR r12, r7, #22\n\t" + "LSR lr, r6, #22\n\t" + "ORR r6, r12, r6, LSL #10\n\t" + "ORR r7, lr, r7, LSL #10\n\t" + /* s[3] <<< 15 */ + "LSR r12, r9, #17\n\t" + "LSR lr, r8, #17\n\t" + "ORR r8, r12, r8, LSL #15\n\t" + "ORR r9, lr, r9, LSL #15\n\t" + /* s[4] <<< 56 */ + "MOV lr, r10\n\t" + "LSR r12, r11, #8\n\t" + "LSR r10, r10, #8\n\t" + "ORR r10, r10, r11, LSL #24\n\t" + "ORR r11, r12, lr, LSL #24\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [sp, #128]\n\t" + "STR lr, [sp, #132]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [sp, #136]\n\t" + "STR lr, [sp, #140]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [sp, #144]\n\t" + "STR lr, [sp, #148]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [sp, #152]\n\t" + "STR lr, [sp, #156]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [sp, #120]\n\t" + "STR lr, [sp, #124]\n\t" + /* Row 4 */ + "LDRD r2, r3, [%[state], #16]\n\t" + "LDRD r4, r5, [%[state], #64]\n\t" + "LDRD r6, r7, [%[state], #112]\n\t" + "LDRD r8, r9, [%[state], #120]\n\t" + "LDRD r10, r11, [%[state], #168]\n\t" + /* s[0] <<< 62 */ + "MOV lr, r2\n\t" + "LSR r12, r3, #2\n\t" + "LSR r2, r2, #2\n\t" + "ORR r2, r2, r3, LSL #30\n\t" + "ORR r3, r12, lr, LSL #30\n\t" + /* s[1] <<< 55 */ + "MOV lr, r4\n\t" + "LSR r12, r5, #9\n\t" + "LSR r4, r4, #9\n\t" + "ORR r4, r4, r5, LSL #23\n\t" + "ORR r5, r12, lr, LSL #23\n\t" + /* s[2] <<< 39 */ + "MOV lr, r6\n\t" + "LSR r12, r7, #25\n\t" + "LSR r6, r6, #25\n\t" + "ORR r6, r6, r7, LSL #7\n\t" + "ORR r7, r12, lr, LSL #7\n\t" + /* s[3] <<< 41 */ + "MOV lr, r8\n\t" + "LSR r12, r9, #23\n\t" + "LSR r8, r8, #23\n\t" + "ORR r8, r8, r9, LSL #9\n\t" + "ORR r9, r12, lr, LSL #9\n\t" + /* s[4] <<< 2 */ + "LSR r12, r11, #30\n\t" + "LSR lr, r10, #30\n\t" + "ORR r10, r12, r10, LSL #2\n\t" + "ORR r11, lr, r11, LSL #2\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [sp, #168]\n\t" + "STR lr, [sp, #172]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [sp, #176]\n\t" + "STR lr, [sp, #180]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [sp, #184]\n\t" + "STR lr, [sp, #188]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [sp, #192]\n\t" + "STR lr, [sp, #196]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [sp, #160]\n\t" + "STR lr, [sp, #164]\n\t" + /* Round odd */ + /* Calc b[4] */ + "LDRD r4, r5, [sp, #32]\n\t" + "LDRD r6, r7, [sp, #72]\n\t" + "LDRD r8, r9, [sp, #112]\n\t" + "LDRD r10, r11, [sp, #152]\n\t" + "LDR r12, [sp, #192]\n\t" + "LDR lr, [sp, #196]\n\t" + "EOR r2, r4, r6\n\t" + "EOR r3, r5, r7\n\t" + "EOR r2, r2, r8\n\t" + "EOR r3, r3, r9\n\t" + "EOR r2, r2, r10\n\t" + "EOR r3, r3, r11\n\t" + "EOR r2, r2, r12\n\t" + "EOR r3, r3, lr\n\t" + "STRD r2, r3, [%[state], #32]\n\t" + /* Calc b[1] */ + "LDRD r4, r5, [sp, #8]\n\t" + "LDRD r6, r7, [sp, #48]\n\t" + "LDRD r8, r9, [sp, #88]\n\t" + "LDRD r10, r11, [sp, #128]\n\t" + "LDR r12, [sp, #168]\n\t" + "LDR lr, [sp, #172]\n\t" + "EOR r4, r4, r6\n\t" + "EOR r5, r5, r7\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "EOR r4, r4, r12\n\t" + "EOR r5, r5, lr\n\t" + "STRD r4, r5, [%[state], #8]\n\t" + /* Calc t[0] */ + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* Calc b[0] and XOR t[0] into s[x*5+0] */ + "LDRD r4, r5, [sp]\n\t" + "LDRD r6, r7, [sp, #40]\n\t" + "LDRD r8, r9, [sp, #80]\n\t" + "LDRD r10, r11, [sp, #120]\n\t" + "EOR r12, r4, r6\n\t" + "EOR lr, r5, r7\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r4, r5, [sp]\n\t" + "STRD r6, r7, [sp, #40]\n\t" + "STRD r8, r9, [sp, #80]\n\t" + "STRD r10, r11, [sp, #120]\n\t" + "LDRD r10, r11, [sp, #160]\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r10, r11, [sp, #160]\n\t" + "STR r12, [%[state]]\n\t" + "STR lr, [%[state], #4]\n\t" + /* Calc b[3] */ + "LDRD r4, r5, [sp, #24]\n\t" + "LDRD r6, r7, [sp, #64]\n\t" + "LDRD r8, r9, [sp, #104]\n\t" + "LDRD r10, r11, [sp, #144]\n\t" + "LDR r12, [sp, #184]\n\t" + "LDR lr, [sp, #188]\n\t" + "EOR r4, r4, r6\n\t" + "EOR r5, r5, r7\n\t" + "EOR r4, r4, r8\n\t" + "EOR r5, r5, r9\n\t" + "EOR r4, r4, r10\n\t" + "EOR r5, r5, r11\n\t" + "EOR r4, r4, r12\n\t" + "EOR r5, r5, lr\n\t" + "STRD r4, r5, [%[state], #24]\n\t" + /* Calc t[2] */ + "LDRD r2, r3, [%[state], #8]\n\t" + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* Calc b[2] and XOR t[2] into s[x*5+2] */ + "LDRD r4, r5, [sp, #16]\n\t" + "LDRD r6, r7, [sp, #56]\n\t" + "LDRD r8, r9, [sp, #96]\n\t" + "LDRD r10, r11, [sp, #136]\n\t" + "EOR r12, r4, r6\n\t" + "EOR lr, r5, r7\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r4, r5, [sp, #16]\n\t" + "STRD r6, r7, [sp, #56]\n\t" + "STRD r8, r9, [sp, #96]\n\t" + "STRD r10, r11, [sp, #136]\n\t" + "LDRD r10, r11, [sp, #176]\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "STRD r10, r11, [sp, #176]\n\t" + "STR r12, [%[state], #16]\n\t" + "STR lr, [%[state], #20]\n\t" + /* Calc t[1] */ + "LDRD r2, r3, [%[state]]\n\t" + "EOR r2, r2, lr, LSR #31\n\t" + "EOR r3, r3, r12, LSR #31\n\t" + "EOR r2, r2, r12, LSL #1\n\t" + "EOR r3, r3, lr, LSL #1\n\t" + /* XOR t[1] into s[x*5+1] */ + "LDRD r4, r5, [sp, #8]\n\t" + "LDRD r6, r7, [sp, #48]\n\t" + "LDRD r8, r9, [sp, #88]\n\t" + "LDRD r10, r11, [sp, #128]\n\t" + "LDR r12, [sp, #168]\n\t" + "LDR lr, [sp, #172]\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STRD r4, r5, [sp, #8]\n\t" + "STRD r6, r7, [sp, #48]\n\t" + "STRD r8, r9, [sp, #88]\n\t" + "STRD r10, r11, [sp, #128]\n\t" + "STR r12, [sp, #168]\n\t" + "STR lr, [sp, #172]\n\t" + /* Calc t[3] */ + "LDRD r2, r3, [%[state], #16]\n\t" + "LDRD r4, r5, [%[state], #32]\n\t" + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* XOR t[3] into s[x*5+3] */ + "LDRD r4, r5, [sp, #24]\n\t" + "LDRD r6, r7, [sp, #64]\n\t" + "LDRD r8, r9, [sp, #104]\n\t" + "LDRD r10, r11, [sp, #144]\n\t" + "LDR r12, [sp, #184]\n\t" + "LDR lr, [sp, #188]\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STRD r4, r5, [sp, #24]\n\t" + "STRD r6, r7, [sp, #64]\n\t" + "STRD r8, r9, [sp, #104]\n\t" + "STRD r10, r11, [sp, #144]\n\t" + "STR r12, [sp, #184]\n\t" + "STR lr, [sp, #188]\n\t" + /* Calc t[4] */ + "LDRD r2, r3, [%[state], #24]\n\t" + "LDRD r4, r5, [%[state]]\n\t" + "EOR r2, r2, r5, LSR #31\n\t" + "EOR r3, r3, r4, LSR #31\n\t" + "EOR r2, r2, r4, LSL #1\n\t" + "EOR r3, r3, r5, LSL #1\n\t" + /* XOR t[4] into s[x*5+4] */ + "LDRD r4, r5, [sp, #32]\n\t" + "LDRD r6, r7, [sp, #72]\n\t" + "LDRD r8, r9, [sp, #112]\n\t" + "LDRD r10, r11, [sp, #152]\n\t" + "LDR r12, [sp, #192]\n\t" + "LDR lr, [sp, #196]\n\t" + "EOR r4, r4, r2\n\t" + "EOR r5, r5, r3\n\t" + "EOR r6, r6, r2\n\t" + "EOR r7, r7, r3\n\t" + "EOR r8, r8, r2\n\t" + "EOR r9, r9, r3\n\t" + "EOR r10, r10, r2\n\t" + "EOR r11, r11, r3\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STRD r4, r5, [sp, #32]\n\t" + "STRD r6, r7, [sp, #72]\n\t" + "STRD r8, r9, [sp, #112]\n\t" + "STRD r10, r11, [sp, #152]\n\t" + "STR r12, [sp, #192]\n\t" + "STR lr, [sp, #196]\n\t" + /* Row Mix */ + /* Row 0 */ + "LDRD r2, r3, [sp]\n\t" + "LDRD r4, r5, [sp, #48]\n\t" + "LDRD r6, r7, [sp, #96]\n\t" + "LDRD r8, r9, [sp, #144]\n\t" + "LDRD r10, r11, [sp, #192]\n\t" + /* s[1] <<< 44 */ + "MOV lr, r4\n\t" + "LSR r12, r5, #20\n\t" + "LSR r4, r4, #20\n\t" + "ORR r4, r4, r5, LSL #12\n\t" + "ORR r5, r12, lr, LSL #12\n\t" + /* s[2] <<< 43 */ + "MOV lr, r6\n\t" + "LSR r12, r7, #21\n\t" + "LSR r6, r6, #21\n\t" + "ORR r6, r6, r7, LSL #11\n\t" + "ORR r7, r12, lr, LSL #11\n\t" + /* s[3] <<< 21 */ + "LSR r12, r9, #11\n\t" + "LSR lr, r8, #11\n\t" + "ORR r8, r12, r8, LSL #21\n\t" + "ORR r9, lr, r9, LSL #21\n\t" + /* s[4] <<< 14 */ + "LSR r12, r11, #18\n\t" + "LSR lr, r10, #18\n\t" + "ORR r10, r12, r10, LSL #14\n\t" + "ORR r11, lr, r11, LSL #14\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [%[state], #8]\n\t" + "STR lr, [%[state], #12]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [%[state], #16]\n\t" + "STR lr, [%[state], #20]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [%[state], #24]\n\t" + "STR lr, [%[state], #28]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [%[state], #32]\n\t" + "STR lr, [%[state], #36]\n\t" + /* Get constant */ + "LDRD r10, r11, [r1]\n\t" + "ADD r1, r1, #0x8\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + /* XOR in constant */ + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [%[state]]\n\t" + "STR lr, [%[state], #4]\n\t" + /* Row 1 */ + "LDRD r2, r3, [sp, #24]\n\t" + "LDRD r4, r5, [sp, #72]\n\t" + "LDRD r6, r7, [sp, #80]\n\t" + "LDRD r8, r9, [sp, #128]\n\t" + "LDRD r10, r11, [sp, #176]\n\t" + /* s[0] <<< 28 */ + "LSR r12, r3, #4\n\t" + "LSR lr, r2, #4\n\t" + "ORR r2, r12, r2, LSL #28\n\t" + "ORR r3, lr, r3, LSL #28\n\t" + /* s[1] <<< 20 */ + "LSR r12, r5, #12\n\t" + "LSR lr, r4, #12\n\t" + "ORR r4, r12, r4, LSL #20\n\t" + "ORR r5, lr, r5, LSL #20\n\t" + /* s[2] <<< 3 */ + "LSR r12, r7, #29\n\t" + "LSR lr, r6, #29\n\t" + "ORR r6, r12, r6, LSL #3\n\t" + "ORR r7, lr, r7, LSL #3\n\t" + /* s[3] <<< 45 */ + "MOV lr, r8\n\t" + "LSR r12, r9, #19\n\t" + "LSR r8, r8, #19\n\t" + "ORR r8, r8, r9, LSL #13\n\t" + "ORR r9, r12, lr, LSL #13\n\t" + /* s[4] <<< 61 */ + "MOV lr, r10\n\t" + "LSR r12, r11, #3\n\t" + "LSR r10, r10, #3\n\t" + "ORR r10, r10, r11, LSL #29\n\t" + "ORR r11, r12, lr, LSL #29\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [%[state], #48]\n\t" + "STR lr, [%[state], #52]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [%[state], #56]\n\t" + "STR lr, [%[state], #60]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [%[state], #64]\n\t" + "STR lr, [%[state], #68]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [%[state], #72]\n\t" + "STR lr, [%[state], #76]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [%[state], #40]\n\t" + "STR lr, [%[state], #44]\n\t" + /* Row 2 */ + "LDRD r2, r3, [sp, #8]\n\t" + "LDRD r4, r5, [sp, #56]\n\t" + "LDRD r6, r7, [sp, #104]\n\t" + "LDRD r8, r9, [sp, #152]\n\t" + "LDRD r10, r11, [sp, #160]\n\t" + /* s[0] <<< 1 */ + "LSR r12, r3, #31\n\t" + "LSR lr, r2, #31\n\t" + "ORR r2, r12, r2, LSL #1\n\t" + "ORR r3, lr, r3, LSL #1\n\t" + /* s[1] <<< 6 */ + "LSR r12, r5, #26\n\t" + "LSR lr, r4, #26\n\t" + "ORR r4, r12, r4, LSL #6\n\t" + "ORR r5, lr, r5, LSL #6\n\t" + /* s[2] <<< 25 */ + "LSR r12, r7, #7\n\t" + "LSR lr, r6, #7\n\t" + "ORR r6, r12, r6, LSL #25\n\t" + "ORR r7, lr, r7, LSL #25\n\t" + /* s[3] <<< 8 */ + "LSR r12, r9, #24\n\t" + "LSR lr, r8, #24\n\t" + "ORR r8, r12, r8, LSL #8\n\t" + "ORR r9, lr, r9, LSL #8\n\t" + /* s[4] <<< 18 */ + "LSR r12, r11, #14\n\t" + "LSR lr, r10, #14\n\t" + "ORR r10, r12, r10, LSL #18\n\t" + "ORR r11, lr, r11, LSL #18\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [%[state], #88]\n\t" + "STR lr, [%[state], #92]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [%[state], #96]\n\t" + "STR lr, [%[state], #100]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [%[state], #104]\n\t" + "STR lr, [%[state], #108]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [%[state], #112]\n\t" + "STR lr, [%[state], #116]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [%[state], #80]\n\t" + "STR lr, [%[state], #84]\n\t" + /* Row 3 */ + "LDRD r2, r3, [sp, #32]\n\t" + "LDRD r4, r5, [sp, #40]\n\t" + "LDRD r6, r7, [sp, #88]\n\t" + "LDRD r8, r9, [sp, #136]\n\t" + "LDRD r10, r11, [sp, #184]\n\t" + /* s[0] <<< 27 */ + "LSR r12, r3, #5\n\t" + "LSR lr, r2, #5\n\t" + "ORR r2, r12, r2, LSL #27\n\t" + "ORR r3, lr, r3, LSL #27\n\t" + /* s[1] <<< 36 */ + "MOV lr, r4\n\t" + "LSR r12, r5, #28\n\t" + "LSR r4, r4, #28\n\t" + "ORR r4, r4, r5, LSL #4\n\t" + "ORR r5, r12, lr, LSL #4\n\t" + /* s[2] <<< 10 */ + "LSR r12, r7, #22\n\t" + "LSR lr, r6, #22\n\t" + "ORR r6, r12, r6, LSL #10\n\t" + "ORR r7, lr, r7, LSL #10\n\t" + /* s[3] <<< 15 */ + "LSR r12, r9, #17\n\t" + "LSR lr, r8, #17\n\t" + "ORR r8, r12, r8, LSL #15\n\t" + "ORR r9, lr, r9, LSL #15\n\t" + /* s[4] <<< 56 */ + "MOV lr, r10\n\t" + "LSR r12, r11, #8\n\t" + "LSR r10, r10, #8\n\t" + "ORR r10, r10, r11, LSL #24\n\t" + "ORR r11, r12, lr, LSL #24\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [%[state], #128]\n\t" + "STR lr, [%[state], #132]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [%[state], #136]\n\t" + "STR lr, [%[state], #140]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [%[state], #144]\n\t" + "STR lr, [%[state], #148]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [%[state], #152]\n\t" + "STR lr, [%[state], #156]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [%[state], #120]\n\t" + "STR lr, [%[state], #124]\n\t" + /* Row 4 */ + "LDRD r2, r3, [sp, #16]\n\t" + "LDRD r4, r5, [sp, #64]\n\t" + "LDRD r6, r7, [sp, #112]\n\t" + "LDRD r8, r9, [sp, #120]\n\t" + "LDRD r10, r11, [sp, #168]\n\t" + /* s[0] <<< 62 */ + "MOV lr, r2\n\t" + "LSR r12, r3, #2\n\t" + "LSR r2, r2, #2\n\t" + "ORR r2, r2, r3, LSL #30\n\t" + "ORR r3, r12, lr, LSL #30\n\t" + /* s[1] <<< 55 */ + "MOV lr, r4\n\t" + "LSR r12, r5, #9\n\t" + "LSR r4, r4, #9\n\t" + "ORR r4, r4, r5, LSL #23\n\t" + "ORR r5, r12, lr, LSL #23\n\t" + /* s[2] <<< 39 */ + "MOV lr, r6\n\t" + "LSR r12, r7, #25\n\t" + "LSR r6, r6, #25\n\t" + "ORR r6, r6, r7, LSL #7\n\t" + "ORR r7, r12, lr, LSL #7\n\t" + /* s[3] <<< 41 */ + "MOV lr, r8\n\t" + "LSR r12, r9, #23\n\t" + "LSR r8, r8, #23\n\t" + "ORR r8, r8, r9, LSL #9\n\t" + "ORR r9, r12, lr, LSL #9\n\t" + /* s[4] <<< 2 */ + "LSR r12, r11, #30\n\t" + "LSR lr, r10, #30\n\t" + "ORR r10, r12, r10, LSL #2\n\t" + "ORR r11, lr, r11, LSL #2\n\t" + "BIC r12, r8, r6\n\t" + "BIC lr, r9, r7\n\t" + "EOR r12, r12, r4\n\t" + "EOR lr, lr, r5\n\t" + "STR r12, [%[state], #168]\n\t" + "STR lr, [%[state], #172]\n\t" + "BIC r12, r10, r8\n\t" + "BIC lr, r11, r9\n\t" + "EOR r12, r12, r6\n\t" + "EOR lr, lr, r7\n\t" + "STR r12, [%[state], #176]\n\t" + "STR lr, [%[state], #180]\n\t" + "BIC r12, r2, r10\n\t" + "BIC lr, r3, r11\n\t" + "EOR r12, r12, r8\n\t" + "EOR lr, lr, r9\n\t" + "STR r12, [%[state], #184]\n\t" + "STR lr, [%[state], #188]\n\t" + "BIC r12, r4, r2\n\t" + "BIC lr, r5, r3\n\t" + "EOR r12, r12, r10\n\t" + "EOR lr, lr, r11\n\t" + "STR r12, [%[state], #192]\n\t" + "STR lr, [%[state], #196]\n\t" + "BIC r12, r6, r4\n\t" + "BIC lr, r7, r5\n\t" + "EOR r12, r12, r2\n\t" + "EOR lr, lr, r3\n\t" + "STR r12, [%[state], #160]\n\t" + "STR lr, [%[state], #164]\n\t" + "LDR r2, [sp, #200]\n\t" + "SUBS r2, r2, #0x1\n\t" +#ifdef __GNUC__ + "BNE L_sha3_thumb2_begin%=\n\t" +#else + "BNE.W L_sha3_thumb2_begin%=\n\t" +#endif + "ADD sp, sp, #0xcc\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [state] "+r" (state), + [L_sha3_thumb2_rt] "+r" (L_sha3_thumb2_rt_c) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" +#else + : [state] "+r" (state) + : [L_sha3_thumb2_rt] "r" (L_sha3_thumb2_rt) + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +} + +#endif /* WOLFSSL_SHA3 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3677 @@ +/* thumb2-sha512-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha512.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm.S + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifndef WOLFSSL_ARMASM_INLINE + .thumb + .syntax unified +#ifdef WOLFSSL_SHA512 +#ifdef WOLFSSL_ARMASM_NO_NEON + .text + .type L_SHA512_transform_len_k, %object + .size L_SHA512_transform_len_k, 640 + .align 8 +L_SHA512_transform_len_k: + .word 0xd728ae22 + .word 0x428a2f98 + .word 0x23ef65cd + .word 0x71374491 + .word 0xec4d3b2f + .word 0xb5c0fbcf + .word 0x8189dbbc + .word 0xe9b5dba5 + .word 0xf348b538 + .word 0x3956c25b + .word 0xb605d019 + .word 0x59f111f1 + .word 0xaf194f9b + .word 0x923f82a4 + .word 0xda6d8118 + .word 0xab1c5ed5 + .word 0xa3030242 + .word 0xd807aa98 + .word 0x45706fbe + .word 0x12835b01 + .word 0x4ee4b28c + .word 0x243185be + .word 0xd5ffb4e2 + .word 0x550c7dc3 + .word 0xf27b896f + .word 0x72be5d74 + .word 0x3b1696b1 + .word 0x80deb1fe + .word 0x25c71235 + .word 0x9bdc06a7 + .word 0xcf692694 + .word 0xc19bf174 + .word 0x9ef14ad2 + .word 0xe49b69c1 + .word 0x384f25e3 + .word 0xefbe4786 + .word 0x8b8cd5b5 + .word 0xfc19dc6 + .word 0x77ac9c65 + .word 0x240ca1cc + .word 0x592b0275 + .word 0x2de92c6f + .word 0x6ea6e483 + .word 0x4a7484aa + .word 0xbd41fbd4 + .word 0x5cb0a9dc + .word 0x831153b5 + .word 0x76f988da + .word 0xee66dfab + .word 0x983e5152 + .word 0x2db43210 + .word 0xa831c66d + .word 0x98fb213f + .word 0xb00327c8 + .word 0xbeef0ee4 + .word 0xbf597fc7 + .word 0x3da88fc2 + .word 0xc6e00bf3 + .word 0x930aa725 + .word 0xd5a79147 + .word 0xe003826f + .word 0x6ca6351 + .word 0xa0e6e70 + .word 0x14292967 + .word 0x46d22ffc + .word 0x27b70a85 + .word 0x5c26c926 + .word 0x2e1b2138 + .word 0x5ac42aed + .word 0x4d2c6dfc + .word 0x9d95b3df + .word 0x53380d13 + .word 0x8baf63de + .word 0x650a7354 + .word 0x3c77b2a8 + .word 0x766a0abb + .word 0x47edaee6 + .word 0x81c2c92e + .word 0x1482353b + .word 0x92722c85 + .word 0x4cf10364 + .word 0xa2bfe8a1 + .word 0xbc423001 + .word 0xa81a664b + .word 0xd0f89791 + .word 0xc24b8b70 + .word 0x654be30 + .word 0xc76c51a3 + .word 0xd6ef5218 + .word 0xd192e819 + .word 0x5565a910 + .word 0xd6990624 + .word 0x5771202a + .word 0xf40e3585 + .word 0x32bbd1b8 + .word 0x106aa070 + .word 0xb8d2d0c8 + .word 0x19a4c116 + .word 0x5141ab53 + .word 0x1e376c08 + .word 0xdf8eeb99 + .word 0x2748774c + .word 0xe19b48a8 + .word 0x34b0bcb5 + .word 0xc5c95a63 + .word 0x391c0cb3 + .word 0xe3418acb + .word 0x4ed8aa4a + .word 0x7763e373 + .word 0x5b9cca4f + .word 0xd6b2b8a3 + .word 0x682e6ff3 + .word 0x5defb2fc + .word 0x748f82ee + .word 0x43172f60 + .word 0x78a5636f + .word 0xa1f0ab72 + .word 0x84c87814 + .word 0x1a6439ec + .word 0x8cc70208 + .word 0x23631e28 + .word 0x90befffa + .word 0xde82bde9 + .word 0xa4506ceb + .word 0xb2c67915 + .word 0xbef9a3f7 + .word 0xe372532b + .word 0xc67178f2 + .word 0xea26619c + .word 0xca273ece + .word 0x21c0c207 + .word 0xd186b8c7 + .word 0xcde0eb1e + .word 0xeada7dd6 + .word 0xee6ed178 + .word 0xf57d4f7f + .word 0x72176fba + .word 0x6f067aa + .word 0xa2c898a6 + .word 0xa637dc5 + .word 0xbef90dae + .word 0x113f9804 + .word 0x131c471b + .word 0x1b710b35 + .word 0x23047d84 + .word 0x28db77f5 + .word 0x40c72493 + .word 0x32caab7b + .word 0x15c9bebc + .word 0x3c9ebe0a + .word 0x9c100d4c + .word 0x431d67c4 + .word 0xcb3e42b6 + .word 0x4cc5d4be + .word 0xfc657e2a + .word 0x597f299c + .word 0x3ad6faec + .word 0x5fcb6fab + .word 0x4a475817 + .word 0x6c44198c + .text + .align 4 + .globl Transform_Sha512_Len + .type Transform_Sha512_Len, %function +Transform_Sha512_Len: + PUSH {r4, r5, r6, r7, r8, r9, r10, r11, lr} + SUB sp, sp, #0xc0 + ADR r3, L_SHA512_transform_len_k + /* Copy digest to add in at end */ + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [r0, #16] + LDRD r10, r11, [r0, #24] + STRD r4, r5, [sp, #128] + STRD r6, r7, [sp, #136] + STRD r8, r9, [sp, #144] + STRD r10, r11, [sp, #152] + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #40] + LDRD r8, r9, [r0, #48] + LDRD r10, r11, [r0, #56] + STRD r4, r5, [sp, #160] + STRD r6, r7, [sp, #168] + STRD r8, r9, [sp, #176] + STRD r10, r11, [sp, #184] + /* Start of loop processing a block */ +L_SHA512_transform_len_begin: + /* Load, Reverse and Store W */ + LDR r4, [r1] + LDR r5, [r1, #4] + LDR r6, [r1, #8] + LDR r7, [r1, #12] + LDR r8, [r1, #16] + LDR r9, [r1, #20] + LDR r10, [r1, #24] + LDR r11, [r1, #28] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + REV r8, r8 + REV r9, r9 + REV r10, r10 + REV r11, r11 + STR r5, [sp] + STR r4, [sp, #4] + STR r7, [sp, #8] + STR r6, [sp, #12] + STR r9, [sp, #16] + STR r8, [sp, #20] + STR r11, [sp, #24] + STR r10, [sp, #28] + LDR r4, [r1, #32] + LDR r5, [r1, #36] + LDR r6, [r1, #40] + LDR r7, [r1, #44] + LDR r8, [r1, #48] + LDR r9, [r1, #52] + LDR r10, [r1, #56] + LDR r11, [r1, #60] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + REV r8, r8 + REV r9, r9 + REV r10, r10 + REV r11, r11 + STR r5, [sp, #32] + STR r4, [sp, #36] + STR r7, [sp, #40] + STR r6, [sp, #44] + STR r9, [sp, #48] + STR r8, [sp, #52] + STR r11, [sp, #56] + STR r10, [sp, #60] + LDR r4, [r1, #64] + LDR r5, [r1, #68] + LDR r6, [r1, #72] + LDR r7, [r1, #76] + LDR r8, [r1, #80] + LDR r9, [r1, #84] + LDR r10, [r1, #88] + LDR r11, [r1, #92] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + REV r8, r8 + REV r9, r9 + REV r10, r10 + REV r11, r11 + STR r5, [sp, #64] + STR r4, [sp, #68] + STR r7, [sp, #72] + STR r6, [sp, #76] + STR r9, [sp, #80] + STR r8, [sp, #84] + STR r11, [sp, #88] + STR r10, [sp, #92] + LDR r4, [r1, #96] + LDR r5, [r1, #100] + LDR r6, [r1, #104] + LDR r7, [r1, #108] + LDR r8, [r1, #112] + LDR r9, [r1, #116] + LDR r10, [r1, #120] + LDR r11, [r1, #124] + REV r4, r4 + REV r5, r5 + REV r6, r6 + REV r7, r7 + REV r8, r8 + REV r9, r9 + REV r10, r10 + REV r11, r11 + STR r5, [sp, #96] + STR r4, [sp, #100] + STR r7, [sp, #104] + STR r6, [sp, #108] + STR r9, [sp, #112] + STR r8, [sp, #116] + STR r11, [sp, #120] + STR r10, [sp, #124] + /* Pre-calc: b ^ c */ + LDRD r10, r11, [r0, #8] + LDRD r4, r5, [r0, #16] + EOR r10, r10, r4 + EOR r11, r11, r5 + MOV r12, #0x4 + /* Start of 16 rounds */ +L_SHA512_transform_len_start: + /* Round 0 */ + LDRD r4, r5, [r0, #32] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #40] + LDRD r8, r9, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #56] + LDRD r8, r9, [sp] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0] + STRD r8, r9, [r0, #24] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0] + LDRD r6, r7, [r0, #8] + STRD r4, r5, [r0, #56] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #56] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #56] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[0] */ + LDRD r4, r5, [sp, #112] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp] + LDRD r8, r9, [sp, #72] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp] + LDRD r4, r5, [sp, #8] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp] + /* Round 1 */ + LDRD r4, r5, [r0, #24] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + LDRD r4, r5, [r0, #24] + LDRD r6, r7, [r0, #32] + LDRD r8, r9, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #48] + LDRD r8, r9, [sp, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #8] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #56] + STRD r8, r9, [r0, #16] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #56] + LDRD r6, r7, [r0] + STRD r4, r5, [r0, #48] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #48] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #48] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[1] */ + LDRD r4, r5, [sp, #120] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #8] + LDRD r8, r9, [sp, #80] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #8] + LDRD r4, r5, [sp, #16] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #8] + /* Round 2 */ + LDRD r4, r5, [r0, #16] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + LDRD r4, r5, [r0, #16] + LDRD r6, r7, [r0, #24] + LDRD r8, r9, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #40] + LDRD r8, r9, [sp, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #16] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #48] + STRD r8, r9, [r0, #8] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #48] + LDRD r6, r7, [r0, #56] + STRD r4, r5, [r0, #40] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #40] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #40] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[2] */ + LDRD r4, r5, [sp] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #16] + LDRD r8, r9, [sp, #88] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #16] + LDRD r4, r5, [sp, #24] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #16] + /* Round 3 */ + LDRD r4, r5, [r0, #8] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + LDRD r4, r5, [r0, #8] + LDRD r6, r7, [r0, #16] + LDRD r8, r9, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #32] + LDRD r8, r9, [sp, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #24] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #40] + STRD r8, r9, [r0] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #40] + LDRD r6, r7, [r0, #48] + STRD r4, r5, [r0, #32] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #32] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #32] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[3] */ + LDRD r4, r5, [sp, #8] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #24] + LDRD r8, r9, [sp, #96] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #24] + LDRD r4, r5, [sp, #32] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #24] + /* Round 4 */ + LDRD r4, r5, [r0] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #24] + LDRD r8, r9, [sp, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #32] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #32] + STRD r8, r9, [r0, #56] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #32] + LDRD r6, r7, [r0, #40] + STRD r4, r5, [r0, #24] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #24] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #24] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[4] */ + LDRD r4, r5, [sp, #16] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #32] + LDRD r8, r9, [sp, #104] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #32] + LDRD r4, r5, [sp, #40] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #32] + /* Round 5 */ + LDRD r4, r5, [r0, #56] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + LDRD r4, r5, [r0, #56] + LDRD r6, r7, [r0] + LDRD r8, r9, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #16] + LDRD r8, r9, [sp, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #40] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #24] + STRD r8, r9, [r0, #48] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #24] + LDRD r6, r7, [r0, #32] + STRD r4, r5, [r0, #16] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #16] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #16] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[5] */ + LDRD r4, r5, [sp, #24] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #40] + LDRD r8, r9, [sp, #112] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #40] + LDRD r4, r5, [sp, #48] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #40] + /* Round 6 */ + LDRD r4, r5, [r0, #48] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + LDRD r4, r5, [r0, #48] + LDRD r6, r7, [r0, #56] + LDRD r8, r9, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #8] + LDRD r8, r9, [sp, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #48] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #16] + STRD r8, r9, [r0, #40] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #16] + LDRD r6, r7, [r0, #24] + STRD r4, r5, [r0, #8] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #8] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #8] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[6] */ + LDRD r4, r5, [sp, #32] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #48] + LDRD r8, r9, [sp, #120] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #48] + LDRD r4, r5, [sp, #56] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #48] + /* Round 7 */ + LDRD r4, r5, [r0, #40] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + LDRD r4, r5, [r0, #40] + LDRD r6, r7, [r0, #48] + LDRD r8, r9, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0] + LDRD r8, r9, [sp, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #56] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #8] + STRD r8, r9, [r0, #32] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #8] + LDRD r6, r7, [r0, #16] + STRD r4, r5, [r0] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[7] */ + LDRD r4, r5, [sp, #40] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #56] + LDRD r8, r9, [sp] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #56] + LDRD r4, r5, [sp, #64] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #56] + /* Round 8 */ + LDRD r4, r5, [r0, #32] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #40] + LDRD r8, r9, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #56] + LDRD r8, r9, [sp, #64] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #64] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0] + STRD r8, r9, [r0, #24] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0] + LDRD r6, r7, [r0, #8] + STRD r4, r5, [r0, #56] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #56] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #56] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[8] */ + LDRD r4, r5, [sp, #48] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #64] + LDRD r8, r9, [sp, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #64] + LDRD r4, r5, [sp, #72] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #64] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #64] + /* Round 9 */ + LDRD r4, r5, [r0, #24] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + LDRD r4, r5, [r0, #24] + LDRD r6, r7, [r0, #32] + LDRD r8, r9, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #48] + LDRD r8, r9, [sp, #72] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #72] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #56] + STRD r8, r9, [r0, #16] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #56] + LDRD r6, r7, [r0] + STRD r4, r5, [r0, #48] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #48] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #48] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[9] */ + LDRD r4, r5, [sp, #56] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #72] + LDRD r8, r9, [sp, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #72] + LDRD r4, r5, [sp, #80] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #72] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #72] + /* Round 10 */ + LDRD r4, r5, [r0, #16] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + LDRD r4, r5, [r0, #16] + LDRD r6, r7, [r0, #24] + LDRD r8, r9, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #40] + LDRD r8, r9, [sp, #80] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #80] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #48] + STRD r8, r9, [r0, #8] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #48] + LDRD r6, r7, [r0, #56] + STRD r4, r5, [r0, #40] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #40] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #40] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[10] */ + LDRD r4, r5, [sp, #64] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #80] + LDRD r8, r9, [sp, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #80] + LDRD r4, r5, [sp, #88] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #80] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #80] + /* Round 11 */ + LDRD r4, r5, [r0, #8] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + LDRD r4, r5, [r0, #8] + LDRD r6, r7, [r0, #16] + LDRD r8, r9, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #32] + LDRD r8, r9, [sp, #88] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #88] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #40] + STRD r8, r9, [r0] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #40] + LDRD r6, r7, [r0, #48] + STRD r4, r5, [r0, #32] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #32] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #32] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[11] */ + LDRD r4, r5, [sp, #72] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #88] + LDRD r8, r9, [sp, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #88] + LDRD r4, r5, [sp, #96] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #88] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #88] + /* Round 12 */ + LDRD r4, r5, [r0] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #24] + LDRD r8, r9, [sp, #96] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #96] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #32] + STRD r8, r9, [r0, #56] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #32] + LDRD r6, r7, [r0, #40] + STRD r4, r5, [r0, #24] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #24] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #24] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[12] */ + LDRD r4, r5, [sp, #80] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #96] + LDRD r8, r9, [sp, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #96] + LDRD r4, r5, [sp, #104] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #96] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #96] + /* Round 13 */ + LDRD r4, r5, [r0, #56] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + LDRD r4, r5, [r0, #56] + LDRD r6, r7, [r0] + LDRD r8, r9, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #16] + LDRD r8, r9, [sp, #104] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #104] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #24] + STRD r8, r9, [r0, #48] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #24] + LDRD r6, r7, [r0, #32] + STRD r4, r5, [r0, #16] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #16] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #16] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[13] */ + LDRD r4, r5, [sp, #88] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #104] + LDRD r8, r9, [sp, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #104] + LDRD r4, r5, [sp, #112] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #104] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #104] + /* Round 14 */ + LDRD r4, r5, [r0, #48] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + LDRD r4, r5, [r0, #48] + LDRD r6, r7, [r0, #56] + LDRD r8, r9, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #8] + LDRD r8, r9, [sp, #112] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #112] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #16] + STRD r8, r9, [r0, #40] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #16] + LDRD r6, r7, [r0, #24] + STRD r4, r5, [r0, #8] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #8] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #8] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[14] */ + LDRD r4, r5, [sp, #96] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #112] + LDRD r8, r9, [sp, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #112] + LDRD r4, r5, [sp, #120] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #112] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #112] + /* Round 15 */ + LDRD r4, r5, [r0, #40] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + LDRD r4, r5, [r0, #40] + LDRD r6, r7, [r0, #48] + LDRD r8, r9, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0] + LDRD r8, r9, [sp, #120] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #120] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #8] + STRD r8, r9, [r0, #32] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #8] + LDRD r6, r7, [r0, #16] + STRD r4, r5, [r0] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0] + MOV r10, r8 + MOV r11, r9 + /* Calc new W[15] */ + LDRD r4, r5, [sp, #104] + LSRS r6, r4, #19 + LSRS r7, r5, #19 + ORR r7, r7, r4, LSL #13 + ORR r6, r6, r5, LSL #13 + LSLS r8, r4, #3 + LSLS r9, r5, #3 + ORR r9, r9, r4, LSR #29 + ORR r8, r8, r5, LSR #29 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #6 + LSRS r9, r5, #6 + ORR r8, r8, r5, LSL #26 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #120] + LDRD r8, r9, [sp, #64] + ADDS r4, r4, r6 + ADC r5, r5, r7 + ADDS r4, r4, r8 + ADC r5, r5, r9 + STRD r4, r5, [sp, #120] + LDRD r4, r5, [sp] + LSRS r6, r4, #1 + LSRS r7, r5, #1 + ORR r7, r7, r4, LSL #31 + ORR r6, r6, r5, LSL #31 + LSRS r8, r4, #8 + LSRS r9, r5, #8 + ORR r9, r9, r4, LSL #24 + ORR r8, r8, r5, LSL #24 + EOR r7, r7, r9 + EOR r6, r6, r8 + LSRS r8, r4, #7 + LSRS r9, r5, #7 + ORR r8, r8, r5, LSL #25 + EOR r7, r7, r9 + EOR r6, r6, r8 + LDRD r4, r5, [sp, #120] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [sp, #120] + ADD r3, r3, #0x80 + SUBS r12, r12, #0x1 +#ifdef __GNUC__ + BNE L_SHA512_transform_len_start +#else + BNE.W L_SHA512_transform_len_start +#endif + /* Round 0 */ + LDRD r4, r5, [r0, #32] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #40] + LDRD r8, r9, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #56] + LDRD r8, r9, [sp] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0] + STRD r8, r9, [r0, #24] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0] + LDRD r6, r7, [r0, #8] + STRD r4, r5, [r0, #56] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #56] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #56] + MOV r10, r8 + MOV r11, r9 + /* Round 1 */ + LDRD r4, r5, [r0, #24] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + LDRD r4, r5, [r0, #24] + LDRD r6, r7, [r0, #32] + LDRD r8, r9, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #48] + LDRD r8, r9, [sp, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #8] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #56] + STRD r8, r9, [r0, #16] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #56] + LDRD r6, r7, [r0] + STRD r4, r5, [r0, #48] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #48] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #48] + MOV r10, r8 + MOV r11, r9 + /* Round 2 */ + LDRD r4, r5, [r0, #16] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + LDRD r4, r5, [r0, #16] + LDRD r6, r7, [r0, #24] + LDRD r8, r9, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #40] + LDRD r8, r9, [sp, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #16] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #48] + STRD r8, r9, [r0, #8] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #48] + LDRD r6, r7, [r0, #56] + STRD r4, r5, [r0, #40] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #40] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #40] + MOV r10, r8 + MOV r11, r9 + /* Round 3 */ + LDRD r4, r5, [r0, #8] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + LDRD r4, r5, [r0, #8] + LDRD r6, r7, [r0, #16] + LDRD r8, r9, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #32] + LDRD r8, r9, [sp, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #24] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #40] + STRD r8, r9, [r0] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #40] + LDRD r6, r7, [r0, #48] + STRD r4, r5, [r0, #32] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #32] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #32] + MOV r10, r8 + MOV r11, r9 + /* Round 4 */ + LDRD r4, r5, [r0] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #24] + LDRD r8, r9, [sp, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #32] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #32] + STRD r8, r9, [r0, #56] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #32] + LDRD r6, r7, [r0, #40] + STRD r4, r5, [r0, #24] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #24] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #24] + MOV r10, r8 + MOV r11, r9 + /* Round 5 */ + LDRD r4, r5, [r0, #56] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + LDRD r4, r5, [r0, #56] + LDRD r6, r7, [r0] + LDRD r8, r9, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #16] + LDRD r8, r9, [sp, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #40] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #24] + STRD r8, r9, [r0, #48] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #24] + LDRD r6, r7, [r0, #32] + STRD r4, r5, [r0, #16] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #16] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #16] + MOV r10, r8 + MOV r11, r9 + /* Round 6 */ + LDRD r4, r5, [r0, #48] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + LDRD r4, r5, [r0, #48] + LDRD r6, r7, [r0, #56] + LDRD r8, r9, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #8] + LDRD r8, r9, [sp, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #48] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #16] + STRD r8, r9, [r0, #40] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #16] + LDRD r6, r7, [r0, #24] + STRD r4, r5, [r0, #8] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #8] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #8] + MOV r10, r8 + MOV r11, r9 + /* Round 7 */ + LDRD r4, r5, [r0, #40] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + LDRD r4, r5, [r0, #40] + LDRD r6, r7, [r0, #48] + LDRD r8, r9, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0] + LDRD r8, r9, [sp, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #56] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #8] + STRD r8, r9, [r0, #32] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #8] + LDRD r6, r7, [r0, #16] + STRD r4, r5, [r0] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0] + MOV r10, r8 + MOV r11, r9 + /* Round 8 */ + LDRD r4, r5, [r0, #32] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #40] + LDRD r8, r9, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #56] + LDRD r8, r9, [sp, #64] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #64] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #24] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #56] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0] + STRD r8, r9, [r0, #24] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0] + LDRD r6, r7, [r0, #8] + STRD r4, r5, [r0, #56] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #56] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #56] + MOV r10, r8 + MOV r11, r9 + /* Round 9 */ + LDRD r4, r5, [r0, #24] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + LDRD r4, r5, [r0, #24] + LDRD r6, r7, [r0, #32] + LDRD r8, r9, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #48] + LDRD r8, r9, [sp, #72] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #72] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #16] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #48] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #56] + STRD r8, r9, [r0, #16] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #48] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #56] + LDRD r6, r7, [r0] + STRD r4, r5, [r0, #48] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #48] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #48] + MOV r10, r8 + MOV r11, r9 + /* Round 10 */ + LDRD r4, r5, [r0, #16] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + LDRD r4, r5, [r0, #16] + LDRD r6, r7, [r0, #24] + LDRD r8, r9, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #40] + LDRD r8, r9, [sp, #80] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #80] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #8] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #40] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #48] + STRD r8, r9, [r0, #8] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #40] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #48] + LDRD r6, r7, [r0, #56] + STRD r4, r5, [r0, #40] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #40] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #40] + MOV r10, r8 + MOV r11, r9 + /* Round 11 */ + LDRD r4, r5, [r0, #8] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + LDRD r4, r5, [r0, #8] + LDRD r6, r7, [r0, #16] + LDRD r8, r9, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #32] + LDRD r8, r9, [sp, #88] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #88] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #32] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #40] + STRD r8, r9, [r0] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #32] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #40] + LDRD r6, r7, [r0, #48] + STRD r4, r5, [r0, #32] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #32] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #32] + MOV r10, r8 + MOV r11, r9 + /* Round 12 */ + LDRD r4, r5, [r0] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #24] + LDRD r8, r9, [sp, #96] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #96] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #56] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #24] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #32] + STRD r8, r9, [r0, #56] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #24] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #32] + LDRD r6, r7, [r0, #40] + STRD r4, r5, [r0, #24] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #24] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #24] + MOV r10, r8 + MOV r11, r9 + /* Round 13 */ + LDRD r4, r5, [r0, #56] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + LDRD r4, r5, [r0, #56] + LDRD r6, r7, [r0] + LDRD r8, r9, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #16] + LDRD r8, r9, [sp, #104] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #104] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #48] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #16] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #24] + STRD r8, r9, [r0, #48] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #16] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #24] + LDRD r6, r7, [r0, #32] + STRD r4, r5, [r0, #16] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #16] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #16] + MOV r10, r8 + MOV r11, r9 + /* Round 14 */ + LDRD r4, r5, [r0, #48] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + LDRD r4, r5, [r0, #48] + LDRD r6, r7, [r0, #56] + LDRD r8, r9, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0, #8] + LDRD r8, r9, [sp, #112] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #112] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #40] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0, #8] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #16] + STRD r8, r9, [r0, #40] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0, #8] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #16] + LDRD r6, r7, [r0, #24] + STRD r4, r5, [r0, #8] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0, #8] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0, #8] + MOV r10, r8 + MOV r11, r9 + /* Round 15 */ + LDRD r4, r5, [r0, #40] + LSRS r6, r4, #14 + LSRS r7, r5, #14 + ORR r7, r7, r4, LSL #18 + ORR r6, r6, r5, LSL #18 + LSRS r8, r4, #18 + LSRS r9, r5, #18 + ORR r9, r9, r4, LSL #14 + ORR r8, r8, r5, LSL #14 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #23 + LSLS r9, r5, #23 + ORR r9, r9, r4, LSR #9 + ORR r8, r8, r5, LSR #9 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + LDRD r4, r5, [r0, #40] + LDRD r6, r7, [r0, #48] + LDRD r8, r9, [r0, #56] + EOR r6, r6, r8 + EOR r7, r7, r9 + AND r6, r6, r4 + AND r7, r7, r5 + EOR r6, r6, r8 + EOR r7, r7, r9 + LDRD r4, r5, [r0] + LDRD r8, r9, [sp, #120] + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r6, r7, [r3, #120] + ADDS r4, r4, r8 + ADC r5, r5, r9 + LDRD r8, r9, [r0, #32] + ADDS r4, r4, r6 + ADC r5, r5, r7 + STRD r4, r5, [r0] + ADDS r8, r8, r4 + ADC r9, r9, r5 + LDRD r4, r5, [r0, #8] + STRD r8, r9, [r0, #32] + LSRS r6, r4, #28 + LSRS r7, r5, #28 + ORR r7, r7, r4, LSL #4 + ORR r6, r6, r5, LSL #4 + LSLS r8, r4, #30 + LSLS r9, r5, #30 + ORR r9, r9, r4, LSR #2 + ORR r8, r8, r5, LSR #2 + EOR r6, r6, r8 + EOR r7, r7, r9 + LSLS r8, r4, #25 + LSLS r9, r5, #25 + ORR r9, r9, r4, LSR #7 + ORR r8, r8, r5, LSR #7 + LDRD r4, r5, [r0] + EOR r6, r6, r8 + EOR r7, r7, r9 + ADDS r4, r4, r6 + ADC r5, r5, r7 + LDRD r8, r9, [r0, #8] + LDRD r6, r7, [r0, #16] + STRD r4, r5, [r0] + EOR r8, r8, r6 + EOR r9, r9, r7 + AND r10, r10, r8 + AND r11, r11, r9 + EOR r10, r10, r6 + EOR r11, r11, r7 + LDRD r6, r7, [r0] + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r6, r7, [r0] + MOV r10, r8 + MOV r11, r9 + /* Add in digest from start */ + LDRD r4, r5, [r0] + LDRD r6, r7, [r0, #8] + LDRD r8, r9, [sp, #128] + LDRD r10, r11, [sp, #136] + ADDS r4, r4, r8 + ADC r5, r5, r9 + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r4, r5, [r0] + STRD r6, r7, [r0, #8] + STRD r4, r5, [sp, #128] + STRD r6, r7, [sp, #136] + LDRD r4, r5, [r0, #16] + LDRD r6, r7, [r0, #24] + LDRD r8, r9, [sp, #144] + LDRD r10, r11, [sp, #152] + ADDS r4, r4, r8 + ADC r5, r5, r9 + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r4, r5, [r0, #16] + STRD r6, r7, [r0, #24] + STRD r4, r5, [sp, #144] + STRD r6, r7, [sp, #152] + LDRD r4, r5, [r0, #32] + LDRD r6, r7, [r0, #40] + LDRD r8, r9, [sp, #160] + LDRD r10, r11, [sp, #168] + ADDS r4, r4, r8 + ADC r5, r5, r9 + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r4, r5, [r0, #32] + STRD r6, r7, [r0, #40] + STRD r4, r5, [sp, #160] + STRD r6, r7, [sp, #168] + LDRD r4, r5, [r0, #48] + LDRD r6, r7, [r0, #56] + LDRD r8, r9, [sp, #176] + LDRD r10, r11, [sp, #184] + ADDS r4, r4, r8 + ADC r5, r5, r9 + ADDS r6, r6, r10 + ADC r7, r7, r11 + STRD r4, r5, [r0, #48] + STRD r6, r7, [r0, #56] + STRD r4, r5, [sp, #176] + STRD r6, r7, [sp, #184] + SUBS r2, r2, #0x80 + SUB r3, r3, #0x200 + ADD r1, r1, #0x80 +#ifdef __GNUC__ + BNE L_SHA512_transform_len_begin +#else + BNE.W L_SHA512_transform_len_begin +#endif + EOR r0, r0, r0 + ADD sp, sp, #0xc0 + POP {r4, r5, r6, r7, r8, r9, r10, r11, pc} + /* Cycle Count = 5021 */ + .size Transform_Sha512_Len,.-Transform_Sha512_Len +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#endif /* WOLFSSL_SHA512 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ + +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif +#endif /* !WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm_c.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3583 @@ +/* thumb2-sha512-asm + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Generated using (from wolfssl): + * cd ../scripts + * ruby ./sha2/sha512.rb thumb2 ../wolfssl/wolfcrypt/src/port/arm/thumb2-sha512-asm.c + */ + +#ifdef HAVE_CONFIG_H + #include +#endif /* HAVE_CONFIG_H */ +#include +#include + +#ifdef WOLFSSL_ARMASM +#if !defined(__aarch64__) && defined(__thumb__) +#ifdef WOLFSSL_ARMASM_INLINE + +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif /* __KEIL__ */ +#ifdef WOLFSSL_SHA512 +#include + +#ifdef WOLFSSL_ARMASM_NO_NEON +static const uint64_t L_SHA512_transform_len_k[] = { + 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, + 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, + 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, + 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, + 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, + 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, + 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, + 0x9bdc06a725c71235UL, 0xc19bf174cf692694UL, + 0xe49b69c19ef14ad2UL, 0xefbe4786384f25e3UL, + 0x0fc19dc68b8cd5b5UL, 0x240ca1cc77ac9c65UL, + 0x2de92c6f592b0275UL, 0x4a7484aa6ea6e483UL, + 0x5cb0a9dcbd41fbd4UL, 0x76f988da831153b5UL, + 0x983e5152ee66dfabUL, 0xa831c66d2db43210UL, + 0xb00327c898fb213fUL, 0xbf597fc7beef0ee4UL, + 0xc6e00bf33da88fc2UL, 0xd5a79147930aa725UL, + 0x06ca6351e003826fUL, 0x142929670a0e6e70UL, + 0x27b70a8546d22ffcUL, 0x2e1b21385c26c926UL, + 0x4d2c6dfc5ac42aedUL, 0x53380d139d95b3dfUL, + 0x650a73548baf63deUL, 0x766a0abb3c77b2a8UL, + 0x81c2c92e47edaee6UL, 0x92722c851482353bUL, + 0xa2bfe8a14cf10364UL, 0xa81a664bbc423001UL, + 0xc24b8b70d0f89791UL, 0xc76c51a30654be30UL, + 0xd192e819d6ef5218UL, 0xd69906245565a910UL, + 0xf40e35855771202aUL, 0x106aa07032bbd1b8UL, + 0x19a4c116b8d2d0c8UL, 0x1e376c085141ab53UL, + 0x2748774cdf8eeb99UL, 0x34b0bcb5e19b48a8UL, + 0x391c0cb3c5c95a63UL, 0x4ed8aa4ae3418acbUL, + 0x5b9cca4f7763e373UL, 0x682e6ff3d6b2b8a3UL, + 0x748f82ee5defb2fcUL, 0x78a5636f43172f60UL, + 0x84c87814a1f0ab72UL, 0x8cc702081a6439ecUL, + 0x90befffa23631e28UL, 0xa4506cebde82bde9UL, + 0xbef9a3f7b2c67915UL, 0xc67178f2e372532bUL, + 0xca273eceea26619cUL, 0xd186b8c721c0c207UL, + 0xeada7dd6cde0eb1eUL, 0xf57d4f7fee6ed178UL, + 0x06f067aa72176fbaUL, 0x0a637dc5a2c898a6UL, + 0x113f9804bef90daeUL, 0x1b710b35131c471bUL, + 0x28db77f523047d84UL, 0x32caab7b40c72493UL, + 0x3c9ebe0a15c9bebcUL, 0x431d67c49c100d4cUL, + 0x4cc5d4becb3e42b6UL, 0x597f299cfc657e2aUL, + 0x5fcb6fab3ad6faecUL, 0x6c44198c4a475817UL, +}; + +void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +void Transform_Sha512_Len(wc_Sha512* sha512_p, const byte* data_p, word32 len_p) +#else +void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register wc_Sha512* sha512 __asm__ ("r0") = (wc_Sha512*)sha512_p; + register const byte* data __asm__ ("r1") = (const byte*)data_p; + register word32 len __asm__ ("r2") = (word32)len_p; + register uint64_t* L_SHA512_transform_len_k_c __asm__ ("r3") = (uint64_t*)&L_SHA512_transform_len_k; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0xc0\n\t" + "MOV r3, %[L_SHA512_transform_len_k]\n\t" + /* Copy digest to add in at end */ + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "LDRD r10, r11, [%[sha512], #24]\n\t" + "STRD r4, r5, [sp, #128]\n\t" + "STRD r6, r7, [sp, #136]\n\t" + "STRD r8, r9, [sp, #144]\n\t" + "STRD r10, r11, [sp, #152]\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "LDRD r10, r11, [%[sha512], #56]\n\t" + "STRD r4, r5, [sp, #160]\n\t" + "STRD r6, r7, [sp, #168]\n\t" + "STRD r8, r9, [sp, #176]\n\t" + "STRD r10, r11, [sp, #184]\n\t" + /* Start of loop processing a block */ + "\n" + "L_SHA512_transform_len_begin%=:\n\t" + /* Load, Reverse and Store W */ + "LDR r4, [%[data]]\n\t" + "LDR r5, [%[data], #4]\n\t" + "LDR r6, [%[data], #8]\n\t" + "LDR r7, [%[data], #12]\n\t" + "LDR r8, [%[data], #16]\n\t" + "LDR r9, [%[data], #20]\n\t" + "LDR r10, [%[data], #24]\n\t" + "LDR r11, [%[data], #28]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "REV r10, r10\n\t" + "REV r11, r11\n\t" + "STR r5, [sp]\n\t" + "STR r4, [sp, #4]\n\t" + "STR r7, [sp, #8]\n\t" + "STR r6, [sp, #12]\n\t" + "STR r9, [sp, #16]\n\t" + "STR r8, [sp, #20]\n\t" + "STR r11, [sp, #24]\n\t" + "STR r10, [sp, #28]\n\t" + "LDR r4, [%[data], #32]\n\t" + "LDR r5, [%[data], #36]\n\t" + "LDR r6, [%[data], #40]\n\t" + "LDR r7, [%[data], #44]\n\t" + "LDR r8, [%[data], #48]\n\t" + "LDR r9, [%[data], #52]\n\t" + "LDR r10, [%[data], #56]\n\t" + "LDR r11, [%[data], #60]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "REV r10, r10\n\t" + "REV r11, r11\n\t" + "STR r5, [sp, #32]\n\t" + "STR r4, [sp, #36]\n\t" + "STR r7, [sp, #40]\n\t" + "STR r6, [sp, #44]\n\t" + "STR r9, [sp, #48]\n\t" + "STR r8, [sp, #52]\n\t" + "STR r11, [sp, #56]\n\t" + "STR r10, [sp, #60]\n\t" + "LDR r4, [%[data], #64]\n\t" + "LDR r5, [%[data], #68]\n\t" + "LDR r6, [%[data], #72]\n\t" + "LDR r7, [%[data], #76]\n\t" + "LDR r8, [%[data], #80]\n\t" + "LDR r9, [%[data], #84]\n\t" + "LDR r10, [%[data], #88]\n\t" + "LDR r11, [%[data], #92]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "REV r10, r10\n\t" + "REV r11, r11\n\t" + "STR r5, [sp, #64]\n\t" + "STR r4, [sp, #68]\n\t" + "STR r7, [sp, #72]\n\t" + "STR r6, [sp, #76]\n\t" + "STR r9, [sp, #80]\n\t" + "STR r8, [sp, #84]\n\t" + "STR r11, [sp, #88]\n\t" + "STR r10, [sp, #92]\n\t" + "LDR r4, [%[data], #96]\n\t" + "LDR r5, [%[data], #100]\n\t" + "LDR r6, [%[data], #104]\n\t" + "LDR r7, [%[data], #108]\n\t" + "LDR r8, [%[data], #112]\n\t" + "LDR r9, [%[data], #116]\n\t" + "LDR r10, [%[data], #120]\n\t" + "LDR r11, [%[data], #124]\n\t" + "REV r4, r4\n\t" + "REV r5, r5\n\t" + "REV r6, r6\n\t" + "REV r7, r7\n\t" + "REV r8, r8\n\t" + "REV r9, r9\n\t" + "REV r10, r10\n\t" + "REV r11, r11\n\t" + "STR r5, [sp, #96]\n\t" + "STR r4, [sp, #100]\n\t" + "STR r7, [sp, #104]\n\t" + "STR r6, [sp, #108]\n\t" + "STR r9, [sp, #112]\n\t" + "STR r8, [sp, #116]\n\t" + "STR r11, [sp, #120]\n\t" + "STR r10, [sp, #124]\n\t" + /* Pre-calc: b ^ c */ + "LDRD r10, r11, [%[sha512], #8]\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r10, r10, r4\n\t" + "EOR r11, r11, r5\n\t" + "MOV r12, #0x4\n\t" + /* Start of 16 rounds */ + "\n" + "L_SHA512_transform_len_start%=:\n\t" + /* Round 0 */ + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r8, r9, [sp]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "STRD r8, r9, [%[sha512], #24]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #56]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[0] */ + "LDRD r4, r5, [sp, #112]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp]\n\t" + "LDRD r8, r9, [sp, #72]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp]\n\t" + "LDRD r4, r5, [sp, #8]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp]\n\t" + /* Round 1 */ + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r8, r9, [sp, #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #8]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "STRD r8, r9, [%[sha512], #16]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #48]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[1] */ + "LDRD r4, r5, [sp, #120]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #8]\n\t" + "LDRD r8, r9, [sp, #80]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #8]\n\t" + "LDRD r4, r5, [sp, #16]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #8]\n\t" + /* Round 2 */ + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r8, r9, [sp, #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #16]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "STRD r8, r9, [%[sha512], #8]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #40]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[2] */ + "LDRD r4, r5, [sp]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #16]\n\t" + "LDRD r8, r9, [sp, #88]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #16]\n\t" + "LDRD r4, r5, [sp, #24]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #16]\n\t" + /* Round 3 */ + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r8, r9, [sp, #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #24]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "STRD r8, r9, [%[sha512]]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #32]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[3] */ + "LDRD r4, r5, [sp, #8]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #24]\n\t" + "LDRD r8, r9, [sp, #96]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #24]\n\t" + "LDRD r4, r5, [sp, #32]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #24]\n\t" + /* Round 4 */ + "LDRD r4, r5, [%[sha512]]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r8, r9, [sp, #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #32]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "STRD r8, r9, [%[sha512], #56]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #24]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[4] */ + "LDRD r4, r5, [sp, #16]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #32]\n\t" + "LDRD r8, r9, [sp, #104]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #32]\n\t" + "LDRD r4, r5, [sp, #40]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #32]\n\t" + /* Round 5 */ + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r8, r9, [sp, #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #40]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "STRD r8, r9, [%[sha512], #48]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #16]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[5] */ + "LDRD r4, r5, [sp, #24]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #40]\n\t" + "LDRD r8, r9, [sp, #112]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #40]\n\t" + "LDRD r4, r5, [sp, #48]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #40]\n\t" + /* Round 6 */ + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r8, r9, [sp, #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #48]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "STRD r8, r9, [%[sha512], #40]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #8]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[6] */ + "LDRD r4, r5, [sp, #32]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #48]\n\t" + "LDRD r8, r9, [sp, #120]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #48]\n\t" + "LDRD r4, r5, [sp, #56]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #48]\n\t" + /* Round 7 */ + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r8, r9, [sp, #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #56]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "STRD r8, r9, [%[sha512], #32]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512]]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[7] */ + "LDRD r4, r5, [sp, #40]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #56]\n\t" + "LDRD r8, r9, [sp]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #56]\n\t" + "LDRD r4, r5, [sp, #64]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #56]\n\t" + /* Round 8 */ + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r8, r9, [sp, #64]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #64]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "STRD r8, r9, [%[sha512], #24]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #56]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[8] */ + "LDRD r4, r5, [sp, #48]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #64]\n\t" + "LDRD r8, r9, [sp, #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #64]\n\t" + "LDRD r4, r5, [sp, #72]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #64]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #64]\n\t" + /* Round 9 */ + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r8, r9, [sp, #72]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #72]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "STRD r8, r9, [%[sha512], #16]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #48]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[9] */ + "LDRD r4, r5, [sp, #56]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #72]\n\t" + "LDRD r8, r9, [sp, #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #72]\n\t" + "LDRD r4, r5, [sp, #80]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #72]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #72]\n\t" + /* Round 10 */ + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r8, r9, [sp, #80]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #80]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "STRD r8, r9, [%[sha512], #8]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #40]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[10] */ + "LDRD r4, r5, [sp, #64]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #80]\n\t" + "LDRD r8, r9, [sp, #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #80]\n\t" + "LDRD r4, r5, [sp, #88]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #80]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #80]\n\t" + /* Round 11 */ + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r8, r9, [sp, #88]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #88]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "STRD r8, r9, [%[sha512]]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #32]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[11] */ + "LDRD r4, r5, [sp, #72]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #88]\n\t" + "LDRD r8, r9, [sp, #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #88]\n\t" + "LDRD r4, r5, [sp, #96]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #88]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #88]\n\t" + /* Round 12 */ + "LDRD r4, r5, [%[sha512]]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r8, r9, [sp, #96]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #96]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "STRD r8, r9, [%[sha512], #56]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #24]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[12] */ + "LDRD r4, r5, [sp, #80]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #96]\n\t" + "LDRD r8, r9, [sp, #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #96]\n\t" + "LDRD r4, r5, [sp, #104]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #96]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #96]\n\t" + /* Round 13 */ + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r8, r9, [sp, #104]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #104]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "STRD r8, r9, [%[sha512], #48]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #16]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[13] */ + "LDRD r4, r5, [sp, #88]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #104]\n\t" + "LDRD r8, r9, [sp, #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #104]\n\t" + "LDRD r4, r5, [sp, #112]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #104]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #104]\n\t" + /* Round 14 */ + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r8, r9, [sp, #112]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #112]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "STRD r8, r9, [%[sha512], #40]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #8]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[14] */ + "LDRD r4, r5, [sp, #96]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #112]\n\t" + "LDRD r8, r9, [sp, #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #112]\n\t" + "LDRD r4, r5, [sp, #120]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #112]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #112]\n\t" + /* Round 15 */ + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r8, r9, [sp, #120]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #120]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "STRD r8, r9, [%[sha512], #32]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512]]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Calc new W[15] */ + "LDRD r4, r5, [sp, #104]\n\t" + "LSRS r6, r4, #19\n\t" + "LSRS r7, r5, #19\n\t" + "ORR r7, r7, r4, LSL #13\n\t" + "ORR r6, r6, r5, LSL #13\n\t" + "LSLS r8, r4, #3\n\t" + "LSLS r9, r5, #3\n\t" + "ORR r9, r9, r4, LSR #29\n\t" + "ORR r8, r8, r5, LSR #29\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #6\n\t" + "LSRS r9, r5, #6\n\t" + "ORR r8, r8, r5, LSL #26\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #120]\n\t" + "LDRD r8, r9, [sp, #64]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "STRD r4, r5, [sp, #120]\n\t" + "LDRD r4, r5, [sp]\n\t" + "LSRS r6, r4, #1\n\t" + "LSRS r7, r5, #1\n\t" + "ORR r7, r7, r4, LSL #31\n\t" + "ORR r6, r6, r5, LSL #31\n\t" + "LSRS r8, r4, #8\n\t" + "LSRS r9, r5, #8\n\t" + "ORR r9, r9, r4, LSL #24\n\t" + "ORR r8, r8, r5, LSL #24\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LSRS r8, r4, #7\n\t" + "LSRS r9, r5, #7\n\t" + "ORR r8, r8, r5, LSL #25\n\t" + "EOR r7, r7, r9\n\t" + "EOR r6, r6, r8\n\t" + "LDRD r4, r5, [sp, #120]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [sp, #120]\n\t" + "ADD r3, r3, #0x80\n\t" + "SUBS r12, r12, #0x1\n\t" +#ifdef __GNUC__ + "BNE L_SHA512_transform_len_start%=\n\t" +#else + "BNE.W L_SHA512_transform_len_start%=\n\t" +#endif + /* Round 0 */ + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r8, r9, [sp]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "STRD r8, r9, [%[sha512], #24]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #56]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 1 */ + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r8, r9, [sp, #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #8]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "STRD r8, r9, [%[sha512], #16]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #48]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 2 */ + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r8, r9, [sp, #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #16]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "STRD r8, r9, [%[sha512], #8]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #40]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 3 */ + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r8, r9, [sp, #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #24]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "STRD r8, r9, [%[sha512]]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #32]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 4 */ + "LDRD r4, r5, [%[sha512]]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r8, r9, [sp, #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #32]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "STRD r8, r9, [%[sha512], #56]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #24]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 5 */ + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r8, r9, [sp, #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #40]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "STRD r8, r9, [%[sha512], #48]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #16]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 6 */ + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r8, r9, [sp, #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #48]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "STRD r8, r9, [%[sha512], #40]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #8]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 7 */ + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r8, r9, [sp, #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #56]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "STRD r8, r9, [%[sha512], #32]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512]]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 8 */ + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r8, r9, [sp, #64]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #64]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "STRD r8, r9, [%[sha512], #24]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "STRD r4, r5, [%[sha512], #56]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #56]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 9 */ + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r8, r9, [sp, #72]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #72]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "STRD r8, r9, [%[sha512], #16]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #48]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 10 */ + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r8, r9, [sp, #80]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #80]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "STRD r8, r9, [%[sha512], #8]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "STRD r4, r5, [%[sha512], #40]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #40]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 11 */ + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r8, r9, [sp, #88]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #88]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "STRD r8, r9, [%[sha512]]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #32]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 12 */ + "LDRD r4, r5, [%[sha512]]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "LDRD r8, r9, [sp, #96]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #96]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "STRD r8, r9, [%[sha512], #56]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "STRD r4, r5, [%[sha512], #24]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #24]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 13 */ + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r4, r5, [%[sha512], #56]\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r8, r9, [sp, #104]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #104]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #48]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #24]\n\t" + "STRD r8, r9, [%[sha512], #48]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #24]\n\t" + "LDRD r6, r7, [%[sha512], #32]\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #16]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 14 */ + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "LDRD r8, r9, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "LDRD r8, r9, [sp, #112]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #112]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #40]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "STRD r8, r9, [%[sha512], #40]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "STRD r4, r5, [%[sha512], #8]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512], #8]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Round 15 */ + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LSRS r6, r4, #14\n\t" + "LSRS r7, r5, #14\n\t" + "ORR r7, r7, r4, LSL #18\n\t" + "ORR r6, r6, r5, LSL #18\n\t" + "LSRS r8, r4, #18\n\t" + "LSRS r9, r5, #18\n\t" + "ORR r9, r9, r4, LSL #14\n\t" + "ORR r8, r8, r5, LSL #14\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #23\n\t" + "LSLS r9, r5, #23\n\t" + "ORR r9, r9, r4, LSR #9\n\t" + "ORR r8, r8, r5, LSR #9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "LDRD r4, r5, [%[sha512], #40]\n\t" + "LDRD r6, r7, [%[sha512], #48]\n\t" + "LDRD r8, r9, [%[sha512], #56]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "AND r6, r6, r4\n\t" + "AND r7, r7, r5\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r8, r9, [sp, #120]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r6, r7, [r3, #120]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "LDRD r8, r9, [%[sha512], #32]\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "ADDS r8, r8, r4\n\t" + "ADC r9, r9, r5\n\t" + "LDRD r4, r5, [%[sha512], #8]\n\t" + "STRD r8, r9, [%[sha512], #32]\n\t" + "LSRS r6, r4, #28\n\t" + "LSRS r7, r5, #28\n\t" + "ORR r7, r7, r4, LSL #4\n\t" + "ORR r6, r6, r5, LSL #4\n\t" + "LSLS r8, r4, #30\n\t" + "LSLS r9, r5, #30\n\t" + "ORR r9, r9, r4, LSR #2\n\t" + "ORR r8, r8, r5, LSR #2\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "LSLS r8, r4, #25\n\t" + "LSLS r9, r5, #25\n\t" + "ORR r9, r9, r4, LSR #7\n\t" + "ORR r8, r8, r5, LSR #7\n\t" + "LDRD r4, r5, [%[sha512]]\n\t" + "EOR r6, r6, r8\n\t" + "EOR r7, r7, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADC r5, r5, r7\n\t" + "LDRD r8, r9, [%[sha512], #8]\n\t" + "LDRD r6, r7, [%[sha512], #16]\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "EOR r8, r8, r6\n\t" + "EOR r9, r9, r7\n\t" + "AND r10, r10, r8\n\t" + "AND r11, r11, r9\n\t" + "EOR r10, r10, r6\n\t" + "EOR r11, r11, r7\n\t" + "LDRD r6, r7, [%[sha512]]\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r6, r7, [%[sha512]]\n\t" + "MOV r10, r8\n\t" + "MOV r11, r9\n\t" + /* Add in digest from start */ + "LDRD r4, r5, [%[sha512]]\n\t" + "LDRD r6, r7, [%[sha512], #8]\n\t" + "LDRD r8, r9, [sp, #128]\n\t" + "LDRD r10, r11, [sp, #136]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r4, r5, [%[sha512]]\n\t" + "STRD r6, r7, [%[sha512], #8]\n\t" + "STRD r4, r5, [sp, #128]\n\t" + "STRD r6, r7, [sp, #136]\n\t" + "LDRD r4, r5, [%[sha512], #16]\n\t" + "LDRD r6, r7, [%[sha512], #24]\n\t" + "LDRD r8, r9, [sp, #144]\n\t" + "LDRD r10, r11, [sp, #152]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r4, r5, [%[sha512], #16]\n\t" + "STRD r6, r7, [%[sha512], #24]\n\t" + "STRD r4, r5, [sp, #144]\n\t" + "STRD r6, r7, [sp, #152]\n\t" + "LDRD r4, r5, [%[sha512], #32]\n\t" + "LDRD r6, r7, [%[sha512], #40]\n\t" + "LDRD r8, r9, [sp, #160]\n\t" + "LDRD r10, r11, [sp, #168]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r4, r5, [%[sha512], #32]\n\t" + "STRD r6, r7, [%[sha512], #40]\n\t" + "STRD r4, r5, [sp, #160]\n\t" + "STRD r6, r7, [sp, #168]\n\t" + "LDRD r4, r5, [%[sha512], #48]\n\t" + "LDRD r6, r7, [%[sha512], #56]\n\t" + "LDRD r8, r9, [sp, #176]\n\t" + "LDRD r10, r11, [sp, #184]\n\t" + "ADDS r4, r4, r8\n\t" + "ADC r5, r5, r9\n\t" + "ADDS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STRD r4, r5, [%[sha512], #48]\n\t" + "STRD r6, r7, [%[sha512], #56]\n\t" + "STRD r4, r5, [sp, #176]\n\t" + "STRD r6, r7, [sp, #184]\n\t" + "SUBS %[len], %[len], #0x80\n\t" + "SUB r3, r3, #0x200\n\t" + "ADD %[data], %[data], #0x80\n\t" +#ifdef __GNUC__ + "BNE L_SHA512_transform_len_begin%=\n\t" +#else + "BNE.W L_SHA512_transform_len_begin%=\n\t" +#endif + "EOR r0, r0, r0\n\t" + "ADD sp, sp, #0xc0\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len), + [L_SHA512_transform_len_k] "+r" (L_SHA512_transform_len_k_c) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" +#else + : [sha512] "+r" (sha512), [data] "+r" (data), [len] "+r" (len) + : [L_SHA512_transform_len_k] "r" (L_SHA512_transform_len_k) + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + ); +} + +#endif /* WOLFSSL_ARMASM_NO_NEON */ +#endif /* WOLFSSL_SHA512 */ +#endif /* !__aarch64__ && __thumb__ */ +#endif /* WOLFSSL_ARMASM */ +#endif /* WOLFSSL_ARMASM_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/atmel/atmel.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/atmel/atmel.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/atmel/atmel.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/atmel/atmel.c 2024-08-03 07:30:00.000000000 +0000 @@ -136,7 +136,7 @@ int atmel_get_random_block(unsigned char* output, unsigned int sz) { - return atmel_get_random_number((uint32_t)sz, (uint8_t*)output); + return atmel_get_random_number((uint32_t)sz, (uint8_t*)output); } #if defined(WOLFSSL_ATMEL) && defined(WOLFSSL_ATMEL_TIME) @@ -148,12 +148,12 @@ { long rt = 0; - /* Get current time */ + /* Get current time */ struct rtc_calendar_time rtcTime; const int monthDay[] = {0,31,59,90,120,151,181,212,243,273,304,334}; int month, year, yearLeap; - rtc_calendar_get_time(_rtc_instance[0], &rtcTime); + rtc_calendar_get_time(_rtc_instance[0], &rtcTime); /* Convert rtc_calendar_time to seconds since UTC */ month = rtcTime.month % 12; @@ -359,7 +359,7 @@ static int atmel_init_enc_key(void) { int ret; - uint8_t read_key[ATECC_KEY_SIZE]; + uint8_t read_key[ATECC_KEY_SIZE]; uint8_t writeBlock = 0; uint8_t writeOffset = 0; int slotId; @@ -388,7 +388,7 @@ ForceZero(read_key, sizeof(read_key)); ret = atmel_ecc_translate_err(ret); - return ret; + return ret; } #endif @@ -497,7 +497,7 @@ extern ATCAIfaceCfg atecc608_0_init_data; #endif #endif - + if (!mAtcaInitDone) { ATCA_STATUS status; int i; @@ -940,7 +940,7 @@ return ret; } -static int atcatls_set_certificates(WOLFSSL_CTX *ctx) +static int atcatls_set_certificates(WOLFSSL_CTX *ctx) { #ifndef ATCATLS_SIGNER_CERT_MAX_SIZE #define ATCATLS_SIGNER_CERT_MAX_SIZE 0x250 @@ -966,7 +966,7 @@ uint8_t signerPubKeyBuffer[ATCATLS_PUBKEY_BUFF_MAX_SIZE]; #endif -#ifdef WOLFSSL_ATECC_TNGTLS +#ifdef WOLFSSL_ATECC_TNGTLS ret = tng_atcacert_max_signer_cert_size(&signerCertSize); if (ret != ATCACERT_E_SUCCESS) { #ifdef WOLFSSL_ATECC_DEBUG diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,45 @@ +## 1.0 Intro To Using wolfSSL with AutoSAR + +This readme covers building and using wolfSSL for AutoSAR applications. Currently AES-CBC and RNG are supported. The version of AutoSAR used for reference was 4.4. Currently there is no asynchronous support. + + +## 2.0 Building wolfSSL + +### 2.1 wolfSSL Library +To enable the use of AutoSAR with wolfSSL use the enable option --enable-autosar. In example “./configure --eanble-autosarâ€. If building without autotools then the macro WOLFSSL_AUTOSAR should be defined. This is usually defined in a user_settings.h file which gets included to the wolfSSL build when the macro WOLFSSL_USER_SETTINGS is defined. + + +### 2.2 Key Redirection +By default the next available key with the same key type desired is used. When specific keys are to be used then key input redirection is needed. This is done at compile time with setting specific macros. An example of key redirection would be as follows : + +/* set redirection of primary and secondary */ +#define REDIRECTION_CONFIG 0x03 + +/* set primary key to keyId of 1 and element type CRYPTO_KE_CIPHER_KEY */ +#define REDIRECTION_IN1_KEYID 1 +#define REDIRECTION_IN1_KEYELMID 0x01 + + +/* set secondary key to keyId of 4 and element type CRYPTO_KE_CIPHER_IV */ +#define REDIRECTION_IN2_KEYID 4 +#define REDIRECTION_IN2_KEYELMID 0x05 + + +## 3.0 example + +There is an example test case located at wolfcrypt/src/port/autsar/example.c. After compiling with autotools (./configure --enable-autsar && make) the example can be ran by running the command ./wolfcrypt/src/port/autsar/example.test + +## 4.0 API Implemented + +- Std_ReturnType Csm_Decrypt(uint32 jobId, + Crypto_OperationModeType mode, const uint8* dataPtr, uint32 dataLength, + uint8* resultPtr, uint32* resultLengthPtr); +- Std_ReturnType Csm_Encrypt(uint32 jobId, + Crypto_OperationModeType mode, const uint8* dataPtr, uint32 dataLength, + uint8* resultPtr, uint32* resultLengthPtr); +- Std_ReturnType Csm_KeyElementSet(uint32 keyId, uint32 keyElementId, + const uint8* keyPtr, uint32 keyLength); +- Std_ReturnType Csm_RandomGenerate( uint32 jobId, uint8* resultPtr, + uint32* resultLengthPtr); + +Along with the structures necessary for these API. \ No newline at end of file diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/cryif.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/cryif.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/cryif.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/cryif.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,103 @@ +/* cryif.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* AutoSAR 4.4 */ +/* shim layer for use of wolfSSL crypto driver */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include + +#ifdef WOLFSSL_AUTOSAR +#ifndef NO_WOLFSSL_AUTOSAR_CRYIF + +#include + +/* initialization function */ +void CryIf_Init(const CryIf_ConfigType* in) +{ + (void)in; + Crypto_Init(NULL); +} + + +void CryIf_GetVersionInfo(Std_VersionInfoType* ver) +{ + if (ver != NULL) { + ver->vendorID = 0; /* no vendor or module ID */ + ver->moduleID = 0; + ver->sw_major_version = (LIBWOLFSSL_VERSION_HEX >> 24) & 0xFFF; + ver->sw_minor_version = (LIBWOLFSSL_VERSION_HEX >> 12) & 0xFFF; + ver->sw_patch_version = (LIBWOLFSSL_VERSION_HEX) & 0xFFF; + } +} + + +/* returns E_OK on success */ +Std_ReturnType CryIf_ProcessJob(uint32 id, Crypto_JobType* job) +{ + WOLFSSL_ENTER("CryIf_ProcessJob"); + if (job == NULL) { + return E_NOT_OK; + } + + /* only handle synchronous jobs */ + if (job->jobPrimitiveInfo->processingType != CRYPTO_PROCESSING_SYNC) { + WOLFSSL_MSG("Crypto Interface only supporting synchronous jobs"); + return E_NOT_OK; + } + + return Crypto_ProcessJob(id, job); +} + + +/* not implemented yet since async not supported */ +Std_ReturnType CryIf_CancelJob(uint32 id, Crypto_JobType* job) +{ + (void)id; + (void)job; + WOLFSSL_STUB("CryIf_CancelJob"); + + return E_NOT_OK; +} + + +/* return E_OK on success */ +Std_ReturnType CryIf_KeyElementSet(uint32 keyId, uint32 eId, const uint8* key, + uint32 keySz) +{ + if (key == NULL || keySz == 0) { + /* report CRYIF_E_PARAM_POINTER to the DET */ + return E_NOT_OK; + } + + return Crypto_KeyElementSet(keyId, eId, key, keySz); +} +#endif /* NO_WOLFSSL_AUTOSAR_CRYIF */ +#endif /* WOLFSSL_AUTOSAR */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/crypto.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/crypto.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/crypto.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/crypto.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,495 @@ +/* crypto.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#ifdef WOLFSSL_AUTOSAR +#ifndef NO_WOLFSSL_AUTOSAR_CRYPTO + +#include +#include +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +/* Low level crypto (software based driver) where wolfCrypt gets called */ +Std_ReturnType wolfSSL_Crypto_CBC(Crypto_JobType* job); +Std_ReturnType wolfSSL_Crypto(Crypto_JobType* job); +Std_ReturnType wolfSSL_Crypto_RNG(Crypto_JobType* job); + + +#ifndef MAX_KEYSTORE + #define MAX_KEYSTORE 15 +#endif +#ifndef MAX_JOBS + #define MAX_JOBS 10 +#endif + +static wolfSSL_Mutex crypto_mutex; +struct Keys { + uint32 keyLen; + uint32 eId; + + /* raw key */ + uint8 key[AES_MAX_KEY_SIZE/WOLFSSL_BIT_SIZE]; +} Keys; + + +struct Jobs { + uint32 jobId; + uint8 inUse; /* is the key available for use */ + Aes aes; +} Jobs; + +static struct Jobs activeJobs[MAX_JOBS]; +static struct Keys keyStore[MAX_KEYSTORE]; + + +/* tries to get a key of type eId + * returns 0 on success + */ +static int GetKey(Crypto_JobType* job, uint32 eId, uint8 **key, uint32 *keySz) +{ + int i, ret = 0; + + if (key == NULL || keySz == NULL || *key != NULL) { + WOLFSSL_MSG("Bad parameter to GetKey"); + return -1; + } + + if (wc_LockMutex(&crypto_mutex) != 0) { + WOLFSSL_MSG("Unable to lock crypto mutex"); + return -1; + } + +#ifdef REDIRECTION_CONFIG + /* keys should be set... */ + if (job->jobRedirectionInfoRef == NULL) { + WOLFSSL_MSG("Issue with getting key redirection"); + wc_UnLockMutex(&crypto_mutex); + return -1; + } + + /* @TODO sanity checks on setup... uint8 redirectionConfig; */ + switch (eid) { + case job->jobRedirectionInfoRef->inputKeyElementId: + if (job->jobRedirectionInfoRef->inputKeyId >= MAX_KEYSTORE) { + WOLFSSL_MSG("Bogus input key ID redirection (too large)"); + ret = -1; + } + else { + i = job->jobRedirectionInfoRef->inputKeyId; + *key = keyStore[i].key; + *keySz = keyStore[i].keyLen; + } + break; + case job->jobRedirectionInfoRef->secondaryInputKeyElementId: + if (job->jobRedirectionInfoRef->secondaryInputKeyId >= MAX_KEYSTORE) { + WOLFSSL_MSG("Bogus input key ID redirection (too large)"); + ret = -1; + } + else { + i = job->jobRedirectionInfoRef->secondaryInputKeyId; + *key = keyStore[i].key; + *keySz = keyStore[i].keyLen; + } + break; + case job->jobRedirectionInfoRef->tertiaryInputKeyElementId: + if (job->jobRedirectionInfoRef->tertiaryInputKeyId >= MAX_KEYSTORE) { + WOLFSSL_MSG("Bogus input key ID redirection (too large)"); + ret = -1; + } + else { + i = job->jobRedirectionInfoRef->tertiaryInputKeyId; + *key = keyStore[i].key; + *keySz = keyStore[i].keyLen; + } + break; + default: + WOLFSSL_MSG("Unknown key element ID"); + ret = -1; + break; + } +#else + /* find first key of key element type */ + for (i = 0; i < MAX_KEYSTORE; i++) { + if (keyStore[i].eId == eId && keyStore[i].keyLen == + job->jobPrimitiveInfo->primitiveInfo->algorithm.keyLength) { + /* found matching key available, use it */ + *key = keyStore[i].key; + *keySz = keyStore[i].keyLen; + } + } +#endif + + if (*key == NULL) { + WOLFSSL_MSG("Unable to find an available key"); + ret = -1; + } + + if (wc_UnLockMutex(&crypto_mutex) != 0) { + WOLFSSL_MSG("Unable to unlock crypto mutex"); + ret = -1; + } + return ret; +} + + +/* returns a pointer to the Aes struct on success, NULL on failure */ +static Aes* GetAesStruct(Crypto_JobType* job) +{ + int i; + + for (i = 0; i < MAX_JOBS; i++) { + if (activeJobs[i].inUse == 1 && activeJobs[i].jobId == job->jobId) { + return &activeJobs[i].aes; + } + } + return NULL; +} + + +/* returns a pointer to the Aes struct on success, NULL on failure */ +static Aes* NewAesStruct(Crypto_JobType* job) +{ + int i; + + for (i = 0; i < MAX_JOBS; i++) { + if (activeJobs[i].inUse == 0) { + int ret; + + activeJobs[i].inUse = 1; + activeJobs[i].jobId = job->jobId; + ret = wc_AesInit(&activeJobs[i].aes, NULL, INVALID_DEVID); + if (ret != 0) { + WOLFSSL_MSG("Error initializing AES structure"); + return NULL; + } + return &activeJobs[i].aes; + } + } + return NULL; +} + + +/* free's up the use of an AES structure */ +static void FreeAesStruct(Crypto_JobType* job) { + int i; + + for (i = 0; i < MAX_JOBS; i++) { + if (activeJobs[i].inUse == 1 && activeJobs[i].jobId == job->jobId) { + break; + } + } + + if (i >= MAX_JOBS) { + WOLFSSL_MSG("Error finding AES structure"); + } + else { + wc_AesFree(&activeJobs[i].aes); + activeJobs[i].inUse = 0; + activeJobs[i].jobId = 0; + } +} + + +/* returns E_OK on success */ +Std_ReturnType wolfSSL_Crypto_CBC(Crypto_JobType* job) +{ + Std_ReturnType ret = E_OK; + int encrypt; + Aes* aes ; + + encrypt = (job->jobPrimitiveInfo->primitiveInfo->service == CRYPTO_ENCRYPT) + ? AES_ENCRYPTION : AES_DECRYPTION; + + /* check if key should be set */ + if ((job->jobPrimitiveInputOutput.mode & CRYPTO_OPERATIONMODE_START) != 0) { + uint8 *key = NULL; + uint8 *iv = NULL; + uint32 keySz = 0; + uint32 ivSz = 0; + + if (GetKey(job, CRYPTO_KE_CIPHER_KEY, &key, &keySz) != 0) { + WOLFSSL_MSG("Crypto error with getting a key"); + return E_NOT_OK; + } + + if (GetKey(job, CRYPTO_KE_CIPHER_IV, &iv, &ivSz) != 0) { + WOLFSSL_MSG("Crypto error with getting an IV"); + return E_NOT_OK; + } + + if (iv != NULL && ivSz < AES_BLOCK_SIZE) { + WOLFSSL_MSG("Error IV is too small"); + return E_NOT_OK; + } + + aes = NewAesStruct(job); + if (aes == NULL) { + WOLFSSL_MSG("Unable to get AES structure for use"); + return E_NOT_OK; + } + + if (wc_AesSetKey(aes, key, keySz, iv, encrypt) != 0) { + WOLFSSL_MSG("Crypto error setting up AES key"); + return E_NOT_OK; + } + ForceZero(key, keySz); + } + + if ((job->jobPrimitiveInputOutput.mode & CRYPTO_OPERATIONMODE_UPDATE) + != 0) { + aes = GetAesStruct(job); + if (aes == NULL) { + WOLFSSL_MSG("Error finding AES structure"); + return E_NOT_OK; + } + + if (encrypt == AES_ENCRYPTION) { + if (wc_AesCbcEncrypt(aes, job->jobPrimitiveInputOutput.outputPtr, + job->jobPrimitiveInputOutput.inputPtr, + job->jobPrimitiveInputOutput.inputLength) != 0) { + WOLFSSL_MSG("AES-CBC encrypt error"); + return E_NOT_OK; + } + } + else { + if (wc_AesCbcDecrypt(aes, job->jobPrimitiveInputOutput.outputPtr, + job->jobPrimitiveInputOutput.inputPtr, + job->jobPrimitiveInputOutput.inputLength) != 0) { + WOLFSSL_MSG("AES-CBC decrypt error"); + return E_NOT_OK; + } + } + } + + if ((job->jobPrimitiveInputOutput.mode & CRYPTO_OPERATIONMODE_FINISH) + != 0) { + FreeAesStruct(job); + } + + return ret; +} + + +/* returns E_OK on success and E_NOT_OK on failure */ +Std_ReturnType wolfSSL_Crypto(Crypto_JobType* job) +{ + Std_ReturnType ret = E_OK; + + WOLFSSL_ENTER("wolfSSL_Crypto"); + + /* switch on encryption type */ + switch (job->jobPrimitiveInfo->primitiveInfo->algorithm.mode) { + case CRYPTO_ALGOMODE_CBC: + ret = wolfSSL_Crypto_CBC(job); + break; + + case CRYPTO_ALGOMODE_NOT_SET: + WOLFSSL_MSG("Encrypt algo mode not set!"); + ret = E_NOT_OK; + break; + + default: + WOLFSSL_MSG("Unsupported encryption mode"); + ret = E_NOT_OK; + break; + } + + WOLFSSL_LEAVE("wolfSSL_Crypto", ret); + return ret; +} + +static WC_RNG rng; +static wolfSSL_Mutex rngMutex; +static volatile byte rngInit = 0; + +/* returns E_OK on success */ +Std_ReturnType wolfSSL_Crypto_RNG(Crypto_JobType* job) +{ + int ret; + + uint8 *out = job->jobPrimitiveInputOutput.outputPtr; + uint32 *outSz = job->jobPrimitiveInputOutput.outputLengthPtr; + + if (outSz == NULL || out == NULL) { + WOLFSSL_MSG("Bad parameter passed into wolfSSL_Crypto_RNG"); + return E_NOT_OK; + } + + if (rngInit == 1) { + if (wc_LockMutex(&rngMutex) != 0) { + WOLFSSL_MSG("Error locking RNG mutex"); + return E_NOT_OK; + } + } + + if (rngInit == 0) { + if (wc_InitMutex(&rngMutex) != 0) { + WOLFSSL_MSG("Error initializing RNG mutex"); + return E_NOT_OK; + } + + if (wc_LockMutex(&rngMutex) != 0) { + WOLFSSL_MSG("Error locking RNG mutex"); + return E_NOT_OK; + } + + ret = wc_InitRng_ex(&rng, NULL, 0); + if (ret != 0) { + WOLFSSL_MSG("Error initializing RNG"); + wc_UnLockMutex(&rngMutex); + return E_NOT_OK; + } + rngInit = 1; + } + + ret = wc_RNG_GenerateBlock(&rng, out, *outSz); + if (ret != 0) { + WOLFSSL_MSG("Unable to generate random values"); + ret = wc_FreeRng(&rng); + if (ret != 0) { + WOLFSSL_MSG("Error free'ing RNG"); + } + rngInit = 0; + wc_UnLockMutex(&rngMutex); + return E_NOT_OK; + } + + if (wc_UnLockMutex(&rngMutex) != 0) { + WOLFSSL_MSG("Error unlocking RNG mutex"); + return E_NOT_OK; + } + + return E_OK; +} + + +/* returns E_OK on success and E_NOT_OK on failure */ +Std_ReturnType Crypto_ProcessJob(uint32 objectId, Crypto_JobType* job) +{ + Std_ReturnType ret = E_OK; + (void)objectId; + + WOLFSSL_ENTER("Crypto_ProcessJob"); + if (job == NULL) { + WOLFSSL_MSG("Bad parameter passed to Crypto_ProcessJob"); + ret = E_NOT_OK; + } + + /* only handle synchronous jobs */ + if (ret == E_OK && + job->jobPrimitiveInfo->processingType != CRYPTO_PROCESSING_SYNC) { + WOLFSSL_MSG("Crypto only supporting synchronous jobs"); + ret = E_NOT_OK; + } + + if (ret == E_OK) { + job->jobState = CRYPTO_JOBSTATE_ACTIVE; + switch (job->jobPrimitiveInfo->primitiveInfo->service) { + case CRYPTO_ENCRYPT: + ret = wolfSSL_Crypto(job); + break; + + case CRYPTO_DECRYPT: + ret = wolfSSL_Crypto(job); + break; + + case CRYPTO_RANDOMGENERATE: + ret = wolfSSL_Crypto_RNG(job); + break; + + default: + WOLFSSL_MSG("Unsupported Crypto service"); + ret = E_NOT_OK; + break; + } + job->jobState = CRYPTO_JOBSTATE_IDLE; + } + + WOLFSSL_LEAVE("Crypto_ProcessJob", ret); + return ret; +} + + +/* config currently not used, should always be null */ +void Crypto_Init(const Crypto_ConfigType* config) +{ + if (wc_InitMutex(&crypto_mutex) != 0) { + WOLFSSL_MSG("Issues setting up crypto mutex"); + } + XMEMSET(&keyStore, 0, MAX_KEYSTORE * sizeof(Keys)); + XMEMSET(&activeJobs, 0, MAX_JOBS * sizeof(Jobs)); + (void)config; +} + + +/* returns E_OK on success and E_NOT_OK on failure */ +Std_ReturnType Crypto_KeyElementSet(uint32 keyId, uint32 eId, const uint8* key, + uint32 keySz) +{ + Std_ReturnType ret = E_OK; + + if (key == NULL || keySz == 0 || keyId >= MAX_KEYSTORE) { + WOLFSSL_MSG("Bad argument to Crypto_KeyElementSet"); + ret = E_NOT_OK; + } + + if (ret == E_OK && wc_LockMutex(&crypto_mutex) != 0) { + WOLFSSL_MSG("Unable to lock crypto mutex"); + ret = E_NOT_OK; + } + + if (ret == E_OK) { + if (keySz > sizeof(keyStore[keyId].key)) { + ret = E_NOT_OK; + } + if (ret == E_OK) { + WOLFSSL_MSG("Setting new key"); + keyStore[keyId].eId = eId; + XMEMCPY(keyStore[keyId].key, key, keySz); + keyStore[keyId].keyLen = keySz; + } + + if (wc_UnLockMutex(&crypto_mutex) != 0) { + WOLFSSL_MSG("Unable to unlock crypto mutex"); + ret = E_NOT_OK; + } + } + + return ret; +} +#endif /* NO_WOLFSSL_AUTOSAR_CRYPTO */ +#endif /* WOLFSSL_AUTOSAR */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/csm.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/csm.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/csm.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/csm.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,298 @@ +/* csm.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include +#include + +#ifdef WOLFSSL_AUTOSAR +#ifndef NO_WOLFSSL_AUTOSAR_CSM + + +/* AutoSAR 4.4 */ +/* basic shim layer to plug in wolfSSL crypto */ + +#ifndef REDIRECTION_CONFIG +Crypto_JobRedirectionInfoType redirect = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +#else +Crypto_JobRedirectionInfoType redirect = { + REDIRECTION_CONFIG, + #ifdef REDIRECTION_IN1_KEYID + REDIRECTION_IN1_KEYID, + #else + 0, + #endif + + #ifdef REDIRECTION_IN1_KEYELMID + REDIRECTION_IN1_KEYELMID, + #else + 0, + #endif + + + #ifdef REDIRECTION_IN2_KEYID + REDIRECTION_IN2_KEYID, + #else + 0, + #endif + + #ifdef REDIRECTION_IN2_KEYELMID + REDIRECTION_IN2_KEYELMID, + #else + 0, + #endif + + + #ifdef REDIRECTION_IN3_KEYID + REDIRECTION_IN3_KEYID, + #else + 0, + #endif + + #ifdef REDIRECTION_IN3_KEYELMID + REDIRECTION_IN3_KEYELMID, + #else + 0, + #endif + + #ifdef REDIRECTION_OUT1_KEYID + REDIRECTION_OUT1_KEYID, + #else + 0, + #endif + + #ifdef REDIRECTION_OUT1_KEYELMID + REDIRECTION_OUT1_KEYELMID, + #else + 0, + #endif + + + #ifdef REDIRECTION_OUT2_KEYID + REDIRECTION_OUT2_KEYID, + #else + 0, + #endif + + #ifdef REDIRECTION_OUT2_KEYELMID + REDIRECTION_OUT2_KEYELMID, + #else + 0, + #endif +}; +#endif + +static byte CsmDevErrorDetect = 1; /* flag for development error detection */ + +enum { + CSM_E_PARAM_POINTER, + CSM_E_SMALL_BUFFER, + CSM_E_UNINT, + CSM_E_INIT_FAILED, + CSM_E_PROCESSING_MODE +}; + + +/* development error reporting */ +void ReportToDET(int err) +{ + if (CsmDevErrorDetect == 1) { + switch (err) { + case CSM_E_PARAM_POINTER: + WOLFSSL_MSG("AutoSAR CSM_E_PARAM_POINTER error"); + break; + + case CSM_E_SMALL_BUFFER: + WOLFSSL_MSG("AutoSAR CSM_E_SMALL_BUFFER error"); + break; + + case CSM_E_UNINT: + WOLFSSL_MSG("AutoSAR CSM_E_UNINT error"); + break; + + case CSM_E_INIT_FAILED: + WOLFSSL_MSG("AutoSAR CSM_E_INIT_FAILED error"); + break; + + case CSM_E_PROCESSING_MODE: + WOLFSSL_MSG("AutoSAR CSM_E_PROCESSING_MODE error"); + break; + + default: + WOLFSSL_MSG("AutoSAR Unknown error"); + } + } +} + + +void Csm_Init(const Csm_ConfigType* config) +{ + (void)config; + CryIf_Init(NULL); +} + + +/* getter function for CSM version info */ +void Csm_GetVersionInfo(Std_VersionInfoType* version) +{ + if (version != NULL) { + version->vendorID = 0; /* no vendor or module ID */ + version->moduleID = 0; + version->sw_major_version = (LIBWOLFSSL_VERSION_HEX >> 24) & 0xFFF; + version->sw_minor_version = (LIBWOLFSSL_VERSION_HEX >> 12) & 0xFFF; + version->sw_patch_version = (LIBWOLFSSL_VERSION_HEX) & 0xFFF; + } +} + + +/* creates a new job type and passes it down to CryIf + * + * return E_OK on success + */ +static Std_ReturnType CreateAndRunJobType(uint32 id, + Crypto_JobPrimitiveInfoType* jobInfo, Crypto_JobInfoType* jobInfoType, + const uint8* data, uint32 dataSz, uint8* out, uint32* outSz, + Crypto_OperationModeType mode) +{ + WOLFSSL_JOBIO jobIO; + WOLFSSL_JOBTYPE jobType; + + XMEMSET(&jobIO, 0, sizeof(WOLFSSL_JOBIO)); + jobIO.inputPtr = data; + jobIO.inputLength = dataSz; + jobIO.outputPtr = out; + jobIO.outputLengthPtr = outSz; + jobIO.mode = mode; + + jobType.jobId = id; + jobType.jobState = CRYPTO_JOBSTATE_IDLE; + jobType.jobPrimitiveInputOutput = jobIO; + jobType.jobPrimitiveInfo = jobInfo; + jobType.jobInfo = jobInfoType; + jobType.jobRedirectionInfoRef = &redirect; + + return CryIf_ProcessJob(id, &jobType); +} + + +/* returns E_OK on success */ +static Std_ReturnType Csm_CBC_Operation(uint32 id, Crypto_OperationModeType mode, + const uint8* data, uint32 dataSz, uint8* out, uint32* outSz, + Crypto_ServiceInfoType service) +{ + Crypto_JobInfoType jobInfoType; + Crypto_PrimitiveInfoType pInfo; + Crypto_JobPrimitiveInfoType jobInfo; + + Crypto_AlgorithmInfoType algorithm = { + CRYPTO_ALGOFAM_AES, + CRYPTO_ALGOFAM_NOT_SET, + 16, /* 128 bit key length */ + CRYPTO_ALGOMODE_CBC + }; + + jobInfoType.jobId = id; + jobInfoType.jobPriority = 0; + + pInfo.resultLength = 16; /* 128 bit key length */ + pInfo.service = service; + pInfo.algorithm = algorithm; + + jobInfo.callbackId = 0; + jobInfo.primitiveInfo = &pInfo; + jobInfo.cryIfKeyId = 0; + jobInfo.processingType = CRYPTO_PROCESSING_SYNC; + jobInfo.callbackUpdateNotification = FALSE; + + return CreateAndRunJobType(id, &jobInfo, &jobInfoType, + data, dataSz, out, outSz, mode); +} + + +/* single shot encrypt + * returns E_OK on success */ +Std_ReturnType Csm_Encrypt(uint32 id, Crypto_OperationModeType mode, + const uint8* data, uint32 dataSz, uint8* out, uint32* outSz) +{ + WOLFSSL_ENTER("Csm_Encrypt"); + return Csm_CBC_Operation(id, mode, data, dataSz, out, outSz,CRYPTO_ENCRYPT); +} + + +/* single shot decrypt + * returns E_OK on success */ +Std_ReturnType Csm_Decrypt(uint32 id, Crypto_OperationModeType mode, + const uint8* data, uint32 dataSz, uint8* out, uint32* outSz) +{ + WOLFSSL_ENTER("Csm_Decrypt"); + return Csm_CBC_Operation(id, mode, data, dataSz, out, outSz,CRYPTO_DECRYPT); +} + + +/* returns E_OK on success */ +Std_ReturnType Csm_RandomGenerate(uint32 id, uint8* out, uint32* outSz) +{ + Crypto_JobInfoType jobInfoType; + Crypto_PrimitiveInfoType pInfo; + Crypto_JobPrimitiveInfoType jobInfo; + + Crypto_AlgorithmInfoType algorithm = { + CRYPTO_ALGOFAM_DRBG, + CRYPTO_ALGOFAM_NOT_SET, + 0, /* key length */ + CRYPTO_ALGOMODE_NOT_SET + }; + + jobInfoType.jobId = id; + jobInfoType.jobPriority = 0; + + pInfo.resultLength = 0; + pInfo.service = CRYPTO_RANDOMGENERATE; + pInfo.algorithm = algorithm; + + jobInfo.callbackId = 0; + jobInfo.primitiveInfo = &pInfo; + jobInfo.cryIfKeyId = 0; + jobInfo.processingType = CRYPTO_PROCESSING_SYNC; + jobInfo.callbackUpdateNotification = FALSE; + + return CreateAndRunJobType(id, &jobInfo, &jobInfoType, + NULL, 0, out, outSz, CRYPTO_OPERATIONMODE_SINGLECALL); +} + + +/* returns E_OK on success */ +Std_ReturnType Csm_KeyElementSet(uint32 keyId, uint32 eId, + const uint8* key, uint32 keySz) +{ + return CryIf_KeyElementSet(keyId, eId, key, keySz); +} + +#endif /* NO_WOLFSSL_AUTOSAR_CSM */ +#endif /* WOLFSSL_AUTOSAR */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/include.am 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,23 @@ + +EXTRA_DIST += wolfcrypt/src/port/autosar/csm.c \ + wolfcrypt/src/port/autosar/crypto.c \ + wolfcrypt/src/port/autosar/cryif.c \ + wolfcrypt/src/port/autosar/README.md \ + wolfcrypt/src/port/autosar/test.c + +if BUILD_AUTOSAR +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/autosar/csm.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/autosar/crypto.c +src_libwolfssl@LIBSUFFIX@_la_SOURCES += wolfcrypt/src/port/autosar/cryif.c + +if BUILD_TESTS +check_PROGRAMS += wolfcrypt/src/port/autosar/test.test +noinst_PROGRAMS += wolfcrypt/src/port/autosar/test.test + +wolfcrypt_src_port_autosar_test_test_SOURCES = \ + wolfcrypt/src/port/autosar/test.c +wolfcrypt_src_port_autosar_test_test_LDADD = \ + src/libwolfssl.la $(LIB_STATIC_ADD) +wolfcrypt_src_port_autosar_test_test_DEPENDENCIES = src/libwolfssl.la +endif +endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/test.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/test.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/test.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/autosar/test.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,430 @@ +/* test.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#define BLOCK_SIZE 16 + +static int singleshot_test(void) +{ + Std_ReturnType ret; + + uint8 cipher[BLOCK_SIZE * 2]; + uint8 plain[BLOCK_SIZE * 2]; + + uint32 cipherSz = 0; + uint32 plainSz = 0; + const uint8 msg[] = { /* "Now is the time for all " w/o trailing 0 */ + 0x6e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20 + }; + const uint8 verify[] = + { + 0x95,0x94,0x92,0x57,0x5f,0x42,0x81,0x53, + 0x2c,0xcc,0x9d,0x46,0x77,0xa2,0x33,0xcb + }; + const uint8 key[] = "0123456789abcdef "; + const uint8 iv[] = "1234567890abcdef "; + + XMEMSET(cipher, 0, BLOCK_SIZE); + XMEMSET(plain, 0, BLOCK_SIZE); + + /* set key that will be used for encryption */ + ret = Csm_KeyElementSet(0U, CRYPTO_KE_CIPHER_KEY, key, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key"); + return -1; + } + + ret = Csm_KeyElementSet(1U, CRYPTO_KE_CIPHER_IV, iv, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key IV"); + return -1; + } + + /* encrypt data using AES CBC */ + ret = Csm_Encrypt(1U, CRYPTO_OPERATIONMODE_SINGLECALL, msg, BLOCK_SIZE, + cipher, &cipherSz); + if (ret != E_OK) { + printf("Issue with encrypting msg"); + return -1; + } + + if (XMEMCMP(cipher, verify, BLOCK_SIZE) != 0) { + printf("Error with cipher data\n"); + return -1; + } + + /* set key that will be used for decryption */ + ret = Csm_KeyElementSet(0U, CRYPTO_KE_CIPHER_KEY, key, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key"); + return -1; + } + + ret = Csm_KeyElementSet(1U, CRYPTO_KE_CIPHER_IV, iv, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key IV"); + return -1; + } + + /* decrypt data using AES CBC */ + ret = Csm_Decrypt(2U, CRYPTO_OPERATIONMODE_SINGLECALL, cipher, BLOCK_SIZE, + plain, &plainSz); + if (ret != E_OK) { + printf("Issue with decrypting msg"); + return -1; + } + + if (XMEMCMP(msg, plain, BLOCK_SIZE) != 0) { + printf("Error with plain data\n"); + return -1; + } + + return 0; +} + + +static int update_test(void) +{ + Std_ReturnType ret; + + uint8 cipher[BLOCK_SIZE * 3]; + uint8 plain[BLOCK_SIZE * 3]; + + uint32 cipherSz = 0; + uint32 plainSz = 0; + const uint8 msg[] = { /* "Now is the time for all " w/o trailing 0 */ + 0x6e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20 + }; + const uint8 key[] = "0123456789abcdef "; + const uint8 iv[] = "1234567890abcdef "; + + XMEMSET(cipher, 0, BLOCK_SIZE); + XMEMSET(plain, 0, BLOCK_SIZE); + + /* set key that will be used for encryption */ + ret = Csm_KeyElementSet(0U, CRYPTO_KE_CIPHER_KEY, key, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key"); + return -1; + } + + ret = Csm_KeyElementSet(1U, CRYPTO_KE_CIPHER_IV, iv, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key IV"); + return -1; + } + + /* encrypt data using AES CBC */ + ret = Csm_Encrypt(1U, + CRYPTO_OPERATIONMODE_START | CRYPTO_OPERATIONMODE_UPDATE, + msg, BLOCK_SIZE, cipher, &cipherSz); + if (ret != E_OK) { + printf("Issue with encrypting msg"); + return -1; + } + + ret = Csm_Encrypt(1U, CRYPTO_OPERATIONMODE_UPDATE, msg, BLOCK_SIZE, + cipher + BLOCK_SIZE, &cipherSz); + if (ret != E_OK) { + printf("Issue with encrypting msg"); + return -1; + } + + ret = Csm_Encrypt(1U, + CRYPTO_OPERATIONMODE_UPDATE | CRYPTO_OPERATIONMODE_FINISH, + msg, BLOCK_SIZE, cipher + (BLOCK_SIZE * 2), &cipherSz); + if (ret != E_OK) { + printf("Issue with encrypting msg"); + return -1; + } + + /* set key that will be used for decryption */ + ret = Csm_KeyElementSet(0U, CRYPTO_KE_CIPHER_KEY, key, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key"); + return -1; + } + + ret = Csm_KeyElementSet(1U, CRYPTO_KE_CIPHER_IV, iv, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key IV"); + return -1; + } + + /* decrypt data using AES CBC */ + ret = Csm_Decrypt(2U, + CRYPTO_OPERATIONMODE_START | CRYPTO_OPERATIONMODE_UPDATE, + cipher, BLOCK_SIZE, plain, &plainSz); + if (ret != E_OK) { + printf("Issue with decrypting msg"); + return -1; + } + + ret = Csm_Decrypt(2U, CRYPTO_OPERATIONMODE_UPDATE, cipher + BLOCK_SIZE, + BLOCK_SIZE, plain + BLOCK_SIZE, &plainSz); + if (ret != E_OK) { + printf("Issue with decrypting msg"); + return -1; + } + + ret = Csm_Decrypt(2U, + CRYPTO_OPERATIONMODE_UPDATE | CRYPTO_OPERATIONMODE_FINISH, + cipher + (BLOCK_SIZE * 2), BLOCK_SIZE, + plain + (BLOCK_SIZE * 2), &plainSz); + if (ret != E_OK) { + printf("Issue with decrypting msg"); + return -1; + } + + if (XMEMCMP(msg, plain, BLOCK_SIZE) != 0 || + XMEMCMP(msg, plain + BLOCK_SIZE, BLOCK_SIZE) != 0 || + XMEMCMP(msg, plain + (BLOCK_SIZE * 2), BLOCK_SIZE) != 0) { + printf("Error with plain data\n"); + return -1; + } + + return 0; +} + + +static int random_test(void) +{ + Std_ReturnType ret; + + int i; + uint8 j; + uint8 data[BLOCK_SIZE * 3]; + uint32 dataSz; + XMEMSET(data, 0, BLOCK_SIZE * 3); + + /* make three calls, filling up data buffer */ + for (i = 0; i < 3; i++) { + dataSz = BLOCK_SIZE; + ret = Csm_RandomGenerate(0U, data + (i * BLOCK_SIZE), &dataSz); + if (ret != E_OK) { + printf("Issue with getting random data block"); + return -1; + } + + if (dataSz != BLOCK_SIZE) { + printf("Did not get full block of random data"); + return -1; + } + } + + /* simple test that is not all 0's still after random generate */ + j = 0; + dataSz = sizeof(data); + for (i = 0; i < (int)dataSz; i++) { + j |= data[i]; + } + if (j == 0) { + printf("call to random generate produced all 0's"); + return -1; + } + + /* fill full data buffer all at once */ + dataSz = sizeof(data); + ret = Csm_RandomGenerate(0U, data, &dataSz); + if (ret != E_OK) { + printf("Issue with getting random data block"); + return -1; + } + + if (dataSz != sizeof(data)) { + printf("Did not get full block of random data"); + return -1; + } + return 0; +} + + +#ifndef MAX_KEYSTORE + /* default max key slots from crypto.c */ + #define MAX_KEYSTORE 15 +#endif +static int key_test(void) +{ + Std_ReturnType ret; + + uint8 i; + uint8 max = MAX_KEYSTORE; + uint8 data[BLOCK_SIZE]; + uint32 dataSz; + XMEMSET(data, 0, BLOCK_SIZE); + + for (i = 0; i < max; i++) { + dataSz = BLOCK_SIZE; + ret = Csm_RandomGenerate(0U, data, &dataSz); + if (ret != E_OK) { + printf("Issue with getting random data block for key"); + return -1; + } + + if (dataSz != BLOCK_SIZE) { + printf("Did not get full block of random data"); + return -1; + } + + ret = Csm_KeyElementSet(i, CRYPTO_KE_CIPHER_KEY, data, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key id %d", i); + return -1; + } + } + + /* try creating one more key for fail case */ + ret = Csm_KeyElementSet(i, CRYPTO_KE_CIPHER_KEY, data, BLOCK_SIZE); + if (ret == E_OK) { + printf("Created more keys than should be possible"); + return -1; + } + + return 0; +} + +#ifdef REDIRECTION_CONFIG +static int redirect_test() +{ + Std_ReturnType ret; + + uint8 cipher[BLOCK_SIZE * 2]; + uint32 cipherSz = 0; + const uint8 msg[] = { /* "Now is the time for all " w/o trailing 0 */ + 0x6e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, + 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20 + }; + const uint8 verify[] = + { + 0x95,0x94,0x92,0x57,0x5f,0x42,0x81,0x53, + 0x2c,0xcc,0x9d,0x46,0x77,0xa2,0x33,0xcb + }; + const uint8 key[] = "0123456789abcdef "; /* align */ + const uint8 iv[] = "1234567890abcdef "; /* align */ + unsigned int i; + + XMEMSET(cipher, 0, BLOCK_SIZE); + + /* fill keystore with bad keys */ + for (i = 0; i < MAX_KEYSTORE; i++) { + ret = Csm_KeyElementSet(i, CRYPTO_KE_CIPHER_KEY, verify, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key"); + return -1; + } + } + + /* set specific key that will be used for encryption */ + ret = Csm_KeyElementSet(REDIRECTION_IN1_KEYID, REDIRECTION_IN1_KEYELMID, + key, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key"); + return -1; + } + + ret = Csm_KeyElementSet(REDIRECTION_IN2_KEYID, REDIRECTION_IN2_KEYELMID, + iv, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key IV"); + return -1; + } + + /* encrypt data using AES CBC */ + ret = Csm_Encrypt(0U, CRYPTO_OPERATIONMODE_SINGLECALL, msg, BLOCK_SIZE, + cipher, &cipherSz); + if (ret != E_OK) { + printf("Issue with encrypting msg"); + return -1; + } + + if (XMEMCMP(cipher, verify, BLOCK_SIZE) != 0) { + printf("Error with cipher data "); + return -1; + } + + /* now set bad key to be used for encryption */ + ret = Csm_KeyElementSet(REDIRECTION_IN1_KEYID, REDIRECTION_IN1_KEYELMID, + verify, BLOCK_SIZE); + if (ret != E_OK) { + printf("Issue with setting key "); + return -1; + } + + /* encrypt data using AES CBC */ + ret = Csm_Encrypt(0U, CRYPTO_OPERATIONMODE_SINGLECALL, msg, BLOCK_SIZE, + cipher, &cipherSz); + if (ret != E_OK) { + printf("Issue with encrypting msg "); + return -1; + } + + if (XMEMCMP(cipher, verify, BLOCK_SIZE) == 0) { + printf("Error with cipher data "); + return -1; + } + + return 0; +} +#endif /* REDIRECTION_CONFIG */ + +/* takes in test function test() and name of test + * returns 1 if test failed and 0 if passed */ +static int run_test(int(test)(void), const char* name) +{ + printf("%s", name); + if (test() != 0) { + printf("fail\n"); + return 1; + } + else { + printf("pass\n"); + } + return 0; +} + + +/* AES block size */ +int main(int argc, char* argv[]) +{ + int ret = 0; + (void)argv; + (void)argc; + + wolfSSL_Debugging_ON(); + Csm_Init(NULL); + + ret |= run_test(singleshot_test, "singleshot_test ... "); + ret |= run_test(update_test, "update_test ... "); + ret |= run_test(random_test, "random_test ... "); + ret |= run_test(key_test, "key_test ... "); +#ifdef REDIRECTION_CONFIG + ret |= run_test(redirect_test, "redirect_test ... "); +#endif /* REDIRECTION_CONFIG */ + return ret; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_driver.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_driver.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_driver.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_driver.c 2024-08-03 07:30:00.000000000 +0000 @@ -129,7 +129,7 @@ } - //D0JQCR_LS + /* D0JQCR_LS */ printf("Next command to be executed = 0x%08X\n", CAAM_READ(0x8804)); printf("Desc = 0x%08X\n", desc->caam->ring.Desc); @@ -1840,7 +1840,7 @@ static int SetupJobRing(struct JobRing* r) { - /* get enviornment specific addresses to use for job rings */ + /* get environment specific addresses to use for job rings */ CAAM_SET_JOBRING_ADDR(&r->BaseAddr, &r->JobIn, &r->VirtualIn); /* register the in/out and sizes of job ring */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_qnx.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_qnx.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_qnx.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/caam_qnx.c 2024-08-03 07:30:00.000000000 +0000 @@ -27,7 +27,7 @@ * wolfssl/wolfcrypt/- path includes other than * wolfssl/wolfcrypt/port/caam/caam_* should be avoided!! */ #undef WC_NO_HARDEN -#define WC_NO_HARDEN /* silence warning, it is irrelavent here */ +#define WC_NO_HARDEN /* silence warning, it is irrelevant here */ #include #if defined(__QNX__) || defined(__QNXNTO__) @@ -55,7 +55,7 @@ static unsigned int localPhy = 0; sem_t localMemSem; -/* Can be overriden, variable for how large of a local buffer to have. +/* Can be overridden, variable for how large of a local buffer to have. * This allows for large performance gains when avoiding mapping new memory * for each operation. */ #ifndef WOLFSSL_CAAM_QNX_MEMORY @@ -1641,8 +1641,9 @@ #if 0 static int getSupported(char* in) { - //printf("CAAM Status [0x%8.8x] = 0x%8.8x\n", - // CAAM_STATUS, WC_CAAM_READ(CAAM_STATUS)); + /* printf("CAAM Status [0x%8.8x] = 0x%8.8x\n", + * CAAM_STATUS, WC_CAAM_READ(CAAM_STATUS)); + */ printf("CAAM Version MS Register [0x%8.8x] = 0x%8.8x\n", CAAM_VERSION_MS, CAAM_READ(CAAM_VERSION_MS)); printf("CAAM Version LS Register [0x%8.8x] = 0x%8.8x\n", diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_ecdsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_ecdsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_ecdsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_ecdsa.c 2024-08-03 07:30:00.000000000 +0000 @@ -352,7 +352,7 @@ buf[idx].Length = keySz; } buf[idx].TheAddress = (CAAM_ADDRESS)pk; - args[0] = key->blackKey; /* potentail black key, not in sm */ + args[0] = key->blackKey; /* potential black key, not in sm */ } idx++; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_fsl_nxp.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_fsl_nxp.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_fsl_nxp.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_fsl_nxp.c 2024-08-03 07:30:00.000000000 +0000 @@ -838,7 +838,7 @@ buf[1].Length, (byte*)buf[2].TheAddress, buf[2].Length, (byte*)buf[0].TheAddress, buf[0].Length, CAAM_ENCAP_BLOB, - (args[0] = 0)? CAAM_RED_BLOB : CAAM_BLACK_BLOB) + (args[0] == 0)? CAAM_RED_BLOB : CAAM_BLACK_BLOB) != kStatus_Success) { ret = WC_HW_E; } @@ -849,7 +849,7 @@ (byte*)buf[2].TheAddress, buf[2].Length, (byte*)buf[0].TheAddress, buf[0].Length, CAAM_DECAP_BLOB, - (args[0] = 0)? CAAM_RED_BLOB : CAAM_BLACK_BLOB) + (args[0] == 0)? CAAM_RED_BLOB : CAAM_BLACK_BLOB) != kStatus_Success) { ret = WC_HW_E; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hash.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hash.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hash.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hash.c 2024-08-03 07:30:00.000000000 +0000 @@ -26,7 +26,7 @@ #include #if defined(WOLFSSL_CAAM) && defined(WOLFSSL_CAAM_HASH) \ - && !defined(WOLFSSL_IMXRT1170_CAAM) + && !defined(WOLFSSL_IMXRT1170_CAAM) #include #include diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hmac.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hmac.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hmac.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_hmac.c 2024-08-03 07:30:00.000000000 +0000 @@ -59,7 +59,7 @@ hmac->keyLen); if (ret != 0) { WOLFSSL_MSG("Error with set key"); - if (ret == HASH_TYPE_E) { + if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E)) { ret = CRYPTOCB_UNAVAILABLE; /* that hash type is not supported*/ } } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_init.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_init.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_init.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_init.c 2024-08-03 07:30:00.000000000 +0000 @@ -79,7 +79,7 @@ /* used to route crypto operations through crypto callback */ static int wc_CAAM_router(int devId, wc_CryptoInfo* info, void* ctx) { - int ret = CRYPTOCB_UNAVAILABLE; + int ret = WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE); (void)ctx; (void)devId; @@ -694,7 +694,7 @@ } #endif /* WOLFSSL_CAAM_BLOB */ -/* outSz gets set to key size plus 16 for mac and padding +/* outSz gets set to key size plus 16 for mac and padding * return 0 on success */ int wc_caamCoverKey(byte* in, word32 inSz, byte* out, word32* outSz, int flag) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_seco.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_seco.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_seco.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/caam/wolfcaam_seco.c 2024-08-03 07:30:00.000000000 +0000 @@ -1228,7 +1228,7 @@ } -/* trasnlates the HSM error to wolfSSL error and does debug print out */ +/* Translates the HSM error to wolfSSL error and does debug print out */ int wc_TranslateHSMError(int current, hsm_err_t err) { int ret = -1; @@ -1323,7 +1323,7 @@ break; default: - WOLFSSL_MSG("SECO HSM: unkown error value found"); + WOLFSSL_MSG("SECO HSM: unknown error value found"); } if (current != 0) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/cavium/cavium_octeon_sync.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cavium/cavium_octeon_sync.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/cavium/cavium_octeon_sync.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cavium/cavium_octeon_sync.c 2024-08-03 07:30:00.000000000 +0000 @@ -775,7 +775,7 @@ static int myCryptoDevCb(int devIdArg, wc_CryptoInfo* info, void* ctx) { - int ret = NOT_COMPILED_IN; /* return this to bypass HW and use SW */ + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); /* return this to bypass HW and use SW */ if (info == NULL) return BAD_FUNC_ARG; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9 @@ +You will need to have the CUDA libraries and toolchains installed to be able to use this. For the simplest +setup, I used the 'nvidia/cuda:12.3.2-devel-ubuntu22.04' container with the '--gpus=all' flag. Note that +Docker must be set up to allow passing through the CUDA instructions to the host. The container only needs +'automake' and 'libtool' installed: `apt update && apt install -y automake libtool`. + +This code was tested with the following: + ./configure --enable-all --disable-shared --disable-crl-monitor --enable-cuda CC=nvcc && make check + +There are still things that can be done to optimize, but the basic functionality is there. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/aes-cuda.cu mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/aes-cuda.cu --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/aes-cuda.cu 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/cuda/aes-cuda.cu 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1096 @@ +/* aes.cu + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* + +DESCRIPTION +This library provides the interfaces to the Advanced Encryption Standard (AES) +for encrypting and decrypting data. AES is the standard known for a symmetric +block cipher mechanism that uses n-bit binary string parameter key with 128-bits, +192-bits, and 256-bits of key sizes. + +*/ +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include + +#include + +#ifdef WOLFSSL_AESNI +#include +#include +#include +#endif /* WOLFSSL_AESNI */ + +#include + +#ifdef WOLF_CRYPTO_CB + #include +#endif + +#ifdef WOLFSSL_SECO_CAAM +#include +#endif + +#ifdef WOLFSSL_IMXRT_DCP + #include +#endif +#if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_CRYPT) + #include +#endif + +#if defined(WOLFSSL_AES_SIV) + #include +#endif /* WOLFSSL_AES_SIV */ + +#if defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_AES) + #include +#endif + + +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #define WOLFSSL_HAVE_MIN + #define WOLFSSL_HAVE_MAX +/* #include */ +#endif +/* This routine performs a left circular arithmetic shift of by value. */ + +extern "C" { + +#if !defined(WOLFSSL_TI_CRYPT) + +#define rotlFixed(x, y) ( (x << y) | (x >> (sizeof(x) * 8 - y)) ) + +/* This routine performs a right circular arithmetic shift of by value. */ +#define rotrFixed(x, y) ( (x >> y) | (x << (sizeof(x) * 8 - y)) ) + +#ifdef WC_RC2 + +/* This routine performs a left circular arithmetic shift of by value */ +static WC_INLINE word16 rotlFixed16(word16 x, word16 y) +{ + return (x << y) | (x >> (sizeof(x) * 8 - y)); +} + + +/* This routine performs a right circular arithmetic shift of by value */ +static WC_INLINE word16 rotrFixed16(word16 x, word16 y) +{ + return (x >> y) | (x << (sizeof(x) * 8 - y)); +} + +#endif /* WC_RC2 */ + +/* This routine performs a byte swap of 32-bit word value. */ +#if defined(__CCRX__) && !defined(NO_INLINE) /* shortest version for CC-RX */ + #define ByteReverseWord32(value, outRef) ( *outRef = _builtin_revl(value) ) +#else +__device__ +static WC_INLINE word32 ByteReverseWord32(word32 value) +{ +#ifdef PPC_INTRINSICS + /* PPC: load reverse indexed instruction */ + return (word32)__lwbrx(&value,0); +#elif defined(__ICCARM__) + return (word32)__REV(value); +#elif defined(KEIL_INTRINSICS) + return (word32)__rev(value); +#elif defined(__CCRX__) + return (word32)_builtin_revl(value); +#elif defined(WOLF_ALLOW_BUILTIN) && \ + defined(__GNUC_PREREQ) && __GNUC_PREREQ(4, 3) + return (word32)__builtin_bswap32(value); +#elif defined(WOLFSSL_BYTESWAP32_ASM) && defined(__GNUC__) && \ + defined(__aarch64__) + __asm__ volatile ( + "REV32 %0, %0 \n" + : "+r" (value) + : + ); + return value; +#elif defined(WOLFSSL_BYTESWAP32_ASM) && defined(__GNUC__) && \ + (defined(__thumb__) || defined(__arm__)) + __asm__ volatile ( + "REV %0, %0 \n" + : "+r" (value) + : + ); + return value; +#elif defined(FAST_ROTATE) + /* 5 instructions with rotate instruction, 9 without */ + return (rotrFixed(value, 8U) & 0xff00ff00) | + (rotlFixed(value, 8U) & 0x00ff00ff); +#else + /* 6 instructions with rotate instruction, 8 without */ + value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); + return rotlFixed(value, 16U); +#endif +} +#endif /* ! (__CCRX__ && !NO_INLINE) */ + +#if defined(STM32_CRYPTO) +#elif defined(HAVE_COLDFIRE_SEC) +#elif defined(FREESCALE_LTC) +#elif defined(FREESCALE_MMCAU) +#elif defined(WOLFSSL_PIC32MZ_CRYPT) +#elif defined(WOLFSSL_NRF51_AES) +#elif defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_AES) +#elif defined(WOLFSSL_AESNI) +#elif (defined(WOLFSSL_IMX6_CAAM) && !defined(NO_IMX6_CAAM_AES) \ + && !defined(WOLFSSL_QNX_CAAM)) || \ + ((defined(WOLFSSL_AFALG) || defined(WOLFSSL_DEVCRYPTO_AES)) && \ + defined(HAVE_AESCCM)) +#elif defined(WOLFSSL_AFALG) + /* implemented in wolfcrypt/src/port/af_alg/afalg_aes.c */ + +#elif defined(WOLFSSL_DEVCRYPTO_AES) + /* implemented in wolfcrypt/src/port/devcrypto/devcrypto_aes.c */ + +#elif defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_AES) +#elif defined(WOLFSSL_KCAPI_AES) +#elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_AES) +/* implemented in wolfcrypt/src/port/psa/psa_aes.c */ + +#else + + /* using wolfCrypt software implementation */ + #define NEED_AES_TABLES +#endif + +#if !defined(NO_AES) && !defined(WOLFSSL_TI_CRYPT) && !defined(WOLFSSL_ARMASM) && \ + defined(NEED_AES_TABLES) && (defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AESCCM) || defined(HAVE_AESGCM)) && \ + defined(HAVE_CUDA) + +#define GETBYTE(x, y) (word32)((byte)((x) >> (8 * (y)))) + +#ifndef WC_CACHE_LINE_SZ + #if defined(__x86_64__) || defined(_M_X64) || \ + (defined(__ILP32__) && (__ILP32__ >= 1)) + #define WC_CACHE_LINE_SZ 64 + #else + /* default cache line size */ + #define WC_CACHE_LINE_SZ 32 + #endif +#endif + +#if WC_CACHE_LINE_SZ == 128 + #define WC_CACHE_LINE_BITS 5 + #define WC_CACHE_LINE_MASK_HI 0xe0 + #define WC_CACHE_LINE_MASK_LO 0x1f + #define WC_CACHE_LINE_ADD 0x20 +#elif WC_CACHE_LINE_SZ == 64 + #define WC_CACHE_LINE_BITS 4 + #define WC_CACHE_LINE_MASK_HI 0xf0 + #define WC_CACHE_LINE_MASK_LO 0x0f + #define WC_CACHE_LINE_ADD 0x10 +#elif WC_CACHE_LINE_SZ == 32 + #define WC_CACHE_LINE_BITS 3 + #define WC_CACHE_LINE_MASK_HI 0xf8 + #define WC_CACHE_LINE_MASK_LO 0x07 + #define WC_CACHE_LINE_ADD 0x08 +#elif WC_CACHE_LINE_SZ == 16 + #define WC_CACHE_LINE_BITS 2 + #define WC_CACHE_LINE_MASK_HI 0xfc + #define WC_CACHE_LINE_MASK_LO 0x03 + #define WC_CACHE_LINE_ADD 0x04 +#else + #error Cache line size not supported +#endif + +#ifndef WOLFSSL_AES_SMALL_TABLES +__device__ +const FLASH_QUALIFIER word32 Te_CUDA[4][256] = { +{ + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}, +{ + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}, +{ + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}, +{ + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +} +}; + + +__device__ +static word32 GetTable(const word32* t, byte o) +{ + word32 e = 0; +#if WC_CACHE_LINE_SZ == 64 + byte hi = o & 0xf0; + byte lo = o & 0x0f; + + e = t[lo + 0x00] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x10] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x20] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x30] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x40] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x50] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x60] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x70] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x80] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0x90] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0xa0] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0xb0] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0xc0] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0xd0] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0xe0] & ((word32)0 - (((word32)hi - 0x01) >> 31)); hi -= 0x10; + e |= t[lo + 0xf0] & ((word32)0 - (((word32)hi - 0x01) >> 31)); +#else + int i; + byte hi = o & WC_CACHE_LINE_MASK_HI; + byte lo = o & WC_CACHE_LINE_MASK_LO; + + for (i = 0; i < 256; i += (1 << WC_CACHE_LINE_BITS)) { + e |= t[lo + i] & ((word32)0 - (((word32)hi - 0x01) >> 31)); + hi -= WC_CACHE_LINE_ADD; + } +#endif + return e; +} + +__device__ +static void GetTable_Multi(const word32* t, word32* t0, byte o0, + word32* t1, byte o1, word32* t2, byte o2, word32* t3, byte o3) +{ + word32 e0 = 0; + word32 e1 = 0; + word32 e2 = 0; + word32 e3 = 0; + byte hi0 = o0 & WC_CACHE_LINE_MASK_HI; + byte lo0 = o0 & WC_CACHE_LINE_MASK_LO; + byte hi1 = o1 & WC_CACHE_LINE_MASK_HI; + byte lo1 = o1 & WC_CACHE_LINE_MASK_LO; + byte hi2 = o2 & WC_CACHE_LINE_MASK_HI; + byte lo2 = o2 & WC_CACHE_LINE_MASK_LO; + byte hi3 = o3 & WC_CACHE_LINE_MASK_HI; + byte lo3 = o3 & WC_CACHE_LINE_MASK_LO; + int i; + + for (i = 0; i < 256; i += (1 << WC_CACHE_LINE_BITS)) { + e0 |= t[lo0 + i] & ((word32)0 - (((word32)hi0 - 0x01) >> 31)); + hi0 -= WC_CACHE_LINE_ADD; + e1 |= t[lo1 + i] & ((word32)0 - (((word32)hi1 - 0x01) >> 31)); + hi1 -= WC_CACHE_LINE_ADD; + e2 |= t[lo2 + i] & ((word32)0 - (((word32)hi2 - 0x01) >> 31)); + hi2 -= WC_CACHE_LINE_ADD; + e3 |= t[lo3 + i] & ((word32)0 - (((word32)hi3 - 0x01) >> 31)); + hi3 -= WC_CACHE_LINE_ADD; + } + *t0 = e0; + *t1 = e1; + *t2 = e2; + *t3 = e3; +} + +/* load 4 Te Tables into cache by cache line stride */ +__device__ +static WARN_UNUSED_RESULT WC_INLINE word32 PreFetchTe(void) +{ +#ifndef WOLFSSL_AES_TOUCH_LINES + word32 x = 0; + int i,j; + + for (i = 0; i < 4; i++) { + /* 256 elements, each one is 4 bytes */ + for (j = 0; j < 256; j += WC_CACHE_LINE_SZ/4) { + x &= Te_CUDA[i][j]; + } + } + return x; +#else + return 0; +#endif +} +#else +__device__ static const byte Tsbox[256] = { + 0x63U, 0x7cU, 0x77U, 0x7bU, 0xf2U, 0x6bU, 0x6fU, 0xc5U, + 0x30U, 0x01U, 0x67U, 0x2bU, 0xfeU, 0xd7U, 0xabU, 0x76U, + 0xcaU, 0x82U, 0xc9U, 0x7dU, 0xfaU, 0x59U, 0x47U, 0xf0U, + 0xadU, 0xd4U, 0xa2U, 0xafU, 0x9cU, 0xa4U, 0x72U, 0xc0U, + 0xb7U, 0xfdU, 0x93U, 0x26U, 0x36U, 0x3fU, 0xf7U, 0xccU, + 0x34U, 0xa5U, 0xe5U, 0xf1U, 0x71U, 0xd8U, 0x31U, 0x15U, + 0x04U, 0xc7U, 0x23U, 0xc3U, 0x18U, 0x96U, 0x05U, 0x9aU, + 0x07U, 0x12U, 0x80U, 0xe2U, 0xebU, 0x27U, 0xb2U, 0x75U, + 0x09U, 0x83U, 0x2cU, 0x1aU, 0x1bU, 0x6eU, 0x5aU, 0xa0U, + 0x52U, 0x3bU, 0xd6U, 0xb3U, 0x29U, 0xe3U, 0x2fU, 0x84U, + 0x53U, 0xd1U, 0x00U, 0xedU, 0x20U, 0xfcU, 0xb1U, 0x5bU, + 0x6aU, 0xcbU, 0xbeU, 0x39U, 0x4aU, 0x4cU, 0x58U, 0xcfU, + 0xd0U, 0xefU, 0xaaU, 0xfbU, 0x43U, 0x4dU, 0x33U, 0x85U, + 0x45U, 0xf9U, 0x02U, 0x7fU, 0x50U, 0x3cU, 0x9fU, 0xa8U, + 0x51U, 0xa3U, 0x40U, 0x8fU, 0x92U, 0x9dU, 0x38U, 0xf5U, + 0xbcU, 0xb6U, 0xdaU, 0x21U, 0x10U, 0xffU, 0xf3U, 0xd2U, + 0xcdU, 0x0cU, 0x13U, 0xecU, 0x5fU, 0x97U, 0x44U, 0x17U, + 0xc4U, 0xa7U, 0x7eU, 0x3dU, 0x64U, 0x5dU, 0x19U, 0x73U, + 0x60U, 0x81U, 0x4fU, 0xdcU, 0x22U, 0x2aU, 0x90U, 0x88U, + 0x46U, 0xeeU, 0xb8U, 0x14U, 0xdeU, 0x5eU, 0x0bU, 0xdbU, + 0xe0U, 0x32U, 0x3aU, 0x0aU, 0x49U, 0x06U, 0x24U, 0x5cU, + 0xc2U, 0xd3U, 0xacU, 0x62U, 0x91U, 0x95U, 0xe4U, 0x79U, + 0xe7U, 0xc8U, 0x37U, 0x6dU, 0x8dU, 0xd5U, 0x4eU, 0xa9U, + 0x6cU, 0x56U, 0xf4U, 0xeaU, 0x65U, 0x7aU, 0xaeU, 0x08U, + 0xbaU, 0x78U, 0x25U, 0x2eU, 0x1cU, 0xa6U, 0xb4U, 0xc6U, + 0xe8U, 0xddU, 0x74U, 0x1fU, 0x4bU, 0xbdU, 0x8bU, 0x8aU, + 0x70U, 0x3eU, 0xb5U, 0x66U, 0x48U, 0x03U, 0xf6U, 0x0eU, + 0x61U, 0x35U, 0x57U, 0xb9U, 0x86U, 0xc1U, 0x1dU, 0x9eU, + 0xe1U, 0xf8U, 0x98U, 0x11U, 0x69U, 0xd9U, 0x8eU, 0x94U, + 0x9bU, 0x1eU, 0x87U, 0xe9U, 0xceU, 0x55U, 0x28U, 0xdfU, + 0x8cU, 0xa1U, 0x89U, 0x0dU, 0xbfU, 0xe6U, 0x42U, 0x68U, + 0x41U, 0x99U, 0x2dU, 0x0fU, 0xb0U, 0x54U, 0xbbU, 0x16U +}; + +#define AES_XTIME(x) ((byte)((byte)((x) << 1) ^ ((0 - ((x) >> 7)) & 0x1b))) + +#define col_mul(t, i2, i3, ia, ib) \ + ( GETBYTE(t, ia) ^ GETBYTE(t, ib) ^ GETBYTE(t, i3) ^ AES_XTIME(GETBYTE(t, i2) ^ GETBYTE(t, i3)) ) + +#define GetTable(t, o) t[o] +#define GetTable8(t, o) t[o] +#define GetTable_Multi(t, t0, o0, t1, o1, t2, o2, t3, o3) \ + *(t0) = (t)[o0]; *(t1) = (t)[o1]; *(t2) = (t)[o2]; *(t3) = (t)[o3] +#define XorTable_Multi(t, t0, o0, t1, o1, t2, o2, t3, o3) \ + *(t0) ^= (t)[o0]; *(t1) ^= (t)[o1]; *(t2) ^= (t)[o2]; *(t3) ^= (t)[o3] +#define GetTable8_4(t, o0, o1, o2, o3) \ + (((word32)(t)[o0] << 24) | ((word32)(t)[o1] << 16) | \ + ((word32)(t)[o2] << 8) | ((word32)(t)[o3] << 0)) + +/* load sbox into cache by cache line stride */ +#ifndef WOLFSSL_AES_TOUCH_LINES + #define PreFetchSBox(x) { \ + x = 0; \ + int i; \ + for (i = 0; i < 256; i += WC_CACHE_LINE_SZ/4) { \ + x &= Tsbox[i]; \ + } \ + } +#else + #define PreFetchSBox(x) ( x = 0 ) +#endif +#endif + +#if !defined(WC_AES_BITSLICED) +/* Encrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] inBlock Block to encrypt. + * @param [out] outBlock Encrypted block. + * @param [in] r Rounds divided by 2. + * @param [in] sz Number of blocks to encrypt + */ +__global__ void AesEncrypt_C_CUDA(word32* rkBase, const byte* inBlockBase, byte* outBlockBase, + word32 r, word32 sz) +{ + word32 s0, s1, s2, s3; + word32 t0, t1, t2, t3; + word32 sBox; + int index = blockIdx.x * blockDim.x + threadIdx.x; + int stride = blockDim.x * gridDim.x; + const byte* inBlock = inBlockBase; + byte* outBlock = outBlockBase; + word32* rk; + + for (int i = index; i < sz; i += stride) { + rk = rkBase; + inBlock = inBlockBase + i * 4 * sizeof(s0); + outBlock = outBlockBase + i * 4 * sizeof(s0); + + /* + * map byte array block to cipher state + * and add initial round key: + */ + XMEMCPY(&s0, inBlock, sizeof(s0)); + XMEMCPY(&s1, inBlock + sizeof(s0), sizeof(s1)); + XMEMCPY(&s2, inBlock + 2 * sizeof(s0), sizeof(s2)); + XMEMCPY(&s3, inBlock + 3 * sizeof(s0), sizeof(s3)); + +#ifdef LITTLE_ENDIAN_ORDER + s0 = ByteReverseWord32(s0); + s1 = ByteReverseWord32(s1); + s2 = ByteReverseWord32(s2); + s3 = ByteReverseWord32(s3); +#endif + + /* AddRoundKey */ + s0 ^= rk[0]; + s1 ^= rk[1]; + s2 ^= rk[2]; + s3 ^= rk[3]; + +#ifndef WOLFSSL_AES_SMALL_TABLES +#ifndef WC_NO_CACHE_RESISTANT + s0 |= PreFetchTe(); +#endif + +#ifndef WOLFSSL_AES_TOUCH_LINES +#define ENC_ROUND_T_S(o) \ + t0 = GetTable(Te_CUDA[0], GETBYTE(s0, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(s1, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(s2, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(s3, 0)) ^ \ + rk[(o)+4]; \ + t1 = GetTable(Te_CUDA[0], GETBYTE(s1, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(s2, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(s3, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(s0, 0)) ^ \ + rk[(o)+5]; \ + t2 = GetTable(Te_CUDA[0], GETBYTE(s2, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(s3, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(s0, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(s1, 0)) ^ \ + rk[(o)+6]; \ + t3 = GetTable(Te_CUDA[0], GETBYTE(s3, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(s0, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(s1, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(s2, 0)) ^ \ + rk[(o)+7] +#define ENC_ROUND_S_T(o) \ + s0 = GetTable(Te_CUDA[0], GETBYTE(t0, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(t1, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(t2, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(t3, 0)) ^ \ + rk[(o)+0]; \ + s1 = GetTable(Te_CUDA[0], GETBYTE(t1, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(t2, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(t3, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(t0, 0)) ^ \ + rk[(o)+1]; \ + s2 = GetTable(Te_CUDA[0], GETBYTE(t2, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(t3, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(t0, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(t1, 0)) ^ \ + rk[(o)+2]; \ + s3 = GetTable(Te_CUDA[0], GETBYTE(t3, 3)) ^ GetTable(Te_CUDA[1], GETBYTE(t0, 2)) ^ \ + GetTable(Te_CUDA[2], GETBYTE(t1, 1)) ^ GetTable(Te_CUDA[3], GETBYTE(t2, 0)) ^ \ + rk[(o)+3] +#else +#define ENC_ROUND_T_S(o) \ + GetTable_Multi(Te_CUDA[0], &t0, GETBYTE(s0, 3), &t1, GETBYTE(s1, 3), \ + &t2, GETBYTE(s2, 3), &t3, GETBYTE(s3, 3)); \ + XorTable_Multi(Te_CUDA[1], &t0, GETBYTE(s1, 2), &t1, GETBYTE(s2, 2), \ + &t2, GETBYTE(s3, 2), &t3, GETBYTE(s0, 2)); \ + XorTable_Multi(Te_CUDA[2], &t0, GETBYTE(s2, 1), &t1, GETBYTE(s3, 1), \ + &t2, GETBYTE(s0, 1), &t3, GETBYTE(s1, 1)); \ + XorTable_Multi(Te_CUDA[3], &t0, GETBYTE(s3, 0), &t1, GETBYTE(s0, 0), \ + &t2, GETBYTE(s1, 0), &t3, GETBYTE(s2, 0)); \ + t0 ^= rk[(o)+4]; t1 ^= rk[(o)+5]; t2 ^= rk[(o)+6]; t3 ^= rk[(o)+7]; + +#define ENC_ROUND_S_T(o) \ + GetTable_Multi(Te_CUDA[0], &s0, GETBYTE(t0, 3), &s1, GETBYTE(t1, 3), \ + &s2, GETBYTE(t2, 3), &s3, GETBYTE(t3, 3)); \ + XorTable_Multi(Te_CUDA[1], &s0, GETBYTE(t1, 2), &s1, GETBYTE(t2, 2), \ + &s2, GETBYTE(t3, 2), &s3, GETBYTE(t0, 2)); \ + XorTable_Multi(Te_CUDA[2], &s0, GETBYTE(t2, 1), &s1, GETBYTE(t3, 1), \ + &s2, GETBYTE(t0, 1), &s3, GETBYTE(t1, 1)); \ + XorTable_Multi(Te_CUDA[3], &s0, GETBYTE(t3, 0), &s1, GETBYTE(t0, 0), \ + &s2, GETBYTE(t1, 0), &s3, GETBYTE(t2, 0)); \ + s0 ^= rk[(o)+0]; s1 ^= rk[(o)+1]; s2 ^= rk[(o)+2]; s3 ^= rk[(o)+3]; +#endif + +#ifndef WOLFSSL_AES_NO_UNROLL + /* Unroll the loop. */ + ENC_ROUND_T_S( 0); + ENC_ROUND_S_T( 8); ENC_ROUND_T_S( 8); + ENC_ROUND_S_T(16); ENC_ROUND_T_S(16); + ENC_ROUND_S_T(24); ENC_ROUND_T_S(24); + ENC_ROUND_S_T(32); ENC_ROUND_T_S(32); + if (r > 5) { + ENC_ROUND_S_T(40); ENC_ROUND_T_S(40); + if (r > 6) { + ENC_ROUND_S_T(48); ENC_ROUND_T_S(48); + } + } + rk += r * 8; +#else + /* + * Nr - 1 full rounds: + */ + + for (;;) { + ENC_ROUND_T_S(0); + + rk += 8; + if (--r == 0) { + break; + } + + ENC_ROUND_S_T(0); + } +#endif + + /* + * apply last round and + * map cipher state to byte array block: + */ + +#ifndef WOLFSSL_AES_TOUCH_LINES + s0 = + (GetTable(Te_CUDA[2], GETBYTE(t0, 3)) & 0xff000000) ^ + (GetTable(Te_CUDA[3], GETBYTE(t1, 2)) & 0x00ff0000) ^ + (GetTable(Te_CUDA[0], GETBYTE(t2, 1)) & 0x0000ff00) ^ + (GetTable(Te_CUDA[1], GETBYTE(t3, 0)) & 0x000000ff) ^ + rk[0]; + s1 = + (GetTable(Te_CUDA[2], GETBYTE(t1, 3)) & 0xff000000) ^ + (GetTable(Te_CUDA[3], GETBYTE(t2, 2)) & 0x00ff0000) ^ + (GetTable(Te_CUDA[0], GETBYTE(t3, 1)) & 0x0000ff00) ^ + (GetTable(Te_CUDA[1], GETBYTE(t0, 0)) & 0x000000ff) ^ + rk[1]; + s2 = + (GetTable(Te_CUDA[2], GETBYTE(t2, 3)) & 0xff000000) ^ + (GetTable(Te_CUDA[3], GETBYTE(t3, 2)) & 0x00ff0000) ^ + (GetTable(Te_CUDA[0], GETBYTE(t0, 1)) & 0x0000ff00) ^ + (GetTable(Te_CUDA[1], GETBYTE(t1, 0)) & 0x000000ff) ^ + rk[2]; + s3 = + (GetTable(Te_CUDA[2], GETBYTE(t3, 3)) & 0xff000000) ^ + (GetTable(Te_CUDA[3], GETBYTE(t0, 2)) & 0x00ff0000) ^ + (GetTable(Te_CUDA[0], GETBYTE(t1, 1)) & 0x0000ff00) ^ + (GetTable(Te_CUDA[1], GETBYTE(t2, 0)) & 0x000000ff) ^ + rk[3]; +#else + { + word32 u0; + word32 u1; + word32 u2; + word32 u3; + + s0 = rk[0]; s1 = rk[1]; s2 = rk[2]; s3 = rk[3]; + GetTable_Multi(Te_CUDA[2], &u0, GETBYTE(t0, 3), &u1, GETBYTE(t1, 3), + &u2, GETBYTE(t2, 3), &u3, GETBYTE(t3, 3)); + s0 ^= u0 & 0xff000000; s1 ^= u1 & 0xff000000; + s2 ^= u2 & 0xff000000; s3 ^= u3 & 0xff000000; + GetTable_Multi(Te_CUDA[3], &u0, GETBYTE(t1, 2), &u1, GETBYTE(t2, 2), + &u2, GETBYTE(t3, 2), &u3, GETBYTE(t0, 2)); + s0 ^= u0 & 0x00ff0000; s1 ^= u1 & 0x00ff0000; + s2 ^= u2 & 0x00ff0000; s3 ^= u3 & 0x00ff0000; + GetTable_Multi(Te_CUDA[0], &u0, GETBYTE(t2, 1), &u1, GETBYTE(t3, 1), + &u2, GETBYTE(t0, 1), &u3, GETBYTE(t1, 1)); + s0 ^= u0 & 0x0000ff00; s1 ^= u1 & 0x0000ff00; + s2 ^= u2 & 0x0000ff00; s3 ^= u3 & 0x0000ff00; + GetTable_Multi(Te_CUDA[1], &u0, GETBYTE(t3, 0), &u1, GETBYTE(t0, 0), + &u2, GETBYTE(t1, 0), &u3, GETBYTE(t2, 0)); + s0 ^= u0 & 0x000000ff; s1 ^= u1 & 0x000000ff; + s2 ^= u2 & 0x000000ff; s3 ^= u3 & 0x000000ff; + } +#endif +#else +#ifndef WC_NO_CACHE_RESISTANT + s0 |= PreFetchSBox(); +#endif + + r *= 2; + /* Two rounds at a time */ + for (rk += 4; r > 1; r--, rk += 4) { + t0 = + ((word32)GetTable8(Tsbox, GETBYTE(s0, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s1, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s2, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s3, 0))); + t1 = + ((word32)GetTable8(Tsbox, GETBYTE(s1, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s2, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s3, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s0, 0))); + t2 = + ((word32)GetTable8(Tsbox, GETBYTE(s2, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s3, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s0, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s1, 0))); + t3 = + ((word32)GetTable8(Tsbox, GETBYTE(s3, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s0, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s1, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s2, 0))); + + s0 = + (col_mul(t0, 3, 2, 0, 1) << 24) ^ + (col_mul(t0, 2, 1, 0, 3) << 16) ^ + (col_mul(t0, 1, 0, 2, 3) << 8) ^ + (col_mul(t0, 0, 3, 2, 1) ) ^ + rk[0]; + s1 = + (col_mul(t1, 3, 2, 0, 1) << 24) ^ + (col_mul(t1, 2, 1, 0, 3) << 16) ^ + (col_mul(t1, 1, 0, 2, 3) << 8) ^ + (col_mul(t1, 0, 3, 2, 1) ) ^ + rk[1]; + s2 = + (col_mul(t2, 3, 2, 0, 1) << 24) ^ + (col_mul(t2, 2, 1, 0, 3) << 16) ^ + (col_mul(t2, 1, 0, 2, 3) << 8) ^ + (col_mul(t2, 0, 3, 2, 1) ) ^ + rk[2]; + s3 = + (col_mul(t3, 3, 2, 0, 1) << 24) ^ + (col_mul(t3, 2, 1, 0, 3) << 16) ^ + (col_mul(t3, 1, 0, 2, 3) << 8) ^ + (col_mul(t3, 0, 3, 2, 1) ) ^ + rk[3]; + } + + t0 = + ((word32)GetTable8(Tsbox, GETBYTE(s0, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s1, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s2, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s3, 0))); + t1 = + ((word32)GetTable8(Tsbox, GETBYTE(s1, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s2, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s3, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s0, 0))); + t2 = + ((word32)GetTable8(Tsbox, GETBYTE(s2, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s3, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s0, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s1, 0))); + t3 = + ((word32)GetTable8(Tsbox, GETBYTE(s3, 3)) << 24) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s0, 2)) << 16) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s1, 1)) << 8) ^ + ((word32)GetTable8(Tsbox, GETBYTE(s2, 0))); + s0 = t0 ^ rk[0]; + s1 = t1 ^ rk[1]; + s2 = t2 ^ rk[2]; + s3 = t3 ^ rk[3]; +#endif + + /* write out */ +#ifdef LITTLE_ENDIAN_ORDER + s0 = ByteReverseWord32(s0); + s1 = ByteReverseWord32(s1); + s2 = ByteReverseWord32(s2); + s3 = ByteReverseWord32(s3); +#endif + + XMEMCPY(outBlock, &s0, sizeof(s0)); + XMEMCPY(outBlock + sizeof(s0), &s1, sizeof(s1)); + XMEMCPY(outBlock + 2 * sizeof(s0), &s2, sizeof(s2)); + XMEMCPY(outBlock + 3 * sizeof(s0), &s3, sizeof(s3)); + } +} + +void AesEncrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r) +{ + byte *inBlock_GPU = NULL; + byte *outBlock_GPU = NULL; + word32* rk_GPU = NULL; + cudaError_t ret = cudaSuccess; + +#ifdef WC_C_DYNAMIC_FALLBACK + if ( ret == cudaSuccess ) + ret = cudaMalloc(&rk_GPU, sizeof(aes->key_C_fallback)); + if ( ret == cudaSuccess ) + ret = cudaMemcpy(rk_GPU, aes->key_C_fallback, sizeof(aes->key_C_fallback), cudaMemcpyDefault); +#else + if ( ret == cudaSuccess ) + ret = cudaMalloc(&rk_GPU, sizeof(aes->key)); + if ( ret == cudaSuccess ) + ret = cudaMemcpy(rk_GPU, aes->key, sizeof(aes->key), cudaMemcpyDefault); +#endif + + if ( ret == cudaSuccess ) + ret = cudaMalloc(&inBlock_GPU, AES_BLOCK_SIZE); + if ( ret == cudaSuccess ) + ret = cudaMemcpy(inBlock_GPU, inBlock, AES_BLOCK_SIZE, cudaMemcpyDefault); + + if ( ret == cudaSuccess ) + ret = cudaMalloc(&outBlock_GPU, AES_BLOCK_SIZE); + + if ( ret == cudaSuccess ) + AesEncrypt_C_CUDA<<<1,1>>>(rk_GPU, inBlock_GPU, outBlock_GPU, r, 1); + + if ( ret == cudaSuccess ) + ret = cudaMemcpy(outBlock, outBlock_GPU, AES_BLOCK_SIZE, cudaMemcpyDefault); + + cudaFree(inBlock_GPU); + cudaFree(outBlock_GPU); + cudaFree(rk_GPU); +} + +#if defined(HAVE_AES_ECB) && !(defined(WOLFSSL_IMX6_CAAM) && \ + !defined(NO_IMX6_CAAM_AES) && !defined(WOLFSSL_QNX_CAAM)) +/* Encrypt a number of blocks using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + * @param [in] sz Number of blocks to encrypt. + */ +void AesEncryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz) +{ + byte *in_GPU = NULL; + byte *out_GPU = NULL; + word32* rk_GPU = NULL; + cudaError_t ret = cudaSuccess; + +#ifdef WC_C_DYNAMIC_FALLBACK + if ( ret == cudaSuccess ) + ret = cudaMalloc(&rk_GPU, sizeof(aes->key_C_fallback)); + if ( ret == cudaSuccess ) + ret = cudaMemcpy(rk_GPU, aes->key_C_fallback, sizeof(aes->key_C_fallback), cudaMemcpyDefault); +#else + if ( ret == cudaSuccess ) + ret = cudaMalloc(&rk_GPU, sizeof(aes->key)); + if ( ret == cudaSuccess ) + ret = cudaMemcpy(rk_GPU, aes->key, sizeof(aes->key), cudaMemcpyDefault); +#endif + + if ( ret == cudaSuccess ) + ret = cudaMalloc(&in_GPU, sz); + if ( ret == cudaSuccess ) + ret = cudaMemcpy(in_GPU, in, sz, cudaMemcpyDefault); + + if ( ret == cudaSuccess ) + ret = cudaMalloc(&out_GPU, sz); + + if ( ret == cudaSuccess ) { + int blockSize = 256; + int numBlocks = (sz / AES_BLOCK_SIZE + blockSize - 1) / blockSize; + AesEncrypt_C_CUDA<<>>(rk_GPU, in_GPU, out_GPU, aes->rounds >> 1, sz / AES_BLOCK_SIZE); + } + + if ( ret == cudaSuccess ) + ret = cudaMemcpy(out, out_GPU, sz, cudaMemcpyDefault); + + cudaFree(in_GPU); + cudaFree(out_GPU); + cudaFree(rk_GPU); +} +#endif + +#else + +/* Encrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] inBlock Block to encrypt. + * @param [out] outBlock Encrypted block. + * @param [in] r Rounds divided by 2. + */ +__global__ +void AesEncrypt_C_CUDA(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r) +{ + bs_word state[AES_BLOCK_BITS]; + + (void)r; + + XMEMCPY(state, inBlock, AES_BLOCK_SIZE); + XMEMSET(((byte*)state) + AES_BLOCK_SIZE, 0, sizeof(state) - AES_BLOCK_SIZE); + + bs_encrypt(state, aes->bs_key, aes->rounds); + + XMEMCPY(outBlock, state, AES_BLOCK_SIZE); +} + +void AesEncrypt_C(Aes* aes, const byte* inBlock, byte* outBlock, + word32 r) +{ + AesEncrypt_C_CUDA<<<1,1>>>(aes, inBlock, outBlock, r); +} + +#if defined(HAVE_AES_ECB) && !(defined(WOLFSSL_IMX6_CAAM) && \ + !defined(NO_IMX6_CAAM_AES) && !defined(WOLFSSL_QNX_CAAM)) +/* Encrypt a number of blocks using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + * @param [in] sz Number of blocks to encrypt. + */ +void AesEncryptBlocks_C(Aes* aes, const byte* in, byte* out, word32 sz) +{ + bs_word state[AES_BLOCK_BITS]; + + while (sz >= BS_BLOCK_SIZE) { + XMEMCPY(state, in, BS_BLOCK_SIZE); + bs_encrypt(state, aes->bs_key, aes->rounds); + XMEMCPY(out, state, BS_BLOCK_SIZE); + sz -= BS_BLOCK_SIZE; + in += BS_BLOCK_SIZE; + out += BS_BLOCK_SIZE; + } + if (sz > 0) { + XMEMCPY(state, in, sz); + XMEMSET(((byte*)state) + sz, 0, sizeof(state) - sz); + bs_encrypt(state, aes->bs_key, aes->rounds); + XMEMCPY(out, state, sz); + } +} +#endif + +#endif /* !WC_AES_BITSLICED */ + +#endif /* HAVE_CUDA */ + +#endif /* !WOLFSSL_TI_CRYPT */ + +} /* extern "C" */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/devcrypto/devcrypto_rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/devcrypto/devcrypto_rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/devcrypto/devcrypto_rsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/devcrypto/devcrypto_rsa.c 2024-08-03 07:30:00.000000000 +0000 @@ -322,7 +322,7 @@ int wc_DevCrypto_RsaDecrypt(const byte* in, word32 inlen, byte* out, word32 outlen, RsaKey* key, int type) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (type) { case RSA_PUBLIC_DECRYPT: @@ -332,6 +332,9 @@ case RSA_PRIVATE_DECRYPT: ret = _PrivateOperation(in, inlen, out, outlen, key); break; + default: + ret = BAD_FUNC_ARG; + break; } return ret; @@ -341,7 +344,7 @@ int wc_DevCrypto_RsaEncrypt(const byte* in, word32 inlen, byte* out, word32* outlen, RsaKey *key, int type) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); switch (type) { case RSA_PUBLIC_ENCRYPT: @@ -351,6 +354,9 @@ case RSA_PRIVATE_ENCRYPT: ret = _PrivateOperation(in, inlen, out, *outlen, key); break; + default: + ret = BAD_FUNC_ARG; + break; } if (ret == 0) { *outlen = inlen; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/intel/quickassist_sync.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/intel/quickassist_sync.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/intel/quickassist_sync.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/intel/quickassist_sync.c 2024-08-03 07:30:00.000000000 +0000 @@ -23,7 +23,7 @@ #include #endif -#include +#include #ifdef HAVE_INTEL_QA_SYNC @@ -144,9 +144,9 @@ /* QuickAssist device */ typedef struct IntelQaDev { - CpaInstanceHandle handle; + CpaInstanceHandle handle; int devId; - void* heap; + void* heap; /* callback return info */ int ret; @@ -220,14 +220,14 @@ #ifdef WOLF_CRYPTO_CB static int IntelQaSymSync_CryptoDevCb(int, struct wc_CryptoInfo*, - void*); + void*); #endif /* WOLF_CRYPTO_CB */ #ifdef QAT_DEBUG #define QLOG(...) do { printf(__VA_ARGS__); } while (0) #else - #define QLOG(...) + #define QLOG(...) WC_DO_NOTHING #endif @@ -423,7 +423,7 @@ #ifdef QAT_DEBUG /* optionally enable debugging */ - //osalLogLevelSet(8); + /* osalLogLevelSet(8); */ #endif status = cpaCyGetNumInstances(&g_numInstances); @@ -674,7 +674,7 @@ } { - if (dev->ret != WC_PENDING_E) { + if (dev->ret != WC_NO_ERR_TRACE(WC_PENDING_E)) { /* perform cleanup */ IntelQaFreeFunc freeFunc = dev->freeFunc; QLOG("IntelQaOpFree: Dev %p, FreeFunc %p\n", dev, freeFunc); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/iotsafe/iotsafe.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/iotsafe/iotsafe.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/iotsafe/iotsafe.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/iotsafe/iotsafe.c 2024-08-03 07:30:00.000000000 +0000 @@ -612,7 +612,7 @@ /* Execute GEN_KEYPAIR on the IoT-SAFE applet. * * Return -1 on error; 0 if the operation is successful, but - * the generated public key was not yet stored in `key`; 1 if + * the generated public key was not yet stored in `key`; 1 if * the operation is successful and the public key was found in the * command response and copied to the `key` structure, if not NULL. */ @@ -620,7 +620,7 @@ ecc_key *key) { char *resp; - int ret = WC_HW_E; + int ret = WC_NO_ERR_TRACE(WC_HW_E); iotsafe_cmd_start(csim_cmd, IOTSAFE_CLASS, IOTSAFE_INS_GEN_KEYPAIR, 0, 0); iotsafe_cmd_add_tlv(csim_cmd, IOTSAFE_TAG_PRIVKEY_ID, id_size, wr_slot); iotsafe_cmd_complete(csim_cmd); @@ -749,43 +749,37 @@ int ret; char *resp; uint16_t hash_algo = 0; - int len; + int hash_len; uint16_t hash_algo_be = 0; WOLFSSL_MSG("Enter iotsafe_hkdf_extract"); - switch (digest) { - #ifndef NO_SHA256 + switch (digest) { +#ifndef NO_SHA256 case WC_SHA256: - hash_algo = (uint16_t)1; - if (ikmLen == 0) { - len = WC_SHA256_DIGEST_SIZE; - } + hash_algo = (uint16_t)1; + hash_len = WC_SHA256_DIGEST_SIZE; break; - #endif - #ifdef WOLFSSL_SHA384 +#endif +#ifdef WOLFSSL_SHA384 case WC_SHA384: - hash_algo = (uint16_t)2; - if (ikmLen == 0) { - len = WC_SHA384_DIGEST_SIZE; - } + hash_algo = (uint16_t)2; + hash_len = WC_SHA384_DIGEST_SIZE; break; - #endif - #ifdef WOLFSSL_TLS13_SHA512 +#endif +#ifdef WOLFSSL_SHA512 case WC_SHA512: - hash_algo = (uint16_t)4; - if (ikmLen == 0) { - len = WC_SHA512_DIGEST_SIZE; - } + hash_algo = (uint16_t)4; + hash_len = WC_SHA512_DIGEST_SIZE; break; - #endif +#endif default: return BAD_FUNC_ARG; break; - } + } if (ikmLen == 0) { - ikmLen = len; - XMEMSET(ikm, 0, len); + ikmLen = hash_len; + XMEMSET(ikm, 0, hash_len); } #ifdef DEBUG_IOTSAFE @@ -812,14 +806,12 @@ WOLFSSL_MSG("Unexpected reply from HKDF extract"); ret = WC_HW_E; } else { - - ret = hexbuffer_conv(resp, prk, 32); + ret = hexbuffer_conv(resp, prk, hash_len); if (ret < 0) ret = WC_HW_E; else ret = 0; } - return ret; } #endif @@ -830,7 +822,7 @@ { byte mode_of_operation = IOTSAFE_MOO_SIGN_ONLY; uint16_t hash_algo_be = XHTONS(hash_algo); - int ret = WC_HW_E; + int ret = WC_NO_ERR_TRACE(WC_HW_E); char *resp; char R[2 * IOTSAFE_ECC_KSIZE + 1]; char S[2 * IOTSAFE_ECC_KSIZE + 1]; @@ -1097,11 +1089,11 @@ localSalt = tmp; } } - - ret = iotsafe_hkdf_extract(prk, localSalt, saltLen, ikm, ikmLen, digest); + + ret = iotsafe_hkdf_extract(prk, localSalt, saltLen, ikm, ikmLen, digest); (void)ctx; return ret; -} +} #endif static int wolfIoT_ecc_sign(WOLFSSL* ssl, @@ -1581,7 +1573,7 @@ WOLFSSL_MSG("ECC callbacks set to IoT_safe interface"); #endif #ifndef NO_RSA - /* wolfSSL_CTX_SetRsaSignCb(wolfIoT_rsa_sign); // TODO: RSA callbacks */ + /* wolfSSL_CTX_SetRsaSignCb(wolfIoT_rsa_sign); */ /* TODO: RSA callbacks */ #endif #else (void)ctx; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -39,8 +39,8 @@ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$g") - #pragma const_seg(".fipsB$g") + #pragma code_seg(".fipsA$ba") + #pragma const_seg(".fipsB$ba") #endif #endif @@ -97,7 +97,7 @@ iov.iov_len = sz; ret = (int)kcapi_cipher_stream_update(aes->handle, &iov, 1); if (ret < 0) { - WOLFSSL_MSG("CbcEncrypt error updateing through KCAPI"); + WOLFSSL_MSG("CbcEncrypt error updating through KCAPI"); } } if (ret >= 0) { @@ -155,7 +155,7 @@ iov.iov_len = sz; ret = (int)kcapi_cipher_stream_update(aes->handle, &iov, 1); if (ret < 0) { - WOLFSSL_MSG("CbcDecrypt error updateing through KCAPI"); + WOLFSSL_MSG("CbcDecrypt error updating through KCAPI"); } } if (ret >= 0) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_dh.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_dh.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_dh.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_dh.c 2024-08-03 07:30:00.000000000 +0000 @@ -47,74 +47,12 @@ static int KcapiDh_SetParams(DhKey* key) { -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - int ret = 0; - unsigned char* pkcs3 = NULL; - word32 len = 0, idx = 0, len2; - - len = MAX_SEQ_SZ; /* Sequence */ - len += ASN_TAG_SZ + MAX_LENGTH_SZ; /* Integer */ - len += mp_leading_bit(&key->p) ? 1 : 0; - len += mp_unsigned_bin_size(&key->p); - len += ASN_TAG_SZ + MAX_LENGTH_SZ; /* Integer */ - len += mp_leading_bit(&key->g) ? 1 : 0; - len += mp_unsigned_bin_size(&key->g); - - pkcs3 = (unsigned char*)XMALLOC(len, key->heap, DYNAMIC_TYPE_TMP_BUFFER); - if (pkcs3 == NULL) { - ret = MEMORY_E; - } - - if (ret == 0) { - idx = len; - len2 = mp_unsigned_bin_size(&key->g); - idx -= len2; - ret = mp_to_unsigned_bin(&key->g, pkcs3 + idx); - } - if (ret >= 0) { - if (mp_leading_bit(&key->g)) { - pkcs3[--idx] = 0x00; - len2++; - } - idx -= SetLength(len2, NULL); - SetLength(len2, pkcs3 + idx); - pkcs3[--idx] = ASN_INTEGER; - - len2 = mp_unsigned_bin_size(&key->p); - idx -= len2; - ret = mp_to_unsigned_bin(&key->p, pkcs3 + idx); - } - if (ret >= 0) { - if (mp_leading_bit(&key->p)) { - pkcs3[--idx] = 0x00; - len2++; - } - idx -= SetLength(len2, NULL); - SetLength(len2, pkcs3 + idx); - pkcs3[--idx] = ASN_INTEGER; - - len2 = len - idx; - idx -= SetSequence(len2, NULL); - SetSequence(len2, pkcs3 + idx); - - ret = kcapi_kpp_dh_setparam_pkcs3(key->handle, pkcs3 + idx, len - idx); - if (ret != 0) { - WOLFSSL_MSG("KcapiDh_SetParams: Failed to set"); - } - } - - if (pkcs3 != NULL) { - XFREE(pkcs3, key->heap, DYNAMIC_TYPE_TMP_BUFFER); - } - return ret; -#else int ret; unsigned char* pkcs3 = NULL; word32 len; ret = wc_DhParamsToDer(key, NULL, &len); - if (ret == LENGTH_ONLY_E) { + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { ret = 0; pkcs3 = (unsigned char*)XMALLOC(len, key->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -136,7 +74,6 @@ XFREE(pkcs3, key->heap, DYNAMIC_TYPE_TMP_BUFFER); } return ret; -#endif } int KcapiDh_MakeKey(DhKey* key, byte* pub, word32* pubSz) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hash.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hash.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hash.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hash.c 2024-08-03 07:30:00.000000000 +0000 @@ -113,7 +113,7 @@ hash->heap, DYNAMIC_TYPE_TMP_BUFFER); if (pt == NULL) { ret = MEMORY_E; - } + } else { hash->msg = pt; } @@ -318,36 +318,6 @@ static const char WC_NAME_SHA256[] = "sha256"; -/* create KCAPI handle for SHA256 operation */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -int InitSha256(wc_Sha256* sha) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashInit(&sha->kcapi, NULL, INVALID_DEVID, WC_NAME_SHA256); -} - - -int Sha256Update(wc_Sha256* sha, const byte* in, word32 sz) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashUpdate(&sha->kcapi, in, sz); -} - - -int Sha256Final(wc_Sha256* sha, byte* hash) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashFinal(&sha->kcapi, hash, WC_SHA256_DIGEST_SIZE, - WC_NAME_SHA256); -} -#else int wc_InitSha256_ex(wc_Sha256* sha, void* heap, int devid) { if (sha == NULL) { @@ -374,8 +344,6 @@ return KcapiHashFinal(&sha->kcapi, hash, WC_SHA256_DIGEST_SIZE, WC_NAME_SHA256); } -#endif - int wc_Sha256GetHash(wc_Sha256* sha, byte* hash) { @@ -400,37 +368,6 @@ static const char WC_NAME_SHA384[] = "sha384"; - -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -/* create KCAPI handle for SHA384 operation */ -int InitSha384(wc_Sha384* sha) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashInit(&sha->kcapi, NULL, INVALID_DEVID, WC_NAME_SHA384); -} - - -int Sha384Update(wc_Sha384* sha, const byte* in, word32 sz) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashUpdate(&sha->kcapi, in, sz); -} - - -int Sha384Final(wc_Sha384* sha, byte* hash) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashFinal(&sha->kcapi, hash, WC_SHA384_DIGEST_SIZE, - WC_NAME_SHA384); -} -#else /* create KCAPI handle for SHA384 operation */ int wc_InitSha384_ex(wc_Sha384* sha, void* heap, int devid) { @@ -458,7 +395,6 @@ return KcapiHashFinal(&sha->kcapi, hash, WC_SHA384_DIGEST_SIZE, WC_NAME_SHA384); } -#endif int wc_Sha384GetHash(wc_Sha384* sha, byte* hash) { @@ -483,36 +419,6 @@ static const char WC_NAME_SHA512[] = "sha512"; -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -/* create KCAPI handle for SHA512 operation */ -int InitSha512(wc_Sha512* sha) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashInit(&sha->kcapi, NULL, INVALID_DEVID, WC_NAME_SHA512); -} - - -int Sha512Update(wc_Sha512* sha, const byte* in, word32 sz) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashUpdate(&sha->kcapi, in, sz); -} - - -int Sha512Final(wc_Sha512* sha, byte* hash) -{ - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return KcapiHashFinal(&sha->kcapi, hash, WC_SHA512_DIGEST_SIZE, - WC_NAME_SHA512); -} -#else /* create KCAPI handle for SHA512 operation */ int wc_InitSha512_ex(wc_Sha512* sha, void* heap, int devid) { @@ -540,7 +446,6 @@ return KcapiHashFinal(&sha->kcapi, hash, WC_SHA512_DIGEST_SIZE, WC_NAME_SHA512); } -#endif int wc_Sha512GetHash(wc_Sha512* sha, byte* hash) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hmac.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hmac.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hmac.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_hmac.c 2024-08-03 07:30:00.000000000 +0000 @@ -52,12 +52,7 @@ static const char WC_NAME_HMAC_SHA512[] = "hmac(sha512)"; #endif -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -int HmacInit(Hmac* hmac, void* heap, int devId) -#else int wc_HmacInit(Hmac* hmac, void* heap, int devId) -#endif { int ret = 0; @@ -76,12 +71,7 @@ return ret; } -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -void HmacFree(Hmac* hmac) -#else void wc_HmacFree(Hmac* hmac) -#endif { if (hmac != NULL) { if (hmac->handle != NULL) { @@ -91,12 +81,7 @@ } } -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -int HmacSetKey(Hmac* hmac, int type, const byte* key, word32 length) -#else int wc_HmacSetKey(Hmac* hmac, int type, const byte* key, word32 length) -#endif { int ret = 0; const char* ciphername = NULL; @@ -197,12 +182,7 @@ return ret; } -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -int HmacUpdate(Hmac* hmac, const byte* msg, word32 length) -#else int wc_HmacUpdate(Hmac* hmac, const byte* msg, word32 length) -#endif { int ret = 0; @@ -244,12 +224,7 @@ return ret; } -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -int HmacFinal(Hmac* hmac, byte* hash) -#else int wc_HmacFinal(Hmac* hmac, byte* hash) -#endif { int ret = 0; int len = 0; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_rsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/kcapi/kcapi_rsa.c 2024-08-03 07:30:00.000000000 +0000 @@ -45,164 +45,6 @@ } } -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -/* Set the DER/BER encoding of the ASN.1 INTEGER header. - * - * len Length of data to encode. - * firstByte First byte of data, most significant byte of integer, to encode. - * output Buffer to write into. - * returns the number of bytes added to the buffer. - */ -static int SetASNInt(int len, byte firstByte, byte* output) -{ - word32 idx = 0; - - if (output) - output[idx] = ASN_INTEGER; - idx++; - if (firstByte & 0x80) - len++; - idx += SetLength(len, output ? output + idx : NULL); - if (firstByte & 0x80) { - if (output) - output[idx] = 0x00; - idx++; - } - - return idx; -} - -static int SetASNIntMP(mp_int* n, int maxSz, byte* output) -{ - int idx = 0; - int leadingBit; - int length; - int err; - - leadingBit = mp_leading_bit(n); - length = mp_unsigned_bin_size(n); - idx = SetASNInt(length, leadingBit ? 0x80 : 0x00, output); - if (maxSz >= 0 && (idx + length) > maxSz) - return BUFFER_E; - - if (output) { - err = mp_to_unsigned_bin(n, output + idx); - if (err != MP_OKAY) - return MP_TO_E; - } - idx += length; - - return idx; -} - -static mp_int* GetRsaInt(RsaKey* key, int idx) -{ - if (idx == 0) - return &key->n; - if (idx == 1) - return &key->e; - if (idx == 2) - return &key->d; - if (idx == 3) - return &key->p; - if (idx == 4) - return &key->q; - if (idx == 5) - return &key->dP; - if (idx == 6) - return &key->dQ; - if (idx == 7) - return &key->u; - - return NULL; -} - -/* Release Tmp RSA resources */ -static WC_INLINE void FreeTmpRsas(byte** tmps, void* heap) -{ - int i; - - (void)heap; - - for (i = 0; i < RSA_INTS; i++) - XFREE(tmps[i], heap, DYNAMIC_TYPE_RSA); -} - - -/* Convert RsaKey key to DER format, write to output (inLen), return bytes - written */ -static int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen) -{ - word32 seqSz, verSz, rawLen, intTotalLen = 0; - word32 sizes[RSA_INTS]; - int i, j, outLen, ret = 0; - - byte seq[MAX_SEQ_SZ]; - byte ver[MAX_VERSION_SZ]; - byte* tmps[RSA_INTS]; - - if (!key || !output) - return BAD_FUNC_ARG; - - if (key->type != RSA_PRIVATE) - return BAD_FUNC_ARG; - - for (i = 0; i < RSA_INTS; i++) - tmps[i] = NULL; - - /* write all big ints from key to DER tmps */ - for (i = 0; i < RSA_INTS; i++) { - int mpSz; - mp_int* keyInt = GetRsaInt(key, i); - - rawLen = mp_unsigned_bin_size(keyInt) + 1; - tmps[i] = (byte*)XMALLOC(rawLen + MAX_SEQ_SZ, key->heap, - DYNAMIC_TYPE_RSA); - if (tmps[i] == NULL) { - ret = MEMORY_E; - break; - } - - mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]); - if (mpSz < 0) { - ret = mpSz; - break; - } - intTotalLen += (sizes[i] = mpSz); - } - - if (ret != 0) { - FreeTmpRsas(tmps, key->heap); - return ret; - } - - /* make headers */ - verSz = SetMyVersion(0, ver, FALSE); - seqSz = SetSequence(verSz + intTotalLen, seq); - - outLen = seqSz + verSz + intTotalLen; - if (outLen > (int)inLen) { - FreeTmpRsas(tmps, key->heap); - return BAD_FUNC_ARG; - } - - /* write to output */ - XMEMCPY(output, seq, seqSz); - j = seqSz; - XMEMCPY(output + j, ver, verSz); - j += verSz; - - for (i = 0; i < RSA_INTS; i++) { - XMEMCPY(output + j, tmps[i], sizes[i]); - j += sizes[i]; - } - FreeTmpRsas(tmps, key->heap); - - return outLen; -} -#endif - #if !defined(WOLFSSL_RSA_PUBLIC_ONLY) && !defined(WOLFSSL_RSA_VERIFY_ONLY) static int KcapiRsa_SetPrivKey(RsaKey* key) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/liboqs/liboqs.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/liboqs/liboqs.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/liboqs/liboqs.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/liboqs/liboqs.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,132 @@ +/* liboqs.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* + +DESCRIPTION +This library provides the support interfaces to the liboqs library providing +implementations for Post-Quantum cryptography algorithms. + +*/ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include +#include + +#include + +#if defined(HAVE_LIBOQS) + +/* RNG for liboqs */ +static WC_RNG liboqsDefaultRNG; +static WC_RNG* liboqsCurrentRNG; + +static wolfSSL_Mutex liboqsRNGMutex; + +static int liboqs_init = 0; + + +static void wolfSSL_liboqsGetRandomData(uint8_t* buffer, size_t numOfBytes) +{ + int ret; + word32 numOfBytes_word32; + + while (numOfBytes > 0) { + numOfBytes_word32 = (word32)numOfBytes; + numOfBytes -= numOfBytes_word32; + ret = wc_RNG_GenerateBlock(liboqsCurrentRNG, buffer, + numOfBytes_word32); + if (ret != 0) { + /* ToDo: liboqs exits program if RNG fails, + * not sure what to do here + */ + WOLFSSL_MSG_EX( + "wc_RNG_GenerateBlock(..., %u) failed with ret %d " + "in wolfSSL_liboqsGetRandomData().", numOfBytes_word32, ret + ); + abort(); + } + } +} + +int wolfSSL_liboqsInit(void) +{ + int ret = 0; + + if (liboqs_init == 0) { + ret = wc_InitMutex(&liboqsRNGMutex); + if (ret != 0) { + return ret; + } + ret = wc_LockMutex(&liboqsRNGMutex); + if (ret != 0) { + return ret; + } + ret = wc_InitRng(&liboqsDefaultRNG); + if (ret == 0) { + OQS_init(); + liboqs_init = 1; + } + liboqsCurrentRNG = &liboqsDefaultRNG; + wc_UnLockMutex(&liboqsRNGMutex); + + OQS_randombytes_custom_algorithm(wolfSSL_liboqsGetRandomData); + } + + return ret; +} + +void wolfSSL_liboqsClose(void) +{ + wc_FreeRng(&liboqsDefaultRNG); +} + +int wolfSSL_liboqsRngMutexLock(WC_RNG* rng) +{ + int ret = wolfSSL_liboqsInit(); + if (ret == 0) { + ret = wc_LockMutex(&liboqsRNGMutex); + } + if (ret == 0 && rng != NULL) { + /* Update the pointer with the RNG to use. This is safe as we locked the mutex */ + liboqsCurrentRNG = rng; + } + return ret; +} + +int wolfSSL_liboqsRngMutexUnlock(void) +{ + liboqsCurrentRNG = &liboqsDefaultRNG; + + if (liboqs_init) { + return wc_UnLockMutex(&liboqsRNGMutex); + } + else { + return BAD_MUTEX_E; + } +} + +#endif /* HAVE_LIBOQS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/maxim/maxq10xx.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/maxim/maxq10xx.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/maxim/maxq10xx.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/maxim/maxq10xx.c 2024-08-03 07:30:00.000000000 +0000 @@ -23,7 +23,7 @@ #include #endif -#include +#include #if defined(WOLFSSL_MAXQ1065) || defined(WOLFSSL_MAXQ108X) @@ -52,11 +52,11 @@ #ifdef MAXQ_DEBUG void dbg_dumphex(const char *identifier, const uint8_t* pdata, uint32_t plen); #else -#define dbg_dumphex(identifier, pdata, plen) +#define dbg_dumphex(identifier, pdata, plen) WC_DO_NOTHING #endif /* MAXQ_DEBUG */ #if defined(USE_WINDOWS_API) -# define maxq_CryptHwMutexTryLock() (0) +# define maxq_CryptHwMutexTryLock() 0 #endif #define AES_KEY_ID_START (0x2000) @@ -1450,7 +1450,7 @@ } #endif /* WOLFSSL_MAXQ108X */ - if (rc != 0 && rc != CRYPTOCB_UNAVAILABLE) { + if (rc != 0 && rc != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { rc = WC_HW_E; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/README_SE050.md mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/README_SE050.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/README_SE050.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/README_SE050.md 2024-08-03 07:30:00.000000000 +0000 @@ -163,7 +163,7 @@ ``` Default ENC, MAC, and DEK keys for SCP03 should be set by defining the -following values. Thes are the default keys wolfSSL used for the SE50C2 +following values. These are the default keys wolfSSL used for the SE50C2 variant (OEF OID: A201). The variant can be seen by running the `se05x_GetInfo` sample application. @@ -382,7 +382,7 @@ wolfSSL will not auto-delete generated keys associated with wolfCrypt structures (ex: `RsaKey`, `ecc_key`, etc) when the respective key free function is called (ex: `wc_ecc_free()`, `wc_FreeRsaKey()`). This is done by design in -case the application wants to re-use that key that has been generated and +case the application wants to reuse that key that has been generated and stored in the SE050. Credentials can be deleted from the SE050 storage by calling the wolfSSL helper diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/dcp_port.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/dcp_port.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/dcp_port.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/dcp_port.c 2024-08-03 07:30:00.000000000 +0000 @@ -47,9 +47,9 @@ #define dcp_lock() wolfSSL_CryptHwMutexLock() #define dcp_unlock() wolfSSL_CryptHwMutexUnLock() #else -#define dcp_lock_init() do{}while(0) -#define dcp_lock() do{}while(0) -#define dcp_unlock() do{}while(0) +#define dcp_lock_init() WC_DO_NOTHING +#define dcp_lock() WC_DO_NOTHING +#define dcp_unlock() WC_DO_NOTHING #endif #if DCP_USE_OTP_KEY diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/ksdk_port.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/ksdk_port.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/ksdk_port.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/ksdk_port.c 2024-08-03 07:30:00.000000000 +0000 @@ -105,7 +105,7 @@ #else res = mp_to_unsigned_bin(A, dst); if (res == MP_OKAY) { - ltc_reverse_array(dst, sz); + ltc_reverse_array(dst, sz); } #endif *psz = sz; @@ -134,7 +134,7 @@ szA = mp_unsigned_bin_size(A); szB = mp_unsigned_bin_size(B); - /* if unsigned mul can fit into LTC PKHA let's use it, otherwise call + /* if unsigned mul can fit into LTC PKHA let's use it, otherwise call * software mul */ if ((szA <= LTC_MAX_INT_BYTES / 2) && (szB <= LTC_MAX_INT_BYTES / 2)) { uint8_t *ptrA = (uint8_t*)XMALLOC(LTC_MAX_INT_BYTES, NULL, @@ -264,7 +264,7 @@ { ltc_reverse_array(ptrC, sizeC); res = mp_read_unsigned_bin(c, ptrC, sizeC); - + #if (!defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL)) || \ defined(WOLFSSL_SP_INT_NEGATIVE) /* fix sign */ @@ -341,10 +341,10 @@ res = ltc_get_lsb_bin_from_mp_int(ptrA, a, &sizeA); if (res == MP_OKAY) res = ltc_get_lsb_bin_from_mp_int(ptrB, b, &sizeB); - + /* if a >= b then reduce */ /* TODO: Perhaps always do mod reduce depending on hardware performance */ - if (res == MP_OKAY && + if (res == MP_OKAY && LTC_PKHA_CompareBigNum(ptrA, sizeA, ptrB, sizeB) >= 0) { if (LTC_PKHA_ModRed(LTC_BASE, ptrA, sizeA, ptrB, sizeB, ptrA, &sizeA, kLTC_PKHA_IntegerArith) != kStatus_Success) { @@ -411,7 +411,7 @@ int res = MP_OKAY; status_t status; int szA, szB, szC; - + #ifdef ENABLE_NXPLTC_TESTS mp_int t; mp_init(&t); @@ -543,8 +543,8 @@ szX = mp_unsigned_bin_size(X); szP = mp_unsigned_bin_size(P); - if ((szG <= LTC_MAX_INT_BYTES) && - (szX <= LTC_MAX_INT_BYTES) && + if ((szG <= LTC_MAX_INT_BYTES) && + (szX <= LTC_MAX_INT_BYTES) && (szP <= LTC_MAX_INT_BYTES)) { uint16_t sizeG, sizeX, sizeP, sizeY; @@ -563,9 +563,9 @@ /* if G >= P then reduce */ /* TODO: Perhaps always do mod reduce depending on hardware performance */ - if (res == MP_OKAY && + if (res == MP_OKAY && LTC_PKHA_CompareBigNum(ptrG, sizeG, ptrP, sizeP) >= 0) { - res = LTC_PKHA_ModRed(LTC_BASE, + res = LTC_PKHA_ModRed(LTC_BASE, ptrG, sizeG, ptrP, sizeP, ptrG, &sizeG, kLTC_PKHA_IntegerArith); @@ -602,7 +602,7 @@ } if (ptrG) { XFREE(ptrG, NULL, DYNAMIC_TYPE_BIGINT); - } + } } else { #if defined(FREESCALE_LTC_TFM_RSA_4096_ENABLE) @@ -678,7 +678,7 @@ res = ltc_get_lsb_bin_from_mp_int(ptrA, a, &sizeA); } if (res == MP_OKAY) { - if (LTC_PKHA_PrimalityTest(LTC_BASE, + if (LTC_PKHA_PrimalityTest(LTC_BASE, ptrB, sizeB, /* seed */ (uint8_t*)&t, sizeof(t), /* trials */ ptrA, sizeA, /* candidate */ @@ -726,7 +726,7 @@ #if defined(HAVE_ECC) && defined(FREESCALE_LTC_ECC) /* convert from mp_int to LTC integer, as array of bytes of size sz. - * if mp_int has less bytes than sz, add zero bytes at most significant byte + * if mp_int has less bytes than sz, add zero bytes at most significant byte * positions. * This is when for example modulus is 32 bytes (P-256 curve) * and mp_int has only 31 bytes, we add leading zeros @@ -763,7 +763,7 @@ return res; } -/* ECC specs in lsbyte at lowest address format for direct use by LTC PKHA +/* ECC specs in lsbyte at lowest address format for direct use by LTC PKHA * driver functions */ #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) #define ECC192 @@ -1196,7 +1196,7 @@ /* * * finds square root in finite field when modulus congruent to 5 modulo 8 - * this is fixed to curve25519 modulus 2^255 - 19 which is congruent to + * this is fixed to curve25519 modulus 2^255 - 19 which is congruent to * 5 modulo 8. * * This function solves equation: res^2 = a mod (2^255 - 19) @@ -1914,7 +1914,7 @@ return status; } -/* LSByte first of Ed25519 parameter l = 2^252 + +/* LSByte first of Ed25519 parameter l = 2^252 + * 27742317777372353535851937790883648493 */ static const uint8_t l_coefEdDSA[] = { 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/se050_port.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/se050_port.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/se050_port.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/nxp/se050_port.c 2024-08-03 07:30:00.000000000 +0000 @@ -266,7 +266,7 @@ int se050_hash_update(SE050_HASH_Context* se050Ctx, const byte* data, word32 len) { - byte* tmp = NULL; + byte* tmp = NULL; if (se050Ctx == NULL || (len > 0 && data == NULL)) { return BAD_FUNC_ARG; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/pic32/pic32mz-crypt.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/pic32/pic32mz-crypt.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/pic32/pic32mz-crypt.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/pic32/pic32mz-crypt.c 2024-08-03 07:30:00.000000000 +0000 @@ -365,7 +365,7 @@ static void update_engine(const byte *input, word32 len, word32 *hash) { int total; - + gLHDesc.bd[gLHDesc.currBd].UPDPTR = KVA_TO_PA(hash); /* Add the data to the current buffer. If the buffer fills, start processing it diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/psa/psa_pkcbs.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/psa/psa_pkcbs.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/psa/psa_pkcbs.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/psa/psa_pkcbs.c 2024-08-03 07:30:00.000000000 +0000 @@ -58,7 +58,7 @@ * psa_ecc_export_to_wc_key() - export psa @key_id into ecc_key @key * @key: already initialized ecc_key to export the key into [out] * @key_id: key to export [in] - * @key_size: size fo the key [in] + * @key_size: size of the key [in] * @curve_id: wc id of the curve [in] * * returns 0 on success diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/riscv/riscv-64-aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/riscv/riscv-64-aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/riscv/riscv-64-aes.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/riscv/riscv-64-aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,9413 @@ +/* riscv-64-aes.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#if !defined(NO_AES) + +#include + +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +#ifdef WOLFSSL_RISCV_ASM + +/* Copy a 16-byte value from in to out. + * + * @param [out] out 16-byte value destination. + * @param [in] in 16-byte value source. + */ +static WC_INLINE void memcpy16(byte* out, const byte* in) +{ + word64* out64 = (word64*)out; + word64* in64 = (word64*)in; + + out64[0] = in64[0]; + out64[1] = in64[1]; +} + +#ifdef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + +/* Reverse bytes in 64-bit register. */ +#define REV8(rd, rs) \ + ASM_WORD((0b011010111000 << 20) | (0b101 << 12) | \ + (0b0010011 << 0) | \ + (rs << 15) | (rd << 7)) + +#endif /* WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + +/* rd = rs1[0..31] | rs2[0..31]. */ +#define PACK(rd, rs1, rs2) \ + ASM_WORD((0b0000100 << 25) | (0b100 << 12) | \ + (0b0110011 << 0) | \ + (rs2 << 20) | (rs1 << 15) | (rd << 7)) + +/* Reverse bits in each byte of 64-bit register. */ +#define BREV8(rd, rs) \ + ASM_WORD(0b01101000011100000101000000010011 | \ + (rs << 15) | (rd << 7)) + +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ + +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + +/* Reverse bits in each byte of 128-bit vector register. */ +#define VBREV8(vd, vs2) \ + ASM_WORD((0b010010 << 26) | (0b1 << 25) | (0b1000 << 15) | \ + (0b010 << 12) | (0b1010111 << 0) | \ + (vs2 << 20) | (vd << 7)) +#endif + +/* vd = vs2 + [i,] */ +#define VADD_VI(vd, vs2, i) \ + ASM_WORD((0b000000 << 26) | (0b1 << 25) | \ + (0b011 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (i << 15) | (vs2 << 20)) +/* vd = vs1 + vs2 */ +#define VADD_VV(vd, vs1, vs2) \ + ASM_WORD((0b000000 << 26) | (0b1 << 25) | \ + (0b000 << 12) | (0b1010111 << 0) | \ + (vs2 << 20) | (vs1 << 15) | (vd << 7)) +/* vd = vs1 ^ vs2 */ +#define VXOR_VV(vd, vs1, vs2) \ + ASM_WORD((0b001011 << 26) | (0b1 << 25) | \ + (0b000 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (vs1 << 15) | (vs2 << 20)) +/* vd = vs1 & vs2 */ +#define VAND_VV(vd, vs1, vs2) \ + ASM_WORD((0b001001 << 26) | (0b1 << 25) | \ + (0b000 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (vs1 << 15) | (vs2 << 20)) +/* vd = vs1 | vs2 */ +#define VOR_VV(vd, vs1, vs2) \ + ASM_WORD((0b001010 << 26) | (0b1 << 25) | \ + (0b000 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (vs1 << 15) | (vs2 << 20)) + +/* vd = vs2 << uimm */ +#define VSLL_VI(vd, vs2, uimm) \ + ASM_WORD((0b100101 << 26) | (0b1 << 25) | \ + (0b011 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (uimm << 15) | (vs2 << 20)) +/* vd = vs2 >> uimm */ +#define VSRL_VI(vd, vs2, uimm) \ + ASM_WORD((0b101000 << 26) | (0b1 << 25) | \ + (0b011 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (uimm << 15) | (vs2 << 20)) + +/* vd[shift..max] = vs2[0..max-shift] */ +#define VSLIDEUP_VI(vd, vs2, shift) \ + ASM_WORD((0b001110 << 26) | (0b1 << 25) | \ + (0b011 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (shift << 15) | (vs2 << 20)) + +/* vd[0..max-shift] = vs2[shift..max] */ +#define VSLIDEDOWN_VI(vd, vs2, shift) \ + ASM_WORD((0b001111 << 26) | (0b1 << 25) | \ + (0b011 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (shift << 15) | (vs2 << 20)) + +/* vd[i] = vs1[vs2[i] */ +#define VRGATHER_VV(vd, vs1, vs2) \ + ASM_WORD((0b001100 << 26) | (0b1 << 25) | \ + (0b000 << 12) | (0b1010111 << 0) | \ + (vd << 7) | (vs1 << 15) | (vs2 << 20)) + +/* Reverse order of bytes in words of vector regsiter. */ +#define VREV8(vd, vs2) \ + ASM_WORD((0b010010 << 26) | (0b1 << 25) | (0b01001<< 15) | \ + (0b010 << 12) | (0b1010111 << 0) | \ + (vs2 << 20) | (vd << 7)) + +/* Vector register set if equal: vd[i] = vs1[i] == vs2[i] ? 1 : 0 */ +#define VMSEQ_VV(vd, vs1, vs2) \ + ASM_WORD((0b011000 << 26) | (0b1 << 25) | \ + (0b000 << 12) | (0b1010111 << 0) | \ + (vs2 << 20) | (vs1 << 15) | (vd << 7)) +/* Vector register set if equal: vd[i] = vs1[i] != vs2[i] ? 1 : 0 */ +#define VMSNE_VV(vd, vs1, vs2) \ + ASM_WORD((0b011001 << 26) | (0b1 << 25) | \ + (0b000 << 12) | (0b1010111 << 0) | \ + (vs2 << 20) | (vs1 << 15) | (vd << 7)) + +/* rd = Count of vs2[i] that has a value of 1. */ +#define VCPOP_M(rd, vs2) \ + ASM_WORD((0b010000 << 26) | (0b1 << 25) | \ + (0b10000 << 15) | \ + (0b010 << 12) | (0b1010111 << 0) | \ + (vs2 << 20) | (rd << 7)) + +/* 64-bit width when loading. */ +#define WIDTH_64 0b111 +/* 32-bit width when loading. */ +#define WIDTH_32 0b110 + +/* Load n Vector registers with width-bit components. */ +#define VLRE_V(vd, rs1, cnt, width) \ + ASM_WORD(0b0000111 | (width << 12) | (0b00101000 << 20) | \ + (0 << 28) | ((cnt - 1) << 29) | (vd << 7) | (rs1 << 15)) +/* Load 1 Vector register with 64-bit components. */ +#define VL1RE64_V(vd, rs1) VLRE_V(vd, rs1, 1, WIDTH_64) +/* Load 1 Vector register with 32-bit components. */ +#define VL1RE32_V(vd, rs1) VLRE_V(vd, rs1, 1, WIDTH_32) +/* Load 2 Vector register with 32-bit components. */ +#define VL2RE32_V(vd, rs1) VLRE_V(vd, rs1, 2, WIDTH_32) +/* Load 4 Vector register with 32-bit components. */ +#define VL4RE32_V(vd, rs1) VLRE_V(vd, rs1, 4, WIDTH_32) +/* Load 8 Vector register with 32-bit components. */ +#define VL8RE32_V(vd, rs1) VLRE_V(vd, rs1, 8, WIDTH_32) + +/* Store n Vector register. */ +#define VSR_V(vs3, rs1, cnt) \ + ASM_WORD(0b0100111 | (0b00101000 << 20) | (0 << 28) | \ + ((cnt-1) << 29) | (vs3 << 7) | (rs1 << 15)) +/* Store 1 Vector register. */ +#define VS1R_V(vs3, rs1) VSR_V(vs3, rs1, 1) +/* Store 2 Vector register. */ +#define VS2R_V(vs3, rs1) VSR_V(vs3, rs1, 2) +/* Store 4 Vector register. */ +#define VS4R_V(vs3, rs1) VSR_V(vs3, rs1, 4) +/* Store 8 Vector register. */ +#define VS8R_V(vs3, rs1) VSR_V(vs3, rs1, 8) + +/* Move from vector register to vector registor. */ +#define VMV_V_V(vd, vs1) \ + ASM_WORD((0b1010111 << 0) | (0b000 << 12) | (0b1 << 25) | \ + (0b010111 << 26) | (vd << 7) | (vs1 << 15)) +/* Splat register to each component of the vector registor. */ +#define VMV_V_X(vd, rs1) \ + ASM_WORD((0b1010111 << 0) | (0b100 << 12) | (0b1 << 25) | \ + (0b010111 << 26) | (vd << 7) | (rs1 << 15)) +/* Move n vector registers to vector registers. */ +#define VMVR_V(vd, vs2, n) \ + ASM_WORD((0b1010111 << 0) | (0b011 << 12) | (0b1 << 25) | \ + (0b100111 << 26) | (vd << 7) | ((n-1) << 15) | \ + (vs2 << 20)) + +/* Set the options of vector instructions. */ +#define VSETIVLI(rd, n, vma, vta, vsew, vlmul) \ + ASM_WORD((0b11 << 30) | (0b111 << 12) | (0b1010111 << 0) | \ + (rd << 7) | (n << 15) | (vma << 27) | \ + (vta << 26) | (vsew << 23) | (vlmul << 20)) + + +#if defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) + +/* + * Vector crypto instruction implementation of base operations. + */ + +/* Vector AES-128 forward key schedule computation. */ +#define VAESKF1_VI(rd, rs2, rnum) \ + ASM_WORD((0b100010 << 26) | (0b1 << 25) | \ + (0b010 << 12) | (0b1110111 << 0) | \ + (rd << 7) | (rnum << 15) | (rs2 << 20)) +/* Vector AES-256 forward key schedule computation. */ +#define VAESKF2_VI(rd, rs2, rnum) \ + ASM_WORD((0b101010 << 26) | (0b1 << 25) | \ + (0b010 << 12) | (0b1110111 << 0) | \ + (rd << 7) | (rnum << 15) | (rs2 << 20)) + +/* Vector AES round zero encryption/decryption. */ +#define VAESZ_VS(rd, rs2) \ + ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ + (0b00111 << 15) | (0b010 << 12) | \ + (0b1110111 << 0) | \ + (rd << 7) | (rs2 << 20)) +/* Vector AES middle-round encryption. */ +#define VAESEM_VS(rd, rs2) \ + ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ + (0b00010 << 15) | (0b010 << 12) | \ + (0b1110111 << 0) | \ + (rd << 7) | (rs2 << 20)) +/* Vector AES final-round encryption. */ +#define VAESEF_VS(rd, rs2) \ + ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ + (0b00011 << 15) | (0b010 << 12) | \ + (0b1110111 << 0) | \ + (rd << 7) | (rs2 << 20)) +/* Vector AES middle-round decryption. */ +#define VAESDM_VS(rd, rs2) \ + ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ + (0b00000 << 15) | (0b010 << 12) | \ + (0b1110111 << 0) | \ + (rd << 7) | (rs2 << 20)) +/* Vector AES final-round decryption. */ +#define VAESDF_VS(rd, rs2) \ + ASM_WORD((0b101001 << 26) | (0b1 << 25) | \ + (0b00001 << 15) | (0b010 << 12) | \ + (0b1110111 << 0) | \ + (rd << 7) | (rs2 << 20)) + +/* Set the key and/or IV into the AES object. + * + * Creates the key schedule from the key. + * Uses Vector Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [in] key Secret key to use. + * @param [in] keyLen Length of key in bytes. + * @param [in] iv Initialization Vector (IV) to use. May be NULL. + * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes or key is NULL. + * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. + */ +int wc_AesSetKey(Aes* aes, const byte* key, word32 keyLen, const byte* iv, + int dir) +{ + int ret = 0; + + /* Validate parameters. */ + if ((aes == NULL) || (key == NULL)) { + ret = BAD_FUNC_ARG; + } +#ifdef WOLFSSL_AES_128 + else if ((keyLen == 16) && (dir == AES_ENCRYPTION)) { + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + "mv t0, %[key]\n\t" + VL1RE32_V(REG_V0, REG_T0) + "mv t0, %[ks]\n\t" + VAESKF1_VI(REG_V1, REG_V0, 1) + VAESKF1_VI(REG_V2, REG_V1, 2) + VAESKF1_VI(REG_V3, REG_V2, 3) + VAESKF1_VI(REG_V4, REG_V3, 4) + VAESKF1_VI(REG_V5, REG_V4, 5) + VAESKF1_VI(REG_V6, REG_V5, 6) + VAESKF1_VI(REG_V7, REG_V6, 7) + VAESKF1_VI(REG_V8, REG_V7, 8) + VAESKF1_VI(REG_V9, REG_V8, 9) + VAESKF1_VI(REG_V10, REG_V9, 10) + VS8R_V(REG_V0, REG_T0) + "add t0, t0, 128\n\t" + VS2R_V(REG_V8, REG_T0) + "add t0, t0, 96\n\t" + VS1R_V(REG_V10, REG_T0) + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2" + ); + aes->rounds = 10; + } +#ifdef HAVE_AES_DECRYPT + else if ((keyLen == 16) && (dir == AES_DECRYPTION)) { + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + "mv t0, %[key]\n\t" + VL1RE32_V(REG_V10, REG_T0) + "mv t0, %[ks]\n\t" + VAESKF1_VI(REG_V9, REG_V10, 1) + VAESKF1_VI(REG_V8, REG_V9 , 2) + VAESKF1_VI(REG_V7, REG_V8 , 3) + VAESKF1_VI(REG_V6, REG_V7 , 4) + VAESKF1_VI(REG_V5, REG_V6 , 5) + VAESKF1_VI(REG_V4, REG_V5 , 6) + VAESKF1_VI(REG_V3, REG_V4 , 7) + VAESKF1_VI(REG_V2, REG_V3 , 8) + VAESKF1_VI(REG_V1, REG_V2 , 9) + VAESKF1_VI(REG_V0, REG_V1 , 10) + VS8R_V(REG_V0, REG_T0) + "add t0, t0, 128\n\t" + VS2R_V(REG_V8, REG_T0) + "add t0, t0, 96\n\t" + VS1R_V(REG_V10, REG_T0) + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2" + ); + aes->rounds = 10; + } +#endif +#endif +#ifdef WOLFSSL_AES_192 + +/* One round of computing key schedule for AES-192. */ +#define AES_192_ROUND(d, s, r) \ + /* Place key[3] in v16[3] */ \ + VSLIDEDOWN_VI(REG_V17, s, 3) \ + VSLIDEUP_VI(REG_V16, REG_V17, 3) \ + /* Place key[5] in s[3] */ \ + VSLIDEUP_VI(s, REG_V14, 3) \ + /* key'[0] = key[0] ^ ks1(key[5]) */ \ + /* key'[1] = key[1] ^ key'[0] */ \ + /* key'[2] = key[2] ^ key'[1] */ \ + /* key'[3] = key[5] ^ key'[2] */ \ + VAESKF1_VI(d, s, r) \ + /* key'[3] = key[3] ^ key[5] ^ key'[2] */ \ + VXOR_VV(d, d, REG_V16) \ + /* key'[3] = key[3] ^ key'[2] */ \ + VSLIDEUP_VI(REG_V16, REG_V14, 3) \ + VXOR_VV(d, d, REG_V16) \ + /* key'[4] = key[4] ^ key'[3] */ \ + VSLIDEDOWN_VI(REG_V15, d, 3) \ + VXOR_VV(REG_V13, REG_V13, REG_V15) \ + /* key'[5] = key[5] ^ key'[4] */ \ + VXOR_VV(REG_V14, REG_V14, REG_V13) \ + +/* Store 6 words. + * V13[0] and V14[0] contain last two words. */ +#define AES_192_STORE(d) \ + VS1R_V(d, REG_T0) \ + "addi t0, t0, 16\n\t" \ + VSLIDEUP_VI(REG_V13, REG_V14, 1) \ + VSETIVLI(REG_X0, 2, 1, 1, 0b010, 0b000) \ + VS1R_V(REG_V13, REG_T0) \ + "addi t0, t0, 8\n\t" \ + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + else if ((keyLen == 24) && (dir == AES_ENCRYPTION)) { + /* Not supported with specific instructions - make it work anyway! */ + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + "mv t0, %[key]\n\t" + VL1RE32_V(REG_V0, REG_T0) + VSETIVLI(REG_X0, 1, 1, 1, 0b010, 0b000) + "addi t0, t0, 16\n\t" + VL1RE32_V(REG_V13, REG_T0) + "addi t0, t0, 4\n\t" + VL1RE32_V(REG_V14, REG_T0) + VXOR_VV(REG_V16, REG_V16, REG_V16) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + "mv t0, %[ks]\n\t" + + /* Round 0 */ + AES_192_STORE(REG_V0) + /* Round 1 */ + AES_192_ROUND(REG_V1, REG_V0, 1) + AES_192_STORE(REG_V1) + /* Round 2 */ + AES_192_ROUND(REG_V0, REG_V1, 2) + AES_192_STORE(REG_V0) + /* Round 3 */ + AES_192_ROUND(REG_V1, REG_V0, 3) + AES_192_STORE(REG_V1) + /* Round 4 */ + AES_192_ROUND(REG_V0, REG_V1, 4) + AES_192_STORE(REG_V0) + /* Round 5 */ + AES_192_ROUND(REG_V1, REG_V0, 5) + AES_192_STORE(REG_V1) + /* Round 6 */ + AES_192_ROUND(REG_V0, REG_V1, 6) + AES_192_STORE(REG_V0) + /* Round 7 */ + AES_192_ROUND(REG_V1, REG_V0, 7) + AES_192_STORE(REG_V1) + /* Round 8 */ + AES_192_ROUND(REG_V0, REG_V1, 8) + "addi t0, t0, 32\n\t" + VS1R_V(REG_V0, REG_T0) + /* Only need 52 32-bit words - 13 rounds x 4 32-bit words. */ + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0" + ); + aes->rounds = 12; + } +#ifdef HAVE_AES_DECRYPT + else if ((keyLen == 24) && (dir == AES_DECRYPTION)) { + /* Not supported with specific instructions - make it work anyway! */ + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + "mv t0, %[key]\n\t" + VL1RE32_V(REG_V0, REG_T0) + VSETIVLI(REG_X0, 1, 1, 1, 0b010, 0b000) + "addi t0, t0, 16\n\t" + VL1RE32_V(REG_V13, REG_T0) + "addi t0, t0, 4\n\t" + VL1RE32_V(REG_V14, REG_T0) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VXOR_VV(REG_V16, REG_V16, REG_V16) + + "addi t0, %[ks], 224\n\t" + VS1R_V(REG_V0, REG_T0) + + "mv t0, %[ks]\n\t" + + /* Round 0 */ + AES_192_STORE(REG_V0) + /* Round 1 */ + AES_192_ROUND(REG_V1, REG_V0, 1) + AES_192_STORE(REG_V1) + /* Round 2 */ + AES_192_ROUND(REG_V0, REG_V1, 2) + AES_192_STORE(REG_V0) + /* Round 3 */ + AES_192_ROUND(REG_V1, REG_V0, 3) + AES_192_STORE(REG_V1) + /* Round 4 */ + AES_192_ROUND(REG_V0, REG_V1, 4) + AES_192_STORE(REG_V0) + /* Round 5 */ + AES_192_ROUND(REG_V1, REG_V0, 5) + AES_192_STORE(REG_V1) + /* Round 6 */ + AES_192_ROUND(REG_V0, REG_V1, 6) + AES_192_STORE(REG_V0) + /* Round 7 */ + AES_192_ROUND(REG_V1, REG_V0, 7) + AES_192_STORE(REG_V1) + /* Round 8 */ + AES_192_ROUND(REG_V0, REG_V1, 8) + VS1R_V(REG_V0, REG_T0) + /* Only need 52 32-bit words - 13 rounds x 4 32-bit words. */ + + /* Invert the order of the round keys. */ + "mv t0, %[ks]\n\t" + VL4RE32_V(REG_V0, REG_T0) + "addi t0, %[ks], 64\n\t" + VL2RE32_V(REG_V4, REG_T0) + "addi t1, %[ks], 112\n\t" + VL4RE32_V(REG_V8, REG_T1) + "addi t1, %[ks], 176\n\t" + VL2RE32_V(REG_V12, REG_T1) + VMV_V_V(REG_V21, REG_V0 ) + VMV_V_V(REG_V20, REG_V1 ) + VMV_V_V(REG_V19, REG_V2 ) + VMV_V_V(REG_V18, REG_V3 ) + VMV_V_V(REG_V17, REG_V4 ) + VMV_V_V(REG_V16, REG_V5 ) + VMV_V_V(REG_V5 , REG_V8 ) + VMV_V_V(REG_V4 , REG_V9 ) + VMV_V_V(REG_V3 , REG_V10) + VMV_V_V(REG_V2 , REG_V11) + VMV_V_V(REG_V1 , REG_V12) + VMV_V_V(REG_V0 , REG_V13) + "mv t0, %[ks]\n\t" + VS4R_V(REG_V0, REG_T0) + "addi t0, %[ks], 64\n\t" + VS2R_V(REG_V4, REG_T0) + "addi t1, %[ks], 112\n\t" + VS4R_V(REG_V16, REG_T1) + "addi t1, %[ks], 176\n\t" + VS2R_V(REG_V20, REG_T1) + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1" + ); + aes->rounds = 12; + } +#endif +#endif +#ifdef WOLFSSL_AES_256 + else if ((keyLen == 32) && (dir == AES_ENCRYPTION)) { + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + "mv t0, %[key]\n\t" + VL2RE32_V(REG_V0, REG_T0) + "mv t0, %[ks]\n\t" + VMV_V_V(REG_V14, REG_V0) + VMV_V_V(REG_V13, REG_V1) + VAESKF2_VI(REG_V14, REG_V13, 2) + VMV_V_V(REG_V2, REG_V14) + VAESKF2_VI(REG_V13, REG_V14, 3) + VMV_V_V(REG_V3, REG_V13) + VAESKF2_VI(REG_V14, REG_V13, 4) + VMV_V_V(REG_V4, REG_V14) + VAESKF2_VI(REG_V13, REG_V14, 5) + VMV_V_V(REG_V5, REG_V13) + VAESKF2_VI(REG_V14, REG_V13, 6) + VMV_V_V(REG_V6, REG_V14) + VAESKF2_VI(REG_V13, REG_V14, 7) + VMV_V_V(REG_V7, REG_V13) + VAESKF2_VI(REG_V14, REG_V13, 8) + VMV_V_V(REG_V8, REG_V14) + VAESKF2_VI(REG_V13, REG_V14, 9) + VMV_V_V(REG_V9, REG_V13) + VAESKF2_VI(REG_V14, REG_V13, 10) + VMV_V_V(REG_V10, REG_V14) + VAESKF2_VI(REG_V13, REG_V14, 11) + VMV_V_V(REG_V11, REG_V13) + VAESKF2_VI(REG_V14, REG_V13, 12) + VMV_V_V(REG_V12, REG_V14) + VAESKF2_VI(REG_V13, REG_V14, 13) + VAESKF2_VI(REG_V14, REG_V13, 14) + VS8R_V(REG_V0, REG_T0) + "add t0, t0, 128\n\t" + VSR_V(REG_V8, REG_T0, 4) + "add t0, t0, 64\n\t" + VSR_V(REG_V12, REG_T0, 2) + "add t0, t0, 32\n\t" + VSR_V(REG_V14, REG_T0, 1) + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2" + ); + aes->rounds = 14; + } +#ifdef HAVE_AES_DECRYPT + else if ((keyLen == 32) && (dir == AES_DECRYPTION)) { + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + "mv t0, %[key]\n\t" + VL2RE32_V(REG_V0, REG_T0) + VMV_V_V(REG_V13, REG_V1) + VMV_V_V(REG_V14, REG_V0) + "mv t0, %[ks]\n\t" + VAESKF2_VI(REG_V0, REG_V1, 2) + VMV_V_V(REG_V12, REG_V0) + VAESKF2_VI(REG_V1, REG_V0, 3) + VMV_V_V(REG_V11, REG_V1) + VAESKF2_VI(REG_V0, REG_V1, 4) + VMV_V_V(REG_V10, REG_V0) + VAESKF2_VI(REG_V1, REG_V0, 5) + VMV_V_V(REG_V9 , REG_V1) + VAESKF2_VI(REG_V0, REG_V1, 6) + VMV_V_V(REG_V8 , REG_V0) + VAESKF2_VI(REG_V1, REG_V0, 7) + VMV_V_V(REG_V7 , REG_V1) + VAESKF2_VI(REG_V0, REG_V1, 8) + VMV_V_V(REG_V6 , REG_V0) + VAESKF2_VI(REG_V1, REG_V0, 9) + VMV_V_V(REG_V5 , REG_V1) + VAESKF2_VI(REG_V0, REG_V1, 10) + VMV_V_V(REG_V4 , REG_V0) + VAESKF2_VI(REG_V1, REG_V0, 11) + VMV_V_V(REG_V3 , REG_V1) + VAESKF2_VI(REG_V0, REG_V1, 12) + VMV_V_V(REG_V2 , REG_V0) + VAESKF2_VI(REG_V1, REG_V0, 13) + VAESKF2_VI(REG_V0, REG_V1, 14) + VS8R_V(REG_V0, REG_T0) + "add t0, t0, 128\n\t" + VSR_V(REG_V8, REG_T0, 4) + "add t0, t0, 64\n\t" + VSR_V(REG_V12, REG_T0, 2) + "add t0, t0, 32\n\t" + VSR_V(REG_V14, REG_T0, 1) + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2" + ); + aes->rounds = 14; + } +#endif +#endif + else { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Set the IV. */ + ret = wc_AesSetIV(aes, iv); + } + if (ret == 0) { + /* Finish setting the AES object. */ + aes->keylen = keyLen; +#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \ + defined(WOLFSSL_AES_OFB) + aes->left = 0; +#endif + } + + return ret; +} + +#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AESGCM) || defined(HAVE_AESCCM) +/* Encrypt a block using AES. + * + * Uses Vector Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + */ +static void wc_AesEncrypt(Aes* aes, const byte* in, byte* out) +{ + word32* key = aes->key; + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..9]. */ + "addi t0, t0, 128\n\t" + VL2RE32_V(REG_V8, REG_T0) + /* Check for 11 rounds. */ + "li t4, 11\n\t" + "ble %[rounds], t4, L_aes_encrypt_loaded\n\t" + /* Load key[10..11]. */ + "addi t0, t0, 32\n\t" + VL2RE32_V(REG_V10, REG_T0) + /* Check for 13 rounds. */ + "li t4, 13\n\t" + "ble %[rounds], t4, L_aes_encrypt_loaded\n\t" + /* Load key[12..13]. */ + "addi t0, t0, 32\n\t" + VL2RE32_V(REG_V12, REG_T0) + "L_aes_encrypt_loaded:\n\t" + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V14, REG_T0) + + /* Load block. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + + /* Encrypt 10 rounds. */ + VAESZ_VS(REG_V15, REG_V0) + VAESEM_VS(REG_V15, REG_V1) + VAESEM_VS(REG_V15, REG_V2) + VAESEM_VS(REG_V15, REG_V3) + VAESEM_VS(REG_V15, REG_V4) + VAESEM_VS(REG_V15, REG_V5) + VAESEM_VS(REG_V15, REG_V6) + VAESEM_VS(REG_V15, REG_V7) + VAESEM_VS(REG_V15, REG_V8) + VAESEM_VS(REG_V15, REG_V9) + /* Check for 11 rounds. */ + "li t4, 11\n\t" + "ble %[rounds], t4, L_aes_encrypt_done\n\t" + VAESEM_VS(REG_V15, REG_V10) + VAESEM_VS(REG_V15, REG_V11) + /* Check for 13 rounds. */ + "li t4, 13\n\t" + "ble %[rounds], t4, L_aes_encrypt_done\n\t" + VAESEM_VS(REG_V15, REG_V12) + VAESEM_VS(REG_V15, REG_V13) + "L_aes_encrypt_done:\n\t" + /* Last round. */ + VAESEF_VS(REG_V15, REG_V14) + + /* Store encrypted block. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + + : + : [in] "r" (in), [out] "r" (out), [key] "r" (key), + [rounds] "r" (aes->rounds) + : "memory", "t0", "t1", "t2", "t4" + ); +} +#endif + +#ifdef HAVE_AES_DECRYPT +#ifdef WOLFSSL_AES_DIRECT +/* Decrypt a block using AES. + * + * Uses Vector Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [in] in Block to decrypt. + * @param [out] out Decrypted block. + */ +static void wc_AesDecrypt(Aes* aes, const byte* in, byte* out) +{ + word32* key = aes->key; + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..9]. */ + "addi t0, t0, 128\n\t" + VL2RE32_V(REG_V8, REG_T0) + /* Check for 11 rounds. */ + "li t4, 11\n\t" + "ble %[rounds], t4, L_aes_decrypt_loaded\n\t" + /* Load key[10..11]. */ + "addi t0, t0, 32\n\t" + VL2RE32_V(REG_V10, REG_T0) + /* Check for 13 rounds. */ + "li t4, 13\n\t" + "ble %[rounds], t4, L_aes_decrypt_loaded\n\t" + /* Load key[12..13]. */ + "addi t0, t0, 32\n\t" + VL2RE32_V(REG_V12, REG_T0) + "L_aes_decrypt_loaded:\n\t" + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V14, REG_T0) + + /* Load block. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + + /* Decrypt 10 rounds. */ + VAESZ_VS(REG_V15, REG_V0) + VAESDM_VS(REG_V15, REG_V1) + VAESDM_VS(REG_V15, REG_V2) + VAESDM_VS(REG_V15, REG_V3) + VAESDM_VS(REG_V15, REG_V4) + VAESDM_VS(REG_V15, REG_V5) + VAESDM_VS(REG_V15, REG_V6) + VAESDM_VS(REG_V15, REG_V7) + VAESDM_VS(REG_V15, REG_V8) + VAESDM_VS(REG_V15, REG_V9) + /* Check for 11 rounds. */ + "li t4, 11\n\t" + "ble %[rounds], t4, L_aes_decrypt_done\n\t" + VAESDM_VS(REG_V15, REG_V10) + VAESDM_VS(REG_V15, REG_V11) + /* Check for 13 rounds. */ + "li t4, 13\n\t" + "ble %[rounds], t4, L_aes_decrypt_done\n\t" + VAESDM_VS(REG_V15, REG_V12) + VAESDM_VS(REG_V15, REG_V13) + "L_aes_decrypt_done:\n\t" + /* Last round. */ + VAESDF_VS(REG_V15, REG_V14) + + /* Store decrypted block. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + + : + : [in] "r" (in), [out] "r" (out), [key] "r" (key), + [rounds] "r" (aes->rounds) + : "memory", "t0", "t1", "t2", "t4" + ); +} +#endif /* WOLFSSL_AES_DIRECT */ +#endif /* HAVE_AES_DECRYPT */ + +/* AES-CBC */ +#ifdef HAVE_AES_CBC +/* Encrypt blocks of data using AES-CBC. + * + * Uses Vector Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [out] out Encrypted blocks. + * @param [in] in Blocks to encrypt. + * @param pin] sz Number of bytes to encrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_LENGTH_E when sz is not a multiple of AES_BLOCK_SIZE. + */ +int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + int ret = 0; + word32 blocks = sz / AES_BLOCK_SIZE; + + /* Validate parameters. */ + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + /* Ensure a multiple of blocks is to be encrypted. */ + if ((ret == 0) && (sz % AES_BLOCK_SIZE)) { + ret = BAD_LENGTH_E; + } +#endif + + if ((ret == 0) && (sz > 0)) { + switch (aes->rounds) { +#ifdef WOLFSSL_AES_128 + case 10: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..9]. */ + "addi t0, t0, 128\n\t" + VL2RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V10, REG_T0) + /* Load the IV. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V11, REG_T0) + + "L_aes_cbc_128_encrypt_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + VXOR_VV(REG_V15, REG_V15, REG_V11) + + VAESZ_VS(REG_V15, REG_V0) + VAESEM_VS(REG_V15, REG_V1) + VAESEM_VS(REG_V15, REG_V2) + VAESEM_VS(REG_V15, REG_V3) + VAESEM_VS(REG_V15, REG_V4) + VAESEM_VS(REG_V15, REG_V5) + VAESEM_VS(REG_V15, REG_V6) + VAESEM_VS(REG_V15, REG_V7) + VAESEM_VS(REG_V15, REG_V8) + VAESEM_VS(REG_V15, REG_V9) + VAESEF_VS(REG_V15, REG_V10) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + VMV_V_V(REG_V11, REG_V15) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_cbc_128_encrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V11, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif +#ifdef WOLFSSL_AES_192 + case 12: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V12, REG_T0) + /* Load the IV. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V13, REG_T0) + + "L_aes_cbc_192_encrypt_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + VXOR_VV(REG_V15, REG_V15, REG_V13) + + VAESZ_VS(REG_V15, REG_V0) + VAESEM_VS(REG_V15, REG_V1) + VAESEM_VS(REG_V15, REG_V2) + VAESEM_VS(REG_V15, REG_V3) + VAESEM_VS(REG_V15, REG_V4) + VAESEM_VS(REG_V15, REG_V5) + VAESEM_VS(REG_V15, REG_V6) + VAESEM_VS(REG_V15, REG_V7) + VAESEM_VS(REG_V15, REG_V8) + VAESEM_VS(REG_V15, REG_V9) + VAESEM_VS(REG_V15, REG_V10) + VAESEM_VS(REG_V15, REG_V11) + VAESEF_VS(REG_V15, REG_V12) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + VMV_V_V(REG_V13, REG_V15) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_cbc_192_encrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V13, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif +#ifdef WOLFSSL_AES_256 + case 14: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load key[12..13]. */ + "addi t0, t0, 64\n\t" + VL2RE32_V(REG_V12, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V14, REG_T0) + /* Load the IV. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V16, REG_T0) + + "L_aes_cbc_256_encrypt_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + VXOR_VV(REG_V15, REG_V15, REG_V16) + + VAESZ_VS(REG_V15, REG_V0) + VAESEM_VS(REG_V15, REG_V1) + VAESEM_VS(REG_V15, REG_V2) + VAESEM_VS(REG_V15, REG_V3) + VAESEM_VS(REG_V15, REG_V4) + VAESEM_VS(REG_V15, REG_V5) + VAESEM_VS(REG_V15, REG_V6) + VAESEM_VS(REG_V15, REG_V7) + VAESEM_VS(REG_V15, REG_V8) + VAESEM_VS(REG_V15, REG_V9) + VAESEM_VS(REG_V15, REG_V10) + VAESEM_VS(REG_V15, REG_V11) + VAESEM_VS(REG_V15, REG_V12) + VAESEM_VS(REG_V15, REG_V13) + VAESEF_VS(REG_V15, REG_V14) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + VMV_V_V(REG_V16, REG_V15) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_cbc_256_encrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V16, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif + } + } + + return ret; +} + +#ifdef HAVE_AES_DECRYPT +/* Decrypt blocks of data using AES-CBC. + * + * Uses Vector Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [out] out Decrypted blocks. + * @param [in] in Blocks to decrypt. + * @param pin] sz Number of bytes to decrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_FUNC_ARG when sz is not a multiple of AES_BLOCK_SIZE. + * @return BAD_LENGTH_E when sz is not a multiple of AES_BLOCK_SIZE. + */ +int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + int ret = 0; + word32 blocks = sz / AES_BLOCK_SIZE; + + /* Validate parameters. */ + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Ensure a multiple of blocks is being decrypted. */ + if ((ret == 0) && (sz % AES_BLOCK_SIZE)) { +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + ret = BAD_LENGTH_E; +#else + ret = BAD_FUNC_ARG; +#endif + } + + if ((ret == 0) && (sz > 0)) { + switch (aes->rounds) { +#ifdef WOLFSSL_AES_128 + case 10: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..9]. */ + "addi t0, t0, 128\n\t" + VL2RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V10, REG_T0) + /* Load the IV. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V11, REG_T0) + + "L_aes_cbc_128_decrypt_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + VMV_V_V(REG_V14, REG_V15) + + VAESZ_VS(REG_V15, REG_V0) + VAESDM_VS(REG_V15, REG_V1) + VAESDM_VS(REG_V15, REG_V2) + VAESDM_VS(REG_V15, REG_V3) + VAESDM_VS(REG_V15, REG_V4) + VAESDM_VS(REG_V15, REG_V5) + VAESDM_VS(REG_V15, REG_V6) + VAESDM_VS(REG_V15, REG_V7) + VAESDM_VS(REG_V15, REG_V8) + VAESDM_VS(REG_V15, REG_V9) + VAESDF_VS(REG_V15, REG_V10) + VXOR_VV(REG_V15, REG_V15, REG_V11) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + VMV_V_V(REG_V11, REG_V14) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_cbc_128_decrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V11, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif +#ifdef WOLFSSL_AES_192 + case 12: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V12, REG_T0) + /* Load the IV. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V13, REG_T0) + + "L_aes_cbc_192_decrypt_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + VMV_V_V(REG_V14, REG_V15) + + VAESZ_VS(REG_V15, REG_V0) + VAESDM_VS(REG_V15, REG_V1) + VAESDM_VS(REG_V15, REG_V2) + VAESDM_VS(REG_V15, REG_V3) + VAESDM_VS(REG_V15, REG_V4) + VAESDM_VS(REG_V15, REG_V5) + VAESDM_VS(REG_V15, REG_V6) + VAESDM_VS(REG_V15, REG_V7) + VAESDM_VS(REG_V15, REG_V8) + VAESDM_VS(REG_V15, REG_V9) + VAESDM_VS(REG_V15, REG_V10) + VAESDM_VS(REG_V15, REG_V11) + VAESDF_VS(REG_V15, REG_V12) + VXOR_VV(REG_V15, REG_V15, REG_V13) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + VMV_V_V(REG_V13, REG_V14) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_cbc_192_decrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V13, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif +#ifdef WOLFSSL_AES_256 + case 14: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load key[12..13]. */ + "addi t0, t0, 64\n\t" + VL2RE32_V(REG_V12, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V14, REG_T0) + /* Load the IV. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V16, REG_T0) + + "L_aes_cbc_256_decrypt_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V15, REG_T0) + VMV_V_V(REG_V17, REG_V15) + + VAESZ_VS(REG_V15, REG_V0) + VAESDM_VS(REG_V15, REG_V1) + VAESDM_VS(REG_V15, REG_V2) + VAESDM_VS(REG_V15, REG_V3) + VAESDM_VS(REG_V15, REG_V4) + VAESDM_VS(REG_V15, REG_V5) + VAESDM_VS(REG_V15, REG_V6) + VAESDM_VS(REG_V15, REG_V7) + VAESDM_VS(REG_V15, REG_V8) + VAESDM_VS(REG_V15, REG_V9) + VAESDM_VS(REG_V15, REG_V10) + VAESDM_VS(REG_V15, REG_V11) + VAESDM_VS(REG_V15, REG_V12) + VAESDM_VS(REG_V15, REG_V13) + VAESDF_VS(REG_V15, REG_V14) + VXOR_VV(REG_V15, REG_V15, REG_V16) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + VMV_V_V(REG_V16, REG_V17) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_cbc_256_decrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V16, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif + } + } + + return ret; +} +#endif /* HAVE_AES_DECRYPT */ + +/* Don't need generic implementation. */ +#define HAVE_AES_CBC_ENC_DEC + +#endif /* HAVE_AES_CBC */ + +/* AES-CTR */ +#ifdef WOLFSSL_AES_COUNTER +/* Encrypt blocks using AES-CTR. + * + * Uses Vector Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [out] out Encrypted blocks. + * @param [in] in Blocks to encrypt. + * @param [in] blocks Number of blocks to encrypt. + */ +static void wc_aes_ctr_encrypt_asm(Aes* aes, byte* out, const byte* in, + word32 blocks) +{ + switch(aes->rounds) { +#ifdef WOLFSSL_AES_128 + case 10: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..9]. */ + "addi t0, t0, 128\n\t" + VL2RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V10, REG_T0) + /* Load the counter. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V16, REG_T0) + "li t2, 1 \n\t" + + "L_aes_ctr_128_encrypt_block_loop:\n\t" + VMV_V_V(REG_V15, REG_V16) + VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) + VREV8(REG_V16, REG_V16) + VSLIDEDOWN_VI(REG_V17, REG_V16, 1) + VXOR_VV(REG_V18, REG_V18, REG_V18) + VADD_VI(REG_V17, REG_V17, 1) + VMSEQ_VV(REG_V18, REG_V18, REG_V17) + VSLIDEUP_VI(REG_V16, REG_V17, 1) + VADD_VV(REG_V16, REG_V16, REG_V18) + VREV8(REG_V16, REG_V16) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + VAESZ_VS(REG_V15, REG_V0) + VAESEM_VS(REG_V15, REG_V1) + VAESEM_VS(REG_V15, REG_V2) + VAESEM_VS(REG_V15, REG_V3) + VAESEM_VS(REG_V15, REG_V4) + VAESEM_VS(REG_V15, REG_V5) + VAESEM_VS(REG_V15, REG_V6) + VAESEM_VS(REG_V15, REG_V7) + VAESEM_VS(REG_V15, REG_V8) + VAESEM_VS(REG_V15, REG_V9) + VAESEF_VS(REG_V15, REG_V10) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V15, REG_V15, REG_V17) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_ctr_128_encrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V16, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif +#ifdef WOLFSSL_AES_192 + case 12: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V12, REG_T0) + /* Load the counter. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V16, REG_T0) + "li t2, 1 \n\t" + + "L_aes_ctr_192_encrypt_block_loop:\n\t" + VMV_V_V(REG_V15, REG_V16) + VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) + VREV8(REG_V16, REG_V16) + VSLIDEDOWN_VI(REG_V17, REG_V16, 1) + VXOR_VV(REG_V18, REG_V18, REG_V18) + VADD_VI(REG_V17, REG_V17, 1) + VMSEQ_VV(REG_V18, REG_V18, REG_V17) + VSLIDEUP_VI(REG_V16, REG_V17, 1) + VADD_VV(REG_V16, REG_V16, REG_V18) + VREV8(REG_V16, REG_V16) + VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) + + VAESZ_VS(REG_V15, REG_V0) + VAESEM_VS(REG_V15, REG_V1) + VAESEM_VS(REG_V15, REG_V2) + VAESEM_VS(REG_V15, REG_V3) + VAESEM_VS(REG_V15, REG_V4) + VAESEM_VS(REG_V15, REG_V5) + VAESEM_VS(REG_V15, REG_V6) + VAESEM_VS(REG_V15, REG_V7) + VAESEM_VS(REG_V15, REG_V8) + VAESEM_VS(REG_V15, REG_V9) + VAESEM_VS(REG_V15, REG_V10) + VAESEM_VS(REG_V15, REG_V11) + VAESEF_VS(REG_V15, REG_V12) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V15, REG_V15, REG_V17) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_ctr_192_encrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V16, REG_T0) + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif +#ifdef WOLFSSL_AES_256 + case 14: + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load key[12..13]. */ + "addi t0, t0, 64\n\t" + VL2RE32_V(REG_V12, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V14, REG_T0) + /* Load the counter. */ + "mv t0, %[reg]\n\t" + VL1RE32_V(REG_V16, REG_T0) + "li t2, 1 \n\t" + + "L_aes_ctr_256_encrypt_block_loop:\n\t" + VMV_V_V(REG_V15, REG_V16) + VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) + VREV8(REG_V16, REG_V16) + VSLIDEDOWN_VI(REG_V17, REG_V16, 1) + VXOR_VV(REG_V18, REG_V18, REG_V18) + VADD_VI(REG_V17, REG_V17, 1) + VMSEQ_VV(REG_V18, REG_V18, REG_V17) + VSLIDEUP_VI(REG_V16, REG_V17, 1) + VADD_VV(REG_V16, REG_V16, REG_V18) + VREV8(REG_V16, REG_V16) + VSETIVLI(REG_X0, 4, 0, 0, 0b010, 0b000) + + VAESZ_VS(REG_V15, REG_V0) + VAESEM_VS(REG_V15, REG_V1) + VAESEM_VS(REG_V15, REG_V2) + VAESEM_VS(REG_V15, REG_V3) + VAESEM_VS(REG_V15, REG_V4) + VAESEM_VS(REG_V15, REG_V5) + VAESEM_VS(REG_V15, REG_V6) + VAESEM_VS(REG_V15, REG_V7) + VAESEM_VS(REG_V15, REG_V8) + VAESEM_VS(REG_V15, REG_V9) + VAESEM_VS(REG_V15, REG_V10) + VAESEM_VS(REG_V15, REG_V11) + VAESEM_VS(REG_V15, REG_V12) + VAESEM_VS(REG_V15, REG_V13) + VAESEF_VS(REG_V15, REG_V14) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V15, REG_V15, REG_V17) + + "mv t0, %[out]\n\t" + VS1R_V(REG_V15, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_aes_ctr_256_encrypt_block_loop\n\t" + + "mv t0, %[reg]\n\t" + VS1R_V(REG_V16, REG_T0) + "mv t0, %[reg]\n\t" + : [blocks] "+r" (blocks) + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [reg] "r" (aes->reg) + : "memory", "t0", "t1", "t2", "t4" + ); + break; +#endif + } +} + +/* Encrypt blocks of data using AES-CTR. + * + * Uses Vector Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [out] out Encrypted blocks. + * @param [in] in Blocks to encrypt. + * @param [in] sz Number of bytes to encrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_FUNC_ARG when key size in AES object is not supported. + */ +int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + int ret = 0; + word32 processed; + + /* Validate parameters. */ + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Check key size is supported. */ + switch (aes->rounds) { + #ifdef WOLFSSL_AES_128 + case 10: /* AES 128 BLOCK */ + #endif /* WOLFSSL_AES_128 */ + #ifdef WOLFSSL_AES_192 + case 12: /* AES 192 BLOCK */ + #endif /* WOLFSSL_AES_192 */ + #ifdef WOLFSSL_AES_256 + case 14: /* AES 256 BLOCK */ + #endif /* WOLFSSL_AES_256 */ + break; + default: + WOLFSSL_MSG("Bad AES-CTR round value"); + ret = BAD_FUNC_ARG; + } + } + + if (ret == 0) { + /* Use up any unused bytes left in aes->tmp */ + processed = min(aes->left, sz); + if (processed > 0) { + /* XOR in encrypted counter. */ + xorbufout(out, in, (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left, + processed); + out += processed; + in += processed; + aes->left -= processed; + sz -= processed; + } + + /* Do whole blocks of data. */ + while (sz >= AES_BLOCK_SIZE) { + word32 blocks = sz / AES_BLOCK_SIZE; + + wc_aes_ctr_encrypt_asm(aes, out, in, blocks); + + processed = blocks * AES_BLOCK_SIZE; + out += processed; + in += processed; + sz -= processed; + aes->left = 0; + } + + if (sz > 0) { + /* Encrypt counter and store in aes->tmp. + * Use up aes->tmp to encrypt data less than a block. + */ + static const byte zeros[AES_BLOCK_SIZE] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + wc_aes_ctr_encrypt_asm(aes, (byte*)aes->tmp, zeros, 1); + /* XOR in encrypted counter. */ + xorbufout(out, in, aes->tmp, sz); + aes->left = AES_BLOCK_SIZE - sz; + } + } + + return ret; +} + +/* Don't need generic implementation. */ +#define HAVE_AES_COUNTER_ENC + +#endif /* WOLFSSL_AES_COUNTER */ + +#elif defined(WOLFSSL_RISCV_SCALAR_CRYPTO_ASM) + +/* + * Scalar crypto instruction implementation of base operations. + */ + +/* AES key schedule SBox operation. */ +#define AES64KS1I(rd, rs1, rnum) \ + ASM_WORD(0b00110001000000000001000000010011 | \ + (((rd) << 7) | ((rs1) << 15) | (rnum) << 20)) +/* AES key schedule operation. */ +#define AES64KS2(rd, rs1, rs2) \ + ASM_WORD(0b01111110000000000000000000110011 | \ + (((rd) << 7) | ((rs1) << 15) | (rs2) << 20)) +/* AES inverse MixColums step. */ +#define AES64IM(rd, rs1) \ + ASM_WORD(0b00110000000000000001000000010011 | \ + ((rd) << 7) | ((rs1) << 15)) + +/* Perform computation of one round of key schedule for AES-128 encryption. */ +#define AES64_128_KS_RND_INS(rnum, o1, o2) \ + AES64KS1I(REG_T2, REG_T1, rnum) \ + AES64KS2(REG_T0, REG_T2, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + "sd t0, " #o1 "(%[ks])\n\t" \ + "sd t1, " #o2 "(%[ks])\n\t" +/* Perform computation of one round of key schedule for AES-128 decryption. */ +#define AES64_128_INV_KS_RND_INS(rnum, o1, o2) \ + AES64KS1I(REG_T2, REG_T1, rnum) \ + AES64KS2(REG_T0, REG_T2, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + AES64IM(REG_T2, REG_T0) \ + AES64IM(REG_T3, REG_T1) \ + "sd t2, " #o1 "(%[ks])\n\t" \ + "sd t3, " #o2 "(%[ks])\n\t" + +/* Perform computation of numbered round of key schedule for AES-128 encryption. + */ +#define AES64_128_KS_RND(rnum) \ + AES64_128_KS_RND_INS((rnum), ((rnum) + 1) * 16, \ + ((rnum) + 1) * 16 + 8) +/* Perform computation of numbered round of key schedule for AES-128 decryption. + */ +#define AES64_128_INV_KS_RND(rnum, o) \ + AES64_128_INV_KS_RND_INS((rnum), (o) * 16, (o) * 16 + 8) +/* Perform computation of numbered last round of key schedule for AES-128 + * decryption. */ +#define AES64_128_INV_KS_LRND(rnum, o) \ + AES64_128_KS_RND_INS((rnum), (o) * 16, (o) * 16 + 8) + + +/* Perform computation of one round of key schedule for AES-192 encryption. */ +#define AES64_192_KS_RND_INS(rnum, o1, o2, o3) \ + AES64KS1I(REG_T3, REG_T2, rnum) \ + AES64KS2(REG_T0, REG_T3, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + AES64KS2(REG_T2, REG_T1, REG_T2) \ + "sd t0, " #o1 "(%[ks])\n\t" \ + "sd t1, " #o2 "(%[ks])\n\t" \ + "sd t2, " #o3 "(%[ks])\n\t" +/* Perform computation of one round of key schedule for AES-192 decryption. */ +#define AES64_192_INV_KS_RND_INS(rnum, o1, o2, o3) \ + AES64KS1I(REG_T3, REG_T2, rnum) \ + AES64KS2(REG_T0, REG_T3, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + AES64KS2(REG_T2, REG_T1, REG_T2) \ + AES64IM(REG_T3, REG_T0) \ + AES64IM(REG_T4, REG_T1) \ + AES64IM(REG_T5, REG_T2) \ + "sd t3, " #o1 "(%[ks])\n\t" \ + "sd t4, " #o2 "(%[ks])\n\t" \ + "sd t5, " #o3 "(%[ks])\n\t" +/* Perform computation of last round of key schedule for AES-192 decryption. */ +#define AES64_192_KS_LRND_INS(rnum, o1, o2) \ + AES64KS1I(REG_T3, REG_T2, rnum) \ + AES64KS2(REG_T0, REG_T3, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + "sd t0, " #o1 "(%[ks])\n\t" \ + "sd t1, " #o2 "(%[ks])\n\t" \ + +/* Perform computation of numbered round of key schedule for AES-192 encryption. + */ +#define AES64_192_KS_RND(rnum) \ + AES64_192_KS_RND_INS((rnum), ((rnum) + 1) * 24, \ + ((rnum) + 1) * 24 + 8, ((rnum) + 1) * 24 + 16) +/* Perform computation of numbered round of key schedule for AES-192 decryption. + */ +#define AES64_192_INV_KS_RND(rnum, o1, o2, o3) \ + AES64_192_INV_KS_RND_INS((rnum), (o1) * 8, (o2) * 8, \ + (o3) * 8) +/* Perform computation of numbered last round of key schedule for AES-192 + * encryption. */ +#define AES64_192_KS_LRND(rnum) \ + AES64_192_KS_LRND_INS((rnum), ((rnum) + 1) * 24, \ + ((rnum) + 1) * 24 + 8) +/* Perform computation of numbered last round of key schedule for AES-192 + * decryption. */ +#define AES64_192_INV_KS_LRND(rnum) \ + AES64_192_KS_LRND_INS((rnum), 0, 8) + + +/* Perform computation of one round of key schedule for AES-256 encryption. */ +#define AES64_256_KS_RND_INS(rnum, o1, o2, o3, o4) \ + AES64KS1I(REG_T4, REG_T3, rnum) \ + AES64KS2(REG_T0, REG_T4, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + AES64KS1I(REG_T4, REG_T1, 10) \ + AES64KS2(REG_T2, REG_T4, REG_T2) \ + AES64KS2(REG_T3, REG_T2, REG_T3) \ + "sd t0, " #o1 "(%[ks])\n\t" \ + "sd t1, " #o2 "(%[ks])\n\t" \ + "sd t2, " #o3 "(%[ks])\n\t" \ + "sd t3, " #o4 "(%[ks])\n\t" +/* Perform computation of one round of key schedule for AES-256 decryption. */ +#define AES64_256_INV_KS_RND_INS(rnum, o1, o2, o3, o4) \ + AES64KS1I(REG_T4, REG_T3, rnum) \ + AES64KS2(REG_T0, REG_T4, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + AES64KS1I(REG_T4, REG_T1, 10) \ + AES64KS2(REG_T2, REG_T4, REG_T2) \ + AES64KS2(REG_T3, REG_T2, REG_T3) \ + AES64IM(REG_T4, REG_T0) \ + AES64IM(REG_T5, REG_T1) \ + "sd t4, " #o1 "(%[ks])\n\t" \ + "sd t5, " #o2 "(%[ks])\n\t" \ + AES64IM(REG_T4, REG_T2) \ + AES64IM(REG_T5, REG_T3) \ + "sd t4, " #o3 "(%[ks])\n\t" \ + "sd t5, " #o4 "(%[ks])\n\t" +/* Perform computation of last round of key schedule for AES-256 decryption. */ +#define AES64_256_KS_LRND_INS(rnum, o1, o2) \ + AES64KS1I(REG_T4, REG_T3, rnum) \ + AES64KS2(REG_T0, REG_T4, REG_T0) \ + AES64KS2(REG_T1, REG_T0, REG_T1) \ + "sd t0, " #o1 "(%[ks])\n\t" \ + "sd t1, " #o2 "(%[ks])\n\t" \ + +/* Perform computation of numbered round of key schedule for AES-256 encryption. + */ +#define AES64_256_KS_RND(rnum) \ + AES64_256_KS_RND_INS((rnum), ((rnum) + 1) * 32, \ + ((rnum) + 1) * 32 + 8, ((rnum) + 1) * 32 + 16, \ + ((rnum) + 1) * 32 + 24) +/* Perform computation of numbered round of key schedule for AES-256 decryption. + */ +#define AES64_256_INV_KS_RND(rnum, o) \ + AES64_256_INV_KS_RND_INS((rnum), (o) * 32, \ + (o) * 32 + 8, (o) * 32 - 16, (o) * 32 - 8) +/* Perform computation of numbered last round of key schedule for AES-256 + * encryption. */ +#define AES64_256_KS_LRND(rnum) \ + AES64_256_KS_LRND_INS((rnum), ((rnum) + 1) * 32, \ + ((rnum) + 1) * 32 + 8) +/* Perform computation of numbered last round of key schedule for AES-256 + * decryption. */ +#define AES64_256_INV_KS_LRND(rnum) \ + AES64_256_KS_LRND_INS((rnum), 0, 8) + +/* Set the key and/or IV into the AES object. + * + * Creates the key schedule from the key. + * Uses Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [in] key Secret key to use. + * @param [in] keyLen Length of key in bytes. + * @param [in] iv Initialization Vector (IV) to use. May be NULL. + * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes or key is NULL. + * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. + */ +int wc_AesSetKey(Aes* aes, const byte* key, word32 keyLen, const byte* iv, + int dir) +{ + int ret = 0; + + /* Validate parameters. */ + if ((aes == NULL) || (key == NULL)) { + ret = BAD_FUNC_ARG; + } +#ifdef WOLFSSL_AES_128 + else if ((keyLen == 16) && (dir == AES_ENCRYPTION)) { + __asm__ __volatile__ ( + "ld t0, 0(%[key])\n\t" + "ld t1, 8(%[key])\n\t" + "sd t0, 0(%[ks])\n\t" + "sd t1, 8(%[ks])\n\t" + AES64_128_KS_RND(0) + AES64_128_KS_RND(1) + AES64_128_KS_RND(2) + AES64_128_KS_RND(3) + AES64_128_KS_RND(4) + AES64_128_KS_RND(5) + AES64_128_KS_RND(6) + AES64_128_KS_RND(7) + AES64_128_KS_RND(8) + AES64_128_KS_RND(9) + "sd t0, 224(%[ks])\n\t" + "sd t1, 232(%[ks])\n\t" + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2" + ); + aes->rounds = 10; + } +#ifdef HAVE_AES_DECRYPT + else if ((keyLen == 16) && (dir == AES_DECRYPTION)) { + __asm__ __volatile__ ( + "ld t0, 0(%[key])\n\t" + "ld t1, 8(%[key])\n\t" + "sd t0, 160(%[ks])\n\t" + "sd t1, 168(%[ks])\n\t" + AES64_128_INV_KS_RND(0, 9) + AES64_128_INV_KS_RND(1, 8) + AES64_128_INV_KS_RND(2, 7) + AES64_128_INV_KS_RND(3, 6) + AES64_128_INV_KS_RND(4, 5) + AES64_128_INV_KS_RND(5, 4) + AES64_128_INV_KS_RND(6, 3) + AES64_128_INV_KS_RND(7, 2) + AES64_128_INV_KS_RND(8, 1) + AES64_128_INV_KS_LRND(9, 0) + "sd t4, 224(%[ks])\n\t" + "sd t5, 232(%[ks])\n\t" + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2", "t3" + ); + aes->rounds = 10; + } +#endif +#endif +#ifdef WOLFSSL_AES_192 + else if ((keyLen == 24) && (dir == AES_ENCRYPTION)) { + __asm__ __volatile__ ( + "ld t0, 0(%[key])\n\t" + "ld t1, 8(%[key])\n\t" + "ld t2, 16(%[key])\n\t" + "sd t0, 0(%[ks])\n\t" + "sd t1, 8(%[ks])\n\t" + "sd t2, 16(%[ks])\n\t" + AES64_192_KS_RND(0) + AES64_192_KS_RND(1) + AES64_192_KS_RND(2) + AES64_192_KS_RND(3) + AES64_192_KS_RND(4) + AES64_192_KS_RND(5) + AES64_192_KS_RND(6) + AES64_192_KS_LRND(7) + "sd t0, 224(%[ks])\n\t" + "sd t1, 232(%[ks])\n\t" + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2", "t3" + ); + aes->rounds = 12; + } +#ifdef HAVE_AES_DECRYPT + else if ((keyLen == 24) && (dir == AES_DECRYPTION)) { + __asm__ __volatile__ ( + "ld t0, 0(%[key])\n\t" + "ld t1, 8(%[key])\n\t" + "ld t2, 16(%[key])\n\t" + AES64IM(REG_T3, REG_T2) + "sd t0, 192(%[ks])\n\t" + "sd t1, 200(%[ks])\n\t" + "sd t3, 176(%[ks])\n\t" + AES64_192_INV_KS_RND(0, 23, 20, 21) + AES64_192_INV_KS_RND(1, 18, 19, 16) + AES64_192_INV_KS_RND(2, 17, 14, 15) + AES64_192_INV_KS_RND(3, 12, 13, 10) + AES64_192_INV_KS_RND(4, 11, 8, 9) + AES64_192_INV_KS_RND(5, 6, 7, 4) + AES64_192_INV_KS_RND(6, 5, 2, 3) + AES64_192_INV_KS_LRND(7) + "sd t4, 224(%[ks])\n\t" + "sd t5, 232(%[ks])\n\t" + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5" + ); + aes->rounds = 12; + } +#endif +#endif +#ifdef WOLFSSL_AES_256 + else if ((keyLen == 32) && (dir == AES_ENCRYPTION)) { + __asm__ __volatile__ ( + "ld t0, 0(%[key])\n\t" + "ld t1, 8(%[key])\n\t" + "ld t2, 16(%[key])\n\t" + "ld t3, 24(%[key])\n\t" + "sd t0, 0(%[ks])\n\t" + "sd t1, 8(%[ks])\n\t" + "sd t2, 16(%[ks])\n\t" + "sd t3, 24(%[ks])\n\t" + AES64_256_KS_RND(0) + AES64_256_KS_RND(1) + AES64_256_KS_RND(2) + AES64_256_KS_RND(3) + AES64_256_KS_RND(4) + AES64_256_KS_RND(5) + AES64_256_KS_LRND(6) + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2", "t3", "t4" + ); + aes->rounds = 14; + } +#ifdef HAVE_AES_DECRYPT + else if ((keyLen == 32) && (dir == AES_DECRYPTION)) { + __asm__ __volatile__ ( + "ld t0, 0(%[key])\n\t" + "ld t1, 8(%[key])\n\t" + "ld t2, 16(%[key])\n\t" + "ld t3, 24(%[key])\n\t" + "sd t0, 224(%[ks])\n\t" + "sd t1, 232(%[ks])\n\t" + AES64IM(REG_T4, REG_T2) + AES64IM(REG_T5, REG_T3) + "sd t4, 208(%[ks])\n\t" + "sd t5, 216(%[ks])\n\t" + AES64_256_INV_KS_RND(0, 6) + AES64_256_INV_KS_RND(1, 5) + AES64_256_INV_KS_RND(2, 4) + AES64_256_INV_KS_RND(3, 3) + AES64_256_INV_KS_RND(4, 2) + AES64_256_INV_KS_RND(5, 1) + AES64_256_INV_KS_LRND(6) + : + : [ks] "r" (aes->key), [key] "r" (key) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5" + ); + aes->rounds = 14; + } +#endif +#endif + else { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Set the IV. */ + ret = wc_AesSetIV(aes, iv); + } + if (ret == 0) { + /* Finish setting the AES object. */ + aes->keylen = keyLen; +#if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \ + defined(WOLFSSL_AES_OFB) + aes->left = 0; +#endif + } + + return ret; +} + + +/* AES middle round encryption with 64-bit registers. */ +#define AES64ESM(rd, rs1, rs2) \ + ASM_WORD(0b00110110000000000000000000110011 | \ + (rd << 7) | (rs1 << 15) | (rs2 << 20)) +/* AES final round encryption with 64-bit registers. */ +#define AES64ES(rd, rs1, rs2) \ + ASM_WORD(0b00110010000000000000000000110011 | \ + (rd << 7) | (rs1 << 15) | (rs2 << 20)) + +/* Two rounds of encryption. + * kr01 - offset of first half of key for second round. + * kr02 - offset of second half of key for second round. + * kr03 - offset of first half of key for next round. + * kr04 - offset of second half of key for next round. + */ +#define AESENC_2_ROUNDS(kro1, kro2, kro3, kro4) \ + "ld a5, " #kro1 " (%[key])\n\t" \ + "ld a6, " #kro2 " (%[key])\n\t" \ + AES64ESM(REG_T2, REG_T0, REG_T1) \ + AES64ESM(REG_T3, REG_T1, REG_T0) \ + "xor t2, t2, a3\n\t" \ + "xor t3, t3, a4\n\t" \ + AES64ESM(REG_T0, REG_T2, REG_T3) \ + AES64ESM(REG_T1, REG_T3, REG_T2) \ + "xor t0, t0, a5\n\t" \ + "xor t1, t1, a6\n\t" \ + "ld a3, " #kro3 " (%[key])\n\t" \ + "ld a4, " #kro4 " (%[key])\n\t" + +/* Last round of encryption. */ +#define AESENC_LAST_ROUND() \ + AES64ES(REG_T2, REG_T0, REG_T1) \ + AES64ES(REG_T3, REG_T1, REG_T0) \ + "xor t2, t2, a3\n\t" \ + "xor t3, t3, a4\n\t" + +/* AES middle round decryption with 64-bit registers. */ +#define AES64DSM(rd, rs1, rs2) \ + ASM_WORD(0b00111110000000000000000000110011 | \ + (rd << 7) | (rs1 << 15) | (rs2 << 20)) +/* AES final round decryption with 64-bit registers. */ +#define AES64DS(rd, rs1, rs2) \ + ASM_WORD(0b00111010000000000000000000110011 | \ + (rd << 7) | (rs1 << 15) | (rs2 << 20)) + +/* Two rounds of decryption. + * kr01 - offset of first half of key for second round. + * kr02 - offset of second half of key for second round. + * kr03 - offset of first half of key for next round. + * kr04 - offset of second half of key for next round. + */ +#define AESDEC_2_ROUNDS(kro1, kro2, kro3, kro4) \ + "ld a5, " #kro1 " (%[key])\n\t" \ + "ld a6, " #kro2 " (%[key])\n\t" \ + AES64DSM(REG_T2, REG_T0, REG_T1) \ + AES64DSM(REG_T3, REG_T1, REG_T0) \ + "xor t2, t2, a3\n\t" \ + "xor t3, t3, a4\n\t" \ + AES64DSM(REG_T0, REG_T2, REG_T3) \ + AES64DSM(REG_T1, REG_T3, REG_T2) \ + "xor t0, t0, a5\n\t" \ + "xor t1, t1, a6\n\t" \ + "ld a3, " #kro3 " (%[key])\n\t" \ + "ld a4, " #kro4 " (%[key])\n\t" + +/* Last round of decryption. */ +#define AESDEC_LAST_ROUND() \ + AES64DS(REG_T2, REG_T0, REG_T1) \ + AES64DS(REG_T3, REG_T1, REG_T0) \ + "xor t2, t2, a3\n\t" \ + "xor t3, t3, a4\n\t" \ + +#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) || \ + defined(HAVE_AESGCM) || defined(HAVE_AESCCM) +/* Encrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + */ +static void wc_AesEncrypt(Aes* aes, const byte* in, byte* out) +{ + __asm__ __volatile__ ( + "ld t2, 0(%[in])\n\t" + "ld t3, 8(%[in])\n\t" + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + AES64ESM(REG_T0, REG_T2, REG_T3) + AES64ESM(REG_T1, REG_T3, REG_T2) + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + AESENC_2_ROUNDS(48, 56, 64, 72) + AESENC_2_ROUNDS(80, 88, 96, 104) + AESENC_2_ROUNDS(112, 120, 128, 136) + AESENC_2_ROUNDS(144, 152, 160, 168) + "li t4, 11\n\t" + "ble %[rounds], t4, L_aes_encrypt_done\n\t" + AESENC_2_ROUNDS(176, 184, 192, 200) + "li t4, 13\n\t" + "ble %[rounds], t4, L_aes_encrypt_done\n\t" + AESENC_2_ROUNDS(208, 216, 224, 232) + "L_aes_encrypt_done:\n\t" + AESENC_LAST_ROUND() + "sd t2, 0(%[out])\n\t" + "sd t3, 8(%[out])\n\t" + : + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [rounds] "r" (aes->rounds) + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6" + ); +} +#endif + +#ifdef HAVE_AES_DECRYPT +#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) +/* Decrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to decrypt. + * @param [out] out Decrypted block. + */ +static void wc_AesDecrypt(Aes* aes, const byte* in, byte* out) +{ + __asm__ __volatile__ ( + "ld t2, 0(%[in])\n\t" + "ld t3, 8(%[in])\n\t" + "ld a3, 0(%[key])\n\t" + "ld a4, 8(%[key])\n\t" + "ld a5, 16(%[key])\n\t" + "ld a6, 24(%[key])\n\t" + "xor t2, t2, a3\n\t" + "xor t3, t3, a4\n\t" + AES64DSM(REG_T0, REG_T2, REG_T3) + AES64DSM(REG_T1, REG_T3, REG_T2) + "xor t0, t0, a5\n\t" + "xor t1, t1, a6\n\t" + "ld a3, 32(%[key])\n\t" + "ld a4, 40(%[key])\n\t" + AESDEC_2_ROUNDS(48, 56, 64, 72) + AESDEC_2_ROUNDS(80, 88, 96, 104) + AESDEC_2_ROUNDS(112, 120, 128, 136) + AESDEC_2_ROUNDS(144, 152, 160, 168) + "li t4, 11\n\t" + "ble %[rounds], t4, L_aes_decrypt_done\n\t" + AESDEC_2_ROUNDS(176, 184, 192, 200) + "li t4, 13\n\t" + "ble %[rounds], t4, L_aes_decrypt_done\n\t" + AESDEC_2_ROUNDS(208, 216, 224, 232) + "L_aes_decrypt_done:\n\t" + AESDEC_LAST_ROUND() + "sd t2, 0(%[out])\n\t" + "sd t3, 8(%[out])\n\t" + : + : [in] "r" (in), [out] "r" (out), [key] "r" (aes->key), + [rounds] "r" (aes->rounds) + : "memory", "t0", "t1", "t2", "t3", "t4", "a3", "a4", "a5", "a6" + ); +} +#endif +#endif /* HAVE_AES_DECRYPT */ + +#else + +/* + * Standard instructions implementation of base operations. + */ + +/* Load a word with bytes reversed. */ +#define LOAD_WORD_REV(r, o, p) \ + "lbu t4, " #o "(" #p ")\n\t" \ + "lbu t5, " #o "+1(" #p ")\n\t" \ + "lbu t6, " #o "+2(" #p ")\n\t" \ + "lbu " #r ", " #o "+3(" #p ")\n\t" \ + "slli t4, t4, 24\n\t" \ + "slli t5, t5, 16\n\t" \ + "slli t6, t6, 8\n\t" \ + "or " #r ", " #r ", t4\n\t" \ + "or " #r ", " #r ", t5\n\t" \ + "or " #r ", " #r ", t6\n\t" + +/* Store a word with bytes reversed. */ +#define STORE_WORD_REV(r, o, p) \ + "srli t0, " #r ", 24\n\t" \ + "srli t1, " #r ", 16\n\t" \ + "srli t2, " #r ", 8\n\t" \ + "sb t0, " #o "+0(" #p ")\n\t" \ + "sb t1, " #o "+1(" #p ")\n\t" \ + "sb t2, " #o "+2(" #p ")\n\t" \ + "sb " #r ", " #o "+3(" #p ")\n\t" + +/* AES encryption table. */ +static const FLASH_QUALIFIER word32 Te[4][256] = { +{ + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}, +{ + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}, +{ + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}, +{ + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +} +}; + +/* Round constant used in computing key schedule. */ +static const FLASH_QUALIFIER word32 rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, + /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +#ifdef HAVE_AES_DECRYPT +/* AES decryption table. */ +static const FLASH_QUALIFIER word32 Td[4][256] = { +{ + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}, +{ + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}, +{ + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}, +{ + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +} +}; + +#endif /* HAVE_AES_DECRYPT */ + +/* AES substitute rotated word with round constant application. */ +#define AES_SUB_ROT_WORD_RCON(s) \ + "andi t5, " #s ", 0xff\n\t" \ + "slli t5, t5, 2\n\t" \ + "add t5, t5, %[te]\n\t" \ + "lw t5, (t5)\n\t" \ + "li t6, 0x0000ff00\n\t" \ + "and t5, t5, t6\n\t" \ + "xor t0, t0, t5\n\t" \ + \ + "srli t5, " #s ", 22\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te]\n\t" \ + "addi t5, t5, 0x400\n\t" \ + "lbu t5, (t5)\n\t" \ + "xor t0, t0, t5\n\t" \ + \ + "srli t5, " #s ", 14\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te]\n\t" \ + "li t6, 0x800\n\t" \ + "add t5, t5, t6\n\t" \ + "lw t5, (t5)\n\t" \ + "li t6, 0xff000000\n\t" \ + "and t5, t5, t6\n\t" \ + "xor t0, t0, t5\n\t" \ + \ + "srli t5, " #s ", 6\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te]\n\t" \ + "li t6, 0xc00\n\t" \ + "add t5, t5, t6\n\t" \ + "lw t5, (t5)\n\t" \ + "li t6, 0x00ff0000\n\t" \ + "and t5, t5, t6\n\t" \ + "xor t0, t0, t5\n\t" \ + \ + "add t5, %[rcon], a5\n\t" \ + "lw t5, (t5)\n\t" \ + "xor t0, t0, t5\n\t" + +/* AES substitute word. */ +#define AES_SUB_WORD(s) \ + "srli t5, " #s ", 6\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te]\n\t" \ + "lw t5, (t5)\n\t" \ + "li t6, 0x0000ff00\n\t" \ + "and t5, t5, t6\n\t" \ + "xor a6, a6, t5\n\t" \ + \ + "andi t5, " #s ", 0xff\n\t" \ + "slli t5, t5, 2\n\t" \ + "add t5, t5, %[te]\n\t" \ + "addi t5, t5, 0x400\n\t" \ + "lbu t5, (t5)\n\t" \ + "xor a6, a6, t5\n\t" \ + \ + "srli t5, " #s ", 22\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te]\n\t" \ + "li t6, 0x800\n\t" \ + "add t5, t5, t6\n\t" \ + "lw t5, (t5)\n\t" \ + "li t6, 0xff000000\n\t" \ + "and t5, t5, t6\n\t" \ + "xor a6, a6, t5\n\t" \ + \ + "srli t5, " #s ", 14\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te]\n\t" \ + "li t6, 0xc00\n\t" \ + "add t5, t5, t6\n\t" \ + "lw t5, (t5)\n\t" \ + "li t6, 0x00ff0000\n\t" \ + "and t5, t5, t6\n\t" \ + "xor a6, a6, t5\n\t" + +/* Set the AES key and expand. + * + * @param [in] aes AES object. + * @param [in] key Block to encrypt. + * @param [in] keySz Number of bytes in key. + * @param [in] dir Direction of crypt: AES_ENCRYPTION or AES_DECRYPTION. + */ +static void AesSetKey_C(Aes* aes, const byte* key, word32 keySz, int dir) +{ + word32* rk = aes->key; + + switch (keySz) { +#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 128 && \ + defined(WOLFSSL_AES_128) + case 16: + __asm__ __volatile__ ( +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* Load 4 32-bit words in reverse byte order. */ + LOAD_WORD_REV(t0, 0, %[key]) + LOAD_WORD_REV(t1, 4, %[key]) + LOAD_WORD_REV(t2, 8, %[key]) + LOAD_WORD_REV(t3, 12, %[key]) +#else + "ld t1, 0(%[key])\n\t" + "ld t3, 8(%[key])\n\t" + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + "srli t0, t1, 32\n\t" + "srli t2, t3, 32\n\t" +#endif + /* Store round 0 key. */ + "sw t0, 0(%[rk])\n\t" + "sw t1, 4(%[rk])\n\t" + "sw t2, 8(%[rk])\n\t" + "sw t3, 12(%[rk])\n\t" + + "li a4, 10\n\t" + "mv a5, x0\n\t" + "L_aes_set_key_c_16_loop:\n\t" + "addi %[rk], %[rk], 16\n\t" + /* Permute key. */ + AES_SUB_ROT_WORD_RCON(t3) + "xor t1, t1, t0\n\t" + "xor t2, t2, t1\n\t" + "xor t3, t3, t2\n\t" + /* Store round key. */ + "sw t0, 0(%[rk])\n\t" + "sw t1, 4(%[rk])\n\t" + "sw t2, 8(%[rk])\n\t" + "sw t3, 12(%[rk])\n\t" + + "addi a4, a4, -1\n\t" + "addi a5, a5, 4\n\t" + "bnez a4, L_aes_set_key_c_16_loop\n\t" + : [rk] "+r" (rk) + : [key] "r" (key), [te] "r" (Te), [rcon] "r" (rcon) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5" + ); + break; +#endif /* 128 */ + +#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 192 && \ + defined(WOLFSSL_AES_192) + case 24: + __asm__ __volatile__ ( +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* Load 6 32-bit words in reverse byte order. */ + LOAD_WORD_REV(t0, 0, %[key]) + LOAD_WORD_REV(t1, 4, %[key]) + LOAD_WORD_REV(t2, 8, %[key]) + LOAD_WORD_REV(t3, 12, %[key]) + LOAD_WORD_REV(a6, 16, %[key]) + LOAD_WORD_REV(a7, 20, %[key]) +#else + "ld t1, 0(%[key])\n\t" + "ld t3, 8(%[key])\n\t" + "ld a7, 16(%[key])\n\t" + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + REV8(REG_A7, REG_A7) + "srli t0, t1, 32\n\t" + "srli t2, t3, 32\n\t" + "srli a6, a7, 32\n\t" +#endif + /* Store round 0 key. */ + "sw t0, 0(%[rk])\n\t" + "sw t1, 4(%[rk])\n\t" + "sw t2, 8(%[rk])\n\t" + "sw t3, 12(%[rk])\n\t" + "sw a6, 16(%[rk])\n\t" + "sw a7, 20(%[rk])\n\t" + + "li a4, 8\n\t" + "mv a5, x0\n\t" + "L_aes_set_key_c_24_loop:\n\t" + "addi %[rk], %[rk], 24\n\t" + /* Permute key. */ + AES_SUB_ROT_WORD_RCON(a7) + "xor t1, t1, t0\n\t" + "xor t2, t2, t1\n\t" + "xor t3, t3, t2\n\t" + "xor a6, a6, t3\n\t" + "xor a7, a7, a6\n\t" + /* Store round key. */ + "sw t0, 0(%[rk])\n\t" + "sw t1, 4(%[rk])\n\t" + "sw t2, 8(%[rk])\n\t" + "sw t3, 12(%[rk])\n\t" + "sw a6, 16(%[rk])\n\t" + "sw a7, 20(%[rk])\n\t" + + "addi a4, a4, -1\n\t" + "addi a5, a5, 4\n\t" + "bnez a4, L_aes_set_key_c_24_loop\n\t" + + : [rk] "+r" (rk) + : [key] "r" (key), [te] "r" (Te), [rcon] "r" (rcon) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", + "a6", "a7" + ); + break; +#endif /* 192 */ + +#if defined(AES_MAX_KEY_SIZE) && AES_MAX_KEY_SIZE >= 256 && \ + defined(WOLFSSL_AES_256) + case 32: + __asm__ __volatile__ ( +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* Load 8 32-bit words in reverse byte order. */ + LOAD_WORD_REV(t0, 0, %[key]) + LOAD_WORD_REV(t1, 4, %[key]) + LOAD_WORD_REV(t2, 8, %[key]) + LOAD_WORD_REV(t3, 12, %[key]) + LOAD_WORD_REV(a6, 16, %[key]) + LOAD_WORD_REV(a7, 20, %[key]) + LOAD_WORD_REV(s1, 24, %[key]) + LOAD_WORD_REV(s2, 28, %[key]) +#else + "ld t1, 0(%[key])\n\t" + "ld t3, 8(%[key])\n\t" + "ld a7, 16(%[key])\n\t" + "ld s2, 24(%[key])\n\t" + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + REV8(REG_A7, REG_A7) + REV8(REG_S2, REG_S2) + "srli t0, t1, 32\n\t" + "srli t2, t3, 32\n\t" + "srli a6, a7, 32\n\t" + "srli s1, s2, 32\n\t" +#endif + /* Store round 0 key. */ + "sw t0, 0(%[rk])\n\t" + "sw t1, 4(%[rk])\n\t" + "sw t2, 8(%[rk])\n\t" + "sw t3, 12(%[rk])\n\t" + "sw a6, 16(%[rk])\n\t" + "sw a7, 20(%[rk])\n\t" + "sw s1, 24(%[rk])\n\t" + "sw s2, 28(%[rk])\n\t" + + "li a4, 7\n\t" + "mv a5, x0\n\t" + "L_aes_set_key_c_32_loop:\n\t" + "addi %[rk], %[rk], 32\n\t" + /* Permute key. */ + AES_SUB_ROT_WORD_RCON(s2) + "xor t1, t1, t0\n\t" + "xor t2, t2, t1\n\t" + "xor t3, t3, t2\n\t" + /* Store half round key. */ + "sw t0, 0(%[rk])\n\t" + "sw t1, 4(%[rk])\n\t" + "sw t2, 8(%[rk])\n\t" + "sw t3, 12(%[rk])\n\t" + + "addi a5, a5, 4\n\t" + "addi a4, a4, -1\n\t" + "beqz a4, L_aes_set_key_c_32_done\n\t" + + AES_SUB_WORD(t3) + "xor a7, a7, a6\n\t" + "xor s1, s1, a7\n\t" + "xor s2, s2, s1\n\t" + /* Store second half round key. */ + "sw a6, 16(%[rk])\n\t" + "sw a7, 20(%[rk])\n\t" + "sw s1, 24(%[rk])\n\t" + "sw s2, 28(%[rk])\n\t" + + "beqz x0, L_aes_set_key_c_32_loop\n\t" + "L_aes_set_key_c_32_done:\n\t" + + : [rk] "+r" (rk) + : [key] "r" (key), [te] "r" (Te), [rcon] "r" (rcon) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", + "a6", "a7", "s1", "s2" + ); + break; +#endif /* 256 */ + } + +#if defined(HAVE_AES_DECRYPT) + +#define INV_MIXCOL(rki) \ + "srli t5, " #rki ", 22\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te1]\n\t" \ + "lbu t5, (t5)\n\t" \ + "slli t5, t5, 2\n\t" \ + "add t5, t5, %[td]\n\t" \ + "lw t6, (t5)\n\t" \ + "srli t5, " #rki ", 14\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te1]\n\t" \ + "lbu t5, (t5)\n\t" \ + "slli t5, t5, 2\n\t" \ + "add t5, t5, %[td]\n\t" \ + "addi t5, t5, 0x400\n\t" \ + "lw t5, (t5)\n\t" \ + "xor t6, t6, t5\n\t" \ + "srli t5, " #rki ", 6\n\t" \ + "andi t5, t5, 0x3fc\n\t" \ + "add t5, t5, %[te1]\n\t" \ + "lbu t5, (t5)\n\t" \ + "slli t5, t5, 2\n\t" \ + "add t5, t5, %[td]\n\t" \ + "li t4, 0x800\n\t" \ + "add t5, t5, t4\n\t" \ + "lw t5, (t5)\n\t" \ + "xor t6, t6, t5\n\t" \ + "andi t5, " #rki ", 0xff\n\t" \ + "slli t5, t5, 2\n\t" \ + "add t5, t5, %[te1]\n\t" \ + "lbu t5, (t5)\n\t" \ + "slli t5, t5, 2\n\t" \ + "add t5, t5, %[td]\n\t" \ + "li t4, 0xc00\n\t" \ + "add t5, t5, t4\n\t" \ + "lw t5, (t5)\n\t" \ + "xor " #rki ", t6, t5\n\t" + + if (dir == AES_DECRYPTION) { + int r = aes->rounds; + rk = aes->key; + + __asm__ __volatile__ ( + /* Change key schedule for decryption. */ + "slli s1, %[r], 4\n\t" + "add s1, s1, %[rk]\n\t" + "srli %[r], %[r], 1\n\t" + "addi %[r], %[r], -1\n\t" + + /* Swap first two rounds. */ + "ld t0, 0(%[rk])\n\t" + "ld t1, 8(%[rk])\n\t" + "ld t2, 0(s1)\n\t" + "ld t3, 8(s1)\n\t" + "sd t0, 0(s1)\n\t" + "sd t1, 8(s1)\n\t" + "sd t2, 0(%[rk])\n\t" + "sd t3, 8(%[rk])\n\t" + + "L_aes_set_key_inv_mixcol_loop:\n\t" + "addi %[rk], %[rk], 16\n\t" + "addi s1, s1, -16\n\t" + + "lw t0, 0(%[rk])\n\t" + "lw t1, 4(%[rk])\n\t" + "lw t2, 8(%[rk])\n\t" + "lw t3, 12(%[rk])\n\t" + "lw a4, 0(s1)\n\t" + "lw a5, 4(s1)\n\t" + "lw a6, 8(s1)\n\t" + "lw a7, 12(s1)\n\t" + + INV_MIXCOL(t0) + INV_MIXCOL(t1) + INV_MIXCOL(t2) + INV_MIXCOL(t3) + INV_MIXCOL(a4) + INV_MIXCOL(a5) + INV_MIXCOL(a6) + INV_MIXCOL(a7) + + "sw t0, 0(s1)\n\t" + "sw t1, 4(s1)\n\t" + "sw t2, 8(s1)\n\t" + "sw t3, 12(s1)\n\t" + "sw a4, 0(%[rk])\n\t" + "sw a5, 4(%[rk])\n\t" + "sw a6, 8(%[rk])\n\t" + "sw a7, 12(%[rk])\n\t" + + "addi %[r], %[r], -1\n\t" + "bnez %[r], L_aes_set_key_inv_mixcol_loop\n\t" + + "lw t0, 16(%[rk])\n\t" + "lw t1, 20(%[rk])\n\t" + "lw t2, 24(%[rk])\n\t" + "lw t3, 28(%[rk])\n\t" + + INV_MIXCOL(t0) + INV_MIXCOL(t1) + INV_MIXCOL(t2) + INV_MIXCOL(t3) + + "sw t0, 16(%[rk])\n\t" + "sw t1, 20(%[rk])\n\t" + "sw t2, 24(%[rk])\n\t" + "sw t3, 28(%[rk])\n\t" + + : [rk] "+r" (rk), [r] "+r" (r) + : [td] "r" (Td), [te1] "r" (Te[1]) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "a4", "a5", + "a6", "a7", "s1" + ); + } +#endif /* HAVE_AES_DECRYPT */ +} + +/* Set the key and/or IV into the AES object. + * + * Creates the key schedule from the key. + * Uses Cryptographic instructions. + * + * @param [in] aes AES object. + * @param [in] key Secret key to use. + * @param [in] keyLen Length of key in bytes. + * @param [in] iv Initialization Vector (IV) to use. May be NULL. + * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes or key is NULL. + * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. + */ +int wc_AesSetKey(Aes* aes, const byte* key, word32 keyLen, const byte* iv, + int dir) +{ + int ret = 0; + + /* Validate parameters. */ + if (aes == NULL) { + ret = BAD_FUNC_ARG; + } + /* Check key size is supported by AES object. */ + if ((ret == 0) && (keyLen > (word32)sizeof(aes->key))) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Check key length is supported. */ + switch (keyLen) { + #if defined(AES_MAX_KEY_SIZE) && (AES_MAX_KEY_SIZE >= 128) && \ + defined(WOLFSSL_AES_128) + case 16: + #endif + #if defined(AES_MAX_KEY_SIZE) && (AES_MAX_KEY_SIZE >= 192) && \ + defined(WOLFSSL_AES_192) + case 24: + #endif + #if defined(AES_MAX_KEY_SIZE) && (AES_MAX_KEY_SIZE >= 256) && \ + defined(WOLFSSL_AES_256) + case 32: + #endif + break; + default: + ret = BAD_FUNC_ARG; + } + } +#ifndef HAVE_AES_DECRYPT + if ((ret == 0) && (dir == AES_DECRYPTION)) { + ret = BAD_FUNC_ARG; + } +#endif + + if (ret == 0) { + /* Initialize fields. */ + #if defined(WOLFSSL_AES_CFB) || defined(WOLFSSL_AES_COUNTER) || \ + defined(WOLFSSL_AES_OFB) + aes->left = 0; + #endif + aes->keylen = (int)keyLen; + aes->rounds = (keyLen / 4) + 6; + + /* Compute the key schedule. */ + AesSetKey_C(aes, key, keyLen, dir); + + /* Set the IV. */ + ret = wc_AesSetIV(aes, iv); + } + + return ret; +} + +#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) || \ + defined(HAVE_AESGCM) || defined(HAVE_AESCCM) +/* Encrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to encrypt. + * @param [out] out Encrypted block. + */ +static void wc_AesEncrypt(Aes* aes, const byte* in, byte* out) +{ +/* A round of encryption from set 2 to 1 registers. */ +#define ENC_ROUND_T_S_ASM(o) \ + "srliw t0, a4, 24\n\t" \ + "srliw t1, a5, 24\n\t" \ + "srliw t2, a6, 24\n\t" \ + "srliw t3, a7, 24\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, %[te]\n\t" \ + "add t1, t1, %[te]\n\t" \ + "add t2, t2, %[te]\n\t" \ + "add t3, t3, %[te]\n\t" \ + "lw t5, (t0)\n\t" \ + "lw t6, (t1)\n\t" \ + "lw s1, (t2)\n\t" \ + "lw s2, (t3)\n\t" \ + \ + "addi t4, %[te], 0x400\n\t" \ + "srliw t0, a5, 14\n\t" \ + "srliw t1, a6, 14\n\t" \ + "srliw t2, a7, 14\n\t" \ + "srliw t3, a4, 14\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "srliw t0, a6, 6\n\t" \ + "srliw t1, a7, 6\n\t" \ + "srliw t2, a4, 6\n\t" \ + "srliw t3, a5, 6\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "andi t0, a7, 0xff\n\t" \ + "andi t1, a4, 0xff\n\t" \ + "andi t2, a5, 0xff\n\t" \ + "andi t3, a6, 0xff\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" \ + \ + "lw t0, " #o "(%[rk])\n\t" \ + "lw t1, " #o "+4(%[rk])\n\t" \ + "lw t2, " #o "+8(%[rk])\n\t" \ + "lw t3, " #o "+12(%[rk])\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" + +/* A round of encryption from set 1 to 2 registers. */ +#define ENC_ROUND_S_T_ASM(o) \ + "srliw t0, t5, 24\n\t" \ + "srliw t1, t6, 24\n\t" \ + "srliw t2, s1, 24\n\t" \ + "srliw t3, s2, 24\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, %[te]\n\t" \ + "add t1, t1, %[te]\n\t" \ + "add t2, t2, %[te]\n\t" \ + "add t3, t3, %[te]\n\t" \ + "lw a4, (t0)\n\t" \ + "lw a5, (t1)\n\t" \ + "lw a6, (t2)\n\t" \ + "lw a7, (t3)\n\t" \ + \ + "addi t4, %[te], 0x400\n\t" \ + "srliw t0, t6, 14\n\t" \ + "srliw t1, s1, 14\n\t" \ + "srliw t2, s2, 14\n\t" \ + "srliw t3, t5, 14\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "srliw t0, s1, 6\n\t" \ + "srliw t1, s2, 6\n\t" \ + "srliw t2, t5, 6\n\t" \ + "srliw t3, t6, 6\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "andi t0, s2, 0xff\n\t" \ + "andi t1, t5, 0xff\n\t" \ + "andi t2, t6, 0xff\n\t" \ + "andi t3, s1, 0xff\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" \ + \ + "lw t0, " #o "(%[rk])\n\t" \ + "lw t1, " #o "+4(%[rk])\n\t" \ + "lw t2, " #o "+8(%[rk])\n\t" \ + "lw t3, " #o "+12(%[rk])\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" + + __asm__ __volatile__ ( +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* Load 4 32-bit words in reverse byte order. */ + LOAD_WORD_REV(t0, 0, %[in]) + LOAD_WORD_REV(t1, 4, %[in]) + LOAD_WORD_REV(t2, 8, %[in]) + LOAD_WORD_REV(t3, 12, %[in]) +#else + "ld t1, 0(%[in])\n\t" + "ld t3, 8(%[in])\n\t" + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + "srli t0, t1, 32\n\t" + "srli t2, t3, 32\n\t" +#endif + "lw a4, 0(%[rk])\n\t" + "lw a5, 4(%[rk])\n\t" + "lw a6, 8(%[rk])\n\t" + "lw a7, 12(%[rk])\n\t" + /* AddRoundKey */ + "xor a4, t0, a4\n\t" + "xor a5, t1, a5\n\t" + "xor a6, t2, a6\n\t" + "xor a7, t3, a7\n\t" + + ENC_ROUND_T_S_ASM(16) + ENC_ROUND_S_T_ASM(32) + ENC_ROUND_T_S_ASM(48) + ENC_ROUND_S_T_ASM(64) + ENC_ROUND_T_S_ASM(80) + ENC_ROUND_S_T_ASM(96) + ENC_ROUND_T_S_ASM(112) + ENC_ROUND_S_T_ASM(128) + ENC_ROUND_T_S_ASM(144) + + "li t4, 5\n\t" + "ble %[r], t4, L_aes_encrypt_done\n\t" + ENC_ROUND_S_T_ASM(160) + ENC_ROUND_T_S_ASM(176) + + "li t4, 6\n\t" + "ble %[r], t4, L_aes_encrypt_done\n\t" + ENC_ROUND_S_T_ASM(192) + ENC_ROUND_T_S_ASM(208) + "L_aes_encrypt_done:\n\t" + + /* Last round. */ + "srliw t0, s1, 6\n\t" + "srliw t1, s2, 6\n\t" + "srliw t2, t5, 6\n\t" + "srliw t3, t6, 6\n\t" + "andi t0, t0, 0x3fc\n\t" + "andi t1, t1, 0x3fc\n\t" + "andi t2, t2, 0x3fc\n\t" + "andi t3, t3, 0x3fc\n\t" + "add t0, t0, %[te]\n\t" + "add t1, t1, %[te]\n\t" + "add t2, t2, %[te]\n\t" + "add t3, t3, %[te]\n\t" + "lw a4, (t0)\n\t" + "lw a5, (t1)\n\t" + "lw a6, (t2)\n\t" + "lw a7, (t3)\n\t" + "li t4, 0x0000ff00\n\t" + "and a4, a4, t4\n\t" + "and a5, a5, t4\n\t" + "and a6, a6, t4\n\t" + "and a7, a7, t4\n\t" + + "addi t4, %[te], 0x400\n\t" + "andi t0, s2, 0xff\n\t" + "andi t1, t5, 0xff\n\t" + "andi t2, t6, 0xff\n\t" + "andi t3, s1, 0xff\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lbu t0, (t0)\n\t" + "lbu t1, (t1)\n\t" + "lbu t2, (t2)\n\t" + "lbu t3, (t3)\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + + "addi t4, t4, 0x400\n\t" + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "slli t2, t2, 2\n\t" + "slli t3, t3, 2\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, (t0)\n\t" + "lw t1, (t1)\n\t" + "lw t2, (t2)\n\t" + "lw t3, (t3)\n\t" + "li t4, 0xff000000\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + + "li t4, 0xc00\n\t" + "add t4, %[te], t4\n\t" + "srliw t0, t6, 14\n\t" + "srliw t1, s1, 14\n\t" + "srliw t2, s2, 14\n\t" + "srliw t3, t5, 14\n\t" + "andi t0, t0, 0x3fc\n\t" + "andi t1, t1, 0x3fc\n\t" + "andi t2, t2, 0x3fc\n\t" + "andi t3, t3, 0x3fc\n\t" + "add t0, t0, t4\n\t" + "add t1, t1, t4\n\t" + "add t2, t2, t4\n\t" + "add t3, t3, t4\n\t" + "lw t0, (t0)\n\t" + "lw t1, (t1)\n\t" + "lw t2, (t2)\n\t" + "lw t3, (t3)\n\t" + "li t4, 0x00ff0000\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + + "slli t4, %[r], 5\n\t" + "add t4, %[rk], t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + + /* Reverse byte in 32-bit words. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + STORE_WORD_REV(a4, 0, %[out]) + STORE_WORD_REV(a5, 4, %[out]) + STORE_WORD_REV(a6, 8, %[out]) + STORE_WORD_REV(a7, 12, %[out]) +#elif !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, a4, 32\n\t" + "slli t1, a5, 32\n\t" + "slli t2, a6, 32\n\t" + "slli t3, a7, 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + /* Write encrypted block to output. */ + "sd t1, 0(%[out])\n\t" + "sd t3, 8(%[out])\n\t" +#else + PACK(REG_T1, REG_A5, REG_A4) + PACK(REG_T3, REG_A7, REG_A6) + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + /* Write encrypted block to output. */ + "sd t1, 0(%[out])\n\t" + "sd t3, 8(%[out])\n\t" +#endif + + : + : [in] "r" (in), [rk] "r" (aes->key), [te] "r" (Te), + [r] "r" (aes->rounds >> 1), [out] "r" (out) + : "memory", "t0", "t1", "t2", "t3", "t4", + "a4", "a5", "a6", "a7", + "t5", "t6", "s1", "s2" + ); +} +#endif /* WOLFSSL_AES_DIRECT || HAVE_AES_CBC || HAVE_AESGCM || HAVE_AESCCM */ + +#if defined(WOLFSSL_AES_DIRECT) || defined(HAVE_AES_CBC) +#ifdef HAVE_AES_DECRYPT +/* AES byte decryption table. */ +static const FLASH_QUALIFIER byte Td4[256] = +{ + 0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, + 0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, + 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U, + 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, + 0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, + 0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU, + 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U, + 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, + 0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, + 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U, + 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU, + 0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, + 0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, + 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U, + 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, + 0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, + 0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU, + 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U, + 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, + 0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, + 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U, + 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU, + 0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, + 0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, + 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U, + 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, + 0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, + 0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU, + 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U, + 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, + 0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, + 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU, +}; + +/* Decrypt a block using AES. + * + * @param [in] aes AES object. + * @param [in] in Block to decrypt. + * @param [out] out Decrypted block. + */ +static void wc_AesDecrypt(Aes* aes, const byte* in, byte* out) +{ +/* A round of decryption from set 2 to 1 registers. */ +#define DEC_ROUND_T_S_ASM(o) \ + "srliw t0, a4, 24\n\t" \ + "srliw t1, a5, 24\n\t" \ + "srliw t2, a6, 24\n\t" \ + "srliw t3, a7, 24\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, %[td]\n\t" \ + "add t1, t1, %[td]\n\t" \ + "add t2, t2, %[td]\n\t" \ + "add t3, t3, %[td]\n\t" \ + "lw t5, (t0)\n\t" \ + "lw t6, (t1)\n\t" \ + "lw s1, (t2)\n\t" \ + "lw s2, (t3)\n\t" \ + \ + "addi t4, %[td], 0x400\n\t" \ + "srliw t0, a7, 14\n\t" \ + "srliw t1, a4, 14\n\t" \ + "srliw t2, a5, 14\n\t" \ + "srliw t3, a6, 14\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "srliw t0, a6, 6\n\t" \ + "srliw t1, a7, 6\n\t" \ + "srliw t2, a4, 6\n\t" \ + "srliw t3, a5, 6\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "andi t0, a5, 0xff\n\t" \ + "andi t1, a6, 0xff\n\t" \ + "andi t2, a7, 0xff\n\t" \ + "andi t3, a4, 0xff\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" \ + \ + "lw t0, " #o "(%[rk])\n\t" \ + "lw t1, " #o "+4(%[rk])\n\t" \ + "lw t2, " #o "+8(%[rk])\n\t" \ + "lw t3, " #o "+12(%[rk])\n\t" \ + "xor t5, t5, t0\n\t" \ + "xor t6, t6, t1\n\t" \ + "xor s1, s1, t2\n\t" \ + "xor s2, s2, t3\n\t" + +/* A round of decryption from set 1 to 2 registers. */ +#define DEC_ROUND_S_T_ASM(o) \ + "srliw t0, t5, 24\n\t" \ + "srliw t1, t6, 24\n\t" \ + "srliw t2, s1, 24\n\t" \ + "srliw t3, s2, 24\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, %[td]\n\t" \ + "add t1, t1, %[td]\n\t" \ + "add t2, t2, %[td]\n\t" \ + "add t3, t3, %[td]\n\t" \ + "lw a4, (t0)\n\t" \ + "lw a5, (t1)\n\t" \ + "lw a6, (t2)\n\t" \ + "lw a7, (t3)\n\t" \ + \ + "addi t4, %[td], 0x400\n\t" \ + "srliw t0, s2, 14\n\t" \ + "srliw t1, t5, 14\n\t" \ + "srliw t2, t6, 14\n\t" \ + "srliw t3, s1, 14\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "srliw t0, s1, 6\n\t" \ + "srliw t1, s2, 6\n\t" \ + "srliw t2, t5, 6\n\t" \ + "srliw t3, t6, 6\n\t" \ + "andi t0, t0, 0x3fc\n\t" \ + "andi t1, t1, 0x3fc\n\t" \ + "andi t2, t2, 0x3fc\n\t" \ + "andi t3, t3, 0x3fc\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" \ + \ + "addi t4, t4, 0x400\n\t" \ + "andi t0, t6, 0xff\n\t" \ + "andi t1, s1, 0xff\n\t" \ + "andi t2, s2, 0xff\n\t" \ + "andi t3, t5, 0xff\n\t" \ + "slliw t0, t0, 2\n\t" \ + "slliw t1, t1, 2\n\t" \ + "slliw t2, t2, 2\n\t" \ + "slliw t3, t3, 2\n\t" \ + "add t0, t0, t4\n\t" \ + "add t1, t1, t4\n\t" \ + "add t2, t2, t4\n\t" \ + "add t3, t3, t4\n\t" \ + "lw t0, (t0)\n\t" \ + "lw t1, (t1)\n\t" \ + "lw t2, (t2)\n\t" \ + "lw t3, (t3)\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" \ + \ + "lw t0, " #o "(%[rk])\n\t" \ + "lw t1, " #o "+4(%[rk])\n\t" \ + "lw t2, " #o "+8(%[rk])\n\t" \ + "lw t3, " #o "+12(%[rk])\n\t" \ + "xor a4, a4, t0\n\t" \ + "xor a5, a5, t1\n\t" \ + "xor a6, a6, t2\n\t" \ + "xor a7, a7, t3\n\t" + + __asm__ __volatile__ ( +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* Load 4 32-bit words in reverse byte order. */ + LOAD_WORD_REV(t0, 0, %[in]) + LOAD_WORD_REV(t1, 4, %[in]) + LOAD_WORD_REV(t2, 8, %[in]) + LOAD_WORD_REV(t3, 12, %[in]) +#else + "ld t1, 0(%[in])\n\t" + "ld t3, 8(%[in])\n\t" + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + "srli t0, t1, 32\n\t" + "srli t2, t3, 32\n\t" +#endif + "lw a4, 0(%[rk])\n\t" + "lw a5, 4(%[rk])\n\t" + "lw a6, 8(%[rk])\n\t" + "lw a7, 12(%[rk])\n\t" + /* AddRoundKey */ + "xor a4, t0, a4\n\t" + "xor a5, t1, a5\n\t" + "xor a6, t2, a6\n\t" + "xor a7, t3, a7\n\t" + + DEC_ROUND_T_S_ASM(16) + DEC_ROUND_S_T_ASM(32) + DEC_ROUND_T_S_ASM(48) + DEC_ROUND_S_T_ASM(64) + DEC_ROUND_T_S_ASM(80) + DEC_ROUND_S_T_ASM(96) + DEC_ROUND_T_S_ASM(112) + DEC_ROUND_S_T_ASM(128) + DEC_ROUND_T_S_ASM(144) + + "li t4, 5\n\t" + "ble %[r], t4, L_aes_decrypt_done\n\t" + DEC_ROUND_S_T_ASM(160) + DEC_ROUND_T_S_ASM(176) + + "li t4, 6\n\t" + "ble %[r], t4, L_aes_decrypt_done\n\t" + DEC_ROUND_S_T_ASM(192) + DEC_ROUND_T_S_ASM(208) + "L_aes_decrypt_done:\n\t" + + /* Last round. */ + "srliw t0, t5, 24\n\t" + "srliw t1, t6, 24\n\t" + "srliw t2, s1, 24\n\t" + "srliw t3, s2, 24\n\t" + "add t0, t0, %[td4]\n\t" + "add t1, t1, %[td4]\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "lbu a4, (t0)\n\t" + "lbu a5, (t1)\n\t" + "lbu a6, (t2)\n\t" + "lbu a7, (t3)\n\t" + "slli a4, a4, 24\n\t" + "slli a5, a5, 24\n\t" + "slli a6, a6, 24\n\t" + "slli a7, a7, 24\n\t" + + "srliw t0, s2, 16\n\t" + "srliw t1, t5, 16\n\t" + "srliw t2, t6, 16\n\t" + "srliw t3, s1, 16\n\t" + "andi t0, t0, 0xff\n\t" + "andi t1, t1, 0xff\n\t" + "andi t2, t2, 0xff\n\t" + "andi t3, t3, 0xff\n\t" + "add t0, t0, %[td4]\n\t" + "add t1, t1, %[td4]\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "lbu t0, (t0)\n\t" + "lbu t1, (t1)\n\t" + "lbu t2, (t2)\n\t" + "lbu t3, (t3)\n\t" + "slli t0, t0, 16\n\t" + "slli t1, t1, 16\n\t" + "slli t2, t2, 16\n\t" + "slli t3, t3, 16\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + + "srliw t0, s1, 8\n\t" + "srliw t1, s2, 8\n\t" + "srliw t2, t5, 8\n\t" + "srliw t3, t6, 8\n\t" + "andi t0, t0, 0xff\n\t" + "andi t1, t1, 0xff\n\t" + "andi t2, t2, 0xff\n\t" + "andi t3, t3, 0xff\n\t" + "add t0, t0, %[td4]\n\t" + "add t1, t1, %[td4]\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "lbu t0, (t0)\n\t" + "lbu t1, (t1)\n\t" + "lbu t2, (t2)\n\t" + "lbu t3, (t3)\n\t" + "slli t0, t0, 8\n\t" + "slli t1, t1, 8\n\t" + "slli t2, t2, 8\n\t" + "slli t3, t3, 8\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + + "andi t0, t6, 0xff\n\t" + "andi t1, s1, 0xff\n\t" + "andi t2, s2, 0xff\n\t" + "andi t3, t5, 0xff\n\t" + "add t0, t0, %[td4]\n\t" + "add t1, t1, %[td4]\n\t" + "add t2, t2, %[td4]\n\t" + "add t3, t3, %[td4]\n\t" + "lbu t0, (t0)\n\t" + "lbu t1, (t1)\n\t" + "lbu t2, (t2)\n\t" + "lbu t3, (t3)\n\t" + "or a4, a4, t0\n\t" + "or a5, a5, t1\n\t" + "or a6, a6, t2\n\t" + "or a7, a7, t3\n\t" + + "slli t4, %[r], 5\n\t" + "add t4, %[rk], t4\n\t" + "lw t0, 0(t4)\n\t" + "lw t1, 4(t4)\n\t" + "lw t2, 8(t4)\n\t" + "lw t3, 12(t4)\n\t" + "xor a4, a4, t0\n\t" + "xor a5, a5, t1\n\t" + "xor a6, a6, t2\n\t" + "xor a7, a7, t3\n\t" + + /* Reverse byte in 32-bit words. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + STORE_WORD_REV(a4, 0, %[out]) + STORE_WORD_REV(a5, 4, %[out]) + STORE_WORD_REV(a6, 8, %[out]) + STORE_WORD_REV(a7, 12, %[out]) +#elif !defined(WOLFSSL_RISCV_BIT_MANIPULATION) + "slli t0, a4, 32\n\t" + "slli t1, a5, 32\n\t" + "slli t2, a6, 32\n\t" + "slli t3, a7, 32\n\t" + "srli t1, t1, 32\n\t" + "srli t3, t3, 32\n\t" + "or t1, t1, t0\n\t" + "or t3, t3, t2\n\t" + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + /* Write encrypted block to output. */ + "sd t1, 0(%[out])\n\t" + "sd t3, 8(%[out])\n\t" +#else + PACK(REG_T1, REG_A5, REG_A4) + PACK(REG_T3, REG_A7, REG_A6) + REV8(REG_T1, REG_T1) + REV8(REG_T3, REG_T3) + /* Write encrypted block to output. */ + "sd t1, 0(%[out])\n\t" + "sd t3, 8(%[out])\n\t" +#endif + + : + : [in] "r" (in), [rk] "r" (aes->key), [td] "r" (Td), + [r] "r" (aes->rounds >> 1), [out] "r" (out), [td4] "r" (Td4) + : "memory", "t0", "t1", "t2", "t3", "t4", + "a4", "a5", "a6", "a7", + "t5", "t6", "s1", "s2" + ); +} +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_DIRECT || HAVE_AES_CBC */ + +#endif /* WOLFSSL_RISCV_SCALAR_CRYPTO_ASM */ + +/* AES-CBC */ +#if (defined(HAVE_AES_CBC) && !defined(HAVE_AES_CBC_ENC_DEC)) || \ + (defined(WOLFSSL_AES_COUNTER) && !defined(HAVE_AES_COUNTER_ENC)) || \ + (defined(HAVE_AESGCM) && !defined(WOLFSSL_RISCV_VECTOR_GCM)) || \ + defined(HAVE_AESCCM) +/* XOR two 16-byte values, out and in, into out. + * + * @param [in, out] out 16-byte value. + * @param [in] in 16-byte value. + */ +static WC_INLINE void xorbuf16(byte* out, const byte* in) +{ + word64* out64 = (word64*)out; + word64* in64 = (word64*)in; + + out64[0] ^= in64[0]; + out64[1] ^= in64[1]; +} +#endif + +#if (defined(HAVE_AES_CBC) && !defined(HAVE_AES_CBC_ENC_DEC)) || \ + (defined(HAVE_AESGCM) && (!defined(WOLFSSL_RISCV_VECTOR_CRYPTO_ASM) || \ + !defined(WOLFSSL_RISCV_VECTOR_GCM))) +/* XOR two 16-byte values into out. + * + * @param [out] out 16-byte value. + * @param [in] a 16-byte value. + * @param [in] b 16-byte value. + */ +static WC_INLINE void xorbufout16(byte* out, const byte* a, const byte* b) +{ + word64* out64 = (word64*)out; + word64* a64 = (word64*)a; + word64* b64 = (word64*)b; + + out64[0] = a64[0] ^ b64[0]; + out64[1] = a64[1] ^ b64[1]; +} +#endif + +#if defined(HAVE_AES_CBC) && !defined(HAVE_AES_CBC_ENC_DEC) +/* Encrypt blocks of data using AES-CBC. + * + * Implementation using wc_AesEncrypt(). + * + * @param [in] aes AES object. + * @param [out] out Encrypted blocks. + * @param [in] in Blocks to encrypt. + * @param pin] sz Number of bytes to encrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_LENGTH_E when sz is not a multiple of AES_BLOCK_SIZE. + */ +int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + int ret = 0; + word32 blocks = sz / AES_BLOCK_SIZE; + + /* Validate parameters. */ + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + /* Ensure a multiple of blocks is to be encrypted. */ + if ((ret == 0) && (sz % AES_BLOCK_SIZE)) { + ret = BAD_LENGTH_E; + } +#endif + + if ((ret == 0) && (blocks > 0)) { + if (in != out) { + /* Encrypt first block with IV. */ + xorbufout16(out, (byte*)aes->reg, in); + wc_AesEncrypt(aes, out, out); + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + for (blocks--; blocks > 0; blocks--) { + /* Encrypt a block with previous output block as IV. */ + xorbufout16(out, out - AES_BLOCK_SIZE, in); + wc_AesEncrypt(aes, out, out); + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + /* Copy last output block into AES object as next IV. */ + memcpy16((byte*)aes->reg, out - AES_BLOCK_SIZE); + } + /* in and out are same buffer. */ + else { + byte* data = out; + /* Encrypt first block with IV. */ + xorbuf16(data, (byte*)aes->reg); + wc_AesEncrypt(aes, data, data); + data += AES_BLOCK_SIZE; + for (blocks--; blocks > 0; blocks--) { + /* Encrypt a block with previous output block as IV. */ + xorbuf16(data, data - AES_BLOCK_SIZE); + wc_AesEncrypt(aes, data, data); + data += AES_BLOCK_SIZE; + } + /* Copy last output block into AES object as next IV. */ + memcpy16((byte*)aes->reg, data - AES_BLOCK_SIZE); + } + } + + return ret; +} + +#ifdef HAVE_AES_DECRYPT +/* Decrypt blocks of data using AES-CBC. + * + * Implementation using wc_AesDecrypt(). + * + * @param [in] aes AES object. + * @param [out] out Decrypted blocks. + * @param [in] in Blocks to decrypt. + * @param pin] sz Number of bytes to decrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_FUNC_ARG when sz is not a multiple of AES_BLOCK_SIZE. + * @return BAD_LENGTH_E when sz is not a multiple of AES_BLOCK_SIZE. + */ +int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + int ret = 0; + word32 blocks = sz / AES_BLOCK_SIZE; + + /* Validate parameters. */ + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Ensure a multiple of blocks is being decrypted. */ + if ((ret == 0) && (sz % AES_BLOCK_SIZE)) { +#ifdef WOLFSSL_AES_CBC_LENGTH_CHECKS + ret = BAD_LENGTH_E; +#else + ret = BAD_FUNC_ARG; +#endif + } + + if ((ret == 0) && (blocks > 0)) { + if (in != out) { + /* Decrypt first block with the IV. */ + wc_AesDecrypt(aes, in, out); + xorbuf16(out, (byte*)aes->reg); + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + for (blocks--; blocks > 0; blocks--) { + /* Decrypt a block with previous input block as IV. */ + wc_AesDecrypt(aes, in, out); + xorbuf16(out, in - AES_BLOCK_SIZE); + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + /* Copy last output block into AES object as next IV. */ + memcpy16((byte*)aes->reg, in - AES_BLOCK_SIZE); + } + /* in and out are same buffer. */ + else { + byte* data = out; + for (; blocks > 0; blocks -= 2) { + /* Decrypt block with the IV in aes->reg. */ + memcpy16((byte*)aes->tmp, data); + wc_AesDecrypt(aes, data, data); + xorbuf16(data, (byte*)aes->reg); + if (blocks == 1) { + memcpy16((byte*)aes->reg, (byte*)aes->tmp); + break; + } + data += AES_BLOCK_SIZE; + /* Decrypt block with the IV in aes->tmp. */ + memcpy16((byte*)aes->reg, data); + wc_AesDecrypt(aes, data, data); + xorbuf16(data, (byte*)aes->tmp); + data += AES_BLOCK_SIZE; + } + } + } + + return ret; +} +#endif +#endif + +/* AES-ECB */ +#ifdef HAVE_AES_ECB +/* Encrypt blocks of data using AES-ECB. + * + * @param [in] aes AES object. + * @param [out] out Encrypted blocks. + * @param [in] in Blocks to encrypt. + * @param pin] sz Number of bytes to encrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_LENGTH_E when sz is not a multiple of AES_BLOCK_SIZE. + */ +int wc_AesEcbEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + int ret = 0; + + /* Validate parameters. */ + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Ensure a multiple of blocks is to be encrypted. */ + if ((ret == 0) && ((sz % AES_BLOCK_SIZE) != 0)) { + ret = BAD_LENGTH_E; + } + + if (ret == 0) { + /* Encrypt block by block. */ + while (sz > 0) { + wc_AesEncrypt(aes, in, out); + out += AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + sz -= AES_BLOCK_SIZE; + } + } + + return ret; +} + +#ifdef HAVE_AES_DECRYPT +/* Decrypt blocks of data using AES-ECB. + * + * @param [in] aes AES object. + * @param [out] out Encrypted blocks. + * @param [in] in Blocks to encrypt. + * @param pin] sz Number of bytes to encrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_LENGTH_E when sz is not a multiple of AES_BLOCK_SIZE. + */ +int wc_AesEcbDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + int ret = 0; + + /* Validate parameters. */ + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Ensure a multiple of blocks is to be decrypted. */ + if ((ret == 0) && ((sz % AES_BLOCK_SIZE) != 0)) { + ret = BAD_LENGTH_E; + } + + if (ret == 0) { + /* Decrypt block by block. */ + while (sz > 0) { + wc_AesDecrypt(aes, in, out); + out += AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + sz -= AES_BLOCK_SIZE; + } + } + + return ret; +} +#endif +#endif /* HAVE_AES_ECB */ + +/* AES-CTR */ +#if defined(WOLFSSL_AES_COUNTER) && !defined(HAVE_AES_COUNTER_ENC) +/* Increment AES counter. + * + * Big-endian byte ordering. + * + * @param [in, out] inOutCtr Counter value to be incremented. + */ +static WC_INLINE void IncrementAesCounter(byte* inOutCtr) +{ + int i; + + /* Big-endian aray - start at last element and move back. */ + for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { + /* Result not zero means no carry. */ + if ((++inOutCtr[i]) != 0) { + return; + } + } +} + +/* Encrypt blocks of data using AES-CTR. + * + * Implemenation uses wc_AesEncrypt(). + * + * @param [in] aes AES object. + * @param [out] out Encrypted blocks. + * @param [in] in Blocks to encrypt. + * @param [in] sz Number of bytes to encrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out or in is NULL. + * @return BAD_FUNC_ARG when key size in AES object is not supported. + */ +int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +{ + byte scratch[AES_BLOCK_SIZE]; + word32 processed; + int ret = 0; + + /* Validate parameters. */ + if (aes == NULL || out == NULL || in == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + /* Check key size is supported. */ + switch(aes->rounds) { + #ifdef WOLFSSL_AES_128 + case 10: /* AES 128 BLOCK */ + #endif /* WOLFSSL_AES_128 */ + #ifdef WOLFSSL_AES_192 + case 12: /* AES 192 BLOCK */ + #endif /* WOLFSSL_AES_192 */ + #ifdef WOLFSSL_AES_256 + case 14: /* AES 256 BLOCK */ + #endif /* WOLFSSL_AES_256 */ + break; + default: + WOLFSSL_MSG("Bad AES-CTR round value"); + ret = BAD_FUNC_ARG; + } + } + + if (ret == 0) { + /* Use up any unused bytes left in aes->tmp */ + processed = min(aes->left, sz); + if (processed > 0) { + /* XOR in encrypted counter. */ + xorbufout(out, in, (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left, + processed); + out += processed; + in += processed; + aes->left -= processed; + sz -= processed; + } + + /* Do whole blocks of data. */ + while (sz >= AES_BLOCK_SIZE) { + wc_AesEncrypt(aes, (byte*)aes->reg, scratch); + xorbuf16(scratch, in); + memcpy16(out, scratch); + IncrementAesCounter((byte*)aes->reg); + + out += AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + sz -= AES_BLOCK_SIZE; + aes->left = 0; + } + ForceZero(scratch, AES_BLOCK_SIZE); + + if (sz > 0) { + /* Encrypt counter and store in aes->tmp. + * Use up aes->tmp to encrypt data less than a block. + */ + wc_AesEncrypt(aes, (byte*)aes->reg, (byte*)aes->tmp); + IncrementAesCounter((byte*)aes->reg); + aes->left = AES_BLOCK_SIZE - sz; + /* XOR in encrypted counter. */ + xorbufout(out, in, aes->tmp, sz); + } + } + + return ret; +} + +#endif /* WOLFSSL_AES_COUNTER */ + +#if defined(WOLFSSL_AES_DIRECT) || defined(WOLFSSL_AES_COUNTER) +/* Set AES key directly. + * + * @param [in] aes AES object. + * @param [in] key Secret key to use. + * @param [in] keyLen Length of key in bytes. + * @param [in] iv Initialization Vector (IV) to use. May be NULL. + * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes or key is NULL. + * @return BAD_FUNC_ARG when keyLen/dir is not supported or valid. + */ +int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 keyLen, const byte* iv, + int dir) +{ + return wc_AesSetKey(aes, key, keyLen, iv, dir); +} +#endif + +/* Set the IV. + * + * @param [in] aes AES object. + * @param [in] iv Initialization Vector (IV) to set. + * When NULL, an IV of all zeros is set. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes is NULL. + */ +int wc_AesSetIV(Aes* aes, const byte* iv) +{ + int ret = 0; + + if (aes == NULL) { + ret = BAD_FUNC_ARG; + } + else if (iv != NULL) { + memcpy16((byte*)aes->reg, iv); + } + else { + XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); + } + + return ret; +} + +/* AES-DIRECT */ +#ifdef WOLFSSL_AES_DIRECT +/* Direct encryption of a block. + * + * @param [in] aes AES object. + * @param [out] out Encrypted block. + * @param [in] in Block to encrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out, or in is NULL. + */ +int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) +{ + int ret = 0; + + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + WOLFSSL_MSG("Invalid input to wc_AesEncryptDirect"); + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + wc_AesEncrypt(aes, in, out); + } + + return ret; +} +#ifdef HAVE_AES_DECRYPT +/* Direct decryption of a block. + * + * @param [in] aes AES object. + * @param [out] out Decrypted block. + * @param [in] in Block to decrypt. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, out, or in is NULL. + */ +int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) +{ + int ret = 0; + + if ((aes == NULL) || (out == NULL) || (in == NULL)) { + WOLFSSL_MSG("Invalid input to wc_AesDecryptDirect"); + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + wc_AesDecrypt(aes, in, out); + } + + return ret; +} +#endif /* HAVE_AES_DECRYPT */ +#endif /* WOLFSSL_AES_DIRECT */ + +#ifdef WOLFSSL_AES_COUNTER + +/* Set the key for AES-CTR. + * + * @param [in] aes AES object. + * @param [in] key Secret key to use. + * @param [in] keyLen Length of key in bytes. + * @param [in] iv Initialization Vector (IV) to use. May be NULL. + * @param [in] dir Direction of crypt: AES_ENCRYPT, AES_DECRYPT. + * For CTR mode, underlying key is always for encryption. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes or key is NULL. + * @return BAD_FUNC_ARG when keyLen is not supported or valid. + */ +int wc_AesCtrSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, + int dir) +{ + (void)dir; + return wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); +} + +#endif /* WOLFSSL_AES_COUNTER */ + +#ifdef HAVE_AESGCM + +#if !defined(WOLFSSL_RISCV_VECTOR_GCM) && \ + !defined(WOLFSSL_RISCV_VECTOR_CARRYLESS) && \ + !defined(WOLFSSL_RISCV_CARRYLESS) +/* Shift x in GF2 + * + * @param [in, out] x 128-bit value to shift. + */ +static WC_INLINE void RIGHTSHIFTX(byte* x) +{ + int i; + int carryIn = 0; + byte borrow = (0x00 - (x[15] & 0x01)) & 0xE1; + + for (i = 0; i < AES_BLOCK_SIZE; i++) { + int carryOut = (x[i] & 0x01) << 7; + x[i] = (byte) ((x[i] >> 1) | carryIn); + carryIn = carryOut; + } + x[0] ^= borrow; +} + +/* Shift right by 4 a big-endian value in little-endian. + * + * @param [out] r8 Result of shift. + * @param [in] z8 128-bit value to shift. + */ +static WC_INLINE void Shift4_M0(byte *r8, byte *z8) +{ + int i; + for (i = 15; i > 0; i--) + r8[i] = (byte)(z8[i-1] << 4) | (byte)(z8[i] >> 4); + r8[0] = (byte)(z8[0] >> 4); +} + +/* Generate 4-bit table. + * + * @param [in, out] gcm GCM object. + */ +void GenerateM0(Gcm* gcm) +{ + int i; + byte (*m)[AES_BLOCK_SIZE] = gcm->M0; + + /* 0 times -> 0x0 */ + XMEMSET(m[0x0], 0, AES_BLOCK_SIZE); + /* 1 times -> 0x8 */ + memcpy16(m[0x8], gcm->H); + /* 2 times -> 0x4 */ + memcpy16(m[0x4], m[0x8]); + RIGHTSHIFTX(m[0x4]); + /* 4 times -> 0x2 */ + memcpy16(m[0x2], m[0x4]); + RIGHTSHIFTX(m[0x2]); + /* 8 times -> 0x1 */ + memcpy16(m[0x1], m[0x2]); + RIGHTSHIFTX(m[0x1]); + + /* 0x3 */ + memcpy16(m[0x3], m[0x2]); + xorbuf16(m[0x3], m[0x1]); + + /* 0x5 -> 0x7 */ + memcpy16(m[0x5], m[0x4]); + xorbuf16(m[0x5], m[0x1]); + memcpy16(m[0x6], m[0x4]); + xorbuf16(m[0x6], m[0x2]); + memcpy16(m[0x7], m[0x4]); + xorbuf16(m[0x7], m[0x3]); + + /* 0x9 -> 0xf */ + memcpy16(m[0x9], m[0x8]); + xorbuf16(m[0x9], m[0x1]); + memcpy16(m[0xa], m[0x8]); + xorbuf16(m[0xa], m[0x2]); + memcpy16(m[0xb], m[0x8]); + xorbuf16(m[0xb], m[0x3]); + memcpy16(m[0xc], m[0x8]); + xorbuf16(m[0xc], m[0x4]); + memcpy16(m[0xd], m[0x8]); + xorbuf16(m[0xd], m[0x5]); + memcpy16(m[0xe], m[0x8]); + xorbuf16(m[0xe], m[0x6]); + memcpy16(m[0xf], m[0x8]); + xorbuf16(m[0xf], m[0x7]); + + for (i = 0; i < 16; i++) { + Shift4_M0(m[16+i], m[i]); + } +} +#endif + +/* Setup the AES-GCM operation with the key. + * + * @param [in] aes AES object. + * @param [in] key Secret key to use. + * @param [in] ken Length of key in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes or key is NULL. + * @return BAD_FUNC_ARG when the key length is not supported. + */ +int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) +{ + int ret = 0; + byte iv[AES_BLOCK_SIZE]; + + if (aes == NULL) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (len != 16) && (len != 24) && (len != 32)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + XMEMSET(iv, 0, AES_BLOCK_SIZE); + ret = wc_AesSetKey(aes, key, len, iv, AES_ENCRYPTION); + } + if (ret == 0) { + wc_AesEncrypt(aes, (byte*)aes->reg, aes->gcm.H); +#ifdef WOLFSSL_RISCV_VECTOR_GCM + /* Vector crypto instructions do bit reversal. */ +#elif defined(WOLFSSL_RISCV_VECTOR_CARRYLESS) + /* Vector crypto instructions do bit reversal. */ +#elif defined(WOLFSSL_RISCV_CARRYLESS) + /* Reverse bits in aes->gcm.H. */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + __asm__ __volatile__ ( + "ld t0, 0(%[data])\n\t" + "ld t1, 8(%[data])\n\t" + BREV8(REG_T0, REG_T0) + BREV8(REG_T1, REG_T1) + "sd t0, 0(%[data])\n\t" + "sd t1, 8(%[data])\n\t" + : + : [data] "r" (aes->gcm.H) + : "memory", "t0", "t1" + ); +#else + __asm__ __volatile__ ( + "ld t0, 0(%[data])\n\t" + "ld t1, 8(%[data])\n\t" + + /* Swap odd-even bits. */ + "li t4, 0x5555555555555555\n\t" + "srli t2, t0, 1\n\t" + "srli t3, t1, 1\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, t2\n\t" + "or t1, t1, t3\n\t" + /* Swap pairs. */ + "li t4, 0x3333333333333333\n\t" + "srli t2, t0, 2\n\t" + "srli t3, t1, 2\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, t2\n\t" + "or t1, t1, t3\n\t" + /* Swap nibbles. */ + "li t4, 0x0f0f0f0f0f0f0f0f\n\t" + "srli t2, t0, 4\n\t" + "srli t3, t1, 4\n\t" + "and t0, t0, t4\n\t" + "and t1, t1, t4\n\t" + "and t2, t2, t4\n\t" + "and t3, t3, t4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, t2\n\t" + "or t1, t1, t3\n\t" + + "sd t0, 0(%[data])\n\t" + "sd t1, 8(%[data])\n\t" + : + : [data] "r" (aes->gcm.H) + : "memory", "t0", "t1", "t2", "t3", "t4" + ); +#endif /* WOLFSSL_RISCV_BIT_MANIPULATION */ +#else + GenerateM0(&aes->gcm); +#endif + } + + return ret; +} + +#ifndef WOLFSSL_RISCV_VECTOR_GCM +/* Encode sz in bytes into array as big-endian number of bits. + * + * @param [out] buf Buffer to encode size into. + * @param [in] sz Size in bytes. + */ +static WC_INLINE void FlattenSzInBits(byte* buf, word32 sz) +{ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + __asm__ __volatile__ ( + /* sz is only 32-bits */ + /* Multiply by 8 to get size in bits. */ + "slli %[sz], %[sz], 3\n\t" + "srli t0, %[sz], 32\n\t" + "srli t1, %[sz], 24\n\t" + "srli t2, %[sz], 16\n\t" + "srli t3, %[sz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[buf])\n\t" + "sb x0 , 2(%[buf])\n\t" + "sb t0 , 3(%[buf])\n\t" + "sb t1 , 4(%[buf])\n\t" + "sb t2 , 5(%[buf])\n\t" + "sb t3 , 6(%[buf])\n\t" + "sb %[sz], 7(%[buf])\n\t" + : [sz] "+r" (sz) + : [buf] "r" (buf) + : "memory", "t0", "t1", "t2", "t3" + ); +#else + __asm__ __volatile__ ( + "slli t0, %[sz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[buf])\n\t" + : + : [sz] "r" (sz), [buf] "r" (buf) + : "memory", "t0" + ); +#endif +} +#endif + +#if defined(WOLFSSL_RISCV_VECTOR_GCM) + +/* Vector GHASH: vd = (vd ^ vs1) * vs2 */ +#define VGHSH_VV(vd, vs1, vs2) \ + ASM_WORD((0b101100 << 26) | (0b1 << 25) | (0b010 << 12) | \ + (0b1110111 << 0) | (vs2 << 20) | (vs1 << 15) | (vd << 7)) +/* Vector GMULT: vd = vd * vs2 */ +#define VGMUL_VV(vd, vs2) \ + ASM_WORD((0b101000 << 26) | (0b1 << 25) | (0b010 << 12) | \ + (0b1110111 << 0) | (vs2 << 20) | (0b10001 << 15) | (vd << 7)) + +/* GHASH Additional Authentication Data (AAD) and cipher text. + * + * @param [in] gcm GCM object. + * @param [in] a Additional Authentication Data (AAD). + * @param [in] aSz Size of AAD in bytes. + * @param [in] c Cipher text. + * @param [in] cSz Size of cipher text in bytes. + * @param [out] s Hash result. + * @param [in] sSz Number of bytes to put into hash result. + */ +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, + byte* s, word32 sSz) +{ + if (gcm != NULL) { + byte x[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + byte* h = gcm->H; + + __asm__ __volatile__ ( + VXOR_VV(REG_V0, REG_V0, REG_V0) + + /* Hash in A, the Additional Authentication Data */ + "beqz %[aSz], L_ghash_aad_done\n\t" + "beqz %[a], L_ghash_aad_done\n\t" + + "srli t3, %[aSz], 4\n\t" + VSETIVLI(REG_T0, 4, 0, 0, 0b010, 0b000) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V1, REG_T0) + + "beqz t3, L_ghash_aad_blocks_done\n\t" + "L_ghash_aad_loop:\n\t" + "mv t0, %[a]\n\t" + VL1RE32_V(REG_V2, REG_T0) + VGHSH_VV(REG_V0, REG_V2, REG_V1) + "addi %[a], %[a], 16\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_ghash_aad_loop\n\t" + "L_ghash_aad_blocks_done:\n\t" + "andi t3, %[aSz], 0xf\n\t" + "beqz t3, L_ghash_aad_done\n\t" + VXOR_VV(REG_V2, REG_V2, REG_V2) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V2, REG_T0) + "mv t2, t3\n\t" + "L_ghash_aad_load_byte:\n\t" + "lb t0, (%[a])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[a], %[a], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_ghash_aad_load_byte\n\t" + "sub %[scratch], %[scratch], t3\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V2, REG_T0) + VGHSH_VV(REG_V0, REG_V2, REG_V1) + "L_ghash_aad_done:\n\t" + + /* Hash in C, the Ciphertext */ + "beqz %[cSz], L_ghash_ct_done\n\t" + "beqz %[c], L_ghash_ct_done\n\t" + + "srli t3, %[cSz], 4\n\t" + VSETIVLI(REG_T0, 4, 0, 0, 0b010, 0b000) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V1, REG_T0) + + "beqz t3, L_ghash_ct_blocks_done\n\t" + "L_ghash_ct_loop:\n\t" + "mv t0, %[c]\n\t" + VL1RE32_V(REG_V2, REG_T0) + VGHSH_VV(REG_V0, REG_V2, REG_V1) + "addi %[c], %[c], 16\n\t" + "addi t3, t3, -1\n\t" + "bnez t3, L_ghash_ct_loop\n\t" + "L_ghash_ct_blocks_done:\n\t" + "andi t3, %[cSz], 0xf\n\t" + "beqz t3, L_ghash_ct_done\n\t" + VXOR_VV(REG_V2, REG_V2, REG_V2) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V2, REG_T0) + "mv t2, t3\n\t" + "L_ghash_ct_load_byte:\n\t" + "lb t0, (%[c])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[c], %[c], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_ghash_ct_load_byte\n\t" + "sub %[scratch], %[scratch], t3\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V2, REG_T0) + VGHSH_VV(REG_V0, REG_V2, REG_V1) + "L_ghash_ct_done:\n\t" + + /* Hash in the lengths of A and C in bits */ + #ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* aSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[aSz], %[aSz], 3\n\t" + "srli t0, %[aSz], 32\n\t" + "srli t1, %[aSz], 24\n\t" + "srli t2, %[aSz], 16\n\t" + "srli t3, %[aSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[scratch])\n\t" + "sb x0 , 2(%[scratch])\n\t" + "sb t0 , 3(%[scratch])\n\t" + "sb t1 , 4(%[scratch])\n\t" + "sb t2 , 5(%[scratch])\n\t" + "sb t3 , 6(%[scratch])\n\t" + "sb %[aSz], 7(%[scratch])\n\t" + /* cSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[cSz], %[cSz], 3\n\t" + "srli t0, %[cSz], 32\n\t" + "srli t1, %[cSz], 24\n\t" + "srli t2, %[cSz], 16\n\t" + "srli t3, %[cSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 8(%[scratch])\n\t" + "sb x0 , 10(%[scratch])\n\t" + "sb t0 , 11(%[scratch])\n\t" + "sb t1 , 12(%[scratch])\n\t" + "sb t2 , 13(%[scratch])\n\t" + "sb t3 , 14(%[scratch])\n\t" + "sb %[cSz], 15(%[scratch])\n\t" + #else + "slli t0, %[aSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[scratch])\n\t" + "slli t0, %[cSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 8(%[scratch])\n\t" + #endif + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V2, REG_T0) + VGHSH_VV(REG_V0, REG_V2, REG_V1) + + "mv t1, %[x]\n\t" + VS1R_V(REG_V0, REG_T1) + + : [a] "+r" (a), [c] "+r" (c) , [aSz] "+r" (aSz), [cSz] "+r" (cSz) + : [x] "r" (x), [h] "r" (h), [scratch] "r" (scratch) + : "memory", "t0", "t1", "t2", "t3" + ); + + /* Copy the result into s. */ + XMEMCPY(s, x, sSz); + } +} + +#define HAVE_GHASH + +#elif defined(WOLFSSL_RISCV_VECTOR_CARRYLESS) + +#define VCLMUL_VV(vd, vs1, vs2) \ + ASM_WORD((0b001100 << 26) | (0b1 << 25) | (0b010 << 12) | \ + (0b1010111 << 0) | (vs2 << 20) | (vs1 << 15) | (vd << 7)) +#define VCLMULH_VV(vd, vs1, vs2) \ + ASM_WORD((0b001101 << 26) | (0b1 << 25) | (0b010 << 12) | \ + (0b1010111 << 0) | (vs2 << 20) | (vs1 << 15) | (vd << 7)) + +/* GMULT, multiply in GF2, x and y into x. + * + * @param [in, out] x On in, value to GMULT. + * On out, result of GMULT. + * @param [in] y Value to GMULT. + */ +static void GMULT(byte* x, byte* y) +{ + static byte red[16] = { + 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) + + /* 0x87 into both 64-bit elements of v7. */ + "mv t1, %[red]\n\t" + VL1RE64_V(REG_V8, REG_T1) + + "mv t1, %[x]\n\t" + VL1RE64_V(REG_V0, REG_T1) + "mv t0, %[y]\n\t" + VL1RE64_V(REG_V1, REG_T0) + /* Reverse x and y. */ +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VBREV8(REG_V0, REG_V0) + VBREV8(REG_V1, REG_V1) +#else + VSETIVLI(REG_X0, 16, 0, 0, 0b000, 0b000) + + /* Swap odd/even bits. */ + "li t0, 0x55\n\t" + VMV_V_X(REG_V4, REG_T0) + VSRL_VI(REG_V2, REG_V0, 1) + VSRL_VI(REG_V3, REG_V1, 1) + VAND_VV(REG_V0, REG_V0, REG_V4) + VAND_VV(REG_V1, REG_V1, REG_V4) + VAND_VV(REG_V2, REG_V2, REG_V4) + VAND_VV(REG_V3, REG_V3, REG_V4) + VSLL_VI(REG_V0, REG_V0, 1) + VSLL_VI(REG_V1, REG_V1, 1) + VOR_VV(REG_V0, REG_V0, REG_V2) + VOR_VV(REG_V1, REG_V1, REG_V3) + /* Swap pairs of bits. */ + "li t0, 0x33\n\t" + VMV_V_X(REG_V4, REG_T0) + VSRL_VI(REG_V2, REG_V0, 2) + VSRL_VI(REG_V3, REG_V1, 2) + VAND_VV(REG_V0, REG_V0, REG_V4) + VAND_VV(REG_V1, REG_V1, REG_V4) + VAND_VV(REG_V2, REG_V2, REG_V4) + VAND_VV(REG_V3, REG_V3, REG_V4) + VSLL_VI(REG_V0, REG_V0, 2) + VSLL_VI(REG_V1, REG_V1, 2) + VOR_VV(REG_V0, REG_V0, REG_V2) + VOR_VV(REG_V1, REG_V1, REG_V3) + /* Swap nibbles. */ + "li t0, 0x0f\n\t" + VMV_V_X(REG_V4, REG_T0) + VSRL_VI(REG_V2, REG_V0, 4) + VSRL_VI(REG_V3, REG_V1, 4) + VAND_VV(REG_V0, REG_V0, REG_V4) + VAND_VV(REG_V1, REG_V1, REG_V4) + VAND_VV(REG_V2, REG_V2, REG_V4) + VAND_VV(REG_V3, REG_V3, REG_V4) + VSLL_VI(REG_V0, REG_V0, 4) + VSLL_VI(REG_V1, REG_V1, 4) + VOR_VV(REG_V0, REG_V0, REG_V2) + VOR_VV(REG_V1, REG_V1, REG_V3) + + VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) +#endif + + /* v2 = (x[1] * y[1])[0] | (x[0] * y[0])[0] */ + VCLMUL_VV(REG_V2, REG_V0, REG_V1) + /* v3 = (x[1] * y[1])[1] | (x[0] * y[0])[1] */ + VCLMULH_VV(REG_V3, REG_V0, REG_V1) + /* V2 = R[2] | R[0], V3 = R[3] | R[1] */ + + /* SWAP 64-bit values from V1 into V6. V6 = V1[0] | V1[1] */ + VSLIDEDOWN_VI(REG_V6, REG_V1, 1) + VSLIDEUP_VI(REG_V6, REG_V1, 1) + /* (x[1] * y[0])[0] | (x[0] * y[1])[0] */ + VCLMUL_VV(REG_V4, REG_V0, REG_V6) + /* (x[1] * y[0])[1] | (x[0] * y[1])[1] */ + VCLMULH_VV(REG_V5, REG_V0, REG_V6) + /* V4 = R[1] | R[1], V5 = R[2] | R[2] */ + + VMV_V_V(REG_V1, REG_V3) + VSLIDEDOWN_VI(REG_V0, REG_V2, 1) + VSLIDEUP_VI(REG_V1, REG_V0, 1) + /* V2 = ---- | R[0], V3 = R[3] | ----, V1 = R[2] | R[1] */ + + VMV_V_V(REG_V6, REG_V4) + /* V7 = ---- | ----, V6 = ---- | R[1] */ + VSLIDEDOWN_VI(REG_V7, REG_V4, 1) + /* V7 = ---- | R[1], V6 = ---- | R[1] */ + VSLIDEUP_VI(REG_V6, REG_V5, 1) + /* V7 = ---- | R[1], V6 = R[2] | R[1] */ + VSLIDEDOWN_VI(REG_V0, REG_V5, 1) + VSLIDEUP_VI(REG_V7, REG_V0, 1) + /* V7 = R[2] | R[1], V6 = R[2] | R[1] */ + VXOR_VV(REG_V1, REG_V1, REG_V6) + VXOR_VV(REG_V1, REG_V1, REG_V7) + /* V2 = ---- | R[0], V3 = R[3] | ----, V1 = R[2] | R[1] */ + VSLIDEUP_VI(REG_V2, REG_V1, 1) + VSLIDEDOWN_VI(REG_V5, REG_V3, 1) + VSLIDEDOWN_VI(REG_V3, REG_V1, 1) + VSLIDEUP_VI(REG_V3, REG_V5, 1) + /* V2 = R[1] | R[0], V3 = R[3] | R[2] */ + + /* Reduce */ + /* v0 = (R[3] * 0x87)[0] | (R[2] * 0x87)[0] */ + VCLMUL_VV(REG_V0, REG_V3, REG_V8) + /* v1 = (R[3] * 0x87)[1] | (R[2] * 0x87)[1] */ + VCLMULH_VV(REG_V1, REG_V3, REG_V8) + /* V0 = r[1] | r[0], V1 = r[2] | r[1] */ + VXOR_VV(REG_V4, REG_V4, REG_V4) + VXOR_VV(REG_V2, REG_V2, REG_V0) + VSLIDEUP_VI(REG_V4, REG_V1, 1) + VXOR_VV(REG_V2, REG_V2, REG_V4) + VSLIDEDOWN_VI(REG_V3, REG_V1, 1) + /* v0 = ---- | (r[2] * 0x87)[0] */ + VCLMUL_VV(REG_V0, REG_V3, REG_V8) + /* v1 = ---- | (r[2] * 0x87)[1] */ + VCLMULH_VV(REG_V1, REG_V3, REG_V8) + /* V0 = ---- | r[0] , V1 = ---- | r[1] */ + VSLIDEUP_VI(REG_V0, REG_V1, 1) + /* V1 = R[1] | R[0] */ + VXOR_VV(REG_V2, REG_V2, REG_V0) + + /* Reverse x. */ +#ifdef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VBREV8(REG_V2, REG_V2) +#else + VSETIVLI(REG_X0, 16, 0, 0, 0b000, 0b000) + + /* Swap odd/even bits. */ + "li t0, 0x55\n\t" + VMV_V_X(REG_V4, REG_T0) + VSRL_VI(REG_V0, REG_V2, 1) + VAND_VV(REG_V2, REG_V2, REG_V4) + VAND_VV(REG_V0, REG_V0, REG_V4) + VSLL_VI(REG_V2, REG_V2, 1) + VOR_VV(REG_V2, REG_V2, REG_V0) + /* Swap pairs of bits. */ + "li t0, 0x33\n\t" + VMV_V_X(REG_V4, REG_T0) + VSRL_VI(REG_V0, REG_V2, 2) + VAND_VV(REG_V2, REG_V2, REG_V4) + VAND_VV(REG_V0, REG_V0, REG_V4) + VSLL_VI(REG_V2, REG_V2, 2) + VOR_VV(REG_V2, REG_V2, REG_V0) + /* Swap nibbles. */ + "li t0, 0x0f\n\t" + VMV_V_X(REG_V4, REG_T0) + VSRL_VI(REG_V0, REG_V2, 4) + VAND_VV(REG_V2, REG_V2, REG_V4) + VAND_VV(REG_V0, REG_V0, REG_V4) + VSLL_VI(REG_V2, REG_V2, 4) + VOR_VV(REG_V2, REG_V2, REG_V0) + + VSETIVLI(REG_X0, 2, 0, 0, 0b011, 0b000) +#endif + VS1R_V(REG_V2, REG_T1) + : + : [x] "r" (x), [y] "r" (y), [red] "r" (red) + : "memory", "t0", "t1", "t2" + ); +} + +/* GHASH Additional Authentication Data (AAD) and cipher text. + * + * @param [in] gcm GCM object. + * @param [in] a Additional Authentication Data (AAD). + * @param [in] aSz Size of AAD in bytes. + * @param [in] c Cipher text. + * @param [in] cSz Size of cipher text in bytes. + * @param [out] s Hash result. + * @param [in] sSz Number of bytes to put into hash result. + */ +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, + byte* s, word32 sSz) +{ + byte x[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + word32 blocks, partial; + byte* h; + + if (gcm == NULL) { + return; + } + + h = gcm->H; + XMEMSET(x, 0, AES_BLOCK_SIZE); + + /* Hash in A, the Additional Authentication Data */ + if (aSz != 0 && a != NULL) { + blocks = aSz / AES_BLOCK_SIZE; + partial = aSz % AES_BLOCK_SIZE; + while (blocks--) { + xorbuf16(x, a); + GMULT(x, h); + a += AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, AES_BLOCK_SIZE); + XMEMCPY(scratch, a, partial); + xorbuf16(x, scratch); + GMULT(x, h); + } + } + + /* Hash in C, the Ciphertext */ + if (cSz != 0 && c != NULL) { + blocks = cSz / AES_BLOCK_SIZE; + partial = cSz % AES_BLOCK_SIZE; + while (blocks--) { + xorbuf16(x, c); + GMULT(x, h); + c += AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, AES_BLOCK_SIZE); + XMEMCPY(scratch, c, partial); + xorbuf16(x, scratch); + GMULT(x, h); + } + } + + /* Hash in the lengths of A and C in bits */ + FlattenSzInBits(&scratch[0], aSz); + FlattenSzInBits(&scratch[8], cSz); + xorbuf16(x, scratch); + GMULT(x, h); + + /* Copy the result into s. */ + XMEMCPY(s, x, sSz); +} + +#define HAVE_GHASH + +#elif defined(WOLFSSL_RISCV_CARRYLESS) + +/* Bottom half of carryless-multiplication: rd = (rs1 * rs2)[0..63]. */ +#define CLMUL(rd, rs1, rs2) \ + ASM_WORD(0b00001010000000000001000000110011 | \ + (rd << 7) | (rs1 << 15) | (rs2 << 20)) +/* Top half of carryless-multiplication: rd = (rs1 * rs2)[64..127]. */ +#define CLMULH(rd, rs1, rs2) \ + ASM_WORD(0b00001010000000000011000000110011 | \ + (rd << 7) | (rs1 << 15) | (rs2 << 20)) + +/* GMULT, multiply in GF2, x and y into x. + * + * @param [in, out] x On in, value to GMULT. + * On out, result of GMULT. + * @param [in] y Value to GMULT. + */ +static void GMULT(byte* x, byte* y) +{ + __asm__ __volatile__ ( + "ld t0, 0(%[x])\n\t" + "ld t1, 8(%[x])\n\t" + "ld t2, 0(%[y])\n\t" + "ld t3, 8(%[y])\n\t" + /* Load reduction value into t6 */ + "li t6, 0x87\n\t" + /* Reverse x. y was reversed in wc_AesGcmSetKey. */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + BREV8(REG_T0, REG_T0) + BREV8(REG_T1, REG_T1) +#else + /* Swap odd-even bits. */ + "li a4, 0x5555555555555555\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap pairs. */ + "li a4, 0x3333333333333333\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap nibbles. */ + "li a4, 0x0f0f0f0f0f0f0f0f\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif + + /* r[0..1] = x[0] * y[0] */ + CLMUL(REG_A2, REG_T0, REG_T2) + CLMULH(REG_A3, REG_T0, REG_T2) + /* r[2..3] = x[1] * y[1] */ + CLMUL(REG_A4, REG_T1, REG_T3) + CLMULH(REG_A5, REG_T1, REG_T3) + /* r[1..2] ^= x[1] * y[0] */ + CLMUL(REG_T4, REG_T1, REG_T2) + CLMULH(REG_T5, REG_T1, REG_T2) + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* r[1..2] ^= x[0] * y[1] */ + CLMUL(REG_T4, REG_T0, REG_T3) + CLMULH(REG_T5, REG_T0, REG_T3) + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + + /* Reduce */ + CLMUL(REG_T4, REG_A5, REG_T6) + CLMULH(REG_T5, REG_A5, REG_T6) + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + CLMUL(REG_T4, REG_A4, REG_T6) + CLMULH(REG_T5, REG_A4, REG_T6) + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + + /* Reverse x. */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + BREV8(REG_T0, REG_T0) + BREV8(REG_T1, REG_T1) +#else + /* Swap odd-even bits. */ + "li a4, 0x5555555555555555\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap pairs. */ + "li a4, 0x3333333333333333\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap nibbles. */ + "li a4, 0x0f0f0f0f0f0f0f0f\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif + "sd t0, 0(%[x])\n\t" + "sd t1, 8(%[x])\n\t" + : + : [x] "r" (x), [y] "r" (y) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", + "a2", "a3", "a4", "a5" + ); +} + +/* GHASH blocks of data. + * + * @param [in, out] x On in, value to GMULT. + * On out, result of GMULT. + * @param [in] y Value to GMULT. + * @param [in] in Blocks of data to GHASH. + * @param [in] blocks Number of blocks to GHASH. + */ +static void ghash_blocks(byte* x, byte* y, const byte* in, word32 blocks) +{ + __asm__ __volatile__ ( + "ld t0, 0(%[x])\n\t" + "ld t1, 8(%[x])\n\t" + "ld t2, 0(%[y])\n\t" + "ld t3, 8(%[y])\n\t" + /* Load reduction value into t6 */ + "li t6, 0x87\n\t" + /* Reverse x. y was reversed in wc_AesGcmSetKey. */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + BREV8(REG_T0, REG_T0) + BREV8(REG_T1, REG_T1) +#else + /* Swap odd-even bits. */ + "li a4, 0x5555555555555555\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap pairs. */ + "li a4, 0x3333333333333333\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap nibbles. */ + "li a4, 0x0f0f0f0f0f0f0f0f\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif + + "L_ghash_loop:\n\t" + /* Load input block. */ + "ld t5, 0(%[in])\n\t" + "ld a5, 8(%[in])\n\t" + /* Reverse bits to match x. */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + BREV8(REG_T5, REG_T5) + BREV8(REG_A5, REG_A5) +#else + /* Swap odd-even bits. */ + "li a4, 0x5555555555555555\n\t" + "srli a2, t5, 1\n\t" + "srli a3, a5, 1\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 1\n\t" + "slli a5, a5, 1\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + /* Swap pairs. */ + "li a4, 0x3333333333333333\n\t" + "srli a2, t5, 2\n\t" + "srli a3, a5, 2\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 2\n\t" + "slli a5, a5, 2\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" + /* Swap nibbles. */ + "li a4, 0x0f0f0f0f0f0f0f0f\n\t" + "srli a2, t5, 4\n\t" + "srli a3, a5, 4\n\t" + "and t5, t5, a4\n\t" + "and a5, a5, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t5, t5, 4\n\t" + "slli a5, a5, 4\n\t" + "or t5, t5, a2\n\t" + "or a5, a5, a3\n\t" +#endif + /* XOR input into x. */ + "xor t0, t0, t5\n\t" + "xor t1, t1, a5\n\t" + + /* r[0..1] = x[0] * y[0] */ + CLMUL(REG_A2, REG_T0, REG_T2) + CLMULH(REG_A3, REG_T0, REG_T2) + /* r[2..3] = x[1] * y[1] */ + CLMUL(REG_A4, REG_T1, REG_T3) + CLMULH(REG_A5, REG_T1, REG_T3) + /* r[1..2] ^= x[1] * y[0] */ + CLMUL(REG_T4, REG_T1, REG_T2) + CLMULH(REG_T5, REG_T1, REG_T2) + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + /* r[1..2] ^= x[0] * y[1] */ + CLMUL(REG_T4, REG_T0, REG_T3) + CLMULH(REG_T5, REG_T0, REG_T3) + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + + /* Reduce */ + CLMUL(REG_T4, REG_A5, REG_T6) + CLMULH(REG_T5, REG_A5, REG_T6) + "xor a3, a3, t4\n\t" + "xor a4, a4, t5\n\t" + CLMUL(REG_T4, REG_A4, REG_T6) + CLMULH(REG_T5, REG_A4, REG_T6) + "xor t0, a2, t4\n\t" + "xor t1, a3, t5\n\t" + + "addi %[in], %[in], 16\n\t" + "addi %[blocks], %[blocks], -1\n\t" + "bnez %[blocks], L_ghash_loop\n\t" + + /* Reverse x. */ +#ifdef WOLFSSL_RISCV_BIT_MANIPULATION + BREV8(REG_T0, REG_T0) + BREV8(REG_T1, REG_T1) +#else + /* Swap odd-even bits. */ + "li a4, 0x5555555555555555\n\t" + "srli a2, t0, 1\n\t" + "srli a3, t1, 1\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 1\n\t" + "slli t1, t1, 1\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap pairs. */ + "li a4, 0x3333333333333333\n\t" + "srli a2, t0, 2\n\t" + "srli a3, t1, 2\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 2\n\t" + "slli t1, t1, 2\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" + /* Swap nibbles. */ + "li a4, 0x0f0f0f0f0f0f0f0f\n\t" + "srli a2, t0, 4\n\t" + "srli a3, t1, 4\n\t" + "and t0, t0, a4\n\t" + "and t1, t1, a4\n\t" + "and a2, a2, a4\n\t" + "and a3, a3, a4\n\t" + "slli t0, t0, 4\n\t" + "slli t1, t1, 4\n\t" + "or t0, t0, a2\n\t" + "or t1, t1, a3\n\t" +#endif + "sd t0, 0(%[x])\n\t" + "sd t1, 8(%[x])\n\t" + : [in] "+r" (in), [blocks] "+r" (blocks) + : [x] "r" (x), [y] "r" (y) + : "memory", "t0", "t1", "t2", "t3", "t4", "t5", "t6", + "a2", "a3", "a4", "a5" + ); +} + +/* GHASH Additional Authentication Data (AAD) and cipher text. + * + * @param [in] gcm GCM object. + * @param [in] a Additional Authentication Data (AAD). + * @param [in] aSz Size of AAD in bytes. + * @param [in] c Cipher text. + * @param [in] cSz Size of cipher text in bytes. + * @param [out] s Hash result. + * @param [in] sSz Number of bytes to put into hash result. + */ +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, + byte* s, word32 sSz) +{ + if (gcm != NULL) { + byte x[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + word32 blocks, partial; + byte* h = gcm->H; + + XMEMSET(x, 0, AES_BLOCK_SIZE); + + /* Hash in A, the Additional Authentication Data */ + if (aSz != 0 && a != NULL) { + blocks = aSz / AES_BLOCK_SIZE; + partial = aSz % AES_BLOCK_SIZE; + if (blocks > 0) { + ghash_blocks(x, h, a, blocks); + a += blocks * AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, AES_BLOCK_SIZE); + XMEMCPY(scratch, a, partial); + xorbuf16(x, scratch); + GMULT(x, h); + } + } + + /* Hash in C, the Ciphertext */ + if (cSz != 0 && c != NULL) { + blocks = cSz / AES_BLOCK_SIZE; + partial = cSz % AES_BLOCK_SIZE; + if (blocks > 0) { + ghash_blocks(x, h, c, blocks); + c += blocks * AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, AES_BLOCK_SIZE); + XMEMCPY(scratch, c, partial); + xorbuf16(x, scratch); + GMULT(x, h); + } + } + + /* Hash in the lengths of A and C in bits */ + FlattenSzInBits(&scratch[0], aSz); + FlattenSzInBits(&scratch[8], cSz); + xorbuf16(x, scratch); + GMULT(x, h); + + /* Copy the result into s. */ + XMEMCPY(s, x, sSz); + } +} + +#define HAVE_GHASH + +#endif /* !WOLFSSL_RISCV_VECTOR_GCM */ + +#ifdef WOLFSSL_RISCV_VECTOR_CRYPTO_ASM +#ifdef WOLFSSL_RISCV_VECTOR_GCM +/* START script replace AES-GCM RISC-V 64 with hardware vector crypto */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION +static const word32 rev_idx[4] = { + 0x00010203, 0x04050607, 0x08090a0b, 0x0c0d0e0f +}; +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + +#ifdef WOLFSSL_AES_128 +/* Encrypt data using AES-128-GCM. + * + * @param [in] aes AES object. + * @param [out] out Encrypted data. + * @param [in] in Data to encrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + */ +static void Aes128GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + /* Noticed different optimization levels treated head of array different. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. + */ + byte* ctr = counter; + byte* key = (byte*)aes->key; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (nonceSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { +#ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; +#endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); +#ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; +#endif + } + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* X=0, get H */ + VXOR_VV(REG_V18, REG_V18, REG_V18) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V19, REG_T0) + + /* Hash in AAD, the Additional Authentication Data */ + "beqz %[aSz], L_aes_gcm_128_encrypt_ghash_aad_done\n\t" + "beqz %[aad], L_aes_gcm_128_encrypt_ghash_aad_done\n\t" + + "srli t1, %[aSz], 4\n\t" + "beqz t1, L_aes_gcm_128_encrypt_ghash_aad_blocks_done\n\t" + + "L_aes_gcm_128_encrypt_ghash_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_encrypt_ghash_aad_loop\n\t" + "L_aes_gcm_128_encrypt_ghash_aad_blocks_done:\n\t" + "andi t1, %[aSz], 0xf\n\t" + "beqz t1, L_aes_gcm_128_encrypt_ghash_aad_done\n\t" + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t2, t1\n\t" + "L_aes_gcm_128_encrypt_ghash_aad_load_byte:\n\t" + "lb t0, (%[aad])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_128_encrypt_ghash_aad_load_byte\n\t" + "sub %[scratch], %[scratch], t1\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "L_aes_gcm_128_encrypt_ghash_aad_done:\n\t" + /* Done Hash in AAD */ + +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "mv t0, %[rev_idx]\n\t" + VL1RE32_V(REG_V15, REG_T0) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + /* Load the counter. */ + "mv t0, %[ctr]\n\t" + VL1RE32_V(REG_V16, REG_T0) +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VSLIDEDOWN_VI(REG_V20, REG_V16, 3) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V21, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V20, REG_V21) +#else + VREV8(REG_V20, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "lw t3, 12(%[ctr])\n\t" + "slli t3, t3, 32\n\t" + REV8(REG_T3, REG_T3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..9]. */ + "addi t0, t0, 128\n\t" + VL2RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V10, REG_T0) + + "beqz %[sz], L_aes_gcm_128_encrypt_blocks_done\n\t" + "srli t4, %[sz], 6\n\t" + "beqz t4, L_aes_gcm_128_encrypt_x4_blocks_done\n\t" + + /* Calculate H^[1-4] - GMULT partials */ + VMV_V_V(REG_V21, REG_V19) + VMV_V_V(REG_V22, REG_V19) + /* Multiply H * H => H^2 */ + VGMUL_VV(REG_V21, REG_V19) + VMV_V_V(REG_V23, REG_V21) + /* Multiply H * H => H^3 */ + VGMUL_VV(REG_V22, REG_V21) + /* Multiply H^2 * H^2 => H^4 */ + VGMUL_VV(REG_V23, REG_V21) + + "L_aes_gcm_128_encrypt_x4_block_loop:\n\t" + /* Calculate next 4 counters (+1-4) */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VMV_V_V(REG_V24, REG_V16) + VMV_V_V(REG_V25, REG_V16) + VMV_V_V(REG_V26, REG_V16) + VMV_V_V(REG_V27, REG_V16) + VADD_VI(REG_V28, REG_V20, 1) + VADD_VI(REG_V29, REG_V20, 2) + VADD_VI(REG_V30, REG_V20, 3) + VADD_VI(REG_V20, REG_V20, 4) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V28) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V28, REG_V17) +#else + VREV8(REG_V28, REG_V28) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V29) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V29, REG_V17) +#else + VREV8(REG_V29, REG_V29) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V30) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V30, REG_V17) +#else + VREV8(REG_V30, REG_V30) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V31, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V31, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "addi t0, t3, 1\n\t" + VMV_V_V(REG_V24, REG_V16) + "addi t1, t3, 2\n\t" + VMV_V_V(REG_V25, REG_V16) + "addi t2, t3, 3\n\t" + VMV_V_V(REG_V26, REG_V16) + "slli t0, t0, 32\n\t" + VMV_V_V(REG_V27, REG_V16) + "slli t1, t1, 32\n\t" + "slli t2, t2, 32\n\t" + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + REV8(REG_T2, REG_T2) + "addi t3, t3, 4\n\t" + VMV_V_X(REG_V28, REG_T0) + "slli t0, t3, 32\n\t" + VMV_V_X(REG_V29, REG_T1) + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V30, REG_T2) + VMV_V_X(REG_V31, REG_T0) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V24, REG_V28, 3) + VSLIDEUP_VI(REG_V25, REG_V29, 3) + VSLIDEUP_VI(REG_V26, REG_V30, 3) + VSLIDEUP_VI(REG_V27, REG_V31, 3) + + VAESZ_VS(REG_V24, REG_V0) + VAESZ_VS(REG_V25, REG_V0) + VAESZ_VS(REG_V26, REG_V0) + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V24, REG_V1) + VAESEM_VS(REG_V24, REG_V2) + VAESEM_VS(REG_V24, REG_V3) + VAESEM_VS(REG_V24, REG_V4) + VAESEM_VS(REG_V24, REG_V5) + VAESEM_VS(REG_V24, REG_V6) + VAESEM_VS(REG_V24, REG_V7) + VAESEM_VS(REG_V24, REG_V8) + VAESEM_VS(REG_V24, REG_V9) + VAESEM_VS(REG_V25, REG_V1) + VAESEM_VS(REG_V25, REG_V2) + VAESEM_VS(REG_V25, REG_V3) + VAESEM_VS(REG_V25, REG_V4) + VAESEM_VS(REG_V25, REG_V5) + VAESEM_VS(REG_V25, REG_V6) + VAESEM_VS(REG_V25, REG_V7) + VAESEM_VS(REG_V25, REG_V8) + VAESEM_VS(REG_V25, REG_V9) + VAESEM_VS(REG_V26, REG_V1) + VAESEM_VS(REG_V26, REG_V2) + VAESEM_VS(REG_V26, REG_V3) + VAESEM_VS(REG_V26, REG_V4) + VAESEM_VS(REG_V26, REG_V5) + VAESEM_VS(REG_V26, REG_V6) + VAESEM_VS(REG_V26, REG_V7) + VAESEM_VS(REG_V26, REG_V8) + VAESEM_VS(REG_V26, REG_V9) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEF_VS(REG_V24, REG_V10) + VAESEF_VS(REG_V25, REG_V10) + VAESEF_VS(REG_V26, REG_V10) + VAESEF_VS(REG_V27, REG_V10) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL4RE32_V(REG_V28, REG_T0) + VXOR_VV(REG_V28, REG_V24, REG_V28) + VXOR_VV(REG_V29, REG_V25, REG_V29) + VXOR_VV(REG_V30, REG_V26, REG_V30) + VXOR_VV(REG_V31, REG_V27, REG_V31) + /* Store output. */ + "mv t0, %[out]\n\t" + VS4R_V(REG_V28, REG_T0) + VGMUL_VV(REG_V28, REG_V23) + VGMUL_VV(REG_V29, REG_V22) + VGMUL_VV(REG_V30, REG_V21) + VGMUL_VV(REG_V31, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V28) + VXOR_VV(REG_V18, REG_V18, REG_V29) + VXOR_VV(REG_V18, REG_V18, REG_V30) + VXOR_VV(REG_V18, REG_V18, REG_V31) + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + /* Loop if more elements to process. */ + "addi t4, t4, -1\n\t" + "bnez t4, L_aes_gcm_128_encrypt_x4_block_loop\n\t" + "andi %[sz], %[sz], 0x3f\n\t" + + "L_aes_gcm_128_encrypt_x4_blocks_done:\n\t" + "srli t2, %[sz], 4\n\t" + "beqz t2, L_aes_gcm_128_encrypt_blocks_done\n\t" + + "L_aes_gcm_128_encrypt_block_loop:\n\t" +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEF_VS(REG_V27, REG_V10) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + VGHSH_VV(REG_V18, REG_V27, REG_V19) + /* Store output. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V27, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_128_encrypt_block_loop\n\t" + + "L_aes_gcm_128_encrypt_blocks_done:\n\t" + "andi t2, %[sz], 0xf\n\t" + "beqz t2, L_aes_gcm_128_encrypt_done\n\t" + + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_128_encrypt_load_byte:\n\t" + "lb t0, (%[in])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_encrypt_load_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + + /* Encrypt counter for partial block. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEF_VS(REG_V27, REG_V10) + + /* Load scratch. */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store scratch. */ + VS1R_V(REG_V27, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_128_encrypt_store_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[out])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_encrypt_store_byte\n\t" + "li t1, 16\n\t" + "sub t1, t1, t2\n\t" + "L_aes_gcm_128_encrypt_zero_byte:\n\t" + "sb x0, (%[scratch])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_encrypt_zero_byte\n\t" + "addi %[scratch], %[scratch], -16\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + "L_aes_gcm_128_encrypt_done:\n\t" + + /* Hash in the lengths of A and C in bits */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* aSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[aSz], %[aSz], 3\n\t" + "srli t0, %[aSz], 32\n\t" + "srli t1, %[aSz], 24\n\t" + "srli t2, %[aSz], 16\n\t" + "srli t3, %[aSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[scratch])\n\t" + "sb x0 , 2(%[scratch])\n\t" + "sb t0 , 3(%[scratch])\n\t" + "sb t1 , 4(%[scratch])\n\t" + "sb t2 , 5(%[scratch])\n\t" + "sb t3 , 6(%[scratch])\n\t" + "sb %[aSz], 7(%[scratch])\n\t" + /* sz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[sz], %[sz], 3\n\t" + "srli t0, %[sz], 32\n\t" + "srli t1, %[sz], 24\n\t" + "srli t2, %[sz], 16\n\t" + "srli t3, %[sz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 8(%[scratch])\n\t" + "sb x0 , 10(%[scratch])\n\t" + "sb t0 , 11(%[scratch])\n\t" + "sb t1 , 12(%[scratch])\n\t" + "sb t2 , 13(%[scratch])\n\t" + "sb t3 , 14(%[scratch])\n\t" + "sb %[sz], 15(%[scratch])\n\t" +#else + "slli t0, %[aSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[scratch])\n\t" + "slli t0, %[sz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 8(%[scratch])\n\t" +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + VAESZ_VS(REG_V16, REG_V0) + VAESEM_VS(REG_V16, REG_V1) + VAESEM_VS(REG_V16, REG_V2) + VAESEM_VS(REG_V16, REG_V3) + VAESEM_VS(REG_V16, REG_V4) + VAESEM_VS(REG_V16, REG_V5) + VAESEM_VS(REG_V16, REG_V6) + VAESEM_VS(REG_V16, REG_V7) + VAESEM_VS(REG_V16, REG_V8) + VAESEM_VS(REG_V16, REG_V9) + VAESEF_VS(REG_V16, REG_V10) + VXOR_VV(REG_V18, REG_V18, REG_V16) + + "li t1, 16\n\t" + "blt %[tagSz], t1, L_aes_gcm_128_encrypt_tag_small\n\t" + "mv t0, %[tag]\n\t" + VS1R_V(REG_V18, REG_T0) + "beqz x0, L_aes_gcm_128_encrypt_tag_done\n\t" + "L_aes_gcm_128_encrypt_tag_small:\n\t" + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V18, REG_T0) + "mv t1, %[tagSz]\n\t" + "L_aes_gcm_128_encrypt_store_tag_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[tag])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_encrypt_store_tag_byte\n\t" + "L_aes_gcm_128_encrypt_tag_done:\n\t" + + : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), + [aSz] "+r" (aadSz), [aad] "+r" (aad), [sz] "+r" (sz) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + , [rev_idx] "r" (rev_idx) +#endif + : "memory", "t0", "t1", "t2", "t3", "t4" + ); + +#ifdef OPENSSL_EXTRA + if ((tag != NULL) && (in != NULL) && (sz != 0)) { + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + } +#endif +} +#endif /* WOLFSSL_AES_128 */ + +#ifdef WOLFSSL_AES_192 +/* Encrypt data using AES-192-GCM. + * + * @param [in] aes AES object. + * @param [out] out Encrypted data. + * @param [in] in Data to encrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + */ +static void Aes192GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + /* Noticed different optimization levels treated head of array different. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. + */ + byte* ctr = counter; + byte* key = (byte*)aes->key; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (nonceSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { +#ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; +#endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); +#ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; +#endif + } + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* X=0, get H */ + VXOR_VV(REG_V18, REG_V18, REG_V18) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V19, REG_T0) + + /* Hash in AAD, the Additional Authentication Data */ + "beqz %[aSz], L_aes_gcm_192_encrypt_ghash_aad_done\n\t" + "beqz %[aad], L_aes_gcm_192_encrypt_ghash_aad_done\n\t" + + "srli t1, %[aSz], 4\n\t" + "beqz t1, L_aes_gcm_192_encrypt_ghash_aad_blocks_done\n\t" + + "L_aes_gcm_192_encrypt_ghash_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_encrypt_ghash_aad_loop\n\t" + "L_aes_gcm_192_encrypt_ghash_aad_blocks_done:\n\t" + "andi t1, %[aSz], 0xf\n\t" + "beqz t1, L_aes_gcm_192_encrypt_ghash_aad_done\n\t" + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t2, t1\n\t" + "L_aes_gcm_192_encrypt_ghash_aad_load_byte:\n\t" + "lb t0, (%[aad])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_192_encrypt_ghash_aad_load_byte\n\t" + "sub %[scratch], %[scratch], t1\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "L_aes_gcm_192_encrypt_ghash_aad_done:\n\t" + /* Done Hash in AAD */ + +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "mv t0, %[rev_idx]\n\t" + VL1RE32_V(REG_V15, REG_T0) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + /* Load the counter. */ + "mv t0, %[ctr]\n\t" + VL1RE32_V(REG_V16, REG_T0) +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VSLIDEDOWN_VI(REG_V20, REG_V16, 3) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V21, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V20, REG_V21) +#else + VREV8(REG_V20, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "lw t3, 12(%[ctr])\n\t" + "slli t3, t3, 32\n\t" + REV8(REG_T3, REG_T3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V12, REG_T0) + + "beqz %[sz], L_aes_gcm_192_encrypt_blocks_done\n\t" + "srli t4, %[sz], 6\n\t" + "beqz t4, L_aes_gcm_192_encrypt_x4_blocks_done\n\t" + + /* Calculate H^[1-4] - GMULT partials */ + VMV_V_V(REG_V21, REG_V19) + VMV_V_V(REG_V22, REG_V19) + /* Multiply H * H => H^2 */ + VGMUL_VV(REG_V21, REG_V19) + VMV_V_V(REG_V23, REG_V21) + /* Multiply H * H => H^3 */ + VGMUL_VV(REG_V22, REG_V21) + /* Multiply H^2 * H^2 => H^4 */ + VGMUL_VV(REG_V23, REG_V21) + + "L_aes_gcm_192_encrypt_x4_block_loop:\n\t" + /* Calculate next 4 counters (+1-4) */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VMV_V_V(REG_V24, REG_V16) + VMV_V_V(REG_V25, REG_V16) + VMV_V_V(REG_V26, REG_V16) + VMV_V_V(REG_V27, REG_V16) + VADD_VI(REG_V28, REG_V20, 1) + VADD_VI(REG_V29, REG_V20, 2) + VADD_VI(REG_V30, REG_V20, 3) + VADD_VI(REG_V20, REG_V20, 4) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V28) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V28, REG_V17) +#else + VREV8(REG_V28, REG_V28) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V29) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V29, REG_V17) +#else + VREV8(REG_V29, REG_V29) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V30) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V30, REG_V17) +#else + VREV8(REG_V30, REG_V30) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V31, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V31, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "addi t0, t3, 1\n\t" + VMV_V_V(REG_V24, REG_V16) + "addi t1, t3, 2\n\t" + VMV_V_V(REG_V25, REG_V16) + "addi t2, t3, 3\n\t" + VMV_V_V(REG_V26, REG_V16) + "slli t0, t0, 32\n\t" + VMV_V_V(REG_V27, REG_V16) + "slli t1, t1, 32\n\t" + "slli t2, t2, 32\n\t" + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + REV8(REG_T2, REG_T2) + "addi t3, t3, 4\n\t" + VMV_V_X(REG_V28, REG_T0) + "slli t0, t3, 32\n\t" + VMV_V_X(REG_V29, REG_T1) + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V30, REG_T2) + VMV_V_X(REG_V31, REG_T0) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V24, REG_V28, 3) + VSLIDEUP_VI(REG_V25, REG_V29, 3) + VSLIDEUP_VI(REG_V26, REG_V30, 3) + VSLIDEUP_VI(REG_V27, REG_V31, 3) + + VAESZ_VS(REG_V24, REG_V0) + VAESZ_VS(REG_V25, REG_V0) + VAESZ_VS(REG_V26, REG_V0) + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V24, REG_V1) + VAESEM_VS(REG_V24, REG_V2) + VAESEM_VS(REG_V24, REG_V3) + VAESEM_VS(REG_V24, REG_V4) + VAESEM_VS(REG_V24, REG_V5) + VAESEM_VS(REG_V24, REG_V6) + VAESEM_VS(REG_V24, REG_V7) + VAESEM_VS(REG_V24, REG_V8) + VAESEM_VS(REG_V24, REG_V9) + VAESEM_VS(REG_V24, REG_V10) + VAESEM_VS(REG_V24, REG_V11) + VAESEM_VS(REG_V25, REG_V1) + VAESEM_VS(REG_V25, REG_V2) + VAESEM_VS(REG_V25, REG_V3) + VAESEM_VS(REG_V25, REG_V4) + VAESEM_VS(REG_V25, REG_V5) + VAESEM_VS(REG_V25, REG_V6) + VAESEM_VS(REG_V25, REG_V7) + VAESEM_VS(REG_V25, REG_V8) + VAESEM_VS(REG_V25, REG_V9) + VAESEM_VS(REG_V25, REG_V10) + VAESEM_VS(REG_V25, REG_V11) + VAESEM_VS(REG_V26, REG_V1) + VAESEM_VS(REG_V26, REG_V2) + VAESEM_VS(REG_V26, REG_V3) + VAESEM_VS(REG_V26, REG_V4) + VAESEM_VS(REG_V26, REG_V5) + VAESEM_VS(REG_V26, REG_V6) + VAESEM_VS(REG_V26, REG_V7) + VAESEM_VS(REG_V26, REG_V8) + VAESEM_VS(REG_V26, REG_V9) + VAESEM_VS(REG_V26, REG_V10) + VAESEM_VS(REG_V26, REG_V11) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEF_VS(REG_V24, REG_V12) + VAESEF_VS(REG_V25, REG_V12) + VAESEF_VS(REG_V26, REG_V12) + VAESEF_VS(REG_V27, REG_V12) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL4RE32_V(REG_V28, REG_T0) + VXOR_VV(REG_V28, REG_V24, REG_V28) + VXOR_VV(REG_V29, REG_V25, REG_V29) + VXOR_VV(REG_V30, REG_V26, REG_V30) + VXOR_VV(REG_V31, REG_V27, REG_V31) + /* Store output. */ + "mv t0, %[out]\n\t" + VS4R_V(REG_V28, REG_T0) + VGMUL_VV(REG_V28, REG_V23) + VGMUL_VV(REG_V29, REG_V22) + VGMUL_VV(REG_V30, REG_V21) + VGMUL_VV(REG_V31, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V28) + VXOR_VV(REG_V18, REG_V18, REG_V29) + VXOR_VV(REG_V18, REG_V18, REG_V30) + VXOR_VV(REG_V18, REG_V18, REG_V31) + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + /* Loop if more elements to process. */ + "addi t4, t4, -1\n\t" + "bnez t4, L_aes_gcm_192_encrypt_x4_block_loop\n\t" + "andi %[sz], %[sz], 0x3f\n\t" + + "L_aes_gcm_192_encrypt_x4_blocks_done:\n\t" + "srli t2, %[sz], 4\n\t" + "beqz t2, L_aes_gcm_192_encrypt_blocks_done\n\t" + + "L_aes_gcm_192_encrypt_block_loop:\n\t" +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEF_VS(REG_V27, REG_V12) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + VGHSH_VV(REG_V18, REG_V27, REG_V19) + /* Store output. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V27, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_192_encrypt_block_loop\n\t" + + "L_aes_gcm_192_encrypt_blocks_done:\n\t" + "andi t2, %[sz], 0xf\n\t" + "beqz t2, L_aes_gcm_192_encrypt_done\n\t" + + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_192_encrypt_load_byte:\n\t" + "lb t0, (%[in])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_encrypt_load_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + + /* Encrypt counter for partial block. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEF_VS(REG_V27, REG_V12) + + /* Load scratch. */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store scratch. */ + VS1R_V(REG_V27, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_192_encrypt_store_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[out])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_encrypt_store_byte\n\t" + "li t1, 16\n\t" + "sub t1, t1, t2\n\t" + "L_aes_gcm_192_encrypt_zero_byte:\n\t" + "sb x0, (%[scratch])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_encrypt_zero_byte\n\t" + "addi %[scratch], %[scratch], -16\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + "L_aes_gcm_192_encrypt_done:\n\t" + + /* Hash in the lengths of A and C in bits */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* aSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[aSz], %[aSz], 3\n\t" + "srli t0, %[aSz], 32\n\t" + "srli t1, %[aSz], 24\n\t" + "srli t2, %[aSz], 16\n\t" + "srli t3, %[aSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[scratch])\n\t" + "sb x0 , 2(%[scratch])\n\t" + "sb t0 , 3(%[scratch])\n\t" + "sb t1 , 4(%[scratch])\n\t" + "sb t2 , 5(%[scratch])\n\t" + "sb t3 , 6(%[scratch])\n\t" + "sb %[aSz], 7(%[scratch])\n\t" + /* sz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[sz], %[sz], 3\n\t" + "srli t0, %[sz], 32\n\t" + "srli t1, %[sz], 24\n\t" + "srli t2, %[sz], 16\n\t" + "srli t3, %[sz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 8(%[scratch])\n\t" + "sb x0 , 10(%[scratch])\n\t" + "sb t0 , 11(%[scratch])\n\t" + "sb t1 , 12(%[scratch])\n\t" + "sb t2 , 13(%[scratch])\n\t" + "sb t3 , 14(%[scratch])\n\t" + "sb %[sz], 15(%[scratch])\n\t" +#else + "slli t0, %[aSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[scratch])\n\t" + "slli t0, %[sz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 8(%[scratch])\n\t" +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + VAESZ_VS(REG_V16, REG_V0) + VAESEM_VS(REG_V16, REG_V1) + VAESEM_VS(REG_V16, REG_V2) + VAESEM_VS(REG_V16, REG_V3) + VAESEM_VS(REG_V16, REG_V4) + VAESEM_VS(REG_V16, REG_V5) + VAESEM_VS(REG_V16, REG_V6) + VAESEM_VS(REG_V16, REG_V7) + VAESEM_VS(REG_V16, REG_V8) + VAESEM_VS(REG_V16, REG_V9) + VAESEM_VS(REG_V16, REG_V10) + VAESEM_VS(REG_V16, REG_V11) + VAESEF_VS(REG_V16, REG_V12) + VXOR_VV(REG_V18, REG_V18, REG_V16) + + "li t1, 16\n\t" + "blt %[tagSz], t1, L_aes_gcm_192_encrypt_tag_small\n\t" + "mv t0, %[tag]\n\t" + VS1R_V(REG_V18, REG_T0) + "beqz x0, L_aes_gcm_192_encrypt_tag_done\n\t" + "L_aes_gcm_192_encrypt_tag_small:\n\t" + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V18, REG_T0) + "mv t1, %[tagSz]\n\t" + "L_aes_gcm_192_encrypt_store_tag_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[tag])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_encrypt_store_tag_byte\n\t" + "L_aes_gcm_192_encrypt_tag_done:\n\t" + + : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), + [aSz] "+r" (aadSz), [aad] "+r" (aad), [sz] "+r" (sz) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + , [rev_idx] "r" (rev_idx) +#endif + : "memory", "t0", "t1", "t2", "t3", "t4" + ); + +#ifdef OPENSSL_EXTRA + if ((tag != NULL) && (in != NULL) && (sz != 0)) { + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + } +#endif +} +#endif /* WOLFSSL_AES_192 */ + +#ifdef WOLFSSL_AES_256 +/* Encrypt data using AES-256-GCM. + * + * @param [in] aes AES object. + * @param [out] out Encrypted data. + * @param [in] in Data to encrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + */ +static void Aes256GcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + /* Noticed different optimization levels treated head of array different. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. + */ + byte* ctr = counter; + byte* key = (byte*)aes->key; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (nonceSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { +#ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; +#endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); +#ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; +#endif + } + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* X=0, get H */ + VXOR_VV(REG_V18, REG_V18, REG_V18) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V19, REG_T0) + + /* Hash in AAD, the Additional Authentication Data */ + "beqz %[aSz], L_aes_gcm_256_encrypt_ghash_aad_done\n\t" + "beqz %[aad], L_aes_gcm_256_encrypt_ghash_aad_done\n\t" + + "srli t1, %[aSz], 4\n\t" + "beqz t1, L_aes_gcm_256_encrypt_ghash_aad_blocks_done\n\t" + + "L_aes_gcm_256_encrypt_ghash_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_encrypt_ghash_aad_loop\n\t" + "L_aes_gcm_256_encrypt_ghash_aad_blocks_done:\n\t" + "andi t1, %[aSz], 0xf\n\t" + "beqz t1, L_aes_gcm_256_encrypt_ghash_aad_done\n\t" + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t2, t1\n\t" + "L_aes_gcm_256_encrypt_ghash_aad_load_byte:\n\t" + "lb t0, (%[aad])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_256_encrypt_ghash_aad_load_byte\n\t" + "sub %[scratch], %[scratch], t1\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "L_aes_gcm_256_encrypt_ghash_aad_done:\n\t" + /* Done Hash in AAD */ + +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "mv t0, %[rev_idx]\n\t" + VL1RE32_V(REG_V15, REG_T0) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + /* Load the counter. */ + "mv t0, %[ctr]\n\t" + VL1RE32_V(REG_V16, REG_T0) +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VSLIDEDOWN_VI(REG_V20, REG_V16, 3) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V21, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V20, REG_V21) +#else + VREV8(REG_V20, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "lw t3, 12(%[ctr])\n\t" + "slli t3, t3, 32\n\t" + REV8(REG_T3, REG_T3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load key[12..13]. */ + "addi t0, t0, 64\n\t" + VL2RE32_V(REG_V12, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V14, REG_T0) + + "beqz %[sz], L_aes_gcm_256_encrypt_blocks_done\n\t" + "srli t4, %[sz], 6\n\t" + "beqz t4, L_aes_gcm_256_encrypt_x4_blocks_done\n\t" + + /* Calculate H^[1-4] - GMULT partials */ + VMV_V_V(REG_V21, REG_V19) + VMV_V_V(REG_V22, REG_V19) + /* Multiply H * H => H^2 */ + VGMUL_VV(REG_V21, REG_V19) + VMV_V_V(REG_V23, REG_V21) + /* Multiply H * H => H^3 */ + VGMUL_VV(REG_V22, REG_V21) + /* Multiply H^2 * H^2 => H^4 */ + VGMUL_VV(REG_V23, REG_V21) + + "L_aes_gcm_256_encrypt_x4_block_loop:\n\t" + /* Calculate next 4 counters (+1-4) */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VMV_V_V(REG_V24, REG_V16) + VMV_V_V(REG_V25, REG_V16) + VMV_V_V(REG_V26, REG_V16) + VMV_V_V(REG_V27, REG_V16) + VADD_VI(REG_V28, REG_V20, 1) + VADD_VI(REG_V29, REG_V20, 2) + VADD_VI(REG_V30, REG_V20, 3) + VADD_VI(REG_V20, REG_V20, 4) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V28) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V28, REG_V17) +#else + VREV8(REG_V28, REG_V28) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V29) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V29, REG_V17) +#else + VREV8(REG_V29, REG_V29) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V30) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V30, REG_V17) +#else + VREV8(REG_V30, REG_V30) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V31, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V31, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "addi t0, t3, 1\n\t" + VMV_V_V(REG_V24, REG_V16) + "addi t1, t3, 2\n\t" + VMV_V_V(REG_V25, REG_V16) + "addi t2, t3, 3\n\t" + VMV_V_V(REG_V26, REG_V16) + "slli t0, t0, 32\n\t" + VMV_V_V(REG_V27, REG_V16) + "slli t1, t1, 32\n\t" + "slli t2, t2, 32\n\t" + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + REV8(REG_T2, REG_T2) + "addi t3, t3, 4\n\t" + VMV_V_X(REG_V28, REG_T0) + "slli t0, t3, 32\n\t" + VMV_V_X(REG_V29, REG_T1) + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V30, REG_T2) + VMV_V_X(REG_V31, REG_T0) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V24, REG_V28, 3) + VSLIDEUP_VI(REG_V25, REG_V29, 3) + VSLIDEUP_VI(REG_V26, REG_V30, 3) + VSLIDEUP_VI(REG_V27, REG_V31, 3) + + VAESZ_VS(REG_V24, REG_V0) + VAESZ_VS(REG_V25, REG_V0) + VAESZ_VS(REG_V26, REG_V0) + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V24, REG_V1) + VAESEM_VS(REG_V24, REG_V2) + VAESEM_VS(REG_V24, REG_V3) + VAESEM_VS(REG_V24, REG_V4) + VAESEM_VS(REG_V24, REG_V5) + VAESEM_VS(REG_V24, REG_V6) + VAESEM_VS(REG_V24, REG_V7) + VAESEM_VS(REG_V24, REG_V8) + VAESEM_VS(REG_V24, REG_V9) + VAESEM_VS(REG_V24, REG_V10) + VAESEM_VS(REG_V24, REG_V11) + VAESEM_VS(REG_V24, REG_V12) + VAESEM_VS(REG_V24, REG_V13) + VAESEM_VS(REG_V25, REG_V1) + VAESEM_VS(REG_V25, REG_V2) + VAESEM_VS(REG_V25, REG_V3) + VAESEM_VS(REG_V25, REG_V4) + VAESEM_VS(REG_V25, REG_V5) + VAESEM_VS(REG_V25, REG_V6) + VAESEM_VS(REG_V25, REG_V7) + VAESEM_VS(REG_V25, REG_V8) + VAESEM_VS(REG_V25, REG_V9) + VAESEM_VS(REG_V25, REG_V10) + VAESEM_VS(REG_V25, REG_V11) + VAESEM_VS(REG_V25, REG_V12) + VAESEM_VS(REG_V25, REG_V13) + VAESEM_VS(REG_V26, REG_V1) + VAESEM_VS(REG_V26, REG_V2) + VAESEM_VS(REG_V26, REG_V3) + VAESEM_VS(REG_V26, REG_V4) + VAESEM_VS(REG_V26, REG_V5) + VAESEM_VS(REG_V26, REG_V6) + VAESEM_VS(REG_V26, REG_V7) + VAESEM_VS(REG_V26, REG_V8) + VAESEM_VS(REG_V26, REG_V9) + VAESEM_VS(REG_V26, REG_V10) + VAESEM_VS(REG_V26, REG_V11) + VAESEM_VS(REG_V26, REG_V12) + VAESEM_VS(REG_V26, REG_V13) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEM_VS(REG_V27, REG_V12) + VAESEM_VS(REG_V27, REG_V13) + VAESEF_VS(REG_V24, REG_V14) + VAESEF_VS(REG_V25, REG_V14) + VAESEF_VS(REG_V26, REG_V14) + VAESEF_VS(REG_V27, REG_V14) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL4RE32_V(REG_V28, REG_T0) + VXOR_VV(REG_V28, REG_V24, REG_V28) + VXOR_VV(REG_V29, REG_V25, REG_V29) + VXOR_VV(REG_V30, REG_V26, REG_V30) + VXOR_VV(REG_V31, REG_V27, REG_V31) + /* Store output. */ + "mv t0, %[out]\n\t" + VS4R_V(REG_V28, REG_T0) + VGMUL_VV(REG_V28, REG_V23) + VGMUL_VV(REG_V29, REG_V22) + VGMUL_VV(REG_V30, REG_V21) + VGMUL_VV(REG_V31, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V28) + VXOR_VV(REG_V18, REG_V18, REG_V29) + VXOR_VV(REG_V18, REG_V18, REG_V30) + VXOR_VV(REG_V18, REG_V18, REG_V31) + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + /* Loop if more elements to process. */ + "addi t4, t4, -1\n\t" + "bnez t4, L_aes_gcm_256_encrypt_x4_block_loop\n\t" + "andi %[sz], %[sz], 0x3f\n\t" + + "L_aes_gcm_256_encrypt_x4_blocks_done:\n\t" + "srli t2, %[sz], 4\n\t" + "beqz t2, L_aes_gcm_256_encrypt_blocks_done\n\t" + + "L_aes_gcm_256_encrypt_block_loop:\n\t" +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEM_VS(REG_V27, REG_V12) + VAESEM_VS(REG_V27, REG_V13) + VAESEF_VS(REG_V27, REG_V14) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + VGHSH_VV(REG_V18, REG_V27, REG_V19) + /* Store output. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V27, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_256_encrypt_block_loop\n\t" + + "L_aes_gcm_256_encrypt_blocks_done:\n\t" + "andi t2, %[sz], 0xf\n\t" + "beqz t2, L_aes_gcm_256_encrypt_done\n\t" + + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_256_encrypt_load_byte:\n\t" + "lb t0, (%[in])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_encrypt_load_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + + /* Encrypt counter for partial block. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEM_VS(REG_V27, REG_V12) + VAESEM_VS(REG_V27, REG_V13) + VAESEF_VS(REG_V27, REG_V14) + + /* Load scratch. */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store scratch. */ + VS1R_V(REG_V27, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_256_encrypt_store_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[out])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_encrypt_store_byte\n\t" + "li t1, 16\n\t" + "sub t1, t1, t2\n\t" + "L_aes_gcm_256_encrypt_zero_byte:\n\t" + "sb x0, (%[scratch])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_encrypt_zero_byte\n\t" + "addi %[scratch], %[scratch], -16\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + "L_aes_gcm_256_encrypt_done:\n\t" + + /* Hash in the lengths of A and C in bits */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* aSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[aSz], %[aSz], 3\n\t" + "srli t0, %[aSz], 32\n\t" + "srli t1, %[aSz], 24\n\t" + "srli t2, %[aSz], 16\n\t" + "srli t3, %[aSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[scratch])\n\t" + "sb x0 , 2(%[scratch])\n\t" + "sb t0 , 3(%[scratch])\n\t" + "sb t1 , 4(%[scratch])\n\t" + "sb t2 , 5(%[scratch])\n\t" + "sb t3 , 6(%[scratch])\n\t" + "sb %[aSz], 7(%[scratch])\n\t" + /* sz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[sz], %[sz], 3\n\t" + "srli t0, %[sz], 32\n\t" + "srli t1, %[sz], 24\n\t" + "srli t2, %[sz], 16\n\t" + "srli t3, %[sz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 8(%[scratch])\n\t" + "sb x0 , 10(%[scratch])\n\t" + "sb t0 , 11(%[scratch])\n\t" + "sb t1 , 12(%[scratch])\n\t" + "sb t2 , 13(%[scratch])\n\t" + "sb t3 , 14(%[scratch])\n\t" + "sb %[sz], 15(%[scratch])\n\t" +#else + "slli t0, %[aSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[scratch])\n\t" + "slli t0, %[sz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 8(%[scratch])\n\t" +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + VAESZ_VS(REG_V16, REG_V0) + VAESEM_VS(REG_V16, REG_V1) + VAESEM_VS(REG_V16, REG_V2) + VAESEM_VS(REG_V16, REG_V3) + VAESEM_VS(REG_V16, REG_V4) + VAESEM_VS(REG_V16, REG_V5) + VAESEM_VS(REG_V16, REG_V6) + VAESEM_VS(REG_V16, REG_V7) + VAESEM_VS(REG_V16, REG_V8) + VAESEM_VS(REG_V16, REG_V9) + VAESEM_VS(REG_V16, REG_V10) + VAESEM_VS(REG_V16, REG_V11) + VAESEM_VS(REG_V16, REG_V12) + VAESEM_VS(REG_V16, REG_V13) + VAESEF_VS(REG_V16, REG_V14) + VXOR_VV(REG_V18, REG_V18, REG_V16) + + "li t1, 16\n\t" + "blt %[tagSz], t1, L_aes_gcm_256_encrypt_tag_small\n\t" + "mv t0, %[tag]\n\t" + VS1R_V(REG_V18, REG_T0) + "beqz x0, L_aes_gcm_256_encrypt_tag_done\n\t" + "L_aes_gcm_256_encrypt_tag_small:\n\t" + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V18, REG_T0) + "mv t1, %[tagSz]\n\t" + "L_aes_gcm_256_encrypt_store_tag_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[tag])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_encrypt_store_tag_byte\n\t" + "L_aes_gcm_256_encrypt_tag_done:\n\t" + + : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), + [aSz] "+r" (aadSz), [aad] "+r" (aad), [sz] "+r" (sz) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + , [rev_idx] "r" (rev_idx) +#endif + : "memory", "t0", "t1", "t2", "t3", "t4" + ); + +#ifdef OPENSSL_EXTRA + if ((tag != NULL) && (in != NULL) && (sz != 0)) { + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + } +#endif +} +#endif /* WOLFSSL_AES_256 */ + +/* Encrypt data using AES-GCM. + * + * @param [in] aes AES object. + * @param [out] out Encrypted data. + * @param [in] in Data to encrypt. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. + * @return BAD_FUNC_ARG when nonceSz is zero. + * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. + * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or + * greater than AES_BLOCK_SIZE. + * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. + */ +int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, const byte* aad, + word32 aadSz) +{ + int ret = 0; + + /* sanity checks */ + if ((aes == NULL) || (nonce == NULL) || (nonceSz == 0) || (tag == NULL) || + ((aad == NULL) && (aadSz > 0)) || ((sz != 0) && ((in == NULL) || + (out == NULL)))) { + WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); + ret = BAD_FUNC_ARG; + } + + if ((ret == 0) && ((tagSz < WOLFSSL_MIN_AUTH_TAG_SZ) || + (tagSz > AES_BLOCK_SIZE))) { + WOLFSSL_MSG("GcmEncrypt tagSz error"); + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + switch (aes->rounds) { + #ifdef WOLFSSL_AES_128 + case 10: + Aes128GcmEncrypt(aes, out, in, sz, nonce, nonceSz, tag, tagSz, + aad, aadSz); + break; + #endif + #ifdef WOLFSSL_AES_192 + case 12: + Aes192GcmEncrypt(aes, out, in, sz, nonce, nonceSz, tag, tagSz, + aad, aadSz); + break; + #endif + #ifdef WOLFSSL_AES_256 + case 14: + Aes256GcmEncrypt(aes, out, in, sz, nonce, nonceSz, tag, tagSz, + aad, aadSz); + break; + #endif + default: + WOLFSSL_MSG("AES-GCM invalid round number"); + ret = BAD_FUNC_ARG; + } + } + + return ret; +} + + +#ifdef HAVE_AES_DECRYPT + +#ifdef WOLFSSL_AES_128 +/* Decrypt data using AES-128-GCM. + * + * @param [in] aes AES object. + * @param [out] out Decrypted data. + * @param [in] in Data to decrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + * @return 0 on success. + * @return AES_GCM_AUTH_E when authentication tag computed doesn't match + * tag passed in. + */ +static int Aes128GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + int ret = 0; + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + /* Noticed different optimization levels treated head of array different. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. + */ + byte* ctr = counter; + byte* key = (byte*)aes->key; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (nonceSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { +#ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; +#endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); +#ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; +#endif + } + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* X=0, get H */ + VXOR_VV(REG_V18, REG_V18, REG_V18) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V19, REG_T0) + + /* Hash in AAD, the Additional Authentication Data */ + "beqz %[aSz], L_aes_gcm_128_decrypt_ghash_aad_done\n\t" + "beqz %[aad], L_aes_gcm_128_decrypt_ghash_aad_done\n\t" + + "srli t1, %[aSz], 4\n\t" + "beqz t1, L_aes_gcm_128_decrypt_ghash_aad_blocks_done\n\t" + + "L_aes_gcm_128_decrypt_ghash_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_decrypt_ghash_aad_loop\n\t" + "L_aes_gcm_128_decrypt_ghash_aad_blocks_done:\n\t" + "andi t1, %[aSz], 0xf\n\t" + "beqz t1, L_aes_gcm_128_decrypt_ghash_aad_done\n\t" + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t2, t1\n\t" + "L_aes_gcm_128_decrypt_ghash_aad_load_byte:\n\t" + "lb t0, (%[aad])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_128_decrypt_ghash_aad_load_byte\n\t" + "sub %[scratch], %[scratch], t1\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "L_aes_gcm_128_decrypt_ghash_aad_done:\n\t" + /* Done Hash in AAD */ + +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "mv t0, %[rev_idx]\n\t" + VL1RE32_V(REG_V15, REG_T0) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + /* Load the counter. */ + "mv t0, %[ctr]\n\t" + VL1RE32_V(REG_V16, REG_T0) +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VSLIDEDOWN_VI(REG_V20, REG_V16, 3) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V21, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V20, REG_V21) +#else + VREV8(REG_V20, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "lw t3, 12(%[ctr])\n\t" + "slli t3, t3, 32\n\t" + REV8(REG_T3, REG_T3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..9]. */ + "addi t0, t0, 128\n\t" + VL2RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V10, REG_T0) + + "beqz %[sz], L_aes_gcm_128_decrypt_blocks_done\n\t" + "srli t4, %[sz], 6\n\t" + "beqz t4, L_aes_gcm_128_decrypt_x4_blocks_done\n\t" + + /* Calculate H^[1-4] - GMULT partials */ + VMV_V_V(REG_V21, REG_V19) + VMV_V_V(REG_V22, REG_V19) + /* Multiply H * H => H^2 */ + VGMUL_VV(REG_V21, REG_V19) + VMV_V_V(REG_V23, REG_V21) + /* Multiply H * H => H^3 */ + VGMUL_VV(REG_V22, REG_V21) + /* Multiply H^2 * H^2 => H^4 */ + VGMUL_VV(REG_V23, REG_V21) + + "L_aes_gcm_128_decrypt_x4_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL4RE32_V(REG_V28, REG_T0) + VMVR_V(REG_V24, REG_V28, 4) + VGMUL_VV(REG_V24, REG_V23) + VGMUL_VV(REG_V25, REG_V22) + VGMUL_VV(REG_V26, REG_V21) + VGMUL_VV(REG_V27, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V24) + VXOR_VV(REG_V18, REG_V18, REG_V25) + VXOR_VV(REG_V18, REG_V18, REG_V26) + VXOR_VV(REG_V18, REG_V18, REG_V27) + /* Calculate next 4 counters (+1-4) */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V24, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V24, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V25, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V25, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V26, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V26, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V27, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t0, t3, 1\n\t" + VMV_V_V(REG_V24, REG_V16) + "addi t1, t3, 2\n\t" + VMV_V_V(REG_V25, REG_V16) + "slli t0, t0, 32\n\t" + VMV_V_V(REG_V26, REG_V16) + "slli t1, t1, 32\n\t" + VMV_V_V(REG_V27, REG_V16) + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + VMV_V_X(REG_V20, REG_T0) + "addi t0, t3, 3\n\t" + VSLIDEUP_VI(REG_V24, REG_V20, 3) + "addi t3, t3, 4\n\t" + VMV_V_X(REG_V20, REG_T1) + "slli t0, t0, 32\n\t" + VSLIDEUP_VI(REG_V25, REG_V20, 3) + "slli t1, t3, 32\n\t" + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + VMV_V_X(REG_V20, REG_T0) + VSLIDEUP_VI(REG_V26, REG_V20, 3) + VMV_V_X(REG_V20, REG_T1) + VSLIDEUP_VI(REG_V27, REG_V20, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V24, REG_V0) + VAESZ_VS(REG_V25, REG_V0) + VAESZ_VS(REG_V26, REG_V0) + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V24, REG_V1) + VAESEM_VS(REG_V24, REG_V2) + VAESEM_VS(REG_V24, REG_V3) + VAESEM_VS(REG_V24, REG_V4) + VAESEM_VS(REG_V24, REG_V5) + VAESEM_VS(REG_V24, REG_V6) + VAESEM_VS(REG_V24, REG_V7) + VAESEM_VS(REG_V24, REG_V8) + VAESEM_VS(REG_V24, REG_V9) + VAESEM_VS(REG_V25, REG_V1) + VAESEM_VS(REG_V25, REG_V2) + VAESEM_VS(REG_V25, REG_V3) + VAESEM_VS(REG_V25, REG_V4) + VAESEM_VS(REG_V25, REG_V5) + VAESEM_VS(REG_V25, REG_V6) + VAESEM_VS(REG_V25, REG_V7) + VAESEM_VS(REG_V25, REG_V8) + VAESEM_VS(REG_V25, REG_V9) + VAESEM_VS(REG_V26, REG_V1) + VAESEM_VS(REG_V26, REG_V2) + VAESEM_VS(REG_V26, REG_V3) + VAESEM_VS(REG_V26, REG_V4) + VAESEM_VS(REG_V26, REG_V5) + VAESEM_VS(REG_V26, REG_V6) + VAESEM_VS(REG_V26, REG_V7) + VAESEM_VS(REG_V26, REG_V8) + VAESEM_VS(REG_V26, REG_V9) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEF_VS(REG_V24, REG_V10) + VAESEF_VS(REG_V25, REG_V10) + VAESEF_VS(REG_V26, REG_V10) + VAESEF_VS(REG_V27, REG_V10) + VXOR_VV(REG_V28, REG_V24, REG_V28) + VXOR_VV(REG_V29, REG_V25, REG_V29) + VXOR_VV(REG_V30, REG_V26, REG_V30) + VXOR_VV(REG_V31, REG_V27, REG_V31) + /* Store output. */ + "mv t0, %[out]\n\t" + VS4R_V(REG_V28, REG_T0) + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + /* Loop if more elements to process. */ + "addi t4, t4, -1\n\t" + "bnez t4, L_aes_gcm_128_decrypt_x4_block_loop\n\t" + "andi %[sz], %[sz], 0x3f\n\t" + + "L_aes_gcm_128_decrypt_x4_blocks_done:\n\t" + "srli t2, %[sz], 4\n\t" + "beqz t2, L_aes_gcm_128_decrypt_blocks_done\n\t" + + "L_aes_gcm_128_decrypt_block_loop:\n\t" +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEF_VS(REG_V27, REG_V10) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store output. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V27, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_128_decrypt_block_loop\n\t" + + "L_aes_gcm_128_decrypt_blocks_done:\n\t" + "andi t2, %[sz], 0xf\n\t" + "beqz t2, L_aes_gcm_128_decrypt_done\n\t" + + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_128_decrypt_load_byte:\n\t" + "lb t0, (%[in])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_decrypt_load_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + /* Encrypt counter for partial block. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEF_VS(REG_V27, REG_V10) + + /* Load scratch. */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store scratch. */ + VS1R_V(REG_V27, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_128_decrypt_store_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[out])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_decrypt_store_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + + "L_aes_gcm_128_decrypt_done:\n\t" + + /* Hash in the lengths of A and C in bits */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* aSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[aSz], %[aSz], 3\n\t" + "srli t0, %[aSz], 32\n\t" + "srli t1, %[aSz], 24\n\t" + "srli t2, %[aSz], 16\n\t" + "srli t3, %[aSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[scratch])\n\t" + "sb x0 , 2(%[scratch])\n\t" + "sb t0 , 3(%[scratch])\n\t" + "sb t1 , 4(%[scratch])\n\t" + "sb t2 , 5(%[scratch])\n\t" + "sb t3 , 6(%[scratch])\n\t" + "sb %[aSz], 7(%[scratch])\n\t" + /* sz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[sz], %[sz], 3\n\t" + "srli t0, %[sz], 32\n\t" + "srli t1, %[sz], 24\n\t" + "srli t2, %[sz], 16\n\t" + "srli t3, %[sz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 8(%[scratch])\n\t" + "sb x0 , 10(%[scratch])\n\t" + "sb t0 , 11(%[scratch])\n\t" + "sb t1 , 12(%[scratch])\n\t" + "sb t2 , 13(%[scratch])\n\t" + "sb t3 , 14(%[scratch])\n\t" + "sb %[sz], 15(%[scratch])\n\t" +#else + "slli t0, %[aSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[scratch])\n\t" + "slli t0, %[sz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 8(%[scratch])\n\t" +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + VAESZ_VS(REG_V16, REG_V0) + VAESEM_VS(REG_V16, REG_V1) + VAESEM_VS(REG_V16, REG_V2) + VAESEM_VS(REG_V16, REG_V3) + VAESEM_VS(REG_V16, REG_V4) + VAESEM_VS(REG_V16, REG_V5) + VAESEM_VS(REG_V16, REG_V6) + VAESEM_VS(REG_V16, REG_V7) + VAESEM_VS(REG_V16, REG_V8) + VAESEM_VS(REG_V16, REG_V9) + VAESEF_VS(REG_V16, REG_V10) + VXOR_VV(REG_V18, REG_V18, REG_V16) + + "li t1, 16\n\t" + "blt %[tagSz], t1, L_aes_gcm_128_decrypt_tag_small\n\t" + "mv t0, %[tag]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V19, REG_V19, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V17) + VMSNE_VV(REG_V19, REG_V19, REG_V18) + VCPOP_M(REG_T0, REG_V19) + "beqz x0, L_aes_gcm_128_decrypt_tag_done\n\t" + "L_aes_gcm_128_decrypt_tag_small:\n\t" + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V18, REG_T0) + "mv t1, %[tagSz]\n\t" + "xor t0, t0, t0\n\t" + "L_aes_gcm_128_decrypt_store_tag_byte:\n\t" + "lb t2, (%[scratch])\n\t" + "lb t3, (%[tag])\n\t" + "xor t0, t0, t2\n\t" + "xor t0, t0, t3\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_128_decrypt_store_tag_byte\n\t" + "L_aes_gcm_128_decrypt_tag_done:\n\t" + "negw t0, t0\n\t" + "sraiw t0, t0, 31\n\t" + "andi %[ret], t0, -180\n\t" + + : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), + [aSz] "+r" (aadSz), [aad] "+r" (aad), [ret] "+r" (ret), + [sz] "+r" (sz) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + , [rev_idx] "r" (rev_idx) +#endif + : "memory", "t0", "t1", "t2", "t3", "t4" + ); + +#ifdef OPENSSL_EXTRA + if ((tag != NULL) && (in != NULL) && (sz != 0)) { + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + } +#endif + + return ret; +} +#endif /* WOLFSSL_AES_128 */ + +#ifdef WOLFSSL_AES_192 +/* Decrypt data using AES-192-GCM. + * + * @param [in] aes AES object. + * @param [out] out Decrypted data. + * @param [in] in Data to decrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + * @return 0 on success. + * @return AES_GCM_AUTH_E when authentication tag computed doesn't match + * tag passed in. + */ +static int Aes192GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + int ret = 0; + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + /* Noticed different optimization levels treated head of array different. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. + */ + byte* ctr = counter; + byte* key = (byte*)aes->key; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (nonceSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { +#ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; +#endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); +#ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; +#endif + } + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* X=0, get H */ + VXOR_VV(REG_V18, REG_V18, REG_V18) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V19, REG_T0) + + /* Hash in AAD, the Additional Authentication Data */ + "beqz %[aSz], L_aes_gcm_192_decrypt_ghash_aad_done\n\t" + "beqz %[aad], L_aes_gcm_192_decrypt_ghash_aad_done\n\t" + + "srli t1, %[aSz], 4\n\t" + "beqz t1, L_aes_gcm_192_decrypt_ghash_aad_blocks_done\n\t" + + "L_aes_gcm_192_decrypt_ghash_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_decrypt_ghash_aad_loop\n\t" + "L_aes_gcm_192_decrypt_ghash_aad_blocks_done:\n\t" + "andi t1, %[aSz], 0xf\n\t" + "beqz t1, L_aes_gcm_192_decrypt_ghash_aad_done\n\t" + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t2, t1\n\t" + "L_aes_gcm_192_decrypt_ghash_aad_load_byte:\n\t" + "lb t0, (%[aad])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_192_decrypt_ghash_aad_load_byte\n\t" + "sub %[scratch], %[scratch], t1\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "L_aes_gcm_192_decrypt_ghash_aad_done:\n\t" + /* Done Hash in AAD */ + +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "mv t0, %[rev_idx]\n\t" + VL1RE32_V(REG_V15, REG_T0) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + /* Load the counter. */ + "mv t0, %[ctr]\n\t" + VL1RE32_V(REG_V16, REG_T0) +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VSLIDEDOWN_VI(REG_V20, REG_V16, 3) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V21, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V20, REG_V21) +#else + VREV8(REG_V20, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "lw t3, 12(%[ctr])\n\t" + "slli t3, t3, 32\n\t" + REV8(REG_T3, REG_T3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V12, REG_T0) + + "beqz %[sz], L_aes_gcm_192_decrypt_blocks_done\n\t" + "srli t4, %[sz], 6\n\t" + "beqz t4, L_aes_gcm_192_decrypt_x4_blocks_done\n\t" + + /* Calculate H^[1-4] - GMULT partials */ + VMV_V_V(REG_V21, REG_V19) + VMV_V_V(REG_V22, REG_V19) + /* Multiply H * H => H^2 */ + VGMUL_VV(REG_V21, REG_V19) + VMV_V_V(REG_V23, REG_V21) + /* Multiply H * H => H^3 */ + VGMUL_VV(REG_V22, REG_V21) + /* Multiply H^2 * H^2 => H^4 */ + VGMUL_VV(REG_V23, REG_V21) + + "L_aes_gcm_192_decrypt_x4_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL4RE32_V(REG_V28, REG_T0) + VMVR_V(REG_V24, REG_V28, 4) + VGMUL_VV(REG_V24, REG_V23) + VGMUL_VV(REG_V25, REG_V22) + VGMUL_VV(REG_V26, REG_V21) + VGMUL_VV(REG_V27, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V24) + VXOR_VV(REG_V18, REG_V18, REG_V25) + VXOR_VV(REG_V18, REG_V18, REG_V26) + VXOR_VV(REG_V18, REG_V18, REG_V27) + /* Calculate next 4 counters (+1-4) */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V24, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V24, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V25, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V25, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V26, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V26, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V27, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t0, t3, 1\n\t" + VMV_V_V(REG_V24, REG_V16) + "addi t1, t3, 2\n\t" + VMV_V_V(REG_V25, REG_V16) + "slli t0, t0, 32\n\t" + VMV_V_V(REG_V26, REG_V16) + "slli t1, t1, 32\n\t" + VMV_V_V(REG_V27, REG_V16) + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + VMV_V_X(REG_V20, REG_T0) + "addi t0, t3, 3\n\t" + VSLIDEUP_VI(REG_V24, REG_V20, 3) + "addi t3, t3, 4\n\t" + VMV_V_X(REG_V20, REG_T1) + "slli t0, t0, 32\n\t" + VSLIDEUP_VI(REG_V25, REG_V20, 3) + "slli t1, t3, 32\n\t" + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + VMV_V_X(REG_V20, REG_T0) + VSLIDEUP_VI(REG_V26, REG_V20, 3) + VMV_V_X(REG_V20, REG_T1) + VSLIDEUP_VI(REG_V27, REG_V20, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V24, REG_V0) + VAESZ_VS(REG_V25, REG_V0) + VAESZ_VS(REG_V26, REG_V0) + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V24, REG_V1) + VAESEM_VS(REG_V24, REG_V2) + VAESEM_VS(REG_V24, REG_V3) + VAESEM_VS(REG_V24, REG_V4) + VAESEM_VS(REG_V24, REG_V5) + VAESEM_VS(REG_V24, REG_V6) + VAESEM_VS(REG_V24, REG_V7) + VAESEM_VS(REG_V24, REG_V8) + VAESEM_VS(REG_V24, REG_V9) + VAESEM_VS(REG_V24, REG_V10) + VAESEM_VS(REG_V24, REG_V11) + VAESEM_VS(REG_V25, REG_V1) + VAESEM_VS(REG_V25, REG_V2) + VAESEM_VS(REG_V25, REG_V3) + VAESEM_VS(REG_V25, REG_V4) + VAESEM_VS(REG_V25, REG_V5) + VAESEM_VS(REG_V25, REG_V6) + VAESEM_VS(REG_V25, REG_V7) + VAESEM_VS(REG_V25, REG_V8) + VAESEM_VS(REG_V25, REG_V9) + VAESEM_VS(REG_V25, REG_V10) + VAESEM_VS(REG_V25, REG_V11) + VAESEM_VS(REG_V26, REG_V1) + VAESEM_VS(REG_V26, REG_V2) + VAESEM_VS(REG_V26, REG_V3) + VAESEM_VS(REG_V26, REG_V4) + VAESEM_VS(REG_V26, REG_V5) + VAESEM_VS(REG_V26, REG_V6) + VAESEM_VS(REG_V26, REG_V7) + VAESEM_VS(REG_V26, REG_V8) + VAESEM_VS(REG_V26, REG_V9) + VAESEM_VS(REG_V26, REG_V10) + VAESEM_VS(REG_V26, REG_V11) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEF_VS(REG_V24, REG_V12) + VAESEF_VS(REG_V25, REG_V12) + VAESEF_VS(REG_V26, REG_V12) + VAESEF_VS(REG_V27, REG_V12) + VXOR_VV(REG_V28, REG_V24, REG_V28) + VXOR_VV(REG_V29, REG_V25, REG_V29) + VXOR_VV(REG_V30, REG_V26, REG_V30) + VXOR_VV(REG_V31, REG_V27, REG_V31) + /* Store output. */ + "mv t0, %[out]\n\t" + VS4R_V(REG_V28, REG_T0) + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + /* Loop if more elements to process. */ + "addi t4, t4, -1\n\t" + "bnez t4, L_aes_gcm_192_decrypt_x4_block_loop\n\t" + "andi %[sz], %[sz], 0x3f\n\t" + + "L_aes_gcm_192_decrypt_x4_blocks_done:\n\t" + "srli t2, %[sz], 4\n\t" + "beqz t2, L_aes_gcm_192_decrypt_blocks_done\n\t" + + "L_aes_gcm_192_decrypt_block_loop:\n\t" +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEF_VS(REG_V27, REG_V12) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store output. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V27, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_192_decrypt_block_loop\n\t" + + "L_aes_gcm_192_decrypt_blocks_done:\n\t" + "andi t2, %[sz], 0xf\n\t" + "beqz t2, L_aes_gcm_192_decrypt_done\n\t" + + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_192_decrypt_load_byte:\n\t" + "lb t0, (%[in])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_decrypt_load_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + /* Encrypt counter for partial block. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEF_VS(REG_V27, REG_V12) + + /* Load scratch. */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store scratch. */ + VS1R_V(REG_V27, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_192_decrypt_store_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[out])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_decrypt_store_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + + "L_aes_gcm_192_decrypt_done:\n\t" + + /* Hash in the lengths of A and C in bits */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* aSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[aSz], %[aSz], 3\n\t" + "srli t0, %[aSz], 32\n\t" + "srli t1, %[aSz], 24\n\t" + "srli t2, %[aSz], 16\n\t" + "srli t3, %[aSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[scratch])\n\t" + "sb x0 , 2(%[scratch])\n\t" + "sb t0 , 3(%[scratch])\n\t" + "sb t1 , 4(%[scratch])\n\t" + "sb t2 , 5(%[scratch])\n\t" + "sb t3 , 6(%[scratch])\n\t" + "sb %[aSz], 7(%[scratch])\n\t" + /* sz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[sz], %[sz], 3\n\t" + "srli t0, %[sz], 32\n\t" + "srli t1, %[sz], 24\n\t" + "srli t2, %[sz], 16\n\t" + "srli t3, %[sz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 8(%[scratch])\n\t" + "sb x0 , 10(%[scratch])\n\t" + "sb t0 , 11(%[scratch])\n\t" + "sb t1 , 12(%[scratch])\n\t" + "sb t2 , 13(%[scratch])\n\t" + "sb t3 , 14(%[scratch])\n\t" + "sb %[sz], 15(%[scratch])\n\t" +#else + "slli t0, %[aSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[scratch])\n\t" + "slli t0, %[sz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 8(%[scratch])\n\t" +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + VAESZ_VS(REG_V16, REG_V0) + VAESEM_VS(REG_V16, REG_V1) + VAESEM_VS(REG_V16, REG_V2) + VAESEM_VS(REG_V16, REG_V3) + VAESEM_VS(REG_V16, REG_V4) + VAESEM_VS(REG_V16, REG_V5) + VAESEM_VS(REG_V16, REG_V6) + VAESEM_VS(REG_V16, REG_V7) + VAESEM_VS(REG_V16, REG_V8) + VAESEM_VS(REG_V16, REG_V9) + VAESEM_VS(REG_V16, REG_V10) + VAESEM_VS(REG_V16, REG_V11) + VAESEF_VS(REG_V16, REG_V12) + VXOR_VV(REG_V18, REG_V18, REG_V16) + + "li t1, 16\n\t" + "blt %[tagSz], t1, L_aes_gcm_192_decrypt_tag_small\n\t" + "mv t0, %[tag]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V19, REG_V19, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V17) + VMSNE_VV(REG_V19, REG_V19, REG_V18) + VCPOP_M(REG_T0, REG_V19) + "beqz x0, L_aes_gcm_192_decrypt_tag_done\n\t" + "L_aes_gcm_192_decrypt_tag_small:\n\t" + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V18, REG_T0) + "mv t1, %[tagSz]\n\t" + "xor t0, t0, t0\n\t" + "L_aes_gcm_192_decrypt_store_tag_byte:\n\t" + "lb t2, (%[scratch])\n\t" + "lb t3, (%[tag])\n\t" + "xor t0, t0, t2\n\t" + "xor t0, t0, t3\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_192_decrypt_store_tag_byte\n\t" + "L_aes_gcm_192_decrypt_tag_done:\n\t" + "negw t0, t0\n\t" + "sraiw t0, t0, 31\n\t" + "andi %[ret], t0, -180\n\t" + + : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), + [aSz] "+r" (aadSz), [aad] "+r" (aad), [ret] "+r" (ret), + [sz] "+r" (sz) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + , [rev_idx] "r" (rev_idx) +#endif + : "memory", "t0", "t1", "t2", "t3", "t4" + ); + +#ifdef OPENSSL_EXTRA + if ((tag != NULL) && (in != NULL) && (sz != 0)) { + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + } +#endif + + return ret; +} +#endif /* WOLFSSL_AES_192 */ + +#ifdef WOLFSSL_AES_256 +/* Decrypt data using AES-256-GCM. + * + * @param [in] aes AES object. + * @param [out] out Decrypted data. + * @param [in] in Data to decrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + * @return 0 on success. + * @return AES_GCM_AUTH_E when authentication tag computed doesn't match + * tag passed in. + */ +static int Aes256GcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + int ret = 0; + byte counter[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + /* Noticed different optimization levels treated head of array different. + * Some cases was stack pointer plus offset others was a register containing + * address. To make uniform for passing in to inline assembly code am using + * pointers to the head of each local array. + */ + byte* ctr = counter; + byte* key = (byte*)aes->key; + + XMEMSET(counter, 0, AES_BLOCK_SIZE); + if (nonceSz == GCM_NONCE_MID_SZ) { + XMEMCPY(counter, nonce, GCM_NONCE_MID_SZ); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { +#ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; +#endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); +#ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; +#endif + } + + __asm__ __volatile__ ( + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + + /* X=0, get H */ + VXOR_VV(REG_V18, REG_V18, REG_V18) + "mv t0, %[h]\n\t" + VL1RE32_V(REG_V19, REG_T0) + + /* Hash in AAD, the Additional Authentication Data */ + "beqz %[aSz], L_aes_gcm_256_decrypt_ghash_aad_done\n\t" + "beqz %[aad], L_aes_gcm_256_decrypt_ghash_aad_done\n\t" + + "srli t1, %[aSz], 4\n\t" + "beqz t1, L_aes_gcm_256_decrypt_ghash_aad_blocks_done\n\t" + + "L_aes_gcm_256_decrypt_ghash_aad_loop:\n\t" + "mv t0, %[aad]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "addi %[aad], %[aad], 16\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_decrypt_ghash_aad_loop\n\t" + "L_aes_gcm_256_decrypt_ghash_aad_blocks_done:\n\t" + "andi t1, %[aSz], 0xf\n\t" + "beqz t1, L_aes_gcm_256_decrypt_ghash_aad_done\n\t" + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t2, t1\n\t" + "L_aes_gcm_256_decrypt_ghash_aad_load_byte:\n\t" + "lb t0, (%[aad])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[aad], %[aad], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_256_decrypt_ghash_aad_load_byte\n\t" + "sub %[scratch], %[scratch], t1\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + "L_aes_gcm_256_decrypt_ghash_aad_done:\n\t" + /* Done Hash in AAD */ + +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + "mv t0, %[rev_idx]\n\t" + VL1RE32_V(REG_V15, REG_T0) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + /* Load the counter. */ + "mv t0, %[ctr]\n\t" + VL1RE32_V(REG_V16, REG_T0) +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VSLIDEDOWN_VI(REG_V20, REG_V16, 3) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V21, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) + VMV_V_V(REG_V20, REG_V21) +#else + VREV8(REG_V20, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ +#else + "lw t3, 12(%[ctr])\n\t" + "slli t3, t3, 32\n\t" + REV8(REG_T3, REG_T3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + /* Load key[0..7]. */ + "mv t0, %[key]\n\t" + VL8RE32_V(REG_V0, REG_T0) + /* Load key[8..11]. */ + "addi t0, t0, 128\n\t" + VL4RE32_V(REG_V8, REG_T0) + /* Load key[12..13]. */ + "addi t0, t0, 64\n\t" + VL2RE32_V(REG_V12, REG_T0) + /* Load last round's key */ + "addi t0, %[key], 224\n\t" + VL1RE32_V(REG_V14, REG_T0) + + "beqz %[sz], L_aes_gcm_256_decrypt_blocks_done\n\t" + "srli t4, %[sz], 6\n\t" + "beqz t4, L_aes_gcm_256_decrypt_x4_blocks_done\n\t" + + /* Calculate H^[1-4] - GMULT partials */ + VMV_V_V(REG_V21, REG_V19) + VMV_V_V(REG_V22, REG_V19) + /* Multiply H * H => H^2 */ + VGMUL_VV(REG_V21, REG_V19) + VMV_V_V(REG_V23, REG_V21) + /* Multiply H * H => H^3 */ + VGMUL_VV(REG_V22, REG_V21) + /* Multiply H^2 * H^2 => H^4 */ + VGMUL_VV(REG_V23, REG_V21) + + "L_aes_gcm_256_decrypt_x4_block_loop:\n\t" + /* Load input. */ + "mv t0, %[in]\n\t" + VL4RE32_V(REG_V28, REG_T0) + VMVR_V(REG_V24, REG_V28, 4) + VGMUL_VV(REG_V24, REG_V23) + VGMUL_VV(REG_V25, REG_V22) + VGMUL_VV(REG_V26, REG_V21) + VGMUL_VV(REG_V27, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V24) + VXOR_VV(REG_V18, REG_V18, REG_V25) + VXOR_VV(REG_V18, REG_V18, REG_V26) + VXOR_VV(REG_V18, REG_V18, REG_V27) + /* Calculate next 4 counters (+1-4) */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V24, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V24, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V25, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V25, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V26, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V26, REG_V17, 3) + VADD_VI(REG_V20, REG_V20, 1) + VMV_V_V(REG_V27, REG_V16) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t0, t3, 1\n\t" + VMV_V_V(REG_V24, REG_V16) + "addi t1, t3, 2\n\t" + VMV_V_V(REG_V25, REG_V16) + "slli t0, t0, 32\n\t" + VMV_V_V(REG_V26, REG_V16) + "slli t1, t1, 32\n\t" + VMV_V_V(REG_V27, REG_V16) + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + VMV_V_X(REG_V20, REG_T0) + "addi t0, t3, 3\n\t" + VSLIDEUP_VI(REG_V24, REG_V20, 3) + "addi t3, t3, 4\n\t" + VMV_V_X(REG_V20, REG_T1) + "slli t0, t0, 32\n\t" + VSLIDEUP_VI(REG_V25, REG_V20, 3) + "slli t1, t3, 32\n\t" + REV8(REG_T0, REG_T0) + REV8(REG_T1, REG_T1) + VMV_V_X(REG_V20, REG_T0) + VSLIDEUP_VI(REG_V26, REG_V20, 3) + VMV_V_X(REG_V20, REG_T1) + VSLIDEUP_VI(REG_V27, REG_V20, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V24, REG_V0) + VAESZ_VS(REG_V25, REG_V0) + VAESZ_VS(REG_V26, REG_V0) + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V24, REG_V1) + VAESEM_VS(REG_V24, REG_V2) + VAESEM_VS(REG_V24, REG_V3) + VAESEM_VS(REG_V24, REG_V4) + VAESEM_VS(REG_V24, REG_V5) + VAESEM_VS(REG_V24, REG_V6) + VAESEM_VS(REG_V24, REG_V7) + VAESEM_VS(REG_V24, REG_V8) + VAESEM_VS(REG_V24, REG_V9) + VAESEM_VS(REG_V24, REG_V10) + VAESEM_VS(REG_V24, REG_V11) + VAESEM_VS(REG_V24, REG_V12) + VAESEM_VS(REG_V24, REG_V13) + VAESEM_VS(REG_V25, REG_V1) + VAESEM_VS(REG_V25, REG_V2) + VAESEM_VS(REG_V25, REG_V3) + VAESEM_VS(REG_V25, REG_V4) + VAESEM_VS(REG_V25, REG_V5) + VAESEM_VS(REG_V25, REG_V6) + VAESEM_VS(REG_V25, REG_V7) + VAESEM_VS(REG_V25, REG_V8) + VAESEM_VS(REG_V25, REG_V9) + VAESEM_VS(REG_V25, REG_V10) + VAESEM_VS(REG_V25, REG_V11) + VAESEM_VS(REG_V25, REG_V12) + VAESEM_VS(REG_V25, REG_V13) + VAESEM_VS(REG_V26, REG_V1) + VAESEM_VS(REG_V26, REG_V2) + VAESEM_VS(REG_V26, REG_V3) + VAESEM_VS(REG_V26, REG_V4) + VAESEM_VS(REG_V26, REG_V5) + VAESEM_VS(REG_V26, REG_V6) + VAESEM_VS(REG_V26, REG_V7) + VAESEM_VS(REG_V26, REG_V8) + VAESEM_VS(REG_V26, REG_V9) + VAESEM_VS(REG_V26, REG_V10) + VAESEM_VS(REG_V26, REG_V11) + VAESEM_VS(REG_V26, REG_V12) + VAESEM_VS(REG_V26, REG_V13) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEM_VS(REG_V27, REG_V12) + VAESEM_VS(REG_V27, REG_V13) + VAESEF_VS(REG_V24, REG_V14) + VAESEF_VS(REG_V25, REG_V14) + VAESEF_VS(REG_V26, REG_V14) + VAESEF_VS(REG_V27, REG_V14) + VXOR_VV(REG_V28, REG_V24, REG_V28) + VXOR_VV(REG_V29, REG_V25, REG_V29) + VXOR_VV(REG_V30, REG_V26, REG_V30) + VXOR_VV(REG_V31, REG_V27, REG_V31) + /* Store output. */ + "mv t0, %[out]\n\t" + VS4R_V(REG_V28, REG_T0) + "addi %[in], %[in], 64\n\t" + "addi %[out], %[out], 64\n\t" + /* Loop if more elements to process. */ + "addi t4, t4, -1\n\t" + "bnez t4, L_aes_gcm_256_decrypt_x4_block_loop\n\t" + "andi %[sz], %[sz], 0x3f\n\t" + + "L_aes_gcm_256_decrypt_x4_blocks_done:\n\t" + "srli t2, %[sz], 4\n\t" + "beqz t2, L_aes_gcm_256_decrypt_blocks_done\n\t" + + "L_aes_gcm_256_decrypt_block_loop:\n\t" +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEM_VS(REG_V27, REG_V12) + VAESEM_VS(REG_V27, REG_V13) + VAESEF_VS(REG_V27, REG_V14) + + /* Load input. */ + "mv t0, %[in]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store output. */ + "mv t0, %[out]\n\t" + VS1R_V(REG_V27, REG_T0) + + "addi %[in], %[in], 16\n\t" + "addi %[out], %[out], 16\n\t" + /* Loop if more elements to process. */ + "addi t2, t2, -1\n\t" + "bnez t2, L_aes_gcm_256_decrypt_block_loop\n\t" + + "L_aes_gcm_256_decrypt_blocks_done:\n\t" + "andi t2, %[sz], 0xf\n\t" + "beqz t2, L_aes_gcm_256_decrypt_done\n\t" + + VXOR_VV(REG_V17, REG_V17, REG_V17) + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V17, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_256_decrypt_load_byte:\n\t" + "lb t0, (%[in])\n\t" + "sb t0, (%[scratch])\n\t" + "addi %[in], %[in], 1\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_decrypt_load_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + /* Encrypt counter for partial block. */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + VADD_VI(REG_V20, REG_V20, 1) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + VSETIVLI(REG_X0, 16, 1, 1, 0b000, 0b000) + VRGATHER_VV(REG_V17, REG_V15, REG_V20) + VSETIVLI(REG_X0, 4, 1, 1, 0b010, 0b000) +#else + VREV8(REG_V17, REG_V20) +#endif /* !WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION */ + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#else + "addi t3, t3, 1\n\t" + "slli t0, t3, 32\n\t" + REV8(REG_T0, REG_T0) + VMV_V_X(REG_V17, REG_T0) + VMV_V_V(REG_V27, REG_V16) + VSLIDEUP_VI(REG_V27, REG_V17, 3) +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + + VAESZ_VS(REG_V27, REG_V0) + VAESEM_VS(REG_V27, REG_V1) + VAESEM_VS(REG_V27, REG_V2) + VAESEM_VS(REG_V27, REG_V3) + VAESEM_VS(REG_V27, REG_V4) + VAESEM_VS(REG_V27, REG_V5) + VAESEM_VS(REG_V27, REG_V6) + VAESEM_VS(REG_V27, REG_V7) + VAESEM_VS(REG_V27, REG_V8) + VAESEM_VS(REG_V27, REG_V9) + VAESEM_VS(REG_V27, REG_V10) + VAESEM_VS(REG_V27, REG_V11) + VAESEM_VS(REG_V27, REG_V12) + VAESEM_VS(REG_V27, REG_V13) + VAESEF_VS(REG_V27, REG_V14) + + /* Load scratch. */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V27, REG_V27, REG_V17) + /* Store scratch. */ + VS1R_V(REG_V27, REG_T0) + "mv t1, t2\n\t" + "L_aes_gcm_256_decrypt_store_byte:\n\t" + "lb t0, (%[scratch])\n\t" + "sb t0, (%[out])\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[out], %[out], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_decrypt_store_byte\n\t" + "sub %[scratch], %[scratch], t2\n\t" + + "L_aes_gcm_256_decrypt_done:\n\t" + + /* Hash in the lengths of A and C in bits */ +#ifndef WOLFSSL_RISCV_BASE_BIT_MANIPULATION + /* aSz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[aSz], %[aSz], 3\n\t" + "srli t0, %[aSz], 32\n\t" + "srli t1, %[aSz], 24\n\t" + "srli t2, %[aSz], 16\n\t" + "srli t3, %[aSz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 0(%[scratch])\n\t" + "sb x0 , 2(%[scratch])\n\t" + "sb t0 , 3(%[scratch])\n\t" + "sb t1 , 4(%[scratch])\n\t" + "sb t2 , 5(%[scratch])\n\t" + "sb t3 , 6(%[scratch])\n\t" + "sb %[aSz], 7(%[scratch])\n\t" + /* sz is only 32-bits */ + /* Multiply by 8 do get size in bits. */ + "slli %[sz], %[sz], 3\n\t" + "srli t0, %[sz], 32\n\t" + "srli t1, %[sz], 24\n\t" + "srli t2, %[sz], 16\n\t" + "srli t3, %[sz], 8\n\t" + /* Top 3 bytes are 0. */ + "sh x0 , 8(%[scratch])\n\t" + "sb x0 , 10(%[scratch])\n\t" + "sb t0 , 11(%[scratch])\n\t" + "sb t1 , 12(%[scratch])\n\t" + "sb t2 , 13(%[scratch])\n\t" + "sb t3 , 14(%[scratch])\n\t" + "sb %[sz], 15(%[scratch])\n\t" +#else + "slli t0, %[aSz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 0(%[scratch])\n\t" + "slli t0, %[sz], 3\n\t" + REV8(REG_T0, REG_T0) + "sd t0, 8(%[scratch])\n\t" +#endif /* !WOLFSSL_RISCV_BASE_BIT_MANIPULATION */ + "mv t0, %[scratch]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VGHSH_VV(REG_V18, REG_V17, REG_V19) + + VAESZ_VS(REG_V16, REG_V0) + VAESEM_VS(REG_V16, REG_V1) + VAESEM_VS(REG_V16, REG_V2) + VAESEM_VS(REG_V16, REG_V3) + VAESEM_VS(REG_V16, REG_V4) + VAESEM_VS(REG_V16, REG_V5) + VAESEM_VS(REG_V16, REG_V6) + VAESEM_VS(REG_V16, REG_V7) + VAESEM_VS(REG_V16, REG_V8) + VAESEM_VS(REG_V16, REG_V9) + VAESEM_VS(REG_V16, REG_V10) + VAESEM_VS(REG_V16, REG_V11) + VAESEM_VS(REG_V16, REG_V12) + VAESEM_VS(REG_V16, REG_V13) + VAESEF_VS(REG_V16, REG_V14) + VXOR_VV(REG_V18, REG_V18, REG_V16) + + "li t1, 16\n\t" + "blt %[tagSz], t1, L_aes_gcm_256_decrypt_tag_small\n\t" + "mv t0, %[tag]\n\t" + VL1RE32_V(REG_V17, REG_T0) + VXOR_VV(REG_V19, REG_V19, REG_V19) + VXOR_VV(REG_V18, REG_V18, REG_V17) + VMSNE_VV(REG_V19, REG_V19, REG_V18) + VCPOP_M(REG_T0, REG_V19) + "beqz x0, L_aes_gcm_256_decrypt_tag_done\n\t" + "L_aes_gcm_256_decrypt_tag_small:\n\t" + "mv t0, %[scratch]\n\t" + VS1R_V(REG_V18, REG_T0) + "mv t1, %[tagSz]\n\t" + "xor t0, t0, t0\n\t" + "L_aes_gcm_256_decrypt_store_tag_byte:\n\t" + "lb t2, (%[scratch])\n\t" + "lb t3, (%[tag])\n\t" + "xor t0, t0, t2\n\t" + "xor t0, t0, t3\n\t" + "addi %[scratch], %[scratch], 1\n\t" + "addi %[tag], %[tag], 1\n\t" + "addi t1, t1, -1\n\t" + "bnez t1, L_aes_gcm_256_decrypt_store_tag_byte\n\t" + "L_aes_gcm_256_decrypt_tag_done:\n\t" + "negw t0, t0\n\t" + "sraiw t0, t0, 31\n\t" + "andi %[ret], t0, -180\n\t" + + : [out] "+r" (out), [in] "+r" (in), [key] "+r" (key), + [aSz] "+r" (aadSz), [aad] "+r" (aad), [ret] "+r" (ret), + [sz] "+r" (sz) + : [ctr] "r" (ctr), [scratch] "r" (scratch), + [h] "r" (aes->gcm.H), [tag] "r" (tag), [tagSz] "r" (tagSz) +#ifndef WOLFSSL_RISCV_VECTOR_BASE_BIT_MANIPULATION + , [rev_idx] "r" (rev_idx) +#endif + : "memory", "t0", "t1", "t2", "t3", "t4" + ); + +#ifdef OPENSSL_EXTRA + if ((tag != NULL) && (in != NULL) && (sz != 0)) { + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + } +#endif + + return ret; +} +#endif /* WOLFSSL_AES_256 */ + +/* Decrypt data using AES-GCM. + * + * @param [in] aes AES object. + * @param [out] out Decrypted data. + * @param [in] in Data to decrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. + * @return BAD_FUNC_ARG when nonceSz is zero. + * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. + * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or + * greater than AES_BLOCK_SIZE. + * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. + * @return AES_GCM_AUTH_E when authentication tag computed doesn't match + * tag passed in. + */ +int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + int ret = 0; + + /* sanity checks */ + if ((aes == NULL) || (nonce == NULL) || (tag == NULL) || + (tagSz > AES_BLOCK_SIZE) || (tagSz < WOLFSSL_MIN_AUTH_TAG_SZ) || + ((aad == NULL) && (aadSz > 0)) || (nonceSz == 0) || + ((sz != 0) && ((in == NULL) || (out == NULL)))) { + WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); + return BAD_FUNC_ARG; + } + + if (ret == 0) { + switch (aes->rounds) { + #ifdef WOLFSSL_AES_128 + case 10: + ret = Aes128GcmDecrypt(aes, out, in, sz, nonce, nonceSz, tag, + tagSz, aad, aadSz); + break; + #endif + #ifdef WOLFSSL_AES_192 + case 12: + ret = Aes192GcmDecrypt(aes, out, in, sz, nonce, nonceSz, tag, + tagSz, aad, aadSz); + break; + #endif + #ifdef WOLFSSL_AES_256 + case 14: + ret = Aes256GcmDecrypt(aes, out, in, sz, nonce, nonceSz, tag, + tagSz, aad, aadSz); + break; + #endif + default: + WOLFSSL_MSG("AES-GCM invalid round number"); + ret = BAD_FUNC_ARG; + } + } + + return ret; + +} + +#endif /* HAVE_AES_DECRYPT */ + +/* END script replace AES-GCM RISC-V 64 with hardware vector crypto */ + +#define HAVE_AES_GCM_ENC_DEC + +#endif /* !WOLFSSL_RISCV_VECTOR_GCM */ + +#endif /* WOLFSSL_RISCV_VECTOR_CRYPTO_ASM */ + +/* Implement GHASH if we haven't already. */ +#ifndef HAVE_GHASH +/* Remainder values. */ +static const word16 R[32] = { + 0x0000, 0x201c, 0x4038, 0x6024, + 0x8070, 0xa06c, 0xc048, 0xe054, + 0x00e1, 0x20fd, 0x40d9, 0x60c5, + 0x8091, 0xa08d, 0xc0a9, 0xe0b5, + + 0x0000, 0xc201, 0x8403, 0x4602, + 0x0807, 0xca06, 0x8c04, 0x4e05, + 0x100e, 0xd20f, 0x940d, 0x560c, + 0x1809, 0xda08, 0x9c0a, 0x5e0b, +}; + +/* GMULT, multiply in GF2, x and y into x. + * + * @param [in, out] x On in, value to GMULT. + * On out, result of GMULT. + * @param [in] y Value to GMULT. + */ +static WC_INLINE void GMULT(byte *x, byte m[32][AES_BLOCK_SIZE]) +{ + int i; + word64 z8[2] = {0, 0}; + byte a; + word64* x8 = (word64*)x; + word64* m8; + word64 n0, n1, n2, n3; + byte xi; + + for (i = 15; i > 0; i--) { + xi = x[i]; + + /* XOR in (msn * H) */ + m8 = (word64*)m[xi & 0xf]; + z8[0] ^= m8[0]; + z8[1] ^= m8[1]; + + /* Cache top byte for remainder calculations - lost in rotate. */ + a = (byte)(z8[1] >> 56); + + /* Rotate Z by 8-bits */ + z8[1] = (z8[0] >> 56) | (z8[1] << 8); + z8[0] <<= 8; + + /* XOR in (next significant nibble * H) [pre-rotated by 4 bits] */ + m8 = (word64*)m[16 + (xi >> 4)]; + z8[0] ^= m8[0]; + z8[1] ^= m8[1]; + + /* XOR in (msn * remainder) [pre-rotated by 4 bits] */ + z8[0] ^= (word64)R[16 + (a & 0xf)]; + /* XOR in next significant nibble (XORed with H) * remainder */ + m8 = (word64*)m[xi >> 4]; + a ^= (byte)(m8[1] >> 52); + z8[0] ^= (word64)R[a >> 4]; + } + + xi = x[0]; + + /* XOR in most significant nibble * H */ + m8 = (word64*)m[xi & 0xf]; + z8[0] ^= m8[0]; + z8[1] ^= m8[1]; + + /* Cache top byte for remainder calculations - lost in rotate. */ + a = (z8[1] >> 56) & 0xf; + + /* Rotate z by 4-bits */ + n3 = z8[1] & W64LIT(0xf0f0f0f0f0f0f0f0); + n2 = z8[1] & W64LIT(0x0f0f0f0f0f0f0f0f); + n1 = z8[0] & W64LIT(0xf0f0f0f0f0f0f0f0); + n0 = z8[0] & W64LIT(0x0f0f0f0f0f0f0f0f); + z8[1] = (n3 >> 4) | (n2 << 12) | (n0 >> 52); + z8[0] = (n1 >> 4) | (n0 << 12); + + /* XOR in next significant nibble * H */ + m8 = (word64*)m[xi >> 4]; + z8[0] ^= m8[0]; + z8[1] ^= m8[1]; + /* XOR in most significant nibble * remainder */ + z8[0] ^= (word64)R[a]; + + /* Write back result. */ + x8[0] = z8[0]; + x8[1] = z8[1]; +} + +/* GHASH Additional Authentication Data (AAD) and cipher text. + * + * @param [in] gcm GCM object. + * @param [in] a Additional Authentication Data (AAD). + * @param [in] aSz Size of AAD in bytes. + * @param [in] c Cipher text. + * @param [in] cSz Size of cipher text in bytes. + * @param [out] s Hash result. + * @param [in] sSz Number of bytes to put into hash result. + */ +void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, word32 cSz, + byte* s, word32 sSz) +{ + if (gcm != NULL) { + byte x[AES_BLOCK_SIZE]; + byte scratch[AES_BLOCK_SIZE]; + word32 blocks, partial; + + XMEMSET(x, 0, AES_BLOCK_SIZE); + + /* Hash in A, the Additional Authentication Data */ + if (aSz != 0 && a != NULL) { + blocks = aSz / AES_BLOCK_SIZE; + partial = aSz % AES_BLOCK_SIZE; + while (blocks--) { + xorbuf16(x, a); + GMULT(x, gcm->M0); + a += AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, AES_BLOCK_SIZE); + XMEMCPY(scratch, a, partial); + xorbuf16(x, scratch); + GMULT(x, gcm->M0); + } + } + + /* Hash in C, the Ciphertext */ + if (cSz != 0 && c != NULL) { + blocks = cSz / AES_BLOCK_SIZE; + partial = cSz % AES_BLOCK_SIZE; + while (blocks--) { + xorbuf16(x, c); + GMULT(x, gcm->M0); + c += AES_BLOCK_SIZE; + } + if (partial != 0) { + XMEMSET(scratch, 0, AES_BLOCK_SIZE); + XMEMCPY(scratch, c, partial); + xorbuf16(x, scratch); + GMULT(x, gcm->M0); + } + } + + /* Hash in the lengths of A and C in bits */ + FlattenSzInBits(&scratch[0], aSz); + FlattenSzInBits(&scratch[8], cSz); + xorbuf16(x, scratch); + GMULT(x, gcm->M0); + + /* Copy the result into s. */ + XMEMCPY(s, x, sSz); + } +} +#endif /* !HAVE_GHASH */ + +#ifndef HAVE_AES_GCM_ENC_DEC +/* Increment AES-GCM counter. + * + * Big-endian byte ordering. + * + * @param [in, out] inOutCtr Counter value to be incremented. + */ +static WC_INLINE void IncrementGcmCounter(byte* inOutCtr) +{ + int i; + + /* Big-endian aray - start at last element and move back. */ + for (i = AES_BLOCK_SIZE - 1; i >= AES_BLOCK_SIZE - CTR_SZ; i--) { + /* Result not zero means no carry. */ + if ((++inOutCtr[i]) != 0) { + return; + } + } +} + +/* Encrypt data using AES-GCM. + * + * @param [in] aes AES object. + * @param [out] out Encrypted data. + * @param [in] in Data to encrypt. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. + * @return BAD_FUNC_ARG when nonceSz is zero. + * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. + * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or + * greater than AES_BLOCK_SIZE. + * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. + */ +int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + int ret = 0; + word32 blocks = sz / AES_BLOCK_SIZE; + word32 partial = sz % AES_BLOCK_SIZE; + const byte* p = in; + byte* c = out; + ALIGN16 byte counter[AES_BLOCK_SIZE]; + ALIGN16 byte initialCounter[AES_BLOCK_SIZE]; + ALIGN16 byte scratch[AES_BLOCK_SIZE]; + + /* Validate parameters. */ + if ((aes == NULL) || (nonce == NULL) || (nonceSz == 0) || (tag == NULL) || + ((aad == NULL) && (aadSz > 0)) || ((sz != 0) && ((in == NULL) || + (out == NULL)))) { + WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); + ret = BAD_FUNC_ARG; + } + + if ((ret == 0) && ((tagSz < WOLFSSL_MIN_AUTH_TAG_SZ) || + (tagSz > AES_BLOCK_SIZE))) { + WOLFSSL_MSG("GcmEncrypt tagSz error"); + ret = BAD_FUNC_ARG; + } + + + if (ret == 0) { + if (nonceSz == GCM_NONCE_MID_SZ) { + /* Counter is IV with bottom 4 bytes set to: 0x00,0x00,0x00,0x01. */ + XMEMCPY(counter, nonce, nonceSz); + XMEMSET(counter + GCM_NONCE_MID_SZ, 0, + AES_BLOCK_SIZE - GCM_NONCE_MID_SZ - 1); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { + /* Counter is GHASH of IV. */ + #ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; + #endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); + #ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; + #endif + } + memcpy16(initialCounter, counter); + + while (blocks--) { + IncrementGcmCounter(counter); + wc_AesEncrypt(aes, counter, scratch); + xorbufout16(c, scratch, p); + p += AES_BLOCK_SIZE; + c += AES_BLOCK_SIZE; + } + + if (partial != 0) { + IncrementGcmCounter(counter); + wc_AesEncrypt(aes, counter, scratch); + xorbufout(c, scratch, p, partial); + } + if (tag) { + GHASH(&aes->gcm, aad, aadSz, out, sz, tag, tagSz); + wc_AesEncrypt(aes, initialCounter, scratch); + xorbuf(tag, scratch, tagSz); + #ifdef OPENSSL_EXTRA + if (!in && !sz) + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + #endif + } + } + + return ret; +} + +#ifdef HAVE_AES_DECRYPT +/* Decrypt data using AES-GCM. + * + * @param [in] aes AES object. + * @param [out] out Decrypted data. + * @param [in] in Data to decrypt and GHASH. + * @param [in] sz Number of bytes of data. + * @param [in] nonce Nonce used to calculate first IV. + * @param [in] nonceSz Length of nonce in bytes. + * @param [out] tag Authentication tag. + * @param [in] tagSz Length of authentication tag in bytes. + * @param [in] aad Additional Authentication Data (AAD). + * @param [in] aadSz Length of AAD in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when aes, nonce or tag is NULL. + * @return BAD_FUNC_ARG when nonceSz is zero. + * @return BAD_FUNC_ARG when aad is NULL but aadSz is not zero. + * @return BAD_FUNC_ARG when tagSz is less than WOLFSSL_MIN_AUTH_TAG_SZ or + * greater than AES_BLOCK_SIZE. + * @return BAD_FUNC_ARG when sz is not zero but in or out is NULL. + * @return AES_GCM_AUTH_E when authentication tag computed doesn't match + * tag passed in. + */ +int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + const byte* nonce, word32 nonceSz, const byte* tag, word32 tagSz, + const byte* aad, word32 aadSz) +{ + int ret = 0; + word32 blocks = sz / AES_BLOCK_SIZE; + word32 partial = sz % AES_BLOCK_SIZE; + const byte* c = in; + byte* p = out; + ALIGN16 byte counter[AES_BLOCK_SIZE]; + ALIGN16 byte scratch[AES_BLOCK_SIZE]; + ALIGN16 byte Tprime[AES_BLOCK_SIZE]; + ALIGN16 byte EKY0[AES_BLOCK_SIZE]; + sword32 res; + + /* Validate parameters. */ + if ((aes == NULL) || (nonce == NULL) || (tag == NULL) || + (tagSz > AES_BLOCK_SIZE) || (tagSz < WOLFSSL_MIN_AUTH_TAG_SZ) || + ((aad == NULL) && (aadSz > 0)) || (nonceSz == 0) || + ((sz != 0) && ((in == NULL) || (out == NULL)))) { + WOLFSSL_MSG("a NULL parameter passed in when size is larger than 0"); + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + if (nonceSz == GCM_NONCE_MID_SZ) { + /* Counter is IV with bottom 4 bytes set to: 0x00,0x00,0x00,0x01. */ + XMEMCPY(counter, nonce, nonceSz); + XMEMSET(counter + GCM_NONCE_MID_SZ, 0, + AES_BLOCK_SIZE - GCM_NONCE_MID_SZ - 1); + counter[AES_BLOCK_SIZE - 1] = 1; + } + else { + /* Counter is GHASH of IV. */ + #ifdef OPENSSL_EXTRA + word32 aadTemp = aes->gcm.aadLen; + aes->gcm.aadLen = 0; + #endif + GHASH(&aes->gcm, NULL, 0, nonce, nonceSz, counter, AES_BLOCK_SIZE); + #ifdef OPENSSL_EXTRA + aes->gcm.aadLen = aadTemp; + #endif + } + + /* Calc the tag again using received auth data and the cipher text */ + GHASH(&aes->gcm, aad, aadSz, in, sz, Tprime, sizeof(Tprime)); + wc_AesEncrypt(aes, counter, EKY0); + xorbuf(Tprime, EKY0, sizeof(Tprime)); + #ifdef WC_AES_GCM_DEC_AUTH_EARLY + /* ConstantCompare returns the cumulative bitwise or of the bitwise xor + * of the pairwise bytes in the strings. + */ + res = ConstantCompare(tag, Tprime, tagSz); + /* convert positive retval from ConstantCompare() to all-1s word, in + * constant time. + */ + res = 0 - (sword32)(((word32)(0 - res)) >> 31U); + ret = res & AES_GCM_AUTH_E; + } + if (ret == 0) { + #endif + + #ifdef OPENSSL_EXTRA + if (!out) { + /* authenticated, non-confidential data */ + /* store AAD size for next call */ + aes->gcm.aadLen = aadSz; + } + #endif + + while (blocks--) { + IncrementGcmCounter(counter); + wc_AesEncrypt(aes, counter, scratch); + xorbufout16(p, scratch, c); + p += AES_BLOCK_SIZE; + c += AES_BLOCK_SIZE; + } + + if (partial != 0) { + IncrementGcmCounter(counter); + wc_AesEncrypt(aes, counter, scratch); + xorbuf(scratch, c, partial); + XMEMCPY(p, scratch, partial); + } + + #ifndef WC_AES_GCM_DEC_AUTH_EARLY + /* ConstantCompare returns the cumulative bitwise or of the bitwise xor + * of the pairwise bytes in the strings. + */ + res = ConstantCompare(tag, Tprime, (int)tagSz); + /* convert positive retval from ConstantCompare() to all-1s word, in + * constant time. + */ + res = 0 - (sword32)(((word32)(0 - res)) >> 31U); + /* now use res as a mask for constant time return of ret, unless tag + * mismatch, whereupon AES_GCM_AUTH_E is returned. + */ + ret = (ret & ~res) | (res & AES_GCM_AUTH_E); + #endif + } + + return ret; +} +#endif /* HAVE_AES_DECRYPT */ +#endif /* !HAVE_AES_GCM_ENC_DEC */ + +#endif /* HAVE_AESGCM */ + +#ifdef HAVE_AESCCM + +static void roll_x(Aes* aes, const byte* in, word32 inSz, byte* out) +{ + /* process the bulk of the data */ + while (inSz >= AES_BLOCK_SIZE) { + xorbuf16(out, in); + in += AES_BLOCK_SIZE; + inSz -= AES_BLOCK_SIZE; + + wc_AesEncrypt(aes, out, out); + } + + /* process remainder of the data */ + if (inSz > 0) { + xorbuf(out, in, inSz); + wc_AesEncrypt(aes, out, out); + } +} + + +static void roll_auth(Aes* aes, const byte* in, word32 inSz, byte* out) +{ + word32 authLenSz; + word32 remainder; + + /* encode the length in */ + if (inSz <= 0xFEFF) { + authLenSz = 2; + out[0] ^= ((inSz & 0xFF00) >> 8); + out[1] ^= (inSz & 0x00FF); + } + else { + authLenSz = 6; + out[0] ^= 0xFF; out[1] ^= 0xFE; + out[2] ^= ((inSz & 0xFF000000) >> 24); + out[3] ^= ((inSz & 0x00FF0000) >> 16); + out[4] ^= ((inSz & 0x0000FF00) >> 8); + out[5] ^= (inSz & 0x000000FF); + } + /* Note, the protocol handles auth data up to 2^64, but we are + * using 32-bit sizes right now, so the bigger data isn't handled. + */ + + /* start fill out the rest of the first block */ + remainder = AES_BLOCK_SIZE - authLenSz; + if (inSz >= remainder) { + /* plenty of bulk data to fill the remainder of this block */ + xorbuf(out + authLenSz, in, remainder); + inSz -= remainder; + in += remainder; + } + else { + /* not enough bulk data, copy what is available, and pad zero */ + xorbuf(out + authLenSz, in, inSz); + inSz = 0; + } + wc_AesEncrypt(aes, out, out); + + if (inSz > 0) + roll_x(aes, in, inSz, out); +} + + +static WC_INLINE void AesCcmCtrInc(byte* B, word32 lenSz) +{ + word32 i; + + for (i = 0; i < lenSz; i++) { + if (++B[AES_BLOCK_SIZE - 1 - i] != 0) return; + } +} + +/* return 0 on success */ +int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + int ret = 0; + + /* sanity check on arguments */ + if ((aes == NULL) || ((inSz != 0) && ((in == NULL) || (out == NULL))) || + (nonce == NULL) || (authTag == NULL) || (nonceSz < 7) || + (nonceSz > 13)) { + ret = BAD_FUNC_ARG; + } + + if ((ret == 0) && (wc_AesCcmCheckTagSize(authTagSz) != 0)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + byte A[AES_BLOCK_SIZE]; + byte B[AES_BLOCK_SIZE]; + byte lenSz; + byte i; + + XMEMCPY(B+1, nonce, nonceSz); + lenSz = AES_BLOCK_SIZE - 1 - (byte)nonceSz; + B[0] = (authInSz > 0 ? 64 : 0) + + (8 * (((byte)authTagSz - 2) / 2)) + + (lenSz - 1); + for (i = 0; (i < lenSz) && (i < (byte)sizeof(word32)); i++) { + B[AES_BLOCK_SIZE - 1 - i] = inSz >> (8 * i); + } + for (; i < lenSz; i++) { + B[AES_BLOCK_SIZE - 1 - i] = 0; + } + + wc_AesEncrypt(aes, B, A); + + if (authInSz > 0) { + roll_auth(aes, authIn, authInSz, A); + } + if (inSz > 0) { + roll_x(aes, in, inSz, A); + } + XMEMCPY(authTag, A, authTagSz); + + B[0] = lenSz - 1; + for (i = 0; i < lenSz; i++) { + B[AES_BLOCK_SIZE - 1 - i] = 0; + } + wc_AesEncrypt(aes, B, A); + xorbuf(authTag, A, authTagSz); + + B[15] = 1; + while (inSz >= AES_BLOCK_SIZE) { + wc_AesEncrypt(aes, B, A); + xorbuf16(A, in); + memcpy16(out, A); + + AesCcmCtrInc(B, lenSz); + inSz -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (inSz > 0) { + wc_AesEncrypt(aes, B, A); + xorbuf(A, in, inSz); + XMEMCPY(out, A, inSz); + } + + ForceZero(A, AES_BLOCK_SIZE); + ForceZero(B, AES_BLOCK_SIZE); + } + + return ret; +} + +#ifdef HAVE_AES_DECRYPT +int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + int ret = 0; + + /* sanity check on arguments */ + if ((aes == NULL) || ((inSz != 0) && ((in == NULL) || (out == NULL))) || + (nonce == NULL) || (authTag == NULL) || (nonceSz < 7) || + (nonceSz > 13)) { + ret = BAD_FUNC_ARG; + } + + if ((ret == 0) && (wc_AesCcmCheckTagSize(authTagSz) != 0)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + byte A[AES_BLOCK_SIZE]; + byte B[AES_BLOCK_SIZE]; + byte lenSz; + byte i; + byte* o = out; + word32 oSz = inSz; + + XMEMCPY(B+1, nonce, nonceSz); + lenSz = AES_BLOCK_SIZE - 1 - (byte)nonceSz; + + B[0] = lenSz - 1; + for (i = 0; i < lenSz; i++) { + B[AES_BLOCK_SIZE - 1 - i] = 0; + } + B[15] = 1; + + while (oSz >= AES_BLOCK_SIZE) { + wc_AesEncrypt(aes, B, A); + xorbuf16(A, in); + memcpy16(o, A); + + AesCcmCtrInc(B, lenSz); + oSz -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + o += AES_BLOCK_SIZE; + } + if (inSz > 0) { + wc_AesEncrypt(aes, B, A); + xorbuf(A, in, oSz); + XMEMCPY(o, A, oSz); + } + + for (i = 0; i < lenSz; i++) { + B[AES_BLOCK_SIZE - 1 - i] = 0; + } + wc_AesEncrypt(aes, B, A); + + B[0] = (authInSz > 0 ? 64 : 0) + + (8 * (((byte)authTagSz - 2) / 2)) + + (lenSz - 1); + for (i = 0; (i < lenSz) && (i < (byte)sizeof(word32)); i++) { + B[AES_BLOCK_SIZE - 1 - i] = inSz >> (8 * i); + } + for (; i < lenSz; i++) { + B[AES_BLOCK_SIZE - 1 - i] = 0; + } + + wc_AesEncrypt(aes, B, A); + + if (authInSz > 0) { + roll_auth(aes, authIn, authInSz, A); + } + if (inSz > 0) { + roll_x(aes, out, inSz, A); + } + + B[0] = lenSz - 1; + for (i = 0; i < lenSz; i++) { + B[AES_BLOCK_SIZE - 1 - i] = 0; + } + wc_AesEncrypt(aes, B, B); + xorbuf(A, B, authTagSz); + + if (ConstantCompare(A, authTag, authTagSz) != 0) { + /* If the authTag check fails, don't keep the decrypted data. + * Unfortunately, you need the decrypted data to calculate the + * check value. */ + XMEMSET(out, 0, inSz); + ret = AES_CCM_AUTH_E; + } + + ForceZero(A, AES_BLOCK_SIZE); + ForceZero(B, AES_BLOCK_SIZE); + o = NULL; + } + + return ret; +} +#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AESCCM */ + +#endif /* WOLFSSL_RISCV_ASM */ + +#endif /* !NO_AES */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/README.md 2024-08-03 07:30:00.000000000 +0000 @@ -15,11 +15,15 @@ #define WOLFSSL_SILABS_SE_ACCEL ``` +## Simplicity Studio Example + +For the Silicon Labs Simplicity Studio example see [/IDE/SimplicityStudio/README.md](/IDE/SimplicityStudio/README.md). + ## Caveats :warning: **Be sure to update the SE firmware** Testing and results were done using SE firmware `1.2.6` -Update was preformed under Simplicity Studio directory: +Update was performed under Simplicity Studio directory: `./developer/adapter_packs/commander/commander flash ./offline/efr32/firmware/series2config1/se_firmware_package/s2c1_se_fw_upgrade_app_1v2p6.hex` * AES GCM tags length >= 16 bytes @@ -33,8 +37,7 @@ The SE manager supports multi-threading for FreeRTOS and Micrium ([ref](https://docs.silabs.com/gecko-platform/latest/service/api/group-sl-se-manager#autotoc-md152)). -If a different OS is used with multi-threading, additional mutex -protection may be necessary. +If a different OS is used with multi-threading, additional mutex protection may be necessary. ## Benchmarks diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_ecc.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_ecc.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_ecc.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_ecc.c 2024-08-03 07:30:00.000000000 +0000 @@ -31,6 +31,12 @@ #include #include #include +#include "sl_se_manager_internal_keys.h" + +#if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT) +static sl_se_key_descriptor_t private_device_key = + SL_SE_APPLICATION_ATTESTATION_KEY; +#endif #ifndef WOLFSSL_HAVE_ECC_KEY_GET_PRIV /* FIPS build has replaced ecc.h. */ @@ -40,11 +46,17 @@ #define SILABS_UNSUPPORTED_KEY_TYPE 0xFFFFFFFF -static sl_se_key_type_t silabs_map_key_type (ecc_curve_id curve_id) +/* For older Gecko SDK's with spelling error */ +#ifndef SL_SE_KEY_FLAG_ASYMMETRIC_SIGNING_ONLY +#define SL_SE_KEY_FLAG_ASYMMETRIC_SIGNING_ONLY \ + SL_SE_KEY_FLAG_ASYMMMETRIC_SIGNING_ONLY +#endif + +static sl_se_key_type_t silabs_map_key_type(ecc_curve_id curve_id) { sl_se_key_type_t res = SILABS_UNSUPPORTED_KEY_TYPE; - switch(curve_id) { + switch (curve_id) { case ECC_SECP192R1: res = SL_SE_KEY_TYPE_ECC_P192; break; @@ -84,28 +96,41 @@ return res; } -int silabs_ecc_sign_hash(const byte* in, word32 inlen, byte* out, word32 *outlen, ecc_key* key) +int silabs_ecc_sign_hash(const byte* in, word32 inlen, byte* out, + word32 *outlen, ecc_key* key) { - sl_status_t sl_stat = sl_se_init_command_context(&(key->cmd_ctx)); + sl_status_t sl_stat; + sl_se_key_descriptor_t* slkey = &key->key; word32 siglen = *outlen; - sl_stat = sl_se_validate_key(&(key->key)); - - if (key->dp->size * 2 <= (int)siglen) { + if ((int)siglen >= key->dp->size * 2) { siglen = key->dp->size * 2; } - sl_stat = sl_se_ecc_sign( - &(key->cmd_ctx), - &(key->key), - 0, - 1, - in, - inlen, - out, - siglen - ); +#if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT) + /* if signing and not private key provided then use vault key */ + if (key->type != ECC_PRIVATEKEY || + mp_unsigned_bin_size(wc_ecc_key_get_priv(key)) == 0) { + slkey = &private_device_key; + } +#endif + sl_stat = sl_se_init_command_context(&key->cmd_ctx); + if (sl_stat == SL_STATUS_OK) { + sl_stat = sl_se_validate_key(slkey); + } + if (sl_stat == SL_STATUS_OK) { + sl_stat = sl_se_ecc_sign( + &key->cmd_ctx, + slkey, + 0, + 1, + in, + inlen, + out, + siglen + ); + } return (sl_stat == SL_STATUS_OK) ? 0 : WC_HW_E; } @@ -115,18 +140,18 @@ const byte* hash, word32 hashlen, int* stat, ecc_key* key) { - sl_status_t sl_stat = sl_se_init_command_context(&(key->cmd_ctx)); - - sl_stat = sl_se_ecc_verify( - &(key->cmd_ctx), - &(key->key), - 0, - 1, - hash, - hashlen, - sig, - siglen); - + sl_status_t sl_stat = sl_se_init_command_context(&key->cmd_ctx); + if (sl_stat == SL_STATUS_OK) { + sl_stat = sl_se_ecc_verify( + &key->cmd_ctx, + &key->key, + 0, + 1, + hash, + hashlen, + sig, + siglen); + } if (sl_stat == SL_STATUS_OK) { *stat = 1; } else if (sl_stat == SL_STATUS_INVALID_SIGNATURE) { @@ -134,7 +159,6 @@ } else { return WC_HW_E; } - return 0; } #endif @@ -144,161 +168,86 @@ sl_status_t sl_stat; key->key.type = silabs_map_key_type(key->dp->id); - if (SILABS_UNSUPPORTED_KEY_TYPE == key->key.type) + if (key->key.type == SILABS_UNSUPPORTED_KEY_TYPE) return WC_HW_E; key->key.size = keysize; key->key.storage.method = SL_SE_KEY_STORAGE_EXTERNAL_PLAINTEXT; - key->key.flags = SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PRIVATE_KEY - | SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PUBLIC_KEY - | SL_SE_KEY_FLAG_ASYMMMETRIC_SIGNING_ONLY; + key->key.flags = (SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PRIVATE_KEY | + SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PUBLIC_KEY | + SL_SE_KEY_FLAG_ASYMMETRIC_SIGNING_ONLY); - sl_stat = sl_se_get_storage_size(&key->key, &key->key.storage.location.buffer.size); - key->key.storage.location.buffer.pointer = key->key_raw; - - sl_stat = sl_se_generate_key(&(key->cmd_ctx), - &(key->key)); - - key->type = ECC_PRIVATEKEY; + sl_stat = sl_se_get_storage_size(&key->key, + &key->key.storage.location.buffer.size); + if (sl_stat == SL_STATUS_OK) { + key->key.storage.location.buffer.pointer = key->key_raw; + sl_stat = sl_se_generate_key(&key->cmd_ctx, + &key->key); + } + if (sl_stat == SL_STATUS_OK) { + key->type = ECC_PRIVATEKEY; - /* copy key to mp components */ - mp_read_unsigned_bin (key->pubkey.x, - key->key.storage.location.buffer.pointer, - keysize); - mp_read_unsigned_bin (key->pubkey.y, - key->key.storage.location.buffer.pointer + keysize, - keysize); - mp_read_unsigned_bin (wc_ecc_key_get_priv(key), - key->key.storage.location.buffer.pointer + 2 * keysize, - keysize); + /* copy key to mp components */ + mp_read_unsigned_bin(key->pubkey.x, + key->key.storage.location.buffer.pointer, keysize); + mp_read_unsigned_bin(key->pubkey.y, + key->key.storage.location.buffer.pointer + keysize, keysize); + mp_read_unsigned_bin(wc_ecc_key_get_priv(key), + key->key.storage.location.buffer.pointer + (2 * keysize), keysize); + } return (sl_stat == SL_STATUS_OK) ? 0 : WC_HW_E; } -int silabs_ecc_import(ecc_key* key, word32 keysize) +int silabs_ecc_import(ecc_key* key, word32 keysize, int pub, int priv) { sl_status_t sl_stat; int err = MP_OKAY; - word32 used = keysize; + word32 used; key->key.type = silabs_map_key_type(key->dp->id); - if (SILABS_UNSUPPORTED_KEY_TYPE == key->key.type) + if (key->key.type == SILABS_UNSUPPORTED_KEY_TYPE || keysize == 0) return WC_HW_E; key->key.size = keysize; key->key.storage.method = SL_SE_KEY_STORAGE_EXTERNAL_PLAINTEXT; - key->key.flags = SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PRIVATE_KEY - | SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PUBLIC_KEY - | SL_SE_KEY_FLAG_ASYMMMETRIC_SIGNING_ONLY; + key->key.flags = ( + (pub ? SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PUBLIC_KEY : 0) | + (priv ? SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PRIVATE_KEY : 0) | + SL_SE_KEY_FLAG_ASYMMETRIC_SIGNING_ONLY); - sl_stat = sl_se_get_storage_size(&key->key, &key->key.storage.location.buffer.size); + sl_stat = sl_se_get_storage_size(&key->key, + &key->key.storage.location.buffer.size); key->key.storage.location.buffer.pointer = key->key_raw; if (sl_stat != SL_STATUS_OK) return WC_HW_E; - key->type = ECC_PRIVATEKEY; + if (priv && pub) + key->type = ECC_PRIVATEKEY; + else if (priv) + key->type = ECC_PRIVATEKEY_ONLY; + else + key->type = ECC_PUBLICKEY; /* copy key from mp components */ - if (err == MP_OKAY) - err = wc_export_int(key->pubkey.x, key->key.storage.location.buffer.pointer, - &used, keysize, - WC_TYPE_UNSIGNED_BIN); - if (err == MP_OKAY) - err = wc_export_int(key->pubkey.y, key->key.storage.location.buffer.pointer + keysize, - &used, keysize, - WC_TYPE_UNSIGNED_BIN); - if (err == MP_OKAY) - err = wc_export_int(wc_ecc_key_get_priv(key), - key->key.storage.location.buffer.pointer + 2 * keysize, &used, - keysize, WC_TYPE_UNSIGNED_BIN); - - return err; -} - -int silabs_ecc_import_private(ecc_key* key, word32 keysize) -{ - sl_status_t sl_stat; - int ret = 0; - word32 keySz = keysize; - key->key.type = silabs_map_key_type(key->dp->id); - if (SILABS_UNSUPPORTED_KEY_TYPE == key->key.type) - return WC_HW_E; - - key->key.size = key->dp->size; - key->key.storage.method = SL_SE_KEY_STORAGE_EXTERNAL_PLAINTEXT; - key->key.flags = SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PRIVATE_KEY - | SL_SE_KEY_FLAG_ASYMMMETRIC_SIGNING_ONLY; - - sl_stat = sl_se_get_storage_size(&key->key, &key->key.storage.location.buffer.size); - key->key.storage.location.buffer.pointer = key->key_raw; - if (sl_stat != SL_STATUS_OK) - return WC_HW_E; - - ret = wc_export_int(wc_ecc_key_get_priv(key), - key->key.storage.location.buffer.pointer, &keySz, keySz, - WC_TYPE_UNSIGNED_BIN); - - if (keySz != keysize) - ret = WC_HW_E; - - return ret; -} - -int silabs_ecc_sig_to_rs(ecc_key* key, word32 keySz) -{ - sl_status_t sl_stat; - int err = MP_OKAY; - - key->key.type = silabs_map_key_type(key->dp->id); - if (SILABS_UNSUPPORTED_KEY_TYPE == key->key.type) - return WC_HW_E; - - key->key.size = keySz; - key->key.storage.method = SL_SE_KEY_STORAGE_EXTERNAL_PLAINTEXT; - key->key.flags = SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PUBLIC_KEY - | SL_SE_KEY_FLAG_ASYMMMETRIC_SIGNING_ONLY; - - sl_stat = sl_se_get_storage_size(&key->key, &key->key.storage.location.buffer.size); - key->key.storage.location.buffer.pointer = key->key_raw; - if (sl_stat != SL_STATUS_OK) - return WC_HW_E; - - if (err == MP_OKAY) { - keySz = key->dp->size; + if (err == MP_OKAY && pub) { + used = keysize; err = wc_export_int(key->pubkey.x, - key->key.storage.location.buffer.pointer, - &keySz, keySz, WC_TYPE_UNSIGNED_BIN); - if (err == MP_OKAY) - err = wc_export_int(key->pubkey.y, - key->key.storage.location.buffer.pointer + keySz, - &keySz, keySz, WC_TYPE_UNSIGNED_BIN); + key->key.storage.location.buffer.pointer, + &used, keysize, WC_TYPE_UNSIGNED_BIN); } - - return err; -} - -int silabs_ecc_import_private_raw(ecc_key* key, word32 keySz, const char* d, int encType) -{ - sl_status_t sl_stat; - int err = MP_OKAY; - key->type = ECC_PRIVATEKEY; - key->key.flags |= SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PRIVATE_KEY; - - sl_stat = sl_se_get_storage_size(&key->key, &key->key.storage.location.buffer.size); - if (sl_stat != SL_STATUS_OK) - return WC_HW_E; - - if (encType == WC_TYPE_HEX_STR) - err = mp_read_radix(wc_ecc_key_get_priv(key), d, MP_RADIX_HEX); - else - err = mp_read_unsigned_bin(wc_ecc_key_get_priv(key), (const byte*)d, - key->dp->size); - if (err == MP_OKAY) { + if (err == MP_OKAY && pub) { + used = keysize; + err = wc_export_int(key->pubkey.y, + key->key.storage.location.buffer.pointer + keysize, + &used, keysize, WC_TYPE_UNSIGNED_BIN); + } + if (err == MP_OKAY && priv) { + used = keysize; err = wc_export_int(wc_ecc_key_get_priv(key), - key->key.storage.location.buffer.pointer + (2 * keySz), &keySz, - keySz, WC_TYPE_UNSIGNED_BIN); + key->key.storage.location.buffer.pointer + (keysize * 2), + &used, keysize, WC_TYPE_UNSIGNED_BIN); } - return err; } @@ -337,7 +286,7 @@ sl_stat = sl_se_ecdh_compute_shared_secret( &cmd, - &(private_key->key), + &private_key->key, &pub_key, &key_out); @@ -349,4 +298,68 @@ return (sl_stat == SL_STATUS_OK) ? 0 : WC_HW_E; } +int silabs_ecc_export_public(ecc_key* key, sl_se_key_descriptor_t* seKey) +{ + int ret; + sl_status_t sl_stat; + sl_se_command_context_t cmd; + + if (key == NULL || seKey == NULL) + return BAD_FUNC_ARG; + + if (seKey->type == SL_SE_KEY_TYPE_ECC_P192) + ret = wc_ecc_set_curve(key, 24, ECC_SECP192R1); + else if (seKey->type == SL_SE_KEY_TYPE_ECC_P256) + ret = wc_ecc_set_curve(key, 32, ECC_SECP256R1); +#ifdef SL_SE_KEY_TYPE_ECC_P384 + else if (seKey->type == SL_SE_KEY_TYPE_ECC_P384) + ret = wc_ecc_set_curve(key, 48, ECC_SECP384R1); +#endif +#ifdef SL_SE_KEY_TYPE_ECC_P521 + else if (seKey->type == SL_SE_KEY_TYPE_ECC_P521) + ret = wc_ecc_set_curve(key, 66, ECC_SECP521R1); +#endif + else + ret = ECC_CURVE_OID_E; + if (ret != 0) + return ret; + + key->type = ECC_PUBLICKEY; + key->key.type = seKey->type; + key->key.size = key->dp->size; + key->key.storage.method = SL_SE_KEY_STORAGE_EXTERNAL_PLAINTEXT; + key->key.flags = (SL_SE_KEY_FLAG_ASYMMETRIC_BUFFER_HAS_PUBLIC_KEY | + SL_SE_KEY_FLAG_ASYMMETRIC_SIGNING_ONLY); + + sl_stat = sl_se_get_storage_size(&key->key, + &key->key.storage.location.buffer.size); + key->key.storage.location.buffer.pointer = key->key_raw; + if (sl_stat == SL_STATUS_OK) { + sl_stat = sl_se_export_public_key(&cmd, seKey, &key->key); + } + if (sl_stat != SL_STATUS_OK) { + ret = WC_HW_E; + } + if (ret == 0) { + /* export public x and y */ + ret = mp_read_unsigned_bin(key->pubkey.x, + key->key.storage.location.buffer.pointer, + key->key.size); + } + if (ret == 0) { + ret = mp_read_unsigned_bin(key->pubkey.y, + key->key.storage.location.buffer.pointer + key->key.size, + key->key.size); + } + + return ret; +} + +#if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT) +int silabs_ecc_load_vault(ecc_key* key) +{ + return silabs_ecc_export_public(key, &private_device_key); +} +#endif + #endif /* WOLFSSL_SILABS_SE_ACCEL */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_hash.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_hash.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_hash.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/silabs/silabs_hash.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,4 @@ -/* silabs_se_hash.c +/* silabs_hash.c * * Copyright (C) 2006-2023 wolfSSL Inc. * @@ -35,58 +35,52 @@ #include -int wc_silabs_se_hash_init (wc_silabs_sha_t* sha, enum wc_HashType type) +static sl_se_hash_type_t wc_silabs_gethashtype(enum wc_HashType type) { - int ret = 0; - sl_status_t rr; - - /* set sizes and state */ - XMEMSET(sha, 0, sizeof(wc_silabs_sha_t)); - - /* set init state */ - switch(type) { + /* set init state */ + switch (type) { case WC_HASH_TYPE_SHA: - rr = sl_se_hash_starts(&sha->hash_ctx, - &sha->cmd_ctx, - SL_SE_HASH_SHA1, - &sha->hash_type_ctx); + return SL_SE_HASH_SHA1; break; case WC_HASH_TYPE_SHA224: - rr = sl_se_hash_starts(&sha->hash_ctx, - &sha->cmd_ctx, - SL_SE_HASH_SHA224, - &sha->hash_type_ctx); + return SL_SE_HASH_SHA224; break; case WC_HASH_TYPE_SHA256: - rr = sl_se_hash_starts(&sha->hash_ctx, - &sha->cmd_ctx, - SL_SE_HASH_SHA256, - &sha->hash_type_ctx); - break; - + return SL_SE_HASH_SHA256; #ifdef WOLFSSL_SILABS_SHA384 case WC_HASH_TYPE_SHA384: - rr = sl_se_hash_starts(&sha->hash_ctx, - &sha->cmd_ctx, - SL_SE_HASH_SHA384, - &sha->hash_type_ctx); - break; + return SL_SE_HASH_SHA384; #endif - #ifdef WOLFSSL_SILABS_SHA512 case WC_HASH_TYPE_SHA512: - rr = sl_se_hash_starts(&sha->hash_ctx, - &sha->cmd_ctx, - SL_SE_HASH_SHA512, - &sha->hash_type_ctx); - break; + return SL_SE_HASH_SHA512; #endif - default: - ret = BAD_FUNC_ARG; break; } + return SL_SE_HASH_NONE; +} + +int wc_silabs_se_hash_init (wc_silabs_sha_t* sha, enum wc_HashType type) +{ + int ret = 0; + sl_status_t rr; + sl_se_hash_type_t ht = wc_silabs_gethashtype(type); + + if (ht == SL_SE_HASH_NONE) { + return NOT_COMPILED_IN; + } + + /* set sizes and state */ + XMEMSET(sha, 0, sizeof(wc_silabs_sha_t)); + /* set init state */ +#ifdef WOLFSSL_SILABS_SE_ACCEL_3 + rr = sl_se_hash_starts(&sha->hash_ctx, &sha->cmd_ctx, ht, + &sha->hash_type_ctx); +#else + rr = sl_se_hash_multipart_starts(&sha->hash_type_ctx, &sha->cmd_ctx, ht); +#endif if (rr != SL_STATUS_OK) { ret = WC_HW_E; } @@ -94,32 +88,43 @@ return ret; } -int wc_silabs_se_hash_update (wc_silabs_sha_t* sha, const byte* data, word32 len) +int wc_silabs_se_hash_update(wc_silabs_sha_t* sha, const byte* data, + word32 len) { int ret = 0; + sl_status_t status; - sl_status_t status = sl_se_hash_update(&sha->hash_ctx, data, len); +#ifdef WOLFSSL_SILABS_SE_ACCEL_3 + status = sl_se_hash_update(&sha->hash_ctx, data, len); +#else + status = sl_se_hash_multipart_update(&sha->hash_type_ctx, &sha->cmd_ctx, + data, len); +#endif if (status != SL_STATUS_OK) { - ret = BUFFER_E; + ret = WC_HW_E; } - return ret; } -int wc_silabs_se_hash_final (wc_silabs_sha_t* sha, byte* hash) +int wc_silabs_se_hash_final(wc_silabs_sha_t* sha, byte* hash, word32 len) { int ret = 0; + sl_status_t status; - sl_status_t status = sl_se_hash_finish(&sha->hash_ctx, hash, sha->hash_ctx.size); +#ifdef WOLFSSL_SILABS_SE_ACCEL_3 + status = sl_se_hash_finish(&sha->hash_ctx, hash, len); +#else + status = sl_se_hash_multipart_finish(&sha->hash_type_ctx, &sha->cmd_ctx, + hash, len); +#endif if (status != SL_STATUS_OK) { - ret = BUFFER_E; + ret = WC_HW_E; } - return ret; } -int wc_HashUpdate_ex (wc_silabs_sha_t* sha, const byte* data, word32 len) +static int wc_HashUpdate_ex(wc_silabs_sha_t* sha, const byte* data, word32 len) { int ret = 0; @@ -130,13 +135,12 @@ ret = wolfSSL_CryptHwMutexLock(); if (ret == 0) { ret = wc_silabs_se_hash_update(sha, data, len); - wolfSSL_CryptHwMutexUnLock(); } return ret; } -int wc_HashFinal_ex(wc_silabs_sha_t* sha, byte* hash) +static int wc_HashFinal_ex(wc_silabs_sha_t* sha, byte* hash, word32 len) { int ret = 0; @@ -146,7 +150,7 @@ ret = wolfSSL_CryptHwMutexLock(); if (ret == 0) { - ret = wc_silabs_se_hash_final(sha, hash); + ret = wc_silabs_se_hash_final(sha, hash, len); wolfSSL_CryptHwMutexUnLock(); } @@ -164,17 +168,17 @@ (void)devId; (void)heap; - return wc_silabs_se_hash_init(&(sha->silabsCtx), WC_HASH_TYPE_SHA); + return wc_silabs_se_hash_init(&sha->silabsCtx, WC_HASH_TYPE_SHA); } int wc_ShaUpdate(wc_Sha* sha, const byte* data, word32 len) { - return wc_HashUpdate_ex(&(sha->silabsCtx), data, len); + return wc_HashUpdate_ex(&sha->silabsCtx, data, len); } int wc_ShaFinal(wc_Sha* sha, byte* hash) { - int ret = wc_HashFinal_ex(&(sha->silabsCtx), hash); + int ret = wc_HashFinal_ex(&sha->silabsCtx, hash, WC_SHA_DIGEST_SIZE); (void)wc_InitSha(sha); /* reset state */ @@ -193,18 +197,18 @@ (void)devId; (void)heap; - return wc_silabs_se_hash_init(&(sha->silabsCtx), WC_HASH_TYPE_SHA256); + return wc_silabs_se_hash_init(&sha->silabsCtx, WC_HASH_TYPE_SHA256); } int wc_Sha256Update(wc_Sha256* sha, const byte* data, word32 len) { - return wc_HashUpdate_ex(&(sha->silabsCtx), data, len); + return wc_HashUpdate_ex(&sha->silabsCtx, data, len); } int wc_Sha256Final(wc_Sha256* sha, byte* hash) { - int ret = wc_HashFinal_ex(&(sha->silabsCtx), hash); + int ret = wc_HashFinal_ex(&sha->silabsCtx, hash, WC_SHA256_DIGEST_SIZE); (void)wc_InitSha256(sha); /* reset state */ @@ -212,7 +216,7 @@ } #endif /* ! NO_SHA256 */ -#ifndef NO_SHA224 +#ifdef WOLFSSL_SHA224 int wc_InitSha224_ex(wc_Sha224* sha, void* heap, int devId) { if (sha == NULL) { @@ -222,24 +226,24 @@ (void)devId; (void)heap; - return wc_silabs_se_hash_init(&(sha->silabsCtx), WC_HASH_TYPE_SHA224); + return wc_silabs_se_hash_init(&sha->silabsCtx, WC_HASH_TYPE_SHA224); } int wc_Sha224Update(wc_Sha224* sha, const byte* data, word32 len) { - return wc_HashUpdate_ex(&(sha->silabsCtx), data, len); + return wc_HashUpdate_ex(&sha->silabsCtx, data, len); } int wc_Sha224Final(wc_Sha224* sha, byte* hash) { - int ret = wc_HashFinal_ex(&(sha->silabsCtx), hash); + int ret = wc_HashFinal_ex(&sha->silabsCtx, hash, WC_SHA224_DIGEST_SIZE); (void)wc_InitSha224(sha); /* reset state */ return ret; } -#endif /* ! NO_SHA224 */ +#endif /* WOLFSSL_SHA224 */ #ifdef WOLFSSL_SILABS_SHA384 int wc_InitSha384_ex(wc_Sha384* sha, void* heap, int devId) @@ -251,18 +255,18 @@ (void)devId; (void)heap; - return wc_silabs_se_hash_init(&(sha->silabsCtx), WC_HASH_TYPE_SHA384); + return wc_silabs_se_hash_init(&sha->silabsCtx, WC_HASH_TYPE_SHA384); } int wc_Sha384Update(wc_Sha384* sha, const byte* data, word32 len) { - return wc_HashUpdate_ex(&(sha->silabsCtx), data, len); + return wc_HashUpdate_ex(&sha->silabsCtx, data, len); } int wc_Sha384Final(wc_Sha384* sha, byte* hash) { - int ret = wc_HashFinal_ex(&(sha->silabsCtx), hash); + int ret = wc_HashFinal_ex(&sha->silabsCtx, hash, WC_SHA384_DIGEST_SIZE); (void)wc_InitSha384(sha); /* reset state */ @@ -280,18 +284,18 @@ (void)devId; (void)heap; - return wc_silabs_se_hash_init(&(sha->silabsCtx), WC_HASH_TYPE_SHA512); + return wc_silabs_se_hash_init(&sha->silabsCtx, WC_HASH_TYPE_SHA512); } int wc_Sha512Update(wc_Sha512* sha, const byte* data, word32 len) { - return wc_HashUpdate_ex(&(sha->silabsCtx), data, len); + return wc_HashUpdate_ex(&sha->silabsCtx, data, len); } int wc_Sha512Final(wc_Sha512* sha, byte* hash) { - int ret = wc_HashFinal_ex(&(sha->silabsCtx), hash); + int ret = wc_HashFinal_ex(&sha->silabsCtx, hash, WC_SHA512_DIGEST_SIZE); (void)wc_InitSha512(sha); /* reset state */ @@ -299,4 +303,4 @@ } #endif /* WOLFSSL_SILABS_SHA512 */ -#endif /* defined(WOLFSSL_SILABS_SE_ACCEL) */ +#endif /* WOLFSSL_SILABS_SE_ACCEL */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stm32.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stm32.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stm32.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stm32.c 2024-08-03 07:30:00.000000000 +0000 @@ -43,11 +43,42 @@ #include #endif +#ifdef WOLFSSL_STM32_PKA +#include + +#if defined(WOLFSSL_STM32L5) +#include +#include +#elif defined(WOLFSSL_STM32U5) +#include +#include +#elif defined(WOLFSSL_STM32WB) +#include +#include +#elif defined(WOLFSSL_STM32WL) +#include +#include +#else +#error Please add the hal_pk.h include +#endif +extern PKA_HandleTypeDef hpka; + +#if !defined(WOLFSSL_STM32_PKA_V2) && defined(PKA_ECC_SCALAR_MUL_IN_B_COEFF) +/* PKA hardware like in U5 added coefB and primeOrder */ +#define WOLFSSL_STM32_PKA_V2 +#endif + +#ifdef HAVE_ECC +#include + #ifndef WOLFSSL_HAVE_ECC_KEY_GET_PRIV /* FIPS build has replaced ecc.h. */ #define wc_ecc_key_get_priv(key) (&((key)->k)) #define WOLFSSL_HAVE_ECC_KEY_GET_PRIV #endif +#endif /* HAVE_ECC */ +#endif /* WOLFSSL_STM32_PKA */ + #ifdef STM32_HASH @@ -394,6 +425,10 @@ { int ret; word32 keySize; +#ifdef STM32_HW_CLOCK_AUTO + /* enable the peripheral clock */ + __HAL_RCC_CRYP_CLK_ENABLE(); +#endif ret = wc_AesGetKeySize(aes, &keySize); if (ret != 0) @@ -428,6 +463,13 @@ return 0; } +void wc_Stm32_Aes_Cleanup(void) +{ +#ifdef STM32_HW_CLOCK_AUTO + /* disable the peripheral clock */ + __HAL_RCC_CRYP_CLK_DISABLE(); +#endif +} #else /* Standard Peripheral Library */ int wc_Stm32_Aes_Init(Aes* aes, CRYP_InitTypeDef* cryptInit, @@ -486,35 +528,18 @@ return 0; } + +void wc_Stm32_Aes_Cleanup(void) +{ +} #endif /* WOLFSSL_STM32_CUBEMX */ #endif /* !NO_AES */ #endif /* STM32_CRYPTO */ #ifdef WOLFSSL_STM32_PKA -#include - -#if defined(WOLFSSL_STM32L5) -#include -#include -#elif defined(WOLFSSL_STM32U5) -#include -#include -#elif defined(WOLFSSL_STM32WB) -#include -#include -#else -#error Please add the hal_pk.h include -#endif -extern PKA_HandleTypeDef hpka; - -#if !defined(WOLFSSL_STM32_PKA_V2) && defined(PKA_ECC_SCALAR_MUL_IN_B_COEFF) -/* PKA hardware like in U5 added coefB and primeOrder */ -#define WOLFSSL_STM32_PKA_V2 -#endif /* Reverse array in memory (in place) */ #ifdef HAVE_ECC -#include /* convert from mp_int to STM32 PKA HAL integer, as array of bytes of size sz. * if mp_int has less bytes than sz, add zero bytes at most significant byte @@ -525,11 +550,9 @@ */ static int stm32_get_from_mp_int(uint8_t *dst, const mp_int *a, int sz) { - int res; - int szbin; - int offset; + int res, szbin, offset; - if (a == NULL || dst == NULL || sz < 0) + if (dst == NULL || a == NULL || sz < 0) return BAD_FUNC_ARG; /* check how many bytes are in the mp_int */ @@ -553,272 +576,126 @@ return res; } -/* ECC specs in lsbyte at lowest address format for direct use by - * STM32_PKA PKHA driver functions */ -#if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) -#define ECC192 -#endif -#if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) -#define ECC224 -#endif -#if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) -#define ECC256 -#endif -#if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) -#define ECC384 -#endif +static int stm32_getabs_from_mp_int(uint8_t *dst, const mp_int *a, int sz, + uint32_t* abs_sign) +{ + int res; + mp_int x; -/* STM32 PKA supports up to 640bit numbers */ -#define STM32_MAX_ECC_SIZE (80) + if (dst == NULL || a == NULL || sz < 0 || abs_sign == NULL) + return BAD_FUNC_ARG; + res = mp_init(&x); + if (res == MP_OKAY) { + /* make abs(x) and capture sign */ + #if defined(USE_FAST_MATH) || defined(USE_INTEGER_HEAP_MATH) || \ + ((defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ + defined(WOLFSSL_SP_INT_NEGATIVE)) + *abs_sign = x.sign; + #else + *abs_sign = 1; /* default to negative */ + #endif + res = mp_abs((mp_int*)a, &x); + if (res == MP_OKAY) + res = stm32_get_from_mp_int(dst, &x, sz); + mp_clear(&x); + } + return res; +} -/* P-192 */ -#ifdef ECC192 -#define ECC192_KEYSIZE (24) -static const uint8_t stm32_ecc192_prime[ECC192_KEYSIZE] = { - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -}; -static const uint32_t stm32_ecc192_coef_sign = 1U; -static const uint8_t stm32_ecc192_coef[ECC192_KEYSIZE] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 -}; -static const uint8_t stm32_ecc192_coefB[ECC192_KEYSIZE] = { - 0x64, 0x21, 0x05, 0x19, 0xe5, 0x9c, 0x80, 0xe7, - 0x0f, 0xa7, 0xe9, 0xab, 0x72, 0x24, 0x30, 0x49, - 0xfe, 0xb8, 0xde, 0xec, 0xc1, 0x46, 0xb9, 0xb1 -}; -static const uint8_t stm32_ecc192_pointX[ECC192_KEYSIZE] = { - 0x18, 0x8D, 0xA8, 0x0E, 0xB0, 0x30, 0x90, 0xF6, - 0x7C, 0xBF, 0x20, 0xEB, 0x43, 0xA1, 0x88, 0x00, - 0xF4, 0xFF, 0x0A, 0xFD, 0x82, 0xFF, 0x10, 0x12 -}; -static const uint8_t stm32_ecc192_pointY[ECC192_KEYSIZE] = { - 0x07, 0x19, 0x2B, 0x95, 0xFF, 0xC8, 0xDA, 0x78, - 0x63, 0x10, 0x11, 0xED, 0x6B, 0x24, 0xCD, 0xD5, - 0x73, 0xF9, 0x77, 0xA1, 0x1E, 0x79, 0x48, 0x11 -}; -static const uint8_t stm32_ecc192_order[ECC192_KEYSIZE] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0x99, 0xDE, 0xF8, 0x36, - 0x14, 0x6B, 0xC9, 0xB1, 0xB4, 0xD2, 0x28, 0x31 -}; -#endif /* ECC192 */ - -/* P-224 */ -#ifdef ECC224 -#define ECC224_KEYSIZE (28) -static const uint8_t stm32_ecc224_prime[ECC224_KEYSIZE] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01 -}; -static const uint32_t stm32_ecc224_coef_sign = 1U; -static const uint8_t stm32_ecc224_coef[ECC224_KEYSIZE] = { - 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, 0x03 -}; -static const uint8_t stm32_ecc224_coefB[ECC224_KEYSIZE] = { - 0xb4, 0x05, 0x0a, 0x85, 0x0c, 0x04, 0xb3, 0xab, - 0xf5, 0x41, 0x32, 0x56, 0x50, 0x44, 0xb0, 0xb7, - 0xd7, 0xbf, 0xd8, 0xba, 0x27, 0x0b, 0x39, 0x43, - 0x23, 0x55, 0xff, 0xb4 -}; -static const uint8_t stm32_ecc224_pointX[ECC224_KEYSIZE] = { - 0xB7, 0x0E, 0x0C, 0xBD, 0x6B, 0xB4, 0xBF, 0x7F, - 0x32, 0x13, 0x90, 0xB9, 0x4A, 0x03, 0xC1, 0xD3, - 0x56, 0xC2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xD6, - 0x11, 0x5C, 0x1D, 0x21 -}; -static const uint8_t stm32_ecc224_pointY[ECC224_KEYSIZE] = { - 0xBD, 0x37, 0x63, 0x88, 0xB5, 0xF7, 0x23, 0xFB, - 0x4C, 0x22, 0xDF, 0xE6, 0xCD, 0x43, 0x75, 0xA0, - 0x5A, 0x07, 0x47, 0x64, 0x44, 0xD5, 0x81, 0x99, - 0x85, 0x00, 0x7E, 0x34 -}; -static const uint8_t stm32_ecc224_order[ECC224_KEYSIZE] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x16, 0xA2, - 0xE0, 0xB8, 0xF0, 0x3E, 0x13, 0xDD, 0x29, 0x45, - 0x5C, 0x5C, 0x2A, 0x3D -}; -#endif /* ECC224 */ - -/* P-256 */ -#ifdef ECC256 -#define ECC256_KEYSIZE (32) -static const uint8_t stm32_ecc256_prime[ECC256_KEYSIZE] = { - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -}; -static const uint32_t stm32_ecc256_coef_sign = 1U; -static const uint8_t stm32_ecc256_coef[ECC256_KEYSIZE] = { - 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, 0x03 -}; -static const uint8_t stm32_ecc256_coefB[ECC256_KEYSIZE] = { - 0x5a, 0xc6, 0x35, 0xd8, 0xaa, 0x3a, 0x93, 0xe7, - 0xb3, 0xeb, 0xbd, 0x55, 0x76, 0x98, 0x86, 0xbc, - 0x65, 0x1d, 0x06, 0xb0, 0xcc, 0x53, 0xb0, 0xf6, - 0x3b, 0xce, 0x3c, 0x3e, 0x27, 0xd2, 0x60, 0x4b -}; -static const uint8_t stm32_ecc256_pointX[ECC256_KEYSIZE] = { - 0x6b, 0x17, 0xd1, 0xf2, 0xe1, 0x2c, 0x42, 0x47, - 0xf8, 0xbc, 0xe6, 0xe5, 0x63, 0xa4, 0x40, 0xf2, - 0x77, 0x03, 0x7d, 0x81, 0x2d, 0xeb, 0x33, 0xa0, - 0xf4, 0xa1, 0x39, 0x45, 0xd8, 0x98, 0xc2, 0x96 -}; -static const uint8_t stm32_ecc256_pointY[ECC256_KEYSIZE] = { - 0x4f, 0xe3, 0x42, 0xe2, 0xfe, 0x1a, 0x7f, 0x9b, - 0x8e, 0xe7, 0xeb, 0x4a, 0x7c, 0x0f, 0x9e, 0x16, - 0x2b, 0xce, 0x33, 0x57, 0x6b, 0x31, 0x5e, 0xce, - 0xcb, 0xb6, 0x40, 0x68, 0x37, 0xbf, 0x51, 0xf5 -}; -static const uint8_t stm32_ecc256_order[ECC256_KEYSIZE] = { - 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e, 0x84, - 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x51 -}; -#endif /* ECC256 */ - -/* P-384 */ -#ifdef ECC384 -#define ECC384_KEYSIZE (48) -static const uint8_t stm32_ecc384_prime[ECC384_KEYSIZE] = { - 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, 0xFE, - 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF -}; -static const uint32_t stm32_ecc384_coef_sign = 1U; -static const uint8_t stm32_ecc384_coef[ECC384_KEYSIZE] = { - 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, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 -}; -static const uint8_t stm32_ecc384_coefB[ECC384_KEYSIZE] = { - 0xb3, 0x31, 0x2f, 0xa7, 0xe2, 0x3e, 0xe7, 0xe4, - 0x98, 0x8e, 0x05, 0x6b, 0xe3, 0xf8, 0x2d, 0x19, - 0x18, 0x1d, 0x9c, 0x6e, 0xfe, 0x81, 0x41, 0x12, - 0x03, 0x14, 0x08, 0x8f, 0x50, 0x13, 0x87, 0x5a, - 0xc6, 0x56, 0x39, 0x8d, 0x8a, 0x2e, 0xd1, 0x9d, - 0x2a, 0x85, 0xc8, 0xed, 0xd3, 0xec, 0x2a, 0xef -}; -static const uint8_t stm32_ecc384_pointX[ECC384_KEYSIZE] = { - 0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, - 0x8E, 0xB1, 0xC7, 0x1E, 0xF3, 0x20, 0xAD, 0x74, - 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98, - 0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54, 0x2A, 0x38, - 0x55, 0x02, 0xF2, 0x5D, 0xBF, 0x55, 0x29, 0x6C, - 0x3A, 0x54, 0x5E, 0x38, 0x72, 0x76, 0x0A, 0xB7, -}; -static const uint8_t stm32_ecc384_pointY[ECC384_KEYSIZE] = { - 0x36, 0x17, 0xDE, 0x4A, 0x96, 0x26, 0x2C, 0x6F, - 0x5D, 0x9E, 0x98, 0xBF, 0x92, 0x92, 0xDC, 0x29, - 0xF8, 0xF4, 0x1D, 0xBD, 0x28, 0x9A, 0x14, 0x7C, - 0xE9, 0xDA, 0x31, 0x13, 0xB5, 0xF0, 0xB8, 0xC0, - 0x0A, 0x60, 0xB1, 0xCE, 0x1D, 0x7E, 0x81, 0x9D, - 0x7A, 0x43, 0x1D, 0x7C, 0x90, 0xEA, 0x0E, 0x5F, -}; -static const uint8_t stm32_ecc384_order[ECC384_KEYSIZE] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37, 0x2D, 0xDF, - 0x58, 0x1A, 0x0D, 0xB2, 0x48, 0xB0, 0xA7, 0x7A, - 0xEC, 0xEC, 0x19, 0x6A, 0xCC, 0xC5, 0x29, 0x73 -}; -#endif /* ECC384 */ - -static int stm32_get_ecc_specs(const uint8_t **prime, const uint8_t **coef, - const uint8_t **coefB, const uint32_t **coef_sign, - const uint8_t **GenPointX, const uint8_t **GenPointY, const uint8_t **order, - int size) -{ - switch (size) { -#ifdef ECC256 - case 32: - if (prime) *prime = stm32_ecc256_prime; - if (coef) *coef = stm32_ecc256_coef; - if (coefB) *coefB = stm32_ecc256_coefB; - if (GenPointX) *GenPointX = stm32_ecc256_pointX; - if (GenPointY) *GenPointY = stm32_ecc256_pointY; - if (coef_sign) *coef_sign = &stm32_ecc256_coef_sign; - if (order) *order = stm32_ecc256_order; - break; -#endif -#ifdef ECC224 - case 28: - if (prime) *prime = stm32_ecc224_prime; - if (coef) *coef = stm32_ecc224_coef; - if (coefB) *coefB = stm32_ecc224_coefB; - if (GenPointX) *GenPointX = stm32_ecc224_pointX; - if (GenPointY) *GenPointY = stm32_ecc224_pointY; - if (coef_sign) *coef_sign = &stm32_ecc224_coef_sign; - if (order) *order = stm32_ecc224_order; - break; -#endif -#ifdef ECC192 - case 24: - if (prime) *prime = stm32_ecc192_prime; - if (coef) *coef = stm32_ecc192_coef; - if (coefB) *coefB = stm32_ecc192_coefB; - if (GenPointX) *GenPointX = stm32_ecc192_pointX; - if (GenPointY) *GenPointY = stm32_ecc192_pointY; - if (coef_sign) *coef_sign = &stm32_ecc192_coef_sign; - if (order) *order = stm32_ecc192_order; - break; -#endif -#ifdef ECC384 - case 48: - if (prime) *prime = stm32_ecc384_prime; - if (coef) *coef = stm32_ecc384_coef; - if (coefB) *coefB = stm32_ecc384_coefB; - if (GenPointX) *GenPointX = stm32_ecc384_pointX; - if (GenPointY) *GenPointY = stm32_ecc384_pointY; - if (coef_sign) *coef_sign = &stm32_ecc384_coef_sign; - if (order) *order = stm32_ecc384_order; - break; -#endif - default: - return NOT_COMPILED_IN; +/* convert hex string to unsigned char */ +static int stm32_getabs_from_hexstr(const char* hex, uint8_t* dst, int sz, + uint32_t *abs_sign) +{ + int res; + mp_int x; + + if (hex == NULL || dst == NULL || sz < 0) + return BAD_FUNC_ARG; + + res = mp_init(&x); + if (res == MP_OKAY) { + res = mp_read_radix(&x, hex, MP_RADIX_HEX); + /* optionally make abs(x) and capture sign */ + if (res == MP_OKAY && abs_sign != NULL) { + #if defined(USE_FAST_MATH) || defined(USE_INTEGER_HEAP_MATH) || \ + ((defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ + defined(WOLFSSL_SP_INT_NEGATIVE)) + *abs_sign = x.sign; + #else + *abs_sign = 1; /* default to negative */ + #endif + res = mp_abs(&x, &x); + } + if (res == MP_OKAY) + res = stm32_get_from_mp_int(dst, &x, sz); + mp_clear(&x); } - return 0; + return res; +} +static int stm32_get_from_hexstr(const char* hex, uint8_t* dst, int sz) +{ + return stm32_getabs_from_hexstr(hex, dst, sz, NULL); } +/* STM32 PKA supports up to 640-bit numbers */ +#define STM32_MAX_ECC_SIZE (80) + +#ifdef WOLFSSL_STM32_PKA_V2 +/* find curve based on prime/modulus and return order/coefB */ +static int stm32_get_curve_params(mp_int* modulus, + uint8_t* order, uint8_t* coefB) +{ + int res, i, found = 0; + mp_int modulusChk; + res = mp_init(&modulusChk); + if (res != MP_OKAY) + return res; + for (i = 0; ecc_sets[i].size != 0 && ecc_sets[i].name != NULL; i++) { + const ecc_set_type* curve = &ecc_sets[i]; + /* match based on curve prime */ + if ((res = mp_read_radix(&modulusChk, curve->prime, MP_RADIX_HEX)) == + MP_OKAY && (mp_cmp(modulus, &modulusChk) == MP_EQ)) + { + found = 1; + if (order) { + res = stm32_get_from_hexstr(curve->order, order, curve->size); + } + if (coefB) { + res = stm32_get_from_hexstr(curve->Bf, coefB, curve->size); + } + break; + } + } + mp_clear(&modulusChk); + if (!found && res == MP_OKAY) { + res = MP_RANGE; + } + return res; +} +#endif /* WOLFSSL_STM32_PKA_V2 */ + /** Perform a point multiplication (timing resistant) k The scalar to multiply by G The base point R [out] Destination for kG + a ECC curve parameter a modulus The modulus of the field the ECC curve is in + order curve order + rng Random Generator struct (not used) map Boolean whether to map back to affine or not - (1==map, 0 == leave in projective) + (1==map, 0 == leave in projective) return MP_OKAY on success */ -int wc_ecc_mulmod_ex(const mp_int *k, ecc_point *G, ecc_point *R, mp_int* a, - mp_int *modulus, int map, void* heap) + +int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, + mp_int* modulus, mp_int* o, WC_RNG* rng, int map, + void* heap) { PKA_ECCMulInTypeDef pka_mul; PKA_ECCMulOutTypeDef pka_mul_res; - uint8_t size; int szModulus; int szkbin; int status; @@ -828,8 +705,15 @@ uint8_t kbin[STM32_MAX_ECC_SIZE]; uint8_t PtXbin[STM32_MAX_ECC_SIZE]; uint8_t PtYbin[STM32_MAX_ECC_SIZE]; - const uint8_t *prime, *coef, *coefB, *gen_x, *gen_y, *order; - const uint32_t *coef_sign; + uint8_t prime[STM32_MAX_ECC_SIZE]; + uint8_t coefA[STM32_MAX_ECC_SIZE]; +#ifdef WOLFSSL_STM32_PKA_V2 + uint8_t coefB[STM32_MAX_ECC_SIZE]; + uint8_t order[STM32_MAX_ECC_SIZE]; +#endif + uint32_t coefA_sign = 1; + + (void)rng; XMEMSET(&pka_mul, 0x00, sizeof(PKA_ECCMulInTypeDef)); XMEMSET(&pka_mul_res, 0x00, sizeof(PKA_ECCMulOutTypeDef)); @@ -848,20 +732,33 @@ res = stm32_get_from_mp_int(Gxbin, G->x, szModulus); if (res == MP_OKAY) res = stm32_get_from_mp_int(Gybin, G->y, szModulus); - + if (res == MP_OKAY) + res = stm32_get_from_mp_int(prime, modulus, szModulus); + if (res == MP_OKAY) + res = stm32_getabs_from_mp_int(coefA, a, szModulus, &coefA_sign); +#ifdef WOLFSSL_STM32_PKA_V2 + XMEMSET(order, 0, sizeof(order)); + XMEMSET(coefB, 0, sizeof(coefB)); + if (res == MP_OKAY) { + if (o != NULL) { + /* use provided order and get coefB */ + res = stm32_get_from_mp_int(order, o, szModulus); + if (res == MP_OKAY) { + res = stm32_get_curve_params(modulus, NULL, coefB); + } + } + else { + /* get order and coefB for matching prime */ + res = stm32_get_curve_params(modulus, order, coefB); + } + } +#endif if (res != MP_OKAY) return res; - size = (uint8_t)szModulus; - /* find STM32_PKA friendly parameters for the selected curve */ - if (0 != stm32_get_ecc_specs(&prime, &coef, &coefB, &coef_sign, - &gen_x, &gen_y, &order, size)) { - return ECC_BAD_ARG_E; - } - pka_mul.modulusSize = szModulus; - pka_mul.coefSign = *coef_sign; - pka_mul.coefA = coef; + pka_mul.coefSign = coefA_sign; + pka_mul.coefA = coefA; pka_mul.modulus = prime; pka_mul.pointX = Gxbin; pka_mul.pointY = Gybin; @@ -870,9 +767,6 @@ #ifdef WOLFSSL_STM32_PKA_V2 pka_mul.coefB = coefB; pka_mul.primeOrder = order; -#else - (void)order; - (void)coefB; #endif status = HAL_PKA_ECCMul(&hpka, &pka_mul, HAL_MAX_DELAY); @@ -883,9 +777,9 @@ pka_mul_res.ptX = Gxbin; pka_mul_res.ptY = Gybin; HAL_PKA_ECCMul_GetResult(&hpka, &pka_mul_res); - res = mp_read_unsigned_bin(R->x, Gxbin, size); + res = mp_read_unsigned_bin(R->x, Gxbin, szModulus); if (res == MP_OKAY) { - res = mp_read_unsigned_bin(R->y, Gybin, size); + res = mp_read_unsigned_bin(R->y, Gybin, szModulus); #if defined(USE_FAST_MATH) || defined(USE_INTEGER_HEAP_MATH) || \ ((defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) && \ @@ -901,18 +795,14 @@ HAL_PKA_RAMReset(&hpka); (void)heap; - (void)a; /* uses computed (absolute value, |a| < p) */ return res; } -int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a, - mp_int* modulus, mp_int* order, WC_RNG* rng, int map, - void* heap) +int wc_ecc_mulmod_ex(const mp_int *k, ecc_point *G, ecc_point *R, mp_int* a, + mp_int *modulus, int map, void* heap) { - (void)order; - (void)rng; - return wc_ecc_mulmod_ex(k, G, R, a, modulus, map, heap); + return wc_ecc_mulmod_ex2(k, G, R, a, modulus, NULL, NULL, map, heap); } int ecc_map_ex(ecc_point* P, mp_int* modulus, mp_digit mp, int ct) @@ -929,8 +819,7 @@ word32 hashlen, int* res, ecc_key* key) { PKA_ECDSAVerifInTypeDef pka_ecc; - uint8_t size; - int szModulus; + int size; int szrbin; int status; uint8_t Rbin[STM32_MAX_ECC_SIZE]; @@ -939,47 +828,59 @@ uint8_t Qybin[STM32_MAX_ECC_SIZE]; uint8_t Hashbin[STM32_MAX_ECC_SIZE]; uint8_t privKeybin[STM32_MAX_ECC_SIZE]; - const uint8_t *prime, *coef, *gen_x, *gen_y, *order; - const uint32_t *coef_sign; + uint8_t prime[STM32_MAX_ECC_SIZE]; + uint8_t coefA[STM32_MAX_ECC_SIZE]; + uint8_t gen_x[STM32_MAX_ECC_SIZE]; + uint8_t gen_y[STM32_MAX_ECC_SIZE]; + uint8_t order[STM32_MAX_ECC_SIZE]; + uint32_t coefA_sign = 1; + XMEMSET(&pka_ecc, 0x00, sizeof(PKA_ECDSAVerifInTypeDef)); - if (r == NULL || s == NULL || hash == NULL || res == NULL || key == NULL) { + if (r == NULL || s == NULL || hash == NULL || res == NULL || key == NULL || + key->dp == NULL) { return ECC_BAD_ARG_E; } *res = 0; - szModulus = mp_unsigned_bin_size(key->pubkey.x); szrbin = mp_unsigned_bin_size(r); + size = wc_ecc_size(key); status = stm32_get_from_mp_int(Rbin, r, szrbin); if (status == MP_OKAY) status = stm32_get_from_mp_int(Sbin, s, szrbin); if (status == MP_OKAY) - status = stm32_get_from_mp_int(Qxbin, key->pubkey.x, szModulus); + status = stm32_get_from_mp_int(Qxbin, key->pubkey.x, size); if (status == MP_OKAY) - status = stm32_get_from_mp_int(Qybin, key->pubkey.y, szModulus); + status = stm32_get_from_mp_int(Qybin, key->pubkey.y, size); if (status == MP_OKAY) status = stm32_get_from_mp_int(privKeybin, wc_ecc_key_get_priv(key), - szModulus); + size); if (status != MP_OKAY) return status; - size = (uint8_t)szModulus; + /* find parameters for the selected curve */ - if (0 != stm32_get_ecc_specs(&prime, &coef, NULL, &coef_sign, - &gen_x, &gen_y, &order, size)) { - return ECC_BAD_ARG_E; - } + status = stm32_get_from_hexstr(key->dp->prime, prime, size); + if (status == MP_OKAY) + status = stm32_get_from_hexstr(key->dp->order, order, size); + if (status == MP_OKAY) + status = stm32_get_from_hexstr(key->dp->Gx, gen_x, size); + if (status == MP_OKAY) + status = stm32_get_from_hexstr(key->dp->Gy, gen_y, size); + if (status == MP_OKAY) + status = stm32_getabs_from_hexstr(key->dp->Af, coefA, size, &coefA_sign); + if (status != MP_OKAY) + return status; pka_ecc.primeOrderSize = size; pka_ecc.modulusSize = size; - pka_ecc.coefSign = *coef_sign; - pka_ecc.coef = coef; + pka_ecc.coefSign = coefA_sign; + pka_ecc.coef = coefA; pka_ecc.modulus = prime; pka_ecc.basePointX = gen_x; pka_ecc.basePointY = gen_y; pka_ecc.primeOrder = order; - pka_ecc.pPubKeyCurvePtX = Qxbin; pka_ecc.pPubKeyCurvePtY = Qybin; pka_ecc.RSign = Rbin; @@ -1025,46 +926,67 @@ uint8_t Rbin[STM32_MAX_ECC_SIZE]; uint8_t Sbin[STM32_MAX_ECC_SIZE]; uint8_t Hashbin[STM32_MAX_ECC_SIZE]; - const uint8_t *prime, *coef, *coefB, *gen_x, *gen_y, *order; - const uint32_t *coef_sign; + uint8_t prime[STM32_MAX_ECC_SIZE]; + uint8_t coefA[STM32_MAX_ECC_SIZE]; +#ifdef WOLFSSL_STM32_PKA_V2 + uint8_t coefB[STM32_MAX_ECC_SIZE]; +#endif + uint8_t gen_x[STM32_MAX_ECC_SIZE]; + uint8_t gen_y[STM32_MAX_ECC_SIZE]; + uint8_t order[STM32_MAX_ECC_SIZE]; + uint32_t coefA_sign = 1; + XMEMSET(&pka_ecc, 0x00, sizeof(PKA_ECDSASignInTypeDef)); XMEMSET(&pka_ecc_out, 0x00, sizeof(PKA_ECDSASignOutTypeDef)); - if (r == NULL || s == NULL || hash == NULL || key == NULL) { + if (r == NULL || s == NULL || hash == NULL || key == NULL || + key->dp == NULL) { return ECC_BAD_ARG_E; } - mp_init(&gen_k); - mp_init(&order_mp); - size = wc_ecc_size(key); - status = stm32_get_from_mp_int(Keybin, wc_ecc_key_get_priv(key), size); + /* find parameters for the selected curve */ + status = stm32_get_from_hexstr(key->dp->prime, prime, size); + if (status == MP_OKAY) + status = stm32_get_from_hexstr(key->dp->order, order, size); + if (status == MP_OKAY) + status = stm32_get_from_hexstr(key->dp->Gx, gen_x, size); + if (status == MP_OKAY) + status = stm32_get_from_hexstr(key->dp->Gy, gen_y, size); + if (status == MP_OKAY) + status = stm32_getabs_from_hexstr(key->dp->Af, coefA, size, &coefA_sign); +#ifdef WOLFSSL_STM32_PKA_V2 + if (status == MP_OKAY) + status = stm32_get_from_hexstr(key->dp->Bf, coefB, size); +#endif if (status != MP_OKAY) return status; - /* find parameters for the selected curve */ - if (0 != stm32_get_ecc_specs(&prime, &coef, &coefB, &coef_sign, - &gen_x, &gen_y, &order, size)) { - return ECC_BAD_ARG_E; - } - + /* generate random part of "k" */ + mp_init(&gen_k); + mp_init(&order_mp); status = mp_read_unsigned_bin(&order_mp, order, size); if (status == MP_OKAY) status = wc_ecc_gen_k(rng, size, &gen_k, &order_mp); if (status == MP_OKAY) status = stm32_get_from_mp_int(Intbin, &gen_k, size); + mp_clear(&gen_k); + mp_clear(&order_mp); + if (status != MP_OKAY) + return status; + + /* get private part of "k" */ + status = stm32_get_from_mp_int(Keybin, wc_ecc_key_get_priv(key), size); if (status != MP_OKAY) return status; pka_ecc.primeOrderSize = size; pka_ecc.modulusSize = size; - pka_ecc.coefSign = *coef_sign; - pka_ecc.coef = coef; + pka_ecc.coefSign = coefA_sign; + pka_ecc.coef = coefA; #ifdef WOLFSSL_STM32_PKA_V2 pka_ecc.coefB = coefB; -#else - (void)coefB; #endif pka_ecc.modulus = prime; pka_ecc.basePointX = gen_x; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stsafe.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stsafe.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stsafe.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/st/stsafe.c 2024-08-03 07:30:00.000000000 +0000 @@ -19,11 +19,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +#include #include #include #ifndef STSAFE_INTERFACE_PRINTF -#define STSAFE_INTERFACE_PRINTF(...) +#define STSAFE_INTERFACE_PRINTF(...) WC_DO_NOTHING #endif #ifdef WOLFSSL_STSAFEA100 @@ -538,7 +539,7 @@ &otherKeyY[0], (word32*)&otherKeyY_len); if (rc == 0) { /* Compute shared secret */ - *info->pk.ecdh.outlen = 0; + *info->pk.ecdh.outlen = 0; rc = stsafe_interface_shared_secret( #ifdef WOLFSSL_STSAFE_TAKES_SLOT STSAFE_A_SLOT_0, @@ -558,7 +559,7 @@ #endif /* HAVE_ECC */ /* need to return negative here for error */ - if (rc != 0 && rc != CRYPTOCB_UNAVAILABLE) { + if (rc != 0 && rc != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { WOLFSSL_MSG("STSAFE: CryptoCb failed"); #ifdef USE_STSAFE_VERBOSE STSAFE_INTERFACE_PRINTF("STSAFE: CryptoCb failed %d\n", rc); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-aes.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-aes.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-aes.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-aes.c 2024-08-03 07:30:00.000000000 +0000 @@ -26,10 +26,8 @@ #include -#ifndef NO_AES +#if !defined(NO_AES) && defined(WOLFSSL_TI_CRYPT) - -#if defined(WOLFSSL_TI_CRYPT) #include #include @@ -37,6 +35,13 @@ #include #include +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + #include "inc/hw_aes.h" #include "inc/hw_memmap.h" #include "inc/hw_ints.h" @@ -45,7 +50,14 @@ #include "driverlib/rom_map.h" #include "driverlib/rom.h" -static int AesSetIV(Aes* aes, const byte* iv) +#define AES_CFG_MODE_CTR_NOCTR (AES_CFG_MODE_CTR + 100) +#define IS_ALIGN16(p) (((unsigned int)(p) & 0xf) == 0) +#define ROUNDUP_16(n) ((n+15) & 0xfffffff0) +#ifndef TI_BUFFSIZE +#define TI_BUFFSIZE 1024 +#endif + +static int AesSetIV(Aes* aes, const byte* iv) { if (aes == NULL) return BAD_FUNC_ARG; @@ -58,196 +70,253 @@ return 0; } -WOLFSSL_API int wc_AesSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, - int dir) +int wc_AesSetKey(Aes* aes, const byte* key, word32 len, const byte* iv, int dir) { - if(!wolfSSL_TI_CCMInit())return 1 ; - if ((aes == NULL) || (key == NULL) || (iv == NULL)) + if (!wolfSSL_TI_CCMInit()) + return 1; + if ((aes == NULL) || (key == NULL)) return BAD_FUNC_ARG; - if(!((dir == AES_ENCRYPTION) || (dir == AES_DECRYPTION))) + if (!((dir == AES_ENCRYPTION) || (dir == AES_DECRYPTION))) return BAD_FUNC_ARG; - switch(len) { - case 16: aes->keylen = AES_CFG_KEY_SIZE_128BIT ; break ; - case 24: aes->keylen = AES_CFG_KEY_SIZE_192BIT ; break ; - case 32: aes->keylen = AES_CFG_KEY_SIZE_256BIT ; break ; - default: return BAD_FUNC_ARG; + switch (len) { + #ifdef WOLFSSL_AES_128 + case 16: + break; + #endif + #ifdef WOLFSSL_AES_192 + case 24: + break; + #endif + #ifdef WOLFSSL_AES_256 + case 32: + break; + #endif + default: + return BAD_FUNC_ARG; } + aes->keylen = len; + aes->rounds = len / 4 + 6; - XMEMCPY(aes->key, key, len) ; - #ifdef WOLFSSL_AES_COUNTER + XMEMCPY(aes->key, key, len); +#ifdef WOLFSSL_AES_COUNTER aes->left = 0; - #endif /* WOLFSSL_AES_COUNTER */ +#endif return AesSetIV(aes, iv); } -#define AES_CFG_MODE_CTR_NOCTR AES_CFG_MODE_CTR+100 -#define IS_ALIGN16(p) (((unsigned int)(p)&0xf) == 0) +int wc_AesGetKeySize(Aes* aes, word32* keySize) +{ + int ret = 0; -static int AesAlign16(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) + if (aes == NULL || keySize == NULL) { + return BAD_FUNC_ARG; + } + + switch (aes->rounds) { +#ifdef WOLFSSL_AES_128 + case 10: + *keySize = 16; + break; +#endif +#ifdef WOLFSSL_AES_192 + case 12: + *keySize = 24; + break; +#endif +#ifdef WOLFSSL_AES_256 + case 14: + *keySize = 32; + break; +#endif + default: + *keySize = 0; + ret = BAD_FUNC_ARG; + } + + return ret; +} + +static int AesAlign16(Aes* aes, byte* out, const byte* in, word32 sz, + word32 dir, word32 mode) { - wolfSSL_TI_lockCCM() ; + /* Processed aligned chunk to HW AES */ + wolfSSL_TI_lockCCM(); ROM_AESReset(AES_BASE); - ROM_AESConfigSet(AES_BASE, (aes->keylen | dir | - (mode==AES_CFG_MODE_CTR_NOCTR ? AES_CFG_MODE_CTR : mode))); + ROM_AESConfigSet(AES_BASE, (aes->keylen-8 | dir | + (mode == AES_CFG_MODE_CTR_NOCTR ? AES_CFG_MODE_CTR : mode))); ROM_AESIVSet(AES_BASE, (uint32_t *)aes->reg); - ROM_AESKey1Set(AES_BASE, (uint32_t *)aes->key, aes->keylen); - if((dir == AES_CFG_DIR_DECRYPT)&& (mode == AES_CFG_MODE_CBC)) + ROM_AESKey1Set(AES_BASE, (uint32_t *)aes->key, aes->keylen-8); + if (dir == AES_CFG_DIR_DECRYPT && mode == AES_CFG_MODE_CBC) { /* if input and output same will overwrite input iv */ XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); + } ROM_AESDataProcess(AES_BASE, (uint32_t *)in, (uint32_t *)out, sz); - wolfSSL_TI_unlockCCM() ; + wolfSSL_TI_unlockCCM(); /* store iv for next call */ - if(mode == AES_CFG_MODE_CBC){ - if(dir == AES_CFG_DIR_ENCRYPT) + if (mode == AES_CFG_MODE_CBC) { + if (dir == AES_CFG_DIR_ENCRYPT) XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); else XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); } - if(mode == AES_CFG_MODE_CTR) { + if (mode == AES_CFG_MODE_CTR) { do { - int i ; + int i; for (i = AES_BLOCK_SIZE - 1; i >= 0; i--) { - if (++((byte *)aes->reg)[i]) - break ; + if (++((byte*)aes->reg)[i]) + break; } - sz -= AES_BLOCK_SIZE ; - } while((int)sz > 0) ; + sz -= AES_BLOCK_SIZE; + } while ((int)sz > 0); } - return 0 ; + return true; } -static int AesProcess(Aes* aes, byte* out, const byte* in, word32 sz, word32 dir, word32 mode) +static int AesProcess(Aes* aes, byte* out, const byte* in, word32 sz, + word32 dir, word32 mode) { - const byte * in_p ; byte * out_p ; - word32 size ; - #define TI_BUFFSIZE 1024 - byte buff[TI_BUFFSIZE] ; + const byte *in_p; byte *out_p; + word32 size; + byte buff[TI_BUFFSIZE]; if ((aes == NULL) || (in == NULL) || (out == NULL)) return BAD_FUNC_ARG; - if(sz % AES_BLOCK_SIZE) + if (sz % AES_BLOCK_SIZE) return BAD_FUNC_ARG; - while(sz > 0) { - size = sz ; in_p = in ; out_p = out ; - if(!IS_ALIGN16(in)){ - size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; - XMEMCPY(buff, in, size) ; - in_p = (const byte *)buff ; + while (sz > 0) { + size = sz; in_p = in; out_p = out; + if (!IS_ALIGN16(in)) { + size = sz > TI_BUFFSIZE ? TI_BUFFSIZE : sz; + XMEMCPY(buff, in, size); + in_p = (const byte*)buff; } - if(!IS_ALIGN16(out)){ - size = sz>TI_BUFFSIZE ? TI_BUFFSIZE : sz ; - out_p = buff ; + if (!IS_ALIGN16(out)) { + size = sz > TI_BUFFSIZE ? TI_BUFFSIZE : sz; + out_p = buff; } - AesAlign16(aes, out_p, in_p, size, dir, mode) ; + AesAlign16(aes, out_p, in_p, size, dir, mode); - if(!IS_ALIGN16(out)){ - XMEMCPY(out, buff, size) ; + if (!IS_ALIGN16(out)) { + XMEMCPY(out, buff, size); } - sz -= size ; in += size ; out += size ; + sz -= size; in += size; out += size; } - return 0 ; + return 0; } -WOLFSSL_API int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +int wc_AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - return AesProcess(aes, out, in, sz, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; + return AesProcess(aes, out, in, sz, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC); } -WOLFSSL_API int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) +int wc_AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - return AesProcess(aes, out, in, sz, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; + return AesProcess(aes, out, in, sz, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC); } #ifdef WOLFSSL_AES_COUNTER -WOLFSSL_API int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) +int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) { - char out_block[AES_BLOCK_SIZE] ; - int odd ; - int even ; - char *tmp ; /* (char *)aes->tmp, for short */ - int ret; - - tmp = (char *)aes->tmp ; - if(aes->left) { - if((aes->left + sz) >= AES_BLOCK_SIZE){ - odd = AES_BLOCK_SIZE - aes->left ; - } else { - odd = sz ; - } - XMEMCPY(tmp+aes->left, in, odd) ; - if((odd+aes->left) == AES_BLOCK_SIZE){ - ret = AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, - AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR) ; - if (ret != 0) - return ret; - XMEMCPY(out, out_block+aes->left, odd) ; - aes->left = 0 ; - XMEMSET(tmp, 0x0, AES_BLOCK_SIZE) ; - } - in += odd ; - out+= odd ; - sz -= odd ; - } - odd = sz % AES_BLOCK_SIZE ; /* if there is tail flagment */ - if(sz / AES_BLOCK_SIZE) { - even = (sz/AES_BLOCK_SIZE)*AES_BLOCK_SIZE ; - ret = AesProcess(aes, out, in, even, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR); - if (ret != 0) - return ret; - out += even ; - in += even ; - } - if(odd) { - XMEMSET(tmp+aes->left, 0x0, AES_BLOCK_SIZE - aes->left) ; - XMEMCPY(tmp+aes->left, in, odd) ; - ret = AesProcess(aes, (byte *)out_block, (byte const *)tmp, AES_BLOCK_SIZE, - AES_CFG_DIR_ENCRYPT, - AES_CFG_MODE_CTR_NOCTR /* Counter mode without counting IV */ - ); - if (ret != 0) - return ret; - XMEMCPY(out, out_block+aes->left,odd) ; - aes->left += odd ; - } - return 0; + char out_block[AES_BLOCK_SIZE]; + int odd; + int even; + char *tmp; /* (char *)aes->tmp, for short */ + int ret; + + tmp = (char *)aes->tmp; + if (aes->left) { + if ((aes->left + sz) >= AES_BLOCK_SIZE) { + odd = AES_BLOCK_SIZE - aes->left; + } else { + odd = sz; + } + XMEMCPY(tmp+aes->left, in, odd); + if ((odd+aes->left) == AES_BLOCK_SIZE) { + ret = AesProcess(aes, (byte*)out_block, (byte const *)tmp, AES_BLOCK_SIZE, + AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR); + if (ret != 0) + return ret; + XMEMCPY(out, out_block+aes->left, odd); + aes->left = 0; + XMEMSET(tmp, 0x0, AES_BLOCK_SIZE); + } + in += odd; + out+= odd; + sz -= odd; + } + odd = sz % AES_BLOCK_SIZE; /* if there is tail fragment */ + if (sz / AES_BLOCK_SIZE) { + even = (sz/AES_BLOCK_SIZE)*AES_BLOCK_SIZE; + ret = AesProcess(aes, out, in, even, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CTR); + if (ret != 0) + return ret; + out += even; + in += even; + } + if (odd) { + XMEMSET(tmp+aes->left, 0x0, AES_BLOCK_SIZE - aes->left); + XMEMCPY(tmp+aes->left, in, odd); + ret = AesProcess(aes, (byte*)out_block, (byte const *)tmp, AES_BLOCK_SIZE, + AES_CFG_DIR_ENCRYPT, + AES_CFG_MODE_CTR_NOCTR /* Counter mode without counting IV */ + ); + if (ret != 0) + return ret; + XMEMCPY(out, out_block+aes->left,odd); + aes->left += odd; + } + return 0; } -#endif +#endif /* WOLFSSL_AES_COUNTER */ /* AES-DIRECT */ #if defined(WOLFSSL_AES_DIRECT) -WOLFSSL_API int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) +int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in) { - return AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_ENCRYPT, AES_CFG_MODE_CBC) ; + return AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_ENCRYPT, + AES_CFG_MODE_CBC); } -WOLFSSL_API int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) +int wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in) { - return AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_DECRYPT, AES_CFG_MODE_CBC) ; + return AesProcess(aes, out, in, AES_BLOCK_SIZE, AES_CFG_DIR_DECRYPT, + AES_CFG_MODE_CBC); } -WOLFSSL_API int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, - const byte* iv, int dir) +int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, const byte* iv, + int dir) { - return(wc_AesSetKey(aes, key, len, iv, dir)) ; + return wc_AesSetKey(aes, key, len, iv, dir); } -#endif +#endif /* WOLFSSL_AES_DIRECT */ #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) -static int AesAuthSetKey(Aes* aes, const byte* key, word32 keySz) +#ifndef NO_RNG +static WC_INLINE void IncCtr(byte* ctr, word32 ctrSz) +{ + int i; + for (i = (int)ctrSz - 1; i >= 0; i--) { + if (++ctr[i]) + break; + } +} +#endif + +static int AesAuthSetKey(Aes* aes, const byte* key, word32 keySz) { byte nonce[AES_BLOCK_SIZE]; if ((aes == NULL) || (key == NULL)) - return BAD_FUNC_ARG ; + return BAD_FUNC_ARG; if (!((keySz == 16) || (keySz == 24) || (keySz == 32))) - return BAD_FUNC_ARG ; + return BAD_FUNC_ARG; XMEMSET(nonce, 0, sizeof(nonce)); return wc_AesSetKey(aes, key, keySz, nonce, AES_ENCRYPTION); @@ -255,166 +324,231 @@ static int AesAuthArgCheck(Aes* aes, byte* out, const byte* in, word32 inSz, - const byte* nonce, word32 nonceSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, word32 *M, word32 *L) + const byte* nonce, word32 nonceSz, + const byte* authTag, word32 authTagSz, + word32 *M, word32 *L) { - (void) authInSz ; - if((aes == NULL)||(nonce == NULL)||(authTag== NULL)||(authIn == NULL)) + if (aes == NULL || nonce == NULL || authTag == NULL) return BAD_FUNC_ARG; - if((inSz != 0) && ((out == NULL)||(in == NULL))) + if (inSz != 0 && (out == NULL || in == NULL)) return BAD_FUNC_ARG; - switch(authTagSz){ - case 4: - *M = AES_CFG_CCM_M_4; break ; + switch (authTagSz) { + case 4: + *M = AES_CFG_CCM_M_4; break; case 6: - *M = AES_CFG_CCM_M_6; break ; + *M = AES_CFG_CCM_M_6; break; case 8: - *M = AES_CFG_CCM_M_8; break ; + *M = AES_CFG_CCM_M_8; break; case 10: - *M = AES_CFG_CCM_M_10; break ; + *M = AES_CFG_CCM_M_10; break; case 12: - *M = AES_CFG_CCM_M_12; break ; + *M = AES_CFG_CCM_M_12; break; case 14: - *M = AES_CFG_CCM_M_14; break ; + *M = AES_CFG_CCM_M_14; break; case 16: - *M = AES_CFG_CCM_M_16; break ; + *M = AES_CFG_CCM_M_16; break; default: - return 1 ; + return 1; } - switch(nonceSz){ + switch (nonceSz) { case 7: - *L = AES_CFG_CCM_L_8; break ; + *L = AES_CFG_CCM_L_8; break; case 8: - *L = AES_CFG_CCM_L_7; break ; + *L = AES_CFG_CCM_L_7; break; case 9: - *L = AES_CFG_CCM_L_6; break ; + *L = AES_CFG_CCM_L_6; break; case 10: - *L = AES_CFG_CCM_L_5; break ; + *L = AES_CFG_CCM_L_5; break; case 11: - *L = AES_CFG_CCM_L_4; break ; + *L = AES_CFG_CCM_L_4; break; case 12: - *L = AES_CFG_CCM_L_3; break ; + *L = AES_CFG_CCM_L_3; break; case 13: - *L = AES_CFG_CCM_L_2; break ; + *L = AES_CFG_CCM_L_2; break; case 14: - *L = AES_CFG_CCM_L_1; break ; + *L = AES_CFG_CCM_L_1; break; default: return 1; } - return 0 ; + return 0; } -static void AesAuthSetIv(Aes *aes, const byte *nonce, word32 len, word32 L, int mode) { +static void AesAuthSetIv(Aes *aes, const byte *nonce, word32 len, word32 L, + int mode) +{ + if (mode == AES_CFG_MODE_CCM) { + XMEMSET(aes->reg, 0, 16); + switch (L) { + case AES_CFG_CCM_L_8: + aes->reg[0] = 0x7; break; + case AES_CFG_CCM_L_7: + aes->reg[0] = 0x6; break; + case AES_CFG_CCM_L_6: + aes->reg[0] = 0x5; break; + case AES_CFG_CCM_L_5: + aes->reg[0] = 0x4; break; + case AES_CFG_CCM_L_4: + aes->reg[0] = 0x3; break; + case AES_CFG_CCM_L_3: + aes->reg[0] = 0x2; break; + case AES_CFG_CCM_L_2: + aes->reg[0] = 0x1; break; + case AES_CFG_CCM_L_1: + aes->reg[0] = 0x0; break; + } + XMEMCPY(((byte*)aes->reg)+1, nonce, len); + } + else { /* GCM */ + if (len == GCM_NONCE_MID_SZ) { + byte *b = (byte*)aes->reg; + if (nonce != NULL) + XMEMCPY(aes->reg, nonce, len); + b[AES_BLOCK_SIZE-4] = 0; + b[AES_BLOCK_SIZE-3] = 0; + b[AES_BLOCK_SIZE-2] = 0; + b[AES_BLOCK_SIZE-1] = 1; - if(mode == AES_CFG_MODE_CCM){ - XMEMSET(aes->reg, 0, 16) ; - switch(L){ - case AES_CFG_CCM_L_8: - aes->reg[0] = 0x7; break ; - case AES_CFG_CCM_L_7: - aes->reg[0] = 0x6; break ; - case AES_CFG_CCM_L_6: - aes->reg[0] = 0x5; break ; - case AES_CFG_CCM_L_5: - aes->reg[0] = 0x4; break ; - case AES_CFG_CCM_L_4: - aes->reg[0] = 0x3; break ; - case AES_CFG_CCM_L_3: - aes->reg[0] = 0x2; break ; - case AES_CFG_CCM_L_2: - aes->reg[0] = 0x1; break ; - case AES_CFG_CCM_L_1: - aes->reg[0] = 0x0; break ; - } - XMEMCPY(((byte *)aes->reg)+1, nonce, len) ; - } else { - byte *b = (byte *)aes->reg ; - XMEMSET(aes->reg, 0, AES_BLOCK_SIZE); - XMEMCPY(aes->reg, nonce, len); - b[AES_BLOCK_SIZE-4] = 0 ; - b[AES_BLOCK_SIZE-3] = 0 ; - b[AES_BLOCK_SIZE-2] = 0 ; - b[AES_BLOCK_SIZE-1] = 1 ; - } -} - -#define RoundUp16(n) ((n+15)&0xfffffff0) -#define FREE_ALL \ - if(in_save) XFREE(in_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ - if(out_save) XFREE(out_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ - if(authIn_save)XFREE(authIn_save, NULL, DYNAMIC_TYPE_TMP_BUFFER);\ - if(nonce_save) XFREE(nonce_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + } + else { + word32 zeros[AES_BLOCK_SIZE/sizeof(word32)]; + word32 subkey[AES_BLOCK_SIZE/sizeof(word32)]; + word32 nonce_padded[AES_BLOCK_SIZE/sizeof(word32)]; + word32 i; + + XMEMSET(zeros, 0, sizeof(zeros)); /* init to zero */ + + wolfSSL_TI_lockCCM(); + /* Perform a basic GHASH operation with the hashsubkey and IV */ + /* get subkey */ + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen-8) | AES_CFG_DIR_ENCRYPT | AES_CFG_MODE_ECB); + ROM_AESKey1Set(AES_BASE, aes->key, (aes->keylen-8)); + ROM_AESDataProcess(AES_BASE, zeros, subkey, sizeof zeros); + + /* GHASH */ + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, AES_CFG_KEY_SIZE_128BIT | AES_CFG_MODE_GCM_HLY0ZERO); + ROM_AESKey2Set(AES_BASE, subkey, AES_CFG_KEY_SIZE_128BIT); + + ROM_AESLengthSet(AES_BASE, len); + ROM_AESAuthLengthSet(AES_BASE, 0); + + /* copy nonce */ + for (i = 0; i < len; i += AES_BLOCK_SIZE) { + word32 nonceSz = len - i; + if (nonceSz > AES_BLOCK_SIZE) + nonceSz = AES_BLOCK_SIZE; + XMEMSET(nonce_padded, 0, sizeof(nonce_padded)); + XMEMCPY(nonce_padded, (word32*)(nonce + i), nonceSz); + ROM_AESDataWrite(AES_BASE, nonce_padded); + } + + ROM_AESTagRead(AES_BASE, aes->reg); + wolfSSL_TI_unlockCCM(); + } + } +} static int AesAuthEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, const byte* nonce, word32 nonceSz, byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz, int mode) { - word32 M, L ; - byte *in_a, *in_save ; - byte *out_a, *out_save ; - byte *authIn_a, *authIn_save ; - byte *nonce_a, *nonce_save ; - word32 tmpTag[4] ; - int ret ; - - if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) - == BAD_FUNC_ARG)return BAD_FUNC_ARG ; - - /* 16 byte padding */ - in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; - if((inSz%16)==0){ - in_save = NULL ; in_a = (byte *)in ; - out_save = NULL ; out_a = out ; - } else { - if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E ; } - in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; - - if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E ; } - out_a = out_save ; - } - - if((authInSz%16)==0){ - authIn_save = NULL ; authIn_a = (byte *)authIn ; - } else { - if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E ; } - authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; - } - - if((nonceSz%16)==0){ - nonce_save = NULL ; nonce_a = (byte *)nonce ; - } else { - if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E; } - nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; + int ret; + word32 M, L; + byte *in_a, *in_save = NULL; + byte *out_a, *out_save = NULL; + byte *authIn_a, *authIn_save = NULL; + word32 tmpTag[AES_BLOCK_SIZE/sizeof(word32)]; + + ret = AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, + authTagSz, &M, &L); + if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { + return ret; + } + + AesAuthSetIv(aes, nonce, nonceSz, L, mode); + + if (inSz == 0 && authInSz == 0) { + /* This is a special case that cannot use the GCM mode because the + * data and AAD lengths are both zero. The work around is to perform + * an ECB encryption on IV. */ + wolfSSL_TI_lockCCM(); + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen-8) | AES_CFG_DIR_ENCRYPT | AES_CFG_MODE_ECB); + ROM_AESKey1Set(AES_BASE, aes->key, (aes->keylen-8)); + ROM_AESDataProcess(AES_BASE, aes->reg, tmpTag, AES_BLOCK_SIZE); + wolfSSL_TI_unlockCCM(); + XMEMCPY(authTag, tmpTag, authTagSz); + return 0; + } + + /* Make sure all pointers are 16 byte aligned */ + if (IS_ALIGN16(inSz)) { + in_save = NULL; in_a = (byte*)in; + out_save = NULL; out_a = out; + } + else { + in_save = XMALLOC(ROUNDUP_16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (in_save == NULL) { ret = MEMORY_E; goto exit; } + in_a = in_save; + XMEMSET(in_a, 0, ROUNDUP_16(inSz)); + XMEMCPY(in_a, in, inSz); + + out_save = XMALLOC(ROUNDUP_16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (out_save == NULL) { ret = MEMORY_E; goto exit; } + out_a = out_save; + } + + if (IS_ALIGN16(authInSz)) { + authIn_save = NULL; authIn_a = (byte*)authIn; + } + else { + authIn_save = XMALLOC(ROUNDUP_16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (authIn_save == NULL) { ret = MEMORY_E; goto exit; } + + authIn_a = authIn_save; + XMEMSET(authIn_a, 0, ROUNDUP_16(authInSz)); + XMEMCPY(authIn_a, authIn, authInSz); } - /* do aes-ccm */ - AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; + /* Do AES-CCM/GCM Cipher with Auth */ + wolfSSL_TI_lockCCM(); ROM_AESReset(AES_BASE); - ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_ENCRYPT | - AES_CFG_CTR_WIDTH_128 | - mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; + ROM_AESConfigSet(AES_BASE, + (aes->keylen-8 | + AES_CFG_DIR_ENCRYPT | + AES_CFG_CTR_WIDTH_128 | + mode | + ((mode == AES_CFG_MODE_CCM) ? (L | M) : 0 )) + ); ROM_AESIVSet(AES_BASE, aes->reg); - ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); - ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, - (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); - if(ret == false){ - XMEMSET(out, 0, inSz) ; - XMEMSET(authTag, 0, authTagSz) ; - } else { - XMEMCPY(out, out_a, inSz) ; - XMEMCPY(authTag, tmpTag, authTagSz) ; - } + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen-8); - FREE_ALL; - return 0 ; + ret = ROM_AESDataProcessAuth(AES_BASE, + (unsigned int*)in_a, (unsigned int*)out_a, inSz, + (unsigned int*)authIn_a, authInSz, + (unsigned int*)tmpTag); + wolfSSL_TI_unlockCCM(); + + if (ret == false) { + XMEMSET(out, 0, inSz); + XMEMSET(authTag, 0, authTagSz); + ret = AES_GCM_AUTH_E; + } + else { + XMEMCPY(out, out_a, inSz); + XMEMCPY(authTag, tmpTag, authTagSz); + ret = 0; + } + +exit: + if (in_save) XFREE(in_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (out_save) XFREE(out_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (authIn_save)XFREE(authIn_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + return ret; } static int AesAuthDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, @@ -422,78 +556,110 @@ const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz, int mode) { - word32 M, L ; - byte *in_a, *in_save ; - byte *out_a, *out_save ; - byte *authIn_a, *authIn_save ; - byte *nonce_a, *nonce_save ; - word32 tmpTag[4] ; - bool ret ; - - if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) - == BAD_FUNC_ARG)return BAD_FUNC_ARG ; - - /* 16 byte padding */ - in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; - if((inSz%16)==0){ - in_save = NULL ; in_a = (byte *)in ; - out_save = NULL ; out_a = out ; - } else { - if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E;} - in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; - - if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E;} - out_a = out_save ; - } - - if((authInSz%16)==0){ - authIn_save = NULL ; authIn_a = (byte *)authIn ; - } else { - if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E; } - authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; - } - - if((nonceSz%16)==0){ - nonce_save = NULL ; nonce_a = (byte *)nonce ; - } else { - if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL){ - FREE_ALL; return MEMORY_E; } - nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; + int ret; + word32 M, L; + byte *in_a, *in_save = NULL; + byte *out_a, *out_save = NULL; + byte *authIn_a, *authIn_save = NULL; + word32 tmpTag[AES_BLOCK_SIZE/sizeof(word32)]; + + ret = AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, + authTagSz, &M, &L); + if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { + return ret; + } + + AesAuthSetIv(aes, nonce, nonceSz, L, mode); + + if (inSz == 0 && authInSz == 0) { + /* This is a special case that cannot use the GCM mode because the + * data and AAD lengths are both zero. The work around is to perform + * an ECB encryption on IV. */ + wolfSSL_TI_lockCCM(); + ROM_AESReset(AES_BASE); + ROM_AESConfigSet(AES_BASE, (aes->keylen-8) | AES_CFG_DIR_ENCRYPT | AES_CFG_MODE_ECB); + ROM_AESKey1Set(AES_BASE, aes->key, (aes->keylen-8)); + ROM_AESDataProcess(AES_BASE, aes->reg, tmpTag, AES_BLOCK_SIZE); + wolfSSL_TI_unlockCCM(); + + if (XMEMCMP(authTag, tmpTag, authTagSz) != 0) { + ret = AES_GCM_AUTH_E; + } + return ret; + } + + /* Make sure all pointers are 16 byte aligned */ + if (IS_ALIGN16(inSz)) { + in_save = NULL; in_a = (byte*)in; + out_save = NULL; out_a = out; + } + else { + in_save = XMALLOC(ROUNDUP_16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (in_save == NULL) { ret = MEMORY_E; goto exit; } + in_a = in_save; + XMEMSET(in_a, 0, ROUNDUP_16(inSz)); + XMEMCPY(in_a, in, inSz); + + out_save = XMALLOC(ROUNDUP_16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (out_save == NULL) { ret = MEMORY_E; goto exit; } + out_a = out_save; + } + + if (IS_ALIGN16(authInSz)) { + authIn_save = NULL; authIn_a = (byte*)authIn; + } + else { + authIn_save = XMALLOC(ROUNDUP_16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (authIn_save == NULL) { ret = MEMORY_E; goto exit; } + + authIn_a = authIn_save; + XMEMSET(authIn_a, 0, ROUNDUP_16(authInSz)); + XMEMCPY(authIn_a, authIn, authInSz); } - /* do aes-ccm */ - AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; + /* Do AES-CCM/GCM Cipher with Auth */ + wolfSSL_TI_lockCCM(); ROM_AESReset(AES_BASE); - ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_DECRYPT | - AES_CFG_CTR_WIDTH_128 | - mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; + ROM_AESConfigSet(AES_BASE, + (aes->keylen-8 | + AES_CFG_DIR_DECRYPT | + AES_CFG_CTR_WIDTH_128 | + mode | + ((mode == AES_CFG_MODE_CCM) ? (L | M) : 0 )) + ); ROM_AESIVSet(AES_BASE, aes->reg); - ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); - ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, - (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); - if((ret == false) || (XMEMCMP(authTag, tmpTag, authTagSz) != 0)){ - XMEMSET(out, 0, inSz) ; - ret = false ; - } else { - XMEMCPY(out, out_a, inSz) ; - } + ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen-8); + ret = ROM_AESDataProcessAuth(AES_BASE, + (unsigned int*)in_a, (unsigned int*)out_a, inSz, + (unsigned int*)authIn_a, authInSz, + (unsigned int*)tmpTag); + wolfSSL_TI_unlockCCM(); + + if ((ret == false) || (XMEMCMP(authTag, tmpTag, authTagSz) != 0)) { + XMEMSET(out, 0, inSz); + ret = AES_GCM_AUTH_E; + } + else { + XMEMCPY(out, out_a, inSz); + ret = 0; + } + +exit: + if (in_save) XFREE(in_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (out_save) XFREE(out_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (authIn_save)XFREE(authIn_save, NULL, DYNAMIC_TYPE_TMP_BUFFER); - FREE_ALL ; - return ret==true ? 0 : 1 ; + return ret; } -#endif - +#endif /* HAVE_AESGCM || HAVE_AESCCM */ #ifdef HAVE_AESGCM -WOLFSSL_API int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) +int wc_AesGcmSetKey(Aes* aes, const byte* key, word32 len) { - return AesAuthSetKey(aes, key, len) ; + return AesAuthSetKey(aes, key, len); } -WOLFSSL_API int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, +int wc_AesGcmEncrypt(Aes* aes, byte* out, const byte* in, word32 sz, const byte* iv, word32 ivSz, byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) @@ -502,58 +668,301 @@ return BAD_FUNC_ARG; } return AesAuthEncrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC); } -WOLFSSL_API int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, + +#if defined(HAVE_AES_DECRYPT) || defined(HAVE_AESGCM_DECRYPT) +int wc_AesGcmDecrypt(Aes* aes, byte* out, const byte* in, word32 sz, const byte* iv, word32 ivSz, const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { return AesAuthDecrypt(aes, out, in, sz, iv, ivSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC); } +#endif -WOLFSSL_API int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) +int wc_GmacSetKey(Gmac* gmac, const byte* key, word32 len) { - return AesAuthSetKey(&gmac->aes, key, len) ; + return AesAuthSetKey(&gmac->aes, key, len); } -WOLFSSL_API int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, +int wc_GmacUpdate(Gmac* gmac, const byte* iv, word32 ivSz, const byte* authIn, word32 authInSz, byte* authTag, word32 authTagSz) { return AesAuthEncrypt(&gmac->aes, NULL, NULL, 0, iv, ivSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC) ; + authIn, authInSz, AES_CFG_MODE_GCM_HY0CALC); +} + +#ifndef NO_RNG +static WARN_UNUSED_RESULT WC_INLINE int CheckAesGcmIvSize(int ivSz) { + return (ivSz == GCM_NONCE_MIN_SZ || + ivSz == GCM_NONCE_MID_SZ || + ivSz == GCM_NONCE_MAX_SZ); +} + +int wc_AesGcmSetIV(Aes* aes, word32 ivSz, + const byte* ivFixed, word32 ivFixedSz, + WC_RNG* rng) +{ + int ret = 0; + + if (aes == NULL || rng == NULL || !CheckAesGcmIvSize((int)ivSz) || + (ivFixed == NULL && ivFixedSz != 0) || + (ivFixed != NULL && ivFixedSz != AES_IV_FIXED_SZ)) { + + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + byte* iv = (byte*)aes->reg; + + if (ivFixedSz) + XMEMCPY(iv, ivFixed, ivFixedSz); + + ret = wc_RNG_GenerateBlock(rng, iv + ivFixedSz, ivSz - ivFixedSz); + } + + if (ret == 0) { + /* If the IV is 96, allow for a 2^64 invocation counter. + * For any other size for the nonce, limit the invocation + * counter to 32-bits. (SP 800-38D 8.3) */ + aes->invokeCtr[0] = 0; + aes->invokeCtr[1] = (ivSz == GCM_NONCE_MID_SZ) ? 0 : 0xFFFFFFFF; + #ifdef WOLFSSL_AESGCM_STREAM + aes->ctrSet = 1; + #endif + aes->nonceSz = ivSz; + } + + return ret; +} + +int wc_AesGcmEncrypt_ex(Aes* aes, byte* out, const byte* in, word32 sz, + byte* ivOut, word32 ivOutSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + int ret = 0; + + if (aes == NULL || (sz != 0 && (in == NULL || out == NULL)) || + ivOut == NULL || ivOutSz != aes->nonceSz || + (authIn == NULL && authInSz != 0)) { + + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + aes->invokeCtr[0]++; + if (aes->invokeCtr[0] == 0) { + aes->invokeCtr[1]++; + if (aes->invokeCtr[1] == 0) + ret = AES_GCM_OVERFLOW_E; + } + } + + if (ret == 0) { + XMEMCPY(ivOut, aes->reg, ivOutSz); + ret = wc_AesGcmEncrypt(aes, out, in, sz, + (byte*)aes->reg, ivOutSz, + authTag, authTagSz, + authIn, authInSz); + if (ret == 0) + IncCtr((byte*)aes->reg, ivOutSz); + } + + return ret; +} + +int wc_Gmac(const byte* key, word32 keySz, byte* iv, word32 ivSz, + const byte* authIn, word32 authInSz, + byte* authTag, word32 authTagSz, WC_RNG* rng) +{ +#ifdef WOLFSSL_SMALL_STACK + Aes *aes = NULL; +#else + Aes aes[1]; +#endif + int ret; + + if (key == NULL || iv == NULL || (authIn == NULL && authInSz != 0) || + authTag == NULL || authTagSz == 0 || rng == NULL) { + + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if ((aes = (Aes *)XMALLOC(sizeof *aes, NULL, + DYNAMIC_TYPE_AES)) == NULL) + return MEMORY_E; +#endif + + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + if (ret == 0) { + ret = wc_AesGcmSetKey(aes, key, keySz); + if (ret == 0) + ret = wc_AesGcmSetIV(aes, ivSz, NULL, 0, rng); + if (ret == 0) + ret = wc_AesGcmEncrypt_ex(aes, NULL, NULL, 0, iv, ivSz, + authTag, authTagSz, authIn, authInSz); + wc_AesFree(aes); + } + ForceZero(aes, sizeof *aes); +#ifdef WOLFSSL_SMALL_STACK + XFREE(aes, NULL, DYNAMIC_TYPE_AES); +#endif + + return ret; +} + +int wc_GmacVerify(const byte* key, word32 keySz, + const byte* iv, word32 ivSz, + const byte* authIn, word32 authInSz, + const byte* authTag, word32 authTagSz) +{ + int ret; +#ifdef HAVE_AES_DECRYPT +#ifdef WOLFSSL_SMALL_STACK + Aes *aes = NULL; +#else + Aes aes[1]; +#endif + + if (key == NULL || iv == NULL || (authIn == NULL && authInSz != 0) || + authTag == NULL || authTagSz == 0 || authTagSz > AES_BLOCK_SIZE) { + + return BAD_FUNC_ARG; + } + +#ifdef WOLFSSL_SMALL_STACK + if ((aes = (Aes *)XMALLOC(sizeof *aes, NULL, + DYNAMIC_TYPE_AES)) == NULL) + return MEMORY_E; +#endif + + ret = wc_AesInit(aes, NULL, INVALID_DEVID); + if (ret == 0) { + ret = wc_AesGcmSetKey(aes, key, keySz); + if (ret == 0) + ret = wc_AesGcmDecrypt(aes, NULL, NULL, 0, iv, ivSz, + authTag, authTagSz, authIn, authInSz); + wc_AesFree(aes); + } + ForceZero(aes, sizeof *aes); +#ifdef WOLFSSL_SMALL_STACK + XFREE(aes, NULL, DYNAMIC_TYPE_AES); +#endif +#else + (void)key; + (void)keySz; + (void)iv; + (void)ivSz; + (void)authIn; + (void)authInSz; + (void)authTag; + (void)authTagSz; + ret = NOT_COMPILED_IN; +#endif + return ret; } +#endif /* !NO_RNG */ #endif /* HAVE_AESGCM */ #ifdef HAVE_AESCCM -WOLFSSL_API int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) +int wc_AesCcmSetKey(Aes* aes, const byte* key, word32 keySz) { - return AesAuthSetKey(aes, key, keySz) ; + return AesAuthSetKey(aes, key, keySz); } -WOLFSSL_API int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, +int wc_AesCcmEncrypt(Aes* aes, byte* out, const byte* in, word32 inSz, const byte* nonce, word32 nonceSz, byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { return AesAuthEncrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_CCM) ; + authIn, authInSz, AES_CFG_MODE_CCM); } -WOLFSSL_API int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, +int wc_AesCcmDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, const byte* nonce, word32 nonceSz, const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz) { return AesAuthDecrypt(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, - authIn, authInSz, AES_CFG_MODE_CCM) ; + authIn, authInSz, AES_CFG_MODE_CCM); } + +/* abstract functions that call lower level AESCCM functions */ +#ifndef WC_NO_RNG + +int wc_AesCcmSetNonce(Aes* aes, const byte* nonce, word32 nonceSz) +{ + int ret = 0; + + if (aes == NULL || nonce == NULL || + nonceSz < CCM_NONCE_MIN_SZ || nonceSz > CCM_NONCE_MAX_SZ) { + + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + XMEMCPY(aes->reg, nonce, nonceSz); + aes->nonceSz = nonceSz; + + /* Invocation counter should be 2^61 */ + aes->invokeCtr[0] = 0; + aes->invokeCtr[1] = 0xE0000000; + } + + return ret; +} + + +int wc_AesCcmEncrypt_ex(Aes* aes, byte* out, const byte* in, word32 sz, + byte* ivOut, word32 ivOutSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz) +{ + int ret = 0; + + if (aes == NULL || out == NULL || + (in == NULL && sz != 0) || + ivOut == NULL || + (authIn == NULL && authInSz != 0) || + (ivOutSz != aes->nonceSz)) { + + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + aes->invokeCtr[0]++; + if (aes->invokeCtr[0] == 0) { + aes->invokeCtr[1]++; + if (aes->invokeCtr[1] == 0) + ret = AES_CCM_OVERFLOW_E; + } + } + + if (ret == 0) { + ret = wc_AesCcmEncrypt(aes, out, in, sz, + (byte*)aes->reg, aes->nonceSz, + authTag, authTagSz, + authIn, authInSz); + if (ret == 0) { + XMEMCPY(ivOut, aes->reg, aes->nonceSz); + IncCtr((byte*)aes->reg, aes->nonceSz); + } + } + + return ret; +} +#endif /* !WC_NO_RNG */ + #endif /* HAVE_AESCCM */ -WOLFSSL_API int wc_AesInit(Aes* aes, void* heap, int devId) +int wc_AesInit(Aes* aes, void* heap, int devId) { if (aes == NULL) return BAD_FUNC_ARG; @@ -564,14 +973,9 @@ return 0; } -WOLFSSL_API void wc_AesFree(Aes* aes) +void wc_AesFree(Aes* aes) { (void)aes; } -#endif /* WOLFSSL_TI_CRYPT */ - -#endif /* NO_AES */ - - - +#endif /* !NO_AES && WOLFSSL_TI_CRYPT */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-hash.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-hash.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-hash.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/ti/ti-hash.c 2024-08-03 07:30:00.000000000 +0000 @@ -62,8 +62,10 @@ #define SHAMD5_ALGO_SHA224 4 #endif -static int hashInit(wolfssl_TI_Hash *hash) { - if (!wolfSSL_TI_CCMInit())return 1; +static int hashInit(wolfssl_TI_Hash *hash) +{ + if (!wolfSSL_TI_CCMInit()) + return 1; hash->used = 0; hash->msg = 0; hash->len = 0; @@ -115,8 +117,13 @@ return 0; } -static int hashCopy(wolfssl_TI_Hash *src, wolfssl_TI_Hash *dst) { - XMEMCPY(dst, src, sizeof(wolfssl_TI_Hash)); +static int hashCopy(wolfssl_TI_Hash *src, wolfssl_TI_Hash *dst) +{ + /* only copy hash, zero the rest of the struct to avoid double-free */ + dst->msg = NULL; + dst->used = 0; + dst->len = 0; + XMEMCPY(dst->hash, src->hash, sizeof(dst->hash)); return 0; } @@ -194,11 +201,12 @@ return hashGetHash((wolfssl_TI_Hash *)md5, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE); } -WOLFSSL_API int wc_Md5Copy(Md5* src, Md5* dst) { - return hashCopy((wolfssl_TI_Hash *)src, (wolfssl_TI_Hash *)dst); +WOLFSSL_API int wc_Md5Copy(Md5* src, Md5* dst) +{ + return hashCopy((wolfssl_TI_Hash *)src, (wolfssl_TI_Hash *)dst); } -WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte*hash) +WOLFSSL_API int wc_Md5Hash(const byte*data, word32 len, byte* hash) { return hashHash(data, len, hash, SHAMD5_ALGO_MD5, MD5_DIGEST_SIZE); } @@ -239,11 +247,12 @@ return hashGetHash(sha, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE); } -WOLFSSL_API int wc_ShaCopy(Sha* src, Sha* dst) { - return hashCopy((wolfssl_TI_Hash *)src, (wolfssl_TI_Hash *)dst); +WOLFSSL_API int wc_ShaCopy(Sha* src, Sha* dst) +{ + return hashCopy((wolfssl_TI_Hash *)src, (wolfssl_TI_Hash *)dst); } -WOLFSSL_API int wc_ShaHash(const byte*data, word32 len, byte*hash) +WOLFSSL_API int wc_ShaHash(const byte*data, word32 len, byte* hash) { return hashHash(data, len, hash, SHAMD5_ALGO_SHA1, SHA_DIGEST_SIZE); } @@ -284,7 +293,12 @@ return hashGetHash(sha224, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE); } -WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte*hash) +WOLFSSL_API int wc_Sha224Copy(Sha224* src, Sha224* dst) +{ + return hashCopy((wolfssl_TI_Hash *)src, (wolfssl_TI_Hash *)dst); +} + +WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte* hash) { return hashHash(data, len, hash, SHAMD5_ALGO_SHA224, SHA224_DIGEST_SIZE); } @@ -326,7 +340,12 @@ return hashGetHash(sha256, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE); } -WOLFSSL_API int wc_Sha256Hash(const byte* data, word32 len, byte*hash) +WOLFSSL_API int wc_Sha256Copy(Sha256* src, Sha256* dst) +{ + return hashCopy((wolfssl_TI_Hash *)src, (wolfssl_TI_Hash *)dst); +} + +WOLFSSL_API int wc_Sha256Hash(const byte* data, word32 len, byte* hash) { return hashHash(data, len, hash, SHAMD5_ALGO_SHA256, SHA256_DIGEST_SIZE); } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-aesgcm.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-aesgcm.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-aesgcm.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-aesgcm.c 2024-08-03 07:30:00.000000000 +0000 @@ -87,9 +87,9 @@ static WC_INLINE void aligned_xfree(void* buf, void* heap) { - if (buf == NULL) - return; - XFREE(buf, heap, DYNAMIC_TYPE_TMP_BUFFER); + if (buf == NULL) + return; + XFREE(buf, heap, DYNAMIC_TYPE_TMP_BUFFER); } static WC_INLINE int check_keysize(word32 len) @@ -135,7 +135,9 @@ aes->xKeySize = len == AES_128_KEY_SIZE ? XSECURE_AES_KEY_SIZE_128 : XSECURE_AES_KEY_SIZE_256; - XMEMCPY(aes->keyInit, key, len); + if (key != NULL) { + XMEMCPY(aes->keyInit, key, len); + } return 0; } @@ -151,7 +153,7 @@ byte *aad_buf = NULL; int err; - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)aes->keyInit, + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)aes->keyInit, sizeof(aes->keyInit)); if (XSecure_AesWriteKey(&(aes->xSec.cinst), aes->kup, aes->xKeySize, @@ -164,7 +166,7 @@ XMEMCPY(iv_, iv, AEAD_NONCE_SZ); piv = iv_; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)piv, AEAD_NONCE_SZ); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)piv, AEAD_NONCE_SZ); if (init(&(aes->xSec.cinst), aes->kup, aes->xKeySize, XIL_CAST_U64(piv))) { WOLFSSL_XIL_MSG("Failed to init"); @@ -195,7 +197,7 @@ XMEMCPY((void* )aad, authIn, authInSz); } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)aad, authInSz); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)aad, authInSz); if (XSecure_AesUpdateAad(&(aes->xSec.cinst), XIL_CAST_U64(authIn), authInSz)) { @@ -221,7 +223,7 @@ byte initalCounter[AES_BLOCK_SIZE] = { 0 }; XMEMCPY(initalCounter, iv, AEAD_NONCE_SZ); initalCounter[AES_BLOCK_SIZE - 1] = 1; - GHASH(aes, authIn, authInSz, data, sz, authTag, AES_GCM_AUTH_SZ); + GHASH(&aes->gcm, authIn, authInSz, data, sz, authTag, AES_GCM_AUTH_SZ); ret = wc_AesEncryptDirect(aes, scratch, initalCounter); if (ret == 0) xorbuf(authTag, scratch, AES_GCM_AUTH_SZ); @@ -277,7 +279,7 @@ if (NEEDS_ALIGNMENT(out, XIL_AESGCM_ALIGN)) { if (in != in_aligned) { - /* In case `in` has been copied already, re-use that buffer + /* In case `in` has been copied already, reuse that buffer * and also write to it instead of allocating another one. */ out_aligned = in_aligned; @@ -296,9 +298,9 @@ out_aligned = out; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)in_aligned, sz); - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz); - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)tag, sizeof(tag)); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)in_aligned, sz); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out_aligned, sz); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)tag, sizeof(tag)); if (XSecure_AesEncryptUpdate(&(aes->xSec.cinst), XIL_CAST_U64(in_aligned), XIL_CAST_U64(out_aligned), sz, TRUE)) { @@ -313,8 +315,8 @@ ret = WC_HW_E; ForceZero(authTag, authTagSz); } else { - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz); - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)tag, sizeof(tag)); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out_aligned, sz); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)tag, sizeof(tag)); if (aes->aadStyle == SW_AAD) { ret = handle_aad(aes, out_aligned, sz, iv, authTag, authIn, @@ -392,7 +394,7 @@ if (NEEDS_ALIGNMENT(out, XIL_AESGCM_ALIGN)) { if (in != in_aligned) { - /* In case `in` has been copied already, re-use that buffer + /* In case `in` has been copied already, reuse that buffer * and also write to it instead of allocating another one. */ out_aligned = in_aligned; @@ -411,8 +413,8 @@ out_aligned = out; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)in_aligned, sz); - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)in_aligned, sz); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out_aligned, sz); if (aes->aadStyle == HW_ENGINE_AAD) { /* Use the originally provided tag */ @@ -441,14 +443,14 @@ goto error_out; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)tag, AES_GCM_AUTH_SZ); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)tag, AES_GCM_AUTH_SZ); if (XSecure_AesDecryptFinal(&(aes->xSec.cinst), XIL_CAST_U64(tag))) { WOLFSSL_XIL_MSG("DecryptFinal failed"); ret = WC_HW_E; } else { - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out_aligned, sz); - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)buf, sizeof(buf)); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out_aligned, sz); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)buf, sizeof(buf)); if (aes->aadStyle == SW_AAD) { if (ConstantCompare(authTag, real_tag, authTagSz) != 0) { @@ -478,7 +480,12 @@ { XCsuDma_Config* con; - if (aes == NULL || key == NULL) { + if (aes == NULL) { + return BAD_FUNC_ARG; + } + + if (kup == XSECURE_CSU_AES_KEY_SRC_KUP && key == NULL) { + WOLFSSL_MSG("Expecting key buffer passed in if using KUP"); return BAD_FUNC_ARG; } @@ -501,7 +508,9 @@ aes->keylen = len; aes->kup = kup; - XMEMCPY((byte*)(aes->keyInit), key, len); + if (key != NULL) { + XMEMCPY((byte*)(aes->keyInit), key, len); + } return 0; } @@ -538,18 +547,26 @@ return BAD_FUNC_ARG; } + #ifndef NO_WOLFSSL_XILINX_TAG_MALLOC tmp = (byte*)XMALLOC(sz + AES_GCM_AUTH_SZ, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); if (tmp == NULL) { return MEMORY_E; } + #else + /* if NO_WOLFSSL_XILINX_TAG_MALLOC is defined than it is assumed that + * out buffer is large enough to hold both the cipher out and tag */ + tmp = out; + #endif XSecure_AesInitialize(&(aes->xilAes), &(aes->dma), aes->kup, (word32*)iv, aes->keyInit); XSecure_AesEncryptData(&(aes->xilAes), tmp, in, sz); - XMEMCPY(out, tmp, sz); XMEMCPY(authTag, tmp + sz, authTagSz); + #ifndef NO_WOLFSSL_XILINX_TAG_MALLOC + XMEMCPY(out, tmp, sz); XFREE(tmp, aes->heap, DYNAMIC_TYPE_TMP_BUFFER); + #endif } /* handle completing tag with any additional data */ @@ -558,7 +575,7 @@ XMEMSET(initalCounter, 0, AES_BLOCK_SIZE); XMEMCPY(initalCounter, iv, ivSz); initalCounter[AES_BLOCK_SIZE - 1] = 1; - GHASH(aes, authIn, authInSz, out, sz, authTag, authTagSz); + GHASH(&aes->gcm, authIn, authInSz, out, sz, authTag, authTagSz); ret = wc_AesEncryptDirect(aes, scratch, initalCounter); if (ret < 0) return ret; @@ -597,7 +614,7 @@ XMEMCPY(initalCounter, iv, ivSz); initalCounter[AES_BLOCK_SIZE - 1] = 1; tag = buf; - GHASH(aes, NULL, 0, in, sz, tag, AES_GCM_AUTH_SZ); + GHASH(&aes->gcm, NULL, 0, in, sz, tag, AES_GCM_AUTH_SZ); ret = wc_AesEncryptDirect(aes, scratch, initalCounter); if (ret < 0) return ret; @@ -610,11 +627,11 @@ /* calls to hardened crypto */ XSecure_AesInitialize(&(aes->xilAes), &(aes->dma), aes->kup, (word32*)iv, aes->keyInit); - XSecure_AesDecryptData(&(aes->xilAes), out, in, sz, tag); + ret = XSecure_AesDecryptData(&(aes->xilAes), out, in, sz, tag); /* account for additional data */ if (authIn != NULL && authInSz > 0) { - GHASH(aes, authIn, authInSz, in, sz, tag, AES_GCM_AUTH_SZ); + GHASH(&aes->gcm, authIn, authInSz, in, sz, tag, AES_GCM_AUTH_SZ); ret = wc_AesEncryptDirect(aes, scratch, initalCounter); if (ret < 0) return ret; @@ -623,6 +640,12 @@ return AES_GCM_AUTH_E; } } + else { + /* if no aad then check the result of the initial tag passed in */ + if (ret != XST_SUCCESS) { + return AES_GCM_AUTH_E; + } + } return 0; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-sha3.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-sha3.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-sha3.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-sha3.c 2024-08-03 07:30:00.000000000 +0000 @@ -74,7 +74,7 @@ if (sha == NULL || (data == NULL && len > 0)) { return BAD_FUNC_ARG; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)data, len); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)data, len); XSecure_Sha3Update(&(sha->xSec.cinst), XIL_CAST_U64(data), len); return 0; @@ -91,7 +91,7 @@ if (sha == NULL || out == NULL) { return BAD_FUNC_ARG; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out, WC_SHA3_384_DIGEST_SIZE); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out, WC_SHA3_384_DIGEST_SIZE); XSecure_Sha3Finish(&(sha->xSec.cinst), XIL_CAST_U64(out)); return wc_InitSha3_384(sha, NULL, INVALID_DEVID); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-glue.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-glue.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-glue.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-glue.c 2024-08-03 07:30:00.000000000 +0000 @@ -78,7 +78,7 @@ /** Convert Xilinx specific error to string - err The error to convert + err The error to convert Returns a pointer to a string (always, never returns NULL). */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-trng.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-trng.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-trng.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/port/xilinx/xil-versal-trng.c 2024-08-03 07:30:00.000000000 +0000 @@ -134,7 +134,7 @@ .PersStrPresent = XTRNGPSV_FALSE }; #endif - int ret = WC_HW_E; + int ret = WC_NO_ERR_TRACE(WC_HW_E); XTrngpsv_Config *cfg; sword32 xret = 0; if (trng.State == XTRNGPSV_HEALTHY) { @@ -142,22 +142,29 @@ } cfg = XTrngpsv_LookupConfig(WOLFSSL_PSV_TRNG_DEV_ID); if (!cfg) { + ret = WC_HW_E; WOLFSSL_MSG("Could not lookup TRNG config"); goto out; } xret = XTrngpsv_CfgInitialize(&trng, cfg, cfg->BaseAddress); - if (xret) + if (xret) { + ret = WC_HW_E; goto out; + } xret = versal_trng_selftest(); - if (xret) + if (xret) { + ret = WC_HW_E; goto out; + } #if !defined(HAVE_HASHDRBG) if (nonce) usercfg_add_nonce(&user_cfg, nonce, nonceSz); #endif xret = XTrngpsv_Instantiate(&trng, &user_cfg); - if (xret) + if (xret) { + ret = WC_HW_E; goto out; + } ret = 0; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/pwdbased.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pwdbased.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/pwdbased.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/pwdbased.c 2024-08-03 07:30:00.000000000 +0000 @@ -28,6 +28,16 @@ #ifndef NO_PWDBASED +#if FIPS_VERSION3_GE(6,0,0) + /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ + #define FIPS_NO_WRAPPERS + + #ifdef USE_WINDOWS_API + #pragma code_seg(".fipsA$h") + #pragma const_seg(".fipsB$h") + #endif +#endif + #include #include #include @@ -41,6 +51,17 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + #ifdef DEBUG_WOLFSSL + #include + #endif + const unsigned int wolfCrypt_FIPS_pbkdf_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000010 }; + int wolfCrypt_FIPS_PBKDF_sanity(void) + { + return 0; + } +#endif #ifdef HAVE_PBKDF1 @@ -165,6 +186,7 @@ int wc_PBKDF1(byte* output, const byte* passwd, int pLen, const byte* salt, int sLen, int iterations, int kLen, int hashType) { + return wc_PBKDF1_ex(output, kLen, NULL, 0, passwd, pLen, salt, sLen, iterations, hashType, NULL); } @@ -191,6 +213,24 @@ return BAD_FUNC_ARG; } +#if FIPS_VERSION3_GE(6,0,0) + /* Per SP800-132 section 5 "The kLen value shall be at least 112 bits in + * length", ensure the returned bits for the derived master key are at a + * minimum 14-bytes or 112-bits after stretching and strengthening + * (iterations) */ + if (kLen < HMAC_FIPS_MIN_KEY/8) + return BAD_LENGTH_E; +#endif + +#if FIPS_VERSION3_GE(6,0,0) && defined(DEBUG_WOLFSSL) + /* SP800-132 section 5.2 recommends an iteration count of 1000 but this is + * not strictly enforceable and is listed in Appendix B Table 1 as a + * non-testable requirement. wolfCrypt will log it when appropriate but + * take no action */ + if (iterations < 1000) { + WOLFSSL_MSG("WARNING: Iteration < 1,000, see SP800-132 section 5.2"); + } +#endif if (iterations <= 0) iterations = 1; @@ -214,7 +254,17 @@ if (ret == 0) { word32 i = 1; /* use int hashType here, since HMAC FIPS uses the old unique value */ + #if FIPS_VERSION3_GE(6,0,0) + { + /* Allow passwords that are less than 14-bytes for compatibility + * / interoperability, only since module v6.0.0 */ + int allowShortPasswd = 1; + ret = wc_HmacSetKey_ex(hmac, hashType, passwd, (word32)pLen, + allowShortPasswd); + } + #else ret = wc_HmacSetKey(hmac, hashType, passwd, (word32)pLen); + #endif while (ret == 0 && kLen) { int currentLen; @@ -559,6 +609,10 @@ #endif /* HAVE_PKCS12 */ #ifdef HAVE_SCRYPT +#ifdef NO_HMAC + #error scrypt requires HMAC +#endif + /* Rotate the 32-bit value a by b bits to the left. * * a 32-bit value. @@ -681,7 +735,7 @@ word32 i; word32 j; word32 k; - word32 bSz = 128 * r; + word32 bSz = (word32)(128 * r); #ifdef WORD64_AVAILABLE word64* x64 = (word64*)x; word64* v64 = (word64*)v; @@ -703,7 +757,7 @@ { #ifdef LITTLE_ENDIAN_ORDER #ifdef WORD64_AVAILABLE - j = *(word64*)(x + (2*r - 1) * 64) & (n-1); + j = (word32)(*(word64*)(x + (2*r - 1) * 64) & (n-1)); #else j = *(word32*)(x + (2*r - 1) * 64) & (n-1); #endif @@ -764,43 +818,45 @@ * the comparison is greater than parallel's type. It wouldn't promote * both sides to word64. What follows is just arithmetic simplification. */ - if ((word32)parallel > (SCRYPT_WORD32_MAX / (4 * blockSize))) + if (parallel > (int)((SCRYPT_WORD32_MAX / 4) / (word32)blockSize)) return BAD_FUNC_ARG; - bSz = 128 * blockSize; - if ((word32)parallel > (SCRYPT_WORD32_MAX / bSz)) + bSz = 128 * (word32)blockSize; + if (parallel > (int)(SCRYPT_WORD32_MAX / bSz)) return BAD_FUNC_ARG; - blocksSz = bSz * parallel; - blocks = (byte*)XMALLOC(blocksSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + blocksSz = bSz * (word32)parallel; + blocks = (byte*)XMALLOC((size_t)blocksSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); if (blocks == NULL) { ret = MEMORY_E; goto end; } /* Temporary for scryptROMix. */ - v = (byte*)XMALLOC((1 << cost) * bSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); + v = (byte*)XMALLOC((size_t)((1 << cost) * bSz), NULL, + DYNAMIC_TYPE_TMP_BUFFER); if (v == NULL) { ret = MEMORY_E; goto end; } /* Temporary for scryptBlockMix. */ - y = (byte*)XMALLOC(blockSize * 128, NULL, DYNAMIC_TYPE_TMP_BUFFER); + y = (byte*)XMALLOC((size_t)(blockSize * 128), NULL, + DYNAMIC_TYPE_TMP_BUFFER); if (y == NULL) { ret = MEMORY_E; goto end; } /* Step 1. */ - ret = wc_PBKDF2(blocks, passwd, passLen, salt, saltLen, 1, blocksSz, + ret = wc_PBKDF2(blocks, passwd, passLen, salt, saltLen, 1, (int)blocksSz, WC_SHA256); if (ret != 0) goto end; /* Step 2. */ for (i = 0; i < parallel; i++) - scryptROMix(blocks + i * bSz, v, y, blockSize, 1 << cost); + scryptROMix(blocks + i * (int)bSz, v, y, (int)blockSize, 1 << cost); /* Step 3. */ - ret = wc_PBKDF2(output, passwd, passLen, blocks, blocksSz, 1, dkLen, + ret = wc_PBKDF2(output, passwd, passLen, blocks, (int)blocksSz, 1, dkLen, WC_SHA256); end: if (blocks != NULL) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/random.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/random.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/random.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/random.c 2024-08-03 07:30:00.000000000 +0000 @@ -31,6 +31,9 @@ #include #include +#if defined(DEBUG_WOLFSSL) + #include +#endif /* on HPUX 11 you may need to install /dev/random see http://h20293.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumber=KRNG11I @@ -47,8 +50,8 @@ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$c") - #pragma const_seg(".fipsB$c") + #pragma code_seg(".fipsA$i") + #pragma const_seg(".fipsB$i") #endif #endif @@ -63,58 +66,6 @@ #endif -/* If building for old FIPS. */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - -int wc_GenerateSeed(OS_Seed* os, byte* seed, word32 sz) -{ - return GenerateSeed(os, seed, sz); -} - -int wc_InitRng_ex(WC_RNG* rng, void* heap, int devId) -{ - (void)heap; - (void)devId; - return InitRng_fips(rng); -} - -WOLFSSL_ABI -int wc_InitRng(WC_RNG* rng) -{ - return InitRng_fips(rng); -} - - -int wc_RNG_GenerateBlock(WC_RNG* rng, byte* b, word32 sz) -{ - return RNG_GenerateBlock_fips(rng, b, sz); -} - - -int wc_RNG_GenerateByte(WC_RNG* rng, byte* b) -{ - return RNG_GenerateByte(rng, b); -} - -#ifdef HAVE_HASHDRBG - - int wc_FreeRng(WC_RNG* rng) - { - return FreeRng_fips(rng); - } - - int wc_RNG_HealthTest(int reseed, const byte* seedA, word32 seedASz, - const byte* seedB, word32 seedBSz, - byte* output, word32 outputSz) - { - return RNG_HealthTest_fips(reseed, seedA, seedASz, - seedB, seedBSz, output, outputSz); - } -#endif /* HAVE_HASHDRBG */ - -#else /* else build without fips, or for new fips */ - #ifndef WC_NO_RNG /* if not FIPS and RNG is disabled then do not compile */ #include @@ -141,9 +92,12 @@ #elif defined(HAVE_WNR) #include #include - wolfSSL_Mutex wnr_mutex; /* global netRandom mutex */ + wolfSSL_Mutex wnr_mutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(wnr_mutex); /* global netRandom mutex */ int wnr_timeout = 0; /* entropy timeout, milliseconds */ - int wnr_mutex_init = 0; /* flag for mutex init */ + #ifndef WOLFSSL_MUTEX_INITIALIZER + int wnr_mutex_inited = 0; /* flag for mutex init */ + #endif + int wnr_inited = 0; /* flag for whether wc_InitNetRandom() has been called */ wnr_context* wnr_ctx; /* global netRandom context */ #elif defined(FREESCALE_KSDK_2_0_TRNG) #include "fsl_trng.h" @@ -174,6 +128,8 @@ #elif defined(WOLFSSL_TELIT_M2MB) #elif defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_TRNG) #elif defined(WOLFSSL_IMXRT1170_CAAM) +#elif defined(CY_USING_HAL) && defined(COMPONENT_WOLFSSL) + #include "cyhal_trng.h" /* Infineon/Cypress HAL RNG implementation */ #elif defined(WOLFSSL_GETRANDOM) #include #include @@ -197,6 +153,15 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_drbg_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000011 }; + int wolfCrypt_FIPS_DRBG_sanity(void) + { + return 0; + } +#endif + #if defined(HAVE_INTEL_RDRAND) || defined(HAVE_INTEL_RDSEED) || \ defined(HAVE_AMD_RDSEED) static word32 intel_flags = 0; @@ -363,7 +328,7 @@ typedef struct DRBG_internal DRBG_internal; -static int wc_RNG_HealthTestLocal(int reseed); +static int wc_RNG_HealthTestLocal(int reseed, void* heap, int devId); /* Hash Derivation Function */ /* Returns: DRBG_SUCCESS or DRBG_FAILURE */ @@ -657,6 +622,9 @@ } if (drbg->reseedCtr == RESEED_INTERVAL) { +#if FIPS_VERSION3_GE(6,0,0) + printf("Reseed triggered\n"); +#endif return DRBG_NEED_RESEED; } else { @@ -861,6 +829,26 @@ ); return cnt; } +#elif !defined(ENTROPY_MEMUSE_THREAD) && defined(__MICROBLAZE__) + +#define LPD_SCNTR_BASE_ADDRESS 0xFF250000 + +/* Get the high resolution time counter. + * Collect ticks from LPD_SCNTR + * @return 64-bit tick count. + */ +static WC_INLINE word64 Entropy_TimeHiRes(void) +{ + word64 cnt; + word32 *ptr; + + ptr = (word32*)LPD_SCNTR_BASE_ADDRESS; + cnt = *(ptr+1); + cnt = cnt << 32; + cnt |= *ptr; + + return cnt; +} #elif !defined(ENTROPY_MEMUSE_THREAD) && (_POSIX_C_SOURCE >= 199309L) /* Get the high resolution time counter. * @@ -874,8 +862,18 @@ return now.tv_nsec; } -#elif !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) && \ - !defined(__MINGW32__) +#elif defined(_WIN32) /* USE_WINDOWS_API */ +/* Get the high resolution time counter. + * + * @return 64-bit timer + */ +static WC_INLINE word64 Entropy_TimeHiRes(void) +{ + LARGE_INTEGER count; + QueryPerformanceCounter(&count); + return (word64)(count.QuadPart); +} +#elif defined(WOLFSSL_THREAD_NO_JOIN) /* Start and stop thread that counts as a proxy for time counter. */ #define ENTROPY_MEMUSE_THREADED @@ -890,8 +888,6 @@ /* Track whether entropy thread has been started already. */ static int entropy_thread_started = 0; -/* Cache thread id for joining on exit. */ -static THREAD_TYPE entropy_thread_id = 0; /* Data for thread to update/observer. */ static volatile ENTROPY_THREAD_DATA entropy_thread_data = { 0, 0 }; @@ -910,13 +906,10 @@ * @param [in,out] args Entropy data including: counter and stop flag. * @return NULL always. */ -static THREAD_RETURN WOLFSSL_THREAD Entropy_IncCounter(void* args) +static THREAD_RETURN WOLFSSL_THREAD_NO_JOIN Entropy_IncCounter(void* args) { (void)args; - /* Thread resources to be disposed of. */ - pthread_detach(pthread_self()); - /* Keep going until caller tells us to stop and exit. */ while (!entropy_thread_data.stop) { /* Increment counter acting as high resolution timer. */ @@ -927,7 +920,7 @@ fprintf(stderr, "EXITING ENTROPY COUNTER THREAD\n"); #endif /* Exit from thread. */ - pthread_exit(NULL); + WOLFSSL_RETURN_FROM_THREAD(0); } /* Start a thread that increments counter if not one already. @@ -954,8 +947,8 @@ fprintf(stderr, "STARTING ENTROPY COUNTER THREAD\n"); #endif /* Create a thread that increments the counter in the data. */ - ret = pthread_create(&entropy_thread_id, NULL, Entropy_IncCounter, - NULL); + /* Thread resources to be disposed of. */ + ret = wolfSSL_NewThreadNoJoin(Entropy_IncCounter, NULL); if (ret == 0) { /* Wait for the counter to increase indicating thread started. */ while (entropy_thread_data.counter == start_counter) { @@ -983,6 +976,7 @@ entropy_thread_started = 0; } } + /* end if defined(HAVE_PTHREAD) */ #else @@ -1284,7 +1278,7 @@ } else { /* Get first value in queue - value to test. */ - byte val = prop_samples[prop_first]; + byte val = (byte)prop_samples[prop_first]; /* Store new sample in queue. */ prop_samples[prop_last] = noise; /* Update first index now that we have removed in from the queue. */ @@ -1399,7 +1393,7 @@ /* Mutex to prevent multiple callers requesting entropy operations at the * same time. */ -static wolfSSL_Mutex entropy_mutex; +static wolfSSL_Mutex entropy_mutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(entropy_mutex); /* Get entropy of specified strength. * @@ -1476,7 +1470,7 @@ Entropy_StopThread(); #endif - if (ret != BAD_MUTEX_E) { + if (ret != WC_NO_ERR_TRACE(BAD_MUTEX_E)) { /* Unlock mutex now we are done. */ wc_UnLockMutex(&entropy_mutex); } @@ -1492,7 +1486,7 @@ * @return ENTROPY_RT_E or ENTROPY_APT_E on failure. * @return BAD_MUTEX_E when unable to lock mutex. */ -int wc_Entropy_OnDemandTest() +int wc_Entropy_OnDemandTest(void) { int ret = 0; @@ -1508,7 +1502,7 @@ ret = Entropy_HealthTest_Startup(); } - if (ret != BAD_MUTEX_E) { + if (ret != WC_NO_ERR_TRACE(BAD_MUTEX_E)) { /* Unlock mutex now we are done. */ wc_UnLockMutex(&entropy_mutex); } @@ -1520,13 +1514,13 @@ * @return 0 on success. * @return Negative on failure. */ -int Entropy_Init() +int Entropy_Init(void) { int ret = 0; /* Check whether initialization has succeeded before. */ if (!entropy_memuse_initialized) { - #ifndef SINGLE_THREADED + #if !defined(SINGLE_THREADED) && !defined(WOLFSSL_MUTEX_INITIALIZER) ret = wc_InitMutex(&entropy_mutex); #endif if (ret == 0) { @@ -1557,13 +1551,13 @@ /* Finalize the data associated with the MemUse Entropy source. */ -void Entropy_Final() +void Entropy_Final(void) { /* Only finalize when initialized. */ if (entropy_memuse_initialized) { /* Dispose of the SHA3-356 hash object. */ wc_Sha3_256_Free(&entropyHash); - #ifndef SINGLE_THREADED + #if !defined(SINGLE_THREADED) && !defined(WOLFSSL_MUTEX_INITIALIZER) wc_FreeMutex(&entropy_mutex); #endif /* Clear health test data. */ @@ -1661,11 +1655,21 @@ #ifdef CUSTOM_RAND_GENERATE_BLOCK ret = 0; /* success */ #else + + /* not CUSTOM_RAND_GENERATE_BLOCK follows */ #ifdef HAVE_HASHDRBG - if (nonceSz == 0) + if (nonceSz == 0) { seedSz = MAX_SEED_SZ; + } - if (wc_RNG_HealthTestLocal(0) == 0) { + ret = wc_RNG_HealthTestLocal(0, rng->heap, devId); + if (ret != 0) { + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG_EX("wc_RNG_HealthTestLocal failed err = %d", ret); + #endif + ret = DRBG_CONT_FAILURE; + } + else { #ifndef WOLFSSL_SMALL_STACK byte seed[MAX_SEED_SZ]; #else @@ -1680,13 +1684,23 @@ (struct DRBG*)XMALLOC(sizeof(DRBG_internal), rng->heap, DYNAMIC_TYPE_RNG); if (rng->drbg == NULL) { + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG_EX("_InitRng XMALLOC failed to allocate %d bytes", + sizeof(DRBG_internal)); + #endif ret = MEMORY_E; rng->status = DRBG_FAILED; } #else rng->drbg = (struct DRBG*)&rng->drbg_data; +#endif /* WOLFSSL_NO_MALLOC or WOLFSSL_STATIC_MEMORY */ + + if (ret != 0) { +#if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG_EX("_InitRng failed. err = ", ret); #endif - if (ret == 0) { + } + else { #ifdef WC_RNG_SEED_CB if (seedCb == NULL) { ret = DRBG_NO_SEED_CB; @@ -1699,10 +1713,13 @@ } #else ret = wc_GenerateSeed(&rng->seed, seed, seedSz); -#endif +#endif /* WC_RNG_SEED_CB */ if (ret == 0) ret = wc_RNG_TestSeed(seed, seedSz); else { + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG_EX("wc_RNG_TestSeed failed... %d", ret); + #endif ret = DRBG_FAILURE; rng->status = DRBG_FAILED; } @@ -1718,24 +1735,21 @@ #endif rng->drbg = NULL; } - } + } /* ret == 0 */ ForceZero(seed, seedSz); #ifdef WOLFSSL_SMALL_STACK XFREE(seed, rng->heap, DYNAMIC_TYPE_SEED); #endif - } - else { - ret = DRBG_CONT_FAILURE; - } + } /* else swc_RNG_HealthTestLocal was successful */ if (ret == DRBG_SUCCESS) { #ifdef WOLFSSL_CHECK_MEM_ZERO -#ifdef HAVE_HASHDRBG + #ifdef HAVE_HASHDRBG struct DRBG_internal* drbg = (struct DRBG_internal*)rng->drbg; wc_MemZero_Add("DRBG V", &drbg->V, sizeof(drbg->V)); wc_MemZero_Add("DRBG C", &drbg->C, sizeof(drbg->C)); -#endif + #endif #endif rng->status = DRBG_OK; @@ -1777,6 +1791,26 @@ } +int wc_rng_new_ex(WC_RNG **rng, byte* nonce, word32 nonceSz, + void* heap, int devId) +{ + int ret; + + *rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), heap, DYNAMIC_TYPE_RNG); + if (*rng == NULL) { + return MEMORY_E; + } + + ret = _InitRng(*rng, nonce, nonceSz, heap, devId); + if (ret != 0) { + XFREE(*rng, heap, DYNAMIC_TYPE_RNG); + *rng = NULL; + } + + return ret; +} + + WOLFSSL_ABI void wc_rng_free(WC_RNG* rng) { @@ -1834,7 +1868,7 @@ #endif { ret = wc_CryptoCb_RandomBlock(rng, output, sz); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1876,7 +1910,11 @@ ret = Hash_DRBG_Generate((DRBG_internal *)rng->drbg, output, sz); if (ret == DRBG_NEED_RESEED) { - if (wc_RNG_HealthTestLocal(1) == 0) { + int devId = INVALID_DEVID; + #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLF_CRYPTO_CB) + devId = rng->devId; + #endif + if (wc_RNG_HealthTestLocal(1, rng->heap, devId) == 0) { #ifndef WOLFSSL_SMALL_STACK byte newSeed[SEED_SZ + SEED_BLOCK_SZ]; ret = DRBG_SUCCESS; @@ -1912,9 +1950,13 @@ if (ret == DRBG_SUCCESS) ret = Hash_DRBG_Generate((DRBG_internal *)rng->drbg, output, sz); - ForceZero(newSeed, sizeof(newSeed)); #ifdef WOLFSSL_SMALL_STACK + if (newSeed != NULL) { + ForceZero(newSeed, SEED_SZ + SEED_BLOCK_SZ); + } XFREE(newSeed, rng->heap, DYNAMIC_TYPE_SEED); + #else + ForceZero(newSeed, sizeof(newSeed)); #endif } else { @@ -2125,7 +2167,7 @@ }; -static int wc_RNG_HealthTestLocal(int reseed) +static int wc_RNG_HealthTestLocal(int reseed, void* heap, int devId) { int ret = 0; #ifdef WOLFSSL_SMALL_STACK @@ -2144,17 +2186,17 @@ if (reseed) { #ifdef WOLFSSL_USE_FLASHMEM - byte* seedA = (byte*)XMALLOC(sizeof(seedA_data), NULL, + byte* seedA = (byte*)XMALLOC(sizeof(seedA_data), heap, DYNAMIC_TYPE_TMP_BUFFER); - byte* reseedSeedA = (byte*)XMALLOC(sizeof(reseedSeedA_data), NULL, + byte* reseedSeedA = (byte*)XMALLOC(sizeof(reseedSeedA_data), heap, DYNAMIC_TYPE_TMP_BUFFER); - byte* outputA = (byte*)XMALLOC(sizeof(outputA_data), NULL, + byte* outputA = (byte*)XMALLOC(sizeof(outputA_data), heap, DYNAMIC_TYPE_TMP_BUFFER); if (!seedA || !reseedSeedA || !outputA) { - XFREE(seedA, NULL, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(reseedSeedA, NULL, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(outputA, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(seedA, heap, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(reseedSeedA, heap, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(outputA, heap, DYNAMIC_TYPE_TMP_BUFFER); ret = MEMORY_E; } else { @@ -2166,9 +2208,11 @@ const byte* reseedSeedA = reseedSeedA_data; const byte* outputA = outputA_data; #endif - ret = wc_RNG_HealthTest(1, seedA, sizeof(seedA_data), - reseedSeedA, sizeof(reseedSeedA_data), - check, RNG_HEALTH_TEST_CHECK_SIZE); + ret = wc_RNG_HealthTest_ex(1, NULL, 0, + seedA, sizeof(seedA_data), + reseedSeedA, sizeof(reseedSeedA_data), + check, RNG_HEALTH_TEST_CHECK_SIZE, + heap, devId); if (ret == 0) { if (ConstantCompare(check, outputA, RNG_HEALTH_TEST_CHECK_SIZE) != 0) @@ -2184,14 +2228,14 @@ } else { #ifdef WOLFSSL_USE_FLASHMEM - byte* seedB = (byte*)XMALLOC(sizeof(seedB_data), NULL, + byte* seedB = (byte*)XMALLOC(sizeof(seedB_data), heap, DYNAMIC_TYPE_TMP_BUFFER); - byte* outputB = (byte*)XMALLOC(sizeof(outputB_data), NULL, + byte* outputB = (byte*)XMALLOC(sizeof(outputB_data), heap, DYNAMIC_TYPE_TMP_BUFFER); if (!seedB || !outputB) { - XFREE(seedB, NULL, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(outputB, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(seedB, heap, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(outputB, heap, DYNAMIC_TYPE_TMP_BUFFER); ret = MEMORY_E; } else { @@ -2201,13 +2245,31 @@ const byte* seedB = seedB_data; const byte* outputB = outputB_data; #endif - ret = wc_RNG_HealthTest(0, seedB, sizeof(seedB_data), - NULL, 0, - check, RNG_HEALTH_TEST_CHECK_SIZE); - if (ret == 0) { - if (ConstantCompare(check, outputB, - RNG_HEALTH_TEST_CHECK_SIZE) != 0) +#if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG_EX("RNG_HEALTH_TEST_CHECK_SIZE = %d", + RNG_HEALTH_TEST_CHECK_SIZE); + WOLFSSL_MSG_EX("sizeof(seedB_data) = %d", + (int)sizeof(outputB_data)); +#endif + ret = wc_RNG_HealthTest_ex(0, NULL, 0, + seedB, sizeof(seedB_data), + NULL, 0, + check, RNG_HEALTH_TEST_CHECK_SIZE, + heap, devId); + if (ret != 0) { + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG_EX("RNG_HealthTest failed: err = %d", ret); + #endif + } + else { + ret = ConstantCompare(check, outputB, + RNG_HEALTH_TEST_CHECK_SIZE); + if (ret != 0) { + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG_EX("Random ConstantCompare failed: err = %d", ret); + #endif ret = -1; + } } /* The previous test cases use a large seed instead of a seed and nonce. @@ -2216,11 +2278,11 @@ * byte 32, feed them into the health test separately. */ if (ret == 0) { ret = wc_RNG_HealthTest_ex(0, - seedB + 32, sizeof(seedB_data) - 32, - seedB, 32, - NULL, 0, - check, RNG_HEALTH_TEST_CHECK_SIZE, - NULL, INVALID_DEVID); + seedB + 32, sizeof(seedB_data) - 32, + seedB, 32, + NULL, 0, + check, RNG_HEALTH_TEST_CHECK_SIZE, + heap, devId); if (ret == 0) { if (ConstantCompare(check, outputB, sizeof(outputB_data)) != 0) ret = -1; @@ -2228,8 +2290,8 @@ } #ifdef WOLFSSL_USE_FLASHMEM - XFREE(seedB, NULL, DYNAMIC_TYPE_TMP_BUFFER); - XFREE(outputB, NULL, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(seedB, heap, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(outputB, heap, DYNAMIC_TYPE_TMP_BUFFER); } #endif } @@ -2252,10 +2314,13 @@ */ int wc_InitNetRandom(const char* configFile, wnr_hmac_key hmac_cb, int timeout) { + int ret; + if (configFile == NULL || timeout < 0) return BAD_FUNC_ARG; - if (wnr_mutex_init > 0) { +#ifndef WOLFSSL_MUTEX_INITIALIZER + if (wnr_mutex_inited > 0) { WOLFSSL_MSG("netRandom context already created, skipping"); return 0; } @@ -2264,7 +2329,14 @@ WOLFSSL_MSG("Bad Init Mutex wnr_mutex"); return BAD_MUTEX_E; } - wnr_mutex_init = 1; + + wnr_mutex_inited = 1; +#endif + + if (wnr_inited > 0) { + WOLFSSL_MSG("netRandom context already created, skipping"); + return 0; + } if (wc_LockMutex(&wnr_mutex) != 0) { WOLFSSL_MSG("Bad Lock Mutex wnr_mutex"); @@ -2277,7 +2349,8 @@ /* create global wnr_context struct */ if (wnr_create(&wnr_ctx) != WNR_ERROR_NONE) { WOLFSSL_MSG("Error creating global netRandom context"); - return RNG_FAILURE_E; + ret = RNG_FAILURE_E; + goto out; } /* load config file */ @@ -2285,7 +2358,8 @@ WOLFSSL_MSG("Error loading config file into netRandom context"); wnr_destroy(wnr_ctx); wnr_ctx = NULL; - return RNG_FAILURE_E; + ret = RNG_FAILURE_E; + goto out; } /* create/init polling mechanism */ @@ -2293,7 +2367,8 @@ WOLFSSL_MSG("Error initializing netRandom polling mechanism"); wnr_destroy(wnr_ctx); wnr_ctx = NULL; - return RNG_FAILURE_E; + ret = RNG_FAILURE_E; + goto out; } /* validate config, set HMAC callback (optional) */ @@ -2302,12 +2377,17 @@ wnr_destroy(wnr_ctx); wnr_ctx = NULL; wnr_poll_destroy(); - return RNG_FAILURE_E; + ret = RNG_FAILURE_E; + goto out; } + wnr_inited = 1; + +out: + wc_UnLockMutex(&wnr_mutex); - return 0; + return ret; } /* @@ -2316,7 +2396,7 @@ */ int wc_FreeNetRandom(void) { - if (wnr_mutex_init > 0) { + if (wnr_inited > 0) { if (wc_LockMutex(&wnr_mutex) != 0) { WOLFSSL_MSG("Bad Lock Mutex wnr_mutex"); @@ -2331,8 +2411,12 @@ wc_UnLockMutex(&wnr_mutex); +#ifndef WOLFSSL_MUTEX_INITIALIZER wc_FreeMutex(&wnr_mutex); - wnr_mutex_init = 0; + wnr_mutex_inited = 0; +#endif + + wnr_inited = 0; } return 0; @@ -2592,7 +2676,7 @@ #endif { ret = wc_CryptoCb_RandomSeed(os, output, sz); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -2627,6 +2711,8 @@ #elif defined(HAVE_RTP_SYS) || defined(EBSNET) #include "rtprand.h" /* rtp_rand () */ + +#if (defined(HAVE_RTP_SYS) || (defined(RTPLATFORM) && (RTPLATFORM != 0))) #include "rtptime.h" /* rtp_get_system_msec() */ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) @@ -2640,6 +2726,19 @@ return 0; } +#else +int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) +{ + word32 i; + KS_SEED(ks_get_ticks()); + + for (i = 0; i < sz; i++ ) { + output[i] = KS_RANDOM() % 256; + } + + return 0; +} +#endif /* defined(HAVE_RTP_SYS) || (defined(RTPLATFORM) && (RTPLATFORM != 0)) */ #elif (defined(WOLFSSL_ATMEL) || defined(WOLFSSL_ATECC_RNG)) && \ !defined(WOLFSSL_PIC32MZ_RNG) @@ -2935,7 +3034,22 @@ return 0; } - #elif defined(WOLFSSL_STM32F427_RNG) || defined(WOLFSSL_STM32_RNG_NOLIB) + #elif defined(WOLFSSL_STM32F427_RNG) || defined(WOLFSSL_STM32_RNG_NOLIB) \ + || defined(STM32_NUTTX_RNG) + + #ifdef STM32_NUTTX_RNG + #include "hardware/stm32_rng.h" + /* Set CONFIG_STM32U5_RNG in NuttX to enable the RCC */ + #define WC_RNG_CR *((volatile uint32_t*)(STM32_RNG_CR)) + #define WC_RNG_SR *((volatile uint32_t*)(STM32_RNG_SR)) + #define WC_RNG_DR *((volatile uint32_t*)(STM32_RNG_DR)) + #else + /* Comes from "stm32xxxx_hal.h" */ + #define WC_RNG_CR RNG->CR + #define WC_RNG_SR RNG->SR + #define WC_RNG_DR RNG->DR + #endif + /* Generate a RNG seed using the hardware RNG on the STM32F427 * directly, following steps outlined in STM32F4 Reference @@ -2951,29 +3065,31 @@ return ret; } + #ifndef STM32_NUTTX_RNG /* enable RNG peripheral clock */ RCC->AHB2ENR |= RCC_AHB2ENR_RNGEN; + #endif /* enable RNG interrupt, set IE bit in RNG->CR register */ - RNG->CR |= RNG_CR_IE; + WC_RNG_CR |= RNG_CR_IE; /* enable RNG, set RNGEN bit in RNG->CR. Activates RNG, * RNG_LFSR, and error detector */ - RNG->CR |= RNG_CR_RNGEN; + WC_RNG_CR |= RNG_CR_RNGEN; /* verify no errors, make sure SEIS and CEIS bits are 0 * in RNG->SR register */ - if (RNG->SR & (RNG_SR_SECS | RNG_SR_CECS)) { + if (WC_RNG_SR & (RNG_SR_SECS | RNG_SR_CECS)) { wolfSSL_CryptHwMutexUnLock(); return RNG_FAILURE_E; } for (i = 0; i < sz; i++) { /* wait until RNG number is ready */ - while ((RNG->SR & RNG_SR_DRDY) == 0) { } + while ((WC_RNG_SR & RNG_SR_DRDY) == 0) { } /* get value */ - output[i] = RNG->DR; + output[i] = WC_RNG_DR; } wolfSSL_CryptHwMutexUnLock(); @@ -3360,7 +3476,7 @@ } /* driver could be waiting for entropy */ - if (ret != RAN_BLOCK_E && ret != 0) { + if (ret != WC_NO_ERR_TRACE(RAN_BLOCK_E) && ret != 0) { return ret; } #ifndef WOLFSSL_IMXRT1170_CAAM @@ -3397,14 +3513,88 @@ return 0; } +#elif defined(ARDUINO) + + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + int ret = 0; + word32 rand; + while (sz > 0) { + word32 len = sizeof(rand); + if (sz < len) + len = sz; + /* Get an Arduino framework random number */ + #if defined(ARDUINO_SAMD_NANO_33_IOT) || \ + defined(ARDUINO_ARCH_RP2040) + /* Known, tested boards working with random() */ + rand = random(); + #elif defined(ARDUINO_SAM_DUE) + /* See: https://github.com/avrxml/asf/tree/master/sam/utils/cmsis/sam3x/include */ + #if defined(__SAM3A4C__) + #ifndef TRNG + #define TRNG (0x400BC000U) + #endif + #elif defined(__SAM3A8C__) + #ifndef TRNG + #define TRNG (0x400BC000U) + #endif + #elif defined(__SAM3X4C__) + #ifndef TRNG + #define TRNG (0x400BC000U) + #endif + #elif defined(__SAM3X4E__) + #ifndef TRNG + #define TRNG (0x400BC000U) + #endif + #elif defined(__SAM3X8C__) + #ifndef TRNG + #define TRNG (0x400BC000U) + #endif + #elif defined(__SAM3X8E__) + /* This is the Arduino Due */ + #ifndef TRNG + #define TRNG (0x400BC000U) + #endif + #elif defined(__SAM3A8H__) + #ifndef TRNG + #define TRNG (0x400BC000U) + #endif + #else + #ifndef TRNG + #error "Unknown TRNG for this device" + #endif + #endif + + srand(analogRead(0)); + rand = trng_read_output_data(TRNG); + #elif defined(__STM32__) + /* TODO: confirm this is proper random number on Arduino STM32 */ + #warning "Not yet tested on STM32 targets" + rand = random(); + #else + /* TODO: Pull requests appreciated for new targets. + * Do *all* other Arduino boards support random()? + * Probably not 100%, but most will likely work: */ + rand = random(); + #endif + + XMEMCPY(output, &rand, len); + output += len; + sz -= len; + } + + return ret; + } + #elif defined(WOLFSSL_ESPIDF) /* Espressif */ - #if defined(WOLFSSL_ESPWROOM32) || defined(WOLFSSL_ESPWROOM32SE) + #if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) /* Espressif ESP32 */ #include - #if defined(CONFIG_IDF_TARGET_ESP32S3) + #if defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) #include #endif @@ -3432,6 +3622,9 @@ int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) { + #if defined(DEBUG_WOLFSSL) + WOLFSSL_ENTER("ESP8266 Random"); + #endif word32 rand; while (sz > 0) { word32 len = sizeof(rand); @@ -3446,7 +3639,7 @@ return 0; } - #endif /* end WOLFSSL_ESPWROOM32 */ + #endif /* end WOLFSSL_ESPIDF */ #elif defined(WOLFSSL_LINUXKM) #include @@ -3459,61 +3652,6 @@ return 0; } -#elif defined(WOLFSSL_RENESAS_TSIP) -#if defined(WOLFSSL_RENESA_TSIP_IAREWRX) - #include "r_bsp/mcu/all/r_rx_compiler.h" -#endif - #include "r_bsp/platform.h" - #include "r_tsip_rx_if.h" - - int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) - { - int ret = 0; - word32 buffer[4]; - - while (sz > 0) { - word32 len = sizeof(buffer); - - if (sz < len) { - len = sz; - } - /* return 4 words random number*/ - ret = R_TSIP_GenerateRandomNumber((uint32_t*)buffer); - if(ret == TSIP_SUCCESS) { - XMEMCPY(output, &buffer, len); - output += len; - sz -= len; - } else - return ret; - } - return ret; - } -#elif defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - #include "r_sce.h" - - int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) - { - int ret = 0; - word32 buffer[4]; - - while (sz > 0) { - word32 len = sizeof(buffer); - - if (sz < len) { - len = sz; - } - /* return 4 words random number*/ - ret = R_SCE_RandomNumberGenerate(buffer); - if(ret == FSP_SUCCESS) { - XMEMCPY(output, &buffer, len); - output += len; - sz -= len; - } else - return ret; - } - return ret; - } #elif defined(WOLFSSL_SCE) && !defined(WOLFSSL_SCE_NO_TRNG) #include "hal_data.h" @@ -3571,34 +3709,55 @@ * extern int myRngFunc(byte* output, word32 sz); */ -#elif defined(WOLFSSL_SAFERTOS) || defined(WOLFSSL_LEANPSK) || \ - defined(WOLFSSL_IAR_ARM) || defined(WOLFSSL_MDK_ARM) || \ - defined(WOLFSSL_uITRON4) || defined(WOLFSSL_uTKERNEL2) || \ - defined(WOLFSSL_LPC43xx) || defined(NO_STM32_RNG) || \ - defined(MBED) || defined(WOLFSSL_EMBOS) || \ - defined(WOLFSSL_GENSEED_FORTEST) || defined(WOLFSSL_CHIBIOS) || \ - defined(WOLFSSL_CONTIKI) || defined(WOLFSSL_AZSPHERE) +#elif defined(__MICROBLAZE__) + #warning weak source of entropy + #define LPD_SCNTR_BASE_ADDRESS 0xFF250000 - /* these platforms do not have a default random seed and - you'll need to implement your own wc_GenerateSeed or define via - CUSTOM_RAND_GENERATE_BLOCK */ + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + word32* cnt; + word32 i; - #define USE_TEST_GENSEED + /* using current time with srand */ + cnt = (word32*)LPD_SCNTR_BASE_ADDRESS; + srand(*cnt | *(cnt+1)); + + for (i = 0; i < sz; i++) + output[i] = rand(); + + (void)os; + return 0; + } #elif defined(WOLFSSL_ZEPHYR) - #include + #include + + #if KERNEL_VERSION_NUMBER >= 0x30500 + #include + #else + #if KERNEL_VERSION_NUMBER >= 0x30100 + #include + #else + #include + #endif + #endif + #ifndef _POSIX_C_SOURCE - #include + #if KERNEL_VERSION_NUMBER >= 0x30100 + #include + #else + #include + #endif #else #include #endif - int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) - { - sys_rand_get(output, sz); - return 0; - } + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + sys_rand_get(output, sz); + return 0; + } #elif defined(WOLFSSL_TELIT_M2MB) @@ -3656,7 +3815,14 @@ output[i] = (byte)rand(); return 0; } +#elif defined(WOLFSSL_MAXQ108X) || defined(WOLFSSL_MAXQ1065) + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + (void)os; + + return maxq10xx_random(output, sz); + } #elif defined(WOLFSSL_GETRANDOM) /* getrandom() was added to the Linux kernel in version 3.17. @@ -3688,8 +3854,78 @@ return ret; } +#elif defined(CY_USING_HAL) && defined(COMPONENT_WOLFSSL) + + /* Infineon/Cypress HAL RNG implementation */ + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + cyhal_trng_t obj; + cy_rslt_t result; + uint32_t val; + word32 i = 0; + + (void)os; + + result = cyhal_trng_init(&obj); + if (result == CY_RSLT_SUCCESS) { + while (i < sz) { + /* If not aligned or there is odd/remainder add single byte */ + if( (i + sizeof(word32)) > sz || + ((wc_ptr_t)&output[i] % sizeof(word32)) != 0 + ) { + val = cyhal_trng_generate(&obj); + output[i++] = (byte)val; + } + else { + /* Use native 32 instruction */ + val = cyhal_trng_generate(&obj); + *((uint32_t*)&output[i]) = val; + i += sizeof(word32); + } + } + cyhal_trng_free(&obj); + } + return 0; + } + +#elif defined(WOLFSSL_SAFERTOS) || defined(WOLFSSL_LEANPSK) || \ + defined(WOLFSSL_IAR_ARM) || defined(WOLFSSL_MDK_ARM) || \ + defined(WOLFSSL_uITRON4) || defined(WOLFSSL_uTKERNEL2) || \ + defined(WOLFSSL_LPC43xx) || defined(NO_STM32_RNG) || \ + defined(MBED) || defined(WOLFSSL_EMBOS) || \ + defined(WOLFSSL_GENSEED_FORTEST) || defined(WOLFSSL_CHIBIOS) || \ + defined(WOLFSSL_CONTIKI) || defined(WOLFSSL_AZSPHERE) + + /* these platforms do not have a default random seed and + you'll need to implement your own wc_GenerateSeed or define via + CUSTOM_RAND_GENERATE_BLOCK */ + + #define USE_TEST_GENSEED + #elif defined(NO_DEV_RANDOM) + /* Allow bare-metal targets to use cryptoCb as seed provider */ + #if defined(WOLF_CRYPTO_CB) + + int wc_GenerateSeed(OS_Seed* os, byte* output, word32 sz) + { + int ret = WC_NO_ERR_TRACE(WC_HW_E); + + #ifndef WOLF_CRYPTO_CB_FIND + if (os->devId != INVALID_DEVID) + #endif + { + ret = wc_CryptoCb_RandomSeed(os, output, sz); + if (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { + ret = WC_HW_E; + } + } + + return ret; + } + + #else /* defined(WOLF_CRYPTO_CB)*/ + #error "you need to write an os specific wc_GenerateSeed() here" /* @@ -3699,6 +3935,8 @@ } */ + #endif /* !defined(WOLF_CRYPTO_CB) */ + #else /* may block */ @@ -3716,7 +3954,7 @@ #endif { ret = wc_CryptoCb_RandomSeed(os, output, sz); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ ret = 0; /* reset error code */ @@ -3753,15 +3991,23 @@ #ifndef NO_DEV_URANDOM /* way to disable use of /dev/urandom */ os->fd = open("/dev/urandom", O_RDONLY); + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG("opened /dev/urandom."); + #endif if (os->fd == -1) #endif { /* may still have /dev/random */ os->fd = open("/dev/random", O_RDONLY); + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG("opened /dev/random."); + #endif if (os->fd == -1) return OPEN_RAN_E; } - + #if defined(DEBUG_WOLFSSL) + WOLFSSL_MSG("rnd read..."); + #endif while (sz) { int len = (int)read(os->fd, output, sz); if (len == -1) { @@ -3833,4 +4079,3 @@ #endif #endif /* WC_NO_RNG */ -#endif /* HAVE_FIPS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/rsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/rsa.c 2024-08-03 07:30:00.000000000 +0000 @@ -35,15 +35,13 @@ #ifndef NO_RSA -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) - +#if FIPS_VERSION3_GE(2,0,0) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$e") - #pragma const_seg(".fipsB$e") + #pragma code_seg(".fipsA$j") + #pragma const_seg(".fipsB$j") #endif #endif @@ -62,6 +60,14 @@ #include #endif +#if defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_SP_ASM) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif + /* Possible RSA enable options: * NO_RSA: Overall control of RSA default: on @@ -88,134 +94,6 @@ */ -/* If building for old FIPS. */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - -int wc_InitRsaKey(RsaKey* key, void* ptr) -{ - if (key == NULL) { - return BAD_FUNC_ARG; - } - - return InitRsaKey_fips(key, ptr); -} - - -int wc_InitRsaKey_ex(RsaKey* key, void* ptr, int devId) -{ - (void)devId; - if (key == NULL) { - return BAD_FUNC_ARG; - } - return InitRsaKey_fips(key, ptr); -} - - -int wc_FreeRsaKey(RsaKey* key) -{ - return FreeRsaKey_fips(key); -} - - -#ifndef WOLFSSL_RSA_VERIFY_ONLY -int wc_RsaPublicEncrypt(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key, WC_RNG* rng) -{ - if (in == NULL || out == NULL || key == NULL || rng == NULL) { - return BAD_FUNC_ARG; - } - return RsaPublicEncrypt_fips(in, inLen, out, outLen, key, rng); -} -#endif - - -#ifndef WOLFSSL_RSA_PUBLIC_ONLY -int wc_RsaPrivateDecryptInline(byte* in, word32 inLen, byte** out, - RsaKey* key) -{ - if (in == NULL || out == NULL || key == NULL) { - return BAD_FUNC_ARG; - } - return RsaPrivateDecryptInline_fips(in, inLen, out, key); -} - - -int wc_RsaPrivateDecrypt(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key) -{ - if (in == NULL || out == NULL || key == NULL) { - return BAD_FUNC_ARG; - } - return RsaPrivateDecrypt_fips(in, inLen, out, outLen, key); -} - - -int wc_RsaSSL_Sign(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key, WC_RNG* rng) -{ - if (in == NULL || out == NULL || key == NULL || inLen == 0) { - return BAD_FUNC_ARG; - } - return RsaSSL_Sign_fips(in, inLen, out, outLen, key, rng); -} -#endif - - -int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out, RsaKey* key) -{ - if (in == NULL || out == NULL || key == NULL) { - return BAD_FUNC_ARG; - } - return RsaSSL_VerifyInline_fips(in, inLen, out, key); -} - - -int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key) -{ - if (in == NULL || out == NULL || key == NULL || inLen == 0) { - return BAD_FUNC_ARG; - } - return RsaSSL_Verify_fips(in, inLen, out, outLen, key); -} - - -int wc_RsaEncryptSize(const RsaKey* key) -{ - if (key == NULL) { - return BAD_FUNC_ARG; - } - return RsaEncryptSize_fips((RsaKey*)key); -} - - -#ifndef WOLFSSL_RSA_VERIFY_ONLY -int wc_RsaFlattenPublicKey(RsaKey* key, byte* a, word32* aSz, byte* b, - word32* bSz) -{ - - /* not specified as fips so not needing _fips */ - return RsaFlattenPublicKey(key, a, aSz, b, bSz); -} -#endif - - -#ifdef WOLFSSL_KEY_GEN - int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng) - { - return MakeRsaKey(key, size, e, rng); - } -#endif - - -/* these are functions in asn and are routed to wolfssl/wolfcrypt/asn.c -* wc_RsaPrivateKeyDecode -* wc_RsaPublicKeyDecode -*/ - -#else /* else build without fips, or for new fips */ - #include #include #ifdef WOLF_CRYPTO_CB @@ -228,6 +106,14 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_rsa_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000012 }; + int wolfCrypt_FIPS_RSA_sanity(void) + { + return 0; + } +#endif enum { RSA_STATE_NONE = 0, @@ -241,22 +127,25 @@ RSA_STATE_DECRYPT_RES }; - static void wc_RsaCleanup(RsaKey* key) { -#if !defined(WOLFSSL_RSA_VERIFY_INLINE) && !defined(WOLFSSL_NO_MALLOC) - if (key && key->data) { +#if !defined(WOLFSSL_NO_MALLOC) && (defined(WOLFSSL_ASYNC_CRYPT) || \ + (!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_VERIFY_INLINE))) + if (key != NULL) { + #ifndef WOLFSSL_RSA_PUBLIC_ONLY + /* if private operation zero temp buffer */ + if ((key->data != NULL && key->dataLen > 0) && + (key->type == RSA_PRIVATE_DECRYPT || + key->type == RSA_PRIVATE_ENCRYPT)) { + ForceZero(key->data, key->dataLen); + } + #endif /* make sure any allocated memory is free'd */ if (key->dataIsAlloc) { - #ifndef WOLFSSL_RSA_PUBLIC_ONLY - if (key->type == RSA_PRIVATE_DECRYPT || - key->type == RSA_PRIVATE_ENCRYPT) { - ForceZero(key->data, key->dataLen); - } - #endif XFREE(key->data, key->heap, DYNAMIC_TYPE_WOLF_BIGINT); key->dataIsAlloc = 0; } + key->data = NULL; key->dataLen = 0; } @@ -268,29 +157,21 @@ int wc_InitRsaKey_ex(RsaKey* key, void* heap, int devId) { int ret = 0; -#if defined(HAVE_PKCS11) - int isPkcs11 = 0; -#endif if (key == NULL) { return BAD_FUNC_ARG; } -#if defined(HAVE_PKCS11) - if (key->isPkcs11) { - isPkcs11 = 1; - } -#endif - XMEMSET(key, 0, sizeof(RsaKey)); key->type = RSA_TYPE_UNKNOWN; key->state = RSA_STATE_NONE; key->heap = heap; -#if !defined(WOLFSSL_RSA_VERIFY_INLINE) && !defined(WOLFSSL_NO_MALLOC) +#if !defined(WOLFSSL_NO_MALLOC) && (defined(WOLFSSL_ASYNC_CRYPT) || \ + (!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_VERIFY_INLINE))) key->dataIsAlloc = 0; - key->data = NULL; #endif + key->data = NULL; key->dataLen = 0; #ifdef WC_RSA_BLINDING key->rng = NULL; @@ -308,19 +189,18 @@ #endif #ifdef WC_ASYNC_ENABLE_RSA - #if defined(HAVE_PKCS11) - if (!isPkcs11) + #ifdef WOLF_CRYPTO_CB + /* prefer crypto callback */ + if (key->devId != INVALID_DEVID) #endif - { - /* handle as async */ - ret = wolfAsync_DevCtxInit(&key->asyncDev, - WOLFSSL_ASYNC_MARKER_RSA, key->heap, devId); - if (ret != 0) - return ret; - } + { + /* handle as async */ + ret = wolfAsync_DevCtxInit(&key->asyncDev, + WOLFSSL_ASYNC_MARKER_RSA, key->heap, devId); + if (ret != 0) + return ret; + } #endif /* WC_ASYNC_ENABLE_RSA */ -#elif defined(HAVE_PKCS11) - (void)isPkcs11; #endif /* WOLFSSL_ASYNC_CRYPT */ #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -363,6 +243,14 @@ key->handle = NULL; #endif + +#if defined(WOLFSSL_RENESAS_FSPSM) + key->ctx.wrapped_pri1024_key = NULL; + key->ctx.wrapped_pub1024_key = NULL; + key->ctx.wrapped_pri2048_key = NULL; + key->ctx.wrapped_pub2048_key = NULL; + key->ctx.keySz = 0; +#endif return ret; } @@ -385,12 +273,6 @@ ret = BAD_FUNC_ARG; if (ret == 0 && (len < 0 || len > RSA_MAX_ID_LEN)) ret = BUFFER_E; - -#if defined(HAVE_PKCS11) - XMEMSET(key, 0, sizeof(RsaKey)); - key->isPkcs11 = 1; -#endif - if (ret == 0) ret = wc_InitRsaKey_ex(key, heap, devId); if (ret == 0 && id != NULL && len != 0) { @@ -420,12 +302,6 @@ if (labelLen == 0 || labelLen > RSA_MAX_LABEL_LEN) ret = BUFFER_E; } - -#if defined(HAVE_PKCS11) - XMEMSET(key, 0, sizeof(RsaKey)); - key->isPkcs11 = 1; -#endif - if (ret == 0) ret = wc_InitRsaKey_ex(key, heap, devId); if (ret == 0) { @@ -717,6 +593,10 @@ wc_MemZero_Check(key, sizeof(RsaKey)); #endif +#if defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + wc_fspsm_RsaKeyFree(key); +#endif + return ret; } @@ -752,13 +632,13 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* Do blocking async calls here, caller does not support WC_PENDING_E */ do { - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) ret = wc_AsyncWait(ret, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); if (ret >= 0) #endif ret = wc_RsaSSL_Sign((const byte*)msg, msgLen, sig, sigLen, key, rng); #ifdef WOLFSSL_ASYNC_CRYPT - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif if (ret > 0) { @@ -766,13 +646,13 @@ #ifdef WOLFSSL_ASYNC_CRYPT /* Do blocking async calls here, caller does not support WC_PENDING_E */ do { - if (ret == WC_PENDING_E) + if (ret == WC_NO_ERR_TRACE(WC_PENDING_E)) ret = wc_AsyncWait(ret, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); if (ret >= 0) #endif ret = wc_RsaSSL_VerifyInline(sig, sigLen, &plain, key); #ifdef WOLFSSL_ASYNC_CRYPT - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif } @@ -793,13 +673,17 @@ int wc_CheckRsaKey(RsaKey* key) { - DECL_MP_INT_SIZE_DYN(tmp, mp_bitsused(&key->n), RSA_MAX_SIZE); #ifdef WOLFSSL_SMALL_STACK WC_RNG *rng = NULL; #else WC_RNG rng[1]; #endif int ret = 0; + DECL_MP_INT_SIZE_DYN(tmp, (key)? mp_bitsused(&key->n) : 0, RSA_MAX_SIZE); + + if (key == NULL) { + return BAD_FUNC_ARG; + } #ifdef WOLFSSL_CAAM /* can not perform these checks on an encrypted key */ @@ -824,19 +708,13 @@ ret = wc_InitRng(rng); - if (ret == 0) - SAVE_VECTOR_REGISTERS(ret = _svr_ret;); + SAVE_VECTOR_REGISTERS(ret = _svr_ret;); if (ret == 0) { if (INIT_MP_INT_SIZE(tmp, mp_bitsused(&key->n)) != MP_OKAY) ret = MP_INIT_E; } - if (ret == 0) { - if (key == NULL) - ret = BAD_FUNC_ARG; - } - if (ret == 0) ret = _ifc_pairwise_consistency_test(key, rng); @@ -1850,7 +1728,9 @@ if ((ret = RsaMGF(mgf, pkcsBlock + maskLen, (word32)hLen, tmp, (word32)maskLen, heap)) != 0) { + #if !defined(WOLFSSL_NO_MALLOC) || defined(WOLFSSL_STATIC_MEMORY) XFREE(tmp, heap, DYNAMIC_TYPE_RSA_BUFFER); + #endif return ret; } @@ -1864,7 +1744,9 @@ } } if (tmp[i] != (pkcsBlock[i] ^ 0x01)) { + #if !defined(WOLFSSL_NO_MALLOC) || defined(WOLFSSL_STATIC_MEMORY) XFREE(tmp, heap, DYNAMIC_TYPE_RSA_BUFFER); + #endif WOLFSSL_MSG("RsaUnPad_PSS: Padding Error Match"); return PSS_SALTLEN_RECOVER_E; } @@ -1875,13 +1757,17 @@ { for (i = 0; i < maskLen - 1 - saltLen; i++) { if (tmp[i] != pkcsBlock[i]) { + #if !defined(WOLFSSL_NO_MALLOC) || defined(WOLFSSL_STATIC_MEMORY) XFREE(tmp, heap, DYNAMIC_TYPE_RSA_BUFFER); + #endif WOLFSSL_MSG("RsaUnPad_PSS: Padding Error Match"); return PSS_SALTLEN_E; } } if (tmp[i] != (pkcsBlock[i] ^ 0x01)) { + #if !defined(WOLFSSL_NO_MALLOC) || defined(WOLFSSL_STATIC_MEMORY) XFREE(tmp, heap, DYNAMIC_TYPE_RSA_BUFFER); + #endif WOLFSSL_MSG("RsaUnPad_PSS: Padding Error End"); return PSS_SALTLEN_E; } @@ -1902,7 +1788,7 @@ static int RsaUnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen, byte **output, byte padValue) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); word16 i; if (output == NULL || pkcsBlockLen < 2 || pkcsBlockLen > 0xFFFF) { @@ -2085,6 +1971,9 @@ case WC_HASH_TYPE_SHA3_512: case WC_HASH_TYPE_BLAKE2B: case WC_HASH_TYPE_BLAKE2S: +#ifdef WOLFSSL_SM3 + case WC_HASH_TYPE_SM3: +#endif #ifdef WOLFSSL_SHAKE128 case WC_HASH_TYPE_SHAKE128: #endif @@ -2123,6 +2012,7 @@ if (ret == 0) { switch(type) { +#if !defined(WOLFSSL_RSA_PUBLIC_ONLY) case RSA_PRIVATE_DECRYPT: case RSA_PRIVATE_ENCRYPT: ret = fp_exptmod_nb(&key->nb->exptmod, &key->nb->tmp, &key->d, @@ -2132,7 +2022,7 @@ if (ret != MP_OKAY) ret = MP_EXPTMOD_E; break; - +#endif case RSA_PUBLIC_ENCRYPT: case RSA_PUBLIC_DECRYPT: ret = fp_exptmod_nb(&key->nb->exptmod, &key->nb->tmp, &key->e, @@ -2245,7 +2135,7 @@ XIL_CAST_U64(out)) != XST_SUCCESS) { ret = BAD_STATE_E; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out, inLen); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out, inLen); #else if (XSecure_RsaPrivateDecrypt(&rsa, (u8*)in, inLen, out) != XST_SUCCESS) { @@ -2273,7 +2163,7 @@ WOLFSSL_MSG("RSA public operation failed"); ret = BAD_STATE_E; } - WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE((UINTPTR)out, inLen); + WOLFSSL_XIL_DCACHE_FLUSH_RANGE((UINTPTR)out, inLen); #elif defined(WOLFSSL_XILINX_CRYPTO_OLD) if (XSecure_RsaDecrypt(&(key->xRsa), in, out) != XST_SUCCESS) { ret = BAD_STATE_E; @@ -2599,6 +2489,7 @@ { int ret = 0; #if defined(WC_RSA_BLINDING) && !defined(WC_NO_RNG) + mp_digit mp = 0; DECL_MP_INT_SIZE_DYN(rnd, mp_bitsused(&key->n), RSA_MAX_SIZE); DECL_MP_INT_SIZE_DYN(rndi, mp_bitsused(&key->n), RSA_MAX_SIZE); #endif /* WC_RSA_BLINDING && !WC_NO_RNG */ @@ -2731,9 +2622,31 @@ #endif /* RSA_LOW_MEM */ #if defined(WC_RSA_BLINDING) && !defined(WC_NO_RNG) - /* unblind */ - if (ret == 0 && mp_mulmod(tmp, rndi, &key->n, tmp) != MP_OKAY) + /* Multiply result (tmp) by blinding invertor (rndi). + * Use Montgomery form to make operation more constant time. + */ + if ((ret == 0) && (mp_montgomery_setup(&key->n, &mp) != MP_OKAY)) { + ret = MP_MULMOD_E; + } + if ((ret == 0) && (mp_montgomery_calc_normalization(rnd, &key->n) != + MP_OKAY)) { + ret = MP_MULMOD_E; + } + /* Convert blinding invert to Montgomery form. */ + if ((ret == 0) && (mp_mul(rndi, rnd, rndi) != MP_OKAY)) { ret = MP_MULMOD_E; + } + if ((ret == 0) && (mp_mod(rndi, &key->n, rndi) != MP_OKAY)) { + ret = MP_MULMOD_E; + } + /* Multiply result by blinding invert. */ + if ((ret == 0) && (mp_mul(tmp, rndi, tmp) != MP_OKAY)) { + ret = MP_MULMOD_E; + } + /* Reduce result. */ + if ((ret == 0) && (mp_montgomery_reduce_ct(tmp, &key->n, mp) != MP_OKAY)) { + ret = MP_MULMOD_E; + } mp_forcezero(rndi); mp_forcezero(rnd); @@ -2758,12 +2671,16 @@ NEW_MP_INT_SIZE(tmp, mp_bitsused(&key->n), key->heap, DYNAMIC_TYPE_RSA); #ifdef MP_INT_SIZE_CHECK_NULL - if (tmp == NULL) + if (tmp == NULL) { + WOLFSSL_MSG("NEW_MP_INT_SIZE tmp is NULL, return MEMORY_E"); return MEMORY_E; + } #endif - if (INIT_MP_INT_SIZE(tmp, mp_bitsused(&key->n)) != MP_OKAY) + if (INIT_MP_INT_SIZE(tmp, mp_bitsused(&key->n)) != MP_OKAY) { + WOLFSSL_MSG("INIT_MP_INT_SIZE failed."); ret = MP_INIT_E; + } #ifndef TEST_UNPAD_CONSTANT_TIME if (ret == 0 && mp_read_unsigned_bin(tmp, in, inLen) != MP_OKAY) @@ -2787,8 +2704,10 @@ #endif case RSA_PUBLIC_ENCRYPT: case RSA_PUBLIC_DECRYPT: - if (mp_exptmod_nct(tmp, &key->e, &key->n, tmp) != MP_OKAY) + if (mp_exptmod_nct(tmp, &key->e, &key->n, tmp) != MP_OKAY) { + WOLFSSL_MSG("mp_exptmod_nct failed"); ret = MP_EXPTMOD_E; + } break; default: ret = RSA_WRONG_TYPE_E; @@ -2797,9 +2716,23 @@ } if (ret == 0) { - if (mp_to_unsigned_bin_len(tmp, out, (int)*outLen) != MP_OKAY) - ret = MP_TO_E; + WOLFSSL_MSG("mp_to_unsigned_bin_len_ct..."); + if (mp_to_unsigned_bin_len_ct(tmp, out, (int)*outLen) != MP_OKAY) { + WOLFSSL_MSG("mp_to_unsigned_bin_len_ct failed"); + ret = MP_TO_E; + } + } +#ifdef WOLFSSL_RSA_CHECK_D_ON_DECRYPT + if ((ret == 0) && (type == RSA_PRIVATE_DECRYPT)) { + mp_sub(&key->n, &key->p, tmp); + mp_sub(tmp, &key->q, tmp); + mp_add_d(tmp, 1, tmp); + mp_mulmod(&key->d, &key->e, tmp, tmp); + if (!mp_isone(tmp)) { + ret = MP_EXPTMOD_E; + } } +#endif #else (void)type; (void)key; @@ -2823,6 +2756,7 @@ ret = wc_RsaEncryptSize(key); if (ret < 0) { + WOLFSSL_MSG_EX("wc_RsaEncryptSize failed err = %d", ret); return ret; } keyLen = (word32)ret; @@ -2837,12 +2771,13 @@ } if (mp_iseven(&key->n)) { + WOLFSSL_MSG("MP_VAL is even"); return MP_VAL; } #ifdef WOLFSSL_HAVE_SP_RSA ret = RsaFunction_SP(in, inLen, out, outLen, type, key, rng); - if (ret != WC_KEY_SIZE_E) + if (ret != WC_NO_ERR_TRACE(WC_KEY_SIZE_E)) return ret; #endif /* WOLFSSL_HAVE_SP_RSA */ @@ -2891,7 +2826,7 @@ } #endif /* WOLFSSL_ASYNC_CRYPT_SW */ - switch(type) { + switch (type) { #ifndef WOLFSSL_RSA_PUBLIC_ONLY case RSA_PRIVATE_DECRYPT: case RSA_PRIVATE_ENCRYPT: @@ -2913,7 +2848,7 @@ &key->u.raw, out, outLen); #endif - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #else ret = wc_RsaFunctionSync(in, inLen, out, outLen, type, key, rng); #endif break; @@ -2931,7 +2866,7 @@ ret = IntelQaRsaPublic(&key->asyncDev, in, inLen, &key->e.raw, &key->n.raw, out, outLen); - #else /* WOLFSSL_ASYNC_CRYPT_SW */ + #else ret = wc_RsaFunctionSync(in, inLen, out, outLen, type, key, rng); #endif break; @@ -2945,21 +2880,9 @@ #endif /* WOLFSSL_ASYNC_CRYPT && WC_ASYNC_ENABLE_RSA */ #if defined(WC_RSA_DIRECT) || defined(WC_RSA_NO_PADDING) -/* Function that does the RSA operation directly with no padding. - * - * in buffer to do operation on - * inLen length of input buffer - * out buffer to hold results - * outSz gets set to size of result buffer. Should be passed in as length - * of out buffer. If the pointer "out" is null then outSz gets set to - * the expected buffer size needed and LENGTH_ONLY_E gets returned. - * key RSA key to use for encrypt/decrypt - * type if using private or public key {RSA_PUBLIC_ENCRYPT, - * RSA_PUBLIC_DECRYPT, RSA_PRIVATE_ENCRYPT, RSA_PRIVATE_DECRYPT} - * rng wolfSSL RNG to use if needed - * - * returns size of result on success - */ +/* Performs direct RSA computation without padding. The input and output must + * match the key size (ex: 2048-bits = 256 bytes). Returns the size of the + * output on success or negative value on failure. */ int wc_RsaDirect(byte* in, word32 inLen, byte* out, word32* outSz, RsaKey* key, int type, WC_RNG* rng) { @@ -3008,7 +2931,7 @@ key->dataLen = *outSz; ret = wc_RsaFunction(in, inLen, out, &key->dataLen, type, key, rng); - if (ret >= 0 || ret == WC_PENDING_E) { + if (ret >= 0 || ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { key->state = (type == RSA_PRIVATE_ENCRYPT || type == RSA_PUBLIC_ENCRYPT) ? RSA_STATE_ENCRYPT_RES: RSA_STATE_DECRYPT_RES; @@ -3142,7 +3065,7 @@ #ifndef WOLF_CRYPTO_CB_ONLY_RSA #if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(TEST_UNPAD_CONSTANT_TIME) && !defined(NO_RSA_BOUNDS_CHECK) /* Check that 1 < in < n-1. (Requirement of 800-56B.) */ -static int RsaFunctionCheckIn(const byte* in, word32 inLen, RsaKey* key, +int RsaFunctionCheckIn(const byte* in, word32 inLen, RsaKey* key, int checkSmallCt) { int ret = 0; @@ -3206,12 +3129,12 @@ { ret = wc_CryptoCb_Rsa(in, inLen, out, outLen, type, key, rng); #ifndef WOLF_CRYPTO_CB_ONLY_RSA - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable and try using software */ #endif #ifdef WOLF_CRYPTO_CB_ONLY_RSA - if (ret == CRYPTOCB_UNAVAILABLE) { + if (ret == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { return NO_VALID_DEVID; } return ret; @@ -3219,7 +3142,9 @@ } #endif -#ifndef WOLF_CRYPTO_CB_ONLY_RSA +#ifdef WOLF_CRYPTO_CB_ONLY_RSA + return NO_VALID_DEVID; +#else /* !WOLF_CRYPTO_CB_ONLY_RSA */ SAVE_VECTOR_REGISTERS(return _svr_ret;); #if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(TEST_UNPAD_CONSTANT_TIME) && \ @@ -3261,7 +3186,7 @@ && ret != FP_WOULDBLOCK #endif ) { - if (ret == MP_EXPTMOD_E) { + if (ret == WC_NO_ERR_TRACE(MP_EXPTMOD_E)) { /* This can happen due to incorrectly set FP_MAX_BITS or missing XREALLOC */ WOLFSSL_MSG("RSA_FUNCTION MP_EXPTMOD_E: memory/config problem"); } @@ -3270,13 +3195,13 @@ wc_RsaCleanup(key); } return ret; -#endif /* WOLF_CRYPTO_CB_ONLY_RSA */ +#endif /* !WOLF_CRYPTO_CB_ONLY_RSA */ } int wc_RsaFunction(const byte* in, word32 inLen, byte* out, word32* outLen, int type, RsaKey* key, WC_RNG* rng) { - /* Always check for ciphertext of 0 or 1. (Should't for OAEP decrypt.) */ + /* Always check for ciphertext of 0 or 1. (Shouldn't for OAEP decrypt.) */ return wc_RsaFunction_ex(in, inLen, out, outLen, type, key, rng, 1); } @@ -3387,16 +3312,18 @@ pad_value, pad_type, hash, mgf, label, labelSz, sz); } - #elif defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - /* SCE needs warpped key which is passed via + #elif defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) || \ + (!defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) + /* SCE needs wrapped key which is passed via * user ctx object of crypt-call back. */ #ifdef WOLF_CRYPTO_CB if (key->devId != INVALID_DEVID) { /* SCE supports 1024 and 2048 bits */ ret = wc_CryptoCb_Rsa(in, inLen, out, - outLen, rsa_type, key, rng); - if (ret != CRYPTOCB_UNAVAILABLE) + &outLen, rsa_type, key, rng); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ ret = 0; /* reset error code and try using software */ @@ -3421,7 +3348,7 @@ ret = wc_RsaFunction(out, (word32)sz, out, &key->dataLen, rsa_type, key, rng); - if (ret >= 0 || ret == WC_PENDING_E) { + if (ret >= 0 || ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { key->state = RSA_STATE_ENCRYPT_RES; } if (ret < 0) { @@ -3481,7 +3408,7 @@ byte* label, word32 labelSz, int saltLen, WC_RNG* rng) { - int ret = RSA_WRONG_TYPE_E; + int ret = WC_NO_ERR_TRACE(RSA_WRONG_TYPE_E); byte* pad = NULL; if (in == NULL || inLen == 0 || out == NULL || key == NULL) { @@ -3546,12 +3473,14 @@ } return ret; } - #elif defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) + #elif defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) || \ + (!defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) #ifdef WOLF_CRYPTO_CB if (key->devId != INVALID_DEVID) { ret = wc_CryptoCb_Rsa(in, inLen, out, - outLen, rsa_type, key, rng); - if (ret != CRYPTOCB_UNAVAILABLE) + &outLen, rsa_type, key, rng); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ ret = 0; /* reset error code and try using software */ @@ -3579,6 +3508,7 @@ break; } XMEMCPY(key->data, in, inLen); + key->dataLen = inLen; } else { key->dataIsAlloc = 0; @@ -3600,7 +3530,7 @@ rng, pad_type != WC_RSA_OAEP_PAD); #endif - if (ret >= 0 || ret == WC_PENDING_E) { + if (ret >= 0 || ret == WC_NO_ERR_TRACE(WC_PENDING_E)) { key->state = RSA_STATE_DECRYPT_UNPAD; } if (ret < 0) { @@ -3612,16 +3542,17 @@ case RSA_STATE_DECRYPT_UNPAD: #if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_VERIFY_INLINE) && \ !defined(WOLFSSL_NO_MALLOC) - ret = wc_RsaUnPad_ex(key->data, key->dataLen, &pad, pad_value, pad_type, - hash, mgf, label, labelSz, saltLen, - mp_count_bits(&key->n), key->heap); -#else - ret = wc_RsaUnPad_ex(out, key->dataLen, &pad, pad_value, pad_type, hash, - mgf, label, labelSz, saltLen, - mp_count_bits(&key->n), key->heap); + ret = wc_RsaUnPad_ex(key->data, + key->dataLen, &pad, pad_value, pad_type, hash, mgf, + label, labelSz, saltLen, mp_count_bits(&key->n), key->heap); +#else + ret = wc_RsaUnPad_ex(out, + key->dataLen, &pad, pad_value, pad_type, hash, mgf, label, + labelSz, saltLen, mp_count_bits(&key->n), key->heap); #endif - if (rsa_type == RSA_PUBLIC_DECRYPT && ret > (int)outLen) + if (rsa_type == RSA_PUBLIC_DECRYPT && ret > (int)outLen) { ret = RSA_BUFFER_E; + } else if (ret >= 0 && pad != NULL) { /* only copy output if not inline */ if (outPtr == NULL) { @@ -3647,8 +3578,9 @@ XMEMCPY(out, pad, (size_t)ret); } } - else + else { *outPtr = pad; + } #if !defined(WOLFSSL_RSA_VERIFY_ONLY) ret = ctMaskSelInt(ctMaskLTE(ret, (int)outLen), ret, RSA_BUFFER_E); @@ -4085,7 +4017,10 @@ /* Sig = Salt | Exp Hash */ if (ret == 0) { - if (sigSz != inSz + (word32)saltLen) { + word32 totalSz; + if ((WC_SAFE_SUM_WORD32(inSz, (word32)saltLen, totalSz) == 0) || + (sigSz != totalSz)) + { ret = PSS_SALTLEN_E; } } @@ -4311,7 +4246,7 @@ #ifdef WOLF_CRYPTO_CB if (ret == 0 && key->devId != INVALID_DEVID) { - if (wc_CryptoCb_RsaGetSize(key, &ret) == CRYPTOCB_UNAVAILABLE) { + if (wc_CryptoCb_RsaGetSize(key, &ret) == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { ret = 2048/8; /* hardware handles, use 2048-bit as default */ } } @@ -4351,9 +4286,6 @@ } #endif -#endif /* HAVE_FIPS */ - - #ifndef WOLFSSL_RSA_VERIFY_ONLY static int RsaGetValue(mp_int* in, byte* out, word32* outSz) { @@ -4381,7 +4313,7 @@ byte* d, word32* dSz, byte* p, word32* pSz, byte* q, word32* qSz) { - int ret = BAD_FUNC_ARG; + int ret = WC_NO_ERR_TRACE(BAD_FUNC_ARG); if (key && e && eSz && n && nSz && d && dSz && p && pSz && q && qSz) ret = 0; @@ -4451,7 +4383,7 @@ #ifdef WOLFSSL_CHECK_MEM_ZERO if (ret == 0) - mp_memzero_add("Comare PQ d", d); + mp_memzero_add("Compare PQ d", d); #endif #if !defined(WOLFSSL_SP_MATH) && (!defined(WOLFSSL_SP_MATH_ALL) || \ @@ -4586,7 +4518,8 @@ if (q != NULL) { int valid = 0; - /* 5.4 - check that |p-q| <= (2^(1/2))(2^((nlen/2)-1)) */ + /* 5.4 (186-4) 5.5 (186-5) - + * check that |p-q| <= (2^(1/2))(2^((nlen/2)-1)) */ ret = wc_CompareDiffPQ(p, q, nlen, &valid); if ((ret != MP_OKAY) || (!valid)) goto notOkay; prime = q; @@ -4594,14 +4527,15 @@ else prime = p; - /* 4.4,5.5 - Check that prime >= (2^(1/2))(2^((nlen/2)-1)) + /* 4.4,5.5 (186-4) 4.4,5.4 (186-5) - + * Check that prime >= (2^(1/2))(2^((nlen/2)-1)) * This is a comparison against lowerBound */ ret = mp_read_unsigned_bin(tmp1, lower_bound, (word32)nlen/16); if (ret != MP_OKAY) goto notOkay; ret = mp_cmp(prime, tmp1); if (ret == MP_LT) goto exit; - /* 4.5,5.6 - Check that GCD(p-1, e) == 1 */ + /* 4.5,5.6 (186-4 & 186-5) - Check that GCD(p-1, e) == 1 */ ret = mp_sub_d(prime, 1, tmp1); /* tmp1 = prime-1 */ if (ret != MP_OKAY) goto notOkay; #ifdef WOLFSSL_CHECK_MEM_ZERO @@ -4776,7 +4710,12 @@ #endif /* WOLFSSL_SMALL_STACK */ int i, failCount, isPrime = 0; word32 primeSz; +#ifndef WOLFSSL_NO_MALLOC byte* buf = NULL; +#else + /* RSA_MAX_SIZE is the size of n in bits. */ + byte buf[RSA_MAX_SIZE/16]; +#endif #endif /* !WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 */ int err; @@ -4835,12 +4774,12 @@ { err = wc_CryptoCb_MakeRsaKey(key, size, e, rng); #ifndef WOLF_CRYPTO_CB_ONLY_RSA - if (err != CRYPTOCB_UNAVAILABLE) + if (err != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) goto out; /* fall-through when unavailable */ #endif #ifdef WOLF_CRYPTO_CB_ONLY_RSA - if (err == CRYPTOCB_UNAVAILABLE) + if (err == WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) err = NO_VALID_DEVID; goto out; } @@ -4857,7 +4796,7 @@ #elif defined(HAVE_INTEL_QA) err = IntelQaRsaKeyGen(&key->asyncDev, key, size, e, rng); goto out; - #else + #elif defined(WOLFSSL_ASYNC_CRYPT_SW) if (wc_AsyncSwInit(&key->asyncDev, ASYNC_SW_RSA_MAKE)) { WC_ASYNC_SW* sw = &key->asyncDev.sw; sw->rsaMake.rng = rng; @@ -4882,12 +4821,14 @@ primeSz = (word32)size / 16; /* size is the size of n in bits. primeSz is in bytes. */ +#ifndef WOLFSSL_NO_MALLOC /* allocate buffer to work with */ if (err == MP_OKAY) { buf = (byte*)XMALLOC(primeSz, key->heap, DYNAMIC_TYPE_RSA); if (buf == NULL) err = MEMORY_E; } +#endif SAVE_VECTOR_REGISTERS(err = _svr_ret;); @@ -4903,7 +4844,7 @@ #endif isPrime = 0; i = 0; - do { + for (;;) { #ifdef SHOW_GEN printf("."); fflush(stdout); @@ -4926,9 +4867,15 @@ i++; #else /* Keep the old retry behavior in non-FIPS build. */ - (void)i; #endif - } while (err == MP_OKAY && !isPrime && i < failCount); + + if (err != MP_OKAY || isPrime || i >= failCount) + break; + + /* linuxkm: release the kernel for a moment before iterating. */ + RESTORE_VECTOR_REGISTERS(); + SAVE_VECTOR_REGISTERS(err = _svr_ret; break;); + }; } if (err == MP_OKAY && !isPrime) @@ -4984,10 +4931,14 @@ if (err == MP_OKAY && !isPrime) err = PRIME_GEN_E; +#ifndef WOLFSSL_NO_MALLOC if (buf) { ForceZero(buf, primeSz); XFREE(buf, key->heap, DYNAMIC_TYPE_RSA); } +#else + ForceZero(buf, primeSz); +#endif if (err == MP_OKAY && mp_cmp(p, q) < 0) { err = mp_copy(p, tmp1); @@ -5205,4 +5156,115 @@ #endif /* WC_RSA_NONBLOCK_TIME */ #endif /* WC_RSA_NONBLOCK */ +#ifndef WOLFSSL_RSA_PUBLIC_ONLY + +#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) +/* + * Calculate y = d mod(x-1) + */ +static int CalcDX(mp_int* y, mp_int* x, mp_int* d) +{ + int err; +#ifndef WOLFSSL_SMALL_STACK + mp_int m[1]; +#else + mp_int* m = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_WOLF_BIGINT); + if (m == NULL) + return MEMORY_E; +#endif + + err = mp_init(m); + if (err == MP_OKAY) { + err = mp_sub_d(x, 1, m); + if (err == MP_OKAY) + err = mp_mod(d, m, y); + mp_forcezero(m); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(m, NULL, DYNAMIC_TYPE_WOLF_BIGINT); +#endif + + return err; +} +#endif + +int wc_RsaPrivateKeyDecodeRaw(const byte* n, word32 nSz, + const byte* e, word32 eSz, const byte* d, word32 dSz, + const byte* u, word32 uSz, const byte* p, word32 pSz, + const byte* q, word32 qSz, const byte* dP, word32 dPSz, + const byte* dQ, word32 dQSz, RsaKey* key) +{ + int err = MP_OKAY; + + if (n == NULL || nSz == 0 || e == NULL || eSz == 0 + || d == NULL || dSz == 0 || p == NULL || pSz == 0 + || q == NULL || qSz == 0 || key == NULL) { + err = BAD_FUNC_ARG; + } + +#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) + if (err == MP_OKAY) { + if ((u == NULL || uSz == 0) + || (dP != NULL && dPSz == 0) + || (dQ != NULL && dQSz == 0)) { + err = BAD_FUNC_ARG; + } + } +#else + (void)u; + (void)uSz; + (void)dP; + (void)dPSz; + (void)dQ; + (void)dQSz; +#endif + + if (err == MP_OKAY) + err = mp_read_unsigned_bin(&key->n, n, nSz); + if (err == MP_OKAY) + err = mp_read_unsigned_bin(&key->e, e, eSz); + if (err == MP_OKAY) + err = mp_read_unsigned_bin(&key->d, d, dSz); + if (err == MP_OKAY) + err = mp_read_unsigned_bin(&key->p, p, pSz); + if (err == MP_OKAY) + err = mp_read_unsigned_bin(&key->q, q, qSz); +#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) + if (err == MP_OKAY) + err = mp_read_unsigned_bin(&key->u, u, uSz); + if (err == MP_OKAY) { + if (dP != NULL) + err = mp_read_unsigned_bin(&key->dP, dP, dPSz); + else + err = CalcDX(&key->dP, &key->p, &key->d); + } + if (err == MP_OKAY) { + if (dQ != NULL) + err = mp_read_unsigned_bin(&key->dQ, dQ, dQSz); + else + err = CalcDX(&key->dQ, &key->q, &key->d); + } +#endif + + if (err == MP_OKAY) { + key->type = RSA_PRIVATE; + } + else { + mp_clear(&key->n); + mp_clear(&key->e); + mp_clear(&key->d); + mp_clear(&key->p); + mp_clear(&key->q); +#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) + mp_clear(&key->u); + mp_clear(&key->dP); + mp_clear(&key->dQ); +#endif + } + + return err; +} +#endif /* WOLFSSL_RSA_PUBLIC_ONLY */ + #endif /* NO_RSA */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sakke.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sakke.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sakke.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sakke.c 2024-08-03 07:30:00.000000000 +0000 @@ -44,6 +44,14 @@ #include #include +#if defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_SP_ASM) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif + #ifndef WOLFSSL_HAVE_ECC_KEY_GET_PRIV /* FIPS build has replaced ecc.h. */ #define wc_ecc_key_get_priv(key) (&((key)->k)) @@ -293,7 +301,7 @@ err = mp_read_radix(params->base->y, key->ecc.dp->Gy, MP_RADIX_HEX); } if (err == 0) { - /* Affine co-ordinates have a Z of 1 in Jacobian. */ + /* Affine coordinates have a Z of 1 in Jacobian. */ err = mp_set(params->base->z, 1); } if (err == 0) { @@ -312,21 +320,25 @@ * @param [in] key SAKKE key. * @param [in] n MP integer that is the scalar. * @param [out] res ECC point to hold the result. - * @param [in] map Map the result to affine co-ordinates. + * @param [in] map Map the result to affine coordinates. * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ static int sakke_mulmod_base(SakkeKey* key, const mp_int* n, ecc_point* res, int map) { - int err = NOT_COMPILED_IN; + int err = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #ifdef WOLFSSL_SP_1024 if ((key->ecc.idx != ECC_CUSTOM_IDX) && (ecc_sets[key->ecc.idx].id == ECC_SAKKE_1)) { err = sp_ecc_mulmod_base_1024(n, res, map, key->heap); } + else #endif + { + err = NOT_COMPILED_IN; + } return err; } @@ -338,21 +350,25 @@ * @param [in] n MP integer that is the scalar. * @param [in] a ECC point to add. * @param [out] res ECC point to hold the result. - * @param [in] map Map the result to affine co-ordinates. + * @param [in] map Map the result to affine coordinates. * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ static int sakke_mulmod_base_add(SakkeKey* key, const mp_int* n, const ecc_point* a, ecc_point* res, int map) { - int err = NOT_COMPILED_IN; + int err = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #ifdef WOLFSSL_SP_1024 if ((key->ecc.idx != ECC_CUSTOM_IDX) && (ecc_sets[key->ecc.idx].id == ECC_SAKKE_1)) { err = sp_ecc_mulmod_base_add_1024(n, a, 0, res, map, key->heap); } + else #endif + { + err = NOT_COMPILED_IN; + } return err; } @@ -363,7 +379,7 @@ * @param [in] key SAKKE key. * @param [in] n MP integer that is the scalar. * @param [out] res ECC point to hold the result. - * @param [in] map Map the result to affine co-ordinates. + * @param [in] map Map the result to affine coordinates. * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ @@ -386,7 +402,7 @@ * @param [in] a ECC point to add. Point ordinates must be in Montgomery * form. * @param [out] res ECC point to hold the result. - * @param [in] map Map the result to affine co-ordinates. + * @param [in] map Map the result to affine coordinates. * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ @@ -408,7 +424,7 @@ ¶ms->prime, mp); } if ((err == 0) && map) { - /* Map result back to affine co-ordinates. */ + /* Map result back to affine coordinates. */ err = ecc_map(res, ¶ms->prime, mp); } @@ -425,14 +441,14 @@ * @param [in] p ECC point to multiply. * @param [in] table Precomputation table for p. May be NULL. * @param [out] res ECC point to hold the result. - * @param [in] map Map the result to affine co-ordinates. + * @param [in] map Map the result to affine coordinates. * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ static int sakke_mulmod_point(SakkeKey* key, const mp_int* n, const ecc_point* p, byte* table, ecc_point* res, int map) { - int err = NOT_COMPILED_IN; + int err = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #ifdef WOLFSSL_SP_1024 if ((key->ecc.idx != ECC_CUSTOM_IDX) && @@ -444,7 +460,11 @@ err = sp_ecc_mulmod_table_1024(n, p, table, res, map, key->heap); } } + else #endif + { + err = NOT_COMPILED_IN; + } return err; } @@ -457,7 +477,7 @@ * @param [in] p ECC point to multiply. * @param [in] table Precomputation table for p. May be NULL. * @param [out] res ECC point to hold the result. - * @param [in] map Map the result to affine co-ordinates. + * @param [in] map Map the result to affine coordinates. * @return 0 on success. * @return MEMORY_E when dynamic memory allocation fails. */ @@ -1004,7 +1024,7 @@ /** * Encode the SAKKE Receiver Secret Key (RSK) as DER encoded public ECC key. * - * Encode the RSK to send to ther receiving client. + * Encode the RSK to send to the receiving client. * * X and y ordinate of RSK point concatenated. Each number is zero padded to * key size. @@ -1343,7 +1363,7 @@ static int sakke_pairing(const SakkeKey* key, const ecc_point* p, const ecc_point* q, mp_int* r, const byte* table, word32 len) { - int err = NOT_COMPILED_IN; + int err = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #ifdef WOLFSSL_SP_1024 if ((key->ecc.idx != ECC_CUSTOM_IDX) && @@ -1355,6 +1375,9 @@ err = sp_Pairing_precomp_1024(p, q, r, table, len); } } + else { + err = NOT_COMPILED_IN; + } #else (void)key; (void)p; @@ -1362,6 +1385,7 @@ (void)r; (void)table; (void)len; + err = NOT_COMPILED_IN; #endif return err; @@ -2515,14 +2539,18 @@ static int sakke_modexp(const SakkeKey* key, const mp_int* b, mp_int* e, mp_int* r) { - int err = NOT_COMPILED_IN; + int err = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #ifdef WOLFSSL_SP_1024 if ((key->ecc.idx != ECC_CUSTOM_IDX) && (ecc_sets[key->ecc.idx].id == ECC_SAKKE_1)) { err = sp_ModExp_Fp_star_1024(b, e, r); } + else #endif + { + err = NOT_COMPILED_IN; + } return err; } @@ -6514,7 +6542,6 @@ key->i.table = table; key->i.tableLen = *len; } - (void)table; #endif return err; @@ -6544,7 +6571,7 @@ #ifdef WOLFSSL_HAVE_SP_ECC if (err == 0) { err = sp_ecc_gen_table_1024(key->i.i, NULL, &sz, NULL); - if (err == LENGTH_ONLY_E) { + if (err == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { err = 0; } } @@ -6794,7 +6821,7 @@ } } if (err == 0) { - /* Return length only if an ouput buffer is NULL. */ + /* Return length only if an output buffer is NULL. */ if (ssv == NULL) { *ssvSz = (word16) (n / 8); err = LENGTH_ONLY_E; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha.c 2024-08-03 07:30:00.000000000 +0000 @@ -36,13 +36,13 @@ #if !defined(NO_SHA) -#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$j") - #pragma const_seg(".fipsB$j") + #pragma code_seg(".fipsA$k") + #pragma const_seg(".fipsB$k") #endif #endif @@ -58,73 +58,52 @@ #include #endif -#undef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +/* Assume no hash HW available until supporting HW found. */ +#undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW + +#if defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) /* define a single keyword for simplicity & readability * * by default the HW acceleration is on for ESP32-WROOM32 * but individual components can be turned off. */ - #define WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #define WOLFSSL_USE_ESP32_CRYPT_HASH_HW #include "wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h" /* Although we have hardware acceleration, ** we may need to fall back to software */ #define USE_SHA_SOFTWARE_IMPL - static const char* TAG = "wc_sha"; + #elif defined(WOLFSSL_USE_ESP32C3_CRYPT_HASH_HW) /* The ESP32C3 is different; HW crypto here. Not yet implemented. ** We'll be using software for RISC-V at this time */ - static const char* TAG = "wc_sha-c3"; #else - #undef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW #endif -/* fips wrapper calls, user can call direct */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - - int wc_InitSha(wc_Sha* sha) - { - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return InitSha_fips(sha); - } - int wc_InitSha_ex(wc_Sha* sha, void* heap, int devId) - { - (void)heap; - (void)devId; - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return InitSha_fips(sha); - } - - int wc_ShaUpdate(wc_Sha* sha, const byte* data, word32 len) - { - if (sha == NULL || (data == NULL && len > 0)) { - return BAD_FUNC_ARG; - } - return ShaUpdate_fips(sha, data, len); - } - - int wc_ShaFinal(wc_Sha* sha, byte* out) - { - if (sha == NULL || out == NULL) { - return BAD_FUNC_ARG; - } - return ShaFinal_fips(sha,out); - } - void wc_ShaFree(wc_Sha* sha) - { - (void)sha; - /* Not supported in FIPS */ - } - -#else /* else build without fips, or for FIPS v2 */ +#undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW +#if defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + /* define a single keyword for simplicity & readability + * + * by default the HW acceleration is on for ESP32-WROOM32 + * but individual components can be turned off. + */ + #define WOLFSSL_USE_ESP32_CRYPT_HASH_HW + #include "wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h" + /* Although we have hardware acceleration, + ** we may need to fall back to software */ + #define USE_SHA_SOFTWARE_IMPL + static const char* TAG = "wc_sha"; +#elif defined(WOLFSSL_USE_ESP32C3_CRYPT_HASH_HW) + /* The ESP32C3 is different; HW crypto here. Not yet implemented. + ** We'll be using software for RISC-V at this time */ + static const char* TAG = "wc_sha-c3"; +#else + #undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW +#endif #if defined(WOLFSSL_TI_HASH) /* #include included by wc_port.c */ @@ -139,6 +118,14 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_sha_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000013 }; + int wolfCrypt_FIPS_SHA_sanity(void) + { + return 0; + } +#endif /* Hardware Acceleration */ #if defined(WOLFSSL_PIC32MZ_HASH) @@ -321,7 +308,7 @@ !defined(WOLFSSL_QNX_CAAM) /* wolfcrypt/src/port/caam/caam_sha.c */ -#elif defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) || \ +#elif defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) || \ defined(WOLFSSL_USE_ESP32C3_CRYPT_HASH_HW) /* This function initializes SHA. @@ -347,11 +334,17 @@ return ret; } -#elif defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ +#elif (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + + /* implemented in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #elif defined(WOLFSSL_IMXRT_DCP) #include /* implemented in wolfcrypt/src/port/nxp/dcp_port.c */ @@ -550,9 +543,9 @@ /* -** wolfCrypt InitSha256 external wrapper. +** wolfCrypt InitSha external wrapper. ** -** we'll assume this is ALWAYS for a new, uninitialized sha256 +** we'll assume this is ALWAYS for a new, uninitialized sha */ int wc_InitSha_ex(wc_Sha* sha, void* heap, int devId) { @@ -567,7 +560,7 @@ sha->devCtx = NULL; #endif -#ifdef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW +#ifdef WOLFSSL_USE_ESP32_CRYPT_HASH_HW if (sha->ctx.mode != ESP32_SHA_INIT) { /* it may be interesting to see old values during debugging */ ESP_LOGV(TAG, "Set ctx mode from prior value: %d", sha->ctx.mode); @@ -586,7 +579,7 @@ sha->heap, devId); #else (void)devId; -# endif /* WOLFSSL_ASYNC_CRYPT */ +#endif /* WOLFSSL_ASYNC_CRYPT */ #ifdef WOLFSSL_IMXRT1170_CAAM ret = wc_CAAM_HashInit(&sha->hndl, &sha->ctx, WC_HASH_TYPE_SHA); #endif @@ -613,7 +606,7 @@ #ifdef WOLF_CRYPTO_CB if (sha->devId != INVALID_DEVID) { ret = wc_CryptoCb_ShaHash(sha, data, len, NULL); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; ret = 0; /* reset ret */ /* fall-through when unavailable */ @@ -647,21 +640,49 @@ len -= blocksLen; if (sha->buffLen == WC_SHA_BLOCK_SIZE) { - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - ByteReverseWords(sha->buffer, sha->buffer, WC_SHA_BLOCK_SIZE); - #endif - - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) if (sha->ctx.mode == ESP32_SHA_INIT) { - ESP_LOGV(TAG, "wc_ShaUpdate try hardware"); + #if defined(WOLFSSL_DEBUG_MUTEX) + { + ESP_LOGI(TAG, "wc_ShaUpdate try hardware"); + } + #endif esp_sha_try_hw_lock(&sha->ctx); } + #endif + + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + if (esp_sha_need_byte_reversal(&sha->ctx)) + #endif + { + ByteReverseWords(sha->buffer, sha->buffer, WC_SHA_BLOCK_SIZE); + } + #endif + + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) if (sha->ctx.mode == ESP32_SHA_SW) { - ESP_LOGI(TAG, "wc_ShaUpdate process software"); + #if defined(WOLFSSL_DEBUG_MUTEX) + { + ESP_LOGI(TAG, "wc_ShaUpdate process software"); + } + #endif ret = XTRANSFORM(sha, (const byte*)local); } else { - ESP_LOGV(TAG, "wc_ShaUpdate process hardware"); + #if defined(WOLFSSL_DEBUG_MUTEX) + { + ESP_LOGI(TAG, "wc_ShaUpdate process hardware"); + } + #endif esp_sha_process(sha, (const byte*)local); } #elif defined (WOLFSSL_USE_ESP32C3_CRYPT_HASH_HW) @@ -708,14 +729,30 @@ data += WC_SHA_BLOCK_SIZE; len -= WC_SHA_BLOCK_SIZE; - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - ByteReverseWords(local32, local32, WC_SHA_BLOCK_SIZE); - #endif - - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) if (sha->ctx.mode == ESP32_SHA_INIT){ esp_sha_try_hw_lock(&sha->ctx); } + #endif + + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + if (esp_sha_need_byte_reversal(&sha->ctx)) + #endif + { + ByteReverseWords(local32, local32, WC_SHA_BLOCK_SIZE); + } + #endif + + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) if (sha->ctx.mode == ESP32_SHA_SW){ ret = XTRANSFORM(sha, (const byte*)local32); } @@ -748,7 +785,20 @@ } #ifdef LITTLE_ENDIAN_ORDER - ByteReverseWords((word32*)digest, (word32*)sha->digest, WC_SHA_DIGEST_SIZE); + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + if (esp_sha_need_byte_reversal(&sha->ctx)) + #endif + { + ByteReverseWords((word32*)digest, (word32*)sha->digest, WC_SHA_DIGEST_SIZE); + } XMEMCPY(hash, (byte *)&digest[0], WC_SHA_DIGEST_SIZE); #else XMEMCPY(hash, sha->digest, WC_SHA_DIGEST_SIZE); @@ -775,7 +825,7 @@ #ifdef WOLF_CRYPTO_CB if (sha->devId != INVALID_DEVID) { ret = wc_CryptoCb_ShaHash(sha, NULL, 0, hash); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -799,19 +849,37 @@ /* pad with zeros */ if (sha->buffLen > WC_SHA_PAD_SIZE) { - XMEMSET(&local[sha->buffLen], 0, WC_SHA_BLOCK_SIZE - sha->buffLen); - sha->buffLen += WC_SHA_BLOCK_SIZE - sha->buffLen; + if (sha->buffLen < WC_SHA_BLOCK_SIZE) { + XMEMSET(&local[sha->buffLen], 0, WC_SHA_BLOCK_SIZE - sha->buffLen); + } - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - ByteReverseWords(sha->buffer, sha->buffer, WC_SHA_BLOCK_SIZE); - #endif + sha->buffLen += WC_SHA_BLOCK_SIZE - sha->buffLen; - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) /* For a fresh sha.ctx, try to use hardware acceleration */ if (sha->ctx.mode == ESP32_SHA_INIT) { esp_sha_try_hw_lock(&sha->ctx); } + #endif + + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + if (esp_sha_need_byte_reversal(&sha->ctx)) + #endif + { + ByteReverseWords(sha->buffer, sha->buffer, WC_SHA_BLOCK_SIZE); + } + #endif + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) /* if HW was busy, we may need to fall back to SW. */ if (sha->ctx.mode == ESP32_SHA_SW) { ret = XTRANSFORM(sha, (const byte*)local); @@ -831,12 +899,31 @@ } sha->buffLen = 0; - } /* (sha->buffLen > WC_SHA_PAD_SIZE) */ + } /* (sha->buffLen > WC_SHA_PAD_SIZE) */ XMEMSET(&local[sha->buffLen], 0, WC_SHA_PAD_SIZE - sha->buffLen); +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) + if (sha->ctx.mode == ESP32_SHA_INIT) { + esp_sha_try_hw_lock(&sha->ctx); + } +#endif + #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - ByteReverseWords(sha->buffer, sha->buffer, WC_SHA_BLOCK_SIZE); + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + if (esp_sha_need_byte_reversal(&sha->ctx)) + #endif + { /* reminder local also points to sha->buffer */ + ByteReverseWords(sha->buffer, sha->buffer, WC_SHA_BLOCK_SIZE); + } #endif /* store lengths */ @@ -855,10 +942,32 @@ 2 * sizeof(word32)); #endif -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) - if (sha->ctx.mode == ESP32_SHA_INIT) { - esp_sha_try_hw_lock(&sha->ctx); + +#if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) +if (sha->ctx.mode == ESP32_SHA_HW) { + #if defined(WOLFSSL_SUPER_VERBOSE_DEBUG) + { + ESP_LOGV(TAG, "Start: Reverse PAD SIZE Endianness."); + } + #endif + ByteReverseWords(&sha->buffer[WC_SHA_PAD_SIZE/sizeof(word32)], /* out */ + &sha->buffer[WC_SHA_PAD_SIZE/sizeof(word32)], /* in */ + 2 * sizeof(word32) /* byte count to reverse */ + ); + #if defined(WOLFSSL_SUPER_VERBOSE_DEBUG) + { + ESP_LOGV(TAG, "End: Reverse PAD SIZE Endianness."); } + #endif +} /* end if (sha->ctx.mode == ESP32_SHA_HW) */ +#endif + +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) if (sha->ctx.mode == ESP32_SHA_SW) { ret = XTRANSFORM(sha, (const byte*)local); } @@ -874,13 +983,27 @@ #endif #ifdef LITTLE_ENDIAN_ORDER - ByteReverseWords(sha->digest, sha->digest, WC_SHA_DIGEST_SIZE); + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + if (esp_sha_need_byte_reversal(&sha->ctx)) + #endif + { + ByteReverseWords(sha->digest, sha->digest, WC_SHA_DIGEST_SIZE); + } #endif XMEMCPY(hash, (byte *)&sha->digest[0], WC_SHA_DIGEST_SIZE); + /* we'll always reset state upon exit and return the error code from above, + * which may cause fall back to SW if HW is busy. we do not return result + * of initSha here */ (void)InitSha(sha); /* reset state */ - return ret; } @@ -917,6 +1040,10 @@ if (sha == NULL) return; +#if defined(WOLFSSL_ESP32) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + esp_sha_release_unfinished_lock(&sha->ctx); +#endif + #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA) wolfAsync_DevCtxFree(&sha->asyncDev, WOLFSSL_ASYNC_MARKER_SHA); #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -927,8 +1054,9 @@ #if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) se050_hash_free(&sha->se050Ctx); #endif -#if (defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ - !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) || \ +#if (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ + !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) || \ defined(WOLFSSL_RENESAS_RX64_HASH) if (sha->msg != NULL) { XFREE(sha->msg, sha->heap, DYNAMIC_TYPE_TMP_BUFFER); @@ -942,12 +1070,14 @@ #endif /* !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH) */ #endif /* !WOLFSSL_TI_HASH */ -#endif /* !HAVE_FIPS ... */ #if !defined(WOLFSSL_TI_HASH) && !defined(WOLFSSL_IMXRT_DCP) -#if !defined(WOLFSSL_RENESAS_TSIP_CRYPT) || \ - defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) +#if ((!defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + !defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) || \ + defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) && \ + (!defined(WOLFSSL_RENESAS_RSIP) || \ + defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)) #if !defined(WOLFSSL_RENESAS_RX64_HASH) #if !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH) @@ -995,9 +1125,9 @@ XMEMCPY(dst, src, sizeof(wc_Sha)); -#ifdef WOLFSSL_SILABS_SE_ACCEL - dst->silabsCtx.hash_ctx.cmd_ctx = &(dst->silabsCtx.cmd_ctx); - dst->silabsCtx.hash_ctx.hash_type_ctx = &(dst->silabsCtx.hash_type_ctx); +#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) + dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx; + dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx; #endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA) @@ -1012,7 +1142,7 @@ ret = se050_hash_copy(&src->se050Ctx, &dst->se050Ctx); #endif -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) esp_sha_ctx_copy(src, dst); #endif @@ -1023,7 +1153,8 @@ } #endif /* WOLFSSL_RENESAS_RX64_HASH */ #endif /* !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH) */ -#endif /* !defined(WOLFSSL_RENESAS_TSIP_CRYPT) || +#endif /* !defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + !defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) || defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) */ #endif /* !defined(WOLFSSL_TI_HASH) && !defined(WOLFSSL_IMXRT_DCP) */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha256.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha256.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha256.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha256.c 2024-08-03 07:30:00.000000000 +0000 @@ -63,15 +63,16 @@ #endif -#if !defined(NO_SHA256) && !defined(WOLFSSL_ARMASM) +#if !defined(NO_SHA256) && (!defined(WOLFSSL_ARMASM) && \ + !defined(WOLFSSL_ARMASM_NO_NEON)) #if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$d") - #pragma const_seg(".fipsB$d") + #pragma code_seg(".fipsA$l") + #pragma const_seg(".fipsB$l") #endif #endif @@ -90,76 +91,30 @@ /* determine if we are using Espressif SHA hardware acceleration */ -#undef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +#undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW +#if defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) /* define a single keyword for simplicity & readability * * by default the HW acceleration is on for ESP32-WROOM32 * but individual components can be turned off. */ - #define WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #define WOLFSSL_USE_ESP32_CRYPT_HASH_HW #else - #undef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW #endif #ifdef WOLFSSL_ESPIDF - /* Define the ESP_LOGx(TAG, "" value for output messages here. + /* Define the ESP_LOGx(TAG, WOLFSSL_ESPIDF_BLANKLINE_MESSAGE value for output messages here. ** ** Beware of possible conflict in test.c (that one now named TEST_TAG) */ - static const char* TAG = "wc_sha256"; + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) + static const char* TAG = "wc_sha256"; + #endif #endif -/* fips wrapper calls, user can call direct */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - - int wc_InitSha256(wc_Sha256* sha) - { - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return InitSha256_fips(sha); - } - int wc_InitSha256_ex(wc_Sha256* sha, void* heap, int devId) - { - (void)heap; - (void)devId; - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return InitSha256_fips(sha); - } - int wc_Sha256Update(wc_Sha256* sha, const byte* data, word32 len) - { - if (sha == NULL || (data == NULL && len > 0)) { - return BAD_FUNC_ARG; - } - - if (data == NULL && len == 0) { - /* valid, but do nothing */ - return 0; - } - - return Sha256Update_fips(sha, data, len); - } - int wc_Sha256Final(wc_Sha256* sha, byte* out) - { - if (sha == NULL || out == NULL) { - return BAD_FUNC_ARG; - } - return Sha256Final_fips(sha, out); - } - void wc_Sha256Free(wc_Sha256* sha) - { - (void)sha; - /* Not supported in FIPS */ - } - -#else /* else build without fips, or for FIPS v2 */ - - #if defined(WOLFSSL_TI_HASH) /* #include included by wc_port.c */ #elif defined(WOLFSSL_CRYPTOCELL) @@ -186,6 +141,14 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_sha256_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000014 }; + int wolfCrypt_FIPS_SHA256_sanity(void) + { + return 0; + } +#endif #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) #if defined(__GNUC__) && ((__GNUC__ < 4) || \ @@ -213,29 +176,74 @@ #define HAVE_INTEL_RORX #endif +#if defined(LITTLE_ENDIAN_ORDER) + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + #define SHA256_REV_BYTES(ctx) \ + (esp_sha_need_byte_reversal(ctx)) + #elif defined(FREESCALE_MMCAU_SHA) + #define SHA256_REV_BYTES(ctx) 1 /* reverse needed on final */ + #endif +#endif +#ifndef SHA256_REV_BYTES + #if defined(LITTLE_ENDIAN_ORDER) + #define SHA256_REV_BYTES(ctx) 1 + #else + #define SHA256_REV_BYTES(ctx) 0 + #endif +#endif +#if defined(LITTLE_ENDIAN_ORDER) && \ + defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + #define SHA256_UPDATE_REV_BYTES(ctx) (sha256->sha_method == SHA256_C) + #else + #define SHA256_UPDATE_REV_BYTES(ctx) \ + (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) + #endif +#elif defined(FREESCALE_MMCAU_SHA) + #define SHA256_UPDATE_REV_BYTES(ctx) 0 /* reverse not needed on update */ +#else + #define SHA256_UPDATE_REV_BYTES(ctx) SHA256_REV_BYTES(ctx) +#endif + #if !defined(WOLFSSL_PIC32MZ_HASH) && !defined(STM32_HASH_SHA2) && \ (!defined(WOLFSSL_IMX6_CAAM) || defined(NO_IMX6_CAAM_HASH) || \ defined(WOLFSSL_QNX_CAAM)) && \ !defined(WOLFSSL_AFALG_HASH) && !defined(WOLFSSL_DEVCRYPTO_HASH) && \ - (!defined(WOLFSSL_ESP32WROOM32_CRYPT) || defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH)) && \ - (!defined(WOLFSSL_RENESAS_TSIP_CRYPT) || defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) && \ + (!defined(WOLFSSL_ESP32_CRYPT) || defined(NO_WOLFSSL_ESP32_CRYPT_HASH)) && \ + ((!defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + !defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) || \ + defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) && \ !defined(WOLFSSL_PSOC6_CRYPTO) && !defined(WOLFSSL_IMXRT_DCP) && !defined(WOLFSSL_SILABS_SE_ACCEL) && \ !defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_SE050_HASH) && \ ((!defined(WOLFSSL_RENESAS_SCEPROTECT) && \ - !defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY)) \ - || defined(NO_WOLFSSL_RENESAS_SCEPROTECT_HASH)) && \ + !defined(WOLFSSL_RENESAS_RSIP)) \ + || defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)) && \ (!defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH)) && \ !defined(WOLFSSL_RENESAS_RX64_HASH) +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) +#ifdef WC_C_DYNAMIC_FALLBACK + #define SHA256_SETTRANSFORM_ARGS int *sha_method +#else + #define SHA256_SETTRANSFORM_ARGS void +#endif +static void Sha256_SetTransform(SHA256_SETTRANSFORM_ARGS); +#endif static int InitSha256(wc_Sha256* sha256) { - int ret = 0; - - if (sha256 == NULL) - return BAD_FUNC_ARG; - XMEMSET(sha256->digest, 0, sizeof(sha256->digest)); sha256->digest[0] = 0x6A09E667L; sha256->digest[1] = 0xBB67AE85L; @@ -258,6 +266,17 @@ sha256->used = 0; #endif +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + /* choose best Transform function under this runtime environment */ +#ifdef WC_C_DYNAMIC_FALLBACK + sha256->sha_method = 0; + Sha256_SetTransform(&sha256->sha_method); +#else + Sha256_SetTransform(); +#endif +#endif + #ifdef WOLF_CRYPTO_CB sha256->devId = wc_CryptoCb_DefaultDevID(); #endif @@ -266,7 +285,11 @@ XMEMSET(&sha256->maxq_ctx, 0, sizeof(sha256->maxq_ctx)); #endif - return ret; +#ifdef HAVE_ARIA + sha256->hSession = NULL; +#endif + + return 0; } #endif @@ -341,7 +364,15 @@ extern "C" { #endif + extern int Transform_Sha256_SSE2_Sha(wc_Sha256 *sha256, + const byte* data); + extern int Transform_Sha256_SSE2_Sha_Len(wc_Sha256* sha256, + const byte* data, word32 len); #if defined(HAVE_INTEL_AVX1) + extern int Transform_Sha256_AVX1_Sha(wc_Sha256 *sha256, + const byte* data); + extern int Transform_Sha256_AVX1_Sha_Len(wc_Sha256* sha256, + const byte* data, word32 len); extern int Transform_Sha256_AVX1(wc_Sha256 *sha256, const byte* data); extern int Transform_Sha256_AVX1_Len(wc_Sha256* sha256, const byte* data, word32 len); @@ -364,25 +395,205 @@ } /* extern "C" */ #endif + static word32 intel_flags = 0; + +#if defined(WC_C_DYNAMIC_FALLBACK) && !defined(WC_NO_INTERNAL_FUNCTION_POINTERS) + #define WC_NO_INTERNAL_FUNCTION_POINTERS +#endif + +#ifdef WC_NO_INTERNAL_FUNCTION_POINTERS + + enum sha_methods { SHA256_UNSET = 0, SHA256_AVX1_SHA, SHA256_AVX2, + SHA256_AVX1_RORX, SHA256_AVX1_NOSHA, SHA256_AVX2_RORX, + SHA256_SSE2, SHA256_C }; + +#ifndef WC_C_DYNAMIC_FALLBACK + static enum sha_methods sha_method = SHA256_UNSET; +#endif + + static void Sha256_SetTransform(SHA256_SETTRANSFORM_ARGS) + { + #ifdef WC_C_DYNAMIC_FALLBACK + #define SHA_METHOD (*sha_method) + #else + #define SHA_METHOD sha_method + #endif + if (SHA_METHOD != SHA256_UNSET) + return; + + #ifdef WC_C_DYNAMIC_FALLBACK + if (! CAN_SAVE_VECTOR_REGISTERS()) { + SHA_METHOD = SHA256_C; + return; + } + #endif + + if (intel_flags == 0) + intel_flags = cpuid_get_flags(); + + if (IS_INTEL_SHA(intel_flags)) { + #ifdef HAVE_INTEL_AVX1 + if (IS_INTEL_AVX1(intel_flags)) { + SHA_METHOD = SHA256_AVX1_SHA; + } + else + #endif + { + SHA_METHOD = SHA256_SSE2; + } + } + else + #ifdef HAVE_INTEL_AVX2 + if (IS_INTEL_AVX2(intel_flags)) { + #ifdef HAVE_INTEL_RORX + if (IS_INTEL_BMI2(intel_flags)) { + SHA_METHOD = SHA256_AVX2_RORX; + } + else + #endif + { + SHA_METHOD = SHA256_AVX2; + } + } + else + #endif + #ifdef HAVE_INTEL_AVX1 + if (IS_INTEL_AVX1(intel_flags)) { + #ifdef HAVE_INTEL_RORX + if (IS_INTEL_BMI2(intel_flags)) { + SHA_METHOD = SHA256_AVX1_RORX; + } + else + #endif + { + SHA_METHOD = SHA256_AVX1_NOSHA; + } + } + else + #endif + { + SHA_METHOD = SHA256_C; + } + #undef SHA_METHOD + } + + static WC_INLINE int inline_XTRANSFORM(wc_Sha256* S, const byte* D) { + #ifdef WC_C_DYNAMIC_FALLBACK + #define SHA_METHOD (S->sha_method) + #else + #define SHA_METHOD sha_method + #endif + int ret; + + if (SHA_METHOD == SHA256_C) + return Transform_Sha256(S, D); + SAVE_VECTOR_REGISTERS(return _svr_ret;); + switch (SHA_METHOD) { + case SHA256_AVX2: + ret = Transform_Sha256_AVX2(S, D); + break; + case SHA256_AVX2_RORX: + ret = Transform_Sha256_AVX2_RORX(S, D); + break; + case SHA256_AVX1_SHA: + ret = Transform_Sha256_AVX1_Sha(S, D); + break; + case SHA256_AVX1_NOSHA: + ret = Transform_Sha256_AVX1(S, D); + break; + case SHA256_AVX1_RORX: + ret = Transform_Sha256_AVX1_RORX(S, D); + break; + case SHA256_SSE2: + ret = Transform_Sha256_SSE2_Sha(S, D); + break; + case SHA256_C: + case SHA256_UNSET: + default: + ret = Transform_Sha256(S, D); + break; + } + RESTORE_VECTOR_REGISTERS(); + return ret; + #undef SHA_METHOD + } +#define XTRANSFORM(...) inline_XTRANSFORM(__VA_ARGS__) + + static WC_INLINE int inline_XTRANSFORM_LEN(wc_Sha256* S, const byte* D, word32 L) { + #ifdef WC_C_DYNAMIC_FALLBACK + #define SHA_METHOD (S->sha_method) + #else + #define SHA_METHOD sha_method + #endif + int ret; + SAVE_VECTOR_REGISTERS(return _svr_ret;); + switch (SHA_METHOD) { + case SHA256_AVX2: + ret = Transform_Sha256_AVX2_Len(S, D, L); + break; + case SHA256_AVX2_RORX: + ret = Transform_Sha256_AVX2_RORX_Len(S, D, L); + break; + case SHA256_AVX1_SHA: + ret = Transform_Sha256_AVX1_Sha_Len(S, D, L); + break; + case SHA256_AVX1_NOSHA: + ret = Transform_Sha256_AVX1_Len(S, D, L); + break; + case SHA256_AVX1_RORX: + ret = Transform_Sha256_AVX1_RORX_Len(S, D, L); + break; + case SHA256_SSE2: + ret = Transform_Sha256_SSE2_Sha_Len(S, D, L); + break; + case SHA256_C: + case SHA256_UNSET: + default: + ret = 0; + break; + } + RESTORE_VECTOR_REGISTERS(); + return ret; + #undef SHA_METHOD + } +#define XTRANSFORM_LEN(...) inline_XTRANSFORM_LEN(__VA_ARGS__) + +#else /* !WC_NO_INTERNAL_FUNCTION_POINTERS */ + static int (*Transform_Sha256_p)(wc_Sha256* sha256, const byte* data); /* = _Transform_Sha256 */ static int (*Transform_Sha256_Len_p)(wc_Sha256* sha256, const byte* data, word32 len); /* = NULL */ static int transform_check = 0; - static word32 intel_flags; static int Transform_Sha256_is_vectorized = 0; static WC_INLINE int inline_XTRANSFORM(wc_Sha256* S, const byte* D) { int ret; + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha256_is_vectorized) + SAVE_VECTOR_REGISTERS(return _svr_ret;); + #endif ret = (*Transform_Sha256_p)(S, D); + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha256_is_vectorized) + RESTORE_VECTOR_REGISTERS(); + #endif return ret; } #define XTRANSFORM(...) inline_XTRANSFORM(__VA_ARGS__) static WC_INLINE int inline_XTRANSFORM_LEN(wc_Sha256* S, const byte* D, word32 L) { int ret; + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha256_is_vectorized) + SAVE_VECTOR_REGISTERS(return _svr_ret;); + #endif ret = (*Transform_Sha256_Len_p)(S, D, L); + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha256_is_vectorized) + RESTORE_VECTOR_REGISTERS(); + #endif return ret; } #define XTRANSFORM_LEN(...) inline_XTRANSFORM_LEN(__VA_ARGS__) @@ -395,8 +606,24 @@ intel_flags = cpuid_get_flags(); + if (IS_INTEL_SHA(intel_flags)) { + #ifdef HAVE_INTEL_AVX1 + if (IS_INTEL_AVX1(intel_flags)) { + Transform_Sha256_p = Transform_Sha256_AVX1_Sha; + Transform_Sha256_Len_p = Transform_Sha256_AVX1_Sha_Len; + Transform_Sha256_is_vectorized = 1; + } + else + #endif + { + Transform_Sha256_p = Transform_Sha256_SSE2_Sha; + Transform_Sha256_Len_p = Transform_Sha256_SSE2_Sha_Len; + Transform_Sha256_is_vectorized = 1; + } + } + else #ifdef HAVE_INTEL_AVX2 - if (1 && IS_INTEL_AVX2(intel_flags)) { + if (IS_INTEL_AVX2(intel_flags)) { #ifdef HAVE_INTEL_RORX if (IS_INTEL_BMI2(intel_flags)) { Transform_Sha256_p = Transform_Sha256_AVX2_RORX; @@ -405,27 +632,29 @@ } else #endif - if (1) { Transform_Sha256_p = Transform_Sha256_AVX2; Transform_Sha256_Len_p = Transform_Sha256_AVX2_Len; Transform_Sha256_is_vectorized = 1; } + } + else + #endif + #ifdef HAVE_INTEL_AVX1 + if (IS_INTEL_AVX1(intel_flags)) { #ifdef HAVE_INTEL_RORX - else { + if (IS_INTEL_BMI2(intel_flags)) { Transform_Sha256_p = Transform_Sha256_AVX1_RORX; Transform_Sha256_Len_p = Transform_Sha256_AVX1_RORX_Len; Transform_Sha256_is_vectorized = 1; } + else #endif - } - else - #endif - #ifdef HAVE_INTEL_AVX1 - if (IS_INTEL_AVX1(intel_flags)) { - Transform_Sha256_p = Transform_Sha256_AVX1; - Transform_Sha256_Len_p = Transform_Sha256_AVX1_Len; - Transform_Sha256_is_vectorized = 1; + { + Transform_Sha256_p = Transform_Sha256_AVX1; + Transform_Sha256_Len_p = Transform_Sha256_AVX1_Len; + Transform_Sha256_is_vectorized = 1; + } } else #endif @@ -438,6 +667,8 @@ transform_check = 1; } +#endif /* !WC_NO_INTERNAL_FUNCTION_POINTERS */ + #if !defined(WOLFSSL_KCAPI_HASH) int wc_InitSha256_ex(wc_Sha256* sha256, void* heap, int devId) { @@ -458,9 +689,6 @@ if (ret != 0) return ret; - /* choose best Transform function under this runtime environment */ - Sha256_SetTransform(); - #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256) ret = wolfAsync_DevCtxInit(&sha256->asyncDev, WOLFSSL_ASYNC_MARKER_SHA256, sha256->heap, devId); @@ -603,7 +831,14 @@ { int ret = 0; - if (sha256 == NULL || (data == NULL && len > 0)) { + if (sha256 == NULL) { + return BAD_FUNC_ARG; + } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + if (data == NULL) { return BAD_FUNC_ARG; } @@ -654,6 +889,17 @@ int wc_Sha256Update(wc_Sha256* sha256, const byte* data, word32 len) { + if (sha256 == NULL) { + return BAD_FUNC_ARG; + } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + if (data == NULL) { + return BAD_FUNC_ARG; + } + return se050_hash_update(&sha256->se050Ctx, data, len); } @@ -735,22 +981,22 @@ return ret; } -#elif defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#elif defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) /* HW may fail since there's only one, so we still need SW */ #define NEED_SOFT_SHA256 /* + ** An Espressif-specific InitSha256() + ** ** soft SHA needs initialization digest, but HW does not. */ static int InitSha256(wc_Sha256* sha256) { int ret = 0; /* zero = success */ - if (sha256 == NULL) { - return BAD_FUNC_ARG; - } - + /* We may or may not need initial digest for HW. + * Always needed for SW-only. */ sha256->digest[0] = 0x6A09E667L; sha256->digest[1] = 0xBB67AE85L; sha256->digest[2] = 0x3C6EF372L; @@ -764,13 +1010,14 @@ sha256->loLen = 0; sha256->hiLen = 0; - ret = esp_sha_init(&(sha256->ctx), WC_HASH_TYPE_SHA256); - +#ifndef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 + ret = esp_sha_init((WC_ESP32SHA*)&(sha256->ctx), WC_HASH_TYPE_SHA256); +#endif return ret; } /* - ** wolfCrypt InitSha256 external wrapper. + ** An Espressif-specific wolfCrypt InitSha256 external wrapper. ** ** we'll assume this is ALWAYS for a new, uninitialized sha256 */ @@ -781,7 +1028,8 @@ return BAD_FUNC_ARG; } - #ifdef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) /* We know this is a fresh, uninitialized item, so set to INIT */ if (sha256->ctx.mode != ESP32_SHA_INIT) { ESP_LOGV(TAG, "Set ctx mode from prior value: " @@ -793,16 +1041,16 @@ return InitSha256(sha256); } -#elif defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ +#elif (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */ -#elif (defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY)) && \ - !defined(NO_WOLFSSL_RENESAS_SCEPROTECT_HASH) +#elif (defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_RSIP)) \ + && !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) - /* implemented in wolfcrypt/src/port/Renesas/renesas_sce_sha.c */ + /* implemented in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ #elif defined(WOLFSSL_PSOC6_CRYPTO) @@ -973,6 +1221,7 @@ } #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_SMALL_STACK_CACHE) + ForceZero(W, sizeof(word32) * WC_SHA256_BLOCK_SIZE); XFREE(W, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif return 0; @@ -1055,21 +1304,13 @@ } /* do block size increments/updates */ - static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, word32 len) + static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, + word32 len) { int ret = 0; word32 blocksLen; byte* local; - if (sha256 == NULL || (data == NULL && len > 0)) { - return BAD_FUNC_ARG; - } - - if (data == NULL && len == 0) { - /* valid, but do nothing */ - return 0; - } - /* check that internal buffLen is valid */ if (sha256->buffLen >= WC_SHA256_BLOCK_SIZE) { return BUFFER_E; @@ -1090,36 +1331,47 @@ len -= blocksLen; if (sha256->buffLen == WC_SHA256_BLOCK_SIZE) { - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - #if defined(WOLFSSL_X86_64_BUILD) && \ - defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) - #endif - { - ByteReverseWords(sha256->buffer, sha256->buffer, - WC_SHA256_BLOCK_SIZE); - } - #endif - - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) if (sha256->ctx.mode == ESP32_SHA_INIT) { ESP_LOGV(TAG, "Sha256Update try hardware"); esp_sha_try_hw_lock(&sha256->ctx); } + #endif + + if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) { + ByteReverseWords(sha256->buffer, sha256->buffer, + WC_SHA256_BLOCK_SIZE); + } + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) if (sha256->ctx.mode == ESP32_SHA_SW) { - ESP_LOGV(TAG, "Sha256Update process software"); + #if defined(WOLFSSL_DEBUG_MUTEX) + { + ESP_LOGI(TAG, "Sha256Update process software"); + } + #endif + #ifdef WOLFSSL_HW_METRICS + { + /* Track of # SW during transforms during active HW */ + esp_sw_sha256_count_add(); + } + #endif /* WOLFSSL_HW_METRICS */ ret = XTRANSFORM(sha256, (const byte*)local); } else { - ESP_LOGV(TAG, "Sha256Update process hardware"); + #if defined(WOLFSSL_DEBUG_MUTEX) + { + ESP_LOGI(TAG, "Sha256Update process hardware"); + } + #endif esp_sha256_process(sha256, (const byte*)local); } #else + /* Always SW */ ret = XTRANSFORM(sha256, (const byte*)local); #endif - if (ret == 0) sha256->buffLen = 0; else @@ -1131,15 +1383,24 @@ #ifdef XTRANSFORM_LEN #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha256->sha_method != SHA256_C) + #elif defined(WC_NO_INTERNAL_FUNCTION_POINTERS) + if (sha_method != SHA256_C) + #else if (Transform_Sha256_Len_p != NULL) #endif + + #endif { - /* get number of blocks */ - /* 64-1 = 0x3F (~ Inverted = 0xFFFFFFC0) */ - /* len (masked by 0xFFFFFFC0) returns block aligned length */ - blocksLen = len & ~((word32)WC_SHA256_BLOCK_SIZE-1); - if (blocksLen > 0) { - /* Byte reversal and alignment handled in function if required */ + if (len >= WC_SHA256_BLOCK_SIZE) { + /* get number of blocks */ + /* 64-1 = 0x3F (~ Inverted = 0xFFFFFFC0) */ + /* len (masked by 0xFFFFFFC0) returns block aligned length */ + blocksLen = len & ~((word32)WC_SHA256_BLOCK_SIZE-1); + /* Byte reversal and alignment handled in function if required + */ XTRANSFORM_LEN(sha256, data, blocksLen); data += blocksLen; len -= blocksLen; @@ -1174,23 +1435,20 @@ data += WC_SHA256_BLOCK_SIZE; len -= WC_SHA256_BLOCK_SIZE; - - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - #if defined(WOLFSSL_X86_64_BUILD) && \ - defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) - #endif - { - ByteReverseWords(local32, local32, WC_SHA256_BLOCK_SIZE); - } - #endif - - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined( NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) if (sha256->ctx.mode == ESP32_SHA_INIT){ ESP_LOGV(TAG, "Sha256Update try hardware loop"); esp_sha_try_hw_lock(&sha256->ctx); } + #endif + + if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) { + ByteReverseWords(local32, local32, WC_SHA256_BLOCK_SIZE); + } + + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) if (sha256->ctx.mode == ESP32_SHA_SW) { ESP_LOGV(TAG, "Sha256Update process software loop"); ret = XTRANSFORM(sha256, (const byte*)local32); @@ -1224,14 +1482,16 @@ #else int wc_Sha256Update(wc_Sha256* sha256, const byte* data, word32 len) { - if (sha256 == NULL || (data == NULL && len > 0)) { + if (sha256 == NULL) { return BAD_FUNC_ARG; } - if (data == NULL && len == 0) { /* valid, but do nothing */ return 0; } + if (data == NULL) { + return BAD_FUNC_ARG; + } #ifdef WOLF_CRYPTO_CB #ifndef WOLF_CRYPTO_CB_FIND @@ -1239,7 +1499,7 @@ #endif { int ret = wc_CryptoCb_Sha256Hash(sha256, data, len, NULL); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1258,14 +1518,9 @@ static WC_INLINE int Sha256Final(wc_Sha256* sha256) { - int ret; byte* local; - if (sha256 == NULL) { - return BAD_FUNC_ARG; - } - /* we'll add a 0x80 byte at the end, ** so make sure we have appropriate buffer length. */ if (sha256->buffLen > WC_SHA256_BLOCK_SIZE - 1) { @@ -1278,22 +1533,25 @@ /* pad with zeros */ if (sha256->buffLen > WC_SHA256_PAD_SIZE) { - XMEMSET(&local[sha256->buffLen], 0, - WC_SHA256_BLOCK_SIZE - sha256->buffLen); - sha256->buffLen += WC_SHA256_BLOCK_SIZE - sha256->buffLen; + if (sha256->buffLen < WC_SHA256_BLOCK_SIZE) { + XMEMSET(&local[sha256->buffLen], 0, + WC_SHA256_BLOCK_SIZE - sha256->buffLen); + } - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) - #endif - { - ByteReverseWords(sha256->buffer, sha256->buffer, - WC_SHA256_BLOCK_SIZE); + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) + if (sha256->ctx.mode == ESP32_SHA_INIT) { + esp_sha_try_hw_lock(&sha256->ctx); } #endif - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) { + ByteReverseWords(sha256->buffer, sha256->buffer, + WC_SHA256_BLOCK_SIZE); + } + + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) if (sha256->ctx.mode == ESP32_SHA_INIT) { esp_sha_try_hw_lock(&sha256->ctx); } @@ -1314,35 +1572,67 @@ XMEMSET(&local[sha256->buffLen], 0, WC_SHA256_PAD_SIZE - sha256->buffLen); - /* put lengths in bits */ + /* put 64 bit length in separate 32 bit parts */ sha256->hiLen = (sha256->loLen >> (8 * sizeof(sha256->loLen) - 3)) + (sha256->hiLen << 3); sha256->loLen = sha256->loLen << 3; + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) + if (sha256->ctx.mode == ESP32_SHA_INIT) { + esp_sha_try_hw_lock(&sha256->ctx); + } + #endif + /* store lengths */ - #if defined(LITTLE_ENDIAN_ORDER) && !defined(FREESCALE_MMCAU_SHA) - #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) - #endif - { + if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) { ByteReverseWords(sha256->buffer, sha256->buffer, - WC_SHA256_BLOCK_SIZE); + WC_SHA256_PAD_SIZE); } - #endif - /* ! length ordering dependent on digest endian type ! */ + /* ! 64-bit length ordering dependent on digest endian type ! */ XMEMCPY(&local[WC_SHA256_PAD_SIZE], &sha256->hiLen, sizeof(word32)); XMEMCPY(&local[WC_SHA256_PAD_SIZE + sizeof(word32)], &sha256->loLen, sizeof(word32)); + /* Only the ESP32-C3 with HW enabled may need pad size byte order reversal + * depending on HW or SW mode */ + #if ( defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) \ + ) && \ + defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) + /* For Espressif RISC-V Targets, we *may* need to reverse bytes + * depending on if HW is active or not. */ + if (sha256->ctx.mode == ESP32_SHA_HW) { + #if defined(WOLFSSL_SUPER_VERBOSE_DEBUG) + ESP_LOGV(TAG, "Start: Reverse PAD SIZE Endianness."); + #endif + ByteReverseWords( + &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)], /* out */ + &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)], /* in */ + 2 * sizeof(word32) /* byte count to reverse */ + ); + #if defined(WOLFSSL_SUPER_VERBOSE_DEBUG) + ESP_LOGV(TAG, "End: Reverse PAD SIZE Endianness."); + #endif + } /* end if (sha256->ctx.mode == ESP32_SHA_HW) */ + #endif + #if defined(FREESCALE_MMCAU_SHA) || \ (defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) /* Kinetis requires only these bytes reversed */ #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha256->sha_method != SHA256_C) + #else if (IS_INTEL_AVX1(intel_flags) || IS_INTEL_AVX2(intel_flags)) #endif + #endif { ByteReverseWords( &sha256->buffer[WC_SHA256_PAD_SIZE / sizeof(word32)], @@ -1351,10 +1641,13 @@ } #endif - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) if (sha256->ctx.mode == ESP32_SHA_INIT) { esp_sha_try_hw_lock(&sha256->ctx); } + /* depending on architecture and ctx.mode value + * we may or may not need default digest */ if (sha256->ctx.mode == ESP32_SHA_SW) { ret = XTRANSFORM(sha256, (const byte*)local); } @@ -1381,8 +1674,10 @@ } #ifdef LITTLE_ENDIAN_ORDER - ByteReverseWords((word32*)digest, (word32*)sha256->digest, - WC_SHA256_DIGEST_SIZE); + if (SHA256_REV_BYTES(&sha256->ctx)) { + ByteReverseWords((word32*)digest, (word32*)sha256->digest, + WC_SHA256_DIGEST_SIZE); + } XMEMCPY(hash, digest, WC_SHA256_DIGEST_SIZE); #else XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE); @@ -1405,7 +1700,7 @@ #endif { ret = wc_CryptoCb_Sha256Hash(sha256, NULL, 0, hash); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1426,7 +1721,10 @@ } #if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords(sha256->digest, sha256->digest, WC_SHA256_DIGEST_SIZE); + if (SHA256_REV_BYTES(&sha256->ctx)) { + ByteReverseWords(sha256->digest, sha256->digest, + WC_SHA256_DIGEST_SIZE); + } #endif XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE); @@ -1438,18 +1736,115 @@ /* @param sha a pointer to wc_Sha256 structure */ /* @param data data to be applied SHA256 transformation */ /* @return 0 on successful, otherwise non-zero on failure */ - int wc_Sha256Transform(wc_Sha256* sha, const unsigned char* data) + int wc_Sha256Transform(wc_Sha256* sha256, const unsigned char* data) { - if (sha == NULL || data == NULL) { + if (sha256 == NULL || data == NULL) { return BAD_FUNC_ARG; } - return (Transform_Sha256(sha, data)); + return Transform_Sha256(sha256, data); } - #endif -#endif /* OPENSSL_EXTRA */ +#endif /* OPENSSL_EXTRA || HAVE_CURL */ + +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH) + /* One block will be used from data. + * hash must be big enough to hold all of digest output. + */ + int wc_Sha256HashBlock(wc_Sha256* sha256, const unsigned char* data, + unsigned char* hash) + { + int ret; + + if ((sha256 == NULL) || (data == NULL)) { + return BAD_FUNC_ARG; + } + if (SHA256_UPDATE_REV_BYTES(&sha256->ctx)) { + ByteReverseWords(sha256->buffer, (word32*)data, + WC_SHA256_BLOCK_SIZE); + data = (unsigned char*)sha256->buffer; + } + ret = XTRANSFORM(sha256, data); + + if ((ret == 0) && (hash != NULL)) { + if (!SHA256_REV_BYTES(&sha256->ctx)) { + XMEMCPY(hash, sha256->digest, WC_SHA256_DIGEST_SIZE); + } + else { + #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) + __asm__ __volatile__ ( + "mov 0x00(%[d]), %%esi\n\t" + "movbe %%esi, 0x00(%[h])\n\t" + "mov 0x04(%[d]), %%esi\n\t" + "movbe %%esi, 0x04(%[h])\n\t" + "mov 0x08(%[d]), %%esi\n\t" + "movbe %%esi, 0x08(%[h])\n\t" + "mov 0x0c(%[d]), %%esi\n\t" + "movbe %%esi, 0x0c(%[h])\n\t" + "mov 0x10(%[d]), %%esi\n\t" + "movbe %%esi, 0x10(%[h])\n\t" + "mov 0x14(%[d]), %%esi\n\t" + "movbe %%esi, 0x14(%[h])\n\t" + "mov 0x18(%[d]), %%esi\n\t" + "movbe %%esi, 0x18(%[h])\n\t" + "mov 0x1c(%[d]), %%esi\n\t" + "movbe %%esi, 0x1c(%[h])\n\t" + : + : [d] "r" (sha256->digest), [h] "r" (hash) + : "memory", "esi" + ); + #else + word32* hash32 = (word32*)hash; + word32* digest = (word32*)sha256->digest; + #if WOLFSSL_GENERAL_ALIGNMENT < 4 + ALIGN16 word32 buf[WC_SHA256_DIGEST_SIZE / sizeof(word32)]; + + if (((size_t)digest & 0x3) != 0) { + if (((size_t)hash32 & 0x3) != 0) { + XMEMCPY(buf, digest, WC_SHA256_DIGEST_SIZE); + hash32 = buf; + digest = buf; + } + else { + XMEMCPY(hash, digest, WC_SHA256_DIGEST_SIZE); + digest = hash32; + } + } + else if (((size_t)hash32 & 0x3) != 0) { + hash32 = digest; + } + #endif + hash32[0] = ByteReverseWord32(digest[0]); + hash32[1] = ByteReverseWord32(digest[1]); + hash32[2] = ByteReverseWord32(digest[2]); + hash32[3] = ByteReverseWord32(digest[3]); + hash32[4] = ByteReverseWord32(digest[4]); + hash32[5] = ByteReverseWord32(digest[5]); + hash32[6] = ByteReverseWord32(digest[6]); + hash32[7] = ByteReverseWord32(digest[7]); + #if WOLFSSL_GENERAL_ALIGNMENT < 4 + if (hash != (byte*)hash32) { + XMEMCPY(hash, hash32, WC_SHA256_DIGEST_SIZE); + } + #endif + #endif /* WOLFSSL_X86_64_BUILD && USE_INTEL_SPEEDUP */ + } + sha256->digest[0] = 0x6A09E667L; + sha256->digest[1] = 0xBB67AE85L; + sha256->digest[2] = 0x3C6EF372L; + sha256->digest[3] = 0xA54FF53AL; + sha256->digest[4] = 0x510E527FL; + sha256->digest[5] = 0x9B05688CL; + sha256->digest[6] = 0x1F83D9ABL; + sha256->digest[7] = 0x5BE0CD19L; + } + + return ret; + } +#endif /* WOLFSSL_HAVE_LMS && !WOLFSSL_LMS_FULL_HASH */ #endif /* !WOLFSSL_KCAPI_HASH */ +#endif /* XTRANSFORM */ + #ifdef WOLFSSL_SHA224 @@ -1554,6 +1949,11 @@ /* implemented in wolfcrypt/src/port/Renesas/renesas_rx64_hw_sha.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + + /* implemented in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #else #define NEED_SOFT_SHA224 @@ -1563,10 +1963,6 @@ { int ret = 0; - if (sha224 == NULL) { - return BAD_FUNC_ARG; - } - sha224->digest[0] = 0xc1059ed8; sha224->digest[1] = 0x367cd507; sha224->digest[2] = 0x3070dd17; @@ -1580,11 +1976,19 @@ sha224->loLen = 0; sha224->hiLen = 0; + #ifdef WC_C_DYNAMIC_FALLBACK + sha224->sha_method = 0; + #endif + #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) /* choose best Transform function under this runtime environment */ + #ifdef WC_C_DYNAMIC_FALLBACK + Sha256_SetTransform(&sha224->sha_method); + #else Sha256_SetTransform(); #endif + #endif #ifdef WOLFSSL_HASH_FLAGS sha224->flags = 0; #endif @@ -1594,9 +1998,11 @@ sha224->used = 0; #endif - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) - /* not to be confused with HAS512_224 */ - sha224->ctx.mode = ESP32_SHA_SW; /* no SHA224 HW, so always SW */ + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224)) + /* not to be confused with SHAS512_224 */ + ret = esp_sha_init(&(sha224->ctx), WC_HASH_TYPE_SHA224); #endif return ret; @@ -1617,14 +2023,19 @@ sha224->W = NULL; #endif - #ifdef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) + #if defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224) /* We know this is a fresh, uninitialized item, so set to INIT */ if (sha224->ctx.mode != ESP32_SHA_SW) { ESP_LOGV(TAG, "Set sha224 ctx mode init to ESP32_SHA_SW. " "Prior value: %d", sha224->ctx.mode); } /* no sha224 HW support is available, set to SW */ - sha224->ctx.mode = ESP32_SHA_SW; + sha224->ctx.mode = ESP32_SHA_SW; + #else + /* We know this is a fresh, uninitialized item, so set to INIT */ + sha224->ctx.mode = ESP32_SHA_INIT; + #endif #endif ret = InitSha224(sha224); @@ -1642,7 +2053,9 @@ ret = wc_CAAM_HashInit(&sha224->hndl, &sha224->ctx, WC_HASH_TYPE_SHA224); #endif - #ifdef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224)) if (sha224->ctx.mode != ESP32_SHA_INIT) { ESP_LOGV("SHA224", "Set ctx mode from prior value: " "%d", sha224->ctx.mode); @@ -1658,7 +2071,14 @@ { int ret; - if (sha224 == NULL || (data == NULL && len > 0)) { + if (sha224 == NULL) { + return BAD_FUNC_ARG; + } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + if (data == NULL) { return BAD_FUNC_ARG; } @@ -1670,7 +2090,9 @@ } #endif /* WOLFSSL_ASYNC_CRYPT */ - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + (defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224)) sha224->ctx.mode = ESP32_SHA_SW; /* no SHA224 HW, so always SW */ #endif @@ -1696,8 +2118,11 @@ } #endif /* WOLFSSL_ASYNC_CRYPT */ - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) - sha224->ctx.mode = ESP32_SHA_SW; /* no SHA224 HW, so always SW */ + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + ( !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224) ) + + /* nothing enabled here for RISC-V C2/C3/C6 success */ #endif ret = Sha256Final((wc_Sha256*)sha224); @@ -1705,7 +2130,11 @@ return ret; #if defined(LITTLE_ENDIAN_ORDER) - ByteReverseWords(sha224->digest, sha224->digest, WC_SHA224_DIGEST_SIZE); + if (SHA256_REV_BYTES(&sha224->ctx)) { + ByteReverseWords(sha224->digest, + sha224->digest, + WC_SHA224_DIGEST_SIZE); + } #endif XMEMCPY(hash, sha224->digest, WC_SHA224_DIGEST_SIZE); @@ -1732,10 +2161,11 @@ return; #ifdef WOLFSSL_SMALL_STACK_CACHE - if (sha224->W != NULL) { - XFREE(sha224->W, NULL, DYNAMIC_TYPE_DIGEST); - sha224->W = NULL; - } + if (sha224->W != NULL) { + ForceZero(sha224->W, sizeof(word32) * WC_SHA224_BLOCK_SIZE); + XFREE(sha224->W, NULL, DYNAMIC_TYPE_DIGEST); + sha224->W = NULL; + } #endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224) @@ -1749,14 +2179,16 @@ KcapiHashFree(&sha224->kcapi); #endif #if defined(WOLFSSL_RENESAS_RX64_HASH) - if (sha224->msg != NULL) { - XFREE(sha224->msg, sha224->heap, DYNAMIC_TYPE_TMP_BUFFER); - sha224->msg = NULL; - } + if (sha224->msg != NULL) { + ForceZero(sha224->msg, sha224->len); + XFREE(sha224->msg, sha224->heap, DYNAMIC_TYPE_TMP_BUFFER); + sha224->msg = NULL; + } #endif + ForceZero(sha224, sizeof(*sha224)); } -#endif /* WOLFSSL_SHA224 */ -#endif /* !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH) */ +#endif /* !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH) */ +#endif /* WOLFSSL_SHA224 */ int wc_InitSha256(wc_Sha256* sha256) @@ -1777,8 +2209,15 @@ if (sha256 == NULL) return; +#if defined(WOLFSSL_ESP32) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) + esp_sha_release_unfinished_lock(&sha256->ctx); +#endif + #ifdef WOLFSSL_SMALL_STACK_CACHE if (sha256->W != NULL) { + ForceZero(sha256->W, sizeof(word32) * WC_SHA256_BLOCK_SIZE); XFREE(sha256->W, NULL, DYNAMIC_TYPE_DIGEST); sha256->W = NULL; } @@ -1805,15 +2244,16 @@ #endif /* WOLFSSL_DEVCRYPTO */ #if (defined(WOLFSSL_AFALG_HASH) && defined(WOLFSSL_AFALG_HASH_KEEP)) || \ (defined(WOLFSSL_DEVCRYPTO_HASH) && defined(WOLFSSL_DEVCRYPTO_HASH_KEEP)) || \ - (defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ + ((defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH)) || \ - ((defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY)) && \ - !defined(NO_WOLFSSL_RENESAS_SCEPROTECT_HASH)) || \ + (defined(WOLFSSL_RENESAS_SCEPROTECT) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)) || \ defined(WOLFSSL_RENESAS_RX64_HASH) || \ defined(WOLFSSL_HASH_KEEP) if (sha256->msg != NULL) { + ForceZero(sha256->msg, sha256->len); XFREE(sha256->msg, sha256->heap, DYNAMIC_TYPE_TMP_BUFFER); sha256->msg = NULL; } @@ -1831,8 +2271,17 @@ wc_MAXQ10XX_Sha256Free(sha256); #endif +#ifdef HAVE_ARIA + if (sha256->hSession != NULL) { + MC_CloseSession(sha256->hSession); + sha256->hSession = NULL; + } +#endif + /* Espressif embedded hardware acceleration specific: */ -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) if (sha256->ctx.lockDepth > 0) { /* probably due to unclean shutdown, error, or other problem. * @@ -1848,7 +2297,8 @@ ESP_LOGV(TAG, "Hardware unlock not needed in wc_Sha256Free."); } #endif -} + ForceZero(sha256, sizeof(*sha256)); +} /* wc_Sha256Free */ #endif /* !defined(WOLFSSL_HAVE_PSA) || defined(WOLFSSL_PSA_NO_HASH) */ #ifdef WOLFSSL_HASH_KEEP @@ -1872,11 +2322,12 @@ #endif /* WOLFSSL_HASH_KEEP */ #endif /* !WOLFSSL_TI_HASH */ -#endif /* HAVE_FIPS */ #ifndef WOLFSSL_TI_HASH -#if !defined(WOLFSSL_RENESAS_RX64_HASH) +#if !defined(WOLFSSL_RENESAS_RX64_HASH) && \ + (!defined(WOLFSSL_RENESAS_RSIP) || \ + defined(NO_WOLFSSL_RENESAS_FSPSM_HASH)) #ifdef WOLFSSL_SHA224 #if defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_NO_KCAPI_SHA224) @@ -1933,17 +2384,22 @@ dst->W = NULL; #endif - #ifdef WOLFSSL_SILABS_SE_ACCEL - dst->silabsCtx.hash_ctx.cmd_ctx = &(dst->silabsCtx.cmd_ctx); - dst->silabsCtx.hash_ctx.hash_type_ctx = &(dst->silabsCtx.hash_type_ctx); + #if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) + dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx; + dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx; #endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA224) ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev); #endif - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) - ret = esp_sha224_ctx_copy(src, dst); + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224)) + /* regardless of any other settings, there's no SHA-224 HW on ESP32 */ + #ifndef CONFIG_IDF_TARGET_ESP32 + ret = esp_sha224_ctx_copy(src, dst); + #endif #endif #ifdef WOLFSSL_HASH_FLAGS @@ -1991,16 +2447,16 @@ #elif defined(WOLFSSL_DEVCRYPTO_HASH) /* implemented in wolfcrypt/src/port/devcrypto/devcrypt_hash.c */ -#elif defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ +#elif (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) /* implemented in wolfcrypt/src/port/Renesas/renesas_tsip_sha.c */ -#elif (defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY)) && \ - !defined(NO_WOLFSSL_RENESAS_SCEPROTECT_HASH) +#elif (defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_RSIP))\ + && !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) - /* implemented in wolfcrypt/src/port/Renesas/renesas_sce_sha.c */ + /* implemented in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ #elif defined(WOLFSSL_PSOC6_CRYPTO) /* implemented in wolfcrypt/src/port/cypress/psoc6_crypto.c */ @@ -2068,9 +2524,9 @@ dst->W = NULL; #endif -#ifdef WOLFSSL_SILABS_SE_ACCEL - dst->silabsCtx.hash_ctx.cmd_ctx = &(dst->silabsCtx.cmd_ctx); - dst->silabsCtx.hash_ctx.hash_type_ctx = &(dst->silabsCtx.hash_type_ctx); +#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) + dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx; + dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx; #endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA256) @@ -2081,10 +2537,18 @@ ret = wc_Pic32HashCopy(&src->cache, &dst->cache); #endif -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) esp_sha256_ctx_copy(src, dst); #endif +#ifdef HAVE_ARIA + dst->hSession = NULL; + if((src->hSession != NULL) && (MC_CopySession(src->hSession, &(dst->hSession)) != MC_OK)) { + return MEMORY_E; + } +#endif + #ifdef WOLFSSL_HASH_FLAGS dst->flags |= WC_HASH_FLAG_ISCOPY; #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha256_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha256_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha256_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha256_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* sha256_asm - * - * Copyright (C) 2006-2023 wolfSSL Inc. +/* sha256_asm.S */ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -46,6 +46,441 @@ #endif /* NO_AVX2_SUPPORT */ #ifdef WOLFSSL_X86_64_BUILD +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_sse2_sha256_sha_k: +.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 +.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 +.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 +.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 +.long 0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc +.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da +.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 +.long 0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967 +.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 +.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 +.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 +.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 +.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 +.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 +.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 +.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_sse2_sha256_shuf_mask: +.quad 0x405060700010203, 0xc0d0e0f08090a0b +#ifndef __APPLE__ +.text +.globl Transform_Sha256_SSE2_Sha +.type Transform_Sha256_SSE2_Sha,@function +.align 16 +Transform_Sha256_SSE2_Sha: +#else +.section __TEXT,__text +.globl _Transform_Sha256_SSE2_Sha +.p2align 4 +_Transform_Sha256_SSE2_Sha: +#endif /* __APPLE__ */ + leaq L_sse2_sha256_sha_k(%rip), %rdx + movdqa L_sse2_sha256_shuf_mask(%rip), %xmm10 + movq (%rdi), %xmm1 + movq 8(%rdi), %xmm2 + movhpd 16(%rdi), %xmm1 + movhpd 24(%rdi), %xmm2 + pshufd $27, %xmm1, %xmm1 + pshufd $27, %xmm2, %xmm2 + movdqu (%rsi), %xmm3 + movdqu 16(%rsi), %xmm4 + movdqu 32(%rsi), %xmm5 + movdqu 48(%rsi), %xmm6 + pshufb %xmm10, %xmm3 + movdqa %xmm1, %xmm8 + movdqa %xmm2, %xmm9 + # Rounds: 0-3 + movdqa %xmm3, %xmm0 + paddd (%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 4-7 + pshufb %xmm10, %xmm4 + movdqa %xmm4, %xmm0 + paddd 16(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 8-11 + pshufb %xmm10, %xmm5 + movdqa %xmm5, %xmm0 + paddd 32(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 12-15 + pshufb %xmm10, %xmm6 + movdqa %xmm6, %xmm0 + paddd 48(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm6, %xmm7 + palignr $4, %xmm5, %xmm7 + paddd %xmm7, %xmm3 + sha256msg2 %xmm6, %xmm3 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 16-19 + movdqa %xmm3, %xmm0 + paddd 64(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm3, %xmm7 + palignr $4, %xmm6, %xmm7 + paddd %xmm7, %xmm4 + sha256msg2 %xmm3, %xmm4 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 20-23 + movdqa %xmm4, %xmm0 + paddd 80(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm4, %xmm7 + palignr $4, %xmm3, %xmm7 + paddd %xmm7, %xmm5 + sha256msg2 %xmm4, %xmm5 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 24-27 + movdqa %xmm5, %xmm0 + paddd 96(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm5, %xmm7 + palignr $4, %xmm4, %xmm7 + paddd %xmm7, %xmm6 + sha256msg2 %xmm5, %xmm6 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 28-31 + movdqa %xmm6, %xmm0 + paddd 112(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm6, %xmm7 + palignr $4, %xmm5, %xmm7 + paddd %xmm7, %xmm3 + sha256msg2 %xmm6, %xmm3 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 32-35 + movdqa %xmm3, %xmm0 + paddd 128(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm3, %xmm7 + palignr $4, %xmm6, %xmm7 + paddd %xmm7, %xmm4 + sha256msg2 %xmm3, %xmm4 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 36-39 + movdqa %xmm4, %xmm0 + paddd 144(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm4, %xmm7 + palignr $4, %xmm3, %xmm7 + paddd %xmm7, %xmm5 + sha256msg2 %xmm4, %xmm5 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 40-43 + movdqa %xmm5, %xmm0 + paddd 160(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm5, %xmm7 + palignr $4, %xmm4, %xmm7 + paddd %xmm7, %xmm6 + sha256msg2 %xmm5, %xmm6 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 44-47 + movdqa %xmm6, %xmm0 + paddd 176(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm6, %xmm7 + palignr $4, %xmm5, %xmm7 + paddd %xmm7, %xmm3 + sha256msg2 %xmm6, %xmm3 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 48-51 + movdqa %xmm3, %xmm0 + paddd 192(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm3, %xmm7 + palignr $4, %xmm6, %xmm7 + paddd %xmm7, %xmm4 + sha256msg2 %xmm3, %xmm4 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 52-63 + movdqa %xmm4, %xmm0 + paddd 208(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm4, %xmm7 + palignr $4, %xmm3, %xmm7 + paddd %xmm7, %xmm5 + sha256msg2 %xmm4, %xmm5 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + movdqa %xmm5, %xmm0 + paddd 224(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm5, %xmm7 + palignr $4, %xmm4, %xmm7 + paddd %xmm7, %xmm6 + sha256msg2 %xmm5, %xmm6 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + movdqa %xmm6, %xmm0 + paddd 240(%rdx), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + paddd %xmm8, %xmm1 + paddd %xmm9, %xmm2 + pshufd $27, %xmm1, %xmm1 + pshufd $27, %xmm2, %xmm2 + movq %xmm1, (%rdi) + movq %xmm2, 8(%rdi) + movhpd %xmm1, 16(%rdi) + movhpd %xmm2, 24(%rdi) + xorq %rax, %rax + vzeroupper + repz retq +#ifndef __APPLE__ +.size Transform_Sha256_SSE2_Sha,.-Transform_Sha256_SSE2_Sha +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl Transform_Sha256_SSE2_Sha_Len +.type Transform_Sha256_SSE2_Sha_Len,@function +.align 16 +Transform_Sha256_SSE2_Sha_Len: +#else +.section __TEXT,__text +.globl _Transform_Sha256_SSE2_Sha_Len +.p2align 4 +_Transform_Sha256_SSE2_Sha_Len: +#endif /* __APPLE__ */ + leaq L_sse2_sha256_sha_k(%rip), %rax + movdqa L_sse2_sha256_shuf_mask(%rip), %xmm10 + movq (%rdi), %xmm1 + movq 8(%rdi), %xmm2 + movhpd 16(%rdi), %xmm1 + movhpd 24(%rdi), %xmm2 + pshufd $27, %xmm1, %xmm1 + pshufd $27, %xmm2, %xmm2 + # Start of loop processing a block +L_sha256_sha_len_sse2_start: + movdqu (%rsi), %xmm3 + movdqu 16(%rsi), %xmm4 + movdqu 32(%rsi), %xmm5 + movdqu 48(%rsi), %xmm6 + pshufb %xmm10, %xmm3 + movdqa %xmm1, %xmm8 + movdqa %xmm2, %xmm9 + # Rounds: 0-3 + movdqa %xmm3, %xmm0 + paddd (%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 4-7 + pshufb %xmm10, %xmm4 + movdqa %xmm4, %xmm0 + paddd 16(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 8-11 + pshufb %xmm10, %xmm5 + movdqa %xmm5, %xmm0 + paddd 32(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 12-15 + pshufb %xmm10, %xmm6 + movdqa %xmm6, %xmm0 + paddd 48(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm6, %xmm7 + palignr $4, %xmm5, %xmm7 + paddd %xmm7, %xmm3 + sha256msg2 %xmm6, %xmm3 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 16-19 + movdqa %xmm3, %xmm0 + paddd 64(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm3, %xmm7 + palignr $4, %xmm6, %xmm7 + paddd %xmm7, %xmm4 + sha256msg2 %xmm3, %xmm4 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 20-23 + movdqa %xmm4, %xmm0 + paddd 80(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm4, %xmm7 + palignr $4, %xmm3, %xmm7 + paddd %xmm7, %xmm5 + sha256msg2 %xmm4, %xmm5 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 24-27 + movdqa %xmm5, %xmm0 + paddd 96(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm5, %xmm7 + palignr $4, %xmm4, %xmm7 + paddd %xmm7, %xmm6 + sha256msg2 %xmm5, %xmm6 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 28-31 + movdqa %xmm6, %xmm0 + paddd 112(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm6, %xmm7 + palignr $4, %xmm5, %xmm7 + paddd %xmm7, %xmm3 + sha256msg2 %xmm6, %xmm3 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 32-35 + movdqa %xmm3, %xmm0 + paddd 128(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm3, %xmm7 + palignr $4, %xmm6, %xmm7 + paddd %xmm7, %xmm4 + sha256msg2 %xmm3, %xmm4 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 36-39 + movdqa %xmm4, %xmm0 + paddd 144(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm4, %xmm7 + palignr $4, %xmm3, %xmm7 + paddd %xmm7, %xmm5 + sha256msg2 %xmm4, %xmm5 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 40-43 + movdqa %xmm5, %xmm0 + paddd 160(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm5, %xmm7 + palignr $4, %xmm4, %xmm7 + paddd %xmm7, %xmm6 + sha256msg2 %xmm5, %xmm6 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 44-47 + movdqa %xmm6, %xmm0 + paddd 176(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm6, %xmm7 + palignr $4, %xmm5, %xmm7 + paddd %xmm7, %xmm3 + sha256msg2 %xmm6, %xmm3 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 48-51 + movdqa %xmm3, %xmm0 + paddd 192(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm3, %xmm7 + palignr $4, %xmm6, %xmm7 + paddd %xmm7, %xmm4 + sha256msg2 %xmm3, %xmm4 + pshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 52-63 + movdqa %xmm4, %xmm0 + paddd 208(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm4, %xmm7 + palignr $4, %xmm3, %xmm7 + paddd %xmm7, %xmm5 + sha256msg2 %xmm4, %xmm5 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + movdqa %xmm5, %xmm0 + paddd 224(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + movdqa %xmm5, %xmm7 + palignr $4, %xmm4, %xmm7 + paddd %xmm7, %xmm6 + sha256msg2 %xmm5, %xmm6 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + movdqa %xmm6, %xmm0 + paddd 240(%rax), %xmm0 + sha256rnds2 %xmm1, %xmm2 + pshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + addq $0x40, %rsi + subl $0x40, %edx + paddd %xmm8, %xmm1 + paddd %xmm9, %xmm2 + jnz L_sha256_sha_len_sse2_start + pshufd $27, %xmm1, %xmm1 + pshufd $27, %xmm2, %xmm2 + movq %xmm1, (%rdi) + movq %xmm2, 8(%rdi) + movhpd %xmm1, 16(%rdi) + movhpd %xmm2, 24(%rdi) + xorq %rax, %rax + vzeroupper + repz retq +#ifndef __APPLE__ +.size Transform_Sha256_SSE2_Sha_Len,.-Transform_Sha256_SSE2_Sha_Len +#endif /* __APPLE__ */ #ifdef HAVE_INTEL_AVX1 #ifndef __APPLE__ .data @@ -122,8 +557,9 @@ pushq %r13 pushq %r14 pushq %r15 + pushq %rbp subq $0x40, %rsp - leaq 32(%rdi), %rax + leaq L_avx1_sha256_k(%rip), %rbp vmovdqa L_avx1_sha256_flip_mask(%rip), %xmm13 vmovdqa L_avx1_sha256_shuf_00BA(%rip), %xmm11 vmovdqa L_avx1_sha256_shuf_DC00(%rip), %xmm12 @@ -136,24 +572,24 @@ movl 24(%rdi), %r14d movl 28(%rdi), %r15d # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rax), %xmm0 - vmovdqu 16(%rax), %xmm1 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 vpshufb %xmm13, %xmm0, %xmm0 vpshufb %xmm13, %xmm1, %xmm1 - vmovdqu 32(%rax), %xmm2 - vmovdqu 48(%rax), %xmm3 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 vpshufb %xmm13, %xmm2, %xmm2 vpshufb %xmm13, %xmm3, %xmm3 movl %r9d, %ebx movl %r12d, %edx xorl %r10d, %ebx # set_w_k_xfer_4: 0 - vpaddd 0+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 16+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd (%rbp), %xmm0, %xmm4 + vpaddd 16(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 32+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 48+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 32(%rbp), %xmm2, %xmm6 + vpaddd 48(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -781,12 +1217,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 4 - vpaddd 64+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 80+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 64(%rbp), %xmm0, %xmm4 + vpaddd 80(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 96+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 112+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 96(%rbp), %xmm2, %xmm6 + vpaddd 112(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -1414,12 +1850,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 8 - vpaddd 128+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 144+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 128(%rbp), %xmm0, %xmm4 + vpaddd 144(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 160+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 176+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 160(%rbp), %xmm2, %xmm6 + vpaddd 176(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -2047,12 +2483,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 12 - vpaddd 192+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 208+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 192(%rbp), %xmm0, %xmm4 + vpaddd 208(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 224+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 240+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 224(%rbp), %xmm2, %xmm6 + vpaddd 240(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # rnd_all_4: 0-3 @@ -2486,6 +2922,7 @@ xorq %rax, %rax vzeroupper addq $0x40, %rsp + popq %rbp popq %r15 popq %r14 popq %r13 @@ -2513,9 +2950,10 @@ pushq %r14 pushq %r15 pushq %rbp - movq %rsi, %rbp - movq %rdx, %rsi - subq $0x40, %rsp + movq %rdx, %rbp + subq $0x44, %rsp + movl %ebp, 64(%rsp) + leaq L_avx1_sha256_k(%rip), %rbp vmovdqa L_avx1_sha256_flip_mask(%rip), %xmm13 vmovdqa L_avx1_sha256_shuf_00BA(%rip), %xmm11 vmovdqa L_avx1_sha256_shuf_DC00(%rip), %xmm12 @@ -2530,24 +2968,24 @@ # Start of loop processing a block L_sha256_len_avx1_start: # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rbp), %xmm0 - vmovdqu 16(%rbp), %xmm1 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 vpshufb %xmm13, %xmm0, %xmm0 vpshufb %xmm13, %xmm1, %xmm1 - vmovdqu 32(%rbp), %xmm2 - vmovdqu 48(%rbp), %xmm3 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 vpshufb %xmm13, %xmm2, %xmm2 vpshufb %xmm13, %xmm3, %xmm3 movl %r9d, %ebx movl %r12d, %edx xorl %r10d, %ebx # set_w_k_xfer_4: 0 - vpaddd 0+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 16+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd (%rbp), %xmm0, %xmm4 + vpaddd 16(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 32+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 48+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 32(%rbp), %xmm2, %xmm6 + vpaddd 48(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -3175,12 +3613,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 4 - vpaddd 64+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 80+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 64(%rbp), %xmm0, %xmm4 + vpaddd 80(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 96+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 112+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 96(%rbp), %xmm2, %xmm6 + vpaddd 112(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -3808,12 +4246,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 8 - vpaddd 128+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 144+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 128(%rbp), %xmm0, %xmm4 + vpaddd 144(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 160+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 176+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 160(%rbp), %xmm2, %xmm6 + vpaddd 176(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -4441,12 +4879,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 12 - vpaddd 192+L_avx1_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 208+L_avx1_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 192(%rbp), %xmm0, %xmm4 + vpaddd 208(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 224+L_avx1_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 240+L_avx1_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 224(%rbp), %xmm2, %xmm6 + vpaddd 240(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # rnd_all_4: 0-3 @@ -4877,8 +5315,8 @@ addl 20(%rdi), %r13d addl 24(%rdi), %r14d addl 28(%rdi), %r15d - addq $0x40, %rbp - subl $0x40, %esi + addq $0x40, %rsi + subl $0x40, 64(%rsp) movl %r8d, (%rdi) movl %r9d, 4(%rdi) movl %r10d, 8(%rdi) @@ -4890,7 +5328,7 @@ jnz L_sha256_len_avx1_start xorq %rax, %rax vzeroupper - addq $0x40, %rsp + addq $0x44, %rsp popq %rbp popq %r15 popq %r14 @@ -4976,18 +5414,19 @@ pushq %r13 pushq %r14 pushq %r15 + pushq %rbp subq $0x40, %rsp + leaq L_avx1_rorx_sha256_k(%rip), %rbp vmovdqa L_avx1_rorx_sha256_flip_mask(%rip), %xmm13 vmovdqa L_avx1_rorx_sha256_shuf_00BA(%rip), %xmm11 vmovdqa L_avx1_rorx_sha256_shuf_DC00(%rip), %xmm12 - leaq 32(%rdi), %rax # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rax), %xmm0 - vmovdqu 16(%rax), %xmm1 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 vpshufb %xmm13, %xmm0, %xmm0 vpshufb %xmm13, %xmm1, %xmm1 - vmovdqu 32(%rax), %xmm2 - vmovdqu 48(%rax), %xmm3 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 vpshufb %xmm13, %xmm2, %xmm2 vpshufb %xmm13, %xmm3, %xmm3 movl (%rdi), %r8d @@ -4999,12 +5438,12 @@ movl 24(%rdi), %r14d movl 28(%rdi), %r15d # set_w_k_xfer_4: 0 - vpaddd 0+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 16+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd (%rbp), %xmm0, %xmm4 + vpaddd 16(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 32+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 48+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 32(%rbp), %xmm2, %xmm6 + vpaddd 48(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) movl %r9d, %ebx @@ -5631,12 +6070,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 4 - vpaddd 64+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 80+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 64(%rbp), %xmm0, %xmm4 + vpaddd 80(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 96+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 112+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 96(%rbp), %xmm2, %xmm6 + vpaddd 112(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -6260,12 +6699,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 8 - vpaddd 128+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 144+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 128(%rbp), %xmm0, %xmm4 + vpaddd 144(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 160+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 176+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 160(%rbp), %xmm2, %xmm6 + vpaddd 176(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -6889,12 +7328,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 12 - vpaddd 192+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 208+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 192(%rbp), %xmm0, %xmm4 + vpaddd 208(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 224+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 240+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 224(%rbp), %xmm2, %xmm6 + vpaddd 240(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) xorl %eax, %eax @@ -7298,6 +7737,7 @@ xorq %rax, %rax vzeroupper addq $0x40, %rsp + popq %rbp popq %r15 popq %r14 popq %r13 @@ -7325,9 +7765,10 @@ pushq %r14 pushq %r15 pushq %rbp - movq %rsi, %rbp - movq %rdx, %rsi - subq $0x40, %rsp + movq %rdx, %rbp + subq $0x44, %rsp + movl %ebp, 64(%rsp) + leaq L_avx1_rorx_sha256_k(%rip), %rbp vmovdqa L_avx1_rorx_sha256_flip_mask(%rip), %xmm13 vmovdqa L_avx1_rorx_sha256_shuf_00BA(%rip), %xmm11 vmovdqa L_avx1_rorx_sha256_shuf_DC00(%rip), %xmm12 @@ -7342,21 +7783,21 @@ # Start of loop processing a block L_sha256_len_avx1_len_rorx_start: # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rbp), %xmm0 - vmovdqu 16(%rbp), %xmm1 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 vpshufb %xmm13, %xmm0, %xmm0 vpshufb %xmm13, %xmm1, %xmm1 - vmovdqu 32(%rbp), %xmm2 - vmovdqu 48(%rbp), %xmm3 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 vpshufb %xmm13, %xmm2, %xmm2 vpshufb %xmm13, %xmm3, %xmm3 # set_w_k_xfer_4: 0 - vpaddd 0+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 16+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd (%rbp), %xmm0, %xmm4 + vpaddd 16(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 32+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 48+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 32(%rbp), %xmm2, %xmm6 + vpaddd 48(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) movl %r9d, %ebx @@ -7983,12 +8424,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 4 - vpaddd 64+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 80+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 64(%rbp), %xmm0, %xmm4 + vpaddd 80(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 96+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 112+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 96(%rbp), %xmm2, %xmm6 + vpaddd 112(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -8612,12 +9053,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 8 - vpaddd 128+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 144+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 128(%rbp), %xmm0, %xmm4 + vpaddd 144(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 160+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 176+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 160(%rbp), %xmm2, %xmm6 + vpaddd 176(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) # msg_sched: 0-3 @@ -9241,12 +9682,12 @@ vpaddd %xmm4, %xmm9, %xmm3 # msg_sched done: 12-15 # set_w_k_xfer_4: 12 - vpaddd 192+L_avx1_rorx_sha256_k(%rip), %xmm0, %xmm4 - vpaddd 208+L_avx1_rorx_sha256_k(%rip), %xmm1, %xmm5 + vpaddd 192(%rbp), %xmm0, %xmm4 + vpaddd 208(%rbp), %xmm1, %xmm5 vmovdqu %xmm4, (%rsp) vmovdqu %xmm5, 16(%rsp) - vpaddd 224+L_avx1_rorx_sha256_k(%rip), %xmm2, %xmm6 - vpaddd 240+L_avx1_rorx_sha256_k(%rip), %xmm3, %xmm7 + vpaddd 224(%rbp), %xmm2, %xmm6 + vpaddd 240(%rbp), %xmm3, %xmm7 vmovdqu %xmm6, 32(%rsp) vmovdqu %xmm7, 48(%rsp) xorl %eax, %eax @@ -9648,8 +10089,8 @@ addl 20(%rdi), %r13d addl 24(%rdi), %r14d addl 28(%rdi), %r15d - addq $0x40, %rbp - subl $0x40, %esi + addq $0x40, %rsi + subl $0x40, 64(%rsp) movl %r8d, (%rdi) movl %r9d, 4(%rdi) movl %r10d, 8(%rdi) @@ -9661,7 +10102,7 @@ jnz L_sha256_len_avx1_len_rorx_start xorq %rax, %rax vzeroupper - addq $0x40, %rsp + addq $0x44, %rsp popq %rbp popq %r15 popq %r14 @@ -9672,6 +10113,385 @@ #ifndef __APPLE__ .size Transform_Sha256_AVX1_RORX_Len,.-Transform_Sha256_AVX1_RORX_Len #endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_avx1_sha256_sha_k: +.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5 +.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5 +.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3 +.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174 +.long 0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc +.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da +.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7 +.long 0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967 +.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13 +.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85 +.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3 +.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070 +.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5 +.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3 +.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208 +.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_avx1_sha256_shuf_mask: +.quad 0x405060700010203, 0xc0d0e0f08090a0b +#ifndef __APPLE__ +.text +.globl Transform_Sha256_AVX1_Sha +.type Transform_Sha256_AVX1_Sha,@function +.align 16 +Transform_Sha256_AVX1_Sha: +#else +.section __TEXT,__text +.globl _Transform_Sha256_AVX1_Sha +.p2align 4 +_Transform_Sha256_AVX1_Sha: +#endif /* __APPLE__ */ + leaq L_avx1_sha256_sha_k(%rip), %rdx + vmovdqa L_avx1_sha256_shuf_mask(%rip), %xmm10 + vmovq (%rdi), %xmm1 + vmovq 8(%rdi), %xmm2 + vmovhpd 16(%rdi), %xmm1, %xmm1 + vmovhpd 24(%rdi), %xmm2, %xmm2 + vpshufd $27, %xmm1, %xmm1 + vpshufd $27, %xmm2, %xmm2 + vmovdqu (%rsi), %xmm3 + vmovdqu 16(%rsi), %xmm4 + vmovdqu 32(%rsi), %xmm5 + vmovdqu 48(%rsi), %xmm6 + vpshufb %xmm10, %xmm3, %xmm3 + vmovdqa %xmm1, %xmm8 + vmovdqa %xmm2, %xmm9 + # Rounds: 0-3 + vpaddd (%rdx), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 4-7 + vpshufb %xmm10, %xmm4, %xmm4 + vpaddd 16(%rdx), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 8-11 + vpshufb %xmm10, %xmm5, %xmm5 + vpaddd 32(%rdx), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 12-15 + vpshufb %xmm10, %xmm6, %xmm6 + vpaddd 48(%rdx), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm5, %xmm6, %xmm7 + vpaddd %xmm7, %xmm3, %xmm3 + sha256msg2 %xmm6, %xmm3 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 16-19 + vpaddd 64(%rdx), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm6, %xmm3, %xmm7 + vpaddd %xmm7, %xmm4, %xmm4 + sha256msg2 %xmm3, %xmm4 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 20-23 + vpaddd 80(%rdx), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm3, %xmm4, %xmm7 + vpaddd %xmm7, %xmm5, %xmm5 + sha256msg2 %xmm4, %xmm5 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 24-27 + vpaddd 96(%rdx), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm4, %xmm5, %xmm7 + vpaddd %xmm7, %xmm6, %xmm6 + sha256msg2 %xmm5, %xmm6 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 28-31 + vpaddd 112(%rdx), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm5, %xmm6, %xmm7 + vpaddd %xmm7, %xmm3, %xmm3 + sha256msg2 %xmm6, %xmm3 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 32-35 + vpaddd 128(%rdx), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm6, %xmm3, %xmm7 + vpaddd %xmm7, %xmm4, %xmm4 + sha256msg2 %xmm3, %xmm4 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 36-39 + vpaddd 144(%rdx), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm3, %xmm4, %xmm7 + vpaddd %xmm7, %xmm5, %xmm5 + sha256msg2 %xmm4, %xmm5 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 40-43 + vpaddd 160(%rdx), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm4, %xmm5, %xmm7 + vpaddd %xmm7, %xmm6, %xmm6 + sha256msg2 %xmm5, %xmm6 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 44-47 + vpaddd 176(%rdx), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm5, %xmm6, %xmm7 + vpaddd %xmm7, %xmm3, %xmm3 + sha256msg2 %xmm6, %xmm3 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 48-51 + vpaddd 192(%rdx), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm6, %xmm3, %xmm7 + vpaddd %xmm7, %xmm4, %xmm4 + sha256msg2 %xmm3, %xmm4 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 52-63 + vpaddd 208(%rdx), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm3, %xmm4, %xmm7 + vpaddd %xmm7, %xmm5, %xmm5 + sha256msg2 %xmm4, %xmm5 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + vpaddd 224(%rdx), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm4, %xmm5, %xmm7 + vpaddd %xmm7, %xmm6, %xmm6 + sha256msg2 %xmm5, %xmm6 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + vpaddd 240(%rdx), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + vpaddd %xmm8, %xmm1, %xmm1 + vpaddd %xmm9, %xmm2, %xmm2 + vpshufd $27, %xmm1, %xmm1 + vpshufd $27, %xmm2, %xmm2 + vmovq %xmm1, (%rdi) + vmovq %xmm2, 8(%rdi) + vmovhpd %xmm1, 16(%rdi) + vmovhpd %xmm2, 24(%rdi) + xorq %rax, %rax + vzeroupper + repz retq +#ifndef __APPLE__ +.size Transform_Sha256_AVX1_Sha,.-Transform_Sha256_AVX1_Sha +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl Transform_Sha256_AVX1_Sha_Len +.type Transform_Sha256_AVX1_Sha_Len,@function +.align 16 +Transform_Sha256_AVX1_Sha_Len: +#else +.section __TEXT,__text +.globl _Transform_Sha256_AVX1_Sha_Len +.p2align 4 +_Transform_Sha256_AVX1_Sha_Len: +#endif /* __APPLE__ */ + leaq L_avx1_sha256_sha_k(%rip), %rax + vmovdqa L_avx1_sha256_shuf_mask(%rip), %xmm10 + vmovq (%rdi), %xmm1 + vmovq 8(%rdi), %xmm2 + vmovhpd 16(%rdi), %xmm1, %xmm1 + vmovhpd 24(%rdi), %xmm2, %xmm2 + vpshufd $27, %xmm1, %xmm1 + vpshufd $27, %xmm2, %xmm2 + # Start of loop processing a block +L_sha256_sha_len_avx1_start: + vmovdqu (%rsi), %xmm3 + vmovdqu 16(%rsi), %xmm4 + vmovdqu 32(%rsi), %xmm5 + vmovdqu 48(%rsi), %xmm6 + vpshufb %xmm10, %xmm3, %xmm3 + vmovdqa %xmm1, %xmm8 + vmovdqa %xmm2, %xmm9 + # Rounds: 0-3 + vpaddd (%rax), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 4-7 + vpshufb %xmm10, %xmm4, %xmm4 + vpaddd 16(%rax), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 8-11 + vpshufb %xmm10, %xmm5, %xmm5 + vpaddd 32(%rax), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 12-15 + vpshufb %xmm10, %xmm6, %xmm6 + vpaddd 48(%rax), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm5, %xmm6, %xmm7 + vpaddd %xmm7, %xmm3, %xmm3 + sha256msg2 %xmm6, %xmm3 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 16-19 + vpaddd 64(%rax), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm6, %xmm3, %xmm7 + vpaddd %xmm7, %xmm4, %xmm4 + sha256msg2 %xmm3, %xmm4 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 20-23 + vpaddd 80(%rax), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm3, %xmm4, %xmm7 + vpaddd %xmm7, %xmm5, %xmm5 + sha256msg2 %xmm4, %xmm5 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 24-27 + vpaddd 96(%rax), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm4, %xmm5, %xmm7 + vpaddd %xmm7, %xmm6, %xmm6 + sha256msg2 %xmm5, %xmm6 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 28-31 + vpaddd 112(%rax), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm5, %xmm6, %xmm7 + vpaddd %xmm7, %xmm3, %xmm3 + sha256msg2 %xmm6, %xmm3 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 32-35 + vpaddd 128(%rax), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm6, %xmm3, %xmm7 + vpaddd %xmm7, %xmm4, %xmm4 + sha256msg2 %xmm3, %xmm4 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 36-39 + vpaddd 144(%rax), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm3, %xmm4, %xmm7 + vpaddd %xmm7, %xmm5, %xmm5 + sha256msg2 %xmm4, %xmm5 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm4, %xmm3 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 40-43 + vpaddd 160(%rax), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm4, %xmm5, %xmm7 + vpaddd %xmm7, %xmm6, %xmm6 + sha256msg2 %xmm5, %xmm6 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm5, %xmm4 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 44-47 + vpaddd 176(%rax), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm5, %xmm6, %xmm7 + vpaddd %xmm7, %xmm3, %xmm3 + sha256msg2 %xmm6, %xmm3 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm6, %xmm5 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 48-51 + vpaddd 192(%rax), %xmm3, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm6, %xmm3, %xmm7 + vpaddd %xmm7, %xmm4, %xmm4 + sha256msg2 %xmm3, %xmm4 + vpshufd $14, %xmm0, %xmm0 + sha256msg1 %xmm3, %xmm6 + sha256rnds2 %xmm2, %xmm1 + # Rounds: 52-63 + vpaddd 208(%rax), %xmm4, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm3, %xmm4, %xmm7 + vpaddd %xmm7, %xmm5, %xmm5 + sha256msg2 %xmm4, %xmm5 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + vpaddd 224(%rax), %xmm5, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpalignr $4, %xmm4, %xmm5, %xmm7 + vpaddd %xmm7, %xmm6, %xmm6 + sha256msg2 %xmm5, %xmm6 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + vpaddd 240(%rax), %xmm6, %xmm0 + sha256rnds2 %xmm1, %xmm2 + vpshufd $14, %xmm0, %xmm0 + sha256rnds2 %xmm2, %xmm1 + addq $0x40, %rsi + subl $0x40, %edx + vpaddd %xmm8, %xmm1, %xmm1 + vpaddd %xmm9, %xmm2, %xmm2 + jnz L_sha256_sha_len_avx1_start + vpshufd $27, %xmm1, %xmm1 + vpshufd $27, %xmm2, %xmm2 + vmovq %xmm1, (%rdi) + vmovq %xmm2, 8(%rdi) + vmovhpd %xmm1, 16(%rdi) + vmovhpd %xmm2, 24(%rdi) + xorq %rax, %rax + vzeroupper + repz retq +#ifndef __APPLE__ +.size Transform_Sha256_AVX1_Sha_Len,.-Transform_Sha256_AVX1_Sha_Len +#endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX1 */ #ifdef HAVE_INTEL_AVX2 #ifndef __APPLE__ @@ -9768,8 +10588,9 @@ pushq %r13 pushq %r14 pushq %r15 + pushq %rbp subq $0x200, %rsp - leaq 32(%rdi), %rax + leaq L_avx2_sha256_k(%rip), %rbp vmovdqa L_avx2_sha256_flip_mask(%rip), %xmm13 vmovdqa L_avx2_sha256_shuf_00BA(%rip), %ymm11 vmovdqa L_avx2_sha256_shuf_DC00(%rip), %ymm12 @@ -9782,24 +10603,24 @@ movl 24(%rdi), %r14d movl 28(%rdi), %r15d # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rax), %xmm0 - vmovdqu 16(%rax), %xmm1 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 vpshufb %xmm13, %xmm0, %xmm0 vpshufb %xmm13, %xmm1, %xmm1 - vmovdqu 32(%rax), %xmm2 - vmovdqu 48(%rax), %xmm3 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 vpshufb %xmm13, %xmm2, %xmm2 vpshufb %xmm13, %xmm3, %xmm3 movl %r9d, %ebx movl %r12d, %edx xorl %r10d, %ebx # set_w_k_xfer_4: 0 - vpaddd 0+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 32+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd (%rbp), %ymm0, %ymm4 + vpaddd 32(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, (%rsp) vmovdqu %ymm5, 32(%rsp) - vpaddd 64+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 96+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 64(%rbp), %ymm2, %ymm4 + vpaddd 96(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 64(%rsp) vmovdqu %ymm5, 96(%rsp) # msg_sched: 0-3 @@ -10427,12 +11248,12 @@ vpaddd %ymm4, %ymm9, %ymm3 # msg_sched done: 24-27 # set_w_k_xfer_4: 4 - vpaddd 128+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 160+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd 128(%rbp), %ymm0, %ymm4 + vpaddd 160(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, 128(%rsp) vmovdqu %ymm5, 160(%rsp) - vpaddd 192+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 224+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 192(%rbp), %ymm2, %ymm4 + vpaddd 224(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 192(%rsp) vmovdqu %ymm5, 224(%rsp) # msg_sched: 32-35 @@ -11060,12 +11881,12 @@ vpaddd %ymm4, %ymm9, %ymm3 # msg_sched done: 56-59 # set_w_k_xfer_4: 8 - vpaddd 256+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 288+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd 256(%rbp), %ymm0, %ymm4 + vpaddd 288(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, 256(%rsp) vmovdqu %ymm5, 288(%rsp) - vpaddd 320+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 352+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 320(%rbp), %ymm2, %ymm4 + vpaddd 352(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 320(%rsp) vmovdqu %ymm5, 352(%rsp) # msg_sched: 64-67 @@ -11693,12 +12514,12 @@ vpaddd %ymm4, %ymm9, %ymm3 # msg_sched done: 88-91 # set_w_k_xfer_4: 12 - vpaddd 384+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 416+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd 384(%rbp), %ymm0, %ymm4 + vpaddd 416(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, 384(%rsp) vmovdqu %ymm5, 416(%rsp) - vpaddd 448+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 480+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 448(%rbp), %ymm2, %ymm4 + vpaddd 480(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 448(%rsp) vmovdqu %ymm5, 480(%rsp) # rnd_all_4: 24-27 @@ -12132,6 +12953,7 @@ xorq %rax, %rax vzeroupper addq $0x200, %rsp + popq %rbp popq %r15 popq %r14 popq %r13 @@ -12159,13 +12981,13 @@ pushq %r14 pushq %r15 pushq %rbp - movq %rsi, %rbp - movq %rdx, %rsi - subq $0x200, %rsp - testb $0x40, %sil + movq %rdx, %rbp + subq $0x204, %rsp + testb $0x40, %bpl + movl %ebp, 512(%rsp) je L_sha256_len_avx2_block - vmovdqu (%rbp), %ymm0 - vmovdqu 32(%rbp), %ymm1 + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 vmovups %ymm0, 32(%rdi) vmovups %ymm1, 64(%rdi) #ifndef __APPLE__ @@ -12173,10 +12995,11 @@ #else call _Transform_Sha256_AVX2 #endif /* __APPLE__ */ - addq $0x40, %rbp - subl $0x40, %esi + addq $0x40, %rsi + subl $0x40, 512(%rsp) jz L_sha256_len_avx2_done L_sha256_len_avx2_block: + leaq L_avx2_sha256_k(%rip), %rbp vmovdqa L_avx2_sha256_flip_mask(%rip), %ymm13 vmovdqa L_avx2_sha256_shuf_00BA(%rip), %ymm11 vmovdqa L_avx2_sha256_shuf_DC00(%rip), %ymm12 @@ -12191,18 +13014,18 @@ # Start of loop processing two blocks L_sha256_len_avx2_start: # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rbp), %xmm0 - vmovdqu 16(%rbp), %xmm1 - vmovdqu 64(%rbp), %xmm4 - vmovdqu 80(%rbp), %xmm5 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 + vmovdqu 64(%rsi), %xmm4 + vmovdqu 80(%rsi), %xmm5 vinserti128 $0x01, %xmm4, %ymm0, %ymm0 vinserti128 $0x01, %xmm5, %ymm1, %ymm1 vpshufb %ymm13, %ymm0, %ymm0 vpshufb %ymm13, %ymm1, %ymm1 - vmovdqu 32(%rbp), %xmm2 - vmovdqu 48(%rbp), %xmm3 - vmovdqu 96(%rbp), %xmm6 - vmovdqu 112(%rbp), %xmm7 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 + vmovdqu 96(%rsi), %xmm6 + vmovdqu 112(%rsi), %xmm7 vinserti128 $0x01, %xmm6, %ymm2, %ymm2 vinserti128 $0x01, %xmm7, %ymm3, %ymm3 vpshufb %ymm13, %ymm2, %ymm2 @@ -12211,12 +13034,12 @@ movl %r12d, %edx xorl %r10d, %ebx # set_w_k_xfer_4: 0 - vpaddd 0+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 32+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd (%rbp), %ymm0, %ymm4 + vpaddd 32(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, (%rsp) vmovdqu %ymm5, 32(%rsp) - vpaddd 64+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 96+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 64(%rbp), %ymm2, %ymm4 + vpaddd 96(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 64(%rsp) vmovdqu %ymm5, 96(%rsp) # msg_sched: 0-3 @@ -12844,12 +13667,12 @@ vpaddd %ymm4, %ymm9, %ymm3 # msg_sched done: 24-27 # set_w_k_xfer_4: 4 - vpaddd 128+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 160+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd 128(%rbp), %ymm0, %ymm4 + vpaddd 160(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, 128(%rsp) vmovdqu %ymm5, 160(%rsp) - vpaddd 192+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 224+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 192(%rbp), %ymm2, %ymm4 + vpaddd 224(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 192(%rsp) vmovdqu %ymm5, 224(%rsp) # msg_sched: 32-35 @@ -13477,12 +14300,12 @@ vpaddd %ymm4, %ymm9, %ymm3 # msg_sched done: 56-59 # set_w_k_xfer_4: 8 - vpaddd 256+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 288+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd 256(%rbp), %ymm0, %ymm4 + vpaddd 288(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, 256(%rsp) vmovdqu %ymm5, 288(%rsp) - vpaddd 320+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 352+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 320(%rbp), %ymm2, %ymm4 + vpaddd 352(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 320(%rsp) vmovdqu %ymm5, 352(%rsp) # msg_sched: 64-67 @@ -14110,12 +14933,12 @@ vpaddd %ymm4, %ymm9, %ymm3 # msg_sched done: 88-91 # set_w_k_xfer_4: 12 - vpaddd 384+L_avx2_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 416+L_avx2_sha256_k(%rip), %ymm1, %ymm5 + vpaddd 384(%rbp), %ymm0, %ymm4 + vpaddd 416(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, 384(%rsp) vmovdqu %ymm5, 416(%rsp) - vpaddd 448+L_avx2_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 480+L_avx2_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 448(%rbp), %ymm2, %ymm4 + vpaddd 480(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 448(%rsp) vmovdqu %ymm5, 480(%rsp) # rnd_all_4: 24-27 @@ -16245,8 +17068,8 @@ addl 20(%rdi), %r13d addl 24(%rdi), %r14d addl 28(%rdi), %r15d - addq $0x80, %rbp - subl $0x80, %esi + addq $0x80, %rsi + subl $0x80, 512(%rsp) movl %r8d, (%rdi) movl %r9d, 4(%rdi) movl %r10d, 8(%rdi) @@ -16259,7 +17082,7 @@ L_sha256_len_avx2_done: xorq %rax, %rax vzeroupper - addq $0x200, %rsp + addq $0x204, %rsp popq %rbp popq %r15 popq %r14 @@ -16364,26 +17187,27 @@ pushq %r13 pushq %r14 pushq %r15 + pushq %rbp subq $0x200, %rsp - leaq 32(%rdi), %rax + leaq L_avx2_rorx_sha256_k(%rip), %rbp vmovdqa L_avx2_rorx_sha256_flip_mask(%rip), %xmm13 vmovdqa L_avx2_rorx_sha256_shuf_00BA(%rip), %ymm11 vmovdqa L_avx2_rorx_sha256_shuf_DC00(%rip), %ymm12 # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rax), %xmm0 - vmovdqu 16(%rax), %xmm1 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 vpshufb %xmm13, %xmm0, %xmm0 vpshufb %xmm13, %xmm1, %xmm1 - vpaddd 0+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 32+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm5 + vpaddd (%rbp), %ymm0, %ymm4 + vpaddd 32(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, (%rsp) vmovdqu %ymm5, 32(%rsp) - vmovdqu 32(%rax), %xmm2 - vmovdqu 48(%rax), %xmm3 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 vpshufb %xmm13, %xmm2, %xmm2 vpshufb %xmm13, %xmm3, %xmm3 - vpaddd 64+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 96+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 64(%rbp), %ymm2, %ymm4 + vpaddd 96(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 64(%rsp) vmovdqu %ymm5, 96(%rsp) movl (%rdi), %r8d @@ -16546,7 +17370,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 128+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 + vpaddd 128(%rbp), %ymm0, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -16705,7 +17529,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 160+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm4 + vpaddd 160(%rbp), %ymm1, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -16864,7 +17688,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 192+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 + vpaddd 192(%rbp), %ymm2, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -17023,7 +17847,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 224+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm4 + vpaddd 224(%rbp), %ymm3, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -17182,7 +18006,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 256+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 + vpaddd 256(%rbp), %ymm0, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -17341,7 +18165,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 288+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm4 + vpaddd 288(%rbp), %ymm1, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -17500,7 +18324,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 320+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 + vpaddd 320(%rbp), %ymm2, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -17659,7 +18483,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 352+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm4 + vpaddd 352(%rbp), %ymm3, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -17818,7 +18642,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 384+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 + vpaddd 384(%rbp), %ymm0, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -17977,7 +18801,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 416+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm4 + vpaddd 416(%rbp), %ymm1, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -18136,7 +18960,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 448+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 + vpaddd 448(%rbp), %ymm2, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -18295,7 +19119,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 480+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm4 + vpaddd 480(%rbp), %ymm3, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -18703,6 +19527,7 @@ xorq %rax, %rax vzeroupper addq $0x200, %rsp + popq %rbp popq %r15 popq %r14 popq %r13 @@ -18730,13 +19555,13 @@ pushq %r14 pushq %r15 pushq %rbp - movq %rsi, %rbp - movq %rdx, %rsi - subq $0x200, %rsp - testb $0x40, %sil + movq %rdx, %rbp + subq $0x204, %rsp + testb $0x40, %bpl + movl %ebp, 512(%rsp) je L_sha256_len_avx2_rorx_block - vmovdqu (%rbp), %ymm0 - vmovdqu 32(%rbp), %ymm1 + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 vmovups %ymm0, 32(%rdi) vmovups %ymm1, 64(%rdi) #ifndef __APPLE__ @@ -18744,10 +19569,11 @@ #else call _Transform_Sha256_AVX2_RORX #endif /* __APPLE__ */ - addq $0x40, %rbp - subl $0x40, %esi + addq $0x40, %rsi + subl $0x40, 512(%rsp) jz L_sha256_len_avx2_rorx_done L_sha256_len_avx2_rorx_block: + leaq L_avx2_rorx_sha256_k(%rip), %rbp vmovdqa L_avx2_rorx_sha256_flip_mask(%rip), %ymm13 vmovdqa L_avx2_rorx_sha256_shuf_00BA(%rip), %ymm11 vmovdqa L_avx2_rorx_sha256_shuf_DC00(%rip), %ymm12 @@ -18762,24 +19588,24 @@ # Start of loop processing two blocks L_sha256_len_avx2_rorx_start: # X0, X1, X2, X3 = W[0..15] - vmovdqu (%rbp), %xmm0 - vmovdqu 16(%rbp), %xmm1 - vinserti128 $0x01, 64(%rbp), %ymm0, %ymm0 - vinserti128 $0x01, 80(%rbp), %ymm1, %ymm1 + vmovdqu (%rsi), %xmm0 + vmovdqu 16(%rsi), %xmm1 + vinserti128 $0x01, 64(%rsi), %ymm0, %ymm0 + vinserti128 $0x01, 80(%rsi), %ymm1, %ymm1 vpshufb %ymm13, %ymm0, %ymm0 vpshufb %ymm13, %ymm1, %ymm1 - vpaddd 0+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 - vpaddd 32+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm5 + vpaddd (%rbp), %ymm0, %ymm4 + vpaddd 32(%rbp), %ymm1, %ymm5 vmovdqu %ymm4, (%rsp) vmovdqu %ymm5, 32(%rsp) - vmovdqu 32(%rbp), %xmm2 - vmovdqu 48(%rbp), %xmm3 - vinserti128 $0x01, 96(%rbp), %ymm2, %ymm2 - vinserti128 $0x01, 112(%rbp), %ymm3, %ymm3 + vmovdqu 32(%rsi), %xmm2 + vmovdqu 48(%rsi), %xmm3 + vinserti128 $0x01, 96(%rsi), %ymm2, %ymm2 + vinserti128 $0x01, 112(%rsi), %ymm3, %ymm3 vpshufb %ymm13, %ymm2, %ymm2 vpshufb %ymm13, %ymm3, %ymm3 - vpaddd 64+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 - vpaddd 96+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm5 + vpaddd 64(%rbp), %ymm2, %ymm4 + vpaddd 96(%rbp), %ymm3, %ymm5 vmovdqu %ymm4, 64(%rsp) vmovdqu %ymm5, 96(%rsp) movl %r9d, %ebx @@ -18934,7 +19760,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 128+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 + vpaddd 128(%rbp), %ymm0, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -19093,7 +19919,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 160+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm4 + vpaddd 160(%rbp), %ymm1, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -19252,7 +20078,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 192+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 + vpaddd 192(%rbp), %ymm2, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -19411,7 +20237,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 224+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm4 + vpaddd 224(%rbp), %ymm3, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -19570,7 +20396,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 256+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 + vpaddd 256(%rbp), %ymm0, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -19729,7 +20555,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 288+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm4 + vpaddd 288(%rbp), %ymm1, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -19888,7 +20714,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 320+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 + vpaddd 320(%rbp), %ymm2, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -20047,7 +20873,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 352+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm4 + vpaddd 352(%rbp), %ymm3, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -20206,7 +21032,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 384+L_avx2_rorx_sha256_k(%rip), %ymm0, %ymm4 + vpaddd 384(%rbp), %ymm0, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -20365,7 +21191,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 416+L_avx2_rorx_sha256_k(%rip), %ymm1, %ymm4 + vpaddd 416(%rbp), %ymm1, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -20524,7 +21350,7 @@ xorl %ecx, %edx addl %r12d, %r8d movl %r14d, %ebx - vpaddd 448+L_avx2_rorx_sha256_k(%rip), %ymm2, %ymm4 + vpaddd 448(%rbp), %ymm2, %ymm4 # rnd_1: 6 - 6 xorl %r13d, %ebx addl %edx, %r12d @@ -20683,7 +21509,7 @@ xorl %ecx, %edx addl %r8d, %r12d movl %r10d, %ebx - vpaddd 480+L_avx2_rorx_sha256_k(%rip), %ymm3, %ymm4 + vpaddd 480(%rbp), %ymm3, %ymm4 # rnd_1: 6 - 6 xorl %r9d, %ebx addl %edx, %r8d @@ -22637,7 +23463,7 @@ addl %edx, %r8d xorl %r10d, %eax addl %eax, %r8d - addq $0x80, %rbp + addq $0x80, %rsi addl (%rdi), %r8d addl 4(%rdi), %r9d addl 8(%rdi), %r10d @@ -22646,7 +23472,7 @@ addl 20(%rdi), %r13d addl 24(%rdi), %r14d addl 28(%rdi), %r15d - subl $0x80, %esi + subl $0x80, 512(%rsp) movl %r8d, (%rdi) movl %r9d, 4(%rdi) movl %r10d, 8(%rdi) @@ -22659,7 +23485,7 @@ L_sha256_len_avx2_rorx_done: xorq %rax, %rax vzeroupper - addq $0x200, %rsp + addq $0x204, %rsp popq %rbp popq %r15 popq %r14 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha3.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha3.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha3.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha3.c 2024-08-03 07:30:00.000000000 +0000 @@ -29,13 +29,13 @@ #if defined(WOLFSSL_SHA3) && !defined(WOLFSSL_XILINX_CRYPT) && \ !defined(WOLFSSL_AFALG_XILINX_SHA3) -#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) /* set NO_WRAPPERS before headers, use direct internal f()s not wrappers */ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$l") - #pragma const_seg(".fipsB$l") + #pragma code_seg(".fipsA$n") + #pragma const_seg(".fipsB$n") #endif #endif @@ -43,6 +43,9 @@ #include #include +#ifdef WOLF_CRYPTO_CB + #include +#endif #ifdef NO_INLINE #include #else @@ -50,17 +53,33 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_sha3_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000016 }; + int wolfCrypt_FIPS_SHA3_sanity(void) + { + return 0; + } +#endif -#if !defined(WOLFSSL_ARMASM) || !defined(WOLFSSL_ARMASM_CRYPTO_SHA3) +#if !defined(WOLFSSL_ARMASM) || (!defined(__arm__) && \ + !defined(WOLFSSL_ARMASM_CRYPTO_SHA3)) #ifdef USE_INTEL_SPEEDUP #include word32 cpuid_flags; int cpuid_flags_set = 0; +#ifdef WC_C_DYNAMIC_FALLBACK + #define SHA3_BLOCK (sha3->sha3_block) + #define SHA3_BLOCK_N (sha3->sha3_block_n) +#else void (*sha3_block)(word64 *s) = NULL; void (*sha3_block_n)(word64 *s, const byte* data, word32 n, word64 c) = NULL; + #define SHA3_BLOCK sha3_block + #define SHA3_BLOCK_N sha3_block_n +#endif #endif #ifdef WOLFSSL_SHA3_SMALL @@ -614,15 +633,26 @@ if (!cpuid_flags_set) { cpuid_flags = cpuid_get_flags(); cpuid_flags_set = 1; +#ifdef WC_C_DYNAMIC_FALLBACK + } + { + if (! CAN_SAVE_VECTOR_REGISTERS()) { + SHA3_BLOCK = BlockSha3; + SHA3_BLOCK_N = NULL; + } + else +#endif if (IS_INTEL_BMI1(cpuid_flags) && IS_INTEL_BMI2(cpuid_flags)) { - sha3_block = sha3_block_bmi2; - sha3_block_n = sha3_block_n_bmi2; + SHA3_BLOCK = sha3_block_bmi2; + SHA3_BLOCK_N = sha3_block_n_bmi2; } else if (IS_INTEL_AVX2(cpuid_flags)) { - sha3_block = sha3_block_avx2; + SHA3_BLOCK = sha3_block_avx2; + SHA3_BLOCK_N = NULL; } else { - sha3_block = BlockSha3; + SHA3_BLOCK = BlockSha3; + SHA3_BLOCK_N = NULL; } } #endif @@ -643,6 +673,10 @@ word32 i; word32 blocks; +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#endif if (sha3->i > 0) { byte *t; byte l = (byte)(p * 8 - sha3->i); @@ -663,7 +697,7 @@ sha3->s[i] ^= Load64BitBigEndian(sha3->t + 8 * i); } #ifdef USE_INTEL_SPEEDUP - (*sha3_block)(sha3->s); + (*SHA3_BLOCK)(sha3->s); #else BlockSha3(sha3->s); #endif @@ -672,8 +706,8 @@ } blocks = len / (p * 8); #ifdef USE_INTEL_SPEEDUP - if ((sha3_block_n != NULL) && (blocks > 0)) { - (*sha3_block_n)(sha3->s, data, blocks, p * 8); + if ((SHA3_BLOCK_N != NULL) && (blocks > 0)) { + (*SHA3_BLOCK_N)(sha3->s, data, blocks, p * 8); len -= blocks * (p * 8); data += blocks * (p * 8); blocks = 0; @@ -684,13 +718,17 @@ sha3->s[i] ^= Load64Unaligned(data + 8 * i); } #ifdef USE_INTEL_SPEEDUP - (*sha3_block)(sha3->s); + (*SHA3_BLOCK)(sha3->s); #else BlockSha3(sha3->s); #endif len -= p * 8; data += p * 8; } +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + RESTORE_VECTOR_REGISTERS(); +#endif XMEMCPY(sha3->t, data, len); sha3->i += (byte)len; @@ -724,9 +762,15 @@ for (i = 0; i < p; i++) { sha3->s[i] ^= Load64BitBigEndian(sha3->t + 8 * i); } + +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#endif + for (j = 0; l - j >= rate; j += rate) { #ifdef USE_INTEL_SPEEDUP - (*sha3_block)(sha3->s); + (*SHA3_BLOCK)(sha3->s); #else BlockSha3(sha3->s); #endif @@ -738,7 +782,7 @@ } if (j != l) { #ifdef USE_INTEL_SPEEDUP - (*sha3_block)(sha3->s); + (*SHA3_BLOCK)(sha3->s); #else BlockSha3(sha3->s); #endif @@ -747,6 +791,11 @@ #endif XMEMCPY(hash + j, sha3->s, l - j); } +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + RESTORE_VECTOR_REGISTERS(); +#endif + return 0; } @@ -772,10 +821,12 @@ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA3) ret = wolfAsync_DevCtxInit(&sha3->asyncDev, WOLFSSL_ASYNC_MARKER_SHA3, sha3->heap, devId); -#else - (void)devId; +#elif defined(WOLF_CRYPTO_CB) + sha3->devId = devId; #endif /* WOLFSSL_ASYNC_CRYPT */ + (void)devId; + return ret; } @@ -800,13 +851,32 @@ return 0; } +#ifdef WOLF_CRYPTO_CB + #ifndef WOLF_CRYPTO_CB_FIND + if (sha3->devId != INVALID_DEVID) + #endif + { + int hash_type = WC_HASH_TYPE_NONE; + switch (p) { + case WC_SHA3_224_COUNT: hash_type = WC_HASH_TYPE_SHA3_224; break; + case WC_SHA3_256_COUNT: hash_type = WC_HASH_TYPE_SHA3_256; break; + case WC_SHA3_384_COUNT: hash_type = WC_HASH_TYPE_SHA3_384; break; + case WC_SHA3_512_COUNT: hash_type = WC_HASH_TYPE_SHA3_512; break; + default: return BAD_FUNC_ARG; + } + ret = wc_CryptoCb_Sha3Hash(sha3, hash_type, data, len, NULL); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + } +#endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA3) if (sha3->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA3) { #if defined(HAVE_INTEL_QA) && defined(QAT_V2) /* QAT only supports SHA3_256 */ if (p == WC_SHA3_256_COUNT) { ret = IntelQaSymSha3(&sha3->asyncDev, NULL, data, len); - if (ret != NOT_COMPILED_IN) + if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN)) return ret; /* fall-through when unavailable */ } @@ -835,6 +905,25 @@ return BAD_FUNC_ARG; } +#ifdef WOLF_CRYPTO_CB + #ifndef WOLF_CRYPTO_CB_FIND + if (sha3->devId != INVALID_DEVID) + #endif + { + int hash_type = WC_HASH_TYPE_NONE; + switch (p) { + case WC_SHA3_224_COUNT: hash_type = WC_HASH_TYPE_SHA3_224; break; + case WC_SHA3_256_COUNT: hash_type = WC_HASH_TYPE_SHA3_256; break; + case WC_SHA3_384_COUNT: hash_type = WC_HASH_TYPE_SHA3_384; break; + case WC_SHA3_512_COUNT: hash_type = WC_HASH_TYPE_SHA3_512; break; + default: return BAD_FUNC_ARG; + } + ret = wc_CryptoCb_Sha3Hash(sha3, hash_type, NULL, 0, hash); + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) + return ret; + /* fall-through when unavailable */ + } +#endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA3) if (sha3->asyncDev.marker == WOLFSSL_ASYNC_MARKER_SHA3) { #if defined(HAVE_INTEL_QA) && defined(QAT_V2) @@ -842,7 +931,7 @@ /* QAT SHA-3 only supported on v2 (8970 or later cards) */ if (len == WC_SHA3_256_DIGEST_SIZE) { ret = IntelQaSymSha3(&sha3->asyncDev, hash, NULL, len); - if (ret != NOT_COMPILED_IN) + if (ret != WC_NO_ERR_TRACE(NOT_COMPILED_IN)) return ret; /* fall-through when unavailable */ } @@ -1311,6 +1400,13 @@ return ret; } +#ifdef WC_C_DYNAMIC_FALLBACK + #undef SHA3_BLOCK + #undef SHA3_BLOCK_N + #define SHA3_BLOCK (shake->sha3_block) + #define SHA3_BLOCK_N (shake->sha3_block_n) +#endif + /* Squeeze the state to produce pseudo-random output. * * shake wc_Shake object holding state. @@ -1320,9 +1416,13 @@ */ int wc_Shake128_SqueezeBlocks(wc_Shake* shake, byte* out, word32 blockCnt) { +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#endif for (; (blockCnt > 0); blockCnt--) { #ifdef USE_INTEL_SPEEDUP - (*sha3_block)(shake->s); + (*SHA3_BLOCK)(shake->s); #else BlockSha3(shake->s); #endif @@ -1333,6 +1433,10 @@ #endif out += WC_SHA3_128_COUNT * 8; } +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + RESTORE_VECTOR_REGISTERS(); +#endif return 0; } @@ -1399,6 +1503,7 @@ * * shake wc_Shake object holding state. * hash Buffer to hold the hash result. Must be at least 64 bytes. + * hashLen Size of hash in bytes. * returns 0 on success. */ int wc_Shake256_Final(wc_Shake* shake, byte* hash, word32 hashLen) @@ -1449,9 +1554,13 @@ */ int wc_Shake256_SqueezeBlocks(wc_Shake* shake, byte* out, word32 blockCnt) { +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + SAVE_VECTOR_REGISTERS(return _svr_ret;); +#endif for (; (blockCnt > 0); blockCnt--) { #ifdef USE_INTEL_SPEEDUP - (*sha3_block)(shake->s); + (*SHA3_BLOCK)(shake->s); #else BlockSha3(shake->s); #endif @@ -1462,6 +1571,10 @@ #endif out += WC_SHA3_256_COUNT * 8; } +#if defined(WOLFSSL_LINUXKM) && defined(USE_INTEL_SPEEDUP) + if (SHA3_BLOCK == sha3_block_avx2) + RESTORE_VECTOR_REGISTERS(); +#endif return 0; } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha3_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha3_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha3_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha3_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ -/* sha3_asm - * +/* sha3_asm.S */ +/* * Copyright (C) 2006-2023 wolfSSL Inc. * * This file is part of wolfSSL. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha512.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha512.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha512.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha512.c 2024-08-03 07:30:00.000000000 +0000 @@ -26,21 +26,23 @@ #include -#if (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) && !defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_PSOC6_CRYPTO) +#if (defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384)) && \ + (!defined(WOLFSSL_ARMASM) && !defined(WOLFSSL_ARMASM_NO_NEON)) && \ + !defined(WOLFSSL_PSOC6_CRYPTO) /* determine if we are using Espressif SHA hardware acceleration */ -#undef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) - /* define a single keyword for simplicity & readability +#undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW +#if defined(WOLFSSL_ESP32_CRYPT) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) + #include "sdkconfig.h" + /* Define a single keyword for simplicity & readability. * - * by default the HW acceleration is on for ESP32-WROOM32 - * but individual components can be turned off. + * By default the HW acceleration is on for ESP32 Chipsets, + * but individual components can be turned off. See user_settings.h */ - #define WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW - static const char* TAG = "wc_sha_512"; + #define TAG "wc_sha_512" + #define WOLFSSL_USE_ESP32_CRYPT_HASH_HW #else - #undef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW + #undef WOLFSSL_USE_ESP32_CRYPT_HASH_HW #endif #if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) @@ -48,8 +50,8 @@ #define FIPS_NO_WRAPPERS #ifdef USE_WINDOWS_API - #pragma code_seg(".fipsA$k") - #pragma const_seg(".fipsB$k") + #pragma code_seg(".fipsA$m") + #pragma const_seg(".fipsB$m") #endif #endif @@ -71,92 +73,6 @@ #define USE_SLOW_SHA512 #endif -/* fips wrapper calls, user can call direct */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - - #ifdef WOLFSSL_SHA512 - - int wc_InitSha512(wc_Sha512* sha) - { - if (sha == NULL) { - return BAD_FUNC_ARG; - } - - return InitSha512_fips(sha); - } - int wc_InitSha512_ex(wc_Sha512* sha, void* heap, int devId) - { - (void)heap; - (void)devId; - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return InitSha512_fips(sha); - } - int wc_Sha512Update(wc_Sha512* sha, const byte* data, word32 len) - { - if (sha == NULL || (data == NULL && len > 0)) { - return BAD_FUNC_ARG; - } - - return Sha512Update_fips(sha, data, len); - } - int wc_Sha512Final(wc_Sha512* sha, byte* out) - { - if (sha == NULL || out == NULL) { - return BAD_FUNC_ARG; - } - - return Sha512Final_fips(sha, out); - } - void wc_Sha512Free(wc_Sha512* sha) - { - (void)sha; - /* Not supported in FIPS */ - } - #endif - - #if defined(WOLFSSL_SHA384) || defined(HAVE_AESGCM) - int wc_InitSha384(wc_Sha384* sha) - { - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return InitSha384_fips(sha); - } - int wc_InitSha384_ex(wc_Sha384* sha, void* heap, int devId) - { - (void)heap; - (void)devId; - if (sha == NULL) { - return BAD_FUNC_ARG; - } - return InitSha384_fips(sha); - } - int wc_Sha384Update(wc_Sha384* sha, const byte* data, word32 len) - { - if (sha == NULL || (data == NULL && len > 0)) { - return BAD_FUNC_ARG; - } - return Sha384Update_fips(sha, data, len); - } - int wc_Sha384Final(wc_Sha384* sha, byte* out) - { - if (sha == NULL || out == NULL) { - return BAD_FUNC_ARG; - } - return Sha384Final_fips(sha, out); - } - void wc_Sha384Free(wc_Sha384* sha) - { - (void)sha; - /* Not supported in FIPS */ - } - #endif /* WOLFSSL_SHA384 || HAVE_AESGCM */ - -#else /* else build without fips, or for FIPS v2 */ - #include #ifdef NO_INLINE @@ -166,12 +82,21 @@ #include #endif +#if FIPS_VERSION3_GE(6,0,0) + const unsigned int wolfCrypt_FIPS_sha512_ro_sanity[2] = + { 0x1a2b3c4d, 0x00000015 }; + int wolfCrypt_FIPS_SHA512_sanity(void) + { + return 0; + } +#endif + + #if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) #include #endif - -#if defined(USE_INTEL_SPEEDUP) +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) #if defined(__GNUC__) && ((__GNUC__ < 4) || \ (__GNUC__ == 4 && __GNUC_MINOR__ <= 8)) #undef NO_AVX2_SUPPORT @@ -220,6 +145,10 @@ #elif defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) int wc_InitSha512(wc_Sha512* sha512) { @@ -237,6 +166,17 @@ } int wc_Sha512Update(wc_Sha512* sha512, const byte* data, word32 len) { + if (sha512 == NULL) { + return BAD_FUNC_ARG; + } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + if (data == NULL) { + return BAD_FUNC_ARG; + } + return se050_hash_update(&sha512->se050Ctx, data, len); } int wc_Sha512Final(wc_Sha512* sha512, byte* hash) @@ -276,6 +216,16 @@ #ifdef WOLFSSL_SHA512 +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) +#ifdef WC_C_DYNAMIC_FALLBACK + #define SHA512_SETTRANSFORM_ARGS int *sha_method +#else + #define SHA512_SETTRANSFORM_ARGS void +#endif +static void Sha512_SetTransform(SHA512_SETTRANSFORM_ARGS); +#endif + static int InitSha512(wc_Sha512* sha512) { if (sha512 == NULL) @@ -294,7 +244,18 @@ sha512->loLen = 0; sha512->hiLen = 0; -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) +#ifdef WC_C_DYNAMIC_FALLBACK + sha512->sha_method = 0; + Sha512_SetTransform(&sha512->sha_method); +#else + Sha512_SetTransform(); +#endif +#endif + +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) /* HW needs to be carefully initialized, taking into account soft copy. ** If already in use; copy may revert to SW as needed. */ @@ -334,7 +295,18 @@ sha512->loLen = 0; sha512->hiLen = 0; -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) +#ifdef WC_C_DYNAMIC_FALLBACK + sha512->sha_method = 0; + Sha512_SetTransform(&sha512->sha_method); +#else + Sha512_SetTransform(); +#endif +#endif + +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) /* HW needs to be carefully initialized, taking into account soft copy. ** If already in use; copy may revert to SW as needed. ** @@ -376,7 +348,18 @@ sha512->loLen = 0; sha512->hiLen = 0; -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) +#ifdef WC_C_DYNAMIC_FALLBACK + sha512->sha_method = 0; + Sha512_SetTransform(&sha512->sha_method); +#else + Sha512_SetTransform(); +#endif +#endif + +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) /* HW needs to be carefully initialized, taking into account soft copy. ** If already in use; copy may revert to SW as needed. ** @@ -395,11 +378,9 @@ #endif /* WOLFSSL_SHA512 */ /* Hardware Acceleration */ -#if defined(USE_INTEL_SPEEDUP) && \ +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) -#ifdef WOLFSSL_SHA512 - /***** Intel AVX1/AVX2 Macro Control Structure @@ -494,21 +475,174 @@ } /* extern "C" */ #endif + static word32 intel_flags = 0; + +#if defined(WC_C_DYNAMIC_FALLBACK) && !defined(WC_NO_INTERNAL_FUNCTION_POINTERS) + #define WC_NO_INTERNAL_FUNCTION_POINTERS +#endif + static int _Transform_Sha512(wc_Sha512 *sha512); + +#ifdef WC_NO_INTERNAL_FUNCTION_POINTERS + + enum sha_methods { SHA512_UNSET = 0, SHA512_AVX1, SHA512_AVX2, + SHA512_AVX1_RORX, SHA512_AVX2_RORX, SHA512_C }; + +#ifndef WC_C_DYNAMIC_FALLBACK + static enum sha_methods sha_method = SHA512_UNSET; +#endif + + static void Sha512_SetTransform(SHA512_SETTRANSFORM_ARGS) + { + #ifdef WC_C_DYNAMIC_FALLBACK + #define SHA_METHOD (*sha_method) + #else + #define SHA_METHOD sha_method + #endif + if (SHA_METHOD != SHA512_UNSET) + return; + + #ifdef WC_C_DYNAMIC_FALLBACK + if (! CAN_SAVE_VECTOR_REGISTERS()) { + SHA_METHOD = SHA512_C; + return; + } + #endif + + if (intel_flags == 0) + intel_flags = cpuid_get_flags(); + + #if defined(HAVE_INTEL_AVX2) + if (IS_INTEL_AVX2(intel_flags)) { + #ifdef HAVE_INTEL_RORX + if (IS_INTEL_BMI2(intel_flags)) { + SHA_METHOD = SHA512_AVX2_RORX; + } + else + #endif + { + SHA_METHOD = SHA512_AVX2; + } + } + else + #endif + #if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { + #ifdef HAVE_INTEL_RORX + if (IS_INTEL_BMI2(intel_flags)) { + SHA_METHOD = SHA512_AVX1_RORX; + } + else + #endif + { + SHA_METHOD = SHA512_AVX1; + } + } + else + #endif + { + SHA_METHOD = SHA512_C; + } + #undef SHA_METHOD + } + + static WC_INLINE int Transform_Sha512(wc_Sha512 *sha512) { + #ifdef WC_C_DYNAMIC_FALLBACK + #define SHA_METHOD (sha512->sha_method) + #else + #define SHA_METHOD sha_method + #endif + int ret; + if (SHA_METHOD == SHA512_C) + return _Transform_Sha512(sha512); + SAVE_VECTOR_REGISTERS(return _svr_ret;); + switch (SHA_METHOD) { + case SHA512_AVX2: + ret = Transform_Sha512_AVX2(sha512); + break; + case SHA512_AVX2_RORX: + ret = Transform_Sha512_AVX2_RORX(sha512); + break; + case SHA512_AVX1: + ret = Transform_Sha512_AVX1(sha512); + break; + case SHA512_AVX1_RORX: + ret = Transform_Sha512_AVX1_RORX(sha512); + break; + case SHA512_C: + case SHA512_UNSET: + default: + ret = _Transform_Sha512(sha512); + break; + } + RESTORE_VECTOR_REGISTERS(); + return ret; + #undef SHA_METHOD + } + + static WC_INLINE int Transform_Sha512_Len(wc_Sha512 *sha512, word32 len) { + #ifdef WC_C_DYNAMIC_FALLBACK + #define SHA_METHOD (sha512->sha_method) + #else + #define SHA_METHOD sha_method + #endif + int ret; + SAVE_VECTOR_REGISTERS(return _svr_ret;); + switch (SHA_METHOD) { + case SHA512_AVX2: + ret = Transform_Sha512_AVX2_Len(sha512, len); + break; + case SHA512_AVX2_RORX: + ret = Transform_Sha512_AVX2_RORX_Len(sha512, len); + break; + case SHA512_AVX1: + ret = Transform_Sha512_AVX1_Len(sha512, len); + break; + case SHA512_AVX1_RORX: + ret = Transform_Sha512_AVX1_RORX_Len(sha512, len); + break; + case SHA512_C: + case SHA512_UNSET: + default: + ret = 0; + break; + } + RESTORE_VECTOR_REGISTERS(); + return ret; + #undef SHA_METHOD + } + +#else /* !WC_NO_INTERNAL_FUNCTION_POINTERS */ + static int (*Transform_Sha512_p)(wc_Sha512* sha512) = _Transform_Sha512; static int (*Transform_Sha512_Len_p)(wc_Sha512* sha512, word32 len) = NULL; static int transform_check = 0; - static word32 intel_flags; static int Transform_Sha512_is_vectorized = 0; static WC_INLINE int Transform_Sha512(wc_Sha512 *sha512) { int ret; + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha512_is_vectorized) + SAVE_VECTOR_REGISTERS(return _svr_ret;); + #endif ret = (*Transform_Sha512_p)(sha512); + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha512_is_vectorized) + RESTORE_VECTOR_REGISTERS(); + #endif return ret; } static WC_INLINE int Transform_Sha512_Len(wc_Sha512 *sha512, word32 len) { int ret; + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha512_is_vectorized) + SAVE_VECTOR_REGISTERS(return _svr_ret;); + #endif ret = (*Transform_Sha512_Len_p)(sha512, len); + #ifdef WOLFSSL_LINUXKM + if (Transform_Sha512_is_vectorized) + RESTORE_VECTOR_REGISTERS(); + #endif return ret; } @@ -529,37 +663,42 @@ } else #endif - if (1) { + { Transform_Sha512_p = Transform_Sha512_AVX2; Transform_Sha512_Len_p = Transform_Sha512_AVX2_Len; Transform_Sha512_is_vectorized = 1; } + } + else + #endif + #if defined(HAVE_INTEL_AVX1) + if (IS_INTEL_AVX1(intel_flags)) { #ifdef HAVE_INTEL_RORX - else { + if (IS_INTEL_BMI2(intel_flags)) { Transform_Sha512_p = Transform_Sha512_AVX1_RORX; Transform_Sha512_Len_p = Transform_Sha512_AVX1_RORX_Len; Transform_Sha512_is_vectorized = 1; } + else #endif - } - else - #endif - #if defined(HAVE_INTEL_AVX1) - if (IS_INTEL_AVX1(intel_flags)) { - Transform_Sha512_p = Transform_Sha512_AVX1; - Transform_Sha512_Len_p = Transform_Sha512_AVX1_Len; - Transform_Sha512_is_vectorized = 1; + { + Transform_Sha512_p = Transform_Sha512_AVX1; + Transform_Sha512_Len_p = Transform_Sha512_AVX1_Len; + Transform_Sha512_is_vectorized = 1; + } } else #endif { Transform_Sha512_p = _Transform_Sha512; - Transform_Sha512_is_vectorized = 1; + Transform_Sha512_Len_p = NULL; + Transform_Sha512_is_vectorized = 0; } transform_check = 1; } -#endif /* WOLFSSL_SHA512 */ + +#endif /* !WC_NO_INTERNAL_FUNCTION_POINTERS */ #else #define Transform_Sha512(sha512) _Transform_Sha512(sha512) @@ -571,7 +710,7 @@ static int InitSha512_Family(wc_Sha512* sha512, void* heap, int devId, int (*initfp)(wc_Sha512*)) { - int ret = 0; + int ret = 0; if (sha512 == NULL) { return BAD_FUNC_ARG; @@ -592,10 +731,6 @@ if (ret != 0) return ret; -#if defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - Sha512_SetTransform(); -#endif #ifdef WOLFSSL_HASH_KEEP sha512->msg = NULL; sha512->len = 0; @@ -616,7 +751,8 @@ int wc_InitSha512_ex(wc_Sha512* sha512, void* heap, int devId) { -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) if (sha512->ctx.mode != ESP32_SHA_INIT) { ESP_LOGV(TAG, "Set ctx mode from prior value: " "%d", sha512->ctx.mode); @@ -632,7 +768,8 @@ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId) { -#ifdef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) /* No SHA512/224 HW support is available, set to SW. */ sha512->ctx.mode = ESP32_SHA_SW; /* no SHA224 HW, so always SW */ #endif @@ -644,7 +781,8 @@ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId) { -#ifdef WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) /* No SHA512/256 HW support is available on ESP32, set to SW. */ sha512->ctx.mode = ESP32_SHA_SW; #endif @@ -830,31 +968,39 @@ if (sha512->buffLen == WC_SHA512_BLOCK_SIZE) { #if defined(LITTLE_ENDIAN_ORDER) - #if defined(USE_INTEL_SPEEDUP) && \ + #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha512->sha_method == SHA512_C) + #else if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) + #endif #endif { - #if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + #if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_BLOCK_SIZE); #endif } #endif - #if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + #if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) ret = Transform_Sha512(sha512); #else - if(sha512->ctx.mode == ESP32_SHA_INIT) { + if (sha512->ctx.mode == ESP32_SHA_INIT) { esp_sha_try_hw_lock(&sha512->ctx); } - ret = esp_sha512_process(sha512); - if(ret == 0 && sha512->ctx.mode == ESP32_SHA_SW){ + if (sha512->ctx.mode == ESP32_SHA_SW) { ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_BLOCK_SIZE); ret = Transform_Sha512(sha512); } + else { + ret = esp_sha512_process(sha512); + } #endif if (ret == 0) sha512->buffLen = 0; @@ -863,9 +1009,18 @@ } } -#if defined(USE_INTEL_SPEEDUP) && \ +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - if (Transform_Sha512_Len_p != NULL) { + + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha512->sha_method != SHA512_C) + #elif defined(WC_NO_INTERNAL_FUNCTION_POINTERS) + if (sha_method != SHA512_C) + #else + if (Transform_Sha512_Len_p != NULL) + #endif + + { word32 blocksLen = len & ~((word32)WC_SHA512_BLOCK_SIZE-1); if (blocksLen > 0) { @@ -878,8 +1033,9 @@ } else #endif -#if !defined(LITTLE_ENDIAN_ORDER) || (defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2))) +#if !defined(LITTLE_ENDIAN_ORDER) || (defined(WOLFSSL_X86_64_BUILD) && \ + defined(USE_INTEL_SPEEDUP) && (defined(HAVE_INTEL_AVX1) || \ + defined(HAVE_INTEL_AVX2))) { while (len >= WC_SHA512_BLOCK_SIZE) { XMEMCPY(local, data, WC_SHA512_BLOCK_SIZE); @@ -887,9 +1043,13 @@ data += WC_SHA512_BLOCK_SIZE; len -= WC_SHA512_BLOCK_SIZE; - #if defined(USE_INTEL_SPEEDUP) && \ + #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha512->sha_method == SHA512_C) + #else if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) + #endif { ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_BLOCK_SIZE); @@ -908,13 +1068,15 @@ data += WC_SHA512_BLOCK_SIZE; len -= WC_SHA512_BLOCK_SIZE; - #if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + #if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_BLOCK_SIZE); #endif - #if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + #if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) ret = Transform_Sha512(sha512); #else if(sha512->ctx.mode == ESP32_SHA_INIT) { @@ -947,7 +1109,14 @@ int wc_Sha512Update(wc_Sha512* sha512, const byte* data, word32 len) { - if (sha512 == NULL || (data == NULL && len > 0)) { + if (sha512 == NULL) { + return BAD_FUNC_ARG; + } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + if (data == NULL) { return BAD_FUNC_ARG; } @@ -957,7 +1126,7 @@ #endif { int ret = wc_CryptoCb_Sha512Hash(sha512, data, len, NULL); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -980,6 +1149,9 @@ #if defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/renesas/renesas_fspsm_sha.c */ #elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) #else @@ -1005,24 +1177,34 @@ /* pad with zeros */ if (sha512->buffLen > WC_SHA512_PAD_SIZE) { - XMEMSET(&local[sha512->buffLen], 0, WC_SHA512_BLOCK_SIZE - sha512->buffLen); + if (sha512->buffLen < WC_SHA512_BLOCK_SIZE ) { + XMEMSET(&local[sha512->buffLen], 0, + WC_SHA512_BLOCK_SIZE - sha512->buffLen); + } + sha512->buffLen += WC_SHA512_BLOCK_SIZE - sha512->buffLen; #if defined(LITTLE_ENDIAN_ORDER) - #if defined(USE_INTEL_SPEEDUP) && \ + #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha512->sha_method == SHA512_C) + #else if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) + #endif #endif { - #if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + #if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) ByteReverseWords64(sha512->buffer,sha512->buffer, WC_SHA512_BLOCK_SIZE); #endif } #endif /* LITTLE_ENDIAN_ORDER */ - #if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) + #if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) if (sha512->ctx.mode == ESP32_SHA_INIT) { esp_sha_try_hw_lock(&sha512->ctx); } @@ -1052,33 +1234,44 @@ /* store lengths */ #if defined(LITTLE_ENDIAN_ORDER) - #if defined(USE_INTEL_SPEEDUP) && \ + #if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha512->sha_method == SHA512_C) + #else if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) + #endif #endif - #if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + #if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) ByteReverseWords64(sha512->buffer, sha512->buffer, WC_SHA512_PAD_SIZE); #endif #endif /* ! length ordering dependent on digest endian type ! */ -#if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +#if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2] = sha512->hiLen; sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 1] = sha512->loLen; #endif -#if defined(USE_INTEL_SPEEDUP) && \ +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha512->sha_method != SHA512_C) + #else if (IS_INTEL_AVX1(intel_flags) || IS_INTEL_AVX2(intel_flags)) + #endif ByteReverseWords64(&(sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2]), &(sha512->buffer[WC_SHA512_BLOCK_SIZE / sizeof(word64) - 2]), WC_SHA512_BLOCK_SIZE - WC_SHA512_PAD_SIZE); #endif -#if !defined(WOLFSSL_ESP32WROOM32_CRYPT) || \ - defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +#if !defined(WOLFSSL_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) ret = Transform_Sha512(sha512); #else if(sha512->ctx.mode == ESP32_SHA_INIT) { @@ -1105,6 +1298,7 @@ ByteReverseWords64(sha512->digest, sha512->digest, WC_SHA512_DIGEST_SIZE); #endif + return 0; } @@ -1116,6 +1310,10 @@ /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ #elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #else static int Sha512FinalRaw(wc_Sha512* sha512, byte* hash, size_t digestSz) @@ -1160,7 +1358,7 @@ { byte localHash[WC_SHA512_DIGEST_SIZE]; ret = wc_CryptoCb_Sha512Hash(sha512, NULL, 0, localHash); - if (ret != CRYPTOCB_UNAVAILABLE) { + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) { XMEMCPY(hash, localHash, digestSz); return ret; } @@ -1208,8 +1406,15 @@ if (sha512 == NULL) return; +#if defined(WOLFSSL_ESP32) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) + esp_sha_release_unfinished_lock(&sha512->ctx); +#endif + #ifdef WOLFSSL_SMALL_STACK_CACHE if (sha512->W != NULL) { + ForceZero(sha512->W, sizeof(word64) * 16); XFREE(sha512->W, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER); sha512->W = NULL; } @@ -1221,6 +1426,7 @@ #if defined(WOLFSSL_HASH_KEEP) if (sha512->msg != NULL) { + ForceZero(sha512->msg, sha512->len); XFREE(sha512->msg, sha512->heap, DYNAMIC_TYPE_TMP_BUFFER); sha512->msg = NULL; } @@ -1229,6 +1435,8 @@ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512) wolfAsync_DevCtxFree(&sha512->asyncDev, WOLFSSL_ASYNC_MARKER_SHA512); #endif /* WOLFSSL_ASYNC_CRYPT */ + + ForceZero(sha512, sizeof(*sha512)); } #if (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) \ && !defined(WOLFSSL_KCAPI_HASH) @@ -1258,15 +1466,14 @@ return MEMORY_E; #endif -#if defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - Sha512_SetTransform(); -#endif - #if defined(LITTLE_ENDIAN_ORDER) -#if defined(USE_INTEL_SPEEDUP) && \ +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) + #ifdef WC_C_DYNAMIC_FALLBACK + if (sha->sha_method == SHA512_C) + #else if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags)) + #endif #endif { ByteReverseWords64((word64*)data, (word64*)data, @@ -1281,6 +1488,7 @@ XMEMCPY(sha->buffer, buffer, WC_SHA512_BLOCK_SIZE); #ifdef WOLFSSL_SMALL_STACK + ForceZero(buffer, WC_SHA512_BLOCK_SIZE); XFREE(buffer, sha->heap, DYNAMIC_TYPE_TMP_BUFFER); #endif return ret; @@ -1309,6 +1517,17 @@ } int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len) { + if (sha384 == NULL) { + return BAD_FUNC_ARG; + } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + if (data == NULL) { + return BAD_FUNC_ARG; + } + return se050_hash_update(&sha384->se050Ctx, data, len); } @@ -1333,6 +1552,10 @@ #elif defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #else static int InitSha384(wc_Sha384* sha384) @@ -1354,7 +1577,18 @@ sha384->loLen = 0; sha384->hiLen = 0; -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) && \ + (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) +#ifdef WC_C_DYNAMIC_FALLBACK + sha384->sha_method = 0; + Sha512_SetTransform(&sha384->sha_method); +#else + Sha512_SetTransform(); +#endif +#endif + +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) /* HW needs to be carefully initialized, taking into account soft copy. ** If already in use; copy may revert to SW as needed. */ esp_sha_init(&(sha384->ctx), WC_HASH_TYPE_SHA384); @@ -1364,6 +1598,10 @@ sha384->flags = 0; #endif +#ifdef HAVE_ARIA + sha384->hSession = NULL; +#endif + #ifdef WOLFSSL_HASH_KEEP sha384->msg = NULL; sha384->len = 0; @@ -1375,7 +1613,15 @@ int wc_Sha384Update(wc_Sha384* sha384, const byte* data, word32 len) { - if (sha384 == NULL || (data == NULL && len > 0)) { + + if (sha384 == NULL) { + return BAD_FUNC_ARG; + } + if (data == NULL && len == 0) { + /* valid, but do nothing */ + return 0; + } + if (data == NULL) { return BAD_FUNC_ARG; } @@ -1385,7 +1631,7 @@ #endif { int ret = wc_CryptoCb_Sha384Hash(sha384, data, len, NULL); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1437,7 +1683,7 @@ #endif { ret = wc_CryptoCb_Sha384Hash(sha384, NULL, 0, hash); - if (ret != CRYPTOCB_UNAVAILABLE) + if (ret != WC_NO_ERR_TRACE(CRYPTOCB_UNAVAILABLE)) return ret; /* fall-through when unavailable */ } @@ -1476,7 +1722,8 @@ sha384->devId = devId; sha384->devCtx = NULL; #endif -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) if (sha384->ctx.mode != ESP32_SHA_INIT) { ESP_LOGV(TAG, "Set ctx mode from prior value: " "%d", sha384->ctx.mode); @@ -1490,11 +1737,6 @@ return ret; } -#if defined(USE_INTEL_SPEEDUP) && \ - (defined(HAVE_INTEL_AVX1) || defined(HAVE_INTEL_AVX2)) - Sha512_SetTransform(); -#endif - #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384) ret = wolfAsync_DevCtxInit(&sha384->asyncDev, WOLFSSL_ASYNC_MARKER_SHA384, sha384->heap, devId); @@ -1524,8 +1766,14 @@ if (sha384 == NULL) return; +#if defined(WOLFSSL_ESP32) && !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) + esp_sha_release_unfinished_lock(&sha384->ctx); +#endif + #ifdef WOLFSSL_SMALL_STACK_CACHE if (sha384->W != NULL) { + ForceZero(sha384->W, sizeof(word64) * 16); XFREE(sha384->W, sha384->heap, DYNAMIC_TYPE_TMP_BUFFER); sha384->W = NULL; } @@ -1537,6 +1785,7 @@ #if defined(WOLFSSL_HASH_KEEP) if (sha384->msg != NULL) { + ForceZero(sha384->msg, sha384->len); XFREE(sha384->msg, sha384->heap, DYNAMIC_TYPE_TMP_BUFFER); sha384->msg = NULL; } @@ -1549,17 +1798,28 @@ #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384) wolfAsync_DevCtxFree(&sha384->asyncDev, WOLFSSL_ASYNC_MARKER_SHA384); #endif /* WOLFSSL_ASYNC_CRYPT */ + +#ifdef HAVE_ARIA + if (sha384->hSession != NULL) { + MC_CloseSession(sha384->hSession); + sha384->hSession = NULL; + } +#endif + + ForceZero(sha384, sizeof(*sha384)); } #endif /* WOLFSSL_SHA384 */ -#endif /* HAVE_FIPS */ - #ifdef WOLFSSL_SHA512 #if defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #else static int Sha512_Family_GetHash(wc_Sha512* sha512, byte* hash, @@ -1616,20 +1876,39 @@ dst->W = NULL; #endif -#ifdef WOLFSSL_SILABS_SHA512 - dst->silabsCtx.hash_ctx.cmd_ctx = &(dst->silabsCtx.cmd_ctx); - dst->silabsCtx.hash_ctx.hash_type_ctx = &(dst->silabsCtx.hash_type_ctx); +#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) && \ + defined(WOLFSSL_SILABS_SHA512) + dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx; + dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx; #endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA512) ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev); #endif -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) + #if defined(CONFIG_IDF_TARGET_ESP32) if (ret == 0) { ret = esp_sha512_ctx_copy(src, dst); } -#endif + #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + ESP_LOGV(TAG, "No SHA-512 HW on the ESP32-C3"); + + #elif defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + if (ret == 0) { + ret = esp_sha512_ctx_copy(src, dst); + } + #else + ESP_LOGW(TAG, "No SHA384 HW or not yet implemented for %s", + CONFIG_IDF_TARGET); + #endif + +#endif /* WOLFSSL_USE_ESP32_CRYPT_HASH_HW */ #ifdef WOLFSSL_HASH_FLAGS dst->flags |= WC_HASH_FLAG_ISCOPY; @@ -1682,6 +1961,10 @@ #if defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) #else @@ -1706,6 +1989,9 @@ /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ #elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ #else int wc_Sha512_224GetHash(wc_Sha512* sha512, byte* hash) @@ -1754,6 +2040,10 @@ } #if defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ + #elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) #else @@ -1776,6 +2066,9 @@ #if defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/Renesas/renesas_fspsm_sha.c */ #else int wc_Sha512_256GetHash(wc_Sha512* sha512, byte* hash) @@ -1815,7 +2108,9 @@ #if defined(WOLFSSL_KCAPI_HASH) /* functions defined in wolfcrypt/src/port/kcapi/kcapi_hash.c */ - +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + /* functions defined in wolfcrypt/src/port/renesas/renesas_fspsm_sha.c */ #else int wc_Sha384GetHash(wc_Sha384* sha384, byte* hash) @@ -1867,17 +2162,39 @@ dst->W = NULL; #endif -#ifdef WOLFSSL_SILABS_SHA384 - dst->silabsCtx.hash_ctx.cmd_ctx = &(dst->silabsCtx.cmd_ctx); - dst->silabsCtx.hash_ctx.hash_type_ctx = &(dst->silabsCtx.hash_type_ctx); +#if defined(WOLFSSL_SILABS_SE_ACCEL) && defined(WOLFSSL_SILABS_SE_ACCEL_3) && \ + defined(WOLFSSL_SILABS_SHA384) + dst->silabsCtx.hash_ctx.cmd_ctx = &dst->silabsCtx.cmd_ctx; + dst->silabsCtx.hash_ctx.hash_type_ctx = &dst->silabsCtx.hash_type_ctx; #endif #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_SHA384) ret = wolfAsync_DevCopy(&src->asyncDev, &dst->asyncDev); #endif -#if defined(WOLFSSL_USE_ESP32WROOM32_CRYPT_HASH_HW) - esp_sha384_ctx_copy(src, dst); +#if defined(WOLFSSL_USE_ESP32_CRYPT_HASH_HW) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) + #if defined(CONFIG_IDF_TARGET_ESP32) + esp_sha384_ctx_copy(src, dst); + #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + ESP_LOGV(TAG, "No SHA-384 HW on the ESP32-C3"); + #elif defined(CONFIG_IDF_TARGET_ESP32S2) || \ + defined(CONFIG_IDF_TARGET_ESP32S3) + esp_sha384_ctx_copy(src, dst); + #else + ESP_LOGW(TAG, "No SHA384 HW or not yet implemented for %s", + CONFIG_IDF_TARGET); + #endif +#endif + +#ifdef HAVE_ARIA + dst->hSession = NULL; + if((src->hSession != NULL) && (MC_CopySession(src->hSession, &(dst->hSession)) != MC_OK)) { + return MEMORY_E; + } #endif #ifdef WOLFSSL_HASH_FLAGS diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha512_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha512_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sha512_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sha512_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ -/* sha512_asm - * +/* sha512_asm.S */ +/* * Copyright (C) 2006-2023 wolfSSL Inc. * * This file is part of wolfSSL. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/signature.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/signature.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/signature.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/signature.c 2024-08-03 07:30:00.000000000 +0000 @@ -169,7 +169,7 @@ if (ret >= 0) ret = wc_ecc_verify_hash(sig, sig_len, hash_data, hash_len, &is_valid_sig, (ecc_key*)key); - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); if (ret != 0 || is_valid_sig != 1) { ret = SIG_VERIFY_E; } @@ -226,7 +226,7 @@ #endif if (ret >= 0) ret = wc_RsaSSL_VerifyInline(plain_data, sig_len, &plain_ptr, (RsaKey*)key); - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); if (ret >= 0 && plain_ptr) { if ((word32)ret == hash_len && XMEMCMP(plain_ptr, hash_data, hash_len) == 0) { @@ -395,7 +395,7 @@ if (ret >= 0) ret = wc_ecc_sign_hash(hash_data, hash_len, sig, sig_len, rng, (ecc_key*)key); - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #else ret = SIG_TYPE_E; #endif @@ -426,7 +426,7 @@ if (ret >= 0) ret = wc_RsaSSL_Sign(hash_data, hash_len, sig, *sig_len, (RsaKey*)key, rng); - } while (ret == WC_PENDING_E); + } while (ret == WC_NO_ERR_TRACE(WC_PENDING_E)); #endif /* WOLFSSL_CRYPTOCELL */ if (ret >= 0) { *sig_len = (word32)ret; @@ -525,17 +525,12 @@ #endif } if (ret == 0) { - /* Generate signature using hash */ - ret = wc_SignatureGenerateHash(hash_type, sig_type, - hash_data, hash_enc_len, sig, sig_len, key, key_len, rng); + /* Generate signature using hash (also handles verify) */ + ret = wc_SignatureGenerateHash_ex(hash_type, sig_type, hash_data, + hash_enc_len, sig, sig_len, key, key_len, rng, verify); } } - if (ret == 0 && verify) { - ret = wc_SignatureVerifyHash(hash_type, sig_type, hash_data, - hash_enc_len, sig, *sig_len, key, key_len); - } - #if defined(WOLFSSL_SMALL_STACK) || defined(NO_ASN) XFREE(hash_data, NULL, DYNAMIC_TYPE_TMP_BUFFER); #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/siphash.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/siphash.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/siphash.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/siphash.c 2024-08-03 07:30:00.000000000 +0000 @@ -315,7 +315,7 @@ * * @param [in, out] sipHash SipHash object. * @param [out] out Buffer to place MAC into. - * @param [in] outSz Size of ouput MAC. 8 or 16 only. + * @param [in] outSz Size of output MAC. 8 or 16 only. * @return BAD_FUNC_ARG when sipHash or out is NULL. * @return BAD_FUNC_ARG when outSz is not the same as initialized value. * @return 0 on success. @@ -393,7 +393,7 @@ * @param [in] in Input message. * @param [in] inSz Size of input message. * @param [out] out Buffer to place MAC into. - * @param [in] outSz Size of ouput MAC. 8 or 16 only. + * @param [in] outSz Size of output MAC. 8 or 16 only. * @return BAD_FUNC_ARG when key or out is NULL. * @return BAD_FUNC_ARG when in is NULL and inSz is not zero. * @return BAD_FUNC_ARG when outSz is neither 8 nor 16. @@ -468,7 +468,7 @@ : [in] "+r" (in), [inSz] "+r" (inSz), [k0] "+r" (k0), [k1] "+r" (k1), [v0] "+r" (v0), [v1] "+r" (v1), [v2] "+r" (v2), [v3] "+r" (v3) - : [key] "r" (key), [out] "r" (out) , [outSz] "r" (outSz) + : [out] "r" (out) , [outSz] "r" (outSz) : "memory" ); @@ -515,16 +515,16 @@ #endif "xorq %[k1], %[v0]\n\t" - "cmp $8, %[outSz]\n\t" - "je L_siphash_8_end\n\t" - : [in] "+r" (in), [inSz] "+r" (inSz), [k0] "+r" (k0), [k1] "+r" (k1), [v0] "+r" (v0), [v1] "+r" (v1), [v2] "+r" (v2), [v3] "+r" (v3) - : [key] "r" (key), [out] "r" (out) , [outSz] "r" (outSz) + : [out] "r" (out) , [outSz] "r" (outSz) : "memory" ); __asm__ __volatile__ ( + "cmp $8, %[outSz]\n\t" + "je L_siphash_8_end\n\t" + "xor $0xee, %b[v2]\n\t" #if WOLFSSL_SIPHASH_DROUNDS == 2 SIPHASH_ROUND(%[v0], %[v1], %[v2], %[v3]) @@ -575,7 +575,7 @@ : [in] "+r" (in), [inSz] "+r" (inSz), [k0] "+r" (k0), [k1] "+r" (k1), [v0] "+r" (v0), [v1] "+r" (v1), [v2] "+r" (v2), [v3] "+r" (v3) - : [key] "r" (key), [out] "r" (out) , [outSz] "r" (outSz) + : [out] "r" (out) , [outSz] "r" (outSz) : "memory" ); @@ -622,7 +622,7 @@ * @param [in] in Input message. * @param [in] inSz Size of input message. * @param [out] out Buffer to place MAC into. - * @param [in] outSz Size of ouput MAC. 8 or 16 only. + * @param [in] outSz Size of output MAC. 8 or 16 only. * @return BAD_FUNC_ARG when key or out is NULL. * @return BAD_FUNC_ARG when in is NULL and inSz is not zero. * @return BAD_FUNC_ARG when outSz is not 8 nor 16. @@ -851,7 +851,7 @@ * @param [in] in Input message. * @param [in] inSz Size of input message. * @param [out] out Buffer to place MAC into. - * @param [in] outSz Size of ouput MAC. 8 or 16 only. + * @param [in] outSz Size of output MAC. 8 or 16 only. * @return BAD_FUNC_ARG when key or out is NULL. * @return BAD_FUNC_ARG when in is NULL and inSz is not zero. * @return BAD_FUNC_ARG when outSz is not 8 nor 16. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm2.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm2.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm2.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm2.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sm2.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm3.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm3.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm3.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm3.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sm3.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM3 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm3_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm3_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm3_asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm3_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sm3_asm.S + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM3 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm4.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm4.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sm4.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sm4.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sm4.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM4 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm32.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm32.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm32.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm32.c 2024-08-03 07:30:00.000000000 +0000 @@ -52,6 +52,16 @@ #include +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif + #ifdef WOLFSSL_SP_ARM32_ASM #define SP_PRINT_NUM(var, name, total, words, bits) \ do { \ @@ -118,14 +128,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -230,6 +240,7 @@ #define sp_2048_norm_64(a) #ifndef WOLFSSL_SP_SMALL +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Multiply a and b into r. (r = a * b) * * r A single precision integer. @@ -238,17 +249,15 @@ */ static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #32\n\t" - "mov r10, #0\n\t" /* A[0] * B[0] */ "ldr r11, [%[a]]\n\t" "ldr r12, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r3, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -271,14 +280,9 @@ "adds r3, r3, r6\n\t" "adc r4, r4, r7\n\t" "mov r5, #0\n\t" -#else - "umull r3, r4, r11, r12\n\t" - "mov r5, #0\n\t" -#endif "str r3, [sp]\n\t" /* A[0] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -308,16 +312,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * B[0] */ "ldr r8, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -346,16 +342,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #4]\n\t" /* A[2] * B[0] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -385,17 +374,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * B[1] */ "ldr r11, [%[a], #4]\n\t" "ldr r12, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -424,16 +405,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[0] * B[2] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -462,16 +436,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [sp, #8]\n\t" /* A[0] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -501,16 +468,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[1] * B[2] */ "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -539,15 +498,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[2] * B[1] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -576,16 +528,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[3] * B[0] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -614,16 +559,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [sp, #12]\n\t" /* A[4] * B[0] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -653,16 +591,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[3] * B[1] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -691,16 +621,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[2] * B[2] */ "ldr r11, [%[a], #8]\n\t" "ldr r12, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -729,16 +652,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * B[3] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -767,16 +683,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[0] * B[4] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -805,16 +714,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #16]\n\t" /* A[0] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -844,17 +746,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * B[4] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -883,15 +777,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[2] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -920,15 +807,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[3] * B[2] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -957,16 +837,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[4] * B[1] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -995,16 +868,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[5] * B[0] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1033,16 +899,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [sp, #20]\n\t" /* A[6] * B[0] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1072,17 +931,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[5] * B[1] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1111,15 +962,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[4] * B[2] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1148,16 +992,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[3] * B[3] */ "ldr r11, [%[a], #12]\n\t" "ldr r12, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1186,16 +1023,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[2] * B[4] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1224,16 +1054,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[1] * B[5] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1262,16 +1085,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[0] * B[6] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1300,16 +1116,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [sp, #24]\n\t" /* A[0] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1339,17 +1148,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * B[6] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1378,16 +1179,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[2] * B[5] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1416,15 +1210,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[3] * B[4] */ "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1453,15 +1240,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[4] * B[3] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1490,16 +1270,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[5] * B[2] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1528,16 +1301,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[6] * B[1] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1566,16 +1332,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[7] * B[0] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1604,16 +1363,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #28]\n\t" /* A[7] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1643,17 +1395,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[6] * B[2] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1682,15 +1426,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[5] * B[3] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1719,16 +1456,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[4] * B[4] */ "ldr r11, [%[a], #16]\n\t" "ldr r12, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1757,16 +1487,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[3] * B[5] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1795,16 +1518,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[2] * B[6] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1833,16 +1549,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * B[7] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1871,16 +1580,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [%[r], #32]\n\t" /* A[2] * B[7] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1910,17 +1612,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[3] * B[6] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1949,15 +1643,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[4] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -1986,15 +1673,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[5] * B[4] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2023,16 +1703,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[6] * B[3] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2061,16 +1734,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[7] * B[2] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2099,16 +1765,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [%[r], #36]\n\t" /* A[7] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2138,16 +1797,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[6] * B[4] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2176,16 +1827,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[5] * B[5] */ "ldr r11, [%[a], #20]\n\t" "ldr r12, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2214,16 +1858,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[4] * B[6] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2252,16 +1889,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[3] * B[7] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2290,16 +1920,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [%[r], #40]\n\t" /* A[4] * B[7] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2329,16 +1952,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[5] * B[6] */ "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2367,15 +1982,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[6] * B[5] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2404,16 +2012,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[7] * B[4] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2442,15 +2043,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [%[r], #44]\n\t" /* A[7] * B[5] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2480,17 +2074,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[6] * B[6] */ "ldr r11, [%[a], #24]\n\t" "ldr r12, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2519,16 +2105,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[5] * B[7] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2557,15 +2136,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [%[r], #48]\n\t" /* A[6] * B[7] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2595,16 +2167,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[7] * B[6] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2633,15 +2197,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [%[r], #52]\n\t" /* A[7] * B[7] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -2666,11 +2223,6 @@ "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" "adc r3, r3, r7\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r7\n\t" -#endif "str r5, [%[r], #56]\n\t" "str r3, [%[r], #60]\n\t" "ldm sp!, {r3, r4, r5, r6}\n\t" @@ -2679,10 +2231,495 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); } +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Multiply a and b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "sub sp, sp, #36\n\t" + "str %[r], [sp, #32]\n\t" + "mov %[r], #0\n\t" + "ldr r12, [%[a]]\n\t" + /* A[0] * B[0] */ + "ldr lr, [%[b]]\n\t" + "umull r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "umull r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "umull r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "umull r9, r10, r12, lr\n\t" + "str r3, [sp]\n\t" + /* A[0] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "mov r11, %[r]\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[0] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adcs r6, r6, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[0] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adcs r8, r8, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[0] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adcs r10, r10, #0\n\t" + "adc r3, %[r], #0\n\t" + "umlal r10, r3, r12, lr\n\t" + /* A[1] * B[0] */ + "ldr r12, [%[a], #4]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "str r4, [sp, #4]\n\t" + "adds r5, r5, r11\n\t" + /* A[1] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[1] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r4, %[r], #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "ldr r12, [%[a], #8]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "str r5, [sp, #8]\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[2] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[2] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r5, %[r], #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "ldr r12, [%[a], #12]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[3] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[3] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[3] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r6, %[r], #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "ldr r12, [%[a], #16]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[4] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[4] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[4] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[4] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[4] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r7, %[r], #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "ldr r12, [%[a], #20]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[5] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[5] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[5] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[5] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[5] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r8, %[r], #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "ldr r12, [%[a], #24]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[6] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[6] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[6] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[6] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[6] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[6] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r9, %[r], #0\n\t" + "umlal r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "ldr r12, [%[a], #28]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[7] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[7] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[7] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[7] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[7] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[7] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r10, %[r], #0\n\t" + "umlal r9, r10, r12, lr\n\t" + "ldr %[r], [sp, #32]\n\t" + "add %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "sub %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add sp, sp, #36\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +/* Multiply a and b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "sub sp, sp, #44\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str %[r], [sp, #36]\n\t" + "str %[a], [sp, #40]\n\t" +#else + "strd %[r], %[a], [sp, #36]\n\t" +#endif + "mov lr, %[b]\n\t" + "ldm %[a], {%[r], %[a], %[b], r3}\n\t" + "ldm lr!, {r4, r5, r6}\n\t" + "umull r10, r11, %[r], r4\n\t" + "umull r12, r7, %[a], r4\n\t" + "umaal r11, r12, %[r], r5\n\t" + "umull r8, r9, %[b], r4\n\t" + "umaal r12, r8, %[a], r5\n\t" + "umaal r12, r7, %[r], r6\n\t" + "umaal r8, r9, r3, r4\n\t" + "stm sp, {r10, r11, r12}\n\t" + "umaal r7, r8, %[b], r5\n\t" + "ldm lr!, {r4}\n\t" + "umull r10, r11, %[a], r6\n\t" + "umaal r8, r9, %[b], r6\n\t" + "umaal r7, r10, %[r], r4\n\t" + "umaal r8, r11, r3, r5\n\t" + "str r7, [sp, #12]\n\t" + "umaal r8, r10, %[a], r4\n\t" + "umaal r9, r11, r3, r6\n\t" + "umaal r9, r10, %[b], r4\n\t" + "umaal r10, r11, r3, r4\n\t" + "ldm lr, {r4, r5, r6, r7}\n\t" + "mov r12, #0\n\t" + "umlal r8, r12, %[r], r4\n\t" + "umaal r9, r12, %[a], r4\n\t" + "umaal r10, r12, %[b], r4\n\t" + "umaal r11, r12, r3, r4\n\t" + "mov r4, #0\n\t" + "umlal r9, r4, %[r], r5\n\t" + "umaal r10, r4, %[a], r5\n\t" + "umaal r11, r4, %[b], r5\n\t" + "umaal r12, r4, r3, r5\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, %[r], r6\n\t" + "umaal r11, r5, %[a], r6\n\t" + "umaal r12, r5, %[b], r6\n\t" + "umaal r4, r5, r3, r6\n\t" + "mov r6, #0\n\t" + "umlal r11, r6, %[r], r7\n\t" + "ldr %[r], [sp, #40]\n\t" + "umaal r12, r6, %[a], r7\n\t" + "add %[r], %[r], #16\n\t" + "umaal r4, r6, %[b], r7\n\t" + "sub lr, lr, #16\n\t" + "umaal r5, r6, r3, r7\n\t" + "ldm %[r], {%[r], %[a], %[b], r3}\n\t" + "str r6, [sp, #32]\n\t" + "ldm lr!, {r6}\n\t" + "mov r7, #0\n\t" + "umlal r8, r7, %[r], r6\n\t" + "umaal r9, r7, %[a], r6\n\t" + "str r8, [sp, #16]\n\t" + "umaal r10, r7, %[b], r6\n\t" + "umaal r11, r7, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r8, #0\n\t" + "umlal r9, r8, %[r], r6\n\t" + "umaal r10, r8, %[a], r6\n\t" + "str r9, [sp, #20]\n\t" + "umaal r11, r8, %[b], r6\n\t" + "umaal r12, r8, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r9, #0\n\t" + "umlal r10, r9, %[r], r6\n\t" + "umaal r11, r9, %[a], r6\n\t" + "str r10, [sp, #24]\n\t" + "umaal r12, r9, %[b], r6\n\t" + "umaal r4, r9, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r10, #0\n\t" + "umlal r11, r10, %[r], r6\n\t" + "umaal r12, r10, %[a], r6\n\t" + "str r11, [sp, #28]\n\t" + "umaal r4, r10, %[b], r6\n\t" + "umaal r5, r10, r3, r6\n\t" + "ldm lr!, {r11}\n\t" + "umaal r12, r7, %[r], r11\n\t" + "umaal r4, r7, %[a], r11\n\t" + "ldr r6, [sp, #32]\n\t" + "umaal r5, r7, %[b], r11\n\t" + "umaal r6, r7, r3, r11\n\t" + "ldm lr!, {r11}\n\t" + "umaal r4, r8, %[r], r11\n\t" + "umaal r5, r8, %[a], r11\n\t" + "umaal r6, r8, %[b], r11\n\t" + "umaal r7, r8, r3, r11\n\t" + "ldm lr, {r11, lr}\n\t" + "umaal r5, r9, %[r], r11\n\t" + "umaal r6, r10, %[r], lr\n\t" + "umaal r6, r9, %[a], r11\n\t" + "umaal r7, r10, %[a], lr\n\t" + "umaal r7, r9, %[b], r11\n\t" + "umaal r8, r10, %[b], lr\n\t" + "umaal r8, r9, r3, r11\n\t" + "umaal r9, r10, r3, lr\n\t" + "mov r3, r12\n\t" + "ldr lr, [sp, #36]\n\t" + "add lr, lr, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "sub lr, lr, #32\n\t" + "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add sp, sp, #44\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc" + ); +} + +#endif /* Add b to a into r. (r = a + b) * * r A single precision integer. @@ -2691,12 +2728,11 @@ */ static sp_digit sp_2048_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -2711,10 +2747,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -2726,8 +2763,8 @@ */ static sp_digit sp_2048_sub_in_place_16(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -2761,7 +2798,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -2774,12 +2811,11 @@ */ static sp_digit sp_2048_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -2808,10 +2844,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -2888,8 +2925,8 @@ */ static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -2951,7 +2988,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -2964,12 +3001,11 @@ */ static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -3026,10 +3062,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -3110,8 +3147,8 @@ */ static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -3229,7 +3266,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -3242,12 +3279,11 @@ */ static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -3360,10 +3396,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -3437,6 +3474,7 @@ (void)sp_2048_add_32(r + 96, r + 96, a1); } +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Square a and put result in r. (r = a * a) * * r A single precision integer. @@ -3444,14 +3482,13 @@ */ static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #32\n\t" /* A[0] * A[0] */ "ldr r10, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r9, r10, #16\n\t" "lsl r2, r10, #16\n\t" "lsr r2, r2, #16\n\t" @@ -3462,15 +3499,11 @@ "lsl r2, r2, #17\n\t" "adds r8, r8, r2\n\t" "adc r3, r3, r9\n\t" -#else - "umull r8, r3, r10, r10\n\t" -#endif "mov r4, #0\n\t" "str r8, [sp]\n\t" /* A[0] * A[1] */ "ldr r10, [%[a], #4]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3511,22 +3544,10 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [sp, #4]\n\t" /* A[0] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3567,20 +3588,8 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * A[1] */ "ldr r10, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3600,17 +3609,10 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #8]\n\t" /* A[0] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3651,21 +3653,9 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3705,20 +3695,10 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" -#endif "str r2, [sp, #12]\n\t" /* A[0] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3759,21 +3739,9 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[1] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3813,18 +3781,8 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[2] * A[2] */ "ldr r10, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3844,17 +3802,10 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [sp, #16]\n\t" /* A[0] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3876,15 +3827,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r3, #0\n\t" "mov r7, #0\n\t" /* A[1] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3913,16 +3860,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[2] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3951,12 +3891,6 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" @@ -3967,7 +3901,6 @@ /* A[0] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -3989,15 +3922,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r4, #0\n\t" "mov r7, #0\n\t" /* A[1] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4026,16 +3955,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[2] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4064,15 +3986,8 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[3] * A[3] */ "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4095,15 +4010,6 @@ "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" -#endif "adds r2, r2, r5\n\t" "adcs r3, r3, r6\n\t" "adc r4, r4, r7\n\t" @@ -4111,7 +4017,6 @@ /* A[0] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4133,15 +4038,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r2, #0\n\t" "mov r7, #0\n\t" /* A[1] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4170,16 +4071,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[2] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4208,16 +4102,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[3] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4246,12 +4133,6 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" @@ -4262,7 +4143,6 @@ /* A[1] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4284,15 +4164,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r3, #0\n\t" "mov r7, #0\n\t" /* A[2] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4321,16 +4197,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[3] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4359,15 +4228,8 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[4] * A[4] */ "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4390,15 +4252,6 @@ "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" -#endif "adds r4, r4, r5\n\t" "adcs r2, r2, r6\n\t" "adc r3, r3, r7\n\t" @@ -4406,7 +4259,6 @@ /* A[2] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4428,15 +4280,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r4, #0\n\t" "mov r7, #0\n\t" /* A[3] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4465,16 +4313,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[4] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4503,12 +4344,6 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" @@ -4519,7 +4354,6 @@ /* A[3] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4560,21 +4394,9 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[4] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4614,18 +4436,8 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[5] * A[5] */ "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4645,17 +4457,10 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [%[r], #40]\n\t" /* A[4] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4696,21 +4501,9 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[5] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4750,20 +4543,10 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [%[r], #44]\n\t" /* A[5] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4804,20 +4587,8 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[6] * A[6] */ "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4837,17 +4608,10 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" -#endif "str r2, [%[r], #48]\n\t" /* A[6] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4888,21 +4652,9 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [%[r], #52]\n\t" /* A[7] * A[7] */ "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -4920,11 +4672,6 @@ "lsl r8, r8, #17\n\t" "adds r4, r4, r8\n\t" "adc r2, r2, r9\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r4, r4, r8\n\t" - "adc r2, r2, r9\n\t" -#endif "str r4, [%[r], #56]\n\t" "str r2, [%[r], #60]\n\t" "ldm sp!, {r2, r3, r4, r8}\n\t" @@ -4933,10 +4680,370 @@ "stm %[r]!, {r2, r3, r4, r8}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" + ); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Square a and put result in r. (r = a * a) + * + * r A single precision integer. + * a A single precision integer. + */ +static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str %[r], [sp, #64]\n\t" + "mov %[r], #0\n\t" + "ldr r12, [%[a]]\n\t" + /* A[0] * A[1] */ + "ldr lr, [%[a], #4]\n\t" + "umull r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "ldr lr, [%[a], #12]\n\t" + "umull r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "umull r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "umull r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "ldr lr, [%[a], #8]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[0] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[0] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + "adcs r3, r3, #0\n\t" + "str r4, [sp, #4]\n\t" + "str r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "ldr r12, [%[a], #4]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * A[3] */ + "ldr lr, [%[a], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r4, %[r], #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "ldr r12, [%[a], #8]\n\t" + "ldr lr, [%[a], #12]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r5, %[r], #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "ldr r12, [%[a], #12]\n\t" + "ldr lr, [%[a], #16]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r6, %[r], #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "ldr r12, [%[a], #16]\n\t" + "ldr lr, [%[a], #20]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r7, %[r], #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "ldr r12, [%[a], #20]\n\t" + "ldr lr, [%[a], #24]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r8, %[r], #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "ldr r12, [%[a], #24]\n\t" + "ldr lr, [%[a], #28]\n\t" + "mov r9, #0\n\t" + "umlal r8, r9, r12, lr\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "adcs r3, r3, r3\n\t" + "adcs r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adc r10, %[r], #0\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "mov lr, sp\n\t" + /* A[0] * A[0] */ + "ldr r12, [%[a]]\n\t" + "umull r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[1] * A[1] */ + "ldr r12, [%[a], #4]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * A[2] */ + "ldr r12, [%[a], #8]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * A[3] */ + "ldr r12, [%[a], #12]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, r12\n\t" + "adds r10, r10, r11\n\t" + "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "ldr r12, [%[a], #16]\n\t" + "adcs r3, r3, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * A[5] */ + "ldr r12, [%[a], #20]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * A[6] */ + "ldr r12, [%[a], #24]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * A[7] */ + "ldr r12, [%[a], #28]\n\t" + "adcs r9, r9, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r9, r10, r12, r12\n\t" + "ldr %[r], [sp, #64]\n\t" + "add %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "sub %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +/* Square a and put result in r. (r = a * a) + * + * r A single precision integer. + * a A single precision integer. + */ +static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #32\n\t" + "str %[r], [sp, #28]\n\t" + "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t" + "umull r9, r10, %[r], %[r]\n\t" + "umull r11, r12, %[r], %[a]\n\t" + "adds r11, r11, r11\n\t" + "mov lr, #0\n\t" + "umaal r10, r11, lr, lr\n\t" + "stm sp, {r9, r10}\n\t" + "mov r8, lr\n\t" + "umaal r8, r12, %[r], r2\n\t" + "adcs r8, r8, r8\n\t" + "umaal r8, r11, %[a], %[a]\n\t" + "umull r9, r10, %[r], r3\n\t" + "umaal r9, r12, %[a], r2\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #8]\n\t" + "str r9, [sp, #12]\n\t" +#else + "strd r8, r9, [sp, #8]\n\t" +#endif + "mov r9, lr\n\t" + "umaal r9, r10, %[r], r4\n\t" + "umaal r9, r12, %[a], r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r2, r2\n\t" + "str r9, [sp, #16]\n\t" + "umull r9, r8, %[r], r5\n\t" + "umaal r9, r12, %[a], r4\n\t" + "umaal r9, r10, r2, r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" + "str r9, [sp, #20]\n\t" + "mov r9, lr\n\t" + "umaal r9, r8, %[r], r6\n\t" + "umaal r9, r12, %[a], r5\n\t" + "umaal r9, r10, r2, r4\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r3, r3\n\t" + "str r9, [sp, #24]\n\t" + "umull %[r], r9, %[r], r7\n\t" + "umaal %[r], r8, %[a], r6\n\t" + "umaal %[r], r12, r2, r5\n\t" + "umaal %[r], r10, r3, r4\n\t" + "adcs %[r], %[r], %[r]\n\t" + "umaal %[r], r11, lr, lr\n\t" + /* R[7] = r0 */ + "umaal r9, r8, %[a], r7\n\t" + "umaal r9, r10, r2, r6\n\t" + "umaal r12, r9, r3, r5\n\t" + "adcs r12, r12, r12\n\t" + "umaal r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "umaal r9, r8, r2, r7\n\t" + "umaal r10, r9, r3, r6\n\t" + "mov r2, lr\n\t" + "umaal r10, r2, r4, r5\n\t" + "adcs r10, r10, r10\n\t" + "umaal r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "umaal r2, r8, r3, r7\n\t" + "umaal r2, r9, r4, r6\n\t" + "adcs r3, r2, r2\n\t" + "umaal r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "mov %[a], lr\n\t" + "umaal %[a], r8, r4, r7\n\t" + "umaal %[a], r9, r5, r6\n\t" + "adcs r4, %[a], %[a]\n\t" + "umaal r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "umaal r8, r9, r5, r7\n\t" + "adcs r8, r8, r8\n\t" + "umaal r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "mov r5, lr\n\t" + "umaal r5, r9, r6, r7\n\t" + "adcs r5, r5, r5\n\t" + "umaal r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "adcs r9, r9, r9\n\t" + "umaal r9, r5, r7, r7\n\t" + "adcs r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + "ldr lr, [sp, #28]\n\t" + "add lr, lr, #28\n\t" + "stm lr!, {%[r], r12}\n\t" + "stm lr!, {r11}\n\t" + "stm lr!, {r10}\n\t" + "stm lr!, {r3, r4, r8, r9}\n\t" + "stm lr!, {r7}\n\t" + "sub lr, lr, #0x40\n\t" + "ldm sp, {%[r], %[a], r2, r3, r4, r5, r6}\n\t" + "stm lr, {%[r], %[a], r2, r3, r4, r5, r6}\n\t" + "add sp, sp, #32\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } +#endif /* Sub b from a into r. (r = a - b) * * r A single precision integer. @@ -4945,9 +5052,9 @@ */ static sp_digit sp_2048_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -4967,7 +5074,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -5016,9 +5123,9 @@ */ static sp_digit sp_2048_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -5052,7 +5159,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -5101,9 +5208,9 @@ */ static sp_digit sp_2048_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -5165,7 +5272,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -5216,9 +5323,9 @@ */ static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -5240,7 +5347,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -5254,16 +5361,15 @@ */ static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #0x100\n\t" "\n" "L_sp_2048_sub_in_pkace_64_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -5271,13 +5377,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_2048_sub_in_pkace_64_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -5292,16 +5398,19 @@ */ static void sp_2048_mul_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x200\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_2048_mul_64_outer_%=: \n\t" "subs r3, r5, #0xfc\n\t" @@ -5312,7 +5421,44 @@ "L_sp_2048_mul_64_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -5349,10 +5495,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #0x100\n\t" - "beq L_sp_2048_mul_64_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_2048_mul_64_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_2048_mul_64_inner_done_%=\n\t" + "blt L_sp_2048_mul_64_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_2048_mul_64_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -5360,18 +5542,50 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x1f8\n\t" + "cmp r5, #0x1f4\n\t" "ble L_sp_2048_mul_64_outer_%=\n\t" + "ldr lr, [%[a], #252]\n\t" + "ldr r11, [%[b], #252]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_2048_mul_64_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_2048_mul_64_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -5382,29 +5596,28 @@ */ static void sp_2048_sqr_64(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x200\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_2048_sqr_64_outer_%=: \n\t" "subs r3, r5, #0xfc\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_2048_sqr_64_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_2048_sqr_64_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -5453,11 +5666,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_2048_sqr_64_op_done_%=\n\t" - "\n" - "L_sp_2048_sqr_64_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_2048_sqr_64_inner_done_%=\n\t" + "blt L_sp_2048_sqr_64_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -5484,34 +5699,50 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_2048_sqr_64_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #0x100\n\t" - "beq L_sp_2048_sqr_64_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_2048_sqr_64_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_2048_sqr_64_inner_%=\n\t" - "\n" "L_sp_2048_sqr_64_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x1f8\n\t" + "cmp r5, #0x1f4\n\t" "ble L_sp_2048_sqr_64_outer_%=\n\t" + "ldr lr, [%[a], #252]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_2048_sqr_64_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_2048_sqr_64_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -5543,9 +5774,9 @@ */ static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -5567,7 +5798,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -5581,16 +5812,15 @@ */ static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #0x80\n\t" "\n" "L_sp_2048_sub_in_pkace_32_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -5598,13 +5828,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_2048_sub_in_pkace_32_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -5619,16 +5849,19 @@ */ static void sp_2048_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x100\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_2048_mul_32_outer_%=: \n\t" "subs r3, r5, #0x7c\n\t" @@ -5639,7 +5872,44 @@ "L_sp_2048_mul_32_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -5676,10 +5946,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #0x80\n\t" - "beq L_sp_2048_mul_32_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_2048_mul_32_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_2048_mul_32_inner_done_%=\n\t" + "blt L_sp_2048_mul_32_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_2048_mul_32_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -5687,18 +5993,50 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0xf8\n\t" + "cmp r5, #0xf4\n\t" "ble L_sp_2048_mul_32_outer_%=\n\t" + "ldr lr, [%[a], #124]\n\t" + "ldr r11, [%[b], #124]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_2048_mul_32_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_2048_mul_32_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -5709,29 +6047,28 @@ */ static void sp_2048_sqr_32(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x100\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_2048_sqr_32_outer_%=: \n\t" "subs r3, r5, #0x7c\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_2048_sqr_32_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_2048_sqr_32_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -5780,11 +6117,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_2048_sqr_32_op_done_%=\n\t" - "\n" - "L_sp_2048_sqr_32_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_2048_sqr_32_inner_done_%=\n\t" + "blt L_sp_2048_sqr_32_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -5811,41 +6150,57 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_2048_sqr_32_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #0x80\n\t" - "beq L_sp_2048_sqr_32_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_2048_sqr_32_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_2048_sqr_32_inner_%=\n\t" - "\n" "L_sp_2048_sqr_32_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0xf8\n\t" + "cmp r5, #0xf4\n\t" "ble L_sp_2048_sqr_32_outer_%=\n\t" + "ldr lr, [%[a], #124]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_2048_sqr_32_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_2048_sqr_32_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -5874,15 +6229,14 @@ */ static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -5915,7 +6269,7 @@ "L_sp_2048_mul_d_64_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -5960,7 +6314,7 @@ "str r3, [%[r], #256]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -5973,15 +6327,14 @@ */ static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -6006,2491 +6359,1995 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[12] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[13] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[14] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[15] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[16] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[17] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[18] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[19] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[20] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[21] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[22] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[23] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[24] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[25] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[26] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[27] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[28] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[29] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[30] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[31] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[32] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[33] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[34] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[35] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[36] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[37] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[38] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[39] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[40] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[41] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[42] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[43] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[44] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[45] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[46] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[47] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[48] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[49] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[50] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[51] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[52] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[53] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[54] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[55] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[56] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[57] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[58] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[59] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[60] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[61] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[62] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[63] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -8516,15 +8373,13 @@ "adds r3, r3, r6\n\t" "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" "str r4, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -8555,10 +8410,10 @@ */ static sp_digit sp_2048_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -8579,7 +8434,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -8595,10 +8450,10 @@ */ static sp_digit sp_2048_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -8717,12 +8572,13 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 2048 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -8731,12 +8587,12 @@ */ static SP_NOINLINE void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -8749,10 +8605,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -8776,14 +8631,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -8807,18 +8656,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -8842,17 +8685,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -8876,18 +8713,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -8911,18 +8742,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -8946,18 +8771,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -8981,18 +8800,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9016,18 +8829,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9051,18 +8858,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9086,18 +8887,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9121,18 +8916,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ "ldr r7, [%[m], #44]\n\t" "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9156,18 +8945,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "adc r4, r4, #0\n\t" /* a[i+12] += m[12] * mu */ "ldr r7, [%[m], #48]\n\t" "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9191,18 +8974,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #48]\n\t" "adc r5, r5, #0\n\t" /* a[i+13] += m[13] * mu */ "ldr r7, [%[m], #52]\n\t" "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9226,18 +9003,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #52]\n\t" "adc r4, r4, #0\n\t" /* a[i+14] += m[14] * mu */ "ldr r7, [%[m], #56]\n\t" "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9261,18 +9032,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #56]\n\t" "adc r5, r5, #0\n\t" /* a[i+15] += m[15] * mu */ "ldr r7, [%[m], #60]\n\t" "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9296,18 +9061,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #60]\n\t" "adc r4, r4, #0\n\t" /* a[i+16] += m[16] * mu */ "ldr r7, [%[m], #64]\n\t" "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9331,18 +9090,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #64]\n\t" "adc r5, r5, #0\n\t" /* a[i+17] += m[17] * mu */ "ldr r7, [%[m], #68]\n\t" "ldr r10, [%[a], #68]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9366,18 +9119,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #68]\n\t" "adc r4, r4, #0\n\t" /* a[i+18] += m[18] * mu */ "ldr r7, [%[m], #72]\n\t" "ldr r10, [%[a], #72]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9401,18 +9148,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #72]\n\t" "adc r5, r5, #0\n\t" /* a[i+19] += m[19] * mu */ "ldr r7, [%[m], #76]\n\t" "ldr r10, [%[a], #76]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9436,18 +9177,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #76]\n\t" "adc r4, r4, #0\n\t" /* a[i+20] += m[20] * mu */ "ldr r7, [%[m], #80]\n\t" "ldr r10, [%[a], #80]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9471,18 +9206,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #80]\n\t" "adc r5, r5, #0\n\t" /* a[i+21] += m[21] * mu */ "ldr r7, [%[m], #84]\n\t" "ldr r10, [%[a], #84]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9506,18 +9235,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #84]\n\t" "adc r4, r4, #0\n\t" /* a[i+22] += m[22] * mu */ "ldr r7, [%[m], #88]\n\t" "ldr r10, [%[a], #88]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9541,18 +9264,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #88]\n\t" "adc r5, r5, #0\n\t" /* a[i+23] += m[23] * mu */ "ldr r7, [%[m], #92]\n\t" "ldr r10, [%[a], #92]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9576,18 +9293,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #92]\n\t" "adc r4, r4, #0\n\t" /* a[i+24] += m[24] * mu */ "ldr r7, [%[m], #96]\n\t" "ldr r10, [%[a], #96]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9611,18 +9322,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #96]\n\t" "adc r5, r5, #0\n\t" /* a[i+25] += m[25] * mu */ "ldr r7, [%[m], #100]\n\t" "ldr r10, [%[a], #100]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9646,18 +9351,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #100]\n\t" "adc r4, r4, #0\n\t" /* a[i+26] += m[26] * mu */ "ldr r7, [%[m], #104]\n\t" "ldr r10, [%[a], #104]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9681,18 +9380,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #104]\n\t" "adc r5, r5, #0\n\t" /* a[i+27] += m[27] * mu */ "ldr r7, [%[m], #108]\n\t" "ldr r10, [%[a], #108]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9716,18 +9409,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #108]\n\t" "adc r4, r4, #0\n\t" /* a[i+28] += m[28] * mu */ "ldr r7, [%[m], #112]\n\t" "ldr r10, [%[a], #112]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9751,18 +9438,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #112]\n\t" "adc r5, r5, #0\n\t" /* a[i+29] += m[29] * mu */ "ldr r7, [%[m], #116]\n\t" "ldr r10, [%[a], #116]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -9786,18 +9467,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #116]\n\t" "adc r4, r4, #0\n\t" /* a[i+30] += m[30] * mu */ "ldr r7, [%[m], #120]\n\t" "ldr r10, [%[a], #120]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -9821,22 +9496,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #120]\n\t" "adc r5, r5, #0\n\t" /* a[i+31] += m[31] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #124]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #124]\n\t" +#else + "ldr r7, [%[m], #124]\n\t" #endif "ldr r10, [%[a], #124]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -9867,13 +9536,301 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #124]\n\t" + "ldr r10, [%[a], #128]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #128]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #0x80\n\t" + "blt L_sp_2048_mont_reduce_32_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_2048_mont_reduce_32_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r7, [%[m], #48]\n\t" + "ldr r10, [%[a], #48]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r7, [%[m], #52]\n\t" + "ldr r10, [%[a], #52]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #52]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r7, [%[m], #56]\n\t" + "ldr r10, [%[a], #56]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #56]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r7, [%[m], #60]\n\t" + "ldr r10, [%[a], #60]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #60]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r7, [%[m], #64]\n\t" + "ldr r10, [%[a], #64]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #64]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r7, [%[m], #68]\n\t" + "ldr r10, [%[a], #68]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #68]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r7, [%[m], #72]\n\t" + "ldr r10, [%[a], #72]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #72]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r7, [%[m], #76]\n\t" + "ldr r10, [%[a], #76]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #76]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r7, [%[m], #80]\n\t" + "ldr r10, [%[a], #80]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #80]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r7, [%[m], #84]\n\t" + "ldr r10, [%[a], #84]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #84]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r7, [%[m], #88]\n\t" + "ldr r10, [%[a], #88]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #88]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r7, [%[m], #92]\n\t" + "ldr r10, [%[a], #92]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #92]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r7, [%[m], #96]\n\t" + "ldr r10, [%[a], #96]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #96]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r7, [%[m], #100]\n\t" + "ldr r10, [%[a], #100]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #100]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r7, [%[m], #104]\n\t" + "ldr r10, [%[a], #104]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #104]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r7, [%[m], #108]\n\t" + "ldr r10, [%[a], #108]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #108]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r7, [%[m], #112]\n\t" + "ldr r10, [%[a], #112]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #112]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r7, [%[m], #116]\n\t" + "ldr r10, [%[a], #116]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #116]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r7, [%[m], #120]\n\t" + "ldr r10, [%[a], #120]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #120]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r7, [%[m], #124]\n\t" + "ldr r10, [%[a], #124]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #124]\n\t" "ldr r10, [%[a], #128]\n\t" @@ -9885,16 +9842,223 @@ "add %[a], %[a], #4\n\t" "cmp r9, #0x80\n\t" "blt L_sp_2048_mont_reduce_32_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_2048_mont_reduce_32_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r10, [%[m], #48]\n\t" + "ldr r9, [%[a], #48]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r10, [%[m], #52]\n\t" + "ldr r9, [%[a], #52]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r10, [%[m], #56]\n\t" + "ldr r9, [%[a], #56]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r10, [%[m], #60]\n\t" + "ldr r9, [%[a], #60]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r10, [%[m], #64]\n\t" + "ldr r9, [%[a], #64]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r10, [%[m], #68]\n\t" + "ldr r9, [%[a], #68]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r10, [%[m], #72]\n\t" + "ldr r9, [%[a], #72]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r10, [%[m], #76]\n\t" + "ldr r9, [%[a], #76]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r10, [%[m], #80]\n\t" + "ldr r9, [%[a], #80]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r10, [%[m], #84]\n\t" + "ldr r9, [%[a], #84]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r10, [%[m], #88]\n\t" + "ldr r9, [%[a], #88]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r10, [%[m], #92]\n\t" + "ldr r9, [%[a], #92]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r10, [%[m], #96]\n\t" + "ldr r9, [%[a], #96]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r10, [%[m], #100]\n\t" + "ldr r9, [%[a], #100]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r10, [%[m], #104]\n\t" + "ldr r9, [%[a], #104]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r10, [%[m], #108]\n\t" + "ldr r9, [%[a], #108]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r10, [%[m], #112]\n\t" + "ldr r9, [%[a], #112]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r10, [%[m], #116]\n\t" + "ldr r9, [%[a], #116]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r10, [%[m], #120]\n\t" + "ldr r9, [%[a], #120]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r10, [%[m], #124]\n\t" + "ldr r9, [%[a], #124]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #128]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #124]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #128]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #0x80\n\t" + "blt L_sp_2048_mont_reduce_32_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -9902,7 +10066,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -9916,7 +10080,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -9934,15 +10098,14 @@ */ static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -9975,7 +10138,7 @@ "L_sp_2048_mul_d_32_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -10020,7 +10183,7 @@ "str r3, [%[r], #128]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -10033,15 +10196,14 @@ */ static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -10066,1211 +10228,971 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[12] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[13] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[14] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[15] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[16] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[17] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[18] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[19] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[20] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[21] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[22] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[23] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[24] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[25] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[26] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[27] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[28] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[29] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[30] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[31] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -11296,15 +11218,13 @@ "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r7\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" "str r5, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -11321,9 +11241,9 @@ */ static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -11363,7 +11283,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -11380,9 +11300,9 @@ */ static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -11412,7 +11332,7 @@ "bpl L_div_2048_word_32_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -11440,7 +11360,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -11468,7 +11388,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -11501,7 +11421,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -11516,8 +11436,8 @@ */ static sp_int32 sp_2048_cmp_32(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -11900,7 +11820,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -11914,8 +11834,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -11955,7 +11875,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_2048_mod_32(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_2048_div_32(a, m, NULL, r); } @@ -12312,10 +12233,10 @@ */ static sp_digit sp_2048_cond_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -12336,7 +12257,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -12352,10 +12273,10 @@ */ static sp_digit sp_2048_cond_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -12586,12 +12507,13 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 2048 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -12600,12 +12522,12 @@ */ static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -12618,10 +12540,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -12645,14 +12566,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -12676,18 +12591,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -12711,17 +12620,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -12745,18 +12648,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -12780,18 +12677,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -12815,18 +12706,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -12850,18 +12735,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -12885,18 +12764,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -12920,18 +12793,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -12955,18 +12822,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -12990,18 +12851,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ "ldr r7, [%[m], #44]\n\t" "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13025,18 +12880,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "adc r4, r4, #0\n\t" /* a[i+12] += m[12] * mu */ "ldr r7, [%[m], #48]\n\t" "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13060,18 +12909,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #48]\n\t" "adc r5, r5, #0\n\t" /* a[i+13] += m[13] * mu */ "ldr r7, [%[m], #52]\n\t" "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13095,18 +12938,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #52]\n\t" "adc r4, r4, #0\n\t" /* a[i+14] += m[14] * mu */ "ldr r7, [%[m], #56]\n\t" "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13130,18 +12967,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #56]\n\t" "adc r5, r5, #0\n\t" /* a[i+15] += m[15] * mu */ "ldr r7, [%[m], #60]\n\t" "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13165,18 +12996,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #60]\n\t" "adc r4, r4, #0\n\t" /* a[i+16] += m[16] * mu */ "ldr r7, [%[m], #64]\n\t" "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13200,18 +13025,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #64]\n\t" "adc r5, r5, #0\n\t" /* a[i+17] += m[17] * mu */ "ldr r7, [%[m], #68]\n\t" "ldr r10, [%[a], #68]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13235,18 +13054,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #68]\n\t" "adc r4, r4, #0\n\t" /* a[i+18] += m[18] * mu */ "ldr r7, [%[m], #72]\n\t" "ldr r10, [%[a], #72]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13270,18 +13083,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #72]\n\t" "adc r5, r5, #0\n\t" /* a[i+19] += m[19] * mu */ "ldr r7, [%[m], #76]\n\t" "ldr r10, [%[a], #76]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13305,18 +13112,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #76]\n\t" "adc r4, r4, #0\n\t" /* a[i+20] += m[20] * mu */ "ldr r7, [%[m], #80]\n\t" "ldr r10, [%[a], #80]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13340,18 +13141,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #80]\n\t" "adc r5, r5, #0\n\t" /* a[i+21] += m[21] * mu */ "ldr r7, [%[m], #84]\n\t" "ldr r10, [%[a], #84]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13375,18 +13170,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #84]\n\t" "adc r4, r4, #0\n\t" /* a[i+22] += m[22] * mu */ "ldr r7, [%[m], #88]\n\t" "ldr r10, [%[a], #88]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13410,18 +13199,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #88]\n\t" "adc r5, r5, #0\n\t" /* a[i+23] += m[23] * mu */ "ldr r7, [%[m], #92]\n\t" "ldr r10, [%[a], #92]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13445,18 +13228,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #92]\n\t" "adc r4, r4, #0\n\t" /* a[i+24] += m[24] * mu */ "ldr r7, [%[m], #96]\n\t" "ldr r10, [%[a], #96]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13480,18 +13257,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #96]\n\t" "adc r5, r5, #0\n\t" /* a[i+25] += m[25] * mu */ "ldr r7, [%[m], #100]\n\t" "ldr r10, [%[a], #100]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13515,18 +13286,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #100]\n\t" "adc r4, r4, #0\n\t" /* a[i+26] += m[26] * mu */ "ldr r7, [%[m], #104]\n\t" "ldr r10, [%[a], #104]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13550,18 +13315,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #104]\n\t" "adc r5, r5, #0\n\t" /* a[i+27] += m[27] * mu */ "ldr r7, [%[m], #108]\n\t" "ldr r10, [%[a], #108]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13585,18 +13344,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #108]\n\t" "adc r4, r4, #0\n\t" /* a[i+28] += m[28] * mu */ "ldr r7, [%[m], #112]\n\t" "ldr r10, [%[a], #112]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13620,18 +13373,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #112]\n\t" "adc r5, r5, #0\n\t" /* a[i+29] += m[29] * mu */ "ldr r7, [%[m], #116]\n\t" "ldr r10, [%[a], #116]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13655,18 +13402,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #116]\n\t" "adc r4, r4, #0\n\t" /* a[i+30] += m[30] * mu */ "ldr r7, [%[m], #120]\n\t" "ldr r10, [%[a], #120]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13690,18 +13431,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #120]\n\t" "adc r5, r5, #0\n\t" /* a[i+31] += m[31] * mu */ "ldr r7, [%[m], #124]\n\t" "ldr r10, [%[a], #124]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13725,18 +13460,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #124]\n\t" "adc r4, r4, #0\n\t" /* a[i+32] += m[32] * mu */ "ldr r7, [%[m], #128]\n\t" "ldr r10, [%[a], #128]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13760,18 +13489,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #128]\n\t" "adc r5, r5, #0\n\t" /* a[i+33] += m[33] * mu */ "ldr r7, [%[m], #132]\n\t" "ldr r10, [%[a], #132]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13795,18 +13518,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #132]\n\t" "adc r4, r4, #0\n\t" /* a[i+34] += m[34] * mu */ "ldr r7, [%[m], #136]\n\t" "ldr r10, [%[a], #136]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13830,18 +13547,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #136]\n\t" "adc r5, r5, #0\n\t" /* a[i+35] += m[35] * mu */ "ldr r7, [%[m], #140]\n\t" "ldr r10, [%[a], #140]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13865,18 +13576,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #140]\n\t" "adc r4, r4, #0\n\t" /* a[i+36] += m[36] * mu */ "ldr r7, [%[m], #144]\n\t" "ldr r10, [%[a], #144]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13900,18 +13605,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #144]\n\t" "adc r5, r5, #0\n\t" /* a[i+37] += m[37] * mu */ "ldr r7, [%[m], #148]\n\t" "ldr r10, [%[a], #148]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -13935,18 +13634,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #148]\n\t" "adc r4, r4, #0\n\t" /* a[i+38] += m[38] * mu */ "ldr r7, [%[m], #152]\n\t" "ldr r10, [%[a], #152]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -13970,18 +13663,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #152]\n\t" "adc r5, r5, #0\n\t" /* a[i+39] += m[39] * mu */ "ldr r7, [%[m], #156]\n\t" "ldr r10, [%[a], #156]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14005,18 +13692,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #156]\n\t" "adc r4, r4, #0\n\t" /* a[i+40] += m[40] * mu */ "ldr r7, [%[m], #160]\n\t" "ldr r10, [%[a], #160]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14040,18 +13721,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #160]\n\t" "adc r5, r5, #0\n\t" /* a[i+41] += m[41] * mu */ "ldr r7, [%[m], #164]\n\t" "ldr r10, [%[a], #164]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14075,18 +13750,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #164]\n\t" "adc r4, r4, #0\n\t" /* a[i+42] += m[42] * mu */ "ldr r7, [%[m], #168]\n\t" "ldr r10, [%[a], #168]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14110,18 +13779,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #168]\n\t" "adc r5, r5, #0\n\t" /* a[i+43] += m[43] * mu */ "ldr r7, [%[m], #172]\n\t" "ldr r10, [%[a], #172]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14145,18 +13808,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #172]\n\t" "adc r4, r4, #0\n\t" /* a[i+44] += m[44] * mu */ "ldr r7, [%[m], #176]\n\t" "ldr r10, [%[a], #176]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14180,18 +13837,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #176]\n\t" "adc r5, r5, #0\n\t" /* a[i+45] += m[45] * mu */ "ldr r7, [%[m], #180]\n\t" "ldr r10, [%[a], #180]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14215,18 +13866,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #180]\n\t" "adc r4, r4, #0\n\t" /* a[i+46] += m[46] * mu */ "ldr r7, [%[m], #184]\n\t" "ldr r10, [%[a], #184]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14250,18 +13895,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #184]\n\t" "adc r5, r5, #0\n\t" /* a[i+47] += m[47] * mu */ "ldr r7, [%[m], #188]\n\t" "ldr r10, [%[a], #188]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14285,18 +13924,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #188]\n\t" "adc r4, r4, #0\n\t" /* a[i+48] += m[48] * mu */ "ldr r7, [%[m], #192]\n\t" "ldr r10, [%[a], #192]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14320,18 +13953,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #192]\n\t" "adc r5, r5, #0\n\t" /* a[i+49] += m[49] * mu */ "ldr r7, [%[m], #196]\n\t" "ldr r10, [%[a], #196]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14355,18 +13982,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #196]\n\t" "adc r4, r4, #0\n\t" /* a[i+50] += m[50] * mu */ "ldr r7, [%[m], #200]\n\t" "ldr r10, [%[a], #200]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14390,18 +14011,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #200]\n\t" "adc r5, r5, #0\n\t" /* a[i+51] += m[51] * mu */ "ldr r7, [%[m], #204]\n\t" "ldr r10, [%[a], #204]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14425,18 +14040,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #204]\n\t" "adc r4, r4, #0\n\t" /* a[i+52] += m[52] * mu */ "ldr r7, [%[m], #208]\n\t" "ldr r10, [%[a], #208]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14460,18 +14069,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #208]\n\t" "adc r5, r5, #0\n\t" /* a[i+53] += m[53] * mu */ "ldr r7, [%[m], #212]\n\t" "ldr r10, [%[a], #212]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14495,18 +14098,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #212]\n\t" "adc r4, r4, #0\n\t" /* a[i+54] += m[54] * mu */ "ldr r7, [%[m], #216]\n\t" "ldr r10, [%[a], #216]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14530,18 +14127,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #216]\n\t" "adc r5, r5, #0\n\t" /* a[i+55] += m[55] * mu */ "ldr r7, [%[m], #220]\n\t" "ldr r10, [%[a], #220]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14565,18 +14156,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #220]\n\t" "adc r4, r4, #0\n\t" /* a[i+56] += m[56] * mu */ "ldr r7, [%[m], #224]\n\t" "ldr r10, [%[a], #224]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14600,18 +14185,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #224]\n\t" "adc r5, r5, #0\n\t" /* a[i+57] += m[57] * mu */ "ldr r7, [%[m], #228]\n\t" "ldr r10, [%[a], #228]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14635,18 +14214,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #228]\n\t" "adc r4, r4, #0\n\t" /* a[i+58] += m[58] * mu */ "ldr r7, [%[m], #232]\n\t" "ldr r10, [%[a], #232]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14670,18 +14243,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #232]\n\t" "adc r5, r5, #0\n\t" /* a[i+59] += m[59] * mu */ "ldr r7, [%[m], #236]\n\t" "ldr r10, [%[a], #236]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14705,18 +14272,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #236]\n\t" "adc r4, r4, #0\n\t" /* a[i+60] += m[60] * mu */ "ldr r7, [%[m], #240]\n\t" "ldr r10, [%[a], #240]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14740,18 +14301,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #240]\n\t" "adc r5, r5, #0\n\t" /* a[i+61] += m[61] * mu */ "ldr r7, [%[m], #244]\n\t" "ldr r10, [%[a], #244]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -14775,18 +14330,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #244]\n\t" "adc r4, r4, #0\n\t" /* a[i+62] += m[62] * mu */ "ldr r7, [%[m], #248]\n\t" "ldr r10, [%[a], #248]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -14810,22 +14359,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #248]\n\t" "adc r5, r5, #0\n\t" /* a[i+63] += m[63] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #252]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #252]\n\t" +#else + "ldr r7, [%[m], #252]\n\t" #endif "ldr r10, [%[a], #252]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -14856,13 +14399,557 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #252]\n\t" + "ldr r10, [%[a], #256]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #256]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #0x100\n\t" + "blt L_sp_2048_mont_reduce_64_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_2048_mont_reduce_64_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r7, [%[m], #48]\n\t" + "ldr r10, [%[a], #48]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r7, [%[m], #52]\n\t" + "ldr r10, [%[a], #52]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #52]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r7, [%[m], #56]\n\t" + "ldr r10, [%[a], #56]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #56]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r7, [%[m], #60]\n\t" + "ldr r10, [%[a], #60]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #60]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r7, [%[m], #64]\n\t" + "ldr r10, [%[a], #64]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #64]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r7, [%[m], #68]\n\t" + "ldr r10, [%[a], #68]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #68]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r7, [%[m], #72]\n\t" + "ldr r10, [%[a], #72]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #72]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r7, [%[m], #76]\n\t" + "ldr r10, [%[a], #76]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #76]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r7, [%[m], #80]\n\t" + "ldr r10, [%[a], #80]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #80]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r7, [%[m], #84]\n\t" + "ldr r10, [%[a], #84]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #84]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r7, [%[m], #88]\n\t" + "ldr r10, [%[a], #88]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #88]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r7, [%[m], #92]\n\t" + "ldr r10, [%[a], #92]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #92]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r7, [%[m], #96]\n\t" + "ldr r10, [%[a], #96]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #96]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r7, [%[m], #100]\n\t" + "ldr r10, [%[a], #100]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #100]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r7, [%[m], #104]\n\t" + "ldr r10, [%[a], #104]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #104]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r7, [%[m], #108]\n\t" + "ldr r10, [%[a], #108]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #108]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r7, [%[m], #112]\n\t" + "ldr r10, [%[a], #112]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #112]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r7, [%[m], #116]\n\t" + "ldr r10, [%[a], #116]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #116]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r7, [%[m], #120]\n\t" + "ldr r10, [%[a], #120]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #120]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r7, [%[m], #124]\n\t" + "ldr r10, [%[a], #124]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #124]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r7, [%[m], #128]\n\t" + "ldr r10, [%[a], #128]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #128]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r7, [%[m], #132]\n\t" + "ldr r10, [%[a], #132]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #132]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r7, [%[m], #136]\n\t" + "ldr r10, [%[a], #136]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #136]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r7, [%[m], #140]\n\t" + "ldr r10, [%[a], #140]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #140]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r7, [%[m], #144]\n\t" + "ldr r10, [%[a], #144]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #144]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r7, [%[m], #148]\n\t" + "ldr r10, [%[a], #148]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #148]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r7, [%[m], #152]\n\t" + "ldr r10, [%[a], #152]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #152]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r7, [%[m], #156]\n\t" + "ldr r10, [%[a], #156]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #156]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r7, [%[m], #160]\n\t" + "ldr r10, [%[a], #160]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #160]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r7, [%[m], #164]\n\t" + "ldr r10, [%[a], #164]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #164]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r7, [%[m], #168]\n\t" + "ldr r10, [%[a], #168]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #168]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r7, [%[m], #172]\n\t" + "ldr r10, [%[a], #172]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #172]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r7, [%[m], #176]\n\t" + "ldr r10, [%[a], #176]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #176]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r7, [%[m], #180]\n\t" + "ldr r10, [%[a], #180]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #180]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r7, [%[m], #184]\n\t" + "ldr r10, [%[a], #184]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #184]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r7, [%[m], #188]\n\t" + "ldr r10, [%[a], #188]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #188]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+48] += m[48] * mu */ + "ldr r7, [%[m], #192]\n\t" + "ldr r10, [%[a], #192]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #192]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+49] += m[49] * mu */ + "ldr r7, [%[m], #196]\n\t" + "ldr r10, [%[a], #196]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #196]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+50] += m[50] * mu */ + "ldr r7, [%[m], #200]\n\t" + "ldr r10, [%[a], #200]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #200]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+51] += m[51] * mu */ + "ldr r7, [%[m], #204]\n\t" + "ldr r10, [%[a], #204]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #204]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+52] += m[52] * mu */ + "ldr r7, [%[m], #208]\n\t" + "ldr r10, [%[a], #208]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #208]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+53] += m[53] * mu */ + "ldr r7, [%[m], #212]\n\t" + "ldr r10, [%[a], #212]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #212]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+54] += m[54] * mu */ + "ldr r7, [%[m], #216]\n\t" + "ldr r10, [%[a], #216]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #216]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+55] += m[55] * mu */ + "ldr r7, [%[m], #220]\n\t" + "ldr r10, [%[a], #220]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #220]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+56] += m[56] * mu */ + "ldr r7, [%[m], #224]\n\t" + "ldr r10, [%[a], #224]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #224]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+57] += m[57] * mu */ + "ldr r7, [%[m], #228]\n\t" + "ldr r10, [%[a], #228]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #228]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+58] += m[58] * mu */ + "ldr r7, [%[m], #232]\n\t" + "ldr r10, [%[a], #232]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #232]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+59] += m[59] * mu */ + "ldr r7, [%[m], #236]\n\t" + "ldr r10, [%[a], #236]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #236]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+60] += m[60] * mu */ + "ldr r7, [%[m], #240]\n\t" + "ldr r10, [%[a], #240]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #240]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+61] += m[61] * mu */ + "ldr r7, [%[m], #244]\n\t" + "ldr r10, [%[a], #244]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #244]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+62] += m[62] * mu */ + "ldr r7, [%[m], #248]\n\t" + "ldr r10, [%[a], #248]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #248]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+63] += m[63] * mu */ + "ldr r7, [%[m], #252]\n\t" + "ldr r10, [%[a], #252]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #252]\n\t" "ldr r10, [%[a], #256]\n\t" @@ -14874,16 +14961,383 @@ "add %[a], %[a], #4\n\t" "cmp r9, #0x100\n\t" "blt L_sp_2048_mont_reduce_64_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp); } +#else +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_2048_mont_reduce_64_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r10, [%[m], #48]\n\t" + "ldr r9, [%[a], #48]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r10, [%[m], #52]\n\t" + "ldr r9, [%[a], #52]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r10, [%[m], #56]\n\t" + "ldr r9, [%[a], #56]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r10, [%[m], #60]\n\t" + "ldr r9, [%[a], #60]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r10, [%[m], #64]\n\t" + "ldr r9, [%[a], #64]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r10, [%[m], #68]\n\t" + "ldr r9, [%[a], #68]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r10, [%[m], #72]\n\t" + "ldr r9, [%[a], #72]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r10, [%[m], #76]\n\t" + "ldr r9, [%[a], #76]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r10, [%[m], #80]\n\t" + "ldr r9, [%[a], #80]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r10, [%[m], #84]\n\t" + "ldr r9, [%[a], #84]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r10, [%[m], #88]\n\t" + "ldr r9, [%[a], #88]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r10, [%[m], #92]\n\t" + "ldr r9, [%[a], #92]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r10, [%[m], #96]\n\t" + "ldr r9, [%[a], #96]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r10, [%[m], #100]\n\t" + "ldr r9, [%[a], #100]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r10, [%[m], #104]\n\t" + "ldr r9, [%[a], #104]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r10, [%[m], #108]\n\t" + "ldr r9, [%[a], #108]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r10, [%[m], #112]\n\t" + "ldr r9, [%[a], #112]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r10, [%[m], #116]\n\t" + "ldr r9, [%[a], #116]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r10, [%[m], #120]\n\t" + "ldr r9, [%[a], #120]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r10, [%[m], #124]\n\t" + "ldr r9, [%[a], #124]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r10, [%[m], #128]\n\t" + "ldr r9, [%[a], #128]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r10, [%[m], #132]\n\t" + "ldr r9, [%[a], #132]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r10, [%[m], #136]\n\t" + "ldr r9, [%[a], #136]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r10, [%[m], #140]\n\t" + "ldr r9, [%[a], #140]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r10, [%[m], #144]\n\t" + "ldr r9, [%[a], #144]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r10, [%[m], #148]\n\t" + "ldr r9, [%[a], #148]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r10, [%[m], #152]\n\t" + "ldr r9, [%[a], #152]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r10, [%[m], #156]\n\t" + "ldr r9, [%[a], #156]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r10, [%[m], #160]\n\t" + "ldr r9, [%[a], #160]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r10, [%[m], #164]\n\t" + "ldr r9, [%[a], #164]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r10, [%[m], #168]\n\t" + "ldr r9, [%[a], #168]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r10, [%[m], #172]\n\t" + "ldr r9, [%[a], #172]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r10, [%[m], #176]\n\t" + "ldr r9, [%[a], #176]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r10, [%[m], #180]\n\t" + "ldr r9, [%[a], #180]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #180]\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r10, [%[m], #184]\n\t" + "ldr r9, [%[a], #184]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #184]\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r10, [%[m], #188]\n\t" + "ldr r9, [%[a], #188]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #188]\n\t" + /* a[i+48] += m[48] * mu */ + "ldr r10, [%[m], #192]\n\t" + "ldr r9, [%[a], #192]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #192]\n\t" + /* a[i+49] += m[49] * mu */ + "ldr r10, [%[m], #196]\n\t" + "ldr r9, [%[a], #196]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #196]\n\t" + /* a[i+50] += m[50] * mu */ + "ldr r10, [%[m], #200]\n\t" + "ldr r9, [%[a], #200]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #200]\n\t" + /* a[i+51] += m[51] * mu */ + "ldr r10, [%[m], #204]\n\t" + "ldr r9, [%[a], #204]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #204]\n\t" + /* a[i+52] += m[52] * mu */ + "ldr r10, [%[m], #208]\n\t" + "ldr r9, [%[a], #208]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #208]\n\t" + /* a[i+53] += m[53] * mu */ + "ldr r10, [%[m], #212]\n\t" + "ldr r9, [%[a], #212]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #212]\n\t" + /* a[i+54] += m[54] * mu */ + "ldr r10, [%[m], #216]\n\t" + "ldr r9, [%[a], #216]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #216]\n\t" + /* a[i+55] += m[55] * mu */ + "ldr r10, [%[m], #220]\n\t" + "ldr r9, [%[a], #220]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #220]\n\t" + /* a[i+56] += m[56] * mu */ + "ldr r10, [%[m], #224]\n\t" + "ldr r9, [%[a], #224]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #224]\n\t" + /* a[i+57] += m[57] * mu */ + "ldr r10, [%[m], #228]\n\t" + "ldr r9, [%[a], #228]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #228]\n\t" + /* a[i+58] += m[58] * mu */ + "ldr r10, [%[m], #232]\n\t" + "ldr r9, [%[a], #232]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #232]\n\t" + /* a[i+59] += m[59] * mu */ + "ldr r10, [%[m], #236]\n\t" + "ldr r9, [%[a], #236]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #236]\n\t" + /* a[i+60] += m[60] * mu */ + "ldr r10, [%[m], #240]\n\t" + "ldr r9, [%[a], #240]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #240]\n\t" + /* a[i+61] += m[61] * mu */ + "ldr r10, [%[m], #244]\n\t" + "ldr r9, [%[a], #244]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #244]\n\t" + /* a[i+62] += m[62] * mu */ + "ldr r10, [%[m], #248]\n\t" + "ldr r9, [%[a], #248]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #248]\n\t" + /* a[i+63] += m[63] * mu */ + "ldr r10, [%[m], #252]\n\t" + "ldr r9, [%[a], #252]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #256]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #252]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #256]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #0x100\n\t" + "blt L_sp_2048_mont_reduce_64_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp); +} + +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -14891,7 +15345,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -14905,7 +15359,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -14923,9 +15377,9 @@ */ static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r12, #0\n\t" @@ -14946,7 +15400,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc" ); return (uint32_t)(size_t)r; } @@ -14960,9 +15414,9 @@ */ static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -15080,7 +15534,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -15098,9 +15552,9 @@ */ static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -15140,7 +15594,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -15157,9 +15611,9 @@ */ static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -15189,7 +15643,7 @@ "bpl L_div_2048_word_64_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -15217,7 +15671,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -15245,7 +15699,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -15278,7 +15732,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -15293,8 +15747,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -15350,7 +15804,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_2048_mod_64_cond(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_2048_div_64_cond(a, m, NULL, r); } @@ -15396,8 +15851,8 @@ */ static sp_int32 sp_2048_cmp_64(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -16132,7 +16587,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -16146,8 +16601,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -16187,7 +16642,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_2048_mod_64(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_2048_div_64(a, m, NULL, r); } @@ -16667,10 +17123,10 @@ */ static sp_digit sp_2048_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -16691,7 +17147,7 @@ "mov %[r], lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -16707,10 +17163,10 @@ */ static sp_digit sp_2048_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r8, #0\n\t" @@ -16829,7 +17285,7 @@ "adc %[r], r8, r8\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -17151,9 +17607,9 @@ #ifdef HAVE_FFDHE_2048 static void sp_2048_lshift_64(sp_digit* r_p, const sp_digit* a_p, byte n_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register byte n asm ("r2") = n_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register byte n asm ("r2") = (byte)n_p; __asm__ __volatile__ ( "rsb r12, %[n], #31\n\t" @@ -17543,7 +17999,7 @@ "str r6, [%[r], #4]\n\t" : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : "memory", "r4", "r5", "r6", "r3", "r12" + : "memory", "r4", "r5", "r6", "r3", "r12", "cc" ); } @@ -17845,14 +18301,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -17965,17 +18421,16 @@ */ static void sp_3072_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #48\n\t" - "mov r10, #0\n\t" /* A[0] * B[0] */ "ldr r11, [%[a]]\n\t" "ldr r12, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r3, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18005,7 +18460,7 @@ "str r3, [sp]\n\t" /* A[0] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18044,7 +18499,7 @@ #endif /* A[1] * B[0] */ "ldr r8, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18082,7 +18537,7 @@ "str r4, [sp, #4]\n\t" /* A[2] * B[0] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18122,7 +18577,7 @@ /* A[1] * B[1] */ "ldr r11, [%[a], #4]\n\t" "ldr r12, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18160,7 +18615,7 @@ /* A[0] * B[2] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18198,7 +18653,7 @@ "str r5, [sp, #8]\n\t" /* A[0] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18237,7 +18692,7 @@ #endif /* A[1] * B[2] */ "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18274,7 +18729,7 @@ #endif /* A[2] * B[1] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18312,7 +18767,7 @@ /* A[3] * B[0] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18350,7 +18805,7 @@ "str r3, [sp, #12]\n\t" /* A[4] * B[0] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18389,7 +18844,7 @@ #endif /* A[3] * B[1] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18427,7 +18882,7 @@ /* A[2] * B[2] */ "ldr r11, [%[a], #8]\n\t" "ldr r12, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18465,7 +18920,7 @@ /* A[1] * B[3] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18503,7 +18958,7 @@ /* A[0] * B[4] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18541,7 +18996,7 @@ "str r4, [sp, #16]\n\t" /* A[0] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18581,7 +19036,7 @@ /* A[1] * B[4] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18618,7 +19073,7 @@ #endif /* A[2] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18655,7 +19110,7 @@ #endif /* A[3] * B[2] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18693,7 +19148,7 @@ /* A[4] * B[1] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18731,7 +19186,7 @@ /* A[5] * B[0] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18769,7 +19224,7 @@ "str r5, [sp, #20]\n\t" /* A[6] * B[0] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18809,7 +19264,7 @@ /* A[5] * B[1] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18846,7 +19301,7 @@ #endif /* A[4] * B[2] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18884,7 +19339,7 @@ /* A[3] * B[3] */ "ldr r11, [%[a], #12]\n\t" "ldr r12, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18922,7 +19377,7 @@ /* A[2] * B[4] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18960,7 +19415,7 @@ /* A[1] * B[5] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -18998,7 +19453,7 @@ /* A[0] * B[6] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19036,7 +19491,7 @@ "str r3, [sp, #24]\n\t" /* A[0] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19076,7 +19531,7 @@ /* A[1] * B[6] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19114,7 +19569,7 @@ /* A[2] * B[5] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19151,7 +19606,7 @@ #endif /* A[3] * B[4] */ "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19188,7 +19643,7 @@ #endif /* A[4] * B[3] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19226,7 +19681,7 @@ /* A[5] * B[2] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19264,7 +19719,7 @@ /* A[6] * B[1] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19302,7 +19757,7 @@ /* A[7] * B[0] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19340,7 +19795,7 @@ "str r4, [sp, #28]\n\t" /* A[8] * B[0] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19380,7 +19835,7 @@ /* A[7] * B[1] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19418,7 +19873,7 @@ /* A[6] * B[2] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19455,7 +19910,7 @@ #endif /* A[5] * B[3] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19493,7 +19948,7 @@ /* A[4] * B[4] */ "ldr r11, [%[a], #16]\n\t" "ldr r12, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19531,7 +19986,7 @@ /* A[3] * B[5] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19569,7 +20024,7 @@ /* A[2] * B[6] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19607,7 +20062,7 @@ /* A[1] * B[7] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19645,7 +20100,7 @@ /* A[0] * B[8] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19683,7 +20138,7 @@ "str r5, [sp, #32]\n\t" /* A[0] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19723,7 +20178,7 @@ /* A[1] * B[8] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19761,7 +20216,7 @@ /* A[2] * B[7] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19799,7 +20254,7 @@ /* A[3] * B[6] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19836,7 +20291,7 @@ #endif /* A[4] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19873,7 +20328,7 @@ #endif /* A[5] * B[4] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19911,7 +20366,7 @@ /* A[6] * B[3] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19949,7 +20404,7 @@ /* A[7] * B[2] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -19987,7 +20442,7 @@ /* A[8] * B[1] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20025,7 +20480,7 @@ /* A[9] * B[0] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20063,7 +20518,7 @@ "str r3, [sp, #36]\n\t" /* A[10] * B[0] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20103,7 +20558,7 @@ /* A[9] * B[1] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20141,7 +20596,7 @@ /* A[8] * B[2] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20179,7 +20634,7 @@ /* A[7] * B[3] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20216,7 +20671,7 @@ #endif /* A[6] * B[4] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20254,7 +20709,7 @@ /* A[5] * B[5] */ "ldr r11, [%[a], #20]\n\t" "ldr r12, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20292,7 +20747,7 @@ /* A[4] * B[6] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20330,7 +20785,7 @@ /* A[3] * B[7] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20368,7 +20823,7 @@ /* A[2] * B[8] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20406,7 +20861,7 @@ /* A[1] * B[9] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20444,7 +20899,7 @@ /* A[0] * B[10] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20482,7 +20937,7 @@ "str r4, [sp, #40]\n\t" /* A[0] * B[11] */ "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20522,7 +20977,7 @@ /* A[1] * B[10] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20560,7 +21015,7 @@ /* A[2] * B[9] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20598,7 +21053,7 @@ /* A[3] * B[8] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20636,7 +21091,7 @@ /* A[4] * B[7] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20673,7 +21128,7 @@ #endif /* A[5] * B[6] */ "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20710,7 +21165,7 @@ #endif /* A[6] * B[5] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20748,7 +21203,7 @@ /* A[7] * B[4] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20786,7 +21241,7 @@ /* A[8] * B[3] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20824,7 +21279,7 @@ /* A[9] * B[2] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20862,7 +21317,7 @@ /* A[10] * B[1] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20900,7 +21355,7 @@ /* A[11] * B[0] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20938,7 +21393,7 @@ "str r5, [sp, #44]\n\t" /* A[11] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -20978,7 +21433,7 @@ /* A[10] * B[2] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21016,7 +21471,7 @@ /* A[9] * B[3] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21054,7 +21509,7 @@ /* A[8] * B[4] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21091,7 +21546,7 @@ #endif /* A[7] * B[5] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21129,7 +21584,7 @@ /* A[6] * B[6] */ "ldr r11, [%[a], #24]\n\t" "ldr r12, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21167,7 +21622,7 @@ /* A[5] * B[7] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21205,7 +21660,7 @@ /* A[4] * B[8] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21243,7 +21698,7 @@ /* A[3] * B[9] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21281,7 +21736,7 @@ /* A[2] * B[10] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21319,7 +21774,7 @@ /* A[1] * B[11] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21357,7 +21812,7 @@ "str r3, [%[r], #48]\n\t" /* A[2] * B[11] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21397,7 +21852,7 @@ /* A[3] * B[10] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21435,7 +21890,7 @@ /* A[4] * B[9] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21473,7 +21928,7 @@ /* A[5] * B[8] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21510,7 +21965,7 @@ #endif /* A[6] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21547,7 +22002,7 @@ #endif /* A[7] * B[6] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21585,7 +22040,7 @@ /* A[8] * B[5] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21623,7 +22078,7 @@ /* A[9] * B[4] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21661,7 +22116,7 @@ /* A[10] * B[3] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21699,7 +22154,7 @@ /* A[11] * B[2] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21737,7 +22192,7 @@ "str r4, [%[r], #52]\n\t" /* A[11] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21777,7 +22232,7 @@ /* A[10] * B[4] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21815,7 +22270,7 @@ /* A[9] * B[5] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21852,7 +22307,7 @@ #endif /* A[8] * B[6] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21890,7 +22345,7 @@ /* A[7] * B[7] */ "ldr r11, [%[a], #28]\n\t" "ldr r12, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21928,7 +22383,7 @@ /* A[6] * B[8] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -21966,7 +22421,7 @@ /* A[5] * B[9] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22004,7 +22459,7 @@ /* A[4] * B[10] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22042,7 +22497,7 @@ /* A[3] * B[11] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22080,7 +22535,7 @@ "str r5, [%[r], #56]\n\t" /* A[4] * B[11] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22120,7 +22575,7 @@ /* A[5] * B[10] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22158,7 +22613,7 @@ /* A[6] * B[9] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22195,7 +22650,7 @@ #endif /* A[7] * B[8] */ "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22232,7 +22687,7 @@ #endif /* A[8] * B[7] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22270,7 +22725,7 @@ /* A[9] * B[6] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22308,7 +22763,7 @@ /* A[10] * B[5] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22346,7 +22801,7 @@ /* A[11] * B[4] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22384,7 +22839,7 @@ "str r3, [%[r], #60]\n\t" /* A[11] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22424,7 +22879,7 @@ /* A[10] * B[6] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22461,7 +22916,7 @@ #endif /* A[9] * B[7] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22499,7 +22954,7 @@ /* A[8] * B[8] */ "ldr r11, [%[a], #32]\n\t" "ldr r12, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22537,7 +22992,7 @@ /* A[7] * B[9] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22575,7 +23030,7 @@ /* A[6] * B[10] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22613,7 +23068,7 @@ /* A[5] * B[11] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22651,7 +23106,7 @@ "str r4, [%[r], #64]\n\t" /* A[6] * B[11] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22691,7 +23146,7 @@ /* A[7] * B[10] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22728,7 +23183,7 @@ #endif /* A[8] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22765,7 +23220,7 @@ #endif /* A[9] * B[8] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22803,7 +23258,7 @@ /* A[10] * B[7] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22841,7 +23296,7 @@ /* A[11] * B[6] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22879,7 +23334,7 @@ "str r5, [%[r], #68]\n\t" /* A[11] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22918,7 +23373,7 @@ #endif /* A[10] * B[8] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22956,7 +23411,7 @@ /* A[9] * B[9] */ "ldr r11, [%[a], #36]\n\t" "ldr r12, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -22994,7 +23449,7 @@ /* A[8] * B[10] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23032,7 +23487,7 @@ /* A[7] * B[11] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23070,7 +23525,7 @@ "str r3, [%[r], #72]\n\t" /* A[8] * B[11] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23109,7 +23564,7 @@ #endif /* A[9] * B[10] */ "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23146,7 +23601,7 @@ #endif /* A[10] * B[9] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23184,7 +23639,7 @@ /* A[11] * B[8] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23221,7 +23676,7 @@ #endif "str r4, [%[r], #76]\n\t" /* A[11] * B[9] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23261,7 +23716,7 @@ /* A[10] * B[10] */ "ldr r11, [%[a], #40]\n\t" "ldr r12, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23299,7 +23754,7 @@ /* A[9] * B[11] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23336,7 +23791,7 @@ #endif "str r5, [%[r], #80]\n\t" /* A[10] * B[11] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23375,7 +23830,7 @@ #endif /* A[11] * B[10] */ "ldr r8, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23412,7 +23867,7 @@ #endif "str r3, [%[r], #84]\n\t" /* A[11] * B[11] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -23438,9 +23893,7 @@ "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" #else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r7\n\t" + "umlal r4, r5, r8, r9\n\t" #endif "str r4, [%[r], #88]\n\t" "str r5, [%[r], #92]\n\t" @@ -23452,7 +23905,7 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); } @@ -23464,12 +23917,11 @@ */ static sp_digit sp_3072_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -23491,10 +23943,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -23506,8 +23959,8 @@ */ static sp_digit sp_3072_sub_in_place_24(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -23555,7 +24008,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -23568,12 +24021,11 @@ */ static sp_digit sp_3072_add_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -23616,10 +24068,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -23700,8 +24153,8 @@ */ static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -23791,7 +24244,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -23804,12 +24257,11 @@ */ static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -23894,10 +24346,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -23978,8 +24431,8 @@ */ static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -24153,7 +24606,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -24166,12 +24619,11 @@ */ static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -24340,10 +24792,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -24424,14 +24877,14 @@ */ static void sp_3072_sqr_12(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #48\n\t" /* A[0] * A[0] */ "ldr r10, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsr r9, r10, #16\n\t" "lsl r2, r10, #16\n\t" "lsr r2, r2, #16\n\t" @@ -24450,7 +24903,7 @@ /* A[0] * A[1] */ "ldr r10, [%[a], #4]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24506,7 +24959,7 @@ /* A[0] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24560,7 +25013,7 @@ #endif /* A[1] * A[1] */ "ldr r10, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24590,7 +25043,7 @@ /* A[0] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24645,7 +25098,7 @@ /* A[1] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24698,7 +25151,7 @@ /* A[0] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24753,7 +25206,7 @@ /* A[1] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24804,7 +25257,7 @@ #endif /* A[2] * A[2] */ "ldr r10, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24834,7 +25287,7 @@ /* A[0] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24864,7 +25317,7 @@ /* A[1] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24902,7 +25355,7 @@ /* A[2] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24947,7 +25400,7 @@ /* A[0] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -24977,7 +25430,7 @@ /* A[1] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25015,7 +25468,7 @@ /* A[2] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25052,7 +25505,7 @@ #endif /* A[3] * A[3] */ "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25091,7 +25544,7 @@ /* A[0] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25121,7 +25574,7 @@ /* A[1] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25159,7 +25612,7 @@ /* A[2] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25197,7 +25650,7 @@ /* A[3] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25242,7 +25695,7 @@ /* A[0] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25272,7 +25725,7 @@ /* A[1] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25310,7 +25763,7 @@ /* A[2] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25348,7 +25801,7 @@ /* A[3] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25385,7 +25838,7 @@ #endif /* A[4] * A[4] */ "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25424,7 +25877,7 @@ /* A[0] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25454,7 +25907,7 @@ /* A[1] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25492,7 +25945,7 @@ /* A[2] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25530,7 +25983,7 @@ /* A[3] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25568,7 +26021,7 @@ /* A[4] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25613,7 +26066,7 @@ /* A[0] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25643,7 +26096,7 @@ /* A[1] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25681,7 +26134,7 @@ /* A[2] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25719,7 +26172,7 @@ /* A[3] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25757,7 +26210,7 @@ /* A[4] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25794,7 +26247,7 @@ #endif /* A[5] * A[5] */ "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25833,7 +26286,7 @@ /* A[0] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25863,7 +26316,7 @@ /* A[1] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25901,7 +26354,7 @@ /* A[2] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25939,7 +26392,7 @@ /* A[3] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -25977,7 +26430,7 @@ /* A[4] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26015,7 +26468,7 @@ /* A[5] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26060,7 +26513,7 @@ /* A[1] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26090,7 +26543,7 @@ /* A[2] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26128,7 +26581,7 @@ /* A[3] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26166,7 +26619,7 @@ /* A[4] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26204,7 +26657,7 @@ /* A[5] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26241,7 +26694,7 @@ #endif /* A[6] * A[6] */ "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26280,7 +26733,7 @@ /* A[2] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26310,7 +26763,7 @@ /* A[3] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26348,7 +26801,7 @@ /* A[4] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26386,7 +26839,7 @@ /* A[5] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26424,7 +26877,7 @@ /* A[6] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26469,7 +26922,7 @@ /* A[3] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26499,7 +26952,7 @@ /* A[4] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26537,7 +26990,7 @@ /* A[5] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26575,7 +27028,7 @@ /* A[6] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26612,7 +27065,7 @@ #endif /* A[7] * A[7] */ "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26651,7 +27104,7 @@ /* A[4] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26681,7 +27134,7 @@ /* A[5] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26719,7 +27172,7 @@ /* A[6] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26757,7 +27210,7 @@ /* A[7] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26802,7 +27255,7 @@ /* A[5] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26832,7 +27285,7 @@ /* A[6] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26870,7 +27323,7 @@ /* A[7] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26907,7 +27360,7 @@ #endif /* A[8] * A[8] */ "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26946,7 +27399,7 @@ /* A[6] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -26976,7 +27429,7 @@ /* A[7] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27014,7 +27467,7 @@ /* A[8] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27059,7 +27512,7 @@ /* A[7] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27114,7 +27567,7 @@ /* A[8] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27165,7 +27618,7 @@ #endif /* A[9] * A[9] */ "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27195,7 +27648,7 @@ /* A[8] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27250,7 +27703,7 @@ /* A[9] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27303,7 +27756,7 @@ /* A[9] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27357,7 +27810,7 @@ #endif /* A[10] * A[10] */ "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27387,7 +27840,7 @@ /* A[10] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27442,7 +27895,7 @@ "str r2, [%[r], #84]\n\t" /* A[11] * A[11] */ "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -27475,7 +27928,7 @@ "stm %[r]!, {r2, r3, r4, r8}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); } @@ -27487,9 +27940,9 @@ */ static sp_digit sp_3072_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -27516,7 +27969,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -27565,9 +28018,9 @@ */ static sp_digit sp_3072_sub_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -27615,7 +28068,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -27664,9 +28117,9 @@ */ static sp_digit sp_3072_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -27756,7 +28209,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -27807,9 +28260,9 @@ */ static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -27831,7 +28284,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -27845,16 +28298,15 @@ */ static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #0x180\n\t" "\n" "L_sp_3072_sub_in_pkace_96_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -27862,13 +28314,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_3072_sub_in_pkace_96_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -27883,16 +28335,19 @@ */ static void sp_3072_mul_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x300\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_3072_mul_96_outer_%=: \n\t" "subs r3, r5, #0x17c\n\t" @@ -27903,7 +28358,44 @@ "L_sp_3072_mul_96_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -27940,10 +28432,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #0x180\n\t" - "beq L_sp_3072_mul_96_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_3072_mul_96_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_3072_mul_96_inner_done_%=\n\t" + "blt L_sp_3072_mul_96_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_3072_mul_96_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -27951,18 +28479,50 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x2f8\n\t" + "cmp r5, #0x2f4\n\t" "ble L_sp_3072_mul_96_outer_%=\n\t" + "ldr lr, [%[a], #380]\n\t" + "ldr r11, [%[b], #380]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_3072_mul_96_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_3072_mul_96_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -27973,29 +28533,28 @@ */ static void sp_3072_sqr_96(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x300\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_3072_sqr_96_outer_%=: \n\t" "subs r3, r5, #0x17c\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_3072_sqr_96_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_3072_sqr_96_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -28044,11 +28603,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_3072_sqr_96_op_done_%=\n\t" - "\n" - "L_sp_3072_sqr_96_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_3072_sqr_96_inner_done_%=\n\t" + "blt L_sp_3072_sqr_96_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -28075,34 +28636,50 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_3072_sqr_96_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #0x180\n\t" - "beq L_sp_3072_sqr_96_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_3072_sqr_96_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_3072_sqr_96_inner_%=\n\t" - "\n" "L_sp_3072_sqr_96_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x2f8\n\t" + "cmp r5, #0x2f4\n\t" "ble L_sp_3072_sqr_96_outer_%=\n\t" + "ldr lr, [%[a], #380]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_3072_sqr_96_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_3072_sqr_96_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -28134,9 +28711,9 @@ */ static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -28158,7 +28735,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -28172,16 +28749,15 @@ */ static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #0xc0\n\t" "\n" "L_sp_3072_sub_in_pkace_48_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -28189,13 +28765,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_3072_sub_in_pkace_48_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -28210,16 +28786,19 @@ */ static void sp_3072_mul_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x180\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_3072_mul_48_outer_%=: \n\t" "subs r3, r5, #0xbc\n\t" @@ -28230,7 +28809,44 @@ "L_sp_3072_mul_48_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -28267,10 +28883,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #0xc0\n\t" - "beq L_sp_3072_mul_48_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_3072_mul_48_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_3072_mul_48_inner_done_%=\n\t" + "blt L_sp_3072_mul_48_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_3072_mul_48_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -28278,18 +28930,50 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x178\n\t" + "cmp r5, #0x174\n\t" "ble L_sp_3072_mul_48_outer_%=\n\t" + "ldr lr, [%[a], #188]\n\t" + "ldr r11, [%[b], #188]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_3072_mul_48_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_3072_mul_48_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -28300,29 +28984,28 @@ */ static void sp_3072_sqr_48(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x180\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_3072_sqr_48_outer_%=: \n\t" "subs r3, r5, #0xbc\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_3072_sqr_48_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_3072_sqr_48_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -28371,11 +29054,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_3072_sqr_48_op_done_%=\n\t" - "\n" - "L_sp_3072_sqr_48_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_3072_sqr_48_inner_done_%=\n\t" + "blt L_sp_3072_sqr_48_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -28402,41 +29087,57 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_3072_sqr_48_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #0xc0\n\t" - "beq L_sp_3072_sqr_48_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_3072_sqr_48_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_3072_sqr_48_inner_%=\n\t" - "\n" "L_sp_3072_sqr_48_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x178\n\t" + "cmp r5, #0x174\n\t" "ble L_sp_3072_sqr_48_outer_%=\n\t" + "ldr lr, [%[a], #188]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_3072_sqr_48_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_3072_sqr_48_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -28465,15 +29166,14 @@ */ static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -28506,7 +29206,7 @@ "L_sp_3072_mul_d_96_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -28551,7 +29251,7 @@ "str r3, [%[r], #384]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -28564,15 +29264,14 @@ */ static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -28597,3771 +29296,3019 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[12] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[13] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[14] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[15] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[16] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[17] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[18] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[19] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[20] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[21] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[22] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[23] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[24] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[25] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[26] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[27] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[28] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[29] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[30] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[31] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[32] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[33] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[34] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[35] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[36] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[37] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[38] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[39] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[40] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[41] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[42] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[43] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[44] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[45] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[46] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[47] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[48] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[49] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[50] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[51] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[52] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[53] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[54] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[55] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[56] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[57] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[58] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[59] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[60] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[61] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[62] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[63] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[64] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[65] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[66] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[67] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[68] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[69] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[70] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[71] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[72] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[73] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[74] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[75] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[76] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[77] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[78] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[79] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[80] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[81] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[82] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[83] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[84] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[85] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[86] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[87] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[88] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[89] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[90] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[91] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[92] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[93] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[94] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[95] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -32387,15 +32334,13 @@ "adds r5, r5, r6\n\t" "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r7\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" "str r3, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -32426,10 +32371,10 @@ */ static sp_digit sp_3072_cond_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -32450,7 +32395,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -32466,10 +32411,10 @@ */ static sp_digit sp_3072_cond_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -32644,12 +32589,13 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 3072 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -32658,12 +32604,12 @@ */ static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -32676,10 +32622,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -32703,14 +32648,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -32734,18 +32673,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -32769,17 +32702,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -32803,18 +32730,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -32838,18 +32759,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -32873,18 +32788,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -32908,18 +32817,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -32943,18 +32846,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -32978,18 +32875,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33013,18 +32904,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33048,18 +32933,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ "ldr r7, [%[m], #44]\n\t" "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33083,18 +32962,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "adc r4, r4, #0\n\t" /* a[i+12] += m[12] * mu */ "ldr r7, [%[m], #48]\n\t" "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33118,18 +32991,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #48]\n\t" "adc r5, r5, #0\n\t" /* a[i+13] += m[13] * mu */ "ldr r7, [%[m], #52]\n\t" "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33153,18 +33020,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #52]\n\t" "adc r4, r4, #0\n\t" /* a[i+14] += m[14] * mu */ "ldr r7, [%[m], #56]\n\t" "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33188,18 +33049,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #56]\n\t" "adc r5, r5, #0\n\t" /* a[i+15] += m[15] * mu */ "ldr r7, [%[m], #60]\n\t" "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33223,18 +33078,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #60]\n\t" "adc r4, r4, #0\n\t" /* a[i+16] += m[16] * mu */ "ldr r7, [%[m], #64]\n\t" "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33258,18 +33107,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #64]\n\t" "adc r5, r5, #0\n\t" /* a[i+17] += m[17] * mu */ "ldr r7, [%[m], #68]\n\t" "ldr r10, [%[a], #68]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33293,18 +33136,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #68]\n\t" "adc r4, r4, #0\n\t" /* a[i+18] += m[18] * mu */ "ldr r7, [%[m], #72]\n\t" "ldr r10, [%[a], #72]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33328,18 +33165,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #72]\n\t" "adc r5, r5, #0\n\t" /* a[i+19] += m[19] * mu */ "ldr r7, [%[m], #76]\n\t" "ldr r10, [%[a], #76]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33363,18 +33194,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #76]\n\t" "adc r4, r4, #0\n\t" /* a[i+20] += m[20] * mu */ "ldr r7, [%[m], #80]\n\t" "ldr r10, [%[a], #80]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33398,18 +33223,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #80]\n\t" "adc r5, r5, #0\n\t" /* a[i+21] += m[21] * mu */ "ldr r7, [%[m], #84]\n\t" "ldr r10, [%[a], #84]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33433,18 +33252,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #84]\n\t" "adc r4, r4, #0\n\t" /* a[i+22] += m[22] * mu */ "ldr r7, [%[m], #88]\n\t" "ldr r10, [%[a], #88]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33468,18 +33281,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #88]\n\t" "adc r5, r5, #0\n\t" /* a[i+23] += m[23] * mu */ "ldr r7, [%[m], #92]\n\t" "ldr r10, [%[a], #92]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33503,18 +33310,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #92]\n\t" "adc r4, r4, #0\n\t" /* a[i+24] += m[24] * mu */ "ldr r7, [%[m], #96]\n\t" "ldr r10, [%[a], #96]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33538,18 +33339,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #96]\n\t" "adc r5, r5, #0\n\t" /* a[i+25] += m[25] * mu */ "ldr r7, [%[m], #100]\n\t" "ldr r10, [%[a], #100]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33573,18 +33368,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #100]\n\t" "adc r4, r4, #0\n\t" /* a[i+26] += m[26] * mu */ "ldr r7, [%[m], #104]\n\t" "ldr r10, [%[a], #104]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33608,18 +33397,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #104]\n\t" "adc r5, r5, #0\n\t" /* a[i+27] += m[27] * mu */ "ldr r7, [%[m], #108]\n\t" "ldr r10, [%[a], #108]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33643,18 +33426,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #108]\n\t" "adc r4, r4, #0\n\t" /* a[i+28] += m[28] * mu */ "ldr r7, [%[m], #112]\n\t" "ldr r10, [%[a], #112]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33678,18 +33455,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #112]\n\t" "adc r5, r5, #0\n\t" /* a[i+29] += m[29] * mu */ "ldr r7, [%[m], #116]\n\t" "ldr r10, [%[a], #116]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33713,18 +33484,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #116]\n\t" "adc r4, r4, #0\n\t" /* a[i+30] += m[30] * mu */ "ldr r7, [%[m], #120]\n\t" "ldr r10, [%[a], #120]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33748,18 +33513,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #120]\n\t" "adc r5, r5, #0\n\t" /* a[i+31] += m[31] * mu */ "ldr r7, [%[m], #124]\n\t" "ldr r10, [%[a], #124]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33783,18 +33542,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #124]\n\t" "adc r4, r4, #0\n\t" /* a[i+32] += m[32] * mu */ "ldr r7, [%[m], #128]\n\t" "ldr r10, [%[a], #128]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33818,18 +33571,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #128]\n\t" "adc r5, r5, #0\n\t" /* a[i+33] += m[33] * mu */ "ldr r7, [%[m], #132]\n\t" "ldr r10, [%[a], #132]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33853,18 +33600,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #132]\n\t" "adc r4, r4, #0\n\t" /* a[i+34] += m[34] * mu */ "ldr r7, [%[m], #136]\n\t" "ldr r10, [%[a], #136]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33888,18 +33629,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #136]\n\t" "adc r5, r5, #0\n\t" /* a[i+35] += m[35] * mu */ "ldr r7, [%[m], #140]\n\t" "ldr r10, [%[a], #140]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33923,18 +33658,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #140]\n\t" "adc r4, r4, #0\n\t" /* a[i+36] += m[36] * mu */ "ldr r7, [%[m], #144]\n\t" "ldr r10, [%[a], #144]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -33958,18 +33687,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #144]\n\t" "adc r5, r5, #0\n\t" /* a[i+37] += m[37] * mu */ "ldr r7, [%[m], #148]\n\t" "ldr r10, [%[a], #148]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -33993,18 +33716,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #148]\n\t" "adc r4, r4, #0\n\t" /* a[i+38] += m[38] * mu */ "ldr r7, [%[m], #152]\n\t" "ldr r10, [%[a], #152]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -34028,18 +33745,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #152]\n\t" "adc r5, r5, #0\n\t" /* a[i+39] += m[39] * mu */ "ldr r7, [%[m], #156]\n\t" "ldr r10, [%[a], #156]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -34063,18 +33774,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #156]\n\t" "adc r4, r4, #0\n\t" /* a[i+40] += m[40] * mu */ "ldr r7, [%[m], #160]\n\t" "ldr r10, [%[a], #160]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -34098,18 +33803,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #160]\n\t" "adc r5, r5, #0\n\t" /* a[i+41] += m[41] * mu */ "ldr r7, [%[m], #164]\n\t" "ldr r10, [%[a], #164]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -34133,18 +33832,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #164]\n\t" "adc r4, r4, #0\n\t" /* a[i+42] += m[42] * mu */ "ldr r7, [%[m], #168]\n\t" "ldr r10, [%[a], #168]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -34168,18 +33861,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #168]\n\t" "adc r5, r5, #0\n\t" /* a[i+43] += m[43] * mu */ "ldr r7, [%[m], #172]\n\t" "ldr r10, [%[a], #172]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -34203,18 +33890,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #172]\n\t" "adc r4, r4, #0\n\t" /* a[i+44] += m[44] * mu */ "ldr r7, [%[m], #176]\n\t" "ldr r10, [%[a], #176]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -34238,18 +33919,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #176]\n\t" "adc r5, r5, #0\n\t" /* a[i+45] += m[45] * mu */ "ldr r7, [%[m], #180]\n\t" "ldr r10, [%[a], #180]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -34273,18 +33948,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #180]\n\t" "adc r4, r4, #0\n\t" /* a[i+46] += m[46] * mu */ "ldr r7, [%[m], #184]\n\t" "ldr r10, [%[a], #184]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -34308,22 +33977,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #184]\n\t" "adc r5, r5, #0\n\t" /* a[i+47] += m[47] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #188]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #188]\n\t" +#else + "ldr r7, [%[m], #188]\n\t" #endif "ldr r10, [%[a], #188]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -34354,13 +34017,429 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #188]\n\t" + "ldr r10, [%[a], #192]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #192]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #0xc0\n\t" + "blt L_sp_3072_mont_reduce_48_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_3072_mont_reduce_48_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r7, [%[m], #48]\n\t" + "ldr r10, [%[a], #48]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r7, [%[m], #52]\n\t" + "ldr r10, [%[a], #52]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #52]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r7, [%[m], #56]\n\t" + "ldr r10, [%[a], #56]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #56]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r7, [%[m], #60]\n\t" + "ldr r10, [%[a], #60]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #60]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r7, [%[m], #64]\n\t" + "ldr r10, [%[a], #64]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #64]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r7, [%[m], #68]\n\t" + "ldr r10, [%[a], #68]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #68]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r7, [%[m], #72]\n\t" + "ldr r10, [%[a], #72]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #72]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r7, [%[m], #76]\n\t" + "ldr r10, [%[a], #76]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #76]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r7, [%[m], #80]\n\t" + "ldr r10, [%[a], #80]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #80]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r7, [%[m], #84]\n\t" + "ldr r10, [%[a], #84]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #84]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r7, [%[m], #88]\n\t" + "ldr r10, [%[a], #88]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #88]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r7, [%[m], #92]\n\t" + "ldr r10, [%[a], #92]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #92]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r7, [%[m], #96]\n\t" + "ldr r10, [%[a], #96]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #96]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r7, [%[m], #100]\n\t" + "ldr r10, [%[a], #100]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #100]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r7, [%[m], #104]\n\t" + "ldr r10, [%[a], #104]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #104]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r7, [%[m], #108]\n\t" + "ldr r10, [%[a], #108]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #108]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r7, [%[m], #112]\n\t" + "ldr r10, [%[a], #112]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #112]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r7, [%[m], #116]\n\t" + "ldr r10, [%[a], #116]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #116]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r7, [%[m], #120]\n\t" + "ldr r10, [%[a], #120]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #120]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r7, [%[m], #124]\n\t" + "ldr r10, [%[a], #124]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #124]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r7, [%[m], #128]\n\t" + "ldr r10, [%[a], #128]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #128]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r7, [%[m], #132]\n\t" + "ldr r10, [%[a], #132]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #132]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r7, [%[m], #136]\n\t" + "ldr r10, [%[a], #136]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #136]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r7, [%[m], #140]\n\t" + "ldr r10, [%[a], #140]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #140]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r7, [%[m], #144]\n\t" + "ldr r10, [%[a], #144]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #144]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r7, [%[m], #148]\n\t" + "ldr r10, [%[a], #148]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #148]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r7, [%[m], #152]\n\t" + "ldr r10, [%[a], #152]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #152]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r7, [%[m], #156]\n\t" + "ldr r10, [%[a], #156]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #156]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r7, [%[m], #160]\n\t" + "ldr r10, [%[a], #160]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #160]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r7, [%[m], #164]\n\t" + "ldr r10, [%[a], #164]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #164]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r7, [%[m], #168]\n\t" + "ldr r10, [%[a], #168]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #168]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r7, [%[m], #172]\n\t" + "ldr r10, [%[a], #172]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #172]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r7, [%[m], #176]\n\t" + "ldr r10, [%[a], #176]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #176]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r7, [%[m], #180]\n\t" + "ldr r10, [%[a], #180]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #180]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r7, [%[m], #184]\n\t" + "ldr r10, [%[a], #184]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #184]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r7, [%[m], #188]\n\t" + "ldr r10, [%[a], #188]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #188]\n\t" "ldr r10, [%[a], #192]\n\t" @@ -34372,16 +34451,303 @@ "add %[a], %[a], #4\n\t" "cmp r9, #0xc0\n\t" "blt L_sp_3072_mont_reduce_48_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp); } +#else +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_3072_mont_reduce_48_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r10, [%[m], #48]\n\t" + "ldr r9, [%[a], #48]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r10, [%[m], #52]\n\t" + "ldr r9, [%[a], #52]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r10, [%[m], #56]\n\t" + "ldr r9, [%[a], #56]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r10, [%[m], #60]\n\t" + "ldr r9, [%[a], #60]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r10, [%[m], #64]\n\t" + "ldr r9, [%[a], #64]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r10, [%[m], #68]\n\t" + "ldr r9, [%[a], #68]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r10, [%[m], #72]\n\t" + "ldr r9, [%[a], #72]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r10, [%[m], #76]\n\t" + "ldr r9, [%[a], #76]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r10, [%[m], #80]\n\t" + "ldr r9, [%[a], #80]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r10, [%[m], #84]\n\t" + "ldr r9, [%[a], #84]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r10, [%[m], #88]\n\t" + "ldr r9, [%[a], #88]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r10, [%[m], #92]\n\t" + "ldr r9, [%[a], #92]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r10, [%[m], #96]\n\t" + "ldr r9, [%[a], #96]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r10, [%[m], #100]\n\t" + "ldr r9, [%[a], #100]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r10, [%[m], #104]\n\t" + "ldr r9, [%[a], #104]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r10, [%[m], #108]\n\t" + "ldr r9, [%[a], #108]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r10, [%[m], #112]\n\t" + "ldr r9, [%[a], #112]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r10, [%[m], #116]\n\t" + "ldr r9, [%[a], #116]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r10, [%[m], #120]\n\t" + "ldr r9, [%[a], #120]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r10, [%[m], #124]\n\t" + "ldr r9, [%[a], #124]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r10, [%[m], #128]\n\t" + "ldr r9, [%[a], #128]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r10, [%[m], #132]\n\t" + "ldr r9, [%[a], #132]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r10, [%[m], #136]\n\t" + "ldr r9, [%[a], #136]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r10, [%[m], #140]\n\t" + "ldr r9, [%[a], #140]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r10, [%[m], #144]\n\t" + "ldr r9, [%[a], #144]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r10, [%[m], #148]\n\t" + "ldr r9, [%[a], #148]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r10, [%[m], #152]\n\t" + "ldr r9, [%[a], #152]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r10, [%[m], #156]\n\t" + "ldr r9, [%[a], #156]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r10, [%[m], #160]\n\t" + "ldr r9, [%[a], #160]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r10, [%[m], #164]\n\t" + "ldr r9, [%[a], #164]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r10, [%[m], #168]\n\t" + "ldr r9, [%[a], #168]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r10, [%[m], #172]\n\t" + "ldr r9, [%[a], #172]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r10, [%[m], #176]\n\t" + "ldr r9, [%[a], #176]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r10, [%[m], #180]\n\t" + "ldr r9, [%[a], #180]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #180]\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r10, [%[m], #184]\n\t" + "ldr r9, [%[a], #184]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #184]\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r10, [%[m], #188]\n\t" + "ldr r9, [%[a], #188]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #192]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #188]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #192]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #0xc0\n\t" + "blt L_sp_3072_mont_reduce_48_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp); +} + +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -34389,7 +34755,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -34403,7 +34769,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -34421,15 +34787,14 @@ */ static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -34462,7 +34827,7 @@ "L_sp_3072_mul_d_48_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -34507,7 +34872,7 @@ "str r3, [%[r], #192]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -34520,15 +34885,14 @@ */ static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -34553,1851 +34917,1483 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[12] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[13] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[14] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[15] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[16] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[17] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[18] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[19] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[20] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[21] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[22] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[23] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[24] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[25] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[26] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[27] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[28] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[29] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[30] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[31] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[32] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[33] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[34] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[35] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[36] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[37] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[38] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[39] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[40] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[41] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[42] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[43] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[44] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[45] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[46] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[47] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -36423,15 +36419,13 @@ "adds r5, r5, r6\n\t" "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r7\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" "str r3, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -36448,9 +36442,9 @@ */ static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -36490,7 +36484,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -36507,9 +36501,9 @@ */ static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -36539,7 +36533,7 @@ "bpl L_div_3072_word_48_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -36567,7 +36561,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -36595,7 +36589,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -36628,7 +36622,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -36643,8 +36637,8 @@ */ static sp_int32 sp_3072_cmp_48(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -37203,7 +37197,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -37217,8 +37211,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[96], t2[49]; sp_digit div, r1; @@ -37258,7 +37252,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_3072_mod_48(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_3072_div_48(a, m, NULL, r); } @@ -37615,10 +37610,10 @@ */ static sp_digit sp_3072_cond_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -37639,7 +37634,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -37655,10 +37650,10 @@ */ static sp_digit sp_3072_cond_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -38001,12 +37996,13 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 3072 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -38015,12 +38011,12 @@ */ static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -38033,10 +38029,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -38060,14 +38055,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -38091,18 +38080,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -38126,17 +38109,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38160,18 +38137,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38195,18 +38166,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38230,18 +38195,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38265,18 +38224,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38300,18 +38253,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38335,18 +38282,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38370,18 +38311,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38405,18 +38340,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ "ldr r7, [%[m], #44]\n\t" "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38440,18 +38369,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "adc r4, r4, #0\n\t" /* a[i+12] += m[12] * mu */ "ldr r7, [%[m], #48]\n\t" "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38475,18 +38398,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #48]\n\t" "adc r5, r5, #0\n\t" /* a[i+13] += m[13] * mu */ "ldr r7, [%[m], #52]\n\t" "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38510,18 +38427,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #52]\n\t" "adc r4, r4, #0\n\t" /* a[i+14] += m[14] * mu */ "ldr r7, [%[m], #56]\n\t" "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38545,18 +38456,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #56]\n\t" "adc r5, r5, #0\n\t" /* a[i+15] += m[15] * mu */ "ldr r7, [%[m], #60]\n\t" "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38580,18 +38485,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #60]\n\t" "adc r4, r4, #0\n\t" /* a[i+16] += m[16] * mu */ "ldr r7, [%[m], #64]\n\t" "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38615,18 +38514,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #64]\n\t" "adc r5, r5, #0\n\t" /* a[i+17] += m[17] * mu */ "ldr r7, [%[m], #68]\n\t" "ldr r10, [%[a], #68]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38650,18 +38543,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #68]\n\t" "adc r4, r4, #0\n\t" /* a[i+18] += m[18] * mu */ "ldr r7, [%[m], #72]\n\t" "ldr r10, [%[a], #72]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38685,18 +38572,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #72]\n\t" "adc r5, r5, #0\n\t" /* a[i+19] += m[19] * mu */ "ldr r7, [%[m], #76]\n\t" "ldr r10, [%[a], #76]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38720,18 +38601,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #76]\n\t" "adc r4, r4, #0\n\t" /* a[i+20] += m[20] * mu */ "ldr r7, [%[m], #80]\n\t" "ldr r10, [%[a], #80]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38755,18 +38630,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #80]\n\t" "adc r5, r5, #0\n\t" /* a[i+21] += m[21] * mu */ "ldr r7, [%[m], #84]\n\t" "ldr r10, [%[a], #84]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38790,18 +38659,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #84]\n\t" "adc r4, r4, #0\n\t" /* a[i+22] += m[22] * mu */ "ldr r7, [%[m], #88]\n\t" "ldr r10, [%[a], #88]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38825,18 +38688,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #88]\n\t" "adc r5, r5, #0\n\t" /* a[i+23] += m[23] * mu */ "ldr r7, [%[m], #92]\n\t" "ldr r10, [%[a], #92]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38860,18 +38717,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #92]\n\t" "adc r4, r4, #0\n\t" /* a[i+24] += m[24] * mu */ "ldr r7, [%[m], #96]\n\t" "ldr r10, [%[a], #96]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38895,18 +38746,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #96]\n\t" "adc r5, r5, #0\n\t" /* a[i+25] += m[25] * mu */ "ldr r7, [%[m], #100]\n\t" "ldr r10, [%[a], #100]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -38930,18 +38775,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #100]\n\t" "adc r4, r4, #0\n\t" /* a[i+26] += m[26] * mu */ "ldr r7, [%[m], #104]\n\t" "ldr r10, [%[a], #104]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -38965,18 +38804,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #104]\n\t" "adc r5, r5, #0\n\t" /* a[i+27] += m[27] * mu */ "ldr r7, [%[m], #108]\n\t" "ldr r10, [%[a], #108]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39000,18 +38833,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #108]\n\t" "adc r4, r4, #0\n\t" /* a[i+28] += m[28] * mu */ "ldr r7, [%[m], #112]\n\t" "ldr r10, [%[a], #112]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39035,18 +38862,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #112]\n\t" "adc r5, r5, #0\n\t" /* a[i+29] += m[29] * mu */ "ldr r7, [%[m], #116]\n\t" "ldr r10, [%[a], #116]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39070,18 +38891,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #116]\n\t" "adc r4, r4, #0\n\t" /* a[i+30] += m[30] * mu */ "ldr r7, [%[m], #120]\n\t" "ldr r10, [%[a], #120]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39105,18 +38920,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #120]\n\t" "adc r5, r5, #0\n\t" /* a[i+31] += m[31] * mu */ "ldr r7, [%[m], #124]\n\t" "ldr r10, [%[a], #124]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39140,18 +38949,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #124]\n\t" "adc r4, r4, #0\n\t" /* a[i+32] += m[32] * mu */ "ldr r7, [%[m], #128]\n\t" "ldr r10, [%[a], #128]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39175,18 +38978,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #128]\n\t" "adc r5, r5, #0\n\t" /* a[i+33] += m[33] * mu */ "ldr r7, [%[m], #132]\n\t" "ldr r10, [%[a], #132]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39210,18 +39007,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #132]\n\t" "adc r4, r4, #0\n\t" /* a[i+34] += m[34] * mu */ "ldr r7, [%[m], #136]\n\t" "ldr r10, [%[a], #136]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39245,18 +39036,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #136]\n\t" "adc r5, r5, #0\n\t" /* a[i+35] += m[35] * mu */ "ldr r7, [%[m], #140]\n\t" "ldr r10, [%[a], #140]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39280,18 +39065,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #140]\n\t" "adc r4, r4, #0\n\t" /* a[i+36] += m[36] * mu */ "ldr r7, [%[m], #144]\n\t" "ldr r10, [%[a], #144]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39315,18 +39094,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #144]\n\t" "adc r5, r5, #0\n\t" /* a[i+37] += m[37] * mu */ "ldr r7, [%[m], #148]\n\t" "ldr r10, [%[a], #148]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39350,18 +39123,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #148]\n\t" "adc r4, r4, #0\n\t" /* a[i+38] += m[38] * mu */ "ldr r7, [%[m], #152]\n\t" "ldr r10, [%[a], #152]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39385,18 +39152,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #152]\n\t" "adc r5, r5, #0\n\t" /* a[i+39] += m[39] * mu */ "ldr r7, [%[m], #156]\n\t" "ldr r10, [%[a], #156]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39420,18 +39181,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #156]\n\t" "adc r4, r4, #0\n\t" /* a[i+40] += m[40] * mu */ "ldr r7, [%[m], #160]\n\t" "ldr r10, [%[a], #160]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39455,18 +39210,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #160]\n\t" "adc r5, r5, #0\n\t" /* a[i+41] += m[41] * mu */ "ldr r7, [%[m], #164]\n\t" "ldr r10, [%[a], #164]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39490,18 +39239,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #164]\n\t" "adc r4, r4, #0\n\t" /* a[i+42] += m[42] * mu */ "ldr r7, [%[m], #168]\n\t" "ldr r10, [%[a], #168]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39525,18 +39268,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #168]\n\t" "adc r5, r5, #0\n\t" /* a[i+43] += m[43] * mu */ "ldr r7, [%[m], #172]\n\t" "ldr r10, [%[a], #172]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39560,18 +39297,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #172]\n\t" "adc r4, r4, #0\n\t" /* a[i+44] += m[44] * mu */ "ldr r7, [%[m], #176]\n\t" "ldr r10, [%[a], #176]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39595,18 +39326,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #176]\n\t" "adc r5, r5, #0\n\t" /* a[i+45] += m[45] * mu */ "ldr r7, [%[m], #180]\n\t" "ldr r10, [%[a], #180]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39630,18 +39355,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #180]\n\t" "adc r4, r4, #0\n\t" /* a[i+46] += m[46] * mu */ "ldr r7, [%[m], #184]\n\t" "ldr r10, [%[a], #184]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39665,18 +39384,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #184]\n\t" "adc r5, r5, #0\n\t" /* a[i+47] += m[47] * mu */ "ldr r7, [%[m], #188]\n\t" "ldr r10, [%[a], #188]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39700,18 +39413,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #188]\n\t" "adc r4, r4, #0\n\t" /* a[i+48] += m[48] * mu */ "ldr r7, [%[m], #192]\n\t" "ldr r10, [%[a], #192]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39735,18 +39442,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #192]\n\t" "adc r5, r5, #0\n\t" /* a[i+49] += m[49] * mu */ "ldr r7, [%[m], #196]\n\t" "ldr r10, [%[a], #196]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39770,18 +39471,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #196]\n\t" "adc r4, r4, #0\n\t" /* a[i+50] += m[50] * mu */ "ldr r7, [%[m], #200]\n\t" "ldr r10, [%[a], #200]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39805,18 +39500,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #200]\n\t" "adc r5, r5, #0\n\t" /* a[i+51] += m[51] * mu */ "ldr r7, [%[m], #204]\n\t" "ldr r10, [%[a], #204]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39840,18 +39529,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #204]\n\t" "adc r4, r4, #0\n\t" /* a[i+52] += m[52] * mu */ "ldr r7, [%[m], #208]\n\t" "ldr r10, [%[a], #208]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39875,18 +39558,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #208]\n\t" "adc r5, r5, #0\n\t" /* a[i+53] += m[53] * mu */ "ldr r7, [%[m], #212]\n\t" "ldr r10, [%[a], #212]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39910,18 +39587,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #212]\n\t" "adc r4, r4, #0\n\t" /* a[i+54] += m[54] * mu */ "ldr r7, [%[m], #216]\n\t" "ldr r10, [%[a], #216]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -39945,18 +39616,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #216]\n\t" "adc r5, r5, #0\n\t" /* a[i+55] += m[55] * mu */ "ldr r7, [%[m], #220]\n\t" "ldr r10, [%[a], #220]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -39980,18 +39645,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #220]\n\t" "adc r4, r4, #0\n\t" /* a[i+56] += m[56] * mu */ "ldr r7, [%[m], #224]\n\t" "ldr r10, [%[a], #224]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40015,18 +39674,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #224]\n\t" "adc r5, r5, #0\n\t" /* a[i+57] += m[57] * mu */ "ldr r7, [%[m], #228]\n\t" "ldr r10, [%[a], #228]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40050,18 +39703,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #228]\n\t" "adc r4, r4, #0\n\t" /* a[i+58] += m[58] * mu */ "ldr r7, [%[m], #232]\n\t" "ldr r10, [%[a], #232]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40085,18 +39732,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #232]\n\t" "adc r5, r5, #0\n\t" /* a[i+59] += m[59] * mu */ "ldr r7, [%[m], #236]\n\t" "ldr r10, [%[a], #236]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40120,18 +39761,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #236]\n\t" "adc r4, r4, #0\n\t" /* a[i+60] += m[60] * mu */ "ldr r7, [%[m], #240]\n\t" "ldr r10, [%[a], #240]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40155,18 +39790,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #240]\n\t" "adc r5, r5, #0\n\t" /* a[i+61] += m[61] * mu */ "ldr r7, [%[m], #244]\n\t" "ldr r10, [%[a], #244]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40190,18 +39819,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #244]\n\t" "adc r4, r4, #0\n\t" /* a[i+62] += m[62] * mu */ "ldr r7, [%[m], #248]\n\t" "ldr r10, [%[a], #248]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40225,18 +39848,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #248]\n\t" "adc r5, r5, #0\n\t" /* a[i+63] += m[63] * mu */ "ldr r7, [%[m], #252]\n\t" "ldr r10, [%[a], #252]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40260,18 +39877,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #252]\n\t" "adc r4, r4, #0\n\t" /* a[i+64] += m[64] * mu */ "ldr r7, [%[m], #256]\n\t" "ldr r10, [%[a], #256]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40295,18 +39906,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #256]\n\t" "adc r5, r5, #0\n\t" /* a[i+65] += m[65] * mu */ "ldr r7, [%[m], #260]\n\t" "ldr r10, [%[a], #260]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40330,18 +39935,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #260]\n\t" "adc r4, r4, #0\n\t" /* a[i+66] += m[66] * mu */ "ldr r7, [%[m], #264]\n\t" "ldr r10, [%[a], #264]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40365,18 +39964,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #264]\n\t" "adc r5, r5, #0\n\t" /* a[i+67] += m[67] * mu */ "ldr r7, [%[m], #268]\n\t" "ldr r10, [%[a], #268]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40400,18 +39993,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #268]\n\t" "adc r4, r4, #0\n\t" /* a[i+68] += m[68] * mu */ "ldr r7, [%[m], #272]\n\t" "ldr r10, [%[a], #272]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40435,18 +40022,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #272]\n\t" "adc r5, r5, #0\n\t" /* a[i+69] += m[69] * mu */ "ldr r7, [%[m], #276]\n\t" "ldr r10, [%[a], #276]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40470,18 +40051,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #276]\n\t" "adc r4, r4, #0\n\t" /* a[i+70] += m[70] * mu */ "ldr r7, [%[m], #280]\n\t" "ldr r10, [%[a], #280]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40505,18 +40080,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #280]\n\t" "adc r5, r5, #0\n\t" /* a[i+71] += m[71] * mu */ "ldr r7, [%[m], #284]\n\t" "ldr r10, [%[a], #284]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40540,18 +40109,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #284]\n\t" "adc r4, r4, #0\n\t" /* a[i+72] += m[72] * mu */ "ldr r7, [%[m], #288]\n\t" "ldr r10, [%[a], #288]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40575,18 +40138,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #288]\n\t" "adc r5, r5, #0\n\t" /* a[i+73] += m[73] * mu */ "ldr r7, [%[m], #292]\n\t" "ldr r10, [%[a], #292]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40610,18 +40167,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #292]\n\t" "adc r4, r4, #0\n\t" /* a[i+74] += m[74] * mu */ "ldr r7, [%[m], #296]\n\t" "ldr r10, [%[a], #296]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40645,18 +40196,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #296]\n\t" "adc r5, r5, #0\n\t" /* a[i+75] += m[75] * mu */ "ldr r7, [%[m], #300]\n\t" "ldr r10, [%[a], #300]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40680,18 +40225,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #300]\n\t" "adc r4, r4, #0\n\t" /* a[i+76] += m[76] * mu */ "ldr r7, [%[m], #304]\n\t" "ldr r10, [%[a], #304]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40715,18 +40254,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #304]\n\t" "adc r5, r5, #0\n\t" /* a[i+77] += m[77] * mu */ "ldr r7, [%[m], #308]\n\t" "ldr r10, [%[a], #308]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40750,18 +40283,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #308]\n\t" "adc r4, r4, #0\n\t" /* a[i+78] += m[78] * mu */ "ldr r7, [%[m], #312]\n\t" "ldr r10, [%[a], #312]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40785,18 +40312,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #312]\n\t" "adc r5, r5, #0\n\t" /* a[i+79] += m[79] * mu */ "ldr r7, [%[m], #316]\n\t" "ldr r10, [%[a], #316]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40820,18 +40341,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #316]\n\t" "adc r4, r4, #0\n\t" /* a[i+80] += m[80] * mu */ "ldr r7, [%[m], #320]\n\t" "ldr r10, [%[a], #320]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40855,18 +40370,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #320]\n\t" "adc r5, r5, #0\n\t" /* a[i+81] += m[81] * mu */ "ldr r7, [%[m], #324]\n\t" "ldr r10, [%[a], #324]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40890,18 +40399,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #324]\n\t" "adc r4, r4, #0\n\t" /* a[i+82] += m[82] * mu */ "ldr r7, [%[m], #328]\n\t" "ldr r10, [%[a], #328]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40925,18 +40428,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #328]\n\t" "adc r5, r5, #0\n\t" /* a[i+83] += m[83] * mu */ "ldr r7, [%[m], #332]\n\t" "ldr r10, [%[a], #332]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -40960,18 +40457,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #332]\n\t" "adc r4, r4, #0\n\t" /* a[i+84] += m[84] * mu */ "ldr r7, [%[m], #336]\n\t" "ldr r10, [%[a], #336]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -40995,18 +40486,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #336]\n\t" "adc r5, r5, #0\n\t" /* a[i+85] += m[85] * mu */ "ldr r7, [%[m], #340]\n\t" "ldr r10, [%[a], #340]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -41030,18 +40515,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #340]\n\t" "adc r4, r4, #0\n\t" /* a[i+86] += m[86] * mu */ "ldr r7, [%[m], #344]\n\t" "ldr r10, [%[a], #344]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -41065,18 +40544,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #344]\n\t" "adc r5, r5, #0\n\t" /* a[i+87] += m[87] * mu */ "ldr r7, [%[m], #348]\n\t" "ldr r10, [%[a], #348]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -41100,18 +40573,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #348]\n\t" "adc r4, r4, #0\n\t" /* a[i+88] += m[88] * mu */ "ldr r7, [%[m], #352]\n\t" "ldr r10, [%[a], #352]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -41135,18 +40602,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #352]\n\t" "adc r5, r5, #0\n\t" /* a[i+89] += m[89] * mu */ "ldr r7, [%[m], #356]\n\t" "ldr r10, [%[a], #356]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -41170,18 +40631,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #356]\n\t" "adc r4, r4, #0\n\t" /* a[i+90] += m[90] * mu */ "ldr r7, [%[m], #360]\n\t" "ldr r10, [%[a], #360]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -41205,18 +40660,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #360]\n\t" "adc r5, r5, #0\n\t" /* a[i+91] += m[91] * mu */ "ldr r7, [%[m], #364]\n\t" "ldr r10, [%[a], #364]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -41240,18 +40689,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #364]\n\t" "adc r4, r4, #0\n\t" /* a[i+92] += m[92] * mu */ "ldr r7, [%[m], #368]\n\t" "ldr r10, [%[a], #368]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -41275,18 +40718,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #368]\n\t" "adc r5, r5, #0\n\t" /* a[i+93] += m[93] * mu */ "ldr r7, [%[m], #372]\n\t" "ldr r10, [%[a], #372]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -41310,18 +40747,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #372]\n\t" "adc r4, r4, #0\n\t" /* a[i+94] += m[94] * mu */ "ldr r7, [%[m], #376]\n\t" "ldr r10, [%[a], #376]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -41345,22 +40776,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #376]\n\t" "adc r5, r5, #0\n\t" /* a[i+95] += m[95] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #380]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #380]\n\t" +#else + "ldr r7, [%[m], #380]\n\t" #endif "ldr r10, [%[a], #380]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -41391,13 +40816,813 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #380]\n\t" + "ldr r10, [%[a], #384]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #384]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #0x180\n\t" + "blt L_sp_3072_mont_reduce_96_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_3072_mont_reduce_96_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r7, [%[m], #48]\n\t" + "ldr r10, [%[a], #48]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r7, [%[m], #52]\n\t" + "ldr r10, [%[a], #52]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #52]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r7, [%[m], #56]\n\t" + "ldr r10, [%[a], #56]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #56]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r7, [%[m], #60]\n\t" + "ldr r10, [%[a], #60]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #60]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r7, [%[m], #64]\n\t" + "ldr r10, [%[a], #64]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #64]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r7, [%[m], #68]\n\t" + "ldr r10, [%[a], #68]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #68]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r7, [%[m], #72]\n\t" + "ldr r10, [%[a], #72]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #72]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r7, [%[m], #76]\n\t" + "ldr r10, [%[a], #76]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #76]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r7, [%[m], #80]\n\t" + "ldr r10, [%[a], #80]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #80]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r7, [%[m], #84]\n\t" + "ldr r10, [%[a], #84]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #84]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r7, [%[m], #88]\n\t" + "ldr r10, [%[a], #88]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #88]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r7, [%[m], #92]\n\t" + "ldr r10, [%[a], #92]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #92]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r7, [%[m], #96]\n\t" + "ldr r10, [%[a], #96]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #96]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r7, [%[m], #100]\n\t" + "ldr r10, [%[a], #100]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #100]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r7, [%[m], #104]\n\t" + "ldr r10, [%[a], #104]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #104]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r7, [%[m], #108]\n\t" + "ldr r10, [%[a], #108]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #108]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r7, [%[m], #112]\n\t" + "ldr r10, [%[a], #112]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #112]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r7, [%[m], #116]\n\t" + "ldr r10, [%[a], #116]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #116]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r7, [%[m], #120]\n\t" + "ldr r10, [%[a], #120]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #120]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r7, [%[m], #124]\n\t" + "ldr r10, [%[a], #124]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #124]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r7, [%[m], #128]\n\t" + "ldr r10, [%[a], #128]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #128]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r7, [%[m], #132]\n\t" + "ldr r10, [%[a], #132]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #132]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r7, [%[m], #136]\n\t" + "ldr r10, [%[a], #136]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #136]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r7, [%[m], #140]\n\t" + "ldr r10, [%[a], #140]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #140]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r7, [%[m], #144]\n\t" + "ldr r10, [%[a], #144]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #144]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r7, [%[m], #148]\n\t" + "ldr r10, [%[a], #148]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #148]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r7, [%[m], #152]\n\t" + "ldr r10, [%[a], #152]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #152]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r7, [%[m], #156]\n\t" + "ldr r10, [%[a], #156]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #156]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r7, [%[m], #160]\n\t" + "ldr r10, [%[a], #160]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #160]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r7, [%[m], #164]\n\t" + "ldr r10, [%[a], #164]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #164]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r7, [%[m], #168]\n\t" + "ldr r10, [%[a], #168]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #168]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r7, [%[m], #172]\n\t" + "ldr r10, [%[a], #172]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #172]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r7, [%[m], #176]\n\t" + "ldr r10, [%[a], #176]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #176]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r7, [%[m], #180]\n\t" + "ldr r10, [%[a], #180]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #180]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r7, [%[m], #184]\n\t" + "ldr r10, [%[a], #184]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #184]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r7, [%[m], #188]\n\t" + "ldr r10, [%[a], #188]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #188]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+48] += m[48] * mu */ + "ldr r7, [%[m], #192]\n\t" + "ldr r10, [%[a], #192]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #192]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+49] += m[49] * mu */ + "ldr r7, [%[m], #196]\n\t" + "ldr r10, [%[a], #196]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #196]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+50] += m[50] * mu */ + "ldr r7, [%[m], #200]\n\t" + "ldr r10, [%[a], #200]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #200]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+51] += m[51] * mu */ + "ldr r7, [%[m], #204]\n\t" + "ldr r10, [%[a], #204]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #204]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+52] += m[52] * mu */ + "ldr r7, [%[m], #208]\n\t" + "ldr r10, [%[a], #208]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #208]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+53] += m[53] * mu */ + "ldr r7, [%[m], #212]\n\t" + "ldr r10, [%[a], #212]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #212]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+54] += m[54] * mu */ + "ldr r7, [%[m], #216]\n\t" + "ldr r10, [%[a], #216]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #216]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+55] += m[55] * mu */ + "ldr r7, [%[m], #220]\n\t" + "ldr r10, [%[a], #220]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #220]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+56] += m[56] * mu */ + "ldr r7, [%[m], #224]\n\t" + "ldr r10, [%[a], #224]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #224]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+57] += m[57] * mu */ + "ldr r7, [%[m], #228]\n\t" + "ldr r10, [%[a], #228]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #228]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+58] += m[58] * mu */ + "ldr r7, [%[m], #232]\n\t" + "ldr r10, [%[a], #232]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #232]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+59] += m[59] * mu */ + "ldr r7, [%[m], #236]\n\t" + "ldr r10, [%[a], #236]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #236]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+60] += m[60] * mu */ + "ldr r7, [%[m], #240]\n\t" + "ldr r10, [%[a], #240]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #240]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+61] += m[61] * mu */ + "ldr r7, [%[m], #244]\n\t" + "ldr r10, [%[a], #244]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #244]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+62] += m[62] * mu */ + "ldr r7, [%[m], #248]\n\t" + "ldr r10, [%[a], #248]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #248]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+63] += m[63] * mu */ + "ldr r7, [%[m], #252]\n\t" + "ldr r10, [%[a], #252]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #252]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+64] += m[64] * mu */ + "ldr r7, [%[m], #256]\n\t" + "ldr r10, [%[a], #256]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #256]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+65] += m[65] * mu */ + "ldr r7, [%[m], #260]\n\t" + "ldr r10, [%[a], #260]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #260]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+66] += m[66] * mu */ + "ldr r7, [%[m], #264]\n\t" + "ldr r10, [%[a], #264]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #264]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+67] += m[67] * mu */ + "ldr r7, [%[m], #268]\n\t" + "ldr r10, [%[a], #268]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #268]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+68] += m[68] * mu */ + "ldr r7, [%[m], #272]\n\t" + "ldr r10, [%[a], #272]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #272]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+69] += m[69] * mu */ + "ldr r7, [%[m], #276]\n\t" + "ldr r10, [%[a], #276]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #276]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+70] += m[70] * mu */ + "ldr r7, [%[m], #280]\n\t" + "ldr r10, [%[a], #280]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #280]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+71] += m[71] * mu */ + "ldr r7, [%[m], #284]\n\t" + "ldr r10, [%[a], #284]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #284]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+72] += m[72] * mu */ + "ldr r7, [%[m], #288]\n\t" + "ldr r10, [%[a], #288]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #288]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+73] += m[73] * mu */ + "ldr r7, [%[m], #292]\n\t" + "ldr r10, [%[a], #292]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #292]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+74] += m[74] * mu */ + "ldr r7, [%[m], #296]\n\t" + "ldr r10, [%[a], #296]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #296]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+75] += m[75] * mu */ + "ldr r7, [%[m], #300]\n\t" + "ldr r10, [%[a], #300]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #300]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+76] += m[76] * mu */ + "ldr r7, [%[m], #304]\n\t" + "ldr r10, [%[a], #304]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #304]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+77] += m[77] * mu */ + "ldr r7, [%[m], #308]\n\t" + "ldr r10, [%[a], #308]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #308]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+78] += m[78] * mu */ + "ldr r7, [%[m], #312]\n\t" + "ldr r10, [%[a], #312]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #312]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+79] += m[79] * mu */ + "ldr r7, [%[m], #316]\n\t" + "ldr r10, [%[a], #316]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #316]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+80] += m[80] * mu */ + "ldr r7, [%[m], #320]\n\t" + "ldr r10, [%[a], #320]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #320]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+81] += m[81] * mu */ + "ldr r7, [%[m], #324]\n\t" + "ldr r10, [%[a], #324]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #324]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+82] += m[82] * mu */ + "ldr r7, [%[m], #328]\n\t" + "ldr r10, [%[a], #328]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #328]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+83] += m[83] * mu */ + "ldr r7, [%[m], #332]\n\t" + "ldr r10, [%[a], #332]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #332]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+84] += m[84] * mu */ + "ldr r7, [%[m], #336]\n\t" + "ldr r10, [%[a], #336]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #336]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+85] += m[85] * mu */ + "ldr r7, [%[m], #340]\n\t" + "ldr r10, [%[a], #340]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #340]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+86] += m[86] * mu */ + "ldr r7, [%[m], #344]\n\t" + "ldr r10, [%[a], #344]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #344]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+87] += m[87] * mu */ + "ldr r7, [%[m], #348]\n\t" + "ldr r10, [%[a], #348]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #348]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+88] += m[88] * mu */ + "ldr r7, [%[m], #352]\n\t" + "ldr r10, [%[a], #352]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #352]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+89] += m[89] * mu */ + "ldr r7, [%[m], #356]\n\t" + "ldr r10, [%[a], #356]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #356]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+90] += m[90] * mu */ + "ldr r7, [%[m], #360]\n\t" + "ldr r10, [%[a], #360]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #360]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+91] += m[91] * mu */ + "ldr r7, [%[m], #364]\n\t" + "ldr r10, [%[a], #364]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #364]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+92] += m[92] * mu */ + "ldr r7, [%[m], #368]\n\t" + "ldr r10, [%[a], #368]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #368]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+93] += m[93] * mu */ + "ldr r7, [%[m], #372]\n\t" + "ldr r10, [%[a], #372]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #372]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+94] += m[94] * mu */ + "ldr r7, [%[m], #376]\n\t" + "ldr r10, [%[a], #376]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #376]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+95] += m[95] * mu */ + "ldr r7, [%[m], #380]\n\t" + "ldr r10, [%[a], #380]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #380]\n\t" "ldr r10, [%[a], #384]\n\t" @@ -41409,16 +41634,543 @@ "add %[a], %[a], #4\n\t" "cmp r9, #0x180\n\t" "blt L_sp_3072_mont_reduce_96_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_3072_mont_reduce_96_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r10, [%[m], #48]\n\t" + "ldr r9, [%[a], #48]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r10, [%[m], #52]\n\t" + "ldr r9, [%[a], #52]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r10, [%[m], #56]\n\t" + "ldr r9, [%[a], #56]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r10, [%[m], #60]\n\t" + "ldr r9, [%[a], #60]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r10, [%[m], #64]\n\t" + "ldr r9, [%[a], #64]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r10, [%[m], #68]\n\t" + "ldr r9, [%[a], #68]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r10, [%[m], #72]\n\t" + "ldr r9, [%[a], #72]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r10, [%[m], #76]\n\t" + "ldr r9, [%[a], #76]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r10, [%[m], #80]\n\t" + "ldr r9, [%[a], #80]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r10, [%[m], #84]\n\t" + "ldr r9, [%[a], #84]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r10, [%[m], #88]\n\t" + "ldr r9, [%[a], #88]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r10, [%[m], #92]\n\t" + "ldr r9, [%[a], #92]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r10, [%[m], #96]\n\t" + "ldr r9, [%[a], #96]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r10, [%[m], #100]\n\t" + "ldr r9, [%[a], #100]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r10, [%[m], #104]\n\t" + "ldr r9, [%[a], #104]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r10, [%[m], #108]\n\t" + "ldr r9, [%[a], #108]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r10, [%[m], #112]\n\t" + "ldr r9, [%[a], #112]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r10, [%[m], #116]\n\t" + "ldr r9, [%[a], #116]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r10, [%[m], #120]\n\t" + "ldr r9, [%[a], #120]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r10, [%[m], #124]\n\t" + "ldr r9, [%[a], #124]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r10, [%[m], #128]\n\t" + "ldr r9, [%[a], #128]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r10, [%[m], #132]\n\t" + "ldr r9, [%[a], #132]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r10, [%[m], #136]\n\t" + "ldr r9, [%[a], #136]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r10, [%[m], #140]\n\t" + "ldr r9, [%[a], #140]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r10, [%[m], #144]\n\t" + "ldr r9, [%[a], #144]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r10, [%[m], #148]\n\t" + "ldr r9, [%[a], #148]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r10, [%[m], #152]\n\t" + "ldr r9, [%[a], #152]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r10, [%[m], #156]\n\t" + "ldr r9, [%[a], #156]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r10, [%[m], #160]\n\t" + "ldr r9, [%[a], #160]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r10, [%[m], #164]\n\t" + "ldr r9, [%[a], #164]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r10, [%[m], #168]\n\t" + "ldr r9, [%[a], #168]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r10, [%[m], #172]\n\t" + "ldr r9, [%[a], #172]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r10, [%[m], #176]\n\t" + "ldr r9, [%[a], #176]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r10, [%[m], #180]\n\t" + "ldr r9, [%[a], #180]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #180]\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r10, [%[m], #184]\n\t" + "ldr r9, [%[a], #184]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #184]\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r10, [%[m], #188]\n\t" + "ldr r9, [%[a], #188]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #188]\n\t" + /* a[i+48] += m[48] * mu */ + "ldr r10, [%[m], #192]\n\t" + "ldr r9, [%[a], #192]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #192]\n\t" + /* a[i+49] += m[49] * mu */ + "ldr r10, [%[m], #196]\n\t" + "ldr r9, [%[a], #196]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #196]\n\t" + /* a[i+50] += m[50] * mu */ + "ldr r10, [%[m], #200]\n\t" + "ldr r9, [%[a], #200]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #200]\n\t" + /* a[i+51] += m[51] * mu */ + "ldr r10, [%[m], #204]\n\t" + "ldr r9, [%[a], #204]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #204]\n\t" + /* a[i+52] += m[52] * mu */ + "ldr r10, [%[m], #208]\n\t" + "ldr r9, [%[a], #208]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #208]\n\t" + /* a[i+53] += m[53] * mu */ + "ldr r10, [%[m], #212]\n\t" + "ldr r9, [%[a], #212]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #212]\n\t" + /* a[i+54] += m[54] * mu */ + "ldr r10, [%[m], #216]\n\t" + "ldr r9, [%[a], #216]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #216]\n\t" + /* a[i+55] += m[55] * mu */ + "ldr r10, [%[m], #220]\n\t" + "ldr r9, [%[a], #220]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #220]\n\t" + /* a[i+56] += m[56] * mu */ + "ldr r10, [%[m], #224]\n\t" + "ldr r9, [%[a], #224]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #224]\n\t" + /* a[i+57] += m[57] * mu */ + "ldr r10, [%[m], #228]\n\t" + "ldr r9, [%[a], #228]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #228]\n\t" + /* a[i+58] += m[58] * mu */ + "ldr r10, [%[m], #232]\n\t" + "ldr r9, [%[a], #232]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #232]\n\t" + /* a[i+59] += m[59] * mu */ + "ldr r10, [%[m], #236]\n\t" + "ldr r9, [%[a], #236]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #236]\n\t" + /* a[i+60] += m[60] * mu */ + "ldr r10, [%[m], #240]\n\t" + "ldr r9, [%[a], #240]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #240]\n\t" + /* a[i+61] += m[61] * mu */ + "ldr r10, [%[m], #244]\n\t" + "ldr r9, [%[a], #244]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #244]\n\t" + /* a[i+62] += m[62] * mu */ + "ldr r10, [%[m], #248]\n\t" + "ldr r9, [%[a], #248]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #248]\n\t" + /* a[i+63] += m[63] * mu */ + "ldr r10, [%[m], #252]\n\t" + "ldr r9, [%[a], #252]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #252]\n\t" + /* a[i+64] += m[64] * mu */ + "ldr r10, [%[m], #256]\n\t" + "ldr r9, [%[a], #256]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #256]\n\t" + /* a[i+65] += m[65] * mu */ + "ldr r10, [%[m], #260]\n\t" + "ldr r9, [%[a], #260]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #260]\n\t" + /* a[i+66] += m[66] * mu */ + "ldr r10, [%[m], #264]\n\t" + "ldr r9, [%[a], #264]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #264]\n\t" + /* a[i+67] += m[67] * mu */ + "ldr r10, [%[m], #268]\n\t" + "ldr r9, [%[a], #268]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #268]\n\t" + /* a[i+68] += m[68] * mu */ + "ldr r10, [%[m], #272]\n\t" + "ldr r9, [%[a], #272]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #272]\n\t" + /* a[i+69] += m[69] * mu */ + "ldr r10, [%[m], #276]\n\t" + "ldr r9, [%[a], #276]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #276]\n\t" + /* a[i+70] += m[70] * mu */ + "ldr r10, [%[m], #280]\n\t" + "ldr r9, [%[a], #280]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #280]\n\t" + /* a[i+71] += m[71] * mu */ + "ldr r10, [%[m], #284]\n\t" + "ldr r9, [%[a], #284]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #284]\n\t" + /* a[i+72] += m[72] * mu */ + "ldr r10, [%[m], #288]\n\t" + "ldr r9, [%[a], #288]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #288]\n\t" + /* a[i+73] += m[73] * mu */ + "ldr r10, [%[m], #292]\n\t" + "ldr r9, [%[a], #292]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #292]\n\t" + /* a[i+74] += m[74] * mu */ + "ldr r10, [%[m], #296]\n\t" + "ldr r9, [%[a], #296]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #296]\n\t" + /* a[i+75] += m[75] * mu */ + "ldr r10, [%[m], #300]\n\t" + "ldr r9, [%[a], #300]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #300]\n\t" + /* a[i+76] += m[76] * mu */ + "ldr r10, [%[m], #304]\n\t" + "ldr r9, [%[a], #304]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #304]\n\t" + /* a[i+77] += m[77] * mu */ + "ldr r10, [%[m], #308]\n\t" + "ldr r9, [%[a], #308]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #308]\n\t" + /* a[i+78] += m[78] * mu */ + "ldr r10, [%[m], #312]\n\t" + "ldr r9, [%[a], #312]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #312]\n\t" + /* a[i+79] += m[79] * mu */ + "ldr r10, [%[m], #316]\n\t" + "ldr r9, [%[a], #316]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #316]\n\t" + /* a[i+80] += m[80] * mu */ + "ldr r10, [%[m], #320]\n\t" + "ldr r9, [%[a], #320]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #320]\n\t" + /* a[i+81] += m[81] * mu */ + "ldr r10, [%[m], #324]\n\t" + "ldr r9, [%[a], #324]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #324]\n\t" + /* a[i+82] += m[82] * mu */ + "ldr r10, [%[m], #328]\n\t" + "ldr r9, [%[a], #328]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #328]\n\t" + /* a[i+83] += m[83] * mu */ + "ldr r10, [%[m], #332]\n\t" + "ldr r9, [%[a], #332]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #332]\n\t" + /* a[i+84] += m[84] * mu */ + "ldr r10, [%[m], #336]\n\t" + "ldr r9, [%[a], #336]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #336]\n\t" + /* a[i+85] += m[85] * mu */ + "ldr r10, [%[m], #340]\n\t" + "ldr r9, [%[a], #340]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #340]\n\t" + /* a[i+86] += m[86] * mu */ + "ldr r10, [%[m], #344]\n\t" + "ldr r9, [%[a], #344]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #344]\n\t" + /* a[i+87] += m[87] * mu */ + "ldr r10, [%[m], #348]\n\t" + "ldr r9, [%[a], #348]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #348]\n\t" + /* a[i+88] += m[88] * mu */ + "ldr r10, [%[m], #352]\n\t" + "ldr r9, [%[a], #352]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #352]\n\t" + /* a[i+89] += m[89] * mu */ + "ldr r10, [%[m], #356]\n\t" + "ldr r9, [%[a], #356]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #356]\n\t" + /* a[i+90] += m[90] * mu */ + "ldr r10, [%[m], #360]\n\t" + "ldr r9, [%[a], #360]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #360]\n\t" + /* a[i+91] += m[91] * mu */ + "ldr r10, [%[m], #364]\n\t" + "ldr r9, [%[a], #364]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #364]\n\t" + /* a[i+92] += m[92] * mu */ + "ldr r10, [%[m], #368]\n\t" + "ldr r9, [%[a], #368]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #368]\n\t" + /* a[i+93] += m[93] * mu */ + "ldr r10, [%[m], #372]\n\t" + "ldr r9, [%[a], #372]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #372]\n\t" + /* a[i+94] += m[94] * mu */ + "ldr r10, [%[m], #376]\n\t" + "ldr r9, [%[a], #376]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #376]\n\t" + /* a[i+95] += m[95] * mu */ + "ldr r10, [%[m], #380]\n\t" + "ldr r9, [%[a], #380]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #384]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #380]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #384]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #0x180\n\t" + "blt L_sp_3072_mont_reduce_96_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -41426,7 +42178,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -41440,7 +42192,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -41458,9 +42210,9 @@ */ static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r12, #0\n\t" @@ -41481,7 +42233,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc" ); return (uint32_t)(size_t)r; } @@ -41495,9 +42247,9 @@ */ static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -41671,7 +42423,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -41689,9 +42441,9 @@ */ static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -41731,7 +42483,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -41748,9 +42500,9 @@ */ static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -41780,7 +42532,7 @@ "bpl L_div_3072_word_96_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -41808,7 +42560,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -41836,7 +42588,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -41869,7 +42621,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -41884,8 +42636,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[192], t2[97]; sp_digit div, r1; @@ -41941,7 +42693,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_3072_mod_96_cond(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_3072_div_96_cond(a, m, NULL, r); } @@ -41987,8 +42740,8 @@ */ static sp_int32 sp_3072_cmp_96(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -41996,7 +42749,7 @@ "mov r5, #0\n\t" "mov r3, #-1\n\t" #ifdef WOLFSSL_SP_SMALL -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r4, #0x1\n\t" "lsl r4, r4, #8\n\t" "add r4, r4, #0x7c\n\t" @@ -43081,7 +43834,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -43095,8 +43848,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[192], t2[97]; sp_digit div, r1; @@ -43136,7 +43889,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_3072_mod_96(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_3072_div_96(a, m, NULL, r); } @@ -43616,10 +44370,10 @@ */ static sp_digit sp_3072_cond_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -43640,7 +44394,7 @@ "mov %[r], lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -43656,10 +44410,10 @@ */ static sp_digit sp_3072_cond_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r8, #0\n\t" @@ -43834,7 +44588,7 @@ "adc %[r], r8, r8\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -44156,9 +44910,9 @@ #ifdef HAVE_FFDHE_3072 static void sp_3072_lshift_96(sp_digit* r_p, const sp_digit* a_p, byte n_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register byte n asm ("r2") = n_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register byte n asm ("r2") = (byte)n_p; __asm__ __volatile__ ( "rsb r12, %[n], #31\n\t" @@ -44740,7 +45494,7 @@ "str r4, [%[r], #4]\n\t" : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : "memory", "r4", "r5", "r6", "r3", "r12" + : "memory", "r4", "r5", "r6", "r3", "r12", "cc" ); } @@ -45042,14 +45796,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -45161,8 +45915,8 @@ */ static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -45392,7 +46146,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -45405,12 +46159,11 @@ */ static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -45635,10 +46388,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -45728,9 +46482,9 @@ */ static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -45752,7 +46506,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -45766,16 +46520,15 @@ */ static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #0x200\n\t" "\n" "L_sp_4096_sub_in_pkace_128_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -45783,13 +46536,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_4096_sub_in_pkace_128_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -45804,16 +46557,19 @@ */ static void sp_4096_mul_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x400\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_4096_mul_128_outer_%=: \n\t" "subs r3, r5, #0x1fc\n\t" @@ -45824,7 +46580,44 @@ "L_sp_4096_mul_128_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -45861,10 +46654,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #0x200\n\t" - "beq L_sp_4096_mul_128_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_4096_mul_128_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_4096_mul_128_inner_done_%=\n\t" + "blt L_sp_4096_mul_128_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_4096_mul_128_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -45872,18 +46701,50 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x3f8\n\t" + "cmp r5, #0x3f4\n\t" "ble L_sp_4096_mul_128_outer_%=\n\t" + "ldr lr, [%[a], #508]\n\t" + "ldr r11, [%[b], #508]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_4096_mul_128_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_4096_mul_128_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -45894,29 +46755,28 @@ */ static void sp_4096_sqr_128(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x400\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_4096_sqr_128_outer_%=: \n\t" "subs r3, r5, #0x1fc\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_4096_sqr_128_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_4096_sqr_128_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -45965,11 +46825,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_4096_sqr_128_op_done_%=\n\t" - "\n" - "L_sp_4096_sqr_128_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_4096_sqr_128_inner_done_%=\n\t" + "blt L_sp_4096_sqr_128_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -45996,39 +46858,55 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_4096_sqr_128_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #0x200\n\t" - "beq L_sp_4096_sqr_128_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_4096_sqr_128_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_4096_sqr_128_inner_%=\n\t" - "\n" "L_sp_4096_sqr_128_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x3f8\n\t" + "cmp r5, #0x3f4\n\t" "ble L_sp_4096_sqr_128_outer_%=\n\t" + "ldr lr, [%[a], #508]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_4096_sqr_128_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_4096_sqr_128_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -46057,15 +46935,14 @@ */ static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -46098,7 +46975,7 @@ "L_sp_4096_mul_d_128_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -46143,7 +47020,7 @@ "str r3, [%[r], #512]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -46156,15 +47033,14 @@ */ static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -46189,5051 +47065,4043 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[12] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[13] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[14] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[15] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[16] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[17] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[18] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[19] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[20] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[21] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[22] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[23] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[24] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[25] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[26] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[27] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[28] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[29] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[30] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[31] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[32] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[33] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[34] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[35] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[36] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[37] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[38] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[39] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[40] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[41] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[42] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[43] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[44] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[45] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[46] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[47] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[48] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[49] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[50] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[51] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[52] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[53] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[54] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[55] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[56] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[57] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[58] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[59] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[60] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[61] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[62] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[63] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[64] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[65] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[66] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[67] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[68] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[69] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[70] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[71] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[72] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[73] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[74] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[75] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[76] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[77] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[78] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[79] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[80] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[81] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[82] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[83] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[84] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[85] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[86] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[87] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[88] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[89] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[90] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[91] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[92] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[93] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[94] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[95] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[96] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[97] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[98] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[99] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[100] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[101] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[102] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[103] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[104] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[105] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[106] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[107] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[108] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[109] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[110] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[111] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[112] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adds r4, r4, r6\n\t" + "adc r5, r5, r7\n\t" +#else + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[113] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[114] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[115] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[116] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[117] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[118] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[119] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[120] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[121] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[122] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[123] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[124] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[125] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[126] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[127] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -51259,15 +51127,13 @@ "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r7\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" "str r5, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -51299,10 +51165,10 @@ */ static sp_digit sp_4096_cond_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -51323,7 +51189,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -51339,10 +51205,10 @@ */ static sp_digit sp_4096_cond_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -51797,12 +51663,13 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 4096 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -51811,12 +51678,12 @@ */ static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -51829,10 +51696,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -51856,14 +51722,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -51887,18 +51747,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -51922,17 +51776,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -51956,18 +51804,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -51991,18 +51833,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52026,18 +51862,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52061,18 +51891,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52096,18 +51920,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52131,18 +51949,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52166,18 +51978,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52201,18 +52007,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ "ldr r7, [%[m], #44]\n\t" "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52236,18 +52036,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "adc r4, r4, #0\n\t" /* a[i+12] += m[12] * mu */ "ldr r7, [%[m], #48]\n\t" "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52271,18 +52065,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #48]\n\t" "adc r5, r5, #0\n\t" /* a[i+13] += m[13] * mu */ "ldr r7, [%[m], #52]\n\t" "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52306,18 +52094,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #52]\n\t" "adc r4, r4, #0\n\t" /* a[i+14] += m[14] * mu */ "ldr r7, [%[m], #56]\n\t" "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52341,18 +52123,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #56]\n\t" "adc r5, r5, #0\n\t" /* a[i+15] += m[15] * mu */ "ldr r7, [%[m], #60]\n\t" "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52376,18 +52152,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #60]\n\t" "adc r4, r4, #0\n\t" /* a[i+16] += m[16] * mu */ "ldr r7, [%[m], #64]\n\t" "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52411,18 +52181,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #64]\n\t" "adc r5, r5, #0\n\t" /* a[i+17] += m[17] * mu */ "ldr r7, [%[m], #68]\n\t" "ldr r10, [%[a], #68]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52446,18 +52210,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #68]\n\t" "adc r4, r4, #0\n\t" /* a[i+18] += m[18] * mu */ "ldr r7, [%[m], #72]\n\t" "ldr r10, [%[a], #72]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52481,18 +52239,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #72]\n\t" "adc r5, r5, #0\n\t" /* a[i+19] += m[19] * mu */ "ldr r7, [%[m], #76]\n\t" "ldr r10, [%[a], #76]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52516,18 +52268,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #76]\n\t" "adc r4, r4, #0\n\t" /* a[i+20] += m[20] * mu */ "ldr r7, [%[m], #80]\n\t" "ldr r10, [%[a], #80]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52551,18 +52297,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #80]\n\t" "adc r5, r5, #0\n\t" /* a[i+21] += m[21] * mu */ "ldr r7, [%[m], #84]\n\t" "ldr r10, [%[a], #84]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52586,18 +52326,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #84]\n\t" "adc r4, r4, #0\n\t" /* a[i+22] += m[22] * mu */ "ldr r7, [%[m], #88]\n\t" "ldr r10, [%[a], #88]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52621,18 +52355,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #88]\n\t" "adc r5, r5, #0\n\t" /* a[i+23] += m[23] * mu */ "ldr r7, [%[m], #92]\n\t" "ldr r10, [%[a], #92]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52656,18 +52384,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #92]\n\t" "adc r4, r4, #0\n\t" /* a[i+24] += m[24] * mu */ "ldr r7, [%[m], #96]\n\t" "ldr r10, [%[a], #96]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52691,18 +52413,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #96]\n\t" "adc r5, r5, #0\n\t" /* a[i+25] += m[25] * mu */ "ldr r7, [%[m], #100]\n\t" "ldr r10, [%[a], #100]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52726,18 +52442,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #100]\n\t" "adc r4, r4, #0\n\t" /* a[i+26] += m[26] * mu */ "ldr r7, [%[m], #104]\n\t" "ldr r10, [%[a], #104]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52761,18 +52471,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #104]\n\t" "adc r5, r5, #0\n\t" /* a[i+27] += m[27] * mu */ "ldr r7, [%[m], #108]\n\t" "ldr r10, [%[a], #108]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52796,18 +52500,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #108]\n\t" "adc r4, r4, #0\n\t" /* a[i+28] += m[28] * mu */ "ldr r7, [%[m], #112]\n\t" "ldr r10, [%[a], #112]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52831,18 +52529,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #112]\n\t" "adc r5, r5, #0\n\t" /* a[i+29] += m[29] * mu */ "ldr r7, [%[m], #116]\n\t" "ldr r10, [%[a], #116]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52866,18 +52558,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #116]\n\t" "adc r4, r4, #0\n\t" /* a[i+30] += m[30] * mu */ "ldr r7, [%[m], #120]\n\t" "ldr r10, [%[a], #120]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52901,18 +52587,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #120]\n\t" "adc r5, r5, #0\n\t" /* a[i+31] += m[31] * mu */ "ldr r7, [%[m], #124]\n\t" "ldr r10, [%[a], #124]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -52936,18 +52616,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #124]\n\t" "adc r4, r4, #0\n\t" /* a[i+32] += m[32] * mu */ "ldr r7, [%[m], #128]\n\t" "ldr r10, [%[a], #128]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -52971,18 +52645,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #128]\n\t" "adc r5, r5, #0\n\t" /* a[i+33] += m[33] * mu */ "ldr r7, [%[m], #132]\n\t" "ldr r10, [%[a], #132]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53006,18 +52674,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #132]\n\t" "adc r4, r4, #0\n\t" /* a[i+34] += m[34] * mu */ "ldr r7, [%[m], #136]\n\t" "ldr r10, [%[a], #136]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53041,18 +52703,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #136]\n\t" "adc r5, r5, #0\n\t" /* a[i+35] += m[35] * mu */ "ldr r7, [%[m], #140]\n\t" "ldr r10, [%[a], #140]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53076,18 +52732,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #140]\n\t" "adc r4, r4, #0\n\t" /* a[i+36] += m[36] * mu */ "ldr r7, [%[m], #144]\n\t" "ldr r10, [%[a], #144]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53111,18 +52761,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #144]\n\t" "adc r5, r5, #0\n\t" /* a[i+37] += m[37] * mu */ "ldr r7, [%[m], #148]\n\t" "ldr r10, [%[a], #148]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53146,18 +52790,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #148]\n\t" "adc r4, r4, #0\n\t" /* a[i+38] += m[38] * mu */ "ldr r7, [%[m], #152]\n\t" "ldr r10, [%[a], #152]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53181,18 +52819,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #152]\n\t" "adc r5, r5, #0\n\t" /* a[i+39] += m[39] * mu */ "ldr r7, [%[m], #156]\n\t" "ldr r10, [%[a], #156]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53216,18 +52848,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #156]\n\t" "adc r4, r4, #0\n\t" /* a[i+40] += m[40] * mu */ "ldr r7, [%[m], #160]\n\t" "ldr r10, [%[a], #160]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53251,18 +52877,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #160]\n\t" "adc r5, r5, #0\n\t" /* a[i+41] += m[41] * mu */ "ldr r7, [%[m], #164]\n\t" "ldr r10, [%[a], #164]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53286,18 +52906,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #164]\n\t" "adc r4, r4, #0\n\t" /* a[i+42] += m[42] * mu */ "ldr r7, [%[m], #168]\n\t" "ldr r10, [%[a], #168]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53321,18 +52935,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #168]\n\t" "adc r5, r5, #0\n\t" /* a[i+43] += m[43] * mu */ "ldr r7, [%[m], #172]\n\t" "ldr r10, [%[a], #172]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53356,18 +52964,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #172]\n\t" "adc r4, r4, #0\n\t" /* a[i+44] += m[44] * mu */ "ldr r7, [%[m], #176]\n\t" "ldr r10, [%[a], #176]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53391,18 +52993,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #176]\n\t" "adc r5, r5, #0\n\t" /* a[i+45] += m[45] * mu */ "ldr r7, [%[m], #180]\n\t" "ldr r10, [%[a], #180]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53426,18 +53022,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #180]\n\t" "adc r4, r4, #0\n\t" /* a[i+46] += m[46] * mu */ "ldr r7, [%[m], #184]\n\t" "ldr r10, [%[a], #184]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53461,18 +53051,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #184]\n\t" "adc r5, r5, #0\n\t" /* a[i+47] += m[47] * mu */ "ldr r7, [%[m], #188]\n\t" "ldr r10, [%[a], #188]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53496,18 +53080,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #188]\n\t" "adc r4, r4, #0\n\t" /* a[i+48] += m[48] * mu */ "ldr r7, [%[m], #192]\n\t" "ldr r10, [%[a], #192]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53531,18 +53109,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #192]\n\t" "adc r5, r5, #0\n\t" /* a[i+49] += m[49] * mu */ "ldr r7, [%[m], #196]\n\t" "ldr r10, [%[a], #196]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53566,18 +53138,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #196]\n\t" "adc r4, r4, #0\n\t" /* a[i+50] += m[50] * mu */ "ldr r7, [%[m], #200]\n\t" "ldr r10, [%[a], #200]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53601,18 +53167,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #200]\n\t" "adc r5, r5, #0\n\t" /* a[i+51] += m[51] * mu */ "ldr r7, [%[m], #204]\n\t" "ldr r10, [%[a], #204]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53636,18 +53196,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #204]\n\t" "adc r4, r4, #0\n\t" /* a[i+52] += m[52] * mu */ "ldr r7, [%[m], #208]\n\t" "ldr r10, [%[a], #208]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53671,18 +53225,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #208]\n\t" "adc r5, r5, #0\n\t" /* a[i+53] += m[53] * mu */ "ldr r7, [%[m], #212]\n\t" "ldr r10, [%[a], #212]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53706,18 +53254,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #212]\n\t" "adc r4, r4, #0\n\t" /* a[i+54] += m[54] * mu */ "ldr r7, [%[m], #216]\n\t" "ldr r10, [%[a], #216]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53741,18 +53283,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #216]\n\t" "adc r5, r5, #0\n\t" /* a[i+55] += m[55] * mu */ "ldr r7, [%[m], #220]\n\t" "ldr r10, [%[a], #220]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53776,18 +53312,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #220]\n\t" "adc r4, r4, #0\n\t" /* a[i+56] += m[56] * mu */ "ldr r7, [%[m], #224]\n\t" "ldr r10, [%[a], #224]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53811,18 +53341,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #224]\n\t" "adc r5, r5, #0\n\t" /* a[i+57] += m[57] * mu */ "ldr r7, [%[m], #228]\n\t" "ldr r10, [%[a], #228]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53846,18 +53370,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #228]\n\t" "adc r4, r4, #0\n\t" /* a[i+58] += m[58] * mu */ "ldr r7, [%[m], #232]\n\t" "ldr r10, [%[a], #232]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53881,18 +53399,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #232]\n\t" "adc r5, r5, #0\n\t" /* a[i+59] += m[59] * mu */ "ldr r7, [%[m], #236]\n\t" "ldr r10, [%[a], #236]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53916,18 +53428,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #236]\n\t" "adc r4, r4, #0\n\t" /* a[i+60] += m[60] * mu */ "ldr r7, [%[m], #240]\n\t" "ldr r10, [%[a], #240]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -53951,18 +53457,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #240]\n\t" "adc r5, r5, #0\n\t" /* a[i+61] += m[61] * mu */ "ldr r7, [%[m], #244]\n\t" "ldr r10, [%[a], #244]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -53986,18 +53486,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #244]\n\t" "adc r4, r4, #0\n\t" /* a[i+62] += m[62] * mu */ "ldr r7, [%[m], #248]\n\t" "ldr r10, [%[a], #248]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54021,18 +53515,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #248]\n\t" "adc r5, r5, #0\n\t" /* a[i+63] += m[63] * mu */ "ldr r7, [%[m], #252]\n\t" "ldr r10, [%[a], #252]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54056,18 +53544,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #252]\n\t" "adc r4, r4, #0\n\t" /* a[i+64] += m[64] * mu */ "ldr r7, [%[m], #256]\n\t" "ldr r10, [%[a], #256]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54091,18 +53573,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #256]\n\t" "adc r5, r5, #0\n\t" /* a[i+65] += m[65] * mu */ "ldr r7, [%[m], #260]\n\t" "ldr r10, [%[a], #260]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54126,18 +53602,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #260]\n\t" "adc r4, r4, #0\n\t" /* a[i+66] += m[66] * mu */ "ldr r7, [%[m], #264]\n\t" "ldr r10, [%[a], #264]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54161,18 +53631,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #264]\n\t" "adc r5, r5, #0\n\t" /* a[i+67] += m[67] * mu */ "ldr r7, [%[m], #268]\n\t" "ldr r10, [%[a], #268]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54196,18 +53660,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #268]\n\t" "adc r4, r4, #0\n\t" /* a[i+68] += m[68] * mu */ "ldr r7, [%[m], #272]\n\t" "ldr r10, [%[a], #272]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54231,18 +53689,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #272]\n\t" "adc r5, r5, #0\n\t" /* a[i+69] += m[69] * mu */ "ldr r7, [%[m], #276]\n\t" "ldr r10, [%[a], #276]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54266,18 +53718,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #276]\n\t" "adc r4, r4, #0\n\t" /* a[i+70] += m[70] * mu */ "ldr r7, [%[m], #280]\n\t" "ldr r10, [%[a], #280]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54301,18 +53747,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #280]\n\t" "adc r5, r5, #0\n\t" /* a[i+71] += m[71] * mu */ "ldr r7, [%[m], #284]\n\t" "ldr r10, [%[a], #284]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54336,18 +53776,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #284]\n\t" "adc r4, r4, #0\n\t" /* a[i+72] += m[72] * mu */ "ldr r7, [%[m], #288]\n\t" "ldr r10, [%[a], #288]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54371,18 +53805,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #288]\n\t" "adc r5, r5, #0\n\t" /* a[i+73] += m[73] * mu */ "ldr r7, [%[m], #292]\n\t" "ldr r10, [%[a], #292]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54406,18 +53834,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #292]\n\t" "adc r4, r4, #0\n\t" /* a[i+74] += m[74] * mu */ "ldr r7, [%[m], #296]\n\t" "ldr r10, [%[a], #296]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54441,18 +53863,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #296]\n\t" "adc r5, r5, #0\n\t" /* a[i+75] += m[75] * mu */ "ldr r7, [%[m], #300]\n\t" "ldr r10, [%[a], #300]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54476,18 +53892,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #300]\n\t" "adc r4, r4, #0\n\t" /* a[i+76] += m[76] * mu */ "ldr r7, [%[m], #304]\n\t" "ldr r10, [%[a], #304]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54511,18 +53921,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #304]\n\t" "adc r5, r5, #0\n\t" /* a[i+77] += m[77] * mu */ "ldr r7, [%[m], #308]\n\t" "ldr r10, [%[a], #308]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54546,18 +53950,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #308]\n\t" "adc r4, r4, #0\n\t" /* a[i+78] += m[78] * mu */ "ldr r7, [%[m], #312]\n\t" "ldr r10, [%[a], #312]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54581,18 +53979,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #312]\n\t" "adc r5, r5, #0\n\t" /* a[i+79] += m[79] * mu */ "ldr r7, [%[m], #316]\n\t" "ldr r10, [%[a], #316]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54616,18 +54008,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #316]\n\t" "adc r4, r4, #0\n\t" /* a[i+80] += m[80] * mu */ "ldr r7, [%[m], #320]\n\t" "ldr r10, [%[a], #320]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54651,18 +54037,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #320]\n\t" "adc r5, r5, #0\n\t" /* a[i+81] += m[81] * mu */ "ldr r7, [%[m], #324]\n\t" "ldr r10, [%[a], #324]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54686,18 +54066,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #324]\n\t" "adc r4, r4, #0\n\t" /* a[i+82] += m[82] * mu */ "ldr r7, [%[m], #328]\n\t" "ldr r10, [%[a], #328]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54721,18 +54095,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #328]\n\t" "adc r5, r5, #0\n\t" /* a[i+83] += m[83] * mu */ "ldr r7, [%[m], #332]\n\t" "ldr r10, [%[a], #332]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54756,18 +54124,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #332]\n\t" "adc r4, r4, #0\n\t" /* a[i+84] += m[84] * mu */ "ldr r7, [%[m], #336]\n\t" "ldr r10, [%[a], #336]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54791,18 +54153,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #336]\n\t" "adc r5, r5, #0\n\t" /* a[i+85] += m[85] * mu */ "ldr r7, [%[m], #340]\n\t" "ldr r10, [%[a], #340]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54826,18 +54182,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #340]\n\t" "adc r4, r4, #0\n\t" /* a[i+86] += m[86] * mu */ "ldr r7, [%[m], #344]\n\t" "ldr r10, [%[a], #344]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54861,18 +54211,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #344]\n\t" "adc r5, r5, #0\n\t" /* a[i+87] += m[87] * mu */ "ldr r7, [%[m], #348]\n\t" "ldr r10, [%[a], #348]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54896,18 +54240,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #348]\n\t" "adc r4, r4, #0\n\t" /* a[i+88] += m[88] * mu */ "ldr r7, [%[m], #352]\n\t" "ldr r10, [%[a], #352]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -54931,18 +54269,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #352]\n\t" "adc r5, r5, #0\n\t" /* a[i+89] += m[89] * mu */ "ldr r7, [%[m], #356]\n\t" "ldr r10, [%[a], #356]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -54966,18 +54298,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #356]\n\t" "adc r4, r4, #0\n\t" /* a[i+90] += m[90] * mu */ "ldr r7, [%[m], #360]\n\t" "ldr r10, [%[a], #360]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55001,18 +54327,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #360]\n\t" "adc r5, r5, #0\n\t" /* a[i+91] += m[91] * mu */ "ldr r7, [%[m], #364]\n\t" "ldr r10, [%[a], #364]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55036,18 +54356,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #364]\n\t" "adc r4, r4, #0\n\t" /* a[i+92] += m[92] * mu */ "ldr r7, [%[m], #368]\n\t" "ldr r10, [%[a], #368]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55071,18 +54385,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #368]\n\t" "adc r5, r5, #0\n\t" /* a[i+93] += m[93] * mu */ "ldr r7, [%[m], #372]\n\t" "ldr r10, [%[a], #372]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55106,18 +54414,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #372]\n\t" "adc r4, r4, #0\n\t" /* a[i+94] += m[94] * mu */ "ldr r7, [%[m], #376]\n\t" "ldr r10, [%[a], #376]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55141,18 +54443,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #376]\n\t" "adc r5, r5, #0\n\t" /* a[i+95] += m[95] * mu */ "ldr r7, [%[m], #380]\n\t" "ldr r10, [%[a], #380]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55176,18 +54472,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #380]\n\t" "adc r4, r4, #0\n\t" /* a[i+96] += m[96] * mu */ "ldr r7, [%[m], #384]\n\t" "ldr r10, [%[a], #384]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55211,18 +54501,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #384]\n\t" "adc r5, r5, #0\n\t" /* a[i+97] += m[97] * mu */ "ldr r7, [%[m], #388]\n\t" "ldr r10, [%[a], #388]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55246,18 +54530,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #388]\n\t" "adc r4, r4, #0\n\t" /* a[i+98] += m[98] * mu */ "ldr r7, [%[m], #392]\n\t" "ldr r10, [%[a], #392]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55281,18 +54559,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #392]\n\t" "adc r5, r5, #0\n\t" /* a[i+99] += m[99] * mu */ "ldr r7, [%[m], #396]\n\t" "ldr r10, [%[a], #396]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55316,18 +54588,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #396]\n\t" "adc r4, r4, #0\n\t" /* a[i+100] += m[100] * mu */ "ldr r7, [%[m], #400]\n\t" "ldr r10, [%[a], #400]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55351,18 +54617,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #400]\n\t" "adc r5, r5, #0\n\t" /* a[i+101] += m[101] * mu */ "ldr r7, [%[m], #404]\n\t" "ldr r10, [%[a], #404]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55386,18 +54646,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #404]\n\t" "adc r4, r4, #0\n\t" /* a[i+102] += m[102] * mu */ "ldr r7, [%[m], #408]\n\t" "ldr r10, [%[a], #408]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55421,18 +54675,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #408]\n\t" "adc r5, r5, #0\n\t" /* a[i+103] += m[103] * mu */ "ldr r7, [%[m], #412]\n\t" "ldr r10, [%[a], #412]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55456,18 +54704,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #412]\n\t" "adc r4, r4, #0\n\t" /* a[i+104] += m[104] * mu */ "ldr r7, [%[m], #416]\n\t" "ldr r10, [%[a], #416]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55491,18 +54733,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #416]\n\t" "adc r5, r5, #0\n\t" /* a[i+105] += m[105] * mu */ "ldr r7, [%[m], #420]\n\t" "ldr r10, [%[a], #420]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55526,18 +54762,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #420]\n\t" "adc r4, r4, #0\n\t" /* a[i+106] += m[106] * mu */ "ldr r7, [%[m], #424]\n\t" "ldr r10, [%[a], #424]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55561,18 +54791,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #424]\n\t" "adc r5, r5, #0\n\t" /* a[i+107] += m[107] * mu */ "ldr r7, [%[m], #428]\n\t" "ldr r10, [%[a], #428]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55596,18 +54820,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #428]\n\t" "adc r4, r4, #0\n\t" /* a[i+108] += m[108] * mu */ "ldr r7, [%[m], #432]\n\t" "ldr r10, [%[a], #432]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55631,18 +54849,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #432]\n\t" "adc r5, r5, #0\n\t" /* a[i+109] += m[109] * mu */ "ldr r7, [%[m], #436]\n\t" "ldr r10, [%[a], #436]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55666,18 +54878,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #436]\n\t" "adc r4, r4, #0\n\t" /* a[i+110] += m[110] * mu */ "ldr r7, [%[m], #440]\n\t" "ldr r10, [%[a], #440]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55701,18 +54907,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #440]\n\t" "adc r5, r5, #0\n\t" /* a[i+111] += m[111] * mu */ "ldr r7, [%[m], #444]\n\t" "ldr r10, [%[a], #444]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55736,18 +54936,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #444]\n\t" "adc r4, r4, #0\n\t" /* a[i+112] += m[112] * mu */ "ldr r7, [%[m], #448]\n\t" "ldr r10, [%[a], #448]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55771,18 +54965,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #448]\n\t" "adc r5, r5, #0\n\t" /* a[i+113] += m[113] * mu */ "ldr r7, [%[m], #452]\n\t" "ldr r10, [%[a], #452]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55806,18 +54994,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #452]\n\t" "adc r4, r4, #0\n\t" /* a[i+114] += m[114] * mu */ "ldr r7, [%[m], #456]\n\t" "ldr r10, [%[a], #456]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55841,18 +55023,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #456]\n\t" "adc r5, r5, #0\n\t" /* a[i+115] += m[115] * mu */ "ldr r7, [%[m], #460]\n\t" "ldr r10, [%[a], #460]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55876,18 +55052,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #460]\n\t" "adc r4, r4, #0\n\t" /* a[i+116] += m[116] * mu */ "ldr r7, [%[m], #464]\n\t" "ldr r10, [%[a], #464]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55911,18 +55081,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #464]\n\t" "adc r5, r5, #0\n\t" /* a[i+117] += m[117] * mu */ "ldr r7, [%[m], #468]\n\t" "ldr r10, [%[a], #468]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -55946,18 +55110,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #468]\n\t" "adc r4, r4, #0\n\t" /* a[i+118] += m[118] * mu */ "ldr r7, [%[m], #472]\n\t" "ldr r10, [%[a], #472]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -55981,18 +55139,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #472]\n\t" "adc r5, r5, #0\n\t" /* a[i+119] += m[119] * mu */ "ldr r7, [%[m], #476]\n\t" "ldr r10, [%[a], #476]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -56016,18 +55168,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #476]\n\t" "adc r4, r4, #0\n\t" /* a[i+120] += m[120] * mu */ "ldr r7, [%[m], #480]\n\t" "ldr r10, [%[a], #480]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -56051,18 +55197,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #480]\n\t" "adc r5, r5, #0\n\t" /* a[i+121] += m[121] * mu */ "ldr r7, [%[m], #484]\n\t" "ldr r10, [%[a], #484]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -56086,18 +55226,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #484]\n\t" "adc r4, r4, #0\n\t" /* a[i+122] += m[122] * mu */ "ldr r7, [%[m], #488]\n\t" "ldr r10, [%[a], #488]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -56121,18 +55255,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #488]\n\t" "adc r5, r5, #0\n\t" /* a[i+123] += m[123] * mu */ "ldr r7, [%[m], #492]\n\t" "ldr r10, [%[a], #492]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -56156,18 +55284,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #492]\n\t" "adc r4, r4, #0\n\t" /* a[i+124] += m[124] * mu */ "ldr r7, [%[m], #496]\n\t" "ldr r10, [%[a], #496]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -56191,18 +55313,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #496]\n\t" "adc r5, r5, #0\n\t" /* a[i+125] += m[125] * mu */ "ldr r7, [%[m], #500]\n\t" "ldr r10, [%[a], #500]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -56226,18 +55342,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #500]\n\t" "adc r4, r4, #0\n\t" /* a[i+126] += m[126] * mu */ "ldr r7, [%[m], #504]\n\t" "ldr r10, [%[a], #504]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -56261,22 +55371,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #504]\n\t" "adc r5, r5, #0\n\t" /* a[i+127] += m[127] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #508]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #508]\n\t" +#else + "ldr r7, [%[m], #508]\n\t" #endif "ldr r10, [%[a], #508]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -56307,13 +55411,1069 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #508]\n\t" + "ldr r10, [%[a], #512]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #512]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #0x200\n\t" + "blt L_sp_4096_mont_reduce_128_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 4096 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_4096_mont_reduce_128_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r7, [%[m], #48]\n\t" + "ldr r10, [%[a], #48]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r7, [%[m], #52]\n\t" + "ldr r10, [%[a], #52]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #52]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r7, [%[m], #56]\n\t" + "ldr r10, [%[a], #56]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #56]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r7, [%[m], #60]\n\t" + "ldr r10, [%[a], #60]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #60]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r7, [%[m], #64]\n\t" + "ldr r10, [%[a], #64]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #64]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r7, [%[m], #68]\n\t" + "ldr r10, [%[a], #68]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #68]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r7, [%[m], #72]\n\t" + "ldr r10, [%[a], #72]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #72]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r7, [%[m], #76]\n\t" + "ldr r10, [%[a], #76]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #76]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r7, [%[m], #80]\n\t" + "ldr r10, [%[a], #80]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #80]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r7, [%[m], #84]\n\t" + "ldr r10, [%[a], #84]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #84]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r7, [%[m], #88]\n\t" + "ldr r10, [%[a], #88]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #88]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r7, [%[m], #92]\n\t" + "ldr r10, [%[a], #92]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #92]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r7, [%[m], #96]\n\t" + "ldr r10, [%[a], #96]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #96]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r7, [%[m], #100]\n\t" + "ldr r10, [%[a], #100]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #100]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r7, [%[m], #104]\n\t" + "ldr r10, [%[a], #104]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #104]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r7, [%[m], #108]\n\t" + "ldr r10, [%[a], #108]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #108]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r7, [%[m], #112]\n\t" + "ldr r10, [%[a], #112]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #112]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r7, [%[m], #116]\n\t" + "ldr r10, [%[a], #116]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #116]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r7, [%[m], #120]\n\t" + "ldr r10, [%[a], #120]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #120]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r7, [%[m], #124]\n\t" + "ldr r10, [%[a], #124]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #124]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r7, [%[m], #128]\n\t" + "ldr r10, [%[a], #128]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #128]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r7, [%[m], #132]\n\t" + "ldr r10, [%[a], #132]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #132]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r7, [%[m], #136]\n\t" + "ldr r10, [%[a], #136]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #136]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r7, [%[m], #140]\n\t" + "ldr r10, [%[a], #140]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #140]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r7, [%[m], #144]\n\t" + "ldr r10, [%[a], #144]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #144]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r7, [%[m], #148]\n\t" + "ldr r10, [%[a], #148]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #148]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r7, [%[m], #152]\n\t" + "ldr r10, [%[a], #152]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #152]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r7, [%[m], #156]\n\t" + "ldr r10, [%[a], #156]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #156]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r7, [%[m], #160]\n\t" + "ldr r10, [%[a], #160]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #160]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r7, [%[m], #164]\n\t" + "ldr r10, [%[a], #164]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #164]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r7, [%[m], #168]\n\t" + "ldr r10, [%[a], #168]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #168]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r7, [%[m], #172]\n\t" + "ldr r10, [%[a], #172]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #172]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r7, [%[m], #176]\n\t" + "ldr r10, [%[a], #176]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #176]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r7, [%[m], #180]\n\t" + "ldr r10, [%[a], #180]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #180]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r7, [%[m], #184]\n\t" + "ldr r10, [%[a], #184]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #184]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r7, [%[m], #188]\n\t" + "ldr r10, [%[a], #188]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #188]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+48] += m[48] * mu */ + "ldr r7, [%[m], #192]\n\t" + "ldr r10, [%[a], #192]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #192]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+49] += m[49] * mu */ + "ldr r7, [%[m], #196]\n\t" + "ldr r10, [%[a], #196]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #196]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+50] += m[50] * mu */ + "ldr r7, [%[m], #200]\n\t" + "ldr r10, [%[a], #200]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #200]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+51] += m[51] * mu */ + "ldr r7, [%[m], #204]\n\t" + "ldr r10, [%[a], #204]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #204]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+52] += m[52] * mu */ + "ldr r7, [%[m], #208]\n\t" + "ldr r10, [%[a], #208]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #208]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+53] += m[53] * mu */ + "ldr r7, [%[m], #212]\n\t" + "ldr r10, [%[a], #212]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #212]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+54] += m[54] * mu */ + "ldr r7, [%[m], #216]\n\t" + "ldr r10, [%[a], #216]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #216]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+55] += m[55] * mu */ + "ldr r7, [%[m], #220]\n\t" + "ldr r10, [%[a], #220]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #220]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+56] += m[56] * mu */ + "ldr r7, [%[m], #224]\n\t" + "ldr r10, [%[a], #224]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #224]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+57] += m[57] * mu */ + "ldr r7, [%[m], #228]\n\t" + "ldr r10, [%[a], #228]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #228]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+58] += m[58] * mu */ + "ldr r7, [%[m], #232]\n\t" + "ldr r10, [%[a], #232]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #232]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+59] += m[59] * mu */ + "ldr r7, [%[m], #236]\n\t" + "ldr r10, [%[a], #236]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #236]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+60] += m[60] * mu */ + "ldr r7, [%[m], #240]\n\t" + "ldr r10, [%[a], #240]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #240]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+61] += m[61] * mu */ + "ldr r7, [%[m], #244]\n\t" + "ldr r10, [%[a], #244]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #244]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+62] += m[62] * mu */ + "ldr r7, [%[m], #248]\n\t" + "ldr r10, [%[a], #248]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #248]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+63] += m[63] * mu */ + "ldr r7, [%[m], #252]\n\t" + "ldr r10, [%[a], #252]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #252]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+64] += m[64] * mu */ + "ldr r7, [%[m], #256]\n\t" + "ldr r10, [%[a], #256]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #256]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+65] += m[65] * mu */ + "ldr r7, [%[m], #260]\n\t" + "ldr r10, [%[a], #260]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #260]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+66] += m[66] * mu */ + "ldr r7, [%[m], #264]\n\t" + "ldr r10, [%[a], #264]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #264]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+67] += m[67] * mu */ + "ldr r7, [%[m], #268]\n\t" + "ldr r10, [%[a], #268]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #268]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+68] += m[68] * mu */ + "ldr r7, [%[m], #272]\n\t" + "ldr r10, [%[a], #272]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #272]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+69] += m[69] * mu */ + "ldr r7, [%[m], #276]\n\t" + "ldr r10, [%[a], #276]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #276]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+70] += m[70] * mu */ + "ldr r7, [%[m], #280]\n\t" + "ldr r10, [%[a], #280]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #280]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+71] += m[71] * mu */ + "ldr r7, [%[m], #284]\n\t" + "ldr r10, [%[a], #284]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #284]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+72] += m[72] * mu */ + "ldr r7, [%[m], #288]\n\t" + "ldr r10, [%[a], #288]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #288]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+73] += m[73] * mu */ + "ldr r7, [%[m], #292]\n\t" + "ldr r10, [%[a], #292]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #292]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+74] += m[74] * mu */ + "ldr r7, [%[m], #296]\n\t" + "ldr r10, [%[a], #296]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #296]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+75] += m[75] * mu */ + "ldr r7, [%[m], #300]\n\t" + "ldr r10, [%[a], #300]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #300]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+76] += m[76] * mu */ + "ldr r7, [%[m], #304]\n\t" + "ldr r10, [%[a], #304]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #304]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+77] += m[77] * mu */ + "ldr r7, [%[m], #308]\n\t" + "ldr r10, [%[a], #308]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #308]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+78] += m[78] * mu */ + "ldr r7, [%[m], #312]\n\t" + "ldr r10, [%[a], #312]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #312]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+79] += m[79] * mu */ + "ldr r7, [%[m], #316]\n\t" + "ldr r10, [%[a], #316]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #316]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+80] += m[80] * mu */ + "ldr r7, [%[m], #320]\n\t" + "ldr r10, [%[a], #320]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #320]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+81] += m[81] * mu */ + "ldr r7, [%[m], #324]\n\t" + "ldr r10, [%[a], #324]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #324]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+82] += m[82] * mu */ + "ldr r7, [%[m], #328]\n\t" + "ldr r10, [%[a], #328]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #328]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+83] += m[83] * mu */ + "ldr r7, [%[m], #332]\n\t" + "ldr r10, [%[a], #332]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #332]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+84] += m[84] * mu */ + "ldr r7, [%[m], #336]\n\t" + "ldr r10, [%[a], #336]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #336]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+85] += m[85] * mu */ + "ldr r7, [%[m], #340]\n\t" + "ldr r10, [%[a], #340]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #340]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+86] += m[86] * mu */ + "ldr r7, [%[m], #344]\n\t" + "ldr r10, [%[a], #344]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #344]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+87] += m[87] * mu */ + "ldr r7, [%[m], #348]\n\t" + "ldr r10, [%[a], #348]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #348]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+88] += m[88] * mu */ + "ldr r7, [%[m], #352]\n\t" + "ldr r10, [%[a], #352]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #352]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+89] += m[89] * mu */ + "ldr r7, [%[m], #356]\n\t" + "ldr r10, [%[a], #356]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #356]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+90] += m[90] * mu */ + "ldr r7, [%[m], #360]\n\t" + "ldr r10, [%[a], #360]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #360]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+91] += m[91] * mu */ + "ldr r7, [%[m], #364]\n\t" + "ldr r10, [%[a], #364]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #364]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+92] += m[92] * mu */ + "ldr r7, [%[m], #368]\n\t" + "ldr r10, [%[a], #368]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #368]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+93] += m[93] * mu */ + "ldr r7, [%[m], #372]\n\t" + "ldr r10, [%[a], #372]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #372]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+94] += m[94] * mu */ + "ldr r7, [%[m], #376]\n\t" + "ldr r10, [%[a], #376]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #376]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+95] += m[95] * mu */ + "ldr r7, [%[m], #380]\n\t" + "ldr r10, [%[a], #380]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #380]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+96] += m[96] * mu */ + "ldr r7, [%[m], #384]\n\t" + "ldr r10, [%[a], #384]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #384]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+97] += m[97] * mu */ + "ldr r7, [%[m], #388]\n\t" + "ldr r10, [%[a], #388]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #388]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+98] += m[98] * mu */ + "ldr r7, [%[m], #392]\n\t" + "ldr r10, [%[a], #392]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #392]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+99] += m[99] * mu */ + "ldr r7, [%[m], #396]\n\t" + "ldr r10, [%[a], #396]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #396]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+100] += m[100] * mu */ + "ldr r7, [%[m], #400]\n\t" + "ldr r10, [%[a], #400]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #400]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+101] += m[101] * mu */ + "ldr r7, [%[m], #404]\n\t" + "ldr r10, [%[a], #404]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #404]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+102] += m[102] * mu */ + "ldr r7, [%[m], #408]\n\t" + "ldr r10, [%[a], #408]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #408]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+103] += m[103] * mu */ + "ldr r7, [%[m], #412]\n\t" + "ldr r10, [%[a], #412]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #412]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+104] += m[104] * mu */ + "ldr r7, [%[m], #416]\n\t" + "ldr r10, [%[a], #416]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #416]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+105] += m[105] * mu */ + "ldr r7, [%[m], #420]\n\t" + "ldr r10, [%[a], #420]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #420]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+106] += m[106] * mu */ + "ldr r7, [%[m], #424]\n\t" + "ldr r10, [%[a], #424]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #424]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+107] += m[107] * mu */ + "ldr r7, [%[m], #428]\n\t" + "ldr r10, [%[a], #428]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #428]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+108] += m[108] * mu */ + "ldr r7, [%[m], #432]\n\t" + "ldr r10, [%[a], #432]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #432]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+109] += m[109] * mu */ + "ldr r7, [%[m], #436]\n\t" + "ldr r10, [%[a], #436]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #436]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+110] += m[110] * mu */ + "ldr r7, [%[m], #440]\n\t" + "ldr r10, [%[a], #440]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #440]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+111] += m[111] * mu */ + "ldr r7, [%[m], #444]\n\t" + "ldr r10, [%[a], #444]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #444]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+112] += m[112] * mu */ + "ldr r7, [%[m], #448]\n\t" + "ldr r10, [%[a], #448]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #448]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+113] += m[113] * mu */ + "ldr r7, [%[m], #452]\n\t" + "ldr r10, [%[a], #452]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #452]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+114] += m[114] * mu */ + "ldr r7, [%[m], #456]\n\t" + "ldr r10, [%[a], #456]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #456]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+115] += m[115] * mu */ + "ldr r7, [%[m], #460]\n\t" + "ldr r10, [%[a], #460]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #460]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+116] += m[116] * mu */ + "ldr r7, [%[m], #464]\n\t" + "ldr r10, [%[a], #464]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #464]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+117] += m[117] * mu */ + "ldr r7, [%[m], #468]\n\t" + "ldr r10, [%[a], #468]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #468]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+118] += m[118] * mu */ + "ldr r7, [%[m], #472]\n\t" + "ldr r10, [%[a], #472]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #472]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+119] += m[119] * mu */ + "ldr r7, [%[m], #476]\n\t" + "ldr r10, [%[a], #476]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #476]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+120] += m[120] * mu */ + "ldr r7, [%[m], #480]\n\t" + "ldr r10, [%[a], #480]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #480]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+121] += m[121] * mu */ + "ldr r7, [%[m], #484]\n\t" + "ldr r10, [%[a], #484]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #484]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+122] += m[122] * mu */ + "ldr r7, [%[m], #488]\n\t" + "ldr r10, [%[a], #488]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #488]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+123] += m[123] * mu */ + "ldr r7, [%[m], #492]\n\t" + "ldr r10, [%[a], #492]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #492]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+124] += m[124] * mu */ + "ldr r7, [%[m], #496]\n\t" + "ldr r10, [%[a], #496]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #496]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+125] += m[125] * mu */ + "ldr r7, [%[m], #500]\n\t" + "ldr r10, [%[a], #500]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #500]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+126] += m[126] * mu */ + "ldr r7, [%[m], #504]\n\t" + "ldr r10, [%[a], #504]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #504]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+127] += m[127] * mu */ + "ldr r7, [%[m], #508]\n\t" + "ldr r10, [%[a], #508]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #508]\n\t" "ldr r10, [%[a], #512]\n\t" @@ -56325,16 +56485,703 @@ "add %[a], %[a], #4\n\t" "cmp r9, #0x200\n\t" "blt L_sp_4096_mont_reduce_128_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 4096 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_4096_mont_reduce_128_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r10, [%[m], #48]\n\t" + "ldr r9, [%[a], #48]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r10, [%[m], #52]\n\t" + "ldr r9, [%[a], #52]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r10, [%[m], #56]\n\t" + "ldr r9, [%[a], #56]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r10, [%[m], #60]\n\t" + "ldr r9, [%[a], #60]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r10, [%[m], #64]\n\t" + "ldr r9, [%[a], #64]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r10, [%[m], #68]\n\t" + "ldr r9, [%[a], #68]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r10, [%[m], #72]\n\t" + "ldr r9, [%[a], #72]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r10, [%[m], #76]\n\t" + "ldr r9, [%[a], #76]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r10, [%[m], #80]\n\t" + "ldr r9, [%[a], #80]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r10, [%[m], #84]\n\t" + "ldr r9, [%[a], #84]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r10, [%[m], #88]\n\t" + "ldr r9, [%[a], #88]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r10, [%[m], #92]\n\t" + "ldr r9, [%[a], #92]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r10, [%[m], #96]\n\t" + "ldr r9, [%[a], #96]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r10, [%[m], #100]\n\t" + "ldr r9, [%[a], #100]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r10, [%[m], #104]\n\t" + "ldr r9, [%[a], #104]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r10, [%[m], #108]\n\t" + "ldr r9, [%[a], #108]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r10, [%[m], #112]\n\t" + "ldr r9, [%[a], #112]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r10, [%[m], #116]\n\t" + "ldr r9, [%[a], #116]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r10, [%[m], #120]\n\t" + "ldr r9, [%[a], #120]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r10, [%[m], #124]\n\t" + "ldr r9, [%[a], #124]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "ldr r10, [%[m], #128]\n\t" + "ldr r9, [%[a], #128]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "ldr r10, [%[m], #132]\n\t" + "ldr r9, [%[a], #132]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "ldr r10, [%[m], #136]\n\t" + "ldr r9, [%[a], #136]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "ldr r10, [%[m], #140]\n\t" + "ldr r9, [%[a], #140]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "ldr r10, [%[m], #144]\n\t" + "ldr r9, [%[a], #144]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "ldr r10, [%[m], #148]\n\t" + "ldr r9, [%[a], #148]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "ldr r10, [%[m], #152]\n\t" + "ldr r9, [%[a], #152]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "ldr r10, [%[m], #156]\n\t" + "ldr r9, [%[a], #156]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "ldr r10, [%[m], #160]\n\t" + "ldr r9, [%[a], #160]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "ldr r10, [%[m], #164]\n\t" + "ldr r9, [%[a], #164]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "ldr r10, [%[m], #168]\n\t" + "ldr r9, [%[a], #168]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "ldr r10, [%[m], #172]\n\t" + "ldr r9, [%[a], #172]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "ldr r10, [%[m], #176]\n\t" + "ldr r9, [%[a], #176]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "ldr r10, [%[m], #180]\n\t" + "ldr r9, [%[a], #180]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #180]\n\t" + /* a[i+46] += m[46] * mu */ + "ldr r10, [%[m], #184]\n\t" + "ldr r9, [%[a], #184]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #184]\n\t" + /* a[i+47] += m[47] * mu */ + "ldr r10, [%[m], #188]\n\t" + "ldr r9, [%[a], #188]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #188]\n\t" + /* a[i+48] += m[48] * mu */ + "ldr r10, [%[m], #192]\n\t" + "ldr r9, [%[a], #192]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #192]\n\t" + /* a[i+49] += m[49] * mu */ + "ldr r10, [%[m], #196]\n\t" + "ldr r9, [%[a], #196]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #196]\n\t" + /* a[i+50] += m[50] * mu */ + "ldr r10, [%[m], #200]\n\t" + "ldr r9, [%[a], #200]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #200]\n\t" + /* a[i+51] += m[51] * mu */ + "ldr r10, [%[m], #204]\n\t" + "ldr r9, [%[a], #204]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #204]\n\t" + /* a[i+52] += m[52] * mu */ + "ldr r10, [%[m], #208]\n\t" + "ldr r9, [%[a], #208]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #208]\n\t" + /* a[i+53] += m[53] * mu */ + "ldr r10, [%[m], #212]\n\t" + "ldr r9, [%[a], #212]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #212]\n\t" + /* a[i+54] += m[54] * mu */ + "ldr r10, [%[m], #216]\n\t" + "ldr r9, [%[a], #216]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #216]\n\t" + /* a[i+55] += m[55] * mu */ + "ldr r10, [%[m], #220]\n\t" + "ldr r9, [%[a], #220]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #220]\n\t" + /* a[i+56] += m[56] * mu */ + "ldr r10, [%[m], #224]\n\t" + "ldr r9, [%[a], #224]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #224]\n\t" + /* a[i+57] += m[57] * mu */ + "ldr r10, [%[m], #228]\n\t" + "ldr r9, [%[a], #228]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #228]\n\t" + /* a[i+58] += m[58] * mu */ + "ldr r10, [%[m], #232]\n\t" + "ldr r9, [%[a], #232]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #232]\n\t" + /* a[i+59] += m[59] * mu */ + "ldr r10, [%[m], #236]\n\t" + "ldr r9, [%[a], #236]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #236]\n\t" + /* a[i+60] += m[60] * mu */ + "ldr r10, [%[m], #240]\n\t" + "ldr r9, [%[a], #240]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #240]\n\t" + /* a[i+61] += m[61] * mu */ + "ldr r10, [%[m], #244]\n\t" + "ldr r9, [%[a], #244]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #244]\n\t" + /* a[i+62] += m[62] * mu */ + "ldr r10, [%[m], #248]\n\t" + "ldr r9, [%[a], #248]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #248]\n\t" + /* a[i+63] += m[63] * mu */ + "ldr r10, [%[m], #252]\n\t" + "ldr r9, [%[a], #252]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #252]\n\t" + /* a[i+64] += m[64] * mu */ + "ldr r10, [%[m], #256]\n\t" + "ldr r9, [%[a], #256]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #256]\n\t" + /* a[i+65] += m[65] * mu */ + "ldr r10, [%[m], #260]\n\t" + "ldr r9, [%[a], #260]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #260]\n\t" + /* a[i+66] += m[66] * mu */ + "ldr r10, [%[m], #264]\n\t" + "ldr r9, [%[a], #264]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #264]\n\t" + /* a[i+67] += m[67] * mu */ + "ldr r10, [%[m], #268]\n\t" + "ldr r9, [%[a], #268]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #268]\n\t" + /* a[i+68] += m[68] * mu */ + "ldr r10, [%[m], #272]\n\t" + "ldr r9, [%[a], #272]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #272]\n\t" + /* a[i+69] += m[69] * mu */ + "ldr r10, [%[m], #276]\n\t" + "ldr r9, [%[a], #276]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #276]\n\t" + /* a[i+70] += m[70] * mu */ + "ldr r10, [%[m], #280]\n\t" + "ldr r9, [%[a], #280]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #280]\n\t" + /* a[i+71] += m[71] * mu */ + "ldr r10, [%[m], #284]\n\t" + "ldr r9, [%[a], #284]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #284]\n\t" + /* a[i+72] += m[72] * mu */ + "ldr r10, [%[m], #288]\n\t" + "ldr r9, [%[a], #288]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #288]\n\t" + /* a[i+73] += m[73] * mu */ + "ldr r10, [%[m], #292]\n\t" + "ldr r9, [%[a], #292]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #292]\n\t" + /* a[i+74] += m[74] * mu */ + "ldr r10, [%[m], #296]\n\t" + "ldr r9, [%[a], #296]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #296]\n\t" + /* a[i+75] += m[75] * mu */ + "ldr r10, [%[m], #300]\n\t" + "ldr r9, [%[a], #300]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #300]\n\t" + /* a[i+76] += m[76] * mu */ + "ldr r10, [%[m], #304]\n\t" + "ldr r9, [%[a], #304]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #304]\n\t" + /* a[i+77] += m[77] * mu */ + "ldr r10, [%[m], #308]\n\t" + "ldr r9, [%[a], #308]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #308]\n\t" + /* a[i+78] += m[78] * mu */ + "ldr r10, [%[m], #312]\n\t" + "ldr r9, [%[a], #312]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #312]\n\t" + /* a[i+79] += m[79] * mu */ + "ldr r10, [%[m], #316]\n\t" + "ldr r9, [%[a], #316]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #316]\n\t" + /* a[i+80] += m[80] * mu */ + "ldr r10, [%[m], #320]\n\t" + "ldr r9, [%[a], #320]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #320]\n\t" + /* a[i+81] += m[81] * mu */ + "ldr r10, [%[m], #324]\n\t" + "ldr r9, [%[a], #324]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #324]\n\t" + /* a[i+82] += m[82] * mu */ + "ldr r10, [%[m], #328]\n\t" + "ldr r9, [%[a], #328]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #328]\n\t" + /* a[i+83] += m[83] * mu */ + "ldr r10, [%[m], #332]\n\t" + "ldr r9, [%[a], #332]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #332]\n\t" + /* a[i+84] += m[84] * mu */ + "ldr r10, [%[m], #336]\n\t" + "ldr r9, [%[a], #336]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #336]\n\t" + /* a[i+85] += m[85] * mu */ + "ldr r10, [%[m], #340]\n\t" + "ldr r9, [%[a], #340]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #340]\n\t" + /* a[i+86] += m[86] * mu */ + "ldr r10, [%[m], #344]\n\t" + "ldr r9, [%[a], #344]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #344]\n\t" + /* a[i+87] += m[87] * mu */ + "ldr r10, [%[m], #348]\n\t" + "ldr r9, [%[a], #348]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #348]\n\t" + /* a[i+88] += m[88] * mu */ + "ldr r10, [%[m], #352]\n\t" + "ldr r9, [%[a], #352]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #352]\n\t" + /* a[i+89] += m[89] * mu */ + "ldr r10, [%[m], #356]\n\t" + "ldr r9, [%[a], #356]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #356]\n\t" + /* a[i+90] += m[90] * mu */ + "ldr r10, [%[m], #360]\n\t" + "ldr r9, [%[a], #360]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #360]\n\t" + /* a[i+91] += m[91] * mu */ + "ldr r10, [%[m], #364]\n\t" + "ldr r9, [%[a], #364]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #364]\n\t" + /* a[i+92] += m[92] * mu */ + "ldr r10, [%[m], #368]\n\t" + "ldr r9, [%[a], #368]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #368]\n\t" + /* a[i+93] += m[93] * mu */ + "ldr r10, [%[m], #372]\n\t" + "ldr r9, [%[a], #372]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #372]\n\t" + /* a[i+94] += m[94] * mu */ + "ldr r10, [%[m], #376]\n\t" + "ldr r9, [%[a], #376]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #376]\n\t" + /* a[i+95] += m[95] * mu */ + "ldr r10, [%[m], #380]\n\t" + "ldr r9, [%[a], #380]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #380]\n\t" + /* a[i+96] += m[96] * mu */ + "ldr r10, [%[m], #384]\n\t" + "ldr r9, [%[a], #384]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #384]\n\t" + /* a[i+97] += m[97] * mu */ + "ldr r10, [%[m], #388]\n\t" + "ldr r9, [%[a], #388]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #388]\n\t" + /* a[i+98] += m[98] * mu */ + "ldr r10, [%[m], #392]\n\t" + "ldr r9, [%[a], #392]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #392]\n\t" + /* a[i+99] += m[99] * mu */ + "ldr r10, [%[m], #396]\n\t" + "ldr r9, [%[a], #396]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #396]\n\t" + /* a[i+100] += m[100] * mu */ + "ldr r10, [%[m], #400]\n\t" + "ldr r9, [%[a], #400]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #400]\n\t" + /* a[i+101] += m[101] * mu */ + "ldr r10, [%[m], #404]\n\t" + "ldr r9, [%[a], #404]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #404]\n\t" + /* a[i+102] += m[102] * mu */ + "ldr r10, [%[m], #408]\n\t" + "ldr r9, [%[a], #408]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #408]\n\t" + /* a[i+103] += m[103] * mu */ + "ldr r10, [%[m], #412]\n\t" + "ldr r9, [%[a], #412]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #412]\n\t" + /* a[i+104] += m[104] * mu */ + "ldr r10, [%[m], #416]\n\t" + "ldr r9, [%[a], #416]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #416]\n\t" + /* a[i+105] += m[105] * mu */ + "ldr r10, [%[m], #420]\n\t" + "ldr r9, [%[a], #420]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #420]\n\t" + /* a[i+106] += m[106] * mu */ + "ldr r10, [%[m], #424]\n\t" + "ldr r9, [%[a], #424]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #424]\n\t" + /* a[i+107] += m[107] * mu */ + "ldr r10, [%[m], #428]\n\t" + "ldr r9, [%[a], #428]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #428]\n\t" + /* a[i+108] += m[108] * mu */ + "ldr r10, [%[m], #432]\n\t" + "ldr r9, [%[a], #432]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #432]\n\t" + /* a[i+109] += m[109] * mu */ + "ldr r10, [%[m], #436]\n\t" + "ldr r9, [%[a], #436]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #436]\n\t" + /* a[i+110] += m[110] * mu */ + "ldr r10, [%[m], #440]\n\t" + "ldr r9, [%[a], #440]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #440]\n\t" + /* a[i+111] += m[111] * mu */ + "ldr r10, [%[m], #444]\n\t" + "ldr r9, [%[a], #444]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #444]\n\t" + /* a[i+112] += m[112] * mu */ + "ldr r10, [%[m], #448]\n\t" + "ldr r9, [%[a], #448]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #448]\n\t" + /* a[i+113] += m[113] * mu */ + "ldr r10, [%[m], #452]\n\t" + "ldr r9, [%[a], #452]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #452]\n\t" + /* a[i+114] += m[114] * mu */ + "ldr r10, [%[m], #456]\n\t" + "ldr r9, [%[a], #456]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #456]\n\t" + /* a[i+115] += m[115] * mu */ + "ldr r10, [%[m], #460]\n\t" + "ldr r9, [%[a], #460]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #460]\n\t" + /* a[i+116] += m[116] * mu */ + "ldr r10, [%[m], #464]\n\t" + "ldr r9, [%[a], #464]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #464]\n\t" + /* a[i+117] += m[117] * mu */ + "ldr r10, [%[m], #468]\n\t" + "ldr r9, [%[a], #468]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #468]\n\t" + /* a[i+118] += m[118] * mu */ + "ldr r10, [%[m], #472]\n\t" + "ldr r9, [%[a], #472]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #472]\n\t" + /* a[i+119] += m[119] * mu */ + "ldr r10, [%[m], #476]\n\t" + "ldr r9, [%[a], #476]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #476]\n\t" + /* a[i+120] += m[120] * mu */ + "ldr r10, [%[m], #480]\n\t" + "ldr r9, [%[a], #480]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #480]\n\t" + /* a[i+121] += m[121] * mu */ + "ldr r10, [%[m], #484]\n\t" + "ldr r9, [%[a], #484]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #484]\n\t" + /* a[i+122] += m[122] * mu */ + "ldr r10, [%[m], #488]\n\t" + "ldr r9, [%[a], #488]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #488]\n\t" + /* a[i+123] += m[123] * mu */ + "ldr r10, [%[m], #492]\n\t" + "ldr r9, [%[a], #492]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #492]\n\t" + /* a[i+124] += m[124] * mu */ + "ldr r10, [%[m], #496]\n\t" + "ldr r9, [%[a], #496]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #496]\n\t" + /* a[i+125] += m[125] * mu */ + "ldr r10, [%[m], #500]\n\t" + "ldr r9, [%[a], #500]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #500]\n\t" + /* a[i+126] += m[126] * mu */ + "ldr r10, [%[m], #504]\n\t" + "ldr r9, [%[a], #504]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #504]\n\t" + /* a[i+127] += m[127] * mu */ + "ldr r10, [%[m], #508]\n\t" + "ldr r9, [%[a], #508]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #512]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #508]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #512]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #0x200\n\t" + "blt L_sp_4096_mont_reduce_128_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -56342,7 +57189,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -56356,7 +57203,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -56374,9 +57221,9 @@ */ static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r12, #0\n\t" @@ -56397,7 +57244,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc" ); return (uint32_t)(size_t)r; } @@ -56411,9 +57258,9 @@ */ static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -56643,7 +57490,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -56661,9 +57508,9 @@ */ static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -56703,7 +57550,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -56720,9 +57567,9 @@ */ static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -56752,7 +57599,7 @@ "bpl L_div_4096_word_128_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -56780,7 +57627,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -56808,7 +57655,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -56841,7 +57688,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -56856,8 +57703,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[256], t2[129]; sp_digit div, r1; @@ -56913,7 +57760,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_4096_mod_128_cond(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_4096_div_128_cond(a, m, NULL, r); } @@ -56959,8 +57807,8 @@ */ static sp_int32 sp_4096_cmp_128(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -56968,7 +57816,7 @@ "mov r5, #0\n\t" "mov r3, #-1\n\t" #ifdef WOLFSSL_SP_SMALL -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r4, #0x1\n\t" "lsl r4, r4, #8\n\t" "add r4, r4, #0xfc\n\t" @@ -58405,7 +59253,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -58419,8 +59267,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[256], t2[129]; sp_digit div, r1; @@ -58460,7 +59308,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_4096_mod_128(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_4096_div_128(a, m, NULL, r); } @@ -58940,10 +59789,10 @@ */ static sp_digit sp_4096_cond_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -58964,7 +59813,7 @@ "mov %[r], lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -58980,10 +59829,10 @@ */ static sp_digit sp_4096_cond_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r8, #0\n\t" @@ -59214,7 +60063,7 @@ "adc %[r], r8, r8\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -59536,9 +60385,9 @@ #ifdef HAVE_FFDHE_4096 static void sp_4096_lshift_128(sp_digit* r_p, const sp_digit* a_p, byte n_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register byte n asm ("r2") = n_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register byte n asm ("r2") = (byte)n_p; __asm__ __volatile__ ( "rsb r12, %[n], #31\n\t" @@ -60312,7 +61161,7 @@ "str r5, [%[r], #4]\n\t" : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : "memory", "r4", "r5", "r6", "r3", "r12" + : "memory", "r4", "r5", "r6", "r3", "r12", "cc" ); } @@ -60607,16 +61456,19 @@ */ static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x40\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_256_mul_8_outer_%=: \n\t" "subs r3, r5, #28\n\t" @@ -60627,7 +61479,44 @@ "L_sp_256_mul_8_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -60664,10 +61553,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #32\n\t" - "beq L_sp_256_mul_8_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_256_mul_8_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_256_mul_8_inner_done_%=\n\t" + "blt L_sp_256_mul_8_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_256_mul_8_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -60675,22 +61600,55 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #56\n\t" + "cmp r5, #52\n\t" "ble L_sp_256_mul_8_outer_%=\n\t" + "ldr lr, [%[a], #28]\n\t" + "ldr r11, [%[b], #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_256_mul_8_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_256_mul_8_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Multiply a and b into r. (r = a * b) * * r A single precision integer. @@ -60699,17 +61657,15 @@ */ static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #32\n\t" - "mov r10, #0\n\t" /* A[0] * B[0] */ "ldr r11, [%[a]]\n\t" "ldr r12, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r3, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -60732,14 +61688,9 @@ "adds r3, r3, r6\n\t" "adc r4, r4, r7\n\t" "mov r5, #0\n\t" -#else - "umull r3, r4, r11, r12\n\t" - "mov r5, #0\n\t" -#endif "str r3, [sp]\n\t" /* A[0] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -60769,16 +61720,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * B[0] */ "ldr r8, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -60807,16 +61750,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #4]\n\t" /* A[2] * B[0] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -60846,17 +61782,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * B[1] */ "ldr r11, [%[a], #4]\n\t" "ldr r12, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -60885,16 +61813,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[0] * B[2] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -60923,16 +61844,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [sp, #8]\n\t" /* A[0] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -60962,16 +61876,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[1] * B[2] */ "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61000,15 +61906,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[2] * B[1] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61037,16 +61936,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[3] * B[0] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61075,16 +61967,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [sp, #12]\n\t" /* A[4] * B[0] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61114,16 +61999,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[3] * B[1] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61152,16 +62029,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[2] * B[2] */ "ldr r11, [%[a], #8]\n\t" "ldr r12, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61190,16 +62060,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * B[3] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61228,16 +62091,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[0] * B[4] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61266,16 +62122,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #16]\n\t" /* A[0] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61305,17 +62154,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * B[4] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61344,15 +62185,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[2] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61381,15 +62215,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[3] * B[2] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61418,16 +62245,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[4] * B[1] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61456,16 +62276,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[5] * B[0] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61494,16 +62307,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [sp, #20]\n\t" /* A[6] * B[0] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61533,17 +62339,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[5] * B[1] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61572,15 +62370,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[4] * B[2] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61609,16 +62400,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[3] * B[3] */ "ldr r11, [%[a], #12]\n\t" "ldr r12, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61647,16 +62431,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[2] * B[4] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61685,16 +62462,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[1] * B[5] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61723,16 +62493,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[0] * B[6] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61761,16 +62524,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [sp, #24]\n\t" /* A[0] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61800,17 +62556,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * B[6] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61839,16 +62587,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[2] * B[5] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61877,15 +62618,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[3] * B[4] */ "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61914,15 +62648,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[4] * B[3] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61951,16 +62678,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[5] * B[2] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -61989,16 +62709,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[6] * B[1] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62027,16 +62740,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[7] * B[0] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62065,16 +62771,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #28]\n\t" /* A[7] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62104,17 +62803,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[6] * B[2] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62143,15 +62834,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[5] * B[3] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62180,16 +62864,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[4] * B[4] */ "ldr r11, [%[a], #16]\n\t" "ldr r12, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62218,16 +62895,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[3] * B[5] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62256,16 +62926,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[2] * B[6] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62294,16 +62957,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * B[7] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62332,16 +62988,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [%[r], #32]\n\t" /* A[2] * B[7] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62371,17 +63020,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[3] * B[6] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62410,15 +63051,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[4] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62447,15 +63081,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[5] * B[4] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62484,16 +63111,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[6] * B[3] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62522,16 +63142,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[7] * B[2] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62560,16 +63173,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [%[r], #36]\n\t" /* A[7] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62599,16 +63205,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[6] * B[4] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62637,16 +63235,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[5] * B[5] */ "ldr r11, [%[a], #20]\n\t" "ldr r12, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62675,16 +63266,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[4] * B[6] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62713,16 +63297,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[3] * B[7] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62751,16 +63328,9 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [%[r], #40]\n\t" /* A[4] * B[7] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62790,16 +63360,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[5] * B[6] */ "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62828,15 +63390,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[6] * B[5] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62865,16 +63420,9 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[7] * B[4] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62903,15 +63451,8 @@ "adds r5, r5, r6\n\t" "adcs r3, r3, r7\n\t" "adc r4, r4, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" -#endif "str r5, [%[r], #44]\n\t" /* A[7] * B[5] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62941,17 +63482,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[6] * B[6] */ "ldr r11, [%[a], #24]\n\t" "ldr r12, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -62980,16 +63513,9 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r11, r12\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif /* A[5] * B[7] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -63018,15 +63544,8 @@ "adds r3, r3, r6\n\t" "adcs r4, r4, r7\n\t" "adc r5, r5, #0\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" -#endif "str r3, [%[r], #48]\n\t" /* A[6] * B[7] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -63056,16 +63575,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r11, r9\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[7] * B[6] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -63094,15 +63605,8 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r12\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [%[r], #52]\n\t" /* A[7] * B[7] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -63127,11 +63631,6 @@ "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" "adc r3, r3, r7\n\t" -#else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r7\n\t" -#endif "str r5, [%[r], #56]\n\t" "str r3, [%[r], #60]\n\t" "ldm sp!, {r3, r4, r5, r6}\n\t" @@ -63140,10 +63639,495 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" + ); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Multiply a and b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "sub sp, sp, #36\n\t" + "str %[r], [sp, #32]\n\t" + "mov %[r], #0\n\t" + "ldr r12, [%[a]]\n\t" + /* A[0] * B[0] */ + "ldr lr, [%[b]]\n\t" + "umull r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "umull r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "umull r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "umull r9, r10, r12, lr\n\t" + "str r3, [sp]\n\t" + /* A[0] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "mov r11, %[r]\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[0] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adcs r6, r6, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[0] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adcs r8, r8, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[0] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adcs r10, r10, #0\n\t" + "adc r3, %[r], #0\n\t" + "umlal r10, r3, r12, lr\n\t" + /* A[1] * B[0] */ + "ldr r12, [%[a], #4]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "str r4, [sp, #4]\n\t" + "adds r5, r5, r11\n\t" + /* A[1] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[1] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r4, %[r], #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "ldr r12, [%[a], #8]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "str r5, [sp, #8]\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[2] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[2] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r5, %[r], #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "ldr r12, [%[a], #12]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[3] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[3] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[3] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r6, %[r], #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "ldr r12, [%[a], #16]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[4] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[4] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[4] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[4] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[4] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r7, %[r], #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "ldr r12, [%[a], #20]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[5] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[5] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[5] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[5] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[5] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r8, %[r], #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "ldr r12, [%[a], #24]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[6] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[6] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[6] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[6] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[6] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[6] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r9, %[r], #0\n\t" + "umlal r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "ldr r12, [%[a], #28]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[7] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[7] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[7] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[7] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[7] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[7] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r10, %[r], #0\n\t" + "umlal r9, r10, r12, lr\n\t" + "ldr %[r], [sp, #32]\n\t" + "add %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "sub %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add sp, sp, #36\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +/* Multiply a and b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "sub sp, sp, #44\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str %[r], [sp, #36]\n\t" + "str %[a], [sp, #40]\n\t" +#else + "strd %[r], %[a], [sp, #36]\n\t" +#endif + "mov lr, %[b]\n\t" + "ldm %[a], {%[r], %[a], %[b], r3}\n\t" + "ldm lr!, {r4, r5, r6}\n\t" + "umull r10, r11, %[r], r4\n\t" + "umull r12, r7, %[a], r4\n\t" + "umaal r11, r12, %[r], r5\n\t" + "umull r8, r9, %[b], r4\n\t" + "umaal r12, r8, %[a], r5\n\t" + "umaal r12, r7, %[r], r6\n\t" + "umaal r8, r9, r3, r4\n\t" + "stm sp, {r10, r11, r12}\n\t" + "umaal r7, r8, %[b], r5\n\t" + "ldm lr!, {r4}\n\t" + "umull r10, r11, %[a], r6\n\t" + "umaal r8, r9, %[b], r6\n\t" + "umaal r7, r10, %[r], r4\n\t" + "umaal r8, r11, r3, r5\n\t" + "str r7, [sp, #12]\n\t" + "umaal r8, r10, %[a], r4\n\t" + "umaal r9, r11, r3, r6\n\t" + "umaal r9, r10, %[b], r4\n\t" + "umaal r10, r11, r3, r4\n\t" + "ldm lr, {r4, r5, r6, r7}\n\t" + "mov r12, #0\n\t" + "umlal r8, r12, %[r], r4\n\t" + "umaal r9, r12, %[a], r4\n\t" + "umaal r10, r12, %[b], r4\n\t" + "umaal r11, r12, r3, r4\n\t" + "mov r4, #0\n\t" + "umlal r9, r4, %[r], r5\n\t" + "umaal r10, r4, %[a], r5\n\t" + "umaal r11, r4, %[b], r5\n\t" + "umaal r12, r4, r3, r5\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, %[r], r6\n\t" + "umaal r11, r5, %[a], r6\n\t" + "umaal r12, r5, %[b], r6\n\t" + "umaal r4, r5, r3, r6\n\t" + "mov r6, #0\n\t" + "umlal r11, r6, %[r], r7\n\t" + "ldr %[r], [sp, #40]\n\t" + "umaal r12, r6, %[a], r7\n\t" + "add %[r], %[r], #16\n\t" + "umaal r4, r6, %[b], r7\n\t" + "sub lr, lr, #16\n\t" + "umaal r5, r6, r3, r7\n\t" + "ldm %[r], {%[r], %[a], %[b], r3}\n\t" + "str r6, [sp, #32]\n\t" + "ldm lr!, {r6}\n\t" + "mov r7, #0\n\t" + "umlal r8, r7, %[r], r6\n\t" + "umaal r9, r7, %[a], r6\n\t" + "str r8, [sp, #16]\n\t" + "umaal r10, r7, %[b], r6\n\t" + "umaal r11, r7, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r8, #0\n\t" + "umlal r9, r8, %[r], r6\n\t" + "umaal r10, r8, %[a], r6\n\t" + "str r9, [sp, #20]\n\t" + "umaal r11, r8, %[b], r6\n\t" + "umaal r12, r8, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r9, #0\n\t" + "umlal r10, r9, %[r], r6\n\t" + "umaal r11, r9, %[a], r6\n\t" + "str r10, [sp, #24]\n\t" + "umaal r12, r9, %[b], r6\n\t" + "umaal r4, r9, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r10, #0\n\t" + "umlal r11, r10, %[r], r6\n\t" + "umaal r12, r10, %[a], r6\n\t" + "str r11, [sp, #28]\n\t" + "umaal r4, r10, %[b], r6\n\t" + "umaal r5, r10, r3, r6\n\t" + "ldm lr!, {r11}\n\t" + "umaal r12, r7, %[r], r11\n\t" + "umaal r4, r7, %[a], r11\n\t" + "ldr r6, [sp, #32]\n\t" + "umaal r5, r7, %[b], r11\n\t" + "umaal r6, r7, r3, r11\n\t" + "ldm lr!, {r11}\n\t" + "umaal r4, r8, %[r], r11\n\t" + "umaal r5, r8, %[a], r11\n\t" + "umaal r6, r8, %[b], r11\n\t" + "umaal r7, r8, r3, r11\n\t" + "ldm lr, {r11, lr}\n\t" + "umaal r5, r9, %[r], r11\n\t" + "umaal r6, r10, %[r], lr\n\t" + "umaal r6, r9, %[a], r11\n\t" + "umaal r7, r10, %[a], lr\n\t" + "umaal r7, r9, %[b], r11\n\t" + "umaal r8, r10, %[b], lr\n\t" + "umaal r8, r9, r3, r11\n\t" + "umaal r9, r10, r3, lr\n\t" + "mov r3, r12\n\t" + "ldr lr, [sp, #36]\n\t" + "add lr, lr, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "sub lr, lr, #32\n\t" + "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add sp, sp, #44\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc" ); } +#endif #endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL /* Square a and put result in r. (r = a * a) @@ -63153,29 +64137,28 @@ */ static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x40\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_256_sqr_8_outer_%=: \n\t" "subs r3, r5, #28\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_256_sqr_8_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_256_sqr_8_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -63224,11 +64207,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_256_sqr_8_op_done_%=\n\t" - "\n" - "L_sp_256_sqr_8_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_256_sqr_8_inner_done_%=\n\t" + "blt L_sp_256_sqr_8_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -63255,38 +64240,55 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_256_sqr_8_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #32\n\t" - "beq L_sp_256_sqr_8_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_256_sqr_8_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_256_sqr_8_inner_%=\n\t" - "\n" "L_sp_256_sqr_8_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #56\n\t" + "cmp r5, #52\n\t" "ble L_sp_256_sqr_8_outer_%=\n\t" + "ldr lr, [%[a], #28]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_256_sqr_8_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_256_sqr_8_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Square a and put result in r. (r = a * a) * * r A single precision integer. @@ -63294,14 +64296,13 @@ */ static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #32\n\t" /* A[0] * A[0] */ "ldr r10, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r9, r10, #16\n\t" "lsl r2, r10, #16\n\t" "lsr r2, r2, #16\n\t" @@ -63312,15 +64313,11 @@ "lsl r2, r2, #17\n\t" "adds r8, r8, r2\n\t" "adc r3, r3, r9\n\t" -#else - "umull r8, r3, r10, r10\n\t" -#endif "mov r4, #0\n\t" "str r8, [sp]\n\t" /* A[0] * A[1] */ "ldr r10, [%[a], #4]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63361,22 +64358,10 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [sp, #4]\n\t" /* A[0] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63417,20 +64402,8 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[1] * A[1] */ "ldr r10, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63450,17 +64423,10 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [sp, #8]\n\t" /* A[0] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63501,21 +64467,9 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[1] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63555,20 +64509,10 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" -#endif "str r2, [sp, #12]\n\t" /* A[0] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63609,21 +64553,9 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[1] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63663,18 +64595,8 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[2] * A[2] */ "ldr r10, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63694,17 +64616,10 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [sp, #16]\n\t" /* A[0] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63726,15 +64641,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r3, #0\n\t" "mov r7, #0\n\t" /* A[1] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63763,16 +64674,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[2] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63801,12 +64705,6 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" @@ -63817,7 +64715,6 @@ /* A[0] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63839,15 +64736,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r4, #0\n\t" "mov r7, #0\n\t" /* A[1] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63876,16 +64769,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[2] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63914,15 +64800,8 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[3] * A[3] */ "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63945,15 +64824,6 @@ "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" -#endif "adds r2, r2, r5\n\t" "adcs r3, r3, r6\n\t" "adc r4, r4, r7\n\t" @@ -63961,7 +64831,6 @@ /* A[0] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -63983,15 +64852,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r2, #0\n\t" "mov r7, #0\n\t" /* A[1] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64020,16 +64885,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[2] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64058,16 +64916,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[3] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64096,12 +64947,6 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" @@ -64112,7 +64957,6 @@ /* A[1] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64134,15 +64978,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r3, #0\n\t" "mov r7, #0\n\t" /* A[2] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64171,16 +65011,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[3] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64209,15 +65042,8 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[4] * A[4] */ "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64240,15 +65066,6 @@ "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adc r7, r7, r7\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" -#endif "adds r4, r4, r5\n\t" "adcs r2, r2, r6\n\t" "adc r3, r3, r7\n\t" @@ -64256,7 +65073,6 @@ /* A[2] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64278,15 +65094,11 @@ "lsl r8, r8, #16\n\t" "adds r5, r5, r8\n\t" "adc r6, r6, r9\n\t" -#else - "umull r5, r6, r10, r12\n\t" -#endif "mov r4, #0\n\t" "mov r7, #0\n\t" /* A[3] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64315,16 +65127,9 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif /* A[4] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64353,12 +65158,6 @@ "adds r5, r5, r8\n\t" "adcs r6, r6, r9\n\t" "adc r7, r7, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r5, r5, r8\n\t" - "adcs r6, r6, r9\n\t" - "adc r7, r7, #0\n\t" -#endif "adds r5, r5, r5\n\t" "adcs r6, r6, r6\n\t" "adc r7, r7, r7\n\t" @@ -64369,7 +65168,6 @@ /* A[3] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64410,21 +65208,9 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[4] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64464,18 +65250,8 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif /* A[5] * A[5] */ "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64495,17 +65271,10 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [%[r], #40]\n\t" /* A[4] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64546,21 +65315,9 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" -#endif /* A[5] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64600,20 +65357,10 @@ "adds r4, r4, r8\n\t" "adcs r2, r2, r9\n\t" "adc r3, r3, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r8\n\t" - "adcs r2, r2, r9\n\t" - "adc r3, r3, #0\n\t" -#endif "str r4, [%[r], #44]\n\t" /* A[5] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64654,20 +65401,8 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" -#endif /* A[6] * A[6] */ "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64687,17 +65422,10 @@ "adds r2, r2, r8\n\t" "adcs r3, r3, r9\n\t" "adc r4, r4, #0\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adc r4, r4, #0\n\t" -#endif "str r2, [%[r], #48]\n\t" /* A[6] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64738,21 +65466,9 @@ "adds r3, r3, r8\n\t" "adcs r4, r4, r9\n\t" "adc r2, r2, #0\n\t" -#else - "umull r8, r9, r10, r12\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "mov r2, #0\n\t" - "adc r2, r2, #0\n\t" -#endif "str r3, [%[r], #52]\n\t" /* A[7] * A[7] */ "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -64770,11 +65486,6 @@ "lsl r8, r8, #17\n\t" "adds r4, r4, r8\n\t" "adc r2, r2, r9\n\t" -#else - "umull r8, r9, r10, r10\n\t" - "adds r4, r4, r8\n\t" - "adc r2, r2, r9\n\t" -#endif "str r4, [%[r], #56]\n\t" "str r2, [%[r], #60]\n\t" "ldm sp!, {r2, r3, r4, r8}\n\t" @@ -64783,10 +65494,370 @@ "stm %[r]!, {r2, r3, r4, r8}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" + ); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Square a and put result in r. (r = a * a) + * + * r A single precision integer. + * a A single precision integer. + */ +static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str %[r], [sp, #64]\n\t" + "mov %[r], #0\n\t" + "ldr r12, [%[a]]\n\t" + /* A[0] * A[1] */ + "ldr lr, [%[a], #4]\n\t" + "umull r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "ldr lr, [%[a], #12]\n\t" + "umull r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "umull r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "umull r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "ldr lr, [%[a], #8]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[0] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[0] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + "adcs r3, r3, #0\n\t" + "str r4, [sp, #4]\n\t" + "str r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "ldr r12, [%[a], #4]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * A[3] */ + "ldr lr, [%[a], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r4, %[r], #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "ldr r12, [%[a], #8]\n\t" + "ldr lr, [%[a], #12]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r5, %[r], #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "ldr r12, [%[a], #12]\n\t" + "ldr lr, [%[a], #16]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r6, %[r], #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "ldr r12, [%[a], #16]\n\t" + "ldr lr, [%[a], #20]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r7, %[r], #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "ldr r12, [%[a], #20]\n\t" + "ldr lr, [%[a], #24]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r8, %[r], #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "ldr r12, [%[a], #24]\n\t" + "ldr lr, [%[a], #28]\n\t" + "mov r9, #0\n\t" + "umlal r8, r9, r12, lr\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "adcs r3, r3, r3\n\t" + "adcs r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adc r10, %[r], #0\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "mov lr, sp\n\t" + /* A[0] * A[0] */ + "ldr r12, [%[a]]\n\t" + "umull r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[1] * A[1] */ + "ldr r12, [%[a], #4]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * A[2] */ + "ldr r12, [%[a], #8]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * A[3] */ + "ldr r12, [%[a], #12]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, r12\n\t" + "adds r10, r10, r11\n\t" + "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "ldr r12, [%[a], #16]\n\t" + "adcs r3, r3, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * A[5] */ + "ldr r12, [%[a], #20]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * A[6] */ + "ldr r12, [%[a], #24]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * A[7] */ + "ldr r12, [%[a], #28]\n\t" + "adcs r9, r9, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r9, r10, r12, r12\n\t" + "ldr %[r], [sp, #64]\n\t" + "add %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "sub %[r], %[r], #32\n\t" + "stm %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +/* Square a and put result in r. (r = a * a) + * + * r A single precision integer. + * a A single precision integer. + */ +static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #32\n\t" + "str %[r], [sp, #28]\n\t" + "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t" + "umull r9, r10, %[r], %[r]\n\t" + "umull r11, r12, %[r], %[a]\n\t" + "adds r11, r11, r11\n\t" + "mov lr, #0\n\t" + "umaal r10, r11, lr, lr\n\t" + "stm sp, {r9, r10}\n\t" + "mov r8, lr\n\t" + "umaal r8, r12, %[r], r2\n\t" + "adcs r8, r8, r8\n\t" + "umaal r8, r11, %[a], %[a]\n\t" + "umull r9, r10, %[r], r3\n\t" + "umaal r9, r12, %[a], r2\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #8]\n\t" + "str r9, [sp, #12]\n\t" +#else + "strd r8, r9, [sp, #8]\n\t" +#endif + "mov r9, lr\n\t" + "umaal r9, r10, %[r], r4\n\t" + "umaal r9, r12, %[a], r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r2, r2\n\t" + "str r9, [sp, #16]\n\t" + "umull r9, r8, %[r], r5\n\t" + "umaal r9, r12, %[a], r4\n\t" + "umaal r9, r10, r2, r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" + "str r9, [sp, #20]\n\t" + "mov r9, lr\n\t" + "umaal r9, r8, %[r], r6\n\t" + "umaal r9, r12, %[a], r5\n\t" + "umaal r9, r10, r2, r4\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r3, r3\n\t" + "str r9, [sp, #24]\n\t" + "umull %[r], r9, %[r], r7\n\t" + "umaal %[r], r8, %[a], r6\n\t" + "umaal %[r], r12, r2, r5\n\t" + "umaal %[r], r10, r3, r4\n\t" + "adcs %[r], %[r], %[r]\n\t" + "umaal %[r], r11, lr, lr\n\t" + /* R[7] = r0 */ + "umaal r9, r8, %[a], r7\n\t" + "umaal r9, r10, r2, r6\n\t" + "umaal r12, r9, r3, r5\n\t" + "adcs r12, r12, r12\n\t" + "umaal r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "umaal r9, r8, r2, r7\n\t" + "umaal r10, r9, r3, r6\n\t" + "mov r2, lr\n\t" + "umaal r10, r2, r4, r5\n\t" + "adcs r10, r10, r10\n\t" + "umaal r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "umaal r2, r8, r3, r7\n\t" + "umaal r2, r9, r4, r6\n\t" + "adcs r3, r2, r2\n\t" + "umaal r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "mov %[a], lr\n\t" + "umaal %[a], r8, r4, r7\n\t" + "umaal %[a], r9, r5, r6\n\t" + "adcs r4, %[a], %[a]\n\t" + "umaal r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "umaal r8, r9, r5, r7\n\t" + "adcs r8, r8, r8\n\t" + "umaal r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "mov r5, lr\n\t" + "umaal r5, r9, r6, r7\n\t" + "adcs r5, r5, r5\n\t" + "umaal r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "adcs r9, r9, r9\n\t" + "umaal r9, r5, r7, r7\n\t" + "adcs r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + "ldr lr, [sp, #28]\n\t" + "add lr, lr, #28\n\t" + "stm lr!, {%[r], r12}\n\t" + "stm lr!, {r11}\n\t" + "stm lr!, {r10}\n\t" + "stm lr!, {r3, r4, r8, r9}\n\t" + "stm lr!, {r7}\n\t" + "sub lr, lr, #0x40\n\t" + "ldm sp, {%[r], %[a], r2, r3, r4, r5, r6}\n\t" + "stm lr, {%[r], %[a], r2, r3, r4, r5, r6}\n\t" + "add sp, sp, #32\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } +#endif #endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL /* Add b to a into r. (r = a + b) @@ -64797,9 +65868,9 @@ */ static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -64821,7 +65892,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -64835,12 +65906,11 @@ */ static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -64855,84 +65925,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "add lr, %[a], #32\n\t" - "\n" - "L_sp_256_sub_8_word_%=: \n\t" - "rsbs r12, r12, #0\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "sbc r12, r3, r3\n\t" - "cmp %[a], lr\n\t" - "bne L_sp_256_sub_8_word_%=\n\t" - "mov %[r], r12\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "subs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "sbc %[r], r6, r6\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -64946,8 +65943,8 @@ */ static int sp_256_mod_mul_norm_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #24\n\t" @@ -65168,7 +66165,7 @@ "add sp, sp, #24\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc" ); (void)m_p; return (uint32_t)(size_t)r; @@ -65184,14 +66181,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -65369,6 +66366,7 @@ return err; } +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -65376,13 +66374,13 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ static SP_NOINLINE void sp_256_mont_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x44\n\t" @@ -65390,7 +66388,6 @@ /* A[0] * B[0] */ "ldr r6, [%[a]]\n\t" "ldr r7, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r8, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65412,13 +66409,9 @@ "lsl r3, r3, #16\n\t" "adds r8, r8, r3\n\t" "adc r9, r9, r4\n\t" -#else - "umull r8, r9, r6, r7\n\t" -#endif "str r8, [sp]\n\t" /* A[0] * B[1] */ "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65444,15 +66437,9 @@ "lsl r3, r3, #16\n\t" "adds r9, r9, r3\n\t" "adc r10, r10, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adc r10, r4, #0\n\t" -#endif /* A[1] * B[0] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65481,16 +66468,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, #0\n\t" -#endif "str r9, [sp, #4]\n\t" /* A[2] * B[0] */ "ldr r6, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65515,15 +66495,9 @@ "lsl r3, r3, #16\n\t" "adds r10, r10, r3\n\t" "adc lr, lr, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adc lr, r4, lr\n\t" -#endif /* A[1] * B[1] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65552,16 +66526,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, #0\n\t" -#endif /* A[0] * B[2] */ "ldr r6, [%[a]]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65590,16 +66557,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif "str r10, [sp, #8]\n\t" /* A[0] * B[3] */ "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65628,16 +66588,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, #0\n\t" -#endif /* A[1] * B[2] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65666,16 +66619,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[2] * B[1] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65704,16 +66650,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[3] * B[0] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65742,16 +66681,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif "str lr, [sp, #12]\n\t" /* A[4] * B[0] */ "ldr r6, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65780,16 +66712,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" -#endif /* A[3] * B[1] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65818,16 +66743,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[2] * B[2] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65856,16 +66774,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[1] * B[3] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65894,16 +66805,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[0] * B[4] */ "ldr r6, [%[a]]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65932,16 +66836,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif "str r8, [sp, #16]\n\t" /* A[0] * B[5] */ "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -65970,16 +66867,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, #0\n\t" -#endif /* A[1] * B[4] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66008,16 +66898,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[2] * B[3] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66046,16 +66929,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[3] * B[2] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66084,16 +66960,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[4] * B[1] */ "ldr r6, [%[a], #16]\n\t" "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66122,16 +66991,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[5] * B[0] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66160,16 +67022,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif "str r9, [sp, #20]\n\t" /* A[6] * B[0] */ "ldr r6, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66198,16 +67053,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, #0\n\t" -#endif /* A[5] * B[1] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66236,16 +67084,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[4] * B[2] */ "ldr r6, [%[a], #16]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66274,16 +67115,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[3] * B[3] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66312,16 +67146,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[2] * B[4] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66350,16 +67177,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[1] * B[5] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66388,16 +67208,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[0] * B[6] */ "ldr r6, [%[a]]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66426,16 +67239,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif "str r10, [sp, #24]\n\t" /* A[0] * B[7] */ "ldr r7, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66464,16 +67270,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, #0\n\t" -#endif /* A[1] * B[6] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66502,16 +67301,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[2] * B[5] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66540,16 +67332,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[3] * B[4] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66578,16 +67363,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[4] * B[3] */ "ldr r6, [%[a], #16]\n\t" "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66616,16 +67394,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[5] * B[2] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66654,16 +67425,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[6] * B[1] */ "ldr r6, [%[a], #24]\n\t" "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66692,16 +67456,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[7] * B[0] */ "ldr r6, [%[a], #28]\n\t" "ldr r7, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66730,16 +67487,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif "str lr, [sp, #28]\n\t" /* A[7] * B[1] */ "ldr r7, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66768,16 +67518,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" -#endif /* A[6] * B[2] */ "ldr r6, [%[a], #24]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66806,16 +67549,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[5] * B[3] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66844,16 +67580,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[4] * B[4] */ "ldr r6, [%[a], #16]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66882,16 +67611,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[3] * B[5] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66920,16 +67642,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[2] * B[6] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66958,16 +67673,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[1] * B[7] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -66996,16 +67704,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif "str r8, [sp, #32]\n\t" /* A[2] * B[7] */ "ldr r6, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67034,16 +67735,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, #0\n\t" -#endif /* A[3] * B[6] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67072,16 +67766,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[4] * B[5] */ "ldr r6, [%[a], #16]\n\t" "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67110,16 +67797,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[5] * B[4] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67148,16 +67828,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[6] * B[3] */ "ldr r6, [%[a], #24]\n\t" "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67186,16 +67859,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[7] * B[2] */ "ldr r6, [%[a], #28]\n\t" "ldr r7, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67224,16 +67890,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif "str r9, [sp, #36]\n\t" /* A[7] * B[3] */ "ldr r7, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67262,16 +67921,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, #0\n\t" -#endif /* A[6] * B[4] */ "ldr r6, [%[a], #24]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67300,16 +67952,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[5] * B[5] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67338,16 +67983,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[4] * B[6] */ "ldr r6, [%[a], #16]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67376,16 +68014,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[3] * B[7] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67414,16 +68045,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif "str r10, [sp, #40]\n\t" /* A[4] * B[7] */ "ldr r6, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67452,16 +68076,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, #0\n\t" -#endif /* A[5] * B[6] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67490,16 +68107,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[6] * B[5] */ "ldr r6, [%[a], #24]\n\t" "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67528,16 +68138,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[7] * B[4] */ "ldr r6, [%[a], #28]\n\t" "ldr r7, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67566,16 +68169,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif "str lr, [sp, #44]\n\t" /* A[7] * B[5] */ "ldr r7, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67604,16 +68200,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" -#endif /* A[6] * B[6] */ "ldr r6, [%[a], #24]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67642,16 +68231,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[5] * B[7] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67680,15 +68262,8 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[6] * B[7] */ "ldr r6, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67717,16 +68292,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, #0\n\t" -#endif /* A[7] * B[6] */ "ldr r6, [%[a], #28]\n\t" "ldr r7, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67755,15 +68323,8 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[7] * B[7] */ "ldr r7, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67788,194 +68349,896 @@ "lsl r3, r3, #16\n\t" "adds r10, r10, r3\n\t" "adc lr, lr, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adc lr, r4, lr\n\t" -#endif "str r8, [sp, #48]\n\t" "str r9, [sp, #52]\n\t" "str r10, [sp, #56]\n\t" "str lr, [sp, #60]\n\t" + "str %[r], [sp, #64]\n\t" /* Start Reduction */ - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" - "ldr r6, [sp, #8]\n\t" - "ldr r7, [sp, #12]\n\t" - "ldr r8, [sp, #16]\n\t" - "ldr r9, [sp, #20]\n\t" - "ldr r10, [sp, #24]\n\t" - "ldr lr, [sp, #28]\n\t" - /* mu = a[0..7] + a[0..4] << 96 + (a[0..1] * 2) << 192 */ + "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "mov r3, r11\n\t" + "mov r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ /* - a[0] << 224 */ - /* + (a[0..1] * 2) << (6 * 32) */ - "adds r10, r10, r4\n\t" - "adc lr, lr, r5\n\t" - "adds r10, r10, r4\n\t" - "adc lr, lr, r5\n\t" + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" /* - a[0] << (7 * 32) */ - "sub lr, lr, r4\n\t" - /* + a[0..4] << (3 * 32) */ - "mov %[a], r7\n\t" - "mov r12, r8\n\t" - "adds r7, r7, r4\n\t" - "adcs r8, r8, r5\n\t" + "sub r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "mov r0, r8\n\t" + "mov r1, r9\n\t" + "mov r2, r10\n\t" + "adds r8, r8, r5\n\t" "adcs r9, r9, r6\n\t" - "adcs r10, r10, %[a]\n\t" - "adc lr, lr, r12\n\t" - "str r7, [sp, #12]\n\t" - "str r8, [sp, #16]\n\t" - "str r9, [sp, #20]\n\t" + "adcs r10, r10, r7\n\t" + "adcs r11, r11, r0\n\t" + "adc r12, r12, r1\n\t" /* a += mu * m */ /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ - /* a[6] += t[0] + t[3] */ - /* a[7] += t[1] + t[4] */ - "ldr %[a], [sp, #24]\n\t" - "ldr %[b], [sp, #28]\n\t" - "adds %[a], %[a], r4\n\t" - "adcs %[b], %[b], r5\n\t" - "mov r12, #0\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r7\n\t" - "adcs %[b], %[b], r8\n\t" - "adc r12, r12, #0\n\t" - "str r10, [sp, #24]\n\t" - "str lr, [sp, #28]\n\t" - "str %[b], [sp, #64]\n\t" - /* a[8] += t[0] + t[2] + t[5] */ - /* a[9] += t[1] + t[3] + t[6] */ - /* a[10] += t[2] + t[4] + t[7] */ - "ldr %[a], [sp, #32]\n\t" - "ldr %[b], [sp, #36]\n\t" - "ldr r3, [sp, #40]\n\t" - "adds %[a], %[a], r12\n\t" - "adcs %[b], %[b], #0\n\t" + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "adds r0, r0, r5\n\t" + "adcs r1, r1, r6\n\t" + "adcs r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc lr, lr, #0\n\t" + "str r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] + carry */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "add r0, sp, #32\n\t" + "ldm r0, {r2, r3, r4}\n\t" + "adds r2, r2, lr\n\t" "adcs r3, r3, #0\n\t" - "mov r12, #0\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r4\n\t" - "adcs %[b], %[b], r5\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r5\n\t" "adcs r3, r3, r6\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r6\n\t" - "adcs %[b], %[b], r7\n\t" + "adcs r4, r4, r7\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r7\n\t" "adcs r3, r3, r8\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r9\n\t" - "adcs %[b], %[b], r10\n\t" - "adcs r3, r3, lr\n\t" - "adc r12, r12, #0\n\t" - "str %[a], [sp, #32]\n\t" - "str %[b], [sp, #36]\n\t" - "str r3, [sp, #40]\n\t" - /* a[11] += t[3] + t[5] */ - /* a[12] += t[4] + t[6] */ - /* a[13] += t[5] + t[7] */ - /* a[14] += t[6] */ - /* a[15] += t[7] */ - "ldr %[a], [sp, #44]\n\t" - "ldr %[b], [sp, #48]\n\t" - "ldr r3, [sp, #52]\n\t" - "ldr r4, [sp, #56]\n\t" - "ldr r5, [sp, #60]\n\t" - "adds %[a], %[a], r12\n\t" - "adcs %[b], %[b], #0\n\t" + "adcs r4, r4, r9\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "stm r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "ldm r0, {r0, r1, r2, r3, r4}\n\t" + "adds r0, r0, lr\n\t" + "adcs r1, r1, #0\n\t" + "adcs r2, r2, #0\n\t" "adcs r3, r3, #0\n\t" "adcs r4, r4, #0\n\t" - "adcs r5, r5, #0\n\t" - "mov r12, #0\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r7\n\t" - "adcs %[b], %[b], r8\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adcs r5, r5, lr\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r9\n\t" - "adcs %[b], %[b], r10\n\t" - "adcs r3, r3, lr\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r8\n\t" + "adcs r1, r1, r9\n\t" + "adcs r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r10\n\t" + "adcs r1, r1, r11\n\t" + "adcs r2, r2, r12\n\t" + "adcs r3, r3, #0\n\t" "adcs r4, r4, #0\n\t" - "adcs r5, r5, #0\n\t" - "adc r12, r12, #0\n\t" - "str %[a], [sp, #44]\n\t" - "str %[b], [sp, #48]\n\t" - "str r3, [sp, #52]\n\t" - "str r4, [sp, #56]\n\t" - "str r5, [sp, #60]\n\t" - "ldr %[a], [sp, #64]\n\t" - "ldr %[b], [sp, #32]\n\t" - "ldr r3, [sp, #36]\n\t" - "ldr r4, [sp, #40]\n\t" - "ldr r8, [sp]\n\t" - "ldr r9, [sp, #4]\n\t" - "ldr r10, [sp, #8]\n\t" - "ldr lr, [sp, #12]\n\t" - "subs %[a], %[a], r8\n\t" - "sbcs %[b], %[b], r9\n\t" - "sbcs r3, r3, r10\n\t" - "sbcs r4, r4, lr\n\t" - "str %[b], [sp, #32]\n\t" - "str r3, [sp, #36]\n\t" - "str r4, [sp, #40]\n\t" - "ldr %[a], [sp, #44]\n\t" - "ldr %[b], [sp, #48]\n\t" - "ldr r3, [sp, #52]\n\t" - "ldr r4, [sp, #56]\n\t" - "ldr r5, [sp, #60]\n\t" - "ldr r8, [sp, #16]\n\t" - "ldr r9, [sp, #20]\n\t" - "ldr r10, [sp, #24]\n\t" - "ldr lr, [sp, #28]\n\t" - "sbcs %[a], %[a], r8\n\t" - "sbcs %[b], %[b], r9\n\t" - "sbcs r3, r3, r10\n\t" - "sbcs r4, r4, lr\n\t" - "sbc r5, r5, #0\n\t" + "adc lr, lr, #0\n\t" + "str r0, [sp, #44]\n\t" + "str r1, [sp, #48]\n\t" + "str r2, [sp, #52]\n\t" + "str r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "add r0, sp, #28\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" + "subs r0, r0, r5\n\t" + "sbcs r1, r1, r6\n\t" + "sbcs r2, r2, r7\n\t" + "sbcs r3, r3, r8\n\t" + "add r0, sp, #44\n\t" + "mov r8, r4\n\t" + "ldm r0, {r4, r5, r6, r7}\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" + "sbcs r7, r7, r12\n\t" + "sbcs r8, r8, #0\n\t" + "sbc lr, lr, #0\n\t" /* mask m and sub from result if overflow */ - "rsb r12, r12, #0\n\t" - "and lr, r12, #1\n\t" - "ldr r6, [sp, #32]\n\t" - "ldr r7, [sp, #36]\n\t" - "ldr r8, [sp, #40]\n\t" - "subs r6, r6, r12\n\t" + "rsb lr, lr, #0\n\t" + "subs r1, r1, lr\n\t" + "sbcs r2, r2, lr\n\t" + "sbcs r3, r3, lr\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, lr, lsr #31\n\t" + "sbc r8, r8, lr\n\t" + "ldr %[r], [sp, #64]\n\t" + "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r12", "cc" + ); + (void)m_p; + (void)mp_p; +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Multiply two Montgomery form numbers mod the modulus (prime). + * (r = a * b mod m) + * + * r Result of multiplication. + * a First number to multiply in Montgomery form. + * b Second number to multiply in Montgomery form. + * m Modulus (prime). + * mp Montgomery multiplier. + */ +static SP_NOINLINE void sp_256_mont_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str %[r], [sp, #64]\n\t" + "mov %[r], #0\n\t" + "ldr r12, [%[a]]\n\t" + /* A[0] * B[0] */ + "ldr lr, [%[b]]\n\t" + "umull r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "umull r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "umull r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "umull r9, r10, r12, lr\n\t" + "str r3, [sp]\n\t" + /* A[0] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "mov r11, %[r]\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[0] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adcs r6, r6, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[0] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adcs r8, r8, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[0] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adcs r10, r10, #0\n\t" + "adc r3, %[r], #0\n\t" + "umlal r10, r3, r12, lr\n\t" + /* A[1] * B[0] */ + "ldr r12, [%[a], #4]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "str r4, [sp, #4]\n\t" + "adds r5, r5, r11\n\t" + /* A[1] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[1] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r4, %[r], #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "ldr r12, [%[a], #8]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "str r5, [sp, #8]\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[2] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[2] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r5, %[r], #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "ldr r12, [%[a], #12]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[3] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[3] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[3] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r6, %[r], #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "ldr r12, [%[a], #16]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[4] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[4] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[4] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[4] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[4] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r7, %[r], #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "ldr r12, [%[a], #20]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[5] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[5] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[5] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[5] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[5] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r8, %[r], #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "ldr r12, [%[a], #24]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[6] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[6] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[6] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[6] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[6] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[6] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r9, %[r], #0\n\t" + "umlal r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "ldr r12, [%[a], #28]\n\t" + "ldr lr, [%[b]]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[7] * B[1] */ + "ldr lr, [%[b], #4]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[7] * B[2] */ + "ldr lr, [%[b], #8]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[7] * B[3] */ + "ldr lr, [%[b], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[7] * B[4] */ + "ldr lr, [%[b], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[7] * B[5] */ + "ldr lr, [%[b], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * B[6] */ + "ldr lr, [%[b], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[7] * B[7] */ + "ldr lr, [%[b], #28]\n\t" + "adc r10, %[r], #0\n\t" + "umlal r9, r10, r12, lr\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* Start Reduction */ + "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "mov r3, r11\n\t" + "mov r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "sub r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "mov r0, r8\n\t" + "mov r1, r9\n\t" + "mov r2, r10\n\t" + "adds r8, r8, r5\n\t" + "adcs r9, r9, r6\n\t" + "adcs r10, r10, r7\n\t" + "adcs r11, r11, r0\n\t" + "adc r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "adds r0, r0, r5\n\t" + "adcs r1, r1, r6\n\t" + "adcs r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc lr, lr, #0\n\t" + "str r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] + carry */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "add r0, sp, #32\n\t" + "ldm r0, {r2, r3, r4}\n\t" + "adds r2, r2, lr\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r5\n\t" + "adcs r3, r3, r6\n\t" + "adcs r4, r4, r7\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "stm r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "ldm r0, {r0, r1, r2, r3, r4}\n\t" + "adds r0, r0, lr\n\t" + "adcs r1, r1, #0\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r8\n\t" + "adcs r1, r1, r9\n\t" + "adcs r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r10\n\t" + "adcs r1, r1, r11\n\t" + "adcs r2, r2, r12\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adc lr, lr, #0\n\t" + "str r0, [sp, #44]\n\t" + "str r1, [sp, #48]\n\t" + "str r2, [sp, #52]\n\t" + "str r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "add r0, sp, #28\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" + "subs r0, r0, r5\n\t" + "sbcs r1, r1, r6\n\t" + "sbcs r2, r2, r7\n\t" + "sbcs r3, r3, r8\n\t" + "add r0, sp, #44\n\t" + "mov r8, r4\n\t" + "ldm r0, {r4, r5, r6, r7}\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" "sbcs r7, r7, r12\n\t" - "sbcs r8, r8, r12\n\t" - "sbcs %[a], %[a], #0\n\t" - "sbcs %[b], %[b], #0\n\t" - "sbcs r3, r3, #0\n\t" - "sbcs r4, r4, lr\n\t" - "sbc r5, r5, r12\n\t" - "stm %[r]!, {r6, r7, r8}\n\t" - "stm %[r]!, {%[a], %[b], r3, r4, r5}\n\t" + "sbcs r8, r8, #0\n\t" + "sbc lr, lr, #0\n\t" + /* mask m and sub from result if overflow */ + "rsb lr, lr, #0\n\t" + "subs r1, r1, lr\n\t" + "sbcs r2, r2, lr\n\t" + "sbcs r3, r3, lr\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, lr, lsr #31\n\t" + "sbc r8, r8, lr\n\t" + "ldr %[r], [sp, #64]\n\t" + "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" "add sp, sp, #0x44\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + (void)m_p; (void)mp_p; +} + +#else +/* Multiply two Montgomery form numbers mod the modulus (prime). + * (r = a * b mod m) + * + * r Result of multiplication. + * a First number to multiply in Montgomery form. + * b Second number to multiply in Montgomery form. + * m Modulus (prime). + * mp Montgomery multiplier. + */ +static SP_NOINLINE void sp_256_mont_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x4c\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str %[r], [sp, #68]\n\t" + "str %[a], [sp, #72]\n\t" +#else + "strd %[r], %[a], [sp, #68]\n\t" +#endif + "mov lr, %[b]\n\t" + "ldm %[a], {%[r], %[a], %[b], r3}\n\t" + "ldm lr!, {r4, r5, r6}\n\t" + "umull r10, r11, %[r], r4\n\t" + "umull r12, r7, %[a], r4\n\t" + "umaal r11, r12, %[r], r5\n\t" + "umull r8, r9, %[b], r4\n\t" + "umaal r12, r8, %[a], r5\n\t" + "umaal r12, r7, %[r], r6\n\t" + "umaal r8, r9, r3, r4\n\t" + "stm sp, {r10, r11, r12}\n\t" + "umaal r7, r8, %[b], r5\n\t" + "ldm lr!, {r4}\n\t" + "umull r10, r11, %[a], r6\n\t" + "umaal r8, r9, %[b], r6\n\t" + "umaal r7, r10, %[r], r4\n\t" + "umaal r8, r11, r3, r5\n\t" + "str r7, [sp, #12]\n\t" + "umaal r8, r10, %[a], r4\n\t" + "umaal r9, r11, r3, r6\n\t" + "umaal r9, r10, %[b], r4\n\t" + "umaal r10, r11, r3, r4\n\t" + "ldm lr, {r4, r5, r6, r7}\n\t" + "mov r12, #0\n\t" + "umlal r8, r12, %[r], r4\n\t" + "umaal r9, r12, %[a], r4\n\t" + "umaal r10, r12, %[b], r4\n\t" + "umaal r11, r12, r3, r4\n\t" + "mov r4, #0\n\t" + "umlal r9, r4, %[r], r5\n\t" + "umaal r10, r4, %[a], r5\n\t" + "umaal r11, r4, %[b], r5\n\t" + "umaal r12, r4, r3, r5\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, %[r], r6\n\t" + "umaal r11, r5, %[a], r6\n\t" + "umaal r12, r5, %[b], r6\n\t" + "umaal r4, r5, r3, r6\n\t" + "mov r6, #0\n\t" + "umlal r11, r6, %[r], r7\n\t" + "ldr %[r], [sp, #72]\n\t" + "umaal r12, r6, %[a], r7\n\t" + "add %[r], %[r], #16\n\t" + "umaal r4, r6, %[b], r7\n\t" + "sub lr, lr, #16\n\t" + "umaal r5, r6, r3, r7\n\t" + "ldm %[r], {%[r], %[a], %[b], r3}\n\t" + "str r6, [sp, #64]\n\t" + "ldm lr!, {r6}\n\t" + "mov r7, #0\n\t" + "umlal r8, r7, %[r], r6\n\t" + "umaal r9, r7, %[a], r6\n\t" + "str r8, [sp, #16]\n\t" + "umaal r10, r7, %[b], r6\n\t" + "umaal r11, r7, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r8, #0\n\t" + "umlal r9, r8, %[r], r6\n\t" + "umaal r10, r8, %[a], r6\n\t" + "str r9, [sp, #20]\n\t" + "umaal r11, r8, %[b], r6\n\t" + "umaal r12, r8, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r9, #0\n\t" + "umlal r10, r9, %[r], r6\n\t" + "umaal r11, r9, %[a], r6\n\t" + "str r10, [sp, #24]\n\t" + "umaal r12, r9, %[b], r6\n\t" + "umaal r4, r9, r3, r6\n\t" + "ldm lr!, {r6}\n\t" + "mov r10, #0\n\t" + "umlal r11, r10, %[r], r6\n\t" + "umaal r12, r10, %[a], r6\n\t" + "str r11, [sp, #28]\n\t" + "umaal r4, r10, %[b], r6\n\t" + "umaal r5, r10, r3, r6\n\t" + "ldm lr!, {r11}\n\t" + "umaal r12, r7, %[r], r11\n\t" + "umaal r4, r7, %[a], r11\n\t" + "ldr r6, [sp, #64]\n\t" + "umaal r5, r7, %[b], r11\n\t" + "umaal r6, r7, r3, r11\n\t" + "ldm lr!, {r11}\n\t" + "umaal r4, r8, %[r], r11\n\t" + "umaal r5, r8, %[a], r11\n\t" + "umaal r6, r8, %[b], r11\n\t" + "umaal r7, r8, r3, r11\n\t" + "ldm lr, {r11, lr}\n\t" + "umaal r5, r9, %[r], r11\n\t" + "umaal r6, r10, %[r], lr\n\t" + "umaal r6, r9, %[a], r11\n\t" + "umaal r7, r10, %[a], lr\n\t" + "umaal r7, r9, %[b], r11\n\t" + "umaal r8, r10, %[b], lr\n\t" + "umaal r8, r9, r3, r11\n\t" + "umaal r9, r10, r3, lr\n\t" + "mov r3, r12\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* Start Reduction */ + "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "mov r3, r11\n\t" + "mov r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "sub r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "mov r0, r8\n\t" + "mov r1, r9\n\t" + "mov r2, r10\n\t" + "adds r8, r8, r5\n\t" + "adcs r9, r9, r6\n\t" + "adcs r10, r10, r7\n\t" + "adcs r11, r11, r0\n\t" + "adc r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "adds r0, r0, r5\n\t" + "adcs r1, r1, r6\n\t" + "adcs r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc lr, lr, #0\n\t" + "str r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] + carry */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "add r0, sp, #32\n\t" + "ldm r0, {r2, r3, r4}\n\t" + "adds r2, r2, lr\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r5\n\t" + "adcs r3, r3, r6\n\t" + "adcs r4, r4, r7\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "stm r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "ldm r0, {r0, r1, r2, r3, r4}\n\t" + "adds r0, r0, lr\n\t" + "adcs r1, r1, #0\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r8\n\t" + "adcs r1, r1, r9\n\t" + "adcs r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r10\n\t" + "adcs r1, r1, r11\n\t" + "adcs r2, r2, r12\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adc lr, lr, #0\n\t" + "str r0, [sp, #44]\n\t" + "str r1, [sp, #48]\n\t" + "str r2, [sp, #52]\n\t" + "str r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "add r0, sp, #28\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" + "subs r0, r0, r5\n\t" + "sbcs r1, r1, r6\n\t" + "sbcs r2, r2, r7\n\t" + "sbcs r3, r3, r8\n\t" + "add r0, sp, #44\n\t" + "mov r8, r4\n\t" + "ldm r0, {r4, r5, r6, r7}\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" + "sbcs r7, r7, r12\n\t" + "sbcs r8, r8, #0\n\t" + "sbc lr, lr, #0\n\t" + /* mask m and sub from result if overflow */ + "rsb lr, lr, #0\n\t" + "subs r1, r1, lr\n\t" + "sbcs r2, r2, lr\n\t" + "sbcs r3, r3, lr\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, lr, lsr #31\n\t" + "sbc r8, r8, lr\n\t" + "ldr %[r], [sp, #68]\n\t" + "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #0x4c\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc" + ); (void)m_p; (void)mp_p; } +#endif +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m) * * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ static SP_NOINLINE void sp_256_mont_sqr_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x44\n\t" + "sub sp, sp, #0x44\n\t" "mov r5, #0\n\t" /* A[0] * A[1] */ "ldr r6, [%[a]]\n\t" "ldr r7, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r9, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -67997,13 +69260,9 @@ "lsl r3, r3, #16\n\t" "adds r9, r9, r3\n\t" "adc r10, r10, r4\n\t" -#else - "umull r9, r10, r6, r7\n\t" -#endif "str r9, [sp, #4]\n\t" /* A[0] * A[2] */ "ldr r7, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68029,15 +69288,9 @@ "lsl r3, r3, #16\n\t" "adds r10, r10, r3\n\t" "adc lr, lr, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adc lr, r4, #0\n\t" -#endif "str r10, [sp, #8]\n\t" /* A[0] * A[3] */ "ldr r7, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68063,15 +69316,9 @@ "lsl r3, r3, #16\n\t" "adds lr, lr, r3\n\t" "adc r8, r8, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adc r8, r4, #0\n\t" -#endif /* A[1] * A[2] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68100,16 +69347,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, #0\n\t" -#endif "str lr, [sp, #12]\n\t" /* A[1] * A[3] */ "ldr r7, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68134,15 +69374,9 @@ "lsl r3, r3, #16\n\t" "adds r8, r8, r3\n\t" "adc r9, r9, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adc r9, r4, r9\n\t" -#endif /* A[0] * A[4] */ "ldr r6, [%[a]]\n\t" "ldr r7, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68171,16 +69405,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" -#endif "str r8, [sp, #16]\n\t" /* A[0] * A[5] */ "ldr r7, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68205,15 +69432,9 @@ "lsl r3, r3, #16\n\t" "adds r9, r9, r3\n\t" "adc r10, r10, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adc r10, r4, r10\n\t" -#endif /* A[1] * A[4] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68242,16 +69463,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, #0\n\t" -#endif /* A[2] * A[3] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68280,16 +69494,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif "str r9, [sp, #20]\n\t" /* A[2] * A[4] */ "ldr r7, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68318,16 +69525,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, #0\n\t" -#endif /* A[1] * A[5] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68356,16 +69556,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif /* A[0] * A[6] */ "ldr r6, [%[a]]\n\t" "ldr r7, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68394,16 +69587,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif "str r10, [sp, #24]\n\t" /* A[0] * A[7] */ "ldr r7, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68432,16 +69618,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, #0\n\t" -#endif /* A[1] * A[6] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68470,16 +69649,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[2] * A[5] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68508,16 +69680,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif /* A[3] * A[4] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68546,16 +69711,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif "str lr, [sp, #28]\n\t" /* A[3] * A[5] */ "ldr r7, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68584,16 +69742,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" -#endif /* A[2] * A[6] */ "ldr r6, [%[a], #8]\n\t" "ldr r7, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68622,16 +69773,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif /* A[1] * A[7] */ "ldr r6, [%[a], #4]\n\t" "ldr r7, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68660,16 +69804,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" -#endif "str r8, [sp, #32]\n\t" /* A[2] * A[7] */ "ldr r6, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68698,16 +69835,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, #0\n\t" -#endif /* A[3] * A[6] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68736,16 +69866,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif /* A[4] * A[5] */ "ldr r6, [%[a], #16]\n\t" "ldr r7, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68774,16 +69897,9 @@ "adds r9, r9, r3\n\t" "adcs r10, r10, r4\n\t" "adc lr, lr, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r4, r10\n\t" - "adc lr, r5, lr\n\t" -#endif "str r9, [sp, #36]\n\t" /* A[4] * A[6] */ "ldr r7, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68812,16 +69928,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, #0\n\t" -#endif /* A[3] * A[7] */ "ldr r6, [%[a], #12]\n\t" "ldr r7, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68850,16 +69959,9 @@ "adds r10, r10, r3\n\t" "adcs lr, lr, r4\n\t" "adc r8, r8, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r10, r10, r3\n\t" - "adcs lr, r4, lr\n\t" - "adc r8, r5, r8\n\t" -#endif "str r10, [sp, #40]\n\t" /* A[4] * A[7] */ "ldr r6, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68888,16 +69990,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, #0\n\t" -#endif /* A[5] * A[6] */ "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68926,16 +70021,9 @@ "adds lr, lr, r3\n\t" "adcs r8, r8, r4\n\t" "adc r9, r9, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds lr, lr, r3\n\t" - "adcs r8, r4, r8\n\t" - "adc r9, r5, r9\n\t" -#endif "str lr, [sp, #44]\n\t" /* A[5] * A[7] */ "ldr r7, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68964,16 +70052,9 @@ "adds r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" "adc r10, r10, #0\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r8, r8, r3\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" -#endif "str r8, [sp, #48]\n\t" /* A[6] * A[7] */ "ldr r6, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r3, r6, #16\n\t" "lsl r4, r7, #16\n\t" "lsr r3, r3, #16\n\t" @@ -68998,11 +70079,6 @@ "lsl r3, r3, #16\n\t" "adds r9, r9, r3\n\t" "adc r10, r10, r4\n\t" -#else - "umull r3, r4, r6, r7\n\t" - "adds r9, r9, r3\n\t" - "adc r10, r4, r10\n\t" -#endif "str r9, [sp, #52]\n\t" "str r10, [sp, #56]\n\t" /* Double */ @@ -69055,7 +70131,6 @@ "ldr r12, [sp, #12]\n\t" /* A[0] * A[0] */ "ldr r6, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69066,12 +70141,8 @@ "lsl r6, r6, #17\n\t" "adds r8, r8, r6\n\t" "adc r9, r9, r7\n\t" -#else - "umull r8, r9, r6, r6\n\t" -#endif /* A[1] * A[1] */ "ldr r6, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69082,9 +70153,6 @@ "lsl r6, r6, #17\n\t" "adds r10, r10, r6\n\t" "adc lr, lr, r7\n\t" -#else - "umull r10, lr, r6, r6\n\t" -#endif "adds r9, r9, r4\n\t" "adcs r10, r10, r5\n\t" "adcs lr, lr, r12\n\t" @@ -69098,7 +70166,6 @@ "ldr r12, [sp, #28]\n\t" /* A[2] * A[2] */ "ldr r6, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69109,12 +70176,8 @@ "lsl r6, r6, #17\n\t" "adcs r8, r8, r6\n\t" "adc r9, r9, r7\n\t" -#else - "umull r8, r9, r6, r6\n\t" -#endif /* A[3] * A[3] */ "ldr r6, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69125,10 +70188,7 @@ "lsl r6, r6, #17\n\t" "adds r10, r10, r6\n\t" "adc lr, lr, r7\n\t" -#else - "umull r10, lr, r6, r6\n\t" -#endif -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "adcs r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" #else @@ -69147,7 +70207,6 @@ "ldr r12, [sp, #44]\n\t" /* A[4] * A[4] */ "ldr r6, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69158,12 +70217,8 @@ "lsl r6, r6, #17\n\t" "adcs r8, r8, r6\n\t" "adc r9, r9, r7\n\t" -#else - "umull r8, r9, r6, r6\n\t" -#endif /* A[5] * A[5] */ "ldr r6, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69174,10 +70229,7 @@ "lsl r6, r6, #17\n\t" "adds r10, r10, r6\n\t" "adc lr, lr, r7\n\t" -#else - "umull r10, lr, r6, r6\n\t" -#endif -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "adcs r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" #else @@ -69196,7 +70248,6 @@ "ldr r12, [sp, #60]\n\t" /* A[6] * A[6] */ "ldr r6, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69207,12 +70258,8 @@ "lsl r6, r6, #17\n\t" "adcs r8, r8, r6\n\t" "adc r9, r9, r7\n\t" -#else - "umull r8, r9, r6, r6\n\t" -#endif /* A[7] * A[7] */ "ldr r6, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "lsr r6, r6, #16\n\t" @@ -69223,10 +70270,7 @@ "lsl r6, r6, #17\n\t" "adds r10, r10, r6\n\t" "adc lr, lr, r7\n\t" -#else - "umull r10, lr, r6, r6\n\t" -#endif -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "adcs r8, r8, r3\n\t" "adcs r9, r9, r4\n\t" #else @@ -69239,165 +70283,746 @@ "str r9, [sp, #52]\n\t" "str r10, [sp, #56]\n\t" "str lr, [sp, #60]\n\t" + "str %[r], [sp, #64]\n\t" /* Start Reduction */ - "ldr r4, [sp]\n\t" - "ldr r5, [sp, #4]\n\t" - "ldr r6, [sp, #8]\n\t" - "ldr r7, [sp, #12]\n\t" - "ldr r8, [sp, #16]\n\t" - "ldr r9, [sp, #20]\n\t" - "ldr r10, [sp, #24]\n\t" - "ldr lr, [sp, #28]\n\t" - /* mu = a[0..7] + a[0..4] << 96 + (a[0..1] * 2) << 192 */ + "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "mov r3, r11\n\t" + "mov r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ /* - a[0] << 224 */ - /* + (a[0..1] * 2) << (6 * 32) */ - "adds r10, r10, r4\n\t" - "adc lr, lr, r5\n\t" - "adds r10, r10, r4\n\t" - "adc lr, lr, r5\n\t" + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" /* - a[0] << (7 * 32) */ - "sub lr, lr, r4\n\t" - /* + a[0..4] << (3 * 32) */ - "mov %[a], r7\n\t" - "mov r12, r8\n\t" - "adds r7, r7, r4\n\t" - "adcs r8, r8, r5\n\t" + "sub r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "mov r0, r8\n\t" + "mov r1, r9\n\t" + "mov r2, r10\n\t" + "adds r8, r8, r5\n\t" "adcs r9, r9, r6\n\t" - "adcs r10, r10, %[a]\n\t" - "adc lr, lr, r12\n\t" - "str r7, [sp, #12]\n\t" - "str r8, [sp, #16]\n\t" - "str r9, [sp, #20]\n\t" + "adcs r10, r10, r7\n\t" + "adcs r11, r11, r0\n\t" + "adc r12, r12, r1\n\t" /* a += mu * m */ /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ - /* a[6] += t[0] + t[3] */ - /* a[7] += t[1] + t[4] */ - "ldr %[a], [sp, #24]\n\t" - "ldr r2, [sp, #28]\n\t" - "adds %[a], %[a], r4\n\t" - "adcs r2, r2, r5\n\t" - "mov r12, #0\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r7\n\t" - "adcs r2, r2, r8\n\t" - "adc r12, r12, #0\n\t" - "str r10, [sp, #24]\n\t" - "str lr, [sp, #28]\n\t" - "str r2, [sp, #64]\n\t" - /* a[8] += t[0] + t[2] + t[5] */ - /* a[9] += t[1] + t[3] + t[6] */ - /* a[10] += t[2] + t[4] + t[7] */ - "ldr %[a], [sp, #32]\n\t" - "ldr r2, [sp, #36]\n\t" - "ldr r3, [sp, #40]\n\t" - "adds %[a], %[a], r12\n\t" + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "adds r0, r0, r5\n\t" + "adcs r1, r1, r6\n\t" + "adcs r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc lr, lr, #0\n\t" + "str r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] + carry */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "add r0, sp, #32\n\t" + "ldm r0, {r2, r3, r4}\n\t" + "adds r2, r2, lr\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r5\n\t" + "adcs r3, r3, r6\n\t" + "adcs r4, r4, r7\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "stm r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "ldm r0, {r0, r1, r2, r3, r4}\n\t" + "adds r0, r0, lr\n\t" + "adcs r1, r1, #0\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r8\n\t" + "adcs r1, r1, r9\n\t" + "adcs r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r10\n\t" + "adcs r1, r1, r11\n\t" + "adcs r2, r2, r12\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adc lr, lr, #0\n\t" + "str r0, [sp, #44]\n\t" + "str r1, [sp, #48]\n\t" + "str r2, [sp, #52]\n\t" + "str r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "add r0, sp, #28\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" + "subs r0, r0, r5\n\t" + "sbcs r1, r1, r6\n\t" + "sbcs r2, r2, r7\n\t" + "sbcs r3, r3, r8\n\t" + "add r0, sp, #44\n\t" + "mov r8, r4\n\t" + "ldm r0, {r4, r5, r6, r7}\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" + "sbcs r7, r7, r12\n\t" + "sbcs r8, r8, #0\n\t" + "sbc lr, lr, #0\n\t" + /* mask m and sub from result if overflow */ + "rsb lr, lr, #0\n\t" + "subs r1, r1, lr\n\t" + "sbcs r2, r2, lr\n\t" + "sbcs r3, r3, lr\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, lr, lsr #31\n\t" + "sbc r8, r8, lr\n\t" + "ldr %[r], [sp, #64]\n\t" + "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r12", "r8", "r9", "r10", "lr", "cc" + ); + (void)m_p; + (void)mp_p; +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m) + * + * r Result of squaring. + * a Number to square in Montgomery form. + * m Modulus (prime). + * mp Montgomery multiplier. + */ +static SP_NOINLINE void sp_256_mont_sqr_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str %[r], [sp, #64]\n\t" + "mov %[r], #0\n\t" + "ldr r12, [%[a]]\n\t" + /* A[0] * A[1] */ + "ldr lr, [%[a], #4]\n\t" + "umull r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "ldr lr, [%[a], #12]\n\t" + "umull r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "umull r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "umull r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "ldr lr, [%[a], #8]\n\t" + "mov r11, #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[0] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "adds r8, r8, r11\n\t" + /* A[0] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + "adcs r3, r3, #0\n\t" + "str r4, [sp, #4]\n\t" + "str r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "ldr r12, [%[a], #4]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "str r6, [sp, #12]\n\t" + "adds r7, r7, r11\n\t" + /* A[1] * A[3] */ + "ldr lr, [%[a], #12]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, lr\n\t" + "str r7, [sp, #16]\n\t" + "adds r8, r8, r11\n\t" + /* A[1] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "adds r9, r9, r11\n\t" + /* A[1] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "adds r10, r10, r11\n\t" + /* A[1] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[1] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r4, %[r], #0\n\t" + "umlal r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "ldr r12, [%[a], #8]\n\t" + "ldr lr, [%[a], #12]\n\t" + "mov r11, #0\n\t" + "umlal r8, r11, r12, lr\n\t" + "str r8, [sp, #20]\n\t" + "adds r9, r9, r11\n\t" + /* A[2] * A[4] */ + "ldr lr, [%[a], #16]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, lr\n\t" + "str r9, [sp, #24]\n\t" + "adds r10, r10, r11\n\t" + /* A[2] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "adds r3, r3, r11\n\t" + /* A[2] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[2] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r5, %[r], #0\n\t" + "umlal r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "ldr r12, [%[a], #12]\n\t" + "ldr lr, [%[a], #16]\n\t" + "mov r11, #0\n\t" + "umlal r10, r11, r12, lr\n\t" + "str r10, [sp, #28]\n\t" + "adds r3, r3, r11\n\t" + /* A[3] * A[5] */ + "ldr lr, [%[a], #20]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, lr\n\t" + "adds r4, r4, r11\n\t" + /* A[3] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[3] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r6, %[r], #0\n\t" + "umlal r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "ldr r12, [%[a], #16]\n\t" + "ldr lr, [%[a], #20]\n\t" + "mov r11, #0\n\t" + "umlal r4, r11, r12, lr\n\t" + "adds r5, r5, r11\n\t" + /* A[4] * A[6] */ + "ldr lr, [%[a], #24]\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, lr\n\t" + "adds r6, r6, r11\n\t" + /* A[4] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r7, %[r], #0\n\t" + "umlal r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "ldr r12, [%[a], #20]\n\t" + "ldr lr, [%[a], #24]\n\t" + "mov r11, #0\n\t" + "umlal r6, r11, r12, lr\n\t" + "adds r7, r7, r11\n\t" + /* A[5] * A[7] */ + "ldr lr, [%[a], #28]\n\t" + "adc r8, %[r], #0\n\t" + "umlal r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "ldr r12, [%[a], #24]\n\t" + "ldr lr, [%[a], #28]\n\t" + "mov r9, #0\n\t" + "umlal r8, r9, r12, lr\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "adds r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adcs r10, r10, r10\n\t" + "stm lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "adcs r3, r3, r3\n\t" + "adcs r4, r4, r4\n\t" + "adcs r5, r5, r5\n\t" + "adcs r6, r6, r6\n\t" + "adcs r7, r7, r7\n\t" + "adcs r8, r8, r8\n\t" + "adcs r9, r9, r9\n\t" + "adc r10, %[r], #0\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "add lr, sp, #4\n\t" + "ldm lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "mov lr, sp\n\t" + /* A[0] * A[0] */ + "ldr r12, [%[a]]\n\t" + "umull r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[1] * A[1] */ + "ldr r12, [%[a], #4]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[2] * A[2] */ + "ldr r12, [%[a], #8]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[3] * A[3] */ + "ldr r12, [%[a], #12]\n\t" + "adcs r9, r9, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r9, r11, r12, r12\n\t" + "adds r10, r10, r11\n\t" + "stm lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ldm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "ldr r12, [%[a], #16]\n\t" + "adcs r3, r3, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r3, r11, r12, r12\n\t" + "adds r4, r4, r11\n\t" + /* A[5] * A[5] */ + "ldr r12, [%[a], #20]\n\t" + "adcs r5, r5, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r5, r11, r12, r12\n\t" + "adds r6, r6, r11\n\t" + /* A[6] * A[6] */ + "ldr r12, [%[a], #24]\n\t" + "adcs r7, r7, #0\n\t" + "adc r11, %[r], #0\n\t" + "umlal r7, r11, r12, r12\n\t" + "adds r8, r8, r11\n\t" + /* A[7] * A[7] */ + "ldr r12, [%[a], #28]\n\t" + "adcs r9, r9, #0\n\t" + "adc r10, r10, #0\n\t" + "umlal r9, r10, r12, r12\n\t" + "add lr, sp, #32\n\t" + "stm lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* Start Reduction */ + "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "mov r3, r11\n\t" + "mov r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "sub r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "mov r0, r8\n\t" + "mov r1, r9\n\t" + "mov r2, r10\n\t" + "adds r8, r8, r5\n\t" + "adcs r9, r9, r6\n\t" + "adcs r10, r10, r7\n\t" + "adcs r11, r11, r0\n\t" + "adc r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "adds r0, r0, r5\n\t" + "adcs r1, r1, r6\n\t" + "adcs r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc lr, lr, #0\n\t" + "str r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] + carry */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "add r0, sp, #32\n\t" + "ldm r0, {r2, r3, r4}\n\t" + "adds r2, r2, lr\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r5\n\t" + "adcs r3, r3, r6\n\t" + "adcs r4, r4, r7\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "stm r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "ldm r0, {r0, r1, r2, r3, r4}\n\t" + "adds r0, r0, lr\n\t" + "adcs r1, r1, #0\n\t" "adcs r2, r2, #0\n\t" "adcs r3, r3, #0\n\t" - "mov r12, #0\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r4\n\t" - "adcs r2, r2, r5\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r8\n\t" + "adcs r1, r1, r9\n\t" + "adcs r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r10\n\t" + "adcs r1, r1, r11\n\t" + "adcs r2, r2, r12\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adc lr, lr, #0\n\t" + "str r0, [sp, #44]\n\t" + "str r1, [sp, #48]\n\t" + "str r2, [sp, #52]\n\t" + "str r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "add r0, sp, #28\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" + "subs r0, r0, r5\n\t" + "sbcs r1, r1, r6\n\t" + "sbcs r2, r2, r7\n\t" + "sbcs r3, r3, r8\n\t" + "add r0, sp, #44\n\t" + "mov r8, r4\n\t" + "ldm r0, {r4, r5, r6, r7}\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" + "sbcs r7, r7, r12\n\t" + "sbcs r8, r8, #0\n\t" + "sbc lr, lr, #0\n\t" + /* mask m and sub from result if overflow */ + "rsb lr, lr, #0\n\t" + "subs r1, r1, lr\n\t" + "sbcs r2, r2, lr\n\t" + "sbcs r3, r3, lr\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, lr, lsr #31\n\t" + "sbc r8, r8, lr\n\t" + "ldr %[r], [sp, #64]\n\t" + "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + (void)m_p; + (void)mp_p; +} + +#else +/* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m) + * + * r Result of squaring. + * a Number to square in Montgomery form. + * m Modulus (prime). + * mp Montgomery multiplier. + */ +static SP_NOINLINE void sp_256_mont_sqr_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str %[r], [sp, #64]\n\t" + "ldm %[a], {%[r], %[a], r2, r3, r4, r5, r6, r7}\n\t" + "umull r9, r10, %[r], %[r]\n\t" + "umull r11, r12, %[r], %[a]\n\t" + "adds r11, r11, r11\n\t" + "mov lr, #0\n\t" + "umaal r10, r11, lr, lr\n\t" + "stm sp, {r9, r10}\n\t" + "mov r8, lr\n\t" + "umaal r8, r12, %[r], r2\n\t" + "adcs r8, r8, r8\n\t" + "umaal r8, r11, %[a], %[a]\n\t" + "umull r9, r10, %[r], r3\n\t" + "umaal r9, r12, %[a], r2\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "str r8, [sp, #8]\n\t" + "str r9, [sp, #12]\n\t" +#else + "strd r8, r9, [sp, #8]\n\t" +#endif + "mov r9, lr\n\t" + "umaal r9, r10, %[r], r4\n\t" + "umaal r9, r12, %[a], r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r2, r2\n\t" + "str r9, [sp, #16]\n\t" + "umull r9, r8, %[r], r5\n\t" + "umaal r9, r12, %[a], r4\n\t" + "umaal r9, r10, r2, r3\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, lr, lr\n\t" + "str r9, [sp, #20]\n\t" + "mov r9, lr\n\t" + "umaal r9, r8, %[r], r6\n\t" + "umaal r9, r12, %[a], r5\n\t" + "umaal r9, r10, r2, r4\n\t" + "adcs r9, r9, r9\n\t" + "umaal r9, r11, r3, r3\n\t" + "str r9, [sp, #24]\n\t" + "umull %[r], r9, %[r], r7\n\t" + "umaal %[r], r8, %[a], r6\n\t" + "umaal %[r], r12, r2, r5\n\t" + "umaal %[r], r10, r3, r4\n\t" + "adcs %[r], %[r], %[r]\n\t" + "umaal %[r], r11, lr, lr\n\t" + /* R[7] = r0 */ + "umaal r9, r8, %[a], r7\n\t" + "umaal r9, r10, r2, r6\n\t" + "umaal r12, r9, r3, r5\n\t" + "adcs r12, r12, r12\n\t" + "umaal r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "umaal r9, r8, r2, r7\n\t" + "umaal r10, r9, r3, r6\n\t" + "mov r2, lr\n\t" + "umaal r10, r2, r4, r5\n\t" + "adcs r10, r10, r10\n\t" + "umaal r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "umaal r2, r8, r3, r7\n\t" + "umaal r2, r9, r4, r6\n\t" + "adcs r3, r2, r2\n\t" + "umaal r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "mov %[a], lr\n\t" + "umaal %[a], r8, r4, r7\n\t" + "umaal %[a], r9, r5, r6\n\t" + "adcs r4, %[a], %[a]\n\t" + "umaal r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "umaal r8, r9, r5, r7\n\t" + "adcs r8, r8, r8\n\t" + "umaal r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "mov r5, lr\n\t" + "umaal r5, r9, r6, r7\n\t" + "adcs r5, r5, r5\n\t" + "umaal r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "adcs r9, r9, r9\n\t" + "umaal r9, r5, r7, r7\n\t" + "adcs r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + "mov lr, sp\n\t" + "add lr, lr, #28\n\t" + "stm lr!, {%[r], r12}\n\t" + "stm lr!, {r11}\n\t" + "stm lr!, {r10}\n\t" + "stm lr!, {r3, r4, r8, r9}\n\t" + "stm lr!, {r7}\n\t" + /* Start Reduction */ + "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "mov r3, r11\n\t" + "mov r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "sub r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "mov r0, r8\n\t" + "mov r1, r9\n\t" + "mov r2, r10\n\t" + "adds r8, r8, r5\n\t" + "adcs r9, r9, r6\n\t" + "adcs r10, r10, r7\n\t" + "adcs r11, r11, r0\n\t" + "adc r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "adds r0, r0, r5\n\t" + "adcs r1, r1, r6\n\t" + "adcs r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc lr, lr, #0\n\t" + "str r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] + carry */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "add r0, sp, #32\n\t" + "ldm r0, {r2, r3, r4}\n\t" + "adds r2, r2, lr\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r5\n\t" "adcs r3, r3, r6\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r6\n\t" - "adcs r2, r2, r7\n\t" + "adcs r4, r4, r7\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r7\n\t" "adcs r3, r3, r8\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r9\n\t" - "adcs r2, r2, r10\n\t" - "adcs r3, r3, lr\n\t" - "adc r12, r12, #0\n\t" - "str %[a], [sp, #32]\n\t" - "str r2, [sp, #36]\n\t" - "str r3, [sp, #40]\n\t" - /* a[11] += t[3] + t[5] */ - /* a[12] += t[4] + t[6] */ - /* a[13] += t[5] + t[7] */ - /* a[14] += t[6] */ - /* a[15] += t[7] */ - "ldr %[a], [sp, #44]\n\t" - "ldr r2, [sp, #48]\n\t" - "ldr r3, [sp, #52]\n\t" - "ldr r4, [sp, #56]\n\t" - "ldr r5, [sp, #60]\n\t" - "adds %[a], %[a], r12\n\t" + "adcs r4, r4, r9\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "stm r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "ldm r0, {r0, r1, r2, r3, r4}\n\t" + "adds r0, r0, lr\n\t" + "adcs r1, r1, #0\n\t" "adcs r2, r2, #0\n\t" "adcs r3, r3, #0\n\t" "adcs r4, r4, #0\n\t" - "adcs r5, r5, #0\n\t" - "mov r12, #0\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r7\n\t" - "adcs r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adcs r5, r5, lr\n\t" - "adc r12, r12, #0\n\t" - "adds %[a], %[a], r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r8\n\t" + "adcs r1, r1, r9\n\t" "adcs r2, r2, r10\n\t" - "adcs r3, r3, lr\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r10\n\t" + "adcs r1, r1, r11\n\t" + "adcs r2, r2, r12\n\t" + "adcs r3, r3, #0\n\t" "adcs r4, r4, #0\n\t" - "adcs r5, r5, #0\n\t" - "adc r12, r12, #0\n\t" - "str %[a], [sp, #44]\n\t" - "str r2, [sp, #48]\n\t" - "str r3, [sp, #52]\n\t" - "str r4, [sp, #56]\n\t" - "str r5, [sp, #60]\n\t" - "ldr %[a], [sp, #64]\n\t" - "ldr r2, [sp, #32]\n\t" - "ldr r3, [sp, #36]\n\t" - "ldr r4, [sp, #40]\n\t" - "ldr r8, [sp]\n\t" - "ldr r9, [sp, #4]\n\t" - "ldr r10, [sp, #8]\n\t" - "ldr lr, [sp, #12]\n\t" - "subs %[a], %[a], r8\n\t" - "sbcs r2, r2, r9\n\t" - "sbcs r3, r3, r10\n\t" - "sbcs r4, r4, lr\n\t" - "str r2, [sp, #32]\n\t" - "str r3, [sp, #36]\n\t" - "str r4, [sp, #40]\n\t" - "ldr %[a], [sp, #44]\n\t" - "ldr r2, [sp, #48]\n\t" - "ldr r3, [sp, #52]\n\t" - "ldr r4, [sp, #56]\n\t" - "ldr r5, [sp, #60]\n\t" - "ldr r8, [sp, #16]\n\t" - "ldr r9, [sp, #20]\n\t" - "ldr r10, [sp, #24]\n\t" - "ldr lr, [sp, #28]\n\t" - "sbcs %[a], %[a], r8\n\t" - "sbcs r2, r2, r9\n\t" - "sbcs r3, r3, r10\n\t" - "sbcs r4, r4, lr\n\t" - "sbc r5, r5, #0\n\t" - /* mask m and sub from result if overflow */ - "rsb r12, r12, #0\n\t" - "and lr, r12, #1\n\t" - "ldr r6, [sp, #32]\n\t" - "ldr r7, [sp, #36]\n\t" - "ldr r8, [sp, #40]\n\t" - "subs r6, r6, r12\n\t" + "adc lr, lr, #0\n\t" + "str r0, [sp, #44]\n\t" + "str r1, [sp, #48]\n\t" + "str r2, [sp, #52]\n\t" + "str r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "add r0, sp, #28\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" + "subs r0, r0, r5\n\t" + "sbcs r1, r1, r6\n\t" + "sbcs r2, r2, r7\n\t" + "sbcs r3, r3, r8\n\t" + "add r0, sp, #44\n\t" + "mov r8, r4\n\t" + "ldm r0, {r4, r5, r6, r7}\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" "sbcs r7, r7, r12\n\t" - "sbcs r8, r8, r12\n\t" - "sbcs %[a], %[a], #0\n\t" - "sbcs r2, r2, #0\n\t" - "sbcs r3, r3, #0\n\t" - "sbcs r4, r4, lr\n\t" - "sbc r5, r5, r12\n\t" - "stm %[r]!, {r6, r7, r8}\n\t" - "stm %[r]!, {%[a], r2, r3, r4, r5}\n\t" + "sbcs r8, r8, #0\n\t" + "sbc lr, lr, #0\n\t" + /* mask m and sub from result if overflow */ + "rsb lr, lr, #0\n\t" + "subs r1, r1, lr\n\t" + "sbcs r2, r2, lr\n\t" + "sbcs r3, r3, lr\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, lr, lsr #31\n\t" + "sbc r8, r8, lr\n\t" + "ldr %[r], [sp, #64]\n\t" + "stm %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" "add sp, sp, #0x44\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r12", "r8", "r9", "r10", "lr" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); (void)m_p; (void)mp_p; } +#endif #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY) /* Square the Montgomery form number a number of times. (r = a ^ n mod m) * @@ -69405,10 +71030,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_8(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_8(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_8(r, a, m, mp); for (; n > 1; n--) { @@ -69503,8 +71128,8 @@ */ static sp_int32 sp_256_cmp_8(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -69623,7 +71248,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -69645,10 +71270,10 @@ */ static sp_digit sp_256_cond_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -69669,7 +71294,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -69685,10 +71310,10 @@ */ static sp_digit sp_256_cond_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -69723,7 +71348,7 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -69732,6 +71357,7 @@ #ifndef WOLFSSL_SP_SMALL #define sp_256_mont_reduce_order_8 sp_256_mont_reduce_8 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 256 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -69740,12 +71366,12 @@ */ static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -69758,10 +71384,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -69785,14 +71410,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -69816,18 +71435,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -69851,17 +71464,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -69885,18 +71492,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -69920,18 +71521,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -69955,18 +71550,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -69990,22 +71579,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #28]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #28]\n\t" +#else + "ldr r7, [%[m], #28]\n\t" #endif "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -70036,13 +71619,6 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r7, r3\n\t" - "mov r3, #0\n\t" - "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "ldr r10, [%[a], #32]\n\t" @@ -70054,17 +71630,18 @@ "add %[a], %[a], #4\n\t" "cmp r9, #32\n\t" "blt L_sp_256_mont_reduce_8_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); } -#else +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) /* Reduce the number back to 256 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -70073,103 +71650,338 @@ */ static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( - "mov r1, #0\n\t" - /* # i = 0 */ - "mov r8, #0\n\t" + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" "\n" "L_sp_256_mont_reduce_8_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" "mov r4, #0\n\t" - /* mu = a[i] * 1 (mp) = a[i] */ - "ldr r2, [%[a]]\n\t" - /* a[i+0] += -1 * mu */ - "mov r5, r2\n\t" - "str r4, [%[a]]\n\t" - /* a[i+1] += -1 * mu */ - "ldr r6, [%[a], #4]\n\t" - "mov r4, r2\n\t" - "subs r5, r5, r2\n\t" - "sbc r4, r4, #0\n\t" - "adds r5, r5, r6\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" - "str r5, [%[a], #4]\n\t" - /* a[i+2] += -1 * mu */ - "ldr r6, [%[a], #8]\n\t" - "mov r5, r2\n\t" - "subs r4, r4, r2\n\t" - "sbc r5, r5, #0\n\t" - "adds r4, r4, r6\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" - "str r4, [%[a], #8]\n\t" - /* a[i+3] += 0 * mu */ - "ldr r6, [%[a], #12]\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" "mov r4, #0\n\t" - "adds r5, r5, r6\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" - "str r5, [%[a], #12]\n\t" - /* a[i+4] += 0 * mu */ - "ldr r6, [%[a], #16]\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" "mov r5, #0\n\t" - "adds r4, r4, r6\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" - "str r4, [%[a], #16]\n\t" - /* a[i+5] += 0 * mu */ - "ldr r6, [%[a], #20]\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" "mov r4, #0\n\t" - "adds r5, r5, r6\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" - "str r5, [%[a], #20]\n\t" - /* a[i+6] += 1 * mu */ - "ldr r6, [%[a], #24]\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" "mov r5, #0\n\t" - "adds r4, r4, r2\n\t" - "adc r5, r5, #0\n\t" - "adds r4, r4, r6\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" - "str r4, [%[a], #24]\n\t" - /* a[i+7] += -1 * mu */ - "ldr r6, [%[a], #28]\n\t" - "ldr r7, [%[a], #32]\n\t" - "adds r4, r1, r2\n\t" - "mov r1, #0\n\t" - "adc r1, r1, r1\n\t" - "subs r5, r5, r2\n\t" - "sbcs r4, r4, #0\n\t" - "sbc r1, r1, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r1, r1, #0\n\t" - "str r5, [%[a], #28]\n\t" - "str r4, [%[a], #32]\n\t" + "adcs r4, r7, r3\n\t" + "mov r3, #0\n\t" + "adc r3, r3, r3\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "ldr r10, [%[a], #32]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r3, r3, #0\n\t" /* i += 1 */ - "add r8, r8, #4\n\t" + "add r9, r9, #4\n\t" "add %[a], %[a], #4\n\t" - "cmp r8, #32\n\t" + "cmp r9, #32\n\t" "blt L_sp_256_mont_reduce_8_word_%=\n\t" - "mov r2, r1\n\t" - "sub r1, r1, #1\n\t" - "mvn r1, r1\n\t" - "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" - "sub %[a], %[a], #32\n\t" - "subs r4, r4, r1\n\t" - "sbcs r5, r5, r1\n\t" - "sbcs r6, r6, r1\n\t" - "sbcs r7, r7, #0\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_256_mont_reduce_8_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #32]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #28]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #32]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #32\n\t" + "blt L_sp_256_mont_reduce_8_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); +} + +#endif +#else +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + + __asm__ __volatile__ ( + "sub sp, sp, #0x44\n\t" + "str %[a], [sp, #64]\n\t" + "mov lr, sp\n\t" + "ldm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "stm lr!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "stm lr, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + /* Start Reduction */ + "ldm sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "mov r3, r11\n\t" + "mov r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + "adds r11, r11, r5\n\t" + "adc r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "sub r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "mov r0, r8\n\t" + "mov r1, r9\n\t" + "mov r2, r10\n\t" + "adds r8, r8, r5\n\t" + "adcs r9, r9, r6\n\t" + "adcs r10, r10, r7\n\t" + "adcs r11, r11, r0\n\t" + "adc r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "adds r0, r0, r5\n\t" + "adcs r1, r1, r6\n\t" + "adcs r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r3, r3, r5\n\t" + "adcs r4, r4, r6\n\t" + "adc lr, lr, #0\n\t" + "str r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] + carry */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "add r0, sp, #32\n\t" + "ldm r0, {r2, r3, r4}\n\t" + "adds r2, r2, lr\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r5\n\t" + "adcs r3, r3, r6\n\t" + "adcs r4, r4, r7\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r7\n\t" + "adcs r3, r3, r8\n\t" + "adcs r4, r4, r9\n\t" + "adc lr, lr, #0\n\t" + "adds r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "stm r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "ldm r0, {r0, r1, r2, r3, r4}\n\t" + "adds r0, r0, lr\n\t" + "adcs r1, r1, #0\n\t" + "adcs r2, r2, #0\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "mov lr, #0\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r8\n\t" + "adcs r1, r1, r9\n\t" + "adcs r2, r2, r10\n\t" + "adcs r3, r3, r11\n\t" + "adcs r4, r4, r12\n\t" + "adc lr, lr, #0\n\t" + "adds r0, r0, r10\n\t" + "adcs r1, r1, r11\n\t" + "adcs r2, r2, r12\n\t" + "adcs r3, r3, #0\n\t" + "adcs r4, r4, #0\n\t" + "adc lr, lr, #0\n\t" + "str r0, [sp, #44]\n\t" + "str r1, [sp, #48]\n\t" + "str r2, [sp, #52]\n\t" + "str r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "add r0, sp, #28\n\t" + "ldm r0, {r0, r1, r2, r3}\n\t" + "subs r0, r0, r5\n\t" + "sbcs r1, r1, r6\n\t" + "sbcs r2, r2, r7\n\t" + "sbcs r3, r3, r8\n\t" + "add r0, sp, #44\n\t" + "mov r8, r4\n\t" + "ldm r0, {r4, r5, r6, r7}\n\t" + "sbcs r4, r4, r9\n\t" + "sbcs r5, r5, r10\n\t" + "sbcs r6, r6, r11\n\t" + "sbcs r7, r7, r12\n\t" "sbcs r8, r8, #0\n\t" - "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, r2\n\t" - "sbc r11, r11, r1\n\t" - "stm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "sbc lr, lr, #0\n\t" + /* mask m and sub from result if overflow */ + "rsb lr, lr, #0\n\t" + "subs r1, r1, lr\n\t" + "sbcs r2, r2, lr\n\t" + "sbcs r3, r3, lr\n\t" + "sbcs r4, r4, #0\n\t" + "sbcs r5, r5, #0\n\t" + "sbcs r6, r6, #0\n\t" + "sbcs r7, r7, lr, lsr #31\n\t" + "sbc r8, r8, lr\n\t" + "ldr %[a], [sp, #64]\n\t" + "stm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "add sp, sp, #0x44\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); (void)m_p; (void)mp_p; } +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 256 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -70178,12 +71990,12 @@ */ static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -70196,10 +72008,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -70223,14 +72034,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -70254,18 +72059,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -70289,17 +72088,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -70323,18 +72116,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -70358,18 +72145,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -70393,18 +72174,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -70428,22 +72203,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #28]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #28]\n\t" +#else + "ldr r7, [%[m], #28]\n\t" #endif "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -70474,13 +72243,109 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "ldr r10, [%[a], #32]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #32\n\t" + "blt L_sp_256_mont_reduce_order_8_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_256_mont_reduce_order_8_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "ldr r10, [%[a], #32]\n\t" @@ -70492,16 +72357,103 @@ "add %[a], %[a], #4\n\t" "cmp r9, #32\n\t" "blt L_sp_256_mont_reduce_order_8_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_256_mont_reduce_order_8_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #32]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #28]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #32]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #32\n\t" + "blt L_sp_256_mont_reduce_order_8_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); } +#endif #endif /* WOLFSSL_SP_SMALL */ /* Map the Montgomery form projective coordinate point to an affine point. * @@ -70552,41 +72504,49 @@ */ static void sp_256_mont_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r8, r9, r10, r11}\n\t" - "ldm %[b]!, {r4, r5, r6, r7}\n\t" - "adds r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r11, r11, r7\n\t" - "stm %[r], {r8, r9, r10, r11}\n\t" - "ldm %[a]!, {r8, r9, r10, r11}\n\t" - "ldm %[b]!, {r4, r5, r6, r7}\n\t" + "mov lr, #0\n\t" + "ldm %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "adds r5, r5, r3\n\t" + "adcs r6, r6, r4\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "adcs r7, r7, r3\n\t" "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r11, r11, r7\n\t" - "adc r3, r12, #0\n\t" - "sub r3, r12, r3\n\t" - "and r12, r3, #1\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "subs r4, r4, r3\n\t" - "sbcs r5, r5, r3\n\t" - "sbcs r6, r6, r3\n\t" - "sbcs r7, r7, #0\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "adcs r9, r9, r3\n\t" + "adcs r10, r10, r4\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "adcs r11, r11, r3\n\t" + "adcs r12, r12, r4\n\t" + "adc lr, lr, #0\n\t" + "rsb lr, lr, #0\n\t" + "subs r5, r5, lr\n\t" + "sbcs r6, r6, lr\n\t" + "sbcs r7, r7, lr\n\t" "sbcs r8, r8, #0\n\t" "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, r12\n\t" - "sbc r11, r11, r3\n\t" - "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "sbcs r10, r10, #0\n\t" + "sbcs r11, r11, lr, lsr #31\n\t" + "sbcs r12, r12, lr\n\t" + "sbc %[b], %[b], %[b]\n\t" + "sub lr, lr, %[b]\n\t" + "subs r5, r5, lr\n\t" + "sbcs r6, r6, lr\n\t" + "sbcs r7, r7, lr\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, #0\n\t" + "sbcs r11, r11, lr, lsr #31\n\t" + "sbc r12, r12, lr\n\t" + "stm %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); (void)m_p; } @@ -70599,11 +72559,11 @@ */ static void sp_256_mont_dbl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( - "mov r3, #0\n\t" + "mov r2, #0\n\t" "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" "adds r4, r4, r4\n\t" "adcs r5, r5, r5\n\t" @@ -70613,21 +72573,30 @@ "adcs r9, r9, r9\n\t" "adcs r10, r10, r10\n\t" "adcs r11, r11, r11\n\t" - "adc r2, r3, #0\n\t" - "sub r2, r3, r2\n\t" - "and r3, r2, #1\n\t" + "adc r2, r2, #0\n\t" + "rsb r2, r2, #0\n\t" + "subs r4, r4, r2\n\t" + "sbcs r5, r5, r2\n\t" + "sbcs r6, r6, r2\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, r2, lsr #31\n\t" + "sbcs r11, r11, r2\n\t" + "sbc %[a], %[a], %[a]\n\t" + "sub r2, r2, %[a]\n\t" "subs r4, r4, r2\n\t" "sbcs r5, r5, r2\n\t" "sbcs r6, r6, r2\n\t" "sbcs r7, r7, #0\n\t" "sbcs r8, r8, #0\n\t" "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, r3\n\t" + "sbcs r10, r10, r2, lsr #31\n\t" "sbc r11, r11, r2\n\t" "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "cc" ); (void)m_p; } @@ -70640,11 +72609,11 @@ */ static void sp_256_mont_tpl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( - "mov r3, #0\n\t" + "mov r12, #0\n\t" "ldm %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" "adds r4, r4, r4\n\t" "adcs r5, r5, r5\n\t" @@ -70654,59 +72623,62 @@ "adcs r9, r9, r9\n\t" "adcs r10, r10, r10\n\t" "adcs r11, r11, r11\n\t" - "adc r2, r3, #0\n\t" - "sub r2, r3, r2\n\t" - "and r3, r2, #1\n\t" - "subs r4, r4, r2\n\t" - "sbcs r5, r5, r2\n\t" - "sbcs r6, r6, r2\n\t" + "adc r12, r12, #0\n\t" + "rsb r12, r12, #0\n\t" + "subs r4, r4, r12\n\t" + "sbcs r5, r5, r12\n\t" + "sbcs r6, r6, r12\n\t" "sbcs r7, r7, #0\n\t" "sbcs r8, r8, #0\n\t" "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, r3\n\t" - "sbc r11, r11, r2\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" -#else - "strd r8, r9, [%[r], #16]\n\t" -#endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" -#else - "strd r10, r11, [%[r], #24]\n\t" -#endif - "mov r3, #0\n\t" - "ldm %[a]!, {r8, r9, r10, r11}\n\t" - "adds r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r11, r11, r7\n\t" - "stm %[r]!, {r8, r9, r10, r11}\n\t" - "ldm %[a]!, {r8, r9, r10, r11}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r11, r11, r7\n\t" - "sub %[r], %[r], #16\n\t" - "adc r2, r3, #0\n\t" - "sub r2, r3, r2\n\t" - "and r3, r2, #1\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "subs r4, r4, r2\n\t" - "sbcs r5, r5, r2\n\t" - "sbcs r6, r6, r2\n\t" + "sbcs r10, r10, r12, lsr #31\n\t" + "sbcs r11, r11, r12\n\t" + "sbc r2, r2, r2\n\t" + "sub r12, r12, r2\n\t" + "subs r4, r4, r12\n\t" + "sbcs r5, r5, r12\n\t" + "sbcs r6, r6, r12\n\t" "sbcs r7, r7, #0\n\t" "sbcs r8, r8, #0\n\t" "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, r3\n\t" - "sbc r11, r11, r2\n\t" + "sbcs r10, r10, r12, lsr #31\n\t" + "sbc r11, r11, r12\n\t" + "ldm %[a]!, {r2, r3}\n\t" + "adds r4, r4, r2\n\t" + "adcs r5, r5, r3\n\t" + "ldm %[a]!, {r2, r3}\n\t" + "adcs r6, r6, r2\n\t" + "adcs r7, r7, r3\n\t" + "ldm %[a]!, {r2, r3}\n\t" + "adcs r8, r8, r2\n\t" + "adcs r9, r9, r3\n\t" + "ldm %[a]!, {r2, r3}\n\t" + "adcs r10, r10, r2\n\t" + "adcs r11, r11, r3\n\t" + "adc r12, r12, #0\n\t" + "rsb r12, r12, #0\n\t" + "subs r4, r4, r12\n\t" + "sbcs r5, r5, r12\n\t" + "sbcs r6, r6, r12\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, r12, lsr #31\n\t" + "sbcs r11, r11, r12\n\t" + "sbc r2, r2, r2\n\t" + "sub r12, r12, r2\n\t" + "subs r4, r4, r12\n\t" + "sbcs r5, r5, r12\n\t" + "sbcs r6, r6, r12\n\t" + "sbcs r7, r7, #0\n\t" + "sbcs r8, r8, #0\n\t" + "sbcs r9, r9, #0\n\t" + "sbcs r10, r10, r12, lsr #31\n\t" + "sbc r11, r11, r12\n\t" "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "r12", "cc" ); (void)m_p; } @@ -70720,86 +72692,90 @@ */ static void sp_256_mont_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r8, r9, r10, r11}\n\t" - "ldm %[b]!, {r4, r5, r6, r7}\n\t" - "subs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r11, r11, r7\n\t" - "stm %[r]!, {r8, r9, r10, r11}\n\t" - "ldm %[a]!, {r8, r9, r10, r11}\n\t" - "ldm %[b]!, {r4, r5, r6, r7}\n\t" + "mov lr, #0\n\t" + "ldm %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "subs r5, r5, r3\n\t" + "sbcs r6, r6, r4\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "sbcs r7, r7, r3\n\t" "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r11, r11, r7\n\t" - "sbc r3, r12, #0\n\t" - "sub %[r], %[r], #16\n\t" - "and r12, r3, #1\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adds r4, r4, r3\n\t" - "adcs r5, r5, r3\n\t" - "adcs r6, r6, r3\n\t" - "adcs r7, r7, #0\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "sbcs r9, r9, r3\n\t" + "sbcs r10, r10, r4\n\t" + "ldm %[b]!, {r3, r4}\n\t" + "sbcs r11, r11, r3\n\t" + "sbcs r12, r12, r4\n\t" + "sbc lr, lr, #0\n\t" + "adds r5, r5, lr\n\t" + "adcs r6, r6, lr\n\t" + "adcs r7, r7, lr\n\t" "adcs r8, r8, #0\n\t" "adcs r9, r9, #0\n\t" - "adcs r10, r10, r12\n\t" - "adc r11, r11, r3\n\t" - "stm %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "adcs r10, r10, #0\n\t" + "adcs r11, r11, lr, lsr #31\n\t" + "adcs r12, r12, lr\n\t" + "adc lr, lr, #0\n\t" + "adds r5, r5, lr\n\t" + "adcs r6, r6, lr\n\t" + "adcs r7, r7, lr\n\t" + "adcs r8, r8, #0\n\t" + "adcs r9, r9, #0\n\t" + "adcs r10, r10, #0\n\t" + "adcs r11, r11, lr, lsr #31\n\t" + "adc r12, r12, lr\n\t" + "stm %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); (void)m_p; } -#define sp_256_mont_sub_lower_8 sp_256_mont_sub_8 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) * * r Result of division by 2. * a Number to divide. * m Modulus (prime). */ -static void sp_256_div2_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +static void sp_256_mont_div2_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "ldm %[a], {r4, r5, r6, r7}\n\t" "and r3, r4, #1\n\t" - "sub r8, r10, r3\n\t" - "and r9, r8, #1\n\t" + "rsb r8, r3, #0\n\t" "adds r4, r4, r8\n\t" "adcs r5, r5, r8\n\t" "adcs r6, r6, r8\n\t" - "adcs r7, r7, r10\n\t" + "adcs r7, r7, #0\n\t" "stm %[r], {r4, r5, r6, r7}\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[a], #16]\n\t" "ldr r5, [%[a], #20]\n\t" #else "ldrd r4, r5, [%[a], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[a], #24]\n\t" "ldr r7, [%[a], #28]\n\t" #else "ldrd r6, r7, [%[a], #24]\n\t" #endif - "adcs r4, r4, r10\n\t" - "adcs r5, r5, r10\n\t" - "adcs r6, r6, r9\n\t" + "adcs r4, r4, #0\n\t" + "adcs r5, r5, #0\n\t" + "adcs r6, r6, r8, lsr #31\n\t" "adcs r7, r7, r8\n\t" - "adc r3, r10, r10\n\t" + "mov r3, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r8, r4, #1\n\t" "lsr r9, r5, #1\n\t" "lsr r10, r6, #1\n\t" @@ -70809,13 +72785,13 @@ "orr r10, r10, r7, lsl #31\n\t" "orr r11, r11, r3, lsl #31\n\t" "mov r3, r4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #16]\n\t" "str r9, [%[r], #20]\n\t" #else "strd r8, r9, [%[r], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r10, [%[r], #24]\n\t" "str r11, [%[r], #28]\n\t" #else @@ -70833,7 +72809,7 @@ "stm %[r], {r8, r9, r10, r11}\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "cc" ); } @@ -70881,7 +72857,7 @@ /* T2 = Y * Y */ sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_8(t2, t2, p256_mod); + sp_256_mont_div2_8(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ @@ -70891,7 +72867,7 @@ /* X = X - Y */ sp_256_mont_sub_8(x, x, y, p256_mod); /* Y = Y - X */ - sp_256_mont_sub_lower_8(y, y, x, p256_mod); + sp_256_mont_sub_8(y, y, x, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -70914,7 +72890,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data; @@ -70988,7 +72965,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_8(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_8(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -71013,7 +72990,7 @@ break; case 16: /* Y = Y - X */ - sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -71074,12 +73051,12 @@ static void sp_256_proj_point_add_8(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*8; - sp_digit* t3 = t + 4*8; - sp_digit* t4 = t + 6*8; - sp_digit* t5 = t + 8*8; - sp_digit* t6 = t + 10*8; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*8; + sp_digit* t2 = t + 4*8; + sp_digit* t3 = t + 6*8; + sp_digit* t4 = t + 8*8; + sp_digit* t5 = t + 10*8; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod); @@ -71101,17 +73078,9 @@ sp_256_proj_point_dbl_8(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_8(t2, t2, t1, p256_mod); @@ -71130,20 +73099,31 @@ sp_256_mont_dbl_8(t3, y, p256_mod); sp_256_mont_sub_8(x, x, t3, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_8(y, y, x, p256_mod); + sp_256_mont_sub_8(y, y, x, p256_mod); sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_8(y, y, t5, p256_mod); - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -71189,12 +73169,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*8; - ctx->t3 = t + 4*8; - ctx->t4 = t + 6*8; - ctx->t5 = t + 8*8; - ctx->t6 = t + 10*8; + ctx->t6 = t; + ctx->t1 = t + 2*8; + ctx->t2 = t + 4*8; + ctx->t3 = t + 6*8; + ctx->t4 = t + 8*8; + ctx->t5 = t + 10*8; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -71301,7 +73281,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -71314,22 +73294,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -71349,7 +73335,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table, @@ -71601,8 +73587,6 @@ } #ifdef FP_ECC -#define sp_256_mont_dbl_lower_8 sp_256_mont_dbl_8 -#define sp_256_mont_tpl_lower_8 sp_256_mont_tpl_8 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -71641,7 +73625,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_8(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_8(a, t1, p256_mod); + sp_256_mont_tpl_8(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod); @@ -71650,8 +73634,8 @@ sp_256_mont_dbl_8(t2, b, p256_mod); sp_256_mont_sub_8(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_8(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_8(b, t2, p256_mod); + sp_256_mont_sub_8(t2, b, x, p256_mod); + sp_256_mont_dbl_8(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -71671,7 +73655,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_8(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_8(a, t1, p256_mod); + sp_256_mont_tpl_8(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod); @@ -71680,8 +73664,8 @@ sp_256_mont_dbl_8(t2, b, p256_mod); sp_256_mont_sub_8(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_8(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_8(b, t2, p256_mod); + sp_256_mont_sub_8(t2, b, x, p256_mod); + sp_256_mont_dbl_8(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -71691,7 +73675,7 @@ sp_256_mont_sub_8(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_8(y, y, p256_mod); + sp_256_mont_div2_8(y, y, p256_mod); } /* Convert the projective point to affine. @@ -71737,12 +73721,12 @@ static void sp_256_proj_point_add_qz1_8(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*8; - sp_digit* t3 = t + 4*8; - sp_digit* t4 = t + 6*8; - sp_digit* t5 = t + 8*8; - sp_digit* t6 = t + 10*8; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*8; + sp_digit* t6 = t + 4*8; + sp_digit* t1 = t + 6*8; + sp_digit* t4 = t + 8*8; + sp_digit* t5 = t + 10*8; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -71758,13 +73742,9 @@ sp_256_proj_point_dbl_8(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_8(t2, t2, p->x, p256_mod); @@ -71773,33 +73753,40 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_8(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_8(x, t1, t5, p256_mod); - sp_256_mont_dbl_8(t1, t3, p256_mod); - sp_256_mont_sub_8(x, x, t1, p256_mod); + sp_256_mont_sqr_8(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_8(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_8(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_8(t2, t2, t1, p256_mod); + sp_256_mont_dbl_8(t5, t3, p256_mod); + sp_256_mont_sub_8(x, t2, t5, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_8(t3, t3, x, p256_mod); + sp_256_mont_sub_8(t3, t3, x, p256_mod); sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_8(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_256_mont_mul_8(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_8(y, t3, t1, p256_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -71900,7 +73887,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_16_8(sp_point_256* r, @@ -72089,13 +74076,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -72166,8 +74155,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap); @@ -72188,10 +74177,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -72320,7 +74311,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_256_8(sp_point_256* r, @@ -72509,13 +74500,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -72586,8 +74579,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap); @@ -72608,10 +74601,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -72704,7 +74699,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -72715,7 +74710,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_256* point = NULL; + sp_point_256* point = NULL; sp_digit* k = NULL; #else sp_point_256 point[2]; @@ -74253,7 +76248,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -74275,7 +76270,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -74336,7 +76331,7 @@ */ static void sp_256_add_one_8(sp_digit* a_p) { - register sp_digit* a asm ("r0") = a_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; __asm__ __volatile__ ( "ldm %[a], {r1, r2, r3, r4}\n\t" @@ -74353,7 +76348,7 @@ "stm %[a]!, {r1, r2, r3, r4}\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r4" + : "memory", "r1", "r2", "r3", "r4", "cc" ); } @@ -74448,7 +76443,7 @@ sp_point_256* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -74456,7 +76451,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -74734,16 +76729,15 @@ */ static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #32\n\t" "\n" "L_sp_256_sub_in_pkace_8_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -74751,13 +76745,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_256_sub_in_pkace_8_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -74770,8 +76764,8 @@ */ static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -74791,7 +76785,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -74806,15 +76800,14 @@ */ static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -74847,7 +76840,7 @@ "L_sp_256_mul_d_8_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -74892,7 +76885,7 @@ "str r3, [%[r], #32]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -74905,15 +76898,14 @@ */ static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -74938,251 +76930,203 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -75208,15 +77152,13 @@ "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r7\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" "str r5, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -75233,9 +77175,9 @@ */ static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -75275,7 +77217,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -75292,9 +77234,9 @@ */ static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -75324,7 +77266,7 @@ "bpl L_div_256_word_8_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -75352,7 +77294,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -75380,7 +77322,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -75413,7 +77355,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -75454,8 +77396,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[16], t2[9]; sp_digit div, r1; @@ -75495,7 +77437,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_256_mod_8(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_256_div_8(a, m, NULL, r); } @@ -75638,7 +77581,7 @@ sp_256_mont_sqr_n_order_8(t2, t3, 4); /* t = a^ff = t2 * t3 */ sp_256_mont_mul_order_8(t, t2, t3); - /* t3= a^ff00 = t ^ 2 ^ 8 */ + /* t2= a^ff00 = t ^ 2 ^ 8 */ sp_256_mont_sqr_n_order_8(t2, t, 8); /* t = a^ffff = t2 * t */ sp_256_mont_mul_order_8(t, t2, t); @@ -75655,7 +77598,11 @@ /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */ sp_256_mont_mul_order_8(t2, t2, t); /* t2= a^ffffffff00000000ffffffffffffffffbce6 */ - for (i=127; i>=112; i--) { + sp_256_mont_sqr_order_8(t2, t2); + sp_256_mont_mul_order_8(t2, t2, a); + sp_256_mont_sqr_n_order_8(t2, t2, 5); + sp_256_mont_mul_order_8(t2, t2, t3); + for (i=121; i>=112; i--) { sp_256_mont_sqr_order_8(t2, t2); if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) { sp_256_mont_mul_order_8(t2, t2, a); @@ -76060,21 +78007,94 @@ #endif /* HAVE_ECC_SIGN */ #ifndef WOLFSSL_SP_SMALL +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "mov r12, #0\n\t" + "add lr, %[a], #32\n\t" + "\n" + "L_sp_256_sub_8_word_%=: \n\t" + "rsbs r12, r12, #0\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "sbc r12, r3, r3\n\t" + "cmp %[a], lr\n\t" + "bne L_sp_256_sub_8_word_%=\n\t" + "mov %[r], r12\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "subs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "sbc %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ static void sp_256_rshift1_8(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( - "mov r11, #0\n\t" "mov r12, #0\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r2, [%[a], #16]\n\t" "ldr r3, [%[a], #20]\n\t" #else "ldrd r2, r3, [%[a], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[a], #24]\n\t" "ldr r5, [%[a], #28]\n\t" #else @@ -76089,25 +78109,25 @@ "orr r8, r8, r5, lsl #31\n\t" "orr r9, r9, r12, lsl #31\n\t" "mov r12, r2\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[r], #16]\n\t" "str r7, [%[r], #20]\n\t" #else "strd r6, r7, [%[r], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #24]\n\t" "str r9, [%[r], #28]\n\t" #else "strd r8, r9, [%[r], #24]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r2, [%[a]]\n\t" "ldr r3, [%[a], #4]\n\t" #else "ldrd r2, r3, [%[a]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[a], #8]\n\t" "ldr r5, [%[a], #12]\n\t" #else @@ -76121,13 +78141,13 @@ "orr r7, r7, r4, lsl #31\n\t" "orr r8, r8, r5, lsl #31\n\t" "orr r9, r9, r12, lsl #31\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r6, [%[r]]\n\t" "str r7, [%[r], #4]\n\t" #else "strd r6, r7, [%[r]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #8]\n\t" "str r9, [%[r], #12]\n\t" #else @@ -76135,7 +78155,7 @@ #endif : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "r11" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10", "cc" ); } @@ -76147,13 +78167,13 @@ */ static void sp_256_div2_mod_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; __asm__ __volatile__ ( "mov r12, #0\n\t" - "ldr r4, [%[a]], #4\n\t" + "ldm %[a]!, {r4}\n\t" "ands r3, r4, #1\n\t" "beq L_sp_256_div2_mod_8_even_%=\n\t" "ldm %[a]!, {r5, r6, r7}\n\t" @@ -76173,13 +78193,13 @@ "b L_sp_256_div2_mod_8_div2_%=\n\t" "\n" "L_sp_256_div2_mod_8_even_%=: \n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[a], #12]\n\t" "ldr r5, [%[a], #16]\n\t" #else "ldrd r4, r5, [%[a], #12]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r6, [%[a], #20]\n\t" "ldr r7, [%[a], #24]\n\t" #else @@ -76197,13 +78217,13 @@ "orr r10, r10, r7, lsl #31\n\t" "orr r11, r11, r3, lsl #31\n\t" "mov r3, r4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r8, [%[r], #16]\n\t" "str r9, [%[r], #20]\n\t" #else "strd r8, r9, [%[r], #16]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r10, [%[r], #24]\n\t" "str r11, [%[r], #28]\n\t" #else @@ -76221,49 +78241,50 @@ "stm %[r], {r8, r9, r10, r11}\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); } -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) static const unsigned char L_sp_256_num_bits_8_table[] = { - 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, }; static int sp_256_num_bits_8(const sp_digit* a_p) { - register const sp_digit* a asm ("r0") = a_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register unsigned char* L_sp_256_num_bits_8_table_c asm ("r1") = (unsigned char*)&L_sp_256_num_bits_8_table; __asm__ __volatile__ ( "mov lr, %[L_sp_256_num_bits_8_table]\n\t" @@ -76575,9 +78596,9 @@ "\n" "L_sp_256_num_bits_8_9_%=: \n\t" "mov %[a], r12\n\t" - : [a] "+r" (a) - : [L_sp_256_num_bits_8_table] "r" (L_sp_256_num_bits_8_table) - : "memory", "r1", "r2", "r3", "r12", "lr" + : [a] "+r" (a), [L_sp_256_num_bits_8_table] "+r" (L_sp_256_num_bits_8_table_c) + : + : "memory", "r2", "r3", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -76585,13 +78606,13 @@ #else static int sp_256_num_bits_8(const sp_digit* a_p) { - register const sp_digit* a asm ("r0") = a_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; __asm__ __volatile__ ( "ldr r1, [%[a], #28]\n\t" "cmp r1, #0\n\t" "beq L_sp_256_num_bits_8_7_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x0\n\t" @@ -76666,12 +78687,12 @@ "mov %[a], r12\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r12", "lr" + : "memory", "r1", "r2", "r3", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } -#endif /* WOLFSSL_SP_ARM_ARCH && (WOLFSSL_SP_ARM_ARCH < 7) */ +#endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */ /* Non-constant time modular inversion. * * @param [out] r Resulting number. @@ -76715,7 +78736,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_256_cmp_8(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_256_cmp_8(u, v) >= 0))) { sp_256_sub_8(u, u, v); o = sp_256_sub_8(b, b, d); if (o != 0) @@ -76792,7 +78813,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -77116,7 +79137,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -77144,19 +79165,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 8; + /* y^2 - x^3 - a.x = b */ sp_256_sqr_8(t1, point->y); (void)sp_256_mod_8(t1, t1, p256_mod); sp_256_sqr_8(t2, point->x); (void)sp_256_mod_8(t2, t2, p256_mod); sp_256_mul_8(t2, t2, point->x); (void)sp_256_mod_8(t2, t2, p256_mod); - (void)sp_256_sub_8(t2, p256_mod, t2); - sp_256_mont_add_8(t1, t1, t2, p256_mod); + sp_256_mont_sub_8(t1, t1, t2, p256_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_256_mont_add_8(t1, t1, point->x, p256_mod); sp_256_mont_add_8(t1, t1, point->x, p256_mod); sp_256_mont_add_8(t1, t1, point->x, p256_mod); + if (sp_256_cmp_8(t1, p256_b) != 0) { err = MP_VAL; } @@ -77170,7 +79193,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -77764,16 +79787,19 @@ */ static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x60\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_384_mul_12_outer_%=: \n\t" "subs r3, r5, #44\n\t" @@ -77784,7 +79810,44 @@ "L_sp_384_mul_12_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -77821,10 +79884,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #48\n\t" - "beq L_sp_384_mul_12_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_384_mul_12_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_384_mul_12_inner_done_%=\n\t" + "blt L_sp_384_mul_12_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_384_mul_12_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -77832,18 +79931,50 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x58\n\t" + "cmp r5, #0x54\n\t" "ble L_sp_384_mul_12_outer_%=\n\t" + "ldr lr, [%[a], #44]\n\t" + "ldr r11, [%[b], #44]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_384_mul_12_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_384_mul_12_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -77856,17 +79987,16 @@ */ static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #48\n\t" - "mov r10, #0\n\t" /* A[0] * B[0] */ "ldr r11, [%[a]]\n\t" "ldr r12, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r3, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -77896,7 +80026,7 @@ "str r3, [sp]\n\t" /* A[0] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -77935,7 +80065,7 @@ #endif /* A[1] * B[0] */ "ldr r8, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -77973,7 +80103,7 @@ "str r4, [sp, #4]\n\t" /* A[2] * B[0] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78013,7 +80143,7 @@ /* A[1] * B[1] */ "ldr r11, [%[a], #4]\n\t" "ldr r12, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78051,7 +80181,7 @@ /* A[0] * B[2] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78089,7 +80219,7 @@ "str r5, [sp, #8]\n\t" /* A[0] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78128,7 +80258,7 @@ #endif /* A[1] * B[2] */ "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78165,7 +80295,7 @@ #endif /* A[2] * B[1] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78203,7 +80333,7 @@ /* A[3] * B[0] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78241,7 +80371,7 @@ "str r3, [sp, #12]\n\t" /* A[4] * B[0] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78280,7 +80410,7 @@ #endif /* A[3] * B[1] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78318,7 +80448,7 @@ /* A[2] * B[2] */ "ldr r11, [%[a], #8]\n\t" "ldr r12, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78356,7 +80486,7 @@ /* A[1] * B[3] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78394,7 +80524,7 @@ /* A[0] * B[4] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78432,7 +80562,7 @@ "str r4, [sp, #16]\n\t" /* A[0] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78472,7 +80602,7 @@ /* A[1] * B[4] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78509,7 +80639,7 @@ #endif /* A[2] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78546,7 +80676,7 @@ #endif /* A[3] * B[2] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78584,7 +80714,7 @@ /* A[4] * B[1] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78622,7 +80752,7 @@ /* A[5] * B[0] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78660,7 +80790,7 @@ "str r5, [sp, #20]\n\t" /* A[6] * B[0] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78700,7 +80830,7 @@ /* A[5] * B[1] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78737,7 +80867,7 @@ #endif /* A[4] * B[2] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78775,7 +80905,7 @@ /* A[3] * B[3] */ "ldr r11, [%[a], #12]\n\t" "ldr r12, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78813,7 +80943,7 @@ /* A[2] * B[4] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78851,7 +80981,7 @@ /* A[1] * B[5] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78889,7 +81019,7 @@ /* A[0] * B[6] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78927,7 +81057,7 @@ "str r3, [sp, #24]\n\t" /* A[0] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -78967,7 +81097,7 @@ /* A[1] * B[6] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79005,7 +81135,7 @@ /* A[2] * B[5] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79042,7 +81172,7 @@ #endif /* A[3] * B[4] */ "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79079,7 +81209,7 @@ #endif /* A[4] * B[3] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79117,7 +81247,7 @@ /* A[5] * B[2] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79155,7 +81285,7 @@ /* A[6] * B[1] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79193,7 +81323,7 @@ /* A[7] * B[0] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79231,7 +81361,7 @@ "str r4, [sp, #28]\n\t" /* A[8] * B[0] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79271,7 +81401,7 @@ /* A[7] * B[1] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79309,7 +81439,7 @@ /* A[6] * B[2] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79346,7 +81476,7 @@ #endif /* A[5] * B[3] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79384,7 +81514,7 @@ /* A[4] * B[4] */ "ldr r11, [%[a], #16]\n\t" "ldr r12, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79422,7 +81552,7 @@ /* A[3] * B[5] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79460,7 +81590,7 @@ /* A[2] * B[6] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79498,7 +81628,7 @@ /* A[1] * B[7] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79536,7 +81666,7 @@ /* A[0] * B[8] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79574,7 +81704,7 @@ "str r5, [sp, #32]\n\t" /* A[0] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79614,7 +81744,7 @@ /* A[1] * B[8] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79652,7 +81782,7 @@ /* A[2] * B[7] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79690,7 +81820,7 @@ /* A[3] * B[6] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79727,7 +81857,7 @@ #endif /* A[4] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79764,7 +81894,7 @@ #endif /* A[5] * B[4] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79802,7 +81932,7 @@ /* A[6] * B[3] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79840,7 +81970,7 @@ /* A[7] * B[2] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79878,7 +82008,7 @@ /* A[8] * B[1] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79916,7 +82046,7 @@ /* A[9] * B[0] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79954,7 +82084,7 @@ "str r3, [sp, #36]\n\t" /* A[10] * B[0] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -79994,7 +82124,7 @@ /* A[9] * B[1] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80032,7 +82162,7 @@ /* A[8] * B[2] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80070,7 +82200,7 @@ /* A[7] * B[3] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80107,7 +82237,7 @@ #endif /* A[6] * B[4] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80145,7 +82275,7 @@ /* A[5] * B[5] */ "ldr r11, [%[a], #20]\n\t" "ldr r12, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80183,7 +82313,7 @@ /* A[4] * B[6] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80221,7 +82351,7 @@ /* A[3] * B[7] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80259,7 +82389,7 @@ /* A[2] * B[8] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80297,7 +82427,7 @@ /* A[1] * B[9] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80335,7 +82465,7 @@ /* A[0] * B[10] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80373,7 +82503,7 @@ "str r4, [sp, #40]\n\t" /* A[0] * B[11] */ "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80413,7 +82543,7 @@ /* A[1] * B[10] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80451,7 +82581,7 @@ /* A[2] * B[9] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80489,7 +82619,7 @@ /* A[3] * B[8] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80527,7 +82657,7 @@ /* A[4] * B[7] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80564,7 +82694,7 @@ #endif /* A[5] * B[6] */ "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80601,7 +82731,7 @@ #endif /* A[6] * B[5] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80639,7 +82769,7 @@ /* A[7] * B[4] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80677,7 +82807,7 @@ /* A[8] * B[3] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80715,7 +82845,7 @@ /* A[9] * B[2] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80753,7 +82883,7 @@ /* A[10] * B[1] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80791,7 +82921,7 @@ /* A[11] * B[0] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80829,7 +82959,7 @@ "str r5, [sp, #44]\n\t" /* A[11] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80869,7 +82999,7 @@ /* A[10] * B[2] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80907,7 +83037,7 @@ /* A[9] * B[3] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80945,7 +83075,7 @@ /* A[8] * B[4] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -80982,7 +83112,7 @@ #endif /* A[7] * B[5] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81020,7 +83150,7 @@ /* A[6] * B[6] */ "ldr r11, [%[a], #24]\n\t" "ldr r12, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81058,7 +83188,7 @@ /* A[5] * B[7] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81096,7 +83226,7 @@ /* A[4] * B[8] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81134,7 +83264,7 @@ /* A[3] * B[9] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81172,7 +83302,7 @@ /* A[2] * B[10] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81210,7 +83340,7 @@ /* A[1] * B[11] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81248,7 +83378,7 @@ "str r3, [%[r], #48]\n\t" /* A[2] * B[11] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81288,7 +83418,7 @@ /* A[3] * B[10] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81326,7 +83456,7 @@ /* A[4] * B[9] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81364,7 +83494,7 @@ /* A[5] * B[8] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81401,7 +83531,7 @@ #endif /* A[6] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81438,7 +83568,7 @@ #endif /* A[7] * B[6] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81476,7 +83606,7 @@ /* A[8] * B[5] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81514,7 +83644,7 @@ /* A[9] * B[4] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81552,7 +83682,7 @@ /* A[10] * B[3] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81590,7 +83720,7 @@ /* A[11] * B[2] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81628,7 +83758,7 @@ "str r4, [%[r], #52]\n\t" /* A[11] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81668,7 +83798,7 @@ /* A[10] * B[4] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81706,7 +83836,7 @@ /* A[9] * B[5] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81743,7 +83873,7 @@ #endif /* A[8] * B[6] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81781,7 +83911,7 @@ /* A[7] * B[7] */ "ldr r11, [%[a], #28]\n\t" "ldr r12, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81819,7 +83949,7 @@ /* A[6] * B[8] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81857,7 +83987,7 @@ /* A[5] * B[9] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81895,7 +84025,7 @@ /* A[4] * B[10] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81933,7 +84063,7 @@ /* A[3] * B[11] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -81971,7 +84101,7 @@ "str r5, [%[r], #56]\n\t" /* A[4] * B[11] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82011,7 +84141,7 @@ /* A[5] * B[10] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82049,7 +84179,7 @@ /* A[6] * B[9] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82086,7 +84216,7 @@ #endif /* A[7] * B[8] */ "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82123,7 +84253,7 @@ #endif /* A[8] * B[7] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82161,7 +84291,7 @@ /* A[9] * B[6] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82199,7 +84329,7 @@ /* A[10] * B[5] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82237,7 +84367,7 @@ /* A[11] * B[4] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82275,7 +84405,7 @@ "str r3, [%[r], #60]\n\t" /* A[11] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82315,7 +84445,7 @@ /* A[10] * B[6] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82352,7 +84482,7 @@ #endif /* A[9] * B[7] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82390,7 +84520,7 @@ /* A[8] * B[8] */ "ldr r11, [%[a], #32]\n\t" "ldr r12, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82428,7 +84558,7 @@ /* A[7] * B[9] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82466,7 +84596,7 @@ /* A[6] * B[10] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82504,7 +84634,7 @@ /* A[5] * B[11] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82542,7 +84672,7 @@ "str r4, [%[r], #64]\n\t" /* A[6] * B[11] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82582,7 +84712,7 @@ /* A[7] * B[10] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82619,7 +84749,7 @@ #endif /* A[8] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82656,7 +84786,7 @@ #endif /* A[9] * B[8] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82694,7 +84824,7 @@ /* A[10] * B[7] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82732,7 +84862,7 @@ /* A[11] * B[6] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82770,7 +84900,7 @@ "str r5, [%[r], #68]\n\t" /* A[11] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82809,7 +84939,7 @@ #endif /* A[10] * B[8] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82847,7 +84977,7 @@ /* A[9] * B[9] */ "ldr r11, [%[a], #36]\n\t" "ldr r12, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82885,7 +85015,7 @@ /* A[8] * B[10] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82923,7 +85053,7 @@ /* A[7] * B[11] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -82961,7 +85091,7 @@ "str r3, [%[r], #72]\n\t" /* A[8] * B[11] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83000,7 +85130,7 @@ #endif /* A[9] * B[10] */ "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83037,7 +85167,7 @@ #endif /* A[10] * B[9] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83075,7 +85205,7 @@ /* A[11] * B[8] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83112,7 +85242,7 @@ #endif "str r4, [%[r], #76]\n\t" /* A[11] * B[9] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83152,7 +85282,7 @@ /* A[10] * B[10] */ "ldr r11, [%[a], #40]\n\t" "ldr r12, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83190,7 +85320,7 @@ /* A[9] * B[11] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83227,7 +85357,7 @@ #endif "str r5, [%[r], #80]\n\t" /* A[10] * B[11] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83266,7 +85396,7 @@ #endif /* A[11] * B[10] */ "ldr r8, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83303,7 +85433,7 @@ #endif "str r3, [%[r], #84]\n\t" /* A[11] * B[11] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -83329,9 +85459,7 @@ "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" #else - "umull r6, r7, r8, r9\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r7\n\t" + "umlal r4, r5, r8, r9\n\t" #endif "str r4, [%[r], #88]\n\t" "str r5, [%[r], #92]\n\t" @@ -83343,7 +85471,7 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); } @@ -83356,29 +85484,28 @@ */ static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x60\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_384_sqr_12_outer_%=: \n\t" "subs r3, r5, #44\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_384_sqr_12_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_384_sqr_12_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -83427,11 +85554,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_384_sqr_12_op_done_%=\n\t" - "\n" - "L_sp_384_sqr_12_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_384_sqr_12_inner_done_%=\n\t" + "blt L_sp_384_sqr_12_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -83458,34 +85587,50 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_384_sqr_12_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #48\n\t" - "beq L_sp_384_sqr_12_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_384_sqr_12_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_384_sqr_12_inner_%=\n\t" - "\n" "L_sp_384_sqr_12_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x58\n\t" + "cmp r5, #0x54\n\t" "ble L_sp_384_sqr_12_outer_%=\n\t" + "ldr lr, [%[a], #44]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_384_sqr_12_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_384_sqr_12_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -83497,14 +85642,14 @@ */ static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #48\n\t" /* A[0] * A[0] */ "ldr r10, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsr r9, r10, #16\n\t" "lsl r2, r10, #16\n\t" "lsr r2, r2, #16\n\t" @@ -83523,7 +85668,7 @@ /* A[0] * A[1] */ "ldr r10, [%[a], #4]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83579,7 +85724,7 @@ /* A[0] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83633,7 +85778,7 @@ #endif /* A[1] * A[1] */ "ldr r10, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83663,7 +85808,7 @@ /* A[0] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83718,7 +85863,7 @@ /* A[1] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83771,7 +85916,7 @@ /* A[0] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83826,7 +85971,7 @@ /* A[1] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83877,7 +86022,7 @@ #endif /* A[2] * A[2] */ "ldr r10, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83907,7 +86052,7 @@ /* A[0] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83937,7 +86082,7 @@ /* A[1] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -83975,7 +86120,7 @@ /* A[2] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84020,7 +86165,7 @@ /* A[0] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84050,7 +86195,7 @@ /* A[1] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84088,7 +86233,7 @@ /* A[2] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84125,7 +86270,7 @@ #endif /* A[3] * A[3] */ "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84164,7 +86309,7 @@ /* A[0] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84194,7 +86339,7 @@ /* A[1] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84232,7 +86377,7 @@ /* A[2] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84270,7 +86415,7 @@ /* A[3] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84315,7 +86460,7 @@ /* A[0] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84345,7 +86490,7 @@ /* A[1] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84383,7 +86528,7 @@ /* A[2] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84421,7 +86566,7 @@ /* A[3] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84458,7 +86603,7 @@ #endif /* A[4] * A[4] */ "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84497,7 +86642,7 @@ /* A[0] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84527,7 +86672,7 @@ /* A[1] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84565,7 +86710,7 @@ /* A[2] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84603,7 +86748,7 @@ /* A[3] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84641,7 +86786,7 @@ /* A[4] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84686,7 +86831,7 @@ /* A[0] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84716,7 +86861,7 @@ /* A[1] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84754,7 +86899,7 @@ /* A[2] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84792,7 +86937,7 @@ /* A[3] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84830,7 +86975,7 @@ /* A[4] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84867,7 +87012,7 @@ #endif /* A[5] * A[5] */ "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84906,7 +87051,7 @@ /* A[0] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84936,7 +87081,7 @@ /* A[1] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -84974,7 +87119,7 @@ /* A[2] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85012,7 +87157,7 @@ /* A[3] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85050,7 +87195,7 @@ /* A[4] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85088,7 +87233,7 @@ /* A[5] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85133,7 +87278,7 @@ /* A[1] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85163,7 +87308,7 @@ /* A[2] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85201,7 +87346,7 @@ /* A[3] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85239,7 +87384,7 @@ /* A[4] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85277,7 +87422,7 @@ /* A[5] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85314,7 +87459,7 @@ #endif /* A[6] * A[6] */ "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85353,7 +87498,7 @@ /* A[2] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85383,7 +87528,7 @@ /* A[3] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85421,7 +87566,7 @@ /* A[4] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85459,7 +87604,7 @@ /* A[5] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85497,7 +87642,7 @@ /* A[6] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85542,7 +87687,7 @@ /* A[3] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85572,7 +87717,7 @@ /* A[4] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85610,7 +87755,7 @@ /* A[5] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85648,7 +87793,7 @@ /* A[6] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85685,7 +87830,7 @@ #endif /* A[7] * A[7] */ "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85724,7 +87869,7 @@ /* A[4] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85754,7 +87899,7 @@ /* A[5] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85792,7 +87937,7 @@ /* A[6] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85830,7 +87975,7 @@ /* A[7] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85875,7 +88020,7 @@ /* A[5] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85905,7 +88050,7 @@ /* A[6] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85943,7 +88088,7 @@ /* A[7] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -85980,7 +88125,7 @@ #endif /* A[8] * A[8] */ "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86019,7 +88164,7 @@ /* A[6] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86049,7 +88194,7 @@ /* A[7] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86087,7 +88232,7 @@ /* A[8] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86132,7 +88277,7 @@ /* A[7] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86187,7 +88332,7 @@ /* A[8] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86238,7 +88383,7 @@ #endif /* A[9] * A[9] */ "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86268,7 +88413,7 @@ /* A[8] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86323,7 +88468,7 @@ /* A[9] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86376,7 +88521,7 @@ /* A[9] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86430,7 +88575,7 @@ #endif /* A[10] * A[10] */ "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86460,7 +88605,7 @@ /* A[10] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86515,7 +88660,7 @@ "str r2, [%[r], #84]\n\t" /* A[11] * A[11] */ "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -86548,7 +88693,7 @@ "stm %[r]!, {r2, r3, r4, r8}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); } @@ -86562,9 +88707,9 @@ */ static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -86586,7 +88731,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -86600,12 +88745,11 @@ */ static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -86627,91 +88771,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "add lr, %[a], #48\n\t" - "\n" - "L_sp_384_sub_12_word_%=: \n\t" - "rsbs r12, r12, #0\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "sbc r12, r3, r3\n\t" - "cmp %[a], lr\n\t" - "bne L_sp_384_sub_12_word_%=\n\t" - "mov %[r], r12\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "subs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "sbc %[r], r6, r6\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -86829,14 +88893,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -87025,10 +89089,10 @@ */ static sp_digit sp_384_cond_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -87049,7 +89113,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -87065,10 +89129,10 @@ */ static sp_digit sp_384_cond_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -87117,7 +89181,7 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -87125,6 +89189,7 @@ #endif /* WOLFSSL_SP_SMALL */ #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12 +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 384 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -87133,12 +89198,12 @@ */ static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -87151,10 +89216,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -87178,14 +89242,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -87209,18 +89267,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -87244,17 +89296,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -87278,18 +89324,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -87313,18 +89353,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -87348,18 +89382,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -87383,18 +89411,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -87418,18 +89440,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -87453,18 +89469,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -87488,18 +89498,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -87523,22 +89527,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #44]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #44]\n\t" +#else + "ldr r7, [%[m], #44]\n\t" #endif "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -87569,13 +89567,141 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "ldr r10, [%[a], #48]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #48\n\t" + "blt L_sp_384_mont_reduce_12_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 384 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_384_mont_reduce_12_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "ldr r10, [%[a], #48]\n\t" @@ -87587,16 +89713,123 @@ "add %[a], %[a], #4\n\t" "cmp r9, #48\n\t" "blt L_sp_384_mont_reduce_12_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 384 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_384_mont_reduce_12_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #48]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #44]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #48]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #48\n\t" + "blt L_sp_384_mont_reduce_12_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -87604,7 +89837,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -87618,7 +89851,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -87634,10 +89867,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_12(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_12(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_12(r, a, m, mp); for (; n > 1; n--) { @@ -87748,8 +89981,8 @@ */ static sp_int32 sp_384_cmp_12(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -87912,7 +90145,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -87972,10 +90205,10 @@ */ static void sp_384_mont_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register const sp_digit* m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register const sp_digit* m asm ("r3") = (const sp_digit*)m_p; sp_digit o; @@ -87991,9 +90224,9 @@ */ static void sp_384_mont_dbl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; sp_digit o; @@ -88009,9 +90242,9 @@ */ static void sp_384_mont_tpl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; sp_digit o; @@ -88022,6 +90255,87 @@ } #ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "mov r12, #0\n\t" + "add lr, %[a], #48\n\t" + "\n" + "L_sp_384_sub_12_word_%=: \n\t" + "rsbs r12, r12, #0\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "sbc r12, r3, r3\n\t" + "cmp %[a], lr\n\t" + "bne L_sp_384_sub_12_word_%=\n\t" + "mov %[r], r12\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "subs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "sbc %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -88032,10 +90346,10 @@ */ static sp_digit sp_384_cond_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -88056,7 +90370,7 @@ "mov %[r], lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -88072,10 +90386,10 @@ */ static sp_digit sp_384_cond_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r8, #0\n\t" @@ -88124,7 +90438,7 @@ "adc %[r], r8, r8\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -88139,10 +90453,10 @@ */ static void sp_384_mont_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register const sp_digit* m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register const sp_digit* m asm ("r3") = (const sp_digit*)m_p; sp_digit o; @@ -88150,14 +90464,13 @@ sp_384_cond_add_12(r, r, m, o); } -#define sp_384_mont_sub_lower_12 sp_384_mont_sub_12 #ifdef WOLFSSL_SP_SMALL #else #endif /* WOLFSSL_SP_SMALL */ static void sp_384_rshift1_12(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3}\n\t" @@ -88208,7 +90521,7 @@ "str r4, [%[r], #44]\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4" + : "memory", "r2", "r3", "r4", "cc" ); } @@ -88218,7 +90531,7 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_384_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_384_mont_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o; @@ -88271,7 +90584,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_12(t2, t2, p384_mod); + sp_384_mont_div2_12(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -88281,7 +90594,7 @@ /* X = X - Y */ sp_384_mont_sub_12(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_12(y, y, x, p384_mod); + sp_384_mont_sub_12(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -88304,7 +90617,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data; @@ -88378,7 +90692,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_12(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_12(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -88403,7 +90717,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -88466,12 +90780,12 @@ static void sp_384_proj_point_add_12(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*12; - sp_digit* t3 = t + 4*12; - sp_digit* t4 = t + 6*12; - sp_digit* t5 = t + 8*12; - sp_digit* t6 = t + 10*12; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*12; + sp_digit* t2 = t + 4*12; + sp_digit* t3 = t + 6*12; + sp_digit* t4 = t + 8*12; + sp_digit* t5 = t + 10*12; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod); @@ -88493,17 +90807,9 @@ sp_384_proj_point_dbl_12(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_12(t2, t2, t1, p384_mod); @@ -88522,20 +90828,31 @@ sp_384_mont_dbl_12(t3, y, p384_mod); sp_384_mont_sub_12(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_12(y, y, x, p384_mod); + sp_384_mont_sub_12(y, y, x, p384_mod); sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_12(y, y, t5, p384_mod); - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -88581,12 +90898,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*12; - ctx->t3 = t + 4*12; - ctx->t4 = t + 6*12; - ctx->t5 = t + 8*12; - ctx->t6 = t + 10*12; + ctx->t6 = t; + ctx->t1 = t + 2*12; + ctx->t2 = t + 4*12; + ctx->t3 = t + 6*12; + ctx->t4 = t + 8*12; + ctx->t5 = t + 10*12; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -88693,7 +91010,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -88706,22 +91023,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -88741,7 +91064,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table, @@ -89017,8 +91340,6 @@ } #ifdef FP_ECC -#define sp_384_mont_dbl_lower_12 sp_384_mont_dbl_12 -#define sp_384_mont_tpl_lower_12 sp_384_mont_tpl_12 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -89057,7 +91378,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_12(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_12(a, t1, p384_mod); + sp_384_mont_tpl_12(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod); @@ -89066,8 +91387,8 @@ sp_384_mont_dbl_12(t2, b, p384_mod); sp_384_mont_sub_12(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_12(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_12(b, t2, p384_mod); + sp_384_mont_sub_12(t2, b, x, p384_mod); + sp_384_mont_dbl_12(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -89087,7 +91408,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_12(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_12(a, t1, p384_mod); + sp_384_mont_tpl_12(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod); @@ -89096,8 +91417,8 @@ sp_384_mont_dbl_12(t2, b, p384_mod); sp_384_mont_sub_12(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_12(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_12(b, t2, p384_mod); + sp_384_mont_sub_12(t2, b, x, p384_mod); + sp_384_mont_dbl_12(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -89107,7 +91428,7 @@ sp_384_mont_sub_12(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_12(y, y, p384_mod); + sp_384_mont_div2_12(y, y, p384_mod); } /* Convert the projective point to affine. @@ -89153,12 +91474,12 @@ static void sp_384_proj_point_add_qz1_12(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*12; - sp_digit* t3 = t + 4*12; - sp_digit* t4 = t + 6*12; - sp_digit* t5 = t + 8*12; - sp_digit* t6 = t + 10*12; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*12; + sp_digit* t6 = t + 4*12; + sp_digit* t1 = t + 6*12; + sp_digit* t4 = t + 8*12; + sp_digit* t5 = t + 10*12; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -89174,13 +91495,9 @@ sp_384_proj_point_dbl_12(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_12(t2, t2, p->x, p384_mod); @@ -89189,33 +91506,40 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_12(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_12(x, t1, t5, p384_mod); - sp_384_mont_dbl_12(t1, t3, p384_mod); - sp_384_mont_sub_12(x, x, t1, p384_mod); + sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_12(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_12(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_12(t2, t2, t1, p384_mod); + sp_384_mont_dbl_12(t5, t3, p384_mod); + sp_384_mont_sub_12(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_12(t3, t3, x, p384_mod); + sp_384_mont_sub_12(t3, t3, x, p384_mod); sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_12(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_12(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_12(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -89316,7 +91640,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_16_12(sp_point_384* r, @@ -89521,13 +91845,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -89598,8 +91924,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap); @@ -89620,10 +91946,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -89752,7 +92080,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_256_12(sp_point_384* r, @@ -89957,13 +92285,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -90034,8 +92364,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap); @@ -90056,10 +92386,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -90152,7 +92484,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -90163,7 +92495,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_384* point = NULL; + sp_point_384* point = NULL; sp_digit* k = NULL; #else sp_point_384 point[2]; @@ -91701,7 +94033,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -91723,7 +94055,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -91784,7 +94116,7 @@ */ static void sp_384_add_one_12(sp_digit* a_p) { - register sp_digit* a asm ("r0") = a_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; __asm__ __volatile__ ( "ldm %[a], {r1, r2, r3, r4}\n\t" @@ -91807,7 +94139,7 @@ "stm %[a]!, {r1, r2, r3, r4}\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r4" + : "memory", "r1", "r2", "r3", "r4", "cc" ); } @@ -91902,7 +94234,7 @@ sp_point_384* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -91910,7 +94242,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -92188,16 +94520,15 @@ */ static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #48\n\t" "\n" "L_sp_384_sub_in_pkace_12_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -92205,13 +94536,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_384_sub_in_pkace_12_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -92224,8 +94555,8 @@ */ static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -92252,7 +94583,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -92267,15 +94598,14 @@ */ static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -92308,7 +94638,7 @@ "L_sp_384_mul_d_12_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -92353,7 +94683,7 @@ "str r3, [%[r], #48]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -92366,15 +94696,14 @@ */ static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -92399,411 +94728,331 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -92829,15 +95078,13 @@ "adds r5, r5, r6\n\t" "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r7\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" "str r3, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -92854,9 +95101,9 @@ */ static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -92896,7 +95143,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -92913,9 +95160,9 @@ */ static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -92945,7 +95192,7 @@ "bpl L_div_384_word_12_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -92973,7 +95220,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -93001,7 +95248,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -93034,7 +95281,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -93079,8 +95326,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[24], t2[13]; sp_digit div, r1; @@ -93120,7 +95367,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_384_mod_12(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_384_div_12(a, m, NULL, r); } @@ -93664,12 +95912,12 @@ */ static void sp_384_div2_mod_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; __asm__ __volatile__ ( - "ldr r4, [%[a]], #4\n\t" + "ldm %[a]!, {r4}\n\t" "ands r3, r4, #1\n\t" "beq L_sp_384_div2_mod_12_even_%=\n\t" "mov r12, #0\n\t" @@ -93706,8 +95954,8 @@ "stm %[r]!, {r4, r5, r6, r7}\n\t" "\n" "L_sp_384_div2_mod_12_div2_%=: \n\t" - "sub %[r], #48\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + "sub %[r], %[r], #48\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[r]]\n\t" "ldr r9, [%[r], #4]\n\t" #else @@ -93761,49 +96009,50 @@ "str r10, [%[r], #44]\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); } -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) static const unsigned char L_sp_384_num_bits_12_table[] = { - 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, }; static int sp_384_num_bits_12(const sp_digit* a_p) { - register const sp_digit* a asm ("r0") = a_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register unsigned char* L_sp_384_num_bits_12_table_c asm ("r1") = (unsigned char*)&L_sp_384_num_bits_12_table; __asm__ __volatile__ ( "mov lr, %[L_sp_384_num_bits_12_table]\n\t" @@ -93813,7 +96062,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_11_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x78\n\t" @@ -93829,7 +96078,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_11_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x70\n\t" @@ -93845,7 +96094,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_11_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x68\n\t" @@ -93858,7 +96107,7 @@ "\n" "L_sp_384_num_bits_12_11_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x60\n\t" @@ -93876,7 +96125,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_10_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x58\n\t" @@ -93892,7 +96141,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_10_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x50\n\t" @@ -93908,7 +96157,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_10_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x48\n\t" @@ -93921,7 +96170,7 @@ "\n" "L_sp_384_num_bits_12_10_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x40\n\t" @@ -93939,7 +96188,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_9_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x38\n\t" @@ -93955,7 +96204,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_9_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x30\n\t" @@ -93971,7 +96220,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_9_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x28\n\t" @@ -93984,7 +96233,7 @@ "\n" "L_sp_384_num_bits_12_9_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x20\n\t" @@ -94002,7 +96251,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_8_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x18\n\t" @@ -94018,7 +96267,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_8_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x10\n\t" @@ -94034,7 +96283,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_384_num_bits_12_8_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x8\n\t" @@ -94047,7 +96296,7 @@ "\n" "L_sp_384_num_bits_12_8_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x0\n\t" @@ -94367,9 +96616,9 @@ "\n" "L_sp_384_num_bits_12_13_%=: \n\t" "mov %[a], r12\n\t" - : [a] "+r" (a) - : [L_sp_384_num_bits_12_table] "r" (L_sp_384_num_bits_12_table) - : "memory", "r1", "r2", "r3", "r12", "lr" + : [a] "+r" (a), [L_sp_384_num_bits_12_table] "+r" (L_sp_384_num_bits_12_table_c) + : + : "memory", "r2", "r3", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -94377,13 +96626,13 @@ #else static int sp_384_num_bits_12(const sp_digit* a_p) { - register const sp_digit* a asm ("r0") = a_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; __asm__ __volatile__ ( "ldr r1, [%[a], #44]\n\t" "cmp r1, #0\n\t" "beq L_sp_384_num_bits_12_11_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x80\n\t" @@ -94398,7 +96647,7 @@ "ldr r1, [%[a], #40]\n\t" "cmp r1, #0\n\t" "beq L_sp_384_num_bits_12_10_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x60\n\t" @@ -94413,7 +96662,7 @@ "ldr r1, [%[a], #36]\n\t" "cmp r1, #0\n\t" "beq L_sp_384_num_bits_12_9_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x40\n\t" @@ -94428,7 +96677,7 @@ "ldr r1, [%[a], #32]\n\t" "cmp r1, #0\n\t" "beq L_sp_384_num_bits_12_8_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x20\n\t" @@ -94443,7 +96692,7 @@ "ldr r1, [%[a], #28]\n\t" "cmp r1, #0\n\t" "beq L_sp_384_num_bits_12_7_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x0\n\t" @@ -94518,12 +96767,12 @@ "mov %[a], r12\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r12", "lr" + : "memory", "r1", "r2", "r3", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } -#endif /* WOLFSSL_SP_ARM_ARCH && (WOLFSSL_SP_ARM_ARCH < 7) */ +#endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */ /* Non-constant time modular inversion. * * @param [out] r Resulting number. @@ -94567,7 +96816,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_384_cmp_12(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_384_cmp_12(u, v) >= 0))) { sp_384_sub_12(u, u, v); o = sp_384_sub_12(b, b, d); if (o != 0) @@ -94648,7 +96897,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -94972,7 +97221,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -95000,19 +97249,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 12; + /* y^2 - x^3 - a.x = b */ sp_384_sqr_12(t1, point->y); (void)sp_384_mod_12(t1, t1, p384_mod); sp_384_sqr_12(t2, point->x); (void)sp_384_mod_12(t2, t2, p384_mod); sp_384_mul_12(t2, t2, point->x); (void)sp_384_mod_12(t2, t2, p384_mod); - (void)sp_384_sub_12(t2, p384_mod, t2); - sp_384_mont_add_12(t1, t1, t2, p384_mod); + sp_384_mont_sub_12(t1, t1, t2, p384_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_384_mont_add_12(t1, t1, point->x, p384_mod); sp_384_mont_add_12(t1, t1, point->x, p384_mod); sp_384_mont_add_12(t1, t1, point->x, p384_mod); + if (sp_384_cmp_12(t1, p384_b) != 0) { err = MP_VAL; } @@ -95026,7 +97277,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -95662,16 +97913,19 @@ */ static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x88\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_521_mul_17_outer_%=: \n\t" "subs r3, r5, #0x40\n\t" @@ -95682,7 +97936,44 @@ "L_sp_521_mul_17_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -95719,10 +98010,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #0x44\n\t" - "beq L_sp_521_mul_17_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_521_mul_17_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_521_mul_17_inner_done_%=\n\t" + "blt L_sp_521_mul_17_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_521_mul_17_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -95730,21 +98057,53 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x80\n\t" + "cmp r5, #0x7c\n\t" "ble L_sp_521_mul_17_outer_%=\n\t" + "ldr lr, [%[a], #64]\n\t" + "ldr r11, [%[b], #64]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "ldm sp!, {r6, r7}\n\t" "stm %[r]!, {r6, r7}\n\t" "sub r5, r5, #8\n\t" "\n" "L_sp_521_mul_17_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_521_mul_17_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -95757,17 +98116,16 @@ */ static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x44\n\t" - "mov r10, #0\n\t" /* A[0] * B[0] */ "ldr r11, [%[a]]\n\t" "ldr r12, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r3, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -95797,7 +98155,7 @@ "str r3, [sp]\n\t" /* A[0] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -95836,7 +98194,7 @@ #endif /* A[1] * B[0] */ "ldr r8, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -95874,7 +98232,7 @@ "str r4, [sp, #4]\n\t" /* A[2] * B[0] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -95914,7 +98272,7 @@ /* A[1] * B[1] */ "ldr r11, [%[a], #4]\n\t" "ldr r12, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -95952,7 +98310,7 @@ /* A[0] * B[2] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -95990,7 +98348,7 @@ "str r5, [sp, #8]\n\t" /* A[0] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96029,7 +98387,7 @@ #endif /* A[1] * B[2] */ "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96066,7 +98424,7 @@ #endif /* A[2] * B[1] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96104,7 +98462,7 @@ /* A[3] * B[0] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96142,7 +98500,7 @@ "str r3, [sp, #12]\n\t" /* A[4] * B[0] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96181,7 +98539,7 @@ #endif /* A[3] * B[1] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96219,7 +98577,7 @@ /* A[2] * B[2] */ "ldr r11, [%[a], #8]\n\t" "ldr r12, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96257,7 +98615,7 @@ /* A[1] * B[3] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96295,7 +98653,7 @@ /* A[0] * B[4] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96333,7 +98691,7 @@ "str r4, [sp, #16]\n\t" /* A[0] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96373,7 +98731,7 @@ /* A[1] * B[4] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96410,7 +98768,7 @@ #endif /* A[2] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96447,7 +98805,7 @@ #endif /* A[3] * B[2] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96485,7 +98843,7 @@ /* A[4] * B[1] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96523,7 +98881,7 @@ /* A[5] * B[0] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96561,7 +98919,7 @@ "str r5, [sp, #20]\n\t" /* A[6] * B[0] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96601,7 +98959,7 @@ /* A[5] * B[1] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96638,7 +98996,7 @@ #endif /* A[4] * B[2] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96676,7 +99034,7 @@ /* A[3] * B[3] */ "ldr r11, [%[a], #12]\n\t" "ldr r12, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96714,7 +99072,7 @@ /* A[2] * B[4] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96752,7 +99110,7 @@ /* A[1] * B[5] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96790,7 +99148,7 @@ /* A[0] * B[6] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96828,7 +99186,7 @@ "str r3, [sp, #24]\n\t" /* A[0] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96868,7 +99226,7 @@ /* A[1] * B[6] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96906,7 +99264,7 @@ /* A[2] * B[5] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96943,7 +99301,7 @@ #endif /* A[3] * B[4] */ "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -96980,7 +99338,7 @@ #endif /* A[4] * B[3] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97018,7 +99376,7 @@ /* A[5] * B[2] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97056,7 +99414,7 @@ /* A[6] * B[1] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97094,7 +99452,7 @@ /* A[7] * B[0] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97132,7 +99490,7 @@ "str r4, [sp, #28]\n\t" /* A[8] * B[0] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97172,7 +99530,7 @@ /* A[7] * B[1] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97210,7 +99568,7 @@ /* A[6] * B[2] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97247,7 +99605,7 @@ #endif /* A[5] * B[3] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97285,7 +99643,7 @@ /* A[4] * B[4] */ "ldr r11, [%[a], #16]\n\t" "ldr r12, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97323,7 +99681,7 @@ /* A[3] * B[5] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97361,7 +99719,7 @@ /* A[2] * B[6] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97399,7 +99757,7 @@ /* A[1] * B[7] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97437,7 +99795,7 @@ /* A[0] * B[8] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97475,7 +99833,7 @@ "str r5, [sp, #32]\n\t" /* A[0] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97515,7 +99873,7 @@ /* A[1] * B[8] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97553,7 +99911,7 @@ /* A[2] * B[7] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97591,7 +99949,7 @@ /* A[3] * B[6] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97628,7 +99986,7 @@ #endif /* A[4] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97665,7 +100023,7 @@ #endif /* A[5] * B[4] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97703,7 +100061,7 @@ /* A[6] * B[3] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97741,7 +100099,7 @@ /* A[7] * B[2] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97779,7 +100137,7 @@ /* A[8] * B[1] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97817,7 +100175,7 @@ /* A[9] * B[0] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97855,7 +100213,7 @@ "str r3, [sp, #36]\n\t" /* A[10] * B[0] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97895,7 +100253,7 @@ /* A[9] * B[1] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97933,7 +100291,7 @@ /* A[8] * B[2] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -97971,7 +100329,7 @@ /* A[7] * B[3] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98008,7 +100366,7 @@ #endif /* A[6] * B[4] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98046,7 +100404,7 @@ /* A[5] * B[5] */ "ldr r11, [%[a], #20]\n\t" "ldr r12, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98084,7 +100442,7 @@ /* A[4] * B[6] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98122,7 +100480,7 @@ /* A[3] * B[7] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98160,7 +100518,7 @@ /* A[2] * B[8] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98198,7 +100556,7 @@ /* A[1] * B[9] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98236,7 +100594,7 @@ /* A[0] * B[10] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98274,7 +100632,7 @@ "str r4, [sp, #40]\n\t" /* A[0] * B[11] */ "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98314,7 +100672,7 @@ /* A[1] * B[10] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98352,7 +100710,7 @@ /* A[2] * B[9] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98390,7 +100748,7 @@ /* A[3] * B[8] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98428,7 +100786,7 @@ /* A[4] * B[7] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98465,7 +100823,7 @@ #endif /* A[5] * B[6] */ "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98502,7 +100860,7 @@ #endif /* A[6] * B[5] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98540,7 +100898,7 @@ /* A[7] * B[4] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98578,7 +100936,7 @@ /* A[8] * B[3] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98616,7 +100974,7 @@ /* A[9] * B[2] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98654,7 +101012,7 @@ /* A[10] * B[1] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98692,7 +101050,7 @@ /* A[11] * B[0] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98730,7 +101088,7 @@ "str r5, [sp, #44]\n\t" /* A[12] * B[0] */ "ldr r8, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98770,7 +101128,7 @@ /* A[11] * B[1] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98808,7 +101166,7 @@ /* A[10] * B[2] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98846,7 +101204,7 @@ /* A[9] * B[3] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98884,7 +101242,7 @@ /* A[8] * B[4] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98921,7 +101279,7 @@ #endif /* A[7] * B[5] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98959,7 +101317,7 @@ /* A[6] * B[6] */ "ldr r11, [%[a], #24]\n\t" "ldr r12, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -98997,7 +101355,7 @@ /* A[5] * B[7] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99035,7 +101393,7 @@ /* A[4] * B[8] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99073,7 +101431,7 @@ /* A[3] * B[9] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99111,7 +101469,7 @@ /* A[2] * B[10] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99149,7 +101507,7 @@ /* A[1] * B[11] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99187,7 +101545,7 @@ /* A[0] * B[12] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99225,7 +101583,7 @@ "str r3, [sp, #48]\n\t" /* A[0] * B[13] */ "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99265,7 +101623,7 @@ /* A[1] * B[12] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99303,7 +101661,7 @@ /* A[2] * B[11] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99341,7 +101699,7 @@ /* A[3] * B[10] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99379,7 +101737,7 @@ /* A[4] * B[9] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99417,7 +101775,7 @@ /* A[5] * B[8] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99454,7 +101812,7 @@ #endif /* A[6] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99491,7 +101849,7 @@ #endif /* A[7] * B[6] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99529,7 +101887,7 @@ /* A[8] * B[5] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99567,7 +101925,7 @@ /* A[9] * B[4] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99605,7 +101963,7 @@ /* A[10] * B[3] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99643,7 +102001,7 @@ /* A[11] * B[2] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99681,7 +102039,7 @@ /* A[12] * B[1] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99719,7 +102077,7 @@ /* A[13] * B[0] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99757,7 +102115,7 @@ "str r4, [sp, #52]\n\t" /* A[14] * B[0] */ "ldr r8, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99797,7 +102155,7 @@ /* A[13] * B[1] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99835,7 +102193,7 @@ /* A[12] * B[2] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99873,7 +102231,7 @@ /* A[11] * B[3] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99911,7 +102269,7 @@ /* A[10] * B[4] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99949,7 +102307,7 @@ /* A[9] * B[5] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -99986,7 +102344,7 @@ #endif /* A[8] * B[6] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100024,7 +102382,7 @@ /* A[7] * B[7] */ "ldr r11, [%[a], #28]\n\t" "ldr r12, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100062,7 +102420,7 @@ /* A[6] * B[8] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100100,7 +102458,7 @@ /* A[5] * B[9] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100138,7 +102496,7 @@ /* A[4] * B[10] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100176,7 +102534,7 @@ /* A[3] * B[11] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100214,7 +102572,7 @@ /* A[2] * B[12] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100252,7 +102610,7 @@ /* A[1] * B[13] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100290,7 +102648,7 @@ /* A[0] * B[14] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100328,7 +102686,7 @@ "str r5, [sp, #56]\n\t" /* A[0] * B[15] */ "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100368,7 +102726,7 @@ /* A[1] * B[14] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100406,7 +102764,7 @@ /* A[2] * B[13] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100444,7 +102802,7 @@ /* A[3] * B[12] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100482,7 +102840,7 @@ /* A[4] * B[11] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100520,7 +102878,7 @@ /* A[5] * B[10] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100558,7 +102916,7 @@ /* A[6] * B[9] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100595,7 +102953,7 @@ #endif /* A[7] * B[8] */ "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100632,7 +102990,7 @@ #endif /* A[8] * B[7] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100670,7 +103028,7 @@ /* A[9] * B[6] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100708,7 +103066,7 @@ /* A[10] * B[5] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100746,7 +103104,7 @@ /* A[11] * B[4] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100784,7 +103142,7 @@ /* A[12] * B[3] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100822,7 +103180,7 @@ /* A[13] * B[2] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100860,7 +103218,7 @@ /* A[14] * B[1] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100898,7 +103256,7 @@ /* A[15] * B[0] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100936,7 +103294,7 @@ "str r3, [sp, #60]\n\t" /* A[16] * B[0] */ "ldr r8, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -100976,7 +103334,7 @@ /* A[15] * B[1] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101014,7 +103372,7 @@ /* A[14] * B[2] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101052,7 +103410,7 @@ /* A[13] * B[3] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101090,7 +103448,7 @@ /* A[12] * B[4] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101128,7 +103486,7 @@ /* A[11] * B[5] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101166,7 +103524,7 @@ /* A[10] * B[6] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101203,7 +103561,7 @@ #endif /* A[9] * B[7] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101241,7 +103599,7 @@ /* A[8] * B[8] */ "ldr r11, [%[a], #32]\n\t" "ldr r12, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101279,7 +103637,7 @@ /* A[7] * B[9] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101317,7 +103675,7 @@ /* A[6] * B[10] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101355,7 +103713,7 @@ /* A[5] * B[11] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101393,7 +103751,7 @@ /* A[4] * B[12] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101431,7 +103789,7 @@ /* A[3] * B[13] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101469,7 +103827,7 @@ /* A[2] * B[14] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101507,7 +103865,7 @@ /* A[1] * B[15] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101545,7 +103903,7 @@ /* A[0] * B[16] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101583,7 +103941,7 @@ "str r4, [sp, #64]\n\t" /* A[1] * B[16] */ "ldr r8, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101623,7 +103981,7 @@ /* A[2] * B[15] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101661,7 +104019,7 @@ /* A[3] * B[14] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101699,7 +104057,7 @@ /* A[4] * B[13] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101737,7 +104095,7 @@ /* A[5] * B[12] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101775,7 +104133,7 @@ /* A[6] * B[11] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101813,7 +104171,7 @@ /* A[7] * B[10] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101850,7 +104208,7 @@ #endif /* A[8] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101887,7 +104245,7 @@ #endif /* A[9] * B[8] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101925,7 +104283,7 @@ /* A[10] * B[7] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -101963,7 +104321,7 @@ /* A[11] * B[6] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102001,7 +104359,7 @@ /* A[12] * B[5] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102039,7 +104397,7 @@ /* A[13] * B[4] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102077,7 +104435,7 @@ /* A[14] * B[3] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102115,7 +104473,7 @@ /* A[15] * B[2] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102153,7 +104511,7 @@ /* A[16] * B[1] */ "ldr r8, [%[a], #64]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102191,7 +104549,7 @@ "str r5, [%[r], #68]\n\t" /* A[16] * B[2] */ "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102231,7 +104589,7 @@ /* A[15] * B[3] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102269,7 +104627,7 @@ /* A[14] * B[4] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102307,7 +104665,7 @@ /* A[13] * B[5] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102345,7 +104703,7 @@ /* A[12] * B[6] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102383,7 +104741,7 @@ /* A[11] * B[7] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102420,7 +104778,7 @@ #endif /* A[10] * B[8] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102458,7 +104816,7 @@ /* A[9] * B[9] */ "ldr r11, [%[a], #36]\n\t" "ldr r12, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102496,7 +104854,7 @@ /* A[8] * B[10] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102534,7 +104892,7 @@ /* A[7] * B[11] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102572,7 +104930,7 @@ /* A[6] * B[12] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102610,7 +104968,7 @@ /* A[5] * B[13] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102648,7 +105006,7 @@ /* A[4] * B[14] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102686,7 +105044,7 @@ /* A[3] * B[15] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102724,7 +105082,7 @@ /* A[2] * B[16] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102762,7 +105120,7 @@ "str r3, [%[r], #72]\n\t" /* A[3] * B[16] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102802,7 +105160,7 @@ /* A[4] * B[15] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102840,7 +105198,7 @@ /* A[5] * B[14] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102878,7 +105236,7 @@ /* A[6] * B[13] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102916,7 +105274,7 @@ /* A[7] * B[12] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102954,7 +105312,7 @@ /* A[8] * B[11] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -102991,7 +105349,7 @@ #endif /* A[9] * B[10] */ "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103028,7 +105386,7 @@ #endif /* A[10] * B[9] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103066,7 +105424,7 @@ /* A[11] * B[8] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103104,7 +105462,7 @@ /* A[12] * B[7] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103142,7 +105500,7 @@ /* A[13] * B[6] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103180,7 +105538,7 @@ /* A[14] * B[5] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103218,7 +105576,7 @@ /* A[15] * B[4] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103256,7 +105614,7 @@ /* A[16] * B[3] */ "ldr r8, [%[a], #64]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103294,7 +105652,7 @@ "str r4, [%[r], #76]\n\t" /* A[16] * B[4] */ "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103334,7 +105692,7 @@ /* A[15] * B[5] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103372,7 +105730,7 @@ /* A[14] * B[6] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103410,7 +105768,7 @@ /* A[13] * B[7] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103448,7 +105806,7 @@ /* A[12] * B[8] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103485,7 +105843,7 @@ #endif /* A[11] * B[9] */ "ldr r8, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103523,7 +105881,7 @@ /* A[10] * B[10] */ "ldr r11, [%[a], #40]\n\t" "ldr r12, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103561,7 +105919,7 @@ /* A[9] * B[11] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103599,7 +105957,7 @@ /* A[8] * B[12] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103637,7 +105995,7 @@ /* A[7] * B[13] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103675,7 +106033,7 @@ /* A[6] * B[14] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103713,7 +106071,7 @@ /* A[5] * B[15] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103751,7 +106109,7 @@ /* A[4] * B[16] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103789,7 +106147,7 @@ "str r5, [%[r], #80]\n\t" /* A[5] * B[16] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103829,7 +106187,7 @@ /* A[6] * B[15] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103867,7 +106225,7 @@ /* A[7] * B[14] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103905,7 +106263,7 @@ /* A[8] * B[13] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103943,7 +106301,7 @@ /* A[9] * B[12] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -103980,7 +106338,7 @@ #endif /* A[10] * B[11] */ "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104017,7 +106375,7 @@ #endif /* A[11] * B[10] */ "ldr r8, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104055,7 +106413,7 @@ /* A[12] * B[9] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104093,7 +106451,7 @@ /* A[13] * B[8] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104131,7 +106489,7 @@ /* A[14] * B[7] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104169,7 +106527,7 @@ /* A[15] * B[6] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104207,7 +106565,7 @@ /* A[16] * B[5] */ "ldr r8, [%[a], #64]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104245,7 +106603,7 @@ "str r3, [%[r], #84]\n\t" /* A[16] * B[6] */ "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104285,7 +106643,7 @@ /* A[15] * B[7] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104323,7 +106681,7 @@ /* A[14] * B[8] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104361,7 +106719,7 @@ /* A[13] * B[9] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104398,7 +106756,7 @@ #endif /* A[12] * B[10] */ "ldr r8, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104436,7 +106794,7 @@ /* A[11] * B[11] */ "ldr r11, [%[a], #44]\n\t" "ldr r12, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104474,7 +106832,7 @@ /* A[10] * B[12] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104512,7 +106870,7 @@ /* A[9] * B[13] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104550,7 +106908,7 @@ /* A[8] * B[14] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104588,7 +106946,7 @@ /* A[7] * B[15] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104626,7 +106984,7 @@ /* A[6] * B[16] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104664,7 +107022,7 @@ "str r4, [%[r], #88]\n\t" /* A[7] * B[16] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104704,7 +107062,7 @@ /* A[8] * B[15] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104742,7 +107100,7 @@ /* A[9] * B[14] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104780,7 +107138,7 @@ /* A[10] * B[13] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104817,7 +107175,7 @@ #endif /* A[11] * B[12] */ "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104854,7 +107212,7 @@ #endif /* A[12] * B[11] */ "ldr r8, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104892,7 +107250,7 @@ /* A[13] * B[10] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104930,7 +107288,7 @@ /* A[14] * B[9] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -104968,7 +107326,7 @@ /* A[15] * B[8] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105006,7 +107364,7 @@ /* A[16] * B[7] */ "ldr r8, [%[a], #64]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105044,7 +107402,7 @@ "str r5, [%[r], #92]\n\t" /* A[16] * B[8] */ "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105084,7 +107442,7 @@ /* A[15] * B[9] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105122,7 +107480,7 @@ /* A[14] * B[10] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105159,7 +107517,7 @@ #endif /* A[13] * B[11] */ "ldr r8, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105197,7 +107555,7 @@ /* A[12] * B[12] */ "ldr r11, [%[a], #48]\n\t" "ldr r12, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105235,7 +107593,7 @@ /* A[11] * B[13] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105273,7 +107631,7 @@ /* A[10] * B[14] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105311,7 +107669,7 @@ /* A[9] * B[15] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105349,7 +107707,7 @@ /* A[8] * B[16] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105387,7 +107745,7 @@ "str r3, [%[r], #96]\n\t" /* A[9] * B[16] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105427,7 +107785,7 @@ /* A[10] * B[15] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105465,7 +107823,7 @@ /* A[11] * B[14] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105502,7 +107860,7 @@ #endif /* A[12] * B[13] */ "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105539,7 +107897,7 @@ #endif /* A[13] * B[12] */ "ldr r8, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105577,7 +107935,7 @@ /* A[14] * B[11] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105615,7 +107973,7 @@ /* A[15] * B[10] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105653,7 +108011,7 @@ /* A[16] * B[9] */ "ldr r8, [%[a], #64]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105691,7 +108049,7 @@ "str r4, [%[r], #100]\n\t" /* A[16] * B[10] */ "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105731,7 +108089,7 @@ /* A[15] * B[11] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105768,7 +108126,7 @@ #endif /* A[14] * B[12] */ "ldr r8, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105806,7 +108164,7 @@ /* A[13] * B[13] */ "ldr r11, [%[a], #52]\n\t" "ldr r12, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105844,7 +108202,7 @@ /* A[12] * B[14] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105882,7 +108240,7 @@ /* A[11] * B[15] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105920,7 +108278,7 @@ /* A[10] * B[16] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105958,7 +108316,7 @@ "str r5, [%[r], #104]\n\t" /* A[11] * B[16] */ "ldr r8, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -105998,7 +108356,7 @@ /* A[12] * B[15] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106035,7 +108393,7 @@ #endif /* A[13] * B[14] */ "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106072,7 +108430,7 @@ #endif /* A[14] * B[13] */ "ldr r8, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106110,7 +108468,7 @@ /* A[15] * B[12] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106148,7 +108506,7 @@ /* A[16] * B[11] */ "ldr r8, [%[a], #64]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106186,7 +108544,7 @@ "str r3, [%[r], #108]\n\t" /* A[16] * B[12] */ "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106225,7 +108583,7 @@ #endif /* A[15] * B[13] */ "ldr r8, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106263,7 +108621,7 @@ /* A[14] * B[14] */ "ldr r11, [%[a], #56]\n\t" "ldr r12, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106301,7 +108659,7 @@ /* A[13] * B[15] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106339,7 +108697,7 @@ /* A[12] * B[16] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106377,7 +108735,7 @@ "str r4, [%[r], #112]\n\t" /* A[13] * B[16] */ "ldr r8, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106416,7 +108774,7 @@ #endif /* A[14] * B[15] */ "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106453,7 +108811,7 @@ #endif /* A[15] * B[14] */ "ldr r8, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106491,7 +108849,7 @@ /* A[16] * B[13] */ "ldr r8, [%[a], #64]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106528,7 +108886,7 @@ #endif "str r5, [%[r], #116]\n\t" /* A[16] * B[14] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106568,7 +108926,7 @@ /* A[15] * B[15] */ "ldr r11, [%[a], #60]\n\t" "ldr r12, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106606,7 +108964,7 @@ /* A[14] * B[16] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106643,7 +109001,7 @@ #endif "str r3, [%[r], #120]\n\t" /* A[15] * B[16] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106682,7 +109040,7 @@ #endif /* A[16] * B[15] */ "ldr r8, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106719,7 +109077,7 @@ #endif "str r4, [%[r], #124]\n\t" /* A[16] * B[16] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -106745,9 +109103,7 @@ "adds r5, r5, r6\n\t" "adc r3, r3, r7\n\t" #else - "umull r6, r7, r8, r9\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r7\n\t" + "umlal r5, r3, r8, r9\n\t" #endif "str r5, [%[r], #128]\n\t" "str r3, [%[r], #132]\n\t" @@ -106763,7 +109119,7 @@ "stm %[r]!, {r3}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); } @@ -106776,29 +109132,28 @@ */ static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x88\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_521_sqr_17_outer_%=: \n\t" "subs r3, r5, #0x40\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_521_sqr_17_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_521_sqr_17_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -106847,11 +109202,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_521_sqr_17_op_done_%=\n\t" - "\n" - "L_sp_521_sqr_17_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_521_sqr_17_inner_done_%=\n\t" + "blt L_sp_521_sqr_17_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -106878,37 +109235,53 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_521_sqr_17_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #0x44\n\t" - "beq L_sp_521_sqr_17_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_521_sqr_17_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_521_sqr_17_inner_%=\n\t" - "\n" "L_sp_521_sqr_17_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0x80\n\t" + "cmp r5, #0x7c\n\t" "ble L_sp_521_sqr_17_outer_%=\n\t" + "ldr lr, [%[a], #64]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "ldm sp!, {r6, r7}\n\t" "stm %[r]!, {r6, r7}\n\t" "sub r5, r5, #8\n\t" "\n" "L_sp_521_sqr_17_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_521_sqr_17_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -106920,14 +109293,14 @@ */ static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x44\n\t" /* A[0] * A[0] */ "ldr r10, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsr r9, r10, #16\n\t" "lsl r2, r10, #16\n\t" "lsr r2, r2, #16\n\t" @@ -106946,7 +109319,7 @@ /* A[0] * A[1] */ "ldr r10, [%[a], #4]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107002,7 +109375,7 @@ /* A[0] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107056,7 +109429,7 @@ #endif /* A[1] * A[1] */ "ldr r10, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107086,7 +109459,7 @@ /* A[0] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107141,7 +109514,7 @@ /* A[1] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107194,7 +109567,7 @@ /* A[0] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107249,7 +109622,7 @@ /* A[1] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107300,7 +109673,7 @@ #endif /* A[2] * A[2] */ "ldr r10, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107330,7 +109703,7 @@ /* A[0] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107360,7 +109733,7 @@ /* A[1] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107398,7 +109771,7 @@ /* A[2] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107443,7 +109816,7 @@ /* A[0] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107473,7 +109846,7 @@ /* A[1] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107511,7 +109884,7 @@ /* A[2] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107548,7 +109921,7 @@ #endif /* A[3] * A[3] */ "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107587,7 +109960,7 @@ /* A[0] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107617,7 +109990,7 @@ /* A[1] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107655,7 +110028,7 @@ /* A[2] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107693,7 +110066,7 @@ /* A[3] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107738,7 +110111,7 @@ /* A[0] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107768,7 +110141,7 @@ /* A[1] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107806,7 +110179,7 @@ /* A[2] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107844,7 +110217,7 @@ /* A[3] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107881,7 +110254,7 @@ #endif /* A[4] * A[4] */ "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107920,7 +110293,7 @@ /* A[0] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107950,7 +110323,7 @@ /* A[1] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -107988,7 +110361,7 @@ /* A[2] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108026,7 +110399,7 @@ /* A[3] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108064,7 +110437,7 @@ /* A[4] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108109,7 +110482,7 @@ /* A[0] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108139,7 +110512,7 @@ /* A[1] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108177,7 +110550,7 @@ /* A[2] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108215,7 +110588,7 @@ /* A[3] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108253,7 +110626,7 @@ /* A[4] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108290,7 +110663,7 @@ #endif /* A[5] * A[5] */ "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108329,7 +110702,7 @@ /* A[0] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108359,7 +110732,7 @@ /* A[1] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108397,7 +110770,7 @@ /* A[2] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108435,7 +110808,7 @@ /* A[3] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108473,7 +110846,7 @@ /* A[4] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108511,7 +110884,7 @@ /* A[5] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108556,7 +110929,7 @@ /* A[0] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108586,7 +110959,7 @@ /* A[1] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108624,7 +110997,7 @@ /* A[2] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108662,7 +111035,7 @@ /* A[3] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108700,7 +111073,7 @@ /* A[4] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108738,7 +111111,7 @@ /* A[5] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108775,7 +111148,7 @@ #endif /* A[6] * A[6] */ "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108814,7 +111187,7 @@ /* A[0] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108844,7 +111217,7 @@ /* A[1] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108882,7 +111255,7 @@ /* A[2] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108920,7 +111293,7 @@ /* A[3] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108958,7 +111331,7 @@ /* A[4] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -108996,7 +111369,7 @@ /* A[5] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109034,7 +111407,7 @@ /* A[6] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109079,7 +111452,7 @@ /* A[0] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109109,7 +111482,7 @@ /* A[1] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109147,7 +111520,7 @@ /* A[2] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109185,7 +111558,7 @@ /* A[3] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109223,7 +111596,7 @@ /* A[4] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109261,7 +111634,7 @@ /* A[5] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109299,7 +111672,7 @@ /* A[6] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109336,7 +111709,7 @@ #endif /* A[7] * A[7] */ "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109375,7 +111748,7 @@ /* A[0] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109405,7 +111778,7 @@ /* A[1] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109443,7 +111816,7 @@ /* A[2] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109481,7 +111854,7 @@ /* A[3] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109519,7 +111892,7 @@ /* A[4] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109557,7 +111930,7 @@ /* A[5] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109595,7 +111968,7 @@ /* A[6] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109633,7 +112006,7 @@ /* A[7] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109678,7 +112051,7 @@ /* A[0] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109708,7 +112081,7 @@ /* A[1] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109746,7 +112119,7 @@ /* A[2] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109784,7 +112157,7 @@ /* A[3] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109822,7 +112195,7 @@ /* A[4] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109860,7 +112233,7 @@ /* A[5] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109898,7 +112271,7 @@ /* A[6] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109936,7 +112309,7 @@ /* A[7] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -109973,7 +112346,7 @@ #endif /* A[8] * A[8] */ "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110012,7 +112385,7 @@ /* A[1] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110042,7 +112415,7 @@ /* A[2] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110080,7 +112453,7 @@ /* A[3] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110118,7 +112491,7 @@ /* A[4] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110156,7 +112529,7 @@ /* A[5] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110194,7 +112567,7 @@ /* A[6] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110232,7 +112605,7 @@ /* A[7] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110270,7 +112643,7 @@ /* A[8] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110315,7 +112688,7 @@ /* A[2] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110345,7 +112718,7 @@ /* A[3] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110383,7 +112756,7 @@ /* A[4] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110421,7 +112794,7 @@ /* A[5] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110459,7 +112832,7 @@ /* A[6] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110497,7 +112870,7 @@ /* A[7] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110535,7 +112908,7 @@ /* A[8] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110572,7 +112945,7 @@ #endif /* A[9] * A[9] */ "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110611,7 +112984,7 @@ /* A[3] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110641,7 +113014,7 @@ /* A[4] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110679,7 +113052,7 @@ /* A[5] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110717,7 +113090,7 @@ /* A[6] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110755,7 +113128,7 @@ /* A[7] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110793,7 +113166,7 @@ /* A[8] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110831,7 +113204,7 @@ /* A[9] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110876,7 +113249,7 @@ /* A[4] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110906,7 +113279,7 @@ /* A[5] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110944,7 +113317,7 @@ /* A[6] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -110982,7 +113355,7 @@ /* A[7] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111020,7 +113393,7 @@ /* A[8] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111058,7 +113431,7 @@ /* A[9] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111095,7 +113468,7 @@ #endif /* A[10] * A[10] */ "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111134,7 +113507,7 @@ /* A[5] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111164,7 +113537,7 @@ /* A[6] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111202,7 +113575,7 @@ /* A[7] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111240,7 +113613,7 @@ /* A[8] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111278,7 +113651,7 @@ /* A[9] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111316,7 +113689,7 @@ /* A[10] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111361,7 +113734,7 @@ /* A[6] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111391,7 +113764,7 @@ /* A[7] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111429,7 +113802,7 @@ /* A[8] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111467,7 +113840,7 @@ /* A[9] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111505,7 +113878,7 @@ /* A[10] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111542,7 +113915,7 @@ #endif /* A[11] * A[11] */ "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111581,7 +113954,7 @@ /* A[7] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111611,7 +113984,7 @@ /* A[8] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111649,7 +114022,7 @@ /* A[9] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111687,7 +114060,7 @@ /* A[10] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111725,7 +114098,7 @@ /* A[11] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111770,7 +114143,7 @@ /* A[8] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111800,7 +114173,7 @@ /* A[9] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111838,7 +114211,7 @@ /* A[10] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111876,7 +114249,7 @@ /* A[11] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111913,7 +114286,7 @@ #endif /* A[12] * A[12] */ "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111952,7 +114325,7 @@ /* A[9] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -111982,7 +114355,7 @@ /* A[10] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112020,7 +114393,7 @@ /* A[11] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112058,7 +114431,7 @@ /* A[12] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112103,7 +114476,7 @@ /* A[10] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112133,7 +114506,7 @@ /* A[11] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112171,7 +114544,7 @@ /* A[12] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112208,7 +114581,7 @@ #endif /* A[13] * A[13] */ "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112247,7 +114620,7 @@ /* A[11] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112277,7 +114650,7 @@ /* A[12] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112315,7 +114688,7 @@ /* A[13] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112360,7 +114733,7 @@ /* A[12] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112415,7 +114788,7 @@ /* A[13] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112466,7 +114839,7 @@ #endif /* A[14] * A[14] */ "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112496,7 +114869,7 @@ /* A[13] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112551,7 +114924,7 @@ /* A[14] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112604,7 +114977,7 @@ /* A[14] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112658,7 +115031,7 @@ #endif /* A[15] * A[15] */ "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112688,7 +115061,7 @@ /* A[15] * A[16] */ "ldr r10, [%[a], #64]\n\t" "ldr r12, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112743,7 +115116,7 @@ "str r3, [%[r], #124]\n\t" /* A[16] * A[16] */ "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -112780,7 +115153,7 @@ "stm %[r]!, {r2}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); } @@ -112794,9 +115167,9 @@ */ static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -112824,7 +115197,7 @@ "adc %[r], r4, #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -112838,12 +115211,11 @@ */ static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -112876,107 +115248,11 @@ "ldm %[b]!, {r7}\n\t" "adcs r3, r3, r7\n\t" "stm %[r]!, {r3}\n\t" - "adc %[r], r12, r12\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "add lr, %[a], #0x40\n\t" - "\n" - "L_sp_521_sub_17_word_%=: \n\t" - "rsbs r12, r12, #0\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "sbc r12, r3, r3\n\t" - "cmp %[a], lr\n\t" - "bne L_sp_521_sub_17_word_%=\n\t" - "rsbs r12, r12, #0\n\t" - "ldm %[a]!, {r3}\n\t" - "ldm %[b]!, {r7}\n\t" - "sbcs r3, r3, r7\n\t" - "stm %[r]!, {r3}\n\t" - "sbc %[r], r6, r6\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "subs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3}\n\t" - "ldm %[b]!, {r7}\n\t" - "sbcs r3, r3, r7\n\t" - "stm %[r]!, {r3}\n\t" - "sbc %[r], r6, r6\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -113010,14 +115286,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -113206,10 +115482,10 @@ */ static sp_digit sp_521_cond_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -113230,7 +115506,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -113246,10 +115522,10 @@ */ static sp_digit sp_521_cond_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -113317,7 +115593,7 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -113331,7 +115607,7 @@ */ static SP_NOINLINE void sp_521_mont_reduce_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x44\n\t" @@ -113402,7 +115678,7 @@ /* 12-16 */ "ldm %[a], {r1, r2, r3, r4, r5}\n\t" "ldm sp!, {r7, r8, r9, r10, r11}\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov lr, #0x1\n\t" "lsl lr, lr, #8\n\t" "add lr, lr, #0xff\n\t" @@ -113445,12 +115721,13 @@ "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); (void)m_p; (void)mp_p; } +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 521 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -113459,12 +115736,12 @@ */ static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -113478,7 +115755,7 @@ "mul r8, %[mp], r12\n\t" "cmp r9, #0x40\n\t" "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r7, #0x1\n\t" "lsl r7, r7, #8\n\t" "add r7, r7, #0xff\n\t" @@ -113489,10 +115766,9 @@ "\n" "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -113516,15 +115792,9 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "str r12, [%[a]]\n\t" /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -113548,18 +115818,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -113583,17 +115847,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -113617,18 +115875,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -113652,18 +115904,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -113687,18 +115933,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -113722,18 +115962,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -113757,18 +115991,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -113792,18 +116020,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -113827,18 +116049,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -113862,18 +116078,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ "ldr r7, [%[m], #44]\n\t" "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -113897,18 +116107,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "adc r4, r4, #0\n\t" /* a[i+12] += m[12] * mu */ "ldr r7, [%[m], #48]\n\t" "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -113932,18 +116136,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #48]\n\t" "adc r5, r5, #0\n\t" /* a[i+13] += m[13] * mu */ "ldr r7, [%[m], #52]\n\t" "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -113967,18 +116165,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #52]\n\t" "adc r4, r4, #0\n\t" /* a[i+14] += m[14] * mu */ "ldr r7, [%[m], #56]\n\t" "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -114002,18 +116194,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #56]\n\t" "adc r5, r5, #0\n\t" /* a[i+15] += m[15] * mu */ "ldr r7, [%[m], #60]\n\t" "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -114037,22 +116223,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #60]\n\t" "adc r4, r4, #0\n\t" /* a[i+16] += m[16] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #64]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #64]\n\t" +#else + "ldr r7, [%[m], #64]\n\t" #endif "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -114083,13 +116263,264 @@ "adds r4, r4, r6\n\t" "adcs r5, r5, r7\n\t" "adc r3, r3, #0\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #64]\n\t" + "ldr r10, [%[a], #68]\n\t" + "adcs r10, r10, r5\n\t" + "str r10, [%[a], #68]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #0x44\n\t" + "blt L_sp_521_mont_reduce_order_17_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "sub %[a], %[a], #4\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #4]\n\t" + "ldr r4, [%[a], #8]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #8]\n\t" + "ldr r5, [%[a], #12]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #12]\n\t" + "ldr r4, [%[a], #16]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #16]\n\t" + "ldr r5, [%[a], #20]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #20]\n\t" + "ldr r4, [%[a], #24]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #24]\n\t" + "ldr r5, [%[a], #28]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #28]\n\t" + "ldr r4, [%[a], #32]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #32]\n\t" + "ldr r5, [%[a], #36]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #36]\n\t" + "ldr r4, [%[a], #40]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #40]\n\t" + "ldr r5, [%[a], #44]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #44]\n\t" + "ldr r4, [%[a], #48]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #48]\n\t" + "ldr r5, [%[a], #52]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #52]\n\t" + "ldr r4, [%[a], #56]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #56]\n\t" + "ldr r5, [%[a], #60]\n\t" + "lsr r4, r4, #9\n\t" + "orr r4, r4, r5, lsl #23\n\t" + "str r4, [%[a], #60]\n\t" + "ldr r4, [%[a], #64]\n\t" + "lsr r5, r5, #9\n\t" + "orr r5, r5, r4, lsl #23\n\t" + "str r5, [%[a], #64]\n\t" + "lsr r4, r4, #9\n\t" + "str r4, [%[a], #68]\n\t" + "lsr r3, r4, #9\n\t" + "add %[a], %[a], #4\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 521 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + "cmp r9, #0x40\n\t" + "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r7, #0x1\n\t" + "lsl r7, r7, #8\n\t" + "add r7, r7, #0xff\n\t" #else + "mov r7, #0x1ff\n\t" +#endif + "and r8, r8, r7\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + "str r12, [%[a]]\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r7, [%[m], #48]\n\t" + "ldr r10, [%[a], #48]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r7, [%[m], #52]\n\t" + "ldr r10, [%[a], #52]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #52]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r7, [%[m], #56]\n\t" + "ldr r10, [%[a], #56]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #56]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r7, [%[m], #60]\n\t" + "ldr r10, [%[a], #60]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #60]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r7, [%[m], #64]\n\t" + "ldr r10, [%[a], #64]\n\t" "umull r6, r7, r8, r7\n\t" "adds r4, r4, r6\n\t" "adcs r5, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #64]\n\t" "ldr r10, [%[a], #68]\n\t" @@ -114101,6 +116532,7 @@ "add %[a], %[a], #4\n\t" "cmp r9, #0x44\n\t" "blt L_sp_521_mont_reduce_order_17_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "sub %[a], %[a], #4\n\t" @@ -114176,11 +116608,225 @@ "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 521 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + "cmp r12, #0x40\n\t" + "bne L_sp_521_mont_reduce_order_17_nomask_%=\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) + "mov r10, #0x1\n\t" + "lsl r10, r10, #8\n\t" + "add r10, r10, #0xff\n\t" +#else + "mov r10, #0x1ff\n\t" +#endif + "and r11, r11, r10\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_nomask_%=: \n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + "str r4, [%[a]]\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r10, [%[m], #48]\n\t" + "ldr r9, [%[a], #48]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r10, [%[m], #52]\n\t" + "ldr r9, [%[a], #52]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r10, [%[m], #56]\n\t" + "ldr r9, [%[a], #56]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r10, [%[m], #60]\n\t" + "ldr r9, [%[a], #60]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r10, [%[m], #64]\n\t" + "ldr r9, [%[a], #64]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #68]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #64]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #68]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #0x44\n\t" + "blt L_sp_521_mont_reduce_order_17_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "sub %[a], %[a], #4\n\t" + "ldr r10, [%[a]]\n\t" + "ldr r3, [%[a], #4]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #4]\n\t" + "ldr r10, [%[a], #8]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #8]\n\t" + "ldr r3, [%[a], #12]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #12]\n\t" + "ldr r10, [%[a], #16]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #16]\n\t" + "ldr r3, [%[a], #20]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #20]\n\t" + "ldr r10, [%[a], #24]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #24]\n\t" + "ldr r3, [%[a], #28]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #28]\n\t" + "ldr r10, [%[a], #32]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #32]\n\t" + "ldr r3, [%[a], #36]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #36]\n\t" + "ldr r10, [%[a], #40]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #40]\n\t" + "ldr r3, [%[a], #44]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #44]\n\t" + "ldr r10, [%[a], #48]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #48]\n\t" + "ldr r3, [%[a], #52]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #52]\n\t" + "ldr r10, [%[a], #56]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #56]\n\t" + "ldr r3, [%[a], #60]\n\t" + "lsr r10, r10, #9\n\t" + "orr r10, r10, r3, lsl #23\n\t" + "str r10, [%[a], #60]\n\t" + "ldr r10, [%[a], #64]\n\t" + "lsr r3, r3, #9\n\t" + "orr r3, r3, r10, lsl #23\n\t" + "str r3, [%[a], #64]\n\t" + "lsr r10, r10, #9\n\t" + "str r10, [%[a], #68]\n\t" + "lsr lr, r10, #9\n\t" + "add %[a], %[a], #4\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -114188,7 +116834,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -114202,7 +116848,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -114218,10 +116864,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_17(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_17(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_17(r, a, m, mp); for (; n > 1; n--) { @@ -114329,8 +116975,8 @@ */ static sp_int32 sp_521_cmp_17(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -114548,7 +117194,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -114608,9 +117254,9 @@ */ static void sp_521_mont_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -114645,7 +117291,7 @@ "ldm %[a]!, {r8}\n\t" "ldm %[b]!, {r4}\n\t" "adcs r8, r8, r4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r12, #0x1\n\t" "lsl r12, r12, #8\n\t" "add r12, r12, #0xff\n\t" @@ -114681,7 +117327,7 @@ "stm %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); (void)m_p; } @@ -114694,8 +117340,8 @@ */ static void sp_521_mont_dbl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "mov r2, #0\n\t" @@ -114721,7 +117367,7 @@ "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" "ldm %[a]!, {r4}\n\t" "adcs r4, r4, r4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x1\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0xff\n\t" @@ -114757,7 +117403,7 @@ "stm %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc" ); (void)m_p; } @@ -114770,8 +117416,8 @@ */ static void sp_521_mont_tpl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "mov r2, #0\n\t" @@ -114831,7 +117477,7 @@ "ldm %[r], {r4}\n\t" "ldm %[a]!, {r8}\n\t" "adcs r4, r4, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r3, #0x1\n\t" "lsl r3, r3, #8\n\t" "add r3, r3, #0xff\n\t" @@ -114853,7 +117499,7 @@ "stm %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc" ); (void)m_p; } @@ -114867,9 +117513,9 @@ */ static void sp_521_mont_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -114904,7 +117550,7 @@ "ldm %[a]!, {r8}\n\t" "ldm %[b]!, {r4}\n\t" "sbcs r8, r8, r4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r12, #0x1\n\t" "lsl r12, r12, #8\n\t" "add r12, r12, #0xff\n\t" @@ -114941,16 +117587,15 @@ "stm %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); (void)m_p; } -#define sp_521_mont_sub_lower_17 sp_521_mont_sub_17 static void sp_521_rshift1_17(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3}\n\t" @@ -115021,7 +117666,7 @@ "str r3, [%[r], #64]\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4" + : "memory", "r2", "r3", "r4", "cc" ); } @@ -115031,7 +117676,7 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_521_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_521_mont_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o = a[0] & 1; @@ -115085,7 +117730,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_17(t2, t2, p521_mod); + sp_521_mont_div2_17(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -115095,7 +117740,7 @@ /* X = X - Y */ sp_521_mont_sub_17(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_17(y, y, x, p521_mod); + sp_521_mont_sub_17(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -115118,7 +117763,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data; @@ -115192,7 +117838,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_17(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_17(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -115217,7 +117863,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -115283,12 +117929,12 @@ static void sp_521_proj_point_add_17(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*17; - sp_digit* t3 = t + 4*17; - sp_digit* t4 = t + 6*17; - sp_digit* t5 = t + 8*17; - sp_digit* t6 = t + 10*17; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*17; + sp_digit* t2 = t + 4*17; + sp_digit* t3 = t + 6*17; + sp_digit* t4 = t + 8*17; + sp_digit* t5 = t + 10*17; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod); @@ -115310,17 +117956,9 @@ sp_521_proj_point_dbl_17(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_17(t2, t2, t1, p521_mod); @@ -115339,20 +117977,31 @@ sp_521_mont_dbl_17(t3, y, p521_mod); sp_521_mont_sub_17(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_17(y, y, x, p521_mod); + sp_521_mont_sub_17(y, y, x, p521_mod); sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_17(y, y, t5, p521_mod); - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -115398,12 +118047,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*17; - ctx->t3 = t + 4*17; - ctx->t4 = t + 6*17; - ctx->t5 = t + 8*17; - ctx->t6 = t + 10*17; + ctx->t6 = t; + ctx->t1 = t + 2*17; + ctx->t2 = t + 4*17; + ctx->t3 = t + 6*17; + ctx->t4 = t + 8*17; + ctx->t5 = t + 10*17; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -115510,7 +118159,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -115523,22 +118172,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -115558,7 +118213,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table, @@ -115868,8 +118523,6 @@ } #ifdef FP_ECC -#define sp_521_mont_dbl_lower_17 sp_521_mont_dbl_17 -#define sp_521_mont_tpl_lower_17 sp_521_mont_tpl_17 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -115908,7 +118561,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_17(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_17(a, t1, p521_mod); + sp_521_mont_tpl_17(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod); @@ -115917,8 +118570,8 @@ sp_521_mont_dbl_17(t2, b, p521_mod); sp_521_mont_sub_17(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_17(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_17(b, t2, p521_mod); + sp_521_mont_sub_17(t2, b, x, p521_mod); + sp_521_mont_dbl_17(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -115938,7 +118591,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_17(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_17(a, t1, p521_mod); + sp_521_mont_tpl_17(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod); @@ -115947,8 +118600,8 @@ sp_521_mont_dbl_17(t2, b, p521_mod); sp_521_mont_sub_17(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_17(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_17(b, t2, p521_mod); + sp_521_mont_sub_17(t2, b, x, p521_mod); + sp_521_mont_dbl_17(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -115958,7 +118611,7 @@ sp_521_mont_sub_17(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_17(y, y, p521_mod); + sp_521_mont_div2_17(y, y, p521_mod); } /* Convert the projective point to affine. @@ -116004,12 +118657,12 @@ static void sp_521_proj_point_add_qz1_17(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*17; - sp_digit* t3 = t + 4*17; - sp_digit* t4 = t + 6*17; - sp_digit* t5 = t + 8*17; - sp_digit* t6 = t + 10*17; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*17; + sp_digit* t6 = t + 4*17; + sp_digit* t1 = t + 6*17; + sp_digit* t4 = t + 8*17; + sp_digit* t5 = t + 10*17; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -116025,13 +118678,9 @@ sp_521_proj_point_dbl_17(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_17(t2, t2, p->x, p521_mod); @@ -116040,33 +118689,40 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_17(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_17(x, t1, t5, p521_mod); - sp_521_mont_dbl_17(t1, t3, p521_mod); - sp_521_mont_sub_17(x, x, t1, p521_mod); + sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_17(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_17(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_17(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_17(t2, t2, t1, p521_mod); + sp_521_mont_dbl_17(t5, t3, p521_mod); + sp_521_mont_sub_17(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_17(t3, t3, x, p521_mod); + sp_521_mont_sub_17(t3, t3, x, p521_mod); sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_17(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_17(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_17(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -116167,7 +118823,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_16_17(sp_point_521* r, @@ -116392,13 +119048,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -116469,8 +119127,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap); @@ -116491,10 +119149,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -116623,7 +119283,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_256_17(sp_point_521* r, @@ -116848,13 +119508,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -116925,8 +119587,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap); @@ -116947,10 +119609,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -117043,7 +119707,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -117054,7 +119718,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_521* point = NULL; + sp_point_521* point = NULL; sp_digit* k = NULL; #else sp_point_521 point[2]; @@ -119136,7 +121800,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -119158,7 +121822,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -119219,7 +121883,7 @@ */ static void sp_521_add_one_17(sp_digit* a_p) { - register sp_digit* a asm ("r0") = a_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; __asm__ __volatile__ ( "ldm %[a], {r1, r2, r3, r4}\n\t" @@ -119251,7 +121915,7 @@ "stm %[a]!, {r1}\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r4" + : "memory", "r1", "r2", "r3", "r4", "cc" ); } @@ -119347,7 +122011,7 @@ sp_point_521* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -119355,7 +122019,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -119625,13 +122289,13 @@ #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) static void sp_521_rshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register byte n asm ("r2") = n_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register byte n asm ("r2") = (byte)n_p; __asm__ __volatile__ ( "rsb r12, %[n], #32\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, [%[a]]\n\t" "ldr r5, [%[a], #4]\n\t" #else @@ -119716,7 +122380,7 @@ "lsl r3, r5, r12\n\t" "lsr r5, r5, %[n]\n\t" "orr r4, r4, r3\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "str r4, [%[r], #60]\n\t" "str r5, [%[r], #64]\n\t" #else @@ -119724,7 +122388,7 @@ #endif : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : "memory", "r4", "r5", "r6", "r3", "r12" + : "memory", "r4", "r5", "r6", "r3", "r12", "cc" ); } @@ -119734,9 +122398,9 @@ #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) static void sp_521_lshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register byte n asm ("r2") = n_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register byte n asm ("r2") = (byte)n_p; __asm__ __volatile__ ( "rsb r12, %[n], #31\n\t" @@ -119844,15 +122508,15 @@ "str r5, [%[r], #4]\n\t" : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : "memory", "r4", "r5", "r6", "r3", "r12" + : "memory", "r4", "r5", "r6", "r3", "r12", "cc" ); } static void sp_521_lshift_34(sp_digit* r_p, const sp_digit* a_p, byte n_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register byte n asm ("r2") = n_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register byte n asm ("r2") = (byte)n_p; __asm__ __volatile__ ( "rsb r12, %[n], #31\n\t" @@ -120062,7 +122726,7 @@ "str r6, [%[r], #4]\n\t" : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : "memory", "r4", "r5", "r6", "r3", "r12" + : "memory", "r4", "r5", "r6", "r3", "r12", "cc" ); } @@ -120074,16 +122738,15 @@ */ static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #0x40\n\t" "\n" "L_sp_521_sub_in_pkace_17_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -120091,18 +122754,18 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_521_sub_in_pkace_17_word_%=\n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2}\n\t" "ldm %[b]!, {r6}\n\t" "sbcs r2, r2, r6\n\t" "stm %[a]!, {r2}\n\t" - "sbc %[a], r10, r10\n\t" + "sbc %[a], %[a], %[a]\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -120115,8 +122778,8 @@ */ static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -120154,7 +122817,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -120169,15 +122832,14 @@ */ static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -120210,7 +122872,7 @@ "L_sp_521_mul_d_17_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -120255,7 +122917,7 @@ "str r3, [%[r], #68]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -120268,15 +122930,14 @@ */ static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -120301,611 +122962,491 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[12] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[13] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[14] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[15] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[16] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -120931,15 +123472,13 @@ "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r7\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" "str r5, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -120956,9 +123495,9 @@ */ static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -120998,7 +123537,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -121015,9 +123554,9 @@ */ static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -121047,7 +123586,7 @@ "bpl L_div_521_word_17_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -121075,7 +123614,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -121103,7 +123642,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -121136,7 +123675,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -121182,8 +123721,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[35]; sp_digit t2[18]; @@ -121229,7 +123768,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_521_mod_17(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_521_div_17(a, m, NULL, r); } @@ -121788,6 +124328,103 @@ #endif /* HAVE_ECC_SIGN */ #ifndef WOLFSSL_SP_SMALL +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "mov r12, #0\n\t" + "add lr, %[a], #0x40\n\t" + "\n" + "L_sp_521_sub_17_word_%=: \n\t" + "rsbs r12, r12, #0\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "sbc r12, r3, r3\n\t" + "cmp %[a], lr\n\t" + "bne L_sp_521_sub_17_word_%=\n\t" + "rsbs r12, r12, #0\n\t" + "ldm %[a]!, {r3}\n\t" + "ldm %[b]!, {r7}\n\t" + "sbcs r3, r3, r7\n\t" + "stm %[r]!, {r3}\n\t" + "sbc %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +{ + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + + __asm__ __volatile__ ( + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "subs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "ldm %[a]!, {r3, r4, r5, r6}\n\t" + "ldm %[b]!, {r7, r8, r9, r10}\n\t" + "sbcs r3, r3, r7\n\t" + "sbcs r4, r4, r8\n\t" + "sbcs r5, r5, r9\n\t" + "sbcs r6, r6, r10\n\t" + "stm %[r]!, {r3, r4, r5, r6}\n\t" + "ldm %[a]!, {r3}\n\t" + "ldm %[b]!, {r7}\n\t" + "sbcs r3, r3, r7\n\t" + "stm %[r]!, {r3}\n\t" + "sbc %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ /* Divide the number by 2 mod the modulus. (r = a / 2 % m) * * r Result of division by 2. @@ -121796,12 +124433,12 @@ */ static void sp_521_div2_mod_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; __asm__ __volatile__ ( - "ldr r4, [%[a]], #4\n\t" + "ldm %[a]!, {r4}\n\t" "ands r3, r4, #1\n\t" "beq L_sp_521_div2_mod_17_even_%=\n\t" "mov r12, #0\n\t" @@ -121853,8 +124490,8 @@ "stm %[r]!, {r4}\n\t" "\n" "L_sp_521_div2_mod_17_div2_%=: \n\t" - "sub %[r], #0x44\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) + "sub %[r], %[r], #0x44\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r8, [%[r]]\n\t" "ldr r9, [%[r], #4]\n\t" #else @@ -121928,49 +124565,50 @@ "str r9, [%[r], #64]\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); } -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) static const unsigned char L_sp_521_num_bits_17_table[] = { - 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x00, 0x01, 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, }; static int sp_521_num_bits_17(const sp_digit* a_p) { - register const sp_digit* a asm ("r0") = a_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register unsigned char* L_sp_521_num_bits_17_table_c asm ("r1") = (unsigned char*)&L_sp_521_num_bits_17_table; __asm__ __volatile__ ( "mov lr, %[L_sp_521_num_bits_17_table]\n\t" @@ -121980,7 +124618,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_16_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x2\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x18\n\t" @@ -121996,7 +124634,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_16_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x2\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x10\n\t" @@ -122012,7 +124650,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_16_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x2\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x8\n\t" @@ -122025,7 +124663,7 @@ "\n" "L_sp_521_num_bits_17_16_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x2\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x0\n\t" @@ -122043,7 +124681,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_15_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xf8\n\t" @@ -122059,7 +124697,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_15_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xf0\n\t" @@ -122075,7 +124713,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_15_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xe8\n\t" @@ -122088,7 +124726,7 @@ "\n" "L_sp_521_num_bits_17_15_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xe0\n\t" @@ -122106,7 +124744,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_14_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xd8\n\t" @@ -122122,7 +124760,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_14_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xd0\n\t" @@ -122138,7 +124776,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_14_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xc8\n\t" @@ -122151,7 +124789,7 @@ "\n" "L_sp_521_num_bits_17_14_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xc0\n\t" @@ -122169,7 +124807,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_13_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xb8\n\t" @@ -122185,7 +124823,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_13_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xb0\n\t" @@ -122201,7 +124839,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_13_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xa8\n\t" @@ -122214,7 +124852,7 @@ "\n" "L_sp_521_num_bits_17_13_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xa0\n\t" @@ -122232,7 +124870,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_12_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x98\n\t" @@ -122248,7 +124886,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_12_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x90\n\t" @@ -122264,7 +124902,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_12_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x88\n\t" @@ -122277,7 +124915,7 @@ "\n" "L_sp_521_num_bits_17_12_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x80\n\t" @@ -122295,7 +124933,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_11_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x78\n\t" @@ -122311,7 +124949,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_11_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x70\n\t" @@ -122327,7 +124965,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_11_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x68\n\t" @@ -122340,7 +124978,7 @@ "\n" "L_sp_521_num_bits_17_11_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x60\n\t" @@ -122358,7 +124996,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_10_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x58\n\t" @@ -122374,7 +125012,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_10_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x50\n\t" @@ -122390,7 +125028,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_10_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x48\n\t" @@ -122403,7 +125041,7 @@ "\n" "L_sp_521_num_bits_17_10_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x40\n\t" @@ -122421,7 +125059,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_9_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x38\n\t" @@ -122437,7 +125075,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_9_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x30\n\t" @@ -122453,7 +125091,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_9_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x28\n\t" @@ -122466,7 +125104,7 @@ "\n" "L_sp_521_num_bits_17_9_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x20\n\t" @@ -122484,7 +125122,7 @@ "lsr r3, r1, #24\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_8_3_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x18\n\t" @@ -122500,7 +125138,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_8_2_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x10\n\t" @@ -122516,7 +125154,7 @@ "and r3, r3, #0xff\n\t" "cmp r3, #0\n\t" "beq L_sp_521_num_bits_17_8_1_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x8\n\t" @@ -122529,7 +125167,7 @@ "\n" "L_sp_521_num_bits_17_8_1_%=: \n\t" "and r3, r1, #0xff\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x0\n\t" @@ -122849,9 +125487,9 @@ "\n" "L_sp_521_num_bits_17_18_%=: \n\t" "mov %[a], r12\n\t" - : [a] "+r" (a) - : [L_sp_521_num_bits_17_table] "r" (L_sp_521_num_bits_17_table) - : "memory", "r1", "r2", "r3", "r12", "lr" + : [a] "+r" (a), [L_sp_521_num_bits_17_table] "+r" (L_sp_521_num_bits_17_table_c) + : + : "memory", "r2", "r3", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -122859,13 +125497,13 @@ #else static int sp_521_num_bits_17(const sp_digit* a_p) { - register const sp_digit* a asm ("r0") = a_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; __asm__ __volatile__ ( "ldr r1, [%[a], #64]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_16_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x2\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x20\n\t" @@ -122880,7 +125518,7 @@ "ldr r1, [%[a], #60]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_15_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x2\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x0\n\t" @@ -122895,7 +125533,7 @@ "ldr r1, [%[a], #56]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_14_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xe0\n\t" @@ -122910,7 +125548,7 @@ "ldr r1, [%[a], #52]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_13_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xc0\n\t" @@ -122925,7 +125563,7 @@ "ldr r1, [%[a], #48]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_12_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0xa0\n\t" @@ -122940,7 +125578,7 @@ "ldr r1, [%[a], #44]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_11_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x80\n\t" @@ -122955,7 +125593,7 @@ "ldr r1, [%[a], #40]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_10_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x60\n\t" @@ -122970,7 +125608,7 @@ "ldr r1, [%[a], #36]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_9_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x40\n\t" @@ -122985,7 +125623,7 @@ "ldr r1, [%[a], #32]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_8_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x20\n\t" @@ -123000,7 +125638,7 @@ "ldr r1, [%[a], #28]\n\t" "cmp r1, #0\n\t" "beq L_sp_521_num_bits_17_7_%=\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "mov r2, #0x1\n\t" "lsl r2, r2, #8\n\t" "add r2, r2, #0x0\n\t" @@ -123075,12 +125713,12 @@ "mov %[a], r12\n\t" : [a] "+r" (a) : - : "memory", "r1", "r2", "r3", "r12", "lr" + : "memory", "r1", "r2", "r3", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } -#endif /* WOLFSSL_SP_ARM_ARCH && (WOLFSSL_SP_ARM_ARCH < 7) */ +#endif /* WOLFSSL_ARM_ARCH && (WOLFSSL_ARM_ARCH < 7) */ /* Non-constant time modular inversion. * * @param [out] r Resulting number. @@ -123124,7 +125762,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_521_cmp_17(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_521_cmp_17(u, v) >= 0))) { sp_521_sub_17(u, u, v); o = sp_521_sub_17(b, b, d); if (o != 0) @@ -123210,7 +125848,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -123541,7 +126179,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -123569,19 +126207,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 17; + /* y^2 - x^3 - a.x = b */ sp_521_sqr_17(t1, point->y); (void)sp_521_mod_17(t1, t1, p521_mod); sp_521_sqr_17(t2, point->x); (void)sp_521_mod_17(t2, t2, p521_mod); sp_521_mul_17(t2, t2, point->x); (void)sp_521_mod_17(t2, t2, p521_mod); - (void)sp_521_sub_17(t2, p521_mod, t2); - sp_521_mont_add_17(t1, t1, t2, p521_mod); + sp_521_mont_sub_17(t1, t1, t2, p521_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_521_mont_add_17(t1, t1, point->x, p521_mod); sp_521_mont_add_17(t1, t1, point->x, p521_mod); sp_521_mont_add_17(t1, t1, point->x, p521_mod); + if (sp_521_cmp_17(t1, p521_b) != 0) { err = MP_VAL; } @@ -123595,7 +126235,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -124102,17 +126742,16 @@ */ static void sp_1024_mul_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x40\n\t" - "mov r10, #0\n\t" /* A[0] * B[0] */ "ldr r11, [%[a]]\n\t" "ldr r12, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r3, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124142,7 +126781,7 @@ "str r3, [sp]\n\t" /* A[0] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124181,7 +126820,7 @@ #endif /* A[1] * B[0] */ "ldr r8, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124219,7 +126858,7 @@ "str r4, [sp, #4]\n\t" /* A[2] * B[0] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124259,7 +126898,7 @@ /* A[1] * B[1] */ "ldr r11, [%[a], #4]\n\t" "ldr r12, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124297,7 +126936,7 @@ /* A[0] * B[2] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124335,7 +126974,7 @@ "str r5, [sp, #8]\n\t" /* A[0] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124374,7 +127013,7 @@ #endif /* A[1] * B[2] */ "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124411,7 +127050,7 @@ #endif /* A[2] * B[1] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124449,7 +127088,7 @@ /* A[3] * B[0] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124487,7 +127126,7 @@ "str r3, [sp, #12]\n\t" /* A[4] * B[0] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124526,7 +127165,7 @@ #endif /* A[3] * B[1] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124564,7 +127203,7 @@ /* A[2] * B[2] */ "ldr r11, [%[a], #8]\n\t" "ldr r12, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124602,7 +127241,7 @@ /* A[1] * B[3] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124640,7 +127279,7 @@ /* A[0] * B[4] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124678,7 +127317,7 @@ "str r4, [sp, #16]\n\t" /* A[0] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124718,7 +127357,7 @@ /* A[1] * B[4] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124755,7 +127394,7 @@ #endif /* A[2] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124792,7 +127431,7 @@ #endif /* A[3] * B[2] */ "ldr r8, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124830,7 +127469,7 @@ /* A[4] * B[1] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124868,7 +127507,7 @@ /* A[5] * B[0] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124906,7 +127545,7 @@ "str r5, [sp, #20]\n\t" /* A[6] * B[0] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124946,7 +127585,7 @@ /* A[5] * B[1] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -124983,7 +127622,7 @@ #endif /* A[4] * B[2] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125021,7 +127660,7 @@ /* A[3] * B[3] */ "ldr r11, [%[a], #12]\n\t" "ldr r12, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125059,7 +127698,7 @@ /* A[2] * B[4] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125097,7 +127736,7 @@ /* A[1] * B[5] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125135,7 +127774,7 @@ /* A[0] * B[6] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125173,7 +127812,7 @@ "str r3, [sp, #24]\n\t" /* A[0] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125213,7 +127852,7 @@ /* A[1] * B[6] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125251,7 +127890,7 @@ /* A[2] * B[5] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125288,7 +127927,7 @@ #endif /* A[3] * B[4] */ "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125325,7 +127964,7 @@ #endif /* A[4] * B[3] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125363,7 +128002,7 @@ /* A[5] * B[2] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125401,7 +128040,7 @@ /* A[6] * B[1] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125439,7 +128078,7 @@ /* A[7] * B[0] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125477,7 +128116,7 @@ "str r4, [sp, #28]\n\t" /* A[8] * B[0] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125517,7 +128156,7 @@ /* A[7] * B[1] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125555,7 +128194,7 @@ /* A[6] * B[2] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125592,7 +128231,7 @@ #endif /* A[5] * B[3] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125630,7 +128269,7 @@ /* A[4] * B[4] */ "ldr r11, [%[a], #16]\n\t" "ldr r12, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125668,7 +128307,7 @@ /* A[3] * B[5] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125706,7 +128345,7 @@ /* A[2] * B[6] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125744,7 +128383,7 @@ /* A[1] * B[7] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125782,7 +128421,7 @@ /* A[0] * B[8] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125820,7 +128459,7 @@ "str r5, [sp, #32]\n\t" /* A[0] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125860,7 +128499,7 @@ /* A[1] * B[8] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125898,7 +128537,7 @@ /* A[2] * B[7] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125936,7 +128575,7 @@ /* A[3] * B[6] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -125973,7 +128612,7 @@ #endif /* A[4] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126010,7 +128649,7 @@ #endif /* A[5] * B[4] */ "ldr r8, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126048,7 +128687,7 @@ /* A[6] * B[3] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126086,7 +128725,7 @@ /* A[7] * B[2] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126124,7 +128763,7 @@ /* A[8] * B[1] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126162,7 +128801,7 @@ /* A[9] * B[0] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126200,7 +128839,7 @@ "str r3, [sp, #36]\n\t" /* A[10] * B[0] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126240,7 +128879,7 @@ /* A[9] * B[1] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126278,7 +128917,7 @@ /* A[8] * B[2] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126316,7 +128955,7 @@ /* A[7] * B[3] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126353,7 +128992,7 @@ #endif /* A[6] * B[4] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126391,7 +129030,7 @@ /* A[5] * B[5] */ "ldr r11, [%[a], #20]\n\t" "ldr r12, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126429,7 +129068,7 @@ /* A[4] * B[6] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126467,7 +129106,7 @@ /* A[3] * B[7] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126505,7 +129144,7 @@ /* A[2] * B[8] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126543,7 +129182,7 @@ /* A[1] * B[9] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126581,7 +129220,7 @@ /* A[0] * B[10] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126619,7 +129258,7 @@ "str r4, [sp, #40]\n\t" /* A[0] * B[11] */ "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126659,7 +129298,7 @@ /* A[1] * B[10] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126697,7 +129336,7 @@ /* A[2] * B[9] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126735,7 +129374,7 @@ /* A[3] * B[8] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126773,7 +129412,7 @@ /* A[4] * B[7] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126810,7 +129449,7 @@ #endif /* A[5] * B[6] */ "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126847,7 +129486,7 @@ #endif /* A[6] * B[5] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126885,7 +129524,7 @@ /* A[7] * B[4] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126923,7 +129562,7 @@ /* A[8] * B[3] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126961,7 +129600,7 @@ /* A[9] * B[2] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -126999,7 +129638,7 @@ /* A[10] * B[1] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127037,7 +129676,7 @@ /* A[11] * B[0] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127075,7 +129714,7 @@ "str r5, [sp, #44]\n\t" /* A[12] * B[0] */ "ldr r8, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127115,7 +129754,7 @@ /* A[11] * B[1] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127153,7 +129792,7 @@ /* A[10] * B[2] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127191,7 +129830,7 @@ /* A[9] * B[3] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127229,7 +129868,7 @@ /* A[8] * B[4] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127266,7 +129905,7 @@ #endif /* A[7] * B[5] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127304,7 +129943,7 @@ /* A[6] * B[6] */ "ldr r11, [%[a], #24]\n\t" "ldr r12, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127342,7 +129981,7 @@ /* A[5] * B[7] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127380,7 +130019,7 @@ /* A[4] * B[8] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127418,7 +130057,7 @@ /* A[3] * B[9] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127456,7 +130095,7 @@ /* A[2] * B[10] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127494,7 +130133,7 @@ /* A[1] * B[11] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127532,7 +130171,7 @@ /* A[0] * B[12] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127570,7 +130209,7 @@ "str r3, [sp, #48]\n\t" /* A[0] * B[13] */ "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127610,7 +130249,7 @@ /* A[1] * B[12] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127648,7 +130287,7 @@ /* A[2] * B[11] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127686,7 +130325,7 @@ /* A[3] * B[10] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127724,7 +130363,7 @@ /* A[4] * B[9] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127762,7 +130401,7 @@ /* A[5] * B[8] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127799,7 +130438,7 @@ #endif /* A[6] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127836,7 +130475,7 @@ #endif /* A[7] * B[6] */ "ldr r8, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127874,7 +130513,7 @@ /* A[8] * B[5] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127912,7 +130551,7 @@ /* A[9] * B[4] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127950,7 +130589,7 @@ /* A[10] * B[3] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -127988,7 +130627,7 @@ /* A[11] * B[2] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128026,7 +130665,7 @@ /* A[12] * B[1] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128064,7 +130703,7 @@ /* A[13] * B[0] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128102,7 +130741,7 @@ "str r4, [sp, #52]\n\t" /* A[14] * B[0] */ "ldr r8, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128142,7 +130781,7 @@ /* A[13] * B[1] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128180,7 +130819,7 @@ /* A[12] * B[2] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128218,7 +130857,7 @@ /* A[11] * B[3] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128256,7 +130895,7 @@ /* A[10] * B[4] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128294,7 +130933,7 @@ /* A[9] * B[5] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128331,7 +130970,7 @@ #endif /* A[8] * B[6] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128369,7 +131008,7 @@ /* A[7] * B[7] */ "ldr r11, [%[a], #28]\n\t" "ldr r12, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128407,7 +131046,7 @@ /* A[6] * B[8] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128445,7 +131084,7 @@ /* A[5] * B[9] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128483,7 +131122,7 @@ /* A[4] * B[10] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128521,7 +131160,7 @@ /* A[3] * B[11] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128559,7 +131198,7 @@ /* A[2] * B[12] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128597,7 +131236,7 @@ /* A[1] * B[13] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128635,7 +131274,7 @@ /* A[0] * B[14] */ "ldr r8, [%[a]]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128673,7 +131312,7 @@ "str r5, [sp, #56]\n\t" /* A[0] * B[15] */ "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128713,7 +131352,7 @@ /* A[1] * B[14] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128751,7 +131390,7 @@ /* A[2] * B[13] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128789,7 +131428,7 @@ /* A[3] * B[12] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128827,7 +131466,7 @@ /* A[4] * B[11] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128865,7 +131504,7 @@ /* A[5] * B[10] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128903,7 +131542,7 @@ /* A[6] * B[9] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128940,7 +131579,7 @@ #endif /* A[7] * B[8] */ "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -128977,7 +131616,7 @@ #endif /* A[8] * B[7] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129015,7 +131654,7 @@ /* A[9] * B[6] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129053,7 +131692,7 @@ /* A[10] * B[5] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129091,7 +131730,7 @@ /* A[11] * B[4] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129129,7 +131768,7 @@ /* A[12] * B[3] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129167,7 +131806,7 @@ /* A[13] * B[2] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129205,7 +131844,7 @@ /* A[14] * B[1] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129243,7 +131882,7 @@ /* A[15] * B[0] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129281,7 +131920,7 @@ "str r3, [sp, #60]\n\t" /* A[15] * B[1] */ "ldr r9, [%[b], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129321,7 +131960,7 @@ /* A[14] * B[2] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129359,7 +131998,7 @@ /* A[13] * B[3] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129397,7 +132036,7 @@ /* A[12] * B[4] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129435,7 +132074,7 @@ /* A[11] * B[5] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129473,7 +132112,7 @@ /* A[10] * B[6] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129510,7 +132149,7 @@ #endif /* A[9] * B[7] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129548,7 +132187,7 @@ /* A[8] * B[8] */ "ldr r11, [%[a], #32]\n\t" "ldr r12, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129586,7 +132225,7 @@ /* A[7] * B[9] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129624,7 +132263,7 @@ /* A[6] * B[10] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129662,7 +132301,7 @@ /* A[5] * B[11] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129700,7 +132339,7 @@ /* A[4] * B[12] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129738,7 +132377,7 @@ /* A[3] * B[13] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129776,7 +132415,7 @@ /* A[2] * B[14] */ "ldr r8, [%[a], #8]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129814,7 +132453,7 @@ /* A[1] * B[15] */ "ldr r8, [%[a], #4]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129852,7 +132491,7 @@ "str r4, [%[r], #64]\n\t" /* A[2] * B[15] */ "ldr r8, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129892,7 +132531,7 @@ /* A[3] * B[14] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129930,7 +132569,7 @@ /* A[4] * B[13] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -129968,7 +132607,7 @@ /* A[5] * B[12] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130006,7 +132645,7 @@ /* A[6] * B[11] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130044,7 +132683,7 @@ /* A[7] * B[10] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130081,7 +132720,7 @@ #endif /* A[8] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130118,7 +132757,7 @@ #endif /* A[9] * B[8] */ "ldr r8, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130156,7 +132795,7 @@ /* A[10] * B[7] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130194,7 +132833,7 @@ /* A[11] * B[6] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130232,7 +132871,7 @@ /* A[12] * B[5] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130270,7 +132909,7 @@ /* A[13] * B[4] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130308,7 +132947,7 @@ /* A[14] * B[3] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130346,7 +132985,7 @@ /* A[15] * B[2] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130384,7 +133023,7 @@ "str r5, [%[r], #68]\n\t" /* A[15] * B[3] */ "ldr r9, [%[b], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130424,7 +133063,7 @@ /* A[14] * B[4] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130462,7 +133101,7 @@ /* A[13] * B[5] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130500,7 +133139,7 @@ /* A[12] * B[6] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130538,7 +133177,7 @@ /* A[11] * B[7] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130575,7 +133214,7 @@ #endif /* A[10] * B[8] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130613,7 +133252,7 @@ /* A[9] * B[9] */ "ldr r11, [%[a], #36]\n\t" "ldr r12, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130651,7 +133290,7 @@ /* A[8] * B[10] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130689,7 +133328,7 @@ /* A[7] * B[11] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130727,7 +133366,7 @@ /* A[6] * B[12] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130765,7 +133404,7 @@ /* A[5] * B[13] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130803,7 +133442,7 @@ /* A[4] * B[14] */ "ldr r8, [%[a], #16]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130841,7 +133480,7 @@ /* A[3] * B[15] */ "ldr r8, [%[a], #12]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130879,7 +133518,7 @@ "str r3, [%[r], #72]\n\t" /* A[4] * B[15] */ "ldr r8, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130919,7 +133558,7 @@ /* A[5] * B[14] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130957,7 +133596,7 @@ /* A[6] * B[13] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -130995,7 +133634,7 @@ /* A[7] * B[12] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131033,7 +133672,7 @@ /* A[8] * B[11] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131070,7 +133709,7 @@ #endif /* A[9] * B[10] */ "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131107,7 +133746,7 @@ #endif /* A[10] * B[9] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131145,7 +133784,7 @@ /* A[11] * B[8] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131183,7 +133822,7 @@ /* A[12] * B[7] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131221,7 +133860,7 @@ /* A[13] * B[6] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131259,7 +133898,7 @@ /* A[14] * B[5] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131297,7 +133936,7 @@ /* A[15] * B[4] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131335,7 +133974,7 @@ "str r4, [%[r], #76]\n\t" /* A[15] * B[5] */ "ldr r9, [%[b], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131375,7 +134014,7 @@ /* A[14] * B[6] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131413,7 +134052,7 @@ /* A[13] * B[7] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131451,7 +134090,7 @@ /* A[12] * B[8] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131488,7 +134127,7 @@ #endif /* A[11] * B[9] */ "ldr r8, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131526,7 +134165,7 @@ /* A[10] * B[10] */ "ldr r11, [%[a], #40]\n\t" "ldr r12, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131564,7 +134203,7 @@ /* A[9] * B[11] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131602,7 +134241,7 @@ /* A[8] * B[12] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131640,7 +134279,7 @@ /* A[7] * B[13] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131678,7 +134317,7 @@ /* A[6] * B[14] */ "ldr r8, [%[a], #24]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131716,7 +134355,7 @@ /* A[5] * B[15] */ "ldr r8, [%[a], #20]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131754,7 +134393,7 @@ "str r5, [%[r], #80]\n\t" /* A[6] * B[15] */ "ldr r8, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131794,7 +134433,7 @@ /* A[7] * B[14] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131832,7 +134471,7 @@ /* A[8] * B[13] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131870,7 +134509,7 @@ /* A[9] * B[12] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131907,7 +134546,7 @@ #endif /* A[10] * B[11] */ "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131944,7 +134583,7 @@ #endif /* A[11] * B[10] */ "ldr r8, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -131982,7 +134621,7 @@ /* A[12] * B[9] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132020,7 +134659,7 @@ /* A[13] * B[8] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132058,7 +134697,7 @@ /* A[14] * B[7] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132096,7 +134735,7 @@ /* A[15] * B[6] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132134,7 +134773,7 @@ "str r3, [%[r], #84]\n\t" /* A[15] * B[7] */ "ldr r9, [%[b], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132174,7 +134813,7 @@ /* A[14] * B[8] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132212,7 +134851,7 @@ /* A[13] * B[9] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132249,7 +134888,7 @@ #endif /* A[12] * B[10] */ "ldr r8, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132287,7 +134926,7 @@ /* A[11] * B[11] */ "ldr r11, [%[a], #44]\n\t" "ldr r12, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132325,7 +134964,7 @@ /* A[10] * B[12] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132363,7 +135002,7 @@ /* A[9] * B[13] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132401,7 +135040,7 @@ /* A[8] * B[14] */ "ldr r8, [%[a], #32]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132439,7 +135078,7 @@ /* A[7] * B[15] */ "ldr r8, [%[a], #28]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132477,7 +135116,7 @@ "str r4, [%[r], #88]\n\t" /* A[8] * B[15] */ "ldr r8, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132517,7 +135156,7 @@ /* A[9] * B[14] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132555,7 +135194,7 @@ /* A[10] * B[13] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132592,7 +135231,7 @@ #endif /* A[11] * B[12] */ "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132629,7 +135268,7 @@ #endif /* A[12] * B[11] */ "ldr r8, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132667,7 +135306,7 @@ /* A[13] * B[10] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132705,7 +135344,7 @@ /* A[14] * B[9] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132743,7 +135382,7 @@ /* A[15] * B[8] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132781,7 +135420,7 @@ "str r5, [%[r], #92]\n\t" /* A[15] * B[9] */ "ldr r9, [%[b], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132821,7 +135460,7 @@ /* A[14] * B[10] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132858,7 +135497,7 @@ #endif /* A[13] * B[11] */ "ldr r8, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132896,7 +135535,7 @@ /* A[12] * B[12] */ "ldr r11, [%[a], #48]\n\t" "ldr r12, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132934,7 +135573,7 @@ /* A[11] * B[13] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -132972,7 +135611,7 @@ /* A[10] * B[14] */ "ldr r8, [%[a], #40]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133010,7 +135649,7 @@ /* A[9] * B[15] */ "ldr r8, [%[a], #36]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133048,7 +135687,7 @@ "str r3, [%[r], #96]\n\t" /* A[10] * B[15] */ "ldr r8, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133088,7 +135727,7 @@ /* A[11] * B[14] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133125,7 +135764,7 @@ #endif /* A[12] * B[13] */ "ldr r9, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133162,7 +135801,7 @@ #endif /* A[13] * B[12] */ "ldr r8, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133200,7 +135839,7 @@ /* A[14] * B[11] */ "ldr r8, [%[a], #56]\n\t" "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133238,7 +135877,7 @@ /* A[15] * B[10] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133276,7 +135915,7 @@ "str r4, [%[r], #100]\n\t" /* A[15] * B[11] */ "ldr r9, [%[b], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133315,7 +135954,7 @@ #endif /* A[14] * B[12] */ "ldr r8, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133353,7 +135992,7 @@ /* A[13] * B[13] */ "ldr r11, [%[a], #52]\n\t" "ldr r12, [%[b], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133391,7 +136030,7 @@ /* A[12] * B[14] */ "ldr r8, [%[a], #48]\n\t" "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133429,7 +136068,7 @@ /* A[11] * B[15] */ "ldr r8, [%[a], #44]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133467,7 +136106,7 @@ "str r5, [%[r], #104]\n\t" /* A[12] * B[15] */ "ldr r8, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133506,7 +136145,7 @@ #endif /* A[13] * B[14] */ "ldr r9, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133543,7 +136182,7 @@ #endif /* A[14] * B[13] */ "ldr r8, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133581,7 +136220,7 @@ /* A[15] * B[12] */ "ldr r8, [%[a], #60]\n\t" "ldr r9, [%[b], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133618,7 +136257,7 @@ #endif "str r3, [%[r], #108]\n\t" /* A[15] * B[13] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133658,7 +136297,7 @@ /* A[14] * B[14] */ "ldr r11, [%[a], #56]\n\t" "ldr r12, [%[b], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133696,7 +136335,7 @@ /* A[13] * B[15] */ "ldr r8, [%[a], #52]\n\t" "ldr r9, [%[b], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133733,7 +136372,7 @@ #endif "str r4, [%[r], #112]\n\t" /* A[14] * B[15] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r11, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133772,7 +136411,7 @@ #endif /* A[15] * B[14] */ "ldr r8, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r12, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133809,7 +136448,7 @@ #endif "str r5, [%[r], #116]\n\t" /* A[15] * B[15] */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r9, #16\n\t" "lsr r6, r6, #16\n\t" @@ -133835,9 +136474,7 @@ "adds r3, r3, r6\n\t" "adc r4, r4, r7\n\t" #else - "umull r6, r7, r8, r9\n\t" - "adds r3, r3, r6\n\t" - "adc r4, r4, r7\n\t" + "umlal r3, r4, r8, r9\n\t" #endif "str r3, [%[r], #120]\n\t" "str r4, [%[r], #124]\n\t" @@ -133851,7 +136488,7 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); } @@ -133862,14 +136499,14 @@ */ static void sp_1024_sqr_16(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x40\n\t" /* A[0] * A[0] */ "ldr r10, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsr r9, r10, #16\n\t" "lsl r2, r10, #16\n\t" "lsr r2, r2, #16\n\t" @@ -133888,7 +136525,7 @@ /* A[0] * A[1] */ "ldr r10, [%[a], #4]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -133944,7 +136581,7 @@ /* A[0] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -133998,7 +136635,7 @@ #endif /* A[1] * A[1] */ "ldr r10, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134028,7 +136665,7 @@ /* A[0] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134083,7 +136720,7 @@ /* A[1] * A[2] */ "ldr r10, [%[a], #8]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134136,7 +136773,7 @@ /* A[0] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134191,7 +136828,7 @@ /* A[1] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134242,7 +136879,7 @@ #endif /* A[2] * A[2] */ "ldr r10, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134272,7 +136909,7 @@ /* A[0] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134302,7 +136939,7 @@ /* A[1] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134340,7 +136977,7 @@ /* A[2] * A[3] */ "ldr r10, [%[a], #12]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134385,7 +137022,7 @@ /* A[0] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134415,7 +137052,7 @@ /* A[1] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134453,7 +137090,7 @@ /* A[2] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134490,7 +137127,7 @@ #endif /* A[3] * A[3] */ "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134529,7 +137166,7 @@ /* A[0] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134559,7 +137196,7 @@ /* A[1] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134597,7 +137234,7 @@ /* A[2] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134635,7 +137272,7 @@ /* A[3] * A[4] */ "ldr r10, [%[a], #16]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134680,7 +137317,7 @@ /* A[0] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134710,7 +137347,7 @@ /* A[1] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134748,7 +137385,7 @@ /* A[2] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134786,7 +137423,7 @@ /* A[3] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134823,7 +137460,7 @@ #endif /* A[4] * A[4] */ "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134862,7 +137499,7 @@ /* A[0] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134892,7 +137529,7 @@ /* A[1] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134930,7 +137567,7 @@ /* A[2] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -134968,7 +137605,7 @@ /* A[3] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135006,7 +137643,7 @@ /* A[4] * A[5] */ "ldr r10, [%[a], #20]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135051,7 +137688,7 @@ /* A[0] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135081,7 +137718,7 @@ /* A[1] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135119,7 +137756,7 @@ /* A[2] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135157,7 +137794,7 @@ /* A[3] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135195,7 +137832,7 @@ /* A[4] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135232,7 +137869,7 @@ #endif /* A[5] * A[5] */ "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135271,7 +137908,7 @@ /* A[0] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135301,7 +137938,7 @@ /* A[1] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135339,7 +137976,7 @@ /* A[2] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135377,7 +138014,7 @@ /* A[3] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135415,7 +138052,7 @@ /* A[4] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135453,7 +138090,7 @@ /* A[5] * A[6] */ "ldr r10, [%[a], #24]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135498,7 +138135,7 @@ /* A[0] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135528,7 +138165,7 @@ /* A[1] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135566,7 +138203,7 @@ /* A[2] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135604,7 +138241,7 @@ /* A[3] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135642,7 +138279,7 @@ /* A[4] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135680,7 +138317,7 @@ /* A[5] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135717,7 +138354,7 @@ #endif /* A[6] * A[6] */ "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135756,7 +138393,7 @@ /* A[0] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135786,7 +138423,7 @@ /* A[1] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135824,7 +138461,7 @@ /* A[2] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135862,7 +138499,7 @@ /* A[3] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135900,7 +138537,7 @@ /* A[4] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135938,7 +138575,7 @@ /* A[5] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -135976,7 +138613,7 @@ /* A[6] * A[7] */ "ldr r10, [%[a], #28]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136021,7 +138658,7 @@ /* A[0] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136051,7 +138688,7 @@ /* A[1] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136089,7 +138726,7 @@ /* A[2] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136127,7 +138764,7 @@ /* A[3] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136165,7 +138802,7 @@ /* A[4] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136203,7 +138840,7 @@ /* A[5] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136241,7 +138878,7 @@ /* A[6] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136278,7 +138915,7 @@ #endif /* A[7] * A[7] */ "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136317,7 +138954,7 @@ /* A[0] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136347,7 +138984,7 @@ /* A[1] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136385,7 +139022,7 @@ /* A[2] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136423,7 +139060,7 @@ /* A[3] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136461,7 +139098,7 @@ /* A[4] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136499,7 +139136,7 @@ /* A[5] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136537,7 +139174,7 @@ /* A[6] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136575,7 +139212,7 @@ /* A[7] * A[8] */ "ldr r10, [%[a], #32]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136620,7 +139257,7 @@ /* A[1] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136650,7 +139287,7 @@ /* A[2] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136688,7 +139325,7 @@ /* A[3] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136726,7 +139363,7 @@ /* A[4] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136764,7 +139401,7 @@ /* A[5] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136802,7 +139439,7 @@ /* A[6] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136840,7 +139477,7 @@ /* A[7] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136877,7 +139514,7 @@ #endif /* A[8] * A[8] */ "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136916,7 +139553,7 @@ /* A[2] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136946,7 +139583,7 @@ /* A[3] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -136984,7 +139621,7 @@ /* A[4] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137022,7 +139659,7 @@ /* A[5] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137060,7 +139697,7 @@ /* A[6] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137098,7 +139735,7 @@ /* A[7] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137136,7 +139773,7 @@ /* A[8] * A[9] */ "ldr r10, [%[a], #36]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137181,7 +139818,7 @@ /* A[3] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137211,7 +139848,7 @@ /* A[4] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137249,7 +139886,7 @@ /* A[5] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137287,7 +139924,7 @@ /* A[6] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137325,7 +139962,7 @@ /* A[7] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137363,7 +140000,7 @@ /* A[8] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137400,7 +140037,7 @@ #endif /* A[9] * A[9] */ "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137439,7 +140076,7 @@ /* A[4] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137469,7 +140106,7 @@ /* A[5] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137507,7 +140144,7 @@ /* A[6] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137545,7 +140182,7 @@ /* A[7] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137583,7 +140220,7 @@ /* A[8] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137621,7 +140258,7 @@ /* A[9] * A[10] */ "ldr r10, [%[a], #40]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137666,7 +140303,7 @@ /* A[5] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137696,7 +140333,7 @@ /* A[6] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137734,7 +140371,7 @@ /* A[7] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137772,7 +140409,7 @@ /* A[8] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137810,7 +140447,7 @@ /* A[9] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137847,7 +140484,7 @@ #endif /* A[10] * A[10] */ "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137886,7 +140523,7 @@ /* A[6] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137916,7 +140553,7 @@ /* A[7] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137954,7 +140591,7 @@ /* A[8] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -137992,7 +140629,7 @@ /* A[9] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138030,7 +140667,7 @@ /* A[10] * A[11] */ "ldr r10, [%[a], #44]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138075,7 +140712,7 @@ /* A[7] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138105,7 +140742,7 @@ /* A[8] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138143,7 +140780,7 @@ /* A[9] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138181,7 +140818,7 @@ /* A[10] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138218,7 +140855,7 @@ #endif /* A[11] * A[11] */ "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138257,7 +140894,7 @@ /* A[8] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138287,7 +140924,7 @@ /* A[9] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138325,7 +140962,7 @@ /* A[10] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138363,7 +141000,7 @@ /* A[11] * A[12] */ "ldr r10, [%[a], #48]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138408,7 +141045,7 @@ /* A[9] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138438,7 +141075,7 @@ /* A[10] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138476,7 +141113,7 @@ /* A[11] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138513,7 +141150,7 @@ #endif /* A[12] * A[12] */ "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138552,7 +141189,7 @@ /* A[10] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r5, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138582,7 +141219,7 @@ /* A[11] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138620,7 +141257,7 @@ /* A[12] * A[13] */ "ldr r10, [%[a], #52]\n\t" "ldr r12, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138665,7 +141302,7 @@ /* A[11] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138720,7 +141357,7 @@ /* A[12] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138771,7 +141408,7 @@ #endif /* A[13] * A[13] */ "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138801,7 +141438,7 @@ /* A[12] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138856,7 +141493,7 @@ /* A[13] * A[14] */ "ldr r10, [%[a], #56]\n\t" "ldr r12, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138909,7 +141546,7 @@ /* A[13] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138963,7 +141600,7 @@ #endif /* A[14] * A[14] */ "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -138993,7 +141630,7 @@ /* A[14] * A[15] */ "ldr r10, [%[a], #60]\n\t" "ldr r12, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsl r9, r12, #16\n\t" "lsr r8, r8, #16\n\t" @@ -139048,7 +141685,7 @@ "str r4, [%[r], #116]\n\t" /* A[15] * A[15] */ "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r8, r10, #16\n\t" "lsr r9, r10, #16\n\t" "lsr r8, r8, #16\n\t" @@ -139083,7 +141720,7 @@ "stm %[r]!, {r2, r3, r4, r8}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); } @@ -139095,12 +141732,11 @@ */ static sp_digit sp_1024_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -139129,10 +141765,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -139144,8 +141781,8 @@ */ static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3, r4, r5}\n\t" @@ -139207,7 +141844,7 @@ "sbc %[a], r9, r9\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)a; } @@ -139220,12 +141857,11 @@ */ static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r12, #0\n\t" "ldm %[a]!, {r3, r4, r5, r6}\n\t" "ldm %[b]!, {r7, r8, r9, r10}\n\t" "adds r3, r3, r7\n\t" @@ -139282,10 +141918,11 @@ "adcs r5, r5, r9\n\t" "adcs r6, r6, r10\n\t" "stm %[r]!, {r3, r4, r5, r6}\n\t" - "adc %[r], r12, r12\n\t" + "mov %[r], #0\n\t" + "adc %[r], %[r], #0\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -139367,9 +142004,9 @@ */ static sp_digit sp_1024_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "ldm %[a]!, {r3, r4, r5, r6}\n\t" @@ -139403,7 +142040,7 @@ "sbc %[r], r6, r6\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); return (uint32_t)(size_t)r; } @@ -139453,16 +142090,19 @@ */ static void sp_1024_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "sub sp, sp, #0x100\n\t" - "mov r5, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "ldr r11, [%[b]]\n\t" + "umull r8, r6, lr, r11\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_1024_mul_32_outer_%=: \n\t" "subs r3, r5, #0x7c\n\t" @@ -139473,7 +142113,44 @@ "L_sp_1024_mul_32_inner_%=: \n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[b], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif + "ldr lr, [%[a], r4]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -139510,10 +142187,46 @@ #endif "add r3, r3, #4\n\t" "sub r4, r4, #4\n\t" - "cmp r3, #0x80\n\t" - "beq L_sp_1024_mul_32_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_1024_mul_32_inner_%=\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_1024_mul_32_inner_done_%=\n\t" + "blt L_sp_1024_mul_32_inner_%=\n\t" + "ldr lr, [%[a], r3]\n\t" + "ldr r11, [%[b], r3]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adcs r7, r7, #0\n\t" + "adc r8, r8, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#else + "umull r9, r10, lr, r11\n\t" + "adds r6, r6, r9\n\t" + "adcs r7, r7, r10\n\t" + "adc r8, r8, #0\n\t" +#endif "\n" "L_sp_1024_mul_32_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" @@ -139521,18 +142234,50 @@ "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0xf8\n\t" + "cmp r5, #0xf4\n\t" "ble L_sp_1024_mul_32_outer_%=\n\t" + "ldr lr, [%[a], #124]\n\t" + "ldr r11, [%[b], #124]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsl r10, r11, #16\n\t" + "lsr r9, r9, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r10, r9, r10\n\t" + "adds r6, r6, r10\n\t" + "adc r7, r7, #0\n\t" + "lsr r10, r11, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r9, lr, #16\n\t" + "lsr r10, r11, #16\n\t" + "mul r10, r9, r10\n\t" + "add r7, r7, r10\n\t" + "lsl r10, r11, #16\n\t" + "lsr r10, r10, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #16\n\t" + "lsl r9, r9, #16\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umlal r6, r7, lr, r11\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_1024_mul_32_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_1024_mul_32_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -139543,29 +142288,28 @@ */ static void sp_1024_sqr_32(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "sub sp, sp, #0x100\n\t" - "mov r12, #0\n\t" - "mov r6, #0\n\t" + "ldr lr, [%[a]]\n\t" + "umull r8, r6, lr, lr\n\t" + "str r8, [sp]\n\t" "mov r7, #0\n\t" "mov r8, #0\n\t" - "mov r5, #0\n\t" + "mov r5, #4\n\t" "\n" "L_sp_1024_sqr_32_outer_%=: \n\t" "subs r3, r5, #0x7c\n\t" "it cc\n\t" - "movcc r3, r12\n\t" + "movcc r3, #0\n\t" "sub r4, r5, r3\n\t" "\n" "L_sp_1024_sqr_32_inner_%=: \n\t" - "cmp r4, r3\n\t" - "beq L_sp_1024_sqr_32_op_sqr_%=\n\t" "ldr lr, [%[a], r3]\n\t" "ldr r11, [%[a], r4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsl r10, r11, #16\n\t" "lsr r9, r9, #16\n\t" @@ -139614,11 +142358,13 @@ "adcs r7, r7, r10\n\t" "adc r8, r8, #0\n\t" #endif - "bal L_sp_1024_sqr_32_op_done_%=\n\t" - "\n" - "L_sp_1024_sqr_32_op_sqr_%=: \n\t" + "add r3, r3, #4\n\t" + "sub r4, r4, #4\n\t" + "cmp r3, r4\n\t" + "bgt L_sp_1024_sqr_32_inner_done_%=\n\t" + "blt L_sp_1024_sqr_32_inner_%=\n\t" "ldr lr, [%[a], r3]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r9, lr, #16\n\t" "lsr r10, lr, #16\n\t" "lsr r9, r9, #16\n\t" @@ -139645,34 +142391,50 @@ "adc r8, r8, #0\n\t" #endif "\n" - "L_sp_1024_sqr_32_op_done_%=: \n\t" - "add r3, r3, #4\n\t" - "sub r4, r4, #4\n\t" - "cmp r3, #0x80\n\t" - "beq L_sp_1024_sqr_32_inner_done_%=\n\t" - "cmp r3, r4\n\t" - "bgt L_sp_1024_sqr_32_inner_done_%=\n\t" - "cmp r3, r5\n\t" - "ble L_sp_1024_sqr_32_inner_%=\n\t" - "\n" "L_sp_1024_sqr_32_inner_done_%=: \n\t" "str r6, [sp, r5]\n\t" "mov r6, r7\n\t" "mov r7, r8\n\t" "mov r8, #0\n\t" "add r5, r5, #4\n\t" - "cmp r5, #0xf8\n\t" + "cmp r5, #0xf4\n\t" "ble L_sp_1024_sqr_32_outer_%=\n\t" + "ldr lr, [%[a], #124]\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) + "lsl r9, lr, #16\n\t" + "lsr r10, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mov r11, r9\n\t" + "mul r9, r11, r9\n\t" + "mov r11, r10\n\t" + "mul r10, r11, r10\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" + "lsr r10, lr, #16\n\t" + "lsl r9, lr, #16\n\t" + "lsr r9, r9, #16\n\t" + "mul r9, r10, r9\n\t" + "lsr r10, r9, #15\n\t" + "lsl r9, r9, #17\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#else + "umull r9, r10, lr, lr\n\t" + "adds r6, r6, r9\n\t" + "adc r7, r7, r10\n\t" +#endif "str r6, [sp, r5]\n\t" + "add r5, r5, #4\n\t" + "str r7, [sp, r5]\n\t" "\n" "L_sp_1024_sqr_32_store_%=: \n\t" - "ldm sp!, {r6, r7, r8, r9}\n\t" - "stm %[r]!, {r6, r7, r8, r9}\n\t" - "subs r5, r5, #16\n\t" + "ldm sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "stm %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "subs r5, r5, #32\n\t" "bgt L_sp_1024_sqr_32_store_%=\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -139770,16 +142532,15 @@ */ static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" "mov r12, #0\n\t" "add lr, %[a], #0x80\n\t" "\n" "L_sp_1024_sub_in_pkace_32_word_%=: \n\t" - "subs r12, r10, r12\n\t" + "rsbs r12, r12, #0\n\t" "ldm %[a], {r2, r3, r4, r5}\n\t" "ldm %[b]!, {r6, r7, r8, r9}\n\t" "sbcs r2, r2, r6\n\t" @@ -139787,13 +142548,13 @@ "sbcs r4, r4, r8\n\t" "sbcs r5, r5, r9\n\t" "stm %[a]!, {r2, r3, r4, r5}\n\t" - "sbc r12, r10, r10\n\t" + "sbc r12, r12, r12\n\t" "cmp %[a], lr\n\t" "bne L_sp_1024_sub_in_pkace_32_word_%=\n\t" "mov %[a], r12\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "r10" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "lr", "cc" ); return (uint32_t)(size_t)a; } @@ -139810,10 +142571,10 @@ */ static sp_digit sp_1024_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r6, #0\n\t" @@ -139834,7 +142595,7 @@ "mov %[r], r12\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -139850,10 +142611,10 @@ */ static sp_digit sp_1024_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -139972,7 +142733,7 @@ "sbc %[r], lr, lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -139987,9 +142748,9 @@ */ static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r3, #0\n\t" @@ -140011,7 +142772,7 @@ "mov %[r], r3\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); return (uint32_t)(size_t)r; } @@ -140026,15 +142787,14 @@ */ static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ "ldr r8, [%[a]]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r5, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -140067,7 +142827,7 @@ "L_sp_1024_mul_d_32_word_%=: \n\t" /* A[i] * B */ "ldr r8, [%[a], r9]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -140112,7 +142872,7 @@ "str r3, [%[r], #128]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -140125,15 +142885,14 @@ */ static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register sp_digit b asm ("r2") = b_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register sp_digit b asm ("r2") = (sp_digit)b_p; __asm__ __volatile__ ( - "mov r10, #0\n\t" /* A[0] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r3, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -140158,1211 +142917,971 @@ #else "umull r3, r4, %[b], r8\n\t" #endif + "stm %[r]!, {r3}\n\t" "mov r5, #0\n\t" - "str r3, [%[r]], #4\n\t" /* A[1] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[2] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[3] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[4] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[5] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[6] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[7] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[8] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[9] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[10] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[11] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[12] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[13] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[14] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[15] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[16] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[17] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[18] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[19] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[20] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[21] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[22] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[23] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[24] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[25] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[26] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[27] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[28] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r4, r4, r7\n\t" - "adcs r5, r5, #0\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "add r5, r5, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "adc r3, r3, #0\n\t" + "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r7\n\t" - "mov r3, #0\n\t" - "adc r3, r3, #0\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" + "mov r3, #0\n\t" /* A[29] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r5, r5, r7\n\t" - "adcs r3, r3, #0\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "add r3, r3, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "adc r4, r4, #0\n\t" + "adc r3, r3, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r7\n\t" - "mov r4, #0\n\t" - "adc r4, r4, #0\n\t" + "umlal r5, r3, %[b], r8\n\t" #endif - "str r5, [%[r]], #4\n\t" + "stm %[r]!, {r5}\n\t" + "mov r4, #0\n\t" /* A[30] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" "lsr r7, r7, #16\n\t" "mul r7, r6, r7\n\t" "adds r3, r3, r7\n\t" - "adcs r4, r4, #0\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, #0\n\t" "lsr r7, r8, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" "lsr r6, %[b], #16\n\t" "lsr r7, r8, #16\n\t" "mul r7, r6, r7\n\t" - "adds r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "add r4, r4, r7\n\t" "lsl r7, r8, #16\n\t" "lsr r7, r7, #16\n\t" "mul r6, r7, r6\n\t" "lsr r7, r6, #16\n\t" "lsl r6, r6, #16\n\t" "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "adc r5, r5, #0\n\t" + "adc r4, r4, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r7\n\t" - "mov r5, #0\n\t" - "adc r5, r5, #0\n\t" + "umlal r3, r4, %[b], r8\n\t" #endif - "str r3, [%[r]], #4\n\t" + "stm %[r]!, {r3}\n\t" + "mov r5, #0\n\t" /* A[31] * B */ - "ldr r8, [%[a]], #4\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) + "ldm %[a]!, {r8}\n\t" +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r6, %[b], #16\n\t" "lsl r7, r8, #16\n\t" "lsr r6, r6, #16\n\t" @@ -141388,15 +143907,13 @@ "adds r4, r4, r6\n\t" "adc r5, r5, r7\n\t" #else - "umull r6, r7, %[b], r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r7\n\t" + "umlal r4, r5, %[b], r8\n\t" #endif - "str r4, [%[r]], #4\n\t" + "stm %[r]!, {r4}\n\t" "str r5, [%[r]]\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -141413,9 +143930,9 @@ */ static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr r6, %[div], #16\n\t" @@ -141455,7 +143972,7 @@ "add %[d1], r4, r3\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -141472,9 +143989,9 @@ */ static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) { - register sp_digit d1 asm ("r0") = d1_p; - register sp_digit d0 asm ("r1") = d0_p; - register sp_digit div asm ("r2") = div_p; + register sp_digit d1 asm ("r0") = (sp_digit)d1_p; + register sp_digit d0 asm ("r1") = (sp_digit)d0_p; + register sp_digit div asm ("r2") = (sp_digit)div_p; __asm__ __volatile__ ( "lsr lr, %[div], #1\n\t" @@ -141504,7 +144021,7 @@ "bpl L_div_1024_word_32_bit_%=\n\t" "add r3, r3, r3\n\t" "add r3, r3, #1\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -141532,7 +144049,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -141560,7 +144077,7 @@ "subs r7, %[d0], r4\n\t" "sbc r8, %[d1], r5\n\t" "add r3, r3, r8\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "lsl r7, r3, #16\n\t" "lsl r4, %[div], #16\n\t" "lsr r7, r7, #16\n\t" @@ -141593,7 +144110,7 @@ "sub %[d1], r3, r6\n\t" : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)d1; } @@ -141638,8 +144155,8 @@ */ static sp_int32 sp_1024_cmp_32(const sp_digit* a_p, const sp_digit* b_p) { - register const sp_digit* a asm ("r0") = a_p; - register const sp_digit* b asm ("r1") = b_p; + register const sp_digit* a asm ("r0") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r1") = (const sp_digit*)b_p; __asm__ __volatile__ ( "mov r2, #-1\n\t" @@ -142022,7 +144539,7 @@ "mov %[a], r2\n\t" : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6" + : "memory", "r2", "r3", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -142036,8 +144553,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -142077,7 +144594,8 @@ * m A single precision number that is the modulus to reduce with. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a, const sp_digit* m) +static WC_INLINE int sp_1024_mod_32(sp_digit* r, const sp_digit* a, + const sp_digit* m) { return sp_1024_div_32(a, m, NULL, r); } @@ -142170,14 +144688,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -142355,6 +144873,7 @@ return err; } +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) /* Reduce the number back to 1024 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -142363,12 +144882,12 @@ */ static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) { - register sp_digit* a asm ("r0") = a_p; - register const sp_digit* m asm ("r1") = m_p; - register sp_digit mp asm ("r2") = mp_p; + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; __asm__ __volatile__ ( -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) +#if !(defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4)) "ldr r11, [%[m]]\n\t" #endif /* i = 0 */ @@ -142381,10 +144900,9 @@ /* mu = a[i] * mp */ "mul r8, %[mp], r12\n\t" /* a[i+0] += m[0] * mu */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m]]\n\t" #endif -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r7, r11, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r7\n\t" @@ -142408,14 +144926,8 @@ "lsl r6, r6, #16\n\t" "adds r12, r12, r6\n\t" "adc r5, r5, r7\n\t" -#else - "umull r6, r7, r8, r11\n\t" - "adds r12, r12, r6\n\t" - "adc r5, r7, #0\n\t" -#endif /* a[i+1] += m[1] * mu */ "ldr r7, [%[m], #4]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r10\n\t" @@ -142439,18 +144951,12 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r4, r4, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r4, r10, #0\n\t" -#endif "mov r12, lr\n\t" "adds r12, r12, r5\n\t" "adc r4, r4, #0\n\t" /* a[i+2] += m[2] * mu */ "ldr r7, [%[m], #8]\n\t" "ldr lr, [%[a], #8]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r10, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r10\n\t" @@ -142474,17 +144980,11 @@ "lsl r6, r6, #16\n\t" "adds lr, lr, r6\n\t" "adc r5, r5, r10\n\t" -#else - "umull r6, r10, r8, r7\n\t" - "adds lr, lr, r6\n\t" - "adc r5, r10, #0\n\t" -#endif "adds lr, lr, r4\n\t" "adc r5, r5, #0\n\t" /* a[i+3] += m[3] * mu */ "ldr r7, [%[m], #12]\n\t" "ldr r10, [%[a], #12]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142508,18 +145008,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #12]\n\t" "adc r4, r4, #0\n\t" /* a[i+4] += m[4] * mu */ "ldr r7, [%[m], #16]\n\t" "ldr r10, [%[a], #16]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -142543,18 +145037,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #16]\n\t" "adc r5, r5, #0\n\t" /* a[i+5] += m[5] * mu */ "ldr r7, [%[m], #20]\n\t" "ldr r10, [%[a], #20]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142578,18 +145066,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #20]\n\t" "adc r4, r4, #0\n\t" /* a[i+6] += m[6] * mu */ "ldr r7, [%[m], #24]\n\t" "ldr r10, [%[a], #24]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -142613,18 +145095,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #24]\n\t" "adc r5, r5, #0\n\t" /* a[i+7] += m[7] * mu */ "ldr r7, [%[m], #28]\n\t" "ldr r10, [%[a], #28]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142648,18 +145124,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #28]\n\t" "adc r4, r4, #0\n\t" /* a[i+8] += m[8] * mu */ "ldr r7, [%[m], #32]\n\t" "ldr r10, [%[a], #32]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -142683,18 +145153,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #32]\n\t" "adc r5, r5, #0\n\t" /* a[i+9] += m[9] * mu */ "ldr r7, [%[m], #36]\n\t" "ldr r10, [%[a], #36]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142718,18 +145182,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #36]\n\t" "adc r4, r4, #0\n\t" /* a[i+10] += m[10] * mu */ "ldr r7, [%[m], #40]\n\t" "ldr r10, [%[a], #40]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -142753,18 +145211,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #40]\n\t" "adc r5, r5, #0\n\t" /* a[i+11] += m[11] * mu */ "ldr r7, [%[m], #44]\n\t" "ldr r10, [%[a], #44]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142788,18 +145240,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #44]\n\t" "adc r4, r4, #0\n\t" /* a[i+12] += m[12] * mu */ "ldr r7, [%[m], #48]\n\t" "ldr r10, [%[a], #48]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -142823,18 +145269,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #48]\n\t" "adc r5, r5, #0\n\t" /* a[i+13] += m[13] * mu */ "ldr r7, [%[m], #52]\n\t" "ldr r10, [%[a], #52]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142858,18 +145298,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #52]\n\t" "adc r4, r4, #0\n\t" /* a[i+14] += m[14] * mu */ "ldr r7, [%[m], #56]\n\t" "ldr r10, [%[a], #56]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -142893,18 +145327,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #56]\n\t" "adc r5, r5, #0\n\t" /* a[i+15] += m[15] * mu */ "ldr r7, [%[m], #60]\n\t" "ldr r10, [%[a], #60]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142928,18 +145356,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #60]\n\t" "adc r4, r4, #0\n\t" /* a[i+16] += m[16] * mu */ "ldr r7, [%[m], #64]\n\t" "ldr r10, [%[a], #64]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -142963,18 +145385,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #64]\n\t" "adc r5, r5, #0\n\t" /* a[i+17] += m[17] * mu */ "ldr r7, [%[m], #68]\n\t" "ldr r10, [%[a], #68]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -142998,18 +145414,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #68]\n\t" "adc r4, r4, #0\n\t" /* a[i+18] += m[18] * mu */ "ldr r7, [%[m], #72]\n\t" "ldr r10, [%[a], #72]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -143033,18 +145443,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #72]\n\t" "adc r5, r5, #0\n\t" /* a[i+19] += m[19] * mu */ "ldr r7, [%[m], #76]\n\t" "ldr r10, [%[a], #76]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -143068,18 +145472,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #76]\n\t" "adc r4, r4, #0\n\t" /* a[i+20] += m[20] * mu */ "ldr r7, [%[m], #80]\n\t" "ldr r10, [%[a], #80]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -143103,18 +145501,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #80]\n\t" "adc r5, r5, #0\n\t" /* a[i+21] += m[21] * mu */ "ldr r7, [%[m], #84]\n\t" "ldr r10, [%[a], #84]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -143138,18 +145530,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #84]\n\t" "adc r4, r4, #0\n\t" /* a[i+22] += m[22] * mu */ "ldr r7, [%[m], #88]\n\t" "ldr r10, [%[a], #88]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -143173,18 +145559,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #88]\n\t" "adc r5, r5, #0\n\t" /* a[i+23] += m[23] * mu */ "ldr r7, [%[m], #92]\n\t" "ldr r10, [%[a], #92]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -143208,18 +145588,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #92]\n\t" "adc r4, r4, #0\n\t" /* a[i+24] += m[24] * mu */ "ldr r7, [%[m], #96]\n\t" "ldr r10, [%[a], #96]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -143243,18 +145617,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #96]\n\t" "adc r5, r5, #0\n\t" /* a[i+25] += m[25] * mu */ "ldr r7, [%[m], #100]\n\t" "ldr r10, [%[a], #100]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -143278,18 +145646,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #100]\n\t" "adc r4, r4, #0\n\t" /* a[i+26] += m[26] * mu */ "ldr r7, [%[m], #104]\n\t" "ldr r10, [%[a], #104]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -143313,18 +145675,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #104]\n\t" "adc r5, r5, #0\n\t" /* a[i+27] += m[27] * mu */ "ldr r7, [%[m], #108]\n\t" "ldr r10, [%[a], #108]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -143348,18 +145704,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #108]\n\t" "adc r4, r4, #0\n\t" /* a[i+28] += m[28] * mu */ "ldr r7, [%[m], #112]\n\t" "ldr r10, [%[a], #112]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -143383,18 +145733,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #112]\n\t" "adc r5, r5, #0\n\t" /* a[i+29] += m[29] * mu */ "ldr r7, [%[m], #116]\n\t" "ldr r10, [%[a], #116]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r4, r6, r11\n\t" @@ -143418,18 +145762,12 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r4, r4, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r4, r7, #0\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #116]\n\t" "adc r4, r4, #0\n\t" /* a[i+30] += m[30] * mu */ "ldr r7, [%[m], #120]\n\t" "ldr r10, [%[a], #120]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsr r11, r7, #16\n\t" "lsr r6, r8, #16\n\t" "mul r5, r6, r11\n\t" @@ -143453,22 +145791,16 @@ "lsl r6, r6, #16\n\t" "adds r10, r10, r6\n\t" "adc r5, r5, r11\n\t" -#else - "umull r6, r7, r8, r7\n\t" - "adds r10, r10, r6\n\t" - "adc r5, r7, #0\n\t" -#endif "adds r10, r10, r4\n\t" "str r10, [%[a], #120]\n\t" "adc r5, r5, #0\n\t" /* a[i+31] += m[31] * mu */ -#if !(defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4)) - "ldr r7, [%[m], #124]\n\t" -#else +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 4) "ldr r11, [%[m], #124]\n\t" +#else + "ldr r7, [%[m], #124]\n\t" #endif "ldr r10, [%[a], #124]\n\t" -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 4) "lsl r6, r8, #16\n\t" "lsl r7, r11, #16\n\t" "lsr r6, r6, #16\n\t" @@ -143499,13 +145831,306 @@ "adds r5, r5, r6\n\t" "adcs r4, r4, r7\n\t" "adc r3, r3, #0\n\t" -#else + "adds r10, r10, r5\n\t" + "str r10, [%[a], #124]\n\t" + "ldr r10, [%[a], #128]\n\t" + "adcs r10, r10, r4\n\t" + "str r10, [%[a], #128]\n\t" + "adc r3, r3, #0\n\t" + /* i += 1 */ + "add r9, r9, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r9, #0x80\n\t" + "blt L_sp_1024_mont_reduce_32_word_%=\n\t" + /* Loop Done */ + "str r12, [%[a]]\n\t" + "str lr, [%[a], #4]\n\t" + "ldr r6, [%[m], #124]\n\t" + "subs r10, r6, r10\n\t" + "neg r3, r3\n\t" + "sbc r10, r10, r10\n\t" + "orr r3, r3, r10\n\t" + "mov %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_1024_cond_sub_32(a - 32, a, m, mp); +} + +#elif defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) +/* Reduce the number back to 1024 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + "ldr r11, [%[m]]\n\t" + /* i = 0 */ + "mov r9, #0\n\t" + "mov r3, #0\n\t" + "ldr r12, [%[a]]\n\t" + "ldr lr, [%[a], #4]\n\t" + "\n" + "L_sp_1024_mont_reduce_32_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r8, %[mp], r12\n\t" + /* a[i+0] += m[0] * mu */ + "mov r5, #0\n\t" + "umlal r12, r5, r8, r11\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r7, [%[m], #4]\n\t" + "mov r4, #0\n\t" + "umlal lr, r4, r8, r7\n\t" + "mov r12, lr\n\t" + "adds r12, r12, r5\n\t" + "adc r4, r4, #0\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r7, [%[m], #8]\n\t" + "ldr lr, [%[a], #8]\n\t" + "mov r5, #0\n\t" + "umlal lr, r5, r8, r7\n\t" + "adds lr, lr, r4\n\t" + "adc r5, r5, #0\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r7, [%[m], #12]\n\t" + "ldr r10, [%[a], #12]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #12]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r7, [%[m], #16]\n\t" + "ldr r10, [%[a], #16]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #16]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r7, [%[m], #20]\n\t" + "ldr r10, [%[a], #20]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #20]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r7, [%[m], #24]\n\t" + "ldr r10, [%[a], #24]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #24]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r7, [%[m], #28]\n\t" + "ldr r10, [%[a], #28]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #28]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r7, [%[m], #32]\n\t" + "ldr r10, [%[a], #32]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #32]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r7, [%[m], #36]\n\t" + "ldr r10, [%[a], #36]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #36]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r7, [%[m], #40]\n\t" + "ldr r10, [%[a], #40]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #40]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r7, [%[m], #44]\n\t" + "ldr r10, [%[a], #44]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #44]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r7, [%[m], #48]\n\t" + "ldr r10, [%[a], #48]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #48]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r7, [%[m], #52]\n\t" + "ldr r10, [%[a], #52]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #52]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r7, [%[m], #56]\n\t" + "ldr r10, [%[a], #56]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #56]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r7, [%[m], #60]\n\t" + "ldr r10, [%[a], #60]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #60]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r7, [%[m], #64]\n\t" + "ldr r10, [%[a], #64]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #64]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r7, [%[m], #68]\n\t" + "ldr r10, [%[a], #68]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #68]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r7, [%[m], #72]\n\t" + "ldr r10, [%[a], #72]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #72]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r7, [%[m], #76]\n\t" + "ldr r10, [%[a], #76]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #76]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r7, [%[m], #80]\n\t" + "ldr r10, [%[a], #80]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #80]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r7, [%[m], #84]\n\t" + "ldr r10, [%[a], #84]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #84]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r7, [%[m], #88]\n\t" + "ldr r10, [%[a], #88]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #88]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r7, [%[m], #92]\n\t" + "ldr r10, [%[a], #92]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #92]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r7, [%[m], #96]\n\t" + "ldr r10, [%[a], #96]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #96]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r7, [%[m], #100]\n\t" + "ldr r10, [%[a], #100]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #100]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r7, [%[m], #104]\n\t" + "ldr r10, [%[a], #104]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #104]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r7, [%[m], #108]\n\t" + "ldr r10, [%[a], #108]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #108]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r7, [%[m], #112]\n\t" + "ldr r10, [%[a], #112]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #112]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r7, [%[m], #116]\n\t" + "ldr r10, [%[a], #116]\n\t" + "mov r4, #0\n\t" + "umlal r10, r4, r8, r7\n\t" + "adds r10, r10, r5\n\t" + "str r10, [%[a], #116]\n\t" + "adc r4, r4, #0\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r7, [%[m], #120]\n\t" + "ldr r10, [%[a], #120]\n\t" + "mov r5, #0\n\t" + "umlal r10, r5, r8, r7\n\t" + "adds r10, r10, r4\n\t" + "str r10, [%[a], #120]\n\t" + "adc r5, r5, #0\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r7, [%[m], #124]\n\t" + "ldr r10, [%[a], #124]\n\t" "umull r6, r7, r8, r7\n\t" "adds r5, r5, r6\n\t" "adcs r4, r7, r3\n\t" "mov r3, #0\n\t" "adc r3, r3, r3\n\t" -#endif "adds r10, r10, r5\n\t" "str r10, [%[a], #124]\n\t" "ldr r10, [%[a], #128]\n\t" @@ -143517,6 +146142,7 @@ "add %[a], %[a], #4\n\t" "cmp r9, #0x80\n\t" "blt L_sp_1024_mont_reduce_32_word_%=\n\t" + /* Loop Done */ "str r12, [%[a]]\n\t" "str lr, [%[a], #4]\n\t" "ldr r6, [%[m], #124]\n\t" @@ -143527,11 +146153,222 @@ "mov %[mp], r3\n\t" : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" + ); + sp_1024_cond_sub_32(a - 32, a, m, mp); +} + +#else +/* Reduce the number back to 1024 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +static SP_NOINLINE void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +{ + register sp_digit* a asm ("r0") = (sp_digit*)a_p; + register const sp_digit* m asm ("r1") = (const sp_digit*)m_p; + register sp_digit mp asm ("r2") = (sp_digit)mp_p; + + __asm__ __volatile__ ( + /* i = 0 */ + "mov r12, #0\n\t" + "mov lr, #0\n\t" + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[a], #4]\n\t" + "ldr r6, [%[a], #8]\n\t" + "ldr r7, [%[a], #12]\n\t" + "ldr r8, [%[a], #16]\n\t" + "\n" + "L_sp_1024_mont_reduce_32_word_%=: \n\t" + /* mu = a[i] * mp */ + "mul r11, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "ldr r10, [%[m]]\n\t" + "mov r3, #0\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+1] += m[1] * mu */ + "ldr r10, [%[m], #4]\n\t" + "mov r4, r5\n\t" + "umaal r4, r3, r11, r10\n\t" + /* a[i+2] += m[2] * mu */ + "ldr r10, [%[m], #8]\n\t" + "mov r5, r6\n\t" + "umaal r5, r3, r11, r10\n\t" + /* a[i+3] += m[3] * mu */ + "ldr r10, [%[m], #12]\n\t" + "mov r6, r7\n\t" + "umaal r6, r3, r11, r10\n\t" + /* a[i+4] += m[4] * mu */ + "ldr r10, [%[m], #16]\n\t" + "mov r7, r8\n\t" + "umaal r7, r3, r11, r10\n\t" + /* a[i+5] += m[5] * mu */ + "ldr r10, [%[m], #20]\n\t" + "ldr r8, [%[a], #20]\n\t" + "umaal r8, r3, r11, r10\n\t" + /* a[i+6] += m[6] * mu */ + "ldr r10, [%[m], #24]\n\t" + "ldr r9, [%[a], #24]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "ldr r10, [%[m], #28]\n\t" + "ldr r9, [%[a], #28]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "ldr r10, [%[m], #32]\n\t" + "ldr r9, [%[a], #32]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "ldr r10, [%[m], #36]\n\t" + "ldr r9, [%[a], #36]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "ldr r10, [%[m], #40]\n\t" + "ldr r9, [%[a], #40]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "ldr r10, [%[m], #44]\n\t" + "ldr r9, [%[a], #44]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "ldr r10, [%[m], #48]\n\t" + "ldr r9, [%[a], #48]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "ldr r10, [%[m], #52]\n\t" + "ldr r9, [%[a], #52]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "ldr r10, [%[m], #56]\n\t" + "ldr r9, [%[a], #56]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "ldr r10, [%[m], #60]\n\t" + "ldr r9, [%[a], #60]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "ldr r10, [%[m], #64]\n\t" + "ldr r9, [%[a], #64]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "ldr r10, [%[m], #68]\n\t" + "ldr r9, [%[a], #68]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "ldr r10, [%[m], #72]\n\t" + "ldr r9, [%[a], #72]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "ldr r10, [%[m], #76]\n\t" + "ldr r9, [%[a], #76]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "ldr r10, [%[m], #80]\n\t" + "ldr r9, [%[a], #80]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "ldr r10, [%[m], #84]\n\t" + "ldr r9, [%[a], #84]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "ldr r10, [%[m], #88]\n\t" + "ldr r9, [%[a], #88]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "ldr r10, [%[m], #92]\n\t" + "ldr r9, [%[a], #92]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "ldr r10, [%[m], #96]\n\t" + "ldr r9, [%[a], #96]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "ldr r10, [%[m], #100]\n\t" + "ldr r9, [%[a], #100]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "ldr r10, [%[m], #104]\n\t" + "ldr r9, [%[a], #104]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "ldr r10, [%[m], #108]\n\t" + "ldr r9, [%[a], #108]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "ldr r10, [%[m], #112]\n\t" + "ldr r9, [%[a], #112]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "ldr r10, [%[m], #116]\n\t" + "ldr r9, [%[a], #116]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "ldr r10, [%[m], #120]\n\t" + "ldr r9, [%[a], #120]\n\t" + "umaal r9, r3, r11, r10\n\t" + "str r9, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "ldr r10, [%[m], #124]\n\t" + "ldr r9, [%[a], #124]\n\t" + "umaal r9, r3, r11, r10\n\t" + "ldr r11, [%[a], #128]\n\t" + "mov r10, #0\n\t" + "umaal r3, r11, r10, r10\n\t" + "str r9, [%[a], #124]\n\t" + "adds r3, r3, lr\n\t" + "adc lr, r11, #0\n\t" + "str r3, [%[a], #128]\n\t" + /* i += 1 */ + "add r12, r12, #4\n\t" + "add %[a], %[a], #4\n\t" + "cmp r12, #0x80\n\t" + "blt L_sp_1024_mont_reduce_32_word_%=\n\t" + /* Loop Done */ + "str r4, [%[a]]\n\t" + "str r5, [%[a], #4]\n\t" + "str r6, [%[a], #8]\n\t" + "str r7, [%[a], #12]\n\t" + "str r8, [%[a], #16]\n\t" + "ldr r10, [%[m], #124]\n\t" + "subs r3, r10, r3\n\t" + "neg lr, lr\n\t" + "sbc r3, r3, r3\n\t" + "orr lr, lr, r3\n\t" + "mov %[mp], lr\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); sp_1024_cond_sub_32(a - 32, a, m, mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -143539,7 +146376,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -143553,7 +146390,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -143678,10 +146515,10 @@ */ static void sp_1024_mont_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register const sp_digit* m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register const sp_digit* m asm ("r3") = (const sp_digit*)m_p; __asm__ __volatile__ ( "mov r12, #0\n\t" @@ -143747,7 +146584,7 @@ "neg r12, r12\n\t" "sbc r11, r11, r11\n\t" "sub %[r], %[r], #0x80\n\t" - "orr r12, r11\n\t" + "orr r12, r12, r11\n\t" "ldm %[r], {r4, r5, r6, r7}\n\t" "ldm %[m]!, {r8, r9, r10, r11}\n\t" "and r8, r8, r12\n\t" @@ -143838,7 +146675,7 @@ "stm %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -143850,9 +146687,9 @@ */ static void sp_1024_mont_dbl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; __asm__ __volatile__ ( "mov r12, #0\n\t" @@ -143902,7 +146739,7 @@ "neg r12, r12\n\t" "sbc r4, r4, r4\n\t" "sub %[r], %[r], #0x80\n\t" - "orr r12, r4\n\t" + "orr r12, r12, r4\n\t" "ldm %[r], {r4, r5, r6, r7}\n\t" "ldm %[m]!, {r8, r9, r10, r11}\n\t" "and r8, r8, r12\n\t" @@ -143993,7 +146830,7 @@ "stm %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12" + : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc" ); } @@ -144005,9 +146842,9 @@ */ static void sp_1024_mont_tpl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* m asm ("r2") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* m asm ("r2") = (const sp_digit*)m_p; __asm__ __volatile__ ( "mov r12, #0\n\t" @@ -144057,7 +146894,7 @@ "neg r12, r12\n\t" "sbc r4, r4, r4\n\t" "sub %[r], %[r], #0x80\n\t" - "orr r12, r4\n\t" + "orr r12, r12, r4\n\t" "ldm %[r], {r4, r5, r6, r7}\n\t" "ldm %[m]!, {r8, r9, r10, r11}\n\t" "and r8, r8, r12\n\t" @@ -144212,7 +147049,7 @@ "neg r12, r12\n\t" "sbc r7, r7, r7\n\t" "sub %[r], %[r], #0x80\n\t" - "orr r12, r7\n\t" + "orr r12, r12, r7\n\t" "ldm %[r], {r4, r5, r6, r7}\n\t" "ldm %[m]!, {r8, r9, r10, r11}\n\t" "and r8, r8, r12\n\t" @@ -144303,7 +147140,7 @@ "stm %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12" + : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc" ); } @@ -144316,10 +147153,10 @@ */ static void sp_1024_mont_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register const sp_digit* m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register const sp_digit* m asm ("r3") = (const sp_digit*)m_p; __asm__ __volatile__ ( "ldm %[a]!, {r4, r5, r6, r7}\n\t" @@ -144470,11 +147307,10 @@ "stm %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } -#define sp_1024_mont_sub_lower_32 sp_1024_mont_sub_32 #ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -144486,10 +147322,10 @@ */ static sp_digit sp_1024_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov lr, #0\n\t" @@ -144510,7 +147346,7 @@ "mov %[r], lr\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6" + : "memory", "r12", "lr", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -144526,10 +147362,10 @@ */ static sp_digit sp_1024_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - register sp_digit m asm ("r3") = m_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; + register const sp_digit* b asm ("r2") = (const sp_digit*)b_p; + register sp_digit m asm ("r3") = (sp_digit)m_p; __asm__ __volatile__ ( "mov r8, #0\n\t" @@ -144648,7 +147484,7 @@ "adc %[r], r8, r8\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8" + : "memory", "r12", "lr", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -144656,8 +147492,8 @@ #endif /* WOLFSSL_SP_SMALL */ static void sp_1024_rshift1_32(sp_digit* r_p, const sp_digit* a_p) { - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; + register sp_digit* r asm ("r0") = (sp_digit*)r_p; + register const sp_digit* a asm ("r1") = (const sp_digit*)a_p; __asm__ __volatile__ ( "ldm %[a], {r2, r3}\n\t" @@ -144788,7 +147624,7 @@ "str r3, [%[r], #124]\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4" + : "memory", "r2", "r3", "r4", "cc" ); } @@ -144798,7 +147634,7 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_1024_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_1024_mont_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o; @@ -144851,7 +147687,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_32(t2, t2, p1024_mod); + sp_1024_mont_div2_32(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -144861,7 +147697,7 @@ /* X = X - Y */ sp_1024_mont_sub_32(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_32(y, y, x, p1024_mod); + sp_1024_mont_sub_32(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -144884,7 +147720,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data; @@ -144958,7 +147795,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_32(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_32(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -144983,7 +147820,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -145008,122 +147845,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_1024_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "add lr, %[a], #0x80\n\t" - "\n" - "L_sp_1024_sub_32_word_%=: \n\t" - "rsbs r12, r12, #0\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "sbc r12, r3, r3\n\t" - "cmp %[a], lr\n\t" - "bne L_sp_1024_sub_32_word_%=\n\t" - "mov %[r], r12\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "lr" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_1024_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) -{ - register sp_digit* r asm ("r0") = r_p; - register const sp_digit* a asm ("r1") = a_p; - register const sp_digit* b asm ("r2") = b_p; - - __asm__ __volatile__ ( - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "subs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "ldm %[a]!, {r3, r4, r5, r6}\n\t" - "ldm %[b]!, {r7, r8, r9, r10}\n\t" - "sbcs r3, r3, r7\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "stm %[r]!, {r3, r4, r5, r6}\n\t" - "sbc %[r], r6, r6\n\t" - : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ /* Compare two numbers to determine if they are equal. * Constant time implementation. * @@ -145171,12 +147892,12 @@ static void sp_1024_proj_point_add_32(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*32; - sp_digit* t3 = t + 4*32; - sp_digit* t4 = t + 6*32; - sp_digit* t5 = t + 8*32; - sp_digit* t6 = t + 10*32; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*32; + sp_digit* t2 = t + 4*32; + sp_digit* t3 = t + 6*32; + sp_digit* t4 = t + 8*32; + sp_digit* t5 = t + 10*32; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod); @@ -145198,17 +147919,9 @@ sp_1024_proj_point_dbl_32(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_32(t2, t2, t1, p1024_mod); @@ -145227,20 +147940,31 @@ sp_1024_mont_dbl_32(t3, y, p1024_mod); sp_1024_mont_sub_32(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_32(y, y, x, p1024_mod); + sp_1024_mont_sub_32(y, y, x, p1024_mod); sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(y, y, t5, p1024_mod); - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -145286,12 +148010,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*32; - ctx->t3 = t + 4*32; - ctx->t4 = t + 6*32; - ctx->t5 = t + 8*32; - ctx->t6 = t + 10*32; + ctx->t6 = t; + ctx->t1 = t + 2*32; + ctx->t2 = t + 4*32; + ctx->t3 = t + 6*32; + ctx->t4 = t + 8*32; + ctx->t5 = t + 10*32; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -145398,7 +148122,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -145411,22 +148135,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -145586,8 +148316,6 @@ } #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL) -#define sp_1024_mont_dbl_lower_32 sp_1024_mont_dbl_32 -#define sp_1024_mont_tpl_lower_32 sp_1024_mont_tpl_32 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -145626,7 +148354,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_32(a, t1, p1024_mod); + sp_1024_mont_tpl_32(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod); @@ -145635,8 +148363,8 @@ sp_1024_mont_dbl_32(t2, b, p1024_mod); sp_1024_mont_sub_32(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_32(b, t2, p1024_mod); + sp_1024_mont_sub_32(t2, b, x, p1024_mod); + sp_1024_mont_dbl_32(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -145656,7 +148384,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_32(a, t1, p1024_mod); + sp_1024_mont_tpl_32(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod); @@ -145665,8 +148393,8 @@ sp_1024_mont_dbl_32(t2, b, p1024_mod); sp_1024_mont_sub_32(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_32(b, t2, p1024_mod); + sp_1024_mont_sub_32(t2, b, x, p1024_mod); + sp_1024_mont_dbl_32(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -145676,7 +148404,7 @@ sp_1024_mont_sub_32(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_32(y, y, p1024_mod); + sp_1024_mont_div2_32(y, y, p1024_mod); } /* Convert the projective point to affine. @@ -145722,12 +148450,12 @@ static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*32; - sp_digit* t3 = t + 4*32; - sp_digit* t4 = t + 6*32; - sp_digit* t5 = t + 8*32; - sp_digit* t6 = t + 10*32; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*32; + sp_digit* t6 = t + 4*32; + sp_digit* t1 = t + 6*32; + sp_digit* t4 = t + 8*32; + sp_digit* t5 = t + 10*32; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -145743,13 +148471,9 @@ sp_1024_proj_point_dbl_32(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod); @@ -145758,33 +148482,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_32(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_32(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_32(t1, t3, p1024_mod); - sp_1024_mont_sub_32(x, x, t1, p1024_mod); + sp_1024_mont_sqr_32(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_32(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_32(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_32(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_32(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_32(t5, t3, p1024_mod); + sp_1024_mont_sub_32(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_32(t3, t3, x, p1024_mod); + sp_1024_mont_sub_32(t3, t3, x, p1024_mod); sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_32(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_32(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_32(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -146009,13 +148740,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -146086,8 +148819,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap); @@ -146108,10 +148841,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -146364,13 +149099,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -146441,8 +149178,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap); @@ -146463,10 +149200,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -150196,7 +152935,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -150218,7 +152957,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, + point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -150434,7 +153173,7 @@ return err; } -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -150460,7 +153199,7 @@ sp_1024_mont_add_32(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -152481,7 +155220,7 @@ } #endif /* WOLFSSL_SP_SMALL */ -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -152596,7 +155335,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_32(t1, ty, p1024_mod); + sp_1024_mont_div2_32(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_32(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -152616,7 +155355,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_32(t1, t1, p1024_mod); + sp_1024_mont_div2_32(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -153034,7 +155773,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_32(t1, ty, p1024_mod); + sp_1024_mont_div2_32(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_32(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -153072,7 +155811,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_32(p->y, p->y, p1024_mod); + sp_1024_mont_div2_32(p->y, p->y, p1024_mod); } /* Operations to perform based on order - 1. @@ -153883,7 +156622,7 @@ } } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -153912,19 +156651,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 32; + /* y^2 - x^3 - a.x = b */ sp_1024_sqr_32(t1, point->y); (void)sp_1024_mod_32(t1, t1, p1024_mod); sp_1024_sqr_32(t2, point->x); (void)sp_1024_mod_32(t2, t2, p1024_mod); sp_1024_mul_32(t2, t2, point->x); (void)sp_1024_mod_32(t2, t2, p1024_mod); - (void)sp_1024_sub_32(t2, p1024_mod, t2); - sp_1024_mont_add_32(t1, t1, t2, p1024_mod); + sp_1024_mont_sub_32(t1, t1, t2, p1024_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); + n = sp_1024_cmp_32(t1, p1024_mod); sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31)); sp_1024_norm_32(t1); @@ -153941,7 +156682,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm64.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm64.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm64.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_arm64.c 2024-08-03 07:30:00.000000000 +0000 @@ -52,6 +52,16 @@ #include +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif + #ifdef WOLFSSL_SP_ARM64_ASM #define SP_PRINT_NUM(var, name, total, words, bits) \ do { \ @@ -89,7 +99,7 @@ "subs x6, %[n], 8\n\t" "mov x7, xzr\n\t" "blt 2f\n\t" - /* Put in mulitples of 8 bytes. */ + /* Put in multiples of 8 bytes. */ "1:\n\t" "ldr x8, [x4], -8\n\t" "subs x6, x6, 8\n\t" @@ -193,14 +203,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -758,7 +768,7 @@ "stp x3, x4, [%[r], 32]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 48]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -906,7 +916,7 @@ "stp x3, x4, [%[r], 96]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 112]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -1237,7 +1247,7 @@ "stp x3, x4, [%[r], 224]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 240]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -2489,7 +2499,7 @@ "stp x3, x4, [%[r]], #16\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r]], #16\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" "cmp %[a], x11\n\t" "b.ne 1b\n\t" : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) @@ -2681,7 +2691,7 @@ "stp x3, x4, [%[r]], #16\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r]], #16\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" "cmp %[a], x11\n\t" "b.ne 1b\n\t" : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) @@ -2848,7 +2858,7 @@ #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -3339,7 +3349,7 @@ "umulh x8, x10, x9\n\t" "adds x6, x6, x7\n\t" "adcs x8, x8, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x27, x28, x6\n\t" "ldr x28, [%[a], 128]\n\t" "adcs x28, x28, x8\n\t" @@ -3414,7 +3424,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -3428,7 +3438,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_16(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -3719,7 +3729,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -3967,8 +3977,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_16(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_16(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[32], t2[17]; sp_digit div, r1; @@ -4642,7 +4652,7 @@ "ldp x8, x9, [%[a], 248]\n\t" "adds x5, x5, x6\n\t" "adcs x7, x7, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x8, x8, x5\n\t" "str x8, [%[a], 248]\n\t" "adcs x9, x9, x7\n\t" @@ -4776,7 +4786,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -4790,7 +4800,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -4939,7 +4949,7 @@ #endif /* WOLFSSL_SP_SMALL */ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -5007,8 +5017,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_32_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_32_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -5230,7 +5240,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -5574,8 +5584,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -6982,7 +6992,7 @@ "subs x6, %[n], 8\n\t" "mov x7, xzr\n\t" "blt 2f\n\t" - /* Put in mulitples of 8 bytes. */ + /* Put in multiples of 8 bytes. */ "1:\n\t" "ldr x8, [x4], -8\n\t" "subs x6, x6, 8\n\t" @@ -7086,14 +7096,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -7475,7 +7485,7 @@ "adcs x4, x4, x8\n\t" "str x3, [%[r], 32]\n\t" "str x4, [%[r], 40]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -7601,7 +7611,7 @@ "stp x3, x4, [%[r], 64]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 80]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -7877,7 +7887,7 @@ "stp x3, x4, [%[r], 160]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 176]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -8318,7 +8328,7 @@ "stp x3, x4, [%[r], 352]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 368]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -11292,7 +11302,7 @@ "stp x3, x4, [%[r]], #16\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r]], #16\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" "cmp %[a], x11\n\t" "b.ne 1b\n\t" : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) @@ -11484,7 +11494,7 @@ "stp x3, x4, [%[r]], #16\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r]], #16\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" "cmp %[a], x11\n\t" "b.ne 1b\n\t" : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) @@ -11651,7 +11661,7 @@ #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -12354,7 +12364,7 @@ "ldp x8, x9, [%[a], 184]\n\t" "adds x5, x5, x6\n\t" "adcs x7, x7, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x8, x8, x5\n\t" "str x8, [%[a], 184]\n\t" "adcs x9, x9, x7\n\t" @@ -12460,7 +12470,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_24(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -12474,7 +12484,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_24(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -12862,7 +12872,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -13158,8 +13168,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_24(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_24(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[48], t2[25]; sp_digit div, r1; @@ -13977,7 +13987,7 @@ "ldp x8, x9, [%[a], 376]\n\t" "adds x5, x5, x6\n\t" "adcs x7, x7, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x8, x8, x5\n\t" "str x8, [%[a], 376]\n\t" "adcs x9, x9, x7\n\t" @@ -14167,7 +14177,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -14181,7 +14191,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -14370,7 +14380,7 @@ #endif /* WOLFSSL_SP_SMALL */ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -14438,8 +14448,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_48_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_48_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[96], t2[49]; sp_digit div, r1; @@ -14717,7 +14727,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -15157,8 +15167,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[96], t2[49]; sp_digit div, r1; @@ -16585,7 +16595,7 @@ "subs x6, %[n], 8\n\t" "mov x7, xzr\n\t" "blt 2f\n\t" - /* Put in mulitples of 8 bytes. */ + /* Put in multiples of 8 bytes. */ "1:\n\t" "ldr x8, [x4], -8\n\t" "subs x6, x6, 8\n\t" @@ -16689,14 +16699,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -17234,7 +17244,7 @@ "stp x3, x4, [%[r], 480]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 496]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -17476,7 +17486,7 @@ "stp x3, x4, [%[r]], #16\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r]], #16\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" "cmp %[a], x11\n\t" "b.ne 1b\n\t" : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) @@ -17641,7 +17651,7 @@ } #endif /* WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -18840,7 +18850,7 @@ "ldp x8, x9, [%[a], 504]\n\t" "adds x5, x5, x6\n\t" "adcs x7, x7, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x8, x8, x5\n\t" "str x8, [%[a], 504]\n\t" "adcs x9, x9, x7\n\t" @@ -19086,7 +19096,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -19100,7 +19110,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_64(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -19329,7 +19339,7 @@ #endif /* WOLFSSL_SP_SMALL */ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -19397,8 +19407,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_64_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -19732,7 +19742,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -20268,8 +20278,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_64(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -21862,114 +21872,104 @@ * a A single precision integer. * b A single precision integer. */ -static void sp_256_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b) +SP_NOINLINE static void sp_256_mul_4(sp_digit* r, const sp_digit* a, + const sp_digit* b) { - sp_digit tmp[4]; - __asm__ __volatile__ ( - "ldp x16, x17, [%[a], 0]\n\t" - "ldp x21, x22, [%[b], 0]\n\t" - "# A[0] * B[0]\n\t" - "mul x8, x16, x21\n\t" - "ldr x19, [%[a], 16]\n\t" - "umulh x9, x16, x21\n\t" - "ldr x23, [%[b], 16]\n\t" - "# A[0] * B[1]\n\t" - "mul x4, x16, x22\n\t" - "ldr x20, [%[a], 24]\n\t" - "umulh x5, x16, x22\n\t" - "ldr x24, [%[b], 24]\n\t" - "adds x9, x9, x4\n\t" - "# A[1] * B[0]\n\t" - "mul x4, x17, x21\n\t" - "adc x10, xzr, x5\n\t" - "umulh x5, x17, x21\n\t" - "adds x9, x9, x4\n\t" - "# A[0] * B[2]\n\t" - "mul x4, x16, x23\n\t" - "adcs x10, x10, x5\n\t" - "umulh x5, x16, x23\n\t" - "adc x11, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" - "# A[1] * B[1]\n\t" - "mul x4, x17, x22\n\t" - "adc x11, x11, x5\n\t" - "umulh x5, x17, x22\n\t" - "adds x10, x10, x4\n\t" - "# A[2] * B[0]\n\t" - "mul x4, x19, x21\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x19, x21\n\t" - "adc x12, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" - "# A[0] * B[3]\n\t" - "mul x4, x16, x24\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x16, x24\n\t" - "adc x12, x12, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * B[2]\n\t" - "mul x4, x17, x23\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x17, x23\n\t" - "adc x13, xzr, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[2] * B[1]\n\t" - "mul x4, x19, x22\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x19, x22\n\t" - "adc x13, x13, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[3] * B[0]\n\t" - "mul x4, x20, x21\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x20, x21\n\t" - "adc x13, x13, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * B[3]\n\t" - "mul x4, x17, x24\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x17, x24\n\t" - "adc x13, x13, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[2] * B[2]\n\t" - "mul x4, x19, x23\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x19, x23\n\t" - "adc x14, xzr, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[3] * B[1]\n\t" - "mul x4, x20, x22\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x20, x22\n\t" - "adc x14, x14, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[2] * B[3]\n\t" - "mul x4, x19, x24\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x19, x24\n\t" - "adc x14, x14, xzr\n\t" - "adds x13, x13, x4\n\t" - "# A[3] * B[2]\n\t" - "mul x4, x20, x23\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x20, x23\n\t" - "adc x15, xzr, xzr\n\t" - "adds x13, x13, x4\n\t" - "# A[3] * B[3]\n\t" - "mul x4, x20, x24\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x20, x24\n\t" - "adc x15, x15, xzr\n\t" - "adds x14, x14, x4\n\t" - "adc x15, x15, x5\n\t" - "stp x8, x9, [%[r], 0]\n\t" - "stp x10, x11, [%[r], 16]\n\t" - "stp x12, x13, [%[r], 32]\n\t" - "stp x14, x15, [%[r], 48]\n\t" + "ldp x13, x14, [%[a], 0]\n\t" + "ldp x15, x16, [%[a], 16]\n\t" + "ldp x17, x19, [%[b], 0]\n\t" + "ldp x20, x21, [%[b], 16]\n\t" + "# A[0] * B[0]\n\t" + "umulh x6, x13, x17\n\t" + "mul x5, x13, x17\n\t" + "# A[2] * B[0]\n\t" + "umulh x8, x15, x17\n\t" + "mul x7, x15, x17\n\t" + "# A[1] * B[0]\n\t" + "mul x3, x14, x17\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x14, x17\n\t" + "adcs x7, x7, x4\n\t" + "adc x8, x8, xzr\n\t" + "# A[0] * B[2]\n\t" + "mul x3, x13, x20\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x13, x20\n\t" + "adcs x8, x8, x4\n\t" + "# A[1] * B[3]\n\t" + "mul x9, x14, x21\n\t" + "adcs x9, x9, xzr\n\t" + "umulh x10, x14, x21\n\t" + "adc x10, x10, xzr\n\t" + "# A[0] * B[1]\n\t" + "mul x3, x13, x19\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x13, x19\n\t" + "adcs x7, x7, x4\n\t" + "# A[2] * B[1]\n\t" + "mul x3, x15, x19\n\t" + "adcs x8, x8, x3\n\t" + "umulh x4, x15, x19\n\t" + "adcs x9, x9, x4\n\t" + "adc x10, x10, xzr\n\t" + "# A[1] * B[2]\n\t" + "mul x3, x14, x20\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x14, x20\n\t" + "adcs x9, x9, x4\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, xzr, xzr\n\t" + "# A[1] * B[1]\n\t" + "mul x3, x14, x19\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x14, x19\n\t" + "adcs x8, x8, x4\n\t" + "# A[3] * B[1]\n\t" + "mul x3, x16, x19\n\t" + "adcs x9, x9, x3\n\t" + "umulh x4, x16, x19\n\t" + "adcs x10, x10, x4\n\t" + "adc x11, x11, xzr\n\t" + "# A[2] * B[2]\n\t" + "mul x3, x15, x20\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x15, x20\n\t" + "adcs x10, x10, x4\n\t" + "# A[3] * B[3]\n\t" + "mul x3, x16, x21\n\t" + "adcs x11, x11, x3\n\t" + "umulh x12, x16, x21\n\t" + "adc x12, x12, xzr\n\t" + "# A[0] * B[3]\n\t" + "mul x3, x13, x21\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x13, x21\n\t" + "adcs x9, x9, x4\n\t" + "# A[2] * B[3]\n\t" + "mul x3, x15, x21\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x15, x21\n\t" + "adcs x11, x11, x4\n\t" + "adc x12, x12, xzr\n\t" + "# A[3] * B[0]\n\t" + "mul x3, x16, x17\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x16, x17\n\t" + "adcs x9, x9, x4\n\t" + "# A[3] * B[2]\n\t" + "mul x3, x16, x20\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x16, x20\n\t" + "adcs x11, x11, x4\n\t" + "adc x12, x12, xzr\n\t" + "stp x5, x6, [%[r], 0]\n\t" + "stp x7, x8, [%[r], 16]\n\t" + "stp x9, x10, [%[r], 32]\n\t" + "stp x11, x12, [%[r], 48]\n\t" : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) - : "memory", "x4", "x5", "x6", "x7", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "cc" + : [r] "r" (r), [a] "r" (a), [b] "r" (b) + : "memory", "x3", "x4", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "cc" ); } @@ -21979,75 +21979,71 @@ * r A single precision integer. * a A single precision integer. */ -static void sp_256_sqr_4(sp_digit* r, const sp_digit* a) +SP_NOINLINE static void sp_256_sqr_4(sp_digit* r, const sp_digit* a) { __asm__ __volatile__ ( - "ldp x16, x17, [%[a], 0]\n\t" - "# A[0] * A[1]\n\t" - "mul x9, x16, x17\n\t" - "ldr x19, [%[a], 16]\n\t" - "umulh x10, x16, x17\n\t" - "ldr x20, [%[a], 24]\n\t" - "# A[0] * A[2]\n\t" - "mul x4, x16, x19\n\t" - "umulh x5, x16, x19\n\t" - "adds x10, x10, x4\n\t" - "# A[0] * A[3]\n\t" - "mul x4, x16, x20\n\t" - "adc x11, xzr, x5\n\t" - "umulh x5, x16, x20\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * A[2]\n\t" - "mul x4, x17, x19\n\t" - "adc x12, xzr, x5\n\t" - "umulh x5, x17, x19\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * A[3]\n\t" - "mul x4, x17, x20\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x17, x20\n\t" - "adc x13, xzr, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[2] * A[3]\n\t" - "mul x4, x19, x20\n\t" - "adc x13, x13, x5\n\t" - "umulh x5, x19, x20\n\t" - "adds x13, x13, x4\n\t" - "adc x14, xzr, x5\n\t" + "ldp x12, x13, [%[a], 0]\n\t" + "ldp x14, x15, [%[a], 16]\n\t" + "# A[0] * A[1]\n\t" + "umulh x6, x12, x13\n\t" + "mul x5, x12, x13\n\t" + "# A[0] * A[3]\n\t" + "umulh x8, x12, x15\n\t" + "mul x7, x12, x15\n\t" + "# A[0] * A[2]\n\t" + "mul x2, x12, x14\n\t" + "adds x6, x6, x2\n\t" + "umulh x3, x12, x14\n\t" + "adcs x7, x7, x3\n\t" + "# A[1] * A[3]\n\t" + "mul x2, x13, x15\n\t" + "adcs x8, x8, x2\n\t" + "umulh x9, x13, x15\n\t" + "adc x9, x9, xzr\n\t" + "# A[1] * A[2]\n\t" + "mul x2, x13, x14\n\t" + "adds x7, x7, x2\n\t" + "umulh x3, x13, x14\n\t" + "adcs x8, x8, x3\n\t" + "# A[2] * A[3]\n\t" + "mul x2, x14, x15\n\t" + "adcs x9, x9, x2\n\t" + "umulh x10, x14, x15\n\t" + "adc x10, x10, xzr\n\t" "# Double\n\t" - "adds x9, x9, x9\n\t" + "adds x5, x5, x5\n\t" + "adcs x6, x6, x6\n\t" + "adcs x7, x7, x7\n\t" + "adcs x8, x8, x8\n\t" + "adcs x9, x9, x9\n\t" "adcs x10, x10, x10\n\t" - "adcs x11, x11, x11\n\t" - "adcs x12, x12, x12\n\t" - "adcs x13, x13, x13\n\t" - "# A[0] * A[0]\n\t" - "mul x8, x16, x16\n\t" - "adcs x14, x14, x14\n\t" - "umulh x3, x16, x16\n\t" - "cset x15, cs\n\t" - "# A[1] * A[1]\n\t" - "mul x4, x17, x17\n\t" - "adds x9, x9, x3\n\t" - "umulh x5, x17, x17\n\t" - "adcs x10, x10, x4\n\t" - "# A[2] * A[2]\n\t" - "mul x6, x19, x19\n\t" - "adcs x11, x11, x5\n\t" - "umulh x7, x19, x19\n\t" - "adcs x12, x12, x6\n\t" - "# A[3] * A[3]\n\t" - "mul x16, x20, x20\n\t" - "adcs x13, x13, x7\n\t" - "umulh x17, x20, x20\n\t" - "adcs x14, x14, x16\n\t" - "adc x15, x15, x17\n\t" - "stp x8, x9, [%[r], 0]\n\t" - "stp x10, x11, [%[r], 16]\n\t" - "stp x12, x13, [%[r], 32]\n\t" - "stp x14, x15, [%[r], 48]\n\t" + "adc x11, xzr, xzr\n\t" + "# A[0] * A[0]\n\t" + "umulh x3, x12, x12\n\t" + "mul x4, x12, x12\n\t" + "# A[1] * A[1]\n\t" + "mul x2, x13, x13\n\t" + "adds x5, x5, x3\n\t" + "umulh x3, x13, x13\n\t" + "adcs x6, x6, x2\n\t" + "# A[2] * A[2]\n\t" + "mul x2, x14, x14\n\t" + "adcs x7, x7, x3\n\t" + "umulh x3, x14, x14\n\t" + "adcs x8, x8, x2\n\t" + "# A[3] * A[3]\n\t" + "mul x2, x15, x15\n\t" + "adcs x9, x9, x3\n\t" + "umulh x3, x15, x15\n\t" + "adcs x10, x10, x2\n\t" + "adc x11, x11, x3\n\t" + "stp x4, x5, [%[r], 0]\n\t" + "stp x6, x7, [%[r], 16]\n\t" + "stp x8, x9, [%[r], 32]\n\t" + "stp x10, x11, [%[r], 48]\n\t" : : [r] "r" (r), [a] "r" (a) - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "cc" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "cc" ); } @@ -22071,7 +22067,7 @@ "stp x3, x4, [%[r], 0]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 16]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -22198,14 +22194,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -22424,183 +22420,173 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -SP_NOINLINE static void sp_256_mont_mul_4(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_mul_4(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m, sp_digit mp) { (void)m; (void)mp; __asm__ __volatile__ ( - "ldp x16, x17, [%[a], 0]\n\t" - "ldp x21, x22, [%[b], 0]\n\t" - "# A[0] * B[0]\n\t" - "mul x8, x16, x21\n\t" - "ldr x19, [%[a], 16]\n\t" - "umulh x9, x16, x21\n\t" - "ldr x23, [%[b], 16]\n\t" - "# A[0] * B[1]\n\t" - "mul x4, x16, x22\n\t" - "ldr x20, [%[a], 24]\n\t" - "umulh x5, x16, x22\n\t" - "ldr x24, [%[b], 24]\n\t" - "adds x9, x9, x4\n\t" - "# A[1] * B[0]\n\t" - "mul x4, x17, x21\n\t" - "adc x10, xzr, x5\n\t" - "umulh x5, x17, x21\n\t" - "adds x9, x9, x4\n\t" - "# A[0] * B[2]\n\t" - "mul x4, x16, x23\n\t" - "adcs x10, x10, x5\n\t" - "umulh x5, x16, x23\n\t" - "adc x11, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" - "# A[1] * B[1]\n\t" - "mul x4, x17, x22\n\t" - "adc x11, x11, x5\n\t" - "umulh x5, x17, x22\n\t" - "adds x10, x10, x4\n\t" - "# A[2] * B[0]\n\t" - "mul x4, x19, x21\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x19, x21\n\t" - "adc x12, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" - "# A[0] * B[3]\n\t" - "mul x4, x16, x24\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x16, x24\n\t" - "adc x12, x12, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * B[2]\n\t" - "mul x4, x17, x23\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x17, x23\n\t" - "adc x13, xzr, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[2] * B[1]\n\t" - "mul x4, x19, x22\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x19, x22\n\t" - "adc x13, x13, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[3] * B[0]\n\t" - "mul x4, x20, x21\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x20, x21\n\t" - "adc x13, x13, xzr\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * B[3]\n\t" - "mul x4, x17, x24\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x17, x24\n\t" - "adc x13, x13, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[2] * B[2]\n\t" - "mul x4, x19, x23\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x19, x23\n\t" - "adc x14, xzr, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[3] * B[1]\n\t" - "mul x4, x20, x22\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x20, x22\n\t" - "adc x14, x14, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[2] * B[3]\n\t" - "mul x4, x19, x24\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x19, x24\n\t" - "adc x14, x14, xzr\n\t" - "adds x13, x13, x4\n\t" - "# A[3] * B[2]\n\t" - "mul x4, x20, x23\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x20, x23\n\t" - "adc x15, xzr, xzr\n\t" - "adds x13, x13, x4\n\t" - "# A[3] * B[3]\n\t" - "mul x4, x20, x24\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x20, x24\n\t" - "adc x15, x15, xzr\n\t" - "adds x14, x14, x4\n\t" - "mov x4, x8\n\t" - "adc x15, x15, x5\n\t" + "ldp x13, x14, [%[a], 0]\n\t" + "ldp x15, x16, [%[a], 16]\n\t" + "ldp x17, x19, [%[b], 0]\n\t" + "ldp x20, x21, [%[b], 16]\n\t" + "# A[0] * B[0]\n\t" + "umulh x6, x13, x17\n\t" + "mul x5, x13, x17\n\t" + "# A[2] * B[0]\n\t" + "umulh x8, x15, x17\n\t" + "mul x7, x15, x17\n\t" + "# A[1] * B[0]\n\t" + "mul x3, x14, x17\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x14, x17\n\t" + "adcs x7, x7, x4\n\t" + "adc x8, x8, xzr\n\t" + "# A[0] * B[2]\n\t" + "mul x3, x13, x20\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x13, x20\n\t" + "adcs x8, x8, x4\n\t" + "# A[1] * B[3]\n\t" + "mul x9, x14, x21\n\t" + "adcs x9, x9, xzr\n\t" + "umulh x10, x14, x21\n\t" + "adc x10, x10, xzr\n\t" + "# A[0] * B[1]\n\t" + "mul x3, x13, x19\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x13, x19\n\t" + "adcs x7, x7, x4\n\t" + "# A[2] * B[1]\n\t" + "mul x3, x15, x19\n\t" + "adcs x8, x8, x3\n\t" + "umulh x4, x15, x19\n\t" + "adcs x9, x9, x4\n\t" + "adc x10, x10, xzr\n\t" + "# A[1] * B[2]\n\t" + "mul x3, x14, x20\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x14, x20\n\t" + "adcs x9, x9, x4\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, xzr, xzr\n\t" + "# A[1] * B[1]\n\t" + "mul x3, x14, x19\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x14, x19\n\t" + "adcs x8, x8, x4\n\t" + "# A[3] * B[1]\n\t" + "mul x3, x16, x19\n\t" + "adcs x9, x9, x3\n\t" + "umulh x4, x16, x19\n\t" + "adcs x10, x10, x4\n\t" + "adc x11, x11, xzr\n\t" + "# A[2] * B[2]\n\t" + "mul x3, x15, x20\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x15, x20\n\t" + "adcs x10, x10, x4\n\t" + "# A[3] * B[3]\n\t" + "mul x3, x16, x21\n\t" + "adcs x11, x11, x3\n\t" + "umulh x12, x16, x21\n\t" + "adc x12, x12, xzr\n\t" + "# A[0] * B[3]\n\t" + "mul x3, x13, x21\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x13, x21\n\t" + "adcs x9, x9, x4\n\t" + "# A[2] * B[3]\n\t" + "mul x3, x15, x21\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x15, x21\n\t" + "adcs x11, x11, x4\n\t" + "adc x12, x12, xzr\n\t" + "# A[3] * B[0]\n\t" + "mul x3, x16, x17\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x16, x17\n\t" + "adcs x9, x9, x4\n\t" + "# A[3] * B[2]\n\t" + "mul x3, x16, x20\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x16, x20\n\t" + "adcs x11, x11, x4\n\t" + "mov x3, x5\n\t" + "adc x12, x12, xzr\n\t" "# Start Reduction\n\t" - "mov x5, x9\n\t" - "mov x6, x10\n\t" + "mov x4, x6\n\t" + "mov x13, x7\n\t" "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t" "# - a[0] << 32 << 192\n\t" "# + (a[0] * 2) << 192\n\t" "# a[0]-a[2] << 32\n\t" - "extr x22, x10, x9, 32\n\t" - "add x7, x11, x8\n\t" - "extr x21, x9, x8, 32\n\t" - "add x7, x7, x8\n\t" + "lsl x15, x5, #32\n\t" + "extr x17, x7, x6, 32\n\t" + "add x14, x8, x5\n\t" + "extr x16, x6, x5, 32\n\t" + "add x14, x14, x5\n\t" "# + a[0]-a[2] << 32 << 64\n\t" "# - a[0] << 32 << 192\n\t" - "adds x5, x5, x8, lsl #32\n\t" - "sub x7, x7, x8, lsl #32\n\t" - "adcs x6, x6, x21\n\t" - "adc x7, x7, x22\n\t" + "adds x4, x4, x15\n\t" + "sub x14, x14, x15\n\t" + "adcs x13, x13, x16\n\t" + "adc x14, x14, x17\n\t" "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t" "# a += mu << 256\n\t" - "adds x12, x12, x4\n\t" - "adcs x13, x13, x5\n\t" - "adcs x14, x14, x6\n\t" - "adcs x15, x15, x7\n\t" - "cset x8, cs\n\t" + "adds x9, x9, x3\n\t" + "adcs x10, x10, x4\n\t" + "adcs x11, x11, x13\n\t" + "adcs x12, x12, x14\n\t" + "adc x5, xzr, xzr\n\t" "# a += mu << 192\n\t" "# mu <<= 32\n\t" "# a += (mu << 32) << 64\n\t" - "adds x11, x11, x4\n\t" - "adcs x12, x12, x5\n\t" - "adcs x13, x13, x6\n\t" - "lsr x16, x7, 32\n\t" - "adcs x14, x14, x7\n\t" - "extr x7, x7, x6, 32\n\t" - "adcs x15, x15, xzr\n\t" - "extr x6, x6, x5, 32\n\t" - "adc x8, x8, xzr\n\t" - "extr x5, x5, x4, 32\n\t" - "lsl x4, x4, 32\n\t" - "adds x9, x9, x4\n\t" - "adcs x10, x10, x5\n\t" - "adcs x11, x11, x6\n\t" - "adcs x12, x12, x7\n\t" - "adcs x13, x13, x16\n\t" - "adcs x14, x14, xzr\n\t" - "adcs x15, x15, xzr\n\t" - "adc x8, x8, xzr\n\t" + "adds x8, x8, x3\n\t" + "extr x16, x14, x13, 32\n\t" + "adcs x9, x9, x4\n\t" + "extr x15, x13, x4, 32\n\t" + "adcs x10, x10, x13\n\t" + "extr x4, x4, x3, 32\n\t" + "adcs x11, x11, x14\n\t" + "lsl x3, x3, 32\n\t" + "adc x13, xzr, xzr\n\t" + "adds x6, x6, x3\n\t" + "lsr x17, x14, 32\n\t" + "adcs x7, x7, x4\n\t" + "adcs x8, x8, x15\n\t" + "adcs x9, x9, x16\n\t" + "adcs x10, x10, x17\n\t" + "adcs x11, x11, xzr\n\t" + "adcs x12, x12, x13\n\t" + "adc x5, x5, xzr\n\t" "# a -= (mu << 32) << 192\n\t" - "subs x11, x11, x4\n\t" - "sbcs x12, x12, x5\n\t" - "sbcs x13, x13, x6\n\t" - "sbcs x14, x14, x7\n\t" - "sbcs x15, x15, x16\n\t" - "mov x19, 0xffffffff00000001\n\t" - "sbc x8, x8, xzr\n\t" - "neg x8, x8\n\t" + "subs x8, x8, x3\n\t" + "sbcs x9, x9, x4\n\t" + "sbcs x10, x10, x15\n\t" + "sbcs x11, x11, x16\n\t" + "sbcs x12, x12, x17\n\t" + "sbc x5, x5, xzr\n\t" + "neg x5, x5\n\t" "# mask m and sub from result if overflow\n\t" "# m[0] = -1 & mask = mask\n\t" - "subs x12, x12, x8\n\t" + "subs x9, x9, x5\n\t" "# m[1] = 0xffffffff & mask = mask >> 32 as mask is all 1s or 0s\n\t" - "lsr x17, x8, 32\n\t" - "sbcs x13, x13, x17\n\t" - "and x19, x19, x8\n\t" + "lsr x16, x5, 32\n\t" + "sbcs x10, x10, x16\n\t" + "sub x17, xzr, x16\n\t" "# m[2] = 0 & mask = 0\n\t" - "sbcs x14, x14, xzr\n\t" - "stp x12, x13, [%[r], 0]\n\t" + "sbcs x11, x11, xzr\n\t" + "stp x9, x10, [%[r], 0]\n\t" "# m[3] = 0xffffffff00000001 & mask\n\t" - "sbc x15, x15, x19\n\t" - "stp x14, x15, [%[r], 16]\n\t" - : [a] "+r" (a), [b] "+r" (b) - : [r] "r" (r) - : "memory", "x4", "x5", "x6", "x7", "x16", "x17", "x19", "x20", "x21", "x22", "x23", "x24", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "cc" + "sbc x12, x12, x17\n\t" + "stp x11, x12, [%[r], 16]\n\t" + : + : [r] "r" (r), [a] "r" (a), [b] "r" (b) + : "memory", "x3", "x4", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "cc" ); } @@ -22609,146 +22595,141 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -SP_NOINLINE static void sp_256_mont_sqr_4(sp_digit* r, const sp_digit* a, const sp_digit* m, - sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_4(sp_digit* r, const sp_digit* a, + const sp_digit* m, sp_digit mp) { (void)m; (void)mp; __asm__ __volatile__ ( - "ldp x16, x17, [%[a], 0]\n\t" - "# A[0] * A[1]\n\t" - "mul x9, x16, x17\n\t" - "ldr x19, [%[a], 16]\n\t" - "umulh x10, x16, x17\n\t" - "ldr x20, [%[a], 24]\n\t" - "# A[0] * A[2]\n\t" - "mul x4, x16, x19\n\t" - "umulh x5, x16, x19\n\t" - "adds x10, x10, x4\n\t" - "# A[0] * A[3]\n\t" - "mul x4, x16, x20\n\t" - "adc x11, xzr, x5\n\t" - "umulh x5, x16, x20\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * A[2]\n\t" - "mul x4, x17, x19\n\t" - "adc x12, xzr, x5\n\t" - "umulh x5, x17, x19\n\t" - "adds x11, x11, x4\n\t" - "# A[1] * A[3]\n\t" - "mul x4, x17, x20\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x17, x20\n\t" - "adc x13, xzr, xzr\n\t" - "adds x12, x12, x4\n\t" - "# A[2] * A[3]\n\t" - "mul x4, x19, x20\n\t" - "adc x13, x13, x5\n\t" - "umulh x5, x19, x20\n\t" - "adds x13, x13, x4\n\t" - "adc x14, xzr, x5\n\t" + "ldp x12, x13, [%[a], 0]\n\t" + "ldp x14, x15, [%[a], 16]\n\t" + "# A[0] * A[1]\n\t" + "umulh x6, x12, x13\n\t" + "mul x5, x12, x13\n\t" + "# A[0] * A[3]\n\t" + "umulh x8, x12, x15\n\t" + "mul x7, x12, x15\n\t" + "# A[0] * A[2]\n\t" + "mul x2, x12, x14\n\t" + "adds x6, x6, x2\n\t" + "umulh x3, x12, x14\n\t" + "adcs x7, x7, x3\n\t" + "# A[1] * A[3]\n\t" + "mul x2, x13, x15\n\t" + "adcs x8, x8, x2\n\t" + "umulh x9, x13, x15\n\t" + "adc x9, x9, xzr\n\t" + "# A[1] * A[2]\n\t" + "mul x2, x13, x14\n\t" + "adds x7, x7, x2\n\t" + "umulh x3, x13, x14\n\t" + "adcs x8, x8, x3\n\t" + "# A[2] * A[3]\n\t" + "mul x2, x14, x15\n\t" + "adcs x9, x9, x2\n\t" + "umulh x10, x14, x15\n\t" + "adc x10, x10, xzr\n\t" "# Double\n\t" - "adds x9, x9, x9\n\t" + "adds x5, x5, x5\n\t" + "adcs x6, x6, x6\n\t" + "adcs x7, x7, x7\n\t" + "adcs x8, x8, x8\n\t" + "adcs x9, x9, x9\n\t" "adcs x10, x10, x10\n\t" - "adcs x11, x11, x11\n\t" - "adcs x12, x12, x12\n\t" - "adcs x13, x13, x13\n\t" - "# A[0] * A[0]\n\t" - "mul x8, x16, x16\n\t" - "adcs x14, x14, x14\n\t" - "umulh x3, x16, x16\n\t" - "cset x15, cs\n\t" - "# A[1] * A[1]\n\t" - "mul x4, x17, x17\n\t" - "adds x9, x9, x3\n\t" - "umulh x5, x17, x17\n\t" - "adcs x10, x10, x4\n\t" - "# A[2] * A[2]\n\t" - "mul x6, x19, x19\n\t" - "adcs x11, x11, x5\n\t" - "umulh x7, x19, x19\n\t" - "adcs x12, x12, x6\n\t" - "# A[3] * A[3]\n\t" - "mul x16, x20, x20\n\t" - "adcs x13, x13, x7\n\t" - "umulh x17, x20, x20\n\t" - "adcs x14, x14, x16\n\t" - "mov x3, x8\n\t" - "adc x15, x15, x17\n\t" + "adc x11, xzr, xzr\n\t" + "# A[0] * A[0]\n\t" + "umulh x3, x12, x12\n\t" + "mul x4, x12, x12\n\t" + "# A[1] * A[1]\n\t" + "mul x2, x13, x13\n\t" + "adds x5, x5, x3\n\t" + "umulh x3, x13, x13\n\t" + "adcs x6, x6, x2\n\t" + "# A[2] * A[2]\n\t" + "mul x2, x14, x14\n\t" + "adcs x7, x7, x3\n\t" + "umulh x3, x14, x14\n\t" + "adcs x8, x8, x2\n\t" + "# A[3] * A[3]\n\t" + "mul x2, x15, x15\n\t" + "adcs x9, x9, x3\n\t" + "umulh x3, x15, x15\n\t" + "adcs x10, x10, x2\n\t" + "mov x2, x4\n\t" + "adc x11, x11, x3\n\t" "# Start Reduction\n\t" - "mov x4, x9\n\t" - "mov x5, x10\n\t" + "mov x3, x5\n\t" + "mov x12, x6\n\t" "# mu = a[0]-a[3] + a[0]-a[2] << 32 << 64 + (a[0] * 2) << 192\n\t" "# - a[0] << 32 << 192\n\t" "# + (a[0] * 2) << 192\n\t" "# a[0]-a[2] << 32\n\t" - "extr x21, x10, x9, 32\n\t" - "add x6, x11, x8\n\t" - "extr x20, x9, x8, 32\n\t" - "add x6, x6, x8\n\t" + "lsl x14, x4, #32\n\t" + "extr x16, x6, x5, 32\n\t" + "add x13, x7, x4\n\t" + "extr x15, x5, x4, 32\n\t" + "add x13, x13, x4\n\t" "# + a[0]-a[2] << 32 << 64\n\t" "# - a[0] << 32 << 192\n\t" - "adds x4, x4, x8, lsl #32\n\t" - "sub x6, x6, x8, lsl #32\n\t" - "adcs x5, x5, x20\n\t" - "adc x6, x6, x21\n\t" + "adds x3, x3, x14\n\t" + "sub x13, x13, x14\n\t" + "adcs x12, x12, x15\n\t" + "adc x13, x13, x16\n\t" "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t" "# a += mu << 256\n\t" - "adds x12, x12, x3\n\t" - "adcs x13, x13, x4\n\t" - "adcs x14, x14, x5\n\t" - "adcs x15, x15, x6\n\t" - "cset x8, cs\n\t" + "adds x8, x8, x2\n\t" + "adcs x9, x9, x3\n\t" + "adcs x10, x10, x12\n\t" + "adcs x11, x11, x13\n\t" + "adc x4, xzr, xzr\n\t" "# a += mu << 192\n\t" "# mu <<= 32\n\t" "# a += (mu << 32) << 64\n\t" - "adds x11, x11, x3\n\t" - "adcs x12, x12, x4\n\t" - "adcs x13, x13, x5\n\t" - "lsr x7, x6, 32\n\t" - "adcs x14, x14, x6\n\t" - "extr x6, x6, x5, 32\n\t" - "adcs x15, x15, xzr\n\t" - "extr x5, x5, x4, 32\n\t" - "adc x8, x8, xzr\n\t" - "extr x4, x4, x3, 32\n\t" - "lsl x3, x3, 32\n\t" - "adds x9, x9, x3\n\t" - "adcs x10, x10, x4\n\t" - "adcs x11, x11, x5\n\t" - "adcs x12, x12, x6\n\t" - "adcs x13, x13, x7\n\t" - "adcs x14, x14, xzr\n\t" - "adcs x15, x15, xzr\n\t" - "adc x8, x8, xzr\n\t" + "adds x7, x7, x2\n\t" + "extr x15, x13, x12, 32\n\t" + "adcs x8, x8, x3\n\t" + "extr x14, x12, x3, 32\n\t" + "adcs x9, x9, x12\n\t" + "extr x3, x3, x2, 32\n\t" + "adcs x10, x10, x13\n\t" + "lsl x2, x2, 32\n\t" + "adc x12, xzr, xzr\n\t" + "adds x5, x5, x2\n\t" + "lsr x16, x13, 32\n\t" + "adcs x6, x6, x3\n\t" + "adcs x7, x7, x14\n\t" + "adcs x8, x8, x15\n\t" + "adcs x9, x9, x16\n\t" + "adcs x10, x10, xzr\n\t" + "adcs x11, x11, x12\n\t" + "adc x4, x4, xzr\n\t" "# a -= (mu << 32) << 192\n\t" - "subs x11, x11, x3\n\t" - "sbcs x12, x12, x4\n\t" - "sbcs x13, x13, x5\n\t" - "sbcs x14, x14, x6\n\t" - "sbcs x15, x15, x7\n\t" - "mov x17, 0xffffffff00000001\n\t" - "sbc x8, x8, xzr\n\t" - "neg x8, x8\n\t" + "subs x7, x7, x2\n\t" + "sbcs x8, x8, x3\n\t" + "sbcs x9, x9, x14\n\t" + "sbcs x10, x10, x15\n\t" + "sbcs x11, x11, x16\n\t" + "sbc x4, x4, xzr\n\t" + "neg x4, x4\n\t" "# mask m and sub from result if overflow\n\t" "# m[0] = -1 & mask = mask\n\t" - "subs x12, x12, x8\n\t" + "subs x8, x8, x4\n\t" "# m[1] = 0xffffffff & mask = mask >> 32 as mask is all 1s or 0s\n\t" - "lsr x16, x8, 32\n\t" - "sbcs x13, x13, x16\n\t" - "and x17, x17, x8\n\t" + "lsr x15, x4, 32\n\t" + "sbcs x9, x9, x15\n\t" + "sub x16, xzr, x15\n\t" "# m[2] = 0 & mask = 0\n\t" - "sbcs x14, x14, xzr\n\t" - "stp x12, x13, [%[r], 0]\n\t" + "sbcs x10, x10, xzr\n\t" + "stp x8, x9, [%[r], 0]\n\t" "# m[3] = 0xffffffff00000001 & mask\n\t" - "sbc x15, x15, x17\n\t" - "stp x14, x15, [%[r], 16]\n\t" + "sbc x11, x11, x16\n\t" + "stp x10, x11, [%[r], 16]\n\t" : : [r] "r" (r), [a] "r" (a) - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "cc" + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "cc" ); } @@ -22759,10 +22740,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_4(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_4(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_4(r, a, m, mp); for (; n > 1; n--) { @@ -22990,52 +22971,51 @@ "# - a[0] << 32 << 192\n\t" "# + (a[0] * 2) << 192\n\t" "# a[0]-a[2] << 32\n\t" - "extr x20, x12, x11, 32\n\t" + "lsl x7, x10, #32\n\t" + "extr x9, x12, x11, 32\n\t" "add x6, x13, x10\n\t" - "extr x19, x11, x10, 32\n\t" + "extr x8, x11, x10, 32\n\t" "add x6, x6, x10\n\t" "# + a[0]-a[2] << 32 << 64\n\t" "# - a[0] << 32 << 192\n\t" - "adds x4, x4, x10, lsl #32\n\t" - "sub x6, x6, x10, lsl #32\n\t" - "adcs x5, x5, x19\n\t" - "adc x6, x6, x20\n\t" + "adds x4, x4, x7\n\t" + "sub x6, x6, x7\n\t" + "adcs x5, x5, x8\n\t" + "adc x6, x6, x9\n\t" "# a += (mu << 256) - (mu << 224) + (mu << 192) + (mu << 96) - mu\n\t" "# a += mu << 256\n\t" "adds x14, x14, x3\n\t" "adcs x15, x15, x4\n\t" "adcs x16, x16, x5\n\t" "adcs x17, x17, x6\n\t" - "cset x10, cs\n\t" + "adc x10, xzr, xzr\n\t" "# a += mu << 192\n\t" "# mu <<= 32\n\t" "# a += (mu << 32) << 64\n\t" "adds x13, x13, x3\n\t" + "extr x8, x6, x5, 32\n\t" "adcs x14, x14, x4\n\t" + "extr x7, x5, x4, 32\n\t" "adcs x15, x15, x5\n\t" - "lsr x7, x6, 32\n\t" - "adcs x16, x16, x6\n\t" - "extr x6, x6, x5, 32\n\t" - "adcs x17, x17, xzr\n\t" - "extr x5, x5, x4, 32\n\t" - "adc x10, x10, xzr\n\t" "extr x4, x4, x3, 32\n\t" - "lsl x3, x3, 32\n\t" + "adcs x16, x16, x6\n\t" + "lsl x3, x3, 32\n\t" + "adc x5, xzr, xzr\n\t" "adds x11, x11, x3\n\t" + "lsr x9, x6, 32\n\t" "adcs x12, x12, x4\n\t" - "adcs x13, x13, x5\n\t" - "adcs x14, x14, x6\n\t" - "adcs x15, x15, x7\n\t" + "adcs x13, x13, x7\n\t" + "adcs x14, x14, x8\n\t" + "adcs x15, x15, x9\n\t" "adcs x16, x16, xzr\n\t" - "adcs x17, x17, xzr\n\t" + "adcs x17, x17, x5\n\t" "adc x10, x10, xzr\n\t" "# a -= (mu << 32) << 192\n\t" "subs x13, x13, x3\n\t" "sbcs x14, x14, x4\n\t" - "sbcs x15, x15, x5\n\t" - "sbcs x16, x16, x6\n\t" - "sbcs x17, x17, x7\n\t" - "mov x9, 0xffffffff00000001\n\t" + "sbcs x15, x15, x7\n\t" + "sbcs x16, x16, x8\n\t" + "sbcs x17, x17, x9\n\t" "sbc x10, x10, xzr\n\t" "neg x10, x10\n\t" "# mask m and sub from result if overflow\n\t" @@ -23044,7 +23024,7 @@ "# m[1] = 0xffffffff & mask = mask >> 32 as mask is all 1s or 0s\n\t" "lsr x8, x10, 32\n\t" "sbcs x15, x15, x8\n\t" - "and x9, x9, x10\n\t" + "sub x9, xzr, x8\n\t" "# m[2] = 0 & mask = 0\n\t" "sbcs x16, x16, xzr\n\t" "stp x14, x15, [%[a], 0]\n\t" @@ -23056,162 +23036,6 @@ : "memory", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x19", "x20", "cc" ); } -/* Reduce the number back to 256 bits using Montgomery reduction. - * - * a A single precision number to reduce in place. - * m The single precision number representing the modulus. - * mp The digit representing the negative inverse of m mod 2^n. - */ -SP_NOINLINE static void sp_256_mont_reduce_order_4(sp_digit* a, const sp_digit* m, - sp_digit mp) -{ - __asm__ __volatile__ ( - "ldp x9, x10, [%[a], 0]\n\t" - "ldp x11, x12, [%[a], 16]\n\t" - "ldp x17, x19, [%[m], 0]\n\t" - "ldp x20, x21, [%[m], 16]\n\t" - "mov x8, xzr\n\t" - "# mu = a[0] * mp\n\t" - "mul x5, %[mp], x9\n\t" - "ldr x13, [%[a], 32]\n\t" - "# a[0+0] += m[0] * mu\n\t" - "mul x3, x17, x5\n\t" - "ldr x14, [%[a], 40]\n\t" - "umulh x6, x17, x5\n\t" - "ldr x15, [%[a], 48]\n\t" - "adds x9, x9, x3\n\t" - "ldr x16, [%[a], 56]\n\t" - "adc x6, x6, xzr\n\t" - "# a[0+1] += m[1] * mu\n\t" - "mul x3, x19, x5\n\t" - "umulh x7, x19, x5\n\t" - "adds x3, x3, x6\n\t" - "adc x7, x7, xzr\n\t" - "adds x10, x10, x3\n\t" - "adc x7, x7, xzr\n\t" - "# a[0+2] += m[2] * mu\n\t" - "mul x3, x20, x5\n\t" - "umulh x6, x20, x5\n\t" - "adds x3, x3, x7\n\t" - "adc x6, x6, xzr\n\t" - "adds x11, x11, x3\n\t" - "adc x6, x6, xzr\n\t" - "# a[0+3] += m[3] * mu\n\t" - "mul x3, x21, x5\n\t" - "umulh x4, x21, x5\n\t" - "adds x3, x3, x6\n\t" - "adcs x4, x4, x8\n\t" - "cset x8, cs\n\t" - "adds x12, x12, x3\n\t" - "adcs x13, x13, x4\n\t" - "adc x8, x8, xzr\n\t" - "# mu = a[1] * mp\n\t" - "mul x5, %[mp], x10\n\t" - "# a[1+0] += m[0] * mu\n\t" - "mul x3, x17, x5\n\t" - "umulh x6, x17, x5\n\t" - "adds x10, x10, x3\n\t" - "adc x6, x6, xzr\n\t" - "# a[1+1] += m[1] * mu\n\t" - "mul x3, x19, x5\n\t" - "umulh x7, x19, x5\n\t" - "adds x3, x3, x6\n\t" - "adc x7, x7, xzr\n\t" - "adds x11, x11, x3\n\t" - "adc x7, x7, xzr\n\t" - "# a[1+2] += m[2] * mu\n\t" - "mul x3, x20, x5\n\t" - "umulh x6, x20, x5\n\t" - "adds x3, x3, x7\n\t" - "adc x6, x6, xzr\n\t" - "adds x12, x12, x3\n\t" - "adc x6, x6, xzr\n\t" - "# a[1+3] += m[3] * mu\n\t" - "mul x3, x21, x5\n\t" - "umulh x4, x21, x5\n\t" - "adds x3, x3, x6\n\t" - "adcs x4, x4, x8\n\t" - "cset x8, cs\n\t" - "adds x13, x13, x3\n\t" - "adcs x14, x14, x4\n\t" - "adc x8, x8, xzr\n\t" - "# mu = a[2] * mp\n\t" - "mul x5, %[mp], x11\n\t" - "# a[2+0] += m[0] * mu\n\t" - "mul x3, x17, x5\n\t" - "umulh x6, x17, x5\n\t" - "adds x11, x11, x3\n\t" - "adc x6, x6, xzr\n\t" - "# a[2+1] += m[1] * mu\n\t" - "mul x3, x19, x5\n\t" - "umulh x7, x19, x5\n\t" - "adds x3, x3, x6\n\t" - "adc x7, x7, xzr\n\t" - "adds x12, x12, x3\n\t" - "adc x7, x7, xzr\n\t" - "# a[2+2] += m[2] * mu\n\t" - "mul x3, x20, x5\n\t" - "umulh x6, x20, x5\n\t" - "adds x3, x3, x7\n\t" - "adc x6, x6, xzr\n\t" - "adds x13, x13, x3\n\t" - "adc x6, x6, xzr\n\t" - "# a[2+3] += m[3] * mu\n\t" - "mul x3, x21, x5\n\t" - "umulh x4, x21, x5\n\t" - "adds x3, x3, x6\n\t" - "adcs x4, x4, x8\n\t" - "cset x8, cs\n\t" - "adds x14, x14, x3\n\t" - "adcs x15, x15, x4\n\t" - "adc x8, x8, xzr\n\t" - "# mu = a[3] * mp\n\t" - "mul x5, %[mp], x12\n\t" - "# a[3+0] += m[0] * mu\n\t" - "mul x3, x17, x5\n\t" - "umulh x6, x17, x5\n\t" - "adds x12, x12, x3\n\t" - "adc x6, x6, xzr\n\t" - "# a[3+1] += m[1] * mu\n\t" - "mul x3, x19, x5\n\t" - "umulh x7, x19, x5\n\t" - "adds x3, x3, x6\n\t" - "adc x7, x7, xzr\n\t" - "adds x13, x13, x3\n\t" - "adc x7, x7, xzr\n\t" - "# a[3+2] += m[2] * mu\n\t" - "mul x3, x20, x5\n\t" - "umulh x6, x20, x5\n\t" - "adds x3, x3, x7\n\t" - "adc x6, x6, xzr\n\t" - "adds x14, x14, x3\n\t" - "adc x6, x6, xzr\n\t" - "# a[3+3] += m[3] * mu\n\t" - "mul x3, x21, x5\n\t" - "umulh x4, x21, x5\n\t" - "adds x3, x3, x6\n\t" - "adcs x4, x4, x8\n\t" - "cset x8, cs\n\t" - "adds x15, x15, x3\n\t" - "adcs x16, x16, x4\n\t" - "adc x8, x8, xzr\n\t" - "sub x3, xzr, x8\n\t" - "and x17, x17, x3\n\t" - "and x19, x19, x3\n\t" - "and x20, x20, x3\n\t" - "and x21, x21, x3\n\t" - "subs x13, x13, x17\n\t" - "sbcs x14, x14, x19\n\t" - "sbcs x15, x15, x20\n\t" - "stp x13, x14, [%[a], 0]\n\t" - "sbc x16, x16, x21\n\t" - "stp x15, x16, [%[a], 16]\n\t" - : - : [a] "r" (a), [m] "r" (m), [mp] "r" (mp) - : "memory", "x3", "x4", "x5", "x8", "x6", "x7", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "cc" - ); -} - /* Map the Montgomery form projective coordinate point to an affine point. * * r Resulting affine coordinate point. @@ -23252,69 +23076,42 @@ r->z[0] = 1; } -/* Add two Montgomery form numbers (r = a + b % m). - * - * r Result of addition. - * a First number to add in Montgomery form. - * b Second number to add in Montgomery form. - * m Modulus (prime). - */ -static void sp_256_mont_add_4(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) -{ - __asm__ __volatile__ ( - "ldp x4, x5, [%[a], 0]\n\t" - "ldp x8, x9, [%[b], 0]\n\t" - "adds x4, x4, x8\n\t" - "ldp x6, x7, [%[a], 16]\n\t" - "adcs x5, x5, x9\n\t" - "ldp x10, x11, [%[b], 16]\n\t" - "adcs x6, x6, x10\n\t" - "adcs x7, x7, x11\n\t" - "mov x13, 0xffffffff00000001\n\t" - "csetm x14, cs\n\t" - "subs x4, x4, x14\n\t" - "lsr x12, x14, 32\n\t" - "sbcs x5, x5, x12\n\t" - "and x13, x13, x14\n\t" - "sbcs x6, x6, xzr\n\t" - "stp x4, x5, [%[r],0]\n\t" - "sbc x7, x7, x13\n\t" - "stp x6, x7, [%[r],16]\n\t" - : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "cc" - ); -} - /* Double a Montgomery form number (r = a + a % m). * * r Result of doubling. * a Number to double in Montgomery form. * m Modulus (prime). */ -static void sp_256_mont_dbl_4(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_256_mont_dbl_4(sp_digit* r, const sp_digit* a, + const sp_digit* m) { __asm__ __volatile__ ( "ldp x3, x4, [%[a]]\n\t" "ldp x5, x6, [%[a],16]\n\t" - "adds x3, x3, x3\n\t" - "adcs x4, x4, x4\n\t" - "adcs x5, x5, x5\n\t" - "adcs x6, x6, x6\n\t" - "mov x8, 0xffffffff00000001\n\t" - "csetm x9, cs\n\t" - "subs x3, x3, x9\n\t" - "lsr x7, x9, 32\n\t" - "sbcs x4, x4, x7\n\t" - "and x8, x8, x9\n\t" - "sbcs x5, x5, xzr\n\t" - "stp x3, x4, [%[r],0]\n\t" - "sbc x6, x6, x8\n\t" - "stp x5, x6, [%[r],16]\n\t" + "lsl x9, x3, #1\n\t" + "extr x10, x4, x3, #63\n\t" + "extr x11, x5, x4, #63\n\t" + "asr x13, x6, #63\n\t" + "extr x12, x6, x5, #63\n\t" + "subs x9, x9, x13\n\t" + "lsr x7, x13, 32\n\t" + "sbcs x10, x10, x7\n\t" + "sub x8, xzr, x7\n\t" + "sbcs x11, x11, xzr\n\t" + "sbcs x12, x12, x8\n\t" + "sbc x8, xzr, xzr\n\t" + "sub x13, x13, x8\n\t" + "subs x9, x9, x13\n\t" + "lsr x7, x13, 32\n\t" + "sbcs x10, x10, x7\n\t" + "sub x8, xzr, x7\n\t" + "sbcs x11, x11, xzr\n\t" + "stp x9, x10, [%[r],0]\n\t" + "sbc x12, x12, x8\n\t" + "stp x11, x12, [%[r],16]\n\t" : : [r] "r" (r), [a] "r" (a) - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "cc" + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x13", "x9", "x10", "x11", "x12", "cc" ); (void)m; @@ -23326,41 +23123,50 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ -static void sp_256_mont_tpl_4(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_256_mont_tpl_4(sp_digit* r, const sp_digit* a, + const sp_digit* m) { __asm__ __volatile__ ( - "ldp x10, x11, [%[a]]\n\t" - "adds x3, x10, x10\n\t" - "ldr x12, [%[a], 16]\n\t" - "adcs x4, x11, x11\n\t" - "ldr x13, [%[a], 24]\n\t" - "adcs x5, x12, x12\n\t" - "adcs x6, x13, x13\n\t" - "mov x8, 0xffffffff00000001\n\t" - "csetm x9, cs\n\t" - "subs x3, x3, x9\n\t" - "lsr x7, x9, 32\n\t" + "ldp x9, x10, [%[a]]\n\t" + "ldp x11, x12, [%[a], 16]\n\t" + "lsl x3, x9, #1\n\t" + "extr x4, x10, x9, #63\n\t" + "extr x5, x11, x10, #63\n\t" + "asr x13, x12, #63\n\t" + "extr x6, x12, x11, #63\n\t" + "subs x3, x3, x13\n\t" + "lsr x7, x13, 32\n\t" "sbcs x4, x4, x7\n\t" - "and x8, x8, x9\n\t" + "sub x8, xzr, x7\n\t" "sbcs x5, x5, xzr\n\t" - "sbc x6, x6, x8\n\t" - "adds x3, x3, x10\n\t" - "adcs x4, x4, x11\n\t" - "adcs x5, x5, x12\n\t" - "adcs x6, x6, x13\n\t" - "mov x8, 0xffffffff00000001\n\t" - "csetm x9, cs\n\t" - "subs x3, x3, x9\n\t" - "lsr x7, x9, 32\n\t" + "sbcs x6, x6, x8\n\t" + "neg x13, x13\n\t" + "sbc x13, x13, xzr\n\t" + "adds x3, x3, x9\n\t" + "adcs x4, x4, x10\n\t" + "adcs x5, x5, x11\n\t" + "adcs x6, x6, x12\n\t" + "adc x13, x13, xzr\n\t" + "neg x13, x13\n\t" + "subs x3, x3, x13, asr #1\n\t" + "lsr x7, x13, 32\n\t" "sbcs x4, x4, x7\n\t" - "and x8, x8, x9\n\t" + "sub x8, xzr, x7\n\t" "sbcs x5, x5, xzr\n\t" - "stp x3, x4, [%[r], 0]\n\t" + "sbcs x6, x6, x8\n\t" + "sbc x8, xzr, xzr\n\t" + "sub x13, x13, x8\n\t" + "subs x3, x3, x13\n\t" + "lsr x7, x13, 32\n\t" + "sbcs x4, x4, x7\n\t" + "sub x8, xzr, x7\n\t" + "sbcs x5, x5, xzr\n\t" + "stp x3, x4, [%[r],0]\n\t" "sbc x6, x6, x8\n\t" - "stp x5, x6, [%[r], 16]\n\t" + "stp x5, x6, [%[r],16]\n\t" : : [r] "r" (r), [a] "r" (a) - : "memory", "x10", "x11", "x12", "x13", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "cc" + : "memory", "x9", "x10", "x11", "x12", "x3", "x4", "x5", "x6", "x7", "x8", "x13", "cc" ); (void)m; @@ -23373,66 +23179,213 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -static void sp_256_mont_sub_4(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +SP_NOINLINE static void sp_256_mont_sub_4(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" + "ldp x6, x7, [%[a], 16]\n\t" "ldp x8, x9, [%[b], 0]\n\t" + "ldp x10, x11, [%[b], 16]\n\t" "subs x4, x4, x8\n\t" - "ldp x6, x7, [%[a], 16]\n\t" "sbcs x5, x5, x9\n\t" - "ldp x10, x11, [%[b], 16]\n\t" "sbcs x6, x6, x10\n\t" "sbcs x7, x7, x11\n\t" - "mov x13, 0xffffffff00000001\n\t" - "csetm x14, cc\n\t" + "sbc x14, xzr, xzr\n\t" + "adds x4, x4, x14\n\t" + "lsr x12, x14, 32\n\t" + "adcs x5, x5, x12\n\t" + "sub x13, xzr, x12\n\t" + "adcs x6, x6, xzr\n\t" + "adcs x7, x7, x13\n\t" + "adc x14, x14, xzr\n\t" "adds x4, x4, x14\n\t" "lsr x12, x14, 32\n\t" "adcs x5, x5, x12\n\t" - "and x13, x13, x14\n\t" + "sub x13, xzr, x12\n\t" "adcs x6, x6, xzr\n\t" "stp x4, x5, [%[r],0]\n\t" "adc x7, x7, x13\n\t" "stp x6, x7, [%[r],16]\n\t" : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) + : [r] "r" (r), [a] "r" (a), [b] "r" (b) : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "cc" ); + + (void)m; } -#define sp_256_mont_sub_lower_4 sp_256_mont_sub_4 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) * * r Result of division by 2. * a Number to divide. * m Modulus (prime). */ -static void sp_256_div2_4(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_256_mont_div2_4(sp_digit* r, const sp_digit* a, + const sp_digit* m) { __asm__ __volatile__ ( - "ldp x3, x4, [%[a], 0]\n\t" - "and x9, x3, 1\n\t" - "ldp x5, x6, [%[a], 16]\n\t" - "sub x10, xzr, x9\n\t" - "lsr x7, x10, 32\n\t" - "adds x3, x3, x10\n\t" - "and x8, x10, 0xffffffff00000001\n\t" - "adcs x4, x4, x7\n\t" - "adcs x5, x5, xzr\n\t" - "extr x3, x4, x3, 1\n\t" - "adcs x6, x6, x8\n\t" - "extr x4, x5, x4, 1\n\t" - "cset x9, cs\n\t" - "extr x5, x6, x5, 1\n\t" - "extr x6, x9, x6, 1\n\t" - "stp x3, x4, [%[r], 0]\n\t" - "stp x5, x6, [%[r], 16]\n\t" + "ldp x3, x4, [%[a], 0]\n\t" + "ldp x5, x6, [%[a], 16]\n\t" + "sbfx x8, x3, 0, 1\n\t" + "adds x3, x3, x8\n\t" + "lsr x7, x8, 32\n\t" + "adcs x4, x4, x7\n\t" + "sub x8, xzr, x7\n\t" + "adcs x5, x5, xzr\n\t" + "extr x3, x4, x3, 1\n\t" + "adcs x6, x6, x8\n\t" + "extr x4, x5, x4, 1\n\t" + "adc x9, xzr, xzr\n\t" + "extr x5, x6, x5, 1\n\t" + "extr x6, x9, x6, 1\n\t" + "stp x3, x4, [%[r], 0]\n\t" + "stp x5, x6, [%[r], 16]\n\t" : : [r] "r" (r), [a] "r" (a), [m] "r" (m) - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" + : "memory", "x3", "x4", "x5", "x6", "x7", "x9", "x8", "cc" ); +} +/* Double number and subtract (r = (a - 2.b) % m). + * + * r Result of subtration. + * a Number to subtract from in Montgomery form. + * b Number to subtract with in Montgomery form. + * m Modulus (prime). + */ +SP_NOINLINE static void sp_256_mont_rsb_sub_dbl_4(sp_digit* r, + const sp_digit* a, sp_digit* b, const sp_digit* m) +{ + __asm__ __volatile__ ( + "ldp x8, x9, [%[b]]\n\t" + "ldp x10, x11, [%[b],16]\n\t" + "lsl x15, x8, #1\n\t" + "extr x16, x9, x8, #63\n\t" + "extr x17, x10, x9, #63\n\t" + "asr x14, x11, #63\n\t" + "extr x19, x11, x10, #63\n\t" + "ldp x4, x5, [%[a]]\n\t" + "ldp x6, x7, [%[a],16]\n\t" + "subs x15, x15, x14\n\t" + "lsr x12, x14, 32\n\t" + "sbcs x16, x16, x12\n\t" + "sub x13, xzr, x12\n\t" + "sbcs x17, x17, xzr\n\t" + "sbcs x19, x19, x13\n\t" + "neg x14, x14\n\t" + "sbc x14, x14, xzr\n\t" + "subs x15, x4, x15\n\t" + "sbcs x16, x5, x16\n\t" + "sbcs x17, x6, x17\n\t" + "sbcs x19, x7, x19\n\t" + "sbc x14, xzr, x14\n\t" + "adds x15, x15, x14, asr #1\n\t" + "lsr x12, x14, 32\n\t" + "adcs x16, x16, x12\n\t" + "sub x13, xzr, x12\n\t" + "adcs x17, x17, xzr\n\t" + "adcs x19, x19, x13\n\t" + "adc x14, x14, xzr\n\t" + "adds x15, x15, x14\n\t" + "lsr x12, x14, 32\n\t" + "adcs x16, x16, x12\n\t" + "sub x13, xzr, x12\n\t" + "adcs x17, x17, xzr\n\t" + "stp x15, x16, [%[r],0]\n\t" + "adc x19, x19, x13\n\t" + "stp x17, x19, [%[r],16]\n\t" + "subs x15, x8, x15\n\t" + "sbcs x16, x9, x16\n\t" + "sbcs x17, x10, x17\n\t" + "sbcs x19, x11, x19\n\t" + "sbc x14, xzr, xzr\n\t" + "adds x15, x15, x14\n\t" + "lsr x12, x14, 32\n\t" + "adcs x16, x16, x12\n\t" + "sub x13, xzr, x12\n\t" + "adcs x17, x17, xzr\n\t" + "adcs x19, x19, x13\n\t" + "adc x14, x14, xzr\n\t" + "adds x15, x15, x14\n\t" + "lsr x12, x14, 32\n\t" + "adcs x16, x16, x12\n\t" + "sub x13, xzr, x12\n\t" + "adcs x17, x17, xzr\n\t" + "stp x15, x16, [%[b],0]\n\t" + "adc x19, x19, x13\n\t" + "stp x17, x19, [%[b],16]\n\t" + : + : [r] "r" (r), [a] "r" (a), [b] "r" (b) + : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "cc" + ); + + (void)m; +} + +/* Subtract two Montgomery form numbers (r = a - b % m). + * + * ra Result of addition. + * rs Result of subtration. + * a Number to subtract from in Montgomery form. + * b Number to subtract with in Montgomery form. + * m Modulus (prime). + */ +SP_NOINLINE static void sp_256_mont_add_sub_4(sp_digit* ra, + sp_digit* rs, const sp_digit* a, const sp_digit* b, const sp_digit* m) +{ + __asm__ __volatile__ ( + "ldp x4, x5, [%[a], 0]\n\t" + "ldp x6, x7, [%[a], 16]\n\t" + "ldp x8, x9, [%[b], 0]\n\t" + "ldp x10, x11, [%[b], 16]\n\t" + "adds x14, x4, x8\n\t" + "adcs x15, x5, x9\n\t" + "adcs x16, x6, x10\n\t" + "adcs x17, x7, x11\n\t" + "csetm x19, cs\n\t" + "subs x14, x14, x19\n\t" + "lsr x12, x19, 32\n\t" + "sbcs x15, x15, x12\n\t" + "sub x13, xzr, x12\n\t" + "sbcs x16, x16, xzr\n\t" + "sbcs x17, x17, x13\n\t" + "sbc x13, xzr, xzr\n\t" + "sub x19, x19, x13\n\t" + "subs x14, x14, x19\n\t" + "lsr x12, x19, 32\n\t" + "sbcs x15, x15, x12\n\t" + "sub x13, xzr, x12\n\t" + "sbcs x16, x16, xzr\n\t" + "stp x14, x15, [%[ra],0]\n\t" + "sbc x17, x17, x13\n\t" + "stp x16, x17, [%[ra],16]\n\t" + "subs x4, x4, x8\n\t" + "sbcs x5, x5, x9\n\t" + "sbcs x6, x6, x10\n\t" + "sbcs x7, x7, x11\n\t" + "sbc x19, xzr, xzr\n\t" + "adds x4, x4, x19\n\t" + "lsr x12, x19, 32\n\t" + "adcs x5, x5, x12\n\t" + "sub x13, xzr, x12\n\t" + "adcs x6, x6, xzr\n\t" + "adcs x7, x7, x13\n\t" + "adc x19, x19, xzr\n\t" + "adds x4, x4, x19\n\t" + "lsr x12, x19, 32\n\t" + "adcs x5, x5, x12\n\t" + "sub x13, xzr, x12\n\t" + "adcs x6, x6, xzr\n\t" + "stp x4, x5, [%[rs],0]\n\t" + "adc x7, x7, x13\n\t" + "stp x6, x7, [%[rs],16]\n\t" + : + : [ra] "r" (ra), [rs] "r" (rs), [a] "r" (a), [b] "r" (b) + : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x19", "x14", "x15", "x16", "x17", "cc" + ); + + (void)m; } /* Double the Montgomery form projective point p. @@ -23464,10 +23417,8 @@ sp_256_mont_mul_4(z, p->y, p->z, p256_mod, p256_mp_mod); /* Z = 2Z */ sp_256_mont_dbl_4(z, z, p256_mod); - /* T2 = X - T1 */ - sp_256_mont_sub_4(t2, p->x, t1, p256_mod); - /* T1 = X + T1 */ - sp_256_mont_add_4(t1, p->x, t1, p256_mod); + /* T1/T2 = X +/- T1 */ + sp_256_mont_add_sub_4(t1, t2, p->x, t1, p256_mod); /* T2 = T1 * T2 */ sp_256_mont_mul_4(t2, t1, t2, p256_mod, p256_mp_mod); /* T1 = 3T2 */ @@ -23479,17 +23430,14 @@ /* T2 = Y * Y */ sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_4(t2, t2, p256_mod); + sp_256_mont_div2_4(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_4(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ sp_256_mont_sqr_4(x, t1, p256_mod, p256_mp_mod); - /* X = X - Y */ - sp_256_mont_sub_4(x, x, y, p256_mod); - /* X = X - Y */ - sp_256_mont_sub_4(x, x, y, p256_mod); + /* X = X - 2*Y */ /* Y = Y - X */ - sp_256_mont_sub_lower_4(y, y, x, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, y, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_4(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -23512,7 +23460,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_4_ctx* ctx = (sp_256_proj_point_dbl_4_ctx*)sp_ctx->data; @@ -23550,13 +23499,11 @@ ctx->state = 4; break; case 4: - /* T2 = X - T1 */ - sp_256_mont_sub_4(ctx->t2, p->x, ctx->t1, p256_mod); + /* T1/T2 = X +/- T1 */ + sp_256_mont_add_sub_4(ctx->t1, ctx->t2, p->x, ctx->t1, p256_mod); ctx->state = 5; break; case 5: - /* T1 = X + T1 */ - sp_256_mont_add_4(ctx->t1, p->x, ctx->t1, p256_mod); ctx->state = 6; break; case 6: @@ -23586,7 +23533,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_4(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_4(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -23600,18 +23547,15 @@ ctx->state = 14; break; case 14: - /* X = X - Y */ - sp_256_mont_sub_4(ctx->x, ctx->x, ctx->y, p256_mod); + /* X = X - 2*Y */ + /* Y = Y - X */ + sp_256_mont_rsb_sub_dbl_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 15; break; case 15: - /* X = X - Y */ - sp_256_mont_sub_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 16; break; case 16: - /* Y = Y - X */ - sp_256_mont_sub_lower_4(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -23636,101 +23580,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_256_mont_tpl_lower_4 sp_256_mont_tpl_4 -/* Subtract two Montgomery form numbers (r = a - b % m). - * - * r Result of subtration. - * a Number to subtract from in Montgomery form. - * b Number to subtract with in Montgomery form. - * m Modulus (prime). - */ -static void sp_256_mont_sub_dbl_4(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) -{ - __asm__ __volatile__ ( - "ldp x8, x9, [%[b]]\n\t" - "ldp x10, x11, [%[b],16]\n\t" - "adds x8, x8, x8\n\t" - "ldp x4, x5, [%[a]]\n\t" - "adcs x9, x9, x9\n\t" - "ldp x6, x7, [%[a],16]\n\t" - "adcs x10, x10, x10\n\t" - "adcs x11, x11, x11\n\t" - "mov x13, 0xffffffff00000001\n\t" - "csetm x14, cs\n\t" - "subs x8, x8, x14\n\t" - "lsr x12, x14, 32\n\t" - "sbcs x9, x9, x12\n\t" - "and x13, x13, x14\n\t" - "sbcs x10, x10, xzr\n\t" - "sbc x11, x11, x13\n\t" - "subs x4, x4, x8\n\t" - "sbcs x5, x5, x9\n\t" - "sbcs x6, x6, x10\n\t" - "sbcs x7, x7, x11\n\t" - "mov x13, 0xffffffff00000001\n\t" - "csetm x14, cc\n\t" - "adds x4, x4, x14\n\t" - "lsr x12, x14, 32\n\t" - "adcs x5, x5, x12\n\t" - "and x13, x13, x14\n\t" - "adcs x6, x6, xzr\n\t" - "stp x4, x5, [%[r],0]\n\t" - "adc x7, x7, x13\n\t" - "stp x6, x7, [%[r],16]\n\t" - : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "cc" - ); -} - -/* Subtract two Montgomery form numbers (r = a - b % m). - * - * r Result of subtration. - * a Number to subtract from in Montgomery form. - * b Number to subtract with in Montgomery form. - * m Modulus (prime). - */ -static void sp_256_mont_dbl_sub_4(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) -{ - __asm__ __volatile__ ( - "ldp x4, x5, [%[a], 0]\n\t" - "ldp x8, x9, [%[b], 0]\n\t" - "subs x4, x4, x8\n\t" - "ldp x6, x7, [%[a], 16]\n\t" - "sbcs x5, x5, x9\n\t" - "ldp x10, x11, [%[b], 16]\n\t" - "sbcs x6, x6, x10\n\t" - "sbcs x7, x7, x11\n\t" - "mov x13, 0xffffffff00000001\n\t" - "csetm x14, cc\n\t" - "adds x4, x4, x14\n\t" - "lsr x12, x14, 32\n\t" - "adcs x5, x5, x12\n\t" - "and x13, x13, x14\n\t" - "adcs x6, x6, xzr\n\t" - "adc x7, x7, x13\n\t" - "adds x4, x4, x4\n\t" - "adcs x5, x5, x5\n\t" - "adcs x6, x6, x6\n\t" - "adcs x7, x7, x7\n\t" - "mov x13, 0xffffffff00000001\n\t" - "csetm x14, cs\n\t" - "subs x4, x4, x14\n\t" - "lsr x12, x14, 32\n\t" - "sbcs x5, x5, x12\n\t" - "and x13, x13, x14\n\t" - "sbcs x6, x6, xzr\n\t" - "stp x4, x5, [%[r],0]\n\t" - "sbc x7, x7, x13\n\t" - "stp x6, x7, [%[r],16]\n\t" - : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "cc" - ); -} - /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -23768,15 +23617,15 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_4(a, t1, p256_mod); + sp_256_mont_tpl_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod); /* X = A^2 - 2B */ sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_4(b, b, x, p256_mod); + sp_256_mont_dbl_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -23796,15 +23645,15 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_4(a, t1, p256_mod); + sp_256_mont_tpl_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod); /* X = A^2 - 2B */ sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_4(b, b, x, p256_mod); + sp_256_mont_dbl_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -23814,7 +23663,7 @@ sp_256_mont_sub_4(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_4(y, y, p256_mod); + sp_256_mont_div2_4(y, y, p256_mod); } /* Compare two numbers to determine if they are equal. @@ -23852,12 +23701,12 @@ static void sp_256_proj_point_add_4(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*4; - sp_digit* t3 = t + 4*4; - sp_digit* t4 = t + 6*4; - sp_digit* t5 = t + 8*4; - sp_digit* t6 = t + 10*4; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*4; + sp_digit* t2 = t + 4*4; + sp_digit* t3 = t + 6*4; + sp_digit* t4 = t + 8*4; + sp_digit* t5 = t + 10*4; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod); @@ -23879,17 +23728,9 @@ sp_256_proj_point_dbl_4(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_4(t2, t2, t1, p256_mod); @@ -23905,22 +23746,75 @@ sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_4(x, x, t5, p256_mod); sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, y, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_4(y, y, x, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, y, p256_mod); sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_4(y, y, t5, p256_mod); - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); - } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; +{ + __asm__ __volatile__ ( + "ldrsw x10, [%[p], #192]\n\t" + "ldrsw x11, [%[q], #192]\n\t" + "ldp x12, x13, [%[x], #0]\n\t" + "ldp x14, x15, [%[x], #16]\n\t" + "ldp x16, x17, [%[y], #0]\n\t" + "ldp x19, x20, [%[y], #16]\n\t" + "ldp x21, x22, [%[z], #0]\n\t" + "ldp x23, x24, [%[z], #16]\n\t" + "bics xzr, x11, x10\n\t" + "ldp x25, x26, [%[p], #0]\n\t" + "ldp x27, x28, [%[p], #16]\n\t" + "csel x12, x12, x25, eq\n\t" + "csel x13, x13, x26, eq\n\t" + "csel x14, x14, x27, eq\n\t" + "csel x15, x15, x28, eq\n\t" + "ldp x25, x26, [%[p], #64]\n\t" + "ldp x27, x28, [%[p], #80]\n\t" + "csel x16, x16, x25, eq\n\t" + "csel x17, x17, x26, eq\n\t" + "csel x19, x19, x27, eq\n\t" + "csel x20, x20, x28, eq\n\t" + "ldp x25, x26, [%[p], #128]\n\t" + "ldp x27, x28, [%[p], #144]\n\t" + "csel x21, x21, x25, eq\n\t" + "csel x22, x22, x26, eq\n\t" + "csel x23, x23, x27, eq\n\t" + "csel x24, x24, x28, eq\n\t" + "bics xzr, x10, x11\n\t" + "and x10, x10, x11\n\t" + "ldp x25, x26, [%[q], #0]\n\t" + "ldp x27, x28, [%[q], #16]\n\t" + "csel x12, x12, x25, eq\n\t" + "csel x13, x13, x26, eq\n\t" + "csel x14, x14, x27, eq\n\t" + "csel x15, x15, x28, eq\n\t" + "ldp x25, x26, [%[q], #64]\n\t" + "ldp x27, x28, [%[q], #80]\n\t" + "csel x16, x16, x25, eq\n\t" + "csel x17, x17, x26, eq\n\t" + "csel x19, x19, x27, eq\n\t" + "csel x20, x20, x28, eq\n\t" + "ldp x25, x26, [%[q], #128]\n\t" + "ldp x27, x28, [%[q], #144]\n\t" + "csel x21, x21, x25, eq\n\t" + "csel x22, x22, x26, eq\n\t" + "csel x23, x23, x27, eq\n\t" + "csel x24, x24, x28, eq\n\t" + "orr x21, x21, x10\n\t" + "stp x12, x13, [%[r], #0]\n\t" + "stp x14, x15, [%[r], #16]\n\t" + "stp x16, x17, [%[r], #64]\n\t" + "stp x19, x20, [%[r], #80]\n\t" + "stp x21, x22, [%[r], #128]\n\t" + "stp x23, x24, [%[r], #144]\n\t" + "str w10, [%[r], #192]\n\t" + : + : [r] "r" (r), [p] "r" (p), [q] "r" (q), [x] "r" (x), + [y] "r" (y), [z] "r" (z) + : "memory", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", + "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", + "cc" + ); +} } } @@ -23966,12 +23860,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*4; - ctx->t3 = t + 4*4; - ctx->t4 = t + 6*4; - ctx->t5 = t + 8*4; - ctx->t6 = t + 10*4; + ctx->t6 = t; + ctx->t1 = t + 2*4; + ctx->t2 = t + 4*4; + ctx->t3 = t + 6*4; + ctx->t4 = t + 8*4; + ctx->t5 = t + 10*4; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -24072,12 +23966,11 @@ ctx->state = 20; break; case 20: - sp_256_mont_sub_dbl_4(ctx->x, ctx->x, ctx->y, p256_mod); + /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ + sp_256_mont_rsb_sub_dbl_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 21; break; case 21: - /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_4(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -24090,22 +23983,71 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); - } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; +{ + __asm__ __volatile__ ( + "ldrsw x10, [%[p], #192]\n\t" + "ldrsw x11, [%[q], #192]\n\t" + "ldp x12, x13, [%[x], #0]\n\t" + "ldp x14, x15, [%[x], #16]\n\t" + "ldp x16, x17, [%[y], #0]\n\t" + "ldp x19, x20, [%[y], #16]\n\t" + "ldp x21, x22, [%[z], #0]\n\t" + "ldp x23, x24, [%[z], #16]\n\t" + "bics xzr, x11, x10\n\t" + "ldp x25, x26, [%[p], #0]\n\t" + "ldp x27, x28, [%[p], #16]\n\t" + "csel x12, x12, x25, eq\n\t" + "csel x13, x13, x26, eq\n\t" + "csel x14, x14, x27, eq\n\t" + "csel x15, x15, x28, eq\n\t" + "ldp x25, x26, [%[p], #64]\n\t" + "ldp x27, x28, [%[p], #80]\n\t" + "csel x16, x16, x25, eq\n\t" + "csel x17, x17, x26, eq\n\t" + "csel x19, x19, x27, eq\n\t" + "csel x20, x20, x28, eq\n\t" + "ldp x25, x26, [%[p], #128]\n\t" + "ldp x27, x28, [%[p], #144]\n\t" + "csel x21, x21, x25, eq\n\t" + "csel x22, x22, x26, eq\n\t" + "csel x23, x23, x27, eq\n\t" + "csel x24, x24, x28, eq\n\t" + "bics xzr, x10, x11\n\t" + "and x10, x10, x11\n\t" + "ldp x25, x26, [%[q], #0]\n\t" + "ldp x27, x28, [%[q], #16]\n\t" + "csel x12, x12, x25, eq\n\t" + "csel x13, x13, x26, eq\n\t" + "csel x14, x14, x27, eq\n\t" + "csel x15, x15, x28, eq\n\t" + "ldp x25, x26, [%[q], #64]\n\t" + "ldp x27, x28, [%[q], #80]\n\t" + "csel x16, x16, x25, eq\n\t" + "csel x17, x17, x26, eq\n\t" + "csel x19, x19, x27, eq\n\t" + "csel x20, x20, x28, eq\n\t" + "ldp x25, x26, [%[q], #128]\n\t" + "ldp x27, x28, [%[q], #144]\n\t" + "csel x21, x21, x25, eq\n\t" + "csel x22, x22, x26, eq\n\t" + "csel x23, x23, x27, eq\n\t" + "csel x24, x24, x28, eq\n\t" + "orr x21, x21, x10\n\t" + "stp x12, x13, [%[r], #0]\n\t" + "stp x14, x15, [%[r], #16]\n\t" + "stp x16, x17, [%[r], #64]\n\t" + "stp x19, x20, [%[r], #80]\n\t" + "stp x21, x22, [%[r], #128]\n\t" + "stp x23, x24, [%[r], #144]\n\t" + "str w10, [%[r], #192]\n\t" + : + : [r] "r" (r), [p] "r" (p), [q] "r" (q), [x] "r" (ctx->x), + [y] "r" (ctx->y), [z] "r" (ctx->z) + : "memory", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", + "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", + "cc" + ); +} ctx->state = 25; break; } @@ -24163,16 +24105,16 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_4(a, t1, p256_mod); + sp_256_mont_tpl_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod); x = r[j].x; /* X = A^2 - 2B */ sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_4(b, b, x, p256_mod); + sp_256_mont_dbl_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_4(r[j].z, z, y, p256_mod, p256_mp_mod); z = r[j].z; @@ -24186,7 +24128,7 @@ sp_256_mont_mul_4(y, b, a, p256_mod, p256_mp_mod); sp_256_mont_sub_4(y, y, t1, p256_mod); /* Y = Y/2 */ - sp_256_div2_4(r[j].y, y, p256_mod); + sp_256_mont_div2_4(r[j].y, y, p256_mod); r[j].infinity = 0; } } @@ -24237,10 +24179,8 @@ sp_256_mont_mul_4(t4, t4, q->y, p256_mod, p256_mp_mod); /* H = U2 - U1 */ sp_256_mont_sub_4(t2, t2, t1, p256_mod); - /* RS = S2 + S1 */ - sp_256_mont_add_4(t6, t4, t3, p256_mod); - /* R = S2 - S1 */ - sp_256_mont_sub_4(t4, t4, t3, p256_mod); + /* RS/R = S2 +/ S1 */ + sp_256_mont_add_sub_4(t6, t4, t4, t3, p256_mod); /* Z3 = H*Z1*Z2 */ /* ZS = H*Z1*Z2 */ sp_256_mont_mul_4(za, za, q->z, p256_mod, p256_mp_mod); @@ -24260,8 +24200,8 @@ sp_256_mont_sub_4(xs, xs, t1, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_256_mont_sub_lower_4(ys, ya, xs, p256_mod); - sp_256_mont_sub_lower_4(ya, ya, xa, p256_mod); + sp_256_mont_sub_4(ys, ya, xs, p256_mod); + sp_256_mont_sub_4(ya, ya, xa, p256_mod); sp_256_mont_mul_4(ya, ya, t4, p256_mod, p256_mp_mod); sp_256_sub_4(t6, p256_mod, t6); sp_256_mont_mul_4(ys, ys, t6, p256_mod, p256_mp_mod); @@ -24345,42 +24285,69 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ -static void sp_256_get_point_33_4(sp_point_256* r, const sp_point_256* table, - int idx) +SP_NOINLINE static void sp_256_get_point_33_4(sp_point_256* r, + const sp_point_256* table, int idx) { - int i; - sp_digit mask; - - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->z[0] = 0; - r->z[1] = 0; - r->z[2] = 0; - r->z[3] = 0; - for (i = 1; i < 33; i++) { - mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->z[0] |= mask & table[i].z[0]; - r->z[1] |= mask & table[i].z[1]; - r->z[2] |= mask & table[i].z[2]; - r->z[3] |= mask & table[i].z[3]; - } + __asm__ __volatile__ ( + "mov w30, #1\n\t" + "add %[table], %[table], #200\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x15, x16, [%[table], #0]\n\t" + "ldp x17, x19, [%[table], #16]\n\t" + "csel x3, xzr, x15, ne\n\t" + "csel x4, xzr, x16, ne\n\t" + "csel x5, xzr, x17, ne\n\t" + "csel x6, xzr, x19, ne\n\t" + "ldp x15, x16, [%[table], #64]\n\t" + "ldp x17, x19, [%[table], #80]\n\t" + "csel x7, xzr, x15, ne\n\t" + "csel x8, xzr, x16, ne\n\t" + "csel x9, xzr, x17, ne\n\t" + "csel x10, xzr, x19, ne\n\t" + "ldp x15, x16, [%[table], #128]\n\t" + "ldp x17, x19, [%[table], #144]\n\t" + "csel x11, xzr, x15, ne\n\t" + "csel x12, xzr, x16, ne\n\t" + "csel x13, xzr, x17, ne\n\t" + "csel x14, xzr, x19, ne\n\t" + "1:\n\t" + "add %[table], %[table], #200\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x15, x16, [%[table], #0]\n\t" + "ldp x17, x19, [%[table], #16]\n\t" + "csel x3, x3, x15, ne\n\t" + "csel x4, x4, x16, ne\n\t" + "csel x5, x5, x17, ne\n\t" + "csel x6, x6, x19, ne\n\t" + "ldp x15, x16, [%[table], #64]\n\t" + "ldp x17, x19, [%[table], #80]\n\t" + "csel x7, x7, x15, ne\n\t" + "csel x8, x8, x16, ne\n\t" + "csel x9, x9, x17, ne\n\t" + "csel x10, x10, x19, ne\n\t" + "ldp x15, x16, [%[table], #128]\n\t" + "ldp x17, x19, [%[table], #144]\n\t" + "csel x11, x11, x15, ne\n\t" + "csel x12, x12, x16, ne\n\t" + "csel x13, x13, x17, ne\n\t" + "csel x14, x14, x19, ne\n\t" + "cmp w30, #33\n\t" + "b.ne 1b\n\t" + "stp x3, x4, [%[r], #0]\n\t" + "stp x5, x6, [%[r], #16]\n\t" + "stp x7, x8, [%[r], #64]\n\t" + "stp x9, x10, [%[r], #80]\n\t" + "stp x11, x12, [%[r], #128]\n\t" + "stp x13, x14, [%[r], #144]\n\t" + : [table] "+r" (table) + : [r] "r" (r), [idx] "r" (idx) + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "w30", "cc" + ); } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -24423,7 +24390,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * + t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -24528,15 +24495,12 @@ return err; } -#ifndef WC_NO_CACHE_RESISTANT /* A table entry for pre-computed points. */ typedef struct sp_table_entry_256 { sp_digit x[4]; sp_digit y[4]; } sp_table_entry_256; -#if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) -#endif /* FP_ECC | WOLFSSL_SP_SMALL */ /* Add two Montgomery form projective points. The second point has a q value of * one. * Only the first point can be the same pointer as the result point. @@ -24549,12 +24513,11 @@ static void sp_256_proj_point_add_qz1_4(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*4; - sp_digit* t3 = t + 4*4; - sp_digit* t4 = t + 6*4; - sp_digit* t5 = t + 8*4; - sp_digit* t6 = t + 10*4; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*4; + sp_digit* t6 = t + 4*4; + sp_digit* t1 = t + 6*4; + sp_digit* t4 = t + 8*4; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -24570,13 +24533,9 @@ sp_256_proj_point_dbl_4(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_4(t2, t2, p->x, p256_mod); @@ -24585,35 +24544,87 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_4(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_4(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_4(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_4(x, t1, t5, p256_mod); - sp_256_mont_sub_dbl_4(x, x, t3, p256_mod); + sp_256_mont_sqr_4(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_4(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_4(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_4(t2, t2, t1, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, t2, t3, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_4(t3, t3, x, p256_mod); sp_256_mont_mul_4(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_4(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_4(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); - } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; + sp_256_mont_mul_4(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_4(y, t3, t1, p256_mod); +{ + __asm__ __volatile__ ( + "ldrsw x10, [%[p], #192]\n\t" + "ldrsw x11, [%[q], #192]\n\t" + "ldp x12, x13, [%[x], #0]\n\t" + "ldp x14, x15, [%[x], #16]\n\t" + "ldp x16, x17, [%[y], #0]\n\t" + "ldp x19, x20, [%[y], #16]\n\t" + "ldp x21, x22, [%[z], #0]\n\t" + "ldp x23, x24, [%[z], #16]\n\t" + "bics xzr, x11, x10\n\t" + "ldp x25, x26, [%[p], #0]\n\t" + "ldp x27, x28, [%[p], #16]\n\t" + "csel x12, x12, x25, eq\n\t" + "csel x13, x13, x26, eq\n\t" + "csel x14, x14, x27, eq\n\t" + "csel x15, x15, x28, eq\n\t" + "ldp x25, x26, [%[p], #64]\n\t" + "ldp x27, x28, [%[p], #80]\n\t" + "csel x16, x16, x25, eq\n\t" + "csel x17, x17, x26, eq\n\t" + "csel x19, x19, x27, eq\n\t" + "csel x20, x20, x28, eq\n\t" + "ldp x25, x26, [%[p], #128]\n\t" + "ldp x27, x28, [%[p], #144]\n\t" + "csel x21, x21, x25, eq\n\t" + "csel x22, x22, x26, eq\n\t" + "csel x23, x23, x27, eq\n\t" + "csel x24, x24, x28, eq\n\t" + "bics xzr, x10, x11\n\t" + "and x10, x10, x11\n\t" + "ldp x25, x26, [%[q], #0]\n\t" + "ldp x27, x28, [%[q], #16]\n\t" + "csel x12, x12, x25, eq\n\t" + "csel x13, x13, x26, eq\n\t" + "csel x14, x14, x27, eq\n\t" + "csel x15, x15, x28, eq\n\t" + "ldp x25, x26, [%[q], #64]\n\t" + "ldp x27, x28, [%[q], #80]\n\t" + "csel x16, x16, x25, eq\n\t" + "csel x17, x17, x26, eq\n\t" + "csel x19, x19, x27, eq\n\t" + "csel x20, x20, x28, eq\n\t" + "ldp x25, x26, [%[q], #128]\n\t" + "ldp x27, x28, [%[q], #144]\n\t" + "csel x21, x21, x25, eq\n\t" + "csel x22, x22, x26, eq\n\t" + "csel x23, x23, x27, eq\n\t" + "csel x24, x24, x28, eq\n\t" + "orr x21, x21, x10\n\t" + "stp x12, x13, [%[r], #0]\n\t" + "stp x14, x15, [%[r], #16]\n\t" + "stp x16, x17, [%[r], #64]\n\t" + "stp x19, x20, [%[r], #80]\n\t" + "stp x21, x22, [%[r], #128]\n\t" + "stp x23, x24, [%[r], #144]\n\t" + "str w10, [%[r], #192]\n\t" + : + : [r] "r" (r), [p] "r" (p), [q] "r" (q), [x] "r" (x), + [y] "r" (y), [z] "r" (z) + : "memory", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", + "x19", "x20", "x21", "x22", "x23", "x24", "x25", "x26", "x27", "x28", + "cc" + ); +} } } +#ifndef WC_NO_CACHE_RESISTANT +#if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) +#endif /* FP_ECC | WOLFSSL_SP_SMALL */ #ifdef FP_ECC /* Convert the projective point to affine. * Ordinates are in Montgomery form. @@ -24733,34 +24744,55 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ -static void sp_256_get_entry_64_4(sp_point_256* r, +SP_NOINLINE static void sp_256_get_entry_64_4(sp_point_256* r, const sp_table_entry_256* table, int idx) { - int i; - sp_digit mask; - - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - for (i = 1; i < 64; i++) { - mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - } + __asm__ __volatile__ ( + "mov w30, #1\n\t" + "add %[table], %[table], #64\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x11, x12, [%[table], #0]\n\t" + "ldp x13, x14, [%[table], #16]\n\t" + "ldp x15, x16, [%[table], #32]\n\t" + "ldp x17, x19, [%[table], #48]\n\t" + "csel x3, xzr, x11, ne\n\t" + "csel x4, xzr, x12, ne\n\t" + "csel x5, xzr, x13, ne\n\t" + "csel x6, xzr, x14, ne\n\t" + "csel x7, xzr, x15, ne\n\t" + "csel x8, xzr, x16, ne\n\t" + "csel x9, xzr, x17, ne\n\t" + "csel x10, xzr, x19, ne\n\t" + "1:\n\t" + "add %[table], %[table], #64\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x11, x12, [%[table], #0]\n\t" + "ldp x13, x14, [%[table], #16]\n\t" + "ldp x15, x16, [%[table], #32]\n\t" + "ldp x17, x19, [%[table], #48]\n\t" + "csel x3, x3, x11, ne\n\t" + "csel x4, x4, x12, ne\n\t" + "csel x5, x5, x13, ne\n\t" + "csel x6, x6, x14, ne\n\t" + "csel x7, x7, x15, ne\n\t" + "csel x8, x8, x16, ne\n\t" + "csel x9, x9, x17, ne\n\t" + "csel x10, x10, x19, ne\n\t" + "cmp w30, #64\n\t" + "b.ne 1b\n\t" + "stp x3, x4, [%[r], #0]\n\t" + "stp x5, x6, [%[r], #16]\n\t" + "stp x7, x8, [%[r], #64]\n\t" + "stp x9, x10, [%[r], #80]\n\t" + : [table] "+r" (table) + : [r] "r" (r), [idx] "r" (idx) + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "w30", "cc" + ); } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -24788,7 +24820,7 @@ sp_digit* t = NULL; #else sp_point_256 rt[2]; - sp_digit t[2 * 4 * 6]; + sp_digit t[2 * 4 * 5]; #endif sp_point_256* p = NULL; int i; @@ -24809,7 +24841,7 @@ if (rt == NULL) err = MEMORY_E; if (err == MP_OKAY) { - t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, + t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -24907,13 +24939,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -24984,8 +25018,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, ct, heap); @@ -24993,23 +25027,25 @@ #ifdef WOLFSSL_SP_SMALL_STACK sp_digit* tmp; #else - sp_digit tmp[2 * 4 * 6]; + sp_digit tmp[2 * 4 * 5]; #endif sp_cache_256_t* cache; int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, DYNAMIC_TYPE_ECC); + tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (tmp == NULL) { err = MEMORY_E; } #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -25141,34 +25177,55 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ -static void sp_256_get_entry_256_4(sp_point_256* r, +SP_NOINLINE static void sp_256_get_entry_256_4(sp_point_256* r, const sp_table_entry_256* table, int idx) { - int i; - sp_digit mask; - - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - for (i = 1; i < 256; i++) { - mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - } + __asm__ __volatile__ ( + "mov w30, #1\n\t" + "add %[table], %[table], #64\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x11, x12, [%[table], #0]\n\t" + "ldp x13, x14, [%[table], #16]\n\t" + "ldp x15, x16, [%[table], #32]\n\t" + "ldp x17, x19, [%[table], #48]\n\t" + "csel x3, xzr, x11, ne\n\t" + "csel x4, xzr, x12, ne\n\t" + "csel x5, xzr, x13, ne\n\t" + "csel x6, xzr, x14, ne\n\t" + "csel x7, xzr, x15, ne\n\t" + "csel x8, xzr, x16, ne\n\t" + "csel x9, xzr, x17, ne\n\t" + "csel x10, xzr, x19, ne\n\t" + "1:\n\t" + "add %[table], %[table], #64\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x11, x12, [%[table], #0]\n\t" + "ldp x13, x14, [%[table], #16]\n\t" + "ldp x15, x16, [%[table], #32]\n\t" + "ldp x17, x19, [%[table], #48]\n\t" + "csel x3, x3, x11, ne\n\t" + "csel x4, x4, x12, ne\n\t" + "csel x5, x5, x13, ne\n\t" + "csel x6, x6, x14, ne\n\t" + "csel x7, x7, x15, ne\n\t" + "csel x8, x8, x16, ne\n\t" + "csel x9, x9, x17, ne\n\t" + "csel x10, x10, x19, ne\n\t" + "cmp w30, #256\n\t" + "b.ne 1b\n\t" + "stp x3, x4, [%[r], #0]\n\t" + "stp x5, x6, [%[r], #16]\n\t" + "stp x7, x8, [%[r], #64]\n\t" + "stp x9, x10, [%[r], #80]\n\t" + : [table] "+r" (table) + : [r] "r" (r), [idx] "r" (idx) + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "w30", "cc" + ); } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -25196,7 +25253,7 @@ sp_digit* t = NULL; #else sp_point_256 rt[2]; - sp_digit t[2 * 4 * 6]; + sp_digit t[2 * 4 * 5]; #endif sp_point_256* p = NULL; int i; @@ -25217,7 +25274,7 @@ if (rt == NULL) err = MEMORY_E; if (err == MP_OKAY) { - t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, + t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -25315,13 +25372,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -25392,8 +25451,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, ct, heap); @@ -25401,23 +25460,25 @@ #ifdef WOLFSSL_SP_SMALL_STACK sp_digit* tmp; #else - sp_digit tmp[2 * 4 * 6]; + sp_digit tmp[2 * 4 * 5]; #endif sp_cache_256_t* cache; int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, DYNAMIC_TYPE_ECC); + tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (tmp == NULL) { err = MEMORY_E; } #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -25510,7 +25571,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -25521,7 +25582,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_256* point = NULL; + sp_point_256* point = NULL; sp_digit* k = NULL; #else sp_point_256 point[2]; @@ -27319,34 +27380,55 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ -static void sp_256_get_entry_65_4(sp_point_256* r, +SP_NOINLINE static void sp_256_get_entry_65_4(sp_point_256* r, const sp_table_entry_256* table, int idx) { - int i; - sp_digit mask; - - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - for (i = 1; i < 65; i++) { - mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - } + __asm__ __volatile__ ( + "mov w30, #1\n\t" + "add %[table], %[table], #64\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x11, x12, [%[table], #0]\n\t" + "ldp x13, x14, [%[table], #16]\n\t" + "ldp x15, x16, [%[table], #32]\n\t" + "ldp x17, x19, [%[table], #48]\n\t" + "csel x3, xzr, x11, ne\n\t" + "csel x4, xzr, x12, ne\n\t" + "csel x5, xzr, x13, ne\n\t" + "csel x6, xzr, x14, ne\n\t" + "csel x7, xzr, x15, ne\n\t" + "csel x8, xzr, x16, ne\n\t" + "csel x9, xzr, x17, ne\n\t" + "csel x10, xzr, x19, ne\n\t" + "1:\n\t" + "add %[table], %[table], #64\n\t" + "cmp %w[idx], w30\n\t" + "add w30, w30, #1\n\t" + "ldp x11, x12, [%[table], #0]\n\t" + "ldp x13, x14, [%[table], #16]\n\t" + "ldp x15, x16, [%[table], #32]\n\t" + "ldp x17, x19, [%[table], #48]\n\t" + "csel x3, x3, x11, ne\n\t" + "csel x4, x4, x12, ne\n\t" + "csel x5, x5, x13, ne\n\t" + "csel x6, x6, x14, ne\n\t" + "csel x7, x7, x15, ne\n\t" + "csel x8, x8, x16, ne\n\t" + "csel x9, x9, x17, ne\n\t" + "csel x10, x10, x19, ne\n\t" + "cmp w30, #65\n\t" + "b.ne 1b\n\t" + "stp x3, x4, [%[r], #0]\n\t" + "stp x5, x6, [%[r], #16]\n\t" + "stp x7, x8, [%[r], #64]\n\t" + "stp x9, x10, [%[r], #80]\n\t" + : [table] "+r" (table) + : [r] "r" (r), [idx] "r" (idx) + : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "w30", "cc" + ); } #endif /* !WC_NO_CACHE_RESISTANT */ static const sp_table_entry_256 p256_table[2405] = { @@ -39328,7 +39410,7 @@ sp_digit* tmp = NULL; #else sp_point_256 rt[2]; - sp_digit tmp[2 * 4 * 6]; + sp_digit tmp[2 * 4 * 5]; #endif sp_point_256* p = NULL; sp_digit* negy = NULL; @@ -39347,7 +39429,7 @@ if (rt == NULL) err = MEMORY_E; if (err == MP_OKAY) { - tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, + tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (tmp == NULL) err = MEMORY_E; @@ -39406,7 +39488,7 @@ if (tmp != NULL) #endif { - ForceZero(tmp, sizeof(sp_digit) * 2 * 4 * 6); + ForceZero(tmp, sizeof(sp_digit) * 2 * 4 * 5); #ifdef WOLFSSL_SP_SMALL_STACK XFREE(tmp, heap, DYNAMIC_TYPE_ECC); #endif @@ -39493,7 +39575,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -39515,7 +39597,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -39611,7 +39693,7 @@ "subs x6, %[n], 8\n\t" "mov x7, xzr\n\t" "blt 2f\n\t" - /* Put in mulitples of 8 bytes. */ + /* Put in multiples of 8 bytes. */ "1:\n\t" "ldr x8, [x4], -8\n\t" "subs x6, x6, 8\n\t" @@ -39758,7 +39840,7 @@ sp_point_256* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -39766,7 +39848,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -40110,7 +40192,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -40200,8 +40282,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_256_div_4(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_256_div_4(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[8], t2[5]; sp_digit div, r1; @@ -40254,10 +40336,216 @@ * a First operand of the multiplication. * b Second operand of the multiplication. */ -static void sp_256_mont_mul_order_4(sp_digit* r, const sp_digit* a, const sp_digit* b) +SP_NOINLINE static void sp_256_mont_mul_order_4(sp_digit* r, + const sp_digit* a, const sp_digit* b) { - sp_256_mul_4(r, a, b); - sp_256_mont_reduce_order_4(r, p256_order, p256_mp_order); + __asm__ __volatile__ ( + "ldp x13, x14, [%[a], 0]\n\t" + "ldp x15, x16, [%[a], 16]\n\t" + "ldp x17, x19, [%[b], 0]\n\t" + "ldp x20, x21, [%[b], 16]\n\t" + "# A[0] * B[0]\n\t" + "umulh x6, x13, x17\n\t" + "mul x5, x13, x17\n\t" + "# A[2] * B[0]\n\t" + "umulh x8, x15, x17\n\t" + "mul x7, x15, x17\n\t" + "# A[1] * B[0]\n\t" + "mul x3, x14, x17\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x14, x17\n\t" + "adcs x7, x7, x4\n\t" + "adc x8, x8, xzr\n\t" + "# A[0] * B[2]\n\t" + "mul x3, x13, x20\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x13, x20\n\t" + "adcs x8, x8, x4\n\t" + "# A[1] * B[3]\n\t" + "mul x9, x14, x21\n\t" + "adcs x9, x9, xzr\n\t" + "umulh x10, x14, x21\n\t" + "adc x10, x10, xzr\n\t" + "# A[0] * B[1]\n\t" + "mul x3, x13, x19\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x13, x19\n\t" + "adcs x7, x7, x4\n\t" + "# A[2] * B[1]\n\t" + "mul x3, x15, x19\n\t" + "adcs x8, x8, x3\n\t" + "umulh x4, x15, x19\n\t" + "adcs x9, x9, x4\n\t" + "adc x10, x10, xzr\n\t" + "# A[1] * B[2]\n\t" + "mul x3, x14, x20\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x14, x20\n\t" + "adcs x9, x9, x4\n\t" + "adcs x10, x10, xzr\n\t" + "adc x11, xzr, xzr\n\t" + "# A[1] * B[1]\n\t" + "mul x3, x14, x19\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x14, x19\n\t" + "adcs x8, x8, x4\n\t" + "# A[3] * B[1]\n\t" + "mul x3, x16, x19\n\t" + "adcs x9, x9, x3\n\t" + "umulh x4, x16, x19\n\t" + "adcs x10, x10, x4\n\t" + "adc x11, x11, xzr\n\t" + "# A[2] * B[2]\n\t" + "mul x3, x15, x20\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x15, x20\n\t" + "adcs x10, x10, x4\n\t" + "# A[3] * B[3]\n\t" + "mul x3, x16, x21\n\t" + "adcs x11, x11, x3\n\t" + "umulh x12, x16, x21\n\t" + "adc x12, x12, xzr\n\t" + "# A[0] * B[3]\n\t" + "mul x3, x13, x21\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x13, x21\n\t" + "adcs x9, x9, x4\n\t" + "# A[2] * B[3]\n\t" + "mul x3, x15, x21\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x15, x21\n\t" + "adcs x11, x11, x4\n\t" + "adc x12, x12, xzr\n\t" + "# A[3] * B[0]\n\t" + "mul x3, x16, x17\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x16, x17\n\t" + "adcs x9, x9, x4\n\t" + "# A[3] * B[2]\n\t" + "mul x3, x16, x20\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x16, x20\n\t" + "adcs x11, x11, x4\n\t" + "adc x12, x12, xzr\n\t" + "ldp x13, x14, [%[m], 0]\n\t" + "mov x15, 0xffffffffffffffff\n\t" + "mov x16, 0xffffffff00000000\n\t" + "# mu = a[0] * mp\n\t" + "mul x17, %[mp], x5\n\t" + "# a[0+0] += m[0] * mu\n\t" + "mul x3, x13, x17\n\t" + "adds x5, x5, x3\n\t" + "umulh x4, x13, x17\n\t" + "adcs x6, x6, x4\n\t" + "# a[0+2] += m[2] * mu\n\t" + "mul x3, x15, x17\n\t" + "adcs x7, x7, x3\n\t" + "umulh x4, x15, x17\n\t" + "adcs x8, x8, x4\n\t" + "adcs x9, x9, xzr\n\t" + "adc x19, xzr, xzr\n\t" + "# a[0+1] += m[1] * mu\n\t" + "mul x3, x14, x17\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x14, x17\n\t" + "adcs x7, x7, x4\n\t" + "# a[0+3] += m[3] * mu\n\t" + "mul x3, x16, x17\n\t" + "adcs x8, x8, x3\n\t" + "umulh x4, x16, x17\n\t" + "adcs x9, x9, x4\n\t" + "# mu = a[1] * mp\n\t" + "mul x17, %[mp], x6\n\t" + "adc x19, x19, xzr\n\t" + "# a[1+0] += m[0] * mu\n\t" + "mul x3, x13, x17\n\t" + "adds x6, x6, x3\n\t" + "umulh x4, x13, x17\n\t" + "adcs x7, x7, x4\n\t" + "# a[1+2] += m[2] * mu\n\t" + "mul x3, x15, x17\n\t" + "adcs x8, x8, x3\n\t" + "umulh x4, x15, x17\n\t" + "adcs x9, x9, x4\n\t" + "adcs x10, x10, x19\n\t" + "adc x19, xzr, xzr\n\t" + "# a[1+1] += m[1] * mu\n\t" + "mul x3, x14, x17\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x14, x17\n\t" + "adcs x8, x8, x4\n\t" + "# a[1+3] += m[3] * mu\n\t" + "mul x3, x16, x17\n\t" + "adcs x9, x9, x3\n\t" + "umulh x4, x16, x17\n\t" + "adcs x10, x10, x4\n\t" + "# mu = a[2] * mp\n\t" + "mul x17, %[mp], x7\n\t" + "adc x19, x19, xzr\n\t" + "# a[2+0] += m[0] * mu\n\t" + "mul x3, x13, x17\n\t" + "adds x7, x7, x3\n\t" + "umulh x4, x13, x17\n\t" + "adcs x8, x8, x4\n\t" + "# a[2+2] += m[2] * mu\n\t" + "mul x3, x15, x17\n\t" + "adcs x9, x9, x3\n\t" + "umulh x4, x15, x17\n\t" + "adcs x10, x10, x4\n\t" + "adcs x11, x11, x19\n\t" + "adc x19, xzr, xzr\n\t" + "# a[2+1] += m[1] * mu\n\t" + "mul x3, x14, x17\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x14, x17\n\t" + "adcs x9, x9, x4\n\t" + "# a[2+3] += m[3] * mu\n\t" + "mul x3, x16, x17\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x16, x17\n\t" + "adcs x11, x11, x4\n\t" + "# mu = a[3] * mp\n\t" + "mul x17, %[mp], x8\n\t" + "adc x19, x19, xzr\n\t" + "# a[3+0] += m[0] * mu\n\t" + "mul x3, x13, x17\n\t" + "adds x8, x8, x3\n\t" + "umulh x4, x13, x17\n\t" + "adcs x9, x9, x4\n\t" + "# a[3+2] += m[2] * mu\n\t" + "mul x3, x15, x17\n\t" + "adcs x10, x10, x3\n\t" + "umulh x4, x15, x17\n\t" + "adcs x11, x11, x4\n\t" + "adcs x12, x12, x19\n\t" + "adc x19, xzr, xzr\n\t" + "# a[3+1] += m[1] * mu\n\t" + "mul x3, x14, x17\n\t" + "adds x9, x9, x3\n\t" + "umulh x4, x14, x17\n\t" + "adcs x10, x10, x4\n\t" + "# a[3+3] += m[3] * mu\n\t" + "mul x3, x16, x17\n\t" + "adcs x11, x11, x3\n\t" + "umulh x4, x16, x17\n\t" + "adcs x12, x12, x4\n\t" + "# x15 == -1\n\t" + "adcs x19, x19, x15\n\t" + "csel x13, x13, xzr, cs\n\t" + "csel x14, x14, xzr, cs\n\t" + "csel x15, x15, xzr, cs\n\t" + "csel x16, x16, xzr, cs\n\t" + "subs x9, x9, x13\n\t" + "sbcs x10, x10, x14\n\t" + "sbcs x11, x11, x15\n\t" + "stp x9, x10, [%[r], 0]\n\t" + "sbc x12, x12, x16\n\t" + "stp x11, x12, [%[r], 16]\n\t" + : + : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (p256_order), + [mp] "r" (p256_mp_order) + : "memory", "x3", "x4", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "cc" + ); } #if defined(HAVE_ECC_SIGN) || (defined(HAVE_ECC_VERIFY) && defined(WOLFSSL_SP_SMALL)) @@ -40267,11 +40555,6 @@ 0xf3b9cac2fc63254fU,0xbce6faada7179e84U,0xffffffffffffffffU, 0xffffffff00000000U }; -#else -/* The low half of the order-2 of the P256 curve. */ -static const sp_int_digit p256_order_low[2] = { - 0xf3b9cac2fc63254fU,0xbce6faada7179e84U -}; #endif /* WOLFSSL_SP_SMALL */ /* Square number mod the order of P256 curve. (r = a * a mod order) @@ -40279,10 +40562,184 @@ * r Result of the squaring. * a Number to square. */ -static void sp_256_mont_sqr_order_4(sp_digit* r, const sp_digit* a) +SP_NOINLINE static void sp_256_mont_sqr_order_4(sp_digit* r, + const sp_digit* a) { - sp_256_sqr_4(r, a); - sp_256_mont_reduce_order_4(r, p256_order, p256_mp_order); + __asm__ __volatile__ ( + "ldp x12, x13, [%[a], 0]\n\t" + "ldp x14, x15, [%[a], 16]\n\t" + "# A[0] * A[1]\n\t" + "umulh x6, x12, x13\n\t" + "mul x5, x12, x13\n\t" + "# A[0] * A[3]\n\t" + "umulh x8, x12, x15\n\t" + "mul x7, x12, x15\n\t" + "# A[0] * A[2]\n\t" + "mul x2, x12, x14\n\t" + "adds x6, x6, x2\n\t" + "umulh x3, x12, x14\n\t" + "adcs x7, x7, x3\n\t" + "# A[1] * A[3]\n\t" + "mul x2, x13, x15\n\t" + "adcs x8, x8, x2\n\t" + "umulh x9, x13, x15\n\t" + "adc x9, x9, xzr\n\t" + "# A[1] * A[2]\n\t" + "mul x2, x13, x14\n\t" + "adds x7, x7, x2\n\t" + "umulh x3, x13, x14\n\t" + "adcs x8, x8, x3\n\t" + "# A[2] * A[3]\n\t" + "mul x2, x14, x15\n\t" + "adcs x9, x9, x2\n\t" + "umulh x10, x14, x15\n\t" + "adc x10, x10, xzr\n\t" + "# Double\n\t" + "adds x5, x5, x5\n\t" + "adcs x6, x6, x6\n\t" + "adcs x7, x7, x7\n\t" + "adcs x8, x8, x8\n\t" + "adcs x9, x9, x9\n\t" + "adcs x10, x10, x10\n\t" + "adc x11, xzr, xzr\n\t" + "# A[0] * A[0]\n\t" + "umulh x3, x12, x12\n\t" + "mul x4, x12, x12\n\t" + "# A[1] * A[1]\n\t" + "mul x2, x13, x13\n\t" + "adds x5, x5, x3\n\t" + "umulh x3, x13, x13\n\t" + "adcs x6, x6, x2\n\t" + "# A[2] * A[2]\n\t" + "mul x2, x14, x14\n\t" + "adcs x7, x7, x3\n\t" + "umulh x3, x14, x14\n\t" + "adcs x8, x8, x2\n\t" + "# A[3] * A[3]\n\t" + "mul x2, x15, x15\n\t" + "adcs x9, x9, x3\n\t" + "umulh x3, x15, x15\n\t" + "adcs x10, x10, x2\n\t" + "adc x11, x11, x3\n\t" + "ldp x12, x13, [%[m], 0]\n\t" + "mov x14, 0xffffffffffffffff\n\t" + "mov x15, 0xffffffff00000000\n\t" + "# mu = a[0] * mp\n\t" + "mul x16, %[mp], x4\n\t" + "# a[0+0] += m[0] * mu\n\t" + "mul x2, x12, x16\n\t" + "adds x4, x4, x2\n\t" + "umulh x3, x12, x16\n\t" + "adcs x5, x5, x3\n\t" + "# a[0+2] += m[2] * mu\n\t" + "mul x2, x14, x16\n\t" + "adcs x6, x6, x2\n\t" + "umulh x3, x14, x16\n\t" + "adcs x7, x7, x3\n\t" + "adcs x8, x8, xzr\n\t" + "adc x17, xzr, xzr\n\t" + "# a[0+1] += m[1] * mu\n\t" + "mul x2, x13, x16\n\t" + "adds x5, x5, x2\n\t" + "umulh x3, x13, x16\n\t" + "adcs x6, x6, x3\n\t" + "# a[0+3] += m[3] * mu\n\t" + "mul x2, x15, x16\n\t" + "adcs x7, x7, x2\n\t" + "umulh x3, x15, x16\n\t" + "adcs x8, x8, x3\n\t" + "# mu = a[1] * mp\n\t" + "mul x16, %[mp], x5\n\t" + "adc x17, x17, xzr\n\t" + "# a[1+0] += m[0] * mu\n\t" + "mul x2, x12, x16\n\t" + "adds x5, x5, x2\n\t" + "umulh x3, x12, x16\n\t" + "adcs x6, x6, x3\n\t" + "# a[1+2] += m[2] * mu\n\t" + "mul x2, x14, x16\n\t" + "adcs x7, x7, x2\n\t" + "umulh x3, x14, x16\n\t" + "adcs x8, x8, x3\n\t" + "adcs x9, x9, x17\n\t" + "adc x17, xzr, xzr\n\t" + "# a[1+1] += m[1] * mu\n\t" + "mul x2, x13, x16\n\t" + "adds x6, x6, x2\n\t" + "umulh x3, x13, x16\n\t" + "adcs x7, x7, x3\n\t" + "# a[1+3] += m[3] * mu\n\t" + "mul x2, x15, x16\n\t" + "adcs x8, x8, x2\n\t" + "umulh x3, x15, x16\n\t" + "adcs x9, x9, x3\n\t" + "# mu = a[2] * mp\n\t" + "mul x16, %[mp], x6\n\t" + "adc x17, x17, xzr\n\t" + "# a[2+0] += m[0] * mu\n\t" + "mul x2, x12, x16\n\t" + "adds x6, x6, x2\n\t" + "umulh x3, x12, x16\n\t" + "adcs x7, x7, x3\n\t" + "# a[2+2] += m[2] * mu\n\t" + "mul x2, x14, x16\n\t" + "adcs x8, x8, x2\n\t" + "umulh x3, x14, x16\n\t" + "adcs x9, x9, x3\n\t" + "adcs x10, x10, x17\n\t" + "adc x17, xzr, xzr\n\t" + "# a[2+1] += m[1] * mu\n\t" + "mul x2, x13, x16\n\t" + "adds x7, x7, x2\n\t" + "umulh x3, x13, x16\n\t" + "adcs x8, x8, x3\n\t" + "# a[2+3] += m[3] * mu\n\t" + "mul x2, x15, x16\n\t" + "adcs x9, x9, x2\n\t" + "umulh x3, x15, x16\n\t" + "adcs x10, x10, x3\n\t" + "# mu = a[3] * mp\n\t" + "mul x16, %[mp], x7\n\t" + "adc x17, x17, xzr\n\t" + "# a[3+0] += m[0] * mu\n\t" + "mul x2, x12, x16\n\t" + "adds x7, x7, x2\n\t" + "umulh x3, x12, x16\n\t" + "adcs x8, x8, x3\n\t" + "# a[3+2] += m[2] * mu\n\t" + "mul x2, x14, x16\n\t" + "adcs x9, x9, x2\n\t" + "umulh x3, x14, x16\n\t" + "adcs x10, x10, x3\n\t" + "adcs x11, x11, x17\n\t" + "adc x17, xzr, xzr\n\t" + "# a[3+1] += m[1] * mu\n\t" + "mul x2, x13, x16\n\t" + "adds x8, x8, x2\n\t" + "umulh x3, x13, x16\n\t" + "adcs x9, x9, x3\n\t" + "# a[3+3] += m[3] * mu\n\t" + "mul x2, x15, x16\n\t" + "adcs x10, x10, x2\n\t" + "umulh x3, x15, x16\n\t" + "adcs x11, x11, x3\n\t" + "# x14 == -1\n\t" + "adcs x17, x17, x14\n\t" + "csel x12, x12, xzr, cs\n\t" + "csel x13, x13, xzr, cs\n\t" + "csel x14, x14, xzr, cs\n\t" + "csel x15, x15, xzr, cs\n\t" + "subs x8, x8, x12\n\t" + "sbcs x9, x9, x13\n\t" + "sbcs x10, x10, x14\n\t" + "stp x8, x9, [%[r], 0]\n\t" + "sbc x11, x11, x15\n\t" + "stp x10, x11, [%[r], 16]\n\t" + : + : [r] "r" (r), [a] "r" (a), [m] "r" (p256_order), + [mp] "r" (p256_mp_order) + : "memory", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "cc" + ); } #ifndef WOLFSSL_SP_SMALL @@ -40292,14 +40749,188 @@ * r Result of the squaring. * a Number to square. */ -static void sp_256_mont_sqr_n_order_4(sp_digit* r, const sp_digit* a, int n) +SP_NOINLINE static void sp_256_mont_sqr_n_order_4(sp_digit* r, + const sp_digit* a, int n) { - int i; - sp_256_mont_sqr_order_4(r, a); - for (i=1; i=112; i--) { - sp_256_mont_sqr_order_4(t2, t2); - if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) { - sp_256_mont_mul_order_4(t2, t2, a); - } - } - /* t2= a^ffffffff00000000ffffffffffffffffbce6f */ + + /* ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */ + sp_256_mont_sqr_order_4(t2, t2); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t15); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t7); sp_256_mont_sqr_n_order_4(t2, t2, 4); sp_256_mont_mul_order_4(t2, t2, t3); - /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84 */ - for (i=107; i>=64; i--) { - sp_256_mont_sqr_order_4(t2, t2); - if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) { - sp_256_mont_mul_order_4(t2, t2, a); - } - } - /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f */ + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t15); + sp_256_mont_sqr_n_order_4(t2, t2, 3); + sp_256_mont_mul_order_4(t2, t2, t5); sp_256_mont_sqr_n_order_4(t2, t2, 4); + sp_256_mont_mul_order_4(t2, t2, t5); + sp_256_mont_sqr_n_order_4(t2, t2, 3); sp_256_mont_mul_order_4(t2, t2, t3); - /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2 */ - for (i=59; i>=32; i--) { - sp_256_mont_sqr_order_4(t2, t2); - if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) { - sp_256_mont_mul_order_4(t2, t2, a); - } - } - /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2f */ - sp_256_mont_sqr_n_order_4(t2, t2, 4); + sp_256_mont_sqr_n_order_4(t2, t2, 3); sp_256_mont_mul_order_4(t2, t2, t3); - /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254 */ - for (i=27; i>=0; i--) { - sp_256_mont_sqr_order_4(t2, t2); - if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) { - sp_256_mont_mul_order_4(t2, t2, a); - } - } - /* t2= a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632540 */ + sp_256_mont_sqr_n_order_4(t2, t2, 2); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t7); + sp_256_mont_sqr_n_order_4(t2, t2, 4); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t15); + sp_256_mont_sqr_n_order_4(t2, t2, 6); + sp_256_mont_mul_order_4(t2, t2, t15); + sp_256_mont_sqr_n_order_4(t2, t2, 2); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 6); + sp_256_mont_mul_order_4(t2, t2, t15); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t7); sp_256_mont_sqr_n_order_4(t2, t2, 4); - /* r = a^ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f */ - sp_256_mont_mul_order_4(r, t2, t3); + sp_256_mont_mul_order_4(t2, t2, t7); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t7); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t5); + sp_256_mont_sqr_n_order_4(t2, t2, 3); + sp_256_mont_mul_order_4(t2, t2, t3); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t15); + sp_256_mont_sqr_n_order_4(t2, t2, 2); + sp_256_mont_mul_order_4(t2, t2, t3); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t3); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t3); + sp_256_mont_sqr_n_order_4(t2, t2, 3); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 5); + sp_256_mont_mul_order_4(t2, t2, t5); + sp_256_mont_sqr_n_order_4(t2, t2, 2); + sp_256_mont_mul_order_4(t2, t2, a); + sp_256_mont_sqr_n_order_4(t2, t2, 6); + sp_256_mont_mul_order_4(r, t2, t15); + /* Multiplications: 31 */ #endif /* WOLFSSL_SP_SMALL */ } @@ -40526,7 +41189,7 @@ sp_digit* e = NULL; sp_point_256* point = NULL; #else - sp_digit e[7 * 2 * 4]; + sp_digit e[10 * 2 * 4]; sp_point_256 point[1]; #endif sp_digit* x = NULL; @@ -40548,7 +41211,7 @@ err = MEMORY_E; } if (err == MP_OKAY) { - e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 7 * 2 * 4, heap, + e = (sp_digit*)XMALLOC(sizeof(sp_digit) * 10 * 2 * 4, heap, DYNAMIC_TYPE_ECC); if (e == NULL) err = MEMORY_E; @@ -40623,7 +41286,7 @@ if (e != NULL) #endif { - ForceZero(e, sizeof(sp_digit) * 7 * 2 * 4); + ForceZero(e, sizeof(sp_digit) * 10 * 2 * 4); #ifdef WOLFSSL_SP_SMALL_STACK XFREE(e, heap, DYNAMIC_TYPE_ECC); #endif @@ -40652,7 +41315,7 @@ sp_digit x[2*4]; sp_digit k[2*4]; sp_digit r[2*4]; - sp_digit tmp[3 * 2*4]; + sp_digit tmp[6 * 2*4]; sp_point_256 point; sp_digit* s; sp_digit* kInv; @@ -40797,7 +41460,7 @@ XMEMSET(ctx->x, 0, sizeof(sp_digit) * 2U * 4U); XMEMSET(ctx->k, 0, sizeof(sp_digit) * 2U * 4U); XMEMSET(ctx->r, 0, sizeof(sp_digit) * 2U * 4U); - XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 3U * 2U * 4U); + XMEMSET(ctx->tmp, 0, sizeof(sp_digit) * 6U * 2U * 4U); } return err; @@ -41104,7 +41767,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -41428,7 +42091,51 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Add two Montgomery form numbers (r = a + b % m). + * + * r Result of addition. + * a First number to add in Montgomery form. + * b Second number to add in Montgomery form. + * m Modulus (prime). + */ +SP_NOINLINE static void sp_256_mont_add_4(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) +{ + __asm__ __volatile__ ( + "ldp x4, x5, [%[a], 0]\n\t" + "ldp x6, x7, [%[a], 16]\n\t" + "ldp x8, x9, [%[b], 0]\n\t" + "ldp x10, x11, [%[b], 16]\n\t" + "adds x4, x4, x8\n\t" + "adcs x5, x5, x9\n\t" + "adcs x6, x6, x10\n\t" + "adcs x7, x7, x11\n\t" + "csetm x14, cs\n\t" + "subs x4, x4, x14\n\t" + "lsr x12, x14, 32\n\t" + "sbcs x5, x5, x12\n\t" + "sub x13, xzr, x12\n\t" + "sbcs x6, x6, xzr\n\t" + "sbcs x7, x7, x13\n\t" + "sbc x13, xzr, xzr\n\t" + "sub x14, x14, x13\n\t" + "subs x4, x4, x14\n\t" + "lsr x12, x14, 32\n\t" + "sbcs x5, x5, x12\n\t" + "sub x13, xzr, x12\n\t" + "sbcs x6, x6, xzr\n\t" + "stp x4, x5, [%[r],0]\n\t" + "sbc x7, x7, x13\n\t" + "stp x6, x7, [%[r],16]\n\t" + : + : [r] "r" (r), [a] "r" (a), [b] "r" (b) + : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "cc" + ); + + (void)m; +} + +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -41456,19 +42163,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 4; + /* y^2 - x^3 - a.x = b */ sp_256_sqr_4(t1, point->y); (void)sp_256_mod_4(t1, t1, p256_mod); sp_256_sqr_4(t2, point->x); (void)sp_256_mod_4(t2, t2, p256_mod); sp_256_mul_4(t2, t2, point->x); (void)sp_256_mod_4(t2, t2, p256_mod); - (void)sp_256_sub_4(t2, p256_mod, t2); - sp_256_mont_add_4(t1, t1, t2, p256_mod); + sp_256_mont_sub_4(t1, t1, t2, p256_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_256_mont_add_4(t1, t1, point->x, p256_mod); sp_256_mont_add_4(t1, t1, point->x, p256_mod); sp_256_mont_add_4(t1, t1, point->x, p256_mod); + if (sp_256_cmp_4(t1, p256_b) != 0) { err = MP_VAL; } @@ -41482,7 +42191,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -42443,87 +43152,87 @@ "ldp x19, x20, [%[a], 16]\n\t" "ldp x21, x22, [%[a], 32]\n\t" "# A[0] * A[1]\n\t" - "mul x6, x16, x17\n\t" - "umulh x7, x16, x17\n\t" + "mul x6, x16, x17\n\t" + "umulh x7, x16, x17\n\t" "# A[0] * A[2]\n\t" - "mul x4, x16, x19\n\t" - "umulh x5, x16, x19\n\t" - "adds x7, x7, x4\n\t" + "mul x4, x16, x19\n\t" + "umulh x5, x16, x19\n\t" + "adds x7, x7, x4\n\t" "# A[0] * A[3]\n\t" - "mul x4, x16, x20\n\t" - "adc x8, xzr, x5\n\t" - "umulh x5, x16, x20\n\t" - "adds x8, x8, x4\n\t" + "mul x4, x16, x20\n\t" + "adc x8, xzr, x5\n\t" + "umulh x5, x16, x20\n\t" + "adds x8, x8, x4\n\t" "# A[1] * A[2]\n\t" - "mul x4, x17, x19\n\t" - "adc x9, xzr, x5\n\t" - "umulh x5, x17, x19\n\t" - "adds x8, x8, x4\n\t" + "mul x4, x17, x19\n\t" + "adc x9, xzr, x5\n\t" + "umulh x5, x17, x19\n\t" + "adds x8, x8, x4\n\t" "# A[0] * A[4]\n\t" - "mul x4, x16, x21\n\t" - "adcs x9, x9, x5\n\t" - "umulh x5, x16, x21\n\t" - "adc x10, xzr, xzr\n\t" - "adds x9, x9, x4\n\t" + "mul x4, x16, x21\n\t" + "adcs x9, x9, x5\n\t" + "umulh x5, x16, x21\n\t" + "adc x10, xzr, xzr\n\t" + "adds x9, x9, x4\n\t" "# A[1] * A[3]\n\t" - "mul x4, x17, x20\n\t" - "adc x10, x10, x5\n\t" - "umulh x5, x17, x20\n\t" - "adds x9, x9, x4\n\t" + "mul x4, x17, x20\n\t" + "adc x10, x10, x5\n\t" + "umulh x5, x17, x20\n\t" + "adds x9, x9, x4\n\t" "# A[0] * A[5]\n\t" - "mul x4, x16, x22\n\t" - "adcs x10, x10, x5\n\t" - "umulh x5, x16, x22\n\t" - "adc x11, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" + "mul x4, x16, x22\n\t" + "adcs x10, x10, x5\n\t" + "umulh x5, x16, x22\n\t" + "adc x11, xzr, xzr\n\t" + "adds x10, x10, x4\n\t" "# A[1] * A[4]\n\t" - "mul x4, x17, x21\n\t" - "adc x11, x11, x5\n\t" - "umulh x5, x17, x21\n\t" - "adds x10, x10, x4\n\t" + "mul x4, x17, x21\n\t" + "adc x11, x11, x5\n\t" + "umulh x5, x17, x21\n\t" + "adds x10, x10, x4\n\t" "# A[2] * A[3]\n\t" - "mul x4, x19, x20\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x19, x20\n\t" - "adc x12, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" + "mul x4, x19, x20\n\t" + "adcs x11, x11, x5\n\t" + "umulh x5, x19, x20\n\t" + "adc x12, xzr, xzr\n\t" + "adds x10, x10, x4\n\t" "# A[1] * A[5]\n\t" - "mul x4, x17, x22\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x17, x22\n\t" - "adc x12, x12, xzr\n\t" - "adds x11, x11, x4\n\t" + "mul x4, x17, x22\n\t" + "adcs x11, x11, x5\n\t" + "umulh x5, x17, x22\n\t" + "adc x12, x12, xzr\n\t" + "adds x11, x11, x4\n\t" "# A[2] * A[4]\n\t" - "mul x4, x19, x21\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x19, x21\n\t" - "adc x13, xzr, xzr\n\t" - "adds x11, x11, x4\n\t" + "mul x4, x19, x21\n\t" + "adcs x12, x12, x5\n\t" + "umulh x5, x19, x21\n\t" + "adc x13, xzr, xzr\n\t" + "adds x11, x11, x4\n\t" "# A[2] * A[5]\n\t" - "mul x4, x19, x22\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x19, x22\n\t" - "adc x13, x13, xzr\n\t" - "adds x12, x12, x4\n\t" + "mul x4, x19, x22\n\t" + "adcs x12, x12, x5\n\t" + "umulh x5, x19, x22\n\t" + "adc x13, x13, xzr\n\t" + "adds x12, x12, x4\n\t" "# A[3] * A[4]\n\t" - "mul x4, x20, x21\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x20, x21\n\t" - "adc x14, xzr, xzr\n\t" - "adds x12, x12, x4\n\t" + "mul x4, x20, x21\n\t" + "adcs x13, x13, x5\n\t" + "umulh x5, x20, x21\n\t" + "adc x14, xzr, xzr\n\t" + "adds x12, x12, x4\n\t" "# A[3] * A[5]\n\t" - "mul x4, x20, x22\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x20, x22\n\t" - "adc x14, x14, xzr\n\t" - "adds x13, x13, x4\n\t" + "mul x4, x20, x22\n\t" + "adcs x13, x13, x5\n\t" + "umulh x5, x20, x22\n\t" + "adc x14, x14, xzr\n\t" + "adds x13, x13, x4\n\t" "# A[4] * A[5]\n\t" - "mul x4, x21, x22\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x21, x22\n\t" - "adc x15, xzr, xzr\n\t" - "adds x14, x14, x4\n\t" - "adc x15, x15, x5\n\t" + "mul x4, x21, x22\n\t" + "adcs x14, x14, x5\n\t" + "umulh x5, x21, x22\n\t" + "adc x15, xzr, xzr\n\t" + "adds x14, x14, x4\n\t" + "adc x15, x15, x5\n\t" "# Double\n\t" "adds x6, x6, x6\n\t" "adcs x7, x7, x7\n\t" @@ -42535,34 +43244,34 @@ "adcs x13, x13, x13\n\t" "adcs x14, x14, x14\n\t" "# A[0] * A[0]\n\t" - "mul x5, x16, x16\n\t" + "mul x5, x16, x16\n\t" "adcs x15, x15, x15\n\t" - "umulh x2, x16, x16\n\t" + "umulh x2, x16, x16\n\t" "cset x16, cs\n\t" "# A[1] * A[1]\n\t" - "mul x3, x17, x17\n\t" + "mul x3, x17, x17\n\t" "adds x6, x6, x2\n\t" - "umulh x4, x17, x17\n\t" + "umulh x4, x17, x17\n\t" "adcs x7, x7, x3\n\t" "# A[2] * A[2]\n\t" - "mul x2, x19, x19\n\t" + "mul x2, x19, x19\n\t" "adcs x8, x8, x4\n\t" - "umulh x3, x19, x19\n\t" + "umulh x3, x19, x19\n\t" "adcs x9, x9, x2\n\t" "# A[3] * A[3]\n\t" - "mul x4, x20, x20\n\t" + "mul x4, x20, x20\n\t" "adcs x10, x10, x3\n\t" - "umulh x2, x20, x20\n\t" + "umulh x2, x20, x20\n\t" "adcs x11, x11, x4\n\t" "# A[4] * A[4]\n\t" - "mul x3, x21, x21\n\t" + "mul x3, x21, x21\n\t" "adcs x12, x12, x2\n\t" - "umulh x4, x21, x21\n\t" + "umulh x4, x21, x21\n\t" "adcs x13, x13, x3\n\t" "# A[5] * A[5]\n\t" - "mul x2, x22, x22\n\t" + "mul x2, x22, x22\n\t" "adcs x14, x14, x4\n\t" - "umulh x3, x22, x22\n\t" + "umulh x3, x22, x22\n\t" "adcs x15, x15, x2\n\t" "stp x5, x6, [%[r], 0]\n\t" "adc x16, x16, x3\n\t" @@ -42606,7 +43315,7 @@ "adcs x4, x4, x8\n\t" "str x3, [%[r], 32]\n\t" "str x4, [%[r], 40]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -42773,14 +43482,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -43193,7 +43902,7 @@ "umulh x8, x10, x9\n\t" "adds x6, x6, x7\n\t" "adcs x8, x8, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x16, x17, x6\n\t" "ldr x17, [%[a], 48]\n\t" "adcs x17, x17, x8\n\t" @@ -43238,7 +43947,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_6(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -43252,7 +43961,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_6(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -43268,10 +43977,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_6(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_6(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_6(r, a, m, mp); for (; n > 1; n--) { @@ -43559,8 +44268,8 @@ * b Second number to add in Montgomery form. * m Modulus (prime). */ -static void sp_384_mont_add_6(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +SP_NOINLINE static void sp_384_mont_add_6(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) { sp_digit o; @@ -43574,7 +44283,8 @@ * a Number to double in Montgomery form. * m Modulus (prime). */ -static void sp_384_mont_dbl_6(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_384_mont_dbl_6(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_digit o; @@ -43588,7 +44298,8 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ -static void sp_384_mont_tpl_6(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_384_mont_tpl_6(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_digit o; @@ -43686,8 +44397,8 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -static void sp_384_mont_sub_6(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +SP_NOINLINE static void sp_384_mont_sub_6(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) { sp_digit o; @@ -43695,7 +44406,6 @@ sp_384_cond_add_6(r, r, m, o); } -#define sp_384_mont_sub_lower_6 sp_384_mont_sub_6 static void sp_384_rshift1_6(sp_digit* r, const sp_digit* a) { __asm__ __volatile__ ( @@ -43723,7 +44433,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_384_div2_6(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_384_mont_div2_6(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_digit o; @@ -43776,7 +44487,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_6(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_6(t2, t2, p384_mod); + sp_384_mont_div2_6(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_6(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -43786,7 +44497,7 @@ /* X = X - Y */ sp_384_mont_sub_6(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_6(y, y, x, p384_mod); + sp_384_mont_sub_6(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_6(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -43809,7 +44520,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_6_ctx* ctx = (sp_384_proj_point_dbl_6_ctx*)sp_ctx->data; @@ -43883,7 +44595,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_6(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_6(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -43908,7 +44620,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_6(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_6(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -43933,8 +44645,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_384_mont_dbl_lower_6 sp_384_mont_dbl_6 -#define sp_384_mont_tpl_lower_6 sp_384_mont_tpl_6 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -43973,7 +44683,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_6(a, t1, p384_mod); + sp_384_mont_tpl_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod); @@ -43982,8 +44692,8 @@ sp_384_mont_dbl_6(t2, b, p384_mod); sp_384_mont_sub_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_6(b, t2, p384_mod); + sp_384_mont_sub_6(t2, b, x, p384_mod); + sp_384_mont_dbl_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_6(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -44003,7 +44713,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_6(a, t1, p384_mod); + sp_384_mont_tpl_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod); @@ -44012,8 +44722,8 @@ sp_384_mont_dbl_6(t2, b, p384_mod); sp_384_mont_sub_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_6(b, t2, p384_mod); + sp_384_mont_sub_6(t2, b, x, p384_mod); + sp_384_mont_dbl_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_6(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -44023,7 +44733,7 @@ sp_384_mont_sub_6(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_6(y, y, p384_mod); + sp_384_mont_div2_6(y, y, p384_mod); } /* Compare two numbers to determine if they are equal. @@ -44061,12 +44771,12 @@ static void sp_384_proj_point_add_6(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*6; - sp_digit* t3 = t + 4*6; - sp_digit* t4 = t + 6*6; - sp_digit* t5 = t + 8*6; - sp_digit* t6 = t + 10*6; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*6; + sp_digit* t2 = t + 4*6; + sp_digit* t3 = t + 6*6; + sp_digit* t4 = t + 8*6; + sp_digit* t5 = t + 10*6; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_6(t1, q->z, p384_mod, p384_mp_mod); @@ -44088,17 +44798,9 @@ sp_384_proj_point_dbl_6(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_6(t2, t2, t1, p384_mod); @@ -44117,20 +44819,31 @@ sp_384_mont_dbl_6(t3, y, p384_mod); sp_384_mont_sub_6(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_6(y, y, x, p384_mod); + sp_384_mont_sub_6(y, y, x, p384_mod); sp_384_mont_mul_6(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_6(y, y, t5, p384_mod); - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -44176,12 +44889,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*6; - ctx->t3 = t + 4*6; - ctx->t4 = t + 6*6; - ctx->t5 = t + 8*6; - ctx->t6 = t + 10*6; + ctx->t6 = t; + ctx->t1 = t + 2*6; + ctx->t2 = t + 4*6; + ctx->t3 = t + 6*6; + ctx->t4 = t + 8*6; + ctx->t5 = t + 10*6; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -44288,7 +45001,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_6(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_6(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -44301,22 +45014,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -44375,7 +45094,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_6(a, t1, p384_mod); + sp_384_mont_tpl_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod); @@ -44385,8 +45104,8 @@ sp_384_mont_dbl_6(t2, b, p384_mod); sp_384_mont_sub_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_6(b, t2, p384_mod); + sp_384_mont_sub_6(t2, b, x, p384_mod); + sp_384_mont_dbl_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_6(r[j].z, z, y, p384_mod, p384_mp_mod); z = r[j].z; @@ -44400,7 +45119,7 @@ sp_384_mont_mul_6(y, b, a, p384_mod, p384_mp_mod); sp_384_mont_sub_6(y, y, t1, p384_mod); /* Y = Y/2 */ - sp_384_div2_6(r[j].y, y, p384_mod); + sp_384_mont_div2_6(r[j].y, y, p384_mod); r[j].infinity = 0; } } @@ -44474,8 +45193,8 @@ sp_384_mont_sub_6(xs, xs, t1, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_384_mont_sub_lower_6(ys, ya, xs, p384_mod); - sp_384_mont_sub_lower_6(ya, ya, xa, p384_mod); + sp_384_mont_sub_6(ys, ya, xs, p384_mod); + sp_384_mont_sub_6(ya, ya, xa, p384_mod); sp_384_mont_mul_6(ya, ya, t4, p384_mod, p384_mp_mod); sp_384_sub_6(t6, p384_mod, t6); sp_384_mont_mul_6(ys, ys, t6, p384_mod, p384_mp_mod); @@ -44559,54 +45278,73 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ -static void sp_384_get_point_33_6(sp_point_384* r, const sp_point_384* table, - int idx) +SP_NOINLINE static void sp_384_get_point_33_6(sp_point_384* r, + const sp_point_384* table, int idx) { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; + sp_digit z0 = 0; + sp_digit z1 = 0; + sp_digit z2 = 0; + sp_digit z3 = 0; + sp_digit z4 = 0; + sp_digit z5 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; - r->z[0] = 0; - r->z[1] = 0; - r->z[2] = 0; - r->z[3] = 0; - r->z[4] = 0; - r->z[5] = 0; for (i = 1; i < 33; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - r->z[0] |= mask & table[i].z[0]; - r->z[1] |= mask & table[i].z[1]; - r->z[2] |= mask & table[i].z[2]; - r->z[3] |= mask & table[i].z[3]; - r->z[4] |= mask & table[i].z[4]; - r->z[5] |= mask & table[i].z[5]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + z0 |= mask & table[i].z[0]; + z1 |= mask & table[i].z[1]; + z2 |= mask & table[i].z[2]; + z3 |= mask & table[i].z[3]; + z4 |= mask & table[i].z[4]; + z5 |= mask & table[i].z[5]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; + r->z[0] = z0; + r->z[1] = z1; + r->z[2] = z2; + r->z[3] = z3; + r->z[4] = z4; + r->z[5] = z5; } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -44649,7 +45387,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * + t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -44754,15 +45492,12 @@ return err; } -#ifndef WC_NO_CACHE_RESISTANT /* A table entry for pre-computed points. */ typedef struct sp_table_entry_384 { sp_digit x[6]; sp_digit y[6]; } sp_table_entry_384; -#if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) -#endif /* FP_ECC | WOLFSSL_SP_SMALL */ /* Add two Montgomery form projective points. The second point has a q value of * one. * Only the first point can be the same pointer as the result point. @@ -44775,12 +45510,12 @@ static void sp_384_proj_point_add_qz1_6(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*6; - sp_digit* t3 = t + 4*6; - sp_digit* t4 = t + 6*6; - sp_digit* t5 = t + 8*6; - sp_digit* t6 = t + 10*6; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*6; + sp_digit* t6 = t + 4*6; + sp_digit* t1 = t + 6*6; + sp_digit* t4 = t + 8*6; + sp_digit* t5 = t + 10*6; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -44796,13 +45531,9 @@ sp_384_proj_point_dbl_6(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_6(t2, t2, p->x, p384_mod); @@ -44811,36 +45542,46 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_6(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_6(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_6(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_6(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_6(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_6(x, t1, t5, p384_mod); - sp_384_mont_dbl_6(t1, t3, p384_mod); - sp_384_mont_sub_6(x, x, t1, p384_mod); + sp_384_mont_sqr_6(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_6(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_6(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_6(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_6(t2, t2, t1, p384_mod); + sp_384_mont_dbl_6(t5, t3, p384_mod); + sp_384_mont_sub_6(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_6(t3, t3, x, p384_mod); + sp_384_mont_sub_6(t3, t3, x, p384_mod); sp_384_mont_mul_6(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_6(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_6(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_6(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_6(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } +#ifndef WC_NO_CACHE_RESISTANT +#if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) +#endif /* FP_ECC | WOLFSSL_SP_SMALL */ #ifdef FP_ECC /* Convert the projective point to affine. * Ordinates are in Montgomery form. @@ -44960,7 +45701,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_64_6(sp_point_384* r, @@ -44968,34 +45709,47 @@ { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; for (i = 1; i < 64; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -45142,13 +45896,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -45219,8 +45975,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_win_add_sub_6(r, g, k, map, ct, heap); @@ -45241,10 +45997,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -45376,7 +46134,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_256_6(sp_point_384* r, @@ -45384,34 +46142,47 @@ { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; for (i = 1; i < 256; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -45558,13 +46329,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -45635,8 +46408,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_win_add_sub_6(r, g, k, map, ct, heap); @@ -45657,10 +46430,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -45753,7 +46528,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -45764,7 +46539,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_384* point = NULL; + sp_point_384* point = NULL; sp_digit* k = NULL; #else sp_point_384 point[2]; @@ -47562,7 +48337,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_65_6(sp_point_384* r, @@ -47570,34 +48345,47 @@ { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; for (i = 1; i < 65; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; } #endif /* !WC_NO_CACHE_RESISTANT */ static const sp_table_entry_384 p384_table[3575] = { @@ -65558,7 +66346,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -65580,7 +66368,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -65680,7 +66468,7 @@ "subs x6, %[n], 8\n\t" "mov x7, xzr\n\t" "blt 2f\n\t" - /* Put in mulitples of 8 bytes. */ + /* Put in multiples of 8 bytes. */ "1:\n\t" "ldr x8, [x4], -8\n\t" "subs x6, x6, 8\n\t" @@ -65827,7 +66615,7 @@ sp_point_384* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -65835,7 +66623,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -66242,7 +67030,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -66334,8 +67122,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_384_div_6(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_384_div_6(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[12], t2[7]; sp_digit div, r1; @@ -67036,7 +67824,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_384_cmp_6(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_384_cmp_6(u, v) >= 0))) { sp_384_sub_6(u, u, v); o = sp_384_sub_6(b, b, d); if (o != 0) @@ -67111,7 +67899,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -67435,7 +68223,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -67463,19 +68251,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 6; + /* y^2 - x^3 - a.x = b */ sp_384_sqr_6(t1, point->y); (void)sp_384_mod_6(t1, t1, p384_mod); sp_384_sqr_6(t2, point->x); (void)sp_384_mod_6(t2, t2, p384_mod); sp_384_mul_6(t2, t2, point->x); (void)sp_384_mod_6(t2, t2, p384_mod); - (void)sp_384_sub_6(t2, p384_mod, t2); - sp_384_mont_add_6(t1, t1, t2, p384_mod); + sp_384_mont_sub_6(t1, t1, t2, p384_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_384_mont_add_6(t1, t1, point->x, p384_mod); sp_384_mont_add_6(t1, t1, point->x, p384_mod); sp_384_mont_add_6(t1, t1, point->x, p384_mod); + if (sp_384_cmp_6(t1, p384_b) != 0) { err = MP_VAL; } @@ -67489,7 +68279,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -69156,7 +69946,7 @@ "stp x3, x4, [%[r]], #16\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r]], #16\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" "cmp %[a], x11\n\t" "b.ne 1b\n\t" "adds %[c], %[c], #-1\n\t" @@ -69164,7 +69954,7 @@ "ldr x7, [%[b]], #8\n\t" "adcs x3, x3, x7\n\t" "str x3, [%[r]], #8\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "cc" @@ -69208,7 +69998,7 @@ "ldr x7, [%[b], 64]\n\t" "adcs x3, x3, x7\n\t" "str x3, [%[r], 64]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -69828,7 +70618,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -70039,8 +70829,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_521_div_9(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_521_div_9(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[19]; sp_digit t2[10]; @@ -70115,14 +70905,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -70365,7 +71155,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_mul_9(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -70948,7 +71738,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_sqr_9(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -71385,10 +72175,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_9(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_9(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_9(r, a, m, mp); for (; n > 1; n--) { @@ -71584,7 +72374,7 @@ "umulh x8, x11, x9\n\t" "adds x5, x5, x7\n\t" "adcs x8, x8, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x21, x22, x5\n\t" "ldr x22, [%[a], 72]\n\t" "adcs x22, x22, x8\n\t" @@ -71687,8 +72477,8 @@ * b Second number to add in Montgomery form. * m Modulus (prime). */ -static void sp_521_mont_add_9(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +SP_NOINLINE static void sp_521_mont_add_9(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -71727,9 +72517,11 @@ "stp x10, x11, [%[r], 48]\n\t" "str x12, [%[r], 64]\n\t" : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) + : [r] "r" (r), [a] "r" (a), [b] "r" (b) : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "cc" ); + + (void)m; } /* Double a Montgomery form number (r = a + a % m). @@ -71738,7 +72530,8 @@ * a Number to double in Montgomery form. * m Modulus (prime). */ -static void sp_521_mont_dbl_9(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_521_mont_dbl_9(sp_digit* r, const sp_digit* a, + const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -71772,9 +72565,11 @@ "stp x10, x11, [%[r], 48]\n\t" "str x12, [%[r], 64]\n\t" : - : [r] "r" (r), [a] "r" (a), [m] "r" (m) + : [r] "r" (r), [a] "r" (a) : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "cc" ); + + (void)m; } /* Triple a Montgomery form number (r = a + a + a % m). @@ -71783,7 +72578,8 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ -static void sp_521_mont_tpl_9(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_521_mont_tpl_9(sp_digit* r, const sp_digit* a, + const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -71826,9 +72622,11 @@ "stp x20, x21, [%[r], 48]\n\t" "str x22, [%[r], 64]\n\t" : - : [r] "r" (r), [a] "r" (a), [m] "r" (m) + : [r] "r" (r), [a] "r" (a) : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "cc" ); + + (void)m; } /* Subtract two Montgomery form numbers (r = a - b % m). @@ -71838,8 +72636,8 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -static void sp_521_mont_sub_9(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +SP_NOINLINE static void sp_521_mont_sub_9(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -71879,12 +72677,13 @@ "stp x10, x11, [%[r], 48]\n\t" "str x12, [%[r], 64]\n\t" : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) + : [r] "r" (r), [a] "r" (a), [b] "r" (b) : "memory", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x19", "x20", "x21", "x22", "cc" ); + + (void)m; } -#define sp_521_mont_sub_lower_9 sp_521_mont_sub_9 #ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -72019,7 +72818,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_521_div2_9(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_521_mont_div2_9(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_digit o; @@ -72072,7 +72872,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_9(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_9(t2, t2, p521_mod); + sp_521_mont_div2_9(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_9(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -72082,7 +72882,7 @@ /* X = X - Y */ sp_521_mont_sub_9(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_9(y, y, x, p521_mod); + sp_521_mont_sub_9(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_9(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -72105,7 +72905,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_9_ctx* ctx = (sp_521_proj_point_dbl_9_ctx*)sp_ctx->data; @@ -72179,7 +72980,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_9(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_9(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -72204,7 +73005,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -72229,8 +73030,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_521_mont_dbl_lower_9 sp_521_mont_dbl_9 -#define sp_521_mont_tpl_lower_9 sp_521_mont_tpl_9 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -72269,7 +73068,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -72278,8 +73077,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -72299,7 +73098,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -72308,8 +73107,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -72319,7 +73118,7 @@ sp_521_mont_sub_9(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_9(y, y, p521_mod); + sp_521_mont_div2_9(y, y, p521_mod); } /* Compare two numbers to determine if they are equal. @@ -72359,12 +73158,12 @@ static void sp_521_proj_point_add_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*9; + sp_digit* t2 = t + 4*9; + sp_digit* t3 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_9(t1, q->z, p521_mod, p521_mp_mod); @@ -72386,17 +73185,9 @@ sp_521_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_9(t2, t2, t1, p521_mod); @@ -72415,20 +73206,31 @@ sp_521_mont_dbl_9(t3, y, p521_mod); sp_521_mont_sub_9(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_9(y, y, x, p521_mod); + sp_521_mont_sub_9(y, y, x, p521_mod); sp_521_mont_mul_9(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_9(y, y, t5, p521_mod); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -72474,12 +73276,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*9; - ctx->t3 = t + 4*9; - ctx->t4 = t + 6*9; - ctx->t5 = t + 8*9; - ctx->t6 = t + 10*9; + ctx->t6 = t; + ctx->t1 = t + 2*9; + ctx->t2 = t + 4*9; + ctx->t3 = t + 6*9; + ctx->t4 = t + 8*9; + ctx->t5 = t + 10*9; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -72586,7 +73388,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -72599,22 +73401,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -72673,7 +73481,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -72683,8 +73491,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(r[j].z, z, y, p521_mod, p521_mp_mod); z = r[j].z; @@ -72698,7 +73506,7 @@ sp_521_mont_mul_9(y, b, a, p521_mod, p521_mp_mod); sp_521_mont_sub_9(y, y, t1, p521_mod); /* Y = Y/2 */ - sp_521_div2_9(r[j].y, y, p521_mod); + sp_521_mont_div2_9(r[j].y, y, p521_mod); r[j].infinity = 0; } } @@ -72772,8 +73580,8 @@ sp_521_mont_sub_9(xs, xs, t1, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_521_mont_sub_lower_9(ys, ya, xs, p521_mod); - sp_521_mont_sub_lower_9(ya, ya, xa, p521_mod); + sp_521_mont_sub_9(ys, ya, xs, p521_mod); + sp_521_mont_sub_9(ya, ya, xa, p521_mod); sp_521_mont_mul_9(ya, ya, t4, p521_mod, p521_mp_mod); sp_521_sub_9(t6, p521_mod, t6); sp_521_mont_mul_9(ys, ys, t6, p521_mod, p521_mp_mod); @@ -72857,72 +73665,100 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ -static void sp_521_get_point_33_9(sp_point_521* r, const sp_point_521* table, - int idx) +SP_NOINLINE static void sp_521_get_point_33_9(sp_point_521* r, + const sp_point_521* table, int idx) { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit x6 = 0; + sp_digit x7 = 0; + sp_digit x8 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; + sp_digit y6 = 0; + sp_digit y7 = 0; + sp_digit y8 = 0; + sp_digit z0 = 0; + sp_digit z1 = 0; + sp_digit z2 = 0; + sp_digit z3 = 0; + sp_digit z4 = 0; + sp_digit z5 = 0; + sp_digit z6 = 0; + sp_digit z7 = 0; + sp_digit z8 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->x[6] = 0; - r->x[7] = 0; - r->x[8] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; - r->y[6] = 0; - r->y[7] = 0; - r->y[8] = 0; - r->z[0] = 0; - r->z[1] = 0; - r->z[2] = 0; - r->z[3] = 0; - r->z[4] = 0; - r->z[5] = 0; - r->z[6] = 0; - r->z[7] = 0; - r->z[8] = 0; for (i = 1; i < 33; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->x[6] |= mask & table[i].x[6]; - r->x[7] |= mask & table[i].x[7]; - r->x[8] |= mask & table[i].x[8]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - r->y[6] |= mask & table[i].y[6]; - r->y[7] |= mask & table[i].y[7]; - r->y[8] |= mask & table[i].y[8]; - r->z[0] |= mask & table[i].z[0]; - r->z[1] |= mask & table[i].z[1]; - r->z[2] |= mask & table[i].z[2]; - r->z[3] |= mask & table[i].z[3]; - r->z[4] |= mask & table[i].z[4]; - r->z[5] |= mask & table[i].z[5]; - r->z[6] |= mask & table[i].z[6]; - r->z[7] |= mask & table[i].z[7]; - r->z[8] |= mask & table[i].z[8]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + x6 |= mask & table[i].x[6]; + x7 |= mask & table[i].x[7]; + x8 |= mask & table[i].x[8]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + y6 |= mask & table[i].y[6]; + y7 |= mask & table[i].y[7]; + y8 |= mask & table[i].y[8]; + z0 |= mask & table[i].z[0]; + z1 |= mask & table[i].z[1]; + z2 |= mask & table[i].z[2]; + z3 |= mask & table[i].z[3]; + z4 |= mask & table[i].z[4]; + z5 |= mask & table[i].z[5]; + z6 |= mask & table[i].z[6]; + z7 |= mask & table[i].z[7]; + z8 |= mask & table[i].z[8]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->x[6] = x6; + r->x[7] = x7; + r->x[8] = x8; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; + r->y[6] = y6; + r->y[7] = y7; + r->y[8] = y8; + r->z[0] = z0; + r->z[1] = z1; + r->z[2] = z2; + r->z[3] = z3; + r->z[4] = z4; + r->z[5] = z5; + r->z[6] = z6; + r->z[7] = z7; + r->z[8] = z8; } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -72965,7 +73801,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * + t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -73070,15 +73906,12 @@ return err; } -#ifndef WC_NO_CACHE_RESISTANT /* A table entry for pre-computed points. */ typedef struct sp_table_entry_521 { sp_digit x[9]; sp_digit y[9]; } sp_table_entry_521; -#if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) -#endif /* FP_ECC | WOLFSSL_SP_SMALL */ /* Add two Montgomery form projective points. The second point has a q value of * one. * Only the first point can be the same pointer as the result point. @@ -73091,12 +73924,12 @@ static void sp_521_proj_point_add_qz1_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*9; + sp_digit* t6 = t + 4*9; + sp_digit* t1 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -73112,13 +73945,9 @@ sp_521_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_9(t2, t2, p->x, p521_mod); @@ -73127,36 +73956,46 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_9(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_9(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_9(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_9(x, t1, t5, p521_mod); - sp_521_mont_dbl_9(t1, t3, p521_mod); - sp_521_mont_sub_9(x, x, t1, p521_mod); + sp_521_mont_sqr_9(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_9(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_9(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_9(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_9(t2, t2, t1, p521_mod); + sp_521_mont_dbl_9(t5, t3, p521_mod); + sp_521_mont_sub_9(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_9(t3, t3, x, p521_mod); + sp_521_mont_sub_9(t3, t3, x, p521_mod); sp_521_mont_mul_9(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_9(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_9(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_9(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } +#ifndef WC_NO_CACHE_RESISTANT +#if defined(FP_ECC) || defined(WOLFSSL_SP_SMALL) +#endif /* FP_ECC | WOLFSSL_SP_SMALL */ #ifdef FP_ECC /* Convert the projective point to affine. * Ordinates are in Montgomery form. @@ -73276,7 +74115,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_64_9(sp_point_521* r, @@ -73284,46 +74123,65 @@ { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit x6 = 0; + sp_digit x7 = 0; + sp_digit x8 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; + sp_digit y6 = 0; + sp_digit y7 = 0; + sp_digit y8 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->x[6] = 0; - r->x[7] = 0; - r->x[8] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; - r->y[6] = 0; - r->y[7] = 0; - r->y[8] = 0; for (i = 1; i < 64; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->x[6] |= mask & table[i].x[6]; - r->x[7] |= mask & table[i].x[7]; - r->x[8] |= mask & table[i].x[8]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - r->y[6] |= mask & table[i].y[6]; - r->y[7] |= mask & table[i].y[7]; - r->y[8] |= mask & table[i].y[8]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + x6 |= mask & table[i].x[6]; + x7 |= mask & table[i].x[7]; + x8 |= mask & table[i].x[8]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + y6 |= mask & table[i].y[6]; + y7 |= mask & table[i].y[7]; + y8 |= mask & table[i].y[8]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->x[6] = x6; + r->x[7] = x7; + r->x[8] = x8; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; + r->y[6] = y6; + r->y[7] = y7; + r->y[8] = y8; } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -73470,13 +74328,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -73547,8 +74407,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_win_add_sub_9(r, g, k, map, ct, heap); @@ -73569,10 +74429,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -73704,7 +74566,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_256_9(sp_point_521* r, @@ -73712,46 +74574,65 @@ { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit x6 = 0; + sp_digit x7 = 0; + sp_digit x8 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; + sp_digit y6 = 0; + sp_digit y7 = 0; + sp_digit y8 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->x[6] = 0; - r->x[7] = 0; - r->x[8] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; - r->y[6] = 0; - r->y[7] = 0; - r->y[8] = 0; for (i = 1; i < 256; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->x[6] |= mask & table[i].x[6]; - r->x[7] |= mask & table[i].x[7]; - r->x[8] |= mask & table[i].x[8]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - r->y[6] |= mask & table[i].y[6]; - r->y[7] |= mask & table[i].y[7]; - r->y[8] |= mask & table[i].y[8]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + x6 |= mask & table[i].x[6]; + x7 |= mask & table[i].x[7]; + x8 |= mask & table[i].x[8]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + y6 |= mask & table[i].y[6]; + y7 |= mask & table[i].y[7]; + y8 |= mask & table[i].y[8]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->x[6] = x6; + r->x[7] = x7; + r->x[8] = x8; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; + r->y[6] = y6; + r->y[7] = y7; + r->y[8] = y8; } #endif /* !WC_NO_CACHE_RESISTANT */ /* Multiply the point by the scalar and return the result. @@ -73898,13 +74779,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -73975,8 +74858,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_win_add_sub_9(r, g, k, map, ct, heap); @@ -73997,10 +74880,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -74093,7 +74978,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -74104,7 +74989,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_521* point = NULL; + sp_point_521* point = NULL; sp_digit* k = NULL; #else sp_point_521 point[2]; @@ -76538,7 +77423,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_65_9(sp_point_521* r, @@ -76546,46 +77431,65 @@ { int i; sp_digit mask; + sp_digit x0 = 0; + sp_digit x1 = 0; + sp_digit x2 = 0; + sp_digit x3 = 0; + sp_digit x4 = 0; + sp_digit x5 = 0; + sp_digit x6 = 0; + sp_digit x7 = 0; + sp_digit x8 = 0; + sp_digit y0 = 0; + sp_digit y1 = 0; + sp_digit y2 = 0; + sp_digit y3 = 0; + sp_digit y4 = 0; + sp_digit y5 = 0; + sp_digit y6 = 0; + sp_digit y7 = 0; + sp_digit y8 = 0; - r->x[0] = 0; - r->x[1] = 0; - r->x[2] = 0; - r->x[3] = 0; - r->x[4] = 0; - r->x[5] = 0; - r->x[6] = 0; - r->x[7] = 0; - r->x[8] = 0; - r->y[0] = 0; - r->y[1] = 0; - r->y[2] = 0; - r->y[3] = 0; - r->y[4] = 0; - r->y[5] = 0; - r->y[6] = 0; - r->y[7] = 0; - r->y[8] = 0; for (i = 1; i < 65; i++) { mask = 0 - (i == idx); - r->x[0] |= mask & table[i].x[0]; - r->x[1] |= mask & table[i].x[1]; - r->x[2] |= mask & table[i].x[2]; - r->x[3] |= mask & table[i].x[3]; - r->x[4] |= mask & table[i].x[4]; - r->x[5] |= mask & table[i].x[5]; - r->x[6] |= mask & table[i].x[6]; - r->x[7] |= mask & table[i].x[7]; - r->x[8] |= mask & table[i].x[8]; - r->y[0] |= mask & table[i].y[0]; - r->y[1] |= mask & table[i].y[1]; - r->y[2] |= mask & table[i].y[2]; - r->y[3] |= mask & table[i].y[3]; - r->y[4] |= mask & table[i].y[4]; - r->y[5] |= mask & table[i].y[5]; - r->y[6] |= mask & table[i].y[6]; - r->y[7] |= mask & table[i].y[7]; - r->y[8] |= mask & table[i].y[8]; - } + x0 |= mask & table[i].x[0]; + x1 |= mask & table[i].x[1]; + x2 |= mask & table[i].x[2]; + x3 |= mask & table[i].x[3]; + x4 |= mask & table[i].x[4]; + x5 |= mask & table[i].x[5]; + x6 |= mask & table[i].x[6]; + x7 |= mask & table[i].x[7]; + x8 |= mask & table[i].x[8]; + y0 |= mask & table[i].y[0]; + y1 |= mask & table[i].y[1]; + y2 |= mask & table[i].y[2]; + y3 |= mask & table[i].y[3]; + y4 |= mask & table[i].y[4]; + y5 |= mask & table[i].y[5]; + y6 |= mask & table[i].y[6]; + y7 |= mask & table[i].y[7]; + y8 |= mask & table[i].y[8]; + } + + r->x[0] = x0; + r->x[1] = x1; + r->x[2] = x2; + r->x[3] = x3; + r->x[4] = x4; + r->x[5] = x5; + r->x[6] = x6; + r->x[7] = x7; + r->x[8] = x8; + r->y[0] = y0; + r->y[1] = y1; + r->y[2] = y2; + r->y[3] = y3; + r->y[4] = y4; + r->y[5] = y5; + r->y[6] = y6; + r->y[7] = y7; + r->y[8] = y8; } #endif /* !WC_NO_CACHE_RESISTANT */ static const sp_table_entry_521 p521_table[4875] = { @@ -110606,7 +111510,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -110628,7 +111532,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -110736,7 +111640,7 @@ "subs x6, %[n], 8\n\t" "mov x7, xzr\n\t" "blt 2f\n\t" - /* Put in mulitples of 8 bytes. */ + /* Put in multiples of 8 bytes. */ "1:\n\t" "ldr x8, [x4], -8\n\t" "subs x6, x6, 8\n\t" @@ -110884,7 +111788,7 @@ sp_point_521* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -110892,7 +111796,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -111862,7 +112766,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_521_cmp_9(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_521_cmp_9(u, v) >= 0))) { sp_521_sub_9(u, u, v); o = sp_521_sub_9(b, b, d); if (o != 0) @@ -111940,7 +112844,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -112271,7 +113175,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -112299,19 +113203,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 9; + /* y^2 - x^3 - a.x = b */ sp_521_sqr_9(t1, point->y); (void)sp_521_mod_9(t1, t1, p521_mod); sp_521_sqr_9(t2, point->x); (void)sp_521_mod_9(t2, t2, p521_mod); sp_521_mul_9(t2, t2, point->x); (void)sp_521_mod_9(t2, t2, p521_mod); - (void)sp_521_sub_9(t2, p521_mod, t2); - sp_521_mont_add_9(t1, t1, t2, p521_mod); + sp_521_mont_sub_9(t1, t1, t2, p521_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_521_mont_add_9(t1, t1, point->x, p521_mod); sp_521_mont_add_9(t1, t1, point->x, p521_mod); sp_521_mont_add_9(t1, t1, point->x, p521_mod); + if (sp_521_cmp_9(t1, p521_b) != 0) { err = MP_VAL; } @@ -112325,7 +113231,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -113256,165 +114162,165 @@ "ldp x25, x26, [%[a], 32]\n\t" "ldp x27, x28, [%[a], 48]\n\t" "# A[0] * A[1]\n\t" - "mul x6, x21, x22\n\t" - "umulh x7, x21, x22\n\t" + "mul x6, x21, x22\n\t" + "umulh x7, x21, x22\n\t" "# A[0] * A[2]\n\t" - "mul x4, x21, x23\n\t" - "umulh x5, x21, x23\n\t" - "adds x7, x7, x4\n\t" + "mul x4, x21, x23\n\t" + "umulh x5, x21, x23\n\t" + "adds x7, x7, x4\n\t" "# A[0] * A[3]\n\t" - "mul x4, x21, x24\n\t" - "adc x8, xzr, x5\n\t" - "umulh x5, x21, x24\n\t" - "adds x8, x8, x4\n\t" + "mul x4, x21, x24\n\t" + "adc x8, xzr, x5\n\t" + "umulh x5, x21, x24\n\t" + "adds x8, x8, x4\n\t" "# A[1] * A[2]\n\t" - "mul x4, x22, x23\n\t" - "adc x9, xzr, x5\n\t" - "umulh x5, x22, x23\n\t" - "adds x8, x8, x4\n\t" + "mul x4, x22, x23\n\t" + "adc x9, xzr, x5\n\t" + "umulh x5, x22, x23\n\t" + "adds x8, x8, x4\n\t" "# A[0] * A[4]\n\t" - "mul x4, x21, x25\n\t" - "adcs x9, x9, x5\n\t" - "umulh x5, x21, x25\n\t" - "adc x10, xzr, xzr\n\t" - "adds x9, x9, x4\n\t" + "mul x4, x21, x25\n\t" + "adcs x9, x9, x5\n\t" + "umulh x5, x21, x25\n\t" + "adc x10, xzr, xzr\n\t" + "adds x9, x9, x4\n\t" "# A[1] * A[3]\n\t" - "mul x4, x22, x24\n\t" - "adc x10, x10, x5\n\t" - "umulh x5, x22, x24\n\t" - "adds x9, x9, x4\n\t" + "mul x4, x22, x24\n\t" + "adc x10, x10, x5\n\t" + "umulh x5, x22, x24\n\t" + "adds x9, x9, x4\n\t" "# A[0] * A[5]\n\t" - "mul x4, x21, x26\n\t" - "adcs x10, x10, x5\n\t" - "umulh x5, x21, x26\n\t" - "adc x11, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" + "mul x4, x21, x26\n\t" + "adcs x10, x10, x5\n\t" + "umulh x5, x21, x26\n\t" + "adc x11, xzr, xzr\n\t" + "adds x10, x10, x4\n\t" "# A[1] * A[4]\n\t" - "mul x4, x22, x25\n\t" - "adc x11, x11, x5\n\t" - "umulh x5, x22, x25\n\t" - "adds x10, x10, x4\n\t" + "mul x4, x22, x25\n\t" + "adc x11, x11, x5\n\t" + "umulh x5, x22, x25\n\t" + "adds x10, x10, x4\n\t" "# A[2] * A[3]\n\t" - "mul x4, x23, x24\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x23, x24\n\t" - "adc x12, xzr, xzr\n\t" - "adds x10, x10, x4\n\t" + "mul x4, x23, x24\n\t" + "adcs x11, x11, x5\n\t" + "umulh x5, x23, x24\n\t" + "adc x12, xzr, xzr\n\t" + "adds x10, x10, x4\n\t" "# A[0] * A[6]\n\t" - "mul x4, x21, x27\n\t" - "adcs x11, x11, x5\n\t" - "umulh x5, x21, x27\n\t" - "adc x12, x12, xzr\n\t" - "adds x11, x11, x4\n\t" + "mul x4, x21, x27\n\t" + "adcs x11, x11, x5\n\t" + "umulh x5, x21, x27\n\t" + "adc x12, x12, xzr\n\t" + "adds x11, x11, x4\n\t" "# A[1] * A[5]\n\t" - "mul x4, x22, x26\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x22, x26\n\t" - "adc x13, xzr, xzr\n\t" - "adds x11, x11, x4\n\t" + "mul x4, x22, x26\n\t" + "adcs x12, x12, x5\n\t" + "umulh x5, x22, x26\n\t" + "adc x13, xzr, xzr\n\t" + "adds x11, x11, x4\n\t" "# A[2] * A[4]\n\t" - "mul x4, x23, x25\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x23, x25\n\t" - "adc x13, x13, xzr\n\t" - "adds x11, x11, x4\n\t" + "mul x4, x23, x25\n\t" + "adcs x12, x12, x5\n\t" + "umulh x5, x23, x25\n\t" + "adc x13, x13, xzr\n\t" + "adds x11, x11, x4\n\t" "# A[0] * A[7]\n\t" - "mul x4, x21, x28\n\t" - "adcs x12, x12, x5\n\t" - "umulh x5, x21, x28\n\t" - "adc x13, x13, xzr\n\t" - "adds x12, x12, x4\n\t" + "mul x4, x21, x28\n\t" + "adcs x12, x12, x5\n\t" + "umulh x5, x21, x28\n\t" + "adc x13, x13, xzr\n\t" + "adds x12, x12, x4\n\t" "# A[1] * A[6]\n\t" - "mul x4, x22, x27\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x22, x27\n\t" - "adc x14, xzr, xzr\n\t" - "adds x12, x12, x4\n\t" + "mul x4, x22, x27\n\t" + "adcs x13, x13, x5\n\t" + "umulh x5, x22, x27\n\t" + "adc x14, xzr, xzr\n\t" + "adds x12, x12, x4\n\t" "# A[2] * A[5]\n\t" - "mul x4, x23, x26\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x23, x26\n\t" - "adc x14, x14, xzr\n\t" - "adds x12, x12, x4\n\t" + "mul x4, x23, x26\n\t" + "adcs x13, x13, x5\n\t" + "umulh x5, x23, x26\n\t" + "adc x14, x14, xzr\n\t" + "adds x12, x12, x4\n\t" "# A[3] * A[4]\n\t" - "mul x4, x24, x25\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x24, x25\n\t" - "adc x14, x14, xzr\n\t" - "adds x12, x12, x4\n\t" + "mul x4, x24, x25\n\t" + "adcs x13, x13, x5\n\t" + "umulh x5, x24, x25\n\t" + "adc x14, x14, xzr\n\t" + "adds x12, x12, x4\n\t" "# A[1] * A[7]\n\t" - "mul x4, x22, x28\n\t" - "adcs x13, x13, x5\n\t" - "umulh x5, x22, x28\n\t" - "adc x14, x14, xzr\n\t" - "adds x13, x13, x4\n\t" + "mul x4, x22, x28\n\t" + "adcs x13, x13, x5\n\t" + "umulh x5, x22, x28\n\t" + "adc x14, x14, xzr\n\t" + "adds x13, x13, x4\n\t" "# A[2] * A[6]\n\t" - "mul x4, x23, x27\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x23, x27\n\t" - "adc x15, xzr, xzr\n\t" - "adds x13, x13, x4\n\t" + "mul x4, x23, x27\n\t" + "adcs x14, x14, x5\n\t" + "umulh x5, x23, x27\n\t" + "adc x15, xzr, xzr\n\t" + "adds x13, x13, x4\n\t" "# A[3] * A[5]\n\t" - "mul x4, x24, x26\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x24, x26\n\t" - "adc x15, x15, xzr\n\t" - "adds x13, x13, x4\n\t" + "mul x4, x24, x26\n\t" + "adcs x14, x14, x5\n\t" + "umulh x5, x24, x26\n\t" + "adc x15, x15, xzr\n\t" + "adds x13, x13, x4\n\t" "# A[2] * A[7]\n\t" - "mul x4, x23, x28\n\t" - "adcs x14, x14, x5\n\t" - "umulh x5, x23, x28\n\t" - "adc x15, x15, xzr\n\t" - "adds x14, x14, x4\n\t" + "mul x4, x23, x28\n\t" + "adcs x14, x14, x5\n\t" + "umulh x5, x23, x28\n\t" + "adc x15, x15, xzr\n\t" + "adds x14, x14, x4\n\t" "# A[3] * A[6]\n\t" - "mul x4, x24, x27\n\t" - "adcs x15, x15, x5\n\t" - "umulh x5, x24, x27\n\t" - "adc x16, xzr, xzr\n\t" - "adds x14, x14, x4\n\t" + "mul x4, x24, x27\n\t" + "adcs x15, x15, x5\n\t" + "umulh x5, x24, x27\n\t" + "adc x16, xzr, xzr\n\t" + "adds x14, x14, x4\n\t" "# A[4] * A[5]\n\t" - "mul x4, x25, x26\n\t" - "adcs x15, x15, x5\n\t" - "umulh x5, x25, x26\n\t" - "adc x16, x16, xzr\n\t" - "adds x14, x14, x4\n\t" + "mul x4, x25, x26\n\t" + "adcs x15, x15, x5\n\t" + "umulh x5, x25, x26\n\t" + "adc x16, x16, xzr\n\t" + "adds x14, x14, x4\n\t" "# A[3] * A[7]\n\t" - "mul x4, x24, x28\n\t" - "adcs x15, x15, x5\n\t" - "umulh x5, x24, x28\n\t" - "adc x16, x16, xzr\n\t" - "adds x15, x15, x4\n\t" + "mul x4, x24, x28\n\t" + "adcs x15, x15, x5\n\t" + "umulh x5, x24, x28\n\t" + "adc x16, x16, xzr\n\t" + "adds x15, x15, x4\n\t" "# A[4] * A[6]\n\t" - "mul x4, x25, x27\n\t" - "adcs x16, x16, x5\n\t" - "umulh x5, x25, x27\n\t" - "adc x17, xzr, xzr\n\t" - "adds x15, x15, x4\n\t" + "mul x4, x25, x27\n\t" + "adcs x16, x16, x5\n\t" + "umulh x5, x25, x27\n\t" + "adc x17, xzr, xzr\n\t" + "adds x15, x15, x4\n\t" "# A[4] * A[7]\n\t" - "mul x4, x25, x28\n\t" - "adcs x16, x16, x5\n\t" - "umulh x5, x25, x28\n\t" - "adc x17, x17, xzr\n\t" - "adds x16, x16, x4\n\t" + "mul x4, x25, x28\n\t" + "adcs x16, x16, x5\n\t" + "umulh x5, x25, x28\n\t" + "adc x17, x17, xzr\n\t" + "adds x16, x16, x4\n\t" "# A[5] * A[6]\n\t" - "mul x4, x26, x27\n\t" - "adcs x17, x17, x5\n\t" - "umulh x5, x26, x27\n\t" - "adc x19, xzr, xzr\n\t" - "adds x16, x16, x4\n\t" + "mul x4, x26, x27\n\t" + "adcs x17, x17, x5\n\t" + "umulh x5, x26, x27\n\t" + "adc x19, xzr, xzr\n\t" + "adds x16, x16, x4\n\t" "# A[5] * A[7]\n\t" - "mul x4, x26, x28\n\t" - "adcs x17, x17, x5\n\t" - "umulh x5, x26, x28\n\t" - "adc x19, x19, xzr\n\t" - "adds x17, x17, x4\n\t" + "mul x4, x26, x28\n\t" + "adcs x17, x17, x5\n\t" + "umulh x5, x26, x28\n\t" + "adc x19, x19, xzr\n\t" + "adds x17, x17, x4\n\t" "# A[6] * A[7]\n\t" - "mul x4, x27, x28\n\t" - "adcs x19, x19, x5\n\t" - "umulh x5, x27, x28\n\t" - "adc x20, xzr, xzr\n\t" - "adds x19, x19, x4\n\t" - "adc x20, x20, x5\n\t" + "mul x4, x27, x28\n\t" + "adcs x19, x19, x5\n\t" + "umulh x5, x27, x28\n\t" + "adc x20, xzr, xzr\n\t" + "adds x19, x19, x4\n\t" + "adc x20, x20, x5\n\t" "# Double\n\t" "adds x6, x6, x6\n\t" "adcs x7, x7, x7\n\t" @@ -113430,44 +114336,44 @@ "adcs x17, x17, x17\n\t" "adcs x19, x19, x19\n\t" "# A[0] * A[0]\n\t" - "mul x5, x21, x21\n\t" + "mul x5, x21, x21\n\t" "adcs x20, x20, x20\n\t" - "umulh x2, x21, x21\n\t" + "umulh x2, x21, x21\n\t" "cset x21, cs\n\t" "# A[1] * A[1]\n\t" - "mul x3, x22, x22\n\t" + "mul x3, x22, x22\n\t" "adds x6, x6, x2\n\t" - "umulh x4, x22, x22\n\t" + "umulh x4, x22, x22\n\t" "adcs x7, x7, x3\n\t" "# A[2] * A[2]\n\t" - "mul x2, x23, x23\n\t" + "mul x2, x23, x23\n\t" "adcs x8, x8, x4\n\t" - "umulh x3, x23, x23\n\t" + "umulh x3, x23, x23\n\t" "adcs x9, x9, x2\n\t" "# A[3] * A[3]\n\t" - "mul x4, x24, x24\n\t" + "mul x4, x24, x24\n\t" "adcs x10, x10, x3\n\t" - "umulh x2, x24, x24\n\t" + "umulh x2, x24, x24\n\t" "adcs x11, x11, x4\n\t" "# A[4] * A[4]\n\t" - "mul x3, x25, x25\n\t" + "mul x3, x25, x25\n\t" "adcs x12, x12, x2\n\t" - "umulh x4, x25, x25\n\t" + "umulh x4, x25, x25\n\t" "adcs x13, x13, x3\n\t" "# A[5] * A[5]\n\t" - "mul x2, x26, x26\n\t" + "mul x2, x26, x26\n\t" "adcs x14, x14, x4\n\t" - "umulh x3, x26, x26\n\t" + "umulh x3, x26, x26\n\t" "adcs x15, x15, x2\n\t" "# A[6] * A[6]\n\t" - "mul x4, x27, x27\n\t" + "mul x4, x27, x27\n\t" "adcs x16, x16, x3\n\t" - "umulh x2, x27, x27\n\t" + "umulh x2, x27, x27\n\t" "adcs x17, x17, x4\n\t" "# A[7] * A[7]\n\t" - "mul x3, x28, x28\n\t" + "mul x3, x28, x28\n\t" "adcs x19, x19, x2\n\t" - "umulh x4, x28, x28\n\t" + "umulh x4, x28, x28\n\t" "adcs x20, x20, x3\n\t" "stp x5, x6, [%[r], 0]\n\t" "adc x21, x21, x4\n\t" @@ -113514,7 +114420,7 @@ "stp x3, x4, [%[r], 32]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 48]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -113662,7 +114568,7 @@ "stp x3, x4, [%[r], 96]\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r], 112]\n\t" - "cset %[r], cs\n\t" + "adc %[r], xzr, xzr\n\t" : [r] "+r" (r) : [a] "r" (a), [b] "r" (b) : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" @@ -114189,7 +115095,7 @@ "stp x3, x4, [%[r]], #16\n\t" "adcs x6, x6, x10\n\t" "stp x5, x6, [%[r]], #16\n\t" - "cset %[c], cs\n\t" + "adc %[c], xzr, xzr\n\t" "cmp %[a], x11\n\t" "b.ne 1b\n\t" : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) @@ -114381,7 +115287,7 @@ /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * - * Assumes divisor has higest bit set. + * Assumes divisor has highest bit set. * * d1 The high order half of the number to divide. * d0 The low order half of the number to divide. @@ -114629,8 +115535,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_1024_div_16(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_1024_div_16(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[32], t2[17]; sp_digit div, r1; @@ -114763,14 +115669,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -115177,7 +116083,7 @@ "umulh x8, x10, x9\n\t" "adds x6, x6, x7\n\t" "adcs x8, x8, x3\n\t" - "cset x3, cs\n\t" + "adc x3, xzr, xzr\n\t" "adds x27, x28, x6\n\t" "ldr x28, [%[a], 128]\n\t" "adcs x28, x28, x8\n\t" @@ -115255,7 +116161,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -115269,7 +116175,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_16(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -115392,8 +116298,8 @@ * b Second number to add in Montgomery form. * m Modulus (prime). */ -static void sp_1024_mont_add_16(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +SP_NOINLINE static void sp_1024_mont_add_16(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -115493,7 +116399,8 @@ * a Number to double in Montgomery form. * m Modulus (prime). */ -static void sp_1024_mont_dbl_16(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_1024_mont_dbl_16(sp_digit* r, const sp_digit* a, + const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -115585,7 +116492,8 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ -static void sp_1024_mont_tpl_16(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_1024_mont_tpl_16(sp_digit* r, const sp_digit* a, + const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -115747,8 +116655,8 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -static void sp_1024_mont_sub_16(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +SP_NOINLINE static void sp_1024_mont_sub_16(sp_digit* r, const sp_digit* a, + const sp_digit* b, const sp_digit* m) { __asm__ __volatile__ ( "ldp x4, x5, [%[a], 0]\n\t" @@ -115838,7 +116746,6 @@ ); } -#define sp_1024_mont_sub_lower_16 sp_1024_mont_sub_16 #ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. @@ -116017,7 +116924,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_1024_div2_16(sp_digit* r, const sp_digit* a, const sp_digit* m) +SP_NOINLINE static void sp_1024_mont_div2_16(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_digit o; @@ -116070,7 +116978,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_16(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_16(t2, t2, p1024_mod); + sp_1024_mont_div2_16(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_16(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -116080,7 +116988,7 @@ /* X = X - Y */ sp_1024_mont_sub_16(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_16(y, y, x, p1024_mod); + sp_1024_mont_sub_16(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_16(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -116103,7 +117011,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_16_ctx* ctx = (sp_1024_proj_point_dbl_16_ctx*)sp_ctx->data; @@ -116177,7 +117086,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_16(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_16(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -116202,7 +117111,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_16(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -116227,8 +117136,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_1024_mont_dbl_lower_16 sp_1024_mont_dbl_16 -#define sp_1024_mont_tpl_lower_16 sp_1024_mont_tpl_16 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -116267,7 +117174,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_16(a, t1, p1024_mod); + sp_1024_mont_tpl_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -116276,8 +117183,8 @@ sp_1024_mont_dbl_16(t2, b, p1024_mod); sp_1024_mont_sub_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_16(b, t2, p1024_mod); + sp_1024_mont_sub_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_16(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -116297,7 +117204,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_16(a, t1, p1024_mod); + sp_1024_mont_tpl_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -116306,8 +117213,8 @@ sp_1024_mont_dbl_16(t2, b, p1024_mod); sp_1024_mont_sub_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_16(b, t2, p1024_mod); + sp_1024_mont_sub_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_16(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -116317,107 +117224,9 @@ sp_1024_mont_sub_16(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_16(y, y, p1024_mod); + sp_1024_mont_div2_16(y, y, p1024_mod); } -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "add x11, %[a], 128\n\t" - "\n1:\n\t" - "subs %[c], xzr, %[c]\n\t" - "ldp x3, x4, [%[a]], #16\n\t" - "ldp x5, x6, [%[a]], #16\n\t" - "ldp x7, x8, [%[b]], #16\n\t" - "sbcs x3, x3, x7\n\t" - "ldp x9, x10, [%[b]], #16\n\t" - "sbcs x4, x4, x8\n\t" - "sbcs x5, x5, x9\n\t" - "stp x3, x4, [%[r]], #16\n\t" - "sbcs x6, x6, x10\n\t" - "stp x5, x6, [%[r]], #16\n\t" - "csetm %[c], cc\n\t" - "cmp %[a], x11\n\t" - "b.ne 1b\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", "cc" - ); - - return c; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "ldp x3, x4, [%[a], 0]\n\t" - "ldp x7, x8, [%[b], 0]\n\t" - "subs x3, x3, x7\n\t" - "ldp x5, x6, [%[a], 16]\n\t" - "sbcs x4, x4, x8\n\t" - "ldp x9, x10, [%[b], 16]\n\t" - "sbcs x5, x5, x9\n\t" - "stp x3, x4, [%[r], 0]\n\t" - "sbcs x6, x6, x10\n\t" - "stp x5, x6, [%[r], 16]\n\t" - "ldp x3, x4, [%[a], 32]\n\t" - "ldp x7, x8, [%[b], 32]\n\t" - "sbcs x3, x3, x7\n\t" - "ldp x5, x6, [%[a], 48]\n\t" - "sbcs x4, x4, x8\n\t" - "ldp x9, x10, [%[b], 48]\n\t" - "sbcs x5, x5, x9\n\t" - "stp x3, x4, [%[r], 32]\n\t" - "sbcs x6, x6, x10\n\t" - "stp x5, x6, [%[r], 48]\n\t" - "ldp x3, x4, [%[a], 64]\n\t" - "ldp x7, x8, [%[b], 64]\n\t" - "sbcs x3, x3, x7\n\t" - "ldp x5, x6, [%[a], 80]\n\t" - "sbcs x4, x4, x8\n\t" - "ldp x9, x10, [%[b], 80]\n\t" - "sbcs x5, x5, x9\n\t" - "stp x3, x4, [%[r], 64]\n\t" - "sbcs x6, x6, x10\n\t" - "stp x5, x6, [%[r], 80]\n\t" - "ldp x3, x4, [%[a], 96]\n\t" - "ldp x7, x8, [%[b], 96]\n\t" - "sbcs x3, x3, x7\n\t" - "ldp x5, x6, [%[a], 112]\n\t" - "sbcs x4, x4, x8\n\t" - "ldp x9, x10, [%[b], 112]\n\t" - "sbcs x5, x5, x9\n\t" - "stp x3, x4, [%[r], 96]\n\t" - "sbcs x6, x6, x10\n\t" - "stp x5, x6, [%[r], 112]\n\t" - "csetm %[r], cc\n\t" - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "memory", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "cc" - ); - - return (sp_digit)r; -} - -#endif /* WOLFSSL_SP_SMALL */ /* Compare two numbers to determine if they are equal. * Constant time implementation. * @@ -116458,12 +117267,12 @@ static void sp_1024_proj_point_add_16(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*16; - sp_digit* t3 = t + 4*16; - sp_digit* t4 = t + 6*16; - sp_digit* t5 = t + 8*16; - sp_digit* t6 = t + 10*16; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*16; + sp_digit* t2 = t + 4*16; + sp_digit* t3 = t + 6*16; + sp_digit* t4 = t + 8*16; + sp_digit* t5 = t + 10*16; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_16(t1, q->z, p1024_mod, p1024_mp_mod); @@ -116485,17 +117294,9 @@ sp_1024_proj_point_dbl_16(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_16(t2, t2, t1, p1024_mod); @@ -116514,20 +117315,31 @@ sp_1024_mont_dbl_16(t3, y, p1024_mod); sp_1024_mont_sub_16(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_16(y, y, x, p1024_mod); + sp_1024_mont_sub_16(y, y, x, p1024_mod); sp_1024_mont_mul_16(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(y, y, t5, p1024_mod); - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -116573,12 +117385,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*16; - ctx->t3 = t + 4*16; - ctx->t4 = t + 6*16; - ctx->t5 = t + 8*16; - ctx->t6 = t + 10*16; + ctx->t6 = t; + ctx->t1 = t + 2*16; + ctx->t2 = t + 4*16; + ctx->t3 = t + 6*16; + ctx->t4 = t + 8*16; + ctx->t5 = t + 10*16; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -116685,7 +117497,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_16(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -116698,22 +117510,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -116772,7 +117590,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_16(a, t1, p1024_mod); + sp_1024_mont_tpl_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -116782,8 +117600,8 @@ sp_1024_mont_dbl_16(t2, b, p1024_mod); sp_1024_mont_sub_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_16(b, t2, p1024_mod); + sp_1024_mont_sub_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_16(r[j].z, z, y, p1024_mod, p1024_mp_mod); z = r[j].z; @@ -116797,7 +117615,7 @@ sp_1024_mont_mul_16(y, b, a, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(y, y, t1, p1024_mod); /* Y = Y/2 */ - sp_1024_div2_16(r[j].y, y, p1024_mod); + sp_1024_mont_div2_16(r[j].y, y, p1024_mod); r[j].infinity = 0; } } @@ -116871,8 +117689,8 @@ sp_1024_mont_sub_16(xs, xs, t1, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_1024_mont_sub_lower_16(ys, ya, xs, p1024_mod); - sp_1024_mont_sub_lower_16(ya, ya, xa, p1024_mod); + sp_1024_mont_sub_16(ys, ya, xs, p1024_mod); + sp_1024_mont_sub_16(ya, ya, xa, p1024_mod); sp_1024_mont_mul_16(ya, ya, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t6, p1024_mod, t6, p1024_mod); sp_1024_mont_mul_16(ys, ys, t6, p1024_mod, p1024_mp_mod); @@ -117000,7 +117818,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * + t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (65+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -117129,12 +117947,12 @@ static void sp_1024_proj_point_add_qz1_16(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*16; - sp_digit* t3 = t + 4*16; - sp_digit* t4 = t + 6*16; - sp_digit* t5 = t + 8*16; - sp_digit* t6 = t + 10*16; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*16; + sp_digit* t6 = t + 4*16; + sp_digit* t1 = t + 6*16; + sp_digit* t4 = t + 8*16; + sp_digit* t5 = t + 10*16; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -117150,13 +117968,9 @@ sp_1024_proj_point_dbl_16(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_16(t2, t2, p->x, p1024_mod); @@ -117165,33 +117979,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_16(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_16(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_16(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_16(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_16(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_16(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_16(t1, t3, p1024_mod); - sp_1024_mont_sub_16(x, x, t1, p1024_mod); + sp_1024_mont_sqr_16(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_16(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_16(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_16(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_16(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_16(t5, t3, p1024_mod); + sp_1024_mont_sub_16(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_16(t3, t3, x, p1024_mod); + sp_1024_mont_sub_16(t3, t3, x, p1024_mod); sp_1024_mont_mul_16(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_16(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_16(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_16(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_16(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -117437,13 +118258,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -117514,8 +118337,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_16(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_16(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_win_add_sub_16(r, g, k, map, ct, heap); @@ -117536,10 +118359,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -121031,7 +121856,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -121053,7 +121878,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, + point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -121269,7 +122094,7 @@ return err; } -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -121295,7 +122120,7 @@ sp_1024_mont_add_16(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -123060,7 +123885,7 @@ } #endif /* WOLFSSL_SP_SMALL */ -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -123175,7 +124000,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_16(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_16(t1, ty, p1024_mod); + sp_1024_mont_div2_16(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_16(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -123195,7 +124020,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_16(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_16(t1, t1, p1024_mod); + sp_1024_mont_div2_16(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_16(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -123613,7 +124438,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_16(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_16(t1, ty, p1024_mod); + sp_1024_mont_div2_16(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_16(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -123651,7 +124476,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_16(p->y, p->y, p1024_mod); + sp_1024_mont_div2_16(p->y, p->y, p1024_mod); } /* Operations to perform based on order - 1. @@ -124443,7 +125268,7 @@ "subs x6, %[n], 8\n\t" "mov x7, xzr\n\t" "blt 2f\n\t" - /* Put in mulitples of 8 bytes. */ + /* Put in multiples of 8 bytes. */ "1:\n\t" "ldr x8, [x4], -8\n\t" "subs x6, x6, 8\n\t" @@ -124537,7 +125362,7 @@ ); } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -124566,19 +125391,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 16; + /* y^2 - x^3 - a.x = b */ sp_1024_sqr_16(t1, point->y); (void)sp_1024_mod_16(t1, t1, p1024_mod); sp_1024_sqr_16(t2, point->x); (void)sp_1024_mod_16(t2, t2, p1024_mod); sp_1024_mul_16(t2, t2, point->x); (void)sp_1024_mod_16(t2, t2, p1024_mod); - (void)sp_1024_sub_16(t2, p1024_mod, t2); - sp_1024_mont_add_16(t1, t1, t2, p1024_mod); + sp_1024_mont_sub_16(t1, t1, t2, p1024_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_1024_mont_add_16(t1, t1, point->x, p1024_mod); sp_1024_mont_add_16(t1, t1, point->x, p1024_mod); sp_1024_mont_add_16(t1, t1, point->x, p1024_mod); + n = sp_1024_cmp_16(t1, p1024_mod); sp_1024_cond_sub_16(t1, t1, p1024_mod, ~(n >> 63)); sp_1024_norm_16(t1); @@ -124595,7 +125422,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_armthumb.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_armthumb.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_armthumb.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_armthumb.c 2024-08-03 07:30:00.000000000 +0000 @@ -52,6 +52,16 @@ #include +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif + #ifdef WOLFSSL_SP_ARM_THUMB_ASM #define SP_PRINT_NUM(var, name, total, words, bits) \ do { \ @@ -118,14 +128,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -469,7 +479,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -9425,7 +9435,7 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); } @@ -9516,7 +9526,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -9604,7 +9614,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -9769,7 +9779,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -9928,7 +9938,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -10143,7 +10153,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -10452,7 +10462,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -10747,7 +10757,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -11094,7 +11104,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -11691,7 +11701,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -12258,7 +12268,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -12750,7 +12760,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -19265,7 +19275,7 @@ "stm %[r]!, {r2, r3, r4, r5}\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -19355,7 +19365,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -19548,7 +19558,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -19877,7 +19887,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -19993,7 +20003,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -20072,7 +20082,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -20327,7 +20337,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -20777,7 +20787,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -20869,7 +20879,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -20942,7 +20952,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -21187,7 +21197,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -21622,14 +21632,14 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -21836,7 +21846,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -21913,11 +21923,12 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } +#define sp_2048_mont_reduce_order_64 sp_2048_mont_reduce_64 /* Reduce the number back to 2048 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -22980,7 +22991,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -22991,7 +23002,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -23005,7 +23016,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -23196,7 +23207,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -23811,7 +23822,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -23920,7 +23931,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -23934,8 +23945,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -24386,11 +24397,12 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } +#define sp_2048_mont_reduce_order_64 sp_2048_mont_reduce_64 /* Reduce the number back to 2048 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -26007,7 +26019,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -26018,7 +26030,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -26032,7 +26044,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -26110,7 +26122,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -26677,7 +26689,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -27294,7 +27306,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -27308,8 +27320,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -27507,7 +27519,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -27521,8 +27533,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -28096,7 +28108,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -30002,7 +30014,7 @@ "str r5, [%[r], #4]\n\t" : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -30304,14 +30316,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -30655,7 +30667,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -50837,7 +50849,7 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); } @@ -50962,7 +50974,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -51082,7 +51094,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -51319,7 +51331,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -51546,7 +51558,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -51829,7 +51841,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -52282,7 +52294,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -52713,7 +52725,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -53188,7 +53200,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -54073,7 +54085,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -54912,7 +54924,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -55404,7 +55416,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -70175,7 +70187,7 @@ "stm %[r]!, {r2, r3, r4, r5}\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -70299,7 +70311,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -70560,7 +70572,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -71025,7 +71037,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -71141,7 +71153,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -71220,7 +71232,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -71485,7 +71497,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -71950,7 +71962,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -72042,7 +72054,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -72115,7 +72127,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -72365,7 +72377,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -72810,14 +72822,14 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -73024,7 +73036,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -73101,11 +73113,12 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } +#define sp_3072_mont_reduce_order_96 sp_3072_mont_reduce_96 /* Reduce the number back to 3072 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -74440,7 +74453,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -74451,7 +74464,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -74465,7 +74478,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -74656,7 +74669,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -75271,7 +75284,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -75380,7 +75393,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -75394,8 +75407,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[96], t2[49]; sp_digit div, r1; @@ -75846,11 +75859,12 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } +#define sp_3072_mont_reduce_order_96 sp_3072_mont_reduce_96 /* Reduce the number back to 3072 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -78021,7 +78035,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -78032,7 +78046,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -78046,7 +78060,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -78124,7 +78138,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -78963,7 +78977,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -79580,7 +79594,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -79594,8 +79608,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[192], t2[97]; sp_digit div, r1; @@ -79798,7 +79812,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -79812,8 +79826,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[192], t2[97]; sp_digit div, r1; @@ -80387,7 +80401,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -83091,7 +83105,7 @@ "str r3, [%[r], #4]\n\t" : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -83393,14 +83407,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -84036,7 +84050,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -85209,7 +85223,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -86320,7 +86334,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -86473,7 +86487,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -86552,7 +86566,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -86817,7 +86831,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -87282,12 +87296,12 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -87494,7 +87508,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -87577,11 +87591,12 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } +#define sp_4096_mont_reduce_order_128 sp_4096_mont_reduce_128 /* Reduce the number back to 4096 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -90296,7 +90311,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -90307,7 +90322,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -90321,7 +90336,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -90399,7 +90414,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -91510,7 +91525,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -92127,7 +92142,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -92141,8 +92156,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[256], t2[129]; sp_digit div, r1; @@ -92346,7 +92361,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -92360,8 +92375,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[256], t2[129]; sp_digit div, r1; @@ -92940,7 +92955,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -96432,7 +96447,7 @@ "str r4, [%[r], #4]\n\t" : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -96956,7 +96971,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -97381,7 +97396,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -97454,7 +97469,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -97546,167 +97561,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "movs r6, %[a]\n\t" - "movs r3, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds r6, r6, #32\n\t" -#else - "add r6, r6, #32\n\t" -#endif - "\n" - "L_sp_256_sub_8_word_%=:\n\t" - "movs r5, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r5, r5, r3\n\t" -#else - "sub r5, r5, r3\n\t" -#endif - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r5\n\t" -#elif defined(__clang__) - "sbcs r4, r5\n\t" -#else - "sbc r4, r5\n\t" -#endif - "str r4, [%[r]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r3\n\t" -#elif defined(__clang__) - "sbcs r3, r3\n\t" -#else - "sbc r3, r3\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[a], %[a], #4\n\t" -#else - "add %[a], %[a], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[b], %[b], #4\n\t" -#else - "add %[b], %[b], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[r], %[r], #4\n\t" -#else - "add %[r], %[r], #4\n\t" -#endif - "cmp %[a], r6\n\t" - "bne L_sp_256_sub_8_word_%=\n\t" - "movs %[r], r3\n\t" - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r3, r3, r5\n\t" -#else - "sub r3, r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs %[r], %[r], %[r]\n\t" -#elif defined(__clang__) - "sbcs %[r], %[r]\n\t" -#else - "sbc %[r], %[r]\n\t" -#endif - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -97805,14 +97660,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -97990,69 +97845,6 @@ return err; } -/* Conditionally subtract b from a using the mask m. - * m is -1 to subtract and 0 when not copying. - * - * r A single precision number representing condition subtract result. - * a A single precision number to subtract from. - * b A single precision number to subtract. - * m Mask value to apply. - */ -SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) -{ - __asm__ __volatile__ ( - "movs r4, #0\n\t" - "movs r5, #32\n\t" - "mov r8, r5\n\t" - "movs r7, #0\n\t" - "\n" - "L_sp_256_cond_sub_8_words_%=:\n\t" - "ldr r6, [%[b], r7]\n\t" -#ifdef WOLFSSL_KEIL - "ands r6, r6, %[m]\n\t" -#elif defined(__clang__) - "ands r6, %[m]\n\t" -#else - "and r6, %[m]\n\t" -#endif - "movs r5, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r5, r5, r4\n\t" -#else - "sub r5, r5, r4\n\t" -#endif - "ldr r5, [%[a], r7]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r5, r5, r6\n\t" -#elif defined(__clang__) - "sbcs r5, r6\n\t" -#else - "sbc r5, r6\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r4\n\t" -#elif defined(__clang__) - "sbcs r4, r4\n\t" -#else - "sbc r4, r4\n\t" -#endif - "str r5, [%[r], r7]\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds r7, r7, #4\n\t" -#else - "add r7, r7, #4\n\t" -#endif - "cmp r7, r8\n\t" - "blt L_sp_256_cond_sub_8_words_%=\n\t" - "movs %[r], r4\n\t" - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) - : - : "memory", "r4", "r5", "r6", "r7", "r8" - ); - return (uint32_t)(size_t)r; -} - /* Reduce the number back to 256 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -98369,7 +98161,7 @@ "str r7, [%[a], #28]\n\t" : [a] "+l" (a) : - : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8" + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -99027,7 +98819,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -99038,7 +98830,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -99052,7 +98844,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -99068,10 +98860,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_8(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_8(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_8(r, a, m, mp); for (; n > 1; n--) { @@ -99261,7 +99053,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -99272,6 +99064,69 @@ */ #define sp_256_norm_8(a) +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a, + const sp_digit* b, sp_digit m) +{ + __asm__ __volatile__ ( + "movs r4, #0\n\t" + "movs r5, #32\n\t" + "mov r8, r5\n\t" + "movs r7, #0\n\t" + "\n" + "L_sp_256_cond_sub_8_words_%=:\n\t" + "ldr r6, [%[b], r7]\n\t" +#ifdef WOLFSSL_KEIL + "ands r6, r6, %[m]\n\t" +#elif defined(__clang__) + "ands r6, %[m]\n\t" +#else + "and r6, %[m]\n\t" +#endif + "movs r5, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r5, r5, r4\n\t" +#else + "sub r5, r5, r4\n\t" +#endif + "ldr r5, [%[a], r7]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r5, r5, r6\n\t" +#elif defined(__clang__) + "sbcs r5, r6\n\t" +#else + "sbc r5, r6\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r4\n\t" +#elif defined(__clang__) + "sbcs r4, r4\n\t" +#else + "sbc r4, r4\n\t" +#endif + "str r5, [%[r], r7]\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds r7, r7, #4\n\t" +#else + "add r7, r7, #4\n\t" +#endif + "cmp r7, r8\n\t" + "blt L_sp_256_cond_sub_8_words_%=\n\t" + "movs %[r], r4\n\t" + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" + ); + return (uint32_t)(size_t)r; +} + /* Map the Montgomery form projective coordinate point to an affine point. * * r Resulting affine coordinate point. @@ -99494,7 +99349,7 @@ "str r5, [%[r], #28]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); } @@ -99671,7 +99526,7 @@ "str r5, [%[r], #28]\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); } @@ -100004,7 +99859,7 @@ "str r2, [%[r], #28]\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -100183,18 +100038,17 @@ "str r5, [%[r], #28]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); } -#define sp_256_mont_sub_lower_8 sp_256_mont_sub_8 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) * * r Result of division by 2. * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_256_div2_8(sp_digit* r, const sp_digit* a, +SP_NOINLINE static void sp_256_mont_div2_8(sp_digit* r, const sp_digit* a, const sp_digit* m) { (void)m; @@ -100457,7 +100311,7 @@ "str r5, [%[r], #4]\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "cc" ); } @@ -100505,7 +100359,7 @@ /* T2 = Y * Y */ sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_8(t2, t2, p256_mod); + sp_256_mont_div2_8(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ @@ -100515,7 +100369,7 @@ /* X = X - Y */ sp_256_mont_sub_8(x, x, y, p256_mod); /* Y = Y - X */ - sp_256_mont_sub_lower_8(y, y, x, p256_mod); + sp_256_mont_sub_8(y, y, x, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -100538,7 +100392,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data; @@ -100612,7 +100467,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_8(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_8(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -100637,7 +100492,7 @@ break; case 16: /* Y = Y - X */ - sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -100698,12 +100553,12 @@ static void sp_256_proj_point_add_8(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*8; - sp_digit* t3 = t + 4*8; - sp_digit* t4 = t + 6*8; - sp_digit* t5 = t + 8*8; - sp_digit* t6 = t + 10*8; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*8; + sp_digit* t2 = t + 4*8; + sp_digit* t3 = t + 6*8; + sp_digit* t4 = t + 8*8; + sp_digit* t5 = t + 10*8; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod); @@ -100725,17 +100580,9 @@ sp_256_proj_point_dbl_8(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_8(t2, t2, t1, p256_mod); @@ -100754,20 +100601,31 @@ sp_256_mont_dbl_8(t3, y, p256_mod); sp_256_mont_sub_8(x, x, t3, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_8(y, y, x, p256_mod); + sp_256_mont_sub_8(y, y, x, p256_mod); sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_8(y, y, t5, p256_mod); - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -100813,12 +100671,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*8; - ctx->t3 = t + 4*8; - ctx->t4 = t + 6*8; - ctx->t5 = t + 8*8; - ctx->t6 = t + 10*8; + ctx->t6 = t; + ctx->t1 = t + 2*8; + ctx->t2 = t + 4*8; + ctx->t3 = t + 6*8; + ctx->t4 = t + 8*8; + ctx->t5 = t + 10*8; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -100925,7 +100783,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -100938,22 +100796,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -100973,7 +100837,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table, @@ -101225,8 +101089,6 @@ } #ifdef FP_ECC -#define sp_256_mont_dbl_lower_8 sp_256_mont_dbl_8 -#define sp_256_mont_tpl_lower_8 sp_256_mont_tpl_8 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -101265,7 +101127,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_8(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_8(a, t1, p256_mod); + sp_256_mont_tpl_8(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod); @@ -101274,8 +101136,8 @@ sp_256_mont_dbl_8(t2, b, p256_mod); sp_256_mont_sub_8(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_8(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_8(b, t2, p256_mod); + sp_256_mont_sub_8(t2, b, x, p256_mod); + sp_256_mont_dbl_8(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -101295,7 +101157,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_8(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_8(a, t1, p256_mod); + sp_256_mont_tpl_8(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod); @@ -101304,8 +101166,8 @@ sp_256_mont_dbl_8(t2, b, p256_mod); sp_256_mont_sub_8(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_8(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_8(b, t2, p256_mod); + sp_256_mont_sub_8(t2, b, x, p256_mod); + sp_256_mont_dbl_8(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -101315,7 +101177,7 @@ sp_256_mont_sub_8(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_8(y, y, p256_mod); + sp_256_mont_div2_8(y, y, p256_mod); } /* Convert the projective point to affine. @@ -101361,12 +101223,12 @@ static void sp_256_proj_point_add_qz1_8(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*8; - sp_digit* t3 = t + 4*8; - sp_digit* t4 = t + 6*8; - sp_digit* t5 = t + 8*8; - sp_digit* t6 = t + 10*8; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*8; + sp_digit* t6 = t + 4*8; + sp_digit* t1 = t + 6*8; + sp_digit* t4 = t + 8*8; + sp_digit* t5 = t + 10*8; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -101382,13 +101244,9 @@ sp_256_proj_point_dbl_8(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_8(t2, t2, p->x, p256_mod); @@ -101397,33 +101255,40 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_8(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_8(x, t1, t5, p256_mod); - sp_256_mont_dbl_8(t1, t3, p256_mod); - sp_256_mont_sub_8(x, x, t1, p256_mod); + sp_256_mont_sqr_8(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_8(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_8(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_8(t2, t2, t1, p256_mod); + sp_256_mont_dbl_8(t5, t3, p256_mod); + sp_256_mont_sub_8(x, t2, t5, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_8(t3, t3, x, p256_mod); + sp_256_mont_sub_8(t3, t3, x, p256_mod); sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_8(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_256_mont_mul_8(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_8(y, t3, t1, p256_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -101524,7 +101389,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_16_8(sp_point_256* r, @@ -101713,13 +101578,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -101790,8 +101657,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap); @@ -101812,10 +101679,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -101944,7 +101813,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_256_8(sp_point_256* r, @@ -102133,13 +102002,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -102210,8 +102081,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap); @@ -102232,10 +102103,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -102328,7 +102201,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -102339,7 +102212,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_256* point = NULL; + sp_point_256* point = NULL; sp_digit* k = NULL; #else sp_point_256 point[2]; @@ -103877,7 +103750,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -103899,7 +103772,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -104035,7 +103908,7 @@ "str r1, [%[a], #28]\n\t" : [a] "+l" (a) : - : "memory", "r1", "r2" + : "memory", "r1", "r2", "cc" ); } @@ -104130,7 +104003,7 @@ sp_point_256* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -104138,7 +104011,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -104475,7 +104348,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -104569,7 +104442,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -104757,7 +104630,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -105372,7 +105245,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -105412,8 +105285,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[16], t2[9]; sp_digit div, r1; @@ -105598,7 +105471,7 @@ sp_256_mont_sqr_n_order_8(t2, t3, 4); /* t = a^ff = t2 * t3 */ sp_256_mont_mul_order_8(t, t2, t3); - /* t3= a^ff00 = t ^ 2 ^ 8 */ + /* t2= a^ff00 = t ^ 2 ^ 8 */ sp_256_mont_sqr_n_order_8(t2, t, 8); /* t = a^ffff = t2 * t */ sp_256_mont_mul_order_8(t, t2, t); @@ -105615,7 +105488,11 @@ /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */ sp_256_mont_mul_order_8(t2, t2, t); /* t2= a^ffffffff00000000ffffffffffffffffbce6 */ - for (i=127; i>=112; i--) { + sp_256_mont_sqr_order_8(t2, t2); + sp_256_mont_mul_order_8(t2, t2, a); + sp_256_mont_sqr_n_order_8(t2, t2, 5); + sp_256_mont_mul_order_8(t2, t2, t3); + for (i=121; i>=112; i--) { sp_256_mont_sqr_order_8(t2, t2); if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) { sp_256_mont_mul_order_8(t2, t2, a); @@ -106020,6 +105897,166 @@ #endif /* HAVE_ECC_SIGN */ #ifndef WOLFSSL_SP_SMALL +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, + const sp_digit* b) +{ + __asm__ __volatile__ ( + "movs r6, %[a]\n\t" + "movs r3, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds r6, r6, #32\n\t" +#else + "add r6, r6, #32\n\t" +#endif + "\n" + "L_sp_256_sub_8_word_%=:\n\t" + "movs r5, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r5, r5, r3\n\t" +#else + "sub r5, r5, r3\n\t" +#endif + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[b]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r5\n\t" +#elif defined(__clang__) + "sbcs r4, r5\n\t" +#else + "sbc r4, r5\n\t" +#endif + "str r4, [%[r]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r3\n\t" +#elif defined(__clang__) + "sbcs r3, r3\n\t" +#else + "sbc r3, r3\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[a], %[a], #4\n\t" +#else + "add %[a], %[a], #4\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[b], %[b], #4\n\t" +#else + "add %[b], %[b], #4\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[r], %[r], #4\n\t" +#else + "add %[r], %[r], #4\n\t" +#endif + "cmp %[a], r6\n\t" + "bne L_sp_256_sub_8_word_%=\n\t" + "movs %[r], r3\n\t" + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) + : + : "memory", "r3", "r4", "r5", "r6", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, + const sp_digit* b) +{ + __asm__ __volatile__ ( + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r3, r3, r5\n\t" +#else + "sub r3, r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs %[r], %[r], %[r]\n\t" +#elif defined(__clang__) + "sbcs %[r], %[r]\n\t" +#else + "sbc %[r], %[r]\n\t" +#endif + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) + : + : "memory", "r3", "r4", "r5", "r6", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ /* Right shift a by 1 bit into r. (r = a >> 1) * * r A single precision integer. @@ -106170,7 +106207,7 @@ "str r3, [%[r], #28]\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); } @@ -106441,7 +106478,7 @@ "str r6, [%[r], #4]\n\t" : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -107196,7 +107233,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [table] "+l" (table) : - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -107244,7 +107281,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_256_cmp_8(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_256_cmp_8(u, v) >= 0))) { sp_256_sub_8(u, u, v); o = sp_256_sub_8(b, b, d); if (o != 0) @@ -107321,7 +107358,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -107645,7 +107682,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -107673,19 +107710,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 8; + /* y^2 - x^3 - a.x = b */ sp_256_sqr_8(t1, point->y); (void)sp_256_mod_8(t1, t1, p256_mod); sp_256_sqr_8(t2, point->x); (void)sp_256_mod_8(t2, t2, p256_mod); sp_256_mul_8(t2, t2, point->x); (void)sp_256_mod_8(t2, t2, p256_mod); - (void)sp_256_sub_8(t2, p256_mod, t2); - sp_256_mont_add_8(t1, t1, t2, p256_mod); + sp_256_mont_sub_8(t1, t1, t2, p256_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_256_mont_add_8(t1, t1, point->x, p256_mod); sp_256_mont_add_8(t1, t1, point->x, p256_mod); sp_256_mont_add_8(t1, t1, point->x, p256_mod); + if (sp_256_cmp_8(t1, p256_b) != 0) { err = MP_VAL; } @@ -107699,7 +107738,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -108522,7 +108561,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -108947,7 +108986,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -109020,7 +109059,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -109146,201 +109185,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "movs r6, %[a]\n\t" - "movs r3, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds r6, r6, #48\n\t" -#else - "add r6, r6, #48\n\t" -#endif - "\n" - "L_sp_384_sub_12_word_%=:\n\t" - "movs r5, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r5, r5, r3\n\t" -#else - "sub r5, r5, r3\n\t" -#endif - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r5\n\t" -#elif defined(__clang__) - "sbcs r4, r5\n\t" -#else - "sbc r4, r5\n\t" -#endif - "str r4, [%[r]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r3\n\t" -#elif defined(__clang__) - "sbcs r3, r3\n\t" -#else - "sbc r3, r3\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[a], %[a], #4\n\t" -#else - "add %[a], %[a], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[b], %[b], #4\n\t" -#else - "add %[b], %[b], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[r], %[r], #4\n\t" -#else - "add %[r], %[r], #4\n\t" -#endif - "cmp %[a], r6\n\t" - "bne L_sp_384_sub_12_word_%=\n\t" - "movs %[r], r3\n\t" - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r3, r3, r5\n\t" -#else - "sub r3, r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs %[r], %[r], %[r]\n\t" -#elif defined(__clang__) - "sbcs %[r], %[r]\n\t" -#else - "sbc %[r], %[r]\n\t" -#endif - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -109458,14 +109303,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -109701,7 +109546,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -110430,7 +110275,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -110441,7 +110286,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -110455,7 +110300,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -110471,10 +110316,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_12(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_12(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_12(r, a, m, mp); for (; n > 1; n--) { @@ -110680,7 +110525,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -110779,6 +110624,200 @@ sp_384_cond_sub_12(r, r, m, 0 - o); } +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, + const sp_digit* b) +{ + __asm__ __volatile__ ( + "movs r6, %[a]\n\t" + "movs r3, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds r6, r6, #48\n\t" +#else + "add r6, r6, #48\n\t" +#endif + "\n" + "L_sp_384_sub_12_word_%=:\n\t" + "movs r5, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r5, r5, r3\n\t" +#else + "sub r5, r5, r3\n\t" +#endif + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[b]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r5\n\t" +#elif defined(__clang__) + "sbcs r4, r5\n\t" +#else + "sbc r4, r5\n\t" +#endif + "str r4, [%[r]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r3\n\t" +#elif defined(__clang__) + "sbcs r3, r3\n\t" +#else + "sbc r3, r3\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[a], %[a], #4\n\t" +#else + "add %[a], %[a], #4\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[b], %[b], #4\n\t" +#else + "add %[b], %[b], #4\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[r], %[r], #4\n\t" +#else + "add %[r], %[r], #4\n\t" +#endif + "cmp %[a], r6\n\t" + "bne L_sp_384_sub_12_word_%=\n\t" + "movs %[r], r3\n\t" + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) + : + : "memory", "r3", "r4", "r5", "r6", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, + const sp_digit* b) +{ + __asm__ __volatile__ ( + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r3, r3, r5\n\t" +#else + "sub r3, r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs %[r], %[r], %[r]\n\t" +#elif defined(__clang__) + "sbcs %[r], %[r]\n\t" +#else + "sbc %[r], %[r]\n\t" +#endif + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) + : + : "memory", "r3", "r4", "r5", "r6", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -110843,7 +110882,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -110864,7 +110903,6 @@ sp_384_cond_add_12(r, r, m, o); } -#define sp_384_mont_sub_lower_12 sp_384_mont_sub_12 /* Right shift a by 1 bit into r. (r = a >> 1) * * r A single precision integer. @@ -111091,7 +111129,7 @@ "str r4, [%[r], #44]\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); } @@ -111101,7 +111139,7 @@ * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_384_div2_12(sp_digit* r, const sp_digit* a, +SP_NOINLINE static void sp_384_mont_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o; @@ -111155,7 +111193,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_12(t2, t2, p384_mod); + sp_384_mont_div2_12(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -111165,7 +111203,7 @@ /* X = X - Y */ sp_384_mont_sub_12(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_12(y, y, x, p384_mod); + sp_384_mont_sub_12(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -111188,7 +111226,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data; @@ -111262,7 +111301,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_12(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_12(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -111287,7 +111326,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -111350,12 +111389,12 @@ static void sp_384_proj_point_add_12(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*12; - sp_digit* t3 = t + 4*12; - sp_digit* t4 = t + 6*12; - sp_digit* t5 = t + 8*12; - sp_digit* t6 = t + 10*12; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*12; + sp_digit* t2 = t + 4*12; + sp_digit* t3 = t + 6*12; + sp_digit* t4 = t + 8*12; + sp_digit* t5 = t + 10*12; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod); @@ -111377,17 +111416,9 @@ sp_384_proj_point_dbl_12(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_12(t2, t2, t1, p384_mod); @@ -111406,20 +111437,31 @@ sp_384_mont_dbl_12(t3, y, p384_mod); sp_384_mont_sub_12(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_12(y, y, x, p384_mod); + sp_384_mont_sub_12(y, y, x, p384_mod); sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_12(y, y, t5, p384_mod); - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -111465,12 +111507,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*12; - ctx->t3 = t + 4*12; - ctx->t4 = t + 6*12; - ctx->t5 = t + 8*12; - ctx->t6 = t + 10*12; + ctx->t6 = t; + ctx->t1 = t + 2*12; + ctx->t2 = t + 4*12; + ctx->t3 = t + 6*12; + ctx->t4 = t + 8*12; + ctx->t5 = t + 10*12; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -111577,7 +111619,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -111590,22 +111632,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -111625,7 +111673,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table, @@ -111901,8 +111949,6 @@ } #ifdef FP_ECC -#define sp_384_mont_dbl_lower_12 sp_384_mont_dbl_12 -#define sp_384_mont_tpl_lower_12 sp_384_mont_tpl_12 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -111941,7 +111987,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_12(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_12(a, t1, p384_mod); + sp_384_mont_tpl_12(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod); @@ -111950,8 +111996,8 @@ sp_384_mont_dbl_12(t2, b, p384_mod); sp_384_mont_sub_12(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_12(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_12(b, t2, p384_mod); + sp_384_mont_sub_12(t2, b, x, p384_mod); + sp_384_mont_dbl_12(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -111971,7 +112017,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_12(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_12(a, t1, p384_mod); + sp_384_mont_tpl_12(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod); @@ -111980,8 +112026,8 @@ sp_384_mont_dbl_12(t2, b, p384_mod); sp_384_mont_sub_12(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_12(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_12(b, t2, p384_mod); + sp_384_mont_sub_12(t2, b, x, p384_mod); + sp_384_mont_dbl_12(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -111991,7 +112037,7 @@ sp_384_mont_sub_12(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_12(y, y, p384_mod); + sp_384_mont_div2_12(y, y, p384_mod); } /* Convert the projective point to affine. @@ -112037,12 +112083,12 @@ static void sp_384_proj_point_add_qz1_12(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*12; - sp_digit* t3 = t + 4*12; - sp_digit* t4 = t + 6*12; - sp_digit* t5 = t + 8*12; - sp_digit* t6 = t + 10*12; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*12; + sp_digit* t6 = t + 4*12; + sp_digit* t1 = t + 6*12; + sp_digit* t4 = t + 8*12; + sp_digit* t5 = t + 10*12; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -112058,13 +112104,9 @@ sp_384_proj_point_dbl_12(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_12(t2, t2, p->x, p384_mod); @@ -112073,33 +112115,40 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_12(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_12(x, t1, t5, p384_mod); - sp_384_mont_dbl_12(t1, t3, p384_mod); - sp_384_mont_sub_12(x, x, t1, p384_mod); + sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_12(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_12(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_12(t2, t2, t1, p384_mod); + sp_384_mont_dbl_12(t5, t3, p384_mod); + sp_384_mont_sub_12(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_12(t3, t3, x, p384_mod); + sp_384_mont_sub_12(t3, t3, x, p384_mod); sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_12(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_12(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_12(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -112200,7 +112249,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_16_12(sp_point_384* r, @@ -112405,13 +112454,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -112482,8 +112533,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap); @@ -112504,10 +112555,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -112636,7 +112689,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_256_12(sp_point_384* r, @@ -112841,13 +112894,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -112918,8 +112973,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap); @@ -112940,10 +112995,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -113036,7 +113093,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -113047,7 +113104,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_384* point = NULL; + sp_point_384* point = NULL; sp_digit* k = NULL; #else sp_point_384 point[2]; @@ -114585,7 +114642,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -114607,7 +114664,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -114779,7 +114836,7 @@ "str r1, [%[a], #44]\n\t" : [a] "+l" (a) : - : "memory", "r1", "r2" + : "memory", "r1", "r2", "cc" ); } @@ -114874,7 +114931,7 @@ sp_point_384* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -114882,7 +114939,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -115219,7 +115276,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -115349,7 +115406,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -115537,7 +115594,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -116152,7 +116209,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -116196,8 +116253,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[24], t2[13]; sp_digit div, r1; @@ -117177,7 +117234,7 @@ "str r7, [%[r], #44]\n\t" : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -118376,7 +118433,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [table] "+l" (table) : - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -118424,7 +118481,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_384_cmp_12(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_384_cmp_12(u, v) >= 0))) { sp_384_sub_12(u, u, v); o = sp_384_sub_12(b, b, d); if (o != 0) @@ -118505,7 +118562,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -118829,7 +118886,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -118857,19 +118914,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 12; + /* y^2 - x^3 - a.x = b */ sp_384_sqr_12(t1, point->y); (void)sp_384_mod_12(t1, t1, p384_mod); sp_384_sqr_12(t2, point->x); (void)sp_384_mod_12(t2, t2, p384_mod); sp_384_mul_12(t2, t2, point->x); (void)sp_384_mod_12(t2, t2, p384_mod); - (void)sp_384_sub_12(t2, p384_mod, t2); - sp_384_mont_add_12(t1, t1, t2, p384_mod); + sp_384_mont_sub_12(t1, t1, t2, p384_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_384_mont_add_12(t1, t1, point->x, p384_mod); sp_384_mont_add_12(t1, t1, point->x, p384_mod); sp_384_mont_add_12(t1, t1, point->x, p384_mod); + if (sp_384_cmp_12(t1, p384_b) != 0) { err = MP_VAL; } @@ -118883,7 +118942,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -119748,7 +119807,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -120173,7 +120232,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -120246,7 +120305,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -120416,245 +120475,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "movs r6, %[a]\n\t" - "movs r3, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds r6, r6, #0x44\n\t" -#else - "add r6, r6, #0x44\n\t" -#endif - "\n" - "L_sp_521_sub_17_word_%=:\n\t" - "movs r5, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r5, r5, r3\n\t" -#else - "sub r5, r5, r3\n\t" -#endif - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r5\n\t" -#elif defined(__clang__) - "sbcs r4, r5\n\t" -#else - "sbc r4, r5\n\t" -#endif - "str r4, [%[r]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r3\n\t" -#elif defined(__clang__) - "sbcs r3, r3\n\t" -#else - "sbc r3, r3\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[a], %[a], #4\n\t" -#else - "add %[a], %[a], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[b], %[b], #4\n\t" -#else - "add %[b], %[b], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[r], %[r], #4\n\t" -#else - "add %[r], %[r], #4\n\t" -#endif - "cmp %[a], r6\n\t" - "bne L_sp_521_sub_17_word_%=\n\t" - "movs %[r], r3\n\t" - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r3, r3, r5\n\t" -#else - "sub r3, r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r3, [%[a]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif - "str r3, [%[r]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs %[r], %[r], %[r]\n\t" -#elif defined(__clang__) - "sbcs %[r], %[r]\n\t" -#else - "sbc %[r], %[r]\n\t" -#endif - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -120688,14 +120509,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -120931,7 +120752,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -121579,7 +121400,7 @@ "add sp, sp, #0x44\n\t" : [a] "+l" (a) : - : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8" + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } @@ -122746,7 +122567,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -122757,7 +122578,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -122771,7 +122592,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -122787,10 +122608,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_17(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_17(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_17(r, a, m, mp); for (; n > 1; n--) { @@ -122993,7 +122814,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -123374,7 +123195,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7" + : "memory", "r4", "r5", "r6", "r7", "cc" ); } @@ -123690,7 +123511,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -124168,77 +123989,8 @@ #endif : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m) : - : "memory", "r3", "r4", "r5", "r6", "r7" - ); -} - -/* Conditionally add a and b using the mask m. - * m is -1 to add and 0 when not. - * - * r A single precision number representing conditional add result. - * a A single precision number to add with. - * b A single precision number to add. - * m Mask value to apply. - */ -SP_NOINLINE static sp_digit sp_521_cond_add_17(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) -{ - __asm__ __volatile__ ( - "movs r4, #0\n\t" - "movs r5, #0x44\n\t" - "mov r8, r5\n\t" - "movs r7, #0\n\t" - "\n" - "L_sp_521_cond_add_17_words_%=:\n\t" - "ldr r6, [%[b], r7]\n\t" -#ifdef WOLFSSL_KEIL - "ands r6, r6, %[m]\n\t" -#elif defined(__clang__) - "ands r6, %[m]\n\t" -#else - "and r6, %[m]\n\t" -#endif - "movs r5, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r5, r5, #1\n\t" -#else - "sub r5, r5, #1\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds r5, r5, r4\n\t" -#else - "add r5, r5, r4\n\t" -#endif - "ldr r5, [%[a], r7]\n\t" -#ifdef WOLFSSL_KEIL - "adcs r5, r5, r6\n\t" -#elif defined(__clang__) - "adcs r5, r6\n\t" -#else - "adc r5, r6\n\t" -#endif - "movs r4, #0\n\t" -#ifdef WOLFSSL_KEIL - "adcs r4, r4, r4\n\t" -#elif defined(__clang__) - "adcs r4, r4\n\t" -#else - "adc r4, r4\n\t" -#endif - "str r5, [%[r], r7]\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds r7, r7, #4\n\t" -#else - "add r7, r7, #4\n\t" -#endif - "cmp r7, r8\n\t" - "blt L_sp_521_cond_add_17_words_%=\n\t" - "movs %[r], r4\n\t" - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) - : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); - return (uint32_t)(size_t)r; } /* Subtract two Montgomery form numbers (r = a - b % m). @@ -124577,11 +124329,79 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7" + : "memory", "r4", "r5", "r6", "r7", "cc" ); } -#define sp_521_mont_sub_lower_17 sp_521_mont_sub_17 +/* Conditionally add a and b using the mask m. + * m is -1 to add and 0 when not. + * + * r A single precision number representing conditional add result. + * a A single precision number to add with. + * b A single precision number to add. + * m Mask value to apply. + */ +SP_NOINLINE static sp_digit sp_521_cond_add_17(sp_digit* r, const sp_digit* a, + const sp_digit* b, sp_digit m) +{ + __asm__ __volatile__ ( + "movs r4, #0\n\t" + "movs r5, #0x44\n\t" + "mov r8, r5\n\t" + "movs r7, #0\n\t" + "\n" + "L_sp_521_cond_add_17_words_%=:\n\t" + "ldr r6, [%[b], r7]\n\t" +#ifdef WOLFSSL_KEIL + "ands r6, r6, %[m]\n\t" +#elif defined(__clang__) + "ands r6, %[m]\n\t" +#else + "and r6, %[m]\n\t" +#endif + "movs r5, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r5, r5, #1\n\t" +#else + "sub r5, r5, #1\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds r5, r5, r4\n\t" +#else + "add r5, r5, r4\n\t" +#endif + "ldr r5, [%[a], r7]\n\t" +#ifdef WOLFSSL_KEIL + "adcs r5, r5, r6\n\t" +#elif defined(__clang__) + "adcs r5, r6\n\t" +#else + "adc r5, r6\n\t" +#endif + "movs r4, #0\n\t" +#ifdef WOLFSSL_KEIL + "adcs r4, r4, r4\n\t" +#elif defined(__clang__) + "adcs r4, r4\n\t" +#else + "adc r4, r4\n\t" +#endif + "str r5, [%[r], r7]\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds r7, r7, #4\n\t" +#else + "add r7, r7, #4\n\t" +#endif + "cmp r7, r8\n\t" + "blt L_sp_521_cond_add_17_words_%=\n\t" + "movs %[r], r4\n\t" + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" + ); + return (uint32_t)(size_t)r; +} + /* Right shift a by 1 bit into r. (r = a >> 1) * * r A single precision integer. @@ -124903,7 +124723,7 @@ "str r3, [%[r], #64]\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); } @@ -124913,7 +124733,7 @@ * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_521_div2_17(sp_digit* r, const sp_digit* a, +SP_NOINLINE static void sp_521_mont_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o; @@ -124967,7 +124787,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_17(t2, t2, p521_mod); + sp_521_mont_div2_17(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -124977,7 +124797,7 @@ /* X = X - Y */ sp_521_mont_sub_17(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_17(y, y, x, p521_mod); + sp_521_mont_sub_17(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -125000,7 +124820,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data; @@ -125074,7 +124895,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_17(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_17(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -125099,7 +124920,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -125165,12 +124986,12 @@ static void sp_521_proj_point_add_17(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*17; - sp_digit* t3 = t + 4*17; - sp_digit* t4 = t + 6*17; - sp_digit* t5 = t + 8*17; - sp_digit* t6 = t + 10*17; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*17; + sp_digit* t2 = t + 4*17; + sp_digit* t3 = t + 6*17; + sp_digit* t4 = t + 8*17; + sp_digit* t5 = t + 10*17; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod); @@ -125192,17 +125013,9 @@ sp_521_proj_point_dbl_17(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_17(t2, t2, t1, p521_mod); @@ -125221,20 +125034,31 @@ sp_521_mont_dbl_17(t3, y, p521_mod); sp_521_mont_sub_17(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_17(y, y, x, p521_mod); + sp_521_mont_sub_17(y, y, x, p521_mod); sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_17(y, y, t5, p521_mod); - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -125280,12 +125104,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*17; - ctx->t3 = t + 4*17; - ctx->t4 = t + 6*17; - ctx->t5 = t + 8*17; - ctx->t6 = t + 10*17; + ctx->t6 = t; + ctx->t1 = t + 2*17; + ctx->t2 = t + 4*17; + ctx->t3 = t + 6*17; + ctx->t4 = t + 8*17; + ctx->t5 = t + 10*17; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -125392,7 +125216,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -125405,22 +125229,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -125440,7 +125270,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table, @@ -125750,8 +125580,6 @@ } #ifdef FP_ECC -#define sp_521_mont_dbl_lower_17 sp_521_mont_dbl_17 -#define sp_521_mont_tpl_lower_17 sp_521_mont_tpl_17 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -125790,7 +125618,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_17(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_17(a, t1, p521_mod); + sp_521_mont_tpl_17(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod); @@ -125799,8 +125627,8 @@ sp_521_mont_dbl_17(t2, b, p521_mod); sp_521_mont_sub_17(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_17(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_17(b, t2, p521_mod); + sp_521_mont_sub_17(t2, b, x, p521_mod); + sp_521_mont_dbl_17(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -125820,7 +125648,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_17(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_17(a, t1, p521_mod); + sp_521_mont_tpl_17(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod); @@ -125829,8 +125657,8 @@ sp_521_mont_dbl_17(t2, b, p521_mod); sp_521_mont_sub_17(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_17(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_17(b, t2, p521_mod); + sp_521_mont_sub_17(t2, b, x, p521_mod); + sp_521_mont_dbl_17(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -125840,7 +125668,7 @@ sp_521_mont_sub_17(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_17(y, y, p521_mod); + sp_521_mont_div2_17(y, y, p521_mod); } /* Convert the projective point to affine. @@ -125886,12 +125714,12 @@ static void sp_521_proj_point_add_qz1_17(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*17; - sp_digit* t3 = t + 4*17; - sp_digit* t4 = t + 6*17; - sp_digit* t5 = t + 8*17; - sp_digit* t6 = t + 10*17; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*17; + sp_digit* t6 = t + 4*17; + sp_digit* t1 = t + 6*17; + sp_digit* t4 = t + 8*17; + sp_digit* t5 = t + 10*17; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -125907,13 +125735,9 @@ sp_521_proj_point_dbl_17(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_17(t2, t2, p->x, p521_mod); @@ -125922,33 +125746,40 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_17(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_17(x, t1, t5, p521_mod); - sp_521_mont_dbl_17(t1, t3, p521_mod); - sp_521_mont_sub_17(x, x, t1, p521_mod); + sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_17(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_17(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_17(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_17(t2, t2, t1, p521_mod); + sp_521_mont_dbl_17(t5, t3, p521_mod); + sp_521_mont_sub_17(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_17(t3, t3, x, p521_mod); + sp_521_mont_sub_17(t3, t3, x, p521_mod); sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_17(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_17(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_17(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -126049,7 +125880,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_16_17(sp_point_521* r, @@ -126274,13 +126105,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -126351,8 +126184,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap); @@ -126373,10 +126206,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -126505,7 +126340,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_256_17(sp_point_521* r, @@ -126730,13 +126565,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -126807,8 +126644,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap); @@ -126829,10 +126666,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -126925,7 +126764,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -126936,7 +126775,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_521* point = NULL; + sp_point_521* point = NULL; sp_digit* k = NULL; #else sp_point_521 point[2]; @@ -129018,7 +128857,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -129040,7 +128879,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -129257,7 +129096,7 @@ "str r1, [%[a], #64]\n\t" : [a] "+l" (a) : - : "memory", "r1", "r2" + : "memory", "r1", "r2", "cc" ); } @@ -129353,7 +129192,7 @@ sp_point_521* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -129361,7 +129200,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -129977,7 +129816,7 @@ "str r4, [%[r], #64]\n\t" : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -130404,7 +130243,7 @@ "str r4, [%[r], #4]\n\t" : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -131265,7 +131104,7 @@ "str r5, [%[r], #4]\n\t" : [r] "+l" (r), [a] "+l" (a), [n] "+l" (n) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -131336,7 +131175,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -131512,7 +131351,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -131700,7 +131539,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -132315,7 +132154,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -132360,8 +132199,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[35]; sp_digit t2[18]; @@ -132968,6 +132807,244 @@ #endif /* HAVE_ECC_SIGN */ #ifndef WOLFSSL_SP_SMALL +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, + const sp_digit* b) +{ + __asm__ __volatile__ ( + "movs r6, %[a]\n\t" + "movs r3, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds r6, r6, #0x44\n\t" +#else + "add r6, r6, #0x44\n\t" +#endif + "\n" + "L_sp_521_sub_17_word_%=:\n\t" + "movs r5, #0\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r5, r5, r3\n\t" +#else + "sub r5, r5, r3\n\t" +#endif + "ldr r4, [%[a]]\n\t" + "ldr r5, [%[b]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r5\n\t" +#elif defined(__clang__) + "sbcs r4, r5\n\t" +#else + "sbc r4, r5\n\t" +#endif + "str r4, [%[r]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r3\n\t" +#elif defined(__clang__) + "sbcs r3, r3\n\t" +#else + "sbc r3, r3\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[a], %[a], #4\n\t" +#else + "add %[a], %[a], #4\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[b], %[b], #4\n\t" +#else + "add %[b], %[b], #4\n\t" +#endif +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "adds %[r], %[r], #4\n\t" +#else + "add %[r], %[r], #4\n\t" +#endif + "cmp %[a], r6\n\t" + "bne L_sp_521_sub_17_word_%=\n\t" + "movs %[r], r3\n\t" + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) + : + : "memory", "r3", "r4", "r5", "r6", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, + const sp_digit* b) +{ + __asm__ __volatile__ ( + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#if defined(__clang__) || defined(WOLFSSL_KEIL) + "subs r3, r3, r5\n\t" +#else + "sub r3, r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldm %[b]!, {r5, r6}\n\t" + "ldm %[a]!, {r3, r4}\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif +#ifdef WOLFSSL_KEIL + "sbcs r4, r4, r6\n\t" +#elif defined(__clang__) + "sbcs r4, r6\n\t" +#else + "sbc r4, r6\n\t" +#endif + "stm %[r]!, {r3, r4}\n\t" + "ldr r5, [%[b]]\n\t" + "ldr r3, [%[a]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs r3, r3, r5\n\t" +#elif defined(__clang__) + "sbcs r3, r5\n\t" +#else + "sbc r3, r5\n\t" +#endif + "str r3, [%[r]]\n\t" +#ifdef WOLFSSL_KEIL + "sbcs %[r], %[r], %[r]\n\t" +#elif defined(__clang__) + "sbcs %[r], %[r]\n\t" +#else + "sbc %[r], %[r]\n\t" +#endif + : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) + : + : "memory", "r3", "r4", "r5", "r6", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ /* Divide the number by 2 mod the modulus. (r = a / 2 % m) * * r Result of division by 2. @@ -133525,7 +133602,7 @@ "str r5, [%[r], #64]\n\t" : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -135294,7 +135371,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [table] "+l" (table) : - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)a; } @@ -135342,7 +135419,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_521_cmp_17(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_521_cmp_17(u, v) >= 0))) { sp_521_sub_17(u, u, v); o = sp_521_sub_17(b, b, d); if (o != 0) @@ -135428,7 +135505,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -135759,7 +135836,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -135787,19 +135864,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 17; + /* y^2 - x^3 - a.x = b */ sp_521_sqr_17(t1, point->y); (void)sp_521_mod_17(t1, t1, p521_mod); sp_521_sqr_17(t2, point->x); (void)sp_521_mod_17(t2, t2, p521_mod); sp_521_mul_17(t2, t2, point->x); (void)sp_521_mod_17(t2, t2, p521_mod); - (void)sp_521_sub_17(t2, p521_mod, t2); - sp_521_mont_add_17(t1, t1, t2, p521_mod); + sp_521_mont_sub_17(t1, t1, t2, p521_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_521_mont_add_17(t1, t1, point->x, p521_mod); sp_521_mont_add_17(t1, t1, point->x, p521_mod); sp_521_mont_add_17(t1, t1, point->x, p521_mod); + if (sp_521_cmp_17(t1, p521_b) != 0) { err = MP_VAL; } @@ -135813,7 +135892,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -136551,7 +136630,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -172439,7 +172518,7 @@ "stm %[r]!, {r3, r4, r5, r6}\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); } @@ -172864,7 +172943,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -199219,7 +199298,7 @@ "stm %[r]!, {r2, r3, r4, r5}\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -199378,7 +199457,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -199530,7 +199609,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5" + : "memory", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)r; } @@ -199839,7 +199918,7 @@ #endif : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); return (uint32_t)(size_t)a; } @@ -200134,7 +200213,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -200359,7 +200438,7 @@ #endif : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "cc" ); return (uint32_t)(size_t)r; } @@ -200638,7 +200717,7 @@ "mov %[b], r10\n\t" : [a] "+l" (a), [b] "+l" (b), [tmp] "+l" (tmp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); XMEMCPY(r, t, sizeof(t)); @@ -201073,7 +201152,7 @@ "add sp, sp, r6\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -201230,7 +201309,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -201294,7 +201373,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -201368,7 +201447,7 @@ "movs %[r], r3\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)r; } @@ -201556,7 +201635,7 @@ "str r3, [%[r]]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } @@ -202171,7 +202250,7 @@ "movs %[d1], r3\n\t" : [d1] "+l" (d1), [d0] "+l" (d0), [div] "+l" (div) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); return (uint32_t)(size_t)d1; } @@ -202310,7 +202389,7 @@ "movs %[a], r2\n\t" : [a] "+l" (a), [b] "+l" (b) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "cc" ); return (uint32_t)(size_t)a; } @@ -202324,8 +202403,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -202460,14 +202539,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -202645,6 +202724,7 @@ return err; } +#define sp_1024_mont_reduce_order_32 sp_1024_mont_reduce_32 /* Reduce the number back to 1024 bits using Montgomery reduction. * * a A single precision number to reduce in place. @@ -203727,7 +203807,7 @@ #endif /* WOLFSSL_SP_LARGE_CODE */ : [a] "+l" (a), [m] "+l" (m), [mp] "+l" (mp) : - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } @@ -203738,7 +203818,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -203752,7 +203832,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -204774,7 +204854,7 @@ "str r5, [%[r], #124]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7" + : "memory", "r4", "r5", "r6", "r7", "cc" ); } @@ -205651,7 +205731,7 @@ "str r5, [%[r], #124]\n\t" : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -207421,7 +207501,7 @@ "str r7, [%[r], #124]\n\t" : [r] "+l" (r), [a] "+l" (a), [m] "+l" (m) : - : "memory", "r3", "r4", "r5", "r6", "r7" + : "memory", "r3", "r4", "r5", "r6", "r7", "cc" ); } @@ -208855,11 +208935,10 @@ "str r5, [%[r], #124]\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7" + : "memory", "r4", "r5", "r6", "r7", "cc" ); } -#define sp_1024_mont_sub_lower_32 sp_1024_mont_sub_32 /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -208924,7 +209003,7 @@ "movs %[r], r4\n\t" : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b), [m] "+l" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); return (uint32_t)(size_t)r; } @@ -209535,7 +209614,7 @@ "str r3, [%[r], #124]\n\t" : [r] "+l" (r), [a] "+l" (a) : - : "memory", "r2", "r3", "r4", "r5" + : "memory", "r2", "r3", "r4", "r5", "cc" ); } @@ -209545,7 +209624,7 @@ * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_1024_div2_32(sp_digit* r, const sp_digit* a, +SP_NOINLINE static void sp_1024_mont_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o; @@ -209599,7 +209678,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_32(t2, t2, p1024_mod); + sp_1024_mont_div2_32(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -209609,7 +209688,7 @@ /* X = X - Y */ sp_1024_mont_sub_32(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_32(y, y, x, p1024_mod); + sp_1024_mont_sub_32(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -209632,7 +209711,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data; @@ -209706,7 +209786,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_32(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_32(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -209731,7 +209811,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -209756,370 +209836,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "movs r6, %[a]\n\t" - "movs r3, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds r6, r6, #0x80\n\t" -#else - "add r6, r6, #0x80\n\t" -#endif - "\n" - "L_sp_1024_sub_32_word_%=:\n\t" - "movs r5, #0\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r5, r5, r3\n\t" -#else - "sub r5, r5, r3\n\t" -#endif - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r5\n\t" -#elif defined(__clang__) - "sbcs r4, r5\n\t" -#else - "sbc r4, r5\n\t" -#endif - "str r4, [%[r]]\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r3\n\t" -#elif defined(__clang__) - "sbcs r3, r3\n\t" -#else - "sbc r3, r3\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[a], %[a], #4\n\t" -#else - "add %[a], %[a], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[b], %[b], #4\n\t" -#else - "add %[b], %[b], #4\n\t" -#endif -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "adds %[r], %[r], #4\n\t" -#else - "add %[r], %[r], #4\n\t" -#endif - "cmp %[a], r6\n\t" - "bne L_sp_1024_sub_32_word_%=\n\t" - "movs %[r], r3\n\t" - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - __asm__ __volatile__ ( - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#if defined(__clang__) || defined(WOLFSSL_KEIL) - "subs r3, r3, r5\n\t" -#else - "sub r3, r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "ldm %[a]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs r3, r3, r5\n\t" -#elif defined(__clang__) - "sbcs r3, r5\n\t" -#else - "sbc r3, r5\n\t" -#endif -#ifdef WOLFSSL_KEIL - "sbcs r4, r4, r6\n\t" -#elif defined(__clang__) - "sbcs r4, r6\n\t" -#else - "sbc r4, r6\n\t" -#endif - "stm %[r]!, {r3, r4}\n\t" -#ifdef WOLFSSL_KEIL - "sbcs %[r], %[r], %[r]\n\t" -#elif defined(__clang__) - "sbcs %[r], %[r]\n\t" -#else - "sbc %[r], %[r]\n\t" -#endif - : [r] "+l" (r), [a] "+l" (a), [b] "+l" (b) - : - : "memory", "r3", "r4", "r5", "r6" - ); - return (uint32_t)(size_t)r; -} - -#endif /* WOLFSSL_SP_SMALL */ /* Compare two numbers to determine if they are equal. * Constant time implementation. * @@ -210167,12 +209883,12 @@ static void sp_1024_proj_point_add_32(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*32; - sp_digit* t3 = t + 4*32; - sp_digit* t4 = t + 6*32; - sp_digit* t5 = t + 8*32; - sp_digit* t6 = t + 10*32; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*32; + sp_digit* t2 = t + 4*32; + sp_digit* t3 = t + 6*32; + sp_digit* t4 = t + 8*32; + sp_digit* t5 = t + 10*32; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod); @@ -210194,17 +209910,9 @@ sp_1024_proj_point_dbl_32(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_32(t2, t2, t1, p1024_mod); @@ -210223,20 +209931,31 @@ sp_1024_mont_dbl_32(t3, y, p1024_mod); sp_1024_mont_sub_32(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_32(y, y, x, p1024_mod); + sp_1024_mont_sub_32(y, y, x, p1024_mod); sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(y, y, t5, p1024_mod); - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -210282,12 +210001,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*32; - ctx->t3 = t + 4*32; - ctx->t4 = t + 6*32; - ctx->t5 = t + 8*32; - ctx->t6 = t + 10*32; + ctx->t6 = t; + ctx->t1 = t + 2*32; + ctx->t2 = t + 4*32; + ctx->t3 = t + 6*32; + ctx->t4 = t + 8*32; + ctx->t5 = t + 10*32; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -210394,7 +210113,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -210407,22 +210126,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -210582,8 +210307,6 @@ } #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL) -#define sp_1024_mont_dbl_lower_32 sp_1024_mont_dbl_32 -#define sp_1024_mont_tpl_lower_32 sp_1024_mont_tpl_32 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -210622,7 +210345,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_32(a, t1, p1024_mod); + sp_1024_mont_tpl_32(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod); @@ -210631,8 +210354,8 @@ sp_1024_mont_dbl_32(t2, b, p1024_mod); sp_1024_mont_sub_32(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_32(b, t2, p1024_mod); + sp_1024_mont_sub_32(t2, b, x, p1024_mod); + sp_1024_mont_dbl_32(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -210652,7 +210375,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_32(a, t1, p1024_mod); + sp_1024_mont_tpl_32(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod); @@ -210661,8 +210384,8 @@ sp_1024_mont_dbl_32(t2, b, p1024_mod); sp_1024_mont_sub_32(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_32(b, t2, p1024_mod); + sp_1024_mont_sub_32(t2, b, x, p1024_mod); + sp_1024_mont_dbl_32(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -210672,7 +210395,7 @@ sp_1024_mont_sub_32(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_32(y, y, p1024_mod); + sp_1024_mont_div2_32(y, y, p1024_mod); } /* Convert the projective point to affine. @@ -210718,12 +210441,12 @@ static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*32; - sp_digit* t3 = t + 4*32; - sp_digit* t4 = t + 6*32; - sp_digit* t5 = t + 8*32; - sp_digit* t6 = t + 10*32; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*32; + sp_digit* t6 = t + 4*32; + sp_digit* t1 = t + 6*32; + sp_digit* t4 = t + 8*32; + sp_digit* t5 = t + 10*32; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -210739,13 +210462,9 @@ sp_1024_proj_point_dbl_32(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod); @@ -210754,33 +210473,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_32(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_32(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_32(t1, t3, p1024_mod); - sp_1024_mont_sub_32(x, x, t1, p1024_mod); + sp_1024_mont_sqr_32(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_32(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_32(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_32(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_32(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_32(t5, t3, p1024_mod); + sp_1024_mont_sub_32(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_32(t3, t3, x, p1024_mod); + sp_1024_mont_sub_32(t3, t3, x, p1024_mod); sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_32(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_32(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_32(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -211005,13 +210731,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -211082,8 +210810,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap); @@ -211104,10 +210832,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -211360,13 +211090,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -211437,8 +211169,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap); @@ -211459,10 +211191,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -215192,7 +214926,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -215214,7 +214948,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, + point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -215430,7 +215164,7 @@ return err; } -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -215456,7 +215190,7 @@ sp_1024_mont_add_32(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -217477,7 +217211,7 @@ } #endif /* WOLFSSL_SP_SMALL */ -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -217592,7 +217326,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_32(t1, ty, p1024_mod); + sp_1024_mont_div2_32(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_32(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -217612,7 +217346,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_32(t1, t1, p1024_mod); + sp_1024_mont_div2_32(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -218030,7 +217764,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_32(t1, ty, p1024_mod); + sp_1024_mont_div2_32(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_32(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -218068,7 +217802,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_32(p->y, p->y, p1024_mod); + sp_1024_mont_div2_32(p->y, p->y, p1024_mod); } /* Operations to perform based on order - 1. @@ -218879,7 +218613,7 @@ } } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -218908,19 +218642,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 32; + /* y^2 - x^3 - a.x = b */ sp_1024_sqr_32(t1, point->y); (void)sp_1024_mod_32(t1, t1, p1024_mod); sp_1024_sqr_32(t2, point->x); (void)sp_1024_mod_32(t2, t2, p1024_mod); sp_1024_mul_32(t2, t2, point->x); (void)sp_1024_mod_32(t2, t2, p1024_mod); - (void)sp_1024_sub_32(t2, p1024_mod, t2); - sp_1024_mont_add_32(t1, t1, t2, p1024_mod); + sp_1024_mont_sub_32(t1, t1, t2, p1024_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); + n = sp_1024_cmp_32(t1, p1024_mod); sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31)); sp_1024_norm_32(t1); @@ -218937,7 +218673,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c32.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c32.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c32.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c32.c 2024-08-03 07:30:00.000000000 +0000 @@ -56,6 +56,16 @@ #include +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif + #ifndef WOLFSSL_SP_ASM #if SP_WORD_SIZE == 32 #define SP_PRINT_NUM(var, name, total, words, bits) \ @@ -78,11 +88,14 @@ #define SP_PRINT_INT(var, name) \ fprintf(stderr, name "=%d\n", var) -#if (((!defined(WC_NO_CACHE_RESISTANT) && \ - (defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH))) || \ - (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_FAST_MODEXP))) && \ +#if ((defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)) && \ + ((!defined(WC_NO_CACHE_RESISTANT) && \ + (defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH))) || \ + (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_FAST_MODEXP))) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || (defined(WOLFSSL_SP_SMALL) && \ - defined(WOLFSSL_HAVE_SP_ECC)) + defined(WOLFSSL_HAVE_SP_ECC) && (!defined(WOLFSSL_SP_NO_256) || \ + defined(WOLFSSL_SP_384) || defined(WOLFSSL_SP_521) || \ + defined(WOLFSSL_SP_1024))) /* Mask for address to obfuscate which of the two address will be used. */ static const size_t addr_mask[2] = { 0, (size_t)-1 }; #endif @@ -139,14 +152,14 @@ { #if DIGIT_BIT == 29 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 28); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 28); } #elif DIGIT_BIT > 29 unsigned int i; @@ -1389,7 +1402,7 @@ #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -1766,7 +1779,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_36(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -1780,7 +1793,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_36(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -2795,7 +2808,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_72(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -2809,7 +2822,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_72(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -3531,7 +3544,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -3541,7 +3554,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 29) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 256U) { @@ -3570,12 +3583,12 @@ norm = r; sp_2048_from_bin(a, 72, in, inLen); -#if DIGIT_BIT >= 29 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -3594,7 +3607,7 @@ err = sp_2048_mod_72(a, a, m); } if (err == MP_OKAY) { - for (i=28; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -3631,14 +3644,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 256U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 29) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 256U) { @@ -3667,12 +3680,12 @@ m = r + 72 * 2; sp_2048_from_bin(a, 72, in, inLen); -#if DIGIT_BIT >= 29 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -3702,7 +3715,7 @@ err = sp_2048_mod_72(a, a, m); if (err == MP_OKAY) { - for (i=28; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -4900,14 +4913,14 @@ { #if DIGIT_BIT == 29 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 28); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 28); } #elif DIGIT_BIT > 29 unsigned int i; @@ -5169,7 +5182,7 @@ r[0] = (sp_digit)(c >> 29); } -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -5448,7 +5461,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_53(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -5526,7 +5539,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_53(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -6351,7 +6364,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_106(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -6365,7 +6378,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_106(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -6989,7 +7002,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -6999,7 +7012,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 29) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -7028,12 +7041,12 @@ norm = r; sp_3072_from_bin(a, 106, in, inLen); -#if DIGIT_BIT >= 29 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -7052,7 +7065,7 @@ err = sp_3072_mod_106(a, a, m); } if (err == MP_OKAY) { - for (i=28; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -7089,14 +7102,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 384U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 29) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -7125,12 +7138,12 @@ m = r + 106 * 2; sp_3072_from_bin(a, 106, in, inLen); -#if DIGIT_BIT >= 29 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -7160,7 +7173,7 @@ err = sp_3072_mod_106(a, a, m); if (err == MP_OKAY) { - for (i=28; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -8205,14 +8218,14 @@ { #if DIGIT_BIT == 28 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 27); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 27); } #elif DIGIT_BIT > 28 unsigned int i; @@ -9220,7 +9233,7 @@ } #endif /* !WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -9524,7 +9537,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_56(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -9538,7 +9551,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_56(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -10442,7 +10455,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_112(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -10456,7 +10469,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_112(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -11107,7 +11120,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -11117,7 +11130,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 28) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -11146,12 +11159,12 @@ norm = r; sp_3072_from_bin(a, 112, in, inLen); -#if DIGIT_BIT >= 28 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -11170,7 +11183,7 @@ err = sp_3072_mod_112(a, a, m); } if (err == MP_OKAY) { - for (i=27; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -11207,14 +11220,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 384U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 28) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -11243,12 +11256,12 @@ m = r + 112 * 2; sp_3072_from_bin(a, 112, in, inLen); -#if DIGIT_BIT >= 28 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -11278,7 +11291,7 @@ err = sp_3072_mod_112(a, a, m); if (err == MP_OKAY) { - for (i=27; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -12548,14 +12561,14 @@ { #if DIGIT_BIT == 29 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 28); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 28); } #elif DIGIT_BIT > 29 unsigned int i; @@ -12819,7 +12832,7 @@ r[0] = (sp_digit)(c >> 29); } -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -13105,7 +13118,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_71(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -13183,7 +13196,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_71(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -14009,7 +14022,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_142(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -14023,7 +14036,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_142(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -14647,7 +14660,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -14657,7 +14670,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 29) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -14686,12 +14699,12 @@ norm = r; sp_4096_from_bin(a, 142, in, inLen); -#if DIGIT_BIT >= 29 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -14710,7 +14723,7 @@ err = sp_4096_mod_142(a, a, m); } if (err == MP_OKAY) { - for (i=28; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -14747,14 +14760,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 512U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 29) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -14783,12 +14796,12 @@ m = r + 142 * 2; sp_4096_from_bin(a, 142, in, inLen); -#if DIGIT_BIT >= 29 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -14818,7 +14831,7 @@ err = sp_4096_mod_142(a, a, m); if (err == MP_OKAY) { - for (i=28; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -15721,14 +15734,14 @@ { #if DIGIT_BIT == 26 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 25); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 25); } #elif DIGIT_BIT > 26 unsigned int i; @@ -16745,7 +16758,7 @@ } #endif /* !WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -17064,7 +17077,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_81(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -17078,7 +17091,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_81(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -17969,7 +17982,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_162(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -17983,7 +17996,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_162(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -18632,7 +18645,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -18642,7 +18655,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 26) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -18671,12 +18684,12 @@ norm = r; sp_4096_from_bin(a, 162, in, inLen); -#if DIGIT_BIT >= 26 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -18695,7 +18708,7 @@ err = sp_4096_mod_162(a, a, m); } if (err == MP_OKAY) { - for (i=25; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -18732,14 +18745,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 512U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 26) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -18768,12 +18781,12 @@ m = r + 162 * 2; sp_4096_from_bin(a, 162, in, inLen); -#if DIGIT_BIT >= 26 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -18803,7 +18816,7 @@ err = sp_4096_mod_162(a, a, m); if (err == MP_OKAY) { - for (i=25; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -20442,14 +20455,14 @@ { #if DIGIT_BIT == 29 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 28); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 28); } #elif DIGIT_BIT > 29 unsigned int i; @@ -20943,7 +20956,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_256_mont_mul_9(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -20957,7 +20970,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_256_mont_sqr_9(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -20973,10 +20986,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_9(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_9(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_9(r, a, m, mp); for (; n > 1; n--) { @@ -21217,7 +21230,6 @@ sp_256_norm_9(r); } -#define sp_256_mont_sub_lower_9 sp_256_mont_sub_9 /* Shift number left one bit. * Bottom bit is lost. * @@ -21251,7 +21263,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_256_div2_9(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_256_mont_div2_9(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_256_cond_add_9(r, a, m, 0 - (a[0] & 1)); sp_256_norm_9(r); @@ -21302,7 +21315,7 @@ /* T2 = Y * Y */ sp_256_mont_sqr_9(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_9(t2, t2, p256_mod); + sp_256_mont_div2_9(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_9(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ @@ -21312,7 +21325,7 @@ /* X = X - Y */ sp_256_mont_sub_9(x, x, y, p256_mod); /* Y = Y - X */ - sp_256_mont_sub_lower_9(y, y, x, p256_mod); + sp_256_mont_sub_9(y, y, x, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_9(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -21335,7 +21348,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_9_ctx* ctx = (sp_256_proj_point_dbl_9_ctx*)sp_ctx->data; @@ -21409,7 +21423,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_9(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_9(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -21434,7 +21448,7 @@ break; case 16: /* Y = Y - X */ - sp_256_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_9(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -21496,12 +21510,12 @@ static void sp_256_proj_point_add_9(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*9; + sp_digit* t2 = t + 4*9; + sp_digit* t3 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_9(t1, q->z, p256_mod, p256_mp_mod); @@ -21523,17 +21537,9 @@ sp_256_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_9(t2, t2, t1, p256_mod); @@ -21552,20 +21558,31 @@ sp_256_mont_dbl_9(t3, y, p256_mod); sp_256_mont_sub_9(x, x, t3, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_9(y, y, x, p256_mod); + sp_256_mont_sub_9(y, y, x, p256_mod); sp_256_mont_mul_9(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_9(y, y, t5, p256_mod); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -21611,12 +21628,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*9; - ctx->t3 = t + 4*9; - ctx->t4 = t + 6*9; - ctx->t5 = t + 8*9; - ctx->t6 = t + 10*9; + ctx->t6 = t; + ctx->t1 = t + 2*9; + ctx->t2 = t + 4*9; + ctx->t3 = t + 6*9; + ctx->t4 = t + 8*9; + ctx->t5 = t + 10*9; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -21723,7 +21740,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_9(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -21736,22 +21753,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -22172,8 +22195,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_256_mont_dbl_lower_9 sp_256_mont_dbl_9 -#define sp_256_mont_tpl_lower_9 sp_256_mont_tpl_9 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -22212,7 +22233,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_9(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_9(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_9(a, t1, p256_mod); + sp_256_mont_tpl_9(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_9(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_9(b, t1, x, p256_mod, p256_mp_mod); @@ -22221,8 +22242,8 @@ sp_256_mont_dbl_9(t2, b, p256_mod); sp_256_mont_sub_9(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_9(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_9(b, t2, p256_mod); + sp_256_mont_sub_9(t2, b, x, p256_mod); + sp_256_mont_dbl_9(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_9(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -22242,7 +22263,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_9(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_9(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_9(a, t1, p256_mod); + sp_256_mont_tpl_9(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_9(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_9(b, t1, x, p256_mod, p256_mp_mod); @@ -22251,8 +22272,8 @@ sp_256_mont_dbl_9(t2, b, p256_mod); sp_256_mont_sub_9(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_9(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_9(b, t2, p256_mod); + sp_256_mont_sub_9(t2, b, x, p256_mod); + sp_256_mont_dbl_9(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_9(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -22262,7 +22283,7 @@ sp_256_mont_sub_9(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_9(y, y, p256_mod); + sp_256_mont_div2_9(y, y, p256_mod); } /* Double the Montgomery form projective point p a number of times. @@ -22308,7 +22329,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_9(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_9(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_9(a, t1, p256_mod); + sp_256_mont_tpl_9(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_9(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_9(b, t1, x, p256_mod, p256_mp_mod); @@ -22318,8 +22339,8 @@ sp_256_mont_dbl_9(t2, b, p256_mod); sp_256_mont_sub_9(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_9(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_9(b, t2, p256_mod); + sp_256_mont_sub_9(t2, b, x, p256_mod); + sp_256_mont_dbl_9(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_9(r[j].z, z, y, p256_mod, p256_mp_mod); z = r[j].z; @@ -22333,7 +22354,7 @@ sp_256_mont_mul_9(y, b, a, p256_mod, p256_mp_mod); sp_256_mont_sub_9(y, y, t1, p256_mod); /* Y = Y/2 */ - sp_256_div2_9(r[j].y, y, p256_mod); + sp_256_mont_div2_9(r[j].y, y, p256_mod); r[j].infinity = 0; } } @@ -22407,8 +22428,8 @@ sp_256_mont_sub_9(xs, xs, t1, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_256_mont_sub_lower_9(ys, ya, xs, p256_mod); - sp_256_mont_sub_lower_9(ya, ya, xa, p256_mod); + sp_256_mont_sub_9(ys, ya, xs, p256_mod); + sp_256_mont_sub_9(ya, ya, xa, p256_mod); sp_256_mont_mul_9(ya, ya, t4, p256_mod, p256_mp_mod); sp_256_sub_9(t6, p256_mod, t6); sp_256_mont_mul_9(ys, ys, t6, p256_mod, p256_mp_mod); @@ -22492,7 +22513,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_point_33_9(sp_point_256* r, const sp_point_256* table, @@ -22600,7 +22621,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * + t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -22719,12 +22740,12 @@ static void sp_256_proj_point_add_qz1_9(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*9; + sp_digit* t6 = t + 4*9; + sp_digit* t1 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -22740,13 +22761,9 @@ sp_256_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_9(t2, t2, p->x, p256_mod); @@ -22755,33 +22772,40 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_9(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_9(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_9(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_9(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_9(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_9(x, t1, t5, p256_mod); - sp_256_mont_dbl_9(t1, t3, p256_mod); - sp_256_mont_sub_9(x, x, t1, p256_mod); + sp_256_mont_sqr_9(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_9(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_9(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_9(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_9(t2, t2, t1, p256_mod); + sp_256_mont_dbl_9(t5, t3, p256_mod); + sp_256_mont_sub_9(x, t2, t5, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_9(t3, t3, x, p256_mod); + sp_256_mont_sub_9(t3, t3, x, p256_mod); sp_256_mont_mul_9(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_9(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_9(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_256_mont_mul_9(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_9(y, t3, t1, p256_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -22903,7 +22927,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_256_9(sp_point_256* r, @@ -23096,13 +23120,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -23173,8 +23199,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_9(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_9(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_win_add_sub_9(r, g, k, map, ct, heap); @@ -23195,10 +23221,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -23291,7 +23319,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -23302,7 +23330,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_256* point = NULL; + sp_point_256* point = NULL; sp_digit* k = NULL; #else sp_point_256 point[2]; @@ -24759,7 +24787,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -24781,7 +24809,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -24935,7 +24963,7 @@ sp_point_256* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -24943,7 +24971,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -25578,7 +25606,7 @@ sp_256_mont_sqr_n_order_9(t2, t3, 4); /* t = a^ff = t2 * t3 */ sp_256_mont_mul_order_9(t, t2, t3); - /* t3= a^ff00 = t ^ 2 ^ 8 */ + /* t2= a^ff00 = t ^ 2 ^ 8 */ sp_256_mont_sqr_n_order_9(t2, t, 8); /* t = a^ffff = t2 * t */ sp_256_mont_mul_order_9(t, t2, t); @@ -25595,7 +25623,11 @@ /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */ sp_256_mont_mul_order_9(t2, t2, t); /* t2= a^ffffffff00000000ffffffffffffffffbce6 */ - for (i=127; i>=112; i--) { + sp_256_mont_sqr_order_9(t2, t2); + sp_256_mont_mul_order_9(t2, t2, a); + sp_256_mont_sqr_n_order_9(t2, t2, 5); + sp_256_mont_mul_order_9(t2, t2, t3); + for (i=121; i>=112; i--) { sp_256_mont_sqr_order_9(t2, t2); if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) { sp_256_mont_mul_order_9(t2, t2, a); @@ -26094,8 +26126,8 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && - sp_256_cmp_9(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && + (sp_256_cmp_9(u, v) >= 0))) { sp_256_sub_9(u, u, v); sp_256_norm_9(u); @@ -26189,7 +26221,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -26513,7 +26545,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -26541,19 +26573,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 9; + /* y^2 - x^3 - a.x = b */ sp_256_sqr_9(t1, point->y); (void)sp_256_mod_9(t1, t1, p256_mod); sp_256_sqr_9(t2, point->x); (void)sp_256_mod_9(t2, t2, p256_mod); sp_256_mul_9(t2, t2, point->x); (void)sp_256_mod_9(t2, t2, p256_mod); - (void)sp_256_sub_9(t2, p256_mod, t2); - sp_256_mont_add_9(t1, t1, t2, p256_mod); + sp_256_mont_sub_9(t1, t1, t2, p256_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_256_mont_add_9(t1, t1, point->x, p256_mod); sp_256_mont_add_9(t1, t1, point->x, p256_mod); sp_256_mont_add_9(t1, t1, point->x, p256_mod); + if (sp_256_cmp_9(t1, p256_b) != 0) { err = MP_VAL; } @@ -26567,7 +26601,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -27789,14 +27823,14 @@ { #if DIGIT_BIT == 26 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 25); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 25); } #elif DIGIT_BIT > 26 unsigned int i; @@ -28334,7 +28368,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_15(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -28348,7 +28382,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_15(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -28364,10 +28398,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_15(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_15(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_15(r, a, m, mp); for (; n > 1; n--) { @@ -28630,7 +28664,6 @@ sp_384_norm_15(r); } -#define sp_384_mont_sub_lower_15 sp_384_mont_sub_15 /* Shift number left one bit. * Bottom bit is lost. * @@ -28670,7 +28703,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_384_div2_15(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_384_mont_div2_15(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_384_cond_add_15(r, a, m, 0 - (a[0] & 1)); sp_384_norm_15(r); @@ -28721,7 +28755,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_15(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_15(t2, t2, p384_mod); + sp_384_mont_div2_15(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_15(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -28731,7 +28765,7 @@ /* X = X - Y */ sp_384_mont_sub_15(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_15(y, y, x, p384_mod); + sp_384_mont_sub_15(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_15(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -28754,7 +28788,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_15_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_15_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_15_ctx* ctx = (sp_384_proj_point_dbl_15_ctx*)sp_ctx->data; @@ -28828,7 +28863,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_15(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_15(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -28853,7 +28888,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_15(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_15(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -28917,12 +28952,12 @@ static void sp_384_proj_point_add_15(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*15; - sp_digit* t3 = t + 4*15; - sp_digit* t4 = t + 6*15; - sp_digit* t5 = t + 8*15; - sp_digit* t6 = t + 10*15; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*15; + sp_digit* t2 = t + 4*15; + sp_digit* t3 = t + 6*15; + sp_digit* t4 = t + 8*15; + sp_digit* t5 = t + 10*15; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_15(t1, q->z, p384_mod, p384_mp_mod); @@ -28944,17 +28979,9 @@ sp_384_proj_point_dbl_15(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_15(t2, t2, t1, p384_mod); @@ -28973,20 +29000,31 @@ sp_384_mont_dbl_15(t3, y, p384_mod); sp_384_mont_sub_15(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_15(y, y, x, p384_mod); + sp_384_mont_sub_15(y, y, x, p384_mod); sp_384_mont_mul_15(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_15(y, y, t5, p384_mod); - for (i = 0; i < 15; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 15; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 15; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 15; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 15; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 15; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -29032,12 +29070,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*15; - ctx->t3 = t + 4*15; - ctx->t4 = t + 6*15; - ctx->t5 = t + 8*15; - ctx->t6 = t + 10*15; + ctx->t6 = t; + ctx->t1 = t + 2*15; + ctx->t2 = t + 4*15; + ctx->t3 = t + 6*15; + ctx->t4 = t + 8*15; + ctx->t5 = t + 10*15; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -29144,7 +29182,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_15(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_15(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -29157,22 +29195,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 15; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 15; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 15; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 15; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 15; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 15; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -29649,8 +29693,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_384_mont_dbl_lower_15 sp_384_mont_dbl_15 -#define sp_384_mont_tpl_lower_15 sp_384_mont_tpl_15 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -29689,7 +29731,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_15(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_15(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_15(a, t1, p384_mod); + sp_384_mont_tpl_15(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_15(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_15(b, t1, x, p384_mod, p384_mp_mod); @@ -29698,8 +29740,8 @@ sp_384_mont_dbl_15(t2, b, p384_mod); sp_384_mont_sub_15(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_15(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_15(b, t2, p384_mod); + sp_384_mont_sub_15(t2, b, x, p384_mod); + sp_384_mont_dbl_15(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_15(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -29719,7 +29761,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_15(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_15(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_15(a, t1, p384_mod); + sp_384_mont_tpl_15(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_15(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_15(b, t1, x, p384_mod, p384_mp_mod); @@ -29728,8 +29770,8 @@ sp_384_mont_dbl_15(t2, b, p384_mod); sp_384_mont_sub_15(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_15(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_15(b, t2, p384_mod); + sp_384_mont_sub_15(t2, b, x, p384_mod); + sp_384_mont_dbl_15(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_15(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -29739,7 +29781,7 @@ sp_384_mont_sub_15(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_15(y, y, p384_mod); + sp_384_mont_div2_15(y, y, p384_mod); } /* Double the Montgomery form projective point p a number of times. @@ -29785,7 +29827,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_15(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_15(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_15(a, t1, p384_mod); + sp_384_mont_tpl_15(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_15(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_15(b, t1, x, p384_mod, p384_mp_mod); @@ -29795,8 +29837,8 @@ sp_384_mont_dbl_15(t2, b, p384_mod); sp_384_mont_sub_15(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_15(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_15(b, t2, p384_mod); + sp_384_mont_sub_15(t2, b, x, p384_mod); + sp_384_mont_dbl_15(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_15(r[j].z, z, y, p384_mod, p384_mp_mod); z = r[j].z; @@ -29810,7 +29852,7 @@ sp_384_mont_mul_15(y, b, a, p384_mod, p384_mp_mod); sp_384_mont_sub_15(y, y, t1, p384_mod); /* Y = Y/2 */ - sp_384_div2_15(r[j].y, y, p384_mod); + sp_384_mont_div2_15(r[j].y, y, p384_mod); r[j].infinity = 0; } } @@ -29884,8 +29926,8 @@ sp_384_mont_sub_15(xs, xs, t1, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_384_mont_sub_lower_15(ys, ya, xs, p384_mod); - sp_384_mont_sub_lower_15(ya, ya, xa, p384_mod); + sp_384_mont_sub_15(ys, ya, xs, p384_mod); + sp_384_mont_sub_15(ya, ya, xa, p384_mod); sp_384_mont_mul_15(ya, ya, t4, p384_mod, p384_mp_mod); sp_384_sub_15(t6, p384_mod, t6); sp_384_mont_mul_15(ys, ys, t6, p384_mod, p384_mp_mod); @@ -29969,7 +30011,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_point_33_15(sp_point_384* r, const sp_point_384* table, @@ -30113,7 +30155,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * + t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -30232,12 +30274,12 @@ static void sp_384_proj_point_add_qz1_15(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*15; - sp_digit* t3 = t + 4*15; - sp_digit* t4 = t + 6*15; - sp_digit* t5 = t + 8*15; - sp_digit* t6 = t + 10*15; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*15; + sp_digit* t6 = t + 4*15; + sp_digit* t1 = t + 6*15; + sp_digit* t4 = t + 8*15; + sp_digit* t5 = t + 10*15; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -30253,13 +30295,9 @@ sp_384_proj_point_dbl_15(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_15(t2, t2, p->x, p384_mod); @@ -30268,33 +30306,40 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_15(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_15(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_15(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_15(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_15(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_15(x, t1, t5, p384_mod); - sp_384_mont_dbl_15(t1, t3, p384_mod); - sp_384_mont_sub_15(x, x, t1, p384_mod); + sp_384_mont_sqr_15(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_15(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_15(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_15(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_15(t2, t2, t1, p384_mod); + sp_384_mont_dbl_15(t5, t3, p384_mod); + sp_384_mont_sub_15(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_15(t3, t3, x, p384_mod); + sp_384_mont_sub_15(t3, t3, x, p384_mod); sp_384_mont_mul_15(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_15(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_15(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 15; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 15; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 15; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_15(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_15(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 15; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 15; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 15; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -30416,7 +30461,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_256_15(sp_point_384* r, @@ -30633,13 +30678,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -30710,8 +30757,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_15(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_15(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_win_add_sub_15(r, g, k, map, ct, heap); @@ -30732,10 +30779,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -30828,7 +30877,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -30839,7 +30888,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_384* point = NULL; + sp_point_384* point = NULL; sp_digit* k = NULL; #else sp_point_384 point[2]; @@ -32808,7 +32857,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -32830,7 +32879,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -32984,7 +33033,7 @@ sp_point_384* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -32992,7 +33041,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -34156,8 +34205,8 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && - sp_384_cmp_15(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && + (sp_384_cmp_15(u, v) >= 0))) { sp_384_sub_15(u, u, v); sp_384_norm_15(u); @@ -34257,7 +34306,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -34581,7 +34630,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -34609,19 +34658,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 15; + /* y^2 - x^3 - a.x = b */ sp_384_sqr_15(t1, point->y); (void)sp_384_mod_15(t1, t1, p384_mod); sp_384_sqr_15(t2, point->x); (void)sp_384_mod_15(t2, t2, p384_mod); sp_384_mul_15(t2, t2, point->x); (void)sp_384_mod_15(t2, t2, p384_mod); - (void)sp_384_sub_15(t2, p384_mod, t2); - sp_384_mont_add_15(t1, t1, t2, p384_mod); + sp_384_mont_sub_15(t1, t1, t2, p384_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_384_mont_add_15(t1, t1, point->x, p384_mod); sp_384_mont_add_15(t1, t1, point->x, p384_mod); sp_384_mont_add_15(t1, t1, point->x, p384_mod); + if (sp_384_cmp_15(t1, p384_b) != 0) { err = MP_VAL; } @@ -34635,7 +34686,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -35513,14 +35564,14 @@ { #if DIGIT_BIT == 25 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 24); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 24); } #elif DIGIT_BIT > 25 unsigned int i; @@ -35994,7 +36045,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_mul_21(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -36008,7 +36059,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_sqr_21(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -36024,10 +36075,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_21(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_21(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_21(r, a, m, mp); for (; n > 1; n--) { @@ -36289,7 +36340,6 @@ sp_521_norm_21(r); } -#define sp_521_mont_sub_lower_21 sp_521_mont_sub_21 /* Shift number left one bit. * Bottom bit is lost. * @@ -36335,7 +36385,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_521_div2_21(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_521_mont_div2_21(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_521_cond_add_21(r, a, m, 0 - (a[0] & 1)); sp_521_norm_21(r); @@ -36386,7 +36437,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_21(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_21(t2, t2, p521_mod); + sp_521_mont_div2_21(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_21(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -36396,7 +36447,7 @@ /* X = X - Y */ sp_521_mont_sub_21(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_21(y, y, x, p521_mod); + sp_521_mont_sub_21(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_21(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -36419,7 +36470,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_21_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_21_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_21_ctx* ctx = (sp_521_proj_point_dbl_21_ctx*)sp_ctx->data; @@ -36493,7 +36545,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_21(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_21(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -36518,7 +36570,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_21(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_21(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -36585,12 +36637,12 @@ static void sp_521_proj_point_add_21(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*21; - sp_digit* t3 = t + 4*21; - sp_digit* t4 = t + 6*21; - sp_digit* t5 = t + 8*21; - sp_digit* t6 = t + 10*21; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*21; + sp_digit* t2 = t + 4*21; + sp_digit* t3 = t + 6*21; + sp_digit* t4 = t + 8*21; + sp_digit* t5 = t + 10*21; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_21(t1, q->z, p521_mod, p521_mp_mod); @@ -36612,17 +36664,9 @@ sp_521_proj_point_dbl_21(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_21(t2, t2, t1, p521_mod); @@ -36641,20 +36685,31 @@ sp_521_mont_dbl_21(t3, y, p521_mod); sp_521_mont_sub_21(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_21(y, y, x, p521_mod); + sp_521_mont_sub_21(y, y, x, p521_mod); sp_521_mont_mul_21(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_21(y, y, t5, p521_mod); - for (i = 0; i < 21; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 21; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 21; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 21; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 21; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 21; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -36700,12 +36755,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*21; - ctx->t3 = t + 4*21; - ctx->t4 = t + 6*21; - ctx->t5 = t + 8*21; - ctx->t6 = t + 10*21; + ctx->t6 = t; + ctx->t1 = t + 2*21; + ctx->t2 = t + 4*21; + ctx->t3 = t + 6*21; + ctx->t4 = t + 8*21; + ctx->t5 = t + 10*21; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -36812,7 +36867,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_21(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_21(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -36825,22 +36880,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 21; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 21; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 21; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 21; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 21; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 21; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -37179,8 +37240,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_521_mont_dbl_lower_21 sp_521_mont_dbl_21 -#define sp_521_mont_tpl_lower_21 sp_521_mont_tpl_21 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -37219,7 +37278,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_21(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_21(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_21(a, t1, p521_mod); + sp_521_mont_tpl_21(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_21(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_21(b, t1, x, p521_mod, p521_mp_mod); @@ -37228,8 +37287,8 @@ sp_521_mont_dbl_21(t2, b, p521_mod); sp_521_mont_sub_21(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_21(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_21(b, t2, p521_mod); + sp_521_mont_sub_21(t2, b, x, p521_mod); + sp_521_mont_dbl_21(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_21(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -37249,7 +37308,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_21(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_21(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_21(a, t1, p521_mod); + sp_521_mont_tpl_21(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_21(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_21(b, t1, x, p521_mod, p521_mp_mod); @@ -37258,8 +37317,8 @@ sp_521_mont_dbl_21(t2, b, p521_mod); sp_521_mont_sub_21(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_21(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_21(b, t2, p521_mod); + sp_521_mont_sub_21(t2, b, x, p521_mod); + sp_521_mont_dbl_21(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_21(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -37269,7 +37328,7 @@ sp_521_mont_sub_21(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_21(y, y, p521_mod); + sp_521_mont_div2_21(y, y, p521_mod); } /* Double the Montgomery form projective point p a number of times. @@ -37315,7 +37374,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_21(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_21(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_21(a, t1, p521_mod); + sp_521_mont_tpl_21(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_21(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_21(b, t1, x, p521_mod, p521_mp_mod); @@ -37325,8 +37384,8 @@ sp_521_mont_dbl_21(t2, b, p521_mod); sp_521_mont_sub_21(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_21(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_21(b, t2, p521_mod); + sp_521_mont_sub_21(t2, b, x, p521_mod); + sp_521_mont_dbl_21(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_21(r[j].z, z, y, p521_mod, p521_mp_mod); z = r[j].z; @@ -37340,7 +37399,7 @@ sp_521_mont_mul_21(y, b, a, p521_mod, p521_mp_mod); sp_521_mont_sub_21(y, y, t1, p521_mod); /* Y = Y/2 */ - sp_521_div2_21(r[j].y, y, p521_mod); + sp_521_mont_div2_21(r[j].y, y, p521_mod); r[j].infinity = 0; } } @@ -37414,8 +37473,8 @@ sp_521_mont_sub_21(xs, xs, t1, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_521_mont_sub_lower_21(ys, ya, xs, p521_mod); - sp_521_mont_sub_lower_21(ya, ya, xa, p521_mod); + sp_521_mont_sub_21(ys, ya, xs, p521_mod); + sp_521_mont_sub_21(ya, ya, xa, p521_mod); sp_521_mont_mul_21(ya, ya, t4, p521_mod, p521_mp_mod); sp_521_sub_21(t6, p521_mod, t6); sp_521_mont_mul_21(ys, ys, t6, p521_mod, p521_mp_mod); @@ -37499,7 +37558,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_point_33_21(sp_point_521* r, const sp_point_521* table, @@ -37679,7 +37738,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * + t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -37798,12 +37857,12 @@ static void sp_521_proj_point_add_qz1_21(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*21; - sp_digit* t3 = t + 4*21; - sp_digit* t4 = t + 6*21; - sp_digit* t5 = t + 8*21; - sp_digit* t6 = t + 10*21; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*21; + sp_digit* t6 = t + 4*21; + sp_digit* t1 = t + 6*21; + sp_digit* t4 = t + 8*21; + sp_digit* t5 = t + 10*21; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -37819,13 +37878,9 @@ sp_521_proj_point_dbl_21(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_21(t2, t2, p->x, p521_mod); @@ -37834,33 +37889,40 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_21(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_21(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_21(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_21(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_21(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_21(x, t1, t5, p521_mod); - sp_521_mont_dbl_21(t1, t3, p521_mod); - sp_521_mont_sub_21(x, x, t1, p521_mod); + sp_521_mont_sqr_21(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_21(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_21(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_21(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_21(t2, t2, t1, p521_mod); + sp_521_mont_dbl_21(t5, t3, p521_mod); + sp_521_mont_sub_21(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_21(t3, t3, x, p521_mod); + sp_521_mont_sub_21(t3, t3, x, p521_mod); sp_521_mont_mul_21(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_21(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_21(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 21; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 21; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 21; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_21(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_21(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 21; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 21; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 21; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -37982,7 +38044,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_256_21(sp_point_521* r, @@ -38223,13 +38285,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -38300,8 +38364,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_21(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_21(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_win_add_sub_21(r, g, k, map, ct, heap); @@ -38322,10 +38386,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -38418,7 +38484,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -38429,7 +38495,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_521* point = NULL; + sp_point_521* point = NULL; sp_digit* k = NULL; #else sp_point_521 point[2]; @@ -40908,7 +40974,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -40930,7 +40996,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -41085,7 +41151,7 @@ sp_point_521* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -41093,7 +41159,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -42302,8 +42368,8 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && - sp_521_cmp_21(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && + (sp_521_cmp_21(u, v) >= 0))) { sp_521_sub_21(u, u, v); sp_521_norm_21(u); @@ -42409,7 +42475,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -42742,7 +42808,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -42770,19 +42836,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 21; + /* y^2 - x^3 - a.x = b */ sp_521_sqr_21(t1, point->y); (void)sp_521_mod_21(t1, t1, p521_mod); sp_521_sqr_21(t2, point->x); (void)sp_521_mod_21(t2, t2, p521_mod); sp_521_mul_21(t2, t2, point->x); (void)sp_521_mod_21(t2, t2, p521_mod); - (void)sp_521_sub_21(t2, p521_mod, t2); - sp_521_mont_add_21(t1, t1, t2, p521_mod); + sp_521_mont_sub_21(t1, t1, t2, p521_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_521_mont_add_21(t1, t1, point->x, p521_mod); sp_521_mont_add_21(t1, t1, point->x, p521_mod); sp_521_mont_add_21(t1, t1, point->x, p521_mod); + if (sp_521_cmp_21(t1, p521_b) != 0) { err = MP_VAL; } @@ -42796,7 +42864,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -44421,14 +44489,14 @@ { #if DIGIT_BIT == 25 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 24); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 24); } #elif DIGIT_BIT > 25 unsigned int i; @@ -44860,7 +44928,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_42(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -44874,7 +44942,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_42(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -45055,7 +45123,6 @@ sp_1024_norm_42(r); } -#define sp_1024_mont_sub_lower_42 sp_1024_mont_sub_42 /* Shift number left one bit. * Bottom bit is lost. * @@ -45122,7 +45189,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_1024_div2_42(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_1024_mont_div2_42(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_1024_cond_add_42(r, a, m, 0 - (a[0] & 1)); sp_1024_norm_42(r); @@ -45173,7 +45241,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_42(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_42(t2, t2, p1024_mod); + sp_1024_mont_div2_42(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_42(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -45183,7 +45251,7 @@ /* X = X - Y */ sp_1024_mont_sub_42(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_42(y, y, x, p1024_mod); + sp_1024_mont_sub_42(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_42(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -45206,7 +45274,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_42_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_42_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_42_ctx* ctx = (sp_1024_proj_point_dbl_42_ctx*)sp_ctx->data; @@ -45280,7 +45349,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_42(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_42(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -45305,7 +45374,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_42(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_42(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -45382,12 +45451,12 @@ static void sp_1024_proj_point_add_42(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*42; - sp_digit* t3 = t + 4*42; - sp_digit* t4 = t + 6*42; - sp_digit* t5 = t + 8*42; - sp_digit* t6 = t + 10*42; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*42; + sp_digit* t2 = t + 4*42; + sp_digit* t3 = t + 6*42; + sp_digit* t4 = t + 8*42; + sp_digit* t5 = t + 10*42; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_42(t1, q->z, p1024_mod, p1024_mp_mod); @@ -45409,17 +45478,9 @@ sp_1024_proj_point_dbl_42(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_42(t2, t2, t1, p1024_mod); @@ -45438,20 +45499,31 @@ sp_1024_mont_dbl_42(t3, y, p1024_mod); sp_1024_mont_sub_42(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_42(y, y, x, p1024_mod); + sp_1024_mont_sub_42(y, y, x, p1024_mod); sp_1024_mont_mul_42(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_42(y, y, t5, p1024_mod); - for (i = 0; i < 42; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 42; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 42; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 42; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 42; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 42; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -45497,12 +45569,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*42; - ctx->t3 = t + 4*42; - ctx->t4 = t + 6*42; - ctx->t5 = t + 8*42; - ctx->t6 = t + 10*42; + ctx->t6 = t; + ctx->t1 = t + 2*42; + ctx->t2 = t + 4*42; + ctx->t3 = t + 6*42; + ctx->t4 = t + 8*42; + ctx->t5 = t + 10*42; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -45609,7 +45681,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_42(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_42(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -45622,22 +45694,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 42; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 42; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 42; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 42; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 42; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 42; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -46000,8 +46078,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_1024_mont_dbl_lower_42 sp_1024_mont_dbl_42 -#define sp_1024_mont_tpl_lower_42 sp_1024_mont_tpl_42 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -46040,7 +46116,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_42(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_42(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_42(a, t1, p1024_mod); + sp_1024_mont_tpl_42(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_42(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_42(b, t1, x, p1024_mod, p1024_mp_mod); @@ -46049,8 +46125,8 @@ sp_1024_mont_dbl_42(t2, b, p1024_mod); sp_1024_mont_sub_42(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_42(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_42(b, t2, p1024_mod); + sp_1024_mont_sub_42(t2, b, x, p1024_mod); + sp_1024_mont_dbl_42(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_42(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -46070,7 +46146,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_42(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_42(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_42(a, t1, p1024_mod); + sp_1024_mont_tpl_42(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_42(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_42(b, t1, x, p1024_mod, p1024_mp_mod); @@ -46079,8 +46155,8 @@ sp_1024_mont_dbl_42(t2, b, p1024_mod); sp_1024_mont_sub_42(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_42(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_42(b, t2, p1024_mod); + sp_1024_mont_sub_42(t2, b, x, p1024_mod); + sp_1024_mont_dbl_42(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_42(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -46090,7 +46166,7 @@ sp_1024_mont_sub_42(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_42(y, y, p1024_mod); + sp_1024_mont_div2_42(y, y, p1024_mod); } /* Double the Montgomery form projective point p a number of times. @@ -46136,7 +46212,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_42(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_42(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_42(a, t1, p1024_mod); + sp_1024_mont_tpl_42(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_42(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_42(b, t1, x, p1024_mod, p1024_mp_mod); @@ -46146,8 +46222,8 @@ sp_1024_mont_dbl_42(t2, b, p1024_mod); sp_1024_mont_sub_42(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_42(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_42(b, t2, p1024_mod); + sp_1024_mont_sub_42(t2, b, x, p1024_mod); + sp_1024_mont_dbl_42(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_42(r[j].z, z, y, p1024_mod, p1024_mp_mod); z = r[j].z; @@ -46161,7 +46237,7 @@ sp_1024_mont_mul_42(y, b, a, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_42(y, y, t1, p1024_mod); /* Y = Y/2 */ - sp_1024_div2_42(r[j].y, y, p1024_mod); + sp_1024_mont_div2_42(r[j].y, y, p1024_mod); r[j].infinity = 0; } } @@ -46235,8 +46311,8 @@ sp_1024_mont_sub_42(xs, xs, t1, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_1024_mont_sub_lower_42(ys, ya, xs, p1024_mod); - sp_1024_mont_sub_lower_42(ya, ya, xa, p1024_mod); + sp_1024_mont_sub_42(ys, ya, xs, p1024_mod); + sp_1024_mont_sub_42(ya, ya, xa, p1024_mod); sp_1024_mont_mul_42(ya, ya, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_42(t6, p1024_mod, t6, p1024_mod); sp_1024_mont_mul_42(ys, ys, t6, p1024_mod, p1024_mp_mod); @@ -46364,7 +46440,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * + t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (65+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -46487,12 +46563,12 @@ static void sp_1024_proj_point_add_qz1_42(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*42; - sp_digit* t3 = t + 4*42; - sp_digit* t4 = t + 6*42; - sp_digit* t5 = t + 8*42; - sp_digit* t6 = t + 10*42; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*42; + sp_digit* t6 = t + 4*42; + sp_digit* t1 = t + 6*42; + sp_digit* t4 = t + 8*42; + sp_digit* t5 = t + 10*42; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -46508,13 +46584,9 @@ sp_1024_proj_point_dbl_42(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_42(t2, t2, p->x, p1024_mod); @@ -46523,33 +46595,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_42(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_42(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_42(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_42(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_42(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_42(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_42(t1, t3, p1024_mod); - sp_1024_mont_sub_42(x, x, t1, p1024_mod); + sp_1024_mont_sqr_42(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_42(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_42(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_42(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_42(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_42(t5, t3, p1024_mod); + sp_1024_mont_sub_42(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_42(t3, t3, x, p1024_mod); + sp_1024_mont_sub_42(t3, t3, x, p1024_mod); sp_1024_mont_mul_42(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_42(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_42(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 42; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 42; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 42; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_42(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_42(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 42; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 42; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 42; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -46795,13 +46874,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -46872,8 +46953,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_42(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_42(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_win_add_sub_42(r, g, k, map, ct, heap); @@ -46894,10 +46975,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -50934,7 +51017,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -50956,7 +51039,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, + point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -51172,7 +51255,7 @@ return err; } -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -51198,7 +51281,7 @@ sp_1024_mont_add_42(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -53219,7 +53302,7 @@ } #endif /* WOLFSSL_SP_SMALL */ -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -53334,7 +53417,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_42(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_42(t1, ty, p1024_mod); + sp_1024_mont_div2_42(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_42(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -53354,7 +53437,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_42(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_42(t1, t1, p1024_mod); + sp_1024_mont_div2_42(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_42(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -53772,7 +53855,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_42(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_42(t1, ty, p1024_mod); + sp_1024_mont_div2_42(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_42(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -53810,7 +53893,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_42(p->y, p->y, p1024_mod); + sp_1024_mont_div2_42(p->y, p->y, p1024_mod); } /* Operations to perform based on order - 1. @@ -54618,7 +54701,7 @@ } } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -54647,19 +54730,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 42; + /* y^2 - x^3 - a.x = b */ sp_1024_sqr_42(t1, point->y); (void)sp_1024_mod_42(t1, t1, p1024_mod); sp_1024_sqr_42(t2, point->x); (void)sp_1024_mod_42(t2, t2, p1024_mod); sp_1024_mul_42(t2, t2, point->x); (void)sp_1024_mod_42(t2, t2, p1024_mod); - (void)sp_1024_sub_42(t2, p1024_mod, t2); - sp_1024_mont_add_42(t1, t1, t2, p1024_mod); + sp_1024_mont_sub_42(t1, t1, t2, p1024_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_1024_mont_add_42(t1, t1, point->x, p1024_mod); sp_1024_mont_add_42(t1, t1, point->x, p1024_mod); sp_1024_mont_add_42(t1, t1, point->x, p1024_mod); + n = sp_1024_cmp_42(t1, p1024_mod); sp_1024_cond_sub_42(t1, t1, p1024_mod, ~(n >> 24)); sp_1024_norm_42(t1); @@ -54676,7 +54761,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c64.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c64.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c64.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_c64.c 2024-08-03 07:30:00.000000000 +0000 @@ -56,6 +56,16 @@ #include +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif + #ifndef WOLFSSL_SP_ASM #if SP_WORD_SIZE == 64 #define SP_PRINT_NUM(var, name, total, words, bits) \ @@ -78,11 +88,14 @@ #define SP_PRINT_INT(var, name) \ fprintf(stderr, name "=%d\n", var) -#if (((!defined(WC_NO_CACHE_RESISTANT) && \ - (defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH))) || \ - (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_FAST_MODEXP))) && \ +#if ((defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH)) && \ + ((!defined(WC_NO_CACHE_RESISTANT) && \ + (defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH))) || \ + (defined(WOLFSSL_SP_SMALL) && !defined(WOLFSSL_SP_FAST_MODEXP))) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || (defined(WOLFSSL_SP_SMALL) && \ - defined(WOLFSSL_HAVE_SP_ECC)) + defined(WOLFSSL_HAVE_SP_ECC) && (!defined(WOLFSSL_SP_NO_256) || \ + defined(WOLFSSL_SP_384) || defined(WOLFSSL_SP_521) || \ + defined(WOLFSSL_SP_1024))) /* Mask for address to obfuscate which of the two address will be used. */ static const size_t addr_mask[2] = { 0, (size_t)-1 }; #endif @@ -140,14 +153,14 @@ { #if DIGIT_BIT == 61 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 60); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 60); } #elif DIGIT_BIT > 61 unsigned int i; @@ -409,7 +422,7 @@ r[0] = (sp_digit)(c >> 61); } -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -675,7 +688,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_17(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -753,7 +766,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_17(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -1564,7 +1577,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_34(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -1578,7 +1591,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_34(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -2202,7 +2215,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -2212,7 +2225,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 61) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 256U) { @@ -2241,12 +2254,12 @@ norm = r; sp_2048_from_bin(a, 34, in, inLen); -#if DIGIT_BIT >= 61 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -2265,7 +2278,7 @@ err = sp_2048_mod_34(a, a, m); } if (err == MP_OKAY) { - for (i=60; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -2302,14 +2315,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 256U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 61) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 256U) { @@ -2338,12 +2351,12 @@ m = r + 34 * 2; sp_2048_from_bin(a, 34, in, inLen); -#if DIGIT_BIT >= 61 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -2373,7 +2386,7 @@ err = sp_2048_mod_34(a, a, m); if (err == MP_OKAY) { - for (i=60; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -3419,14 +3432,14 @@ { #if DIGIT_BIT == 57 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 56); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 56); } #elif DIGIT_BIT > 57 unsigned int i; @@ -4001,7 +4014,7 @@ } #endif /* !WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -4250,7 +4263,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_18(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -4264,7 +4277,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_18(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -5138,7 +5151,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_36(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -5152,7 +5165,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_36(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -5802,7 +5815,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -5812,7 +5825,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 57) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 256U) { @@ -5841,12 +5854,12 @@ norm = r; sp_2048_from_bin(a, 36, in, inLen); -#if DIGIT_BIT >= 57 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -5865,7 +5878,7 @@ err = sp_2048_mod_36(a, a, m); } if (err == MP_OKAY) { - for (i=56; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -5902,14 +5915,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 256U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 57) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 256U) { @@ -5938,12 +5951,12 @@ m = r + 36 * 2; sp_2048_from_bin(a, 36, in, inLen); -#if DIGIT_BIT >= 57 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -5973,7 +5986,7 @@ err = sp_2048_mod_36(a, a, m); if (err == MP_OKAY) { - for (i=56; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -7092,14 +7105,14 @@ { #if DIGIT_BIT == 60 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 59); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 59); } #elif DIGIT_BIT > 60 unsigned int i; @@ -7322,7 +7335,7 @@ r[0] = (sp_digit)(c >> 60); } -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -7575,7 +7588,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_26(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -7630,7 +7643,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_26(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -8447,7 +8460,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_52(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -8461,7 +8474,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_52(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -9085,7 +9098,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -9095,7 +9108,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 60) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -9124,12 +9137,12 @@ norm = r; sp_3072_from_bin(a, 52, in, inLen); -#if DIGIT_BIT >= 60 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -9148,7 +9161,7 @@ err = sp_3072_mod_52(a, a, m); } if (err == MP_OKAY) { - for (i=59; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -9185,14 +9198,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 384U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 60) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -9221,12 +9234,12 @@ m = r + 52 * 2; sp_3072_from_bin(a, 52, in, inLen); -#if DIGIT_BIT >= 60 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -9256,7 +9269,7 @@ err = sp_3072_mod_52(a, a, m); if (err == MP_OKAY) { - for (i=59; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -10302,14 +10315,14 @@ { #if DIGIT_BIT == 57 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 56); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 56); } #elif DIGIT_BIT > 57 unsigned int i; @@ -10967,7 +10980,7 @@ } #endif /* !WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -11266,7 +11279,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_27(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -11280,7 +11293,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_27(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -12166,7 +12179,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_54(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -12180,7 +12193,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_54(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -12834,7 +12847,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -12844,7 +12857,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 57) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -12873,12 +12886,12 @@ norm = r; sp_3072_from_bin(a, 54, in, inLen); -#if DIGIT_BIT >= 57 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -12897,7 +12910,7 @@ err = sp_3072_mod_54(a, a, m); } if (err == MP_OKAY) { - for (i=56; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -12934,14 +12947,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 384U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 57) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 384U) { @@ -12970,12 +12983,12 @@ m = r + 54 * 2; sp_3072_from_bin(a, 54, in, inLen); -#if DIGIT_BIT >= 57 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -13005,7 +13018,7 @@ err = sp_3072_mod_54(a, a, m); if (err == MP_OKAY) { - for (i=56; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -14160,14 +14173,14 @@ { #if DIGIT_BIT == 59 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 58); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 58); } #elif DIGIT_BIT > 59 unsigned int i; @@ -14392,7 +14405,7 @@ r[0] = (sp_digit)(c >> 59); } -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -14649,7 +14662,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_35(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -14704,7 +14717,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_35(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -15516,7 +15529,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_70(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -15530,7 +15543,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_70(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -16154,7 +16167,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -16164,7 +16177,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 59) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -16193,12 +16206,12 @@ norm = r; sp_4096_from_bin(a, 70, in, inLen); -#if DIGIT_BIT >= 59 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -16217,7 +16230,7 @@ err = sp_4096_mod_70(a, a, m); } if (err == MP_OKAY) { - for (i=58; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -16254,14 +16267,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 512U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 59) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -16290,12 +16303,12 @@ m = r + 70 * 2; sp_4096_from_bin(a, 70, in, inLen); -#if DIGIT_BIT >= 59 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -16325,7 +16338,7 @@ err = sp_4096_mod_70(a, a, m); if (err == MP_OKAY) { - for (i=58; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -17229,14 +17242,14 @@ { #if DIGIT_BIT == 53 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 52); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 52); } #elif DIGIT_BIT > 53 unsigned int i; @@ -18058,7 +18071,7 @@ } #endif /* !WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -18382,7 +18395,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_39(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -18396,7 +18409,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_39(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -19291,7 +19304,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_78(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -19305,7 +19318,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_78(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -19959,7 +19972,7 @@ sp_digit* m = NULL; sp_digit* r = NULL; sp_digit* norm = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; sp_digit mp = 0; int i; int err = MP_OKAY; @@ -19969,7 +19982,7 @@ } if (err == MP_OKAY) { - if (mp_count_bits(em) > 53) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -19998,12 +20011,12 @@ norm = r; sp_4096_from_bin(a, 78, in, inLen); -#if DIGIT_BIT >= 53 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -20022,7 +20035,7 @@ err = sp_4096_mod_78(a, a, m); } if (err == MP_OKAY) { - for (i=52; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -20059,14 +20072,14 @@ sp_digit* a = NULL; sp_digit* m = NULL; sp_digit* r = NULL; - sp_digit e[1] = {0}; + sp_uint64 e[1] = {0}; int err = MP_OKAY; if (*outLen < 512U) { err = MP_TO_E; } if (err == MP_OKAY) { - if (mp_count_bits(em) > 53) { + if (mp_count_bits(em) > 64) { err = MP_READ_E; } else if (inLen > 512U) { @@ -20095,12 +20108,12 @@ m = r + 78 * 2; sp_4096_from_bin(a, 78, in, inLen); -#if DIGIT_BIT >= 53 - e[0] = (sp_digit)em->dp[0]; +#if DIGIT_BIT >= 64 + e[0] = (sp_uint64)em->dp[0]; #else - e[0] = (sp_digit)em->dp[0]; + e[0] = (sp_uint64)em->dp[0]; if (em->used > 1) { - e[0] |= ((sp_digit)em->dp[1]) << DIGIT_BIT; + e[0] |= ((sp_uint64)em->dp[1]) << DIGIT_BIT; } #endif if (e[0] == 0) { @@ -20130,7 +20143,7 @@ err = sp_4096_mod_78(a, a, m); if (err == MP_OKAY) { - for (i=52; i>=0; i--) { + for (i=63; i>=0; i--) { if ((e[0] >> i) != 0) { break; } @@ -21481,14 +21494,14 @@ { #if DIGIT_BIT == 52 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 51); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 51); } #elif DIGIT_BIT > 52 unsigned int i; @@ -21923,7 +21936,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_256_mont_mul_5(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -21937,7 +21950,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_256_mont_sqr_5(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -21953,10 +21966,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_5(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_5(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_5(r, a, m, mp); for (; n > 1; n--) { @@ -22193,7 +22206,6 @@ sp_256_norm_5(r); } -#define sp_256_mont_sub_lower_5 sp_256_mont_sub_5 /* Shift number left one bit. * Bottom bit is lost. * @@ -22223,7 +22235,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_256_div2_5(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_256_mont_div2_5(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_256_cond_add_5(r, a, m, 0 - (a[0] & 1)); sp_256_norm_5(r); @@ -22274,7 +22287,7 @@ /* T2 = Y * Y */ sp_256_mont_sqr_5(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_5(t2, t2, p256_mod); + sp_256_mont_div2_5(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_5(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ @@ -22284,7 +22297,7 @@ /* X = X - Y */ sp_256_mont_sub_5(x, x, y, p256_mod); /* Y = Y - X */ - sp_256_mont_sub_lower_5(y, y, x, p256_mod); + sp_256_mont_sub_5(y, y, x, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_5(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -22307,7 +22320,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_5_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_5_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_5_ctx* ctx = (sp_256_proj_point_dbl_5_ctx*)sp_ctx->data; @@ -22381,7 +22395,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_5(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_5(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -22406,7 +22420,7 @@ break; case 16: /* Y = Y - X */ - sp_256_mont_sub_lower_5(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_5(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -22466,12 +22480,12 @@ static void sp_256_proj_point_add_5(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*5; - sp_digit* t3 = t + 4*5; - sp_digit* t4 = t + 6*5; - sp_digit* t5 = t + 8*5; - sp_digit* t6 = t + 10*5; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*5; + sp_digit* t2 = t + 4*5; + sp_digit* t3 = t + 6*5; + sp_digit* t4 = t + 8*5; + sp_digit* t5 = t + 10*5; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_5(t1, q->z, p256_mod, p256_mp_mod); @@ -22493,17 +22507,9 @@ sp_256_proj_point_dbl_5(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_5(t2, t2, t1, p256_mod); @@ -22522,20 +22528,31 @@ sp_256_mont_dbl_5(t3, y, p256_mod); sp_256_mont_sub_5(x, x, t3, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_5(y, y, x, p256_mod); + sp_256_mont_sub_5(y, y, x, p256_mod); sp_256_mont_mul_5(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_5(y, y, t5, p256_mod); - for (i = 0; i < 5; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 5; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 5; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 5; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 5; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 5; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -22581,12 +22598,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*5; - ctx->t3 = t + 4*5; - ctx->t4 = t + 6*5; - ctx->t5 = t + 8*5; - ctx->t6 = t + 10*5; + ctx->t6 = t; + ctx->t1 = t + 2*5; + ctx->t2 = t + 4*5; + ctx->t3 = t + 6*5; + ctx->t4 = t + 8*5; + ctx->t5 = t + 10*5; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -22693,7 +22710,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_5(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_5(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -22706,22 +22723,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 5; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 5; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 5; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 5; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 5; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 5; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -23119,8 +23142,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_256_mont_dbl_lower_5 sp_256_mont_dbl_5 -#define sp_256_mont_tpl_lower_5 sp_256_mont_tpl_5 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -23159,7 +23180,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_5(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_5(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_5(a, t1, p256_mod); + sp_256_mont_tpl_5(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_5(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_5(b, t1, x, p256_mod, p256_mp_mod); @@ -23168,8 +23189,8 @@ sp_256_mont_dbl_5(t2, b, p256_mod); sp_256_mont_sub_5(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_5(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_5(b, t2, p256_mod); + sp_256_mont_sub_5(t2, b, x, p256_mod); + sp_256_mont_dbl_5(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_5(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -23189,7 +23210,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_5(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_5(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_5(a, t1, p256_mod); + sp_256_mont_tpl_5(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_5(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_5(b, t1, x, p256_mod, p256_mp_mod); @@ -23198,8 +23219,8 @@ sp_256_mont_dbl_5(t2, b, p256_mod); sp_256_mont_sub_5(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_5(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_5(b, t2, p256_mod); + sp_256_mont_sub_5(t2, b, x, p256_mod); + sp_256_mont_dbl_5(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_5(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -23209,7 +23230,7 @@ sp_256_mont_sub_5(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_5(y, y, p256_mod); + sp_256_mont_div2_5(y, y, p256_mod); } /* Double the Montgomery form projective point p a number of times. @@ -23255,7 +23276,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_5(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_5(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_5(a, t1, p256_mod); + sp_256_mont_tpl_5(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_5(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_5(b, t1, x, p256_mod, p256_mp_mod); @@ -23265,8 +23286,8 @@ sp_256_mont_dbl_5(t2, b, p256_mod); sp_256_mont_sub_5(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_5(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_5(b, t2, p256_mod); + sp_256_mont_sub_5(t2, b, x, p256_mod); + sp_256_mont_dbl_5(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_5(r[j].z, z, y, p256_mod, p256_mp_mod); z = r[j].z; @@ -23280,7 +23301,7 @@ sp_256_mont_mul_5(y, b, a, p256_mod, p256_mp_mod); sp_256_mont_sub_5(y, y, t1, p256_mod); /* Y = Y/2 */ - sp_256_div2_5(r[j].y, y, p256_mod); + sp_256_mont_div2_5(r[j].y, y, p256_mod); r[j].infinity = 0; } } @@ -23354,8 +23375,8 @@ sp_256_mont_sub_5(xs, xs, t1, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_256_mont_sub_lower_5(ys, ya, xs, p256_mod); - sp_256_mont_sub_lower_5(ya, ya, xa, p256_mod); + sp_256_mont_sub_5(ys, ya, xs, p256_mod); + sp_256_mont_sub_5(ya, ya, xa, p256_mod); sp_256_mont_mul_5(ya, ya, t4, p256_mod, p256_mp_mod); sp_256_sub_5(t6, p256_mod, t6); sp_256_mont_mul_5(ys, ys, t6, p256_mod, p256_mp_mod); @@ -23439,7 +23460,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_point_33_5(sp_point_256* r, const sp_point_256* table, @@ -23523,7 +23544,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * + t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -23642,12 +23663,12 @@ static void sp_256_proj_point_add_qz1_5(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*5; - sp_digit* t3 = t + 4*5; - sp_digit* t4 = t + 6*5; - sp_digit* t5 = t + 8*5; - sp_digit* t6 = t + 10*5; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*5; + sp_digit* t6 = t + 4*5; + sp_digit* t1 = t + 6*5; + sp_digit* t4 = t + 8*5; + sp_digit* t5 = t + 10*5; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -23663,13 +23684,9 @@ sp_256_proj_point_dbl_5(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_5(t2, t2, p->x, p256_mod); @@ -23678,33 +23695,40 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_5(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_5(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_5(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_5(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_5(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_5(x, t1, t5, p256_mod); - sp_256_mont_dbl_5(t1, t3, p256_mod); - sp_256_mont_sub_5(x, x, t1, p256_mod); + sp_256_mont_sqr_5(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_5(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_5(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_5(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_5(t2, t2, t1, p256_mod); + sp_256_mont_dbl_5(t5, t3, p256_mod); + sp_256_mont_sub_5(x, t2, t5, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_5(t3, t3, x, p256_mod); + sp_256_mont_sub_5(t3, t3, x, p256_mod); sp_256_mont_mul_5(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_5(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_5(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 5; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 5; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 5; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_256_mont_mul_5(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_5(y, t3, t1, p256_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 5; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 5; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 5; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -23826,7 +23850,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_256_5(sp_point_256* r, @@ -24003,13 +24027,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -24080,8 +24106,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_5(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_5(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_win_add_sub_5(r, g, k, map, ct, heap); @@ -24102,10 +24128,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -24198,7 +24226,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -24209,7 +24237,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_256* point = NULL; + sp_point_256* point = NULL; sp_digit* k = NULL; #else sp_point_256 point[2]; @@ -25666,7 +25694,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -25688,7 +25716,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -25842,7 +25870,7 @@ sp_point_256* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -25850,7 +25878,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -26471,7 +26499,7 @@ sp_256_mont_sqr_n_order_5(t2, t3, 4); /* t = a^ff = t2 * t3 */ sp_256_mont_mul_order_5(t, t2, t3); - /* t3= a^ff00 = t ^ 2 ^ 8 */ + /* t2= a^ff00 = t ^ 2 ^ 8 */ sp_256_mont_sqr_n_order_5(t2, t, 8); /* t = a^ffff = t2 * t */ sp_256_mont_mul_order_5(t, t2, t); @@ -26488,7 +26516,11 @@ /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */ sp_256_mont_mul_order_5(t2, t2, t); /* t2= a^ffffffff00000000ffffffffffffffffbce6 */ - for (i=127; i>=112; i--) { + sp_256_mont_sqr_order_5(t2, t2); + sp_256_mont_mul_order_5(t2, t2, a); + sp_256_mont_sqr_n_order_5(t2, t2, 5); + sp_256_mont_mul_order_5(t2, t2, t3); + for (i=121; i>=112; i--) { sp_256_mont_sqr_order_5(t2, t2); if ((p256_order_low[i / 64] & ((sp_int_digit)1 << (i % 64))) != 0) { sp_256_mont_mul_order_5(t2, t2, a); @@ -26992,8 +27024,8 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && - sp_256_cmp_5(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && + (sp_256_cmp_5(u, v) >= 0))) { sp_256_sub_5(u, u, v); sp_256_norm_5(u); @@ -27083,7 +27115,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -27407,7 +27439,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -27435,19 +27467,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 5; + /* y^2 - x^3 - a.x = b */ sp_256_sqr_5(t1, point->y); (void)sp_256_mod_5(t1, t1, p256_mod); sp_256_sqr_5(t2, point->x); (void)sp_256_mod_5(t2, t2, p256_mod); sp_256_mul_5(t2, t2, point->x); (void)sp_256_mod_5(t2, t2, p256_mod); - (void)sp_256_sub_5(t2, p256_mod, t2); - sp_256_mont_add_5(t1, t1, t2, p256_mod); + sp_256_mont_sub_5(t1, t1, t2, p256_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_256_mont_add_5(t1, t1, point->x, p256_mod); sp_256_mont_add_5(t1, t1, point->x, p256_mod); sp_256_mont_add_5(t1, t1, point->x, p256_mod); + if (sp_256_cmp_5(t1, p256_b) != 0) { err = MP_VAL; } @@ -27461,7 +27495,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -28347,14 +28381,14 @@ { #if DIGIT_BIT == 55 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 54); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 54); } #elif DIGIT_BIT > 55 unsigned int i; @@ -28810,7 +28844,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_7(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -28824,7 +28858,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_7(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -28840,10 +28874,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_7(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_7(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_7(r, a, m, mp); for (; n > 1; n--) { @@ -29098,7 +29132,6 @@ sp_384_norm_7(r); } -#define sp_384_mont_sub_lower_7 sp_384_mont_sub_7 /* Shift number left one bit. * Bottom bit is lost. * @@ -29130,7 +29163,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_384_div2_7(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_384_mont_div2_7(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_384_cond_add_7(r, a, m, 0 - (a[0] & 1)); sp_384_norm_7(r); @@ -29181,7 +29215,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_7(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_7(t2, t2, p384_mod); + sp_384_mont_div2_7(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_7(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -29191,7 +29225,7 @@ /* X = X - Y */ sp_384_mont_sub_7(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_7(y, y, x, p384_mod); + sp_384_mont_sub_7(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_7(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -29214,7 +29248,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_7_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_7_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_7_ctx* ctx = (sp_384_proj_point_dbl_7_ctx*)sp_ctx->data; @@ -29288,7 +29323,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_7(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_7(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -29313,7 +29348,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_7(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_7(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -29374,12 +29409,12 @@ static void sp_384_proj_point_add_7(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*7; - sp_digit* t3 = t + 4*7; - sp_digit* t4 = t + 6*7; - sp_digit* t5 = t + 8*7; - sp_digit* t6 = t + 10*7; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*7; + sp_digit* t2 = t + 4*7; + sp_digit* t3 = t + 6*7; + sp_digit* t4 = t + 8*7; + sp_digit* t5 = t + 10*7; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_7(t1, q->z, p384_mod, p384_mp_mod); @@ -29401,17 +29436,9 @@ sp_384_proj_point_dbl_7(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_7(t2, t2, t1, p384_mod); @@ -29430,20 +29457,31 @@ sp_384_mont_dbl_7(t3, y, p384_mod); sp_384_mont_sub_7(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_7(y, y, x, p384_mod); + sp_384_mont_sub_7(y, y, x, p384_mod); sp_384_mont_mul_7(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_7(y, y, t5, p384_mod); - for (i = 0; i < 7; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 7; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 7; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 7; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 7; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 7; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -29489,12 +29527,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*7; - ctx->t3 = t + 4*7; - ctx->t4 = t + 6*7; - ctx->t5 = t + 8*7; - ctx->t6 = t + 10*7; + ctx->t6 = t; + ctx->t1 = t + 2*7; + ctx->t2 = t + 4*7; + ctx->t3 = t + 6*7; + ctx->t4 = t + 8*7; + ctx->t5 = t + 10*7; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -29601,7 +29639,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_7(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_7(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -29614,22 +29652,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 7; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 7; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 7; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 7; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 7; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 7; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -30063,8 +30107,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_384_mont_dbl_lower_7 sp_384_mont_dbl_7 -#define sp_384_mont_tpl_lower_7 sp_384_mont_tpl_7 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -30103,7 +30145,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_7(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_7(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_7(a, t1, p384_mod); + sp_384_mont_tpl_7(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_7(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_7(b, t1, x, p384_mod, p384_mp_mod); @@ -30112,8 +30154,8 @@ sp_384_mont_dbl_7(t2, b, p384_mod); sp_384_mont_sub_7(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_7(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_7(b, t2, p384_mod); + sp_384_mont_sub_7(t2, b, x, p384_mod); + sp_384_mont_dbl_7(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_7(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -30133,7 +30175,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_7(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_7(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_7(a, t1, p384_mod); + sp_384_mont_tpl_7(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_7(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_7(b, t1, x, p384_mod, p384_mp_mod); @@ -30142,8 +30184,8 @@ sp_384_mont_dbl_7(t2, b, p384_mod); sp_384_mont_sub_7(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_7(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_7(b, t2, p384_mod); + sp_384_mont_sub_7(t2, b, x, p384_mod); + sp_384_mont_dbl_7(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_7(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -30153,7 +30195,7 @@ sp_384_mont_sub_7(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_7(y, y, p384_mod); + sp_384_mont_div2_7(y, y, p384_mod); } /* Double the Montgomery form projective point p a number of times. @@ -30199,7 +30241,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_7(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_7(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_7(a, t1, p384_mod); + sp_384_mont_tpl_7(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_7(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_7(b, t1, x, p384_mod, p384_mp_mod); @@ -30209,8 +30251,8 @@ sp_384_mont_dbl_7(t2, b, p384_mod); sp_384_mont_sub_7(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_7(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_7(b, t2, p384_mod); + sp_384_mont_sub_7(t2, b, x, p384_mod); + sp_384_mont_dbl_7(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_7(r[j].z, z, y, p384_mod, p384_mp_mod); z = r[j].z; @@ -30224,7 +30266,7 @@ sp_384_mont_mul_7(y, b, a, p384_mod, p384_mp_mod); sp_384_mont_sub_7(y, y, t1, p384_mod); /* Y = Y/2 */ - sp_384_div2_7(r[j].y, y, p384_mod); + sp_384_mont_div2_7(r[j].y, y, p384_mod); r[j].infinity = 0; } } @@ -30298,8 +30340,8 @@ sp_384_mont_sub_7(xs, xs, t1, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_384_mont_sub_lower_7(ys, ya, xs, p384_mod); - sp_384_mont_sub_lower_7(ya, ya, xa, p384_mod); + sp_384_mont_sub_7(ys, ya, xs, p384_mod); + sp_384_mont_sub_7(ya, ya, xa, p384_mod); sp_384_mont_mul_7(ya, ya, t4, p384_mod, p384_mp_mod); sp_384_sub_7(t6, p384_mod, t6); sp_384_mont_mul_7(ys, ys, t6, p384_mod, p384_mp_mod); @@ -30383,7 +30425,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_point_33_7(sp_point_384* r, const sp_point_384* table, @@ -30479,7 +30521,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * + t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -30598,12 +30640,12 @@ static void sp_384_proj_point_add_qz1_7(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*7; - sp_digit* t3 = t + 4*7; - sp_digit* t4 = t + 6*7; - sp_digit* t5 = t + 8*7; - sp_digit* t6 = t + 10*7; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*7; + sp_digit* t6 = t + 4*7; + sp_digit* t1 = t + 6*7; + sp_digit* t4 = t + 8*7; + sp_digit* t5 = t + 10*7; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -30619,13 +30661,9 @@ sp_384_proj_point_dbl_7(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_7(t2, t2, p->x, p384_mod); @@ -30634,33 +30672,40 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_7(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_7(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_7(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_7(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_7(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_7(x, t1, t5, p384_mod); - sp_384_mont_dbl_7(t1, t3, p384_mod); - sp_384_mont_sub_7(x, x, t1, p384_mod); + sp_384_mont_sqr_7(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_7(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_7(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_7(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_7(t2, t2, t1, p384_mod); + sp_384_mont_dbl_7(t5, t3, p384_mod); + sp_384_mont_sub_7(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_7(t3, t3, x, p384_mod); + sp_384_mont_sub_7(t3, t3, x, p384_mod); sp_384_mont_mul_7(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_7(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_7(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 7; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 7; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 7; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_7(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_7(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 7; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 7; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 7; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -30782,7 +30827,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_256_7(sp_point_384* r, @@ -30967,13 +31012,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -31044,8 +31091,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_7(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_7(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_win_add_sub_7(r, g, k, map, ct, heap); @@ -31066,10 +31113,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -31162,7 +31211,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -31173,7 +31222,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_384* point = NULL; + sp_point_384* point = NULL; sp_digit* k = NULL; #else sp_point_384 point[2]; @@ -33140,7 +33189,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -33162,7 +33211,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -33316,7 +33365,7 @@ sp_point_384* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -33324,7 +33373,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -34445,8 +34494,8 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && - sp_384_cmp_7(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && + (sp_384_cmp_7(u, v) >= 0))) { sp_384_sub_7(u, u, v); sp_384_norm_7(u); @@ -34538,7 +34587,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -34862,7 +34911,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -34890,19 +34939,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 7; + /* y^2 - x^3 - a.x = b */ sp_384_sqr_7(t1, point->y); (void)sp_384_mod_7(t1, t1, p384_mod); sp_384_sqr_7(t2, point->x); (void)sp_384_mod_7(t2, t2, p384_mod); sp_384_mul_7(t2, t2, point->x); (void)sp_384_mod_7(t2, t2, p384_mod); - (void)sp_384_sub_7(t2, p384_mod, t2); - sp_384_mont_add_7(t1, t1, t2, p384_mod); + sp_384_mont_sub_7(t1, t1, t2, p384_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_384_mont_add_7(t1, t1, point->x, p384_mod); sp_384_mont_add_7(t1, t1, point->x, p384_mod); sp_384_mont_add_7(t1, t1, point->x, p384_mod); + if (sp_384_cmp_7(t1, p384_b) != 0) { err = MP_VAL; } @@ -34916,7 +34967,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -35910,14 +35961,14 @@ { #if DIGIT_BIT == 58 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 57); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 57); } #elif DIGIT_BIT > 58 unsigned int i; @@ -36335,7 +36386,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_mul_9(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -36349,7 +36400,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_sqr_9(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -36365,10 +36416,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_9(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_9(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_9(r, a, m, mp); for (; n > 1; n--) { @@ -36622,7 +36673,6 @@ sp_521_norm_9(r); } -#define sp_521_mont_sub_lower_9 sp_521_mont_sub_9 /* Shift number left one bit. * Bottom bit is lost. * @@ -36656,7 +36706,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_521_div2_9(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_521_mont_div2_9(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_521_cond_add_9(r, a, m, 0 - (a[0] & 1)); sp_521_norm_9(r); @@ -36707,7 +36758,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_9(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_9(t2, t2, p521_mod); + sp_521_mont_div2_9(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_9(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -36717,7 +36768,7 @@ /* X = X - Y */ sp_521_mont_sub_9(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_9(y, y, x, p521_mod); + sp_521_mont_sub_9(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_9(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -36740,7 +36791,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_9_ctx* ctx = (sp_521_proj_point_dbl_9_ctx*)sp_ctx->data; @@ -36814,7 +36866,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_9(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_9(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -36839,7 +36891,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -36901,12 +36953,12 @@ static void sp_521_proj_point_add_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*9; + sp_digit* t2 = t + 4*9; + sp_digit* t3 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_9(t1, q->z, p521_mod, p521_mp_mod); @@ -36928,17 +36980,9 @@ sp_521_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_9(t2, t2, t1, p521_mod); @@ -36957,20 +37001,31 @@ sp_521_mont_dbl_9(t3, y, p521_mod); sp_521_mont_sub_9(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_9(y, y, x, p521_mod); + sp_521_mont_sub_9(y, y, x, p521_mod); sp_521_mont_mul_9(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_9(y, y, t5, p521_mod); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -37016,12 +37071,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*9; - ctx->t3 = t + 4*9; - ctx->t4 = t + 6*9; - ctx->t5 = t + 8*9; - ctx->t6 = t + 10*9; + ctx->t6 = t; + ctx->t1 = t + 2*9; + ctx->t2 = t + 4*9; + ctx->t3 = t + 6*9; + ctx->t4 = t + 8*9; + ctx->t5 = t + 10*9; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -37128,7 +37183,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -37141,22 +37196,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -37471,8 +37532,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_521_mont_dbl_lower_9 sp_521_mont_dbl_9 -#define sp_521_mont_tpl_lower_9 sp_521_mont_tpl_9 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -37511,7 +37570,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -37520,8 +37579,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -37541,7 +37600,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -37550,8 +37609,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -37561,7 +37620,7 @@ sp_521_mont_sub_9(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_9(y, y, p521_mod); + sp_521_mont_div2_9(y, y, p521_mod); } /* Double the Montgomery form projective point p a number of times. @@ -37607,7 +37666,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -37617,8 +37676,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(r[j].z, z, y, p521_mod, p521_mp_mod); z = r[j].z; @@ -37632,7 +37691,7 @@ sp_521_mont_mul_9(y, b, a, p521_mod, p521_mp_mod); sp_521_mont_sub_9(y, y, t1, p521_mod); /* Y = Y/2 */ - sp_521_div2_9(r[j].y, y, p521_mod); + sp_521_mont_div2_9(r[j].y, y, p521_mod); r[j].infinity = 0; } } @@ -37706,8 +37765,8 @@ sp_521_mont_sub_9(xs, xs, t1, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_521_mont_sub_lower_9(ys, ya, xs, p521_mod); - sp_521_mont_sub_lower_9(ya, ya, xa, p521_mod); + sp_521_mont_sub_9(ys, ya, xs, p521_mod); + sp_521_mont_sub_9(ya, ya, xa, p521_mod); sp_521_mont_mul_9(ya, ya, t4, p521_mod, p521_mp_mod); sp_521_sub_9(t6, p521_mod, t6); sp_521_mont_mul_9(ys, ys, t6, p521_mod, p521_mp_mod); @@ -37791,7 +37850,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_point_33_9(sp_point_521* r, const sp_point_521* table, @@ -37899,7 +37958,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * + t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -38018,12 +38077,12 @@ static void sp_521_proj_point_add_qz1_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*9; + sp_digit* t6 = t + 4*9; + sp_digit* t1 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -38039,13 +38098,9 @@ sp_521_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_9(t2, t2, p->x, p521_mod); @@ -38054,33 +38109,40 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_9(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_9(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_9(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_9(x, t1, t5, p521_mod); - sp_521_mont_dbl_9(t1, t3, p521_mod); - sp_521_mont_sub_9(x, x, t1, p521_mod); + sp_521_mont_sqr_9(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_9(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_9(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_9(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_9(t2, t2, t1, p521_mod); + sp_521_mont_dbl_9(t5, t3, p521_mod); + sp_521_mont_sub_9(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_9(t3, t3, x, p521_mod); + sp_521_mont_sub_9(t3, t3, x, p521_mod); sp_521_mont_mul_9(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_9(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_9(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_9(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -38202,7 +38264,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_256_9(sp_point_521* r, @@ -38395,13 +38457,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -38472,8 +38536,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_win_add_sub_9(r, g, k, map, ct, heap); @@ -38494,10 +38558,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -38590,7 +38656,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -38601,7 +38667,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_521* point = NULL; + sp_point_521* point = NULL; sp_digit* k = NULL; #else sp_point_521 point[2]; @@ -40568,7 +40634,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -40590,7 +40656,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -40745,7 +40811,7 @@ sp_point_521* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -40753,7 +40819,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -41905,8 +41971,8 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && - sp_521_cmp_9(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && + (sp_521_cmp_9(u, v) >= 0))) { sp_521_sub_9(u, u, v); sp_521_norm_9(u); @@ -42000,7 +42066,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -42333,7 +42399,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -42361,19 +42427,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 9; + /* y^2 - x^3 - a.x = b */ sp_521_sqr_9(t1, point->y); (void)sp_521_mod_9(t1, t1, p521_mod); sp_521_sqr_9(t2, point->x); (void)sp_521_mod_9(t2, t2, p521_mod); sp_521_mul_9(t2, t2, point->x); (void)sp_521_mod_9(t2, t2, p521_mod); - (void)sp_521_sub_9(t2, p521_mod, t2); - sp_521_mont_add_9(t1, t1, t2, p521_mod); + sp_521_mont_sub_9(t1, t1, t2, p521_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_521_mont_add_9(t1, t1, point->x, p521_mod); sp_521_mont_add_9(t1, t1, point->x, p521_mod); sp_521_mont_add_9(t1, t1, point->x, p521_mod); + if (sp_521_cmp_9(t1, p521_b) != 0) { err = MP_VAL; } @@ -42387,7 +42455,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -43886,14 +43954,14 @@ { #if DIGIT_BIT == 57 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 56); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 56); } #elif DIGIT_BIT > 57 unsigned int i; @@ -44297,7 +44365,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_18(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -44311,7 +44379,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_18(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -44492,7 +44560,6 @@ sp_1024_norm_18(r); } -#define sp_1024_mont_sub_lower_18 sp_1024_mont_sub_18 /* Shift number left one bit. * Bottom bit is lost. * @@ -44535,7 +44602,8 @@ * a Number to divide. * m Modulus (prime). */ -static void sp_1024_div2_18(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_1024_mont_div2_18(sp_digit* r, const sp_digit* a, + const sp_digit* m) { sp_1024_cond_add_18(r, a, m, 0 - (a[0] & 1)); sp_1024_norm_18(r); @@ -44586,7 +44654,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_18(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_18(t2, t2, p1024_mod); + sp_1024_mont_div2_18(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_18(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -44596,7 +44664,7 @@ /* X = X - Y */ sp_1024_mont_sub_18(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_18(y, y, x, p1024_mod); + sp_1024_mont_sub_18(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_18(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -44619,7 +44687,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_18_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_18_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_18_ctx* ctx = (sp_1024_proj_point_dbl_18_ctx*)sp_ctx->data; @@ -44693,7 +44762,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_18(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_18(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -44718,7 +44787,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_18(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_18(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -44784,12 +44853,12 @@ static void sp_1024_proj_point_add_18(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*18; - sp_digit* t3 = t + 4*18; - sp_digit* t4 = t + 6*18; - sp_digit* t5 = t + 8*18; - sp_digit* t6 = t + 10*18; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*18; + sp_digit* t2 = t + 4*18; + sp_digit* t3 = t + 6*18; + sp_digit* t4 = t + 8*18; + sp_digit* t5 = t + 10*18; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_18(t1, q->z, p1024_mod, p1024_mp_mod); @@ -44811,17 +44880,9 @@ sp_1024_proj_point_dbl_18(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_18(t2, t2, t1, p1024_mod); @@ -44840,20 +44901,31 @@ sp_1024_mont_dbl_18(t3, y, p1024_mod); sp_1024_mont_sub_18(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_18(y, y, x, p1024_mod); + sp_1024_mont_sub_18(y, y, x, p1024_mod); sp_1024_mont_mul_18(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_18(y, y, t5, p1024_mod); - for (i = 0; i < 18; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 18; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 18; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 18; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 18; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 18; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -44899,12 +44971,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*18; - ctx->t3 = t + 4*18; - ctx->t4 = t + 6*18; - ctx->t5 = t + 8*18; - ctx->t6 = t + 10*18; + ctx->t6 = t; + ctx->t1 = t + 2*18; + ctx->t2 = t + 4*18; + ctx->t3 = t + 6*18; + ctx->t4 = t + 8*18; + ctx->t5 = t + 10*18; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -45011,7 +45083,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_18(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_18(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -45024,22 +45096,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 18; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 18; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 18; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 18; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 18; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 18; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -45354,8 +45432,6 @@ #endif /* WOLFSSL_SP_SMALL */ } -#define sp_1024_mont_dbl_lower_18 sp_1024_mont_dbl_18 -#define sp_1024_mont_tpl_lower_18 sp_1024_mont_tpl_18 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -45394,7 +45470,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_18(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_18(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_18(a, t1, p1024_mod); + sp_1024_mont_tpl_18(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_18(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_18(b, t1, x, p1024_mod, p1024_mp_mod); @@ -45403,8 +45479,8 @@ sp_1024_mont_dbl_18(t2, b, p1024_mod); sp_1024_mont_sub_18(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_18(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_18(b, t2, p1024_mod); + sp_1024_mont_sub_18(t2, b, x, p1024_mod); + sp_1024_mont_dbl_18(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_18(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -45424,7 +45500,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_18(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_18(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_18(a, t1, p1024_mod); + sp_1024_mont_tpl_18(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_18(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_18(b, t1, x, p1024_mod, p1024_mp_mod); @@ -45433,8 +45509,8 @@ sp_1024_mont_dbl_18(t2, b, p1024_mod); sp_1024_mont_sub_18(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_18(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_18(b, t2, p1024_mod); + sp_1024_mont_sub_18(t2, b, x, p1024_mod); + sp_1024_mont_dbl_18(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_18(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -45444,7 +45520,7 @@ sp_1024_mont_sub_18(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_18(y, y, p1024_mod); + sp_1024_mont_div2_18(y, y, p1024_mod); } /* Double the Montgomery form projective point p a number of times. @@ -45490,7 +45566,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_18(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_18(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_18(a, t1, p1024_mod); + sp_1024_mont_tpl_18(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_18(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_18(b, t1, x, p1024_mod, p1024_mp_mod); @@ -45500,8 +45576,8 @@ sp_1024_mont_dbl_18(t2, b, p1024_mod); sp_1024_mont_sub_18(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_18(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_18(b, t2, p1024_mod); + sp_1024_mont_sub_18(t2, b, x, p1024_mod); + sp_1024_mont_dbl_18(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_18(r[j].z, z, y, p1024_mod, p1024_mp_mod); z = r[j].z; @@ -45515,7 +45591,7 @@ sp_1024_mont_mul_18(y, b, a, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_18(y, y, t1, p1024_mod); /* Y = Y/2 */ - sp_1024_div2_18(r[j].y, y, p1024_mod); + sp_1024_mont_div2_18(r[j].y, y, p1024_mod); r[j].infinity = 0; } } @@ -45589,8 +45665,8 @@ sp_1024_mont_sub_18(xs, xs, t1, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_1024_mont_sub_lower_18(ys, ya, xs, p1024_mod); - sp_1024_mont_sub_lower_18(ya, ya, xa, p1024_mod); + sp_1024_mont_sub_18(ys, ya, xs, p1024_mod); + sp_1024_mont_sub_18(ya, ya, xa, p1024_mod); sp_1024_mont_mul_18(ya, ya, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_18(t6, p1024_mod, t6, p1024_mod); sp_1024_mont_mul_18(ys, ys, t6, p1024_mod, p1024_mp_mod); @@ -45718,7 +45794,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * + t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (65+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -45841,12 +45917,12 @@ static void sp_1024_proj_point_add_qz1_18(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*18; - sp_digit* t3 = t + 4*18; - sp_digit* t4 = t + 6*18; - sp_digit* t5 = t + 8*18; - sp_digit* t6 = t + 10*18; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*18; + sp_digit* t6 = t + 4*18; + sp_digit* t1 = t + 6*18; + sp_digit* t4 = t + 8*18; + sp_digit* t5 = t + 10*18; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -45862,13 +45938,9 @@ sp_1024_proj_point_dbl_18(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_18(t2, t2, p->x, p1024_mod); @@ -45877,33 +45949,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_18(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_18(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_18(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_18(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_18(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_18(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_18(t1, t3, p1024_mod); - sp_1024_mont_sub_18(x, x, t1, p1024_mod); + sp_1024_mont_sqr_18(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_18(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_18(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_18(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_18(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_18(t5, t3, p1024_mod); + sp_1024_mont_sub_18(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_18(t3, t3, x, p1024_mod); + sp_1024_mont_sub_18(t3, t3, x, p1024_mod); sp_1024_mont_mul_18(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_18(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_18(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 18; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 18; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 18; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_18(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_18(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 18; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 18; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 18; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -46149,13 +46228,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -46226,8 +46307,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_18(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_18(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_win_add_sub_18(r, g, k, map, ct, heap); @@ -46248,10 +46329,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -49774,7 +49857,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -49796,7 +49879,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, + point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -50012,7 +50095,7 @@ return err; } -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -50038,7 +50121,7 @@ sp_1024_mont_add_18(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -51803,7 +51886,7 @@ } #endif /* WOLFSSL_SP_SMALL */ -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -51918,7 +52001,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_18(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_18(t1, ty, p1024_mod); + sp_1024_mont_div2_18(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_18(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -51938,7 +52021,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_18(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_18(t1, t1, p1024_mod); + sp_1024_mont_div2_18(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_18(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -52356,7 +52439,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_18(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_18(t1, ty, p1024_mod); + sp_1024_mont_div2_18(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_18(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -52394,7 +52477,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_18(p->y, p->y, p1024_mod); + sp_1024_mont_div2_18(p->y, p->y, p1024_mod); } /* Operations to perform based on order - 1. @@ -53202,7 +53285,7 @@ } } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -53231,19 +53314,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 18; + /* y^2 - x^3 - a.x = b */ sp_1024_sqr_18(t1, point->y); (void)sp_1024_mod_18(t1, t1, p1024_mod); sp_1024_sqr_18(t2, point->x); (void)sp_1024_mod_18(t2, t2, p1024_mod); sp_1024_mul_18(t2, t2, point->x); (void)sp_1024_mod_18(t2, t2, p1024_mod); - (void)sp_1024_sub_18(t2, p1024_mod, t2); - sp_1024_mont_add_18(t1, t1, t2, p1024_mod); + sp_1024_mont_sub_18(t1, t1, t2, p1024_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_1024_mont_add_18(t1, t1, point->x, p1024_mod); sp_1024_mont_add_18(t1, t1, point->x, p1024_mod); sp_1024_mont_add_18(t1, t1, point->x, p1024_mod); + n = sp_1024_cmp_18(t1, p1024_mod); sp_1024_cond_sub_18(t1, t1, p1024_mod, ~(n >> 56)); sp_1024_norm_18(t1); @@ -53260,7 +53345,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_cortexm.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_cortexm.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_cortexm.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_cortexm.c 2024-08-03 07:30:00.000000000 +0000 @@ -55,6 +55,7 @@ #ifdef __IAR_SYSTEMS_ICC__ #define __asm__ asm #define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG #endif /* __IAR_SYSTEMS_ICC__ */ #ifdef __KEIL__ #define __asm__ __asm @@ -127,14 +128,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -239,616 +240,596 @@ #define sp_2048_norm_64(a) #ifndef WOLFSSL_SP_SMALL +#ifdef WOLFSSL_SP_NO_UMAAL /* Multiply a and b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[8]; - sp_digit* tmp = tmp_arr; - - __asm__ __volatile__ ( +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x24\n\t" + "STR %[r], [sp, #32]\n\t" + "MOV %[r], #0x0\n\t" + "LDR r12, [%[a]]\n\t" /* A[0] * B[0] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "mov r5, #0\n\t" - "str r3, [%[tmp], #0]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[b]]\n\t" + "UMULL r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "UMULL r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "UMULL r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "UMULL r9, r10, r12, lr\n\t" + "STR r3, [sp]\n\t" /* A[0] * B[1] */ - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r8\n\t" + "LDR lr, [%[b], #4]\n\t" + "MOV r11, %[r]\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[0] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[0] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[0] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r3, %[r], #0x0\n\t" + "UMLAL r10, r3, r12, lr\n\t" /* A[1] * B[0] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #4]\n\t" - "mov r4, #0\n\t" - /* A[0] * B[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR r12, [%[a], #4]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "STR r4, [sp, #4]\n\t" + "ADDS r5, r5, r11\n\t" /* A[1] * B[1] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[0] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #8]\n\t" - "mov r5, #0\n\t" - /* A[0] * B[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[1] * B[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[1] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[0] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[tmp], #12]\n\t" - "mov r3, #0\n\t" - /* A[0] * B[4] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[1] * B[3] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[2] * B[2] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[3] * B[1] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[4] * B[0] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #16]\n\t" - "mov r4, #0\n\t" - /* A[0] * B[5] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" /* A[1] * B[4] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[3] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[2] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[1] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[0] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #20]\n\t" - "mov r5, #0\n\t" - /* A[0] * B[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" /* A[1] * B[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[3] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[2] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[1] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[0] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[tmp], #24]\n\t" - "mov r3, #0\n\t" - /* A[0] * B[7] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" /* A[1] * B[6] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[2] * B[5] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[3] * B[4] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[4] * B[3] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[5] * B[2] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[6] * B[1] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[7] * B[0] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #28]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[1] * B[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r4, %[r], #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "LDR r12, [%[a], #8]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "STR r5, [sp, #8]\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[2] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[2] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[2] * B[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[4] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[3] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[2] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[1] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #32]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[2] * B[7] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r5, %[r], #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "LDR r12, [%[a], #12]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[3] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[3] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[3] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[3] * B[6] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[5] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[4] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[3] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[7] * B[2] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #36]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[3] * B[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r6, %[r], #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "LDR r12, [%[a], #16]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[4] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[4] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[4] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[4] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[4] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[4] * B[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[5] * B[5] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[6] * B[4] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[7] * B[3] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #40]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[4] * B[7] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r7, %[r], #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "LDR r12, [%[a], #20]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[5] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[5] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[5] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[5] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[5] * B[6] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[5] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[4] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #44]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[5] * B[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r8, %[r], #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "LDR r12, [%[a], #24]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[6] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[6] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[6] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[6] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[6] * B[6] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[7] * B[5] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #48]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" /* A[6] * B[7] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r9, %[r], #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "LDR r12, [%[a], #28]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[7] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[7] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[7] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[7] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[7] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" /* A[7] * B[6] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #52]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" /* A[7] * B[7] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "str r5, [%[r], #56]\n\t" - "str r3, [%[r], #60]\n\t" - /* Transfer tmp to r */ - "ldr r3, [%[tmp], #0]\n\t" - "ldr r4, [%[tmp], #4]\n\t" - "ldr r5, [%[tmp], #8]\n\t" - "ldr r6, [%[tmp], #12]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[tmp], #16]\n\t" - "ldr r4, [%[tmp], #20]\n\t" - "ldr r5, [%[tmp], #24]\n\t" - "ldr r6, [%[tmp], #28]\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r10, %[r], #0x0\n\t" + "UMLAL r9, r10, r12, lr\n\t" + "LDR %[r], [sp, #32]\n\t" + "ADD %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "SUB %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD sp, sp, #0x24\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } -/* Add b to a into r. (r = a + b) +#else +/* Multiply a and b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +SP_NOINLINE static void sp_2048_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x2c\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "STRD %[r], %[a], [sp, #36]\n\t" +#else + "STR %[r], [sp, #36]\n\t" + "STR %[a], [sp, #40]\n\t" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[b]\n\t" + "LDM %[a], {r0, r1, r2, r3}\n\t" + "LDM lr!, {r4, r5, r6}\n\t" + "UMULL r10, r11, r0, r4\n\t" + "UMULL r12, r7, r1, r4\n\t" + "UMAAL r11, r12, r0, r5\n\t" + "UMULL r8, r9, r2, r4\n\t" + "UMAAL r12, r8, r1, r5\n\t" + "UMAAL r12, r7, r0, r6\n\t" + "UMAAL r8, r9, r3, r4\n\t" + "STM sp, {r10, r11, r12}\n\t" + "UMAAL r7, r8, r2, r5\n\t" + "LDM lr!, {r4}\n\t" + "UMULL r10, r11, r1, r6\n\t" + "UMAAL r8, r9, r2, r6\n\t" + "UMAAL r7, r10, r0, r4\n\t" + "UMAAL r8, r11, r3, r5\n\t" + "STR r7, [sp, #12]\n\t" + "UMAAL r8, r10, r1, r4\n\t" + "UMAAL r9, r11, r3, r6\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "UMAAL r10, r11, r3, r4\n\t" + "LDM lr, {r4, r5, r6, r7}\n\t" + "MOV r12, #0x0\n\t" + "UMLAL r8, r12, r0, r4\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r10, r12, r2, r4\n\t" + "UMAAL r11, r12, r3, r4\n\t" + "MOV r4, #0x0\n\t" + "UMLAL r9, r4, r0, r5\n\t" + "UMAAL r10, r4, r1, r5\n\t" + "UMAAL r11, r4, r2, r5\n\t" + "UMAAL r12, r4, r3, r5\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r0, r6\n\t" + "UMAAL r11, r5, r1, r6\n\t" + "UMAAL r12, r5, r2, r6\n\t" + "UMAAL r4, r5, r3, r6\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r11, r6, r0, r7\n\t" + "LDR r0, [sp, #40]\n\t" + "UMAAL r12, r6, r1, r7\n\t" + "ADD r0, r0, #0x10\n\t" + "UMAAL r4, r6, r2, r7\n\t" + "SUB lr, lr, #0x10\n\t" + "UMAAL r5, r6, r3, r7\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "STR r6, [sp, #32]\n\t" + "LDM lr!, {r6}\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r8, r7, r0, r6\n\t" + "UMAAL r9, r7, r1, r6\n\t" + "STR r8, [sp, #16]\n\t" + "UMAAL r10, r7, r2, r6\n\t" + "UMAAL r11, r7, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r8, #0x0\n\t" + "UMLAL r9, r8, r0, r6\n\t" + "UMAAL r10, r8, r1, r6\n\t" + "STR r9, [sp, #20]\n\t" + "UMAAL r11, r8, r2, r6\n\t" + "UMAAL r12, r8, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r10, r9, r0, r6\n\t" + "UMAAL r11, r9, r1, r6\n\t" + "STR r10, [sp, #24]\n\t" + "UMAAL r12, r9, r2, r6\n\t" + "UMAAL r4, r9, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r10, #0x0\n\t" + "UMLAL r11, r10, r0, r6\n\t" + "UMAAL r12, r10, r1, r6\n\t" + "STR r11, [sp, #28]\n\t" + "UMAAL r4, r10, r2, r6\n\t" + "UMAAL r5, r10, r3, r6\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r12, r7, r0, r11\n\t" + "UMAAL r4, r7, r1, r11\n\t" + "LDR r6, [sp, #32]\n\t" + "UMAAL r5, r7, r2, r11\n\t" + "UMAAL r6, r7, r3, r11\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r4, r8, r0, r11\n\t" + "UMAAL r5, r8, r1, r11\n\t" + "UMAAL r6, r8, r2, r11\n\t" + "UMAAL r7, r8, r3, r11\n\t" + "LDM lr, {r11, lr}\n\t" + "UMAAL r5, r9, r0, r11\n\t" + "UMAAL r6, r10, r0, lr\n\t" + "UMAAL r6, r9, r1, r11\n\t" + "UMAAL r7, r10, r1, lr\n\t" + "UMAAL r7, r9, r2, r11\n\t" + "UMAAL r8, r10, r2, lr\n\t" + "UMAAL r8, r9, r3, r11\n\t" + "UMAAL r9, r10, r3, lr\n\t" + "MOV r3, r12\n\t" + "LDR lr, [sp, #36]\n\t" + "ADD lr, lr, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "SUB lr, lr, #0x20\n\t" + "LDM sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD sp, sp, #0x2c\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc" ); - - return c; } -/* Sub b from a into r. (r = a - b) +#endif /* WOLFSSL_SP_NO_UMAAL */ +/* Add b to a into r. (r = a + b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_in_place_16(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_add_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +/* Sub b from a into a. (a -= b) + * + * a A single precision integer and result. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_in_place_16(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_in_place_16(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -857,60 +838,54 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_add_16(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* AND m into each word of a and store in r. @@ -978,105 +953,85 @@ (void)sp_2048_add_8(r + 24, r + 24, a1); } -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) * - * r A single precision integer. - * a A single precision integer. + * a A single precision integer and result. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -1085,100 +1040,82 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* AND m into each word of a and store in r. @@ -1250,185 +1187,141 @@ (void)sp_2048_add_16(r + 48, r + 48, a1); } -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) * - * r A single precision integer. - * a A single precision integer. + * a A single precision integer and result. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_in_place_64(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -1437,180 +1330,138 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* AND m into each word of a and store in r. @@ -1682,396 +1533,412 @@ (void)sp_2048_add_32(r + 96, r + 96, a1); } +#ifdef WOLFSSL_SP_NO_UMAAL /* Square a and put result in r. (r = a * a) * * r A single precision integer. * a A single precision integer. */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p) +#else SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[8]; - sp_digit* tmp = tmp_arr; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - /* A[0] * A[0] */ - "ldr r6, [%[a], #0]\n\t" - "umull r3, r4, r6, r6\n\t" - "mov r5, #0\n\t" - "str r3, [%[tmp], #0]\n\t" - "mov r3, #0\n\t" + "SUB sp, sp, #0x44\n\t" + "STR %[r], [sp, #64]\n\t" + "MOV %[r], #0x0\n\t" + "LDR r12, [%[a]]\n\t" /* A[0] * A[1] */ - "ldr r8, [%[a], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #4]\n\t" - "mov r4, #0\n\t" - /* A[0] * A[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * A[1] */ - "ldr r6, [%[a], #4]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #8]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[a], #4]\n\t" + "UMULL r4, r5, r12, lr\n\t" /* A[0] * A[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[1] * A[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[tmp], #12]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[a], #12]\n\t" + "UMULL r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "UMULL r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "UMULL r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "LDR lr, [%[a], #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[0] * A[4] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #16]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[0] * A[6] */ + "LDR lr, [%[a], #24]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + "ADCS r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + "STR r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "LDR r12, [%[a], #4]\n\t" + "LDR lr, [%[a], #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" /* A[1] * A[3] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[2] */ - "ldr r6, [%[a], #8]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[tmp], #16]\n\t" - "mov r4, #0\n\t" - /* A[0] * A[5] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" /* A[1] * A[4] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[3] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r5, r5, r9\n\t" - "adcs r3, r3, r10\n\t" - "adc r4, r4, r11\n\t" - "str r5, [%[tmp], #20]\n\t" - "mov r5, #0\n\t" - /* A[0] * A[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" /* A[1] * A[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[3] */ - "ldr r6, [%[a], #12]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[tmp], #24]\n\t" - "mov r3, #0\n\t" - /* A[0] * A[7] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" /* A[1] * A[6] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[5] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[4] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[tmp], #28]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[1] * A[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r4, %[r], #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "LDR r12, [%[a], #8]\n\t" + "LDR lr, [%[a], #12]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * A[4] */ + "LDR lr, [%[a], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[2] * A[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[4] * A[4] */ - "ldr r6, [%[a], #16]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r5, r5, r9\n\t" - "adcs r3, r3, r10\n\t" - "adc r4, r4, r11\n\t" - "str r5, [%[r], #32]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[2] * A[7] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r5, %[r], #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "LDR r12, [%[a], #12]\n\t" + "LDR lr, [%[a], #16]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[3] * A[6] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[4] * A[5] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[r], #36]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[3] * A[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r6, %[r], #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "LDR r12, [%[a], #16]\n\t" + "LDR lr, [%[a], #20]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[4] * A[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[5] * A[5] */ - "ldr r6, [%[a], #20]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[r], #40]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[4] * A[7] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r7, %[r], #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" /* A[5] * A[6] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #44]\n\t" - "mov r5, #0\n\t" + "LDR r12, [%[a], #20]\n\t" + "LDR lr, [%[a], #24]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[5] * A[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * A[6] */ - "ldr r6, [%[a], #24]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #48]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r8, %[r], #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" /* A[6] * A[7] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #52]\n\t" - "mov r4, #0\n\t" + "LDR r12, [%[a], #24]\n\t" + "LDR lr, [%[a], #28]\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "STM lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADCS r3, r3, r3\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADC r10, %[r], #0x0\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "MOV lr, sp\n\t" + /* A[0] * A[0] */ + "LDR r12, [%[a]]\n\t" + "UMULL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[1] * A[1] */ + "LDR r12, [%[a], #4]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * A[2] */ + "LDR r12, [%[a], #8]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * A[3] */ + "LDR r12, [%[a], #12]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, r12\n\t" + "ADDS r10, r10, r11\n\t" + "STM lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "LDR r12, [%[a], #16]\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * A[5] */ + "LDR r12, [%[a], #20]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * A[6] */ + "LDR r12, [%[a], #24]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" /* A[7] * A[7] */ - "ldr r6, [%[a], #28]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "str r5, [%[r], #56]\n\t" - "str r3, [%[r], #60]\n\t" - /* Transfer tmp to r */ - "ldr r3, [%[tmp], #0]\n\t" - "ldr r4, [%[tmp], #4]\n\t" - "ldr r5, [%[tmp], #8]\n\t" - "ldr r6, [%[tmp], #12]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[tmp], #16]\n\t" - "ldr r4, [%[tmp], #20]\n\t" - "ldr r5, [%[tmp], #24]\n\t" - "ldr r6, [%[tmp], #28]\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r9, r10, r12, r12\n\t" + "LDR %[r], [sp, #64]\n\t" + "ADD %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "SUB %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +/* Square a and put result in r. (r = a * a) + * + * r A single precision integer. + * a A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r_p, const sp_digit* a_p) +#else +SP_NOINLINE static void sp_2048_sqr_8(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x20\n\t" + "STR %[r], [sp, #28]\n\t" + "LDM %[a], {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + "UMULL r9, r10, r0, r0\n\t" + "UMULL r11, r12, r0, r1\n\t" + "ADDS r11, r11, r11\n\t" + "MOV lr, #0x0\n\t" + "UMAAL r10, r11, lr, lr\n\t" + "STM sp, {r9, r10}\n\t" + "MOV r8, lr\n\t" + "UMAAL r8, r12, r0, r2\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r8, r11, r1, r1\n\t" + "UMULL r9, r10, r0, r3\n\t" + "UMAAL r9, r12, r1, r2\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STRD r8, r9, [sp, #8]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r10, r0, r4\n\t" + "UMAAL r9, r12, r1, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r2, r2\n\t" + "STR r9, [sp, #16]\n\t" + "UMULL r9, r8, r0, r5\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r9, r10, r2, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STR r9, [sp, #20]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r8, r0, r6\n\t" + "UMAAL r9, r12, r1, r5\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r3, r3\n\t" + "STR r9, [sp, #24]\n\t" + "UMULL r0, r9, r0, r7\n\t" + "UMAAL r0, r8, r1, r6\n\t" + "UMAAL r0, r12, r2, r5\n\t" + "UMAAL r0, r10, r3, r4\n\t" + "ADCS r0, r0, r0\n\t" + "UMAAL r0, r11, lr, lr\n\t" + /* R[7] = r0 */ + "UMAAL r9, r8, r1, r7\n\t" + "UMAAL r9, r10, r2, r6\n\t" + "UMAAL r12, r9, r3, r5\n\t" + "ADCS r12, r12, r12\n\t" + "UMAAL r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "UMAAL r9, r8, r2, r7\n\t" + "UMAAL r10, r9, r3, r6\n\t" + "MOV r2, lr\n\t" + "UMAAL r10, r2, r4, r5\n\t" + "ADCS r10, r10, r10\n\t" + "UMAAL r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "UMAAL r2, r8, r3, r7\n\t" + "UMAAL r2, r9, r4, r6\n\t" + "ADCS r3, r2, r2\n\t" + "UMAAL r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "MOV r1, lr\n\t" + "UMAAL r1, r8, r4, r7\n\t" + "UMAAL r1, r9, r5, r6\n\t" + "ADCS r4, r1, r1\n\t" + "UMAAL r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "UMAAL r8, r9, r5, r7\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "MOV r5, lr\n\t" + "UMAAL r5, r9, r6, r7\n\t" + "ADCS r5, r5, r5\n\t" + "UMAAL r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r5, r7, r7\n\t" + "ADCS r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + "LDR lr, [sp, #28]\n\t" + "ADD lr, lr, #0x1c\n\t" + "STM lr!, {r0, r12}\n\t" + "STM lr!, {r11}\n\t" + "STM lr!, {r10}\n\t" + "STM lr!, {r3, r4, r8, r9}\n\t" + "STM lr!, {r7}\n\t" + "SUB lr, lr, #0x40\n\t" + "LDM sp, {r0, r1, r2, r3, r4, r5, r6}\n\t" + "STM lr, {r0, r1, r2, r3, r4, r5, r6}\n\t" + "ADD sp, sp, #0x20\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); } +#endif /* WOLFSSL_SP_NO_UMAAL */ /* Sub b from a into r. (r = a - b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Square a and put result in r. (r = a * a) @@ -2116,59 +1983,53 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_16(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_16(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Square a and put result in r. (r = a * a) @@ -2213,99 +2074,81 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Square a and put result in r. (r = a * a) @@ -2352,39 +2195,45 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_add_64(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #256\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x100\n\t" + "\n" + "L_sp_2048_add_64_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_2048_add_64_word%=\n\t" +#else + "BNE.N L_sp_2048_add_64_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -2394,39 +2243,43 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_in_place_64(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_in_place_64(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_in_place_64(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #256\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x100\n\t" + "\n" + "L_sp_2048_sub_in_pkace_64_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_2048_sub_in_pkace_64_word%=\n\t" +#else + "BNE.N L_sp_2048_sub_in_pkace_64_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #endif /* WOLFSSL_SP_SMALL */ @@ -2437,86 +2290,99 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_2048_mul_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_mul_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_2048_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[64 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #252\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x200\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_2048_mul_64_outer%=:\n\t" + "SUBS r3, r5, #0xfc\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_2048_mul_64_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_mul_64_inner_done%=\n\t" +#else + "BGT.N L_sp_2048_mul_64_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mul_64_inner%=\n\t" +#else + "BLT.N L_sp_2048_mul_64_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_2048_mul_64_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x1f4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_2048_mul_64_outer%=\n\t" +#else + "BLE.N L_sp_2048_mul_64_outer%=\n\t" +#endif + "LDR lr, [%[a], #252]\n\t" + "LDR r11, [%[b], #252]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_2048_mul_64_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_mul_64_store%=\n\t" +#else + "BGT.N L_sp_2048_mul_64_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Square a and put result in r. (r = a * a) @@ -2524,129 +2390,91 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_sqr_64(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_2048_sqr_64(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #252\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #1\n\t" - "lsl r3, r3, #8\n\t" - "add r3, r3, #252\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "add sp, sp, r6\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x200\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_2048_sqr_64_outer%=:\n\t" + "SUBS r3, r5, #0xfc\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_2048_sqr_64_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_sqr_64_inner_done%=\n\t" +#else + "BGT.N L_sp_2048_sqr_64_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_sqr_64_inner%=\n\t" +#else + "BLT.N L_sp_2048_sqr_64_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_2048_sqr_64_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x1f4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_2048_sqr_64_outer%=\n\t" +#else + "BLE.N L_sp_2048_sqr_64_outer%=\n\t" +#endif + "LDR lr, [%[a], #252]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_2048_sqr_64_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_sqr_64_store%=\n\t" +#else + "BGT.N L_sp_2048_sqr_64_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -2676,39 +2504,45 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #128\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x80\n\t" + "\n" + "L_sp_2048_add_32_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_2048_add_32_word%=\n\t" +#else + "BNE.N L_sp_2048_add_32_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -2718,39 +2552,43 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_in_place_32(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_in_place_32(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #128\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x80\n\t" + "\n" + "L_sp_2048_sub_in_pkace_32_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_2048_sub_in_pkace_32_word%=\n\t" +#else + "BNE.N L_sp_2048_sub_in_pkace_32_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #endif /* WOLFSSL_SP_SMALL */ @@ -2761,83 +2599,99 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_2048_mul_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_2048_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[32 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #128\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #124\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x100\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_2048_mul_32_outer%=:\n\t" + "SUBS r3, r5, #0x7c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_2048_mul_32_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_mul_32_inner_done%=\n\t" +#else + "BGT.N L_sp_2048_mul_32_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mul_32_inner%=\n\t" +#else + "BLT.N L_sp_2048_mul_32_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_2048_mul_32_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0xf4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_2048_mul_32_outer%=\n\t" +#else + "BLE.N L_sp_2048_mul_32_outer%=\n\t" +#endif + "LDR lr, [%[a], #124]\n\t" + "LDR r11, [%[b], #124]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_2048_mul_32_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_mul_32_store%=\n\t" +#else + "BGT.N L_sp_2048_mul_32_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Square a and put result in r. (r = a * a) @@ -2845,131 +2699,98 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_sqr_32(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_2048_sqr_32(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #124\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #128\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #252\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add sp, sp, r6\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x100\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_2048_sqr_32_outer%=:\n\t" + "SUBS r3, r5, #0x7c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_2048_sqr_32_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_sqr_32_inner_done%=\n\t" +#else + "BGT.N L_sp_2048_sqr_32_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_sqr_32_inner%=\n\t" +#else + "BLT.N L_sp_2048_sqr_32_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_2048_sqr_32_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0xf4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_2048_sqr_32_outer%=\n\t" +#else + "BLE.N L_sp_2048_sqr_32_outer%=\n\t" +#endif + "LDR lr, [%[a], #124]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_2048_sqr_32_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_2048_sqr_32_store%=\n\t" +#else + "BGT.N L_sp_2048_sqr_32_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -2989,48 +2810,406 @@ *rho = (sp_digit)0 - x; } +#ifdef WOLFSSL_SP_SMALL /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_2048_mul_d_64(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_2048_mul_d_64(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #256\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_2048_mul_d_64_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x100\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mul_d_64_word%=\n\t" +#else + "BLT.N L_sp_2048_mul_d_64_word%=\n\t" +#endif + "STR r3, [%[r], #256]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); } +#else +/* Mul a by digit b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision digit. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_mul_d_64(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_2048_mul_d_64(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* A[0] * B */ + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[12] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[13] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[14] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[15] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[16] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[17] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[18] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[19] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[20] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[21] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[22] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[23] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[24] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[25] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[26] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[27] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[28] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[29] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[30] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[31] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[32] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[33] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[34] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[35] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[36] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[37] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[38] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[39] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[40] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[41] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[42] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[43] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[44] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[45] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[46] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[47] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[48] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[49] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[50] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[51] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[52] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[53] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[54] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[55] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[56] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[57] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[58] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[59] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[60] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[61] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[62] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[63] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "STR r4, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" + ); +} + +#endif /* WOLFSSL_SP_SMALL */ #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH) /* r = 2^n mod m where n is the number of bits to reduce by. * Given m must be 2048 bits, just need to subtract. @@ -3046,6 +3225,7 @@ sp_2048_sub_in_place_32(r, m); } +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -3054,141 +3234,917 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_2048_cond_sub_32_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_cond_sub_32_words%=\n\t" +#else + "BLT.N L_sp_2048_cond_sub_32_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" + ); + return (uint32_t)(size_t)r; +} - __asm__ __volatile__ ( - "mov r5, #128\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_2048_cond_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_2048_mont_reduce_32_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r9, [%[m], #48]\n\t" + "LDR r12, [%[a], #48]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r9, [%[m], #52]\n\t" + "LDR r12, [%[a], #52]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #52]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r9, [%[m], #56]\n\t" + "LDR r12, [%[a], #56]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #56]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r9, [%[m], #60]\n\t" + "LDR r12, [%[a], #60]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #60]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r9, [%[m], #64]\n\t" + "LDR r12, [%[a], #64]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #64]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r9, [%[m], #68]\n\t" + "LDR r12, [%[a], #68]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #68]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r9, [%[m], #72]\n\t" + "LDR r12, [%[a], #72]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #72]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r9, [%[m], #76]\n\t" + "LDR r12, [%[a], #76]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #76]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r9, [%[m], #80]\n\t" + "LDR r12, [%[a], #80]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #80]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r9, [%[m], #84]\n\t" + "LDR r12, [%[a], #84]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #84]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r9, [%[m], #88]\n\t" + "LDR r12, [%[a], #88]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #88]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r9, [%[m], #92]\n\t" + "LDR r12, [%[a], #92]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #92]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r9, [%[m], #96]\n\t" + "LDR r12, [%[a], #96]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #96]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r9, [%[m], #100]\n\t" + "LDR r12, [%[a], #100]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #100]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r9, [%[m], #104]\n\t" + "LDR r12, [%[a], #104]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #104]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r9, [%[m], #108]\n\t" + "LDR r12, [%[a], #108]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #108]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r9, [%[m], #112]\n\t" + "LDR r12, [%[a], #112]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #112]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r9, [%[m], #116]\n\t" + "LDR r12, [%[a], #116]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #116]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r9, [%[m], #120]\n\t" + "LDR r12, [%[a], #120]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #120]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r9, [%[m], #124]\n\t" + "LDR r12, [%[a], #124]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #124]\n\t" + "LDR r12, [%[a], #128]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #128]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x80\n\t" +#ifdef __GNUC__ + "BLT L_sp_2048_mont_reduce_32_word%=\n\t" +#else + "BLT.W L_sp_2048_mont_reduce_32_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp); } +#else /* Reduce the number back to 2048 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #128\n\t" - "\n1:\n\t" + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_32_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #120\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_32_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mont_reduce_32_mul%=\n\t" +#else + "BLT.N L_sp_2048_mont_reduce_32_mul%=\n\t" +#endif + "LDR r10, [%[a], #128]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #128]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x80\n\t" #if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" + "BLT L_sp_2048_mont_reduce_32_word%=\n\t" +#else + "BLT.N L_sp_2048_mont_reduce_32_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp); +} + +#endif /* !WOLFSSL_SP_SMALL */ +#else +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) #else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_2048_mont_reduce_32_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r12, [%[m], #48]\n\t" + "LDR r11, [%[a], #48]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r12, [%[m], #52]\n\t" + "LDR r11, [%[a], #52]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r12, [%[m], #56]\n\t" + "LDR r11, [%[a], #56]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r12, [%[m], #60]\n\t" + "LDR r11, [%[a], #60]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r12, [%[m], #64]\n\t" + "LDR r11, [%[a], #64]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r12, [%[m], #68]\n\t" + "LDR r11, [%[a], #68]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r12, [%[m], #72]\n\t" + "LDR r11, [%[a], #72]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r12, [%[m], #76]\n\t" + "LDR r11, [%[a], #76]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r12, [%[m], #80]\n\t" + "LDR r11, [%[a], #80]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r12, [%[m], #84]\n\t" + "LDR r11, [%[a], #84]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r12, [%[m], #88]\n\t" + "LDR r11, [%[a], #88]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r12, [%[m], #92]\n\t" + "LDR r11, [%[a], #92]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r12, [%[m], #96]\n\t" + "LDR r11, [%[a], #96]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r12, [%[m], #100]\n\t" + "LDR r11, [%[a], #100]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r12, [%[m], #104]\n\t" + "LDR r11, [%[a], #104]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r12, [%[m], #108]\n\t" + "LDR r11, [%[a], #108]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r12, [%[m], #112]\n\t" + "LDR r11, [%[a], #112]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r12, [%[m], #116]\n\t" + "LDR r11, [%[a], #116]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #116]\n\t" /* a[i+30] += m[30] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r12, [%[m], #120]\n\t" + "LDR r11, [%[a], #120]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #120]\n\t" /* a[i+31] += m[31] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[31] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[31] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #120\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r12, [%[m], #124]\n\t" + "LDR r11, [%[a], #124]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #128]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #124]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #128]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x80\n\t" +#ifdef __GNUC__ + "BLT L_sp_2048_mont_reduce_32_word%=\n\t" +#else + "BLT.W L_sp_2048_mont_reduce_32_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_2048_mont_reduce_32(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ - sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - ca); + __asm__ __volatile__ ( + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_32_word%=:\n\t" + /* mu = a[i] * mp */ + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_32_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+1] += m[j+1] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mont_reduce_32_mul%=\n\t" +#else + "BLT.N L_sp_2048_mont_reduce_32_mul%=\n\t" +#endif + "LDR r10, [%[a], #128]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #128]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mont_reduce_32_word%=\n\t" +#else + "BLT.N L_sp_2048_mont_reduce_32_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_2048_cond_sub_32(a - 32, a, m, (sp_digit)0 - mp); } +#endif /* !WOLFSSL_SP_SMALL */ +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -3196,7 +4152,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -3210,7 +4166,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -3219,48 +4175,247 @@ sp_2048_mont_reduce_32(r, m, mp); } +#ifdef WOLFSSL_SP_SMALL /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #128\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_2048_mul_d_32_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mul_d_32_word%=\n\t" +#else + "BLT.N L_sp_2048_mul_d_32_word%=\n\t" +#endif + "STR r3, [%[r], #128]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); +} + +#else +/* Mul a by digit b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision digit. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_2048_mul_d_32(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* A[0] * B */ + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[12] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[13] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[14] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[15] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[16] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[17] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[18] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[19] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[20] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[21] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[22] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[23] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[24] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[25] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[26] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[27] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[28] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[29] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[30] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[31] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "STR r5, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -3270,49 +4425,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_2048_word_32(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_2048_word_32_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_2048_word_32_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* Compare a with b in constant time. * * a A single precision integer. @@ -3320,44 +4560,401 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_2048_cmp_32(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_2048_cmp_32(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_2048_cmp_32(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #124\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0x7c\n\t" + "\n" + "L_sp_2048_cmp_32_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_2048_cmp_32_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #124]\n\t" + "LDR r5, [%[b], #124]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #120]\n\t" + "LDR r5, [%[b], #120]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #116]\n\t" + "LDR r5, [%[b], #116]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #112]\n\t" + "LDR r5, [%[b], #112]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #108]\n\t" + "LDR r5, [%[b], #108]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #104]\n\t" + "LDR r5, [%[b], #104]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #100]\n\t" + "LDR r5, [%[b], #100]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #96]\n\t" + "LDR r5, [%[b], #96]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #92]\n\t" + "LDR r5, [%[b], #92]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #88]\n\t" + "LDR r5, [%[b], #88]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #84]\n\t" + "LDR r5, [%[b], #84]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #80]\n\t" + "LDR r5, [%[b], #80]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #76]\n\t" + "LDR r5, [%[b], #76]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #72]\n\t" + "LDR r5, [%[b], #72]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #68]\n\t" + "LDR r5, [%[b], #68]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #64]\n\t" + "LDR r5, [%[b], #64]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "LDR r5, [%[b], #60]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #56]\n\t" + "LDR r5, [%[b], #56]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #52]\n\t" + "LDR r5, [%[b], #52]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #48]\n\t" + "LDR r5, [%[b], #48]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Divide d in a and put remainder into r (m*d + r = a) @@ -3369,8 +4966,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_32(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -3756,6 +5353,7 @@ } #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -3764,142 +5362,1445 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_2048_cond_sub_64(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_cond_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_2048_cond_sub_64(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_2048_cond_sub_64_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x100\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_cond_sub_64_words%=\n\t" +#else + "BLT.N L_sp_2048_cond_sub_64_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" + ); + return (uint32_t)(size_t)r; +} - __asm__ __volatile__ ( - "mov r5, #1\n\t" - "lsl r5, r5, #8\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_cond_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_2048_cond_sub_64(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_2048_mont_reduce_64_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r9, [%[m], #48]\n\t" + "LDR r12, [%[a], #48]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r9, [%[m], #52]\n\t" + "LDR r12, [%[a], #52]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #52]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r9, [%[m], #56]\n\t" + "LDR r12, [%[a], #56]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #56]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r9, [%[m], #60]\n\t" + "LDR r12, [%[a], #60]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #60]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r9, [%[m], #64]\n\t" + "LDR r12, [%[a], #64]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #64]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r9, [%[m], #68]\n\t" + "LDR r12, [%[a], #68]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #68]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r9, [%[m], #72]\n\t" + "LDR r12, [%[a], #72]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #72]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r9, [%[m], #76]\n\t" + "LDR r12, [%[a], #76]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #76]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r9, [%[m], #80]\n\t" + "LDR r12, [%[a], #80]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #80]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r9, [%[m], #84]\n\t" + "LDR r12, [%[a], #84]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #84]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r9, [%[m], #88]\n\t" + "LDR r12, [%[a], #88]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #88]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r9, [%[m], #92]\n\t" + "LDR r12, [%[a], #92]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #92]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r9, [%[m], #96]\n\t" + "LDR r12, [%[a], #96]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #96]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r9, [%[m], #100]\n\t" + "LDR r12, [%[a], #100]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #100]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r9, [%[m], #104]\n\t" + "LDR r12, [%[a], #104]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #104]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r9, [%[m], #108]\n\t" + "LDR r12, [%[a], #108]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #108]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r9, [%[m], #112]\n\t" + "LDR r12, [%[a], #112]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #112]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r9, [%[m], #116]\n\t" + "LDR r12, [%[a], #116]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #116]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r9, [%[m], #120]\n\t" + "LDR r12, [%[a], #120]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #120]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r9, [%[m], #124]\n\t" + "LDR r12, [%[a], #124]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #124]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r9, [%[m], #128]\n\t" + "LDR r12, [%[a], #128]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #128]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r9, [%[m], #132]\n\t" + "LDR r12, [%[a], #132]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #132]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r9, [%[m], #136]\n\t" + "LDR r12, [%[a], #136]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #136]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r9, [%[m], #140]\n\t" + "LDR r12, [%[a], #140]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #140]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r9, [%[m], #144]\n\t" + "LDR r12, [%[a], #144]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #144]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r9, [%[m], #148]\n\t" + "LDR r12, [%[a], #148]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #148]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r9, [%[m], #152]\n\t" + "LDR r12, [%[a], #152]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #152]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r9, [%[m], #156]\n\t" + "LDR r12, [%[a], #156]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #156]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r9, [%[m], #160]\n\t" + "LDR r12, [%[a], #160]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #160]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r9, [%[m], #164]\n\t" + "LDR r12, [%[a], #164]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #164]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r9, [%[m], #168]\n\t" + "LDR r12, [%[a], #168]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #168]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r9, [%[m], #172]\n\t" + "LDR r12, [%[a], #172]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #172]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r9, [%[m], #176]\n\t" + "LDR r12, [%[a], #176]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #176]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r9, [%[m], #180]\n\t" + "LDR r12, [%[a], #180]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #180]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+46] += m[46] * mu */ + "LDR r9, [%[m], #184]\n\t" + "LDR r12, [%[a], #184]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #184]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+47] += m[47] * mu */ + "LDR r9, [%[m], #188]\n\t" + "LDR r12, [%[a], #188]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #188]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+48] += m[48] * mu */ + "LDR r9, [%[m], #192]\n\t" + "LDR r12, [%[a], #192]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #192]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+49] += m[49] * mu */ + "LDR r9, [%[m], #196]\n\t" + "LDR r12, [%[a], #196]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #196]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+50] += m[50] * mu */ + "LDR r9, [%[m], #200]\n\t" + "LDR r12, [%[a], #200]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #200]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+51] += m[51] * mu */ + "LDR r9, [%[m], #204]\n\t" + "LDR r12, [%[a], #204]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #204]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+52] += m[52] * mu */ + "LDR r9, [%[m], #208]\n\t" + "LDR r12, [%[a], #208]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #208]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+53] += m[53] * mu */ + "LDR r9, [%[m], #212]\n\t" + "LDR r12, [%[a], #212]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #212]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+54] += m[54] * mu */ + "LDR r9, [%[m], #216]\n\t" + "LDR r12, [%[a], #216]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #216]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+55] += m[55] * mu */ + "LDR r9, [%[m], #220]\n\t" + "LDR r12, [%[a], #220]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #220]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+56] += m[56] * mu */ + "LDR r9, [%[m], #224]\n\t" + "LDR r12, [%[a], #224]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #224]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+57] += m[57] * mu */ + "LDR r9, [%[m], #228]\n\t" + "LDR r12, [%[a], #228]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #228]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+58] += m[58] * mu */ + "LDR r9, [%[m], #232]\n\t" + "LDR r12, [%[a], #232]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #232]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+59] += m[59] * mu */ + "LDR r9, [%[m], #236]\n\t" + "LDR r12, [%[a], #236]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #236]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+60] += m[60] * mu */ + "LDR r9, [%[m], #240]\n\t" + "LDR r12, [%[a], #240]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #240]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+61] += m[61] * mu */ + "LDR r9, [%[m], #244]\n\t" + "LDR r12, [%[a], #244]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #244]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+62] += m[62] * mu */ + "LDR r9, [%[m], #248]\n\t" + "LDR r12, [%[a], #248]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #248]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+63] += m[63] * mu */ + "LDR r9, [%[m], #252]\n\t" + "LDR r12, [%[a], #252]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #252]\n\t" + "LDR r12, [%[a], #256]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #256]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x100\n\t" +#ifdef __GNUC__ + "BLT L_sp_2048_mont_reduce_64_word%=\n\t" +#else + "BLT.W L_sp_2048_mont_reduce_64_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp); } +#else /* Reduce the number back to 2048 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #256\n\t" - "\n1:\n\t" + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_64_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #248\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_64_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x100\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mont_reduce_64_mul%=\n\t" +#else + "BLT.N L_sp_2048_mont_reduce_64_mul%=\n\t" +#endif + "LDR r10, [%[a], #256]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #256]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x100\n\t" #if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" + "BLT L_sp_2048_mont_reduce_64_word%=\n\t" #else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ + "BLT.N L_sp_2048_mont_reduce_64_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp); +} + +#endif /* !WOLFSSL_SP_SMALL */ +#else +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_2048_mont_reduce_64_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r12, [%[m], #48]\n\t" + "LDR r11, [%[a], #48]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r12, [%[m], #52]\n\t" + "LDR r11, [%[a], #52]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r12, [%[m], #56]\n\t" + "LDR r11, [%[a], #56]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r12, [%[m], #60]\n\t" + "LDR r11, [%[a], #60]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r12, [%[m], #64]\n\t" + "LDR r11, [%[a], #64]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r12, [%[m], #68]\n\t" + "LDR r11, [%[a], #68]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r12, [%[m], #72]\n\t" + "LDR r11, [%[a], #72]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r12, [%[m], #76]\n\t" + "LDR r11, [%[a], #76]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r12, [%[m], #80]\n\t" + "LDR r11, [%[a], #80]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r12, [%[m], #84]\n\t" + "LDR r11, [%[a], #84]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r12, [%[m], #88]\n\t" + "LDR r11, [%[a], #88]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r12, [%[m], #92]\n\t" + "LDR r11, [%[a], #92]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r12, [%[m], #96]\n\t" + "LDR r11, [%[a], #96]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r12, [%[m], #100]\n\t" + "LDR r11, [%[a], #100]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r12, [%[m], #104]\n\t" + "LDR r11, [%[a], #104]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r12, [%[m], #108]\n\t" + "LDR r11, [%[a], #108]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r12, [%[m], #112]\n\t" + "LDR r11, [%[a], #112]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r12, [%[m], #116]\n\t" + "LDR r11, [%[a], #116]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r12, [%[m], #120]\n\t" + "LDR r11, [%[a], #120]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r12, [%[m], #124]\n\t" + "LDR r11, [%[a], #124]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r12, [%[m], #128]\n\t" + "LDR r11, [%[a], #128]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r12, [%[m], #132]\n\t" + "LDR r11, [%[a], #132]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r12, [%[m], #136]\n\t" + "LDR r11, [%[a], #136]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r12, [%[m], #140]\n\t" + "LDR r11, [%[a], #140]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r12, [%[m], #144]\n\t" + "LDR r11, [%[a], #144]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r12, [%[m], #148]\n\t" + "LDR r11, [%[a], #148]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r12, [%[m], #152]\n\t" + "LDR r11, [%[a], #152]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r12, [%[m], #156]\n\t" + "LDR r11, [%[a], #156]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r12, [%[m], #160]\n\t" + "LDR r11, [%[a], #160]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r12, [%[m], #164]\n\t" + "LDR r11, [%[a], #164]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r12, [%[m], #168]\n\t" + "LDR r11, [%[a], #168]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r12, [%[m], #172]\n\t" + "LDR r11, [%[a], #172]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r12, [%[m], #176]\n\t" + "LDR r11, [%[a], #176]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r12, [%[m], #180]\n\t" + "LDR r11, [%[a], #180]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #180]\n\t" + /* a[i+46] += m[46] * mu */ + "LDR r12, [%[m], #184]\n\t" + "LDR r11, [%[a], #184]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #184]\n\t" + /* a[i+47] += m[47] * mu */ + "LDR r12, [%[m], #188]\n\t" + "LDR r11, [%[a], #188]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #188]\n\t" + /* a[i+48] += m[48] * mu */ + "LDR r12, [%[m], #192]\n\t" + "LDR r11, [%[a], #192]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #192]\n\t" + /* a[i+49] += m[49] * mu */ + "LDR r12, [%[m], #196]\n\t" + "LDR r11, [%[a], #196]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #196]\n\t" + /* a[i+50] += m[50] * mu */ + "LDR r12, [%[m], #200]\n\t" + "LDR r11, [%[a], #200]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #200]\n\t" + /* a[i+51] += m[51] * mu */ + "LDR r12, [%[m], #204]\n\t" + "LDR r11, [%[a], #204]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #204]\n\t" + /* a[i+52] += m[52] * mu */ + "LDR r12, [%[m], #208]\n\t" + "LDR r11, [%[a], #208]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #208]\n\t" + /* a[i+53] += m[53] * mu */ + "LDR r12, [%[m], #212]\n\t" + "LDR r11, [%[a], #212]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #212]\n\t" + /* a[i+54] += m[54] * mu */ + "LDR r12, [%[m], #216]\n\t" + "LDR r11, [%[a], #216]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #216]\n\t" + /* a[i+55] += m[55] * mu */ + "LDR r12, [%[m], #220]\n\t" + "LDR r11, [%[a], #220]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #220]\n\t" + /* a[i+56] += m[56] * mu */ + "LDR r12, [%[m], #224]\n\t" + "LDR r11, [%[a], #224]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #224]\n\t" + /* a[i+57] += m[57] * mu */ + "LDR r12, [%[m], #228]\n\t" + "LDR r11, [%[a], #228]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #228]\n\t" + /* a[i+58] += m[58] * mu */ + "LDR r12, [%[m], #232]\n\t" + "LDR r11, [%[a], #232]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #232]\n\t" + /* a[i+59] += m[59] * mu */ + "LDR r12, [%[m], #236]\n\t" + "LDR r11, [%[a], #236]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #236]\n\t" + /* a[i+60] += m[60] * mu */ + "LDR r12, [%[m], #240]\n\t" + "LDR r11, [%[a], #240]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #240]\n\t" + /* a[i+61] += m[61] * mu */ + "LDR r12, [%[m], #244]\n\t" + "LDR r11, [%[a], #244]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #244]\n\t" /* a[i+62] += m[62] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r12, [%[m], #248]\n\t" + "LDR r11, [%[a], #248]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #248]\n\t" /* a[i+63] += m[63] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[63] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[63] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #248\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r12, [%[m], #252]\n\t" + "LDR r11, [%[a], #252]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #256]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #252]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #256]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x100\n\t" +#ifdef __GNUC__ + "BLT L_sp_2048_mont_reduce_64_word%=\n\t" +#else + "BLT.W L_sp_2048_mont_reduce_64_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp); +} - sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - ca); +#else +/* Reduce the number back to 2048 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_2048_mont_reduce_64(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_64_word%=:\n\t" + /* mu = a[i] * mp */ + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_2048_mont_reduce_64_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+1] += m[j+1] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x100\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mont_reduce_64_mul%=\n\t" +#else + "BLT.N L_sp_2048_mont_reduce_64_mul%=\n\t" +#endif + "LDR r10, [%[a], #256]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #256]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x100\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_mont_reduce_64_word%=\n\t" +#else + "BLT.N L_sp_2048_mont_reduce_64_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_2048_cond_sub_64(a - 64, a, m, (sp_digit)0 - mp); } +#endif /* !WOLFSSL_SP_SMALL */ +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -3907,7 +6808,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -3921,7 +6822,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_64(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -3937,39 +6838,44 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r5, #1\n\t" - "lsl r5, r5, #8\n\t" - "add r6, r6, r5\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r11, #0x0\n\t" + "ADD r12, %[a], #0x100\n\t" + "\n" + "L_sp_2048_sub_64_word%=:\n\t" + "RSBS r11, r11, #0x0\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC r11, r3, r3\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_2048_sub_64_word%=\n\t" +#else + "BNE.N L_sp_2048_sub_64_word%=\n\t" +#endif + "MOV %[r], r11\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #else @@ -3979,182 +6885,141 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_sub_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_2048_sub_64(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -4164,49 +7029,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_2048_word_64(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_2048_word_64_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_2048_word_64_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * @@ -4216,8 +7166,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_64_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -4279,6 +7229,7 @@ } #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH) +#if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY) /* AND m into each word of a and store in r. * * r A single precision integer. @@ -4316,44 +7267,753 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_2048_cmp_64(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_2048_cmp_64(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_2048_cmp_64(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #252\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0xfc\n\t" + "\n" + "L_sp_2048_cmp_64_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_2048_cmp_64_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #252]\n\t" + "LDR r5, [%[b], #252]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #248]\n\t" + "LDR r5, [%[b], #248]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #244]\n\t" + "LDR r5, [%[b], #244]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #240]\n\t" + "LDR r5, [%[b], #240]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #236]\n\t" + "LDR r5, [%[b], #236]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #232]\n\t" + "LDR r5, [%[b], #232]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #228]\n\t" + "LDR r5, [%[b], #228]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #224]\n\t" + "LDR r5, [%[b], #224]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #220]\n\t" + "LDR r5, [%[b], #220]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #216]\n\t" + "LDR r5, [%[b], #216]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #212]\n\t" + "LDR r5, [%[b], #212]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #208]\n\t" + "LDR r5, [%[b], #208]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #204]\n\t" + "LDR r5, [%[b], #204]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #200]\n\t" + "LDR r5, [%[b], #200]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #196]\n\t" + "LDR r5, [%[b], #196]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #192]\n\t" + "LDR r5, [%[b], #192]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #188]\n\t" + "LDR r5, [%[b], #188]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #184]\n\t" + "LDR r5, [%[b], #184]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #180]\n\t" + "LDR r5, [%[b], #180]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #176]\n\t" + "LDR r5, [%[b], #176]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #172]\n\t" + "LDR r5, [%[b], #172]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #168]\n\t" + "LDR r5, [%[b], #168]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #164]\n\t" + "LDR r5, [%[b], #164]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #160]\n\t" + "LDR r5, [%[b], #160]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #156]\n\t" + "LDR r5, [%[b], #156]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #152]\n\t" + "LDR r5, [%[b], #152]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #148]\n\t" + "LDR r5, [%[b], #148]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #144]\n\t" + "LDR r5, [%[b], #144]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #140]\n\t" + "LDR r5, [%[b], #140]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #136]\n\t" + "LDR r5, [%[b], #136]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #132]\n\t" + "LDR r5, [%[b], #132]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #128]\n\t" + "LDR r5, [%[b], #128]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #124]\n\t" + "LDR r5, [%[b], #124]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #120]\n\t" + "LDR r5, [%[b], #120]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #116]\n\t" + "LDR r5, [%[b], #116]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #112]\n\t" + "LDR r5, [%[b], #112]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #108]\n\t" + "LDR r5, [%[b], #108]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #104]\n\t" + "LDR r5, [%[b], #104]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #100]\n\t" + "LDR r5, [%[b], #100]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #96]\n\t" + "LDR r5, [%[b], #96]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #92]\n\t" + "LDR r5, [%[b], #92]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #88]\n\t" + "LDR r5, [%[b], #88]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #84]\n\t" + "LDR r5, [%[b], #84]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #80]\n\t" + "LDR r5, [%[b], #80]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #76]\n\t" + "LDR r5, [%[b], #76]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #72]\n\t" + "LDR r5, [%[b], #72]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #68]\n\t" + "LDR r5, [%[b], #68]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #64]\n\t" + "LDR r5, [%[b], #64]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "LDR r5, [%[b], #60]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #56]\n\t" + "LDR r5, [%[b], #56]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #52]\n\t" + "LDR r5, [%[b], #52]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #48]\n\t" + "LDR r5, [%[b], #48]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Divide d in a and put remainder into r (m*d + r = a) @@ -4365,8 +8025,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_2048_div_64(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[128], t2[65]; sp_digit div, r1; @@ -4411,6 +8071,7 @@ return sp_2048_div_64(a, m, NULL, r); } +#endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */ #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ defined(WOLFSSL_HAVE_SP_DH) #ifdef WOLFSSL_SP_SMALL @@ -4874,6 +8535,7 @@ } #ifndef WOLFSSL_RSA_PUBLIC_ONLY +#ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -4882,39 +8544,192 @@ * b A single precision number to add. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_2048_cond_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, - sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_2048_cond_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #128\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "adds r5, %[c], #-1\n\t" - "ldr r5, [%[a], r8]\n\t" - "adcs r5, r5, r6\n\t" - "mov %[c], #0\n\t" - "adcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_2048_cond_add_32_words%=:\n\t" + "ADDS r5, r5, #0xffffffff\n\t" + "LDR r6, [%[a], r4]\n\t" + "LDR r7, [%[b], r4]\n\t" + "AND r7, r7, %[m]\n\t" + "ADCS r6, r6, r7\n\t" + "ADC r5, r8, r8\n\t" + "STR r6, [%[r], r4]\n\t" + "ADD r4, r4, #0x4\n\t" + "CMP r4, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_2048_cond_add_32_words%=\n\t" +#else + "BLT.N L_sp_2048_cond_add_32_words%=\n\t" +#endif + "MOV %[r], r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally add a and b using the mask m. + * m is -1 to add and 0 when not. + * + * r A single precision number representing conditional add result. + * a A single precision number to add with. + * b A single precision number to add. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_2048_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_2048_cond_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADDS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "ADC %[r], r10, r10\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ /* RSA private key operation. * * in Array of bytes representing the number to exponentiate, base. @@ -5229,406 +9044,407 @@ #ifdef WOLFSSL_HAVE_SP_DH #ifdef HAVE_FFDHE_2048 +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_2048_lshift_64(sp_digit* r_p, const sp_digit* a_p, byte n_p) +#else static void sp_2048_lshift_64(sp_digit* r, const sp_digit* a, byte n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r6, #31\n\t" - "sub r6, r6, %[n]\n\t" - "add %[a], %[a], #192\n\t" - "add %[r], %[r], #192\n\t" - "ldr r3, [%[a], #60]\n\t" - "lsr r4, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r4, r4, r6\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r4, [%[r], #68]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r3, [%[r], #64]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r2, [%[r], #60]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r4, [%[r], #56]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r3, [%[r], #52]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r2, [%[r], #48]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r4, [%[r], #44]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r3, [%[r], #40]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r2, [%[r], #36]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r4, [%[r], #32]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r3, [%[r], #28]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r2, [%[r], #24]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r4, [%[r], #20]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r3, [%[r], #16]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #4]\n\t" - "str r2, [%[r], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #0]\n\t" - "str r4, [%[r], #8]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r4, [%[a], #60]\n\t" - "str r3, [%[r], #68]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #56]\n\t" - "str r2, [%[r], #64]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #52]\n\t" - "str r4, [%[r], #60]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #48]\n\t" - "str r3, [%[r], #56]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #44]\n\t" - "str r2, [%[r], #52]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #40]\n\t" - "str r4, [%[r], #48]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #36]\n\t" - "str r3, [%[r], #44]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #32]\n\t" - "str r2, [%[r], #40]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #28]\n\t" - "str r4, [%[r], #36]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #24]\n\t" - "str r3, [%[r], #32]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #20]\n\t" - "str r2, [%[r], #28]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #16]\n\t" - "str r4, [%[r], #24]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #12]\n\t" - "str r3, [%[r], #20]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #8]\n\t" - "str r2, [%[r], #16]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #4]\n\t" - "str r4, [%[r], #12]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #0]\n\t" - "str r3, [%[r], #8]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r3, [%[a], #60]\n\t" - "str r2, [%[r], #68]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "str r3, [%[r]]\n\t" - "str r4, [%[r], #4]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register byte n __asm__ ("r2") = (byte)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "RSB r7, %[n], #0x1f\n\t" + "LDR r5, [%[a], #252]\n\t" + "LSR r6, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r6, r6, r7\n\t" + "LDR r4, [%[a], #248]\n\t" + "STR r6, [%[r], #256]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #244]\n\t" + "STR r5, [%[r], #252]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #240]\n\t" + "STR r4, [%[r], #248]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #236]\n\t" + "STR r6, [%[r], #244]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #232]\n\t" + "STR r5, [%[r], #240]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #228]\n\t" + "STR r4, [%[r], #236]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #224]\n\t" + "STR r6, [%[r], #232]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #220]\n\t" + "STR r5, [%[r], #228]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #216]\n\t" + "STR r4, [%[r], #224]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #212]\n\t" + "STR r6, [%[r], #220]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #208]\n\t" + "STR r5, [%[r], #216]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #204]\n\t" + "STR r4, [%[r], #212]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #200]\n\t" + "STR r6, [%[r], #208]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #196]\n\t" + "STR r5, [%[r], #204]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #192]\n\t" + "STR r4, [%[r], #200]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #188]\n\t" + "STR r6, [%[r], #196]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #184]\n\t" + "STR r5, [%[r], #192]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #180]\n\t" + "STR r4, [%[r], #188]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #176]\n\t" + "STR r6, [%[r], #184]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #172]\n\t" + "STR r5, [%[r], #180]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #168]\n\t" + "STR r4, [%[r], #176]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #164]\n\t" + "STR r6, [%[r], #172]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #160]\n\t" + "STR r5, [%[r], #168]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #156]\n\t" + "STR r4, [%[r], #164]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #152]\n\t" + "STR r6, [%[r], #160]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #148]\n\t" + "STR r5, [%[r], #156]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #144]\n\t" + "STR r4, [%[r], #152]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #140]\n\t" + "STR r6, [%[r], #148]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #136]\n\t" + "STR r5, [%[r], #144]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #132]\n\t" + "STR r4, [%[r], #140]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #128]\n\t" + "STR r6, [%[r], #136]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #124]\n\t" + "STR r5, [%[r], #132]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #120]\n\t" + "STR r4, [%[r], #128]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #116]\n\t" + "STR r6, [%[r], #124]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #112]\n\t" + "STR r5, [%[r], #120]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #108]\n\t" + "STR r4, [%[r], #116]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #104]\n\t" + "STR r6, [%[r], #112]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #100]\n\t" + "STR r5, [%[r], #108]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #96]\n\t" + "STR r4, [%[r], #104]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #92]\n\t" + "STR r6, [%[r], #100]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #88]\n\t" + "STR r5, [%[r], #96]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #84]\n\t" + "STR r4, [%[r], #92]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #80]\n\t" + "STR r6, [%[r], #88]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #76]\n\t" + "STR r5, [%[r], #84]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #72]\n\t" + "STR r4, [%[r], #80]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #68]\n\t" + "STR r6, [%[r], #76]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #64]\n\t" + "STR r5, [%[r], #72]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #60]\n\t" + "STR r4, [%[r], #68]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #56]\n\t" + "STR r6, [%[r], #64]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #52]\n\t" + "STR r5, [%[r], #60]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #48]\n\t" + "STR r4, [%[r], #56]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #44]\n\t" + "STR r6, [%[r], #52]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #40]\n\t" + "STR r5, [%[r], #48]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #36]\n\t" + "STR r4, [%[r], #44]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #32]\n\t" + "STR r6, [%[r], #40]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #28]\n\t" + "STR r5, [%[r], #36]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #24]\n\t" + "STR r4, [%[r], #32]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #20]\n\t" + "STR r6, [%[r], #28]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #16]\n\t" + "STR r5, [%[r], #24]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #12]\n\t" + "STR r4, [%[r], #20]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #8]\n\t" + "STR r6, [%[r], #16]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #4]\n\t" + "STR r5, [%[r], #12]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a]]\n\t" + "STR r4, [%[r], #8]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "STR r5, [%[r]]\n\t" + "STR r6, [%[r], #4]\n\t" + : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : [r] "r" (r), [a] "r" (a), [n] "r" (n) - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r3", "r7", "cc" ); } @@ -5930,14 +9746,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -6048,83 +9864,1025 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_3072_mul_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_3072_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[12 * 2]; - sp_digit* tmp = tmp_arr; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #48\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #44\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #88\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" + "SUB sp, sp, #0x30\n\t" + /* A[0] * B[0] */ + "LDR r11, [%[a]]\n\t" + "LDR r12, [%[b]]\n\t" + "UMULL r3, r4, r11, r12\n\t" + "MOV r5, #0x0\n\t" + "STR r3, [sp]\n\t" + /* A[0] * B[1] */ + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[0] */ + "LDR r8, [%[a], #4]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + /* A[2] * B[0] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[1] */ + "LDR r11, [%[a], #4]\n\t" + "LDR r12, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[2] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #8]\n\t" + /* A[0] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[2] */ + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[1] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[0] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #12]\n\t" + /* A[4] * B[0] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[1] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[2] */ + "LDR r11, [%[a], #8]\n\t" + "LDR r12, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[3] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[4] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #16]\n\t" + /* A[0] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[4] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[2] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[1] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[0] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #20]\n\t" + /* A[6] * B[0] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[1] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[2] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[3] */ + "LDR r11, [%[a], #12]\n\t" + "LDR r12, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[4] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[5] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[0] * B[6] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #24]\n\t" + /* A[0] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[6] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[5] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[4] */ + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[3] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[2] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[1] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[0] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* A[8] * B[0] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[1] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[2] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[3] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[4] */ + "LDR r11, [%[a], #16]\n\t" + "LDR r12, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[5] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[6] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[7] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[8] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #32]\n\t" + /* A[0] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[8] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[7] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[6] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[4] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[3] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[2] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[1] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[0] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #36]\n\t" + /* A[10] * B[0] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[1] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[2] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[3] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[4] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[5] */ + "LDR r11, [%[a], #20]\n\t" + "LDR r12, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[6] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[7] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[8] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[9] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[10] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #40]\n\t" + /* A[0] * B[11] */ + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[10] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[9] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[8] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[7] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[6] */ + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[5] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[4] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[3] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[2] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[1] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[0] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #44]\n\t" + /* A[11] * B[1] */ + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[2] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[3] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[4] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[5] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[6] */ + "LDR r11, [%[a], #24]\n\t" + "LDR r12, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[7] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[8] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[9] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[10] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[11] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #48]\n\t" + /* A[2] * B[11] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[10] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[9] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[8] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[6] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[5] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[4] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[3] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[2] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #52]\n\t" + /* A[11] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[4] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[5] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[6] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[7] */ + "LDR r11, [%[a], #28]\n\t" + "LDR r12, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[8] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[9] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[10] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[11] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #56]\n\t" + /* A[4] * B[11] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[10] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[9] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[8] */ + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[7] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[6] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[5] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[4] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #60]\n\t" + /* A[11] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[6] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[7] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[8] */ + "LDR r11, [%[a], #32]\n\t" + "LDR r12, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[9] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[10] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[11] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #64]\n\t" + /* A[6] * B[11] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[10] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[8] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[7] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[6] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #68]\n\t" + /* A[11] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[8] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[9] */ + "LDR r11, [%[a], #36]\n\t" + "LDR r12, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[10] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[11] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #72]\n\t" + /* A[8] * B[11] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[10] */ + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[9] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[8] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #76]\n\t" + /* A[11] * B[9] */ + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[10] */ + "LDR r11, [%[a], #40]\n\t" + "LDR r12, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[11] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #80]\n\t" + /* A[10] * B[11] */ + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[10] */ + "LDR r8, [%[a], #44]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #84]\n\t" + /* A[11] * B[11] */ + "UMLAL r4, r5, r8, r9\n\t" + "STR r4, [%[r], #88]\n\t" + "STR r5, [%[r], #92]\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Add b to a into r. (r = a + b) @@ -6133,131 +10891,114 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) * - * r A single precision integer. - * a A single precision integer. + * a A single precision integer and result. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_in_place_24(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_in_place_24(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_in_place_24(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -6266,80 +11007,68 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_add_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_add_24(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* AND m into each word of a and store in r. @@ -6411,145 +11140,113 @@ (void)sp_3072_add_12(r + 36, r + 36, a1); } -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) * - * r A single precision integer. - * a A single precision integer. + * a A single precision integer and result. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -6558,140 +11255,110 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* AND m into each word of a and store in r. @@ -6763,265 +11430,197 @@ (void)sp_3072_add_24(r + 72, r + 72, a1); } -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) * - * r A single precision integer. - * a A single precision integer. + * a A single precision integer and result. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_in_place_96(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -7030,260 +11629,194 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* AND m into each word of a and store in r. @@ -7360,122 +11893,698 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_sqr_12(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_3072_sqr_12(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #96\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #44\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #48\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #88\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #92\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #96\n\t" - "add sp, sp, r6\n\t" + "SUB sp, sp, #0x30\n\t" + /* A[0] * A[0] */ + "LDR r10, [%[a]]\n\t" + "UMULL r8, r3, r10, r10\n\t" + "MOV r4, #0x0\n\t" + "STR r8, [sp]\n\t" + /* A[0] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #4]\n\t" + /* A[0] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #8]\n\t" + /* A[0] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [sp, #12]\n\t" + /* A[0] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[1] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[2] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #16]\n\t" + /* A[0] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #20]\n\t" + /* A[0] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #24]\n\t" + /* A[0] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #28]\n\t" + /* A[0] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #32]\n\t" + /* A[0] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #36]\n\t" + /* A[0] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #40]\n\t" + /* A[0] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #44]\n\t" + /* A[1] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[2] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #48]\n\t" + /* A[2] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[3] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #52]\n\t" + /* A[3] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[4] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #56]\n\t" + /* A[4] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[5] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #60]\n\t" + /* A[5] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[6] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #64]\n\t" + /* A[6] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[7] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #68]\n\t" + /* A[7] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [%[r], #72]\n\t" + /* A[8] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[9] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [%[r], #76]\n\t" + /* A[9] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #80]\n\t" + /* A[10] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [%[r], #84]\n\t" + /* A[11] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "UMLAL r3, r4, r10, r10\n\t" + "STR r3, [%[r], #88]\n\t" + "STR r4, [%[r], #92]\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); } @@ -7485,49 +12594,46 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Square a and put result in r. (r = a * a) @@ -7572,79 +12678,67 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_24(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_24(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_24(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Square a and put result in r. (r = a * a) @@ -7689,139 +12783,109 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_48(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Square a and put result in r. (r = a * a) @@ -7868,39 +12932,45 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_add_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_add_96(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #384\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x180\n\t" + "\n" + "L_sp_3072_add_96_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_3072_add_96_word%=\n\t" +#else + "BNE.N L_sp_3072_add_96_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -7910,39 +12980,43 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_in_place_96(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_in_place_96(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_in_place_96(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #384\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x180\n\t" + "\n" + "L_sp_3072_sub_in_pkace_96_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_3072_sub_in_pkace_96_word%=\n\t" +#else + "BNE.N L_sp_3072_sub_in_pkace_96_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #endif /* WOLFSSL_SP_SMALL */ @@ -7953,89 +13027,99 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_3072_mul_96(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_mul_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_3072_mul_96(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[96 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #128\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #124\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x300\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_3072_mul_96_outer%=:\n\t" + "SUBS r3, r5, #0x17c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_3072_mul_96_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_mul_96_inner_done%=\n\t" +#else + "BGT.N L_sp_3072_mul_96_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mul_96_inner%=\n\t" +#else + "BLT.N L_sp_3072_mul_96_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_3072_mul_96_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x2f4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_3072_mul_96_outer%=\n\t" +#else + "BLE.N L_sp_3072_mul_96_outer%=\n\t" +#endif + "LDR lr, [%[a], #380]\n\t" + "LDR r11, [%[b], #380]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_3072_mul_96_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_mul_96_store%=\n\t" +#else + "BGT.N L_sp_3072_mul_96_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Square a and put result in r. (r = a * a) @@ -8043,132 +13127,91 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_sqr_96(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_3072_sqr_96(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #3\n\t" - "lsl r6, r6, #8\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #124\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #128\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #2\n\t" - "lsl r3, r3, #8\n\t" - "add r3, r3, #252\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #3\n\t" - "lsl r6, r6, #8\n\t" - "add sp, sp, r6\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x300\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_3072_sqr_96_outer%=:\n\t" + "SUBS r3, r5, #0x17c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_3072_sqr_96_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_sqr_96_inner_done%=\n\t" +#else + "BGT.N L_sp_3072_sqr_96_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_sqr_96_inner%=\n\t" +#else + "BLT.N L_sp_3072_sqr_96_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_3072_sqr_96_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x2f4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_3072_sqr_96_outer%=\n\t" +#else + "BLE.N L_sp_3072_sqr_96_outer%=\n\t" +#endif + "LDR lr, [%[a], #380]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_3072_sqr_96_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_sqr_96_store%=\n\t" +#else + "BGT.N L_sp_3072_sqr_96_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -8198,39 +13241,45 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_add_48(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #192\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0xc0\n\t" + "\n" + "L_sp_3072_add_48_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_3072_add_48_word%=\n\t" +#else + "BNE.N L_sp_3072_add_48_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -8240,39 +13289,43 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_in_place_48(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_in_place_48(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_in_place_48(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #192\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0xc0\n\t" + "\n" + "L_sp_3072_sub_in_pkace_48_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_3072_sub_in_pkace_48_word%=\n\t" +#else + "BNE.N L_sp_3072_sub_in_pkace_48_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #endif /* WOLFSSL_SP_SMALL */ @@ -8283,85 +13336,99 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_3072_mul_48(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_mul_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_3072_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[48 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #192\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #188\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #120\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x180\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_3072_mul_48_outer%=:\n\t" + "SUBS r3, r5, #0xbc\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_3072_mul_48_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_mul_48_inner_done%=\n\t" +#else + "BGT.N L_sp_3072_mul_48_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mul_48_inner%=\n\t" +#else + "BLT.N L_sp_3072_mul_48_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_3072_mul_48_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x174\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_3072_mul_48_outer%=\n\t" +#else + "BLE.N L_sp_3072_mul_48_outer%=\n\t" +#endif + "LDR lr, [%[a], #188]\n\t" + "LDR r11, [%[b], #188]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_3072_mul_48_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_mul_48_store%=\n\t" +#else + "BGT.N L_sp_3072_mul_48_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Square a and put result in r. (r = a * a) @@ -8369,137 +13436,98 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_sqr_48(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_3072_sqr_48(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #128\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #188\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #192\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #120\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #1\n\t" - "lsl r3, r3, #8\n\t" - "add r3, r3, #124\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #128\n\t" - "add sp, sp, r6\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x180\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_3072_sqr_48_outer%=:\n\t" + "SUBS r3, r5, #0xbc\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_3072_sqr_48_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_sqr_48_inner_done%=\n\t" +#else + "BGT.N L_sp_3072_sqr_48_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_sqr_48_inner%=\n\t" +#else + "BLT.N L_sp_3072_sqr_48_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_3072_sqr_48_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x174\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_3072_sqr_48_outer%=\n\t" +#else + "BLE.N L_sp_3072_sqr_48_outer%=\n\t" +#endif + "LDR lr, [%[a], #188]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_3072_sqr_48_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_3072_sqr_48_store%=\n\t" +#else + "BGT.N L_sp_3072_sqr_48_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -8519,48 +13547,566 @@ *rho = (sp_digit)0 - x; } +#ifdef WOLFSSL_SP_SMALL +/* Mul a by digit b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision digit. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_3072_mul_d_96(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* A[0] * B */ + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_3072_mul_d_96_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x180\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mul_d_96_word%=\n\t" +#else + "BLT.N L_sp_3072_mul_d_96_word%=\n\t" +#endif + "STR r3, [%[r], #384]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); +} + +#else /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_3072_mul_d_96(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_mul_d_96(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_3072_mul_d_96(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #384\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[12] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[13] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[14] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[15] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[16] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[17] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[18] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[19] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[20] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[21] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[22] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[23] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[24] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[25] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[26] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[27] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[28] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[29] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[30] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[31] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[32] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[33] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[34] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[35] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[36] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[37] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[38] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[39] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[40] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[41] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[42] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[43] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[44] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[45] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[46] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[47] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[48] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[49] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[50] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[51] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[52] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[53] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[54] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[55] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[56] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[57] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[58] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[59] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[60] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[61] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[62] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[63] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[64] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[65] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[66] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[67] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[68] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[69] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[70] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[71] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[72] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[73] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[74] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[75] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[76] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[77] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[78] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[79] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[80] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[81] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[82] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[83] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[84] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[85] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[86] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[87] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[88] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[89] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[90] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[91] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[92] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[93] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[94] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[95] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "STR r3, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH) /* r = 2^n mod m where n is the number of bits to reduce by. * Given m must be 3072 bits, just need to subtract. @@ -8576,6 +14122,57 @@ sp_3072_sub_in_place_48(r, m); } +#ifdef WOLFSSL_SP_SMALL +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_cond_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_3072_cond_sub_48_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0xc0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_cond_sub_48_words%=\n\t" +#else + "BLT.N L_sp_3072_cond_sub_48_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -8584,141 +14181,1131 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_cond_sub_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_3072_cond_sub_48(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r5, #192\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_3072_mont_reduce_48_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r9, [%[m], #48]\n\t" + "LDR r12, [%[a], #48]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r9, [%[m], #52]\n\t" + "LDR r12, [%[a], #52]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #52]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r9, [%[m], #56]\n\t" + "LDR r12, [%[a], #56]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #56]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r9, [%[m], #60]\n\t" + "LDR r12, [%[a], #60]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #60]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r9, [%[m], #64]\n\t" + "LDR r12, [%[a], #64]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #64]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r9, [%[m], #68]\n\t" + "LDR r12, [%[a], #68]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #68]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r9, [%[m], #72]\n\t" + "LDR r12, [%[a], #72]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #72]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r9, [%[m], #76]\n\t" + "LDR r12, [%[a], #76]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #76]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r9, [%[m], #80]\n\t" + "LDR r12, [%[a], #80]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #80]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r9, [%[m], #84]\n\t" + "LDR r12, [%[a], #84]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #84]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r9, [%[m], #88]\n\t" + "LDR r12, [%[a], #88]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #88]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r9, [%[m], #92]\n\t" + "LDR r12, [%[a], #92]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #92]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r9, [%[m], #96]\n\t" + "LDR r12, [%[a], #96]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #96]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r9, [%[m], #100]\n\t" + "LDR r12, [%[a], #100]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #100]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r9, [%[m], #104]\n\t" + "LDR r12, [%[a], #104]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #104]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r9, [%[m], #108]\n\t" + "LDR r12, [%[a], #108]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #108]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r9, [%[m], #112]\n\t" + "LDR r12, [%[a], #112]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #112]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r9, [%[m], #116]\n\t" + "LDR r12, [%[a], #116]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #116]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r9, [%[m], #120]\n\t" + "LDR r12, [%[a], #120]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #120]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r9, [%[m], #124]\n\t" + "LDR r12, [%[a], #124]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #124]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r9, [%[m], #128]\n\t" + "LDR r12, [%[a], #128]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #128]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r9, [%[m], #132]\n\t" + "LDR r12, [%[a], #132]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #132]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r9, [%[m], #136]\n\t" + "LDR r12, [%[a], #136]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #136]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r9, [%[m], #140]\n\t" + "LDR r12, [%[a], #140]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #140]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r9, [%[m], #144]\n\t" + "LDR r12, [%[a], #144]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #144]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r9, [%[m], #148]\n\t" + "LDR r12, [%[a], #148]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #148]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r9, [%[m], #152]\n\t" + "LDR r12, [%[a], #152]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #152]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r9, [%[m], #156]\n\t" + "LDR r12, [%[a], #156]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #156]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r9, [%[m], #160]\n\t" + "LDR r12, [%[a], #160]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #160]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r9, [%[m], #164]\n\t" + "LDR r12, [%[a], #164]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #164]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r9, [%[m], #168]\n\t" + "LDR r12, [%[a], #168]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #168]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r9, [%[m], #172]\n\t" + "LDR r12, [%[a], #172]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #172]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r9, [%[m], #176]\n\t" + "LDR r12, [%[a], #176]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #176]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r9, [%[m], #180]\n\t" + "LDR r12, [%[a], #180]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #180]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+46] += m[46] * mu */ + "LDR r9, [%[m], #184]\n\t" + "LDR r12, [%[a], #184]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #184]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+47] += m[47] * mu */ + "LDR r9, [%[m], #188]\n\t" + "LDR r12, [%[a], #188]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #188]\n\t" + "LDR r12, [%[a], #192]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #192]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0xc0\n\t" +#ifdef __GNUC__ + "BLT L_sp_3072_mont_reduce_48_word%=\n\t" +#else + "BLT.W L_sp_3072_mont_reduce_48_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); - - return c; + sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp); } +#else /* Reduce the number back to 3072 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #192\n\t" - "\n1:\n\t" + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_48_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #184\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_48_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0xc0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mont_reduce_48_mul%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_48_mul%=\n\t" +#endif + "LDR r10, [%[a], #192]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #192]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0xc0\n\t" #if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" + "BLT L_sp_3072_mont_reduce_48_word%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_48_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp); +} + +#endif /* !WOLFSSL_SP_SMALL */ #else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_3072_mont_reduce_48_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r12, [%[m], #48]\n\t" + "LDR r11, [%[a], #48]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r12, [%[m], #52]\n\t" + "LDR r11, [%[a], #52]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r12, [%[m], #56]\n\t" + "LDR r11, [%[a], #56]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r12, [%[m], #60]\n\t" + "LDR r11, [%[a], #60]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r12, [%[m], #64]\n\t" + "LDR r11, [%[a], #64]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r12, [%[m], #68]\n\t" + "LDR r11, [%[a], #68]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r12, [%[m], #72]\n\t" + "LDR r11, [%[a], #72]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r12, [%[m], #76]\n\t" + "LDR r11, [%[a], #76]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r12, [%[m], #80]\n\t" + "LDR r11, [%[a], #80]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r12, [%[m], #84]\n\t" + "LDR r11, [%[a], #84]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r12, [%[m], #88]\n\t" + "LDR r11, [%[a], #88]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r12, [%[m], #92]\n\t" + "LDR r11, [%[a], #92]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r12, [%[m], #96]\n\t" + "LDR r11, [%[a], #96]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r12, [%[m], #100]\n\t" + "LDR r11, [%[a], #100]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r12, [%[m], #104]\n\t" + "LDR r11, [%[a], #104]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r12, [%[m], #108]\n\t" + "LDR r11, [%[a], #108]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r12, [%[m], #112]\n\t" + "LDR r11, [%[a], #112]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r12, [%[m], #116]\n\t" + "LDR r11, [%[a], #116]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r12, [%[m], #120]\n\t" + "LDR r11, [%[a], #120]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r12, [%[m], #124]\n\t" + "LDR r11, [%[a], #124]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r12, [%[m], #128]\n\t" + "LDR r11, [%[a], #128]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r12, [%[m], #132]\n\t" + "LDR r11, [%[a], #132]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r12, [%[m], #136]\n\t" + "LDR r11, [%[a], #136]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r12, [%[m], #140]\n\t" + "LDR r11, [%[a], #140]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r12, [%[m], #144]\n\t" + "LDR r11, [%[a], #144]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r12, [%[m], #148]\n\t" + "LDR r11, [%[a], #148]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r12, [%[m], #152]\n\t" + "LDR r11, [%[a], #152]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r12, [%[m], #156]\n\t" + "LDR r11, [%[a], #156]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r12, [%[m], #160]\n\t" + "LDR r11, [%[a], #160]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r12, [%[m], #164]\n\t" + "LDR r11, [%[a], #164]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r12, [%[m], #168]\n\t" + "LDR r11, [%[a], #168]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r12, [%[m], #172]\n\t" + "LDR r11, [%[a], #172]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r12, [%[m], #176]\n\t" + "LDR r11, [%[a], #176]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r12, [%[m], #180]\n\t" + "LDR r11, [%[a], #180]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #180]\n\t" /* a[i+46] += m[46] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r12, [%[m], #184]\n\t" + "LDR r11, [%[a], #184]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #184]\n\t" /* a[i+47] += m[47] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[47] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[47] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #184\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r12, [%[m], #188]\n\t" + "LDR r11, [%[a], #188]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #192]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #188]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #192]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0xc0\n\t" +#ifdef __GNUC__ + "BLT L_sp_3072_mont_reduce_48_word%=\n\t" +#else + "BLT.W L_sp_3072_mont_reduce_48_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_48(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ - sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - ca); + __asm__ __volatile__ ( + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_48_word%=:\n\t" + /* mu = a[i] * mp */ + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_48_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+1] += m[j+1] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0xc0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mont_reduce_48_mul%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_48_mul%=\n\t" +#endif + "LDR r10, [%[a], #192]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #192]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0xc0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mont_reduce_48_word%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_48_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_3072_cond_sub_48(a - 48, a, m, (sp_digit)0 - mp); } +#endif /* !WOLFSSL_SP_SMALL */ +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -8726,7 +15313,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -8740,7 +15327,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -8749,48 +15336,327 @@ sp_3072_mont_reduce_48(r, m, mp); } +#ifdef WOLFSSL_SP_SMALL /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #192\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_3072_mul_d_48_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0xc0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mul_d_48_word%=\n\t" +#else + "BLT.N L_sp_3072_mul_d_48_word%=\n\t" +#endif + "STR r3, [%[r], #192]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); +} + +#else +/* Mul a by digit b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision digit. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_mul_d_48(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_3072_mul_d_48(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* A[0] * B */ + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[12] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[13] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[14] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[15] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[16] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[17] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[18] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[19] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[20] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[21] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[22] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[23] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[24] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[25] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[26] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[27] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[28] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[29] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[30] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[31] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[32] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[33] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[34] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[35] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[36] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[37] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[38] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[39] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[40] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[41] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[42] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[43] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[44] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[45] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[46] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[47] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "STR r3, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -8800,49 +15666,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_3072_word_48(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_3072_word_48_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_3072_word_48_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* Compare a with b in constant time. * * a A single precision integer. @@ -8850,44 +15801,577 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_3072_cmp_48(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_3072_cmp_48(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_3072_cmp_48(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #188\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0xbc\n\t" + "\n" + "L_sp_3072_cmp_48_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_3072_cmp_48_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #188]\n\t" + "LDR r5, [%[b], #188]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #184]\n\t" + "LDR r5, [%[b], #184]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #180]\n\t" + "LDR r5, [%[b], #180]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #176]\n\t" + "LDR r5, [%[b], #176]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #172]\n\t" + "LDR r5, [%[b], #172]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #168]\n\t" + "LDR r5, [%[b], #168]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #164]\n\t" + "LDR r5, [%[b], #164]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #160]\n\t" + "LDR r5, [%[b], #160]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #156]\n\t" + "LDR r5, [%[b], #156]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #152]\n\t" + "LDR r5, [%[b], #152]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #148]\n\t" + "LDR r5, [%[b], #148]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #144]\n\t" + "LDR r5, [%[b], #144]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #140]\n\t" + "LDR r5, [%[b], #140]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #136]\n\t" + "LDR r5, [%[b], #136]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #132]\n\t" + "LDR r5, [%[b], #132]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #128]\n\t" + "LDR r5, [%[b], #128]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #124]\n\t" + "LDR r5, [%[b], #124]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #120]\n\t" + "LDR r5, [%[b], #120]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #116]\n\t" + "LDR r5, [%[b], #116]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #112]\n\t" + "LDR r5, [%[b], #112]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #108]\n\t" + "LDR r5, [%[b], #108]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #104]\n\t" + "LDR r5, [%[b], #104]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #100]\n\t" + "LDR r5, [%[b], #100]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #96]\n\t" + "LDR r5, [%[b], #96]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #92]\n\t" + "LDR r5, [%[b], #92]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #88]\n\t" + "LDR r5, [%[b], #88]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #84]\n\t" + "LDR r5, [%[b], #84]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #80]\n\t" + "LDR r5, [%[b], #80]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #76]\n\t" + "LDR r5, [%[b], #76]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #72]\n\t" + "LDR r5, [%[b], #72]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #68]\n\t" + "LDR r5, [%[b], #68]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #64]\n\t" + "LDR r5, [%[b], #64]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "LDR r5, [%[b], #60]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #56]\n\t" + "LDR r5, [%[b], #56]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #52]\n\t" + "LDR r5, [%[b], #52]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #48]\n\t" + "LDR r5, [%[b], #48]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Divide d in a and put remainder into r (m*d + r = a) @@ -8899,8 +16383,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_48(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[96], t2[49]; sp_digit div, r1; @@ -9286,6 +16770,7 @@ } #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -9294,143 +16779,1973 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_3072_cond_sub_96(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_cond_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_3072_cond_sub_96(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_3072_cond_sub_96_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x180\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_cond_sub_96_words%=\n\t" +#else + "BLT.N L_sp_3072_cond_sub_96_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" + ); + return (uint32_t)(size_t)r; +} - __asm__ __volatile__ ( - "mov r5, #1\n\t" - "lsl r5, r5, #8\n\t" - "add r5, r5, #128\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_cond_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_3072_cond_sub_96(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_3072_mont_reduce_96_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r9, [%[m], #48]\n\t" + "LDR r12, [%[a], #48]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r9, [%[m], #52]\n\t" + "LDR r12, [%[a], #52]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #52]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r9, [%[m], #56]\n\t" + "LDR r12, [%[a], #56]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #56]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r9, [%[m], #60]\n\t" + "LDR r12, [%[a], #60]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #60]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r9, [%[m], #64]\n\t" + "LDR r12, [%[a], #64]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #64]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r9, [%[m], #68]\n\t" + "LDR r12, [%[a], #68]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #68]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r9, [%[m], #72]\n\t" + "LDR r12, [%[a], #72]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #72]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r9, [%[m], #76]\n\t" + "LDR r12, [%[a], #76]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #76]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r9, [%[m], #80]\n\t" + "LDR r12, [%[a], #80]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #80]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r9, [%[m], #84]\n\t" + "LDR r12, [%[a], #84]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #84]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r9, [%[m], #88]\n\t" + "LDR r12, [%[a], #88]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #88]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r9, [%[m], #92]\n\t" + "LDR r12, [%[a], #92]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #92]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r9, [%[m], #96]\n\t" + "LDR r12, [%[a], #96]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #96]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r9, [%[m], #100]\n\t" + "LDR r12, [%[a], #100]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #100]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r9, [%[m], #104]\n\t" + "LDR r12, [%[a], #104]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #104]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r9, [%[m], #108]\n\t" + "LDR r12, [%[a], #108]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #108]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r9, [%[m], #112]\n\t" + "LDR r12, [%[a], #112]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #112]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r9, [%[m], #116]\n\t" + "LDR r12, [%[a], #116]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #116]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r9, [%[m], #120]\n\t" + "LDR r12, [%[a], #120]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #120]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r9, [%[m], #124]\n\t" + "LDR r12, [%[a], #124]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #124]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r9, [%[m], #128]\n\t" + "LDR r12, [%[a], #128]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #128]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r9, [%[m], #132]\n\t" + "LDR r12, [%[a], #132]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #132]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r9, [%[m], #136]\n\t" + "LDR r12, [%[a], #136]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #136]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r9, [%[m], #140]\n\t" + "LDR r12, [%[a], #140]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #140]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r9, [%[m], #144]\n\t" + "LDR r12, [%[a], #144]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #144]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r9, [%[m], #148]\n\t" + "LDR r12, [%[a], #148]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #148]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r9, [%[m], #152]\n\t" + "LDR r12, [%[a], #152]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #152]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r9, [%[m], #156]\n\t" + "LDR r12, [%[a], #156]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #156]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r9, [%[m], #160]\n\t" + "LDR r12, [%[a], #160]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #160]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r9, [%[m], #164]\n\t" + "LDR r12, [%[a], #164]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #164]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r9, [%[m], #168]\n\t" + "LDR r12, [%[a], #168]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #168]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r9, [%[m], #172]\n\t" + "LDR r12, [%[a], #172]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #172]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r9, [%[m], #176]\n\t" + "LDR r12, [%[a], #176]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #176]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r9, [%[m], #180]\n\t" + "LDR r12, [%[a], #180]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #180]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+46] += m[46] * mu */ + "LDR r9, [%[m], #184]\n\t" + "LDR r12, [%[a], #184]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #184]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+47] += m[47] * mu */ + "LDR r9, [%[m], #188]\n\t" + "LDR r12, [%[a], #188]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #188]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+48] += m[48] * mu */ + "LDR r9, [%[m], #192]\n\t" + "LDR r12, [%[a], #192]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #192]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+49] += m[49] * mu */ + "LDR r9, [%[m], #196]\n\t" + "LDR r12, [%[a], #196]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #196]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+50] += m[50] * mu */ + "LDR r9, [%[m], #200]\n\t" + "LDR r12, [%[a], #200]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #200]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+51] += m[51] * mu */ + "LDR r9, [%[m], #204]\n\t" + "LDR r12, [%[a], #204]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #204]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+52] += m[52] * mu */ + "LDR r9, [%[m], #208]\n\t" + "LDR r12, [%[a], #208]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #208]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+53] += m[53] * mu */ + "LDR r9, [%[m], #212]\n\t" + "LDR r12, [%[a], #212]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #212]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+54] += m[54] * mu */ + "LDR r9, [%[m], #216]\n\t" + "LDR r12, [%[a], #216]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #216]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+55] += m[55] * mu */ + "LDR r9, [%[m], #220]\n\t" + "LDR r12, [%[a], #220]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #220]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+56] += m[56] * mu */ + "LDR r9, [%[m], #224]\n\t" + "LDR r12, [%[a], #224]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #224]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+57] += m[57] * mu */ + "LDR r9, [%[m], #228]\n\t" + "LDR r12, [%[a], #228]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #228]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+58] += m[58] * mu */ + "LDR r9, [%[m], #232]\n\t" + "LDR r12, [%[a], #232]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #232]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+59] += m[59] * mu */ + "LDR r9, [%[m], #236]\n\t" + "LDR r12, [%[a], #236]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #236]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+60] += m[60] * mu */ + "LDR r9, [%[m], #240]\n\t" + "LDR r12, [%[a], #240]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #240]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+61] += m[61] * mu */ + "LDR r9, [%[m], #244]\n\t" + "LDR r12, [%[a], #244]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #244]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+62] += m[62] * mu */ + "LDR r9, [%[m], #248]\n\t" + "LDR r12, [%[a], #248]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #248]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+63] += m[63] * mu */ + "LDR r9, [%[m], #252]\n\t" + "LDR r12, [%[a], #252]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #252]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+64] += m[64] * mu */ + "LDR r9, [%[m], #256]\n\t" + "LDR r12, [%[a], #256]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #256]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+65] += m[65] * mu */ + "LDR r9, [%[m], #260]\n\t" + "LDR r12, [%[a], #260]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #260]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+66] += m[66] * mu */ + "LDR r9, [%[m], #264]\n\t" + "LDR r12, [%[a], #264]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #264]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+67] += m[67] * mu */ + "LDR r9, [%[m], #268]\n\t" + "LDR r12, [%[a], #268]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #268]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+68] += m[68] * mu */ + "LDR r9, [%[m], #272]\n\t" + "LDR r12, [%[a], #272]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #272]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+69] += m[69] * mu */ + "LDR r9, [%[m], #276]\n\t" + "LDR r12, [%[a], #276]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #276]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+70] += m[70] * mu */ + "LDR r9, [%[m], #280]\n\t" + "LDR r12, [%[a], #280]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #280]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+71] += m[71] * mu */ + "LDR r9, [%[m], #284]\n\t" + "LDR r12, [%[a], #284]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #284]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+72] += m[72] * mu */ + "LDR r9, [%[m], #288]\n\t" + "LDR r12, [%[a], #288]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #288]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+73] += m[73] * mu */ + "LDR r9, [%[m], #292]\n\t" + "LDR r12, [%[a], #292]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #292]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+74] += m[74] * mu */ + "LDR r9, [%[m], #296]\n\t" + "LDR r12, [%[a], #296]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #296]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+75] += m[75] * mu */ + "LDR r9, [%[m], #300]\n\t" + "LDR r12, [%[a], #300]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #300]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+76] += m[76] * mu */ + "LDR r9, [%[m], #304]\n\t" + "LDR r12, [%[a], #304]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #304]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+77] += m[77] * mu */ + "LDR r9, [%[m], #308]\n\t" + "LDR r12, [%[a], #308]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #308]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+78] += m[78] * mu */ + "LDR r9, [%[m], #312]\n\t" + "LDR r12, [%[a], #312]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #312]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+79] += m[79] * mu */ + "LDR r9, [%[m], #316]\n\t" + "LDR r12, [%[a], #316]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #316]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+80] += m[80] * mu */ + "LDR r9, [%[m], #320]\n\t" + "LDR r12, [%[a], #320]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #320]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+81] += m[81] * mu */ + "LDR r9, [%[m], #324]\n\t" + "LDR r12, [%[a], #324]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #324]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+82] += m[82] * mu */ + "LDR r9, [%[m], #328]\n\t" + "LDR r12, [%[a], #328]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #328]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+83] += m[83] * mu */ + "LDR r9, [%[m], #332]\n\t" + "LDR r12, [%[a], #332]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #332]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+84] += m[84] * mu */ + "LDR r9, [%[m], #336]\n\t" + "LDR r12, [%[a], #336]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #336]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+85] += m[85] * mu */ + "LDR r9, [%[m], #340]\n\t" + "LDR r12, [%[a], #340]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #340]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+86] += m[86] * mu */ + "LDR r9, [%[m], #344]\n\t" + "LDR r12, [%[a], #344]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #344]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+87] += m[87] * mu */ + "LDR r9, [%[m], #348]\n\t" + "LDR r12, [%[a], #348]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #348]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+88] += m[88] * mu */ + "LDR r9, [%[m], #352]\n\t" + "LDR r12, [%[a], #352]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #352]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+89] += m[89] * mu */ + "LDR r9, [%[m], #356]\n\t" + "LDR r12, [%[a], #356]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #356]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+90] += m[90] * mu */ + "LDR r9, [%[m], #360]\n\t" + "LDR r12, [%[a], #360]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #360]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+91] += m[91] * mu */ + "LDR r9, [%[m], #364]\n\t" + "LDR r12, [%[a], #364]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #364]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+92] += m[92] * mu */ + "LDR r9, [%[m], #368]\n\t" + "LDR r12, [%[a], #368]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #368]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+93] += m[93] * mu */ + "LDR r9, [%[m], #372]\n\t" + "LDR r12, [%[a], #372]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #372]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+94] += m[94] * mu */ + "LDR r9, [%[m], #376]\n\t" + "LDR r12, [%[a], #376]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #376]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+95] += m[95] * mu */ + "LDR r9, [%[m], #380]\n\t" + "LDR r12, [%[a], #380]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #380]\n\t" + "LDR r12, [%[a], #384]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #384]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x180\n\t" +#ifdef __GNUC__ + "BLT L_sp_3072_mont_reduce_96_word%=\n\t" +#else + "BLT.W L_sp_3072_mont_reduce_96_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp); } +#else /* Reduce the number back to 3072 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #384\n\t" - "\n1:\n\t" + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_96_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #376\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_96_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x180\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mont_reduce_96_mul%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_96_mul%=\n\t" +#endif + "LDR r10, [%[a], #384]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #384]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x180\n\t" #if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" + "BLT L_sp_3072_mont_reduce_96_word%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_96_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp); +} + +#endif /* !WOLFSSL_SP_SMALL */ #else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_3072_mont_reduce_96_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r12, [%[m], #48]\n\t" + "LDR r11, [%[a], #48]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r12, [%[m], #52]\n\t" + "LDR r11, [%[a], #52]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r12, [%[m], #56]\n\t" + "LDR r11, [%[a], #56]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r12, [%[m], #60]\n\t" + "LDR r11, [%[a], #60]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r12, [%[m], #64]\n\t" + "LDR r11, [%[a], #64]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r12, [%[m], #68]\n\t" + "LDR r11, [%[a], #68]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r12, [%[m], #72]\n\t" + "LDR r11, [%[a], #72]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r12, [%[m], #76]\n\t" + "LDR r11, [%[a], #76]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r12, [%[m], #80]\n\t" + "LDR r11, [%[a], #80]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r12, [%[m], #84]\n\t" + "LDR r11, [%[a], #84]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r12, [%[m], #88]\n\t" + "LDR r11, [%[a], #88]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r12, [%[m], #92]\n\t" + "LDR r11, [%[a], #92]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r12, [%[m], #96]\n\t" + "LDR r11, [%[a], #96]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r12, [%[m], #100]\n\t" + "LDR r11, [%[a], #100]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r12, [%[m], #104]\n\t" + "LDR r11, [%[a], #104]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r12, [%[m], #108]\n\t" + "LDR r11, [%[a], #108]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r12, [%[m], #112]\n\t" + "LDR r11, [%[a], #112]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r12, [%[m], #116]\n\t" + "LDR r11, [%[a], #116]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r12, [%[m], #120]\n\t" + "LDR r11, [%[a], #120]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r12, [%[m], #124]\n\t" + "LDR r11, [%[a], #124]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r12, [%[m], #128]\n\t" + "LDR r11, [%[a], #128]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r12, [%[m], #132]\n\t" + "LDR r11, [%[a], #132]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r12, [%[m], #136]\n\t" + "LDR r11, [%[a], #136]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r12, [%[m], #140]\n\t" + "LDR r11, [%[a], #140]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r12, [%[m], #144]\n\t" + "LDR r11, [%[a], #144]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r12, [%[m], #148]\n\t" + "LDR r11, [%[a], #148]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r12, [%[m], #152]\n\t" + "LDR r11, [%[a], #152]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r12, [%[m], #156]\n\t" + "LDR r11, [%[a], #156]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r12, [%[m], #160]\n\t" + "LDR r11, [%[a], #160]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r12, [%[m], #164]\n\t" + "LDR r11, [%[a], #164]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r12, [%[m], #168]\n\t" + "LDR r11, [%[a], #168]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r12, [%[m], #172]\n\t" + "LDR r11, [%[a], #172]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r12, [%[m], #176]\n\t" + "LDR r11, [%[a], #176]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r12, [%[m], #180]\n\t" + "LDR r11, [%[a], #180]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #180]\n\t" + /* a[i+46] += m[46] * mu */ + "LDR r12, [%[m], #184]\n\t" + "LDR r11, [%[a], #184]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #184]\n\t" + /* a[i+47] += m[47] * mu */ + "LDR r12, [%[m], #188]\n\t" + "LDR r11, [%[a], #188]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #188]\n\t" + /* a[i+48] += m[48] * mu */ + "LDR r12, [%[m], #192]\n\t" + "LDR r11, [%[a], #192]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #192]\n\t" + /* a[i+49] += m[49] * mu */ + "LDR r12, [%[m], #196]\n\t" + "LDR r11, [%[a], #196]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #196]\n\t" + /* a[i+50] += m[50] * mu */ + "LDR r12, [%[m], #200]\n\t" + "LDR r11, [%[a], #200]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #200]\n\t" + /* a[i+51] += m[51] * mu */ + "LDR r12, [%[m], #204]\n\t" + "LDR r11, [%[a], #204]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #204]\n\t" + /* a[i+52] += m[52] * mu */ + "LDR r12, [%[m], #208]\n\t" + "LDR r11, [%[a], #208]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #208]\n\t" + /* a[i+53] += m[53] * mu */ + "LDR r12, [%[m], #212]\n\t" + "LDR r11, [%[a], #212]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #212]\n\t" + /* a[i+54] += m[54] * mu */ + "LDR r12, [%[m], #216]\n\t" + "LDR r11, [%[a], #216]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #216]\n\t" + /* a[i+55] += m[55] * mu */ + "LDR r12, [%[m], #220]\n\t" + "LDR r11, [%[a], #220]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #220]\n\t" + /* a[i+56] += m[56] * mu */ + "LDR r12, [%[m], #224]\n\t" + "LDR r11, [%[a], #224]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #224]\n\t" + /* a[i+57] += m[57] * mu */ + "LDR r12, [%[m], #228]\n\t" + "LDR r11, [%[a], #228]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #228]\n\t" + /* a[i+58] += m[58] * mu */ + "LDR r12, [%[m], #232]\n\t" + "LDR r11, [%[a], #232]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #232]\n\t" + /* a[i+59] += m[59] * mu */ + "LDR r12, [%[m], #236]\n\t" + "LDR r11, [%[a], #236]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #236]\n\t" + /* a[i+60] += m[60] * mu */ + "LDR r12, [%[m], #240]\n\t" + "LDR r11, [%[a], #240]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #240]\n\t" + /* a[i+61] += m[61] * mu */ + "LDR r12, [%[m], #244]\n\t" + "LDR r11, [%[a], #244]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #244]\n\t" + /* a[i+62] += m[62] * mu */ + "LDR r12, [%[m], #248]\n\t" + "LDR r11, [%[a], #248]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #248]\n\t" + /* a[i+63] += m[63] * mu */ + "LDR r12, [%[m], #252]\n\t" + "LDR r11, [%[a], #252]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #252]\n\t" + /* a[i+64] += m[64] * mu */ + "LDR r12, [%[m], #256]\n\t" + "LDR r11, [%[a], #256]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #256]\n\t" + /* a[i+65] += m[65] * mu */ + "LDR r12, [%[m], #260]\n\t" + "LDR r11, [%[a], #260]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #260]\n\t" + /* a[i+66] += m[66] * mu */ + "LDR r12, [%[m], #264]\n\t" + "LDR r11, [%[a], #264]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #264]\n\t" + /* a[i+67] += m[67] * mu */ + "LDR r12, [%[m], #268]\n\t" + "LDR r11, [%[a], #268]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #268]\n\t" + /* a[i+68] += m[68] * mu */ + "LDR r12, [%[m], #272]\n\t" + "LDR r11, [%[a], #272]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #272]\n\t" + /* a[i+69] += m[69] * mu */ + "LDR r12, [%[m], #276]\n\t" + "LDR r11, [%[a], #276]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #276]\n\t" + /* a[i+70] += m[70] * mu */ + "LDR r12, [%[m], #280]\n\t" + "LDR r11, [%[a], #280]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #280]\n\t" + /* a[i+71] += m[71] * mu */ + "LDR r12, [%[m], #284]\n\t" + "LDR r11, [%[a], #284]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #284]\n\t" + /* a[i+72] += m[72] * mu */ + "LDR r12, [%[m], #288]\n\t" + "LDR r11, [%[a], #288]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #288]\n\t" + /* a[i+73] += m[73] * mu */ + "LDR r12, [%[m], #292]\n\t" + "LDR r11, [%[a], #292]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #292]\n\t" + /* a[i+74] += m[74] * mu */ + "LDR r12, [%[m], #296]\n\t" + "LDR r11, [%[a], #296]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #296]\n\t" + /* a[i+75] += m[75] * mu */ + "LDR r12, [%[m], #300]\n\t" + "LDR r11, [%[a], #300]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #300]\n\t" + /* a[i+76] += m[76] * mu */ + "LDR r12, [%[m], #304]\n\t" + "LDR r11, [%[a], #304]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #304]\n\t" + /* a[i+77] += m[77] * mu */ + "LDR r12, [%[m], #308]\n\t" + "LDR r11, [%[a], #308]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #308]\n\t" + /* a[i+78] += m[78] * mu */ + "LDR r12, [%[m], #312]\n\t" + "LDR r11, [%[a], #312]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #312]\n\t" + /* a[i+79] += m[79] * mu */ + "LDR r12, [%[m], #316]\n\t" + "LDR r11, [%[a], #316]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #316]\n\t" + /* a[i+80] += m[80] * mu */ + "LDR r12, [%[m], #320]\n\t" + "LDR r11, [%[a], #320]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #320]\n\t" + /* a[i+81] += m[81] * mu */ + "LDR r12, [%[m], #324]\n\t" + "LDR r11, [%[a], #324]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #324]\n\t" + /* a[i+82] += m[82] * mu */ + "LDR r12, [%[m], #328]\n\t" + "LDR r11, [%[a], #328]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #328]\n\t" + /* a[i+83] += m[83] * mu */ + "LDR r12, [%[m], #332]\n\t" + "LDR r11, [%[a], #332]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #332]\n\t" + /* a[i+84] += m[84] * mu */ + "LDR r12, [%[m], #336]\n\t" + "LDR r11, [%[a], #336]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #336]\n\t" + /* a[i+85] += m[85] * mu */ + "LDR r12, [%[m], #340]\n\t" + "LDR r11, [%[a], #340]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #340]\n\t" + /* a[i+86] += m[86] * mu */ + "LDR r12, [%[m], #344]\n\t" + "LDR r11, [%[a], #344]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #344]\n\t" + /* a[i+87] += m[87] * mu */ + "LDR r12, [%[m], #348]\n\t" + "LDR r11, [%[a], #348]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #348]\n\t" + /* a[i+88] += m[88] * mu */ + "LDR r12, [%[m], #352]\n\t" + "LDR r11, [%[a], #352]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #352]\n\t" + /* a[i+89] += m[89] * mu */ + "LDR r12, [%[m], #356]\n\t" + "LDR r11, [%[a], #356]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #356]\n\t" + /* a[i+90] += m[90] * mu */ + "LDR r12, [%[m], #360]\n\t" + "LDR r11, [%[a], #360]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #360]\n\t" + /* a[i+91] += m[91] * mu */ + "LDR r12, [%[m], #364]\n\t" + "LDR r11, [%[a], #364]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #364]\n\t" + /* a[i+92] += m[92] * mu */ + "LDR r12, [%[m], #368]\n\t" + "LDR r11, [%[a], #368]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #368]\n\t" + /* a[i+93] += m[93] * mu */ + "LDR r12, [%[m], #372]\n\t" + "LDR r11, [%[a], #372]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #372]\n\t" /* a[i+94] += m[94] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r12, [%[m], #376]\n\t" + "LDR r11, [%[a], #376]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #376]\n\t" /* a[i+95] += m[95] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[95] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[95] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #376\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r12, [%[m], #380]\n\t" + "LDR r11, [%[a], #380]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #384]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #380]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #384]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x180\n\t" +#ifdef __GNUC__ + "BLT L_sp_3072_mont_reduce_96_word%=\n\t" +#else + "BLT.W L_sp_3072_mont_reduce_96_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 3072 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_3072_mont_reduce_96(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ - sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - ca); + __asm__ __volatile__ ( + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_96_word%=:\n\t" + /* mu = a[i] * mp */ + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_3072_mont_reduce_96_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+1] += m[j+1] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x180\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mont_reduce_96_mul%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_96_mul%=\n\t" +#endif + "LDR r10, [%[a], #384]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #384]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x180\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_mont_reduce_96_word%=\n\t" +#else + "BLT.N L_sp_3072_mont_reduce_96_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_3072_cond_sub_96(a - 96, a, m, (sp_digit)0 - mp); } +#endif /* !WOLFSSL_SP_SMALL */ +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -9438,7 +18753,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_96(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -9452,7 +18767,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_96(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -9468,40 +18783,44 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r5, #1\n\t" - "lsl r5, r5, #8\n\t" - "add r5, r5, #128\n\t" - "add r6, r6, r5\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r11, #0x0\n\t" + "ADD r12, %[a], #0x180\n\t" + "\n" + "L_sp_3072_sub_96_word%=:\n\t" + "RSBS r11, r11, #0x0\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC r11, r3, r3\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_3072_sub_96_word%=\n\t" +#else + "BNE.N L_sp_3072_sub_96_word%=\n\t" +#endif + "MOV %[r], r11\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #else @@ -9511,262 +18830,197 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_sub_96(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_3072_sub_96(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -9776,49 +19030,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_3072_word_96(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_3072_word_96_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_3072_word_96_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * @@ -9828,8 +19167,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_96_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[192], t2[97]; sp_digit div, r1; @@ -9891,6 +19230,7 @@ } #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH) +#if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY) /* AND m into each word of a and store in r. * * r A single precision integer. @@ -9928,46 +19268,1105 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_3072_cmp_96(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_3072_cmp_96(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_3072_cmp_96(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #124\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0x17c\n\t" + "\n" + "L_sp_3072_cmp_96_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_3072_cmp_96_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #380]\n\t" + "LDR r5, [%[b], #380]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #376]\n\t" + "LDR r5, [%[b], #376]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #372]\n\t" + "LDR r5, [%[b], #372]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #368]\n\t" + "LDR r5, [%[b], #368]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #364]\n\t" + "LDR r5, [%[b], #364]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #360]\n\t" + "LDR r5, [%[b], #360]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #356]\n\t" + "LDR r5, [%[b], #356]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #352]\n\t" + "LDR r5, [%[b], #352]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #348]\n\t" + "LDR r5, [%[b], #348]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #344]\n\t" + "LDR r5, [%[b], #344]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #340]\n\t" + "LDR r5, [%[b], #340]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #336]\n\t" + "LDR r5, [%[b], #336]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #332]\n\t" + "LDR r5, [%[b], #332]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #328]\n\t" + "LDR r5, [%[b], #328]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #324]\n\t" + "LDR r5, [%[b], #324]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #320]\n\t" + "LDR r5, [%[b], #320]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #316]\n\t" + "LDR r5, [%[b], #316]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #312]\n\t" + "LDR r5, [%[b], #312]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #308]\n\t" + "LDR r5, [%[b], #308]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #304]\n\t" + "LDR r5, [%[b], #304]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #300]\n\t" + "LDR r5, [%[b], #300]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #296]\n\t" + "LDR r5, [%[b], #296]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #292]\n\t" + "LDR r5, [%[b], #292]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #288]\n\t" + "LDR r5, [%[b], #288]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #284]\n\t" + "LDR r5, [%[b], #284]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #280]\n\t" + "LDR r5, [%[b], #280]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #276]\n\t" + "LDR r5, [%[b], #276]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #272]\n\t" + "LDR r5, [%[b], #272]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #268]\n\t" + "LDR r5, [%[b], #268]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #264]\n\t" + "LDR r5, [%[b], #264]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #260]\n\t" + "LDR r5, [%[b], #260]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #256]\n\t" + "LDR r5, [%[b], #256]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #252]\n\t" + "LDR r5, [%[b], #252]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #248]\n\t" + "LDR r5, [%[b], #248]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #244]\n\t" + "LDR r5, [%[b], #244]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #240]\n\t" + "LDR r5, [%[b], #240]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #236]\n\t" + "LDR r5, [%[b], #236]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #232]\n\t" + "LDR r5, [%[b], #232]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #228]\n\t" + "LDR r5, [%[b], #228]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #224]\n\t" + "LDR r5, [%[b], #224]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #220]\n\t" + "LDR r5, [%[b], #220]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #216]\n\t" + "LDR r5, [%[b], #216]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #212]\n\t" + "LDR r5, [%[b], #212]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #208]\n\t" + "LDR r5, [%[b], #208]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #204]\n\t" + "LDR r5, [%[b], #204]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #200]\n\t" + "LDR r5, [%[b], #200]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #196]\n\t" + "LDR r5, [%[b], #196]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #192]\n\t" + "LDR r5, [%[b], #192]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #188]\n\t" + "LDR r5, [%[b], #188]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #184]\n\t" + "LDR r5, [%[b], #184]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #180]\n\t" + "LDR r5, [%[b], #180]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #176]\n\t" + "LDR r5, [%[b], #176]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #172]\n\t" + "LDR r5, [%[b], #172]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #168]\n\t" + "LDR r5, [%[b], #168]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #164]\n\t" + "LDR r5, [%[b], #164]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #160]\n\t" + "LDR r5, [%[b], #160]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #156]\n\t" + "LDR r5, [%[b], #156]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #152]\n\t" + "LDR r5, [%[b], #152]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #148]\n\t" + "LDR r5, [%[b], #148]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #144]\n\t" + "LDR r5, [%[b], #144]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #140]\n\t" + "LDR r5, [%[b], #140]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #136]\n\t" + "LDR r5, [%[b], #136]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #132]\n\t" + "LDR r5, [%[b], #132]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #128]\n\t" + "LDR r5, [%[b], #128]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #124]\n\t" + "LDR r5, [%[b], #124]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #120]\n\t" + "LDR r5, [%[b], #120]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #116]\n\t" + "LDR r5, [%[b], #116]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #112]\n\t" + "LDR r5, [%[b], #112]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #108]\n\t" + "LDR r5, [%[b], #108]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #104]\n\t" + "LDR r5, [%[b], #104]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #100]\n\t" + "LDR r5, [%[b], #100]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #96]\n\t" + "LDR r5, [%[b], #96]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #92]\n\t" + "LDR r5, [%[b], #92]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #88]\n\t" + "LDR r5, [%[b], #88]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #84]\n\t" + "LDR r5, [%[b], #84]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #80]\n\t" + "LDR r5, [%[b], #80]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #76]\n\t" + "LDR r5, [%[b], #76]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #72]\n\t" + "LDR r5, [%[b], #72]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #68]\n\t" + "LDR r5, [%[b], #68]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #64]\n\t" + "LDR r5, [%[b], #64]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "LDR r5, [%[b], #60]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #56]\n\t" + "LDR r5, [%[b], #56]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #52]\n\t" + "LDR r5, [%[b], #52]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #48]\n\t" + "LDR r5, [%[b], #48]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Divide d in a and put remainder into r (m*d + r = a) @@ -9979,8 +20378,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_3072_div_96(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[192], t2[97]; sp_digit div, r1; @@ -10025,6 +20424,7 @@ return sp_3072_div_96(a, m, NULL, r); } +#endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */ #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ defined(WOLFSSL_HAVE_SP_DH) #ifdef WOLFSSL_SP_SMALL @@ -10488,6 +20888,7 @@ } #ifndef WOLFSSL_RSA_PUBLIC_ONLY +#ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -10496,39 +20897,248 @@ * b A single precision number to add. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_3072_cond_add_48(sp_digit* r, const sp_digit* a, const sp_digit* b, - sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_cond_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_3072_cond_add_48(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #192\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "adds r5, %[c], #-1\n\t" - "ldr r5, [%[a], r8]\n\t" - "adcs r5, r5, r6\n\t" - "mov %[c], #0\n\t" - "adcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_3072_cond_add_48_words%=:\n\t" + "ADDS r5, r5, #0xffffffff\n\t" + "LDR r6, [%[a], r4]\n\t" + "LDR r7, [%[b], r4]\n\t" + "AND r7, r7, %[m]\n\t" + "ADCS r6, r6, r7\n\t" + "ADC r5, r8, r8\n\t" + "STR r6, [%[r], r4]\n\t" + "ADD r4, r4, #0x4\n\t" + "CMP r4, #0xc0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_3072_cond_add_48_words%=\n\t" +#else + "BLT.N L_sp_3072_cond_add_48_words%=\n\t" +#endif + "MOV %[r], r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally add a and b using the mask m. + * m is -1 to add and 0 when not. + * + * r A single precision number representing conditional add result. + * a A single precision number to add with. + * b A single precision number to add. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_3072_cond_add_48(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_3072_cond_add_48(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADDS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "ADC %[r], r10, r10\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ /* RSA private key operation. * * in Array of bytes representing the number to exponentiate, base. @@ -10843,602 +21453,599 @@ #ifdef WOLFSSL_HAVE_SP_DH #ifdef HAVE_FFDHE_3072 +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_3072_lshift_96(sp_digit* r_p, const sp_digit* a_p, byte n_p) +#else static void sp_3072_lshift_96(sp_digit* r, const sp_digit* a, byte n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r6, #31\n\t" - "sub r6, r6, %[n]\n\t" - "add %[a], %[a], #320\n\t" - "add %[r], %[r], #320\n\t" - "ldr r3, [%[a], #60]\n\t" - "lsr r4, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r4, r4, r6\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r4, [%[r], #68]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r3, [%[r], #64]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r2, [%[r], #60]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r4, [%[r], #56]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r3, [%[r], #52]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r2, [%[r], #48]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r4, [%[r], #44]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r3, [%[r], #40]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r2, [%[r], #36]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r4, [%[r], #32]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r3, [%[r], #28]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r2, [%[r], #24]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r4, [%[r], #20]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r3, [%[r], #16]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #4]\n\t" - "str r2, [%[r], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #0]\n\t" - "str r4, [%[r], #8]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r4, [%[a], #60]\n\t" - "str r3, [%[r], #68]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #56]\n\t" - "str r2, [%[r], #64]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #52]\n\t" - "str r4, [%[r], #60]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #48]\n\t" - "str r3, [%[r], #56]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #44]\n\t" - "str r2, [%[r], #52]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #40]\n\t" - "str r4, [%[r], #48]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #36]\n\t" - "str r3, [%[r], #44]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #32]\n\t" - "str r2, [%[r], #40]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #28]\n\t" - "str r4, [%[r], #36]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #24]\n\t" - "str r3, [%[r], #32]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #20]\n\t" - "str r2, [%[r], #28]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #16]\n\t" - "str r4, [%[r], #24]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #12]\n\t" - "str r3, [%[r], #20]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #8]\n\t" - "str r2, [%[r], #16]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #4]\n\t" - "str r4, [%[r], #12]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #0]\n\t" - "str r3, [%[r], #8]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r3, [%[a], #60]\n\t" - "str r2, [%[r], #68]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r4, [%[r], #68]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r3, [%[r], #64]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r2, [%[r], #60]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r4, [%[r], #56]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r3, [%[r], #52]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r2, [%[r], #48]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r4, [%[r], #44]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r3, [%[r], #40]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r2, [%[r], #36]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r4, [%[r], #32]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r3, [%[r], #28]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r2, [%[r], #24]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r4, [%[r], #20]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r3, [%[r], #16]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #4]\n\t" - "str r2, [%[r], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #0]\n\t" - "str r4, [%[r], #8]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r4, [%[a], #60]\n\t" - "str r3, [%[r], #68]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #56]\n\t" - "str r2, [%[r], #64]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #52]\n\t" - "str r4, [%[r], #60]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #48]\n\t" - "str r3, [%[r], #56]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #44]\n\t" - "str r2, [%[r], #52]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #40]\n\t" - "str r4, [%[r], #48]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #36]\n\t" - "str r3, [%[r], #44]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #32]\n\t" - "str r2, [%[r], #40]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #28]\n\t" - "str r4, [%[r], #36]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #24]\n\t" - "str r3, [%[r], #32]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #20]\n\t" - "str r2, [%[r], #28]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #16]\n\t" - "str r4, [%[r], #24]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #12]\n\t" - "str r3, [%[r], #20]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #8]\n\t" - "str r2, [%[r], #16]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #4]\n\t" - "str r4, [%[r], #12]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #0]\n\t" - "str r3, [%[r], #8]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "str r4, [%[r]]\n\t" - "str r2, [%[r], #4]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register byte n __asm__ ("r2") = (byte)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "RSB r7, %[n], #0x1f\n\t" + "LDR r5, [%[a], #380]\n\t" + "LSR r6, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r6, r6, r7\n\t" + "LDR r4, [%[a], #376]\n\t" + "STR r6, [%[r], #384]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #372]\n\t" + "STR r5, [%[r], #380]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #368]\n\t" + "STR r4, [%[r], #376]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #364]\n\t" + "STR r6, [%[r], #372]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #360]\n\t" + "STR r5, [%[r], #368]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #356]\n\t" + "STR r4, [%[r], #364]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #352]\n\t" + "STR r6, [%[r], #360]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #348]\n\t" + "STR r5, [%[r], #356]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #344]\n\t" + "STR r4, [%[r], #352]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #340]\n\t" + "STR r6, [%[r], #348]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #336]\n\t" + "STR r5, [%[r], #344]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #332]\n\t" + "STR r4, [%[r], #340]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #328]\n\t" + "STR r6, [%[r], #336]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #324]\n\t" + "STR r5, [%[r], #332]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #320]\n\t" + "STR r4, [%[r], #328]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #316]\n\t" + "STR r6, [%[r], #324]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #312]\n\t" + "STR r5, [%[r], #320]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #308]\n\t" + "STR r4, [%[r], #316]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #304]\n\t" + "STR r6, [%[r], #312]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #300]\n\t" + "STR r5, [%[r], #308]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #296]\n\t" + "STR r4, [%[r], #304]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #292]\n\t" + "STR r6, [%[r], #300]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #288]\n\t" + "STR r5, [%[r], #296]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #284]\n\t" + "STR r4, [%[r], #292]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #280]\n\t" + "STR r6, [%[r], #288]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #276]\n\t" + "STR r5, [%[r], #284]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #272]\n\t" + "STR r4, [%[r], #280]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #268]\n\t" + "STR r6, [%[r], #276]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #264]\n\t" + "STR r5, [%[r], #272]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #260]\n\t" + "STR r4, [%[r], #268]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #256]\n\t" + "STR r6, [%[r], #264]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #252]\n\t" + "STR r5, [%[r], #260]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #248]\n\t" + "STR r4, [%[r], #256]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #244]\n\t" + "STR r6, [%[r], #252]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #240]\n\t" + "STR r5, [%[r], #248]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #236]\n\t" + "STR r4, [%[r], #244]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #232]\n\t" + "STR r6, [%[r], #240]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #228]\n\t" + "STR r5, [%[r], #236]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #224]\n\t" + "STR r4, [%[r], #232]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #220]\n\t" + "STR r6, [%[r], #228]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #216]\n\t" + "STR r5, [%[r], #224]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #212]\n\t" + "STR r4, [%[r], #220]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #208]\n\t" + "STR r6, [%[r], #216]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #204]\n\t" + "STR r5, [%[r], #212]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #200]\n\t" + "STR r4, [%[r], #208]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #196]\n\t" + "STR r6, [%[r], #204]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #192]\n\t" + "STR r5, [%[r], #200]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #188]\n\t" + "STR r4, [%[r], #196]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #184]\n\t" + "STR r6, [%[r], #192]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #180]\n\t" + "STR r5, [%[r], #188]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #176]\n\t" + "STR r4, [%[r], #184]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #172]\n\t" + "STR r6, [%[r], #180]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #168]\n\t" + "STR r5, [%[r], #176]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #164]\n\t" + "STR r4, [%[r], #172]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #160]\n\t" + "STR r6, [%[r], #168]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #156]\n\t" + "STR r5, [%[r], #164]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #152]\n\t" + "STR r4, [%[r], #160]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #148]\n\t" + "STR r6, [%[r], #156]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #144]\n\t" + "STR r5, [%[r], #152]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #140]\n\t" + "STR r4, [%[r], #148]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #136]\n\t" + "STR r6, [%[r], #144]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #132]\n\t" + "STR r5, [%[r], #140]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #128]\n\t" + "STR r4, [%[r], #136]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #124]\n\t" + "STR r6, [%[r], #132]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #120]\n\t" + "STR r5, [%[r], #128]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #116]\n\t" + "STR r4, [%[r], #124]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #112]\n\t" + "STR r6, [%[r], #120]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #108]\n\t" + "STR r5, [%[r], #116]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #104]\n\t" + "STR r4, [%[r], #112]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #100]\n\t" + "STR r6, [%[r], #108]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #96]\n\t" + "STR r5, [%[r], #104]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #92]\n\t" + "STR r4, [%[r], #100]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #88]\n\t" + "STR r6, [%[r], #96]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #84]\n\t" + "STR r5, [%[r], #92]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #80]\n\t" + "STR r4, [%[r], #88]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #76]\n\t" + "STR r6, [%[r], #84]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #72]\n\t" + "STR r5, [%[r], #80]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #68]\n\t" + "STR r4, [%[r], #76]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #64]\n\t" + "STR r6, [%[r], #72]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #60]\n\t" + "STR r5, [%[r], #68]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #56]\n\t" + "STR r4, [%[r], #64]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #52]\n\t" + "STR r6, [%[r], #60]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #48]\n\t" + "STR r5, [%[r], #56]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #44]\n\t" + "STR r4, [%[r], #52]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #40]\n\t" + "STR r6, [%[r], #48]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #36]\n\t" + "STR r5, [%[r], #44]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #32]\n\t" + "STR r4, [%[r], #40]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #28]\n\t" + "STR r6, [%[r], #36]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #24]\n\t" + "STR r5, [%[r], #32]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #20]\n\t" + "STR r4, [%[r], #28]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #16]\n\t" + "STR r6, [%[r], #24]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #12]\n\t" + "STR r5, [%[r], #20]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #8]\n\t" + "STR r4, [%[r], #16]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #4]\n\t" + "STR r6, [%[r], #12]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a]]\n\t" + "STR r5, [%[r], #8]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "STR r6, [%[r]]\n\t" + "STR r4, [%[r], #4]\n\t" + : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : [r] "r" (r), [a] "r" (a), [n] "r" (n) - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r3", "r7", "cc" ); } @@ -11740,14 +22347,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -11852,345 +22459,253 @@ #define sp_4096_norm_128(a) #ifndef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) * - * r A single precision integer. - * a A single precision integer. + * a A single precision integer and result. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_4096_sub_in_place_128(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -12199,340 +22714,250 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Multiply a and b into r. (r = a * b) @@ -12618,39 +23043,45 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_add_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_4096_add_128(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #512\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x200\n\t" + "\n" + "L_sp_4096_add_128_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_4096_add_128_word%=\n\t" +#else + "BNE.N L_sp_4096_add_128_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -12660,39 +23091,43 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_4096_sub_in_place_128(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_sub_in_place_128(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_4096_sub_in_place_128(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #512\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x200\n\t" + "\n" + "L_sp_4096_sub_in_pkace_128_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_4096_sub_in_pkace_128_word%=\n\t" +#else + "BNE.N L_sp_4096_sub_in_pkace_128_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #endif /* WOLFSSL_SP_SMALL */ @@ -12703,88 +23138,99 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_4096_mul_128(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_4096_mul_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_4096_mul_128(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[128 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #252\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #3\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x400\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_4096_mul_128_outer%=:\n\t" + "SUBS r3, r5, #0x1fc\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_4096_mul_128_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_4096_mul_128_inner_done%=\n\t" +#else + "BGT.N L_sp_4096_mul_128_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_mul_128_inner%=\n\t" +#else + "BLT.N L_sp_4096_mul_128_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_4096_mul_128_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x3f4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_4096_mul_128_outer%=\n\t" +#else + "BLE.N L_sp_4096_mul_128_outer%=\n\t" +#endif + "LDR lr, [%[a], #508]\n\t" + "LDR r11, [%[b], #508]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_4096_mul_128_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_4096_mul_128_store%=\n\t" +#else + "BGT.N L_sp_4096_mul_128_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Square a and put result in r. (r = a * a) @@ -12792,136 +23238,96 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_4096_sqr_128(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_4096_sqr_128(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #4\n\t" - "lsl r6, r6, #8\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #252\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #2\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #3\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #3\n\t" - "lsl r3, r3, #8\n\t" - "add r3, r3, #252\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #4\n\t" - "lsl r6, r6, #8\n\t" - "add sp, sp, r6\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x400\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_4096_sqr_128_outer%=:\n\t" + "SUBS r3, r5, #0x1fc\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_4096_sqr_128_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_4096_sqr_128_inner_done%=\n\t" +#else + "BGT.N L_sp_4096_sqr_128_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_sqr_128_inner%=\n\t" +#else + "BLT.N L_sp_4096_sqr_128_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_4096_sqr_128_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x3f4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_4096_sqr_128_outer%=\n\t" +#else + "BLE.N L_sp_4096_sqr_128_outer%=\n\t" +#endif + "LDR lr, [%[a], #508]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_4096_sqr_128_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_4096_sqr_128_store%=\n\t" +#else + "BGT.N L_sp_4096_sqr_128_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } #endif /* WOLFSSL_SP_SMALL */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -12941,48 +23347,726 @@ *rho = (sp_digit)0 - x; } +#ifdef WOLFSSL_SP_SMALL /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_4096_mul_d_128(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_4096_mul_d_128(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #512\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_4096_mul_d_128_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x200\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_mul_d_128_word%=\n\t" +#else + "BLT.N L_sp_4096_mul_d_128_word%=\n\t" +#endif + "STR r3, [%[r], #512]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); +} + +#else +/* Mul a by digit b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision digit. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_4096_mul_d_128(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_4096_mul_d_128(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* A[0] * B */ + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[12] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[13] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[14] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[15] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[16] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[17] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[18] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[19] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[20] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[21] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[22] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[23] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[24] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[25] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[26] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[27] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[28] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[29] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[30] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[31] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[32] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[33] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[34] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[35] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[36] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[37] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[38] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[39] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[40] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[41] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[42] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[43] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[44] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[45] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[46] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[47] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[48] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[49] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[50] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[51] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[52] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[53] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[54] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[55] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[56] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[57] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[58] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[59] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[60] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[61] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[62] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[63] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[64] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[65] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[66] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[67] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[68] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[69] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[70] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[71] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[72] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[73] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[74] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[75] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[76] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[77] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[78] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[79] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[80] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[81] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[82] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[83] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[84] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[85] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[86] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[87] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[88] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[89] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[90] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[91] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[92] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[93] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[94] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[95] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[96] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[97] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[98] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[99] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[100] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[101] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[102] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[103] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[104] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[105] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[106] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[107] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[108] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[109] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[110] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[111] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[112] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[113] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[114] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[115] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[116] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[117] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[118] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[119] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[120] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[121] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[122] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[123] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[124] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[125] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[126] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[127] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "STR r5, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH) /* r = 2^n mod m where n is the number of bits to reduce by. * Given m must be 4096 bits, just need to subtract. @@ -12999,6 +24083,7 @@ } #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -13007,142 +24092,2501 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_4096_cond_sub_128(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_cond_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_4096_cond_sub_128(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_4096_cond_sub_128_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x200\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_cond_sub_128_words%=\n\t" +#else + "BLT.N L_sp_4096_cond_sub_128_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" + ); + return (uint32_t)(size_t)r; +} - __asm__ __volatile__ ( - "mov r5, #2\n\t" - "lsl r5, r5, #8\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_cond_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_4096_cond_sub_128(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_NO_UMAAL +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 4096 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_4096_mont_reduce_128_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r9, [%[m], #48]\n\t" + "LDR r12, [%[a], #48]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r9, [%[m], #52]\n\t" + "LDR r12, [%[a], #52]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #52]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r9, [%[m], #56]\n\t" + "LDR r12, [%[a], #56]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #56]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r9, [%[m], #60]\n\t" + "LDR r12, [%[a], #60]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #60]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r9, [%[m], #64]\n\t" + "LDR r12, [%[a], #64]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #64]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r9, [%[m], #68]\n\t" + "LDR r12, [%[a], #68]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #68]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r9, [%[m], #72]\n\t" + "LDR r12, [%[a], #72]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #72]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r9, [%[m], #76]\n\t" + "LDR r12, [%[a], #76]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #76]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r9, [%[m], #80]\n\t" + "LDR r12, [%[a], #80]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #80]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r9, [%[m], #84]\n\t" + "LDR r12, [%[a], #84]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #84]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r9, [%[m], #88]\n\t" + "LDR r12, [%[a], #88]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #88]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r9, [%[m], #92]\n\t" + "LDR r12, [%[a], #92]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #92]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r9, [%[m], #96]\n\t" + "LDR r12, [%[a], #96]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #96]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r9, [%[m], #100]\n\t" + "LDR r12, [%[a], #100]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #100]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r9, [%[m], #104]\n\t" + "LDR r12, [%[a], #104]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #104]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r9, [%[m], #108]\n\t" + "LDR r12, [%[a], #108]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #108]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r9, [%[m], #112]\n\t" + "LDR r12, [%[a], #112]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #112]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r9, [%[m], #116]\n\t" + "LDR r12, [%[a], #116]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #116]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r9, [%[m], #120]\n\t" + "LDR r12, [%[a], #120]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #120]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r9, [%[m], #124]\n\t" + "LDR r12, [%[a], #124]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #124]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r9, [%[m], #128]\n\t" + "LDR r12, [%[a], #128]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #128]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r9, [%[m], #132]\n\t" + "LDR r12, [%[a], #132]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #132]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r9, [%[m], #136]\n\t" + "LDR r12, [%[a], #136]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #136]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r9, [%[m], #140]\n\t" + "LDR r12, [%[a], #140]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #140]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r9, [%[m], #144]\n\t" + "LDR r12, [%[a], #144]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #144]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r9, [%[m], #148]\n\t" + "LDR r12, [%[a], #148]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #148]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r9, [%[m], #152]\n\t" + "LDR r12, [%[a], #152]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #152]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r9, [%[m], #156]\n\t" + "LDR r12, [%[a], #156]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #156]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r9, [%[m], #160]\n\t" + "LDR r12, [%[a], #160]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #160]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r9, [%[m], #164]\n\t" + "LDR r12, [%[a], #164]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #164]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r9, [%[m], #168]\n\t" + "LDR r12, [%[a], #168]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #168]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r9, [%[m], #172]\n\t" + "LDR r12, [%[a], #172]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #172]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r9, [%[m], #176]\n\t" + "LDR r12, [%[a], #176]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #176]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r9, [%[m], #180]\n\t" + "LDR r12, [%[a], #180]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #180]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+46] += m[46] * mu */ + "LDR r9, [%[m], #184]\n\t" + "LDR r12, [%[a], #184]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #184]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+47] += m[47] * mu */ + "LDR r9, [%[m], #188]\n\t" + "LDR r12, [%[a], #188]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #188]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+48] += m[48] * mu */ + "LDR r9, [%[m], #192]\n\t" + "LDR r12, [%[a], #192]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #192]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+49] += m[49] * mu */ + "LDR r9, [%[m], #196]\n\t" + "LDR r12, [%[a], #196]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #196]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+50] += m[50] * mu */ + "LDR r9, [%[m], #200]\n\t" + "LDR r12, [%[a], #200]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #200]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+51] += m[51] * mu */ + "LDR r9, [%[m], #204]\n\t" + "LDR r12, [%[a], #204]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #204]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+52] += m[52] * mu */ + "LDR r9, [%[m], #208]\n\t" + "LDR r12, [%[a], #208]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #208]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+53] += m[53] * mu */ + "LDR r9, [%[m], #212]\n\t" + "LDR r12, [%[a], #212]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #212]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+54] += m[54] * mu */ + "LDR r9, [%[m], #216]\n\t" + "LDR r12, [%[a], #216]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #216]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+55] += m[55] * mu */ + "LDR r9, [%[m], #220]\n\t" + "LDR r12, [%[a], #220]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #220]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+56] += m[56] * mu */ + "LDR r9, [%[m], #224]\n\t" + "LDR r12, [%[a], #224]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #224]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+57] += m[57] * mu */ + "LDR r9, [%[m], #228]\n\t" + "LDR r12, [%[a], #228]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #228]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+58] += m[58] * mu */ + "LDR r9, [%[m], #232]\n\t" + "LDR r12, [%[a], #232]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #232]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+59] += m[59] * mu */ + "LDR r9, [%[m], #236]\n\t" + "LDR r12, [%[a], #236]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #236]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+60] += m[60] * mu */ + "LDR r9, [%[m], #240]\n\t" + "LDR r12, [%[a], #240]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #240]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+61] += m[61] * mu */ + "LDR r9, [%[m], #244]\n\t" + "LDR r12, [%[a], #244]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #244]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+62] += m[62] * mu */ + "LDR r9, [%[m], #248]\n\t" + "LDR r12, [%[a], #248]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #248]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+63] += m[63] * mu */ + "LDR r9, [%[m], #252]\n\t" + "LDR r12, [%[a], #252]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #252]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+64] += m[64] * mu */ + "LDR r9, [%[m], #256]\n\t" + "LDR r12, [%[a], #256]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #256]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+65] += m[65] * mu */ + "LDR r9, [%[m], #260]\n\t" + "LDR r12, [%[a], #260]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #260]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+66] += m[66] * mu */ + "LDR r9, [%[m], #264]\n\t" + "LDR r12, [%[a], #264]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #264]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+67] += m[67] * mu */ + "LDR r9, [%[m], #268]\n\t" + "LDR r12, [%[a], #268]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #268]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+68] += m[68] * mu */ + "LDR r9, [%[m], #272]\n\t" + "LDR r12, [%[a], #272]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #272]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+69] += m[69] * mu */ + "LDR r9, [%[m], #276]\n\t" + "LDR r12, [%[a], #276]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #276]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+70] += m[70] * mu */ + "LDR r9, [%[m], #280]\n\t" + "LDR r12, [%[a], #280]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #280]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+71] += m[71] * mu */ + "LDR r9, [%[m], #284]\n\t" + "LDR r12, [%[a], #284]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #284]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+72] += m[72] * mu */ + "LDR r9, [%[m], #288]\n\t" + "LDR r12, [%[a], #288]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #288]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+73] += m[73] * mu */ + "LDR r9, [%[m], #292]\n\t" + "LDR r12, [%[a], #292]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #292]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+74] += m[74] * mu */ + "LDR r9, [%[m], #296]\n\t" + "LDR r12, [%[a], #296]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #296]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+75] += m[75] * mu */ + "LDR r9, [%[m], #300]\n\t" + "LDR r12, [%[a], #300]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #300]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+76] += m[76] * mu */ + "LDR r9, [%[m], #304]\n\t" + "LDR r12, [%[a], #304]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #304]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+77] += m[77] * mu */ + "LDR r9, [%[m], #308]\n\t" + "LDR r12, [%[a], #308]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #308]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+78] += m[78] * mu */ + "LDR r9, [%[m], #312]\n\t" + "LDR r12, [%[a], #312]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #312]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+79] += m[79] * mu */ + "LDR r9, [%[m], #316]\n\t" + "LDR r12, [%[a], #316]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #316]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+80] += m[80] * mu */ + "LDR r9, [%[m], #320]\n\t" + "LDR r12, [%[a], #320]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #320]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+81] += m[81] * mu */ + "LDR r9, [%[m], #324]\n\t" + "LDR r12, [%[a], #324]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #324]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+82] += m[82] * mu */ + "LDR r9, [%[m], #328]\n\t" + "LDR r12, [%[a], #328]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #328]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+83] += m[83] * mu */ + "LDR r9, [%[m], #332]\n\t" + "LDR r12, [%[a], #332]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #332]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+84] += m[84] * mu */ + "LDR r9, [%[m], #336]\n\t" + "LDR r12, [%[a], #336]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #336]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+85] += m[85] * mu */ + "LDR r9, [%[m], #340]\n\t" + "LDR r12, [%[a], #340]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #340]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+86] += m[86] * mu */ + "LDR r9, [%[m], #344]\n\t" + "LDR r12, [%[a], #344]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #344]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+87] += m[87] * mu */ + "LDR r9, [%[m], #348]\n\t" + "LDR r12, [%[a], #348]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #348]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+88] += m[88] * mu */ + "LDR r9, [%[m], #352]\n\t" + "LDR r12, [%[a], #352]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #352]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+89] += m[89] * mu */ + "LDR r9, [%[m], #356]\n\t" + "LDR r12, [%[a], #356]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #356]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+90] += m[90] * mu */ + "LDR r9, [%[m], #360]\n\t" + "LDR r12, [%[a], #360]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #360]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+91] += m[91] * mu */ + "LDR r9, [%[m], #364]\n\t" + "LDR r12, [%[a], #364]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #364]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+92] += m[92] * mu */ + "LDR r9, [%[m], #368]\n\t" + "LDR r12, [%[a], #368]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #368]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+93] += m[93] * mu */ + "LDR r9, [%[m], #372]\n\t" + "LDR r12, [%[a], #372]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #372]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+94] += m[94] * mu */ + "LDR r9, [%[m], #376]\n\t" + "LDR r12, [%[a], #376]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #376]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+95] += m[95] * mu */ + "LDR r9, [%[m], #380]\n\t" + "LDR r12, [%[a], #380]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #380]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+96] += m[96] * mu */ + "LDR r9, [%[m], #384]\n\t" + "LDR r12, [%[a], #384]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #384]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+97] += m[97] * mu */ + "LDR r9, [%[m], #388]\n\t" + "LDR r12, [%[a], #388]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #388]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+98] += m[98] * mu */ + "LDR r9, [%[m], #392]\n\t" + "LDR r12, [%[a], #392]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #392]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+99] += m[99] * mu */ + "LDR r9, [%[m], #396]\n\t" + "LDR r12, [%[a], #396]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #396]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+100] += m[100] * mu */ + "LDR r9, [%[m], #400]\n\t" + "LDR r12, [%[a], #400]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #400]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+101] += m[101] * mu */ + "LDR r9, [%[m], #404]\n\t" + "LDR r12, [%[a], #404]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #404]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+102] += m[102] * mu */ + "LDR r9, [%[m], #408]\n\t" + "LDR r12, [%[a], #408]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #408]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+103] += m[103] * mu */ + "LDR r9, [%[m], #412]\n\t" + "LDR r12, [%[a], #412]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #412]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+104] += m[104] * mu */ + "LDR r9, [%[m], #416]\n\t" + "LDR r12, [%[a], #416]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #416]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+105] += m[105] * mu */ + "LDR r9, [%[m], #420]\n\t" + "LDR r12, [%[a], #420]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #420]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+106] += m[106] * mu */ + "LDR r9, [%[m], #424]\n\t" + "LDR r12, [%[a], #424]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #424]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+107] += m[107] * mu */ + "LDR r9, [%[m], #428]\n\t" + "LDR r12, [%[a], #428]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #428]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+108] += m[108] * mu */ + "LDR r9, [%[m], #432]\n\t" + "LDR r12, [%[a], #432]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #432]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+109] += m[109] * mu */ + "LDR r9, [%[m], #436]\n\t" + "LDR r12, [%[a], #436]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #436]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+110] += m[110] * mu */ + "LDR r9, [%[m], #440]\n\t" + "LDR r12, [%[a], #440]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #440]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+111] += m[111] * mu */ + "LDR r9, [%[m], #444]\n\t" + "LDR r12, [%[a], #444]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #444]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+112] += m[112] * mu */ + "LDR r9, [%[m], #448]\n\t" + "LDR r12, [%[a], #448]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #448]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+113] += m[113] * mu */ + "LDR r9, [%[m], #452]\n\t" + "LDR r12, [%[a], #452]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #452]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+114] += m[114] * mu */ + "LDR r9, [%[m], #456]\n\t" + "LDR r12, [%[a], #456]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #456]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+115] += m[115] * mu */ + "LDR r9, [%[m], #460]\n\t" + "LDR r12, [%[a], #460]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #460]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+116] += m[116] * mu */ + "LDR r9, [%[m], #464]\n\t" + "LDR r12, [%[a], #464]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #464]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+117] += m[117] * mu */ + "LDR r9, [%[m], #468]\n\t" + "LDR r12, [%[a], #468]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #468]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+118] += m[118] * mu */ + "LDR r9, [%[m], #472]\n\t" + "LDR r12, [%[a], #472]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #472]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+119] += m[119] * mu */ + "LDR r9, [%[m], #476]\n\t" + "LDR r12, [%[a], #476]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #476]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+120] += m[120] * mu */ + "LDR r9, [%[m], #480]\n\t" + "LDR r12, [%[a], #480]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #480]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+121] += m[121] * mu */ + "LDR r9, [%[m], #484]\n\t" + "LDR r12, [%[a], #484]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #484]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+122] += m[122] * mu */ + "LDR r9, [%[m], #488]\n\t" + "LDR r12, [%[a], #488]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #488]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+123] += m[123] * mu */ + "LDR r9, [%[m], #492]\n\t" + "LDR r12, [%[a], #492]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #492]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+124] += m[124] * mu */ + "LDR r9, [%[m], #496]\n\t" + "LDR r12, [%[a], #496]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #496]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+125] += m[125] * mu */ + "LDR r9, [%[m], #500]\n\t" + "LDR r12, [%[a], #500]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #500]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+126] += m[126] * mu */ + "LDR r9, [%[m], #504]\n\t" + "LDR r12, [%[a], #504]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #504]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+127] += m[127] * mu */ + "LDR r9, [%[m], #508]\n\t" + "LDR r12, [%[a], #508]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #508]\n\t" + "LDR r12, [%[a], #512]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #512]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x200\n\t" +#ifdef __GNUC__ + "BLT L_sp_4096_mont_reduce_128_word%=\n\t" +#else + "BLT.W L_sp_4096_mont_reduce_128_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp); } +#else /* Reduce the number back to 4096 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #512\n\t" - "\n1:\n\t" + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_4096_mont_reduce_128_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #504\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_4096_mont_reduce_128_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r8, r7\n\t" + "ADDS r10, r10, r4\n\t" + "STR r10, [%[a], r12]\n\t" + "ADC r4, r5, #0x0\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x200\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_mont_reduce_128_mul%=\n\t" +#else + "BLT.N L_sp_4096_mont_reduce_128_mul%=\n\t" +#endif + "LDR r10, [%[a], #512]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #512]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x200\n\t" #if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" + "BLT L_sp_4096_mont_reduce_128_word%=\n\t" +#else + "BLT.N L_sp_4096_mont_reduce_128_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp); +} + +#endif /* !WOLFSSL_SP_SMALL */ #else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ +#ifndef WOLFSSL_SP_SMALL +/* Reduce the number back to 4096 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_4096_mont_reduce_128_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r12, [%[m], #48]\n\t" + "LDR r11, [%[a], #48]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r12, [%[m], #52]\n\t" + "LDR r11, [%[a], #52]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r12, [%[m], #56]\n\t" + "LDR r11, [%[a], #56]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r12, [%[m], #60]\n\t" + "LDR r11, [%[a], #60]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r12, [%[m], #64]\n\t" + "LDR r11, [%[a], #64]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r12, [%[m], #68]\n\t" + "LDR r11, [%[a], #68]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r12, [%[m], #72]\n\t" + "LDR r11, [%[a], #72]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r12, [%[m], #76]\n\t" + "LDR r11, [%[a], #76]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r12, [%[m], #80]\n\t" + "LDR r11, [%[a], #80]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r12, [%[m], #84]\n\t" + "LDR r11, [%[a], #84]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r12, [%[m], #88]\n\t" + "LDR r11, [%[a], #88]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r12, [%[m], #92]\n\t" + "LDR r11, [%[a], #92]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r12, [%[m], #96]\n\t" + "LDR r11, [%[a], #96]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r12, [%[m], #100]\n\t" + "LDR r11, [%[a], #100]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r12, [%[m], #104]\n\t" + "LDR r11, [%[a], #104]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r12, [%[m], #108]\n\t" + "LDR r11, [%[a], #108]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r12, [%[m], #112]\n\t" + "LDR r11, [%[a], #112]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r12, [%[m], #116]\n\t" + "LDR r11, [%[a], #116]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r12, [%[m], #120]\n\t" + "LDR r11, [%[a], #120]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r12, [%[m], #124]\n\t" + "LDR r11, [%[a], #124]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #124]\n\t" + /* a[i+32] += m[32] * mu */ + "LDR r12, [%[m], #128]\n\t" + "LDR r11, [%[a], #128]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #128]\n\t" + /* a[i+33] += m[33] * mu */ + "LDR r12, [%[m], #132]\n\t" + "LDR r11, [%[a], #132]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #132]\n\t" + /* a[i+34] += m[34] * mu */ + "LDR r12, [%[m], #136]\n\t" + "LDR r11, [%[a], #136]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #136]\n\t" + /* a[i+35] += m[35] * mu */ + "LDR r12, [%[m], #140]\n\t" + "LDR r11, [%[a], #140]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #140]\n\t" + /* a[i+36] += m[36] * mu */ + "LDR r12, [%[m], #144]\n\t" + "LDR r11, [%[a], #144]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #144]\n\t" + /* a[i+37] += m[37] * mu */ + "LDR r12, [%[m], #148]\n\t" + "LDR r11, [%[a], #148]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #148]\n\t" + /* a[i+38] += m[38] * mu */ + "LDR r12, [%[m], #152]\n\t" + "LDR r11, [%[a], #152]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #152]\n\t" + /* a[i+39] += m[39] * mu */ + "LDR r12, [%[m], #156]\n\t" + "LDR r11, [%[a], #156]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #156]\n\t" + /* a[i+40] += m[40] * mu */ + "LDR r12, [%[m], #160]\n\t" + "LDR r11, [%[a], #160]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #160]\n\t" + /* a[i+41] += m[41] * mu */ + "LDR r12, [%[m], #164]\n\t" + "LDR r11, [%[a], #164]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #164]\n\t" + /* a[i+42] += m[42] * mu */ + "LDR r12, [%[m], #168]\n\t" + "LDR r11, [%[a], #168]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #168]\n\t" + /* a[i+43] += m[43] * mu */ + "LDR r12, [%[m], #172]\n\t" + "LDR r11, [%[a], #172]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #172]\n\t" + /* a[i+44] += m[44] * mu */ + "LDR r12, [%[m], #176]\n\t" + "LDR r11, [%[a], #176]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #176]\n\t" + /* a[i+45] += m[45] * mu */ + "LDR r12, [%[m], #180]\n\t" + "LDR r11, [%[a], #180]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #180]\n\t" + /* a[i+46] += m[46] * mu */ + "LDR r12, [%[m], #184]\n\t" + "LDR r11, [%[a], #184]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #184]\n\t" + /* a[i+47] += m[47] * mu */ + "LDR r12, [%[m], #188]\n\t" + "LDR r11, [%[a], #188]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #188]\n\t" + /* a[i+48] += m[48] * mu */ + "LDR r12, [%[m], #192]\n\t" + "LDR r11, [%[a], #192]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #192]\n\t" + /* a[i+49] += m[49] * mu */ + "LDR r12, [%[m], #196]\n\t" + "LDR r11, [%[a], #196]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #196]\n\t" + /* a[i+50] += m[50] * mu */ + "LDR r12, [%[m], #200]\n\t" + "LDR r11, [%[a], #200]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #200]\n\t" + /* a[i+51] += m[51] * mu */ + "LDR r12, [%[m], #204]\n\t" + "LDR r11, [%[a], #204]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #204]\n\t" + /* a[i+52] += m[52] * mu */ + "LDR r12, [%[m], #208]\n\t" + "LDR r11, [%[a], #208]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #208]\n\t" + /* a[i+53] += m[53] * mu */ + "LDR r12, [%[m], #212]\n\t" + "LDR r11, [%[a], #212]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #212]\n\t" + /* a[i+54] += m[54] * mu */ + "LDR r12, [%[m], #216]\n\t" + "LDR r11, [%[a], #216]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #216]\n\t" + /* a[i+55] += m[55] * mu */ + "LDR r12, [%[m], #220]\n\t" + "LDR r11, [%[a], #220]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #220]\n\t" + /* a[i+56] += m[56] * mu */ + "LDR r12, [%[m], #224]\n\t" + "LDR r11, [%[a], #224]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #224]\n\t" + /* a[i+57] += m[57] * mu */ + "LDR r12, [%[m], #228]\n\t" + "LDR r11, [%[a], #228]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #228]\n\t" + /* a[i+58] += m[58] * mu */ + "LDR r12, [%[m], #232]\n\t" + "LDR r11, [%[a], #232]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #232]\n\t" + /* a[i+59] += m[59] * mu */ + "LDR r12, [%[m], #236]\n\t" + "LDR r11, [%[a], #236]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #236]\n\t" + /* a[i+60] += m[60] * mu */ + "LDR r12, [%[m], #240]\n\t" + "LDR r11, [%[a], #240]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #240]\n\t" + /* a[i+61] += m[61] * mu */ + "LDR r12, [%[m], #244]\n\t" + "LDR r11, [%[a], #244]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #244]\n\t" + /* a[i+62] += m[62] * mu */ + "LDR r12, [%[m], #248]\n\t" + "LDR r11, [%[a], #248]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #248]\n\t" + /* a[i+63] += m[63] * mu */ + "LDR r12, [%[m], #252]\n\t" + "LDR r11, [%[a], #252]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #252]\n\t" + /* a[i+64] += m[64] * mu */ + "LDR r12, [%[m], #256]\n\t" + "LDR r11, [%[a], #256]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #256]\n\t" + /* a[i+65] += m[65] * mu */ + "LDR r12, [%[m], #260]\n\t" + "LDR r11, [%[a], #260]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #260]\n\t" + /* a[i+66] += m[66] * mu */ + "LDR r12, [%[m], #264]\n\t" + "LDR r11, [%[a], #264]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #264]\n\t" + /* a[i+67] += m[67] * mu */ + "LDR r12, [%[m], #268]\n\t" + "LDR r11, [%[a], #268]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #268]\n\t" + /* a[i+68] += m[68] * mu */ + "LDR r12, [%[m], #272]\n\t" + "LDR r11, [%[a], #272]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #272]\n\t" + /* a[i+69] += m[69] * mu */ + "LDR r12, [%[m], #276]\n\t" + "LDR r11, [%[a], #276]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #276]\n\t" + /* a[i+70] += m[70] * mu */ + "LDR r12, [%[m], #280]\n\t" + "LDR r11, [%[a], #280]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #280]\n\t" + /* a[i+71] += m[71] * mu */ + "LDR r12, [%[m], #284]\n\t" + "LDR r11, [%[a], #284]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #284]\n\t" + /* a[i+72] += m[72] * mu */ + "LDR r12, [%[m], #288]\n\t" + "LDR r11, [%[a], #288]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #288]\n\t" + /* a[i+73] += m[73] * mu */ + "LDR r12, [%[m], #292]\n\t" + "LDR r11, [%[a], #292]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #292]\n\t" + /* a[i+74] += m[74] * mu */ + "LDR r12, [%[m], #296]\n\t" + "LDR r11, [%[a], #296]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #296]\n\t" + /* a[i+75] += m[75] * mu */ + "LDR r12, [%[m], #300]\n\t" + "LDR r11, [%[a], #300]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #300]\n\t" + /* a[i+76] += m[76] * mu */ + "LDR r12, [%[m], #304]\n\t" + "LDR r11, [%[a], #304]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #304]\n\t" + /* a[i+77] += m[77] * mu */ + "LDR r12, [%[m], #308]\n\t" + "LDR r11, [%[a], #308]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #308]\n\t" + /* a[i+78] += m[78] * mu */ + "LDR r12, [%[m], #312]\n\t" + "LDR r11, [%[a], #312]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #312]\n\t" + /* a[i+79] += m[79] * mu */ + "LDR r12, [%[m], #316]\n\t" + "LDR r11, [%[a], #316]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #316]\n\t" + /* a[i+80] += m[80] * mu */ + "LDR r12, [%[m], #320]\n\t" + "LDR r11, [%[a], #320]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #320]\n\t" + /* a[i+81] += m[81] * mu */ + "LDR r12, [%[m], #324]\n\t" + "LDR r11, [%[a], #324]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #324]\n\t" + /* a[i+82] += m[82] * mu */ + "LDR r12, [%[m], #328]\n\t" + "LDR r11, [%[a], #328]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #328]\n\t" + /* a[i+83] += m[83] * mu */ + "LDR r12, [%[m], #332]\n\t" + "LDR r11, [%[a], #332]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #332]\n\t" + /* a[i+84] += m[84] * mu */ + "LDR r12, [%[m], #336]\n\t" + "LDR r11, [%[a], #336]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #336]\n\t" + /* a[i+85] += m[85] * mu */ + "LDR r12, [%[m], #340]\n\t" + "LDR r11, [%[a], #340]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #340]\n\t" + /* a[i+86] += m[86] * mu */ + "LDR r12, [%[m], #344]\n\t" + "LDR r11, [%[a], #344]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #344]\n\t" + /* a[i+87] += m[87] * mu */ + "LDR r12, [%[m], #348]\n\t" + "LDR r11, [%[a], #348]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #348]\n\t" + /* a[i+88] += m[88] * mu */ + "LDR r12, [%[m], #352]\n\t" + "LDR r11, [%[a], #352]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #352]\n\t" + /* a[i+89] += m[89] * mu */ + "LDR r12, [%[m], #356]\n\t" + "LDR r11, [%[a], #356]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #356]\n\t" + /* a[i+90] += m[90] * mu */ + "LDR r12, [%[m], #360]\n\t" + "LDR r11, [%[a], #360]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #360]\n\t" + /* a[i+91] += m[91] * mu */ + "LDR r12, [%[m], #364]\n\t" + "LDR r11, [%[a], #364]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #364]\n\t" + /* a[i+92] += m[92] * mu */ + "LDR r12, [%[m], #368]\n\t" + "LDR r11, [%[a], #368]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #368]\n\t" + /* a[i+93] += m[93] * mu */ + "LDR r12, [%[m], #372]\n\t" + "LDR r11, [%[a], #372]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #372]\n\t" + /* a[i+94] += m[94] * mu */ + "LDR r12, [%[m], #376]\n\t" + "LDR r11, [%[a], #376]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #376]\n\t" + /* a[i+95] += m[95] * mu */ + "LDR r12, [%[m], #380]\n\t" + "LDR r11, [%[a], #380]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #380]\n\t" + /* a[i+96] += m[96] * mu */ + "LDR r12, [%[m], #384]\n\t" + "LDR r11, [%[a], #384]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #384]\n\t" + /* a[i+97] += m[97] * mu */ + "LDR r12, [%[m], #388]\n\t" + "LDR r11, [%[a], #388]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #388]\n\t" + /* a[i+98] += m[98] * mu */ + "LDR r12, [%[m], #392]\n\t" + "LDR r11, [%[a], #392]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #392]\n\t" + /* a[i+99] += m[99] * mu */ + "LDR r12, [%[m], #396]\n\t" + "LDR r11, [%[a], #396]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #396]\n\t" + /* a[i+100] += m[100] * mu */ + "LDR r12, [%[m], #400]\n\t" + "LDR r11, [%[a], #400]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #400]\n\t" + /* a[i+101] += m[101] * mu */ + "LDR r12, [%[m], #404]\n\t" + "LDR r11, [%[a], #404]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #404]\n\t" + /* a[i+102] += m[102] * mu */ + "LDR r12, [%[m], #408]\n\t" + "LDR r11, [%[a], #408]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #408]\n\t" + /* a[i+103] += m[103] * mu */ + "LDR r12, [%[m], #412]\n\t" + "LDR r11, [%[a], #412]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #412]\n\t" + /* a[i+104] += m[104] * mu */ + "LDR r12, [%[m], #416]\n\t" + "LDR r11, [%[a], #416]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #416]\n\t" + /* a[i+105] += m[105] * mu */ + "LDR r12, [%[m], #420]\n\t" + "LDR r11, [%[a], #420]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #420]\n\t" + /* a[i+106] += m[106] * mu */ + "LDR r12, [%[m], #424]\n\t" + "LDR r11, [%[a], #424]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #424]\n\t" + /* a[i+107] += m[107] * mu */ + "LDR r12, [%[m], #428]\n\t" + "LDR r11, [%[a], #428]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #428]\n\t" + /* a[i+108] += m[108] * mu */ + "LDR r12, [%[m], #432]\n\t" + "LDR r11, [%[a], #432]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #432]\n\t" + /* a[i+109] += m[109] * mu */ + "LDR r12, [%[m], #436]\n\t" + "LDR r11, [%[a], #436]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #436]\n\t" + /* a[i+110] += m[110] * mu */ + "LDR r12, [%[m], #440]\n\t" + "LDR r11, [%[a], #440]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #440]\n\t" + /* a[i+111] += m[111] * mu */ + "LDR r12, [%[m], #444]\n\t" + "LDR r11, [%[a], #444]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #444]\n\t" + /* a[i+112] += m[112] * mu */ + "LDR r12, [%[m], #448]\n\t" + "LDR r11, [%[a], #448]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #448]\n\t" + /* a[i+113] += m[113] * mu */ + "LDR r12, [%[m], #452]\n\t" + "LDR r11, [%[a], #452]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #452]\n\t" + /* a[i+114] += m[114] * mu */ + "LDR r12, [%[m], #456]\n\t" + "LDR r11, [%[a], #456]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #456]\n\t" + /* a[i+115] += m[115] * mu */ + "LDR r12, [%[m], #460]\n\t" + "LDR r11, [%[a], #460]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #460]\n\t" + /* a[i+116] += m[116] * mu */ + "LDR r12, [%[m], #464]\n\t" + "LDR r11, [%[a], #464]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #464]\n\t" + /* a[i+117] += m[117] * mu */ + "LDR r12, [%[m], #468]\n\t" + "LDR r11, [%[a], #468]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #468]\n\t" + /* a[i+118] += m[118] * mu */ + "LDR r12, [%[m], #472]\n\t" + "LDR r11, [%[a], #472]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #472]\n\t" + /* a[i+119] += m[119] * mu */ + "LDR r12, [%[m], #476]\n\t" + "LDR r11, [%[a], #476]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #476]\n\t" + /* a[i+120] += m[120] * mu */ + "LDR r12, [%[m], #480]\n\t" + "LDR r11, [%[a], #480]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #480]\n\t" + /* a[i+121] += m[121] * mu */ + "LDR r12, [%[m], #484]\n\t" + "LDR r11, [%[a], #484]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #484]\n\t" + /* a[i+122] += m[122] * mu */ + "LDR r12, [%[m], #488]\n\t" + "LDR r11, [%[a], #488]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #488]\n\t" + /* a[i+123] += m[123] * mu */ + "LDR r12, [%[m], #492]\n\t" + "LDR r11, [%[a], #492]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #492]\n\t" + /* a[i+124] += m[124] * mu */ + "LDR r12, [%[m], #496]\n\t" + "LDR r11, [%[a], #496]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #496]\n\t" + /* a[i+125] += m[125] * mu */ + "LDR r12, [%[m], #500]\n\t" + "LDR r11, [%[a], #500]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #500]\n\t" /* a[i+126] += m[126] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r12, [%[m], #504]\n\t" + "LDR r11, [%[a], #504]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #504]\n\t" /* a[i+127] += m[127] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[127] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[127] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #504\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r12, [%[m], #508]\n\t" + "LDR r11, [%[a], #508]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #512]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #508]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #512]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x200\n\t" +#ifdef __GNUC__ + "BLT L_sp_4096_mont_reduce_128_word%=\n\t" +#else + "BLT.W L_sp_4096_mont_reduce_128_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp); +} - sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - ca); +#else +/* Reduce the number back to 4096 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_4096_mont_reduce_128(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR r11, [%[m]]\n\t" + /* i = 0 */ + "MOV r9, #0x0\n\t" + /* ca = 0 */ + "MOV r3, #0x0\n\t" + "\n" + "L_sp_4096_mont_reduce_128_word%=:\n\t" + /* mu = a[i] * mp */ + "LDR r10, [%[a]]\n\t" + "MUL r8, %[mp], r10\n\t" + /* j = 0 */ + "MOV r12, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_4096_mont_reduce_128_mul%=:\n\t" + /* a[i+j+0] += m[j+0] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+1] += m[j+1] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+2] += m[j+2] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + /* a[i+j+3] += m[j+3] * mu */ + "LDR r7, [%[m], r12]\n\t" + "LDR r10, [%[a], r12]\n\t" + "UMAAL r10, r4, r8, r7\n\t" + "STR r10, [%[a], r12]\n\t" + /* j += 1 */ + "ADD r12, r12, #0x4\n\t" + "CMP r12, #0x200\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_mont_reduce_128_mul%=\n\t" +#else + "BLT.N L_sp_4096_mont_reduce_128_mul%=\n\t" +#endif + "LDR r10, [%[a], #512]\n\t" + "ADDS r4, r4, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r3, r3, r3\n\t" + "STR r10, [%[a], #512]\n\t" + /* i += 1 */ + "ADD r9, r9, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r9, #0x200\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_mont_reduce_128_word%=\n\t" +#else + "BLT.N L_sp_4096_mont_reduce_128_word%=\n\t" +#endif + /* Loop Done */ + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + sp_4096_cond_sub_128(a - 128, a, m, (sp_digit)0 - mp); } +#endif /* !WOLFSSL_SP_SMALL */ +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -13150,7 +26594,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_128(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -13164,7 +26608,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_128(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -13180,39 +26624,44 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r5, #2\n\t" - "lsl r5, r5, #8\n\t" - "add r6, r6, r5\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r11, #0x0\n\t" + "ADD r12, %[a], #0x200\n\t" + "\n" + "L_sp_4096_sub_128_word%=:\n\t" + "RSBS r11, r11, #0x0\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC r11, r3, r3\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_4096_sub_128_word%=\n\t" +#else + "BNE.N L_sp_4096_sub_128_word%=\n\t" +#endif + "MOV %[r], r11\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #else @@ -13222,342 +26671,253 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_sub_128(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_4096_sub_128(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -13567,49 +26927,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_4096_word_128(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_4096_word_128_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_4096_word_128_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* Divide d in a and put remainder into r (m*d + r = a) * m is not calculated as it is not needed at this time. * @@ -13619,8 +27064,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_128_cond(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[256], t2[129]; sp_digit div, r1; @@ -13682,6 +27127,7 @@ } #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH) +#if defined(WOLFSSL_HAVE_SP_DH) || !defined(WOLFSSL_RSA_PUBLIC_ONLY) /* AND m into each word of a and store in r. * * r A single precision integer. @@ -13719,46 +27165,1457 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_4096_cmp_128(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_4096_cmp_128(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_4096_cmp_128(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add r6, r6, #252\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0x1fc\n\t" + "\n" + "L_sp_4096_cmp_128_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_4096_cmp_128_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #508]\n\t" + "LDR r5, [%[b], #508]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #504]\n\t" + "LDR r5, [%[b], #504]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #500]\n\t" + "LDR r5, [%[b], #500]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #496]\n\t" + "LDR r5, [%[b], #496]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #492]\n\t" + "LDR r5, [%[b], #492]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #488]\n\t" + "LDR r5, [%[b], #488]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #484]\n\t" + "LDR r5, [%[b], #484]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #480]\n\t" + "LDR r5, [%[b], #480]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #476]\n\t" + "LDR r5, [%[b], #476]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #472]\n\t" + "LDR r5, [%[b], #472]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #468]\n\t" + "LDR r5, [%[b], #468]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #464]\n\t" + "LDR r5, [%[b], #464]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #460]\n\t" + "LDR r5, [%[b], #460]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #456]\n\t" + "LDR r5, [%[b], #456]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #452]\n\t" + "LDR r5, [%[b], #452]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #448]\n\t" + "LDR r5, [%[b], #448]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #444]\n\t" + "LDR r5, [%[b], #444]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #440]\n\t" + "LDR r5, [%[b], #440]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #436]\n\t" + "LDR r5, [%[b], #436]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #432]\n\t" + "LDR r5, [%[b], #432]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #428]\n\t" + "LDR r5, [%[b], #428]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #424]\n\t" + "LDR r5, [%[b], #424]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #420]\n\t" + "LDR r5, [%[b], #420]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #416]\n\t" + "LDR r5, [%[b], #416]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #412]\n\t" + "LDR r5, [%[b], #412]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #408]\n\t" + "LDR r5, [%[b], #408]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #404]\n\t" + "LDR r5, [%[b], #404]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #400]\n\t" + "LDR r5, [%[b], #400]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #396]\n\t" + "LDR r5, [%[b], #396]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #392]\n\t" + "LDR r5, [%[b], #392]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #388]\n\t" + "LDR r5, [%[b], #388]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #384]\n\t" + "LDR r5, [%[b], #384]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #380]\n\t" + "LDR r5, [%[b], #380]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #376]\n\t" + "LDR r5, [%[b], #376]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #372]\n\t" + "LDR r5, [%[b], #372]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #368]\n\t" + "LDR r5, [%[b], #368]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #364]\n\t" + "LDR r5, [%[b], #364]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #360]\n\t" + "LDR r5, [%[b], #360]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #356]\n\t" + "LDR r5, [%[b], #356]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #352]\n\t" + "LDR r5, [%[b], #352]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #348]\n\t" + "LDR r5, [%[b], #348]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #344]\n\t" + "LDR r5, [%[b], #344]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #340]\n\t" + "LDR r5, [%[b], #340]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #336]\n\t" + "LDR r5, [%[b], #336]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #332]\n\t" + "LDR r5, [%[b], #332]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #328]\n\t" + "LDR r5, [%[b], #328]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #324]\n\t" + "LDR r5, [%[b], #324]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #320]\n\t" + "LDR r5, [%[b], #320]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #316]\n\t" + "LDR r5, [%[b], #316]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #312]\n\t" + "LDR r5, [%[b], #312]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #308]\n\t" + "LDR r5, [%[b], #308]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #304]\n\t" + "LDR r5, [%[b], #304]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #300]\n\t" + "LDR r5, [%[b], #300]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #296]\n\t" + "LDR r5, [%[b], #296]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #292]\n\t" + "LDR r5, [%[b], #292]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #288]\n\t" + "LDR r5, [%[b], #288]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #284]\n\t" + "LDR r5, [%[b], #284]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #280]\n\t" + "LDR r5, [%[b], #280]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #276]\n\t" + "LDR r5, [%[b], #276]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #272]\n\t" + "LDR r5, [%[b], #272]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #268]\n\t" + "LDR r5, [%[b], #268]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #264]\n\t" + "LDR r5, [%[b], #264]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #260]\n\t" + "LDR r5, [%[b], #260]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #256]\n\t" + "LDR r5, [%[b], #256]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #252]\n\t" + "LDR r5, [%[b], #252]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #248]\n\t" + "LDR r5, [%[b], #248]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #244]\n\t" + "LDR r5, [%[b], #244]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #240]\n\t" + "LDR r5, [%[b], #240]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #236]\n\t" + "LDR r5, [%[b], #236]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #232]\n\t" + "LDR r5, [%[b], #232]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #228]\n\t" + "LDR r5, [%[b], #228]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #224]\n\t" + "LDR r5, [%[b], #224]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #220]\n\t" + "LDR r5, [%[b], #220]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #216]\n\t" + "LDR r5, [%[b], #216]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #212]\n\t" + "LDR r5, [%[b], #212]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #208]\n\t" + "LDR r5, [%[b], #208]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #204]\n\t" + "LDR r5, [%[b], #204]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #200]\n\t" + "LDR r5, [%[b], #200]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #196]\n\t" + "LDR r5, [%[b], #196]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #192]\n\t" + "LDR r5, [%[b], #192]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #188]\n\t" + "LDR r5, [%[b], #188]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #184]\n\t" + "LDR r5, [%[b], #184]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #180]\n\t" + "LDR r5, [%[b], #180]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #176]\n\t" + "LDR r5, [%[b], #176]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #172]\n\t" + "LDR r5, [%[b], #172]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #168]\n\t" + "LDR r5, [%[b], #168]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #164]\n\t" + "LDR r5, [%[b], #164]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #160]\n\t" + "LDR r5, [%[b], #160]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #156]\n\t" + "LDR r5, [%[b], #156]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #152]\n\t" + "LDR r5, [%[b], #152]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #148]\n\t" + "LDR r5, [%[b], #148]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #144]\n\t" + "LDR r5, [%[b], #144]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #140]\n\t" + "LDR r5, [%[b], #140]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #136]\n\t" + "LDR r5, [%[b], #136]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #132]\n\t" + "LDR r5, [%[b], #132]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #128]\n\t" + "LDR r5, [%[b], #128]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #124]\n\t" + "LDR r5, [%[b], #124]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #120]\n\t" + "LDR r5, [%[b], #120]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #116]\n\t" + "LDR r5, [%[b], #116]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #112]\n\t" + "LDR r5, [%[b], #112]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #108]\n\t" + "LDR r5, [%[b], #108]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #104]\n\t" + "LDR r5, [%[b], #104]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #100]\n\t" + "LDR r5, [%[b], #100]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #96]\n\t" + "LDR r5, [%[b], #96]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #92]\n\t" + "LDR r5, [%[b], #92]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #88]\n\t" + "LDR r5, [%[b], #88]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #84]\n\t" + "LDR r5, [%[b], #84]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #80]\n\t" + "LDR r5, [%[b], #80]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #76]\n\t" + "LDR r5, [%[b], #76]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #72]\n\t" + "LDR r5, [%[b], #72]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #68]\n\t" + "LDR r5, [%[b], #68]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #64]\n\t" + "LDR r5, [%[b], #64]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "LDR r5, [%[b], #60]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #56]\n\t" + "LDR r5, [%[b], #56]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #52]\n\t" + "LDR r5, [%[b], #52]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #48]\n\t" + "LDR r5, [%[b], #48]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Divide d in a and put remainder into r (m*d + r = a) @@ -13770,8 +28627,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_4096_div_128(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[256], t2[129]; sp_digit div, r1; @@ -13816,6 +28673,7 @@ return sp_4096_div_128(a, m, NULL, r); } +#endif /* WOLFSSL_HAVE_SP_DH || !WOLFSSL_RSA_PUBLIC_ONLY */ #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || \ defined(WOLFSSL_HAVE_SP_DH) #ifdef WOLFSSL_SP_SMALL @@ -14279,6 +29137,7 @@ } #ifndef WOLFSSL_RSA_PUBLIC_ONLY +#ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -14287,40 +29146,304 @@ * b A single precision number to add. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_4096_cond_add_64(sp_digit* r, const sp_digit* a, const sp_digit* b, - sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_cond_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_4096_cond_add_64(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #1\n\t" - "lsl r5, r5, #8\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "adds r5, %[c], #-1\n\t" - "ldr r5, [%[a], r8]\n\t" - "adcs r5, r5, r6\n\t" - "mov %[c], #0\n\t" - "adcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_4096_cond_add_64_words%=:\n\t" + "ADDS r5, r5, #0xffffffff\n\t" + "LDR r6, [%[a], r4]\n\t" + "LDR r7, [%[b], r4]\n\t" + "AND r7, r7, %[m]\n\t" + "ADCS r6, r6, r7\n\t" + "ADC r5, r8, r8\n\t" + "STR r6, [%[r], r4]\n\t" + "ADD r4, r4, #0x4\n\t" + "CMP r4, #0x100\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_4096_cond_add_64_words%=\n\t" +#else + "BLT.N L_sp_4096_cond_add_64_words%=\n\t" +#endif + "MOV %[r], r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally add a and b using the mask m. + * m is -1 to add and 0 when not. + * + * r A single precision number representing conditional add result. + * a A single precision number to add with. + * b A single precision number to add. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_4096_cond_add_64(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_4096_cond_add_64(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADDS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "ADC %[r], r10, r10\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ /* RSA private key operation. * * in Array of bytes representing the number to exponentiate, base. @@ -14635,798 +29758,791 @@ #ifdef WOLFSSL_HAVE_SP_DH #ifdef HAVE_FFDHE_4096 +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_4096_lshift_128(sp_digit* r_p, const sp_digit* a_p, byte n_p) +#else static void sp_4096_lshift_128(sp_digit* r, const sp_digit* a, byte n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r6, #31\n\t" - "sub r6, r6, %[n]\n\t" - "add %[a], %[a], #448\n\t" - "add %[r], %[r], #448\n\t" - "ldr r3, [%[a], #60]\n\t" - "lsr r4, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r4, r4, r6\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r4, [%[r], #68]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r3, [%[r], #64]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r2, [%[r], #60]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r4, [%[r], #56]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r3, [%[r], #52]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r2, [%[r], #48]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r4, [%[r], #44]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r3, [%[r], #40]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r2, [%[r], #36]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r4, [%[r], #32]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r3, [%[r], #28]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r2, [%[r], #24]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r4, [%[r], #20]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r3, [%[r], #16]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #4]\n\t" - "str r2, [%[r], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #0]\n\t" - "str r4, [%[r], #8]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r4, [%[a], #60]\n\t" - "str r3, [%[r], #68]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #56]\n\t" - "str r2, [%[r], #64]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #52]\n\t" - "str r4, [%[r], #60]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #48]\n\t" - "str r3, [%[r], #56]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #44]\n\t" - "str r2, [%[r], #52]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #40]\n\t" - "str r4, [%[r], #48]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #36]\n\t" - "str r3, [%[r], #44]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #32]\n\t" - "str r2, [%[r], #40]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #28]\n\t" - "str r4, [%[r], #36]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #24]\n\t" - "str r3, [%[r], #32]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #20]\n\t" - "str r2, [%[r], #28]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #16]\n\t" - "str r4, [%[r], #24]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #12]\n\t" - "str r3, [%[r], #20]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #8]\n\t" - "str r2, [%[r], #16]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #4]\n\t" - "str r4, [%[r], #12]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #0]\n\t" - "str r3, [%[r], #8]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r3, [%[a], #60]\n\t" - "str r2, [%[r], #68]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r4, [%[r], #68]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r3, [%[r], #64]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r2, [%[r], #60]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r4, [%[r], #56]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r3, [%[r], #52]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r2, [%[r], #48]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r4, [%[r], #44]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r3, [%[r], #40]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r2, [%[r], #36]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r4, [%[r], #32]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r3, [%[r], #28]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r2, [%[r], #24]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r4, [%[r], #20]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r3, [%[r], #16]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #4]\n\t" - "str r2, [%[r], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #0]\n\t" - "str r4, [%[r], #8]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r4, [%[a], #60]\n\t" - "str r3, [%[r], #68]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #56]\n\t" - "str r2, [%[r], #64]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #52]\n\t" - "str r4, [%[r], #60]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #48]\n\t" - "str r3, [%[r], #56]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #44]\n\t" - "str r2, [%[r], #52]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #40]\n\t" - "str r4, [%[r], #48]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #36]\n\t" - "str r3, [%[r], #44]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #32]\n\t" - "str r2, [%[r], #40]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #28]\n\t" - "str r4, [%[r], #36]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #24]\n\t" - "str r3, [%[r], #32]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #20]\n\t" - "str r2, [%[r], #28]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #16]\n\t" - "str r4, [%[r], #24]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #12]\n\t" - "str r3, [%[r], #20]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #8]\n\t" - "str r2, [%[r], #16]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #4]\n\t" - "str r4, [%[r], #12]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #0]\n\t" - "str r3, [%[r], #8]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r3, [%[a], #60]\n\t" - "str r2, [%[r], #68]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "sub %[a], %[a], #64\n\t" - "sub %[r], %[r], #64\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r4, [%[r], #68]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r3, [%[r], #64]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r2, [%[r], #60]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r4, [%[r], #56]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r3, [%[r], #52]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r2, [%[r], #48]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r4, [%[r], #44]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r3, [%[r], #40]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r2, [%[r], #36]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r4, [%[r], #32]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r3, [%[r], #28]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r2, [%[r], #24]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r4, [%[r], #20]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r3, [%[r], #16]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #4]\n\t" - "str r2, [%[r], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #0]\n\t" - "str r4, [%[r], #8]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "str r2, [%[r]]\n\t" - "str r3, [%[r], #4]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register byte n __asm__ ("r2") = (byte)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "RSB r7, %[n], #0x1f\n\t" + "LDR r5, [%[a], #508]\n\t" + "LSR r6, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r6, r6, r7\n\t" + "LDR r4, [%[a], #504]\n\t" + "STR r6, [%[r], #512]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #500]\n\t" + "STR r5, [%[r], #508]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #496]\n\t" + "STR r4, [%[r], #504]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #492]\n\t" + "STR r6, [%[r], #500]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #488]\n\t" + "STR r5, [%[r], #496]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #484]\n\t" + "STR r4, [%[r], #492]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #480]\n\t" + "STR r6, [%[r], #488]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #476]\n\t" + "STR r5, [%[r], #484]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #472]\n\t" + "STR r4, [%[r], #480]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #468]\n\t" + "STR r6, [%[r], #476]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #464]\n\t" + "STR r5, [%[r], #472]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #460]\n\t" + "STR r4, [%[r], #468]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #456]\n\t" + "STR r6, [%[r], #464]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #452]\n\t" + "STR r5, [%[r], #460]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #448]\n\t" + "STR r4, [%[r], #456]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #444]\n\t" + "STR r6, [%[r], #452]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #440]\n\t" + "STR r5, [%[r], #448]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #436]\n\t" + "STR r4, [%[r], #444]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #432]\n\t" + "STR r6, [%[r], #440]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #428]\n\t" + "STR r5, [%[r], #436]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #424]\n\t" + "STR r4, [%[r], #432]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #420]\n\t" + "STR r6, [%[r], #428]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #416]\n\t" + "STR r5, [%[r], #424]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #412]\n\t" + "STR r4, [%[r], #420]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #408]\n\t" + "STR r6, [%[r], #416]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #404]\n\t" + "STR r5, [%[r], #412]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #400]\n\t" + "STR r4, [%[r], #408]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #396]\n\t" + "STR r6, [%[r], #404]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #392]\n\t" + "STR r5, [%[r], #400]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #388]\n\t" + "STR r4, [%[r], #396]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #384]\n\t" + "STR r6, [%[r], #392]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #380]\n\t" + "STR r5, [%[r], #388]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #376]\n\t" + "STR r4, [%[r], #384]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #372]\n\t" + "STR r6, [%[r], #380]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #368]\n\t" + "STR r5, [%[r], #376]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #364]\n\t" + "STR r4, [%[r], #372]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #360]\n\t" + "STR r6, [%[r], #368]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #356]\n\t" + "STR r5, [%[r], #364]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #352]\n\t" + "STR r4, [%[r], #360]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #348]\n\t" + "STR r6, [%[r], #356]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #344]\n\t" + "STR r5, [%[r], #352]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #340]\n\t" + "STR r4, [%[r], #348]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #336]\n\t" + "STR r6, [%[r], #344]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #332]\n\t" + "STR r5, [%[r], #340]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #328]\n\t" + "STR r4, [%[r], #336]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #324]\n\t" + "STR r6, [%[r], #332]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #320]\n\t" + "STR r5, [%[r], #328]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #316]\n\t" + "STR r4, [%[r], #324]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #312]\n\t" + "STR r6, [%[r], #320]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #308]\n\t" + "STR r5, [%[r], #316]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #304]\n\t" + "STR r4, [%[r], #312]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #300]\n\t" + "STR r6, [%[r], #308]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #296]\n\t" + "STR r5, [%[r], #304]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #292]\n\t" + "STR r4, [%[r], #300]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #288]\n\t" + "STR r6, [%[r], #296]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #284]\n\t" + "STR r5, [%[r], #292]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #280]\n\t" + "STR r4, [%[r], #288]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #276]\n\t" + "STR r6, [%[r], #284]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #272]\n\t" + "STR r5, [%[r], #280]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #268]\n\t" + "STR r4, [%[r], #276]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #264]\n\t" + "STR r6, [%[r], #272]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #260]\n\t" + "STR r5, [%[r], #268]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #256]\n\t" + "STR r4, [%[r], #264]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #252]\n\t" + "STR r6, [%[r], #260]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #248]\n\t" + "STR r5, [%[r], #256]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #244]\n\t" + "STR r4, [%[r], #252]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #240]\n\t" + "STR r6, [%[r], #248]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #236]\n\t" + "STR r5, [%[r], #244]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #232]\n\t" + "STR r4, [%[r], #240]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #228]\n\t" + "STR r6, [%[r], #236]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #224]\n\t" + "STR r5, [%[r], #232]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #220]\n\t" + "STR r4, [%[r], #228]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #216]\n\t" + "STR r6, [%[r], #224]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #212]\n\t" + "STR r5, [%[r], #220]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #208]\n\t" + "STR r4, [%[r], #216]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #204]\n\t" + "STR r6, [%[r], #212]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #200]\n\t" + "STR r5, [%[r], #208]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #196]\n\t" + "STR r4, [%[r], #204]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #192]\n\t" + "STR r6, [%[r], #200]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #188]\n\t" + "STR r5, [%[r], #196]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #184]\n\t" + "STR r4, [%[r], #192]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #180]\n\t" + "STR r6, [%[r], #188]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #176]\n\t" + "STR r5, [%[r], #184]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #172]\n\t" + "STR r4, [%[r], #180]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #168]\n\t" + "STR r6, [%[r], #176]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #164]\n\t" + "STR r5, [%[r], #172]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #160]\n\t" + "STR r4, [%[r], #168]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #156]\n\t" + "STR r6, [%[r], #164]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #152]\n\t" + "STR r5, [%[r], #160]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #148]\n\t" + "STR r4, [%[r], #156]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #144]\n\t" + "STR r6, [%[r], #152]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #140]\n\t" + "STR r5, [%[r], #148]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #136]\n\t" + "STR r4, [%[r], #144]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #132]\n\t" + "STR r6, [%[r], #140]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #128]\n\t" + "STR r5, [%[r], #136]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #124]\n\t" + "STR r4, [%[r], #132]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #120]\n\t" + "STR r6, [%[r], #128]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #116]\n\t" + "STR r5, [%[r], #124]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #112]\n\t" + "STR r4, [%[r], #120]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #108]\n\t" + "STR r6, [%[r], #116]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #104]\n\t" + "STR r5, [%[r], #112]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #100]\n\t" + "STR r4, [%[r], #108]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #96]\n\t" + "STR r6, [%[r], #104]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #92]\n\t" + "STR r5, [%[r], #100]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #88]\n\t" + "STR r4, [%[r], #96]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #84]\n\t" + "STR r6, [%[r], #92]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #80]\n\t" + "STR r5, [%[r], #88]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #76]\n\t" + "STR r4, [%[r], #84]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #72]\n\t" + "STR r6, [%[r], #80]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #68]\n\t" + "STR r5, [%[r], #76]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #64]\n\t" + "STR r4, [%[r], #72]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #60]\n\t" + "STR r6, [%[r], #68]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #56]\n\t" + "STR r5, [%[r], #64]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #52]\n\t" + "STR r4, [%[r], #60]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #48]\n\t" + "STR r6, [%[r], #56]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #44]\n\t" + "STR r5, [%[r], #52]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #40]\n\t" + "STR r4, [%[r], #48]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #36]\n\t" + "STR r6, [%[r], #44]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #32]\n\t" + "STR r5, [%[r], #40]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #28]\n\t" + "STR r4, [%[r], #36]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #24]\n\t" + "STR r6, [%[r], #32]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #20]\n\t" + "STR r5, [%[r], #28]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #16]\n\t" + "STR r4, [%[r], #24]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #12]\n\t" + "STR r6, [%[r], #20]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #8]\n\t" + "STR r5, [%[r], #16]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #4]\n\t" + "STR r4, [%[r], #12]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a]]\n\t" + "STR r6, [%[r], #8]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "STR r4, [%[r]]\n\t" + "STR r5, [%[r], #4]\n\t" + : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : [r] "r" (r), [a] "r" (a), [n] "r" (n) - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r3", "r7", "cc" ); } @@ -15712,1032 +30828,1159 @@ }; #endif +#ifdef WOLFSSL_SP_SMALL /* Multiply a and b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_256_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[8]; - sp_digit* tmp = tmp_arr; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x40\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_256_mul_8_outer%=:\n\t" + "SUBS r3, r5, #0x1c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_256_mul_8_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_256_mul_8_inner_done%=\n\t" +#else + "BGT.N L_sp_256_mul_8_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_256_mul_8_inner%=\n\t" +#else + "BLT.N L_sp_256_mul_8_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_256_mul_8_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x34\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_256_mul_8_outer%=\n\t" +#else + "BLE.N L_sp_256_mul_8_outer%=\n\t" +#endif + "LDR lr, [%[a], #28]\n\t" + "LDR r11, [%[b], #28]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_256_mul_8_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_256_mul_8_store%=\n\t" +#else + "BGT.N L_sp_256_mul_8_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" + ); +} - __asm__ __volatile__ ( +#else +#ifdef WOLFSSL_SP_NO_UMAAL +/* Multiply a and b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x24\n\t" + "STR %[r], [sp, #32]\n\t" + "MOV %[r], #0x0\n\t" + "LDR r12, [%[a]]\n\t" /* A[0] * B[0] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "mov r5, #0\n\t" - "str r3, [%[tmp], #0]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[b]]\n\t" + "UMULL r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "UMULL r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "UMULL r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "UMULL r9, r10, r12, lr\n\t" + "STR r3, [sp]\n\t" /* A[0] * B[1] */ - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r8\n\t" + "LDR lr, [%[b], #4]\n\t" + "MOV r11, %[r]\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[0] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[0] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[0] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r3, %[r], #0x0\n\t" + "UMLAL r10, r3, r12, lr\n\t" /* A[1] * B[0] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #4]\n\t" - "mov r4, #0\n\t" - /* A[0] * B[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR r12, [%[a], #4]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "STR r4, [sp, #4]\n\t" + "ADDS r5, r5, r11\n\t" /* A[1] * B[1] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[0] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #8]\n\t" - "mov r5, #0\n\t" - /* A[0] * B[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[1] * B[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[1] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[0] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[tmp], #12]\n\t" - "mov r3, #0\n\t" - /* A[0] * B[4] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[1] * B[3] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[2] * B[2] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[3] * B[1] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[4] * B[0] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #16]\n\t" - "mov r4, #0\n\t" - /* A[0] * B[5] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" /* A[1] * B[4] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[2] * B[3] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[2] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[1] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[0] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #20]\n\t" - "mov r5, #0\n\t" - /* A[0] * B[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" /* A[1] * B[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[2] * B[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[3] * B[3] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[2] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[1] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[0] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[tmp], #24]\n\t" - "mov r3, #0\n\t" - /* A[0] * B[7] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" /* A[1] * B[6] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[2] * B[5] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[3] * B[4] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[4] * B[3] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[5] * B[2] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[6] * B[1] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[7] * B[0] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #28]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[1] * B[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r4, %[r], #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "LDR r12, [%[a], #8]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "STR r5, [sp, #8]\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[2] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[2] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[2] * B[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[3] * B[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[4] * B[4] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[5] * B[3] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[2] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[1] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #32]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[2] * B[7] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r5, %[r], #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "LDR r12, [%[a], #12]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[3] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[3] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[3] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[3] * B[6] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[4] * B[5] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[5] * B[4] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * B[3] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[7] * B[2] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #36]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[3] * B[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r6, %[r], #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "LDR r12, [%[a], #16]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[4] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[4] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[4] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[4] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[4] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[4] * B[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[5] * B[5] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[6] * B[4] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - /* A[7] * B[3] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #40]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[4] * B[7] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r7, %[r], #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "LDR r12, [%[a], #20]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[5] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[5] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[5] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[5] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[5] * B[6] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[6] * B[5] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[7] * B[4] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #44]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[5] * B[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r8, %[r], #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "LDR r12, [%[a], #24]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[6] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[6] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[6] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[6] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[6] * B[6] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[7] * B[5] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #48]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" /* A[6] * B[7] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r9, %[r], #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "LDR r12, [%[a], #28]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[7] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[7] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[7] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[7] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[7] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" /* A[7] * B[6] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #52]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" /* A[7] * B[7] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "str r5, [%[r], #56]\n\t" - "str r3, [%[r], #60]\n\t" - /* Transfer tmp to r */ - "ldr r3, [%[tmp], #0]\n\t" - "ldr r4, [%[tmp], #4]\n\t" - "ldr r5, [%[tmp], #8]\n\t" - "ldr r6, [%[tmp], #12]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[tmp], #16]\n\t" - "ldr r4, [%[tmp], #20]\n\t" - "ldr r5, [%[tmp], #24]\n\t" - "ldr r6, [%[tmp], #28]\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" + "LDR lr, [%[b], #28]\n\t" + "ADC r10, %[r], #0x0\n\t" + "UMLAL r9, r10, r12, lr\n\t" + "LDR %[r], [sp, #32]\n\t" + "ADD %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "SUB %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD sp, sp, #0x24\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +} + +#else +/* Multiply a and b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +SP_NOINLINE static void sp_256_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x2c\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "STRD %[r], %[a], [sp, #36]\n\t" +#else + "STR %[r], [sp, #36]\n\t" + "STR %[a], [sp, #40]\n\t" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[b]\n\t" + "LDM %[a], {r0, r1, r2, r3}\n\t" + "LDM lr!, {r4, r5, r6}\n\t" + "UMULL r10, r11, r0, r4\n\t" + "UMULL r12, r7, r1, r4\n\t" + "UMAAL r11, r12, r0, r5\n\t" + "UMULL r8, r9, r2, r4\n\t" + "UMAAL r12, r8, r1, r5\n\t" + "UMAAL r12, r7, r0, r6\n\t" + "UMAAL r8, r9, r3, r4\n\t" + "STM sp, {r10, r11, r12}\n\t" + "UMAAL r7, r8, r2, r5\n\t" + "LDM lr!, {r4}\n\t" + "UMULL r10, r11, r1, r6\n\t" + "UMAAL r8, r9, r2, r6\n\t" + "UMAAL r7, r10, r0, r4\n\t" + "UMAAL r8, r11, r3, r5\n\t" + "STR r7, [sp, #12]\n\t" + "UMAAL r8, r10, r1, r4\n\t" + "UMAAL r9, r11, r3, r6\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "UMAAL r10, r11, r3, r4\n\t" + "LDM lr, {r4, r5, r6, r7}\n\t" + "MOV r12, #0x0\n\t" + "UMLAL r8, r12, r0, r4\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r10, r12, r2, r4\n\t" + "UMAAL r11, r12, r3, r4\n\t" + "MOV r4, #0x0\n\t" + "UMLAL r9, r4, r0, r5\n\t" + "UMAAL r10, r4, r1, r5\n\t" + "UMAAL r11, r4, r2, r5\n\t" + "UMAAL r12, r4, r3, r5\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r0, r6\n\t" + "UMAAL r11, r5, r1, r6\n\t" + "UMAAL r12, r5, r2, r6\n\t" + "UMAAL r4, r5, r3, r6\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r11, r6, r0, r7\n\t" + "LDR r0, [sp, #40]\n\t" + "UMAAL r12, r6, r1, r7\n\t" + "ADD r0, r0, #0x10\n\t" + "UMAAL r4, r6, r2, r7\n\t" + "SUB lr, lr, #0x10\n\t" + "UMAAL r5, r6, r3, r7\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "STR r6, [sp, #32]\n\t" + "LDM lr!, {r6}\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r8, r7, r0, r6\n\t" + "UMAAL r9, r7, r1, r6\n\t" + "STR r8, [sp, #16]\n\t" + "UMAAL r10, r7, r2, r6\n\t" + "UMAAL r11, r7, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r8, #0x0\n\t" + "UMLAL r9, r8, r0, r6\n\t" + "UMAAL r10, r8, r1, r6\n\t" + "STR r9, [sp, #20]\n\t" + "UMAAL r11, r8, r2, r6\n\t" + "UMAAL r12, r8, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r10, r9, r0, r6\n\t" + "UMAAL r11, r9, r1, r6\n\t" + "STR r10, [sp, #24]\n\t" + "UMAAL r12, r9, r2, r6\n\t" + "UMAAL r4, r9, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r10, #0x0\n\t" + "UMLAL r11, r10, r0, r6\n\t" + "UMAAL r12, r10, r1, r6\n\t" + "STR r11, [sp, #28]\n\t" + "UMAAL r4, r10, r2, r6\n\t" + "UMAAL r5, r10, r3, r6\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r12, r7, r0, r11\n\t" + "UMAAL r4, r7, r1, r11\n\t" + "LDR r6, [sp, #32]\n\t" + "UMAAL r5, r7, r2, r11\n\t" + "UMAAL r6, r7, r3, r11\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r4, r8, r0, r11\n\t" + "UMAAL r5, r8, r1, r11\n\t" + "UMAAL r6, r8, r2, r11\n\t" + "UMAAL r7, r8, r3, r11\n\t" + "LDM lr, {r11, lr}\n\t" + "UMAAL r5, r9, r0, r11\n\t" + "UMAAL r6, r10, r0, lr\n\t" + "UMAAL r6, r9, r1, r11\n\t" + "UMAAL r7, r10, r1, lr\n\t" + "UMAAL r7, r9, r2, r11\n\t" + "UMAAL r8, r10, r2, lr\n\t" + "UMAAL r8, r9, r3, r11\n\t" + "UMAAL r9, r10, r3, lr\n\t" + "MOV r3, r12\n\t" + "LDR lr, [sp, #36]\n\t" + "ADD lr, lr, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "SUB lr, lr, #0x20\n\t" + "LDM sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD sp, sp, #0x2c\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [tmp] "r" (tmp) - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc" ); } +#endif /* WOLFSSL_SP_NO_UMAAL */ +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL /* Square a and put result in r. (r = a * a) * * r A single precision integer. * a A single precision integer. */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_256_sqr_8(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x40\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_256_sqr_8_outer%=:\n\t" + "SUBS r3, r5, #0x1c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_256_sqr_8_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_256_sqr_8_inner_done%=\n\t" +#else + "BGT.N L_sp_256_sqr_8_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_256_sqr_8_inner%=\n\t" +#else + "BLT.N L_sp_256_sqr_8_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_256_sqr_8_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x34\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_256_sqr_8_outer%=\n\t" +#else + "BLE.N L_sp_256_sqr_8_outer%=\n\t" +#endif + "LDR lr, [%[a], #28]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_256_sqr_8_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_256_sqr_8_store%=\n\t" +#else + "BGT.N L_sp_256_sqr_8_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" + ); +} + +#else +#ifdef WOLFSSL_SP_NO_UMAAL +/* Square a and put result in r. (r = a * a) + * + * r A single precision integer. + * a A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p) +#else SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[8]; - sp_digit* tmp = tmp_arr; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - /* A[0] * A[0] */ - "ldr r6, [%[a], #0]\n\t" - "umull r3, r4, r6, r6\n\t" - "mov r5, #0\n\t" - "str r3, [%[tmp], #0]\n\t" - "mov r3, #0\n\t" + "SUB sp, sp, #0x44\n\t" + "STR %[r], [sp, #64]\n\t" + "MOV %[r], #0x0\n\t" + "LDR r12, [%[a]]\n\t" /* A[0] * A[1] */ - "ldr r8, [%[a], #4]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[tmp], #4]\n\t" - "mov r4, #0\n\t" - /* A[0] * A[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - /* A[1] * A[1] */ - "ldr r6, [%[a], #4]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[tmp], #8]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[a], #4]\n\t" + "UMULL r4, r5, r12, lr\n\t" /* A[0] * A[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" - /* A[1] * A[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[tmp], #12]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[a], #12]\n\t" + "UMULL r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "UMULL r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "UMULL r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "LDR lr, [%[a], #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[0] * A[4] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #16]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[0] * A[6] */ + "LDR lr, [%[a], #24]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + "ADCS r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + "STR r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "LDR r12, [%[a], #4]\n\t" + "LDR lr, [%[a], #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" /* A[1] * A[3] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[2] */ - "ldr r6, [%[a], #8]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[tmp], #16]\n\t" - "mov r4, #0\n\t" - /* A[0] * A[5] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" /* A[1] * A[4] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[3] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r5, r5, r9\n\t" - "adcs r3, r3, r10\n\t" - "adc r4, r4, r11\n\t" - "str r5, [%[tmp], #20]\n\t" - "mov r5, #0\n\t" - /* A[0] * A[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" /* A[1] * A[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[3] */ - "ldr r6, [%[a], #12]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[tmp], #24]\n\t" - "mov r3, #0\n\t" - /* A[0] * A[7] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" /* A[1] * A[6] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[2] * A[5] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[4] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[tmp], #28]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[1] * A[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r4, %[r], #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "LDR r12, [%[a], #8]\n\t" + "LDR lr, [%[a], #12]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * A[4] */ + "LDR lr, [%[a], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" /* A[2] * A[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[3] * A[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[4] * A[4] */ - "ldr r6, [%[a], #16]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r5, r5, r9\n\t" - "adcs r3, r3, r10\n\t" - "adc r4, r4, r11\n\t" - "str r5, [%[r], #32]\n\t" - "mov r5, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[2] * A[7] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r5, %[r], #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "LDR r12, [%[a], #12]\n\t" + "LDR lr, [%[a], #16]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" /* A[3] * A[6] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[4] * A[5] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adc r5, r5, r11\n\t" - "str r3, [%[r], #36]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[3] * A[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r9, r10, r6, r8\n\t" - "mov r11, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r6, %[r], #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "LDR r12, [%[a], #16]\n\t" + "LDR lr, [%[a], #20]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" /* A[4] * A[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r9, r9, r6\n\t" - "adcs r10, r10, r8\n\t" - "adc r11, r11, #0\n\t" - /* A[5] * A[5] */ - "ldr r6, [%[a], #20]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adc r11, r11, r11\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adc r3, r3, r11\n\t" - "str r4, [%[r], #40]\n\t" - "mov r4, #0\n\t" + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" /* A[4] * A[7] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r7, %[r], #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" /* A[5] * A[6] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adcs r3, r3, r8\n\t" - "adc r4, r4, #0\n\t" - "str r5, [%[r], #44]\n\t" - "mov r5, #0\n\t" + "LDR r12, [%[a], #20]\n\t" + "LDR lr, [%[a], #24]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" /* A[5] * A[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[6] * A[6] */ - "ldr r6, [%[a], #24]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - "str r3, [%[r], #48]\n\t" - "mov r3, #0\n\t" + "LDR lr, [%[a], #28]\n\t" + "ADC r8, %[r], #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" /* A[6] * A[7] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r3, r3, #0\n\t" - "str r4, [%[r], #52]\n\t" - "mov r4, #0\n\t" + "LDR r12, [%[a], #24]\n\t" + "LDR lr, [%[a], #28]\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "STM lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADCS r3, r3, r3\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADC r10, %[r], #0x0\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "MOV lr, sp\n\t" + /* A[0] * A[0] */ + "LDR r12, [%[a]]\n\t" + "UMULL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[1] * A[1] */ + "LDR r12, [%[a], #4]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * A[2] */ + "LDR r12, [%[a], #8]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * A[3] */ + "LDR r12, [%[a], #12]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, r12\n\t" + "ADDS r10, r10, r11\n\t" + "STM lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "LDR r12, [%[a], #16]\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * A[5] */ + "LDR r12, [%[a], #20]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * A[6] */ + "LDR r12, [%[a], #24]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" /* A[7] * A[7] */ - "ldr r6, [%[a], #28]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r5, r5, r6\n\t" - "adc r3, r3, r8\n\t" - "str r5, [%[r], #56]\n\t" - "str r3, [%[r], #60]\n\t" - /* Transfer tmp to r */ - "ldr r3, [%[tmp], #0]\n\t" - "ldr r4, [%[tmp], #4]\n\t" - "ldr r5, [%[tmp], #8]\n\t" - "ldr r6, [%[tmp], #12]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[tmp], #16]\n\t" - "ldr r4, [%[tmp], #20]\n\t" - "ldr r5, [%[tmp], #24]\n\t" - "ldr r6, [%[tmp], #28]\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" - : - : [r] "r" (r), [a] "r" (a), [tmp] "r" (tmp) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11" - ); -} - -#ifdef WOLFSSL_SP_SMALL -/* Add b to a into r. (r = a + b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #32\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + "LDR r12, [%[a], #28]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r9, r10, r12, r12\n\t" + "LDR %[r], [sp, #64]\n\t" + "ADD %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM sp, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "SUB %[r], %[r], #0x20\n\t" + "STM %[r], {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); - - return c; } #else -/* Add b to a into r. (r = a + b) +/* Square a and put result in r. (r = a * a) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_sqr_8(sp_digit* r_p, const sp_digit* a_p) +#else +SP_NOINLINE static void sp_256_sqr_8(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x20\n\t" + "STR %[r], [sp, #28]\n\t" + "LDM %[a], {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + "UMULL r9, r10, r0, r0\n\t" + "UMULL r11, r12, r0, r1\n\t" + "ADDS r11, r11, r11\n\t" + "MOV lr, #0x0\n\t" + "UMAAL r10, r11, lr, lr\n\t" + "STM sp, {r9, r10}\n\t" + "MOV r8, lr\n\t" + "UMAAL r8, r12, r0, r2\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r8, r11, r1, r1\n\t" + "UMULL r9, r10, r0, r3\n\t" + "UMAAL r9, r12, r1, r2\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STRD r8, r9, [sp, #8]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r10, r0, r4\n\t" + "UMAAL r9, r12, r1, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r2, r2\n\t" + "STR r9, [sp, #16]\n\t" + "UMULL r9, r8, r0, r5\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r9, r10, r2, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STR r9, [sp, #20]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r8, r0, r6\n\t" + "UMAAL r9, r12, r1, r5\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r3, r3\n\t" + "STR r9, [sp, #24]\n\t" + "UMULL r0, r9, r0, r7\n\t" + "UMAAL r0, r8, r1, r6\n\t" + "UMAAL r0, r12, r2, r5\n\t" + "UMAAL r0, r10, r3, r4\n\t" + "ADCS r0, r0, r0\n\t" + "UMAAL r0, r11, lr, lr\n\t" + /* R[7] = r0 */ + "UMAAL r9, r8, r1, r7\n\t" + "UMAAL r9, r10, r2, r6\n\t" + "UMAAL r12, r9, r3, r5\n\t" + "ADCS r12, r12, r12\n\t" + "UMAAL r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "UMAAL r9, r8, r2, r7\n\t" + "UMAAL r10, r9, r3, r6\n\t" + "MOV r2, lr\n\t" + "UMAAL r10, r2, r4, r5\n\t" + "ADCS r10, r10, r10\n\t" + "UMAAL r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "UMAAL r2, r8, r3, r7\n\t" + "UMAAL r2, r9, r4, r6\n\t" + "ADCS r3, r2, r2\n\t" + "UMAAL r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "MOV r1, lr\n\t" + "UMAAL r1, r8, r4, r7\n\t" + "UMAAL r1, r9, r5, r6\n\t" + "ADCS r4, r1, r1\n\t" + "UMAAL r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "UMAAL r8, r9, r5, r7\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "MOV r5, lr\n\t" + "UMAAL r5, r9, r6, r7\n\t" + "ADCS r5, r5, r5\n\t" + "UMAAL r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r5, r7, r7\n\t" + "ADCS r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + "LDR lr, [sp, #28]\n\t" + "ADD lr, lr, #0x1c\n\t" + "STM lr!, {r0, r12}\n\t" + "STM lr!, {r11}\n\t" + "STM lr!, {r10}\n\t" + "STM lr!, {r3, r4, r8, r9}\n\t" + "STM lr!, {r7}\n\t" + "SUB lr, lr, #0x40\n\t" + "LDM sp, {r0, r1, r2, r3, r4, r5, r6}\n\t" + "STM lr, {r0, r1, r2, r3, r4, r5, r6}\n\t" + "ADD sp, sp, #0x20\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); - - return c; } +#endif /* WOLFSSL_SP_NO_UMAAL */ #endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) +/* Add b to a into r. (r = a + b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "add r6, r6, #32\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x20\n\t" + "\n" + "L_sp_256_add_8_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_256_add_8_word%=\n\t" +#else + "BNE.N L_sp_256_add_8_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #else -/* Sub b from a into r. (r = a - b) +/* Add b to a into r. (r = a + b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_256_add_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -16747,258 +31990,244 @@ * a The number to convert. * m The modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static int sp_256_mod_mul_norm_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else static int sp_256_mod_mul_norm_8(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "sub sp, sp, #24\n\t" - "ldr r2, [%[a], #0]\n\t" - "ldr r3, [%[a], #4]\n\t" - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[a], #12]\n\t" - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #20]\n\t" - "ldr r9, [%[a], #24]\n\t" - "ldr r10, [%[a], #28]\n\t" + "SUB sp, sp, #0x18\n\t" + "LDM %[a], {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" /* Clear overflow and underflow */ - "mov r14, #0\n\t" - "mov r12, #0\n\t" + "MOV r11, #0x0\n\t" + "MOV r12, #0x0\n\t" /* t[0] = 1 1 0 -1 -1 -1 -1 0 */ - "adds r11, r2, r3\n\t" - "adc r14, r14, #0\n\t" - "subs r11, r11, r5\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r6\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r8\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r9\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r10, r2, r3\n\t" + "ADC r11, r11, #0x0\n\t" + "SUBS r10, r10, r5\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r10, r10, r6\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r10, r10, r7\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r10, r10, r8\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[0] */ - "str r11, [sp, #0]\n\t" - "neg r12, r12\n\t" - "mov r11, #0\n\t" + "STR r10, [sp]\n\t" + "neg r12, r12\n\t" + "MOV r10, #0x0\n\t" /* t[1] = 0 1 1 0 -1 -1 -1 -1 */ - "adds r14, r14, r3\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r4\n\t" - "adc r11, r11, #0\n\t" - "subs r14, r14, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r6\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r8\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r9\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r10\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r11, r11, r3\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r4\n\t" + "ADC r10, r10, #0x0\n\t" + "SUBS r11, r11, r12\n\t" + "SBC r12, r12, r12\n\t" + "SUBS r11, r11, r6\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r7\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r8\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r9\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[1] */ - "str r14, [sp, #4]\n\t" - "neg r12, r12\n\t" - "mov r14, #0\n\t" + "STR r11, [sp, #4]\n\t" + "neg r12, r12\n\t" + "MOV r11, #0x0\n\t" /* t[2] = 0 0 1 1 0 -1 -1 -1 */ - "adds r11, r11, r4\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r5\n\t" - "adc r14, r14, #0\n\t" - "subs r11, r11, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r8\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r9\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r10\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r10, r10, r4\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r5\n\t" + "ADC r11, r11, #0x0\n\t" + "SUBS r10, r10, r12\n\t" + "SBC r12, r12, r12\n\t" + "SUBS r10, r10, r7\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r10, r10, r8\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r10, r10, r9\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[2] */ - "str r11, [sp, #8]\n\t" - "neg r12, r12\n\t" - "mov r11, #0\n\t" + "STR r10, [sp, #8]\n\t" + "neg r12, r12\n\t" + "MOV r10, #0x0\n\t" /* t[3] = -1 -1 0 2 2 1 0 -1 */ - "adds r14, r14, r5\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r5\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r6\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r6\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r8\n\t" - "adc r11, r11, #0\n\t" - "subs r14, r14, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r2\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r3\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r10\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r6\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r6\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r7\n\t" + "ADC r10, r10, #0x0\n\t" + "SUBS r11, r11, r12\n\t" + "SBC r12, r12, r12\n\t" + "SUBS r11, r11, r2\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r3\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r9\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[3] */ - "str r14, [sp, #12]\n\t" - "neg r12, r12\n\t" - "mov r14, #0\n\t" + "STR r11, [sp, #12]\n\t" + "neg r12, r12\n\t" + "MOV r11, #0x0\n\t" /* t[4] = 0 -1 -1 0 2 2 1 0 */ - "adds r11, r11, r6\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r6\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r8\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r8\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r9\n\t" - "adc r14, r14, #0\n\t" - "subs r11, r11, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r3\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r4\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r10, r10, r6\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r6\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r7\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r7\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r8\n\t" + "ADC r11, r11, #0x0\n\t" + "SUBS r10, r10, r12\n\t" + "SBC r12, r12, r12\n\t" + "SUBS r10, r10, r3\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r10, r10, r4\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[4] */ - "str r11, [sp, #16]\n\t" - "neg r12, r12\n\t" - "mov r11, #0\n\t" + "STR r10, [sp, #16]\n\t" + "neg r12, r12\n\t" + "MOV r10, #0x0\n\t" /* t[5] = 0 0 -1 -1 0 2 2 1 */ - "adds r14, r14, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r8\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r9\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r9\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r10\n\t" - "adc r11, r11, #0\n\t" - "subs r14, r14, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r4\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r5\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r11, r11, r7\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r7\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r8\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r8\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r9\n\t" + "ADC r10, r10, #0x0\n\t" + "SUBS r11, r11, r12\n\t" + "SBC r12, r12, r12\n\t" + "SUBS r11, r11, r4\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r5\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[5] */ - "str r14, [sp, #20]\n\t" - "neg r12, r12\n\t" - "mov r14, #0\n\t" + "STR r11, [sp, #20]\n\t" + "neg r12, r12\n\t" + "MOV r11, #0x0\n\t" /* t[6] = -1 -1 0 0 0 1 3 2 */ - "adds r11, r11, r8\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r9\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r9\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r9\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r10\n\t" - "adc r14, r14, #0\n\t" - "adds r11, r11, r10\n\t" - "adc r14, r14, #0\n\t" - "subs r11, r11, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r2\n\t" - "sbc r12, r12, #0\n\t" - "subs r11, r11, r3\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r10, r10, r7\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r8\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r8\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r8\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r9\n\t" + "ADC r11, r11, #0x0\n\t" + "ADDS r10, r10, r9\n\t" + "ADC r11, r11, #0x0\n\t" + "SUBS r10, r10, r12\n\t" + "SBC r12, r12, r12\n\t" + "SUBS r10, r10, r2\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r10, r10, r3\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[6] */ - "mov r9, r11\n\t" - "neg r12, r12\n\t" - "mov r11, #0\n\t" + "MOV r8, r10\n\t" + "neg r12, r12\n\t" + "MOV r10, #0x0\n\t" /* t[7] = 1 0 -1 -1 -1 -1 0 3 */ - "adds r14, r14, r2\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r10\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r10\n\t" - "adc r11, r11, #0\n\t" - "adds r14, r14, r10\n\t" - "adc r11, r11, #0\n\t" - "subs r14, r14, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r4\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r5\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r6\n\t" - "sbc r12, r12, #0\n\t" - "subs r14, r14, r8\n\t" - "sbc r12, r12, #0\n\t" + "ADDS r11, r11, r2\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r9\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r9\n\t" + "ADC r10, r10, #0x0\n\t" + "ADDS r11, r11, r9\n\t" + "ADC r10, r10, #0x0\n\t" + "SUBS r11, r11, r12\n\t" + "SBC r12, r12, r12\n\t" + "SUBS r11, r11, r4\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r5\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r6\n\t" + "SBC r12, r12, #0x0\n\t" + "SUBS r11, r11, r7\n\t" + "SBC r12, r12, #0x0\n\t" /* Store t[7] */ /* Load intermediate */ - "ldr r2, [sp, #0]\n\t" - "ldr r3, [sp, #4]\n\t" - "ldr r4, [sp, #8]\n\t" - "ldr r5, [sp, #12]\n\t" - "ldr r6, [sp, #16]\n\t" - "ldr r8, [sp, #20]\n\t" - "neg r12, r12\n\t" + "LDM sp, {r2, r3, r4, r5, r6, r7}\n\t" + "neg r12, r12\n\t" /* Add overflow */ /* Subtract underflow - add neg underflow */ - "adds r2, r2, r11\n\t" - "adcs r3, r3, #0\n\t" - "adcs r4, r4, #0\n\t" - "adds r5, r5, r12\n\t" - "adcs r6, r6, #0\n\t" - "adcs r8, r8, #0\n\t" - "adcs r9, r9, r12\n\t" - "adcs r14, r14, r11\n\t" - "mov r10, #0\n\t" - "adc r10, r10, #0\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, r12\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, r12\n\t" + "ADCS r11, r11, r10\n\t" + "MOV r9, #0x0\n\t" + "ADC r9, r9, #0x0\n\t" /* Subtract overflow */ /* Add underflow - subtract neg underflow */ - "subs r2, r2, r12\n\t" - "sbcs r3, r3, #0\n\t" - "sbcs r4, r4, #0\n\t" - "subs r5, r5, r11\n\t" - "sbcs r6, r6, #0\n\t" - "sbcs r8, r8, #0\n\t" - "sbcs r9, r9, r11\n\t" - "sbcs r14, r14, r12\n\t" - "mov r12, #0\n\t" - "sbc r12, r12, #0\n\t" + "SUBS r2, r2, r12\n\t" + "SBCS r3, r3, #0x0\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, r10\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, r10\n\t" + "SBCS r11, r11, r12\n\t" + "MOV r12, #0x0\n\t" + "SBC r12, r12, #0x0\n\t" "neg r12, r12\n\t" /* Add overflow */ /* Subtract underflow - add neg underflow */ - "adds r2, r2, r10\n\t" - "adcs r3, r3, #0\n\t" - "adcs r4, r4, #0\n\t" - "adds r5, r5, r12\n\t" - "adcs r6, r6, #0\n\t" - "adcs r8, r8, #0\n\t" - "adcs r9, r9, r12\n\t" - "adc r14, r14, r10\n\t" + "ADDS r2, r2, r9\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, r12\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, r12\n\t" + "ADC r11, r11, r9\n\t" /* Subtract overflow */ /* Add underflow - subtract neg underflow */ - "subs r2, r2, r12\n\t" - "sbcs r3, r3, #0\n\t" - "sbcs r4, r4, #0\n\t" - "subs r5, r5, r10\n\t" - "sbcs r6, r6, #0\n\t" - "sbcs r8, r8, #0\n\t" - "sbcs r9, r9, r10\n\t" - "sbc r14, r14, r12\n\t" + "SUBS r2, r2, r12\n\t" + "SBCS r3, r3, #0x0\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, r9\n\t" + "SBC r11, r11, r12\n\t" /* Store result */ - "str r2, [%[r], #0]\n\t" - "str r3, [%[r], #4]\n\t" - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #12]\n\t" - "str r6, [%[r], #16]\n\t" - "str r8, [%[r], #20]\n\t" - "str r9, [%[r], #24]\n\t" - "str r14, [%[r], #28]\n\t" - "add sp, sp, #24\n\t" + "STM %[r], {r2, r3, r4, r5, r6, r7, r8, r11}\n\t" + "MOV %[r], #0x0\n\t" + "ADD sp, sp, #0x18\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); - - return MP_OKAY; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + return (uint32_t)(size_t)r; } /* Convert an mp_int to an array of sp_digit. @@ -17011,14 +32240,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -17196,6 +32425,7 @@ return err; } +#ifdef WOLFSSL_SP_NO_UMAAL /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -17203,1174 +32433,1389 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m, sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)mp; - (void)m; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "sub sp, sp, #68\n\t" - "mov r5, #0\n\t" - /* A[0] * B[0] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r9, r10, r6, r8\n\t" - "str r9, [sp, #0]\n\t" - /* A[0] * B[1] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adc r11, r4, #0\n\t" - /* A[1] * B[0] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, #0\n\t" - "str r10, [sp, #4]\n\t" - /* A[0] * B[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adc r14, r4, r14\n\t" - /* A[1] * B[1] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, #0\n\t" - /* A[2] * B[0] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - "str r11, [sp, #8]\n\t" - /* A[0] * B[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" - /* A[1] * B[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[2] * B[1] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[3] * B[0] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - "str r14, [sp, #12]\n\t" - /* A[0] * B[4] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, #0\n\t" - /* A[1] * B[3] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[2] * B[2] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[3] * B[1] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[4] * B[0] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - "str r9, [sp, #16]\n\t" - /* A[0] * B[5] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, #0\n\t" - /* A[1] * B[4] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[2] * B[3] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[3] * B[2] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[4] * B[1] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[5] * B[0] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - "str r10, [sp, #20]\n\t" - /* A[0] * B[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, #0\n\t" - /* A[1] * B[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[2] * B[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[3] * B[3] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[4] * B[2] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[5] * B[1] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[6] * B[0] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - "str r11, [sp, #24]\n\t" - /* A[0] * B[7] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" - /* A[1] * B[6] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[2] * B[5] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[3] * B[4] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[4] * B[3] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[5] * B[2] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[6] * B[1] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[7] * B[0] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #0]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - "str r14, [sp, #28]\n\t" - /* A[1] * B[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, #0\n\t" - /* A[2] * B[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[3] * B[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[4] * B[4] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[5] * B[3] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[6] * B[2] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[7] * B[1] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #4]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - "str r9, [sp, #32]\n\t" - /* A[2] * B[7] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, #0\n\t" - /* A[3] * B[6] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[4] * B[5] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[5] * B[4] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[6] * B[3] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[7] * B[2] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - "str r10, [sp, #36]\n\t" - /* A[3] * B[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, #0\n\t" - /* A[4] * B[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[5] * B[5] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[6] * B[4] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[7] * B[3] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - "str r11, [sp, #40]\n\t" - /* A[4] * B[7] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" - /* A[5] * B[6] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[6] * B[5] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[7] * B[4] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - "str r14, [sp, #44]\n\t" - /* A[5] * B[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, #0\n\t" - /* A[6] * B[6] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[7] * B[5] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[6] * B[7] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, #0\n\t" - /* A[7] * B[6] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[7] * B[7] */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[b], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adc r14, r4, r14\n\t" - "str r9, [sp, #48]\n\t" - "str r10, [sp, #52]\n\t" - "str r11, [sp, #56]\n\t" - "str r14, [sp, #60]\n\t" + "SUB sp, sp, #0x44\n\t" + "STR %[r], [sp, #64]\n\t" + "MOV %[r], #0x0\n\t" + "LDR r12, [%[a]]\n\t" + /* A[0] * B[0] */ + "LDR lr, [%[b]]\n\t" + "UMULL r3, r4, r12, lr\n\t" + /* A[0] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "UMULL r5, r6, r12, lr\n\t" + /* A[0] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "UMULL r7, r8, r12, lr\n\t" + /* A[0] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "UMULL r9, r10, r12, lr\n\t" + "STR r3, [sp]\n\t" + /* A[0] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "MOV r11, %[r]\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[0] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[0] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[0] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADC r3, %[r], #0x0\n\t" + "UMLAL r10, r3, r12, lr\n\t" + /* A[1] * B[0] */ + "LDR r12, [%[a], #4]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "STR r4, [sp, #4]\n\t" + "ADDS r5, r5, r11\n\t" + /* A[1] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[1] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[1] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[1] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[1] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[1] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[1] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r4, %[r], #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * B[0] */ + "LDR r12, [%[a], #8]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "STR r5, [sp, #8]\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[2] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[2] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[2] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[2] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r5, %[r], #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * B[0] */ + "LDR r12, [%[a], #12]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[3] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[3] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[3] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[3] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[3] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r6, %[r], #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * B[0] */ + "LDR r12, [%[a], #16]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[4] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[4] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[4] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[4] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[4] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[4] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[4] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r7, %[r], #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * B[0] */ + "LDR r12, [%[a], #20]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[5] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[5] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[5] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[5] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[5] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[5] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r8, %[r], #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * B[0] */ + "LDR r12, [%[a], #24]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[6] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[6] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[6] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[6] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[6] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[6] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r9, %[r], #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + /* A[7] * B[0] */ + "LDR r12, [%[a], #28]\n\t" + "LDR lr, [%[b]]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[7] * B[1] */ + "LDR lr, [%[b], #4]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[7] * B[2] */ + "LDR lr, [%[b], #8]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[7] * B[3] */ + "LDR lr, [%[b], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[7] * B[4] */ + "LDR lr, [%[b], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[7] * B[5] */ + "LDR lr, [%[b], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[7] * B[6] */ + "LDR lr, [%[b], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[7] * B[7] */ + "LDR lr, [%[b], #28]\n\t" + "ADC r10, %[r], #0x0\n\t" + "UMLAL r9, r10, r12, lr\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" /* Start Reduction */ - "ldr r4, [sp, #0]\n\t" - "ldr r5, [sp, #4]\n\t" - "ldr r6, [sp, #8]\n\t" - "ldr r8, [sp, #12]\n\t" - "ldr r9, [sp, #16]\n\t" - "ldr r10, [sp, #20]\n\t" - "ldr r11, [sp, #24]\n\t" - "ldr r14, [sp, #28]\n\t" + "LDM sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "MOV r3, r11\n\t" + "MOV r4, r12\n\t" /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ /* - a[0] << 224 */ /* + (a[0]-a[1] * 2) << (6 * 32) */ - "adds r11, r11, r4\n\t" - "adc r14, r14, r5\n\t" - "adds r11, r11, r4\n\t" - "adc r14, r14, r5\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" /* - a[0] << (7 * 32) */ - "sub r14, r14, r4\n\t" + "SUB r12, r12, r5\n\t" /* + a[0]-a[4] << (3 * 32) */ - "mov %[a], r8\n\t" - "mov %[b], r9\n\t" - "adds r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r11, r11, %[a]\n\t" - "adc r14, r14, %[b]\n\t" - "str r4, [sp, #0]\n\t" - "str r5, [sp, #4]\n\t" - "str r6, [sp, #8]\n\t" - "str r8, [sp, #12]\n\t" - "str r9, [sp, #16]\n\t" - "str r10, [sp, #20]\n\t" + "MOV r0, r8\n\t" + "MOV r1, r9\n\t" + "MOV r2, r10\n\t" + "ADDS r8, r8, r5\n\t" + "ADCS r9, r9, r6\n\t" + "ADCS r10, r10, r7\n\t" + "ADCS r11, r11, r0\n\t" + "ADC r12, r12, r1\n\t" /* a += mu * m */ /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ - "mov %[a], #0\n\t" - /* a[6] += t[0] + t[3] */ - "ldr r3, [sp, #24]\n\t" - "adds r3, r3, r4\n\t" - "adc %[b], %[a], #0\n\t" - "adds r3, r3, r8\n\t" - "adc %[b], %[b], #0\n\t" - "str r11, [sp, #24]\n\t" - /* a[7] += t[1] + t[4] */ - "ldr r3, [sp, #28]\n\t" - "adds r3, r3, %[b]\n\t" - "adc %[b], %[a], #0\n\t" - "adds r3, r3, r5\n\t" - "adc %[b], %[b], #0\n\t" - "adds r3, r3, r9\n\t" - "adc %[b], %[b], #0\n\t" - "str r14, [sp, #28]\n\t" - "str r3, [sp, #64]\n\t" - /* a[8] += t[0] + t[2] + t[5] */ - "ldr r3, [sp, #32]\n\t" - "adds r3, r3, %[b]\n\t" - "adc %[b], %[a], #0\n\t" - "adds r3, r3, r4\n\t" - "adc %[b], %[b], #0\n\t" - "adds r3, r3, r6\n\t" - "adc %[b], %[b], #0\n\t" - "adds r3, r3, r10\n\t" - "adc %[b], %[b], #0\n\t" - "str r3, [sp, #32]\n\t" - /* a[9] += t[1] + t[3] + t[6] */ - /* a[10] += t[2] + t[4] + t[7] */ - "ldr r3, [sp, #36]\n\t" - "ldr r4, [sp, #40]\n\t" - "adds r3, r3, %[b]\n\t" - "adcs r4, r4, #0\n\t" - "adc %[b], %[a], #0\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc %[b], %[b], #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc %[b], %[b], #0\n\t" - "adds r3, r3, r11\n\t" - "adcs r4, r4, r14\n\t" - "adc %[b], %[b], #0\n\t" - "str r3, [sp, #36]\n\t" - "str r4, [sp, #40]\n\t" - /* a[11] += t[3] + t[5] */ - /* a[12] += t[4] + t[6] */ - /* a[13] += t[5] + t[7] */ - /* a[14] += t[6] */ - "ldr r3, [sp, #44]\n\t" - "ldr r4, [sp, #48]\n\t" - "ldr r5, [sp, #52]\n\t" - "ldr r6, [sp, #56]\n\t" - "adds r3, r3, %[b]\n\t" - "adcs r4, r4, #0\n\t" - "adcs r5, r5, #0\n\t" - "adcs r6, r6, #0\n\t" - "adc %[b], %[a], #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adcs r6, r6, r11\n\t" - "adc %[b], %[b], #0\n\t" - "adds r3, r3, r10\n\t" - "adcs r4, r4, r11\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, #0\n\t" - "adc %[b], %[b], #0\n\t" - "str r3, [sp, #44]\n\t" - "str r4, [sp, #48]\n\t" - "str r5, [sp, #52]\n\t" - "str r6, [sp, #56]\n\t" - /* a[15] += t[7] */ - "ldr r3, [sp, #60]\n\t" - "adds r3, r3, %[b]\n\t" - "adc %[b], %[a], #0\n\t" - "adds r3, r3, r14\n\t" - "adc %[b], %[b], #0\n\t" - "str r3, [sp, #60]\n\t" - "ldr r3, [sp, #64]\n\t" - "ldr r4, [sp, #32]\n\t" - "ldr r5, [sp, #36]\n\t" - "ldr r6, [sp, #40]\n\t" - "ldr r9, [sp, #0]\n\t" - "ldr r10, [sp, #4]\n\t" - "ldr r11, [sp, #8]\n\t" - "ldr r14, [sp, #12]\n\t" - "subs r3, r3, r9\n\t" - "sbcs r4, r4, r10\n\t" - "sbcs r5, r5, r11\n\t" - "sbcs r6, r6, r14\n\t" - "str r4, [sp, #32]\n\t" - "str r5, [sp, #36]\n\t" - "str r6, [sp, #40]\n\t" - "ldr r3, [sp, #44]\n\t" - "ldr r4, [sp, #48]\n\t" - "ldr r5, [sp, #52]\n\t" - "ldr r6, [sp, #56]\n\t" - "ldr r8, [sp, #60]\n\t" - "ldr r9, [sp, #16]\n\t" - "ldr r10, [sp, #20]\n\t" - "ldr r11, [sp, #24]\n\t" - "ldr r14, [sp, #28]\n\t" - "sbcs r3, r3, r9\n\t" - "sbcs r4, r4, r10\n\t" - "sbcs r5, r5, r11\n\t" - "sbcs r6, r6, r14\n\t" - "sbc r8, r8, #0\n\t" - "str r3, [sp, #44]\n\t" - "str r4, [sp, #48]\n\t" - "str r5, [sp, #52]\n\t" - "str r6, [sp, #56]\n\t" - "str r8, [sp, #60]\n\t" + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "ADDS r0, r0, r5\n\t" + "ADCS r1, r1, r6\n\t" + "ADCS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "ADD r0, sp, #0x20\n\t" + "LDM r0, {r2, r3, r4}\n\t" + "ADDS r2, r2, lr\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "STM r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "LDM r0, {r0, r1, r2, r3, r4}\n\t" + "ADDS r0, r0, lr\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r8\n\t" + "ADCS r1, r1, r9\n\t" + "ADCS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r10\n\t" + "ADCS r1, r1, r11\n\t" + "ADCS r2, r2, r12\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r0, [sp, #44]\n\t" + "STR r1, [sp, #48]\n\t" + "STR r2, [sp, #52]\n\t" + "STR r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "ADD r0, sp, #0x1c\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "SUBS r0, r0, r5\n\t" + "SBCS r1, r1, r6\n\t" + "SBCS r2, r2, r7\n\t" + "SBCS r3, r3, r8\n\t" + "ADD r0, sp, #0x2c\n\t" + "MOV r8, r4\n\t" + "LDM r0, {r4, r5, r6, r7}\n\t" + "SBCS r4, r4, r9\n\t" + "SBCS r5, r5, r10\n\t" + "SBCS r6, r6, r11\n\t" + "SBCS r7, r7, r12\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC lr, lr, #0x0\n\t" /* mask m and sub from result if overflow */ - "sub %[b], %[a], %[b]\n\t" - "and %[a], %[b], #1\n\t" - "ldr r3, [sp, #32]\n\t" - "ldr r4, [sp, #36]\n\t" - "ldr r5, [sp, #40]\n\t" - "ldr r6, [sp, #44]\n\t" - "ldr r8, [sp, #48]\n\t" - "ldr r9, [sp, #52]\n\t" - "ldr r10, [sp, #56]\n\t" - "ldr r11, [sp, #60]\n\t" - "subs r3, r3, %[b]\n\t" - "sbcs r4, r4, %[b]\n\t" - "sbcs r5, r5, %[b]\n\t" - "sbcs r6, r6, #0\n\t" - "sbcs r8, r8, #0\n\t" - "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, %[a]\n\t" - "sbc r11, r11, %[b]\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" - "add sp, sp, #68\n\t" - : [a] "+r" (a), [b] "+r" (b) - : [r] "r" (r) - : "memory", "r9", "r10", "r11", "r14", "r3", "r4", "r5", "r6", "r8" + "RSB lr, lr, #0x0\n\t" + "SUBS r1, r1, lr\n\t" + "SBCS r2, r2, lr\n\t" + "SBCS r3, r3, lr\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, lr, LSR #31\n\t" + "SBC r8, r8, lr\n\t" + "LDR %[r], [sp, #64]\n\t" + "STM %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)mp_p; +#else + (void)mp; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#else +/* Multiply two Montgomery form numbers mod the modulus (prime). + * (r = a * b mod m) + * + * r Result of multiplication. + * a First number to multiply in Montgomery form. + * b Second number to multiply in Montgomery form. + * m Modulus (prime). + * mp Montgomery multiplier. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_mul_8(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x4c\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + "STRD %[r], %[a], [sp, #68]\n\t" +#else + "STR %[r], [sp, #68]\n\t" + "STR %[a], [sp, #72]\n\t" +#endif /* WOLFSSL_NO_VAR_ASSIGN_REG */ + "MOV lr, %[b]\n\t" + "LDM %[a], {r0, r1, r2, r3}\n\t" + "LDM lr!, {r4, r5, r6}\n\t" + "UMULL r10, r11, r0, r4\n\t" + "UMULL r12, r7, r1, r4\n\t" + "UMAAL r11, r12, r0, r5\n\t" + "UMULL r8, r9, r2, r4\n\t" + "UMAAL r12, r8, r1, r5\n\t" + "UMAAL r12, r7, r0, r6\n\t" + "UMAAL r8, r9, r3, r4\n\t" + "STM sp, {r10, r11, r12}\n\t" + "UMAAL r7, r8, r2, r5\n\t" + "LDM lr!, {r4}\n\t" + "UMULL r10, r11, r1, r6\n\t" + "UMAAL r8, r9, r2, r6\n\t" + "UMAAL r7, r10, r0, r4\n\t" + "UMAAL r8, r11, r3, r5\n\t" + "STR r7, [sp, #12]\n\t" + "UMAAL r8, r10, r1, r4\n\t" + "UMAAL r9, r11, r3, r6\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "UMAAL r10, r11, r3, r4\n\t" + "LDM lr, {r4, r5, r6, r7}\n\t" + "MOV r12, #0x0\n\t" + "UMLAL r8, r12, r0, r4\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r10, r12, r2, r4\n\t" + "UMAAL r11, r12, r3, r4\n\t" + "MOV r4, #0x0\n\t" + "UMLAL r9, r4, r0, r5\n\t" + "UMAAL r10, r4, r1, r5\n\t" + "UMAAL r11, r4, r2, r5\n\t" + "UMAAL r12, r4, r3, r5\n\t" + "MOV r5, #0x0\n\t" + "UMLAL r10, r5, r0, r6\n\t" + "UMAAL r11, r5, r1, r6\n\t" + "UMAAL r12, r5, r2, r6\n\t" + "UMAAL r4, r5, r3, r6\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r11, r6, r0, r7\n\t" + "LDR r0, [sp, #72]\n\t" + "UMAAL r12, r6, r1, r7\n\t" + "ADD r0, r0, #0x10\n\t" + "UMAAL r4, r6, r2, r7\n\t" + "SUB lr, lr, #0x10\n\t" + "UMAAL r5, r6, r3, r7\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "STR r6, [sp, #64]\n\t" + "LDM lr!, {r6}\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r8, r7, r0, r6\n\t" + "UMAAL r9, r7, r1, r6\n\t" + "STR r8, [sp, #16]\n\t" + "UMAAL r10, r7, r2, r6\n\t" + "UMAAL r11, r7, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r8, #0x0\n\t" + "UMLAL r9, r8, r0, r6\n\t" + "UMAAL r10, r8, r1, r6\n\t" + "STR r9, [sp, #20]\n\t" + "UMAAL r11, r8, r2, r6\n\t" + "UMAAL r12, r8, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r10, r9, r0, r6\n\t" + "UMAAL r11, r9, r1, r6\n\t" + "STR r10, [sp, #24]\n\t" + "UMAAL r12, r9, r2, r6\n\t" + "UMAAL r4, r9, r3, r6\n\t" + "LDM lr!, {r6}\n\t" + "MOV r10, #0x0\n\t" + "UMLAL r11, r10, r0, r6\n\t" + "UMAAL r12, r10, r1, r6\n\t" + "STR r11, [sp, #28]\n\t" + "UMAAL r4, r10, r2, r6\n\t" + "UMAAL r5, r10, r3, r6\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r12, r7, r0, r11\n\t" + "UMAAL r4, r7, r1, r11\n\t" + "LDR r6, [sp, #64]\n\t" + "UMAAL r5, r7, r2, r11\n\t" + "UMAAL r6, r7, r3, r11\n\t" + "LDM lr!, {r11}\n\t" + "UMAAL r4, r8, r0, r11\n\t" + "UMAAL r5, r8, r1, r11\n\t" + "UMAAL r6, r8, r2, r11\n\t" + "UMAAL r7, r8, r3, r11\n\t" + "LDM lr, {r11, lr}\n\t" + "UMAAL r5, r9, r0, r11\n\t" + "UMAAL r6, r10, r0, lr\n\t" + "UMAAL r6, r9, r1, r11\n\t" + "UMAAL r7, r10, r1, lr\n\t" + "UMAAL r7, r9, r2, r11\n\t" + "UMAAL r8, r10, r2, lr\n\t" + "UMAAL r8, r9, r3, r11\n\t" + "UMAAL r9, r10, r3, lr\n\t" + "MOV r3, r12\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* Start Reduction */ + "LDM sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "MOV r3, r11\n\t" + "MOV r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "SUB r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "MOV r0, r8\n\t" + "MOV r1, r9\n\t" + "MOV r2, r10\n\t" + "ADDS r8, r8, r5\n\t" + "ADCS r9, r9, r6\n\t" + "ADCS r10, r10, r7\n\t" + "ADCS r11, r11, r0\n\t" + "ADC r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "ADDS r0, r0, r5\n\t" + "ADCS r1, r1, r6\n\t" + "ADCS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "ADD r0, sp, #0x20\n\t" + "LDM r0, {r2, r3, r4}\n\t" + "ADDS r2, r2, lr\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "STM r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "LDM r0, {r0, r1, r2, r3, r4}\n\t" + "ADDS r0, r0, lr\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r8\n\t" + "ADCS r1, r1, r9\n\t" + "ADCS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r10\n\t" + "ADCS r1, r1, r11\n\t" + "ADCS r2, r2, r12\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r0, [sp, #44]\n\t" + "STR r1, [sp, #48]\n\t" + "STR r2, [sp, #52]\n\t" + "STR r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "ADD r0, sp, #0x1c\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "SUBS r0, r0, r5\n\t" + "SBCS r1, r1, r6\n\t" + "SBCS r2, r2, r7\n\t" + "SBCS r3, r3, r8\n\t" + "ADD r0, sp, #0x2c\n\t" + "MOV r8, r4\n\t" + "LDM r0, {r4, r5, r6, r7}\n\t" + "SBCS r4, r4, r9\n\t" + "SBCS r5, r5, r10\n\t" + "SBCS r6, r6, r11\n\t" + "SBCS r7, r7, r12\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC lr, lr, #0x0\n\t" + /* mask m and sub from result if overflow */ + "RSB lr, lr, #0x0\n\t" + "SUBS r1, r1, lr\n\t" + "SBCS r2, r2, lr\n\t" + "SBCS r3, r3, lr\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, lr, LSR #31\n\t" + "SBC r8, r8, lr\n\t" + "LDR %[r], [sp, #68]\n\t" + "STM %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x4c\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r10", "r11", "r12", "r7", "r8", "r9", "lr", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)mp_p; +#else + (void)mp; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } +#endif +#ifdef WOLFSSL_SP_NO_UMAAL /* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m) * * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)mp; - (void)m; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "sub sp, sp, #68\n\t" - "mov r5, #0\n\t" - /* A[0] * A[1] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #4]\n\t" - "umull r10, r11, r6, r8\n\t" - "str r10, [sp, #4]\n\t" - /* A[0] * A[2] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adc r14, r4, #0\n\t" - "str r11, [sp, #8]\n\t" - /* A[0] * A[3] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adc r9, r4, #0\n\t" - /* A[1] * A[2] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #8]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" - "str r14, [sp, #12]\n\t" - /* A[0] * A[4] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adc r10, r4, r10\n\t" - /* A[1] * A[3] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, #0\n\t" - "str r9, [sp, #16]\n\t" - /* A[0] * A[5] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adc r11, r4, r11\n\t" - /* A[1] * A[4] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, #0\n\t" - /* A[2] * A[3] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #12]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - "str r10, [sp, #20]\n\t" - /* A[0] * A[6] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, #0\n\t" - /* A[1] * A[5] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - /* A[2] * A[4] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - "str r11, [sp, #24]\n\t" - /* A[0] * A[7] */ - "ldr r6, [%[a], #0]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" - /* A[1] * A[6] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[2] * A[5] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - /* A[3] * A[4] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #16]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - "str r14, [sp, #28]\n\t" - /* A[1] * A[7] */ - "ldr r6, [%[a], #4]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, #0\n\t" - /* A[2] * A[6] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - /* A[3] * A[5] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, r11\n\t" - "str r9, [sp, #32]\n\t" - /* A[2] * A[7] */ - "ldr r6, [%[a], #8]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, #0\n\t" - /* A[3] * A[6] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - /* A[4] * A[5] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #20]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adcs r11, r4, r11\n\t" - "adc r14, r5, r14\n\t" - "str r10, [sp, #36]\n\t" - /* A[3] * A[7] */ - "ldr r6, [%[a], #12]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, #0\n\t" - /* A[4] * A[6] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r11, r3, r11\n\t" - "adcs r14, r4, r14\n\t" - "adc r9, r5, r9\n\t" - "str r11, [sp, #40]\n\t" - /* A[4] * A[7] */ - "ldr r6, [%[a], #16]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, #0\n\t" - /* A[5] * A[6] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #24]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r14, r3, r14\n\t" - "adcs r9, r4, r9\n\t" - "adc r10, r5, r10\n\t" - "str r14, [sp, #44]\n\t" - /* A[5] * A[7] */ - "ldr r6, [%[a], #20]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r9, r3, r9\n\t" - "adcs r10, r4, r10\n\t" - "adc r11, r5, #0\n\t" - "str r9, [sp, #48]\n\t" - /* A[6] * A[7] */ - "ldr r6, [%[a], #24]\n\t" - "ldr r8, [%[a], #28]\n\t" - "umull r3, r4, r6, r8\n\t" - "adds r10, r3, r10\n\t" - "adc r11, r4, r11\n\t" - "str r10, [sp, #52]\n\t" - "str r11, [sp, #56]\n\t" - /* Double */ - "ldr r4, [sp, #4]\n\t" - "ldr r6, [sp, #8]\n\t" - "ldr r8, [sp, #12]\n\t" - "ldr r9, [sp, #16]\n\t" - "ldr r10, [sp, #20]\n\t" - "ldr r11, [sp, #24]\n\t" - "ldr r14, [sp, #28]\n\t" - "ldr r12, [sp, #32]\n\t" - "ldr r3, [sp, #36]\n\t" - "adds r4, r4, r4\n\t" - "adcs r6, r6, r6\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r11, r11, r11\n\t" - "adcs r14, r14, r14\n\t" - "adcs r12, r12, r12\n\t" - "adcs r3, r3, r3\n\t" - "str r4, [sp, #4]\n\t" - "str r6, [sp, #8]\n\t" - "str r8, [sp, #12]\n\t" - "str r9, [sp, #16]\n\t" - "str r10, [sp, #20]\n\t" - "str r11, [sp, #24]\n\t" - "str r14, [sp, #28]\n\t" - "str r12, [sp, #32]\n\t" - "str r3, [sp, #36]\n\t" - "ldr r4, [sp, #40]\n\t" - "ldr r6, [sp, #44]\n\t" - "ldr r8, [sp, #48]\n\t" - "ldr r9, [sp, #52]\n\t" - "ldr r10, [sp, #56]\n\t" - "adcs r4, r4, r4\n\t" - "adcs r6, r6, r6\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "str r4, [sp, #40]\n\t" - "str r6, [sp, #44]\n\t" - "str r8, [sp, #48]\n\t" - "str r9, [sp, #52]\n\t" - "str r10, [sp, #56]\n\t" - "adc r11, r5, #0\n\t" - "str r11, [sp, #60]\n\t" - "ldr r4, [sp, #4]\n\t" - "ldr r5, [sp, #8]\n\t" - "ldr r12, [sp, #12]\n\t" - /* A[0] * A[0] */ - "ldr r6, [%[a], #0]\n\t" - "umull r9, r10, r6, r6\n\t" - /* A[1] * A[1] */ - "ldr r6, [%[a], #4]\n\t" - "umull r11, r14, r6, r6\n\t" - "adds r10, r10, r4\n\t" - "adcs r11, r11, r5\n\t" - "adcs r14, r14, r12\n\t" - "str r9, [sp, #0]\n\t" - "str r10, [sp, #4]\n\t" - "str r11, [sp, #8]\n\t" - "str r14, [sp, #12]\n\t" - "ldr r3, [sp, #16]\n\t" - "ldr r4, [sp, #20]\n\t" - "ldr r5, [sp, #24]\n\t" - "ldr r12, [sp, #28]\n\t" - /* A[2] * A[2] */ - "ldr r6, [%[a], #8]\n\t" - "umull r9, r10, r6, r6\n\t" - /* A[3] * A[3] */ - "ldr r6, [%[a], #12]\n\t" - "umull r11, r14, r6, r6\n\t" - "adcs r9, r9, r3\n\t" - "adcs r10, r10, r4\n\t" - "adcs r11, r11, r5\n\t" - "adcs r14, r14, r12\n\t" - "str r9, [sp, #16]\n\t" - "str r10, [sp, #20]\n\t" - "str r11, [sp, #24]\n\t" - "str r14, [sp, #28]\n\t" - "ldr r3, [sp, #32]\n\t" - "ldr r4, [sp, #36]\n\t" - "ldr r5, [sp, #40]\n\t" - "ldr r12, [sp, #44]\n\t" - /* A[4] * A[4] */ - "ldr r6, [%[a], #16]\n\t" - "umull r9, r10, r6, r6\n\t" - /* A[5] * A[5] */ - "ldr r6, [%[a], #20]\n\t" - "umull r11, r14, r6, r6\n\t" - "adcs r9, r9, r3\n\t" - "adcs r10, r10, r4\n\t" - "adcs r11, r11, r5\n\t" - "adcs r14, r14, r12\n\t" - "str r9, [sp, #32]\n\t" - "str r10, [sp, #36]\n\t" - "str r11, [sp, #40]\n\t" - "str r14, [sp, #44]\n\t" - "ldr r3, [sp, #48]\n\t" - "ldr r4, [sp, #52]\n\t" - "ldr r5, [sp, #56]\n\t" - "ldr r12, [sp, #60]\n\t" - /* A[6] * A[6] */ - "ldr r6, [%[a], #24]\n\t" - "umull r9, r10, r6, r6\n\t" - /* A[7] * A[7] */ - "ldr r6, [%[a], #28]\n\t" - "umull r11, r14, r6, r6\n\t" - "adcs r9, r9, r3\n\t" - "adcs r10, r10, r4\n\t" - "adcs r11, r11, r5\n\t" - "adc r14, r14, r12\n\t" - "str r9, [sp, #48]\n\t" - "str r10, [sp, #52]\n\t" - "str r11, [sp, #56]\n\t" - "str r14, [sp, #60]\n\t" + "SUB sp, sp, #0x44\n\t" + "STR %[r], [sp, #64]\n\t" + "MOV %[r], #0x0\n\t" + "LDR r12, [%[a]]\n\t" + /* A[0] * A[1] */ + "LDR lr, [%[a], #4]\n\t" + "UMULL r4, r5, r12, lr\n\t" + /* A[0] * A[3] */ + "LDR lr, [%[a], #12]\n\t" + "UMULL r6, r7, r12, lr\n\t" + /* A[0] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "UMULL r8, r9, r12, lr\n\t" + /* A[0] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "UMULL r10, r3, r12, lr\n\t" + /* A[0] * A[2] */ + "LDR lr, [%[a], #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[0] * A[4] */ + "LDR lr, [%[a], #16]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "ADDS r8, r8, r11\n\t" + /* A[0] * A[6] */ + "LDR lr, [%[a], #24]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + "ADCS r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + "STR r5, [sp, #8]\n\t" + /* A[1] * A[2] */ + "LDR r12, [%[a], #4]\n\t" + "LDR lr, [%[a], #8]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "STR r6, [sp, #12]\n\t" + "ADDS r7, r7, r11\n\t" + /* A[1] * A[3] */ + "LDR lr, [%[a], #12]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, lr\n\t" + "STR r7, [sp, #16]\n\t" + "ADDS r8, r8, r11\n\t" + /* A[1] * A[4] */ + "LDR lr, [%[a], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "ADDS r9, r9, r11\n\t" + /* A[1] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "ADDS r10, r10, r11\n\t" + /* A[1] * A[6] */ + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[1] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "ADC r4, %[r], #0x0\n\t" + "UMLAL r3, r4, r12, lr\n\t" + /* A[2] * A[3] */ + "LDR r12, [%[a], #8]\n\t" + "LDR lr, [%[a], #12]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r8, r11, r12, lr\n\t" + "STR r8, [sp, #20]\n\t" + "ADDS r9, r9, r11\n\t" + /* A[2] * A[4] */ + "LDR lr, [%[a], #16]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, lr\n\t" + "STR r9, [sp, #24]\n\t" + "ADDS r10, r10, r11\n\t" + /* A[2] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "ADDS r3, r3, r11\n\t" + /* A[2] * A[6] */ + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[2] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "ADC r5, %[r], #0x0\n\t" + "UMLAL r4, r5, r12, lr\n\t" + /* A[3] * A[4] */ + "LDR r12, [%[a], #12]\n\t" + "LDR lr, [%[a], #16]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r10, r11, r12, lr\n\t" + "STR r10, [sp, #28]\n\t" + "ADDS r3, r3, r11\n\t" + /* A[3] * A[5] */ + "LDR lr, [%[a], #20]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, lr\n\t" + "ADDS r4, r4, r11\n\t" + /* A[3] * A[6] */ + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[3] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "ADC r6, %[r], #0x0\n\t" + "UMLAL r5, r6, r12, lr\n\t" + /* A[4] * A[5] */ + "LDR r12, [%[a], #16]\n\t" + "LDR lr, [%[a], #20]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r4, r11, r12, lr\n\t" + "ADDS r5, r5, r11\n\t" + /* A[4] * A[6] */ + "LDR lr, [%[a], #24]\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, lr\n\t" + "ADDS r6, r6, r11\n\t" + /* A[4] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "ADC r7, %[r], #0x0\n\t" + "UMLAL r6, r7, r12, lr\n\t" + /* A[5] * A[6] */ + "LDR r12, [%[a], #20]\n\t" + "LDR lr, [%[a], #24]\n\t" + "MOV r11, #0x0\n\t" + "UMLAL r6, r11, r12, lr\n\t" + "ADDS r7, r7, r11\n\t" + /* A[5] * A[7] */ + "LDR lr, [%[a], #28]\n\t" + "ADC r8, %[r], #0x0\n\t" + "UMLAL r7, r8, r12, lr\n\t" + /* A[6] * A[7] */ + "LDR r12, [%[a], #24]\n\t" + "LDR lr, [%[a], #28]\n\t" + "MOV r9, #0x0\n\t" + "UMLAL r8, r9, r12, lr\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "STM lr!, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADCS r3, r3, r3\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADC r10, %[r], #0x0\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "ADD lr, sp, #0x4\n\t" + "LDM lr, {r4, r5, r6, r7, r8, r9, r10}\n\t" + "MOV lr, sp\n\t" + /* A[0] * A[0] */ + "LDR r12, [%[a]]\n\t" + "UMULL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[1] * A[1] */ + "LDR r12, [%[a], #4]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[2] * A[2] */ + "LDR r12, [%[a], #8]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[3] * A[3] */ + "LDR r12, [%[a], #12]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r9, r11, r12, r12\n\t" + "ADDS r10, r10, r11\n\t" + "STM lr!, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + "LDM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" + /* A[4] * A[4] */ + "LDR r12, [%[a], #16]\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r3, r11, r12, r12\n\t" + "ADDS r4, r4, r11\n\t" + /* A[5] * A[5] */ + "LDR r12, [%[a], #20]\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r5, r11, r12, r12\n\t" + "ADDS r6, r6, r11\n\t" + /* A[6] * A[6] */ + "LDR r12, [%[a], #24]\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADC r11, %[r], #0x0\n\t" + "UMLAL r7, r11, r12, r12\n\t" + "ADDS r8, r8, r11\n\t" + /* A[7] * A[7] */ + "LDR r12, [%[a], #28]\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADC r10, r10, #0x0\n\t" + "UMLAL r9, r10, r12, r12\n\t" + "ADD lr, sp, #0x20\n\t" + "STM lr, {r3, r4, r5, r6, r7, r8, r9, r10}\n\t" /* Start Reduction */ - "ldr r4, [sp, #0]\n\t" - "ldr r5, [sp, #4]\n\t" - "ldr r6, [sp, #8]\n\t" - "ldr r8, [sp, #12]\n\t" - "ldr r9, [sp, #16]\n\t" - "ldr r10, [sp, #20]\n\t" - "ldr r11, [sp, #24]\n\t" - "ldr r14, [sp, #28]\n\t" + "LDM sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "MOV r3, r11\n\t" + "MOV r4, r12\n\t" /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ /* - a[0] << 224 */ /* + (a[0]-a[1] * 2) << (6 * 32) */ - "adds r11, r11, r4\n\t" - "adc r14, r14, r5\n\t" - "adds r11, r11, r4\n\t" - "adc r14, r14, r5\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" /* - a[0] << (7 * 32) */ - "sub r14, r14, r4\n\t" + "SUB r12, r12, r5\n\t" /* + a[0]-a[4] << (3 * 32) */ - "mov %[a], r8\n\t" - "mov r12, r9\n\t" - "adds r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r11, r11, %[a]\n\t" - "adc r14, r14, r12\n\t" - "str r4, [sp, #0]\n\t" - "str r5, [sp, #4]\n\t" - "str r6, [sp, #8]\n\t" - "str r8, [sp, #12]\n\t" - "str r9, [sp, #16]\n\t" - "str r10, [sp, #20]\n\t" + "MOV r0, r8\n\t" + "MOV r1, r9\n\t" + "MOV r2, r10\n\t" + "ADDS r8, r8, r5\n\t" + "ADCS r9, r9, r6\n\t" + "ADCS r10, r10, r7\n\t" + "ADCS r11, r11, r0\n\t" + "ADC r12, r12, r1\n\t" /* a += mu * m */ /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ - "mov %[a], #0\n\t" - /* a[6] += t[0] + t[3] */ - "ldr r3, [sp, #24]\n\t" - "adds r3, r3, r4\n\t" - "adc r12, %[a], #0\n\t" - "adds r3, r3, r8\n\t" - "adc r12, r12, #0\n\t" - "str r11, [sp, #24]\n\t" - /* a[7] += t[1] + t[4] */ - "ldr r3, [sp, #28]\n\t" - "adds r3, r3, r12\n\t" - "adc r12, %[a], #0\n\t" - "adds r3, r3, r5\n\t" - "adc r12, r12, #0\n\t" - "adds r3, r3, r9\n\t" - "adc r12, r12, #0\n\t" - "str r14, [sp, #28]\n\t" - "str r3, [sp, #64]\n\t" - /* a[8] += t[0] + t[2] + t[5] */ - "ldr r3, [sp, #32]\n\t" - "adds r3, r3, r12\n\t" - "adc r12, %[a], #0\n\t" - "adds r3, r3, r4\n\t" - "adc r12, r12, #0\n\t" - "adds r3, r3, r6\n\t" - "adc r12, r12, #0\n\t" - "adds r3, r3, r10\n\t" - "adc r12, r12, #0\n\t" - "str r3, [sp, #32]\n\t" - /* a[9] += t[1] + t[3] + t[6] */ - /* a[10] += t[2] + t[4] + t[7] */ - "ldr r3, [sp, #36]\n\t" - "ldr r4, [sp, #40]\n\t" - "adds r3, r3, r12\n\t" - "adcs r4, r4, #0\n\t" - "adc r12, %[a], #0\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r6\n\t" - "adc r12, r12, #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adc r12, r12, #0\n\t" - "adds r3, r3, r11\n\t" - "adcs r4, r4, r14\n\t" - "adc r12, r12, #0\n\t" - "str r3, [sp, #36]\n\t" - "str r4, [sp, #40]\n\t" - /* a[11] += t[3] + t[5] */ - /* a[12] += t[4] + t[6] */ - /* a[13] += t[5] + t[7] */ - /* a[14] += t[6] */ - "ldr r3, [sp, #44]\n\t" - "ldr r4, [sp, #48]\n\t" - "ldr r5, [sp, #52]\n\t" - "ldr r6, [sp, #56]\n\t" - "adds r3, r3, r12\n\t" - "adcs r4, r4, #0\n\t" - "adcs r5, r5, #0\n\t" - "adcs r6, r6, #0\n\t" - "adc r12, %[a], #0\n\t" - "adds r3, r3, r8\n\t" - "adcs r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adcs r6, r6, r11\n\t" - "adc r12, r12, #0\n\t" - "adds r3, r3, r10\n\t" - "adcs r4, r4, r11\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, #0\n\t" - "adc r12, r12, #0\n\t" - "str r3, [sp, #44]\n\t" - "str r4, [sp, #48]\n\t" - "str r5, [sp, #52]\n\t" - "str r6, [sp, #56]\n\t" - /* a[15] += t[7] */ - "ldr r3, [sp, #60]\n\t" - "adds r3, r3, r12\n\t" - "adc r12, %[a], #0\n\t" - "adds r3, r3, r14\n\t" - "adc r12, r12, #0\n\t" - "str r3, [sp, #60]\n\t" - "ldr r3, [sp, #64]\n\t" - "ldr r4, [sp, #32]\n\t" - "ldr r5, [sp, #36]\n\t" - "ldr r6, [sp, #40]\n\t" - "ldr r9, [sp, #0]\n\t" - "ldr r10, [sp, #4]\n\t" - "ldr r11, [sp, #8]\n\t" - "ldr r14, [sp, #12]\n\t" - "subs r3, r3, r9\n\t" - "sbcs r4, r4, r10\n\t" - "sbcs r5, r5, r11\n\t" - "sbcs r6, r6, r14\n\t" - "str r4, [sp, #32]\n\t" - "str r5, [sp, #36]\n\t" - "str r6, [sp, #40]\n\t" - "ldr r3, [sp, #44]\n\t" - "ldr r4, [sp, #48]\n\t" - "ldr r5, [sp, #52]\n\t" - "ldr r6, [sp, #56]\n\t" - "ldr r8, [sp, #60]\n\t" - "ldr r9, [sp, #16]\n\t" - "ldr r10, [sp, #20]\n\t" - "ldr r11, [sp, #24]\n\t" - "ldr r14, [sp, #28]\n\t" - "sbcs r3, r3, r9\n\t" - "sbcs r4, r4, r10\n\t" - "sbcs r5, r5, r11\n\t" - "sbcs r6, r6, r14\n\t" - "sbc r8, r8, #0\n\t" - "str r3, [sp, #44]\n\t" - "str r4, [sp, #48]\n\t" - "str r5, [sp, #52]\n\t" - "str r6, [sp, #56]\n\t" - "str r8, [sp, #60]\n\t" + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "ADDS r0, r0, r5\n\t" + "ADCS r1, r1, r6\n\t" + "ADCS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "ADD r0, sp, #0x20\n\t" + "LDM r0, {r2, r3, r4}\n\t" + "ADDS r2, r2, lr\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "STM r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "LDM r0, {r0, r1, r2, r3, r4}\n\t" + "ADDS r0, r0, lr\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r8\n\t" + "ADCS r1, r1, r9\n\t" + "ADCS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r10\n\t" + "ADCS r1, r1, r11\n\t" + "ADCS r2, r2, r12\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r0, [sp, #44]\n\t" + "STR r1, [sp, #48]\n\t" + "STR r2, [sp, #52]\n\t" + "STR r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "ADD r0, sp, #0x1c\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "SUBS r0, r0, r5\n\t" + "SBCS r1, r1, r6\n\t" + "SBCS r2, r2, r7\n\t" + "SBCS r3, r3, r8\n\t" + "ADD r0, sp, #0x2c\n\t" + "MOV r8, r4\n\t" + "LDM r0, {r4, r5, r6, r7}\n\t" + "SBCS r4, r4, r9\n\t" + "SBCS r5, r5, r10\n\t" + "SBCS r6, r6, r11\n\t" + "SBCS r7, r7, r12\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC lr, lr, #0x0\n\t" /* mask m and sub from result if overflow */ - "sub r12, %[a], r12\n\t" - "and %[a], r12, #1\n\t" - "ldr r3, [sp, #32]\n\t" - "ldr r4, [sp, #36]\n\t" - "ldr r5, [sp, #40]\n\t" - "ldr r6, [sp, #44]\n\t" - "ldr r8, [sp, #48]\n\t" - "ldr r9, [sp, #52]\n\t" - "ldr r10, [sp, #56]\n\t" - "ldr r11, [sp, #60]\n\t" - "subs r3, r3, r12\n\t" - "sbcs r4, r4, r12\n\t" - "sbcs r5, r5, r12\n\t" - "sbcs r6, r6, #0\n\t" - "sbcs r8, r8, #0\n\t" - "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, %[a]\n\t" - "sbc r11, r11, r12\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "str r8, [%[r], #16]\n\t" - "str r9, [%[r], #20]\n\t" - "str r10, [%[r], #24]\n\t" - "str r11, [%[r], #28]\n\t" - "add sp, sp, #68\n\t" - : [a] "+r" (a) - : [r] "r" (r) - : "memory", "r9", "r10", "r11", "r14", "r3", "r4", "r5", "r6", "r8", "r12" + "RSB lr, lr, #0x0\n\t" + "SUBS r1, r1, lr\n\t" + "SBCS r2, r2, lr\n\t" + "SBCS r3, r3, lr\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, lr, LSR #31\n\t" + "SBC r8, r8, lr\n\t" + "LDR %[r], [sp, #64]\n\t" + "STM %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)mp_p; +#else + (void)mp; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } +#else +/* Square the Montgomery form number mod the modulus (prime). (r = a * a mod m) + * + * r Result of squaring. + * a Number to square in Montgomery form. + * m Modulus (prime). + * mp Montgomery multiplier. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_sqr_8(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x44\n\t" + "STR %[r], [sp, #64]\n\t" + "LDM %[a], {r0, r1, r2, r3, r4, r5, r6, r7}\n\t" + "UMULL r9, r10, r0, r0\n\t" + "UMULL r11, r12, r0, r1\n\t" + "ADDS r11, r11, r11\n\t" + "MOV lr, #0x0\n\t" + "UMAAL r10, r11, lr, lr\n\t" + "STM sp, {r9, r10}\n\t" + "MOV r8, lr\n\t" + "UMAAL r8, r12, r0, r2\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r8, r11, r1, r1\n\t" + "UMULL r9, r10, r0, r3\n\t" + "UMAAL r9, r12, r1, r2\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STRD r8, r9, [sp, #8]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r10, r0, r4\n\t" + "UMAAL r9, r12, r1, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r2, r2\n\t" + "STR r9, [sp, #16]\n\t" + "UMULL r9, r8, r0, r5\n\t" + "UMAAL r9, r12, r1, r4\n\t" + "UMAAL r9, r10, r2, r3\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, lr, lr\n\t" + "STR r9, [sp, #20]\n\t" + "MOV r9, lr\n\t" + "UMAAL r9, r8, r0, r6\n\t" + "UMAAL r9, r12, r1, r5\n\t" + "UMAAL r9, r10, r2, r4\n\t" + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r11, r3, r3\n\t" + "STR r9, [sp, #24]\n\t" + "UMULL r0, r9, r0, r7\n\t" + "UMAAL r0, r8, r1, r6\n\t" + "UMAAL r0, r12, r2, r5\n\t" + "UMAAL r0, r10, r3, r4\n\t" + "ADCS r0, r0, r0\n\t" + "UMAAL r0, r11, lr, lr\n\t" + /* R[7] = r0 */ + "UMAAL r9, r8, r1, r7\n\t" + "UMAAL r9, r10, r2, r6\n\t" + "UMAAL r12, r9, r3, r5\n\t" + "ADCS r12, r12, r12\n\t" + "UMAAL r12, r11, r4, r4\n\t" + /* R[8] = r12 */ + "UMAAL r9, r8, r2, r7\n\t" + "UMAAL r10, r9, r3, r6\n\t" + "MOV r2, lr\n\t" + "UMAAL r10, r2, r4, r5\n\t" + "ADCS r10, r10, r10\n\t" + "UMAAL r11, r10, lr, lr\n\t" + /* R[9] = r11 */ + "UMAAL r2, r8, r3, r7\n\t" + "UMAAL r2, r9, r4, r6\n\t" + "ADCS r3, r2, r2\n\t" + "UMAAL r10, r3, r5, r5\n\t" + /* R[10] = r10 */ + "MOV r1, lr\n\t" + "UMAAL r1, r8, r4, r7\n\t" + "UMAAL r1, r9, r5, r6\n\t" + "ADCS r4, r1, r1\n\t" + "UMAAL r3, r4, lr, lr\n\t" + /* R[11] = r3 */ + "UMAAL r8, r9, r5, r7\n\t" + "ADCS r8, r8, r8\n\t" + "UMAAL r4, r8, r6, r6\n\t" + /* R[12] = r4 */ + "MOV r5, lr\n\t" + "UMAAL r5, r9, r6, r7\n\t" + "ADCS r5, r5, r5\n\t" + "UMAAL r8, r5, lr, lr\n\t" + /* R[13] = r8 */ + "ADCS r9, r9, r9\n\t" + "UMAAL r9, r5, r7, r7\n\t" + "ADCS r7, r5, lr\n\t" + /* R[14] = r9 */ + /* R[15] = r7 */ + "MOV lr, sp\n\t" + "ADD lr, lr, #0x1c\n\t" + "STM lr!, {r0, r12}\n\t" + "STM lr!, {r11}\n\t" + "STM lr!, {r10}\n\t" + "STM lr!, {r3, r4, r8, r9}\n\t" + "STM lr!, {r7}\n\t" + /* Start Reduction */ + "LDM sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "MOV r3, r11\n\t" + "MOV r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "SUB r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "MOV r0, r8\n\t" + "MOV r1, r9\n\t" + "MOV r2, r10\n\t" + "ADDS r8, r8, r5\n\t" + "ADCS r9, r9, r6\n\t" + "ADCS r10, r10, r7\n\t" + "ADCS r11, r11, r0\n\t" + "ADC r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "ADDS r0, r0, r5\n\t" + "ADCS r1, r1, r6\n\t" + "ADCS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "ADD r0, sp, #0x20\n\t" + "LDM r0, {r2, r3, r4}\n\t" + "ADDS r2, r2, lr\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "STM r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "LDM r0, {r0, r1, r2, r3, r4}\n\t" + "ADDS r0, r0, lr\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r8\n\t" + "ADCS r1, r1, r9\n\t" + "ADCS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r10\n\t" + "ADCS r1, r1, r11\n\t" + "ADCS r2, r2, r12\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r0, [sp, #44]\n\t" + "STR r1, [sp, #48]\n\t" + "STR r2, [sp, #52]\n\t" + "STR r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "ADD r0, sp, #0x1c\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "SUBS r0, r0, r5\n\t" + "SBCS r1, r1, r6\n\t" + "SBCS r2, r2, r7\n\t" + "SBCS r3, r3, r8\n\t" + "ADD r0, sp, #0x2c\n\t" + "MOV r8, r4\n\t" + "LDM r0, {r4, r5, r6, r7}\n\t" + "SBCS r4, r4, r9\n\t" + "SBCS r5, r5, r10\n\t" + "SBCS r6, r6, r11\n\t" + "SBCS r7, r7, r12\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC lr, lr, #0x0\n\t" + /* mask m and sub from result if overflow */ + "RSB lr, lr, #0x0\n\t" + "SUBS r1, r1, lr\n\t" + "SBCS r2, r2, lr\n\t" + "SBCS r3, r3, lr\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, lr, LSR #31\n\t" + "SBC r8, r8, lr\n\t" + "LDR %[r], [sp, #64]\n\t" + "STM %[r], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x44\n\t" + : [r] "+r" (r), [a] "+r" (a) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)mp_p; +#else + (void)mp; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#endif #if !defined(WOLFSSL_SP_SMALL) || defined(HAVE_COMP_KEY) /* Square the Montgomery form number a number of times. (r = a ^ n mod m) * @@ -18378,10 +33823,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_8(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_8(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_8(r, a, m, mp); for (; n > 1; n--) { @@ -18474,44 +33919,137 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_256_cmp_8(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_256_cmp_8(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_256_cmp_8(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #28\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0x1c\n\t" + "\n" + "L_sp_256_cmp_8_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_256_cmp_8_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Normalize the values in each word to 32. @@ -18520,6 +34058,7 @@ */ #define sp_256_norm_8(a) +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -18528,265 +34067,695 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_cond_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #32\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_256_cond_sub_8_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_256_cond_sub_8_words%=\n\t" +#else + "BLT.N L_sp_256_cond_sub_8_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_cond_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_256_cond_sub_8(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ +#ifndef WOLFSSL_SP_SMALL +#define sp_256_mont_reduce_order_8 sp_256_mont_reduce_8 + +#ifdef WOLFSSL_SP_NO_UMAAL /* Reduce the number back to 256 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)mp; - (void)m; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r2, #0\n\t" - "mov r1, #0\n\t" + "LDR lr, [%[m]]\n\t" /* i = 0 */ - "mov r9, r2\n\t" - "\n1:\n\t" - "mov r4, #0\n\t" - /* mu = a[i] * 1 (mp) = a[i] */ - "ldr r3, [%[a]]\n\t" - /* a[i] += -1 * mu = -1 * a[i] => a[i] = 0 no carry */ - /* a[i+1] += -1 * mu */ - "ldr r6, [%[a], #4]\n\t" - "mov r5, #0\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r2\n\t" - "str r4, [%[a], #4]\n\t" - /* a[i+2] += -1 * mu */ - "ldr r6, [%[a], #8]\n\t" - "mov r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adc r4, r4, r2\n\t" - "str r5, [%[a], #8]\n\t" - /* a[i+3] += 0 * mu */ - "ldr r6, [%[a], #12]\n\t" - "mov r5, #0\n\t" - "adds r4, r4, r3\n\t" - "adc r5, r5, r2\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r2\n\t" - "str r4, [%[a], #12]\n\t" - /* a[i+4] += 0 * mu */ - "ldr r6, [%[a], #16]\n\t" - "mov r4, #0\n\t" - "adds r5, r5, r6\n\t" - "adc r4, r4, r2\n\t" - "str r5, [%[a], #16]\n\t" - /* a[i+5] += 0 * mu */ - "ldr r6, [%[a], #20]\n\t" - "mov r5, #0\n\t" - "adds r4, r4, r6\n\t" - "adc r5, r5, r2\n\t" - "str r4, [%[a], #20]\n\t" - /* a[i+6] += 1 * mu */ - "ldr r6, [%[a], #24]\n\t" - "mov r4, #0\n\t" - "adds r5, r5, r3\n\t" - "adc r4, r4, r2\n\t" - "adds r5, r5, r6\n\t" - "adc r4, r4, r2\n\t" - "str r5, [%[a], #24]\n\t" - /* a[i+7] += -1 * mu */ - "ldr r6, [%[a], #28]\n\t" - "ldr r8, [%[a], #32]\n\t" - "adds r5, r1, r3\n\t" - "mov r1, #0\n\t" - "adc r1, r1, r2\n\t" - "subs r4, r4, r3\n\t" - "sbcs r5, r5, r2\n\t" - "sbc r1, r1, r2\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc r1, r1, r2\n\t" - "str r4, [%[a], #28]\n\t" - "str r5, [%[a], #32]\n\t" + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_256_mont_reduce_8_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "LDR r12, [%[a], #32]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r3, r3, #0x0\n\t" /* i += 1 */ - "add r9, r9, #1\n\t" - "add %[a], %[a], #4\n\t" - "mov r6, #8\n\t" - "cmp r9, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "sub %[a], %[a], #32\n\t" - "mov r3, r1\n\t" - "sub r1, r1, #1\n\t" - "mvn r1, r1\n\t" - "ldr r4, [%[a],#32]\n\t" - "ldr r5, [%[a],#36]\n\t" - "ldr r6, [%[a],#40]\n\t" - "ldr r8, [%[a],#44]\n\t" - "ldr r9, [%[a],#48]\n\t" - "ldr r10, [%[a],#52]\n\t" - "ldr r11, [%[a],#56]\n\t" - "ldr r14, [%[a],#60]\n\t" - "subs r4, r4, r1\n\t" - "sbcs r5, r5, r1\n\t" - "sbcs r6, r6, r1\n\t" - "sbcs r8, r8, r2\n\t" - "sbcs r9, r9, r2\n\t" - "sbcs r10, r10, r2\n\t" - "sbcs r11, r11, r3\n\t" - "sbc r14, r14, r1\n\t" - "str r4, [%[a],#0]\n\t" - "str r5, [%[a],#4]\n\t" - "str r6, [%[a],#8]\n\t" - "str r8, [%[a],#12]\n\t" - "str r9, [%[a],#16]\n\t" - "str r10, [%[a],#20]\n\t" - "str r11, [%[a],#24]\n\t" - "str r14, [%[a],#28]\n\t" - : [a] "+r" (a) + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x20\n\t" +#ifdef __GNUC__ + "BLT L_sp_256_mont_reduce_8_word%=\n\t" +#else + "BLT.W L_sp_256_mont_reduce_8_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); +} +#else +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_256_mont_reduce_8_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #32]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #28]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #32]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x20\n\t" +#ifdef __GNUC__ + "BLT L_sp_256_mont_reduce_8_word%=\n\t" +#else + "BLT.W L_sp_256_mont_reduce_8_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); +} + +#endif +#else +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_reduce_8(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x44\n\t" + "STR %[a], [sp, #64]\n\t" + "MOV lr, sp\n\t" + "LDM %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "STM lr!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "LDM %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "STM lr, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + /* Start Reduction */ + "LDM sp, {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "MOV r3, r11\n\t" + "MOV r4, r12\n\t" + /* mu = a[0]-a[7] + a[0]-a[4] << 96 + (a[0]-a[1] * 2) << 192 */ + /* - a[0] << 224 */ + /* + (a[0]-a[1] * 2) << (6 * 32) */ + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + "ADDS r11, r11, r5\n\t" + "ADC r12, r12, r6\n\t" + /* - a[0] << (7 * 32) */ + "SUB r12, r12, r5\n\t" + /* + a[0]-a[4] << (3 * 32) */ + "MOV r0, r8\n\t" + "MOV r1, r9\n\t" + "MOV r2, r10\n\t" + "ADDS r8, r8, r5\n\t" + "ADCS r9, r9, r6\n\t" + "ADCS r10, r10, r7\n\t" + "ADCS r11, r11, r0\n\t" + "ADC r12, r12, r1\n\t" + /* a += mu * m */ + /* += mu * ((1 << 256) - (1 << 224) + (1 << 192) + (1 << 96) - 1) */ + /* a[0] = = t[0] */ + /* a[1] = = t[1] */ + /* a[2] = = t[2] */ + /* a[3] += t[0] = t[3] */ + /* a[4] += t[1] = t[4] */ + /* a[5] += t[2] = t[5] */ + /* a[6] += t[0] + t[3] = t[6] */ + /* a[7] += t[1] + t[4] = t[7] + t[0] */ + "ADDS r0, r0, r5\n\t" + "ADCS r1, r1, r6\n\t" + "ADCS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* a[8] += t[0] + t[2] + t[5] */ + /* a[9] += t[1] + t[3] + t[6] */ + /* a[10] += t[2] + t[4] + t[7] */ + "ADD r0, sp, #0x20\n\t" + "LDM r0, {r2, r3, r4}\n\t" + "ADDS r2, r2, lr\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r7\n\t" + "ADCS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "STM r0!, {r2, r3, r4}\n\t" + /* a[11] += t[3] + t[5] + carry */ + /* a[12] += t[4] + t[6] */ + /* a[13] += t[5] + t[7] */ + /* a[14] += t[6] */ + /* a[15] += t[7] */ + "LDM r0, {r0, r1, r2, r3, r4}\n\t" + "ADDS r0, r0, lr\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "MOV lr, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r8\n\t" + "ADCS r1, r1, r9\n\t" + "ADCS r2, r2, r10\n\t" + "ADCS r3, r3, r11\n\t" + "ADCS r4, r4, r12\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r0, r0, r10\n\t" + "ADCS r1, r1, r11\n\t" + "ADCS r2, r2, r12\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADC lr, lr, #0x0\n\t" + "STR r0, [sp, #44]\n\t" + "STR r1, [sp, #48]\n\t" + "STR r2, [sp, #52]\n\t" + "STR r3, [sp, #56]\n\t" + /* a[7..15] - t[0..7] */ + "ADD r0, sp, #0x1c\n\t" + "LDM r0, {r0, r1, r2, r3}\n\t" + "SUBS r0, r0, r5\n\t" + "SBCS r1, r1, r6\n\t" + "SBCS r2, r2, r7\n\t" + "SBCS r3, r3, r8\n\t" + "ADD r0, sp, #0x2c\n\t" + "MOV r8, r4\n\t" + "LDM r0, {r4, r5, r6, r7}\n\t" + "SBCS r4, r4, r9\n\t" + "SBCS r5, r5, r10\n\t" + "SBCS r6, r6, r11\n\t" + "SBCS r7, r7, r12\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBC lr, lr, #0x0\n\t" + /* mask m and sub from result if overflow */ + "RSB lr, lr, #0x0\n\t" + "SUBS r1, r1, lr\n\t" + "SBCS r2, r2, lr\n\t" + "SBCS r3, r3, lr\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, lr, LSR #31\n\t" + "SBC r8, r8, lr\n\t" + "LDR %[a], [sp, #64]\n\t" + "STM %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADD sp, sp, #0x44\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)mp_p; +#else (void)mp; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } +#ifdef WOLFSSL_SP_NO_UMAAL /* Reduce the number back to 256 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #32\n\t" - "\n1:\n\t" + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_256_mont_reduce_order_8_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #24\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" - /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" -#else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" /* a[i+6] += m[6] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" /* a[i+7] += m[7] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[7] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[7] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #24\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "LDR r12, [%[a], #32]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x20\n\t" +#ifdef __GNUC__ + "BLT L_sp_256_mont_reduce_order_8_word%=\n\t" +#else + "BLT.W L_sp_256_mont_reduce_order_8_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); +} - sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - ca); +#else +/* Reduce the number back to 256 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_256_mont_reduce_order_8(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_256_mont_reduce_order_8_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #32]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #28]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #32]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x20\n\t" +#ifdef __GNUC__ + "BLT L_sp_256_mont_reduce_order_8_word%=\n\t" +#else + "BLT.W L_sp_256_mont_reduce_order_8_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_256_cond_sub_8(a - 8, a, m, (sp_digit)0 - mp); } +#endif +#endif /* WOLFSSL_SP_SMALL */ /* Map the Montgomery form projective coordinate point to an affine point. * * r Resulting affine coordinate point. @@ -18834,68 +34803,63 @@ * b Second number to add in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_256_mont_add_8(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldr r4, [%[a],#0]\n\t" - "ldr r5, [%[a],#4]\n\t" - "ldr r6, [%[a],#8]\n\t" - "ldr r8, [%[a],#12]\n\t" - "ldr r9, [%[b],#0]\n\t" - "ldr r10, [%[b],#4]\n\t" - "ldr r11, [%[b],#8]\n\t" - "ldr r14, [%[b],#12]\n\t" - "adds r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adcs r6, r6, r11\n\t" - "adcs r8, r8, r14\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "str r6, [%[r],#8]\n\t" - "str r8, [%[r],#12]\n\t" - "ldr r4, [%[a],#16]\n\t" - "ldr r5, [%[a],#20]\n\t" - "ldr r6, [%[a],#24]\n\t" - "ldr r8, [%[a],#28]\n\t" - "ldr r9, [%[b],#16]\n\t" - "ldr r10, [%[b],#20]\n\t" - "ldr r11, [%[b],#24]\n\t" - "ldr r14, [%[b],#28]\n\t" - "adcs r4, r4, r9\n\t" - "adcs r5, r5, r10\n\t" - "adcs r6, r6, r11\n\t" - "adcs r8, r8, r14\n\t" - "adc r3, r12, #0\n\t" - "sub r3, r12, r3\n\t" - "and r12, r3, #1\n\t" - "ldr r9, [%[r],#0]\n\t" - "ldr r10, [%[r],#4]\n\t" - "ldr r11, [%[r],#8]\n\t" - "ldr r14, [%[r],#12]\n\t" - "subs r9, r9, r3\n\t" - "sbcs r10, r10, r3\n\t" - "sbcs r11, r11, r3\n\t" - "sbcs r14, r14, #0\n\t" - "sbcs r4, r4, #0\n\t" - "sbcs r5, r5, #0\n\t" - "sbcs r6, r6, r12\n\t" - "sbc r8, r8, r3\n\t" - "str r9, [%[r],#0]\n\t" - "str r10, [%[r],#4]\n\t" - "str r11, [%[r],#8]\n\t" - "str r14, [%[r],#12]\n\t" - "str r4, [%[r],#16]\n\t" - "str r5, [%[r],#20]\n\t" - "str r6, [%[r],#24]\n\t" - "str r8, [%[r],#28]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV lr, #0x0\n\t" + "LDM %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "ADDS r5, r5, r3\n\t" + "ADCS r6, r6, r4\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "ADCS r7, r7, r3\n\t" + "ADCS r8, r8, r4\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "ADCS r9, r9, r3\n\t" + "ADCS r10, r10, r4\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "ADCS r11, r11, r3\n\t" + "ADCS r12, r12, r4\n\t" + "ADC lr, lr, #0x0\n\t" + "RSB lr, lr, #0x0\n\t" + "SUBS r5, r5, lr\n\t" + "SBCS r6, r6, lr\n\t" + "SBCS r7, r7, lr\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, #0x0\n\t" + "SBCS r11, r11, lr, LSR #31\n\t" + "SBCS r12, r12, lr\n\t" + "SBC %[b], %[b], %[b]\n\t" + "SUB lr, lr, %[b]\n\t" + "SUBS r5, r5, lr\n\t" + "SBCS r6, r6, lr\n\t" + "SBCS r7, r7, lr\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, #0x0\n\t" + "SBCS r11, r11, lr, LSR #31\n\t" + "SBC r12, r12, lr\n\t" + "STM %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (r), [a] "r" (a), [b] "r" (b) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r3", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } /* Double a Montgomery form number (r = a + a % m). @@ -18904,51 +34868,58 @@ * a Number to double in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_dbl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_256_mont_dbl_8(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldr r4, [%[a],#0]\n\t" - "ldr r5, [%[a],#4]\n\t" - "ldr r6, [%[a],#8]\n\t" - "ldr r8, [%[a],#12]\n\t" - "ldr r9, [%[a],#16]\n\t" - "ldr r10, [%[a],#20]\n\t" - "ldr r11, [%[a],#24]\n\t" - "ldr r14, [%[a],#28]\n\t" - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r11, r11, r11\n\t" - "adcs r14, r14, r14\n\t" - "adc r3, r12, #0\n\t" - "sub r3, r12, r3\n\t" - "and r12, r3, #1\n\t" - "subs r4, r4, r3\n\t" - "sbcs r5, r5, r3\n\t" - "sbcs r6, r6, r3\n\t" - "sbcs r8, r8, #0\n\t" - "sbcs r9, r9, #0\n\t" - "sbcs r10, r10, #0\n\t" - "sbcs r11, r11, r12\n\t" - "sbc r14, r14, r3\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "str r6, [%[r],#8]\n\t" - "str r8, [%[r],#12]\n\t" - "str r9, [%[r],#16]\n\t" - "str r10, [%[r],#20]\n\t" - "str r11, [%[r],#24]\n\t" - "str r14, [%[r],#28]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0x0\n\t" + "LDM %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "ADC r2, r2, #0x0\n\t" + "RSB r2, r2, #0x0\n\t" + "SUBS r4, r4, r2\n\t" + "SBCS r5, r5, r2\n\t" + "SBCS r6, r6, r2\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, r2, LSR #31\n\t" + "SBCS r11, r11, r2\n\t" + "SBC %[a], %[a], %[a]\n\t" + "SUB r2, r2, %[a]\n\t" + "SUBS r4, r4, r2\n\t" + "SBCS r5, r5, r2\n\t" + "SBCS r6, r6, r2\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, r2, LSR #31\n\t" + "SBC r11, r11, r2\n\t" + "STM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r3", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } /* Triple a Montgomery form number (r = a + a + a % m). @@ -18957,83 +34928,90 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_tpl_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_256_mont_tpl_8(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "ldr r2, [%[a],#0]\n\t" - "ldr r3, [%[a],#4]\n\t" - "ldr r4, [%[a],#8]\n\t" - "ldr r5, [%[a],#12]\n\t" - "ldr r6, [%[a],#16]\n\t" - "ldr r8, [%[a],#20]\n\t" - "ldr r9, [%[a],#24]\n\t" - "ldr r10, [%[a],#28]\n\t" - "adds r2, r2, r2\n\t" - "adcs r3, r3, r3\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "mov r11, #0\n\t" - "mov r14, #0\n\t" - "adc r11, r11, r11\n\t" - "mov r12, r11\n\t" - "sub r11, r11, #1\n\t" - "mvn r11, r11\n\t" - "subs r2, r2, r11\n\t" - "sbcs r3, r3, r11\n\t" - "sbcs r4, r4, r11\n\t" - "sbcs r5, r5, r14\n\t" - "sbcs r6, r6, r14\n\t" - "sbcs r8, r8, r14\n\t" - "sbcs r9, r9, r12\n\t" - "sbc r10, r10, r11\n\t" - "ldr r12, [%[a],#0]\n\t" - "ldr r14, [%[a],#4]\n\t" - "adds r2, r2, r12\n\t" - "adcs r3, r3, r14\n\t" - "ldr r12, [%[a],#8]\n\t" - "ldr r14, [%[a],#12]\n\t" - "adcs r4, r4, r12\n\t" - "adcs r5, r5, r14\n\t" - "ldr r12, [%[a],#16]\n\t" - "ldr r14, [%[a],#20]\n\t" - "adcs r6, r6, r12\n\t" - "adcs r8, r8, r14\n\t" - "ldr r12, [%[a],#24]\n\t" - "ldr r14, [%[a],#28]\n\t" - "adcs r9, r9, r12\n\t" - "adcs r10, r10, r14\n\t" - "mov r11, #0\n\t" - "mov r14, #0\n\t" - "adc r11, r11, r11\n\t" - "mov r12, r11\n\t" - "sub r11, r11, #1\n\t" - "mvn r11, r11\n\t" - "subs r2, r2, r11\n\t" - "str r2, [%[r],#0]\n\t" - "sbcs r3, r3, r11\n\t" - "str r3, [%[r],#4]\n\t" - "sbcs r4, r4, r11\n\t" - "str r4, [%[r],#8]\n\t" - "sbcs r5, r5, r14\n\t" - "str r5, [%[r],#12]\n\t" - "sbcs r6, r6, r14\n\t" - "str r6, [%[r],#16]\n\t" - "sbcs r8, r8, r14\n\t" - "str r8, [%[r],#20]\n\t" - "sbcs r9, r9, r12\n\t" - "str r9, [%[r],#24]\n\t" - "sbc r10, r10, r11\n\t" - "str r10, [%[r],#28]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r12, #0x0\n\t" + "LDM %[a], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "ADC r12, r12, #0x0\n\t" + "RSB r12, r12, #0x0\n\t" + "SUBS r4, r4, r12\n\t" + "SBCS r5, r5, r12\n\t" + "SBCS r6, r6, r12\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, r12, LSR #31\n\t" + "SBCS r11, r11, r12\n\t" + "SBC r2, r2, r2\n\t" + "SUB r12, r12, r2\n\t" + "SUBS r4, r4, r12\n\t" + "SBCS r5, r5, r12\n\t" + "SBCS r6, r6, r12\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, r12, LSR #31\n\t" + "SBC r11, r11, r12\n\t" + "LDM %[a]!, {r2, r3}\n\t" + "ADDS r4, r4, r2\n\t" + "ADCS r5, r5, r3\n\t" + "LDM %[a]!, {r2, r3}\n\t" + "ADCS r6, r6, r2\n\t" + "ADCS r7, r7, r3\n\t" + "LDM %[a]!, {r2, r3}\n\t" + "ADCS r8, r8, r2\n\t" + "ADCS r9, r9, r3\n\t" + "LDM %[a]!, {r2, r3}\n\t" + "ADCS r10, r10, r2\n\t" + "ADCS r11, r11, r3\n\t" + "ADC r12, r12, #0x0\n\t" + "RSB r12, r12, #0x0\n\t" + "SUBS r4, r4, r12\n\t" + "SBCS r5, r5, r12\n\t" + "SBCS r6, r6, r12\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, r12, LSR #31\n\t" + "SBCS r11, r11, r12\n\t" + "SBC r2, r2, r2\n\t" + "SUB r12, r12, r2\n\t" + "SUBS r4, r4, r12\n\t" + "SBCS r5, r5, r12\n\t" + "SBCS r6, r6, r12\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, r12, LSR #31\n\t" + "SBC r11, r11, r12\n\t" + "STM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r11", "r12", "r14", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "r12", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } /* Subtract two Montgomery form numbers (r = a - b % m). @@ -19043,154 +35021,122 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_256_mont_sub_8(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldr r4, [%[a],#0]\n\t" - "ldr r5, [%[a],#4]\n\t" - "ldr r6, [%[a],#8]\n\t" - "ldr r8, [%[a],#12]\n\t" - "ldr r9, [%[b],#0]\n\t" - "ldr r10, [%[b],#4]\n\t" - "ldr r11, [%[b],#8]\n\t" - "ldr r14, [%[b],#12]\n\t" - "subs r4, r4, r9\n\t" - "sbcs r5, r5, r10\n\t" - "sbcs r6, r6, r11\n\t" - "sbcs r8, r8, r14\n\t" - "str r4, [%[r],#0]\n\t" - "str r5, [%[r],#4]\n\t" - "str r6, [%[r],#8]\n\t" - "str r8, [%[r],#12]\n\t" - "ldr r4, [%[a],#16]\n\t" - "ldr r5, [%[a],#20]\n\t" - "ldr r6, [%[a],#24]\n\t" - "ldr r8, [%[a],#28]\n\t" - "ldr r9, [%[b],#16]\n\t" - "ldr r10, [%[b],#20]\n\t" - "ldr r11, [%[b],#24]\n\t" - "ldr r14, [%[b],#28]\n\t" - "sbcs r4, r4, r9\n\t" - "sbcs r5, r5, r10\n\t" - "sbcs r6, r6, r11\n\t" - "sbcs r8, r8, r14\n\t" - "sbc r3, r12, #0\n\t" - "and r12, r3, #1\n\t" - "ldr r9, [%[r],#0]\n\t" - "ldr r10, [%[r],#4]\n\t" - "ldr r11, [%[r],#8]\n\t" - "ldr r14, [%[r],#12]\n\t" - "adds r9, r9, r3\n\t" - "adcs r10, r10, r3\n\t" - "adcs r11, r11, r3\n\t" - "adcs r14, r14, #0\n\t" - "adcs r4, r4, #0\n\t" - "adcs r5, r5, #0\n\t" - "adcs r6, r6, r12\n\t" - "adc r8, r8, r3\n\t" - "str r9, [%[r],#0]\n\t" - "str r10, [%[r],#4]\n\t" - "str r11, [%[r],#8]\n\t" - "str r14, [%[r],#12]\n\t" - "str r4, [%[r],#16]\n\t" - "str r5, [%[r],#20]\n\t" - "str r6, [%[r],#24]\n\t" - "str r8, [%[r],#28]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV lr, #0x0\n\t" + "LDM %[a], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "SUBS r5, r5, r3\n\t" + "SBCS r6, r6, r4\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "SBCS r7, r7, r3\n\t" + "SBCS r8, r8, r4\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "SBCS r9, r9, r3\n\t" + "SBCS r10, r10, r4\n\t" + "LDM %[b]!, {r3, r4}\n\t" + "SBCS r11, r11, r3\n\t" + "SBCS r12, r12, r4\n\t" + "SBC lr, lr, #0x0\n\t" + "ADDS r5, r5, lr\n\t" + "ADCS r6, r6, lr\n\t" + "ADCS r7, r7, lr\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, lr, LSR #31\n\t" + "ADCS r12, r12, lr\n\t" + "ADC lr, lr, #0x0\n\t" + "ADDS r5, r5, lr\n\t" + "ADCS r6, r6, lr\n\t" + "ADCS r7, r7, lr\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, lr, LSR #31\n\t" + "ADC r12, r12, lr\n\t" + "STM %[r], {r5, r6, r7, r8, r9, r10, r11, r12}\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (r), [a] "r" (a), [b] "r" (b) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r14", "r3", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } -#define sp_256_mont_sub_lower_8 sp_256_mont_sub_8 /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) * * r Result of division by 2. * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_256_div2_8(sp_digit* r, const sp_digit* a, const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_256_mont_div2_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_256_mont_div2_8(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "ldr r8, [%[a], #0]\n\t" - "lsl r8, r8, #31\n\t" - "lsr r8, r8, #31\n\t" - "mov r5, #0\n\t" - "sub r5, r5, r8\n\t" - "mov r8, #0\n\t" - "lsl r6, r5, #31\n\t" - "lsr r6, r6, #31\n\t" - "ldr r3, [%[a], #0]\n\t" - "ldr r4, [%[a], #4]\n\t" - "adds r3, r3, r5\n\t" - "adcs r4, r4, r5\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "ldr r3, [%[a], #8]\n\t" - "ldr r4, [%[a], #12]\n\t" - "adcs r3, r3, r5\n\t" - "adcs r4, r4, r8\n\t" - "str r3, [%[r], #8]\n\t" - "str r4, [%[r], #12]\n\t" - "ldr r3, [%[a], #16]\n\t" - "ldr r4, [%[a], #20]\n\t" - "adcs r3, r3, r8\n\t" - "adcs r4, r4, r8\n\t" - "str r3, [%[r], #16]\n\t" - "str r4, [%[r], #20]\n\t" - "ldr r3, [%[a], #24]\n\t" - "ldr r4, [%[a], #28]\n\t" - "adcs r3, r3, r6\n\t" - "adcs r4, r4, r5\n\t" - "adc r8, r8, r8\n\t" - "lsl r8, r8, #31\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, #31\n\t" - "lsr r6, r4, #1\n\t" - "lsl r4, r4, #31\n\t" - "orr r5, r5, r4\n\t" - "orr r6, r6, r8\n\t" - "mov r8, r3\n\t" - "str r5, [%[r], #24]\n\t" - "str r6, [%[r], #28]\n\t" - "ldr r3, [%[a], #16]\n\t" - "ldr r4, [%[a], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, #31\n\t" - "lsr r6, r4, #1\n\t" - "lsl r4, r4, #31\n\t" - "orr r5, r5, r4\n\t" - "orr r6, r6, r8\n\t" - "mov r8, r3\n\t" - "str r5, [%[r], #16]\n\t" - "str r6, [%[r], #20]\n\t" - "ldr r3, [%[a], #8]\n\t" - "ldr r4, [%[a], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, #31\n\t" - "lsr r6, r4, #1\n\t" - "lsl r4, r4, #31\n\t" - "orr r5, r5, r4\n\t" - "orr r6, r6, r8\n\t" - "mov r8, r3\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[r], #0]\n\t" - "ldr r4, [%[r], #4]\n\t" - "lsr r5, r3, #1\n\t" - "lsr r6, r4, #1\n\t" - "lsl r4, r4, #31\n\t" - "orr r5, r5, r4\n\t" - "orr r6, r6, r8\n\t" - "str r5, [%[r], #0]\n\t" - "str r6, [%[r], #4]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r4, r5, r6, r7}\n\t" + "AND r3, r4, #0x1\n\t" + "RSB r8, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r5, r5, r8\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, #0x0\n\t" + "STM %[r], {r4, r5, r6, r7}\n\t" + "LDRD r4, r5, [%[a], #16]\n\t" + "LDRD r6, r7, [%[a], #24]\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, r8, LSR #31\n\t" + "ADCS r7, r7, r8\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "LSR r8, r4, #1\n\t" + "LSR r9, r5, #1\n\t" + "LSR r10, r6, #1\n\t" + "LSR r11, r7, #1\n\t" + "ORR r8, r8, r5, LSL #31\n\t" + "ORR r9, r9, r6, LSL #31\n\t" + "ORR r10, r10, r7, LSL #31\n\t" + "ORR r11, r11, r3, LSL #31\n\t" + "MOV r3, r4\n\t" + "STRD r8, r9, [%[r], #16]\n\t" + "STRD r10, r11, [%[r], #24]\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LSR r8, r4, #1\n\t" + "LSR r9, r5, #1\n\t" + "LSR r10, r6, #1\n\t" + "LSR r11, r7, #1\n\t" + "ORR r8, r8, r5, LSL #31\n\t" + "ORR r9, r9, r6, LSL #31\n\t" + "ORR r10, r10, r7, LSL #31\n\t" + "ORR r11, r11, r3, LSL #31\n\t" + "STM %[r], {r8, r9, r10, r11}\n\t" + : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : [r] "r" (r), [a] "r" (a), [m] "r" (m) - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "cc" ); } @@ -19238,7 +35184,7 @@ /* T2 = Y * Y */ sp_256_mont_sqr_8(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_8(t2, t2, p256_mod); + sp_256_mont_div2_8(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_8(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ @@ -19248,7 +35194,7 @@ /* X = X - Y */ sp_256_mont_sub_8(x, x, y, p256_mod); /* Y = Y - X */ - sp_256_mont_sub_lower_8(y, y, x, p256_mod); + sp_256_mont_sub_8(y, y, x, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_8(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -19271,7 +35217,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_8_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_8_ctx* ctx = (sp_256_proj_point_dbl_8_ctx*)sp_ctx->data; @@ -19345,7 +35292,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_8(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_8(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -19370,7 +35317,7 @@ break; case 16: /* Y = Y - X */ - sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -19431,12 +35378,12 @@ static void sp_256_proj_point_add_8(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*8; - sp_digit* t3 = t + 4*8; - sp_digit* t4 = t + 6*8; - sp_digit* t5 = t + 8*8; - sp_digit* t6 = t + 10*8; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*8; + sp_digit* t2 = t + 4*8; + sp_digit* t3 = t + 6*8; + sp_digit* t4 = t + 8*8; + sp_digit* t5 = t + 10*8; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_8(t1, q->z, p256_mod, p256_mp_mod); @@ -19458,17 +35405,9 @@ sp_256_proj_point_dbl_8(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_8(t2, t2, t1, p256_mod); @@ -19487,20 +35426,31 @@ sp_256_mont_dbl_8(t3, y, p256_mod); sp_256_mont_sub_8(x, x, t3, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_8(y, y, x, p256_mod); + sp_256_mont_sub_8(y, y, x, p256_mod); sp_256_mont_mul_8(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_8(y, y, t5, p256_mod); - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -19546,12 +35496,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*8; - ctx->t3 = t + 4*8; - ctx->t4 = t + 6*8; - ctx->t5 = t + 8*8; - ctx->t6 = t + 10*8; + ctx->t6 = t; + ctx->t1 = t + 2*8; + ctx->t2 = t + 4*8; + ctx->t3 = t + 6*8; + ctx->t4 = t + 8*8; + ctx->t5 = t + 10*8; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -19658,7 +35608,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_8(ctx->y, ctx->y, ctx->x, p256_mod); + sp_256_mont_sub_8(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -19671,22 +35621,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -19706,7 +35662,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_point_16_8(sp_point_256* r, const sp_point_256* table, @@ -19958,8 +35914,6 @@ } #ifdef FP_ECC -#define sp_256_mont_dbl_lower_8 sp_256_mont_dbl_8 -#define sp_256_mont_tpl_lower_8 sp_256_mont_tpl_8 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -19998,7 +35952,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_8(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_8(a, t1, p256_mod); + sp_256_mont_tpl_8(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod); @@ -20007,8 +35961,8 @@ sp_256_mont_dbl_8(t2, b, p256_mod); sp_256_mont_sub_8(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_8(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_8(b, t2, p256_mod); + sp_256_mont_sub_8(t2, b, x, p256_mod); + sp_256_mont_dbl_8(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -20028,7 +35982,7 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_8(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_8(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_8(a, t1, p256_mod); + sp_256_mont_tpl_8(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_8(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_8(b, t1, x, p256_mod, p256_mp_mod); @@ -20037,8 +35991,8 @@ sp_256_mont_dbl_8(t2, b, p256_mod); sp_256_mont_sub_8(x, x, t2, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_sub_lower_8(t2, b, x, p256_mod); - sp_256_mont_dbl_lower_8(b, t2, p256_mod); + sp_256_mont_sub_8(t2, b, x, p256_mod); + sp_256_mont_dbl_8(b, t2, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_8(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -20048,7 +36002,7 @@ sp_256_mont_sub_8(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_8(y, y, p256_mod); + sp_256_mont_div2_8(y, y, p256_mod); } /* Convert the projective point to affine. @@ -20094,12 +36048,12 @@ static void sp_256_proj_point_add_qz1_8(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*8; - sp_digit* t3 = t + 4*8; - sp_digit* t4 = t + 6*8; - sp_digit* t5 = t + 8*8; - sp_digit* t6 = t + 10*8; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*8; + sp_digit* t6 = t + 4*8; + sp_digit* t1 = t + 6*8; + sp_digit* t4 = t + 8*8; + sp_digit* t5 = t + 10*8; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -20115,13 +36069,9 @@ sp_256_proj_point_dbl_8(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_8(t2, t2, p->x, p256_mod); @@ -20130,33 +36080,40 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_8(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_8(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_8(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_8(x, t1, t5, p256_mod); - sp_256_mont_dbl_8(t1, t3, p256_mod); - sp_256_mont_sub_8(x, x, t1, p256_mod); + sp_256_mont_sqr_8(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_8(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_8(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_8(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_8(t2, t2, t1, p256_mod); + sp_256_mont_dbl_8(t5, t3, p256_mod); + sp_256_mont_sub_8(x, t2, t5, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_8(t3, t3, x, p256_mod); + sp_256_mont_sub_8(t3, t3, x, p256_mod); sp_256_mont_mul_8(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_8(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_8(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 8; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 8; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_256_mont_mul_8(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_8(y, t3, t1, p256_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 8; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 8; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -20257,7 +36214,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_16_8(sp_point_256* r, @@ -20446,13 +36403,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -20523,8 +36482,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap); @@ -20545,10 +36504,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -20677,7 +36638,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_256_get_entry_256_8(sp_point_256* r, @@ -20866,13 +36827,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -20943,8 +36906,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_8(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_fast_8(r, g, k, map, ct, heap); @@ -20965,10 +36928,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -21061,7 +37026,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -21072,7 +37037,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_256* point = NULL; + sp_point_256* point = NULL; sp_digit* k = NULL; #else sp_point_256 point[2]; @@ -22610,7 +38575,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -22632,7 +38597,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -22691,38 +38656,32 @@ * * a A single precision integer. */ -SP_NOINLINE static void sp_256_add_one_8(sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_256_add_one_8(sp_digit* a_p) +#else +static void sp_256_add_one_8(sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r2, #1\n\t" - "ldr r1, [%[a], #0]\n\t" - "adds r1, r1, r2\n\t" - "mov r2, #0\n\t" - "str r1, [%[a], #0]\n\t" - "ldr r1, [%[a], #4]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #4]\n\t" - "ldr r1, [%[a], #8]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #8]\n\t" - "ldr r1, [%[a], #12]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #12]\n\t" - "ldr r1, [%[a], #16]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #16]\n\t" - "ldr r1, [%[a], #20]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #20]\n\t" - "ldr r1, [%[a], #24]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #24]\n\t" - "ldr r1, [%[a], #28]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #28]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADDS r1, r1, #0x1\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + : [a] "+r" (a) : - : [a] "r" (a) - : "memory", "r1", "r2" + : "memory", "r1", "r2", "r3", "r4", "cc" ); } @@ -22817,7 +38776,7 @@ sp_point_256* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -22825,7 +38784,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -23101,126 +39060,207 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_256_sub_in_place_8(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #32\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x20\n\t" + "\n" + "L_sp_256_sub_in_pkace_8_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_256_sub_in_pkace_8_word%=\n\t" +#else + "BNE.N L_sp_256_sub_in_pkace_8_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #else -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) + * + * a A single precision integer and result. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_sub_in_place_8(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_256_sub_in_place_8(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)a; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL +/* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. + * b A single precision digit. */ -SP_NOINLINE static sp_digit sp_256_sub_in_place_8(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_256_mul_d_8(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) + /* A[0] * B */ + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_256_mul_d_8_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_256_mul_d_8_word%=\n\t" +#else + "BLT.N L_sp_256_mul_d_8_word%=\n\t" +#endif + "STR r3, [%[r], #32]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; } -#endif /* WOLFSSL_SP_SMALL */ +#else /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_256_mul_d_8(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_256_mul_d_8(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_256_mul_d_8(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #32\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "STR r5, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -23230,49 +39270,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_256_word_8(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_256_word_8_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_256_word_8_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* AND m into each word of a and store in r. * * r A single precision integer. @@ -23308,8 +39433,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_256_div_8(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[16], t2[9]; sp_digit div, r1; @@ -23492,7 +39617,7 @@ sp_256_mont_sqr_n_order_8(t2, t3, 4); /* t = a^ff = t2 * t3 */ sp_256_mont_mul_order_8(t, t2, t3); - /* t3= a^ff00 = t ^ 2 ^ 8 */ + /* t2= a^ff00 = t ^ 2 ^ 8 */ sp_256_mont_sqr_n_order_8(t2, t, 8); /* t = a^ffff = t2 * t */ sp_256_mont_mul_order_8(t, t2, t); @@ -23509,7 +39634,11 @@ /* t2= a^ffffffff00000000ffffffffffffffff = t2 * t */ sp_256_mont_mul_order_8(t2, t2, t); /* t2= a^ffffffff00000000ffffffffffffffffbce6 */ - for (i=127; i>=112; i--) { + sp_256_mont_sqr_order_8(t2, t2); + sp_256_mont_mul_order_8(t2, t2, a); + sp_256_mont_sqr_n_order_8(t2, t2, 5); + sp_256_mont_mul_order_8(t2, t2, t3); + for (i=121; i>=112; i--) { sp_256_mont_sqr_order_8(t2, t2); if ((p256_order_low[i / 32] & ((sp_int_digit)1 << (i % 32))) != 0) { sp_256_mont_mul_order_8(t2, t2, a); @@ -23914,48 +40043,137 @@ #endif /* HAVE_ECC_SIGN */ #ifndef WOLFSSL_SP_SMALL +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r11, #0x0\n\t" + "ADD r12, %[a], #0x20\n\t" + "\n" + "L_sp_256_sub_8_word%=:\n\t" + "RSBS r11, r11, #0x0\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC r11, r3, r3\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_256_sub_8_word%=\n\t" +#else + "BNE.N L_sp_256_sub_8_word%=\n\t" +#endif + "MOV %[r], r11\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_256_sub_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_256_sub_8(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_256_rshift1_8(sp_digit* r_p, const sp_digit* a_p) +#else static void sp_256_rshift1_8(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r10, #0\n\t" - "mov r9, #0\n\t" - "ldr r3, [%[a], #16]\n\t" - "ldr r4, [%[a], #20]\n\t" - "ldr r5, [%[a], #24]\n\t" - "ldr r6, [%[a], #28]\n\t" - "lsr r7, r3, #1\n\t" - "and r3, r3, #1\n\t" - "lsr r8, r4, #1\n\t" - "lsr r10, r5, #1\n\t" - "lsr r14, r6, #1\n\t" - "orr r7, r7, r4, lsl #31\n\t" - "orr r8, r8, r5, lsl #31\n\t" - "orr r10, r10, r6, lsl #31\n\t" - "orr r14, r14, r9, lsl #31\n\t" - "mov r9, r3\n\t" - "str r7, [%[r], #16]\n\t" - "str r8, [%[r], #20]\n\t" - "str r10, [%[r], #24]\n\t" - "str r14, [%[r], #28]\n\t" - "ldr r3, [%[r], #0]\n\t" - "ldr r4, [%[r], #4]\n\t" - "ldr r5, [%[r], #8]\n\t" - "ldr r6, [%[r], #12]\n\t" - "lsr r7, r3, #1\n\t" - "lsr r8, r4, #1\n\t" - "lsr r10, r5, #1\n\t" - "lsr r14, r6, #1\n\t" - "orr r7, r7, r4, lsl #31\n\t" - "orr r8, r8, r5, lsl #31\n\t" - "orr r10, r10, r6, lsl #31\n\t" - "orr r14, r14, r9, lsl #31\n\t" - "str r7, [%[r], #0]\n\t" - "str r8, [%[r], #4]\n\t" - "str r10, [%[r], #8]\n\t" - "str r14, [%[r], #12]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "LDRD r2, r3, [%[a], #16]\n\t" + "LDRD r4, r5, [%[a], #24]\n\t" + "LSR r6, r2, #1\n\t" + "LSR r7, r3, #1\n\t" + "LSR r8, r4, #1\n\t" + "LSR r9, r5, #1\n\t" + "ORR r6, r6, r3, lsl #31\n\t" + "ORR r7, r7, r4, lsl #31\n\t" + "ORR r8, r8, r5, lsl #31\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "MOV r10, r2\n\t" + "STRD r6, r7, [%[r], #16]\n\t" + "STRD r8, r9, [%[r], #24]\n\t" + "LDRD r2, r3, [%[a]]\n\t" + "LDRD r4, r5, [%[a], #8]\n\t" + "LSR r6, r2, #1\n\t" + "LSR r7, r3, #1\n\t" + "LSR r8, r4, #1\n\t" + "LSR r9, r5, #1\n\t" + "ORR r6, r6, r3, lsl #31\n\t" + "ORR r7, r7, r4, lsl #31\n\t" + "ORR r8, r8, r5, lsl #31\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "STRD r6, r7, [%[r]]\n\t" + "STRD r8, r9, [%[r], #8]\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10", "r14", "r9" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -23965,156 +40183,222 @@ * a Number to divide. * m Modulus. */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_256_div2_mod_8(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else static void sp_256_div2_mod_8(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r10, #0\n\t" - "ldr r3, [%[a], #0]\n\t" - "ands r9, r3, #1\n\t" - "beq 1f\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[a], #8]\n\t" - "ldr r6, [%[a], #12]\n\t" - "ldr r7, [%[m], #0]\n\t" - "ldr r8, [%[m], #4]\n\t" - "ldr r10, [%[m], #8]\n\t" - "ldr r14, [%[m], #12]\n\t" - "adds r3, r3, r7\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r10\n\t" - "adcs r6, r6, r14\n\t" - "str r3, [%[r], #0]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #8]\n\t" - "str r6, [%[r], #12]\n\t" - "ldr r3, [%[a], #16]\n\t" - "ldr r4, [%[a], #20]\n\t" - "ldr r5, [%[a], #24]\n\t" - "ldr r6, [%[a], #28]\n\t" - "ldr r7, [%[m], #16]\n\t" - "ldr r8, [%[m], #20]\n\t" - "ldr r10, [%[m], #24]\n\t" - "ldr r14, [%[m], #28]\n\t" - "adcs r3, r3, r7\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r10\n\t" - "adcs r6, r6, r14\n\t" - "adc r9, r10, r10\n\t" - "b 2f\n\t" - "\n1:\n\t" - "ldr r3, [%[a], #16]\n\t" - "ldr r4, [%[a], #20]\n\t" - "ldr r5, [%[a], #24]\n\t" - "ldr r6, [%[a], #28]\n\t" - "\n2:\n\t" - "lsr r7, r3, #1\n\t" - "and r3, r3, #1\n\t" - "lsr r8, r4, #1\n\t" - "lsr r10, r5, #1\n\t" - "lsr r14, r6, #1\n\t" - "orr r7, r7, r4, lsl #31\n\t" - "orr r8, r8, r5, lsl #31\n\t" - "orr r10, r10, r6, lsl #31\n\t" - "orr r14, r14, r9, lsl #31\n\t" - "mov r9, r3\n\t" - "str r7, [%[r], #16]\n\t" - "str r8, [%[r], #20]\n\t" - "str r10, [%[r], #24]\n\t" - "str r14, [%[r], #28]\n\t" - "ldr r3, [%[r], #0]\n\t" - "ldr r4, [%[r], #4]\n\t" - "ldr r5, [%[r], #8]\n\t" - "ldr r6, [%[r], #12]\n\t" - "lsr r7, r3, #1\n\t" - "lsr r8, r4, #1\n\t" - "lsr r10, r5, #1\n\t" - "lsr r14, r6, #1\n\t" - "orr r7, r7, r4, lsl #31\n\t" - "orr r8, r8, r5, lsl #31\n\t" - "orr r10, r10, r6, lsl #31\n\t" - "orr r14, r14, r9, lsl #31\n\t" - "str r7, [%[r], #0]\n\t" - "str r8, [%[r], #4]\n\t" - "str r10, [%[r], #8]\n\t" - "str r14, [%[r], #12]\n\t" - : - : [r] "r" (r), [a] "r" (a), [m] "r" (m) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r10", "r14", "r9" - ); -} - -static int sp_256_num_bits_8(sp_digit* a) -{ - int r = 0; - - __asm__ __volatile__ ( - "ldr r2, [%[a], #28]\n\t" - "cmp r2, #0\n\t" - "beq 7f\n\t" - "mov r3, #256\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 9f\n\t" - "\n7:\n\t" - "ldr r2, [%[a], #24]\n\t" - "cmp r2, #0\n\t" - "beq 6f\n\t" - "mov r3, #224\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 9f\n\t" - "\n6:\n\t" - "ldr r2, [%[a], #20]\n\t" - "cmp r2, #0\n\t" - "beq 5f\n\t" - "mov r3, #192\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 9f\n\t" - "\n5:\n\t" - "ldr r2, [%[a], #16]\n\t" - "cmp r2, #0\n\t" - "beq 4f\n\t" - "mov r3, #160\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 9f\n\t" - "\n4:\n\t" - "ldr r2, [%[a], #12]\n\t" - "cmp r2, #0\n\t" - "beq 3f\n\t" - "mov r3, #128\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 9f\n\t" - "\n3:\n\t" - "ldr r2, [%[a], #8]\n\t" - "cmp r2, #0\n\t" - "beq 2f\n\t" - "mov r3, #96\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 9f\n\t" - "\n2:\n\t" - "ldr r2, [%[a], #4]\n\t" - "cmp r2, #0\n\t" - "beq 1f\n\t" - "mov r3, #64\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 9f\n\t" - "\n1:\n\t" - "ldr r2, [%[a], #0]\n\t" - "mov r3, #32\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "\n9:\n\t" - : [r] "+r" (r) - : [a] "r" (a) - : "r2", "r3" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r12, #0x0\n\t" + "LDM %[a]!, {r4}\n\t" + "ANDS r3, r4, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_div2_mod_8_even%=\n\t" +#else + "BEQ.N L_sp_256_div2_mod_8_even%=\n\t" +#endif + "LDM %[a]!, {r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "ADC r3, r12, r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_div2_mod_8_div2%=\n\t" +#else + "B.N L_sp_256_div2_mod_8_div2%=\n\t" +#endif + "\n" + "L_sp_256_div2_mod_8_even%=:\n\t" + "LDRD r4, r5, [%[a], #12]\n\t" + "LDRD r6, r7, [%[a], #20]\n\t" + "\n" + "L_sp_256_div2_mod_8_div2%=:\n\t" + "LSR r8, r4, #1\n\t" + "AND r4, r4, #0x1\n\t" + "LSR r9, r5, #1\n\t" + "LSR r10, r6, #1\n\t" + "LSR r11, r7, #1\n\t" + "ORR r8, r8, r5, lsl #31\n\t" + "ORR r9, r9, r6, lsl #31\n\t" + "ORR r10, r10, r7, lsl #31\n\t" + "ORR r11, r11, r3, lsl #31\n\t" + "MOV r3, r4\n\t" + "STRD r8, r9, [%[r], #16]\n\t" + "STRD r10, r11, [%[r], #24]\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LSR r8, r4, #1\n\t" + "LSR r9, r5, #1\n\t" + "LSR r10, r6, #1\n\t" + "LSR r11, r7, #1\n\t" + "ORR r8, r8, r5, lsl #31\n\t" + "ORR r9, r9, r6, lsl #31\n\t" + "ORR r10, r10, r7, lsl #31\n\t" + "ORR r11, r11, r3, lsl #31\n\t" + "STM %[r], {r8, r9, r10, r11}\n\t" + : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); +} - return r; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static int sp_256_num_bits_8(const sp_digit* a_p) +#else +static int sp_256_num_bits_8(const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR r1, [%[a], #28]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_num_bits_8_7%=\n\t" +#else + "BEQ.N L_sp_256_num_bits_8_7%=\n\t" +#endif + "MOV r2, #0x100\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_num_bits_8_9%=\n\t" +#else + "B.N L_sp_256_num_bits_8_9%=\n\t" +#endif + "\n" + "L_sp_256_num_bits_8_7%=:\n\t" + "LDR r1, [%[a], #24]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_num_bits_8_6%=\n\t" +#else + "BEQ.N L_sp_256_num_bits_8_6%=\n\t" +#endif + "MOV r2, #0xe0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_num_bits_8_9%=\n\t" +#else + "B.N L_sp_256_num_bits_8_9%=\n\t" +#endif + "\n" + "L_sp_256_num_bits_8_6%=:\n\t" + "LDR r1, [%[a], #20]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_num_bits_8_5%=\n\t" +#else + "BEQ.N L_sp_256_num_bits_8_5%=\n\t" +#endif + "MOV r2, #0xc0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_num_bits_8_9%=\n\t" +#else + "B.N L_sp_256_num_bits_8_9%=\n\t" +#endif + "\n" + "L_sp_256_num_bits_8_5%=:\n\t" + "LDR r1, [%[a], #16]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_num_bits_8_4%=\n\t" +#else + "BEQ.N L_sp_256_num_bits_8_4%=\n\t" +#endif + "MOV r2, #0xa0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_num_bits_8_9%=\n\t" +#else + "B.N L_sp_256_num_bits_8_9%=\n\t" +#endif + "\n" + "L_sp_256_num_bits_8_4%=:\n\t" + "LDR r1, [%[a], #12]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_num_bits_8_3%=\n\t" +#else + "BEQ.N L_sp_256_num_bits_8_3%=\n\t" +#endif + "MOV r2, #0x80\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_num_bits_8_9%=\n\t" +#else + "B.N L_sp_256_num_bits_8_9%=\n\t" +#endif + "\n" + "L_sp_256_num_bits_8_3%=:\n\t" + "LDR r1, [%[a], #8]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_num_bits_8_2%=\n\t" +#else + "BEQ.N L_sp_256_num_bits_8_2%=\n\t" +#endif + "MOV r2, #0x60\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_num_bits_8_9%=\n\t" +#else + "B.N L_sp_256_num_bits_8_9%=\n\t" +#endif + "\n" + "L_sp_256_num_bits_8_2%=:\n\t" + "LDR r1, [%[a], #4]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_256_num_bits_8_1%=\n\t" +#else + "BEQ.N L_sp_256_num_bits_8_1%=\n\t" +#endif + "MOV r2, #0x40\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_256_num_bits_8_9%=\n\t" +#else + "B.N L_sp_256_num_bits_8_9%=\n\t" +#endif + "\n" + "L_sp_256_num_bits_8_1%=:\n\t" + "LDR r1, [%[a]]\n\t" + "MOV r2, #0x20\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" + "\n" + "L_sp_256_num_bits_8_9%=:\n\t" + "MOV %[a], r4\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "cc" + ); + return (uint32_t)(size_t)a; } /* Non-constant time modular inversion. @@ -24160,7 +40444,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_256_cmp_8(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_256_cmp_8(u, v) >= 0))) { sp_256_sub_8(u, u, v); o = sp_256_sub_8(b, b, d); if (o != 0) @@ -24237,7 +40521,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -24561,7 +40845,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -24589,19 +40873,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 8; + /* y^2 - x^3 - a.x = b */ sp_256_sqr_8(t1, point->y); (void)sp_256_mod_8(t1, t1, p256_mod); sp_256_sqr_8(t2, point->x); (void)sp_256_mod_8(t2, t2, p256_mod); sp_256_mul_8(t2, t2, point->x); (void)sp_256_mod_8(t2, t2, p256_mod); - (void)sp_256_sub_8(t2, p256_mod, t2); - sp_256_mont_add_8(t1, t1, t2, p256_mod); + sp_256_mont_sub_8(t1, t1, t2, p256_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_256_mont_add_8(t1, t1, point->x, p256_mod); sp_256_mont_add_8(t1, t1, point->x, p256_mod); sp_256_mont_add_8(t1, t1, point->x, p256_mod); + if (sp_256_cmp_8(t1, p256_b) != 0) { err = MP_VAL; } @@ -24615,7 +40901,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -25200,401 +41486,2029 @@ }; #endif +#ifdef WOLFSSL_SP_SMALL /* Multiply a and b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_384_mul_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_384_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[12 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #48\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #44\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #88\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x60\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_384_mul_12_outer%=:\n\t" + "SUBS r3, r5, #0x2c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_384_mul_12_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_384_mul_12_inner_done%=\n\t" +#else + "BGT.N L_sp_384_mul_12_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_384_mul_12_inner%=\n\t" +#else + "BLT.N L_sp_384_mul_12_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_384_mul_12_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x54\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_384_mul_12_outer%=\n\t" +#else + "BLE.N L_sp_384_mul_12_outer%=\n\t" +#endif + "LDR lr, [%[a], #44]\n\t" + "LDR r11, [%[b], #44]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_384_mul_12_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_384_mul_12_store%=\n\t" +#else + "BGT.N L_sp_384_mul_12_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } -/* Square a and put result in r. (r = a * a) +#else +/* Multiply a and b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. + * b A single precision integer. */ -SP_NOINLINE static void sp_384_sqr_12(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_mul_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_384_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #96\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #44\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #48\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #88\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #92\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #96\n\t" - "add sp, sp, r6\n\t" + "SUB sp, sp, #0x30\n\t" + /* A[0] * B[0] */ + "LDR r11, [%[a]]\n\t" + "LDR r12, [%[b]]\n\t" + "UMULL r3, r4, r11, r12\n\t" + "MOV r5, #0x0\n\t" + "STR r3, [sp]\n\t" + /* A[0] * B[1] */ + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[0] */ + "LDR r8, [%[a], #4]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + /* A[2] * B[0] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[1] */ + "LDR r11, [%[a], #4]\n\t" + "LDR r12, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[2] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #8]\n\t" + /* A[0] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[2] */ + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[1] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[0] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #12]\n\t" + /* A[4] * B[0] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[1] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[2] */ + "LDR r11, [%[a], #8]\n\t" + "LDR r12, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[3] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[4] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #16]\n\t" + /* A[0] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[4] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[2] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[1] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[0] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #20]\n\t" + /* A[6] * B[0] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[1] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[2] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[3] */ + "LDR r11, [%[a], #12]\n\t" + "LDR r12, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[4] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[5] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[0] * B[6] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #24]\n\t" + /* A[0] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[6] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[5] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[4] */ + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[3] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[2] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[1] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[0] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* A[8] * B[0] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[1] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[2] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[3] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[4] */ + "LDR r11, [%[a], #16]\n\t" + "LDR r12, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[5] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[6] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[7] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[8] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #32]\n\t" + /* A[0] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[8] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[7] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[6] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[4] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[3] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[2] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[1] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[0] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #36]\n\t" + /* A[10] * B[0] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[1] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[2] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[3] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[4] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[5] */ + "LDR r11, [%[a], #20]\n\t" + "LDR r12, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[6] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[7] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[8] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[9] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[10] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #40]\n\t" + /* A[0] * B[11] */ + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[10] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[9] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[8] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[7] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[6] */ + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[5] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[4] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[3] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[2] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[1] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[0] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #44]\n\t" + /* A[11] * B[1] */ + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[2] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[3] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[4] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[5] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[6] */ + "LDR r11, [%[a], #24]\n\t" + "LDR r12, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[7] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[8] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[9] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[10] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[11] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #48]\n\t" + /* A[2] * B[11] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[10] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[9] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[8] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[6] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[5] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[4] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[3] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[2] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #52]\n\t" + /* A[11] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[4] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[5] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[6] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[7] */ + "LDR r11, [%[a], #28]\n\t" + "LDR r12, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[8] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[9] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[10] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[11] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #56]\n\t" + /* A[4] * B[11] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[10] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[9] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[8] */ + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[7] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[6] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[5] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[4] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #60]\n\t" + /* A[11] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[6] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[7] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[8] */ + "LDR r11, [%[a], #32]\n\t" + "LDR r12, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[9] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[10] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[11] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #64]\n\t" + /* A[6] * B[11] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[10] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[8] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[7] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[6] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #68]\n\t" + /* A[11] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[8] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[9] */ + "LDR r11, [%[a], #36]\n\t" + "LDR r12, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[10] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[11] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #72]\n\t" + /* A[8] * B[11] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[10] */ + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[9] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[8] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #76]\n\t" + /* A[11] * B[9] */ + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[10] */ + "LDR r11, [%[a], #40]\n\t" + "LDR r12, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[11] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #80]\n\t" + /* A[10] * B[11] */ + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[10] */ + "LDR r8, [%[a], #44]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #84]\n\t" + /* A[11] * B[11] */ + "UMLAL r4, r5, r8, r9\n\t" + "STR r4, [%[r], #88]\n\t" + "STR r5, [%[r], #92]\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL -/* Add b to a into r. (r = a + b) +/* Square a and put result in r. (r = a * a) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_384_sqr_12(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #48\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x60\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_384_sqr_12_outer%=:\n\t" + "SUBS r3, r5, #0x2c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_384_sqr_12_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_384_sqr_12_inner_done%=\n\t" +#else + "BGT.N L_sp_384_sqr_12_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_384_sqr_12_inner%=\n\t" +#else + "BLT.N L_sp_384_sqr_12_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_384_sqr_12_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x54\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_384_sqr_12_outer%=\n\t" +#else + "BLE.N L_sp_384_sqr_12_outer%=\n\t" +#endif + "LDR lr, [%[a], #44]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_384_sqr_12_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_384_sqr_12_store%=\n\t" +#else + "BGT.N L_sp_384_sqr_12_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - return c; } #else -/* Add b to a into r. (r = a + b) +/* Square a and put result in r. (r = a * a) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_sqr_12(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_384_sqr_12(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + "SUB sp, sp, #0x30\n\t" + /* A[0] * A[0] */ + "LDR r10, [%[a]]\n\t" + "UMULL r8, r3, r10, r10\n\t" + "MOV r4, #0x0\n\t" + "STR r8, [sp]\n\t" + /* A[0] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #4]\n\t" + /* A[0] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #8]\n\t" + /* A[0] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [sp, #12]\n\t" + /* A[0] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[1] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[2] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #16]\n\t" + /* A[0] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #20]\n\t" + /* A[0] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #24]\n\t" + /* A[0] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #28]\n\t" + /* A[0] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #32]\n\t" + /* A[0] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #36]\n\t" + /* A[0] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #40]\n\t" + /* A[0] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #44]\n\t" + /* A[1] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[2] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #48]\n\t" + /* A[2] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[3] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #52]\n\t" + /* A[3] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[4] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #56]\n\t" + /* A[4] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[5] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #60]\n\t" + /* A[5] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[6] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #64]\n\t" + /* A[6] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[7] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #68]\n\t" + /* A[7] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [%[r], #72]\n\t" + /* A[8] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[9] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [%[r], #76]\n\t" + /* A[9] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #80]\n\t" + /* A[10] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [%[r], #84]\n\t" + /* A[11] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "UMLAL r3, r4, r10, r10\n\t" + "STR r3, [%[r], #88]\n\t" + "STR r4, [%[r], #92]\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); - - return c; } #endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) +/* Add b to a into r. (r = a + b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "add r6, r6, #48\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x30\n\t" + "\n" + "L_sp_384_add_12_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_384_add_12_word%=\n\t" +#else + "BNE.N L_sp_384_add_12_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #else -/* Sub b from a into r. (r = a - b) +/* Add b to a into r. (r = a + b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_384_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -25710,14 +43624,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -25895,6 +43809,7 @@ return err; } +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -25903,143 +43818,385 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_384_cond_sub_12(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_cond_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_384_cond_sub_12(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #48\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_384_cond_sub_12_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x30\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_384_cond_sub_12_words%=\n\t" +#else + "BLT.N L_sp_384_cond_sub_12_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_cond_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_384_cond_sub_12(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ #define sp_384_mont_reduce_order_12 sp_384_mont_reduce_12 +#ifdef WOLFSSL_SP_NO_UMAAL /* Reduce the number back to 384 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #48\n\t" - "\n1:\n\t" + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_384_mont_reduce_12_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #40\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" - /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" -#else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" /* a[i+10] += m[10] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" /* a[i+11] += m[11] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[11] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[11] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #40\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "LDR r12, [%[a], #48]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x30\n\t" +#ifdef __GNUC__ + "BLT L_sp_384_mont_reduce_12_word%=\n\t" +#else + "BLT.W L_sp_384_mont_reduce_12_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp); +} + +#else +/* Reduce the number back to 384 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_384_mont_reduce_12(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ - sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - ca); + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_384_mont_reduce_12_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #48]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #44]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #48]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x30\n\t" +#ifdef __GNUC__ + "BLT L_sp_384_mont_reduce_12_word%=\n\t" +#else + "BLT.W L_sp_384_mont_reduce_12_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_384_cond_sub_12(a - 12, a, m, (sp_digit)0 - mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -26047,7 +44204,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_12(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -26061,7 +44218,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_12(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -26077,10 +44234,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_12(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_12(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_12(r, a, m, mp); for (; n > 1; n--) { @@ -26189,44 +44346,181 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_384_cmp_12(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_384_cmp_12(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_384_cmp_12(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #44\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0x2c\n\t" + "\n" + "L_sp_384_cmp_12_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_384_cmp_12_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Normalize the values in each word to 32. @@ -26282,9 +44576,19 @@ * b Second number to add in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_384_mont_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_384_mont_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_384_mont_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register const sp_digit* m __asm__ ("r3") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + sp_digit o; o = sp_384_add_12(r, a, b); @@ -26297,8 +44601,18 @@ * a Number to double in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_384_mont_dbl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_384_mont_dbl_12(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + sp_digit o; o = sp_384_add_12(r, a, a); @@ -26311,8 +44625,18 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_384_mont_tpl_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_384_mont_tpl_12(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + sp_digit o; o = sp_384_add_12(r, a, a); @@ -26321,6 +44645,104 @@ sp_384_cond_sub_12(r, r, m, 0 - o); } +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r11, #0x0\n\t" + "ADD r12, %[a], #0x30\n\t" + "\n" + "L_sp_384_sub_12_word%=:\n\t" + "RSBS r11, r11, #0x0\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC r11, r3, r3\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_384_sub_12_word%=\n\t" +#else + "BNE.N L_sp_384_sub_12_word%=\n\t" +#endif + "MOV %[r], r11\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_384_sub_12(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -26329,39 +44751,122 @@ * b A single precision number to add. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_384_cond_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b, - sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_cond_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_384_cond_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #48\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "adds r5, %[c], #-1\n\t" - "ldr r5, [%[a], r8]\n\t" - "adcs r5, r5, r6\n\t" - "mov %[c], #0\n\t" - "adcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_384_cond_add_12_words%=:\n\t" + "ADDS r5, r5, #0xffffffff\n\t" + "LDR r6, [%[a], r4]\n\t" + "LDR r7, [%[b], r4]\n\t" + "AND r7, r7, %[m]\n\t" + "ADCS r6, r6, r7\n\t" + "ADC r5, r8, r8\n\t" + "STR r6, [%[r], r4]\n\t" + "ADD r4, r4, #0x4\n\t" + "CMP r4, #0x30\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_384_cond_add_12_words%=\n\t" +#else + "BLT.N L_sp_384_cond_add_12_words%=\n\t" +#endif + "MOV %[r], r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally add a and b using the mask m. + * m is -1 to add and 0 when not. + * + * r A single precision number representing conditional add result. + * a A single precision number to add with. + * b A single precision number to add. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_cond_add_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_384_cond_add_12(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADDS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "ADC %[r], r10, r10\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ /* Subtract two Montgomery form numbers (r = a - b % m). * * r Result of subtration. @@ -26369,69 +44874,89 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_384_mont_sub_12(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_384_mont_sub_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_384_mont_sub_12(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register const sp_digit* m __asm__ ("r3") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + sp_digit o; o = sp_384_sub_12(r, a, b); sp_384_cond_add_12(r, r, m, o); } -#define sp_384_mont_sub_lower_12 sp_384_mont_sub_12 +#ifdef WOLFSSL_SP_SMALL +#else +#endif /* WOLFSSL_SP_SMALL */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_rshift1_12(sp_digit* r_p, const sp_digit* a_p) +#else static void sp_384_rshift1_12(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "ldr r2, [%[a]]\n\t" - "ldr r3, [%[a], #4]\n\t" - "lsr r2, r2, #1\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r2, [%[r], #0]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r3, [%[r], #4]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r4, [%[r], #8]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r2, [%[r], #12]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r3, [%[r], #16]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r4, [%[r], #20]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r2, [%[r], #24]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r3, [%[r], #28]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r4, [%[r], #32]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r2, [%[r], #36]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "str r3, [%[r], #40]\n\t" - "str r4, [%[r], #44]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3}\n\t" + "LSR r2, r2, #1\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #8]\n\t" + "STR r2, [%[r]]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #12]\n\t" + "STR r3, [%[r], #4]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #16]\n\t" + "STR r4, [%[r], #8]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #20]\n\t" + "STR r2, [%[r], #12]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #24]\n\t" + "STR r3, [%[r], #16]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #28]\n\t" + "STR r4, [%[r], #20]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #32]\n\t" + "STR r2, [%[r], #24]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #36]\n\t" + "STR r3, [%[r], #28]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #40]\n\t" + "STR r4, [%[r], #32]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #44]\n\t" + "STR r2, [%[r], #36]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "STR r3, [%[r], #40]\n\t" + "STR r4, [%[r], #44]\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4" + : "memory", "r2", "r3", "r4", "cc" ); } @@ -26441,7 +44966,7 @@ * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_384_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_384_mont_div2_12(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o; @@ -26494,7 +45019,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_12(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_12(t2, t2, p384_mod); + sp_384_mont_div2_12(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_12(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -26504,7 +45029,7 @@ /* X = X - Y */ sp_384_mont_sub_12(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_12(y, y, x, p384_mod); + sp_384_mont_sub_12(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_12(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -26527,7 +45052,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_12_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_12_ctx* ctx = (sp_384_proj_point_dbl_12_ctx*)sp_ctx->data; @@ -26601,7 +45127,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_12(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_12(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -26626,7 +45152,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -26689,12 +45215,12 @@ static void sp_384_proj_point_add_12(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*12; - sp_digit* t3 = t + 4*12; - sp_digit* t4 = t + 6*12; - sp_digit* t5 = t + 8*12; - sp_digit* t6 = t + 10*12; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*12; + sp_digit* t2 = t + 4*12; + sp_digit* t3 = t + 6*12; + sp_digit* t4 = t + 8*12; + sp_digit* t5 = t + 10*12; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_12(t1, q->z, p384_mod, p384_mp_mod); @@ -26716,17 +45242,9 @@ sp_384_proj_point_dbl_12(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_12(t2, t2, t1, p384_mod); @@ -26745,20 +45263,31 @@ sp_384_mont_dbl_12(t3, y, p384_mod); sp_384_mont_sub_12(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_12(y, y, x, p384_mod); + sp_384_mont_sub_12(y, y, x, p384_mod); sp_384_mont_mul_12(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_12(y, y, t5, p384_mod); - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -26804,12 +45333,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*12; - ctx->t3 = t + 4*12; - ctx->t4 = t + 6*12; - ctx->t5 = t + 8*12; - ctx->t6 = t + 10*12; + ctx->t6 = t; + ctx->t1 = t + 2*12; + ctx->t2 = t + 4*12; + ctx->t3 = t + 6*12; + ctx->t4 = t + 8*12; + ctx->t5 = t + 10*12; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -26916,7 +45445,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_12(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_12(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -26929,22 +45458,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -26964,7 +45499,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_point_16_12(sp_point_384* r, const sp_point_384* table, @@ -27240,8 +45775,6 @@ } #ifdef FP_ECC -#define sp_384_mont_dbl_lower_12 sp_384_mont_dbl_12 -#define sp_384_mont_tpl_lower_12 sp_384_mont_tpl_12 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -27280,7 +45813,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_12(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_12(a, t1, p384_mod); + sp_384_mont_tpl_12(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod); @@ -27289,8 +45822,8 @@ sp_384_mont_dbl_12(t2, b, p384_mod); sp_384_mont_sub_12(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_12(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_12(b, t2, p384_mod); + sp_384_mont_sub_12(t2, b, x, p384_mod); + sp_384_mont_dbl_12(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -27310,7 +45843,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_12(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_12(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_12(a, t1, p384_mod); + sp_384_mont_tpl_12(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_12(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_12(b, t1, x, p384_mod, p384_mp_mod); @@ -27319,8 +45852,8 @@ sp_384_mont_dbl_12(t2, b, p384_mod); sp_384_mont_sub_12(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_12(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_12(b, t2, p384_mod); + sp_384_mont_sub_12(t2, b, x, p384_mod); + sp_384_mont_dbl_12(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_12(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -27330,7 +45863,7 @@ sp_384_mont_sub_12(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_12(y, y, p384_mod); + sp_384_mont_div2_12(y, y, p384_mod); } /* Convert the projective point to affine. @@ -27376,12 +45909,12 @@ static void sp_384_proj_point_add_qz1_12(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*12; - sp_digit* t3 = t + 4*12; - sp_digit* t4 = t + 6*12; - sp_digit* t5 = t + 8*12; - sp_digit* t6 = t + 10*12; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*12; + sp_digit* t6 = t + 4*12; + sp_digit* t1 = t + 6*12; + sp_digit* t4 = t + 8*12; + sp_digit* t5 = t + 10*12; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -27397,13 +45930,9 @@ sp_384_proj_point_dbl_12(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_12(t2, t2, p->x, p384_mod); @@ -27412,33 +45941,40 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_12(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_12(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_12(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_12(x, t1, t5, p384_mod); - sp_384_mont_dbl_12(t1, t3, p384_mod); - sp_384_mont_sub_12(x, x, t1, p384_mod); + sp_384_mont_sqr_12(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_12(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_12(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_12(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_12(t2, t2, t1, p384_mod); + sp_384_mont_dbl_12(t5, t3, p384_mod); + sp_384_mont_sub_12(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_12(t3, t3, x, p384_mod); + sp_384_mont_sub_12(t3, t3, x, p384_mod); sp_384_mont_mul_12(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_12(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_12(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 12; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 12; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_12(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_12(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 12; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 12; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -27539,7 +46075,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_16_12(sp_point_384* r, @@ -27744,13 +46280,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -27821,8 +46359,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap); @@ -27843,10 +46381,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -27975,7 +46515,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_384_get_entry_256_12(sp_point_384* r, @@ -28180,13 +46720,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -28257,8 +46799,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_12(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_fast_12(r, g, k, map, ct, heap); @@ -28279,10 +46821,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -28375,7 +46919,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -28386,7 +46930,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_384* point = NULL; + sp_point_384* point = NULL; sp_digit* k = NULL; #else sp_point_384 point[2]; @@ -29924,7 +48468,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -29946,7 +48490,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -30005,50 +48549,38 @@ * * a A single precision integer. */ -SP_NOINLINE static void sp_384_add_one_12(sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_add_one_12(sp_digit* a_p) +#else +static void sp_384_add_one_12(sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r2, #1\n\t" - "ldr r1, [%[a], #0]\n\t" - "adds r1, r1, r2\n\t" - "mov r2, #0\n\t" - "str r1, [%[a], #0]\n\t" - "ldr r1, [%[a], #4]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #4]\n\t" - "ldr r1, [%[a], #8]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #8]\n\t" - "ldr r1, [%[a], #12]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #12]\n\t" - "ldr r1, [%[a], #16]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #16]\n\t" - "ldr r1, [%[a], #20]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #20]\n\t" - "ldr r1, [%[a], #24]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #24]\n\t" - "ldr r1, [%[a], #28]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #28]\n\t" - "ldr r1, [%[a], #32]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #32]\n\t" - "ldr r1, [%[a], #36]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #36]\n\t" - "ldr r1, [%[a], #40]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #40]\n\t" - "ldr r1, [%[a], #44]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #44]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADDS r1, r1, #0x1\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + : [a] "+r" (a) : - : [a] "r" (a) - : "memory", "r1", "r2" + : "memory", "r1", "r2", "r3", "r4", "cc" ); } @@ -30143,7 +48675,7 @@ sp_point_384* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -30151,7 +48683,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -30427,136 +48959,234 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_384_sub_in_place_12(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #48\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x30\n\t" + "\n" + "L_sp_384_sub_in_pkace_12_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_384_sub_in_pkace_12_word%=\n\t" +#else + "BNE.N L_sp_384_sub_in_pkace_12_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #else -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) + * + * a A single precision integer and result. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_384_sub_in_place_12(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_384_sub_in_place_12(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)a; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL +/* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. + * b A single precision digit. */ -SP_NOINLINE static sp_digit sp_384_sub_in_place_12(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_384_mul_d_12(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) + /* A[0] * B */ + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_384_mul_d_12_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x30\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_384_mul_d_12_word%=\n\t" +#else + "BLT.N L_sp_384_mul_d_12_word%=\n\t" +#endif + "STR r3, [%[r], #48]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; } -#endif /* WOLFSSL_SP_SMALL */ +#else /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_384_mul_d_12(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_mul_d_12(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_384_mul_d_12(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #48\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "STR r3, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -30566,49 +49196,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_384_word_12(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_384_word_12_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_384_word_12_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* AND m into each word of a and store in r. * * r A single precision integer. @@ -30648,8 +49363,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_384_div_12(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[24], t2[13]; sp_digit div, r1; @@ -31231,245 +49946,328 @@ * a Number to divide. * m Modulus. */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_384_div2_mod_12(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else static void sp_384_div2_mod_12(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "ldr r4, [%[a]]\n\t" - "ands r8, r4, #1\n\t" - "beq 1f\n\t" - "mov r12, #0\n\t" - "ldr r5, [%[a], #4]\n\t" - "ldr r6, [%[a], #8]\n\t" - "ldr r7, [%[a], #12]\n\t" - "ldr r8, [%[m], #0]\n\t" - "ldr r9, [%[m], #4]\n\t" - "ldr r10, [%[m], #8]\n\t" - "ldr r14, [%[m], #12]\n\t" - "adds r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #0]\n\t" - "str r5, [%[r], #4]\n\t" - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #20]\n\t" - "ldr r6, [%[a], #24]\n\t" - "ldr r7, [%[a], #28]\n\t" - "ldr r8, [%[m], #16]\n\t" - "ldr r9, [%[m], #20]\n\t" - "ldr r10, [%[m], #24]\n\t" - "ldr r14, [%[m], #28]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #16]\n\t" - "str r5, [%[r], #20]\n\t" - "str r6, [%[r], #24]\n\t" - "str r7, [%[r], #28]\n\t" - "ldr r4, [%[a], #32]\n\t" - "ldr r5, [%[a], #36]\n\t" - "ldr r6, [%[a], #40]\n\t" - "ldr r7, [%[a], #44]\n\t" - "ldr r8, [%[m], #32]\n\t" - "ldr r9, [%[m], #36]\n\t" - "ldr r10, [%[m], #40]\n\t" - "ldr r14, [%[m], #44]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #32]\n\t" - "str r5, [%[r], #36]\n\t" - "str r6, [%[r], #40]\n\t" - "str r7, [%[r], #44]\n\t" - "adc r8, r12, r12\n\t" - "b 2f\n\t" - "\n1:\n\t" - "ldr r5, [%[a], #2]\n\t" - "str r4, [%[r], #0]\n\t" - "str r5, [%[r], #2]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[a], #6]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #6]\n\t" - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[a], #10]\n\t" - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #10]\n\t" - "ldr r4, [%[a], #12]\n\t" - "ldr r5, [%[a], #14]\n\t" - "str r4, [%[r], #12]\n\t" - "str r5, [%[r], #14]\n\t" - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #18]\n\t" - "str r4, [%[r], #16]\n\t" - "str r5, [%[r], #18]\n\t" - "ldr r4, [%[a], #20]\n\t" - "ldr r5, [%[a], #22]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #22]\n\t" - "\n2:\n\t" - "ldr r3, [%[r]]\n\t" - "ldr r4, [%[r], #4]\n\t" - "lsr r3, r3, #1\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #8]\n\t" - "str r3, [%[r], #0]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r4, [%[r], #4]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r5, [%[r], #8]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #20]\n\t" - "str r3, [%[r], #12]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r4, [%[r], #16]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r5, [%[r], #20]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #32]\n\t" - "str r3, [%[r], #24]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r4, [%[r], #28]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r5, [%[r], #32]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #44]\n\t" - "str r3, [%[r], #36]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "orr r5, r5, r8, lsl #31\n\t" - "str r4, [%[r], #40]\n\t" - "str r5, [%[r], #44]\n\t" - : - : [r] "r" (r), [a] "r" (a), [m] "r" (m) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14" - ); -} - -static int sp_384_num_bits_12(sp_digit* a) -{ - int r = 0; - - __asm__ __volatile__ ( - "ldr r2, [%[a], #44]\n\t" - "cmp r2, #0\n\t" - "beq 11f\n\t" - "mov r3, #384\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n11:\n\t" - "ldr r2, [%[a], #40]\n\t" - "cmp r2, #0\n\t" - "beq 10f\n\t" - "mov r3, #352\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n10:\n\t" - "ldr r2, [%[a], #36]\n\t" - "cmp r2, #0\n\t" - "beq 9f\n\t" - "mov r3, #320\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n9:\n\t" - "ldr r2, [%[a], #32]\n\t" - "cmp r2, #0\n\t" - "beq 8f\n\t" - "mov r3, #288\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n8:\n\t" - "ldr r2, [%[a], #28]\n\t" - "cmp r2, #0\n\t" - "beq 7f\n\t" - "mov r3, #256\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n7:\n\t" - "ldr r2, [%[a], #24]\n\t" - "cmp r2, #0\n\t" - "beq 6f\n\t" - "mov r3, #224\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n6:\n\t" - "ldr r2, [%[a], #20]\n\t" - "cmp r2, #0\n\t" - "beq 5f\n\t" - "mov r3, #192\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n5:\n\t" - "ldr r2, [%[a], #16]\n\t" - "cmp r2, #0\n\t" - "beq 4f\n\t" - "mov r3, #160\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n4:\n\t" - "ldr r2, [%[a], #12]\n\t" - "cmp r2, #0\n\t" - "beq 3f\n\t" - "mov r3, #128\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n3:\n\t" - "ldr r2, [%[a], #8]\n\t" - "cmp r2, #0\n\t" - "beq 2f\n\t" - "mov r3, #96\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n2:\n\t" - "ldr r2, [%[a], #4]\n\t" - "cmp r2, #0\n\t" - "beq 1f\n\t" - "mov r3, #64\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 13f\n\t" - "\n1:\n\t" - "ldr r2, [%[a], #0]\n\t" - "mov r3, #32\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "\n13:\n\t" - : [r] "+r" (r) - : [a] "r" (a) - : "r2", "r3" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r4}\n\t" + "ANDS r3, r4, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_div2_mod_12_even%=\n\t" +#else + "BEQ.N L_sp_384_div2_mod_12_even%=\n\t" +#endif + "MOV r12, #0x0\n\t" + "LDM %[a]!, {r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "ADC r3, r12, r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_div2_mod_12_div2%=\n\t" +#else + "B.N L_sp_384_div2_mod_12_div2%=\n\t" +#endif + "\n" + "L_sp_384_div2_mod_12_even%=:\n\t" + "LDM %[a]!, {r5, r6, r7}\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "\n" + "L_sp_384_div2_mod_12_div2%=:\n\t" + "SUB %[r], %[r], #0x30\n\t" + "LDRD r8, r9, [%[r]]\n\t" + "LSR r8, r8, #1\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #8]\n\t" + "STR r8, [%[r]]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #12]\n\t" + "STR r9, [%[r], #4]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #16]\n\t" + "STR r10, [%[r], #8]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #20]\n\t" + "STR r8, [%[r], #12]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #24]\n\t" + "STR r9, [%[r], #16]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #28]\n\t" + "STR r10, [%[r], #20]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #32]\n\t" + "STR r8, [%[r], #24]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #36]\n\t" + "STR r9, [%[r], #28]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #40]\n\t" + "STR r10, [%[r], #32]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #44]\n\t" + "STR r8, [%[r], #36]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "ORR r10, r10, r3, lsl #31\n\t" + "STR r9, [%[r], #40]\n\t" + "STR r10, [%[r], #44]\n\t" + : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); +} - return r; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static int sp_384_num_bits_12(const sp_digit* a_p) +#else +static int sp_384_num_bits_12(const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR r1, [%[a], #44]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_11%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_11%=\n\t" +#endif + "MOV r2, #0x180\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_11%=:\n\t" + "LDR r1, [%[a], #40]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_10%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_10%=\n\t" +#endif + "MOV r2, #0x160\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_10%=:\n\t" + "LDR r1, [%[a], #36]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_9%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_9%=\n\t" +#endif + "MOV r2, #0x140\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_9%=:\n\t" + "LDR r1, [%[a], #32]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_8%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_8%=\n\t" +#endif + "MOV r2, #0x120\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_8%=:\n\t" + "LDR r1, [%[a], #28]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_7%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_7%=\n\t" +#endif + "MOV r2, #0x100\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_7%=:\n\t" + "LDR r1, [%[a], #24]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_6%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_6%=\n\t" +#endif + "MOV r2, #0xe0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_6%=:\n\t" + "LDR r1, [%[a], #20]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_5%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_5%=\n\t" +#endif + "MOV r2, #0xc0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_5%=:\n\t" + "LDR r1, [%[a], #16]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_4%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_4%=\n\t" +#endif + "MOV r2, #0xa0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_4%=:\n\t" + "LDR r1, [%[a], #12]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_3%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_3%=\n\t" +#endif + "MOV r2, #0x80\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_3%=:\n\t" + "LDR r1, [%[a], #8]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_2%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_2%=\n\t" +#endif + "MOV r2, #0x60\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_2%=:\n\t" + "LDR r1, [%[a], #4]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_384_num_bits_12_1%=\n\t" +#else + "BEQ.N L_sp_384_num_bits_12_1%=\n\t" +#endif + "MOV r2, #0x40\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_384_num_bits_12_13%=\n\t" +#else + "B.N L_sp_384_num_bits_12_13%=\n\t" +#endif + "\n" + "L_sp_384_num_bits_12_1%=:\n\t" + "LDR r1, [%[a]]\n\t" + "MOV r2, #0x20\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" + "\n" + "L_sp_384_num_bits_12_13%=:\n\t" + "MOV %[a], r4\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "cc" + ); + return (uint32_t)(size_t)a; } /* Non-constant time modular inversion. @@ -31515,7 +50313,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_384_cmp_12(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_384_cmp_12(u, v) >= 0))) { sp_384_sub_12(u, u, v); o = sp_384_sub_12(b, b, d); if (o != 0) @@ -31596,7 +50394,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -31920,7 +50718,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -31948,19 +50746,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 12; + /* y^2 - x^3 - a.x = b */ sp_384_sqr_12(t1, point->y); (void)sp_384_mod_12(t1, t1, p384_mod); sp_384_sqr_12(t2, point->x); (void)sp_384_mod_12(t2, t2, p384_mod); sp_384_mul_12(t2, t2, point->x); (void)sp_384_mod_12(t2, t2, p384_mod); - (void)sp_384_sub_12(t2, p384_mod, t2); - sp_384_mont_add_12(t1, t1, t2, p384_mod); + sp_384_mont_sub_12(t1, t1, t2, p384_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_384_mont_add_12(t1, t1, point->x, p384_mod); sp_384_mont_add_12(t1, t1, point->x, p384_mod); sp_384_mont_add_12(t1, t1, point->x, p384_mod); + if (sp_384_cmp_12(t1, p384_b) != 0) { err = MP_VAL; } @@ -31974,7 +50774,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -32601,429 +51401,3650 @@ }; #endif +#ifdef WOLFSSL_SP_SMALL /* Multiply a and b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_521_mul_17(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_521_mul_17(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[17 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #68\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #64\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #128\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x88\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_521_mul_17_outer%=:\n\t" + "SUBS r3, r5, #0x40\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_521_mul_17_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_521_mul_17_inner_done%=\n\t" +#else + "BGT.N L_sp_521_mul_17_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_521_mul_17_inner%=\n\t" +#else + "BLT.N L_sp_521_mul_17_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_521_mul_17_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x7c\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_521_mul_17_outer%=\n\t" +#else + "BLE.N L_sp_521_mul_17_outer%=\n\t" +#endif + "LDR lr, [%[a], #64]\n\t" + "LDR r11, [%[b], #64]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "LDM sp!, {r6, r7}\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SUB r5, r5, #0x8\n\t" + "\n" + "L_sp_521_mul_17_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_521_mul_17_store%=\n\t" +#else + "BGT.N L_sp_521_mul_17_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } -/* Square a and put result in r. (r = a * a) +#else +/* Multiply a and b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. + * b A single precision integer. */ -SP_NOINLINE static void sp_521_sqr_17(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_mul_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_521_mul_17(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #136\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #64\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #68\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #128\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #132\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #136\n\t" - "add sp, sp, r6\n\t" + "SUB sp, sp, #0x44\n\t" + /* A[0] * B[0] */ + "LDR r11, [%[a]]\n\t" + "LDR r12, [%[b]]\n\t" + "UMULL r3, r4, r11, r12\n\t" + "MOV r5, #0x0\n\t" + "STR r3, [sp]\n\t" + /* A[0] * B[1] */ + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[0] */ + "LDR r8, [%[a], #4]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + /* A[2] * B[0] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[1] */ + "LDR r11, [%[a], #4]\n\t" + "LDR r12, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[2] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #8]\n\t" + /* A[0] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[2] */ + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[1] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[0] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #12]\n\t" + /* A[4] * B[0] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[1] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[2] */ + "LDR r11, [%[a], #8]\n\t" + "LDR r12, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[3] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[4] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #16]\n\t" + /* A[0] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[4] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[2] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[1] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[0] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #20]\n\t" + /* A[6] * B[0] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[1] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[2] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[3] */ + "LDR r11, [%[a], #12]\n\t" + "LDR r12, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[4] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[5] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[0] * B[6] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #24]\n\t" + /* A[0] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[6] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[5] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[4] */ + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[3] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[2] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[1] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[0] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* A[8] * B[0] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[1] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[2] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[3] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[4] */ + "LDR r11, [%[a], #16]\n\t" + "LDR r12, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[5] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[6] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[7] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[8] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #32]\n\t" + /* A[0] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[8] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[7] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[6] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[4] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[3] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[2] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[1] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[0] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #36]\n\t" + /* A[10] * B[0] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[1] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[2] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[3] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[4] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[5] */ + "LDR r11, [%[a], #20]\n\t" + "LDR r12, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[6] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[7] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[8] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[9] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[10] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #40]\n\t" + /* A[0] * B[11] */ + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[10] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[9] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[8] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[7] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[6] */ + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[5] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[4] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[3] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[2] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[1] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[0] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #44]\n\t" + /* A[12] * B[0] */ + "LDR r8, [%[a], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[1] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[2] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[3] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[4] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[5] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[6] */ + "LDR r11, [%[a], #24]\n\t" + "LDR r12, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[7] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[8] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[9] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[10] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[11] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[0] * B[12] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #48]\n\t" + /* A[0] * B[13] */ + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[12] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[11] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[10] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[9] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[8] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[6] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[5] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[4] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[3] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[2] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[1] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[0] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #52]\n\t" + /* A[14] * B[0] */ + "LDR r8, [%[a], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[1] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[2] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[3] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[4] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[5] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[6] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[7] */ + "LDR r11, [%[a], #28]\n\t" + "LDR r12, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[8] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[9] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[10] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[11] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[12] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[13] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[14] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #56]\n\t" + /* A[0] * B[15] */ + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[14] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[13] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[12] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[11] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[10] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[9] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[8] */ + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[7] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[6] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[5] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[4] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[3] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[2] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[1] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[0] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #60]\n\t" + /* A[16] * B[0] */ + "LDR r8, [%[a], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[15] * B[1] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[2] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[3] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[4] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[5] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[6] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[7] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[8] */ + "LDR r11, [%[a], #32]\n\t" + "LDR r12, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[9] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[10] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[11] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[12] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[13] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[14] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[15] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[16] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #64]\n\t" + /* A[1] * B[16] */ + "LDR r8, [%[a], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[15] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[14] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[13] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[12] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[11] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[10] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[8] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[7] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[6] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[5] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[4] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[3] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[2] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[16] * B[1] */ + "LDR r8, [%[a], #64]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #68]\n\t" + /* A[16] * B[2] */ + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[3] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[4] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[5] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[6] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[7] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[8] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[9] */ + "LDR r11, [%[a], #36]\n\t" + "LDR r12, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[10] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[11] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[12] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[13] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[14] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[15] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[16] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #72]\n\t" + /* A[3] * B[16] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[15] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[14] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[13] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[12] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[11] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[10] */ + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[9] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[8] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[7] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[6] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[5] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[15] * B[4] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[16] * B[3] */ + "LDR r8, [%[a], #64]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #76]\n\t" + /* A[16] * B[4] */ + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[5] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[6] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[7] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[8] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[9] */ + "LDR r8, [%[a], #44]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[10] */ + "LDR r11, [%[a], #40]\n\t" + "LDR r12, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[11] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[12] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[13] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[14] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[15] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[16] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #80]\n\t" + /* A[5] * B[16] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[15] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[14] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[13] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[12] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[11] */ + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[10] */ + "LDR r8, [%[a], #44]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[9] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[8] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[7] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[6] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[16] * B[5] */ + "LDR r8, [%[a], #64]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #84]\n\t" + /* A[16] * B[6] */ + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[15] * B[7] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[8] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[9] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[10] */ + "LDR r8, [%[a], #48]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[11] */ + "LDR r11, [%[a], #44]\n\t" + "LDR r12, [%[b], #44]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[12] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[13] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[14] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[15] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[16] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #88]\n\t" + /* A[7] * B[16] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[15] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[14] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[13] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[12] */ + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[11] */ + "LDR r8, [%[a], #48]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[10] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[9] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[8] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[16] * B[7] */ + "LDR r8, [%[a], #64]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #92]\n\t" + /* A[16] * B[8] */ + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[9] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[10] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[11] */ + "LDR r8, [%[a], #52]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[12] */ + "LDR r11, [%[a], #48]\n\t" + "LDR r12, [%[b], #48]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[13] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[14] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[15] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[16] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #96]\n\t" + /* A[9] * B[16] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[15] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[14] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[13] */ + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[12] */ + "LDR r8, [%[a], #52]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[11] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[15] * B[10] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[16] * B[9] */ + "LDR r8, [%[a], #64]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #100]\n\t" + /* A[16] * B[10] */ + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[11] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[12] */ + "LDR r8, [%[a], #56]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[13] */ + "LDR r11, [%[a], #52]\n\t" + "LDR r12, [%[b], #52]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[14] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[15] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[16] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #104]\n\t" + /* A[11] * B[16] */ + "LDR r8, [%[a], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[15] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[14] */ + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[13] */ + "LDR r8, [%[a], #56]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[12] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[16] * B[11] */ + "LDR r8, [%[a], #64]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #108]\n\t" + /* A[16] * B[12] */ + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[15] * B[13] */ + "LDR r8, [%[a], #60]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[14] */ + "LDR r11, [%[a], #56]\n\t" + "LDR r12, [%[b], #56]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[15] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[16] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #112]\n\t" + /* A[13] * B[16] */ + "LDR r8, [%[a], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[15] */ + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[14] */ + "LDR r8, [%[a], #60]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[16] * B[13] */ + "LDR r8, [%[a], #64]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #116]\n\t" + /* A[16] * B[14] */ + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[15] */ + "LDR r11, [%[a], #60]\n\t" + "LDR r12, [%[b], #60]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[16] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #64]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #120]\n\t" + /* A[15] * B[16] */ + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[16] * B[15] */ + "LDR r8, [%[a], #64]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #124]\n\t" + /* A[16] * B[16] */ + "UMLAL r5, r3, r8, r9\n\t" + "STR r5, [%[r], #128]\n\t" + "STR r3, [%[r], #132]\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3}\n\t" + "STM %[r]!, {r3}\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL -/* Add b to a into r. (r = a + b) +/* Square a and put result in r. (r = a * a) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_521_sqr_17(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #68\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x88\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_521_sqr_17_outer%=:\n\t" + "SUBS r3, r5, #0x40\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_521_sqr_17_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_521_sqr_17_inner_done%=\n\t" +#else + "BGT.N L_sp_521_sqr_17_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_521_sqr_17_inner%=\n\t" +#else + "BLT.N L_sp_521_sqr_17_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_521_sqr_17_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x7c\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_521_sqr_17_outer%=\n\t" +#else + "BLE.N L_sp_521_sqr_17_outer%=\n\t" +#endif + "LDR lr, [%[a], #64]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "LDM sp!, {r6, r7}\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SUB r5, r5, #0x8\n\t" + "\n" + "L_sp_521_sqr_17_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_521_sqr_17_store%=\n\t" +#else + "BGT.N L_sp_521_sqr_17_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - return c; } #else -/* Add b to a into r. (r = a + b) +/* Square a and put result in r. (r = a * a) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_sqr_17(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_521_sqr_17(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r6, [%[b]]\n\t" - "adcs r4, r4, r6\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + "SUB sp, sp, #0x44\n\t" + /* A[0] * A[0] */ + "LDR r10, [%[a]]\n\t" + "UMULL r8, r3, r10, r10\n\t" + "MOV r4, #0x0\n\t" + "STR r8, [sp]\n\t" + /* A[0] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #4]\n\t" + /* A[0] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #8]\n\t" + /* A[0] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [sp, #12]\n\t" + /* A[0] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[1] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[2] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #16]\n\t" + /* A[0] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #20]\n\t" + /* A[0] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #24]\n\t" + /* A[0] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #28]\n\t" + /* A[0] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #32]\n\t" + /* A[0] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #36]\n\t" + /* A[0] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #40]\n\t" + /* A[0] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #44]\n\t" + /* A[0] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #48]\n\t" + /* A[0] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #52]\n\t" + /* A[0] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #56]\n\t" + /* A[0] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #60]\n\t" + /* A[0] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #64]\n\t" + /* A[1] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[2] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #68]\n\t" + /* A[2] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[3] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #72]\n\t" + /* A[3] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[4] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #76]\n\t" + /* A[4] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[5] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #80]\n\t" + /* A[5] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[6] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #84]\n\t" + /* A[6] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[7] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[11] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #88]\n\t" + /* A[7] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[8] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[11] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #92]\n\t" + /* A[8] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[9] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[11] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[12] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #96]\n\t" + /* A[9] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[10] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[11] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[12] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #100]\n\t" + /* A[10] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[11] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[12] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[13] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #104]\n\t" + /* A[11] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[12] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[13] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #52]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #108]\n\t" + /* A[12] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[13] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #52]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[14] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [%[r], #112]\n\t" + /* A[13] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #52]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #56]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #116]\n\t" + /* A[14] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #56]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [%[r], #120]\n\t" + /* A[15] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "LDR r12, [%[a], #60]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [%[r], #124]\n\t" + /* A[16] * A[16] */ + "LDR r10, [%[a], #64]\n\t" + "UMLAL r4, r2, r10, r10\n\t" + "STR r4, [%[r], #128]\n\t" + "STR r2, [%[r], #132]\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2}\n\t" + "STM %[r]!, {r2}\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); - - return c; } #endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) +/* Add b to a into r. (r = a + b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "add r6, r6, #68\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x40\n\t" + "\n" + "L_sp_521_add_17_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_521_add_17_word%=\n\t" +#else + "BNE.N L_sp_521_add_17_word%=\n\t" +#endif + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a], {r4}\n\t" + "LDM %[b], {r8}\n\t" + "ADCS r4, r4, r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r4, #0x0\n\t" + "ADC %[r], r4, #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #else -/* Sub b from a into r. (r = a - b) +/* Add b to a into r. (r = a + b) * * r A single precision integer. * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_521_add_17(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r6, [%[b]]\n\t" - "sbcs r4, r4, r6\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3}\n\t" + "LDM %[b]!, {r7}\n\t" + "ADCS r3, r3, r7\n\t" + "STM %[r]!, {r3}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } #endif /* WOLFSSL_SP_SMALL */ @@ -33055,14 +55076,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -33240,6 +55261,7 @@ return err; } +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -33248,322 +55270,765 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_521_cond_sub_17(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_cond_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_521_cond_sub_17(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #68\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_521_cond_sub_17_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x44\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_521_cond_sub_17_words%=\n\t" +#else + "BLT.N L_sp_521_cond_sub_17_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_cond_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_521_cond_sub_17(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r8, [%[b]]\n\t" + "AND r8, r8, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "STR r6, [%[r]]\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ /* Reduce the number back to 521 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_521_mont_reduce_17(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_521_mont_reduce_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_521_mont_reduce_17(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)mp; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x44\n\t" + "MOV r12, sp\n\t" + /* Shift top down by 9 bits */ + "ADD lr, %[a], #0x40\n\t" + /* 0-7 */ + "LDM lr!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "LSR r1, r1, #9\n\t" + "ORR r1, r1, r2, LSL #23\n\t" + "LSR r2, r2, #9\n\t" + "ORR r2, r2, r3, LSL #23\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r4, LSL #23\n\t" + "LSR r4, r4, #9\n\t" + "ORR r4, r4, r5, LSL #23\n\t" + "LSR r5, r5, #9\n\t" + "ORR r5, r5, r6, LSL #23\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r8, LSL #23\n\t" + "LSR r8, r8, #9\n\t" + "ORR r8, r8, r9, LSL #23\n\t" + "STM r12!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "MOV r1, r9\n\t" + /* 8-16 */ + "LDM lr!, {r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "LSR r1, r1, #9\n\t" + "ORR r1, r1, r2, LSL #23\n\t" + "LSR r2, r2, #9\n\t" + "ORR r2, r2, r3, LSL #23\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r4, LSL #23\n\t" + "LSR r4, r4, #9\n\t" + "ORR r4, r4, r5, LSL #23\n\t" + "LSR r5, r5, #9\n\t" + "ORR r5, r5, r6, LSL #23\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r8, LSL #23\n\t" + "LSR r8, r8, #9\n\t" + "ORR r8, r8, r9, LSL #23\n\t" + "LSR r9, r9, #9\n\t" + "STM r12!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + /* Add top to bottom */ + /* 0-5 */ + "LDM %[a], {r1, r2, r3, r4, r5, r6}\n\t" + "LDM sp!, {r7, r8, r9, r10, r11, r12}\n\t" + "ADDS r1, r1, r7\n\t" + "ADCS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADCS r4, r4, r10\n\t" + "ADCS r5, r5, r11\n\t" + "ADCS r6, r6, r12\n\t" + "STM %[a]!, {r1, r2, r3, r4, r5, r6}\n\t" + /* 6-11 */ + "LDM %[a], {r1, r2, r3, r4, r5, r6}\n\t" + "LDM sp!, {r7, r8, r9, r10, r11, r12}\n\t" + "ADCS r1, r1, r7\n\t" + "ADCS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADCS r4, r4, r10\n\t" + "ADCS r5, r5, r11\n\t" + "ADCS r6, r6, r12\n\t" + "STM %[a]!, {r1, r2, r3, r4, r5, r6}\n\t" + /* 12-16 */ + "LDM %[a], {r1, r2, r3, r4, r5}\n\t" + "LDM sp!, {r7, r8, r9, r10, r11}\n\t" + "MOV lr, #0x1ff\n\t" + "AND r5, r5, lr\n\t" + "ADCS r1, r1, r7\n\t" + "ADCS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADCS r4, r4, r10\n\t" + "ADCS r5, r5, r11\n\t" + "LSR r12, r5, #9\n\t" + "AND r5, r5, lr\n\t" + "STM %[a]!, {r1, r2, r3, r4, r5}\n\t" + "SUB %[a], %[a], #0x44\n\t" + /* Add overflow */ + /* 0-8 */ + "LDM %[a], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + "ADDS r1, r1, r12\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" + /* 9-16 */ + "LDM %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)mp_p; +#else + (void)mp; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +} + +#ifdef WOLFSSL_SP_NO_UMAAL +/* Reduce the number back to 521 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "sub sp, sp, #68\n\t" - "mov r12, sp\n\t" - "add r14, %[a], #64\n\t" - "ldm r14!, {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10}\n\t" - "lsr r1, r1, #9\n\t" - "orr r1, r1, r2, lsl #23\n\t" - "lsr r2, r2, #9\n\t" - "orr r2, r2, r3, lsl #23\n\t" - "lsr r3, r3, #9\n\t" - "orr r3, r3, r4, lsl #23\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r6, lsl #23\n\t" - "lsr r6, r6, #9\n\t" - "orr r6, r6, r7, lsl #23\n\t" - "lsr r7, r7, #9\n\t" - "orr r7, r7, r8, lsl #23\n\t" - "lsr r8, r8, #9\n\t" - "orr r8, r8, r9, lsl #23\n\t" - "lsr r9, r9, #9\n\t" - "orr r9, r9, r10, lsl #23\n\t" - "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" - "mov r1, r10\n\t" - "ldm r14, {r2, r3, r4, r5, r6, r7, r8}\n\t" - "lsr r1, r1, #9\n\t" - "orr r1, r1, r2, lsl #23\n\t" - "lsr r2, r2, #9\n\t" - "orr r2, r2, r3, lsl #23\n\t" - "lsr r3, r3, #9\n\t" - "orr r3, r3, r4, lsl #23\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r6, lsl #23\n\t" - "lsr r6, r6, #9\n\t" - "orr r6, r6, r7, lsl #23\n\t" - "lsr r7, r7, #9\n\t" - "orr r7, r7, r8, lsl #23\n\t" - "lsr r8, r8, #9\n\t" - "stm r12!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" - "mov r14, sp\n\t" - "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t" - "ldm r14!, {r7, r8, r9, r10, r11, r12}\n\t" - "adds r1, r1, r7\n\t" - "adcs r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adcs r5, r5, r11\n\t" - "adcs r6, r6, r12\n\t" - "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t" - "ldm %[a], {r1, r2, r3, r4, r5, r6}\n\t" - "ldm r14!, {r7, r8, r9, r10, r11, r12}\n\t" - "adcs r1, r1, r7\n\t" - "adcs r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adcs r5, r5, r11\n\t" - "adcs r6, r6, r12\n\t" - "stm %[a]!, {r1, r2, r3, r4, r5, r6}\n\t" - "ldm %[a], {r1, r2, r3, r4, r5}\n\t" - "ldm r14!, {r7, r8, r9, r10, r11}\n\t" - "mov r14, #0x1ff\n\t" - "and r5, r5, r14\n\t" - "adcs r1, r1, r7\n\t" - "adcs r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r10\n\t" - "adcs r5, r5, r11\n\t" - "lsr r12, r5, #9\n\t" - "and r5, r5, r14\n\t" - "stm %[a]!, {r1, r2, r3, r4, r5}\n\t" - "sub %[a], %[a], #68\n\t" - "mov r11, #0\n\t" - "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" - "adds r1, r1, r12\n\t" - "adcs r2, r2, r11\n\t" - "adcs r3, r3, r11\n\t" - "adcs r4, r4, r11\n\t" - "adcs r5, r5, r11\n\t" - "adcs r6, r6, r11\n\t" - "adcs r7, r7, r11\n\t" - "adcs r8, r8, r11\n\t" - "adcs r9, r9, r11\n\t" - "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8, r9}\n\t" - "ldm %[a], {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" - "adcs r1, r1, r11\n\t" - "adcs r2, r2, r11\n\t" - "adcs r3, r3, r11\n\t" - "adcs r4, r4, r11\n\t" - "adcs r5, r5, r11\n\t" - "adcs r6, r6, r11\n\t" - "adcs r7, r7, r11\n\t" - "adcs r8, r8, r11\n\t" - "stm %[a]!, {r1, r2, r3, r4, r5, r6, r7, r8}\n\t" - "add sp, sp, #68\n\t" - "sub %[a], %[a], #68\n\t" - : [a] "+r" (a) + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL r10, %[mp], r4\n\t" + "CMP r11, #0x40\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_521_mont_reduce_order_17_nomask%=\n\t" +#else + "BNE.N L_sp_521_mont_reduce_order_17_nomask%=\n\t" +#endif + "MOV r9, #0x1ff\n\t" + "AND r10, r10, r9\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_nomask%=:\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + "STR r4, [%[a]]\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r9, [%[m], #48]\n\t" + "LDR r12, [%[a], #48]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r9, [%[m], #52]\n\t" + "LDR r12, [%[a], #52]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #52]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r9, [%[m], #56]\n\t" + "LDR r12, [%[a], #56]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #56]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r9, [%[m], #60]\n\t" + "LDR r12, [%[a], #60]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #60]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r9, [%[m], #64]\n\t" + "LDR r12, [%[a], #64]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r6, r6, r8\n\t" + "ADCS r7, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #64]\n\t" + "LDR r12, [%[a], #68]\n\t" + "ADCS r12, r12, r7\n\t" + "STR r12, [%[a], #68]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x44\n\t" +#ifdef __GNUC__ + "BLT L_sp_521_mont_reduce_order_17_word%=\n\t" +#else + "BLT.W L_sp_521_mont_reduce_order_17_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "SUB %[a], %[a], #0x4\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #4]\n\t" + "LDR r6, [%[a], #8]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #8]\n\t" + "LDR r7, [%[a], #12]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #12]\n\t" + "LDR r6, [%[a], #16]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #16]\n\t" + "LDR r7, [%[a], #20]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #20]\n\t" + "LDR r6, [%[a], #24]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #24]\n\t" + "LDR r7, [%[a], #28]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #28]\n\t" + "LDR r6, [%[a], #32]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #32]\n\t" + "LDR r7, [%[a], #36]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #36]\n\t" + "LDR r6, [%[a], #40]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #40]\n\t" + "LDR r7, [%[a], #44]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #44]\n\t" + "LDR r6, [%[a], #48]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #48]\n\t" + "LDR r7, [%[a], #52]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #52]\n\t" + "LDR r6, [%[a], #56]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #56]\n\t" + "LDR r7, [%[a], #60]\n\t" + "LSR r6, r6, #9\n\t" + "ORR r6, r6, r7, LSL #23\n\t" + "STR r6, [%[a], #60]\n\t" + "LDR r6, [%[a], #64]\n\t" + "LSR r7, r7, #9\n\t" + "ORR r7, r7, r6, LSL #23\n\t" + "STR r7, [%[a], #64]\n\t" + "LSR r6, r6, #9\n\t" + "STR r6, [%[a], #68]\n\t" + "LSR r3, r6, #9\n\t" + "ADD %[a], %[a], #0x4\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) : - : "memory", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); - + sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp); } +#else /* Reduce the number back to 521 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_521_mont_reduce_order_17(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #68\n\t" - "\n1:\n\t" + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "sub r14, r11, #4\n\t" - "cmp r10, r14\n\t" - "bne L_521_mont_reduce_17_nomask\n\t" - "mov r8, #0x1ff\n\t" - "and %[mp], %[mp], r8\n\t" - "L_521_mont_reduce_17_nomask:\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #64\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" - /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" + "MUL lr, %[mp], r6\n\t" + "CMP r4, #0x40\n\t" #if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" + "BNE L_sp_521_mont_reduce_order_17_nomask%=\n\t" #else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ + "BNE.N L_sp_521_mont_reduce_order_17_nomask%=\n\t" +#endif + "MOV r12, #0x1ff\n\t" + "AND lr, lr, r12\n\t" + "\n" + "L_sp_521_mont_reduce_order_17_nomask%=:\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + "STR r6, [%[a]]\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r12, [%[m], #48]\n\t" + "LDR r11, [%[a], #48]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r12, [%[m], #52]\n\t" + "LDR r11, [%[a], #52]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r12, [%[m], #56]\n\t" + "LDR r11, [%[a], #56]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r12, [%[m], #60]\n\t" + "LDR r11, [%[a], #60]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #60]\n\t" /* a[i+16] += m[16] * mu */ - "mov r5, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[16] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[16] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r4\n\t" - "adcs r8, r8, r5\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - "mov r4, #0\n\t" - /* Next word in a */ - "sub r10, r10, #60\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "sub r10, r10, #4\n\t" - "ldr r4, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "ldr r5, [r10]\n\t" - "lsr r4, r4, #9\n\t" - "orr r4, r4, r5, lsl #23\n\t" - "str r4, [r10], #4\n\t" - "ldr r4, [r10]\n\t" - "lsr r5, r5, #9\n\t" - "orr r5, r5, r4, lsl #23\n\t" - "str r5, [r10], #4\n\t" - "lsr r4, r4, #9\n\t" - "str r4, [r10]\n\t" - "lsr %[ca], r4, #9\n\t" - "sub %[a], r10, #64\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r12, [%[m], #64]\n\t" + "LDR r11, [%[a], #64]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #68]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #64]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #68]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x44\n\t" +#ifdef __GNUC__ + "BLT L_sp_521_mont_reduce_order_17_word%=\n\t" +#else + "BLT.W L_sp_521_mont_reduce_order_17_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "SUB %[a], %[a], #0x4\n\t" + "LDR r12, [%[a]]\n\t" + "LDR r3, [%[a], #4]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #4]\n\t" + "LDR r12, [%[a], #8]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #8]\n\t" + "LDR r3, [%[a], #12]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #12]\n\t" + "LDR r12, [%[a], #16]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #16]\n\t" + "LDR r3, [%[a], #20]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #20]\n\t" + "LDR r12, [%[a], #24]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #24]\n\t" + "LDR r3, [%[a], #28]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #28]\n\t" + "LDR r12, [%[a], #32]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #32]\n\t" + "LDR r3, [%[a], #36]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #36]\n\t" + "LDR r12, [%[a], #40]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #40]\n\t" + "LDR r3, [%[a], #44]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #44]\n\t" + "LDR r12, [%[a], #48]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #48]\n\t" + "LDR r3, [%[a], #52]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #52]\n\t" + "LDR r12, [%[a], #56]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #56]\n\t" + "LDR r3, [%[a], #60]\n\t" + "LSR r12, r12, #9\n\t" + "ORR r12, r12, r3, LSL #23\n\t" + "STR r12, [%[a], #60]\n\t" + "LDR r12, [%[a], #64]\n\t" + "LSR r3, r3, #9\n\t" + "ORR r3, r3, r12, LSL #23\n\t" + "STR r3, [%[a], #64]\n\t" + "LSR r12, r12, #9\n\t" + "STR r12, [%[a], #68]\n\t" + "LSR r5, r12, #9\n\t" + "ADD %[a], %[a], #0x4\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); - - sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - ca); + sp_521_cond_sub_17(a - 17, a, m, (sp_digit)0 - mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -33571,7 +56036,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_mul_17(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -33585,7 +56050,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_521_mont_sqr_17(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -33601,10 +56066,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_17(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_17(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_17(r, a, m, mp); for (; n > 1; n--) { @@ -33710,44 +56175,236 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_521_cmp_17(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_521_cmp_17(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_521_cmp_17(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #64\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0x40\n\t" + "\n" + "L_sp_521_cmp_17_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_521_cmp_17_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #64]\n\t" + "LDR r5, [%[b], #64]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "LDR r5, [%[b], #60]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #56]\n\t" + "LDR r5, [%[b], #56]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #52]\n\t" + "LDR r5, [%[b], #52]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #48]\n\t" + "LDR r5, [%[b], #48]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Normalize the values in each word to 32. @@ -33803,82 +56460,88 @@ * b Second number to add in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_521_mont_add_17(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_521_mont_add_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_521_mont_add_17(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adds r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4}\n\t" - "ldm %[b]!, {r8}\n\t" - "adcs r4, r4, r8\n\t" - "mov r14, #0x1ff\n\t" - "lsr r12, r4, #9\n\t" - "and r4, r4, r14\n\t" - "stm %[r]!, {r4}\n\t" - "sub %[r], %[r], #68\n\t" - "mov r14, #0\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adds r4, r4, r12\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r14\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r14\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r14\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4}\n\t" - "adcs r4, r4, r14\n\t" - "stm %[r]!, {r4}\n\t" - "sub %[r], %[r], #68\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "ADDS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8}\n\t" + "LDM %[b]!, {r4}\n\t" + "ADCS r8, r8, r4\n\t" + "MOV r12, #0x1ff\n\t" + "LSR r3, r8, #9\n\t" + "AND r8, r8, r12\n\t" + "STM %[r]!, {r8}\n\t" + "SUB %[r], %[r], #0x44\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r3\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4}\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } /* Double a Montgomery form number (r = a + a % m). @@ -33887,79 +56550,78 @@ * a Number to double in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_521_mont_dbl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_521_mont_dbl_17(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "mov r8, #0\n\t" - "ldm %[a]!, {r2, r3, r4, r5, r6, r7}\n\t" - "adds r2, r2, r2\n\t" - "adcs r3, r3, r3\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "str r2, [%[r], #0]\n\t" - "str r3, [%[r], #4]\n\t" - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #12]\n\t" - "str r6, [%[r], #16]\n\t" - "stm %[r]!, {r2, r3, r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r2, r3, r4, r5, r6, r7}\n\t" - "adcs r2, r2, r2\n\t" - "adcs r3, r3, r3\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "str r2, [%[r], #0]\n\t" - "str r3, [%[r], #4]\n\t" - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #12]\n\t" - "str r6, [%[r], #16]\n\t" - "stm %[r]!, {r2, r3, r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r2, r3, r4, r5, r6}\n\t" - "adcs r2, r2, r2\n\t" - "adcs r3, r3, r3\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "mov r9, #0x1ff\n\t" - "lsr r8, r6, #9\n\t" - "and r6, r6, r9\n\t" - "stm %[r]!, {r2, r3, r4, r5, r6}\n\t" - "sub %[r], %[r], #68\n\t" - "mov r9, #0\n\t" - "ldm %[r], {r2, r3, r4, r5, r6, r7}\n\t" - "adds r2, r2, r8\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r9\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r9\n\t" - "adcs r7, r7, r9\n\t" - "stm %[r]!, {r2, r3, r4, r5, r6, r7}\n\t" - "ldm %[r], {r2, r3, r4, r5, r6, r7}\n\t" - "adcs r2, r2, r9\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r9\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r9\n\t" - "adcs r7, r7, r9\n\t" - "stm %[r]!, {r2, r3, r4, r5, r6, r7}\n\t" - "ldm %[r], {r2, r3, r4, r5, r6}\n\t" - "adcs r2, r2, r9\n\t" - "adcs r3, r3, r9\n\t" - "adcs r4, r4, r9\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r9\n\t" - "stm %[r]!, {r2, r3, r4, r5, r6}\n\t" - "sub %[r], %[r], #68\n\t" - "sub %[a], %[a], #68\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0x0\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4}\n\t" + "ADCS r4, r4, r4\n\t" + "MOV r3, #0x1ff\n\t" + "LSR r2, r4, #9\n\t" + "AND r4, r4, r3\n\t" + "STM %[r]!, {r4}\n\t" + "SUB %[r], %[r], #0x44\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r2\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, #0x0\n\t" + "ADCS r5, r5, #0x0\n\t" + "ADCS r6, r6, #0x0\n\t" + "ADCS r7, r7, #0x0\n\t" + "ADCS r8, r8, #0x0\n\t" + "ADCS r9, r9, #0x0\n\t" + "ADCS r10, r10, #0x0\n\t" + "ADCS r11, r11, #0x0\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4}\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } /* Triple a Montgomery form number (r = a + a + a % m). @@ -33968,110 +56630,98 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_521_mont_tpl_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_521_mont_tpl_17(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4}\n\t" - "adcs r4, r4, r4\n\t" - "stm %[r]!, {r4}\n\t" - "sub %[r], %[r], #68\n\t" - "sub %[a], %[a], #68\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adds r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8}\n\t" - "ldm %[a]!, {r4}\n\t" - "adcs r8, r8, r4\n\t" - "mov r14, #0x1ff\n\t" - "lsr r12, r8, #9\n\t" - "and r8, r8, r14\n\t" - "stm %[r]!, {r8}\n\t" - "sub %[r], %[r], #68\n\t" - "mov r14, #0\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adds r4, r4, r12\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r14\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r14\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "adcs r4, r4, r14\n\t" - "adcs r5, r5, r14\n\t" - "adcs r6, r6, r14\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4}\n\t" - "adcs r4, r4, r14\n\t" - "stm %[r]!, {r4}\n\t" - "sub %[r], %[r], #68\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0x0\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4}\n\t" + "ADCS r4, r4, r4\n\t" + "STM %[r]!, {r4}\n\t" + "SUB %[r], %[r], #0x44\n\t" + "SUB %[a], %[a], #0x44\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4}\n\t" + "LDM %[a]!, {r8}\n\t" + "ADCS r4, r4, r8\n\t" + "MOV r3, #0x1ff\n\t" + "LSR r2, r4, #9\n\t" + "AND r4, r4, r3\n\t" + "STM %[r]!, {r4}\n\t" + "SUB %[r], %[r], #0x44\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r2\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4}\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r2", "r3", "cc" ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } /* Subtract two Montgomery form numbers (r = a - b % m). @@ -34081,200 +56731,172 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_521_mont_sub_17(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_521_mont_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_521_mont_sub_17(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - (void)m; - - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "subs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4}\n\t" - "ldm %[b]!, {r8}\n\t" - "sbcs r4, r4, r8\n\t" - "mov r14, #0x1ff\n\t" - "asr r12, r4, #9\n\t" - "and r4, r4, r14\n\t" - "neg r12, r12\n\t" - "stm %[r]!, {r4}\n\t" - "sub %[r], %[r], #68\n\t" - "mov r14, #0\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "subs r4, r4, r12\n\t" - "sbcs r5, r5, r14\n\t" - "sbcs r6, r6, r14\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "sbcs r4, r4, r14\n\t" - "sbcs r5, r5, r14\n\t" - "sbcs r6, r6, r14\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "sbcs r4, r4, r14\n\t" - "sbcs r5, r5, r14\n\t" - "sbcs r6, r6, r14\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "sbcs r4, r4, r14\n\t" - "sbcs r5, r5, r14\n\t" - "sbcs r6, r6, r14\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4}\n\t" - "sbcs r4, r4, r14\n\t" - "stm %[r]!, {r4}\n\t" - "sub %[r], %[r], #68\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "SUBS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "SBCS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "SBCS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8, r9, r10, r11}\n\t" + "LDM %[b]!, {r4, r5, r6, r7}\n\t" + "SBCS r8, r8, r4\n\t" + "SBCS r9, r9, r5\n\t" + "SBCS r10, r10, r6\n\t" + "SBCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r8}\n\t" + "LDM %[b]!, {r4}\n\t" + "SBCS r8, r8, r4\n\t" + "MOV r12, #0x1ff\n\t" + "ASR r3, r8, #9\n\t" + "AND r8, r8, r12\n\t" + "neg r3, r3\n\t" + "STM %[r]!, {r8}\n\t" + "SUB %[r], %[r], #0x44\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r4, r4, r3\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, #0x0\n\t" + "SBCS r11, r11, #0x0\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "SBCS r4, r4, #0x0\n\t" + "SBCS r5, r5, #0x0\n\t" + "SBCS r6, r6, #0x0\n\t" + "SBCS r7, r7, #0x0\n\t" + "SBCS r8, r8, #0x0\n\t" + "SBCS r9, r9, #0x0\n\t" + "SBCS r10, r10, #0x0\n\t" + "SBCS r11, r11, #0x0\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[r], {r4}\n\t" + "SBCS r4, r4, #0x0\n\t" + "STM %[r]!, {r4}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" - ); -} - -#define sp_521_mont_sub_lower_17 sp_521_mont_sub_17 -/* Conditionally add a and b using the mask m. - * m is -1 to add and 0 when not. - * - * r A single precision number representing conditional add result. - * a A single precision number to add with. - * b A single precision number to add. - * m Mask value to apply. - */ -SP_NOINLINE static sp_digit sp_521_cond_add_17(sp_digit* r, const sp_digit* a, const sp_digit* b, - sp_digit m) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #68\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "adds r5, %[c], #-1\n\t" - "ldr r5, [%[a], r8]\n\t" - "adcs r5, r5, r6\n\t" - "mov %[c], #0\n\t" - "adcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); - - return c; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + (void)m_p; +#else + (void)m; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ } +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_rshift1_17(sp_digit* r_p, const sp_digit* a_p) +#else static void sp_521_rshift1_17(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "ldr r2, [%[a]]\n\t" - "ldr r3, [%[a], #4]\n\t" - "lsr r2, r2, #1\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r2, [%[r], #0]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r3, [%[r], #4]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r4, [%[r], #8]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r2, [%[r], #12]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r3, [%[r], #16]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r4, [%[r], #20]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r2, [%[r], #24]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r3, [%[r], #28]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r4, [%[r], #32]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r2, [%[r], #36]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r3, [%[r], #40]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r4, [%[r], #44]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r2, [%[r], #48]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r3, [%[r], #52]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #64]\n\t" - "str r4, [%[r], #56]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "str r2, [%[r], #60]\n\t" - "str r3, [%[r], #64]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3}\n\t" + "LSR r2, r2, #1\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #8]\n\t" + "STR r2, [%[r]]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #12]\n\t" + "STR r3, [%[r], #4]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #16]\n\t" + "STR r4, [%[r], #8]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #20]\n\t" + "STR r2, [%[r], #12]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #24]\n\t" + "STR r3, [%[r], #16]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #28]\n\t" + "STR r4, [%[r], #20]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #32]\n\t" + "STR r2, [%[r], #24]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #36]\n\t" + "STR r3, [%[r], #28]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #40]\n\t" + "STR r4, [%[r], #32]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #44]\n\t" + "STR r2, [%[r], #36]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #48]\n\t" + "STR r3, [%[r], #40]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #52]\n\t" + "STR r4, [%[r], #44]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #56]\n\t" + "STR r2, [%[r], #48]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #60]\n\t" + "STR r3, [%[r], #52]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #64]\n\t" + "STR r4, [%[r], #56]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "STR r2, [%[r], #60]\n\t" + "STR r3, [%[r], #64]\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4" + : "memory", "r2", "r3", "r4", "cc" ); } @@ -34284,13 +56906,14 @@ * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_521_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_521_mont_div2_17(sp_digit* r, const sp_digit* a, const sp_digit* m) { - sp_digit o; + sp_digit o = a[0] & 1; + + (void)m; - o = sp_521_cond_add_17(r, a, m, 0 - (a[0] & 1)); sp_521_rshift1_17(r, r); - r[16] |= o << 31; + r[16] |= o << 8; } /* Double the Montgomery form projective point p. @@ -34337,7 +56960,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_17(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_17(t2, t2, p521_mod); + sp_521_mont_div2_17(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_17(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -34347,7 +56970,7 @@ /* X = X - Y */ sp_521_mont_sub_17(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_17(y, y, x, p521_mod); + sp_521_mont_sub_17(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_17(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -34370,7 +56993,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_17_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_17_ctx* ctx = (sp_521_proj_point_dbl_17_ctx*)sp_ctx->data; @@ -34444,7 +57068,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_17(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_17(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -34469,7 +57093,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -34535,12 +57159,12 @@ static void sp_521_proj_point_add_17(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*17; - sp_digit* t3 = t + 4*17; - sp_digit* t4 = t + 6*17; - sp_digit* t5 = t + 8*17; - sp_digit* t6 = t + 10*17; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*17; + sp_digit* t2 = t + 4*17; + sp_digit* t3 = t + 6*17; + sp_digit* t4 = t + 8*17; + sp_digit* t5 = t + 10*17; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_17(t1, q->z, p521_mod, p521_mp_mod); @@ -34562,17 +57186,9 @@ sp_521_proj_point_dbl_17(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_17(t2, t2, t1, p521_mod); @@ -34591,20 +57207,31 @@ sp_521_mont_dbl_17(t3, y, p521_mod); sp_521_mont_sub_17(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_17(y, y, x, p521_mod); + sp_521_mont_sub_17(y, y, x, p521_mod); sp_521_mont_mul_17(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_17(y, y, t5, p521_mod); - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -34650,12 +57277,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*17; - ctx->t3 = t + 4*17; - ctx->t4 = t + 6*17; - ctx->t5 = t + 8*17; - ctx->t6 = t + 10*17; + ctx->t6 = t; + ctx->t1 = t + 2*17; + ctx->t2 = t + 4*17; + ctx->t3 = t + 6*17; + ctx->t4 = t + 8*17; + ctx->t5 = t + 10*17; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -34762,7 +57389,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_17(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_17(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -34775,22 +57402,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -34810,7 +57443,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_point_16_17(sp_point_521* r, const sp_point_521* table, @@ -35120,8 +57753,6 @@ } #ifdef FP_ECC -#define sp_521_mont_dbl_lower_17 sp_521_mont_dbl_17 -#define sp_521_mont_tpl_lower_17 sp_521_mont_tpl_17 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -35160,7 +57791,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_17(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_17(a, t1, p521_mod); + sp_521_mont_tpl_17(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod); @@ -35169,8 +57800,8 @@ sp_521_mont_dbl_17(t2, b, p521_mod); sp_521_mont_sub_17(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_17(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_17(b, t2, p521_mod); + sp_521_mont_sub_17(t2, b, x, p521_mod); + sp_521_mont_dbl_17(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -35190,7 +57821,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_17(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_17(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_17(a, t1, p521_mod); + sp_521_mont_tpl_17(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_17(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_17(b, t1, x, p521_mod, p521_mp_mod); @@ -35199,8 +57830,8 @@ sp_521_mont_dbl_17(t2, b, p521_mod); sp_521_mont_sub_17(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_17(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_17(b, t2, p521_mod); + sp_521_mont_sub_17(t2, b, x, p521_mod); + sp_521_mont_dbl_17(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_17(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -35210,7 +57841,7 @@ sp_521_mont_sub_17(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_17(y, y, p521_mod); + sp_521_mont_div2_17(y, y, p521_mod); } /* Convert the projective point to affine. @@ -35256,12 +57887,12 @@ static void sp_521_proj_point_add_qz1_17(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*17; - sp_digit* t3 = t + 4*17; - sp_digit* t4 = t + 6*17; - sp_digit* t5 = t + 8*17; - sp_digit* t6 = t + 10*17; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*17; + sp_digit* t6 = t + 4*17; + sp_digit* t1 = t + 6*17; + sp_digit* t4 = t + 8*17; + sp_digit* t5 = t + 10*17; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -35277,13 +57908,9 @@ sp_521_proj_point_dbl_17(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_17(t2, t2, p->x, p521_mod); @@ -35292,33 +57919,40 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_17(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_17(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_17(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_17(x, t1, t5, p521_mod); - sp_521_mont_dbl_17(t1, t3, p521_mod); - sp_521_mont_sub_17(x, x, t1, p521_mod); + sp_521_mont_sqr_17(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_17(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_17(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_17(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_17(t2, t2, t1, p521_mod); + sp_521_mont_dbl_17(t5, t3, p521_mod); + sp_521_mont_sub_17(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_17(t3, t3, x, p521_mod); + sp_521_mont_sub_17(t3, t3, x, p521_mod); sp_521_mont_mul_17(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_17(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_17(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 17; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 17; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_17(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_17(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 17; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 17; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -35419,7 +58053,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_16_17(sp_point_521* r, @@ -35644,13 +58278,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -35721,8 +58357,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap); @@ -35743,10 +58379,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -35875,7 +58513,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ static void sp_521_get_entry_256_17(sp_point_521* r, @@ -36100,13 +58738,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -36177,8 +58817,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_17(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_fast_17(r, g, k, map, ct, heap); @@ -36199,10 +58839,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -36295,7 +58937,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -36306,7 +58948,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_521* point = NULL; + sp_point_521* point = NULL; sp_digit* k = NULL; #else sp_point_521 point[2]; @@ -38388,7 +61030,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -38410,7 +61052,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -38469,65 +61111,47 @@ * * a A single precision integer. */ -SP_NOINLINE static void sp_521_add_one_17(sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_add_one_17(sp_digit* a_p) +#else +static void sp_521_add_one_17(sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r2, #1\n\t" - "ldr r1, [%[a], #0]\n\t" - "adds r1, r1, r2\n\t" - "mov r2, #0\n\t" - "str r1, [%[a], #0]\n\t" - "ldr r1, [%[a], #4]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #4]\n\t" - "ldr r1, [%[a], #8]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #8]\n\t" - "ldr r1, [%[a], #12]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #12]\n\t" - "ldr r1, [%[a], #16]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #16]\n\t" - "ldr r1, [%[a], #20]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #20]\n\t" - "ldr r1, [%[a], #24]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #24]\n\t" - "ldr r1, [%[a], #28]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #28]\n\t" - "ldr r1, [%[a], #32]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #32]\n\t" - "ldr r1, [%[a], #36]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #36]\n\t" - "ldr r1, [%[a], #40]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #40]\n\t" - "ldr r1, [%[a], #44]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #44]\n\t" - "ldr r1, [%[a], #48]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #48]\n\t" - "ldr r1, [%[a], #52]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #52]\n\t" - "ldr r1, [%[a], #56]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #56]\n\t" - "ldr r1, [%[a], #60]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #60]\n\t" - "ldr r1, [%[a], #64]\n\t" - "adcs r1, r1, r2\n\t" - "str r1, [%[a], #64]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADDS r1, r1, #0x1\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + "LDM %[a], {r1, r2, r3, r4}\n\t" + "ADCS r1, r1, #0x0\n\t" + "ADCS r2, r2, #0x0\n\t" + "ADCS r3, r3, #0x0\n\t" + "ADCS r4, r4, #0x0\n\t" + "STM %[a]!, {r1, r2, r3, r4}\n\t" + "LDM %[a], {r1}\n\t" + "ADCS r1, r1, #0x0\n\t" + "STM %[a]!, {r1}\n\t" + : [a] "+r" (a) : - : [a] "r" (a) - : "memory", "r1", "r2" + : "memory", "r1", "r2", "r3", "r4", "cc" ); } @@ -38623,7 +61247,7 @@ sp_point_521* infinity = NULL; #endif int err = MP_OKAY; - + (void)heap; @@ -38631,7 +61255,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -38899,427 +61523,454 @@ #endif /* HAVE_ECC_DHE */ #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) -SP_NOINLINE static void sp_521_rshift_17(sp_digit* r, const sp_digit* a, byte n) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_rshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p) +#else +static void sp_521_rshift_17(sp_digit* r, const sp_digit* a, byte n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r6, #32\n\t" - "sub r6, r6, %[n]\n\t" - "ldrd r2, r3, [%[a]]\n\t" - "lsr r2, r2, %[n]\n\t" - "lsl r5, r3, r6\n\t" - "lsr r3, r3, %[n]\n\t" - "orr r2, r2, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r2, [%[r], #0]\n\t" - "lsl r5, r4, r6\n\t" - "lsr r4, r4, %[n]\n\t" - "orr r3, r3, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r3, [%[r], #4]\n\t" - "lsl r5, r2, r6\n\t" - "lsr r2, r2, %[n]\n\t" - "orr r4, r4, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r4, [%[r], #8]\n\t" - "lsl r5, r3, r6\n\t" - "lsr r3, r3, %[n]\n\t" - "orr r2, r2, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r2, [%[r], #12]\n\t" - "lsl r5, r4, r6\n\t" - "lsr r4, r4, %[n]\n\t" - "orr r3, r3, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r3, [%[r], #16]\n\t" - "lsl r5, r2, r6\n\t" - "lsr r2, r2, %[n]\n\t" - "orr r4, r4, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r4, [%[r], #20]\n\t" - "lsl r5, r3, r6\n\t" - "lsr r3, r3, %[n]\n\t" - "orr r2, r2, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r2, [%[r], #24]\n\t" - "lsl r5, r4, r6\n\t" - "lsr r4, r4, %[n]\n\t" - "orr r3, r3, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r3, [%[r], #28]\n\t" - "lsl r5, r2, r6\n\t" - "lsr r2, r2, %[n]\n\t" - "orr r4, r4, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r4, [%[r], #32]\n\t" - "lsl r5, r3, r6\n\t" - "lsr r3, r3, %[n]\n\t" - "orr r2, r2, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r2, [%[r], #36]\n\t" - "lsl r5, r4, r6\n\t" - "lsr r4, r4, %[n]\n\t" - "orr r3, r3, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r3, [%[r], #40]\n\t" - "lsl r5, r2, r6\n\t" - "lsr r2, r2, %[n]\n\t" - "orr r4, r4, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r4, [%[r], #44]\n\t" - "lsl r5, r3, r6\n\t" - "lsr r3, r3, %[n]\n\t" - "orr r2, r2, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r2, [%[r], #48]\n\t" - "lsl r5, r4, r6\n\t" - "lsr r4, r4, %[n]\n\t" - "orr r3, r3, r5\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r3, [%[r], #52]\n\t" - "lsl r5, r2, r6\n\t" - "lsr r2, r2, %[n]\n\t" - "orr r4, r4, r5\n\t" - "ldr r3, [%[a], #64]\n\t" - "str r4, [%[r], #56]\n\t" - "lsl r5, r3, r6\n\t" - "lsr r3, r3, %[n]\n\t" - "orr r2, r2, r5\n\t" - "strd r2, r3, [%[r], #60]\n\t" - : - : [r] "r" (r), [a] "r" (a), [n] "r" (n) - : "memory", "r2", "r3", "r4", "r5", "r6" - ); +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register byte n __asm__ ("r2") = (byte)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "RSB r7, %[n], #0x20\n\t" + "LDRD r4, r5, [%[a]]\n\t" + "LSR r4, r4, %[n]\n\t" + "LSL r3, r5, r7\n\t" + "LSR r5, r5, %[n]\n\t" + "ORR r4, r4, r3\n\t" + "LDR r6, [%[a], #8]\n\t" + "STR r4, [%[a]]\n\t" + "LSL r3, r6, r7\n\t" + "LSR r6, r6, %[n]\n\t" + "ORR r5, r5, r3\n\t" + "LDR r4, [%[a], #12]\n\t" + "STR r5, [%[a], #4]\n\t" + "LSL r3, r4, r7\n\t" + "LSR r4, r4, %[n]\n\t" + "ORR r6, r6, r3\n\t" + "LDR r5, [%[a], #16]\n\t" + "STR r6, [%[a], #8]\n\t" + "LSL r3, r5, r7\n\t" + "LSR r5, r5, %[n]\n\t" + "ORR r4, r4, r3\n\t" + "LDR r6, [%[a], #20]\n\t" + "STR r4, [%[a], #12]\n\t" + "LSL r3, r6, r7\n\t" + "LSR r6, r6, %[n]\n\t" + "ORR r5, r5, r3\n\t" + "LDR r4, [%[a], #24]\n\t" + "STR r5, [%[a], #16]\n\t" + "LSL r3, r4, r7\n\t" + "LSR r4, r4, %[n]\n\t" + "ORR r6, r6, r3\n\t" + "LDR r5, [%[a], #28]\n\t" + "STR r6, [%[a], #20]\n\t" + "LSL r3, r5, r7\n\t" + "LSR r5, r5, %[n]\n\t" + "ORR r4, r4, r3\n\t" + "LDR r6, [%[a], #32]\n\t" + "STR r4, [%[a], #24]\n\t" + "LSL r3, r6, r7\n\t" + "LSR r6, r6, %[n]\n\t" + "ORR r5, r5, r3\n\t" + "LDR r4, [%[a], #36]\n\t" + "STR r5, [%[a], #28]\n\t" + "LSL r3, r4, r7\n\t" + "LSR r4, r4, %[n]\n\t" + "ORR r6, r6, r3\n\t" + "LDR r5, [%[a], #40]\n\t" + "STR r6, [%[a], #32]\n\t" + "LSL r3, r5, r7\n\t" + "LSR r5, r5, %[n]\n\t" + "ORR r4, r4, r3\n\t" + "LDR r6, [%[a], #44]\n\t" + "STR r4, [%[a], #36]\n\t" + "LSL r3, r6, r7\n\t" + "LSR r6, r6, %[n]\n\t" + "ORR r5, r5, r3\n\t" + "LDR r4, [%[a], #48]\n\t" + "STR r5, [%[a], #40]\n\t" + "LSL r3, r4, r7\n\t" + "LSR r4, r4, %[n]\n\t" + "ORR r6, r6, r3\n\t" + "LDR r5, [%[a], #52]\n\t" + "STR r6, [%[a], #44]\n\t" + "LSL r3, r5, r7\n\t" + "LSR r5, r5, %[n]\n\t" + "ORR r4, r4, r3\n\t" + "LDR r6, [%[a], #56]\n\t" + "STR r4, [%[a], #48]\n\t" + "LSL r3, r6, r7\n\t" + "LSR r6, r6, %[n]\n\t" + "ORR r5, r5, r3\n\t" + "LDR r4, [%[a], #60]\n\t" + "STR r5, [%[a], #52]\n\t" + "LSL r3, r4, r7\n\t" + "LSR r4, r4, %[n]\n\t" + "ORR r6, r6, r3\n\t" + "LDR r5, [%[a], #64]\n\t" + "STR r6, [%[a], #56]\n\t" + "LSL r3, r5, r7\n\t" + "LSR r5, r5, %[n]\n\t" + "ORR r4, r4, r3\n\t" + "STRD r4, r5, [%[r], #60]\n\t" + : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) + : + : "memory", "r4", "r5", "r6", "r3", "r7", "cc" + ); } #endif #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) #endif #if defined(HAVE_ECC_SIGN) || defined(HAVE_ECC_VERIFY) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_lshift_17(sp_digit* r_p, const sp_digit* a_p, byte n_p) +#else static void sp_521_lshift_17(sp_digit* r, const sp_digit* a, byte n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r6, #31\n\t" - "sub r6, r6, %[n]\n\t" - "ldr r3, [%[a], #64]\n\t" - "lsr r4, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r4, r4, r6\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r4, [%[r], #68]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r3, [%[r], #64]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r2, [%[r], #60]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r4, [%[r], #56]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r3, [%[r], #52]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r2, [%[r], #48]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r4, [%[r], #44]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r3, [%[r], #40]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r2, [%[r], #36]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r4, [%[r], #32]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r3, [%[r], #28]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r2, [%[r], #24]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r4, [%[r], #20]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r3, [%[r], #16]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #4]\n\t" - "str r2, [%[r], #12]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #0]\n\t" - "str r4, [%[r], #8]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "str r2, [%[r]]\n\t" - "str r3, [%[r], #4]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register byte n __asm__ ("r2") = (byte)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "RSB r7, %[n], #0x1f\n\t" + "LDR r5, [%[a], #64]\n\t" + "LSR r6, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r6, r6, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "STR r6, [%[r], #68]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #56]\n\t" + "STR r5, [%[r], #64]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #52]\n\t" + "STR r4, [%[r], #60]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #48]\n\t" + "STR r6, [%[r], #56]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #44]\n\t" + "STR r5, [%[r], #52]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #40]\n\t" + "STR r4, [%[r], #48]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #36]\n\t" + "STR r6, [%[r], #44]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #32]\n\t" + "STR r5, [%[r], #40]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #28]\n\t" + "STR r4, [%[r], #36]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #24]\n\t" + "STR r6, [%[r], #32]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #20]\n\t" + "STR r5, [%[r], #28]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #16]\n\t" + "STR r4, [%[r], #24]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #12]\n\t" + "STR r6, [%[r], #20]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #8]\n\t" + "STR r5, [%[r], #16]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #4]\n\t" + "STR r4, [%[r], #12]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a]]\n\t" + "STR r6, [%[r], #8]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "STR r4, [%[r]]\n\t" + "STR r5, [%[r], #4]\n\t" + : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : [r] "r" (r), [a] "r" (a), [n] "r" (n) - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r3", "r7", "cc" ); } +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_lshift_34(sp_digit* r_p, const sp_digit* a_p, byte n_p) +#else static void sp_521_lshift_34(sp_digit* r, const sp_digit* a, byte n) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r6, #31\n\t" - "sub r6, r6, %[n]\n\t" - "ldr r3, [%[a], #132]\n\t" - "lsr r4, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r4, r4, r6\n\t" - "ldr r2, [%[a], #128]\n\t" - "str r4, [%[r], #136]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #124]\n\t" - "str r3, [%[r], #132]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #120]\n\t" - "str r2, [%[r], #128]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #116]\n\t" - "str r4, [%[r], #124]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #112]\n\t" - "str r3, [%[r], #120]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #108]\n\t" - "str r2, [%[r], #116]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #104]\n\t" - "str r4, [%[r], #112]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #100]\n\t" - "str r3, [%[r], #108]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #96]\n\t" - "str r2, [%[r], #104]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #92]\n\t" - "str r4, [%[r], #100]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #88]\n\t" - "str r3, [%[r], #96]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #84]\n\t" - "str r2, [%[r], #92]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #80]\n\t" - "str r4, [%[r], #88]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #76]\n\t" - "str r3, [%[r], #84]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #72]\n\t" - "str r2, [%[r], #80]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #68]\n\t" - "str r4, [%[r], #76]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #64]\n\t" - "str r3, [%[r], #72]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #60]\n\t" - "str r2, [%[r], #68]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #56]\n\t" - "str r4, [%[r], #64]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r3, [%[r], #60]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r2, [%[r], #56]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #44]\n\t" - "str r4, [%[r], #52]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r3, [%[r], #48]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r2, [%[r], #44]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #32]\n\t" - "str r4, [%[r], #40]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r3, [%[r], #36]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r2, [%[r], #32]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #20]\n\t" - "str r4, [%[r], #28]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r3, [%[r], #24]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r2, [%[r], #20]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "ldr r2, [%[a], #8]\n\t" - "str r4, [%[r], #16]\n\t" - "lsr r5, r2, #1\n\t" - "lsl r2, r2, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r3, r3, r5\n\t" - "ldr r4, [%[a], #4]\n\t" - "str r3, [%[r], #12]\n\t" - "lsr r5, r4, #1\n\t" - "lsl r4, r4, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r2, r2, r5\n\t" - "ldr r3, [%[a], #0]\n\t" - "str r2, [%[r], #8]\n\t" - "lsr r5, r3, #1\n\t" - "lsl r3, r3, %[n]\n\t" - "lsr r5, r5, r6\n\t" - "orr r4, r4, r5\n\t" - "str r3, [%[r]]\n\t" - "str r4, [%[r], #4]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register byte n __asm__ ("r2") = (byte)n_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "RSB r7, %[n], #0x1f\n\t" + "LDR r5, [%[a], #132]\n\t" + "LSR r6, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r6, r6, r7\n\t" + "LDR r4, [%[a], #128]\n\t" + "STR r6, [%[r], #136]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #124]\n\t" + "STR r5, [%[r], #132]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #120]\n\t" + "STR r4, [%[r], #128]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #116]\n\t" + "STR r6, [%[r], #124]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #112]\n\t" + "STR r5, [%[r], #120]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #108]\n\t" + "STR r4, [%[r], #116]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #104]\n\t" + "STR r6, [%[r], #112]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #100]\n\t" + "STR r5, [%[r], #108]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #96]\n\t" + "STR r4, [%[r], #104]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #92]\n\t" + "STR r6, [%[r], #100]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #88]\n\t" + "STR r5, [%[r], #96]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #84]\n\t" + "STR r4, [%[r], #92]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #80]\n\t" + "STR r6, [%[r], #88]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #76]\n\t" + "STR r5, [%[r], #84]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #72]\n\t" + "STR r4, [%[r], #80]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #68]\n\t" + "STR r6, [%[r], #76]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #64]\n\t" + "STR r5, [%[r], #72]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #60]\n\t" + "STR r4, [%[r], #68]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #56]\n\t" + "STR r6, [%[r], #64]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #52]\n\t" + "STR r5, [%[r], #60]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #48]\n\t" + "STR r4, [%[r], #56]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #44]\n\t" + "STR r6, [%[r], #52]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #40]\n\t" + "STR r5, [%[r], #48]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #36]\n\t" + "STR r4, [%[r], #44]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #32]\n\t" + "STR r6, [%[r], #40]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #28]\n\t" + "STR r5, [%[r], #36]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #24]\n\t" + "STR r4, [%[r], #32]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #20]\n\t" + "STR r6, [%[r], #28]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #16]\n\t" + "STR r5, [%[r], #24]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a], #12]\n\t" + "STR r4, [%[r], #20]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "LDR r4, [%[a], #8]\n\t" + "STR r6, [%[r], #16]\n\t" + "LSR r3, r4, #1\n\t" + "LSL r4, r4, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r5, r5, r3\n\t" + "LDR r6, [%[a], #4]\n\t" + "STR r5, [%[r], #12]\n\t" + "LSR r3, r6, #1\n\t" + "LSL r6, r6, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r4, r4, r3\n\t" + "LDR r5, [%[a]]\n\t" + "STR r4, [%[r], #8]\n\t" + "LSR r3, r5, #1\n\t" + "LSL r5, r5, %[n]\n\t" + "LSR r3, r3, r7\n\t" + "ORR r6, r6, r3\n\t" + "STR r5, [%[r]]\n\t" + "STR r6, [%[r], #4]\n\t" + : [r] "+r" (r), [a] "+r" (a), [n] "+r" (n) : - : [r] "r" (r), [a] "r" (a), [n] "r" (n) - : "memory", "r2", "r3", "r4", "r5", "r6" + : "memory", "r4", "r5", "r6", "r3", "r7", "cc" ); } @@ -39329,150 +61980,275 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_521_sub_in_place_17(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #64\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x40\n\t" + "\n" + "L_sp_521_sub_in_pkace_17_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_521_sub_in_pkace_17_word%=\n\t" +#else + "BNE.N L_sp_521_sub_in_pkace_17_word%=\n\t" +#endif + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2}\n\t" + "LDM %[b]!, {r6}\n\t" + "SBCS r2, r2, r6\n\t" + "STM %[a]!, {r2}\n\t" + "SBC %[a], %[a], %[a]\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #else -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) + * + * a A single precision integer and result. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_sub_in_place_17(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_521_sub_in_place_17(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2}\n\t" + "LDM %[b]!, {r6}\n\t" + "SBCS r2, r2, r6\n\t" + "STM %[a]!, {r2}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)a; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL +/* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. - * b A single precision integer. + * b A single precision digit. */ -SP_NOINLINE static sp_digit sp_521_sub_in_place_17(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_521_mul_d_17(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r3, r3, r5\n\t" - "str r3, [%[a]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) + /* A[0] * B */ + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_521_mul_d_17_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x44\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_521_mul_d_17_word%=\n\t" +#else + "BLT.N L_sp_521_mul_d_17_word%=\n\t" +#endif + "STR r3, [%[r], #68]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; } -#endif /* WOLFSSL_SP_SMALL */ +#else /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_521_mul_d_17(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_mul_d_17(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_521_mul_d_17(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #68\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[12] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[13] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[14] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[15] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[16] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "STR r5, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -39482,49 +62258,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_521_word_17(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_521_word_17_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_521_word_17_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* AND m into each word of a and store in r. * * r A single precision integer. @@ -39565,8 +62426,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_521_div_17(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[35]; sp_digit t2[18]; @@ -40171,339 +63032,567 @@ #endif /* HAVE_ECC_SIGN */ #ifndef WOLFSSL_SP_SMALL +#ifdef WOLFSSL_SP_SMALL +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r11, #0x0\n\t" + "ADD r12, %[a], #0x40\n\t" + "\n" + "L_sp_521_sub_17_word%=:\n\t" + "RSBS r11, r11, #0x0\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC r11, r3, r3\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_521_sub_17_word%=\n\t" +#else + "BNE.N L_sp_521_sub_17_word%=\n\t" +#endif + "RSBS r11, r11, #0x0\n\t" + "LDM %[a]!, {r3}\n\t" + "LDM %[b]!, {r7}\n\t" + "SBCS r3, r3, r7\n\t" + "STM %[r]!, {r3}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" + ); + return (uint32_t)(size_t)r; +} + +#else +/* Sub b from a into r. (r = a - b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision integer. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_521_sub_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_521_sub_17(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3}\n\t" + "LDM %[b]!, {r7}\n\t" + "SBCS r3, r3, r7\n\t" + "STM %[r]!, {r3}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ /* Divide the number by 2 mod the modulus. (r = a / 2 % m) * * r Result of division by 2. * a Number to divide. * m Modulus. */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_521_div2_mod_17(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else static void sp_521_div2_mod_17(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "ldr r4, [%[a]]\n\t" - "ands r8, r4, #1\n\t" - "beq 1f\n\t" - "mov r12, #0\n\t" - "ldr r5, [%[a], #4]\n\t" - "ldr r6, [%[a], #8]\n\t" - "ldr r7, [%[a], #12]\n\t" - "ldr r8, [%[m], #0]\n\t" - "ldr r9, [%[m], #4]\n\t" - "ldr r10, [%[m], #8]\n\t" - "ldr r14, [%[m], #12]\n\t" - "adds r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #0]\n\t" - "str r5, [%[r], #4]\n\t" - "str r6, [%[r], #8]\n\t" - "str r7, [%[r], #12]\n\t" - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #20]\n\t" - "ldr r6, [%[a], #24]\n\t" - "ldr r7, [%[a], #28]\n\t" - "ldr r8, [%[m], #16]\n\t" - "ldr r9, [%[m], #20]\n\t" - "ldr r10, [%[m], #24]\n\t" - "ldr r14, [%[m], #28]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #16]\n\t" - "str r5, [%[r], #20]\n\t" - "str r6, [%[r], #24]\n\t" - "str r7, [%[r], #28]\n\t" - "ldr r4, [%[a], #32]\n\t" - "ldr r5, [%[a], #36]\n\t" - "ldr r6, [%[a], #40]\n\t" - "ldr r7, [%[a], #44]\n\t" - "ldr r8, [%[m], #32]\n\t" - "ldr r9, [%[m], #36]\n\t" - "ldr r10, [%[m], #40]\n\t" - "ldr r14, [%[m], #44]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #32]\n\t" - "str r5, [%[r], #36]\n\t" - "str r6, [%[r], #40]\n\t" - "str r7, [%[r], #44]\n\t" - "ldr r4, [%[a], #48]\n\t" - "ldr r5, [%[a], #52]\n\t" - "ldr r6, [%[a], #56]\n\t" - "ldr r7, [%[a], #60]\n\t" - "ldr r8, [%[m], #48]\n\t" - "ldr r9, [%[m], #52]\n\t" - "ldr r10, [%[m], #56]\n\t" - "ldr r14, [%[m], #60]\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "str r4, [%[r], #48]\n\t" - "str r5, [%[r], #52]\n\t" - "str r6, [%[r], #56]\n\t" - "str r7, [%[r], #60]\n\t" - "ldr r4, [%[a], #64]\n\t" - "ldr r8, [%[m], #64]\n\t" - "adcs r4, r4, r8\n\t" - "str r4, [%[r], #64]\n\t" - "adc r8, r12, r12\n\t" - "b 2f\n\t" - "\n1:\n\t" - "ldr r5, [%[a], #2]\n\t" - "str r4, [%[r], #0]\n\t" - "str r5, [%[r], #2]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[a], #6]\n\t" - "str r4, [%[r], #4]\n\t" - "str r5, [%[r], #6]\n\t" - "ldr r4, [%[a], #8]\n\t" - "ldr r5, [%[a], #10]\n\t" - "str r4, [%[r], #8]\n\t" - "str r5, [%[r], #10]\n\t" - "ldr r4, [%[a], #12]\n\t" - "ldr r5, [%[a], #14]\n\t" - "str r4, [%[r], #12]\n\t" - "str r5, [%[r], #14]\n\t" - "ldr r4, [%[a], #16]\n\t" - "ldr r5, [%[a], #18]\n\t" - "str r4, [%[r], #16]\n\t" - "str r5, [%[r], #18]\n\t" - "ldr r4, [%[a], #20]\n\t" - "ldr r5, [%[a], #22]\n\t" - "str r4, [%[r], #20]\n\t" - "str r5, [%[r], #22]\n\t" - "ldr r4, [%[a], #24]\n\t" - "ldr r5, [%[a], #26]\n\t" - "str r4, [%[r], #24]\n\t" - "str r5, [%[r], #26]\n\t" - "ldr r4, [%[a], #28]\n\t" - "ldr r5, [%[a], #30]\n\t" - "str r4, [%[r], #28]\n\t" - "str r5, [%[r], #30]\n\t" - "\n2:\n\t" - "ldr r3, [%[r]]\n\t" - "ldr r4, [%[r], #4]\n\t" - "lsr r3, r3, #1\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #8]\n\t" - "str r3, [%[r], #0]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #12]\n\t" - "str r4, [%[r], #4]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #16]\n\t" - "str r5, [%[r], #8]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #20]\n\t" - "str r3, [%[r], #12]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #24]\n\t" - "str r4, [%[r], #16]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #28]\n\t" - "str r5, [%[r], #20]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #32]\n\t" - "str r3, [%[r], #24]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #36]\n\t" - "str r4, [%[r], #28]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #40]\n\t" - "str r5, [%[r], #32]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #44]\n\t" - "str r3, [%[r], #36]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #48]\n\t" - "str r4, [%[r], #40]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #52]\n\t" - "str r5, [%[r], #44]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r5, [%[a], #56]\n\t" - "str r3, [%[r], #48]\n\t" - "orr r4, r4, r5, lsl #31\n\t" - "lsr r5, r5, #1\n\t" - "ldr r3, [%[a], #60]\n\t" - "str r4, [%[r], #52]\n\t" - "orr r5, r5, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #64]\n\t" - "str r5, [%[r], #56]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "orr r4, r4, r8, lsl #31\n\t" - "str r3, [%[r], #60]\n\t" - "str r4, [%[r], #64]\n\t" - : - : [r] "r" (r), [a] "r" (a), [m] "r" (m) - : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14" - ); -} - -static int sp_521_num_bits_17(sp_digit* a) -{ - int r = 0; - - __asm__ __volatile__ ( - "ldr r2, [%[a], #64]\n\t" - "cmp r2, #0\n\t" - "beq 16f\n\t" - "mov r3, #544\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n16:\n\t" - "ldr r2, [%[a], #60]\n\t" - "cmp r2, #0\n\t" - "beq 15f\n\t" - "mov r3, #512\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n15:\n\t" - "ldr r2, [%[a], #56]\n\t" - "cmp r2, #0\n\t" - "beq 14f\n\t" - "mov r3, #480\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n14:\n\t" - "ldr r2, [%[a], #52]\n\t" - "cmp r2, #0\n\t" - "beq 13f\n\t" - "mov r3, #448\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n13:\n\t" - "ldr r2, [%[a], #48]\n\t" - "cmp r2, #0\n\t" - "beq 12f\n\t" - "mov r3, #416\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n12:\n\t" - "ldr r2, [%[a], #44]\n\t" - "cmp r2, #0\n\t" - "beq 11f\n\t" - "mov r3, #384\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n11:\n\t" - "ldr r2, [%[a], #40]\n\t" - "cmp r2, #0\n\t" - "beq 10f\n\t" - "mov r3, #352\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n10:\n\t" - "ldr r2, [%[a], #36]\n\t" - "cmp r2, #0\n\t" - "beq 9f\n\t" - "mov r3, #320\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n9:\n\t" - "ldr r2, [%[a], #32]\n\t" - "cmp r2, #0\n\t" - "beq 8f\n\t" - "mov r3, #288\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n8:\n\t" - "ldr r2, [%[a], #28]\n\t" - "cmp r2, #0\n\t" - "beq 7f\n\t" - "mov r3, #256\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n7:\n\t" - "ldr r2, [%[a], #24]\n\t" - "cmp r2, #0\n\t" - "beq 6f\n\t" - "mov r3, #224\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n6:\n\t" - "ldr r2, [%[a], #20]\n\t" - "cmp r2, #0\n\t" - "beq 5f\n\t" - "mov r3, #192\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n5:\n\t" - "ldr r2, [%[a], #16]\n\t" - "cmp r2, #0\n\t" - "beq 4f\n\t" - "mov r3, #160\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n4:\n\t" - "ldr r2, [%[a], #12]\n\t" - "cmp r2, #0\n\t" - "beq 3f\n\t" - "mov r3, #128\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n3:\n\t" - "ldr r2, [%[a], #8]\n\t" - "cmp r2, #0\n\t" - "beq 2f\n\t" - "mov r3, #96\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n2:\n\t" - "ldr r2, [%[a], #4]\n\t" - "cmp r2, #0\n\t" - "beq 1f\n\t" - "mov r3, #64\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "b 18f\n\t" - "\n1:\n\t" - "ldr r2, [%[a], #0]\n\t" - "mov r3, #32\n\t" - "clz %[r], r2\n\t" - "sub %[r], r3, %[r]\n\t" - "\n18:\n\t" - : [r] "+r" (r) - : [a] "r" (a) - : "r2", "r3" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r4}\n\t" + "ANDS r3, r4, #0x1\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_div2_mod_17_even%=\n\t" +#else + "BEQ.N L_sp_521_div2_mod_17_even%=\n\t" +#endif + "MOV r12, #0x0\n\t" + "LDM %[a]!, {r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4}\n\t" + "LDM %[m]!, {r8}\n\t" + "ADCS r4, r4, r8\n\t" + "STM %[r]!, {r4}\n\t" + "ADC r3, r12, r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_div2_mod_17_div2%=\n\t" +#else + "B.N L_sp_521_div2_mod_17_div2%=\n\t" +#endif + "\n" + "L_sp_521_div2_mod_17_even%=:\n\t" + "LDM %[a]!, {r5, r6, r7}\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4}\n\t" + "STM %[r]!, {r4}\n\t" + "\n" + "L_sp_521_div2_mod_17_div2%=:\n\t" + "SUB %[r], %[r], #0x44\n\t" + "LDRD r8, r9, [%[r]]\n\t" + "LSR r8, r8, #1\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #8]\n\t" + "STR r8, [%[r]]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #12]\n\t" + "STR r9, [%[r], #4]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #16]\n\t" + "STR r10, [%[r], #8]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #20]\n\t" + "STR r8, [%[r], #12]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #24]\n\t" + "STR r9, [%[r], #16]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #28]\n\t" + "STR r10, [%[r], #20]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #32]\n\t" + "STR r8, [%[r], #24]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #36]\n\t" + "STR r9, [%[r], #28]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #40]\n\t" + "STR r10, [%[r], #32]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #44]\n\t" + "STR r8, [%[r], #36]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #48]\n\t" + "STR r9, [%[r], #40]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #52]\n\t" + "STR r10, [%[r], #44]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "LDR r10, [%[r], #56]\n\t" + "STR r8, [%[r], #48]\n\t" + "ORR r9, r9, r10, lsl #31\n\t" + "LSR r10, r10, #1\n\t" + "LDR r8, [%[r], #60]\n\t" + "STR r9, [%[r], #52]\n\t" + "ORR r10, r10, r8, lsl #31\n\t" + "LSR r8, r8, #1\n\t" + "LDR r9, [%[r], #64]\n\t" + "STR r10, [%[r], #56]\n\t" + "ORR r8, r8, r9, lsl #31\n\t" + "LSR r9, r9, #1\n\t" + "ORR r9, r9, r3, lsl #31\n\t" + "STR r8, [%[r], #60]\n\t" + "STR r9, [%[r], #64]\n\t" + : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" ); +} - return r; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static int sp_521_num_bits_17(const sp_digit* a_p) +#else +static int sp_521_num_bits_17(const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDR r1, [%[a], #64]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_16%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_16%=\n\t" +#endif + "MOV r2, #0x220\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_16%=:\n\t" + "LDR r1, [%[a], #60]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_15%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_15%=\n\t" +#endif + "MOV r2, #0x200\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_15%=:\n\t" + "LDR r1, [%[a], #56]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_14%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_14%=\n\t" +#endif + "MOV r2, #0x1e0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_14%=:\n\t" + "LDR r1, [%[a], #52]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_13%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_13%=\n\t" +#endif + "MOV r2, #0x1c0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_13%=:\n\t" + "LDR r1, [%[a], #48]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_12%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_12%=\n\t" +#endif + "MOV r2, #0x1a0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_12%=:\n\t" + "LDR r1, [%[a], #44]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_11%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_11%=\n\t" +#endif + "MOV r2, #0x180\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_11%=:\n\t" + "LDR r1, [%[a], #40]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_10%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_10%=\n\t" +#endif + "MOV r2, #0x160\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_10%=:\n\t" + "LDR r1, [%[a], #36]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_9%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_9%=\n\t" +#endif + "MOV r2, #0x140\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_9%=:\n\t" + "LDR r1, [%[a], #32]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_8%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_8%=\n\t" +#endif + "MOV r2, #0x120\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_8%=:\n\t" + "LDR r1, [%[a], #28]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_7%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_7%=\n\t" +#endif + "MOV r2, #0x100\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_7%=:\n\t" + "LDR r1, [%[a], #24]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_6%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_6%=\n\t" +#endif + "MOV r2, #0xe0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_6%=:\n\t" + "LDR r1, [%[a], #20]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_5%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_5%=\n\t" +#endif + "MOV r2, #0xc0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_5%=:\n\t" + "LDR r1, [%[a], #16]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_4%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_4%=\n\t" +#endif + "MOV r2, #0xa0\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_4%=:\n\t" + "LDR r1, [%[a], #12]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_3%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_3%=\n\t" +#endif + "MOV r2, #0x80\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_3%=:\n\t" + "LDR r1, [%[a], #8]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_2%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_2%=\n\t" +#endif + "MOV r2, #0x60\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_2%=:\n\t" + "LDR r1, [%[a], #4]\n\t" + "CMP r1, #0x0\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BEQ L_sp_521_num_bits_17_1%=\n\t" +#else + "BEQ.N L_sp_521_num_bits_17_1%=\n\t" +#endif + "MOV r2, #0x40\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "B L_sp_521_num_bits_17_18%=\n\t" +#else + "B.N L_sp_521_num_bits_17_18%=\n\t" +#endif + "\n" + "L_sp_521_num_bits_17_1%=:\n\t" + "LDR r1, [%[a]]\n\t" + "MOV r2, #0x20\n\t" + "CLZ r4, r1\n\t" + "SUB r4, r2, r4\n\t" + "\n" + "L_sp_521_num_bits_17_18%=:\n\t" + "MOV %[a], r4\n\t" + : [a] "+r" (a) + : + : "memory", "r1", "r2", "r3", "r4", "r5", "cc" + ); + return (uint32_t)(size_t)a; } /* Non-constant time modular inversion. @@ -40549,7 +63638,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_521_cmp_17(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_521_cmp_17(u, v) >= 0))) { sp_521_sub_17(u, u, v); o = sp_521_sub_17(b, b, d); if (o != 0) @@ -40635,7 +63724,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -40966,7 +64055,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -40994,19 +64083,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 17; + /* y^2 - x^3 - a.x = b */ sp_521_sqr_17(t1, point->y); (void)sp_521_mod_17(t1, t1, p521_mod); sp_521_sqr_17(t2, point->x); (void)sp_521_mod_17(t2, t2, p521_mod); sp_521_mul_17(t2, t2, point->x); (void)sp_521_mod_17(t2, t2, p521_mod); - (void)sp_521_sub_17(t2, p521_mod, t2); - sp_521_mont_add_17(t1, t1, t2, p521_mod); + sp_521_mont_sub_17(t1, t1, t2, p521_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_521_mont_add_17(t1, t1, point->x, p521_mod); sp_521_mont_add_17(t1, t1, point->x, p521_mod); sp_521_mont_add_17(t1, t1, point->x, p521_mod); + if (sp_521_cmp_17(t1, p521_b) != 0) { err = MP_VAL; } @@ -41020,7 +64111,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -41525,83 +64616,1807 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_1024_mul_16(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_1024_mul_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_1024_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[16 * 2]; - sp_digit* tmp = tmp_arr; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #64\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #60\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #120\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" + "SUB sp, sp, #0x40\n\t" + /* A[0] * B[0] */ + "LDR r11, [%[a]]\n\t" + "LDR r12, [%[b]]\n\t" + "UMULL r3, r4, r11, r12\n\t" + "MOV r5, #0x0\n\t" + "STR r3, [sp]\n\t" + /* A[0] * B[1] */ + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[0] */ + "LDR r8, [%[a], #4]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #4]\n\t" + /* A[2] * B[0] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[1] */ + "LDR r11, [%[a], #4]\n\t" + "LDR r12, [%[b], #4]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[2] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #8]\n\t" + /* A[0] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[2] */ + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[1] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[0] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #12]\n\t" + /* A[4] * B[0] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[1] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[2] */ + "LDR r11, [%[a], #8]\n\t" + "LDR r12, [%[b], #8]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[3] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[4] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #16]\n\t" + /* A[0] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[4] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[2] */ + "LDR r8, [%[a], #12]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[1] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[0] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #20]\n\t" + /* A[6] * B[0] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[1] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[2] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[3] */ + "LDR r11, [%[a], #12]\n\t" + "LDR r12, [%[b], #12]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[4] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[5] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[0] * B[6] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #24]\n\t" + /* A[0] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[6] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[5] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[4] */ + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[3] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[2] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[1] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[0] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #28]\n\t" + /* A[8] * B[0] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[1] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[2] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[3] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[4] */ + "LDR r11, [%[a], #16]\n\t" + "LDR r12, [%[b], #16]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[5] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[6] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[7] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[8] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #32]\n\t" + /* A[0] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[8] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[7] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[6] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[4] */ + "LDR r8, [%[a], #20]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[3] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[2] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[1] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[0] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #36]\n\t" + /* A[10] * B[0] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[1] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[2] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[3] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[4] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[5] */ + "LDR r11, [%[a], #20]\n\t" + "LDR r12, [%[b], #20]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[6] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[7] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[8] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[9] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[0] * B[10] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #40]\n\t" + /* A[0] * B[11] */ + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[10] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[9] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[8] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[7] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[6] */ + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[5] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[4] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[3] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[2] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[1] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[0] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #44]\n\t" + /* A[12] * B[0] */ + "LDR r8, [%[a], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[1] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[2] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[3] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[4] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[5] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[6] */ + "LDR r11, [%[a], #24]\n\t" + "LDR r12, [%[b], #24]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[7] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[8] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[9] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[10] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[11] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[0] * B[12] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #48]\n\t" + /* A[0] * B[13] */ + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[12] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[11] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[10] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[9] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[8] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[6] */ + "LDR r8, [%[a], #28]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[5] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[4] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[3] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[2] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[1] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[0] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #52]\n\t" + /* A[14] * B[0] */ + "LDR r8, [%[a], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[1] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[2] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[3] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[4] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[5] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[6] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[7] */ + "LDR r11, [%[a], #28]\n\t" + "LDR r12, [%[b], #28]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[8] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[9] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[10] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[11] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[2] * B[12] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * B[13] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[0] * B[14] */ + "LDR r8, [%[a]]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [sp, #56]\n\t" + /* A[0] * B[15] */ + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[1] * B[14] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[2] * B[13] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[12] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[11] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[10] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[9] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[8] */ + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[7] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[6] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[5] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[4] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[3] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[2] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[1] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[0] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b]]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [sp, #60]\n\t" + /* A[15] * B[1] */ + "LDR r9, [%[b], #4]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[2] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[3] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[4] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[5] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[6] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[7] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[8] */ + "LDR r11, [%[a], #32]\n\t" + "LDR r12, [%[b], #32]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[9] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[10] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[11] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[4] * B[12] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[3] * B[13] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[2] * B[14] */ + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * B[15] */ + "LDR r8, [%[a], #4]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #64]\n\t" + /* A[2] * B[15] */ + "LDR r8, [%[a], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[3] * B[14] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[4] * B[13] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[12] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[11] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[10] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[8] */ + "LDR r8, [%[a], #36]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[7] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[6] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[5] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[4] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[3] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[2] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #8]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #68]\n\t" + /* A[15] * B[3] */ + "LDR r9, [%[b], #12]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[4] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[5] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[6] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[7] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[8] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[9] */ + "LDR r11, [%[a], #36]\n\t" + "LDR r12, [%[b], #36]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[10] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[11] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[6] * B[12] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[5] * B[13] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[4] * B[14] */ + "LDR r8, [%[a], #16]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[3] * B[15] */ + "LDR r8, [%[a], #12]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #72]\n\t" + /* A[4] * B[15] */ + "LDR r8, [%[a], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[5] * B[14] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[6] * B[13] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[12] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[11] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[10] */ + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[9] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[8] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[7] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[6] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[5] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[15] * B[4] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #16]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #76]\n\t" + /* A[15] * B[5] */ + "LDR r9, [%[b], #20]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[6] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[7] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[8] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[9] */ + "LDR r8, [%[a], #44]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[10] */ + "LDR r11, [%[a], #40]\n\t" + "LDR r12, [%[b], #40]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[11] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[8] * B[12] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[7] * B[13] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[6] * B[14] */ + "LDR r8, [%[a], #24]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[5] * B[15] */ + "LDR r8, [%[a], #20]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #80]\n\t" + /* A[6] * B[15] */ + "LDR r8, [%[a], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[7] * B[14] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[8] * B[13] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[12] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[11] */ + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[10] */ + "LDR r8, [%[a], #44]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[9] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[8] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[7] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[6] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #24]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #84]\n\t" + /* A[15] * B[7] */ + "LDR r9, [%[b], #28]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[8] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[9] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[10] */ + "LDR r8, [%[a], #48]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[11] */ + "LDR r11, [%[a], #44]\n\t" + "LDR r12, [%[b], #44]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[10] * B[12] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[9] * B[13] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[8] * B[14] */ + "LDR r8, [%[a], #32]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[7] * B[15] */ + "LDR r8, [%[a], #28]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #88]\n\t" + /* A[8] * B[15] */ + "LDR r8, [%[a], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[9] * B[14] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[10] * B[13] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[12] */ + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[11] */ + "LDR r8, [%[a], #48]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[10] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[9] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[8] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #32]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #92]\n\t" + /* A[15] * B[9] */ + "LDR r9, [%[b], #36]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[10] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[11] */ + "LDR r8, [%[a], #52]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[12] * B[12] */ + "LDR r11, [%[a], #48]\n\t" + "LDR r12, [%[b], #48]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[11] * B[13] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[10] * B[14] */ + "LDR r8, [%[a], #40]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[9] * B[15] */ + "LDR r8, [%[a], #36]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #96]\n\t" + /* A[10] * B[15] */ + "LDR r8, [%[a], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[11] * B[14] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * B[13] */ + "LDR r9, [%[b], #52]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[12] */ + "LDR r8, [%[a], #52]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[11] */ + "LDR r8, [%[a], #56]\n\t" + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[15] * B[10] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #40]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #100]\n\t" + /* A[15] * B[11] */ + "LDR r9, [%[b], #44]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[14] * B[12] */ + "LDR r8, [%[a], #56]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * B[13] */ + "LDR r11, [%[a], #52]\n\t" + "LDR r12, [%[b], #52]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[12] * B[14] */ + "LDR r8, [%[a], #48]\n\t" + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[11] * B[15] */ + "LDR r8, [%[a], #44]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #104]\n\t" + /* A[12] * B[15] */ + "LDR r8, [%[a], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "MOV r5, #0x0\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[13] * B[14] */ + "LDR r9, [%[b], #56]\n\t" + "UMULL r6, r7, r11, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[14] * B[13] */ + "LDR r8, [%[a], #56]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + /* A[15] * B[12] */ + "LDR r8, [%[a], #60]\n\t" + "LDR r9, [%[b], #48]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], #108]\n\t" + /* A[15] * B[13] */ + "UMULL r6, r7, r8, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[14] * B[14] */ + "LDR r11, [%[a], #56]\n\t" + "LDR r12, [%[b], #56]\n\t" + "UMULL r6, r7, r11, r12\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * B[15] */ + "LDR r8, [%[a], #52]\n\t" + "LDR r9, [%[b], #60]\n\t" + "UMULL r6, r7, r8, r9\n\t" + "ADDS r4, r4, r6\n\t" + "ADCS r5, r5, r7\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #112]\n\t" + /* A[14] * B[15] */ + "UMULL r6, r7, r11, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[15] * B[14] */ + "LDR r8, [%[a], #60]\n\t" + "UMULL r6, r7, r8, r12\n\t" + "ADDS r5, r5, r6\n\t" + "ADCS r3, r3, r7\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r5, [%[r], #116]\n\t" + /* A[15] * B[15] */ + "UMLAL r3, r4, r8, r9\n\t" + "STR r3, [%[r], #120]\n\t" + "STR r4, [%[r], #124]\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM sp!, {r3, r4, r5, r6}\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r11", "r12", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Square a and put result in r. (r = a * a) @@ -41609,122 +66424,1150 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_1024_sqr_16(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_1024_sqr_16(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #128\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #60\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #64\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #120\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #124\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #128\n\t" - "add sp, sp, r6\n\t" + "SUB sp, sp, #0x40\n\t" + /* A[0] * A[0] */ + "LDR r10, [%[a]]\n\t" + "UMULL r8, r3, r10, r10\n\t" + "MOV r4, #0x0\n\t" + "STR r8, [sp]\n\t" + /* A[0] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #4]\n\t" + /* A[0] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[1] * A[1] */ + "LDR r10, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [sp, #8]\n\t" + /* A[0] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[1] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [sp, #12]\n\t" + /* A[0] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[1] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[2] * A[2] */ + "LDR r10, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [sp, #16]\n\t" + /* A[0] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #20]\n\t" + /* A[0] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[3] */ + "LDR r10, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #24]\n\t" + /* A[0] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #28]\n\t" + /* A[0] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[4] */ + "LDR r10, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #32]\n\t" + /* A[0] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #36]\n\t" + /* A[0] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[5] */ + "LDR r10, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #40]\n\t" + /* A[0] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #44]\n\t" + /* A[0] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[6] */ + "LDR r10, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #48]\n\t" + /* A[0] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [sp, #52]\n\t" + /* A[0] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[7] */ + "LDR r10, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [sp, #56]\n\t" + /* A[0] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a]]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[1] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[2] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [sp, #60]\n\t" + /* A[1] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #4]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[2] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[3] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[8] */ + "LDR r10, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #64]\n\t" + /* A[2] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #8]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[3] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[4] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #68]\n\t" + /* A[3] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #12]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[4] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[5] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[9] */ + "LDR r10, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #72]\n\t" + /* A[4] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #16]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[5] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[6] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #76]\n\t" + /* A[5] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #20]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[6] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[7] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[10] */ + "LDR r10, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #80]\n\t" + /* A[6] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #24]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[7] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[8] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #84]\n\t" + /* A[7] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #28]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[8] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[9] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[11] * A[11] */ + "LDR r10, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #88]\n\t" + /* A[8] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #32]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r3, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[9] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[10] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[11] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r4, r4, r5\n\t" + "ADCS r2, r2, r6\n\t" + "ADC r3, r3, r7\n\t" + "STR r4, [%[r], #92]\n\t" + /* A[9] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #36]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r4, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[10] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[11] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[12] * A[12] */ + "LDR r10, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r5\n\t" + "ADCS r3, r3, r6\n\t" + "ADC r4, r4, r7\n\t" + "STR r2, [%[r], #96]\n\t" + /* A[10] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #40]\n\t" + "UMULL r5, r6, r10, r12\n\t" + "MOV r2, #0x0\n\t" + "MOV r7, #0x0\n\t" + /* A[11] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + /* A[12] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "LDR r12, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r5, r5, r8\n\t" + "ADCS r6, r6, r9\n\t" + "ADC r7, r7, #0x0\n\t" + "ADDS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADC r7, r7, r7\n\t" + "ADDS r3, r3, r5\n\t" + "ADCS r4, r4, r6\n\t" + "ADC r2, r2, r7\n\t" + "STR r3, [%[r], #100]\n\t" + /* A[11] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #44]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[12] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + /* A[13] * A[13] */ + "LDR r10, [%[a], #52]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #104]\n\t" + /* A[12] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #48]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "MOV r4, #0x0\n\t" + "ADC r4, r4, #0x0\n\t" + /* A[13] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "LDR r12, [%[a], #52]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "ADDS r2, r2, r8\n\t" + "ADCS r3, r3, r9\n\t" + "ADC r4, r4, #0x0\n\t" + "STR r2, [%[r], #108]\n\t" + /* A[13] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #52]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "MOV r2, #0x0\n\t" + "ADC r2, r2, #0x0\n\t" + /* A[14] * A[14] */ + "LDR r10, [%[a], #56]\n\t" + "UMULL r8, r9, r10, r10\n\t" + "ADDS r3, r3, r8\n\t" + "ADCS r4, r4, r9\n\t" + "ADC r2, r2, #0x0\n\t" + "STR r3, [%[r], #112]\n\t" + /* A[14] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "LDR r12, [%[a], #56]\n\t" + "UMULL r8, r9, r10, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r2, r2, r9\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, #0x0\n\t" + "STR r4, [%[r], #116]\n\t" + /* A[15] * A[15] */ + "LDR r10, [%[a], #60]\n\t" + "UMLAL r2, r3, r10, r10\n\t" + "STR r2, [%[r], #120]\n\t" + "STR r3, [%[r], #124]\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + "LDM sp!, {r2, r3, r4, r8}\n\t" + "STM %[r]!, {r2, r3, r4, r8}\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r12", "cc" ); } @@ -41734,161 +67577,135 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_add_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_1024_add_16(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } -/* Sub b from a into r. (r = a - b) +/* Sub b from a into a. (a -= b) * - * r A single precision integer. - * a A single precision integer. + * a A single precision integer and result. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_1024_sub_in_place_32(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "subs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "ldm %[a], {r3, r4}\n\t" - "ldm %[b]!, {r5, r6}\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "stm %[a]!, {r3, r4}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SUBS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC %[a], r9, r9\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; + return (uint32_t)(size_t)a; } /* Add b to a into r. (r = a + b) @@ -41897,100 +67714,82 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adds r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "adcs r4, r4, r6\n\t" - "adcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADDS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "ADCS r3, r3, r7\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "MOV %[r], #0x0\n\t" + "ADC %[r], %[r], #0x0\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* AND m into each word of a and store in r. @@ -42068,59 +67867,53 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_sub_16(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SUBS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "LDM %[a]!, {r3, r4, r5, r6}\n\t" + "LDM %[b]!, {r7, r8, r9, r10}\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "STM %[r]!, {r3, r4, r5, r6}\n\t" + "SBC %[r], r6, r6\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - - return c; + return (uint32_t)(size_t)r; } /* Square a and put result in r. (r = a * a) @@ -42166,83 +67959,99 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static void sp_1024_mul_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_1024_mul_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static void sp_1024_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit tmp_arr[32 * 2]; - sp_digit* tmp = tmp_arr; - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r10, %[a]\n\t" - "mov r11, %[b]\n\t" - "mov r6, #128\n\t" - "add r6, r6, r10\n\t" - "mov r14, r6\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r5, #0\n\t" - "mov r6, #124\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov %[b], r9\n\t" - "sub %[b], %[b], %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add %[b], %[b], r11\n\t" - "\n2:\n\t" - /* Multiply Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [%[b]]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply Done */ - "add %[a], %[a], #4\n\t" - "sub %[b], %[b], #4\n\t" - "cmp %[a], r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, r9\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r12\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r], r8]\n\t" - "mov %[a], r10\n\t" - "mov %[b], r11\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x100\n\t" + "LDR lr, [%[a]]\n\t" + "LDR r11, [%[b]]\n\t" + "UMULL r8, r6, lr, r11\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_1024_mul_32_outer%=:\n\t" + "SUBS r3, r5, #0x7c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_1024_mul_32_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "LDR lr, [%[a], r4]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_1024_mul_32_inner_done%=\n\t" +#else + "BGT.N L_sp_1024_mul_32_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_1024_mul_32_inner%=\n\t" +#else + "BLT.N L_sp_1024_mul_32_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[b], r3]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_1024_mul_32_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0xf4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_1024_mul_32_outer%=\n\t" +#else + "BLE.N L_sp_1024_mul_32_outer%=\n\t" +#endif + "LDR lr, [%[a], #124]\n\t" + "LDR r11, [%[b], #124]\n\t" + "UMLAL r6, r7, lr, r11\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_1024_mul_32_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_1024_mul_32_store%=\n\t" +#else + "BGT.N L_sp_1024_mul_32_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : [r] "r" (tmp), [a] "r" (a), [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); - - XMEMCPY(r, tmp_arr, sizeof(tmp_arr)); } /* Square a and put result in r. (r = a * a) @@ -42250,124 +68059,91 @@ * r A single precision integer. * a A single precision integer. */ -SP_NOINLINE static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_1024_sqr_32(sp_digit* r_p, const sp_digit* a_p) +#else +static void sp_1024_sqr_32(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mov r4, #0\n\t" - "mov r5, #0\n\t" - "mov r9, r3\n\t" - "mov r12, %[r]\n\t" - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "neg r6, r6\n\t" - "add sp, sp, r6\n\t" - "mov r11, sp\n\t" - "mov r10, %[a]\n\t" - "\n1:\n\t" - "mov %[r], #0\n\t" - "mov r6, #124\n\t" - "mov %[a], r9\n\t" - "subs %[a], %[a], r6\n\t" - "sbc r6, r6, r6\n\t" - "mvn r6, r6\n\t" - "and %[a], %[a], r6\n\t" - "mov r2, r9\n\t" - "sub r2, r2, %[a]\n\t" - "add %[a], %[a], r10\n\t" - "add r2, r2, r10\n\t" - "\n2:\n\t" - "cmp r2, %[a]\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 4f\n\t" -#else - "beq.n 4f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - /* Multiply * 2: Start */ - "ldr r6, [%[a]]\n\t" - "ldr r8, [r2]\n\t" - "umull r6, r8, r6, r8\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Multiply * 2: Done */ -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bal 5f\n\t" -#else - "bal.n 5f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n4:\n\t" - /* Square: Start */ - "ldr r6, [%[a]]\n\t" - "umull r6, r8, r6, r6\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, %[r]\n\t" - /* Square: Done */ - "\n5:\n\t" - "add %[a], %[a], #4\n\t" - "sub r2, r2, #4\n\t" - "mov r6, #128\n\t" - "add r6, r6, r10\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "beq 3f\n\t" -#else - "beq.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "cmp %[a], r2\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bgt 3f\n\t" -#else - "bgt.n 3f\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r8, r9\n\t" - "add r8, r8, r10\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 2b\n\t" -#else - "ble.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "\n3:\n\t" - "mov %[r], r11\n\t" - "mov r8, r9\n\t" - "str r3, [%[r], r8]\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "mov r5, #0\n\t" - "add r8, r8, #4\n\t" - "mov r9, r8\n\t" - "mov r6, #248\n\t" - "cmp r8, r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "ble 1b\n\t" -#else - "ble.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov %[a], r10\n\t" - "str r3, [%[r], r8]\n\t" - "mov %[r], r12\n\t" - "mov %[a], r11\n\t" - "mov r3, #252\n\t" - "\n4:\n\t" - "ldr r6, [%[a], r3]\n\t" - "str r6, [%[r], r3]\n\t" - "subs r3, r3, #4\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 4b\n\t" -#else - "bge.n 4b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "mov r6, #1\n\t" - "lsl r6, r6, #8\n\t" - "add sp, sp, r6\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "SUB sp, sp, #0x100\n\t" + "LDR lr, [%[a]]\n\t" + "UMULL r8, r6, lr, lr\n\t" + "STR r8, [sp]\n\t" + "MOV r7, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r5, #0x4\n\t" + "\n" + "L_sp_1024_sqr_32_outer%=:\n\t" + "SUBS r3, r5, #0x7c\n\t" + "IT cc\n\t" + "MOVCC r3, #0x0\n\t" + "SUB r4, r5, r3\n\t" + "\n" + "L_sp_1024_sqr_32_inner%=:\n\t" + "LDR lr, [%[a], r3]\n\t" + "LDR r11, [%[a], r4]\n\t" + "UMULL r9, r10, lr, r11\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "ADD r3, r3, #0x4\n\t" + "SUB r4, r4, #0x4\n\t" + "CMP r3, r4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_1024_sqr_32_inner_done%=\n\t" +#else + "BGT.N L_sp_1024_sqr_32_inner_done%=\n\t" +#endif +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_1024_sqr_32_inner%=\n\t" +#else + "BLT.N L_sp_1024_sqr_32_inner%=\n\t" +#endif + "LDR lr, [%[a], r3]\n\t" + "UMULL r9, r10, lr, lr\n\t" + "ADDS r6, r6, r9\n\t" + "ADCS r7, r7, r10\n\t" + "ADC r8, r8, #0x0\n\t" + "\n" + "L_sp_1024_sqr_32_inner_done%=:\n\t" + "STR r6, [sp, r5]\n\t" + "MOV r6, r7\n\t" + "MOV r7, r8\n\t" + "MOV r8, #0x0\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0xf4\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLE L_sp_1024_sqr_32_outer%=\n\t" +#else + "BLE.N L_sp_1024_sqr_32_outer%=\n\t" +#endif + "LDR lr, [%[a], #124]\n\t" + "UMLAL r6, r7, lr, lr\n\t" + "STR r6, [sp, r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "STR r7, [sp, r5]\n\t" + "\n" + "L_sp_1024_sqr_32_store%=:\n\t" + "LDM sp!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "STM %[r]!, {r3, r4, r6, r7, r8, r9, r10, r11}\n\t" + "SUBS r5, r5, #0x20\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BGT L_sp_1024_sqr_32_store%=\n\t" +#else + "BGT.N L_sp_1024_sqr_32_store%=\n\t" +#endif + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "lr", "r11", "cc" ); } @@ -42463,42 +68239,47 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_1024_sub_in_place_32(sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_sub_in_place_32(sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_1024_sub_in_place_32(sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - __asm__ __volatile__ ( - "mov r8, %[a]\n\t" - "add r8, r8, #128\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r3, [%[a]]\n\t" - "ldr r4, [%[a], #4]\n\t" - "ldr r5, [%[b]]\n\t" - "ldr r6, [%[b], #4]\n\t" - "sbcs r3, r3, r5\n\t" - "sbcs r4, r4, r6\n\t" - "str r3, [%[a]]\n\t" - "str r4, [%[a], #4]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #8\n\t" - "add %[b], %[b], #8\n\t" - "cmp %[a], r8\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [a] "+r" (a), [b] "+r" (b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "ADD r11, %[a], #0x80\n\t" + "\n" + "L_sp_1024_sub_in_pkace_32_word%=:\n\t" + "RSBS r10, r10, #0x0\n\t" + "LDM %[a], {r2, r3, r4, r5}\n\t" + "LDM %[b]!, {r6, r7, r8, r9}\n\t" + "SBCS r2, r2, r6\n\t" + "SBCS r3, r3, r7\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "STM %[a]!, {r2, r3, r4, r5}\n\t" + "SBC r10, r10, r10\n\t" + "CMP %[a], r11\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_1024_sub_in_pkace_32_word%=\n\t" +#else + "BNE.N L_sp_1024_sub_in_pkace_32_word%=\n\t" +#endif + "MOV %[a], r10\n\t" + : [a] "+r" (a), [b] "+r" (b) : - : "memory", "r3", "r4", "r5", "r6", "r8" + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "cc" ); - - return c; + return (uint32_t)(size_t)a; } #endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL /* Conditionally subtract b from a using the mask m. * m is -1 to subtract and 0 when not copying. * @@ -42507,39 +68288,192 @@ * b A single precision number to subtract. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_1024_cond_sub_32(sp_digit* r, const sp_digit* a, - const sp_digit* b, sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_1024_cond_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #128\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r5, [%[a], r8]\n\t" - "sbcs r5, r5, r6\n\t" - "sbcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "\n" + "L_sp_1024_cond_sub_32_words%=:\n\t" + "SUBS r4, r8, r4\n\t" + "LDR r6, [%[a], r5]\n\t" + "LDR r7, [%[b], r5]\n\t" + "AND r7, r7, %[m]\n\t" + "SBCS r6, r6, r7\n\t" + "SBC r4, r8, r8\n\t" + "STR r6, [%[r], r5]\n\t" + "ADD r5, r5, #0x4\n\t" + "CMP r5, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_1024_cond_sub_32_words%=\n\t" +#else + "BLT.N L_sp_1024_cond_sub_32_words%=\n\t" +#endif + "MOV %[r], r4\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally subtract b from a using the mask m. + * m is -1 to subtract and 0 when not copying. + * + * r A single precision number representing condition subtract result. + * a A single precision number to subtract from. + * b A single precision number to subtract. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_cond_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_1024_cond_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SUBS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "SBCS r6, r6, r8\n\t" + "SBCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "SBC %[r], r5, r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ #ifdef WOLFSSL_SP_SMALL /* Add b to a into r. (r = a + b) * @@ -42547,84 +68481,289 @@ * a A single precision integer. * b A single precision integer. */ -SP_NOINLINE static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_digit sp_1024_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r3, #0x0\n\t" + "ADD r12, %[a], #0x80\n\t" + "\n" + "L_sp_1024_add_32_word%=:\n\t" + "ADDS r3, r3, #0xffffffff\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "MOV r4, #0x0\n\t" + "ADC r3, r4, #0x0\n\t" + "CMP %[a], r12\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BNE L_sp_1024_add_32_word%=\n\t" +#else + "BNE.N L_sp_1024_add_32_word%=\n\t" +#endif + "MOV %[r], r3\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r3", "r12", "cc" + ); + return (uint32_t)(size_t)r; +} + +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_SMALL +/* Mul a by digit b into r. (r = a * b) + * + * r A single precision integer. + * a A single precision integer. + * b A single precision digit. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_1024_mul_d_32(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "mov r8, #0\n\t" - "add r6, r6, #128\n\t" - "sub r8, r8, #1\n\t" - "\n1:\n\t" - "adds %[c], %[c], r8\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "adcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "mov %[c], #0\n\t" - "adc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + /* A[0] * B */ + "LDR r8, [%[a]]\n\t" + "UMULL r5, r3, %[b], r8\n\t" + "MOV r4, #0x0\n\t" + "STR r5, [%[r]]\n\t" + "MOV r5, #0x0\n\t" + "MOV r9, #0x4\n\t" + "\n" + "L_sp_1024_mul_d_32_word%=:\n\t" + /* A[i] * B */ + "LDR r8, [%[a], r9]\n\t" + "UMULL r6, r7, %[b], r8\n\t" + "ADDS r3, r3, r6\n\t" + "ADCS r4, r4, r7\n\t" + "ADC r5, r5, #0x0\n\t" + "STR r3, [%[r], r9]\n\t" + "MOV r3, r4\n\t" + "MOV r4, r5\n\t" + "MOV r5, #0x0\n\t" + "ADD r9, r9, #0x4\n\t" + "CMP r9, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_1024_mul_d_32_word%=\n\t" +#else + "BLT.N L_sp_1024_mul_d_32_word%=\n\t" +#endif + "STR r3, [%[r], #128]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) : - : "memory", "r4", "r5", "r6", "r8" + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "cc" ); - - return c; } -#endif /* WOLFSSL_SP_SMALL */ +#else /* Mul a by digit b into r. (r = a * b) * * r A single precision integer. * a A single precision integer. * b A single precision digit. */ -SP_NOINLINE static void sp_1024_mul_d_32(sp_digit* r, const sp_digit* a, - sp_digit b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_1024_mul_d_32(sp_digit* r_p, const sp_digit* a_p, sp_digit b_p) +#else +static void sp_1024_mul_d_32(sp_digit* r, const sp_digit* a, sp_digit b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register sp_digit b __asm__ ("r2") = (sp_digit)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + __asm__ __volatile__ ( - "add r9, %[a], #128\n\t" /* A[0] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r5, r3, r6, %[b]\n\t" - "mov r4, #0\n\t" - "str r5, [%[r]], #4\n\t" - /* A[0] * B - Done */ - "\n1:\n\t" - "mov r5, #0\n\t" - /* A[] * B */ - "ldr r6, [%[a]], #4\n\t" - "umull r6, r8, r6, %[b]\n\t" - "adds r3, r3, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc r5, r5, #0\n\t" - /* A[] * B - Done */ - "str r3, [%[r]], #4\n\t" - "mov r3, r4\n\t" - "mov r4, r5\n\t" - "cmp %[a], r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "str r3, [%[r]]\n\t" - : [r] "+r" (r), [a] "+r" (a) - : [b] "r" (b) - : "memory", "r3", "r4", "r5", "r6", "r8", "r9" + "LDM %[a]!, {r8}\n\t" + "UMULL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[1] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[2] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[3] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[4] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[5] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[6] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[7] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[8] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[9] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[10] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[11] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[12] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[13] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[14] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[15] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[16] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[17] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[18] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[19] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[20] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[21] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[22] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[23] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[24] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[25] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[26] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[27] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[28] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "MOV r3, #0x0\n\t" + /* A[29] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r5, r3, %[b], r8\n\t" + "STM %[r]!, {r5}\n\t" + "MOV r4, #0x0\n\t" + /* A[30] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r3, r4, %[b], r8\n\t" + "STM %[r]!, {r3}\n\t" + "MOV r5, #0x0\n\t" + /* A[31] * B */ + "LDM %[a]!, {r8}\n\t" + "UMLAL r4, r5, %[b], r8\n\t" + "STM %[r]!, {r4}\n\t" + "STR r5, [%[r]]\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); } +#endif /* WOLFSSL_SP_SMALL */ +#ifdef WOLFSSL_SP_USE_UDIV /* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) * * d1 The high order half of the number to divide. @@ -42634,49 +68773,134 @@ * * Note that this is an approximate div. It may give an answer 1 larger. */ -SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1, sp_digit d0, - sp_digit div) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r8, %[div], #16\n\t" + "ADD r5, r8, #0x1\n\t" + "UDIV r6, %[d1], r5\n\t" + "LSL r7, %[div], #16\n\t" + "LSL r6, r6, #16\n\t" + "UMULL r3, r4, %[div], r6\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "SUBS r3, %[d1], r5\n\t" + "SBC r9, r9, r9\n\t" + "ADD r9, r9, #0x1\n\t" + "RSB r10, r9, #0x0\n\t" + "LSL r9, r9, #16\n\t" + "AND r7, r7, r10\n\t" + "AND r8, r8, r10\n\t" + "SUBS %[d0], %[d0], r7\n\t" + "ADD r6, r6, r9\n\t" + "SBC %[d1], %[d1], r8\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "UMULL r3, r4, %[div], r3\n\t" + "SUBS %[d0], %[d0], r3\n\t" + "SBC %[d1], %[d1], r4\n\t" + "LSL r4, %[d1], #16\n\t" + "LSR r3, %[d0], #16\n\t" + "ORR r3, r3, r4\n\t" + "UDIV r3, r3, r5\n\t" + "ADD r6, r6, r3\n\t" + "MUL r3, %[div], r3\n\t" + "SUB %[d0], %[d0], r3\n\t" + "UDIV r3, %[d0], %[div]\n\t" + "ADD %[d1], r6, r3\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)d1; +} - __asm__ __volatile__ ( - "lsr r6, %[div], #16\n\t" - "add r6, r6, #1\n\t" - "udiv r4, %[d1], r6\n\t" - "lsl r8, r4, #16\n\t" - "umull r4, r5, %[div], r8\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r5, %[d1], r6\n\t" - "lsl r4, r5, #16\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "lsl r4, %[d1], #16\n\t" - "orr r4, r4, %[d0], lsr #16\n\t" - "udiv r4, r4, r6\n\t" - "add r8, r8, r4\n\t" - "umull r4, r5, %[div], r4\n\t" - "subs %[d0], %[d0], r4\n\t" - "sbc %[d1], %[d1], r5\n\t" - "udiv r4, %[d0], %[div]\n\t" - "add r8, r8, r4\n\t" - "mov %[r], r8\n\t" - : [r] "+r" (r) - : [d1] "r" (d1), [d0] "r" (d0), [div] "r" (div) - : "r4", "r5", "r6", "r8" +#else +/* Divide the double width number (d1|d0) by the divisor. (d1|d0 / div) + * + * d1 The high order half of the number to divide. + * d0 The low order half of the number to divide. + * div The divisor. + * returns the result of the division. + * + * Note that this is an approximate div. It may give an answer 1 larger. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1_p, sp_digit d0_p, sp_digit div_p) +#else +SP_NOINLINE static sp_digit div_1024_word_32(sp_digit d1, sp_digit d0, sp_digit div) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit d1 __asm__ ("r0") = (sp_digit)d1_p; + register sp_digit d0 __asm__ ("r1") = (sp_digit)d0_p; + register sp_digit div __asm__ ("r2") = (sp_digit)div_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LSR r5, %[div], #1\n\t" + "ADD r5, r5, #0x1\n\t" + "MOV r6, %[d0]\n\t" + "MOV r7, %[d1]\n\t" + /* Do top 32 */ + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "MOV r3, #0x0\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + /* Next 30 bits */ + "MOV r4, #0x1d\n\t" + "\n" + "L_div_1024_word_32_bit%=:\n\t" + "LSLS r6, r6, #1\n\t" + "ADC r7, r7, r7\n\t" + "SUBS r8, r5, r7\n\t" + "SBC r8, r8, r8\n\t" + "ADD r3, r3, r3\n\t" + "SUB r3, r3, r8\n\t" + "AND r8, r8, r5\n\t" + "SUBS r7, r7, r8\n\t" + "SUBS r4, r4, #0x1\n\t" + "bpl L_div_1024_word_32_bit%=\n\t" + "ADD r3, r3, r3\n\t" + "ADD r3, r3, #0x1\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "UMULL r6, r7, r3, %[div]\n\t" + "SUBS r9, %[d0], r6\n\t" + "SBC r10, %[d1], r7\n\t" + "ADD r3, r3, r10\n\t" + "SUBS r8, %[div], r9\n\t" + "SBC r8, r8, r8\n\t" + "SUB %[d1], r3, r8\n\t" + : [d1] "+r" (d1), [d0] "+r" (d0), [div] "+r" (div) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" ); - return r; + return (uint32_t)(size_t)d1; } +#endif /* AND m into each word of a and store in r. * * r A single precision integer. @@ -42714,44 +68938,401 @@ * return -ve, 0 or +ve if a is less than, equal to or greater than b * respectively. */ -SP_NOINLINE static sp_int32 sp_1024_cmp_32(const sp_digit* a, const sp_digit* b) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_int32 sp_1024_cmp_32(const sp_digit* a_p, const sp_digit* b_p) +#else +static sp_int32 sp_1024_cmp_32(const sp_digit* a, const sp_digit* b) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit r = 0; - - - __asm__ __volatile__ ( - "mov r3, #0\n\t" - "mvn r3, r3\n\t" - "mov r6, #124\n\t" - "\n1:\n\t" - "ldr r8, [%[a], r6]\n\t" - "ldr r5, [%[b], r6]\n\t" - "and r8, r8, r3\n\t" - "and r5, r5, r3\n\t" - "mov r4, r8\n\t" - "subs r8, r8, r5\n\t" - "sbc r8, r8, r8\n\t" - "add %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "subs r5, r5, r4\n\t" - "sbc r8, r8, r8\n\t" - "sub %[r], %[r], r8\n\t" - "mvn r8, r8\n\t" - "and r3, r3, r8\n\t" - "sub r6, r6, #4\n\t" - "cmp r6, #0\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bge 1b\n\t" -#else - "bge.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [r] "+r" (r) - : [a] "r" (a), [b] "r" (b) - : "r3", "r4", "r5", "r6", "r8" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register const sp_digit* a __asm__ ("r0") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r1") = (const sp_digit*)b_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r2, #0xffffffff\n\t" + "MOV r8, #0x1\n\t" + "MOV r7, #0x0\n\t" + "MOV r3, #0xffffffff\n\t" +#ifdef WOLFSSL_SP_SMALL + "MOV r6, #0x7c\n\t" + "\n" + "L_sp_1024_cmp_32_words%=:\n\t" + "LDR r4, [%[a], r6]\n\t" + "LDR r5, [%[b], r6]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "SUBS r6, r6, #0x4\n\t" + "bcs L_sp_1024_cmp_32_words%=\n\t" + "EOR r2, r2, r3\n\t" +#else + "LDR r4, [%[a], #124]\n\t" + "LDR r5, [%[b], #124]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #120]\n\t" + "LDR r5, [%[b], #120]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #116]\n\t" + "LDR r5, [%[b], #116]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #112]\n\t" + "LDR r5, [%[b], #112]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #108]\n\t" + "LDR r5, [%[b], #108]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #104]\n\t" + "LDR r5, [%[b], #104]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #100]\n\t" + "LDR r5, [%[b], #100]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #96]\n\t" + "LDR r5, [%[b], #96]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #92]\n\t" + "LDR r5, [%[b], #92]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #88]\n\t" + "LDR r5, [%[b], #88]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #84]\n\t" + "LDR r5, [%[b], #84]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #80]\n\t" + "LDR r5, [%[b], #80]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #76]\n\t" + "LDR r5, [%[b], #76]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #72]\n\t" + "LDR r5, [%[b], #72]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #68]\n\t" + "LDR r5, [%[b], #68]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #64]\n\t" + "LDR r5, [%[b], #64]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #60]\n\t" + "LDR r5, [%[b], #60]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #56]\n\t" + "LDR r5, [%[b], #56]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #52]\n\t" + "LDR r5, [%[b], #52]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #48]\n\t" + "LDR r5, [%[b], #48]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #44]\n\t" + "LDR r5, [%[b], #44]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #40]\n\t" + "LDR r5, [%[b], #40]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #36]\n\t" + "LDR r5, [%[b], #36]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #32]\n\t" + "LDR r5, [%[b], #32]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #28]\n\t" + "LDR r5, [%[b], #28]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #24]\n\t" + "LDR r5, [%[b], #24]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #20]\n\t" + "LDR r5, [%[b], #20]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #16]\n\t" + "LDR r5, [%[b], #16]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #12]\n\t" + "LDR r5, [%[b], #12]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #8]\n\t" + "LDR r5, [%[b], #8]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a], #4]\n\t" + "LDR r5, [%[b], #4]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[b]]\n\t" + "AND r4, r4, r3\n\t" + "AND r5, r5, r3\n\t" + "SUBS r4, r4, r5\n\t" + "IT hi\n\t" + "movhi r2, r8\n\t" + "IT lo\n\t" + "movlo r2, r3\n\t" + "IT ne\n\t" + "movne r3, r7\n\t" + "EOR r2, r2, r3\n\t" +#endif /*WOLFSSL_SP_SMALL */ + "MOV %[a], r2\n\t" + : [a] "+r" (a), [b] "+r" (b) + : + : "memory", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "cc" ); - - return r; + return (uint32_t)(size_t)a; } /* Divide d in a and put remainder into r (m*d + r = a) @@ -42763,8 +69344,8 @@ * r Remainder from the division. * returns MP_OKAY indicating success. */ -static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, sp_digit* m, - sp_digit* r) +static WC_INLINE int sp_1024_div_32(const sp_digit* a, const sp_digit* d, + sp_digit* m, sp_digit* r) { sp_digit t1[64], t2[33]; sp_digit div, r1; @@ -42897,14 +69478,14 @@ { #if DIGIT_BIT == 32 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 31); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 31); } #elif DIGIT_BIT > 32 unsigned int i; @@ -43082,113 +69663,537 @@ return err; } +#ifdef WOLFSSL_SP_NO_UMAAL /* Reduce the number back to 1024 bits using Montgomery reduction. * * a A single precision number to reduce in place. * m The single precision number representing the modulus. * mp The digit representing the negative inverse of m mod 2^n. */ -SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a, const sp_digit* m, - sp_digit mp) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit ca = 0; +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ __asm__ __volatile__ ( - "mov r9, %[mp]\n\t" - "mov r12, %[m]\n\t" - "mov r10, %[a]\n\t" - "mov r4, #0\n\t" - "add r11, r10, #128\n\t" - "\n1:\n\t" + "LDR lr, [%[m]]\n\t" + /* i = 0 */ + "MOV r11, #0x0\n\t" + "MOV r3, #0x0\n\t" + "LDR r4, [%[a]]\n\t" + "LDR r5, [%[a], #4]\n\t" + "\n" + "L_sp_1024_mont_reduce_32_word%=:\n\t" /* mu = a[i] * mp */ - "mov %[mp], r9\n\t" - "ldr %[a], [r10]\n\t" - "mul %[mp], %[mp], %[a]\n\t" - "mov %[m], r12\n\t" - "add r14, r10, #120\n\t" - "\n2:\n\t" - /* a[i+j] += m[j] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" - /* a[i+j+1] += m[j+1] * mu */ - "ldr %[a], [r10]\n\t" - "mov r4, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r4, r4, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r5, r5, %[a]\n\t" - "adc r4, r4, #0\n\t" - "str r5, [r10], #4\n\t" - "cmp r10, r14\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 2b\n\t" -#else - "blt.n 2b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ + "MUL r10, %[mp], r4\n\t" + /* a[i+0] += m[0] * mu */ + "MOV r7, #0x0\n\t" + "UMLAL r4, r7, r10, lr\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r9, [%[m], #4]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r5, r6, r10, r9\n\t" + "MOV r4, r5\n\t" + "ADDS r4, r4, r7\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r9, [%[m], #8]\n\t" + "LDR r5, [%[a], #8]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r5, r7, r10, r9\n\t" + "ADDS r5, r5, r6\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r9, [%[m], #12]\n\t" + "LDR r12, [%[a], #12]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #12]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r9, [%[m], #16]\n\t" + "LDR r12, [%[a], #16]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #16]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r9, [%[m], #20]\n\t" + "LDR r12, [%[a], #20]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #20]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r9, [%[m], #24]\n\t" + "LDR r12, [%[a], #24]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #24]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r9, [%[m], #28]\n\t" + "LDR r12, [%[a], #28]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #28]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r9, [%[m], #32]\n\t" + "LDR r12, [%[a], #32]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #32]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r9, [%[m], #36]\n\t" + "LDR r12, [%[a], #36]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #36]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r9, [%[m], #40]\n\t" + "LDR r12, [%[a], #40]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #40]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r9, [%[m], #44]\n\t" + "LDR r12, [%[a], #44]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #44]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r9, [%[m], #48]\n\t" + "LDR r12, [%[a], #48]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #48]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r9, [%[m], #52]\n\t" + "LDR r12, [%[a], #52]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #52]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r9, [%[m], #56]\n\t" + "LDR r12, [%[a], #56]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #56]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r9, [%[m], #60]\n\t" + "LDR r12, [%[a], #60]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #60]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r9, [%[m], #64]\n\t" + "LDR r12, [%[a], #64]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #64]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r9, [%[m], #68]\n\t" + "LDR r12, [%[a], #68]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #68]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r9, [%[m], #72]\n\t" + "LDR r12, [%[a], #72]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #72]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r9, [%[m], #76]\n\t" + "LDR r12, [%[a], #76]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #76]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r9, [%[m], #80]\n\t" + "LDR r12, [%[a], #80]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #80]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r9, [%[m], #84]\n\t" + "LDR r12, [%[a], #84]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #84]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r9, [%[m], #88]\n\t" + "LDR r12, [%[a], #88]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #88]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r9, [%[m], #92]\n\t" + "LDR r12, [%[a], #92]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #92]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r9, [%[m], #96]\n\t" + "LDR r12, [%[a], #96]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #96]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r9, [%[m], #100]\n\t" + "LDR r12, [%[a], #100]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #100]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r9, [%[m], #104]\n\t" + "LDR r12, [%[a], #104]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #104]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r9, [%[m], #108]\n\t" + "LDR r12, [%[a], #108]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #108]\n\t" + "ADC r6, r6, #0x0\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r9, [%[m], #112]\n\t" + "LDR r12, [%[a], #112]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #112]\n\t" + "ADC r7, r7, #0x0\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r9, [%[m], #116]\n\t" + "LDR r12, [%[a], #116]\n\t" + "MOV r6, #0x0\n\t" + "UMLAL r12, r6, r10, r9\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #116]\n\t" + "ADC r6, r6, #0x0\n\t" /* a[i+30] += m[30] * mu */ - "ldr %[a], [r10]\n\t" - "mov r5, #0\n\t" - /* Multiply m[j] and mu - Start */ - "ldr r8, [%[m]], #4\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds %[a], %[a], r6\n\t" - "adc r5, r5, r8\n\t" - /* Multiply m[j] and mu - Done */ - "adds r4, r4, %[a]\n\t" - "adc r5, r5, #0\n\t" - "str r4, [r10], #4\n\t" + "LDR r9, [%[m], #120]\n\t" + "LDR r12, [%[a], #120]\n\t" + "MOV r7, #0x0\n\t" + "UMLAL r12, r7, r10, r9\n\t" + "ADDS r12, r12, r6\n\t" + "STR r12, [%[a], #120]\n\t" + "ADC r7, r7, #0x0\n\t" /* a[i+31] += m[31] * mu */ - "mov r4, %[ca]\n\t" - "mov %[ca], #0\n\t" - /* Multiply m[31] and mu - Start */ - "ldr r8, [%[m]]\n\t" - "umull r6, r8, %[mp], r8\n\t" - "adds r5, r5, r6\n\t" - "adcs r4, r4, r8\n\t" - "adc %[ca], %[ca], #0\n\t" - /* Multiply m[31] and mu - Done */ - "ldr r6, [r10]\n\t" - "ldr r8, [r10, #4]\n\t" - "adds r6, r6, r5\n\t" - "adcs r8, r8, r4\n\t" - "adc %[ca], %[ca], #0\n\t" - "str r6, [r10]\n\t" - "str r8, [r10, #4]\n\t" - /* Next word in a */ - "sub r10, r10, #120\n\t" - "cmp r10, r11\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - "ldr r6, [%[m]]\n\t" - "subs r6, r6, r8\n\t" - "neg %[ca], %[ca]\n\t" - "sbc r6, r6, r6\n\t" - "orr %[ca], %[ca], r6\n\t" - "mov %[a], r10\n\t" - "mov %[m], r12\n\t" - : [ca] "+r" (ca), [a] "+r" (a) - : [m] "r" (m), [mp] "r" (mp) - : "memory", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12", "r14" + "LDR r9, [%[m], #124]\n\t" + "LDR r12, [%[a], #124]\n\t" + "UMULL r8, r9, r10, r9\n\t" + "ADDS r7, r7, r8\n\t" + "ADCS r6, r9, r3\n\t" + "MOV r3, #0x0\n\t" + "ADC r3, r3, r3\n\t" + "ADDS r12, r12, r7\n\t" + "STR r12, [%[a], #124]\n\t" + "LDR r12, [%[a], #128]\n\t" + "ADCS r12, r12, r6\n\t" + "STR r12, [%[a], #128]\n\t" + "ADC r3, r3, #0x0\n\t" + /* i += 1 */ + "ADD r11, r11, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r11, #0x80\n\t" +#ifdef __GNUC__ + "BLT L_sp_1024_mont_reduce_32_word%=\n\t" +#else + "BLT.W L_sp_1024_mont_reduce_32_word%=\n\t" +#endif + /* Loop Done */ + "STR r4, [%[a]]\n\t" + "STR r5, [%[a], #4]\n\t" + "LDR r8, [%[m], #124]\n\t" + "SUBS r12, r8, r12\n\t" + "neg r3, r3\n\t" + "SBC r12, r12, r12\n\t" + "ORR r3, r3, r12\n\t" + "MOV %[mp], r3\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" ); + sp_1024_cond_sub_32(a - 32, a, m, mp); +} + +#else +/* Reduce the number back to 1024 bits using Montgomery reduction. + * + * a A single precision number to reduce in place. + * m The single precision number representing the modulus. + * mp The digit representing the negative inverse of m mod 2^n. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a_p, const sp_digit* m_p, sp_digit mp_p) +#else +SP_NOINLINE static void sp_1024_mont_reduce_32(sp_digit* a, const sp_digit* m, sp_digit mp) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* a __asm__ ("r0") = (sp_digit*)a_p; + register const sp_digit* m __asm__ ("r1") = (const sp_digit*)m_p; + register sp_digit mp __asm__ ("r2") = (sp_digit)mp_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ - sp_1024_cond_sub_32(a - 32, a, m, ca); + __asm__ __volatile__ ( + /* i = 0 */ + "MOV r4, #0x0\n\t" + "MOV r5, #0x0\n\t" + "LDR r6, [%[a]]\n\t" + "LDR r7, [%[a], #4]\n\t" + "LDR r8, [%[a], #8]\n\t" + "LDR r9, [%[a], #12]\n\t" + "LDR r10, [%[a], #16]\n\t" + "\n" + "L_sp_1024_mont_reduce_32_word%=:\n\t" + /* mu = a[i] * mp */ + "MUL lr, %[mp], r6\n\t" + /* a[i+0] += m[0] * mu */ + "LDR r12, [%[m]]\n\t" + "MOV r3, #0x0\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+1] += m[1] * mu */ + "LDR r12, [%[m], #4]\n\t" + "MOV r6, r7\n\t" + "UMAAL r6, r3, lr, r12\n\t" + /* a[i+2] += m[2] * mu */ + "LDR r12, [%[m], #8]\n\t" + "MOV r7, r8\n\t" + "UMAAL r7, r3, lr, r12\n\t" + /* a[i+3] += m[3] * mu */ + "LDR r12, [%[m], #12]\n\t" + "MOV r8, r9\n\t" + "UMAAL r8, r3, lr, r12\n\t" + /* a[i+4] += m[4] * mu */ + "LDR r12, [%[m], #16]\n\t" + "MOV r9, r10\n\t" + "UMAAL r9, r3, lr, r12\n\t" + /* a[i+5] += m[5] * mu */ + "LDR r12, [%[m], #20]\n\t" + "LDR r10, [%[a], #20]\n\t" + "UMAAL r10, r3, lr, r12\n\t" + /* a[i+6] += m[6] * mu */ + "LDR r12, [%[m], #24]\n\t" + "LDR r11, [%[a], #24]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #24]\n\t" + /* a[i+7] += m[7] * mu */ + "LDR r12, [%[m], #28]\n\t" + "LDR r11, [%[a], #28]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #28]\n\t" + /* a[i+8] += m[8] * mu */ + "LDR r12, [%[m], #32]\n\t" + "LDR r11, [%[a], #32]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #32]\n\t" + /* a[i+9] += m[9] * mu */ + "LDR r12, [%[m], #36]\n\t" + "LDR r11, [%[a], #36]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #36]\n\t" + /* a[i+10] += m[10] * mu */ + "LDR r12, [%[m], #40]\n\t" + "LDR r11, [%[a], #40]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #40]\n\t" + /* a[i+11] += m[11] * mu */ + "LDR r12, [%[m], #44]\n\t" + "LDR r11, [%[a], #44]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #44]\n\t" + /* a[i+12] += m[12] * mu */ + "LDR r12, [%[m], #48]\n\t" + "LDR r11, [%[a], #48]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #48]\n\t" + /* a[i+13] += m[13] * mu */ + "LDR r12, [%[m], #52]\n\t" + "LDR r11, [%[a], #52]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #52]\n\t" + /* a[i+14] += m[14] * mu */ + "LDR r12, [%[m], #56]\n\t" + "LDR r11, [%[a], #56]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #56]\n\t" + /* a[i+15] += m[15] * mu */ + "LDR r12, [%[m], #60]\n\t" + "LDR r11, [%[a], #60]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #60]\n\t" + /* a[i+16] += m[16] * mu */ + "LDR r12, [%[m], #64]\n\t" + "LDR r11, [%[a], #64]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #64]\n\t" + /* a[i+17] += m[17] * mu */ + "LDR r12, [%[m], #68]\n\t" + "LDR r11, [%[a], #68]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #68]\n\t" + /* a[i+18] += m[18] * mu */ + "LDR r12, [%[m], #72]\n\t" + "LDR r11, [%[a], #72]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #72]\n\t" + /* a[i+19] += m[19] * mu */ + "LDR r12, [%[m], #76]\n\t" + "LDR r11, [%[a], #76]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #76]\n\t" + /* a[i+20] += m[20] * mu */ + "LDR r12, [%[m], #80]\n\t" + "LDR r11, [%[a], #80]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #80]\n\t" + /* a[i+21] += m[21] * mu */ + "LDR r12, [%[m], #84]\n\t" + "LDR r11, [%[a], #84]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #84]\n\t" + /* a[i+22] += m[22] * mu */ + "LDR r12, [%[m], #88]\n\t" + "LDR r11, [%[a], #88]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #88]\n\t" + /* a[i+23] += m[23] * mu */ + "LDR r12, [%[m], #92]\n\t" + "LDR r11, [%[a], #92]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #92]\n\t" + /* a[i+24] += m[24] * mu */ + "LDR r12, [%[m], #96]\n\t" + "LDR r11, [%[a], #96]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #96]\n\t" + /* a[i+25] += m[25] * mu */ + "LDR r12, [%[m], #100]\n\t" + "LDR r11, [%[a], #100]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #100]\n\t" + /* a[i+26] += m[26] * mu */ + "LDR r12, [%[m], #104]\n\t" + "LDR r11, [%[a], #104]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #104]\n\t" + /* a[i+27] += m[27] * mu */ + "LDR r12, [%[m], #108]\n\t" + "LDR r11, [%[a], #108]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #108]\n\t" + /* a[i+28] += m[28] * mu */ + "LDR r12, [%[m], #112]\n\t" + "LDR r11, [%[a], #112]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #112]\n\t" + /* a[i+29] += m[29] * mu */ + "LDR r12, [%[m], #116]\n\t" + "LDR r11, [%[a], #116]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #116]\n\t" + /* a[i+30] += m[30] * mu */ + "LDR r12, [%[m], #120]\n\t" + "LDR r11, [%[a], #120]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "STR r11, [%[a], #120]\n\t" + /* a[i+31] += m[31] * mu */ + "LDR r12, [%[m], #124]\n\t" + "LDR r11, [%[a], #124]\n\t" + "UMAAL r11, r3, lr, r12\n\t" + "LDR lr, [%[a], #128]\n\t" + "MOV r12, #0x0\n\t" + "UMAAL r3, lr, r12, r12\n\t" + "STR r11, [%[a], #124]\n\t" + "ADDS r3, r3, r5\n\t" + "ADC r5, lr, #0x0\n\t" + "STR r3, [%[a], #128]\n\t" + /* i += 1 */ + "ADD r4, r4, #0x4\n\t" + "ADD %[a], %[a], #0x4\n\t" + "CMP r4, #0x80\n\t" +#ifdef __GNUC__ + "BLT L_sp_1024_mont_reduce_32_word%=\n\t" +#else + "BLT.W L_sp_1024_mont_reduce_32_word%=\n\t" +#endif + /* Loop Done */ + "STR r6, [%[a]]\n\t" + "STR r7, [%[a], #4]\n\t" + "STR r8, [%[a], #8]\n\t" + "STR r9, [%[a], #12]\n\t" + "STR r10, [%[a], #16]\n\t" + "LDR r12, [%[m], #124]\n\t" + "SUBS r3, r12, r3\n\t" + "neg r5, r5\n\t" + "SBC r3, r3, r3\n\t" + "ORR r5, r5, r3\n\t" + "MOV %[mp], r5\n\t" + : [a] "+r" (a), [m] "+r" (m), [mp] "+r" (mp) + : + : "memory", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "lr", "cc" + ); + sp_1024_cond_sub_32(a - 32, a, m, mp); } +#endif /* Multiply two Montgomery form numbers mod the modulus (prime). * (r = a * b mod m) * @@ -43196,7 +70201,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -43210,7 +70215,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -43333,166 +70338,175 @@ * b Second number to add in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_1024_mont_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_1024_mont_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_1024_mont_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adds r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldr r14, [%[m], #124]\n\t" - "adc r12, r12, #0\n\t" - "subs r14, r14, r7\n\t" - "neg r12, r12\n\t" - "sbc r14, r14, r14\n\t" - "sub %[r], %[r], #128\n\t" - "orr r12, r14\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "subs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbc r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "sub %[r], %[r], #128\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register const sp_digit* m __asm__ ("r3") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r12, #0x0\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDR r11, [%[m], #124]\n\t" + "ADC r12, r12, #0x0\n\t" + "SUBS r11, r11, r7\n\t" + "neg r12, r12\n\t" + "SBC r11, r11, r11\n\t" + "SUB %[r], %[r], #0x80\n\t" + "ORR r12, r12, r11\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SUBS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBC r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } @@ -43502,149 +70516,158 @@ * a Number to double in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_1024_mont_dbl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_1024_mont_dbl_32(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldr r4, [%[m], #124]\n\t" - "adc r12, r12, #0\n\t" - "subs r4, r4, r14\n\t" - "neg r12, r12\n\t" - "sbc r4, r4, r4\n\t" - "sub %[r], %[r], #128\n\t" - "orr r12, r4\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "subs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbc r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "sub %[r], %[r], #128\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r12, #0x0\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDR r4, [%[m], #124]\n\t" + "ADC r12, r12, #0x0\n\t" + "SUBS r4, r4, r11\n\t" + "neg r12, r12\n\t" + "SBC r4, r4, r4\n\t" + "SUB %[r], %[r], #0x80\n\t" + "ORR r12, r12, r4\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SUBS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBC r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" + : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc" ); } @@ -43654,304 +70677,313 @@ * a Number to triple in Montgomery form. * m Modulus (prime). */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_1024_mont_tpl_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* m_p) +#else SP_NOINLINE static void sp_1024_mont_tpl_32(sp_digit* r, const sp_digit* a, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adds r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "adcs r4, r4, r4\n\t" - "adcs r5, r5, r5\n\t" - "adcs r6, r6, r6\n\t" - "adcs r7, r7, r7\n\t" - "adcs r8, r8, r8\n\t" - "adcs r9, r9, r9\n\t" - "adcs r10, r10, r10\n\t" - "adcs r14, r14, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7, r8, r9, r10, r14}\n\t" - "ldr r4, [%[m], #124]\n\t" - "adc r12, r12, #0\n\t" - "subs r4, r4, r14\n\t" - "neg r12, r12\n\t" - "sbc r4, r4, r4\n\t" - "sub %[r], %[r], #128\n\t" - "orr r12, r4\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "subs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbc r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "sub %[r], %[r], #128\n\t" - "sub %[m], %[m], #128\n\t" - "sub %[a], %[a], #128\n\t" - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adds r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "adcs r8, r8, r4\n\t" - "adcs r9, r9, r5\n\t" - "adcs r10, r10, r6\n\t" - "adcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldr r7, [%[m], #124]\n\t" - "adc r12, r12, #0\n\t" - "subs r7, r7, r14\n\t" - "neg r12, r12\n\t" - "sbc r7, r7, r7\n\t" - "sub %[r], %[r], #128\n\t" - "orr r12, r7\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "subs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbcs r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "ldm %[r], {r8, r9, r10, r14}\n\t" - "ldm %[m]!, {r4, r5, r6, r7}\n\t" - "and r4, r4, r12\n\t" - "and r5, r5, r12\n\t" - "and r6, r6, r12\n\t" - "and r7, r7, r12\n\t" - "sbcs r8, r8, r4\n\t" - "sbcs r9, r9, r5\n\t" - "sbcs r10, r10, r6\n\t" - "sbc r14, r14, r7\n\t" - "stm %[r]!, {r8, r9, r10, r14}\n\t" - "sub %[r], %[r], #128\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* m __asm__ ("r2") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r12, #0x0\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADDS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "ADCS r4, r4, r4\n\t" + "ADCS r5, r5, r5\n\t" + "ADCS r6, r6, r6\n\t" + "ADCS r7, r7, r7\n\t" + "ADCS r8, r8, r8\n\t" + "ADCS r9, r9, r9\n\t" + "ADCS r10, r10, r10\n\t" + "ADCS r11, r11, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7, r8, r9, r10, r11}\n\t" + "LDR r4, [%[m], #124]\n\t" + "ADC r12, r12, #0x0\n\t" + "SUBS r4, r4, r11\n\t" + "neg r12, r12\n\t" + "SBC r4, r4, r4\n\t" + "SUB %[r], %[r], #0x80\n\t" + "ORR r12, r12, r4\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SUBS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBC r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "SUB %[r], %[r], #0x80\n\t" + "SUB %[m], %[m], #0x80\n\t" + "SUB %[a], %[a], #0x80\n\t" + "MOV r12, #0x0\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADDS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r8, r9, r10, r11}\n\t" + "ADCS r8, r8, r4\n\t" + "ADCS r9, r9, r5\n\t" + "ADCS r10, r10, r6\n\t" + "ADCS r11, r11, r7\n\t" + "STM %[r]!, {r8, r9, r10, r11}\n\t" + "LDR r7, [%[m], #124]\n\t" + "ADC r12, r12, #0x0\n\t" + "SUBS r7, r7, r11\n\t" + "neg r12, r12\n\t" + "SBC r7, r7, r7\n\t" + "SUB %[r], %[r], #0x80\n\t" + "ORR r12, r12, r7\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SUBS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBC r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" + : "memory", "r8", "r9", "r10", "r11", "r4", "r5", "r6", "r7", "r12", "cc" ); } @@ -43962,165 +70994,173 @@ * b Number to subtract with in Montgomery form. * m Modulus (prime). */ -SP_NOINLINE static void sp_1024_mont_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b, - const sp_digit* m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +SP_NOINLINE static void sp_1024_mont_sub_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, const sp_digit* m_p) +#else +SP_NOINLINE static void sp_1024_mont_sub_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "mov r12, #0\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "subs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[a]!, {r4, r5, r6, r7}\n\t" - "ldm %[b]!, {r8, r9, r10, r14}\n\t" - "sbcs r4, r4, r8\n\t" - "sbcs r5, r5, r9\n\t" - "sbcs r6, r6, r10\n\t" - "sbcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "sbc r12, r12, r12\n\t" - "sub %[r], %[r], #128\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adds r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adcs r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "ldm %[r], {r4, r5, r6, r7}\n\t" - "ldm %[m]!, {r8, r9, r10, r14}\n\t" - "and r8, r8, r12\n\t" - "and r9, r9, r12\n\t" - "and r10, r10, r12\n\t" - "and r14, r14, r12\n\t" - "adcs r4, r4, r8\n\t" - "adcs r5, r5, r9\n\t" - "adcs r6, r6, r10\n\t" - "adc r7, r7, r14\n\t" - "stm %[r]!, {r4, r5, r6, r7}\n\t" - "sub %[r], %[r], #128\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register const sp_digit* m __asm__ ("r3") = (const sp_digit*)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SUBS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[a]!, {r4, r5, r6, r7}\n\t" + "LDM %[b]!, {r8, r9, r10, r11}\n\t" + "SBCS r4, r4, r8\n\t" + "SBCS r5, r5, r9\n\t" + "SBCS r6, r6, r10\n\t" + "SBCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "SBC r12, r12, r12\n\t" + "SUB %[r], %[r], #0x80\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADDS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADCS r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" + "LDM %[r], {r4, r5, r6, r7}\n\t" + "LDM %[m]!, {r8, r9, r10, r11}\n\t" + "AND r8, r8, r12\n\t" + "AND r9, r9, r12\n\t" + "AND r10, r10, r12\n\t" + "AND r11, r11, r12\n\t" + "ADCS r4, r4, r8\n\t" + "ADCS r5, r5, r9\n\t" + "ADCS r6, r6, r10\n\t" + "ADC r7, r7, r11\n\t" + "STM %[r]!, {r4, r5, r6, r7}\n\t" : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) : - : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r14", "r12" + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cc" ); } -#define sp_1024_mont_sub_lower_32 sp_1024_mont_sub_32 +#ifdef WOLFSSL_SP_SMALL /* Conditionally add a and b using the mask m. * m is -1 to add and 0 when not. * @@ -44129,172 +71169,333 @@ * b A single precision number to add. * m Mask value to apply. */ -SP_NOINLINE static sp_digit sp_1024_cond_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, - sp_digit m) +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_1024_cond_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r5, #128\n\t" - "mov r9, r5\n\t" - "mov r8, #0\n\t" - "\n1:\n\t" - "ldr r6, [%[b], r8]\n\t" - "and r6, r6, %[m]\n\t" - "adds r5, %[c], #-1\n\t" - "ldr r5, [%[a], r8]\n\t" - "adcs r5, r5, r6\n\t" - "mov %[c], #0\n\t" - "adcs %[c], %[c], %[c]\n\t" - "str r5, [%[r], r8]\n\t" - "add r8, r8, #4\n\t" - "cmp r8, r9\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "blt 1b\n\t" -#else - "blt.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c) - : [r] "r" (r), [a] "r" (a), [b] "r" (b), [m] "r" (m) - : "memory", "r5", "r6", "r8", "r9" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r5, #0x0\n\t" + "MOV r8, #0x0\n\t" + "MOV r4, #0x0\n\t" + "\n" + "L_sp_1024_cond_add_32_words%=:\n\t" + "ADDS r5, r5, #0xffffffff\n\t" + "LDR r6, [%[a], r4]\n\t" + "LDR r7, [%[b], r4]\n\t" + "AND r7, r7, %[m]\n\t" + "ADCS r6, r6, r7\n\t" + "ADC r5, r8, r8\n\t" + "STR r6, [%[r], r4]\n\t" + "ADD r4, r4, #0x4\n\t" + "CMP r4, #0x80\n\t" +#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) + "BLT L_sp_1024_cond_add_32_words%=\n\t" +#else + "BLT.N L_sp_1024_cond_add_32_words%=\n\t" +#endif + "MOV %[r], r5\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "cc" ); + return (uint32_t)(size_t)r; +} - return c; +#else +/* Conditionally add a and b using the mask m. + * m is -1 to add and 0 when not. + * + * r A single precision number representing conditional add result. + * a A single precision number to add with. + * b A single precision number to add. + * m Mask value to apply. + */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static sp_digit sp_1024_cond_add_32(sp_digit* r_p, const sp_digit* a_p, const sp_digit* b_p, sp_digit m_p) +#else +static sp_digit sp_1024_cond_add_32(sp_digit* r, const sp_digit* a, const sp_digit* b, sp_digit m) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ +{ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; + register const sp_digit* b __asm__ ("r2") = (const sp_digit*)b_p; + register sp_digit m __asm__ ("r3") = (sp_digit)m_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "MOV r10, #0x0\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADDS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "LDM %[a]!, {r6, r7}\n\t" + "LDM %[b]!, {r8, r9}\n\t" + "AND r8, r8, %[m]\n\t" + "AND r9, r9, %[m]\n\t" + "ADCS r6, r6, r8\n\t" + "ADCS r7, r7, r9\n\t" + "STM %[r]!, {r6, r7}\n\t" + "ADC %[r], r10, r10\n\t" + : [r] "+r" (r), [a] "+r" (a), [b] "+r" (b), [m] "+r" (m) + : + : "memory", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "cc" + ); + return (uint32_t)(size_t)r; } +#endif /* WOLFSSL_SP_SMALL */ +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG +static void sp_1024_rshift1_32(sp_digit* r_p, const sp_digit* a_p) +#else static void sp_1024_rshift1_32(sp_digit* r, const sp_digit* a) +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ { - __asm__ __volatile__ ( - "ldr r2, [%[a]]\n\t" - "ldr r3, [%[a], #4]\n\t" - "lsr r2, r2, #1\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #8]\n\t" - "str r2, [%[r], #0]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #12]\n\t" - "str r3, [%[r], #4]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #16]\n\t" - "str r4, [%[r], #8]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #20]\n\t" - "str r2, [%[r], #12]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #24]\n\t" - "str r3, [%[r], #16]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #28]\n\t" - "str r4, [%[r], #20]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #32]\n\t" - "str r2, [%[r], #24]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #36]\n\t" - "str r3, [%[r], #28]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #40]\n\t" - "str r4, [%[r], #32]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #44]\n\t" - "str r2, [%[r], #36]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #48]\n\t" - "str r3, [%[r], #40]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #52]\n\t" - "str r4, [%[r], #44]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #56]\n\t" - "str r2, [%[r], #48]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #60]\n\t" - "str r3, [%[r], #52]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #64]\n\t" - "str r4, [%[r], #56]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #68]\n\t" - "str r2, [%[r], #60]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #72]\n\t" - "str r3, [%[r], #64]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #76]\n\t" - "str r4, [%[r], #68]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #80]\n\t" - "str r2, [%[r], #72]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #84]\n\t" - "str r3, [%[r], #76]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #88]\n\t" - "str r4, [%[r], #80]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #92]\n\t" - "str r2, [%[r], #84]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #96]\n\t" - "str r3, [%[r], #88]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #100]\n\t" - "str r4, [%[r], #92]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #104]\n\t" - "str r2, [%[r], #96]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #108]\n\t" - "str r3, [%[r], #100]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #112]\n\t" - "str r4, [%[r], #104]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "ldr r4, [%[a], #116]\n\t" - "str r2, [%[r], #108]\n\t" - "orr r3, r3, r4, lsl #31\n\t" - "lsr r4, r4, #1\n\t" - "ldr r2, [%[a], #120]\n\t" - "str r3, [%[r], #112]\n\t" - "orr r4, r4, r2, lsl #31\n\t" - "lsr r2, r2, #1\n\t" - "ldr r3, [%[a], #124]\n\t" - "str r4, [%[r], #116]\n\t" - "orr r2, r2, r3, lsl #31\n\t" - "lsr r3, r3, #1\n\t" - "str r2, [%[r], #120]\n\t" - "str r3, [%[r], #124]\n\t" +#ifndef WOLFSSL_NO_VAR_ASSIGN_REG + register sp_digit* r __asm__ ("r0") = (sp_digit*)r_p; + register const sp_digit* a __asm__ ("r1") = (const sp_digit*)a_p; +#endif /* !WOLFSSL_NO_VAR_ASSIGN_REG */ + + __asm__ __volatile__ ( + "LDM %[a], {r2, r3}\n\t" + "LSR r2, r2, #1\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #8]\n\t" + "STR r2, [%[r]]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #12]\n\t" + "STR r3, [%[r], #4]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #16]\n\t" + "STR r4, [%[r], #8]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #20]\n\t" + "STR r2, [%[r], #12]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #24]\n\t" + "STR r3, [%[r], #16]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #28]\n\t" + "STR r4, [%[r], #20]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #32]\n\t" + "STR r2, [%[r], #24]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #36]\n\t" + "STR r3, [%[r], #28]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #40]\n\t" + "STR r4, [%[r], #32]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #44]\n\t" + "STR r2, [%[r], #36]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #48]\n\t" + "STR r3, [%[r], #40]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #52]\n\t" + "STR r4, [%[r], #44]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #56]\n\t" + "STR r2, [%[r], #48]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #60]\n\t" + "STR r3, [%[r], #52]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #64]\n\t" + "STR r4, [%[r], #56]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #68]\n\t" + "STR r2, [%[r], #60]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #72]\n\t" + "STR r3, [%[r], #64]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #76]\n\t" + "STR r4, [%[r], #68]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #80]\n\t" + "STR r2, [%[r], #72]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #84]\n\t" + "STR r3, [%[r], #76]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #88]\n\t" + "STR r4, [%[r], #80]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #92]\n\t" + "STR r2, [%[r], #84]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #96]\n\t" + "STR r3, [%[r], #88]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #100]\n\t" + "STR r4, [%[r], #92]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #104]\n\t" + "STR r2, [%[r], #96]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #108]\n\t" + "STR r3, [%[r], #100]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #112]\n\t" + "STR r4, [%[r], #104]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "LDR r4, [%[a], #116]\n\t" + "STR r2, [%[r], #108]\n\t" + "ORR r3, r3, r4, lsl #31\n\t" + "LSR r4, r4, #1\n\t" + "LDR r2, [%[a], #120]\n\t" + "STR r3, [%[r], #112]\n\t" + "ORR r4, r4, r2, lsl #31\n\t" + "LSR r2, r2, #1\n\t" + "LDR r3, [%[a], #124]\n\t" + "STR r4, [%[r], #116]\n\t" + "ORR r2, r2, r3, lsl #31\n\t" + "LSR r3, r3, #1\n\t" + "STR r2, [%[r], #120]\n\t" + "STR r3, [%[r], #124]\n\t" + : [r] "+r" (r), [a] "+r" (a) : - : [r] "r" (r), [a] "r" (a) - : "memory", "r2", "r3", "r4" + : "memory", "r2", "r3", "r4", "cc" ); } @@ -44304,7 +71505,7 @@ * a Number to divide. * m Modulus (prime). */ -SP_NOINLINE static void sp_1024_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m) +static void sp_1024_mont_div2_32(sp_digit* r, const sp_digit* a, const sp_digit* m) { sp_digit o; @@ -44357,7 +71558,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_32(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_32(t2, t2, p1024_mod); + sp_1024_mont_div2_32(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_32(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -44367,7 +71568,7 @@ /* X = X - Y */ sp_1024_mont_sub_32(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_32(y, y, x, p1024_mod); + sp_1024_mont_sub_32(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_32(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -44390,7 +71591,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_32_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_32_ctx* ctx = (sp_1024_proj_point_dbl_32_ctx*)sp_ctx->data; @@ -44464,7 +71666,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_32(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_32(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -44489,7 +71691,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -44514,149 +71716,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#ifdef WOLFSSL_SP_SMALL -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "mov r6, %[a]\n\t" - "add r6, r6, #128\n\t" - "\n1:\n\t" - "mov r5, #0\n\t" - "subs r5, r5, %[c]\n\t" - "ldr r4, [%[a]]\n\t" - "ldr r5, [%[b]]\n\t" - "sbcs r4, r4, r5\n\t" - "str r4, [%[r]]\n\t" - "sbc %[c], %[c], %[c]\n\t" - "add %[a], %[a], #4\n\t" - "add %[b], %[b], #4\n\t" - "add %[r], %[r], #4\n\t" - "cmp %[a], r6\n\t" -#if defined(__GNUC__) || defined(__ICCARM__) || defined(__IAR_SYSTEMS_ICC__) - "bne 1b\n\t" -#else - "bne.n 1b\n\t" -#endif /* __GNUC__ || __ICCARM__ || __IAR_SYSTEMS_ICC__ */ - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r4", "r5", "r6" - ); - - return c; -} - -#else -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -SP_NOINLINE static sp_digit sp_1024_sub_32(sp_digit* r, const sp_digit* a, - const sp_digit* b) -{ - sp_digit c = 0; - - __asm__ __volatile__ ( - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "subs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "ldm %[a]!, {r4, r5}\n\t" - "ldm %[b]!, {r6, r8}\n\t" - "sbcs r4, r4, r6\n\t" - "sbcs r5, r5, r8\n\t" - "stm %[r]!, {r4, r5}\n\t" - "sbc %[c], %[c], %[c]\n\t" - : [c] "+r" (c), [r] "+r" (r), [a] "+r" (a), [b] "+r" (b) - : - : "memory", "r4", "r5", "r6", "r8" - ); - - return c; -} - -#endif /* WOLFSSL_SP_SMALL */ /* Compare two numbers to determine if they are equal. * Constant time implementation. * @@ -44704,12 +71763,12 @@ static void sp_1024_proj_point_add_32(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*32; - sp_digit* t3 = t + 4*32; - sp_digit* t4 = t + 6*32; - sp_digit* t5 = t + 8*32; - sp_digit* t6 = t + 10*32; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*32; + sp_digit* t2 = t + 4*32; + sp_digit* t3 = t + 6*32; + sp_digit* t4 = t + 8*32; + sp_digit* t5 = t + 10*32; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_32(t1, q->z, p1024_mod, p1024_mp_mod); @@ -44731,17 +71790,9 @@ sp_1024_proj_point_dbl_32(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_32(t2, t2, t1, p1024_mod); @@ -44760,20 +71811,31 @@ sp_1024_mont_dbl_32(t3, y, p1024_mod); sp_1024_mont_sub_32(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_32(y, y, x, p1024_mod); + sp_1024_mont_sub_32(y, y, x, p1024_mod); sp_1024_mont_mul_32(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(y, y, t5, p1024_mod); - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -44819,12 +71881,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*32; - ctx->t3 = t + 4*32; - ctx->t4 = t + 6*32; - ctx->t5 = t + 8*32; - ctx->t6 = t + 10*32; + ctx->t6 = t; + ctx->t1 = t + 2*32; + ctx->t2 = t + 4*32; + ctx->t3 = t + 6*32; + ctx->t4 = t + 8*32; + ctx->t5 = t + 10*32; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -44931,7 +71993,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_32(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_32(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -44944,22 +72006,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -45119,8 +72187,6 @@ } #if defined(FP_ECC) || !defined(WOLFSSL_SP_SMALL) -#define sp_1024_mont_dbl_lower_32 sp_1024_mont_dbl_32 -#define sp_1024_mont_tpl_lower_32 sp_1024_mont_tpl_32 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -45159,7 +72225,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_32(a, t1, p1024_mod); + sp_1024_mont_tpl_32(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod); @@ -45168,8 +72234,8 @@ sp_1024_mont_dbl_32(t2, b, p1024_mod); sp_1024_mont_sub_32(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_32(b, t2, p1024_mod); + sp_1024_mont_sub_32(t2, b, x, p1024_mod); + sp_1024_mont_dbl_32(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -45189,7 +72255,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_32(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_32(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_32(a, t1, p1024_mod); + sp_1024_mont_tpl_32(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_32(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_32(b, t1, x, p1024_mod, p1024_mp_mod); @@ -45198,8 +72264,8 @@ sp_1024_mont_dbl_32(t2, b, p1024_mod); sp_1024_mont_sub_32(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_32(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_32(b, t2, p1024_mod); + sp_1024_mont_sub_32(t2, b, x, p1024_mod); + sp_1024_mont_dbl_32(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_32(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -45209,7 +72275,7 @@ sp_1024_mont_sub_32(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_32(y, y, p1024_mod); + sp_1024_mont_div2_32(y, y, p1024_mod); } /* Convert the projective point to affine. @@ -45255,12 +72321,12 @@ static void sp_1024_proj_point_add_qz1_32(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*32; - sp_digit* t3 = t + 4*32; - sp_digit* t4 = t + 6*32; - sp_digit* t5 = t + 8*32; - sp_digit* t6 = t + 10*32; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*32; + sp_digit* t6 = t + 4*32; + sp_digit* t1 = t + 6*32; + sp_digit* t4 = t + 8*32; + sp_digit* t5 = t + 10*32; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -45276,13 +72342,9 @@ sp_1024_proj_point_dbl_32(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_32(t2, t2, p->x, p1024_mod); @@ -45291,33 +72353,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_32(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_32(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_32(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_32(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_32(t1, t3, p1024_mod); - sp_1024_mont_sub_32(x, x, t1, p1024_mod); + sp_1024_mont_sqr_32(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_32(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_32(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_32(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_32(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_32(t5, t3, p1024_mod); + sp_1024_mont_sub_32(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_32(t3, t3, x, p1024_mod); + sp_1024_mont_sub_32(t3, t3, x, p1024_mod); sp_1024_mont_mul_32(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_32(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_32(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 32; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 32; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_32(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_32(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 32; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 32; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -45542,13 +72611,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -45619,8 +72690,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap); @@ -45641,10 +72712,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -45897,13 +72970,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -45974,8 +73049,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_32(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_fast_32(r, g, k, map, ct, heap); @@ -45996,10 +73071,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -49729,7 +76806,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -49751,7 +76828,7 @@ int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, + point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -49967,7 +77044,7 @@ return err; } -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -49993,7 +77070,7 @@ sp_1024_mont_add_32(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -52014,7 +79091,7 @@ } #endif /* WOLFSSL_SP_SMALL */ -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -52129,7 +79206,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_32(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_32(t1, ty, p1024_mod); + sp_1024_mont_div2_32(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_32(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -52149,7 +79226,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_32(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_32(t1, t1, p1024_mod); + sp_1024_mont_div2_32(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_32(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -52567,7 +79644,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_32(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_32(t1, ty, p1024_mod); + sp_1024_mont_div2_32(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_32(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -52605,7 +79682,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_32(p->y, p->y, p1024_mod); + sp_1024_mont_div2_32(p->y, p->y, p1024_mod); } /* Operations to perform based on order - 1. @@ -53416,7 +80493,7 @@ } } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -53445,19 +80522,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 32; + /* y^2 - x^3 - a.x = b */ sp_1024_sqr_32(t1, point->y); (void)sp_1024_mod_32(t1, t1, p1024_mod); sp_1024_sqr_32(t2, point->x); (void)sp_1024_mod_32(t2, t2, p1024_mod); sp_1024_mul_32(t2, t2, point->x); (void)sp_1024_mod_32(t2, t2, p1024_mod); - (void)sp_1024_sub_32(t2, p1024_mod, t2); - sp_1024_mont_add_32(t1, t1, t2, p1024_mod); + sp_1024_mont_sub_32(t1, t1, t2, p1024_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); sp_1024_mont_add_32(t1, t1, point->x, p1024_mod); + n = sp_1024_cmp_32(t1, p1024_mod); sp_1024_cond_sub_32(t1, t1, p1024_mod, ~(n >> 31)); sp_1024_norm_32(t1); @@ -53474,7 +80553,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_dsp32.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_dsp32.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_dsp32.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_dsp32.c 2024-08-03 07:30:00.000000000 +0000 @@ -1180,7 +1180,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ static void sp_256_mont_mul_10(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -1281,7 +1281,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ static void sp_256_mont_sqr_10(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -1297,7 +1297,7 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ static void sp_256_mont_sqr_n_10(sp_digit* r, const sp_digit* a, int n, const sp_digit* m, sp_digit mp) @@ -2620,8 +2620,10 @@ static THREAD_LS_T int sp_cache_inited = 0; #ifndef HAVE_THREAD_LS + static wolfSSL_Mutex sp_cache_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_lock); +#ifdef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex = 0; - static wolfSSL_Mutex sp_cache_lock; +#endif #endif static void sp_ecc_get_cache(const sp_point* g, sp_cache_t** cache) @@ -2701,10 +2703,12 @@ int err = MP_OKAY; #ifndef HAVE_THREAD_LS +#ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex == 0) { wc_InitMutex(&sp_cache_lock); initCacheMutex = 1; } +#endif if (wc_LockMutex(&sp_cache_lock) != 0) err = BAD_MUTEX_E; #endif /* HAVE_THREAD_LS */ @@ -4464,10 +4468,10 @@ u2 = u2d; tmp = tmpd; - XMEMCPY(u2, r, 40); - XMEMCPY(p2->x, x, 40); - XMEMCPY(p2->y, y, 40); - XMEMCPY(p2->z, z, 40); + XMEMCPY(u2, r, 40); + XMEMCPY(p2->x, x, 40); + XMEMCPY(p2->y, y, 40); + XMEMCPY(p2->z, z, 40); sp_256_mul_10(s, s, p256_norm_order); err = sp_256_mod_10(s, s, p256_order); @@ -4492,7 +4496,7 @@ /* (r + n*order).z'.z' mod prime == (u1.G + u2.Q)->x' */ /* Reload r and convert to Montgomery form. */ - XMEMCPY(u2, r, 40); + XMEMCPY(u2, r, 40); err = sp_256_mod_mul_norm_10(u2, u2, p256_mod); } @@ -4503,7 +4507,7 @@ *res = (int)(sp_256_cmp_10(p1->x, u1) == 0); if (*res == 0) { /* Reload r and add order. */ - XMEMCPY(u2, r, 40); + XMEMCPY(u2, r, 40); carry = sp_256_add_10(u2, u2, p256_order); /* Carry means result is greater than mod and is not valid. */ if (carry == 0) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_int.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_int.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_int.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_int.c 2024-08-03 07:30:00.000000000 +0000 @@ -115,6 +115,14 @@ #include +#if defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_SP_ASM) + /* force off unneeded vector register save/restore. */ + #undef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #undef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING +#endif + /* DECL_SP_INT: Declare one variable of type 'sp_int'. */ #if (defined(WOLFSSL_SMALL_STACK) || defined(SP_ALLOC)) && \ !defined(WOLFSSL_SP_NO_MALLOC) @@ -197,7 +205,7 @@ while (0) #else /* Nothing to do as declared on stack. */ - #define FREE_SP_INT(n, h) + #define FREE_SP_INT(n, h) WC_DO_NOTHING #endif @@ -318,7 +326,7 @@ FREE_DYN_SP_INT_ARRAY(n, h) #else /* Nothing to do as data declared on stack. */ - #define FREE_SP_INT_ARRAY(n, h) + #define FREE_SP_INT_ARRAY(n, h) WC_DO_NOTHING #endif @@ -854,7 +862,7 @@ "bsr %[a], %[i] \n\t" \ : [i] "=r" (vi) \ : [a] "r" (va) \ - : "cC" \ + : "cc" \ ) #ifndef WOLFSSL_SP_DIV_WORD_HALF @@ -1245,7 +1253,7 @@ : [a] "r" (va), [b] "r" (vb), [c] "r" (vc) \ : "cc" \ ) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH >= 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH >= 7) /* Count leading zeros - instruction only available on ARMv7 and newer. */ #define SP_ASM_LZCNT(va, vn) \ __asm__ __volatile__ ( \ @@ -1272,7 +1280,7 @@ sp_int_digit d) { sp_int_digit r = 0; -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) static const char debruijn32[32] = { 0, 31, 9, 30, 3, 8, 13, 29, 2, 5, 7, 21, 12, 24, 28, 19, 1, 10, 4, 14, 6, 22, 25, 20, 11, 15, 23, 26, 16, 27, 17, 18 @@ -1282,7 +1290,7 @@ __asm__ __volatile__ ( /* Shift d so that top bit is set. */ -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) "ldr r4, %[m]\n\t" "mov r5, %[d]\n\t" "orr r5, r5, r5, lsr #1\n\t" @@ -1291,8 +1299,8 @@ "orr r5, r5, r5, lsr #8\n\t" "orr r5, r5, r5, lsr #16\n\t" "add r5, r5, #1\n\t" - "mul r5, r5, r4\n\t" - "lsr r5, r5, #27\n\t" + "mul r6, r5, r4\n\t" + "lsr r5, r6, #27\n\t" "ldrb r5, [%[t], r5]\n\t" #else "clz r5, %[d]\n\t" @@ -1352,7 +1360,7 @@ "sbc r8, r8, r8\n\t" "sub %[r], %[r], r8\n\t" : [r] "+r" (r), [hi] "+r" (hi), [lo] "+r" (lo), [d] "+r" (d) -#if defined(WOLFSSL_SP_ARM_ARCH) && (WOLFSSL_SP_ARM_ARCH < 7) +#if defined(WOLFSSL_ARM_ARCH) && (WOLFSSL_ARM_ARCH < 7) : [t] "r" (debruijn32), [m] "m" (debruijn32_mul) #else : @@ -4770,7 +4778,7 @@ #if defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_HAVE_SP_DH) || \ defined(OPENSSL_ALL) -static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp); +static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct); #endif #if defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_HAVE_SP_DH) || \ defined(WOLFCRYPT_HAVE_ECCSI) || defined(WOLFCRYPT_HAVE_SAKKE) || \ @@ -4780,7 +4788,7 @@ /* Determine when mp_add_d is required. */ #if !defined(NO_PWDBASED) || defined(WOLFSSL_KEY_GEN) || !defined(NO_DH) || \ - !defined(NO_DSA) || \ + !defined(NO_DSA) || defined(HAVE_ECC) || \ (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \ defined(OPENSSL_EXTRA) #define WOLFSSL_SP_ADD_D @@ -4851,7 +4859,7 @@ #endif _sp_zero((sp_int*)am); - am->size = size; + a->size = size; } /* Initialize the multi-precision number to be zero with a given max size. @@ -5128,10 +5136,10 @@ /* Copy data - constant time. */ for (i = 0; i < used; i++) { - r1->dp[i] = (a1->dp[i] & ((sp_digit)wc_off_on_addr[y ])) + - (a2->dp[i] & ((sp_digit)wc_off_on_addr[y^1])); - r2->dp[i] = (a1->dp[i] & ((sp_digit)wc_off_on_addr[y^1])) + - (a2->dp[i] & ((sp_digit)wc_off_on_addr[y ])); + r1->dp[i] = (a1->dp[i] & ((sp_int_digit)wc_off_on_addr[y ])) + + (a2->dp[i] & ((sp_int_digit)wc_off_on_addr[y^1])); + r2->dp[i] = (a1->dp[i] & ((sp_int_digit)wc_off_on_addr[y^1])) + + (a2->dp[i] & ((sp_int_digit)wc_off_on_addr[y ])); } /* Copy used. */ r1->used = (a1->used & ((int)wc_off_on_addr[y ])) + @@ -5233,50 +5241,69 @@ * @param [in] b Second SP int to conditionally swap. * @param [in] cnt Count of words to copy. * @param [in] swap When value is 1 then swap. + * @param [in] t Temporary SP int to use in swap. * @return MP_OKAY on success. * @return MP_MEM when dynamic memory allocation fails. */ -int sp_cond_swap_ct(sp_int* a, sp_int* b, int cnt, int swap) +int sp_cond_swap_ct_ex(sp_int* a, sp_int* b, int cnt, int swap, sp_int* t) { unsigned int i; - int err = MP_OKAY; sp_int_digit mask = (sp_int_digit)0 - (sp_int_digit)swap; + + /* XOR other fields in sp_int into temp - mask set when swapping. */ + t->used = (a->used ^ b->used) & (unsigned int)mask; +#ifdef WOLFSSL_SP_INT_NEGATIVE + t->sign = (a->sign ^ b->sign) & (unsigned int)mask; +#endif + + /* XOR requested words into temp - mask set when swapping. */ + for (i = 0; i < (unsigned int)cnt; i++) { + t->dp[i] = (a->dp[i] ^ b->dp[i]) & mask; + } + + /* XOR temporary - when mask set then result will be b. */ + a->used ^= t->used; +#ifdef WOLFSSL_SP_INT_NEGATIVE + a->sign ^= t->sign; +#endif + for (i = 0; i < (unsigned int)cnt; i++) { + a->dp[i] ^= t->dp[i]; + } + + /* XOR temporary - when mask set then result will be a. */ + b->used ^= t->used; +#ifdef WOLFSSL_SP_INT_NEGATIVE + b->sign ^= b->sign; +#endif + for (i = 0; i < (unsigned int)cnt; i++) { + b->dp[i] ^= t->dp[i]; + } + + return MP_OKAY; +} + +/* Conditional swap of SP int values in constant time. + * + * @param [in] a First SP int to conditionally swap. + * @param [in] b Second SP int to conditionally swap. + * @param [in] cnt Count of words to copy. + * @param [in] swap When value is 1 then swap. + * @return MP_OKAY on success. + * @return MP_MEM when dynamic memory allocation fails. + */ +int sp_cond_swap_ct(sp_int* a, sp_int* b, int cnt, int swap) +{ + int err = MP_OKAY; DECL_SP_INT(t, (size_t)cnt); /* Allocate temporary to hold masked xor of a and b. */ ALLOC_SP_INT(t, cnt, err, NULL); - if (err == MP_OKAY) { - /* XOR other fields in sp_int into temp - mask set when swapping. */ - t->used = (a->used ^ b->used) & (unsigned int)mask; - #ifdef WOLFSSL_SP_INT_NEGATIVE - t->sign = (a->sign ^ b->sign) & (unsigned int)mask; - #endif - - /* XOR requested words into temp - mask set when swapping. */ - for (i = 0; i < (unsigned int)cnt; i++) { - t->dp[i] = (a->dp[i] ^ b->dp[i]) & mask; - } - /* XOR temporary - when mask set then result will be b. */ - a->used ^= t->used; - #ifdef WOLFSSL_SP_INT_NEGATIVE - a->sign ^= t->sign; - #endif - for (i = 0; i < (unsigned int)cnt; i++) { - a->dp[i] ^= t->dp[i]; - } - - /* XOR temporary - when mask set then result will be a. */ - b->used ^= t->used; - #ifdef WOLFSSL_SP_INT_NEGATIVE - b->sign ^= b->sign; - #endif - for (i = 0; i < (unsigned int)cnt; i++) { - b->dp[i] ^= t->dp[i]; - } + if (err == MP_OKAY) { + err = sp_cond_swap_ct_ex(a, b, cnt, swap, t); + FREE_SP_INT(t, NULL); } - FREE_SP_INT(t, NULL); return err; } #endif /* HAVE_ECC && ECC_TIMING_RESISTANT && !WC_NO_CACHE_RESISTANT */ @@ -5308,8 +5335,8 @@ (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) /* Compare absolute value of two multi-precision numbers. * - * @param [in] a SP integer. - * @param [in] b SP integer. + * @param [in] a SP integer. + * @param [in] b SP integer. * * @return MP_GT when a is greater than b. * @return MP_LT when a is less than b. @@ -5354,8 +5381,8 @@ * * Pointers are compared such that NULL is less than not NULL. * - * @param [in] a SP integer. - * @param [in] b SP integer. + * @param [in] a SP integer. + * @param [in] b SP integer. * * @return MP_GT when a is greater than b. * @return MP_LT when a is less than b. @@ -5389,13 +5416,14 @@ #if defined(WOLFSSL_SP_MATH_ALL) || defined(HAVE_ECC) || !defined(NO_DSA) || \ defined(OPENSSL_EXTRA) || !defined(NO_DH) || \ - (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) + (!defined(NO_RSA) && (!defined(WOLFSSL_RSA_VERIFY_ONLY) || \ + defined(WOLFSSL_KEY_GEN))) /* Compare two multi-precision numbers. * * Assumes a and b are not NULL. * - * @param [in] a SP integer. - * @param [in] a SP integer. + * @param [in] a SP integer. + * @param [in] b SP integer. * * @return MP_GT when a is greater than b. * @return MP_LT when a is less than b. @@ -5438,8 +5466,8 @@ * * Pointers are compared such that NULL is less than not NULL. * - * @param [in] a SP integer. - * @param [in] a SP integer. + * @param [in] a SP integer. + * @param [in] b SP integer. * * @return MP_GT when a is greater than b. * @return MP_LT when a is less than b. @@ -5471,13 +5499,87 @@ } #endif +#if defined(HAVE_ECC) && !defined(WC_NO_RNG) && \ + defined(WOLFSSL_ECC_GEN_REJECT_SAMPLING) +/* Compare two multi-precision numbers in constant time. + * + * Assumes a and b are not NULL. + * Assumes a and b are positive. + * + * @param [in] a SP integer. + * @param [in] b SP integer. + * @param [in] n Number of digits to compare. + * + * @return MP_GT when a is greater than b. + * @return MP_LT when a is less than b. + * @return MP_EQ when a is equals b. + */ +static int _sp_cmp_ct(const sp_int* a, const sp_int* b, unsigned int n) +{ + int ret = MP_EQ; + int i; + int mask = -1; + + for (i = n - 1; i >= 0; i--) { + sp_int_digit ad = a->dp[i] & ((sp_int_digit)0 - (i < (int)a->used)); + sp_int_digit bd = b->dp[i] & ((sp_int_digit)0 - (i < (int)b->used)); + + ret |= mask & ((0 - (ad < bd)) & MP_LT); + mask &= 0 - (ret == MP_EQ); + ret |= mask & ((0 - (ad > bd)) & MP_GT); + mask &= 0 - (ret == MP_EQ); + } + + return ret; +} + +/* Compare two multi-precision numbers in constant time. + * + * Pointers are compared such that NULL is less than not NULL. + * Assumes a and b are positive. + * Assumes a and b have n digits set at sometime. + * + * @param [in] a SP integer. + * @param [in] b SP integer. + * @param [in] n Number of digits to compare. + * + * @return MP_GT when a is greater than b. + * @return MP_LT when a is less than b. + * @return MP_EQ when a is equals b. + */ +int sp_cmp_ct(const sp_int* a, const sp_int* b, unsigned int n) +{ + int ret; + + /* Check pointers first. Both NULL returns equal. */ + if (a == b) { + ret = MP_EQ; + } + /* Nothing is smaller than something. */ + else if (a == NULL) { + ret = MP_LT; + } + /* Something is larger than nothing. */ + else if (b == NULL) { + ret = MP_GT; + } + else + { + /* Compare values - a and b are not NULL. */ + ret = _sp_cmp_ct(a, b, n); + } + + return ret; +} +#endif /* HAVE_ECC && !WC_NO_RNG && WOLFSSL_ECC_GEN_REJECT_SAMPLING */ + /************************* * Bit check/set functions *************************/ #if (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \ - (defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC)) || \ - defined(OPENSSL_EXTRA) + ((defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_SM2)) && \ + defined(HAVE_ECC)) || defined(OPENSSL_EXTRA) /* Check if a bit is set * * When a is NULL, result is 0. @@ -6327,7 +6429,7 @@ if (r > SP_HALF_MAX) { r = SP_HALF_MAX; } - /* Shift up result for trial division calucation. */ + /* Shift up result for trial division calculation. */ r <<= SP_HALF_SIZE; /* Calculate trial value. */ trial = r * (sp_int_word)d; @@ -6447,7 +6549,7 @@ } /* Sum digits of sum. */ t = (t >> SP_WORD_SIZE) + (t & SP_MASK); - /* Get top digit after multipling by (2^SP_WORD_SIZE) / 3. */ + /* Get top digit after multiplying by (2^SP_WORD_SIZE) / 3. */ tt = (sp_int_digit)((t * SP_DIV_3_CONST) >> SP_WORD_SIZE); /* Subtract trial division. */ tr = (sp_int_digit)(t - (sp_int_word)tt * 3); @@ -6479,7 +6581,7 @@ #ifndef SQR_MUL_ASM /* Combine remainder from last operation with this word. */ t = ((sp_int_word)tr << SP_WORD_SIZE) | a->dp[i]; - /* Get top digit after multipling by (2^SP_WORD_SIZE) / 3. */ + /* Get top digit after multiplying by (2^SP_WORD_SIZE) / 3. */ tt = (sp_int_digit)((t * SP_DIV_3_CONST) >> SP_WORD_SIZE); /* Subtract trial division. */ tr = (sp_int_digit)(t - (sp_int_word)tt * 3); @@ -6540,7 +6642,7 @@ #ifndef SQR_MUL_ASM /* Combine remainder from last operation with this word. */ t = ((sp_int_word)tr << SP_WORD_SIZE) | a->dp[i]; - /* Get top digit after multipling by (2^SP_WORD_SIZE) / 10. */ + /* Get top digit after multiplying by (2^SP_WORD_SIZE) / 10. */ tt = (sp_int_digit)((t * SP_DIV_10_CONST) >> SP_WORD_SIZE); /* Subtract trial division. */ tr = (sp_int_digit)(t - (sp_int_word)tt * 10); @@ -6566,7 +6668,7 @@ #ifndef SQR_MUL_ASM /* Combine remainder from last operation with this word. */ t = ((sp_int_word)tr << SP_WORD_SIZE) | a->dp[i]; - /* Get top digit after multipling by (2^SP_WORD_SIZE) / 10. */ + /* Get top digit after multiplying by (2^SP_WORD_SIZE) / 10. */ tt = (sp_int_digit)((t * SP_DIV_10_CONST) >> SP_WORD_SIZE); /* Subtract trial division. */ tr = (sp_int_digit)(t - (sp_int_word)tt * 10); @@ -6630,7 +6732,7 @@ #ifndef SQR_MUL_ASM /* Combine remainder from last operation with this word. */ t = ((sp_int_word)tr << SP_WORD_SIZE) | a->dp[i]; - /* Get top digit after multipling. */ + /* Get top digit after multiplying. */ tt = (sp_int_digit)((t * m) >> SP_WORD_SIZE); /* Subtract trial division. */ tr = (sp_int_digit)t - (sp_int_digit)(tt * d); @@ -6657,7 +6759,7 @@ #ifndef SQR_MUL_ASM /* Combine remainder from last operation with this word. */ t = ((sp_int_word)tr << SP_WORD_SIZE) | a->dp[i]; - /* Get top digit after multipling. */ + /* Get top digit after multiplying. */ tt = (sp_int_digit)((t * m) >> SP_WORD_SIZE); /* Subtract trial division. */ tr = (sp_int_digit)t - (sp_int_digit)(tt * d); @@ -6938,7 +7040,7 @@ #if defined(HAVE_ECC) || !defined(NO_DSA) || defined(OPENSSL_EXTRA) || \ (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \ - !defined(WOLFSSL_RSA_PUBLIC_ONLY)) + !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_SP_INVMOD) /* Divides a by 2 and stores in r: r = a >> 1 * * @param [in] a SP integer to divide. @@ -7654,6 +7756,23 @@ } #endif /* WOLFSSL_SP_MATH_ALL */ +/* Constant time clamping/ + * + * @param [in, out] a SP integer to clamp. + */ +static void sp_clamp_ct(sp_int* a) +{ + int i; + unsigned int used = a->used; + unsigned int mask = (unsigned int)-1; + + for (i = (int)a->used - 1; i >= 0; i--) { + used -= ((unsigned int)(a->dp[i] == 0)) & mask; + mask &= (unsigned int)0 - (a->dp[i] == 0); + } + a->used = used; +} + #if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC) /* Add two value and reduce: r = (a + b) % m * @@ -7807,7 +7926,7 @@ r->sign = MP_ZPOS; #endif /* WOLFSSL_SP_INT_NEGATIVE */ /* Remove leading zeros. */ - sp_clamp(r); + sp_clamp_ct(r); #if 0 sp_print(r, "rma"); @@ -7818,11 +7937,13 @@ } #endif /* WOLFSSL_SP_MATH_ALL && HAVE_ECC */ -#if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC) -/* Sub b from a and reduce: r = (a - b) % m - * Result is always positive. +#if (defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC)) || \ + (defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_HAVE_SP_DH) || \ + defined(WOLFCRYPT_HAVE_ECCSI) || defined(WOLFCRYPT_HAVE_SAKKE) || \ + defined(OPENSSL_ALL)) +/* Sub b from a modulo m: r = (a - b) % m * - * r = a - b (mod m) - constant time (a < m and b < m, a, b and m are positive) + * Result is always positive. * * Assumes a, b, m and r are not NULL. * m and r must not be the same pointer. @@ -7834,9 +7955,9 @@ * * @return MP_OKAY on success. */ -int sp_submod_ct(const sp_int* a, const sp_int* b, const sp_int* m, sp_int* r) +static void _sp_submod_ct(const sp_int* a, const sp_int* b, const sp_int* m, + unsigned int max, sp_int* r) { - int err = MP_OKAY; #ifndef SQR_MUL_ASM sp_int_sword w; #else @@ -7849,6 +7970,106 @@ sp_int_digit mask_b = (sp_int_digit)-1; unsigned int i; + /* In constant time, subtract b from a putting result in r. */ +#ifndef SQR_MUL_ASM + w = 0; +#else + l = 0; + h = 0; +#endif + for (i = 0; i < max; i++) { + /* Values past 'used' are not initialized. */ + mask_a += (i == a->used); + mask_b += (i == b->used); + + #ifndef SQR_MUL_ASM + /* Add a to and subtract b from current value. */ + w += a->dp[i] & mask_a; + w -= b->dp[i] & mask_b; + /* Store low digit in result. */ + r->dp[i] = (sp_int_digit)w; + /* Move high digit down. */ + w >>= DIGIT_BIT; + #else + /* Add a and subtract b from current value. */ + t = a->dp[i] & mask_a; + SP_ASM_ADDC_REG(l, h, t); + t = b->dp[i] & mask_b; + SP_ASM_SUBB_REG(l, h, t); + /* Store low digit in result. */ + r->dp[i] = l; + /* Move high digit down. */ + l = h; + /* High digit is 0 when positive or -1 on negative. */ + h = (sp_int_digit)0 - (l >> (SP_WORD_SIZE - 1)); + #endif + } + /* When w is negative then we need to add modulus to make result + * positive. */ +#ifndef SQR_MUL_ASM + mask = (sp_int_digit)0 - (w < 0); +#else + mask = h; +#endif + + /* Constant time, conditionally, add modulus to difference. */ +#ifndef SQR_MUL_ASM + w = 0; +#else + l = 0; +#endif + for (i = 0; i < m->used; i++) { + #ifndef SQR_MUL_ASM + /* Add result and conditionally modulus to current value. */ + w += r->dp[i]; + w += m->dp[i] & mask; + /* Store low digit in result. */ + r->dp[i] = (sp_int_digit)w; + /* Move high digit down. */ + w >>= DIGIT_BIT; + #else + h = 0; + /* Add result and conditionally modulus to current value. */ + SP_ASM_ADDC(l, h, r->dp[i]); + t = m->dp[i] & mask; + SP_ASM_ADDC_REG(l, h, t); + /* Store low digit in result. */ + r->dp[i] = l; + /* Move high digit down. */ + l = h; + #endif + } + /* Result will always have digits equal to or less than those in + * modulus. */ + r->used = i; +#ifdef WOLFSSL_SP_INT_NEGATIVE + r->sign = MP_ZPOS; +#endif /* WOLFSSL_SP_INT_NEGATIVE */ + /* Remove leading zeros. */ + sp_clamp_ct(r); +} +#endif + +#if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC) +/* Sub b from a modulo m: r = (a - b) % m + * Result is always positive. + * + * r = a - b (mod m) - constant time (a < m and b < m, a, b and m are positive) + * + * Assumes a, b, m and r are not NULL. + * m and r must not be the same pointer. + * + * @param [in] a SP integer to subtract from + * @param [in] b SP integer to subtract. + * @param [in] m SP integer that is the modulus. + * @param [out] r SP integer to hold result. + * + * @return MP_OKAY on success. + */ +int sp_submod_ct(const sp_int* a, const sp_int* b, const sp_int* m, sp_int* r) +{ + int err = MP_OKAY; + /* Check result is as big as modulus plus one digit. */ if (m->used > r->size) { err = MP_VAL; @@ -7865,82 +8086,7 @@ sp_print(m, "m"); #endif - /* In constant time, subtract b from a putting result in r. */ - #ifndef SQR_MUL_ASM - w = 0; - #else - l = 0; - h = 0; - #endif - for (i = 0; i < m->used; i++) { - /* Values past 'used' are not initialized. */ - mask_a += (i == a->used); - mask_b += (i == b->used); - - #ifndef SQR_MUL_ASM - /* Add a to and subtract b from current value. */ - w += a->dp[i] & mask_a; - w -= b->dp[i] & mask_b; - /* Store low digit in result. */ - r->dp[i] = (sp_int_digit)w; - /* Move high digit down. */ - w >>= DIGIT_BIT; - #else - /* Add a and subtract b from current value. */ - t = a->dp[i] & mask_a; - SP_ASM_ADDC_REG(l, h, t); - t = b->dp[i] & mask_b; - SP_ASM_SUBB_REG(l, h, t); - /* Store low digit in result. */ - r->dp[i] = l; - /* Move high digit down. */ - l = h; - /* High digit is 0 when positive or -1 on negative. */ - h = (sp_int_digit)0 - (l >> (SP_WORD_SIZE - 1)); - #endif - } - /* When w is negative then we need to add modulus to make result - * positive. */ - #ifndef SQR_MUL_ASM - mask = (sp_int_digit)0 - (w < 0); - #else - mask = h; - #endif - /* Constant time, conditionally, add modulus to difference. */ - #ifndef SQR_MUL_ASM - w = 0; - #else - l = 0; - #endif - for (i = 0; i < m->used; i++) { - #ifndef SQR_MUL_ASM - /* Add result and conditionally modulus to current value. */ - w += r->dp[i]; - w += m->dp[i] & mask; - /* Store low digit in result. */ - r->dp[i] = (sp_int_digit)w; - /* Move high digit down. */ - w >>= DIGIT_BIT; - #else - h = 0; - /* Add result and conditionally modulus to current value. */ - SP_ASM_ADDC(l, h, r->dp[i]); - t = m->dp[i] & mask; - SP_ASM_ADDC_REG(l, h, t); - /* Store low digit in result. */ - r->dp[i] = l; - /* Move high digit down. */ - l = h; - #endif - } - /* Result will always have digits equal to or less than those in - * modulus. */ - r->used = i; - #ifdef WOLFSSL_SP_INT_NEGATIVE - r->sign = MP_ZPOS; - #endif /* WOLFSSL_SP_INT_NEGATIVE */ - /* Remove leading zeros. */ - sp_clamp(r); + _sp_submod_ct(a, b, m, m->used, r); #if 0 sp_print(r, "rms"); @@ -7951,6 +8097,27 @@ } #endif /* WOLFSSL_SP_MATH_ALL && HAVE_ECC */ +#if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC) && \ + defined(WOLFSSL_ECC_BLIND_K) +void sp_xor_ct(const sp_int* a, const sp_int* b, int len, sp_int* r) +{ + if ((a != NULL) && (b != NULL) && (r != NULL)) { + unsigned int i; + + r->used = (len * 8 + SP_WORD_SIZE - 1) / SP_WORD_SIZE; + for (i = 0; i < r->used; i++) { + r->dp[i] = a->dp[i] ^ b->dp[i]; + } + i = (len * 8) % SP_WORD_SIZE; + if (i > 0) { + r->dp[r->used - 1] &= ((sp_int_digit)1 << i) - 1; + } + /* Remove leading zeros. */ + sp_clamp_ct(r); + } +} +#endif + /******************** * Shifting functoins ********************/ @@ -8725,9 +8892,9 @@ * * Optimised code for when number of digits in a and b are the same. * - * @param [in] a SP integer to mulitply. - * @param [in] b SP integer to mulitply by. - * @param [out] r SP integer to hod reult. + * @param [in] a SP integer to multiply. + * @param [in] b SP integer to multiply by. + * @param [out] r SP integer to hold result. * * @return MP_OKAY otherwise. * @return MP_MEM when dynamic memory allocation fails. @@ -8804,9 +8971,9 @@ /* Multiply a by b into r. r = a * b * - * @param [in] a SP integer to mulitply. - * @param [in] b SP integer to mulitply by. - * @param [out] r SP integer to hod reult. + * @param [in] a SP integer to multiply. + * @param [in] b SP integer to multiply by. + * @param [out] r SP integer to hold result. * * @return MP_OKAY otherwise. * @return MP_MEM when dynamic memory allocation fails. @@ -8882,9 +9049,9 @@ #else /* Multiply a by b into r. r = a * b * - * @param [in] a SP integer to mulitply. - * @param [in] b SP integer to mulitply by. - * @param [out] r SP integer to hod reult. + * @param [in] a SP integer to multiply. + * @param [in] b SP integer to multiply by. + * @param [out] r SP integer to hold result. * * @return MP_OKAY otherwise. * @return MP_MEM when dynamic memory allocation fails. @@ -12358,14 +12525,14 @@ _sp_init_size(pre[i], m->used * 2 + 1); err = sp_sqr(pre[i-1], pre[i]); if (err == MP_OKAY) { - err = _sp_mont_red(pre[i], m, mp); + err = _sp_mont_red(pre[i], m, mp, 0); } /* ..10 -> ..11 */ if (err == MP_OKAY) { err = sp_mul(pre[i], a, pre[i]); } if (err == MP_OKAY) { - err = _sp_mont_red(pre[i], m, mp); + err = _sp_mont_red(pre[i], m, mp, 0); } } } @@ -12397,7 +12564,7 @@ int bit = sp_is_bit_set(e, (unsigned int)i); /* 6.2. j += bit - * Update count of consequitive 1 bits. + * Update count of consecutive 1 bits. */ j += bit; /* 6.3. s += 1 @@ -12419,7 +12586,7 @@ /* 6.4.2.1. t = (t ^ 2) mod m */ err = sp_sqr(t, t); if (err == MP_OKAY) { - err = _sp_mont_red(t, m, mp); + err = _sp_mont_red(t, m, mp, 0); } } /* 6.4.3. s = 1 - bit */ @@ -12430,7 +12597,7 @@ err = sp_mul(t, pre[j-1], t); } if (err == MP_OKAY) { - err = _sp_mont_red(t, m, mp); + err = _sp_mont_red(t, m, mp, 0); } /* 6.4.5. j = 0 * Reset number of 1 bits seen. @@ -12446,7 +12613,7 @@ /* 7.1. t = (t ^ 2) mod m */ err = sp_sqr(t, t); if (err == MP_OKAY) { - err = _sp_mont_red(t, m, mp); + err = _sp_mont_red(t, m, mp, 0); } } } @@ -12455,7 +12622,7 @@ if (j > 0) { err = sp_mul(t, pre[j-1], r); if (err == MP_OKAY) { - err = _sp_mont_red(r, m, mp); + err = _sp_mont_red(r, m, mp, 0); } } /* 9. Else r = t */ @@ -12868,7 +13035,7 @@ t[3]); err = sp_sqr(t[3], t[3]); if (err == MP_OKAY) { - err = _sp_mont_red(t[3], m, mp); + err = _sp_mont_red(t[3], m, mp, 0); } _sp_copy(t[3], (sp_int*)(((size_t)t[0] & sp_off_on_addr[s^1]) + @@ -12888,7 +13055,7 @@ t[3]); err = sp_mul(t[3], t[2], t[3]); if (err == MP_OKAY) { - err = _sp_mont_red(t[3], m, mp); + err = _sp_mont_red(t[3], m, mp, 0); } _sp_copy(t[3], (sp_int*)(((size_t)t[0] & sp_off_on_addr[j^1]) + @@ -12897,7 +13064,7 @@ } if (err == MP_OKAY) { /* 7. t[1] = FromMont(t[1]) */ - err = _sp_mont_red(t[1], m, mp); + err = _sp_mont_red(t[1], m, mp, 0); /* Reduction implementation returns number to range: 0..m-1. */ } } @@ -12998,7 +13165,7 @@ /* 4.2. t[2] = t[0] * t[1] */ err = sp_mul(t[0], t[1], t[2]); if (err == MP_OKAY) { - err = _sp_mont_red(t[2], m, mp); + err = _sp_mont_red(t[2], m, mp, 0); } /* 4.3. t[3] = t[y] ^ 2 */ if (err == MP_OKAY) { @@ -13008,7 +13175,7 @@ err = sp_sqr(t[3], t[3]); } if (err == MP_OKAY) { - err = _sp_mont_red(t[3], m, mp); + err = _sp_mont_red(t[3], m, mp, 0); } /* 4.4. t[y] = t[3], t[y^1] = t[2] */ if (err == MP_OKAY) { @@ -13018,7 +13185,7 @@ if (err == MP_OKAY) { /* 5. t[0] = FromMont(t[0]) */ - err = _sp_mont_red(t[0], m, mp); + err = _sp_mont_red(t[0], m, mp, 0); /* Reduction implementation returns number to range: 0..m-1. */ } } @@ -13088,7 +13255,7 @@ DECL_SP_INT_ARRAY(t, m->used * 2 + 1, (1 << 6) + 1); /* Window bits based on number of pre-calculations versus number of loop - * calculcations. + * calculations. * Exponents for RSA and DH will result in 6-bit windows. */ if (bits > 450) { @@ -13170,7 +13337,7 @@ } /* Montgomery reduce square or multiplication result. */ if (err == MP_OKAY) { - err = _sp_mont_red(t[i], m, mp); + err = _sp_mont_red(t[i], m, mp, 0); } } @@ -13231,7 +13398,7 @@ for (j = 0; (j < winBits) && (err == MP_OKAY); j++) { err = sp_sqr(tr, tr); if (err == MP_OKAY) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); } } @@ -13240,14 +13407,14 @@ err = sp_mul(tr, t[y], tr); } if (err == MP_OKAY) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); } } } if (err == MP_OKAY) { /* 7. tr = FromMont(tr) */ - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); /* Reduction implementation returns number to range: 0..m-1. */ } } @@ -13456,7 +13623,7 @@ err = sp_sqr(tr, tr); if (err == MP_OKAY) { if (useMont) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); } else { err = sp_mod(tr, m, tr); @@ -13482,7 +13649,7 @@ /* 7. if Words(m) > 1 then tr = FromMont(tr) */ if ((err == MP_OKAY) && useMont) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); /* Reduction implementation returns number to range: 0..m-1. */ } if (err == MP_OKAY) { @@ -13777,7 +13944,7 @@ bits = sp_count_bits(e); /* Window bits based on number of pre-calculations versus number of loop - * calculcations. + * calculations. * Exponents for RSA and DH will result in 6-bit windows. * Note: for 4096-bit values, 7-bit window is slightly better. */ @@ -13814,7 +13981,7 @@ tr = t[preCnt + 0]; bm = t[preCnt + 1]; - /* Iniitialize all allocated */ + /* Initialize all allocated */ for (i = 0; i < preCnt; i++) { _sp_init_size(t[i], m->used * 2 + 1); } @@ -13861,7 +14028,7 @@ for (i = 1; (i < winBits) && (err == MP_OKAY); i++) { err = sp_sqr(t[0], t[0]); if (err == MP_OKAY) { - err = _sp_mont_red(t[0], m, mp); + err = _sp_mont_red(t[0], m, mp, 0); } } /* For each table entry after first. */ @@ -13869,7 +14036,7 @@ /* Multiply previous entry by the base in Mont form into table. */ err = sp_mul(t[i-1], bm, t[i]); if (err == MP_OKAY) { - err = _sp_mont_red(t[i], m, mp); + err = _sp_mont_red(t[i], m, mp, 0); } } @@ -13953,7 +14120,7 @@ for (; (err == MP_OKAY) && (sqrs > 0); sqrs--) { err = sp_sqr(tr, tr); if (err == MP_OKAY) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); } } @@ -13962,7 +14129,7 @@ break; } - /* 4.4. Get top window bits from expononent and drop. */ + /* 4.4. Get top window bits from exponent and drop. */ if (err == MP_OKAY) { if (c == 0) { /* Bits from next digit. */ @@ -13994,7 +14161,7 @@ err = sp_mul(tr, t[y], tr); } if (err == MP_OKAY) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); } } @@ -14008,7 +14175,7 @@ /* 5.1. Montogmery square result */ err = sp_sqr(tr, tr); if (err == MP_OKAY) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); } /* 5.2. If exponent bit set */ if ((err == MP_OKAY) && ((n >> c) & 1)) { @@ -14017,7 +14184,7 @@ */ err = sp_mul(tr, bm, tr); if (err == MP_OKAY) { - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); } } } @@ -14026,7 +14193,7 @@ if (err == MP_OKAY) { /* 6. Convert result back from Montgomery form. */ - err = _sp_mont_red(tr, m, mp); + err = _sp_mont_red(tr, m, mp, 0); /* Reduction implementation returns number to range: 0..m-1. */ } } @@ -14122,7 +14289,7 @@ /* 3.1. Montgomery square result. */ err = sp_sqr(t[0], t[0]); if (err == MP_OKAY) { - err = _sp_mont_red(t[0], m, mp); + err = _sp_mont_red(t[0], m, mp, 0); } if (err == MP_OKAY) { /* Get bit and index i. */ @@ -14132,14 +14299,14 @@ /* 3.2.1. Montgomery multiply result by Mont of base. */ err = sp_mul(t[0], t[1], t[0]); if (err == MP_OKAY) { - err = _sp_mont_red(t[0], m, mp); + err = _sp_mont_red(t[0], m, mp, 0); } } } } if (err == MP_OKAY) { /* 4. Convert from Montgomery form. */ - err = _sp_mont_red(t[0], m, mp); + err = _sp_mont_red(t[0], m, mp, 0); /* Reduction implementation returns number of range 0..m-1. */ } } @@ -14294,7 +14461,8 @@ } #endif /* WOLFSSL_SP_MATH_ALL && !WOLFSSL_RSA_VERIFY_ONLY */ -#if defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY) +#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \ + defined(HAVE_ECC) /* The bottom e bits: r = a & ((1 << e) - 1) * * @param [in] a SP integer to reduce. @@ -14364,7 +14532,7 @@ return err; } -#endif /* WOLFSSL_SP_MATH_ALL && !WOLFSSL_RSA_VERIFY_ONLY */ +#endif /* (WOLFSSL_SP_MATH_ALL && !WOLFSSL_RSA_VERIFY_ONLY)) || HAVE_ECC */ #if (defined(WOLFSSL_SP_MATH_ALL) && (!defined(WOLFSSL_RSA_VERIFY_ONLY) || \ !defined(NO_DH))) || defined(OPENSSL_ALL) @@ -14575,9 +14743,15 @@ } #endif if (err == MP_OKAY) { + #ifndef WOLFSSL_SP_INT_SQR_VOLATILE sp_int_word w; sp_int_word l; sp_int_word h; + #else + volatile sp_int_word w; + volatile sp_int_word l; + volatile sp_int_word h; + #endif #ifdef SP_WORD_OVERFLOW sp_int_word o; #endif @@ -16970,10 +17144,11 @@ * @param [in,out] a SP integer to Montgomery reduce. * @param [in] m SP integer that is the modulus. * @param [in] mp SP integer digit that is the bottom digit of inv(-m). + * @param [in] ct Indicates operation must be constant time. * * @return MP_OKAY on success. */ -static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp) +static int _sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp, int ct) { #if !defined(SQR_MUL_ASM) unsigned int i; @@ -16990,8 +17165,20 @@ bits = sp_count_bits(m); /* Adding numbers into m->used * 2 digits - zero out unused digits. */ - for (i = a->used; i < m->used * 2; i++) { - a->dp[i] = 0; +#ifndef WOLFSSL_NO_CT_OPS + if (ct) { + for (i = 0; i < m->used * 2; i++) { + a->dp[i] &= + (sp_int_digit) + (sp_int_sdigit)ctMaskIntGTE((int)(a->used-1), (int)i); + } + } + else +#endif /* !WOLFSSL_NO_CT_OPS */ + { + for (i = a->used; i < m->used * 2; i++) { + a->dp[i] = 0; + } } /* Special case when modulus is 1 digit or less. */ @@ -17062,15 +17249,28 @@ a->used = m->used * 2 + 1; } - /* Remove leading zeros. */ - sp_clamp(a); - /* 3. a >>= NumBits(m) */ - (void)sp_rshb(a, bits, a); - - /* 4. a = a mod m */ - if (_sp_cmp_abs(a, m) != MP_LT) { - _sp_sub_off(a, m, a, 0); + if (!ct) { + /* Remove leading zeros. */ + sp_clamp(a); + /* 3. a >>= NumBits(m) */ + (void)sp_rshb(a, bits, a); + /* 4. a = a mod m */ + if (_sp_cmp_abs(a, m) != MP_LT) { + _sp_sub_off(a, m, a, 0); + } } + else { + /* 3. a >>= NumBits(m) */ + (void)sp_rshb(a, bits, a); + /* Constant time clamping. */ + sp_clamp_ct(a); + + /* 4. a = a mod m + * Always subtract but at a too high offset if a is less than m. + */ + _sp_submod_ct(a, m, m, m->used + 1, a); + } + #if 0 sp_print(a, "rr"); @@ -17093,8 +17293,20 @@ bits = sp_count_bits(m); mask = ((sp_int_digit)1 << (bits & (SP_WORD_SIZE - 1))) - 1; - for (i = a->used; i < m->used * 2; i++) { - a->dp[i] = 0; +#ifndef WOLFSSL_NO_CT_OPS + if (ct) { + for (i = 0; i < m->used * 2; i++) { + a->dp[i] &= + (sp_int_digit) + (sp_int_sdigit)ctMaskIntGTE((int)(a->used-1), (int)i); + } + } + else +#endif + { + for (i = a->used; i < m->used * 2; i++) { + a->dp[i] = 0; + } } if (m->used <= 1) { @@ -17373,13 +17585,21 @@ a->used = m->used * 2 + 1; } - /* Remove leading zeros. */ - sp_clamp(a); - (void)sp_rshb(a, bits, a); + if (!ct) { + /* Remove leading zeros. */ + sp_clamp(a); + (void)sp_rshb(a, bits, a); + /* a = a mod m */ + if (_sp_cmp_abs(a, m) != MP_LT) { + _sp_sub_off(a, m, a, 0); + } + } + else { + (void)sp_rshb(a, bits, a); + /* Constant time clamping. */ + sp_clamp_ct(a); - /* a = a mod m */ - if (_sp_cmp_abs(a, m) != MP_LT) { - _sp_sub_off(a, m, a, 0); + _sp_submod_ct(a, m, m, m->used + 1, a); } #if 0 @@ -17397,11 +17617,12 @@ * @param [in,out] a SP integer to Montgomery reduce. * @param [in] m SP integer that is the modulus. * @param [in] mp SP integer digit that is the bottom digit of inv(-m). + * @param [in] ct Indicates operation must be constant time. * * @return MP_OKAY on success. * @return MP_VAL when a or m is NULL or m is zero. */ -int sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp) +int sp_mont_red_ex(sp_int* a, const sp_int* m, sp_int_digit mp, int ct) { int err; @@ -17409,13 +17630,18 @@ if ((a == NULL) || (m == NULL) || sp_iszero(m)) { err = MP_VAL; } +#ifdef WOLFSSL_SP_INT_NEGATIVE + else if ((a->sign == MP_NEG) || (m->sign == MP_NEG)) { + err = MP_VAL; + } +#endif /* Ensure a has enough space for calculation. */ else if (a->size < m->used * 2 + 1) { err = MP_VAL; } else { /* Perform Montogomery Reduction. */ - err = _sp_mont_red(a, m, mp); + err = _sp_mont_red(a, m, mp, ct); } return err; @@ -17598,7 +17824,7 @@ a->used = (inSz + SP_WORD_SIZEOF - 1) / SP_WORD_SIZEOF; #if defined(BIG_ENDIAN_ORDER) && !defined(WOLFSSL_SP_INT_DIGIT_ALIGN) - /* Data endian matches respresentation of number. + /* Data endian matches representation of number. * Directly copy if we don't have alignment issues. */ for (i = (int)(inSz-1); i > SP_WORD_SIZEOF-1; i -= SP_WORD_SIZEOF) { @@ -17660,7 +17886,7 @@ #endif /* LITTLE_ENDIAN_ORDER */ } #endif - sp_clamp(a); + sp_clamp_ct(a); } return err; @@ -17755,6 +17981,73 @@ return err; } +/* Convert the multi-precision number to an array of bytes in big-endian format. + * + * Constant-time implementation. + * + * The array must be large enough for encoded number - use mp_unsigned_bin_size + * to calculate the number of bytes required. + * Front-pads the output array with zeros to make number the size of the array. + * + * @param [in] a SP integer. + * @param [out] out Array to put encoding into. + * @param [in] outSz Size of the array in bytes. + * + * @return MP_OKAY on success. + * @return MP_VAL when a or out is NULL. + */ +int sp_to_unsigned_bin_len_ct(const sp_int* a, byte* out, int outSz) +{ + int err = MP_OKAY; + + /* Validate parameters. */ + if ((a == NULL) || (out == NULL) || (outSz < 0)) { + err = MP_VAL; + } + +#if SP_WORD_SIZE > 8 + if (err == MP_OKAY) { + /* Start at the end of the buffer - least significant byte. */ + int j; + unsigned int i; + sp_int_digit mask = (sp_int_digit)-1; + sp_int_digit d; + + /* Put each digit in. */ + i = 0; + for (j = outSz - 1; j >= 0; ) { + int b; + d = a->dp[i]; + /* Place each byte of a digit into the buffer. */ + for (b = 0; (j >= 0) && (b < SP_WORD_SIZEOF); b++) { + out[j--] = (byte)(d & mask); + d >>= 8; + } + mask &= (sp_int_digit)0 - (i < a->used - 1); + i += (unsigned int)(1 & mask); + } + } +#else + if ((err == MP_OKAY) && ((unsigned int)outSz < a->used)) { + err = MP_VAL; + } + if (err == MP_OKAY) { + unsigned int i; + int j; + sp_int_digit mask = (sp_int_digit)-1; + + i = 0; + for (j = outSz - 1; j >= 0; j--) { + out[j] = a->dp[i] & mask; + mask &= (sp_int_digit)0 - (i < a->used - 1); + i += (unsigned int)(1 & mask); + } + } +#endif + + return err; +} + #if defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && \ !defined(WOLFSSL_RSA_VERIFY_ONLY) /* Store the number in big-endian format in array at an offset. @@ -17804,6 +18097,8 @@ unsigned int s = 0; unsigned int j = 0; sp_int_digit d; + /* Skip whitespace at end of line */ + int eol_done = 0; /* Make all nibbles in digit 0. */ d = 0; @@ -17814,9 +18109,12 @@ int ch = (int)HexCharToByte(in[i]); /* Check for invalid character. */ if (ch < 0) { + if (!eol_done && CharIsWhiteSpace(in[i])) + continue; err = MP_VAL; break; } + eol_done = 1; /* Check whether we have filled the digit. */ if (s == SP_WORD_SIZE) { @@ -17882,10 +18180,12 @@ ch = in[i]; /* Check character is valid. */ if ((ch >= '0') && (ch <= '9')) { - /* Assume '0'..'9' are continuous valus as characters. */ + /* Assume '0'..'9' are continuous values as characters. */ ch -= '0'; } else { + if (CharIsWhiteSpace(ch)) + continue; /* Return error on invalid character. */ err = MP_VAL; break; @@ -18476,7 +18776,7 @@ * * @param [in] a SP integer to check. * @param [in] b SP integer that is a small prime. - * @param [out] result MP_YES when number is likey prime. + * @param [out] result MP_YES when number is likely prime. * MP_NO otherwise. * @param [in] n1 SP integer temporary. * @param [in] r SP integer temporary. @@ -19006,7 +19306,7 @@ * * a and b are positive integers. * - * Euclidian Algorithm: + * Euclidean Algorithm: * 1. If a > b then a = b, b = a * 2. u = a * 3. v = b % a @@ -19165,7 +19465,7 @@ return err; } -#endif /* WOLFSSL_SP_MATH_ALL && !NO_RSA && WOLFSSL_KEY_GEN */ +#endif /* !NO_RSA && WOLFSSL_KEY_GEN */ #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ (!defined(WC_RSA_BLINDING) || defined(HAVE_FIPS) || defined(HAVE_SELFTEST)) @@ -19291,7 +19591,8 @@ return err; } -#endif /* WOLFSSL_SP_MATH_ALL && !NO_RSA && WOLFSSL_KEY_GEN */ +#endif /* !NO_RSA && WOLFSSL_KEY_GEN && (!WC_RSA_BLINDING || HAVE_FIPS || + * HAVE_SELFTEST) */ /* Returns the run time settings. * @@ -19319,7 +19620,7 @@ */ void sp_memzero_add(const char* name, sp_int* sp) { - wc_MemZero_Add(name, sp->dp, sp->size * sizeof(sp_digit)); + wc_MemZero_Add(name, sp->dp, sp->size * sizeof(sp_int_digit)); } /* Check the memory in the data pointer for memory that must be zero. @@ -19328,7 +19629,7 @@ */ void sp_memzero_check(sp_int* sp) { - wc_MemZero_Check(sp->dp, sp->size * sizeof(sp_digit)); + wc_MemZero_Check(sp->dp, sp->size * sizeof(sp_int_digit)); } #endif /* WOLFSSL_CHECK_MEM_ZERO */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm32.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm32.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm32.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm32.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_arm32.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm64.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm64.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm64.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_arm64.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_arm64.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_armthumb.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_armthumb.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_armthumb.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_armthumb.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_armthumb.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c32.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c32.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c32.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c32.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_c32.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c64.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c64.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c64.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_c64.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_c64.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_cortexm.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_cortexm.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_cortexm.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_cortexm.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_cortexm.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_x86_64.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64_asm.S 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_sm2_x86_64_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,33 @@ +/* sp_sm2_x86_64_asm.S + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64.c 2024-08-03 07:30:00.000000000 +0000 @@ -52,6 +52,16 @@ #include +#ifdef __IAR_SYSTEMS_ICC__ +#define __asm__ asm +#define __volatile__ volatile +#define WOLFSSL_NO_VAR_ASSIGN_REG +#endif /* __IAR_SYSTEMS_ICC__ */ +#ifdef __KEIL__ +#define __asm__ __asm +#define __volatile__ volatile +#endif + #ifdef WOLFSSL_SP_X86_64_ASM #define SP_PRINT_NUM(var, name, total, words, bits) \ do { \ @@ -116,14 +126,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -334,7 +344,7 @@ #endif #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -400,7 +410,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -414,7 +424,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_16(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -823,7 +833,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -839,7 +849,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -1091,7 +1101,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -1105,7 +1115,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -1636,7 +1646,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_mul_avx2_32(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -1652,7 +1662,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_2048_mont_sqr_avx2_32(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -1919,9 +1929,9 @@ #else sp_digit a[32 * 5]; #endif - sp_digit* ah; - sp_digit* m; - sp_digit* r; + sp_digit* ah = NULL; + sp_digit* m = NULL; + sp_digit* r = NULL; sp_digit e = 0; int err = MP_OKAY; #ifdef HAVE_INTEL_AVX2 @@ -2130,9 +2140,9 @@ #else sp_digit d[32 * 4]; #endif - sp_digit* a; - sp_digit* m; - sp_digit* r; + sp_digit* a = NULL; + sp_digit* m = NULL; + sp_digit* r = NULL; int err = MP_OKAY; ASSERT_SAVED_VECTOR_REGISTERS(); @@ -2243,14 +2253,14 @@ #else sp_digit a[16 * 11]; #endif - sp_digit* p; - sp_digit* q; - sp_digit* dp; - sp_digit* dq; - sp_digit* qi; - sp_digit* tmpa; - sp_digit* tmpb; - sp_digit* r; + sp_digit* p = NULL; + sp_digit* q = NULL; + sp_digit* dp = NULL; + sp_digit* dq = NULL; + sp_digit* qi = NULL; + sp_digit* tmpa = NULL; + sp_digit* tmpb = NULL; + sp_digit* r = NULL; sp_digit c; int err = MP_OKAY; #ifdef HAVE_INTEL_AVX2 @@ -3079,14 +3089,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -3336,7 +3346,7 @@ #if (defined(WOLFSSL_HAVE_SP_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY)) || defined(WOLFSSL_HAVE_SP_DH) #endif /* (WOLFSSL_HAVE_SP_RSA & !WOLFSSL_RSA_PUBLIC_ONLY) | WOLFSSL_HAVE_SP_DH */ -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -3402,7 +3412,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_24(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -3416,7 +3426,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_24(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -3825,7 +3835,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_avx2_24(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -3841,7 +3851,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_avx2_24(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -4093,7 +4103,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_48(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -4107,7 +4117,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_48(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -4586,7 +4596,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_mul_avx2_48(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -4602,7 +4612,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_3072_mont_sqr_avx2_48(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -4817,9 +4827,9 @@ #else sp_digit a[48 * 5]; #endif - sp_digit* ah; - sp_digit* m; - sp_digit* r; + sp_digit* ah = NULL; + sp_digit* m = NULL; + sp_digit* r = NULL; sp_digit e = 0; int err = MP_OKAY; #ifdef HAVE_INTEL_AVX2 @@ -5028,9 +5038,9 @@ #else sp_digit d[48 * 4]; #endif - sp_digit* a; - sp_digit* m; - sp_digit* r; + sp_digit* a = NULL; + sp_digit* m = NULL; + sp_digit* r = NULL; int err = MP_OKAY; ASSERT_SAVED_VECTOR_REGISTERS(); @@ -5141,14 +5151,14 @@ #else sp_digit a[24 * 11]; #endif - sp_digit* p; - sp_digit* q; - sp_digit* dp; - sp_digit* dq; - sp_digit* qi; - sp_digit* tmpa; - sp_digit* tmpb; - sp_digit* r; + sp_digit* p = NULL; + sp_digit* q = NULL; + sp_digit* dp = NULL; + sp_digit* dq = NULL; + sp_digit* qi = NULL; + sp_digit* tmpa = NULL; + sp_digit* tmpb = NULL; + sp_digit* r = NULL; sp_digit c; int err = MP_OKAY; #ifdef HAVE_INTEL_AVX2 @@ -5977,14 +5987,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -6150,7 +6160,7 @@ } #endif -/* Caclulate the bottom digit of -1/a mod 2^n. +/* Calculate the bottom digit of -1/a mod 2^n. * * a A single precision number. * rho Bottom word of inverse. @@ -6217,7 +6227,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_64(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -6231,7 +6241,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_64(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -6710,7 +6720,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_mul_avx2_64(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -6726,7 +6736,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_4096_mont_sqr_avx2_64(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -6941,9 +6951,9 @@ #else sp_digit a[64 * 5]; #endif - sp_digit* ah; - sp_digit* m; - sp_digit* r; + sp_digit* ah = NULL; + sp_digit* m = NULL; + sp_digit* r = NULL; sp_digit e = 0; int err = MP_OKAY; #ifdef HAVE_INTEL_AVX2 @@ -7152,9 +7162,9 @@ #else sp_digit d[64 * 4]; #endif - sp_digit* a; - sp_digit* m; - sp_digit* r; + sp_digit* a = NULL; + sp_digit* m = NULL; + sp_digit* r = NULL; int err = MP_OKAY; ASSERT_SAVED_VECTOR_REGISTERS(); @@ -7265,14 +7275,14 @@ #else sp_digit a[32 * 11]; #endif - sp_digit* p; - sp_digit* q; - sp_digit* dp; - sp_digit* dq; - sp_digit* qi; - sp_digit* tmpa; - sp_digit* tmpb; - sp_digit* r; + sp_digit* p = NULL; + sp_digit* q = NULL; + sp_digit* dp = NULL; + sp_digit* dq = NULL; + sp_digit* qi = NULL; + sp_digit* tmpa = NULL; + sp_digit* tmpb = NULL; + sp_digit* r = NULL; sp_digit c; int err = MP_OKAY; #ifdef HAVE_INTEL_AVX2 @@ -8184,14 +8194,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -8397,10 +8407,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_4(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_4(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_4(r, a, m, mp); for (; n > 1; n--) { @@ -8591,14 +8601,14 @@ #ifdef __cplusplus extern "C" { #endif -extern void sp_256_mont_sub_lower_4(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m); +extern void sp_256_mont_div2_4(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif #ifdef __cplusplus extern "C" { #endif -extern void sp_256_div2_4(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_256_mont_rsb_sub_dbl_4(sp_digit* r, const sp_digit* a, sp_digit* b, const sp_digit* m); #ifdef __cplusplus } #endif @@ -8646,17 +8656,14 @@ /* T2 = Y * Y */ sp_256_mont_sqr_4(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_4(t2, t2, p256_mod); + sp_256_mont_div2_4(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_4(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ sp_256_mont_sqr_4(x, t1, p256_mod, p256_mp_mod); - /* X = X - Y */ - sp_256_mont_sub_4(x, x, y, p256_mod); - /* X = X - Y */ - sp_256_mont_sub_4(x, x, y, p256_mod); + /* X = X - 2*Y */ /* Y = Y - X */ - sp_256_mont_sub_lower_4(y, y, x, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, y, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_4(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -8679,7 +8686,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_4_ctx* ctx = (sp_256_proj_point_dbl_4_ctx*)sp_ctx->data; @@ -8753,7 +8761,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_4(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_4(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -8767,18 +8775,15 @@ ctx->state = 14; break; case 14: - /* X = X - Y */ - sp_256_mont_sub_4(ctx->x, ctx->x, ctx->y, p256_mod); + /* X = X - 2*Y */ + /* Y = Y - X */ + sp_256_mont_rsb_sub_dbl_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 15; break; case 15: - /* X = X - Y */ - sp_256_mont_sub_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 16; break; case 16: - /* Y = Y - X */ - sp_256_mont_sub_lower_4(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -8803,27 +8808,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#ifdef __cplusplus -extern "C" { -#endif -extern void sp_256_mont_tpl_lower_4(sp_digit* r, const sp_digit* a, const sp_digit* m); -#ifdef __cplusplus -} -#endif -#ifdef __cplusplus -extern "C" { -#endif -extern void sp_256_mont_sub_dbl_4(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m); -#ifdef __cplusplus -} -#endif -#ifdef __cplusplus -extern "C" { -#endif -extern void sp_256_mont_dbl_sub_4(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m); -#ifdef __cplusplus -} -#endif /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -8861,15 +8845,15 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_4(a, t1, p256_mod); + sp_256_mont_tpl_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod); /* X = A^2 - 2B */ sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_4(b, b, x, p256_mod); + sp_256_mont_dbl_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -8889,15 +8873,15 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_4(a, t1, p256_mod); + sp_256_mont_tpl_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod); /* X = A^2 - 2B */ sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_4(b, b, x, p256_mod); + sp_256_mont_dbl_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_4(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -8907,7 +8891,7 @@ sp_256_mont_sub_4(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_4(y, y, p256_mod); + sp_256_mont_div2_4(y, y, p256_mod); } /* Compare two numbers to determine if they are equal. @@ -8945,12 +8929,12 @@ static void sp_256_proj_point_add_4(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*4; - sp_digit* t3 = t + 4*4; - sp_digit* t4 = t + 6*4; - sp_digit* t5 = t + 8*4; - sp_digit* t6 = t + 10*4; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*4; + sp_digit* t2 = t + 4*4; + sp_digit* t3 = t + 6*4; + sp_digit* t4 = t + 8*4; + sp_digit* t5 = t + 10*4; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_4(t1, q->z, p256_mod, p256_mp_mod); @@ -8972,17 +8956,9 @@ sp_256_proj_point_dbl_4(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_4(t2, t2, t1, p256_mod); @@ -8998,22 +8974,32 @@ sp_256_mont_sqr_4(x, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_4(x, x, t5, p256_mod); sp_256_mont_mul_4(t5, t5, t3, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, y, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_4(y, y, x, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, y, p256_mod); sp_256_mont_mul_4(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_4(y, y, t5, p256_mod); - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 4; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -9059,12 +9045,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*4; - ctx->t3 = t + 4*4; - ctx->t4 = t + 6*4; - ctx->t5 = t + 8*4; - ctx->t6 = t + 10*4; + ctx->t6 = t; + ctx->t1 = t + 2*4; + ctx->t2 = t + 4*4; + ctx->t3 = t + 6*4; + ctx->t4 = t + 8*4; + ctx->t5 = t + 10*4; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -9165,12 +9151,11 @@ ctx->state = 20; break; case 20: - sp_256_mont_sub_dbl_4(ctx->x, ctx->x, ctx->y, p256_mod); + /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ + sp_256_mont_rsb_sub_dbl_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 21; break; case 21: - /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_4(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -9183,22 +9168,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 4; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -9256,16 +9247,16 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_4(a, t1, p256_mod); + sp_256_mont_tpl_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_4(b, t1, x, p256_mod, p256_mp_mod); x = r[j].x; /* X = A^2 - 2B */ sp_256_mont_sqr_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_4(b, b, x, p256_mod); + sp_256_mont_dbl_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_4(r[j].z, z, y, p256_mod, p256_mp_mod); z = r[j].z; @@ -9279,7 +9270,7 @@ sp_256_mont_mul_4(y, b, a, p256_mod, p256_mp_mod); sp_256_mont_sub_4(y, y, t1, p256_mod); /* Y = Y/2 */ - sp_256_div2_4(r[j].y, y, p256_mod); + sp_256_mont_div2_4(r[j].y, y, p256_mod); r[j].infinity = 0; } } @@ -9353,8 +9344,8 @@ sp_256_mont_sub_4(xs, xs, t1, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_256_mont_sub_lower_4(ys, ya, xs, p256_mod); - sp_256_mont_sub_lower_4(ya, ya, xa, p256_mod); + sp_256_mont_sub_4(ys, ya, xs, p256_mod); + sp_256_mont_sub_4(ya, ya, xa, p256_mod); sp_256_mont_mul_4(ya, ya, t4, p256_mod, p256_mp_mod); sp_256_sub_4(t6, p256_mod, t6); sp_256_mont_mul_4(ys, ys, t6, p256_mod, p256_mp_mod); @@ -9488,7 +9479,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * + t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -9616,10 +9607,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_256_mont_sqr_n_avx2_4(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_256_mont_sqr_n_avx2_4(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_256_mont_sqr_avx2_4(r, a, m, mp); for (; n > 1; n--) { @@ -9709,7 +9700,7 @@ #ifdef __cplusplus extern "C" { #endif -extern void sp_256_mont_reduce_avx2_order_4(sp_digit* a, const sp_digit* m, sp_digit mp); +extern void sp_256_mont_reduce_order_avx2_4(sp_digit* a, const sp_digit* m, sp_digit mp); #ifdef __cplusplus } #endif @@ -9757,14 +9748,14 @@ #define sp_256_mont_dbl_avx2_4 sp_256_mont_dbl_4 #define sp_256_mont_tpl_avx2_4 sp_256_mont_tpl_4 #define sp_256_mont_sub_avx2_4 sp_256_mont_sub_4 -#define sp_256_mont_sub_lower_avx2_4 sp_256_mont_sub_lower_4 #ifdef __cplusplus extern "C" { #endif -extern void sp_256_div2_avx2_4(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_256_mont_div2_avx2_4(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif +#define sp_256_mont_rsb_sub_dbl_avx2_4 sp_256_mont_rsb_sub_dbl_4 /* Double the Montgomery form projective point p. * * r Result of doubling point. @@ -9809,17 +9800,14 @@ /* T2 = Y * Y */ sp_256_mont_sqr_avx2_4(t2, y, p256_mod, p256_mp_mod); /* T2 = T2/2 */ - sp_256_div2_avx2_4(t2, t2, p256_mod); + sp_256_mont_div2_avx2_4(t2, t2, p256_mod); /* Y = Y * X */ sp_256_mont_mul_avx2_4(y, y, p->x, p256_mod, p256_mp_mod); /* X = T1 * T1 */ sp_256_mont_sqr_avx2_4(x, t1, p256_mod, p256_mp_mod); - /* X = X - Y */ - sp_256_mont_sub_avx2_4(x, x, y, p256_mod); - /* X = X - Y */ - sp_256_mont_sub_avx2_4(x, x, y, p256_mod); + /* X = X - 2*Y */ /* Y = Y - X */ - sp_256_mont_sub_lower_avx2_4(y, y, x, p256_mod); + sp_256_mont_rsb_sub_dbl_avx2_4(x, x, y, p256_mod); /* Y = Y * T1 */ sp_256_mont_mul_avx2_4(y, y, t1, p256_mod, p256_mp_mod); /* Y = Y - T2 */ @@ -9842,7 +9830,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_256_proj_point_dbl_avx2_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, const sp_point_256* p, sp_digit* t) +static int sp_256_proj_point_dbl_avx2_4_nb(sp_ecc_ctx_t* sp_ctx, sp_point_256* r, + const sp_point_256* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_256_proj_point_dbl_avx2_4_ctx* ctx = (sp_256_proj_point_dbl_avx2_4_ctx*)sp_ctx->data; @@ -9916,7 +9905,7 @@ break; case 11: /* T2 = T2/2 */ - sp_256_div2_avx2_4(ctx->t2, ctx->t2, p256_mod); + sp_256_mont_div2_avx2_4(ctx->t2, ctx->t2, p256_mod); ctx->state = 12; break; case 12: @@ -9930,18 +9919,15 @@ ctx->state = 14; break; case 14: - /* X = X - Y */ - sp_256_mont_sub_avx2_4(ctx->x, ctx->x, ctx->y, p256_mod); + /* X = X - 2*Y */ + /* Y = Y - X */ + sp_256_mont_rsb_sub_dbl_avx2_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 15; break; case 15: - /* X = X - Y */ - sp_256_mont_sub_avx2_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 16; break; case 16: - /* Y = Y - X */ - sp_256_mont_sub_lower_avx2_4(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 17; break; case 17: @@ -9966,9 +9952,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_256_mont_tpl_lower_avx2_4 sp_256_mont_tpl_lower_4 -#define sp_256_mont_sub_dbl_avx2_4 sp_256_mont_sub_dbl_4 -#define sp_256_mont_dbl_sub_avx2_4 sp_256_mont_dbl_sub_4 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -10006,15 +9989,15 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_avx2_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_avx2_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_avx2_4(a, t1, p256_mod); + sp_256_mont_tpl_avx2_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_avx2_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_avx2_4(b, t1, x, p256_mod, p256_mp_mod); /* X = A^2 - 2B */ sp_256_mont_sqr_avx2_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_avx2_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_avx2_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_avx2_4(b, b, x, p256_mod); + sp_256_mont_dbl_avx2_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_avx2_4(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -10034,15 +10017,15 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_avx2_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_avx2_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_avx2_4(a, t1, p256_mod); + sp_256_mont_tpl_avx2_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_avx2_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_avx2_4(b, t1, x, p256_mod, p256_mp_mod); /* X = A^2 - 2B */ sp_256_mont_sqr_avx2_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_avx2_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_avx2_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_avx2_4(b, b, x, p256_mod); + sp_256_mont_dbl_avx2_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_avx2_4(z, z, y, p256_mod, p256_mp_mod); /* t1 = Y^4 */ @@ -10052,7 +10035,7 @@ sp_256_mont_sub_avx2_4(y, y, t1, p256_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_256_div2_avx2_4(y, y, p256_mod); + sp_256_mont_div2_avx2_4(y, y, p256_mod); } @@ -10066,12 +10049,12 @@ static void sp_256_proj_point_add_avx2_4(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*4; - sp_digit* t3 = t + 4*4; - sp_digit* t4 = t + 6*4; - sp_digit* t5 = t + 8*4; - sp_digit* t6 = t + 10*4; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*4; + sp_digit* t2 = t + 4*4; + sp_digit* t3 = t + 6*4; + sp_digit* t4 = t + 8*4; + sp_digit* t5 = t + 10*4; /* U1 = X1*Z2^2 */ sp_256_mont_sqr_avx2_4(t1, q->z, p256_mod, p256_mp_mod); @@ -10093,17 +10076,9 @@ sp_256_proj_point_dbl_avx2_4(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_256_mont_sub_avx2_4(t2, t2, t1, p256_mod); @@ -10119,22 +10094,32 @@ sp_256_mont_sqr_avx2_4(x, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_avx2_4(x, x, t5, p256_mod); sp_256_mont_mul_avx2_4(t5, t5, t3, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_avx2_4(x, x, y, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_avx2_4(y, y, x, p256_mod); + sp_256_mont_rsb_sub_dbl_avx2_4(x, x, y, p256_mod); sp_256_mont_mul_avx2_4(y, y, t4, p256_mod, p256_mp_mod); sp_256_mont_sub_avx2_4(y, y, t5, p256_mod); - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 4; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -10180,12 +10165,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*4; - ctx->t3 = t + 4*4; - ctx->t4 = t + 6*4; - ctx->t5 = t + 8*4; - ctx->t6 = t + 10*4; + ctx->t6 = t; + ctx->t1 = t + 2*4; + ctx->t2 = t + 4*4; + ctx->t3 = t + 6*4; + ctx->t4 = t + 8*4; + ctx->t5 = t + 10*4; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -10286,12 +10271,11 @@ ctx->state = 20; break; case 20: - sp_256_mont_sub_dbl_avx2_4(ctx->x, ctx->x, ctx->y, p256_mod); + /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ + sp_256_mont_rsb_sub_dbl_avx2_4(ctx->x, ctx->x, ctx->y, p256_mod); ctx->state = 21; break; case 21: - /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_256_mont_sub_lower_avx2_4(ctx->y, ctx->y, ctx->x, p256_mod); ctx->state = 22; break; case 22: @@ -10304,22 +10288,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 4; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -10377,16 +10367,16 @@ /* A = 3*(X^2 - W) */ sp_256_mont_sqr_avx2_4(t1, x, p256_mod, p256_mp_mod); sp_256_mont_sub_avx2_4(t1, t1, w, p256_mod); - sp_256_mont_tpl_lower_avx2_4(a, t1, p256_mod); + sp_256_mont_tpl_avx2_4(a, t1, p256_mod); /* B = X*Y^2 */ sp_256_mont_sqr_avx2_4(t1, y, p256_mod, p256_mp_mod); sp_256_mont_mul_avx2_4(b, t1, x, p256_mod, p256_mp_mod); x = r[j].x; /* X = A^2 - 2B */ sp_256_mont_sqr_avx2_4(x, a, p256_mod, p256_mp_mod); - sp_256_mont_sub_dbl_avx2_4(x, x, b, p256_mod); + sp_256_mont_rsb_sub_dbl_avx2_4(x, x, b, p256_mod); /* B = 2.(B - X) */ - sp_256_mont_dbl_sub_avx2_4(b, b, x, p256_mod); + sp_256_mont_dbl_avx2_4(b, b, p256_mod); /* Z = Z*Y */ sp_256_mont_mul_avx2_4(r[j].z, z, y, p256_mod, p256_mp_mod); z = r[j].z; @@ -10400,7 +10390,7 @@ sp_256_mont_mul_avx2_4(y, b, a, p256_mod, p256_mp_mod); sp_256_mont_sub_avx2_4(y, y, t1, p256_mod); /* Y = Y/2 */ - sp_256_div2_avx2_4(r[j].y, y, p256_mod); + sp_256_mont_div2_avx2_4(r[j].y, y, p256_mod); r[j].infinity = 0; } } @@ -10474,8 +10464,8 @@ sp_256_mont_sub_avx2_4(xs, xs, t1, p256_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_256_mont_sub_lower_avx2_4(ys, ya, xs, p256_mod); - sp_256_mont_sub_lower_avx2_4(ya, ya, xa, p256_mod); + sp_256_mont_sub_avx2_4(ys, ya, xs, p256_mod); + sp_256_mont_sub_avx2_4(ya, ya, xa, p256_mod); sp_256_mont_mul_avx2_4(ya, ya, t4, p256_mod, p256_mp_mod); sp_256_sub_4(t6, p256_mod, t6); sp_256_mont_mul_avx2_4(ys, ys, t6, p256_mod, p256_mp_mod); @@ -10524,7 +10514,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * + t = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -10650,12 +10640,11 @@ static void sp_256_proj_point_add_qz1_4(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*4; - sp_digit* t3 = t + 4*4; - sp_digit* t4 = t + 6*4; - sp_digit* t5 = t + 8*4; - sp_digit* t6 = t + 10*4; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*4; + sp_digit* t6 = t + 4*4; + sp_digit* t1 = t + 6*4; + sp_digit* t4 = t + 8*4; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -10671,13 +10660,9 @@ sp_256_proj_point_dbl_4(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_4(t2, t2, p->x, p256_mod); @@ -10686,32 +10671,38 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_4(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_4(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_4(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_4(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_4(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_4(x, t1, t5, p256_mod); - sp_256_mont_sub_dbl_4(x, x, t3, p256_mod); + sp_256_mont_sqr_4(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_4(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_4(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_4(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_4(t2, t2, t1, p256_mod); + sp_256_mont_rsb_sub_dbl_4(x, t2, t3, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_4(t3, t3, x, p256_mod); sp_256_mont_mul_4(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_4(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_4(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_256_mont_mul_4(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_4(y, t3, t1, p256_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 4; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -10869,7 +10860,7 @@ sp_digit* t = NULL; #else sp_point_256 rt[2]; - sp_digit t[2 * 4 * 6]; + sp_digit t[2 * 4 * 5]; #endif sp_point_256* p = NULL; int i; @@ -10890,7 +10881,7 @@ if (rt == NULL) err = MEMORY_E; if (err == MP_OKAY) { - t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, + t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -10988,13 +10979,15 @@ static THREAD_LS_T int sp_cache_256_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_256 = 0; - static wolfSSL_Mutex sp_cache_256_lock; + #endif + static wolfSSL_Mutex sp_cache_256_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_256_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_256(const sp_point_256* g, sp_cache_256_t** cache) @@ -11065,8 +11058,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_4(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_win_add_sub_4(r, g, k, map, ct, heap); @@ -11074,23 +11067,25 @@ #ifdef WOLFSSL_SP_SMALL_STACK sp_digit* tmp; #else - sp_digit tmp[2 * 4 * 6]; + sp_digit tmp[2 * 4 * 5]; #endif sp_cache_256_t* cache; int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, DYNAMIC_TYPE_ECC); + tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (tmp == NULL) { err = MEMORY_E; } #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -11137,12 +11132,11 @@ static void sp_256_proj_point_add_qz1_avx2_4(sp_point_256* r, const sp_point_256* p, const sp_point_256* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*4; - sp_digit* t3 = t + 4*4; - sp_digit* t4 = t + 6*4; - sp_digit* t5 = t + 8*4; - sp_digit* t6 = t + 10*4; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*4; + sp_digit* t6 = t + 4*4; + sp_digit* t1 = t + 6*4; + sp_digit* t4 = t + 8*4; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -11158,13 +11152,9 @@ sp_256_proj_point_dbl_avx2_4(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_256_mont_sub_avx2_4(t2, t2, p->x, p256_mod); @@ -11173,32 +11163,38 @@ /* Z3 = H*Z1 */ sp_256_mont_mul_avx2_4(z, p->z, t2, p256_mod, p256_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_256_mont_sqr_avx2_4(t1, t4, p256_mod, p256_mp_mod); - sp_256_mont_sqr_avx2_4(t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_mul_avx2_4(t3, p->x, t5, p256_mod, p256_mp_mod); - sp_256_mont_mul_avx2_4(t5, t5, t2, p256_mod, p256_mp_mod); - sp_256_mont_sub_avx2_4(x, t1, t5, p256_mod); - sp_256_mont_sub_dbl_avx2_4(x, x, t3, p256_mod); + sp_256_mont_sqr_avx2_4(t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_mul_avx2_4(t3, p->x, t1, p256_mod, p256_mp_mod); + sp_256_mont_mul_avx2_4(t1, t1, t2, p256_mod, p256_mp_mod); + sp_256_mont_sqr_avx2_4(t2, t4, p256_mod, p256_mp_mod); + sp_256_mont_sub_avx2_4(t2, t2, t1, p256_mod); + sp_256_mont_rsb_sub_dbl_avx2_4(x, t2, t3, p256_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_256_mont_sub_lower_avx2_4(t3, t3, x, p256_mod); sp_256_mont_mul_avx2_4(t3, t3, t4, p256_mod, p256_mp_mod); - sp_256_mont_mul_avx2_4(t5, t5, p->y, p256_mod, p256_mp_mod); - sp_256_mont_sub_avx2_4(y, t3, t5, p256_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 4; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 4; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_256_mont_mul_avx2_4(t1, t1, p->y, p256_mod, p256_mp_mod); + sp_256_mont_sub_avx2_4(y, t3, t1, p256_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 4; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 4; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -11342,7 +11338,7 @@ sp_digit* t = NULL; #else sp_point_256 rt[2]; - sp_digit t[2 * 4 * 6]; + sp_digit t[2 * 4 * 5]; #endif sp_point_256* p = NULL; int i; @@ -11363,7 +11359,7 @@ if (rt == NULL) err = MEMORY_E; if (err == MP_OKAY) { - t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, + t = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -11445,8 +11441,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_256_ecc_mulmod_avx2_4(sp_point_256* r, const sp_point_256* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_256_ecc_mulmod_avx2_4(sp_point_256* r, const sp_point_256* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_256_ecc_mulmod_win_add_sub_avx2_4(r, g, k, map, ct, heap); @@ -11454,23 +11450,25 @@ #ifdef WOLFSSL_SP_SMALL_STACK sp_digit* tmp; #else - sp_digit tmp[2 * 4 * 6]; + sp_digit tmp[2 * 4 * 5]; #endif sp_cache_256_t* cache; int err = MP_OKAY; #ifdef WOLFSSL_SP_SMALL_STACK - tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, DYNAMIC_TYPE_ECC); + tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (tmp == NULL) { err = MEMORY_E; } #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_256 == 0) { wc_InitMutex(&sp_cache_256_lock); initCacheMutex_256 = 1; } + #endif if (wc_LockMutex(&sp_cache_256_lock) != 0) { err = BAD_MUTEX_E; } @@ -11571,7 +11569,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -11582,7 +11580,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_256* point = NULL; + sp_point_256* point = NULL; sp_digit* k = NULL; #else sp_point_256 point[2]; @@ -24101,7 +24099,7 @@ sp_digit* tmp = NULL; #else sp_point_256 rt[2]; - sp_digit tmp[2 * 4 * 6]; + sp_digit tmp[2 * 4 * 5]; #endif sp_point_256* p = NULL; sp_digit* negy = NULL; @@ -24120,7 +24118,7 @@ if (rt == NULL) err = MEMORY_E; if (err == MP_OKAY) { - tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, + tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (tmp == NULL) err = MEMORY_E; @@ -24179,7 +24177,7 @@ if (tmp != NULL) #endif { - ForceZero(tmp, sizeof(sp_digit) * 2 * 4 * 6); + ForceZero(tmp, sizeof(sp_digit) * 2 * 4 * 5); #ifdef WOLFSSL_SP_SMALL_STACK XFREE(tmp, heap, DYNAMIC_TYPE_ECC); #endif @@ -24235,7 +24233,7 @@ sp_digit* tmp = NULL; #else sp_point_256 rt[2]; - sp_digit tmp[2 * 4 * 6]; + sp_digit tmp[2 * 4 * 5]; #endif sp_point_256* p = NULL; sp_digit* negy = NULL; @@ -24254,7 +24252,7 @@ if (rt == NULL) err = MEMORY_E; if (err == MP_OKAY) { - tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 6, heap, + tmp = (sp_digit*)XMALLOC(sizeof(sp_digit) * 2 * 4 * 5, heap, DYNAMIC_TYPE_ECC); if (tmp == NULL) err = MEMORY_E; @@ -24313,7 +24311,7 @@ if (tmp != NULL) #endif { - ForceZero(tmp, sizeof(sp_digit) * 2 * 4 * 6); + ForceZero(tmp, sizeof(sp_digit) * 2 * 4 * 5); #ifdef WOLFSSL_SP_SMALL_STACK XFREE(tmp, heap, DYNAMIC_TYPE_ECC); #endif @@ -24409,7 +24407,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -24434,7 +24432,7 @@ #endif #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -24600,7 +24598,7 @@ sp_point_256* infinity = NULL; #endif int err = MP_OKAY; - + #ifdef HAVE_INTEL_AVX2 word32 cpuid_flags = cpuid_get_flags(); #endif @@ -24611,7 +24609,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_256*)XMALLOC(sizeof(sp_point_256) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_256*)XMALLOC(sizeof(sp_point_256), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -26012,7 +26010,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -26400,7 +26398,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -26428,19 +26426,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 4; + /* y^2 - x^3 - a.x = b */ sp_256_sqr_4(t1, point->y); (void)sp_256_mod_4(t1, t1, p256_mod); sp_256_sqr_4(t2, point->x); (void)sp_256_mod_4(t2, t2, p256_mod); sp_256_mul_4(t2, t2, point->x); (void)sp_256_mod_4(t2, t2, p256_mod); - (void)sp_256_sub_4(t2, p256_mod, t2); - sp_256_mont_add_4(t1, t1, t2, p256_mod); + sp_256_mont_sub_4(t1, t1, t2, p256_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_256_mont_add_4(t1, t1, point->x, p256_mod); sp_256_mont_add_4(t1, t1, point->x, p256_mod); sp_256_mont_add_4(t1, t1, point->x, p256_mod); + if (sp_256_cmp_4(t1, p256_b) != 0) { err = MP_VAL; } @@ -26454,7 +26454,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -27289,14 +27289,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -27509,7 +27509,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_6(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -27523,7 +27523,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_6(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -27539,10 +27539,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_6(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_6(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_6(r, a, m, mp); for (; n > 1; n--) { @@ -27728,14 +27728,7 @@ #ifdef __cplusplus extern "C" { #endif -extern void sp_384_mont_sub_lower_6(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m); -#ifdef __cplusplus -} -#endif -#ifdef __cplusplus -extern "C" { -#endif -extern void sp_384_div2_6(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_384_mont_div2_6(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif @@ -27783,7 +27776,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_6(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_6(t2, t2, p384_mod); + sp_384_mont_div2_6(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_6(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -27793,7 +27786,7 @@ /* X = X - Y */ sp_384_mont_sub_6(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_6(y, y, x, p384_mod); + sp_384_mont_sub_6(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_6(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -27816,7 +27809,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_6_ctx* ctx = (sp_384_proj_point_dbl_6_ctx*)sp_ctx->data; @@ -27890,7 +27884,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_6(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_6(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -27915,7 +27909,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_6(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_6(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -27940,20 +27934,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#ifdef __cplusplus -extern "C" { -#endif -extern void sp_384_mont_dbl_lower_6(sp_digit* r, const sp_digit* a, const sp_digit* m); -#ifdef __cplusplus -} -#endif -#ifdef __cplusplus -extern "C" { -#endif -extern void sp_384_mont_tpl_lower_6(sp_digit* r, const sp_digit* a, const sp_digit* m); -#ifdef __cplusplus -} -#endif /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -27992,7 +27972,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_6(a, t1, p384_mod); + sp_384_mont_tpl_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod); @@ -28001,8 +27981,8 @@ sp_384_mont_dbl_6(t2, b, p384_mod); sp_384_mont_sub_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_6(b, t2, p384_mod); + sp_384_mont_sub_6(t2, b, x, p384_mod); + sp_384_mont_dbl_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_6(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -28022,7 +28002,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_6(a, t1, p384_mod); + sp_384_mont_tpl_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod); @@ -28031,8 +28011,8 @@ sp_384_mont_dbl_6(t2, b, p384_mod); sp_384_mont_sub_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_6(b, t2, p384_mod); + sp_384_mont_sub_6(t2, b, x, p384_mod); + sp_384_mont_dbl_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_6(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -28042,7 +28022,7 @@ sp_384_mont_sub_6(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_6(y, y, p384_mod); + sp_384_mont_div2_6(y, y, p384_mod); } /* Compare two numbers to determine if they are equal. @@ -28080,12 +28060,12 @@ static void sp_384_proj_point_add_6(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*6; - sp_digit* t3 = t + 4*6; - sp_digit* t4 = t + 6*6; - sp_digit* t5 = t + 8*6; - sp_digit* t6 = t + 10*6; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*6; + sp_digit* t2 = t + 4*6; + sp_digit* t3 = t + 6*6; + sp_digit* t4 = t + 8*6; + sp_digit* t5 = t + 10*6; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_6(t1, q->z, p384_mod, p384_mp_mod); @@ -28107,17 +28087,9 @@ sp_384_proj_point_dbl_6(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_6(t2, t2, t1, p384_mod); @@ -28136,20 +28108,31 @@ sp_384_mont_dbl_6(t3, y, p384_mod); sp_384_mont_sub_6(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_6(y, y, x, p384_mod); + sp_384_mont_sub_6(y, y, x, p384_mod); sp_384_mont_mul_6(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_6(y, y, t5, p384_mod); - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -28195,12 +28178,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*6; - ctx->t3 = t + 4*6; - ctx->t4 = t + 6*6; - ctx->t5 = t + 8*6; - ctx->t6 = t + 10*6; + ctx->t6 = t; + ctx->t1 = t + 2*6; + ctx->t2 = t + 4*6; + ctx->t3 = t + 6*6; + ctx->t4 = t + 8*6; + ctx->t5 = t + 10*6; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -28307,7 +28290,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_6(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_6(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -28320,22 +28303,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -28394,7 +28383,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_6(a, t1, p384_mod); + sp_384_mont_tpl_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_6(b, t1, x, p384_mod, p384_mp_mod); @@ -28404,8 +28393,8 @@ sp_384_mont_dbl_6(t2, b, p384_mod); sp_384_mont_sub_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_6(b, t2, p384_mod); + sp_384_mont_sub_6(t2, b, x, p384_mod); + sp_384_mont_dbl_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_6(r[j].z, z, y, p384_mod, p384_mp_mod); z = r[j].z; @@ -28419,7 +28408,7 @@ sp_384_mont_mul_6(y, b, a, p384_mod, p384_mp_mod); sp_384_mont_sub_6(y, y, t1, p384_mod); /* Y = Y/2 */ - sp_384_div2_6(r[j].y, y, p384_mod); + sp_384_mont_div2_6(r[j].y, y, p384_mod); r[j].infinity = 0; } } @@ -28493,8 +28482,8 @@ sp_384_mont_sub_6(xs, xs, t1, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_384_mont_sub_lower_6(ys, ya, xs, p384_mod); - sp_384_mont_sub_lower_6(ya, ya, xa, p384_mod); + sp_384_mont_sub_6(ys, ya, xs, p384_mod); + sp_384_mont_sub_6(ya, ya, xa, p384_mod); sp_384_mont_mul_6(ya, ya, t4, p384_mod, p384_mp_mod); sp_384_sub_6(t6, p384_mod, t6); sp_384_mont_mul_6(ys, ys, t6, p384_mod, p384_mp_mod); @@ -28628,7 +28617,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * + t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -28751,7 +28740,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_mul_avx2_6(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -28767,7 +28756,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_384_mont_sqr_avx2_6(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -28784,10 +28773,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_384_mont_sqr_n_avx2_6(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_384_mont_sqr_n_avx2_6(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_384_mont_sqr_avx2_6(r, a, m, mp); for (; n > 1; n--) { @@ -28933,11 +28922,10 @@ #define sp_384_mont_dbl_avx2_6 sp_384_mont_dbl_6 #define sp_384_mont_tpl_avx2_6 sp_384_mont_tpl_6 #define sp_384_mont_sub_avx2_6 sp_384_mont_sub_6 -#define sp_384_mont_sub_lower_avx2_6 sp_384_mont_sub_lower_6 #ifdef __cplusplus extern "C" { #endif -extern void sp_384_div2_avx2_6(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_384_mont_div2_avx2_6(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif @@ -28985,7 +28973,7 @@ /* T2 = Y * Y */ sp_384_mont_sqr_avx2_6(t2, y, p384_mod, p384_mp_mod); /* T2 = T2/2 */ - sp_384_div2_avx2_6(t2, t2, p384_mod); + sp_384_mont_div2_avx2_6(t2, t2, p384_mod); /* Y = Y * X */ sp_384_mont_mul_avx2_6(y, y, p->x, p384_mod, p384_mp_mod); /* X = T1 * T1 */ @@ -28995,7 +28983,7 @@ /* X = X - Y */ sp_384_mont_sub_avx2_6(x, x, y, p384_mod); /* Y = Y - X */ - sp_384_mont_sub_lower_avx2_6(y, y, x, p384_mod); + sp_384_mont_sub_avx2_6(y, y, x, p384_mod); /* Y = Y * T1 */ sp_384_mont_mul_avx2_6(y, y, t1, p384_mod, p384_mp_mod); /* Y = Y - T2 */ @@ -29018,7 +29006,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_384_proj_point_dbl_avx2_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, const sp_point_384* p, sp_digit* t) +static int sp_384_proj_point_dbl_avx2_6_nb(sp_ecc_ctx_t* sp_ctx, sp_point_384* r, + const sp_point_384* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_384_proj_point_dbl_avx2_6_ctx* ctx = (sp_384_proj_point_dbl_avx2_6_ctx*)sp_ctx->data; @@ -29092,7 +29081,7 @@ break; case 11: /* T2 = T2/2 */ - sp_384_div2_avx2_6(ctx->t2, ctx->t2, p384_mod); + sp_384_mont_div2_avx2_6(ctx->t2, ctx->t2, p384_mod); ctx->state = 12; break; case 12: @@ -29117,7 +29106,7 @@ break; case 16: /* Y = Y - X */ - sp_384_mont_sub_lower_avx2_6(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_avx2_6(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 17; break; case 17: @@ -29142,8 +29131,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_384_mont_dbl_lower_avx2_6 sp_384_mont_dbl_lower_6 -#define sp_384_mont_tpl_lower_avx2_6 sp_384_mont_tpl_lower_6 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -29182,7 +29169,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_avx2_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_avx2_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_avx2_6(a, t1, p384_mod); + sp_384_mont_tpl_avx2_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_avx2_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_avx2_6(b, t1, x, p384_mod, p384_mp_mod); @@ -29191,8 +29178,8 @@ sp_384_mont_dbl_avx2_6(t2, b, p384_mod); sp_384_mont_sub_avx2_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_avx2_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_avx2_6(b, t2, p384_mod); + sp_384_mont_sub_avx2_6(t2, b, x, p384_mod); + sp_384_mont_dbl_avx2_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_avx2_6(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -29212,7 +29199,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_avx2_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_avx2_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_avx2_6(a, t1, p384_mod); + sp_384_mont_tpl_avx2_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_avx2_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_avx2_6(b, t1, x, p384_mod, p384_mp_mod); @@ -29221,8 +29208,8 @@ sp_384_mont_dbl_avx2_6(t2, b, p384_mod); sp_384_mont_sub_avx2_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_avx2_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_avx2_6(b, t2, p384_mod); + sp_384_mont_sub_avx2_6(t2, b, x, p384_mod); + sp_384_mont_dbl_avx2_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_avx2_6(z, z, y, p384_mod, p384_mp_mod); /* t1 = Y^4 */ @@ -29232,7 +29219,7 @@ sp_384_mont_sub_avx2_6(y, y, t1, p384_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_384_div2_avx2_6(y, y, p384_mod); + sp_384_mont_div2_avx2_6(y, y, p384_mod); } @@ -29246,12 +29233,12 @@ static void sp_384_proj_point_add_avx2_6(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*6; - sp_digit* t3 = t + 4*6; - sp_digit* t4 = t + 6*6; - sp_digit* t5 = t + 8*6; - sp_digit* t6 = t + 10*6; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*6; + sp_digit* t2 = t + 4*6; + sp_digit* t3 = t + 6*6; + sp_digit* t4 = t + 8*6; + sp_digit* t5 = t + 10*6; /* U1 = X1*Z2^2 */ sp_384_mont_sqr_avx2_6(t1, q->z, p384_mod, p384_mp_mod); @@ -29273,17 +29260,9 @@ sp_384_proj_point_dbl_avx2_6(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_384_mont_sub_avx2_6(t2, t2, t1, p384_mod); @@ -29302,20 +29281,31 @@ sp_384_mont_dbl_avx2_6(t3, y, p384_mod); sp_384_mont_sub_avx2_6(x, x, t3, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_avx2_6(y, y, x, p384_mod); + sp_384_mont_sub_avx2_6(y, y, x, p384_mod); sp_384_mont_mul_avx2_6(y, y, t4, p384_mod, p384_mp_mod); sp_384_mont_sub_avx2_6(y, y, t5, p384_mod); - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -29361,12 +29351,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*6; - ctx->t3 = t + 4*6; - ctx->t4 = t + 6*6; - ctx->t5 = t + 8*6; - ctx->t6 = t + 10*6; + ctx->t6 = t; + ctx->t1 = t + 2*6; + ctx->t2 = t + 4*6; + ctx->t3 = t + 6*6; + ctx->t4 = t + 8*6; + ctx->t5 = t + 10*6; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -29473,7 +29463,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_384_mont_sub_lower_avx2_6(ctx->y, ctx->y, ctx->x, p384_mod); + sp_384_mont_sub_avx2_6(ctx->y, ctx->y, ctx->x, p384_mod); ctx->state = 22; break; case 22: @@ -29486,22 +29476,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -29560,7 +29556,7 @@ /* A = 3*(X^2 - W) */ sp_384_mont_sqr_avx2_6(t1, x, p384_mod, p384_mp_mod); sp_384_mont_sub_avx2_6(t1, t1, w, p384_mod); - sp_384_mont_tpl_lower_avx2_6(a, t1, p384_mod); + sp_384_mont_tpl_avx2_6(a, t1, p384_mod); /* B = X*Y^2 */ sp_384_mont_sqr_avx2_6(t1, y, p384_mod, p384_mp_mod); sp_384_mont_mul_avx2_6(b, t1, x, p384_mod, p384_mp_mod); @@ -29570,8 +29566,8 @@ sp_384_mont_dbl_avx2_6(t2, b, p384_mod); sp_384_mont_sub_avx2_6(x, x, t2, p384_mod); /* B = 2.(B - X) */ - sp_384_mont_sub_lower_avx2_6(t2, b, x, p384_mod); - sp_384_mont_dbl_lower_avx2_6(b, t2, p384_mod); + sp_384_mont_sub_avx2_6(t2, b, x, p384_mod); + sp_384_mont_dbl_avx2_6(b, t2, p384_mod); /* Z = Z*Y */ sp_384_mont_mul_avx2_6(r[j].z, z, y, p384_mod, p384_mp_mod); z = r[j].z; @@ -29585,7 +29581,7 @@ sp_384_mont_mul_avx2_6(y, b, a, p384_mod, p384_mp_mod); sp_384_mont_sub_avx2_6(y, y, t1, p384_mod); /* Y = Y/2 */ - sp_384_div2_avx2_6(r[j].y, y, p384_mod); + sp_384_mont_div2_avx2_6(r[j].y, y, p384_mod); r[j].infinity = 0; } } @@ -29659,8 +29655,8 @@ sp_384_mont_sub_avx2_6(xs, xs, t1, p384_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_384_mont_sub_lower_avx2_6(ys, ya, xs, p384_mod); - sp_384_mont_sub_lower_avx2_6(ya, ya, xa, p384_mod); + sp_384_mont_sub_avx2_6(ys, ya, xs, p384_mod); + sp_384_mont_sub_avx2_6(ya, ya, xa, p384_mod); sp_384_mont_mul_avx2_6(ya, ya, t4, p384_mod, p384_mp_mod); sp_384_sub_6(t6, p384_mod, t6); sp_384_mont_mul_avx2_6(ys, ys, t6, p384_mod, p384_mp_mod); @@ -29709,7 +29705,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * + t = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -29835,12 +29831,12 @@ static void sp_384_proj_point_add_qz1_6(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*6; - sp_digit* t3 = t + 4*6; - sp_digit* t4 = t + 6*6; - sp_digit* t5 = t + 8*6; - sp_digit* t6 = t + 10*6; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*6; + sp_digit* t6 = t + 4*6; + sp_digit* t1 = t + 6*6; + sp_digit* t4 = t + 8*6; + sp_digit* t5 = t + 10*6; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -29856,13 +29852,9 @@ sp_384_proj_point_dbl_6(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_6(t2, t2, p->x, p384_mod); @@ -29871,33 +29863,40 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_6(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_6(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_6(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_6(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_6(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_6(x, t1, t5, p384_mod); - sp_384_mont_dbl_6(t1, t3, p384_mod); - sp_384_mont_sub_6(x, x, t1, p384_mod); + sp_384_mont_sqr_6(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_6(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_6(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_6(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_6(t2, t2, t1, p384_mod); + sp_384_mont_dbl_6(t5, t3, p384_mod); + sp_384_mont_sub_6(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_6(t3, t3, x, p384_mod); + sp_384_mont_sub_6(t3, t3, x, p384_mod); sp_384_mont_mul_6(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_6(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_6(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_6(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_6(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -30174,13 +30173,15 @@ static THREAD_LS_T int sp_cache_384_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_384 = 0; - static wolfSSL_Mutex sp_cache_384_lock; + #endif + static wolfSSL_Mutex sp_cache_384_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_384_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_384(const sp_point_384* g, sp_cache_384_t** cache) @@ -30251,8 +30252,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_6(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_win_add_sub_6(r, g, k, map, ct, heap); @@ -30273,10 +30274,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -30323,12 +30326,12 @@ static void sp_384_proj_point_add_qz1_avx2_6(sp_point_384* r, const sp_point_384* p, const sp_point_384* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*6; - sp_digit* t3 = t + 4*6; - sp_digit* t4 = t + 6*6; - sp_digit* t5 = t + 8*6; - sp_digit* t6 = t + 10*6; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*6; + sp_digit* t6 = t + 4*6; + sp_digit* t1 = t + 6*6; + sp_digit* t4 = t + 8*6; + sp_digit* t5 = t + 10*6; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -30344,13 +30347,9 @@ sp_384_proj_point_dbl_avx2_6(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_384_mont_sub_avx2_6(t2, t2, p->x, p384_mod); @@ -30359,33 +30358,40 @@ /* Z3 = H*Z1 */ sp_384_mont_mul_avx2_6(z, p->z, t2, p384_mod, p384_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_384_mont_sqr_avx2_6(t1, t4, p384_mod, p384_mp_mod); - sp_384_mont_sqr_avx2_6(t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_mul_avx2_6(t3, p->x, t5, p384_mod, p384_mp_mod); - sp_384_mont_mul_avx2_6(t5, t5, t2, p384_mod, p384_mp_mod); - sp_384_mont_sub_avx2_6(x, t1, t5, p384_mod); - sp_384_mont_dbl_avx2_6(t1, t3, p384_mod); - sp_384_mont_sub_avx2_6(x, x, t1, p384_mod); + sp_384_mont_sqr_avx2_6(t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_mul_avx2_6(t3, p->x, t1, p384_mod, p384_mp_mod); + sp_384_mont_mul_avx2_6(t1, t1, t2, p384_mod, p384_mp_mod); + sp_384_mont_sqr_avx2_6(t2, t4, p384_mod, p384_mp_mod); + sp_384_mont_sub_avx2_6(t2, t2, t1, p384_mod); + sp_384_mont_dbl_avx2_6(t5, t3, p384_mod); + sp_384_mont_sub_avx2_6(x, t2, t5, p384_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_384_mont_sub_lower_avx2_6(t3, t3, x, p384_mod); + sp_384_mont_sub_avx2_6(t3, t3, x, p384_mod); sp_384_mont_mul_avx2_6(t3, t3, t4, p384_mod, p384_mp_mod); - sp_384_mont_mul_avx2_6(t5, t5, p->y, p384_mod, p384_mp_mod); - sp_384_mont_sub_avx2_6(y, t3, t5, p384_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 6; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 6; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_384_mont_mul_avx2_6(t1, t1, p->y, p384_mod, p384_mp_mod); + sp_384_mont_sub_avx2_6(y, t3, t1, p384_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 6; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 6; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -30632,8 +30638,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_384_ecc_mulmod_avx2_6(sp_point_384* r, const sp_point_384* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_384_ecc_mulmod_avx2_6(sp_point_384* r, const sp_point_384* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_384_ecc_mulmod_win_add_sub_avx2_6(r, g, k, map, ct, heap); @@ -30654,10 +30660,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_384 == 0) { wc_InitMutex(&sp_cache_384_lock); initCacheMutex_384 = 1; } + #endif if (wc_LockMutex(&sp_cache_384_lock) != 0) { err = BAD_MUTEX_E; } @@ -30758,7 +30766,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -30769,7 +30777,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_384* point = NULL; + sp_point_384* point = NULL; sp_digit* k = NULL; #else sp_point_384 point[2]; @@ -49410,7 +49418,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -49435,7 +49443,7 @@ #endif #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -49601,7 +49609,7 @@ sp_point_384* infinity = NULL; #endif int err = MP_OKAY; - + #ifdef HAVE_INTEL_AVX2 word32 cpuid_flags = cpuid_get_flags(); #endif @@ -49612,7 +49620,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_384*)XMALLOC(sizeof(sp_point_384) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_384*)XMALLOC(sizeof(sp_point_384), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -50872,7 +50880,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_384_cmp_6(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_384_cmp_6(u, v) >= 0))) { sp_384_sub_6(u, u, v); o = sp_384_sub_6(b, b, d); if (o != 0) @@ -50962,7 +50970,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -51343,7 +51351,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -51371,19 +51379,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 6; + /* y^2 - x^3 - a.x = b */ sp_384_sqr_6(t1, point->y); (void)sp_384_mod_6(t1, t1, p384_mod); sp_384_sqr_6(t2, point->x); (void)sp_384_mod_6(t2, t2, p384_mod); sp_384_mul_6(t2, t2, point->x); (void)sp_384_mod_6(t2, t2, p384_mod); - (void)sp_384_sub_6(t2, p384_mod, t2); - sp_384_mont_add_6(t1, t1, t2, p384_mod); + sp_384_mont_sub_6(t1, t1, t2, p384_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_384_mont_add_6(t1, t1, point->x, p384_mod); sp_384_mont_add_6(t1, t1, point->x, p384_mod); sp_384_mont_add_6(t1, t1, point->x, p384_mod); + if (sp_384_cmp_6(t1, p384_b) != 0) { err = MP_VAL; } @@ -51397,7 +51407,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -52203,14 +52213,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -52416,10 +52426,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_9(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_9(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_9(r, a, m, mp); for (; n > 1; n--) { @@ -52620,11 +52630,10 @@ #ifdef __cplusplus } #endif -#define sp_521_mont_sub_lower_9 sp_521_mont_sub_9 #ifdef __cplusplus extern "C" { #endif -extern void sp_521_div2_9(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_521_mont_div2_9(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif @@ -52672,7 +52681,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_9(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_9(t2, t2, p521_mod); + sp_521_mont_div2_9(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_9(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -52682,7 +52691,7 @@ /* X = X - Y */ sp_521_mont_sub_9(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_9(y, y, x, p521_mod); + sp_521_mont_sub_9(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_9(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -52705,7 +52714,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_9_ctx* ctx = (sp_521_proj_point_dbl_9_ctx*)sp_ctx->data; @@ -52779,7 +52789,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_9(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_9(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -52804,7 +52814,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -52829,8 +52839,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_521_mont_dbl_lower_9 sp_521_mont_dbl_9 -#define sp_521_mont_tpl_lower_9 sp_521_mont_tpl_9 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -52869,7 +52877,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -52878,8 +52886,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -52899,7 +52907,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -52908,8 +52916,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -52919,7 +52927,7 @@ sp_521_mont_sub_9(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_9(y, y, p521_mod); + sp_521_mont_div2_9(y, y, p521_mod); } /* Compare two numbers to determine if they are equal. @@ -52959,12 +52967,12 @@ static void sp_521_proj_point_add_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*9; + sp_digit* t2 = t + 4*9; + sp_digit* t3 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_9(t1, q->z, p521_mod, p521_mp_mod); @@ -52986,17 +52994,9 @@ sp_521_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_9(t2, t2, t1, p521_mod); @@ -53015,20 +53015,31 @@ sp_521_mont_dbl_9(t3, y, p521_mod); sp_521_mont_sub_9(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_9(y, y, x, p521_mod); + sp_521_mont_sub_9(y, y, x, p521_mod); sp_521_mont_mul_9(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_9(y, y, t5, p521_mod); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -53074,12 +53085,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*9; - ctx->t3 = t + 4*9; - ctx->t4 = t + 6*9; - ctx->t5 = t + 8*9; - ctx->t6 = t + 10*9; + ctx->t6 = t; + ctx->t1 = t + 2*9; + ctx->t2 = t + 4*9; + ctx->t3 = t + 6*9; + ctx->t4 = t + 8*9; + ctx->t5 = t + 10*9; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -53186,7 +53197,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -53199,22 +53210,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -53273,7 +53290,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_9(a, t1, p521_mod); + sp_521_mont_tpl_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_9(b, t1, x, p521_mod, p521_mp_mod); @@ -53283,8 +53300,8 @@ sp_521_mont_dbl_9(t2, b, p521_mod); sp_521_mont_sub_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_9(b, t2, p521_mod); + sp_521_mont_sub_9(t2, b, x, p521_mod); + sp_521_mont_dbl_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_9(r[j].z, z, y, p521_mod, p521_mp_mod); z = r[j].z; @@ -53298,7 +53315,7 @@ sp_521_mont_mul_9(y, b, a, p521_mod, p521_mp_mod); sp_521_mont_sub_9(y, y, t1, p521_mod); /* Y = Y/2 */ - sp_521_div2_9(r[j].y, y, p521_mod); + sp_521_mont_div2_9(r[j].y, y, p521_mod); r[j].infinity = 0; } } @@ -53372,8 +53389,8 @@ sp_521_mont_sub_9(xs, xs, t1, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_521_mont_sub_lower_9(ys, ya, xs, p521_mod); - sp_521_mont_sub_lower_9(ya, ya, xa, p521_mod); + sp_521_mont_sub_9(ys, ya, xs, p521_mod); + sp_521_mont_sub_9(ya, ya, xa, p521_mod); sp_521_mont_mul_9(ya, ya, t4, p521_mod, p521_mp_mod); sp_521_sub_9(t6, p521_mod, t6); sp_521_mont_mul_9(ys, ys, t6, p521_mod, p521_mp_mod); @@ -53507,7 +53524,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * + t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -53635,10 +53652,10 @@ * a Number to square in Montgomery form. * n Number of times to square. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ -static void sp_521_mont_sqr_n_avx2_9(sp_digit* r, const sp_digit* a, int n, - const sp_digit* m, sp_digit mp) +SP_NOINLINE static void sp_521_mont_sqr_n_avx2_9(sp_digit* r, + const sp_digit* a, int n, const sp_digit* m, sp_digit mp) { sp_521_mont_sqr_avx2_9(r, a, m, mp); for (; n > 1; n--) { @@ -53789,11 +53806,10 @@ #define sp_521_mont_dbl_avx2_9 sp_521_mont_dbl_9 #define sp_521_mont_tpl_avx2_9 sp_521_mont_tpl_9 #define sp_521_mont_sub_avx2_9 sp_521_mont_sub_9 -#define sp_521_mont_sub_lower_avx2_9 sp_521_mont_sub_avx2_9 #ifdef __cplusplus extern "C" { #endif -extern void sp_521_div2_avx2_9(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_521_mont_div2_avx2_9(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif @@ -53841,7 +53857,7 @@ /* T2 = Y * Y */ sp_521_mont_sqr_avx2_9(t2, y, p521_mod, p521_mp_mod); /* T2 = T2/2 */ - sp_521_div2_avx2_9(t2, t2, p521_mod); + sp_521_mont_div2_avx2_9(t2, t2, p521_mod); /* Y = Y * X */ sp_521_mont_mul_avx2_9(y, y, p->x, p521_mod, p521_mp_mod); /* X = T1 * T1 */ @@ -53851,7 +53867,7 @@ /* X = X - Y */ sp_521_mont_sub_avx2_9(x, x, y, p521_mod); /* Y = Y - X */ - sp_521_mont_sub_lower_avx2_9(y, y, x, p521_mod); + sp_521_mont_sub_avx2_9(y, y, x, p521_mod); /* Y = Y * T1 */ sp_521_mont_mul_avx2_9(y, y, t1, p521_mod, p521_mp_mod); /* Y = Y - T2 */ @@ -53874,7 +53890,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_521_proj_point_dbl_avx2_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, const sp_point_521* p, sp_digit* t) +static int sp_521_proj_point_dbl_avx2_9_nb(sp_ecc_ctx_t* sp_ctx, sp_point_521* r, + const sp_point_521* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_521_proj_point_dbl_avx2_9_ctx* ctx = (sp_521_proj_point_dbl_avx2_9_ctx*)sp_ctx->data; @@ -53948,7 +53965,7 @@ break; case 11: /* T2 = T2/2 */ - sp_521_div2_avx2_9(ctx->t2, ctx->t2, p521_mod); + sp_521_mont_div2_avx2_9(ctx->t2, ctx->t2, p521_mod); ctx->state = 12; break; case 12: @@ -53973,7 +53990,7 @@ break; case 16: /* Y = Y - X */ - sp_521_mont_sub_lower_avx2_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_avx2_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 17; break; case 17: @@ -53998,8 +54015,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_521_mont_dbl_lower_avx2_9 sp_521_mont_dbl_avx2_9 -#define sp_521_mont_tpl_lower_avx2_9 sp_521_mont_tpl_avx2_9 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -54038,7 +54053,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_avx2_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_avx2_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_avx2_9(a, t1, p521_mod); + sp_521_mont_tpl_avx2_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_avx2_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_avx2_9(b, t1, x, p521_mod, p521_mp_mod); @@ -54047,8 +54062,8 @@ sp_521_mont_dbl_avx2_9(t2, b, p521_mod); sp_521_mont_sub_avx2_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_avx2_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_avx2_9(b, t2, p521_mod); + sp_521_mont_sub_avx2_9(t2, b, x, p521_mod); + sp_521_mont_dbl_avx2_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_avx2_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -54068,7 +54083,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_avx2_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_avx2_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_avx2_9(a, t1, p521_mod); + sp_521_mont_tpl_avx2_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_avx2_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_avx2_9(b, t1, x, p521_mod, p521_mp_mod); @@ -54077,8 +54092,8 @@ sp_521_mont_dbl_avx2_9(t2, b, p521_mod); sp_521_mont_sub_avx2_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_avx2_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_avx2_9(b, t2, p521_mod); + sp_521_mont_sub_avx2_9(t2, b, x, p521_mod); + sp_521_mont_dbl_avx2_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_avx2_9(z, z, y, p521_mod, p521_mp_mod); /* t1 = Y^4 */ @@ -54088,7 +54103,7 @@ sp_521_mont_sub_avx2_9(y, y, t1, p521_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_521_div2_avx2_9(y, y, p521_mod); + sp_521_mont_div2_avx2_9(y, y, p521_mod); } @@ -54102,12 +54117,12 @@ static void sp_521_proj_point_add_avx2_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*9; + sp_digit* t2 = t + 4*9; + sp_digit* t3 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* U1 = X1*Z2^2 */ sp_521_mont_sqr_avx2_9(t1, q->z, p521_mod, p521_mp_mod); @@ -54129,17 +54144,9 @@ sp_521_proj_point_dbl_avx2_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_521_mont_sub_avx2_9(t2, t2, t1, p521_mod); @@ -54158,20 +54165,31 @@ sp_521_mont_dbl_avx2_9(t3, y, p521_mod); sp_521_mont_sub_avx2_9(x, x, t3, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_avx2_9(y, y, x, p521_mod); + sp_521_mont_sub_avx2_9(y, y, x, p521_mod); sp_521_mont_mul_avx2_9(y, y, t4, p521_mod, p521_mp_mod); sp_521_mont_sub_avx2_9(y, y, t5, p521_mod); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -54217,12 +54235,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*9; - ctx->t3 = t + 4*9; - ctx->t4 = t + 6*9; - ctx->t5 = t + 8*9; - ctx->t6 = t + 10*9; + ctx->t6 = t; + ctx->t1 = t + 2*9; + ctx->t2 = t + 4*9; + ctx->t3 = t + 6*9; + ctx->t4 = t + 8*9; + ctx->t5 = t + 10*9; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -54329,7 +54347,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_521_mont_sub_lower_avx2_9(ctx->y, ctx->y, ctx->x, p521_mod); + sp_521_mont_sub_avx2_9(ctx->y, ctx->y, ctx->x, p521_mod); ctx->state = 22; break; case 22: @@ -54342,22 +54360,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -54416,7 +54440,7 @@ /* A = 3*(X^2 - W) */ sp_521_mont_sqr_avx2_9(t1, x, p521_mod, p521_mp_mod); sp_521_mont_sub_avx2_9(t1, t1, w, p521_mod); - sp_521_mont_tpl_lower_avx2_9(a, t1, p521_mod); + sp_521_mont_tpl_avx2_9(a, t1, p521_mod); /* B = X*Y^2 */ sp_521_mont_sqr_avx2_9(t1, y, p521_mod, p521_mp_mod); sp_521_mont_mul_avx2_9(b, t1, x, p521_mod, p521_mp_mod); @@ -54426,8 +54450,8 @@ sp_521_mont_dbl_avx2_9(t2, b, p521_mod); sp_521_mont_sub_avx2_9(x, x, t2, p521_mod); /* B = 2.(B - X) */ - sp_521_mont_sub_lower_avx2_9(t2, b, x, p521_mod); - sp_521_mont_dbl_lower_avx2_9(b, t2, p521_mod); + sp_521_mont_sub_avx2_9(t2, b, x, p521_mod); + sp_521_mont_dbl_avx2_9(b, t2, p521_mod); /* Z = Z*Y */ sp_521_mont_mul_avx2_9(r[j].z, z, y, p521_mod, p521_mp_mod); z = r[j].z; @@ -54441,7 +54465,7 @@ sp_521_mont_mul_avx2_9(y, b, a, p521_mod, p521_mp_mod); sp_521_mont_sub_avx2_9(y, y, t1, p521_mod); /* Y = Y/2 */ - sp_521_div2_avx2_9(r[j].y, y, p521_mod); + sp_521_mont_div2_avx2_9(r[j].y, y, p521_mod); r[j].infinity = 0; } } @@ -54515,8 +54539,8 @@ sp_521_mont_sub_avx2_9(xs, xs, t1, p521_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_521_mont_sub_lower_avx2_9(ys, ya, xs, p521_mod); - sp_521_mont_sub_lower_avx2_9(ya, ya, xa, p521_mod); + sp_521_mont_sub_avx2_9(ys, ya, xs, p521_mod); + sp_521_mont_sub_avx2_9(ya, ya, xa, p521_mod); sp_521_mont_mul_avx2_9(ya, ya, t4, p521_mod, p521_mp_mod); sp_521_sub_9(t6, p521_mod, t6); sp_521_mont_mul_avx2_9(ys, ys, t6, p521_mod, p521_mp_mod); @@ -54565,7 +54589,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * + t = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * (33+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -54691,12 +54715,12 @@ static void sp_521_proj_point_add_qz1_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*9; + sp_digit* t6 = t + 4*9; + sp_digit* t1 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -54712,13 +54736,9 @@ sp_521_proj_point_dbl_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_9(t2, t2, p->x, p521_mod); @@ -54727,33 +54747,40 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_9(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_9(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_9(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_9(x, t1, t5, p521_mod); - sp_521_mont_dbl_9(t1, t3, p521_mod); - sp_521_mont_sub_9(x, x, t1, p521_mod); + sp_521_mont_sqr_9(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_9(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_9(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_9(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_9(t2, t2, t1, p521_mod); + sp_521_mont_dbl_9(t5, t3, p521_mod); + sp_521_mont_sub_9(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_9(t3, t3, x, p521_mod); + sp_521_mont_sub_9(t3, t3, x, p521_mod); sp_521_mont_mul_9(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_9(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_9(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_9(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_9(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -55030,13 +55057,15 @@ static THREAD_LS_T int sp_cache_521_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_521 = 0; - static wolfSSL_Mutex sp_cache_521_lock; + #endif + static wolfSSL_Mutex sp_cache_521_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_521_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_521(const sp_point_521* g, sp_cache_521_t** cache) @@ -55107,8 +55136,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_9(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_win_add_sub_9(r, g, k, map, ct, heap); @@ -55129,10 +55158,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -55179,12 +55210,12 @@ static void sp_521_proj_point_add_qz1_avx2_9(sp_point_521* r, const sp_point_521* p, const sp_point_521* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*9; - sp_digit* t3 = t + 4*9; - sp_digit* t4 = t + 6*9; - sp_digit* t5 = t + 8*9; - sp_digit* t6 = t + 10*9; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*9; + sp_digit* t6 = t + 4*9; + sp_digit* t1 = t + 6*9; + sp_digit* t4 = t + 8*9; + sp_digit* t5 = t + 10*9; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -55200,13 +55231,9 @@ sp_521_proj_point_dbl_avx2_9(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_521_mont_sub_avx2_9(t2, t2, p->x, p521_mod); @@ -55215,33 +55242,40 @@ /* Z3 = H*Z1 */ sp_521_mont_mul_avx2_9(z, p->z, t2, p521_mod, p521_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_521_mont_sqr_avx2_9(t1, t4, p521_mod, p521_mp_mod); - sp_521_mont_sqr_avx2_9(t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_mul_avx2_9(t3, p->x, t5, p521_mod, p521_mp_mod); - sp_521_mont_mul_avx2_9(t5, t5, t2, p521_mod, p521_mp_mod); - sp_521_mont_sub_avx2_9(x, t1, t5, p521_mod); - sp_521_mont_dbl_avx2_9(t1, t3, p521_mod); - sp_521_mont_sub_avx2_9(x, x, t1, p521_mod); + sp_521_mont_sqr_avx2_9(t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_mul_avx2_9(t3, p->x, t1, p521_mod, p521_mp_mod); + sp_521_mont_mul_avx2_9(t1, t1, t2, p521_mod, p521_mp_mod); + sp_521_mont_sqr_avx2_9(t2, t4, p521_mod, p521_mp_mod); + sp_521_mont_sub_avx2_9(t2, t2, t1, p521_mod); + sp_521_mont_dbl_avx2_9(t5, t3, p521_mod); + sp_521_mont_sub_avx2_9(x, t2, t5, p521_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_521_mont_sub_lower_avx2_9(t3, t3, x, p521_mod); + sp_521_mont_sub_avx2_9(t3, t3, x, p521_mod); sp_521_mont_mul_avx2_9(t3, t3, t4, p521_mod, p521_mp_mod); - sp_521_mont_mul_avx2_9(t5, t5, p->y, p521_mod, p521_mp_mod); - sp_521_mont_sub_avx2_9(y, t3, t5, p521_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 9; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 9; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_521_mont_mul_avx2_9(t1, t1, p->y, p521_mod, p521_mp_mod); + sp_521_mont_sub_avx2_9(y, t3, t1, p521_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 9; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 9; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -55488,8 +55522,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_521_ecc_mulmod_avx2_9(sp_point_521* r, const sp_point_521* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_521_ecc_mulmod_avx2_9(sp_point_521* r, const sp_point_521* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_521_ecc_mulmod_win_add_sub_avx2_9(r, g, k, map, ct, heap); @@ -55510,10 +55544,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_521 == 0) { wc_InitMutex(&sp_cache_521_lock); initCacheMutex_521 = 1; } + #endif if (wc_LockMutex(&sp_cache_521_lock) != 0) { err = BAD_MUTEX_E; } @@ -55614,7 +55650,7 @@ * * km Scalar to multiply by. * p Point to multiply. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -55625,7 +55661,7 @@ const ecc_point* am, int inMont, ecc_point* r, int map, void* heap) { #ifdef WOLFSSL_SP_SMALL_STACK - sp_point_521* point = NULL; + sp_point_521* point = NULL; sp_digit* k = NULL; #else sp_point_521 point[2]; @@ -90452,7 +90488,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -90477,7 +90513,7 @@ #endif #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -90644,7 +90680,7 @@ sp_point_521* infinity = NULL; #endif int err = MP_OKAY; - + #ifdef HAVE_INTEL_AVX2 word32 cpuid_flags = cpuid_get_flags(); #endif @@ -90655,7 +90691,7 @@ #ifdef WOLFSSL_VALIDATE_ECC_KEYGEN point = (sp_point_521*)XMALLOC(sizeof(sp_point_521) * 2, heap, DYNAMIC_TYPE_ECC); #else - point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); + point = (sp_point_521*)XMALLOC(sizeof(sp_point_521), heap, DYNAMIC_TYPE_ECC); #endif if (point == NULL) err = MEMORY_E; @@ -91978,7 +92014,7 @@ } while (ut > 1 && vt > 1) { - if (ut > vt || (ut == vt && sp_521_cmp_9(u, v) >= 0)) { + if ((ut > vt) || ((ut == vt) && (sp_521_cmp_9(u, v) >= 0))) { sp_521_sub_9(u, u, v); o = sp_521_sub_9(b, b, d); if (o != 0) @@ -92071,7 +92107,7 @@ * p2 Public point and temporary. * s Second part of signature as a number. * u1 Temporary number. - * u2 Temproray number. + * u2 Temporary number. * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ @@ -92459,7 +92495,7 @@ #endif /* HAVE_ECC_VERIFY */ #ifdef HAVE_ECC_CHECK_KEY -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -92487,19 +92523,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 9; + /* y^2 - x^3 - a.x = b */ sp_521_sqr_9(t1, point->y); (void)sp_521_mod_9(t1, t1, p521_mod); sp_521_sqr_9(t2, point->x); (void)sp_521_mod_9(t2, t2, p521_mod); sp_521_mul_9(t2, t2, point->x); (void)sp_521_mod_9(t2, t2, p521_mod); - (void)sp_521_sub_9(t2, p521_mod, t2); - sp_521_mont_add_9(t1, t1, t2, p521_mod); + sp_521_mont_sub_9(t1, t1, t2, p521_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_521_mont_add_9(t1, t1, point->x, p521_mod); sp_521_mont_add_9(t1, t1, point->x, p521_mod); sp_521_mont_add_9(t1, t1, point->x, p521_mod); + if (sp_521_cmp_9(t1, p521_b) != 0) { err = MP_VAL; } @@ -92513,7 +92551,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. @@ -93488,14 +93526,14 @@ { #if DIGIT_BIT == 64 int i; - int j = 0; + sp_digit j = (sp_digit)0 - (sp_digit)a->used; + int o = 0; for (i = 0; i < size; i++) { - sp_digit mask = - (((sp_digit)((int)a->used - i - 1)) >> (SP_WORD_SIZE - 1)) - 1; - r[i] = a->dp[j] & mask; - j += (int)(((sp_digit)1) - - (((sp_digit)((int)a->used - i - 2)) >> (SP_WORD_SIZE - 1))); + sp_digit mask = (sp_digit)0 - (j >> 63); + r[i] = a->dp[o] & mask; + j++; + o += (int)(j >> 63); } #elif DIGIT_BIT > 64 unsigned int i; @@ -93694,7 +93732,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_16(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -93708,7 +93746,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_16(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -93852,11 +93890,10 @@ #ifdef __cplusplus } #endif -#define sp_1024_mont_sub_lower_16 sp_1024_mont_sub_16 #ifdef __cplusplus extern "C" { #endif -extern void sp_1024_div2_16(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_1024_mont_div2_16(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif @@ -93904,7 +93941,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_16(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_16(t2, t2, p1024_mod); + sp_1024_mont_div2_16(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_16(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -93914,7 +93951,7 @@ /* X = X - Y */ sp_1024_mont_sub_16(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_16(y, y, x, p1024_mod); + sp_1024_mont_sub_16(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_16(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -93937,7 +93974,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_16_ctx* ctx = (sp_1024_proj_point_dbl_16_ctx*)sp_ctx->data; @@ -94011,7 +94049,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_16(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_16(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -94036,7 +94074,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_16(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -94061,8 +94099,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_1024_mont_dbl_lower_16 sp_1024_mont_dbl_16 -#define sp_1024_mont_tpl_lower_16 sp_1024_mont_tpl_16 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -94101,7 +94137,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_16(a, t1, p1024_mod); + sp_1024_mont_tpl_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -94110,8 +94146,8 @@ sp_1024_mont_dbl_16(t2, b, p1024_mod); sp_1024_mont_sub_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_16(b, t2, p1024_mod); + sp_1024_mont_sub_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_16(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -94131,7 +94167,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_16(a, t1, p1024_mod); + sp_1024_mont_tpl_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -94140,8 +94176,8 @@ sp_1024_mont_dbl_16(t2, b, p1024_mod); sp_1024_mont_sub_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_16(b, t2, p1024_mod); + sp_1024_mont_sub_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_16(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -94151,16 +94187,9 @@ sp_1024_mont_sub_16(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_16(y, y, p1024_mod); + sp_1024_mont_div2_16(y, y, p1024_mod); } -#ifdef __cplusplus -extern "C" { -#endif -extern sp_digit sp_1024_sub_16(sp_digit* r, const sp_digit* a, const sp_digit* b); -#ifdef __cplusplus -} -#endif /* Compare two numbers to determine if they are equal. * Constant time implementation. * @@ -94201,12 +94230,12 @@ static void sp_1024_proj_point_add_16(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*16; - sp_digit* t3 = t + 4*16; - sp_digit* t4 = t + 6*16; - sp_digit* t5 = t + 8*16; - sp_digit* t6 = t + 10*16; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*16; + sp_digit* t2 = t + 4*16; + sp_digit* t3 = t + 6*16; + sp_digit* t4 = t + 8*16; + sp_digit* t5 = t + 10*16; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_16(t1, q->z, p1024_mod, p1024_mp_mod); @@ -94228,17 +94257,9 @@ sp_1024_proj_point_dbl_16(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_16(t2, t2, t1, p1024_mod); @@ -94257,20 +94278,31 @@ sp_1024_mont_dbl_16(t3, y, p1024_mod); sp_1024_mont_sub_16(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_16(y, y, x, p1024_mod); + sp_1024_mont_sub_16(y, y, x, p1024_mod); sp_1024_mont_mul_16(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(y, y, t5, p1024_mod); - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -94316,12 +94348,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*16; - ctx->t3 = t + 4*16; - ctx->t4 = t + 6*16; - ctx->t5 = t + 8*16; - ctx->t6 = t + 10*16; + ctx->t6 = t; + ctx->t1 = t + 2*16; + ctx->t2 = t + 4*16; + ctx->t3 = t + 6*16; + ctx->t4 = t + 8*16; + ctx->t5 = t + 10*16; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -94428,7 +94460,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_16(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_16(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -94441,22 +94473,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -94515,7 +94553,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_16(a, t1, p1024_mod); + sp_1024_mont_tpl_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -94525,8 +94563,8 @@ sp_1024_mont_dbl_16(t2, b, p1024_mod); sp_1024_mont_sub_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_16(b, t2, p1024_mod); + sp_1024_mont_sub_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_16(r[j].z, z, y, p1024_mod, p1024_mp_mod); z = r[j].z; @@ -94540,7 +94578,7 @@ sp_1024_mont_mul_16(y, b, a, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(y, y, t1, p1024_mod); /* Y = Y/2 */ - sp_1024_div2_16(r[j].y, y, p1024_mod); + sp_1024_mont_div2_16(r[j].y, y, p1024_mod); r[j].infinity = 0; } } @@ -94614,8 +94652,8 @@ sp_1024_mont_sub_16(xs, xs, t1, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_1024_mont_sub_lower_16(ys, ya, xs, p1024_mod); - sp_1024_mont_sub_lower_16(ya, ya, xa, p1024_mod); + sp_1024_mont_sub_16(ys, ya, xs, p1024_mod); + sp_1024_mont_sub_16(ya, ya, xa, p1024_mod); sp_1024_mont_mul_16(ya, ya, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_16(t6, p1024_mod, t6, p1024_mod); sp_1024_mont_mul_16(ys, ys, t6, p1024_mod, p1024_mp_mod); @@ -94743,7 +94781,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * + t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (65+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -94868,7 +94906,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_mul_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* b, const sp_digit* m, sp_digit mp) @@ -94884,7 +94922,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ SP_NOINLINE static void sp_1024_mont_sqr_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* m, sp_digit mp) @@ -95001,11 +95039,10 @@ #ifdef __cplusplus } #endif -#define sp_1024_mont_sub_lower_avx2_16 sp_1024_mont_sub_avx2_16 #ifdef __cplusplus extern "C" { #endif -extern void sp_1024_div2_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* m); +extern void sp_1024_mont_div2_avx2_16(sp_digit* r, const sp_digit* a, const sp_digit* m); #ifdef __cplusplus } #endif @@ -95053,7 +95090,7 @@ /* T2 = Y * Y */ sp_1024_mont_sqr_avx2_16(t2, y, p1024_mod, p1024_mp_mod); /* T2 = T2/2 */ - sp_1024_div2_avx2_16(t2, t2, p1024_mod); + sp_1024_mont_div2_avx2_16(t2, t2, p1024_mod); /* Y = Y * X */ sp_1024_mont_mul_avx2_16(y, y, p->x, p1024_mod, p1024_mp_mod); /* X = T1 * T1 */ @@ -95063,7 +95100,7 @@ /* X = X - Y */ sp_1024_mont_sub_avx2_16(x, x, y, p1024_mod); /* Y = Y - X */ - sp_1024_mont_sub_lower_avx2_16(y, y, x, p1024_mod); + sp_1024_mont_sub_avx2_16(y, y, x, p1024_mod); /* Y = Y * T1 */ sp_1024_mont_mul_avx2_16(y, y, t1, p1024_mod, p1024_mp_mod); /* Y = Y - T2 */ @@ -95086,7 +95123,8 @@ * p Point to double. * t Temporary ordinate data. */ -static int sp_1024_proj_point_dbl_avx2_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, const sp_point_1024* p, sp_digit* t) +static int sp_1024_proj_point_dbl_avx2_16_nb(sp_ecc_ctx_t* sp_ctx, sp_point_1024* r, + const sp_point_1024* p, sp_digit* t) { int err = FP_WOULDBLOCK; sp_1024_proj_point_dbl_avx2_16_ctx* ctx = (sp_1024_proj_point_dbl_avx2_16_ctx*)sp_ctx->data; @@ -95160,7 +95198,7 @@ break; case 11: /* T2 = T2/2 */ - sp_1024_div2_avx2_16(ctx->t2, ctx->t2, p1024_mod); + sp_1024_mont_div2_avx2_16(ctx->t2, ctx->t2, p1024_mod); ctx->state = 12; break; case 12: @@ -95185,7 +95223,7 @@ break; case 16: /* Y = Y - X */ - sp_1024_mont_sub_lower_avx2_16(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_avx2_16(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 17; break; case 17: @@ -95210,8 +95248,6 @@ return err; } #endif /* WOLFSSL_SP_NONBLOCK */ -#define sp_1024_mont_dbl_lower_avx2_16 sp_1024_mont_dbl_avx2_16 -#define sp_1024_mont_tpl_lower_avx2_16 sp_1024_mont_tpl_avx2_16 /* Double the Montgomery form projective point p a number of times. * * r Result of repeated doubling of point. @@ -95250,7 +95286,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_avx2_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_avx2_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_avx2_16(a, t1, p1024_mod); + sp_1024_mont_tpl_avx2_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_avx2_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_avx2_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -95259,8 +95295,8 @@ sp_1024_mont_dbl_avx2_16(t2, b, p1024_mod); sp_1024_mont_sub_avx2_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_avx2_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_avx2_16(b, t2, p1024_mod); + sp_1024_mont_sub_avx2_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_avx2_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_avx2_16(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -95280,7 +95316,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_avx2_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_avx2_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_avx2_16(a, t1, p1024_mod); + sp_1024_mont_tpl_avx2_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_avx2_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_avx2_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -95289,8 +95325,8 @@ sp_1024_mont_dbl_avx2_16(t2, b, p1024_mod); sp_1024_mont_sub_avx2_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_avx2_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_avx2_16(b, t2, p1024_mod); + sp_1024_mont_sub_avx2_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_avx2_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_avx2_16(z, z, y, p1024_mod, p1024_mp_mod); /* t1 = Y^4 */ @@ -95300,7 +95336,7 @@ sp_1024_mont_sub_avx2_16(y, y, t1, p1024_mod); #endif /* WOLFSSL_SP_SMALL */ /* Y = Y/2 */ - sp_1024_div2_avx2_16(y, y, p1024_mod); + sp_1024_mont_div2_avx2_16(y, y, p1024_mod); } @@ -95314,12 +95350,12 @@ static void sp_1024_proj_point_add_avx2_16(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*16; - sp_digit* t3 = t + 4*16; - sp_digit* t4 = t + 6*16; - sp_digit* t5 = t + 8*16; - sp_digit* t6 = t + 10*16; + sp_digit* t6 = t; + sp_digit* t1 = t + 2*16; + sp_digit* t2 = t + 4*16; + sp_digit* t3 = t + 6*16; + sp_digit* t4 = t + 8*16; + sp_digit* t5 = t + 10*16; /* U1 = X1*Z2^2 */ sp_1024_mont_sqr_avx2_16(t1, q->z, p1024_mod, p1024_mp_mod); @@ -95341,17 +95377,9 @@ sp_1024_proj_point_dbl_avx2_16(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t6; sp_digit* y = t1; sp_digit* z = t2; - int i; - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); /* H = U2 - U1 */ sp_1024_mont_sub_avx2_16(t2, t2, t1, p1024_mod); @@ -95370,20 +95398,31 @@ sp_1024_mont_dbl_avx2_16(t3, y, p1024_mod); sp_1024_mont_sub_avx2_16(x, x, t3, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_avx2_16(y, y, x, p1024_mod); + sp_1024_mont_sub_avx2_16(y, y, x, p1024_mod); sp_1024_mont_mul_avx2_16(y, y, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_avx2_16(y, y, t5, p1024_mod); - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -95429,12 +95468,12 @@ switch (ctx->state) { case 0: /* INIT */ - ctx->t1 = t; - ctx->t2 = t + 2*16; - ctx->t3 = t + 4*16; - ctx->t4 = t + 6*16; - ctx->t5 = t + 8*16; - ctx->t6 = t + 10*16; + ctx->t6 = t; + ctx->t1 = t + 2*16; + ctx->t2 = t + 4*16; + ctx->t3 = t + 6*16; + ctx->t4 = t + 8*16; + ctx->t5 = t + 10*16; ctx->x = ctx->t6; ctx->y = ctx->t1; ctx->z = ctx->t2; @@ -95541,7 +95580,7 @@ break; case 21: /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ - sp_1024_mont_sub_lower_avx2_16(ctx->y, ctx->y, ctx->x, p1024_mod); + sp_1024_mont_sub_avx2_16(ctx->y, ctx->y, ctx->x, p1024_mod); ctx->state = 22; break; case 22: @@ -95554,22 +95593,28 @@ break; case 24: { - int i; - sp_digit maskp = 0 - (q->infinity & (!p->infinity)); - sp_digit maskq = 0 - (p->infinity & (!q->infinity)); - sp_digit maskt = ~(maskp | maskq); - - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (ctx->x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (ctx->y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (ctx->z[i] & maskt); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (ctx->x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (ctx->y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (ctx->z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; ctx->state = 25; break; } @@ -95628,7 +95673,7 @@ /* A = 3*(X^2 - W) */ sp_1024_mont_sqr_avx2_16(t1, x, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_avx2_16(t1, t1, w, p1024_mod); - sp_1024_mont_tpl_lower_avx2_16(a, t1, p1024_mod); + sp_1024_mont_tpl_avx2_16(a, t1, p1024_mod); /* B = X*Y^2 */ sp_1024_mont_sqr_avx2_16(t1, y, p1024_mod, p1024_mp_mod); sp_1024_mont_mul_avx2_16(b, t1, x, p1024_mod, p1024_mp_mod); @@ -95638,8 +95683,8 @@ sp_1024_mont_dbl_avx2_16(t2, b, p1024_mod); sp_1024_mont_sub_avx2_16(x, x, t2, p1024_mod); /* B = 2.(B - X) */ - sp_1024_mont_sub_lower_avx2_16(t2, b, x, p1024_mod); - sp_1024_mont_dbl_lower_avx2_16(b, t2, p1024_mod); + sp_1024_mont_sub_avx2_16(t2, b, x, p1024_mod); + sp_1024_mont_dbl_avx2_16(b, t2, p1024_mod); /* Z = Z*Y */ sp_1024_mont_mul_avx2_16(r[j].z, z, y, p1024_mod, p1024_mp_mod); z = r[j].z; @@ -95653,7 +95698,7 @@ sp_1024_mont_mul_avx2_16(y, b, a, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_avx2_16(y, y, t1, p1024_mod); /* Y = Y/2 */ - sp_1024_div2_avx2_16(r[j].y, y, p1024_mod); + sp_1024_mont_div2_avx2_16(r[j].y, y, p1024_mod); r[j].infinity = 0; } } @@ -95727,8 +95772,8 @@ sp_1024_mont_sub_avx2_16(xs, xs, t1, p1024_mod); /* Y3 = R*(U1*H^2 - X3) - S1*H^3 */ /* YS = -RS*(U1*H^2 - XS) - S1*H^3 */ - sp_1024_mont_sub_lower_avx2_16(ys, ya, xs, p1024_mod); - sp_1024_mont_sub_lower_avx2_16(ya, ya, xa, p1024_mod); + sp_1024_mont_sub_avx2_16(ys, ya, xs, p1024_mod); + sp_1024_mont_sub_avx2_16(ya, ya, xa, p1024_mod); sp_1024_mont_mul_avx2_16(ya, ya, t4, p1024_mod, p1024_mp_mod); sp_1024_mont_sub_avx2_16(t6, p1024_mod, t6, p1024_mod); sp_1024_mont_mul_avx2_16(ys, ys, t6, p1024_mod, p1024_mp_mod); @@ -95777,7 +95822,7 @@ (void)heap; #ifdef WOLFSSL_SP_SMALL_STACK - t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * + t = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * (65+2), heap, DYNAMIC_TYPE_ECC); if (t == NULL) err = MEMORY_E; @@ -95907,12 +95952,12 @@ static void sp_1024_proj_point_add_qz1_16(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*16; - sp_digit* t3 = t + 4*16; - sp_digit* t4 = t + 6*16; - sp_digit* t5 = t + 8*16; - sp_digit* t6 = t + 10*16; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*16; + sp_digit* t6 = t + 4*16; + sp_digit* t1 = t + 6*16; + sp_digit* t4 = t + 8*16; + sp_digit* t5 = t + 10*16; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -95928,13 +95973,9 @@ sp_1024_proj_point_dbl_16(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_16(t2, t2, p->x, p1024_mod); @@ -95943,33 +95984,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_16(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_16(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_16(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_16(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_16(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_16(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_16(t1, t3, p1024_mod); - sp_1024_mont_sub_16(x, x, t1, p1024_mod); + sp_1024_mont_sqr_16(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_16(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_16(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_16(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_16(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_16(t5, t3, p1024_mod); + sp_1024_mont_sub_16(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_16(t3, t3, x, p1024_mod); + sp_1024_mont_sub_16(t3, t3, x, p1024_mod); sp_1024_mont_mul_16(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_16(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_16(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_16(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_16(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -96215,13 +96263,15 @@ static THREAD_LS_T int sp_cache_1024_inited = 0; #ifndef HAVE_THREAD_LS + #ifndef WOLFSSL_MUTEX_INITIALIZER static volatile int initCacheMutex_1024 = 0; - static wolfSSL_Mutex sp_cache_1024_lock; + #endif + static wolfSSL_Mutex sp_cache_1024_lock WOLFSSL_MUTEX_INITIALIZER_CLAUSE(sp_cache_1024_lock); #endif /* Get the cache entry for the point. * - * g [in] Point scalar multipling. + * g [in] Point scalar multiplying. * cache [out] Cache table to use. */ static void sp_ecc_get_cache_1024(const sp_point_1024* g, sp_cache_1024_t** cache) @@ -96292,8 +96342,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_16(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_16(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_win_add_sub_16(r, g, k, map, ct, heap); @@ -96314,10 +96364,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -96364,12 +96416,12 @@ static void sp_1024_proj_point_add_qz1_avx2_16(sp_point_1024* r, const sp_point_1024* p, const sp_point_1024* q, sp_digit* t) { - sp_digit* t1 = t; - sp_digit* t2 = t + 2*16; - sp_digit* t3 = t + 4*16; - sp_digit* t4 = t + 6*16; - sp_digit* t5 = t + 8*16; - sp_digit* t6 = t + 10*16; + sp_digit* t2 = t; + sp_digit* t3 = t + 2*16; + sp_digit* t6 = t + 4*16; + sp_digit* t1 = t + 6*16; + sp_digit* t4 = t + 8*16; + sp_digit* t5 = t + 10*16; /* Calculate values to subtract from P->x and P->y. */ /* U2 = X2*Z1^2 */ @@ -96385,13 +96437,9 @@ sp_1024_proj_point_dbl_avx2_16(r, p, t); } else { - sp_digit maskp; - sp_digit maskq; - sp_digit maskt; sp_digit* x = t2; - sp_digit* y = t5; + sp_digit* y = t3; sp_digit* z = t6; - int i; /* H = U2 - X1 */ sp_1024_mont_sub_avx2_16(t2, t2, p->x, p1024_mod); @@ -96400,33 +96448,40 @@ /* Z3 = H*Z1 */ sp_1024_mont_mul_avx2_16(z, p->z, t2, p1024_mod, p1024_mp_mod); /* X3 = R^2 - H^3 - 2*X1*H^2 */ - sp_1024_mont_sqr_avx2_16(t1, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_sqr_avx2_16(t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_avx2_16(t3, p->x, t5, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_avx2_16(t5, t5, t2, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_avx2_16(x, t1, t5, p1024_mod); - sp_1024_mont_dbl_avx2_16(t1, t3, p1024_mod); - sp_1024_mont_sub_avx2_16(x, x, t1, p1024_mod); + sp_1024_mont_sqr_avx2_16(t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_avx2_16(t3, p->x, t1, p1024_mod, p1024_mp_mod); + sp_1024_mont_mul_avx2_16(t1, t1, t2, p1024_mod, p1024_mp_mod); + sp_1024_mont_sqr_avx2_16(t2, t4, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_avx2_16(t2, t2, t1, p1024_mod); + sp_1024_mont_dbl_avx2_16(t5, t3, p1024_mod); + sp_1024_mont_sub_avx2_16(x, t2, t5, p1024_mod); /* Y3 = R*(X1*H^2 - X3) - Y1*H^3 */ - sp_1024_mont_sub_lower_avx2_16(t3, t3, x, p1024_mod); + sp_1024_mont_sub_avx2_16(t3, t3, x, p1024_mod); sp_1024_mont_mul_avx2_16(t3, t3, t4, p1024_mod, p1024_mp_mod); - sp_1024_mont_mul_avx2_16(t5, t5, p->y, p1024_mod, p1024_mp_mod); - sp_1024_mont_sub_avx2_16(y, t3, t5, p1024_mod); - - maskp = 0 - (q->infinity & (!p->infinity)); - maskq = 0 - (p->infinity & (!q->infinity)); - maskt = ~(maskp | maskq); - for (i = 0; i < 16; i++) { - r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | (x[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | (y[i] & maskt); - } - for (i = 0; i < 16; i++) { - r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | (z[i] & maskt); + sp_1024_mont_mul_avx2_16(t1, t1, p->y, p1024_mod, p1024_mp_mod); + sp_1024_mont_sub_avx2_16(y, t3, t1, p1024_mod); + { + int i; + sp_digit maskp = 0 - (q->infinity & (!p->infinity)); + sp_digit maskq = 0 - (p->infinity & (!q->infinity)); + sp_digit maskt = ~(maskp | maskq); + sp_digit inf = (sp_digit)(p->infinity & q->infinity); + + for (i = 0; i < 16; i++) { + r->x[i] = (p->x[i] & maskp) | (q->x[i] & maskq) | + (x[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->y[i] = (p->y[i] & maskp) | (q->y[i] & maskq) | + (y[i] & maskt); + } + for (i = 0; i < 16; i++) { + r->z[i] = (p->z[i] & maskp) | (q->z[i] & maskq) | + (z[i] & maskt); + } + r->z[0] |= inf; + r->infinity = (word32)inf; } - r->z[0] |= p->infinity & q->infinity; - r->infinity = p->infinity & q->infinity; } } @@ -96656,8 +96711,8 @@ * heap Heap to use for allocation. * returns MEMORY_E when memory allocation fails and MP_OKAY on success. */ -static int sp_1024_ecc_mulmod_avx2_16(sp_point_1024* r, const sp_point_1024* g, const sp_digit* k, - int map, int ct, void* heap) +static int sp_1024_ecc_mulmod_avx2_16(sp_point_1024* r, const sp_point_1024* g, + const sp_digit* k, int map, int ct, void* heap) { #ifndef FP_ECC return sp_1024_ecc_mulmod_win_add_sub_avx2_16(r, g, k, map, ct, heap); @@ -96678,10 +96733,12 @@ #endif #ifndef HAVE_THREAD_LS if (err == MP_OKAY) { + #ifndef WOLFSSL_MUTEX_INITIALIZER if (initCacheMutex_1024 == 0) { wc_InitMutex(&sp_cache_1024_lock); initCacheMutex_1024 = 1; } + #endif if (wc_LockMutex(&sp_cache_1024_lock) != 0) { err = BAD_MUTEX_E; } @@ -100214,7 +100271,7 @@ * the result. If map is true then convert result to affine coordinates. * * km Scalar to multiply by. - * am Point to add to scalar mulitply result. + * am Point to add to scalar multiply result. * inMont Point to add is in montgomery form. * r Resulting point. * map Indicates whether to convert result to affine. @@ -100239,7 +100296,7 @@ #endif #ifdef WOLFSSL_SP_SMALL_STACK - point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, + point = (sp_point_1024*)XMALLOC(sizeof(sp_point_1024) * 2, heap, DYNAMIC_TYPE_ECC); if (point == NULL) err = MEMORY_E; @@ -100488,7 +100545,7 @@ return err; } -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -100514,7 +100571,7 @@ sp_1024_mont_add_16(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -102280,7 +102337,7 @@ #endif /* WOLFSSL_SP_SMALL */ #ifdef HAVE_INTEL_AVX2 -/* Multiply p* in projective co-ordinates by q*. +/* Multiply p* in projective coordinates by q*. * * r.x = p.x - (p.y * q.y) * r.y = (p.x * q.y) + p.y @@ -102306,7 +102363,7 @@ sp_1024_mont_add_avx2_16(py, t1, py, p1024_mod); } -/* Square p* in projective co-ordinates. +/* Square p* in projective coordinates. * * px' = (p.x + p.y) * (p.x - p.y) = p.x^2 - p.y^2 * py' = 2 * p.x * p.y @@ -102559,7 +102616,7 @@ return err; } -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -102674,7 +102731,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_16(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_16(t1, ty, p1024_mod); + sp_1024_mont_div2_16(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_16(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -102694,7 +102751,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_16(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_16(t1, t1, p1024_mod); + sp_1024_mont_div2_16(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_16(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -103112,7 +103169,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_16(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_16(t1, ty, p1024_mod); + sp_1024_mont_div2_16(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_16(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -103150,7 +103207,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_16(p->y, p->y, p1024_mod); + sp_1024_mont_div2_16(p->y, p->y, p1024_mod); } /* Operations to perform based on order - 1. @@ -103360,7 +103417,7 @@ #endif /* WOLFSSL_SP_SMALL */ #ifdef HAVE_INTEL_AVX2 -/* Multiply p* by q* in projective co-ordinates. +/* Multiply p* by q* in projective coordinates. * * p.x' = (p.x * q.x) - (p.y * q.y) * p.y' = (p.x * q.y) + (p.y * q.x) @@ -103475,7 +103532,7 @@ /* ty = 4 * p.y ^ 2 */ sp_1024_mont_sqr_avx2_16(ty, ry, p1024_mod, p1024_mp_mod); /* t1 = 2 * p.y ^ 2 */ - sp_1024_div2_avx2_16(t1, ty, p1024_mod); + sp_1024_mont_div2_avx2_16(t1, ty, p1024_mod); /* r.x -= 2 * (p.y ^ 2) */ sp_1024_mont_sub_avx2_16(rx, rx, t1, p1024_mod); /* p'.z = p.y * 2 * p.z */ @@ -103495,7 +103552,7 @@ /* t1 = (4 * p.y^2) ^ 2 = 16 * p.y^4 */ sp_1024_mont_sqr_avx2_16(t1, ty, p1024_mod, p1024_mp_mod); /* t1 = 16 * p.y^4 / 2 = 8 * p.y^4 */ - sp_1024_div2_avx2_16(t1, t1, p1024_mod); + sp_1024_mont_div2_avx2_16(t1, t1, p1024_mod); /* p'.y = 4 * p.y^2 * p.x */ sp_1024_mont_mul_avx2_16(p->y, ty, p->x, p1024_mod, p1024_mp_mod); /* p'.x = l^2 */ @@ -103913,7 +103970,7 @@ /* ty = py ^ 2 */ sp_1024_mont_sqr_avx2_16(ty, p->y, p1024_mod, p1024_mp_mod); /* t1 = py ^ 2 / 2 */ - sp_1024_div2_avx2_16(t1, ty, p1024_mod); + sp_1024_mont_div2_avx2_16(t1, ty, p1024_mod); /* r.x -= py ^ 2 / 2 */ sp_1024_mont_sub_avx2_16(rx, rx, t1, p1024_mod); /* p'.z = py * pz */ @@ -103951,7 +104008,7 @@ } /* p'.y = py' / 2 */ - sp_1024_div2_avx2_16(p->y, p->y, p1024_mod); + sp_1024_mont_div2_avx2_16(p->y, p->y, p1024_mod); } /* @@ -105375,7 +105432,7 @@ } } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * point EC point. * heap Heap to use if dynamically allocating. @@ -105404,19 +105461,21 @@ if (err == MP_OKAY) { t2 = t1 + 2 * 16; + /* y^2 - x^3 - a.x = b */ sp_1024_sqr_16(t1, point->y); (void)sp_1024_mod_16(t1, t1, p1024_mod); sp_1024_sqr_16(t2, point->x); (void)sp_1024_mod_16(t2, t2, p1024_mod); sp_1024_mul_16(t2, t2, point->x); (void)sp_1024_mod_16(t2, t2, p1024_mod); - (void)sp_1024_sub_16(t2, p1024_mod, t2); - sp_1024_mont_add_16(t1, t1, t2, p1024_mod); + sp_1024_mont_sub_16(t1, t1, t2, p1024_mod); + /* y^2 - x^3 + 3.x = b, when a = -3 */ sp_1024_mont_add_16(t1, t1, point->x, p1024_mod); sp_1024_mont_add_16(t1, t1, point->x, p1024_mod); sp_1024_mont_add_16(t1, t1, point->x, p1024_mod); + n = sp_1024_cmp_16(t1, p1024_mod); sp_1024_cond_sub_16(t1, t1, p1024_mod, ~(n >> 63)); sp_1024_norm_16(t1); @@ -105433,7 +105492,7 @@ return err; } -/* Check that the x and y oridinates are a valid point on the curve. +/* Check that the x and y ordinates are a valid point on the curve. * * pX X ordinate of EC point. * pY Y ordinate of EC point. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* sp_x86_64_asm - * - * Copyright (C) 2006-2023 wolfSSL Inc. +/* sp_x86_64_asm.S */ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -55378,11 +55378,12 @@ pushq %rbx movq %rdx, %rbp movq (%rsi), %rdx + movq 8(%rbp), %r14 # A[0] * B[0] mulxq (%rbp), %r8, %r9 xorq %rbx, %rbx # A[0] * B[1] - mulxq 8(%rbp), %rax, %r10 + mulxq %r14, %rax, %r10 adcxq %rax, %r9 # A[0] * B[2] mulxq 16(%rbp), %rax, %r11 @@ -55397,7 +55398,7 @@ xorq %rbx, %rbx adcxq %rax, %r9 # A[1] * B[1] - mulxq 8(%rbp), %rax, %r15 + mulxq %r14, %rax, %r15 adoxq %rcx, %r10 adcxq %rax, %r10 # A[1] * B[2] @@ -55416,7 +55417,7 @@ xorq %rbx, %rbx adcxq %rax, %r10 # A[2] * B[1] - mulxq 8(%rbp), %rax, %r15 + mulxq %r14, %rax, %r15 adoxq %rcx, %r11 adcxq %rax, %r11 # A[2] * B[2] @@ -55805,7 +55806,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -55981,11 +55982,10 @@ adcq $0x00, %rbx sbbq $0x00, %r9 movq $0xffffffff00000001, %rsi - movq %r9, %rax # mask m and sub from result if overflow # m[0] = -1 & mask = mask - shrq $32, %rax # m[2] = 0 & mask = 0 + movl %r9d, %eax andq %r9, %rsi subq %r9, %r13 sbbq %rax, %r14 @@ -56009,7 +56009,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -56163,11 +56163,10 @@ adcq $0x00, %r15 sbbq $0x00, %r8 movq $0xffffffff00000001, %rsi - movq %r8, %rax # mask m and sub from result if overflow # m[0] = -1 & mask = mask - shrq $32, %rax # m[2] = 0 & mask = 0 + movl %r8d, %eax andq %r8, %rsi subq %r8, %r12 sbbq %rax, %r13 @@ -56388,11 +56387,10 @@ adcq $0x00, %r15 sbbq $0x00, %r8 movq $0xffffffff00000001, %rbx - movq %r8, %rax # mask m and sub from result if overflow # m[0] = -1 & mask = mask - shrq $32, %rax # m[2] = 0 & mask = 0 + movl %r8d, %eax andq %r8, %rbx subq %r8, %r12 sbbq %rax, %r13 @@ -56543,13 +56541,12 @@ movq 16(%rsi), %r8 movq 24(%rsi), %r9 addq (%rdx), %rax - movq $0xffffffff, %r10 adcq 8(%rdx), %rcx movq $0xffffffff00000001, %r11 adcq 16(%rdx), %r8 adcq 24(%rdx), %r9 sbbq %rsi, %rsi - andq %rsi, %r10 + movl %esi, %r10d andq %rsi, %r11 subq %rsi, %rax sbbq %r10, %rcx @@ -56593,13 +56590,13 @@ movq 16(%rsi), %rcx movq 24(%rsi), %r8 addq %rdx, %rdx - movq $0xffffffff, %r9 adcq %rax, %rax movq $0xffffffff00000001, %r10 adcq %rcx, %rcx + movq %r8, %r11 adcq %r8, %r8 - sbbq %r11, %r11 - andq %r11, %r9 + sarq $63, %r11 + movl %r11d, %r9d andq %r11, %r10 subq %r11, %rdx sbbq %r9, %rax @@ -56643,13 +56640,12 @@ movq 16(%rsi), %rcx movq 24(%rsi), %r8 addq %rdx, %rdx - movq $0xffffffff, %r9 adcq %rax, %rax movq $0xffffffff00000001, %r10 adcq %rcx, %rcx adcq %r8, %r8 sbbq %r11, %r11 - andq %r11, %r9 + movl %r11d, %r9d andq %r11, %r10 subq %r11, %rdx sbbq %r9, %rax @@ -56663,13 +56659,12 @@ sbbq $0x00, %rcx sbbq %r10, %r8 addq (%rsi), %rdx - movq $0xffffffff, %r9 adcq 8(%rsi), %rax movq $0xffffffff00000001, %r10 adcq 16(%rsi), %rcx adcq 24(%rsi), %r8 - sbbq %r11, %r11 - andq %r11, %r9 + sbbq $0x00, %r11 + movl %r11d, %r9d andq %r11, %r10 subq %r11, %rdx sbbq %r9, %rax @@ -56714,13 +56709,12 @@ movq 16(%rsi), %r8 movq 24(%rsi), %r9 subq (%rdx), %rax - movq $0xffffffff, %r10 sbbq 8(%rdx), %rcx movq $0xffffffff00000001, %r11 sbbq 16(%rdx), %r8 sbbq 24(%rdx), %r9 sbbq %rsi, %rsi - andq %rsi, %r10 + movl %esi, %r10d andq %rsi, %r11 addq %rsi, %rax adcq %r10, %rcx @@ -56741,52 +56735,6 @@ #ifndef __APPLE__ .size sp_256_mont_sub_4,.-sp_256_mont_sub_4 #endif /* __APPLE__ */ -/* Subtract two Montgomery form numbers (r = a - b % m). - * - * b is less than the modulus. - * - * r Result of subtration. - * a Number to subtract from in Montgomery form. - * b Number to subtract with in Montgomery form. - * m Modulus (prime). - */ -#ifndef __APPLE__ -.text -.globl sp_256_mont_sub_lower_4 -.type sp_256_mont_sub_lower_4,@function -.align 16 -sp_256_mont_sub_lower_4: -#else -.section __TEXT,__text -.globl _sp_256_mont_sub_lower_4 -.p2align 4 -_sp_256_mont_sub_lower_4: -#endif /* __APPLE__ */ - movq (%rsi), %rax - movq 8(%rsi), %rcx - movq 16(%rsi), %r8 - movq 24(%rsi), %r9 - subq (%rdx), %rax - movq $0xffffffff, %r10 - sbbq 8(%rdx), %rcx - movq $0xffffffff00000001, %r11 - sbbq 16(%rdx), %r8 - sbbq 24(%rdx), %r9 - sbbq %rsi, %rsi - andq %rsi, %r10 - andq %rsi, %r11 - addq %rsi, %rax - adcq %r10, %rcx - movq %rax, (%rdi) - adcq $0x00, %r8 - movq %rcx, 8(%rdi) - adcq %r11, %r9 - movq %r8, 16(%rdi) - movq %r9, 24(%rdi) - repz retq -#ifndef __APPLE__ -.size sp_256_mont_sub_lower_4,.-sp_256_mont_sub_lower_4 -#endif /* __APPLE__ */ /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) * * r Result of division by 2. @@ -56795,26 +56743,25 @@ */ #ifndef __APPLE__ .text -.globl sp_256_div2_4 -.type sp_256_div2_4,@function +.globl sp_256_mont_div2_4 +.type sp_256_mont_div2_4,@function .align 16 -sp_256_div2_4: +sp_256_mont_div2_4: #else .section __TEXT,__text -.globl _sp_256_div2_4 +.globl _sp_256_mont_div2_4 .p2align 4 -_sp_256_div2_4: +_sp_256_mont_div2_4: #endif /* __APPLE__ */ movq (%rsi), %rdx movq 8(%rsi), %rax movq 16(%rsi), %rcx movq 24(%rsi), %r8 - movq $0xffffffff, %r9 movq $0xffffffff00000001, %r10 movq %rdx, %r11 andq $0x01, %r11 negq %r11 - andq %r11, %r9 + movl %r11d, %r9d andq %r11, %r10 addq %r11, %rdx adcq %r9, %rax @@ -56832,72 +56779,7 @@ movq %r8, 24(%rdi) repz retq #ifndef __APPLE__ -.size sp_256_div2_4,.-sp_256_div2_4 -#endif /* __APPLE__ */ -/* Triple a Montgomery form number (r = a + a + a % m). - * - * a is less than m. - * - * r Result of Tripling. - * a Number to triple in Montgomery form. - * m Modulus (prime). - */ -#ifndef __APPLE__ -.text -.globl sp_256_mont_tpl_lower_4 -.type sp_256_mont_tpl_lower_4,@function -.align 16 -sp_256_mont_tpl_lower_4: -#else -.section __TEXT,__text -.globl _sp_256_mont_tpl_lower_4 -.p2align 4 -_sp_256_mont_tpl_lower_4: -#endif /* __APPLE__ */ - movq (%rsi), %rdx - movq 8(%rsi), %rax - movq 16(%rsi), %rcx - movq 24(%rsi), %r8 - addq %rdx, %rdx - movq $0xffffffff, %r9 - adcq %rax, %rax - movq $0xffffffff00000001, %r10 - adcq %rcx, %rcx - adcq %r8, %r8 - sbbq %r11, %r11 - andq %r11, %r9 - andq %r11, %r10 - subq %r11, %rdx - sbbq %r9, %rax - sbbq $0x00, %rcx - sbbq %r10, %r8 - addq (%rsi), %rdx - movq $0xffffffff, %r9 - adcq 8(%rsi), %rax - movq $0xffffffff00000001, %r10 - adcq 16(%rsi), %rcx - adcq 24(%rsi), %r8 - sbbq %r11, %r11 - andq %r11, %r9 - andq %r11, %r10 - subq %r11, %rdx - sbbq %r9, %rax - sbbq $0x00, %rcx - sbbq %r10, %r8 - adcq $0x00, %r11 - andq %r11, %r9 - andq %r11, %r10 - subq %r11, %rdx - sbbq %r9, %rax - movq %rdx, (%rdi) - sbbq $0x00, %rcx - movq %rax, 8(%rdi) - sbbq %r10, %r8 - movq %rcx, 16(%rdi) - movq %r8, 24(%rdi) - repz retq -#ifndef __APPLE__ -.size sp_256_mont_tpl_lower_4,.-sp_256_mont_tpl_lower_4 +.size sp_256_mont_div2_4,.-sp_256_mont_div2_4 #endif /* __APPLE__ */ /* Two Montgomery numbers, subtract double second from first (r = a - 2.b % m). * @@ -56908,15 +56790,15 @@ */ #ifndef __APPLE__ .text -.globl sp_256_mont_sub_dbl_4 -.type sp_256_mont_sub_dbl_4,@function +.globl sp_256_mont_rsb_sub_dbl_4 +.type sp_256_mont_rsb_sub_dbl_4,@function .align 16 -sp_256_mont_sub_dbl_4: +sp_256_mont_rsb_sub_dbl_4: #else .section __TEXT,__text -.globl _sp_256_mont_sub_dbl_4 +.globl _sp_256_mont_rsb_sub_dbl_4 .p2align 4 -_sp_256_mont_sub_dbl_4: +_sp_256_mont_rsb_sub_dbl_4: #endif /* __APPLE__ */ pushq %r12 pushq %r13 @@ -56931,42 +56813,40 @@ movq 16(%rdx), %r12 movq 24(%rdx), %r13 addq %r10, %r10 - movq $0xffffffff, %r14 adcq %r11, %r11 movq $0xffffffff00000001, %r15 adcq %r12, %r12 adcq %r13, %r13 - sbbq %rdx, %rdx - andq %rdx, %r14 - andq %rdx, %r15 - subq %rdx, %r10 + sbbq %rsi, %rsi + movl %esi, %r14d + andq %rsi, %r15 + subq %rsi, %r10 sbbq %r14, %r11 sbbq $0x00, %r12 sbbq %r15, %r13 - adcq $0x00, %rdx - andq %rdx, %r14 - andq %rdx, %r15 - subq %rdx, %r10 + adcq $0x00, %rsi + andq %rsi, %r14 + andq %rsi, %r15 + subq %rsi, %r10 sbbq %r14, %r11 sbbq $0x00, %r12 sbbq %r15, %r13 subq %r10, %rax - movq $0xffffffff, %r14 sbbq %r11, %rcx movq $0xffffffff00000001, %r15 sbbq %r12, %r8 sbbq %r13, %r9 - sbbq %rdx, %rdx - andq %rdx, %r14 - andq %rdx, %r15 - addq %rdx, %rax + sbbq $0x00, %rsi + movl %esi, %r14d + andq %rsi, %r15 + addq %rsi, %rax adcq %r14, %rcx adcq $0x00, %r8 adcq %r15, %r9 - adcq $0x00, %rdx - andq %rdx, %r14 - andq %rdx, %r15 - addq %rdx, %rax + adcq $0x00, %rsi + andq %rsi, %r14 + andq %rsi, %r15 + addq %rsi, %rax adcq %r14, %rcx movq %rax, (%rdi) adcq $0x00, %r8 @@ -56974,79 +56854,46 @@ adcq %r15, %r9 movq %r8, 16(%rdi) movq %r9, 24(%rdi) + movq (%rdx), %r10 + movq 8(%rdx), %r11 + movq 16(%rdx), %r12 + movq 24(%rdx), %r13 + subq %rax, %r10 + sbbq %rcx, %r11 + movq $0xffffffff00000001, %r15 + sbbq %r8, %r12 + sbbq %r9, %r13 + sbbq %rsi, %rsi + movl %esi, %r14d + andq %rsi, %r15 + addq %rsi, %r10 + adcq %r14, %r11 + adcq $0x00, %r12 + adcq %r15, %r13 + adcq $0x00, %rsi + andq %rsi, %r14 + andq %rsi, %r15 + addq %rsi, %r10 + adcq %r14, %r11 + movq %r10, (%rdx) + adcq $0x00, %r12 + movq %r11, 8(%rdx) + adcq %r15, %r13 + movq %r12, 16(%rdx) + movq %r13, 24(%rdx) popq %r15 popq %r14 popq %r13 popq %r12 repz retq #ifndef __APPLE__ -.size sp_256_mont_sub_dbl_4,.-sp_256_mont_sub_dbl_4 -#endif /* __APPLE__ */ -/* Two Montgomery numbers, subtract second from first and double. - * (r = 2.(a - b) % m). - * - * b must have came from a mont_sub operation. - * - * r Result of subtration. - * a Number to subtract from in Montgomery form. - * b Number to subtract with in Montgomery form. - * m Modulus (prime). - */ -#ifndef __APPLE__ -.text -.globl sp_256_mont_dbl_sub_4 -.type sp_256_mont_dbl_sub_4,@function -.align 16 -sp_256_mont_dbl_sub_4: -#else -.section __TEXT,__text -.globl _sp_256_mont_dbl_sub_4 -.p2align 4 -_sp_256_mont_dbl_sub_4: -#endif /* __APPLE__ */ - movq (%rsi), %rax - movq 8(%rsi), %rcx - movq 16(%rsi), %r8 - movq 24(%rsi), %r9 - subq (%rdx), %rax - movq $0xffffffff, %r10 - sbbq 8(%rdx), %rcx - movq $0xffffffff00000001, %r11 - sbbq 16(%rdx), %r8 - sbbq 24(%rdx), %r9 - sbbq %rdx, %rdx - andq %rdx, %r10 - andq %rdx, %r11 - addq %rdx, %rax - adcq %r10, %rcx - adcq $0x00, %r8 - adcq %r11, %r9 - addq %rax, %rax - movq $0xffffffff, %r10 - adcq %rcx, %rcx - movq $0xffffffff00000001, %r11 - adcq %r8, %r8 - adcq %r9, %r9 - sbbq %rdx, %rdx - andq %rdx, %r10 - andq %rdx, %r11 - subq %rdx, %rax - sbbq %r10, %rcx - movq %rax, (%rdi) - sbbq $0x00, %r8 - movq %rcx, 8(%rdi) - sbbq %r11, %r9 - movq %r8, 16(%rdi) - movq %r9, 24(%rdi) - repz retq -#ifndef __APPLE__ -.size sp_256_mont_dbl_sub_4,.-sp_256_mont_dbl_sub_4 +.size sp_256_mont_rsb_sub_dbl_4,.-sp_256_mont_rsb_sub_dbl_4 #endif /* __APPLE__ */ #ifndef WC_NO_CACHE_RESISTANT /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of point to retrieve. */ #ifndef __APPLE__ @@ -57115,7 +56962,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of point to retrieve. */ #ifndef __APPLE__ @@ -57174,7 +57021,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -57196,11 +57043,12 @@ pushq %rbx movq %rdx, %rbp movq (%rsi), %rdx + movq 8(%rbp), %r14 # A[0] * B[0] mulxq (%rbp), %r8, %r9 xorq %rbx, %rbx # A[0] * B[1] - mulxq 8(%rbp), %rax, %r10 + mulxq %r14, %rax, %r10 adcxq %rax, %r9 # A[0] * B[2] mulxq 16(%rbp), %rax, %r11 @@ -57215,7 +57063,7 @@ xorq %rbx, %rbx adcxq %rax, %r9 # A[1] * B[1] - mulxq 8(%rbp), %rax, %r15 + mulxq %r14, %rax, %r15 adoxq %rcx, %r10 adcxq %rax, %r10 # A[1] * B[2] @@ -57234,7 +57082,7 @@ xorq %rbx, %rbx adcxq %rax, %r10 # A[2] * B[1] - mulxq 8(%rbp), %rax, %r15 + mulxq %r14, %rax, %r15 adoxq %rcx, %r11 adcxq %rax, %r11 # A[2] * B[2] @@ -57324,11 +57172,10 @@ adcq $0x00, %r15 sbbq $0x00, %r8 movq $0xffffffff00000001, %rsi - movq %r8, %rax # mask m and sub from result if overflow # m[0] = -1 & mask = mask - shrq $32, %rax # m[2] = 0 & mask = 0 + movl %r8d, %eax andq %r8, %rsi subq %r8, %r12 sbbq %rax, %r13 @@ -57355,7 +57202,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -57489,11 +57336,10 @@ adcq $0x00, %r15 sbbq $0x00, %r8 movq $0xffffffff00000001, %rsi - movq %r8, %rax # mask m and sub from result if overflow # m[0] = -1 & mask = mask - shrq $32, %rax # m[2] = 0 & mask = 0 + movl %r8d, %eax andq %r8, %rsi subq %r8, %r12 sbbq %rax, %r13 @@ -57577,15 +57423,15 @@ */ #ifndef __APPLE__ .text -.globl sp_256_mont_reduce_avx2_order_4 -.type sp_256_mont_reduce_avx2_order_4,@function +.globl sp_256_mont_reduce_order_avx2_4 +.type sp_256_mont_reduce_order_avx2_4,@function .align 16 -sp_256_mont_reduce_avx2_order_4: +sp_256_mont_reduce_order_avx2_4: #else .section __TEXT,__text -.globl _sp_256_mont_reduce_avx2_order_4 +.globl _sp_256_mont_reduce_order_avx2_4 .p2align 4 -_sp_256_mont_reduce_avx2_order_4: +_sp_256_mont_reduce_order_avx2_4: #endif /* __APPLE__ */ pushq %r12 pushq %r13 @@ -57729,7 +57575,7 @@ popq %r12 repz retq #ifndef __APPLE__ -.size sp_256_mont_reduce_avx2_order_4,.-sp_256_mont_reduce_avx2_order_4 +.size sp_256_mont_reduce_order_avx2_4,.-sp_256_mont_reduce_order_avx2_4 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ #ifdef HAVE_INTEL_AVX2 @@ -57741,26 +57587,25 @@ */ #ifndef __APPLE__ .text -.globl sp_256_div2_avx2_4 -.type sp_256_div2_avx2_4,@function +.globl sp_256_mont_div2_avx2_4 +.type sp_256_mont_div2_avx2_4,@function .align 16 -sp_256_div2_avx2_4: +sp_256_mont_div2_avx2_4: #else .section __TEXT,__text -.globl _sp_256_div2_avx2_4 +.globl _sp_256_mont_div2_avx2_4 .p2align 4 -_sp_256_div2_avx2_4: +_sp_256_mont_div2_avx2_4: #endif /* __APPLE__ */ movq (%rsi), %rdx movq 8(%rsi), %rax movq 16(%rsi), %rcx movq 24(%rsi), %r8 - movq $0xffffffff, %r9 movq $0xffffffff00000001, %r10 movq %rdx, %r11 andq $0x01, %r11 negq %r11 - andq %r11, %r9 + movl %r11d, %r9d andq %r11, %r10 addq %r11, %rdx adcq %r9, %rax @@ -57778,14 +57623,14 @@ movq %r8, 24(%rdi) repz retq #ifndef __APPLE__ -.size sp_256_div2_avx2_4,.-sp_256_div2_avx2_4 +.size sp_256_mont_div2_avx2_4,.-sp_256_mont_div2_avx2_4 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ #ifndef WC_NO_CACHE_RESISTANT /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -57845,7 +57690,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -57895,7 +57740,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -57955,7 +57800,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -58463,11 +58308,12 @@ pushq %rbx movq %rdx, %rbp movq (%rsi), %rdx + movq 8(%rbp), %r14 # A[0] * B[0] mulxq (%rbp), %r8, %r9 xorq %rbx, %rbx # A[0] * B[1] - mulxq 8(%rbp), %rax, %r10 + mulxq %r14, %rax, %r10 adcxq %rax, %r9 # A[0] * B[2] mulxq 16(%rbp), %rax, %r11 @@ -58482,7 +58328,7 @@ xorq %rbx, %rbx adcxq %rax, %r9 # A[1] * B[1] - mulxq 8(%rbp), %rax, %r15 + mulxq %r14, %rax, %r15 adoxq %rcx, %r10 adcxq %rax, %r10 # A[1] * B[2] @@ -58501,7 +58347,7 @@ xorq %rbx, %rbx adcxq %rax, %r10 # A[2] * B[1] - mulxq 8(%rbp), %rax, %r15 + mulxq %r14, %rax, %r15 adoxq %rcx, %r11 adcxq %rax, %r11 # A[2] * B[2] @@ -59201,15 +59047,23 @@ movq 8(%rsi), %r11 movq 16(%rsi), %r12 movq 24(%rsi), %r13 - vmovupd 0+L_sp256_mod_inv_avx2_4_order(%rip), %ymm6 - vmovupd 32+L_sp256_mod_inv_avx2_4_order(%rip), %ymm7 - vmovupd 0+L_sp256_mod_inv_avx2_4_one(%rip), %ymm8 - vmovupd 0+L_sp256_mod_inv_avx2_4_mask01111(%rip), %ymm9 - vmovupd 0+L_sp256_mod_inv_avx2_4_all_one(%rip), %ymm10 - vmovupd 0+L_sp256_mod_inv_avx2_4_down_one_dword(%rip), %ymm11 - vmovupd 0+L_sp256_mod_inv_avx2_4_neg(%rip), %ymm12 - vmovupd 0+L_sp256_mod_inv_avx2_4_up_one_dword(%rip), %ymm13 - vmovupd 0+L_sp256_mod_inv_avx2_4_mask26(%rip), %ymm14 + leaq L_sp256_mod_inv_avx2_4_order(%rip), %rbx + vmovupd (%rbx), %ymm6 + vmovupd 32(%rbx), %ymm7 + leaq L_sp256_mod_inv_avx2_4_one(%rip), %rbx + vmovupd (%rbx), %ymm8 + leaq L_sp256_mod_inv_avx2_4_mask01111(%rip), %rbx + vmovupd (%rbx), %ymm9 + leaq L_sp256_mod_inv_avx2_4_all_one(%rip), %rbx + vmovupd (%rbx), %ymm10 + leaq L_sp256_mod_inv_avx2_4_down_one_dword(%rip), %rbx + vmovupd (%rbx), %ymm11 + leaq L_sp256_mod_inv_avx2_4_neg(%rip), %rbx + vmovupd (%rbx), %ymm12 + leaq L_sp256_mod_inv_avx2_4_up_one_dword(%rip), %rbx + vmovupd (%rbx), %ymm13 + leaq L_sp256_mod_inv_avx2_4_mask26(%rip), %rbx + vmovupd (%rbx), %ymm14 vpxor %xmm0, %xmm0, %xmm0 vpxor %xmm1, %xmm1, %xmm1 vmovdqu %ymm8, %ymm2 @@ -60712,11 +60566,10 @@ # Subtract mod if carry negq %r10 movq $0xfffffffffffffffe, %r9 - movq %r10, %rcx + movl %r10d, %ecx movq %r10, %r8 - shrq $32, %rcx - shlq $32, %r8 andq %r10, %r9 + shlq $32, %r8 subq %rcx, %rbx sbbq %r8, %rbp sbbq %r9, %r11 @@ -60962,7 +60815,6 @@ movq 32(%rsi), %r10 movq 40(%rsi), %r11 addq (%rdx), %rax - movq $0xffffffff, %r12 adcq 8(%rdx), %rcx movq $0xffffffff00000000, %r13 adcq 16(%rdx), %r8 @@ -60971,7 +60823,7 @@ adcq 32(%rdx), %r10 adcq 40(%rdx), %r11 sbbq %rsi, %rsi - andq %rsi, %r12 + movl %esi, %r12d andq %rsi, %r13 andq %rsi, %r14 subq %r12, %rax @@ -61031,16 +60883,16 @@ movq 32(%rsi), %r9 movq 40(%rsi), %r10 addq %rdx, %rdx - movq $0xffffffff, %r11 adcq %rax, %rax movq $0xffffffff00000000, %r12 adcq %rcx, %rcx movq $0xfffffffffffffffe, %r13 adcq %r8, %r8 adcq %r9, %r9 + movq %r10, %r14 adcq %r10, %r10 - sbbq %r14, %r14 - andq %r14, %r11 + sarq $63, %r14 + movl %r14d, %r11d andq %r14, %r12 andq %r14, %r13 subq %r11, %rdx @@ -61100,7 +60952,6 @@ movq 32(%rsi), %r9 movq 40(%rsi), %r10 addq %rdx, %rdx - movq $0xffffffff, %r11 adcq %rax, %rax movq $0xffffffff00000000, %r12 adcq %rcx, %rcx @@ -61109,7 +60960,7 @@ adcq %r9, %r9 adcq %r10, %r10 sbbq %r14, %r14 - andq %r14, %r11 + movl %r14d, %r11d andq %r14, %r12 andq %r14, %r13 subq %r11, %rdx @@ -61130,7 +60981,6 @@ sbbq %r14, %r9 sbbq %r14, %r10 addq (%rsi), %rdx - movq $0xffffffff, %r11 adcq 8(%rsi), %rax movq $0xffffffff00000000, %r12 adcq 16(%rsi), %rcx @@ -61139,7 +60989,7 @@ adcq 32(%rsi), %r9 adcq 40(%rsi), %r10 sbbq %r14, %r14 - andq %r14, %r11 + movl %r14d, %r11d andq %r14, %r12 andq %r14, %r13 subq %r11, %rdx @@ -61200,7 +61050,6 @@ movq 32(%rsi), %r10 movq 40(%rsi), %r11 subq (%rdx), %rax - movq $0xffffffff, %r12 sbbq 8(%rdx), %rcx movq $0xffffffff00000000, %r13 sbbq 16(%rdx), %r8 @@ -61209,7 +61058,7 @@ sbbq 32(%rdx), %r10 sbbq 40(%rdx), %r11 sbbq %rsi, %rsi - andq %rsi, %r12 + movl %esi, %r12d andq %rsi, %r13 andq %rsi, %r14 addq %r12, %rax @@ -61241,68 +61090,6 @@ #ifndef __APPLE__ .size sp_384_mont_sub_6,.-sp_384_mont_sub_6 #endif /* __APPLE__ */ -/* Subtract two Montgomery form numbers (r = a - b % m). - * - * b is less than the modulus. - * - * r Result of subtration. - * a Number to subtract from in Montgomery form. - * b Number to subtract with in Montgomery form. - * m Modulus (prime). - */ -#ifndef __APPLE__ -.text -.globl sp_384_mont_sub_lower_6 -.type sp_384_mont_sub_lower_6,@function -.align 16 -sp_384_mont_sub_lower_6: -#else -.section __TEXT,__text -.globl _sp_384_mont_sub_lower_6 -.p2align 4 -_sp_384_mont_sub_lower_6: -#endif /* __APPLE__ */ - pushq %r12 - pushq %r13 - pushq %r14 - movq (%rsi), %rax - movq 8(%rsi), %rcx - movq 16(%rsi), %r8 - movq 24(%rsi), %r9 - movq 32(%rsi), %r10 - movq 40(%rsi), %r11 - subq (%rdx), %rax - movq $0xffffffff, %r12 - sbbq 8(%rdx), %rcx - movq $0xffffffff00000000, %r13 - sbbq 16(%rdx), %r8 - movq $0xfffffffffffffffe, %r14 - sbbq 24(%rdx), %r9 - sbbq 32(%rdx), %r10 - sbbq 40(%rdx), %r11 - sbbq %rsi, %rsi - andq %rsi, %r12 - andq %rsi, %r13 - andq %rsi, %r14 - addq %r12, %rax - adcq %r13, %rcx - movq %rax, (%rdi) - adcq %r14, %r8 - movq %rcx, 8(%rdi) - adcq %rsi, %r9 - movq %r8, 16(%rdi) - adcq %rsi, %r10 - movq %r9, 24(%rdi) - adcq %rsi, %r11 - movq %r10, 32(%rdi) - movq %r11, 40(%rdi) - popq %r14 - popq %r13 - popq %r12 - repz retq -#ifndef __APPLE__ -.size sp_384_mont_sub_lower_6,.-sp_384_mont_sub_lower_6 -#endif /* __APPLE__ */ /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) * * r Result of division by 2. @@ -61311,15 +61098,15 @@ */ #ifndef __APPLE__ .text -.globl sp_384_div2_6 -.type sp_384_div2_6,@function +.globl sp_384_mont_div2_6 +.type sp_384_mont_div2_6,@function .align 16 -sp_384_div2_6: +sp_384_mont_div2_6: #else .section __TEXT,__text -.globl _sp_384_div2_6 +.globl _sp_384_mont_div2_6 .p2align 4 -_sp_384_div2_6: +_sp_384_mont_div2_6: #endif /* __APPLE__ */ subq $48, %rsp movq (%rsi), %r11 @@ -61378,165 +61165,13 @@ addq $48, %rsp repz retq #ifndef __APPLE__ -.size sp_384_div2_6,.-sp_384_div2_6 -#endif /* __APPLE__ */ -/* Double a Montgomery form number (r = a + a % m). - * - * a is less than m. - * - * r Result of doubling. - * a Number to double in Montgomery form. - * m Modulus (prime). - */ -#ifndef __APPLE__ -.text -.globl sp_384_mont_dbl_lower_6 -.type sp_384_mont_dbl_lower_6,@function -.align 16 -sp_384_mont_dbl_lower_6: -#else -.section __TEXT,__text -.globl _sp_384_mont_dbl_lower_6 -.p2align 4 -_sp_384_mont_dbl_lower_6: -#endif /* __APPLE__ */ - pushq %r12 - pushq %r13 - pushq %r14 - movq (%rsi), %rdx - movq 8(%rsi), %rax - movq 16(%rsi), %rcx - movq 24(%rsi), %r8 - movq 32(%rsi), %r9 - movq 40(%rsi), %r10 - addq %rdx, %rdx - movq $0xffffffff, %r11 - adcq %rax, %rax - movq $0xffffffff00000000, %r12 - adcq %rcx, %rcx - movq $0xfffffffffffffffe, %r13 - adcq %r8, %r8 - adcq %r9, %r9 - adcq %r10, %r10 - sbbq %r14, %r14 - andq %r14, %r11 - andq %r14, %r12 - andq %r14, %r13 - subq %r11, %rdx - sbbq %r12, %rax - movq %rdx, (%rdi) - sbbq %r13, %rcx - movq %rax, 8(%rdi) - sbbq %r14, %r8 - movq %rcx, 16(%rdi) - sbbq %r14, %r9 - movq %r8, 24(%rdi) - sbbq %r14, %r10 - movq %r9, 32(%rdi) - movq %r10, 40(%rdi) - popq %r14 - popq %r13 - popq %r12 - repz retq -#ifndef __APPLE__ -.size sp_384_mont_dbl_lower_6,.-sp_384_mont_dbl_lower_6 -#endif /* __APPLE__ */ -/* Double a Montgomery form number (r = a + a % m). - * - * a is less than m. - * - * r Result of doubling. - * a Number to double in Montgomery form. - * m Modulus (prime). - */ -#ifndef __APPLE__ -.text -.globl sp_384_mont_tpl_lower_6 -.type sp_384_mont_tpl_lower_6,@function -.align 16 -sp_384_mont_tpl_lower_6: -#else -.section __TEXT,__text -.globl _sp_384_mont_tpl_lower_6 -.p2align 4 -_sp_384_mont_tpl_lower_6: -#endif /* __APPLE__ */ - pushq %r12 - pushq %r13 - pushq %r14 - movq (%rsi), %rdx - movq 8(%rsi), %rax - movq 16(%rsi), %rcx - movq 24(%rsi), %r8 - movq 32(%rsi), %r9 - movq 40(%rsi), %r10 - addq %rdx, %rdx - movq $0xffffffff, %r11 - adcq %rax, %rax - movq $0xffffffff00000000, %r12 - adcq %rcx, %rcx - movq $0xfffffffffffffffe, %r13 - adcq %r8, %r8 - adcq %r9, %r9 - adcq %r10, %r10 - sbbq %r14, %r14 - andq %r14, %r11 - andq %r14, %r12 - andq %r14, %r13 - subq %r11, %rdx - sbbq %r12, %rax - movq %rdx, (%rdi) - sbbq %r13, %rcx - sbbq %r14, %r8 - sbbq %r14, %r9 - sbbq %r14, %r10 - addq (%rsi), %rdx - movq $0xffffffff, %r11 - adcq 8(%rsi), %rax - movq $0xffffffff00000000, %r12 - adcq 16(%rsi), %rcx - movq $0xfffffffffffffffe, %r13 - adcq 24(%rsi), %r8 - adcq 32(%rsi), %r9 - adcq 40(%rsi), %r10 - sbbq %r14, %r14 - andq %r14, %r11 - andq %r14, %r12 - andq %r14, %r13 - subq %r11, %rdx - sbbq %r12, %rax - sbbq %r13, %rcx - sbbq %r14, %r8 - sbbq %r14, %r9 - sbbq %r14, %r10 - adcq $0x00, %r14 - andq %r14, %r11 - andq %r14, %r12 - andq %r14, %r13 - subq %r11, %rdx - sbbq %r12, %rax - movq %rdx, (%rdi) - sbbq %r13, %rcx - movq %rax, 8(%rdi) - sbbq %r14, %r8 - movq %rcx, 16(%rdi) - sbbq %r14, %r9 - movq %r8, 24(%rdi) - sbbq %r14, %r10 - movq %r9, 32(%rdi) - movq %r10, 40(%rdi) - popq %r14 - popq %r13 - popq %r12 - repz retq -#ifndef __APPLE__ -.size sp_384_mont_tpl_lower_6,.-sp_384_mont_tpl_lower_6 +.size sp_384_mont_div2_6,.-sp_384_mont_div2_6 #endif /* __APPLE__ */ #ifndef WC_NO_CACHE_RESISTANT /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of point to retrieve. */ #ifndef __APPLE__ @@ -61636,7 +61271,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of point to retrieve. */ #ifndef __APPLE__ @@ -62098,15 +61733,15 @@ */ #ifndef __APPLE__ .text -.globl sp_384_div2_avx2_6 -.type sp_384_div2_avx2_6,@function +.globl sp_384_mont_div2_avx2_6 +.type sp_384_mont_div2_avx2_6,@function .align 16 -sp_384_div2_avx2_6: +sp_384_mont_div2_avx2_6: #else .section __TEXT,__text -.globl _sp_384_div2_avx2_6 +.globl _sp_384_mont_div2_avx2_6 .p2align 4 -_sp_384_div2_avx2_6: +_sp_384_mont_div2_avx2_6: #endif /* __APPLE__ */ movq (%rsi), %r11 xorq %r10, %r10 @@ -62164,14 +61799,14 @@ movq %r9, 40(%rdi) repz retq #ifndef __APPLE__ -.size sp_384_div2_avx2_6,.-sp_384_div2_avx2_6 +.size sp_384_mont_div2_avx2_6,.-sp_384_mont_div2_avx2_6 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ #ifndef WC_NO_CACHE_RESISTANT /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -62241,7 +61876,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -62301,7 +61936,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -62371,7 +62006,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -65220,7 +64855,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -65817,7 +65452,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -67016,15 +66651,15 @@ */ #ifndef __APPLE__ .text -.globl sp_521_div2_9 -.type sp_521_div2_9,@function +.globl sp_521_mont_div2_9 +.type sp_521_mont_div2_9,@function .align 16 -sp_521_div2_9: +sp_521_mont_div2_9: #else .section __TEXT,__text -.globl _sp_521_div2_9 +.globl _sp_521_mont_div2_9 .p2align 4 -_sp_521_div2_9: +_sp_521_mont_div2_9: #endif /* __APPLE__ */ pushq %r12 pushq %r13 @@ -67074,13 +66709,13 @@ popq %r12 repz retq #ifndef __APPLE__ -.size sp_521_div2_9,.-sp_521_div2_9 +.size sp_521_mont_div2_9,.-sp_521_mont_div2_9 #endif /* __APPLE__ */ #ifndef WC_NO_CACHE_RESISTANT /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of point to retrieve. */ #ifndef __APPLE__ @@ -67225,7 +66860,7 @@ /* Touch each possible point that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of point to retrieve. */ #ifndef __APPLE__ @@ -67326,7 +66961,7 @@ * a First number to multiply in Montgomery form. * b Second number to multiply in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -67941,7 +67576,7 @@ * r Result of squaring. * a Number to square in Montgomery form. * m Modulus (prime). - * mp Montgomery mulitplier. + * mp Montgomery multiplier. */ #ifndef __APPLE__ .text @@ -68782,15 +68417,15 @@ */ #ifndef __APPLE__ .text -.globl sp_521_div2_avx2_9 -.type sp_521_div2_avx2_9,@function +.globl sp_521_mont_div2_avx2_9 +.type sp_521_mont_div2_avx2_9,@function .align 16 -sp_521_div2_avx2_9: +sp_521_mont_div2_avx2_9: #else .section __TEXT,__text -.globl _sp_521_div2_avx2_9 +.globl _sp_521_mont_div2_avx2_9 .p2align 4 -_sp_521_div2_avx2_9: +_sp_521_mont_div2_avx2_9: #endif /* __APPLE__ */ pushq %r12 pushq %r13 @@ -68840,14 +68475,14 @@ popq %r12 repz retq #ifndef __APPLE__ -.size sp_521_div2_avx2_9,.-sp_521_div2_avx2_9 +.size sp_521_mont_div2_avx2_9,.-sp_521_mont_div2_avx2_9 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ #ifndef WC_NO_CACHE_RESISTANT /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -68966,7 +68601,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -69044,7 +68679,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -69163,7 +68798,7 @@ /* Touch each possible entry that could be being copied. * * r Point to copy into. - * table Table - start of the entires to access + * table Table - start of the entries to access * idx Index of entry to retrieve. */ #ifndef __APPLE__ @@ -77693,15 +77328,15 @@ */ #ifndef __APPLE__ .text -.globl sp_1024_div2_16 -.type sp_1024_div2_16,@function +.globl sp_1024_mont_div2_16 +.type sp_1024_mont_div2_16,@function .align 16 -sp_1024_div2_16: +sp_1024_mont_div2_16: #else .section __TEXT,__text -.globl _sp_1024_div2_16 +.globl _sp_1024_mont_div2_16 .p2align 4 -_sp_1024_div2_16: +_sp_1024_mont_div2_16: #endif /* __APPLE__ */ subq $0x80, %rsp movq (%rsi), %r11 @@ -77840,78 +77475,7 @@ addq $0x80, %rsp repz retq #ifndef __APPLE__ -.size sp_1024_div2_16,.-sp_1024_div2_16 -#endif /* __APPLE__ */ -/* Sub b from a into r. (r = a - b) - * - * r A single precision integer. - * a A single precision integer. - * b A single precision integer. - */ -#ifndef __APPLE__ -.text -.globl sp_1024_sub_16 -.type sp_1024_sub_16,@function -.align 16 -sp_1024_sub_16: -#else -.section __TEXT,__text -.globl _sp_1024_sub_16 -.p2align 4 -_sp_1024_sub_16: -#endif /* __APPLE__ */ - movq (%rsi), %rcx - subq (%rdx), %rcx - movq 8(%rsi), %r8 - movq %rcx, (%rdi) - sbbq 8(%rdx), %r8 - movq 16(%rsi), %rcx - movq %r8, 8(%rdi) - sbbq 16(%rdx), %rcx - movq 24(%rsi), %r8 - movq %rcx, 16(%rdi) - sbbq 24(%rdx), %r8 - movq 32(%rsi), %rcx - movq %r8, 24(%rdi) - sbbq 32(%rdx), %rcx - movq 40(%rsi), %r8 - movq %rcx, 32(%rdi) - sbbq 40(%rdx), %r8 - movq 48(%rsi), %rcx - movq %r8, 40(%rdi) - sbbq 48(%rdx), %rcx - movq 56(%rsi), %r8 - movq %rcx, 48(%rdi) - sbbq 56(%rdx), %r8 - movq 64(%rsi), %rcx - movq %r8, 56(%rdi) - sbbq 64(%rdx), %rcx - movq 72(%rsi), %r8 - movq %rcx, 64(%rdi) - sbbq 72(%rdx), %r8 - movq 80(%rsi), %rcx - movq %r8, 72(%rdi) - sbbq 80(%rdx), %rcx - movq 88(%rsi), %r8 - movq %rcx, 80(%rdi) - sbbq 88(%rdx), %r8 - movq 96(%rsi), %rcx - movq %r8, 88(%rdi) - sbbq 96(%rdx), %rcx - movq 104(%rsi), %r8 - movq %rcx, 96(%rdi) - sbbq 104(%rdx), %r8 - movq 112(%rsi), %rcx - movq %r8, 104(%rdi) - sbbq 112(%rdx), %rcx - movq 120(%rsi), %r8 - movq %rcx, 112(%rdi) - sbbq 120(%rdx), %r8 - movq %r8, 120(%rdi) - sbbq %rax, %rax - repz retq -#ifndef __APPLE__ -.size sp_1024_sub_16,.-sp_1024_sub_16 +.size sp_1024_mont_div2_16,.-sp_1024_mont_div2_16 #endif /* __APPLE__ */ #ifdef HAVE_INTEL_AVX2 /* Reduce the number back to 1024 bits using Montgomery reduction. @@ -79028,15 +78592,15 @@ */ #ifndef __APPLE__ .text -.globl sp_1024_div2_avx2_16 -.type sp_1024_div2_avx2_16,@function +.globl sp_1024_mont_div2_avx2_16 +.type sp_1024_mont_div2_avx2_16,@function .align 16 -sp_1024_div2_avx2_16: +sp_1024_mont_div2_avx2_16: #else .section __TEXT,__text -.globl _sp_1024_div2_avx2_16 +.globl _sp_1024_mont_div2_avx2_16 .p2align 4 -_sp_1024_div2_avx2_16: +_sp_1024_mont_div2_avx2_16: #endif /* __APPLE__ */ movq (%rsi), %r11 xorq %r10, %r10 @@ -79174,7 +78738,7 @@ movq %r9, 120(%rdi) repz retq #ifndef __APPLE__ -.size sp_1024_div2_avx2_16,.-sp_1024_div2_avx2_16 +.size sp_1024_mont_div2_avx2_16,.-sp_1024_mont_div2_avx2_16 #endif /* __APPLE__ */ #endif /* HAVE_INTEL_AVX2 */ /* Read big endian unsigned byte array into r. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.asm mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.asm --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.asm 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sp_x86_64_asm.asm 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -; /* sp_x86_64_asm -; * -; * Copyright (C) 2006-2023 wolfSSL Inc. +; /* sp_x86_64_asm.asm */ +; /* +; * Copyright (C) 2006-2024 wolfSSL Inc. ; * ; * This file is part of wolfSSL. ; * @@ -9712,14 +9712,14 @@ _text SEGMENT READONLY PARA sp_2048_get_from_table_16 PROC sub rsp, 128 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 mov rax, 1 movd xmm10, r8 movd xmm11, rax @@ -9736,10 +9736,10 @@ mov r9, QWORD PTR [rdx] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9753,10 +9753,10 @@ mov r9, QWORD PTR [rdx+8] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9770,10 +9770,10 @@ mov r9, QWORD PTR [rdx+16] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9787,10 +9787,10 @@ mov r9, QWORD PTR [rdx+24] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9804,10 +9804,10 @@ mov r9, QWORD PTR [rdx+32] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9821,10 +9821,10 @@ mov r9, QWORD PTR [rdx+40] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9838,10 +9838,10 @@ mov r9, QWORD PTR [rdx+48] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9855,10 +9855,10 @@ mov r9, QWORD PTR [rdx+56] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9872,10 +9872,10 @@ mov r9, QWORD PTR [rdx+64] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9889,10 +9889,10 @@ mov r9, QWORD PTR [rdx+72] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9906,10 +9906,10 @@ mov r9, QWORD PTR [rdx+80] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9923,10 +9923,10 @@ mov r9, QWORD PTR [rdx+88] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9940,10 +9940,10 @@ mov r9, QWORD PTR [rdx+96] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9957,10 +9957,10 @@ mov r9, QWORD PTR [rdx+104] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9974,10 +9974,10 @@ mov r9, QWORD PTR [rdx+112] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -9991,10 +9991,10 @@ mov r9, QWORD PTR [rdx+120] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10008,10 +10008,10 @@ mov r9, QWORD PTR [rdx+128] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10025,10 +10025,10 @@ mov r9, QWORD PTR [rdx+136] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10042,10 +10042,10 @@ mov r9, QWORD PTR [rdx+144] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10059,10 +10059,10 @@ mov r9, QWORD PTR [rdx+152] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10076,10 +10076,10 @@ mov r9, QWORD PTR [rdx+160] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10093,10 +10093,10 @@ mov r9, QWORD PTR [rdx+168] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10110,10 +10110,10 @@ mov r9, QWORD PTR [rdx+176] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10127,10 +10127,10 @@ mov r9, QWORD PTR [rdx+184] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10144,10 +10144,10 @@ mov r9, QWORD PTR [rdx+192] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10161,10 +10161,10 @@ mov r9, QWORD PTR [rdx+200] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10178,10 +10178,10 @@ mov r9, QWORD PTR [rdx+208] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10195,10 +10195,10 @@ mov r9, QWORD PTR [rdx+216] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10212,10 +10212,10 @@ mov r9, QWORD PTR [rdx+224] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10229,10 +10229,10 @@ mov r9, QWORD PTR [rdx+232] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10246,10 +10246,10 @@ mov r9, QWORD PTR [rdx+240] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10263,10 +10263,10 @@ mov r9, QWORD PTR [rdx+248] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10276,10 +10276,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 0-7 ; START: 8-15 @@ -10293,10 +10293,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10311,10 +10311,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10329,10 +10329,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10347,10 +10347,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10365,10 +10365,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10383,10 +10383,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10401,10 +10401,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10419,10 +10419,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10437,10 +10437,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10455,10 +10455,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10473,10 +10473,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10491,10 +10491,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10509,10 +10509,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10527,10 +10527,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10545,10 +10545,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10563,10 +10563,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10581,10 +10581,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10599,10 +10599,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10617,10 +10617,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10635,10 +10635,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10653,10 +10653,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10671,10 +10671,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10689,10 +10689,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10707,10 +10707,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10725,10 +10725,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10743,10 +10743,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10761,10 +10761,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10779,10 +10779,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10797,10 +10797,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10815,10 +10815,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10833,10 +10833,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10851,10 +10851,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -10864,19 +10864,19 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 ; END: 8-15 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] add rsp, 128 ret sp_2048_get_from_table_16 ENDP @@ -13169,14 +13169,14 @@ _text SEGMENT READONLY PARA sp_2048_get_from_table_32 PROC sub rsp, 128 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 mov rax, 1 movd xmm10, r8 movd xmm11, rax @@ -13193,10 +13193,10 @@ mov r9, QWORD PTR [rdx] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13210,10 +13210,10 @@ mov r9, QWORD PTR [rdx+8] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13227,10 +13227,10 @@ mov r9, QWORD PTR [rdx+16] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13244,10 +13244,10 @@ mov r9, QWORD PTR [rdx+24] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13261,10 +13261,10 @@ mov r9, QWORD PTR [rdx+32] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13278,10 +13278,10 @@ mov r9, QWORD PTR [rdx+40] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13295,10 +13295,10 @@ mov r9, QWORD PTR [rdx+48] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13312,10 +13312,10 @@ mov r9, QWORD PTR [rdx+56] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13329,10 +13329,10 @@ mov r9, QWORD PTR [rdx+64] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13346,10 +13346,10 @@ mov r9, QWORD PTR [rdx+72] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13363,10 +13363,10 @@ mov r9, QWORD PTR [rdx+80] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13380,10 +13380,10 @@ mov r9, QWORD PTR [rdx+88] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13397,10 +13397,10 @@ mov r9, QWORD PTR [rdx+96] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13414,10 +13414,10 @@ mov r9, QWORD PTR [rdx+104] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13431,10 +13431,10 @@ mov r9, QWORD PTR [rdx+112] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13448,10 +13448,10 @@ mov r9, QWORD PTR [rdx+120] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13465,10 +13465,10 @@ mov r9, QWORD PTR [rdx+128] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13482,10 +13482,10 @@ mov r9, QWORD PTR [rdx+136] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13499,10 +13499,10 @@ mov r9, QWORD PTR [rdx+144] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13516,10 +13516,10 @@ mov r9, QWORD PTR [rdx+152] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13533,10 +13533,10 @@ mov r9, QWORD PTR [rdx+160] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13550,10 +13550,10 @@ mov r9, QWORD PTR [rdx+168] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13567,10 +13567,10 @@ mov r9, QWORD PTR [rdx+176] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13584,10 +13584,10 @@ mov r9, QWORD PTR [rdx+184] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13601,10 +13601,10 @@ mov r9, QWORD PTR [rdx+192] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13618,10 +13618,10 @@ mov r9, QWORD PTR [rdx+200] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13635,10 +13635,10 @@ mov r9, QWORD PTR [rdx+208] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13652,10 +13652,10 @@ mov r9, QWORD PTR [rdx+216] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13669,10 +13669,10 @@ mov r9, QWORD PTR [rdx+224] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13686,10 +13686,10 @@ mov r9, QWORD PTR [rdx+232] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13703,10 +13703,10 @@ mov r9, QWORD PTR [rdx+240] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13720,10 +13720,10 @@ mov r9, QWORD PTR [rdx+248] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13737,10 +13737,10 @@ mov r9, QWORD PTR [rdx+256] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13754,10 +13754,10 @@ mov r9, QWORD PTR [rdx+264] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13771,10 +13771,10 @@ mov r9, QWORD PTR [rdx+272] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13788,10 +13788,10 @@ mov r9, QWORD PTR [rdx+280] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13805,10 +13805,10 @@ mov r9, QWORD PTR [rdx+288] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13822,10 +13822,10 @@ mov r9, QWORD PTR [rdx+296] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13839,10 +13839,10 @@ mov r9, QWORD PTR [rdx+304] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13856,10 +13856,10 @@ mov r9, QWORD PTR [rdx+312] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13873,10 +13873,10 @@ mov r9, QWORD PTR [rdx+320] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13890,10 +13890,10 @@ mov r9, QWORD PTR [rdx+328] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13907,10 +13907,10 @@ mov r9, QWORD PTR [rdx+336] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13924,10 +13924,10 @@ mov r9, QWORD PTR [rdx+344] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13941,10 +13941,10 @@ mov r9, QWORD PTR [rdx+352] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13958,10 +13958,10 @@ mov r9, QWORD PTR [rdx+360] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13975,10 +13975,10 @@ mov r9, QWORD PTR [rdx+368] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -13992,10 +13992,10 @@ mov r9, QWORD PTR [rdx+376] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14009,10 +14009,10 @@ mov r9, QWORD PTR [rdx+384] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14026,10 +14026,10 @@ mov r9, QWORD PTR [rdx+392] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14043,10 +14043,10 @@ mov r9, QWORD PTR [rdx+400] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14060,10 +14060,10 @@ mov r9, QWORD PTR [rdx+408] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14077,10 +14077,10 @@ mov r9, QWORD PTR [rdx+416] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14094,10 +14094,10 @@ mov r9, QWORD PTR [rdx+424] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14111,10 +14111,10 @@ mov r9, QWORD PTR [rdx+432] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14128,10 +14128,10 @@ mov r9, QWORD PTR [rdx+440] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14145,10 +14145,10 @@ mov r9, QWORD PTR [rdx+448] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14162,10 +14162,10 @@ mov r9, QWORD PTR [rdx+456] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14179,10 +14179,10 @@ mov r9, QWORD PTR [rdx+464] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14196,10 +14196,10 @@ mov r9, QWORD PTR [rdx+472] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14213,10 +14213,10 @@ mov r9, QWORD PTR [rdx+480] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14230,10 +14230,10 @@ mov r9, QWORD PTR [rdx+488] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14247,10 +14247,10 @@ mov r9, QWORD PTR [rdx+496] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14264,10 +14264,10 @@ mov r9, QWORD PTR [rdx+504] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14277,10 +14277,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 0-7 ; START: 8-15 @@ -14294,10 +14294,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14312,10 +14312,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14330,10 +14330,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14348,10 +14348,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14366,10 +14366,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14384,10 +14384,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14402,10 +14402,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14420,10 +14420,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14438,10 +14438,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14456,10 +14456,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14474,10 +14474,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14492,10 +14492,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14510,10 +14510,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14528,10 +14528,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14546,10 +14546,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14564,10 +14564,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14582,10 +14582,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14600,10 +14600,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14618,10 +14618,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14636,10 +14636,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14654,10 +14654,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14672,10 +14672,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14690,10 +14690,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14708,10 +14708,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14726,10 +14726,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14744,10 +14744,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14762,10 +14762,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14780,10 +14780,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14798,10 +14798,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14816,10 +14816,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14834,10 +14834,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14852,10 +14852,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14870,10 +14870,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14888,10 +14888,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14906,10 +14906,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14924,10 +14924,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14942,10 +14942,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14960,10 +14960,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14978,10 +14978,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -14996,10 +14996,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15014,10 +15014,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15032,10 +15032,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15050,10 +15050,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15068,10 +15068,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15086,10 +15086,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15104,10 +15104,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15122,10 +15122,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15140,10 +15140,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15158,10 +15158,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15176,10 +15176,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15194,10 +15194,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15212,10 +15212,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15230,10 +15230,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15248,10 +15248,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15266,10 +15266,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15284,10 +15284,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15302,10 +15302,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15320,10 +15320,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15338,10 +15338,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15356,10 +15356,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15374,10 +15374,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15392,10 +15392,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15410,10 +15410,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15428,10 +15428,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15441,10 +15441,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 8-15 ; START: 16-23 @@ -15458,10 +15458,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15476,10 +15476,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15494,10 +15494,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15512,10 +15512,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15530,10 +15530,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15548,10 +15548,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15566,10 +15566,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15584,10 +15584,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15602,10 +15602,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15620,10 +15620,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15638,10 +15638,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15656,10 +15656,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15674,10 +15674,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15692,10 +15692,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15710,10 +15710,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15728,10 +15728,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15746,10 +15746,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15764,10 +15764,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15782,10 +15782,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15800,10 +15800,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15818,10 +15818,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15836,10 +15836,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15854,10 +15854,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15872,10 +15872,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15890,10 +15890,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15908,10 +15908,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15926,10 +15926,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15944,10 +15944,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15962,10 +15962,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15980,10 +15980,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -15998,10 +15998,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16016,10 +16016,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16034,10 +16034,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16052,10 +16052,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16070,10 +16070,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16088,10 +16088,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16106,10 +16106,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16124,10 +16124,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16142,10 +16142,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16160,10 +16160,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16178,10 +16178,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16196,10 +16196,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16214,10 +16214,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16232,10 +16232,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16250,10 +16250,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16268,10 +16268,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16286,10 +16286,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16304,10 +16304,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16322,10 +16322,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16340,10 +16340,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16358,10 +16358,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16376,10 +16376,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16394,10 +16394,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16412,10 +16412,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16430,10 +16430,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16448,10 +16448,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16466,10 +16466,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16484,10 +16484,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16502,10 +16502,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16520,10 +16520,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16538,10 +16538,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16556,10 +16556,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16574,10 +16574,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16592,10 +16592,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16605,10 +16605,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 16-23 ; START: 24-31 @@ -16622,10 +16622,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16640,10 +16640,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16658,10 +16658,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16676,10 +16676,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16694,10 +16694,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16712,10 +16712,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16730,10 +16730,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16748,10 +16748,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16766,10 +16766,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16784,10 +16784,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16802,10 +16802,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16820,10 +16820,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16838,10 +16838,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16856,10 +16856,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16874,10 +16874,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16892,10 +16892,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16910,10 +16910,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16928,10 +16928,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16946,10 +16946,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16964,10 +16964,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -16982,10 +16982,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17000,10 +17000,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17018,10 +17018,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17036,10 +17036,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17054,10 +17054,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17072,10 +17072,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17090,10 +17090,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17108,10 +17108,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17126,10 +17126,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17144,10 +17144,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17162,10 +17162,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17180,10 +17180,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17198,10 +17198,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17216,10 +17216,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17234,10 +17234,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17252,10 +17252,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17270,10 +17270,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17288,10 +17288,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17306,10 +17306,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17324,10 +17324,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17342,10 +17342,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17360,10 +17360,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17378,10 +17378,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17396,10 +17396,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17414,10 +17414,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17432,10 +17432,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17450,10 +17450,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17468,10 +17468,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17486,10 +17486,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17504,10 +17504,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17522,10 +17522,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17540,10 +17540,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17558,10 +17558,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17576,10 +17576,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17594,10 +17594,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17612,10 +17612,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17630,10 +17630,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17648,10 +17648,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17666,10 +17666,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17684,10 +17684,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17702,10 +17702,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17720,10 +17720,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17738,10 +17738,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17756,10 +17756,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -17769,19 +17769,19 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 ; END: 24-31 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] add rsp, 128 ret sp_2048_get_from_table_32 ENDP @@ -20598,8 +20598,8 @@ sp_2048_lshift_32 PROC push r12 push r13 - mov cl, r8b mov rax, rcx + mov cl, r8b mov r12, 0 mov r13, QWORD PTR [rdx+216] mov r8, QWORD PTR [rdx+224] @@ -31837,14 +31837,14 @@ _text SEGMENT READONLY PARA sp_3072_get_from_table_24 PROC sub rsp, 128 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 mov rax, 1 movd xmm10, r8 movd xmm11, rax @@ -31861,10 +31861,10 @@ mov r9, QWORD PTR [rdx] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31878,10 +31878,10 @@ mov r9, QWORD PTR [rdx+8] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31895,10 +31895,10 @@ mov r9, QWORD PTR [rdx+16] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31912,10 +31912,10 @@ mov r9, QWORD PTR [rdx+24] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31929,10 +31929,10 @@ mov r9, QWORD PTR [rdx+32] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31946,10 +31946,10 @@ mov r9, QWORD PTR [rdx+40] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31963,10 +31963,10 @@ mov r9, QWORD PTR [rdx+48] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31980,10 +31980,10 @@ mov r9, QWORD PTR [rdx+56] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -31997,10 +31997,10 @@ mov r9, QWORD PTR [rdx+64] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32014,10 +32014,10 @@ mov r9, QWORD PTR [rdx+72] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32031,10 +32031,10 @@ mov r9, QWORD PTR [rdx+80] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32048,10 +32048,10 @@ mov r9, QWORD PTR [rdx+88] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32065,10 +32065,10 @@ mov r9, QWORD PTR [rdx+96] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32082,10 +32082,10 @@ mov r9, QWORD PTR [rdx+104] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32099,10 +32099,10 @@ mov r9, QWORD PTR [rdx+112] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32116,10 +32116,10 @@ mov r9, QWORD PTR [rdx+120] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32133,10 +32133,10 @@ mov r9, QWORD PTR [rdx+128] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32150,10 +32150,10 @@ mov r9, QWORD PTR [rdx+136] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32167,10 +32167,10 @@ mov r9, QWORD PTR [rdx+144] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32184,10 +32184,10 @@ mov r9, QWORD PTR [rdx+152] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32201,10 +32201,10 @@ mov r9, QWORD PTR [rdx+160] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32218,10 +32218,10 @@ mov r9, QWORD PTR [rdx+168] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32235,10 +32235,10 @@ mov r9, QWORD PTR [rdx+176] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32252,10 +32252,10 @@ mov r9, QWORD PTR [rdx+184] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32269,10 +32269,10 @@ mov r9, QWORD PTR [rdx+192] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32286,10 +32286,10 @@ mov r9, QWORD PTR [rdx+200] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32303,10 +32303,10 @@ mov r9, QWORD PTR [rdx+208] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32320,10 +32320,10 @@ mov r9, QWORD PTR [rdx+216] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32337,10 +32337,10 @@ mov r9, QWORD PTR [rdx+224] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32354,10 +32354,10 @@ mov r9, QWORD PTR [rdx+232] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32371,10 +32371,10 @@ mov r9, QWORD PTR [rdx+240] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32388,10 +32388,10 @@ mov r9, QWORD PTR [rdx+248] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32401,10 +32401,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 0-7 ; START: 8-15 @@ -32418,10 +32418,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32436,10 +32436,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32454,10 +32454,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32472,10 +32472,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32490,10 +32490,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32508,10 +32508,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32526,10 +32526,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32544,10 +32544,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32562,10 +32562,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32580,10 +32580,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32598,10 +32598,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32616,10 +32616,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32634,10 +32634,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32652,10 +32652,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32670,10 +32670,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32688,10 +32688,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32706,10 +32706,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32724,10 +32724,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32742,10 +32742,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32760,10 +32760,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32778,10 +32778,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32796,10 +32796,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32814,10 +32814,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32832,10 +32832,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32850,10 +32850,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32868,10 +32868,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32886,10 +32886,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32904,10 +32904,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32922,10 +32922,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32940,10 +32940,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32958,10 +32958,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32976,10 +32976,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -32989,10 +32989,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 8-15 ; START: 16-23 @@ -33006,10 +33006,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33024,10 +33024,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33042,10 +33042,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33060,10 +33060,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33078,10 +33078,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33096,10 +33096,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33114,10 +33114,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33132,10 +33132,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33150,10 +33150,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33168,10 +33168,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33186,10 +33186,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33204,10 +33204,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33222,10 +33222,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33240,10 +33240,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33258,10 +33258,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33276,10 +33276,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33294,10 +33294,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33312,10 +33312,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33330,10 +33330,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33348,10 +33348,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33366,10 +33366,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33384,10 +33384,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33402,10 +33402,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33420,10 +33420,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33438,10 +33438,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33456,10 +33456,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33474,10 +33474,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33492,10 +33492,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33510,10 +33510,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33528,10 +33528,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33546,10 +33546,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33564,10 +33564,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -33577,19 +33577,19 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 ; END: 16-23 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] add rsp, 128 ret sp_3072_get_from_table_24 ENDP @@ -36853,14 +36853,14 @@ _text SEGMENT READONLY PARA sp_3072_get_from_table_48 PROC sub rsp, 128 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 mov rax, 1 movd xmm10, r8 movd xmm11, rax @@ -36877,10 +36877,10 @@ mov r9, QWORD PTR [rdx] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -36894,10 +36894,10 @@ mov r9, QWORD PTR [rdx+8] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -36911,10 +36911,10 @@ mov r9, QWORD PTR [rdx+16] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -36928,10 +36928,10 @@ mov r9, QWORD PTR [rdx+24] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -36945,10 +36945,10 @@ mov r9, QWORD PTR [rdx+32] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -36962,10 +36962,10 @@ mov r9, QWORD PTR [rdx+40] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -36979,10 +36979,10 @@ mov r9, QWORD PTR [rdx+48] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -36996,10 +36996,10 @@ mov r9, QWORD PTR [rdx+56] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37013,10 +37013,10 @@ mov r9, QWORD PTR [rdx+64] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37030,10 +37030,10 @@ mov r9, QWORD PTR [rdx+72] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37047,10 +37047,10 @@ mov r9, QWORD PTR [rdx+80] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37064,10 +37064,10 @@ mov r9, QWORD PTR [rdx+88] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37081,10 +37081,10 @@ mov r9, QWORD PTR [rdx+96] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37098,10 +37098,10 @@ mov r9, QWORD PTR [rdx+104] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37115,10 +37115,10 @@ mov r9, QWORD PTR [rdx+112] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37132,10 +37132,10 @@ mov r9, QWORD PTR [rdx+120] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37145,10 +37145,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 0-7 ; START: 8-15 @@ -37162,10 +37162,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37180,10 +37180,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37198,10 +37198,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37216,10 +37216,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37234,10 +37234,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37252,10 +37252,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37270,10 +37270,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37288,10 +37288,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37306,10 +37306,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37324,10 +37324,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37342,10 +37342,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37360,10 +37360,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37378,10 +37378,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37396,10 +37396,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37414,10 +37414,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37432,10 +37432,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37445,10 +37445,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 8-15 ; START: 16-23 @@ -37462,10 +37462,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37480,10 +37480,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37498,10 +37498,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37516,10 +37516,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37534,10 +37534,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37552,10 +37552,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37570,10 +37570,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37588,10 +37588,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37606,10 +37606,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37624,10 +37624,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37642,10 +37642,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37660,10 +37660,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37678,10 +37678,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37696,10 +37696,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37714,10 +37714,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37732,10 +37732,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37745,10 +37745,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 16-23 ; START: 24-31 @@ -37762,10 +37762,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37780,10 +37780,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37798,10 +37798,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37816,10 +37816,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37834,10 +37834,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37852,10 +37852,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37870,10 +37870,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37888,10 +37888,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37906,10 +37906,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37924,10 +37924,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37942,10 +37942,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37960,10 +37960,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37978,10 +37978,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -37996,10 +37996,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38014,10 +38014,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38032,10 +38032,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38045,10 +38045,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 24-31 ; START: 32-39 @@ -38062,10 +38062,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38080,10 +38080,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38098,10 +38098,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38116,10 +38116,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38134,10 +38134,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38152,10 +38152,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38170,10 +38170,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38188,10 +38188,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38206,10 +38206,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38224,10 +38224,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38242,10 +38242,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38260,10 +38260,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38278,10 +38278,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38296,10 +38296,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38314,10 +38314,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38332,10 +38332,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38345,10 +38345,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 32-39 ; START: 40-47 @@ -38362,10 +38362,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38380,10 +38380,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38398,10 +38398,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38416,10 +38416,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38434,10 +38434,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38452,10 +38452,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38470,10 +38470,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38488,10 +38488,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38506,10 +38506,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38524,10 +38524,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38542,10 +38542,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38560,10 +38560,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38578,10 +38578,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38596,10 +38596,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38614,10 +38614,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38632,10 +38632,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -38645,19 +38645,19 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 ; END: 40-47 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] add rsp, 128 ret sp_3072_get_from_table_48 ENDP @@ -40446,8 +40446,8 @@ sp_3072_lshift_48 PROC push r12 push r13 - mov cl, r8b mov rax, rcx + mov cl, r8b mov r12, 0 mov r13, QWORD PTR [rdx+344] mov r8, QWORD PTR [rdx+352] @@ -49224,14 +49224,14 @@ _text SEGMENT READONLY PARA sp_4096_get_from_table_64 PROC sub rsp, 128 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 mov rax, 1 movd xmm10, r8 movd xmm11, rax @@ -49248,10 +49248,10 @@ mov r9, QWORD PTR [rdx] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49265,10 +49265,10 @@ mov r9, QWORD PTR [rdx+8] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49282,10 +49282,10 @@ mov r9, QWORD PTR [rdx+16] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49299,10 +49299,10 @@ mov r9, QWORD PTR [rdx+24] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49316,10 +49316,10 @@ mov r9, QWORD PTR [rdx+32] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49333,10 +49333,10 @@ mov r9, QWORD PTR [rdx+40] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49350,10 +49350,10 @@ mov r9, QWORD PTR [rdx+48] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49367,10 +49367,10 @@ mov r9, QWORD PTR [rdx+56] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49384,10 +49384,10 @@ mov r9, QWORD PTR [rdx+64] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49401,10 +49401,10 @@ mov r9, QWORD PTR [rdx+72] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49418,10 +49418,10 @@ mov r9, QWORD PTR [rdx+80] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49435,10 +49435,10 @@ mov r9, QWORD PTR [rdx+88] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49452,10 +49452,10 @@ mov r9, QWORD PTR [rdx+96] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49469,10 +49469,10 @@ mov r9, QWORD PTR [rdx+104] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49486,10 +49486,10 @@ mov r9, QWORD PTR [rdx+112] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49503,10 +49503,10 @@ mov r9, QWORD PTR [rdx+120] movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49516,10 +49516,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 0-7 ; START: 8-15 @@ -49533,10 +49533,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49551,10 +49551,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49569,10 +49569,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49587,10 +49587,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49605,10 +49605,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49623,10 +49623,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49641,10 +49641,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49659,10 +49659,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49677,10 +49677,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49695,10 +49695,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49713,10 +49713,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49731,10 +49731,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49749,10 +49749,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49767,10 +49767,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49785,10 +49785,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49803,10 +49803,10 @@ add r9, 64 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49816,10 +49816,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 8-15 ; START: 16-23 @@ -49833,10 +49833,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49851,10 +49851,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49869,10 +49869,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49887,10 +49887,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49905,10 +49905,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49923,10 +49923,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49941,10 +49941,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49959,10 +49959,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49977,10 +49977,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -49995,10 +49995,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50013,10 +50013,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50031,10 +50031,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50049,10 +50049,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50067,10 +50067,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50085,10 +50085,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50103,10 +50103,10 @@ add r9, 128 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50116,10 +50116,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 16-23 ; START: 24-31 @@ -50133,10 +50133,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50151,10 +50151,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50169,10 +50169,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50187,10 +50187,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50205,10 +50205,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50223,10 +50223,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50241,10 +50241,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50259,10 +50259,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50277,10 +50277,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50295,10 +50295,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50313,10 +50313,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50331,10 +50331,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50349,10 +50349,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50367,10 +50367,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50385,10 +50385,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50403,10 +50403,10 @@ add r9, 192 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50416,10 +50416,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 24-31 ; START: 32-39 @@ -50433,10 +50433,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50451,10 +50451,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50469,10 +50469,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50487,10 +50487,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50505,10 +50505,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50523,10 +50523,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50541,10 +50541,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50559,10 +50559,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50577,10 +50577,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50595,10 +50595,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50613,10 +50613,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50631,10 +50631,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50649,10 +50649,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50667,10 +50667,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50685,10 +50685,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50703,10 +50703,10 @@ add r9, 256 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50716,10 +50716,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 32-39 ; START: 40-47 @@ -50733,10 +50733,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50751,10 +50751,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50769,10 +50769,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50787,10 +50787,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50805,10 +50805,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50823,10 +50823,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50841,10 +50841,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50859,10 +50859,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50877,10 +50877,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50895,10 +50895,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50913,10 +50913,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50931,10 +50931,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50949,10 +50949,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50967,10 +50967,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -50985,10 +50985,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51003,10 +51003,10 @@ add r9, 320 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51016,10 +51016,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 40-47 ; START: 48-55 @@ -51033,10 +51033,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51051,10 +51051,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51069,10 +51069,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51087,10 +51087,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51105,10 +51105,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51123,10 +51123,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51141,10 +51141,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51159,10 +51159,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51177,10 +51177,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51195,10 +51195,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51213,10 +51213,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51231,10 +51231,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51249,10 +51249,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51267,10 +51267,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51285,10 +51285,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51303,10 +51303,10 @@ add r9, 384 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51316,10 +51316,10 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 add rcx, 64 ; END: 48-55 ; START: 56-63 @@ -51333,10 +51333,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51351,10 +51351,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51369,10 +51369,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51387,10 +51387,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51405,10 +51405,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51423,10 +51423,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51441,10 +51441,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51459,10 +51459,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51477,10 +51477,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51495,10 +51495,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51513,10 +51513,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51531,10 +51531,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51549,10 +51549,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51567,10 +51567,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51585,10 +51585,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51603,10 +51603,10 @@ add r9, 448 movdqu xmm12, xmm13 pcmpeqd xmm12, xmm10 - movdqu xmm0, [r9] - movdqu xmm1, [r9+16] - movdqu xmm2, [r9+32] - movdqu xmm3, [r9+48] + movdqu xmm0, OWORD PTR [r9] + movdqu xmm1, OWORD PTR [r9+16] + movdqu xmm2, OWORD PTR [r9+32] + movdqu xmm3, OWORD PTR [r9+48] pand xmm0, xmm12 pand xmm1, xmm12 pand xmm2, xmm12 @@ -51616,19 +51616,19 @@ por xmm6, xmm2 por xmm7, xmm3 paddd xmm13, xmm11 - movdqu [rcx], xmm4 - movdqu [rcx+16], xmm5 - movdqu [rcx+32], xmm6 - movdqu [rcx+48], xmm7 + movdqu OWORD PTR [rcx], xmm4 + movdqu OWORD PTR [rcx+16], xmm5 + movdqu OWORD PTR [rcx+32], xmm6 + movdqu OWORD PTR [rcx+48], xmm7 ; END: 56-63 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] add rsp, 128 ret sp_4096_get_from_table_64 ENDP @@ -53973,8 +53973,8 @@ sp_4096_lshift_64 PROC push r12 push r13 - mov cl, r8b mov rax, rcx + mov cl, r8b mov r12, 0 mov r13, QWORD PTR [rdx+472] mov r8, QWORD PTR [rdx+480] @@ -54329,11 +54329,12 @@ mov rbp, r8 mov rax, rdx mov rdx, QWORD PTR [rax] + mov r14, QWORD PTR [rbp+8] ; A[0] * B[0] mulx r9, r8, QWORD PTR [rbp] xor rbx, rbx ; A[0] * B[1] - mulx r10, rdi, QWORD PTR [rbp+8] + mulx r10, rdi, r14 adcx r9, rdi ; A[0] * B[2] mulx r11, rdi, QWORD PTR [rbp+16] @@ -54348,7 +54349,7 @@ xor rbx, rbx adcx r9, rdi ; A[1] * B[1] - mulx r15, rdi, QWORD PTR [rbp+8] + mulx r15, rdi, r14 adox r10, rsi adcx r10, rdi ; A[1] * B[2] @@ -54367,7 +54368,7 @@ xor rbx, rbx adcx r10, rdi ; A[2] * B[1] - mulx r15, rdi, QWORD PTR [rbp+8] + mulx r15, rdi, r14 adox r11, rsi adcx r11, rdi ; A[2] * B[2] @@ -54716,7 +54717,7 @@ ; * a First number to multiply in Montgomery form. ; * b Second number to multiply in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_256_mont_mul_4 PROC @@ -54884,11 +54885,10 @@ adc rbx, 0 sbb r11, 0 mov r10, 18446744069414584321 - mov rax, r11 ; mask m and sub from result if overflow ; m[0] = -1 & mask = mask - shr rax, 32 ; m[2] = 0 & mask = 0 + mov eax, r11d and r10, r11 sub r15, r11 sbb rdi, rax @@ -54913,7 +54913,7 @@ ; * r Result of squaring. ; * a Number to square in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_256_mont_sqr_4 PROC @@ -55060,11 +55060,10 @@ adc rsi, 0 sbb r10, 0 mov r8, 18446744069414584321 - mov rax, r10 ; mask m and sub from result if overflow ; m[0] = -1 & mask = mask - shr rax, 32 ; m[2] = 0 & mask = 0 + mov eax, r10d and r8, r10 sub r14, r10 sbb r15, rax @@ -55263,11 +55262,10 @@ adc rdi, 0 sbb r9, 0 mov rbx, 18446744069414584321 - mov rax, r9 ; mask m and sub from result if overflow ; m[0] = -1 & mask = mask - shr rax, 32 ; m[2] = 0 & mask = 0 + mov eax, r9d and rbx, r9 sub r13, r9 sbb r14, rax @@ -55404,13 +55402,12 @@ mov r10, QWORD PTR [rdx+16] mov r11, QWORD PTR [rdx+24] add rax, QWORD PTR [r8] - mov r12, 4294967295 adc r9, QWORD PTR [r8+8] mov r13, 18446744069414584321 adc r10, QWORD PTR [r8+16] adc r11, QWORD PTR [r8+24] sbb rdx, rdx - and r12, rdx + mov r12d, edx and r13, rdx sub rax, rdx sbb r9, r12 @@ -55447,13 +55444,13 @@ mov r9, QWORD PTR [rdx+16] mov r10, QWORD PTR [rdx+24] add rax, rax - mov r11, 4294967295 adc r8, r8 mov r12, 18446744069414584321 adc r9, r9 + mov r13, r10 adc r10, r10 - sbb r13, r13 - and r11, r13 + sar r13, 63 + mov r11d, r13d and r12, r13 sub rax, r13 sbb r8, r11 @@ -55490,13 +55487,12 @@ mov r9, QWORD PTR [rdx+16] mov r10, QWORD PTR [rdx+24] add rax, rax - mov r11, 4294967295 adc r8, r8 mov r12, 18446744069414584321 adc r9, r9 adc r10, r10 sbb r13, r13 - and r11, r13 + mov r11d, r13d and r12, r13 sub rax, r13 sbb r8, r11 @@ -55510,13 +55506,12 @@ sbb r9, 0 sbb r10, r12 add rax, QWORD PTR [rdx] - mov r11, 4294967295 adc r8, QWORD PTR [rdx+8] mov r12, 18446744069414584321 adc r9, QWORD PTR [rdx+16] adc r10, QWORD PTR [rdx+24] - sbb r13, r13 - and r11, r13 + sbb r13, 0 + mov r11d, r13d and r12, r13 sub rax, r13 sbb r8, r11 @@ -55554,13 +55549,12 @@ mov r10, QWORD PTR [rdx+16] mov r11, QWORD PTR [rdx+24] sub rax, QWORD PTR [r8] - mov r12, 4294967295 sbb r9, QWORD PTR [r8+8] mov r13, 18446744069414584321 sbb r10, QWORD PTR [r8+16] sbb r11, QWORD PTR [r8+24] sbb rdx, rdx - and r12, rdx + mov r12d, edx and r13, rdx add rax, rdx adc r9, r12 @@ -55582,45 +55576,6 @@ ret sp_256_mont_sub_4 ENDP _text ENDS -; /* Subtract two Montgomery form numbers (r = a - b % m). -; * -; * b is less than the modulus. -; * -; * r Result of subtration. -; * a Number to subtract from in Montgomery form. -; * b Number to subtract with in Montgomery form. -; * m Modulus (prime). -; */ -_text SEGMENT READONLY PARA -sp_256_mont_sub_lower_4 PROC - push r12 - push r13 - mov rax, QWORD PTR [rdx] - mov r9, QWORD PTR [rdx+8] - mov r10, QWORD PTR [rdx+16] - mov r11, QWORD PTR [rdx+24] - sub rax, QWORD PTR [r8] - mov r12, 4294967295 - sbb r9, QWORD PTR [r8+8] - mov r13, 18446744069414584321 - sbb r10, QWORD PTR [r8+16] - sbb r11, QWORD PTR [r8+24] - sbb rdx, rdx - and r12, rdx - and r13, rdx - add rax, rdx - adc r9, r12 - mov QWORD PTR [rcx], rax - adc r10, 0 - mov QWORD PTR [rcx+8], r9 - adc r11, r13 - mov QWORD PTR [rcx+16], r10 - mov QWORD PTR [rcx+24], r11 - pop r13 - pop r12 - ret -sp_256_mont_sub_lower_4 ENDP -_text ENDS ; /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) ; * ; * r Result of division by 2. @@ -55628,19 +55583,18 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_256_div2_4 PROC +sp_256_mont_div2_4 PROC push r12 push r13 mov rax, QWORD PTR [rdx] mov r8, QWORD PTR [rdx+8] mov r9, QWORD PTR [rdx+16] mov r10, QWORD PTR [rdx+24] - mov r11, 4294967295 mov r12, 18446744069414584321 mov r13, rax and r13, 1 neg r13 - and r11, r13 + mov r11d, r13d and r12, r13 add rax, r13 adc r8, r11 @@ -55659,65 +55613,7 @@ pop r13 pop r12 ret -sp_256_div2_4 ENDP -_text ENDS -; /* Triple a Montgomery form number (r = a + a + a % m). -; * -; * a is less than m. -; * -; * r Result of Tripling. -; * a Number to triple in Montgomery form. -; * m Modulus (prime). -; */ -_text SEGMENT READONLY PARA -sp_256_mont_tpl_lower_4 PROC - push r12 - push r13 - mov rax, QWORD PTR [rdx] - mov r8, QWORD PTR [rdx+8] - mov r9, QWORD PTR [rdx+16] - mov r10, QWORD PTR [rdx+24] - add rax, rax - mov r11, 4294967295 - adc r8, r8 - mov r12, 18446744069414584321 - adc r9, r9 - adc r10, r10 - sbb r13, r13 - and r11, r13 - and r12, r13 - sub rax, r13 - sbb r8, r11 - sbb r9, 0 - sbb r10, r12 - add rax, QWORD PTR [rdx] - mov r11, 4294967295 - adc r8, QWORD PTR [rdx+8] - mov r12, 18446744069414584321 - adc r9, QWORD PTR [rdx+16] - adc r10, QWORD PTR [rdx+24] - sbb r13, r13 - and r11, r13 - and r12, r13 - sub rax, r13 - sbb r8, r11 - sbb r9, 0 - sbb r10, r12 - adc r13, 0 - and r11, r13 - and r12, r13 - sub rax, r13 - sbb r8, r11 - mov QWORD PTR [rcx], rax - sbb r9, 0 - mov QWORD PTR [rcx+8], r8 - sbb r10, r12 - mov QWORD PTR [rcx+16], r9 - mov QWORD PTR [rcx+24], r10 - pop r13 - pop r12 - ret -sp_256_mont_tpl_lower_4 ENDP +sp_256_mont_div2_4 ENDP _text ENDS ; /* Two Montgomery numbers, subtract double second from first (r = a - 2.b % m). ; * @@ -55727,7 +55623,7 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_256_mont_sub_dbl_4 PROC +sp_256_mont_rsb_sub_dbl_4 PROC push r12 push r13 push r14 @@ -55743,42 +55639,40 @@ mov r14, QWORD PTR [r8+16] mov r15, QWORD PTR [r8+24] add r12, r12 - mov rdi, 4294967295 adc r13, r13 mov rsi, 18446744069414584321 adc r14, r14 adc r15, r15 - sbb r8, r8 - and rdi, r8 - and rsi, r8 - sub r12, r8 + sbb rdx, rdx + mov edi, edx + and rsi, rdx + sub r12, rdx sbb r13, rdi sbb r14, 0 sbb r15, rsi - adc r8, 0 - and rdi, r8 - and rsi, r8 - sub r12, r8 + adc rdx, 0 + and rdi, rdx + and rsi, rdx + sub r12, rdx sbb r13, rdi sbb r14, 0 sbb r15, rsi sub rax, r12 - mov rdi, 4294967295 sbb r9, r13 mov rsi, 18446744069414584321 sbb r10, r14 sbb r11, r15 - sbb r8, r8 - and rdi, r8 - and rsi, r8 - add rax, r8 + sbb rdx, 0 + mov edi, edx + and rsi, rdx + add rax, rdx adc r9, rdi adc r10, 0 adc r11, rsi - adc r8, 0 - and rdi, r8 - and rsi, r8 - add rax, r8 + adc rdx, 0 + and rdi, rdx + and rsi, rdx + add rax, rdx adc r9, rdi mov QWORD PTR [rcx], rax adc r10, 0 @@ -55786,6 +55680,33 @@ adc r11, rsi mov QWORD PTR [rcx+16], r10 mov QWORD PTR [rcx+24], r11 + mov r12, QWORD PTR [r8] + mov r13, QWORD PTR [r8+8] + mov r14, QWORD PTR [r8+16] + mov r15, QWORD PTR [r8+24] + sub r12, rax + sbb r13, r9 + mov rsi, 18446744069414584321 + sbb r14, r10 + sbb r15, r11 + sbb rdx, rdx + mov edi, edx + and rsi, rdx + add r12, rdx + adc r13, rdi + adc r14, 0 + adc r15, rsi + adc rdx, 0 + and rdi, rdx + and rsi, rdx + add r12, rdx + adc r13, rdi + mov QWORD PTR [r8], r12 + adc r14, 0 + mov QWORD PTR [r8+8], r13 + adc r15, rsi + mov QWORD PTR [r8+16], r14 + mov QWORD PTR [r8+24], r15 pop rsi pop rdi pop r15 @@ -55793,81 +55714,28 @@ pop r13 pop r12 ret -sp_256_mont_sub_dbl_4 ENDP -_text ENDS -; /* Two Montgomery numbers, subtract second from first and double. -; * (r = 2.(a - b) % m). -; * -; * b must have came from a mont_sub operation. -; * -; * r Result of subtration. -; * a Number to subtract from in Montgomery form. -; * b Number to subtract with in Montgomery form. -; * m Modulus (prime). -; */ -_text SEGMENT READONLY PARA -sp_256_mont_dbl_sub_4 PROC - push r12 - push r13 - mov rax, QWORD PTR [rdx] - mov r9, QWORD PTR [rdx+8] - mov r10, QWORD PTR [rdx+16] - mov r11, QWORD PTR [rdx+24] - sub rax, QWORD PTR [r8] - mov r12, 4294967295 - sbb r9, QWORD PTR [r8+8] - mov r13, 18446744069414584321 - sbb r10, QWORD PTR [r8+16] - sbb r11, QWORD PTR [r8+24] - sbb r8, r8 - and r12, r8 - and r13, r8 - add rax, r8 - adc r9, r12 - adc r10, 0 - adc r11, r13 - add rax, rax - mov r12, 4294967295 - adc r9, r9 - mov r13, 18446744069414584321 - adc r10, r10 - adc r11, r11 - sbb r8, r8 - and r12, r8 - and r13, r8 - sub rax, r8 - sbb r9, r12 - mov QWORD PTR [rcx], rax - sbb r10, 0 - mov QWORD PTR [rcx+8], r9 - sbb r11, r13 - mov QWORD PTR [rcx+16], r10 - mov QWORD PTR [rcx+24], r11 - pop r13 - pop r12 - ret -sp_256_mont_dbl_sub_4 ENDP +sp_256_mont_rsb_sub_dbl_4 ENDP _text ENDS IFNDEF WC_NO_CACHE_RESISTANT ; /* Touch each possible point that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of point to retrieve. ; */ _text SEGMENT READONLY PARA sp_256_get_point_33_4 PROC sub rsp, 160 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 - vmovdqu OWORD PTR [rsp+128], xmm14 - vmovdqu OWORD PTR [rsp+144], xmm15 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp+128], xmm14 + movdqu OWORD PTR [rsp+144], xmm15 mov rax, 1 movd xmm13, r8d add rdx, 200 @@ -55887,12 +55755,12 @@ movdqa xmm12, xmm14 paddd xmm14, xmm15 pcmpeqd xmm12, xmm13 - movdqu xmm6, [rdx] - movdqu xmm7, [rdx+16] - movdqu xmm8, [rdx+64] - movdqu xmm9, [rdx+80] - movdqu xmm10, [rdx+128] - movdqu xmm11, [rdx+144] + movdqu xmm6, OWORD PTR [rdx] + movdqu xmm7, OWORD PTR [rdx+16] + movdqu xmm8, OWORD PTR [rdx+64] + movdqu xmm9, OWORD PTR [rdx+80] + movdqu xmm10, OWORD PTR [rdx+128] + movdqu xmm11, OWORD PTR [rdx+144] add rdx, 200 pand xmm6, xmm12 pand xmm7, xmm12 @@ -55908,22 +55776,22 @@ por xmm5, xmm11 dec rax jnz L_256_get_point_33_4_start_1 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+64], xmm2 - movdqu [rcx+80], xmm3 - movdqu [rcx+128], xmm4 - movdqu [rcx+144], xmm5 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] - vmovdqu xmm14, OWORD PTR [rsp+128] - vmovdqu xmm15, OWORD PTR [rsp+144] + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+64], xmm2 + movdqu OWORD PTR [rcx+80], xmm3 + movdqu OWORD PTR [rcx+128], xmm4 + movdqu OWORD PTR [rcx+144], xmm5 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm14, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] add rsp, 160 ret sp_256_get_point_33_4 ENDP @@ -55932,7 +55800,7 @@ ; /* Touch each possible point that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of point to retrieve. ; */ _text SEGMENT READONLY PARA @@ -55990,7 +55858,7 @@ ; * a First number to multiply in Montgomery form. ; * b Second number to multiply in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_256_mont_mul_avx2_4 PROC @@ -56005,11 +55873,12 @@ mov rbp, r8 mov rax, rdx mov rdx, QWORD PTR [rax] + mov r14, QWORD PTR [rbp+8] ; A[0] * B[0] mulx r9, r8, QWORD PTR [rbp] xor rbx, rbx ; A[0] * B[1] - mulx r10, rdi, QWORD PTR [rbp+8] + mulx r10, rdi, r14 adcx r9, rdi ; A[0] * B[2] mulx r11, rdi, QWORD PTR [rbp+16] @@ -56024,7 +55893,7 @@ xor rbx, rbx adcx r9, rdi ; A[1] * B[1] - mulx r15, rdi, QWORD PTR [rbp+8] + mulx r15, rdi, r14 adox r10, rsi adcx r10, rdi ; A[1] * B[2] @@ -56043,7 +55912,7 @@ xor rbx, rbx adcx r10, rdi ; A[2] * B[1] - mulx r15, rdi, QWORD PTR [rbp+8] + mulx r15, rdi, r14 adox r11, rsi adcx r11, rdi ; A[2] * B[2] @@ -56133,11 +56002,10 @@ adc r15, 0 sbb r8, 0 mov rax, 18446744069414584321 - mov rdi, r8 ; mask m and sub from result if overflow ; m[0] = -1 & mask = mask - shr rdi, 32 ; m[2] = 0 & mask = 0 + mov edi, r8d and rax, r8 sub r12, r8 sbb r13, rdi @@ -56165,7 +56033,7 @@ ; * r Result of squaring. ; * a Number to square in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_256_mont_sqr_avx2_4 PROC @@ -56292,11 +56160,10 @@ adc r15, 0 sbb r8, 0 mov rax, 18446744069414584321 - mov rdi, r8 ; mask m and sub from result if overflow ; m[0] = -1 & mask = mask - shr rdi, 32 ; m[2] = 0 & mask = 0 + mov edi, r8d and rax, r8 sub r12, r8 sbb r13, rdi @@ -56373,7 +56240,7 @@ ; * mp The digit representing the negative inverse of m mod 2^n. ; */ _text SEGMENT READONLY PARA -sp_256_mont_reduce_avx2_order_4 PROC +sp_256_mont_reduce_order_avx2_4 PROC push r12 push r13 push r14 @@ -56521,7 +56388,7 @@ pop r13 pop r12 ret -sp_256_mont_reduce_avx2_order_4 ENDP +sp_256_mont_reduce_order_avx2_4 ENDP _text ENDS ENDIF IFDEF HAVE_INTEL_AVX2 @@ -56532,19 +56399,18 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_256_div2_avx2_4 PROC +sp_256_mont_div2_avx2_4 PROC push r12 push r13 mov rax, QWORD PTR [rdx] mov r8, QWORD PTR [rdx+8] mov r9, QWORD PTR [rdx+16] mov r10, QWORD PTR [rdx+24] - mov r11, 4294967295 mov r12, 18446744069414584321 mov r13, rax and r13, 1 neg r13 - and r11, r13 + mov r11d, r13d and r12, r13 add rax, r13 adc r8, r11 @@ -56563,25 +56429,25 @@ pop r13 pop r12 ret -sp_256_div2_avx2_4 ENDP +sp_256_mont_div2_avx2_4 ENDP _text ENDS ENDIF IFNDEF WC_NO_CACHE_RESISTANT ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA sp_256_get_entry_64_4 PROC sub rsp, 96 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 ; From entry 1 mov rax, 1 movd xmm9, r8d @@ -56600,10 +56466,10 @@ movdqa xmm8, xmm10 paddd xmm10, xmm11 pcmpeqd xmm8, xmm9 - movdqu xmm4, [rdx] - movdqu xmm5, [rdx+16] - movdqu xmm6, [rdx+32] - movdqu xmm7, [rdx+48] + movdqu xmm4, OWORD PTR [rdx] + movdqu xmm5, OWORD PTR [rdx+16] + movdqu xmm6, OWORD PTR [rdx+32] + movdqu xmm7, OWORD PTR [rdx+48] add rdx, 64 pand xmm4, xmm8 pand xmm5, xmm8 @@ -56615,16 +56481,16 @@ por xmm3, xmm7 dec rax jnz L_256_get_entry_64_4_start_0 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+64], xmm2 - movdqu [rcx+80], xmm3 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+64], xmm2 + movdqu OWORD PTR [rcx+80], xmm3 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] add rsp, 96 ret sp_256_get_entry_64_4 ENDP @@ -56633,7 +56499,7 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA @@ -56678,18 +56544,18 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA sp_256_get_entry_65_4 PROC sub rsp, 96 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 ; From entry 1 mov rax, 1 movd xmm9, r8d @@ -56708,10 +56574,10 @@ movdqa xmm8, xmm10 paddd xmm10, xmm11 pcmpeqd xmm8, xmm9 - movdqu xmm4, [rdx] - movdqu xmm5, [rdx+16] - movdqu xmm6, [rdx+32] - movdqu xmm7, [rdx+48] + movdqu xmm4, OWORD PTR [rdx] + movdqu xmm5, OWORD PTR [rdx+16] + movdqu xmm6, OWORD PTR [rdx+32] + movdqu xmm7, OWORD PTR [rdx+48] add rdx, 64 pand xmm4, xmm8 pand xmm5, xmm8 @@ -56723,16 +56589,16 @@ por xmm3, xmm7 dec rax jnz L_256_get_entry_65_4_start_0 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+64], xmm2 - movdqu [rcx+80], xmm3 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+64], xmm2 + movdqu OWORD PTR [rcx+80], xmm3 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] add rsp, 96 ret sp_256_get_entry_65_4 ENDP @@ -56741,7 +56607,7 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA @@ -57150,11 +57016,12 @@ mov rbp, r8 mov rax, rdx mov rdx, QWORD PTR [rax] + mov r14, QWORD PTR [rbp+8] ; A[0] * B[0] mulx r9, r8, QWORD PTR [rbp] xor rbx, rbx ; A[0] * B[1] - mulx r10, rdi, QWORD PTR [rbp+8] + mulx r10, rdi, r14 adcx r9, rdi ; A[0] * B[2] mulx r11, rdi, QWORD PTR [rbp+16] @@ -57169,7 +57036,7 @@ xor rbx, rbx adcx r9, rdi ; A[1] * B[1] - mulx r15, rdi, QWORD PTR [rbp+8] + mulx r15, rdi, r14 adox r10, rsi adcx r10, rdi ; A[1] * B[2] @@ -57188,7 +57055,7 @@ xor rbx, rbx adcx r10, rdi ; A[2] * B[1] - mulx r15, rdi, QWORD PTR [rbp+8] + mulx r15, rdi, r14 adox r11, rsi adcx r11, rdi ; A[2] * B[2] @@ -57848,22 +57715,22 @@ mov r13, QWORD PTR [rdx+8] mov r14, QWORD PTR [rdx+16] mov r15, QWORD PTR [rdx+24] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_order + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_order] vmovupd ymm6, YMMWORD PTR [rbx] vmovupd ymm7, YMMWORD PTR [rbx+32] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_one + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_one] vmovupd ymm8, YMMWORD PTR [rbx] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_mask01111 + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_mask01111] vmovupd ymm9, YMMWORD PTR [rbx] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_all_one + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_all_one] vmovupd ymm10, YMMWORD PTR [rbx] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_down_one_dword + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_down_one_dword] vmovupd ymm11, YMMWORD PTR [rbx] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_neg + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_neg] vmovupd ymm12, YMMWORD PTR [rbx] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_up_one_dword + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_up_one_dword] vmovupd ymm13, YMMWORD PTR [rbx] - mov rbx, ptr_L_sp256_mod_inv_avx2_4_mask26 + mov rbx, QWORD PTR [ptr_L_sp256_mod_inv_avx2_4_mask26] vmovupd ymm14, YMMWORD PTR [rbx] vpxor xmm0, xmm0, xmm0 vpxor xmm1, xmm1, xmm1 @@ -59310,11 +59177,10 @@ ; Subtract mod if carry neg r11 mov r10, 18446744073709551614 - mov r8, r11 + mov r8d, r11d mov r9, r11 - shr r8, 32 - shl r9, 32 and r10, r11 + shl r9, 32 sub rbx, r8 sbb rbp, r9 sbb r12, r10 @@ -59533,7 +59399,6 @@ mov r12, QWORD PTR [rdx+32] mov r13, QWORD PTR [rdx+40] add rax, QWORD PTR [r8] - mov r14, 4294967295 adc r9, QWORD PTR [r8+8] mov r15, 18446744069414584320 adc r10, QWORD PTR [r8+16] @@ -59542,7 +59407,7 @@ adc r12, QWORD PTR [r8+32] adc r13, QWORD PTR [r8+40] sbb rdx, rdx - and r14, rdx + mov r14d, edx and r15, rdx and rdi, rdx sub rax, r14 @@ -59595,16 +59460,16 @@ mov r11, QWORD PTR [rdx+32] mov r12, QWORD PTR [rdx+40] add rax, rax - mov r13, 4294967295 adc r8, r8 mov r14, 18446744069414584320 adc r9, r9 mov r15, 18446744073709551614 adc r10, r10 adc r11, r11 + mov rdi, r12 adc r12, r12 - sbb rdi, rdi - and r13, rdi + sar rdi, 63 + mov r13d, edi and r14, rdi and r15, rdi sub rax, r13 @@ -59657,7 +59522,6 @@ mov r11, QWORD PTR [rdx+32] mov r12, QWORD PTR [rdx+40] add rax, rax - mov r13, 4294967295 adc r8, r8 mov r14, 18446744069414584320 adc r9, r9 @@ -59666,7 +59530,7 @@ adc r11, r11 adc r12, r12 sbb rdi, rdi - and r13, rdi + mov r13d, edi and r14, rdi and r15, rdi sub rax, r13 @@ -59687,7 +59551,6 @@ sbb r11, rdi sbb r12, rdi add rax, QWORD PTR [rdx] - mov r13, 4294967295 adc r8, QWORD PTR [rdx+8] mov r14, 18446744069414584320 adc r9, QWORD PTR [rdx+16] @@ -59696,7 +59559,7 @@ adc r11, QWORD PTR [rdx+32] adc r12, QWORD PTR [rdx+40] sbb rdi, rdi - and r13, rdi + mov r13d, edi and r14, rdi and r15, rdi sub rax, r13 @@ -59750,7 +59613,6 @@ mov r12, QWORD PTR [rdx+32] mov r13, QWORD PTR [rdx+40] sub rax, QWORD PTR [r8] - mov r14, 4294967295 sbb r9, QWORD PTR [r8+8] mov r15, 18446744069414584320 sbb r10, QWORD PTR [r8+16] @@ -59759,7 +59621,7 @@ sbb r12, QWORD PTR [r8+32] sbb r13, QWORD PTR [r8+40] sbb rdx, rdx - and r14, rdx + mov r14d, edx and r15, rdx and rdi, rdx add rax, r14 @@ -59792,61 +59654,6 @@ ret sp_384_mont_sub_6 ENDP _text ENDS -; /* Subtract two Montgomery form numbers (r = a - b % m). -; * -; * b is less than the modulus. -; * -; * r Result of subtration. -; * a Number to subtract from in Montgomery form. -; * b Number to subtract with in Montgomery form. -; * m Modulus (prime). -; */ -_text SEGMENT READONLY PARA -sp_384_mont_sub_lower_6 PROC - push r12 - push r13 - push r14 - push r15 - push rdi - mov rax, QWORD PTR [rdx] - mov r9, QWORD PTR [rdx+8] - mov r10, QWORD PTR [rdx+16] - mov r11, QWORD PTR [rdx+24] - mov r12, QWORD PTR [rdx+32] - mov r13, QWORD PTR [rdx+40] - sub rax, QWORD PTR [r8] - mov r14, 4294967295 - sbb r9, QWORD PTR [r8+8] - mov r15, 18446744069414584320 - sbb r10, QWORD PTR [r8+16] - mov rdi, 18446744073709551614 - sbb r11, QWORD PTR [r8+24] - sbb r12, QWORD PTR [r8+32] - sbb r13, QWORD PTR [r8+40] - sbb rdx, rdx - and r14, rdx - and r15, rdx - and rdi, rdx - add rax, r14 - adc r9, r15 - mov QWORD PTR [rcx], rax - adc r10, rdi - mov QWORD PTR [rcx+8], r9 - adc r11, rdx - mov QWORD PTR [rcx+16], r10 - adc r12, rdx - mov QWORD PTR [rcx+24], r11 - adc r13, rdx - mov QWORD PTR [rcx+32], r12 - mov QWORD PTR [rcx+40], r13 - pop rdi - pop r15 - pop r14 - pop r13 - pop r12 - ret -sp_384_mont_sub_lower_6 ENDP -_text ENDS ; /* Divide the number by 2 mod the modulus (prime). (r = a / 2 % m) ; * ; * r Result of division by 2. @@ -59854,7 +59661,7 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_384_div2_6 PROC +sp_384_mont_div2_6 PROC push r12 push r13 sub rsp, 48 @@ -59915,166 +59722,28 @@ pop r13 pop r12 ret -sp_384_div2_6 ENDP -_text ENDS -; /* Double a Montgomery form number (r = a + a % m). -; * -; * a is less than m. -; * -; * r Result of doubling. -; * a Number to double in Montgomery form. -; * m Modulus (prime). -; */ -_text SEGMENT READONLY PARA -sp_384_mont_dbl_lower_6 PROC - push r12 - push r13 - push r14 - push r15 - push rdi - mov rax, QWORD PTR [rdx] - mov r8, QWORD PTR [rdx+8] - mov r9, QWORD PTR [rdx+16] - mov r10, QWORD PTR [rdx+24] - mov r11, QWORD PTR [rdx+32] - mov r12, QWORD PTR [rdx+40] - add rax, rax - mov r13, 4294967295 - adc r8, r8 - mov r14, 18446744069414584320 - adc r9, r9 - mov r15, 18446744073709551614 - adc r10, r10 - adc r11, r11 - adc r12, r12 - sbb rdi, rdi - and r13, rdi - and r14, rdi - and r15, rdi - sub rax, r13 - sbb r8, r14 - mov QWORD PTR [rcx], rax - sbb r9, r15 - mov QWORD PTR [rcx+8], r8 - sbb r10, rdi - mov QWORD PTR [rcx+16], r9 - sbb r11, rdi - mov QWORD PTR [rcx+24], r10 - sbb r12, rdi - mov QWORD PTR [rcx+32], r11 - mov QWORD PTR [rcx+40], r12 - pop rdi - pop r15 - pop r14 - pop r13 - pop r12 - ret -sp_384_mont_dbl_lower_6 ENDP -_text ENDS -; /* Double a Montgomery form number (r = a + a % m). -; * -; * a is less than m. -; * -; * r Result of doubling. -; * a Number to double in Montgomery form. -; * m Modulus (prime). -; */ -_text SEGMENT READONLY PARA -sp_384_mont_tpl_lower_6 PROC - push r12 - push r13 - push r14 - push r15 - push rdi - mov rax, QWORD PTR [rdx] - mov r8, QWORD PTR [rdx+8] - mov r9, QWORD PTR [rdx+16] - mov r10, QWORD PTR [rdx+24] - mov r11, QWORD PTR [rdx+32] - mov r12, QWORD PTR [rdx+40] - add rax, rax - mov r13, 4294967295 - adc r8, r8 - mov r14, 18446744069414584320 - adc r9, r9 - mov r15, 18446744073709551614 - adc r10, r10 - adc r11, r11 - adc r12, r12 - sbb rdi, rdi - and r13, rdi - and r14, rdi - and r15, rdi - sub rax, r13 - sbb r8, r14 - mov QWORD PTR [rcx], rax - sbb r9, r15 - sbb r10, rdi - sbb r11, rdi - sbb r12, rdi - add rax, QWORD PTR [rdx] - mov r13, 4294967295 - adc r8, QWORD PTR [rdx+8] - mov r14, 18446744069414584320 - adc r9, QWORD PTR [rdx+16] - mov r15, 18446744073709551614 - adc r10, QWORD PTR [rdx+24] - adc r11, QWORD PTR [rdx+32] - adc r12, QWORD PTR [rdx+40] - sbb rdi, rdi - and r13, rdi - and r14, rdi - and r15, rdi - sub rax, r13 - sbb r8, r14 - sbb r9, r15 - sbb r10, rdi - sbb r11, rdi - sbb r12, rdi - adc rdi, 0 - and r13, rdi - and r14, rdi - and r15, rdi - sub rax, r13 - sbb r8, r14 - mov QWORD PTR [rcx], rax - sbb r9, r15 - mov QWORD PTR [rcx+8], r8 - sbb r10, rdi - mov QWORD PTR [rcx+16], r9 - sbb r11, rdi - mov QWORD PTR [rcx+24], r10 - sbb r12, rdi - mov QWORD PTR [rcx+32], r11 - mov QWORD PTR [rcx+40], r12 - pop rdi - pop r15 - pop r14 - pop r13 - pop r12 - ret -sp_384_mont_tpl_lower_6 ENDP +sp_384_mont_div2_6 ENDP _text ENDS IFNDEF WC_NO_CACHE_RESISTANT ; /* Touch each possible point that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of point to retrieve. ; */ _text SEGMENT READONLY PARA sp_384_get_point_33_6 PROC sub rsp, 160 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 - vmovdqu OWORD PTR [rsp+128], xmm14 - vmovdqu OWORD PTR [rsp+144], xmm15 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp+128], xmm14 + movdqu OWORD PTR [rsp+144], xmm15 mov rax, 1 movd xmm13, r8d add rdx, 296 @@ -60094,12 +59763,12 @@ movdqa xmm12, xmm14 paddd xmm14, xmm15 pcmpeqd xmm12, xmm13 - movdqu xmm6, [rdx] - movdqu xmm7, [rdx+16] - movdqu xmm8, [rdx+32] - movdqu xmm9, [rdx+96] - movdqu xmm10, [rdx+112] - movdqu xmm11, [rdx+128] + movdqu xmm6, OWORD PTR [rdx] + movdqu xmm7, OWORD PTR [rdx+16] + movdqu xmm8, OWORD PTR [rdx+32] + movdqu xmm9, OWORD PTR [rdx+96] + movdqu xmm10, OWORD PTR [rdx+112] + movdqu xmm11, OWORD PTR [rdx+128] add rdx, 296 pand xmm6, xmm12 pand xmm7, xmm12 @@ -60115,12 +59784,12 @@ por xmm5, xmm11 dec rax jnz L_384_get_point_33_6_start_1 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+32], xmm2 - movdqu [rcx+96], xmm3 - movdqu [rcx+112], xmm4 - movdqu [rcx+128], xmm5 + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+32], xmm2 + movdqu OWORD PTR [rcx+96], xmm3 + movdqu OWORD PTR [rcx+112], xmm4 + movdqu OWORD PTR [rcx+128], xmm5 mov rax, 1 movd xmm13, r8d sub rdx, 9472 @@ -60137,9 +59806,9 @@ movdqa xmm12, xmm14 paddd xmm14, xmm15 pcmpeqd xmm12, xmm13 - movdqu xmm6, [rdx+192] - movdqu xmm7, [rdx+208] - movdqu xmm8, [rdx+224] + movdqu xmm6, OWORD PTR [rdx+192] + movdqu xmm7, OWORD PTR [rdx+208] + movdqu xmm8, OWORD PTR [rdx+224] add rdx, 296 pand xmm6, xmm12 pand xmm7, xmm12 @@ -60149,19 +59818,19 @@ por xmm2, xmm8 dec rax jnz L_384_get_point_33_6_start_2 - movdqu [rcx+192], xmm0 - movdqu [rcx+208], xmm1 - movdqu [rcx+224], xmm2 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] - vmovdqu xmm14, OWORD PTR [rsp+128] - vmovdqu xmm15, OWORD PTR [rsp+144] + movdqu OWORD PTR [rcx+192], xmm0 + movdqu OWORD PTR [rcx+208], xmm1 + movdqu OWORD PTR [rcx+224], xmm2 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm14, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] add rsp, 160 ret sp_384_get_point_33_6 ENDP @@ -60170,7 +59839,7 @@ ; /* Touch each possible point that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of point to retrieve. ; */ _text SEGMENT READONLY PARA @@ -60626,7 +60295,7 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_384_div2_avx2_6 PROC +sp_384_mont_div2_avx2_6 PROC push r12 push r13 mov r13, QWORD PTR [rdx] @@ -60686,29 +60355,29 @@ pop r13 pop r12 ret -sp_384_div2_avx2_6 ENDP +sp_384_mont_div2_avx2_6 ENDP _text ENDS ENDIF IFNDEF WC_NO_CACHE_RESISTANT ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA sp_384_get_entry_64_6 PROC sub rsp, 160 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 - vmovdqu OWORD PTR [rsp+128], xmm14 - vmovdqu OWORD PTR [rsp+144], xmm15 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp+128], xmm14 + movdqu OWORD PTR [rsp+144], xmm15 ; From entry 1 mov rax, 1 movd xmm13, r8d @@ -60729,12 +60398,12 @@ movdqa xmm12, xmm14 paddd xmm14, xmm15 pcmpeqd xmm12, xmm13 - movdqu xmm6, [rdx] - movdqu xmm7, [rdx+16] - movdqu xmm8, [rdx+32] - movdqu xmm9, [rdx+48] - movdqu xmm10, [rdx+64] - movdqu xmm11, [rdx+80] + movdqu xmm6, OWORD PTR [rdx] + movdqu xmm7, OWORD PTR [rdx+16] + movdqu xmm8, OWORD PTR [rdx+32] + movdqu xmm9, OWORD PTR [rdx+48] + movdqu xmm10, OWORD PTR [rdx+64] + movdqu xmm11, OWORD PTR [rdx+80] add rdx, 96 pand xmm6, xmm12 pand xmm7, xmm12 @@ -60750,22 +60419,22 @@ por xmm5, xmm11 dec rax jnz L_384_get_entry_64_6_start_0 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+32], xmm2 - movdqu [rcx+96], xmm3 - movdqu [rcx+112], xmm4 - movdqu [rcx+128], xmm5 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] - vmovdqu xmm14, OWORD PTR [rsp+128] - vmovdqu xmm15, OWORD PTR [rsp+144] + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+32], xmm2 + movdqu OWORD PTR [rcx+96], xmm3 + movdqu OWORD PTR [rcx+112], xmm4 + movdqu OWORD PTR [rcx+128], xmm5 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm14, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] add rsp, 160 ret sp_384_get_entry_64_6 ENDP @@ -60774,7 +60443,7 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA @@ -60837,22 +60506,22 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA sp_384_get_entry_65_6 PROC sub rsp, 160 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 - vmovdqu OWORD PTR [rsp+128], xmm14 - vmovdqu OWORD PTR [rsp+144], xmm15 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp+128], xmm14 + movdqu OWORD PTR [rsp+144], xmm15 ; From entry 1 mov rax, 1 movd xmm13, r8d @@ -60873,12 +60542,12 @@ movdqa xmm12, xmm14 paddd xmm14, xmm15 pcmpeqd xmm12, xmm13 - movdqu xmm6, [rdx] - movdqu xmm7, [rdx+16] - movdqu xmm8, [rdx+32] - movdqu xmm9, [rdx+48] - movdqu xmm10, [rdx+64] - movdqu xmm11, [rdx+80] + movdqu xmm6, OWORD PTR [rdx] + movdqu xmm7, OWORD PTR [rdx+16] + movdqu xmm8, OWORD PTR [rdx+32] + movdqu xmm9, OWORD PTR [rdx+48] + movdqu xmm10, OWORD PTR [rdx+64] + movdqu xmm11, OWORD PTR [rdx+80] add rdx, 96 pand xmm6, xmm12 pand xmm7, xmm12 @@ -60894,22 +60563,22 @@ por xmm5, xmm11 dec rax jnz L_384_get_entry_65_6_start_0 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+32], xmm2 - movdqu [rcx+96], xmm3 - movdqu [rcx+112], xmm4 - movdqu [rcx+128], xmm5 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] - vmovdqu xmm14, OWORD PTR [rsp+128] - vmovdqu xmm15, OWORD PTR [rsp+144] + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+32], xmm2 + movdqu OWORD PTR [rcx+96], xmm3 + movdqu OWORD PTR [rcx+112], xmm4 + movdqu OWORD PTR [rcx+128], xmm5 + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm14, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] add rsp, 160 ret sp_384_get_entry_65_6 ENDP @@ -60918,7 +60587,7 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA @@ -63604,7 +63273,7 @@ ; * a First number to multiply in Montgomery form. ; * b Second number to multiply in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_521_mont_mul_9 PROC @@ -64194,7 +63863,7 @@ ; * r Result of squaring. ; * a Number to square in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_521_mont_sqr_9 PROC @@ -65318,7 +64987,7 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_521_div2_9 PROC +sp_521_mont_div2_9 PROC push r12 push r13 push r14 @@ -65370,13 +65039,13 @@ pop r13 pop r12 ret -sp_521_div2_9 ENDP +sp_521_mont_div2_9 ENDP _text ENDS IFNDEF WC_NO_CACHE_RESISTANT ; /* Touch each possible point that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of point to retrieve. ; */ _text SEGMENT READONLY PARA @@ -65385,16 +65054,16 @@ push r13 push r14 sub rsp, 160 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 - vmovdqu OWORD PTR [rsp+128], xmm14 - vmovdqu OWORD PTR [rsp+144], xmm15 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp+128], xmm14 + movdqu OWORD PTR [rsp+144], xmm15 mov r14, 1 mov rax, 1 movd xmm13, r8d @@ -65422,13 +65091,13 @@ sete r9b neg r9 inc r14 - movdqu xmm6, [rdx] - movdqu xmm7, [rdx+16] - movdqu xmm8, [rdx+32] - movdqu xmm9, [rdx+48] + movdqu xmm6, OWORD PTR [rdx] + movdqu xmm7, OWORD PTR [rdx+16] + movdqu xmm8, OWORD PTR [rdx+32] + movdqu xmm9, OWORD PTR [rdx+48] mov r10, QWORD PTR [rdx+64] - movdqu xmm10, [rdx+144] - movdqu xmm11, [rdx+160] + movdqu xmm10, OWORD PTR [rdx+144] + movdqu xmm11, OWORD PTR [rdx+160] add rdx, 440 pand xmm6, xmm12 pand xmm7, xmm12 @@ -65446,13 +65115,13 @@ or r12, r10 dec rax jnz L_521_get_point_33_9_start_1 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+32], xmm2 - movdqu [rcx+48], xmm3 + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+32], xmm2 + movdqu OWORD PTR [rcx+48], xmm3 mov QWORD PTR [rcx+64], r12 - movdqu [rcx+144], xmm4 - movdqu [rcx+160], xmm5 + movdqu OWORD PTR [rcx+144], xmm4 + movdqu OWORD PTR [rcx+160], xmm5 mov r14, 1 mov rax, 1 movd xmm13, r8d @@ -65480,13 +65149,13 @@ sete r9b neg r9 inc r14 - movdqu xmm6, [rdx+176] - movdqu xmm7, [rdx+192] + movdqu xmm6, OWORD PTR [rdx+176] + movdqu xmm7, OWORD PTR [rdx+192] mov r10, QWORD PTR [rdx+208] - movdqu xmm8, [rdx+288] - movdqu xmm9, [rdx+304] - movdqu xmm10, [rdx+320] - movdqu xmm11, [rdx+336] + movdqu xmm8, OWORD PTR [rdx+288] + movdqu xmm9, OWORD PTR [rdx+304] + movdqu xmm10, OWORD PTR [rdx+320] + movdqu xmm11, OWORD PTR [rdx+336] mov r11, QWORD PTR [rdx+352] add rdx, 440 pand xmm6, xmm12 @@ -65507,24 +65176,24 @@ or r13, r11 dec rax jnz L_521_get_point_33_9_start_2 - movdqu [rcx+176], xmm0 - movdqu [rcx+192], xmm1 + movdqu OWORD PTR [rcx+176], xmm0 + movdqu OWORD PTR [rcx+192], xmm1 mov QWORD PTR [rcx+208], r12 - movdqu [rcx+288], xmm2 - movdqu [rcx+304], xmm3 - movdqu [rcx+320], xmm4 - movdqu [rcx+336], xmm5 + movdqu OWORD PTR [rcx+288], xmm2 + movdqu OWORD PTR [rcx+304], xmm3 + movdqu OWORD PTR [rcx+320], xmm4 + movdqu OWORD PTR [rcx+336], xmm5 mov QWORD PTR [rcx+352], r13 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] - vmovdqu xmm14, OWORD PTR [rsp+128] - vmovdqu xmm15, OWORD PTR [rsp+144] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm14, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] add rsp, 160 pop r14 pop r13 @@ -65536,7 +65205,7 @@ ; /* Touch each possible point that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of point to retrieve. ; */ _text SEGMENT READONLY PARA @@ -65652,7 +65321,7 @@ ; * a First number to multiply in Montgomery form. ; * b Second number to multiply in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_521_mont_mul_avx2_9 PROC @@ -66262,7 +65931,7 @@ ; * r Result of squaring. ; * a Number to square in Montgomery form. ; * m Modulus (prime). -; * mp Montgomery mulitplier. +; * mp Montgomery multiplier. ; */ _text SEGMENT READONLY PARA sp_521_mont_sqr_avx2_9 PROC @@ -67082,7 +66751,7 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_521_div2_avx2_9 PROC +sp_521_mont_div2_avx2_9 PROC push r12 push r13 push r14 @@ -67134,30 +66803,30 @@ pop r13 pop r12 ret -sp_521_div2_avx2_9 ENDP +sp_521_mont_div2_avx2_9 ENDP _text ENDS ENDIF IFNDEF WC_NO_CACHE_RESISTANT ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA sp_521_get_entry_64_9 PROC push r12 sub rsp, 160 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 - vmovdqu OWORD PTR [rsp+128], xmm14 - vmovdqu OWORD PTR [rsp+144], xmm15 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp+128], xmm14 + movdqu OWORD PTR [rsp+144], xmm15 ; From entry 1 mov r12, 1 mov rax, 1 @@ -67183,10 +66852,10 @@ sete r9b neg r9 inc r12 - movdqu xmm4, [rdx] - movdqu xmm5, [rdx+16] - movdqu xmm6, [rdx+32] - movdqu xmm7, [rdx+48] + movdqu xmm4, OWORD PTR [rdx] + movdqu xmm5, OWORD PTR [rdx+16] + movdqu xmm6, OWORD PTR [rdx+32] + movdqu xmm7, OWORD PTR [rdx+48] mov r10, QWORD PTR [rdx+64] add rdx, 144 pand xmm4, xmm12 @@ -67201,10 +66870,10 @@ or r11, r10 dec rax jnz L_521_get_entry_64_9_start_0 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+32], xmm2 - movdqu [rcx+48], xmm3 + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+32], xmm2 + movdqu OWORD PTR [rcx+48], xmm3 mov QWORD PTR [rcx+64], r11 ; From entry 1 mov r12, 1 @@ -67231,10 +66900,10 @@ sete r9b neg r9 inc r12 - movdqu xmm4, [rdx] - movdqu xmm5, [rdx+16] - movdqu xmm6, [rdx+32] - movdqu xmm7, [rdx+48] + movdqu xmm4, OWORD PTR [rdx] + movdqu xmm5, OWORD PTR [rdx+16] + movdqu xmm6, OWORD PTR [rdx+32] + movdqu xmm7, OWORD PTR [rdx+48] mov r10, QWORD PTR [rdx+64] add rdx, 144 pand xmm4, xmm12 @@ -67249,21 +66918,21 @@ or r11, r10 dec rax jnz L_521_get_entry_64_9_start_1 - movdqu [rcx+144], xmm0 - movdqu [rcx+160], xmm1 - movdqu [rcx+176], xmm2 - movdqu [rcx+192], xmm3 + movdqu OWORD PTR [rcx+144], xmm0 + movdqu OWORD PTR [rcx+160], xmm1 + movdqu OWORD PTR [rcx+176], xmm2 + movdqu OWORD PTR [rcx+192], xmm3 mov QWORD PTR [rcx+208], r11 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] - vmovdqu xmm14, OWORD PTR [rsp+128] - vmovdqu xmm15, OWORD PTR [rsp+144] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm14, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] add rsp, 160 pop r12 ret @@ -67273,7 +66942,7 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA @@ -67358,23 +67027,23 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA sp_521_get_entry_65_9 PROC push r12 sub rsp, 160 - vmovdqu OWORD PTR [rsp], xmm6 - vmovdqu OWORD PTR [rsp+16], xmm7 - vmovdqu OWORD PTR [rsp+32], xmm8 - vmovdqu OWORD PTR [rsp+48], xmm9 - vmovdqu OWORD PTR [rsp+64], xmm10 - vmovdqu OWORD PTR [rsp+80], xmm11 - vmovdqu OWORD PTR [rsp+96], xmm12 - vmovdqu OWORD PTR [rsp+112], xmm13 - vmovdqu OWORD PTR [rsp+128], xmm14 - vmovdqu OWORD PTR [rsp+144], xmm15 + movdqu OWORD PTR [rsp], xmm6 + movdqu OWORD PTR [rsp+16], xmm7 + movdqu OWORD PTR [rsp+32], xmm8 + movdqu OWORD PTR [rsp+48], xmm9 + movdqu OWORD PTR [rsp+64], xmm10 + movdqu OWORD PTR [rsp+80], xmm11 + movdqu OWORD PTR [rsp+96], xmm12 + movdqu OWORD PTR [rsp+112], xmm13 + movdqu OWORD PTR [rsp+128], xmm14 + movdqu OWORD PTR [rsp+144], xmm15 ; From entry 1 mov r12, 1 mov rax, 1 @@ -67400,10 +67069,10 @@ sete r9b neg r9 inc r12 - movdqu xmm4, [rdx] - movdqu xmm5, [rdx+16] - movdqu xmm6, [rdx+32] - movdqu xmm7, [rdx+48] + movdqu xmm4, OWORD PTR [rdx] + movdqu xmm5, OWORD PTR [rdx+16] + movdqu xmm6, OWORD PTR [rdx+32] + movdqu xmm7, OWORD PTR [rdx+48] mov r10, QWORD PTR [rdx+64] add rdx, 144 pand xmm4, xmm12 @@ -67418,10 +67087,10 @@ or r11, r10 dec rax jnz L_521_get_entry_65_9_start_0 - movdqu [rcx], xmm0 - movdqu [rcx+16], xmm1 - movdqu [rcx+32], xmm2 - movdqu [rcx+48], xmm3 + movdqu OWORD PTR [rcx], xmm0 + movdqu OWORD PTR [rcx+16], xmm1 + movdqu OWORD PTR [rcx+32], xmm2 + movdqu OWORD PTR [rcx+48], xmm3 mov QWORD PTR [rcx+64], r11 ; From entry 1 mov r12, 1 @@ -67448,10 +67117,10 @@ sete r9b neg r9 inc r12 - movdqu xmm4, [rdx] - movdqu xmm5, [rdx+16] - movdqu xmm6, [rdx+32] - movdqu xmm7, [rdx+48] + movdqu xmm4, OWORD PTR [rdx] + movdqu xmm5, OWORD PTR [rdx+16] + movdqu xmm6, OWORD PTR [rdx+32] + movdqu xmm7, OWORD PTR [rdx+48] mov r10, QWORD PTR [rdx+64] add rdx, 144 pand xmm4, xmm12 @@ -67466,21 +67135,21 @@ or r11, r10 dec rax jnz L_521_get_entry_65_9_start_1 - movdqu [rcx+144], xmm0 - movdqu [rcx+160], xmm1 - movdqu [rcx+176], xmm2 - movdqu [rcx+192], xmm3 + movdqu OWORD PTR [rcx+144], xmm0 + movdqu OWORD PTR [rcx+160], xmm1 + movdqu OWORD PTR [rcx+176], xmm2 + movdqu OWORD PTR [rcx+192], xmm3 mov QWORD PTR [rcx+208], r11 - vmovdqu xmm6, OWORD PTR [rsp] - vmovdqu xmm7, OWORD PTR [rsp+16] - vmovdqu xmm8, OWORD PTR [rsp+32] - vmovdqu xmm9, OWORD PTR [rsp+48] - vmovdqu xmm10, OWORD PTR [rsp+64] - vmovdqu xmm11, OWORD PTR [rsp+80] - vmovdqu xmm12, OWORD PTR [rsp+96] - vmovdqu xmm13, OWORD PTR [rsp+112] - vmovdqu xmm14, OWORD PTR [rsp+128] - vmovdqu xmm15, OWORD PTR [rsp+144] + movdqu xmm6, OWORD PTR [rsp] + movdqu xmm7, OWORD PTR [rsp+16] + movdqu xmm8, OWORD PTR [rsp+32] + movdqu xmm9, OWORD PTR [rsp+48] + movdqu xmm10, OWORD PTR [rsp+64] + movdqu xmm11, OWORD PTR [rsp+80] + movdqu xmm12, OWORD PTR [rsp+96] + movdqu xmm13, OWORD PTR [rsp+112] + movdqu xmm14, OWORD PTR [rsp+128] + movdqu xmm15, OWORD PTR [rsp+144] add rsp, 160 pop r12 ret @@ -67490,7 +67159,7 @@ ; /* Touch each possible entry that could be being copied. ; * ; * r Point to copy into. -; * table Table - start of the entires to access +; * table Table - start of the entries to access ; * idx Index of entry to retrieve. ; */ _text SEGMENT READONLY PARA @@ -67835,8 +67504,8 @@ _text SEGMENT READONLY PARA sp_521_rshift_9 PROC push r12 - mov rcx, r8 mov rax, rcx + mov rcx, r8 mov r8, QWORD PTR [rdx] mov r9, QWORD PTR [rdx+8] mov r10, QWORD PTR [rdx+16] @@ -67878,8 +67547,8 @@ sp_521_lshift_9 PROC push r12 push r13 - mov cl, r8b mov rax, rcx + mov cl, r8b mov r12, 0 mov r13, QWORD PTR [rdx+32] mov r8, QWORD PTR [rdx+40] @@ -67925,8 +67594,8 @@ sp_521_lshift_18 PROC push r12 push r13 - mov cl, r8b mov rax, rcx + mov cl, r8b mov r12, 0 mov r13, QWORD PTR [rdx+104] mov r8, QWORD PTR [rdx+112] @@ -75733,7 +75402,7 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_1024_div2_16 PROC +sp_1024_mont_div2_16 PROC push r12 push r13 sub rsp, 128 @@ -75874,67 +75543,7 @@ pop r13 pop r12 ret -sp_1024_div2_16 ENDP -_text ENDS -; /* Sub b from a into r. (r = a - b) -; * -; * r A single precision integer. -; * a A single precision integer. -; * b A single precision integer. -; */ -_text SEGMENT READONLY PARA -sp_1024_sub_16 PROC - mov r9, QWORD PTR [rdx] - sub r9, QWORD PTR [r8] - mov r10, QWORD PTR [rdx+8] - mov QWORD PTR [rcx], r9 - sbb r10, QWORD PTR [r8+8] - mov r9, QWORD PTR [rdx+16] - mov QWORD PTR [rcx+8], r10 - sbb r9, QWORD PTR [r8+16] - mov r10, QWORD PTR [rdx+24] - mov QWORD PTR [rcx+16], r9 - sbb r10, QWORD PTR [r8+24] - mov r9, QWORD PTR [rdx+32] - mov QWORD PTR [rcx+24], r10 - sbb r9, QWORD PTR [r8+32] - mov r10, QWORD PTR [rdx+40] - mov QWORD PTR [rcx+32], r9 - sbb r10, QWORD PTR [r8+40] - mov r9, QWORD PTR [rdx+48] - mov QWORD PTR [rcx+40], r10 - sbb r9, QWORD PTR [r8+48] - mov r10, QWORD PTR [rdx+56] - mov QWORD PTR [rcx+48], r9 - sbb r10, QWORD PTR [r8+56] - mov r9, QWORD PTR [rdx+64] - mov QWORD PTR [rcx+56], r10 - sbb r9, QWORD PTR [r8+64] - mov r10, QWORD PTR [rdx+72] - mov QWORD PTR [rcx+64], r9 - sbb r10, QWORD PTR [r8+72] - mov r9, QWORD PTR [rdx+80] - mov QWORD PTR [rcx+72], r10 - sbb r9, QWORD PTR [r8+80] - mov r10, QWORD PTR [rdx+88] - mov QWORD PTR [rcx+80], r9 - sbb r10, QWORD PTR [r8+88] - mov r9, QWORD PTR [rdx+96] - mov QWORD PTR [rcx+88], r10 - sbb r9, QWORD PTR [r8+96] - mov r10, QWORD PTR [rdx+104] - mov QWORD PTR [rcx+96], r9 - sbb r10, QWORD PTR [r8+104] - mov r9, QWORD PTR [rdx+112] - mov QWORD PTR [rcx+104], r10 - sbb r9, QWORD PTR [r8+112] - mov r10, QWORD PTR [rdx+120] - mov QWORD PTR [rcx+112], r9 - sbb r10, QWORD PTR [r8+120] - mov QWORD PTR [rcx+120], r10 - sbb rax, rax - ret -sp_1024_sub_16 ENDP +sp_1024_mont_div2_16 ENDP _text ENDS IFDEF HAVE_INTEL_AVX2 ; /* Reduce the number back to 1024 bits using Montgomery reduction. @@ -77012,7 +76621,7 @@ ; * m Modulus (prime). ; */ _text SEGMENT READONLY PARA -sp_1024_div2_avx2_16 PROC +sp_1024_mont_div2_avx2_16 PROC push r12 push r13 mov r13, QWORD PTR [rdx] @@ -77152,7 +76761,7 @@ pop r13 pop r12 ret -sp_1024_div2_avx2_16 ENDP +sp_1024_mont_div2_avx2_16 ENDP _text ENDS ENDIF ; /* Read big endian unsigned byte array into r. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sphincs.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sphincs.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/sphincs.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/sphincs.c 2024-08-03 07:30:00.000000000 +0000 @@ -58,7 +58,7 @@ * 0 otherwise. */ int wc_sphincs_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen, - sphincs_key* key) + sphincs_key* key, WC_RNG* rng) { int ret = 0; #ifdef HAVE_LIBOQS @@ -76,22 +76,22 @@ if (ret == 0) { if ((key->optim == FAST_VARIANT) && (key->level == 1)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_128f_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_128f_simple); } else if ((key->optim == FAST_VARIANT) && (key->level == 3)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_192f_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_192f_simple); } else if ((key->optim == FAST_VARIANT) && (key->level == 5)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_256f_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_256f_simple); } else if ((key->optim == SMALL_VARIANT) && (key->level == 1)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_128s_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_128s_simple); } else if ((key->optim == SMALL_VARIANT) && (key->level == 3)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_192s_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_192s_simple); } else if ((key->optim == SMALL_VARIANT) && (key->level == 5)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_256s_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_256s_simple); } if (oqssig == NULL) { @@ -135,6 +135,10 @@ localOutLen = *outLen; } + if (ret == 0) { + ret = wolfSSL_liboqsRngMutexLock(rng); + } + if ((ret == 0) && (OQS_SIG_sign(oqssig, out, &localOutLen, in, inLen, key->k) == OQS_ERROR)) { @@ -145,6 +149,8 @@ *outLen = (word32)localOutLen; } + wolfSSL_liboqsRngMutexUnlock(); + if (oqssig != NULL) { OQS_SIG_free(oqssig); } @@ -183,22 +189,22 @@ if (ret == 0) { if ((key->optim == FAST_VARIANT) && (key->level == 1)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_128f_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_128f_simple); } else if ((key->optim == FAST_VARIANT) && (key->level == 3)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_192f_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_192f_simple); } else if ((key->optim == FAST_VARIANT) && (key->level == 5)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_256f_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_256f_simple); } else if ((key->optim == SMALL_VARIANT) && (key->level == 1)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_128s_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_128s_simple); } else if ((key->optim == SMALL_VARIANT) && (key->level == 3)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_192s_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_192s_simple); } else if ((key->optim == SMALL_VARIANT) && (key->level == 5)) { - oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake256_256s_simple); + oqssig = OQS_SIG_new(OQS_SIG_alg_sphincs_shake_256s_simple); } if (oqssig == NULL) { @@ -237,14 +243,14 @@ return BAD_FUNC_ARG; } - ForceZero(key, sizeof(key)); + ForceZero(key, sizeof(*key)); return 0; } /* Set the level of the sphincs private/public key. * * key [out] Sphincs key. - * level [in] Either 2,3 or 5. + * level [in] Either 1, 3 or 5. * optim [in] Either FAST_VARIANT or SMALL_VARIANT. * returns BAD_FUNC_ARG when key is NULL or level or optim are bad values. */ @@ -302,7 +308,7 @@ void wc_sphincs_free(sphincs_key* key) { if (key != NULL) { - ForceZero(key, sizeof(key)); + ForceZero(key, sizeof(*key)); } } @@ -425,7 +431,8 @@ /* At this point, it is still a PKCS8 private key. */ if ((ret = ToTraditionalInline(priv, &idx, privSz)) < 0) { - return ret; + /* ignore error, did not have PKCS8 header */ + (void)ret; } /* Now it is a octet_string(concat(priv,pub)) */ @@ -851,7 +858,7 @@ else if ((key->level == 5) && (key->optim == FAST_VARIANT)) { keytype = SPHINCS_FAST_LEVEL5k; } - if ((key->level == 1) && (key->optim == SMALL_VARIANT)) { + else if ((key->level == 1) && (key->optim == SMALL_VARIANT)) { keytype = SPHINCS_SMALL_LEVEL1k; } else if ((key->level == 3) && (key->optim == SMALL_VARIANT)) { @@ -890,6 +897,11 @@ return BAD_FUNC_ARG; } + ret = wc_sphincs_import_public(input, inSz, key); + if (ret == 0) { + return 0; + } + if ((key->level == 1) && (key->optim == FAST_VARIANT)) { keytype = SPHINCS_FAST_LEVEL1k; } @@ -899,7 +911,7 @@ else if ((key->level == 5) && (key->optim == FAST_VARIANT)) { keytype = SPHINCS_FAST_LEVEL5k; } - if ((key->level == 1) && (key->optim == SMALL_VARIANT)) { + else if ((key->level == 1) && (key->optim == SMALL_VARIANT)) { keytype = SPHINCS_SMALL_LEVEL1k; } else if ((key->level == 3) && (key->optim == SMALL_VARIANT)) { @@ -941,7 +953,7 @@ word32 pubKeyLen = (word32)sizeof(pubKey); int keytype = 0; - if (key == NULL || output == NULL) { + if (key == NULL) { return BAD_FUNC_ARG; } @@ -954,7 +966,7 @@ else if ((key->level == 5) && (key->optim == FAST_VARIANT)) { keytype = SPHINCS_FAST_LEVEL5k; } - if ((key->level == 1) && (key->optim == SMALL_VARIANT)) { + else if ((key->level == 1) && (key->optim == SMALL_VARIANT)) { keytype = SPHINCS_SMALL_LEVEL1k; } else if ((key->level == 3) && (key->optim == SMALL_VARIANT)) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/srp.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/srp.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/srp.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/srp.c 2024-08-03 07:30:00.000000000 +0000 @@ -908,27 +908,27 @@ if (digest) XFREE(digest, srp->heap, DYNAMIC_TYPE_SRP); if (u) { - if (r != MP_INIT_E) + if (r != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(u); XFREE(u, srp->heap, DYNAMIC_TYPE_SRP); } if (s) { - if (r != MP_INIT_E) + if (r != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(s); XFREE(s, srp->heap, DYNAMIC_TYPE_SRP); } if (temp1) { - if (r != MP_INIT_E) + if (r != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(temp1); XFREE(temp1, srp->heap, DYNAMIC_TYPE_SRP); } if (temp2) { - if (r != MP_INIT_E) + if (r != WC_NO_ERR_TRACE(MP_INIT_E)) mp_clear(temp2); XFREE(temp2, srp->heap, DYNAMIC_TYPE_SRP); } #else - if (r != MP_INIT_E) { + if (r != WC_NO_ERR_TRACE(MP_INIT_E)) { mp_clear(u); mp_clear(s); mp_clear(temp1); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/tfm.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/tfm.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/tfm.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/tfm.c 2024-08-03 07:30:00.000000000 +0000 @@ -52,6 +52,39 @@ #include /* will define asm MACROS or C ones */ #include /* common functions */ +#ifdef WOLFSSL_ESPIDF + #include + #include +#endif + +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI) + static const char* TAG = "TFM"; /* esp log breadcrumb */ + #if !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI) + /* Each individual math HW can be turned on or off. + * Listed in order of complexity and historical difficulty. */ + #define WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + #define WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #endif + + #if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL) + #undef WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #endif + + #if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + #undef WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + #endif + + #if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD) + #undef WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #endif + + /* Note with HW there's a ESP_RSA_EXPT_XBITS setting + * as for some small numbers, SW may be faster. + * See ESP_LOGV messages for ESP_RSA_EXPT_XBITS values. */ + +#endif /* WOLFSSL_ESP32_CRYPT_RSA_PRI */ + #if defined(FREESCALE_LTC_TFM) #include #endif @@ -139,11 +172,44 @@ c->used = y; t = 0; +#ifdef HONOR_MATH_USED_LENGTH + for (x = 0; x < y; x++) { + if ( (x < a->used) && (x < b->used) ) { + /* x is less than both [a].used and [b].used, so we add both */ + t += ((fp_word)a->dp[x]) + ((fp_word)b->dp[x]); + } + else { + /* Here we honor the actual [a].used and [b].used values + * and NOT assume that values beyond [used] are zero. */ + if ((x >= a->used) && (x < b->used)) { + /* x more than [a].used, [b] ok, so just add [b] */ + t += /* ((fp_word)(0)) + */ ((fp_word)b->dp[x]); + } + else { + if ((x < a->used) && (x >= b->used)) { + /* x more than [b].used, [a] ok, so just add [a] */ + t += ((fp_word)a->dp[x]) /* + (fp_word)(0) */; + } + else { + /* we should never get here, as a.used cannot be greater + * than b.used, while b.used is greater than a.used! */ + /* t += 0 + 0 */ + } + } + } + c->dp[x] = (fp_digit)t; + t >>= DIGIT_BIT; + } + +#else + /* the original code */ for (x = 0; x < y; x++) { t += ((fp_word)a->dp[x]) + ((fp_word)b->dp[x]); c->dp[x] = (fp_digit)t; t >>= DIGIT_BIT; } +#endif /* HONOR_MATH_USED_LENGTH */ + if (t != 0) { if (x == FP_SIZE) return FP_VAL; @@ -229,15 +295,9 @@ /* c = a * b */ int fp_mul(fp_int *A, fp_int *B, fp_int *C) { - int ret = 0; + int ret = FP_OKAY; int y, yy, oldused; -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - ret = esp_mp_mul(A, B, C); - if(ret != -2) return ret; -#endif - oldused = C->used; y = MAX(A->used, B->used); @@ -249,6 +309,36 @@ goto clean; } +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL) + if (esp_hw_validation_active()) { + ESP_LOGV(TAG, "Skipping call to esp_mp_mul " + "during active validation."); + } + else { + ret = esp_mp_mul(A, B, C); /* HW accelerated multiply */ + switch (ret) { + case MP_OKAY: + goto clean; /* success */ + break; + + case WC_HW_WAIT_E: /* MP_HW_BUSY math HW busy, fall back */ + case MP_HW_FALLBACK: /* forced fallback from HW to SW */ + case MP_HW_VALIDATION_ACTIVE: /* use SW to compare to HW */ + /* fall back to software, below */ + break; + + default: + /* Once we've failed, exit without trying to continue. + * We may have mangled operands: (e.g. Z = X * Z) + * Future implementation may consider saving operands, + * but errors should never occur. */ + goto clean; /* error */ + break; + } + } + /* fall through to software calcs */ +#endif /* WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + /* pick a comba (unrolled 4/8/16/32 x or rolled) based on the size of the largest input. We also want to avoid doing excess mults if the inputs are not close to the next power of two. That is, for example, @@ -536,6 +626,7 @@ } #endif +/* C = (A * B) */ int fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) { int ret = 0; @@ -602,6 +693,8 @@ COMBA_FINI; dst->used = pa; + + /* warning: WOLFSSL_SP_INT_NEGATIVE may disable negative numbers */ dst->sign = A->sign ^ B->sign; fp_clamp(dst); fp_copy(dst, C); @@ -1011,9 +1104,9 @@ bmax = ((unsigned int)b + DIGIT_BIT - 1) / DIGIT_BIT; - /* If a is negative and bmax is larger than FP_SIZE, then the + /* If a is negative and bmax is greater than or equal to FP_SIZE, then the * result can't fit within c. Just return. */ - if (c->sign == FP_NEG && bmax > FP_SIZE) { + if (c->sign == FP_NEG && bmax >= FP_SIZE) { return; } @@ -1802,7 +1895,7 @@ switch (nb->state) { case TFM_EXPTMOD_NB_INIT: - /* now setup montgomery */ + /* now setup montgomery */ if ((err = fp_montgomery_setup(P, &nb->mp)) != FP_OKAY) { nb->state = TFM_EXPTMOD_NB_INIT; return err; @@ -2158,6 +2251,7 @@ #ifdef WOLFSSL_SMALL_STACK XFREE(R, NULL, DYNAMIC_TYPE_BIGINT); #endif + return err; } @@ -2993,13 +3087,11 @@ #undef WINSIZE #endif - +/* Y = (G * X) mod P */ int fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) { - -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - int x = fp_count_bits (X); +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + int retHW = FP_OKAY; #endif /* handle modulus of zero and prevent overflows */ @@ -3019,12 +3111,37 @@ return FP_OKAY; } -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - if(x > EPS_RSA_EXPT_XBTIS) { - return esp_mp_exptmod(G, X, x, P, Y); +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + if (esp_hw_validation_active()) { + ESP_LOGV(TAG, "Skipping call to esp_mp_exptmod " + "during active validation."); } -#endif + else { + /* HW accelerated exptmod */ + retHW = esp_mp_exptmod(G, X, P, Y); + switch (retHW) { + case MP_OKAY: + /* successfully computed in HW */ + return retHW; + break; + + case WC_HW_WAIT_E: /* MP_HW_BUSY math HW busy, fall back */ + case MP_HW_FALLBACK: /* forced fallback from HW to SW */ + case MP_HW_VALIDATION_ACTIVE: /* use SW to compare to HW */ + /* use software calc */ + break; + + default: + /* Once we've failed, exit without trying to continue. + * We may have mangled operands: (e.g. Z = X * Z) + * Future implementation may consider saving operands, + * but hard errors should never actually occur. */ + return retHW; /* error */ + break; + } /* switch */ + } /* if validation check */ + /* fall through to software calcs */ +#endif /* WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ if (X->sign == FP_NEG) { #ifndef POSITIVE_EXP_ONLY /* reduce stack if assume no negatives */ @@ -3049,11 +3166,11 @@ if (err == FP_OKAY) { fp_copy(X, &tmp[1]); tmp[1].sign = FP_ZPOS; -#ifdef TFM_TIMING_RESISTANT + #ifdef TFM_TIMING_RESISTANT err = _fp_exptmod_ct(&tmp[0], &tmp[1], tmp[1].used, P, Y); -#else + #else err = _fp_exptmod_nct(&tmp[0], &tmp[1], P, Y); -#endif + #endif if ((err == 0) && (P->sign == FP_NEG)) { err = fp_add(Y, P, Y); } @@ -3064,7 +3181,7 @@ return err; #else return FP_VAL; -#endif +#endif /* POSITIVE_EXP_ONLY check */ } else if (G->used == 1 && G->dp[0] == 2) { return _fp_exptmod_base_2(X, X->used, P, Y); @@ -3081,10 +3198,8 @@ int fp_exptmod_ex(fp_int * G, fp_int * X, int digits, fp_int * P, fp_int * Y) { - -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - int x = fp_count_bits (X); +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + int retHW = FP_OKAY; #endif /* handle modulus of zero and prevent overflows */ @@ -3104,12 +3219,30 @@ return FP_OKAY; } -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - if(x > EPS_RSA_EXPT_XBTIS) { - return esp_mp_exptmod(G, X, x, P, Y); - } -#endif +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + retHW = esp_mp_exptmod(G, X, P, Y); + switch (retHW) { + case MP_OKAY: + /* successfully computed in HW */ + return retHW; + break; + + case WC_HW_WAIT_E: /* MP_HW_BUSY math HW busy, fall back */ + case MP_HW_FALLBACK: /* forced fallback from HW to SW */ + case MP_HW_VALIDATION_ACTIVE: /* use SW to compare to HW */ + /* use software calc */ + break; + + default: + /* Once we've failed, exit without trying to continue. + * We may have mangled operands: (e.g. Z = X * Z) + * Future implementation may consider saving operands, + * but hard errors should never actually occur. */ + return retHW; + break; + } /* HW result switch */ + /* falling through to SW: */ +#endif /* WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ if (X->sign == FP_NEG) { #ifndef POSITIVE_EXP_ONLY /* reduce stack if assume no negatives */ @@ -3166,26 +3299,50 @@ int fp_exptmod_nct(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) { -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - int x = fp_count_bits (X); +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + int retHW = FP_OKAY; #endif + /* handle modulus of zero and prevent overflows */ + if (fp_iszero(P) || (P->used > (FP_SIZE/2))) { + return FP_VAL; + } + if (fp_isone(P)) { + fp_set(Y, 0); + return FP_OKAY; + } + if (fp_iszero(X)) { + fp_set(Y, 1); + return FP_OKAY; + } if (fp_iszero(G)) { - fp_set(G, 0); + fp_set(Y, 0); return FP_OKAY; } - /* prevent overflows */ - if (P->used > (FP_SIZE/2)) { - return FP_VAL; - } +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + retHW = esp_mp_exptmod(G, X, P, Y); + switch (retHW) { + case MP_OKAY: + /* successfully computed in HW */ + return retHW; + break; + + case WC_HW_WAIT_E: /* MP_HW_BUSY math HW busy, fall back */ + case MP_HW_FALLBACK: /* forced fallback from HW to SW */ + case MP_HW_VALIDATION_ACTIVE: /* use SW to compare to HW */ + /* use software calc */ + break; -#if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - if(x > EPS_RSA_EXPT_XBTIS) { - return esp_mp_exptmod(G, X, x, P, Y); + default: + /* Once we've failed, exit without trying to continue. + * We may have mangled operands: (e.g. Z = X * Z) + * Future implementation may consider saving operands, + * but hard errors should never actually occur. */ + return retHW; + break; } + /* falling through to SW: */ #endif if (X->sign == FP_NEG) { @@ -3271,6 +3428,36 @@ goto clean; } +#if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL) + if (esp_hw_validation_active()) { + ESP_LOGV(TAG, "Skipping call to esp_mp_mul " + "during active validation."); + } + else { + err = esp_mp_mul(A, A, B); /* HW accelerated multiply */ + switch (err) { + case MP_OKAY: + goto clean; /* success */ + break; + + case WC_HW_WAIT_E: /* MP_HW_BUSY math HW busy, fall back */ + case MP_HW_FALLBACK: /* forced fallback from HW to SW */ + case MP_HW_VALIDATION_ACTIVE: /* use SW to compare to HW */ + /* fall back to software, below */ + break; + + default: + /* Once we've failed, exit without trying to continue. + * We may have mangled operands: (e.g. Z = X * Z) + * Future implementation may consider saving operands, + * but errors should never occur. */ + goto clean; /* error */ + break; + } + } + /* fall through to software calcs */ +#endif /* WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ + #if defined(TFM_SQR3) && FP_SIZE >= 6 if (y <= 3) { err = fp_sqr_comba3(A,B); @@ -3864,8 +4051,16 @@ /* zero the int */ fp_zero (a); + if (c < 0) { + return FP_VAL; + } + + if (c == 0) { + return FP_OKAY; + } + /* if input b excess max, then truncate */ - if (c > 0 && (word32)c > maxC) { + if ((word32)c > maxC) { int excess = (c - maxC); c -= excess; b += excess; @@ -4395,6 +4590,10 @@ void fp_forcezero (mp_int * a) { int size; + + if (a == NULL) + return; + a->used = 0; a->sign = FP_ZPOS; #if defined(ALT_ECC_SIZE) || defined(HAVE_WOLF_BIGINT) @@ -4491,16 +4690,32 @@ int mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) #endif { - #if defined(WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - int A = fp_count_bits (a); - int B = fp_count_bits (b); + int ret = MP_OKAY; +#ifdef WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + ret = esp_mp_mulmod(a, b, c, d); + switch (ret) { + case MP_OKAY: + /* successfully computed in HW */ + break; - if( A >= ESP_RSA_MULM_BITS && B >= ESP_RSA_MULM_BITS) - return esp_mp_mulmod(a, b, c, d); - else - #endif - return fp_mulmod(a, b, c, d); + case WC_HW_WAIT_E: /* MP_HW_BUSY math HW busy, fall back */ + case MP_HW_FALLBACK: /* forced fallback from HW to SW */ + case MP_HW_VALIDATION_ACTIVE: /* use SW to compare to HW */ + /* use software calc */ + ret = fp_mulmod(a, b, c, d); + break; + + default: + /* Once we've failed, exit without trying to continue. + * We may have mangled operands: (e.g. Z = X * Z) + * Future implementation may consider saving operands, + * but hard errors should never actually occur. */ + break; + } +#else /* no HW */ + ret = fp_mulmod(a, b, c, d); +#endif /* WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ + return ret; } /* d = a - b (mod c) */ @@ -4649,6 +4864,12 @@ return MP_OKAY; } +int mp_mod_2d(fp_int* a, int b, fp_int* c) +{ + fp_mod_2d(a, b, c); + return MP_OKAY; +} + /* copy (src = a) to (dst = b) */ void fp_copy(const fp_int *a, fp_int *b) { @@ -4704,12 +4925,12 @@ return MP_OKAY; } -int mp_isodd(mp_int* a) +int mp_isodd(const mp_int* a) { return fp_isodd(a); } -int mp_iszero(mp_int* a) +int mp_iszero(const mp_int* a) { return fp_iszero(a); } @@ -4803,21 +5024,10 @@ #endif /* WOLFSSL_KEY_GEN || HAVE_ECC */ -static int fp_cond_swap_ct (mp_int * a, mp_int * b, int c, int m) +static int fp_cond_swap_ct_ex(mp_int* a, mp_int* b, int c, int m, mp_int* t) { int i; mp_digit mask = (mp_digit)0 - m; -#ifndef WOLFSSL_SMALL_STACK - fp_int t[1]; -#else - fp_int* t; -#endif - -#ifdef WOLFSSL_SMALL_STACK - t = (fp_int*)XMALLOC(sizeof(fp_int), NULL, DYNAMIC_TYPE_BIGINT); - if (t == NULL) - return FP_MEM; -#endif t->used = (a->used ^ b->used) & mask; for (i = 0; i < c; i++) { @@ -4832,6 +5042,26 @@ b->dp[i] ^= t->dp[i]; } + return FP_OKAY; +} + + +static int fp_cond_swap_ct(mp_int* a, mp_int* b, int c, int m) +{ +#ifndef WOLFSSL_SMALL_STACK + fp_int t[1]; +#else + fp_int* t; +#endif + +#ifdef WOLFSSL_SMALL_STACK + t = (fp_int*)XMALLOC(sizeof(fp_int), NULL, DYNAMIC_TYPE_BIGINT); + if (t == NULL) + return FP_MEM; +#endif + + fp_cond_swap_ct_ex(a, b, c, m, t); + #ifdef WOLFSSL_SMALL_STACK XFREE(t, NULL, DYNAMIC_TYPE_BIGINT); #endif @@ -5422,7 +5652,12 @@ #endif /* !NO_RSA || !NO_DSA || !NO_DH || WOLFSSL_KEY_GEN */ -int mp_cond_swap_ct(mp_int * a, mp_int * b, int c, int m) +int mp_cond_swap_ct_ex(mp_int* a, mp_int* b, int c, int m, mp_int* t) +{ + return fp_cond_swap_ct_ex(a, b, c, m, t); +} + +int mp_cond_swap_ct(mp_int* a, mp_int* b, int c, int m) { return fp_cond_swap_ct(a, b, c, m); } @@ -5711,6 +5946,8 @@ { int i, j, k, neg; int ch; + /* Skip whitespace at end of line */ + int eol_done = 0; /* if the leading digit is a * minus set the sign to negative. @@ -5727,8 +5964,11 @@ for (i = (int)(XSTRLEN(str) - 1); i >= 0; i--) { ch = (int)HexCharToByte(str[i]); if (ch < 0) { + if (!eol_done && CharIsWhiteSpace(str[i])) + continue; return FP_VAL; } + eol_done = 1; k += j == DIGIT_BIT; j &= DIGIT_BIT - 1; @@ -5790,7 +6030,13 @@ } } if (y >= radix) { - return FP_VAL; + /* Check if whitespace at end of line */ + while (CharIsWhiteSpace(*str)) + ++str; + if (*str) + return FP_VAL; + else + break; } /* if the char was found in the map @@ -5825,15 +6071,8 @@ #endif /* !defined(NO_DSA) || defined(HAVE_ECC) */ -#ifdef HAVE_ECC - -/* fast math conversion */ -int mp_sqr(fp_int *A, fp_int *B) -{ - return fp_sqr(A, B); -} +#if defined(HAVE_ECC) || (!defined(NO_RSA) && defined(WC_RSA_BLINDING)) -/* fast math conversion */ int mp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) { return fp_montgomery_reduce(a, m, mp); @@ -5851,6 +6090,17 @@ return fp_montgomery_setup(a, rho); } +#endif /* HAVE_ECC || (!NO_RSA && WC_RSA_BLINDING) */ + +/* fast math conversion */ +int mp_sqr(fp_int *A, fp_int *B) +{ + return fp_sqr(A, B); +} + +#ifdef HAVE_ECC + +/* fast math conversion */ int mp_div_2(fp_int * a, fp_int * b) { fp_div_2(a, b); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_dsp.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_dsp.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_dsp.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_dsp.c 2024-08-03 07:30:00.000000000 +0000 @@ -38,7 +38,7 @@ #include "rpcmem.h" static wolfSSL_DSP_Handle_cb handle_function = NULL; static remote_handle64 defaultHandle; -static wolfSSL_Mutex handle_mutex; /* mutex for access to single default handle */ +static wolfSSL_Mutex handle_mutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(handle_mutex); /* mutex for access to single default handle */ #define WOLFSSL_HANDLE_DONE 1 #define WOLFSSL_HANDLE_GET 0 @@ -95,11 +95,13 @@ return -1; } wolfSSL_SetHandleCb(default_handle_cb); +#ifndef WOLFSSL_MUTEX_INITIALIZER ret = wc_InitMutex(&handle_mutex); if (ret != 0) { WOLFSSL_MSG("Unable to init handle mutex"); return -1; } +#endif return 0; } @@ -108,7 +110,9 @@ void wolfSSL_CleanupHandle() { wolfSSL_close(defaultHandle); +#ifndef WOLFSSL_MUTEX_INITIALIZER wc_FreeMutex(&handle_mutex); +#endif } #if defined(WOLFSSL_HAVE_SP_ECC) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_encrypt.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_encrypt.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_encrypt.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_encrypt.c 2024-08-03 07:30:00.000000000 +0000 @@ -244,7 +244,7 @@ int wc_BufferKeyDecrypt(EncryptedInfo* info, byte* der, word32 derSz, const byte* password, int passwordSz, int hashType) { - int ret = NOT_COMPILED_IN; + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #ifdef WOLFSSL_SMALL_STACK byte* key = NULL; #else @@ -318,7 +318,7 @@ int wc_BufferKeyEncrypt(EncryptedInfo* info, byte* der, word32 derSz, const byte* password, int passwordSz, int hashType) { - int ret = NOT_COMPILED_IN; + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); #ifdef WOLFSSL_SMALL_STACK byte* key = NULL; #else @@ -545,9 +545,15 @@ ret = wc_PKCS12_PBKDF(key, unicodePasswd, idx, salt, saltSz, iterations, (int)derivedLen, typeH, 1); + if (ret < 0) + break; if (id != PBE_SHA1_RC4_128) { - ret += wc_PKCS12_PBKDF(cbcIv, unicodePasswd, idx, salt, + i = ret; + ret = wc_PKCS12_PBKDF(cbcIv, unicodePasswd, idx, salt, saltSz, iterations, 8, typeH, 2); + if (ret < 0) + break; + ret += i; } break; } @@ -658,15 +664,21 @@ AES_ENCRYPTION); } else { + #ifdef HAVE_AES_DECRYPT ret = wc_AesSetKey(aes, key, derivedLen, cbcIv, AES_DECRYPTION); + #else + ret = NOT_COMPILED_IN; + #endif } } if (ret == 0) { if (enc) ret = wc_AesCbcEncrypt(aes, input, input, (word32)length); + #ifdef HAVE_AES_DECRYPT else ret = wc_AesCbcDecrypt(aes, input, input, (word32)length); + #endif } if (free_aes) wc_AesFree(aes); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* wc_kyber.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -19,8 +19,1313 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +/* Implementation based on NIST 3rd Round submission package. + * See link at: + * https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization/round-3-submissions + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + #include +#include +#include +#include +#include +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +#ifdef WOLFSSL_WC_KYBER + +/******************************************************************************/ + +/* Use SHA3-256 to generate 32-bytes of hash. */ +#define KYBER_HASH_H wc_Sha3_256Hash +/* Use SHA3-512 to generate 64-bytes of hash. */ +#define KYBER_HASH_G wc_Sha3_512Hash +/* Use SHAKE-256 as a key derivation function (KDF). */ +#ifdef USE_INTEL_SPEEDUP +#define KYBER_KDF kyber_kdf +#else +#define KYBER_KDF wc_Shake256Hash +#endif + +/******************************************************************************/ + +/* Declare variable to make compiler not optimize code in kyber_from_msg(). */ +volatile sword16 kyber_opt_blocker = 0; + +/******************************************************************************/ + +/** + * Initialize the Kyber key. + * + * @param [in] type Type of key: KYBER512, KYBER768, KYBER1024. + * @param [out] key Kyber key object to initialize. + * @param [in] heap Dynamic memory hint. + * @param [in] devId Device Id. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL or type is unrecognized. + * @return NOT_COMPILED_IN when key type is not supported. + */ +int wc_KyberKey_Init(int type, KyberKey* key, void* heap, int devId) +{ + int ret = 0; + + /* Validate key. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + /* Validate type. */ + switch (type) { + case KYBER512: + #ifndef WOLFSSL_KYBER512 + /* Code not compiled in for Kyber-512. */ + ret = NOT_COMPILED_IN; + #endif + break; + case KYBER768: + #ifndef WOLFSSL_KYBER768 + /* Code not compiled in for Kyber-768. */ + ret = NOT_COMPILED_IN; + #endif + break; + case KYBER1024: + #ifndef WOLFSSL_KYBER1024 + /* Code not compiled in for Kyber-1024. */ + ret = NOT_COMPILED_IN; + #endif + break; + default: + /* No other values supported. */ + ret = BAD_FUNC_ARG; + break; + } + } + if (ret == 0) { + /* Zero out all data. */ + XMEMSET(key, 0, sizeof(*key)); + + /* Keep type for parameters. */ + key->type = type; + /* Cache heap pointer. */ + key->heap = heap; + #ifdef WOLF_CRYPTO_CB + /* Cache device id - not used in for this algorithm yet. */ + key->devId = devId; + #endif + + /* Initialize the PRF algorithm object. */ + ret = kyber_prf_new(&key->prf, heap, devId); + } + if (ret == 0) { + kyber_init(); + } + + (void)devId; + + return ret; +} + +/** + * Free the Kyber key object. + * + * @param [in, out] key Kyber key object to dispose of. + */ +void wc_KyberKey_Free(KyberKey* key) +{ + if (key != NULL) { + /* Dispose of PRF object. */ + kyber_prf_free(&key->prf); + /* Ensure all private data is zeroed. */ + ForceZero(key, sizeof(*key)); + } +} + +/******************************************************************************/ + +/** + * Make a Kyber key object using a random number generator. + * + * @param [in, out] key Kyber key object. + * @param [in] rng Random number generator. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or rng is NULL. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_KyberKey_MakeKey(KyberKey* key, WC_RNG* rng) +{ + int ret = 0; + unsigned char rand[KYBER_MAKEKEY_RAND_SZ]; + + /* Validate parameters. */ + if ((key == NULL) || (rng == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Generate random to with PRFs. */ + ret = wc_RNG_GenerateBlock(rng, rand, KYBER_SYM_SZ); + } + if (ret == 0) { + /* Generate random to with PRFs. */ + ret = wc_RNG_GenerateBlock(rng, rand + KYBER_SYM_SZ, KYBER_SYM_SZ); + } + if (ret == 0) { + /* Make a key pair from the random. */ + ret = wc_KyberKey_MakeKeyWithRandom(key, rand, sizeof(rand)); + } + + /* Ensure seeds are zeroized. */ + ForceZero((void*)rand, (word32)sizeof(rand)); + + return ret; +} + +/** + * Make a Kyber key object using random data. + * + * @param [in, out] key Kyber key ovject. + * @param [in] rng Random number generator. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or rand is NULL. + * @return BUFFER_E when length is not KYBER_MAKEKEY_RAND_SZ. + * @return NOT_COMPILED_IN when key type is not supported. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_KyberKey_MakeKeyWithRandom(KyberKey* key, const unsigned char* rand, + int len) +{ + byte buf[2 * KYBER_SYM_SZ + 1]; + byte* pubSeed = buf; + byte* noiseSeed = buf + KYBER_SYM_SZ; + sword16* a = NULL; + sword16* e = NULL; + int ret = 0; + int kp = 0; + + /* Validate parameters. */ + if ((key == NULL) || (rand == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (len != KYBER_MAKEKEY_RAND_SZ)) { + ret = BUFFER_E; + } + + if (ret == 0) { + /* Establish parameters based on key type. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + kp = KYBER512_K; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + kp = KYBER768_K; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + kp = KYBER1024_K; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + + if (ret == 0) { + /* Allocate dynamic memory for matrix and error vector. */ + a = (sword16*)XMALLOC((kp + 1) * kp * KYBER_N * sizeof(sword16), + key->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (a == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + /* Error vector allocated at end of a. */ + e = a + (kp * kp * KYBER_N); + + /* Expand 16 bytes of random to 32. */ + ret = KYBER_HASH_G(rand, KYBER_SYM_SZ, buf); + } + if (ret == 0) { + /* Cache the public seed for use in encapsulation and encoding public + * key. */ + XMEMCPY(key->pubSeed, pubSeed, KYBER_SYM_SZ); + /* Cache the z value for decapsulation and encoding private key. */ + XMEMCPY(key->z, rand + KYBER_SYM_SZ, sizeof(key->z)); + + /* Generate the matrix A. */ + ret = kyber_gen_matrix(&key->prf, a, kp, pubSeed, 0); + } + + if (ret == 0) { + /* Initialize PRF for use in noise generation. */ + kyber_prf_init(&key->prf); + /* Generate noise using PRF. */ + ret = kyber_get_noise(&key->prf, kp, key->priv, e, NULL, noiseSeed); + } + if (ret == 0) { + /* Generate key pair from random data. */ + kyber_keygen(key->priv, key->pub, e, a, kp); + + /* Private and public key are set/available. */ + key->flags |= KYBER_FLAG_PRIV_SET | KYBER_FLAG_PUB_SET; + } + + /* Free dynamic memory allocated in function. */ + XFREE(a, key->heap, DYNAMIC_TYPE_TMP_BUFFER); + + return ret; +} + +/******************************************************************************/ + +/** + * Get the size in bytes of cipher text for key. + * + * @param [in] key Kyber key object. + * @param [out] len Length of cipher text in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or len is NULL. + * @return NOT_COMPILED_IN when key type is not supported. + */ +int wc_KyberKey_CipherTextSize(KyberKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Return in 'len' size of the cipher text for the type of this key. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + *len = KYBER512_CIPHER_TEXT_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + *len = KYBER768_CIPHER_TEXT_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + *len = KYBER1024_CIPHER_TEXT_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + + return ret; +} + +/** + * Size of a shared secret in bytes. Always KYBER_SS_SZ. + * + * @param [in] key Kyber key object. Not used. + * @param [out] Size of the shared secret created with a Kyber key. + * @return 0 on success. + * @return 0 to indicate success. + */ +int wc_KyberKey_SharedSecretSize(KyberKey* key, word32* len) +{ + (void)key; + + *len = KYBER_SS_SZ; + + return 0; +} + +/* Encapsulate data and derive secret. + * + * @param [in] key Kyber key object. + * @param [in] msg Message to encapsulate. + * @param [in] coins Coins (seed) to feed to PRF. + * @param [in] ct Calculated cipher text. + * @return 0 on success. + * @return NOT_COMPILED_IN when key type is not supported. + */ +static int kyberkey_encapsulate(KyberKey* key, const byte* msg, byte* coins, + unsigned char* ct) +{ + int ret = 0; + sword16* sp = NULL; + sword16* ep = NULL; + sword16* k = NULL; + sword16* epp = NULL; + unsigned int kp = 0; + unsigned int compVecSz = 0; +#ifndef USE_INTEL_SPEEDUP + sword16* at = NULL; +#else + sword16 at[((KYBER_MAX_K + 3) * KYBER_MAX_K + 3) * KYBER_N]; +#endif + + /* Establish parameters based on key type. */ + switch (key->type) { +#ifdef WOLFSSL_KYBER512 + case KYBER512: + kp = KYBER512_K; + compVecSz = KYBER512_POLY_VEC_COMPRESSED_SZ; + break; +#endif +#ifdef WOLFSSL_KYBER768 + case KYBER768: + kp = KYBER768_K; + compVecSz = KYBER768_POLY_VEC_COMPRESSED_SZ; + break; +#endif +#ifdef WOLFSSL_KYBER1024 + case KYBER1024: + kp = KYBER1024_K; + compVecSz = KYBER1024_POLY_VEC_COMPRESSED_SZ; + break; +#endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + +#ifndef USE_INTEL_SPEEDUP + if (ret == 0) { + /* Allocate dynamic memory for all matrices, vectors and polynomials. */ + at = (sword16*)XMALLOC(((kp + 3) * kp + 3) * KYBER_N * sizeof(sword16), + key->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (at == NULL) { + ret = MEMORY_E; + } + } +#endif + + if (ret == 0) { + /* Assign allocated dynamic memory to pointers. + * at (m) | k (p) | sp (v) | sp (v) | epp (v) | bp (p) | v (v) */ + k = at + KYBER_N * kp * kp; + sp = k + KYBER_N; + ep = sp + KYBER_N * kp; + epp = ep + KYBER_N * kp; + + /* Convert msg to a polynomial. */ + kyber_from_msg(k, msg); + + /* Generate the transposed matrix. */ + ret = kyber_gen_matrix(&key->prf, at, kp, key->pubSeed, 1); + } + if (ret == 0) { + /* Initialize the PRF for use in the noise generation. */ + kyber_prf_init(&key->prf); + /* Generate noise using PRF. */ + ret = kyber_get_noise(&key->prf, kp, sp, ep, epp, coins); + } + if (ret == 0) { + sword16* bp; + sword16* v; + + /* Assign remaining allocated dynamic memory to pointers. + * at (m) | k (p) | sp (v) | sp (v) | epp (v) | bp (p) | v (v)*/ + bp = epp + KYBER_N; + v = bp + KYBER_N * kp; + + /* Perform encapsulation maths. */ + kyber_encapsulate(key->pub, bp, v, at, sp, ep, epp, k, kp); + + #ifdef WOLFSSL_KYBER512 + if (kp == KYBER512_K) { + kyber_vec_compress_10(ct, bp, kp); + kyber_compress_4(ct + compVecSz, v); + } + #endif + #ifdef WOLFSSL_KYBER768 + if (kp == KYBER768_K) { + kyber_vec_compress_10(ct, bp, kp); + kyber_compress_4(ct + compVecSz, v); + } + #endif + #ifdef WOLFSSL_KYBER1024 + if (kp == KYBER1024_K) { + kyber_vec_compress_11(ct, bp); + kyber_compress_5(ct + compVecSz, v); + } + #endif + } + +#ifndef USE_INTEL_SPEEDUP + /* Dispose of dynamic memory allocated in function. */ + XFREE(at, key->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +/** + * Encapsulate with random number generator and derive secret. + * + * @param [in] key Kyber key object. + * @param [out] ct Cipher text. + * @param [out] ss Shared secret generated. + * @param [in] rng Random number generator. + * @return 0 on success. + * @return BAD_FUNC_ARG when key, ct, ss or RNG is NULL. + * @return NOT_COMPILED_IN when key type is not supported. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_KyberKey_Encapsulate(KyberKey* key, unsigned char* ct, unsigned char* ss, + WC_RNG* rng) +{ + int ret = 0; + unsigned char rand[KYBER_ENC_RAND_SZ]; + + /* Validate parameters. */ + if ((key == NULL) || (ct == NULL) || (ss == NULL) || (rng == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Generate seed for use with PRFs. */ + ret = wc_RNG_GenerateBlock(rng, rand, sizeof(rand)); + } + if (ret == 0) { + /* Encapsulate with the random. */ + ret = wc_KyberKey_EncapsulateWithRandom(key, ct, ss, rand, + sizeof(rand)); + } + + return ret; +} + +/** + * Encapsulate with random data and derive secret. + * + * @param [out] ct Cipher text. + * @param [out] ss Shared secret generated. + * @param [in] rand Random data. + * @param [in] len Random data. + * @return 0 on success. + * @return BAD_FUNC_ARG when key, ct, ss or RNG is NULL. + * @return BUFFER_E when len is not KYBER_ENC_RAND_SZ. + * @return NOT_COMPILED_IN when key type is not supported. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_KyberKey_EncapsulateWithRandom(KyberKey* key, unsigned char* ct, + unsigned char* ss, const unsigned char* rand, int len) +{ + byte msg[2 * KYBER_SYM_SZ]; + byte kr[2 * KYBER_SYM_SZ + 1]; + int ret = 0; +#ifndef WOLFSSL_ML_KEM + unsigned int ctSz = 0; +#endif + + /* Validate parameters. */ + if ((key == NULL) || (ct == NULL) || (ss == NULL) || (rand == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (len != KYBER_ENC_RAND_SZ)) { + ret = BUFFER_E; + } + +#ifndef WOLFSSL_ML_KEM + if (ret == 0) { + /* Establish parameters based on key type. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + ctSz = KYBER512_CIPHER_TEXT_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + ctSz = KYBER768_CIPHER_TEXT_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + ctSz = KYBER1024_CIPHER_TEXT_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } +#endif + + /* If public hash (h) is not stored against key, calculate it. */ + if ((ret == 0) && ((key->flags & KYBER_FLAG_H_SET) == 0)) { + byte* pubKey = NULL; + word32 pubKeyLen; + + /* Determine how big an encoded public key will be. */ + ret = wc_KyberKey_PublicKeySize(key, &pubKeyLen); + if (ret == 0) { + /* Allocate dynamic memory for encoded public key. */ + pubKey = (byte*)XMALLOC(pubKeyLen, key->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (pubKey == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + /* Encode public key - h is hash of encoded public key. */ + ret = wc_KyberKey_EncodePublicKey(key, pubKey, pubKeyLen); + } + /* Dispose of encoded public key. */ + XFREE(pubKey, key->heap, DYNAMIC_TYPE_TMP_BUFFER); + } + if ((ret == 0) && ((key->flags & KYBER_FLAG_H_SET) == 0)) { + /* Implementation issue if h not cached and flag set. */ + ret = BAD_STATE_E; + } + + if (ret == 0) { +#ifndef WOLFSSL_ML_KEM + /* Hash random to anonymize as seed data. */ + ret = KYBER_HASH_H(rand, KYBER_SYM_SZ, msg); +#else + XMEMCPY(msg, rand, KYBER_SYM_SZ); +#endif + } + if (ret == 0) { + /* Copy the hash of the public key into msg. */ + XMEMCPY(msg + KYBER_SYM_SZ, key->h, KYBER_SYM_SZ); + + /* Hash message into seed buffer. */ + ret = KYBER_HASH_G(msg, 2 * KYBER_SYM_SZ, kr); + } + + if (ret == 0) { + /* Encapsulate the message using the key and the seed (coins). */ + ret = kyberkey_encapsulate(key, msg, kr + KYBER_SYM_SZ, ct); + } -#ifdef WOLFSSL_HAVE_KYBER - #error "Contact wolfSSL to get the implementation of this file" +#ifndef WOLFSSL_ML_KEM + if (ret == 0) { + /* Hash the cipher text after the seed. */ + ret = KYBER_HASH_H(ct, ctSz, kr + KYBER_SYM_SZ); + } + if (ret == 0) { + /* Derive the secret from the seed and hash of cipher text. */ + ret = KYBER_KDF(kr, 2 * KYBER_SYM_SZ, ss, KYBER_SS_SZ); + } +#else + if (ret == 0) { + XMEMCPY(ss, kr, KYBER_SS_SZ); + } #endif + + return ret; +} + +/******************************************************************************/ + +/* Decapsulate cipher text to the message using key. + * + * @param [in] Kyber key object. + * @param [out] Message than was encapsulated. + * @param [in] Cipher text. + * @return 0 on success. + * @return NOT_COMPILED_IN when key type is not supported. + * @return MEMORY_E when dynamic memory allocation failed. + */ +static KYBER_NOINLINE int kyberkey_decapsulate(KyberKey* key, + unsigned char* msg, const unsigned char* ct) +{ + int ret = 0; + sword16* v; + sword16* mp; + unsigned int kp = 0; + unsigned int compVecSz; +#ifndef USE_INTEL_SPEEDUP + sword16* bp = NULL; +#else + sword16 bp[(KYBER_MAX_K + 2) * KYBER_N]; +#endif + + /* Establish parameters based on key type. */ + switch (key->type) { +#ifdef WOLFSSL_KYBER512 + case KYBER512: + kp = KYBER512_K; + compVecSz = KYBER512_POLY_VEC_COMPRESSED_SZ; + break; +#endif +#ifdef WOLFSSL_KYBER768 + case KYBER768: + kp = KYBER768_K; + compVecSz = KYBER768_POLY_VEC_COMPRESSED_SZ; + break; +#endif +#ifdef WOLFSSL_KYBER1024 + case KYBER1024: + kp = KYBER1024_K; + compVecSz = KYBER1024_POLY_VEC_COMPRESSED_SZ; + break; +#endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + +#ifndef USE_INTEL_SPEEDUP + if (ret == 0) { + /* Allocate dynamic memory for a vector and two polynomials. */ + bp = (sword16*)XMALLOC((kp + 2) * KYBER_N * sizeof(sword16), key->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (bp == NULL) { + ret = MEMORY_E; + } + } +#endif + if (ret == 0) { + /* Assign allocated dynamic memory to pointers. + * bp (v) | v (p) | mp (p) */ + v = bp + kp * KYBER_N; + mp = v + KYBER_N; + + #ifdef WOLFSSL_KYBER512 + if (kp == KYBER512_K) { + kyber_vec_decompress_10(bp, ct, kp); + kyber_decompress_4(v, ct + compVecSz); + } + #endif + #ifdef WOLFSSL_KYBER768 + if (kp == KYBER768_K) { + kyber_vec_decompress_10(bp, ct, kp); + kyber_decompress_4(v, ct + compVecSz); + } + #endif + #ifdef WOLFSSL_KYBER1024 + if (kp == KYBER1024_K) { + kyber_vec_decompress_11(bp, ct); + kyber_decompress_5(v, ct + compVecSz); + } + #endif + + /* Decapsulate the cipher text into polynomial. */ + kyber_decapsulate(key->priv, mp, bp, v, kp); + + /* Convert the polynomial into a array of bytes (message). */ + kyber_to_msg(msg, mp); + } + +#ifndef USE_INTEL_SPEEDUP + /* Dispose of dynamically memory allocated in function. */ + XFREE(bp, key->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +#ifdef WOLFSSL_ML_KEM +/* Derive the secret from z and cipher text. + * + * @param [in] z Implicit rejection value. + * @param [in] ct Cipher text. + * @param [in] ctSz Length of cipher text in bytes. + * @param [out] ss Shared secret. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation failed. + * @return Other negative when a hash error occurred. + */ +static int kyber_derive_secret(const byte* z, const byte* ct, word32 ctSz, + byte* ss) +{ + int ret; + wc_Shake shake; + + ret = wc_InitShake256(&shake, NULL, INVALID_DEVID); + if (ret == 0) { + ret = wc_Shake256_Update(&shake, z, KYBER_SYM_SZ); + if (ret == 0) { + ret = wc_Shake256_Update(&shake, ct, ctSz); + } + if (ret == 0) { + ret = wc_Shake256_Final(&shake, ss, KYBER_SS_SZ); + } + wc_Shake256_Free(&shake); + } + + return ret; +} +#endif + +/** + * Decapsulate the cipher text to calculate the shared secret. + * + * Validates the cipher text by encapsulating and comparing with data passed in. + * + * @param [in] key Kyber key object. + * @param [out] ss Shared secret. + * @param [in] ct Cipher text. + * @param [in] len Length of cipher text. + * @return 0 on success. + * @return BAD_FUNC_ARG when key, ss or cr are NULL. + * @return NOT_COMPILED_IN when key type is not supported. + * @return BUFFER_E when len is not the length of cipher text for the key type. + * @return MEMORY_E when dynamic memory allocation failed. + */ +int wc_KyberKey_Decapsulate(KyberKey* key, unsigned char* ss, + const unsigned char* ct, word32 len) +{ + byte msg[2 * KYBER_SYM_SZ]; + byte kr[2 * KYBER_SYM_SZ + 1]; + int ret = 0; + unsigned int ctSz = 0; + unsigned int i = 0; + int fail = 0; +#ifndef USE_INTEL_SPEEDUP + byte* cmp = NULL; +#else + byte cmp[KYBER_MAX_CIPHER_TEXT_SIZE]; +#endif + + /* Validate parameters. */ + if ((key == NULL) || (ss == NULL) || (ct == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Establish cipher text size based on key type. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + ctSz = KYBER512_CIPHER_TEXT_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + ctSz = KYBER768_CIPHER_TEXT_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + ctSz = KYBER1024_CIPHER_TEXT_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + + /* Ensure the cipher text passed in is the correct size. */ + if ((ret == 0) && (len != ctSz)) { + ret = BUFFER_E; + } + +#ifndef USE_INTEL_SPEEDUP + if (ret == 0) { + /* Allocate memory for cipher text that is generated. */ + cmp = (byte*)XMALLOC(ctSz, key->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (cmp == NULL) { + ret = MEMORY_E; + } + } +#endif + + if (ret == 0) { + /* Decapsulate the cipher text. */ + ret = kyberkey_decapsulate(key, msg, ct); + } + if (ret == 0) { + /* Copy public hash over after the seed. */ + XMEMCPY(msg + KYBER_SYM_SZ, key->h, KYBER_SYM_SZ); + /* Hash message into seed buffer. */ + ret = KYBER_HASH_G(msg, 2 * KYBER_SYM_SZ, kr); + } + if (ret == 0) { + /* Encapsulate the message. */ + ret = kyberkey_encapsulate(key, msg, kr + KYBER_SYM_SZ, cmp); + } + if (ret == 0) { + /* Compare generated cipher text with that passed in. */ + fail = kyber_cmp(ct, cmp, ctSz); + +#ifndef WOLFSSL_ML_KEM + /* Hash the cipher text after the seed. */ + ret = KYBER_HASH_H(ct, ctSz, kr + KYBER_SYM_SZ); + } + if (ret == 0) { + /* Change seed to z on comparison failure. */ + for (i = 0; i < KYBER_SYM_SZ; i++) { + kr[i] ^= (kr[i] ^ key->z[i]) & fail; + } + + /* Derive the secret from the seed and hash of cipher text. */ + ret = KYBER_KDF(kr, 2 * KYBER_SYM_SZ, ss, KYBER_SS_SZ); +#else + ret = kyber_derive_secret(key->z, ct, ctSz, msg); + } + if (ret == 0) { + /* Change seed to z on comparison failure. */ + for (i = 0; i < KYBER_SYM_SZ; i++) { + ss[i] = kr[i] ^ ((kr[i] ^ msg[i]) & fail); + } +#endif + } + +#ifndef USE_INTEL_SPEEDUP + /* Dispose of dynamic memory allocated in function. */ + XFREE(cmp, key->heap, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +/******************************************************************************/ + +/** + * Decode the private key. + * + * Private Vector | Public Key | Public Hash | Randomizer + * + * @param [in, out] key Kyber key object. + * @param [in] in Buffer holding encoded key. + * @param [in] len Length of data in buffer. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or in is NULL. + * @return NOT_COMPILED_IN when key type is not supported. + * @return BUFFER_E when len is not the correct size. + */ +int wc_KyberKey_DecodePrivateKey(KyberKey* key, const unsigned char* in, + word32 len) +{ + int ret = 0; + word32 privLen = 0; + word32 pubLen = 0; + unsigned int k = 0; + const unsigned char* p = in; + + /* Validate parameters. */ + if ((key == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Establish parameters based on key type. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + k = KYBER512_K; + privLen = KYBER512_PRIVATE_KEY_SIZE; + pubLen = KYBER512_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + k = KYBER768_K; + privLen = KYBER768_PRIVATE_KEY_SIZE; + pubLen = KYBER768_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + k = KYBER1024_K; + privLen = KYBER1024_PRIVATE_KEY_SIZE; + pubLen = KYBER1024_PUBLIC_KEY_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + /* Ensure the data is the correct length for the key type. */ + if ((ret == 0) && (len != privLen)) { + ret = BUFFER_E; + } + + if (ret == 0) { + /* Decode private key that is vector of polynomials. */ + kyber_from_bytes(key->priv, p, k); + p += k * KYBER_POLY_SIZE; + + /* Decode the public key that is after the private key. */ + ret = wc_KyberKey_DecodePublicKey(key, p, pubLen); + } + if (ret == 0) { + /* Skip over public key. */ + p += pubLen; + /* Copy the hash of the encoded public key that is after public key. */ + XMEMCPY(key->h, p, sizeof(key->h)); + p += KYBER_SYM_SZ; + /* Copy the z (randomizer) that is after hash. */ + XMEMCPY(key->z, p, sizeof(key->z)); + /* Set that private and public keys, and public hash are set. */ + key->flags |= KYBER_FLAG_H_SET | KYBER_FLAG_BOTH_SET; + } + + return ret; +} + +/** + * Decode public key. + * + * Public vector | Public Seed + * + * @param [in, out] key Kyber key object. + * @param [in] in Buffer holding encoded key. + * @param [in] len Length of data in buffer. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or in is NULL. + * @return NOT_COMPILED_IN when key type is not supported. + * @return BUFFER_E when len is not the correct size. + */ +int wc_KyberKey_DecodePublicKey(KyberKey* key, const unsigned char* in, + word32 len) +{ + int ret = 0; + word32 pubLen = 0; + unsigned int k = 0; + const unsigned char* p = in; + + if ((key == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Establish parameters based on key type. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + k = KYBER512_K; + pubLen = KYBER512_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + k = KYBER768_K; + pubLen = KYBER768_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + k = KYBER1024_K; + pubLen = KYBER1024_PUBLIC_KEY_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + /* Ensure the data is the correct length for the key type. */ + if ((ret == 0) && (len != pubLen)) { + ret = BUFFER_E; + } + + if (ret == 0) { + unsigned int i; + + /* Decode public key that is vector of polynomials. */ + kyber_from_bytes(key->pub, p, k); + p += k * KYBER_POLY_SIZE; + + /* Read public key seed. */ + for (i = 0; i < KYBER_SYM_SZ; i++) { + key->pubSeed[i] = p[i]; + } + /* Calculate public hash. */ + ret = KYBER_HASH_H(in, len, key->h); + } + if (ret == 0) { + /* Record public key and public hash set. */ + key->flags |= KYBER_FLAG_PUB_SET | KYBER_FLAG_H_SET; + } + + return ret; +} + +/** + * Get the size in bytes of encoded private key for the key. + * + * @param [in] key Kyber key object. + * @param [out] len Length of encoded private key in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or len is NULL. + * @return NOT_COMPILED_IN when key type is not supported. + */ +int wc_KyberKey_PrivateKeySize(KyberKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Return in 'len' size of the encoded private key for the type of this + * key. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + *len = KYBER512_PRIVATE_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + *len = KYBER768_PRIVATE_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + *len = KYBER1024_PRIVATE_KEY_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + + return ret; +} + +/** + * Get the size in bytes of encoded public key for the key. + * + * @param [in] key Kyber key object. + * @param [out] len Length of encoded public key in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or len is NULL. + * @return NOT_COMPILED_IN when key type is not supported. + */ +int wc_KyberKey_PublicKeySize(KyberKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Return in 'len' size of the encoded public key for the type of this + * key. */ + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + *len = KYBER512_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + *len = KYBER768_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + *len = KYBER1024_PUBLIC_KEY_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + + return ret; +} + +/** + * Encode the private key. + * + * Private Vector | Public Key | Public Hash | Randomizer + * + * @param [in] key Kyber key object. + * @param [out] out Buffer to hold data. + * @param [in] len Size of buffer in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or out is NULL or private/public key not + * available. + * @return NOT_COMPILED_IN when key type is not supported. + */ +int wc_KyberKey_EncodePrivateKey(KyberKey* key, unsigned char* out, word32 len) +{ + int ret = 0; + unsigned int k = 0; + unsigned int pubLen = 0; + unsigned int privLen = 0; + unsigned char* p = out; + + if ((key == NULL) || (out == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && + ((key->flags & KYBER_FLAG_BOTH_SET) != KYBER_FLAG_BOTH_SET)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + k = KYBER512_K; + pubLen = KYBER512_PUBLIC_KEY_SIZE; + privLen = KYBER512_PRIVATE_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + k = KYBER768_K; + pubLen = KYBER768_PUBLIC_KEY_SIZE; + privLen = KYBER768_PRIVATE_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + k = KYBER1024_K; + pubLen = KYBER1024_PUBLIC_KEY_SIZE; + privLen = KYBER1024_PRIVATE_KEY_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + /* Check buffer is big enough for encoding. */ + if ((ret == 0) && (len != privLen)) { + ret = BUFFER_E; + } + + if (ret == 0) { + /* Encode private key that is vector of polynomials. */ + kyber_to_bytes(p, key->priv, k); + p += KYBER_POLY_SIZE * k; + + /* Encode public key. */ + ret = wc_KyberKey_EncodePublicKey(key, p, pubLen); + p += pubLen; + } + /* Ensure hash of public key is available. */ + if ((ret == 0) && ((key->flags & KYBER_FLAG_H_SET) == 0)) { + ret = KYBER_HASH_H(p - pubLen, pubLen, key->h); + } + if (ret == 0) { + /* Public hash is available. */ + key->flags |= KYBER_FLAG_H_SET; + /* Append public hash. */ + XMEMCPY(p, key->h, sizeof(key->h)); + p += KYBER_SYM_SZ; + /* Append z (randomizer). */ + XMEMCPY(p, key->z, sizeof(key->z)); + } + + return ret; +} + +/** + * Encode the public key. + * + * Public vector | Public Seed + * + * @param [in] key Kyber key object. + * @param [out] out Buffer to hold data. + * @param [in] len Size of buffer in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or out is NULL or public key not available. + * @return NOT_COMPILED_IN when key type is not supported. + */ +int wc_KyberKey_EncodePublicKey(KyberKey* key, unsigned char* out, word32 len) +{ + int ret = 0; + unsigned int k = 0; + unsigned int pubLen = 0; + unsigned char* p = out; + + if ((key == NULL) || (out == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && + ((key->flags & KYBER_FLAG_PUB_SET) != KYBER_FLAG_PUB_SET)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + switch (key->type) { + #ifdef WOLFSSL_KYBER512 + case KYBER512: + k = KYBER512_K; + pubLen = KYBER512_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER768 + case KYBER768: + k = KYBER768_K; + pubLen = KYBER768_PUBLIC_KEY_SIZE; + break; + #endif + #ifdef WOLFSSL_KYBER1024 + case KYBER1024: + k = KYBER1024_K; + pubLen = KYBER1024_PUBLIC_KEY_SIZE; + break; + #endif + default: + /* No other values supported. */ + ret = NOT_COMPILED_IN; + break; + } + } + /* Check buffer is big enough for encoding. */ + if ((ret == 0) && (len != pubLen)) { + ret = BUFFER_E; + } + + if (ret == 0) { + int i; + + /* Encode public key polynomial by polynomial. */ + kyber_to_bytes(p, key->pub, k); + p += k * KYBER_POLY_SIZE; + + /* Append public seed. */ + for (i = 0; i < KYBER_SYM_SZ; i++) { + p[i] = key->pubSeed[i]; + } + + /* Make sure public hash is set. */ + if ((key->flags & KYBER_FLAG_H_SET) == 0) { + ret = KYBER_HASH_H(out, len, key->h); + } + } + if (ret == 0) { + /* Public hash is set. */ + key->flags |= KYBER_FLAG_H_SET; + } + + return ret; +} + +#endif /* WOLFSSL_WC_KYBER */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_asm.S mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_asm.S --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_asm.S 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_asm.S 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ -/* wc_kyber_asm.S - * - * Copyright (C) 2006-2023 wolfSSL Inc. +/* wc_kyber_asm.S */ +/* + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -19,9 +19,27807 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -#include +#ifdef WOLFSSL_USER_SETTINGS +#ifdef WOLFSSL_USER_SETTINGS_ASM +/* + * user_settings_asm.h is a file generated by the script user_settings_asm.sh. + * The script takes in a user_settings.h and produces user_settings_asm.h, which + * is a stripped down version of user_settings.h containing only preprocessor + * directives. This makes the header safe to include in assembly (.S) files. + */ +#include "user_settings_asm.h" +#else +/* + * Note: if user_settings.h contains any C code (e.g. a typedef or function + * prototype), including it here in an assembly (.S) file will cause an + * assembler failure. See user_settings_asm.h above. + */ +#include "user_settings.h" +#endif /* WOLFSSL_USER_SETTINGS_ASM */ +#endif /* WOLFSSL_USER_SETTINGS */ + +#ifndef HAVE_INTEL_AVX1 +#define HAVE_INTEL_AVX1 +#endif /* HAVE_INTEL_AVX1 */ +#ifndef NO_AVX2_SUPPORT +#define HAVE_INTEL_AVX2 +#endif /* NO_AVX2_SUPPORT */ -#ifdef WOLFSSL_HAVE_KYBER - #error "Contact wolfSSL to get the implementation of this file" -#endif +#ifdef WOLFSSL_WC_KYBER +#ifdef HAVE_INTEL_AVX2 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +kyber_q: +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +kyber_qinv: +.value 0xf301,0xf301 +.value 0xf301,0xf301 +.value 0xf301,0xf301 +.value 0xf301,0xf301 +.value 0xf301,0xf301 +.value 0xf301,0xf301 +.value 0xf301,0xf301 +.value 0xf301,0xf301 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +kyber_f: +.value 0x549,0x549 +.value 0x549,0x549 +.value 0x549,0x549 +.value 0x549,0x549 +.value 0x549,0x549 +.value 0x549,0x549 +.value 0x549,0x549 +.value 0x549,0x549 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +kyber_f_qinv: +.value 0x5049,0x5049 +.value 0x5049,0x5049 +.value 0x5049,0x5049 +.value 0x5049,0x5049 +.value 0x5049,0x5049 +.value 0x5049,0x5049 +.value 0x5049,0x5049 +.value 0x5049,0x5049 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +kyber_v: +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_avx2_zetas: +.value 0xa0b,0xa0b +.value 0xa0b,0xa0b +.value 0xa0b,0xa0b +.value 0xa0b,0xa0b +.value 0xa0b,0xa0b +.value 0xa0b,0xa0b +.value 0xa0b,0xa0b +.value 0xa0b,0xa0b +.value 0x7b0b,0x7b0b +.value 0x7b0b,0x7b0b +.value 0x7b0b,0x7b0b +.value 0x7b0b,0x7b0b +.value 0x7b0b,0x7b0b +.value 0x7b0b,0x7b0b +.value 0x7b0b,0x7b0b +.value 0x7b0b,0x7b0b +.value 0xb9a,0xb9a +.value 0xb9a,0xb9a +.value 0xb9a,0xb9a +.value 0xb9a,0xb9a +.value 0xb9a,0xb9a +.value 0xb9a,0xb9a +.value 0xb9a,0xb9a +.value 0xb9a,0xb9a +.value 0x399a,0x399a +.value 0x399a,0x399a +.value 0x399a,0x399a +.value 0x399a,0x399a +.value 0x399a,0x399a +.value 0x399a,0x399a +.value 0x399a,0x399a +.value 0x399a,0x399a +.value 0x5d5,0x5d5 +.value 0x5d5,0x5d5 +.value 0x5d5,0x5d5 +.value 0x5d5,0x5d5 +.value 0x5d5,0x5d5 +.value 0x5d5,0x5d5 +.value 0x5d5,0x5d5 +.value 0x5d5,0x5d5 +.value 0x34d5,0x34d5 +.value 0x34d5,0x34d5 +.value 0x34d5,0x34d5 +.value 0x34d5,0x34d5 +.value 0x34d5,0x34d5 +.value 0x34d5,0x34d5 +.value 0x34d5,0x34d5 +.value 0x34d5,0x34d5 +.value 0x58e,0x58e +.value 0x58e,0x58e +.value 0x58e,0x58e +.value 0x58e,0x58e +.value 0x58e,0x58e +.value 0x58e,0x58e +.value 0x58e,0x58e +.value 0x58e,0x58e +.value 0xcf8e,0xcf8e +.value 0xcf8e,0xcf8e +.value 0xcf8e,0xcf8e +.value 0xcf8e,0xcf8e +.value 0xcf8e,0xcf8e +.value 0xcf8e,0xcf8e +.value 0xcf8e,0xcf8e +.value 0xcf8e,0xcf8e +.value 0xc56,0xc56 +.value 0xc56,0xc56 +.value 0xc56,0xc56 +.value 0xc56,0xc56 +.value 0xc56,0xc56 +.value 0xc56,0xc56 +.value 0xc56,0xc56 +.value 0xc56,0xc56 +.value 0xae56,0xae56 +.value 0xae56,0xae56 +.value 0xae56,0xae56 +.value 0xae56,0xae56 +.value 0xae56,0xae56 +.value 0xae56,0xae56 +.value 0xae56,0xae56 +.value 0xae56,0xae56 +.value 0x26e,0x26e +.value 0x26e,0x26e +.value 0x26e,0x26e +.value 0x26e,0x26e +.value 0x26e,0x26e +.value 0x26e,0x26e +.value 0x26e,0x26e +.value 0x26e,0x26e +.value 0x6c6e,0x6c6e +.value 0x6c6e,0x6c6e +.value 0x6c6e,0x6c6e +.value 0x6c6e,0x6c6e +.value 0x6c6e,0x6c6e +.value 0x6c6e,0x6c6e +.value 0x6c6e,0x6c6e +.value 0x6c6e,0x6c6e +.value 0x629,0x629 +.value 0x629,0x629 +.value 0x629,0x629 +.value 0x629,0x629 +.value 0x629,0x629 +.value 0x629,0x629 +.value 0x629,0x629 +.value 0x629,0x629 +.value 0xf129,0xf129 +.value 0xf129,0xf129 +.value 0xf129,0xf129 +.value 0xf129,0xf129 +.value 0xf129,0xf129 +.value 0xf129,0xf129 +.value 0xf129,0xf129 +.value 0xf129,0xf129 +.value 0xb6,0xb6 +.value 0xb6,0xb6 +.value 0xb6,0xb6 +.value 0xb6,0xb6 +.value 0xb6,0xb6 +.value 0xb6,0xb6 +.value 0xb6,0xb6 +.value 0xb6,0xb6 +.value 0xc2b6,0xc2b6 +.value 0xc2b6,0xc2b6 +.value 0xc2b6,0xc2b6 +.value 0xc2b6,0xc2b6 +.value 0xc2b6,0xc2b6 +.value 0xc2b6,0xc2b6 +.value 0xc2b6,0xc2b6 +.value 0xc2b6,0xc2b6 +.value 0x23d,0x23d +.value 0x23d,0x23d +.value 0x23d,0x23d +.value 0x23d,0x23d +.value 0x7d4,0x7d4 +.value 0x7d4,0x7d4 +.value 0x7d4,0x7d4 +.value 0x7d4,0x7d4 +.value 0xe93d,0xe93d +.value 0xe93d,0xe93d +.value 0xe93d,0xe93d +.value 0xe93d,0xe93d +.value 0x43d4,0x43d4 +.value 0x43d4,0x43d4 +.value 0x43d4,0x43d4 +.value 0x43d4,0x43d4 +.value 0x108,0x108 +.value 0x108,0x108 +.value 0x108,0x108 +.value 0x108,0x108 +.value 0x17f,0x17f +.value 0x17f,0x17f +.value 0x17f,0x17f +.value 0x17f,0x17f +.value 0x9908,0x9908 +.value 0x9908,0x9908 +.value 0x9908,0x9908 +.value 0x9908,0x9908 +.value 0x8e7f,0x8e7f +.value 0x8e7f,0x8e7f +.value 0x8e7f,0x8e7f +.value 0x8e7f,0x8e7f +.value 0x4c7,0x4c7 +.value 0x4c7,0x4c7 +.value 0x28c,0x28c +.value 0x28c,0x28c +.value 0xad9,0xad9 +.value 0xad9,0xad9 +.value 0x3f7,0x3f7 +.value 0x3f7,0x3f7 +.value 0xe9c7,0xe9c7 +.value 0xe9c7,0xe9c7 +.value 0xe68c,0xe68c +.value 0xe68c,0xe68c +.value 0x5d9,0x5d9 +.value 0x5d9,0x5d9 +.value 0x78f7,0x78f7 +.value 0x78f7,0x78f7 +.value 0x7f4,0x7f4 +.value 0x7f4,0x7f4 +.value 0x5d3,0x5d3 +.value 0x5d3,0x5d3 +.value 0xbe7,0xbe7 +.value 0xbe7,0xbe7 +.value 0x6f9,0x6f9 +.value 0x6f9,0x6f9 +.value 0xa3f4,0xa3f4 +.value 0xa3f4,0xa3f4 +.value 0x4ed3,0x4ed3 +.value 0x4ed3,0x4ed3 +.value 0x50e7,0x50e7 +.value 0x50e7,0x50e7 +.value 0x61f9,0x61f9 +.value 0x61f9,0x61f9 +.value 0x9c4,0x9c4 +.value 0x9c4,0x9c4 +.value 0x9c4,0x9c4 +.value 0x9c4,0x9c4 +.value 0x5b2,0x5b2 +.value 0x5b2,0x5b2 +.value 0x5b2,0x5b2 +.value 0x5b2,0x5b2 +.value 0x15c4,0x15c4 +.value 0x15c4,0x15c4 +.value 0x15c4,0x15c4 +.value 0x15c4,0x15c4 +.value 0xfbb2,0xfbb2 +.value 0xfbb2,0xfbb2 +.value 0xfbb2,0xfbb2 +.value 0xfbb2,0xfbb2 +.value 0x6bf,0x6bf +.value 0x6bf,0x6bf +.value 0x6bf,0x6bf +.value 0x6bf,0x6bf +.value 0xc7f,0xc7f +.value 0xc7f,0xc7f +.value 0xc7f,0xc7f +.value 0xc7f,0xc7f +.value 0x53bf,0x53bf +.value 0x53bf,0x53bf +.value 0x53bf,0x53bf +.value 0x53bf,0x53bf +.value 0x997f,0x997f +.value 0x997f,0x997f +.value 0x997f,0x997f +.value 0x997f,0x997f +.value 0x204,0x204 +.value 0x204,0x204 +.value 0xcf9,0xcf9 +.value 0xcf9,0xcf9 +.value 0xbc1,0xbc1 +.value 0xbc1,0xbc1 +.value 0xa67,0xa67 +.value 0xa67,0xa67 +.value 0xce04,0xce04 +.value 0xce04,0xce04 +.value 0x67f9,0x67f9 +.value 0x67f9,0x67f9 +.value 0x3ec1,0x3ec1 +.value 0x3ec1,0x3ec1 +.value 0xcf67,0xcf67 +.value 0xcf67,0xcf67 +.value 0x6af,0x6af +.value 0x6af,0x6af +.value 0x877,0x877 +.value 0x877,0x877 +.value 0x7e,0x7e +.value 0x7e,0x7e +.value 0x5bd,0x5bd +.value 0x5bd,0x5bd +.value 0x23af,0x23af +.value 0x23af,0x23af +.value 0xfd77,0xfd77 +.value 0xfd77,0xfd77 +.value 0x9a7e,0x9a7e +.value 0x9a7e,0x9a7e +.value 0x6cbd,0x6cbd +.value 0x6cbd,0x6cbd +.value 0x8b2,0x8b2 +.value 0x1ae,0x1ae +.value 0x22b,0x22b +.value 0x34b,0x34b +.value 0x81e,0x81e +.value 0x367,0x367 +.value 0x60e,0x60e +.value 0x69,0x69 +.value 0xfeb2,0xfeb2 +.value 0x2bae,0x2bae +.value 0xd32b,0xd32b +.value 0x344b,0x344b +.value 0x821e,0x821e +.value 0xc867,0xc867 +.value 0x500e,0x500e +.value 0xab69,0xab69 +.value 0x1a6,0x1a6 +.value 0x24b,0x24b +.value 0xb1,0xb1 +.value 0xc16,0xc16 +.value 0xbde,0xbde +.value 0xb35,0xb35 +.value 0x626,0x626 +.value 0x675,0x675 +.value 0x93a6,0x93a6 +.value 0x334b,0x334b +.value 0x3b1,0x3b1 +.value 0xee16,0xee16 +.value 0xc5de,0xc5de +.value 0x5a35,0x5a35 +.value 0x1826,0x1826 +.value 0x1575,0x1575 +.value 0xc0b,0xc0b +.value 0x30a,0x30a +.value 0x487,0x487 +.value 0xc6e,0xc6e +.value 0x9f8,0x9f8 +.value 0x5cb,0x5cb +.value 0xaa7,0xaa7 +.value 0x45f,0x45f +.value 0x7d0b,0x7d0b +.value 0x810a,0x810a +.value 0x2987,0x2987 +.value 0x766e,0x766e +.value 0x71f8,0x71f8 +.value 0xb6cb,0xb6cb +.value 0x8fa7,0x8fa7 +.value 0x315f,0x315f +.value 0x6cb,0x6cb +.value 0x284,0x284 +.value 0x999,0x999 +.value 0x15d,0x15d +.value 0x1a2,0x1a2 +.value 0x149,0x149 +.value 0xc65,0xc65 +.value 0xcb6,0xcb6 +.value 0xb7cb,0xb7cb +.value 0x4e84,0x4e84 +.value 0x4499,0x4499 +.value 0x485d,0x485d +.value 0xc7a2,0xc7a2 +.value 0x4c49,0x4c49 +.value 0xeb65,0xeb65 +.value 0xceb6,0xceb6 +.value 0x714,0x714 +.value 0x714,0x714 +.value 0x714,0x714 +.value 0x714,0x714 +.value 0x714,0x714 +.value 0x714,0x714 +.value 0x714,0x714 +.value 0x714,0x714 +.value 0x314,0x314 +.value 0x314,0x314 +.value 0x314,0x314 +.value 0x314,0x314 +.value 0x314,0x314 +.value 0x314,0x314 +.value 0x314,0x314 +.value 0x314,0x314 +.value 0x11f,0x11f +.value 0x11f,0x11f +.value 0x11f,0x11f +.value 0x11f,0x11f +.value 0x11f,0x11f +.value 0x11f,0x11f +.value 0x11f,0x11f +.value 0x11f,0x11f +.value 0x6e1f,0x6e1f +.value 0x6e1f,0x6e1f +.value 0x6e1f,0x6e1f +.value 0x6e1f,0x6e1f +.value 0x6e1f,0x6e1f +.value 0x6e1f,0x6e1f +.value 0x6e1f,0x6e1f +.value 0x6e1f,0x6e1f +.value 0xca,0xca +.value 0xca,0xca +.value 0xca,0xca +.value 0xca,0xca +.value 0xca,0xca +.value 0xca,0xca +.value 0xca,0xca +.value 0xca,0xca +.value 0xbeca,0xbeca +.value 0xbeca,0xbeca +.value 0xbeca,0xbeca +.value 0xbeca,0xbeca +.value 0xbeca,0xbeca +.value 0xbeca,0xbeca +.value 0xbeca,0xbeca +.value 0xbeca,0xbeca +.value 0x3c2,0x3c2 +.value 0x3c2,0x3c2 +.value 0x3c2,0x3c2 +.value 0x3c2,0x3c2 +.value 0x3c2,0x3c2 +.value 0x3c2,0x3c2 +.value 0x3c2,0x3c2 +.value 0x3c2,0x3c2 +.value 0x29c2,0x29c2 +.value 0x29c2,0x29c2 +.value 0x29c2,0x29c2 +.value 0x29c2,0x29c2 +.value 0x29c2,0x29c2 +.value 0x29c2,0x29c2 +.value 0x29c2,0x29c2 +.value 0x29c2,0x29c2 +.value 0x84f,0x84f +.value 0x84f,0x84f +.value 0x84f,0x84f +.value 0x84f,0x84f +.value 0x84f,0x84f +.value 0x84f,0x84f +.value 0x84f,0x84f +.value 0x84f,0x84f +.value 0x54f,0x54f +.value 0x54f,0x54f +.value 0x54f,0x54f +.value 0x54f,0x54f +.value 0x54f,0x54f +.value 0x54f,0x54f +.value 0x54f,0x54f +.value 0x54f,0x54f +.value 0x73f,0x73f +.value 0x73f,0x73f +.value 0x73f,0x73f +.value 0x73f,0x73f +.value 0x73f,0x73f +.value 0x73f,0x73f +.value 0x73f,0x73f +.value 0x73f,0x73f +.value 0xd43f,0xd43f +.value 0xd43f,0xd43f +.value 0xd43f,0xd43f +.value 0xd43f,0xd43f +.value 0xd43f,0xd43f +.value 0xd43f,0xd43f +.value 0xd43f,0xd43f +.value 0xd43f,0xd43f +.value 0x5bc,0x5bc +.value 0x5bc,0x5bc +.value 0x5bc,0x5bc +.value 0x5bc,0x5bc +.value 0x5bc,0x5bc +.value 0x5bc,0x5bc +.value 0x5bc,0x5bc +.value 0x5bc,0x5bc +.value 0x79bc,0x79bc +.value 0x79bc,0x79bc +.value 0x79bc,0x79bc +.value 0x79bc,0x79bc +.value 0x79bc,0x79bc +.value 0x79bc,0x79bc +.value 0x79bc,0x79bc +.value 0x79bc,0x79bc +.value 0xa58,0xa58 +.value 0xa58,0xa58 +.value 0xa58,0xa58 +.value 0xa58,0xa58 +.value 0x3f9,0x3f9 +.value 0x3f9,0x3f9 +.value 0x3f9,0x3f9 +.value 0x3f9,0x3f9 +.value 0x9258,0x9258 +.value 0x9258,0x9258 +.value 0x9258,0x9258 +.value 0x9258,0x9258 +.value 0x5ef9,0x5ef9 +.value 0x5ef9,0x5ef9 +.value 0x5ef9,0x5ef9 +.value 0x5ef9,0x5ef9 +.value 0x2dc,0x2dc +.value 0x2dc,0x2dc +.value 0x2dc,0x2dc +.value 0x2dc,0x2dc +.value 0x260,0x260 +.value 0x260,0x260 +.value 0x260,0x260 +.value 0x260,0x260 +.value 0xd6dc,0xd6dc +.value 0xd6dc,0xd6dc +.value 0xd6dc,0xd6dc +.value 0xd6dc,0xd6dc +.value 0x2260,0x2260 +.value 0x2260,0x2260 +.value 0x2260,0x2260 +.value 0x2260,0x2260 +.value 0x9ac,0x9ac +.value 0x9ac,0x9ac +.value 0xca7,0xca7 +.value 0xca7,0xca7 +.value 0xbf2,0xbf2 +.value 0xbf2,0xbf2 +.value 0x33e,0x33e +.value 0x33e,0x33e +.value 0x4dac,0x4dac +.value 0x4dac,0x4dac +.value 0x91a7,0x91a7 +.value 0x91a7,0x91a7 +.value 0xc1f2,0xc1f2 +.value 0xc1f2,0xc1f2 +.value 0xdd3e,0xdd3e +.value 0xdd3e,0xdd3e +.value 0x6b,0x6b +.value 0x6b,0x6b +.value 0x774,0x774 +.value 0x774,0x774 +.value 0xc0a,0xc0a +.value 0xc0a,0xc0a +.value 0x94a,0x94a +.value 0x94a,0x94a +.value 0x916b,0x916b +.value 0x916b,0x916b +.value 0x2374,0x2374 +.value 0x2374,0x2374 +.value 0x8a0a,0x8a0a +.value 0x8a0a,0x8a0a +.value 0x474a,0x474a +.value 0x474a,0x474a +.value 0x6fb,0x6fb +.value 0x6fb,0x6fb +.value 0x6fb,0x6fb +.value 0x6fb,0x6fb +.value 0x19b,0x19b +.value 0x19b,0x19b +.value 0x19b,0x19b +.value 0x19b,0x19b +.value 0x47fb,0x47fb +.value 0x47fb,0x47fb +.value 0x47fb,0x47fb +.value 0x47fb,0x47fb +.value 0x229b,0x229b +.value 0x229b,0x229b +.value 0x229b,0x229b +.value 0x229b,0x229b +.value 0xc34,0xc34 +.value 0xc34,0xc34 +.value 0xc34,0xc34 +.value 0xc34,0xc34 +.value 0x6de,0x6de +.value 0x6de,0x6de +.value 0x6de,0x6de +.value 0x6de,0x6de +.value 0x6834,0x6834 +.value 0x6834,0x6834 +.value 0x6834,0x6834 +.value 0x6834,0x6834 +.value 0xc0de,0xc0de +.value 0xc0de,0xc0de +.value 0xc0de,0xc0de +.value 0xc0de,0xc0de +.value 0xb73,0xb73 +.value 0xb73,0xb73 +.value 0x3c1,0x3c1 +.value 0x3c1,0x3c1 +.value 0x71d,0x71d +.value 0x71d,0x71d +.value 0xa2c,0xa2c +.value 0xa2c,0xa2c +.value 0x3473,0x3473 +.value 0x3473,0x3473 +.value 0x36c1,0x36c1 +.value 0x36c1,0x36c1 +.value 0x8e1d,0x8e1d +.value 0x8e1d,0x8e1d +.value 0xce2c,0xce2c +.value 0xce2c,0xce2c +.value 0x1c0,0x1c0 +.value 0x1c0,0x1c0 +.value 0x8d8,0x8d8 +.value 0x8d8,0x8d8 +.value 0x2a5,0x2a5 +.value 0x2a5,0x2a5 +.value 0x806,0x806 +.value 0x806,0x806 +.value 0x41c0,0x41c0 +.value 0x41c0,0x41c0 +.value 0x10d8,0x10d8 +.value 0x10d8,0x10d8 +.value 0xa1a5,0xa1a5 +.value 0xa1a5,0xa1a5 +.value 0xba06,0xba06 +.value 0xba06,0xba06 +.value 0x331,0x331 +.value 0x449,0x449 +.value 0x25b,0x25b +.value 0x262,0x262 +.value 0x52a,0x52a +.value 0x7fc,0x7fc +.value 0x748,0x748 +.value 0x180,0x180 +.value 0x8631,0x8631 +.value 0x4f49,0x4f49 +.value 0x635b,0x635b +.value 0x862,0x862 +.value 0xe32a,0xe32a +.value 0x3bfc,0x3bfc +.value 0x5f48,0x5f48 +.value 0x8180,0x8180 +.value 0x842,0x842 +.value 0xc79,0xc79 +.value 0x4c2,0x4c2 +.value 0x7ca,0x7ca +.value 0x997,0x997 +.value 0xdc,0xdc +.value 0x85e,0x85e +.value 0x686,0x686 +.value 0xae42,0xae42 +.value 0xe779,0xe779 +.value 0x2ac2,0x2ac2 +.value 0xc5ca,0xc5ca +.value 0x5e97,0x5e97 +.value 0xd4dc,0xd4dc +.value 0x425e,0x425e +.value 0x3886,0x3886 +.value 0x860,0x860 +.value 0x707,0x707 +.value 0x803,0x803 +.value 0x31a,0x31a +.value 0x71b,0x71b +.value 0x9ab,0x9ab +.value 0x99b,0x99b +.value 0x1de,0x1de +.value 0x2860,0x2860 +.value 0xac07,0xac07 +.value 0xe103,0xe103 +.value 0xb11a,0xb11a +.value 0xa81b,0xa81b +.value 0x5aab,0x5aab +.value 0x2a9b,0x2a9b +.value 0xbbde,0xbbde +.value 0xc95,0xc95 +.value 0xbcd,0xbcd +.value 0x3e4,0x3e4 +.value 0x3df,0x3df +.value 0x3be,0x3be +.value 0x74d,0x74d +.value 0x5f2,0x5f2 +.value 0x65c,0x65c +.value 0x7b95,0x7b95 +.value 0xa2cd,0xa2cd +.value 0x6fe4,0x6fe4 +.value 0xb0df,0xb0df +.value 0x5dbe,0x5dbe +.value 0x1e4d,0x1e4d +.value 0xbbf2,0xbbf2 +.value 0x5a5c,0x5a5c +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_avx2_zetas_basemul: +.value 0x8b2,0x81e +.value 0xf74e,0xf7e2 +.value 0x1ae,0x367 +.value 0xfe52,0xfc99 +.value 0x22b,0x60e +.value 0xfdd5,0xf9f2 +.value 0x34b,0x69 +.value 0xfcb5,0xff97 +.value 0xfeb2,0x821e +.value 0x14e,0x7de2 +.value 0x2bae,0xc867 +.value 0xd452,0x3799 +.value 0xd32b,0x500e +.value 0x2cd5,0xaff2 +.value 0x344b,0xab69 +.value 0xcbb5,0x5497 +.value 0x1a6,0xbde +.value 0xfe5a,0xf422 +.value 0x24b,0xb35 +.value 0xfdb5,0xf4cb +.value 0xb1,0x626 +.value 0xff4f,0xf9da +.value 0xc16,0x675 +.value 0xf3ea,0xf98b +.value 0x93a6,0xc5de +.value 0x6c5a,0x3a22 +.value 0x334b,0x5a35 +.value 0xccb5,0xa5cb +.value 0x3b1,0x1826 +.value 0xfc4f,0xe7da +.value 0xee16,0x1575 +.value 0x11ea,0xea8b +.value 0xc0b,0x9f8 +.value 0xf3f5,0xf608 +.value 0x30a,0x5cb +.value 0xfcf6,0xfa35 +.value 0x487,0xaa7 +.value 0xfb79,0xf559 +.value 0xc6e,0x45f +.value 0xf392,0xfba1 +.value 0x7d0b,0x71f8 +.value 0x82f5,0x8e08 +.value 0x810a,0xb6cb +.value 0x7ef6,0x4935 +.value 0x2987,0x8fa7 +.value 0xd679,0x7059 +.value 0x766e,0x315f +.value 0x8992,0xcea1 +.value 0x6cb,0x1a2 +.value 0xf935,0xfe5e +.value 0x284,0x149 +.value 0xfd7c,0xfeb7 +.value 0x999,0xc65 +.value 0xf667,0xf39b +.value 0x15d,0xcb6 +.value 0xfea3,0xf34a +.value 0xb7cb,0xc7a2 +.value 0x4835,0x385e +.value 0x4e84,0x4c49 +.value 0xb17c,0xb3b7 +.value 0x4499,0xeb65 +.value 0xbb67,0x149b +.value 0x485d,0xceb6 +.value 0xb7a3,0x314a +.value 0x331,0x52a +.value 0xfccf,0xfad6 +.value 0x449,0x7fc +.value 0xfbb7,0xf804 +.value 0x25b,0x748 +.value 0xfda5,0xf8b8 +.value 0x262,0x180 +.value 0xfd9e,0xfe80 +.value 0x8631,0xe32a +.value 0x79cf,0x1cd6 +.value 0x4f49,0x3bfc +.value 0xb0b7,0xc404 +.value 0x635b,0x5f48 +.value 0x9ca5,0xa0b8 +.value 0x862,0x8180 +.value 0xf79e,0x7e80 +.value 0x842,0x997 +.value 0xf7be,0xf669 +.value 0xc79,0xdc +.value 0xf387,0xff24 +.value 0x4c2,0x85e +.value 0xfb3e,0xf7a2 +.value 0x7ca,0x686 +.value 0xf836,0xf97a +.value 0xae42,0x5e97 +.value 0x51be,0xa169 +.value 0xe779,0xd4dc +.value 0x1887,0x2b24 +.value 0x2ac2,0x425e +.value 0xd53e,0xbda2 +.value 0xc5ca,0x3886 +.value 0x3a36,0xc77a +.value 0x860,0x71b +.value 0xf7a0,0xf8e5 +.value 0x707,0x9ab +.value 0xf8f9,0xf655 +.value 0x803,0x99b +.value 0xf7fd,0xf665 +.value 0x31a,0x1de +.value 0xfce6,0xfe22 +.value 0x2860,0xa81b +.value 0xd7a0,0x57e5 +.value 0xac07,0x5aab +.value 0x53f9,0xa555 +.value 0xe103,0x2a9b +.value 0x1efd,0xd565 +.value 0xb11a,0xbbde +.value 0x4ee6,0x4422 +.value 0xc95,0x3be +.value 0xf36b,0xfc42 +.value 0xbcd,0x74d +.value 0xf433,0xf8b3 +.value 0x3e4,0x5f2 +.value 0xfc1c,0xfa0e +.value 0x3df,0x65c +.value 0xfc21,0xf9a4 +.value 0x7b95,0x5dbe +.value 0x846b,0xa242 +.value 0xa2cd,0x1e4d +.value 0x5d33,0xe1b3 +.value 0x6fe4,0xbbf2 +.value 0x901c,0x440e +.value 0xb0df,0x5a5c +.value 0x4f21,0xa5a4 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_avx2_zetas_inv: +.value 0x6a5,0x6a5 +.value 0x5b4,0x5b4 +.value 0x70f,0x70f +.value 0x943,0x943 +.value 0x922,0x922 +.value 0x134,0x134 +.value 0x91d,0x91d +.value 0x6c,0x6c +.value 0xa5a5,0xa5a5 +.value 0xe1b4,0xe1b4 +.value 0x440f,0x440f +.value 0xa243,0xa243 +.value 0x4f22,0x4f22 +.value 0x5d34,0x5d34 +.value 0x901d,0x901d +.value 0x846c,0x846c +.value 0xb23,0xb23 +.value 0x356,0x356 +.value 0x366,0x366 +.value 0x5e6,0x5e6 +.value 0x9e7,0x9e7 +.value 0x5fa,0x5fa +.value 0x4fe,0x4fe +.value 0x4a1,0x4a1 +.value 0x4423,0x4423 +.value 0xa556,0xa556 +.value 0xd566,0xd566 +.value 0x57e6,0x57e6 +.value 0x4ee7,0x4ee7 +.value 0x53fa,0x53fa +.value 0x1efe,0x1efe +.value 0xd7a1,0xd7a1 +.value 0x4fb,0x4fb +.value 0x4fb,0x4fb +.value 0xa5c,0xa5c +.value 0xa5c,0xa5c +.value 0x429,0x429 +.value 0x429,0x429 +.value 0xb41,0xb41 +.value 0xb41,0xb41 +.value 0x45fb,0x45fb +.value 0x45fb,0x45fb +.value 0x5e5c,0x5e5c +.value 0x5e5c,0x5e5c +.value 0xef29,0xef29 +.value 0xef29,0xef29 +.value 0xbe41,0xbe41 +.value 0xbe41,0xbe41 +.value 0x2d5,0x2d5 +.value 0x2d5,0x2d5 +.value 0x5e4,0x5e4 +.value 0x5e4,0x5e4 +.value 0x940,0x940 +.value 0x940,0x940 +.value 0x18e,0x18e +.value 0x18e,0x18e +.value 0x31d5,0x31d5 +.value 0x31d5,0x31d5 +.value 0x71e4,0x71e4 +.value 0x71e4,0x71e4 +.value 0xc940,0xc940 +.value 0xc940,0xc940 +.value 0xcb8e,0xcb8e +.value 0xcb8e,0xcb8e +.value 0x623,0x623 +.value 0x623,0x623 +.value 0x623,0x623 +.value 0x623,0x623 +.value 0xcd,0xcd +.value 0xcd,0xcd +.value 0xcd,0xcd +.value 0xcd,0xcd +.value 0x3f23,0x3f23 +.value 0x3f23,0x3f23 +.value 0x3f23,0x3f23 +.value 0x3f23,0x3f23 +.value 0x97cd,0x97cd +.value 0x97cd,0x97cd +.value 0x97cd,0x97cd +.value 0x97cd,0x97cd +.value 0xb66,0xb66 +.value 0xb66,0xb66 +.value 0xb66,0xb66 +.value 0xb66,0xb66 +.value 0x606,0x606 +.value 0x606,0x606 +.value 0x606,0x606 +.value 0x606,0x606 +.value 0xdd66,0xdd66 +.value 0xdd66,0xdd66 +.value 0xdd66,0xdd66 +.value 0xdd66,0xdd66 +.value 0xb806,0xb806 +.value 0xb806,0xb806 +.value 0xb806,0xb806 +.value 0xb806,0xb806 +.value 0x745,0x745 +.value 0x745,0x745 +.value 0x745,0x745 +.value 0x745,0x745 +.value 0x745,0x745 +.value 0x745,0x745 +.value 0x745,0x745 +.value 0x745,0x745 +.value 0x8645,0x8645 +.value 0x8645,0x8645 +.value 0x8645,0x8645 +.value 0x8645,0x8645 +.value 0x8645,0x8645 +.value 0x8645,0x8645 +.value 0x8645,0x8645 +.value 0x8645,0x8645 +.value 0x5c2,0x5c2 +.value 0x5c2,0x5c2 +.value 0x5c2,0x5c2 +.value 0x5c2,0x5c2 +.value 0x5c2,0x5c2 +.value 0x5c2,0x5c2 +.value 0x5c2,0x5c2 +.value 0x5c2,0x5c2 +.value 0x2bc2,0x2bc2 +.value 0x2bc2,0x2bc2 +.value 0x2bc2,0x2bc2 +.value 0x2bc2,0x2bc2 +.value 0x2bc2,0x2bc2 +.value 0x2bc2,0x2bc2 +.value 0x2bc2,0x2bc2 +.value 0x2bc2,0x2bc2 +.value 0xc37,0xc37 +.value 0xc37,0xc37 +.value 0xc37,0xc37 +.value 0xc37,0xc37 +.value 0xc37,0xc37 +.value 0xc37,0xc37 +.value 0xc37,0xc37 +.value 0xc37,0xc37 +.value 0x4137,0x4137 +.value 0x4137,0x4137 +.value 0x4137,0x4137 +.value 0x4137,0x4137 +.value 0x4137,0x4137 +.value 0x4137,0x4137 +.value 0x4137,0x4137 +.value 0x4137,0x4137 +.value 0x67b,0x67b +.value 0xc25,0xc25 +.value 0x4a3,0x4a3 +.value 0x36a,0x36a +.value 0x537,0x537 +.value 0x88,0x88 +.value 0x83f,0x83f +.value 0x4bf,0x4bf +.value 0xc77b,0xc77b +.value 0x2b25,0x2b25 +.value 0xbda3,0xbda3 +.value 0xa16a,0xa16a +.value 0x3a37,0x3a37 +.value 0x1888,0x1888 +.value 0xd53f,0xd53f +.value 0x51bf,0x51bf +.value 0xb81,0xb81 +.value 0x505,0x505 +.value 0x5b9,0x5b9 +.value 0x7d7,0x7d7 +.value 0xa9f,0xa9f +.value 0x8b8,0x8b8 +.value 0xaa6,0xaa6 +.value 0x9d0,0x9d0 +.value 0x7e81,0x7e81 +.value 0xc405,0xc405 +.value 0xa0b9,0xa0b9 +.value 0x1cd7,0x1cd7 +.value 0xf79f,0xf79f +.value 0xb0b8,0xb0b8 +.value 0x9ca6,0x9ca6 +.value 0x79d0,0x79d0 +.value 0x3b7,0x3b7 +.value 0x3b7,0x3b7 +.value 0xf7,0xf7 +.value 0xf7,0xf7 +.value 0x58d,0x58d +.value 0x58d,0x58d +.value 0xc96,0xc96 +.value 0xc96,0xc96 +.value 0xb8b7,0xb8b7 +.value 0xb8b7,0xb8b7 +.value 0x75f7,0x75f7 +.value 0x75f7,0x75f7 +.value 0xdc8d,0xdc8d +.value 0xdc8d,0xdc8d +.value 0x6e96,0x6e96 +.value 0x6e96,0x6e96 +.value 0x9c3,0x9c3 +.value 0x9c3,0x9c3 +.value 0x10f,0x10f +.value 0x10f,0x10f +.value 0x5a,0x5a +.value 0x5a,0x5a +.value 0x355,0x355 +.value 0x355,0x355 +.value 0x22c3,0x22c3 +.value 0x22c3,0x22c3 +.value 0x3e0f,0x3e0f +.value 0x3e0f,0x3e0f +.value 0x6e5a,0x6e5a +.value 0x6e5a,0x6e5a +.value 0xb255,0xb255 +.value 0xb255,0xb255 +.value 0xaa1,0xaa1 +.value 0xaa1,0xaa1 +.value 0xaa1,0xaa1 +.value 0xaa1,0xaa1 +.value 0xa25,0xa25 +.value 0xa25,0xa25 +.value 0xa25,0xa25 +.value 0xa25,0xa25 +.value 0xdda1,0xdda1 +.value 0xdda1,0xdda1 +.value 0xdda1,0xdda1 +.value 0xdda1,0xdda1 +.value 0x2925,0x2925 +.value 0x2925,0x2925 +.value 0x2925,0x2925 +.value 0x2925,0x2925 +.value 0x908,0x908 +.value 0x908,0x908 +.value 0x908,0x908 +.value 0x908,0x908 +.value 0x2a9,0x2a9 +.value 0x2a9,0x2a9 +.value 0x2a9,0x2a9 +.value 0x2a9,0x2a9 +.value 0xa108,0xa108 +.value 0xa108,0xa108 +.value 0xa108,0xa108 +.value 0xa108,0xa108 +.value 0x6da9,0x6da9 +.value 0x6da9,0x6da9 +.value 0x6da9,0x6da9 +.value 0x6da9,0x6da9 +.value 0x4b2,0x4b2 +.value 0x4b2,0x4b2 +.value 0x4b2,0x4b2 +.value 0x4b2,0x4b2 +.value 0x4b2,0x4b2 +.value 0x4b2,0x4b2 +.value 0x4b2,0x4b2 +.value 0x4b2,0x4b2 +.value 0xfab2,0xfab2 +.value 0xfab2,0xfab2 +.value 0xfab2,0xfab2 +.value 0xfab2,0xfab2 +.value 0xfab2,0xfab2 +.value 0xfab2,0xfab2 +.value 0xfab2,0xfab2 +.value 0xfab2,0xfab2 +.value 0x93f,0x93f +.value 0x93f,0x93f +.value 0x93f,0x93f +.value 0x93f,0x93f +.value 0x93f,0x93f +.value 0x93f,0x93f +.value 0x93f,0x93f +.value 0x93f,0x93f +.value 0xd63f,0xd63f +.value 0xd63f,0xd63f +.value 0xd63f,0xd63f +.value 0xd63f,0xd63f +.value 0xd63f,0xd63f +.value 0xd63f,0xd63f +.value 0xd63f,0xd63f +.value 0xd63f,0xd63f +.value 0xbe2,0xbe2 +.value 0xbe2,0xbe2 +.value 0xbe2,0xbe2 +.value 0xbe2,0xbe2 +.value 0xbe2,0xbe2 +.value 0xbe2,0xbe2 +.value 0xbe2,0xbe2 +.value 0xbe2,0xbe2 +.value 0x91e2,0x91e2 +.value 0x91e2,0x91e2 +.value 0x91e2,0x91e2 +.value 0x91e2,0x91e2 +.value 0x91e2,0x91e2 +.value 0x91e2,0x91e2 +.value 0x91e2,0x91e2 +.value 0x91e2,0x91e2 +.value 0x5ed,0x5ed +.value 0x5ed,0x5ed +.value 0x5ed,0x5ed +.value 0x5ed,0x5ed +.value 0x5ed,0x5ed +.value 0x5ed,0x5ed +.value 0x5ed,0x5ed +.value 0x5ed,0x5ed +.value 0xfced,0xfced +.value 0xfced,0xfced +.value 0xfced,0xfced +.value 0xfced,0xfced +.value 0xfced,0xfced +.value 0xfced,0xfced +.value 0xfced,0xfced +.value 0xfced,0xfced +.value 0x4b,0x4b +.value 0xbb8,0xbb8 +.value 0x9c,0x9c +.value 0xb5f,0xb5f +.value 0xba4,0xba4 +.value 0xa7d,0xa7d +.value 0x368,0x368 +.value 0x636,0x636 +.value 0x314b,0x314b +.value 0xb3b8,0xb3b8 +.value 0x149c,0x149c +.value 0x385f,0x385f +.value 0xb7a4,0xb7a4 +.value 0xb17d,0xb17d +.value 0xbb68,0xbb68 +.value 0x4836,0x4836 +.value 0x8a2,0x8a2 +.value 0x736,0x736 +.value 0x25a,0x25a +.value 0x309,0x309 +.value 0x93,0x93 +.value 0x9f7,0x9f7 +.value 0x87a,0x87a +.value 0xf6,0xf6 +.value 0xcea2,0xcea2 +.value 0x4936,0x4936 +.value 0x705a,0x705a +.value 0x8e09,0x8e09 +.value 0x8993,0x8993 +.value 0x7ef7,0x7ef7 +.value 0xd67a,0xd67a +.value 0x82f6,0x82f6 +.value 0x744,0x744 +.value 0x744,0x744 +.value 0xc83,0xc83 +.value 0xc83,0xc83 +.value 0x48a,0x48a +.value 0x48a,0x48a +.value 0x652,0x652 +.value 0x652,0x652 +.value 0x9344,0x9344 +.value 0x9344,0x9344 +.value 0x6583,0x6583 +.value 0x6583,0x6583 +.value 0x28a,0x28a +.value 0x28a,0x28a +.value 0xdc52,0xdc52 +.value 0xdc52,0xdc52 +.value 0x29a,0x29a +.value 0x29a,0x29a +.value 0x140,0x140 +.value 0x140,0x140 +.value 0x8,0x8 +.value 0x8,0x8 +.value 0xafd,0xafd +.value 0xafd,0xafd +.value 0x309a,0x309a +.value 0x309a,0x309a +.value 0xc140,0xc140 +.value 0xc140,0xc140 +.value 0x9808,0x9808 +.value 0x9808,0x9808 +.value 0x31fd,0x31fd +.value 0x31fd,0x31fd +.value 0x82,0x82 +.value 0x82,0x82 +.value 0x82,0x82 +.value 0x82,0x82 +.value 0x642,0x642 +.value 0x642,0x642 +.value 0x642,0x642 +.value 0x642,0x642 +.value 0x6682,0x6682 +.value 0x6682,0x6682 +.value 0x6682,0x6682 +.value 0x6682,0x6682 +.value 0xac42,0xac42 +.value 0xac42,0xac42 +.value 0xac42,0xac42 +.value 0xac42,0xac42 +.value 0x74f,0x74f +.value 0x74f,0x74f +.value 0x74f,0x74f +.value 0x74f,0x74f +.value 0x33d,0x33d +.value 0x33d,0x33d +.value 0x33d,0x33d +.value 0x33d,0x33d +.value 0x44f,0x44f +.value 0x44f,0x44f +.value 0x44f,0x44f +.value 0x44f,0x44f +.value 0xea3d,0xea3d +.value 0xea3d,0xea3d +.value 0xea3d,0xea3d +.value 0xea3d,0xea3d +.value 0xc4b,0xc4b +.value 0xc4b,0xc4b +.value 0xc4b,0xc4b +.value 0xc4b,0xc4b +.value 0xc4b,0xc4b +.value 0xc4b,0xc4b +.value 0xc4b,0xc4b +.value 0xc4b,0xc4b +.value 0x3d4b,0x3d4b +.value 0x3d4b,0x3d4b +.value 0x3d4b,0x3d4b +.value 0x3d4b,0x3d4b +.value 0x3d4b,0x3d4b +.value 0x3d4b,0x3d4b +.value 0x3d4b,0x3d4b +.value 0x3d4b,0x3d4b +.value 0x6d8,0x6d8 +.value 0x6d8,0x6d8 +.value 0x6d8,0x6d8 +.value 0x6d8,0x6d8 +.value 0x6d8,0x6d8 +.value 0x6d8,0x6d8 +.value 0x6d8,0x6d8 +.value 0x6d8,0x6d8 +.value 0xed8,0xed8 +.value 0xed8,0xed8 +.value 0xed8,0xed8 +.value 0xed8,0xed8 +.value 0xed8,0xed8 +.value 0xed8,0xed8 +.value 0xed8,0xed8 +.value 0xed8,0xed8 +.value 0x773,0x773 +.value 0x773,0x773 +.value 0x773,0x773 +.value 0x773,0x773 +.value 0x773,0x773 +.value 0x773,0x773 +.value 0x773,0x773 +.value 0x773,0x773 +.value 0x3073,0x3073 +.value 0x3073,0x3073 +.value 0x3073,0x3073 +.value 0x3073,0x3073 +.value 0x3073,0x3073 +.value 0x3073,0x3073 +.value 0x3073,0x3073 +.value 0x3073,0x3073 +.value 0x68c,0x68c +.value 0x1cc,0x1cc +.value 0x6db,0x6db +.value 0x123,0x123 +.value 0xeb,0xeb +.value 0xab6,0xab6 +.value 0xc50,0xc50 +.value 0xb5b,0xb5b +.value 0xea8c,0xea8c +.value 0xa5cc,0xa5cc +.value 0xe7db,0xe7db +.value 0x3a23,0x3a23 +.value 0x11eb,0x11eb +.value 0xccb6,0xccb6 +.value 0xfc50,0xfc50 +.value 0x6c5b,0x6c5b +.value 0xc98,0xc98 +.value 0x99a,0x99a +.value 0x6f3,0x6f3 +.value 0x4e3,0x4e3 +.value 0x9b6,0x9b6 +.value 0xb53,0xb53 +.value 0xad6,0xad6 +.value 0x44f,0x44f +.value 0x5498,0x5498 +.value 0x379a,0x379a +.value 0xaff3,0xaff3 +.value 0x7de3,0x7de3 +.value 0xcbb6,0xcbb6 +.value 0xd453,0xd453 +.value 0x2cd6,0x2cd6 +.value 0x14f,0x14f +.value 0x608,0x608 +.value 0x608,0x608 +.value 0x11a,0x11a +.value 0x11a,0x11a +.value 0x72e,0x72e +.value 0x72e,0x72e +.value 0x50d,0x50d +.value 0x50d,0x50d +.value 0x9e08,0x9e08 +.value 0x9e08,0x9e08 +.value 0xaf1a,0xaf1a +.value 0xaf1a,0xaf1a +.value 0xb12e,0xb12e +.value 0xb12e,0xb12e +.value 0x5c0d,0x5c0d +.value 0x5c0d,0x5c0d +.value 0x90a,0x90a +.value 0x90a,0x90a +.value 0x228,0x228 +.value 0x228,0x228 +.value 0xa75,0xa75 +.value 0xa75,0xa75 +.value 0x83a,0x83a +.value 0x83a,0x83a +.value 0x870a,0x870a +.value 0x870a,0x870a +.value 0xfa28,0xfa28 +.value 0xfa28,0xfa28 +.value 0x1975,0x1975 +.value 0x1975,0x1975 +.value 0x163a,0x163a +.value 0x163a,0x163a +.value 0xb82,0xb82 +.value 0xb82,0xb82 +.value 0xb82,0xb82 +.value 0xb82,0xb82 +.value 0xbf9,0xbf9 +.value 0xbf9,0xbf9 +.value 0xbf9,0xbf9 +.value 0xbf9,0xbf9 +.value 0x7182,0x7182 +.value 0x7182,0x7182 +.value 0x7182,0x7182 +.value 0x7182,0x7182 +.value 0x66f9,0x66f9 +.value 0x66f9,0x66f9 +.value 0x66f9,0x66f9 +.value 0x66f9,0x66f9 +.value 0x52d,0x52d +.value 0x52d,0x52d +.value 0x52d,0x52d +.value 0x52d,0x52d +.value 0xac4,0xac4 +.value 0xac4,0xac4 +.value 0xac4,0xac4 +.value 0xac4,0xac4 +.value 0xbc2d,0xbc2d +.value 0xbc2d,0xbc2d +.value 0xbc2d,0xbc2d +.value 0xbc2d,0xbc2d +.value 0x16c4,0x16c4 +.value 0x16c4,0x16c4 +.value 0x16c4,0x16c4 +.value 0x16c4,0x16c4 +.value 0xa93,0xa93 +.value 0xa93,0xa93 +.value 0xa93,0xa93 +.value 0xa93,0xa93 +.value 0xa93,0xa93 +.value 0xa93,0xa93 +.value 0xa93,0xa93 +.value 0xa93,0xa93 +.value 0x9393,0x9393 +.value 0x9393,0x9393 +.value 0x9393,0x9393 +.value 0x9393,0x9393 +.value 0x9393,0x9393 +.value 0x9393,0x9393 +.value 0x9393,0x9393 +.value 0x9393,0x9393 +.value 0xab,0xab +.value 0xab,0xab +.value 0xab,0xab +.value 0xab,0xab +.value 0xab,0xab +.value 0xab,0xab +.value 0xab,0xab +.value 0xab,0xab +.value 0x51ab,0x51ab +.value 0x51ab,0x51ab +.value 0x51ab,0x51ab +.value 0x51ab,0x51ab +.value 0x51ab,0x51ab +.value 0x51ab,0x51ab +.value 0x51ab,0x51ab +.value 0x51ab,0x51ab +.value 0x72c,0x72c +.value 0x72c,0x72c +.value 0x72c,0x72c +.value 0x72c,0x72c +.value 0x72c,0x72c +.value 0x72c,0x72c +.value 0x72c,0x72c +.value 0x72c,0x72c +.value 0xcb2c,0xcb2c +.value 0xcb2c,0xcb2c +.value 0xcb2c,0xcb2c +.value 0xcb2c,0xcb2c +.value 0xcb2c,0xcb2c +.value 0xcb2c,0xcb2c +.value 0xcb2c,0xcb2c +.value 0xcb2c,0xcb2c +.value 0x167,0x167 +.value 0x167,0x167 +.value 0x167,0x167 +.value 0x167,0x167 +.value 0x167,0x167 +.value 0x167,0x167 +.value 0x167,0x167 +.value 0x167,0x167 +.value 0xc667,0xc667 +.value 0xc667,0xc667 +.value 0xc667,0xc667 +.value 0xc667,0xc667 +.value 0xc667,0xc667 +.value 0xc667,0xc667 +.value 0xc667,0xc667 +.value 0xc667,0xc667 +.value 0x2f6,0x2f6 +.value 0x2f6,0x2f6 +.value 0x2f6,0x2f6 +.value 0x2f6,0x2f6 +.value 0x2f6,0x2f6 +.value 0x2f6,0x2f6 +.value 0x2f6,0x2f6 +.value 0x2f6,0x2f6 +.value 0x84f6,0x84f6 +.value 0x84f6,0x84f6 +.value 0x84f6,0x84f6 +.value 0x84f6,0x84f6 +.value 0x84f6,0x84f6 +.value 0x84f6,0x84f6 +.value 0x84f6,0x84f6 +.value 0x84f6,0x84f6 +.value 0x5a1,0x5a1 +.value 0x5a1,0x5a1 +.value 0x5a1,0x5a1 +.value 0x5a1,0x5a1 +.value 0x5a1,0x5a1 +.value 0x5a1,0x5a1 +.value 0x5a1,0x5a1 +.value 0x5a1,0x5a1 +.value 0xd8a1,0xd8a1 +.value 0xd8a1,0xd8a1 +.value 0xd8a1,0xd8a1 +.value 0xd8a1,0xd8a1 +.value 0xd8a1,0xd8a1 +.value 0xd8a1,0xd8a1 +.value 0xd8a1,0xd8a1 +.value 0xd8a1,0xd8a1 +#ifndef __APPLE__ +.text +.globl kyber_keygen_avx2 +.type kyber_keygen_avx2,@function +.align 16 +kyber_keygen_avx2: +#else +.section __TEXT,__text +.globl _kyber_keygen_avx2 +.p2align 4 +_kyber_keygen_avx2: +#endif /* __APPLE__ */ + vmovdqu kyber_q(%rip), %ymm14 + vmovdqu kyber_v(%rip), %ymm15 + movq %r8, %r9 + movq %rdi, %r10 +L_kyber_keygen_avx2_priv: + # ntt + leaq L_kyber_avx2_zetas(%rip), %r11 + vmovdqu (%r11), %ymm10 + vmovdqu 32(%r11), %ymm12 + vmovdqu 128(%r10), %ymm0 + vmovdqu 160(%r10), %ymm1 + vmovdqu 192(%r10), %ymm2 + vmovdqu 224(%r10), %ymm3 + vmovdqu 384(%r10), %ymm4 + vmovdqu 416(%r10), %ymm5 + vmovdqu 448(%r10), %ymm6 + vmovdqu 480(%r10), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%r10) + vmovdqu %ymm1, 160(%r10) + vmovdqu %ymm2, 192(%r10) + vmovdqu %ymm3, 224(%r10) + vmovdqu %ymm4, 384(%r10) + vmovdqu %ymm5, 416(%r10) + vmovdqu %ymm6, 448(%r10) + vmovdqu %ymm7, 480(%r10) + vmovdqu (%r10), %ymm0 + vmovdqu 32(%r10), %ymm1 + vmovdqu 64(%r10), %ymm2 + vmovdqu 96(%r10), %ymm3 + vmovdqu 256(%r10), %ymm4 + vmovdqu 288(%r10), %ymm5 + vmovdqu 320(%r10), %ymm6 + vmovdqu 352(%r10), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm4, 256(%r10) + vmovdqu %ymm5, 288(%r10) + vmovdqu %ymm6, 320(%r10) + vmovdqu %ymm7, 352(%r10) + vmovdqu 128(%r10), %ymm4 + vmovdqu 160(%r10), %ymm5 + vmovdqu 192(%r10), %ymm6 + vmovdqu 224(%r10), %ymm7 + # 64: 0/3 + vmovdqu 64(%r11), %ymm10 + vmovdqu 96(%r11), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 0/3 + vmovdqu 128(%r11), %ymm10 + vmovdqu 160(%r11), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 0/3 + vmovdqu 192(%r11), %ymm10 + vmovdqu 224(%r11), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 0/3 + vmovdqu 256(%r11), %ymm10 + vmovdqu 288(%r11), %ymm12 + vmovdqu 320(%r11), %ymm11 + vmovdqu 352(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 0/3 + vmovdqu 384(%r11), %ymm10 + vmovdqu 416(%r11), %ymm12 + vmovdqu 448(%r11), %ymm11 + vmovdqu 480(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 0/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 512(%r11), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 544(%r11), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 576(%r11), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 608(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 640(%r11), %ymm10 + vmovdqu 672(%r11), %ymm12 + vmovdqu 704(%r11), %ymm11 + vmovdqu 736(%r11), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 0/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 768(%r11), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 800(%r11), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 832(%r11), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 864(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 896(%r11), %ymm10 + vmovdqu 928(%r11), %ymm12 + vmovdqu 960(%r11), %ymm11 + vmovdqu 992(%r11), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 0/3 + vmovdqu 1024(%r11), %ymm10 + vmovdqu 1056(%r11), %ymm12 + vmovdqu 1088(%r11), %ymm11 + vmovdqu 1120(%r11), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 0/3 + vmovdqu 1152(%r11), %ymm10 + vmovdqu 1184(%r11), %ymm12 + vmovdqu 1216(%r11), %ymm11 + vmovdqu 1248(%r11), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vpmulhw %ymm15, %ymm0, %ymm8 + vpmulhw %ymm15, %ymm1, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm8 + vpsubw %ymm9, %ymm1, %ymm9 + vmovdqu %ymm8, (%r10) + vmovdqu %ymm9, 32(%r10) + vpmulhw %ymm15, %ymm2, %ymm8 + vpmulhw %ymm15, %ymm3, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vmovdqu %ymm8, 64(%r10) + vmovdqu %ymm9, 96(%r10) + vpmulhw %ymm15, %ymm4, %ymm8 + vpmulhw %ymm15, %ymm5, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vmovdqu %ymm8, 128(%r10) + vmovdqu %ymm9, 160(%r10) + vpmulhw %ymm15, %ymm6, %ymm8 + vpmulhw %ymm15, %ymm7, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vmovdqu %ymm8, 192(%r10) + vmovdqu %ymm9, 224(%r10) + vmovdqu 256(%r10), %ymm0 + vmovdqu 288(%r10), %ymm1 + vmovdqu 320(%r10), %ymm2 + vmovdqu 352(%r10), %ymm3 + vmovdqu 384(%r10), %ymm4 + vmovdqu 416(%r10), %ymm5 + vmovdqu 448(%r10), %ymm6 + vmovdqu 480(%r10), %ymm7 + # 64: 1/3 + vmovdqu 1280(%r11), %ymm10 + vmovdqu 1312(%r11), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 1/3 + vmovdqu 1344(%r11), %ymm10 + vmovdqu 1376(%r11), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 1/3 + vmovdqu 1408(%r11), %ymm10 + vmovdqu 1440(%r11), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 1/3 + vmovdqu 1472(%r11), %ymm10 + vmovdqu 1504(%r11), %ymm12 + vmovdqu 1536(%r11), %ymm11 + vmovdqu 1568(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 1/3 + vmovdqu 1600(%r11), %ymm10 + vmovdqu 1632(%r11), %ymm12 + vmovdqu 1664(%r11), %ymm11 + vmovdqu 1696(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 1/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 1728(%r11), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 1760(%r11), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 1792(%r11), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 1824(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 1856(%r11), %ymm10 + vmovdqu 1888(%r11), %ymm12 + vmovdqu 1920(%r11), %ymm11 + vmovdqu 1952(%r11), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 1/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 1984(%r11), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 2016(%r11), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 2048(%r11), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 2080(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 2112(%r11), %ymm10 + vmovdqu 2144(%r11), %ymm12 + vmovdqu 2176(%r11), %ymm11 + vmovdqu 2208(%r11), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 1/3 + vmovdqu 2240(%r11), %ymm10 + vmovdqu 2272(%r11), %ymm12 + vmovdqu 2304(%r11), %ymm11 + vmovdqu 2336(%r11), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 1/3 + vmovdqu 2368(%r11), %ymm10 + vmovdqu 2400(%r11), %ymm12 + vmovdqu 2432(%r11), %ymm11 + vmovdqu 2464(%r11), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vpmulhw %ymm15, %ymm0, %ymm8 + vpmulhw %ymm15, %ymm1, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm8 + vpsubw %ymm9, %ymm1, %ymm9 + vmovdqu %ymm8, 256(%r10) + vmovdqu %ymm9, 288(%r10) + vpmulhw %ymm15, %ymm2, %ymm8 + vpmulhw %ymm15, %ymm3, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vmovdqu %ymm8, 320(%r10) + vmovdqu %ymm9, 352(%r10) + vpmulhw %ymm15, %ymm4, %ymm8 + vpmulhw %ymm15, %ymm5, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vmovdqu %ymm8, 384(%r10) + vmovdqu %ymm9, 416(%r10) + vpmulhw %ymm15, %ymm6, %ymm8 + vpmulhw %ymm15, %ymm7, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vmovdqu %ymm8, 448(%r10) + vmovdqu %ymm9, 480(%r10) + addq $0x200, %r10 + subq $0x01, %r9 + jg L_kyber_keygen_avx2_priv + vmovdqu kyber_qinv(%rip), %ymm13 + movq %r8, %rax + movq %rsi, %r10 +L_kyber_keygen_avx2_acc: + # Pointwise acc mont + movq %r8, %r9 + # Base mul mont + leaq L_kyber_avx2_zetas_basemul(%rip), %r11 + vmovdqu (%rcx), %ymm2 + vmovdqu 32(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%rdi), %ymm4 + vmovdqu 32(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r11), %ymm10 + vmovdqu 32(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, (%r10) + vmovdqu %ymm1, 32(%r10) + vmovdqu 64(%rcx), %ymm2 + vmovdqu 96(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%rdi), %ymm4 + vmovdqu 96(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r11), %ymm10 + vmovdqu 96(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%r10) + vmovdqu %ymm1, 96(%r10) + vmovdqu 128(%rcx), %ymm2 + vmovdqu 160(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r11), %ymm10 + vmovdqu 160(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%r10) + vmovdqu %ymm1, 160(%r10) + vmovdqu 192(%rcx), %ymm2 + vmovdqu 224(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%rdi), %ymm4 + vmovdqu 224(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r11), %ymm10 + vmovdqu 224(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%r10) + vmovdqu %ymm1, 224(%r10) + vmovdqu 256(%rcx), %ymm2 + vmovdqu 288(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%rdi), %ymm4 + vmovdqu 288(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r11), %ymm10 + vmovdqu 288(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%r10) + vmovdqu %ymm1, 288(%r10) + vmovdqu 320(%rcx), %ymm2 + vmovdqu 352(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%rdi), %ymm4 + vmovdqu 352(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r11), %ymm10 + vmovdqu 352(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%r10) + vmovdqu %ymm1, 352(%r10) + vmovdqu 384(%rcx), %ymm2 + vmovdqu 416(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%rdi), %ymm4 + vmovdqu 416(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r11), %ymm10 + vmovdqu 416(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%r10) + vmovdqu %ymm1, 416(%r10) + vmovdqu 448(%rcx), %ymm2 + vmovdqu 480(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%rdi), %ymm4 + vmovdqu 480(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r11), %ymm10 + vmovdqu 480(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%r10) + vmovdqu %ymm1, 480(%r10) + addq $0x200, %rcx + addq $0x200, %rdi + subq $2, %r9 + jz L_pointwise_acc_mont_end_keygen +L_pointwise_acc_mont_start_keygen: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r11 + vmovdqu (%rcx), %ymm2 + vmovdqu 32(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%rdi), %ymm4 + vmovdqu 32(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r11), %ymm10 + vmovdqu 32(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%r10), %ymm6 + vmovdqu 32(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%r10) + vmovdqu %ymm1, 32(%r10) + vmovdqu 64(%rcx), %ymm2 + vmovdqu 96(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%rdi), %ymm4 + vmovdqu 96(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r11), %ymm10 + vmovdqu 96(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%r10), %ymm6 + vmovdqu 96(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%r10) + vmovdqu %ymm1, 96(%r10) + vmovdqu 128(%rcx), %ymm2 + vmovdqu 160(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r11), %ymm10 + vmovdqu 160(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%r10), %ymm6 + vmovdqu 160(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%r10) + vmovdqu %ymm1, 160(%r10) + vmovdqu 192(%rcx), %ymm2 + vmovdqu 224(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%rdi), %ymm4 + vmovdqu 224(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r11), %ymm10 + vmovdqu 224(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%r10), %ymm6 + vmovdqu 224(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%r10) + vmovdqu %ymm1, 224(%r10) + vmovdqu 256(%rcx), %ymm2 + vmovdqu 288(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%rdi), %ymm4 + vmovdqu 288(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r11), %ymm10 + vmovdqu 288(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%r10), %ymm6 + vmovdqu 288(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%r10) + vmovdqu %ymm1, 288(%r10) + vmovdqu 320(%rcx), %ymm2 + vmovdqu 352(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%rdi), %ymm4 + vmovdqu 352(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r11), %ymm10 + vmovdqu 352(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%r10), %ymm6 + vmovdqu 352(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%r10) + vmovdqu %ymm1, 352(%r10) + vmovdqu 384(%rcx), %ymm2 + vmovdqu 416(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%rdi), %ymm4 + vmovdqu 416(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r11), %ymm10 + vmovdqu 416(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%r10), %ymm6 + vmovdqu 416(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%r10) + vmovdqu %ymm1, 416(%r10) + vmovdqu 448(%rcx), %ymm2 + vmovdqu 480(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%rdi), %ymm4 + vmovdqu 480(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r11), %ymm10 + vmovdqu 480(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%r10), %ymm6 + vmovdqu 480(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%r10) + vmovdqu %ymm1, 480(%r10) + addq $0x200, %rcx + addq $0x200, %rdi + subq $0x01, %r9 + jg L_pointwise_acc_mont_start_keygen +L_pointwise_acc_mont_end_keygen: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r11 + vmovdqu (%rcx), %ymm2 + vmovdqu 32(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%rdi), %ymm4 + vmovdqu 32(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r11), %ymm10 + vmovdqu 32(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%r10), %ymm6 + vmovdqu 32(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%r10) + vmovdqu %ymm1, 32(%r10) + vmovdqu 64(%rcx), %ymm2 + vmovdqu 96(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%rdi), %ymm4 + vmovdqu 96(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r11), %ymm10 + vmovdqu 96(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%r10), %ymm6 + vmovdqu 96(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%r10) + vmovdqu %ymm1, 96(%r10) + vmovdqu 128(%rcx), %ymm2 + vmovdqu 160(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r11), %ymm10 + vmovdqu 160(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%r10), %ymm6 + vmovdqu 160(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%r10) + vmovdqu %ymm1, 160(%r10) + vmovdqu 192(%rcx), %ymm2 + vmovdqu 224(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%rdi), %ymm4 + vmovdqu 224(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r11), %ymm10 + vmovdqu 224(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%r10), %ymm6 + vmovdqu 224(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%r10) + vmovdqu %ymm1, 224(%r10) + vmovdqu 256(%rcx), %ymm2 + vmovdqu 288(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%rdi), %ymm4 + vmovdqu 288(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r11), %ymm10 + vmovdqu 288(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%r10), %ymm6 + vmovdqu 288(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%r10) + vmovdqu %ymm1, 288(%r10) + vmovdqu 320(%rcx), %ymm2 + vmovdqu 352(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%rdi), %ymm4 + vmovdqu 352(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r11), %ymm10 + vmovdqu 352(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%r10), %ymm6 + vmovdqu 352(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%r10) + vmovdqu %ymm1, 352(%r10) + vmovdqu 384(%rcx), %ymm2 + vmovdqu 416(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%rdi), %ymm4 + vmovdqu 416(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r11), %ymm10 + vmovdqu 416(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%r10), %ymm6 + vmovdqu 416(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%r10) + vmovdqu %ymm1, 416(%r10) + vmovdqu 448(%rcx), %ymm2 + vmovdqu 480(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%rdi), %ymm4 + vmovdqu 480(%rdi), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r11), %ymm10 + vmovdqu 480(%r11), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm13, %ymm1, %ymm8 + vpmullw %ymm13, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%r10), %ymm6 + vmovdqu 480(%r10), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%r10) + vmovdqu %ymm1, 480(%r10) + addq $0x200, %rcx + addq $0x200, %rdi + movq %r8, %r9 + shl $9, %r9d + subq %r9, %rdi + addq $0x200, %r10 + subq $0x01, %rax + jg L_kyber_keygen_avx2_acc + movq %r8, %rax + vmovdqu kyber_f(%rip), %ymm12 + vmovdqu kyber_f_qinv(%rip), %ymm13 + movq %r8, %rax + movq %rsi, %r10 +L_kyber_keygen_avx2_to_mont: + # To Mont + vmovdqu (%r10), %ymm0 + vmovdqu 32(%r10), %ymm1 + vmovdqu 64(%r10), %ymm2 + vmovdqu 96(%r10), %ymm3 + vpmullw %ymm13, %ymm0, %ymm4 + vpmulhw %ymm12, %ymm0, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm0 + vpmullw %ymm13, %ymm1, %ymm4 + vpmulhw %ymm12, %ymm1, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm1 + vpmullw %ymm13, %ymm2, %ymm4 + vpmulhw %ymm12, %ymm2, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm2 + vpmullw %ymm13, %ymm3, %ymm4 + vpmulhw %ymm12, %ymm3, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm3 + vmovdqu %ymm0, (%r10) + vmovdqu %ymm1, 32(%r10) + vmovdqu %ymm2, 64(%r10) + vmovdqu %ymm3, 96(%r10) + vmovdqu 128(%r10), %ymm0 + vmovdqu 160(%r10), %ymm1 + vmovdqu 192(%r10), %ymm2 + vmovdqu 224(%r10), %ymm3 + vpmullw %ymm13, %ymm0, %ymm4 + vpmulhw %ymm12, %ymm0, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm0 + vpmullw %ymm13, %ymm1, %ymm4 + vpmulhw %ymm12, %ymm1, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm1 + vpmullw %ymm13, %ymm2, %ymm4 + vpmulhw %ymm12, %ymm2, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm2 + vpmullw %ymm13, %ymm3, %ymm4 + vpmulhw %ymm12, %ymm3, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm3 + vmovdqu %ymm0, 128(%r10) + vmovdqu %ymm1, 160(%r10) + vmovdqu %ymm2, 192(%r10) + vmovdqu %ymm3, 224(%r10) + vmovdqu 256(%r10), %ymm0 + vmovdqu 288(%r10), %ymm1 + vmovdqu 320(%r10), %ymm2 + vmovdqu 352(%r10), %ymm3 + vpmullw %ymm13, %ymm0, %ymm4 + vpmulhw %ymm12, %ymm0, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm0 + vpmullw %ymm13, %ymm1, %ymm4 + vpmulhw %ymm12, %ymm1, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm1 + vpmullw %ymm13, %ymm2, %ymm4 + vpmulhw %ymm12, %ymm2, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm2 + vpmullw %ymm13, %ymm3, %ymm4 + vpmulhw %ymm12, %ymm3, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm3 + vmovdqu %ymm0, 256(%r10) + vmovdqu %ymm1, 288(%r10) + vmovdqu %ymm2, 320(%r10) + vmovdqu %ymm3, 352(%r10) + vmovdqu 384(%r10), %ymm0 + vmovdqu 416(%r10), %ymm1 + vmovdqu 448(%r10), %ymm2 + vmovdqu 480(%r10), %ymm3 + vpmullw %ymm13, %ymm0, %ymm4 + vpmulhw %ymm12, %ymm0, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm0 + vpmullw %ymm13, %ymm1, %ymm4 + vpmulhw %ymm12, %ymm1, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm1 + vpmullw %ymm13, %ymm2, %ymm4 + vpmulhw %ymm12, %ymm2, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm2 + vpmullw %ymm13, %ymm3, %ymm4 + vpmulhw %ymm12, %ymm3, %ymm5 + vpmulhw %ymm14, %ymm4, %ymm4 + vpsubw %ymm4, %ymm5, %ymm3 + vmovdqu %ymm0, 384(%r10) + vmovdqu %ymm1, 416(%r10) + vmovdqu %ymm2, 448(%r10) + vmovdqu %ymm3, 480(%r10) + addq $0x200, %r10 + subq $0x01, %rax + jg L_kyber_keygen_avx2_to_mont + movq %r8, %rax +L_kyber_keygen_avx2_to_mont_ntt_err: + # ntt + leaq L_kyber_avx2_zetas(%rip), %r11 + vmovdqu (%r11), %ymm10 + vmovdqu 32(%r11), %ymm12 + vmovdqu 128(%rdx), %ymm0 + vmovdqu 160(%rdx), %ymm1 + vmovdqu 192(%rdx), %ymm2 + vmovdqu 224(%rdx), %ymm3 + vmovdqu 384(%rdx), %ymm4 + vmovdqu 416(%rdx), %ymm5 + vmovdqu 448(%rdx), %ymm6 + vmovdqu 480(%rdx), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%rdx) + vmovdqu %ymm1, 160(%rdx) + vmovdqu %ymm2, 192(%rdx) + vmovdqu %ymm3, 224(%rdx) + vmovdqu %ymm4, 384(%rdx) + vmovdqu %ymm5, 416(%rdx) + vmovdqu %ymm6, 448(%rdx) + vmovdqu %ymm7, 480(%rdx) + vmovdqu (%rdx), %ymm0 + vmovdqu 32(%rdx), %ymm1 + vmovdqu 64(%rdx), %ymm2 + vmovdqu 96(%rdx), %ymm3 + vmovdqu 256(%rdx), %ymm4 + vmovdqu 288(%rdx), %ymm5 + vmovdqu 320(%rdx), %ymm6 + vmovdqu 352(%rdx), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm4, 256(%rdx) + vmovdqu %ymm5, 288(%rdx) + vmovdqu %ymm6, 320(%rdx) + vmovdqu %ymm7, 352(%rdx) + vmovdqu 128(%rdx), %ymm4 + vmovdqu 160(%rdx), %ymm5 + vmovdqu 192(%rdx), %ymm6 + vmovdqu 224(%rdx), %ymm7 + # 64: 0/3 + vmovdqu 64(%r11), %ymm10 + vmovdqu 96(%r11), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 0/3 + vmovdqu 128(%r11), %ymm10 + vmovdqu 160(%r11), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 0/3 + vmovdqu 192(%r11), %ymm10 + vmovdqu 224(%r11), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 0/3 + vmovdqu 256(%r11), %ymm10 + vmovdqu 288(%r11), %ymm12 + vmovdqu 320(%r11), %ymm11 + vmovdqu 352(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 0/3 + vmovdqu 384(%r11), %ymm10 + vmovdqu 416(%r11), %ymm12 + vmovdqu 448(%r11), %ymm11 + vmovdqu 480(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 0/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 512(%r11), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 544(%r11), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 576(%r11), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 608(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 640(%r11), %ymm10 + vmovdqu 672(%r11), %ymm12 + vmovdqu 704(%r11), %ymm11 + vmovdqu 736(%r11), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 0/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 768(%r11), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 800(%r11), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 832(%r11), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 864(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 896(%r11), %ymm10 + vmovdqu 928(%r11), %ymm12 + vmovdqu 960(%r11), %ymm11 + vmovdqu 992(%r11), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 0/3 + vmovdqu 1024(%r11), %ymm10 + vmovdqu 1056(%r11), %ymm12 + vmovdqu 1088(%r11), %ymm11 + vmovdqu 1120(%r11), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 0/3 + vmovdqu 1152(%r11), %ymm10 + vmovdqu 1184(%r11), %ymm12 + vmovdqu 1216(%r11), %ymm11 + vmovdqu 1248(%r11), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu %ymm2, 64(%rdx) + vmovdqu %ymm3, 96(%rdx) + vmovdqu %ymm4, 128(%rdx) + vmovdqu %ymm5, 160(%rdx) + vmovdqu %ymm6, 192(%rdx) + vmovdqu %ymm7, 224(%rdx) + vmovdqu 256(%rdx), %ymm0 + vmovdqu 288(%rdx), %ymm1 + vmovdqu 320(%rdx), %ymm2 + vmovdqu 352(%rdx), %ymm3 + vmovdqu 384(%rdx), %ymm4 + vmovdqu 416(%rdx), %ymm5 + vmovdqu 448(%rdx), %ymm6 + vmovdqu 480(%rdx), %ymm7 + # 64: 1/3 + vmovdqu 1280(%r11), %ymm10 + vmovdqu 1312(%r11), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 1/3 + vmovdqu 1344(%r11), %ymm10 + vmovdqu 1376(%r11), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 1/3 + vmovdqu 1408(%r11), %ymm10 + vmovdqu 1440(%r11), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 1/3 + vmovdqu 1472(%r11), %ymm10 + vmovdqu 1504(%r11), %ymm12 + vmovdqu 1536(%r11), %ymm11 + vmovdqu 1568(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 1/3 + vmovdqu 1600(%r11), %ymm10 + vmovdqu 1632(%r11), %ymm12 + vmovdqu 1664(%r11), %ymm11 + vmovdqu 1696(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 1/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 1728(%r11), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 1760(%r11), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 1792(%r11), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 1824(%r11), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 1856(%r11), %ymm10 + vmovdqu 1888(%r11), %ymm12 + vmovdqu 1920(%r11), %ymm11 + vmovdqu 1952(%r11), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 1/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 1984(%r11), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 2016(%r11), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 2048(%r11), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 2080(%r11), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 2112(%r11), %ymm10 + vmovdqu 2144(%r11), %ymm12 + vmovdqu 2176(%r11), %ymm11 + vmovdqu 2208(%r11), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 1/3 + vmovdqu 2240(%r11), %ymm10 + vmovdqu 2272(%r11), %ymm12 + vmovdqu 2304(%r11), %ymm11 + vmovdqu 2336(%r11), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 1/3 + vmovdqu 2368(%r11), %ymm10 + vmovdqu 2400(%r11), %ymm12 + vmovdqu 2432(%r11), %ymm11 + vmovdqu 2464(%r11), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vmovdqu %ymm0, 256(%rdx) + vmovdqu %ymm1, 288(%rdx) + vmovdqu %ymm2, 320(%rdx) + vmovdqu %ymm3, 352(%rdx) + vmovdqu %ymm4, 384(%rdx) + vmovdqu %ymm5, 416(%rdx) + vmovdqu %ymm6, 448(%rdx) + vmovdqu %ymm7, 480(%rdx) + # Add Errors + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu (%rdx), %ymm4 + vmovdqu 32(%rdx), %ymm5 + vmovdqu 64(%rdx), %ymm6 + vmovdqu 96(%rdx), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu %ymm2, 64(%rsi) + vmovdqu %ymm3, 96(%rsi) + vmovdqu 128(%rsi), %ymm0 + vmovdqu 160(%rsi), %ymm1 + vmovdqu 192(%rsi), %ymm2 + vmovdqu 224(%rsi), %ymm3 + vmovdqu 128(%rdx), %ymm4 + vmovdqu 160(%rdx), %ymm5 + vmovdqu 192(%rdx), %ymm6 + vmovdqu 224(%rdx), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu %ymm2, 192(%rsi) + vmovdqu %ymm3, 224(%rsi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm1 + vmovdqu 320(%rsi), %ymm2 + vmovdqu 352(%rsi), %ymm3 + vmovdqu 256(%rdx), %ymm4 + vmovdqu 288(%rdx), %ymm5 + vmovdqu 320(%rdx), %ymm6 + vmovdqu 352(%rdx), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu %ymm2, 320(%rsi) + vmovdqu %ymm3, 352(%rsi) + vmovdqu 384(%rsi), %ymm0 + vmovdqu 416(%rsi), %ymm1 + vmovdqu 448(%rsi), %ymm2 + vmovdqu 480(%rsi), %ymm3 + vmovdqu 384(%rdx), %ymm4 + vmovdqu 416(%rdx), %ymm5 + vmovdqu 448(%rdx), %ymm6 + vmovdqu 480(%rdx), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu %ymm2, 448(%rsi) + vmovdqu %ymm3, 480(%rsi) + addq $0x200, %rdx + addq $0x200, %rsi + subq $0x01, %rax + jg L_kyber_keygen_avx2_to_mont_ntt_err + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_keygen_avx2,.-kyber_keygen_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_encapsulate_avx2 +.type kyber_encapsulate_avx2,@function +.align 16 +kyber_encapsulate_avx2: +#else +.section __TEXT,__text +.globl _kyber_encapsulate_avx2 +.p2align 4 +_kyber_encapsulate_avx2: +#endif /* __APPLE__ */ + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + movq 40(%rsp), %rax + movq 48(%rsp), %r10 + movq 56(%rsp), %r11 + subq $48, %rsp + vmovdqu kyber_q(%rip), %ymm14 + vmovdqu kyber_v(%rip), %ymm15 + movq %r11, %r13 + movq %r8, %r14 +L_kyber_encapsulate_avx2_trans: + # ntt + leaq L_kyber_avx2_zetas(%rip), %r15 + vmovdqu (%r15), %ymm10 + vmovdqu 32(%r15), %ymm12 + vmovdqu 128(%r14), %ymm0 + vmovdqu 160(%r14), %ymm1 + vmovdqu 192(%r14), %ymm2 + vmovdqu 224(%r14), %ymm3 + vmovdqu 384(%r14), %ymm4 + vmovdqu 416(%r14), %ymm5 + vmovdqu 448(%r14), %ymm6 + vmovdqu 480(%r14), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%r14) + vmovdqu %ymm1, 160(%r14) + vmovdqu %ymm2, 192(%r14) + vmovdqu %ymm3, 224(%r14) + vmovdqu %ymm4, 384(%r14) + vmovdqu %ymm5, 416(%r14) + vmovdqu %ymm6, 448(%r14) + vmovdqu %ymm7, 480(%r14) + vmovdqu (%r14), %ymm0 + vmovdqu 32(%r14), %ymm1 + vmovdqu 64(%r14), %ymm2 + vmovdqu 96(%r14), %ymm3 + vmovdqu 256(%r14), %ymm4 + vmovdqu 288(%r14), %ymm5 + vmovdqu 320(%r14), %ymm6 + vmovdqu 352(%r14), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm4, 256(%r14) + vmovdqu %ymm5, 288(%r14) + vmovdqu %ymm6, 320(%r14) + vmovdqu %ymm7, 352(%r14) + vmovdqu 128(%r14), %ymm4 + vmovdqu 160(%r14), %ymm5 + vmovdqu 192(%r14), %ymm6 + vmovdqu 224(%r14), %ymm7 + # 64: 0/3 + vmovdqu 64(%r15), %ymm10 + vmovdqu 96(%r15), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 0/3 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 0/3 + vmovdqu 192(%r15), %ymm10 + vmovdqu 224(%r15), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 0/3 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm12 + vmovdqu 320(%r15), %ymm11 + vmovdqu 352(%r15), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 0/3 + vmovdqu 384(%r15), %ymm10 + vmovdqu 416(%r15), %ymm12 + vmovdqu 448(%r15), %ymm11 + vmovdqu 480(%r15), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 0/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 512(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 544(%r15), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 576(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 608(%r15), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 640(%r15), %ymm10 + vmovdqu 672(%r15), %ymm12 + vmovdqu 704(%r15), %ymm11 + vmovdqu 736(%r15), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 0/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 768(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 800(%r15), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 832(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 864(%r15), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 896(%r15), %ymm10 + vmovdqu 928(%r15), %ymm12 + vmovdqu 960(%r15), %ymm11 + vmovdqu 992(%r15), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 0/3 + vmovdqu 1024(%r15), %ymm10 + vmovdqu 1056(%r15), %ymm12 + vmovdqu 1088(%r15), %ymm11 + vmovdqu 1120(%r15), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 0/3 + vmovdqu 1152(%r15), %ymm10 + vmovdqu 1184(%r15), %ymm12 + vmovdqu 1216(%r15), %ymm11 + vmovdqu 1248(%r15), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vmovdqu %ymm0, (%r14) + vmovdqu %ymm1, 32(%r14) + vmovdqu %ymm2, 64(%r14) + vmovdqu %ymm3, 96(%r14) + vmovdqu %ymm4, 128(%r14) + vmovdqu %ymm5, 160(%r14) + vmovdqu %ymm6, 192(%r14) + vmovdqu %ymm7, 224(%r14) + vmovdqu 256(%r14), %ymm0 + vmovdqu 288(%r14), %ymm1 + vmovdqu 320(%r14), %ymm2 + vmovdqu 352(%r14), %ymm3 + vmovdqu 384(%r14), %ymm4 + vmovdqu 416(%r14), %ymm5 + vmovdqu 448(%r14), %ymm6 + vmovdqu 480(%r14), %ymm7 + # 64: 1/3 + vmovdqu 1280(%r15), %ymm10 + vmovdqu 1312(%r15), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 1/3 + vmovdqu 1344(%r15), %ymm10 + vmovdqu 1376(%r15), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 1/3 + vmovdqu 1408(%r15), %ymm10 + vmovdqu 1440(%r15), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 1/3 + vmovdqu 1472(%r15), %ymm10 + vmovdqu 1504(%r15), %ymm12 + vmovdqu 1536(%r15), %ymm11 + vmovdqu 1568(%r15), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 1/3 + vmovdqu 1600(%r15), %ymm10 + vmovdqu 1632(%r15), %ymm12 + vmovdqu 1664(%r15), %ymm11 + vmovdqu 1696(%r15), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 1/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 1728(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 1760(%r15), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 1792(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 1824(%r15), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 1856(%r15), %ymm10 + vmovdqu 1888(%r15), %ymm12 + vmovdqu 1920(%r15), %ymm11 + vmovdqu 1952(%r15), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 1/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 1984(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 2016(%r15), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 2048(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 2080(%r15), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 2112(%r15), %ymm10 + vmovdqu 2144(%r15), %ymm12 + vmovdqu 2176(%r15), %ymm11 + vmovdqu 2208(%r15), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 1/3 + vmovdqu 2240(%r15), %ymm10 + vmovdqu 2272(%r15), %ymm12 + vmovdqu 2304(%r15), %ymm11 + vmovdqu 2336(%r15), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 1/3 + vmovdqu 2368(%r15), %ymm10 + vmovdqu 2400(%r15), %ymm12 + vmovdqu 2432(%r15), %ymm11 + vmovdqu 2464(%r15), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vmovdqu %ymm0, 256(%r14) + vmovdqu %ymm1, 288(%r14) + vmovdqu %ymm2, 320(%r14) + vmovdqu %ymm3, 352(%r14) + vmovdqu %ymm4, 384(%r14) + vmovdqu %ymm5, 416(%r14) + vmovdqu %ymm6, 448(%r14) + vmovdqu %ymm7, 480(%r14) + addq $0x200, %r14 + subq $0x01, %r13 + jg L_kyber_encapsulate_avx2_trans + movq %r11, %r12 +L_kyber_encapsulate_avx2_calc: + vmovdqu kyber_qinv(%rip), %ymm12 + # Pointwise acc mont + movq %r11, %r13 + # Base mul mont + leaq L_kyber_avx2_zetas_basemul(%rip), %r15 + vmovdqu (%rcx), %ymm2 + vmovdqu 32(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%r8), %ymm4 + vmovdqu 32(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r15), %ymm10 + vmovdqu 32(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu 64(%rcx), %ymm2 + vmovdqu 96(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%r8), %ymm4 + vmovdqu 96(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r15), %ymm10 + vmovdqu 96(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm1, 96(%rsi) + vmovdqu 128(%rcx), %ymm2 + vmovdqu 160(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%r8), %ymm4 + vmovdqu 160(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu 192(%rcx), %ymm2 + vmovdqu 224(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%r8), %ymm4 + vmovdqu 224(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r15), %ymm10 + vmovdqu 224(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rsi) + vmovdqu %ymm1, 224(%rsi) + vmovdqu 256(%rcx), %ymm2 + vmovdqu 288(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%r8), %ymm4 + vmovdqu 288(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu 320(%rcx), %ymm2 + vmovdqu 352(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%r8), %ymm4 + vmovdqu 352(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r15), %ymm10 + vmovdqu 352(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rsi) + vmovdqu %ymm1, 352(%rsi) + vmovdqu 384(%rcx), %ymm2 + vmovdqu 416(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%r8), %ymm4 + vmovdqu 416(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r15), %ymm10 + vmovdqu 416(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu 448(%rcx), %ymm2 + vmovdqu 480(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%r8), %ymm4 + vmovdqu 480(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r15), %ymm10 + vmovdqu 480(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rsi) + vmovdqu %ymm1, 480(%rsi) + addq $0x200, %rcx + addq $0x200, %r8 + subq $2, %r13 + jz L_pointwise_acc_mont_end_encap_bp +L_pointwise_acc_mont_start_encap_bp: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r15 + vmovdqu (%rcx), %ymm2 + vmovdqu 32(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%r8), %ymm4 + vmovdqu 32(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r15), %ymm10 + vmovdqu 32(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%rsi), %ymm6 + vmovdqu 32(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu 64(%rcx), %ymm2 + vmovdqu 96(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%r8), %ymm4 + vmovdqu 96(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r15), %ymm10 + vmovdqu 96(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%rsi), %ymm6 + vmovdqu 96(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm1, 96(%rsi) + vmovdqu 128(%rcx), %ymm2 + vmovdqu 160(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%r8), %ymm4 + vmovdqu 160(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%rsi), %ymm6 + vmovdqu 160(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu 192(%rcx), %ymm2 + vmovdqu 224(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%r8), %ymm4 + vmovdqu 224(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r15), %ymm10 + vmovdqu 224(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%rsi), %ymm6 + vmovdqu 224(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rsi) + vmovdqu %ymm1, 224(%rsi) + vmovdqu 256(%rcx), %ymm2 + vmovdqu 288(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%r8), %ymm4 + vmovdqu 288(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%rsi), %ymm6 + vmovdqu 288(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu 320(%rcx), %ymm2 + vmovdqu 352(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%r8), %ymm4 + vmovdqu 352(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r15), %ymm10 + vmovdqu 352(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%rsi), %ymm6 + vmovdqu 352(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rsi) + vmovdqu %ymm1, 352(%rsi) + vmovdqu 384(%rcx), %ymm2 + vmovdqu 416(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%r8), %ymm4 + vmovdqu 416(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r15), %ymm10 + vmovdqu 416(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%rsi), %ymm6 + vmovdqu 416(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu 448(%rcx), %ymm2 + vmovdqu 480(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%r8), %ymm4 + vmovdqu 480(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r15), %ymm10 + vmovdqu 480(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%rsi), %ymm6 + vmovdqu 480(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rsi) + vmovdqu %ymm1, 480(%rsi) + addq $0x200, %rcx + addq $0x200, %r8 + subq $0x01, %r13 + jg L_pointwise_acc_mont_start_encap_bp +L_pointwise_acc_mont_end_encap_bp: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r15 + vmovdqu (%rcx), %ymm2 + vmovdqu 32(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%r8), %ymm4 + vmovdqu 32(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r15), %ymm10 + vmovdqu 32(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%rsi), %ymm6 + vmovdqu 32(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu 64(%rcx), %ymm2 + vmovdqu 96(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%r8), %ymm4 + vmovdqu 96(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r15), %ymm10 + vmovdqu 96(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%rsi), %ymm6 + vmovdqu 96(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm1, 96(%rsi) + vmovdqu 128(%rcx), %ymm2 + vmovdqu 160(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%r8), %ymm4 + vmovdqu 160(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%rsi), %ymm6 + vmovdqu 160(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu 192(%rcx), %ymm2 + vmovdqu 224(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%r8), %ymm4 + vmovdqu 224(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r15), %ymm10 + vmovdqu 224(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%rsi), %ymm6 + vmovdqu 224(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rsi) + vmovdqu %ymm1, 224(%rsi) + vmovdqu 256(%rcx), %ymm2 + vmovdqu 288(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%r8), %ymm4 + vmovdqu 288(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%rsi), %ymm6 + vmovdqu 288(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu 320(%rcx), %ymm2 + vmovdqu 352(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%r8), %ymm4 + vmovdqu 352(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r15), %ymm10 + vmovdqu 352(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%rsi), %ymm6 + vmovdqu 352(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rsi) + vmovdqu %ymm1, 352(%rsi) + vmovdqu 384(%rcx), %ymm2 + vmovdqu 416(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%r8), %ymm4 + vmovdqu 416(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r15), %ymm10 + vmovdqu 416(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%rsi), %ymm6 + vmovdqu 416(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu 448(%rcx), %ymm2 + vmovdqu 480(%rcx), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%r8), %ymm4 + vmovdqu 480(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r15), %ymm10 + vmovdqu 480(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%rsi), %ymm6 + vmovdqu 480(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rsi) + vmovdqu %ymm1, 480(%rsi) + addq $0x200, %rcx + addq $0x200, %r8 + movq %r11, %r13 + shl $9, %r13d + subq %r13, %r8 + # invntt + leaq L_kyber_avx2_zetas_inv(%rip), %r15 + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu 128(%rsi), %ymm4 + vmovdqu 160(%rsi), %ymm5 + vmovdqu 192(%rsi), %ymm6 + vmovdqu 224(%rsi), %ymm7 + # 2: 1/2 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu (%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm9 + vmovdqu 32(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm0 + vpsrlq $32, %ymm8, %ymm1 + vpblendd $0xaa, %ymm0, %ymm8, %ymm0 + vpblendd $0x55, %ymm1, %ymm9, %ymm1 + vperm2i128 $32, %ymm3, %ymm2, %ymm8 + vmovdqu 64(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm9 + vmovdqu 96(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm2 + vpsrlq $32, %ymm8, %ymm3 + vpblendd $0xaa, %ymm2, %ymm8, %ymm2 + vpblendd $0x55, %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 4: 1/2 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm12 + vmovdqu 192(%r15), %ymm11 + vmovdqu 224(%r15), %ymm13 + vpunpckldq %ymm1, %ymm8, %ymm0 + vpunpckhdq %ymm1, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm9, %ymm2 + vpunpckhdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm2 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm2, %ymm2 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm8, %ymm8 + vpsubw %ymm2, %ymm9, %ymm9 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 8: 1/2 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm12 + vmovdqu 320(%r15), %ymm11 + vmovdqu 352(%r15), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 16: 1/2 + vperm2i128 $32, %ymm1, %ymm8, %ymm0 + vmovdqu 384(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm8, %ymm1 + vmovdqu 416(%r15), %ymm12 + vperm2i128 $32, %ymm3, %ymm9, %ymm2 + vmovdqu 448(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm9, %ymm3 + vmovdqu 480(%r15), %ymm13 + vpsubw %ymm1, %ymm0, %ymm8 + vpsubw %ymm3, %ymm2, %ymm9 + vpaddw %ymm1, %ymm0, %ymm0 + vpaddw %ymm3, %ymm2, %ymm2 + vpmullw %ymm12, %ymm8, %ymm1 + vpmullw %ymm13, %ymm9, %ymm3 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm3, %ymm3 + vpsubw %ymm1, %ymm8, %ymm1 + vpsubw %ymm3, %ymm9, %ymm3 + # 32: 1/2 + vmovdqu 512(%r15), %ymm10 + vmovdqu 544(%r15), %ymm12 + vpaddw %ymm2, %ymm0, %ymm8 + vpaddw %ymm3, %ymm1, %ymm9 + vpsubw %ymm2, %ymm0, %ymm2 + vpsubw %ymm3, %ymm1, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm8, %ymm0 + vpsubw %ymm1, %ymm9, %ymm1 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + # 2: 1/2 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 576(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm9 + vmovdqu 608(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm4 + vpsrlq $32, %ymm8, %ymm5 + vpblendd $0xaa, %ymm4, %ymm8, %ymm4 + vpblendd $0x55, %ymm5, %ymm9, %ymm5 + vperm2i128 $32, %ymm7, %ymm6, %ymm8 + vmovdqu 640(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm9 + vmovdqu 672(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm6 + vpsrlq $32, %ymm8, %ymm7 + vpblendd $0xaa, %ymm6, %ymm8, %ymm6 + vpblendd $0x55, %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 4: 1/2 + vmovdqu 704(%r15), %ymm10 + vmovdqu 736(%r15), %ymm12 + vmovdqu 768(%r15), %ymm11 + vmovdqu 800(%r15), %ymm13 + vpunpckldq %ymm5, %ymm8, %ymm4 + vpunpckhdq %ymm5, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm9, %ymm6 + vpunpckhdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm6 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm6, %ymm6 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm8, %ymm8 + vpsubw %ymm6, %ymm9, %ymm9 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 8: 1/2 + vmovdqu 832(%r15), %ymm10 + vmovdqu 864(%r15), %ymm12 + vmovdqu 896(%r15), %ymm11 + vmovdqu 928(%r15), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 16: 1/2 + vperm2i128 $32, %ymm5, %ymm8, %ymm4 + vmovdqu 960(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm8, %ymm5 + vmovdqu 992(%r15), %ymm12 + vperm2i128 $32, %ymm7, %ymm9, %ymm6 + vmovdqu 1024(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm9, %ymm7 + vmovdqu 1056(%r15), %ymm13 + vpsubw %ymm5, %ymm4, %ymm8 + vpsubw %ymm7, %ymm6, %ymm9 + vpaddw %ymm5, %ymm4, %ymm4 + vpaddw %ymm7, %ymm6, %ymm6 + vpmullw %ymm12, %ymm8, %ymm5 + vpmullw %ymm13, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm5, %ymm8, %ymm5 + vpsubw %ymm7, %ymm9, %ymm7 + # 32: 1/2 + vmovdqu 1088(%r15), %ymm10 + vmovdqu 1120(%r15), %ymm12 + vpaddw %ymm6, %ymm4, %ymm8 + vpaddw %ymm7, %ymm5, %ymm9 + vpsubw %ymm6, %ymm4, %ymm6 + vpsubw %ymm7, %ymm5, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm5 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm5, %ymm5 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + # 64: 1/2 + vmovdqu 1152(%r15), %ymm10 + vmovdqu 1184(%r15), %ymm12 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu %ymm2, 64(%rsi) + vmovdqu %ymm3, 96(%rsi) + vmovdqu %ymm4, 128(%rsi) + vmovdqu %ymm5, 160(%rsi) + vmovdqu %ymm6, 192(%rsi) + vmovdqu %ymm7, 224(%rsi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm1 + vmovdqu 320(%rsi), %ymm2 + vmovdqu 352(%rsi), %ymm3 + vmovdqu 384(%rsi), %ymm4 + vmovdqu 416(%rsi), %ymm5 + vmovdqu 448(%rsi), %ymm6 + vmovdqu 480(%rsi), %ymm7 + # 2: 2/2 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 1216(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm9 + vmovdqu 1248(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm0 + vpsrlq $32, %ymm8, %ymm1 + vpblendd $0xaa, %ymm0, %ymm8, %ymm0 + vpblendd $0x55, %ymm1, %ymm9, %ymm1 + vperm2i128 $32, %ymm3, %ymm2, %ymm8 + vmovdqu 1280(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm9 + vmovdqu 1312(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm2 + vpsrlq $32, %ymm8, %ymm3 + vpblendd $0xaa, %ymm2, %ymm8, %ymm2 + vpblendd $0x55, %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 4: 2/2 + vmovdqu 1344(%r15), %ymm10 + vmovdqu 1376(%r15), %ymm12 + vmovdqu 1408(%r15), %ymm11 + vmovdqu 1440(%r15), %ymm13 + vpunpckldq %ymm1, %ymm8, %ymm0 + vpunpckhdq %ymm1, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm9, %ymm2 + vpunpckhdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm2 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm2, %ymm2 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm8, %ymm8 + vpsubw %ymm2, %ymm9, %ymm9 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 8: 2/2 + vmovdqu 1472(%r15), %ymm10 + vmovdqu 1504(%r15), %ymm12 + vmovdqu 1536(%r15), %ymm11 + vmovdqu 1568(%r15), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 16: 2/2 + vperm2i128 $32, %ymm1, %ymm8, %ymm0 + vmovdqu 1600(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm8, %ymm1 + vmovdqu 1632(%r15), %ymm12 + vperm2i128 $32, %ymm3, %ymm9, %ymm2 + vmovdqu 1664(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm9, %ymm3 + vmovdqu 1696(%r15), %ymm13 + vpsubw %ymm1, %ymm0, %ymm8 + vpsubw %ymm3, %ymm2, %ymm9 + vpaddw %ymm1, %ymm0, %ymm0 + vpaddw %ymm3, %ymm2, %ymm2 + vpmullw %ymm12, %ymm8, %ymm1 + vpmullw %ymm13, %ymm9, %ymm3 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm3, %ymm3 + vpsubw %ymm1, %ymm8, %ymm1 + vpsubw %ymm3, %ymm9, %ymm3 + # 32: 2/2 + vmovdqu 1728(%r15), %ymm10 + vmovdqu 1760(%r15), %ymm12 + vpaddw %ymm2, %ymm0, %ymm8 + vpaddw %ymm3, %ymm1, %ymm9 + vpsubw %ymm2, %ymm0, %ymm2 + vpsubw %ymm3, %ymm1, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm8, %ymm0 + vpsubw %ymm1, %ymm9, %ymm1 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + # 2: 2/2 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 1792(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm9 + vmovdqu 1824(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm4 + vpsrlq $32, %ymm8, %ymm5 + vpblendd $0xaa, %ymm4, %ymm8, %ymm4 + vpblendd $0x55, %ymm5, %ymm9, %ymm5 + vperm2i128 $32, %ymm7, %ymm6, %ymm8 + vmovdqu 1856(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm9 + vmovdqu 1888(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm6 + vpsrlq $32, %ymm8, %ymm7 + vpblendd $0xaa, %ymm6, %ymm8, %ymm6 + vpblendd $0x55, %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 4: 2/2 + vmovdqu 1920(%r15), %ymm10 + vmovdqu 1952(%r15), %ymm12 + vmovdqu 1984(%r15), %ymm11 + vmovdqu 2016(%r15), %ymm13 + vpunpckldq %ymm5, %ymm8, %ymm4 + vpunpckhdq %ymm5, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm9, %ymm6 + vpunpckhdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm6 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm6, %ymm6 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm8, %ymm8 + vpsubw %ymm6, %ymm9, %ymm9 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 8: 2/2 + vmovdqu 2048(%r15), %ymm10 + vmovdqu 2080(%r15), %ymm12 + vmovdqu 2112(%r15), %ymm11 + vmovdqu 2144(%r15), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 16: 2/2 + vperm2i128 $32, %ymm5, %ymm8, %ymm4 + vmovdqu 2176(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm8, %ymm5 + vmovdqu 2208(%r15), %ymm12 + vperm2i128 $32, %ymm7, %ymm9, %ymm6 + vmovdqu 2240(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm9, %ymm7 + vmovdqu 2272(%r15), %ymm13 + vpsubw %ymm5, %ymm4, %ymm8 + vpsubw %ymm7, %ymm6, %ymm9 + vpaddw %ymm5, %ymm4, %ymm4 + vpaddw %ymm7, %ymm6, %ymm6 + vpmullw %ymm12, %ymm8, %ymm5 + vpmullw %ymm13, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm5, %ymm8, %ymm5 + vpsubw %ymm7, %ymm9, %ymm7 + # 32: 2/2 + vmovdqu 2304(%r15), %ymm10 + vmovdqu 2336(%r15), %ymm12 + vpaddw %ymm6, %ymm4, %ymm8 + vpaddw %ymm7, %ymm5, %ymm9 + vpsubw %ymm6, %ymm4, %ymm6 + vpsubw %ymm7, %ymm5, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm5 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm5, %ymm5 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + # 64: 2/2 + vmovdqu 2368(%r15), %ymm10 + vmovdqu 2400(%r15), %ymm12 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu %ymm2, 320(%rsi) + vmovdqu %ymm3, 352(%rsi) + # 128 + vmovdqu 2432(%r15), %ymm10 + vmovdqu 2464(%r15), %ymm12 + vmovdqu 2496(%r15), %ymm11 + vmovdqu 2528(%r15), %ymm13 + vmovdqu 128(%rsi), %ymm0 + vmovdqu 160(%rsi), %ymm1 + vmovdqu 192(%rsi), %ymm2 + vmovdqu 224(%rsi), %ymm3 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm11, %ymm0, %ymm0 + vpmulhw %ymm11, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm0 + vpsubw %ymm9, %ymm1, %ymm1 + vpmullw %ymm13, %ymm2, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm11, %ymm2, %ymm2 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + vpmullw %ymm13, %ymm4, %ymm8 + vpmullw %ymm13, %ymm5, %ymm9 + vpmulhw %ymm11, %ymm4, %ymm4 + vpmulhw %ymm11, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm4 + vpsubw %ymm9, %ymm5, %ymm5 + vpmullw %ymm13, %ymm6, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm11, %ymm6, %ymm6 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu %ymm2, 192(%rsi) + vmovdqu %ymm3, 224(%rsi) + vmovdqu %ymm4, 384(%rsi) + vmovdqu %ymm5, 416(%rsi) + vmovdqu %ymm6, 448(%rsi) + vmovdqu %ymm7, 480(%rsi) + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu 256(%rsi), %ymm4 + vmovdqu 288(%rsi), %ymm5 + vmovdqu 320(%rsi), %ymm6 + vmovdqu 352(%rsi), %ymm7 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm11, %ymm0, %ymm0 + vpmulhw %ymm11, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm0 + vpsubw %ymm9, %ymm1, %ymm1 + vpmullw %ymm13, %ymm2, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm11, %ymm2, %ymm2 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + vpmullw %ymm13, %ymm4, %ymm8 + vpmullw %ymm13, %ymm5, %ymm9 + vpmulhw %ymm11, %ymm4, %ymm4 + vpmulhw %ymm11, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm4 + vpsubw %ymm9, %ymm5, %ymm5 + vpmullw %ymm13, %ymm6, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm11, %ymm6, %ymm6 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu %ymm2, 64(%rsi) + vmovdqu %ymm3, 96(%rsi) + vmovdqu %ymm4, 256(%rsi) + vmovdqu %ymm5, 288(%rsi) + vmovdqu %ymm6, 320(%rsi) + vmovdqu %ymm7, 352(%rsi) + # Add Errors + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu (%r9), %ymm4 + vmovdqu 32(%r9), %ymm5 + vmovdqu 64(%r9), %ymm6 + vmovdqu 96(%r9), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu %ymm2, 64(%rsi) + vmovdqu %ymm3, 96(%rsi) + vmovdqu 128(%rsi), %ymm0 + vmovdqu 160(%rsi), %ymm1 + vmovdqu 192(%rsi), %ymm2 + vmovdqu 224(%rsi), %ymm3 + vmovdqu 128(%r9), %ymm4 + vmovdqu 160(%r9), %ymm5 + vmovdqu 192(%r9), %ymm6 + vmovdqu 224(%r9), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu %ymm2, 192(%rsi) + vmovdqu %ymm3, 224(%rsi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm1 + vmovdqu 320(%rsi), %ymm2 + vmovdqu 352(%rsi), %ymm3 + vmovdqu 256(%r9), %ymm4 + vmovdqu 288(%r9), %ymm5 + vmovdqu 320(%r9), %ymm6 + vmovdqu 352(%r9), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu %ymm2, 320(%rsi) + vmovdqu %ymm3, 352(%rsi) + vmovdqu 384(%rsi), %ymm0 + vmovdqu 416(%rsi), %ymm1 + vmovdqu 448(%rsi), %ymm2 + vmovdqu 480(%rsi), %ymm3 + vmovdqu 384(%r9), %ymm4 + vmovdqu 416(%r9), %ymm5 + vmovdqu 448(%r9), %ymm6 + vmovdqu 480(%r9), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu %ymm2, 448(%rsi) + vmovdqu %ymm3, 480(%rsi) + addq $0x200, %r9 + addq $0x200, %rsi + subq $0x01, %r12 + jg L_kyber_encapsulate_avx2_calc + vmovdqu kyber_qinv(%rip), %ymm12 + # Pointwise acc mont + movq %r11, %r13 + # Base mul mont + leaq L_kyber_avx2_zetas_basemul(%rip), %r15 + vmovdqu (%rdi), %ymm2 + vmovdqu 32(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%r8), %ymm4 + vmovdqu 32(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r15), %ymm10 + vmovdqu 32(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%r8), %ymm4 + vmovdqu 96(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r15), %ymm10 + vmovdqu 96(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rdx) + vmovdqu %ymm1, 96(%rdx) + vmovdqu 128(%rdi), %ymm2 + vmovdqu 160(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%r8), %ymm4 + vmovdqu 160(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rdx) + vmovdqu %ymm1, 160(%rdx) + vmovdqu 192(%rdi), %ymm2 + vmovdqu 224(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%r8), %ymm4 + vmovdqu 224(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r15), %ymm10 + vmovdqu 224(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rdx) + vmovdqu %ymm1, 224(%rdx) + vmovdqu 256(%rdi), %ymm2 + vmovdqu 288(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%r8), %ymm4 + vmovdqu 288(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rdx) + vmovdqu %ymm1, 288(%rdx) + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%r8), %ymm4 + vmovdqu 352(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r15), %ymm10 + vmovdqu 352(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rdx) + vmovdqu %ymm1, 352(%rdx) + vmovdqu 384(%rdi), %ymm2 + vmovdqu 416(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%r8), %ymm4 + vmovdqu 416(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r15), %ymm10 + vmovdqu 416(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rdx) + vmovdqu %ymm1, 416(%rdx) + vmovdqu 448(%rdi), %ymm2 + vmovdqu 480(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%r8), %ymm4 + vmovdqu 480(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r15), %ymm10 + vmovdqu 480(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rdx) + vmovdqu %ymm1, 480(%rdx) + addq $0x200, %rdi + addq $0x200, %r8 + subq $2, %r13 + jz L_pointwise_acc_mont_end_encap_v +L_pointwise_acc_mont_start_encap_v: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r15 + vmovdqu (%rdi), %ymm2 + vmovdqu 32(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%r8), %ymm4 + vmovdqu 32(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r15), %ymm10 + vmovdqu 32(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%rdx), %ymm6 + vmovdqu 32(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%r8), %ymm4 + vmovdqu 96(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r15), %ymm10 + vmovdqu 96(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%rdx), %ymm6 + vmovdqu 96(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rdx) + vmovdqu %ymm1, 96(%rdx) + vmovdqu 128(%rdi), %ymm2 + vmovdqu 160(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%r8), %ymm4 + vmovdqu 160(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%rdx), %ymm6 + vmovdqu 160(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rdx) + vmovdqu %ymm1, 160(%rdx) + vmovdqu 192(%rdi), %ymm2 + vmovdqu 224(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%r8), %ymm4 + vmovdqu 224(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r15), %ymm10 + vmovdqu 224(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%rdx), %ymm6 + vmovdqu 224(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rdx) + vmovdqu %ymm1, 224(%rdx) + vmovdqu 256(%rdi), %ymm2 + vmovdqu 288(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%r8), %ymm4 + vmovdqu 288(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%rdx), %ymm6 + vmovdqu 288(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rdx) + vmovdqu %ymm1, 288(%rdx) + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%r8), %ymm4 + vmovdqu 352(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r15), %ymm10 + vmovdqu 352(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%rdx), %ymm6 + vmovdqu 352(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rdx) + vmovdqu %ymm1, 352(%rdx) + vmovdqu 384(%rdi), %ymm2 + vmovdqu 416(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%r8), %ymm4 + vmovdqu 416(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r15), %ymm10 + vmovdqu 416(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%rdx), %ymm6 + vmovdqu 416(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rdx) + vmovdqu %ymm1, 416(%rdx) + vmovdqu 448(%rdi), %ymm2 + vmovdqu 480(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%r8), %ymm4 + vmovdqu 480(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r15), %ymm10 + vmovdqu 480(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%rdx), %ymm6 + vmovdqu 480(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rdx) + vmovdqu %ymm1, 480(%rdx) + addq $0x200, %rdi + addq $0x200, %r8 + subq $0x01, %r13 + jg L_pointwise_acc_mont_start_encap_v +L_pointwise_acc_mont_end_encap_v: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r15 + vmovdqu (%rdi), %ymm2 + vmovdqu 32(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%r8), %ymm4 + vmovdqu 32(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r15), %ymm10 + vmovdqu 32(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%rdx), %ymm6 + vmovdqu 32(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%r8), %ymm4 + vmovdqu 96(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r15), %ymm10 + vmovdqu 96(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%rdx), %ymm6 + vmovdqu 96(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rdx) + vmovdqu %ymm1, 96(%rdx) + vmovdqu 128(%rdi), %ymm2 + vmovdqu 160(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%r8), %ymm4 + vmovdqu 160(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%rdx), %ymm6 + vmovdqu 160(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rdx) + vmovdqu %ymm1, 160(%rdx) + vmovdqu 192(%rdi), %ymm2 + vmovdqu 224(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%r8), %ymm4 + vmovdqu 224(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r15), %ymm10 + vmovdqu 224(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%rdx), %ymm6 + vmovdqu 224(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rdx) + vmovdqu %ymm1, 224(%rdx) + vmovdqu 256(%rdi), %ymm2 + vmovdqu 288(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%r8), %ymm4 + vmovdqu 288(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%rdx), %ymm6 + vmovdqu 288(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rdx) + vmovdqu %ymm1, 288(%rdx) + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%r8), %ymm4 + vmovdqu 352(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r15), %ymm10 + vmovdqu 352(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%rdx), %ymm6 + vmovdqu 352(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rdx) + vmovdqu %ymm1, 352(%rdx) + vmovdqu 384(%rdi), %ymm2 + vmovdqu 416(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%r8), %ymm4 + vmovdqu 416(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r15), %ymm10 + vmovdqu 416(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%rdx), %ymm6 + vmovdqu 416(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rdx) + vmovdqu %ymm1, 416(%rdx) + vmovdqu 448(%rdi), %ymm2 + vmovdqu 480(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%r8), %ymm4 + vmovdqu 480(%r8), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r15), %ymm10 + vmovdqu 480(%r15), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%rdx), %ymm6 + vmovdqu 480(%rdx), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rdx) + vmovdqu %ymm1, 480(%rdx) + addq $0x200, %rdi + addq $0x200, %r8 + movq %r11, %r13 + shl $9, %r13d + subq %r13, %r8 + # invntt + leaq L_kyber_avx2_zetas_inv(%rip), %r15 + vmovdqu (%rdx), %ymm0 + vmovdqu 32(%rdx), %ymm1 + vmovdqu 64(%rdx), %ymm2 + vmovdqu 96(%rdx), %ymm3 + vmovdqu 128(%rdx), %ymm4 + vmovdqu 160(%rdx), %ymm5 + vmovdqu 192(%rdx), %ymm6 + vmovdqu 224(%rdx), %ymm7 + # 2: 1/2 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu (%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm9 + vmovdqu 32(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm0 + vpsrlq $32, %ymm8, %ymm1 + vpblendd $0xaa, %ymm0, %ymm8, %ymm0 + vpblendd $0x55, %ymm1, %ymm9, %ymm1 + vperm2i128 $32, %ymm3, %ymm2, %ymm8 + vmovdqu 64(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm9 + vmovdqu 96(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm2 + vpsrlq $32, %ymm8, %ymm3 + vpblendd $0xaa, %ymm2, %ymm8, %ymm2 + vpblendd $0x55, %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 4: 1/2 + vmovdqu 128(%r15), %ymm10 + vmovdqu 160(%r15), %ymm12 + vmovdqu 192(%r15), %ymm11 + vmovdqu 224(%r15), %ymm13 + vpunpckldq %ymm1, %ymm8, %ymm0 + vpunpckhdq %ymm1, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm9, %ymm2 + vpunpckhdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm2 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm2, %ymm2 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm8, %ymm8 + vpsubw %ymm2, %ymm9, %ymm9 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 8: 1/2 + vmovdqu 256(%r15), %ymm10 + vmovdqu 288(%r15), %ymm12 + vmovdqu 320(%r15), %ymm11 + vmovdqu 352(%r15), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 16: 1/2 + vperm2i128 $32, %ymm1, %ymm8, %ymm0 + vmovdqu 384(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm8, %ymm1 + vmovdqu 416(%r15), %ymm12 + vperm2i128 $32, %ymm3, %ymm9, %ymm2 + vmovdqu 448(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm9, %ymm3 + vmovdqu 480(%r15), %ymm13 + vpsubw %ymm1, %ymm0, %ymm8 + vpsubw %ymm3, %ymm2, %ymm9 + vpaddw %ymm1, %ymm0, %ymm0 + vpaddw %ymm3, %ymm2, %ymm2 + vpmullw %ymm12, %ymm8, %ymm1 + vpmullw %ymm13, %ymm9, %ymm3 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm3, %ymm3 + vpsubw %ymm1, %ymm8, %ymm1 + vpsubw %ymm3, %ymm9, %ymm3 + # 32: 1/2 + vmovdqu 512(%r15), %ymm10 + vmovdqu 544(%r15), %ymm12 + vpaddw %ymm2, %ymm0, %ymm8 + vpaddw %ymm3, %ymm1, %ymm9 + vpsubw %ymm2, %ymm0, %ymm2 + vpsubw %ymm3, %ymm1, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm8, %ymm0 + vpsubw %ymm1, %ymm9, %ymm1 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + # 2: 1/2 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 576(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm9 + vmovdqu 608(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm4 + vpsrlq $32, %ymm8, %ymm5 + vpblendd $0xaa, %ymm4, %ymm8, %ymm4 + vpblendd $0x55, %ymm5, %ymm9, %ymm5 + vperm2i128 $32, %ymm7, %ymm6, %ymm8 + vmovdqu 640(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm9 + vmovdqu 672(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm6 + vpsrlq $32, %ymm8, %ymm7 + vpblendd $0xaa, %ymm6, %ymm8, %ymm6 + vpblendd $0x55, %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 4: 1/2 + vmovdqu 704(%r15), %ymm10 + vmovdqu 736(%r15), %ymm12 + vmovdqu 768(%r15), %ymm11 + vmovdqu 800(%r15), %ymm13 + vpunpckldq %ymm5, %ymm8, %ymm4 + vpunpckhdq %ymm5, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm9, %ymm6 + vpunpckhdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm6 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm6, %ymm6 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm8, %ymm8 + vpsubw %ymm6, %ymm9, %ymm9 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 8: 1/2 + vmovdqu 832(%r15), %ymm10 + vmovdqu 864(%r15), %ymm12 + vmovdqu 896(%r15), %ymm11 + vmovdqu 928(%r15), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 16: 1/2 + vperm2i128 $32, %ymm5, %ymm8, %ymm4 + vmovdqu 960(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm8, %ymm5 + vmovdqu 992(%r15), %ymm12 + vperm2i128 $32, %ymm7, %ymm9, %ymm6 + vmovdqu 1024(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm9, %ymm7 + vmovdqu 1056(%r15), %ymm13 + vpsubw %ymm5, %ymm4, %ymm8 + vpsubw %ymm7, %ymm6, %ymm9 + vpaddw %ymm5, %ymm4, %ymm4 + vpaddw %ymm7, %ymm6, %ymm6 + vpmullw %ymm12, %ymm8, %ymm5 + vpmullw %ymm13, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm5, %ymm8, %ymm5 + vpsubw %ymm7, %ymm9, %ymm7 + # 32: 1/2 + vmovdqu 1088(%r15), %ymm10 + vmovdqu 1120(%r15), %ymm12 + vpaddw %ymm6, %ymm4, %ymm8 + vpaddw %ymm7, %ymm5, %ymm9 + vpsubw %ymm6, %ymm4, %ymm6 + vpsubw %ymm7, %ymm5, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm5 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm5, %ymm5 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + # 64: 1/2 + vmovdqu 1152(%r15), %ymm10 + vmovdqu 1184(%r15), %ymm12 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu %ymm2, 64(%rdx) + vmovdqu %ymm3, 96(%rdx) + vmovdqu %ymm4, 128(%rdx) + vmovdqu %ymm5, 160(%rdx) + vmovdqu %ymm6, 192(%rdx) + vmovdqu %ymm7, 224(%rdx) + vmovdqu 256(%rdx), %ymm0 + vmovdqu 288(%rdx), %ymm1 + vmovdqu 320(%rdx), %ymm2 + vmovdqu 352(%rdx), %ymm3 + vmovdqu 384(%rdx), %ymm4 + vmovdqu 416(%rdx), %ymm5 + vmovdqu 448(%rdx), %ymm6 + vmovdqu 480(%rdx), %ymm7 + # 2: 2/2 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 1216(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm9 + vmovdqu 1248(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm0 + vpsrlq $32, %ymm8, %ymm1 + vpblendd $0xaa, %ymm0, %ymm8, %ymm0 + vpblendd $0x55, %ymm1, %ymm9, %ymm1 + vperm2i128 $32, %ymm3, %ymm2, %ymm8 + vmovdqu 1280(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm9 + vmovdqu 1312(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm2 + vpsrlq $32, %ymm8, %ymm3 + vpblendd $0xaa, %ymm2, %ymm8, %ymm2 + vpblendd $0x55, %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 4: 2/2 + vmovdqu 1344(%r15), %ymm10 + vmovdqu 1376(%r15), %ymm12 + vmovdqu 1408(%r15), %ymm11 + vmovdqu 1440(%r15), %ymm13 + vpunpckldq %ymm1, %ymm8, %ymm0 + vpunpckhdq %ymm1, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm9, %ymm2 + vpunpckhdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm2 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm2, %ymm2 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm8, %ymm8 + vpsubw %ymm2, %ymm9, %ymm9 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 8: 2/2 + vmovdqu 1472(%r15), %ymm10 + vmovdqu 1504(%r15), %ymm12 + vmovdqu 1536(%r15), %ymm11 + vmovdqu 1568(%r15), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 16: 2/2 + vperm2i128 $32, %ymm1, %ymm8, %ymm0 + vmovdqu 1600(%r15), %ymm10 + vperm2i128 $49, %ymm1, %ymm8, %ymm1 + vmovdqu 1632(%r15), %ymm12 + vperm2i128 $32, %ymm3, %ymm9, %ymm2 + vmovdqu 1664(%r15), %ymm11 + vperm2i128 $49, %ymm3, %ymm9, %ymm3 + vmovdqu 1696(%r15), %ymm13 + vpsubw %ymm1, %ymm0, %ymm8 + vpsubw %ymm3, %ymm2, %ymm9 + vpaddw %ymm1, %ymm0, %ymm0 + vpaddw %ymm3, %ymm2, %ymm2 + vpmullw %ymm12, %ymm8, %ymm1 + vpmullw %ymm13, %ymm9, %ymm3 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm3, %ymm3 + vpsubw %ymm1, %ymm8, %ymm1 + vpsubw %ymm3, %ymm9, %ymm3 + # 32: 2/2 + vmovdqu 1728(%r15), %ymm10 + vmovdqu 1760(%r15), %ymm12 + vpaddw %ymm2, %ymm0, %ymm8 + vpaddw %ymm3, %ymm1, %ymm9 + vpsubw %ymm2, %ymm0, %ymm2 + vpsubw %ymm3, %ymm1, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm8, %ymm0 + vpsubw %ymm1, %ymm9, %ymm1 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + # 2: 2/2 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 1792(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm9 + vmovdqu 1824(%r15), %ymm12 + vpsllq $32, %ymm9, %ymm4 + vpsrlq $32, %ymm8, %ymm5 + vpblendd $0xaa, %ymm4, %ymm8, %ymm4 + vpblendd $0x55, %ymm5, %ymm9, %ymm5 + vperm2i128 $32, %ymm7, %ymm6, %ymm8 + vmovdqu 1856(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm9 + vmovdqu 1888(%r15), %ymm13 + vpsllq $32, %ymm9, %ymm6 + vpsrlq $32, %ymm8, %ymm7 + vpblendd $0xaa, %ymm6, %ymm8, %ymm6 + vpblendd $0x55, %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 4: 2/2 + vmovdqu 1920(%r15), %ymm10 + vmovdqu 1952(%r15), %ymm12 + vmovdqu 1984(%r15), %ymm11 + vmovdqu 2016(%r15), %ymm13 + vpunpckldq %ymm5, %ymm8, %ymm4 + vpunpckhdq %ymm5, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm9, %ymm6 + vpunpckhdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm6 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm6, %ymm6 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm8, %ymm8 + vpsubw %ymm6, %ymm9, %ymm9 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 8: 2/2 + vmovdqu 2048(%r15), %ymm10 + vmovdqu 2080(%r15), %ymm12 + vmovdqu 2112(%r15), %ymm11 + vmovdqu 2144(%r15), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 16: 2/2 + vperm2i128 $32, %ymm5, %ymm8, %ymm4 + vmovdqu 2176(%r15), %ymm10 + vperm2i128 $49, %ymm5, %ymm8, %ymm5 + vmovdqu 2208(%r15), %ymm12 + vperm2i128 $32, %ymm7, %ymm9, %ymm6 + vmovdqu 2240(%r15), %ymm11 + vperm2i128 $49, %ymm7, %ymm9, %ymm7 + vmovdqu 2272(%r15), %ymm13 + vpsubw %ymm5, %ymm4, %ymm8 + vpsubw %ymm7, %ymm6, %ymm9 + vpaddw %ymm5, %ymm4, %ymm4 + vpaddw %ymm7, %ymm6, %ymm6 + vpmullw %ymm12, %ymm8, %ymm5 + vpmullw %ymm13, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm5, %ymm8, %ymm5 + vpsubw %ymm7, %ymm9, %ymm7 + # 32: 2/2 + vmovdqu 2304(%r15), %ymm10 + vmovdqu 2336(%r15), %ymm12 + vpaddw %ymm6, %ymm4, %ymm8 + vpaddw %ymm7, %ymm5, %ymm9 + vpsubw %ymm6, %ymm4, %ymm6 + vpsubw %ymm7, %ymm5, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm5 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm5, %ymm5 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + # 64: 2/2 + vmovdqu 2368(%r15), %ymm10 + vmovdqu 2400(%r15), %ymm12 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vmovdqu %ymm0, 256(%rdx) + vmovdqu %ymm1, 288(%rdx) + vmovdqu %ymm2, 320(%rdx) + vmovdqu %ymm3, 352(%rdx) + # 128 + vmovdqu 2432(%r15), %ymm10 + vmovdqu 2464(%r15), %ymm12 + vmovdqu 2496(%r15), %ymm11 + vmovdqu 2528(%r15), %ymm13 + vmovdqu 128(%rdx), %ymm0 + vmovdqu 160(%rdx), %ymm1 + vmovdqu 192(%rdx), %ymm2 + vmovdqu 224(%rdx), %ymm3 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm11, %ymm0, %ymm0 + vpmulhw %ymm11, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm0 + vpsubw %ymm9, %ymm1, %ymm1 + vpmullw %ymm13, %ymm2, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm11, %ymm2, %ymm2 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + vpmullw %ymm13, %ymm4, %ymm8 + vpmullw %ymm13, %ymm5, %ymm9 + vpmulhw %ymm11, %ymm4, %ymm4 + vpmulhw %ymm11, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm4 + vpsubw %ymm9, %ymm5, %ymm5 + vpmullw %ymm13, %ymm6, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm11, %ymm6, %ymm6 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + vmovdqu %ymm0, 128(%rdx) + vmovdqu %ymm1, 160(%rdx) + vmovdqu %ymm2, 192(%rdx) + vmovdqu %ymm3, 224(%rdx) + vmovdqu %ymm4, 384(%rdx) + vmovdqu %ymm5, 416(%rdx) + vmovdqu %ymm6, 448(%rdx) + vmovdqu %ymm7, 480(%rdx) + vmovdqu (%rdx), %ymm0 + vmovdqu 32(%rdx), %ymm1 + vmovdqu 64(%rdx), %ymm2 + vmovdqu 96(%rdx), %ymm3 + vmovdqu 256(%rdx), %ymm4 + vmovdqu 288(%rdx), %ymm5 + vmovdqu 320(%rdx), %ymm6 + vmovdqu 352(%rdx), %ymm7 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm11, %ymm0, %ymm0 + vpmulhw %ymm11, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm0 + vpsubw %ymm9, %ymm1, %ymm1 + vpmullw %ymm13, %ymm2, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm11, %ymm2, %ymm2 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + vpmullw %ymm13, %ymm4, %ymm8 + vpmullw %ymm13, %ymm5, %ymm9 + vpmulhw %ymm11, %ymm4, %ymm4 + vpmulhw %ymm11, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm4 + vpsubw %ymm9, %ymm5, %ymm5 + vpmullw %ymm13, %ymm6, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm11, %ymm6, %ymm6 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu %ymm2, 64(%rdx) + vmovdqu %ymm3, 96(%rdx) + vmovdqu %ymm4, 256(%rdx) + vmovdqu %ymm5, 288(%rdx) + vmovdqu %ymm6, 320(%rdx) + vmovdqu %ymm7, 352(%rdx) + # Add Errors + vmovdqu (%rdx), %ymm0 + vmovdqu 32(%rdx), %ymm1 + vmovdqu 64(%rdx), %ymm2 + vmovdqu 96(%rdx), %ymm3 + vmovdqu (%rax), %ymm4 + vmovdqu 32(%rax), %ymm5 + vmovdqu 64(%rax), %ymm6 + vmovdqu 96(%rax), %ymm7 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu %ymm2, 64(%rdx) + vmovdqu %ymm3, 96(%rdx) + vmovdqu 128(%rdx), %ymm0 + vmovdqu 160(%rdx), %ymm1 + vmovdqu 192(%rdx), %ymm2 + vmovdqu 224(%rdx), %ymm3 + vmovdqu 128(%rax), %ymm4 + vmovdqu 160(%rax), %ymm5 + vmovdqu 192(%rax), %ymm6 + vmovdqu 224(%rax), %ymm7 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%rdx) + vmovdqu %ymm1, 160(%rdx) + vmovdqu %ymm2, 192(%rdx) + vmovdqu %ymm3, 224(%rdx) + vmovdqu 256(%rdx), %ymm0 + vmovdqu 288(%rdx), %ymm1 + vmovdqu 320(%rdx), %ymm2 + vmovdqu 352(%rdx), %ymm3 + vmovdqu 256(%rax), %ymm4 + vmovdqu 288(%rax), %ymm5 + vmovdqu 320(%rax), %ymm6 + vmovdqu 352(%rax), %ymm7 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, 256(%rdx) + vmovdqu %ymm1, 288(%rdx) + vmovdqu %ymm2, 320(%rdx) + vmovdqu %ymm3, 352(%rdx) + vmovdqu 384(%rdx), %ymm0 + vmovdqu 416(%rdx), %ymm1 + vmovdqu 448(%rdx), %ymm2 + vmovdqu 480(%rdx), %ymm3 + vmovdqu 384(%rax), %ymm4 + vmovdqu 416(%rax), %ymm5 + vmovdqu 448(%rax), %ymm6 + vmovdqu 480(%rax), %ymm7 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, 384(%rdx) + vmovdqu %ymm1, 416(%rdx) + vmovdqu %ymm2, 448(%rdx) + vmovdqu %ymm3, 480(%rdx) + # Add Errors + vmovdqu (%rdx), %ymm0 + vmovdqu 32(%rdx), %ymm1 + vmovdqu 64(%rdx), %ymm2 + vmovdqu 96(%rdx), %ymm3 + vmovdqu (%r10), %ymm4 + vmovdqu 32(%r10), %ymm5 + vmovdqu 64(%r10), %ymm6 + vmovdqu 96(%r10), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, (%rdx) + vmovdqu %ymm1, 32(%rdx) + vmovdqu %ymm2, 64(%rdx) + vmovdqu %ymm3, 96(%rdx) + vmovdqu 128(%rdx), %ymm0 + vmovdqu 160(%rdx), %ymm1 + vmovdqu 192(%rdx), %ymm2 + vmovdqu 224(%rdx), %ymm3 + vmovdqu 128(%r10), %ymm4 + vmovdqu 160(%r10), %ymm5 + vmovdqu 192(%r10), %ymm6 + vmovdqu 224(%r10), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 128(%rdx) + vmovdqu %ymm1, 160(%rdx) + vmovdqu %ymm2, 192(%rdx) + vmovdqu %ymm3, 224(%rdx) + vmovdqu 256(%rdx), %ymm0 + vmovdqu 288(%rdx), %ymm1 + vmovdqu 320(%rdx), %ymm2 + vmovdqu 352(%rdx), %ymm3 + vmovdqu 256(%r10), %ymm4 + vmovdqu 288(%r10), %ymm5 + vmovdqu 320(%r10), %ymm6 + vmovdqu 352(%r10), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 256(%rdx) + vmovdqu %ymm1, 288(%rdx) + vmovdqu %ymm2, 320(%rdx) + vmovdqu %ymm3, 352(%rdx) + vmovdqu 384(%rdx), %ymm0 + vmovdqu 416(%rdx), %ymm1 + vmovdqu 448(%rdx), %ymm2 + vmovdqu 480(%rdx), %ymm3 + vmovdqu 384(%r10), %ymm4 + vmovdqu 416(%r10), %ymm5 + vmovdqu 448(%r10), %ymm6 + vmovdqu 480(%r10), %ymm7 + vpaddw %ymm4, %ymm0, %ymm4 + vpaddw %ymm5, %ymm1, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpaddw %ymm6, %ymm2, %ymm6 + vpaddw %ymm7, %ymm3, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 384(%rdx) + vmovdqu %ymm1, 416(%rdx) + vmovdqu %ymm2, 448(%rdx) + vmovdqu %ymm3, 480(%rdx) + vzeroupper + addq $48, %rsp + popq %r15 + popq %r14 + popq %r13 + popq %r12 + repz retq +#ifndef __APPLE__ +.size kyber_encapsulate_avx2,.-kyber_encapsulate_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_decapsulate_avx2 +.type kyber_decapsulate_avx2,@function +.align 16 +kyber_decapsulate_avx2: +#else +.section __TEXT,__text +.globl _kyber_decapsulate_avx2 +.p2align 4 +_kyber_decapsulate_avx2: +#endif /* __APPLE__ */ + vmovdqu kyber_q(%rip), %ymm14 + vmovdqu kyber_v(%rip), %ymm15 + movq %r8, %rax + movq %rdx, %r9 +L_kyber_decapsulate_avx2_trans: + # ntt + leaq L_kyber_avx2_zetas(%rip), %r10 + vmovdqu (%r10), %ymm10 + vmovdqu 32(%r10), %ymm12 + vmovdqu 128(%r9), %ymm0 + vmovdqu 160(%r9), %ymm1 + vmovdqu 192(%r9), %ymm2 + vmovdqu 224(%r9), %ymm3 + vmovdqu 384(%r9), %ymm4 + vmovdqu 416(%r9), %ymm5 + vmovdqu 448(%r9), %ymm6 + vmovdqu 480(%r9), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%r9) + vmovdqu %ymm1, 160(%r9) + vmovdqu %ymm2, 192(%r9) + vmovdqu %ymm3, 224(%r9) + vmovdqu %ymm4, 384(%r9) + vmovdqu %ymm5, 416(%r9) + vmovdqu %ymm6, 448(%r9) + vmovdqu %ymm7, 480(%r9) + vmovdqu (%r9), %ymm0 + vmovdqu 32(%r9), %ymm1 + vmovdqu 64(%r9), %ymm2 + vmovdqu 96(%r9), %ymm3 + vmovdqu 256(%r9), %ymm4 + vmovdqu 288(%r9), %ymm5 + vmovdqu 320(%r9), %ymm6 + vmovdqu 352(%r9), %ymm7 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vmovdqu %ymm4, 256(%r9) + vmovdqu %ymm5, 288(%r9) + vmovdqu %ymm6, 320(%r9) + vmovdqu %ymm7, 352(%r9) + vmovdqu 128(%r9), %ymm4 + vmovdqu 160(%r9), %ymm5 + vmovdqu 192(%r9), %ymm6 + vmovdqu 224(%r9), %ymm7 + # 64: 0/3 + vmovdqu 64(%r10), %ymm10 + vmovdqu 96(%r10), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 0/3 + vmovdqu 128(%r10), %ymm10 + vmovdqu 160(%r10), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 0/3 + vmovdqu 192(%r10), %ymm10 + vmovdqu 224(%r10), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 0/3 + vmovdqu 256(%r10), %ymm10 + vmovdqu 288(%r10), %ymm12 + vmovdqu 320(%r10), %ymm11 + vmovdqu 352(%r10), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 0/3 + vmovdqu 384(%r10), %ymm10 + vmovdqu 416(%r10), %ymm12 + vmovdqu 448(%r10), %ymm11 + vmovdqu 480(%r10), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 0/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 512(%r10), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 544(%r10), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 576(%r10), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 608(%r10), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 640(%r10), %ymm10 + vmovdqu 672(%r10), %ymm12 + vmovdqu 704(%r10), %ymm11 + vmovdqu 736(%r10), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 0/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 768(%r10), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 800(%r10), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 832(%r10), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 864(%r10), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 0/3 + vmovdqu 896(%r10), %ymm10 + vmovdqu 928(%r10), %ymm12 + vmovdqu 960(%r10), %ymm11 + vmovdqu 992(%r10), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 0/3 + vmovdqu 1024(%r10), %ymm10 + vmovdqu 1056(%r10), %ymm12 + vmovdqu 1088(%r10), %ymm11 + vmovdqu 1120(%r10), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 0/3 + vmovdqu 1152(%r10), %ymm10 + vmovdqu 1184(%r10), %ymm12 + vmovdqu 1216(%r10), %ymm11 + vmovdqu 1248(%r10), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vpmulhw %ymm15, %ymm0, %ymm8 + vpmulhw %ymm15, %ymm1, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm8 + vpsubw %ymm9, %ymm1, %ymm9 + vmovdqu %ymm8, (%r9) + vmovdqu %ymm9, 32(%r9) + vpmulhw %ymm15, %ymm2, %ymm8 + vpmulhw %ymm15, %ymm3, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vmovdqu %ymm8, 64(%r9) + vmovdqu %ymm9, 96(%r9) + vpmulhw %ymm15, %ymm4, %ymm8 + vpmulhw %ymm15, %ymm5, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vmovdqu %ymm8, 128(%r9) + vmovdqu %ymm9, 160(%r9) + vpmulhw %ymm15, %ymm6, %ymm8 + vpmulhw %ymm15, %ymm7, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vmovdqu %ymm8, 192(%r9) + vmovdqu %ymm9, 224(%r9) + vmovdqu 256(%r9), %ymm0 + vmovdqu 288(%r9), %ymm1 + vmovdqu 320(%r9), %ymm2 + vmovdqu 352(%r9), %ymm3 + vmovdqu 384(%r9), %ymm4 + vmovdqu 416(%r9), %ymm5 + vmovdqu 448(%r9), %ymm6 + vmovdqu 480(%r9), %ymm7 + # 64: 1/3 + vmovdqu 1280(%r10), %ymm10 + vmovdqu 1312(%r10), %ymm12 + vpmullw %ymm12, %ymm4, %ymm8 + vpmullw %ymm12, %ymm5, %ymm9 + vpmulhw %ymm10, %ymm4, %ymm4 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vpsubw %ymm8, %ymm0, %ymm4 + vpsubw %ymm9, %ymm1, %ymm5 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm2, %ymm6 + vpsubw %ymm9, %ymm3, %ymm7 + vpaddw %ymm8, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + # 32: 1/3 + vmovdqu 1344(%r10), %ymm10 + vmovdqu 1376(%r10), %ymm12 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm2 + vpsubw %ymm9, %ymm1, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + # 32: 1/3 + vmovdqu 1408(%r10), %ymm10 + vmovdqu 1440(%r10), %ymm12 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm6 + vpsubw %ymm9, %ymm5, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + # 16: 1/3 + vmovdqu 1472(%r10), %ymm10 + vmovdqu 1504(%r10), %ymm12 + vmovdqu 1536(%r10), %ymm11 + vmovdqu 1568(%r10), %ymm13 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 16: 1/3 + vmovdqu 1600(%r10), %ymm10 + vmovdqu 1632(%r10), %ymm12 + vmovdqu 1664(%r10), %ymm11 + vmovdqu 1696(%r10), %ymm13 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 8: 1/3 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 1728(%r10), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm1 + vmovdqu 1760(%r10), %ymm12 + vperm2i128 $32, %ymm3, %ymm2, %ymm9 + vmovdqu 1792(%r10), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm3 + vmovdqu 1824(%r10), %ymm13 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm0 + vpsubw %ymm2, %ymm3, %ymm2 + vpsubw %ymm0, %ymm8, %ymm1 + vpsubw %ymm2, %ymm9, %ymm3 + vpaddw %ymm0, %ymm8, %ymm8 + vpaddw %ymm2, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 1856(%r10), %ymm10 + vmovdqu 1888(%r10), %ymm12 + vmovdqu 1920(%r10), %ymm11 + vmovdqu 1952(%r10), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 8: 1/3 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 1984(%r10), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm5 + vmovdqu 2016(%r10), %ymm12 + vperm2i128 $32, %ymm7, %ymm6, %ymm9 + vmovdqu 2048(%r10), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm7 + vmovdqu 2080(%r10), %ymm13 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm4 + vpsubw %ymm6, %ymm7, %ymm6 + vpsubw %ymm4, %ymm8, %ymm5 + vpsubw %ymm6, %ymm9, %ymm7 + vpaddw %ymm4, %ymm8, %ymm8 + vpaddw %ymm6, %ymm9, %ymm9 + # 4: 1/3 + vmovdqu 2112(%r10), %ymm10 + vmovdqu 2144(%r10), %ymm12 + vmovdqu 2176(%r10), %ymm11 + vmovdqu 2208(%r10), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + # 2: 1/3 + vmovdqu 2240(%r10), %ymm10 + vmovdqu 2272(%r10), %ymm12 + vmovdqu 2304(%r10), %ymm11 + vmovdqu 2336(%r10), %ymm13 + vpsllq $32, %ymm1, %ymm8 + vpsrlq $32, %ymm0, %ymm9 + vpblendd $0xaa, %ymm8, %ymm0, %ymm0 + vpblendd $0x55, %ymm9, %ymm1, %ymm1 + vpsllq $32, %ymm3, %ymm8 + vpsrlq $32, %ymm2, %ymm9 + vpblendd $0xaa, %ymm8, %ymm2, %ymm2 + vpblendd $0x55, %ymm9, %ymm3, %ymm3 + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm1, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vpsubw %ymm8, %ymm0, %ymm1 + vpsubw %ymm9, %ymm2, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm2, %ymm2 + # 2: 1/3 + vmovdqu 2368(%r10), %ymm10 + vmovdqu 2400(%r10), %ymm12 + vmovdqu 2432(%r10), %ymm11 + vmovdqu 2464(%r10), %ymm13 + vpsllq $32, %ymm5, %ymm8 + vpsrlq $32, %ymm4, %ymm9 + vpblendd $0xaa, %ymm8, %ymm4, %ymm4 + vpblendd $0x55, %ymm9, %ymm5, %ymm5 + vpsllq $32, %ymm7, %ymm8 + vpsrlq $32, %ymm6, %ymm9 + vpblendd $0xaa, %ymm8, %ymm6, %ymm6 + vpblendd $0x55, %ymm9, %ymm7, %ymm7 + vpmullw %ymm12, %ymm5, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm5, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vpsubw %ymm8, %ymm4, %ymm5 + vpsubw %ymm9, %ymm6, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm6, %ymm6 + vpunpckldq %ymm1, %ymm0, %ymm8 + vpunpckhdq %ymm1, %ymm0, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm0 + vperm2i128 $49, %ymm9, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm2, %ymm8 + vpunpckhdq %ymm3, %ymm2, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm2 + vperm2i128 $49, %ymm9, %ymm8, %ymm3 + vpunpckldq %ymm5, %ymm4, %ymm8 + vpunpckhdq %ymm5, %ymm4, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm4 + vperm2i128 $49, %ymm9, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm6, %ymm8 + vpunpckhdq %ymm7, %ymm6, %ymm9 + vperm2i128 $32, %ymm9, %ymm8, %ymm6 + vperm2i128 $49, %ymm9, %ymm8, %ymm7 + vpmulhw %ymm15, %ymm0, %ymm8 + vpmulhw %ymm15, %ymm1, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm8 + vpsubw %ymm9, %ymm1, %ymm9 + vmovdqu %ymm8, 256(%r9) + vmovdqu %ymm9, 288(%r9) + vpmulhw %ymm15, %ymm2, %ymm8 + vpmulhw %ymm15, %ymm3, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm8 + vpsubw %ymm9, %ymm3, %ymm9 + vmovdqu %ymm8, 320(%r9) + vmovdqu %ymm9, 352(%r9) + vpmulhw %ymm15, %ymm4, %ymm8 + vpmulhw %ymm15, %ymm5, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm8 + vpsubw %ymm9, %ymm5, %ymm9 + vmovdqu %ymm8, 384(%r9) + vmovdqu %ymm9, 416(%r9) + vpmulhw %ymm15, %ymm6, %ymm8 + vpmulhw %ymm15, %ymm7, %ymm9 + vpsraw $10, %ymm8, %ymm8 + vpsraw $10, %ymm9, %ymm9 + vpmullw %ymm14, %ymm8, %ymm8 + vpmullw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm8 + vpsubw %ymm9, %ymm7, %ymm9 + vmovdqu %ymm8, 448(%r9) + vmovdqu %ymm9, 480(%r9) + addq $0x200, %r9 + subq $0x01, %rax + jg L_kyber_decapsulate_avx2_trans + vmovdqu kyber_qinv(%rip), %ymm12 + # Pointwise acc mont + movq %r8, %rax + # Base mul mont + leaq L_kyber_avx2_zetas_basemul(%rip), %r10 + vmovdqu (%rdi), %ymm2 + vmovdqu 32(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%rdx), %ymm4 + vmovdqu 32(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r10), %ymm10 + vmovdqu 32(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%rdx), %ymm4 + vmovdqu 96(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r10), %ymm10 + vmovdqu 96(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm1, 96(%rsi) + vmovdqu 128(%rdi), %ymm2 + vmovdqu 160(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%rdx), %ymm4 + vmovdqu 160(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r10), %ymm10 + vmovdqu 160(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu 192(%rdi), %ymm2 + vmovdqu 224(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%rdx), %ymm4 + vmovdqu 224(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r10), %ymm10 + vmovdqu 224(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rsi) + vmovdqu %ymm1, 224(%rsi) + vmovdqu 256(%rdi), %ymm2 + vmovdqu 288(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%rdx), %ymm4 + vmovdqu 288(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r10), %ymm10 + vmovdqu 288(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%rdx), %ymm4 + vmovdqu 352(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r10), %ymm10 + vmovdqu 352(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rsi) + vmovdqu %ymm1, 352(%rsi) + vmovdqu 384(%rdi), %ymm2 + vmovdqu 416(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%rdx), %ymm4 + vmovdqu 416(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r10), %ymm10 + vmovdqu 416(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu 448(%rdi), %ymm2 + vmovdqu 480(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%rdx), %ymm4 + vmovdqu 480(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r10), %ymm10 + vmovdqu 480(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rsi) + vmovdqu %ymm1, 480(%rsi) + addq $0x200, %rdi + addq $0x200, %rdx + subq $2, %rax + jz L_pointwise_acc_mont_end_decap +L_pointwise_acc_mont_start_decap: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r10 + vmovdqu (%rdi), %ymm2 + vmovdqu 32(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%rdx), %ymm4 + vmovdqu 32(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r10), %ymm10 + vmovdqu 32(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%rsi), %ymm6 + vmovdqu 32(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%rdx), %ymm4 + vmovdqu 96(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r10), %ymm10 + vmovdqu 96(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%rsi), %ymm6 + vmovdqu 96(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm1, 96(%rsi) + vmovdqu 128(%rdi), %ymm2 + vmovdqu 160(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%rdx), %ymm4 + vmovdqu 160(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r10), %ymm10 + vmovdqu 160(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%rsi), %ymm6 + vmovdqu 160(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu 192(%rdi), %ymm2 + vmovdqu 224(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%rdx), %ymm4 + vmovdqu 224(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r10), %ymm10 + vmovdqu 224(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%rsi), %ymm6 + vmovdqu 224(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rsi) + vmovdqu %ymm1, 224(%rsi) + vmovdqu 256(%rdi), %ymm2 + vmovdqu 288(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%rdx), %ymm4 + vmovdqu 288(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r10), %ymm10 + vmovdqu 288(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%rsi), %ymm6 + vmovdqu 288(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%rdx), %ymm4 + vmovdqu 352(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r10), %ymm10 + vmovdqu 352(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%rsi), %ymm6 + vmovdqu 352(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rsi) + vmovdqu %ymm1, 352(%rsi) + vmovdqu 384(%rdi), %ymm2 + vmovdqu 416(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%rdx), %ymm4 + vmovdqu 416(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r10), %ymm10 + vmovdqu 416(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%rsi), %ymm6 + vmovdqu 416(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu 448(%rdi), %ymm2 + vmovdqu 480(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%rdx), %ymm4 + vmovdqu 480(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r10), %ymm10 + vmovdqu 480(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%rsi), %ymm6 + vmovdqu 480(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rsi) + vmovdqu %ymm1, 480(%rsi) + addq $0x200, %rdi + addq $0x200, %rdx + subq $0x01, %rax + jg L_pointwise_acc_mont_start_decap +L_pointwise_acc_mont_end_decap: + # Base mul mont add + leaq L_kyber_avx2_zetas_basemul(%rip), %r10 + vmovdqu (%rdi), %ymm2 + vmovdqu 32(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu (%rdx), %ymm4 + vmovdqu 32(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu (%r10), %ymm10 + vmovdqu 32(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu (%rsi), %ymm6 + vmovdqu 32(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 64(%rdx), %ymm4 + vmovdqu 96(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 64(%r10), %ymm10 + vmovdqu 96(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 64(%rsi), %ymm6 + vmovdqu 96(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm1, 96(%rsi) + vmovdqu 128(%rdi), %ymm2 + vmovdqu 160(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 128(%rdx), %ymm4 + vmovdqu 160(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 128(%r10), %ymm10 + vmovdqu 160(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 128(%rsi), %ymm6 + vmovdqu 160(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu 192(%rdi), %ymm2 + vmovdqu 224(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 192(%rdx), %ymm4 + vmovdqu 224(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 192(%r10), %ymm10 + vmovdqu 224(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 192(%rsi), %ymm6 + vmovdqu 224(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 192(%rsi) + vmovdqu %ymm1, 224(%rsi) + vmovdqu 256(%rdi), %ymm2 + vmovdqu 288(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 256(%rdx), %ymm4 + vmovdqu 288(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 256(%r10), %ymm10 + vmovdqu 288(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 256(%rsi), %ymm6 + vmovdqu 288(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 320(%rdx), %ymm4 + vmovdqu 352(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 320(%r10), %ymm10 + vmovdqu 352(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 320(%rsi), %ymm6 + vmovdqu 352(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 320(%rsi) + vmovdqu %ymm1, 352(%rsi) + vmovdqu 384(%rdi), %ymm2 + vmovdqu 416(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 384(%rdx), %ymm4 + vmovdqu 416(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 384(%r10), %ymm10 + vmovdqu 416(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 384(%rsi), %ymm6 + vmovdqu 416(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu 448(%rdi), %ymm2 + vmovdqu 480(%rdi), %ymm3 + vpslld $16, %ymm3, %ymm6 + vpsrld $16, %ymm2, %ymm7 + vpblendw $0xaa, %ymm6, %ymm2, %ymm2 + vpblendw $0x55, %ymm7, %ymm3, %ymm3 + vmovdqu 448(%rdx), %ymm4 + vmovdqu 480(%rdx), %ymm5 + vpslld $16, %ymm5, %ymm6 + vpsrld $16, %ymm4, %ymm7 + vpblendw $0xaa, %ymm6, %ymm4, %ymm4 + vpblendw $0x55, %ymm7, %ymm5, %ymm5 + vmovdqu 448(%r10), %ymm10 + vmovdqu 480(%r10), %ymm11 + vpmullw %ymm5, %ymm3, %ymm0 + vpmulhw %ymm5, %ymm3, %ymm6 + vpmullw %ymm4, %ymm2, %ymm1 + vpmulhw %ymm4, %ymm2, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm0, %ymm8 + vpmullw %ymm12, %ymm1, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm0 + vpsubw %ymm9, %ymm7, %ymm1 + vpmullw %ymm11, %ymm0, %ymm6 + vpmulhw %ymm10, %ymm0, %ymm7 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm6, %ymm7, %ymm0 + vpaddw %ymm1, %ymm0, %ymm0 + vpmullw %ymm5, %ymm2, %ymm1 + vpmulhw %ymm5, %ymm2, %ymm6 + vpmullw %ymm4, %ymm3, %ymm2 + vpmulhw %ymm4, %ymm3, %ymm7 + # Mont Reduce + vpmullw %ymm12, %ymm1, %ymm8 + vpmullw %ymm12, %ymm2, %ymm9 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm1 + vpsubw %ymm9, %ymm7, %ymm2 + vpaddw %ymm2, %ymm1, %ymm1 + vmovdqu 448(%rsi), %ymm6 + vmovdqu 480(%rsi), %ymm7 + vpaddw %ymm6, %ymm0, %ymm0 + vpaddw %ymm7, %ymm1, %ymm1 + vpslld $16, %ymm1, %ymm6 + vpsrld $16, %ymm0, %ymm7 + vpblendw $0xaa, %ymm6, %ymm0, %ymm0 + vpblendw $0x55, %ymm7, %ymm1, %ymm1 + vmovdqu %ymm0, 448(%rsi) + vmovdqu %ymm1, 480(%rsi) + addq $0x200, %rdi + addq $0x200, %rdx + movq %r8, %rax + shl $9, %eax + subq %rax, %rdx + # invntt + leaq L_kyber_avx2_zetas_inv(%rip), %r10 + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu 128(%rsi), %ymm4 + vmovdqu 160(%rsi), %ymm5 + vmovdqu 192(%rsi), %ymm6 + vmovdqu 224(%rsi), %ymm7 + # 2: 1/2 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu (%r10), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm9 + vmovdqu 32(%r10), %ymm12 + vpsllq $32, %ymm9, %ymm0 + vpsrlq $32, %ymm8, %ymm1 + vpblendd $0xaa, %ymm0, %ymm8, %ymm0 + vpblendd $0x55, %ymm1, %ymm9, %ymm1 + vperm2i128 $32, %ymm3, %ymm2, %ymm8 + vmovdqu 64(%r10), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm9 + vmovdqu 96(%r10), %ymm13 + vpsllq $32, %ymm9, %ymm2 + vpsrlq $32, %ymm8, %ymm3 + vpblendd $0xaa, %ymm2, %ymm8, %ymm2 + vpblendd $0x55, %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 4: 1/2 + vmovdqu 128(%r10), %ymm10 + vmovdqu 160(%r10), %ymm12 + vmovdqu 192(%r10), %ymm11 + vmovdqu 224(%r10), %ymm13 + vpunpckldq %ymm1, %ymm8, %ymm0 + vpunpckhdq %ymm1, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm9, %ymm2 + vpunpckhdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm2 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm2, %ymm2 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm8, %ymm8 + vpsubw %ymm2, %ymm9, %ymm9 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 8: 1/2 + vmovdqu 256(%r10), %ymm10 + vmovdqu 288(%r10), %ymm12 + vmovdqu 320(%r10), %ymm11 + vmovdqu 352(%r10), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 16: 1/2 + vperm2i128 $32, %ymm1, %ymm8, %ymm0 + vmovdqu 384(%r10), %ymm10 + vperm2i128 $49, %ymm1, %ymm8, %ymm1 + vmovdqu 416(%r10), %ymm12 + vperm2i128 $32, %ymm3, %ymm9, %ymm2 + vmovdqu 448(%r10), %ymm11 + vperm2i128 $49, %ymm3, %ymm9, %ymm3 + vmovdqu 480(%r10), %ymm13 + vpsubw %ymm1, %ymm0, %ymm8 + vpsubw %ymm3, %ymm2, %ymm9 + vpaddw %ymm1, %ymm0, %ymm0 + vpaddw %ymm3, %ymm2, %ymm2 + vpmullw %ymm12, %ymm8, %ymm1 + vpmullw %ymm13, %ymm9, %ymm3 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm3, %ymm3 + vpsubw %ymm1, %ymm8, %ymm1 + vpsubw %ymm3, %ymm9, %ymm3 + # 32: 1/2 + vmovdqu 512(%r10), %ymm10 + vmovdqu 544(%r10), %ymm12 + vpaddw %ymm2, %ymm0, %ymm8 + vpaddw %ymm3, %ymm1, %ymm9 + vpsubw %ymm2, %ymm0, %ymm2 + vpsubw %ymm3, %ymm1, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm8, %ymm0 + vpsubw %ymm1, %ymm9, %ymm1 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + # 2: 1/2 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 576(%r10), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm9 + vmovdqu 608(%r10), %ymm12 + vpsllq $32, %ymm9, %ymm4 + vpsrlq $32, %ymm8, %ymm5 + vpblendd $0xaa, %ymm4, %ymm8, %ymm4 + vpblendd $0x55, %ymm5, %ymm9, %ymm5 + vperm2i128 $32, %ymm7, %ymm6, %ymm8 + vmovdqu 640(%r10), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm9 + vmovdqu 672(%r10), %ymm13 + vpsllq $32, %ymm9, %ymm6 + vpsrlq $32, %ymm8, %ymm7 + vpblendd $0xaa, %ymm6, %ymm8, %ymm6 + vpblendd $0x55, %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 4: 1/2 + vmovdqu 704(%r10), %ymm10 + vmovdqu 736(%r10), %ymm12 + vmovdqu 768(%r10), %ymm11 + vmovdqu 800(%r10), %ymm13 + vpunpckldq %ymm5, %ymm8, %ymm4 + vpunpckhdq %ymm5, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm9, %ymm6 + vpunpckhdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm6 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm6, %ymm6 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm8, %ymm8 + vpsubw %ymm6, %ymm9, %ymm9 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 8: 1/2 + vmovdqu 832(%r10), %ymm10 + vmovdqu 864(%r10), %ymm12 + vmovdqu 896(%r10), %ymm11 + vmovdqu 928(%r10), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 16: 1/2 + vperm2i128 $32, %ymm5, %ymm8, %ymm4 + vmovdqu 960(%r10), %ymm10 + vperm2i128 $49, %ymm5, %ymm8, %ymm5 + vmovdqu 992(%r10), %ymm12 + vperm2i128 $32, %ymm7, %ymm9, %ymm6 + vmovdqu 1024(%r10), %ymm11 + vperm2i128 $49, %ymm7, %ymm9, %ymm7 + vmovdqu 1056(%r10), %ymm13 + vpsubw %ymm5, %ymm4, %ymm8 + vpsubw %ymm7, %ymm6, %ymm9 + vpaddw %ymm5, %ymm4, %ymm4 + vpaddw %ymm7, %ymm6, %ymm6 + vpmullw %ymm12, %ymm8, %ymm5 + vpmullw %ymm13, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm5, %ymm8, %ymm5 + vpsubw %ymm7, %ymm9, %ymm7 + # 32: 1/2 + vmovdqu 1088(%r10), %ymm10 + vmovdqu 1120(%r10), %ymm12 + vpaddw %ymm6, %ymm4, %ymm8 + vpaddw %ymm7, %ymm5, %ymm9 + vpsubw %ymm6, %ymm4, %ymm6 + vpsubw %ymm7, %ymm5, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm5 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm5, %ymm5 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + # 64: 1/2 + vmovdqu 1152(%r10), %ymm10 + vmovdqu 1184(%r10), %ymm12 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu %ymm2, 64(%rsi) + vmovdqu %ymm3, 96(%rsi) + vmovdqu %ymm4, 128(%rsi) + vmovdqu %ymm5, 160(%rsi) + vmovdqu %ymm6, 192(%rsi) + vmovdqu %ymm7, 224(%rsi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm1 + vmovdqu 320(%rsi), %ymm2 + vmovdqu 352(%rsi), %ymm3 + vmovdqu 384(%rsi), %ymm4 + vmovdqu 416(%rsi), %ymm5 + vmovdqu 448(%rsi), %ymm6 + vmovdqu 480(%rsi), %ymm7 + # 2: 2/2 + vperm2i128 $32, %ymm1, %ymm0, %ymm8 + vmovdqu 1216(%r10), %ymm10 + vperm2i128 $49, %ymm1, %ymm0, %ymm9 + vmovdqu 1248(%r10), %ymm12 + vpsllq $32, %ymm9, %ymm0 + vpsrlq $32, %ymm8, %ymm1 + vpblendd $0xaa, %ymm0, %ymm8, %ymm0 + vpblendd $0x55, %ymm1, %ymm9, %ymm1 + vperm2i128 $32, %ymm3, %ymm2, %ymm8 + vmovdqu 1280(%r10), %ymm11 + vperm2i128 $49, %ymm3, %ymm2, %ymm9 + vmovdqu 1312(%r10), %ymm13 + vpsllq $32, %ymm9, %ymm2 + vpsrlq $32, %ymm8, %ymm3 + vpblendd $0xaa, %ymm2, %ymm8, %ymm2 + vpblendd $0x55, %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 4: 2/2 + vmovdqu 1344(%r10), %ymm10 + vmovdqu 1376(%r10), %ymm12 + vmovdqu 1408(%r10), %ymm11 + vmovdqu 1440(%r10), %ymm13 + vpunpckldq %ymm1, %ymm8, %ymm0 + vpunpckhdq %ymm1, %ymm8, %ymm1 + vpunpckldq %ymm3, %ymm9, %ymm2 + vpunpckhdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm2 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm2, %ymm2 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm8, %ymm8 + vpsubw %ymm2, %ymm9, %ymm9 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 8: 2/2 + vmovdqu 1472(%r10), %ymm10 + vmovdqu 1504(%r10), %ymm12 + vmovdqu 1536(%r10), %ymm11 + vmovdqu 1568(%r10), %ymm13 + vpunpcklqdq %ymm1, %ymm8, %ymm0 + vpunpckhqdq %ymm1, %ymm8, %ymm1 + vpunpcklqdq %ymm3, %ymm9, %ymm2 + vpunpckhqdq %ymm3, %ymm9, %ymm3 + vpaddw %ymm1, %ymm0, %ymm8 + vpaddw %ymm3, %ymm2, %ymm9 + vpsubw %ymm1, %ymm0, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpmullw %ymm12, %ymm1, %ymm0 + vpmullw %ymm13, %ymm3, %ymm2 + vpmulhw %ymm10, %ymm1, %ymm1 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm0, %ymm0 + vpmulhw %ymm14, %ymm2, %ymm2 + vpsubw %ymm0, %ymm1, %ymm1 + vpsubw %ymm2, %ymm3, %ymm3 + # 16: 2/2 + vperm2i128 $32, %ymm1, %ymm8, %ymm0 + vmovdqu 1600(%r10), %ymm10 + vperm2i128 $49, %ymm1, %ymm8, %ymm1 + vmovdqu 1632(%r10), %ymm12 + vperm2i128 $32, %ymm3, %ymm9, %ymm2 + vmovdqu 1664(%r10), %ymm11 + vperm2i128 $49, %ymm3, %ymm9, %ymm3 + vmovdqu 1696(%r10), %ymm13 + vpsubw %ymm1, %ymm0, %ymm8 + vpsubw %ymm3, %ymm2, %ymm9 + vpaddw %ymm1, %ymm0, %ymm0 + vpaddw %ymm3, %ymm2, %ymm2 + vpmullw %ymm12, %ymm8, %ymm1 + vpmullw %ymm13, %ymm9, %ymm3 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm3, %ymm3 + vpsubw %ymm1, %ymm8, %ymm1 + vpsubw %ymm3, %ymm9, %ymm3 + # 32: 2/2 + vmovdqu 1728(%r10), %ymm10 + vmovdqu 1760(%r10), %ymm12 + vpaddw %ymm2, %ymm0, %ymm8 + vpaddw %ymm3, %ymm1, %ymm9 + vpsubw %ymm2, %ymm0, %ymm2 + vpsubw %ymm3, %ymm1, %ymm3 + vpmulhw %ymm15, %ymm8, %ymm0 + vpmulhw %ymm15, %ymm9, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm8, %ymm0 + vpsubw %ymm1, %ymm9, %ymm1 + vpmullw %ymm12, %ymm2, %ymm8 + vpmullw %ymm12, %ymm3, %ymm9 + vpmulhw %ymm10, %ymm2, %ymm2 + vpmulhw %ymm10, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + # 2: 2/2 + vperm2i128 $32, %ymm5, %ymm4, %ymm8 + vmovdqu 1792(%r10), %ymm10 + vperm2i128 $49, %ymm5, %ymm4, %ymm9 + vmovdqu 1824(%r10), %ymm12 + vpsllq $32, %ymm9, %ymm4 + vpsrlq $32, %ymm8, %ymm5 + vpblendd $0xaa, %ymm4, %ymm8, %ymm4 + vpblendd $0x55, %ymm5, %ymm9, %ymm5 + vperm2i128 $32, %ymm7, %ymm6, %ymm8 + vmovdqu 1856(%r10), %ymm11 + vperm2i128 $49, %ymm7, %ymm6, %ymm9 + vmovdqu 1888(%r10), %ymm13 + vpsllq $32, %ymm9, %ymm6 + vpsrlq $32, %ymm8, %ymm7 + vpblendd $0xaa, %ymm6, %ymm8, %ymm6 + vpblendd $0x55, %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 4: 2/2 + vmovdqu 1920(%r10), %ymm10 + vmovdqu 1952(%r10), %ymm12 + vmovdqu 1984(%r10), %ymm11 + vmovdqu 2016(%r10), %ymm13 + vpunpckldq %ymm5, %ymm8, %ymm4 + vpunpckhdq %ymm5, %ymm8, %ymm5 + vpunpckldq %ymm7, %ymm9, %ymm6 + vpunpckhdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm6 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm6, %ymm6 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm8, %ymm8 + vpsubw %ymm6, %ymm9, %ymm9 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 8: 2/2 + vmovdqu 2048(%r10), %ymm10 + vmovdqu 2080(%r10), %ymm12 + vmovdqu 2112(%r10), %ymm11 + vmovdqu 2144(%r10), %ymm13 + vpunpcklqdq %ymm5, %ymm8, %ymm4 + vpunpckhqdq %ymm5, %ymm8, %ymm5 + vpunpcklqdq %ymm7, %ymm9, %ymm6 + vpunpckhqdq %ymm7, %ymm9, %ymm7 + vpaddw %ymm5, %ymm4, %ymm8 + vpaddw %ymm7, %ymm6, %ymm9 + vpsubw %ymm5, %ymm4, %ymm5 + vpsubw %ymm7, %ymm6, %ymm7 + vpmullw %ymm12, %ymm5, %ymm4 + vpmullw %ymm13, %ymm7, %ymm6 + vpmulhw %ymm10, %ymm5, %ymm5 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm6, %ymm6 + vpsubw %ymm4, %ymm5, %ymm5 + vpsubw %ymm6, %ymm7, %ymm7 + # 16: 2/2 + vperm2i128 $32, %ymm5, %ymm8, %ymm4 + vmovdqu 2176(%r10), %ymm10 + vperm2i128 $49, %ymm5, %ymm8, %ymm5 + vmovdqu 2208(%r10), %ymm12 + vperm2i128 $32, %ymm7, %ymm9, %ymm6 + vmovdqu 2240(%r10), %ymm11 + vperm2i128 $49, %ymm7, %ymm9, %ymm7 + vmovdqu 2272(%r10), %ymm13 + vpsubw %ymm5, %ymm4, %ymm8 + vpsubw %ymm7, %ymm6, %ymm9 + vpaddw %ymm5, %ymm4, %ymm4 + vpaddw %ymm7, %ymm6, %ymm6 + vpmullw %ymm12, %ymm8, %ymm5 + vpmullw %ymm13, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm11, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm5, %ymm8, %ymm5 + vpsubw %ymm7, %ymm9, %ymm7 + # 32: 2/2 + vmovdqu 2304(%r10), %ymm10 + vmovdqu 2336(%r10), %ymm12 + vpaddw %ymm6, %ymm4, %ymm8 + vpaddw %ymm7, %ymm5, %ymm9 + vpsubw %ymm6, %ymm4, %ymm6 + vpsubw %ymm7, %ymm5, %ymm7 + vpmulhw %ymm15, %ymm8, %ymm4 + vpmulhw %ymm15, %ymm9, %ymm5 + vpsraw $10, %ymm4, %ymm4 + vpsraw $10, %ymm5, %ymm5 + vpmullw %ymm14, %ymm4, %ymm4 + vpmullw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpmullw %ymm12, %ymm6, %ymm8 + vpmullw %ymm12, %ymm7, %ymm9 + vpmulhw %ymm10, %ymm6, %ymm6 + vpmulhw %ymm10, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + # 64: 2/2 + vmovdqu 2368(%r10), %ymm10 + vmovdqu 2400(%r10), %ymm12 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu %ymm2, 320(%rsi) + vmovdqu %ymm3, 352(%rsi) + # 128 + vmovdqu 2432(%r10), %ymm10 + vmovdqu 2464(%r10), %ymm12 + vmovdqu 2496(%r10), %ymm11 + vmovdqu 2528(%r10), %ymm13 + vmovdqu 128(%rsi), %ymm0 + vmovdqu 160(%rsi), %ymm1 + vmovdqu 192(%rsi), %ymm2 + vmovdqu 224(%rsi), %ymm3 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm11, %ymm0, %ymm0 + vpmulhw %ymm11, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm0 + vpsubw %ymm9, %ymm1, %ymm1 + vpmullw %ymm13, %ymm2, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm11, %ymm2, %ymm2 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + vpmullw %ymm13, %ymm4, %ymm8 + vpmullw %ymm13, %ymm5, %ymm9 + vpmulhw %ymm11, %ymm4, %ymm4 + vpmulhw %ymm11, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm4 + vpsubw %ymm9, %ymm5, %ymm5 + vpmullw %ymm13, %ymm6, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm11, %ymm6, %ymm6 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu %ymm2, 192(%rsi) + vmovdqu %ymm3, 224(%rsi) + vmovdqu %ymm4, 384(%rsi) + vmovdqu %ymm5, 416(%rsi) + vmovdqu %ymm6, 448(%rsi) + vmovdqu %ymm7, 480(%rsi) + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu 256(%rsi), %ymm4 + vmovdqu 288(%rsi), %ymm5 + vmovdqu 320(%rsi), %ymm6 + vmovdqu 352(%rsi), %ymm7 + vpsubw %ymm4, %ymm0, %ymm8 + vpsubw %ymm5, %ymm1, %ymm9 + vpaddw %ymm4, %ymm0, %ymm0 + vpaddw %ymm5, %ymm1, %ymm1 + vpmullw %ymm12, %ymm8, %ymm4 + vpmullw %ymm12, %ymm9, %ymm5 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm4, %ymm4 + vpmulhw %ymm14, %ymm5, %ymm5 + vpsubw %ymm4, %ymm8, %ymm4 + vpsubw %ymm5, %ymm9, %ymm5 + vpsubw %ymm6, %ymm2, %ymm8 + vpsubw %ymm7, %ymm3, %ymm9 + vpaddw %ymm6, %ymm2, %ymm2 + vpaddw %ymm7, %ymm3, %ymm3 + vpmullw %ymm12, %ymm8, %ymm6 + vpmullw %ymm12, %ymm9, %ymm7 + vpmulhw %ymm10, %ymm8, %ymm8 + vpmulhw %ymm10, %ymm9, %ymm9 + vpmulhw %ymm14, %ymm6, %ymm6 + vpmulhw %ymm14, %ymm7, %ymm7 + vpsubw %ymm6, %ymm8, %ymm6 + vpsubw %ymm7, %ymm9, %ymm7 + vpmullw %ymm13, %ymm0, %ymm8 + vpmullw %ymm13, %ymm1, %ymm9 + vpmulhw %ymm11, %ymm0, %ymm0 + vpmulhw %ymm11, %ymm1, %ymm1 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm0, %ymm0 + vpsubw %ymm9, %ymm1, %ymm1 + vpmullw %ymm13, %ymm2, %ymm8 + vpmullw %ymm13, %ymm3, %ymm9 + vpmulhw %ymm11, %ymm2, %ymm2 + vpmulhw %ymm11, %ymm3, %ymm3 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm2, %ymm2 + vpsubw %ymm9, %ymm3, %ymm3 + vpmullw %ymm13, %ymm4, %ymm8 + vpmullw %ymm13, %ymm5, %ymm9 + vpmulhw %ymm11, %ymm4, %ymm4 + vpmulhw %ymm11, %ymm5, %ymm5 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm4, %ymm4 + vpsubw %ymm9, %ymm5, %ymm5 + vpmullw %ymm13, %ymm6, %ymm8 + vpmullw %ymm13, %ymm7, %ymm9 + vpmulhw %ymm11, %ymm6, %ymm6 + vpmulhw %ymm11, %ymm7, %ymm7 + vpmulhw %ymm14, %ymm8, %ymm8 + vpmulhw %ymm14, %ymm9, %ymm9 + vpsubw %ymm8, %ymm6, %ymm6 + vpsubw %ymm9, %ymm7, %ymm7 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu %ymm2, 64(%rsi) + vmovdqu %ymm3, 96(%rsi) + vmovdqu %ymm4, 256(%rsi) + vmovdqu %ymm5, 288(%rsi) + vmovdqu %ymm6, 320(%rsi) + vmovdqu %ymm7, 352(%rsi) + # Sub Errors + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu (%rcx), %ymm4 + vmovdqu 32(%rcx), %ymm5 + vmovdqu 64(%rcx), %ymm6 + vmovdqu 96(%rcx), %ymm7 + vpsubw %ymm0, %ymm4, %ymm4 + vpsubw %ymm1, %ymm5, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpsubw %ymm2, %ymm6, %ymm6 + vpsubw %ymm3, %ymm7, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm1, 32(%rsi) + vmovdqu %ymm2, 64(%rsi) + vmovdqu %ymm3, 96(%rsi) + vmovdqu 128(%rsi), %ymm0 + vmovdqu 160(%rsi), %ymm1 + vmovdqu 192(%rsi), %ymm2 + vmovdqu 224(%rsi), %ymm3 + vmovdqu 128(%rcx), %ymm4 + vmovdqu 160(%rcx), %ymm5 + vmovdqu 192(%rcx), %ymm6 + vmovdqu 224(%rcx), %ymm7 + vpsubw %ymm0, %ymm4, %ymm4 + vpsubw %ymm1, %ymm5, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpsubw %ymm2, %ymm6, %ymm6 + vpsubw %ymm3, %ymm7, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 128(%rsi) + vmovdqu %ymm1, 160(%rsi) + vmovdqu %ymm2, 192(%rsi) + vmovdqu %ymm3, 224(%rsi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm1 + vmovdqu 320(%rsi), %ymm2 + vmovdqu 352(%rsi), %ymm3 + vmovdqu 256(%rcx), %ymm4 + vmovdqu 288(%rcx), %ymm5 + vmovdqu 320(%rcx), %ymm6 + vmovdqu 352(%rcx), %ymm7 + vpsubw %ymm0, %ymm4, %ymm4 + vpsubw %ymm1, %ymm5, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpsubw %ymm2, %ymm6, %ymm6 + vpsubw %ymm3, %ymm7, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 256(%rsi) + vmovdqu %ymm1, 288(%rsi) + vmovdqu %ymm2, 320(%rsi) + vmovdqu %ymm3, 352(%rsi) + vmovdqu 384(%rsi), %ymm0 + vmovdqu 416(%rsi), %ymm1 + vmovdqu 448(%rsi), %ymm2 + vmovdqu 480(%rsi), %ymm3 + vmovdqu 384(%rcx), %ymm4 + vmovdqu 416(%rcx), %ymm5 + vmovdqu 448(%rcx), %ymm6 + vmovdqu 480(%rcx), %ymm7 + vpsubw %ymm0, %ymm4, %ymm4 + vpsubw %ymm1, %ymm5, %ymm5 + vpmulhw %ymm15, %ymm4, %ymm0 + vpmulhw %ymm15, %ymm5, %ymm1 + vpsraw $10, %ymm0, %ymm0 + vpsraw $10, %ymm1, %ymm1 + vpmullw %ymm14, %ymm0, %ymm0 + vpmullw %ymm14, %ymm1, %ymm1 + vpsubw %ymm0, %ymm4, %ymm0 + vpsubw %ymm1, %ymm5, %ymm1 + vpsubw %ymm2, %ymm6, %ymm6 + vpsubw %ymm3, %ymm7, %ymm7 + vpmulhw %ymm15, %ymm6, %ymm2 + vpmulhw %ymm15, %ymm7, %ymm3 + vpsraw $10, %ymm2, %ymm2 + vpsraw $10, %ymm3, %ymm3 + vpmullw %ymm14, %ymm2, %ymm2 + vpmullw %ymm14, %ymm3, %ymm3 + vpsubw %ymm2, %ymm6, %ymm2 + vpsubw %ymm3, %ymm7, %ymm3 + vmovdqu %ymm0, 384(%rsi) + vmovdqu %ymm1, 416(%rsi) + vmovdqu %ymm2, 448(%rsi) + vmovdqu %ymm3, 480(%rsi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_decapsulate_avx2,.-kyber_decapsulate_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_csubq_avx2 +.type kyber_csubq_avx2,@function +.align 16 +kyber_csubq_avx2: +#else +.section __TEXT,__text +.globl _kyber_csubq_avx2 +.p2align 4 +_kyber_csubq_avx2: +#endif /* __APPLE__ */ + vmovdqu kyber_q(%rip), %ymm12 + vmovdqu (%rdi), %ymm0 + vmovdqu 32(%rdi), %ymm1 + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vmovdqu 192(%rdi), %ymm6 + vmovdqu 224(%rdi), %ymm7 + vpsubw %ymm12, %ymm0, %ymm8 + vpsubw %ymm12, %ymm1, %ymm9 + vpsubw %ymm12, %ymm2, %ymm10 + vpsubw %ymm12, %ymm3, %ymm11 + vpsraw $15, %ymm8, %ymm0 + vpsraw $15, %ymm9, %ymm1 + vpsraw $15, %ymm10, %ymm2 + vpsraw $15, %ymm11, %ymm3 + vpand %ymm12, %ymm0, %ymm0 + vpand %ymm12, %ymm1, %ymm1 + vpand %ymm12, %ymm2, %ymm2 + vpand %ymm12, %ymm3, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm10, %ymm2, %ymm2 + vpaddw %ymm11, %ymm3, %ymm3 + vpsubw %ymm12, %ymm4, %ymm8 + vpsubw %ymm12, %ymm5, %ymm9 + vpsubw %ymm12, %ymm6, %ymm10 + vpsubw %ymm12, %ymm7, %ymm11 + vpsraw $15, %ymm8, %ymm4 + vpsraw $15, %ymm9, %ymm5 + vpsraw $15, %ymm10, %ymm6 + vpsraw $15, %ymm11, %ymm7 + vpand %ymm12, %ymm4, %ymm4 + vpand %ymm12, %ymm5, %ymm5 + vpand %ymm12, %ymm6, %ymm6 + vpand %ymm12, %ymm7, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + vpaddw %ymm10, %ymm6, %ymm6 + vpaddw %ymm11, %ymm7, %ymm7 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 128(%rdi) + vmovdqu %ymm5, 160(%rdi) + vmovdqu %ymm6, 192(%rdi) + vmovdqu %ymm7, 224(%rdi) + vmovdqu 256(%rdi), %ymm0 + vmovdqu 288(%rdi), %ymm1 + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vmovdqu 384(%rdi), %ymm4 + vmovdqu 416(%rdi), %ymm5 + vmovdqu 448(%rdi), %ymm6 + vmovdqu 480(%rdi), %ymm7 + vpsubw %ymm12, %ymm0, %ymm8 + vpsubw %ymm12, %ymm1, %ymm9 + vpsubw %ymm12, %ymm2, %ymm10 + vpsubw %ymm12, %ymm3, %ymm11 + vpsraw $15, %ymm8, %ymm0 + vpsraw $15, %ymm9, %ymm1 + vpsraw $15, %ymm10, %ymm2 + vpsraw $15, %ymm11, %ymm3 + vpand %ymm12, %ymm0, %ymm0 + vpand %ymm12, %ymm1, %ymm1 + vpand %ymm12, %ymm2, %ymm2 + vpand %ymm12, %ymm3, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm10, %ymm2, %ymm2 + vpaddw %ymm11, %ymm3, %ymm3 + vpsubw %ymm12, %ymm4, %ymm8 + vpsubw %ymm12, %ymm5, %ymm9 + vpsubw %ymm12, %ymm6, %ymm10 + vpsubw %ymm12, %ymm7, %ymm11 + vpsraw $15, %ymm8, %ymm4 + vpsraw $15, %ymm9, %ymm5 + vpsraw $15, %ymm10, %ymm6 + vpsraw $15, %ymm11, %ymm7 + vpand %ymm12, %ymm4, %ymm4 + vpand %ymm12, %ymm5, %ymm5 + vpand %ymm12, %ymm6, %ymm6 + vpand %ymm12, %ymm7, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + vpaddw %ymm10, %ymm6, %ymm6 + vpaddw %ymm11, %ymm7, %ymm7 + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm1, 288(%rdi) + vmovdqu %ymm2, 320(%rdi) + vmovdqu %ymm3, 352(%rdi) + vmovdqu %ymm4, 384(%rdi) + vmovdqu %ymm5, 416(%rdi) + vmovdqu %ymm6, 448(%rdi) + vmovdqu %ymm7, 480(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_csubq_avx2,.-kyber_csubq_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_rej_idx: +.quad 0xffffffffffffffff,0xffffffffffffff00 +.quad 0xffffffffffffff02,0xffffffffffff0200 +.quad 0xffffffffffffff04,0xffffffffffff0400 +.quad 0xffffffffffff0402,0xffffffffff040200 +.quad 0xffffffffffffff06,0xffffffffffff0600 +.quad 0xffffffffffff0602,0xffffffffff060200 +.quad 0xffffffffffff0604,0xffffffffff060400 +.quad 0xffffffffff060402,0xffffffff06040200 +.quad 0xffffffffffffff08,0xffffffffffff0800 +.quad 0xffffffffffff0802,0xffffffffff080200 +.quad 0xffffffffffff0804,0xffffffffff080400 +.quad 0xffffffffff080402,0xffffffff08040200 +.quad 0xffffffffffff0806,0xffffffffff080600 +.quad 0xffffffffff080602,0xffffffff08060200 +.quad 0xffffffffff080604,0xffffffff08060400 +.quad 0xffffffff08060402,0xffffff0806040200 +.quad 0xffffffffffffff0a,0xffffffffffff0a00 +.quad 0xffffffffffff0a02,0xffffffffff0a0200 +.quad 0xffffffffffff0a04,0xffffffffff0a0400 +.quad 0xffffffffff0a0402,0xffffffff0a040200 +.quad 0xffffffffffff0a06,0xffffffffff0a0600 +.quad 0xffffffffff0a0602,0xffffffff0a060200 +.quad 0xffffffffff0a0604,0xffffffff0a060400 +.quad 0xffffffff0a060402,0xffffff0a06040200 +.quad 0xffffffffffff0a08,0xffffffffff0a0800 +.quad 0xffffffffff0a0802,0xffffffff0a080200 +.quad 0xffffffffff0a0804,0xffffffff0a080400 +.quad 0xffffffff0a080402,0xffffff0a08040200 +.quad 0xffffffffff0a0806,0xffffffff0a080600 +.quad 0xffffffff0a080602,0xffffff0a08060200 +.quad 0xffffffff0a080604,0xffffff0a08060400 +.quad 0xffffff0a08060402,0xffff0a0806040200 +.quad 0xffffffffffffff0c,0xffffffffffff0c00 +.quad 0xffffffffffff0c02,0xffffffffff0c0200 +.quad 0xffffffffffff0c04,0xffffffffff0c0400 +.quad 0xffffffffff0c0402,0xffffffff0c040200 +.quad 0xffffffffffff0c06,0xffffffffff0c0600 +.quad 0xffffffffff0c0602,0xffffffff0c060200 +.quad 0xffffffffff0c0604,0xffffffff0c060400 +.quad 0xffffffff0c060402,0xffffff0c06040200 +.quad 0xffffffffffff0c08,0xffffffffff0c0800 +.quad 0xffffffffff0c0802,0xffffffff0c080200 +.quad 0xffffffffff0c0804,0xffffffff0c080400 +.quad 0xffffffff0c080402,0xffffff0c08040200 +.quad 0xffffffffff0c0806,0xffffffff0c080600 +.quad 0xffffffff0c080602,0xffffff0c08060200 +.quad 0xffffffff0c080604,0xffffff0c08060400 +.quad 0xffffff0c08060402,0xffff0c0806040200 +.quad 0xffffffffffff0c0a,0xffffffffff0c0a00 +.quad 0xffffffffff0c0a02,0xffffffff0c0a0200 +.quad 0xffffffffff0c0a04,0xffffffff0c0a0400 +.quad 0xffffffff0c0a0402,0xffffff0c0a040200 +.quad 0xffffffffff0c0a06,0xffffffff0c0a0600 +.quad 0xffffffff0c0a0602,0xffffff0c0a060200 +.quad 0xffffffff0c0a0604,0xffffff0c0a060400 +.quad 0xffffff0c0a060402,0xffff0c0a06040200 +.quad 0xffffffffff0c0a08,0xffffffff0c0a0800 +.quad 0xffffffff0c0a0802,0xffffff0c0a080200 +.quad 0xffffffff0c0a0804,0xffffff0c0a080400 +.quad 0xffffff0c0a080402,0xffff0c0a08040200 +.quad 0xffffffff0c0a0806,0xffffff0c0a080600 +.quad 0xffffff0c0a080602,0xffff0c0a08060200 +.quad 0xffffff0c0a080604,0xffff0c0a08060400 +.quad 0xffff0c0a08060402,0xff0c0a0806040200 +.quad 0xffffffffffffff0e,0xffffffffffff0e00 +.quad 0xffffffffffff0e02,0xffffffffff0e0200 +.quad 0xffffffffffff0e04,0xffffffffff0e0400 +.quad 0xffffffffff0e0402,0xffffffff0e040200 +.quad 0xffffffffffff0e06,0xffffffffff0e0600 +.quad 0xffffffffff0e0602,0xffffffff0e060200 +.quad 0xffffffffff0e0604,0xffffffff0e060400 +.quad 0xffffffff0e060402,0xffffff0e06040200 +.quad 0xffffffffffff0e08,0xffffffffff0e0800 +.quad 0xffffffffff0e0802,0xffffffff0e080200 +.quad 0xffffffffff0e0804,0xffffffff0e080400 +.quad 0xffffffff0e080402,0xffffff0e08040200 +.quad 0xffffffffff0e0806,0xffffffff0e080600 +.quad 0xffffffff0e080602,0xffffff0e08060200 +.quad 0xffffffff0e080604,0xffffff0e08060400 +.quad 0xffffff0e08060402,0xffff0e0806040200 +.quad 0xffffffffffff0e0a,0xffffffffff0e0a00 +.quad 0xffffffffff0e0a02,0xffffffff0e0a0200 +.quad 0xffffffffff0e0a04,0xffffffff0e0a0400 +.quad 0xffffffff0e0a0402,0xffffff0e0a040200 +.quad 0xffffffffff0e0a06,0xffffffff0e0a0600 +.quad 0xffffffff0e0a0602,0xffffff0e0a060200 +.quad 0xffffffff0e0a0604,0xffffff0e0a060400 +.quad 0xffffff0e0a060402,0xffff0e0a06040200 +.quad 0xffffffffff0e0a08,0xffffffff0e0a0800 +.quad 0xffffffff0e0a0802,0xffffff0e0a080200 +.quad 0xffffffff0e0a0804,0xffffff0e0a080400 +.quad 0xffffff0e0a080402,0xffff0e0a08040200 +.quad 0xffffffff0e0a0806,0xffffff0e0a080600 +.quad 0xffffff0e0a080602,0xffff0e0a08060200 +.quad 0xffffff0e0a080604,0xffff0e0a08060400 +.quad 0xffff0e0a08060402,0xff0e0a0806040200 +.quad 0xffffffffffff0e0c,0xffffffffff0e0c00 +.quad 0xffffffffff0e0c02,0xffffffff0e0c0200 +.quad 0xffffffffff0e0c04,0xffffffff0e0c0400 +.quad 0xffffffff0e0c0402,0xffffff0e0c040200 +.quad 0xffffffffff0e0c06,0xffffffff0e0c0600 +.quad 0xffffffff0e0c0602,0xffffff0e0c060200 +.quad 0xffffffff0e0c0604,0xffffff0e0c060400 +.quad 0xffffff0e0c060402,0xffff0e0c06040200 +.quad 0xffffffffff0e0c08,0xffffffff0e0c0800 +.quad 0xffffffff0e0c0802,0xffffff0e0c080200 +.quad 0xffffffff0e0c0804,0xffffff0e0c080400 +.quad 0xffffff0e0c080402,0xffff0e0c08040200 +.quad 0xffffffff0e0c0806,0xffffff0e0c080600 +.quad 0xffffff0e0c080602,0xffff0e0c08060200 +.quad 0xffffff0e0c080604,0xffff0e0c08060400 +.quad 0xffff0e0c08060402,0xff0e0c0806040200 +.quad 0xffffffffff0e0c0a,0xffffffff0e0c0a00 +.quad 0xffffffff0e0c0a02,0xffffff0e0c0a0200 +.quad 0xffffffff0e0c0a04,0xffffff0e0c0a0400 +.quad 0xffffff0e0c0a0402,0xffff0e0c0a040200 +.quad 0xffffffff0e0c0a06,0xffffff0e0c0a0600 +.quad 0xffffff0e0c0a0602,0xffff0e0c0a060200 +.quad 0xffffff0e0c0a0604,0xffff0e0c0a060400 +.quad 0xffff0e0c0a060402,0xff0e0c0a06040200 +.quad 0xffffffff0e0c0a08,0xffffff0e0c0a0800 +.quad 0xffffff0e0c0a0802,0xffff0e0c0a080200 +.quad 0xffffff0e0c0a0804,0xffff0e0c0a080400 +.quad 0xffff0e0c0a080402,0xff0e0c0a08040200 +.quad 0xffffff0e0c0a0806,0xffff0e0c0a080600 +.quad 0xffff0e0c0a080602,0xff0e0c0a08060200 +.quad 0xffff0e0c0a080604,0xff0e0c0a08060400 +.quad 0xff0e0c0a08060402,0xe0c0a0806040200 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_rej_q: +.quad 0xd010d010d010d01, 0xd010d010d010d01 +.quad 0xd010d010d010d01, 0xd010d010d010d01 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_rej_ones: +.quad 0x101010101010101, 0x101010101010101 +.quad 0x101010101010101, 0x101010101010101 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_rej_mask: +.quad 0xfff0fff0fff0fff, 0xfff0fff0fff0fff +.quad 0xfff0fff0fff0fff, 0xfff0fff0fff0fff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_rej_shuffle: +.quad 0x504040302010100, 0xb0a0a0908070706 +.quad 0x908080706050504, 0xf0e0e0d0c0b0b0a +#ifndef __APPLE__ +.text +.globl kyber_rej_uniform_n_avx2 +.type kyber_rej_uniform_n_avx2,@function +.align 16 +kyber_rej_uniform_n_avx2: +#else +.section __TEXT,__text +.globl _kyber_rej_uniform_n_avx2 +.p2align 4 +_kyber_rej_uniform_n_avx2: +#endif /* __APPLE__ */ + pushq %rbx + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbp + movq %rcx, %r8 + movl %esi, %eax + vmovdqu L_kyber_rej_q(%rip), %ymm6 + vmovdqu L_kyber_rej_ones(%rip), %ymm7 + vmovdqu L_kyber_rej_mask(%rip), %ymm8 + vmovdqu L_kyber_rej_shuffle(%rip), %ymm9 + leaq L_kyber_rej_idx(%rip), %r9 + movq $0x1111111111111111, %r14 + movq $0xe0c0a0806040200, %rbp + movq $0x101010101010101, %r13 + vpermq $0x94, (%rdx), %ymm0 + vpermq $0x94, 24(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + vpermq $0x94, 48(%rdx), %ymm0 + vpermq $0x94, 72(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + vpermq $0x94, 96(%rdx), %ymm0 + vpermq $0x94, 120(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + vpermq $0x94, 144(%rdx), %ymm0 + vpermq $0x94, 168(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + vpermq $0x94, 192(%rdx), %ymm0 + vpermq $0x94, 216(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + vpermq $0x94, 240(%rdx), %ymm0 + vpermq $0x94, 264(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + vpermq $0x94, 288(%rdx), %ymm0 + vpermq $0x94, 312(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + addq $0x150, %rdx + subl $0x150, %r8d +L_kyber_rej_uniform_n_avx2_start_256: + vpermq $0x94, (%rdx), %ymm0 + vpermq $0x94, 24(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + addq $48, %rdx + subl $48, %r8d + cmpl $48, %r8d + jl L_kyber_rej_uniform_n_avx2_done_256 + cmpl $32, %esi + jge L_kyber_rej_uniform_n_avx2_start_256 +L_kyber_rej_uniform_n_avx2_done_256: + cmpl $8, %esi + jl L_kyber_rej_uniform_n_avx2_done_128 + cmpl $12, %r8d + jl L_kyber_rej_uniform_n_avx2_done_128 +L_kyber_rej_uniform_n_avx2_start_128: + vmovdqu (%rdx), %xmm0 + vpshufb %xmm9, %xmm0, %xmm0 + vpsrlw $4, %xmm0, %xmm2 + vpblendw $0xaa, %xmm2, %xmm0, %xmm0 + vpand %xmm8, %xmm0, %xmm0 + vpcmpgtw %xmm0, %xmm6, %xmm2 + vpmovmskb %xmm2, %rbx + movq $0x5555, %r10 + pextl %r10d, %ebx, %ebx + movq (%r9,%rbx,8), %xmm3 + vpaddb %xmm7, %xmm3, %xmm4 + vpunpcklbw %xmm4, %xmm3, %xmm3 + vpshufb %xmm3, %xmm0, %xmm0 + vmovdqu %xmm0, (%rdi) + popcntl %ebx, %ecx + leaq (%rdi,%rcx,2), %rdi + subl %ecx, %esi + addq $12, %rdx + subl $12, %r8d + cmpl $12, %r8d + jl L_kyber_rej_uniform_n_avx2_done_128 + cmpl $8, %esi + jge L_kyber_rej_uniform_n_avx2_start_128 +L_kyber_rej_uniform_n_avx2_done_128: + cmpl $0x00, %r8d + je L_kyber_rej_uniform_n_avx2_done_64 + cmpl $0x00, %esi + je L_kyber_rej_uniform_n_avx2_done_64 + movq $0xfff0fff0fff0fff, %r15 + movq $0x2000200020002000, %r10 + movq $0xd010d010d010d01, %r11 + movq $0x1000100010001000, %r12 +L_kyber_rej_uniform_n_avx2_start_64: + movq (%rdx), %rcx + pdepq %r15, %rcx, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_0_avx2_rej_large_0 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_n_avx2_done_64 +L_kyber_rej_uniform_0_avx2_rej_large_0: + shrq $16, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_0_avx2_rej_large_1 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_n_avx2_done_64 +L_kyber_rej_uniform_0_avx2_rej_large_1: + shrq $16, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_0_avx2_rej_large_2 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_n_avx2_done_64 +L_kyber_rej_uniform_0_avx2_rej_large_2: + shrq $16, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_0_avx2_rej_large_3 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_n_avx2_done_64 +L_kyber_rej_uniform_0_avx2_rej_large_3: + addq $6, %rdx + subl $6, %r8d + jle L_kyber_rej_uniform_n_avx2_done_64 + cmpl $0x00, %esi + jg L_kyber_rej_uniform_n_avx2_start_64 +L_kyber_rej_uniform_n_avx2_done_64: + vzeroupper + subl %esi, %eax + popq %rbp + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbx + repz retq +#ifndef __APPLE__ +.size kyber_rej_uniform_n_avx2,.-kyber_rej_uniform_n_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_rej_uniform_avx2 +.type kyber_rej_uniform_avx2,@function +.align 16 +kyber_rej_uniform_avx2: +#else +.section __TEXT,__text +.globl _kyber_rej_uniform_avx2 +.p2align 4 +_kyber_rej_uniform_avx2: +#endif /* __APPLE__ */ + pushq %rbx + pushq %r12 + pushq %r13 + pushq %r14 + pushq %r15 + pushq %rbp + movq %rcx, %r8 + movl %esi, %eax + cmpl $0x00, %esi + je L_kyber_rej_uniform_avx2_done_64 + cmpl $8, %esi + jl L_kyber_rej_uniform_avx2_done_128 + vmovdqu L_kyber_rej_q(%rip), %ymm6 + vmovdqu L_kyber_rej_ones(%rip), %ymm7 + vmovdqu L_kyber_rej_mask(%rip), %ymm8 + vmovdqu L_kyber_rej_shuffle(%rip), %ymm9 + leaq L_kyber_rej_idx(%rip), %r9 + movq $0x1111111111111111, %r14 + movq $0xe0c0a0806040200, %rbp + movq $0x101010101010101, %r13 + cmpl $32, %esi + jl L_kyber_rej_uniform_avx2_done_256 + vpermq $0x94, (%rdx), %ymm0 + vpermq $0x94, 24(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + addq $48, %rdx + subl $48, %r8d + cmpl $32, %esi + jl L_kyber_rej_uniform_avx2_done_256 + vpermq $0x94, (%rdx), %ymm0 + vpermq $0x94, 24(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + addq $48, %rdx + subl $48, %r8d + cmpl $32, %esi + jl L_kyber_rej_uniform_avx2_done_256 +L_kyber_rej_uniform_avx2_start_256: + vpermq $0x94, (%rdx), %ymm0 + vpermq $0x94, 24(%rdx), %ymm1 + vpshufb %ymm9, %ymm0, %ymm0 + vpshufb %ymm9, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpblendw $0xaa, %ymm2, %ymm0, %ymm0 + vpblendw $0xaa, %ymm3, %ymm1, %ymm1 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpcmpgtw %ymm0, %ymm6, %ymm2 + vpcmpgtw %ymm1, %ymm6, %ymm3 + vpacksswb %ymm3, %ymm2, %ymm2 + vpmovmskb %ymm2, %rbx + movzbl %bl, %r10d + movzbl %bh, %ecx + movq %rbx, %r11 + movq %rbx, %r12 + shrq $16, %r11 + shrq $24, %r12 + andq $0xff, %r11 + andq $0xff, %r12 + movq (%r9,%r10,8), %xmm2 + movq (%r9,%rcx,8), %xmm3 + movq (%r9,%r11,8), %xmm4 + movq (%r9,%r12,8), %xmm5 + vinserti128 $0x01, %xmm4, %ymm2, %ymm2 + vinserti128 $0x01, %xmm5, %ymm3, %ymm3 + vpaddb %ymm7, %ymm2, %ymm4 + vpaddb %ymm7, %ymm3, %ymm5 + vpunpcklbw %ymm4, %ymm2, %ymm2 + vpunpcklbw %ymm5, %ymm3, %ymm3 + vpshufb %ymm2, %ymm0, %ymm0 + vpshufb %ymm3, %ymm1, %ymm1 + movq %rbx, %r10 + movq %rbx, %r11 + movq %rbx, %r12 + andq $0xff, %rbx + shrq $16, %r10 + shrq $8, %r11 + shrq $24, %r12 + andq $0xff, %r10 + andq $0xff, %r11 + popcntl %ebx, %ebx + popcntl %r10d, %r10d + popcntl %r11d, %r11d + popcntl %r12d, %r12d + vmovdqu %xmm0, (%rdi) + vextracti128 $0x01, %ymm0, %xmm0 + leaq (%rdi,%rbx,2), %rdi + subl %ebx, %esi + vmovdqu %xmm0, (%rdi) + leaq (%rdi,%r10,2), %rdi + subl %r10d, %esi + vmovdqu %xmm1, (%rdi) + vextracti128 $0x01, %ymm1, %xmm1 + leaq (%rdi,%r11,2), %rdi + subl %r11d, %esi + vmovdqu %xmm1, (%rdi) + leaq (%rdi,%r12,2), %rdi + subl %r12d, %esi + addq $48, %rdx + subl $48, %r8d + cmpl $48, %r8d + jl L_kyber_rej_uniform_avx2_done_256 + cmpl $32, %esi + jge L_kyber_rej_uniform_avx2_start_256 +L_kyber_rej_uniform_avx2_done_256: + cmpl $8, %esi + jl L_kyber_rej_uniform_avx2_done_128 + cmpl $12, %r8d + jl L_kyber_rej_uniform_avx2_done_128 +L_kyber_rej_uniform_avx2_start_128: + vmovdqu (%rdx), %xmm0 + vpshufb %xmm9, %xmm0, %xmm0 + vpsrlw $4, %xmm0, %xmm2 + vpblendw $0xaa, %xmm2, %xmm0, %xmm0 + vpand %xmm8, %xmm0, %xmm0 + vpcmpgtw %xmm0, %xmm6, %xmm2 + vpmovmskb %xmm2, %rbx + movq $0x5555, %r10 + pextl %r10d, %ebx, %ebx + movq (%r9,%rbx,8), %xmm3 + vpaddb %xmm7, %xmm3, %xmm4 + vpunpcklbw %xmm4, %xmm3, %xmm3 + vpshufb %xmm3, %xmm0, %xmm0 + vmovdqu %xmm0, (%rdi) + popcntl %ebx, %ecx + leaq (%rdi,%rcx,2), %rdi + subl %ecx, %esi + addq $12, %rdx + subl $12, %r8d + cmpl $12, %r8d + jl L_kyber_rej_uniform_avx2_done_128 + cmpl $8, %esi + jge L_kyber_rej_uniform_avx2_start_128 +L_kyber_rej_uniform_avx2_done_128: + cmpl $0x00, %r8d + je L_kyber_rej_uniform_avx2_done_64 + cmpl $0x00, %esi + je L_kyber_rej_uniform_avx2_done_64 + movq $0xfff0fff0fff0fff, %r15 + movq $0x2000200020002000, %r10 + movq $0xd010d010d010d01, %r11 + movq $0x1000100010001000, %r12 +L_kyber_rej_uniform_avx2_start_64: + movq (%rdx), %rcx + pdepq %r15, %rcx, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_avx2_rej_large_0 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_avx2_done_64 +L_kyber_rej_uniform_avx2_rej_large_0: + shrq $16, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_avx2_rej_large_1 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_avx2_done_64 +L_kyber_rej_uniform_avx2_rej_large_1: + shrq $16, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_avx2_rej_large_2 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_avx2_done_64 +L_kyber_rej_uniform_avx2_rej_large_2: + shrq $16, %rcx + cmpw $0xd01, %cx + jge L_kyber_rej_uniform_avx2_rej_large_3 + movw %cx, (%rdi) + addq $2, %rdi + subl $0x01, %esi + je L_kyber_rej_uniform_avx2_done_64 +L_kyber_rej_uniform_avx2_rej_large_3: + addq $6, %rdx + subl $6, %r8d + jle L_kyber_rej_uniform_avx2_done_64 + cmpl $0x00, %esi + jg L_kyber_rej_uniform_avx2_start_64 +L_kyber_rej_uniform_avx2_done_64: + vzeroupper + subl %esi, %eax + popq %rbp + popq %r15 + popq %r14 + popq %r13 + popq %r12 + popq %rbx + repz retq +#ifndef __APPLE__ +.size kyber_rej_uniform_avx2,.-kyber_rej_uniform_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_249: +.quad 0x24924900249249, 0x24924900249249 +.quad 0x24924900249249, 0x24924900249249 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_6db: +.quad 0x6db6db006db6db, 0x6db6db006db6db +.quad 0x6db6db006db6db, 0x6db6db006db6db +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_07: +.quad 0x700000007, 0x700000007 +.quad 0x700000007, 0x700000007 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_70: +.quad 0x7000000070000, 0x7000000070000 +.quad 0x7000000070000, 0x7000000070000 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_3: +.quad 0x3000300030003, 0x3000300030003 +.quad 0x3000300030003, 0x3000300030003 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_shuff: +.quad 0xff050403ff020100, 0xff0b0a09ff080706 +.quad 0xff090807ff060504, 0xff0f0e0dff0c0b0a +#ifndef __APPLE__ +.text +.globl kyber_cbd_eta3_avx2 +.type kyber_cbd_eta3_avx2,@function +.align 16 +kyber_cbd_eta3_avx2: +#else +.section __TEXT,__text +.globl _kyber_cbd_eta3_avx2 +.p2align 4 +_kyber_cbd_eta3_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_mask_249(%rip), %ymm8 + vmovdqu L_kyber_mask_6db(%rip), %ymm9 + vmovdqu L_kyber_mask_07(%rip), %ymm10 + vmovdqu L_kyber_mask_70(%rip), %ymm11 + vmovdqu L_kyber_mask_3(%rip), %ymm12 + vmovdqu L_kyber_shuff(%rip), %ymm13 + vmovdqu (%rsi), %ymm0 + vmovdqu 24(%rsi), %ymm1 + vpermq $0x94, %ymm0, %ymm0 + vpermq $0x94, %ymm1, %ymm1 + vpshufb %ymm13, %ymm0, %ymm0 + vpshufb %ymm13, %ymm1, %ymm1 + vpsrld $0x01, %ymm0, %ymm2 + vpsrld $0x01, %ymm1, %ymm3 + vpsrld $2, %ymm0, %ymm4 + vpsrld $2, %ymm1, %ymm5 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpand %ymm8, %ymm4, %ymm4 + vpand %ymm8, %ymm5, %ymm5 + vpaddd %ymm2, %ymm0, %ymm0 + vpaddd %ymm3, %ymm1, %ymm1 + vpaddd %ymm4, %ymm0, %ymm0 + vpaddd %ymm5, %ymm1, %ymm1 + vpsrld $3, %ymm0, %ymm2 + vpsrld $3, %ymm1, %ymm3 + vpaddd %ymm9, %ymm0, %ymm0 + vpaddd %ymm9, %ymm1, %ymm1 + vpsubd %ymm2, %ymm0, %ymm0 + vpsubd %ymm3, %ymm1, %ymm1 + vpslld $10, %ymm0, %ymm2 + vpslld $10, %ymm1, %ymm3 + vpsrld $12, %ymm0, %ymm4 + vpsrld $12, %ymm1, %ymm5 + vpsrld $2, %ymm0, %ymm6 + vpsrld $2, %ymm1, %ymm7 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm10, %ymm4, %ymm4 + vpand %ymm10, %ymm5, %ymm5 + vpand %ymm11, %ymm6, %ymm6 + vpand %ymm11, %ymm7, %ymm7 + vpaddw %ymm2, %ymm0, %ymm0 + vpaddw %ymm3, %ymm1, %ymm1 + vpaddw %ymm6, %ymm4, %ymm2 + vpaddw %ymm7, %ymm5, %ymm3 + vpsubw %ymm12, %ymm0, %ymm0 + vpsubw %ymm12, %ymm1, %ymm1 + vpsubw %ymm12, %ymm2, %ymm2 + vpsubw %ymm12, %ymm3, %ymm3 + vpunpckldq %ymm2, %ymm0, %ymm4 + vpunpckldq %ymm3, %ymm1, %ymm5 + vpunpckhdq %ymm2, %ymm0, %ymm6 + vpunpckhdq %ymm3, %ymm1, %ymm7 + vperm2i128 $32, %ymm6, %ymm4, %ymm0 + vperm2i128 $32, %ymm7, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm4, %ymm2 + vperm2i128 $49, %ymm7, %ymm5, %ymm3 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm3, 96(%rdi) + vmovdqu 48(%rsi), %ymm0 + vmovdqu 72(%rsi), %ymm1 + vpermq $0x94, %ymm0, %ymm0 + vpermq $0x94, %ymm1, %ymm1 + vpshufb %ymm13, %ymm0, %ymm0 + vpshufb %ymm13, %ymm1, %ymm1 + vpsrld $0x01, %ymm0, %ymm2 + vpsrld $0x01, %ymm1, %ymm3 + vpsrld $2, %ymm0, %ymm4 + vpsrld $2, %ymm1, %ymm5 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpand %ymm8, %ymm4, %ymm4 + vpand %ymm8, %ymm5, %ymm5 + vpaddd %ymm2, %ymm0, %ymm0 + vpaddd %ymm3, %ymm1, %ymm1 + vpaddd %ymm4, %ymm0, %ymm0 + vpaddd %ymm5, %ymm1, %ymm1 + vpsrld $3, %ymm0, %ymm2 + vpsrld $3, %ymm1, %ymm3 + vpaddd %ymm9, %ymm0, %ymm0 + vpaddd %ymm9, %ymm1, %ymm1 + vpsubd %ymm2, %ymm0, %ymm0 + vpsubd %ymm3, %ymm1, %ymm1 + vpslld $10, %ymm0, %ymm2 + vpslld $10, %ymm1, %ymm3 + vpsrld $12, %ymm0, %ymm4 + vpsrld $12, %ymm1, %ymm5 + vpsrld $2, %ymm0, %ymm6 + vpsrld $2, %ymm1, %ymm7 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm10, %ymm4, %ymm4 + vpand %ymm10, %ymm5, %ymm5 + vpand %ymm11, %ymm6, %ymm6 + vpand %ymm11, %ymm7, %ymm7 + vpaddw %ymm2, %ymm0, %ymm0 + vpaddw %ymm3, %ymm1, %ymm1 + vpaddw %ymm6, %ymm4, %ymm2 + vpaddw %ymm7, %ymm5, %ymm3 + vpsubw %ymm12, %ymm0, %ymm0 + vpsubw %ymm12, %ymm1, %ymm1 + vpsubw %ymm12, %ymm2, %ymm2 + vpsubw %ymm12, %ymm3, %ymm3 + vpunpckldq %ymm2, %ymm0, %ymm4 + vpunpckldq %ymm3, %ymm1, %ymm5 + vpunpckhdq %ymm2, %ymm0, %ymm6 + vpunpckhdq %ymm3, %ymm1, %ymm7 + vperm2i128 $32, %ymm6, %ymm4, %ymm0 + vperm2i128 $32, %ymm7, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm4, %ymm2 + vperm2i128 $49, %ymm7, %ymm5, %ymm3 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm2, 160(%rdi) + vmovdqu %ymm1, 192(%rdi) + vmovdqu %ymm3, 224(%rdi) + vmovdqu 96(%rsi), %ymm0 + vmovdqu 120(%rsi), %ymm1 + vpermq $0x94, %ymm0, %ymm0 + vpermq $0x94, %ymm1, %ymm1 + vpshufb %ymm13, %ymm0, %ymm0 + vpshufb %ymm13, %ymm1, %ymm1 + vpsrld $0x01, %ymm0, %ymm2 + vpsrld $0x01, %ymm1, %ymm3 + vpsrld $2, %ymm0, %ymm4 + vpsrld $2, %ymm1, %ymm5 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpand %ymm8, %ymm4, %ymm4 + vpand %ymm8, %ymm5, %ymm5 + vpaddd %ymm2, %ymm0, %ymm0 + vpaddd %ymm3, %ymm1, %ymm1 + vpaddd %ymm4, %ymm0, %ymm0 + vpaddd %ymm5, %ymm1, %ymm1 + vpsrld $3, %ymm0, %ymm2 + vpsrld $3, %ymm1, %ymm3 + vpaddd %ymm9, %ymm0, %ymm0 + vpaddd %ymm9, %ymm1, %ymm1 + vpsubd %ymm2, %ymm0, %ymm0 + vpsubd %ymm3, %ymm1, %ymm1 + vpslld $10, %ymm0, %ymm2 + vpslld $10, %ymm1, %ymm3 + vpsrld $12, %ymm0, %ymm4 + vpsrld $12, %ymm1, %ymm5 + vpsrld $2, %ymm0, %ymm6 + vpsrld $2, %ymm1, %ymm7 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm10, %ymm4, %ymm4 + vpand %ymm10, %ymm5, %ymm5 + vpand %ymm11, %ymm6, %ymm6 + vpand %ymm11, %ymm7, %ymm7 + vpaddw %ymm2, %ymm0, %ymm0 + vpaddw %ymm3, %ymm1, %ymm1 + vpaddw %ymm6, %ymm4, %ymm2 + vpaddw %ymm7, %ymm5, %ymm3 + vpsubw %ymm12, %ymm0, %ymm0 + vpsubw %ymm12, %ymm1, %ymm1 + vpsubw %ymm12, %ymm2, %ymm2 + vpsubw %ymm12, %ymm3, %ymm3 + vpunpckldq %ymm2, %ymm0, %ymm4 + vpunpckldq %ymm3, %ymm1, %ymm5 + vpunpckhdq %ymm2, %ymm0, %ymm6 + vpunpckhdq %ymm3, %ymm1, %ymm7 + vperm2i128 $32, %ymm6, %ymm4, %ymm0 + vperm2i128 $32, %ymm7, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm4, %ymm2 + vperm2i128 $49, %ymm7, %ymm5, %ymm3 + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm2, 288(%rdi) + vmovdqu %ymm1, 320(%rdi) + vmovdqu %ymm3, 352(%rdi) + vmovdqu 144(%rsi), %ymm0 + vmovdqu 168(%rsi), %ymm1 + vpermq $0x94, %ymm0, %ymm0 + vpermq $0x94, %ymm1, %ymm1 + vpshufb %ymm13, %ymm0, %ymm0 + vpshufb %ymm13, %ymm1, %ymm1 + vpsrld $0x01, %ymm0, %ymm2 + vpsrld $0x01, %ymm1, %ymm3 + vpsrld $2, %ymm0, %ymm4 + vpsrld $2, %ymm1, %ymm5 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpand %ymm8, %ymm4, %ymm4 + vpand %ymm8, %ymm5, %ymm5 + vpaddd %ymm2, %ymm0, %ymm0 + vpaddd %ymm3, %ymm1, %ymm1 + vpaddd %ymm4, %ymm0, %ymm0 + vpaddd %ymm5, %ymm1, %ymm1 + vpsrld $3, %ymm0, %ymm2 + vpsrld $3, %ymm1, %ymm3 + vpaddd %ymm9, %ymm0, %ymm0 + vpaddd %ymm9, %ymm1, %ymm1 + vpsubd %ymm2, %ymm0, %ymm0 + vpsubd %ymm3, %ymm1, %ymm1 + vpslld $10, %ymm0, %ymm2 + vpslld $10, %ymm1, %ymm3 + vpsrld $12, %ymm0, %ymm4 + vpsrld $12, %ymm1, %ymm5 + vpsrld $2, %ymm0, %ymm6 + vpsrld $2, %ymm1, %ymm7 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm10, %ymm4, %ymm4 + vpand %ymm10, %ymm5, %ymm5 + vpand %ymm11, %ymm6, %ymm6 + vpand %ymm11, %ymm7, %ymm7 + vpaddw %ymm2, %ymm0, %ymm0 + vpaddw %ymm3, %ymm1, %ymm1 + vpaddw %ymm6, %ymm4, %ymm2 + vpaddw %ymm7, %ymm5, %ymm3 + vpsubw %ymm12, %ymm0, %ymm0 + vpsubw %ymm12, %ymm1, %ymm1 + vpsubw %ymm12, %ymm2, %ymm2 + vpsubw %ymm12, %ymm3, %ymm3 + vpunpckldq %ymm2, %ymm0, %ymm4 + vpunpckldq %ymm3, %ymm1, %ymm5 + vpunpckhdq %ymm2, %ymm0, %ymm6 + vpunpckhdq %ymm3, %ymm1, %ymm7 + vperm2i128 $32, %ymm6, %ymm4, %ymm0 + vperm2i128 $32, %ymm7, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm4, %ymm2 + vperm2i128 $49, %ymm7, %ymm5, %ymm3 + vmovdqu %ymm0, 384(%rdi) + vmovdqu %ymm2, 416(%rdi) + vmovdqu %ymm1, 448(%rdi) + vmovdqu %ymm3, 480(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_cbd_eta3_avx2,.-kyber_cbd_eta3_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_55: +.quad 0x5555555555555555, 0x5555555555555555 +.quad 0x5555555555555555, 0x5555555555555555 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_33: +.quad 0x3333333333333333, 0x3333333333333333 +.quad 0x3333333333333333, 0x3333333333333333 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_03: +.quad 0x303030303030303, 0x303030303030303 +.quad 0x303030303030303, 0x303030303030303 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_mask_0f: +.quad 0xf0f0f0f0f0f0f0f, 0xf0f0f0f0f0f0f0f +.quad 0xf0f0f0f0f0f0f0f, 0xf0f0f0f0f0f0f0f +#ifndef __APPLE__ +.text +.globl kyber_cbd_eta2_avx2 +.type kyber_cbd_eta2_avx2,@function +.align 16 +kyber_cbd_eta2_avx2: +#else +.section __TEXT,__text +.globl _kyber_cbd_eta2_avx2 +.p2align 4 +_kyber_cbd_eta2_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_mask_55(%rip), %ymm8 + vmovdqu L_kyber_mask_33(%rip), %ymm9 + vmovdqu L_kyber_mask_03(%rip), %ymm10 + vmovdqu L_kyber_mask_0f(%rip), %ymm11 + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vpsrlw $0x01, %ymm0, %ymm2 + vpsrlw $0x01, %ymm1, %ymm3 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpaddb %ymm2, %ymm0, %ymm0 + vpaddb %ymm3, %ymm1, %ymm1 + vpsrlw $2, %ymm0, %ymm2 + vpsrlw $2, %ymm1, %ymm3 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpand %ymm9, %ymm2, %ymm2 + vpand %ymm9, %ymm3, %ymm3 + vpaddb %ymm9, %ymm0, %ymm0 + vpaddb %ymm9, %ymm1, %ymm1 + vpsubb %ymm2, %ymm0, %ymm0 + vpsubb %ymm3, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpand %ymm11, %ymm0, %ymm0 + vpand %ymm11, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpsubb %ymm10, %ymm0, %ymm0 + vpsubb %ymm10, %ymm1, %ymm1 + vpsubb %ymm10, %ymm2, %ymm2 + vpsubb %ymm10, %ymm3, %ymm3 + vpunpcklbw %ymm2, %ymm0, %ymm4 + vpunpcklbw %ymm3, %ymm1, %ymm5 + vpunpckhbw %ymm2, %ymm0, %ymm6 + vpunpckhbw %ymm3, %ymm1, %ymm7 + vpmovsxbw %xmm4, %ymm0 + vpmovsxbw %xmm5, %ymm1 + vextracti128 $0x01, %ymm4, %xmm2 + vextracti128 $0x01, %ymm5, %xmm3 + vpmovsxbw %xmm2, %ymm2 + vpmovsxbw %xmm3, %ymm3 + vpmovsxbw %xmm6, %ymm4 + vpmovsxbw %xmm7, %ymm5 + vextracti128 $0x01, %ymm6, %xmm6 + vextracti128 $0x01, %ymm7, %xmm7 + vpmovsxbw %xmm6, %ymm6 + vpmovsxbw %xmm7, %ymm7 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm4, 32(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm6, 96(%rdi) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm5, 160(%rdi) + vmovdqu %ymm3, 192(%rdi) + vmovdqu %ymm7, 224(%rdi) + vmovdqu 64(%rsi), %ymm0 + vmovdqu 96(%rsi), %ymm1 + vpsrlw $0x01, %ymm0, %ymm2 + vpsrlw $0x01, %ymm1, %ymm3 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpaddb %ymm2, %ymm0, %ymm0 + vpaddb %ymm3, %ymm1, %ymm1 + vpsrlw $2, %ymm0, %ymm2 + vpsrlw $2, %ymm1, %ymm3 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpand %ymm9, %ymm2, %ymm2 + vpand %ymm9, %ymm3, %ymm3 + vpaddb %ymm9, %ymm0, %ymm0 + vpaddb %ymm9, %ymm1, %ymm1 + vpsubb %ymm2, %ymm0, %ymm0 + vpsubb %ymm3, %ymm1, %ymm1 + vpsrlw $4, %ymm0, %ymm2 + vpsrlw $4, %ymm1, %ymm3 + vpand %ymm11, %ymm0, %ymm0 + vpand %ymm11, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpsubb %ymm10, %ymm0, %ymm0 + vpsubb %ymm10, %ymm1, %ymm1 + vpsubb %ymm10, %ymm2, %ymm2 + vpsubb %ymm10, %ymm3, %ymm3 + vpunpcklbw %ymm2, %ymm0, %ymm4 + vpunpcklbw %ymm3, %ymm1, %ymm5 + vpunpckhbw %ymm2, %ymm0, %ymm6 + vpunpckhbw %ymm3, %ymm1, %ymm7 + vpmovsxbw %xmm4, %ymm0 + vpmovsxbw %xmm5, %ymm1 + vextracti128 $0x01, %ymm4, %xmm2 + vextracti128 $0x01, %ymm5, %xmm3 + vpmovsxbw %xmm2, %ymm2 + vpmovsxbw %xmm3, %ymm3 + vpmovsxbw %xmm6, %ymm4 + vpmovsxbw %xmm7, %ymm5 + vextracti128 $0x01, %ymm6, %xmm6 + vextracti128 $0x01, %ymm7, %xmm7 + vpmovsxbw %xmm6, %ymm6 + vpmovsxbw %xmm7, %ymm7 + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm4, 288(%rdi) + vmovdqu %ymm2, 320(%rdi) + vmovdqu %ymm6, 352(%rdi) + vmovdqu %ymm1, 384(%rdi) + vmovdqu %ymm5, 416(%rdi) + vmovdqu %ymm3, 448(%rdi) + vmovdqu %ymm7, 480(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_cbd_eta2_avx2,.-kyber_cbd_eta2_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_10_avx2_mask: +.value 0x3ff,0x3ff +.value 0x3ff,0x3ff +.value 0x3ff,0x3ff +.value 0x3ff,0x3ff +.value 0x3ff,0x3ff +.value 0x3ff,0x3ff +.value 0x3ff,0x3ff +.value 0x3ff,0x3ff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_compress_10_avx2_shift: +.quad 0x400000104000001, 0x400000104000001 +.quad 0x400000104000001, 0x400000104000001 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_compress_10_avx2_shlv: +.quad 0xc, 0xc +.quad 0xc, 0xc +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_10_avx2_shuf: +.value 0x100,0x302 +.value 0x804,0xa09 +.value 0xc0b,0xffff +.value 0xffff,0xffff +.value 0xa09,0xc0b +.value 0xffff,0xffff +.value 0xffff,0x100 +.value 0x302,0x804 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_10_avx2_v: +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_10_avx2_offset: +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_10_avx2_shift12: +.value 0x1000,0x1000 +.value 0x1000,0x1000 +.value 0x1000,0x1000 +.value 0x1000,0x1000 +.value 0x1000,0x1000 +.value 0x1000,0x1000 +.value 0x1000,0x1000 +.value 0x1000,0x1000 +#ifndef __APPLE__ +.text +.globl kyber_compress_10_avx2 +.type kyber_compress_10_avx2,@function +.align 16 +kyber_compress_10_avx2: +#else +.section __TEXT,__text +.globl _kyber_compress_10_avx2 +.p2align 4 +_kyber_compress_10_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rsi), %ymm0 + vmovdqu L_kyber_compress_10_avx2_mask(%rip), %ymm9 + vmovdqu L_kyber_compress_10_avx2_shift(%rip), %ymm8 + vmovdqu L_kyber_compress_10_avx2_shlv(%rip), %ymm10 + vmovdqu L_kyber_compress_10_avx2_shuf(%rip), %ymm11 + vmovdqu L_kyber_compress_10_avx2_v(%rip), %ymm6 + vmovdqu L_kyber_compress_10_avx2_offset(%rip), %ymm12 + vmovdqu L_kyber_compress_10_avx2_shift12(%rip), %ymm13 + vpsllw $3, %ymm6, %ymm7 +L_kyber_compress_10_avx2_start: + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, (%rdi) + vmovdqu %xmm1, 20(%rdi) + vmovss %xmm2, 16(%rdi) + vmovss %xmm4, 36(%rdi) + vmovdqu 64(%rsi), %ymm0 + vmovdqu 96(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, 40(%rdi) + vmovdqu %xmm1, 60(%rdi) + vmovss %xmm2, 56(%rdi) + vmovss %xmm4, 76(%rdi) + vmovdqu 128(%rsi), %ymm0 + vmovdqu 160(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, 80(%rdi) + vmovdqu %xmm1, 100(%rdi) + vmovss %xmm2, 96(%rdi) + vmovss %xmm4, 116(%rdi) + vmovdqu 192(%rsi), %ymm0 + vmovdqu 224(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, 120(%rdi) + vmovdqu %xmm1, 140(%rdi) + vmovss %xmm2, 136(%rdi) + vmovss %xmm4, 156(%rdi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, 160(%rdi) + vmovdqu %xmm1, 180(%rdi) + vmovss %xmm2, 176(%rdi) + vmovss %xmm4, 196(%rdi) + vmovdqu 320(%rsi), %ymm0 + vmovdqu 352(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, 200(%rdi) + vmovdqu %xmm1, 220(%rdi) + vmovss %xmm2, 216(%rdi) + vmovss %xmm4, 236(%rdi) + vmovdqu 384(%rsi), %ymm0 + vmovdqu 416(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, 240(%rdi) + vmovdqu %xmm1, 260(%rdi) + vmovss %xmm2, 256(%rdi) + vmovss %xmm4, 276(%rdi) + vmovdqu 448(%rsi), %ymm0 + vmovdqu 480(%rsi), %ymm1 + vpmullw %ymm7, %ymm0, %ymm2 + vpmullw %ymm7, %ymm1, %ymm4 + vpaddw %ymm12, %ymm0, %ymm3 + vpaddw %ymm12, %ymm1, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm1, %ymm1 + vpmulhuw %ymm6, %ymm0, %ymm0 + vpmulhuw %ymm6, %ymm1, %ymm1 + vpsubw %ymm3, %ymm2, %ymm3 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm3, %ymm2, %ymm2 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm2, %ymm2 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm2, %ymm0, %ymm0 + vpsubw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm13, %ymm0, %ymm0 + vpmulhrsw %ymm13, %ymm1, %ymm1 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpmaddwd %ymm8, %ymm0, %ymm0 + vpmaddwd %ymm8, %ymm1, %ymm1 + vpsllvd %ymm10, %ymm0, %ymm0 + vpsllvd %ymm10, %ymm1, %ymm1 + vpsrlq $12, %ymm0, %ymm0 + vpsrlq $12, %ymm1, %ymm1 + vpshufb %ymm11, %ymm0, %ymm0 + vpshufb %ymm11, %ymm1, %ymm1 + vextracti128 $0x01, %ymm0, %xmm2 + vextracti128 $0x01, %ymm1, %xmm4 + vpblendw $0xe0, %xmm2, %xmm0, %xmm0 + vpblendw $0xe0, %xmm4, %xmm1, %xmm1 + vmovdqu %xmm0, 280(%rdi) + vmovdqu %xmm1, 300(%rdi) + vmovss %xmm2, 296(%rdi) + vmovss %xmm4, 316(%rdi) + addq $0x140, %rdi + addq $0x200, %rsi + subl $0x01, %edx + jg L_kyber_compress_10_avx2_start + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_compress_10_avx2,.-kyber_compress_10_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_decompress_10_avx2_mask: +.long 0x7fe01ff8,0x7fe01ff8,0x7fe01ff8,0x7fe01ff8 +.long 0x7fe01ff8,0x7fe01ff8,0x7fe01ff8,0x7fe01ff8 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_decompress_10_avx2_sllv: +.quad 0x4, 0x4 +.quad 0x4, 0x4 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_decompress_10_avx2_q: +.long 0xd013404,0xd013404,0xd013404,0xd013404 +.long 0xd013404,0xd013404,0xd013404,0xd013404 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_10_avx2_shuf: +.value 0x100,0x201 +.value 0x302,0x403 +.value 0x605,0x706 +.value 0x807,0x908 +.value 0x302,0x403 +.value 0x504,0x605 +.value 0x807,0x908 +.value 0xa09,0xb0a +#ifndef __APPLE__ +.text +.globl kyber_decompress_10_avx2 +.type kyber_decompress_10_avx2,@function +.align 16 +kyber_decompress_10_avx2: +#else +.section __TEXT,__text +.globl _kyber_decompress_10_avx2 +.p2align 4 +_kyber_decompress_10_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_decompress_10_avx2_mask(%rip), %ymm4 + vmovdqu L_kyber_decompress_10_avx2_q(%rip), %ymm5 + vmovdqu L_kyber_decompress_10_avx2_shuf(%rip), %ymm6 + vmovdqu L_kyber_decompress_10_avx2_sllv(%rip), %ymm7 +L_kyber_decompress_10_avx2_start: + vpermq $0x94, (%rsi), %ymm0 + vpermq $0x94, 20(%rsi), %ymm1 + vpermq $0x94, 40(%rsi), %ymm2 + vpermq $0x94, 60(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm1, %ymm1 + vpsllvd %ymm7, %ymm2, %ymm2 + vpsllvd %ymm7, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm5, %ymm0, %ymm0 + vpmulhrsw %ymm5, %ymm1, %ymm1 + vpmulhrsw %ymm5, %ymm2, %ymm2 + vpmulhrsw %ymm5, %ymm3, %ymm3 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 96(%rdi) + vpermq $0x94, 80(%rsi), %ymm0 + vpermq $0x94, 100(%rsi), %ymm1 + vpermq $0x94, 120(%rsi), %ymm2 + vpermq $0x94, 140(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm1, %ymm1 + vpsllvd %ymm7, %ymm2, %ymm2 + vpsllvd %ymm7, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm5, %ymm0, %ymm0 + vpmulhrsw %ymm5, %ymm1, %ymm1 + vpmulhrsw %ymm5, %ymm2, %ymm2 + vpmulhrsw %ymm5, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, 160(%rdi) + vmovdqu %ymm2, 192(%rdi) + vmovdqu %ymm3, 224(%rdi) + vpermq $0x94, 160(%rsi), %ymm0 + vpermq $0x94, 180(%rsi), %ymm1 + vpermq $0x94, 200(%rsi), %ymm2 + vpermq $0x94, 220(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm1, %ymm1 + vpsllvd %ymm7, %ymm2, %ymm2 + vpsllvd %ymm7, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm5, %ymm0, %ymm0 + vpmulhrsw %ymm5, %ymm1, %ymm1 + vpmulhrsw %ymm5, %ymm2, %ymm2 + vpmulhrsw %ymm5, %ymm3, %ymm3 + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm1, 288(%rdi) + vmovdqu %ymm2, 320(%rdi) + vmovdqu %ymm3, 352(%rdi) + vpermq $0x94, 240(%rsi), %ymm0 + vpermq $0x94, 260(%rsi), %ymm1 + vpermq $0x94, 280(%rsi), %ymm2 + vpermq $0x94, 300(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm1, %ymm1 + vpsllvd %ymm7, %ymm2, %ymm2 + vpsllvd %ymm7, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm5, %ymm0, %ymm0 + vpmulhrsw %ymm5, %ymm1, %ymm1 + vpmulhrsw %ymm5, %ymm2, %ymm2 + vpmulhrsw %ymm5, %ymm3, %ymm3 + vmovdqu %ymm0, 384(%rdi) + vmovdqu %ymm1, 416(%rdi) + vmovdqu %ymm2, 448(%rdi) + vmovdqu %ymm3, 480(%rdi) + addq $0x140, %rsi + addq $0x200, %rdi + subl $0x01, %edx + jg L_kyber_decompress_10_avx2_start + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_decompress_10_avx2,.-kyber_decompress_10_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_v: +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_off: +.value 0x24,0x24 +.value 0x24,0x24 +.value 0x24,0x24 +.value 0x24,0x24 +.value 0x24,0x24 +.value 0x24,0x24 +.value 0x24,0x24 +.value 0x24,0x24 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_shift13: +.value 0x2000,0x2000 +.value 0x2000,0x2000 +.value 0x2000,0x2000 +.value 0x2000,0x2000 +.value 0x2000,0x2000 +.value 0x2000,0x2000 +.value 0x2000,0x2000 +.value 0x2000,0x2000 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_mask: +.value 0x7ff,0x7ff +.value 0x7ff,0x7ff +.value 0x7ff,0x7ff +.value 0x7ff,0x7ff +.value 0x7ff,0x7ff +.value 0x7ff,0x7ff +.value 0x7ff,0x7ff +.value 0x7ff,0x7ff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_shift: +.quad 0x800000108000001, 0x800000108000001 +.quad 0x800000108000001, 0x800000108000001 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_sllvd: +.long 0xa,0x0,0xa,0x0 +.long 0xa,0x0,0xa,0x0 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_srlvq: +.quad 0xa, 0x1e +.quad 0xa, 0x1e +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_11_avx2_shuf: +.value 0x100,0x302 +.value 0x504,0x706 +.value 0x908,0xff0a +.value 0xffff,0xffff +.value 0x605,0x807 +.value 0xa09,0xffff +.value 0xffff,0x0 +.value 0x201,0x403 +#ifndef __APPLE__ +.text +.globl kyber_compress_11_avx2 +.type kyber_compress_11_avx2,@function +.align 16 +kyber_compress_11_avx2: +#else +.section __TEXT,__text +.globl _kyber_compress_11_avx2 +.p2align 4 +_kyber_compress_11_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rsi), %ymm0 + vmovdqu L_kyber_compress_11_avx2_v(%rip), %ymm7 + vmovdqu L_kyber_compress_11_avx2_off(%rip), %ymm8 + vmovdqu L_kyber_compress_11_avx2_shift13(%rip), %ymm9 + vmovdqu L_kyber_compress_11_avx2_mask(%rip), %ymm10 + vmovdqu L_kyber_compress_11_avx2_shift(%rip), %ymm11 + vmovdqu L_kyber_compress_11_avx2_sllvd(%rip), %ymm12 + vmovdqu L_kyber_compress_11_avx2_srlvq(%rip), %ymm13 + vmovdqu L_kyber_compress_11_avx2_shuf(%rip), %ymm14 + vpsllw $3, %ymm7, %ymm6 +L_kyber_compress_11_avx2_start: + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, (%rdi) + vmovq %xmm1, 16(%rdi) + vmovdqu %xmm3, 22(%rdi) + vmovq %xmm4, 38(%rdi) + vmovdqu 64(%rsi), %ymm0 + vmovdqu 96(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, 44(%rdi) + vmovq %xmm1, 60(%rdi) + vmovdqu %xmm3, 66(%rdi) + vmovq %xmm4, 82(%rdi) + vmovdqu 128(%rsi), %ymm0 + vmovdqu 160(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, 88(%rdi) + vmovq %xmm1, 104(%rdi) + vmovdqu %xmm3, 110(%rdi) + vmovq %xmm4, 126(%rdi) + vmovdqu 192(%rsi), %ymm0 + vmovdqu 224(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, 132(%rdi) + vmovq %xmm1, 148(%rdi) + vmovdqu %xmm3, 154(%rdi) + vmovq %xmm4, 170(%rdi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, 176(%rdi) + vmovq %xmm1, 192(%rdi) + vmovdqu %xmm3, 198(%rdi) + vmovq %xmm4, 214(%rdi) + vmovdqu 320(%rsi), %ymm0 + vmovdqu 352(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, 220(%rdi) + vmovq %xmm1, 236(%rdi) + vmovdqu %xmm3, 242(%rdi) + vmovq %xmm4, 258(%rdi) + vmovdqu 384(%rsi), %ymm0 + vmovdqu 416(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, 264(%rdi) + vmovq %xmm1, 280(%rdi) + vmovdqu %xmm3, 286(%rdi) + vmovq %xmm4, 302(%rdi) + vmovdqu 448(%rsi), %ymm0 + vmovdqu 480(%rsi), %ymm3 + vpmullw %ymm6, %ymm0, %ymm1 + vpmullw %ymm6, %ymm3, %ymm4 + vpaddw %ymm8, %ymm0, %ymm2 + vpaddw %ymm8, %ymm3, %ymm5 + vpsllw $3, %ymm0, %ymm0 + vpsllw $3, %ymm3, %ymm3 + vpmulhw %ymm7, %ymm0, %ymm0 + vpmulhw %ymm7, %ymm3, %ymm3 + vpsubw %ymm2, %ymm1, %ymm2 + vpsubw %ymm5, %ymm4, %ymm5 + vpandn %ymm2, %ymm1, %ymm1 + vpandn %ymm5, %ymm4, %ymm4 + vpsrlw $15, %ymm1, %ymm1 + vpsrlw $15, %ymm4, %ymm4 + vpsubw %ymm1, %ymm0, %ymm0 + vpsubw %ymm4, %ymm3, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm10, %ymm0, %ymm0 + vpand %ymm10, %ymm3, %ymm3 + vpmaddwd %ymm11, %ymm0, %ymm0 + vpmaddwd %ymm11, %ymm3, %ymm3 + vpsllvd %ymm12, %ymm0, %ymm0 + vpsllvd %ymm12, %ymm3, %ymm3 + vpsrldq $8, %ymm0, %ymm1 + vpsrldq $8, %ymm3, %ymm4 + vpsrlvq %ymm13, %ymm0, %ymm0 + vpsrlvq %ymm13, %ymm3, %ymm3 + vpsllq $34, %ymm1, %ymm1 + vpsllq $34, %ymm4, %ymm4 + vpaddq %ymm1, %ymm0, %ymm0 + vpaddq %ymm4, %ymm3, %ymm3 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm3, %ymm3 + vextracti128 $0x01, %ymm0, %xmm1 + vextracti128 $0x01, %ymm3, %xmm4 + vpblendvb %xmm14, %xmm1, %xmm0, %xmm0 + vpblendvb %xmm14, %xmm4, %xmm3, %xmm3 + vmovdqu %xmm0, 308(%rdi) + vmovq %xmm1, 324(%rdi) + vmovdqu %xmm3, 330(%rdi) + vmovq %xmm4, 346(%rdi) + addq $0x160, %rdi + addq $0x200, %rsi + subl $0x01, %edx + jg L_kyber_compress_11_avx2_start + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_compress_11_avx2,.-kyber_compress_11_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_11_avx2_q: +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_11_avx2_shuf: +.value 0x100,0x201 +.value 0x302,0x504 +.value 0x605,0x706 +.value 0x908,0xa09 +.value 0x403,0x504 +.value 0x605,0x807 +.value 0x908,0xa09 +.value 0xc0b,0xd0c +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_decompress_11_avx2_sllv: +.long 0x0,0x1,0x0,0x0 +.long 0x0,0x1,0x0,0x0 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_decompress_11_avx2_srlv: +.quad 0x0, 0x2 +.quad 0x0, 0x2 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_11_avx2_shift: +.value 0x20,0x4 +.value 0x1,0x20 +.value 0x8,0x1 +.value 0x20,0x4 +.value 0x20,0x4 +.value 0x1,0x20 +.value 0x8,0x1 +.value 0x20,0x4 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_11_avx2_mask: +.value 0x7ff0,0x7ff0 +.value 0x7ff0,0x7ff0 +.value 0x7ff0,0x7ff0 +.value 0x7ff0,0x7ff0 +.value 0x7ff0,0x7ff0 +.value 0x7ff0,0x7ff0 +.value 0x7ff0,0x7ff0 +.value 0x7ff0,0x7ff0 +#ifndef __APPLE__ +.text +.globl kyber_decompress_11_avx2 +.type kyber_decompress_11_avx2,@function +.align 16 +kyber_decompress_11_avx2: +#else +.section __TEXT,__text +.globl _kyber_decompress_11_avx2 +.p2align 4 +_kyber_decompress_11_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_decompress_11_avx2_q(%rip), %ymm4 + vmovdqu L_kyber_decompress_11_avx2_shuf(%rip), %ymm5 + vmovdqu L_kyber_decompress_11_avx2_sllv(%rip), %ymm6 + vmovdqu L_kyber_decompress_11_avx2_srlv(%rip), %ymm7 + vmovdqu L_kyber_decompress_11_avx2_shift(%rip), %ymm8 + vmovdqu L_kyber_decompress_11_avx2_mask(%rip), %ymm9 +L_kyber_decompress_11_avx2_start: + vpermq $0x94, (%rsi), %ymm0 + vpermq $0x94, 22(%rsi), %ymm1 + vpermq $0x94, 44(%rsi), %ymm2 + vpermq $0x94, 66(%rsi), %ymm3 + vpshufb %ymm5, %ymm0, %ymm0 + vpshufb %ymm5, %ymm1, %ymm1 + vpshufb %ymm5, %ymm2, %ymm2 + vpshufb %ymm5, %ymm3, %ymm3 + vpsrlvd %ymm6, %ymm0, %ymm0 + vpsrlvd %ymm6, %ymm1, %ymm1 + vpsrlvd %ymm6, %ymm2, %ymm2 + vpsrlvd %ymm6, %ymm3, %ymm3 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm1, %ymm1 + vpsrlvq %ymm7, %ymm2, %ymm2 + vpsrlvq %ymm7, %ymm3, %ymm3 + vpmullw %ymm8, %ymm0, %ymm0 + vpmullw %ymm8, %ymm1, %ymm1 + vpmullw %ymm8, %ymm2, %ymm2 + vpmullw %ymm8, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpand %ymm9, %ymm2, %ymm2 + vpand %ymm9, %ymm3, %ymm3 + vpmulhrsw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm4, %ymm2, %ymm2 + vpmulhrsw %ymm4, %ymm3, %ymm3 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 96(%rdi) + vpermq $0x94, 88(%rsi), %ymm0 + vpermq $0x94, 110(%rsi), %ymm1 + vpermq $0x94, 132(%rsi), %ymm2 + vpermq $0x94, 154(%rsi), %ymm3 + vpshufb %ymm5, %ymm0, %ymm0 + vpshufb %ymm5, %ymm1, %ymm1 + vpshufb %ymm5, %ymm2, %ymm2 + vpshufb %ymm5, %ymm3, %ymm3 + vpsrlvd %ymm6, %ymm0, %ymm0 + vpsrlvd %ymm6, %ymm1, %ymm1 + vpsrlvd %ymm6, %ymm2, %ymm2 + vpsrlvd %ymm6, %ymm3, %ymm3 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm1, %ymm1 + vpsrlvq %ymm7, %ymm2, %ymm2 + vpsrlvq %ymm7, %ymm3, %ymm3 + vpmullw %ymm8, %ymm0, %ymm0 + vpmullw %ymm8, %ymm1, %ymm1 + vpmullw %ymm8, %ymm2, %ymm2 + vpmullw %ymm8, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpand %ymm9, %ymm2, %ymm2 + vpand %ymm9, %ymm3, %ymm3 + vpmulhrsw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm4, %ymm2, %ymm2 + vpmulhrsw %ymm4, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, 160(%rdi) + vmovdqu %ymm2, 192(%rdi) + vmovdqu %ymm3, 224(%rdi) + vpermq $0x94, 176(%rsi), %ymm0 + vpermq $0x94, 198(%rsi), %ymm1 + vpermq $0x94, 220(%rsi), %ymm2 + vpermq $0x94, 242(%rsi), %ymm3 + vpshufb %ymm5, %ymm0, %ymm0 + vpshufb %ymm5, %ymm1, %ymm1 + vpshufb %ymm5, %ymm2, %ymm2 + vpshufb %ymm5, %ymm3, %ymm3 + vpsrlvd %ymm6, %ymm0, %ymm0 + vpsrlvd %ymm6, %ymm1, %ymm1 + vpsrlvd %ymm6, %ymm2, %ymm2 + vpsrlvd %ymm6, %ymm3, %ymm3 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm1, %ymm1 + vpsrlvq %ymm7, %ymm2, %ymm2 + vpsrlvq %ymm7, %ymm3, %ymm3 + vpmullw %ymm8, %ymm0, %ymm0 + vpmullw %ymm8, %ymm1, %ymm1 + vpmullw %ymm8, %ymm2, %ymm2 + vpmullw %ymm8, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpand %ymm9, %ymm2, %ymm2 + vpand %ymm9, %ymm3, %ymm3 + vpmulhrsw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm4, %ymm2, %ymm2 + vpmulhrsw %ymm4, %ymm3, %ymm3 + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm1, 288(%rdi) + vmovdqu %ymm2, 320(%rdi) + vmovdqu %ymm3, 352(%rdi) + vpermq $0x94, 264(%rsi), %ymm0 + vpermq $0x94, 286(%rsi), %ymm1 + vpermq $0x94, 308(%rsi), %ymm2 + vpermq $0x94, 330(%rsi), %ymm3 + vpshufb %ymm5, %ymm0, %ymm0 + vpshufb %ymm5, %ymm1, %ymm1 + vpshufb %ymm5, %ymm2, %ymm2 + vpshufb %ymm5, %ymm3, %ymm3 + vpsrlvd %ymm6, %ymm0, %ymm0 + vpsrlvd %ymm6, %ymm1, %ymm1 + vpsrlvd %ymm6, %ymm2, %ymm2 + vpsrlvd %ymm6, %ymm3, %ymm3 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm1, %ymm1 + vpsrlvq %ymm7, %ymm2, %ymm2 + vpsrlvq %ymm7, %ymm3, %ymm3 + vpmullw %ymm8, %ymm0, %ymm0 + vpmullw %ymm8, %ymm1, %ymm1 + vpmullw %ymm8, %ymm2, %ymm2 + vpmullw %ymm8, %ymm3, %ymm3 + vpsrlw $0x01, %ymm0, %ymm0 + vpsrlw $0x01, %ymm1, %ymm1 + vpsrlw $0x01, %ymm2, %ymm2 + vpsrlw $0x01, %ymm3, %ymm3 + vpand %ymm9, %ymm0, %ymm0 + vpand %ymm9, %ymm1, %ymm1 + vpand %ymm9, %ymm2, %ymm2 + vpand %ymm9, %ymm3, %ymm3 + vpmulhrsw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm4, %ymm1, %ymm1 + vpmulhrsw %ymm4, %ymm2, %ymm2 + vpmulhrsw %ymm4, %ymm3, %ymm3 + vmovdqu %ymm0, 384(%rdi) + vmovdqu %ymm1, 416(%rdi) + vmovdqu %ymm2, 448(%rdi) + vmovdqu %ymm3, 480(%rdi) + addq $0x160, %rsi + addq $0x200, %rdi + subl $0x01, %edx + jg L_kyber_decompress_11_avx2_start + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_decompress_11_avx2,.-kyber_decompress_11_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_4_avx2_mask: +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +.value 0xf,0xf +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_4_avx2_shift: +.value 0x200,0x200 +.value 0x200,0x200 +.value 0x200,0x200 +.value 0x200,0x200 +.value 0x200,0x200 +.value 0x200,0x200 +.value 0x200,0x200 +.value 0x200,0x200 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_compress_4_avx2_perm: +.long 0x0,0x4,0x1,0x5 +.long 0x2,0x6,0x3,0x7 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_4_avx2_v: +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_4_avx2_shift12: +.value 0x1001,0x1001 +.value 0x1001,0x1001 +.value 0x1001,0x1001 +.value 0x1001,0x1001 +.value 0x1001,0x1001 +.value 0x1001,0x1001 +.value 0x1001,0x1001 +.value 0x1001,0x1001 +#ifndef __APPLE__ +.text +.globl kyber_compress_4_avx2 +.type kyber_compress_4_avx2,@function +.align 16 +kyber_compress_4_avx2: +#else +.section __TEXT,__text +.globl _kyber_compress_4_avx2 +.p2align 4 +_kyber_compress_4_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_compress_4_avx2_mask(%rip), %ymm8 + vmovdqu L_kyber_compress_4_avx2_shift(%rip), %ymm9 + vmovdqu L_kyber_compress_4_avx2_perm(%rip), %ymm10 + vmovdqu L_kyber_compress_4_avx2_v(%rip), %ymm11 + vmovdqu L_kyber_compress_4_avx2_shift12(%rip), %ymm12 + vpmulhw (%rsi), %ymm11, %ymm0 + vpmulhw 32(%rsi), %ymm11, %ymm1 + vpmulhw 64(%rsi), %ymm11, %ymm2 + vpmulhw 96(%rsi), %ymm11, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm1, %ymm1 + vpmulhrsw %ymm9, %ymm2, %ymm2 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpackuswb %ymm1, %ymm0, %ymm0 + vpackuswb %ymm3, %ymm2, %ymm2 + vpmaddubsw %ymm12, %ymm0, %ymm0 + vpmaddubsw %ymm12, %ymm2, %ymm2 + vpackuswb %ymm2, %ymm0, %ymm0 + vpmulhw 128(%rsi), %ymm11, %ymm4 + vpmulhw 160(%rsi), %ymm11, %ymm5 + vpmulhw 192(%rsi), %ymm11, %ymm6 + vpmulhw 224(%rsi), %ymm11, %ymm7 + vpmulhrsw %ymm9, %ymm4, %ymm4 + vpmulhrsw %ymm9, %ymm5, %ymm5 + vpmulhrsw %ymm9, %ymm6, %ymm6 + vpmulhrsw %ymm9, %ymm7, %ymm7 + vpand %ymm8, %ymm4, %ymm4 + vpand %ymm8, %ymm5, %ymm5 + vpand %ymm8, %ymm6, %ymm6 + vpand %ymm8, %ymm7, %ymm7 + vpackuswb %ymm5, %ymm4, %ymm4 + vpackuswb %ymm7, %ymm6, %ymm6 + vpmaddubsw %ymm12, %ymm4, %ymm4 + vpmaddubsw %ymm12, %ymm6, %ymm6 + vpackuswb %ymm6, %ymm4, %ymm4 + vpermd %ymm0, %ymm10, %ymm0 + vpermd %ymm4, %ymm10, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm4, 32(%rdi) + vpmulhw 256(%rsi), %ymm11, %ymm0 + vpmulhw 288(%rsi), %ymm11, %ymm1 + vpmulhw 320(%rsi), %ymm11, %ymm2 + vpmulhw 352(%rsi), %ymm11, %ymm3 + vpmulhrsw %ymm9, %ymm0, %ymm0 + vpmulhrsw %ymm9, %ymm1, %ymm1 + vpmulhrsw %ymm9, %ymm2, %ymm2 + vpmulhrsw %ymm9, %ymm3, %ymm3 + vpand %ymm8, %ymm0, %ymm0 + vpand %ymm8, %ymm1, %ymm1 + vpand %ymm8, %ymm2, %ymm2 + vpand %ymm8, %ymm3, %ymm3 + vpackuswb %ymm1, %ymm0, %ymm0 + vpackuswb %ymm3, %ymm2, %ymm2 + vpmaddubsw %ymm12, %ymm0, %ymm0 + vpmaddubsw %ymm12, %ymm2, %ymm2 + vpackuswb %ymm2, %ymm0, %ymm0 + vpmulhw 384(%rsi), %ymm11, %ymm4 + vpmulhw 416(%rsi), %ymm11, %ymm5 + vpmulhw 448(%rsi), %ymm11, %ymm6 + vpmulhw 480(%rsi), %ymm11, %ymm7 + vpmulhrsw %ymm9, %ymm4, %ymm4 + vpmulhrsw %ymm9, %ymm5, %ymm5 + vpmulhrsw %ymm9, %ymm6, %ymm6 + vpmulhrsw %ymm9, %ymm7, %ymm7 + vpand %ymm8, %ymm4, %ymm4 + vpand %ymm8, %ymm5, %ymm5 + vpand %ymm8, %ymm6, %ymm6 + vpand %ymm8, %ymm7, %ymm7 + vpackuswb %ymm5, %ymm4, %ymm4 + vpackuswb %ymm7, %ymm6, %ymm6 + vpmaddubsw %ymm12, %ymm4, %ymm4 + vpmaddubsw %ymm12, %ymm6, %ymm6 + vpackuswb %ymm6, %ymm4, %ymm4 + vpermd %ymm0, %ymm10, %ymm0 + vpermd %ymm4, %ymm10, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm4, 96(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_compress_4_avx2,.-kyber_compress_4_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_decompress_4_avx2_mask: +.long 0xf0000f,0xf0000f,0xf0000f,0xf0000f +.long 0xf0000f,0xf0000f,0xf0000f,0xf0000f +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_decompress_4_avx2_shift: +.long 0x800800,0x800800,0x800800,0x800800 +.long 0x800800,0x800800,0x800800,0x800800 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_4_avx2_q: +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_4_avx2_shuf: +.value 0x0,0x0 +.value 0x101,0x101 +.value 0x202,0x202 +.value 0x303,0x303 +.value 0x404,0x404 +.value 0x505,0x505 +.value 0x606,0x606 +.value 0x707,0x707 +#ifndef __APPLE__ +.text +.globl kyber_decompress_4_avx2 +.type kyber_decompress_4_avx2,@function +.align 16 +kyber_decompress_4_avx2: +#else +.section __TEXT,__text +.globl _kyber_decompress_4_avx2 +.p2align 4 +_kyber_decompress_4_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_decompress_4_avx2_mask(%rip), %ymm4 + vmovdqu L_kyber_decompress_4_avx2_shift(%rip), %ymm5 + vmovdqu L_kyber_decompress_4_avx2_shuf(%rip), %ymm6 + vmovdqu L_kyber_decompress_4_avx2_q(%rip), %ymm7 + vpbroadcastq (%rsi), %ymm0 + vpbroadcastq 8(%rsi), %ymm1 + vpbroadcastq 16(%rsi), %ymm2 + vpbroadcastq 24(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmullw %ymm5, %ymm0, %ymm0 + vpmullw %ymm5, %ymm1, %ymm1 + vpmullw %ymm5, %ymm2, %ymm2 + vpmullw %ymm5, %ymm3, %ymm3 + vpmulhrsw %ymm7, %ymm0, %ymm0 + vpmulhrsw %ymm7, %ymm1, %ymm1 + vpmulhrsw %ymm7, %ymm2, %ymm2 + vpmulhrsw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 96(%rdi) + vpbroadcastq 32(%rsi), %ymm0 + vpbroadcastq 40(%rsi), %ymm1 + vpbroadcastq 48(%rsi), %ymm2 + vpbroadcastq 56(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmullw %ymm5, %ymm0, %ymm0 + vpmullw %ymm5, %ymm1, %ymm1 + vpmullw %ymm5, %ymm2, %ymm2 + vpmullw %ymm5, %ymm3, %ymm3 + vpmulhrsw %ymm7, %ymm0, %ymm0 + vpmulhrsw %ymm7, %ymm1, %ymm1 + vpmulhrsw %ymm7, %ymm2, %ymm2 + vpmulhrsw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, 160(%rdi) + vmovdqu %ymm2, 192(%rdi) + vmovdqu %ymm3, 224(%rdi) + vpbroadcastq 64(%rsi), %ymm0 + vpbroadcastq 72(%rsi), %ymm1 + vpbroadcastq 80(%rsi), %ymm2 + vpbroadcastq 88(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmullw %ymm5, %ymm0, %ymm0 + vpmullw %ymm5, %ymm1, %ymm1 + vpmullw %ymm5, %ymm2, %ymm2 + vpmullw %ymm5, %ymm3, %ymm3 + vpmulhrsw %ymm7, %ymm0, %ymm0 + vpmulhrsw %ymm7, %ymm1, %ymm1 + vpmulhrsw %ymm7, %ymm2, %ymm2 + vpmulhrsw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm1, 288(%rdi) + vmovdqu %ymm2, 320(%rdi) + vmovdqu %ymm3, 352(%rdi) + vpbroadcastq 96(%rsi), %ymm0 + vpbroadcastq 104(%rsi), %ymm1 + vpbroadcastq 112(%rsi), %ymm2 + vpbroadcastq 120(%rsi), %ymm3 + vpshufb %ymm6, %ymm0, %ymm0 + vpshufb %ymm6, %ymm1, %ymm1 + vpshufb %ymm6, %ymm2, %ymm2 + vpshufb %ymm6, %ymm3, %ymm3 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpand %ymm4, %ymm2, %ymm2 + vpand %ymm4, %ymm3, %ymm3 + vpmullw %ymm5, %ymm0, %ymm0 + vpmullw %ymm5, %ymm1, %ymm1 + vpmullw %ymm5, %ymm2, %ymm2 + vpmullw %ymm5, %ymm3, %ymm3 + vpmulhrsw %ymm7, %ymm0, %ymm0 + vpmulhrsw %ymm7, %ymm1, %ymm1 + vpmulhrsw %ymm7, %ymm2, %ymm2 + vpmulhrsw %ymm7, %ymm3, %ymm3 + vmovdqu %ymm0, 384(%rdi) + vmovdqu %ymm1, 416(%rdi) + vmovdqu %ymm2, 448(%rdi) + vmovdqu %ymm3, 480(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_decompress_4_avx2,.-kyber_decompress_4_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_5_avx2_v: +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +.value 0x4ebf,0x4ebf +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_5_avx2_shift: +.value 0x400,0x400 +.value 0x400,0x400 +.value 0x400,0x400 +.value 0x400,0x400 +.value 0x400,0x400 +.value 0x400,0x400 +.value 0x400,0x400 +.value 0x400,0x400 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_5_avx2_mask: +.value 0x1f,0x1f +.value 0x1f,0x1f +.value 0x1f,0x1f +.value 0x1f,0x1f +.value 0x1f,0x1f +.value 0x1f,0x1f +.value 0x1f,0x1f +.value 0x1f,0x1f +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_5_avx2_shift1: +.value 0x2001,0x2001 +.value 0x2001,0x2001 +.value 0x2001,0x2001 +.value 0x2001,0x2001 +.value 0x2001,0x2001 +.value 0x2001,0x2001 +.value 0x2001,0x2001 +.value 0x2001,0x2001 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_compress_5_avx2_shift2: +.long 0x4000001,0x4000001,0x4000001,0x4000001 +.long 0x4000001,0x4000001,0x4000001,0x4000001 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_kyber_compress_5_avx2_shlv: +.quad 0xc, 0xc +.quad 0xc, 0xc +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_compress_5_avx2_shuffle: +.value 0x100,0x302 +.value 0xff04,0xffff +.value 0xffff,0x908 +.value 0xb0a,0xff0c +.value 0xa09,0xc0b +.value 0xff,0x201 +.value 0x403,0xffff +.value 0xffff,0x8ff +#ifndef __APPLE__ +.text +.globl kyber_compress_5_avx2 +.type kyber_compress_5_avx2,@function +.align 16 +kyber_compress_5_avx2: +#else +.section __TEXT,__text +.globl _kyber_compress_5_avx2 +.p2align 4 +_kyber_compress_5_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rsi), %ymm0 + vmovdqu L_kyber_compress_5_avx2_v(%rip), %ymm2 + vmovdqu L_kyber_compress_5_avx2_shift(%rip), %ymm3 + vmovdqu L_kyber_compress_5_avx2_mask(%rip), %ymm4 + vmovdqu L_kyber_compress_5_avx2_shift1(%rip), %ymm5 + vmovdqu L_kyber_compress_5_avx2_shift2(%rip), %ymm6 + vmovdqu L_kyber_compress_5_avx2_shlv(%rip), %ymm7 + vmovdqu L_kyber_compress_5_avx2_shuffle(%rip), %ymm8 + vpmulhw (%rsi), %ymm2, %ymm0 + vpmulhw 32(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, (%rdi) + movss %xmm1, 16(%rdi) + vpmulhw 64(%rsi), %ymm2, %ymm0 + vpmulhw 96(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, 20(%rdi) + movss %xmm1, 36(%rdi) + vpmulhw 128(%rsi), %ymm2, %ymm0 + vpmulhw 160(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, 40(%rdi) + movss %xmm1, 56(%rdi) + vpmulhw 192(%rsi), %ymm2, %ymm0 + vpmulhw 224(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, 60(%rdi) + movss %xmm1, 76(%rdi) + vpmulhw 256(%rsi), %ymm2, %ymm0 + vpmulhw 288(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, 80(%rdi) + movss %xmm1, 96(%rdi) + vpmulhw 320(%rsi), %ymm2, %ymm0 + vpmulhw 352(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, 100(%rdi) + movss %xmm1, 116(%rdi) + vpmulhw 384(%rsi), %ymm2, %ymm0 + vpmulhw 416(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, 120(%rdi) + movss %xmm1, 136(%rdi) + vpmulhw 448(%rsi), %ymm2, %ymm0 + vpmulhw 480(%rsi), %ymm2, %ymm1 + vpmulhrsw %ymm3, %ymm0, %ymm0 + vpmulhrsw %ymm3, %ymm1, %ymm1 + vpand %ymm4, %ymm0, %ymm0 + vpand %ymm4, %ymm1, %ymm1 + vpackuswb %ymm1, %ymm0, %ymm0 + vpmaddubsw %ymm5, %ymm0, %ymm0 + vpmaddwd %ymm6, %ymm0, %ymm0 + vpsllvd %ymm7, %ymm0, %ymm0 + vpsrlvq %ymm7, %ymm0, %ymm0 + vpshufb %ymm8, %ymm0, %ymm0 + vextracti128 $0x01, %ymm0, %xmm1 + vpblendvb %xmm8, %xmm1, %xmm0, %xmm0 + vmovdqu %xmm0, 140(%rdi) + movss %xmm1, 156(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_compress_5_avx2,.-kyber_compress_5_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_5_avx2_q: +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +.value 0xd01,0xd01 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_5_avx2_shuf: +.value 0x0,0x100 +.value 0x101,0x201 +.value 0x302,0x303 +.value 0x403,0x404 +.value 0x505,0x605 +.value 0x606,0x706 +.value 0x807,0x808 +.value 0x908,0x909 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_5_avx2_mask: +.value 0x1f,0x3e0 +.value 0x7c,0xf80 +.value 0x1f0,0x3e +.value 0x7c0,0xfb +.value 0x1f,0x3e0 +.value 0x7c,0xf80 +.value 0x1f0,0x3e +.value 0x7c0,0xfb +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_decompress_5_avx2_shift: +.value 0x400,0x20 +.value 0x100,0x8 +.value 0x40,0x200 +.value 0x10,0x80 +.value 0x400,0x20 +.value 0x100,0x8 +.value 0x40,0x200 +.value 0x10,0x80 +#ifndef __APPLE__ +.text +.globl kyber_decompress_5_avx2 +.type kyber_decompress_5_avx2,@function +.align 16 +kyber_decompress_5_avx2: +#else +.section __TEXT,__text +.globl _kyber_decompress_5_avx2 +.p2align 4 +_kyber_decompress_5_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_decompress_5_avx2_q(%rip), %ymm1 + vmovdqu L_kyber_decompress_5_avx2_shuf(%rip), %ymm2 + vmovdqu L_kyber_decompress_5_avx2_mask(%rip), %ymm3 + vmovdqu L_kyber_decompress_5_avx2_shift(%rip), %ymm4 + vbroadcasti128 (%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, (%rdi) + vbroadcasti128 10(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 32(%rdi) + vbroadcasti128 20(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 64(%rdi) + vbroadcasti128 30(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 96(%rdi) + vbroadcasti128 40(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 128(%rdi) + vbroadcasti128 50(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 160(%rdi) + vbroadcasti128 60(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 192(%rdi) + vbroadcasti128 70(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 224(%rdi) + vbroadcasti128 80(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 256(%rdi) + vbroadcasti128 90(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 288(%rdi) + vbroadcasti128 100(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 320(%rdi) + vbroadcasti128 110(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 352(%rdi) + vbroadcasti128 120(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 384(%rdi) + vbroadcasti128 130(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 416(%rdi) + vbroadcasti128 140(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 448(%rdi) + vbroadcasti128 150(%rsi), %ymm0 + vpshufb %ymm2, %ymm0, %ymm0 + vpand %ymm3, %ymm0, %ymm0 + vpmullw %ymm4, %ymm0, %ymm0 + vpmulhrsw %ymm1, %ymm0, %ymm0 + vmovdqu %ymm0, 480(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_decompress_5_avx2,.-kyber_decompress_5_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_from_msg_avx2_shift: +.long 0x3,0x2,0x1,0x0 +.long 0x3,0x2,0x1,0x0 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_from_msg_avx2_shuf: +.value 0x100,0x504 +.value 0x908,0xd0c +.value 0x302,0x706 +.value 0xb0a,0xf0e +.value 0x100,0x504 +.value 0x908,0xd0c +.value 0x302,0x706 +.value 0xb0a,0xf0e +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_from_msg_avx2_hqs: +.value 0x681,0x681 +.value 0x681,0x681 +.value 0x681,0x681 +.value 0x681,0x681 +.value 0x681,0x681 +.value 0x681,0x681 +.value 0x681,0x681 +.value 0x681,0x681 +#ifndef __APPLE__ +.text +.globl kyber_from_msg_avx2 +.type kyber_from_msg_avx2,@function +.align 16 +kyber_from_msg_avx2: +#else +.section __TEXT,__text +.globl _kyber_from_msg_avx2 +.p2align 4 +_kyber_from_msg_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rsi), %ymm0 + vmovdqu L_kyber_from_msg_avx2_shift(%rip), %ymm9 + vmovdqu L_kyber_from_msg_avx2_shuf(%rip), %ymm10 + vmovdqu L_kyber_from_msg_avx2_hqs(%rip), %ymm11 + vpshufd $0x00, %ymm0, %ymm4 + vpsllvd %ymm9, %ymm4, %ymm4 + vpshufb %ymm10, %ymm4, %ymm4 + vpsllw $12, %ymm4, %ymm1 + vpsllw $8, %ymm4, %ymm2 + vpsllw $4, %ymm4, %ymm3 + vpsraw $15, %ymm1, %ymm1 + vpsraw $15, %ymm2, %ymm2 + vpsraw $15, %ymm3, %ymm3 + vpsraw $15, %ymm4, %ymm4 + vpand %ymm11, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm11, %ymm4, %ymm4 + vpunpcklqdq %ymm2, %ymm1, %ymm5 + vpunpckhqdq %ymm2, %ymm1, %ymm7 + vpunpcklqdq %ymm4, %ymm3, %ymm6 + vpunpckhqdq %ymm4, %ymm3, %ymm8 + vperm2i128 $32, %ymm6, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm5, %ymm3 + vperm2i128 $32, %ymm8, %ymm7, %ymm2 + vperm2i128 $49, %ymm8, %ymm7, %ymm4 + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, 256(%rdi) + vmovdqu %ymm4, 288(%rdi) + vpshufd $0x55, %ymm0, %ymm4 + vpsllvd %ymm9, %ymm4, %ymm4 + vpshufb %ymm10, %ymm4, %ymm4 + vpsllw $12, %ymm4, %ymm1 + vpsllw $8, %ymm4, %ymm2 + vpsllw $4, %ymm4, %ymm3 + vpsraw $15, %ymm1, %ymm1 + vpsraw $15, %ymm2, %ymm2 + vpsraw $15, %ymm3, %ymm3 + vpsraw $15, %ymm4, %ymm4 + vpand %ymm11, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm11, %ymm4, %ymm4 + vpunpcklqdq %ymm2, %ymm1, %ymm5 + vpunpckhqdq %ymm2, %ymm1, %ymm7 + vpunpcklqdq %ymm4, %ymm3, %ymm6 + vpunpckhqdq %ymm4, %ymm3, %ymm8 + vperm2i128 $32, %ymm6, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm5, %ymm3 + vperm2i128 $32, %ymm8, %ymm7, %ymm2 + vperm2i128 $49, %ymm8, %ymm7, %ymm4 + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, 320(%rdi) + vmovdqu %ymm4, 352(%rdi) + vpshufd $0xaa, %ymm0, %ymm4 + vpsllvd %ymm9, %ymm4, %ymm4 + vpshufb %ymm10, %ymm4, %ymm4 + vpsllw $12, %ymm4, %ymm1 + vpsllw $8, %ymm4, %ymm2 + vpsllw $4, %ymm4, %ymm3 + vpsraw $15, %ymm1, %ymm1 + vpsraw $15, %ymm2, %ymm2 + vpsraw $15, %ymm3, %ymm3 + vpsraw $15, %ymm4, %ymm4 + vpand %ymm11, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm11, %ymm4, %ymm4 + vpunpcklqdq %ymm2, %ymm1, %ymm5 + vpunpckhqdq %ymm2, %ymm1, %ymm7 + vpunpcklqdq %ymm4, %ymm3, %ymm6 + vpunpckhqdq %ymm4, %ymm3, %ymm8 + vperm2i128 $32, %ymm6, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm5, %ymm3 + vperm2i128 $32, %ymm8, %ymm7, %ymm2 + vperm2i128 $49, %ymm8, %ymm7, %ymm4 + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, 160(%rdi) + vmovdqu %ymm3, 384(%rdi) + vmovdqu %ymm4, 416(%rdi) + vpshufd $0xff, %ymm0, %ymm4 + vpsllvd %ymm9, %ymm4, %ymm4 + vpshufb %ymm10, %ymm4, %ymm4 + vpsllw $12, %ymm4, %ymm1 + vpsllw $8, %ymm4, %ymm2 + vpsllw $4, %ymm4, %ymm3 + vpsraw $15, %ymm1, %ymm1 + vpsraw $15, %ymm2, %ymm2 + vpsraw $15, %ymm3, %ymm3 + vpsraw $15, %ymm4, %ymm4 + vpand %ymm11, %ymm1, %ymm1 + vpand %ymm11, %ymm2, %ymm2 + vpand %ymm11, %ymm3, %ymm3 + vpand %ymm11, %ymm4, %ymm4 + vpunpcklqdq %ymm2, %ymm1, %ymm5 + vpunpckhqdq %ymm2, %ymm1, %ymm7 + vpunpcklqdq %ymm4, %ymm3, %ymm6 + vpunpckhqdq %ymm4, %ymm3, %ymm8 + vperm2i128 $32, %ymm6, %ymm5, %ymm1 + vperm2i128 $49, %ymm6, %ymm5, %ymm3 + vperm2i128 $32, %ymm8, %ymm7, %ymm2 + vperm2i128 $49, %ymm8, %ymm7, %ymm4 + vmovdqu %ymm1, 192(%rdi) + vmovdqu %ymm2, 224(%rdi) + vmovdqu %ymm3, 448(%rdi) + vmovdqu %ymm4, 480(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_from_msg_avx2,.-kyber_from_msg_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_to_msg_avx2_hqs: +.value 0x680,0x680 +.value 0x680,0x680 +.value 0x680,0x680 +.value 0x680,0x680 +.value 0x680,0x680 +.value 0x680,0x680 +.value 0x680,0x680 +.value 0x680,0x680 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_to_msg_avx2_hhqs: +.value 0xfcc1,0xfcc1 +.value 0xfcc1,0xfcc1 +.value 0xfcc1,0xfcc1 +.value 0xfcc1,0xfcc1 +.value 0xfcc1,0xfcc1 +.value 0xfcc1,0xfcc1 +.value 0xfcc1,0xfcc1 +.value 0xfcc1,0xfcc1 +#ifndef __APPLE__ +.text +.globl kyber_to_msg_avx2 +.type kyber_to_msg_avx2,@function +.align 16 +kyber_to_msg_avx2: +#else +.section __TEXT,__text +.globl _kyber_to_msg_avx2 +.p2align 4 +_kyber_to_msg_avx2: +#endif /* __APPLE__ */ + vmovdqu L_kyber_to_msg_avx2_hqs(%rip), %ymm8 + vmovdqu L_kyber_to_msg_avx2_hhqs(%rip), %ymm9 + vpsubw (%rsi), %ymm8, %ymm0 + vpsubw 32(%rsi), %ymm8, %ymm1 + vpsubw 64(%rsi), %ymm8, %ymm2 + vpsubw 96(%rsi), %ymm8, %ymm3 + vpsraw $15, %ymm0, %ymm4 + vpsraw $15, %ymm1, %ymm5 + vpsraw $15, %ymm2, %ymm6 + vpsraw $15, %ymm3, %ymm7 + vpxor %ymm4, %ymm0, %ymm0 + vpxor %ymm5, %ymm1, %ymm1 + vpxor %ymm6, %ymm2, %ymm2 + vpxor %ymm7, %ymm3, %ymm3 + vpaddw %ymm9, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm9, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vpacksswb %ymm1, %ymm0, %ymm0 + vpacksswb %ymm3, %ymm2, %ymm2 + vpermq $0xd8, %ymm0, %ymm0 + vpermq $0xd8, %ymm2, %ymm2 + vpmovmskb %ymm0, %edx + vpmovmskb %ymm2, %eax + movl %edx, (%rdi) + movl %eax, 4(%rdi) + vpsubw 128(%rsi), %ymm8, %ymm0 + vpsubw 160(%rsi), %ymm8, %ymm1 + vpsubw 192(%rsi), %ymm8, %ymm2 + vpsubw 224(%rsi), %ymm8, %ymm3 + vpsraw $15, %ymm0, %ymm4 + vpsraw $15, %ymm1, %ymm5 + vpsraw $15, %ymm2, %ymm6 + vpsraw $15, %ymm3, %ymm7 + vpxor %ymm4, %ymm0, %ymm0 + vpxor %ymm5, %ymm1, %ymm1 + vpxor %ymm6, %ymm2, %ymm2 + vpxor %ymm7, %ymm3, %ymm3 + vpaddw %ymm9, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm9, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vpacksswb %ymm1, %ymm0, %ymm0 + vpacksswb %ymm3, %ymm2, %ymm2 + vpermq $0xd8, %ymm0, %ymm0 + vpermq $0xd8, %ymm2, %ymm2 + vpmovmskb %ymm0, %edx + vpmovmskb %ymm2, %eax + movl %edx, 8(%rdi) + movl %eax, 12(%rdi) + vpsubw 256(%rsi), %ymm8, %ymm0 + vpsubw 288(%rsi), %ymm8, %ymm1 + vpsubw 320(%rsi), %ymm8, %ymm2 + vpsubw 352(%rsi), %ymm8, %ymm3 + vpsraw $15, %ymm0, %ymm4 + vpsraw $15, %ymm1, %ymm5 + vpsraw $15, %ymm2, %ymm6 + vpsraw $15, %ymm3, %ymm7 + vpxor %ymm4, %ymm0, %ymm0 + vpxor %ymm5, %ymm1, %ymm1 + vpxor %ymm6, %ymm2, %ymm2 + vpxor %ymm7, %ymm3, %ymm3 + vpaddw %ymm9, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm9, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vpacksswb %ymm1, %ymm0, %ymm0 + vpacksswb %ymm3, %ymm2, %ymm2 + vpermq $0xd8, %ymm0, %ymm0 + vpermq $0xd8, %ymm2, %ymm2 + vpmovmskb %ymm0, %edx + vpmovmskb %ymm2, %eax + movl %edx, 16(%rdi) + movl %eax, 20(%rdi) + vpsubw 384(%rsi), %ymm8, %ymm0 + vpsubw 416(%rsi), %ymm8, %ymm1 + vpsubw 448(%rsi), %ymm8, %ymm2 + vpsubw 480(%rsi), %ymm8, %ymm3 + vpsraw $15, %ymm0, %ymm4 + vpsraw $15, %ymm1, %ymm5 + vpsraw $15, %ymm2, %ymm6 + vpsraw $15, %ymm3, %ymm7 + vpxor %ymm4, %ymm0, %ymm0 + vpxor %ymm5, %ymm1, %ymm1 + vpxor %ymm6, %ymm2, %ymm2 + vpxor %ymm7, %ymm3, %ymm3 + vpaddw %ymm9, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm9, %ymm2, %ymm2 + vpaddw %ymm9, %ymm3, %ymm3 + vpacksswb %ymm1, %ymm0, %ymm0 + vpacksswb %ymm3, %ymm2, %ymm2 + vpermq $0xd8, %ymm0, %ymm0 + vpermq $0xd8, %ymm2, %ymm2 + vpmovmskb %ymm0, %edx + vpmovmskb %ymm2, %eax + movl %edx, 24(%rdi) + movl %eax, 28(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_to_msg_avx2,.-kyber_to_msg_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_from_bytes_avx2_shuf: +.value 0x100,0xff02 +.value 0x403,0xff05 +.value 0x706,0xff08 +.value 0xa09,0xff0b +.value 0x504,0xff06 +.value 0x807,0xff09 +.value 0xb0a,0xff0c +.value 0xe0d,0xff0f +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_from_bytes_avx2_mask: +.long 0xfff,0xfff,0xfff,0xfff +.long 0xfff,0xfff,0xfff,0xfff +#ifndef __APPLE__ +.text +.globl kyber_from_bytes_avx2 +.type kyber_from_bytes_avx2,@function +.align 16 +kyber_from_bytes_avx2: +#else +.section __TEXT,__text +.globl _kyber_from_bytes_avx2 +.p2align 4 +_kyber_from_bytes_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rsi), %ymm0 + vmovdqu L_kyber_from_bytes_avx2_shuf(%rip), %ymm12 + vmovdqu L_kyber_from_bytes_avx2_mask(%rip), %ymm13 + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu 128(%rsi), %ymm4 + vmovdqu 160(%rsi), %ymm5 + vpermq $0xe9, %ymm5, %ymm7 + vpermq $0x00, %ymm5, %ymm8 + vpermq $62, %ymm4, %ymm6 + vpermq $0x40, %ymm4, %ymm9 + vpermq $3, %ymm3, %ymm5 + vpermq $0x94, %ymm3, %ymm4 + vpermq $0xe9, %ymm2, %ymm3 + vpermq $0x00, %ymm2, %ymm10 + vpermq $62, %ymm1, %ymm2 + vpermq $0x40, %ymm1, %ymm11 + vpermq $3, %ymm0, %ymm1 + vpermq $0x94, %ymm0, %ymm0 + vpblendd $0xc0, %ymm8, %ymm6, %ymm6 + vpblendd $0xfc, %ymm9, %ymm5, %ymm5 + vpblendd $0xc0, %ymm10, %ymm2, %ymm2 + vpblendd $0xfc, %ymm11, %ymm1, %ymm1 + vpshufb %ymm12, %ymm0, %ymm0 + vpshufb %ymm12, %ymm1, %ymm1 + vpshufb %ymm12, %ymm2, %ymm2 + vpshufb %ymm12, %ymm3, %ymm3 + vpshufb %ymm12, %ymm4, %ymm4 + vpshufb %ymm12, %ymm5, %ymm5 + vpshufb %ymm12, %ymm6, %ymm6 + vpshufb %ymm12, %ymm7, %ymm7 + vpandn %ymm0, %ymm13, %ymm8 + vpandn %ymm1, %ymm13, %ymm9 + vpandn %ymm2, %ymm13, %ymm10 + vpandn %ymm3, %ymm13, %ymm11 + vpand %ymm0, %ymm13, %ymm0 + vpand %ymm1, %ymm13, %ymm1 + vpand %ymm2, %ymm13, %ymm2 + vpand %ymm3, %ymm13, %ymm3 + vpslld $4, %ymm8, %ymm8 + vpslld $4, %ymm9, %ymm9 + vpslld $4, %ymm10, %ymm10 + vpslld $4, %ymm11, %ymm11 + vpor %ymm8, %ymm0, %ymm0 + vpor %ymm9, %ymm1, %ymm1 + vpor %ymm10, %ymm2, %ymm2 + vpor %ymm11, %ymm3, %ymm3 + vpandn %ymm4, %ymm13, %ymm8 + vpandn %ymm5, %ymm13, %ymm9 + vpandn %ymm6, %ymm13, %ymm10 + vpandn %ymm7, %ymm13, %ymm11 + vpand %ymm4, %ymm13, %ymm4 + vpand %ymm5, %ymm13, %ymm5 + vpand %ymm6, %ymm13, %ymm6 + vpand %ymm7, %ymm13, %ymm7 + vpslld $4, %ymm8, %ymm8 + vpslld $4, %ymm9, %ymm9 + vpslld $4, %ymm10, %ymm10 + vpslld $4, %ymm11, %ymm11 + vpor %ymm8, %ymm4, %ymm4 + vpor %ymm9, %ymm5, %ymm5 + vpor %ymm10, %ymm6, %ymm6 + vpor %ymm11, %ymm7, %ymm7 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 128(%rdi) + vmovdqu %ymm5, 160(%rdi) + vmovdqu %ymm6, 192(%rdi) + vmovdqu %ymm7, 224(%rdi) + vmovdqu 192(%rsi), %ymm0 + vmovdqu 224(%rsi), %ymm1 + vmovdqu 256(%rsi), %ymm2 + vmovdqu 288(%rsi), %ymm3 + vmovdqu 320(%rsi), %ymm4 + vmovdqu 352(%rsi), %ymm5 + vpermq $0xe9, %ymm5, %ymm7 + vpermq $0x00, %ymm5, %ymm8 + vpermq $62, %ymm4, %ymm6 + vpermq $0x40, %ymm4, %ymm9 + vpermq $3, %ymm3, %ymm5 + vpermq $0x94, %ymm3, %ymm4 + vpermq $0xe9, %ymm2, %ymm3 + vpermq $0x00, %ymm2, %ymm10 + vpermq $62, %ymm1, %ymm2 + vpermq $0x40, %ymm1, %ymm11 + vpermq $3, %ymm0, %ymm1 + vpermq $0x94, %ymm0, %ymm0 + vpblendd $0xc0, %ymm8, %ymm6, %ymm6 + vpblendd $0xfc, %ymm9, %ymm5, %ymm5 + vpblendd $0xc0, %ymm10, %ymm2, %ymm2 + vpblendd $0xfc, %ymm11, %ymm1, %ymm1 + vpshufb %ymm12, %ymm0, %ymm0 + vpshufb %ymm12, %ymm1, %ymm1 + vpshufb %ymm12, %ymm2, %ymm2 + vpshufb %ymm12, %ymm3, %ymm3 + vpshufb %ymm12, %ymm4, %ymm4 + vpshufb %ymm12, %ymm5, %ymm5 + vpshufb %ymm12, %ymm6, %ymm6 + vpshufb %ymm12, %ymm7, %ymm7 + vpandn %ymm0, %ymm13, %ymm8 + vpandn %ymm1, %ymm13, %ymm9 + vpandn %ymm2, %ymm13, %ymm10 + vpandn %ymm3, %ymm13, %ymm11 + vpand %ymm0, %ymm13, %ymm0 + vpand %ymm1, %ymm13, %ymm1 + vpand %ymm2, %ymm13, %ymm2 + vpand %ymm3, %ymm13, %ymm3 + vpslld $4, %ymm8, %ymm8 + vpslld $4, %ymm9, %ymm9 + vpslld $4, %ymm10, %ymm10 + vpslld $4, %ymm11, %ymm11 + vpor %ymm8, %ymm0, %ymm0 + vpor %ymm9, %ymm1, %ymm1 + vpor %ymm10, %ymm2, %ymm2 + vpor %ymm11, %ymm3, %ymm3 + vpandn %ymm4, %ymm13, %ymm8 + vpandn %ymm5, %ymm13, %ymm9 + vpandn %ymm6, %ymm13, %ymm10 + vpandn %ymm7, %ymm13, %ymm11 + vpand %ymm4, %ymm13, %ymm4 + vpand %ymm5, %ymm13, %ymm5 + vpand %ymm6, %ymm13, %ymm6 + vpand %ymm7, %ymm13, %ymm7 + vpslld $4, %ymm8, %ymm8 + vpslld $4, %ymm9, %ymm9 + vpslld $4, %ymm10, %ymm10 + vpslld $4, %ymm11, %ymm11 + vpor %ymm8, %ymm4, %ymm4 + vpor %ymm9, %ymm5, %ymm5 + vpor %ymm10, %ymm6, %ymm6 + vpor %ymm11, %ymm7, %ymm7 + vmovdqu %ymm0, 256(%rdi) + vmovdqu %ymm1, 288(%rdi) + vmovdqu %ymm2, 320(%rdi) + vmovdqu %ymm3, 352(%rdi) + vmovdqu %ymm4, 384(%rdi) + vmovdqu %ymm5, 416(%rdi) + vmovdqu %ymm6, 448(%rdi) + vmovdqu %ymm7, 480(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_from_bytes_avx2,.-kyber_from_bytes_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_to_bytes_avx2_mask: +.long 0xfff,0xfff,0xfff,0xfff +.long 0xfff,0xfff,0xfff,0xfff +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_kyber_to_bytes_avx2_shuf: +.value 0x100,0x402 +.value 0x605,0x908 +.value 0xc0a,0xe0d +.value 0xffff,0xffff +.value 0x605,0x908 +.value 0xc0a,0xe0d +.value 0xffff,0xffff +.value 0x100,0x402 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +L_kyber_to_bytes_avx2_perm: +.long 0x0,0x1,0x2,0x7 +.long 0x4,0x5,0x3,0x6 +#ifndef __APPLE__ +.text +.globl kyber_to_bytes_avx2 +.type kyber_to_bytes_avx2,@function +.align 16 +kyber_to_bytes_avx2: +#else +.section __TEXT,__text +.globl _kyber_to_bytes_avx2 +.p2align 4 +_kyber_to_bytes_avx2: +#endif /* __APPLE__ */ + vmovdqu kyber_q(%rip), %ymm12 + vmovdqu L_kyber_to_bytes_avx2_mask(%rip), %ymm13 + vmovdqu L_kyber_to_bytes_avx2_shuf(%rip), %ymm14 + vmovdqu L_kyber_to_bytes_avx2_perm(%rip), %ymm15 + vmovdqu (%rsi), %ymm0 + vmovdqu 32(%rsi), %ymm1 + vmovdqu 64(%rsi), %ymm2 + vmovdqu 96(%rsi), %ymm3 + vmovdqu 128(%rsi), %ymm4 + vmovdqu 160(%rsi), %ymm5 + vmovdqu 192(%rsi), %ymm6 + vmovdqu 224(%rsi), %ymm7 + vpsubw %ymm12, %ymm0, %ymm8 + vpsubw %ymm12, %ymm1, %ymm9 + vpsubw %ymm12, %ymm2, %ymm10 + vpsubw %ymm12, %ymm3, %ymm11 + vpsraw $15, %ymm8, %ymm0 + vpsraw $15, %ymm9, %ymm1 + vpsraw $15, %ymm10, %ymm2 + vpsraw $15, %ymm11, %ymm3 + vpand %ymm12, %ymm0, %ymm0 + vpand %ymm12, %ymm1, %ymm1 + vpand %ymm12, %ymm2, %ymm2 + vpand %ymm12, %ymm3, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm10, %ymm2, %ymm2 + vpaddw %ymm11, %ymm3, %ymm3 + vpsubw %ymm12, %ymm4, %ymm8 + vpsubw %ymm12, %ymm5, %ymm9 + vpsubw %ymm12, %ymm6, %ymm10 + vpsubw %ymm12, %ymm7, %ymm11 + vpsraw $15, %ymm8, %ymm4 + vpsraw $15, %ymm9, %ymm5 + vpsraw $15, %ymm10, %ymm6 + vpsraw $15, %ymm11, %ymm7 + vpand %ymm12, %ymm4, %ymm4 + vpand %ymm12, %ymm5, %ymm5 + vpand %ymm12, %ymm6, %ymm6 + vpand %ymm12, %ymm7, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + vpaddw %ymm10, %ymm6, %ymm6 + vpaddw %ymm11, %ymm7, %ymm7 + vpsrld $16, %ymm0, %ymm8 + vpsrld $16, %ymm1, %ymm9 + vpsrld $16, %ymm2, %ymm10 + vpsrld $16, %ymm3, %ymm11 + vpand %ymm0, %ymm13, %ymm0 + vpand %ymm1, %ymm13, %ymm1 + vpand %ymm2, %ymm13, %ymm2 + vpand %ymm3, %ymm13, %ymm3 + vpslld $12, %ymm8, %ymm8 + vpslld $12, %ymm9, %ymm9 + vpslld $12, %ymm10, %ymm10 + vpslld $12, %ymm11, %ymm11 + vpor %ymm8, %ymm0, %ymm0 + vpor %ymm9, %ymm1, %ymm1 + vpor %ymm10, %ymm2, %ymm2 + vpor %ymm11, %ymm3, %ymm3 + vpsrld $16, %ymm4, %ymm8 + vpsrld $16, %ymm5, %ymm9 + vpsrld $16, %ymm6, %ymm10 + vpsrld $16, %ymm7, %ymm11 + vpand %ymm4, %ymm13, %ymm4 + vpand %ymm5, %ymm13, %ymm5 + vpand %ymm6, %ymm13, %ymm6 + vpand %ymm7, %ymm13, %ymm7 + vpslld $12, %ymm8, %ymm8 + vpslld $12, %ymm9, %ymm9 + vpslld $12, %ymm10, %ymm10 + vpslld $12, %ymm11, %ymm11 + vpor %ymm8, %ymm4, %ymm4 + vpor %ymm9, %ymm5, %ymm5 + vpor %ymm10, %ymm6, %ymm6 + vpor %ymm11, %ymm7, %ymm7 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm1, %ymm1 + vpshufb %ymm14, %ymm2, %ymm2 + vpshufb %ymm14, %ymm3, %ymm3 + vpshufb %ymm14, %ymm4, %ymm4 + vpshufb %ymm14, %ymm5, %ymm5 + vpshufb %ymm14, %ymm6, %ymm6 + vpshufb %ymm14, %ymm7, %ymm7 + vpermd %ymm0, %ymm15, %ymm0 + vpermd %ymm1, %ymm15, %ymm1 + vpermd %ymm2, %ymm15, %ymm2 + vpermd %ymm3, %ymm15, %ymm3 + vpermd %ymm4, %ymm15, %ymm4 + vpermd %ymm5, %ymm15, %ymm5 + vpermd %ymm6, %ymm15, %ymm6 + vpermd %ymm7, %ymm15, %ymm7 + vpermq $2, %ymm6, %ymm8 + vpermq $0x90, %ymm7, %ymm7 + vpermq $9, %ymm5, %ymm9 + vpermq $0x40, %ymm6, %ymm6 + vpermq $0x00, %ymm5, %ymm5 + vpblendd $63, %ymm4, %ymm5, %ymm5 + vpermq $2, %ymm2, %ymm10 + vpermq $0x90, %ymm3, %ymm4 + vpermq $9, %ymm1, %ymm11 + vpermq $0x40, %ymm2, %ymm3 + vpermq $0x00, %ymm1, %ymm2 + vpblendd $63, %ymm0, %ymm2, %ymm2 + vpblendd $3, %ymm8, %ymm7, %ymm7 + vpblendd $15, %ymm9, %ymm6, %ymm6 + vpblendd $3, %ymm10, %ymm4, %ymm4 + vpblendd $15, %ymm11, %ymm3, %ymm3 + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 64(%rdi) + vmovdqu %ymm5, 96(%rdi) + vmovdqu %ymm6, 128(%rdi) + vmovdqu %ymm7, 160(%rdi) + vmovdqu 256(%rsi), %ymm0 + vmovdqu 288(%rsi), %ymm1 + vmovdqu 320(%rsi), %ymm2 + vmovdqu 352(%rsi), %ymm3 + vmovdqu 384(%rsi), %ymm4 + vmovdqu 416(%rsi), %ymm5 + vmovdqu 448(%rsi), %ymm6 + vmovdqu 480(%rsi), %ymm7 + vpsubw %ymm12, %ymm0, %ymm8 + vpsubw %ymm12, %ymm1, %ymm9 + vpsubw %ymm12, %ymm2, %ymm10 + vpsubw %ymm12, %ymm3, %ymm11 + vpsraw $15, %ymm8, %ymm0 + vpsraw $15, %ymm9, %ymm1 + vpsraw $15, %ymm10, %ymm2 + vpsraw $15, %ymm11, %ymm3 + vpand %ymm12, %ymm0, %ymm0 + vpand %ymm12, %ymm1, %ymm1 + vpand %ymm12, %ymm2, %ymm2 + vpand %ymm12, %ymm3, %ymm3 + vpaddw %ymm8, %ymm0, %ymm0 + vpaddw %ymm9, %ymm1, %ymm1 + vpaddw %ymm10, %ymm2, %ymm2 + vpaddw %ymm11, %ymm3, %ymm3 + vpsubw %ymm12, %ymm4, %ymm8 + vpsubw %ymm12, %ymm5, %ymm9 + vpsubw %ymm12, %ymm6, %ymm10 + vpsubw %ymm12, %ymm7, %ymm11 + vpsraw $15, %ymm8, %ymm4 + vpsraw $15, %ymm9, %ymm5 + vpsraw $15, %ymm10, %ymm6 + vpsraw $15, %ymm11, %ymm7 + vpand %ymm12, %ymm4, %ymm4 + vpand %ymm12, %ymm5, %ymm5 + vpand %ymm12, %ymm6, %ymm6 + vpand %ymm12, %ymm7, %ymm7 + vpaddw %ymm8, %ymm4, %ymm4 + vpaddw %ymm9, %ymm5, %ymm5 + vpaddw %ymm10, %ymm6, %ymm6 + vpaddw %ymm11, %ymm7, %ymm7 + vpsrld $16, %ymm0, %ymm8 + vpsrld $16, %ymm1, %ymm9 + vpsrld $16, %ymm2, %ymm10 + vpsrld $16, %ymm3, %ymm11 + vpand %ymm0, %ymm13, %ymm0 + vpand %ymm1, %ymm13, %ymm1 + vpand %ymm2, %ymm13, %ymm2 + vpand %ymm3, %ymm13, %ymm3 + vpslld $12, %ymm8, %ymm8 + vpslld $12, %ymm9, %ymm9 + vpslld $12, %ymm10, %ymm10 + vpslld $12, %ymm11, %ymm11 + vpor %ymm8, %ymm0, %ymm0 + vpor %ymm9, %ymm1, %ymm1 + vpor %ymm10, %ymm2, %ymm2 + vpor %ymm11, %ymm3, %ymm3 + vpsrld $16, %ymm4, %ymm8 + vpsrld $16, %ymm5, %ymm9 + vpsrld $16, %ymm6, %ymm10 + vpsrld $16, %ymm7, %ymm11 + vpand %ymm4, %ymm13, %ymm4 + vpand %ymm5, %ymm13, %ymm5 + vpand %ymm6, %ymm13, %ymm6 + vpand %ymm7, %ymm13, %ymm7 + vpslld $12, %ymm8, %ymm8 + vpslld $12, %ymm9, %ymm9 + vpslld $12, %ymm10, %ymm10 + vpslld $12, %ymm11, %ymm11 + vpor %ymm8, %ymm4, %ymm4 + vpor %ymm9, %ymm5, %ymm5 + vpor %ymm10, %ymm6, %ymm6 + vpor %ymm11, %ymm7, %ymm7 + vpshufb %ymm14, %ymm0, %ymm0 + vpshufb %ymm14, %ymm1, %ymm1 + vpshufb %ymm14, %ymm2, %ymm2 + vpshufb %ymm14, %ymm3, %ymm3 + vpshufb %ymm14, %ymm4, %ymm4 + vpshufb %ymm14, %ymm5, %ymm5 + vpshufb %ymm14, %ymm6, %ymm6 + vpshufb %ymm14, %ymm7, %ymm7 + vpermd %ymm0, %ymm15, %ymm0 + vpermd %ymm1, %ymm15, %ymm1 + vpermd %ymm2, %ymm15, %ymm2 + vpermd %ymm3, %ymm15, %ymm3 + vpermd %ymm4, %ymm15, %ymm4 + vpermd %ymm5, %ymm15, %ymm5 + vpermd %ymm6, %ymm15, %ymm6 + vpermd %ymm7, %ymm15, %ymm7 + vpermq $2, %ymm6, %ymm8 + vpermq $0x90, %ymm7, %ymm7 + vpermq $9, %ymm5, %ymm9 + vpermq $0x40, %ymm6, %ymm6 + vpermq $0x00, %ymm5, %ymm5 + vpblendd $63, %ymm4, %ymm5, %ymm5 + vpermq $2, %ymm2, %ymm10 + vpermq $0x90, %ymm3, %ymm4 + vpermq $9, %ymm1, %ymm11 + vpermq $0x40, %ymm2, %ymm3 + vpermq $0x00, %ymm1, %ymm2 + vpblendd $63, %ymm0, %ymm2, %ymm2 + vpblendd $3, %ymm8, %ymm7, %ymm7 + vpblendd $15, %ymm9, %ymm6, %ymm6 + vpblendd $3, %ymm10, %ymm4, %ymm4 + vpblendd $15, %ymm11, %ymm3, %ymm3 + vmovdqu %ymm2, 192(%rdi) + vmovdqu %ymm3, 224(%rdi) + vmovdqu %ymm4, 256(%rdi) + vmovdqu %ymm5, 288(%rdi) + vmovdqu %ymm6, 320(%rdi) + vmovdqu %ymm7, 352(%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_to_bytes_avx2,.-kyber_to_bytes_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_cmp_avx2 +.type kyber_cmp_avx2,@function +.align 16 +kyber_cmp_avx2: +#else +.section __TEXT,__text +.globl _kyber_cmp_avx2 +.p2align 4 +_kyber_cmp_avx2: +#endif /* __APPLE__ */ + vpxor %ymm2, %ymm2, %ymm2 + vpxor %ymm3, %ymm3, %ymm3 + movl $0x00, %ecx + movl $-1, %r8d + vmovdqu (%rdi), %ymm0 + vmovdqu 32(%rdi), %ymm1 + vpxor (%rsi), %ymm0, %ymm0 + vpxor 32(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 64(%rdi), %ymm0 + vmovdqu 96(%rdi), %ymm1 + vpxor 64(%rsi), %ymm0, %ymm0 + vpxor 96(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 128(%rdi), %ymm0 + vmovdqu 160(%rdi), %ymm1 + vpxor 128(%rsi), %ymm0, %ymm0 + vpxor 160(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 192(%rdi), %ymm0 + vmovdqu 224(%rdi), %ymm1 + vpxor 192(%rsi), %ymm0, %ymm0 + vpxor 224(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 256(%rdi), %ymm0 + vmovdqu 288(%rdi), %ymm1 + vpxor 256(%rsi), %ymm0, %ymm0 + vpxor 288(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 320(%rdi), %ymm0 + vmovdqu 352(%rdi), %ymm1 + vpxor 320(%rsi), %ymm0, %ymm0 + vpxor 352(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 384(%rdi), %ymm0 + vmovdqu 416(%rdi), %ymm1 + vpxor 384(%rsi), %ymm0, %ymm0 + vpxor 416(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 448(%rdi), %ymm0 + vmovdqu 480(%rdi), %ymm1 + vpxor 448(%rsi), %ymm0, %ymm0 + vpxor 480(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 512(%rdi), %ymm0 + vmovdqu 544(%rdi), %ymm1 + vpxor 512(%rsi), %ymm0, %ymm0 + vpxor 544(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 576(%rdi), %ymm0 + vmovdqu 608(%rdi), %ymm1 + vpxor 576(%rsi), %ymm0, %ymm0 + vpxor 608(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 640(%rdi), %ymm0 + vmovdqu 672(%rdi), %ymm1 + vpxor 640(%rsi), %ymm0, %ymm0 + vpxor 672(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 704(%rdi), %ymm0 + vmovdqu 736(%rdi), %ymm1 + vpxor 704(%rsi), %ymm0, %ymm0 + vpxor 736(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + subl $0x300, %edx + jz L_kyber_cmp_avx2_done + vmovdqu 768(%rdi), %ymm0 + vmovdqu 800(%rdi), %ymm1 + vpxor 768(%rsi), %ymm0, %ymm0 + vpxor 800(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 832(%rdi), %ymm0 + vmovdqu 864(%rdi), %ymm1 + vpxor 832(%rsi), %ymm0, %ymm0 + vpxor 864(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 896(%rdi), %ymm0 + vmovdqu 928(%rdi), %ymm1 + vpxor 896(%rsi), %ymm0, %ymm0 + vpxor 928(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 960(%rdi), %ymm0 + vmovdqu 992(%rdi), %ymm1 + vpxor 960(%rsi), %ymm0, %ymm0 + vpxor 992(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 1024(%rdi), %ymm0 + vmovdqu 1056(%rdi), %ymm1 + vpxor 1024(%rsi), %ymm0, %ymm0 + vpxor 1056(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + subl $0x140, %edx + jz L_kyber_cmp_avx2_done + vmovdqu 1088(%rdi), %ymm0 + vmovdqu 1120(%rdi), %ymm1 + vpxor 1088(%rsi), %ymm0, %ymm0 + vpxor 1120(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 1152(%rdi), %ymm0 + vmovdqu 1184(%rdi), %ymm1 + vpxor 1152(%rsi), %ymm0, %ymm0 + vpxor 1184(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 1216(%rdi), %ymm0 + vmovdqu 1248(%rdi), %ymm1 + vpxor 1216(%rsi), %ymm0, %ymm0 + vpxor 1248(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 1280(%rdi), %ymm0 + vmovdqu 1312(%rdi), %ymm1 + vpxor 1280(%rsi), %ymm0, %ymm0 + vpxor 1312(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 1344(%rdi), %ymm0 + vmovdqu 1376(%rdi), %ymm1 + vpxor 1344(%rsi), %ymm0, %ymm0 + vpxor 1376(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 1408(%rdi), %ymm0 + vmovdqu 1440(%rdi), %ymm1 + vpxor 1408(%rsi), %ymm0, %ymm0 + vpxor 1440(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 + vmovdqu 1472(%rdi), %ymm0 + vmovdqu 1504(%rdi), %ymm1 + vpxor 1472(%rsi), %ymm0, %ymm0 + vpxor 1504(%rsi), %ymm1, %ymm1 + vpor %ymm0, %ymm2, %ymm2 + vpor %ymm1, %ymm3, %ymm3 +L_kyber_cmp_avx2_done: + vpor %ymm3, %ymm2, %ymm2 + vptest %ymm2, %ymm2 + cmovzl %ecx, %eax + cmovnzl %r8d, %eax + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_cmp_avx2,.-kyber_cmp_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_redistribute_21_rand_avx2 +.type kyber_redistribute_21_rand_avx2,@function +.align 16 +kyber_redistribute_21_rand_avx2: +#else +.section __TEXT,__text +.globl _kyber_redistribute_21_rand_avx2 +.p2align 4 +_kyber_redistribute_21_rand_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rdi), %ymm0 + vmovdqu 32(%rdi), %ymm1 + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vmovdqu 192(%rdi), %ymm6 + vmovdqu 224(%rdi), %ymm7 + vmovdqu 256(%rdi), %ymm8 + vmovdqu 288(%rdi), %ymm9 + vmovdqu 320(%rdi), %ymm10 + vmovdqu 352(%rdi), %ymm11 + vpunpcklqdq %ymm1, %ymm0, %ymm12 + vpunpckhqdq %ymm1, %ymm0, %ymm13 + vpunpcklqdq %ymm3, %ymm2, %ymm14 + vpunpckhqdq %ymm3, %ymm2, %ymm15 + vperm2i128 $32, %ymm14, %ymm12, %ymm0 + vperm2i128 $32, %ymm15, %ymm13, %ymm1 + vperm2i128 $49, %ymm14, %ymm12, %ymm2 + vperm2i128 $49, %ymm15, %ymm13, %ymm3 + vpunpcklqdq %ymm5, %ymm4, %ymm12 + vpunpckhqdq %ymm5, %ymm4, %ymm13 + vpunpcklqdq %ymm7, %ymm6, %ymm14 + vpunpckhqdq %ymm7, %ymm6, %ymm15 + vperm2i128 $32, %ymm14, %ymm12, %ymm4 + vperm2i128 $32, %ymm15, %ymm13, %ymm5 + vperm2i128 $49, %ymm14, %ymm12, %ymm6 + vperm2i128 $49, %ymm15, %ymm13, %ymm7 + vpunpcklqdq %ymm9, %ymm8, %ymm12 + vpunpckhqdq %ymm9, %ymm8, %ymm13 + vpunpcklqdq %ymm11, %ymm10, %ymm14 + vpunpckhqdq %ymm11, %ymm10, %ymm15 + vperm2i128 $32, %ymm14, %ymm12, %ymm8 + vperm2i128 $32, %ymm15, %ymm13, %ymm9 + vperm2i128 $49, %ymm14, %ymm12, %ymm10 + vperm2i128 $49, %ymm15, %ymm13, %ymm11 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm4, 32(%rsi) + vmovdqu %ymm8, 64(%rsi) + vmovdqu %ymm1, (%rdx) + vmovdqu %ymm5, 32(%rdx) + vmovdqu %ymm9, 64(%rdx) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm6, 32(%rcx) + vmovdqu %ymm10, 64(%rcx) + vmovdqu %ymm3, (%r8) + vmovdqu %ymm7, 32(%r8) + vmovdqu %ymm11, 64(%r8) + vmovdqu 384(%rdi), %ymm0 + vmovdqu 416(%rdi), %ymm1 + vmovdqu 448(%rdi), %ymm2 + vmovdqu 480(%rdi), %ymm3 + vmovdqu 512(%rdi), %ymm4 + vmovdqu 544(%rdi), %ymm5 + vmovdqu 576(%rdi), %ymm6 + vmovdqu 608(%rdi), %ymm7 + movq 640(%rdi), %rax + movq 648(%rdi), %r9 + movq 656(%rdi), %r10 + movq 664(%rdi), %r11 + vpunpcklqdq %ymm1, %ymm0, %ymm12 + vpunpckhqdq %ymm1, %ymm0, %ymm13 + vpunpcklqdq %ymm3, %ymm2, %ymm14 + vpunpckhqdq %ymm3, %ymm2, %ymm15 + vperm2i128 $32, %ymm14, %ymm12, %ymm0 + vperm2i128 $32, %ymm15, %ymm13, %ymm1 + vperm2i128 $49, %ymm14, %ymm12, %ymm2 + vperm2i128 $49, %ymm15, %ymm13, %ymm3 + vpunpcklqdq %ymm5, %ymm4, %ymm12 + vpunpckhqdq %ymm5, %ymm4, %ymm13 + vpunpcklqdq %ymm7, %ymm6, %ymm14 + vpunpckhqdq %ymm7, %ymm6, %ymm15 + vperm2i128 $32, %ymm14, %ymm12, %ymm4 + vperm2i128 $32, %ymm15, %ymm13, %ymm5 + vperm2i128 $49, %ymm14, %ymm12, %ymm6 + vperm2i128 $49, %ymm15, %ymm13, %ymm7 + vmovdqu %ymm0, 96(%rsi) + vmovdqu %ymm4, 128(%rsi) + movq %rax, 160(%rsi) + vmovdqu %ymm1, 96(%rdx) + vmovdqu %ymm5, 128(%rdx) + movq %r9, 160(%rdx) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm6, 128(%rcx) + movq %r10, 160(%rcx) + vmovdqu %ymm3, 96(%r8) + vmovdqu %ymm7, 128(%r8) + movq %r11, 160(%r8) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_redistribute_21_rand_avx2,.-kyber_redistribute_21_rand_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_redistribute_17_rand_avx2 +.type kyber_redistribute_17_rand_avx2,@function +.align 16 +kyber_redistribute_17_rand_avx2: +#else +.section __TEXT,__text +.globl _kyber_redistribute_17_rand_avx2 +.p2align 4 +_kyber_redistribute_17_rand_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rdi), %ymm0 + vmovdqu 32(%rdi), %ymm1 + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vmovdqu 192(%rdi), %ymm6 + vmovdqu 224(%rdi), %ymm7 + vpunpcklqdq %ymm1, %ymm0, %ymm8 + vpunpckhqdq %ymm1, %ymm0, %ymm9 + vpunpcklqdq %ymm3, %ymm2, %ymm10 + vpunpckhqdq %ymm3, %ymm2, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm0 + vperm2i128 $32, %ymm11, %ymm9, %ymm1 + vperm2i128 $49, %ymm10, %ymm8, %ymm2 + vperm2i128 $49, %ymm11, %ymm9, %ymm3 + vpunpcklqdq %ymm5, %ymm4, %ymm8 + vpunpckhqdq %ymm5, %ymm4, %ymm9 + vpunpcklqdq %ymm7, %ymm6, %ymm10 + vpunpckhqdq %ymm7, %ymm6, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm4 + vperm2i128 $32, %ymm11, %ymm9, %ymm5 + vperm2i128 $49, %ymm10, %ymm8, %ymm6 + vperm2i128 $49, %ymm11, %ymm9, %ymm7 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm4, 32(%rsi) + vmovdqu %ymm1, (%rdx) + vmovdqu %ymm5, 32(%rdx) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm6, 32(%rcx) + vmovdqu %ymm3, (%r8) + vmovdqu %ymm7, 32(%r8) + vmovdqu 256(%rdi), %ymm0 + vmovdqu 288(%rdi), %ymm1 + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vmovdqu 384(%rdi), %ymm4 + vmovdqu 416(%rdi), %ymm5 + vmovdqu 448(%rdi), %ymm6 + vmovdqu 480(%rdi), %ymm7 + movq 512(%rdi), %rax + movq 520(%rdi), %r9 + movq 528(%rdi), %r10 + movq 536(%rdi), %r11 + vpunpcklqdq %ymm1, %ymm0, %ymm8 + vpunpckhqdq %ymm1, %ymm0, %ymm9 + vpunpcklqdq %ymm3, %ymm2, %ymm10 + vpunpckhqdq %ymm3, %ymm2, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm0 + vperm2i128 $32, %ymm11, %ymm9, %ymm1 + vperm2i128 $49, %ymm10, %ymm8, %ymm2 + vperm2i128 $49, %ymm11, %ymm9, %ymm3 + vpunpcklqdq %ymm5, %ymm4, %ymm8 + vpunpckhqdq %ymm5, %ymm4, %ymm9 + vpunpcklqdq %ymm7, %ymm6, %ymm10 + vpunpckhqdq %ymm7, %ymm6, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm4 + vperm2i128 $32, %ymm11, %ymm9, %ymm5 + vperm2i128 $49, %ymm10, %ymm8, %ymm6 + vperm2i128 $49, %ymm11, %ymm9, %ymm7 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm4, 96(%rsi) + movq %rax, 128(%rsi) + vmovdqu %ymm1, 64(%rdx) + vmovdqu %ymm5, 96(%rdx) + movq %r9, 128(%rdx) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm6, 96(%rcx) + movq %r10, 128(%rcx) + vmovdqu %ymm3, 64(%r8) + vmovdqu %ymm7, 96(%r8) + movq %r11, 128(%r8) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_redistribute_17_rand_avx2,.-kyber_redistribute_17_rand_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_redistribute_16_rand_avx2 +.type kyber_redistribute_16_rand_avx2,@function +.align 16 +kyber_redistribute_16_rand_avx2: +#else +.section __TEXT,__text +.globl _kyber_redistribute_16_rand_avx2 +.p2align 4 +_kyber_redistribute_16_rand_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rdi), %ymm0 + vmovdqu 32(%rdi), %ymm1 + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vmovdqu 192(%rdi), %ymm6 + vmovdqu 224(%rdi), %ymm7 + vpunpcklqdq %ymm1, %ymm0, %ymm8 + vpunpckhqdq %ymm1, %ymm0, %ymm9 + vpunpcklqdq %ymm3, %ymm2, %ymm10 + vpunpckhqdq %ymm3, %ymm2, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm0 + vperm2i128 $32, %ymm11, %ymm9, %ymm1 + vperm2i128 $49, %ymm10, %ymm8, %ymm2 + vperm2i128 $49, %ymm11, %ymm9, %ymm3 + vpunpcklqdq %ymm5, %ymm4, %ymm8 + vpunpckhqdq %ymm5, %ymm4, %ymm9 + vpunpcklqdq %ymm7, %ymm6, %ymm10 + vpunpckhqdq %ymm7, %ymm6, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm4 + vperm2i128 $32, %ymm11, %ymm9, %ymm5 + vperm2i128 $49, %ymm10, %ymm8, %ymm6 + vperm2i128 $49, %ymm11, %ymm9, %ymm7 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm4, 32(%rsi) + vmovdqu %ymm1, (%rdx) + vmovdqu %ymm5, 32(%rdx) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm6, 32(%rcx) + vmovdqu %ymm3, (%r8) + vmovdqu %ymm7, 32(%r8) + vmovdqu 256(%rdi), %ymm0 + vmovdqu 288(%rdi), %ymm1 + vmovdqu 320(%rdi), %ymm2 + vmovdqu 352(%rdi), %ymm3 + vmovdqu 384(%rdi), %ymm4 + vmovdqu 416(%rdi), %ymm5 + vmovdqu 448(%rdi), %ymm6 + vmovdqu 480(%rdi), %ymm7 + vpunpcklqdq %ymm1, %ymm0, %ymm8 + vpunpckhqdq %ymm1, %ymm0, %ymm9 + vpunpcklqdq %ymm3, %ymm2, %ymm10 + vpunpckhqdq %ymm3, %ymm2, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm0 + vperm2i128 $32, %ymm11, %ymm9, %ymm1 + vperm2i128 $49, %ymm10, %ymm8, %ymm2 + vperm2i128 $49, %ymm11, %ymm9, %ymm3 + vpunpcklqdq %ymm5, %ymm4, %ymm8 + vpunpckhqdq %ymm5, %ymm4, %ymm9 + vpunpcklqdq %ymm7, %ymm6, %ymm10 + vpunpckhqdq %ymm7, %ymm6, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm4 + vperm2i128 $32, %ymm11, %ymm9, %ymm5 + vperm2i128 $49, %ymm10, %ymm8, %ymm6 + vperm2i128 $49, %ymm11, %ymm9, %ymm7 + vmovdqu %ymm0, 64(%rsi) + vmovdqu %ymm4, 96(%rsi) + vmovdqu %ymm1, 64(%rdx) + vmovdqu %ymm5, 96(%rdx) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm6, 96(%rcx) + vmovdqu %ymm3, 64(%r8) + vmovdqu %ymm7, 96(%r8) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_redistribute_16_rand_avx2,.-kyber_redistribute_16_rand_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.text +.globl kyber_redistribute_8_rand_avx2 +.type kyber_redistribute_8_rand_avx2,@function +.align 16 +kyber_redistribute_8_rand_avx2: +#else +.section __TEXT,__text +.globl _kyber_redistribute_8_rand_avx2 +.p2align 4 +_kyber_redistribute_8_rand_avx2: +#endif /* __APPLE__ */ + vmovdqu (%rdi), %ymm0 + vmovdqu 32(%rdi), %ymm1 + vmovdqu 64(%rdi), %ymm2 + vmovdqu 96(%rdi), %ymm3 + vmovdqu 128(%rdi), %ymm4 + vmovdqu 160(%rdi), %ymm5 + vmovdqu 192(%rdi), %ymm6 + vmovdqu 224(%rdi), %ymm7 + vpunpcklqdq %ymm1, %ymm0, %ymm8 + vpunpckhqdq %ymm1, %ymm0, %ymm9 + vpunpcklqdq %ymm3, %ymm2, %ymm10 + vpunpckhqdq %ymm3, %ymm2, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm0 + vperm2i128 $32, %ymm11, %ymm9, %ymm1 + vperm2i128 $49, %ymm10, %ymm8, %ymm2 + vperm2i128 $49, %ymm11, %ymm9, %ymm3 + vpunpcklqdq %ymm5, %ymm4, %ymm8 + vpunpckhqdq %ymm5, %ymm4, %ymm9 + vpunpcklqdq %ymm7, %ymm6, %ymm10 + vpunpckhqdq %ymm7, %ymm6, %ymm11 + vperm2i128 $32, %ymm10, %ymm8, %ymm4 + vperm2i128 $32, %ymm11, %ymm9, %ymm5 + vperm2i128 $49, %ymm10, %ymm8, %ymm6 + vperm2i128 $49, %ymm11, %ymm9, %ymm7 + vmovdqu %ymm0, (%rsi) + vmovdqu %ymm4, 32(%rsi) + vmovdqu %ymm1, (%rdx) + vmovdqu %ymm5, 32(%rdx) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm6, 32(%rcx) + vmovdqu %ymm3, (%r8) + vmovdqu %ymm7, 32(%r8) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_redistribute_8_rand_avx2,.-kyber_redistribute_8_rand_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 16 +#else +.p2align 4 +#endif /* __APPLE__ */ +L_sha3_parallel_4_r: +.quad 0x1,0x1 +.quad 0x1,0x1 +.quad 0x8082,0x8082 +.quad 0x8082,0x8082 +.quad 0x800000000000808a,0x800000000000808a +.quad 0x800000000000808a,0x800000000000808a +.quad 0x8000000080008000,0x8000000080008000 +.quad 0x8000000080008000,0x8000000080008000 +.quad 0x808b,0x808b +.quad 0x808b,0x808b +.quad 0x80000001,0x80000001 +.quad 0x80000001,0x80000001 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000000008009,0x8000000000008009 +.quad 0x8000000000008009,0x8000000000008009 +.quad 0x8a,0x8a +.quad 0x8a,0x8a +.quad 0x88,0x88 +.quad 0x88,0x88 +.quad 0x80008009,0x80008009 +.quad 0x80008009,0x80008009 +.quad 0x8000000a,0x8000000a +.quad 0x8000000a,0x8000000a +.quad 0x8000808b,0x8000808b +.quad 0x8000808b,0x8000808b +.quad 0x800000000000008b,0x800000000000008b +.quad 0x800000000000008b,0x800000000000008b +.quad 0x8000000000008089,0x8000000000008089 +.quad 0x8000000000008089,0x8000000000008089 +.quad 0x8000000000008003,0x8000000000008003 +.quad 0x8000000000008003,0x8000000000008003 +.quad 0x8000000000008002,0x8000000000008002 +.quad 0x8000000000008002,0x8000000000008002 +.quad 0x8000000000000080,0x8000000000000080 +.quad 0x8000000000000080,0x8000000000000080 +.quad 0x800a,0x800a +.quad 0x800a,0x800a +.quad 0x800000008000000a,0x800000008000000a +.quad 0x800000008000000a,0x800000008000000a +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000080008081,0x8000000080008081 +.quad 0x8000000000008080,0x8000000000008080 +.quad 0x8000000000008080,0x8000000000008080 +.quad 0x80000001,0x80000001 +.quad 0x80000001,0x80000001 +.quad 0x8000000080008008,0x8000000080008008 +.quad 0x8000000080008008,0x8000000080008008 +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_sha3_128_blockx4_seed_avx2_end_mark: +.quad 0x8000000000000000, 0x8000000000000000 +.quad 0x8000000000000000, 0x8000000000000000 +#ifndef __APPLE__ +.text +.globl kyber_sha3_128_blocksx4_seed_avx2 +.type kyber_sha3_128_blocksx4_seed_avx2,@function +.align 16 +kyber_sha3_128_blocksx4_seed_avx2: +#else +.section __TEXT,__text +.globl _kyber_sha3_128_blocksx4_seed_avx2 +.p2align 4 +_kyber_sha3_128_blocksx4_seed_avx2: +#endif /* __APPLE__ */ + leaq L_sha3_parallel_4_r(%rip), %rdx + movq %rdi, %rax + movq %rdi, %rcx + vpbroadcastq (%rsi), %ymm15 + addq $0x80, %rdi + vpbroadcastq 8(%rsi), %ymm11 + addq $0x180, %rax + vpbroadcastq 16(%rsi), %ymm12 + addq $0x280, %rcx + vpbroadcastq 24(%rsi), %ymm13 + vmovdqu L_sha3_128_blockx4_seed_avx2_end_mark(%rip), %ymm5 + vpxor %ymm6, %ymm6, %ymm6 + vmovdqu %ymm11, -96(%rdi) + vmovdqu %ymm12, -64(%rdi) + vmovdqu %ymm13, -32(%rdi) + vmovdqu (%rdi), %ymm14 + vmovdqu %ymm6, 32(%rdi) + vmovdqu %ymm6, 64(%rdi) + vmovdqu %ymm6, 96(%rdi) + vmovdqu %ymm6, 128(%rdi) + vmovdqu %ymm6, -96(%rax) + vmovdqu %ymm6, -64(%rax) + vmovdqu %ymm6, -32(%rax) + vmovdqu %ymm6, (%rax) + vmovdqu %ymm6, 32(%rax) + vmovdqu %ymm6, 64(%rax) + vmovdqu %ymm6, 96(%rax) + vmovdqu %ymm6, 128(%rax) + vmovdqu %ymm6, -96(%rcx) + vmovdqu %ymm6, -64(%rcx) + vmovdqu %ymm6, -32(%rcx) + vmovdqu %ymm5, (%rcx) + vmovdqu %ymm6, 32(%rcx) + vmovdqu %ymm6, 64(%rcx) + vmovdqu %ymm6, 96(%rcx) + vmovdqu %ymm6, 128(%rcx) + vpxor %ymm5, %ymm15, %ymm10 + # Round 0 + # Calc b[0..4] + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rdi), %ymm6, %ymm11 + vpxor (%rax), %ymm7, %ymm12 + vpxor -64(%rcx), %ymm8, %ymm13 + vpxor 128(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor (%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 128(%rcx) + # Row 1 + vpxor -32(%rdi), %ymm8, %ymm10 + vpxor -96(%rax), %ymm9, %ymm11 + vpxor -64(%rax), %ymm5, %ymm12 + vpxor 128(%rax), %ymm6, %ymm13 + vpxor 64(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, 64(%rcx) + # Row 2 + vpxor -96(%rdi), %ymm6, %ymm10 + vpxor 96(%rdi), %ymm7, %ymm11 + vpxor 32(%rax), %ymm8, %ymm12 + vpxor -32(%rcx), %ymm9, %ymm13 + vpxor (%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, (%rcx) + # Row 3 + vpxor (%rdi), %ymm9, %ymm10 + vpxor 32(%rdi), %ymm5, %ymm11 + vpxor -32(%rax), %ymm6, %ymm12 + vpxor -96(%rcx), %ymm7, %ymm13 + vpxor 96(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 96(%rcx) + # Row 4 + vpxor -64(%rdi), %ymm7, %ymm10 + vpxor 128(%rdi), %ymm8, %ymm11 + vpxor 64(%rax), %ymm9, %ymm12 + vpxor 96(%rax), %ymm5, %ymm13 + vpxor 32(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 32(%rcx) + # Round 1 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm1, %ymm11 + vpxor 64(%rdi), %ymm11, %ymm11 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm2, %ymm12 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm3, %ymm13 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm4, %ymm14 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rax), %ymm6, %ymm11 + vpxor 32(%rax), %ymm7, %ymm12 + vpxor -96(%rcx), %ymm8, %ymm13 + vpxor 32(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 32(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 32(%rcx) + # Row 1 + vpxor -64(%rcx), %ymm8, %ymm10 + vpxor 64(%rcx), %ymm9, %ymm11 + vpxor -96(%rdi), %ymm5, %ymm12 + vpxor 32(%rdi), %ymm6, %ymm13 + vpxor 64(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 64(%rax) + # Row 2 + vpxor 64(%rdi), %ymm6, %ymm10 + vpxor -64(%rax), %ymm7, %ymm11 + vpxor -32(%rcx), %ymm8, %ymm12 + vpxor 96(%rcx), %ymm9, %ymm13 + vpxor -64(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Row 3 + vpxor 128(%rcx), %ymm9, %ymm10 + vpxor -32(%rdi), %ymm5, %ymm11 + vpxor 96(%rdi), %ymm6, %ymm12 + vpxor -32(%rax), %ymm7, %ymm13 + vpxor 96(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 96(%rax) + # Row 4 + vpxor (%rax), %ymm7, %ymm10 + vpxor 128(%rax), %ymm8, %ymm11 + vpxor (%rcx), %ymm9, %ymm12 + vpxor (%rdi), %ymm5, %ymm13 + vpxor 128(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, 128(%rdi) + # Round 2 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm3, %ymm13 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 96(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rcx), %ymm6, %ymm11 + vpxor -32(%rcx), %ymm7, %ymm12 + vpxor -32(%rax), %ymm8, %ymm13 + vpxor 128(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 64(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 128(%rdi) + # Row 1 + vpxor -96(%rcx), %ymm8, %ymm10 + vpxor 64(%rax), %ymm9, %ymm11 + vpxor 64(%rdi), %ymm5, %ymm12 + vpxor -32(%rdi), %ymm6, %ymm13 + vpxor (%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, (%rcx) + # Row 2 + vpxor -96(%rax), %ymm6, %ymm10 + vpxor -96(%rdi), %ymm7, %ymm11 + vpxor 96(%rcx), %ymm8, %ymm12 + vpxor 96(%rax), %ymm9, %ymm13 + vpxor (%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, (%rax) + # Row 3 + vpxor 32(%rcx), %ymm9, %ymm10 + vpxor -64(%rcx), %ymm5, %ymm11 + vpxor -64(%rax), %ymm6, %ymm12 + vpxor 96(%rdi), %ymm7, %ymm13 + vpxor (%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 4 + vpxor 32(%rax), %ymm7, %ymm10 + vpxor 32(%rdi), %ymm8, %ymm11 + vpxor -64(%rdi), %ymm9, %ymm12 + vpxor 128(%rcx), %ymm5, %ymm13 + vpxor 128(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, 128(%rax) + # Round 3 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm2, %ymm12 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rax), %ymm6, %ymm11 + vpxor 96(%rcx), %ymm7, %ymm12 + vpxor 96(%rdi), %ymm8, %ymm13 + vpxor 128(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 96(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 128(%rax) + # Row 1 + vpxor -32(%rax), %ymm8, %ymm10 + vpxor (%rcx), %ymm9, %ymm11 + vpxor -96(%rax), %ymm5, %ymm12 + vpxor -64(%rcx), %ymm6, %ymm13 + vpxor -64(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Row 2 + vpxor 64(%rcx), %ymm6, %ymm10 + vpxor 64(%rdi), %ymm7, %ymm11 + vpxor 96(%rax), %ymm8, %ymm12 + vpxor (%rdi), %ymm9, %ymm13 + vpxor 32(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, 32(%rax) + # Row 3 + vpxor 128(%rdi), %ymm9, %ymm10 + vpxor -96(%rcx), %ymm5, %ymm11 + vpxor -96(%rdi), %ymm6, %ymm12 + vpxor -64(%rax), %ymm7, %ymm13 + vpxor 128(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 128(%rcx) + # Row 4 + vpxor -32(%rcx), %ymm7, %ymm10 + vpxor -32(%rdi), %ymm8, %ymm11 + vpxor (%rax), %ymm9, %ymm12 + vpxor 32(%rcx), %ymm5, %ymm13 + vpxor 32(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 32(%rdi) + # Round 4 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 64(%rdi), %ymm1, %ymm11 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rcx), %ymm6, %ymm11 + vpxor 96(%rax), %ymm7, %ymm12 + vpxor -64(%rax), %ymm8, %ymm13 + vpxor 32(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 128(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 32(%rdi) + # Row 1 + vpxor 96(%rdi), %ymm8, %ymm10 + vpxor -64(%rdi), %ymm9, %ymm11 + vpxor 64(%rcx), %ymm5, %ymm12 + vpxor -96(%rcx), %ymm6, %ymm13 + vpxor (%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, (%rax) + # Row 2 + vpxor 64(%rax), %ymm6, %ymm10 + vpxor -96(%rax), %ymm7, %ymm11 + vpxor (%rdi), %ymm8, %ymm12 + vpxor 128(%rcx), %ymm9, %ymm13 + vpxor -32(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, -32(%rcx) + # Row 3 + vpxor 128(%rax), %ymm9, %ymm10 + vpxor -32(%rax), %ymm5, %ymm11 + vpxor 64(%rdi), %ymm6, %ymm12 + vpxor -96(%rdi), %ymm7, %ymm13 + vpxor 32(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 32(%rcx) + # Row 4 + vpxor 96(%rcx), %ymm7, %ymm10 + vpxor -64(%rcx), %ymm8, %ymm11 + vpxor 32(%rax), %ymm9, %ymm12 + vpxor 128(%rdi), %ymm5, %ymm13 + vpxor -32(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Round 5 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rdi), %ymm6, %ymm11 + vpxor (%rdi), %ymm7, %ymm12 + vpxor -96(%rdi), %ymm8, %ymm13 + vpxor -32(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 160(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Row 1 + vpxor -64(%rax), %ymm8, %ymm10 + vpxor (%rax), %ymm9, %ymm11 + vpxor 64(%rax), %ymm5, %ymm12 + vpxor -32(%rax), %ymm6, %ymm13 + vpxor 32(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 32(%rax) + # Row 2 + vpxor (%rcx), %ymm6, %ymm10 + vpxor 64(%rcx), %ymm7, %ymm11 + vpxor 128(%rcx), %ymm8, %ymm12 + vpxor 32(%rcx), %ymm9, %ymm13 + vpxor 96(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 96(%rcx) + # Row 3 + vpxor 32(%rdi), %ymm9, %ymm10 + vpxor 96(%rdi), %ymm5, %ymm11 + vpxor -96(%rax), %ymm6, %ymm12 + vpxor 64(%rdi), %ymm7, %ymm13 + vpxor 128(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, 128(%rdi) + # Row 4 + vpxor 96(%rax), %ymm7, %ymm10 + vpxor -96(%rcx), %ymm8, %ymm11 + vpxor -32(%rcx), %ymm9, %ymm12 + vpxor 128(%rax), %ymm5, %ymm13 + vpxor -64(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, -64(%rcx) + # Round 6 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rax), %ymm6, %ymm11 + vpxor 128(%rcx), %ymm7, %ymm12 + vpxor 64(%rdi), %ymm8, %ymm13 + vpxor -64(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 192(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, -64(%rcx) + # Row 1 + vpxor -96(%rdi), %ymm8, %ymm10 + vpxor 32(%rax), %ymm9, %ymm11 + vpxor (%rcx), %ymm5, %ymm12 + vpxor 96(%rdi), %ymm6, %ymm13 + vpxor -32(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Row 2 + vpxor -64(%rdi), %ymm6, %ymm10 + vpxor 64(%rax), %ymm7, %ymm11 + vpxor 32(%rcx), %ymm8, %ymm12 + vpxor 128(%rdi), %ymm9, %ymm13 + vpxor 96(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 3 + vpxor -32(%rdi), %ymm9, %ymm10 + vpxor -64(%rax), %ymm5, %ymm11 + vpxor 64(%rcx), %ymm6, %ymm12 + vpxor -96(%rax), %ymm7, %ymm13 + vpxor 128(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 128(%rax) + # Row 4 + vpxor (%rdi), %ymm7, %ymm10 + vpxor -32(%rax), %ymm8, %ymm11 + vpxor 96(%rcx), %ymm9, %ymm12 + vpxor 32(%rdi), %ymm5, %ymm13 + vpxor -96(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Round 7 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm3, %ymm13 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm13, %ymm13 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor -64(%rax), %ymm1, %ymm11 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm4, %ymm14 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm2, %ymm12 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rax), %ymm6, %ymm11 + vpxor 32(%rcx), %ymm7, %ymm12 + vpxor -96(%rax), %ymm8, %ymm13 + vpxor -96(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 224(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, -96(%rcx) + # Row 1 + vpxor 64(%rdi), %ymm8, %ymm10 + vpxor -32(%rcx), %ymm9, %ymm11 + vpxor -64(%rdi), %ymm5, %ymm12 + vpxor -64(%rax), %ymm6, %ymm13 + vpxor 96(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 96(%rcx) + # Row 2 + vpxor (%rax), %ymm6, %ymm10 + vpxor (%rcx), %ymm7, %ymm11 + vpxor 128(%rdi), %ymm8, %ymm12 + vpxor 128(%rax), %ymm9, %ymm13 + vpxor (%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, (%rdi) + # Row 3 + vpxor -64(%rcx), %ymm9, %ymm10 + vpxor -96(%rdi), %ymm5, %ymm11 + vpxor 64(%rax), %ymm6, %ymm12 + vpxor 64(%rcx), %ymm7, %ymm13 + vpxor 32(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, 32(%rdi) + # Row 4 + vpxor 128(%rcx), %ymm7, %ymm10 + vpxor 96(%rdi), %ymm8, %ymm11 + vpxor 96(%rax), %ymm9, %ymm12 + vpxor -32(%rdi), %ymm5, %ymm13 + vpxor -32(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, -32(%rax) + # Round 8 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm14, %ymm14 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm3, %ymm13 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rcx), %ymm6, %ymm11 + vpxor 128(%rdi), %ymm7, %ymm12 + vpxor 64(%rcx), %ymm8, %ymm13 + vpxor -32(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 256(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -32(%rax) + # Row 1 + vpxor -96(%rax), %ymm8, %ymm10 + vpxor 96(%rcx), %ymm9, %ymm11 + vpxor (%rax), %ymm5, %ymm12 + vpxor -96(%rdi), %ymm6, %ymm13 + vpxor 96(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 2 + vpxor 32(%rax), %ymm6, %ymm10 + vpxor -64(%rdi), %ymm7, %ymm11 + vpxor 128(%rax), %ymm8, %ymm12 + vpxor 32(%rdi), %ymm9, %ymm13 + vpxor 128(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 128(%rcx) + # Row 3 + vpxor -96(%rcx), %ymm9, %ymm10 + vpxor 64(%rdi), %ymm5, %ymm11 + vpxor (%rcx), %ymm6, %ymm12 + vpxor 64(%rax), %ymm7, %ymm13 + vpxor -32(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, -32(%rdi) + # Row 4 + vpxor 32(%rcx), %ymm7, %ymm10 + vpxor -64(%rax), %ymm8, %ymm11 + vpxor (%rdi), %ymm9, %ymm12 + vpxor -64(%rcx), %ymm5, %ymm13 + vpxor 96(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 96(%rdi) + # Round 9 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 64(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm2, %ymm12 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rcx), %ymm6, %ymm11 + vpxor 128(%rax), %ymm7, %ymm12 + vpxor 64(%rax), %ymm8, %ymm13 + vpxor 96(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 288(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 1 + vpxor 64(%rcx), %ymm8, %ymm10 + vpxor 96(%rax), %ymm9, %ymm11 + vpxor 32(%rax), %ymm5, %ymm12 + vpxor 64(%rdi), %ymm6, %ymm13 + vpxor (%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 2 + vpxor -32(%rcx), %ymm6, %ymm10 + vpxor (%rax), %ymm7, %ymm11 + vpxor 32(%rdi), %ymm8, %ymm12 + vpxor -32(%rdi), %ymm9, %ymm13 + vpxor 32(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, 32(%rcx) + # Row 3 + vpxor -32(%rax), %ymm9, %ymm10 + vpxor -96(%rax), %ymm5, %ymm11 + vpxor -64(%rdi), %ymm6, %ymm12 + vpxor (%rcx), %ymm7, %ymm13 + vpxor -64(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, -64(%rcx) + # Row 4 + vpxor 128(%rdi), %ymm7, %ymm10 + vpxor -96(%rdi), %ymm8, %ymm11 + vpxor 128(%rcx), %ymm9, %ymm12 + vpxor -96(%rcx), %ymm5, %ymm13 + vpxor -64(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, -64(%rax) + # Round 10 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm12, %ymm12 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm1, %ymm11 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rax), %ymm6, %ymm11 + vpxor 32(%rdi), %ymm7, %ymm12 + vpxor (%rcx), %ymm8, %ymm13 + vpxor -64(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 320(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 1 + vpxor 64(%rax), %ymm8, %ymm10 + vpxor (%rdi), %ymm9, %ymm11 + vpxor -32(%rcx), %ymm5, %ymm12 + vpxor -96(%rax), %ymm6, %ymm13 + vpxor 128(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 128(%rcx) + # Row 2 + vpxor 96(%rcx), %ymm6, %ymm10 + vpxor 32(%rax), %ymm7, %ymm11 + vpxor -32(%rdi), %ymm8, %ymm12 + vpxor -64(%rcx), %ymm9, %ymm13 + vpxor 128(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 128(%rdi) + # Row 3 + vpxor 96(%rdi), %ymm9, %ymm10 + vpxor 64(%rcx), %ymm5, %ymm11 + vpxor (%rax), %ymm6, %ymm12 + vpxor -64(%rdi), %ymm7, %ymm13 + vpxor -96(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Row 4 + vpxor 128(%rax), %ymm7, %ymm10 + vpxor 64(%rdi), %ymm8, %ymm11 + vpxor 32(%rcx), %ymm9, %ymm12 + vpxor -32(%rax), %ymm5, %ymm13 + vpxor -96(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, -96(%rdi) + # Round 11 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm4, %ymm14 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm10, %ymm10 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rdi), %ymm6, %ymm11 + vpxor -32(%rdi), %ymm7, %ymm12 + vpxor -64(%rdi), %ymm8, %ymm13 + vpxor -96(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 352(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rdi) + # Row 1 + vpxor (%rcx), %ymm8, %ymm10 + vpxor 128(%rcx), %ymm9, %ymm11 + vpxor 96(%rcx), %ymm5, %ymm12 + vpxor 64(%rcx), %ymm6, %ymm13 + vpxor 32(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, 32(%rcx) + # Row 2 + vpxor 96(%rax), %ymm6, %ymm10 + vpxor -32(%rcx), %ymm7, %ymm11 + vpxor -64(%rcx), %ymm8, %ymm12 + vpxor -96(%rcx), %ymm9, %ymm13 + vpxor 128(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 128(%rax) + # Row 3 + vpxor -64(%rax), %ymm9, %ymm10 + vpxor 64(%rax), %ymm5, %ymm11 + vpxor 32(%rax), %ymm6, %ymm12 + vpxor (%rax), %ymm7, %ymm13 + vpxor -32(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, -32(%rax) + # Row 4 + vpxor 32(%rdi), %ymm7, %ymm10 + vpxor -96(%rax), %ymm8, %ymm11 + vpxor 128(%rdi), %ymm9, %ymm12 + vpxor 96(%rdi), %ymm5, %ymm13 + vpxor 64(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 64(%rdi) + # Round 12 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor -64(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm10, %ymm10 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rcx), %ymm6, %ymm11 + vpxor -64(%rcx), %ymm7, %ymm12 + vpxor (%rax), %ymm8, %ymm13 + vpxor 64(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 384(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 64(%rdi) + # Row 1 + vpxor -64(%rdi), %ymm8, %ymm10 + vpxor 32(%rcx), %ymm9, %ymm11 + vpxor 96(%rax), %ymm5, %ymm12 + vpxor 64(%rax), %ymm6, %ymm13 + vpxor 128(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, 128(%rdi) + # Row 2 + vpxor (%rdi), %ymm6, %ymm10 + vpxor 96(%rcx), %ymm7, %ymm11 + vpxor -96(%rcx), %ymm8, %ymm12 + vpxor -32(%rax), %ymm9, %ymm13 + vpxor 32(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 32(%rdi) + # Row 3 + vpxor -96(%rdi), %ymm9, %ymm10 + vpxor (%rcx), %ymm5, %ymm11 + vpxor -32(%rcx), %ymm6, %ymm12 + vpxor 32(%rax), %ymm7, %ymm13 + vpxor 96(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 4 + vpxor -32(%rdi), %ymm7, %ymm10 + vpxor 64(%rcx), %ymm8, %ymm11 + vpxor 128(%rax), %ymm9, %ymm12 + vpxor -64(%rax), %ymm5, %ymm13 + vpxor -96(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, -96(%rax) + # Round 13 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -32(%rax), %ymm3, %ymm13 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm2, %ymm12 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm1, %ymm11 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rcx), %ymm6, %ymm11 + vpxor -96(%rcx), %ymm7, %ymm12 + vpxor 32(%rax), %ymm8, %ymm13 + vpxor -96(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 416(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, -96(%rax) + # Row 1 + vpxor (%rax), %ymm8, %ymm10 + vpxor 128(%rdi), %ymm9, %ymm11 + vpxor (%rdi), %ymm5, %ymm12 + vpxor (%rcx), %ymm6, %ymm13 + vpxor 128(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 128(%rax) + # Row 2 + vpxor 128(%rcx), %ymm6, %ymm10 + vpxor 96(%rax), %ymm7, %ymm11 + vpxor -32(%rax), %ymm8, %ymm12 + vpxor 96(%rdi), %ymm9, %ymm13 + vpxor -32(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Row 3 + vpxor 64(%rdi), %ymm9, %ymm10 + vpxor -64(%rdi), %ymm5, %ymm11 + vpxor 96(%rcx), %ymm6, %ymm12 + vpxor -32(%rcx), %ymm7, %ymm13 + vpxor -64(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 4 + vpxor -64(%rcx), %ymm7, %ymm10 + vpxor 64(%rax), %ymm8, %ymm11 + vpxor 32(%rdi), %ymm9, %ymm12 + vpxor -96(%rdi), %ymm5, %ymm13 + vpxor 64(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 64(%rcx) + # Round 14 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 96(%rdi), %ymm3, %ymm13 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm14, %ymm14 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rdi), %ymm6, %ymm11 + vpxor -32(%rax), %ymm7, %ymm12 + vpxor -32(%rcx), %ymm8, %ymm13 + vpxor 64(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 448(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, 64(%rcx) + # Row 1 + vpxor 32(%rax), %ymm8, %ymm10 + vpxor 128(%rax), %ymm9, %ymm11 + vpxor 128(%rcx), %ymm5, %ymm12 + vpxor -64(%rdi), %ymm6, %ymm13 + vpxor 32(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, 32(%rdi) + # Row 2 + vpxor 32(%rcx), %ymm6, %ymm10 + vpxor (%rdi), %ymm7, %ymm11 + vpxor 96(%rdi), %ymm8, %ymm12 + vpxor -64(%rax), %ymm9, %ymm13 + vpxor -64(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, -64(%rcx) + # Row 3 + vpxor -96(%rax), %ymm9, %ymm10 + vpxor (%rax), %ymm5, %ymm11 + vpxor 96(%rax), %ymm6, %ymm12 + vpxor 96(%rcx), %ymm7, %ymm13 + vpxor -96(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -96(%rdi) + # Row 4 + vpxor -96(%rcx), %ymm7, %ymm10 + vpxor (%rcx), %ymm8, %ymm11 + vpxor -32(%rdi), %ymm9, %ymm12 + vpxor 64(%rdi), %ymm5, %ymm13 + vpxor 64(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, 64(%rax) + # Round 15 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm2, %ymm12 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rax), %ymm6, %ymm11 + vpxor 96(%rdi), %ymm7, %ymm12 + vpxor 96(%rcx), %ymm8, %ymm13 + vpxor 64(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 480(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, 64(%rax) + # Row 1 + vpxor -32(%rcx), %ymm8, %ymm10 + vpxor 32(%rdi), %ymm9, %ymm11 + vpxor 32(%rcx), %ymm5, %ymm12 + vpxor (%rax), %ymm6, %ymm13 + vpxor -32(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, -32(%rdi) + # Row 2 + vpxor 128(%rdi), %ymm6, %ymm10 + vpxor 128(%rcx), %ymm7, %ymm11 + vpxor -64(%rax), %ymm8, %ymm12 + vpxor -96(%rdi), %ymm9, %ymm13 + vpxor -96(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Row 3 + vpxor 64(%rcx), %ymm9, %ymm10 + vpxor 32(%rax), %ymm5, %ymm11 + vpxor (%rdi), %ymm6, %ymm12 + vpxor 96(%rax), %ymm7, %ymm13 + vpxor 64(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 64(%rdi) + # Row 4 + vpxor -32(%rax), %ymm7, %ymm10 + vpxor -64(%rdi), %ymm8, %ymm11 + vpxor -64(%rcx), %ymm9, %ymm12 + vpxor -96(%rax), %ymm5, %ymm13 + vpxor (%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, (%rcx) + # Round 16 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm1, %ymm11 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm12, %ymm12 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rdi), %ymm6, %ymm11 + vpxor -64(%rax), %ymm7, %ymm12 + vpxor 96(%rax), %ymm8, %ymm13 + vpxor (%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 512(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, (%rcx) + # Row 1 + vpxor 96(%rcx), %ymm8, %ymm10 + vpxor -32(%rdi), %ymm9, %ymm11 + vpxor 128(%rdi), %ymm5, %ymm12 + vpxor 32(%rax), %ymm6, %ymm13 + vpxor -64(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, -64(%rcx) + # Row 2 + vpxor 128(%rax), %ymm6, %ymm10 + vpxor 32(%rcx), %ymm7, %ymm11 + vpxor -96(%rdi), %ymm8, %ymm12 + vpxor 64(%rdi), %ymm9, %ymm13 + vpxor -32(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, -32(%rax) + # Row 3 + vpxor 64(%rax), %ymm9, %ymm10 + vpxor -32(%rcx), %ymm5, %ymm11 + vpxor 128(%rcx), %ymm6, %ymm12 + vpxor (%rdi), %ymm7, %ymm13 + vpxor -96(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 4 + vpxor 96(%rdi), %ymm7, %ymm10 + vpxor (%rax), %ymm8, %ymm11 + vpxor -96(%rcx), %ymm9, %ymm12 + vpxor 64(%rcx), %ymm5, %ymm13 + vpxor -64(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Round 17 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm11, %ymm11 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm4, %ymm14 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm10, %ymm10 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rdi), %ymm6, %ymm11 + vpxor -96(%rdi), %ymm7, %ymm12 + vpxor (%rdi), %ymm8, %ymm13 + vpxor -64(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 544(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -64(%rdi) + # Row 1 + vpxor 96(%rax), %ymm8, %ymm10 + vpxor -64(%rcx), %ymm9, %ymm11 + vpxor 128(%rax), %ymm5, %ymm12 + vpxor -32(%rcx), %ymm6, %ymm13 + vpxor -96(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, -96(%rcx) + # Row 2 + vpxor 32(%rdi), %ymm6, %ymm10 + vpxor 128(%rdi), %ymm7, %ymm11 + vpxor 64(%rdi), %ymm8, %ymm12 + vpxor -96(%rax), %ymm9, %ymm13 + vpxor 96(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 3 + vpxor (%rcx), %ymm9, %ymm10 + vpxor 96(%rcx), %ymm5, %ymm11 + vpxor 32(%rcx), %ymm6, %ymm12 + vpxor 128(%rcx), %ymm7, %ymm13 + vpxor 64(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, 64(%rcx) + # Row 4 + vpxor -64(%rax), %ymm7, %ymm10 + vpxor 32(%rax), %ymm8, %ymm11 + vpxor -32(%rax), %ymm9, %ymm12 + vpxor 64(%rax), %ymm5, %ymm13 + vpxor (%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, (%rax) + # Round 18 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm10, %ymm10 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rcx), %ymm6, %ymm11 + vpxor 64(%rdi), %ymm7, %ymm12 + vpxor 128(%rcx), %ymm8, %ymm13 + vpxor (%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 576(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, (%rax) + # Row 1 + vpxor (%rdi), %ymm8, %ymm10 + vpxor -96(%rcx), %ymm9, %ymm11 + vpxor 32(%rdi), %ymm5, %ymm12 + vpxor 96(%rcx), %ymm6, %ymm13 + vpxor -32(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -32(%rax) + # Row 2 + vpxor -32(%rdi), %ymm6, %ymm10 + vpxor 128(%rax), %ymm7, %ymm11 + vpxor -96(%rax), %ymm8, %ymm12 + vpxor 64(%rcx), %ymm9, %ymm13 + vpxor -64(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 3 + vpxor -64(%rdi), %ymm9, %ymm10 + vpxor 96(%rax), %ymm5, %ymm11 + vpxor 128(%rdi), %ymm6, %ymm12 + vpxor 32(%rcx), %ymm7, %ymm13 + vpxor 64(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 64(%rax) + # Row 4 + vpxor -96(%rdi), %ymm7, %ymm10 + vpxor -32(%rcx), %ymm8, %ymm11 + vpxor 96(%rdi), %ymm9, %ymm12 + vpxor (%rcx), %ymm5, %ymm13 + vpxor 32(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 32(%rax) + # Round 19 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm4, %ymm14 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm1, %ymm11 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm3, %ymm13 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rcx), %ymm6, %ymm11 + vpxor -96(%rax), %ymm7, %ymm12 + vpxor 32(%rcx), %ymm8, %ymm13 + vpxor 32(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 608(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 32(%rax) + # Row 1 + vpxor 128(%rcx), %ymm8, %ymm10 + vpxor -32(%rax), %ymm9, %ymm11 + vpxor -32(%rdi), %ymm5, %ymm12 + vpxor 96(%rax), %ymm6, %ymm13 + vpxor 96(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 2 + vpxor -64(%rcx), %ymm6, %ymm10 + vpxor 32(%rdi), %ymm7, %ymm11 + vpxor 64(%rcx), %ymm8, %ymm12 + vpxor 64(%rax), %ymm9, %ymm13 + vpxor -96(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, -96(%rdi) + # Row 3 + vpxor (%rax), %ymm9, %ymm10 + vpxor (%rdi), %ymm5, %ymm11 + vpxor 128(%rax), %ymm6, %ymm12 + vpxor 128(%rdi), %ymm7, %ymm13 + vpxor (%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, (%rcx) + # Row 4 + vpxor 64(%rdi), %ymm7, %ymm10 + vpxor 96(%rcx), %ymm8, %ymm11 + vpxor -64(%rax), %ymm9, %ymm12 + vpxor -64(%rdi), %ymm5, %ymm13 + vpxor -32(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Round 20 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm11, %ymm11 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm3, %ymm13 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rax), %ymm6, %ymm11 + vpxor 64(%rcx), %ymm7, %ymm12 + vpxor 128(%rdi), %ymm8, %ymm13 + vpxor -32(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 640(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Row 1 + vpxor 32(%rcx), %ymm8, %ymm10 + vpxor 96(%rdi), %ymm9, %ymm11 + vpxor -64(%rcx), %ymm5, %ymm12 + vpxor (%rdi), %ymm6, %ymm13 + vpxor -64(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -64(%rax) + # Row 2 + vpxor -96(%rcx), %ymm6, %ymm10 + vpxor -32(%rdi), %ymm7, %ymm11 + vpxor 64(%rax), %ymm8, %ymm12 + vpxor (%rcx), %ymm9, %ymm13 + vpxor 64(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 64(%rdi) + # Row 3 + vpxor 32(%rax), %ymm9, %ymm10 + vpxor 128(%rcx), %ymm5, %ymm11 + vpxor 32(%rdi), %ymm6, %ymm12 + vpxor 128(%rax), %ymm7, %ymm13 + vpxor -64(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, -64(%rdi) + # Row 4 + vpxor -96(%rax), %ymm7, %ymm10 + vpxor 96(%rax), %ymm8, %ymm11 + vpxor -96(%rdi), %ymm9, %ymm12 + vpxor (%rax), %ymm5, %ymm13 + vpxor 96(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 96(%rcx) + # Round 21 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm13, %ymm13 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rdi), %ymm6, %ymm11 + vpxor 64(%rax), %ymm7, %ymm12 + vpxor 128(%rax), %ymm8, %ymm13 + vpxor 96(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 672(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, 96(%rcx) + # Row 1 + vpxor 128(%rdi), %ymm8, %ymm10 + vpxor -64(%rax), %ymm9, %ymm11 + vpxor -96(%rcx), %ymm5, %ymm12 + vpxor 128(%rcx), %ymm6, %ymm13 + vpxor -96(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, -96(%rdi) + # Row 2 + vpxor -32(%rax), %ymm6, %ymm10 + vpxor -64(%rcx), %ymm7, %ymm11 + vpxor (%rcx), %ymm8, %ymm12 + vpxor -64(%rdi), %ymm9, %ymm13 + vpxor -96(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 3 + vpxor -32(%rcx), %ymm9, %ymm10 + vpxor 32(%rcx), %ymm5, %ymm11 + vpxor -32(%rdi), %ymm6, %ymm12 + vpxor 32(%rdi), %ymm7, %ymm13 + vpxor (%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, (%rax) + # Row 4 + vpxor 64(%rcx), %ymm7, %ymm10 + vpxor (%rdi), %ymm8, %ymm11 + vpxor 64(%rdi), %ymm9, %ymm12 + vpxor 32(%rax), %ymm5, %ymm13 + vpxor 96(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 96(%rax) + # Round 22 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm1, %ymm11 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm14, %ymm14 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rax), %ymm6, %ymm11 + vpxor (%rcx), %ymm7, %ymm12 + vpxor 32(%rdi), %ymm8, %ymm13 + vpxor 96(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 704(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 1 + vpxor 128(%rax), %ymm8, %ymm10 + vpxor -96(%rdi), %ymm9, %ymm11 + vpxor -32(%rax), %ymm5, %ymm12 + vpxor 32(%rcx), %ymm6, %ymm13 + vpxor 64(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 64(%rdi) + # Row 2 + vpxor 96(%rdi), %ymm6, %ymm10 + vpxor -96(%rcx), %ymm7, %ymm11 + vpxor -64(%rdi), %ymm8, %ymm12 + vpxor (%rax), %ymm9, %ymm13 + vpxor 64(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 64(%rcx) + # Row 3 + vpxor 96(%rcx), %ymm9, %ymm10 + vpxor 128(%rdi), %ymm5, %ymm11 + vpxor -64(%rcx), %ymm6, %ymm12 + vpxor -32(%rdi), %ymm7, %ymm13 + vpxor 32(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, 32(%rax) + # Row 4 + vpxor 64(%rax), %ymm7, %ymm10 + vpxor 128(%rcx), %ymm8, %ymm11 + vpxor -96(%rax), %ymm9, %ymm12 + vpxor -32(%rcx), %ymm5, %ymm13 + vpxor (%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, (%rdi) + # Round 23 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 64(%rdi), %ymm4, %ymm14 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rdi), %ymm6, %ymm11 + vpxor -64(%rdi), %ymm7, %ymm12 + vpxor -32(%rdi), %ymm8, %ymm13 + vpxor (%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 736(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 1 + vpxor 32(%rdi), %ymm8, %ymm10 + vpxor 64(%rdi), %ymm9, %ymm11 + vpxor 96(%rdi), %ymm5, %ymm12 + vpxor 128(%rdi), %ymm6, %ymm13 + vpxor -96(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 2 + vpxor -64(%rax), %ymm6, %ymm10 + vpxor -32(%rax), %ymm7, %ymm11 + vpxor (%rax), %ymm8, %ymm12 + vpxor 32(%rax), %ymm9, %ymm13 + vpxor 64(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 64(%rax) + # Row 3 + vpxor 96(%rax), %ymm9, %ymm10 + vpxor 128(%rax), %ymm5, %ymm11 + vpxor -96(%rcx), %ymm6, %ymm12 + vpxor -64(%rcx), %ymm7, %ymm13 + vpxor -32(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, -32(%rcx) + # Row 4 + vpxor (%rcx), %ymm7, %ymm10 + vpxor 32(%rcx), %ymm8, %ymm11 + vpxor 64(%rcx), %ymm9, %ymm12 + vpxor 96(%rcx), %ymm5, %ymm13 + vpxor 128(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, 128(%rcx) + subq $0x80, %rdi + vmovdqu %ymm15, (%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_sha3_128_blocksx4_seed_avx2,.-kyber_sha3_128_blocksx4_seed_avx2 +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.data +#else +.section __DATA,__data +#endif /* __APPLE__ */ +#ifndef __APPLE__ +.align 32 +#else +.p2align 5 +#endif /* __APPLE__ */ +L_sha3_256_blockx4_seed_avx2_end_mark: +.quad 0x8000000000000000, 0x8000000000000000 +.quad 0x8000000000000000, 0x8000000000000000 +#ifndef __APPLE__ +.text +.globl kyber_sha3_256_blocksx4_seed_avx2 +.type kyber_sha3_256_blocksx4_seed_avx2,@function +.align 16 +kyber_sha3_256_blocksx4_seed_avx2: +#else +.section __TEXT,__text +.globl _kyber_sha3_256_blocksx4_seed_avx2 +.p2align 4 +_kyber_sha3_256_blocksx4_seed_avx2: +#endif /* __APPLE__ */ + leaq L_sha3_parallel_4_r(%rip), %rdx + movq %rdi, %rax + movq %rdi, %rcx + vpbroadcastq (%rsi), %ymm15 + addq $0x80, %rdi + vpbroadcastq 8(%rsi), %ymm11 + addq $0x180, %rax + vpbroadcastq 16(%rsi), %ymm12 + addq $0x280, %rcx + vpbroadcastq 24(%rsi), %ymm13 + vmovdqu L_sha3_256_blockx4_seed_avx2_end_mark(%rip), %ymm5 + vpxor %ymm6, %ymm6, %ymm6 + vmovdqu %ymm11, -96(%rdi) + vmovdqu %ymm12, -64(%rdi) + vmovdqu %ymm13, -32(%rdi) + vmovdqu (%rdi), %ymm14 + vmovdqu %ymm6, 32(%rdi) + vmovdqu %ymm6, 64(%rdi) + vmovdqu %ymm6, 96(%rdi) + vmovdqu %ymm6, 128(%rdi) + vmovdqu %ymm6, -96(%rax) + vmovdqu %ymm6, -64(%rax) + vmovdqu %ymm6, -32(%rax) + vmovdqu %ymm6, (%rax) + vmovdqu %ymm6, 32(%rax) + vmovdqu %ymm6, 64(%rax) + vmovdqu %ymm6, 96(%rax) + vmovdqu %ymm5, 128(%rax) + vmovdqu %ymm6, -96(%rcx) + vmovdqu %ymm6, -64(%rcx) + vmovdqu %ymm6, -32(%rcx) + vmovdqu %ymm6, (%rcx) + vmovdqu %ymm6, 32(%rcx) + vmovdqu %ymm6, 64(%rcx) + vmovdqu %ymm6, 96(%rcx) + vmovdqu %ymm6, 128(%rcx) + vmovdqu %ymm15, %ymm10 + vpxor %ymm5, %ymm11, %ymm11 + # Round 0 + # Calc b[0..4] + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rdi), %ymm6, %ymm11 + vpxor (%rax), %ymm7, %ymm12 + vpxor -64(%rcx), %ymm8, %ymm13 + vpxor 128(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor (%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 128(%rcx) + # Row 1 + vpxor -32(%rdi), %ymm8, %ymm10 + vpxor -96(%rax), %ymm9, %ymm11 + vpxor -64(%rax), %ymm5, %ymm12 + vpxor 128(%rax), %ymm6, %ymm13 + vpxor 64(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, 64(%rcx) + # Row 2 + vpxor -96(%rdi), %ymm6, %ymm10 + vpxor 96(%rdi), %ymm7, %ymm11 + vpxor 32(%rax), %ymm8, %ymm12 + vpxor -32(%rcx), %ymm9, %ymm13 + vpxor (%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, (%rcx) + # Row 3 + vpxor (%rdi), %ymm9, %ymm10 + vpxor 32(%rdi), %ymm5, %ymm11 + vpxor -32(%rax), %ymm6, %ymm12 + vpxor -96(%rcx), %ymm7, %ymm13 + vpxor 96(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 96(%rcx) + # Row 4 + vpxor -64(%rdi), %ymm7, %ymm10 + vpxor 128(%rdi), %ymm8, %ymm11 + vpxor 64(%rax), %ymm9, %ymm12 + vpxor 96(%rax), %ymm5, %ymm13 + vpxor 32(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 32(%rcx) + # Round 1 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm1, %ymm11 + vpxor 64(%rdi), %ymm11, %ymm11 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm2, %ymm12 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm3, %ymm13 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm4, %ymm14 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rax), %ymm6, %ymm11 + vpxor 32(%rax), %ymm7, %ymm12 + vpxor -96(%rcx), %ymm8, %ymm13 + vpxor 32(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 32(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 32(%rcx) + # Row 1 + vpxor -64(%rcx), %ymm8, %ymm10 + vpxor 64(%rcx), %ymm9, %ymm11 + vpxor -96(%rdi), %ymm5, %ymm12 + vpxor 32(%rdi), %ymm6, %ymm13 + vpxor 64(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 64(%rax) + # Row 2 + vpxor 64(%rdi), %ymm6, %ymm10 + vpxor -64(%rax), %ymm7, %ymm11 + vpxor -32(%rcx), %ymm8, %ymm12 + vpxor 96(%rcx), %ymm9, %ymm13 + vpxor -64(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Row 3 + vpxor 128(%rcx), %ymm9, %ymm10 + vpxor -32(%rdi), %ymm5, %ymm11 + vpxor 96(%rdi), %ymm6, %ymm12 + vpxor -32(%rax), %ymm7, %ymm13 + vpxor 96(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 96(%rax) + # Row 4 + vpxor (%rax), %ymm7, %ymm10 + vpxor 128(%rax), %ymm8, %ymm11 + vpxor (%rcx), %ymm9, %ymm12 + vpxor (%rdi), %ymm5, %ymm13 + vpxor 128(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, 128(%rdi) + # Round 2 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm3, %ymm13 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 96(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rcx), %ymm6, %ymm11 + vpxor -32(%rcx), %ymm7, %ymm12 + vpxor -32(%rax), %ymm8, %ymm13 + vpxor 128(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 64(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 128(%rdi) + # Row 1 + vpxor -96(%rcx), %ymm8, %ymm10 + vpxor 64(%rax), %ymm9, %ymm11 + vpxor 64(%rdi), %ymm5, %ymm12 + vpxor -32(%rdi), %ymm6, %ymm13 + vpxor (%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, (%rcx) + # Row 2 + vpxor -96(%rax), %ymm6, %ymm10 + vpxor -96(%rdi), %ymm7, %ymm11 + vpxor 96(%rcx), %ymm8, %ymm12 + vpxor 96(%rax), %ymm9, %ymm13 + vpxor (%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, (%rax) + # Row 3 + vpxor 32(%rcx), %ymm9, %ymm10 + vpxor -64(%rcx), %ymm5, %ymm11 + vpxor -64(%rax), %ymm6, %ymm12 + vpxor 96(%rdi), %ymm7, %ymm13 + vpxor (%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 4 + vpxor 32(%rax), %ymm7, %ymm10 + vpxor 32(%rdi), %ymm8, %ymm11 + vpxor -64(%rdi), %ymm9, %ymm12 + vpxor 128(%rcx), %ymm5, %ymm13 + vpxor 128(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, 128(%rax) + # Round 3 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm2, %ymm12 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 64(%rax), %ymm6, %ymm11 + vpxor 96(%rcx), %ymm7, %ymm12 + vpxor 96(%rdi), %ymm8, %ymm13 + vpxor 128(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 96(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 128(%rax) + # Row 1 + vpxor -32(%rax), %ymm8, %ymm10 + vpxor (%rcx), %ymm9, %ymm11 + vpxor -96(%rax), %ymm5, %ymm12 + vpxor -64(%rcx), %ymm6, %ymm13 + vpxor -64(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Row 2 + vpxor 64(%rcx), %ymm6, %ymm10 + vpxor 64(%rdi), %ymm7, %ymm11 + vpxor 96(%rax), %ymm8, %ymm12 + vpxor (%rdi), %ymm9, %ymm13 + vpxor 32(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, 32(%rax) + # Row 3 + vpxor 128(%rdi), %ymm9, %ymm10 + vpxor -96(%rcx), %ymm5, %ymm11 + vpxor -96(%rdi), %ymm6, %ymm12 + vpxor -64(%rax), %ymm7, %ymm13 + vpxor 128(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 128(%rcx) + # Row 4 + vpxor -32(%rcx), %ymm7, %ymm10 + vpxor -32(%rdi), %ymm8, %ymm11 + vpxor (%rax), %ymm9, %ymm12 + vpxor 32(%rcx), %ymm5, %ymm13 + vpxor 32(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 32(%rdi) + # Round 4 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 64(%rdi), %ymm1, %ymm11 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rcx), %ymm6, %ymm11 + vpxor 96(%rax), %ymm7, %ymm12 + vpxor -64(%rax), %ymm8, %ymm13 + vpxor 32(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 128(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 32(%rdi) + # Row 1 + vpxor 96(%rdi), %ymm8, %ymm10 + vpxor -64(%rdi), %ymm9, %ymm11 + vpxor 64(%rcx), %ymm5, %ymm12 + vpxor -96(%rcx), %ymm6, %ymm13 + vpxor (%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, (%rax) + # Row 2 + vpxor 64(%rax), %ymm6, %ymm10 + vpxor -96(%rax), %ymm7, %ymm11 + vpxor (%rdi), %ymm8, %ymm12 + vpxor 128(%rcx), %ymm9, %ymm13 + vpxor -32(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, -32(%rcx) + # Row 3 + vpxor 128(%rax), %ymm9, %ymm10 + vpxor -32(%rax), %ymm5, %ymm11 + vpxor 64(%rdi), %ymm6, %ymm12 + vpxor -96(%rdi), %ymm7, %ymm13 + vpxor 32(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 32(%rcx) + # Row 4 + vpxor 96(%rcx), %ymm7, %ymm10 + vpxor -64(%rcx), %ymm8, %ymm11 + vpxor 32(%rax), %ymm9, %ymm12 + vpxor 128(%rdi), %ymm5, %ymm13 + vpxor -32(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Round 5 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm11, %ymm11 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rdi), %ymm6, %ymm11 + vpxor (%rdi), %ymm7, %ymm12 + vpxor -96(%rdi), %ymm8, %ymm13 + vpxor -32(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 160(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Row 1 + vpxor -64(%rax), %ymm8, %ymm10 + vpxor (%rax), %ymm9, %ymm11 + vpxor 64(%rax), %ymm5, %ymm12 + vpxor -32(%rax), %ymm6, %ymm13 + vpxor 32(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 32(%rax) + # Row 2 + vpxor (%rcx), %ymm6, %ymm10 + vpxor 64(%rcx), %ymm7, %ymm11 + vpxor 128(%rcx), %ymm8, %ymm12 + vpxor 32(%rcx), %ymm9, %ymm13 + vpxor 96(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 96(%rcx) + # Row 3 + vpxor 32(%rdi), %ymm9, %ymm10 + vpxor 96(%rdi), %ymm5, %ymm11 + vpxor -96(%rax), %ymm6, %ymm12 + vpxor 64(%rdi), %ymm7, %ymm13 + vpxor 128(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, 128(%rdi) + # Row 4 + vpxor 96(%rax), %ymm7, %ymm10 + vpxor -96(%rcx), %ymm8, %ymm11 + vpxor -32(%rcx), %ymm9, %ymm12 + vpxor 128(%rax), %ymm5, %ymm13 + vpxor -64(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, -64(%rcx) + # Round 6 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rax), %ymm6, %ymm11 + vpxor 128(%rcx), %ymm7, %ymm12 + vpxor 64(%rdi), %ymm8, %ymm13 + vpxor -64(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 192(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, -64(%rcx) + # Row 1 + vpxor -96(%rdi), %ymm8, %ymm10 + vpxor 32(%rax), %ymm9, %ymm11 + vpxor (%rcx), %ymm5, %ymm12 + vpxor 96(%rdi), %ymm6, %ymm13 + vpxor -32(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Row 2 + vpxor -64(%rdi), %ymm6, %ymm10 + vpxor 64(%rax), %ymm7, %ymm11 + vpxor 32(%rcx), %ymm8, %ymm12 + vpxor 128(%rdi), %ymm9, %ymm13 + vpxor 96(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 3 + vpxor -32(%rdi), %ymm9, %ymm10 + vpxor -64(%rax), %ymm5, %ymm11 + vpxor 64(%rcx), %ymm6, %ymm12 + vpxor -96(%rax), %ymm7, %ymm13 + vpxor 128(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 128(%rax) + # Row 4 + vpxor (%rdi), %ymm7, %ymm10 + vpxor -32(%rax), %ymm8, %ymm11 + vpxor 96(%rcx), %ymm9, %ymm12 + vpxor 32(%rdi), %ymm5, %ymm13 + vpxor -96(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Round 7 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm3, %ymm13 + vpxor 96(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm13, %ymm13 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor -64(%rax), %ymm1, %ymm11 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm4, %ymm14 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm2, %ymm12 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rax), %ymm6, %ymm11 + vpxor 32(%rcx), %ymm7, %ymm12 + vpxor -96(%rax), %ymm8, %ymm13 + vpxor -96(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 224(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, -96(%rcx) + # Row 1 + vpxor 64(%rdi), %ymm8, %ymm10 + vpxor -32(%rcx), %ymm9, %ymm11 + vpxor -64(%rdi), %ymm5, %ymm12 + vpxor -64(%rax), %ymm6, %ymm13 + vpxor 96(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, 96(%rcx) + # Row 2 + vpxor (%rax), %ymm6, %ymm10 + vpxor (%rcx), %ymm7, %ymm11 + vpxor 128(%rdi), %ymm8, %ymm12 + vpxor 128(%rax), %ymm9, %ymm13 + vpxor (%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, (%rdi) + # Row 3 + vpxor -64(%rcx), %ymm9, %ymm10 + vpxor -96(%rdi), %ymm5, %ymm11 + vpxor 64(%rax), %ymm6, %ymm12 + vpxor 64(%rcx), %ymm7, %ymm13 + vpxor 32(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, 32(%rdi) + # Row 4 + vpxor 128(%rcx), %ymm7, %ymm10 + vpxor 96(%rdi), %ymm8, %ymm11 + vpxor 96(%rax), %ymm9, %ymm12 + vpxor -32(%rdi), %ymm5, %ymm13 + vpxor -32(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, -32(%rax) + # Round 8 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm14, %ymm14 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm3, %ymm13 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rcx), %ymm6, %ymm11 + vpxor 128(%rdi), %ymm7, %ymm12 + vpxor 64(%rcx), %ymm8, %ymm13 + vpxor -32(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 256(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -32(%rax) + # Row 1 + vpxor -96(%rax), %ymm8, %ymm10 + vpxor 96(%rcx), %ymm9, %ymm11 + vpxor (%rax), %ymm5, %ymm12 + vpxor -96(%rdi), %ymm6, %ymm13 + vpxor 96(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 2 + vpxor 32(%rax), %ymm6, %ymm10 + vpxor -64(%rdi), %ymm7, %ymm11 + vpxor 128(%rax), %ymm8, %ymm12 + vpxor 32(%rdi), %ymm9, %ymm13 + vpxor 128(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 128(%rcx) + # Row 3 + vpxor -96(%rcx), %ymm9, %ymm10 + vpxor 64(%rdi), %ymm5, %ymm11 + vpxor (%rcx), %ymm6, %ymm12 + vpxor 64(%rax), %ymm7, %ymm13 + vpxor -32(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, -32(%rdi) + # Row 4 + vpxor 32(%rcx), %ymm7, %ymm10 + vpxor -64(%rax), %ymm8, %ymm11 + vpxor (%rdi), %ymm9, %ymm12 + vpxor -64(%rcx), %ymm5, %ymm13 + vpxor 96(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 96(%rdi) + # Round 9 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 64(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm2, %ymm12 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rcx), %ymm6, %ymm11 + vpxor 128(%rax), %ymm7, %ymm12 + vpxor 64(%rax), %ymm8, %ymm13 + vpxor 96(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 288(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 1 + vpxor 64(%rcx), %ymm8, %ymm10 + vpxor 96(%rax), %ymm9, %ymm11 + vpxor 32(%rax), %ymm5, %ymm12 + vpxor 64(%rdi), %ymm6, %ymm13 + vpxor (%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 2 + vpxor -32(%rcx), %ymm6, %ymm10 + vpxor (%rax), %ymm7, %ymm11 + vpxor 32(%rdi), %ymm8, %ymm12 + vpxor -32(%rdi), %ymm9, %ymm13 + vpxor 32(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, 32(%rcx) + # Row 3 + vpxor -32(%rax), %ymm9, %ymm10 + vpxor -96(%rax), %ymm5, %ymm11 + vpxor -64(%rdi), %ymm6, %ymm12 + vpxor (%rcx), %ymm7, %ymm13 + vpxor -64(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, -64(%rcx) + # Row 4 + vpxor 128(%rdi), %ymm7, %ymm10 + vpxor -96(%rdi), %ymm8, %ymm11 + vpxor 128(%rcx), %ymm9, %ymm12 + vpxor -96(%rcx), %ymm5, %ymm13 + vpxor -64(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, -64(%rax) + # Round 10 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm4, %ymm14 + vpxor 32(%rdi), %ymm12, %ymm12 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor -96(%rax), %ymm1, %ymm11 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rax), %ymm6, %ymm11 + vpxor 32(%rdi), %ymm7, %ymm12 + vpxor (%rcx), %ymm8, %ymm13 + vpxor -64(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 320(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 1 + vpxor 64(%rax), %ymm8, %ymm10 + vpxor (%rdi), %ymm9, %ymm11 + vpxor -32(%rcx), %ymm5, %ymm12 + vpxor -96(%rax), %ymm6, %ymm13 + vpxor 128(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 128(%rcx) + # Row 2 + vpxor 96(%rcx), %ymm6, %ymm10 + vpxor 32(%rax), %ymm7, %ymm11 + vpxor -32(%rdi), %ymm8, %ymm12 + vpxor -64(%rcx), %ymm9, %ymm13 + vpxor 128(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, 128(%rdi) + # Row 3 + vpxor 96(%rdi), %ymm9, %ymm10 + vpxor 64(%rcx), %ymm5, %ymm11 + vpxor (%rax), %ymm6, %ymm12 + vpxor -64(%rdi), %ymm7, %ymm13 + vpxor -96(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Row 4 + vpxor 128(%rax), %ymm7, %ymm10 + vpxor 64(%rdi), %ymm8, %ymm11 + vpxor 32(%rcx), %ymm9, %ymm12 + vpxor -32(%rax), %ymm5, %ymm13 + vpxor -96(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, -96(%rdi) + # Round 11 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm4, %ymm14 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm12, %ymm12 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm13, %ymm13 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm10, %ymm10 + vpxor 128(%rcx), %ymm14, %ymm14 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor (%rdi), %ymm6, %ymm11 + vpxor -32(%rdi), %ymm7, %ymm12 + vpxor -64(%rdi), %ymm8, %ymm13 + vpxor -96(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 352(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rdi) + # Row 1 + vpxor (%rcx), %ymm8, %ymm10 + vpxor 128(%rcx), %ymm9, %ymm11 + vpxor 96(%rcx), %ymm5, %ymm12 + vpxor 64(%rcx), %ymm6, %ymm13 + vpxor 32(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, 32(%rcx) + # Row 2 + vpxor 96(%rax), %ymm6, %ymm10 + vpxor -32(%rcx), %ymm7, %ymm11 + vpxor -64(%rcx), %ymm8, %ymm12 + vpxor -96(%rcx), %ymm9, %ymm13 + vpxor 128(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -96(%rcx) + vmovdqu %ymm4, 128(%rax) + # Row 3 + vpxor -64(%rax), %ymm9, %ymm10 + vpxor 64(%rax), %ymm5, %ymm11 + vpxor 32(%rax), %ymm6, %ymm12 + vpxor (%rax), %ymm7, %ymm13 + vpxor -32(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rax) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, -32(%rax) + # Row 4 + vpxor 32(%rdi), %ymm7, %ymm10 + vpxor -96(%rax), %ymm8, %ymm11 + vpxor 128(%rdi), %ymm9, %ymm12 + vpxor 96(%rdi), %ymm5, %ymm13 + vpxor 64(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, -96(%rax) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, 64(%rdi) + # Round 12 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor -64(%rax), %ymm10, %ymm10 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm12, %ymm12 + vpxor 64(%rax), %ymm11, %ymm11 + vpxor 96(%rax), %ymm10, %ymm10 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm13, %ymm13 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm14, %ymm14 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rcx), %ymm6, %ymm11 + vpxor -64(%rcx), %ymm7, %ymm12 + vpxor (%rax), %ymm8, %ymm13 + vpxor 64(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 384(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 64(%rdi) + # Row 1 + vpxor -64(%rdi), %ymm8, %ymm10 + vpxor 32(%rcx), %ymm9, %ymm11 + vpxor 96(%rax), %ymm5, %ymm12 + vpxor 64(%rax), %ymm6, %ymm13 + vpxor 128(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, 128(%rdi) + # Row 2 + vpxor (%rdi), %ymm6, %ymm10 + vpxor 96(%rcx), %ymm7, %ymm11 + vpxor -96(%rcx), %ymm8, %ymm12 + vpxor -32(%rax), %ymm9, %ymm13 + vpxor 32(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, -32(%rax) + vmovdqu %ymm4, 32(%rdi) + # Row 3 + vpxor -96(%rdi), %ymm9, %ymm10 + vpxor (%rcx), %ymm5, %ymm11 + vpxor -32(%rcx), %ymm6, %ymm12 + vpxor 32(%rax), %ymm7, %ymm13 + vpxor 96(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -32(%rcx) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 4 + vpxor -32(%rdi), %ymm7, %ymm10 + vpxor 64(%rcx), %ymm8, %ymm11 + vpxor 128(%rax), %ymm9, %ymm12 + vpxor -64(%rax), %ymm5, %ymm13 + vpxor -96(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, 64(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, -96(%rax) + # Round 13 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm10, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm4, %ymm14 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm14, %ymm14 + vpxor -32(%rax), %ymm3, %ymm13 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm2, %ymm12 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm1, %ymm11 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rcx), %ymm6, %ymm11 + vpxor -96(%rcx), %ymm7, %ymm12 + vpxor 32(%rax), %ymm8, %ymm13 + vpxor -96(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 416(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, -96(%rax) + # Row 1 + vpxor (%rax), %ymm8, %ymm10 + vpxor 128(%rdi), %ymm9, %ymm11 + vpxor (%rdi), %ymm5, %ymm12 + vpxor (%rcx), %ymm6, %ymm13 + vpxor 128(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 128(%rax) + # Row 2 + vpxor 128(%rcx), %ymm6, %ymm10 + vpxor 96(%rax), %ymm7, %ymm11 + vpxor -32(%rax), %ymm8, %ymm12 + vpxor 96(%rdi), %ymm9, %ymm13 + vpxor -32(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 96(%rdi) + vmovdqu %ymm4, -32(%rdi) + # Row 3 + vpxor 64(%rdi), %ymm9, %ymm10 + vpxor -64(%rdi), %ymm5, %ymm11 + vpxor 96(%rcx), %ymm6, %ymm12 + vpxor -32(%rcx), %ymm7, %ymm13 + vpxor -64(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, 96(%rcx) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 4 + vpxor -64(%rcx), %ymm7, %ymm10 + vpxor 64(%rax), %ymm8, %ymm11 + vpxor 32(%rdi), %ymm9, %ymm12 + vpxor -96(%rdi), %ymm5, %ymm13 + vpxor 64(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 64(%rax) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, 64(%rcx) + # Round 14 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm1, %ymm11 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm10, %ymm10 + vpxor 96(%rdi), %ymm3, %ymm13 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm14, %ymm14 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm11, %ymm11 + vpxor 128(%rax), %ymm14, %ymm14 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rdi), %ymm6, %ymm11 + vpxor -32(%rax), %ymm7, %ymm12 + vpxor -32(%rcx), %ymm8, %ymm13 + vpxor 64(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 448(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, 64(%rcx) + # Row 1 + vpxor 32(%rax), %ymm8, %ymm10 + vpxor 128(%rax), %ymm9, %ymm11 + vpxor 128(%rcx), %ymm5, %ymm12 + vpxor -64(%rdi), %ymm6, %ymm13 + vpxor 32(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, 32(%rdi) + # Row 2 + vpxor 32(%rcx), %ymm6, %ymm10 + vpxor (%rdi), %ymm7, %ymm11 + vpxor 96(%rdi), %ymm8, %ymm12 + vpxor -64(%rax), %ymm9, %ymm13 + vpxor -64(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, -64(%rax) + vmovdqu %ymm4, -64(%rcx) + # Row 3 + vpxor -96(%rax), %ymm9, %ymm10 + vpxor (%rax), %ymm5, %ymm11 + vpxor 96(%rax), %ymm6, %ymm12 + vpxor 96(%rcx), %ymm7, %ymm13 + vpxor -96(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, 96(%rax) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -96(%rdi) + # Row 4 + vpxor -96(%rcx), %ymm7, %ymm10 + vpxor (%rcx), %ymm8, %ymm11 + vpxor -32(%rdi), %ymm9, %ymm12 + vpxor 64(%rdi), %ymm5, %ymm13 + vpxor 64(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, (%rcx) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, 64(%rax) + # Round 15 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm2, %ymm12 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm10, %ymm10 + vpxor -64(%rax), %ymm13, %ymm13 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 128(%rax), %ymm6, %ymm11 + vpxor 96(%rdi), %ymm7, %ymm12 + vpxor 96(%rcx), %ymm8, %ymm13 + vpxor 64(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 480(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, 64(%rax) + # Row 1 + vpxor -32(%rcx), %ymm8, %ymm10 + vpxor 32(%rdi), %ymm9, %ymm11 + vpxor 32(%rcx), %ymm5, %ymm12 + vpxor (%rax), %ymm6, %ymm13 + vpxor -32(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, -32(%rdi) + # Row 2 + vpxor 128(%rdi), %ymm6, %ymm10 + vpxor 128(%rcx), %ymm7, %ymm11 + vpxor -64(%rax), %ymm8, %ymm12 + vpxor -96(%rdi), %ymm9, %ymm13 + vpxor -96(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, -96(%rdi) + vmovdqu %ymm4, -96(%rcx) + # Row 3 + vpxor 64(%rcx), %ymm9, %ymm10 + vpxor 32(%rax), %ymm5, %ymm11 + vpxor (%rdi), %ymm6, %ymm12 + vpxor 96(%rax), %ymm7, %ymm13 + vpxor 64(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, (%rdi) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 64(%rdi) + # Row 4 + vpxor -32(%rax), %ymm7, %ymm10 + vpxor -64(%rdi), %ymm8, %ymm11 + vpxor -64(%rcx), %ymm9, %ymm12 + vpxor -96(%rax), %ymm5, %ymm13 + vpxor (%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -64(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, (%rcx) + # Round 16 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm4, %ymm14 + vpxor (%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm1, %ymm11 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm12, %ymm12 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm11, %ymm11 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm10, %ymm10 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 32(%rdi), %ymm6, %ymm11 + vpxor -64(%rax), %ymm7, %ymm12 + vpxor 96(%rax), %ymm8, %ymm13 + vpxor (%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 512(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, (%rcx) + # Row 1 + vpxor 96(%rcx), %ymm8, %ymm10 + vpxor -32(%rdi), %ymm9, %ymm11 + vpxor 128(%rdi), %ymm5, %ymm12 + vpxor 32(%rax), %ymm6, %ymm13 + vpxor -64(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, -64(%rcx) + # Row 2 + vpxor 128(%rax), %ymm6, %ymm10 + vpxor 32(%rcx), %ymm7, %ymm11 + vpxor -96(%rdi), %ymm8, %ymm12 + vpxor 64(%rdi), %ymm9, %ymm13 + vpxor -32(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, 64(%rdi) + vmovdqu %ymm4, -32(%rax) + # Row 3 + vpxor 64(%rax), %ymm9, %ymm10 + vpxor -32(%rcx), %ymm5, %ymm11 + vpxor 128(%rcx), %ymm6, %ymm12 + vpxor (%rdi), %ymm7, %ymm13 + vpxor -96(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 128(%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 4 + vpxor 96(%rdi), %ymm7, %ymm10 + vpxor (%rax), %ymm8, %ymm11 + vpxor -96(%rcx), %ymm9, %ymm12 + vpxor 64(%rcx), %ymm5, %ymm13 + vpxor -64(%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, (%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -64(%rdi) + # Round 17 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm11, %ymm11 + vpxor 64(%rdi), %ymm13, %ymm13 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm4, %ymm14 + vpxor -64(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor 32(%rax), %ymm13, %ymm13 + vpxor 64(%rax), %ymm10, %ymm10 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm14, %ymm14 + vpxor -32(%rcx), %ymm11, %ymm11 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm10, %ymm10 + vpxor 128(%rcx), %ymm12, %ymm12 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rdi), %ymm6, %ymm11 + vpxor -96(%rdi), %ymm7, %ymm12 + vpxor (%rdi), %ymm8, %ymm13 + vpxor -64(%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 544(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -64(%rdi) + # Row 1 + vpxor 96(%rax), %ymm8, %ymm10 + vpxor -64(%rcx), %ymm9, %ymm11 + vpxor 128(%rax), %ymm5, %ymm12 + vpxor -32(%rcx), %ymm6, %ymm13 + vpxor -96(%rcx), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, -96(%rcx) + # Row 2 + vpxor 32(%rdi), %ymm6, %ymm10 + vpxor 128(%rdi), %ymm7, %ymm11 + vpxor 64(%rdi), %ymm8, %ymm12 + vpxor -96(%rax), %ymm9, %ymm13 + vpxor 96(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, -96(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 3 + vpxor (%rcx), %ymm9, %ymm10 + vpxor 96(%rcx), %ymm5, %ymm11 + vpxor 32(%rcx), %ymm6, %ymm12 + vpxor 128(%rcx), %ymm7, %ymm13 + vpxor 64(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, 32(%rcx) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, 64(%rcx) + # Row 4 + vpxor -64(%rax), %ymm7, %ymm10 + vpxor 32(%rax), %ymm8, %ymm11 + vpxor -32(%rax), %ymm9, %ymm12 + vpxor 64(%rax), %ymm5, %ymm13 + vpxor (%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, 32(%rax) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, (%rax) + # Round 18 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm2, %ymm12 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm10, %ymm10 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -96(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm10, %ymm10 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm14, %ymm14 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm13, %ymm13 + vpxor (%rcx), %ymm10, %ymm10 + vpxor 32(%rcx), %ymm12, %ymm12 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm11, %ymm11 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rcx), %ymm6, %ymm11 + vpxor 64(%rdi), %ymm7, %ymm12 + vpxor 128(%rcx), %ymm8, %ymm13 + vpxor (%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 576(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, (%rax) + # Row 1 + vpxor (%rdi), %ymm8, %ymm10 + vpxor -96(%rcx), %ymm9, %ymm11 + vpxor 32(%rdi), %ymm5, %ymm12 + vpxor 96(%rcx), %ymm6, %ymm13 + vpxor -32(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, -32(%rax) + # Row 2 + vpxor -32(%rdi), %ymm6, %ymm10 + vpxor 128(%rax), %ymm7, %ymm11 + vpxor -96(%rax), %ymm8, %ymm12 + vpxor 64(%rcx), %ymm9, %ymm13 + vpxor -64(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rdi) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 64(%rcx) + vmovdqu %ymm4, -64(%rax) + # Row 3 + vpxor -64(%rdi), %ymm9, %ymm10 + vpxor 96(%rax), %ymm5, %ymm11 + vpxor 128(%rdi), %ymm6, %ymm12 + vpxor 32(%rcx), %ymm7, %ymm13 + vpxor 64(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rdi) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, 128(%rdi) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 64(%rax) + # Row 4 + vpxor -96(%rdi), %ymm7, %ymm10 + vpxor -32(%rcx), %ymm8, %ymm11 + vpxor 96(%rdi), %ymm9, %ymm12 + vpxor (%rcx), %ymm5, %ymm13 + vpxor 32(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rdi) + vmovdqu %ymm1, -32(%rcx) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 32(%rax) + # Round 19 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm10, %ymm10 + vpxor -32(%rdi), %ymm10, %ymm10 + vpxor (%rdi), %ymm10, %ymm10 + vpxor 32(%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm12, %ymm12 + vpxor 128(%rdi), %ymm12, %ymm12 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -64(%rax), %ymm4, %ymm14 + vpxor -32(%rax), %ymm14, %ymm14 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm1, %ymm11 + vpxor 128(%rax), %ymm11, %ymm11 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor 32(%rcx), %ymm3, %ymm13 + vpxor 64(%rcx), %ymm13, %ymm13 + vpxor 96(%rcx), %ymm13, %ymm13 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rcx), %ymm6, %ymm11 + vpxor -96(%rax), %ymm7, %ymm12 + vpxor 32(%rcx), %ymm8, %ymm13 + vpxor 32(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 608(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 32(%rax) + # Row 1 + vpxor 128(%rcx), %ymm8, %ymm10 + vpxor -32(%rax), %ymm9, %ymm11 + vpxor -32(%rdi), %ymm5, %ymm12 + vpxor 96(%rax), %ymm6, %ymm13 + vpxor 96(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rcx) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 96(%rax) + vmovdqu %ymm4, 96(%rdi) + # Row 2 + vpxor -64(%rcx), %ymm6, %ymm10 + vpxor 32(%rdi), %ymm7, %ymm11 + vpxor 64(%rcx), %ymm8, %ymm12 + vpxor 64(%rax), %ymm9, %ymm13 + vpxor -96(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rcx) + vmovdqu %ymm1, 32(%rdi) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 64(%rax) + vmovdqu %ymm4, -96(%rdi) + # Row 3 + vpxor (%rax), %ymm9, %ymm10 + vpxor (%rdi), %ymm5, %ymm11 + vpxor 128(%rax), %ymm6, %ymm12 + vpxor 128(%rdi), %ymm7, %ymm13 + vpxor (%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rax) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 128(%rax) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, (%rcx) + # Row 4 + vpxor 64(%rdi), %ymm7, %ymm10 + vpxor 96(%rcx), %ymm8, %ymm11 + vpxor -64(%rax), %ymm9, %ymm12 + vpxor -64(%rdi), %ymm5, %ymm13 + vpxor -32(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rdi) + vmovdqu %ymm1, 96(%rcx) + vmovdqu %ymm2, -64(%rax) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Round 20 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor (%rdi), %ymm1, %ymm11 + vpxor 32(%rdi), %ymm11, %ymm11 + vpxor 96(%rdi), %ymm14, %ymm14 + vpxor 128(%rdi), %ymm3, %ymm13 + vpxor -96(%rax), %ymm12, %ymm12 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor (%rax), %ymm10, %ymm10 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm13, %ymm13 + vpxor 96(%rax), %ymm13, %ymm13 + vpxor 128(%rax), %ymm12, %ymm12 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm14, %ymm14 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -32(%rax), %ymm6, %ymm11 + vpxor 64(%rcx), %ymm7, %ymm12 + vpxor 128(%rdi), %ymm8, %ymm13 + vpxor -32(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 640(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -32(%rcx) + # Row 1 + vpxor 32(%rcx), %ymm8, %ymm10 + vpxor 96(%rdi), %ymm9, %ymm11 + vpxor -64(%rcx), %ymm5, %ymm12 + vpxor (%rdi), %ymm6, %ymm13 + vpxor -64(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rcx) + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, (%rdi) + vmovdqu %ymm4, -64(%rax) + # Row 2 + vpxor -96(%rcx), %ymm6, %ymm10 + vpxor -32(%rdi), %ymm7, %ymm11 + vpxor 64(%rax), %ymm8, %ymm12 + vpxor (%rcx), %ymm9, %ymm13 + vpxor 64(%rdi), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rcx) + vmovdqu %ymm1, -32(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, (%rcx) + vmovdqu %ymm4, 64(%rdi) + # Row 3 + vpxor 32(%rax), %ymm9, %ymm10 + vpxor 128(%rcx), %ymm5, %ymm11 + vpxor 32(%rdi), %ymm6, %ymm12 + vpxor 128(%rax), %ymm7, %ymm13 + vpxor -64(%rdi), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rax) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, 32(%rdi) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, -64(%rdi) + # Row 4 + vpxor -96(%rax), %ymm7, %ymm10 + vpxor 96(%rax), %ymm8, %ymm11 + vpxor -96(%rdi), %ymm9, %ymm12 + vpxor (%rax), %ymm5, %ymm13 + vpxor 96(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -96(%rax) + vmovdqu %ymm1, 96(%rax) + vmovdqu %ymm2, -96(%rdi) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 96(%rcx) + # Round 21 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -64(%rdi), %ymm4, %ymm14 + vpxor -32(%rdi), %ymm1, %ymm11 + vpxor (%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm2, %ymm12 + vpxor 64(%rdi), %ymm14, %ymm14 + vpxor 96(%rdi), %ymm11, %ymm11 + vpxor 128(%rdi), %ymm13, %ymm13 + vpxor -64(%rax), %ymm14, %ymm14 + vpxor -32(%rax), %ymm11, %ymm11 + vpxor 32(%rax), %ymm10, %ymm10 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm10, %ymm10 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor -32(%rcx), %ymm14, %ymm14 + vpxor (%rcx), %ymm13, %ymm13 + vpxor 32(%rcx), %ymm10, %ymm10 + vpxor 64(%rcx), %ymm12, %ymm12 + vpxor 128(%rcx), %ymm11, %ymm11 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor 96(%rdi), %ymm6, %ymm11 + vpxor 64(%rax), %ymm7, %ymm12 + vpxor 128(%rax), %ymm8, %ymm13 + vpxor 96(%rcx), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 672(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, 96(%rdi) + vmovdqu %ymm2, 64(%rax) + vmovdqu %ymm3, 128(%rax) + vmovdqu %ymm4, 96(%rcx) + # Row 1 + vpxor 128(%rdi), %ymm8, %ymm10 + vpxor -64(%rax), %ymm9, %ymm11 + vpxor -96(%rcx), %ymm5, %ymm12 + vpxor 128(%rcx), %ymm6, %ymm13 + vpxor -96(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rdi) + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, 128(%rcx) + vmovdqu %ymm4, -96(%rdi) + # Row 2 + vpxor -32(%rax), %ymm6, %ymm10 + vpxor -64(%rcx), %ymm7, %ymm11 + vpxor (%rcx), %ymm8, %ymm12 + vpxor -64(%rdi), %ymm9, %ymm13 + vpxor -96(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rax) + vmovdqu %ymm1, -64(%rcx) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, -64(%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 3 + vpxor -32(%rcx), %ymm9, %ymm10 + vpxor 32(%rcx), %ymm5, %ymm11 + vpxor -32(%rdi), %ymm6, %ymm12 + vpxor 32(%rdi), %ymm7, %ymm13 + vpxor (%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -32(%rcx) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, -32(%rdi) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, (%rax) + # Row 4 + vpxor 64(%rcx), %ymm7, %ymm10 + vpxor (%rdi), %ymm8, %ymm11 + vpxor 64(%rdi), %ymm9, %ymm12 + vpxor 32(%rax), %ymm5, %ymm13 + vpxor 96(%rax), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rcx) + vmovdqu %ymm1, (%rdi) + vmovdqu %ymm2, 64(%rdi) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 96(%rax) + # Round 22 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm4, %ymm14 + vpxor -64(%rdi), %ymm3, %ymm13 + vpxor -32(%rdi), %ymm2, %ymm12 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 96(%rdi), %ymm1, %ymm11 + vpxor 128(%rdi), %ymm10, %ymm10 + vpxor -96(%rax), %ymm14, %ymm14 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm10, %ymm10 + vpxor (%rax), %ymm14, %ymm14 + vpxor 64(%rax), %ymm12, %ymm12 + vpxor 128(%rax), %ymm13, %ymm13 + vpxor -96(%rcx), %ymm12, %ymm12 + vpxor -64(%rcx), %ymm11, %ymm11 + vpxor -32(%rcx), %ymm10, %ymm10 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm11, %ymm11 + vpxor 96(%rcx), %ymm14, %ymm14 + vpxor 128(%rcx), %ymm13, %ymm13 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -64(%rax), %ymm6, %ymm11 + vpxor (%rcx), %ymm7, %ymm12 + vpxor 32(%rdi), %ymm8, %ymm13 + vpxor 96(%rax), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 704(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -64(%rax) + vmovdqu %ymm2, (%rcx) + vmovdqu %ymm3, 32(%rdi) + vmovdqu %ymm4, 96(%rax) + # Row 1 + vpxor 128(%rax), %ymm8, %ymm10 + vpxor -96(%rdi), %ymm9, %ymm11 + vpxor -32(%rax), %ymm5, %ymm12 + vpxor 32(%rcx), %ymm6, %ymm13 + vpxor 64(%rdi), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 128(%rax) + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, -32(%rax) + vmovdqu %ymm3, 32(%rcx) + vmovdqu %ymm4, 64(%rdi) + # Row 2 + vpxor 96(%rdi), %ymm6, %ymm10 + vpxor -96(%rcx), %ymm7, %ymm11 + vpxor -64(%rdi), %ymm8, %ymm12 + vpxor (%rax), %ymm9, %ymm13 + vpxor 64(%rcx), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rdi) + vmovdqu %ymm1, -96(%rcx) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, (%rax) + vmovdqu %ymm4, 64(%rcx) + # Row 3 + vpxor 96(%rcx), %ymm9, %ymm10 + vpxor 128(%rdi), %ymm5, %ymm11 + vpxor -64(%rcx), %ymm6, %ymm12 + vpxor -32(%rdi), %ymm7, %ymm13 + vpxor 32(%rax), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rcx) + vmovdqu %ymm1, 128(%rdi) + vmovdqu %ymm2, -64(%rcx) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, 32(%rax) + # Row 4 + vpxor 64(%rax), %ymm7, %ymm10 + vpxor 128(%rcx), %ymm8, %ymm11 + vpxor -96(%rax), %ymm9, %ymm12 + vpxor -32(%rcx), %ymm5, %ymm13 + vpxor (%rdi), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 64(%rax) + vmovdqu %ymm1, 128(%rcx) + vmovdqu %ymm2, -96(%rax) + vmovdqu %ymm3, -32(%rcx) + vmovdqu %ymm4, (%rdi) + # Round 23 + # Calc b[0..4] + vpxor %ymm15, %ymm0, %ymm10 + vpxor -96(%rdi), %ymm1, %ymm11 + vpxor -64(%rdi), %ymm2, %ymm12 + vpxor -32(%rdi), %ymm3, %ymm13 + vpxor 32(%rdi), %ymm13, %ymm13 + vpxor 64(%rdi), %ymm4, %ymm14 + vpxor 96(%rdi), %ymm10, %ymm10 + vpxor 128(%rdi), %ymm11, %ymm11 + vpxor -64(%rax), %ymm11, %ymm11 + vpxor -32(%rax), %ymm12, %ymm12 + vpxor (%rax), %ymm13, %ymm13 + vpxor 32(%rax), %ymm14, %ymm14 + vpxor 96(%rax), %ymm14, %ymm14 + vpxor 128(%rax), %ymm10, %ymm10 + vpxor -96(%rcx), %ymm11, %ymm11 + vpxor -64(%rcx), %ymm12, %ymm12 + vpxor (%rcx), %ymm12, %ymm12 + vpxor 32(%rcx), %ymm13, %ymm13 + vpxor 64(%rcx), %ymm14, %ymm14 + vpxor 96(%rcx), %ymm10, %ymm10 + # Calc t[0..4] + vpsrlq $63, %ymm11, %ymm0 + vpsrlq $63, %ymm12, %ymm1 + vpsrlq $63, %ymm13, %ymm2 + vpsrlq $63, %ymm14, %ymm3 + vpsrlq $63, %ymm10, %ymm4 + vpaddq %ymm11, %ymm11, %ymm5 + vpaddq %ymm12, %ymm12, %ymm6 + vpaddq %ymm13, %ymm13, %ymm7 + vpaddq %ymm14, %ymm14, %ymm8 + vpaddq %ymm10, %ymm10, %ymm9 + vpor %ymm0, %ymm5, %ymm5 + vpor %ymm1, %ymm6, %ymm6 + vpor %ymm2, %ymm7, %ymm7 + vpor %ymm3, %ymm8, %ymm8 + vpor %ymm4, %ymm9, %ymm9 + vpxor %ymm14, %ymm5, %ymm5 + vpxor %ymm10, %ymm6, %ymm6 + vpxor %ymm11, %ymm7, %ymm7 + vpxor %ymm12, %ymm8, %ymm8 + vpxor %ymm13, %ymm9, %ymm9 + # Row Mix + # Row 0 + vpxor %ymm15, %ymm5, %ymm10 + vpxor -96(%rdi), %ymm6, %ymm11 + vpxor -64(%rdi), %ymm7, %ymm12 + vpxor -32(%rdi), %ymm8, %ymm13 + vpxor (%rdi), %ymm9, %ymm14 + vpsrlq $20, %ymm11, %ymm0 + vpsrlq $21, %ymm12, %ymm1 + vpsrlq $43, %ymm13, %ymm2 + vpsrlq $50, %ymm14, %ymm3 + vpsllq $44, %ymm11, %ymm11 + vpsllq $43, %ymm12, %ymm12 + vpsllq $21, %ymm13, %ymm13 + vpsllq $14, %ymm14, %ymm14 + vpor %ymm0, %ymm11, %ymm11 + vpor %ymm1, %ymm12, %ymm12 + vpor %ymm2, %ymm13, %ymm13 + vpor %ymm3, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm15 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm15, %ymm15 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + # XOR in constant + vpxor 736(%rdx), %ymm15, %ymm15 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm1, -96(%rdi) + vmovdqu %ymm2, -64(%rdi) + vmovdqu %ymm3, -32(%rdi) + vmovdqu %ymm4, (%rdi) + # Row 1 + vpxor 32(%rdi), %ymm8, %ymm10 + vpxor 64(%rdi), %ymm9, %ymm11 + vpxor 96(%rdi), %ymm5, %ymm12 + vpxor 128(%rdi), %ymm6, %ymm13 + vpxor -96(%rax), %ymm7, %ymm14 + vpsrlq $36, %ymm10, %ymm0 + vpsrlq $44, %ymm11, %ymm1 + vpsrlq $61, %ymm12, %ymm2 + vpsrlq $19, %ymm13, %ymm3 + vpsrlq $3, %ymm14, %ymm4 + vpsllq $28, %ymm10, %ymm10 + vpsllq $20, %ymm11, %ymm11 + vpsllq $3, %ymm12, %ymm12 + vpsllq $45, %ymm13, %ymm13 + vpsllq $61, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 32(%rdi) + vmovdqu %ymm1, 64(%rdi) + vmovdqu %ymm2, 96(%rdi) + vmovdqu %ymm3, 128(%rdi) + vmovdqu %ymm4, -96(%rax) + # Row 2 + vpxor -64(%rax), %ymm6, %ymm10 + vpxor -32(%rax), %ymm7, %ymm11 + vpxor (%rax), %ymm8, %ymm12 + vpxor 32(%rax), %ymm9, %ymm13 + vpxor 64(%rax), %ymm5, %ymm14 + vpsrlq $63, %ymm10, %ymm0 + vpsrlq $58, %ymm11, %ymm1 + vpsrlq $39, %ymm12, %ymm2 + vpsrlq $56, %ymm13, %ymm3 + vpsrlq $46, %ymm14, %ymm4 + vpaddq %ymm10, %ymm10, %ymm10 + vpsllq $6, %ymm11, %ymm11 + vpsllq $25, %ymm12, %ymm12 + vpsllq $8, %ymm13, %ymm13 + vpsllq $18, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, -64(%rax) + vmovdqu %ymm1, -32(%rax) + vmovdqu %ymm2, (%rax) + vmovdqu %ymm3, 32(%rax) + vmovdqu %ymm4, 64(%rax) + # Row 3 + vpxor 96(%rax), %ymm9, %ymm10 + vpxor 128(%rax), %ymm5, %ymm11 + vpxor -96(%rcx), %ymm6, %ymm12 + vpxor -64(%rcx), %ymm7, %ymm13 + vpxor -32(%rcx), %ymm8, %ymm14 + vpsrlq $37, %ymm10, %ymm0 + vpsrlq $28, %ymm11, %ymm1 + vpsrlq $54, %ymm12, %ymm2 + vpsrlq $49, %ymm13, %ymm3 + vpsrlq $8, %ymm14, %ymm4 + vpsllq $27, %ymm10, %ymm10 + vpsllq $36, %ymm11, %ymm11 + vpsllq $10, %ymm12, %ymm12 + vpsllq $15, %ymm13, %ymm13 + vpsllq $56, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, 96(%rax) + vmovdqu %ymm1, 128(%rax) + vmovdqu %ymm2, -96(%rcx) + vmovdqu %ymm3, -64(%rcx) + vmovdqu %ymm4, -32(%rcx) + # Row 4 + vpxor (%rcx), %ymm7, %ymm10 + vpxor 32(%rcx), %ymm8, %ymm11 + vpxor 64(%rcx), %ymm9, %ymm12 + vpxor 96(%rcx), %ymm5, %ymm13 + vpxor 128(%rcx), %ymm6, %ymm14 + vpsrlq $2, %ymm10, %ymm0 + vpsrlq $9, %ymm11, %ymm1 + vpsrlq $25, %ymm12, %ymm2 + vpsrlq $23, %ymm13, %ymm3 + vpsrlq $62, %ymm14, %ymm4 + vpsllq $62, %ymm10, %ymm10 + vpsllq $55, %ymm11, %ymm11 + vpsllq $39, %ymm12, %ymm12 + vpsllq $41, %ymm13, %ymm13 + vpsllq $2, %ymm14, %ymm14 + vpor %ymm0, %ymm10, %ymm10 + vpor %ymm1, %ymm11, %ymm11 + vpor %ymm2, %ymm12, %ymm12 + vpor %ymm3, %ymm13, %ymm13 + vpor %ymm4, %ymm14, %ymm14 + vpandn %ymm12, %ymm11, %ymm0 + vpandn %ymm13, %ymm12, %ymm1 + vpandn %ymm14, %ymm13, %ymm2 + vpandn %ymm10, %ymm14, %ymm3 + vpandn %ymm11, %ymm10, %ymm4 + vpxor %ymm10, %ymm0, %ymm0 + vpxor %ymm11, %ymm1, %ymm1 + vpxor %ymm12, %ymm2, %ymm2 + vpxor %ymm13, %ymm3, %ymm3 + vpxor %ymm14, %ymm4, %ymm4 + vmovdqu %ymm0, (%rcx) + vmovdqu %ymm1, 32(%rcx) + vmovdqu %ymm2, 64(%rcx) + vmovdqu %ymm3, 96(%rcx) + vmovdqu %ymm4, 128(%rcx) + subq $0x80, %rdi + vmovdqu %ymm15, (%rdi) + vzeroupper + repz retq +#ifndef __APPLE__ +.size kyber_sha3_256_blocksx4_seed_avx2,.-kyber_sha3_256_blocksx4_seed_avx2 +#endif /* __APPLE__ */ +#endif /* HAVE_INTEL_AVX2 */ +#endif /* WOLFSSL_WC_KYBER */ +#if defined(__linux__) && defined(__ELF__) +.section .note.GNU-stack,"",%progbits +#endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_poly.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_poly.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_poly.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_kyber_poly.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* wc_kyber_poly.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -19,8 +19,3711 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ -#include +/* Implementation based on NIST 3rd Round submission package. + * See link at: + * https://csrc.nist.gov/Projects/post-quantum-cryptography/post-quantum-cryptography-standardization/round-3-submissions + */ + +/* Implementation of the functions that operate on polynomials or vectors of + * polynomials. + */ + +/* Possible Kyber options: + * + * WOLFSSL_WC_KYBER Default: OFF + * Enables this code, wolfSSL implementation, to be built. + * + * WOLFSSL_KYBER512 Default: OFF + * Enables the KYBER512 parameter implementations. + * WOLFSSL_KYBER768 Default: OFF + * Enables the KYBER768 parameter implementations. + * WOLFSSL_KYBER1024 Default: OFF + * Enables the KYBER1024 parameter implementations. + * + * USE_INTEL_SPEEDUP Default: OFF + * Compiles in Intel x64 specific implementations that are faster. + * WOLFSSL_KYBER_NO_LARGE_CODE Default: OFF + * Compiles smaller, fast code size with a speed trade-off. + * WOLFSSL_KYBER_SMALL Default: OFF + * Compiles to small code size with a speed trade-off. + * WOLFSSL_SMALL_STACK Default: OFF + * Use less stack by dynamically allocating local variables. + * + * WOLFSSL_KYBER_NTT_UNROLL Defualt: OFF + * Enable an alternative NTT implementation that may be faster on some + * platforms and is smaller in code size. + * WOLFSSL_KYBER_INVNTT_UNROLL Default: OFF + * Enables an alternative inverse NTT implementation that may be faster on + * some platforms and is smaller in code size. + */ + +#include +#include +#include + +#ifdef WOLFSSL_WC_KYBER + +/* Declared in wc_kyber.c to stop compiler optimizer from simplifying. */ +extern volatile sword16 kyber_opt_blocker; + +#ifdef USE_INTEL_SPEEDUP +static word32 cpuid_flags = 0; +#endif + +/* Half of Q plus one. Converted message bit value of 1. */ +#define KYBER_Q_1_HALF ((KYBER_Q + 1) / 2) +/* Half of Q */ +#define KYBER_Q_HALF (KYBER_Q / 2) + + +/* q^-1 mod 2^16 (inverse of 3329 mod 16384) */ +#define KYBER_QINV 62209 + +/* Used in Barrett Reduction: + * r = a mod q + * => r = a - ((V * a) >> 26) * q), as V based on 2^26 + * V is the multiplier that gets the quotient after shifting. + */ +#define KYBER_V (((1U << 26) + (KYBER_Q / 2)) / KYBER_Q) + +/* Used in converting to Montgomery form. + * f is the normalizer = 2^k % m. + * 16-bit value cast to sword32 in use. + */ +#define KYBER_F ((1ULL << 32) % KYBER_Q) + +/* Number of bytes in an output block of SHA-3-128 */ +#define SHA3_128_BYTES (WC_SHA3_128_COUNT * 8) +/* Number of bytes in an output block of SHA-3-256 */ +#define SHA3_256_BYTES (WC_SHA3_256_COUNT * 8) + +/* Number of blocks to generate for matrix. */ +#define GEN_MATRIX_NBLOCKS \ + ((12 * KYBER_N / 8 * (1 << 12) / KYBER_Q + XOF_BLOCK_SIZE) / XOF_BLOCK_SIZE) +/* Number of bytes to generate for matrix. */ +#define GEN_MATRIX_SIZE GEN_MATRIX_NBLOCKS * XOF_BLOCK_SIZE + + +/* Number of random bytes to generate for ETA3. */ +#define ETA3_RAND_SIZE ((3 * KYBER_N) / 4) +/* Number of random bytes to generate for ETA2. */ +#define ETA2_RAND_SIZE ((2 * KYBER_N) / 4) + + +/* Montgomery reduce a. + * + * @param [in] a 32-bit value to be reduced. + * @return Montgomery reduction result. + */ +#define KYBER_MONT_RED(a) \ + (sword16)(((a) - (sword32)(((sword16)((sword16)(a) * \ + (sword16)KYBER_QINV)) * \ + (sword32)KYBER_Q)) >> 16) + +/* Barrett reduce a. r = a mod q. + * + * Converted division to multiplication. + * + * @param [in] a 16-bit value to be reduced to range of q. + * @return Modulo result. + */ +#define KYBER_BARRETT_RED(a) \ + (sword16)((sword16)(a) - (sword16)((sword16)( \ + ((sword32)((sword32)KYBER_V * (sword16)(a))) >> 26) * (word16)KYBER_Q)) + + +/* Zetas for NTT. */ +const sword16 zetas[KYBER_N / 2] = { + 2285, 2571, 2970, 1812, 1493, 1422, 287, 202, 3158, 622, 1577, 182, + 962, 2127, 1855, 1468, 573, 2004, 264, 383, 2500, 1458, 1727, 3199, + 2648, 1017, 732, 608, 1787, 411, 3124, 1758, 1223, 652, 2777, 1015, + 2036, 1491, 3047, 1785, 516, 3321, 3009, 2663, 1711, 2167, 126, 1469, + 2476, 3239, 3058, 830, 107, 1908, 3082, 2378, 2931, 961, 1821, 2604, + 448, 2264, 677, 2054, 2226, 430, 555, 843, 2078, 871, 1550, 105, + 422, 587, 177, 3094, 3038, 2869, 1574, 1653, 3083, 778, 1159, 3182, + 2552, 1483, 2727, 1119, 1739, 644, 2457, 349, 418, 329, 3173, 3254, + 817, 1097, 603, 610, 1322, 2044, 1864, 384, 2114, 3193, 1218, 1994, + 2455, 220, 2142, 1670, 2144, 1799, 2051, 794, 1819, 2475, 2459, 478, + 3221, 3021, 996, 991, 958, 1869, 1522, 1628 +}; + +/* Zetas for inverse NTT. */ +const sword16 zetas_inv[KYBER_N / 2] = { + 1701, 1807, 1460, 2371, 2338, 2333, 308, 108, 2851, 870, 854, 1510, + 2535, 1278, 1530, 1185, 1659, 1187, 3109, 874, 1335, 2111, 136, 1215, + 2945, 1465, 1285, 2007, 2719, 2726, 2232, 2512, 75, 156, 3000, 2911, + 2980, 872, 2685, 1590, 2210, 602, 1846, 777, 147, 2170, 2551, 246, + 1676, 1755, 460, 291, 235, 3152, 2742, 2907, 3224, 1779, 2458, 1251, + 2486, 2774, 2899, 1103, 1275, 2652, 1065, 2881, 725, 1508, 2368, 398, + 951, 247, 1421, 3222, 2499, 271, 90, 853, 1860, 3203, 1162, 1618, + 666, 320, 8, 2813, 1544, 282, 1838, 1293, 2314, 552, 2677, 2106, + 1571, 205, 2918, 1542, 2721, 2597, 2312, 681, 130, 1602, 1871, 829, + 2946, 3065, 1325, 2756, 1861, 1474, 1202, 2367, 3147, 1752, 2707, 171, + 3127, 3042, 1907, 1836, 1517, 359, 758, 1441 +}; + + +/* Number-Theoretic Transform. + * + * @param [in, out] r Polynomial to transform. + */ +static void kyber_ntt(sword16* r) +{ +#ifdef WOLFSSL_KYBER_SMALL + unsigned int len; + unsigned int k; + unsigned int j; + + k = 1; + for (len = KYBER_N / 2; len >= 2; len >>= 1) { + unsigned int start; + for (start = 0; start < KYBER_N; start = j + len) { + sword16 zeta = zetas[k++]; + for (j = start; j < start + len; ++j) { + sword32 p = (sword32)zeta * r[j + len]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[j]; + r[j + len] = rj - t; + r[j] = rj + t; + } + } + } + + /* Reduce coefficients with quick algorithm. */ + for (j = 0; j < KYBER_N; ++j) { + r[j] = KYBER_BARRETT_RED(r[j]); + } +#elif defined(WOLFSSL_KYBER_NO_LARGE_CODE) + unsigned int len; + unsigned int k = 1; + unsigned int j; + unsigned int start; + sword16 zeta = zetas[k++]; + + for (j = 0; j < KYBER_N / 2; ++j) { + sword32 p = (sword32)zeta * r[j + KYBER_N / 2]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[j]; + r[j + KYBER_N / 2] = rj - t; + r[j] = rj + t; + } + for (len = KYBER_N / 4; len >= 2; len >>= 1) { + for (start = 0; start < KYBER_N; start = j + len) { + zeta = zetas[k++]; + for (j = start; j < start + len; ++j) { + sword32 p = (sword32)zeta * r[j + len]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[j]; + r[j + len] = rj - t; + r[j] = rj + t; + } + } + } + + /* Reduce coefficients with quick algorithm. */ + for (j = 0; j < KYBER_N; ++j) { + r[j] = KYBER_BARRETT_RED(r[j]); + } +#elif defined(WOLFSSL_KYBER_NTT_UNROLL) + unsigned int k = 1; + unsigned int j; + unsigned int start; + sword16 zeta = zetas[k++]; + + for (j = 0; j < KYBER_N / 2; ++j) { + sword32 p = (sword32)zeta * r[j + KYBER_N / 2]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[j]; + r[j + KYBER_N / 2] = rj - t; + r[j] = rj + t; + } + for (start = 0; start < KYBER_N; start += 2 * 64) { + zeta = zetas[k++]; + for (j = 0; j < 64; ++j) { + sword32 p = (sword32)zeta * r[start + j + 64]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[start + j]; + r[start + j + 64] = rj - t; + r[start + j] = rj + t; + } + } + for (start = 0; start < KYBER_N; start += 2 * 32) { + zeta = zetas[k++]; + for (j = 0; j < 32; ++j) { + sword32 p = (sword32)zeta * r[start + j + 32]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[start + j]; + r[start + j + 32] = rj - t; + r[start + j] = rj + t; + } + } + for (start = 0; start < KYBER_N; start += 2 * 16) { + zeta = zetas[k++]; + for (j = 0; j < 16; ++j) { + sword32 p = (sword32)zeta * r[start + j + 16]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[start + j]; + r[start + j + 16] = rj - t; + r[start + j] = rj + t; + } + } + for (start = 0; start < KYBER_N; start += 2 * 8) { + zeta = zetas[k++]; + for (j = 0; j < 8; ++j) { + sword32 p = (sword32)zeta * r[start + j + 8]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[start + j]; + r[start + j + 8] = rj - t; + r[start + j] = rj + t; + } + } + for (start = 0; start < KYBER_N; start += 2 * 4) { + zeta = zetas[k++]; + for (j = 0; j < 4; ++j) { + sword32 p = (sword32)zeta * r[start + j + 4]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[start + j]; + r[start + j + 4] = rj - t; + r[start + j] = rj + t; + } + } + for (start = 0; start < KYBER_N; start += 2 * 2) { + zeta = zetas[k++]; + for (j = 0; j < 2; ++j) { + sword32 p = (sword32)zeta * r[start + j + 2]; + sword16 t = KYBER_MONT_RED(p); + sword16 rj = r[start + j]; + r[start + j + 2] = rj - t; + r[start + j] = rj + t; + } + } + /* Reduce coefficients with quick algorithm. */ + for (j = 0; j < KYBER_N; ++j) { + r[j] = KYBER_BARRETT_RED(r[j]); + } +#else + unsigned int j; + sword16 t0; + sword16 t1; + sword16 t2; + sword16 t3; + + sword16 zeta128 = zetas[1]; + sword16 zeta64_0 = zetas[2]; + sword16 zeta64_1 = zetas[3]; + for (j = 0; j < KYBER_N / 8; j++) { + sword16 r0 = r[j + 0]; + sword16 r1 = r[j + 32]; + sword16 r2 = r[j + 64]; + sword16 r3 = r[j + 96]; + sword16 r4 = r[j + 128]; + sword16 r5 = r[j + 160]; + sword16 r6 = r[j + 192]; + sword16 r7 = r[j + 224]; + + t0 = KYBER_MONT_RED((sword32)zeta128 * r4); + t1 = KYBER_MONT_RED((sword32)zeta128 * r5); + t2 = KYBER_MONT_RED((sword32)zeta128 * r6); + t3 = KYBER_MONT_RED((sword32)zeta128 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = KYBER_MONT_RED((sword32)zeta64_0 * r2); + t1 = KYBER_MONT_RED((sword32)zeta64_0 * r3); + t2 = KYBER_MONT_RED((sword32)zeta64_1 * r6); + t3 = KYBER_MONT_RED((sword32)zeta64_1 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + r[j + 0] = r0; + r[j + 32] = r1; + r[j + 64] = r2; + r[j + 96] = r3; + r[j + 128] = r4; + r[j + 160] = r5; + r[j + 192] = r6; + r[j + 224] = r7; + } + + for (j = 0; j < KYBER_N; j += 64) { + int i; + sword16 zeta32 = zetas[ 4 + j / 64 + 0]; + sword16 zeta16_0 = zetas[ 8 + j / 32 + 0]; + sword16 zeta16_1 = zetas[ 8 + j / 32 + 1]; + sword16 zeta8_0 = zetas[16 + j / 16 + 0]; + sword16 zeta8_1 = zetas[16 + j / 16 + 1]; + sword16 zeta8_2 = zetas[16 + j / 16 + 2]; + sword16 zeta8_3 = zetas[16 + j / 16 + 3]; + for (i = 0; i < 8; i++) { + sword16 r0 = r[j + i + 0]; + sword16 r1 = r[j + i + 8]; + sword16 r2 = r[j + i + 16]; + sword16 r3 = r[j + i + 24]; + sword16 r4 = r[j + i + 32]; + sword16 r5 = r[j + i + 40]; + sword16 r6 = r[j + i + 48]; + sword16 r7 = r[j + i + 56]; + + t0 = KYBER_MONT_RED((sword32)zeta32 * r4); + t1 = KYBER_MONT_RED((sword32)zeta32 * r5); + t2 = KYBER_MONT_RED((sword32)zeta32 * r6); + t3 = KYBER_MONT_RED((sword32)zeta32 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = KYBER_MONT_RED((sword32)zeta16_0 * r2); + t1 = KYBER_MONT_RED((sword32)zeta16_0 * r3); + t2 = KYBER_MONT_RED((sword32)zeta16_1 * r6); + t3 = KYBER_MONT_RED((sword32)zeta16_1 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + t0 = KYBER_MONT_RED((sword32)zeta8_0 * r1); + t1 = KYBER_MONT_RED((sword32)zeta8_1 * r3); + t2 = KYBER_MONT_RED((sword32)zeta8_2 * r5); + t3 = KYBER_MONT_RED((sword32)zeta8_3 * r7); + r1 = r0 - t0; + r3 = r2 - t1; + r5 = r4 - t2; + r7 = r6 - t3; + r0 += t0; + r2 += t1; + r4 += t2; + r6 += t3; + + r[j + i + 0] = r0; + r[j + i + 8] = r1; + r[j + i + 16] = r2; + r[j + i + 24] = r3; + r[j + i + 32] = r4; + r[j + i + 40] = r5; + r[j + i + 48] = r6; + r[j + i + 56] = r7; + } + } + + for (j = 0; j < KYBER_N; j += 8) { + sword16 zeta4 = zetas[32 + j / 8 + 0]; + sword16 zeta2_0 = zetas[64 + j / 4 + 0]; + sword16 zeta2_1 = zetas[64 + j / 4 + 1]; + sword16 r0 = r[j + 0]; + sword16 r1 = r[j + 1]; + sword16 r2 = r[j + 2]; + sword16 r3 = r[j + 3]; + sword16 r4 = r[j + 4]; + sword16 r5 = r[j + 5]; + sword16 r6 = r[j + 6]; + sword16 r7 = r[j + 7]; + + t0 = KYBER_MONT_RED((sword32)zeta4 * r4); + t1 = KYBER_MONT_RED((sword32)zeta4 * r5); + t2 = KYBER_MONT_RED((sword32)zeta4 * r6); + t3 = KYBER_MONT_RED((sword32)zeta4 * r7); + r4 = r0 - t0; + r5 = r1 - t1; + r6 = r2 - t2; + r7 = r3 - t3; + r0 += t0; + r1 += t1; + r2 += t2; + r3 += t3; + + t0 = KYBER_MONT_RED((sword32)zeta2_0 * r2); + t1 = KYBER_MONT_RED((sword32)zeta2_0 * r3); + t2 = KYBER_MONT_RED((sword32)zeta2_1 * r6); + t3 = KYBER_MONT_RED((sword32)zeta2_1 * r7); + r2 = r0 - t0; + r3 = r1 - t1; + r6 = r4 - t2; + r7 = r5 - t3; + r0 += t0; + r1 += t1; + r4 += t2; + r5 += t3; + + r[j + 0] = KYBER_BARRETT_RED(r0); + r[j + 1] = KYBER_BARRETT_RED(r1); + r[j + 2] = KYBER_BARRETT_RED(r2); + r[j + 3] = KYBER_BARRETT_RED(r3); + r[j + 4] = KYBER_BARRETT_RED(r4); + r[j + 5] = KYBER_BARRETT_RED(r5); + r[j + 6] = KYBER_BARRETT_RED(r6); + r[j + 7] = KYBER_BARRETT_RED(r7); + } +#endif +} + +/* Inverse Number-Theoretic Transform. + * + * @param [in, out] r Polynomial to transform. + */ +static void kyber_invntt(sword16* r) +{ +#ifdef WOLFSSL_KYBER_SMALL + unsigned int len; + unsigned int k; + unsigned int j; + sword16 zeta; + + k = 0; + for (len = 2; len <= KYBER_N / 2; len <<= 1) { + unsigned int start; + for (start = 0; start < KYBER_N; start = j + len) { + zeta = zetas_inv[k++]; + for (j = start; j < start + len; ++j) { + sword32 p; + sword16 rj = r[j]; + sword16 rjl = r[j + len]; + sword16 t = rj + rjl; + r[j] = KYBER_BARRETT_RED(t); + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[j + len] = KYBER_MONT_RED(p); + } + } + } + + zeta = zetas_inv[127]; + for (j = 0; j < KYBER_N; ++j) { + sword32 p = (sword32)zeta * r[j]; + r[j] = KYBER_MONT_RED(p); + } +#elif defined(WOLFSSL_KYBER_NO_LARGE_CODE) + unsigned int len; + unsigned int k; + unsigned int j; + sword16 zeta; + sword16 zeta2; + + k = 0; + for (len = 2; len <= KYBER_N / 4; len <<= 1) { + unsigned int start; + for (start = 0; start < KYBER_N; start = j + len) { + zeta = zetas_inv[k++]; + for (j = start; j < start + len; ++j) { + sword32 p; + sword16 rj = r[j]; + sword16 rjl = r[j + len]; + sword16 t = rj + rjl; + r[j] = KYBER_BARRETT_RED(t); + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[j + len] = KYBER_MONT_RED(p); + } + } + } + + zeta = zetas_inv[126]; + zeta2 = zetas_inv[127]; + for (j = 0; j < KYBER_N / 2; ++j) { + sword32 p; + sword16 rj = r[j]; + sword16 rjl = r[j + KYBER_N / 2]; + sword16 t = rj + rjl; + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[j] = t; + r[j + KYBER_N / 2] = KYBER_MONT_RED(p); + + p = (sword32)zeta2 * r[j]; + r[j] = KYBER_MONT_RED(p); + p = (sword32)zeta2 * r[j + KYBER_N / 2]; + r[j + KYBER_N / 2] = KYBER_MONT_RED(p); + } +#elif defined(WOLFSSL_KYBER_INVNTT_UNROLL) + unsigned int k; + unsigned int j; + unsigned int start; + sword16 zeta; + sword16 zeta2; + + k = 0; + for (start = 0; start < KYBER_N; start += 2 * 2) { + zeta = zetas_inv[k++]; + for (j = 0; j < 2; ++j) { + sword32 p; + sword16 rj = r[start + j]; + sword16 rjl = r[start + j + 2]; + sword16 t = rj + rjl; + r[start + j] = t; + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[start + j + 2] = KYBER_MONT_RED(p); + } + } + for (start = 0; start < KYBER_N; start += 2 * 4) { + zeta = zetas_inv[k++]; + for (j = 0; j < 4; ++j) { + sword32 p; + sword16 rj = r[start + j]; + sword16 rjl = r[start + j + 4]; + sword16 t = rj + rjl; + r[start + j] = t; + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[start + j + 4] = KYBER_MONT_RED(p); + } + } + for (start = 0; start < KYBER_N; start += 2 * 8) { + zeta = zetas_inv[k++]; + for (j = 0; j < 8; ++j) { + sword32 p; + sword16 rj = r[start + j]; + sword16 rjl = r[start + j + 8]; + sword16 t = rj + rjl; + /* Reduce. */ + r[start + j] = KYBER_BARRETT_RED(t); + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[start + j + 8] = KYBER_MONT_RED(p); + } + } + for (start = 0; start < KYBER_N; start += 2 * 16) { + zeta = zetas_inv[k++]; + for (j = 0; j < 16; ++j) { + sword32 p; + sword16 rj = r[start + j]; + sword16 rjl = r[start + j + 16]; + sword16 t = rj + rjl; + r[start + j] = t; + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[start + j + 16] = KYBER_MONT_RED(p); + } + } + for (start = 0; start < KYBER_N; start += 2 * 32) { + zeta = zetas_inv[k++]; + for (j = 0; j < 32; ++j) { + sword32 p; + sword16 rj = r[start + j]; + sword16 rjl = r[start + j + 32]; + sword16 t = rj + rjl; + r[start + j] = t; + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[start + j + 32] = KYBER_MONT_RED(p); + } + } + for (start = 0; start < KYBER_N; start += 2 * 64) { + zeta = zetas_inv[k++]; + for (j = 0; j < 64; ++j) { + sword32 p; + sword16 rj = r[start + j]; + sword16 rjl = r[start + j + 64]; + sword16 t = rj + rjl; + /* Reduce. */ + r[start + j] = KYBER_BARRETT_RED(t); + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[start + j + 64] = KYBER_MONT_RED(p); + } + } + zeta = zetas_inv[126]; + zeta2 = zetas_inv[127]; + for (j = 0; j < KYBER_N / 2; ++j) { + sword32 p; + sword16 rj = r[j]; + sword16 rjl = r[j + KYBER_N / 2]; + sword16 t = rj + rjl; + rjl = rj - rjl; + p = (sword32)zeta * rjl; + r[j] = t; + r[j + KYBER_N / 2] = KYBER_MONT_RED(p); + + p = (sword32)zeta2 * r[j]; + r[j] = KYBER_MONT_RED(p); + p = (sword32)zeta2 * r[j + KYBER_N / 2]; + r[j + KYBER_N / 2] = KYBER_MONT_RED(p); + } +#else + unsigned int j; + sword16 t0; + sword16 t1; + sword16 t2; + sword16 t3; + sword16 zeta64_0; + sword16 zeta64_1; + sword16 zeta128; + sword16 zeta256; + sword32 p; + + for (j = 0; j < KYBER_N; j += 8) { + sword16 zeta2_0 = zetas_inv[ 0 + j / 4 + 0]; + sword16 zeta2_1 = zetas_inv[ 0 + j / 4 + 1]; + sword16 zeta4 = zetas_inv[64 + j / 8 + 0]; + sword16 r0 = r[j + 0]; + sword16 r1 = r[j + 1]; + sword16 r2 = r[j + 2]; + sword16 r3 = r[j + 3]; + sword16 r4 = r[j + 4]; + sword16 r5 = r[j + 5]; + sword16 r6 = r[j + 6]; + sword16 r7 = r[j + 7]; + + p = (sword32)zeta2_0 * (sword16)(r0 - r2); + t0 = KYBER_MONT_RED(p); + p = (sword32)zeta2_0 * (sword16)(r1 - r3); + t1 = KYBER_MONT_RED(p); + p = (sword32)zeta2_1 * (sword16)(r4 - r6); + t2 = KYBER_MONT_RED(p); + p = (sword32)zeta2_1 * (sword16)(r5 - r7); + t3 = KYBER_MONT_RED(p); + r0 += r2; + r1 += r3; + r4 += r6; + r5 += r7; + r2 = t0; + r3 = t1; + r6 = t2; + r7 = t3; + + p = (sword32)zeta4 * (sword16)(r0 - r4); + t0 = KYBER_MONT_RED(p); + p = (sword32)zeta4 * (sword16)(r1 - r5); + t1 = KYBER_MONT_RED(p); + p = (sword32)zeta4 * (sword16)(r2 - r6); + t2 = KYBER_MONT_RED(p); + p = (sword32)zeta4 * (sword16)(r3 - r7); + t3 = KYBER_MONT_RED(p); + r0 += r4; + r1 += r5; + r2 += r6; + r3 += r7; + r4 = t0; + r5 = t1; + r6 = t2; + r7 = t3; + + r[j + 0] = r0; + r[j + 1] = r1; + r[j + 2] = r2; + r[j + 3] = r3; + r[j + 4] = r4; + r[j + 5] = r5; + r[j + 6] = r6; + r[j + 7] = r7; + } + + for (j = 0; j < KYBER_N; j += 64) { + int i; + sword16 zeta8_0 = zetas_inv[ 96 + j / 16 + 0]; + sword16 zeta8_1 = zetas_inv[ 96 + j / 16 + 1]; + sword16 zeta8_2 = zetas_inv[ 96 + j / 16 + 2]; + sword16 zeta8_3 = zetas_inv[ 96 + j / 16 + 3]; + sword16 zeta16_0 = zetas_inv[112 + j / 32 + 0]; + sword16 zeta16_1 = zetas_inv[112 + j / 32 + 1]; + sword16 zeta32 = zetas_inv[120 + j / 64 + 0]; + for (i = 0; i < 8; i++) { + sword16 r0 = r[j + i + 0]; + sword16 r1 = r[j + i + 8]; + sword16 r2 = r[j + i + 16]; + sword16 r3 = r[j + i + 24]; + sword16 r4 = r[j + i + 32]; + sword16 r5 = r[j + i + 40]; + sword16 r6 = r[j + i + 48]; + sword16 r7 = r[j + i + 56]; + + p = (sword32)zeta8_0 * (sword16)(r0 - r1); + t0 = KYBER_MONT_RED(p); + p = (sword32)zeta8_1 * (sword16)(r2 - r3); + t1 = KYBER_MONT_RED(p); + p = (sword32)zeta8_2 * (sword16)(r4 - r5); + t2 = KYBER_MONT_RED(p); + p = (sword32)zeta8_3 * (sword16)(r6 - r7); + t3 = KYBER_MONT_RED(p); + r0 = KYBER_BARRETT_RED(r0 + r1); + r2 = KYBER_BARRETT_RED(r2 + r3); + r4 = KYBER_BARRETT_RED(r4 + r5); + r6 = KYBER_BARRETT_RED(r6 + r7); + r1 = t0; + r3 = t1; + r5 = t2; + r7 = t3; + + p = (sword32)zeta16_0 * (sword16)(r0 - r2); + t0 = KYBER_MONT_RED(p); + p = (sword32)zeta16_0 * (sword16)(r1 - r3); + t1 = KYBER_MONT_RED(p); + p = (sword32)zeta16_1 * (sword16)(r4 - r6); + t2 = KYBER_MONT_RED(p); + p = (sword32)zeta16_1 * (sword16)(r5 - r7); + t3 = KYBER_MONT_RED(p); + r0 += r2; + r1 += r3; + r4 += r6; + r5 += r7; + r2 = t0; + r3 = t1; + r6 = t2; + r7 = t3; + + p = (sword32)zeta32 * (sword16)(r0 - r4); + t0 = KYBER_MONT_RED(p); + p = (sword32)zeta32 * (sword16)(r1 - r5); + t1 = KYBER_MONT_RED(p); + p = (sword32)zeta32 * (sword16)(r2 - r6); + t2 = KYBER_MONT_RED(p); + p = (sword32)zeta32 * (sword16)(r3 - r7); + t3 = KYBER_MONT_RED(p); + r0 += r4; + r1 += r5; + r2 += r6; + r3 += r7; + r4 = t0; + r5 = t1; + r6 = t2; + r7 = t3; + + r[j + i + 0] = r0; + r[j + i + 8] = r1; + r[j + i + 16] = r2; + r[j + i + 24] = r3; + r[j + i + 32] = r4; + r[j + i + 40] = r5; + r[j + i + 48] = r6; + r[j + i + 56] = r7; + } + } + + zeta64_0 = zetas_inv[124]; + zeta64_1 = zetas_inv[125]; + zeta128 = zetas_inv[126]; + zeta256 = zetas_inv[127]; + for (j = 0; j < KYBER_N / 8; j++) { + sword16 r0 = r[j + 0]; + sword16 r1 = r[j + 32]; + sword16 r2 = r[j + 64]; + sword16 r3 = r[j + 96]; + sword16 r4 = r[j + 128]; + sword16 r5 = r[j + 160]; + sword16 r6 = r[j + 192]; + sword16 r7 = r[j + 224]; + + p = (sword32)zeta64_0 * (sword16)(r0 - r2); + t0 = KYBER_MONT_RED(p); + p = (sword32)zeta64_0 * (sword16)(r1 - r3); + t1 = KYBER_MONT_RED(p); + p = (sword32)zeta64_1 * (sword16)(r4 - r6); + t2 = KYBER_MONT_RED(p); + p = (sword32)zeta64_1 * (sword16)(r5 - r7); + t3 = KYBER_MONT_RED(p); + r0 = KYBER_BARRETT_RED(r0 + r2); + r1 = KYBER_BARRETT_RED(r1 + r3); + r4 = KYBER_BARRETT_RED(r4 + r6); + r5 = KYBER_BARRETT_RED(r5 + r7); + r2 = t0; + r3 = t1; + r6 = t2; + r7 = t3; + + p = (sword32)zeta128 * (sword16)(r0 - r4); + t0 = KYBER_MONT_RED(p); + p = (sword32)zeta128 * (sword16)(r1 - r5); + t1 = KYBER_MONT_RED(p); + p = (sword32)zeta128 * (sword16)(r2 - r6); + t2 = KYBER_MONT_RED(p); + p = (sword32)zeta128 * (sword16)(r3 - r7); + t3 = KYBER_MONT_RED(p); + r0 += r4; + r1 += r5; + r2 += r6; + r3 += r7; + r4 = t0; + r5 = t1; + r6 = t2; + r7 = t3; + + p = (sword32)zeta256 * r0; + r0 = KYBER_MONT_RED(p); + p = (sword32)zeta256 * r1; + r1 = KYBER_MONT_RED(p); + p = (sword32)zeta256 * r2; + r2 = KYBER_MONT_RED(p); + p = (sword32)zeta256 * r3; + r3 = KYBER_MONT_RED(p); + p = (sword32)zeta256 * r4; + r4 = KYBER_MONT_RED(p); + p = (sword32)zeta256 * r5; + r5 = KYBER_MONT_RED(p); + p = (sword32)zeta256 * r6; + r6 = KYBER_MONT_RED(p); + p = (sword32)zeta256 * r7; + r7 = KYBER_MONT_RED(p); + + r[j + 0] = r0; + r[j + 32] = r1; + r[j + 64] = r2; + r[j + 96] = r3; + r[j + 128] = r4; + r[j + 160] = r5; + r[j + 192] = r6; + r[j + 224] = r7; + } +#endif +} + +/* Multiplication of polynomials in Zq[X]/(X^2-zeta). + * + * Used for multiplication of elements in Rq in NTT domain. + * + * @param [out] r Result polynomial. + * @param [in] a First factor. + * @param [in] b Second factor. + * @param [in] zeta Integer defining the reduction polynomial. + */ +static void kyber_basemul(sword16* r, const sword16* a, const sword16* b, + sword16 zeta) +{ + sword16 r0; + sword16 a0 = a[0]; + sword16 a1 = a[1]; + sword16 b0 = b[0]; + sword16 b1 = b[1]; + sword32 p1; + sword32 p2; + + p1 = (sword32)a1 * b1; + p2 = (sword32)a0 * b0; + r0 = KYBER_MONT_RED(p1); + p1 = (sword32)zeta * r0; + p1 += p2; + r[0] = KYBER_MONT_RED(p1); + + p1 = (sword32)a0 * b1; + p2 = (sword32)a1 * b0; + p1 += p2; + r[1] = KYBER_MONT_RED(p1); +} + +/* Multiply two polynomials in NTT domain. r = a * b. + * + * @param [out] r Result polynomial. + * @param [in] a First polynomial multiplier. + * @param [in] b Second polynomial multiplier. + */ +static void kyber_basemul_mont(sword16* r, const sword16* a, const sword16* b) +{ + unsigned int i; + const sword16* zeta = zetas + 64; + +#ifdef WOLFSSL_KYBER_SMALL + for (i = 0; i < KYBER_N; i += 4, zeta++) { + kyber_basemul(r + i + 0, a + i + 0, b + i + 0, zeta[0]); + kyber_basemul(r + i + 2, a + i + 2, b + i + 2, -zeta[0]); + } +#elif defined(WOLFSSL_KYBER_NO_LARGE_CODE) + for (i = 0; i < KYBER_N; i += 8, zeta += 2) { + kyber_basemul(r + i + 0, a + i + 0, b + i + 0, zeta[0]); + kyber_basemul(r + i + 2, a + i + 2, b + i + 2, -zeta[0]); + kyber_basemul(r + i + 4, a + i + 4, b + i + 4, zeta[1]); + kyber_basemul(r + i + 6, a + i + 6, b + i + 6, -zeta[1]); + } +#else + for (i = 0; i < KYBER_N; i += 16, zeta += 4) { + kyber_basemul(r + i + 0, a + i + 0, b + i + 0, zeta[0]); + kyber_basemul(r + i + 2, a + i + 2, b + i + 2, -zeta[0]); + kyber_basemul(r + i + 4, a + i + 4, b + i + 4, zeta[1]); + kyber_basemul(r + i + 6, a + i + 6, b + i + 6, -zeta[1]); + kyber_basemul(r + i + 8, a + i + 8, b + i + 8, zeta[2]); + kyber_basemul(r + i + 10, a + i + 10, b + i + 10, -zeta[2]); + kyber_basemul(r + i + 12, a + i + 12, b + i + 12, zeta[3]); + kyber_basemul(r + i + 14, a + i + 14, b + i + 14, -zeta[3]); + } +#endif +} + +/* Multiply two polynomials in NTT domain and add to result. r += a * b. + * + * @param [in, out] r Result polynomial. + * @param [in] a First polynomial multiplier. + * @param [in] b Second polynomial multiplier. + */ +static void kyber_basemul_mont_add(sword16* r, const sword16* a, + const sword16* b) +{ + unsigned int i; + const sword16* zeta = zetas + 64; + +#ifdef WOLFSSL_KYBER_SMALL + for (i = 0; i < KYBER_N; i += 4, zeta++) { + sword16 t0[2]; + sword16 t2[2]; + + kyber_basemul(t0, a + i + 0, b + i + 0, zeta[0]); + kyber_basemul(t2, a + i + 2, b + i + 2, -zeta[0]); + + r[i + 0] += t0[0]; + r[i + 1] += t0[1]; + r[i + 2] += t2[0]; + r[i + 3] += t2[1]; + } +#elif defined(WOLFSSL_KYBER_NO_LARGE_CODE) + for (i = 0; i < KYBER_N; i += 8, zeta += 2) { + sword16 t0[2]; + sword16 t2[2]; + sword16 t4[2]; + sword16 t6[2]; + + kyber_basemul(t0, a + i + 0, b + i + 0, zeta[0]); + kyber_basemul(t2, a + i + 2, b + i + 2, -zeta[0]); + kyber_basemul(t4, a + i + 4, b + i + 4, zeta[1]); + kyber_basemul(t6, a + i + 6, b + i + 6, -zeta[1]); + + r[i + 0] += t0[0]; + r[i + 1] += t0[1]; + r[i + 2] += t2[0]; + r[i + 3] += t2[1]; + r[i + 4] += t4[0]; + r[i + 5] += t4[1]; + r[i + 6] += t6[0]; + r[i + 7] += t6[1]; + } +#else + for (i = 0; i < KYBER_N; i += 16, zeta += 4) { + sword16 t0[2]; + sword16 t2[2]; + sword16 t4[2]; + sword16 t6[2]; + sword16 t8[2]; + sword16 t10[2]; + sword16 t12[2]; + sword16 t14[2]; + + kyber_basemul(t0, a + i + 0, b + i + 0, zeta[0]); + kyber_basemul(t2, a + i + 2, b + i + 2, -zeta[0]); + kyber_basemul(t4, a + i + 4, b + i + 4, zeta[1]); + kyber_basemul(t6, a + i + 6, b + i + 6, -zeta[1]); + kyber_basemul(t8, a + i + 8, b + i + 8, zeta[2]); + kyber_basemul(t10, a + i + 10, b + i + 10, -zeta[2]); + kyber_basemul(t12, a + i + 12, b + i + 12, zeta[3]); + kyber_basemul(t14, a + i + 14, b + i + 14, -zeta[3]); + + r[i + 0] += t0[0]; + r[i + 1] += t0[1]; + r[i + 2] += t2[0]; + r[i + 3] += t2[1]; + r[i + 4] += t4[0]; + r[i + 5] += t4[1]; + r[i + 6] += t6[0]; + r[i + 7] += t6[1]; + r[i + 8] += t8[0]; + r[i + 9] += t8[1]; + r[i + 10] += t10[0]; + r[i + 11] += t10[1]; + r[i + 12] += t12[0]; + r[i + 13] += t12[1]; + r[i + 14] += t14[0]; + r[i + 15] += t14[1]; + } +#endif +} + +/* Pointwise multiply elements of a and b, into r, and multiply by 2^-16. + * + * @param [out] r Result polynomial. + * @param [in] a First vector polynomial to multiply with. + * @param [in] b Second vector polynomial to multiply with. + * @param [in] kp Number of polynomials in vector. + */ +static void kyber_pointwise_acc_mont(sword16* r, const sword16* a, + const sword16* b, unsigned int kp) +{ + unsigned int i; + + kyber_basemul_mont(r, a, b); + for (i = 1; i < kp - 1; ++i) { + kyber_basemul_mont_add(r, a + i * KYBER_N, b + i * KYBER_N); + } + kyber_basemul_mont_add(r, a + (kp - 1) * KYBER_N, b + (kp - 1) * KYBER_N); +} + +/******************************************************************************/ + +/* Initialize Kyber implementation. + */ +void kyber_init(void) +{ +#ifdef USE_INTEL_SPEEDUP + cpuid_flags = cpuid_get_flags(); +#endif +} + +/******************************************************************************/ + +/* Generate a public-private key pair from randomly generated data. + * + * @param [in, out] priv Private key vector of polynomials. + * @param [out] pub Public key vector of polynomials. + * @param [in] e Error values as a vector of polynomials. Modified. + * @param [in] a Random values in an array of vectors of polynomials. + * @param [in] kp Number of polynomials in vector. + */ +static void kyber_keygen_c(sword16* priv, sword16* pub, sword16* e, + const sword16* a, int kp) +{ + int i; + + /* Transform private key. All of result used in public key calculation */ + for (i = 0; i < kp; ++i) { + kyber_ntt(priv + i * KYBER_N); + } + + /* For each polynomial in the vectors. */ + for (i = 0; i < kp; ++i) { + unsigned int j; + + /* Multiply a by private into public polynomial. */ + kyber_pointwise_acc_mont(pub + i * KYBER_N, a + i * kp * KYBER_N, priv, + kp); + /* Convert public polynomial to Montgomery form. */ + for (j = 0; j < KYBER_N; ++j) { + sword32 t = pub[i * KYBER_N + j] * (sword32)KYBER_F; + pub[i * KYBER_N + j] = KYBER_MONT_RED(t); + } + /* Transform error values polynomial. */ + kyber_ntt(e + i * KYBER_N); + /* Add errors to public key and reduce. */ + for (j = 0; j < KYBER_N; ++j) { + sword16 t = pub[i * KYBER_N + j] + e[i * KYBER_N + j]; + pub[i * KYBER_N + j] = KYBER_BARRETT_RED(t); + } + } +} + +/* Generate a public-private key pair from randomly generated data. + * + * @param [in, out] priv Private key vector of polynomials. + * @param [out] pub Public key vector of polynomials. + * @param [in] e Error values as a vector of polynomials. Modified. + * @param [in] a Random values in an array of vectors of polynomials. + * @param [in] kp Number of polynomials in vector. + */ +void kyber_keygen(sword16* priv, sword16* pub, sword16* e, const sword16* a, + int kp) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_keygen_avx2(priv, pub, e, a, kp); + } + else +#endif + { + kyber_keygen_c(priv, pub, e, a, kp); + } +} + +/* Encapsuluate message. + * + * @param [in] pub Public key vector of polynomials. + * @param [out] bp Vector of polynomials. + * @param [out] v Polynomial. + * @param [in] at Array of vector of polynomials. + * @param [in] sp Vector of polynomials. + * @param [in] ep Error Vector of polynomials. + * @param [in] epp Error polynomial. + * @param [in] m Message polynomial. + * @param [in] kp Number of polynomials in vector. + */ +static void kyber_encapsulate_c(const sword16* pub, sword16* bp, sword16* v, + const sword16* at, sword16* sp, const sword16* ep, const sword16* epp, + const sword16* m, int kp) +{ + int i; + + /* Transform sp. All of result used in calculation of bp and v. */ + for (i = 0; i < kp; ++i) { + kyber_ntt(sp + i * KYBER_N); + } + + /* For each polynomial in the vectors. */ + for (i = 0; i < kp; ++i) { + unsigned int j; + + /* Multiply at by sp into bp polynomial. */ + kyber_pointwise_acc_mont(bp + i * KYBER_N, at + i * kp * KYBER_N, sp, + kp); + /* Inverse transform bp polynomial. */ + kyber_invntt(bp + i * KYBER_N); + /* Add errors to bp and reduce. */ + for (j = 0; j < KYBER_N; ++j) { + sword16 t = bp[i * KYBER_N + j] + ep[i * KYBER_N + j]; + bp[i * KYBER_N + j] = KYBER_BARRETT_RED(t); + } + } + + /* Multiply public key by sp into v polynomial. */ + kyber_pointwise_acc_mont(v, pub, sp, kp); + /* Inverse transform v. */ + kyber_invntt(v); + /* Add errors and message to v and reduce. */ + for (i = 0; i < KYBER_N; ++i) { + sword16 t = v[i] + epp[i] + m[i]; + v[i] = KYBER_BARRETT_RED(t); + } +} + + +/* Encapsulate message. + * + * @param [in] pub Public key vector of polynomials. + * @param [out] bp Vector of polynomials. + * @param [out] v Polynomial. + * @param [in] at Array of vector of polynomials. + * @param [in] sp Vector of polynomials. + * @param [in] ep Error Vector of polynomials. + * @param [in] epp Error polynomial. + * @param [in] m Message polynomial. + * @param [in] kp Number of polynomials in vector. + */ +void kyber_encapsulate(const sword16* pub, sword16* bp, sword16* v, + const sword16* at, sword16* sp, const sword16* ep, const sword16* epp, + const sword16* m, int kp) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_encapsulate_avx2(pub, bp, v, at, sp, ep, epp, m, kp); + } + else +#endif + { + kyber_encapsulate_c(pub, bp, v, at, sp, ep, epp, m, kp); + } +} + +/* Decapsulate message. + * + * @param [in] priv Private key vector of polynomials. + * @param [out] mp Message polynomial. + * @param [in] bp Vector of polynomials containing error. + * @param [in] v Encapsulated message polynomial. + * @param [in] kp Number of polynomials in vector. + */ +static void kyber_decapsulate_c(const sword16* priv, sword16* mp, sword16* bp, + const sword16* v, int kp) +{ + int i; + + /* Transform bp. All of result used in calculation of mp. */ + for (i = 0; i < kp; ++i) { + kyber_ntt(bp + i * KYBER_N); + } + + /* Multiply private key by bp into mp polynomial. */ + kyber_pointwise_acc_mont(mp, priv, bp, kp); + /* Inverse transform mp. */ + kyber_invntt(mp); + /* Subtract errors (mp) out of v and reduce into mp. */ + for (i = 0; i < KYBER_N; ++i) { + sword16 t = v[i] - mp[i]; + mp[i] = KYBER_BARRETT_RED(t); + } +} + +/* Decapsulate message. + * + * @param [in] priv Private key vector of polynomials. + * @param [out] mp Message polynomial. + * @param [in] bp Vector of polynomials containing error. + * @param [in] v Encapsulated message polynomial. + * @param [in] kp Number of polynomials in vector. + */ +void kyber_decapsulate(const sword16* priv, sword16* mp, sword16* bp, + const sword16* v, int kp) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_decapsulate_avx2(priv, mp, bp, v, kp); + } + else +#endif + { + kyber_decapsulate_c(priv, mp, bp, v, kp); + } +} + +/******************************************************************************/ + +#ifdef USE_INTEL_SPEEDUP +#ifdef WOLFSSL_KYBER512 +/* Deterministically generate a matrix (or transpose) of uniform integers mod q. + * + * Seed used with XOF to generate random bytes. + * + * @param [out] a Matrix of uniform integers. + * @param [in] seed Bytes to seed XOF generation. + * @param [in] transposed Whether A or A^T is generated. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. Only possible when + * WOLFSSL_SMALL_STACK is defined. + */ +static int kyber_gen_matrix_k2_avx2(sword16* a, byte* seed, int transposed) +{ + int i; + byte rand[4 * GEN_MATRIX_SIZE + 2]; + word64 state[25 * 4]; + unsigned int ctr0; + unsigned int ctr1; + unsigned int ctr2; + unsigned int ctr3; + byte* p; + + /* Loading 64 bits, only using 48 bits. Loading 2 bytes more than used. */ + rand[4 * GEN_MATRIX_SIZE + 0] = 0xff; + rand[4 * GEN_MATRIX_SIZE + 1] = 0xff; + + if (!transposed) { + state[4*4 + 0] = 0x1f0000 + 0x000; + state[4*4 + 1] = 0x1f0000 + 0x001; + state[4*4 + 2] = 0x1f0000 + 0x100; + state[4*4 + 3] = 0x1f0000 + 0x101; + } + else { + state[4*4 + 0] = 0x1f0000 + 0x000; + state[4*4 + 1] = 0x1f0000 + 0x100; + state[4*4 + 2] = 0x1f0000 + 0x001; + state[4*4 + 3] = 0x1f0000 + 0x101; + } + + kyber_sha3_128_blocksx4_seed_avx2(state, seed); + kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE, + rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE, + rand + 3 * GEN_MATRIX_SIZE); + for (i = SHA3_128_BYTES; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) { + kyber_sha3_blocksx4_avx2(state); + kyber_redistribute_21_rand_avx2(state, rand + i + 0 * GEN_MATRIX_SIZE, + rand + i + 1 * GEN_MATRIX_SIZE, rand + i + 2 * GEN_MATRIX_SIZE, + rand + i + 3 * GEN_MATRIX_SIZE); + } + + /* Sample random bytes to create a polynomial. */ + p = rand; + ctr0 = kyber_rej_uniform_n_avx2(a + 0 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr1 = kyber_rej_uniform_n_avx2(a + 1 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr2 = kyber_rej_uniform_n_avx2(a + 2 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr3 = kyber_rej_uniform_n_avx2(a + 3 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + /* Create more blocks if too many rejected. */ + while ((ctr0 < KYBER_N) || (ctr1 < KYBER_N) || (ctr2 < KYBER_N) || + (ctr3 < KYBER_N)) { + kyber_sha3_blocksx4_avx2(state); + kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE, + rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE, + rand + 3 * GEN_MATRIX_SIZE); + + p = rand; + ctr0 += kyber_rej_uniform_avx2(a + 0 * KYBER_N + ctr0, KYBER_N - ctr0, + p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr1 += kyber_rej_uniform_avx2(a + 1 * KYBER_N + ctr1, KYBER_N - ctr1, + p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr2 += kyber_rej_uniform_avx2(a + 2 * KYBER_N + ctr2, KYBER_N - ctr2, + p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr3 += kyber_rej_uniform_avx2(a + 3 * KYBER_N + ctr3, KYBER_N - ctr3, + p, XOF_BLOCK_SIZE); + } + + return 0; +} +#endif + +#ifdef WOLFSSL_KYBER768 +/* Deterministically generate a matrix (or transpose) of uniform integers mod q. + * + * Seed used with XOF to generate random bytes. + * + * @param [out] a Matrix of uniform integers. + * @param [in] seed Bytes to seed XOF generation. + * @param [in] transposed Whether A or A^T is generated. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. Only possible when + * WOLFSSL_SMALL_STACK is defined. + */ +static int kyber_gen_matrix_k3_avx2(sword16* a, byte* seed, int transposed) +{ + int i; + int k; + byte rand[4 * GEN_MATRIX_SIZE + 2]; + word64 state[25 * 4]; + unsigned int ctr0; + unsigned int ctr1; + unsigned int ctr2; + unsigned int ctr3; + byte* p; + + /* Loading 64 bits, only using 48 bits. Loading 2 bytes more than used. */ + rand[4 * GEN_MATRIX_SIZE + 0] = 0xff; + rand[4 * GEN_MATRIX_SIZE + 1] = 0xff; + + for (k = 0; k < 2; k++) { + for (i = 0; i < 4; i++) { + if (!transposed) { + state[4*4 + i] = 0x1f0000 + (((k*4+i)/3) << 8) + ((k*4+i)%3); + } + else { + state[4*4 + i] = 0x1f0000 + (((k*4+i)%3) << 8) + ((k*4+i)/3); + } + } + + kyber_sha3_128_blocksx4_seed_avx2(state, seed); + kyber_redistribute_21_rand_avx2(state, + rand + 0 * GEN_MATRIX_SIZE, rand + 1 * GEN_MATRIX_SIZE, + rand + 2 * GEN_MATRIX_SIZE, rand + 3 * GEN_MATRIX_SIZE); + for (i = SHA3_128_BYTES; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) { + kyber_sha3_blocksx4_avx2(state); + kyber_redistribute_21_rand_avx2(state, + rand + i + 0 * GEN_MATRIX_SIZE, rand + i + 1 * GEN_MATRIX_SIZE, + rand + i + 2 * GEN_MATRIX_SIZE, rand + i + 3 * GEN_MATRIX_SIZE); + } + + /* Sample random bytes to create a polynomial. */ + p = rand; + ctr0 = kyber_rej_uniform_n_avx2(a + 0 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr1 = kyber_rej_uniform_n_avx2(a + 1 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr2 = kyber_rej_uniform_n_avx2(a + 2 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr3 = kyber_rej_uniform_n_avx2(a + 3 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + /* Create more blocks if too many rejected. */ + while ((ctr0 < KYBER_N) || (ctr1 < KYBER_N) || (ctr2 < KYBER_N) || + (ctr3 < KYBER_N)) { + kyber_sha3_blocksx4_avx2(state); + kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE, + rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE, + rand + 3 * GEN_MATRIX_SIZE); + + p = rand; + ctr0 += kyber_rej_uniform_avx2(a + 0 * KYBER_N + ctr0, + KYBER_N - ctr0, p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr1 += kyber_rej_uniform_avx2(a + 1 * KYBER_N + ctr1, + KYBER_N - ctr1, p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr2 += kyber_rej_uniform_avx2(a + 2 * KYBER_N + ctr2, + KYBER_N - ctr2, p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr3 += kyber_rej_uniform_avx2(a + 3 * KYBER_N + ctr3, + KYBER_N - ctr3, p, XOF_BLOCK_SIZE); + } + + a += 4 * KYBER_N; + } + + state[0] = ((word64*)seed)[0]; + state[1] = ((word64*)seed)[1]; + state[2] = ((word64*)seed)[2]; + state[3] = ((word64*)seed)[3]; + /* Transposed value same as not. */ + state[4] = 0x1f0000 + (2 << 8) + 2; + XMEMSET(state + 5, 0, sizeof(*state) * (25 - 5)); + state[20] = 0x8000000000000000UL; + for (i = 0; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) { + if (IS_INTEL_BMI2(cpuid_flags)) { + sha3_block_bmi2(state); + } + else if (IS_INTEL_AVX2(cpuid_flags)) { + sha3_block_avx2(state); + } + else { + BlockSha3(state); + } + XMEMCPY(rand + i, state, SHA3_128_BYTES); + } + ctr0 = kyber_rej_uniform_n_avx2(a, KYBER_N, rand, GEN_MATRIX_SIZE); + while (ctr0 < KYBER_N) { + if (IS_INTEL_BMI2(cpuid_flags)) { + sha3_block_bmi2(state); + } + else if (IS_INTEL_AVX2(cpuid_flags)) { + sha3_block_avx2(state); + } + else { + BlockSha3(state); + } + XMEMCPY(rand, state, SHA3_128_BYTES); + ctr0 += kyber_rej_uniform_avx2(a + ctr0, KYBER_N - ctr0, rand, + XOF_BLOCK_SIZE); + } + + return 0; +} +#endif +#ifdef WOLFSSL_KYBER1024 +/* Deterministically generate a matrix (or transpose) of uniform integers mod q. + * + * Seed used with XOF to generate random bytes. + * + * @param [out] a Matrix of uniform integers. + * @param [in] seed Bytes to seed XOF generation. + * @param [in] transposed Whether A or A^T is generated. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. Only possible when + * WOLFSSL_SMALL_STACK is defined. + */ +static int kyber_gen_matrix_k4_avx2(sword16* a, byte* seed, int transposed) +{ + int i; + int k; + byte rand[4 * GEN_MATRIX_SIZE + 2]; + word64 state[25 * 4]; + unsigned int ctr0; + unsigned int ctr1; + unsigned int ctr2; + unsigned int ctr3; + byte* p; + + /* Loading 64 bits, only using 48 bits. Loading 2 bytes more than used. */ + rand[4 * GEN_MATRIX_SIZE + 0] = 0xff; + rand[4 * GEN_MATRIX_SIZE + 1] = 0xff; + + for (k = 0; k < 4; k++) { + for (i = 0; i < 4; i++) { + if (!transposed) { + state[4*4 + i] = 0x1f0000 + (k << 8) + i; + } + else { + state[4*4 + i] = 0x1f0000 + (i << 8) + k; + } + } + + kyber_sha3_128_blocksx4_seed_avx2(state, seed); + kyber_redistribute_21_rand_avx2(state, + rand + 0 * GEN_MATRIX_SIZE, rand + 1 * GEN_MATRIX_SIZE, + rand + 2 * GEN_MATRIX_SIZE, rand + 3 * GEN_MATRIX_SIZE); + for (i = SHA3_128_BYTES; i < GEN_MATRIX_SIZE; i += SHA3_128_BYTES) { + kyber_sha3_blocksx4_avx2(state); + kyber_redistribute_21_rand_avx2(state, + rand + i + 0 * GEN_MATRIX_SIZE, rand + i + 1 * GEN_MATRIX_SIZE, + rand + i + 2 * GEN_MATRIX_SIZE, rand + i + 3 * GEN_MATRIX_SIZE); + } + + /* Sample random bytes to create a polynomial. */ + p = rand; + ctr0 = kyber_rej_uniform_n_avx2(a + 0 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr1 = kyber_rej_uniform_n_avx2(a + 1 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr2 = kyber_rej_uniform_n_avx2(a + 2 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + p += GEN_MATRIX_SIZE; + ctr3 = kyber_rej_uniform_n_avx2(a + 3 * KYBER_N, KYBER_N, p, + GEN_MATRIX_SIZE); + /* Create more blocks if too many rejected. */ + while ((ctr0 < KYBER_N) || (ctr1 < KYBER_N) || (ctr2 < KYBER_N) || + (ctr3 < KYBER_N)) { + kyber_sha3_blocksx4_avx2(state); + kyber_redistribute_21_rand_avx2(state, rand + 0 * GEN_MATRIX_SIZE, + rand + 1 * GEN_MATRIX_SIZE, rand + 2 * GEN_MATRIX_SIZE, + rand + 3 * GEN_MATRIX_SIZE); + + p = rand; + ctr0 += kyber_rej_uniform_avx2(a + 0 * KYBER_N + ctr0, + KYBER_N - ctr0, p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr1 += kyber_rej_uniform_avx2(a + 1 * KYBER_N + ctr1, + KYBER_N - ctr1, p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr2 += kyber_rej_uniform_avx2(a + 2 * KYBER_N + ctr2, + KYBER_N - ctr2, p, XOF_BLOCK_SIZE); + p += GEN_MATRIX_SIZE; + ctr3 += kyber_rej_uniform_avx2(a + 3 * KYBER_N + ctr3, + KYBER_N - ctr3, p, XOF_BLOCK_SIZE); + } + + a += 4 * KYBER_N; + } + + return 0; +} +#endif /* KYBER1024 */ +#endif /* USE_INTEL_SPEEDUP */ + +/* Absorb the seed data for squeezing out pseudo-random data. + * + * @param [in, out] shake128 SHAKE-128 object. + * @param [in] seed Data to absorb. + * @param [in] len Length of data to absorb in bytes. + * @return 0 on success always. + */ +static int kyber_xof_absorb(wc_Shake* shake128, byte* seed, int len) +{ + int ret; + + ret = wc_InitShake128(shake128, NULL, INVALID_DEVID); + if (ret == 0) { + ret = wc_Shake128_Absorb(shake128, seed, len); + } + + return ret; +} + +/* Squeeze the state to produce pseudo-random data. + * + * @param [in, out] shake128 SHAKE-128 object. + * @param [out] out Buffer to write to. + * @param [in] blocks Number of blocks to write. + * @return 0 on success always. + */ +static int kyber_xof_squeezeblocks(wc_Shake* shake128, byte* out, int blocks) +{ + return wc_Shake128_SqueezeBlocks(shake128, out, blocks); +} + +/* Initialize SHAKE-256 object. + * + * @param [in, out] shake256 SHAKE-256 object. + */ +void kyber_prf_init(wc_Shake* prf) +{ + XMEMSET(prf->s, 0, sizeof(prf->s)); +} + +/* New/Initialize SHAKE-256 object. + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [in] heap Dynamic memory allocator hint. + * @param [in] devId Device id. + * @return 0 on success always. + */ +int kyber_prf_new(wc_Shake* prf, void* heap, int devId) +{ + return wc_InitShake256(prf, heap, devId); +} + +/* Free SHAKE-256 object. + * + * @param [in, out] shake256 SHAKE-256 object. + */ +void kyber_prf_free(wc_Shake* prf) +{ + wc_Shake256_Free(prf); +} + +/* Create pseudo-random data from the key using SHAKE-256. + * + * @param [in, out] shake256 SHAKE-256 object. + * @param [out] out Buffer to write to. + * @param [in] outLen Number of bytes to write. + * @param [in] key Data to derive from. Must be KYBER_SYM_SZ + 1 + * bytes in length. + * @return 0 on success always. + */ +static int kyber_prf(wc_Shake* shake256, byte* out, unsigned int outLen, + const byte* key) +{ +#ifdef USE_INTEL_SPEEDUP + int i; + word64 state[25]; + + (void)shake256; + + for (i = 0; i < KYBER_SYM_SZ / 8; i++) { + state[i] = ((word64*)key)[i]; + } + state[KYBER_SYM_SZ / 8] = 0x1f00 | key[KYBER_SYM_SZ]; + XMEMSET(state + KYBER_SYM_SZ / 8 + 1, 0, + (25 - KYBER_SYM_SZ / 8 - 1) * sizeof(word64)); + state[WC_SHA3_256_COUNT - 1] = 0x8000000000000000UL; + + if (IS_INTEL_BMI2(cpuid_flags)) { + sha3_block_bmi2(state); + } + else if (IS_INTEL_AVX2(cpuid_flags)) { + sha3_block_avx2(state); + } + else { + BlockSha3(state); + } + XMEMCPY(out, state, outLen); + + return 0; +#else + int ret; + + ret = wc_Shake256_Update(shake256, key, KYBER_SYM_SZ + 1); + if (ret == 0) { + ret = wc_Shake256_Final(shake256, out, outLen); + } + + return ret; +#endif +} + +#ifdef USE_INTEL_SPEEDUP +/* Create pseudo-random key from the seed using SHAKE-256. + * + * @param [in] seed Data to derive from. + * @param [in] seedLen Length of data to derive from in bytes. + * @param [out] out Buffer to write to. + * @param [in] outLen Number of bytes to derive. + * @return 0 on success always. + */ +int kyber_kdf(byte* seed, int seedLen, byte* out, int outLen) +{ + word64 state[25]; + int i; + int len64 = seedLen / 8; + + for (i = 0; i < len64; i++) { + state[i] = ((word64*)seed)[i]; + } + state[len64] = 0x1f; + XMEMSET(state + len64 + 1, 0, (25 - len64 - 1) * sizeof(word64)); + state[WC_SHA3_256_COUNT - 1] = 0x8000000000000000UL; + + if (IS_INTEL_BMI2(cpuid_flags)) { + sha3_block_bmi2(state); + } + else if (IS_INTEL_AVX2(cpuid_flags)) { + sha3_block_avx2(state); + } + else { + BlockSha3(state); + } + XMEMCPY(out, state, outLen); + + return 0; +} +#endif + +/* Rejection sampling on uniform random bytes to generate uniform random + * integers mod q. + * + * @param [out] p Uniform random integers mod q. + * @param [in] len Maximum number of integers. + * @param [in] r Uniform random bytes buffer. + * @param [in] rLen Length of random data in buffer. + * @return Number of integers sampled. + */ +static unsigned int kyber_rej_uniform_c(sword16* p, unsigned int len, + const byte* r, unsigned int rLen) +{ + unsigned int i; + unsigned int j; + + /* Keep sampling until maximum number of integers reached or buffer used up. + */ + for (i = 0, j = 0; (i < len) && (j <= rLen - 3); j += 3) { + /* Use 24 bits (3 bytes) as two 12 bits integers. */ + sword16 v0 = ((r[0] >> 0) | ((word16)r[1] << 8)) & 0xFFF; + sword16 v1 = ((r[1] >> 4) | ((word16)r[2] << 4)) & 0xFFF; + + /* Reject first 12-bit integer if greater than or equal to q. */ + if (v0 < KYBER_Q) { + p[i++] = v0; + } + /* Check second if we don't have enough integers yet. + * Reject second 12-bit integer if greater than or equal to q. */ + if ((i < len) && (v1 < KYBER_Q)) { + p[i++] = v1; + } + + /* Move over used bytes. */ + r += 3; + } + + return i; +} + +/* Deterministically generate a matrix (or transpose) of uniform integers mod q. + * + * Seed used with XOF to generate random bytes. + * + * @param [in] prf XOF object. + * @param [out] a Matrix of uniform integers. + * @param [in] kp Number of dimensions. kp x kp polynomials. + * @param [in] seed Bytes to seed XOF generation. + * @param [in] transposed Whether A or A^T is generated. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. Only possible when + * WOLFSSL_SMALL_STACK is defined. + */ +static int kyber_gen_matrix_c(KYBER_PRF_T* prf, sword16* a, int kp, byte* seed, + int transposed) +{ +#ifdef WOLFSSL_SMALL_STACK + byte* rand; +#else + byte rand[GEN_MATRIX_SIZE + 2]; +#endif + byte extSeed[KYBER_SYM_SZ + 2]; + int ret = 0; + int i; + + XMEMCPY(extSeed, seed, KYBER_SYM_SZ); + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate large amount of memory to hold random bytes to be samples. */ + rand = (byte*)XMALLOC(GEN_MATRIX_SIZE + 2, NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (rand == NULL) { + ret = MEMORY_E; + } +#endif + + /* Generate each vector of polynomials. */ + for (i = 0; (ret == 0) && (i < kp); i++, a += kp * KYBER_N) { + int j; + /* Generate each polynomial in vector from seed with indices. */ + for (j = 0; (ret == 0) && (j < kp); j++) { + if (transposed) { + extSeed[KYBER_SYM_SZ + 0] = i; + extSeed[KYBER_SYM_SZ + 1] = j; + } + else { + extSeed[KYBER_SYM_SZ + 0] = j; + extSeed[KYBER_SYM_SZ + 1] = i; + } + /* Absorb the index specific seed. */ + ret = kyber_xof_absorb(prf, extSeed, sizeof(extSeed)); + if (ret == 0) { + /* Create out based on the seed. */ + ret = kyber_xof_squeezeblocks(prf, rand, GEN_MATRIX_NBLOCKS); + } + if (ret == 0) { + #if (GEN_MATRIX_SIZE % 3) != 0 + unsigned int randLen; + #endif + unsigned int ctr; + + /* Sample random bytes to create a polynomial. */ + ctr = kyber_rej_uniform_c(a + j * KYBER_N, KYBER_N, rand, + GEN_MATRIX_SIZE); + /* Create more blocks if too many rejected. */ + #if (GEN_MATRIX_SIZE % 3) != 0 + randLen = GEN_MATRIX_SIZE; + while (ctr < KYBER_N) { + int off = randLen % 3; + int k; + for (k = 0; k < off; k++) { + rand[k] = rand[randLen - off + k]; + } + kyber_xof_squeezeblocks(prf, rand + off, 1); + randLen = off + XOF_BLOCK_SIZE; + ctr += kyber_rej_uniform_c(a + j * KYBER_N + ctr, + KYBER_N - ctr, rand, randLen); + } + #else + while (ctr < KYBER_N) { + kyber_xof_squeezeblocks(prf, rand, 1); + ctr += kyber_rej_uniform_c(a + j * KYBER_N + ctr, + KYBER_N - ctr, rand, XOF_BLOCK_SIZE); + } + #endif + } + } + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of temporary buffer. */ + XFREE(rand, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +/* Deterministically generate a matrix (or transpose) of uniform integers mod q. + * + * Seed used with XOF to generate random bytes. + * + * @param [in] prf XOF object. + * @param [out] a Matrix of uniform integers. + * @param [in] kp Number of dimensions. kp x kp polynomials. + * @param [in] seed Bytes to seed XOF generation. + * @param [in] transposed Whether A or A^T is generated. + * @return 0 on success. + * @return MEMORY_E when dynamic memory allocation fails. Only possible when + * WOLFSSL_SMALL_STACK is defined. + */ +int kyber_gen_matrix(KYBER_PRF_T* prf, sword16* a, int kp, byte* seed, + int transposed) +{ + int ret; + +#ifdef WOLFSSL_KYBER512 + if (kp == KYBER512_K) { + #ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + ret = kyber_gen_matrix_k2_avx2(a, seed, transposed); + } + else + #endif + { + ret = kyber_gen_matrix_c(prf, a, KYBER512_K, seed, transposed); + } + } + else +#endif +#ifdef WOLFSSL_KYBER768 + if (kp == KYBER768_K) { + #ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + ret = kyber_gen_matrix_k3_avx2(a, seed, transposed); + } + else + #endif + { + ret = kyber_gen_matrix_c(prf, a, KYBER768_K, seed, transposed); + } + } + else +#endif +#ifdef WOLFSSL_KYBER1024 + if (kp == KYBER1024_K) { + #ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + ret = kyber_gen_matrix_k4_avx2(a, seed, transposed); + } + else + #endif + { + ret = kyber_gen_matrix_c(prf, a, KYBER1024_K, seed, transposed); + } + } + else +#endif + { + ret = BAD_STATE_E; + } + + return ret; +} + +/******************************************************************************/ + +/* Subtract one 2 bit value from another out of a larger number. + * + * @param [in] d Value containing sequential 2 bit values. + * @param [in] i Start index of the two values in 2 bits each. + * @return Difference of the two values with range 0..2. + */ +#define ETA2_SUB(d, i) \ + (((sword16)(((d) >> ((i) * 4 + 0)) & 0x3)) - \ + ((sword16)(((d) >> ((i) * 4 + 2)) & 0x3))) + +/* Compute polynomial with coefficients distributed according to a centered + * binomial distribution with parameter eta2 from uniform random bytes. + * + * @param [out] p Polynomial computed. + * @param [in] r Random bytes. + */ +static void kyber_cbd_eta2(sword16* p, const byte* r) +{ + unsigned int i; + +#ifndef WORD64_AVAILABLE + /* Calculate eight integer coefficients at a time. */ + for (i = 0; i < KYBER_N; i += 8) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + #endif + /* Take the next 4 bytes, little endian, as a 32 bit value. */ + #ifdef BIG_ENDIAN_ORDER + word32 t = ByteReverseWord32(*(word32*)r); + #else + word32 t = *(word32*)r; + #endif + word32 d; + /* Add second bits to first. */ + d = (t >> 0) & 0x55555555; + d += (t >> 1) & 0x55555555; + /* Values 0, 1 or 2 in consecutive 2 bits. + * 0 - 1/4, 1 - 2/4, 2 - 1/4. */ + + #ifdef WOLFSSL_KYBER_SMALL + for (j = 0; j < 8; j++) { + p[i + j] = ETA2_SUB(d, j); + } + #else + p[i + 0] = ETA2_SUB(d, 0); + p[i + 1] = ETA2_SUB(d, 1); + p[i + 2] = ETA2_SUB(d, 2); + p[i + 3] = ETA2_SUB(d, 3); + p[i + 4] = ETA2_SUB(d, 4); + p[i + 5] = ETA2_SUB(d, 5); + p[i + 6] = ETA2_SUB(d, 6); + p[i + 7] = ETA2_SUB(d, 7); + #endif + /* -2 - 1/16, -1 - 4/16, 0 - 6/16, 1 - 4/16, 2 - 1/16 */ + + /* Move over used bytes. */ + r += 4; + } +#else + /* Calculate sixteen integer coefficients at a time. */ + for (i = 0; i < KYBER_N; i += 16) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + #endif + /* Take the next 8 bytes, little endian, as a 64 bit value. */ + #ifdef BIG_ENDIAN_ORDER + word64 t = ByteReverseWord64(*(word64*)r); + #else + word64 t = *(word64*)r; + #endif + word64 d; + /* Add second bits to first. */ + d = (t >> 0) & 0x5555555555555555L; + d += (t >> 1) & 0x5555555555555555L; + /* Values 0, 1 or 2 in consecutive 2 bits. + * 0 - 1/4, 1 - 2/4, 2 - 1/4. */ + + #ifdef WOLFSSL_KYBER_SMALL + for (j = 0; j < 16; j++) { + p[i + j] = ETA2_SUB(d, j); + } + #else + p[i + 0] = ETA2_SUB(d, 0); + p[i + 1] = ETA2_SUB(d, 1); + p[i + 2] = ETA2_SUB(d, 2); + p[i + 3] = ETA2_SUB(d, 3); + p[i + 4] = ETA2_SUB(d, 4); + p[i + 5] = ETA2_SUB(d, 5); + p[i + 6] = ETA2_SUB(d, 6); + p[i + 7] = ETA2_SUB(d, 7); + p[i + 8] = ETA2_SUB(d, 8); + p[i + 9] = ETA2_SUB(d, 9); + p[i + 10] = ETA2_SUB(d, 10); + p[i + 11] = ETA2_SUB(d, 11); + p[i + 12] = ETA2_SUB(d, 12); + p[i + 13] = ETA2_SUB(d, 13); + p[i + 14] = ETA2_SUB(d, 14); + p[i + 15] = ETA2_SUB(d, 15); + #endif + /* -2 - 1/16, -1 - 4/16, 0 - 6/16, 1 - 4/16, 2 - 1/16 */ + + /* Move over used bytes. */ + r += 8; + } +#endif +} + +#ifdef WOLFSSL_KYBER512 +/* Subtract one 3 bit value from another out of a larger number. + * + * @param [in] d Value containing sequential 3 bit values. + * @param [in] i Start index of the two values in 3 bits each. + * @return Difference of the two values with range 0..3. + */ +#define ETA3_SUB(d, i) \ + (((sword16)(((d) >> ((i) * 6 + 0)) & 0x7)) - \ + ((sword16)(((d) >> ((i) * 6 + 3)) & 0x7))) + +/* Compute polynomial with coefficients distributed according to a centered + * binomial distribution with parameter eta3 from uniform random bytes. + * + * @param [out] p Polynomial computed. + * @param [in] r Random bytes. + */ +static void kyber_cbd_eta3(sword16* p, const byte* r) +{ + unsigned int i; + +#if defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_KYBER_NO_LARGE_CODE) || \ + defined(BIG_ENDIAN_ORDER) +#ifndef WORD64_AVAILABLE + /* Calculate four integer coefficients at a time. */ + for (i = 0; i < KYBER_N; i += 4) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + #endif + /* Take the next 3 bytes, little endian, as a 24 bit value. */ + word32 t = (((word32)(r[0])) << 0) | + (((word32)(r[1])) << 8) | + (((word32)(r[2])) << 16); + word32 d; + /* Add second and third bits to first. */ + d = (t >> 0) & 0x00249249; + d += (t >> 1) & 0x00249249; + d += (t >> 2) & 0x00249249; + /* Values 0, 1, 2 or 3 in consecutive 3 bits. + * 0 - 1/8, 1 - 3/8, 2 - 3/8, 3 - 1/8. */ + + #ifdef WOLFSSL_KYBER_SMALL + for (j = 0; j < 4; j++) { + p[i + j] = ETA3_SUB(d, j); + } + #else + p[i + 0] = ETA3_SUB(d, 0); + p[i + 1] = ETA3_SUB(d, 1); + p[i + 2] = ETA3_SUB(d, 2); + p[i + 3] = ETA3_SUB(d, 3); + #endif + /* -3-1/64, -2-6/64, -1-15/64, 0-20/64, 1-15/64, 2-6/64, 3-1/64 */ + + /* Move over used bytes. */ + r += 3; + } +#else + /* Calculate eight integer coefficients at a time. */ + for (i = 0; i < KYBER_N; i += 8) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + #endif + /* Take the next 6 bytes, little endian, as a 48 bit value. */ + word64 t = (((word64)(r[0])) << 0) | + (((word64)(r[1])) << 8) | + (((word64)(r[2])) << 16) | + (((word64)(r[3])) << 24) | + (((word64)(r[4])) << 32) | + (((word64)(r[5])) << 40); + word64 d; + /* Add second and third bits to first. */ + d = (t >> 0) & 0x0000249249249249L; + d += (t >> 1) & 0x0000249249249249L; + d += (t >> 2) & 0x0000249249249249L; + /* Values 0, 1, 2 or 3 in consecutive 3 bits. + * 0 - 1/8, 1 - 3/8, 2 - 3/8, 3 - 1/8. */ + + #ifdef WOLFSSL_KYBER_SMALL + for (j = 0; j < 8; j++) { + p[i + j] = ETA3_SUB(d, j); + } + #else + p[i + 0] = ETA3_SUB(d, 0); + p[i + 1] = ETA3_SUB(d, 1); + p[i + 2] = ETA3_SUB(d, 2); + p[i + 3] = ETA3_SUB(d, 3); + p[i + 4] = ETA3_SUB(d, 4); + p[i + 5] = ETA3_SUB(d, 5); + p[i + 6] = ETA3_SUB(d, 6); + p[i + 7] = ETA3_SUB(d, 7); + #endif + /* -3-1/64, -2-6/64, -1-15/64, 0-20/64, 1-15/64, 2-6/64, 3-1/64 */ + + /* Move over used bytes. */ + r += 6; + } +#endif /* WORD64_AVAILABLE */ +#else + /* Calculate eight integer coefficients at a time. */ + for (i = 0; i < KYBER_N; i += 16) { + const word32* r32 = (const word32*)r; + /* Take the next 12 bytes, little endian, as 24 bit values. */ + word32 t0 = r32[0] & 0xffffff; + word32 t1 = ((r32[0] >> 24) | (r32[1] << 8)) & 0xffffff; + word32 t2 = ((r32[1] >> 16) | (r32[2] << 16)) & 0xffffff; + word32 t3 = r32[2] >> 8 ; + word32 d0; + word32 d1; + word32 d2; + word32 d3; + + /* Add second and third bits to first. */ + d0 = (t0 >> 0) & 0x00249249; + d0 += (t0 >> 1) & 0x00249249; + d0 += (t0 >> 2) & 0x00249249; + d1 = (t1 >> 0) & 0x00249249; + d1 += (t1 >> 1) & 0x00249249; + d1 += (t1 >> 2) & 0x00249249; + d2 = (t2 >> 0) & 0x00249249; + d2 += (t2 >> 1) & 0x00249249; + d2 += (t2 >> 2) & 0x00249249; + d3 = (t3 >> 0) & 0x00249249; + d3 += (t3 >> 1) & 0x00249249; + d3 += (t3 >> 2) & 0x00249249; + /* Values 0, 1, 2 or 3 in consecutive 3 bits. + * 0 - 1/8, 1 - 3/8, 2 - 3/8, 3 - 1/8. */ + + p[i + 0] = ETA3_SUB(d0, 0); + p[i + 1] = ETA3_SUB(d0, 1); + p[i + 2] = ETA3_SUB(d0, 2); + p[i + 3] = ETA3_SUB(d0, 3); + p[i + 4] = ETA3_SUB(d1, 0); + p[i + 5] = ETA3_SUB(d1, 1); + p[i + 6] = ETA3_SUB(d1, 2); + p[i + 7] = ETA3_SUB(d1, 3); + p[i + 8] = ETA3_SUB(d2, 0); + p[i + 9] = ETA3_SUB(d2, 1); + p[i + 10] = ETA3_SUB(d2, 2); + p[i + 11] = ETA3_SUB(d2, 3); + p[i + 12] = ETA3_SUB(d3, 0); + p[i + 13] = ETA3_SUB(d3, 1); + p[i + 14] = ETA3_SUB(d3, 2); + p[i + 15] = ETA3_SUB(d3, 3); + /* -3-1/64, -2-6/64, -1-15/64, 0-20/64, 1-15/64, 2-6/64, 3-1/64 */ + + /* Move over used bytes. */ + r += 12; + } +#endif /* WOLFSSL_SMALL_STACK || WOLFSSL_KYBER_NO_LARGE_CODE || BIG_ENDIAN_ORDER */ +} +#endif + +/* Get noise/error by calculating random bytes and sampling to a binomial + * distribution. + * + * @param [in, out] prf Psuedo-random function object. + * @param [out] p Polynomial. + * @param [in] seed Seed to use when calculating random. + * @param [in] eta1 Size of noise/error integers. + * @return 0 on success. + */ +static int kyber_get_noise_eta1_c(KYBER_PRF_T* prf, sword16* p, + const byte* seed, byte eta1) +{ + int ret; + + (void)eta1; + +#ifdef WOLFSSL_KYBER512 + if (eta1 == KYBER_CBD_ETA3) { + byte rand[ETA3_RAND_SIZE]; + + /* Calculate random bytes from seed with PRF. */ + ret = kyber_prf(prf, rand, sizeof(rand), seed); + if (ret == 0) { + /* Sample for values in range -3..3 from 3 bits of random. */ + kyber_cbd_eta3(p, rand); + } + } + else +#endif + { + byte rand[ETA2_RAND_SIZE]; + + /* Calculate random bytes from seed with PRF. */ + ret = kyber_prf(prf, rand, sizeof(rand), seed); + if (ret == 0) { + /* Sample for values in range -2..2 from 2 bits of random. */ + kyber_cbd_eta2(p, rand); + } + } + + return ret; +} + +/* Get noise/error by calculating random bytes and sampling to a binomial + * distribution. Values -2..2 + * + * @param [in, out] prf Psuedo-random function object. + * @param [out] p Polynomial. + * @param [in] seed Seed to use when calculating random. + * @return 0 on success. + */ +static int kyber_get_noise_eta2_c(KYBER_PRF_T* prf, sword16* p, + const byte* seed) +{ + int ret; + byte rand[ETA2_RAND_SIZE]; + + /* Calculate random bytes from seed with PRF. */ + ret = kyber_prf(prf, rand, sizeof(rand), seed); + if (ret == 0) { + kyber_cbd_eta2(p, rand); + } + + return ret; +} + +#ifdef USE_INTEL_SPEEDUP +#define PRF_RAND_SZ (2 * SHA3_256_BYTES) + +#if defined(WOLFSSL_KYBER768) || defined(WOLFSSL_KYBER1024) +/* Get the noise/error by calculating random bytes. + * + * @param [out] rand Random number byte array. + * @param [in] seed Seed to generate random from. + * @param [in] o Offset of seed count. + */ +static void kyber_get_noise_x4_eta2_avx2(byte* rand, byte* seed, byte o) +{ + int i; + word64 state[25 * 4]; + + for (i = 0; i < 4; i++) { + state[4*4 + i] = 0x1f00 + i + o; + } + + kyber_sha3_256_blocksx4_seed_avx2(state, seed); + kyber_redistribute_16_rand_avx2(state, rand + 0 * ETA2_RAND_SIZE, + rand + 1 * ETA2_RAND_SIZE, rand + 2 * ETA2_RAND_SIZE, + rand + 3 * ETA2_RAND_SIZE); +} +#endif + +#ifdef WOLFSSL_KYBER512 +/* Get the noise/error by calculating random bytes. + * + * @param [out] rand Random number byte array. + * @param [in] seed Seed to generate random from. + * @param [in] o Offset of seed count. + */ +static void kyber_get_noise_x4_eta3_avx2(byte* rand, byte* seed) +{ + word64 state[25 * 4]; + int i; + + state[4*4 + 0] = 0x1f00 + 0; + state[4*4 + 1] = 0x1f00 + 1; + state[4*4 + 2] = 0x1f00 + 2; + state[4*4 + 3] = 0x1f00 + 3; + + kyber_sha3_256_blocksx4_seed_avx2(state, seed); + kyber_redistribute_17_rand_avx2(state, rand + 0 * PRF_RAND_SZ, + rand + 1 * PRF_RAND_SZ, rand + 2 * PRF_RAND_SZ, + rand + 3 * PRF_RAND_SZ); + i = SHA3_256_BYTES; + kyber_sha3_blocksx4_avx2(state); + kyber_redistribute_8_rand_avx2(state, rand + i + 0 * PRF_RAND_SZ, + rand + i + 1 * PRF_RAND_SZ, rand + i + 2 * PRF_RAND_SZ, + rand + i + 3 * PRF_RAND_SZ); +} + +/* Get noise/error by calculating random bytes and sampling to a binomial + * distribution. Values -2..2 + * + * @param [in, out] prf Psuedo-random function object. + * @param [out] p Polynomial. + * @param [in] seed Seed to use when calculating random. + * @return 0 on success. + */ +static int kyber_get_noise_eta2_avx2(KYBER_PRF_T* prf, sword16* p, + const byte* seed) +{ + int ret; + byte rand[ETA2_RAND_SIZE]; + + /* Calculate random bytes from seed with PRF. */ + ret = kyber_prf(prf, rand, sizeof(rand), seed); + if (ret == 0) { + kyber_cbd_eta2_avx2(p, rand); + } + + return ret; +} + +/* Get the noise/error by calculating random bytes and sampling to a binomial + * distribution. + * + * @param [in, out] prf Psuedo-random function object. + * @param [out] vec1 First Vector of polynomials. + * @param [out] vec2 Second Vector of polynomials. + * @param [out] poly Polynomial. + * @param [in] seed Seed to use when calculating random. + * @return 0 on success. + */ +static int kyber_get_noise_k2_avx2(KYBER_PRF_T* prf, sword16* vec1, + sword16* vec2, sword16* poly, byte* seed) +{ + int ret = 0; + byte rand[4 * PRF_RAND_SZ]; + + kyber_get_noise_x4_eta3_avx2(rand, seed); + kyber_cbd_eta3_avx2(vec1 , rand + 0 * PRF_RAND_SZ); + kyber_cbd_eta3_avx2(vec1 + KYBER_N, rand + 1 * PRF_RAND_SZ); + if (poly == NULL) { + kyber_cbd_eta3_avx2(vec2 , rand + 2 * PRF_RAND_SZ); + kyber_cbd_eta3_avx2(vec2 + KYBER_N, rand + 3 * PRF_RAND_SZ); + } + else { + kyber_cbd_eta2_avx2(vec2 , rand + 2 * PRF_RAND_SZ); + kyber_cbd_eta2_avx2(vec2 + KYBER_N, rand + 3 * PRF_RAND_SZ); + + seed[KYBER_SYM_SZ] = 4; + ret = kyber_get_noise_eta2_avx2(prf, poly, seed); + } + + return ret; +} +#endif + +#ifdef WOLFSSL_KYBER768 +/* Get the noise/error by calculating random bytes and sampling to a binomial + * distribution. + * + * @param [out] vec1 First Vector of polynomials. + * @param [out] vec2 Second Vector of polynomials. + * @param [out] poly Polynomial. + * @param [in] seed Seed to use when calculating random. + * @return 0 on success. + */ +static int kyber_get_noise_k3_avx2(sword16* vec1, sword16* vec2, sword16* poly, + byte* seed) +{ + byte rand[4 * ETA2_RAND_SIZE]; + + kyber_get_noise_x4_eta2_avx2(rand, seed, 0); + kyber_cbd_eta2_avx2(vec1 , rand + 0 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec1 + 1 * KYBER_N, rand + 1 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec1 + 2 * KYBER_N, rand + 2 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec2 , rand + 3 * ETA2_RAND_SIZE); + kyber_get_noise_x4_eta2_avx2(rand, seed, 4); + kyber_cbd_eta2_avx2(vec2 + 1 * KYBER_N, rand + 0 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec2 + 2 * KYBER_N, rand + 1 * ETA2_RAND_SIZE); + if (poly != NULL) { + kyber_cbd_eta2_avx2(poly, rand + 2 * ETA2_RAND_SIZE); + } + + return 0; +} +#endif + +#ifdef WOLFSSL_KYBER1024 +/* Get the noise/error by calculating random bytes and sampling to a binomial + * distribution. + * + * @param [in, out] prf Psuedo-random function object. + * @param [out] vec1 First Vector of polynomials. + * @param [out] vec2 Second Vector of polynomials. + * @param [out] poly Polynomial. + * @param [in] seed Seed to use when calculating random. + * @return 0 on success. + */ +static int kyber_get_noise_k4_avx2(KYBER_PRF_T* prf, sword16* vec1, + sword16* vec2, sword16* poly, byte* seed) +{ + int ret = 0; + byte rand[4 * ETA2_RAND_SIZE]; + + (void)prf; + + kyber_get_noise_x4_eta2_avx2(rand, seed, 0); + kyber_cbd_eta2_avx2(vec1 , rand + 0 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec1 + 1 * KYBER_N, rand + 1 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec1 + 2 * KYBER_N, rand + 2 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec1 + 3 * KYBER_N, rand + 3 * ETA2_RAND_SIZE); + kyber_get_noise_x4_eta2_avx2(rand, seed, 4); + kyber_cbd_eta2_avx2(vec2 , rand + 0 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec2 + 1 * KYBER_N, rand + 1 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec2 + 2 * KYBER_N, rand + 2 * ETA2_RAND_SIZE); + kyber_cbd_eta2_avx2(vec2 + 3 * KYBER_N, rand + 3 * ETA2_RAND_SIZE); + if (poly != NULL) { + seed[KYBER_SYM_SZ] = 8; + ret = kyber_get_noise_eta2_c(prf, poly, seed); + } + + return ret; +} +#endif +#endif /* USE_INTEL_SPEEDUP */ + +/* Get the noise/error by calculating random bytes and sampling to a binomial + * distribution. + * + * @param [in, out] prf Psuedo-random function object. + * @param [in] kp Number of polynomials in vector. + * @param [out] vec1 First Vector of polynomials. + * @param [in] eta1 Size of noise/error integers with first vector. + * @param [out] vec2 Second Vector of polynomials. + * @param [in] eta2 Size of noise/error integers with second vector. + * @param [out] poly Polynomial. + * @param [in] seed Seed to use when calculating random. + * @return 0 on success. + */ +static int kyber_get_noise_c(KYBER_PRF_T* prf, int kp, sword16* vec1, int eta1, + sword16* vec2, int eta2, sword16* poly, byte* seed) +{ + int ret = 0; + int i; + + /* First noise generation has a seed with 0x00 appended. */ + seed[KYBER_SYM_SZ] = 0; + /* Generate noise as private key. */ + for (i = 0; (ret == 0) && (i < kp); i++) { + /* Generate noise for each dimension of vector. */ + ret = kyber_get_noise_eta1_c(prf, vec1 + i * KYBER_N, seed, eta1); + /* Increment value of appended byte. */ + seed[KYBER_SYM_SZ]++; + } + /* Generate noise for error. */ + for (i = 0; (ret == 0) && (i < kp); i++) { + /* Generate noise for each dimension of vector. */ + ret = kyber_get_noise_eta1_c(prf, vec2 + i * KYBER_N, seed, eta2); + /* Increment value of appended byte. */ + seed[KYBER_SYM_SZ]++; + } + if ((ret == 0) && (poly != NULL)) { + /* Generating random error polynomial. */ + ret = kyber_get_noise_eta2_c(prf, poly, seed); + } + + return ret; +} + +/* Get the noise/error by calculating random bytes and sampling to a binomial + * distribution. + * + * @param [in, out] prf Psuedo-random function object. + * @param [in] kp Number of polynomials in vector. + * @param [out] vec1 First Vector of polynomials. + * @param [out] vec2 Second Vector of polynomials. + * @param [out] poly Polynomial. + * @param [in] seed Seed to use when calculating random. + * @return 0 on success. + */ +int kyber_get_noise(KYBER_PRF_T* prf, int kp, sword16* vec1, + sword16* vec2, sword16* poly, byte* seed) +{ + int ret; + +#ifdef WOLFSSL_KYBER512 + if (kp == KYBER512_K) { + #ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + ret = kyber_get_noise_k2_avx2(prf, vec1, vec2, poly, seed); + } + else + #endif + if (poly == NULL) { + ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA3, vec2, + KYBER_CBD_ETA3, NULL, seed); + } + else { + ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA3, vec2, + KYBER_CBD_ETA2, poly, seed); + } + } + else +#endif +#ifdef WOLFSSL_KYBER768 + if (kp == KYBER768_K) { + #ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + ret = kyber_get_noise_k3_avx2(vec1, vec2, poly, seed); + } + else + #endif + { + ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA2, vec2, + KYBER_CBD_ETA2, poly, seed); + } + } + else +#endif +#ifdef WOLFSSL_KYBER1024 + if (kp == KYBER1024_K) { + #ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + ret = kyber_get_noise_k4_avx2(prf, vec1, vec2, poly, seed); + } + else + #endif + { + ret = kyber_get_noise_c(prf, kp, vec1, KYBER_CBD_ETA2, vec2, + KYBER_CBD_ETA2, poly, seed); + } + } + else +#endif + { + ret = BAD_STATE_E; + } + + return ret; +} + +/******************************************************************************/ + +/* Compare two byte arrays of equal size. + * + * @param [in] a First array to compare. + * @param [in] b Second array to compare. + * @param [in] sz Size of arrays in bytes. + * @return 0 on success. + * @return -1 on failure. + */ +static int kyber_cmp_c(const byte* a, const byte* b, int sz) +{ + int i; + byte r = 0; + + /* Constant time comparison of the encapsulated message and cipher text. */ + for (i = 0; i < sz; i++) { + r |= a[i] ^ b[i]; + } + return 0 - ((-(word32)r) >> 31); +} + +/* Compare two byte arrays of equal size. + * + * @param [in] a First array to compare. + * @param [in] b Second array to compare. + * @param [in] sz Size of arrays in bytes. + * @return 0 on success. + * @return -1 on failure. + */ +int kyber_cmp(const byte* a, const byte* b, int sz) +{ + int fail; + +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + fail = kyber_cmp_avx2(a, b, sz); + } + else +#endif + { + fail = kyber_cmp_c(a, b, sz); + } + + return fail; +} + +/******************************************************************************/ + +/* Conditional subtraction of q to each coefficient of a polynomial. + * + * @param [in, out] p Polynomial. + */ +static KYBER_NOINLINE void kyber_csubq_c(sword16* p) +{ + unsigned int i; + + for (i = 0; i < KYBER_N; ++i) { + sword16 t = p[i] - KYBER_Q; + /* When top bit set, -ve number - need to add q back. */ + p[i] = ((t >> 15) & KYBER_Q) + t; + } +} + +/******************************************************************************/ + +#if defined(CONV_WITH_DIV) || !defined(WORD64_AVAILABLE) + +/* Compress value. + * + * Uses div operator that may be slow. + * + * @param [in] v Vector of polynomials. + * @param [in] i Index of polynomial in vector. + * @param [in] j Index into polynomial. + * @param [in] k Offset from indices. + * @param [in] s Shift amount to apply to value being compressed. + * @param [in] m Mask to apply get the require number of bits. + * @return Compressed value. + */ +#define TO_COMP_WORD_VEC(v, i, j, k, s, m) \ + ((((word32)v[i * KYBER_N + j + k] << s) + KYBER_Q_HALF) / KYBER_Q) & m + +/* Compress value to 10 bits. + * + * Uses mul instead of div. + * + * @param [in] v Vector of polynomials. + * @param [in] i Index of polynomial in vector. + * @param [in] j Index into polynomial. + * @param [in] k Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_10(v, i, j, k) \ + TO_COMP_WORD_VEC(v, i, j, k, 10, 0x3ff) + +/* Compress value to 11 bits. + * + * Uses mul instead of div. + * + * @param [in] v Vector of polynomials. + * @param [in] i Index of polynomial in vector. + * @param [in] j Index into polynomial. + * @param [in] k Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_11(v, i, j, k) \ + TO_COMP_WORD_VEC(v, i, j, k, 11, 0x7ff) + +#else + +/* Multiplier that does div q. + * ((1 << 53) + KYBER_Q_HALF) / KYBER_Q + */ +#define KYBER_V53 0x275f6ed0176UL +/* Multiplier times half of q. + * KYBER_V53 * (KYBER_Q_HALF + 1) + */ +#define KYBER_V53_HALF 0x10013afb768076UL + +/* Multiplier that does div q. + * ((1 << 54) + KYBER_Q_HALF) / KYBER_Q + */ +#define KYBER_V54 0x4ebedda02ecUL +/* Multiplier times half of q. + * KYBER_V54 * (KYBER_Q_HALF + 1) + */ +#define KYBER_V54_HALF 0x200275f6ed00ecUL + +/* Compress value to 10 bits. + * + * Uses mul instead of div. + * + * @param [in] v Vector of polynomials. + * @param [in] i Index of polynomial in vector. + * @param [in] j Index into polynomial. + * @param [in] k Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_10(v, i, j, k) \ + ((((KYBER_V54 << 10) * (v)[(i) * KYBER_N + (j) + (k)]) + KYBER_V54_HALF) >> 54) + +/* Compress value to 11 bits. + * + * Uses mul instead of div. + * Only works for values in range: 0..3228 + * + * @param [in] v Vector of polynomials. + * @param [in] i Index of polynomial in vector. + * @param [in] j Index into polynomial. + * @param [in] k Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_11(v, i, j, k) \ + ((((KYBER_V53 << 11) * (v)[(i) * KYBER_N + (j) + (k)]) + KYBER_V53_HALF) >> 53) + +#endif /* CONV_WITH_DIV */ + +#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768) +/* Compress the vector of polynomials into a byte array with 10 bits each. + * + * @param [out] b Array of bytes. + * @param [in] v Vector of polynomials. + * @param [in] kp Number of polynomials in vector. + */ +static void kyber_vec_compress_10_c(byte* r, sword16* v, unsigned int kp) +{ + unsigned int i; + unsigned int j; + + for (i = 0; i < kp; i++) { + /* Reduce each coefficient to mod q. */ + kyber_csubq_c(v + i * KYBER_N); + /* All values are now positive. */ + } + + /* Each polynomial. */ + for (i = 0; i < kp; i++) { +#if defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_KYBER_NO_LARGE_CODE) || \ + defined(BIG_ENDIAN_ORDER) + /* Each 4 polynomial coefficients. */ + for (j = 0; j < KYBER_N; j += 4) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int k; + sword16 t[4]; + /* Compress four polynomial values to 10 bits each. */ + for (k = 0; k < 4; k++) { + t[k] = TO_COMP_WORD_10(v, i, j, k); + } + + /* Pack four 10-bit values into byte array. */ + r[ 0] = (t[0] >> 0); + r[ 1] = (t[0] >> 8) | (t[1] << 2); + r[ 2] = (t[1] >> 6) | (t[2] << 4); + r[ 3] = (t[2] >> 4) | (t[3] << 6); + r[ 4] = (t[3] >> 2); + #else + /* Compress four polynomial values to 10 bits each. */ + sword16 t0 = TO_COMP_WORD_10(v, i, j, 0); + sword16 t1 = TO_COMP_WORD_10(v, i, j, 1); + sword16 t2 = TO_COMP_WORD_10(v, i, j, 2); + sword16 t3 = TO_COMP_WORD_10(v, i, j, 3); + + /* Pack four 10-bit values into byte array. */ + r[ 0] = (t0 >> 0); + r[ 1] = (t0 >> 8) | (t1 << 2); + r[ 2] = (t1 >> 6) | (t2 << 4); + r[ 3] = (t2 >> 4) | (t3 << 6); + r[ 4] = (t3 >> 2); + #endif + + /* Move over set bytes. */ + r += 5; + } +#else + /* Each 16 polynomial coefficients. */ + for (j = 0; j < KYBER_N; j += 16) { + /* Compress four polynomial values to 10 bits each. */ + sword16 t0 = TO_COMP_WORD_10(v, i, j, 0); + sword16 t1 = TO_COMP_WORD_10(v, i, j, 1); + sword16 t2 = TO_COMP_WORD_10(v, i, j, 2); + sword16 t3 = TO_COMP_WORD_10(v, i, j, 3); + sword16 t4 = TO_COMP_WORD_10(v, i, j, 4); + sword16 t5 = TO_COMP_WORD_10(v, i, j, 5); + sword16 t6 = TO_COMP_WORD_10(v, i, j, 6); + sword16 t7 = TO_COMP_WORD_10(v, i, j, 7); + sword16 t8 = TO_COMP_WORD_10(v, i, j, 8); + sword16 t9 = TO_COMP_WORD_10(v, i, j, 9); + sword16 t10 = TO_COMP_WORD_10(v, i, j, 10); + sword16 t11 = TO_COMP_WORD_10(v, i, j, 11); + sword16 t12 = TO_COMP_WORD_10(v, i, j, 12); + sword16 t13 = TO_COMP_WORD_10(v, i, j, 13); + sword16 t14 = TO_COMP_WORD_10(v, i, j, 14); + sword16 t15 = TO_COMP_WORD_10(v, i, j, 15); + + word32* r32 = (word32*)r; + /* Pack sixteen 10-bit values into byte array. */ + r32[0] = t0 | ((word32)t1 << 10) | ((word32)t2 << 20) | + ((word32)t3 << 30); + r32[1] = (t3 >> 2) | ((word32)t4 << 8) | ((word32)t5 << 18) | + ((word32)t6 << 28); + r32[2] = (t6 >> 4) | ((word32)t7 << 6) | ((word32)t8 << 16) | + ((word32)t9 << 26); + r32[3] = (t9 >> 6) | ((word32)t10 << 4) | ((word32)t11 << 14) | + ((word32)t12 << 24); + r32[4] = (t12 >> 8) | ((word32)t13 << 2) | ((word32)t14 << 12) | + ((word32)t15 << 22); + + /* Move over set bytes. */ + r += 20; + } +#endif + } +} + +/* Compress the vector of polynomials into a byte array with 10 bits each. + * + * @param [out] b Array of bytes. + * @param [in] v Vector of polynomials. + * @param [in] kp Number of polynomials in vector. + */ +void kyber_vec_compress_10(byte* r, sword16* v, unsigned int kp) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_compress_10_avx2(r, v, kp); + } + else +#endif + { + kyber_vec_compress_10_c(r, v, kp); + } +} +#endif + +#ifdef WOLFSSL_KYBER1024 +/* Compress the vector of polynomials into a byte array with 11 bits each. + * + * @param [out] b Array of bytes. + * @param [in] v Vector of polynomials. + */ +static void kyber_vec_compress_11_c(byte* r, sword16* v) +{ + unsigned int i; + unsigned int j; +#ifdef WOLFSSL_KYBER_SMALL + unsigned int k; +#endif + + for (i = 0; i < 4; i++) { + /* Reduce each coefficient to mod q. */ + kyber_csubq_c(v + i * KYBER_N); + /* All values are now positive. */ + } + + /* Each polynomial. */ + for (i = 0; i < 4; i++) { + /* Each 8 polynomial coefficients. */ + for (j = 0; j < KYBER_N; j += 8) { + #ifdef WOLFSSL_KYBER_SMALL + sword16 t[8]; + /* Compress eight polynomial values to 11 bits each. */ + for (k = 0; k < 8; k++) { + t[k] = TO_COMP_WORD_11(v, i, j, k); + } + + /* Pack eight 11-bit values into byte array. */ + r[ 0] = (t[0] >> 0); + r[ 1] = (t[0] >> 8) | (t[1] << 3); + r[ 2] = (t[1] >> 5) | (t[2] << 6); + r[ 3] = (t[2] >> 2); + r[ 4] = (t[2] >> 10) | (t[3] << 1); + r[ 5] = (t[3] >> 7) | (t[4] << 4); + r[ 6] = (t[4] >> 4) | (t[5] << 7); + r[ 7] = (t[5] >> 1); + r[ 8] = (t[5] >> 9) | (t[6] << 2); + r[ 9] = (t[6] >> 6) | (t[7] << 5); + r[10] = (t[7] >> 3); + #else + /* Compress eight polynomial values to 11 bits each. */ + sword16 t0 = TO_COMP_WORD_11(v, i, j, 0); + sword16 t1 = TO_COMP_WORD_11(v, i, j, 1); + sword16 t2 = TO_COMP_WORD_11(v, i, j, 2); + sword16 t3 = TO_COMP_WORD_11(v, i, j, 3); + sword16 t4 = TO_COMP_WORD_11(v, i, j, 4); + sword16 t5 = TO_COMP_WORD_11(v, i, j, 5); + sword16 t6 = TO_COMP_WORD_11(v, i, j, 6); + sword16 t7 = TO_COMP_WORD_11(v, i, j, 7); + + /* Pack eight 11-bit values into byte array. */ + r[ 0] = (t0 >> 0); + r[ 1] = (t0 >> 8) | (t1 << 3); + r[ 2] = (t1 >> 5) | (t2 << 6); + r[ 3] = (t2 >> 2); + r[ 4] = (t2 >> 10) | (t3 << 1); + r[ 5] = (t3 >> 7) | (t4 << 4); + r[ 6] = (t4 >> 4) | (t5 << 7); + r[ 7] = (t5 >> 1); + r[ 8] = (t5 >> 9) | (t6 << 2); + r[ 9] = (t6 >> 6) | (t7 << 5); + r[10] = (t7 >> 3); + #endif + + /* Move over set bytes. */ + r += 11; + } + } +} + +/* Compress the vector of polynomials into a byte array with 11 bits each. + * + * @param [out] b Array of bytes. + * @param [in] v Vector of polynomials. + */ +void kyber_vec_compress_11(byte* r, sword16* v) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_compress_11_avx2(r, v, 4); + } + else +#endif + { + kyber_vec_compress_11_c(r, v); + } +} +#endif + +/* Decompress a 10 bit value. + * + * @param [in] v Vector of polynomials. + * @param [in] i Index of polynomial in vector. + * @param [in] j Index into polynomial. + * @param [in] k Offset from indices. + * @param [in] t Value to decompress. + * @return Decompressed value. + */ +#define DECOMP_10(v, i, j, k, t) \ + v[(i) * KYBER_N + 4 * (j) + (k)] = \ + (word16)((((word32)((t) & 0x3ff) * KYBER_Q) + 512) >> 10) + +/* Decompress an 11 bit value. + * + * @param [in] v Vector of polynomials. + * @param [in] i Index of polynomial in vector. + * @param [in] j Index into polynomial. + * @param [in] k Offset from indices. + * @param [in] t Value to decompress. + * @return Decompressed value. + */ +#define DECOMP_11(v, i, j, k, t) \ + v[(i) * KYBER_N + 8 * (j) + (k)] = \ + (word16)((((word32)((t) & 0x7ff) * KYBER_Q) + 1024) >> 11) + +#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768) +/* Decompress the byte array of packed 10 bits into vector of polynomials. + * + * @param [out] v Vector of polynomials. + * @param [in] b Array of bytes. + * @param [in] kp Number of polynomials in vector. + */ +static void kyber_vec_decompress_10_c(sword16* v, const unsigned char* b, + unsigned int kp) +{ + unsigned int i; + unsigned int j; +#ifdef WOLFSSL_KYBER_SMALL + unsigned int k; +#endif + + /* Each polynomial. */ + for (i = 0; i < kp; i++) { + /* Each 4 polynomial coefficients. */ + for (j = 0; j < KYBER_N / 4; j++) { + #ifdef WOLFSSL_KYBER_SMALL + word16 t[4]; + /* Extract out 4 values of 10 bits each. */ + t[0] = (b[0] >> 0) | ((word16)b[ 1] << 8); + t[1] = (b[1] >> 2) | ((word16)b[ 2] << 6); + t[2] = (b[2] >> 4) | ((word16)b[ 3] << 4); + t[3] = (b[3] >> 6) | ((word16)b[ 4] << 2); + b += 5; + + /* Decompress 4 values. */ + for (k = 0; k < 4; k++) { + DECOMP_10(v, i, j, k, t[k]); + } + #else + /* Extract out 4 values of 10 bits each. */ + sword16 t0 = (b[0] >> 0) | ((word16)b[ 1] << 8); + sword16 t1 = (b[1] >> 2) | ((word16)b[ 2] << 6); + sword16 t2 = (b[2] >> 4) | ((word16)b[ 3] << 4); + sword16 t3 = (b[3] >> 6) | ((word16)b[ 4] << 2); + b += 5; + + /* Decompress 4 values. */ + DECOMP_10(v, i, j, 0, t0); + DECOMP_10(v, i, j, 1, t1); + DECOMP_10(v, i, j, 2, t2); + DECOMP_10(v, i, j, 3, t3); + #endif + } + } +} + +/* Decompress the byte array of packed 10 bits into vector of polynomials. + * + * @param [out] v Vector of polynomials. + * @param [in] b Array of bytes. + * @param [in] kp Number of polynomials in vector. + */ +void kyber_vec_decompress_10(sword16* v, const unsigned char* b, + unsigned int kp) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_decompress_10_avx2(v, b, kp); + } + else +#endif + { + kyber_vec_decompress_10_c(v, b, kp); + } +} +#endif +#ifdef WOLFSSL_KYBER1024 +/* Decompress the byte array of packed 11 bits into vector of polynomials. + * + * @param [out] v Vector of polynomials. + * @param [in] b Array of bytes. + */ +static void kyber_vec_decompress_11_c(sword16* v, const unsigned char* b) +{ + unsigned int i; + unsigned int j; +#ifdef WOLFSSL_KYBER_SMALL + unsigned int k; +#endif + + /* Each polynomial. */ + for (i = 0; i < 4; i++) { + /* Each 8 polynomial coefficients. */ + for (j = 0; j < KYBER_N / 8; j++) { + #ifdef WOLFSSL_KYBER_SMALL + word16 t[8]; + /* Extract out 8 values of 11 bits each. */ + t[0] = (b[0] >> 0) | ((word16)b[ 1] << 8); + t[1] = (b[1] >> 3) | ((word16)b[ 2] << 5); + t[2] = (b[2] >> 6) | ((word16)b[ 3] << 2) | + ((word16)b[4] << 10); + t[3] = (b[4] >> 1) | ((word16)b[ 5] << 7); + t[4] = (b[5] >> 4) | ((word16)b[ 6] << 4); + t[5] = (b[6] >> 7) | ((word16)b[ 7] << 1) | + ((word16)b[8] << 9); + t[6] = (b[8] >> 2) | ((word16)b[ 9] << 6); + t[7] = (b[9] >> 5) | ((word16)b[10] << 3); + b += 11; + + /* Decompress 8 values. */ + for (k = 0; k < 8; k++) { + DECOMP_11(v, i, j, k, t[k]); + } + #else + /* Extract out 8 values of 11 bits each. */ + sword16 t0 = (b[0] >> 0) | ((word16)b[ 1] << 8); + sword16 t1 = (b[1] >> 3) | ((word16)b[ 2] << 5); + sword16 t2 = (b[2] >> 6) | ((word16)b[ 3] << 2) | + ((word16)b[4] << 10); + sword16 t3 = (b[4] >> 1) | ((word16)b[ 5] << 7); + sword16 t4 = (b[5] >> 4) | ((word16)b[ 6] << 4); + sword16 t5 = (b[6] >> 7) | ((word16)b[ 7] << 1) | + ((word16)b[8] << 9); + sword16 t6 = (b[8] >> 2) | ((word16)b[ 9] << 6); + sword16 t7 = (b[9] >> 5) | ((word16)b[10] << 3); + b += 11; + + /* Decompress 8 values. */ + DECOMP_11(v, i, j, 0, t0); + DECOMP_11(v, i, j, 1, t1); + DECOMP_11(v, i, j, 2, t2); + DECOMP_11(v, i, j, 3, t3); + DECOMP_11(v, i, j, 4, t4); + DECOMP_11(v, i, j, 5, t5); + DECOMP_11(v, i, j, 6, t6); + DECOMP_11(v, i, j, 7, t7); + #endif + } + } +} + +/* Decompress the byte array of packed 11 bits into vector of polynomials. + * + * @param [out] v Vector of polynomials. + * @param [in] b Array of bytes. + */ +void kyber_vec_decompress_11(sword16* v, const unsigned char* b) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_decompress_11_avx2(v, b, 4); + } + else +#endif + { + kyber_vec_decompress_11_c(v, b); + } +} +#endif + +#ifdef CONV_WITH_DIV + +/* Compress value. + * + * Uses div operator that may be slow. + * + * @param [in] v Vector of polynomials. + * @param [in] i Index into polynomial. + * @param [in] j Offset from indices. + * @param [in] s Shift amount to apply to value being compressed. + * @param [in] m Mask to apply get the require number of bits. + * @return Compressed value. + */ +#define TO_COMP_WORD(v, i, j, s, m) \ + ((((word32)v[i + j] << s) + KYBER_Q_HALF) / KYBER_Q) & m + +/* Compress value to 4 bits. + * + * Uses mul instead of div. + * + * @param [in] p Polynomial. + * @param [in] i Index into polynomial. + * @param [in] j Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_4(p, i, j) \ + TO_COMP_WORD(p, i, j, 4, 0xf) + +/* Compress value to 5 bits. + * + * Uses mul instead of div. + * + * @param [in] p Polynomial. + * @param [in] i Index into polynomial. + * @param [in] j Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_5(p, i, j) \ + TO_COMP_WORD(p, i, j, 5, 0x1f) + +#else + +/* Multiplier that does div q. */ +#define KYBER_V28 ((word32)(((1U << 28) + KYBER_Q_HALF)) / KYBER_Q) +/* Multiplier times half of q. */ +#define KYBER_V28_HALF ((word32)(KYBER_V28 * (KYBER_Q_HALF + 1))) + +/* Multiplier that does div q. */ +#define KYBER_V27 ((word32)(((1U << 27) + KYBER_Q_HALF)) / KYBER_Q) +/* Multiplier times half of q. */ +#define KYBER_V27_HALF ((word32)(KYBER_V27 * KYBER_Q_HALF)) + +/* Compress value to 4 bits. + * + * Uses mul instead of div. + * + * @param [in] p Polynomial. + * @param [in] i Index into polynomial. + * @param [in] j Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_4(p, i, j) \ + ((((KYBER_V28 << 4) * (p)[(i) + (j)]) + KYBER_V28_HALF) >> 28) + +/* Compress value to 5 bits. + * + * Uses mul instead of div. + * + * @param [in] p Polynomial. + * @param [in] i Index into polynomial. + * @param [in] j Offset from indices. + * @return Compressed value. + */ +#define TO_COMP_WORD_5(p, i, j) \ + ((((KYBER_V27 << 5) * (p)[(i) + (j)]) + KYBER_V27_HALF) >> 27) + +#endif /* CONV_WITH_DIV */ + +#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768) +/* Compress a polynomial into byte array - on coefficients into 4 bits. + * + * @param [out] b Array of bytes. + * @param [in] p Polynomial. + */ +static void kyber_compress_4_c(byte* b, sword16* p) +{ + unsigned int i; +#ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + byte t[8]; +#endif + + /* Reduce each coefficients to mod q. */ + kyber_csubq_c(p); + /* All values are now positive. */ + + /* Each 8 polynomial coefficients. */ + for (i = 0; i < KYBER_N; i += 8) { + #ifdef WOLFSSL_KYBER_SMALL + /* Compress eight polynomial values to 4 bits each. */ + for (j = 0; j < 8; j++) { + t[j] = TO_COMP_WORD_4(p, i, j); + } + + b[0] = t[0] | (t[1] << 4); + b[1] = t[2] | (t[3] << 4); + b[2] = t[4] | (t[5] << 4); + b[3] = t[6] | (t[7] << 4); + #else + /* Compress eight polynomial values to 4 bits each. */ + byte t0 = TO_COMP_WORD_4(p, i, 0); + byte t1 = TO_COMP_WORD_4(p, i, 1); + byte t2 = TO_COMP_WORD_4(p, i, 2); + byte t3 = TO_COMP_WORD_4(p, i, 3); + byte t4 = TO_COMP_WORD_4(p, i, 4); + byte t5 = TO_COMP_WORD_4(p, i, 5); + byte t6 = TO_COMP_WORD_4(p, i, 6); + byte t7 = TO_COMP_WORD_4(p, i, 7); + + /* Pack eight 4-bit values into byte array. */ + b[0] = t0 | (t1 << 4); + b[1] = t2 | (t3 << 4); + b[2] = t4 | (t5 << 4); + b[3] = t6 | (t7 << 4); + #endif + + /* Move over set bytes. */ + b += 4; + } +} + +/* Compress a polynomial into byte array - on coefficients into 4 bits. + * + * @param [out] b Array of bytes. + * @param [in] p Polynomial. + */ +void kyber_compress_4(byte* b, sword16* p) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_compress_4_avx2(b, p); + } + else +#endif + { + kyber_compress_4_c(b, p); + } +} +#endif +#ifdef WOLFSSL_KYBER1024 +/* Compress a polynomial into byte array - on coefficients into 5 bits. + * + * @param [out] b Array of bytes. + * @param [in] p Polynomial. + */ +static void kyber_compress_5_c(byte* b, sword16* p) +{ + unsigned int i; +#ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + byte t[8]; +#endif + + /* Reduce each coefficients to mod q. */ + kyber_csubq_c(p); + /* All values are now positive. */ + + for (i = 0; i < KYBER_N; i += 8) { + #ifdef WOLFSSL_KYBER_SMALL + /* Compress eight polynomial values to 5 bits each. */ + for (j = 0; j < 8; j++) { + t[j] = TO_COMP_WORD_5(p, i, j); + } + + /* Pack 5 bits into byte array. */ + b[0] = (t[0] >> 0) | (t[1] << 5); + b[1] = (t[1] >> 3) | (t[2] << 2) | (t[3] << 7); + b[2] = (t[3] >> 1) | (t[4] << 4); + b[3] = (t[4] >> 4) | (t[5] << 1) | (t[6] << 6); + b[4] = (t[6] >> 2) | (t[7] << 3); + #else + /* Compress eight polynomial values to 5 bits each. */ + byte t0 = TO_COMP_WORD_5(p, i, 0); + byte t1 = TO_COMP_WORD_5(p, i, 1); + byte t2 = TO_COMP_WORD_5(p, i, 2); + byte t3 = TO_COMP_WORD_5(p, i, 3); + byte t4 = TO_COMP_WORD_5(p, i, 4); + byte t5 = TO_COMP_WORD_5(p, i, 5); + byte t6 = TO_COMP_WORD_5(p, i, 6); + byte t7 = TO_COMP_WORD_5(p, i, 7); + + /* Pack eight 5-bit values into byte array. */ + b[0] = (t0 >> 0) | (t1 << 5); + b[1] = (t1 >> 3) | (t2 << 2) | (t3 << 7); + b[2] = (t3 >> 1) | (t4 << 4); + b[3] = (t4 >> 4) | (t5 << 1) | (t6 << 6); + b[4] = (t6 >> 2) | (t7 << 3); + #endif + + /* Move over set bytes. */ + b += 5; + } +} + +/* Compress a polynomial into byte array - on coefficients into 5 bits. + * + * @param [out] b Array of bytes. + * @param [in] p Polynomial. + */ +void kyber_compress_5(byte* b, sword16* p) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_compress_5_avx2(b, p); + } + else +#endif + { + kyber_compress_5_c(b, p); + } +} +#endif + +/* Decompress a 4 bit value. + * + * @param [in] p Polynomial. + * @param [in] i Index into polynomial. + * @param [in] j Offset from indices. + * @param [in] t Value to decompress. + * @return Decompressed value. + */ +#define DECOMP_4(p, i, j, t) \ + p[(i) + (j)] = ((word16)((t) * KYBER_Q) + 8) >> 4 + +/* Decompress a 5 bit value. + * + * @param [in] p Polynomial. + * @param [in] i Index into polynomial. + * @param [in] j Offset from indices. + * @param [in] t Value to decompress. + * @return Decompressed value. + */ +#define DECOMP_5(p, i, j, t) \ + p[(i) + (j)] = (((word32)((t) & 0x1f) * KYBER_Q) + 16) >> 5 + +#if defined(WOLFSSL_KYBER512) || defined(WOLFSSL_KYBER768) +/* Decompress the byte array of packed 4 bits into polynomial. + * + * @param [out] p Polynomial. + * @param [in] b Array of bytes. + */ +static void kyber_decompress_4_c(sword16* p, const unsigned char* b) +{ + unsigned int i; + + /* 2 coefficients at a time. */ + for (i = 0; i < KYBER_N; i += 2) { + /* 2 coefficients decompressed from one byte. */ + DECOMP_4(p, i, 0, b[0] & 0xf); + DECOMP_4(p, i, 1, b[0] >> 4); + b += 1; + } +} + +/* Decompress the byte array of packed 4 bits into polynomial. + * + * @param [out] p Polynomial. + * @param [in] b Array of bytes. + */ +void kyber_decompress_4(sword16* p, const unsigned char* b) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_decompress_4_avx2(p, b); + } + else +#endif + { + kyber_decompress_4_c(p, b); + } +} +#endif +#ifdef WOLFSSL_KYBER1024 +/* Decompress the byte array of packed 5 bits into polynomial. + * + * @param [out] p Polynomial. + * @param [in] b Array of bytes. + */ +static void kyber_decompress_5_c(sword16* p, const unsigned char* b) +{ + unsigned int i; + + /* Each 8 polynomial coefficients. */ + for (i = 0; i < KYBER_N; i += 8) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + byte t[8]; + + /* Extract out 8 values of 5 bits each. */ + t[0] = (b[0] >> 0); + t[1] = (b[0] >> 5) | (b[1] << 3); + t[2] = (b[1] >> 2); + t[3] = (b[1] >> 7) | (b[2] << 1); + t[4] = (b[2] >> 4) | (b[3] << 4); + t[5] = (b[3] >> 1); + t[6] = (b[3] >> 6) | (b[4] << 2); + t[7] = (b[4] >> 3); + b += 5; + + /* Decompress 8 values. */ + for (j = 0; j < 8; j++) { + DECOMP_5(p, i, j, t[j]); + } + #else + /* Extract out 8 values of 5 bits each. */ + byte t0 = (b[0] >> 0); + byte t1 = (b[0] >> 5) | (b[1] << 3); + byte t2 = (b[1] >> 2); + byte t3 = (b[1] >> 7) | (b[2] << 1); + byte t4 = (b[2] >> 4) | (b[3] << 4); + byte t5 = (b[3] >> 1); + byte t6 = (b[3] >> 6) | (b[4] << 2); + byte t7 = (b[4] >> 3); + b += 5; + + /* Decompress 8 values. */ + DECOMP_5(p, i, 0, t0); + DECOMP_5(p, i, 1, t1); + DECOMP_5(p, i, 2, t2); + DECOMP_5(p, i, 3, t3); + DECOMP_5(p, i, 4, t4); + DECOMP_5(p, i, 5, t5); + DECOMP_5(p, i, 6, t6); + DECOMP_5(p, i, 7, t7); + #endif + } +} + +/* Decompress the byte array of packed 5 bits into polynomial. + * + * @param [out] p Polynomial. + * @param [in] b Array of bytes. + */ +void kyber_decompress_5(sword16* p, const unsigned char* b) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_decompress_5_avx2(p, b); + } + else +#endif + { + kyber_decompress_5_c(p, b); + } +} +#endif + +/******************************************************************************/ + +/* Convert bit from byte to 0 or (KYBER_Q + 1) / 2. + * + * Constant time implementation. + * XOR in kyber_opt_blocker to ensure optimizer doesn't know what will be ANDed + * with KYBER_Q_1_HALF and can't optimize to non-constant time code. + * + * @param [out] p Polynomial to hold converted value. + * @param [in] msg Message to get bit from byte from. + * @param [in] i Index of byte from message. + * @param [in] j Index of bit in byte. + */ +#define FROM_MSG_BIT(p, msg, i, j) \ + ((p)[8 * (i) + (j)] = (((sword16)0 - (sword16)(((msg)[i] >> (j)) & 1)) ^ \ + kyber_opt_blocker) & KYBER_Q_1_HALF) + +/* Convert message to polynomial. + * + * @param [out] p Polynomial. + * @param [in] msg Message as a byte array. + */ +static void kyber_from_msg_c(sword16* p, const byte* msg) +{ + unsigned int i; + + /* For each byte of the message. */ + for (i = 0; i < KYBER_N / 8; i++) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + /* For each bit of the message. */ + for (j = 0; j < 8; j++) { + FROM_MSG_BIT(p, msg, i, j); + } + #else + FROM_MSG_BIT(p, msg, i, 0); + FROM_MSG_BIT(p, msg, i, 1); + FROM_MSG_BIT(p, msg, i, 2); + FROM_MSG_BIT(p, msg, i, 3); + FROM_MSG_BIT(p, msg, i, 4); + FROM_MSG_BIT(p, msg, i, 5); + FROM_MSG_BIT(p, msg, i, 6); + FROM_MSG_BIT(p, msg, i, 7); + #endif + } +} + +/* Convert message to polynomial. + * + * @param [out] p Polynomial. + * @param [in] msg Message as a byte array. + */ +void kyber_from_msg(sword16* p, const byte* msg) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + kyber_from_msg_avx2(p, msg); + } + else +#endif + { + kyber_from_msg_c(p, msg); + } +} + +#ifdef CONV_WITH_DIV + +/* Convert to value to bit. + * + * Uses div operator that may be slow. + * + * @param [out] m Message. + * @param [in] p Polynomial. + * @param [in] i Index of byte in message. + * @param [in] j Index of bit in byte. + */ +#define TO_MSG_BIT(m, p, i, j) \ + m[i] |= (((((sword16)p[8 * i + j] << 1) + KYBER_Q_HALF) / KYBER_Q) & 1) << j + +#else + +/* Multiplier that does div q. */ +#define KYBER_V31 (((1U << 31) + (KYBER_Q / 2)) / KYBER_Q) +/* 2 * multiplier that does div q. Only need bit 32 of result. */ +#define KYBER_V31_2 ((word32)(KYBER_V31 * 2)) +/* Multiplier times half of q. */ +#define KYBER_V31_HALF ((word32)(KYBER_V31 * KYBER_Q_HALF)) + +/* Convert to value to bit. + * + * Uses mul instead of div. + * + * @param [out] m Message. + * @param [in] p Polynomial. + * @param [in] i Index of byte in message. + * @param [in] j Index of bit in byte. + */ +#define TO_MSG_BIT(m, p, i, j) \ + (m)[i] |= ((word32)((KYBER_V31_2 * (p)[8 * (i) + (j)]) + KYBER_V31_HALF) >> 31) << (j) + +#endif /* CONV_WITH_DIV */ + +/* Convert polynomial to message. + * + * @param [out] msg Message as a byte array. + * @param [in] p Polynomial. + */ +static void kyber_to_msg_c(byte* msg, sword16* p) +{ + unsigned int i; + + /* Reduce each coefficient to mod q. */ + kyber_csubq_c(p); + /* All values are now positive. */ + + for (i = 0; i < KYBER_N / 8; i++) { + #ifdef WOLFSSL_KYBER_SMALL + unsigned int j; + msg[i] = 0; + for (j = 0; j < 8; j++) { + TO_MSG_BIT(msg, p, i, j); + } + #else + msg[i] = 0; + TO_MSG_BIT(msg, p, i, 0); + TO_MSG_BIT(msg, p, i, 1); + TO_MSG_BIT(msg, p, i, 2); + TO_MSG_BIT(msg, p, i, 3); + TO_MSG_BIT(msg, p, i, 4); + TO_MSG_BIT(msg, p, i, 5); + TO_MSG_BIT(msg, p, i, 6); + TO_MSG_BIT(msg, p, i, 7); + #endif + } +} + +/* Convert polynomial to message. + * + * @param [out] msg Message as a byte array. + * @param [in] p Polynomial. + */ +void kyber_to_msg(byte* msg, sword16* p) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + /* Convert the polynomial into a array of bytes (message). */ + kyber_to_msg_avx2(msg, p); + } + else +#endif + { + kyber_to_msg_c(msg, p); + } +} + +/******************************************************************************/ + +/* Convert bytes to polynomial. + * + * Consecutive 12 bits hold each coefficient of polynomial. + * Used in decoding private and public keys. + * + * @param [out] p Vector of polynomials. + * @param [in] b Array of bytes. + * @param [in] k Number of polynomials in vector. + */ +static void kyber_from_bytes_c(sword16* p, const byte* b, int k) +{ + int i; + int j; -#ifdef WOLFSSL_HAVE_KYBER - #error "Contact wolfSSL to get the implementation of this file" + for (j = 0; j < k; j++) { + for (i = 0; i < KYBER_N / 2; i++) { + p[2 * i + 0] = ((b[3 * i + 0] >> 0) | + ((word16)b[3 * i + 1] << 8)) & 0xfff; + p[2 * i + 1] = ((b[3 * i + 1] >> 4) | + ((word16)b[3 * i + 2] << 4)) & 0xfff; + } + p += KYBER_N; + b += KYBER_POLY_SIZE; + } +} + +/* Convert bytes to polynomial. + * + * Consecutive 12 bits hold each coefficient of polynomial. + * Used in decoding private and public keys. + * + * @param [out] p Vector of polynomials. + * @param [in] b Array of bytes. + * @param [in] k Number of polynomials in vector. + */ +void kyber_from_bytes(sword16* p, const byte* b, int k) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + int i; + + for (i = 0; i < k; i++) { + kyber_from_bytes_avx2(p, b); + p += KYBER_N; + b += KYBER_POLY_SIZE; + } + } + else +#endif + { + kyber_from_bytes_c(p, b, k); + } +} + +/* Convert polynomial to bytes. + * + * Consecutive 12 bits hold each coefficient of polynomial. + * Used in encoding private and public keys. + * + * @param [out] b Array of bytes. + * @param [in] p Polynomial. + * @param [in] k Number of polynomials in vector. + */ +static void kyber_to_bytes_c(byte* b, sword16* p, int k) +{ + int i; + int j; + + /* Reduce each coefficient to mod q. */ + kyber_csubq_c(p); + /* All values are now positive. */ + + for (j = 0; j < k; j++) { + for (i = 0; i < KYBER_N / 2; i++) { + word16 t0 = p[2 * i]; + word16 t1 = p[2 * i + 1]; + b[3 * i + 0] = (t0 >> 0); + b[3 * i + 1] = (t0 >> 8) | t1 << 4; + b[3 * i + 2] = (t1 >> 4); + } + p += KYBER_N; + b += KYBER_POLY_SIZE; + } +} + +/* Convert polynomial to bytes. + * + * Consecutive 12 bits hold each coefficient of polynomial. + * Used in encoding private and public keys. + * + * @param [out] b Array of bytes. + * @param [in] p Polynomial. + * @param [in] k Number of polynomials in vector. + */ +void kyber_to_bytes(byte* b, sword16* p, int k) +{ +#ifdef USE_INTEL_SPEEDUP + if (IS_INTEL_AVX2(cpuid_flags)) { + int i; + + for (i = 0; i < k; i++) { + kyber_to_bytes_avx2(b, p); + p += KYBER_N; + b += KYBER_POLY_SIZE; + } + } + else #endif + { + kyber_to_bytes_c(b, p, k); + } +} + +#endif /* WOLFSSL_WC_KYBER */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1145 @@ +/* wc_lms.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#if defined(WOLFSSL_HAVE_LMS) && defined(WOLFSSL_WC_LMS) +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + + +/* Calculate u. Appendix B. Works for w of 1, 2, 4, or 8. + * + * @param [in] w Winternitz width. + */ +#define LMS_U(w) \ + (8 * WC_SHA256_DIGEST_SIZE / (w)) +/* Calculate u. Appendix B. Works for w of 1, 2, 4, or 8. + * + * @param [in] w Winternitz width. + * @param [in] wb Winternitz width length in bits. + */ +#define LMS_V(w, wb) \ + (2 + (8 - (wb)) / (w)) +/* Calculate ls. Appendix B. Works for w of 1, 2, 4, or 8. + * + * @param [in] w Winternitz width. + * @param [in] wb Winternitz width length in bits. + */ +#define LMS_LS(w, wb) \ + (16 - LMS_V(w, wb) * (w)) +/* Calculate p. Appendix B. Works for w of 1, 2, 4, or 8. + * + * @param [in] w Winternitz width. + * @param [in] wb Winternitz width length in bits. + */ +#define LMS_P(w, wb) \ + (LMS_U(w) + LMS_V(w, wb)) +/* Calculate signature length. + * + * @param [in] l Number of levels. + * @param [in] h Height of the trees. + * @param [in] p Number of n-byte string elements in signature for a tree. + */ +#define LMS_PARAMS_SIG_LEN(l, h, p) \ + (4 + (l) * (4 + 4 + 4 + WC_SHA256_DIGEST_SIZE * (1 + (p) + (h))) + \ + ((l) - 1) * LMS_PUBKEY_LEN) + +#ifndef WOLFSSL_WC_LMS_SMALL + /* Root levels and leaf cache bits. */ + #define LMS_PARAMS_CACHE(h) \ + (((h) < LMS_ROOT_LEVELS) ? (h) : LMS_ROOT_LEVELS), \ + (((h) < LMS_CACHE_BITS ) ? (h) : LMS_CACHE_BITS ) +#else + /* Root levels and leaf cache bits aren't in structure. */ + #define LMS_PARAMS_CACHE(h) /* null expansion */ +#endif + +/* Define parameters entry for LMS. + * + * @param [in] l Number of levels. + * @param [in] h Height of the trees. + * @param [in] w Winternitz width. + * @param [in] wb Winternitz width length in bits. + * @param [in] t LMS type. + * @param [in] t2 LM-OTS type. + */ +#define LMS_PARAMS(l, h, w, wb, t, t2) \ + { l, h, w, LMS_LS(w, wb), LMS_P(w, wb), t, t2, \ + LMS_PARAMS_SIG_LEN(l, h, LMS_P(w, wb)), LMS_PARAMS_CACHE(h) } + + +/* Initialize the working state for LMS operations. + * + * @param [in, out] state LMS state. + * @param [in] params LMS parameters. + */ +static int wc_lmskey_state_init(LmsState* state, const LmsParams* params) +{ + int ret; + + /* Zero out every field. */ + XMEMSET(state, 0, sizeof(LmsState)); + + /* Keep a reference to the parameters for use in operations. */ + state->params = params; + + /* Initialize the two hash algorithms. */ + ret = wc_InitSha256(&state->hash); + if (ret == 0) { + ret = wc_InitSha256(&state->hash_k); + if (ret != 0) { + wc_Sha256Free(&state->hash); + } + } + + return ret; +} + +/* Free the working state for LMS operations. + * + * @param [in] state LMS state. + */ +static void wc_lmskey_state_free(LmsState* state) +{ + wc_Sha256Free(&state->hash_k); + wc_Sha256Free(&state->hash); +} + +/* Supported LMS parameters. */ +static const wc_LmsParamsMap wc_lms_map[] = { +#if LMS_MAX_HEIGHT >= 15 + { WC_LMS_PARM_NONE , "LMS_NONE" , + LMS_PARAMS(1, 15, 2, 1, LMS_SHA256_M32_H15, LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L1_H15_W2, "LMS/HSS L1_H15_W2", + LMS_PARAMS(1, 15, 2, 1, LMS_SHA256_M32_H15, LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L1_H15_W4, "LMS/HSS L1_H15_W4", + LMS_PARAMS(1, 15, 4, 2, LMS_SHA256_M32_H15, LMOTS_SHA256_N32_W4) }, +#endif +#if LMS_MAX_LEVELS >= 2 +#if LMS_MAX_HEIGHT >= 10 + { WC_LMS_PARM_L2_H10_W2, "LMS/HSS L2_H10_W2", + LMS_PARAMS(2, 10, 2, 1, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L2_H10_W4, "LMS/HSS L2_H10_W4", + LMS_PARAMS(2, 10, 4, 2, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L2_H10_W8, "LMS/HSS L2_H10_W8", + LMS_PARAMS(2, 10, 8, 3, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W8) }, +#endif +#endif +#if LMS_MAX_LEVELS >= 3 + { WC_LMS_PARM_L3_H5_W2 , "LMS/HSS L3_H5_W2" , + LMS_PARAMS(3, 5, 2, 1, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L3_H5_W4 , "LMS/HSS L3_H5_W4" , + LMS_PARAMS(3, 5, 4, 2, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L3_H5_W8 , "LMS/HSS L3_H5_W8" , + LMS_PARAMS(3, 5, 8, 3, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W8) }, +#if LMS_MAX_HEIGHT >= 10 + { WC_LMS_PARM_L3_H10_W4, "LMS/HSS L3_H10_W4", + LMS_PARAMS(3, 10, 4, 2, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W4) }, +#endif +#endif +#if LMS_MAX_LEVELS >= 4 + { WC_LMS_PARM_L4_H5_W8 , "LMS/HSS L4_H5_W8" , + LMS_PARAMS(4, 5, 8, 3, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W8) }, +#endif + + /* For when user sets L, H, W explicitly. */ + { WC_LMS_PARM_L1_H5_W1 , "LMS/HSS_L1_H5_W1" , + LMS_PARAMS(1, 5, 1, 1, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W1) }, + { WC_LMS_PARM_L1_H5_W2 , "LMS/HSS_L1_H5_W2" , + LMS_PARAMS(1, 5, 2, 1, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L1_H5_W4 , "LMS/HSS_L1_H5_W4" , + LMS_PARAMS(1, 5, 4, 2, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L1_H5_W8 , "LMS/HSS_L1_H5_W8" , + LMS_PARAMS(1, 5, 8, 3, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W8) }, +#if LMS_MAX_HEIGHT >= 10 + { WC_LMS_PARM_L1_H10_W2 , "LMS/HSS_L1_H10_W2", + LMS_PARAMS(1, 10, 2, 1, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L1_H10_W4 , "LMS/HSS_L1_H10_W4", + LMS_PARAMS(1, 10, 4, 2, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L1_H10_W8 , "LMS/HSS_L1_H10_W8", + LMS_PARAMS(1, 10, 8, 3, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W8) }, +#endif +#if LMS_MAX_HEIGHT >= 15 + { WC_LMS_PARM_L1_H15_W8 , "LMS/HSS L1_H15_W8", + LMS_PARAMS(1, 15, 8, 3, LMS_SHA256_M32_H15, LMOTS_SHA256_N32_W8) }, +#endif +#if LMS_MAX_HEIGHT >= 20 + { WC_LMS_PARM_L1_H20_W2 , "LMS/HSS_L1_H20_W2", + LMS_PARAMS(1, 20, 2, 1, LMS_SHA256_M32_H20, LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L1_H20_W4 , "LMS/HSS_L1_H20_W4", + LMS_PARAMS(1, 20, 4, 2, LMS_SHA256_M32_H20, LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L1_H20_W8 , "LMS/HSS_L1_H20_W8", + LMS_PARAMS(1, 20, 8, 3, LMS_SHA256_M32_H20, LMOTS_SHA256_N32_W8) }, +#endif +#if LMS_MAX_LEVELS >= 2 + { WC_LMS_PARM_L2_H5_W2 , "LMS/HSS_L2_H5_W2" , + LMS_PARAMS(2, 5, 2, 1, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L2_H5_W4 , "LMS/HSS_L2_H5_W4" , + LMS_PARAMS(2, 5, 4, 2, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L2_H5_W8 , "LMS/HSS_L2_H5_W8" , + LMS_PARAMS(2, 5, 8, 3, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W8) }, +#if LMS_MAX_HEIGHT >= 15 + { WC_LMS_PARM_L2_H15_W2 , "LMS/HSS_L2_H15_W2", + LMS_PARAMS(2, 15, 2, 1, LMS_SHA256_M32_H15, LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L2_H15_W4 , "LMS/HSS_L2_H15_W4", + LMS_PARAMS(2, 15, 4, 2, LMS_SHA256_M32_H15, LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L2_H15_W8 , "LMS/HSS_L2_H15_W8", + LMS_PARAMS(2, 15, 8, 3, LMS_SHA256_M32_H15, LMOTS_SHA256_N32_W8) }, +#endif +#if LMS_MAX_HEIGHT >= 20 + { WC_LMS_PARM_L2_H20_W2 , "LMS/HSS_L2_H20_W2", + LMS_PARAMS(2, 20, 2, 1, LMS_SHA256_M32_H20, LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L2_H20_W4 , "LMS/HSS_L2_H20_W4", + LMS_PARAMS(2, 20, 4, 2, LMS_SHA256_M32_H20, LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L2_H20_W8 , "LMS/HSS_L2_H20_W8", + LMS_PARAMS(2, 20, 8, 3, LMS_SHA256_M32_H20, LMOTS_SHA256_N32_W8) }, +#endif +#endif +#if LMS_MAX_LEVELS >= 3 +#if LMS_MAX_HEIGHT >= 10 + { WC_LMS_PARM_L3_H10_W8 , "LMS/HSS L3_H10_W8", + LMS_PARAMS(3, 10, 8, 3, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W8) }, +#endif +#endif +#if LMS_MAX_LEVELS >= 4 + { WC_LMS_PARM_L4_H5_W2 , "LMS/HSS L4_H5_W2" , + LMS_PARAMS(4, 5, 2, 1, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W2) }, + { WC_LMS_PARM_L4_H5_W4 , "LMS/HSS L4_H5_W4" , + LMS_PARAMS(4, 5, 4, 2, LMS_SHA256_M32_H5 , LMOTS_SHA256_N32_W4) }, +#if LMS_MAX_HEIGHT >= 10 + { WC_LMS_PARM_L4_H10_W4 , "LMS/HSS L4_H10_W4", + LMS_PARAMS(4, 10, 4, 2, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W4) }, + { WC_LMS_PARM_L4_H10_W8 , "LMS/HSS L4_H10_W8", + LMS_PARAMS(4, 10, 8, 3, LMS_SHA256_M32_H10, LMOTS_SHA256_N32_W8) }, +#endif +#endif +}; +/* Number of parameter sets supported. */ +#define WC_LMS_MAP_LEN ((int)(sizeof(wc_lms_map) / sizeof(*wc_lms_map))) + +/* Initialize LMS key. + * + * Call this before setting the params of an LMS key. + * + * @param [out] key LMS key to initialize. + * @param [in] heap Heap hint. + * @param [in] devId Device identifier. + * Use INVALID_DEVID when not using a device. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL. + */ +int wc_LmsKey_Init(LmsKey* key, void* heap, int devId) +{ + int ret = 0; + + (void)heap; + (void)devId; + + /* Validate parameters. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + if (ret == 0) { + /* Zeroize the key data. */ + ForceZero(key, sizeof(LmsKey)); + + #ifndef WOLFSSL_LMS_VERIFY_ONLY + /* Initialize other fields. */ + key->write_private_key = NULL; + key->read_private_key = NULL; + key->context = NULL; + key->heap = heap; + #endif + #ifdef WOLF_CRYPTO_CB + key->devId = devId; + #endif + /* Start in initialized state. */ + key->state = WC_LMS_STATE_INITED; + } + + return ret; +} + +/* Get the string representation of the LMS parameter set. + * + * @param [in] lmsParm LMS parameter set identifier. + * @return String representing LMS parameter set on success. + * @return NULL when parameter set not supported. + */ +const char* wc_LmsKey_ParmToStr(enum wc_LmsParm lmsParm) +{ + const char* str = NULL; + int i; + + /* Search through table for matching numeric identifier. */ + for (i = 0; i < WC_LMS_MAP_LEN; i++) { + if (lmsParm == wc_lms_map[i].id) { + /* Get string corresponding to numeric identifier. */ + str = wc_lms_map[i].str; + break; + } + } + + /* Return the string or NULL. */ + return str; +} + +/* Set the wc_LmsParm of an LMS key. + * + * Use this if you wish to set a key with a predefined parameter set, + * such as WC_LMS_PARM_L2_H10_W8. + * + * Key must be inited before calling this. + * + * @param [in, out] key LMS key to set parameters on. + * @param [in] lmsParm Identifier of parameters. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL. + * @return BAD_FUNC_ARG when parameters not supported. + */ +int wc_LmsKey_SetLmsParm(LmsKey* key, enum wc_LmsParm lmsParm) +{ + int ret = 0; + + /* Validate parameters. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + + /* Check state is valid. */ + if ((ret == 0) && (key->state != WC_LMS_STATE_INITED)) { + WOLFSSL_MSG("error: LmsKey needs init"); + ret = BAD_STATE_E; + } + + if (ret == 0) { + int i; + + ret = BAD_FUNC_ARG; + /* Search through table for matching numeric identifier. */ + for (i = 0; i < WC_LMS_MAP_LEN; i++) { + if (lmsParm == wc_lms_map[i].id) { + /* Set the parameters into the key. */ + key->params = &wc_lms_map[i].params; + ret = 0; + break; + } + } + } + + if (ret == 0) { + /* Move the state to params set. + * Key is ready for MakeKey or Reload. */ + key->state = WC_LMS_STATE_PARMSET; + } + + return ret; +} + +/* Set the parameters of an LMS key. + * + * Use this if you wish to set specific parameters not found in the + * wc_LmsParm predefined sets. See comments in lms.h for allowed + * parameters. + * + * Key must be inited before calling this. + * + * @param [in, out] key LMS key to set parameters on. + * @param [in] levels Number of tree levels. + * @param [in] height Height of each tree. + * @param [in] winternitz Width or Winternitz coefficient. + * @return 0 on success. + * @return BAD_FUNC_ARG when key is NULL. + * @return BAD_FUNC_ARG when parameters not supported. + * */ +int wc_LmsKey_SetParameters(LmsKey* key, int levels, int height, + int winternitz) +{ + int ret = 0; + + /* Validate parameters. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + + /* Check state is valid. */ + if ((ret == 0) && (key->state != WC_LMS_STATE_INITED)) { + WOLFSSL_MSG("error: LmsKey needs init"); + ret = BAD_STATE_E; + } + + if (ret == 0) { + int i; + + ret = BAD_FUNC_ARG; + /* Search through table for matching levels, height and width. */ + for (i = 0; i < WC_LMS_MAP_LEN; i++) { + if ((levels == wc_lms_map[i].params.levels) && + (height == wc_lms_map[i].params.height) && + (winternitz == wc_lms_map[i].params.width)) { + /* Set the parameters into the key. */ + key->params = &wc_lms_map[i].params; + ret = 0; + break; + } + } + } + + if (ret == 0) { + /* Move the state to params set. + * Key is ready for MakeKey or Reload. */ + key->state = WC_LMS_STATE_PARMSET; + } + + return ret; +} + +/* Get the parameters of an LMS key. + * + * Key must be inited and parameters set before calling this. + * + * @param [in] key LMS key. + * @param [out] levels Number of levels of trees. + * @param [out] height Height of the trees. + * @param [out] winternitz Winternitz width. + * Returns 0 on success. + * */ +int wc_LmsKey_GetParameters(const LmsKey* key, int* levels, int* height, + int* winternitz) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (levels == NULL) || (height == NULL) || + (winternitz == NULL)) { + ret = BAD_FUNC_ARG; + } + + /* Validate the parameters are available. */ + if ((ret == 0) && (key->params == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Set the levels, height and Winternitz width from parameters. */ + *levels = key->params->levels; + *height = key->params->height; + *winternitz = key->params->width; + } + + return ret; +} + +/* Frees the LMS key from memory. + * + * This does not affect the private key saved to non-volatile storage. + * + * @param [in, out] key LMS key to free. + */ +void wc_LmsKey_Free(LmsKey* key) +{ + if (key != NULL) { + #ifndef WOLFSSL_LMS_VERIFY_ONLY + if (key->priv_data != NULL) { + const LmsParams* params = key->params; + + ForceZero(key->priv_data, LMS_PRIV_DATA_LEN(params->levels, + params->height, params->p, params->rootLevels, + params->cacheBits)); + + XFREE(key->priv_data, key->heap, DYNAMIC_TYPE_LMS); + } + #endif + + ForceZero(key, sizeof(LmsKey)); + + key->state = WC_LMS_STATE_FREED; + } +} + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* Set the write private key callback to the LMS key structure. + * + * The callback must be able to write/update the private key to + * non-volatile storage. + * + * @param [in, out] key LMS key. + * @param [in] write_cb Callback function that stores private key. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or write_cb is NULL. + * @return BAD_STATE_E when key state is invalid. + */ +int wc_LmsKey_SetWriteCb(LmsKey* key, wc_lms_write_private_key_cb write_cb) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (write_cb == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Changing the write callback of an already working key is forbidden. */ + if ((ret == 0) && (key->state == WC_LMS_STATE_OK)) { + WOLFSSL_MSG("error: wc_LmsKey_SetWriteCb: key in use"); + ret = BAD_STATE_E; + } + + if (ret == 0) { + /* Set the callback into the key. */ + key->write_private_key = write_cb; + } + + return ret; +} + +/* Set the read private key callback to the LMS key structure. + * + * The callback must be able to read the private key from + * non-volatile storage. + * + * @param [in, out] key LMS key. + * @param [in] read_cb Callback function that loads private key. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or read_cb is NULL. + * @return BAD_STATE_E when key state is invalid. + * */ +int wc_LmsKey_SetReadCb(LmsKey* key, wc_lms_read_private_key_cb read_cb) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (read_cb == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Changing the read callback of an already working key is forbidden. */ + if ((ret == 0) && (key->state == WC_LMS_STATE_OK)) { + WOLFSSL_MSG("error: wc_LmsKey_SetReadCb: key in use"); + ret = BAD_STATE_E; + } + + if (ret == 0) { + /* Set the callback into the key. */ + key->read_private_key = read_cb; + } + + return ret; +} + +/* Sets the context to be used by write and read callbacks. + * + * E.g. this could be a filename if the callbacks write/read to file. + * + * @param [in, out] key LMS key. + * @param [in] context Pointer to data for read/write callbacks. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or context is NULL. + * @return BAD_STATE_E when key state is invalid. + * */ +int wc_LmsKey_SetContext(LmsKey* key, void* context) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (context == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Setting context of an already working key is forbidden. */ + if ((ret == 0) && (key->state == WC_LMS_STATE_OK)) { + WOLFSSL_MSG("error: wc_LmsKey_SetContext: key in use"); + ret = BAD_STATE_E; + } + + if (ret == 0) { + /* Set the callback context into the key. */ + key->context = context; + } + + return ret; +} + +/* Make the LMS private/public key pair. The key must have its parameters + * set before calling this. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * @param [in, out] key LMS key. + * @param [in] rng Random number generator. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or rng is NULL. + * @return BAD_STATE_E when key is in an invalid state. + * @return BAD_FUNC_ARG when write callback or callback context not set. + * @return BAD_STATE_E when no more signatures can be created. + */ +int wc_LmsKey_MakeKey(LmsKey* key, WC_RNG* rng) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (rng == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Check state. */ + if ((ret == 0) && (key->state != WC_LMS_STATE_PARMSET)) { + WOLFSSL_MSG("error: LmsKey not ready for generation"); + ret = BAD_STATE_E; + } + /* Check write callback set. */ + if ((ret == 0) && (key->write_private_key == NULL)) { + WOLFSSL_MSG("error: LmsKey write callback is not set"); + ret = BAD_FUNC_ARG; + } + /* Check callback context set. */ + if ((ret == 0) && (key->context == NULL)) { + WOLFSSL_MSG("error: LmsKey context is not set"); + ret = BAD_FUNC_ARG; + } + + if ((ret == 0) && (key->priv_data == NULL)) { + const LmsParams* params = key->params; + + /* Allocate memory for the private key data. */ + key->priv_data = XMALLOC(LMS_PRIV_DATA_LEN(params->levels, + params->height, params->p, params->rootLevels, params->cacheBits), + key->heap, DYNAMIC_TYPE_LMS); + /* Check pointer is valid. */ + if (key->priv_data == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + #ifdef WOLFSSL_SMALL_STACK + LmsState* state; + #else + LmsState state[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for working state. */ + state = XMALLOC(sizeof(LmsState), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (state == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize working state for use. */ + ret = wc_lmskey_state_init(state, key->params); + if (ret == 0) { + /* Make the HSS key. */ + ret = wc_hss_make_key(state, rng, key->priv_raw, &key->priv, + key->priv_data, key->pub); + wc_lmskey_state_free(state); + } + ForceZero(state, sizeof(LmsState)); + #ifdef WOLFSSL_SMALL_STACK + XFREE(state, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + } + if (ret == 0) { + /* Write private key to storage. */ + int rv = key->write_private_key(key->priv_raw, HSS_PRIVATE_KEY_LEN, + key->context); + if (rv != WC_LMS_RC_SAVED_TO_NV_MEMORY) { + ret = IO_FAILED_E; + } + } + + /* This should not happen, but check whether signatures can be created. */ + if ((ret == 0) && (wc_LmsKey_SigsLeft(key) == 0)) { + WOLFSSL_MSG("error: generated LMS key signatures exhausted"); + key->state = WC_LMS_STATE_NOSIGS; + ret = BAD_STATE_E; + } + + if (ret == 0) { + /* Update state. */ + key->state = WC_LMS_STATE_OK; + } + + return ret; +} + +/* Reload a key that has been prepared with the appropriate params and + * data. Use this if you wish to resume signing with an existing key. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * @param [in, out] key LMS key. + * + * Returns 0 on success. */ +int wc_LmsKey_Reload(LmsKey* key) +{ + int ret = 0; + + /* Validate parameter. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + /* Check state. */ + if ((ret == 0) && (key->state != WC_LMS_STATE_PARMSET)) { + WOLFSSL_MSG("error: LmsKey not ready for reload"); + ret = BAD_STATE_E; + } + /* Check read callback present. */ + if ((ret == 0) && (key->read_private_key == NULL)) { + WOLFSSL_MSG("error: LmsKey read callback is not set"); + ret = BAD_FUNC_ARG; + } + /* Check context for callback set */ + if ((ret == 0) && (key->context == NULL)) { + WOLFSSL_MSG("error: LmsKey context is not set"); + ret = BAD_FUNC_ARG; + } + + if ((ret == 0) && (key->priv_data == NULL)) { + const LmsParams* params = key->params; + + /* Allocate memory for the private key data. */ + key->priv_data = XMALLOC(LMS_PRIV_DATA_LEN(params->levels, + params->height, params->p, params->rootLevels, params->cacheBits), + key->heap, DYNAMIC_TYPE_LMS); + /* Check pointer is valid. */ + if (key->priv_data == NULL) { + ret = MEMORY_E; + } + } + if (ret == 0) { + /* Load private key. */ + int rv = key->read_private_key(key->priv_raw, HSS_PRIVATE_KEY_LEN, + key->context); + if (rv != WC_LMS_RC_READ_TO_MEMORY) { + ret = IO_FAILED_E; + } + } + + /* Double check the key actually has signatures left. */ + if ((ret == 0) && (wc_LmsKey_SigsLeft(key) == 0)) { + WOLFSSL_MSG("error: reloaded LMS key signatures exhausted"); + key->state = WC_LMS_STATE_NOSIGS; + ret = BAD_STATE_E; + } + + if (ret == 0) { + #ifdef WOLFSSL_SMALL_STACK + LmsState* state; + #else + LmsState state[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for working state. */ + state = XMALLOC(sizeof(LmsState), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (state == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize working state for use. */ + ret = wc_lmskey_state_init(state, key->params); + if (ret == 0) { + /* Reload the key ready for signing. */ + ret = wc_hss_reload_key(state, key->priv_raw, &key->priv, + key->priv_data, NULL); + } + ForceZero(state, sizeof(LmsState)); + #ifdef WOLFSSL_SMALL_STACK + XFREE(state, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + } + + if (ret == 0) { + /* Update state. */ + key->state = WC_LMS_STATE_OK; + } + + return ret; +} + +/* Get the private key length based on parameter set of key. + * + * @param [in] key LMS key. + * @param [out] len Length of private key. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or len is NULL or parameters not set. + */ +int wc_LmsKey_GetPrivLen(const LmsKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL) || (key->params == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Return private key length from parameter set. */ + *len = HSS_PRIVATE_KEY_LEN; + } + + return ret; +} + +/* Sign a message. + * + * @param [in, out] key LMS key to sign with. + * @param [out] sig Signature data. Buffer must be big enough to hold + * signature data. + * @param [out] sigSz Length of signature data. + * @param [in] msg Message to sign. + * @param [in] msgSz Length of message in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key, sig, sigSz or msg is NULL. + * @return BAD_FUNC_ARG when msgSz is not greater than 0. + */ +int wc_LmsKey_Sign(LmsKey* key, byte* sig, word32* sigSz, const byte* msg, + int msgSz) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (sig == NULL) || (sigSz == NULL) || (msg == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (msgSz <= 0)) { + ret = BAD_FUNC_ARG; + } + /* Check state. */ + if ((ret == 0) && (key->state == WC_LMS_STATE_NOSIGS)) { + WOLFSSL_MSG("error: LMS signatures exhausted"); + ret = BAD_STATE_E; + } + if ((ret == 0) && (key->state != WC_LMS_STATE_OK)) { + /* The key had an error the last time it was used, and we + * can't guarantee its state. */ + WOLFSSL_MSG("error: can't sign, LMS key not in good state"); + ret = BAD_STATE_E; + } + + if (ret == 0) { + #ifdef WOLFSSL_SMALL_STACK + LmsState* state; + #else + LmsState state[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for working state. */ + state = XMALLOC(sizeof(LmsState), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (state == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize working state for use. */ + ret = wc_lmskey_state_init(state, key->params); + if (ret == 0) { + /* Sign message. */ + ret = wc_hss_sign(state, key->priv_raw, &key->priv, + key->priv_data, msg, msgSz, sig); + wc_lmskey_state_free(state); + } + ForceZero(state, sizeof(LmsState)); + #ifdef WOLFSSL_SMALL_STACK + XFREE(state, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + } + if (ret == 0) { + *sigSz = (word32)key->params->sig_len; + } + if (ret == 0) { + /* Write private key to storage. */ + int rv = key->write_private_key(key->priv_raw, HSS_PRIVATE_KEY_LEN, + key->context); + if (rv != WC_LMS_RC_SAVED_TO_NV_MEMORY) { + ret = IO_FAILED_E; + } + } + + return ret; +} + +/* Returns whether signatures can be created with key. + * + * @param [in] key LMS key. + * + * @return 1 if there are signatures remaining. + * @return 0 if available signatures are exhausted. + */ +int wc_LmsKey_SigsLeft(LmsKey* key) +{ + int ret = 0; + + /* NULL keys have no signatures remaining. */ + if (key != NULL) { + ret = wc_hss_sigsleft(key->params, key->priv_raw); + } + + return ret; +} + +#endif /* ifndef WOLFSSL_LMS_VERIFY_ONLY*/ + +/* Get the public key length based on parameter set of key. + * + * @param [in] key LMS key. + * @param [out] len Length of public key. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or len is NULL or parameters not set. + */ +int wc_LmsKey_GetPubLen(const LmsKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters */ + if ((key == NULL) || (len == NULL) || (key->params == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + *len = HSS_PUBLIC_KEY_LEN; + } + + return ret; +} + +/* Export a generated public key and parameter set from one LmsKey + * to another. Use this to prepare a signature verification LmsKey + * that is pub only. + * + * Though the public key is all that is used to verify signatures, + * the parameter set is needed to calculate the signature length + * before hand. + * + * @param [out] keyDst LMS key to copy into. + * @param [in] keySrc LMS key to copy. + * @return 0 on success. + * @return BAD_FUNC_ARG when keyDst or keySrc is NULL. + */ +int wc_LmsKey_ExportPub(LmsKey* keyDst, const LmsKey* keySrc) +{ + int ret = 0; + + if ((keyDst == NULL) || (keySrc == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + ForceZero(keyDst, sizeof(LmsKey)); + + keyDst->params = keySrc->params; + XMEMCPY(keyDst->pub, keySrc->pub, sizeof(keySrc->pub)); + + /* Mark this key as verify only, to prevent misuse. */ + keyDst->state = WC_LMS_STATE_VERIFYONLY; + } + + return ret; +} + +/* Exports the raw LMS public key buffer from key to out buffer. + * The out buffer should be large enough to hold the public key, and + * outLen should indicate the size of the buffer. + * + * Call wc_LmsKey_GetPubLen beforehand to determine pubLen. + * + * @param [in] key LMS key. + * @param [out] out Buffer to hold encoded public key. + * @param [in, out] outLen On in, length of out in bytes. + * On out, the length of the public key in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key, out or outLen is NULL. + * @return BUFFER_E when outLen is too small to hold encoded public key. + */ +int wc_LmsKey_ExportPubRaw(const LmsKey* key, byte* out, word32* outLen) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (out == NULL) || (outLen == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Check size of out is sufficient. */ + if ((ret == 0) && (*outLen < HSS_PUBLIC_KEY_LEN)) { + ret = BUFFER_E; + } + + if (ret == 0) { + /* Return encoded public key. */ + XMEMCPY(out, key->pub, HSS_PUBLIC_KEY_LEN); + *outLen = HSS_PUBLIC_KEY_LEN; + } + + return ret; +} + +/* Imports a raw public key buffer from in array to LmsKey key. + * + * The LMS parameters must be set first with wc_LmsKey_SetLmsParm or + * wc_LmsKey_SetParameters, and inLen must match the length returned + * by wc_LmsKey_GetPubLen. + * + * Call wc_LmsKey_GetPubLen beforehand to determine pubLen. + * + * @param [in, out] key LMS key to put public key in. + * @param [in] in Buffer holding encoded public key. + * @param [in] inLen Length of encoded public key in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or in is NULL. + * @return BUFFER_E when inLen does not match public key length by parameters. + */ +int wc_LmsKey_ImportPubRaw(LmsKey* key, const byte* in, word32 inLen) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + if ((ret == 0) && (inLen != HSS_PUBLIC_KEY_LEN)) { + /* Something inconsistent. Parameters weren't set, or input + * pub key is wrong.*/ + return BUFFER_E; + } + + if (ret == 0) { + XMEMCPY(key->pub, in, inLen); + + key->state = WC_LMS_STATE_VERIFYONLY; + } + + return ret; +} + +/* Given a levels, height, winternitz parameter set, determine + * the signature length. + * + * Call this before wc_LmsKey_Sign so you know the length of + * the required signature buffer. + * + * @param [in] key LMS key. + * @param [out] len Length of a signature in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when key or len is NULL. + */ +int wc_LmsKey_GetSigLen(const LmsKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + *len = key->params->sig_len; + } + + return ret; +} + +/* Verify the signature of the message with public key. + * + * @param [in] key LMS key. + * @param [in] sig Signature to verify. + * @param [in] sigSz Size of signature in bytes. + * @param [in] msg Message to verify. + * @param [in] msgSz Length of the message in bytes. + * @return 0 on success. + * @return BAD_FUNC_ARG when a key, sig or msg is NULL. + * @return SIG_VERIFY_E when signature did not verify message. + * @return BAD_STATE_E when wrong state for operation. + * @return BUFFER_E when sigSz is invalid for parameters. + */ +int wc_LmsKey_Verify(LmsKey* key, const byte* sig, word32 sigSz, + const byte* msg, int msgSz) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (sig == NULL) || (msg == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Check state. */ + if ((ret == 0) && (key->state != WC_LMS_STATE_OK) && + (key->state != WC_LMS_STATE_VERIFYONLY)) { + /* LMS key not ready for verification. Param str must be + * set first, and Reload() called. */ + WOLFSSL_MSG("error: LMS key not ready for verification"); + ret = BAD_STATE_E; + } + /* Check signature length. */ + if ((ret == 0) && (sigSz != key->params->sig_len)) { + ret = BUFFER_E; + } + + if (ret == 0) { + #ifdef WOLFSSL_SMALL_STACK + LmsState* state; + #else + LmsState state[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for working state. */ + state = XMALLOC(sizeof(LmsState), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (state == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize working state for use. */ + ret = wc_lmskey_state_init(state, key->params); + if (ret == 0) { + /* Verify signature of message with public key. */ + ret = wc_hss_verify(state, key->pub, msg, msgSz, sig); + wc_lmskey_state_free(state); + } + ForceZero(state, sizeof(LmsState)); + #ifdef WOLFSSL_SMALL_STACK + XFREE(state, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + } + + return ret; +} + +#endif /* WOLFSSL_HAVE_LMS && WOLFSSL_WC_LMS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms_impl.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms_impl.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms_impl.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_lms_impl.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,3092 @@ +/* wc_lms_impl.c + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Implementation based on: + * RFC 8554: Leighton-Micali Hash-Based Signatures + * https://datatracker.ietf.org/doc/html/rfc8554 + * Implementation by Sean Parkinson. + */ + +/* Possible LMS options: + * + * WC_LMS_FULL_HASH Default: OFF + * Performs a full hash instead of assuming internals. + * Enable when using hardware SHA-256. + * WOLFSSL_LMS_VERIFY_ONLY Default: OFF + * Only compiles in verification code. + * WOLFSSL_WC_LMS_SMALL Default: OFF + * Implementation is smaller code size with slow signing. + * Enable when memory is limited. + */ + +#include +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +#if defined(WOLFSSL_HAVE_LMS) && defined(WOLFSSL_WC_LMS) + +/* Length of R in bytes. */ +#define LMS_R_LEN 4 +/* Length of D in bytes. */ +#define LMS_D_LEN 2 +/* Length of checksum in bytes. */ +#define LMS_CKSM_LEN 2 + +/* Predefined values used in hashes to make them unique. */ +/* Fixed value for calculating x. */ +#define LMS_D_FIXED 0xff +/* D value when computing public key. */ +#define LMS_D_PBLC 0x8080 +/* D value when computing message. */ +#define LMS_D_MESG 0x8181 +/* D value when computing leaf node. */ +#define LMS_D_LEAF 0x8282 +/* D value when computing interior node. */ +#define LMS_D_INTR 0x8383 +/* D value when computing C, randomizer value. */ +#define LMS_D_C 0xfffd +/* D value when computing child SEED for private key. */ +#define LMS_D_CHILD_SEED 0xfffe +/* D value when computing child I for private key. */ +#define LMS_D_CHILD_I 0xffff + +/* Length of data to hash when computing seed: + * 16 + 4 + 2 + 32 = 54 */ +#define LMS_SEED_HASH_LEN \ + (LMS_I_LEN + LMS_R_LEN + LMS_D_LEN + LMS_MAX_NODE_LEN) + +/* Length of data to hash when computing a node: + * 16 + 4 + 2 + 32 + 32 = 86 */ +#define LMS_NODE_HASH_LEN \ + (LMS_I_LEN + LMS_R_LEN + LMS_D_LEN + 2 * LMS_MAX_NODE_LEN) + +/* Length of data to hash when computing most results: + * 16 + 4 + 2 + 1 + 32 = 55 */ +#define LMS_HASH_BUFFER_LEN \ + (LMS_I_LEN + LMS_Q_LEN + LMS_P_LEN + LMS_W_LEN + LMS_MAX_NODE_LEN) + +/* Length of data to hash when computing Q: + * 16 + 4 + 2 + 32 = 54 */ +#define LMS_Q_BUFFER_LEN \ + (LMS_I_LEN + LMS_Q_LEN + LMS_P_LEN + LMS_MAX_NODE_LEN) + +/* Length of preliminary data to hash when computing K: + * 16 + 4 + 2 = 22 */ +#define LMS_K_PRE_LEN (LMS_I_LEN + LMS_Q_LEN + LMS_P_LEN) + +/* Length of preliminary data to hash when computing message hash: + * 16 + 4 + 2 = 22 */ +#define LMS_MSG_PRE_LEN (LMS_I_LEN + LMS_Q_LEN + LMS_P_LEN) + + +#ifdef WC_LMS_DEBUG_PRINT_DATA +/* Print data when dubgging implementation. + * + * @param [in] name String to print before data. + * @param [in] data Array of bytes. + * @param [in] len Length of data in array. + */ +static void print_data(const char* name, const byte* data, int len) +{ + int i; + + fprintf(stderr, "%6s: ", name); + for (i = 0; i < len; i++) { + fprintf(stderr, "%02x", data[i]); + } + fprintf(stderr, "\n"); +} +#endif + +/*************************************** + * Index APIs + **************************************/ + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* Zero index. + * + * @param [out] a Byte array. Big-endian encoding. + * @param [in] len Length of array in bytes. + */ +static WC_INLINE void wc_lms_idx_zero(unsigned char* a, int len) +{ + XMEMSET(a, 0, len); +} + +/* Increment big-endian value. + * + * @param [in, out] a Byte array. Big-endian encoding. + * @param [in] len Length of array in bytes. + */ +static WC_INLINE void wc_lms_idx_inc(unsigned char* a, int len) +{ + int i; + + /* Starting at least-significant byte up to most. */ + for (i = len - 1; i >= 0; i--) { + /* Add one/carry to byte. */ + if ((++a[i]) != 0) { + /* No more carry. */ + break; + } + } +} +#endif /* !WOLFSSL_LMS_VERIFY_ONLY */ + +/*************************************** + * Hash APIs + **************************************/ + +/* Set hash data and length into SHA-256 digest. + * + * @param [in, out] state SHA-256 digest object. + * @param [in] data Data to add to hash. + * @param [in] len Number of bytes in data. Must be less than a block. + */ +#define LMS_SHA256_SET_DATA(sha256, data, len) \ +do { \ + XMEMCPY((sha256)->buffer, (data), (len)); \ + (sha256)->buffLen = (len); \ + (sha256)->loLen = (len); \ +} while (0) + +/* Add hash data and length into SHA-256 digest. + * + * @param [in, out] state SHA-256 digest object. + * @param [in] data Data to add to hash. + * @param [in] len Number of bytes in data. Must be less than a block. + */ +#define LMS_SHA256_ADD_DATA(sha256, data, len) \ +do { \ + XMEMCPY((byte*)(sha256)->buffer + (sha256)->buffLen, (data), (len)); \ + (sha256)->buffLen += (len); \ + (sha256)->loLen += (len); \ +} while (0) + +/* Set the length of 54 bytes in buffer as per SHA-256 final operation. + * + * @param [in, out] buffer Hash data buffer to add length to. + */ +#define LMS_SHA256_SET_LEN_54(buffer) \ +do { \ + (buffer)[54] = 0x80; \ + (buffer)[55] = 0x00; \ + (buffer)[56] = 0x00; \ + (buffer)[57] = 0x00; \ + (buffer)[58] = 0x00; \ + (buffer)[59] = 0x00; \ + (buffer)[60] = 0x00; \ + (buffer)[61] = 0x00; \ + (buffer)[62] = 0x01; \ + (buffer)[63] = 0xb0; \ +} while (0) + +/* Set the length of 55 bytes in buffer as per SHA-256 final operation. + * + * @param [in, out] buffer Hash data buffer to add length to. + */ +#define LMS_SHA256_SET_LEN_55(buffer) \ +do { \ + (buffer)[55] = 0x80; \ + (buffer)[56] = 0x00; \ + (buffer)[57] = 0x00; \ + (buffer)[58] = 0x00; \ + (buffer)[59] = 0x00; \ + (buffer)[60] = 0x00; \ + (buffer)[61] = 0x00; \ + (buffer)[62] = 0x01; \ + (buffer)[63] = 0xb8; \ +} while (0) + +#ifndef WC_LMS_FULL_HASH +/* Hash one full block of data and compute result. + * + * @param [in] sha256 SHA-256 hash object. + * @param [in] data Data to hash. + * @param [out] hash Hash output. + * @return 0 on success. + */ +static WC_INLINE int wc_lms_hash_block(wc_Sha256* sha256, const byte* data, + byte* hash) +{ + /* Hash the block and reset SHA-256 state. */ + return wc_Sha256HashBlock(sha256, data, hash); +} +#endif /* !WC_LMS_FULL_HASH */ + +/* Hash data and compute result. + * + * @param [in] sha256 SHA-256 hash object. + * @param [in] data Data to hash. + * @param [in] len Length of data to hash. + * @param [out] hash Hash output. + * @return 0 on success. + */ +static WC_INLINE int wc_lms_hash(wc_Sha256* sha256, byte* data, word32 len, + byte* hash) +{ + int ret; + +#ifndef WC_LMS_FULL_HASH + if (len < WC_SHA256_BLOCK_SIZE) { + /* Store data into SHA-256 object's buffer. */ + LMS_SHA256_SET_DATA(sha256, data, len); + ret = wc_Sha256Final(sha256, hash); + } + else if (len < WC_SHA256_BLOCK_SIZE + WC_SHA256_PAD_SIZE) { + ret = wc_Sha256HashBlock(sha256, data, NULL); + if (ret == 0) { + byte* buffer = (byte*)sha256->buffer; + int rem = len - WC_SHA256_BLOCK_SIZE; + + XMEMCPY(buffer, data + WC_SHA256_BLOCK_SIZE, rem); + buffer[rem++] = 0x80; + XMEMSET(buffer + rem, 0, WC_SHA256_BLOCK_SIZE - 2 - rem); + buffer[WC_SHA256_BLOCK_SIZE - 2] = (byte)(len >> 5); + buffer[WC_SHA256_BLOCK_SIZE - 1] = (byte)(len << 3); + ret = wc_Sha256HashBlock(sha256, buffer, hash); + } + } + else { + ret = wc_Sha256Update(sha256, data, len); + if (ret == 0) { + ret = wc_Sha256Final(sha256, hash); + } + } +#else + ret = wc_Sha256Update(sha256, data, len); + if (ret == 0) { + ret = wc_Sha256Final(sha256, hash); + } +#endif /* !WC_LMS_FULL_HASH */ + + return ret; +} + +/* Update hash with first data. + * + * Sets the data directly into SHA-256's buffer if valid. + * + * @param [in] sha256 SHA-256 hash object. + * @param [in] data Data to hash. + * @param [in] len Length of data to hash. + * @return 0 on success. + */ +static WC_INLINE int wc_lms_hash_first(wc_Sha256* sha256, const byte* data, + word32 len) +{ + int ret = 0; + +#ifndef WC_LMS_FULL_HASH + if (len < WC_SHA256_BLOCK_SIZE) { + /* Store data into SHA-256 object's buffer. */ + LMS_SHA256_SET_DATA(sha256, data, len); + } + else +#endif /* !WC_LMS_FULL_HASH */ + { + ret = wc_Sha256Update(sha256, data, len); + } + + return ret; +} + +/* Update hash with further data. + * + * Adds the data directly into SHA-256's buffer if valid. + * + * @param [in] sha256 SHA-256 hash object. + * @param [in] data Data to hash. + * @param [in] len Length of data to hash. + * @return 0 on success. + */ +static WC_INLINE int wc_lms_hash_update(wc_Sha256* sha256, const byte* data, + word32 len) +{ + int ret = 0; + +#ifndef WC_LMS_FULL_HASH + if (sha256->buffLen + len < WC_SHA256_BLOCK_SIZE) { + /* Add data to SHA-256 object's buffer. */ + LMS_SHA256_ADD_DATA(sha256, data, len); + } + else if (sha256->buffLen + len < 2 * WC_SHA256_BLOCK_SIZE) { + byte* buffer = (byte*)sha256->buffer; + + XMEMCPY(buffer + sha256->buffLen, data, + WC_SHA256_BLOCK_SIZE - sha256->buffLen); + ret = wc_Sha256HashBlock(sha256, buffer, NULL); + if (ret == 0) { + int rem = len - (WC_SHA256_BLOCK_SIZE - sha256->buffLen); + XMEMCPY(buffer, data + WC_SHA256_BLOCK_SIZE - sha256->buffLen, rem); + sha256->buffLen = rem; + sha256->loLen += len; + } + } + else { + ret = wc_Sha256Update(sha256, data, len); + } +#else + ret = wc_Sha256Update(sha256, data, len); +#endif /* !WC_LMS_FULL_HASH */ + + return ret; +} + +/* Finalize hash. + * + * @param [in] sha256 SHA-256 hash object. + * @param [out] hash Hash output. + * @return 0 on success. + */ +static WC_INLINE int wc_lms_hash_final(wc_Sha256* sha256, byte* hash) +{ +#ifndef WC_LMS_FULL_HASH + int ret = 0; + byte* buffer = (byte*)sha256->buffer; + + buffer[sha256->buffLen++] = 0x80; + if (sha256->buffLen > WC_SHA256_PAD_SIZE) { + XMEMSET(buffer + sha256->buffLen, 0, + WC_SHA256_BLOCK_SIZE - sha256->buffLen); + ret = wc_Sha256HashBlock(sha256, buffer, NULL); + sha256->buffLen = 0; + } + if (ret == 0) { + XMEMSET(buffer + sha256->buffLen, 0, + WC_SHA256_BLOCK_SIZE - 8 - sha256->buffLen); + sha256->hiLen = (sha256->hiLen << 3) + (sha256->loLen >> 29); + sha256->loLen = sha256->loLen << 3; + #ifdef LITTLE_ENDIAN_ORDER + sha256->buffer[14] = ByteReverseWord32(sha256->hiLen); + sha256->buffer[15] = ByteReverseWord32(sha256->loLen); + #else + sha256->buffer[14] = sha256->hiLen; + sha256->buffer[15] = sha256->loLen; + #endif + ret = wc_Sha256HashBlock(sha256, buffer, hash); + sha256->buffLen = 0; + sha256->hiLen = 0; + sha256->loLen = 0; + } + + return ret; +#else + return wc_Sha256Final(sha256, hash); +#endif +} + +/*************************************** + * LM-OTS APIs + **************************************/ + +/* Expand Q to and array of Winternitz width bits values plus checksum. + * + * Supported Winternitz widths: 8, 4, 2, 1. + * + * Algorithm 2: Checksum Calculation + * sum = 0 + * for ( i = 0; i < (n*8/w); i = i + 1 ) { + * sum = sum + (2^w - 1) - coef(S, i, w) + * } + * return (sum << ls) + * Section 3.1.3: Strings of w-Bit Elements + * coef(S, i, w) = (2^w - 1) AND + * ( byte(S, floor(i * w / 8)) >> + * (8 - (w * (i % (8 / w)) + w)) ) + * Combine coefficient expansion with checksum calculation. + * + * @param [in] q Q array of bytes. + * @param [in] n Number of bytes in Q. + * @param [in] w Winternitz width in bits. + * @param [in] ls Left shift of checksum. + * @param [out] qe Expanded Q with checksum. + * @return 0 on success. + * @return BAD_FUNC_ARG when Winternitz width is not supported. + */ +static WC_INLINE int wc_lmots_q_expand(byte* q, word8 n, word8 w, word8 ls, + byte* qe) +{ + int ret = 0; + word16 sum; + unsigned int i; + +#ifndef WOLFSSL_WC_LMS_SMALL + switch (w) { + /* Winternitz width of 8. */ + case 8: + /* No expansion required, just copy. */ + XMEMCPY(qe, q, n); + /* Start sum with all 2^w - 1s and subtract from that. */ + sum = 0xff * n; + /* For each byte of the hash. */ + for (i = 0; i < n; i++) { + /* Subtract coefficient from sum. */ + sum -= q[i]; + } + /* Put coefficients of checksum on the end. */ + qe[n + 0] = (word8)(sum >> 8); + qe[n + 1] = (word8)(sum ); + break; + /* Winternitz width of 4. */ + case 4: + sum = 2 * 0xf * n; + /* For each byte of the hash. */ + for (i = 0; i < n; i++) { + /* Get coefficient. */ + qe[0] = (q[i] >> 4) ; + qe[1] = (q[i] ) & 0xf; + /* Subtract coefficients from sum. */ + sum -= qe[0]; + sum -= qe[1]; + /* Move to next coefficients. */ + qe += 2; + } + /* Put coefficients of checksum on the end. */ + qe[0] = (word8)((sum >> 8) & 0xf); + qe[1] = (word8)((sum >> 4) & 0xf); + qe[2] = (word8)((sum ) & 0xf); + break; + /* Winternitz width of 2. */ + case 2: + sum = 4 * 0x3 * n; + /* For each byte of the hash. */ + for (i = 0; i < n; i++) { + /* Get coefficients. */ + qe[0] = (q[i] >> 4) ; + qe[0] = (q[i] >> 6) ; + qe[1] = (q[i] >> 4) & 0x3; + qe[2] = (q[i] >> 2) & 0x3; + qe[3] = (q[i] ) & 0x3; + /* Subtract coefficients from sum. */ + sum -= qe[0]; + sum -= qe[1]; + sum -= qe[2]; + sum -= qe[3]; + /* Move to next coefficients. */ + qe += 4; + } + /* Put coefficients of checksum on the end. */ + qe[0] = (word8)((sum >> 8) & 0x3); + qe[1] = (word8)((sum >> 6) & 0x3); + qe[2] = (word8)((sum >> 4) & 0x3); + qe[3] = (word8)((sum >> 2) & 0x3); + qe[4] = (word8)((sum ) & 0x3); + break; + /* Winternitz width of 1. */ + case 1: + sum = 8 * 0x01 * n; + /* For each byte of the hash. */ + for (i = 0; i < n; i++) { + /* Get coefficients. */ + qe[0] = (q[i] >> 4) ; + qe[0] = (q[i] >> 7) ; + qe[1] = (q[i] >> 6) & 0x1; + qe[2] = (q[i] >> 5) & 0x1; + qe[3] = (q[i] >> 4) & 0x1; + qe[4] = (q[i] >> 3) & 0x1; + qe[5] = (q[i] >> 2) & 0x1; + qe[6] = (q[i] >> 1) & 0x1; + qe[7] = (q[i] ) & 0x1; + /* Subtract coefficients from sum. */ + sum -= qe[0]; + sum -= qe[1]; + sum -= qe[2]; + sum -= qe[3]; + sum -= qe[4]; + sum -= qe[5]; + sum -= qe[6]; + sum -= qe[7]; + /* Move to next coefficients. */ + qe += 8; + } + /* Put coefficients of checksum on the end. */ + qe[0] = (word8)((sum >> 8) ); + qe[1] = (word8)((sum >> 7) & 0x1); + qe[2] = (word8)((sum >> 6) & 0x1); + qe[3] = (word8)((sum >> 5) & 0x1); + qe[4] = (word8)((sum >> 4) & 0x1); + qe[5] = (word8)((sum >> 3) & 0x1); + qe[6] = (word8)((sum >> 2) & 0x1); + qe[7] = (word8)((sum >> 1) & 0x1); + qe[8] = (word8)((sum ) & 0x1); + break; + default: + ret = BAD_FUNC_ARG; + break; + } + + (void)ls; +#else + int j; + + if ((w != 8) && (w != 4) && (w != 2) && (w != 1)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Start sum with all 2^w - 1s and subtract from that. */ + sum = ((1 << w) - 1) * ((n * 8) / w); + /* For each byte of the hash. */ + for (i = 0; i < n; i++) { + /* Get next byte. */ + byte a = *(q++); + /* For each width bits of byte. */ + for (j = 8 - w; j >= 0; j -= w) { + /* Get coefficient. */ + *qe = a >> (8 - w); + /* Subtract coefficient from sum. */ + sum -= *qe; + /* Move to next coefficient. */ + qe++; + /* Remove width bits. */ + a <<= w; + } + } + /* Shift sum up as required to pack it on the end of hash. */ + sum <<= ls; + /* For each width buts of checksum. */ + for (j = 16 - w; j >= ls; j--) { + /* Get coefficient. */ + *(qe++) = sum >> (16 - w); + /* Remove width bits. */ + sum <<= w; + } + } +#endif /* !WOLFSSL_WC_LMS_SMALL */ + + return ret; +} + +/* Calculate the hash for the message. + * + * Algorithm 3: Generating a One-Time Signature From a Private Key and a + * Message + * ... + * 5. Compute the array y as follows: + * Q = H(I || u32str(q) || u16str(D_MESG) || C || message) + * Algorithm 4b: Computing a Public Key Candidate Kc from a Signature, + * Message, Signature Typecode pubtype, and Identifiers I, q + * ... + * 3. Compute the string Kc as follows: + * Q = H(I || u32str(q) || u16str(D_MESG) || C || message) + * + * @param [in, out] state LMS state. + * @param [in] msg Message to hash. + * @param [in] msgSz Length of message in bytes. + * @param [in] c C or randomizer value. + * @param [out] q Computed Q value. + * @return 0 on success. + */ +static int wc_lmots_msg_hash(LmsState* state, const byte* msg, word32 msgSz, + const byte* c, byte* q) +{ + int ret; + byte* buffer = state->buffer; + byte* ip = buffer + LMS_I_LEN + LMS_Q_LEN; + + /* I || u32str(q) || u16str(D_MESG) */ + c16toa(LMS_D_MESG, ip); + /* H(I || u32str(q) || u16str(D_MESG) || ...) */ + ret = wc_lms_hash_first(&state->hash, buffer, LMS_MSG_PRE_LEN); + if (ret == 0) { + /* H(... || C || ...) */ + ret = wc_lms_hash_update(&state->hash, c, LMS_MAX_NODE_LEN); + } + if (ret == 0) { + /* H(... || message) */ + ret = wc_lms_hash_update(&state->hash, msg, msgSz); + } + if (ret == 0) { + /* Q = H(...) */ + ret = wc_lms_hash_final(&state->hash, q); + } + + return ret; +} + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* Compute array y, intermediates of public key calculation, for signature. + * + * Verification will perform the remaining iterations of hashing. + * + * Algorithm 3: Generating a One-Time Signature From a Private Key and a + * Message + * ... + * 5. Compute the array y as follows: + * Q = H(I || u32str(q) || u16str(D_MESG) || C || message) + * for ( i = 0; i < p; i = i + 1 ) { + * a = coef(Q || Cksm(Q), i, w) + * tmp = x[i] + * for ( j = 0; j < a; j = j + 1 ) { + * tmp = H(I || u32str(q) || u16str(i) || u8str(j) || tmp) + * } + * y[i] = tmp + * } + * x[i] can be calculated on the fly using psueodo key generation in Appendix A. + * Appendix A, The elements of the LM-OTS private keys are computed as: + * x_q[i] = H(I || u32str(q) || u16str(i) || u8str(0xff) || SEED). + * + * @param [in, out] state LMS state. + * @param [in] seed Seed to hash. + * @param [in] msg Message to sign. + * @param [in] msgSZ Length of message in bytes. + * @param [in] c C or randomizer value to hash. + * @param [out] y Calculated intermediate hashes. + * @return 0 on success. + */ +static int wc_lmots_compute_y_from_seed(LmsState* state, const byte* seed, + const byte* msg, word32 msgSz, const byte* c, byte* y) +{ + const LmsParams* params = state->params; + int ret = 0; + word16 i; + byte q[LMS_MAX_NODE_LEN + LMS_CKSM_LEN]; +#ifdef WOLFSSL_SMALL_STACK + byte* a = state->a; +#else + byte a[LMS_MAX_P]; +#endif /* WOLFSSL_SMALL_STACK */ + byte* buffer = state->buffer; + byte* ip = buffer + LMS_I_LEN + LMS_Q_LEN; + byte* jp = ip + LMS_P_LEN; + byte* tmp = jp + LMS_W_LEN; + + /* Q = H(I || u32str(q) || u16str(D_MESG) || C || message) */ + ret = wc_lmots_msg_hash(state, msg, msgSz, c, q); + if (ret == 0) { + /* Calculate checksum list all coefficients. */ + ret = wc_lmots_q_expand(q, LMS_MAX_NODE_LEN, params->width, params->ls, + a); + } + #ifndef WC_LMS_FULL_HASH + if (ret == 0) { + /* Put in padding for final block. */ + LMS_SHA256_SET_LEN_55(buffer); + } + #endif /* !WC_LMS_FULL_HASH */ + + /* Compute y for each coefficient. */ + for (i = 0; (ret == 0) && (i < params->p); i++) { + unsigned int j; + + /* tmp = x[i] + * = H(I || u32str(q) || u16str(i) || u8str(0xff) || SEED). */ + c16toa(i, ip); + *jp = LMS_D_FIXED; + XMEMCPY(tmp, seed, LMS_SEED_LEN); + #ifndef WC_LMS_FULL_HASH + ret = wc_lms_hash_block(&state->hash, buffer, tmp); + #else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, tmp); + #endif /* !WC_LMS_FULL_HASH */ + + /* Apply the hash function coefficient number of times. */ + for (j = 0; (ret == 0) && (j < a[i]); j++) { + /* I || u32str(q) || u16str(i) || u8str(j) || tmp */ + *jp = j; + /* tmp = H(I || u32str(q) || u16str(i) || u8str(j) || tmp) */ + #ifndef WC_LMS_FULL_HASH + ret = wc_lms_hash_block(&state->hash, buffer, tmp); + #else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, tmp); + #endif /* !WC_LMS_FULL_HASH */ + } + + if (ret == 0) { + /* y[i] = tmp */ + XMEMCPY(y, tmp, LMS_MAX_NODE_LEN); + y += LMS_MAX_NODE_LEN; + } + } + + return ret; +} +#endif /* !WOLFSSL_LMS_VERIFY_ONLY */ + +/* Compute public key candidate K from signature. + * + * Signing performed the first coefficient number of iterations of hashing. + * + * Algorithm 4b: Computing a Public Key Candidate Kc from a Signature, + * Message, Signature Typecode pubtype, and Identifiers I, q + * ... + * 3. Compute the string Kc as follows: + * Q = H(I || u32str(q) || u16str(D_MESG) || C || message) + * for ( i = 0; i < p; i = i + 1 ) { + * a = coef(Q || Cksm(Q), i, w) + * tmp = y[i] + * for ( j = a; j < 2^w - 1; j = j + 1 ) { + * tmp = H(I || u32str(q) || u16str(i) || u8str(j) || tmp) + * } + * z[i] = tmp + * } + * Kc = H(I || u32str(q) || u16str(D_PBLC) || + * z[0] || z[1] || ... || z[p-1]) + * 4, Return Kc. + * + * @param [in, out] state LMS state. + * @param [in] msg Message to compute Kc for. + * @param [in] msgSz Length of message in bytes. + * @param [in] c C or randomizer value from signature. + * @param [in] sig_y Part of signature containing array y. + * @param [out] kc Kc or public key candidate K. + * @return 0 on success. + */ +static int wc_lmots_compute_kc_from_sig(LmsState* state, const byte* msg, + word32 msgSz, const byte* c, const byte* sig_y, byte* kc) +{ + const LmsParams* params = state->params; + int ret; + word16 i; + byte q[LMS_MAX_NODE_LEN + LMS_CKSM_LEN]; +#ifdef WOLFSSL_SMALL_STACK + byte* a = state->a; +#else + byte a[LMS_MAX_P]; +#endif /* WOLFSSL_SMALL_STACK */ + byte* buffer = state->buffer; + byte* ip = buffer + LMS_I_LEN + LMS_Q_LEN; + byte* jp = ip + LMS_P_LEN; + byte* tmp = jp + LMS_W_LEN; + unsigned int max = ((unsigned int)1 << params->width) - 1; + + /* I || u32str(q) || u16str(D_PBLC). */ + c16toa(LMS_D_PBLC, ip); + /* H(I || u32str(q) || u16str(D_PBLC) || ...). */ + ret = wc_lms_hash_first(&state->hash_k, buffer, LMS_K_PRE_LEN); + if (ret == 0) { + /* Q = H(I || u32str(q) || u16str(D_MESG) || C || message) */ + ret = wc_lmots_msg_hash(state, msg, msgSz, c, q); + } + if (ret == 0) { + /* Calculate checksum list all coefficients. */ + ret = wc_lmots_q_expand(q, LMS_MAX_NODE_LEN, params->width, params->ls, + a); + } + #ifndef WC_LMS_FULL_HASH + if (ret == 0) { + /* Put in padding for final block. */ + LMS_SHA256_SET_LEN_55(buffer); + } + #endif /* !WC_LMS_FULL_HASH */ + + /* Compute z for each coefficient. */ + for (i = 0; (ret == 0) && (i < params->p); i++) { + unsigned int j; + + /* I || u32(str) || u16str(i) || ... */ + c16toa(i, ip); + + /* tmp = y[i]. + * I || u32(str) || u16str(i) || ... || tmp */ + XMEMCPY(tmp, sig_y, LMS_MAX_NODE_LEN); + sig_y += LMS_MAX_NODE_LEN; + + /* Finish iterations of hash from coefficient to max. */ + for (j = a[i]; (ret == 0) && (j < max); j++) { + /* I || u32str(q) || u16str(i) || u8str(j) || tmp */ + *jp = (word8)j; + /* tmp = H(I || u32str(q) || u16str(i) || u8str(j) || tmp) */ + #ifndef WC_LMS_FULL_HASH + ret = wc_lms_hash_block(&state->hash, buffer, tmp); + #else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, tmp); + #endif /* !WC_LMS_FULL_HASH */ + } + + if (ret == 0) { + /* H(... || z[i] || ...) (for calculating Kc). */ + ret = wc_lms_hash_update(&state->hash_k, tmp, LMS_MAX_NODE_LEN); + } + } + + if (ret == 0) { + /* Kc = H(...) */ + ret = wc_lms_hash_final(&state->hash_k, kc); + } + + return ret; +} + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* Generate LM-OTS public key. + * + * Caller set: state->buffer = I || u32str(q) + * + * Algorithm 1: Generating a One-Time Signature Public Key From a Private Key + * ... + * 4. Compute the string K as follows: + * for ( i = 0; i < p; i = i + 1 ) { + * tmp = x[i] + * for ( j = 0; j < 2^w - 1; j = j + 1 ) { + * tmp = H(I || u32str(q) || u16str(i) || u8str(j) || tmp) + * } + * y[i] = tmp + * } + * K = H(I || u32str(q) || u16str(D_PBLC) || y[0] || ... || y[p-1]) + * ... + * x[i] can be calculated on the fly using psueodo key generation in Appendix A. + * Appendix A, The elements of the LM-OTS private keys are computed as: + * x_q[i] = H(I || u32str(q) || u16str(i) || u8str(0xff) || SEED). + * + * @param [in, out] state LMS state. + * @param [in] seed Seed to hash. + * @param [out] k K, the public key hash, or OTS_PUB_HASH + */ +static int wc_lmots_make_public_hash(LmsState* state, const byte* seed, byte* k) +{ + const LmsParams* params = state->params; + int ret; + word16 i; + byte* buffer = state->buffer; + byte* ip = buffer + LMS_I_LEN + LMS_Q_LEN; + byte* jp = ip + LMS_P_LEN; + byte* tmp = jp + LMS_W_LEN; + unsigned int max = ((unsigned int)1 << params->width) - 1; + + /* I || u32str(q) || u16str(D_PBLC). */ + c16toa(LMS_D_PBLC, ip); + /* K = H(I || u32str(q) || u16str(D_PBLC) || ...) */ + ret = wc_lms_hash_first(&state->hash_k, buffer, LMS_K_PRE_LEN); + +#ifndef WC_LMS_FULL_HASH + /* Put in padding for final block. */ + LMS_SHA256_SET_LEN_55(buffer); +#endif /* !WC_LMS_FULL_HASH */ + + for (i = 0; (ret == 0) && (i < params->p); i++) { + unsigned int j; + + /* tmp = x[i] + * = H(I || u32str(q) || u16str(i) || u8str(0xff) || SEED). */ + c16toa(i, ip); + *jp = LMS_D_FIXED; + XMEMCPY(tmp, seed, LMS_SEED_LEN); + #ifndef WC_LMS_FULL_HASH + ret = wc_lms_hash_block(&state->hash, buffer, tmp); + #else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, tmp); + #endif /* !WC_LMS_FULL_HASH */ + /* Do all iterations to calculate y. */ + for (j = 0; (ret == 0) && (j < max); j++) { + /* I || u32str(q) || u16str(i) || u8str(j) || tmp */ + *jp = (word8)j; + /* tmp = H(I || u32str(q) || u16str(i) || u8str(j) || tmp) */ + #ifndef WC_LMS_FULL_HASH + ret = wc_lms_hash_block(&state->hash, buffer, tmp); + #else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, tmp); + #endif /* !WC_LMS_FULL_HASH */ + } + if (ret == 0) { + /* K = H(... || y[i] || ...) */ + ret = wc_lms_hash_update(&state->hash_k, tmp, LMS_MAX_NODE_LEN); + } + } + if (ret == 0) { + /* K = H(I || u32str(q) || u16str(D_PBLC) || y[0] || ... || y[p-1]) */ + ret = wc_lms_hash_final(&state->hash_k, k); + } + + return ret; +} + +/* Encode the LM-OTS public key. + * + * Encoded into public key and signature if more than one level. + * T[1] is already in place. Putting in: type, ostype and I. + * + * Section 4.3: + * u32str(type) || u32str(otstype) || I || T[1] + * + * @param [in] params LMS parameters. + * @param [in] priv LMS private ley. + * @param [out] pub LMS public key. + */ +static void wc_lmots_public_key_encode(const LmsParams* params, + const byte* priv, byte* pub) +{ + const byte* priv_i = priv + LMS_Q_LEN + LMS_SEED_LEN; + + /* u32str(type) || ... || T(1) */ + c32toa(params->lmsType, pub); + pub += 4; + /* u32str(type) || u32str(otstype) || ... || T(1) */ + c32toa(params->lmOtsType, pub); + pub += 4; + /* u32str(type) || u32str(otstype) || I || T(1) */ + XMEMCPY(pub, priv_i, LMS_I_LEN); +} +#endif /* !WOLFSSL_LMS_VERIFY_ONLY */ + +/* Check the public key matches the parameters. + * + * @param [in] params LMS parameters. + * @param [in] pub Public key. + * @return 0 on success. + * @return PUBLIC_KEY_E when LMS or LM-OTS type doesn't match. + */ +static int wc_lmots_public_key_check(const LmsParams* params, const byte* pub) +{ + int ret = 0; + word32 type; + + /* Get message hash and height type. */ + ato32(pub, &type); + pub += 4; + /* Compare with parameters. */ + if (type != params->lmsType) { + ret = PUBLIC_KEY_E; + } + if (ret == 0) { + /* Get node hash and Winternitz width type. */ + ato32(pub, &type); + /* Compare with parameters. */ + if (type != params->lmOtsType) { + ret = PUBLIC_KEY_E; + } + } + + return ret; +} + +/* Calculate public key candidate K from signature. + * + * Algorithm 4b: Computing a Public Key Candidate Kc from a Signature, + * Message, Signature Typecode pubtype, and Identifiers I, q + * ... + * 2. Parse sigtype, C, and y from the signature as follows: + * a. sigtype = strTou32(first 4 bytes of signature) + * b. If sigtype is not equal to pubtype, return INVALID. + * ... + * d. C = next n bytes of signature + * e. y[0] = next n bytes of signature + * y[1] = next n bytes of signature + * ... + * y[p-1] = next n bytes of signature + * 3. Compute the string Kc as follows: + * ... + * + * @param [in, out] state LMS state. + * @param [in] pub LMS public key. + * @param [in] msg Message/next private key to verify. + * @param [in] msgSz Length of message in bytes. + * @param [in] sig Signature including type, C and y[0..p-1]. + * @param [out] kc Public key candidate Kc. + */ +static int wc_lmots_calc_kc(LmsState* state, const byte* pub, const byte* msg, + word32 msgSz, const byte* sig, byte* kc) +{ + int ret = 0; + + /* Check signature type. */ + if (XMEMCMP(pub, sig, LMS_TYPE_LEN) != 0) { + ret = SIG_TYPE_E; + } + if (ret == 0) { + /* Get C or randomizer value from signature. */ + const byte* c = sig + LMS_TYPE_LEN; + /* Get array y from signature. */ + const byte* y = c + LMS_MAX_NODE_LEN; + + /* Compute the public key candidate Kc from the signature. */ + ret = wc_lmots_compute_kc_from_sig(state, msg, msgSz, c, y, kc); + } + + return ret; +} + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* Generate LM-OTS private key. + * + * Algorithm 5: Computing an LMS Private Key + * But use Appendix A to generate x on the fly. + * PRIV = SEED | I + * + * @param [in] rng Random number generator. + * @param [out] priv Private key data. + */ +static int wc_lmots_make_private_key(WC_RNG* rng, byte* priv) +{ + return wc_RNG_GenerateBlock(rng, priv, LMS_SEED_LEN + LMS_I_LEN); +} + +/* Generate LM-OTS signature. + * + * Algorithm 3: Generating a One-Time Signature From a Private Key and a + * Message + * ... + * 4. Set C to a uniformly random n-byte string + * 5. Compute the array y as follows: + * ... + * 6. Return u32str(type) || C || y[0] || ... || y[p-1] + * + * @param [in, out] state LMS state. + * @param [in] seed Private key seed. + * @param [in] msg Message to be signed. + * @param [in] msgSz Length of message in bytes. + * @param [out] sig Signature buffer. + * @return 0 on success. + */ +static int wc_lmots_sign(LmsState* state, const byte* seed, const byte* msg, + word32 msgSz, byte* sig) +{ + int ret; + byte* buffer = state->buffer; + byte* ip = buffer + LMS_I_LEN + LMS_Q_LEN; + byte* jp = ip + LMS_P_LEN; + byte* tmp = jp + LMS_W_LEN; + byte* sig_c = sig; + + /* I || u32str(q) || u16str(0xFFFD) || ... */ + c16toa(LMS_D_C, ip); + /* I || u32str(q) || u16str(0xFFFD) || u8str(0xFF) || ... */ + *jp = LMS_D_FIXED; + /* I || u32str(q) || u16str(0xFFFD) || u8str(0xFF) || SEED */ + XMEMCPY(tmp, seed, LMS_SEED_LEN); + /* C = H(I || u32str(q) || u16str(0xFFFD) || u8str(0xFF) || SEED) + * sig = u32str(type) || C || ... */ +#ifndef WC_LMS_FULL_HASH + /* Put in padding for final block. */ + LMS_SHA256_SET_LEN_55(buffer); + ret = wc_lms_hash_block(&state->hash, buffer, sig_c); +#else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, sig_c); +#endif /* !WC_LMS_FULL_HASH */ + + if (ret == 0) { + byte* sig_y = sig_c + LMS_MAX_NODE_LEN; + + /* Compute array y. + * sig = u32str(type) || C || y[0] || ... || y[p-1] */ + ret = wc_lmots_compute_y_from_seed(state, seed, msg, msgSz, sig_c, + sig_y); + } + + return ret; +} +#endif /* WOLFSSL_LMS_VERIFY_ONLY */ + +/*************************************** + * LMS APIs + **************************************/ + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +#ifndef WOLFSSL_WC_LMS_SMALL +/* Load the LMS private state from data. + * + * @param [in] params LMS parameters. + * @param [out] state Private key state. + * @param [in] priv_data Private key data. + */ +static void wc_lms_priv_state_load(const LmsParams* params, LmsPrivState* state, + byte* priv_data) +{ + /* Authentication path data. */ + state->auth_path = priv_data; + priv_data += params->height * LMS_MAX_NODE_LEN; + + /* Stack of nodes. */ + state->stack.stack = priv_data; + priv_data += (params->height + 1) * LMS_MAX_NODE_LEN; + ato32(priv_data, &state->stack.offset); + priv_data += 4; + + /* Cached root nodes. */ + state->root = priv_data; + priv_data += LMS_ROOT_CACHE_LEN(params->rootLevels); + + /* Cached leaf nodes. */ + state->leaf.cache = priv_data; + priv_data += LMS_LEAF_CACHE_LEN(params->cacheBits); + ato32(priv_data, &state->leaf.idx); + priv_data += 4; + ato32(priv_data, &state->leaf.offset); + /* priv_data += 4; */ +} + +/* Store the LMS private state into data. + * + * @param [in] params LMS parameters. + * @param [in] state Private key state. + * @param [in, out] priv_data Private key data. + */ +static void wc_lms_priv_state_store(const LmsParams* params, + LmsPrivState* state, byte* priv_data) +{ + /* Authentication path data. */ + priv_data += params->height * LMS_MAX_NODE_LEN; + + /* Stack of nodes. */ + priv_data += (params->height + 1) * LMS_MAX_NODE_LEN; + c32toa(state->stack.offset, priv_data); + priv_data += 4; + + /* Cached root nodes. */ + priv_data += LMS_ROOT_CACHE_LEN(params->rootLevels); + + /* Cached leaf nodes. */ + priv_data += LMS_LEAF_CACHE_LEN(params->cacheBits); + c32toa(state->leaf.idx, priv_data); + priv_data += 4; + c32toa(state->leaf.offset, priv_data); + /* priv_data += 4; */ +} + +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING +/* Copy LMS private key state. + * + * @param [in] params LMS parameters. + * @param [out] dst LMS private state destination. + * @param [in] src LMS private state source. + */ +static void wc_lms_priv_state_copy(const LmsParams* params, + LmsPrivState* dst, const LmsPrivState* src) +{ + XMEMCPY(dst->auth_path, src->auth_path, LMS_PRIV_STATE_LEN(params->height, + params->rootLevels, params->cacheBits)); + dst->stack.offset = src->stack.offset; + dst->leaf.idx = src->leaf.idx; + dst->leaf.offset = src->leaf.offset; +} +#endif /* !WOLFSSL_LMS_NO_SIGN_SMOOTHING */ +#endif /* !WOLFSSL_WC_LMS_SMALL */ + +/* Calculate the leaf node hash. + * + * Assumes buffer already contains : I + * + * Appendix C. + * ... + * temp = H(I || u32str(r)|| u16str(D_LEAF) || OTS_PUB_HASH[i]) + * ... + * Section 5.3. LMS Public Key + * ... where we denote the public + * key final hash value (namely, the K value computed in Algorithm 1) + * associated with the i-th LM-OTS private key as OTS_PUB_HASH[i], ... + * Algorithm 1: Generating a One-Time Signature Public Key From a + * Private Key + * ... + * K = H(I || u32str(q) || u16str(D_PBLC) || y[0] || ... || y[p-1]) + * ... + * Therefore: + * OTS_PUB_HASH[i] = H(I || u32str(i) || u16str(D_PBLC) || + * y[0] || ... || y[p-1]) + * + * @param [in, out] state LMS state. + * @param [in] seed Private seed to generate x. + * @param [in] i Index of leaf. + * @param [in] r Leaf hash index. + * @param [out] leaf Leaf node hash. + */ +static int wc_lms_leaf_hash(LmsState* state, const byte* seed, word32 i, + word32 r, byte* leaf) +{ + int ret; + byte* buffer = state->buffer; + byte* rp = buffer + LMS_I_LEN; + byte* dp = rp + LMS_R_LEN; + byte* ots_pub_hash = dp + LMS_D_LEN; + + /* I || u32str(i) || ... */ + c32toa(i, rp); + /* OTS_PUB_HASH[i] = H(I || u32str(i) || u16str(D_PBLC) || + * y[0] || ... || y[p-1]) + */ + ret = wc_lmots_make_public_hash(state, seed, ots_pub_hash); + if (ret == 0) { + /* I || u32str(r) || ... || OTS_PUB_HASH[i] */ + c32toa(r, rp); + /* I || u32str(r) || u16str(D_LEAF) || OTS_PUB_HASH[i] */ + c16toa(LMS_D_LEAF, dp); + /* temp = H(I || u32str(r) || u16str(D_LEAF) || OTS_PUB_HASH[i]) */ + #ifndef WC_LMS_FULL_HASH + /* Put in padding for final block. */ + LMS_SHA256_SET_LEN_54(buffer); + ret = wc_lms_hash_block(&state->hash, buffer, leaf); + #else + ret = wc_lms_hash(&state->hash, buffer, LMS_SEED_HASH_LEN, leaf); + #endif /* !WC_LMS_FULL_HASH */ + } + + return ret; +} + +/* Calculate interior node hash. + * + * Appendix C. n Iterative Algorithm for Computing an LMS Public Key + * Generating an LMS Public Key from an LMS Private Key + * ... + * left_side = pop(data stack); + * temp = H(I || u32str(r) || u16str(D_INTR) || left_side || temp) + * ... + * Popping the stack is done in the caller. + * + * @param [in, out] state LMS state. + * @param [in] sp Stack pointer to left nodes. + * @param [in] r Node hash index. + * @param [out] node Interior node hash. + */ +static int wc_lms_interior_hash(LmsState* state, byte* sp, word32 r, + byte* node) +{ + byte* buffer = state->buffer; + byte* rp = buffer + LMS_I_LEN; + byte* left = rp + LMS_R_LEN + LMS_D_LEN; + + /* I || u32str(r) || u16str(D_INTR) || ... || temp */ + c32toa(r, rp); + /* left_side = pop(data stack) + * I || u32str(r) || u16str(D_INTR) || left_side || temp */ + XMEMCPY(left, sp, LMS_MAX_NODE_LEN); + /* temp = H(I || u32str(r) || u16str(D_INTR) || left_side || temp) */ + return wc_lms_hash(&state->hash, buffer, LMS_NODE_HASH_LEN, node); +} + +#ifdef WOLFSSL_WC_LMS_SMALL +/* Computes hash of the Merkle tree and gets the authentication path for q. + * + * Appendix C: An Iterative Algorithm for Computing an LMS Public Key + * for ( i = 0; i < 2^h; i = i + 1 ) { + * r = i + num_lmots_keys; + * temp = H(I || u32str(r) || u16str(D_LEAF) || OTS_PUB_HASH[i]) + * j = i; + * while (j % 2 == 1) { + * r = (r - 1)/2; + * j = (j-1) / 2; + * left_side = pop(data stack); + * temp = H(I || u32str(r) || u16str(D_INTR) || left_side || temp) + * } + * push temp onto the data stack + * } + * public_key = pop(data stack) + * + * @param [in, out] state LMS state. + * @param [in] id Unique tree identifier, I. + * @param [in] seed Private seed to generate x. + * @param [in] max Count of leaf nodes to calculate. Must be greater + * than q. Must be a power of 2. + * @param [in] q Index for authentication path. + * @param [out] auth_path Authentication path for index. + * @param [out] pub LMS public key. + * @param [out] stack_d Where to store stack data. + * @return 0 on success. + */ +static int wc_lms_treehash(LmsState* state, const byte* id, const byte* seed, + word32 q, byte* auth_path, byte* pub) +{ + int ret = 0; + const LmsParams* params = state->params; + byte* buffer = state->buffer; + byte* rp = buffer + LMS_I_LEN; + byte* dp = rp + LMS_R_LEN; + byte* left = dp + LMS_D_LEN; + byte* temp = left + LMS_MAX_NODE_LEN; +#ifdef WOLFSSL_SMALL_STACK + byte* stack = NULL; +#else + byte stack[(LMS_MAX_HEIGHT + 1) * LMS_MAX_NODE_LEN]; +#endif /* WOLFSSL_SMALL_STACK */ + byte* sp; + word32 i; + + /* I || ... */ + XMEMCPY(buffer, id, LMS_I_LEN); + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate stack of left side hashes. */ + stack = XMALLOC((params->height + 1) * LMS_MAX_NODE_LEN, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (stack == NULL) { + ret = MEMORY_E; + } +#endif /* WOLFSSL_SMALL_STACK */ + sp = stack; + + /* Compute all nodes requested. */ + for (i = 0; (ret == 0) && (i < ((word32)1 << params->height)); i++) { + word32 j = i; + word16 h = 0; + /* r = i + num_lmots_keys */ + word32 r = i + ((word32)1 << (params->height)); + + /* Calculate leaf node hash. */ + ret = wc_lms_leaf_hash(state, seed, i, r, temp); + + /* Store the node if on the authentication path. */ + if ((ret == 0) && (auth_path != NULL) && ((q ^ 0x1) == i)) { + XMEMCPY(auth_path, temp, LMS_MAX_NODE_LEN); + } + + /* I || ... || u16str(D_INTR) || ... || temp */ + c16toa(LMS_D_INTR, dp); + /* Calculate parent node is we have both left and right. */ + while ((ret == 0) && ((j & 0x1) == 1)) { + /* Get parent node index. r and j are odd. */ + r >>= 1; + j >>= 1; + h++; + + /* Calculate interior node hash. + * temp = H(I || u32str(r) || u16str(D_INTR) || left_side || temp) + */ + sp -= LMS_MAX_NODE_LEN; + ret = wc_lms_interior_hash(state, sp, r, temp); + + /* Copy out node to authentication path if on path. */ + if ((ret == 0) && (auth_path != NULL) && ((q >> h) ^ 0x1) == j) { + XMEMCPY(auth_path + h * LMS_MAX_NODE_LEN, temp, + LMS_MAX_NODE_LEN); + } + } + /* Push temp onto the data stack. */ + XMEMCPY(sp, temp, LMS_MAX_NODE_LEN); + sp += LMS_MAX_NODE_LEN; + } + + if ((ret == 0) && (pub != NULL)) { + /* Public key, root node, is top of data stack. */ + XMEMCPY(pub, stack, LMS_MAX_NODE_LEN); + } +#ifdef WOLFSSL_SMALL_STACK + XFREE(stack, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif /* WOLFSSL_SMALL_STACK */ + return ret; +} + +/* Compute the LMS public key - root node of tree. + * + * @param [in, out] state LMS state. + * @param [in] id Unique tree identifier, I. + * @param [in] seed Private seed to generate x. + * @param [out] pub LMS public key. + * @return 0 on success. + */ +static int wc_lms_make_public_key(LmsState* state, const byte* id, + const byte* seed, byte* pub) +{ + return wc_lms_treehash(state, id, seed, 0, NULL, pub); +} + +/* Calculate the authentication path. + * + * @param [in, out] state LMS state. + * @param [in] id Public random: I. + * @param [in] seed Private random: SEED. + * @param [in] q Index of leaf. + * @param [out] sig Signature buffer to place authentication path into. + * @param [out] root Root node of tree. + * @return 0 on success. + */ +static int wc_lms_auth_path(LmsState* state, const byte* id, const byte* seed, + word32 q, byte* sig, byte* root) +{ + return wc_lms_treehash(state, id, seed, q, sig, root); +} +#else +/* Computes hash of the Merkle tree and gets the authentication path for q. + * + * Appendix C: An Iterative Algorithm for Computing an LMS Public Key + * for ( i = 0; i < 2^h; i = i + 1 ) { + * r = i + num_lmots_keys; + * temp = H(I || u32str(r) || u16str(D_LEAF) || OTS_PUB_HASH[i]) + * j = i; + * while (j % 2 == 1) { + * r = (r - 1)/2; + * j = (j-1) / 2; + * left_side = pop(data stack); + * temp = H(I || u32str(r) || u16str(D_INTR) || left_side || temp) + * } + * push temp onto the data stack + * } + * public_key = pop(data stack) + * + * @param [in, out] state LMS state. + * @param [in, out] privState LMS state of the private key. + * @param [in] id Unique tree identifier, I. + * @param [in] seed Private seed to generate x. + * @param [in] q Index for authentication path. + * @return 0 on success. + */ +static int wc_lms_treehash_init(LmsState* state, LmsPrivState* privState, + const byte* id, const byte* seed, word32 q) +{ + int ret = 0; + const LmsParams* params = state->params; + byte* buffer = state->buffer; + byte* auth_path = privState->auth_path; + byte* root = privState->root; + HssLeafCache* leaf = &privState->leaf; + byte* rp = buffer + LMS_I_LEN; + byte* dp = rp + LMS_R_LEN; + byte* left = dp + LMS_D_LEN; + byte* temp = left + LMS_MAX_NODE_LEN; +#ifdef WOLFSSL_SMALL_STACK + byte* stack = NULL; +#else + byte stack[(LMS_MAX_HEIGHT + 1) * LMS_MAX_NODE_LEN]; +#endif /* WOLFSSL_SMALL_STACK */ + word32 spi = 0; + word32 i; + word32 max_h = (word32)1 << params->height; + word32 max_cb = (word32)1 << params->cacheBits; + + privState->stack.offset = 0; + /* Reset the cached stack. */ + leaf->offset = 0; + leaf->idx = q; + if ((q + max_cb) > max_h) { + leaf->idx = max_h - max_cb; + } + + /* I || ... */ + XMEMCPY(buffer, id, LMS_I_LEN); + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate stack of left side hashes. */ + stack = XMALLOC((params->height + 1) * LMS_MAX_NODE_LEN, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (stack == NULL) { + ret = MEMORY_E; + } +#endif /* WOLFSSL_SMALL_STACK */ + + /* Compute all nodes requested. */ + for (i = 0; (ret == 0) && (i < max_h); i++) { + word32 j = i; + word16 h = 0; + /* r = i + num_lmots_keys */ + word32 r = i + max_h; + + /* Calculate leaf node hash. */ + ret = wc_lms_leaf_hash(state, seed, i, r, temp); + + /* Cache leaf node if in range. */ + if ((ret == 0) && (i >= leaf->idx) && (i < leaf->idx + max_cb)) { + XMEMCPY(leaf->cache + i * LMS_MAX_NODE_LEN, temp, LMS_MAX_NODE_LEN); + } + + /* Store the node if on the authentication path. */ + if ((ret == 0) && (auth_path != NULL) && ((q ^ 0x1) == i)) { + XMEMCPY(auth_path, temp, LMS_MAX_NODE_LEN); + } + + /* I || ... || u16str(D_INTR) || ... || temp */ + c16toa(LMS_D_INTR, dp); + /* Calculate parent node is we have both left and right. */ + while ((ret == 0) && ((j & 0x1) == 1)) { + /* Get parent node index. r and j are odd. */ + r >>= 1; + j >>= 1; + h++; + + /* Calculate interior node hash. + * temp = H(I || u32str(r) || u16str(D_INTR) || left_side || temp) + */ + spi -= LMS_MAX_NODE_LEN; + ret = wc_lms_interior_hash(state, stack + spi, r, temp); + + /* Copy out top root nodes. */ + if ((h > params->height - params->rootLevels) && + ((i >> (h-1)) != ((i + 1) >> (h - 1)))) { + int off = (1 << (params->height - h)) + (i >> h) - 1; + XMEMCPY(root + off * LMS_MAX_NODE_LEN, temp, LMS_MAX_NODE_LEN); + } + + /* Copy out node to authentication path if on path. */ + if ((ret == 0) && (auth_path != NULL) && ((q >> h) ^ 0x1) == j) { + XMEMCPY(auth_path + h * LMS_MAX_NODE_LEN, temp, + LMS_MAX_NODE_LEN); + } + } + /* Push temp onto the data stack. */ + XMEMCPY(stack + spi, temp, LMS_MAX_NODE_LEN); + spi += LMS_MAX_NODE_LEN; + + if (i == q - 1) { + XMEMCPY(privState->stack.stack, stack, spi); + privState->stack.offset = spi; + } + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(stack, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif /* WOLFSSL_SMALL_STACK */ + return ret; +} + +/* Computes hash of the Merkle tree and gets the authentication path for q. + * + * Appendix C: An Iterative Algorithm for Computing an LMS Public Key + * for ( i = 0; i < 2^h; i = i + 1 ) { + * r = i + num_lmots_keys; + * temp = H(I || u32str(r) || u16str(D_LEAF) || OTS_PUB_HASH[i]) + * j = i; + * while (j % 2 == 1) { + * r = (r - 1)/2; + * j = (j-1) / 2; + * left_side = pop(data stack); + * temp = H(I || u32str(r) || u16str(D_INTR) || left_side || temp) + * } + * push temp onto the data stack + * } + * public_key = pop(data stack) + * + * @param [in, out] state LMS state. + * @param [in, out] privState LMS state of the private key. + * @param [in] id Unique tree identifier, I. + * @param [in] seed Private seed to generate x. + * @param [in] min_idx Minimum leaf index to process. + * @param [in] max_idx Maximum leaf index to process. + * @param [in] q Index for authentication path. + * @param [in] useRoot Whether to use nodes from root cache. + * @return 0 on success. + */ +static int wc_lms_treehash_update(LmsState* state, LmsPrivState* privState, + const byte* id, const byte* seed, word32 min_idx, word32 max_idx, word32 q, + int useRoot) +{ + int ret = 0; + const LmsParams* params = state->params; + byte* buffer = state->buffer; + byte* auth_path = privState->auth_path; + LmsStack* stackCache = &privState->stack; + HssLeafCache* leaf = &privState->leaf; + byte* rp = buffer + LMS_I_LEN; + byte* dp = rp + LMS_R_LEN; + byte* left = dp + LMS_D_LEN; + byte* temp = left + LMS_MAX_NODE_LEN; +#ifdef WOLFSSL_SMALL_STACK + byte* stack = NULL; +#else + byte stack[(LMS_MAX_HEIGHT + 1) * LMS_MAX_NODE_LEN]; +#endif /* WOLFSSL_SMALL_STACK */ + byte* sp; + word32 max_cb = (word32)1 << params->cacheBits; + word32 i; + + /* I || ... */ + XMEMCPY(buffer, id, LMS_I_LEN); + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate stack of left side hashes. */ + stack = XMALLOC((params->height + 1) * LMS_MAX_NODE_LEN, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (stack == NULL) { + ret = MEMORY_E; + } +#endif /* WOLFSSL_SMALL_STACK */ + + /* Public key, root node, is top of data stack. */ + XMEMCPY(stack, stackCache->stack, params->height * LMS_MAX_NODE_LEN); + sp = stack + stackCache->offset; + + /* Compute all nodes requested. */ + for (i = min_idx; (ret == 0) && (i <= max_idx); i++) { + word32 j = i; + word16 h = 0; + /* r = i + num_lmots_keys */ + word32 r = i + ((word32)1 << (params->height)); + + if ((i >= leaf->idx) && (i < leaf->idx + max_cb)) { + /* Calculate offset of node in cache. */ + word32 off = ((i - (leaf->idx + max_cb) + leaf->offset) % max_cb) * + LMS_MAX_NODE_LEN; + /* Copy cached node into working buffer. */ + XMEMCPY(temp, leaf->cache + off, LMS_MAX_NODE_LEN); + /* I || u32str(i) || ... */ + c32toa(i, rp); + } + else { + /* Calculate leaf node hash. */ + ret = wc_lms_leaf_hash(state, seed, i, r, temp); + + /* Check if this is at the end of the cache and not beyond q plus + * the number of leaf nodes. */ + if ((i == leaf->idx + max_cb) && (i < (q + max_cb))) { + /* Copy working node into cache over old first node. */ + XMEMCPY(leaf->cache + leaf->offset * LMS_MAX_NODE_LEN, temp, + LMS_MAX_NODE_LEN); + /* Increase start index as first node replaced. */ + leaf->idx++; + /* Update offset of first leaf node. */ + leaf->offset = (leaf->offset + 1) & (max_cb - 1); + } + } + + /* Store the node if on the authentication path. */ + if ((ret == 0) && ((q ^ 0x1) == i)) { + XMEMCPY(auth_path, temp, LMS_MAX_NODE_LEN); + } + + /* I || ... || u16str(D_INTR) || ... || temp */ + c16toa(LMS_D_INTR, dp); + /* Calculate parent node if we have both left and right. */ + while ((ret == 0) && ((j & 0x1) == 1)) { + /* Get parent node index. r and j are odd. */ + r >>= 1; + j >>= 1; + h++; + + sp -= LMS_MAX_NODE_LEN; + if (useRoot && (h > params->height - params->rootLevels) && + (h <= params->height)) { + /* Calculate offset of cached root node. */ + word32 off = ((word32)1U << (params->height - h)) + + (i >> h) - 1; + XMEMCPY(temp, privState->root + (off * LMS_MAX_NODE_LEN), + LMS_MAX_NODE_LEN); + } + else { + /* Calculate interior node hash. + * temp = H(I || u32str(r) || u16str(D_INTR) || left_side || + * temp) + */ + ret = wc_lms_interior_hash(state, sp, r, temp); + } + + /* Copy out top root nodes. */ + if ((ret == 0) && (q == 0) && (!useRoot) && + (h > params->height - params->rootLevels) && + ((i >> (h-1)) != ((i + 1) >> (h - 1)))) { + int off = (1 << (params->height - h)) + (i >> h) - 1; + XMEMCPY(privState->root + off * LMS_MAX_NODE_LEN, temp, + LMS_MAX_NODE_LEN); + } + + /* Copy out node to authentication path if on path. */ + if ((ret == 0) && (((q >> h) ^ 0x1) == j)) { + XMEMCPY(auth_path + h * LMS_MAX_NODE_LEN, temp, + LMS_MAX_NODE_LEN); + } + } + if (ret == 0) { + /* Push temp onto the data stack. */ + XMEMCPY(sp, temp, LMS_MAX_NODE_LEN); + sp += LMS_MAX_NODE_LEN; + + /* Save stack after updating first node. */ + if (i == min_idx) { + /* Copy stack back. */ + stackCache->offset = (word32)((size_t)sp - (size_t)stack); + XMEMCPY(stackCache->stack, stack, stackCache->offset); + } + } + } + + if (!useRoot) { + /* Copy stack back. */ + XMEMCPY(stackCache->stack, stack, params->height * LMS_MAX_NODE_LEN); + stackCache->offset = (word32)((size_t)sp - (size_t)stack); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(stack, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif /* WOLFSSL_SMALL_STACK */ + return ret; +} +#endif /* WOLFSSL_WC_LMS_SMALL */ + +/* Sign message using LMS. + * + * Appendix D. Method for Deriving Authentication Path for a Signature. + * Generating an LMS Signature + * ... + * 3. Create the LM-OTS signature for the message: + * ots_signature = lmots_sign(message, LMS_PRIV[q]) + * 4. Compute the array path as follows: + * ... + * 5. S = u32str(q) || ots_signature || u32str(type) || + * path[0] || path[1] || ... || path[h-1] + * ... + * path[] added by caller as it can come from cache. + * + * @param [in, out] state LMS state. + * @param [in] priv LMS private key. + * @param [in] msg Message/public key to sign. + * @param [in] msgSz Length of message in bytes. + * @param [out] sig LMS signature. + * @return 0 on success. + */ +static int wc_lms_sign(LmsState* state, const byte* priv, const byte* msg, + word32 msgSz, byte* sig) +{ + int ret; + const LmsParams* params = state->params; + byte* buffer = state->buffer; + byte* s = sig; + const byte* priv_q = priv; + const byte* priv_seed = priv_q + LMS_Q_LEN; + const byte* priv_i = priv_seed + LMS_SEED_LEN; + + /* Setup for hashing: I || Q */ + XMEMCPY(buffer, priv_i, LMS_I_LEN); + XMEMCPY(buffer + LMS_I_LEN, priv_q, LMS_Q_LEN); + + /* Copy q from private key. + * S = u32str(q) || ... */ + XMEMCPY(s, priv_q, LMS_Q_LEN); + s += LMS_Q_LEN; + + /* ots_signature = sig = u32str(type) || ... */ + c32toa(state->params->lmOtsType, s); + s += LMS_TYPE_LEN; + /* Sign this level. + * S = u32str(q) || ots_signature || ... */ + ret = wc_lmots_sign(state, priv_seed, msg, msgSz, s); + if (ret == 0) { + /* Skip over ots_signature. */ + s += LMS_MAX_NODE_LEN + params->p * LMS_MAX_NODE_LEN; + /* S = u32str(q) || ots_signature || u32str(type) || ... */ + c32toa(params->lmsType, s); + } + + return ret; +} + +#if !defined(WOLFSSL_WC_LMS_SMALL) && !defined(WOLFSSL_LMS_NO_SIG_CACHE) +/* Copy in the cached signature data. + * + * @param [in] params LMS parameters. + * @param [in] y y cache. + * @param [in] priv Private key data. + * @param [out] sig Signature data. + */ +static void wc_lms_sig_copy(const LmsParams* params, const byte* y, + const byte* priv, byte* sig) +{ + /* Put in q. */ + XMEMCPY(sig, priv, LMS_Q_LEN); + sig += LMS_Q_LEN; + /* S = u32str(q) || ... */ + c32toa(params->lmOtsType, sig); + sig += LMS_TYPE_LEN; + /* S = u32str(q) || ots_signature || ... */ + XMEMCPY(sig, y, LMS_MAX_NODE_LEN + params->p * LMS_MAX_NODE_LEN); + sig += LMS_MAX_NODE_LEN + params->p * LMS_MAX_NODE_LEN; + /* S = u32str(q) || ots_signature || u32str(type) || ... */ + c32toa(params->lmsType, sig); +} +#endif /* !WOLFSSL_WC_LMS_SMALL && !WOLFSSL_LMS_NO_SIG_CACHE */ +#endif /* !WOLFSSL_LMS_VERIFY_ONLY */ + +/* Compute the root node of the LMS tree. + * + * Algorithm 6a: Computing an LMS Public Key Candidate from a Signature, + * Message, Identifier, and Algorithm Typecodes + * ... + * 4. Compute the candidate LMS root value Tc as follows: + * node_num = 2^h + q + * tmp = H(I || u32str(node_num) || u16str(D_LEAF) || Kc) + * i = 0 + * while (node_num > 1) { + * if (node_num is odd): + * tmp = H(I||u32str(node_num/2)||u16str(D_INTR)||path[i]||tmp) + * else: + * tmp = H(I||u32str(node_num/2)||u16str(D_INTR)||tmp||path[i]) + * node_num = node_num/2 + * i = i + 1 + * } + * Tc = tmp + * 5. Return Tc. + * + * @param [in, out] state LMS state. + * @param [in] q Index of node. + * @param [in] kc K candidate. + * @param [in] path Authentication path from signature. + * @param [out] tc T candidate. + * @return 0 on success. + */ +static int wc_lms_compute_root(LmsState* state, word32 q, const byte* kc, + const byte* path, byte* tc) +{ + int ret; + const LmsParams* params = state->params; + byte* buffer = state->buffer; + byte* rp = buffer + LMS_I_LEN; + byte* ip = rp + LMS_Q_LEN; + byte* node = ip + LMS_P_LEN; + byte* b[2][2] = { { node, node + LMS_MAX_NODE_LEN }, + { node + LMS_MAX_NODE_LEN, node } }; + /* node_num = 2^h + q */ + word32 r = (1 << params->height) + q; + + /* tmp = H(I || u32str(node_num) || u16str(D_LEAF) || Kc) */ + c32toa(r, rp); + c16toa(LMS_D_LEAF, ip); + XMEMCPY(node, kc, LMS_MAX_NODE_LEN); + /* Put tmp into offset required for first iteration. */ +#ifndef WC_LMS_FULL_HASH + /* Put in padding for final block. */ + LMS_SHA256_SET_LEN_54(buffer); + ret = wc_lms_hash_block(&state->hash, buffer, b[r & 1][0]); +#else + ret = wc_lms_hash(&state->hash, buffer, LMS_SEED_HASH_LEN, b[r & 1][0]); +#endif /* !WC_LMS_FULL_HASH */ + + if (ret == 0) { + int i; + + /* I||...||u16str(D_INT)||... */ + c16toa(LMS_D_INTR, ip); + + /* Do all but last height. */ + for (i = 0; (ret == 0) && (i < params->height - 1); i++) { + /* Put path into offset required. */ + XMEMCPY(b[r & 1][1], path, LMS_MAX_NODE_LEN); + path += LMS_MAX_NODE_LEN; + + /* node_num = node_num / 2 */ + r >>= 1; + /* H(...||u32str(node_num/2)||..) */ + c32toa(r, rp); + /* tmp = H(I||u32str(node_num/2)||u16str(D_INTR)||path[i]||tmp) or + * tmp = H(I||u32str(node_num/2)||u16str(D_INTR)||tmp||path[i]) + * Put tmp result into offset required for next iteration. */ + ret = wc_lms_hash(&state->hash, buffer, LMS_NODE_HASH_LEN, + b[r & 1][0]); + } + if (ret == 0) { + /* Last height. */ + /* Put path into offset required. */ + XMEMCPY(b[r & 1][1], path, LMS_MAX_NODE_LEN); + /* node_num = node_num / 2 */ + r >>= 1; + /* H(...||u32str(node_num/2)||..) */ + c32toa(r, rp); + /* tmp = H(I||u32str(node_num/2)||u16str(D_INTR)||path[i]||tmp) or + * tmp = H(I||u32str(node_num/2)||u16str(D_INTR)||tmp||path[i]) + * Put tmp result into Tc.*/ + ret = wc_lms_hash(&state->hash, buffer, LMS_NODE_HASH_LEN, tc); + } + } + + return ret; +} + +/* LMS verify message using public key and signature. + * + * Algorithm 6a: Computing an LMS Public Key Candidate from a Signature, + * Message, Identifier, and Algorithm Typecodes + * ... + * 2. Parse sigtype, q, lmots_signature, and path from the signature + * as follows: + * a. q = strTou32(first 4 bytes of signature) + * ... + * e. lmots_signature = bytes 4 through 7 + n * (p + 1) + * of signature + * ... + * j. Set path as follows: + * path[0] = next m bytes of signature + * path[1] = next m bytes of signature + * ... + * path[h-1] = next m bytes of signature + * 3. Kc = candidate public key computed by applying Algorithm 4b + * to the signature lmots_signature, the message, and the + * identifiers I, q + * 4. Compute the candidate LMS root value Tc as follows: + * ... + * 5. Return Tc + * Algorithm 6: LMS Signature Verification + * ... + * 3. Compute the LMS Public Key Candidate Tc from the signature, + * message, identifier, pubtype, and ots_typecode, using + * Algorithm 6a. + * 4. If Tc is equal to T[1], return VALID; otherwise, return INVALID. + * + * @param [in, out] state LMS state. + * @param [in] pub LMS public key. + * @param [in] msg Message/public key to verify. + * @param [in] msgSz Length of message in bytes. + * @param [in] sig LMS signature. + */ +static int wc_lms_verify(LmsState* state, const byte* pub, const byte* msg, + word32 msgSz, const byte* sig) +{ + int ret; + const LmsParams* params = state->params; + byte* buffer = state->buffer; + const byte* pub_i = pub + LMS_TYPE_LEN + LMS_TYPE_LEN; + const byte* pub_k = pub_i + LMS_I_LEN; + const byte* sig_q = sig; + byte tc[LMS_MAX_NODE_LEN]; + byte* kc = tc; + + /* Algorithm 6. Step 3. */ + /* Check the public key LMS type matches parameters. */ + ret = wc_lmots_public_key_check(params, pub); + if (ret == 0) { + /* Algorithm 6a. Step 2.e. */ + const byte* sig_lmots = sig + LMS_Q_LEN; + + /* Setup buffer with I || Q. */ + XMEMCPY(buffer, pub_i, LMS_I_LEN); + XMEMCPY(buffer + LMS_I_LEN, sig_q, LMS_Q_LEN); + + /* Algorithm 6a. Step 3. */ + ret = wc_lmots_calc_kc(state, pub + LMS_TYPE_LEN, msg, msgSz, + sig_lmots, kc); + } + if (ret == 0) { + /* Algorithm 6a. Step 2.j. */ + const byte* sig_path = sig + LMS_Q_LEN + LMS_TYPE_LEN + + LMS_MAX_NODE_LEN + params->p * LMS_MAX_NODE_LEN + LMS_TYPE_LEN; + word32 q; + + /* Algorithm 6a. Step 2.a. */ + ato32(sig_q, &q); + + /* Algorithm 6a. Steps 4-5. */ + ret = wc_lms_compute_root(state, q, kc, sig_path, tc); + } + /* Algorithm 6. Step 4. */ + if ((ret == 0) && (XMEMCMP(pub_k, tc, LMS_MAX_NODE_LEN) != 0)) { + ret = SIG_VERIFY_E; + } + + return ret; +} + +/*************************************** + * HSS APIs + **************************************/ + +#ifndef WOLFSSL_LMS_VERIFY_ONLY +/* Derive the seed and i for child. + * + * @param [in, out] state LMS state. + * @param [in] id Parent's I. + * @param [in] seed Parent's SEED. + * @param [in] q Parent's q. + * @param [out] seed_i Derived SEED and I. + * @return 0 on success. + */ +static int wc_hss_derive_seed_i(LmsState* state, const byte* id, + const byte* seed, const byte* q, byte* seed_i) +{ + int ret = 0; + byte buffer[WC_SHA256_BLOCK_SIZE]; + byte* idp = buffer; + byte* qp = idp + LMS_I_LEN; + byte* ip = qp + LMS_Q_LEN; + byte* jp = ip + LMS_P_LEN; + byte* tmp = jp + LMS_W_LEN; + + /* parent's I || ... */ + XMEMCPY(idp, id, LMS_I_LEN); + /* parent's I || q || ... */ + XMEMCPY(qp, q, LMS_Q_LEN); + /* parent's I || q || D_CHILD_SEED || ... */ + c16toa(LMS_D_CHILD_SEED, ip); + /* parent's I || q || D_CHILD_SEED || D_FIXED || ... */ + *jp = LMS_D_FIXED; + /* parent's I || q || D_CHILD_SEED || D_FIXED || parent's SEED */ + XMEMCPY(tmp, seed, LMS_SEED_LEN); + /* SEED = H(parent's I || q || D_CHILD_SEED || D_FIXED || parent's SEED) */ +#ifndef WC_LMS_FULL_HASH + /* Put in padding for final block. */ + LMS_SHA256_SET_LEN_55(buffer); + ret = wc_lms_hash_block(&state->hash, buffer, seed_i); +#else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, seed_i); +#endif /* !WC_LMS_FULL_HASH */ + + if (ret == 0) { + seed_i += LMS_SEED_LEN; + /* parent's I || q || D_CHILD_I || D_FIXED || parent's SEED */ + c16toa(LMS_D_CHILD_I, ip); + /* I = H(parent's I || q || D_CHILD_I || D_FIXED || parent's SEED) */ + #ifndef WC_LMS_FULL_HASH + ret = wc_lms_hash_block(&state->hash, buffer, tmp); + #else + ret = wc_lms_hash(&state->hash, buffer, LMS_HASH_BUFFER_LEN, tmp); + #endif /* !WC_LMS_FULL_HASH */ + /* Copy part of hash as new I into private key. */ + XMEMCPY(seed_i, tmp, LMS_I_LEN); + } + + return ret; +} + +/* Get q, index, of leaf at the specified level. */ +#define LMS_Q_AT_LEVEL(q, ls, l, h) \ + (w64GetLow32(w64ShiftRight((q), (((ls) - 1 - (l)) * (h)))) & \ + (((word32)1 << (h)) - 1)) + +/* Expand the seed and I for further levels and set q for each level. + * + * @param [in, out] state LMS state. + * @param [in, out] priv Private key for use in signing. + * @param [in] priv_raw Private key read. + * @param [in] inc Whether this is an incremental expansion. + * @return 0 on success. + */ +static int wc_hss_expand_private_key(LmsState* state, byte* priv, + const byte* priv_raw, int inc) +{ + const LmsParams* params = state->params; + int ret = 0; + w64wrapper q; + w64wrapper qm1; + word32 q32; + byte* priv_q; + byte* priv_seed_i; + int i; + + /* Get the 64-bit q value from the raw private key. */ + ato64(priv_raw, &q); + /* Step over q and parameter set. */ + priv_raw += HSS_Q_LEN + HSS_PRIV_KEY_PARAM_SET_LEN; + + /* Get q of highest level. */ + q32 = LMS_Q_AT_LEVEL(q, params->levels, 0, params->height); + /* Set q of highest tree. */ + c32toa(q32, priv); + + /* Incremental expansion needs q-1. */ + if (inc) { + /* Calculate q-1 for comparison. */ + qm1 = q; + w64Decrement(&qm1); + } + else { + /* Copy out SEED and I into private key. */ + XMEMCPY(priv + LMS_Q_LEN, priv_raw, LMS_SEED_I_LEN); + } + + /* Compute SEED and I for rest of levels. */ + for (i = 1; (ret == 0) && (i < params->levels); i++) { + /* Don't skip calculating SEED and I. */ + int skip = 0; + + /* Incremental means q, SEED and I already present if q unchanged. */ + if (inc) { + /* Calculate previous levels q for previous 64-bit q value. */ + word32 qm1_32 = LMS_Q_AT_LEVEL(qm1, params->levels, i - 1, + params->height); + /* Same q at previous level means no need to re-compute. */ + if (q32 == qm1_32) { + /* Do skip calculating SEED and I. */ + skip = 1; + } + } + + /* Get pointers into private q to write q and seed + I. */ + priv_q = priv; + priv += LMS_Q_LEN; + priv_seed_i = priv; + priv += LMS_SEED_I_LEN; + + /* Get q for level from 64-bit composite. */ + q32 = w64GetLow32(w64ShiftRight(q, (params->levels - 1 - i) * + params->height)) & (((word32)1 << params->height) - 1); + /* Set q of tree. */ + c32toa(q32, priv); + + if (!skip) { + /* Derive SEED and I into private key. */ + ret = wc_hss_derive_seed_i(state, priv_seed_i + LMS_SEED_LEN, + priv_seed_i, priv_q, priv + LMS_Q_LEN); + } + } + + return ret; +} + +#ifndef WOLFSSL_WC_LMS_SMALL +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING +/* Initialize the next subtree. + * + * @param [in] state LMS state. + * @param [in] privState LMS private state. + * @param [in] curr Current private key. + * @param [in] priv Next private key. + * @param [in] q q for this level. + * @return 0 on success. + */ +static int wc_lms_next_subtree_init(LmsState* state, LmsPrivState* privState, + byte* curr, byte* priv, word32 q) +{ + int ret; + const LmsParams* params = state->params; + byte* priv_q; + byte* priv_seed; + byte* priv_i; + word32 pq; + + priv_q = priv; + priv += LMS_Q_LEN; + priv_seed = curr + LMS_Q_LEN; + priv += LMS_SEED_LEN; + priv_i = curr + LMS_Q_LEN + LMS_SEED_LEN; + priv += LMS_I_LEN; + + ato32(curr, &pq); + pq = (pq + 1) & ((1 << params->height) - 1); + c32toa(pq, priv_q); + + privState->stack.offset = 0; + privState->leaf.idx = (word32)-(1 << params->cacheBits); + privState->leaf.offset = 0; + + /* Derive SEED and I for next tree. */ + ret = wc_hss_derive_seed_i(state, priv_i, priv_seed, priv_q, + priv + LMS_Q_LEN); + if (ret == 0) { + /* Update treehash for first leaf. */ + ret = wc_lms_treehash_update(state, privState, + priv + LMS_Q_LEN + LMS_SEED_LEN, priv + LMS_Q_LEN, 0, q, 0, 0); + } + + return ret; +} + +/* Increment count on next subtree. + * + * @param [in] state LMS state. + * @param [in] priv_key HSS private key. + * @param [in] q64 64-bit q for all levels. + * @return 0 on success. + */ +static int wc_hss_next_subtree_inc(LmsState* state, HssPrivKey* priv_key, + w64wrapper q64) +{ + int ret = 0; + const LmsParams* params = state->params; + byte* curr = priv_key->priv; + byte* priv = priv_key->next_priv; + int i; + w64wrapper p64 = q64; + byte tmp_priv[LMS_PRIV_LEN]; + int use_tmp = 0; + int lastQMax = 0; + w64wrapper p64_hi; + w64wrapper q64_hi; + + /* Get previous index. */ + w64Decrement(&p64); + /* Get index of previous and current parent. */ + p64_hi = w64ShiftRight(p64, (params->levels - 1) * params->height); + q64_hi = w64ShiftRight(q64, (params->levels - 1) * params->height); + for (i = 1; (ret == 0) && (i < params->levels); i++) { + word32 qc; + w64wrapper cp64_hi; + w64wrapper cq64_hi; + + /* Get index of previous and current child. */ + cp64_hi = w64ShiftRight(p64, (params->levels - i - 1) * params->height); + cq64_hi = w64ShiftRight(q64, (params->levels - i - 1) * params->height); + /* Get the q for the child. */ + ato32(curr + LMS_PRIV_LEN, &qc); + + /* Compare index of parent node with previous value. */ + if (w64LT(p64_hi, q64_hi)) { + wc_lms_priv_state_copy(params, &priv_key->state[i], + &priv_key->next_state[i-1]); + ret = wc_lms_next_subtree_init(state, &priv_key->next_state[i - 1], + use_tmp ? tmp_priv : curr, priv, 0); + use_tmp = 0; + } + /* Check whether the child is in a new subtree. */ + else if ((qc == ((word32)1 << params->height) - 1) && + w64LT(cp64_hi, cq64_hi)) { + XMEMSET(tmp_priv, 0, LMS_Q_LEN); + /* Check whether the node at the previous level is also in a new + * subtree. */ + if (lastQMax) { + /* Calculate new SEED and I based on new subtree. */ + ret = wc_hss_derive_seed_i(state, + priv + LMS_Q_LEN + LMS_SEED_LEN, priv + LMS_Q_LEN, tmp_priv, + tmp_priv + LMS_Q_LEN); + } + else { + /* Calculate new SEED and I based on parent. */ + ret = wc_hss_derive_seed_i(state, + curr + LMS_Q_LEN + LMS_SEED_LEN, curr + LMS_Q_LEN, priv, + tmp_priv + LMS_Q_LEN); + } + /* Values not stored so note that they are in temporary. */ + use_tmp = 1; + + /* Set the the q. */ + XMEMCPY(tmp_priv, curr + LMS_PRIV_LEN, LMS_Q_LEN); + } + + lastQMax = (qc == ((word32)1 << params->height) - 1); + curr += LMS_PRIV_LEN; + priv += LMS_PRIV_LEN; + p64_hi = cp64_hi; + q64_hi = cq64_hi; + } + + return ret; +} + +/* Initialize the next subtree for each level bar the highest. + * + * @param [in, out] state LMS state. + * @param [out] priv_key Private key data. + * @return 0 on success. + */ +static int wc_hss_next_subtrees_init(LmsState* state, HssPrivKey* priv_key) +{ + int ret = 0; + const LmsParams* params = state->params; + byte* curr = priv_key->priv; + byte* priv = priv_key->next_priv; + int i; + + XMEMCPY(priv, curr, LMS_PRIV_LEN); + wc_lms_idx_inc(priv, LMS_Q_LEN); + + for (i = 1; (ret == 0) && (i < params->levels); i++) { + word32 q; + + ato32(curr + LMS_PRIV_LEN, &q); + ret = wc_lms_next_subtree_init(state, &priv_key->next_state[i - 1], + curr, priv, q); + + curr += LMS_PRIV_LEN; + priv += LMS_PRIV_LEN; + } + + return ret; +} +#endif + +/* Update the authentication path and caches. + * + * @param [in, out] state LMS state. + * @param [in, out] priv_key Private key information. + * @param [in] levels Number of level to start at. + * @param [out] pub_root Public root. + * @return 0 on success. + */ +static int wc_hss_init_auth_path(LmsState* state, HssPrivKey* priv_key, + byte* pub_root) +{ + int ret = 0; + int levels = state->params->levels; + byte* priv = priv_key->priv + LMS_PRIV_LEN * (levels - 1); + int l; + + for (l = levels - 1; (ret == 0) && (l >= 0); l--) { + word32 q; + const byte* priv_q = priv; + const byte* priv_seed = priv_q + LMS_Q_LEN; + const byte* priv_i = priv_seed + LMS_SEED_LEN; + + /* Get current q for tree at level. */ + ato32(priv_q, &q); + /* Set cache start to a value that indicates no numbers available. */ + ret = wc_lms_treehash_init(state, &priv_key->state[l], priv_i, + priv_seed, q); + + /* Move onto next level's data. */ + priv -= LMS_PRIV_LEN; + } + + if ((ret == 0) && (pub_root != NULL)) { + XMEMCPY(pub_root, priv_key->state[0].root, LMS_MAX_NODE_LEN); + } + + return ret; +} + +/* Calculate the corresponding authentication path index at that height. + * + * @param [in] i Leaf node index. + * @param [in] h Height to calculate for. + * @return Index on authentication path. + */ +#define LMS_AUTH_PATH_IDX(i, h) \ + (((i) ^ ((word32)1U << (h))) | (((word32)1U << (h)) - 1)) + +/* Update the authentication path. + * + * @param [in, out] state LMS state. + * @param [in, out] priv_key Private key information. + * @param [in] levels Number of level to start at. + * @return 0 on success. + */ +static int wc_hss_update_auth_path(LmsState* state, HssPrivKey* priv_key, + byte* priv_raw, int levels) +{ + const LmsParams* params = state->params; + int ret = 0; + byte* priv = priv_key->priv + LMS_PRIV_LEN * (levels - 1); + int i; +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + w64wrapper q64; +#endif + + (void)priv_raw; +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + ato64(priv_raw, &q64); +#endif + + for (i = levels - 1; (ret == 0) && (i >= 0); i--) { + word32 q; + const byte* priv_q = priv; + const byte* priv_seed = priv_q + LMS_Q_LEN; + const byte* priv_i = priv_seed + LMS_SEED_LEN; + LmsPrivState* privState = &priv_key->state[i]; + + /* Get q for tree at level. */ + ato32(priv_q, &q); + #ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + + if ((levels > 1) && (i == levels - 1) && (q == 0)) { + /* New sub-tree. */ + ret = wc_hss_next_subtree_inc(state, priv_key, q64); + } + if ((ret == 0) && (q != 0)) + #else + if (q == 0) { + /* New sub-tree. */ + ret = wc_lms_treehash_init(state, privState, priv_i, priv_seed, 0); + } + else + #endif + { + word32 maxq = q - 1; + int h; + int maxh = params->height; + + /* Check each index at each height needed for the auth path. */ + for (h = 0; (h < maxh) && (h <= maxh - params->rootLevels); h++) { + /* Calculate the index for current q and q-1. */ + word32 qa = LMS_AUTH_PATH_IDX(q, h); + word32 qm1a = LMS_AUTH_PATH_IDX(q - 1, h); + /* If different then needs to be computed so keep highest. */ + if ((qa != qm1a) && (qa > maxq)) { + maxq = qa; + } + } + for (; h < maxh; h++) { + /* Calculate the index for current q and q-1. */ + word32 qa = LMS_AUTH_PATH_IDX(q, h); + word32 qm1a = LMS_AUTH_PATH_IDX(q - 1, h); + /* If different then copy in cached hash. */ + if ((qa != qm1a) && (qa > maxq)) { + int off = (1 << (params->height - h)) + (qa >> h) - 1; + XMEMCPY(privState->auth_path + h * LMS_MAX_NODE_LEN, + privState->root + off * LMS_MAX_NODE_LEN, + LMS_MAX_NODE_LEN); + } + } + /* Update the treehash and calculate the extra indices for + * authentication path. */ + ret = wc_lms_treehash_update(state, privState, priv_i, priv_seed, + q - 1, maxq, q, 1); + #ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + if ((ret == 0) && (i > 0)) { + w64wrapper tmp64 = w64ShiftRight(q64, + (levels - i) * params->height); + w64Increment(&tmp64); + tmp64 = w64ShiftLeft(tmp64, 64 - (i * params->height)); + if (!w64IsZero(tmp64)) { + priv_seed = priv_key->next_priv + i * LMS_PRIV_LEN + + LMS_Q_LEN; + priv_i = priv_seed + LMS_SEED_LEN; + privState = &priv_key->next_state[i - 1]; + + ret = wc_lms_treehash_update(state, privState, priv_i, + priv_seed, q, q, 0, 0); + } + } + #endif + break; + } + + /* Move onto next level's data. */ + priv -= LMS_PRIV_LEN; + } + + return ret; +} + +#if !defined(WOLFSSL_LMS_NO_SIG_CACHE) && (LMS_MAX_LEVELS > 1) +/* Pre-sign for current q so that it isn't needed in signing. + * + * @param [in, out] state LMS state. + * @param [in, out] priv_key Private key. + */ +static int wc_hss_presign(LmsState* state, HssPrivKey* priv_key) +{ + int ret = 0; + const LmsParams* params = state->params; + byte* buffer = state->buffer; + byte pub[LMS_PUBKEY_LEN]; + byte* root = pub + LMS_PUBKEY_LEN - LMS_MAX_NODE_LEN; + byte* priv = priv_key->priv; + int i; + + for (i = params->levels - 2; i >= 0; i--) { + const byte* p = priv + i * (LMS_Q_LEN + LMS_SEED_LEN + LMS_I_LEN); + const byte* priv_q = p; + const byte* priv_seed = priv_q + LMS_Q_LEN; + const byte* priv_i = priv_seed + LMS_SEED_LEN; + + /* ... || T(1) */ + XMEMCPY(root, priv_key->state[i + 1].root, LMS_MAX_NODE_LEN); + /* u32str(type) || u32str(otstype) || I || T(1) */ + p = priv + (i + 1) * (LMS_Q_LEN + LMS_SEED_LEN + LMS_I_LEN); + wc_lmots_public_key_encode(params, p, pub); + + /* Setup for hashing: I || Q || ... */ + XMEMCPY(buffer, priv_i, LMS_I_LEN); + XMEMCPY(buffer + LMS_I_LEN, priv_q, LMS_Q_LEN); + + /* LM-OTS Sign this level. */ + ret = wc_lmots_sign(state, priv_seed, pub, LMS_PUBKEY_LEN, + priv_key->y + i * LMS_PRIV_Y_TREE_LEN(params->p)); + } + + return ret; +} +#endif /* !WOLFSSL_LMS_NO_SIG_CACHE && LMS_MAX_LEVELS > 1 */ +#endif /* !WOLFSSL_WC_LMS_SMALL */ + +/* Load the private key data into HSS private key structure. + * + * @param [in] params LMS parameters. + * @param [in, out] key HSS private key. + * @param [in] priv_data Private key data. + */ +static void wc_hss_priv_data_load(const LmsParams* params, HssPrivKey* key, + byte* priv_data) +{ +#ifndef WOLFSSL_WC_LMS_SMALL + int l; +#endif + + /* Expanded private keys. */ + key->priv = priv_data; + priv_data += LMS_PRIV_KEY_LEN(params->levels); + +#ifndef WOLFSSL_WC_LMS_SMALL + for (l = 0; l < params->levels; l++) { + /* Caches for subtree. */ + wc_lms_priv_state_load(params, &key->state[l], priv_data); + priv_data += LMS_PRIV_STATE_LEN(params->height, params->rootLevels, + params->cacheBits); + } + +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + /* Next subtree's expanded private keys. */ + key->next_priv = priv_data; + priv_data += LMS_PRIV_KEY_LEN(params->levels); + for (l = 0; l < params->levels - 1; l++) { + /* Next subtree's caches. */ + wc_lms_priv_state_load(params, &key->next_state[l], priv_data); + priv_data += LMS_PRIV_STATE_LEN(params->height, params->rootLevels, + params->cacheBits); + } +#endif /* WOLFSSL_LMS_NO_SIGN_SMOOTHING */ + +#ifndef WOLFSSL_LMS_NO_SIG_CACHE + /* Signature cache. */ + key->y = priv_data; +#endif /* WOLFSSL_LMS_NO_SIG_CACHE */ +#endif /* WOLFSSL_WC_LMS_SMALL */ +} + +#ifndef WOLFSSL_WC_LMS_SMALL +/* Store the private key data from HSS private key structure. + * + * @param [in] params LMS parameters. + * @param [in] key HSS private key. + * @param [in, out] priv_data Private key data. + */ +static void wc_hss_priv_data_store(const LmsParams* params, HssPrivKey* key, + byte* priv_data) +{ + int l; + + (void)key; + + /* Expanded private keys. */ + priv_data += LMS_PRIV_KEY_LEN(params->levels); + + for (l = 0; l < params->levels; l++) { + /* Caches for subtrees. */ + wc_lms_priv_state_store(params, &key->state[l], priv_data); + priv_data += LMS_PRIV_STATE_LEN(params->height, params->rootLevels, + params->cacheBits); + } +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + /* Next subtree's expanded private keys. */ + priv_data += LMS_PRIV_KEY_LEN(params->levels); + for (l = 0; l < params->levels - 1; l++) { + /* Next subtree's caches. */ + wc_lms_priv_state_store(params, &key->next_state[l], priv_data); + priv_data += LMS_PRIV_STATE_LEN(params->height, params->rootLevels, + params->cacheBits); + } +#endif /* WOLFSSL_LMS_NO_SIGN_SMOOTHING */ + +#ifndef WOLFSSL_LMS_NO_SIG_CACHE + /* Signature cache. */ +#endif /* WOLFSSL_LMS_NO_SIG_CACHE */ +} +#endif /* WOLFSSL_WC_LMS_SMALL */ + +/* Expand private key for each level and calculating auth path.. + * + * @param [in, out] state LMS state. + * @param [in] priv_raw Raw private key bytes. + * @param [out] priv_key Private key data. + * @param [out] priv_data Private key data. + * @param [out] pub_root Public key root node. + * @return 0 on success. + */ +int wc_hss_reload_key(LmsState* state, const byte* priv_raw, + HssPrivKey* priv_key, byte* priv_data, byte* pub_root) +{ + int ret; + + (void)pub_root; + + wc_hss_priv_data_load(state->params, priv_key, priv_data); +#ifndef WOLFSSL_WC_LMS_SMALL + priv_key->inited = 0; +#endif + + /* Expand the raw private key into the private key data. */ + ret = wc_hss_expand_private_key(state, priv_key->priv, priv_raw, 0); +#ifndef WOLFSSL_WC_LMS_SMALL + if ((ret == 0) && (!priv_key->inited)) { + /* Initialize the authentication paths and caches for all trees. */ + ret = wc_hss_init_auth_path(state, priv_key, pub_root); + #ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + if (ret == 0) { + ret = wc_hss_next_subtrees_init(state, priv_key); + } + #endif + #if !defined(WOLFSSL_LMS_NO_SIG_CACHE) && (LMS_MAX_LEVELS > 1) + if (ret == 0) { + /* Calculate signatures for trees not at bottom. */ + ret = wc_hss_presign(state, priv_key); + } + #endif /* !WOLFSSL_LMS_NO_SIG_CACHE */ + /* Set initialized flag. */ + priv_key->inited = (ret == 0); + } +#endif /* WOLFSSL_WC_LMS_SMALL */ + + return ret; +} + +/* Make an HSS key pair. + * + * @param [in, out] state LMS state. + * @param [in] rng Random number generator. + * @param [out] priv_raw Private key to write. + * @param [out] priv_key Private key. + * @param [out] priv_data Private key data. + * @param [out] pub Public key. + * @return 0 on success. + */ +int wc_hss_make_key(LmsState* state, WC_RNG* rng, byte* priv_raw, + HssPrivKey* priv_key, byte* priv_data, byte* pub) +{ + const LmsParams* params = state->params; + int ret = 0; + int i; + byte* p = priv_raw; + byte* pub_root = pub + LMS_L_LEN + LMS_TYPE_LEN + LMS_TYPE_LEN + LMS_I_LEN; + + /* The 64-bit q starts at 0 - set into raw private key. */ + wc_lms_idx_zero(p, HSS_Q_LEN); + p += HSS_Q_LEN; + + /* Set the LMS and LM-OTS types for each level. */ + for (i = 0; i < params->levels; i++) { + p[i] = (params->lmsType << 4) + params->lmOtsType; + } + /* Set rest of levels to an invalid value. */ + for (; i < HSS_MAX_LEVELS; i++) { + p[i] = 0xff; + } + p += HSS_PRIV_KEY_PARAM_SET_LEN; + + /* Make the private key. */ + ret = wc_lmots_make_private_key(rng, p); + + if (ret == 0) { + /* Set the levels into the public key data. */ + c32toa(params->levels, pub); + pub += LMS_L_LEN; + + ret = wc_hss_reload_key(state, priv_raw, priv_key, priv_data, pub_root); + } + #ifdef WOLFSSL_WC_LMS_SMALL + if (ret == 0) { + byte* priv_seed = priv_key->priv + LMS_Q_LEN; + byte* priv_i = priv_seed + LMS_SEED_LEN; + + /* Compute the root of the highest tree to get the root for public key. + */ + ret = wc_lms_make_public_key(state, priv_i, priv_seed, pub_root); + } + #endif /* !WOLFSSL_WC_LMS_SMALL */ + if (ret == 0) { + /* Encode the public key with remaining fields from the private key. */ + wc_lmots_public_key_encode(params, priv_key->priv, pub); + } + + return ret; +} + +#ifdef WOLFSSL_WC_LMS_SMALL +/* Sign message using HSS. + * + * Algorithm 8: Generating an HSS signature + * 1. If the message-signing key prv[L-1] is exhausted, regenerate + * that key pair, together with any parent key pairs that might + * be necessary. + * If the root key pair is exhausted, then the HSS key pair is + * exhausted and MUST NOT generate any more signatures. + * d = L + * while (prv[d-1].q == 2^(prv[d-1].h)) { + * d = d - 1 + * if (d == 0) + * return FAILURE + * } + * while (d < L) { + * create lms key pair pub[d], prv[d] + * sig[d-1] = lms_signature( pub[d], prv[d-1] ) + * d = d + 1 + * } + * 2. Sign the message. + * sig[L-1] = lms_signature( msg, prv[L-1] ) + * 3. Create the list of signed public keys. + * i = 0; + * while (i < L-1) { + * signed_pub_key[i] = sig[i] || pub[i+1] + * i = i + 1 + * } + * 4. Return u32str(L-1) || signed_pub_key[0] || ... + * || signed_pub_key[L-2] || sig[L-1] + * + * @param [in, out] state LMS state. + * @param [in, out] priv_raw Raw private key bytes. + * @param [in, out] priv_key Private key data. + * @param [in] msg Message to sign. + * @param [in] msgSz Length of message in bytes. + * @param [out] sig Signature of message. + * @return 0 on success. + */ +int wc_hss_sign(LmsState* state, byte* priv_raw, HssPrivKey* priv_key, + byte* priv_data, const byte* msg, word32 msgSz, byte* sig) +{ + const LmsParams* params = state->params; + int ret = 0; + byte* priv = priv_key->priv; + + (void)priv_data; + + /* Step 1. Part 2: Check for total key exhaustion. */ + if (!wc_hss_sigsleft(params, priv_raw)) { + ret = KEY_EXHAUSTED_E; + } + + if (ret == 0) { + /* Expand the raw private key into the private key data. */ + ret = wc_hss_expand_private_key(state, priv, priv_raw, 0); + } + if (ret == 0) { + int i; + w64wrapper q; + w64wrapper qm1; + + /* Get 64-bit q from raw private key. */ + ato64(priv_raw, &q); + /* Calculate q-1 for comparison. */ + qm1 = q; + w64Decrement(&qm1); + + /* Set number of signed public keys. */ + c32toa(params->levels - 1, sig); + sig += params->sig_len; + + /* Build from bottom up. */ + for (i = params->levels - 1; (ret == 0) && (i >= 0); i--) { + byte* p = priv + i * (LMS_Q_LEN + LMS_SEED_LEN + LMS_I_LEN); + byte* root = NULL; + + /* Move to start of next signature at this level. */ + sig -= LMS_SIG_LEN(params->height, params->p); + if (i != 0) { + /* Put root node into signature at this index. */ + root = sig - LMS_MAX_NODE_LEN; + } + + /* Sign using LMS for this level. */ + ret = wc_lms_sign(state, p, msg, msgSz, sig); + if (ret == 0) { + byte* s = sig + LMS_Q_LEN + LMS_TYPE_LEN + LMS_MAX_NODE_LEN + + params->p * LMS_MAX_NODE_LEN + LMS_TYPE_LEN; + byte* priv_q = p; + byte* priv_seed = priv_q + LMS_Q_LEN; + byte* priv_i = priv_seed + LMS_SEED_LEN; + word32 q32; + + /* Get Q from private key as a number. */ + ato32(priv_q, &q32); + /* Calculate authentication path. */ + ret = wc_lms_auth_path(state, priv_i, priv_seed, q32, s, root); + } + if ((ret == 0) && (i != 0)) { + /* Create public data for this level if there is another. */ + sig -= LMS_PUBKEY_LEN; + msg = sig; + msgSz = LMS_PUBKEY_LEN; + wc_lmots_public_key_encode(params, p, sig); + } + } + } + if (ret == 0) { + /* Increment index of leaf node to sign with in raw data. */ + wc_lms_idx_inc(priv_raw, HSS_Q_LEN); + } + + return ret; +} +#else +/* Build signature for HSS signed message. + * + * Algorithm 8: Generating an HSS signature + * 1. ... + * while (prv[d-1].q == 2^(prv[d-1].h)) { + * d = d - 1 + * if (d == 0) + * return FAILURE + * } + * while (d < L) { + * create lms key pair pub[d], prv[d] + * sig[d-1] = lms_signature( pub[d], prv[d-1] ) + * d = d + 1 + * } + * 2. Sign the message. + * sig[L-1] = lms_signature( msg, prv[L-1] ) + * 3. Create the list of signed public keys. + * i = 0; + * while (i < L-1) { + * signed_pub_key[i] = sig[i] || pub[i+1] + * i = i + 1 + * } + * 4. Return u32str(L-1) || signed_pub_key[0] || ... + * || signed_pub_key[L-2] || sig[L-1] + * + * @param [in, out] state LMS state. + * @param [in, out] priv_raw Raw private key bytes. + * @param [in, out] priv_key Private key data. + * @param [in] msg Message to sign. + * @param [in] msgSz Length of message in bytes. + * @param [out] sig Signature of message. + * @return 0 on success. + */ +static int wc_hss_sign_build_sig(LmsState* state, byte* priv_raw, + HssPrivKey* priv_key, const byte* msg, word32 msgSz, byte* sig) +{ + const LmsParams* params = state->params; + int ret = 0; + int i; + w64wrapper q; + w64wrapper qm1; + byte* priv = priv_key->priv; + + /* Get 64-bit q from raw private key. */ + ato64(priv_raw, &q); + /* Calculate q-1 for comparison. */ + qm1 = q; + w64Decrement(&qm1); + + /* Set number of signed public keys. */ + c32toa(params->levels - 1, sig); + sig += params->sig_len; + + /* Build from bottom up. */ + for (i = params->levels - 1; (ret == 0) && (i >= 0); i--) { + byte* p = priv + i * (LMS_Q_LEN + LMS_SEED_LEN + LMS_I_LEN); + byte* root = NULL; + #ifndef WOLFSSL_LMS_NO_SIG_CACHE + int store_p = 0; + word32 q_32 = LMS_Q_AT_LEVEL(q, params->levels, i, + params->height); + word32 qm1_32 = LMS_Q_AT_LEVEL(qm1, params->levels, i, + params->height); + #endif /* !WOLFSSL_LMS_NO_SIG_CACHE */ + + /* Move to start of next signature at this level. */ + sig -= LMS_SIG_LEN(params->height, params->p); + if (i != 0) { + /* Put root node into signature at this index. */ + root = sig - LMS_MAX_NODE_LEN; + } + + #ifndef WOLFSSL_LMS_NO_SIG_CACHE + /* Check if we have a cached version of C and the p hashes that we + * can reuse. */ + if ((i < params->levels - 1) && (q_32 == qm1_32)) { + wc_lms_sig_copy(params, priv_key->y + + i * LMS_PRIV_Y_TREE_LEN(params->p), p, sig); + } + else + #endif /* !WOLFSSL_LMS_NO_SIG_CACHE */ + { + /* Sign using LMS for this level. */ + ret = wc_lms_sign(state, p, msg, msgSz, sig); + #ifndef WOLFSSL_LMS_NO_SIG_CACHE + store_p = (i < params->levels - 1); + #endif /* !WOLFSSL_LMS_NO_SIG_CACHE */ + } + if (ret == 0) { + byte* s = sig + LMS_Q_LEN + LMS_TYPE_LEN; + + #ifndef WOLFSSL_LMS_NO_SIG_CACHE + /* Check if we computed new C and p hashes. */ + if (store_p) { + /* Cache the C and p hashes. */ + XMEMCPY(priv_key->y + i * LMS_PRIV_Y_TREE_LEN(params->p), s, + LMS_PRIV_Y_TREE_LEN(params->p)); + } + #endif /* !WOLFSSL_LMS_NO_SIG_CACHE */ + s += LMS_MAX_NODE_LEN + params->p * LMS_MAX_NODE_LEN + + LMS_TYPE_LEN; + + /* Copy the authentication path out of the private key. */ + XMEMCPY(s, priv_key->state[i].auth_path, + params->height * LMS_MAX_NODE_LEN); + /* Copy the root node into signature unless at top. */ + if (i != 0) { + XMEMCPY(root, priv_key->state[i].root, LMS_MAX_NODE_LEN); + } + } + if ((ret == 0) && (i != 0)) { + /* Create public data for this level if there is another. */ + sig -= LMS_PUBKEY_LEN; + msg = sig; + msgSz = LMS_PUBKEY_LEN; + wc_lmots_public_key_encode(params, p, sig); + } + } + + return ret; +} + +/* Sign message using HSS. + * + * Algorithm 8: Generating an HSS signature + * 1. If the message-signing key prv[L-1] is exhausted, regenerate + * that key pair, together with any parent key pairs that might + * be necessary. + * If the root key pair is exhausted, then the HSS key pair is + * exhausted and MUST NOT generate any more signatures. + * d = L + * while (prv[d-1].q == 2^(prv[d-1].h)) { + * d = d - 1 + * if (d == 0) + * return FAILURE + * } + * while (d < L) { + * create lms key pair pub[d], prv[d] + * sig[d-1] = lms_signature( pub[d], prv[d-1] ) + * d = d + 1 + * } + * 2. Sign the message. + * sig[L-1] = lms_signature( msg, prv[L-1] ) + * 3. Create the list of signed public keys. + * i = 0; + * while (i < L-1) { + * signed_pub_key[i] = sig[i] || pub[i+1] + * i = i + 1 + * } + * 4. Return u32str(L-1) || signed_pub_key[0] || ... + * || signed_pub_key[L-2] || sig[L-1] + * + * @param [in, out] state LMS state. + * @param [in, out] priv_raw Raw private key bytes. + * @param [in, out] priv_key Private key data. + * @param [in, out] priv_data Private key data. + * @param [in] msg Message to sign. + * @param [in] msgSz Length of message in bytes. + * @param [out] sig Signature of message. + * @return 0 on success. + */ +int wc_hss_sign(LmsState* state, byte* priv_raw, HssPrivKey* priv_key, + byte* priv_data, const byte* msg, word32 msgSz, byte* sig) +{ + const LmsParams* params = state->params; + int ret = 0; + + /* Validate fixed parameters for static code analyzers. */ + if ((params->rootLevels == 0) || (params->rootLevels > params->height)) { + ret = BAD_FUNC_ARG; + } + + /* Step 1. Part 2: Check for total key exhaustion. */ + if ((ret == 0) && (!wc_hss_sigsleft(params, priv_raw))) { + ret = KEY_EXHAUSTED_E; + } + + if ((ret == 0) && (!priv_key->inited)) { + /* Initialize the authentication paths and caches for all trees. */ + ret = wc_hss_init_auth_path(state, priv_key, NULL); + #if !defined(WOLFSSL_LMS_NO_SIG_CACHE) && (LMS_MAX_LEVELS > 1) + if (ret == 0) { + ret = wc_hss_presign(state, priv_key); + } + #endif /* !WOLFSSL_LMS_NO_SIG_CACHE */ + /* Set initialized flag. */ + priv_key->inited = (ret == 0); + } + if (ret == 0) { + ret = wc_hss_sign_build_sig(state, priv_raw, priv_key, msg, msgSz, sig); + } + if (ret == 0) { + /* Increment index of leaf node to sign with in raw data. */ + wc_lms_idx_inc(priv_raw, HSS_Q_LEN); + } + /* Check we will produce another signature. */ + if ((ret == 0) && wc_hss_sigsleft(params, priv_raw)) { + /* Update the expanded private key data. */ + ret = wc_hss_expand_private_key(state, priv_key->priv, priv_raw, 1); + if (ret == 0) { + /* Update authentication path and caches for all trees. */ + ret = wc_hss_update_auth_path(state, priv_key, priv_raw, + params->levels); + } + } + if (ret == 0) { + /* Store the updated private key data. */ + wc_hss_priv_data_store(state->params, priv_key, priv_data); + } + + return ret; +} +#endif + +/* Check whether key is exhausted. + * + * First 8 bytes of raw key is the index. + * Check index is less than count of leaf nodes. + * + * @param [in] params LMS parameters. + * @param [in] priv_raw HSS raw private key. + * @return 1 when signature possible. + * @return 0 when private key exhausted. + */ +int wc_hss_sigsleft(const LmsParams* params, const byte* priv_raw) +{ + w64wrapper q; + w64wrapper cnt; + + /* Get current q - next leaf index to sign with. */ + ato64(priv_raw, &q); + /* 1 << total_height = total leaf nodes. */ + cnt = w64ShiftLeft(w64From32(0, 1), params->levels * params->height); + /* Check q is less than total leaf node count. */ + return w64LT(q, cnt); +} +#endif /* !WOLFSSL_LMS_VERIFY_ONLY */ + +/* Verify message using HSS. + * + * Section 6.3. Signature Verification + * 1. Nspk = strTou32(first four bytes of S) + * 2. if Nspk+1 is not equal to the number of levels L in pub: + * 3. return INVALID + * 4. key = pub + * 5. for (i = 0; i < Nspk; i = i + 1) { + * 6. sig = siglist[i] + * 7. msg = publist[i] + * 8. if (lms_verify(msg, key, sig) != VALID): + * 9. return INVALID + * 10. key = msg + * 11. } + * 12. return lms_verify(message, key, siglist[Nspk]) + * + * @param [in, out] state LMS state. + * @param [in] pub HSS public key. + * @param [in] msg Message to rifyn. + * @param [in] msgSz Length of message in bytes. + * @param [in] sig Signature of message. + * @return 0 on success. + * @return SIG_VERFIY_E on failure. + */ +int wc_hss_verify(LmsState* state, const byte* pub, const byte* msg, + word32 msgSz, const byte* sig) +{ + const LmsParams* params = state->params; + int ret = 0; + word32 nspk; + const byte* key = pub + LMS_L_LEN; + word32 levels; + + /* Get number of levels from public key. */ + ato32(pub, &levels); + /* Line 1: Get number of signed public keys from signature. */ + ato32(sig, &nspk); + /* Line 6 (First iteration): Move to start of next signature. */ + sig += LMS_L_LEN; + + /* Line 2: Verify that pub and signature match in levels. */ + if (nspk + 1 != levels) { + /* Line 3: Return invalid signature. */ + ret = SIG_VERIFY_E; + } + if (ret == 0) { + word32 i; + + /* Line 5: For all but last LMS signature. */ + for (i = 0; (ret == 0) && (i < nspk); i++) { + /* Line 7: Get start of public key in signature. */ + const byte* pubList = sig + LMS_Q_LEN + LMS_TYPE_LEN + + LMS_MAX_NODE_LEN + params->p * LMS_MAX_NODE_LEN + LMS_TYPE_LEN + + params->height * LMS_MAX_NODE_LEN; + /* Line 8: Verify the LMS signature with public key as message. */ + ret = wc_lms_verify(state, key, pubList, LMS_PUBKEY_LEN, sig); + /* Line 10: Next key is from signature. */ + key = pubList; + /* Line 6: Move to start of next signature. */ + sig = pubList + LMS_PUBKEY_LEN; + } + } + if (ret == 0) { + /* Line 12: Verify bottom tree with real message. */ + ret = wc_lms_verify(state, key, msg, msgSz, sig); + } + + return ret; +} + +#endif /* WOLFSSL_HAVE_LMS && WOLFSSL_WC_LMS */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_pkcs11.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_pkcs11.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_pkcs11.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_pkcs11.c 2024-08-03 07:30:00.000000000 +0000 @@ -74,7 +74,7 @@ #endif -/* Maximim length of the EC parameter string. */ +/* Maximum length of the EC parameter string. */ #define MAX_EC_PARAM_LEN 16 @@ -403,11 +403,11 @@ } #else /* Disable logging of PKCS#11 calls and return value. */ -#define PKCS11_RV(op, ev) +#define PKCS11_RV(op, ev) WC_DO_NOTHING /* Disable logging of PKCS#11 calls and value. */ -#define PKCS11_VAL(op, val) +#define PKCS11_VAL(op, val) WC_DO_NOTHING /* Disable logging of PKCS#11 template. */ -#define PKCS11_DUMP_TEMPLATE(name, templ, cnt) +#define PKCS11_DUMP_TEMPLATE(name, templ, cnt) WC_DO_NOTHING #endif /** @@ -1355,7 +1355,7 @@ int keyType; ret = Pkcs11HmacTypes(hmac->macType, &mechType, &keyType); - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) break; if (ret == 0) @@ -1367,7 +1367,7 @@ (unsigned char*)hmac->id, hmac->idLen, hmac->label, hmac->labelLen, CKA_SIGN); - if (ret == WC_HW_E) { + if (ret == WC_NO_ERR_TRACE(WC_HW_E)) { ret = Pkcs11CreateSecretKey(&privKey, &session, CKK_GENERIC_SECRET, (unsigned char*)hmac->keyRaw, @@ -1414,7 +1414,7 @@ } } #endif - if (ret == 0 || ret == NOT_COMPILED_IN) { + if (ret == 0 || ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) { /* Try ECDSA mechanism next. */ ret2 = Pkcs11MechAvail(&session, CKM_ECDSA); if (ret2 == 0) { @@ -1428,7 +1428,7 @@ } } /* OK for this to fail if set for ECDH. */ - if (ret == NOT_COMPILED_IN) + if (ret == WC_NO_ERR_TRACE(NOT_COMPILED_IN)) ret = ret2; } if (ret == 0 && clear) @@ -2514,7 +2514,7 @@ PRIVATE_KEY_UNLOCK(); ret = wc_ecc_export_x963(info->pk.ecdh.public_key, NULL, &pointLen); PRIVATE_KEY_LOCK(); - if (ret == LENGTH_ONLY_E) { + if (ret == WC_NO_ERR_TRACE(LENGTH_ONLY_E)) { point = (unsigned char*)XMALLOC(pointLen, info->pk.ecdh.public_key->heap, DYNAMIC_TYPE_ECC_BUFFER); @@ -3604,7 +3604,7 @@ ret = Pkcs11CreateSecretKey(&key, session, keyType, (unsigned char*)hmac->keyRaw, hmac->keyLen, NULL, 0, NULL, 0, CKA_SIGN); - if (ret == WC_HW_E) { + if (ret == WC_NO_ERR_TRACE(WC_HW_E)) { ret = Pkcs11CreateSecretKey(&key, session, CKK_GENERIC_SECRET, (unsigned char*)hmac->keyRaw, hmac->keyLen, NULL, 0, NULL, 0, CKA_SIGN); @@ -3614,7 +3614,7 @@ else if (ret == 0 && hmac->labelLen != 0) { ret = Pkcs11FindKeyByLabel(&key, CKO_SECRET_KEY, keyType, session, hmac->label, hmac->labelLen); - if (ret == WC_HW_E) { + if (ret == WC_NO_ERR_TRACE(WC_HW_E)) { ret = Pkcs11FindKeyByLabel(&key, CKO_SECRET_KEY, CKK_GENERIC_SECRET, session, hmac->label, hmac->labelLen); @@ -3623,7 +3623,7 @@ else if (ret == 0) { ret = Pkcs11FindKeyById(&key, CKO_SECRET_KEY, keyType, session, hmac->id, hmac->idLen); - if (ret == WC_HW_E) { + if (ret == WC_NO_ERR_TRACE(WC_HW_E)) { ret = Pkcs11FindKeyById(&key, CKO_SECRET_KEY, CKK_GENERIC_SECRET, session, hmac->id, hmac->idLen); @@ -3755,7 +3755,12 @@ int ret = 0; Pkcs11Token* token = (Pkcs11Token*)ctx; Pkcs11Session session; + +#ifdef WOLFSSL_PKCS11_RW_TOKENS + int readWrite = 1; +#else int readWrite = 0; +#endif if (devId <= INVALID_DEVID || info == NULL || ctx == NULL) ret = BAD_FUNC_ARG; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_port.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_port.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_port.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_port.c 2024-08-03 07:30:00.000000000 +0000 @@ -36,12 +36,6 @@ #include #endif -/* IPP header files for library initialization */ -#ifdef HAVE_FAST_RSA - #include - #include -#endif - #ifdef FREESCALE_LTC_TFM #include #endif @@ -61,9 +55,8 @@ #if defined(WOLFSSL_RENESAS_TSIP) #include #endif -#if defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - #include +#if defined(WOLFSSL_RENESAS_FSPSM) + #include #endif #if defined(WOLFSSL_RENESAS_RX64_HASH) #include @@ -85,6 +78,9 @@ #if defined(WOLFSSL_CAAM) #include #endif +#if defined(HAVE_ARIA) + #include +#endif #if defined(WOLFSSL_DEVCRYPTO) #include #endif @@ -125,6 +121,16 @@ #include #endif +#if defined(HAVE_LIBOQS) + #include +#endif + +#if defined(FREERTOS) && defined(WOLFSSL_ESPIDF) + #include + #include + /* The Espressif-specific platform include: */ + #include +#endif /* prevent multiple mutex initializations */ static volatile int initRefCount = 0; @@ -171,7 +177,7 @@ } #endif - #if defined(WOLFSSL_RENESAS_TSIP_CRYPT) + #if defined(WOLFSSL_RENESAS_TSIP) ret = tsip_Open( ); if( ret != TSIP_SUCCESS ) { WOLFSSL_MSG("RENESAS TSIP Open failed"); @@ -191,9 +197,8 @@ } #endif - #if defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - ret = wc_sce_Open( ); + #if defined(WOLFSSL_RENESAS_FSPSM) + ret = wc_fspsm_Open( ); if( ret != FSP_SUCCESS ) { WOLFSSL_MSG("RENESAS SCE Open failed"); /* not return 1 since WOLFSSL_SUCCESS=1*/ @@ -227,20 +232,6 @@ } #endif - /* if defined have fast RSA then initialize Intel IPP */ - #ifdef HAVE_FAST_RSA - WOLFSSL_MSG("Attempting to use optimized IPP Library"); - if ((ret = ippInit()) != ippStsNoErr) { - /* possible to get a CPU feature support status on optimized IPP - library but still use default library and see competitive speeds */ - WOLFSSL_MSG("Warning when trying to set up optimization"); - WOLFSSL_MSG(ippGetStatusString(ret)); - WOLFSSL_MSG("Using default fast IPP library"); - ret = 0; - (void)ret; /* suppress not read warning */ - } - #endif - #if defined(FREESCALE_LTC_TFM) || defined(FREESCALE_LTC_ECC) ret = ksdk_port_init(); if (ret != 0) { @@ -367,6 +358,12 @@ } #endif +#if defined(HAVE_ARIA) + if ((ret = wc_AriaInit()) != 0) { + return ret; + } +#endif + #ifdef WOLFSSL_IMXRT_DCP if ((ret = wc_dcp_init()) != 0) { return ret; @@ -379,13 +376,19 @@ } rpcmem_init(); #endif + +#if defined(HAVE_LIBOQS) + if ((ret = wolfSSL_liboqsInit()) != 0) { + return ret; + } +#endif } initRefCount++; return ret; } -#ifdef WOLFSSL_TRACK_MEMORY_VERBOSE +#if defined(WOLFSSL_TRACK_MEMORY_VERBOSE) && !defined(WOLFSSL_STATIC_MEMORY) long wolfCrypt_heap_peakAllocs_checkpoint(void) { long ret = ourMemStats.peakAllocsTripOdometer; ourMemStats.peakAllocsTripOdometer = ourMemStats.totalAllocs - @@ -441,9 +444,8 @@ rx64_hw_Close(); #endif - #if defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - wc_sce_Close(); + #if defined(WOLFSSL_RENESAS_FSPSM) + wc_fspsm_Close(); #endif #ifdef WOLFSSL_SCE @@ -459,7 +461,7 @@ #ifdef WOLFSSL_SILABS_SE_ACCEL ret = sl_se_deinit(); #endif - #if defined(WOLFSSL_RENESAS_TSIP_CRYPT) + #if defined(WOLFSSL_RENESAS_TSIP) tsip_Close(); #endif #if defined(WOLFSSL_DEVCRYPTO) @@ -477,7 +479,11 @@ Entropy_Final(); #endif - #ifdef WOLFSSL_MEM_FAIL_COUNT + #ifdef WOLF_CRYPTO_CB + wc_CryptoCb_Cleanup(); + #endif + + #if defined(WOLFSSL_MEM_FAIL_COUNT) && defined(WOLFCRYPT_ONLY) wc_MemFailCount_Free(); #endif #ifdef WOLFSSL_CHECK_MEM_ZERO @@ -487,6 +493,10 @@ #endif } +#if defined(HAVE_LIBOQS) + wolfSSL_liboqsClose(); +#endif + return ret; } @@ -963,6 +973,7 @@ file = (XFILE)XMALLOC(sizeof(*file), NULL, DYNAMIC_TYPE_FILE); if (file != NULL) { + fs_file_t_init(file); if (fs_open(file, filename, flags) != 0) { XFREE(file, NULL, DYNAMIC_TYPE_FILE); file = NULL; @@ -1272,25 +1283,28 @@ #if WOLFSSL_CRYPT_HW_MUTEX /* Mutex for protection of cryptography hardware */ -static wolfSSL_Mutex wcCryptHwMutex; +static wolfSSL_Mutex wcCryptHwMutex WOLFSSL_MUTEX_INITIALIZER_CLAUSE(wcCryptHwMutex); +#ifndef WOLFSSL_MUTEX_INITIALIZER static int wcCryptHwMutexInit = 0; +#endif int wolfSSL_CryptHwMutexInit(void) { int ret = 0; +#ifndef WOLFSSL_MUTEX_INITIALIZER if (wcCryptHwMutexInit == 0) { ret = wc_InitMutex(&wcCryptHwMutex); if (ret == 0) { wcCryptHwMutexInit = 1; } } +#endif return ret; } int wolfSSL_CryptHwMutexLock(void) { - int ret = BAD_MUTEX_E; /* Make sure HW Mutex has been initialized */ - ret = wolfSSL_CryptHwMutexInit(); + int ret = wolfSSL_CryptHwMutexInit(); if (ret == 0) { ret = wc_LockMutex(&wcCryptHwMutex); } @@ -1298,11 +1312,12 @@ } int wolfSSL_CryptHwMutexUnLock(void) { - int ret = BAD_MUTEX_E; if (wcCryptHwMutexInit) { - ret = wc_UnLockMutex(&wcCryptHwMutex); + return wc_UnLockMutex(&wcCryptHwMutex); + } + else { + return BAD_MUTEX_E; } - return ret; } #endif /* WOLFSSL_CRYPT_HW_MUTEX */ @@ -1342,6 +1357,14 @@ compat_mutex_cb = cb; return 0; } + + /* Gets the current callback function in use for locking/unlocking mutex + * + */ + mutex_cb* wc_GetMutexCb(void) + { + return compat_mutex_cb; + } #endif /* defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) */ #ifdef SINGLE_THREADED @@ -1470,7 +1493,7 @@ return 0; } -#elif defined(USE_WINDOWS_API) +#elif defined(USE_WINDOWS_API) && !defined(WOLFSSL_PTHREADS) int wc_InitMutex(wolfSSL_Mutex* m) { @@ -1676,9 +1699,8 @@ int maxq_CryptHwMutexTryLock() { - int ret = BAD_MUTEX_E; /* Make sure HW Mutex has been initialized */ - ret = wolfSSL_CryptHwMutexInit(); + int ret = wolfSSL_CryptHwMutexInit(); if (ret == 0) { ret = maxq_LockMutex(&wcCryptHwMutex, 1); } @@ -1721,7 +1743,7 @@ #ifdef WOLFSSL_USE_RWLOCK int wc_InitRwLock(wolfSSL_RwLock* m) { - if (pthread_rwlock_init(m, 0) == 0) + if (pthread_rwlock_init(m, NULL) == 0) return 0; else return BAD_MUTEX_E; @@ -1762,7 +1784,7 @@ int wc_InitMutex(wolfSSL_Mutex* m) { - if (pthread_mutex_init(m, 0) == 0) + if (pthread_mutex_init(m, NULL) == 0) return 0; else return BAD_MUTEX_E; @@ -2031,7 +2053,7 @@ } #elif defined(EBSNET) - + #if (defined(RTPLATFORM) && (RTPLATFORM != 0)) int wc_InitMutex(wolfSSL_Mutex* m) { if (rtp_sig_mutex_alloc(m, "wolfSSL Mutex") == -1) @@ -2072,6 +2094,66 @@ return(retval); } + #else + static int rtip_semaphore_build(wolfSSL_Mutex *m) + { + KS_SEMAPHORE_BUILD(m) + return(RTP_TRUE); + } + + int wc_InitMutex(wolfSSL_Mutex* m) + { + if (rtip_semaphore_build(m) == RTP_FALSE) + return BAD_MUTEX_E; + else + return 0; + } + + int wc_FreeMutex(wolfSSL_Mutex* m) + { + KS_SEMAPHORE_FREE(*m); + return 0; + } + + int wc_LockMutex(wolfSSL_Mutex* m) + { + if (KS_SEMAPHORE_GET(*m)) + return 0; + else + return BAD_MUTEX_E; + } + + int wc_UnLockMutex(wolfSSL_Mutex* m) + { + KS_SEMAPHORE_GIVE(*m); + return 0; + } + #endif + int ebsnet_fseek(int a, long b, int c) + { + int retval; + + retval = (int)vf_lseek(a, b, c); + if (retval > 0) + retval = 0; + else + retval = -1; + + return(retval); + } + + int strcasecmp(const char *s1, const char *s2) + { + while (rtp_tolower(*s1) == rtp_tolower(*s2)) { + if (*s1 == '\0' || *s2 == '\0') + break; + s1++; + s2++; + } + + return rtp_tolower(*(unsigned char *) s1) - + rtp_tolower(*(unsigned char *) s2); + } #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) @@ -2730,6 +2812,35 @@ return 0; } +#elif defined(NETOS) + + int wc_InitMutex(wolfSSL_Mutex* m) + { + if (tx_mutex_create(&ready->mutex, "wolfSSL Lock", TX_INHERIT) + == TX_SUCCESS) + return 0; + else + return BAD_MUTEX_E; + } + + int wc_FreeMutex(wolfSSL_Mutex* m) + { + if (tx_mutex_delete(&ready->mutex) == TX_SUCCESS) + return 0; + else + return BAD_MUTEX_E; + } + + int wc_LockMutex(wolfSSL_Mutex* m) + { + + } + + int wc_UnLockMutex(wolfSSL_Mutex* m) + { + + } + #elif defined(WOLFSSL_USER_MUTEX) /* Use user own mutex */ @@ -2814,7 +2925,7 @@ #endif /* WOLFSSL_APACHE_MYNEWT */ #if defined(WOLFSSL_GMTIME) -struct tm* gmtime(const time_t* timer) +struct tm* gmtime_r(const time_t* timer, struct tm *ret) { #define YEAR0 1900 #define EPOCH_YEAR 1970 @@ -2828,8 +2939,6 @@ {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; - static struct tm st_time; - struct tm* ret = &st_time; time_t secs = *timer; unsigned long dayclock, dayno; int year = EPOCH_YEAR; @@ -2863,6 +2972,12 @@ return ret; } + +struct tm* gmtime(const time_t* timer) { + static struct tm st_time; + return gmtime_r(timer, &st_time); +} + #endif /* WOLFSSL_GMTIME */ @@ -3056,6 +3171,30 @@ { struct timespec ts; + #if defined(CONFIG_RTC) && \ + (defined(CONFIG_PICOLIBC) || defined(CONFIG_NEWLIB_LIBC)) + /* Try to obtain the actual time from an RTC */ + static const struct device *rtc = DEVICE_DT_GET(DT_NODELABEL(rtc)); + + if (device_is_ready(rtc)) { + struct rtc_time rtc_time; + struct tm *tm_time = rtc_time_to_tm(&rtc_time); + + int ret = rtc_get_time(rtc, &rtc_time); + + if (ret == 0) { + time_t epochTime = mktime(tm_time); + + if (timer != NULL) + *timer = epochTime; + + return epochTime; + } + } + #endif + + /* Fallback to uptime since boot. This works for relative times, but + * not for ASN.1 date validation */ if (clock_gettime(CLOCK_REALTIME, &ts) == 0) if (timer != NULL) *timer = ts.tv_sec; @@ -3176,8 +3315,10 @@ HAL_RTC_GetTime(&hrtc, &time, FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &date, FORMAT_BIN); - tm_time.tm_year = date.Year; - tm_time.tm_mon = date.Month - 1; /* gm starts at 0 */ + /* RTC year is 0-99 and "struct tm" is 1900+, so assume after year 2000 */ + tm_time.tm_year = date.Year + 100; + /* RTC month is 1-12 and "struct tm" is 0-12, so subtract 1 */ + tm_time.tm_mon = date.Month - 1; tm_time.tm_mday = date.Date; tm_time.tm_hour = time.Hours; tm_time.tm_min = time.Minutes; @@ -3284,3 +3425,529 @@ #include /* sha256 */ #endif #endif + + +#ifndef SINGLE_THREADED + +/* Environment-specific multi-thread implementation check */ +#if defined(USE_WINDOWS_API) && !defined(WOLFSSL_PTHREADS) && \ + !defined(_WIN32_WCE) + int wolfSSL_NewThread(THREAD_TYPE* thread, + THREAD_CB cb, void* arg) + { + if (thread == NULL || cb == NULL) + return BAD_FUNC_ARG; + + /* Use _beginthreadex instead of _beginthread because of: + * _beginthreadex is safer to use than _beginthread. If the thread + * that's generated by _beginthread exits quickly, the handle that's + * returned to the caller of _beginthread might be invalid or point + * to another thread. However, the handle that's returned by + * _beginthreadex has to be closed by the caller of _beginthreadex, + * so it's guaranteed to be a valid handle if _beginthreadex didn't + * return an error.*/ + *thread = _beginthreadex(NULL, 0, cb, arg, 0, NULL); + if (*thread == 0) { + *thread = INVALID_THREAD_VAL; + return MEMORY_E; + } + + return 0; + } + +#ifdef WOLFSSL_THREAD_NO_JOIN + int wolfSSL_NewThreadNoJoin(THREAD_CB_NOJOIN cb, void* arg) + { + THREAD_TYPE thread; + + if (cb == NULL) + return BAD_FUNC_ARG; + + thread = _beginthread(cb, 0, arg); + if (thread == -1L) { + return MEMORY_E; + } + + return 0; + } +#endif + + int wolfSSL_JoinThread(THREAD_TYPE thread) + { + int ret = 0; + + if (thread == INVALID_THREAD_VAL) + return BAD_FUNC_ARG; + + /* We still want to attempt to close the thread handle even on error */ + if (WaitForSingleObject((HANDLE)thread, INFINITE) == WAIT_FAILED) + ret = MEMORY_E; + + if (CloseHandle((HANDLE)thread) == 0) + ret = MEMORY_E; + + return ret; + } + +#ifdef WOLFSSL_COND + int wolfSSL_CondInit(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + cond->cond = CreateEventA(NULL, FALSE, FALSE, NULL); + if (cond->cond == NULL) + return MEMORY_E; + + if (wc_InitMutex(&cond->mutex) != 0) { + if (CloseHandle(cond->cond) == 0) + return MEMORY_E; + return MEMORY_E; + } + + return 0; + } + + int wolfSSL_CondFree(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (CloseHandle(cond->cond) == 0) + return MEMORY_E; + + return 0; + } + + int wolfSSL_CondStart(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_LockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + + int wolfSSL_CondSignal(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_UnLockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + if (SetEvent(cond->cond) == 0) + return MEMORY_E; + + if (wc_LockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + + int wolfSSL_CondWait(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_UnLockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + if (WaitForSingleObject(cond->cond, INFINITE) == WAIT_FAILED) + return MEMORY_E; + + if (wc_LockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + + int wolfSSL_CondEnd(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_UnLockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } +#endif /* WOLFSSL_COND */ + +#elif defined(WOLFSSL_TIRTOS) + + int wolfSSL_NewThread(THREAD_TYPE* thread, + THREAD_CB cb, void* arg) + { + /* Initialize the defaults and set the parameters. */ + Task_Params taskParams; + Task_Params_init(&taskParams); + taskParams.arg0 = (UArg)arg; + taskParams.stackSize = 65535; + *thread = Task_create((Task_FuncPtr)cb, &taskParams, NULL); + if (*thread == NULL) { + return MEMORY_E; + } + Task_yield(); + return 0; + } + + int wolfSSL_JoinThread(THREAD_TYPE thread) + { + while(1) { + if (Task_getMode(thread) == Task_Mode_TERMINATED) { + Task_sleep(5); + break; + } + Task_yield(); + } + return 0; + } + +#elif defined(NETOS) + + int wolfSSL_NewThread(THREAD_TYPE* thread, + THREAD_CB cb, void* arg) + { + /* For backwards compatibility allow using this declaration as well. */ + #ifdef TESTSUITE_THREAD_STACK_SZ + #define WOLFSSL_NETOS_STACK_SZ TESTSUITE_THREAD_STACK_SZ + #endif + /* This can be adjusted by defining in user_settings.h, will default to + * 65k in the event it is undefined */ + #ifndef WOLFSSL_NETOS_STACK_SZ + #define WOLFSSL_NETOS_STACK_SZ 65535 + #endif + int result; + + if (thread == NULL || cb == NULL) + return BAD_FUNC_ARG; + + XMEMSET(thread, 0, sizeof(*thread)); + + thread->threadStack = (void *)XMALLOC(WOLFSSL_NETOS_STACK_SZ, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (thread->threadStack == NULL) + return MEMORY_E; + + + /* first create the idle thread: + * ARGS: + * Param1: pointer to thread + * Param2: name + * Param3 and 4: entry function and input + * Param5: pointer to thread stack + * Param6: stack size + * Param7 and 8: priority level and preempt threshold + * Param9 and 10: time slice and auto-start indicator */ + result = tx_thread_create(&thread->tid, + "wolfSSL thread", + (entry_functionType)cb, (ULONG)arg, + thread->threadStack, + WOLFSSL_NETOS_STACK_SZ, + 2, 2, + 1, TX_AUTO_START); + if (result != TX_SUCCESS) { + free(thread->threadStack); + thread->threadStack = NULL; + return MEMORY_E; + } + + return 0; + } + + int wolfSSL_JoinThread(THREAD_TYPE thread) + { + /* TODO: maybe have to use tx_thread_delete? */ + free(thread.threadStack); + thread.threadStack = NULL; + return 0; + } + +#elif defined(WOLFSSL_ZEPHYR) + + void* wolfsslThreadHeapHint = NULL; + + int wolfSSL_NewThread(THREAD_TYPE* thread, + THREAD_CB cb, void* arg) + { + #ifndef WOLFSSL_ZEPHYR_STACK_SZ + #define WOLFSSL_ZEPHYR_STACK_SZ (48*1024) + #endif + + if (thread == NULL || cb == NULL) + return BAD_FUNC_ARG; + + XMEMSET(thread, 0, sizeof(*thread)); + + /* TODO: Use the following once k_thread_stack_alloc makes it into a + * release. + * thread->threadStack = k_thread_stack_alloc(WOLFSSL_ZEPHYR_STACK_SZ, + * 0); + */ + thread->threadStack = (void*)XMALLOC( + Z_KERNEL_STACK_SIZE_ADJUST(WOLFSSL_ZEPHYR_STACK_SZ), + wolfsslThreadHeapHint, DYNAMIC_TYPE_TMP_BUFFER); + if (thread->threadStack == NULL) { + WOLFSSL_MSG("error: XMALLOC failed"); + return MEMORY_E; + } + + /* k_thread_create does not return any error codes */ + /* Casting to k_thread_entry_t should be fine since we just ignore the + * extra arguments being passed in */ + k_thread_create(&thread->tid, thread->threadStack, + WOLFSSL_ZEPHYR_STACK_SZ, (k_thread_entry_t)cb, arg, NULL, NULL, + 5, 0, K_NO_WAIT); + + return 0; + } + + int wolfSSL_JoinThread(THREAD_TYPE thread) + { + int ret = 0; + int err; + + err = k_thread_join(&thread.tid, K_FOREVER); + if (err != 0) + ret = MEMORY_E; + + /* TODO: Use the following once k_thread_stack_free makes it into a + * release. + * err = k_thread_stack_free(thread.threadStack); + * if (err != 0) + * ret = MEMORY_E; + */ + XFREE(thread.threadStack, wolfsslThreadHeapHint, + DYNAMIC_TYPE_TMP_BUFFER); + thread.threadStack = NULL; + + /* No thread resources to free. Everything is stored in thread.tid */ + + return ret; + } + +#ifdef WOLFSSL_COND + /* Use the pthreads translation layer for signaling */ + +#endif /* WOLFSSL_COND */ + +#elif defined(WOLFSSL_PTHREADS) || \ + (defined(FREERTOS) && defined(WOLFSSL_ESPIDF)) + + int wolfSSL_NewThread(THREAD_TYPE* thread, + THREAD_CB cb, void* arg) + { + if (thread == NULL || cb == NULL) + return BAD_FUNC_ARG; + + if (pthread_create(thread, NULL, cb, arg) != 0) + return MEMORY_E; + + return 0; + } + + #ifdef WOLFSSL_THREAD_NO_JOIN + int wolfSSL_NewThreadNoJoin(THREAD_CB_NOJOIN cb, void* arg) + { + THREAD_TYPE thread; + int ret; + XMEMSET(&thread, 0, sizeof(thread)); + ret = wolfSSL_NewThread(&thread, cb, arg); + if (ret == 0) + ret = pthread_detach(thread); + return ret; + } + #endif + + int wolfSSL_JoinThread(THREAD_TYPE thread) + { + if (thread == INVALID_THREAD_VAL) + return BAD_FUNC_ARG; + + if (pthread_join(thread, NULL) != 0) + return MEMORY_E; + + return 0; + } + +#ifdef WOLFSSL_COND + #ifndef __MACH__ + /* Generic POSIX conditional */ + int wolfSSL_CondInit(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (pthread_mutex_init(&cond->mutex, NULL) != 0) + return MEMORY_E; + + if (pthread_cond_init(&cond->cond, NULL) != 0) { + /* Keep compilers happy that we are using the return code */ + if (pthread_mutex_destroy(&cond->mutex) != 0) + return MEMORY_E; + return MEMORY_E; + } + + return 0; + } + + int wolfSSL_CondFree(COND_TYPE* cond) + { + int ret = 0; + + if (cond == NULL) + return BAD_FUNC_ARG; + + if (pthread_mutex_destroy(&cond->mutex) != 0) + ret = MEMORY_E; + + if (pthread_cond_destroy(&cond->cond) != 0) + ret = MEMORY_E; + + return ret; + } + + int wolfSSL_CondStart(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (pthread_mutex_lock(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + + int wolfSSL_CondSignal(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (pthread_cond_signal(&cond->cond) != 0) + return MEMORY_E; + + return 0; + } + + int wolfSSL_CondWait(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (pthread_cond_wait(&cond->cond, &cond->mutex) != 0) + return MEMORY_E; + + return 0; + } + + int wolfSSL_CondEnd(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (pthread_mutex_unlock(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + #else /* __MACH__ */ + /* Apple style dispatch semaphore */ + int wolfSSL_CondInit(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + /* dispatch_release() fails hard, with Trace/BPT trap signal, if the + * sem's internal count is less than the value passed in with + * dispatch_semaphore_create(). work around this by initing + * with 0, then incrementing it afterwards. + */ + cond->cond = dispatch_semaphore_create(0); + if (cond->cond == NULL) + return MEMORY_E; + + if (wc_InitMutex(&cond->mutex) != 0) { + dispatch_release(cond->cond); + return MEMORY_E; + } + + return 0; + } + + int wolfSSL_CondFree(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + dispatch_release(cond->cond); + cond->cond = NULL; + + if (wc_FreeMutex(&cond->mutex) != 0) { + return MEMORY_E; + } + + return 0; + } + + int wolfSSL_CondStart(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_LockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + + int wolfSSL_CondSignal(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_UnLockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + dispatch_semaphore_signal(cond->cond); + + if (wc_LockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + + int wolfSSL_CondWait(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_UnLockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + dispatch_semaphore_wait(cond->cond, DISPATCH_TIME_FOREVER); + + if (wc_LockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + + int wolfSSL_CondEnd(COND_TYPE* cond) + { + if (cond == NULL) + return BAD_FUNC_ARG; + + if (wc_UnLockMutex(&cond->mutex) != 0) + return BAD_MUTEX_E; + + return 0; + } + #endif /* __MACH__ */ +#endif /* WOLFSSL_COND */ + +#endif /* Environment check */ + +#endif /* not SINGLE_THREADED */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,1672 @@ +/* wc_xmss.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#ifdef WOLFSSL_HAVE_XMSS +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + + +/*************************** + * DIGEST init and free. + ***************************/ + +/* Initialize the digest algorithm to use. + * + * @param [in, out] state XMSS/MT state including digest and parameters. + * @return 0 on success. + * @return NOT_COMPILED_IN when digest algorithm not supported. + * @return Other negative when digest algorithm initialization failed. + */ +static int wc_xmss_digest_init(XmssState* state) +{ + int ret; + word8 hash = state->params->hash; + +#ifdef WC_XMSS_SHA256 + if (hash == WC_HASH_TYPE_SHA256) { + ret = wc_InitSha256(&state->digest.sha256); + } + else +#endif +#ifdef WC_XMSS_SHA512 + if (hash == WC_HASH_TYPE_SHA512) { + ret = wc_InitSha512(&state->digest.sha512); + } + else +#endif +#ifdef WC_XMSS_SHAKE128 + if (hash == WC_HASH_TYPE_SHAKE128) { + ret = wc_InitShake128(&state->digest.shake, NULL, INVALID_DEVID); + } + else +#endif +#ifdef WC_XMSS_SHAKE256 + if (hash == WC_HASH_TYPE_SHAKE256) { + ret = wc_InitShake256(&state->digest.shake, NULL, INVALID_DEVID); + } + else +#endif + { + ret = NOT_COMPILED_IN; + } + + return ret; +} +/* Free the digest algorithm. + * + * @param [in, out] state XMSS/MT state including digest and parameters. + */ +static void wc_xmss_digest_free(XmssState* state) +{ + word8 hash = state->params->hash; + +#ifdef WC_XMSS_SHA256 + if (hash == WC_HASH_TYPE_SHA256) { + wc_Sha256Free(&state->digest.sha256); + } + else +#endif +#ifdef WC_XMSS_SHA512 + if (hash == WC_HASH_TYPE_SHA512) { + wc_Sha512Free(&state->digest.sha512); + } + else +#endif +#ifdef WC_XMSS_SHAKE128 + if (hash == WC_HASH_TYPE_SHAKE128) { + wc_Shake128_Free(&state->digest.shake); + } + else +#endif +#ifdef WC_XMSS_SHAKE256 + if (hash == WC_HASH_TYPE_SHAKE256) { + wc_Shake256_Free(&state->digest.shake); + } + else +#endif + { + /* Do nothing. */ + } +} + +/* Initialize the XMSS/MT state. + * + * @param [in, out] state XMSS/MT state including digest and parameters. + * @param [in] params Parameters for key. + * @return 0 on success. + * @return NOT_COMPILED_IN when digest algorithm not supported. + * @return Other negative when digest algorithm initialization failed. + */ +static WC_INLINE int wc_xmss_state_init(XmssState* state, + const XmssParams* params) +{ + state->params = params; + state->ret = 0; + return wc_xmss_digest_init(state); +} + +/* Free the XMSS/MT state. + * + * @param [in, out] state XMSS/MT state including digest and parameters. + */ +static WC_INLINE void wc_xmss_state_free(XmssState* state) +{ + wc_xmss_digest_free(state); +} + + +/*************************** + * XMSS PARAMS + ***************************/ + +/* Map of XMSS/MT string name to OID. + */ +typedef struct wc_XmssString { + /* Name of algorithm as a string. */ + const char* str; + /* OID for algorithm. */ + word32 oid; + /* XMSS parameters. */ + XmssParams params; +} wc_XmssString; + +#ifndef WOLFSSL_WC_XMSS_SMALL + +/* Size of BDS State encoded numbers - offset=1, next=3. */ +#define XMSS_BDS_NUMS_SZ 4 +/* Size of treehash encoding - nextIdx=3, completed|used=1. */ +#define XMSS_TREEHASH_SZ 4 + +/* Calculate Secret key length. + * + * See wc_xmss_bds_state_save() and wc_xmss_bds_state_load(). + * + * SK = idx || wots_sk || SK_PRF || root || SEED || BDSs || OTHER + * BDSs = (2 * depth - 1) * BDS + * BDS = stack || height || authPath || keep || nodes || retain || + * offset || next || TREEHASHes + * TREEHASHes = (Subtree height - BDS k param) * TREEHASH + * TREEHASH = nextIdx || completed || used + * + * @param [in] n Number of bytes to hash output. + * @param [in] h Height of full tree. + * @param [in] d Depth of trees (number of subtrees). + * @param [in] s Subtree height. + * @param [in] i Length of index encoding in bytes. + * @param [in] k BDS k parameter. + * @return Secret key length in bytes. + */ +#define XMSS_SK_LEN(n, h, d, s, i, k) \ + (((i) + 4 * (n)) + \ + (2 * (d) - 1) * (((s) + 1) * (n) + \ + (s) + 1 + \ + (s) * (n) + \ + ((s) >> 1) * (n) + \ + ((s) - (k)) * XMSS_TREEHASH_SZ + \ + ((s) - (k)) * (n) + \ + XMSS_RETAIN_LEN(k, n) + \ + XMSS_BDS_NUMS_SZ) + \ + ((d) - 1) * (n) * ((n) * 2 + 3)) + +#else + +/* Calculate Secret key length. + * + * SK = idx || wots_sk || SK_PRF || root || SEED + * + * @param [in] n Number of bytes to hash output. + * @param [in] h Height of full tree. Unused. + * @param [in] d Depth of trees (number of subtrees). Unused. + * @param [in] s Subtree height. Unused. + * @param [in] i Length of index encoding in bytes. + * @param [in] k BDS k parameter. Unused. + * @return Secret key length. + */ +#define XMSS_SK_LEN(n, h, d, s, i, k) \ + ((i) + 4 * (n)) + +#endif + +#ifndef WOLFSSL_XMSS_LARGE_SECRET_KEY +/* Choose the smaller BDS K parameter. */ +#define XMSS_K(k, kl) (k) +#else +/* Choose the larger BDS K parameter. */ +#define XMSS_K(k, kl) (kl) +#endif + +/* Calculate all fixed parameter values and output an array declaration. + * + * @param [in] hash Hash algorithm to use. + * @param [in] n Number of bytes to hash output. + * @param [in] p Number of bytes of padding. + * @param [in] h Height of full tree. + * @param [in] d Depth of trees (number of subtrees). + * @param [in] i Length of index encoding in bytes. + * @param [in] k BDS k parameter. 0 or >= 2 but (h/d - k) is even. + * @param [in] kl BDS k parameter when large signatures. + * @return XMSS/XMSS^MT parameters array declaration. + */ +#define XMSS_PARAMS(hash, n, p, h, d, i, k, kl) \ + { hash, n, p, (n) * 2 + 3, (n) * ((n) * 2 + 3), h, (h) / (d), (d), (i), \ + (i) + (n) + (d) * (((n) * 2 + 3) * (n)) + (h) * (n), \ + XMSS_SK_LEN(n, h, d, ((h) / (d)), i, XMSS_K(k, kl)), (n) * 2, \ + XMSS_K(k, kl) } + /* hash, d, pad_len, wots_len, wots_sig_len, h, sub_h, d, idx_len, + * sig_len, + * sk_len, pk_len, + * bds_k */ + +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 +/* List of known XMSS algorithm strings and their OIDs. */ +static const wc_XmssString wc_xmss_alg[] = { +#ifdef WC_XMSS_SHA256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + { "XMSS-SHA2_10_256", WC_XMSS_OID_SHA2_10_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 10, 1, 4, 0, 4), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 + { "XMSS-SHA2_16_256", WC_XMSS_OID_SHA2_16_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 16, 1, 4, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSS-SHA2_20_256", WC_XMSS_OID_SHA2_20_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 20, 1, 4, 0, 0), }, +#endif +#endif /* HASH_SIZE 256 */ +#endif /* WC_XMSS_SHA256 */ +#ifdef WC_XMSS_SHA512 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + { "XMSS-SHA2_10_512", WC_XMSS_OID_SHA2_10_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 10, 1, 4, 0, 4), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 + { "XMSS-SHA2_16_512", WC_XMSS_OID_SHA2_16_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 16, 1, 4, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSS-SHA2_20_512", WC_XMSS_OID_SHA2_20_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 20, 1, 4, 0, 0), }, +#endif +#endif /* HASH_SIZE 512 */ +#endif /* WC_XMSS_SHA512 */ + +#ifdef WC_XMSS_SHAKE128 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + { "XMSS-SHAKE_10_256", WC_XMSS_OID_SHAKE_10_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 10, 1, 4, 0, 4), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 + { "XMSS-SHAKE_16_256", WC_XMSS_OID_SHAKE_16_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 16, 1, 4, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSS-SHAKE_20_256", WC_XMSS_OID_SHAKE_20_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 20, 1, 4, 0, 0), }, +#endif +#endif /* HASH_SIZE 256 */ +#endif /* WC_XMSS_SHAKE128 */ + +#ifdef WC_XMSS_SHAKE256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + { "XMSS-SHAKE_10_512", WC_XMSS_OID_SHAKE_10_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 10, 1, 4, 0, 4), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 + { "XMSS-SHAKE_16_512", WC_XMSS_OID_SHAKE_16_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 16, 1, 4, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSS-SHAKE_20_512", WC_XMSS_OID_SHAKE_20_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 20, 1, 4, 0, 0), }, +#endif +#endif /* HASH_SIZE 512 */ +#endif /* WC_XMSS_SHAKE256 */ + +#ifdef WC_XMSS_SHA256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + { "XMSS-SHA2_10_192", WC_XMSS_OID_SHA2_10_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 10, 1, 4, 0, 4), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 + { "XMSS-SHA2_16_192", WC_XMSS_OID_SHA2_16_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 16, 1, 4, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSS-SHA2_20_192", WC_XMSS_OID_SHA2_20_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 20, 1, 4, 0, 0), }, +#endif +#endif /* HASH_SIZE 192 */ +#endif /* WC_XMSS_SHA256 */ + +#ifdef WC_XMSS_SHAKE256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + { "XMSS-SHAKE256_10_256", WC_XMSS_OID_SHAKE256_10_256, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 10, 1, 4, 0, 4), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 + { "XMSS-SHAKE256_16_256", WC_XMSS_OID_SHAKE256_16_256, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 16, 1, 4, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSS-SHAKE256_20_256", WC_XMSS_OID_SHAKE256_20_256, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 20, 1, 4, 0, 0), }, +#endif +#endif /* HASH_SIZE 256 */ +#endif /* WC_XMSS_SHAKE256 */ + +#ifdef WC_XMSS_SHAKE256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 && WOLFSSL_XMSS_MAX_HEIGHT >= 10 + { "XMSS-SHAKE256_10_192", WC_XMSS_OID_SHAKE256_10_192, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 10, 1, 4, 0, 4), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 16 && WOLFSSL_XMSS_MAX_HEIGHT >= 16 + { "XMSS-SHAKE256_16_192", WC_XMSS_OID_SHAKE256_16_192, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 16, 1, 4, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSS-SHAKE256_20_192", WC_XMSS_OID_SHAKE256_20_192, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 20, 1, 4, 0, 0), }, +#endif +#endif /* HASH_SIZE 192 */ +#endif /* WC_XMSS_SHAKE256 */ +}; +/* Length of array of known XMSS algorithms. */ +#define WC_XMSS_ALG_LEN (sizeof(wc_xmss_alg) / sizeof(*wc_xmss_alg)) +#endif + +/* Convert XMSS algorithm string to an OID - object identifier. + * + * @param [out] oid OID value corresponding to string. + * @param [in] s String to convert. + * @param [out] params XMSS/MT parameters. + * @return 0 on success. + * @return NOT_COMPILED_IN on failure. + */ +static int wc_xmss_str_to_params(const char *s, word32* oid, + const XmssParams** params) +{ + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 + unsigned int i; + + ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); + for (i = 0; i < WC_XMSS_ALG_LEN; i++) { + if (XSTRCMP(s, wc_xmss_alg[i].str) == 0) { + *oid = wc_xmss_alg[i].oid; + *params = &wc_xmss_alg[i].params; + ret = 0; + break; + } + } +#else + (void)s; + (void)oid; + (void)params; + ret = NOT_COMPILED_IN; +#endif + + return ret; +} + +#if WOLFSSL_XMSS_MAX_HEIGHT >= 20 +/* List of known XMSS^MT algorithm strings and their OIDs. */ +static const wc_XmssString wc_xmssmt_alg[] = { +#ifdef WC_XMSS_SHA256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSSMT-SHA2_20/2_256", WC_XMSSMT_OID_SHA2_20_2_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 20, 2, 3, 2, 4), }, + { "XMSSMT-SHA2_20/4_256", WC_XMSSMT_OID_SHA2_20_4_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 20, 4, 3, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 + { "XMSSMT-SHA2_40/2_256", WC_XMSSMT_OID_SHA2_40_2_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 40, 2, 5, 2, 4), }, + { "XMSSMT-SHA2_40/4_256", WC_XMSSMT_OID_SHA2_40_4_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 40, 4, 5, 2, 4), }, + { "XMSSMT-SHA2_40/8_256", WC_XMSSMT_OID_SHA2_40_8_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 40, 8, 5, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 + { "XMSSMT-SHA2_60/3_256", WC_XMSSMT_OID_SHA2_60_3_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 60, 3, 8, 2, 4), }, + { "XMSSMT-SHA2_60/6_256", WC_XMSSMT_OID_SHA2_60_6_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 60, 6, 8, 2, 4), }, + { "XMSSMT-SHA2_60/12_256", WC_XMSSMT_OID_SHA2_60_12_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 32, 32, 60, 12, 8, 0, 0), }, +#endif +#endif /* HASH_SIZE 256 */ +#endif /* WC_XMSS_SHA256 */ +#ifdef WC_XMSS_SHA512 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSSMT-SHA2_20/2_512", WC_XMSSMT_OID_SHA2_20_2_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 20, 2, 3, 2, 4), }, + { "XMSSMT-SHA2_20/4_512", WC_XMSSMT_OID_SHA2_20_4_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 20, 4, 3, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 + { "XMSSMT-SHA2_40/2_512", WC_XMSSMT_OID_SHA2_40_2_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 40, 2, 5, 2, 4), }, + { "XMSSMT-SHA2_40/4_512", WC_XMSSMT_OID_SHA2_40_4_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 40, 4, 5, 2, 4), }, + { "XMSSMT-SHA2_40/8_512", WC_XMSSMT_OID_SHA2_40_8_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 40, 8, 5, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 + { "XMSSMT-SHA2_60/3_512", WC_XMSSMT_OID_SHA2_60_3_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 60, 3, 8, 2, 4), }, + { "XMSSMT-SHA2_60/6_512", WC_XMSSMT_OID_SHA2_60_6_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 60, 6, 8, 2, 4), }, + { "XMSSMT-SHA2_60/12_512", WC_XMSSMT_OID_SHA2_60_12_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHA512, 64, 64, 60, 12, 8, 0, 0), }, +#endif +#endif /* HASH_SIZE 512 */ +#endif /* WC_XMSS_SHA512 */ + +#ifdef WC_XMSS_SHAKE128 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSSMT-SHAKE_20/2_256", WC_XMSSMT_OID_SHAKE_20_2_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 20, 2, 3, 2, 4), }, + { "XMSSMT-SHAKE_20/4_256", WC_XMSSMT_OID_SHAKE_20_4_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 20, 4, 3, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 + { "XMSSMT-SHAKE_40/2_256", WC_XMSSMT_OID_SHAKE_40_2_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 40, 2, 5, 2, 4), }, + { "XMSSMT-SHAKE_40/4_256", WC_XMSSMT_OID_SHAKE_40_4_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 40, 4, 5, 2, 4), }, + { "XMSSMT-SHAKE_40/8_256", WC_XMSSMT_OID_SHAKE_40_8_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 40, 8, 5, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 + { "XMSSMT-SHAKE_60/3_256", WC_XMSSMT_OID_SHAKE_60_3_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 60, 3, 8, 2, 4), }, + { "XMSSMT-SHAKE_60/6_256", WC_XMSSMT_OID_SHAKE_60_6_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 60, 6, 8, 2, 4), }, + { "XMSSMT-SHAKE_60/12_256", WC_XMSSMT_OID_SHAKE_60_12_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE128, 32, 32, 60, 12, 8, 0, 0), }, +#endif +#endif /* HASH_SIZE 256 */ +#endif /* WC_XMSS_SHAKE128 */ + +#ifdef WC_XMSS_SHAKE256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 512 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSSMT-SHAKE_20/2_512", WC_XMSSMT_OID_SHAKE_20_2_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 20, 2, 3, 2, 4), }, + { "XMSSMT-SHAKE_20/4_512", WC_XMSSMT_OID_SHAKE_20_4_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 20, 4, 3, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 + { "XMSSMT-SHAKE_40/2_512", WC_XMSSMT_OID_SHAKE_40_2_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 40, 2, 5, 2, 4), }, + { "XMSSMT-SHAKE_40/4_512", WC_XMSSMT_OID_SHAKE_40_4_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 40, 4, 5, 2, 4), }, + { "XMSSMT-SHAKE_40/8_512", WC_XMSSMT_OID_SHAKE_40_8_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 40, 8, 5, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 + { "XMSSMT-SHAKE_60/3_512", WC_XMSSMT_OID_SHAKE_60_3_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 60, 3, 8, 2, 4), }, + { "XMSSMT-SHAKE_60/6_512", WC_XMSSMT_OID_SHAKE_60_6_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 60, 6, 8, 2, 4), }, + { "XMSSMT-SHAKE_60/12_512", WC_XMSSMT_OID_SHAKE_60_12_512 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 64, 64, 60, 12, 8, 0, 0), }, +#endif +#endif /* HASH_SIZE 512 */ +#endif /* WC_XMSS_SHAKE256 */ + +#ifdef WC_XMSS_SHA256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSSMT-SHA2_20/2_192", WC_XMSSMT_OID_SHA2_20_2_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 20, 2, 3, 2, 4), }, + { "XMSSMT-SHA2_20/4_192", WC_XMSSMT_OID_SHA2_20_4_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 20, 4, 3, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 + { "XMSSMT-SHA2_40/2_192", WC_XMSSMT_OID_SHA2_40_2_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 40, 2, 5, 2, 4), }, + { "XMSSMT-SHA2_40/4_192", WC_XMSSMT_OID_SHA2_40_4_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 40, 4, 5, 2, 4), }, + { "XMSSMT-SHA2_40/8_192", WC_XMSSMT_OID_SHA2_40_8_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 40, 8, 5, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 + { "XMSSMT-SHA2_60/3_192", WC_XMSSMT_OID_SHA2_60_3_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 60, 3, 8, 2, 4), }, + { "XMSSMT-SHA2_60/6_192", WC_XMSSMT_OID_SHA2_60_6_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 60, 6, 8, 2, 4), }, + { "XMSSMT-SHA2_60/12_192", WC_XMSSMT_OID_SHA2_60_12_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHA256, 24, 4, 60, 12, 8, 0, 0), }, +#endif +#endif /* HASH_SIZE 192 */ +#endif /* WC_XMSS_SHA256 */ + +#ifdef WC_XMSS_SHAKE256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 256 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 256 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSSMT-SHAKE256_20/2_256", WC_XMSSMT_OID_SHAKE256_20_2_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 20, 2, 3, 2, 4), }, + { "XMSSMT-SHAKE256_20/4_256", WC_XMSSMT_OID_SHAKE256_20_4_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 20, 4, 3, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 + { "XMSSMT-SHAKE256_40/2_256", WC_XMSSMT_OID_SHAKE256_40_2_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 40, 2, 5, 2, 4), }, + { "XMSSMT-SHAKE256_40/4_256", WC_XMSSMT_OID_SHAKE256_40_4_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 40, 4, 5, 2, 4), }, + { "XMSSMT-SHAKE256_40/8_256", WC_XMSSMT_OID_SHAKE256_40_8_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 40, 8, 5, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 + { "XMSSMT-SHAKE256_60/3_256", WC_XMSSMT_OID_SHAKE256_60_3_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 60, 3, 8, 2, 4), }, + { "XMSSMT-SHAKE256_60/6_256", WC_XMSSMT_OID_SHAKE256_60_6_256 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 60, 6, 8, 2, 4), }, + { "XMSSMT-SHAKE256_60/12_256", WC_XMSSMT_OID_SHAKE256_60_12_256, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 32, 32, 60, 12, 8, 0, 0), }, +#endif +#endif /* HASH_SIZE 256 */ +#endif /* WC_XMSS_SHAKE256 */ + +#ifdef WC_XMSS_SHAKE256 +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 +#if WOLFSSL_XMSS_MIN_HEIGHT <= 20 && WOLFSSL_XMSS_MAX_HEIGHT >= 20 + { "XMSSMT-SHAKE256_20/2_192", WC_XMSSMT_OID_SHAKE256_20_2_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 20, 2, 3, 2, 4), }, + { "XMSSMT-SHAKE256_20/4_192", WC_XMSSMT_OID_SHAKE256_20_4_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 20, 4, 3, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 40 && WOLFSSL_XMSS_MAX_HEIGHT >= 40 + { "XMSSMT-SHAKE256_40/2_192", WC_XMSSMT_OID_SHAKE256_40_2_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 40, 2, 5, 2, 4), }, + { "XMSSMT-SHAKE256_40/4_192", WC_XMSSMT_OID_SHAKE256_40_4_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 40, 4, 5, 2, 4), }, + { "XMSSMT-SHAKE256_40/8_192", WC_XMSSMT_OID_SHAKE256_40_8_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 40, 8, 5, 0, 0), }, +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 60 && WOLFSSL_XMSS_MAX_HEIGHT >= 60 + { "XMSSMT-SHAKE256_60/3_192", WC_XMSSMT_OID_SHAKE256_60_3_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 60, 3, 8, 2, 4), }, + { "XMSSMT-SHAKE256_60/6_192", WC_XMSSMT_OID_SHAKE256_60_6_192 , + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 60, 6, 8, 2, 4), }, + { "XMSSMT-SHAKE256_60/12_192", WC_XMSSMT_OID_SHAKE256_60_12_192, + XMSS_PARAMS(WC_HASH_TYPE_SHAKE256, 24, 4, 60, 12, 8, 0, 0), }, +#endif +#endif /* HASH_SIZE 192 */ +#endif /* WC_XMSS_SHAKE256 */ +}; +/* Length of array of known XMSS^MT algorithms. */ +#define WC_XMSSMT_ALG_LEN (sizeof(wc_xmssmt_alg) / sizeof(*wc_xmssmt_alg)) +#endif + +/* Convert XMSS^MT algorithm string to an OID - object identifier. + * + * @param [out] oid OID value corresponding to string. + * @param [in] s String to convert. + * @param [out] params XMSS/MT parameters. + * @return 0 on success. + * @return NOT_COMPILED_IN on failure. + */ +static int wc_xmssmt_str_to_params(const char *s, word32* oid, + const XmssParams** params) +{ + int ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); +#if WOLFSSL_XMSS_MAX_HEIGHT >= 20 + unsigned int i; + + ret = WC_NO_ERR_TRACE(NOT_COMPILED_IN); + for (i = 0; i < WC_XMSSMT_ALG_LEN; i++) { + if (XSTRCMP(s, wc_xmssmt_alg[i].str) == 0) { + *oid = wc_xmssmt_alg[i].oid; + *params = &wc_xmssmt_alg[i].params; + ret = 0; + break; + } + } +#else + (void)s; + (void)oid; + (void)params; + ret = NOT_COMPILED_IN; +#endif + + return ret; +} + +/*************************** + * OTHER Internal APIs + ***************************/ + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY +/* Allocates the XMSS secret key (sk) array. + * + * The XMSS/XMSS^MT secret key length is a function of the + * parameters, and can't be allocated until the param string + * has been set with SetParamStr. + * + * This is only called by MakeKey() and Reload(). + * + * Note: the XMSS sk array is force zeroed after every use. + * + * @param [in] key The XMSS key. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_FUNC_ARG when private key already allocated. + * @return MEMORY_E when allocating dynamic memory fails. + */ +static int wc_xmsskey_alloc_sk(XmssKey* key) +{ + int ret = 0; + + /* Validate parameter. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + /* Ensure the private key doesn't exist. */ + else if (key->sk != NULL) { + WOLFSSL_MSG("error: XMSS secret key already exists"); + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* The XMSS/XMSS^MT secret key length is a function of the + * parameters. Therefore can't allocate this until param + * string has been set. */ + ret = wc_XmssKey_GetPrivLen(key, &key->sk_len); + } + if (ret == 0) { + /* Allocate a buffer to hold secret key. */ + key->sk = (unsigned char *)XMALLOC(key->sk_len, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (key->sk == NULL) { + WOLFSSL_MSG("error: malloc XMSS key->sk failed"); + ret = MEMORY_E; + } + } + + if (ret == 0) { + /* Zeroize private key buffer. */ + ForceZero(key->sk, key->sk_len); + } + + return ret; +} + +/* Signs the message using the XMSS secret key, and + * updates the secret key on NV storage. + * + * Both operations must succeed to be considered + * successful. + * + * On success: sets key state to WC_XMSS_STATE_OK. + * On failure: sets key state to WC_XMSS_STATE_BAD + * + * If no signatures are left, sets state to WC_XMSS_STATE_NOSIGS. + * + * @return IO_FAILED_E when reading or writing private key failed. + * @return KEY_EXHAUSTED_E when no more keys in private key available. + * @return BAD_COND_E when generated signature length is invalid. + */ +static WC_INLINE int wc_xmsskey_signupdate(XmssKey* key, byte* sig, + const byte* msg, int msgLen) +{ + int ret = 0; + enum wc_XmssRc cb_rc = WC_XMSS_RC_NONE; + + /* Set the key state to bad by default. State is presumed bad unless a + * correct sign and update operation happen together. */ + key->state = WC_XMSS_STATE_BAD; + + /* Read the current secret key from NV storage.*/ + cb_rc = key->read_private_key(key->sk, key->sk_len, key->context); + if (cb_rc != WC_XMSS_RC_READ_TO_MEMORY) { + /* Read from NV storage failed. */ + WOLFSSL_MSG("error: XMSS read_private_key failed"); + ret = IO_FAILED_E; + } + + if (ret == 0) { + #ifdef WOLFSSL_SMALL_STACK + XmssState* state; + #else + XmssState state[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + state = XMALLOC(sizeof(XmssState), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (state == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize state for use in signing. */ + ret = wc_xmss_state_init(state, key->params); + if (ret == 0) { + /* Read was good. Now sign and update the secret key in memory. + */ + #ifndef WOLFSSL_WC_XMSS_SMALL + if (key->is_xmssmt) { + ret = wc_xmssmt_sign(state, msg, msgLen, key->sk, sig); + } + else { + ret = wc_xmss_sign(state, msg, msgLen, key->sk, sig); + } + #else + ret = wc_xmssmt_sign(state, msg, msgLen, key->sk, sig); + #endif + if (ret == WC_NO_ERR_TRACE(KEY_EXHAUSTED_E)) { + /* Signature space exhausted. */ + key->state = WC_XMSS_STATE_NOSIGS; + WOLFSSL_MSG("error: no XMSS signatures remaining"); + } + else if (ret != 0) { + /* Something failed or inconsistent in signature. Erase the + * signature just to be safe. */ + ForceZero(sig, key->params->sig_len); + WOLFSSL_MSG("error: XMSS sign failed"); + } + /* Free state after use. */ + wc_xmss_state_free(state); + } + #ifdef WOLFSSL_SMALL_STACK + XFREE(state, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + } + + if (ret == 0) { + /* The signature succeeded. key->sk is now updated and must be + * committed to NV storage. */ + cb_rc = key->write_private_key(key->sk, key->sk_len, key->context); + if (cb_rc != WC_XMSS_RC_SAVED_TO_NV_MEMORY) { + /* Write to NV storage failed. Erase the signature from + * memory. */ + ForceZero(sig, key->params->sig_len); + WOLFSSL_MSG("error: XMSS write_private_key failed"); + ret = IO_FAILED_E; + } + } + if (ret == 0) { + /* key->sk was successfully committed to NV storage. Set the + * key state to OK, and set the sigLen. */ + key->state = WC_XMSS_STATE_OK; + } + + /* Force zero the secret key from memory always. */ + ForceZero(key->sk, key->sk_len); + + return ret; +} +#endif /* !WOLFSSL_XMSS_VERIFY_ONLY */ + +/*************************** + * PUBLIC API + ***************************/ + +/* Init an XMSS key. + * + * Call this before setting the parms of an XMSS key. + * + * @param [in] key The XMSS key to init. + * @param [in] heap Unused. + * @param [in] devId Unused. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + */ +int wc_XmssKey_Init(XmssKey* key, void* heap, int devId) +{ + int ret = 0; + + (void) heap; + (void) devId; + + /* Validate parameters. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Zeroize key and set state to initialized. */ + ForceZero(key, sizeof(XmssKey)); + key->state = WC_XMSS_STATE_INITED; + } + + return ret; +} + +/* Set the XMSS key parameter string. + * + * The input string must be one of the supported parm set names in + * the "Name" section from the table in wolfssl/wolfcrypt/xmss.h, + * e.g. "XMSS-SHA2_10_256" or "XMSSMT-SHA2_20/4_256". + * + * @param [in] key The XMSS key to set. + * @param [in] str The XMSS/XMSS^MT parameter string. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_FUNC_ARG when string not recognized. + * @return BAD_STATE_E when wrong state for operation. + * @return NOT_COMPILED_IN when string not supported. + */ +int wc_XmssKey_SetParamStr(XmssKey* key, const char* str) +{ + int ret = 0; + word32 oid = 0; + int is_xmssmt = 0; + + /* Validate parameters. */ + if ((key == NULL) || (str == NULL)) { + ret = BAD_FUNC_ARG; + } + + /* Validate state. */ + if ((ret == 0) && (key->state != WC_XMSS_STATE_INITED)) { + WOLFSSL_MSG("error: XMSS key needs init"); + ret = BAD_STATE_E; + } + + if (ret == 0) { + /* Check which type of algorithm the string is for. */ + is_xmssmt = (XMEMCMP(str, "XMSS-", 5) != 0); + + /* Convert XMSS param string to OID. */ + if (is_xmssmt) { + ret = wc_xmssmt_str_to_params(str, &oid, &key->params); + } + else { + ret = wc_xmss_str_to_params(str, &oid, &key->params); + } + if (ret != 0) { + WOLFSSL_MSG("error: xmssmt_str_to_params failed"); + ret = BAD_FUNC_ARG; + } + } + + if (ret == 0) { + /* Set key info. */ + key->oid = oid; + key->is_xmssmt = is_xmssmt; + key->state = WC_XMSS_STATE_PARMSET; + } + + return ret; +} + +/* Force zeros and frees the XMSS key from memory. + * + * This does not touch the private key saved to non-volatile storage. + * + * This is the only function that frees the key->sk array. + * + * @param [in] key XMSS key. + */ +void wc_XmssKey_Free(XmssKey* key) +{ + /* Validate parameter. */ + if (key != NULL) { + #ifndef WOLFSSL_XMSS_VERIFY_ONLY + if (key->sk != NULL) { + /* Zeroize private key. */ + ForceZero(key->sk, key->sk_len); + XFREE(key->sk, NULL, DYNAMIC_TYPE_TMP_BUFFER); + key->sk = NULL; + key->sk_len = 0; + } + #endif /* !WOLFSSL_XMSS_VERIFY_ONLY */ + + /* Ensure all data is zeroized. */ + ForceZero(key, sizeof(XmssKey)); + + /* Set the state to freed. */ + key->state = WC_XMSS_STATE_FREED; + } +} + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY +/* Sets the XMSS write private key callback. + * + * The callback must be able to write/update the private key to + * non-volatile storage. + * + * @param [in] key The XMSS key. + * @param [in] write_cb The write private key callback. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_STATE_E when wrong state for operation. + */ +int wc_XmssKey_SetWriteCb(XmssKey* key, wc_xmss_write_private_key_cb write_cb) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (write_cb == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Changing the write callback of an already working key is forbidden. */ + else if (key->state == WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: wc_XmssKey_SetWriteCb: key in use"); + ret = BAD_STATE_E; + } + else { + /* Set write callback for storing private key. */ + key->write_private_key = write_cb; + } + + return ret; +} + +/* Sets the XMSS read private key callback. + * + * The callback must be able to read the private key from + * non-volatile storage. + * + * @param [in] key The XMSS key. + * @param [in] read_cb The read private key callback. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_STATE_E when wrong state for operation. + */ +int wc_XmssKey_SetReadCb(XmssKey* key, wc_xmss_read_private_key_cb read_cb) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (read_cb == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Changing the read callback of an already working key is forbidden. */ + else if (key->state == WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: wc_XmssKey_SetReadCb: key in use"); + ret = BAD_STATE_E; + } + else { + /* Set write callback for getting private key. */ + key->read_private_key = read_cb; + } + + return ret; +} + +/* Sets the XMSS context to be used by write and read callbacks. + * + * E.g. this could be a filename if the callbacks write/read to file. + * + * @param [in] key The XMSS key. + * @param [in] context The context pointer. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_STATE_E when wrong state for operation. + */ +int wc_XmssKey_SetContext(XmssKey* key, void* context) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (context == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Setting context of an already working key is forbidden. */ + else if (key->state == WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: wc_XmssKey_SetContext: key in use"); + ret = BAD_STATE_E; + } + else { + /* Set read/write callback context for accessing the private key. */ + key->context = context; + } + + return ret; +} + +/* Make the XMSS/XMSS^MT private/public key pair. The key must have its + * parameters set before calling this. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * This function and Reload() are the only functions that allocate + * key->sk array. wc_XmssKey_FreeKey is the only function that + * deallocates key->sk. + * + * @param [in] key The XMSS key to make. + * @param [in] rng Initialized WC_RNG pointer. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_FUNC_ARG when a write private key is not set. + * @return BAD_FUNC_ARG when a read/write private key context is not set. + * @return BAD_FUNC_ARG when private key already allocated. + * @return MEMORY_E when allocating dynamic memory fails. + * @return BAD_STATE_E when wrong state for operation. + * @return IO_FAILED_E when writing private key failed. + * @return Other negative when random number generation failed. + */ +int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG* rng) +{ + int ret = 0; + enum wc_XmssRc cb_rc = WC_XMSS_RC_NONE; +#ifdef WOLFSSL_SMALL_STACK + unsigned char* seed = NULL; +#else + unsigned char seed[3 * WC_XMSS_MAX_N]; +#endif + + /* Validate parameters */ + if ((key == NULL) || (rng == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Validate state. */ + if ((ret == 0) && (key->state != WC_XMSS_STATE_PARMSET)) { + WOLFSSL_MSG("error: XmssKey not ready for generation"); + ret = BAD_STATE_E; + } + /* Ensure write callback available. */ + if ((ret == 0) && (key->write_private_key == NULL)) { + WOLFSSL_MSG("error: XmssKey write callback is not set"); + ret = BAD_FUNC_ARG; + } + /* Ensure read/write callback context available. */ + if ((ret == 0) && (key->context == NULL)) { + WOLFSSL_MSG("error: XmssKey context is not set"); + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Allocate sk array. */ + ret = wc_xmsskey_alloc_sk(key); + } +#ifdef WOLFSSL_SMALL_STACK + if (ret == 0) { + seed = (unsigned char*)XMALLOC(3 * key->params->n, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (seed == NULL) { + ret = MEMORY_E; + } + } +#endif + + if (ret == 0) { + /* Generate three random seeds. */ + ret = wc_RNG_GenerateBlock(rng, seed, 3 * key->params->n); + } + + if (ret == 0) { + #ifdef WOLFSSL_SMALL_STACK + XmssState* state; + #else + XmssState state[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + state = XMALLOC(sizeof(XmssState), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (state == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize state for use in key generation. */ + ret = wc_xmss_state_init(state, key->params); + if (ret == 0) { + /* Finally make the private/public key pair. Immediately write + * it to NV storage and then clear from memory. */ + #ifndef WOLFSSL_WC_XMSS_SMALL + if (key->is_xmssmt) { + ret = wc_xmssmt_keygen(state, seed, key->sk, key->pk); + } + else { + ret = wc_xmss_keygen(state, seed, key->sk, key->pk); + } + #else + ret = wc_xmssmt_keygen(state, seed, key->sk, key->pk); + #endif + if (ret != 0) { + WOLFSSL_MSG("error: XMSS keygen failed"); + key->state = WC_XMSS_STATE_BAD; + } + /* Free state after use. */ + wc_xmss_state_free(state); + } + #ifdef WOLFSSL_SMALL_STACK + XFREE(state, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + } + + if (ret == 0) { + /* Write out private key. */ + cb_rc = key->write_private_key(key->sk, key->sk_len, key->context); + /* Zeroize private key data whether it was saved or not. */ + ForceZero(key->sk, key->sk_len); + /* Check writing succeeded. */ + if (cb_rc != WC_XMSS_RC_SAVED_TO_NV_MEMORY) { + WOLFSSL_MSG("error: XMSS write to NV storage failed"); + key->state = WC_XMSS_STATE_BAD; + ret = IO_FAILED_E; + } + } + + if (ret == 0) { + key->state = WC_XMSS_STATE_OK; + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(seed, NULL, DYNAMIC_TYPE_TMP_BUFFER); +#endif + return ret; +} + +/* This function allocates the secret key buffer, and does a + * quick sanity check to verify the secret key is readable + * from NV storage, and then force zeros the key from memory. + * + * On success it sets the key state to OK. + * + * Use this function to resume signing with an already existing + * XMSS key pair. + * + * Write/read callbacks, and context data, must be set prior. + * Key must have parameters set. + * + * This function and MakeKey are the only functions that allocate + * key->sk array. wc_XmssKey_FreeKey is the only function that + * deallocates key->sk. + * + * @params [in] key XMSS key to load. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_FUNC_ARG when a read or write function is not set. + * @return BAD_FUNC_ARG when a read/write function context is not set. + * @return BAD_FUNC_ARG when private key already allocated. + * @return MEMORY_E when allocating dynamic memory fails. + * @return BAD_STATE_E when wrong state for operation. + * @return IO_FAILED_E when reading private key failed. + */ +int wc_XmssKey_Reload(XmssKey* key) +{ + int ret = 0; + enum wc_XmssRc cb_rc = WC_XMSS_RC_NONE; + + /* Validate parameter. */ + if (key == NULL) { + ret = BAD_FUNC_ARG; + } + /* Validate state. */ + if ((ret == 0) && (key->state != WC_XMSS_STATE_PARMSET)) { + WOLFSSL_MSG("error: XmssKey not ready for reload"); + ret = BAD_STATE_E; + } + /* Ensure read and write callbacks are available. */ + if ((ret == 0) && ((key->write_private_key == NULL) || + (key->read_private_key == NULL))) { + WOLFSSL_MSG("error: XmssKey write/read callbacks are not set"); + ret = BAD_FUNC_ARG; + } + /* Ensure read and write callback context is available. */ + if ((ret == 0) && (key->context == NULL)) { + WOLFSSL_MSG("error: XmssKey context is not set"); + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Allocate sk array. */ + ret = wc_xmsskey_alloc_sk(key); + } + + if (ret == 0) { + /* Read the current secret key from NV storage. Force clear it + * immediately. This is just to sanity check the secret key + * is readable from permanent storage. */ + cb_rc = key->read_private_key(key->sk, key->sk_len, key->context); + ForceZero(key->sk, key->sk_len); + /* Check reading succeeded. */ + if (cb_rc != WC_XMSS_RC_READ_TO_MEMORY) { + WOLFSSL_MSG("error: XMSS read from NV storage failed"); + key->state = WC_XMSS_STATE_BAD; + ret = IO_FAILED_E; + } + } + if (ret == 0) { + key->state = WC_XMSS_STATE_OK; + } + + return ret; +} + +/* Gets the XMSS/XMSS^MT private key length. + * + * Parameters must be set before calling this, as the key size (sk_len) + * is a function of the parameters. + * + * Note: the XMSS/XMSS^MT private key format is implementation specific, + * and not standardized. Interoperability of XMSS private keys should + * not be expected. + * + * @param [in] key XMSS key. + * @param [out] len Length of the private key in bytes. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_STATE_E when wrong state for operation. + * */ +int wc_XmssKey_GetPrivLen(const XmssKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Validate state. */ + if ((ret == 0) && ((key->state != WC_XMSS_STATE_OK) && + (key->state != WC_XMSS_STATE_PARMSET))) { + /* params->sk_len not set yet. */ + ret = BAD_STATE_E; + } + + if (ret == 0) { + /* Calculate private key length: OID + private key bytes. */ + *len = XMSS_OID_LEN + (word32)key->params->sk_len; + } + + return ret; +} + +/* Sign the message using the XMSS secret key. + * + * @param [in] key XMSS key to use to sign. + * @param [in] sig Buffer to write signature into. + * @param [in, out] sigLen On in, size of buffer. + * On out, the length of the signature in bytes. + * @param [in] msg Message to sign. + * @param [in] msgLen Length of the message in bytes. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_FUNC_ARG when a write private key is not set. + * @return BAD_FUNC_ARG when a read/write private key context is not set. + * @return BAD_STATE_E when wrong state for operation. + * @return BUFFER_E when sigLen is too small. + * @return IO_FAILED_E when reading or writing private key failed. + * @return KEY_EXHAUSTED_E when no more keys in private key available. + * @return BAD_COND_E when generated signature length is invalid. + */ +int wc_XmssKey_Sign(XmssKey* key, byte* sig, word32* sigLen, const byte* msg, + int msgLen) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (sig == NULL) || (sigLen == NULL) || (msg == NULL) || + (msgLen <= 0)) { + ret = BAD_FUNC_ARG; + } + /* Validate state. */ + if ((ret == 0) && (key->state == WC_XMSS_STATE_NOSIGS)) { + WOLFSSL_MSG("error: XMSS signatures exhausted"); + ret = BAD_STATE_E; + } + if ((ret == 0) && (key->state != WC_XMSS_STATE_OK)) { + /* The key had an error the last time it was used, and we + * can't guarantee its state. */ + WOLFSSL_MSG("error: can't sign, XMSS key not in good state"); + ret = BAD_STATE_E; + } + /* Check signature buffer size. */ + if ((ret == 0) && (*sigLen < key->params->sig_len)) { + /* Signature buffer too small. */ + WOLFSSL_MSG("error: XMSS sig buffer too small"); + ret = BUFFER_E; + } + /* Check read and write callbacks available. */ + if ((ret == 0) && ((key->write_private_key == NULL) || + (key->read_private_key == NULL))) { + WOLFSSL_MSG("error: XmssKey write/read callbacks are not set"); + ret = BAD_FUNC_ARG; + } + /* Check read/write callback context available. */ + if ((ret == 0) && (key->context == NULL)) { + WOLFSSL_MSG("error: XmssKey context is not set"); + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + *sigLen = key->params->sig_len; + /* Finally, sign and update the secret key. */ + ret = wc_xmsskey_signupdate(key, sig, msg, msgLen); + } + + return ret; +} + +/* Check if more signatures are possible with key. + * + * @param [in] key XMSS key to check. + * @return 1 when signatures possible. + * @return 0 when key exhausted. + */ +int wc_XmssKey_SigsLeft(XmssKey* key) +{ + int ret; + + /* Validate parameter. */ + if (key == NULL) { + ret = 0; + } + /* Validate state. */ + else if (key->state == WC_XMSS_STATE_NOSIGS) { + WOLFSSL_MSG("error: XMSS signatures exhausted"); + ret = 0; + } + else if (key->state != WC_XMSS_STATE_OK) { + WOLFSSL_MSG("error: can't sign, XMSS key not in good state"); + ret = 0; + } + /* Read the current secret key from NV storage.*/ + else if (key->read_private_key(key->sk, key->sk_len, key->context) != + WC_XMSS_RC_READ_TO_MEMORY) { + WOLFSSL_MSG("error: XMSS read_private_key failed"); + ret = 0; + } + else { + /* Ask implementation to check index in private key. */ + ret = wc_xmss_sigsleft(key->params, key->sk); + } + + return ret; +} +#endif /* !WOLFSSL_XMSS_VERIFY_ONLY*/ + +/* Get the XMSS/XMSS^MT public key length. + * + * The public key is static in size and does not depend on parameters, + * other than the choice of SHA256 as hashing function. + * + * @param [in] key XMSS key. + * @param [out] len Length of the public key. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return NOT_COMPILED_IN when a hash algorithm not supported. + */ +int wc_XmssKey_GetPubLen(const XmssKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL)) { + ret = BAD_FUNC_ARG; + } + else { + *len = XMSS_OID_LEN + key->params->pk_len; + } + + return ret; +} + +/* Export public key and parameters from one XmssKey to another. + * + * Use this to prepare a signature verification XmssKey that is pub only. + * + * @param [out] keyDst Destination key for copy. + * @param [in] keySrc Source key for copy. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a key is NULL. + * @return Other negative when digest algorithm initialization failed. + */ +int wc_XmssKey_ExportPub(XmssKey* keyDst, const XmssKey* keySrc) +{ + int ret = 0; + + /* Validate parameters. */ + if ((keyDst == NULL) || (keySrc == NULL)) { + ret = BAD_FUNC_ARG; + } + + if (ret == 0) { + /* Zeroize the new key. */ + ForceZero(keyDst, sizeof(XmssKey)); + + /* Copy over the public key. */ + XMEMCPY(keyDst->pk, keySrc->pk, sizeof(keySrc->pk)); + + /* Copy over the key info. */ + keyDst->oid = keySrc->oid; + keyDst->is_xmssmt = keySrc->is_xmssmt; + keyDst->params = keySrc->params; + } + if (ret == 0) { + /* Mark keyDst as verify only, to prevent misuse. */ + keyDst->state = WC_XMSS_STATE_VERIFYONLY; + } + + return 0; +} + +/* Exports the raw XMSS public key buffer from key to out buffer. + * + * The out buffer should be large enough to hold the public key, and + * outLen should indicate the size of the buffer. + * + * @param [in] key XMSS key. + * @param [out] out Array holding public key. + * @param [in, out] outLen On in, size of buffer. + * On out, the length of the public key. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BUFFER_E if array is too small. + */ +int wc_XmssKey_ExportPubRaw(const XmssKey* key, byte* out, word32* outLen) +{ + int ret = 0; + word32 pubLen = 0; + + /* Validate parameters. */ + if ((key == NULL) || (out == NULL) || (outLen == NULL)) { + ret = BAD_FUNC_ARG; + } + + /* Get the public key length. */ + if (ret == 0) { + ret = wc_XmssKey_GetPubLen(key, &pubLen); + } + /* Check the output buffer is large enough. */ + if ((ret == 0) && (*outLen < pubLen)) { + ret = BUFFER_E; + } + + if (ret == 0) { + int i = 0; + /* First copy the oid into buffer. */ + for (; i < XMSS_OID_LEN; i++) { + out[XMSS_OID_LEN - i - 1] = (key->oid >> (8 * i)) & 0xFF; + } + /* Copy the public key data into buffer after oid. */ + XMEMCPY(out + XMSS_OID_LEN, key->pk, pubLen - XMSS_OID_LEN); + /* Return actual public key length. */ + *outLen = pubLen; + } + + return ret; +} + +/* Imports a raw public key buffer from in array to XmssKey key. + * + * The XMSS parameters must be set first with wc_XmssKey_SetParamStr, + * and inLen must match the length returned by wc_XmssKey_GetPubLen. + * + * @param [in, out] key XMSS key. + * @param [in] in Array holding public key. + * @param [in] inLen Length of array in bytes. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BUFFER_E if array is incorrect size. + * @return BAD_STATE_E when wrong state for operation. + * */ +int wc_XmssKey_ImportPubRaw(XmssKey* key, const byte* in, word32 inLen) +{ + int ret = 0; + word32 pubLen = 0; + + /* Validate parameters. */ + if ((key == NULL) || (in == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Validate state. */ + if ((ret == 0) && (key->state != WC_XMSS_STATE_PARMSET)) { + /* XMSS key not ready for import. Param str must be set first. */ + WOLFSSL_MSG("error: XMSS key not ready for import"); + ret = BAD_STATE_E; + } + + /* Get the public key length. */ + if (ret == 0) { + ret = wc_XmssKey_GetPubLen(key, &pubLen); + } + /* Check the input buffer is the right size. */ + if ((ret == 0) && (inLen != pubLen)) { + /* Something inconsistent. Parameters weren't set, or input + * pub key is wrong.*/ + ret = BUFFER_E; + } + + if (ret == 0) { + /* Copy the public key data into key. */ + XMEMCPY(key->pk, in + XMSS_OID_LEN, pubLen - XMSS_OID_LEN); + + /* Update state to verify-only as we don't have a private key. */ + key->state = WC_XMSS_STATE_VERIFYONLY; + } + + return ret; +} + +/* Gets the XMSS/XMSS^MT signature length. + * + * Parameters must be set before calling this, as the signature size + * is a function of the parameters. + * + * Note: call this before wc_XmssKey_Sign or Verify so you know the + * length of the required signature buffer. + * + * @param [in] key XMSS key to use to sign. + * @param [out] len The length of the signature in bytes. + * + * @return 0 on success. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_STATE_E when wrong state for operation. + * */ +int wc_XmssKey_GetSigLen(const XmssKey* key, word32* len) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (len == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Validate state. */ + if ((ret == 0) && (key->state != WC_XMSS_STATE_OK) && + (key->state != WC_XMSS_STATE_PARMSET)) { + ret = BAD_STATE_E; + } + + if (ret == 0) { + /* Return the calculated signature length. */ + *len = key->params->sig_len; + } + + return ret; +} + +/* Verify the signature using the XMSS public key. + * + * Requires that XMSS parameters have been set with + * wc_XmssKey_SetParamStr, and that a public key is available + * from importing or MakeKey(). + * + * Call wc_XmssKey_GetSigLen() before this function to determine + * length of the signature buffer. + * + * @param [in] key XMSS key to use to verify. + * @param [in] sig Signature to verify. + * @param [in] sigLen Size of signature in bytes. + * @param [in] m Message to verify. + * @param [in] mLen Length of the message in bytes. + * + * @return 0 on success. + * @return SIG_VERIFY_E when signature did not verify message. + * @return BAD_FUNC_ARG when a parameter is NULL. + * @return BAD_STATE_E when wrong state for operation. + * @return BUFFER_E when sigLen is too small. + */ +int wc_XmssKey_Verify(XmssKey* key, const byte* sig, word32 sigLen, + const byte* m, int mLen) +{ + int ret = 0; + + /* Validate parameters. */ + if ((key == NULL) || (sig == NULL) || (m == NULL)) { + ret = BAD_FUNC_ARG; + } + /* Validate state. */ + if ((ret == 0) && (key->state != WC_XMSS_STATE_OK) && + (key->state != WC_XMSS_STATE_VERIFYONLY)) { + /* XMSS key not ready for verification. Param str must be + * set first, and Reload() called. */ + WOLFSSL_MSG("error: XMSS key not ready for verification"); + ret = BAD_STATE_E; + } + /* Check the signature is the big enough. */ + if ((ret == 0) && (sigLen < key->params->sig_len)) { + /* Signature buffer too small. */ + ret = BUFFER_E; + } + + if (ret == 0) { + #ifdef WOLFSSL_SMALL_STACK + XmssState* state; + #else + XmssState state[1]; + #endif + + #ifdef WOLFSSL_SMALL_STACK + state = XMALLOC(sizeof(XmssState), NULL, DYNAMIC_TYPE_TMP_BUFFER); + if (state == NULL) { + ret = MEMORY_E; + } + if (ret == 0) + #endif + { + /* Initialize state for use in verification. */ + ret = wc_xmss_state_init(state, key->params); + if (ret == 0) { + /* Verify using either XMSS^MT function as it works for both. */ + ret = wc_xmssmt_verify(state, m, mLen, sig, key->pk); + /* Free state after use. */ + wc_xmss_state_free(state); + } + #ifdef WOLFSSL_SMALL_STACK + XFREE(state, NULL, DYNAMIC_TYPE_TMP_BUFFER); + #endif + } + } + + return ret; +} + +#endif /* WOLFSSL_HAVE_XMSS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss_impl.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss_impl.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss_impl.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wc_xmss_impl.c 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,4339 @@ +/* wc_xmss_impl.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Based on: + * o RFC 8391 - XMSS: eXtended Merkle Signature Scheme + * o [HDSS] "Hash-based Digital Signature Schemes", Buchmann, Dahmen and Szydlo + * from "Post Quantum Cryptography", Springer 2009. + * o [OPX] "Optimal Parameters for XMSS^MT", Hulsing, Rausch and Buchmann + * + * TODO: "Simple and Memory-efficient Signature Generation of XMSS^MT" + * (https://ece.engr.uvic.ca/~raltawy/SAC2021/9.pdf) + */ + +#ifdef HAVE_CONFIG_H + #include +#endif + +#include +#include +#include + +#include +#include + +#ifdef NO_INLINE + #include +#else + #define WOLFSSL_MISC_INCLUDED + #include +#endif + +#if defined(WOLFSSL_HAVE_XMSS) + +/* Indices into Hash Address. */ +#define XMSS_ADDR_LAYER 0 +#define XMSS_ADDR_TREE_HI 1 +#define XMSS_ADDR_TREE 2 +#define XMSS_ADDR_TYPE 3 +#define XMSS_ADDR_OTS 4 +#define XMSS_ADDR_LTREE 4 +#define XMSS_ADDR_TREE_ZERO 4 +#define XMSS_ADDR_CHAIN 5 +#define XMSS_ADDR_TREE_HEIGHT 5 +#define XMSS_ADDR_HASH 6 +#define XMSS_ADDR_TREE_INDEX 6 +#define XMSS_ADDR_KEY_MASK 7 + +/* Types of hash addresses. */ +#define WC_XMSS_ADDR_TYPE_OTS 0 +#define WC_XMSS_ADDR_TYPE_LTREE 1 +#define WC_XMSS_ADDR_TYPE_TREE 2 + +/* Byte to include in hash to create unique sequence. */ +#define XMSS_HASH_PADDING_F 0 +#define XMSS_HASH_PADDING_H 1 +#define XMSS_HASH_PADDING_HASH 2 +#define XMSS_HASH_PADDING_PRF 3 +#define XMSS_HASH_PADDING_PRF_KEYGEN 4 + +/* Fixed parameter values. */ +#define XMSS_WOTS_W 16 +#define XMSS_WOTS_LOG_W 4 +#define XMSS_WOTS_LEN2 3 +#define XMSS_CSUM_SHIFT 4 +#define XMSS_CSUM_LEN 2 + +/* Length of the message to the PRF. */ +#define XMSS_PRF_M_LEN 32 + +/* Length of index encoding when doing XMSS. */ +#define XMSS_IDX_LEN 4 + +/* Size of the N when using SHA-256 and 32 byte padding. */ +#define XMSS_SHA256_32_N WC_SHA256_DIGEST_SIZE +/* Size of the padding when using SHA-256 and 32 byte padding. */ +#define XMSS_SHA256_32_PAD_LEN 32 + +/* Calculate PRF data length for parameters. */ +#define XMSS_HASH_PRF_DATA_LEN(params) \ + ((params)->pad_len + (params)->n + WC_XMSS_ADDR_LEN) +/* PRF data length when using SHA-256 with 32 byte padding. */ +#define XMSS_HASH_PRF_DATA_LEN_SHA256_32 \ + (XMSS_SHA256_32_PAD_LEN + XMSS_SHA256_32_N + WC_XMSS_ADDR_LEN) + +/* Calculate chain hash data length for parameters. */ +#define XMSS_CHAIN_HASH_DATA_LEN(params) \ + ((params)->pad_len + 2 * (params)->n) +/* Chain hash data length when using SHA-256 with 32 byte padding. */ +#define XMSS_CHAIN_HASH_DATA_LEN_SHA256_32 \ + (XMSS_SHA256_32_PAD_LEN + 2 * XMSS_SHA256_32_N) + +/* Calculate rand hash data length for parameters. */ +#define XMSS_RAND_HASH_DATA_LEN(params) \ + ((params)->pad_len + 3 * (params)->n) +/* Rand hash data length when using SHA-256 with 32 byte padding. */ +#define XMSS_RAND_HASH_DATA_LEN_SHA256_32 \ + (XMSS_SHA256_32_PAD_LEN + 3 * XMSS_SHA256_32_N) + +/* Encode pad value into byte array. Front fill with 0s. + * + * RFC 8391: 2.4 + * + * @param [in] n Number to encode. + * @param [out] a Array to hold encoding. + * @param [in] l Length of array. + */ +#define XMSS_PAD_ENC(n, a, l) \ +do { \ + XMEMSET(a, 0, l); \ + (a)[(l) - 1] = (n); \ +} while (0) + + +/******************************************** + * Index 32/64 bits + ********************************************/ + +/* Index of 32 or 64 bits. */ +typedef union wc_Idx { +#if WOLFSSL_XMSS_MAX_HEIGHT > 32 + /* 64-bit representation. */ + w64wrapper u64; +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT <= 32 + /* 32-bit representation. */ + word32 u32; +#endif +} wc_Idx; + +#if WOLFSSL_XMSS_MAX_HEIGHT > 32 +/* Set index to zero. + * + * Index is up to 64-bits. + * + * @param [out] idx 32/64-bit index to zero. + */ +#define WC_IDX_ZERO(idx) w64Zero(&(idx).u64) +#else +/* Set index to zero. + * + * Index is no more than 32-bits. + * + * @param [out] idx 32/64-bit index to zero. + */ +#define WC_IDX_ZERO(idx) idx.u32 = 0 +#endif + +#if WOLFSSL_XMSS_MAX_HEIGHT > 32 +/* Decode 64-bit index. + * + * @param [out] i Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + * @param [out] ret Return value. + */ +#define IDX64_DECODE(i, c, a, ret) \ + if ((c) == 5) { \ + word32 t; \ + ato32((a) + 1, &t); \ + (i) = w64From32((a)[0], t); \ + } \ + else if ((c) == 8) { \ + ato64(a, &(i)); \ + } + +/* Decode 64-bit index. + * + * @param [out] i Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + * @param [out] ret Return value. + */ +#define XMSS_IDX64_DECODE(i, c, a, ret) \ +do { \ + IDX64_DECODE(i, c, a, ret) \ + else { \ + (ret) = NOT_COMPILED_IN; \ + } \ +} while (0) + +/* Check whether index is valid. + * + * @param [in] i Index to check. + * @param [in] c Count of bytes i was encoded in. + * @param [in] h Full tree Height. + */ +#define IDX64_INVALID(i, c, h) \ + ((w64GetHigh32(w64Add32(i, 1, NULL)) >> ((h) - 32)) != 0) + +/* Set 64-bit index as hash address value for tree. + * + * @param [in] i Index to set. + * @param [in] c Count of bytes to encode into. + * @param [in] h Height of tree. + * @param [out] a Hash address to encode into. + * @param [out] l Index of leaf. + */ +#define IDX64_SET_ADDR_TREE(i, c, h, a, l) \ + if ((c) > 4) { \ + (l) = w64GetLow32(i) & (((word32)1 << (h)) - 1);\ + (i) = w64ShiftRight(i, h); \ + (a)[XMSS_ADDR_TREE_HI] = w64GetHigh32(i); \ + (a)[XMSS_ADDR_TREE] = w64GetLow32(i); \ + } +#endif /* WOLFSSL_XMSS_MAX_HEIGHT > 32 */ + +#if WOLFSSL_XMSS_MIN_HEIGHT <= 32 +/* Decode 32-bit index. + * + * @param [out] i Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + * @param [out] ret Return value. + */ +#define IDX32_DECODE(i, c, a, ret) \ + if ((c) == 4) { \ + ato32(a, &(i)); \ + } \ + else if ((c) == 3) { \ + ato24(a, &(i)); \ + } + +/* Decode 32-bit index. + * + * @param [out] i Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + * @param [out] ret Return value. + */ +#define XMSS_IDX32_DECODE(i, c, a, ret) \ +do { \ + IDX32_DECODE(i, c, a, ret) \ + else { \ + (ret) = NOT_COMPILED_IN; \ + } \ +} while (0) + +/* Check whether 32-bit index is valid. + * + * @param [in] i Index to check. + * @param [in] c Count of bytes i was encoded in. + * @param [in] h Full tree Height. + */ +#define IDX32_INVALID(i, c, h) \ + ((((i) + 1) >> (h)) != 0) + +/* Set 32-bit index as hash address value for tree. + * + * @param [in] i Index to set. + * @param [in] c Count of bytes to encode into. + * @param [in] h Height of tree. + * @param [out] a Hash address to encode into. + * @param [out] l Index of leaf. + */ +#define IDX32_SET_ADDR_TREE(i, c, h, a, l) \ + if ((c) <= 4) { \ + (l) = ((i) & ((1 << (h)) - 1)); \ + (i) >>= params->sub_h; \ + (a)[XMSS_ADDR_TREE] = (i); \ + } + +#endif /* WOLFSSL_XMSS_MIN_HEIGHT <= 32 */ + +#if (WOLFSSL_XMSS_MAX_HEIGHT > 32) && (WOLFSSL_XMSS_MIN_HEIGHT <= 32) + +/* Decode 32/64-bit index. + * + * @param [out] idx Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + * @param [out] ret Return value. + */ +#define WC_IDX_DECODE(idx, c, a, ret) \ +do { \ + IDX64_DECODE((idx).u64, c, a, ret) \ + else \ + IDX32_DECODE((idx).u32, c, a, ret) \ + else { \ + (ret) = NOT_COMPILED_IN; \ + } \ +} while (0) + +/* Check whether index is valid. + * + * @param [in] i Index to check. + * @param [in] c Count of bytes i was encoded in. + * @param [in] h Full tree Height. + */ +#define WC_IDX_INVALID(i, c, h) \ + ((((c) > 4) && IDX64_INVALID((i).u64, c, h)) || \ + (((c) <= 4) && IDX32_INVALID((i).u32, c, h))) + +/* Set 32/64-bit index as hash address value for tree. + * + * @param [in] i Index to set. + * @param [in] c Count of bytes to encode into. + * @param [in] h Height of tree. + * @param [out] a Hash address to encode into. + * @param [out] l Index of leaf. + */ +#define WC_IDX_SET_ADDR_TREE(idx, c, h, a, l) \ +do { \ + IDX64_SET_ADDR_TREE((idx).u64, c, h, a, l) \ + else \ + IDX32_SET_ADDR_TREE((idx).u32, c, h, a, l) \ +} while (0) + +#elif WOLFSSL_XMSS_MAX_HEIGHT > 32 + +/* Decode 64-bit index. + * + * @param [out] idx Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + * @param [out] ret Return value. + */ +#define WC_IDX_DECODE(idx, c, a, ret) \ +do { \ + IDX64_DECODE((idx).u64, c, a, ret) \ +} while (0) + +/* Check whether index is valid. + * + * @param [in] i Index to check. + * @param [in] c Count of bytes i was encoded in. + * @param [in] h Full tree Height. + */ +#define WC_IDX_INVALID(i, c, h) \ + IDX64_INVALID((i).u64, c, h) + +/* Set 64-bit index as hash address value for tree. + * + * @param [in] i Index to set. + * @param [in] c Count of bytes to encode into. + * @param [in] h Height of tree. + * @param [out] a Hash address to encode into. + * @param [out] l Index of leaf. + */ +#define WC_IDX_SET_ADDR_TREE(idx, c, h, a, l) \ +do { \ + IDX64_SET_ADDR_TREE((idx).u64, c, h, a, l) \ +} while (0) + +#else + +/* Decode 32-bit index. + * + * @param [out] idx Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + * @param [out] ret Return value. + */ +#define WC_IDX_DECODE(idx, c, a, ret) \ +do { \ + IDX32_DECODE((idx).u32, c, a, ret) \ + else { \ + (ret) = NOT_COMPILED_IN; \ + } \ +} while (0) + +/* Check whether index is valid. + * + * @param [in] i Index to check. + * @param [in] c Count of bytes i was encoded in. + * @param [in] h Full tree Height. + */ +#define WC_IDX_INVALID(i, c, h) \ + IDX32_INVALID((i).u32, c, h) + +/* Set 32-bit index as hash address value for tree. + * + * @param [in] i Index to set. + * @param [in] c Count of bytes to encode into. + * @param [in] h Height of tree. + * @param [out] a Hash address to encode into. + * @param [out] l Index of leaf. + */ +#define WC_IDX_SET_ADDR_TREE(idx, c, h, a, l) \ +do { \ + IDX32_SET_ADDR_TREE(idx.u32, c, h, a, l) \ +} while (0) + +#endif /* (WOLFSSL_XMSS_MAX_HEIGHT > 32) && (WOLFSSL_XMSS_MIN_HEIGHT <= 32) */ + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY +/* Update index by adding one to big-endian encoded value. + * + * @param [in, out] a Array index is encoded in. + * @param [in] l Length of encoded index. + */ +static void wc_idx_update(unsigned char* a, word8 l) +{ + sword8 i; + + for (i = l - 1; i >= 0; i--) { + if ((++a[i]) != 0) { + break; + } + } +} + +/* Copy index from source buffer to destination buffer. + * + * Index is put into the front of the destination buffer with the length of the + * source. + * + * @param [in] s Source buffer. + * @param [in] sl Length of index in source. + * @param [in, out] d Destination buffer. + * @param [in] dl Length of destination buffer. + */ +static void wc_idx_copy(const unsigned char* s, word8 sl, unsigned char* d, + word8 dl) +{ + XMEMCPY(d, s, sl); + XMEMSET(d + sl, 0, dl - sl); +} +#endif + +/******************************************** + * Hash Address. + ********************************************/ + +/* Set the hash address based on subtree. + * + * @param [out] a Hash address. + * @param [in] s Subtree hash address. + * @param [in] t Type of hash address. + */ +#define XMSS_ADDR_SET_SUBTREE(a, s, t) \ +do { \ + (a)[XMSS_ADDR_LAYER] = (s)[XMSS_ADDR_LAYER]; \ + (a)[XMSS_ADDR_TREE_HI] = (s)[XMSS_ADDR_TREE_HI]; \ + (a)[XMSS_ADDR_TREE] = (s)[XMSS_ADDR_TREE]; \ + (a)[XMSS_ADDR_TYPE] = (t); \ + XMEMSET((a) + 4, 0, sizeof(a) - 4 * sizeof(*(a)));\ +} while (0) + +/* Set the OTS hash address based on subtree. + * + * @param [out] a Hash address. + * @param [in] s Subtree hash address. + */ +#define XMSS_ADDR_OTS_SET_SUBTREE(a, s) \ + XMSS_ADDR_SET_SUBTREE(a, s, WC_XMSS_ADDR_TYPE_OTS) +/* Set the L-tree address based on subtree. + * + * @param [out] a Hash address. + * @param [in] s Subtree hash address. + */ +#define XMSS_ADDR_LTREE_SET_SUBTREE(a, s) \ + XMSS_ADDR_SET_SUBTREE(a, s, WC_XMSS_ADDR_TYPE_LTREE) +/* Set the hash tree address based on subtree. + * + * @param [out] a Hash address. + * @param [in] s Subtree hash address. + */ +#define XMSS_ADDR_TREE_SET_SUBTREE(a, s) \ + XMSS_ADDR_SET_SUBTREE(a, s, WC_XMSS_ADDR_TYPE_TREE) + +#ifdef LITTLE_ENDIAN_ORDER + +/* Set a byte value into a word of an encoded address. + * + * @param [in, out] a Encoded hash address. + * @param [in] i Index of word. + * @param [in] b Byte to set. + */ +#define XMSS_ADDR_SET_BYTE(a, i, b) \ + ((word32*)(a))[i] = (word32)(b) << 24 + +#else + +/* Set a byte value into a word of an encoded address. + * + * @param [in, out] a Encoded hash address. + * @param [in] i Index of word. + * @param [in] b Byte to set. + */ +#define XMSS_ADDR_SET_BYTE(a, i, b) \ + ((word32*)(a))[i] = (b) + +#endif /* LITTLE_ENDIAN_ORDER */ + +/* Convert hash address to bytes. + * + * @param [out] bytes Array to encode into. + * @param [in] addr Hash address. + */ +static void wc_xmss_addr_encode(const HashAddress addr, byte* bytes) +{ + c32toa((addr)[0], (bytes) + (0 * 4)); + c32toa((addr)[1], (bytes) + (1 * 4)); + c32toa((addr)[2], (bytes) + (2 * 4)); + c32toa((addr)[3], (bytes) + (3 * 4)); + c32toa((addr)[4], (bytes) + (4 * 4)); + c32toa((addr)[5], (bytes) + (5 * 4)); + c32toa((addr)[6], (bytes) + (6 * 4)); + c32toa((addr)[7], (bytes) + (7 * 4)); +} + +/******************************************** + * HASHING + ********************************************/ + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) && \ + !defined(WC_XMSS_FULL_HASH) + +/* Set hash data and length into SHA-256 digest. + * + * @param [in, out] state XMSS/MT state with SHA-256 digest. + * @param [in] data Data to add to hash. + * @param [in] len Number of bytes in data. + * Must be less than a block. + * @param [in] total_len Number of bytes updated so far. + */ +#define XMSS_SHA256_SET_DATA(state, data, len, total_len) \ +do { \ + XMEMCPY((state)->digest.sha256.buffer, data, len); \ + (state)->digest.sha256.buffLen = (len); \ + (state)->digest.sha256.loLen = (total_len); \ +} while (0) + +/* Save the SHA-256 state to cache. + * + * @param [in, out] state XMSS/MT state with SHA-256 digest and state cache. + */ +#define XMSS_SHA256_STATE_CACHE(state) \ + (state)->dgst_state[0] = (state)->digest.sha256.digest[0]; \ + (state)->dgst_state[1] = (state)->digest.sha256.digest[1]; \ + (state)->dgst_state[2] = (state)->digest.sha256.digest[2]; \ + (state)->dgst_state[3] = (state)->digest.sha256.digest[3]; \ + (state)->dgst_state[4] = (state)->digest.sha256.digest[4]; \ + (state)->dgst_state[5] = (state)->digest.sha256.digest[5]; \ + (state)->dgst_state[6] = (state)->digest.sha256.digest[6]; \ + (state)->dgst_state[7] = (state)->digest.sha256.digest[7]; \ + +/* Restore the SHA-256 state from cache and set length. + * + * @param [in, out] state XMSS/MT state with SHA-256 digest and state cache. + * @param [in] len Number of bytes of data hashed so far. + */ +#define XMSS_SHA256_STATE_RESTORE(state, len) \ +do { \ + (state)->digest.sha256.digest[0] = (state)->dgst_state[0]; \ + (state)->digest.sha256.digest[1] = (state)->dgst_state[1]; \ + (state)->digest.sha256.digest[2] = (state)->dgst_state[2]; \ + (state)->digest.sha256.digest[3] = (state)->dgst_state[3]; \ + (state)->digest.sha256.digest[4] = (state)->dgst_state[4]; \ + (state)->digest.sha256.digest[5] = (state)->dgst_state[5]; \ + (state)->digest.sha256.digest[6] = (state)->dgst_state[6]; \ + (state)->digest.sha256.digest[7] = (state)->dgst_state[7]; \ + (state)->digest.sha256.loLen = (len); \ +} while (0) + +/* Restore the SHA-256 state from cache and set data and length. + * + * @param [in, out] state XMSS/MT state with SHA-256 digest and cache. + * @param [in] data Data to add to hash. + * @param [in] len Number of bytes in data. + * Must be less than a block. + * @param [in] total_len Number of bytes updated so far. + */ +#define XMSS_SHA256_STATE_RESTORE_DATA(state, data, len, total_len) \ +do { \ + (state)->digest.sha256.digest[0] = (state)->dgst_state[0]; \ + (state)->digest.sha256.digest[1] = (state)->dgst_state[1]; \ + (state)->digest.sha256.digest[2] = (state)->dgst_state[2]; \ + (state)->digest.sha256.digest[3] = (state)->dgst_state[3]; \ + (state)->digest.sha256.digest[4] = (state)->dgst_state[4]; \ + (state)->digest.sha256.digest[5] = (state)->dgst_state[5]; \ + (state)->digest.sha256.digest[6] = (state)->dgst_state[6]; \ + (state)->digest.sha256.digest[7] = (state)->dgst_state[7]; \ + XMSS_SHA256_SET_DATA(state, data, len, total_len); \ +} while (0) + +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 && !WC_XMSS_FULL_HASH */ + +/* Hash the data into output buffer. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] in Data to digest. + * @param [in] inlen Length of data to digest in bytes. + * @param [out] out Buffer to put digest into. + */ +static WC_INLINE void wc_xmss_hash(XmssState* state, const byte* in, + word32 inlen, byte* out) +{ + int ret; + const XmssParams* params = state->params; + +#ifdef WC_XMSS_SHA256 + /* Full SHA-256 digest. */ + if ((params->hash == WC_HASH_TYPE_SHA256) && + (params->n == WC_SHA256_DIGEST_SIZE)) { + ret = wc_Sha256Update(&state->digest.sha256, in, inlen); + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, out); + } + } +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE <= 192 && WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 192 + /* Partial SHA-256 digest. */ + else if (params->hash == WC_HASH_TYPE_SHA256) { + byte buf[WC_SHA256_DIGEST_SIZE]; + ret = wc_Sha256Update(&state->digest.sha256, in, inlen); + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, buf); + } + if (ret == 0) { + XMEMCPY(out, buf, params->n); + } + } +#endif + else +#endif /* WC_XMSS_SHA256 */ +#ifdef WC_XMSS_SHA512 + /* Full SHA-512 digest. */ + if (params->hash == WC_HASH_TYPE_SHA512) { + ret = wc_Sha512Update(&state->digest.sha512, in, inlen); + if (ret == 0) { + ret = wc_Sha512Final(&state->digest.sha512, out); + } + } + else +#endif /* WC_XMSS_SHA512 */ +#ifdef WC_XMSS_SHAKE128 + /* Digest with SHAKE-128. */ + if (params->hash == WC_HASH_TYPE_SHAKE128) { + ret = wc_Shake128_Update(&state->digest.shake, in, inlen); + if (ret == 0) { + ret = wc_Shake128_Final(&state->digest.shake, out, params->n); + } + } + else +#endif /* WC_XMSS_SHAKE128 */ +#ifdef WC_XMSS_SHAKE256 + /* Digest with SHAKE-256. */ + if (params->hash == WC_HASH_TYPE_SHAKE256) { + ret = wc_Shake256_Update(&state->digest.shake, in, inlen); + if (ret == 0) { + ret = wc_Shake256_Final(&state->digest.shake, out, params->n); + } + } + else +#endif /* WC_XMSS_SHAKE256 */ + { + /* Unsupported digest function. */ + ret = NOT_COMPILED_IN; + } + + if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +} + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) +#ifndef WC_XMSS_FULL_HASH +/* Chain hashing. + * + * RFC 8391: 3.1.2, Algorithm 2: chain - Chaining Function + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM = PRF(SEED, ADRS); + * tmp = F(KEY, tmp XOR BM); + * return tmp; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] tmp Temporary buffer holding chain data. + * @param [in] addr Hash address as a byte array. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_chain_hash_sha256_32(XmssState* state, const byte* tmp, + byte* addr, byte* hash) +{ + /* Offsets into chain hash data. */ + byte* pad = state->buf; + byte* key = pad + XMSS_SHA256_32_PAD_LEN; + byte* bm = key + XMSS_SHA256_32_N; + int ret; + + /* Calculate n-byte key - KEY. */ + ((word32*)addr)[XMSS_ADDR_KEY_MASK] = 0; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, key); + + if (ret == 0) { + /* Calculate n-byte bit mask - BM. */ + addr[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, bm); + } + + if (ret == 0) { + /* Function padding set in caller. */ + xorbuf(bm, tmp, XMSS_SHA256_32_N); + ret = wc_Sha256Update(&state->digest.sha256, state->buf, + XMSS_CHAIN_HASH_DATA_LEN_SHA256_32); + } + if (ret == 0) { + /* Calculate the chain hash. */ + ret = wc_Sha256Final(&state->digest.sha256, hash); + } + if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +} +#else +/* Chain hashing. + * + * Padding, seed, addr for PRF set by caller into prf_buf. + * + * RFC 8391: 3.1.2, Algorithm 2: chain - Chaining Function + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM = PRF(SEED, ADRS); + * tmp = F(KEY, tmp XOR BM); + * return tmp; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] tmp Temporary buffer holding chain data. + * @param [out] out Buffer to hold hash. + */ +static void wc_xmss_chain_hash_sha256_32(XmssState* state, const byte* tmp, + byte* hash) +{ + byte* addr = state->prf_buf + XMSS_SHA256_32_PAD_LEN + XMSS_SHA256_32_N; + /* Offsets into chain hash data. */ + byte* pad = state->buf; + byte* key = pad + XMSS_SHA256_32_PAD_LEN; + byte* bm = key + XMSS_SHA256_32_N; + + /* Calculate n-byte key - KEY. */ + ((word32*)addr)[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, key); + /* Calculate the n-byte mask. */ + addr[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, bm); + + /* Function padding set in caller. */ + xorbuf(bm, tmp, XMSS_SHA256_32_N); + /* Calculate the chain hash. */ + wc_xmss_hash(state, state->buf, XMSS_CHAIN_HASH_DATA_LEN_SHA256_32, hash); +} +#endif /* !WC_XMSS_FULL_HASH */ +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + +/* Chain hashing. + * + * Padding, seed, addr for PRF set by caller into prf_buf. + * + * RFC 8391: 3.1.2, Algorithm 2: chain - Chaining Function + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM = PRF(SEED, ADRS); + * tmp = F(KEY, tmp XOR BM); + * return tmp; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] tmp Temporary buffer holding chain data. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_chain_hash(XmssState* state, const byte* tmp, byte* hash) +{ + const XmssParams* params = state->params; + byte* addr = state->prf_buf + params->pad_len + params->n; + /* Offsets into chain hash data. */ + byte* pad = state->buf; + byte* key = pad + params->pad_len; + byte* bm = key + params->n; + + /* Calculate n-byte key - KEY. */ + ((word32*)addr)[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN(params), key); + /* Calculate n-byte bit mask - BM. */ + addr[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN(params), bm); + + /* Function padding set in caller. */ + xorbuf(bm, tmp, params->n); + /* Calculate the chain hash. */ + wc_xmss_hash(state, state->buf, XMSS_CHAIN_HASH_DATA_LEN(params), hash); +} + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) +#ifndef WC_XMSS_FULL_HASH +/* Randomized tree hashing. + * + * RFC 8391: 4.1.4, Algorithm 7: RAND_HASH + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM_0 = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(2); + * BM_1 = PRF(SEED, ADRS); + * return H(KEY, (LEFT XOR BM_0) || (RIGHT XOR BM_1)); + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] data Input data. + * @param [in] addr Hash address. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_rand_hash_sha256_32_prehash(XmssState* state, + const byte* data, HashAddress addr, byte* hash) +{ + int ret; + /* Offsets into rand hash data. */ + byte* pad = state->buf; + byte* key = pad + XMSS_SHA256_32_PAD_LEN; + byte* bm0 = key + XMSS_SHA256_32_N; + byte* bm1 = bm0 + XMSS_SHA256_32_N; + byte addr_buf[WC_XMSS_ADDR_LEN]; + + addr[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_addr_encode(addr, addr_buf); + + /* Calculate n-byte key - KEY. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, key); + + /* Calculate n-byte mask - BM_0. */ + if (ret == 0) { + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, bm0); + } + + /* Calculate n-byte mask - BM_1. */ + if (ret == 0) { + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 2; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, bm1); + } + + if (ret == 0) { + XMSS_PAD_ENC(XMSS_HASH_PADDING_H, pad, XMSS_SHA256_32_PAD_LEN); + /* XOR into bm0 and bm1. */ + xorbuf(bm0, data, XMSS_SHA256_32_N * 2); + ret = wc_Sha256Update(&state->digest.sha256, state->buf, + XMSS_RAND_HASH_DATA_LEN_SHA256_32); + } + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, hash); + } + if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +} +#endif /* !WC_XMSS_FULL_HASH */ + +/* Randomized tree hashing. + * + * RFC 8391: 4.1.4, Algorithm 7: RAND_HASH + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM_0 = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(2); + * BM_1 = PRF(SEED, ADRS); + * return H(KEY, (LEFT XOR BM_0) || (RIGHT XOR BM_1)); + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] data Input data. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_rand_hash_sha256_32(XmssState* state, const byte* data, + const byte* pk_seed, HashAddress addr, byte* hash) +{ + byte* addr_buf = state->prf_buf + XMSS_SHA256_32_PAD_LEN + + XMSS_SHA256_32_N; + /* Offsets into rand hash data. */ + byte* pad = state->buf; + byte* key = pad + XMSS_SHA256_32_PAD_LEN; + byte* bm0 = key + XMSS_SHA256_32_N; + byte* bm1 = bm0 + XMSS_SHA256_32_N; +#ifndef WC_XMSS_FULL_HASH + int ret; + + /* Encode padding byte for PRF. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, state->prf_buf, XMSS_SHA256_32_PAD_LEN); + /* Append public seed for PRF. */ + XMEMCPY(state->prf_buf + XMSS_SHA256_32_PAD_LEN, pk_seed, + XMSS_SHA256_32_N); + + /* Set key mask to initial value and append encoding. */ + addr[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_addr_encode(addr, addr_buf); + + /* Calculate n-byte key - KEY. */ + ret = wc_Sha256Update(&state->digest.sha256, state->prf_buf, + XMSS_SHA256_32_PAD_LEN + XMSS_SHA256_32_N); + if (ret == 0) { + /* Copy state after first 64 bytes. */ + XMSS_SHA256_STATE_CACHE(state); + /* Copy in remaining 32 bytes to buffer. */ + XMSS_SHA256_SET_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, key); + } + + /* Calculate n-byte mask - BM_0. */ + if (ret == 0) { + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, bm0); + } + + /* Calculate n-byte mask - BM_1. */ + if (ret == 0) { + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 2; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, bm1); + } + + if (ret == 0) { + XMSS_PAD_ENC(XMSS_HASH_PADDING_H, pad, XMSS_SHA256_32_PAD_LEN); + /* XOR into bm0 and bm1. */ + xorbuf(bm0, data, 2 * XMSS_SHA256_32_N); + ret = wc_Sha256Update(&state->digest.sha256, state->buf, + XMSS_RAND_HASH_DATA_LEN_SHA256_32); + } + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, hash); + } + if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +#else + /* Encode padding byte for PRF. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, state->prf_buf, XMSS_SHA256_32_PAD_LEN); + /* Append public seed for PRF. */ + XMEMCPY(state->prf_buf + XMSS_SHA256_32_PAD_LEN, pk_seed, + XMSS_SHA256_32_N); + + /* Set key mask to initial value and append encoding. */ + addr[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_addr_encode(addr, addr_buf); + + /* Calculate n-byte key - KEY. */ + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, key); + /* Calculate n-byte mask - BM_0. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, bm0); + /* Calculate n-byte mask - BM_1. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 2; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, bm1); + + XMSS_PAD_ENC(XMSS_HASH_PADDING_H, state->buf, XMSS_SHA256_32_PAD_LEN); + xorbuf(bm0, data, 2 * XMSS_SHA256_32_N); + wc_xmss_hash(state, state->buf, XMSS_RAND_HASH_DATA_LEN_SHA256_32, hash); +#endif /* WC_XMSS_FULL_HASH */ +} +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + +/* Randomized tree hashing. + * + * RFC 8391: 4.1.4, Algorithm 7: RAND_HASH + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM_0 = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(2); + * BM_1 = PRF(SEED, ADRS); + * return H(KEY, (LEFT XOR BM_0) || (RIGHT XOR BM_1)); + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] data Input data. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_rand_hash(XmssState* state, const byte* data, + const byte* pk_seed, HashAddress addr, byte* hash) +{ + const XmssParams* params = state->params; + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) + if ((params->pad_len == XMSS_SHA256_32_PAD_LEN) && + (params->n == XMSS_SHA256_32_N) && + (params->hash == WC_HASH_TYPE_SHA256)) { + wc_xmss_rand_hash_sha256_32(state, data, pk_seed, addr, hash); + } + else +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + { + byte* addr_buf = state->prf_buf + params->pad_len + params->n; + /* Offsets into rand hash data. */ + byte* pad = state->buf; + byte* key = pad + params->pad_len; + byte* bm0 = key + params->n; + byte* bm1 = bm0 + params->n; + const word32 len = params->pad_len + params->n + WC_XMSS_ADDR_LEN; + + /* Encode padding byte for PRF. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, state->prf_buf, params->pad_len); + /* Append public seed for PRF. */ + XMEMCPY(state->prf_buf + params->pad_len, pk_seed, params->n); + + /* Set key mask to initial value and append encoding. */ + addr[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_addr_encode(addr, addr_buf); + + /* Calculate n-byte key - KEY. */ + wc_xmss_hash(state, state->prf_buf, len, key); + /* Calculate n-byte mask - BM_0. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + wc_xmss_hash(state, state->prf_buf, len, bm0); + /* Calculate n-byte mask - BM_1. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 2; + wc_xmss_hash(state, state->prf_buf, len, bm1); + + XMSS_PAD_ENC(XMSS_HASH_PADDING_H, pad, params->pad_len); + xorbuf(bm0, data, 2 * params->n); + wc_xmss_hash(state, state->buf, params->pad_len + 3 * params->n, + hash); + } +} + +#if !defined(WOLFSSL_WC_XMSS_SMALL) || defined(WOLFSSL_XMSS_VERIFY_ONLY) +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) +/* Randomized tree hashing. + * + * RFC 8391: 4.1.4, Algorithm 7: RAND_HASH + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM_0 = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(2); + * BM_1 = PRF(SEED, ADRS); + * return H(KEY, (LEFT XOR BM_0) || (RIGHT XOR BM_1)); + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] left First half of data. + * @param [in] right Second half of data. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_rand_hash_lr_sha256_32(XmssState* state, const byte* left, + const byte* right, const byte* pk_seed, HashAddress addr, byte* hash) +{ + byte* addr_buf = state->prf_buf + XMSS_SHA256_32_PAD_LEN + + XMSS_SHA256_32_N; + /* Offsets into rand hash data. */ + byte* pad = state->buf; + byte* key = pad + XMSS_SHA256_32_PAD_LEN; + byte* bm0 = key + XMSS_SHA256_32_N; + byte* bm1 = bm0 + XMSS_SHA256_32_N; +#ifndef WC_XMSS_FULL_HASH + int ret; + + /* Encode padding byte for PRF. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, state->prf_buf, XMSS_SHA256_32_PAD_LEN); + /* Append public seed for PRF. */ + XMEMCPY(state->prf_buf + XMSS_SHA256_32_PAD_LEN, pk_seed, + XMSS_SHA256_32_N); + + /* Set key mask to initial value and append encoding. */ + addr[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_addr_encode(addr, addr_buf); + + /* Calculate n-byte key - KEY. */ + ret = wc_Sha256Update(&state->digest.sha256, state->prf_buf, + XMSS_SHA256_32_PAD_LEN + XMSS_SHA256_32_N); + if (ret == 0) { + /* Copy state after first 64 bytes. */ + XMSS_SHA256_STATE_CACHE(state); + /* Copy in remaining 32 bytes to buffer. */ + XMSS_SHA256_SET_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, key); + } + + /* Calculate n-byte mask - BM_0. */ + if (ret == 0) { + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, bm0); + } + + /* Calculate n-byte mask - BM_1. */ + if (ret == 0) { + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 2; + /* Copy back state after first 64 bytes. */ + XMSS_SHA256_STATE_RESTORE_DATA(state, addr_buf, WC_XMSS_ADDR_LEN, + XMSS_HASH_PRF_DATA_LEN_SHA256_32); + /* Calculate hash. */ + ret = wc_Sha256Final(&state->digest.sha256, bm1); + } + + if (ret == 0) { + XMSS_PAD_ENC(XMSS_HASH_PADDING_H, pad, XMSS_SHA256_32_PAD_LEN); + /* XOR into bm0 and bm1. */ + XMEMCPY(state->prf_buf, left, XMSS_SHA256_32_N); + XMEMCPY(state->prf_buf + XMSS_SHA256_32_N, right, XMSS_SHA256_32_N); + xorbuf(bm0, state->prf_buf, 2 * XMSS_SHA256_32_N); + ret = wc_Sha256Update(&state->digest.sha256, state->buf, + XMSS_RAND_HASH_DATA_LEN_SHA256_32); + } + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, hash); + } + if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +#else + /* Encode padding byte for PRF. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, state->prf_buf, XMSS_SHA256_32_PAD_LEN); + /* Append public seed for PRF. */ + XMEMCPY(state->prf_buf + XMSS_SHA256_32_PAD_LEN, pk_seed, XMSS_SHA256_32_N); + + /* Set key mask to initial value and append encoding. */ + addr[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_addr_encode(addr, addr_buf); + + /* Calculate n-byte key - KEY. */ + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, key); + /* Calculate n-byte mask - BM_0. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, bm0); + /* Calculate n-byte mask - BM_1. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 2; + wc_xmss_hash(state, state->prf_buf, XMSS_HASH_PRF_DATA_LEN_SHA256_32, bm1); + + XMSS_PAD_ENC(XMSS_HASH_PADDING_H, state->buf, XMSS_SHA256_32_PAD_LEN); + XMEMCPY(state->prf_buf, left, XMSS_SHA256_32_N); + XMEMCPY(state->prf_buf + XMSS_SHA256_32_N, right, XMSS_SHA256_32_N); + xorbuf(bm0, state->prf_buf, 2 * XMSS_SHA256_32_N); + wc_xmss_hash(state, state->buf, XMSS_RAND_HASH_DATA_LEN_SHA256_32, hash); +#endif /* WC_XMSS_FULL_HASH */ +} +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ +/* Randomized tree hashing - left and right separate parameters. + * + * RFC 8391: 4.1.4, Algorithm 7: RAND_HASH + * ... + * ADRS.setKeyAndMask(0); + * KEY = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(1); + * BM_0 = PRF(SEED, ADRS); + * ADRS.setKeyAndMask(2); + * BM_1 = PRF(SEED, ADRS); + * return H(KEY, (LEFT XOR BM_0) || (RIGHT XOR BM_1)); + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] left First half of data. + * @param [in] right Second half of data. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_rand_hash_lr(XmssState* state, const byte* left, + const byte* right, const byte* pk_seed, HashAddress addr, byte* hash) +{ + const XmssParams* params = state->params; + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) + if ((params->pad_len == XMSS_SHA256_32_PAD_LEN) && + (params->n == XMSS_SHA256_32_N) && + (params->hash == WC_HASH_TYPE_SHA256)) { + wc_xmss_rand_hash_lr_sha256_32(state, left, right, pk_seed, addr, hash); + } + else +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + { + byte* addr_buf = state->prf_buf + params->pad_len + params->n; + /* Offsets into rand hash data. */ + byte* pad = state->buf; + byte* key = pad + params->pad_len; + byte* bm0 = key + params->n; + byte* bm1 = bm0 + params->n; + const word32 len = params->pad_len + params->n + WC_XMSS_ADDR_LEN; + + /* Encode padding byte for PRF. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, state->prf_buf, params->pad_len); + /* Append public seed for PRF. */ + XMEMCPY(state->prf_buf + params->pad_len, pk_seed, params->n); + + /* Set key mask to initial value and append encoding. */ + addr[XMSS_ADDR_KEY_MASK] = 0; + wc_xmss_addr_encode(addr, addr_buf); + + /* Calculate n-byte key - KEY. */ + wc_xmss_hash(state, state->prf_buf, len, key); + /* Calculate n-byte mask - BM_0. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 1; + wc_xmss_hash(state, state->prf_buf, len, bm0); + /* Calculate n-byte mask - BM_1. */ + addr_buf[XMSS_ADDR_KEY_MASK * 4 + 3] = 2; + wc_xmss_hash(state, state->prf_buf, len, bm1); + + XMSS_PAD_ENC(XMSS_HASH_PADDING_H, pad, params->pad_len); + XMEMCPY(state->prf_buf, left, params->n); + XMEMCPY(state->prf_buf + params->n, right, params->n); + xorbuf(bm0, state->prf_buf, 2 * params->n); + wc_xmss_hash(state, state->buf, params->pad_len + 3 * params->n, + hash); + } +} +#endif /* !WOLFSSL_WC_XMSS_SMALL || WOLFSSL_XMSS_VERIFY_ONLY */ + +/* Compute message hash from the random r, root, index and message. + * + * RFC 8391: 4.1.9, Algorithm 12: XMSS_sign + * ... + * byte[n] M' = H_msg(r || getRoot(SK) || (toByte(idx_sig, n)), M); + * RFC 8391: 5.1 + * H_msg: SHA2-256(toByte(2, 32) || KEY || M) + * H_msg: SHA2-512(toByte(2, 64) || KEY || M) + * H_msg: SHAKE128(toByte(2, 32) || KEY || M, 256) + * H_msg: SHAKE256(toByte(2, 64) || KEY || M, 512) + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] random Random value of n bytes. + * @param [in] root Public root. + * @param [in] idx Buffer holding encoded index. + * @param [in] idx_len Length of encoded index in bytes. + * @param [in] m Message to hash. + * @param [in] mlen Length of message. + * @param [out] hash Buffer to hold hash. + */ +static void wc_xmss_hash_message(XmssState* state, const byte* random, + const byte* root, const byte* idx, word8 idx_len, const byte* m, + word32 mlen, byte* hash) +{ + int ret; + const XmssParams* params = state->params; + word32 padKeyLen = params->pad_len + 3 * params->n; + /* Offsets into message hash data. */ + byte* padKey = state->buf; + byte* pad = padKey; + byte* key = pad + params->pad_len; + byte* root_sk = key + params->n; + byte* idx_sig = root_sk + params->n; + + /* Set prefix data before message. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_HASH, pad, params->pad_len); + XMEMCPY(key, random, params->n); + XMEMCPY(root_sk, root, params->n); + XMEMSET(idx_sig, 0, params->n - idx_len); + XMEMCPY(idx_sig + params->n - idx_len, idx, idx_len); + + /* Hash the padding and key first. */ +#ifdef WC_XMSS_SHA256 + if (params->hash == WC_HASH_TYPE_SHA256) { + ret = wc_Sha256Update(&state->digest.sha256, padKey, padKeyLen); + } + else +#endif /* WC_XMSS_SHA256 */ +#ifdef WC_XMSS_SHA512 + if (params->hash == WC_HASH_TYPE_SHA512) { + ret = wc_Sha512Update(&state->digest.sha512, padKey, padKeyLen); + } + else +#endif /* WC_XMSS_SHA512 */ +#ifdef WC_XMSS_SHAKE128 + if (params->hash == WC_HASH_TYPE_SHAKE128) { + ret = wc_Shake128_Update(&state->digest.shake, padKey, padKeyLen); + } + else +#endif /* WC_XMSS_SHAKE128 */ +#ifdef WC_XMSS_SHAKE256 + if (params->hash == WC_HASH_TYPE_SHAKE256) { + ret = wc_Shake256_Update(&state->digest.shake, padKey, padKeyLen); + } + else +#endif /* WC_XMSS_SHAKE256 */ + { + /* Unsupported digest function. */ + ret = NOT_COMPILED_IN; + } + if (ret == 0) { + /* Generate hash of message - M'. */ + wc_xmss_hash(state, m, mlen, hash); + } + else if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +} + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + +/* Compute PRF with key and message. + * + * RFC 8391: 5.1 + * PRF: SHA2-256(toByte(3, 32) || KEY || M) + * PRF: SHA2-512(toByte(3, 64) || KEY || M) + * PRF: SHAKE128(toByte(3, 32) || KEY || M, 256) + * PRF: SHAKE256(toByte(3, 64) || KEY || M, 512) + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] key Key used to derive pseudo-random from. + * @param [in] m 32 bytes of data to derive pseudo-random from. + * @param [out] prf Buffer to hold pseudo-random data. + */ +static void wc_xmss_prf(XmssState* state, const byte* key, const byte* m, + byte* prf) +{ + const XmssParams* params = state->params; + byte* pad = state->prf_buf; + byte* key_buf = pad + params->pad_len; + byte* m_buf = key_buf + params->n; + + /* 00[0..pl-1] || 03 || key[0..n-1] || m[0..31] */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, pad, params->pad_len); + XMEMCPY(key_buf, key, params->n); + XMEMCPY(m_buf, m, XMSS_PRF_M_LEN); + + /* Hash the PRF data. */ + wc_xmss_hash(state, state->prf_buf, params->pad_len + params->n + + XMSS_PRF_M_LEN, prf); +} + +#ifdef XMSS_CALL_PRF_KEYGEN +/* Compute PRF for keygen with key and message. + * + * NIST SP 800-208: 5.1, 5.2, 5.3, 5.4 + * PRFkeygen (KEY, M): SHA-256(toByte(4, 32) || KEY || M) + * PRFkeygen (KEY, M): T192(SHA-256(toByte(4, 4) || KEY || M)) + * PRFkeygen (KEY, M): SHAKE256(toByte(4, 32) || KEY || M, 256) + * PRFkeygen (KEY, M): SHAKE256(toByte(4, 4) || KEY || M, 192) + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] key Key of n bytes used to derive pseudo-random from. + * @param [in] m n + 32 bytes of data to derive pseudo-random from. + * @param [out] prf Buffer to hold pseudo-random data. + */ +static void wc_xmss_prf_keygen(XmssState* state, const byte* key, + const byte* m, byte* prf) +{ + const XmssParams* params = state->params; + byte* pad = state->prf_buf; + byte* key_buf = pad + params->pad_len; + byte* m_buf = key_buf + params->n; + + /* 00[0..pl-1] || 04 || key[0..n-1] || m[0..n+31] */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF_KEYGEN, pad, params->pad_len); + XMEMCPY(key_buf, key, params->n); + XMEMCPY(m_buf, m, params->n + XMSS_PRF_M_LEN); + + /* Hash the PRF keygen data. */ + wc_xmss_hash(state, state->prf_buf, params->pad_len + 2 * params->n + + XMSS_PRF_M_LEN, prf); +} +#endif /* XMSS_CALL_PRF_KEYGEN */ + +#endif /* !WOLFSSL_XMSS_VERIFY_ONLY */ + +/******************************************** + * WOTS + ********************************************/ + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) +/* Expand private seed with PRF keygen. + * + * RFC 8391: 4.1.3 + * "the existence of a method getWOTS_SK(SK, i) is assumed" + * NIST SP 800-208: 7.2.1, Algorithm 10' + * ... + * for ( j=0; j < len; j++) { + * ADRS.setChainAddress(j); + * sk[j] = PRFkeygen(S_XMSS, SEED || ADRS); + * } + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] sk_seed Buffer holding private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address as a byte array. + * @param [out] gen_seed Buffer to hold seeds. + */ +static void wc_xmss_wots_get_wots_sk_sha256_32(XmssState* state, + const byte* sk_seed, const byte* pk_seed, byte* addr, byte* gen_seed) +{ + const XmssParams* params = state->params; + word32 i; + byte* pad = state->prf_buf; + byte* s_xmss = pad + XMSS_SHA256_32_PAD_LEN; + byte* seed = s_xmss + XMSS_SHA256_32_N; + byte* addr_buf = seed + XMSS_SHA256_32_N; + int ret; + + ((word32*)addr)[XMSS_ADDR_CHAIN] = 0; + ((word32*)addr)[XMSS_ADDR_HASH] = 0; + ((word32*)addr)[XMSS_ADDR_KEY_MASK] = 0; + + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF_KEYGEN, pad, XMSS_SHA256_32_PAD_LEN); + XMEMCPY(s_xmss, sk_seed, XMSS_SHA256_32_N); + XMEMCPY(seed, pk_seed, XMSS_SHA256_32_N); + XMEMCPY(addr_buf, addr, WC_XMSS_ADDR_LEN); + +#ifndef WC_XMSS_FULL_HASH + ret = wc_Sha256Update(&state->digest.sha256, pad, XMSS_SHA256_32_PAD_LEN + + XMSS_SHA256_32_N); + if (ret == 0) { + /* Copy state after first 64 bytes. */ + XMSS_SHA256_STATE_CACHE(state); + ret = wc_Sha256Update(&state->digest.sha256, seed, XMSS_SHA256_32_N + + WC_XMSS_ADDR_LEN); + } + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, gen_seed); + } + for (i = 1; (ret == 0) && (i < params->wots_len); i++) { + gen_seed += XMSS_SHA256_32_N; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + XMSS_SHA256_STATE_RESTORE(state, 64); + ret = wc_Sha256Update(&state->digest.sha256, seed, XMSS_SHA256_32_N + + WC_XMSS_ADDR_LEN); + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, gen_seed); + } + } +#else + ret = wc_Sha256Update(&state->digest.sha256, state->prf_buf, + XMSS_SHA256_32_PAD_LEN + 2 * XMSS_SHA256_32_N + WC_XMSS_ADDR_LEN); + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, gen_seed); + } + for (i = 1; (ret == 0) && i < params->wots_len; i++) { + gen_seed += XMSS_SHA256_32_N; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + ret = wc_Sha256Update(&state->digest.sha256, state->prf_buf, + XMSS_SHA256_32_PAD_LEN + 2 * XMSS_SHA256_32_N + WC_XMSS_ADDR_LEN); + if (ret == 0) { + ret = wc_Sha256Final(&state->digest.sha256, gen_seed); + } + } +#endif /* WC_XMSS_FULL_HASH*/ + + if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +} +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + +/* Expand private seed with PRF keygen. + * + * RFC 8391: 4.1.3 + * "the existence of a method getWOTS_SK(SK, i) is assumed" + * NIST SP 800-208: 7.2.1 + * Algorithm 10' + * ... + * for ( j=0; j < len; j++) { + * ADRS.setChainAddress(j); + * sk[j] = PRFkeygen(S_XMSS, SEED || ADRS); + * } + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] sk_seed Buffer holding private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address as a byte array. + * @param [out] gen_seed Buffer to hold seeds. + */ +static void wc_xmss_wots_get_wots_sk(XmssState* state, const byte* sk_seed, + const byte* pk_seed, byte* addr, byte* gen_seed) +{ + const XmssParams* params = state->params; + word32 i; +#ifdef XMSS_CALL_PRF_KEYGEN + byte* seed = state->buf; + byte* addr_buf = seed + params->n; +#else + byte* pad = state->prf_buf; + byte* s_xmss = pad + params->pad_len; + byte* seed = s_xmss + params->n; + byte* addr_buf = seed + params->n; + const word32 len = params->pad_len + params->n * 2 + WC_XMSS_ADDR_LEN; +#endif /* XMSS_CALL_PRF_KEYGEN */ + + /* Ensure hash address fields are 0. */ + ((word32*)addr)[XMSS_ADDR_CHAIN] = 0; + ((word32*)addr)[XMSS_ADDR_HASH] = 0; + ((word32*)addr)[XMSS_ADDR_KEY_MASK] = 0; + +#ifdef XMSS_CALL_PRF_KEYGEN + /* Copy the seed and address into PRF keygen message buffer. */ + XMEMCPY(seed, pk_seed, params->n); + XMEMCPY(addr_buf, addr, WC_XMSS_ADDR_LEN); + + wc_xmss_prf_keygen(state, sk_seed, state->buf, gen_seed); + for (i = 1; i < params->wots_len; i++) { + gen_seed += params->n; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_prf_keygen(state, sk_seed, state->buf, gen_seed); + } +#else + /* Copy the PRF keygen fields into one buffer. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF_KEYGEN, pad, params->pad_len); + XMEMCPY(s_xmss, sk_seed, params->n); + XMEMCPY(seed, pk_seed, params->n); + XMEMCPY(addr_buf, addr, WC_XMSS_ADDR_LEN); + + /* Fill output with hashes of different chain hash addresses. */ + wc_xmss_hash(state, state->prf_buf, len, gen_seed); + for (i = 1; i < params->wots_len; i++) { + gen_seed += params->n; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_hash(state, state->prf_buf, len, gen_seed); + } +#endif /* XMSS_CALL_PRF_KEYGEN */ +} + +#endif /* !WOLFSSL_XMSS_VERIFY_ONLY */ + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) +/* Chain hashing to calculate node hash. + * + * RFC 8391: 3.1.2, Algorithm 2 - recursive. + * This function is an iterative version. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] data Initial data to hash. + * @param [in] start Starting hash value in hash address. + * @param [in] steps Size of step. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address as a byte array. + * @param [out] hash Chained hash. + */ +static void wc_xmss_chain_sha256_32(XmssState* state, const byte* data, + unsigned int start, unsigned int steps, const byte* pk_seed, byte* addr, + byte* hash) +{ + if (steps > 0) { + word32 i; + byte* pad = state->prf_buf; + byte* seed = pad + XMSS_SHA256_32_PAD_LEN; +#ifndef WC_XMSS_FULL_HASH + int ret; + + /* Set data for PRF hash. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, pad, XMSS_SHA256_32_PAD_LEN); + XMEMCPY(seed, pk_seed, XMSS_SHA256_32_N); + + /* Hash first 64 bytes. */ + ret = wc_Sha256Update(&state->digest.sha256, state->prf_buf, + XMSS_SHA256_32_PAD_LEN + XMSS_SHA256_32_N); + if (ret == 0) { + /* Copy state after first 64 bytes. */ + XMSS_SHA256_STATE_CACHE(state); + /* Only do this once for all chain hash calls. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_F, state->buf, + state->params->pad_len); + + /* Set address. */ + XMSS_ADDR_SET_BYTE(addr, XMSS_ADDR_HASH, start); + wc_xmss_chain_hash_sha256_32(state, data, addr, hash); + /* Iterate 'steps' calls to the hash function. */ + for (i = start+1; i < (start+steps) && i < XMSS_WOTS_W; i++) { + addr[XMSS_ADDR_HASH * 4 + 3] = i; + wc_xmss_chain_hash_sha256_32(state, hash, addr, hash); + } + } + else if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } +#else + const XmssParams* params = state->params; + byte* addr_buf = seed + XMSS_SHA256_32_N; + + /* Set data for PRF hash. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, pad, XMSS_SHA256_32_PAD_LEN); + XMEMCPY(seed, pk_seed, params->n); + XMEMCPY(addr_buf, addr, WC_XMSS_ADDR_LEN); + + /* Only do this once for all chain hash calls. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_F, state->buf, params->pad_len); + + /* Set address. */ + XMSS_ADDR_SET_BYTE(addr_buf, XMSS_ADDR_HASH, start); + wc_xmss_chain_hash_sha256_32(state, data, hash); + /* Iterate 'steps' calls to the hash function. */ + for (i = start+1; i < (start+steps) && i < XMSS_WOTS_W; i++) { + addr_buf[XMSS_ADDR_HASH * 4 + 3] = i; + wc_xmss_chain_hash_sha256_32(state, hash, hash); + } +#endif /* !WC_XMSS_FULL_HASH */ + } + else if (hash != data) { + XMEMCPY(hash, data, XMSS_SHA256_32_N); + } +} +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + +/* Chain hashing to calculate node hash. + * + * RFC 8391: 3.1.2, Algorithm 2 - recursive. + * This function is an iterative version. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] data Initial data to hash. + * @param [in] start Starting hash value in hash address. + * @param [in] steps Size of step. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address as a byte array. + * @param [out] hash Chained hash. + */ +static void wc_xmss_chain(XmssState* state, const byte* data, + unsigned int start, unsigned int steps, const byte* pk_seed, byte* addr, + byte* hash) +{ + const XmssParams* params = state->params; + + if (steps > 0) { + word32 i; + byte* pad = state->prf_buf; + byte* seed = pad + params->pad_len; + byte* addr_buf = seed + params->n; + + /* Set data for PRF hash. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, pad, params->pad_len); + XMEMCPY(seed, pk_seed, params->n); + XMEMCPY(addr_buf, addr, 32); + + /* Only do this once for all chain hash calls. */ + XMSS_PAD_ENC(XMSS_HASH_PADDING_F, state->buf, params->pad_len); + + /* Set address. */ + XMSS_ADDR_SET_BYTE(addr_buf, XMSS_ADDR_HASH, start); + wc_xmss_chain_hash(state, data, hash); + /* Iterate 'steps' calls to the hash function. */ + for (i = start+1; i < (start+steps) && i < XMSS_WOTS_W; i++) { + addr_buf[XMSS_ADDR_HASH * 4 + 3] = i; + wc_xmss_chain_hash(state, hash, hash); + } + } + else if (hash != data) { + XMEMCPY(hash, data, params->n); + } +} + +/* Convert base on message and add checksum. + * + * RFC 8391:, 2.6, Algorithm 1: base_w + * int in = 0; + * int out = 0; + * unsigned int total = 0; + * int bits = 0; + * int consumed; + * + * for ( consumed = 0; consumed < out_len; consumed++ ) { + * if ( bits == 0 ) { + * total = X[in]; + * in++; + * bits += 8; + * } + * bits -= lg(w); + * basew[out] = (total >> bits) AND (w - 1); + * out++; + * } + * return basew; + * + * base_w implemented for w == 16 (lg(w) == 4). + * + * RFC 8391: 3.1.5, Algorithm 5: + * ... + * csum = 0; + * + * # Convert message to base w + * msg = base_w(M, w, len_1); + * # Compute checksum + * for ( i = 0; i < len_1; i++ ) { + * csum = csum + w - 1 - msg[i]; + * } + * + * # Convert csum to base w + * csum = csum << ( 8 - ( ( len_2 * lg(w) ) % 8 )); + * len_2_bytes = ceil( ( len_2 * lg(w) ) / 8 ); + * msg = msg || base_w(toByte(csum, len_2_bytes), w, len_2); + * + * len_1 == 8 * n / 4 = n * 2 + * Implemented for len_2 == 3 + * + * @param [in] m Message data. + * @param [in] n Number of bytes in hash. + * @param [out] msg Message in new base. + */ +static void wc_xmss_msg_convert(const byte* m, word8 n, word8* msg) +{ + word8 i; + word16 csum = 0; + + /* Split each full byte of m into two bytes of msg. */ + for (i = 0; i < n; i++) { + msg[0] = m[i] >> 4; + msg[1] = m[i] & 0xf; + csum += XMSS_WOTS_W - 1 - msg[0]; + csum += XMSS_WOTS_W - 1 - msg[1]; + msg += 2; + } + + /* Append checksum to message. (Maximum value: 1920 = 64 * 2 * 15) */ + msg[0] = (csum >> 8) ; + msg[1] = (csum >> 4) & 0x0f; + msg[2] = (csum ) & 0x0f; +} + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + +/* WOTS+ generate public key with private seed. + * + * RFC 8391: 4.1.6, Algorithm 9: + * ... + * pk = WOTS_genPK (getWOTS_SK(SK, s + i), SEED, ADRS); + * RFC 8391, 3.1.4, Algorithm 4: WOTS_genPK + * ... + * for ( i = 0; i < len; i++ ) { + * ADRS.setChainAddress(i); + * pk[i] = chain(sk[i], 0, w - 1, SEED, ADRS); + * } + * return pk; + * + * WOTS_genPK only used in Algorithm 9 and it is convenient to combine with + * getWOTS_SK due to parameter specific implementations. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] sk Random private seed. + * @param [in] seed Random public seed. + * @param [in] addr Hashing address. + * @param [out] pk Public key. + */ +static void wc_xmss_wots_gen_pk(XmssState* state, const byte* sk, + const byte* seed, HashAddress addr, byte* pk) +{ + const XmssParams* params = state->params; + byte* addr_buf = state->encMsg; + word32 i; + + /* Ensure chain address is 0 and encode into a buffer. */ + addr[XMSS_ADDR_CHAIN] = 0; + wc_xmss_addr_encode(addr, addr_buf); + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) + if ((params->pad_len == XMSS_SHA256_32_PAD_LEN) && + (params->n == XMSS_SHA256_32_N) && + (params->hash == WC_HASH_TYPE_SHA256)) { + /* Expand the private seed - getWOTS_SK */ + wc_xmss_wots_get_wots_sk_sha256_32(state, sk, seed, addr_buf, + pk); + + /* Calculate chain hash. */ + wc_xmss_chain_sha256_32(state, pk, 0, XMSS_WOTS_W - 1, seed, addr_buf, + pk); + for (i = 1; i < params->wots_len; i++) { + pk += params->n; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_chain_sha256_32(state, pk, 0, XMSS_WOTS_W - 1, seed, + addr_buf, pk); + } + } + else +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + { + /* Expand the private seed - getWOTS_SK */ + wc_xmss_wots_get_wots_sk(state, sk, seed, addr_buf, pk); + + /* Calculate chain hash. */ + wc_xmss_chain(state, pk, 0, XMSS_WOTS_W - 1, seed, addr_buf, pk); + for (i = 1; i < params->wots_len; i++) { + pk += params->n; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_chain(state, pk, 0, XMSS_WOTS_W - 1, seed, addr_buf, pk); + } + } +} +/* Generate a signature from a privatge key and message. + * + * RFC 8391: 4.1.9, Algorithm 11: treeSig + * sig_ots = WOTS_sign(getWOTS_SK(SK, idx_sig), + * M', getSEED(SK), ADRS); + * RFC 8391: 3.1.5, Algorithm 5: WOTS_sign + * (Convert message to base w and append checksum in base w) + * ... + * for ( i = 0; i < len; i++ ) { + * ADRS.setChainAddress(i); + * sig[i] = chain(sk[i], 0, msg[i], SEED, ADRS); + * } + * return sig; + * + * WOTS_sign only used in Algorithm 11 and convenient to do getWOTS_SK due to + * hash address reuse and parameter specific implementations. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] m Message hash to sign. + * @param [in] sk Random private seed. + * @param [in] seed Random public seed. + * @param [in] addr Hashing address. + * @param [out] sig Calculated XMSS/MT signature. + */ +static void wc_xmss_wots_sign(XmssState* state, const byte* m, + const byte* sk, const byte* seed, HashAddress addr, byte* sig) +{ + const XmssParams* params = state->params; + byte* addr_buf = state->pk; + word32 i; + + /* Convert message to base w and append checksum in base w. */ + wc_xmss_msg_convert(m, params->n, state->encMsg); + + /* Set initial chain value and encode hash address. */ + addr[XMSS_ADDR_CHAIN] = 0; + wc_xmss_addr_encode(addr, addr_buf); + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) + if ((params->pad_len == XMSS_SHA256_32_PAD_LEN) && + (params->n == XMSS_SHA256_32_N) && + (params->hash == WC_HASH_TYPE_SHA256)) { + /* Expand the private seed - getWOTS_SK */ + wc_xmss_wots_get_wots_sk_sha256_32(state, sk, seed, addr_buf, sig); + + /* Calculate chain hash. */ + wc_xmss_chain_sha256_32(state, sig, 0, state->encMsg[0], seed, addr_buf, + sig); + for (i = 1; i < params->wots_len; i++) { + sig += params->n; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_chain_sha256_32(state, sig, 0, state->encMsg[i], seed, + addr_buf, sig); + } + } + else +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + { + /* Expand the private seed - getWOTS_SK */ + wc_xmss_wots_get_wots_sk(state, sk, seed, addr_buf, sig); + + /* Calculate chain hash. */ + wc_xmss_chain(state, sig, 0, state->encMsg[0], seed, addr_buf, sig); + for (i = 1; i < params->wots_len; i++) { + sig += params->n; + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_chain(state, sig, 0, state->encMsg[i], seed, addr_buf, sig); + } + } +} + +#endif /* !WOLFSSL_XMSS_VERIFY_ONLY */ + +/* Compute WOTS+ public key value from signature and message. + * + * RFC 8319: 3.1.6 + * Algorithm 6: WOTS_pkFromSig + * (Convert message to base w and append checksum in base w) + * ... + * for ( i = 0; i < len; i++ ) { + * ADRS.setChainAddress(i); + * tmp_pk[i] = chain(sig[i], msg[i], w - 1 - msg[i], SEED, ADRS); + * } + * return tmp_pk; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] sig XMSS/MT Signature. + * @param [in] m Message to verify. + * @param [in] seed Random public seed. + * @param [in] addr Hashing address. + * @param [out] pk Public key. + */ +static void wc_xmss_wots_pk_from_sig(XmssState* state, const byte* sig, + const byte* m, const byte* seed, HashAddress addr, byte* pk) +{ + const XmssParams* params = state->params; + byte* addr_buf = state->stack; + word32 i; + + /* Convert message to base w and append checksum in base w. */ + wc_xmss_msg_convert(m, params->n, state->encMsg); + + /* Start with address with chain value of 0. */ + addr[XMSS_ADDR_CHAIN] = 0; + wc_xmss_addr_encode(addr, addr_buf); + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) + if ((params->pad_len == XMSS_SHA256_32_PAD_LEN) && + (params->n == XMSS_SHA256_32_N) && + (params->hash == WC_HASH_TYPE_SHA256)) { + /* Calculate chain hash. */ + wc_xmss_chain_sha256_32(state, sig, state->encMsg[0], + XMSS_WOTS_W - 1 - state->encMsg[0], seed, addr_buf, pk); + for (i = 1; i < params->wots_len; i++) { + sig += params->n; + pk += params->n; + /* Update chain. */ + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_chain_sha256_32(state, sig, state->encMsg[i], + XMSS_WOTS_W - 1 - state->encMsg[i], seed, addr_buf, pk); + } + } + else +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 */ + { + /* Calculate chain hash. */ + wc_xmss_chain(state, sig, state->encMsg[0], + XMSS_WOTS_W - 1 - state->encMsg[0], seed, addr_buf, pk); + for (i = 1; i < params->wots_len; i++) { + sig += params->n; + pk += params->n; + /* Update chain. */ + addr_buf[XMSS_ADDR_CHAIN * 4 + 3] = i; + wc_xmss_chain(state, sig, state->encMsg[i], + XMSS_WOTS_W - 1 - state->encMsg[i], seed, addr_buf, pk); + } + } +} + +/******************************************** + * L-TREE - unbalanced binary hash tree + ********************************************/ + +/* Compute leaves of L-tree from WOTS+ public key and compress to single value. + * + * RFC 8391: 4.1.5, Algorithm 8: ltree + * unsigned int len' = len; + * ADRS.setTreeHeight(0); + * while ( len' > 1 ) { + * for ( i = 0; i < floor(len' / 2); i++ ) { + * ADRS.setTreeIndex(i); + * pk[i] = RAND_HASH(pk[2i], pk[2i + 1], SEED, ADRS); + * } + * if ( len' % 2 == 1 ) { + * pk[floor(len' / 2)] = pk[len' - 1]; + * } + * len' = ceil(len' / 2); + * ADRS.setTreeHeight(ADRS.getTreeHeight() + 1); + * } + * return pk[0]; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] pk WOTS+ public key. + * @param [in] seed Random public seed. + * @param [in] addr Hashing address. + * @param [out] pk0 N-byte compressed public key value pk[0]. + */ +static void wc_xmss_ltree(XmssState* state, byte* pk, const byte* seed, + HashAddress addr, byte* pk0) +{ + const XmssParams* params = state->params; + word8 len = params->wots_len; + word32 h = 0; + +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) && \ + !defined(WC_XMSS_FULL_HASH) + /* Precompute hash state after first 64 bytes (common to all hashes). */ + if ((params->pad_len == XMSS_SHA256_32_PAD_LEN) && + (params->n == XMSS_SHA256_32_N) && + (params->hash == WC_HASH_TYPE_SHA256)) { + byte* prf_buf = state->prf_buf; + int ret; + + XMSS_PAD_ENC(XMSS_HASH_PADDING_PRF, prf_buf, XMSS_SHA256_32_PAD_LEN); + XMEMCPY(prf_buf + XMSS_SHA256_32_PAD_LEN, seed, XMSS_SHA256_32_N); + + ret = wc_Sha256Update(&state->digest.sha256, prf_buf, + XMSS_SHA256_32_PAD_LEN + XMSS_SHA256_32_N); + if (ret == 0) { + /* Copy state after first 64 bytes. */ + XMSS_SHA256_STATE_CACHE(state); + } + else if (state->ret == 0) { + /* Store any digest failures for public APIs to return. */ + state->ret = ret; + } + } +#endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 && !WC_XMSS_FULL_HASH */ + while (len > 1) { + word8 i; + word8 len2 = len >> 1; + + addr[XMSS_ADDR_TREE_HEIGHT] = h++; + + for (i = 0; i < len2; i++) { + addr[XMSS_ADDR_TREE_INDEX] = i; + #if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) && \ + !defined(WC_XMSS_FULL_HASH) + if ((params->pad_len == XMSS_SHA256_32_PAD_LEN) && + (params->n == XMSS_SHA256_32_N) && + (params->hash == WC_HASH_TYPE_SHA256)) { + wc_xmss_rand_hash_sha256_32_prehash(state, + pk + i * 2 * XMSS_SHA256_32_N, addr, + pk + i * XMSS_SHA256_32_N); + } + else + #endif /* !WOLFSSL_WC_XMSS_SMALL && WC_XMSS_SHA256 && + * !WC_XMSS_FULL_HASH */ + { + wc_xmss_rand_hash(state, pk + i * 2 * params->n, + seed, addr, pk + i * params->n); + } + } + if (len & 1) { + XMEMCPY(pk + len2 * params->n, pk + (len - 1) * params->n, + params->n); + } + len = len2 + (len & 1); + } + /* Return compressed public key value pk[0]. */ + XMEMCPY(pk0, pk, params->n); +} + +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + +#ifdef WOLFSSL_WC_XMSS_SMALL + +/******************************************** + * TREE HASH + ********************************************/ + +#ifndef WOLFSSL_SMALL_STACK +/* Compute internal nodes of Merkle tree. + * + * Implementation always starts at index 0. (s = 0) + * + * Build authentication path, if required, rather than duplicating work. + * When node is generated, copy out to authentication path array of nodes. + * + * RFC 8391: 4.1.6, Algorithm 9: treeHash + * if( s % (1 << t) != 0 ) return -1; + * for ( i = 0; i < 2^t; i++ ) { + * SEED = getSEED(SK); + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(s + i); + * pk = WOTS_genPK (getWOTS_SK(SK, s + i), SEED, ADRS); + * ADRS.setType(1); # Type = L-tree address + * ADRS.setLTreeAddress(s + i); + * node = ltree(pk, SEED, ADRS); + * ADRS.setType(2); # Type = hash tree address + * ADRS.setTreeHeight(0); + * ADRS.setTreeIndex(i + s); + * while ( Top node on Stack has same height t' as node ) { + * ADRS.setTreeIndex((ADRS.getTreeIndex() - 1) / 2); + * node = RAND_HASH(Stack.pop(), node, SEED, ADRS); + * ADRS.setTreeHeight(ADRS.getTreeHeight() + 1); + * } + * Stack.push(node); + * } + * return Stack.pop(); + * RFC 8391: 4.1.9, (Example) buildAuth + * for ( j = 0; j < h; j++ ) { + * k = floor(i / (2^j)) XOR 1; + * auth[j] = treeHash(SK, k * 2^j, j, ADRS); + * } + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] sk_seed Random private seed. + * @param [in] pk_seed Random public seed. + * @param [in] leafIdx Index of lead node. + * @param [in] subtree_addr Address of subtree. + * @param [out] root Root node of the tree. + * @param [out] auth_path Nodes of the authentication path. + */ +static void wc_xmss_treehash(XmssState* state, const byte* sk_seed, + const byte* pk_seed, word32 leafIdx, const word32* subtree, byte* root, + byte* auth_path) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + byte* node = state->stack; + HashAddress ots; + HashAddress ltree; + HashAddress tree; + word8 height[WC_XMSS_MAX_TREE_HEIGHT + 1]; + word8 offset = 0; + word32 max = (word32)1 << params->sub_h; + word32 i; + + /* Copy hash address into one for each purpose. */ + XMSS_ADDR_OTS_SET_SUBTREE(ots, subtree); + XMSS_ADDR_LTREE_SET_SUBTREE(ltree, subtree); + XMSS_ADDR_TREE_SET_SUBTREE(tree, subtree); + + for (i = 0; i < max; i++) { + word8 h; + + /* Calculate WOTS+ public key. */ + ots[XMSS_ADDR_OTS] = i; + wc_xmss_wots_gen_pk(state, sk_seed, pk_seed, ots, state->pk); + /* Calculate public value. */ + ltree[XMSS_ADDR_LTREE] = i; + wc_xmss_ltree(state, state->pk, pk_seed, ltree, node); + + /* Initial height at this offset is 0. */ + h = height[offset] = 0; + /* Copy node, at height 0, out if on authentication path. */ + if ((auth_path != NULL) && ((leafIdx ^ 0x1) == i)) { + XMEMCPY(auth_path, node, n); + } + + /* Top node on Stack has same height t' as node. */ + while ((offset >= 1) && (h == height[offset - 1])) { + word32 tree_idx = i >> (h + 1); + + node -= n; + /* Calculate hash of node. */ + tree[XMSS_ADDR_TREE_HEIGHT] = h; + tree[XMSS_ADDR_TREE_INDEX] = tree_idx; + wc_xmss_rand_hash(state, node, pk_seed, tree, node); + + /* Update offset and height. */ + offset--; + h = ++height[offset]; + + /* Copy node out if on authentication path. */ + if ((auth_path != NULL) && (((leafIdx >> h) ^ 0x1) == tree_idx)) { + XMEMCPY(auth_path + h * n, node, n); + } + } + offset++; + node += n; + } + + /* Copy the root node. */ + XMEMCPY(root, state->stack, n); +} +#else +/* Compute internal nodes of Merkle tree. + * + * Implementation always starts at index 0. (s = 0) + * + * Build authentication path, if required, rather than duplicating work. + * When node is generated, copy out to authentication path array of nodes. + * + * RFC 8391: 4.1.6, Algorithm 9: treeHash + * if( s % (1 << t) != 0 ) return -1; + * for ( i = 0; i < 2^t; i++ ) { + * SEED = getSEED(SK); + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(s + i); + * pk = WOTS_genPK (getWOTS_SK(SK, s + i), SEED, ADRS); + * ADRS.setType(1); # Type = L-tree address + * ADRS.setLTreeAddress(s + i); + * node = ltree(pk, SEED, ADRS); + * ADRS.setType(2); # Type = hash tree address + * ADRS.setTreeHeight(0); + * ADRS.setTreeIndex(i + s); + * while ( Top node on Stack has same height t' as node ) { + * ADRS.setTreeIndex((ADRS.getTreeIndex() - 1) / 2); + * node = RAND_HASH(Stack.pop(), node, SEED, ADRS); + * ADRS.setTreeHeight(ADRS.getTreeHeight() + 1); + * } + * Stack.push(node); + * } + * return Stack.pop(); + * RFC 8391: 4.1.9, (Example) buildAuth + * for ( j = 0; j < h; j++ ) { + * k = floor(i / (2^j)) XOR 1; + * auth[j] = treeHash(SK, k * 2^j, j, ADRS); + * } + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] sk_seed Random private seed. + * @param [in] pk_seed Random public seed. + * @param [in] leafIdx Index of lead node. + * @param [in] subtree_addr Address of subtree. + * @param [out] root Root node of the tree. + * @param [out] auth_path Nodes of the authentication path. + */ +static void wc_xmss_treehash(XmssState* state, const byte* sk_seed, + const byte* pk_seed, word32 leafIdx, const word32* subtree, byte* root, + byte* auth_path) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + byte* node = state->stack; + HashAddress addr; + word8 height[WC_XMSS_MAX_TREE_HEIGHT + 1]; + word8 offset = 0; + word32 max = (word32)1 << params->sub_h; + word32 i; + + XMSS_ADDR_SET_SUBTREE(addr, subtree, 0); + + for (i = 0; i < max; i++) { + word8 h; + + /* Calculate WOTS+ public key. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_OTS; + addr[XMSS_ADDR_LTREE] = i; + wc_xmss_wots_gen_pk(state, sk_seed, pk_seed, addr, state->pk); + /* Calculate public value. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_LTREE; + wc_xmss_ltree(state, state->pk, pk_seed, addr, node); + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_TREE; + addr[XMSS_ADDR_TREE_ZERO] = 0; + + /* Initial height at this offset is 0. */ + h = height[offset] = 0; + /* Copy node out if on authentication path. */ + if ((auth_path != NULL) && ((leafIdx ^ 0x1) == i)) { + XMEMCPY(auth_path, node, n); + } + + /* Top node on Stack has same height t' as node. */ + while ((offset >= 1) && (h == height[offset - 1])) { + word32 tree_idx = i >> (h + 1); + + node -= n; + /* Calculate hash of node. */ + addr[XMSS_ADDR_TREE_HEIGHT] = h; + addr[XMSS_ADDR_TREE_INDEX] = tree_idx; + wc_xmss_rand_hash(state, node, pk_seed, addr, node); + + /* Update offset and height. */ + offset--; + h = ++height[offset]; + + /* Copy node out if on authentication path. */ + if ((auth_path != NULL) && (((leafIdx >> h) ^ 0x1) == tree_idx)) { + XMEMCPY(auth_path + h * n, node, n); + } + } + offset++; + node += n; + /* Reset hash address ready for use as OTS and LTREE. */ + addr[XMSS_ADDR_TREE_HEIGHT] = 0; + addr[XMSS_ADDR_TREE_INDEX] = 0; + } + + /* Copy the root node. */ + XMEMCPY(root, state->stack, n); +} +#endif /* !WOLFSSL_SMALL_STACK */ + +/******************************************** + * MAKE KEY + ********************************************/ + +/* Derives XMSSMT (and XMSS) key pair from seeds. + * + * RFC 8391: 4.1.7, Algorithm 10: XMSS_keyGen. + * ... + * initialize SK_PRF with a uniformly random n-byte string; + * setSK_PRF(SK, SK_PRF); + * + * # Initialization for common contents + * initialize SEED with a uniformly random n-byte string; + * setSEED(SK, SEED); + * setWOTS_SK(SK, wots_sk)); + * ADRS = toByte(0, 32); + * root = treeHash(SK, 0, h, ADRS); + * + * SK = idx || wots_sk || SK_PRF || root || SEED; + * PK = OID || root || SEED; + * return (SK || PK); + * + * wots_sk, SK_PRF and SEED passed in as seed. + * Store seed for wots_sk instead of generated wots_sk. + * OID not stored in PK this is handled in upper layer. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] seed Random seeds. + * @param [out] sk Secret/Private key. + * @param [out] pk Public key. + * @return 0 on success. + * @return <0 on digest failure. + */ +int wc_xmssmt_keygen(XmssState* state, const unsigned char* seed, + unsigned char* sk, unsigned char* pk) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + const byte* seed_priv = seed; + const byte* seed_pub = seed + 2 * n; + /* Offsets into secret/private key. */ + byte* sk_idx = sk; + byte* sk_seed = sk_idx + params->idx_len; + byte* sk_pub = sk_seed + 2 * n; + /* Offsets into public key. */ + byte* pk_root = pk; + byte* pk_seed = pk_root + n; + + /* Set first index to 0 in private key. */ + XMEMSET(sk_idx, 0, params->idx_len); + /* Set private key seed and private key for PRF in to private key. */ + XMEMCPY(sk_seed, seed_priv, 2 * n); + /* Set public key seed into public key. */ + XMEMCPY(pk_seed, seed_pub, n); + + /* Set all address values to zero. */ + XMEMSET(state->addr, 0, sizeof(HashAddress)); + /* Set depth into address. */ + state->addr[XMSS_ADDR_LAYER] = params->d - 1; + /* Compute root node into public key. */ + wc_xmss_treehash(state, sk_seed, pk_seed, 0, state->addr, pk_root, NULL); + + /* Append public key (root node and public seed) to private key. */ + XMEMCPY(sk_pub, pk_root, 2 * n); + + /* Return any errors that occurred during hashing. */ + return state->ret; +} + +/******************************************** + * SIGN + ********************************************/ + +/** + * Sign message using XMSS/XMSS^MT. + * + * RFC 8391: 4.1.9, Algorithm 11: treeSig + * auth = buildAuth(SK, idx_sig, ADRS); + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(idx_sig); + * sig_ots = WOTS_sign(getWOTS_SK(SK, idx_sig), + * M', getSEED(SK), ADRS); + * Sig = sig_ots || auth; + * return Sig; + * RFC 8391: 4.2.4, Algorithm 16: XMSSMT_sign + * # Init + * ADRS = toByte(0, 32); + * SEED = getSEED(SK_MT); + * SK_PRF = getSK_PRF(SK_MT); + * idx_sig = getIdx(SK_MT); + * + * # Update SK_MT + * setIdx(SK_MT, idx_sig + 1); + * + * # Message compression + * byte[n] r = PRF(SK_PRF, toByte(idx_sig, 32)); + * byte[n] M' = H_msg(r || getRoot(SK_MT) || (toByte(idx_sig, n)), M); + * + * # Sign + * Sig_MT = idx_sig; + * unsigned int idx_tree + * = (h - h / d) most significant bits of idx_sig; + * unsigned int idx_leaf = (h / d) least significant bits of idx_sig; + * SK = idx_leaf || getXMSS_SK(SK_MT, idx_tree, 0) || SK_PRF + * || toByte(0, n) || SEED; + * ADRS.setLayerAddress(0); + * ADRS.setTreeAddress(idx_tree); + * Sig_tmp = treeSig(M', SK, idx_leaf, ADRS); + * Sig_MT = Sig_MT || r || Sig_tmp; + * for ( j = 1; j < d; j++ ) { + * root = treeHash(SK, 0, h / d, ADRS); + * idx_leaf = (h / d) least significant bits of idx_tree; + * idx_tree = (h - j * (h / d)) most significant bits of idx_tree; + * SK = idx_leaf || getXMSS_SK(SK_MT, idx_tree, j) || SK_PRF + * || toByte(0, n) || SEED; + * ADRS.setLayerAddress(j); + * ADRS.setTreeAddress(idx_tree); + * Sig_tmp = treeSig(root, SK, idx_leaf, ADRS); + * Sig_MT = Sig_MT || Sig_tmp; + * } + * return SK_MT || Sig_MT + * + * buildAuth from treeSig done inside treeHash as this is more efficient. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] m Buffer holding message. + * @param [in] mlen Length of message in buffer. + * @param [in, out] sk Secret/Private key. + * @param [out] sig Signature. + * @return 0 on success. + * @return <0 on digest failure. + */ +int wc_xmssmt_sign(XmssState* state, const unsigned char* m, word32 mlen, + unsigned char* sk, unsigned char* sig) +{ + int ret = 0; + const XmssParams* params = state->params; + const word8 n = params->n; + const word8 hs = params->sub_h; + const word16 hsn = (word16)hs * n; + const byte* sk_seed = sk + params->idx_len; + const byte* pk_seed = sk + params->idx_len + 3 * n; + wc_Idx idx; + byte* sig_r = sig + params->idx_len; + byte root[WC_XMSS_MAX_N]; + unsigned int i; + + WC_IDX_ZERO(idx); + /* Set all address values to zero and set type to OTS. */ + XMEMSET(state->addr, 0, sizeof(HashAddress)); + state->addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_OTS; + + /* Copy the index into the signature data: Sig_MT = idx_sig. */ + XMEMCPY(sig, sk, params->idx_len); + + /* Read index from the secret key. */ + WC_IDX_DECODE(idx, params->idx_len, sk, ret); + /* Validate index in secret key. */ + if ((ret == 0) && (WC_IDX_INVALID(idx, params->idx_len, params->h))) { + /* Set index to maximum value to distinguish from valid value. */ + XMEMSET(sk, 0xFF, params->idx_len); + /* Zeroize the secret key. */ + ForceZero(sk + params->idx_len, params->sk_len - params->idx_len); + ret = KEY_EXHAUSTED_E; + } + + /* Update SK_MT */ + if (ret == 0) { + /* Increment the index in the secret key. */ + wc_idx_update(sk, params->idx_len); + } + + /* Message compression */ + if (ret == 0) { + const byte* sk_prf = sk + params->idx_len + n; + + /* byte[n] r = PRF(SK_PRF, toByte(idx_sig, 32)); */ + wc_idx_copy(sig, params->idx_len, state->buf, XMSS_PRF_M_LEN); + wc_xmss_prf(state, sk_prf, state->buf, sig_r); + ret = state->ret; + } + if (ret == 0) { + const byte* pub_root = sk + params->idx_len + 2 * n; + /* byte[n] M' = H_msg(r || getRoot(SK_MT) || (toByte(idx_sig, n)), M); + */ + wc_xmss_hash_message(state, sig_r, pub_root, sig, params->idx_len, m, + mlen, root); + ret = state->ret; + /* Place WOTS+ signatures after index and 'r'. */ + sig += params->idx_len + n; + } + + /* Sign. */ + for (i = 0; (ret == 0) && (i < params->d); i++) { + word32 idx_leaf = 0; + + /* Set layer, tree and OTS leaf index into hash address. */ + state->addr[XMSS_ADDR_LAYER] = i; + WC_IDX_SET_ADDR_TREE(idx, params->idx_len, hs, state->addr, idx_leaf); + /* treeSig || treeHash = sig_ots || auth */ + state->addr[XMSS_ADDR_OTS] = idx_leaf; + /* Create WOTS+ signature for tree into signature (sig_ots). */ + wc_xmss_wots_sign(state, root, sk_seed, pk_seed, state->addr, sig); + ret = state->ret; + if (ret == 0) { + sig += params->wots_sig_len; + /* Add authentication path (auth) and calc new root. */ + wc_xmss_treehash(state, sk_seed, pk_seed, idx_leaf, state->addr, + root, sig); + ret = state->ret; + sig += hsn; + } + } + + return ret; +} + +#else + +/******************************************** + * Fast C implementation + ********************************************/ + +/* Tree hash data - needs to be unpacked from binary. */ +typedef struct TreeHash { + /* Next index to update in tree - max 20 bits. */ + word32 nextIdx; + /* Number of stack entries used by tree - 0... */ + word8 used; + /* Tree is finished. */ + word8 completed; +} TreeHash; + +/* BDS state. */ +typedef struct BdsState { + /* Stack of nodes - subtree height + 1 nodes. */ + byte* stack; + /* Height of stack node - subtree height + 1 of 0... */ + byte* height; + /* Authentication path for next index - subtree height nodes. */ + byte* authPath; + /* Hashes of nodes kept - subtree height / 2 nodes. */ + byte* keep; + /* Tree hash instances - subtree height minus K instances. */ + byte* treeHash; + /* Hashes of nodes for tree hash - one for each tree hash instance. */ + byte* treeHashNode; + /* Hashes of nodes to retain - based on K parameter. */ + byte* retain; + /* Next leaf to calculate - max 20 bits. */ + word32 next; + /* Current offset into stack - 0... */ + word8 offset; +} BdsState; + +/* Index to BDS state accounting for swapping. + * + * @param [in] idx Index of node. + * @param [in] i Depth of tree. + * @param [in] hs Height of subtree. + * @param [in] d Depth/number of trees. + * @return Index of working BDS state. + */ +#define BDS_IDX(idx, i, hs, d) \ + (((((idx) >> ((hs) * ((i) + 1))) & 1) == 0) ? (i) : ((d) + (i))) +/* Index to alternate BDS state accounting for swapping. + * + * @param [in] idx Index of node. + * @param [in] i Depth of tree. + * @param [in] hs Height of subtree. + * @param [in] d Depth/number of trees. + * @return Index of alternate BDS state. + */ +#define BDS_ALT_IDX(idx, i, hs, d) \ + (((((idx) >> ((hs) * ((i) + 1))) & 1) == 0) ? ((d) + (i)) : (i)) + +/******************************************** + * Tree Hash APIs + ********************************************/ + +/* Initialize the tree hash data at specified index for the BDS state. + * + * @param [in, out] bds BDS state. + * @param [in] i Index of tree hash. + */ +static void wc_xmss_bds_state_treehash_init(BdsState* bds, int i) +{ + byte* sk = bds->treeHash + i * 4; + c32to24(0, sk); + sk[3] = 0 | (1 << 7); +} + +/* Set next index into tree hash data at specified index for the BDS state. + * + * @param [in, out] bds BDS state. + * @param [in] i Index of tree hash. + * @param [in] nextIdx Next index for tree hash. + */ +static void wc_xmss_bds_state_treehash_set_next_idx(BdsState* bds, int i, + word32 nextIdx) +{ + byte* sk = bds->treeHash + i * 4; + c32to24(nextIdx, sk); + sk[3] = 0 | (0 << 7); +} + +/* Mark tree hash, at specified index for the BDS state, as complete. + * + * @param [in, out] bds BDS state. + * @param [in] i Index of tree hash. + */ +static void wc_xmss_bds_state_treehash_complete(BdsState* bds, int i) +{ + byte* sk = bds->treeHash + i * 4; + sk[3] |= 1 << 7; +} + +/* Get the tree hash data at specified index for the BDS state. + * + * @param [in] bds BDS state. + * @param [in] i Index of tree hash. + * @param [out] treeHash Tree hash instance to fill out. + */ +static void wc_xmss_bds_state_treehash_get(BdsState* bds, int i, + TreeHash* treeHash) +{ + byte* sk = bds->treeHash + i * 4; + ato24(sk, &treeHash->nextIdx); + treeHash->used = sk[3] & 0x7f; + treeHash->completed = sk[3] >> 7; +} + +/* Set the tree hash data at specified index for the BDS state. + * + * @param [in, out] bds BDS state. + * @param [in] i Index of tree hash. + * @param [in] treeHash Tree hash data. + */ +static void wc_xmss_bds_state_treehash_set(BdsState* bds, int i, + TreeHash* treeHash) +{ + byte* sk = bds->treeHash + i * 4; + c32to24(treeHash->nextIdx, sk); + sk[3] = treeHash->used | (treeHash->completed << 7); +} + +/******************************************** + * BDS State APIs + ********************************************/ + +/* Allocate memory for BDS state. + * + * When using a static BDS state (XMSS) then pass in handle to data for bds. + * + * @param [in] params XMSS/MT parameters. + * @param [in, out] bds Handle to BDS state. May be NULL if not allocated. + * @return 0 on success. + * @return MEMORY_E on dynamic memory allocation failure. + */ +static int wc_xmss_bds_state_alloc(const XmssParams* params, BdsState** bds) +{ + const word8 cnt = 2 * params->d - 1; + int ret = 0; + + if (*bds == NULL) { + /* Allocate memory for BDS states. */ + *bds = (BdsState*)XMALLOC(sizeof(BdsState) * cnt, NULL, + DYNAMIC_TYPE_TMP_BUFFER); + if (*bds == NULL) { + ret = MEMORY_E; + } + } + + return ret; +} + +/* Dispose of allocated memory associated with BDS state. + * + * @param [in] bds BDS state. + */ +static void wc_xmss_bds_state_free(BdsState* bds) +{ + /* BDS states was allocated - must free. */ + XFREE(bds, NULL, DYNAMIC_TYPE_TMP_BUFFER); +} + +/* Load the BDS state from the secret/private key. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] sk Secret/private key. + * @param [out] bds BDS states. + * @param [out] wots_sigs WOTS signatures when XMSS^MT. + */ +static void wc_xmss_bds_state_load(const XmssState* state, byte* sk, + BdsState* bds, byte** wots_sigs) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + const word8 hs = params->sub_h; + const word8 hsk = params->sub_h - params->bds_k; + const word8 k = params->bds_k; + const word32 retainLen = XMSS_RETAIN_LEN(k, n); + int i; + + /* Skip past standard SK = idx || wots_sk || SK_PRF || root || SEED; */ + sk += params->idx_len + 4 * n; + + for (i = 0; i < 2 * (int)params->d - 1; i++) { + /* Set pointers into SK. */ + bds[i].stack = sk; + sk += (hs + 1) * n; + bds[i].height = sk; + sk += hs + 1; + bds[i].authPath = sk; + sk += hs * n; + bds[i].keep = sk; + sk += (hs >> 1) * n; + bds[i].treeHash = sk; + sk += hsk * 4; + bds[i].treeHashNode = sk; + sk += hsk * n; + bds[i].retain = sk; + sk += retainLen; + /* Load values - big-endian encoded. */ + ato24(sk, &bds[i].next); + sk += 3; + bds[i].offset = sk[0]; + sk += 1; + } + + if (wots_sigs != NULL) { + *wots_sigs = sk; + } +} + +/* Store the BDS state into the secret/private key. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in, out] sk Secret/private key. + * @param [in] bds BDS states. + */ +static void wc_xmss_bds_state_store(const XmssState* state, byte* sk, + BdsState* bds) +{ + int i; + const XmssParams* params = state->params; + const word8 n = params->n; + const word8 hs = params->sub_h; + const word8 hsk = params->sub_h - params->bds_k; + const word8 k = params->bds_k; + const word32 skip = (hs + 1) * n + /* BdsState.stack */ + hs + 1 + /* BdsState.height */ + hs * n + /* BdsState.authPath */ + (hs >> 1) * n + /* BdsState.keep */ + hsk * 4 + /* BdsState.treeHash */ + hsk * n + /* BdsState.treeHashNode */ + XMSS_RETAIN_LEN(k, n); /* BdsState.retain */ + + /* Ignore standard SK = idx || wots_sk || SK_PRF || root || SEED; */ + sk += params->idx_len + 4 * n; + + for (i = 0; i < 2 * (int)params->d - 1; i++) { + /* Skip pointers into sk. */ + sk += skip; + /* Save values - big-endian encoded. */ + c32to24(bds[i].next, sk); + sk += 3; + sk[0] = bds[i].offset; + sk += 1; + } +} + +/******************************************** + * BDS + ********************************************/ + +/* Compute node at next index. + * + * RFC 8391: 4.1.6, Algorithm 9: treeHash + * ... + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(s + i); + * pk = WOTS_genPK (getWOTS_SK(SK, s + i), SEED, ADRS); + * ADRS.setType(1); # Type = L-tree address + * ADRS.setLTreeAddress(s + i); + * node = ltree(pk, SEED, ADRS); + * ADRS.setType(2); # Type = hash tree address + * ADRS.setTreeHeight(0); + * ADRS.setTreeIndex(i + s); + * while ( Top node on Stack has same height t' as node ) { + * ADRS.setTreeIndex((ADRS.getTreeIndex() - 1) / 2); + * node = RAND_HASH(Stack.pop(), node, SEED, ADRS); + * ADRS.setTreeHeight(ADRS.getTreeHeight() + 1); + * } + * Stack.push(node); + * ... + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] bds BDS state. + * @param [in] sk_seed Random secret/private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [out] root Root node. + */ +static void wc_xmss_bds_next_idx(XmssState* state, BdsState* bds, + const byte* sk_seed, const byte* pk_seed, HashAddress addr, int i, + word8* height, word8* offset, word8** sp) +{ + const XmssParams* params = state->params; + const word8 hs = params->sub_h; + const word8 hsk = params->sub_h - params->bds_k; + const word8 n = params->n; + word8 o = *offset; + word8* node = *sp; + word8 h; + + /* Calculate WOTS+ public key. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_OTS; + addr[XMSS_ADDR_OTS] = i; + wc_xmss_wots_gen_pk(state, sk_seed, pk_seed, addr, state->pk); + /* Calculate public value. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_LTREE; + wc_xmss_ltree(state, state->pk, pk_seed, addr, node); + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_TREE; + addr[XMSS_ADDR_TREE_ZERO] = 0; + + /* Initial height at this offset is 0. */ + h = height[o] = 0; + /* HDSS, Section 4.5, 2: TREEHASH[h].push(v[h][3]) + * Copy right node to tree hash nodes if second right node. */ + if ((hsk > 0) && (i == 3)) { + XMEMCPY(bds->treeHashNode, node + n, n); + } + + /* Top node on Stack has same height t' as node. */ + while ((o >= 1) && (h == height[o - 1])) { + /* HDSS, Section 4.5, 1: AUTH[h] = v[h][1], h = 0,...,H-1. + * Cache left node if on authentication path. */ + if ((i >> h) == 1) { + XMEMCPY(bds->authPath + h * n, node, n); + } + /* This is a right node. */ + else if (h < hsk) { + /* HDSS, Section 4.5, 2: TREEHASH[h].push(v[h][3]) + * Copy right node to tree hash if second right node. */ + if ((i >> h) == 3) { + XMEMCPY(bds->treeHashNode + h * n, node, n); + } + } + else { + /* HDSS, Section 4.5, 3: RETAIN[h].push(v[j][2j+3] for + * h = H-K,...,H-2 and j = 2^(H-h-1)-2,...,0. + * Retain high right nodes. + */ + word32 ro = (1 << (hs - 1 - h)) + h - hs + (((i >> h) - 3) >> 1); + XMEMCPY(bds->retain + ro * n, node, n); + } + + node -= n; + /* Calculate hash of node. */ + addr[XMSS_ADDR_TREE_HEIGHT] = h; + addr[XMSS_ADDR_TREE_INDEX] = i >> (h + 1); + wc_xmss_rand_hash(state, node, pk_seed, addr, node); + + /* Update offset and height. */ + o--; + h = ++height[o]; + } + + *offset = o; + *sp = node; +} + +/* Compute initial Merkle tree and store nodes. + * + * HDSS, Section 4.5, The algorithm, Initialization. + * 1. We store the authentication path for the first leaf (s = 0): + * AUTH[h] = v[h][1], h = 0,...,H-1. + * 2. Depending on the parameter K, we store the next right authentication + * node for each height h = 0,...,H-K-1 in the treehash instances: + * TREEHASH[h].push(v[h][3]). + * 3. Finally we store the right authentication nodes clode to the root using + * the stacks RETAIN[h]: + * RETAIN[h].push(v[j][2j+3] for h = H-K,...,H-2 and j = 2^(H-h-1)-2,...,0. + * + * RFC 8391: 4.1.6, Algorithm 9: treeHash + * if( s % (1 << t) != 0 ) return -1; + * for ( i = 0; i < 2^t; i++ ) { + * SEED = getSEED(SK); + * [Compute node at next index] + * } + * return Stack.pop(); + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] bds BDS state. + * @param [in] sk_seed Random secret/private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [out] root Root node. + */ +static void wc_xmss_bds_treehash_initial(XmssState* state, BdsState* bds, + const byte* sk_seed, const byte* pk_seed, const HashAddress addr, + byte* root) +{ + const XmssParams* params = state->params; + const word8 hsk = params->sub_h - params->bds_k; + const word8 n = params->n; + word8* node = state->stack; + HashAddress addrCopy; + word8 height[WC_XMSS_MAX_TREE_HEIGHT + 1]; + word8 offset = 0; + word32 maxIdx = (word32)1 << params->sub_h; + word32 i; + + /* First signing index will be 0 - setup BDS state. */ + bds->offset = 0; + bds->next = 0; + /* Reset the hash tree status. */ + for (i = 0; i < hsk; i++) { + wc_xmss_bds_state_treehash_init(bds, i); + } + + /* Copy hash address into local. */ + XMSS_ADDR_OTS_SET_SUBTREE(addrCopy, addr); + + /* Compute each node in tree. */ + for (i = 0; i < maxIdx; i++) { + wc_xmss_bds_next_idx(state, bds, sk_seed, pk_seed, addrCopy, i, height, + &offset, &node); + offset++; + node += n; + /* Rest the hash address for reuse. */ + addrCopy[XMSS_ADDR_TREE_HEIGHT] = 0; + addrCopy[XMSS_ADDR_TREE_INDEX] = 0; + } + + /* Copy the root node. */ + XMEMCPY(root, state->stack, n); +} + +/* Update internal nodes of Merkle tree at next index. + * + * RFC 8391: 4.1.6, Algorithm 9: treeHash + * ... + * SEED = getSEED(SK); + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(s + i); + * pk = WOTS_genPK (getWOTS_SK(SK, s + i), SEED, ADRS); + * ADRS.setType(1); # Type = L-tree address + * ADRS.setLTreeAddress(s + i); + * node = ltree(pk, SEED, ADRS); + * ADRS.setType(2); # Type = hash tree address + * ADRS.setTreeHeight(0); + * ADRS.setTreeIndex(i + s); + * while ( Top node on Stack has same height t' as node ) { + * ADRS.setTreeIndex((ADRS.getTreeIndex() - 1) / 2); + * node = RAND_HASH(Stack.pop(), node, SEED, ADRS); + * ADRS.setTreeHeight(ADRS.getTreeHeight() + 1); + * } + * Stack.push(node); + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in, out] bds BDS state. + * @param [in] height Height of nodes to update. + * @param [in] sk_seed Random secret/private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + */ +static void wc_xmss_bds_treehash_update(XmssState* state, BdsState* bds, + word8 height, const byte* sk_seed, const byte* pk_seed, + const HashAddress addr) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + HashAddress addrLocal; + TreeHash treeHash[1]; + byte* sp = bds->stack + bds->offset * n; + byte* node = state->stack + WC_XMSS_MAX_STACK_LEN - n; + word8 h; + + /* Get the tree hash data. */ + wc_xmss_bds_state_treehash_get(bds, height, treeHash); + /* Copy hash address into local as OTS type. */ + XMSS_ADDR_OTS_SET_SUBTREE(addrLocal, addr); + /* Calculate WOTS+ public key. */ + addrLocal[XMSS_ADDR_OTS] = treeHash->nextIdx; + wc_xmss_wots_gen_pk(state, sk_seed, pk_seed, addrLocal, state->pk); + /* Calculate public value. */ + addrLocal[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_LTREE; + wc_xmss_ltree(state, state->pk, pk_seed, addrLocal, node); + addrLocal[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_TREE; + addrLocal[XMSS_ADDR_TREE_ZERO] = 0; + + /* Initial height is 0. */ + h = 0; + + /* Top node on Stack has same height t' as node. */ + while ((treeHash->used > 0) && (h == bds->height[bds->offset - 1])) { + sp -= n; + /* Copy from stack to before last calculated node. */ + node -= n; + XMEMCPY(node, sp, n); + + /* Calculate hash of node. */ + addrLocal[XMSS_ADDR_TREE_HEIGHT] = h; + addrLocal[XMSS_ADDR_TREE_INDEX] = treeHash->nextIdx >> (h + 1); + wc_xmss_rand_hash(state, node, pk_seed, addrLocal, node); + + /* Update used, offset and height. */ + treeHash->used--; + bds->offset--; + h++; + } + + /* Check whether we reached the height we wanted to update. */ + if (h == height) { + /* Cache node. */ + XMEMCPY(bds->treeHashNode + height * n, node, n); + treeHash->completed = 1; + } + else { + /* Push calculated node onto stack. */ + XMEMCPY(sp, node, n); + treeHash->used++; + /* Update BDS state. */ + bds->height[bds->offset] = h; + bds->offset++; + treeHash->nextIdx++; + } + + /* Set the tree hash data back. */ + wc_xmss_bds_state_treehash_set(bds, height, treeHash); +} + +/* Updates hash trees that need it most. + * + * Algorithm 4.6: Authentication path computation, Step 5. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in, out] bds BDS state. + * @param [in] updates Current number of updates. + * @param [in] sk_seed Random secret/private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @return Number of available updates. + */ +static word8 wc_xmss_bds_treehash_updates(XmssState* state, BdsState* bds, + word8 updates, const byte* sk_seed, const byte* pk_seed, + const HashAddress addr) +{ + const XmssParams* params = state->params; + const word8 hs = params->sub_h; + const word8 hsk = params->sub_h - params->bds_k; + + while (updates > 0) { + word8 minH = hs; + word8 h = hsk; + word8 i; + + /* Step 5.a. k <- min{ h: TREEHASH(h).height() = + min[j=0..H-K-1]{TREEHASH(j.height()} } */ + for (i = 0; i < hsk; i++) { + TreeHash treeHash[1]; + + wc_xmss_bds_state_treehash_get(bds, i, treeHash); + + if (treeHash->completed) { + /* Finished - ignore. */ + } + else if (treeHash->used == 0) { + /* None used, low height. */ + if (i < minH) { + h = i; + minH = i; + } + } + /* Find the height of lowest in cache. */ + else { + word8 j; + word8 lowH = hs; + byte* height = bds->height + bds->offset - treeHash->used; + + for (j = 0; j < treeHash->used; j++) { + lowH = min(height[j], lowH); + } + if (lowH < minH) { + /* New lowest height. */ + h = i; + minH = lowH; + } + } + } + /* If none lower, then stop. */ + if (h == hsk) { + break; + } + + /* Step 5.b. TREEHASH(k).update() */ + /* Update tree to the lowest height. */ + wc_xmss_bds_treehash_update(state, bds, h, sk_seed, pk_seed, addr); + updates--; + } + return updates; +} + +/* Update BDS at next leaf. + * + * Don't do anything if processed all leaves. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in, out] bds BDS state. + * @param [in] sk_seed Random secret/private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + */ +static void wc_xmss_bds_update(XmssState* state, BdsState* bds, + const byte* sk_seed, const byte* pk_seed, const HashAddress addr) +{ + if (bds->next < ((word32)1 << state->params->sub_h)) { + const XmssParams* params = state->params; + byte* sp = bds->stack + bds->offset * params->n; + HashAddress addrCopy; + + XMSS_ADDR_OTS_SET_SUBTREE(addrCopy, addr); + wc_xmss_bds_next_idx(state, bds, sk_seed, pk_seed, addrCopy, bds->next, + bds->height, &bds->offset, &sp); + bds->offset++; + bds->next++; + } +} + +/* Find index of lowest zero bit. + * + * Supports max up to 31. + * + * @param [in] n Number to evaluate. + * @param [in] max Max number of bits. + * @param [out] b Next bit above first zero bit. + * @return Index of lowest bit that is zero. + */ +static word8 wc_xmss_lowest_zero_bit_index(word32 n, word8 max, word8* b) +{ + word8 i; + + /* Check each bit from lowest for a zero bit. */ + for (i = 0; i < max; i++) { + if ((n & 1) == 0) { + break; + } + n >>= 1; + } + + /* Return next bit after 0 bit. */ + *b = (n >> 1) & 1; + return i; +} + +/* Returns auth path for node leafIdx and computes for next leaf node. + * + * HDSS, Algorithm 4.6: Authentication path computation, Steps 1-4. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in, out] bds BDS state. + * @param [in] leafIdx Current leaf index. + * @param [in] sk_seed Random secret/private seed. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + */ +static void wc_xmss_bds_auth_path(XmssState* state, BdsState* bds, + const word32 leafIdx, const byte* sk_seed, const byte* pk_seed, + HashAddress addr) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + const word8 hs = params->sub_h; + const word8 hsk = params->sub_h - params->bds_k; + word8 tau; + byte* node = state->encMsg; + word8 parent; + + /* Step 1. Find the height of first left node in authentication path. */ + tau = wc_xmss_lowest_zero_bit_index(leafIdx, hs, &parent); + if (tau == 0) { + /* Step 2. Keep node if parent is a left node. + * if s/(2^tau+1) is even and tau < H-1 then KEEP[tau] <- AUTH[tau] + */ + if (parent == 0) { + XMEMCPY(bds->keep, bds->authPath, n); + } + + /* Step 3. if tau = 0 then AUTH[0] <- LEAFCALC(s) */ + /* Calculate WOTS+ public key. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_OTS; + addr[XMSS_ADDR_OTS] = leafIdx; + wc_xmss_wots_gen_pk(state, sk_seed, pk_seed, addr, state->pk); + /* Calculate public value. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_LTREE; + wc_xmss_ltree(state, state->pk, pk_seed, addr, bds->authPath); + } + else { + byte* authPath; + byte* nodes; + word8 i; + + authPath = bds->authPath + tau * n; + /* Step 4.a. = AUTH[tau-1] || KEEP[tau-1] + * Only keeping half of nodes, so need to copy out before updating. + */ + XMEMCPY(node, authPath - n, n); + XMEMCPY(node + n, bds->keep + ((tau - 1) >> 1) * n, n); + + /* Step 2. Keep node if parent is a left node. + * if s/(2^tau+1) is even and tau < H-1 then KEEP[tau] <- AUTH[tau] + */ + if ((tau < hs - 1) && (parent == 0)) { + XMEMCPY(bds->keep + (tau >> 1) * n, authPath, n); + } + + /* Step 4.a. AUTH[tau] <- g() */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_TREE; + addr[XMSS_ADDR_TREE_ZERO] = 0; + addr[XMSS_ADDR_TREE_HEIGHT] = tau - 1; + addr[XMSS_ADDR_TREE_INDEX] = leafIdx >> tau; + wc_xmss_rand_hash(state, node, pk_seed, addr, authPath); + + /* Step 4.b. */ + authPath = bds->authPath; + nodes = bds->treeHashNode; + /* for h = 0 to tau - 1 do */ + for (i = 0; i < tau; i++) { + /* if h < H - K then AUTH[h] <- TREEHASH[h].pop()*/ + if (i < hsk) { + XMEMCPY(authPath, nodes, n); + nodes += n; + } + /* if h >= H - K then AUTH[h] <- RETAIN[h].pop()*/ + else { + word32 o = (1 << (hs - 1 - i)) + i - hs + + (((leafIdx >> i) - 1) >> 1); + XMEMCPY(authPath, bds->retain + o * n, n); + } + authPath += n; + } + + /* Step 4.c. Initialize treehash instances for heights: + * 0, ..., min{tau-1, H - K - 1} */ + tau = min(tau, hsk); + for (i = 0; i < tau; i++) { + word32 startIdx = leafIdx + 1 + 3 * (1 << i); + if (startIdx < ((word32)1 << hs)) { + wc_xmss_bds_state_treehash_set_next_idx(bds, i, startIdx); + } + } + } +} + +/******************************************** + * XMSS + ********************************************/ + +/* Derives XMSS key pair from seeds. + * + * RFC 8391: 4.1.7, Algorithm 10: XMSS_keyGen. + * ... + * initialize SK_PRF with a uniformly random n-byte string; + * setSK_PRF(SK, SK_PRF); + * + * # Initialization for common contents + * initialize SEED with a uniformly random n-byte string; + * setSEED(SK, SEED); + * setWOTS_SK(SK, wots_sk)); + * ADRS = toByte(0, 32); + * root = treeHash(SK, 0, h, ADRS); + * + * SK = idx || wots_sk || SK_PRF || root || SEED; + * PK = OID || root || SEED; + * return (SK || PK); + * + * HDSS, Section 4.5, The algorithm, Initialization. + * + * wots_sk, SK_PRF and SEED passed in as seed. + * Store seed for wots_sk instead of generated wots_sk. + * OID not stored in PK this is handled in upper layer. + * BDS state is appended to SK: + * SK = idx || wots_sk || SK_PRF || root || SEED || BDS_STATE; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] seed Secret/Private and public seed. + * @param [out] sk Secret key. + * @param [out] pk Public key. + * @return 0 on success. + * @return MEMORY_E on dynamic memory allocation failure. + * @return <0 on digest failure. + */ +int wc_xmss_keygen(XmssState* state, const unsigned char* seed, + unsigned char* sk, unsigned char* pk) +{ +#if WOLFSSL_XMSS_MIN_HEIGHT <= 32 + int ret = 0; + const XmssParams* params = state->params; + const word8 n = params->n; + /* Offset of root node in public key. */ + byte* pk_root = pk; +#ifdef WOLFSSL_SMALL_STACK + BdsState* bds = NULL; +#else + BdsState bds[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for tree hash instances and put in BDS state. */ + ret = wc_xmss_bds_state_alloc(params, &bds); + if (ret == 0) +#endif + { + /* Offsets into seed. */ + const byte* seed_priv = seed; + const byte* seed_pub = seed + 2 * n; + /* Offsets into secret/private key. */ + word32* sk_idx = (word32*)sk; + byte* sk_seeds = sk + params->idx_len; + /* Offsets into public key. */ + byte* pk_seed = pk + n; + + /* Setup pointers into sk - assumes sk is initialized to zeros. */ + wc_xmss_bds_state_load(state, sk, bds, NULL); + + /* Set first index to 0 in private key. idx_len always 4. */ + *sk_idx = 0; + /* Set private key seed and private key for PRF in to private key. */ + XMEMCPY(sk_seeds, seed_priv, 2 * n); + /* Set public key seed into public key. */ + XMEMCPY(pk_seed, seed_pub, n); + + /* Set all address values to zero. */ + XMEMSET(state->addr, 0, sizeof(HashAddress)); + /* Hash address layer is 0. */ + /* Compute root node into public key. */ + wc_xmss_bds_treehash_initial(state, bds, sk_seeds, pk_seed, + state->addr, pk_root); + /* Return any errors that occurred during hashing. */ + ret = state->ret; + } + if (ret == 0) { + /* Offset of root node in private key. */ + byte* sk_root = sk + params->idx_len + 2 * n; + + /* Append public key (root node and public seed) to private key. */ + XMEMCPY(sk_root, pk_root, 2 * n); + + /* Store BDS state back into secret/private key. */ + wc_xmss_bds_state_store(state, sk, bds); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of allocated data of BDS states. */ + wc_xmss_bds_state_free(bds); +#endif + return ret; +#else + (void)state; + (void)pk; + (void)sk; + (void)seed; + + return NOT_COMPILED_IN; +#endif /* WOLFSSL_XMSS_MIN_HEIGHT <= 32 */ +} + +/* Sign a message with XMSS. + * + * RFC 8391: 4.1.9, Algorithm 11: treeSig + * ... + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(idx_sig); + * sig_ots = WOTS_sign(getWOTS_SK(SK, idx_sig), + * M', getSEED(SK), ADRS); + * Sig = sig_ots || auth; + * return Sig; + * RFC 8391: 4.1.9, Algorithm 12: XMSS_sign + * idx_sig = getIdx(SK); + * setIdx(SK, idx_sig + 1); + * ADRS = toByte(0, 32); + * byte[n] r = PRF(getSK_PRF(SK), toByte(idx_sig, 32)); + * byte[n] M' = H_msg(r || getRoot(SK) || (toByte(idx_sig, n)), M); + * Sig = idx_sig || r || treeSig(M', SK, idx_sig, ADRS); + * return (SK || Sig); + * + * HDSS, Section 4.5, The algorithm, Update and output phase. + * + * 'auth' was built at key generation or after computing previous signature. + * Build next authentication path after signature created. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] m Buffer holding message. + * @param [in] mlen Length of message in buffer. + * @param [in, out] sk Secret/Private key. + * @param [out] sm Signature and message data. + * @param [in, out] smlen On in, length of signature and message buffer. + * On out, length of signature and message data. + * @return 0 on success. + * @return <0 on digest failure. + */ +int wc_xmss_sign(XmssState* state, const unsigned char* m, word32 mlen, + unsigned char* sk, unsigned char* sig) +{ +#if WOLFSSL_XMSS_MIN_HEIGHT <= 32 + int ret = 0; + const XmssParams* params = state->params; + const word8 n = params->n; + const word8 h = params->h; + const word8 hk = params->h - params->bds_k; + const byte* sk_seed = sk + XMSS_IDX_LEN; + const byte* pk_seed = sk + XMSS_IDX_LEN + 3 * n; + byte node[WC_XMSS_MAX_N]; + word32 idx; + byte* sig_r = sig + XMSS_IDX_LEN; +#ifdef WOLFSSL_SMALL_STACK + BdsState* bds = NULL; +#else + BdsState bds[1]; +#endif + +#ifdef WOLFSSL_SMALL_STACK + /* Allocate memory for tree hash instances and put in BDS state. */ + ret = wc_xmss_bds_state_alloc(params, &bds); + if (ret == 0) +#endif + { + /* Load the BDS state from secret/private key. */ + wc_xmss_bds_state_load(state, sk, bds, NULL); + + /* Copy the index into the signature data: Sig = idx_sig || ... */ + *((word32*)sig) = *((word32*)sk); + /* Read index from the secret key. */ + ato32(sk, &idx); + + /* Check index is valid. */ + if (IDX32_INVALID(idx, XMSS_IDX_LEN, h)) { + /* Set index to maximum value to distinguish from valid value. */ + XMEMSET(sk, 0xFF, XMSS_IDX_LEN); + /* Zeroize the secret key. */ + ForceZero(sk + XMSS_IDX_LEN, params->sk_len - XMSS_IDX_LEN); + ret = KEY_EXHAUSTED_E; + } + } + + /* Update SK_MT */ + if (ret == 0) { + /* Increment the index in the secret key. */ + c32toa(idx + 1, sk); + } + + /* Message compression */ + if (ret == 0) { + const byte* sk_prf = sk + XMSS_IDX_LEN + n; + + /* byte[n] r = PRF(SK_PRF, toByte(idx_sig, 32)); */ + wc_idx_copy(sig, params->idx_len, state->buf, XMSS_PRF_M_LEN); + wc_xmss_prf(state, sk_prf, state->buf, sig_r); + ret = state->ret; + } + if (ret == 0) { + const byte* pub_root = sk + XMSS_IDX_LEN + 2 * n; + + /* Compute the message hash. */ + wc_xmss_hash_message(state, sig_r, pub_root, sig, XMSS_IDX_LEN, m, mlen, + node); + ret = state->ret; + /* Place new signature data after index and 'r'. */ + sig += XMSS_IDX_LEN + n; + } + + if (ret == 0) { + /* Set all address values to zero and set type to OTS. */ + XMEMSET(state->addr, 0, sizeof(HashAddress)); + state->addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_OTS; + /* treeSig || treeHash = sig_ots || auth */ + state->addr[XMSS_ADDR_OTS] = idx; + /* Create WOTS+ signature for tree into signature (sig_ots). */ + wc_xmss_wots_sign(state, node, sk_seed, pk_seed, state->addr, sig); + ret = state->ret; + } + if (ret == 0) { + sig += params->wots_sig_len; + /* Add authentication path (auth) and calc new root. */ + XMEMCPY(sig, bds->authPath, h * n); + ret = state->ret; + } + + if (ret == 0) { + /* Update BDS state - update authentication path for next index. */ + /* Check not last node. */ + if (idx < ((word32)1 << h) - 1) { + /* Calculate next authentication path node. */ + wc_xmss_bds_auth_path(state, bds, idx, sk_seed, pk_seed, + state->addr); + ret = state->ret; + if (ret == 0) { + /* Algorithm 4.6: Step 5. */ + wc_xmss_bds_treehash_updates(state, bds, hk >> 1, sk_seed, + pk_seed, state->addr); + ret = state->ret; + } + } + } + if (ret == 0) { + /* Store BDS state back into secret/private key. */ + wc_xmss_bds_state_store(state, sk, bds); + } + +#ifdef WOLFSSL_SMALL_STACK + /* Dispose of allocated data of BDS states. */ + wc_xmss_bds_state_free(bds); +#endif + return ret; +#else + (void)state; + (void)m; + (void)mlen; + (void)sk; + (void)sig; + + return NOT_COMPILED_IN; +#endif /* WOLFSSL_XMSS_MIN_HEIGHT <= 32 */ +} + +/******************************************** + * XMSS^MT + ********************************************/ + +/* Generate a XMSS^MT key pair from seeds. + * + * RFC 8391: 4.2.2, Algorithm 15: XMSS^MT_keyGen. + * ... + * # Example initialization + * idx_MT = 0; + * setIdx(SK_MT, idx_MT); + * initialize SK_PRF with a uniformly random n-byte string; + * setSK_PRF(SK_MT, SK_PRF); + * initialize SEED with a uniformly random n-byte string; + * setSEED(SK_MT, SEED); + * + * # Generate reduced XMSS private keys + * ADRS = toByte(0, 32); + * for ( layer = 0; layer < d; layer++ ) { + * ADRS.setLayerAddress(layer); + * for ( tree = 0; tree < + * (1 << ((d - 1 - layer) * (h / d))); + * tree++ ) { + * ADRS.setTreeAddress(tree); + * for ( i = 0; i < 2^(h / d); i++ ) { + * wots_sk[i] = WOTS_genSK(); + * } + * setXMSS_SK(SK_MT, wots_sk, tree, layer); + * } + * } + * + * SK = getXMSS_SK(SK_MT, 0, d - 1); + * setSEED(SK, SEED); + * root = treeHash(SK, 0, h / d, ADRS); + * setRoot(SK_MT, root); + * + * PK_MT = OID || root || SEED; + * return (SK_MT || PK_MT); + * + * HDSS, Section 4.5, The algorithm, Initialization. + * OPX, Section 2, Key Generation. + * + * wots_sk, SK_PRF and SEED passed in as seed. + * Store seed for wots_sk instead of generated wots_sk. + * OID not stored in PK this is handled in upper layer. + * BDS state is appended to SK: + * SK = idx || wots_sk || SK_PRF || root || SEED || BDS_STATE; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] seed Secret/Private and public seed. + * @param [out] sk Secret key. + * @param [out] pk Public key. + * @return 0 on success. + * @return MEMORY_E on dynamic memory allocation failure. + * @return <0 on digest failure. + */ +int wc_xmssmt_keygen(XmssState* state, const unsigned char* seed, + unsigned char* sk, unsigned char* pk) +{ + int ret = 0; + const XmssParams* params = state->params; + const word8 n = params->n; + unsigned char* sk_seed = sk + params->idx_len; + unsigned char* pk_root = pk; + unsigned char* pk_seed = pk + n; + word8 i; + byte* wots_sigs; + BdsState* bds = NULL; + + /* Allocate memory for BDS states and tree hash instances. */ + ret = wc_xmss_bds_state_alloc(params, &bds); + if (ret == 0) { + /* Offsets into seed. */ + const byte* seed_priv = seed; + const byte* seed_pub = seed + 2 * params->n; + + /* Load the BDS state from secret/private key. */ + wc_xmss_bds_state_load(state, sk, bds, &wots_sigs); + + /* Set first index to 0 in private key. */ + XMEMSET(sk, 0, params->idx_len); + /* Set private key seed and private key for PRF in to private key. */ + XMEMCPY(sk_seed, seed_priv, 2 * n); + /* Set public key seed into public key. */ + XMEMCPY(pk_seed, seed_pub, n); + + /* Set all address values to zero. */ + XMEMSET(state->addr, 0, sizeof(HashAddress)); + /* Hash address layer is 0 = bottom-most layer. */ + } + + /* Setup state and compute WOTS+ signatures for all but top-most subtree. */ + for (i = 0; (ret == 0) && (i < params->d - 1); i++) { + /* Compute root for subtree. */ + wc_xmss_bds_treehash_initial(state, bds + i, sk_seed, pk_seed, + state->addr, pk_root); + ret = state->ret; + if (ret == 0) { + /* Create signature for subtree for first index. */ + state->addr[XMSS_ADDR_LAYER] = i+1; + wc_xmss_wots_sign(state, pk_root, sk_seed, pk_seed, state->addr, + wots_sigs + i * params->wots_sig_len); + ret = state->ret; + } + } + if (ret == 0) { + /* Compute root for top-most subtree. */ + wc_xmss_bds_treehash_initial(state, bds + i, sk_seed, pk_seed, + state->addr, pk_root); + /* Return any errors that occurred during hashing. */ + ret = state->ret; + } + + if (ret == 0) { + /* Offset of root node in private key. */ + unsigned char* sk_root = sk_seed + 2 * n; + + /* Append public key (root node and public seed) to private key. */ + XMEMCPY(sk_root, pk_root, 2 * n); + + /* Store BDS state back into secret/private key. */ + wc_xmss_bds_state_store(state, sk, bds); + } + + /* Dispose of allocated data of BDS states. */ + wc_xmss_bds_state_free(bds); + return ret; +} + + +#if !defined(WORD64_AVAILABLE) && (WOLFSSL_XMSS_MAX_HEIGHT > 32) + #error "Support not available - use XMSS small code option" +#endif + +#if (WOLFSSL_XMSS_MAX_HEIGHT > 32) + typedef word64 XmssIdx; + #define IDX_MAX_BITS 64 +#else + typedef word32 XmssIdx; + #define IDX_MAX_BITS 32 +#endif + +/* Decode index into word. + * + * @param [out] idx Index from encoding. + * @param [in] c Count of bytes to decode to index. + * @param [in] a Array to decode from. + */ +static void xmss_idx_decode(XmssIdx* idx, word8 c, const unsigned char* a) +{ + word8 i; + XmssIdx n = 0; + + for (i = 0; i < c; i++) { + n <<= 8; + n += a[i]; + } + + *idx = n; +} + +/* Check whether index is valid. + * + * @param [in] i Index to check. + * @param [in] h Full tree Height. + */ +static int xmss_idx_invalid(XmssIdx i, word8 h) +{ + return ((i + 1) >> h) != 0; +} + +/* Get tree and leaf index from index. + * + * @param [in] i Index to split. + * @param [in] h Tree height. + * @param [out] t Tree index. + * @param [out] l Leaf index. + */ +static void xmss_idx_get_tree_leaf(XmssIdx i, word8 h, XmssIdx* t, word32* l) +{ + *l = (word32)i & (((word32)1 << h) - 1); + *t = i >> h; +} + +/* Set the index into address as the tree index. + * + * @param [in] i Tree index. + * @param [in, out] a Hash address. + */ +static void xmss_idx_set_addr_tree(XmssIdx i, HashAddress a) +{ +#if IDX_MAX_BITS == 32 + a[XMSS_ADDR_TREE_HI] = 0; + a[XMSS_ADDR_TREE] = i; +#else + a[XMSS_ADDR_TREE_HI] = (word32)(i >> 32); + a[XMSS_ADDR_TREE] = (word32)(i ); +#endif +} + +/* Sign message with XMSS^MT. + * + * RFC 8391: 4.1.9, Algorithm 11: treeSig + * ... + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(idx_sig); + * sig_ots = WOTS_sign(getWOTS_SK(SK, idx_sig), + * M', getSEED(SK), ADRS); + * Sig = sig_ots || auth; + * return Sig; + * RFC 8391: 4.2.4, Algorithm 16: XMSS^MT_sign. + * ... + * # Init + * ADRS = toByte(0, 32); + * SEED = getSEED(SK_MT); + * SK_PRF = getSK_PRF(SK_MT); + * idx_sig = getIdx(SK_MT); + * + * # Update SK_MT + * setIdx(SK_MT, idx_sig + 1); + * + * # Message compression + * byte[n] r = PRF(SK_PRF, toByte(idx_sig, 32)); + * byte[n] M' = H_msg(r || getRoot(SK_MT) || (toByte(idx_sig, n)), M); + * + * # Sign + * Sig_MT = idx_sig; + * unsigned int idx_tree + * = (h - h / d) most significant bits of idx_sig; + * unsigned int idx_leaf = (h / d) least significant bits of idx_sig; + * SK = idx_leaf || getXMSS_SK(SK_MT, idx_tree, 0) || SK_PRF + * || toByte(0, n) || SEED; + * ADRS.setLayerAddress(0); + * ADRS.setTreeAddress(idx_tree); + * Sig_tmp = treeSig(M', SK, idx_leaf, ADRS); + * Sig_MT = Sig_MT || r || Sig_tmp; + * for ( j = 1; j < d; j++ ) { + * root = treeHash(SK, 0, h / d, ADRS); + * idx_leaf = (h / d) least significant bits of idx_tree; + * idx_tree = (h - j * (h / d)) most significant bits of idx_tree; + * SK = idx_leaf || getXMSS_SK(SK_MT, idx_tree, j) || SK_PRF + * || toByte(0, n) || SEED; + * ADRS.setLayerAddress(j); + * ADRS.setTreeAddress(idx_tree); + * Sig_tmp = treeSig(root, SK, idx_leaf, ADRS); + * Sig_MT = Sig_MT || Sig_tmp; + * } + * return SK_MT || Sig_MT; + * + * 'auth' was built at key generation or after computing previous signature. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in, out] bds BDS state. + * @param [in] idx Index to sign with. + * @param [in] wots_sigs Pre-computed WOTS+ signatures. + * @param [in] m Buffer holding message. + * @param [in] mlen Length of message in buffer. + * @param [in, out] sk Secret/Private key. + * @param [out] sig Signature and message data. + * @return 0 on success. + * @return <0 on digest failure. + */ +static int wc_xmssmt_sign_msg(XmssState* state, BdsState* bds, XmssIdx idx, + byte* wots_sigs, const unsigned char* m, word32 mlen, unsigned char* sk, + unsigned char* sig) +{ + int ret; + const XmssParams* params = state->params; + const word8 n = params->n; + const word8 hs = params->sub_h; + const word8 idx_len = params->idx_len; + const byte* sk_prf = sk + idx_len + n; + byte* sig_mt = sig; + byte* sig_r = sig + idx_len; + byte node[WC_XMSS_MAX_N]; + + /* Message compression */ + /* byte[n] r = PRF(SK_PRF, toByte(idx_sig, 32)); */ + wc_idx_copy(sig_mt, idx_len, state->buf, XMSS_PRF_M_LEN); + wc_xmss_prf(state, sk_prf, state->buf, sig_r); + ret = state->ret; + if (ret == 0) { + const byte* pub_root = sk + idx_len + 2 * n; + /* byte[n] M' = H_msg(r || getRoot(SK_MT) || (toByte(idx_sig, n)), M); + */ + wc_xmss_hash_message(state, sig_r, pub_root, sig, idx_len, m, mlen, + node); + ret = state->ret; + /* Place new signature data after index and 'r'. */ + sig += idx_len + n; + } + + /* Sign */ + if (ret == 0) { + const byte* sk_seed = sk + idx_len; + const byte* pk_seed = sk + idx_len + 3 * n; + XmssIdx idx_tree; + word32 idx_leaf; + + /* Set all address values to zero and set type to OTS. */ + XMEMSET(state->addr, 0, sizeof(HashAddress)); + state->addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_OTS; + + /* Fist iteration - calculate signature. */ + /* Set layer, tree and OTS leaf index into hash address. */ + state->addr[XMSS_ADDR_LAYER] = 0; + xmss_idx_get_tree_leaf(idx, hs, &idx_tree, &idx_leaf); + xmss_idx_set_addr_tree(idx_tree, state->addr); + /* treeSig || treeHash = sig_ots || auth */ + state->addr[XMSS_ADDR_OTS] = idx_leaf; + /* Create WOTS+ signature for tree into signature (sig_ots). */ + wc_xmss_wots_sign(state, node, sk_seed, pk_seed, state->addr, sig); + ret = state->ret; + } + if (ret == 0) { + word8 i; + + sig += params->wots_sig_len; + /* Add authentication path. */ + XMEMCPY(sig, bds[BDS_IDX(idx, 0, hs, params->d)].authPath, hs * n); + sig += hs * n; + + /* Remaining iterations from storage. */ + for (i = 1; i < params->d; i++) { + /* Copy out precomputed signature into signature (sig_ots). */ + XMEMCPY(sig, wots_sigs + (i - 1) * params->wots_sig_len, + params->wots_sig_len); + sig += params->wots_sig_len; + /* Add authentication path (auth) and calc new root. */ + XMEMCPY(sig, bds[BDS_IDX(idx, i, hs, params->d)].authPath, hs * n); + sig += hs * n; + } + ret = state->ret; + } + + return ret; +} + +/* Compute BDS state for signing next index. + * + * HDSS, Section 4.5, The algorithm, Update and output phase. + * OPX, Section 2, Signature Generation. Para 2 and 3. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in, out] bds BDS state. + * @param [in] idx Index to sign with. + * @param [in] wots_sigs Pre-computed WOTS+ signatures. + * @param [in] m Buffer holding message. + * @param [in] mlen Length of message in buffer. + * @param [in, out] sk Secret/Private key. + * @param [out] sig Signature and message data. + * @return 0 on success. + * @return <0 on digest failure. + */ +static int wc_xmssmt_sign_next_idx(XmssState* state, BdsState* bds, XmssIdx idx, + byte* wots_sigs, unsigned char* sk) +{ + int ret = 0; + const XmssParams* params = state->params; + const word8 n = params->n; + const word8 h = params->h; + const word8 hs = params->sub_h; + const word8 hsk = params->sub_h - params->bds_k; + const byte* sk_seed = sk + params->idx_len; + const byte* pk_seed = sk + params->idx_len + 3 * n; + XmssIdx idx_tree; + int computeAuthPath = 1; + unsigned int updates; + word8 i; + + /* Update BDS state - update authentication path for next index. */ + /* HDSS, Algorithm 4.6, Step 5: repeat (H - K) / 2 times. */ + updates = hsk >> 1; + + idx_tree = (idx >> hs) + 1; + /* Check whether last tree. */ + if (idx_tree < ((XmssIdx)1 << (h - hs))) { + /* Set hash address to next tree. */ + state->addr[XMSS_ADDR_LAYER] = 0; + xmss_idx_set_addr_tree(idx_tree, state->addr); + /* Update BDS state. */ + wc_xmss_bds_update(state, &bds[BDS_ALT_IDX(idx, 0, hs, params->d)], + sk_seed, pk_seed, state->addr); + ret = state->ret; + } + + for (i = 0; (ret == 0) && (i < params->d); i++) { + word32 idx_leaf; + word8 bds_i = BDS_IDX(idx, i, hs, params->d); + word8 alt_i = BDS_ALT_IDX(idx, i, hs, params->d); + + /* Check not last at height. */ + if (((idx + 1) << (IDX_MAX_BITS - ((i + 1) * hs))) != 0) { + state->addr[XMSS_ADDR_LAYER] = i; + xmss_idx_get_tree_leaf(idx >> (hs * i), hs, &idx_tree, &idx_leaf); + xmss_idx_set_addr_tree(idx_tree, state->addr); + idx_tree++; + + if (computeAuthPath) { + /* Compute authentication path for tree. */ + wc_xmss_bds_auth_path(state, &bds[bds_i], idx_leaf, sk_seed, + pk_seed, state->addr); + ret = state->ret; + computeAuthPath = 0; + } + + if (ret == 0) { + /* HDSS, Algorithm 4.6: Step 5. */ + updates = wc_xmss_bds_treehash_updates(state, &bds[bds_i], + updates, sk_seed, pk_seed, state->addr); + ret = state->ret; + } + + /* Check tree not first, updates to do, tree not last at height and + * next leaf in alt state is not last. */ + if ((ret == 0) && (i > 0) && (updates > 0) && + (idx_tree < ((XmssIdx)1 << (h - (hs * (i + 1))))) && + (bds[alt_i].next < ((XmssIdx)1 << h))) { + xmss_idx_set_addr_tree(idx_tree, state->addr); + /* Update alternative BDS state. */ + wc_xmss_bds_update(state, &bds[alt_i], sk_seed, pk_seed, + state->addr); + ret = state->ret; + updates--; + } + } + /* Last at height. */ + else { + /* Set layer, tree and OTS leaf index into hash address. */ + state->addr[XMSS_ADDR_LAYER] = i + 1; + idx_tree = (idx + 1) >> ((i + 1) * hs); + xmss_idx_get_tree_leaf(idx_tree, hs, &idx_tree, &idx_leaf); + xmss_idx_set_addr_tree(idx_tree, state->addr); + /* Cache WOTS+ signature for new tree. */ + state->addr[XMSS_ADDR_OTS] = idx_leaf; + wc_xmss_wots_sign(state, bds[alt_i].stack, sk_seed, pk_seed, + state->addr, wots_sigs + i * params->wots_sig_len); + ret = state->ret; + + if (ret == 0) { + word8 d; + + /* Reset old BDS state. */ + bds[bds_i].offset = 0; + bds[bds_i].next = 0; + + /* Done an update. */ + updates--; + /* Need to compute authentication path in next tree up. */ + computeAuthPath = 1; + /* Mark the tree hashes as complete in new BDS state. */ + for (d = 0; d < hsk; d++) { + wc_xmss_bds_state_treehash_complete(&bds[alt_i], d); + } + } + } + } + + return ret; +} + +/* Sign a message with XMSS^MT and update BDS state for signing next index. + * + * RFC 8391: 4.2.4, Algorithm 16: XMSS^MT_sign. + * HDSS, Section 4.5, The algorithm, Update and output phase. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] m Buffer holding message. + * @param [in] mlen Length of message in buffer. + * @param [in, out] sk Secret/Private key. + * @param [out] sig Signature and message data. + * @return 0 on success. + * @return MEMORY_E on dynamic memory allocation failure. + * @return <0 on digest failure. + */ +int wc_xmssmt_sign(XmssState* state, const unsigned char* m, word32 mlen, + unsigned char* sk, unsigned char* sig) +{ + int ret = 0; + const XmssParams* params = state->params; + const word8 h = params->h; + const word8 idx_len = params->idx_len; + XmssIdx idx = 0; + byte* sig_mt = sig; + byte* wots_sigs; + BdsState* bds = NULL; + + /* Allocate memory for BDS states and tree hash instances. */ + ret = wc_xmss_bds_state_alloc(params, &bds); + if (ret == 0) { + /* Load the BDS state from secret/private key. */ + wc_xmss_bds_state_load(state, sk, bds, &wots_sigs); + + /* Copy the index into the signature data: Sig_MT = idx_sig. */ + XMEMCPY(sig_mt, sk, idx_len); + + /* Read index from the secret key. */ + xmss_idx_decode(&idx, idx_len, sk); + } + if ((ret == 0) && xmss_idx_invalid(idx, h)) { + /* Set index to maximum value to distinguish from valid value. */ + XMEMSET(sk, 0xFF, idx_len); + /* Zeroize the secret key. */ + ForceZero(sk + idx_len, params->sk_len - idx_len); + ret = KEY_EXHAUSTED_E; + } + + if (ret == 0) { + /* Increment the index in the secret key. */ + wc_idx_update(sk, idx_len); + + /* Compute signature. */ + ret = wc_xmssmt_sign_msg(state, bds, idx, wots_sigs, m, mlen, sk, sig); + } + + /* Only update if not last index. */ + if ((ret == 0) && (idx < (((XmssIdx)1 << h) - 1))) { + /* Update BDS state for signing next index. */ + ret = wc_xmssmt_sign_next_idx(state, bds, idx, wots_sigs, sk); + } + + if (ret == 0) { + /* Store BDS state back into secret/private key. */ + wc_xmss_bds_state_store(state, sk, bds); + } + + /* Dispose of allocated data of BDS states. */ + wc_xmss_bds_state_free(bds); + return ret; +} + +#endif /* WOLFSSL_WC_XMSS_SMALL */ + +/* Check if more signatures are possible with secret/private key. + * + * @param [in] params XMSS parameters + * @param [in] sk Secret/private key. + * @return 1 when signatures possible. + * @return 0 when key exhausted. + */ + +int wc_xmss_sigsleft(const XmssParams* params, unsigned char* sk) +{ + int ret = 0; + wc_Idx idx; + + WC_IDX_ZERO(idx); + /* Read index from the secret key. */ + WC_IDX_DECODE(idx, params->idx_len, sk, ret); + /* Check validity of index. */ + if ((ret == 0) && (WC_IDX_INVALID(idx, params->idx_len, params->h))) { + ret = KEY_EXHAUSTED_E; + } + + return ret == 0; +} +#endif /* !WOLFSSL_XMSS_VERIFY_ONLY */ + +/******************************************** + * SIGN OPEN - Verify + ********************************************/ + +#if !defined(WOLFSSL_WC_XMSS_SMALL) || defined(WOLFSSL_XMSS_VERIFY_ONLY) +/* Compute root node with leaf and authentication path. + * + * RFC 8391: 4.1.10, Algorithm 13: XMSS_rootFromSig + * ... + * for ( k = 0; k < h; k++ ) { + * ADRS.setTreeHeight(k); + * if ( (floor(idx_sig / (2^k)) % 2) == 0 ) { + * ADRS.setTreeIndex(ADRS.getTreeIndex() / 2); + * node[1] = RAND_HASH(node[0], auth[k], SEED, ADRS); + * } else { + * ADRS.setTreeIndex((ADRS.getTreeIndex() - 1) / 2); + * node[1] = RAND_HASH(auth[k], node[0], SEED, ADRS); + * } + * node[0] = node[1]; + * } + * return node[0]; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] idx_leaf Index of leaf node. + * @param [in] auth_path Authentication path. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [in, out] root On in, leaf node. On out, root node. + */ +static void wc_xmss_compute_root(XmssState* state, word32 idx_leaf, + const byte* auth_path, const byte* pk_seed, HashAddress addr, byte* root) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + const byte* b[2][2] = { { root, auth_path }, { auth_path, root } }; + word8 i; + + for (i = 0; i < params->sub_h; i++) { + /* Get which side the leaf is on. */ + word8 s = idx_leaf & 1; + /* Set tree height and index. */ + addr[XMSS_ADDR_TREE_HEIGHT] = i; + idx_leaf >>= 1; + addr[XMSS_ADDR_TREE_INDEX] = idx_leaf; + + /* Put the result into buffer position for next RAND_HASH. */ + wc_xmss_rand_hash_lr(state, b[s][0], b[s][1], pk_seed, addr, root); + /* Move to next auth path node. */ + b[0][1] += n; + b[1][0] += n; + } +} +#else +/* Compute root node with leaf and authentication path. + * + * RFC 8391: 4.1.10, Algorithm 13: XMSS_rootFromSig + * ... + * for ( k = 0; k < h; k++ ) { + * ADRS.setTreeHeight(k); + * if ( (floor(idx_sig / (2^k)) % 2) == 0 ) { + * ADRS.setTreeIndex(ADRS.getTreeIndex() / 2); + * node[1] = RAND_HASH(node[0], auth[k], SEED, ADRS); + * } else { + * ADRS.setTreeIndex((ADRS.getTreeIndex() - 1) / 2); + * node[1] = RAND_HASH(auth[k], node[0], SEED, ADRS); + * } + * node[0] = node[1]; + * } + * return node[0]; + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] idx_leaf Index of leaf node. + * @param [in] auth_path Authentication path. + * @param [in] pk_seed Random public seed. + * @param [in] addr Hash address. + * @param [in, out] node On in, leaf node. On out, root node. + */ +static void wc_xmss_compute_root(XmssState* state, word32 idx_leaf, + const byte* auth_path, const byte* pk_seed, HashAddress addr, byte* node) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + byte buffer[2 * WC_XMSS_MAX_N]; + byte* b[2][2] = { { buffer, buffer + n }, { buffer + n, buffer } }; + word8 i; + + /* Setup buffer for first RAND_HASH. */ + XMEMCPY(b[idx_leaf & 1][0], node, n); + XMEMCPY(b[idx_leaf & 1][1], auth_path, n); + auth_path += n; + + for (i = 0; i < params->sub_h - 1; i++) { + /* Set tree height and index. */ + addr[XMSS_ADDR_TREE_HEIGHT] = i; + idx_leaf >>= 1; + addr[XMSS_ADDR_TREE_INDEX] = idx_leaf; + + /* Put the result into buffer position for next RAND_HASH. */ + wc_xmss_rand_hash(state, buffer, pk_seed, addr, b[idx_leaf & 1][0]); + /* Put auth path node into other half of buffer. */ + XMEMCPY(b[idx_leaf & 1][1], auth_path, n); + /* Move to next auth path node. */ + auth_path += n; + } + + addr[XMSS_ADDR_TREE_HEIGHT] = i; + idx_leaf >>= 1; + addr[XMSS_ADDR_TREE_INDEX] = idx_leaf; + /* Last iteration into output node. */ + wc_xmss_rand_hash(state, buffer, pk_seed, addr, node); +} +#endif /* !WOLFSSL_WC_XMSS_SMALL || WOLFSSL_XMSS_VERIFY_ONLY */ + +/* Compute a root node from a tree signature. + * + * RFC 8391: 4.1.10, Algorithm 13: XMSS_rootFromSig + * ADRS.setType(0); # Type = OTS hash address + * ADRS.setOTSAddress(idx_sig); + * pk_ots = WOTS_pkFromSig(sig_ots, M', SEED, ADRS); + * ADRS.setType(1); # Type = L-tree address + * ADRS.setLTreeAddress(idx_sig); + * byte[n][2] node; + * node[0] = ltree(pk_ots, SEED, ADRS); + * ADRS.setType(2); # Type = hash tree address + * ADRS.setTreeIndex(idx_sig); + * [Compute root with leaf and authentication path] + * + * Computing the root from the leaf and authentication path can be implemented + * in different ways and is therefore extracted to its own function. + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] pk_seed Random public seed. + * @param [in] sig WOTS+ signature for this tree. + * @param [in] idx_sig Index of signature leaf in this tree. + * @param [in, out] addr Hash address. + * @param [in, out] node On in, previous root node. + * On out, root node of this subtree. + */ +static void wc_xmss_root_from_sig(XmssState* state, const byte* pk_seed, + const byte* sig, word32 idx_sig, HashAddress addr, byte* node) +{ + const XmssParams* params = state->params; + byte* wots_pk = state->pk; + const byte* auth_path = sig + params->wots_sig_len; + + /* Compute WOTS+ public key value from signature. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_OTS; + addr[XMSS_ADDR_OTS] = idx_sig; + wc_xmss_wots_pk_from_sig(state, sig, node, pk_seed, addr, wots_pk); + + /* Compute leaves of L-tree from WOTS+ public key. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_LTREE; + /* XMSS_ADDR_LTREE is same as XMSS_ADDR_OTS in index and value. */ + wc_xmss_ltree(state, wots_pk, pk_seed, addr, node); + + /* Compute root node from leaf and authentication path. */ + addr[XMSS_ADDR_TYPE] = WC_XMSS_ADDR_TYPE_TREE; + addr[XMSS_ADDR_TREE_ZERO] = 0; + wc_xmss_compute_root(state, idx_sig, auth_path, pk_seed, addr, node); +} + +/* Verify message with signature using XMSS/MT. + * + * RFC 8391: 4.2.5, Algorithm 17: XMSSMT_verify + * idx_sig = getIdx(Sig_MT); + * SEED = getSEED(PK_MT); + * ADRS = toByte(0, 32); + * + * byte[n] M' = H_msg(getR(Sig_MT) || getRoot(PK_MT) + * || (toByte(idx_sig, n)), M); + * + * unsigned int idx_leaf + * = (h / d) least significant bits of idx_sig; + * unsigned int idx_tree + * = (h - h / d) most significant bits of idx_sig; + * Sig' = getXMSSSignature(Sig_MT, 0); + * ADRS.setLayerAddress(0); + * ADRS.setTreeAddress(idx_tree); + * byte[n] node = XMSS_rootFromSig(idx_leaf, getSig_ots(Sig'), + * getAuth(Sig'), M', SEED, ADRS); + * for ( j = 1; j < d; j++ ) { + * idx_leaf = (h / d) least significant bits of idx_tree; + * idx_tree = (h - j * h / d) most significant bits of idx_tree; + * Sig' = getXMSSSignature(Sig_MT, j); + * ADRS.setLayerAddress(j); + * ADRS.setTreeAddress(idx_tree); + * node = XMSS_rootFromSig(idx_leaf, getSig_ots(Sig'), + * getAuth(Sig'), node, SEED, ADRS); + * } + * if ( node == getRoot(PK_MT) ) { + * return true; + * } else { + * return false; + * } + * + * @param [in] state XMSS/MT state including digest and parameters. + * @param [in] m Message buffer. + * @param [in] mlen Length of message in bytes. + * @param [in] sig Buffer holding signature. + * @param [in] pk Public key. + * @return 0 on success. + * @return MEMORY_E on dynamic memory allocation failure. + * @return SIG_VERIFY_E on verification failure. + * @return <0 on digest failure. + */ +int wc_xmssmt_verify(XmssState* state, const unsigned char* m, word32 mlen, + const unsigned char* sig, const unsigned char* pk) +{ + const XmssParams* params = state->params; + const word8 n = params->n; + int ret = 0; + const byte* pub_root = pk; + const byte* pk_seed = pk + n; + byte node[WC_XMSS_MAX_N]; + wc_Idx idx; + word32 idx_leaf = 0; + unsigned int i; + + /* Set 32/64-bit index to 0. */ + WC_IDX_ZERO(idx); + /* Set all address values to zero. */ + XMEMSET(state->addr, 0, sizeof(HashAddress)); + + if (ret == 0) { + /* Convert the index bytes from the signature to an integer. */ + WC_IDX_DECODE(idx, params->idx_len, sig, ret); + } + + if (ret == 0) { + const byte* sig_r = sig + params->idx_len; + /* byte[n] M' = H_msg(getR(Sig_MT) || getRoot(PK_MT) || + * (toByte(idx_sig, n)), M); + */ + wc_xmss_hash_message(state, sig_r, pub_root, sig, params->idx_len, m, + mlen, node); + ret = state->ret; + } + + if (ret == 0) { + /* Set tree of hash address. */ + WC_IDX_SET_ADDR_TREE(idx, params->idx_len, params->sub_h, state->addr, + idx_leaf); + + /* Skip to first WOTS+ signature and derive root. */ + sig += params->idx_len + n; + wc_xmss_root_from_sig(state, pk_seed, sig, idx_leaf, state->addr, + node); + ret = state->ret; + } + /* Calculate root of remaining subtrees up to top. */ + for (i = 1; (ret == 0) && (i < params->d); i++) { + /* Set layer and tree. */ + state->addr[XMSS_ADDR_LAYER] = i; + WC_IDX_SET_ADDR_TREE(idx, params->idx_len, params->sub_h, state->addr, + idx_leaf); + /* Skip to next WOTS+ signature and derive root. */ + sig += params->wots_sig_len + params->sub_h * n; + wc_xmss_root_from_sig(state, pk_seed, sig, idx_leaf, state->addr, + node); + ret = state->ret; + } + /* Compare calculated node with public key root. */ + if ((ret == 0) && (XMEMCMP(node, pub_root, n) != 0)) { + ret = SIG_VERIFY_E; + } + + return ret; +} +#endif /* WOLFSSL_HAVE_XMSS */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wolfevent.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wolfevent.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wolfevent.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wolfevent.c 2024-08-03 07:30:00.000000000 +0000 @@ -55,7 +55,7 @@ int wolfEvent_Poll(WOLF_EVENT* event, WOLF_EVENT_FLAG flags) { - int ret = BAD_COND_E; + int ret = WC_NO_ERR_TRACE(BAD_COND_E); /* Check hardware */ #ifdef WOLFSSL_ASYNC_CRYPT @@ -180,8 +180,12 @@ else { WOLF_EVENT* next = event->next; WOLF_EVENT* prev = event->prev; - next->prev = prev; - prev->next = next; + if ((next == NULL) || (prev == NULL)) { + ret = BAD_STATE_E; + } else { + next->prev = prev; + prev->next = next; + } } queue->count--; @@ -205,7 +209,7 @@ } #endif - /* iterrate event queue */ + /* iterate event queue */ for (event = queue->head; event != NULL; event = event->next) { /* optional filter based on context */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wolfmath.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wolfmath.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/src/wolfmath.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/src/wolfmath.c 2024-08-03 07:30:00.000000000 +0000 @@ -167,7 +167,8 @@ return wc_RNG_GenerateBlock(rng, (byte*)d, sizeof(mp_digit)); } -#if defined(WC_RSA_BLINDING) || defined(WOLFCRYPT_HAVE_SAKKE) +#if defined(WC_RSA_BLINDING) || defined(WOLFCRYPT_HAVE_SAKKE) || \ + defined(WOLFSSL_ECC_BLIND_K) int mp_rand(mp_int* a, int digits, WC_RNG* rng) { int ret = 0; @@ -221,7 +222,7 @@ return ret; } -#endif /* WC_RSA_BLINDING || WOLFCRYPT_HAVE_SAKKE */ +#endif /* WC_RSA_BLINDING || WOLFCRYPT_HAVE_SAKKE || WOLFSSL_ECC_BLIND_K */ #endif /* !WC_NO_RNG */ #if defined(HAVE_ECC) || defined(WOLFSSL_EXPORT_INT) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/test/test.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/test/test.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/test/test.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/test/test.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ /* test.c * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -19,6 +19,15 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ +/* + * Some common, optional build settings: + * these can also be set in wolfssl/options.h or user_settings.h + * ------------------------------------------------------------- + * + * set the default devId for cryptocb to the value instead of INVALID_DEVID + * WC_USE_DEVID=0x1234 + */ + #ifdef HAVE_CONFIG_H #include #endif @@ -49,13 +58,17 @@ #ifdef HAVE_STACK_SIZE_VERBOSE #ifdef WOLFSSL_TEST_MAX_RELATIVE_STACK_BYTES - static ssize_t max_relative_stack = WOLFSSL_TEST_MAX_RELATIVE_STACK_BYTES; + static WC_MAYBE_UNUSED ssize_t max_relative_stack = + WOLFSSL_TEST_MAX_RELATIVE_STACK_BYTES; #else - static ssize_t max_relative_stack = -1; + static WC_MAYBE_UNUSED ssize_t max_relative_stack = -1; #endif #endif -#ifdef WOLFSSL_TRACK_MEMORY_VERBOSE +const byte const_byte_array[] = "A+Gd\0\0\0"; +#define CBPTR_EXPECTED 'A' + +#if defined(WOLFSSL_TRACK_MEMORY_VERBOSE) && !defined(WOLFSSL_STATIC_MEMORY) #ifdef WOLFSSL_TEST_MAX_RELATIVE_HEAP_ALLOCS static ssize_t max_relative_heap_allocs = WOLFSSL_TEST_MAX_RELATIVE_HEAP_ALLOCS; #else @@ -83,8 +96,8 @@ heap_baselineBytes = wolfCrypt_heap_peakBytes_checkpoint(); \ } #else -#define PRINT_HEAP_CHECKPOINT() -#endif +#define PRINT_HEAP_CHECKPOINT() WC_DO_NOTHING +#endif /* WOLFSSL_TRACK_MEMORY_VERBOSE && !WOLFSSL_STATIC_MEMORY */ #ifdef USE_FLAT_TEST_H #ifdef HAVE_CONFIG_H @@ -121,6 +134,8 @@ #include #include #include + #include + #define ESPIDF_TAG "wc_test" #elif defined(WOLFSSL_ZEPHYR) #include @@ -186,6 +201,23 @@ #include #undef printf #define printf printx +#elif defined(WOLFSSL_RENESAS_RSIP) + #ifndef TEST_SLEEP + #define TEST_SLEEP() vTaskDelay(50) + #endif + #undef vprintf + #define vprintf rsip_vprintf + #include /* for var args */ + int rsip_vprintf(const char* restrict format, va_list args) + { + int ret; + char tmpBuf[80]; + + ret = XVSNPRINTF(tmpBuf, sizeof(tmpBuf), format, args); + printf(tmpBuf); + + return ret; + } #else #ifdef XMALLOC_USER #include /* we're using malloc / free direct here */ @@ -225,6 +257,7 @@ #include #include #include +#include #include #include #if !defined(WC_NO_RNG) @@ -254,6 +287,9 @@ #ifdef HAVE_ECC #include #endif +#ifdef WOLFSSL_SM2 + #include +#endif #ifdef HAVE_HPKE #include #endif @@ -278,6 +314,25 @@ #include #endif #endif +#ifdef HAVE_DILITHIUM + #include +#endif +#if defined(WOLFSSL_HAVE_XMSS) + #include +#ifdef HAVE_LIBXMSS + #include +#else + #include +#endif +#endif +#if defined(WOLFSSL_HAVE_LMS) + #include +#ifdef HAVE_LIBLMS + #include +#else + #include +#endif +#endif #ifdef WOLFCRYPT_HAVE_ECCSI #include #endif @@ -290,12 +345,21 @@ #ifdef WOLFSSL_SHA3 #include #endif +#ifdef WOLFSSL_SM3 + #include +#endif +#ifdef WOLFSSL_SM4 + #include +#endif #ifdef HAVE_LIBZ #include #endif #ifdef HAVE_PKCS7 #include #endif +#ifdef HAVE_PKCS12 + #include +#endif #ifdef HAVE_FIPS #include #endif @@ -319,6 +383,9 @@ #ifdef HAVE_CAVIUM_OCTEON_SYNC #include #endif + #ifdef HAVE_RENESAS_SYNC + #include + #endif #endif #ifdef _MSC_VER @@ -389,7 +456,11 @@ #ifdef WOLFSSL_CAAM_DEVID static int devId = WOLFSSL_CAAM_DEVID; #else + #ifdef WC_USE_DEVID +static int devId = WC_USE_DEVID; + #else static int devId = INVALID_DEVID; + #endif #endif #ifdef HAVE_WNR @@ -413,217 +484,312 @@ PRAGMA_GCC("GCC diagnostic ignored \"-Wunused-function\"") PRAGMA_CLANG("clang diagnostic ignored \"-Wunused-function\"") -WOLFSSL_TEST_SUBROUTINE int error_test(void); -WOLFSSL_TEST_SUBROUTINE int base64_test(void); -WOLFSSL_TEST_SUBROUTINE int base16_test(void); -WOLFSSL_TEST_SUBROUTINE int asn_test(void); -WOLFSSL_TEST_SUBROUTINE int md2_test(void); -WOLFSSL_TEST_SUBROUTINE int md5_test(void); -WOLFSSL_TEST_SUBROUTINE int md4_test(void); -WOLFSSL_TEST_SUBROUTINE int sha_test(void); -WOLFSSL_TEST_SUBROUTINE int sha224_test(void); -WOLFSSL_TEST_SUBROUTINE int sha256_test(void); -WOLFSSL_TEST_SUBROUTINE int sha512_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t error_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t base64_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t base16_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t asn_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t md2_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t md5_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t md4_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha224_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha256_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha512_test(void); #if !defined(WOLFSSL_NOSHA512_224) && \ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) -WOLFSSL_TEST_SUBROUTINE int sha512_224_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha512_224_test(void); #endif #if !defined(WOLFSSL_NOSHA512_256) && \ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) -WOLFSSL_TEST_SUBROUTINE int sha512_256_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha512_256_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int sha384_test(void); -WOLFSSL_TEST_SUBROUTINE int sha3_test(void); -WOLFSSL_TEST_SUBROUTINE int shake128_test(void); -WOLFSSL_TEST_SUBROUTINE int shake256_test(void); -WOLFSSL_TEST_SUBROUTINE int hash_test(void); -WOLFSSL_TEST_SUBROUTINE int hmac_md5_test(void); -WOLFSSL_TEST_SUBROUTINE int hmac_sha_test(void); -WOLFSSL_TEST_SUBROUTINE int hmac_sha224_test(void); -WOLFSSL_TEST_SUBROUTINE int hmac_sha256_test(void); -WOLFSSL_TEST_SUBROUTINE int hmac_sha384_test(void); -WOLFSSL_TEST_SUBROUTINE int hmac_sha512_test(void); -WOLFSSL_TEST_SUBROUTINE int hmac_sha3_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha384_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha3_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t shake128_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t shake256_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sm3_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_md5_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha224_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha256_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha384_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha512_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha3_test(void); #if defined(HAVE_HKDF) && !defined(NO_HMAC) +#if defined(WOLFSSL_AFALG_XILINX) || defined(WOLFSSL_AFALG_XILINX_AES) || \ + defined(WOLFSSL_AFALG_XILINX_SHA3) || defined(WOLFSSL_AFALG_HASH_KEEP) || \ + defined(WOLFSSL_AFALG_XILINX_RSA) /* hkdf_test has issue with WOLFSSL_TEST_SUBROUTINE set on Xilinx with afalg */ -static int hkdf_test(void); +static wc_test_ret_t hkdf_test(void); +#else +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hkdf_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int sshkdf_test(void); +#endif /* HAVE_HKDF && ! NO_HMAC */ +#ifdef WOLFSSL_HAVE_PRF +#if defined(HAVE_HKDF) && !defined(NO_HMAC) +#ifdef WOLFSSL_BASE16 +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t tls12_kdf_test(void); +#endif /* WOLFSSL_BASE16 */ +#endif /* WOLFSSL_HAVE_HKDF && !NO_HMAC */ +#endif /* WOLFSSL_HAVE_PRF */ +#if defined(WOLFSSL_HAVE_PRF) && !defined(NO_HMAC) && defined(WOLFSSL_SHA384) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t prf_test(void); +#endif +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sshkdf_test(void); #ifdef WOLFSSL_TLS13 -WOLFSSL_TEST_SUBROUTINE int tls13_kdf_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t tls13_kdf_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int x963kdf_test(void); -WOLFSSL_TEST_SUBROUTINE int hpke_test(void); -WOLFSSL_TEST_SUBROUTINE int arc4_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t x963kdf_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hpke_test(void); +#ifdef WC_SRTP_KDF +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t srtpkdf_test(void); +#endif +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t arc4_test(void); #ifdef WC_RC2 -WOLFSSL_TEST_SUBROUTINE int rc2_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t rc2_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int chacha_test(void); -WOLFSSL_TEST_SUBROUTINE int XChaCha_test(void); -WOLFSSL_TEST_SUBROUTINE int chacha20_poly1305_aead_test(void); -WOLFSSL_TEST_SUBROUTINE int XChaCha20Poly1305_test(void); -WOLFSSL_TEST_SUBROUTINE int des_test(void); -WOLFSSL_TEST_SUBROUTINE int des3_test(void); -WOLFSSL_TEST_SUBROUTINE int aes_test(void); -WOLFSSL_TEST_SUBROUTINE int aes192_test(void); -WOLFSSL_TEST_SUBROUTINE int aes256_test(void); -WOLFSSL_TEST_SUBROUTINE int aesofb_test(void); -WOLFSSL_TEST_SUBROUTINE int cmac_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t chacha_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t XChaCha_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t chacha20_poly1305_aead_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t XChaCha20Poly1305_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t des_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t des3_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_test(void); +#if defined(WOLFSSL_AES_CFB) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_cfb_test(void); +#endif +#ifdef WOLFSSL_AES_XTS +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_xts_test(void); +#endif +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes192_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes256_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesofb_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cmac_test(void); #if defined(WOLFSSL_SIPHASH) -WOLFSSL_TEST_SUBROUTINE int siphash_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t siphash_test(void); +#endif +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t poly1305_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesgcm_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesgcm_default_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t gmac_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesccm_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aeskeywrap_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t camellia_test(void); +#ifdef WOLFSSL_SM4 +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sm4_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int poly1305_test(void); -WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void); -WOLFSSL_TEST_SUBROUTINE int aesgcm_default_test(void); -WOLFSSL_TEST_SUBROUTINE int gmac_test(void); -WOLFSSL_TEST_SUBROUTINE int aesccm_test(void); -WOLFSSL_TEST_SUBROUTINE int aeskeywrap_test(void); -WOLFSSL_TEST_SUBROUTINE int camellia_test(void); #ifdef WC_RSA_NO_PADDING -WOLFSSL_TEST_SUBROUTINE int rsa_no_pad_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t rsa_no_pad_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int rsa_test(void); -WOLFSSL_TEST_SUBROUTINE int dh_test(void); -WOLFSSL_TEST_SUBROUTINE int dsa_test(void); -WOLFSSL_TEST_SUBROUTINE int srp_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t rsa_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dh_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dsa_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t srp_test(void); #ifndef WC_NO_RNG -WOLFSSL_TEST_SUBROUTINE int random_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t random_test(void); #endif /* WC_NO_RNG */ -WOLFSSL_TEST_SUBROUTINE int pwdbased_test(void); -WOLFSSL_TEST_SUBROUTINE int ripemd_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pwdbased_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs12_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ripemd_test(void); #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) -WOLFSSL_TEST_SUBROUTINE int openssl_test(void); /* test mini api */ +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void); /* test mini api */ -WOLFSSL_TEST_SUBROUTINE int openssl_pkey0_test(void); -WOLFSSL_TEST_SUBROUTINE int openssl_pkey1_test(void); -WOLFSSL_TEST_SUBROUTINE int openSSL_evpMD_test(void); -WOLFSSL_TEST_SUBROUTINE int openssl_evpSig_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_pkey0_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_pkey1_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openSSL_evpMD_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_evpSig_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int pbkdf1_test(void); -WOLFSSL_TEST_SUBROUTINE int pkcs12_test(void); -WOLFSSL_TEST_SUBROUTINE int pbkdf2_test(void); -WOLFSSL_TEST_SUBROUTINE int scrypt_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pbkdf1_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs12_pbkdf_test(void); +#if defined(HAVE_PBKDF2) && !defined(NO_SHA256) && !defined(NO_HMAC) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pbkdf2_test(void); +#endif +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t scrypt_test(void); #ifdef HAVE_ECC - WOLFSSL_TEST_SUBROUTINE int ecc_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ecc_test(void); #if defined(HAVE_ECC_ENCRYPT) && defined(HAVE_AES_CBC) && \ (defined(WOLFSSL_AES_128) || defined(WOLFSSL_AES_256)) - WOLFSSL_TEST_SUBROUTINE int ecc_encrypt_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ecc_encrypt_test(void); #endif #if defined(USE_CERT_BUFFERS_256) && !defined(WOLFSSL_ATECC508A) && \ !defined(WOLFSSL_ATECC608A) && !defined(NO_ECC256) && \ defined(HAVE_ECC_VERIFY) && defined(HAVE_ECC_SIGN) && \ !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(NO_ECC_SECP) /* skip for ATECC508/608A, cannot import private key buffers */ - WOLFSSL_TEST_SUBROUTINE int ecc_test_buffers(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ecc_test_buffers(void); #endif #endif #ifdef HAVE_CURVE25519 - WOLFSSL_TEST_SUBROUTINE int curve25519_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t curve25519_test(void); #endif #ifdef HAVE_ED25519 - WOLFSSL_TEST_SUBROUTINE int ed25519_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed25519_test(void); #endif #ifdef HAVE_CURVE448 - WOLFSSL_TEST_SUBROUTINE int curve448_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t curve448_test(void); #endif #ifdef HAVE_ED448 - WOLFSSL_TEST_SUBROUTINE int ed448_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed448_test(void); #endif #ifdef WOLFSSL_HAVE_KYBER - WOLFSSL_TEST_SUBROUTINE int kyber_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t kyber_test(void); +#endif +#ifdef HAVE_DILITHIUM + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dilithium_test(void); +#endif +#if defined(WOLFSSL_HAVE_XMSS) + #if !defined(WOLFSSL_SMALL_STACK) && WOLFSSL_XMSS_MIN_HEIGHT <= 10 + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t xmss_test_verify_only(void); + #endif + #if !defined(WOLFSSL_XMSS_VERIFY_ONLY) + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t xmss_test(void); + #endif +#endif +#if defined(WOLFSSL_HAVE_LMS) + #if !defined(WOLFSSL_SMALL_STACK) + #if (defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)) || \ + defined(HAVE_LIBLMS) + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test_verify_only(void); + #endif + #endif + #if !defined(WOLFSSL_LMS_VERIFY_ONLY) + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test(void); + #endif #endif #ifdef WOLFCRYPT_HAVE_ECCSI - WOLFSSL_TEST_SUBROUTINE int eccsi_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t eccsi_test(void); #endif #ifdef WOLFCRYPT_HAVE_SAKKE - WOLFSSL_TEST_SUBROUTINE int sakke_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sakke_test(void); #endif #ifdef HAVE_BLAKE2 - WOLFSSL_TEST_SUBROUTINE int blake2b_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blake2b_test(void); #endif #ifdef HAVE_BLAKE2S - WOLFSSL_TEST_SUBROUTINE int blake2s_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blake2s_test(void); #endif #ifdef HAVE_LIBZ - WOLFSSL_TEST_SUBROUTINE int compress_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t compress_test(void); #endif #ifdef HAVE_PKCS7 #ifndef NO_PKCS7_ENCRYPTED_DATA - WOLFSSL_TEST_SUBROUTINE int pkcs7encrypted_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7encrypted_test(void); #endif #if defined(HAVE_LIBZ) && !defined(NO_PKCS7_COMPRESSED_DATA) - WOLFSSL_TEST_SUBROUTINE int pkcs7compressed_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7compressed_test(void); #endif - WOLFSSL_TEST_SUBROUTINE int pkcs7signed_test(void); - WOLFSSL_TEST_SUBROUTINE int pkcs7enveloped_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7signed_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7enveloped_test(void); #if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) - WOLFSSL_TEST_SUBROUTINE int pkcs7authenveloped_test(void); + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7authenveloped_test(void); #endif #if !defined(NO_AES) && defined(HAVE_AES_CBC) - WOLFSSL_TEST_SUBROUTINE int pkcs7callback_test(byte* cert, word32 certSz, byte* key, + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7callback_test(byte* cert, word32 certSz, byte* key, word32 keySz); #endif #endif #if !defined(NO_ASN_TIME) && !defined(NO_RSA) && defined(WOLFSSL_TEST_CERT) && \ !defined(NO_FILESYSTEM) -WOLFSSL_TEST_SUBROUTINE int cert_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cert_test(void); #endif #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_TEST_CERT) && \ !defined(NO_FILESYSTEM) && defined(WOLFSSL_CERT_GEN) -WOLFSSL_TEST_SUBROUTINE int certext_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t certext_test(void); #endif #if defined(WOLFSSL_CERT_GEN_CACHE) && defined(WOLFSSL_TEST_CERT) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN) -WOLFSSL_TEST_SUBROUTINE int decodedCertCache_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t decodedCertCache_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int memory_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t memory_test(void); #if defined(WOLFSSL_PUBLIC_MP) && \ ((defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \ defined(USE_FAST_MATH)) -WOLFSSL_TEST_SUBROUTINE int mp_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mp_test(void); #endif #if defined(WOLFSSL_PUBLIC_MP) && defined(WOLFSSL_KEY_GEN) -WOLFSSL_TEST_SUBROUTINE int prime_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t prime_test(void); #endif #if defined(ASN_BER_TO_DER) && \ (defined(WOLFSSL_TEST_CERT) || defined(OPENSSL_EXTRA) || \ defined(OPENSSL_EXTRA_X509_SMALL)) -WOLFSSL_TEST_SUBROUTINE int berder_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t berder_test(void); #endif -WOLFSSL_TEST_SUBROUTINE int logging_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t logging_test(void); #if !defined(NO_ASN) && !defined(NO_ASN_TIME) -WOLFSSL_TEST_SUBROUTINE int time_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t time_test(void); #endif #if defined(__INCLUDE_NUTTX_CONFIG_H) -WOLFSSL_TEST_SUBROUTINE int wolfcrypt_mutex_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t wolfcrypt_mutex_test(void); #else -WOLFSSL_TEST_SUBROUTINE int mutex_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mutex_test(void); #endif #if defined(USE_WOLFSSL_MEMORY) && !defined(FREERTOS) -WOLFSSL_TEST_SUBROUTINE int memcb_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t memcb_test(void); #endif #ifdef WOLFSSL_CAAM_BLOB -WOLFSSL_TEST_SUBROUTINE int blob_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blob_test(void); +#endif +#ifdef HAVE_ARIA +#include "wolfssl/wolfcrypt/port/aria/aria-crypt.h" +void printOutput(const char *strName, unsigned char *data, unsigned int dataSz); +WOLFSSL_TEST_SUBROUTINE int ariagcm_test(MC_ALGID); #endif #ifdef WOLF_CRYPTO_CB -WOLFSSL_TEST_SUBROUTINE int cryptocb_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cryptocb_test(void); #endif #ifdef WOLFSSL_CERT_PIV -WOLFSSL_TEST_SUBROUTINE int certpiv_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t certpiv_test(void); #endif #ifdef WOLFSSL_AES_SIV -WOLFSSL_TEST_SUBROUTINE int aes_siv_test(void); +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_siv_test(void); #endif +#if defined(WOLFSSL_AES_EAX) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_eax_test(void); +#endif /* WOLFSSL_AES_EAX */ + /* General big buffer size for many tests. */ #define FOURK_BUF 4096 +/* If not defined in user_settings, the ERROR_OUT pause is 120 seconds. */ +#ifndef WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION + #define WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION 120 +#endif +#if defined(WOLFSSL_ESPIDF_ERROR_PAUSE) + #if defined(CONFIG_FREERTOS_HZ) + #define WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION_TICKS \ + (WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION * CONFIG_FREERTOS_HZ) + #else + /* If not defined, assume RTOS is 1000 ticks per second. */ + #define WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION_TICKS \ + (WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION * 1000) + #endif + /* When defined, pause at error condition rather than exit with error. */ + #define ERROR_OUT(err, eLabel) \ + do { \ + ret = (err); \ + ESP_LOGE(ESPIDF_TAG, "Failed: Error = %d during %s, line %d", \ + err, __FUNCTION__, __LINE__); \ + ESP_LOGI(ESPIDF_TAG, "Extended system info:"); \ + esp_ShowExtendedSystemInfo(); \ + ESP_LOGW(ESPIDF_TAG, "Paused for %d seconds! " \ + "WOLFSSL_ESPIDF_ERROR_PAUSE is enabled.", \ + WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION); \ + vTaskDelay(WOLFSSL_ESPIDF_ERROR_PAUSE_DURATION_TICKS); \ + goto eLabel; \ + } while (0) +#else + #define ERROR_OUT(err, eLabel) do { ret = (err); goto eLabel; } while (0) +#endif -#define ERROR_OUT(err, eLabel) do { ret = (err); goto eLabel; } while (0) +/* Not all unexpected conditions are actually errors .*/ +#define WARNING_OUT(err, eLabel) do { ret = (err); goto eLabel; } while (0) -static void render_error_message(const char* msg, int es) +static void render_error_message(const char* msg, wc_test_ret_t es) { (void)msg; (void)es; @@ -699,7 +865,7 @@ #ifdef HAVE_STACK_SIZE static THREAD_RETURN err_sys(const char* msg, int es) #else -static int err_sys(const char* msg, int es) +static wc_test_ret_t err_sys(const char* msg, wc_test_ret_t es) #endif { render_error_message(msg, es); @@ -716,7 +882,7 @@ typedef struct func_args { int argc; char** argv; - int return_code; + wc_test_ret_t return_code; } func_args; #endif /* !HAVE_WOLFCRYPT_TEST_OPTIONS */ @@ -782,9 +948,343 @@ } #endif +#if defined(WC_KDF_NIST_SP_800_56C) +#define INIT_SP80056C_TEST_VECTOR(_z, _fixedInfo, _derivedKey, _hashType) \ + { \ + .z = (const byte*)_z, .zSz = sizeof(_z) - 1, \ + .fixedInfo = (const byte*)_fixedInfo, \ + .fixedInfoSz = sizeof(_fixedInfo) - 1, \ + .derivedKey = (const byte*)_derivedKey, \ + .derivedKeySz = sizeof(_derivedKey) - 1, .hashType = _hashType, \ + } + +#define SP800_56C_MAX_OUT 128 +static WOLFSSL_TEST_SUBROUTINE wc_test_ret_t nist_sp80056c_kdf_test(void) +{ + struct sp800_56c_test_vector { + const byte* z; + word32 zSz; + const byte* fixedInfo; + word32 fixedInfoSz; + const byte* derivedKey; + word32 derivedKeySz; + enum wc_HashType hashType; + }; + struct sp800_56c_test_vector* v; + byte output[SP800_56C_MAX_OUT]; + word32 i; + int ret; + /* vectors from + * https://csrc.nist.gov/projects/cryptographic-standards-and-guidelines/example-values + * + * (KeyManagement) */ + struct sp800_56c_test_vector vctors[] = { +#if !defined(NO_SHA) + /* SHA-1 */ + INIT_SP80056C_TEST_VECTOR( + "\xad\x42\x01\x82\x63\x3f\x85\x26\xbf\xe9\x54\xac\xda\x37\x6f\x05" + "\xe5\xff\x4f\x83\x7f\x54\xfe\xbe\x0f\xb1\x2a\x1b\x3b\xeb\xf2\x63" + "\xee\x21\x64\x13\xed\x06\xa8\x4a\x12\xeb\x51\x11\x59\xf1\x33\x7d", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x6f\xef\x44\x2f\xc1\x7a\x7e\x2b\x0c\x9d\xec\xe0\xe4\x7a\x57\x48" + "\xac\xb4\x6a\xf1\x98\xd7\x67\x47\x0f\x28\xa1\x04\xb5\x61\x30\xae" + "\xb0\x10\x09\xa4\x56\x82\xa5\xe1", + WC_HASH_TYPE_SHA), + INIT_SP80056C_TEST_VECTOR( + "\xae\x64\xab\x2b\x2b\x75\xa9\x4c\xf8\xef\x24\xda\x24\x56\xbd\x3a" + "\xa3\x6d\xb6\x14\x29\xea\x55\x21", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\xcc\x96\x5a\x52\xd0\x5c\x94\x9e\x52\xc0\x35\xfd\x03\x53\x0d\xb7" + "\xea\xa4\x08\x70\x2c\x9d\x35\x21\x1e\x67\x21\x54\x12\x45\x91\x51" + "\xba\x22\x62\xbd\x1e\x28\xe5\x6b", + WC_HASH_TYPE_SHA), + INIT_SP80056C_TEST_VECTOR( + "\x71\x5d\xc0\xea\x24\x6b\x46\x56\x63\xa8\x9c\xde\x04\x12\xc1\x92" + "\xe1\x9e\x58\xd5\xb0\xb6\x36\x6d\xa7\x89\xad\xbf\x44\x9a\x38\xaa" + "\x46\x69\xfe\x36\x30\xa2\x0f\x7f\xa3\x14\x9c\x9b\x4b\x0a\xb5\xcd" + "\x3e\x14\x18\x2b\x75\x04\xd5\xd2\x75\x2b\xf6\x58\x7a\xab\xc9\xf4" + "\xcb\x8f\xe5\x29\x23\x6a\xb8\x15\x36\xad\xd2\xbd\x25\xd6\xbf\x9d" + "\x5f\x1d\xf5\x76\x16\x5a\xa5\x5c\x24\x99\x61\xd8\xf8\x75\x00\xed" + "\x8d\xbf\xc5\xd2\x50\x53\x4c\x07\xd9\x9a\xc9\x17\xf9\x84\x60\x46" + "\xac\x5c\xb8\xa2\x98\x74\x26\x22\xd3\xc9\x86\x18\x06\x92\x46\xe8" + "\xad\x37\x11\x25\x57\xe0\xe6\x34\xb5\x81\x32\x7a\x4a\xd3\x2c\x7c" + "\x76\x4b\xe8\xf8\x08\x0d\x37\x2c\x63\x20\x93\xa7\x67\xf1\x55\xbd" + "\x22\xec\x00\x3c\xa6\x1c\x8b\x43\x32\x0f\x3a\xbe\xb5\xdd\xc4\xa3" + "\xb1\x89\x82\xfd\xd6\x51\x0f\x88\x3c\x8d\xc1\xe0\xb1\x57\xff\xb9" + "\xcf\xc0\xa5\x9c\xe2\xd4\x05\x5f\xfc\x73\xe7\x15\x2a\x6a\x95\x43" + "\xb9\x19\xe7\x94\xe9\x49\x61\x33\xbe\x2a\x23\x18\xd9\x05\x6e\xfd" + "\x74\x48\x2d\xc6\x3c\x0d\xb5\x8f\xe6\x42\x6b\x0f\xe7\x35\x45\x42" + "\xc2\x19\x7a\xb6\xbd\x35\xf1\xa9\x2d\xce\x90\xb1\xc4\x6d\x32\xc1", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x1b\x5f\xcc\x8d\x81\xa5\xd9\xa9\x36\x94\xe6\x47\x77\x88\xd8\x03" + "\x15\x84\xc3\xf5\x2e\x9f\x11\x7a\xe8\x18\x4d\xba\x56\x47\x9d\x87" + "\x66\x76\x92\xf1\x2d\x7b\xd3\x8b", + WC_HASH_TYPE_SHA), + INIT_SP80056C_TEST_VECTOR( + "\x33\xe0\x50\xbd\x20\x9f\x2d\xf2\x77\x19\x78\xfc\xd1\xd4\xc8\x2e" + "\x49\xd0\x1d\x65\xbb\x62\x03\x20\xd3\x0b\xfe\xa8\x7a\xa8\x69\xe1" + "\x07\xa5\x17\xa4\xc8\x5b\x69\x28\x45\x21\xca\x54\xb7\x7f\x59\xe9" + "\x4a\x85\x6d\xaa\x30\xa3\x85\xa5\x25\xd8\xa3\xf7\xe1\x5e\xe5\xe9" + "\xaa\x12\x8d\x45\xef\x63\xf9\x0c\x10\xe0\x8f\xc5\x26\x36\x13\x77" + "\x81\x54\x7a\x58\x9f\x97\x87\xf9\xd7\xdd\x61\x43\x41\x9a\x26\x16" + "\x80\x16\x82\x40\xaa\xb2\x01\x3d\x80\x20\xdb\xe8\x4b\x7e\x2b\xed" + "\xce\x67\x1b\x94\x03\xbd\x1f\x91\x71\xa2\x57\x90\xce\x66\x7d\xed", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x35\x10\x85\x85\xfc\x55\x62\xb5\xf1\x8f\x20\x7b\xa8\x35\x63\xe4" + "\x49\x28\x45\x6a\x5e\x53\x63\x7e\xae\x6b\xb5\xfc\x33\x88\xae\x02" + "\x91\x79\x0a\x1d\xc8\x31\x4e\x28", + WC_HASH_TYPE_SHA), + INIT_SP80056C_TEST_VECTOR( + "\x5c\x80\x4f\x45\x4d\x30\xd9\xc4\xdf\x85\x27\x1f\x93\x52\x8c\x91" + "\xdf\x6b\x48\xab\x5f\x80\xb3\xb5\x9c\xaa\xc1\xb2\x8f\x8a\xcb\xa9" + "\xcd\x3e\x39\xf3\xcb\x61\x45\x25\xd9\x52\x1d\x2e\x64\x4c\x53\xb8" + "\x07\xb8\x10\xf3\x40\x06\x2f\x25\x7d\x7d\x6f\xbf\xe8\xd5\xe8\xf0" + "\x72\xe9\xb6\xe9\xaf\xda\x94\x13\xea\xfb\x2e\x8b\x06\x99\xb1\xfb" + "\x5a\x0c\xac\xed\xde\xae\xad\x7e\x9c\xfb\xb3\x6a\xe2\xb4\x20\x83" + "\x5b\xd8\x3a\x19\xfb\x0b\x5e\x96\xbf\x8f\xa4\xd0\x9e\x34\x55\x25" + "\x16\x7e\xcd\x91\x55\x41\x6f\x46\xf4\x08\xed\x31\xb6\x3c\x6e\x6d", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\xfa\xa0\x22\xce\x7f\xa9\xba\x95\xeb\xa3\x9f\x3f\x44\xf3\xee\x14" + "\x96\x0a\x0b\x23\x9d\x01\x4b\x57\x70\xe4\x71\xd7\x5a\x99\xea\x87" + "\x10\xe3\x8f\x0c\xef\x0f\xfc\x67", + WC_HASH_TYPE_SHA), + INIT_SP80056C_TEST_VECTOR( + "\xad\x42\x01\x82\x63\x3f\x85\x26\xbf\xe9\x54\xac\xda\x37\x6f\x05" + "\xe5\xff\x4f\x83\x7f\x54\xfe\xbe\x0f\xb1\x2a\x1b\x3b\xeb\xf2\x63" + "\xee\x21\x64\x13\xed\x06\xa8\x4a\x12\xeb\x51\x11\x59\xf1\x33\x7d", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x6f\xef\x44\x2f\xc1\x7a\x7e\x2b\x0c\x9d\xec\xe0\xe4\x7a\x57\x48" + "\xac\xb4\x6a\xf1\x98\xd7\x67\x47\x0f\x28\xa1\x04\xb5\x61\x30\xae" + "\xb0\x10\x09\xa4\x56\x82\xa5\xe1", + WC_HASH_TYPE_SHA), +#endif +#if defined(WOLFSSL_SHA224) + /* SHA-224*/ + INIT_SP80056C_TEST_VECTOR( + "\x8c\x5d\x6e\x5d\x36\x06\x83\xba\x55\xb0\x9d\xb1\x69\x6d\x7c\x64" + "\x02\xff\x87\x88\x5f\xf5\x07\x70\xf2\x76\x7b\x75\x54\x60\x20\x7e" + "\xd5\xc7\x43\xfd\x27\xe7\xeb\x1d\x0c\xa5\x91\xf8\x56\x38\x93\x11" + "\x73\x07\x44\xf2\x04\xd2\xe5\x5b\x8b\xd4\x46\xce\xca\x03\x1f\x7b" + "\xac\xcf\xf1\xa7\x1b\x68\x34\x59\xcc\x54\xd5\x01\xda\xbf\x4a\x84" + "\xcd\xb8\x6d\xfa\xda\xff\x31\x0f\xbd\xba\xf7\x4d\xd5\x1b\xa1\xe1" + "\xe1\x19\x1a\xf1\x4c\x9b\xf8\x94\x43\xbf\x58\x8e\x9c\xe3\x30\x34" + "\xaf\x5e\x89\xbf\x6f\xfc\x47\xd7\xd9\xca\x4a\x5e\x8f\xf8\xa0\x50" + "\x20\xbb\x0f\x95\xbc\xde\x01\x56\xd8\x7f\xb8\x60\xbd\x40\x83\xfa" + "\x5b\x53\x1a\x08\xa4\xfb\x7e\xe0\x20\x1a\xe8\xb3\xcc\xff\xe9\x9f" + "\x27\x0b\xc3\x53\x4b\xaa\xcf\xc0\x01\xcd\xd8\x0a\xd8\x7c\xce\x71" + "\xf0\x91\xe7\x66\xca\x5c\xc2\x75\xcb\x49\x14\x5a\x5e\xe6\x16\x2e" + "\xcc\xf5\x58\xce\xc4\xd3\xee\x53\x1e\x91\xe9\xa5\x29\x69\x63\x4d" + "\x3a\xf8\xd2\x6f\x8d\x15\xdc\x0d\x6f\x6e\x0a\x97\x4b\xe4\x34\x1b" + "\x68\xa0\x19\x90\xdb\xb8\x64\x95\x89\x1a\xd3\xaf\xc1\xe4\xce\xdf" + "\x4c\x6a\xe1\xf1\xcd\x60\x81\xcd\xee\xd8\xe6\xb3\x26\x4e\xc3\xbe" + "\x24\x58\xd1\xc0\xca\x24\x43\x41\x0c\xf3\xb4\x7c\x0c\x25\x4c\x7d" + "\xc8\xec\xb4\x3e\x6c\x23\x64\xe1\xc0\x62\x19\xcc\x7e\xfb\xff\xbb" + "\x63\xd7\xff\xfc\x74\x58\x12\xfd\x24\x0c\x33\xd4\x96\xb9\x99\x2f" + "\x96\x80\xa6\x3c\x07\x96\x3c\x0c\x49\xf3\xc1\xba\xef\xec\xaf\x32" + "\xe2\xaa\x8a\x2f\x7c\xd3\x0d\x8f\x05\x1e\xe2\xf5\x0f\xbf\x05\xab" + "\x13\x96\xa4\xea\x87\x44\x7d\x7b\x98\x1b\x5e\x46\x14\x28\x18\x71" + "\xa6\xf0\xf6\xbf\x1f\xe0\x02\x2f\x7e\xa1\x32\xbe\x0a\xe9\x19\x26" + "\xab\x12\xaf\x6d\xc4\x50\x64\xaa\xd5\x6b\x84\xb9\x0c\x70\x08\x37" + "\x09\xcf\xf7\xe3\x1b\x54\x8f\xb7\xfb\x2c\xf7\x5a\xbf\x96\xe0\x1c" + "\xcd\x3e\x94\x2e\xed\x91\x48\x0d\x4c\x24\xc6\xb7\xf9\x79\xfb\xbe" + "\x5d\xa2\x39\xb3\x76\x16\x7d\x68\x57\x35\x24\xff\xcb\x50\x99\x54" + "\xcc\x80\xa0\xe1\xa7\x1c\x40\xc4\xda\x17\xb8\xd1\x57\x2b\x21\x58" + "\x7a\x8d\x66\xcc\x62\x1c\x7c\xd1\x0f\x49\xab\xd5\xef\x86\x31\x13" + "\xe6\x19\x21\x08\x6f\xac\x25\x31\x2b\x74\x1c\x11\xa8\xfb\xc1\xe3" + "\x3c\x34\xd9\xda\x14\xa8\x22\x47\x7f\xcc\x36\x66\x70\x25\xc4\xf1" + "\x30\xae\x10\x0e\x36\xf1\x5d\xa0\x03\x74\xce\x87\x41\x67\x9f\x61", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x4b\x99\x6a\x60\xc0\x4a\x35\xc5\xe6\xd4\x74\xb1\x0a\x25\x8d\x56" + "\x2e\xa6\xdc\x52\xf6\xc6\x9b\xf3\x9e\xf8\x8c\x89\xe3\xcc\x8a\x54" + "\xda\x2f\x3c\x0b\x56\x1b\x53\xfe\x76\x55\x13\x63\xd6\x9c\x3c\xef" + "\x74\xe3\x4f\xe8\x8e\xb3\xac\x51", + WC_HASH_TYPE_SHA224), + INIT_SP80056C_TEST_VECTOR( + "\x52\x27\x2f\x50\xf4\x6f\x4e\xdc\x91\x51\x56\x90\x92\xf4\x6d\xf2" + "\xd9\x6e\xcc\x3b\x6d\xc1\x71\x4a\x4e\xa9\x49\xfa\x9f\x18\xff\x54" + "\xf8\x87\x23\x07\x3f\x64\xa6\x95\x3d\x04\x91\x4f\x45\xa2\x3e\xee" + "\x7c\xfc\x46\x67\x08\x0a\xa0\xf9", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x77\x56\xbc\xfd\xef\x3e\xe6\x9f\x6a\xc2\x3c\xd2\xdc\x60\x7d\x01" + "\xfa\x8c\xe1\xb2\x4f\x5c\xaa\xaa\x48\xe0\x4b\x81\x63\xe1\x73\x3a" + "\xed\x7a\x04\x0e\x73\xf2\xb5\x42\x36\x8f\x00\x54\x8b\x16\x3c\x3d" + "\xc9\x6d\x70\x09\x99\x16\xf1\x6b", + WC_HASH_TYPE_SHA224), +#endif +#if !defined(NO_SHA256) + /* SHA-256 */ + INIT_SP80056C_TEST_VECTOR( + "\xdd\x0f\x53\x96\x21\x9d\x1e\xa3\x93\x31\x04\x12\xd1\x9a\x08\xf1" + "\xf5\x81\x1e\x9d\xc8\xec\x8e\xea\x7f\x80\xd2\x1c\x82\x0c\x27\x88" + "\x22\x76\x84\xe7\x1f\x5c\x31\x3f\xad\xc9\x1e\x52\x98\x07\xe3\x14" + "\x7d\x53\x14\x5b\x15\xab\xd6\xed\x41\x6a\xd3\x5c\xd7\xe6\x83\x8f", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\xc0\x8b\x3d\xe2\x4f\x1a\x38\x1e\x7a\x56\x75\xa2\xa6\x52\x3b\x08" + "\xf3\x54\x60\x5e\xee\x46\xb9\xf3\x9e\xad\xb1\xe9\x75\x34\x41\x6d" + "\x98\xb4\x3c\xae\x8a\xb0\x4a\xfd\x53\xde\xb3\x7f\x44\x02\x23\x52" + "\xc3\xfb\xde\x1e\x2f\x2c\xec\x53\x1c\xfc\x32\x4f\xdd\x0f\xcc\xa6", + WC_HASH_TYPE_SHA256), + INIT_SP80056C_TEST_VECTOR( + "\x44\xf4\x84\x09\xf3\x1b\xf3\x50\x94\x51\xdb\x4d\x30\x4b\xeb\xd8" + "\x3c\x2a\xd6\x50\x1c\x1b\x85\xe6\x32\xbc\x92\x58\x8e\x2d\x48\xb5" + "\xd2\xb8\x44\x44\x62\xad\x94\xe8\xa4\x44\x94\x1e\xd4\x97\x5c\x97" + "\x91\x17\xd7\x5a\x0a\x2b\xa8\x10\xdf\xa8\x80\x4a\x0f\xe9\x42\x6d" + "\xd7\xeb\x95\xf2\x9c\xa4\x30\xda\x37\xef\xa5\x2c\x42\xda\x1d\xe2" + "\x23\x76\x3b\xdd\xc9\x5e\x46\x6a\xa3\xb8\xd2\x06\xb8\x21\x8e\xdf" + "\x23\x97\x3d\x05\xf3\xc7\xc2\x2b\x22\x46\x53\xd4\xf9\x21\x85\x45" + "\x79\x83\x26\x2f\x27\xbc\x55\xa0\xa7\xae\xe5\x43\x54\x55\xd4\x3c" + "\x0e\x0c\x6d\x80\x67\xad\xaf\x90\x42\xb6\xb7\x77\x7e\x19\x8d\x67" + "\x60\x83\x0d\x96\xb2\x9a\x6a\xae\xf5\x74\xd7\x5e\x2d\x65\x43\x55" + "\x0f\x75\x55\xcf\x89\x82\xc8\x21\xc4\xec\x9b\x82\x66\x2b\x09\x36" + "\x69\xfd\x24\x6d\x4d\xcc\xbf\xf3\x1d\x98\x4e\xf6\x3c\x4f\x95\xd7" + "\x39\xc7\x7e\x66\xf6\x9b\x6d\xb0\xd9\xfc\x1a\x97\x3f\x52\x33\xd1" + "\x1f\xe7\x15\x4b\x8a\x6b\xe1\x50\x46\x7d\x92\xda\xf0\x91\x44\x34" + "\xf0\xcf\x17\x6e\x96\x1b\x31\x3f\xe3\xe2\x3b\xfe\x37\x8b\x87\xba" + "\xf2\x73\x93\x7f\xfa\xa6\x85\x65\x8b\x09\x78\x1d\x26\x97\x86\x4b" + "\x0d\x82\x48\x5c\xf7\xd6\x2f\xfc\xea\x34\x33\x88\xcf\xec\x15\x27" + "\x3a\x39\x4b\x84\x32\xee\xb6\x32\x1b\xe3\x1d\x4f\xcd\x16\x15\xc8" + "\x1c\x69\x37\xc0\x8d\x92\x41\x6e\xdb\xdd\x20\x10\xfa\x8b\x6e\x0a" + "\x8a\x60\x3d\xad\xe0\x10\xbc\x9c\xd7\x6b\x14\xe3\xe2\x19\x0e\x3b" + "\xa3\x00\xe7\x1a\xdd\xbf\x24\x4c\xf8\x06\x29\x49\x76\xea\xf0\x7d" + "\x02\x3b\xdb\x57\xfc\x5d\x19\x64\xc7\xd4\x20\x6e\x72\x06\x1b\xfe" + "\x1e\xe4\xee\xbc\x92\x00\xe1\x3a\x6c\xba\x32\x86\x9d\xbe\x80\x82" + "\xcd\xf3\x64\x5b\x5a\x72\x7d\xd2\x7c\xa5\x03\xf4\xed\xeb\x73\xe8" + "\x8a\x3a\x55\x2c\x7e\x00\xd4\xee\x72\x42\x13\x72\x36\xa0\x96\x5c" + "\x1e\xc3\xeb\xc0\xb4\x8c\x2b\x46\x7e\xb8\x42\x41\x5a\x28\x3f\x55" + "\xe2\x20\xff\xd1\x88\x19\x25\x6d\xa2\x47\x4d\x28\xfc\x3b\x04\xe0" + "\xc0\x7e\x4d\x25\xc1\x74\x93\x41\xd2\x22\x97\x01\x5c\xd8\x17\x8c" + "\x39\x18\xbe\x8c\x5c\xdf\x0f\xbf\xbb\x9a\x5a\xcc\xdd\x82\xaf\x07" + "\x83\xef\xe4\xdf\x64\xa8\xd8\x92\x82\x8f\x8d\xe5\x8c\x5d\x56\x9b" + "\x5b\x08\x45\x58\x96\xc4\xd3\xc3\x4f\xd3\xce\x93\xc4\x34\xc3\x8e" + "\xf5\x6c\xed\x30\x56\x1c\x37\x1a\xf9\xf2\xd8\x64\xfd\xc5\xb6\x2f", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x42\x35\xac\x89\xc9\xf3\x3e\x5d\xbb\x11\x60\x1a\x29\x83\xe3\x76" + "\xe2\x15\x39\x97\x87\xd8\x39\xa0\x38\x55\xfe\x04\x53\x3e\x1a\x67" + "\x66\x91\x5e\x67\xc2\x5e\xeb\x04\x08\x28\xe9\x6c\xd3\xd6\xef\x0a" + "\xb7\xd1\x7b\x43\x13\x43\xa7\xf3\xaa\xc6\x8f\x0c\x4a\x7e\x77\x9b", + WC_HASH_TYPE_SHA256), + /* slightly modified vector to test generation when derivedKeySz % + * hashOutSz != 0*/ + INIT_SP80056C_TEST_VECTOR( + "\xdd\x0f\x53\x96\x21\x9d\x1e\xa3\x93\x31\x04\x12\xd1\x9a\x08\xf1" + "\xf5\x81\x1e\x9d\xc8\xec\x8e\xea\x7f\x80\xd2\x1c\x82\x0c\x27\x88" + "\x22\x76\x84\xe7\x1f\x5c\x31\x3f\xad\xc9\x1e\x52\x98\x07\xe3\x14" + "\x7d\x53\x14\x5b\x15\xab\xd6\xed\x41\x6a\xd3\x5c\xd7\xe6\x83\x8f", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\xc0\x8b\x3d\xe2\x4f\x1a\x38\x1e\x7a\x56\x75\xa2\xa6\x52\x3b\x08" + "\xf3\x54\x60\x5e\xee\x46\xb9\xf3\x9e\xad\xb1\xe9\x75\x34\x41\x6d" + "\x98\xb4\x3c\xae\x8a\xb0\x4a\xfd\x53\xde\xb3\x7f\x44\x02\x23\x52" + "\xc3\xfb\xde\x1e\x2f\x2c\xec\x53\x1c\xfc\x32\x4f\xdd\x0f\xcc", + WC_HASH_TYPE_SHA256), + +#endif +#if defined(WOLFSSL_SHA384) + /* SHA-384 */ + INIT_SP80056C_TEST_VECTOR( + "\x5e\xa1\xfc\x4a\xf7\x25\x6d\x20\x55\x98\x1b\x11\x05\x75\xe0\xa8" + "\xca\xe5\x31\x60\x13\x7d\x90\x4c\x59\xd9\x26\xeb\x1b\x84\x56\xe4" + "\x27\xaa\x8a\x45\x40\x88\x4c\x37\xde\x15\x9a\x58\x02\x8a\xbc\x0e" + "\x88\x76\x9c\xb7\x2f\xc5\xac\x45\x7c\xd5\x8e\x89\x08\x9b\x19\x6a" + "\x70\xbf\x53\x3c\x6d\xc9\x1c\x9c\x7e\x17\x41\xdb\x5e\x7a\xb6\xb0" + "\x84\x9f\x01\xde\xa6\x5f\xed\xd0\x6c\x77\x18\x7c\xd8\x8e\xd0\x30", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x8e\x6e\x26\x5f\x20\x82\xf1\x4d\x34\xda\x23\xe1\x03\x2c\x90\x24" + "\x83\x4a\xf0\x15\x72\xb6\x64\x77\x82\x41\x1b\xdd\xcb\x84\xa5\xda" + "\xee\x11\x7b\xa6\xfb\xa6\xd0\xeb\x28\x08\xef\x8a\xb0\x70\x05\xee" + "\xab\xe5\x2d\x2e\xfd\x31\x12\x1c\x7b\xf9\xd5\xfa\xfc\x40\xe0\x0c" + "\x6d\x6d\xbf\x39\xef\x43\xfe\x97\x15\xc7\x20\x2c\xdc\x2d\xb7\xe8" + "\x2b\x88\xd7\x48\xeb\x84\x25\x8b\xf8\x4d\x85\x82\xf2\xbf\xd9\x40", + WC_HASH_TYPE_SHA384), +#endif +#if defined(WOLFSSL_SHA512) + /* SHA-512 */ + INIT_SP80056C_TEST_VECTOR( + "\x00\xcd\xea\x89\x62\x1c\xfa\x46\xb1\x32\xf9\xe4\xcf\xe2\x26\x1c" + "\xde\x2d\x43\x68\xeb\x56\x56\x63\x4c\x7c\xc9\x8c\x7a\x00\xcd\xe5" + "\x4e\xd1\x86\x6a\x0d\xd3\xe6\x12\x6c\x9d\x2f\x84\x5d\xaf\xf8\x2c" + "\xeb\x1d\xa0\x8f\x5d\x87\x52\x1b\xb0\xeb\xec\xa7\x79\x11\x16\x9c" + "\x20\xcc\x01\x38\xa6\x72\xb6\x95\x8b\xd7\x84\xe5\xd7\xfa\x83\x73" + "\x8a\xc6\x8f\x9b\x34\x23\xb4\x83\xf9\xbf\x53\x9e\x71\x14\x1e\x45" + "\xdb\xfb\x7a\xfe\xd1\x8b\x11\xc0\x02\x8b\x13\xf1\xf8\x60\xef\x43" + "\xc4\x80\xf4\xda\xcd\xa2\x08\x10\x59\xd3\x97\x8c\x99\x9d\x5d\x1a" + "\xde\x34\x54\xe4", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x2d\x4a\x46\xa1\x70\x99\xba\xa8\x33\x0b\xc5\x9d\x4a\x1c\xf5\xae" + "\x3a\x30\x75\xb4\xc6\x2b\xb2\x6e\x7f\xc9\x89\x24\x72\x6d\x27\x4c" + "\x09\x64\x6f\x44\x08\xe6\x85\x8c\x43\xb4\x2d\xae\xd0\x15\xef\x26" + "\x17\x08\xd5\x5e\xf2\x4d\xaa\x7d\x3e\xa3\xd1\xc4\xa0\x8c\xfd\x24" + "\xdb\x60\x00\xa5\xb8\xa6\x7d\xe7\x46\xf3\xd3\xf4\xff\x34\x85\x15" + "\x8f\xd3\xb6\x91\x55\x79\x1d\xf4\x67\x47\xd4\xdb\xbe\x17\xc4\xb5" + "\x58\x46\x2e\x26\xbe\x5e\xd3\x5f\xe6\x80\xe2\x97\x14\x22\xc3\xb0" + "\x1b\x17\xe1\x67\xfc\x43\x7f\x84\x86\x9d\x85\x49\x53\x7b\x33\x38", + WC_HASH_TYPE_SHA512), +#endif + INIT_SP80056C_TEST_VECTOR( + "\x00\xcd\xea\x89\x62\x1c\xfa\x46\xb1\x32\xf9\xe4\xcf\xe2\x26\x1c" + "\xde\x2d\x43\x68\xeb\x56\x56\x63\x4c\x7c\xc9\x8c\x7a\x00\xcd\xe5" + "\x4e\xd1\x86\x6a\x0d\xd3\xe6\x12\x6c\x9d\x2f\x84\x5d\xaf\xf8\x2c" + "\xeb\x1d\xa0\x8f\x5d\x87\x52\x1b\xb0\xeb\xec\xa7\x79\x11\x16\x9c" + "\x20\xcc\x01\x38\xa6\x72\xb6\x95\x8b\xd7\x84\xe5\xd7\xfa\x83\x73" + "\x8a\xc6\x8f\x9b\x34\x23\xb4\x83\xf9\xbf\x53\x9e\x71\x14\x1e\x45" + "\xdb\xfb\x7a\xfe\xd1\x8b\x11\xc0\x02\x8b\x13\xf1\xf8\x60\xef\x43" + "\xc4\x80\xf4\xda\xcd\xa2\x08\x10\x59\xd3\x97\x8c\x99\x9d\x5d\x1a" + "\xde\x34\x54\xe4", + "\x12\x34\x56\x78\x9a\xbc\xde\xf0\x41\x4c\x49\x43\x45\x31\x32\x33" + "\x42\x4f\x42\x42\x59\x34\x35\x36", + "\x2d\x4a", + WC_HASH_TYPE_SHA512), + + }; + + for (i = 0; i < sizeof(vctors) / sizeof(vctors[0]); i++) { + v = &vctors[i]; + ret = wc_KDA_KDF_onestep(v->z, v->zSz, v->fixedInfo, v->fixedInfoSz, + v->derivedKeySz, v->hashType, output, + /* use derivedKeySz to force the function to use a temporary buff + for the last block */ + v->derivedKeySz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(output, v->derivedKey, v->derivedKeySz) != 0) + return WC_TEST_RET_ENC_NC; + } + + /* negative tests */ + ret = wc_KDA_KDF_onestep(NULL, 0, (byte*)"fixed_info", + sizeof("fixed_info"), 16, WC_HASH_TYPE_SHA256, output, 16); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_NC; + ret = wc_KDA_KDF_onestep((byte*)"secret", sizeof("secret"), NULL, 1, 16, + WC_HASH_TYPE_SHA256, output, 16); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_NC; + + /* allow empty FixedInfo */ + ret = wc_KDA_KDF_onestep((byte*)"secret", sizeof("secret"), NULL, 0, 16, + WC_HASH_TYPE_SHA256, output, 16); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + return 0; +} +#endif /* WC_KDF_NIST_SP_800_56C */ + /* optional macro to add sleep between tests */ #ifndef TEST_SLEEP -#define TEST_SLEEP() +#define TEST_SLEEP() WC_DO_NOTHING #else #define TEST_PASS test_pass #include /* for var args */ @@ -800,7 +1300,7 @@ } #endif -/* set test pass output to printf if not overriden */ +/* set test pass output to printf if not overridden */ #ifndef TEST_PASS /* redirect to printf */ #define TEST_PASS(...) { \ @@ -822,11 +1322,11 @@ #ifdef HAVE_STACK_SIZE THREAD_RETURN WOLFSSL_THREAD wolfcrypt_test(void* args) #else -int wolfcrypt_test(void* args) +wc_test_ret_t wolfcrypt_test(void* args) #endif { - int ret; -#ifdef WOLFSSL_TRACK_MEMORY_VERBOSE + wc_test_ret_t ret; +#if defined(WOLFSSL_TRACK_MEMORY_VERBOSE) && !defined(WOLFSSL_STATIC_MEMORY) long heap_baselineAllocs, heap_baselineBytes; #endif #ifdef TEST_ALWAYS_RUN_TO_END @@ -834,15 +1334,23 @@ #endif STACK_SIZE_INIT(); -#ifdef WOLFSSL_TRACK_MEMORY_VERBOSE +#if defined(WOLFSSL_TRACK_MEMORY_VERBOSE) && !defined(WOLFSSL_STATIC_MEMORY) (void)wolfCrypt_heap_peakAllocs_checkpoint(); heap_baselineAllocs = wolfCrypt_heap_peakAllocs_checkpoint(); (void)wolfCrypt_heap_peakBytes_checkpoint(); heap_baselineBytes = wolfCrypt_heap_peakBytes_checkpoint(); #endif +#ifdef WC_RNG_SEED_CB + wc_SetSeed_Cb(wc_GenerateSeed); +#endif + printf("------------------------------------------------------------------------------\n"); printf(" wolfSSL version %s\n", LIBWOLFSSL_VERSION_STRING); +#ifdef WOLF_CRYPTO_CB + if (devId != INVALID_DEVID) + printf(" CryptoCB with DevID:%X\n", devId); +#endif printf("------------------------------------------------------------------------------\n"); if (args) { @@ -891,6 +1399,9 @@ printf("unable to load static memory.\n"); return(EXIT_FAILURE); } + #ifndef OPENSSL_EXTRA + wolfSSL_SetGlobalHeapHint(HEAP_HINT); + #endif #endif #if defined(DEBUG_WOLFSSL) && !defined(HAVE_VALGRIND) @@ -903,6 +1414,10 @@ #if defined(HAVE_FIPS) && !defined(WOLFSSL_LINUXKM) wolfCrypt_SetCb_fips(myFipsCb); + #if FIPS_VERSION3_GE(6,0,0) + printf("FIPS module version in use: %s\n", + wolfCrypt_GetVersion_fips()); + #endif #endif #if !defined(NO_BIG_INT) @@ -947,6 +1462,12 @@ printf("Couldn't init the Cavium Octeon\n"); } #endif +#ifdef HAVE_RENESAS_SYNC + devId = wc_CryptoCb_CryptInitRenesasCmn(NULL, &guser_PKCbInfo); + if (devId == INVALID_DEVID) { + printf("Couldn't get the Renesas device ID\n"); + } +#endif #endif #if defined(WOLF_CRYPTO_CB) && !defined(HAVE_HASHDRBG) && \ @@ -1101,6 +1622,13 @@ TEST_PASS("SHAKE256 test passed!\n"); #endif +#ifdef WOLFSSL_SM3 + if ( (ret = sm3_test()) != 0) + return err_sys("SM-3 test failed!\n", ret); + else + TEST_PASS("SM-3 test passed!\n"); +#endif + #ifndef NO_HASH_WRAPPER if ( (ret = hash_test()) != 0) TEST_FAIL("Hash test failed!\n", ret); @@ -1200,6 +1728,28 @@ PRIVATE_KEY_LOCK(); #endif /* WOLFSSL_WOLFSSH */ +#if defined(WOLFSSL_HAVE_PRF) && !defined(NO_HMAC) && defined(WOLFSSL_SHA384) + PRIVATE_KEY_UNLOCK(); + if ( (ret = prf_test()) != 0) + TEST_FAIL("PRF test failed!\n", ret); + else + TEST_PASS("PRF test passed!\n"); + PRIVATE_KEY_LOCK(); +#endif + +#ifdef WOLFSSL_HAVE_PRF +#if defined (HAVE_HKDF) && !defined(NO_HMAC) +#ifdef WOLFSSL_BASE16 + PRIVATE_KEY_UNLOCK(); + if ( (ret = tls12_kdf_test()) != 0) + TEST_FAIL("TLSv1.2 KDF test failed!\n", ret); + else + TEST_PASS("TLSv1.2 KDF test passed!\n"); + PRIVATE_KEY_LOCK(); +#endif /* WOLFSSL_BASE16 */ +#endif /* WOLFSSL_HAVE_HKDF && !NO_HMAC */ +#endif /* WOLFSSL_HAVE_PRF */ + #ifdef WOLFSSL_TLS13 PRIVATE_KEY_UNLOCK(); if ( (ret = tls13_kdf_test()) != 0) @@ -1223,8 +1773,25 @@ TEST_PASS("HPKE test passed!\n"); #endif +#if defined(WC_SRTP_KDF) + PRIVATE_KEY_UNLOCK(); + if ( (ret = srtpkdf_test()) != 0) + TEST_FAIL("SRTP KDF test failed!\n", ret); + else + TEST_PASS("SRTP KDF test passed!\n"); + PRIVATE_KEY_LOCK(); +#endif + +#if defined(WC_KDF_NIST_SP_800_56C) + if ( (ret = nist_sp80056c_kdf_test()) != 0) + TEST_FAIL("NIST SP 800-56C KDF test failed!\n", ret); + else + TEST_PASS("NIST SP 800-56C KDF test passed!\n"); +#endif + #if defined(HAVE_AESGCM) && defined(WOLFSSL_AES_128) && \ - !defined(WOLFSSL_AFALG_XILINX_AES) && !defined(WOLFSSL_XILINX_CRYPT) + !defined(WOLFSSL_AFALG_XILINX_AES) && !defined(WOLFSSL_XILINX_CRYPT) && \ + !defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) if ( (ret = gmac_test()) != 0) TEST_FAIL("GMAC test failed!\n", ret); else @@ -1300,14 +1867,15 @@ else TEST_PASS("AES test passed!\n"); -#ifdef WOLFSSL_AES_192 +#if defined(WOLFSSL_AES_192) && \ + !defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) if ( (ret = aes192_test()) != 0) TEST_FAIL("AES192 test failed!\n", ret); else TEST_PASS("AES192 test passed!\n"); #endif -#ifdef WOLFSSL_AES_256 +#if defined(WOLFSSL_AES_256) if ( (ret = aes256_test()) != 0) TEST_FAIL("AES256 test failed!\n", ret); else @@ -1318,7 +1886,7 @@ if ( (ret = aesofb_test()) != 0) TEST_FAIL("AES-OFB test failed!\n", ret); else - TEST_PASS("AESOFB test passed!\n"); + TEST_PASS("AES-OFB test passed!\n"); #endif #ifdef HAVE_AESGCM @@ -1327,6 +1895,7 @@ TEST_FAIL("AES-GCM test failed!\n", ret); #endif #if !defined(WOLFSSL_AFALG_XILINX_AES) && !defined(WOLFSSL_XILINX_CRYPT) && \ + !defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) && \ !defined(WOLFSSL_KCAPI_AES) && !(defined(WOLF_CRYPTO_CB) && \ (defined(HAVE_INTEL_QA_SYNC) || defined(HAVE_CAVIUM_OCTEON_SYNC))) if ((ret = aesgcm_default_test()) != 0) { @@ -1344,6 +1913,21 @@ else TEST_PASS("AES-CCM test passed!\n"); #endif + +#ifdef WOLFSSL_AES_CFB + if ( (ret = aes_cfb_test()) != 0) + TEST_FAIL("AES-CFB test failed!\n", ret); + else + TEST_PASS("AES-CFB test passed!\n"); +#endif + +#ifdef WOLFSSL_AES_XTS + if ( (ret = aes_xts_test()) != 0) + TEST_FAIL("AES-XTS test failed!\n", ret); + else + TEST_PASS("AES-XTS test passed!\n"); +#endif + #ifdef HAVE_AES_KEYWRAP if ( (ret = aeskeywrap_test()) != 0) TEST_FAIL("AES Key Wrap test failed!\n", ret); @@ -1358,6 +1942,31 @@ #endif #endif +#if defined(WOLFSSL_AES_EAX) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + if ( (ret = aes_eax_test()) != 0) + TEST_FAIL("AES-EAX test failed!\n", ret); + else + TEST_PASS("AES-EAX test passed!\n"); +#endif /* WOLFSSL_AES_EAX */ + +#ifdef HAVE_ARIA + if ( (ret = ariagcm_test(MC_ALGID_ARIA_128BITKEY)) != 0) + TEST_FAIL("ARIA128 test failed!\n", ret); + else + TEST_PASS("ARIA128 test passed!\n"); + + if ( (ret = ariagcm_test(MC_ALGID_ARIA_192BITKEY)) != 0) + TEST_FAIL("ARIA192 test failed!\n", ret); + else + TEST_PASS("ARIA192 test passed!\n"); + + if ( (ret = ariagcm_test(MC_ALGID_ARIA_256BITKEY)) != 0) + TEST_FAIL("ARIA256 test failed!\n", ret); + else + TEST_PASS("ARIA256 test passed!\n"); +#endif + #ifdef HAVE_CAMELLIA if ( (ret = camellia_test()) != 0) TEST_FAIL("CAMELLIA test failed!\n", ret); @@ -1365,7 +1974,14 @@ TEST_PASS("CAMELLIA test passed!\n"); #endif -#if !defined(NO_RSA) +#ifdef WOLFSSL_SM4 + if ( (ret = sm4_test()) != 0) + return err_sys("SM-4 test failed!\n", ret); + else + TEST_PASS("SM-4 test passed!\n"); +#endif + +#if !defined(NO_RSA) && !defined(HAVE_RENESAS_SYNC) #ifdef WC_RSA_NO_PADDING if ( (ret = rsa_no_pad_test()) != 0) TEST_FAIL("RSA NOPAD test failed!\n", ret); @@ -1402,10 +2018,22 @@ #endif #ifndef NO_PWDBASED + PRIVATE_KEY_UNLOCK(); if ( (ret = pwdbased_test()) != 0) TEST_FAIL("PWDBASED test failed!\n", ret); else TEST_PASS("PWDBASED test passed!\n"); + PRIVATE_KEY_LOCK(); +#endif + +#if defined(USE_CERT_BUFFERS_2048) && \ + defined(HAVE_PKCS12) && \ + !defined(NO_ASN) && !defined(NO_PWDBASED) && !defined(NO_HMAC) && \ + !defined(NO_CERTS) && !defined(NO_DES3) + if ( (ret = pkcs12_test()) != 0) + TEST_FAIL("PKCS12 test failed!\n", ret); + else + TEST_PASS("PKCS12 test passed!\n"); #endif #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) @@ -1495,10 +2123,12 @@ #endif #ifdef HAVE_ED25519 + PRIVATE_KEY_UNLOCK(); if ( (ret = ed25519_test()) != 0) TEST_FAIL("ED25519 test failed!\n", ret); else TEST_PASS("ED25519 test passed!\n"); + PRIVATE_KEY_LOCK(); #endif #ifdef HAVE_CURVE448 @@ -1509,10 +2139,12 @@ #endif #ifdef HAVE_ED448 + PRIVATE_KEY_UNLOCK(); if ( (ret = ed448_test()) != 0) TEST_FAIL("ED448 test failed!\n", ret); else TEST_PASS("ED448 test passed!\n"); + PRIVATE_KEY_LOCK(); #endif #ifdef WOLFSSL_HAVE_KYBER @@ -1522,6 +2154,48 @@ TEST_PASS("KYBER test passed!\n"); #endif +#ifdef HAVE_DILITHIUM + if ( (ret = dilithium_test()) != 0) + TEST_FAIL("DILITHIUM test failed!\n", ret); + else + TEST_PASS("DILITHIUM test passed!\n"); +#endif + +#if defined(WOLFSSL_HAVE_XMSS) + #if !defined(WOLFSSL_SMALL_STACK) && WOLFSSL_XMSS_MIN_HEIGHT <= 10 + if ( (ret = xmss_test_verify_only()) != 0) + TEST_FAIL("XMSS Vfy test failed!\n", ret); + else + TEST_PASS("XMSS Vfy test passed!\n"); + #endif + + #if !defined(WOLFSSL_XMSS_VERIFY_ONLY) + if ( (ret = xmss_test()) != 0) + TEST_FAIL("XMSS test failed!\n", ret); + else + TEST_PASS("XMSS test passed!\n"); + #endif +#endif /* if defined(WOLFSSL_HAVE_XMSS) */ + +#if defined(WOLFSSL_HAVE_LMS) + #if !defined(WOLFSSL_SMALL_STACK) + #if (defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)) || \ + defined(HAVE_LIBLMS) + if ( (ret = lms_test_verify_only()) != 0) + TEST_FAIL("LMS Vfy test failed!\n", ret); + else + TEST_PASS("LMS Vfy test passed!\n"); + #endif + #endif + + #if !defined(WOLFSSL_LMS_VERIFY_ONLY) + if ( (ret = lms_test()) != 0) + TEST_FAIL("LMS test failed!\n", ret); + else + TEST_PASS("LMS test passed!\n"); + #endif +#endif /* if defined(WOLFSSL_HAVE_LMS) */ + #ifdef WOLFCRYPT_HAVE_ECCSI if ( (ret = eccsi_test()) != 0) TEST_FAIL("ECCSI test failed!\n", ret); @@ -1619,9 +2293,9 @@ #if !defined(NO_ASN) && !defined(NO_ASN_TIME) if ( (ret = time_test()) != 0) - TEST_FAIL("time test failed!\n", ret); + TEST_FAIL("time test failed!\n", ret); else - TEST_PASS("time test passed!\n"); + TEST_PASS("time test passed!\n"); #endif #if defined(__INCLUDE_NUTTX_CONFIG_H) @@ -1649,7 +2323,7 @@ #if defined(WOLF_CRYPTO_CB) && \ !(defined(HAVE_INTEL_QAT_SYNC) || defined(HAVE_CAVIUM_OCTEON_SYNC) || \ - defined(WOLFSSL_QNX_CAAM)) + defined(WOLFSSL_QNX_CAAM) || defined(HAVE_RENESAS_SYNC)) if ( (ret = cryptocb_test()) != 0) TEST_FAIL("crypto callback test failed!\n", ret); else @@ -1689,10 +2363,20 @@ if (args) ((func_args*)args)->return_code = ret; +/* If hardware acceleration and respective metrics tracked, show results: */ +#ifdef WOLFSSL_HW_METRICS + #if defined(WOLFSSL_ESP32_CRYPT_RSA_PRI) && defined(WOLFSSL_HW_METRICS) + esp_hw_show_mp_metrics(); + #endif +#endif + +#if defined(WOLFSSL_STATIC_MEMORY) && !defined(OPENSSL_EXTRA) + wolfSSL_SetGlobalHeapHint(NULL); +#endif TEST_PASS("Test complete\n"); EXIT_TEST(ret); -} +} /* end of wolfcrypt_test() */ #ifndef NO_MAIN_DRIVER @@ -1703,20 +2387,20 @@ /* so overall tests can pull in test function */ #if defined(WOLFSSL_ESPIDF) || defined(_WIN32_WCE) - int wolf_test_task(void) + wc_test_ret_t wolf_test_task(void) #else #ifndef NO_MAIN_FUNCTION int main(int argc, char** argv) { - return wolfcrypt_test_main(argc, argv); + return (int)wolfcrypt_test_main(argc, argv); } #endif - int wolfcrypt_test_main(int argc, char** argv) + wc_test_ret_t wolfcrypt_test_main(int argc, char** argv) #endif { - int ret; - func_args args; + wc_test_ret_t ret; + func_args args = { 0, 0, 0 }; #if defined(WOLFSSL_ESPIDF) || defined(WOLFSSL_SE050) /* set dummy wallclock time. */ struct timeval utctime; @@ -1729,7 +2413,7 @@ #endif #ifdef WOLFSSL_APACHE_MYNEWT #ifdef ARCH_sim - mcu_sim_parse_args(argc, argv); + mcu_sim_parse_args(argc, argv); #endif sysinit(); @@ -1782,26 +2466,22 @@ args.argv = argv; #endif if ((ret = wolfCrypt_Init()) != 0) { - printf("wolfCrypt_Init failed %d\n", ret); + printf("wolfCrypt_Init failed %d\n", (int)ret); err_sys("Error with wolfCrypt_Init!\n", WC_TEST_RET_ENC_EC(ret)); } - #ifdef HAVE_WC_INTROSPECTION +#ifdef HAVE_WC_INTROSPECTION printf("Math: %s\n", wc_GetMathInfo()); - #endif - -#ifdef WC_RNG_SEED_CB - wc_SetSeed_Cb(wc_GenerateSeed); #endif - #ifdef HAVE_STACK_SIZE +#ifdef HAVE_STACK_SIZE StackSizeCheck(&args, wolfcrypt_test); - #else +#else wolfcrypt_test(&args); - #endif +#endif if ((ret = wolfCrypt_Cleanup()) != 0) { - printf("wolfCrypt_Cleanup failed %d\n", ret); + printf("wolfCrypt_Cleanup failed %d\n", (int)ret); err_sys("Error with wolfCrypt_Cleanup!\n", WC_TEST_RET_ENC_EC(ret)); } @@ -1818,15 +2498,13 @@ while (1); #endif -#ifdef WOLFSSL_ESPIDF +#if defined(WOLFSSL_ESPIDF) /* ESP_LOGI to print takes up a lot less memory than printf */ - ESP_LOGI("wolfcrypt_test", "Exiting main with return code: % d\n", args.return_code); -#endif - -/* everything else will use printf */ -#if !defined(WOLFSSL_ESPIDF) -/* gate this for target platforms wishing to avoid printf reference */ - printf("Exiting main with return code: %d\n", args.return_code); + ESP_LOGI(ESPIDF_TAG, "Exiting main with return code: % d\n", + args.return_code); +#else + /* gate this for target platforms wishing to avoid printf reference */ + printf("Exiting main with return code: %ld\n", (long int)args.return_code); #endif return args.return_code; @@ -1845,18 +2523,18 @@ #define SaveDerAndPem(d, dSz, fD, fP, pT) _SaveDerAndPem(d, dSz, NULL, NULL, pT, WC_TEST_RET_LN) #endif -static int _SaveDerAndPem(const byte* der, int derSz, +static wc_test_ret_t _SaveDerAndPem(const byte* der, int derSz, const char* fileDer, const char* filePem, int pemType, int calling_line) { #if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES) - int ret; + wc_test_ret_t ret; XFILE derFile; derFile = XFOPEN(fileDer, "wb"); if (!derFile) { return WC_TEST_RET_ENC(calling_line, 0, WC_TEST_RET_TAG_I); } - ret = (int)XFWRITE(der, 1, derSz, derFile); + ret = (int)XFWRITE(der, 1, (size_t)derSz, derFile); XFCLOSE(derFile); if (ret != derSz) { return WC_TEST_RET_ENC(calling_line, 1, WC_TEST_RET_TAG_I); @@ -1868,20 +2546,29 @@ #if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES) XFILE pemFile; #endif + #ifndef WOLFSSL_NO_MALLOC byte* pem; + #else + byte pem[1024]; + #endif int pemSz; /* calculate PEM size */ - pemSz = wc_DerToPem(der, derSz, NULL, 0, pemType); + pemSz = wc_DerToPem(der, (word32)derSz, NULL, 0, pemType); if (pemSz < 0) { return WC_TEST_RET_ENC(calling_line, 2, WC_TEST_RET_TAG_I); } + #ifndef WOLFSSL_NO_MALLOC pem = (byte*)XMALLOC(pemSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (pem == NULL) { return WC_TEST_RET_ENC(calling_line, 3, WC_TEST_RET_TAG_I); } + #else + if (pemSz > (int)sizeof(pem)) + return BAD_FUNC_ARG; + #endif /* Convert to PEM */ - pemSz = wc_DerToPem(der, derSz, pem, pemSz, pemType); + pemSz = wc_DerToPem(der, (word32)derSz, pem, pemSz, pemType); if (pemSz < 0) { XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); return WC_TEST_RET_ENC(calling_line, 4, WC_TEST_RET_TAG_I); @@ -1892,7 +2579,7 @@ XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); return WC_TEST_RET_ENC(calling_line, 5, WC_TEST_RET_TAG_I); } - ret = (int)XFWRITE(pem, 1, pemSz, pemFile); + ret = (int)XFWRITE(pem, 1, (size_t)pemSz, pemFile); XFCLOSE(pemFile); if (ret != pemSz) { XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -1915,7 +2602,7 @@ } #endif /* WOLFSSL_KEY_GEN || WOLFSSL_CERT_GEN */ -WOLFSSL_TEST_SUBROUTINE int error_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t error_test(void) { const char* errStr; char out[WOLFSSL_MAX_ERROR_SZ]; @@ -1925,6 +2612,7 @@ /* Ensure a valid error code's string matches an invalid code's. * The string is that error strings are not available. */ + WOLFSSL_ENTER("error_test NO_ERROR_STRINGS"); errStr = wc_GetErrorString(OPEN_RAN_E); wc_ErrorString(OPEN_RAN_E, out); if (XSTRCMP(errStr, unknownStr) != 0) @@ -1935,9 +2623,7 @@ int i; int j = 0; /* Values that are not or no longer error codes. */ - int missing[] = { -122, -123, -124, -127, -128, -129, -159, - -163, -164, -165, -166, -167, -168, -169, -233, - 0 }; + int missing[] = { -124, -166, -167, -168, -169, 0 }; /* Check that all errors have a string and it's the same through the two * APIs. Check that the values that are not errors map to the unknown @@ -1948,14 +2634,22 @@ wc_ErrorString(i, out); if (i != missing[j]) { - if (XSTRCMP(errStr, unknownStr) == 0) + if (XSTRCMP(errStr, unknownStr) == 0) { + WOLFSSL_MSG("errStr unknown"); return WC_TEST_RET_ENC_NC; - if (XSTRCMP(out, unknownStr) == 0) + } + if (XSTRCMP(out, unknownStr) == 0) { + WOLFSSL_MSG("out unknown"); return WC_TEST_RET_ENC_NC; - if (XSTRCMP(errStr, out) != 0) + } + if (XSTRCMP(errStr, out) != 0) { + WOLFSSL_MSG("errStr does not match output"); return WC_TEST_RET_ENC_NC; - if (XSTRLEN(errStr) >= WOLFSSL_MAX_ERROR_SZ) + } + if (XSTRLEN(errStr) >= WOLFSSL_MAX_ERROR_SZ) { + WOLFSSL_MSG("errStr too long"); return WC_TEST_RET_ENC_NC; + } } else { j++; @@ -1980,9 +2674,9 @@ #ifndef NO_CODING -WOLFSSL_TEST_SUBROUTINE int base64_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t base64_test(void) { - int ret; + wc_test_ret_t ret; WOLFSSL_SMALL_STACK_STATIC const byte good[] = "A+Gd\0\0\0"; WOLFSSL_SMALL_STACK_STATIC const byte goodEnd[] = "A+Gd \r\n"; WOLFSSL_SMALL_STACK_STATIC const byte good_spaces[] = " A + G d \0"; @@ -2005,6 +2699,7 @@ "0123456789+/;"; byte charTest[] = "A+Gd\0\0\0"; int i; + WOLFSSL_ENTER("base64_test"); /* Good Base64 encodings. */ outLen = sizeof(out); @@ -2127,15 +2822,16 @@ } #ifdef WOLFSSL_BASE16 -WOLFSSL_TEST_SUBROUTINE int base16_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t base16_test(void) { - int ret; + wc_test_ret_t ret; WOLFSSL_SMALL_STACK_STATIC const byte testData[] = "SomeDataToEncode\n"; WOLFSSL_SMALL_STACK_STATIC const byte encodedTestData[] = "536F6D6544617461546F456E636F64650A00"; byte encoded[40]; word32 encodedLen; byte plain[40]; word32 len; + WOLFSSL_ENTER("base16_test"); /* length returned includes null termination */ encodedLen = sizeof(encoded); @@ -2166,12 +2862,14 @@ #endif /* !NO_CODING */ #ifndef NO_ASN -WOLFSSL_TEST_SUBROUTINE int asn_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t asn_test(void) { - int ret; + wc_test_ret_t ret; /* ASN1 encoded date buffer */ - WOLFSSL_SMALL_STACK_STATIC const byte dateBuf[] = {0x17, 0x0d, 0x31, 0x36, 0x30, 0x38, 0x31, 0x31, - 0x32, 0x30, 0x30, 0x37, 0x33, 0x37, 0x5a}; + WOLFSSL_SMALL_STACK_STATIC const byte dateBuf[] = { + 0x17, 0x0d, 0x31, 0x36, 0x30, 0x38, 0x31, 0x31, + 0x32, 0x30, 0x30, 0x37, 0x33, 0x37, 0x5a + }; byte format; int length; const byte* datePart; @@ -2179,6 +2877,7 @@ struct tm timearg; time_t now; #endif + WOLFSSL_ENTER("asn_test"); ret = wc_GetDateInfo(dateBuf, (int)sizeof(dateBuf), &datePart, &format, &length); @@ -2211,15 +2910,16 @@ #endif /* !NO_ASN */ #ifdef WOLFSSL_MD2 -WOLFSSL_TEST_SUBROUTINE int md2_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t md2_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; Md2 md2; byte hash[MD2_DIGEST_SIZE]; testVector a, b, c, d, e, f, g; testVector test_md2[7]; int times = sizeof(test_md2) / sizeof(testVector), i; + WOLFSSL_ENTER("md2_test"); a.input = ""; a.output = "\x83\x50\xe5\xa3\xe2\x4c\x15\x3d\xf2\x27\x5c\x9f\x80\x69" @@ -2299,15 +2999,16 @@ #endif #ifndef NO_MD5 -WOLFSSL_TEST_SUBROUTINE int md5_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t md5_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; wc_Md5 md5, md5Copy; byte hash[WC_MD5_DIGEST_SIZE]; byte hashcopy[WC_MD5_DIGEST_SIZE]; testVector a, b, c, d, e, f; testVector test_md5[6]; int times = sizeof(test_md5) / sizeof(testVector), i; + WOLFSSL_ENTER("md5_test"); a.input = ""; a.output = "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42" @@ -2429,7 +3130,7 @@ #ifndef NO_MD4 -WOLFSSL_TEST_SUBROUTINE int md4_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t md4_test(void) { Md4 md4; byte hash[MD4_DIGEST_SIZE]; @@ -2437,6 +3138,7 @@ testVector a, b, c, d, e, f, g; testVector test_md4[7]; int times = sizeof(test_md4) / sizeof(testVector), i; + WOLFSSL_ENTER("md4_test"); a.input = ""; a.output = "\x31\xd6\xcf\xe0\xd1\x6a\xe9\x31\xb7\x3c\x59\xd7\xe0\xc0\x89" @@ -2507,15 +3209,16 @@ #ifndef NO_SHA -WOLFSSL_TEST_SUBROUTINE int sha_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; wc_Sha sha, shaCopy; byte hash[WC_SHA_DIGEST_SIZE]; byte hashcopy[WC_SHA_DIGEST_SIZE]; testVector a, b, c, d, e; testVector test_sha[5]; int times = sizeof(test_sha) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sha_test"); a.input = ""; a.output = "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18" @@ -2637,15 +3340,16 @@ #endif /* NO_SHA */ #ifdef WOLFSSL_RIPEMD -WOLFSSL_TEST_SUBROUTINE int ripemd_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ripemd_test(void) { RipeMd ripemd; - int ret; + wc_test_ret_t ret; byte hash[RIPEMD_DIGEST_SIZE]; testVector a, b, c, d; testVector test_ripemd[4]; int times = sizeof(test_ripemd) / sizeof(struct testVector), i; + WOLFSSL_ENTER("ripemd_test"); a.input = "abc"; a.output = "\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04\x4a\x8e\x98\xc6" @@ -2744,12 +3448,13 @@ -WOLFSSL_TEST_SUBROUTINE int blake2b_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blake2b_test(void) { Blake2b b2b; byte digest[64]; byte input[64]; int i, ret; + WOLFSSL_ENTER("blake2b_test"); for (i = 0; i < (int)sizeof(input); i++) input[i] = (byte)i; @@ -2759,7 +3464,7 @@ if (ret != 0) return WC_TEST_RET_ENC_I(i); - ret = wc_Blake2bUpdate(&b2b, input, i); + ret = wc_Blake2bUpdate(&b2b, input, (word32)i); if (ret != 0) return WC_TEST_RET_ENC_I(i); @@ -2805,12 +3510,13 @@ -WOLFSSL_TEST_SUBROUTINE int blake2s_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blake2s_test(void) { Blake2s b2s; byte digest[32]; byte input[64]; int i, ret; + WOLFSSL_ENTER("blake2s_test"); for (i = 0; i < (int)sizeof(input); i++) input[i] = (byte)i; @@ -2820,7 +3526,7 @@ if (ret != 0) return WC_TEST_RET_ENC_I(i); - ret = wc_Blake2sUpdate(&b2s, input, i); + ret = wc_Blake2sUpdate(&b2s, input, (word32)i); if (ret != 0) return WC_TEST_RET_ENC_I(i); @@ -2839,16 +3545,17 @@ #ifdef WOLFSSL_SHA224 -WOLFSSL_TEST_SUBROUTINE int sha224_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha224_test(void) { wc_Sha224 sha, shaCopy; byte hash[WC_SHA224_DIGEST_SIZE]; byte hashcopy[WC_SHA224_DIGEST_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; testVector a, b, c; testVector test_sha[3]; int times = sizeof(test_sha) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sha224_test"); a.input = ""; a.output = "\xd1\x4a\x02\x8c\x2a\x3a\x2b\xc9\x47\x61\x02\xbb\x28\x82\x34" @@ -2913,16 +3620,32 @@ #ifndef NO_SHA256 -WOLFSSL_TEST_SUBROUTINE int sha256_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha256_test(void) { wc_Sha256 sha, shaCopy; byte hash[WC_SHA256_DIGEST_SIZE]; byte hashcopy[WC_SHA256_DIGEST_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; + + testVector a, b, c, d; + testVector test_sha[4]; +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + byte i_hash[WC_SHA256_DIGEST_SIZE]; + byte i_hashcopy[WC_SHA256_DIGEST_SIZE]; + testVector interleave_test_sha[4]; + wc_Sha256 i_sha, i_shaCopy; +#endif +#ifndef NO_LARGE_HASH_TEST +#define LARGE_HASH_TEST_INPUT_SZ 1024 +#ifdef WOLFSSL_SMALL_STACK + byte *large_input = NULL; +#else + byte large_input[LARGE_HASH_TEST_INPUT_SZ]; +#endif +#endif - testVector a, b, c; - testVector test_sha[3]; int times = sizeof(test_sha) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sha256_test"); a.input = ""; a.output = "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9" @@ -2945,18 +3668,49 @@ c.inLen = XSTRLEN(c.input); c.outLen = WC_SHA256_DIGEST_SIZE; + d.input = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + "aaaaaa"; /* this is BLOCKSIZE length */ + d.output = "\xFF\xE0\x54\xFE\x7A\xE0\xCB\x6D\xC6\x5C\x3A\xF9\xB6\x1D\x52" + "\x09\xF4\x39\x85\x1D\xB4\x3D\x0B\xA5\x99\x73\x37\xDF\x15\x46" + "\x68\xEB"; + d.inLen = XSTRLEN(d.input); + d.outLen = WC_SHA256_DIGEST_SIZE; + test_sha[0] = a; test_sha[1] = b; test_sha[2] = c; + test_sha[3] = d; + +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + interleave_test_sha[0] = a; + interleave_test_sha[1] = b; + interleave_test_sha[2] = c; + interleave_test_sha[3] = d; +#endif ret = wc_InitSha256_ex(&sha, HEAP_HINT, devId); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); + +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + ret = wc_InitSha256_ex(&i_sha, HEAP_HINT, devId); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); +#endif + ret = wc_InitSha256_ex(&shaCopy, HEAP_HINT, devId); if (ret != 0) { wc_Sha256Free(&sha); return WC_TEST_RET_ENC_EC(ret); } +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + ret = wc_InitSha256_ex(&i_shaCopy, HEAP_HINT, devId); + if (ret != 0) { + wc_Sha256Free(&sha); + wc_Sha256Free(&i_sha); + return WC_TEST_RET_ENC_EC(ret); + } +#endif for (i = 0; i < times; ++i) { ret = wc_Sha256Update(&sha, (byte*)test_sha[i].input, @@ -2964,36 +3718,91 @@ if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); } +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + ret = wc_Sha256Update(&i_sha, (byte*)interleave_test_sha[i].input, + (word32)interleave_test_sha[i].inLen); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } +#endif + ret = wc_Sha256GetHash(&sha, hashcopy); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + ret = wc_Sha256GetHash(&i_sha, i_hashcopy); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#endif + ret = wc_Sha256Copy(&sha, &shaCopy); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + ret = wc_Sha256Copy(&i_sha, &i_shaCopy); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#endif + ret = wc_Sha256Final(&sha, hash); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + ret = wc_Sha256Final(&i_sha, i_hash); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#endif + wc_Sha256Free(&shaCopy); +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + wc_Sha256Free(&i_shaCopy); +#endif - if (XMEMCMP(hash, test_sha[i].output, WC_SHA256_DIGEST_SIZE) != 0) + if (XMEMCMP(hash, test_sha[i].output, WC_SHA256_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + if (XMEMCMP(hash, hashcopy, WC_SHA256_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + if (XMEMCMP(i_hash, interleave_test_sha[i].output, + WC_SHA256_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + if (XMEMCMP(i_hash, i_hashcopy, WC_SHA256_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + if (XMEMCMP(i_hash, test_sha[i].output, WC_SHA256_DIGEST_SIZE) != 0) { ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); - if (XMEMCMP(hash, hashcopy, WC_SHA256_DIGEST_SIZE) != 0) + } + if (XMEMCMP(i_hash, hashcopy, WC_SHA256_DIGEST_SIZE) != 0) { ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } +#endif } #ifndef NO_LARGE_HASH_TEST /* BEGIN LARGE HASH TEST */ { - byte large_input[1024]; #ifdef HASH_SIZE_LIMIT - const char* large_digest = + WOLFSSL_SMALL_STACK_STATIC const char* large_digest = "\xa4\x75\x9e\x7a\xa2\x03\x38\x32\x88\x66\xa2\xea\x17\xea\xf8\xc7" "\xfe\x4e\xc6\xbb\xe3\xbb\x71\xce\xe7\xdf\x7c\x04\x61\xb3\xc2\x2f"; #else - const char* large_digest = + WOLFSSL_SMALL_STACK_STATIC const char* large_digest = "\x27\x78\x3e\x87\x96\x3a\x4e\xfb\x68\x29\xb5\x31\xc9\xba\x57\xb4" "\x4f\x45\x79\x7f\x67\x70\xbd\x63\x7f\xbf\x0d\x80\x7c\xbd\xba\xe0"; #endif - for (i = 0; i < (int)sizeof(large_input); i++) { + +#ifdef WOLFSSL_SMALL_STACK + large_input = (byte *)XMALLOC(LARGE_HASH_TEST_INPUT_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + + if (large_input == NULL) { + ERROR_OUT(WC_TEST_RET_ENC_EC(MEMORY_E), exit); + } +#endif + + for (i = 0; i < LARGE_HASH_TEST_INPUT_SZ; i++) { large_input[i] = (byte)(i & 0xFF); } #ifdef HASH_SIZE_LIMIT @@ -3002,11 +3811,11 @@ times = 100; #endif #ifdef WOLFSSL_PIC32MZ_HASH - wc_Sha256SizeSet(&sha, times * sizeof(large_input)); + wc_Sha256SizeSet(&sha, times * LARGE_HASH_TEST_INPUT_SZ); #endif for (i = 0; i < times; ++i) { ret = wc_Sha256Update(&sha, (byte*)large_input, - (word32)sizeof(large_input)); + LARGE_HASH_TEST_INPUT_SZ); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); } @@ -3016,20 +3825,48 @@ if (XMEMCMP(hash, large_digest, WC_SHA256_DIGEST_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_NC, exit); } /* END LARGE HASH TEST */ +#undef LARGE_HASH_TEST_INPUT_SZ #endif /* NO_LARGE_HASH_TEST */ +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH) + unsigned char data_hb[WC_SHA256_BLOCK_SIZE] = { + 0x61, 0x62, 0x63, 0x80, 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, 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, 0x18 + }; + + ret = wc_Sha256HashBlock(&sha, data_hb, hash); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); + } + if (XMEMCMP(hash, b.output, WC_SHA256_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_NC, exit); + } +#endif + exit: +#if !defined(NO_LARGE_HASH_TEST) && defined(WOLFSSL_SMALL_STACK) + XFREE(large_input, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif wc_Sha256Free(&sha); wc_Sha256Free(&shaCopy); - +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + wc_Sha256Free(&i_sha); + wc_Sha256Free(&i_shaCopy); +#endif return ret; } #endif #ifdef WOLFSSL_SHA512 -WOLFSSL_TEST_SUBROUTINE int sha512_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha512_test(void) { /* ** See https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/SHA512.pdf @@ -3037,11 +3874,27 @@ wc_Sha512 sha, shaCopy; byte hash[WC_SHA512_DIGEST_SIZE]; byte hashcopy[WC_SHA512_DIGEST_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; testVector a, b, c; testVector test_sha[3]; +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + wc_Sha512 i_sha, i_shaCopy; + byte i_hash[WC_SHA512_DIGEST_SIZE]; + byte i_hashcopy[WC_SHA512_DIGEST_SIZE]; + testVector interleave_test_sha[3]; +#endif +#ifndef NO_LARGE_HASH_TEST +#define LARGE_HASH_TEST_INPUT_SZ 1024 +#ifdef WOLFSSL_SMALL_STACK + byte *large_input = NULL; +#else + byte large_input[LARGE_HASH_TEST_INPUT_SZ]; +#endif +#endif + int times = sizeof(test_sha) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sha512_test"); a.input = ""; a.output = "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd\xf1\x54\x28\x50\xd6\x6d\x80" @@ -3075,55 +3928,127 @@ test_sha[1] = b; test_sha[2] = c; +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + interleave_test_sha[0] = a; + interleave_test_sha[1] = b; + interleave_test_sha[2] = c; +#endif + ret = wc_InitSha512_ex(&sha, HEAP_HINT, devId); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + ret = wc_InitSha512_ex(&i_sha, HEAP_HINT, devId); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); +#endif + ret = wc_InitSha512_ex(&shaCopy, HEAP_HINT, devId); if (ret != 0) { wc_Sha512Free(&sha); return WC_TEST_RET_ENC_EC(ret); } +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + ret = wc_InitSha512_ex(&i_shaCopy, HEAP_HINT, devId); + if (ret != 0) { + wc_Sha512Free(&sha); + wc_Sha512Free(&i_sha); + return WC_TEST_RET_ENC_EC(ret); + } +#endif for (i = 0; i < times; ++i) { ret = wc_Sha512Update(&sha, (byte*)test_sha[i].input, (word32)test_sha[i].inLen); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + ret = wc_Sha512Update(&i_sha, (byte*)interleave_test_sha[i].input, + (word32)interleave_test_sha[i].inLen); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#endif + ret = wc_Sha512GetHash(&sha, hashcopy); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + ret = wc_Sha512GetHash(&i_sha, i_hashcopy); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#endif + ret = wc_Sha512Copy(&sha, &shaCopy); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + ret = wc_Sha512Copy(&i_sha, &i_shaCopy); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#endif + ret = wc_Sha512Final(&sha, hash); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + ret = wc_Sha512Final(&i_sha, i_hash); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#endif + wc_Sha512Free(&shaCopy); +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + wc_Sha512Free(&i_shaCopy); +#endif if (XMEMCMP(hash, test_sha[i].output, WC_SHA512_DIGEST_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); if (XMEMCMP(hash, hashcopy, WC_SHA512_DIGEST_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); +#ifndef NO_WOLFSSL_SHA512_INTERLEAVE + if (XMEMCMP(i_hash, interleave_test_sha[i].output, + WC_SHA512_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + if (XMEMCMP(i_hash, i_hashcopy, WC_SHA512_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + if (XMEMCMP(i_hash, test_sha[i].output, WC_SHA512_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + if (XMEMCMP(i_hash, hashcopy, WC_SHA512_DIGEST_SIZE) != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } +#endif + } #ifndef NO_LARGE_HASH_TEST /* BEGIN LARGE HASH TEST */ { - byte large_input[1024]; #ifdef HASH_SIZE_LIMIT - const char* large_digest = + WOLFSSL_SMALL_STACK_STATIC const char* large_digest = "\x30\x9B\x96\xA6\xE9\x43\x78\x30\xA3\x71\x51\x61\xC1\xEB\xE1\xBE" "\xC8\xA5\xF9\x13\x5A\xD6\x6D\x9E\x46\x31\x31\x67\x8D\xE2\xC0\x0B" "\x2A\x1A\x03\xE1\xF3\x48\xA7\x33\xBD\x49\xF8\xFF\xF1\xC2\xC2\x95" "\xCB\xF0\xAF\x87\x61\x85\x58\x63\x6A\xCA\x70\x9C\x8B\x83\x3F\x5D"; #else - const char* large_digest = + WOLFSSL_SMALL_STACK_STATIC const char* large_digest = "\x5a\x1f\x73\x90\xbd\x8c\xe4\x63\x54\xce\xa0\x9b\xef\x32\x78\x2d" "\x2e\xe7\x0d\x5e\x2f\x9d\x15\x1b\xdd\x2d\xde\x65\x0c\x7b\xfa\x83" "\x5e\x80\x02\x13\x84\xb8\x3f\xff\x71\x62\xb5\x09\x89\x63\xe1\xdc" "\xa5\xdc\xfc\xfa\x9d\x1a\x4d\xc0\xfa\x3a\x14\xf6\x01\x51\x90\xa4"; #endif - for (i = 0; i < (int)sizeof(large_input); i++) { +#ifdef WOLFSSL_SMALL_STACK + large_input = (byte *)XMALLOC(LARGE_HASH_TEST_INPUT_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + + if (large_input == NULL) { + ERROR_OUT(WC_TEST_RET_ENC_EC(MEMORY_E), exit); + } +#endif + + for (i = 0; i < LARGE_HASH_TEST_INPUT_SZ; i++) { large_input[i] = (byte)(i & 0xFF); } #ifdef HASH_SIZE_LIMIT @@ -3133,7 +4058,7 @@ #endif for (i = 0; i < times; ++i) { ret = wc_Sha512Update(&sha, (byte*)large_input, - (word32)sizeof(large_input)); + LARGE_HASH_TEST_INPUT_SZ); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); } @@ -3147,25 +4072,33 @@ /* Unaligned memory access test */ for (i = 1; i < 16; i++) { ret = wc_Sha512Update(&sha, (byte*)large_input + i, - (word32)sizeof(large_input) - i); + LARGE_HASH_TEST_INPUT_SZ - i); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); ret = wc_Sha512Final(&sha, hash); } #endif } /* END LARGE HASH TEST */ +#undef LARGE_HASH_TEST_INPUT_SZ #endif /* NO_LARGE_HASH_TEST */ exit: + +#if !defined(NO_LARGE_HASH_TEST) && defined(WOLFSSL_SMALL_STACK) + XFREE(large_input, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif wc_Sha512Free(&sha); wc_Sha512Free(&shaCopy); - +#ifndef NO_WOLFSSL_SHA256_INTERLEAVE + wc_Sha512Free(&i_sha); + wc_Sha512Free(&i_shaCopy); +#endif return ret; } #if !defined(WOLFSSL_NOSHA512_224) && \ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) -WOLFSSL_TEST_SUBROUTINE int sha512_224_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha512_224_test(void) { /* ** See https://csrc.nist.gov/Projects/cryptographic-standards-and-guidelines/example-values @@ -3176,11 +4109,12 @@ wc_Sha512 sha, shaCopy; byte hash[WC_SHA512_224_DIGEST_SIZE]; byte hashcopy[WC_SHA512_224_DIGEST_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; testVector a, b, c; testVector test_sha[3]; int times = sizeof(test_sha) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sha512_224_test"); a.input = ""; a.output = "\x6e\xd0\xdd\x02" @@ -3317,7 +4251,7 @@ #if !defined(WOLFSSL_NOSHA512_256) && \ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) -WOLFSSL_TEST_SUBROUTINE int sha512_256_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha512_256_test(void) { /* ** See https://csrc.nist.gov/Projects/cryptographic-standards-and-guidelines/example-values @@ -3327,11 +4261,12 @@ wc_Sha512 sha, shaCopy; byte hash[WC_SHA512_256_DIGEST_SIZE]; byte hashcopy[WC_SHA512_256_DIGEST_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; testVector a, b, c; testVector test_sha[3]; int times = sizeof(test_sha) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sha512_256_test"); a.input = ""; a.output = "\xc6\x72\xb8\xd1" "\xef\x56\xed\x28" @@ -3469,16 +4404,17 @@ #ifdef WOLFSSL_SHA384 -WOLFSSL_TEST_SUBROUTINE int sha384_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha384_test(void) { wc_Sha384 sha, shaCopy; byte hash[WC_SHA384_DIGEST_SIZE]; byte hashcopy[WC_SHA384_DIGEST_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; testVector a, b, c; testVector test_sha[3]; int times = sizeof(test_sha) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sha384_test"); a.input = ""; @@ -3589,7 +4525,7 @@ #ifdef WOLFSSL_SHA3 #ifndef WOLFSSL_NOSHA3_224 -static int sha3_224_test(void) +static wc_test_ret_t sha3_224_test(void) { wc_Sha3 sha; byte hash[WC_SHA3_224_DIGEST_SIZE]; @@ -3597,7 +4533,7 @@ testVector a, b, c; testVector test_sha[3]; - int ret = 0; + wc_test_ret_t ret = 0; int times = sizeof(test_sha) / sizeof(struct testVector), i; a.input = ""; @@ -3677,7 +4613,7 @@ #endif /* WOLFSSL_NOSHA3_224 */ #ifndef WOLFSSL_NOSHA3_256 -static int sha3_256_test(void) +static wc_test_ret_t sha3_256_test(void) { wc_Sha3 sha; byte hash[WC_SHA3_256_DIGEST_SIZE]; @@ -3685,7 +4621,7 @@ testVector a, b, c; testVector test_sha[3]; - int ret = 0; + wc_test_ret_t ret = 0; int times = sizeof(test_sha) / sizeof(struct testVector), i; byte large_input[1024]; @@ -3798,7 +4734,7 @@ #endif /* WOLFSSL_NOSHA3_256 */ #ifndef WOLFSSL_NOSHA3_384 -static int sha3_384_test(void) +static wc_test_ret_t sha3_384_test(void) { wc_Sha3 sha; byte hash[WC_SHA3_384_DIGEST_SIZE]; @@ -3809,7 +4745,7 @@ testVector a, b, c; testVector test_sha[3]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_sha) / sizeof(struct testVector), i; /* @@ -3919,7 +4855,7 @@ #endif /* WOLFSSL_NOSHA3_384 */ #ifndef WOLFSSL_NOSHA3_512 -static int sha3_512_test(void) +static wc_test_ret_t sha3_512_test(void) { wc_Sha3 sha; byte hash[WC_SHA3_512_DIGEST_SIZE]; @@ -3927,7 +4863,7 @@ testVector a, b, c; testVector test_sha[3]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_sha) / sizeof(struct testVector), i; /* @@ -4020,11 +4956,12 @@ } #endif /* WOLFSSL_NOSHA3_512 */ -WOLFSSL_TEST_SUBROUTINE int sha3_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sha3_test(void) { - int ret; + wc_test_ret_t ret; (void)ret; + WOLFSSL_ENTER("sha3_test"); #ifndef WOLFSSL_NOSHA3_224 if ((ret = sha3_224_test()) != 0) @@ -4048,12 +4985,12 @@ #endif /* WOLFSSL_SHA3 */ #ifdef WOLFSSL_SHAKE128 -static int shake128_absorb_test(wc_Shake* sha, byte *large_input_buf, +static wc_test_ret_t shake128_absorb_test(wc_Shake* sha, byte *large_input_buf, size_t large_input_buf_size) { testVector a, b, c, d, e; testVector test_sha[5]; - int ret = 0; + wc_test_ret_t ret = 0; int times = sizeof(test_sha) / sizeof(struct testVector), i; static const char large_digest[] = @@ -4233,14 +5170,14 @@ return ret; } -WOLFSSL_TEST_SUBROUTINE int shake128_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t shake128_test(void) { wc_Shake sha; byte hash[250]; testVector a, b, c, d, e; testVector test_sha[5]; - int ret = 0; + wc_test_ret_t ret = 0; int times = sizeof(test_sha) / sizeof(struct testVector), i; #define SHAKE128_LARGE_INPUT_BUFSIZ 1024 @@ -4258,6 +5195,7 @@ "\x70\xd4\x7c\x19\x01\x1f\x6d\x37\xba\x7b\x74\xc2\xbc\xb6\xbc\x74" "\xa3\x66\x6c\x9b\x11\x84\x9d\x4a\x36\xbc\x8a\x0d\x4c\xe3\x39\xfa" "\xfa\x1b"; + WOLFSSL_ENTER("shake128_test"); /* @@ -4404,12 +5342,12 @@ #endif #ifdef WOLFSSL_SHAKE256 -static int shake256_absorb_test(wc_Shake* sha, byte *large_input_buf, +static wc_test_ret_t shake256_absorb_test(wc_Shake* sha, byte *large_input_buf, size_t large_input_buf_size) { testVector a, b, c, d, e; testVector test_sha[5]; - int ret = 0; + wc_test_ret_t ret = 0; int times = sizeof(test_sha) / sizeof(struct testVector), i; static const char large_digest[] = @@ -4573,14 +5511,14 @@ return ret; } -WOLFSSL_TEST_SUBROUTINE int shake256_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t shake256_test(void) { wc_Shake sha; byte hash[250]; testVector a, b, c, d, e; testVector test_sha[5]; - int ret = 0; + wc_test_ret_t ret = 0; int times = sizeof(test_sha) / sizeof(struct testVector), i; #define SHAKE256_LARGE_INPUT_BUFSIZ 1024 @@ -4598,6 +5536,8 @@ "\x8c\x68\xb7\xfb\xac\x55\x8a\x9b\x4d\x91\xe4\x9f\x72\xbb\x6e\x38" "\xaf\x21\x7d\x21\xaa\x98\x4e\x75\xc4\xb4\x1c\x7c\x50\x45\x54\xf9" "\xea\x26"; + + WOLFSSL_ENTER("shake256_test"); /* ** https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Standards-and-Guidelines/documents/examples/SHAKE256_Msg0.pdf */ @@ -4740,8 +5680,171 @@ } #endif +#ifdef WOLFSSL_SM3 +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sm3_test(void) +{ + wc_Sm3 sm3, sm3Copy; + byte hash[WC_SM3_DIGEST_SIZE]; + byte hashGet[WC_SM3_DIGEST_SIZE]; + byte hashCopy[WC_SM3_DIGEST_SIZE]; + wc_test_ret_t ret = 0; + WOLFSSL_ENTER("sm3_test"); + + testVector a, b, c; + testVector test_sm3[3]; + int times = sizeof(test_sm3) / sizeof(struct testVector), i; + + a.input = ""; + a.output = "\x1a\xb2\x1d\x83\x55\xcf\xa1\x7f\x8e\x61\x19\x48\x31\xe8\x1a" + "\x8f\x22\xbe\xc8\xc7\x28\xfe\xfb\x74\x7e\xd0\x35\xeb\x50\x82" + "\xaa\x2b"; + a.inLen = XSTRLEN(a.input); + a.outLen = WC_SM3_DIGEST_SIZE; + + b.input = "abc"; + b.output = "\x66\xc7\xf0\xf4\x62\xee\xed\xd9\xd1\xf2\xd4\x6b\xdc\x10\xe4" + "\xe2\x41\x67\xc4\x87\x5c\xf2\xf7\xa2\x29\x7d\xa0\x2b\x8f\x4b" + "\xa8\xe0"; + b.inLen = XSTRLEN(b.input); + b.outLen = WC_SM3_DIGEST_SIZE; + + c.input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"; + c.output = "\x63\x9b\x6c\xc5\xe6\x4d\x9e\x37\xa3\x90\xb1\x92\xdf\x4f\xa1" + "\xea\x07\x20\xab\x74\x7f\xf6\x92\xb9\xf3\x8c\x4e\x66\xad\x7b" + "\x8c\x05"; + c.inLen = XSTRLEN(c.input); + c.outLen = WC_SM3_DIGEST_SIZE; + + test_sm3[0] = a; + test_sm3[1] = b; + test_sm3[2] = c; + + ret = wc_InitSm3(&sm3, HEAP_HINT, devId); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_InitSm3(&sm3Copy, HEAP_HINT, devId); + if (ret != 0) { + wc_Sm3Free(&sm3); + return WC_TEST_RET_ENC_EC(ret); + } + + /* Test all the KATs. */ + for (i = 0; i < times; ++i) { + ret = wc_Sm3Update(&sm3, (byte*)test_sm3[i].input, + (word32)test_sm3[i].inLen); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + /* Get the final hash but leave ready for more updates. */ + ret = wc_Sm3GetHash(&sm3, hashGet); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + + /* Make a copy of the hash. */ + ret = wc_Sm3Copy(&sm3, &sm3Copy); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + /* Get the final hash with original. */ + ret = wc_Sm3Final(&sm3, hash); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + + /* Get the final hash with copy. */ + ret = wc_Sm3Final(&sm3Copy, hashCopy); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + /* Dispose of copy. */ + wc_Sm3Free(&sm3Copy); + + /* Check hashes match expected. */ + if (XMEMCMP(hash, test_sm3[i].output, WC_SM3_DIGEST_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + if (XMEMCMP(hash, hashGet, WC_SM3_DIGEST_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + if (XMEMCMP(hash, hashCopy, WC_SM3_DIGEST_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + +#ifndef NO_LARGE_HASH_TEST + { + word32 sz; + byte large_input[1024]; + #ifdef HASH_SIZE_LIMIT + const char* large_digest = + "\x6c\x42\x57\x64\x8e\x45\xf3\xb6\xc0\x83\xd3\x41\x83\x66\x51\xb4" + "\x50\xfe\x06\xb5\xb7\x1e\xd5\x0d\x41\xfc\x1e\xe5\xc6\x57\x95\x0f"; + + times = 20; + #else + const char* large_digest = + "\x34\x51\x3c\xde\x7c\x30\xb7\xc5\xaa\x97\x3b\xed\xb3\x16\xb9\x76" + "\x35\x46\x14\x80\x2a\x57\xca\xd9\x48\xf9\x93\xcc\x1f\xdd\xab\x79"; + + times = 100; + #endif + + /* Set large input to something. */ + for (i = 0; i < (int)sizeof(large_input); i++) { + large_input[i] = (byte)(i & 0xFF); + } + + /* Hash a large number of times. */ + for (i = 0; i < times; ++i) { + ret = wc_Sm3Update(&sm3, (byte*)large_input, + (word32)sizeof(large_input)); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + /* Calculate hash and compare to expected. */ + ret = wc_Sm3Final(&sm3, hash); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); + if (XMEMCMP(hash, large_digest, WC_SM3_DIGEST_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); + + + /* Check updating with various sizes works. */ + for (sz = 1; sz <= 64; sz++) { + /* Hash a large number of times. */ + for (i = 0; i < times; ++i) { + word32 o; + + /* Update sz bytes at a time from large input buffer. */ + for (o = 0; o + sz <= (word32)sizeof(large_input); o += sz) { + ret = wc_Sm3Update(&sm3, (byte*)(large_input + o), sz); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(o), exit); + } + /* Check for left-overs. */ + if (o < (word32)sizeof(large_input)) { + ret = wc_Sm3Update(&sm3, (byte*)(large_input + o), + (word32)sizeof(large_input) - o); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), exit); + } + } + + /* Calculate hash and compare to expected. */ + ret = wc_Sm3Final(&sm3, hash); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(sz), exit); + if (XMEMCMP(hash, large_digest, WC_SM3_DIGEST_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(sz), exit); + } + } +#endif /* NO_LARGE_HASH_TEST */ + +exit: + + wc_Sm3Free(&sm3); + wc_Sm3Free(&sm3Copy); + + return ret; +} +#endif + #ifndef NO_HASH_WRAPPER -WOLFSSL_TEST_SUBROUTINE int hash_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) { wc_HashAlg hash; int ret, exp_ret; @@ -4799,6 +5902,8 @@ WC_HASH_TYPE_BLAKE2B, WC_HASH_TYPE_NONE }; + WOLFSSL_ENTER("hash_test"); + /* Parameter Validation testing. */ ret = wc_HashInit(NULL, WC_HASH_TYPE_SHA256); if (ret != BAD_FUNC_ARG) @@ -4866,7 +5971,7 @@ if (ret != BUFFER_E) return WC_TEST_RET_ENC_I(i); } - ret = wc_Hash(typesGood[i], data, sizeof(data), hashOut, digestSz); + ret = wc_Hash(typesGood[i], data, sizeof(data), hashOut, (word32)digestSz); if (ret != exp_ret) return WC_TEST_RET_ENC_I(i); if (exp_ret == 0 && XMEMCMP(out, hashOut, digestSz) != 0) @@ -5050,7 +6155,7 @@ #if !defined(NO_HMAC) && !defined(NO_MD5) && !(defined(HAVE_FIPS) && \ defined(HAVE_FIPS_VERSION) && \ (HAVE_FIPS_VERSION >= 5)) -WOLFSSL_TEST_SUBROUTINE int hmac_md5_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_md5_test(void) { Hmac hmac; byte hash[WC_MD5_DIGEST_SIZE]; @@ -5059,15 +6164,22 @@ { "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", "Jefe", + "\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" }; - testVector a, b, c; - testVector test_hmac[3]; + testVector a, b, c, d; + testVector test_hmac[4]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_hmac) / sizeof(testVector), i; + WOLFSSL_ENTER("hmac_md5_test"); + /* Following test vectors are from RFC 2202 section 2 */ a.input = "Hi There"; a.output = "\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc" "\x9d"; @@ -5089,9 +6201,17 @@ c.inLen = XSTRLEN(c.input); c.outLen = WC_MD5_DIGEST_SIZE; + d.input = "Test Using Larger Than Block-Size Key - Hash Key First"; + d.output = "\x6b\x1a\xb7\xfe\x4b\xd7\xbf\x8f\x0b\x62\xe6\xce\x61\xb9\xd0" + "\xcd"; + d.inLen = XSTRLEN(d.input); + d.outLen = WC_MD5_DIGEST_SIZE; + + test_hmac[0] = a; test_hmac[1] = b; test_hmac[2] = c; + test_hmac[3] = d; for (i = 0; i < times; ++i) { #if defined(HAVE_FIPS) || defined(HAVE_CAVIUM) @@ -5122,7 +6242,7 @@ wc_HmacFree(&hmac); } -#ifndef HAVE_FIPS +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) if ((ret = wc_HmacSizeByType(WC_MD5)) != WC_MD5_DIGEST_SIZE) return WC_TEST_RET_ENC_EC(ret); #endif @@ -5132,7 +6252,7 @@ #endif /* !NO_HMAC && !NO_MD5 && (!HAVE_FIPS || (HAVE_FIPS_VERSION < 5)) */ #if !defined(NO_HMAC) && !defined(NO_SHA) -WOLFSSL_TEST_SUBROUTINE int hmac_sha_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha_test(void) { Hmac hmac; byte hash[WC_SHA_DIGEST_SIZE]; @@ -5143,15 +6263,22 @@ "\x0b\x0b\x0b", "Jefe", "\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" }; - testVector a, b, c; - testVector test_hmac[3]; + testVector a, b, c, d; + testVector test_hmac[4]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_hmac) / sizeof(testVector), i; + WOLFSSL_ENTER("hmac_sha_test"); + /* Following test vectors are from RFC 2202 section 3 */ a.input = "Hi There"; a.output = "\xb6\x17\x31\x86\x55\x05\x72\x64\xe2\x8b\xc0\xb6\xfb\x37\x8c" "\x8e\xf1\x46\xbe\x00"; @@ -5173,12 +6300,22 @@ c.inLen = XSTRLEN(c.input); c.outLen = WC_SHA_DIGEST_SIZE; + d.input = "Test Using Larger Than Block-Size Key - Hash Key First"; + d.output = "\xaa\x4a\xe5\xe1\x52\x72\xd0\x0e\x95\x70\x56\x37\xce\x8a\x3b" + "\x55\xed\x40\x21\x12"; + d.inLen = XSTRLEN(d.input); + d.outLen = WC_SHA_DIGEST_SIZE; + test_hmac[0] = a; test_hmac[1] = b; test_hmac[2] = c; + test_hmac[3] = d; +#if FIPS_VERSION3_GE(6,0,0) + int allowShortKeyWithFips = 1; +#endif for (i = 0; i < times; ++i) { -#if defined(HAVE_FIPS) || defined(HAVE_CAVIUM) +#if defined(HAVE_CAVIUM) || (defined(HAVE_FIPS) && FIPS_VERSION3_LT(6,0,0)) if (i == 1) continue; /* cavium can't handle short keys, fips not allowed */ #endif @@ -5188,6 +6325,15 @@ ret = wc_HmacSetKey(&hmac, WC_SHA, (byte*)keys[i], (word32)XSTRLEN(keys[i])); +#if FIPS_VERSION3_GE(6,0,0) + if (i == 1) { + if (ret != HMAC_MIN_KEYLEN_E) + return WC_TEST_RET_ENC_EC(ret); + /* Now use the ex and allow short keys with FIPS option */ + ret = wc_HmacSetKey_ex(&hmac, WC_SHA, (byte*) keys[i], + (word32)XSTRLEN(keys[i]), allowShortKeyWithFips); + } +#endif if (ret != 0) return WC_TEST_RET_ENC_EC(ret); ret = wc_HmacUpdate(&hmac, (byte*)test_hmac[i].input, @@ -5204,7 +6350,7 @@ wc_HmacFree(&hmac); } -#ifndef HAVE_FIPS +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) if ((ret = wc_HmacSizeByType(WC_SHA)) != WC_SHA_DIGEST_SIZE) return WC_TEST_RET_ENC_EC(ret); #endif @@ -5215,7 +6361,7 @@ #if !defined(NO_HMAC) && defined(WOLFSSL_SHA224) -WOLFSSL_TEST_SUBROUTINE int hmac_sha224_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha224_test(void) { Hmac hmac; byte hash[WC_SHA224_DIGEST_SIZE]; @@ -5227,19 +6373,25 @@ "Jefe", "\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\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" + "\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" }; testVector a, b, c, d; testVector test_hmac[4]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_hmac) / sizeof(testVector), i; + WOLFSSL_ENTER("hmac_sha224_test"); + /* Following test vectors are from RFC 4231 section 4 */ a.input = "Hi There"; a.output = "\x89\x6f\xb1\x12\x8a\xbb\xdf\x19\x68\x32\x10\x7c\xd4\x9d\xf3" "\x3f\x47\xb4\xb1\x16\x99\x12\xba\x4f\x53\x68\x4b\x22"; @@ -5261,9 +6413,8 @@ c.inLen = XSTRLEN(c.input); c.outLen = WC_SHA224_DIGEST_SIZE; - d.input = "Big Key Input"; - d.output = "\xe7\x4e\x2b\x8a\xa9\xf0\x37\x2f\xed\xae\x70\x0c\x49\x47\xf1" - "\x46\x54\xa7\x32\x6b\x55\x01\x87\xd2\xc8\x02\x0e\x3a"; + d.input = "Test Using Larger Than Block-Size Key - Hash Key First"; + d.output = "\x95\xe9\xa0\xdb\x96\x20\x95\xad\xae\xbe\x9b\x2d\x6f\x0d\xbc\xe2\xd4\x99\xf1\x12\xf2\xd2\xb7\x27\x3f\xa6\x87\x0e"; d.inLen = XSTRLEN(d.input); d.outLen = WC_SHA224_DIGEST_SIZE; @@ -5299,7 +6450,7 @@ wc_HmacFree(&hmac); } -#ifndef HAVE_FIPS +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) if ((ret = wc_HmacSizeByType(WC_SHA224)) != WC_SHA224_DIGEST_SIZE) return WC_TEST_RET_ENC_EC(ret); #endif @@ -5310,7 +6461,7 @@ #if !defined(NO_HMAC) && !defined(NO_SHA256) -WOLFSSL_TEST_SUBROUTINE int hmac_sha256_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha256_test(void) { Hmac hmac; byte hash[WC_SHA256_DIGEST_SIZE]; @@ -5324,14 +6475,25 @@ "\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" }; - testVector a, b, c, d; - testVector test_hmac[4]; + testVector a, b, c, d, e; + testVector test_hmac[5]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_hmac) / sizeof(testVector), i; + WOLFSSL_ENTER("hmac_sha256_test"); + /* Following test vectors are from RFC 4231 section 4 */ a.input = "Hi There"; a.output = "\xb0\x34\x4c\x61\xd8\xdb\x38\x53\x5c\xa8\xaf\xce\xaf\x0b\xf1" "\x2b\x88\x1d\xc2\x00\xc9\x83\x3d\xa7\x26\xe9\x37\x6c\x2e\x32" @@ -5363,10 +6525,18 @@ d.inLen = 0; d.outLen = WC_SHA256_DIGEST_SIZE; + e.input = "Test Using Larger Than Block-Size Key - Hash Key First"; + e.output = "\x60\xe4\x31\x59\x1e\xe0\xb6\x7f\x0d\x8a\x26\xaa\xcb\xf5\xb7" + "\x7f\x8e\x0b\xc6\x21\x37\x28\xc5\x14\x05\x46\x04\x0f\x0e\xe3" + "\x7f\x54"; + e.inLen = XSTRLEN(e.input);; + e.outLen = WC_SHA256_DIGEST_SIZE; + test_hmac[0] = a; test_hmac[1] = b; test_hmac[2] = c; test_hmac[3] = d; + test_hmac[4] = e; for (i = 0; i < times; ++i) { #if defined(HAVE_FIPS) || defined(HAVE_CAVIUM) @@ -5401,11 +6571,17 @@ wc_HmacFree(&hmac); } -#ifndef HAVE_FIPS +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) if ((ret = wc_HmacSizeByType(WC_SHA256)) != WC_SHA256_DIGEST_SIZE) return WC_TEST_RET_ENC_EC(ret); - if ((ret = wc_HmacSizeByType(20)) != BAD_FUNC_ARG) +#if FIPS_VERSION3_GE(6,0,0) + if ((ret = wc_HmacSizeByType(21)) != HMAC_KAT_FIPS_E) +#else + if ((ret = wc_HmacSizeByType(21)) != BAD_FUNC_ARG) +#endif + { return WC_TEST_RET_ENC_EC(ret); + } #endif if ((ret = wolfSSL_GetHmacMaxSize()) != WC_MAX_DIGEST_SIZE) return WC_TEST_RET_ENC_EC(ret); @@ -5416,7 +6592,7 @@ #if !defined(NO_HMAC) && defined(WOLFSSL_SHA384) -WOLFSSL_TEST_SUBROUTINE int hmac_sha384_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha384_test(void) { Hmac hmac; byte hash[WC_SHA384_DIGEST_SIZE]; @@ -5428,23 +6604,25 @@ "Jefe", "\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\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" + "\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" }; testVector a, b, c, d; testVector test_hmac[4]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_hmac) / sizeof(testVector), i; + WOLFSSL_ENTER("hmac_sha384_test"); + /* Following test vectors are from RFC 4231 section 4 */ a.input = "Hi There"; a.output = "\xaf\xd0\x39\x44\xd8\x48\x95\x62\x6b\x08\x25\xf4\xab\x46\x90" "\x7f\x15\xf9\xda\xdb\xe4\x10\x1e\xc6\x82\xaa\x03\x4c\x7c\xeb" @@ -5472,11 +6650,11 @@ c.inLen = XSTRLEN(c.input); c.outLen = WC_SHA384_DIGEST_SIZE; - d.input = "Big Key Input"; - d.output = "\xd2\x3d\x29\x6e\xf5\x1e\x23\x23\x49\x18\xb3\xbf\x4c\x38\x7b" - "\x31\x21\x17\xbb\x09\x73\x27\xf8\x12\x9d\xe9\xc6\x5d\xf9\x54" - "\xd6\x38\x5a\x68\x53\x14\xee\xe0\xa6\x4f\x36\x7e\xb2\xf3\x1a" - "\x57\x41\x69"; + d.input = "Test Using Larger Than Block-Size Key - Hash Key First"; + d.output = "\x4e\xce\x08\x44\x85\x81\x3e\x90\x88\xd2\xc6\x3a\x04\x1b\xc5" + "\xb4\x4f\x9e\xf1\x01\x2a\x2b\x58\x8f\x3c\xd1\x1f\x05\x03\x3a" + "\xc4\xc6\x0c\x2e\xf6\xab\x40\x30\xfe\x82\x96\x24\x8d\xf1\x63" + "\xf4\x49\x52"; d.inLen = XSTRLEN(d.input); d.outLen = WC_SHA384_DIGEST_SIZE; @@ -5512,7 +6690,7 @@ wc_HmacFree(&hmac); } -#ifndef HAVE_FIPS +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) if ((ret = wc_HmacSizeByType(WC_SHA384)) != WC_SHA384_DIGEST_SIZE) return WC_TEST_RET_ENC_EC(ret); #endif @@ -5523,7 +6701,7 @@ #if !defined(NO_HMAC) && defined(WOLFSSL_SHA512) -WOLFSSL_TEST_SUBROUTINE int hmac_sha512_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha512_test(void) { Hmac hmac; byte hash[WC_SHA512_DIGEST_SIZE]; @@ -5535,23 +6713,25 @@ "Jefe", "\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\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" - "\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08" + "\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" }; testVector a, b, c, d; testVector test_hmac[4]; - int ret; + wc_test_ret_t ret; int times = sizeof(test_hmac) / sizeof(testVector), i; + WOLFSSL_ENTER("hmac_sha512_test"); + /* Following test vectors are from RFC 4231 section 4 */ a.input = "Hi There"; a.output = "\x87\xaa\x7c\xde\xa5\xef\x61\x9d\x4f\xf0\xb4\x24\x1a\x1d\x6c" "\xb0\x23\x79\xf4\xe2\xce\x4e\xc2\x78\x7a\xd0\xb3\x05\x45\xe1" @@ -5582,12 +6762,12 @@ c.inLen = XSTRLEN(c.input); c.outLen = WC_SHA512_DIGEST_SIZE; - d.input = "Big Key Input"; - d.output = "\x3f\xa9\xc9\xe1\xbd\xbb\x04\x55\x1f\xef\xcc\x92\x33\x08\xeb" - "\xcf\xc1\x9a\x5b\x5b\xc0\x7c\x86\x84\xae\x8c\x40\xaf\xb1\x27" - "\x87\x38\x92\x04\xa8\xed\xd7\xd7\x07\xa9\x85\xa0\xc2\xcd\x30" - "\xc0\x56\x14\x49\xbc\x2f\x69\x15\x6a\x97\xd8\x79\x2f\xb3\x3b" - "\x1e\x18\xfe\xfa"; + d.input = "Test Using Larger Than Block-Size Key - Hash Key First"; + d.output = "\x80\xb2\x42\x63\xc7\xc1\xa3\xeb\xb7\x14\x93\xc1\xdd\x7b\xe8" + "\xb4\x9b\x46\xd1\xf4\x1b\x4a\xee\xc1\x12\x1b\x01\x37\x83\xf8" + "\xf3\x52\x6b\x56\xd0\x37\xe0\x5f\x25\x98\xbd\x0f\xd2\x21\x5d" + "\x6a\x1e\x52\x95\xe6\x4f\x73\xf6\x3f\x0a\xec\x8b\x91\x5a\x98" + "\x5d\x78\x65\x98"; d.inLen = XSTRLEN(d.input); d.outLen = WC_SHA512_DIGEST_SIZE; @@ -5623,7 +6803,7 @@ wc_HmacFree(&hmac); } -#ifndef HAVE_FIPS +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) if ((ret = wc_HmacSizeByType(WC_SHA512)) != WC_SHA512_DIGEST_SIZE) return WC_TEST_RET_ENC_EC(ret); #endif @@ -5636,7 +6816,7 @@ #if !defined(NO_HMAC) && defined(WOLFSSL_SHA3) && \ !defined(WOLFSSL_NOSHA3_224) && !defined(WOLFSSL_NOSHA3_256) && \ !defined(WOLFSSL_NOSHA3_384) && !defined(WOLFSSL_NOSHA3_512) -WOLFSSL_TEST_SUBROUTINE int hmac_sha3_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha3_test(void) { Hmac hmac; byte hash[WC_SHA3_512_DIGEST_SIZE]; @@ -5762,8 +6942,9 @@ }; int i = 0, iMax = sizeof(input) / sizeof(input[0]), - j, jMax = sizeof(hashType) / sizeof(hashType[0]), - ret; + j, jMax = sizeof(hashType) / sizeof(hashType[0]); + int ret; + WOLFSSL_ENTER("hmac_sha3_test"); #ifdef HAVE_FIPS /* FIPS requires a minimum length for HMAC keys, and "Jefe" is too @@ -5786,7 +6967,7 @@ ret = wc_HmacFinal(&hmac, hash); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); - if (XMEMCMP(hash, output[(i*jMax) + j], hashSz[j]) != 0) + if (XMEMCMP(hash, output[(i*jMax) + j], (size_t)hashSz[j]) != 0) return WC_TEST_RET_ENC_NC; wc_HmacFree(&hmac); @@ -5794,7 +6975,7 @@ if (i > 0) continue; - #ifndef HAVE_FIPS + #if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) ret = wc_HmacSizeByType(hashType[j]); if (ret != hashSz[j]) return WC_TEST_RET_ENC_EC(ret); @@ -5819,9 +7000,9 @@ int effectiveKeyBits; /* Up to 1024 bits supported */ } rc2TestVector; -static int rc2_ecb_test(void) +static wc_test_ret_t rc2_ecb_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; byte cipher[RC2_BLOCK_SIZE]; byte plain[RC2_BLOCK_SIZE]; @@ -5948,9 +7129,9 @@ return 0; } -static int rc2_cbc_test(void) +static wc_test_ret_t rc2_cbc_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; byte cipher[128]; byte plain[128]; @@ -6110,7 +7291,7 @@ return WC_TEST_RET_ENC_NC; } - /* reset IV for decrypt, since overriden by encrypt operation */ + /* reset IV for decrypt, since overridden by encrypt operation */ ret = wc_Rc2SetIV(&rc2, (byte*)test_rc2[j].iv); if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); @@ -6129,9 +7310,10 @@ return 0; } -WOLFSSL_TEST_SUBROUTINE int rc2_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t rc2_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; + WOLFSSL_ENTER("rc2_test"); ret = rc2_ecb_test(); if (ret != 0) { @@ -6144,11 +7326,11 @@ #ifndef NO_RC4 -WOLFSSL_TEST_SUBROUTINE int arc4_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t arc4_test(void) { byte cipher[16]; byte plain[16]; - int ret; + wc_test_ret_t ret; const char* keys[] = { @@ -6162,6 +7344,7 @@ testVector test_arc4[4]; int times = sizeof(test_arc4) / sizeof(testVector), i; + WOLFSSL_ENTER("arc4_test"); a.input = "\x01\x23\x45\x67\x89\xab\xcd\xef"; a.output = "\x75\xb7\x87\x80\x99\xe0\xc5\x96"; @@ -6202,10 +7385,10 @@ if (ret != 0) return WC_TEST_RET_ENC_EC(ret); - ret = wc_Arc4SetKey(&enc, (byte*)keys[i], keylen); + ret = wc_Arc4SetKey(&enc, (byte*)keys[i], (word32)keylen); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); - ret = wc_Arc4SetKey(&dec, (byte*)keys[i], keylen); + ret = wc_Arc4SetKey(&dec, (byte*)keys[i], (word32)keylen); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); @@ -6232,7 +7415,7 @@ #endif #ifdef HAVE_CHACHA -WOLFSSL_TEST_SUBROUTINE int chacha_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t chacha_test(void) { ChaCha enc; ChaCha dec; @@ -6241,7 +7424,7 @@ byte sliver[64]; byte input[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; word32 keySz = 32; - int ret = 0; + wc_test_ret_t ret = 0; int i; int times = 4; @@ -6424,6 +7607,8 @@ test_chacha[2] = c; test_chacha[3] = d; + WOLFSSL_ENTER("chacha_test"); + #ifndef BENCH_EMBEDDED #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) cipher_big = (byte*)XMALLOC(CHACHA_BIG_TEST_SIZE, HEAP_HINT, @@ -6551,8 +7736,8 @@ if (ret != 0) return ret; - ret |= wc_Chacha_Process(&enc, cipher_big, plain_big , block_size); - ret |= wc_Chacha_Process(&dec, plain_big , cipher_big, block_size); + ret |= wc_Chacha_Process(&enc, cipher_big, plain_big , (word32)block_size); + ret |= wc_Chacha_Process(&dec, plain_big , cipher_big, (word32)block_size); if (ret != 0) return ret; @@ -6582,19 +7767,19 @@ return WC_TEST_RET_ENC_EC(ret); for (j = 0; j < CHACHA_BIG_TEST_SIZE - i; j+= i) { - ret = wc_Chacha_Process(&enc, cipher_big + j, plain_big + j, i); + ret = wc_Chacha_Process(&enc, cipher_big + j, plain_big + j, (word32)i); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); - ret = wc_Chacha_Process(&dec, plain_big + j, cipher_big + j, i); + ret = wc_Chacha_Process(&dec, plain_big + j, cipher_big + j, (word32)i); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); } rem = CHACHA_BIG_TEST_SIZE - j; - ret = wc_Chacha_Process(&enc, cipher_big + j, plain_big + j, rem); + ret = wc_Chacha_Process(&enc, cipher_big + j, plain_big + j, (word32)rem); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); - ret = wc_Chacha_Process(&dec, plain_big + j, cipher_big + j, rem); + ret = wc_Chacha_Process(&dec, plain_big + j, cipher_big + j, (word32)rem); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); @@ -6618,10 +7803,8 @@ #ifdef HAVE_POLY1305 -WOLFSSL_TEST_SUBROUTINE int poly1305_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t poly1305_test(void) { - int ret = 0; - int i; byte tag[16]; Poly1305 enc; @@ -6779,6 +7962,9 @@ const byte* keys[] = {key, key, key2, key2, key5, key}; const byte* tests[] = {correct0, correct1, correct2, correct3, correct5, correct6}; + int i; + wc_test_ret_t ret = 0; + WOLFSSL_ENTER("poly1305_test"); for (i = 0; i < 6; i++) { ret = wc_Poly1305SetKey(&enc, keys[i], 32); @@ -6829,7 +8015,7 @@ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) -WOLFSSL_TEST_SUBROUTINE int chacha20_poly1305_aead_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t chacha20_poly1305_aead_test(void) { /* Test #1 from Section 2.8.2 of draft-irtf-cfrg-chacha20-poly1305-10 */ /* https://tools.ietf.org/html/draft-irtf-cfrg-chacha20-poly1305-10 */ @@ -6994,7 +8180,6 @@ byte generatedCiphertext[265]; /* max plaintext2/cipher2 */ byte generatedPlaintext[265]; /* max plaintext2/cipher2 */ byte generatedAuthTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; - int err; ChaChaPoly_Aead aead; @@ -7003,9 +8188,13 @@ #else #define TEST_SMALL_CHACHA_CHUNKS 64 #endif - #ifdef TEST_SMALL_CHACHA_CHUNKS + +#ifdef TEST_SMALL_CHACHA_CHUNKS word32 testLen; - #endif +#endif + wc_test_ret_t err; + + WOLFSSL_ENTER("chacha20_poly1305_aead_test"); XMEMSET(generatedCiphertext, 0, sizeof(generatedCiphertext)); XMEMSET(generatedAuthTag, 0, sizeof(generatedAuthTag)); @@ -7348,7 +8537,7 @@ #ifndef NO_DES3 -WOLFSSL_TEST_SUBROUTINE int des_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t des_test(void) { WOLFSSL_SMALL_STACK_STATIC const byte vector[] = { /* "now is the time for all " w/o trailing 0 */ 0x6e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, @@ -7379,7 +8568,8 @@ 0x15,0x85,0xb3,0x22,0x4b,0x86,0x2b,0x4b }; - int ret; + wc_test_ret_t ret; + WOLFSSL_ENTER("des_test"); ret = wc_Des_SetKey(&enc, key, iv, DES_ENCRYPTION); if (ret != 0) @@ -7443,7 +8633,7 @@ #ifndef NO_DES3 -WOLFSSL_TEST_SUBROUTINE int des3_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t des3_test(void) { WOLFSSL_SMALL_STACK_STATIC const byte vector[] = { /* "Now is the time for all " w/o trailing 0 */ 0x4e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, @@ -7478,11 +8668,11 @@ 0x18,0x94,0x15,0x74,0x87,0x12,0x7d,0xb0 }; - int ret; + wc_test_ret_t ret; #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) size_t i; #endif - + WOLFSSL_ENTER("des3_test"); ret = wc_Des3Init(&enc, HEAP_HINT, devId); if (ret != 0) @@ -7589,10 +8779,11 @@ #if defined(WOLFSSL_AES_OFB) || defined(WOLFSSL_AES_CFB) || \ defined(WOLFSSL_AES_XTS) #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) \ - && !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) + && !defined(HAVE_SELFTEST) +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) /* pass in the function, key, iv, plain text and expected and this function * tests that the encryption and decryption is successful */ -static int EVP_test(const WOLFSSL_EVP_CIPHER* type, const byte* key, +static wc_test_ret_t EVP_test(const WOLFSSL_EVP_CIPHER* type, const byte* key, const byte* iv, const byte* plain, int plainSz, const byte* expected, int expectedSz) { @@ -7601,7 +8792,9 @@ #else EVP_CIPHER_CTX ctx[1]; #endif - int idx, ret = 0, cipherSz; + int ctx_inited = 0; + int idx, cipherSz; + wc_test_ret_t ret = 0; byte* cipher; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -7617,6 +8810,7 @@ /* test encrypt */ EVP_CIPHER_CTX_init(ctx); + ctx_inited = 1; if (EVP_CipherInit(ctx, type, key, iv, 1) == 0) { ret = WC_TEST_RET_ENC_NC; goto EVP_TEST_END; @@ -7639,8 +8833,18 @@ goto EVP_TEST_END; } + ret = wolfSSL_EVP_CIPHER_CTX_cleanup(ctx); + ctx_inited = 0; + if (ret == WOLFSSL_SUCCESS) + ret = 0; + else { + ret = WC_TEST_RET_ENC_NC; + goto EVP_TEST_END; + } + /* test decrypt */ EVP_CIPHER_CTX_init(ctx); + ctx_inited = 1; if (EVP_CipherInit(ctx, type, key, iv, 0) == 0) { ret = WC_TEST_RET_ENC_NC; goto EVP_TEST_END; @@ -7667,18 +8871,26 @@ if (cipher) XFREE(cipher, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); (void)cipherSz; + + if (ctx_inited) { + int cleanup_ret = wolfSSL_EVP_CIPHER_CTX_cleanup(ctx); + if (cleanup_ret != WOLFSSL_SUCCESS) + ret = WC_TEST_RET_ENC_NC; + } + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) wolfSSL_EVP_CIPHER_CTX_free(ctx); #endif return ret; } -#endif /* OPENSSL_EXTRA */ +#endif /* !HAVE_FIPS || FIPS_VERSION3_GE(6,0,0) */ +#endif /* OPENSSL_EXTRA && !WOLFCRYPT_ONLY && !HAVE_SELFTEST */ #endif /* WOLFSSL_AES_OFB || WOLFSSL_AES_CFB */ #ifdef WOLFSSL_AES_OFB /* test vector from https://csrc.nist.gov/Projects/cryptographic-algorithm-validation-program/Block-Ciphers */ - WOLFSSL_TEST_SUBROUTINE int aesofb_test(void) + WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesofb_test(void) { #ifdef WOLFSSL_AES_256 WOLFSSL_SMALL_STACK_STATIC const byte key1[] = @@ -7761,21 +8973,23 @@ }; #endif /* WOLFSSL_AES_192 */ -#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = NULL; -#else + #else Aes enc[1]; -#endif + #endif byte cipher[AES_BLOCK_SIZE * 4]; #ifdef HAVE_AES_DECRYPT -#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) - Aes *dec = NULL; -#else - Aes dec[1]; -#endif + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + Aes *dec = NULL; + #else + Aes dec[1]; + #endif byte plain [AES_BLOCK_SIZE * 4]; #endif - int ret = 0; + wc_test_ret_t ret = 0; + + WOLFSSL_ENTER("aesofb_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((enc = (Aes *)XMALLOC(sizeof *enc, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) @@ -7802,6 +9016,16 @@ } #endif + ret = wc_AesInit(enc, HEAP_HINT, INVALID_DEVID); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + #ifdef HAVE_AES_DECRYPT + ret = wc_AesInit(dec, HEAP_HINT, INVALID_DEVID); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + #endif + ret = wc_AesSetKey(enc, key2, sizeof(key2), iv2, AES_ENCRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -8026,7 +9250,9 @@ out: wc_AesFree(enc); +#ifdef HAVE_AES_DECRYPT wc_AesFree(dec); +#endif #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if (enc) XFREE(enc, HEAP_HINT, DYNAMIC_TYPE_AES); @@ -8043,8 +9269,10 @@ #endif /* WOLFSSL_AES_OFB */ #if defined(WOLFSSL_AES_CFB) - /* Test cases from NIST SP 800-38A, Recommendation for Block Cipher Modes of Operation Methods an*/ - static int aescfb_test(void) + /* Test cases from NIST SP 800-38A, Recommendation for Block Cipher Modes of + * Operation Methods and Techniques + */ + static wc_test_ret_t aescfb_test_0(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = NULL; @@ -8062,7 +9290,7 @@ int dec_inited = 0; byte plain [AES_BLOCK_SIZE * 4]; #endif - int ret = 0; + wc_test_ret_t ret = 0; WOLFSSL_SMALL_STACK_STATIC const byte iv[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, @@ -8353,8 +9581,10 @@ if (enc_inited) wc_AesFree(enc); +#ifdef HAVE_AES_DECRYPT if (dec_inited) wc_AesFree(dec); +#endif #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if (enc) @@ -8368,8 +9598,8 @@ return ret; } -#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) - static int aescfb1_test(void) +#if !defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0)) + static wc_test_ret_t aescfb1_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = NULL; @@ -8387,7 +9617,7 @@ int dec_inited = 0; byte plain [AES_BLOCK_SIZE]; #endif - int ret = 0; + wc_test_ret_t ret = 0; #ifdef WOLFSSL_AES_128 WOLFSSL_SMALL_STACK_STATIC const byte iv[] = { @@ -8410,6 +9640,11 @@ { 0xC0 }; + + WOLFSSL_SMALL_STACK_STATIC const byte cipher1_7bit[] = + { + 0x1C + }; #endif /* WOLFSSL_AES_128 */ #ifdef WOLFSSL_AES_192 WOLFSSL_SMALL_STACK_STATIC const byte iv2[] = { @@ -8510,6 +9745,15 @@ ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif /* HAVE_AES_DECRYPT */ + XMEMSET(cipher, 0, sizeof(cipher)); + ret = wc_AesCfb1Encrypt(enc, cipher, msg1, 7); + + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (cipher[0] != cipher1_7bit[0]) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + #ifdef OPENSSL_EXTRA ret = wc_AesSetKey(enc, key1, AES_BLOCK_SIZE, iv, AES_ENCRYPTION); if (ret != 0) @@ -8619,7 +9863,7 @@ return ret; } - static int aescfb8_test(void) + static wc_test_ret_t aescfb8_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = NULL; @@ -8637,7 +9881,7 @@ int dec_inited = 0; byte plain [AES_BLOCK_SIZE]; #endif - int ret = 0; + wc_test_ret_t ret = 0; #ifdef WOLFSSL_AES_128 WOLFSSL_SMALL_STACK_STATIC const byte iv[] = { @@ -8837,9 +10081,9 @@ #endif /* WOLFSSL_AES_CFB */ -static int aes_key_size_test(void) +static wc_test_ret_t aes_key_size_test(void) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *aes; #else @@ -8970,10 +10214,11 @@ return ret; } -#if defined(WOLFSSL_AES_XTS) +#if defined(WOLFSSL_AES_XTS) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3)) + /* test vectors from http://csrc.nist.gov/groups/STM/cavp/block-cipher-modes.html */ #ifdef WOLFSSL_AES_128 -static int aes_xts_128_test(void) +static wc_test_ret_t aes_xts_128_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XtsAes *aes = NULL; @@ -8981,9 +10226,21 @@ XtsAes aes[1]; #endif int aes_inited = 0; - int ret = 0; + wc_test_ret_t ret = 0; unsigned char buf[AES_BLOCK_SIZE * 2 + 8]; unsigned char cipher[AES_BLOCK_SIZE * 2 + 8]; +#ifdef WOLFSSL_AESXTS_STREAM + struct XtsAesStreamData stream; +#endif +#if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) + #define LARGE_XTS_SZ 1024 + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + byte* large_input = NULL; + #else + byte large_input[LARGE_XTS_SZ]; + #endif +#endif /* 128 key tests */ WOLFSSL_SMALL_STACK_STATIC unsigned char k1[] = { @@ -9041,8 +10298,13 @@ 0xff, 0x8d, 0xbc, 0x1d, 0x9f, 0x7f, 0xc8, 0x22 }; -#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3) + WOLFSSL_SMALL_STACK_STATIC unsigned char cp2[] = { + 0x2b, 0xf7, 0x2c, 0xf3, 0xeb, 0x85, 0xef, 0x7b, + 0x0b, 0x76, 0xa0, 0xaa, 0xf3, 0x3f, 0x25, 0x8b, + 0x77, 0x8a, 0xe8, 0xb4, 0x3c, 0xb9, 0x8d, 0x5a + }; +#ifndef HAVE_FIPS /* FIPS requires different keys for main and tweak. */ WOLFSSL_SMALL_STACK_STATIC unsigned char k3[] = { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, @@ -9067,8 +10329,7 @@ 0xA0, 0x85, 0xD2, 0x69, 0x6E, 0x87, 0x0A, 0xBF, 0xB5, 0x5A, 0xDD, 0xCB, 0x80, 0xE0, 0xFC, 0xCD }; - -#endif /* !HAVE_FIPS || FIPS_VERSION_GE(5,3) */ +#endif /* HAVE_FIPS */ #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((aes = (XtsAes *)XMALLOC(sizeof *aes, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) @@ -9085,13 +10346,16 @@ #endif XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k2, sizeof(k2), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsInit(aes, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); else aes_inited = 1; + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); @@ -9101,21 +10365,99 @@ if (XMEMCMP(c2, buf, sizeof(c2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i2, sizeof(i2), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p2, AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE, p2 + AES_BLOCK_SIZE, sizeof(p2) - AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c2, buf, sizeof(c2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c2, buf, sizeof(c2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + XMEMSET(buf, 0, sizeof(buf)); - wc_AesXtsFree(aes); - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i2), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p1, sizeof(p1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf, NULL, 0, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c1, buf, sizeof(c1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); #endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* partial block encryption test */ XMEMSET(cipher, 0, sizeof(cipher)); @@ -9125,75 +10467,902 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - wc_AesXtsFree(aes); + if (XMEMCMP(cp2, cipher, sizeof(cp2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf, pp, sizeof(pp), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf, NULL, 0, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(cp2, buf, sizeof(cp2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(cipher, 0, sizeof(cipher)); + ret = wc_AesXtsEncrypt(aes, cipher, pp, sizeof(pp), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(cp2, cipher, sizeof(cp2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* partial block decrypt test */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(pp, buf, sizeof(pp))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptFinal(aes, buf, cipher, sizeof(pp), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(pp, buf, sizeof(pp))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(pp, buf, sizeof(pp))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* NIST decrypt test vector */ XMEMSET(buf, 0, sizeof(buf)); ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(p1, buf, sizeof(p1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptFinal(aes, buf, c1, sizeof(c1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(p1, buf, sizeof(p1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(p1, buf, AES_BLOCK_SIZE)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* fail case with decrypting using wrong key */ XMEMSET(buf, 0, sizeof(buf)); ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(p2, buf, sizeof(p2)) == 0) /* fail case with wrong key */ ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); - /* set correct key and retest */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k2, sizeof(k2), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(p2, buf, sizeof(p2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); - -#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(5,3) +#ifndef HAVE_FIPS /* Test ciphertext stealing in-place. */ XMEMCPY(buf, p3, sizeof(p3)); - ret = wc_AesXtsSetKey(aes, k3, sizeof(k3), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncrypt(aes, buf, buf, sizeof(p3), i3, sizeof(i3)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c3, buf, sizeof(c3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i3, sizeof(i3), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p3, AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE, p3 + AES_BLOCK_SIZE, sizeof(p3) - AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c3, buf, sizeof(c3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecrypt(aes, buf, buf, sizeof(c3), i3, sizeof(i3)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(p3, buf, sizeof(p3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsDecryptInit(aes, i3, sizeof(i3), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptUpdate(aes, buf, c3, AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptFinal(aes, buf + AES_BLOCK_SIZE, c3 + AES_BLOCK_SIZE, sizeof(c3) - AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(p3, buf, sizeof(p3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#endif /* !HAVE_FIPS */ + +#if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) + { + int i; + int j; +#ifdef WOLFSSL_AESXTS_STREAM + int k; +#endif + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + large_input = (byte *)XMALLOC(LARGE_XTS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (large_input == NULL) + ERROR_OUT(WC_TEST_RET_ENC_EC(MEMORY_E), out); + #endif + + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } + +#ifdef WOLFSSL_AESXTS_STREAM + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + /* first, encrypt block by block then decrypt with a one-shot call. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsEncryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } + + /* second, encrypt with a one-shot call then decrypt block by block. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsDecryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } +#endif /* WOLFSSL_AESXTS_STREAM */ + } +#endif /* !BENCH_EMBEDDED && !HAVE_CAVIUM && + * !WOLFSSL_AFALG + */ + + out: + + #if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) && defined(WOLFSSL_SMALL_STACK) && \ + !defined(WOLFSSL_NO_MALLOC) + if (large_input) + XFREE(large_input, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #endif + + if (aes_inited) + wc_AesXtsFree(aes); + +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + if (aes) + XFREE(aes, HEAP_HINT, DYNAMIC_TYPE_AES); +#endif + + return ret; +} +#endif /* WOLFSSL_AES_128 */ + +#ifdef WOLFSSL_AES_192 +static wc_test_ret_t aes_xts_192_test(void) +{ +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + XtsAes *aes = NULL; +#else + XtsAes aes[1]; +#endif + int aes_inited = 0; + wc_test_ret_t ret = 0; + unsigned char buf[AES_BLOCK_SIZE * 2 + 8]; + unsigned char cipher[AES_BLOCK_SIZE * 2 + 8]; +#ifdef WOLFSSL_AESXTS_STREAM + struct XtsAesStreamData stream; +#endif +#if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) + #define LARGE_XTS_SZ 1024 + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + byte* large_input = NULL; + #else + byte large_input[LARGE_XTS_SZ]; + #endif +#endif + + /* 192 bit key tests */ + WOLFSSL_SMALL_STACK_STATIC unsigned char k1[] = { + 0x1e, 0xa6, 0x61, 0xc5, 0x8d, 0x94, 0x3a, 0x0e, + 0x48, 0x01, 0xe4, 0x2f, 0x4b, 0x09, 0x47, 0x14, + 0x9e, 0x7f, 0x9f, 0x8e, 0x3e, 0x68, 0xd0, 0xc7, + 0x50, 0x52, 0x10, 0xbd, 0x31, 0x1a, 0x0e, 0x7c, + 0xd6, 0xe1, 0x3f, 0xfd, 0xf2, 0x41, 0x8d, 0x8d, + 0x19, 0x11, 0xc0, 0x04, 0xcd, 0xa5, 0x8d, 0xa3 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char i1[] = { + 0x4f, 0xae, 0xf7, 0x11, 0x7c, 0xda, 0x59, 0xc6, + 0x6e, 0x4b, 0x92, 0x01, 0x3e, 0x76, 0x8a, 0xd5 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char p1[] = { + 0xeb, 0xab, 0xce, 0x95, 0xb1, 0x4d, 0x3c, 0x8d, + 0x6f, 0xb3, 0x50, 0x39, 0x07, 0x90, 0x31, 0x1c + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char pp[] = { + 0xeb, 0xab, 0xce, 0x95, 0xb1, 0x4d, 0x3c, 0x8d, + 0x6f, 0xb3, 0x50, 0x39, 0x07, 0x90, 0x31, 0x1c, + 0x6e, 0x4b, 0x92, 0x01, 0x3e, 0x76, 0x8a, 0xd5 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char c1[] = { + 0x65, 0x37, 0x15, 0x53, 0xf1, 0x98, 0xab, 0xb4, + 0xdb, 0x4e, 0xd3, 0x69, 0xdf, 0x8e, 0x3a, 0xe0 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char k2[] = { + 0xad, 0x50, 0x4b, 0x85, 0xd7, 0x51, 0xbf, 0xba, + 0x69, 0x13, 0xb4, 0xcc, 0x79, 0xb6, 0x5a, 0x62, + 0xf7, 0xf3, 0x9d, 0x36, 0x0f, 0x35, 0xb5, 0xec, + 0x4a, 0x7e, 0x95, 0xbd, 0x9b, 0xa5, 0xf2, 0xec, + 0xc1, 0xd7, 0x7e, 0xa3, 0xc3, 0x74, 0xbd, 0x4b, + 0x13, 0x1b, 0x07, 0x83, 0x87, 0xdd, 0x55, 0x5a + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char i2[] = { + 0x5c, 0xf7, 0x9d, 0xb6, 0xc5, 0xcd, 0x99, 0x1a, + 0x1c, 0x78, 0x81, 0x42, 0x24, 0x95, 0x1e, 0x84 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char p2[] = { + 0xbd, 0xc5, 0x46, 0x8f, 0xbc, 0x8d, 0x50, 0xa1, + 0x0d, 0x1c, 0x85, 0x7f, 0x79, 0x1c, 0x5c, 0xba, + 0xb3, 0x81, 0x0d, 0x0d, 0x73, 0xcf, 0x8f, 0x20, + 0x46, 0xb1, 0xd1, 0x9e, 0x7d, 0x5d, 0x8a, 0x56 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char c2[] = { + 0x6c, 0xa6, 0xb5, 0x73, 0x48, 0xf1, 0x89, 0xfa, + 0xdd, 0x80, 0x72, 0x1f, 0xb8, 0x56, 0x0c, 0xa2, + 0x35, 0xd4, 0x08, 0xbf, 0x24, 0xcb, 0xec, 0xdb, + 0x81, 0xe0, 0xe6, 0x4f, 0x3d, 0x1c, 0x5c, 0x46 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char cp2[] = { + 0xe9, 0x58, 0xfe, 0xab, 0x66, 0xb4, 0xf1, 0x79, + 0x91, 0x3f, 0x91, 0xdc, 0x6f, 0xdf, 0xd6, 0xac, + 0x65, 0x37, 0x15, 0x53, 0xf1, 0x98, 0xab, 0xb4 + }; + +#ifndef HAVE_FIPS /* FIPS requires different keys for main and tweak. */ + WOLFSSL_SMALL_STACK_STATIC unsigned char k3[] = { + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 + }; + WOLFSSL_SMALL_STACK_STATIC unsigned char i3[] = { + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + }; + WOLFSSL_SMALL_STACK_STATIC unsigned char p3[] = { + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0xff, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 + }; + WOLFSSL_SMALL_STACK_STATIC unsigned char c3[] = { + 0xa4, 0xf2, 0x71, 0x5d, 0x80, 0x60, 0x68, 0xa0, + 0x80, 0x61, 0xd7, 0xc1, 0x55, 0xc8, 0x3a, 0x2e, + 0xd7, 0xf4, 0x62, 0xaf, 0xbd, 0x2d, 0xf9, 0x5f, + 0xe8, 0xc5, 0x99, 0x3d, 0x58, 0x3c, 0xeb, 0xba, + 0x86, 0xea, 0x2c, 0x7e, 0x1f, 0xba, 0x81, 0xde + }; +#endif /* HAVE_FIPS */ + +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + if ((aes = (XtsAes *)XMALLOC(sizeof *aes, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); +#endif + + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsInit(aes, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); else aes_inited = 1; + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c2, buf, sizeof(c2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i2, sizeof(i2), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p2, AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE, p2 + AES_BLOCK_SIZE, sizeof(p2) - AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c2, buf, sizeof(c2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c2, buf, sizeof(c2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + + XMEMSET(buf, 0, sizeof(buf)); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p1, sizeof(p1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf, NULL, 0, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c1, buf, sizeof(c1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + + /* partial block encryption test */ + XMEMSET(cipher, 0, sizeof(cipher)); + ret = wc_AesXtsEncrypt(aes, cipher, pp, sizeof(pp), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(cp2, cipher, sizeof(cp2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf, pp, sizeof(pp), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf, NULL, 0, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(cp2, buf, sizeof(cp2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(cipher, 0, sizeof(cipher)); + ret = wc_AesXtsEncrypt(aes, cipher, pp, sizeof(pp), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(cp2, cipher, sizeof(cp2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + + /* partial block decrypt test */ + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(pp, buf, sizeof(pp))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptFinal(aes, buf, cipher, sizeof(pp), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(pp, buf, sizeof(pp))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(pp, buf, sizeof(pp))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + + /* NIST decrypt test vector */ + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(p1, buf, sizeof(p1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptFinal(aes, buf, c1, sizeof(c1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(p1, buf, sizeof(p1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS_AESXTS) && \ + defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(p1, buf, AES_BLOCK_SIZE)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + + /* fail case with decrypting using wrong key */ + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(p2, buf, sizeof(p2)) == 0) /* fail case with wrong key */ + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + + /* set correct key and retest */ + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(p2, buf, sizeof(p2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#ifndef HAVE_FIPS + + /* Test ciphertext stealing in-place. */ + XMEMCPY(buf, p3, sizeof(p3)); + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, buf, buf, sizeof(p3), i3, sizeof(i3)); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); @@ -9203,25 +11372,247 @@ if (XMEMCMP(c3, buf, sizeof(c3))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i3, sizeof(i3), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p3, AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE, p3 + AES_BLOCK_SIZE, sizeof(p3) - AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c3, buf, sizeof(c3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ - ret = wc_AesXtsSetKey(aes, k3, sizeof(k3), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecrypt(aes, buf, buf, sizeof(c3), i3, sizeof(i3)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(p3, buf, sizeof(p3))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); -#endif /* !HAVE_FIPS || FIPS_VERSION_GE(5,3) */ +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsDecryptInit(aes, i3, sizeof(i3), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptUpdate(aes, buf, c3, AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptFinal(aes, buf + AES_BLOCK_SIZE, c3 + AES_BLOCK_SIZE, sizeof(c3) - AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(p3, buf, sizeof(p3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + +#endif /* !HAVE_FIPS */ + +#if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) + { + int i; + int j; +#ifdef WOLFSSL_AESXTS_STREAM + int k; +#endif + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + large_input = (byte *)XMALLOC(LARGE_XTS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (large_input == NULL) + ERROR_OUT(WC_TEST_RET_ENC_EC(MEMORY_E), out); + #endif + + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } + +#ifdef WOLFSSL_AESXTS_STREAM + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + /* first, encrypt block by block then decrypt with a one-shot call. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsEncryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } + + /* second, encrypt with a one-shot call then decrypt block by block. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsDecryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } +#endif /* WOLFSSL_AESXTS_STREAM */ + } +#endif /* !BENCH_EMBEDDED && !HAVE_CAVIUM && + * !WOLFSSL_AFALG + */ out: + #if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) && defined(WOLFSSL_SMALL_STACK) && \ + !defined(WOLFSSL_NO_MALLOC) + if (large_input) + XFREE(large_input, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #endif + if (aes_inited) wc_AesXtsFree(aes); @@ -9232,11 +11623,11 @@ return ret; } -#endif /* WOLFSSL_AES_128 */ +#endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 -static int aes_xts_256_test(void) +static wc_test_ret_t aes_xts_256_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XtsAes *aes = NULL; @@ -9244,9 +11635,21 @@ XtsAes aes[1]; #endif int aes_inited = 0; - int ret = 0; + wc_test_ret_t ret = 0; unsigned char buf[AES_BLOCK_SIZE * 3]; unsigned char cipher[AES_BLOCK_SIZE * 3]; +#ifdef WOLFSSL_AESXTS_STREAM + struct XtsAesStreamData stream; +#endif +#if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) + #define LARGE_XTS_SZ 1024 + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + byte* large_input = NULL; + #else + byte large_input[LARGE_XTS_SZ]; + #endif +#endif /* 256 key tests */ WOLFSSL_SMALL_STACK_STATIC unsigned char k1[] = { @@ -9334,13 +11737,17 @@ } #endif - XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k2, sizeof(k2), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsInit(aes, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); else aes_inited = 1; + + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, buf, p2, sizeof(p2), i2, sizeof(i2)); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); @@ -9349,11 +11756,35 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(c2, buf, sizeof(c2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i2, sizeof(i2), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p2, AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE, p2 + AES_BLOCK_SIZE, sizeof(p2) - AES_BLOCK_SIZE, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c2, buf, sizeof(c2))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsEncrypt(aes, buf, p1, sizeof(p1), i1, sizeof(i1)); @@ -9365,6 +11796,32 @@ if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptUpdate(aes, buf, p1, sizeof(p1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptFinal(aes, buf, NULL, 0, &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(c1, buf, sizeof(c1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ + /* partial block encryption test */ XMEMSET(cipher, 0, sizeof(cipher)); ret = wc_AesXtsEncrypt(aes, cipher, pp, sizeof(pp), i1, sizeof(i1)); @@ -9373,17 +11830,19 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - wc_AesXtsFree(aes); /* partial block decrypt test */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecrypt(aes, buf, cipher, sizeof(pp), i1, sizeof(i1)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -9394,30 +11853,223 @@ XMEMSET(buf, 0, sizeof(buf)); ret = wc_AesXtsDecrypt(aes, buf, c1, sizeof(c1), i1, sizeof(i1)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - if (XMEMCMP(p1, buf, AES_BLOCK_SIZE)) + if (XMEMCMP(p1, buf, sizeof(p1))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); + +#ifdef WOLFSSL_AESXTS_STREAM + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptFinal(aes, buf, c1, sizeof(c1), &stream); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + if (XMEMCMP(p1, buf, sizeof(p1))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* WOLFSSL_AESXTS_STREAM */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k2, sizeof(k2), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecrypt(aes, buf, c2, sizeof(c2), i2, sizeof(i2)); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(p2, buf, sizeof(p2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) + { + int i; + int j; +#ifdef WOLFSSL_AESXTS_STREAM + int k; +#endif + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + large_input = (byte *)XMALLOC(LARGE_XTS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (large_input == NULL) + ERROR_OUT(WC_TEST_RET_ENC_EC(MEMORY_E), out); + #endif + + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecrypt(aes, large_input, large_input, j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } + +#ifdef WOLFSSL_AESXTS_STREAM + for (i = 0; i < (int)LARGE_XTS_SZ; i++) + large_input[i] = (byte)i; + + /* first, encrypt block by block then decrypt with a one-shot call. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncryptInit(aes, i1, sizeof(i1), &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsEncryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } + + /* second, encrypt with a one-shot call then decrypt block by block. */ + for (j = 16; j < (int)LARGE_XTS_SZ; j++) { + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsEncrypt(aes, large_input, large_input, (word32)j, i1, + sizeof(i1)); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AesXtsDecryptInit(aes, i1, sizeof(i1), &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + for (k = 0; k < j; k += AES_BLOCK_SIZE) { + if ((j - k) < AES_BLOCK_SIZE*2) + ret = wc_AesXtsDecryptFinal(aes, large_input + k, large_input + k, j - k, &stream); + else + ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, &stream); + #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, + WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if ((j - k) < AES_BLOCK_SIZE*2) + break; + } + + for (i = 0; i < j; i++) { + if (large_input[i] != (byte)i) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + } + } +#endif /* WOLFSSL_AESXTS_STREAM */ + } +#endif /* !BENCH_EMBEDDED && !HAVE_CAVIUM && + * !WOLFSSL_AFALG + */ + out: + #if !defined(BENCH_EMBEDDED) && !defined(HAVE_CAVIUM) && \ + !defined(WOLFSSL_AFALG) && defined(WOLFSSL_SMALL_STACK) && \ + !defined(WOLFSSL_NO_MALLOC) + if (large_input) + XFREE(large_input, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #endif + if (aes_inited) wc_AesXtsFree(aes); @@ -9433,7 +12085,7 @@ #if defined(WOLFSSL_AES_128) && defined(WOLFSSL_AES_256) /* both 128 and 256 bit key test */ -static int aes_xts_sector_test(void) +static wc_test_ret_t aes_xts_sector_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XtsAes *aes = NULL; @@ -9441,7 +12093,7 @@ XtsAes aes[1]; #endif int aes_inited = 0; - int ret = 0; + wc_test_ret_t ret = 0; unsigned char buf[AES_BLOCK_SIZE * 2]; /* 128 key tests */ @@ -9490,18 +12142,140 @@ }; word64 s2 = 187; +#if !defined(BENCH_EMBEDDED) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + /* Sector size for encrypt/decrypt consecutive sectors testcase */ + word32 sectorSz = 512; + + unsigned char data[550]; + + WOLFSSL_SMALL_STACK_STATIC unsigned char k3[] = { + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char p3[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff, + + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, + 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, + 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, + 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, + 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, + 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, + 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, + 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, + 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, + 0xfc, 0xfd, 0xfe, 0xff, + + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f + }; + + WOLFSSL_SMALL_STACK_STATIC unsigned char c3[] = { + 0xb9, 0x6b, 0x2b, 0xfd, 0x61, 0x87, 0x84, 0xd5, 0x26, 0xd2, 0x8c, 0x62, + 0x63, 0x01, 0xca, 0x46, 0xb1, 0x82, 0xfa, 0xdc, 0xbc, 0x32, 0x18, 0xe9, + 0xda, 0xe6, 0xda, 0xd1, 0x1a, 0x52, 0x77, 0xca, 0xdb, 0x0e, 0xbe, 0x37, + 0x88, 0x36, 0x1c, 0x87, 0x16, 0x60, 0xfe, 0xa8, 0x9e, 0xf6, 0x48, 0x64, + 0x94, 0x34, 0x64, 0xed, 0xf6, 0x9a, 0xc5, 0x28, 0xc9, 0xed, 0x64, 0x80, + 0x85, 0xd8, 0x93, 0xa7, 0x50, 0xb1, 0x9d, 0x2f, 0x1e, 0x34, 0xcc, 0xb4, + 0x03, 0xfb, 0x6b, 0x43, 0x21, 0xa8, 0x5b, 0xc6, 0x59, 0x13, 0xd2, 0xb5, + 0xf5, 0x7b, 0xf6, 0xb2, 0xa4, 0x7a, 0xd2, 0x50, 0x26, 0xcb, 0xa4, 0x83, + 0xc3, 0x56, 0xb0, 0xb1, 0x14, 0x34, 0x12, 0x1b, 0xea, 0x26, 0x97, 0x24, + 0x54, 0xcc, 0x32, 0x4c, 0xa4, 0xc2, 0xa3, 0x07, 0xfa, 0x30, 0xa9, 0xf0, + 0x91, 0x17, 0x60, 0x68, 0x88, 0x7f, 0x34, 0x7e, 0xbd, 0x20, 0x33, 0x95, + 0x6e, 0xc0, 0xb6, 0x2b, 0xff, 0x7e, 0x61, 0x35, 0x9a, 0x88, 0xff, 0xd9, + 0x69, 0x21, 0xe7, 0x8f, 0x45, 0x02, 0xf9, 0xd7, 0xeb, 0xa6, 0x53, 0xf1, + 0x73, 0x04, 0xf1, 0x0b, 0x85, 0xc6, 0x1f, 0x4a, 0x51, 0x2f, 0x95, 0x87, + 0x5a, 0x67, 0x37, 0xb2, 0x87, 0xf7, 0xbe, 0x2a, 0x17, 0x57, 0xca, 0xfc, + 0xdd, 0x5f, 0x37, 0x48, 0x78, 0xbd, 0xfa, 0x75, 0xc9, 0xfa, 0x86, 0x7e, + 0xc4, 0x0f, 0x60, 0x85, 0xce, 0x12, 0x44, 0x7c, 0xd9, 0xb2, 0x50, 0xd9, + 0x57, 0x85, 0xa5, 0xd7, 0x68, 0x59, 0x03, 0x09, 0x97, 0x2e, 0x8e, 0xa5, + 0xe3, 0x98, 0xac, 0x16, 0xfb, 0x6d, 0x54, 0xc5, 0x5d, 0x7a, 0x33, 0x44, + 0x0a, 0x39, 0x91, 0xcc, 0x9f, 0x67, 0xf9, 0x89, 0xbb, 0x62, 0x02, 0xc4, + 0x22, 0xec, 0xcf, 0x97, 0x69, 0x81, 0x3d, 0x00, 0xfd, 0xeb, 0x55, 0x08, + 0xa2, 0xff, 0x97, 0xaa, 0x79, 0xde, 0x3c, 0x8a, 0x78, 0x71, 0x73, 0xa2, + 0x98, 0x2f, 0xd8, 0x5c, 0x62, 0x1c, 0x5c, 0x23, 0x0a, 0xd1, 0xf1, 0x81, + 0x8a, 0x12, 0xe7, 0x4d, 0xdd, 0x4f, 0xd4, 0xf1, 0xe8, 0x0f, 0x25, 0x79, + 0x45, 0x4a, 0x49, 0x49, 0x7e, 0x56, 0x91, 0x4e, 0xaa, 0xba, 0x18, 0xe1, + 0xe4, 0xbe, 0x21, 0xdc, 0x58, 0x60, 0x6f, 0x6a, 0x7f, 0xdc, 0x5e, 0x74, + 0x47, 0xbf, 0xeb, 0x84, 0xc4, 0x1e, 0x5a, 0x61, 0x64, 0xc8, 0x63, 0x68, + 0xfa, 0x17, 0x9c, 0xac, 0x60, 0x1c, 0xa5, 0x6e, 0x00, 0x21, 0x93, 0x3c, + 0xd7, 0xbb, 0x73, 0x45, 0xf7, 0x34, 0x81, 0x6c, 0xfa, 0xf2, 0x33, 0xfd, + 0xb1, 0x40, 0x30, 0x6b, 0x30, 0xd1, 0x83, 0x5e, 0x2e, 0x7a, 0xce, 0xa6, + 0x12, 0x2a, 0x15, 0x03, 0x78, 0x29, 0xb9, 0x07, 0xae, 0xe7, 0xc2, 0x78, + 0x74, 0x72, 0xa5, 0x0e, 0x6b, 0x1f, 0x78, 0xf2, 0x5a, 0x69, 0xb6, 0x2b, + 0x99, 0x94, 0x1f, 0x89, 0xd1, 0x21, 0x14, 0x4a, 0x54, 0xab, 0x5a, 0x9f, + 0xaa, 0xa7, 0x96, 0x0a, 0x21, 0xce, 0x30, 0xb6, 0x70, 0x81, 0xe9, 0xd3, + 0x71, 0xc0, 0xf1, 0x15, 0xe2, 0xf6, 0xd3, 0xcc, 0x41, 0x15, 0x9d, 0xd5, + 0xa3, 0xa4, 0xe0, 0xf8, 0x62, 0xc4, 0x76, 0x65, 0x63, 0x89, 0xa7, 0xe2, + 0xfb, 0xf5, 0xc9, 0x80, 0x15, 0x5b, 0xc1, 0x59, 0xb2, 0xd0, 0x01, 0x3a, + 0xf9, 0xab, 0x5b, 0x79, 0x54, 0xed, 0x6b, 0xf9, 0x1d, 0x9d, 0x87, 0x63, + 0x80, 0x4f, 0xec, 0x9c, 0x4f, 0xad, 0x97, 0x04, 0xff, 0x62, 0x4a, 0x17, + 0xc0, 0x09, 0x2a, 0x2c, 0x23, 0x4b, 0xc3, 0xb6, 0x6d, 0xed, 0xdb, 0x1a, + 0x6f, 0x56, 0x2b, 0x78, 0x92, 0x3a, 0x5c, 0x7f, 0xb2, 0x63, 0xd3, 0xd5, + 0x1a, 0xbe, 0xc2, 0x34, 0xc8, 0xad, 0x36, 0xb7, 0x12, 0xb8, 0xe1, 0xb7, + 0x52, 0x7f, 0x16, 0x84, 0x2c, 0x47, 0x7e, 0xf2, 0xa5, 0x36, 0x2e, 0xad, + 0xe7, 0xbb, 0xc0, 0x6f, 0x27, 0x8e, 0x41, 0x08, 0x75, 0xe5, 0xff, 0xde, + 0x08, 0x9f, 0x8c, 0x91, 0xba, 0xc9, 0x9d, 0x9f, 0x27, 0x90, 0x50, 0x44, + 0x24, 0xe7, 0x3d, 0x6f + }; + + word64 s3 = 0x000000ffffffffff; +#endif + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((aes = (XtsAes *)XMALLOC(sizeof *aes, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); #endif - XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsInit(aes, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); else aes_inited = 1; + + XMEMSET(buf, 0, sizeof(buf)); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncryptSector(aes, buf, p1, sizeof(p1), s1); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); @@ -9510,28 +12284,28 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(c1, buf, AES_BLOCK_SIZE)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); /* decrypt test */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecryptSector(aes, buf, c1, sizeof(c1), s1); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(p1, buf, AES_BLOCK_SIZE)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); /* 256 bit key tests */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k2, sizeof(k2), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_ENCRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsEncryptSector(aes, buf, p2, sizeof(p2), s2); @@ -9542,24 +12316,64 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(c2, buf, sizeof(c2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); /* decrypt test */ XMEMSET(buf, 0, sizeof(buf)); - ret = wc_AesXtsSetKey(aes, k2, sizeof(k2), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k2, sizeof(k2), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecryptSector(aes, buf, c2, sizeof(c2), s2); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(p2, buf, sizeof(p2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - out: +#if !defined(BENCH_EMBEDDED) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + /* encrypt consecutive sectors test */ + XMEMSET(data, 0, sizeof(buf)); + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsEncryptConsecutiveSectors(aes, data, p3, + sizeof(p3), s3, sectorSz); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(c3, data, sizeof(c3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + + /* decrypt consecutive sectors test */ + XMEMSET(data, 0, sizeof(buf)); + ret = wc_AesXtsSetKeyNoInit(aes, k3, sizeof(k3), AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesXtsDecryptConsecutiveSectors(aes, data, c3, + sizeof(c3), s3, sectorSz); +#if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else + ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(p3, data, sizeof(p3))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#endif /* !BENCH_EMBEDDED && (!HAVE_FIPS || FIPS_VERSION_GE(5, 3)) */ + +out: if (aes_inited) wc_AesXtsFree(aes); @@ -9576,7 +12390,7 @@ #ifdef WOLFSSL_AES_128 /* testing of bad arguments */ -static int aes_xts_args_test(void) +static wc_test_ret_t aes_xts_args_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XtsAes *aes = NULL; @@ -9584,7 +12398,7 @@ XtsAes aes[1]; #endif int aes_inited = 0; - int ret; + wc_test_ret_t ret; unsigned char buf[AES_BLOCK_SIZE * 2]; /* 128 key tests */ @@ -9611,20 +12425,22 @@ ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); #endif - if (wc_AesXtsSetKey(NULL, k1, sizeof(k1), AES_ENCRYPTION, - HEAP_HINT, devId) == 0) + ret = wc_AesXtsInit(aes, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + else + aes_inited = 1; + + if (wc_AesXtsSetKeyNoInit(NULL, k1, sizeof(k1), AES_ENCRYPTION) == 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - if (wc_AesXtsSetKey(aes, NULL, sizeof(k1), AES_ENCRYPTION, - HEAP_HINT, devId) == 0) + if (wc_AesXtsSetKeyNoInit(aes, NULL, sizeof(k1), AES_ENCRYPTION) == 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); /* encryption operations */ - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_ENCRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_ENCRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - else - aes_inited = 1; + ret = wc_AesXtsEncryptSector(NULL, buf, p1, sizeof(p1), s1); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); @@ -9638,23 +12454,29 @@ #endif if (ret == 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesXtsFree(aes); /* decryption operations */ - ret = wc_AesXtsSetKey(aes, k1, sizeof(k1), AES_DECRYPTION, - HEAP_HINT, devId); + ret = wc_AesXtsSetKeyNoInit(aes, k1, sizeof(k1), AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_AesXtsDecryptSector(NULL, buf, c1, sizeof(c1), s1); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret == 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); ret = wc_AesXtsDecryptSector(aes, NULL, c1, sizeof(c1), s1); #if defined(WOLFSSL_ASYNC_CRYPT) + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + ret = wc_AsyncWait(ret, &aes->aes_decrypt.asyncDev, WC_ASYNC_FLAG_NONE); + #else ret = wc_AsyncWait(ret, &aes->aes.asyncDev, WC_ASYNC_FLAG_NONE); + #endif #endif if (ret == 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); @@ -9674,14 +12496,14 @@ return ret; } #endif /* WOLFSSL_AES_128 */ -#endif /* WOLFSSL_AES_XTS */ +#endif /* WOLFSSL_AES_XTS && (!HAVE_FIPS || FIPS_VERSION_GE(5,3)) */ #if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) -static int aes_cbc_test(void) +static wc_test_ret_t aes_cbc_test(void) { byte cipher[AES_BLOCK_SIZE]; byte plain[AES_BLOCK_SIZE]; - int ret; + wc_test_ret_t ret; WOLFSSL_SMALL_STACK_STATIC const byte msg[] = { /* "Now is the time for all " w/o trailing 0 */ 0x6e,0x6f,0x77,0x20,0x69,0x73,0x20,0x74, 0x68,0x65,0x20,0x74,0x69,0x6d,0x65,0x20, @@ -9722,8 +12544,10 @@ #endif #if defined(HAVE_AES_ECB) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) -static int aesecb_test(void) +static wc_test_ret_t aesecb_test(void) { + wc_test_ret_t ret = 0; +#if defined(WOLFSSL_AES_256) #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = (Aes *)XMALLOC(sizeof *enc, HEAP_HINT, DYNAMIC_TYPE_AES); #else @@ -9738,11 +12562,9 @@ Aes dec[1]; #endif int dec_inited = 0; - byte plain [AES_BLOCK_SIZE * 4]; + byte plain[AES_BLOCK_SIZE * 4]; #endif /* HAVE_AES_DECRYPT */ - int ret = 0; -#if defined(WOLFSSL_AES_256) { WOLFSSL_SMALL_STACK_STATIC const byte niPlain[] = { @@ -9784,17 +12606,85 @@ if (XMEMCMP(cipher, niCipher, AES_BLOCK_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + XMEMSET(cipher, 0, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesSetKey(enc, niKey, sizeof(niKey), cipher, AES_ENCRYPTION); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesEcbEncrypt(enc, cipher, niPlain, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + if (XMEMCMP(cipher, niCipher, AES_BLOCK_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + + XMEMSET(cipher, 0, AES_BLOCK_SIZE); + ret = wc_AesEcbEncrypt(enc, cipher, niPlain, AES_BLOCK_SIZE); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + if (XMEMCMP(cipher, niCipher, AES_BLOCK_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + + XMEMSET(cipher, 0, AES_BLOCK_SIZE); + ret = wc_AesSetKey(enc, niKey, sizeof(niKey), cipher, AES_ENCRYPTION); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesEcbEncrypt(enc, cipher, niPlain, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + if (XMEMCMP(cipher, niCipher, AES_BLOCK_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + +#ifdef HAVE_AES_DECRYPT XMEMSET(plain, 0, AES_BLOCK_SIZE); ret = wc_AesSetKey(dec, niKey, sizeof(niKey), plain, AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (wc_AesEcbDecrypt(dec, plain, niCipher, AES_BLOCK_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_AesEcbDecrypt(dec, plain, niCipher, AES_BLOCK_SIZE); if (XMEMCMP(plain, niPlain, AES_BLOCK_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - } +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + XMEMSET(plain, 0, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesSetKey(dec, niKey, sizeof(niKey), plain, AES_DECRYPTION); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesEcbDecrypt(dec, plain, niCipher, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + if (XMEMCMP(plain, niPlain, AES_BLOCK_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + + XMEMSET(plain, 0, AES_BLOCK_SIZE); + ret = wc_AesEcbDecrypt(dec, plain, niCipher, AES_BLOCK_SIZE); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + if (XMEMCMP(plain, niPlain, AES_BLOCK_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + + XMEMSET(plain, 0, AES_BLOCK_SIZE); + ret = wc_AesSetKey(dec, niKey, sizeof(niKey), plain, AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesEcbDecrypt(dec, plain, niCipher, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + if (XMEMCMP(plain, niPlain, AES_BLOCK_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif +#endif /* HAVE_AES_DECRYPT */ + } out: #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -9826,9 +12716,9 @@ #endif /* HAVE_AES_ECB */ #ifdef WOLFSSL_AES_COUNTER -static int aesctr_test(Aes* enc, Aes* dec, byte* cipher, byte* plain) +static wc_test_ret_t aesctr_test(Aes* enc, Aes* dec, byte* cipher, byte* plain) { - int ret = 0; + wc_test_ret_t ret = 0; /* test vectors from "Recommendation for Block Cipher Modes of * Operation" NIST Special Publication 800-38A */ @@ -9851,7 +12741,7 @@ 0xad,0x2b,0x41,0x7b,0xe6,0x6c,0x37,0x10 }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctrIvWrap32[] = { 0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff, @@ -9888,7 +12778,7 @@ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctrIvWrap128_2[] = { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, @@ -9921,7 +12811,7 @@ 0x79,0x21,0x70,0xa0,0xf3,0x00,0x9c,0xee }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctr128Wrap32Cipher[] = { 0xb3,0x8b,0x58,0xbc,0xce,0xf4,0x71,0x78, @@ -10005,7 +12895,7 @@ 0xd3,0xda,0xe1,0x5b,0x04,0xbb,0x35,0x2f, 0xa0,0xf5,0x9f,0xeb,0xfc,0xb4,0xda,0x3e }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctr128Wrap128_2CipherLong[] = { 0xba,0x76,0xaa,0x54,0xd5,0xb5,0x60,0x67, @@ -10038,7 +12928,7 @@ 0x5a,0x97,0xda,0xec,0x58,0xc6,0xb0,0x50 }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctr192Wrap32Cipher[] = { 0x28,0xaa,0xfa,0x90,0x72,0x74,0x86,0xaf, @@ -10122,7 +13012,7 @@ 0x8c,0x68,0xa7,0xd9,0x57,0xab,0x09,0x0f, 0x01,0xc4,0x4e,0x62,0xaf,0xc2,0xdf,0x1a }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctr192Wrap128_2CipherLong[] = { 0x88,0x0a,0x26,0x4e,0xa8,0x26,0x21,0xe0, @@ -10155,7 +13045,7 @@ 0x13,0xc2,0xdd,0x08,0x45,0x79,0x41,0xa6 }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctr256Wrap32Cipher[] = { 0xb0,0xa8,0xc0,0x65,0x85,0x20,0x0d,0x5c, @@ -10239,7 +13129,7 @@ 0x4b,0x45,0x7c,0xd6,0x8a,0xcc,0xda,0x4a, 0x89,0xfa,0x23,0x6c,0x06,0xbf,0x26,0x05 }; -#ifdef WOLFSSL_ARMASM +#if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) WOLFSSL_SMALL_STACK_STATIC const byte ctr256Wrap128_2CipherLong[] = { 0x24,0x5c,0x09,0xa0,0x3b,0x1a,0x5a,0x94, @@ -10274,7 +13164,7 @@ { ctr128Key, (int)sizeof(ctr128Key), ctrIvWrap128, ctrPlain, (int)sizeof(ctr128Wrap128CipherLong), ctr128Wrap128CipherLong }, - #ifdef WOLFSSL_ARMASM + #if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) { ctr128Key, (int)sizeof(ctr128Key), ctrIvWrap128_2, ctrPlain, (int)sizeof(ctr128Wrap128_2CipherLong), ctr128Wrap128_2CipherLong }, @@ -10316,7 +13206,7 @@ { ctr192Key, (int)sizeof(ctr192Key), ctrIvWrap128, ctrPlain, (int)sizeof(ctr192Wrap128CipherLong), ctr192Wrap128CipherLong }, - #ifdef WOLFSSL_ARMASM + #if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) { ctr192Key, (int)sizeof(ctr192Key), ctrIvWrap128_2, ctrPlain, (int)sizeof(ctr192Wrap128_2CipherLong), ctr192Wrap128_2CipherLong }, @@ -10358,7 +13248,7 @@ { ctr256Key, (int)sizeof(ctr256Key), ctrIvWrap128, ctrPlain, (int)sizeof(ctr256Wrap128CipherLong), ctr256Wrap128CipherLong }, - #ifdef WOLFSSL_ARMASM + #if defined(WOLFSSL_ARMASM) || defined(WOLFSSL_RISCV_ASM) { ctr256Key, (int)sizeof(ctr256Key), ctrIvWrap128_2, ctrPlain, (int)sizeof(ctr256Wrap128_2CipherLong), ctr256Wrap128_2CipherLong }, @@ -10393,16 +13283,93 @@ for (i = 0; i < AES_CTR_TEST_LEN; i++) { if (testVec[i].key != NULL) { + ret = wc_AesSetKeyDirect(enc, testVec[i].key, (word32)testVec[i].keySz, + testVec[i].iv, AES_ENCRYPTION); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + /* Ctr only uses encrypt, even on key setup */ + ret = wc_AesSetKeyDirect(dec, testVec[i].key, (word32)testVec[i].keySz, + testVec[i].iv, AES_ENCRYPTION); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + } + + ret = wc_AesCtrEncrypt(enc, cipher, testVec[i].plain, (word32)testVec[i].len); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + ret = wc_AesCtrEncrypt(dec, plain, cipher, (word32)testVec[i].len); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + + if (XMEMCMP(plain, ctrPlain, (size_t)testVec[i].len)) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } +#if !(FIPS_VERSION_EQ(2,0) && defined(WOLFSSL_ARMASM)) + if (XMEMCMP(cipher, testVec[i].cipher, (size_t)testVec[i].len)) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } +#endif + } + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + for (i = 0; i < AES_CTR_TEST_LEN; i++) { + if (testVec[i].key != NULL) { + ret = wc_AesSetKeyDirect(enc, testVec[i].key, testVec[i].keySz, + testVec[i].iv, AES_ENCRYPTION); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + /* Ctr only uses encrypt, even on key setup */ + ret = wc_AesSetKeyDirect(dec, testVec[i].key, testVec[i].keySz, + testVec[i].iv, AES_ENCRYPTION); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + } + + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesCtrEncrypt(enc, cipher, testVec[i].plain, testVec[i].len); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesCtrEncrypt(dec, plain, cipher, testVec[i].len); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + + if (XMEMCMP(plain, ctrPlain, testVec[i].len)) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } +#if !(FIPS_VERSION_EQ(2,0) && defined(WOLFSSL_ARMASM)) + if (XMEMCMP(cipher, testVec[i].cipher, testVec[i].len)) { + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } +#endif + } + + for (i = 0; i < AES_CTR_TEST_LEN; i++) { + if (testVec[i].key != NULL) { + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); ret = wc_AesSetKeyDirect(enc, testVec[i].key, testVec[i].keySz, testVec[i].iv, AES_ENCRYPTION); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_I(i), out); } /* Ctr only uses encrypt, even on key setup */ + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); ret = wc_AesSetKeyDirect(dec, testVec[i].key, testVec[i].keySz, testVec[i].iv, AES_ENCRYPTION); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); if (ret != 0) { - ERROR_OUT(WC_TEST_RET_ENC_EC(i), out); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); } } @@ -10425,13 +13392,99 @@ #endif } +#endif /* DEBUG_VECTOR_REGISTER_ACCESS && WC_C_DYNAMIC_FALLBACK */ + + out: return ret; } #endif /* WOLFSSL_AES_COUNTER */ +#ifdef HAVE_AES_ECB +static wc_test_ret_t aes_ecb_test(Aes* enc, Aes* dec, byte* cipher, byte* plain) +{ + wc_test_ret_t ret = 0; + + WOLFSSL_SMALL_STACK_STATIC const byte key_128[] = "0123456789abcdef "; + WOLFSSL_SMALL_STACK_STATIC const byte key_192[] = + "0123456789abcdef01234567 "; + WOLFSSL_SMALL_STACK_STATIC const byte key_256[] = + "0123456789abcdef0123456789abcdef "; + WOLFSSL_SMALL_STACK_STATIC const byte iv[] = "1234567890abcdef "; + WOLFSSL_SMALL_STACK_STATIC const byte msg[] = { + 0x6e, 0x6f, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20 + }; + WOLFSSL_SMALL_STACK_STATIC const byte verify_ecb_128[AES_BLOCK_SIZE] = { + 0xd0, 0xc9, 0xd9, 0xc9, 0x40, 0xe8, 0x97, 0xb6, + 0xc8, 0x8c, 0x33, 0x3b, 0xb5, 0x8f, 0x85, 0xd1 + }; + WOLFSSL_SMALL_STACK_STATIC const byte verify_ecb_192[AES_BLOCK_SIZE] = { + 0x06, 0x57, 0xee, 0x78, 0x3f, 0x96, 0x00, 0xb1, + 0xec, 0x76, 0x94, 0x30, 0x29, 0xbe, 0x15, 0xab + }; + WOLFSSL_SMALL_STACK_STATIC const byte verify_ecb_256[AES_BLOCK_SIZE] = { + 0xcd, 0xf2, 0x81, 0x3e, 0x73, 0x3e, 0xf7, 0x33, + 0x3d, 0x18, 0xfd, 0x41, 0x85, 0x37, 0x04, 0x82 + }; + + int i; + struct { + const byte* key; + int keySz; + const byte* iv; + const byte* verify; + } testVec[] = { + { key_128, 16, iv, verify_ecb_128 }, + { key_192, 24, iv, verify_ecb_192 }, + { key_256, 32, iv, verify_ecb_256 }, + }; + #define AES_ECB_TEST_LEN (int)(sizeof(testVec) / sizeof(*testVec)) + + for (i = 0; i < AES_ECB_TEST_LEN; i++) { + ret = wc_AesSetKey(enc, testVec[i].key, testVec[i].keySz, testVec[i].iv, + AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + #ifdef HAVE_AES_DECRYPT + ret = wc_AesSetKey(dec, testVec[i].key, testVec[i].keySz, testVec[i].iv, + AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + #endif -WOLFSSL_TEST_SUBROUTINE int aes_test(void) + XMEMSET(cipher, 0, AES_BLOCK_SIZE * 4); + ret = wc_AesEcbEncrypt(enc, cipher, msg, AES_BLOCK_SIZE); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &enc->asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(cipher, testVec[i].verify, AES_BLOCK_SIZE)) { + WOLFSSL_MSG("aes_test cipher vs verify_ecb mismatch!"); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + } + #ifdef HAVE_AES_DECRYPT + XMEMSET(plain, 0, AES_BLOCK_SIZE * 4); + ret = wc_AesEcbDecrypt(dec, plain, cipher, AES_BLOCK_SIZE); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(plain, msg, AES_BLOCK_SIZE)) + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + #endif /* HAVE_AES_DECRYPT */ + (void)dec; + (void)plain; + } + +out: + return ret; +} +#endif + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_test(void) { #if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_DIRECT) #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -10441,7 +13494,7 @@ #endif int enc_inited = 0; byte cipher[AES_BLOCK_SIZE * 4]; -#ifdef HAVE_AES_DECRYPT +#if defined(HAVE_AES_DECRYPT) || defined(WOLFSSL_AES_COUNTER) #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *dec = (Aes *)XMALLOC(sizeof *dec, HEAP_HINT, DYNAMIC_TYPE_AES); #else @@ -10449,9 +13502,9 @@ #endif int dec_inited = 0; byte plain [AES_BLOCK_SIZE * 4]; -#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_DECRYPT || WOLFSSL_AES_COUNTER */ #endif /* HAVE_AES_CBC || WOLFSSL_AES_COUNTER || WOLFSSL_AES_DIRECT */ - int ret = 0; + wc_test_ret_t ret = 0; #ifdef HAVE_AES_CBC #ifdef WOLFSSL_AES_128 @@ -10466,20 +13519,27 @@ 0x95,0x94,0x92,0x57,0x5f,0x42,0x81,0x53, 0x2c,0xcc,0x9d,0x46,0x77,0xa2,0x33,0xcb }; - - WOLFSSL_SMALL_STACK_STATIC const byte key[] = "0123456789abcdef "; /* align */ + #ifdef HAVE_RENESAS_SYNC + const byte *key = + (byte*)guser_PKCbInfo.wrapped_key_aes128; + #else + WOLFSSL_SMALL_STACK_STATIC const + byte key[] = "0123456789abcdef "; /* align */ + #endif WOLFSSL_SMALL_STACK_STATIC const byte iv[] = "1234567890abcdef "; /* align */ + WOLFSSL_ENTER("aes_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) -#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_DIRECT) +#if defined(HAVE_AES_CBC) || defined(WOLFSSL_AES_COUNTER) || \ + defined(WOLFSSL_AES_DIRECT) if (enc == NULL) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); #endif -#if defined(HAVE_AES_DECRYPT) || defined(WOLFSSL_AES_COUNTER) || defined(WOLFSSL_AES_DIRECT) +#if defined(HAVE_AES_DECRYPT) || defined(WOLFSSL_AES_COUNTER) if (dec == NULL) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); #endif -#endif +#endif /* WOLFSSL_SMALL_STACK && !WOLFSSL_NO_MALLOC */ ret = wc_AesInit(enc, HEAP_HINT, devId); if (ret != 0) @@ -10492,10 +13552,16 @@ dec_inited = 1; #endif +#ifdef HAVE_AES_ECB + ret = aes_ecb_test(enc, dec, cipher, plain); + if (ret != 0) + return ret; +#endif + ret = wc_AesSetKey(enc, key, AES_BLOCK_SIZE, iv, AES_ENCRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); -#if defined(HAVE_AES_DECRYPT) || defined(WOLFSSL_AES_COUNTER) +#ifdef HAVE_AES_DECRYPT ret = wc_AesSetKey(dec, key, AES_BLOCK_SIZE, iv, AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -10514,14 +13580,23 @@ #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); #endif - if (ret != 0) + if (ret != 0) { + WOLFSSL_MSG("failed wc_AesCbcDecrypt"); ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + } - if (XMEMCMP(plain, msg, AES_BLOCK_SIZE)) + if (XMEMCMP(plain, msg, AES_BLOCK_SIZE)) { + WOLFSSL_MSG("wc_AesCbcDecrypt failed plain compare"); ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } #endif /* HAVE_AES_DECRYPT */ - if (XMEMCMP(cipher, verify, AES_BLOCK_SIZE)) + /* skipped because wrapped key use in case of renesas sm */ + #ifndef HAVE_RENESAS_SYNC + if (XMEMCMP(cipher, verify, AES_BLOCK_SIZE)) { + WOLFSSL_MSG("wc_AesCbcDecrypt failed cipher-verify compare"); ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + #endif #endif /* WOLFSSL_AES_128 */ #if defined(WOLFSSL_AESNI) && defined(HAVE_AES_DECRYPT) @@ -10641,6 +13716,57 @@ break; } +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + /* Iterate from one AES_BLOCK_SIZE of bigMsg through the whole + * message by AES_BLOCK_SIZE for each size of AES key. */ + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + for (keySz = 16; keySz <= 32; keySz += 8) { + for (msgSz = AES_BLOCK_SIZE; + msgSz <= sizeof(bigMsg); + msgSz += AES_BLOCK_SIZE) { + + XMEMSET(bigCipher, 0, sizeof(bigMsg)); + XMEMSET(bigPlain, 0, sizeof(bigMsg)); + ret = wc_AesSetKey(enc, bigKey, keySz, iv, AES_ENCRYPTION); + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + break; + } + ret = wc_AesSetKey(dec, bigKey, keySz, iv, AES_DECRYPTION); + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + break; + } + + ret = wc_AesCbcEncrypt(enc, bigCipher, bigMsg, msgSz); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &enc->asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + break; + } + + ret = wc_AesCbcDecrypt(dec, bigPlain, bigCipher, msgSz); + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); + #endif + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + break; + } + + if (XMEMCMP(bigPlain, bigMsg, msgSz)) { + ret = WC_TEST_RET_ENC_NC; + break; + } + } + if (ret != 0) + break; + } + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); +#endif /* DEBUG_VECTOR_REGISTER_ACCESS && WC_C_DYNAMIC_FALLBACK */ + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XFREE(bigCipher, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); XFREE(bigPlain, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -10652,7 +13778,7 @@ #endif /* WOLFSSL_AESNI && HAVE_AES_DECRYPT */ /* Test of AES IV state with encrypt/decrypt */ -#ifdef WOLFSSL_AES_128 +#if defined(WOLFSSL_AES_128) && !defined(HAVE_RENESAS_SYNC) { /* Test Vector from "NIST Special Publication 800-38A, 2001 Edition" * https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38a.pdf @@ -10692,9 +13818,10 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + #ifndef HAVE_RENESAS_SYNC if (XMEMCMP(cipher, verify2, AES_BLOCK_SIZE)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - + #endif ret = wc_AesCbcEncrypt(enc, cipher + AES_BLOCK_SIZE, msg2 + AES_BLOCK_SIZE, AES_BLOCK_SIZE); #if defined(WOLFSSL_ASYNC_CRYPT) @@ -10728,12 +13855,13 @@ if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(plain + AES_BLOCK_SIZE, msg2 + AES_BLOCK_SIZE, - AES_BLOCK_SIZE)) + AES_BLOCK_SIZE)) { + WOLFSSL_MSG("wc_AesCbcDecrypt failed plain-msg2 compare"); ERROR_OUT(WC_TEST_RET_ENC_NC, out); - + } #endif /* HAVE_AES_DECRYPT */ } -#endif /* WOLFSSL_AES_128 */ +#endif /* WOLFSSL_AES_128 && !HAVE_RENESAS_SYNC */ #endif /* HAVE_AES_CBC */ #ifdef WOLFSSL_AES_COUNTER @@ -10781,6 +13909,7 @@ if (XMEMCMP(cipher, niCipher, AES_BLOCK_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#ifdef HAVE_AES_DECRYPT XMEMSET(plain, 0, AES_BLOCK_SIZE); ret = wc_AesSetKey(dec, niKey, sizeof(niKey), plain, AES_DECRYPTION); if (ret != 0) @@ -10797,56 +13926,22 @@ #endif if (XMEMCMP(plain, niPlain, AES_BLOCK_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* HAVE_AES_DECRYPT */ } #endif /* WOLFSSL_AES_DIRECT && WOLFSSL_AES_256 */ +#ifndef HAVE_RENESAS_SYNC ret = aes_key_size_test(); if (ret != 0) goto out; - -#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) - ret = aes_cbc_test(); - if (ret != 0) - goto out; #endif -#if defined(WOLFSSL_AES_XTS) - #ifdef WOLFSSL_AES_128 - ret = aes_xts_128_test(); - if (ret != 0) - goto out; - #endif - #ifdef WOLFSSL_AES_256 - ret = aes_xts_256_test(); - if (ret != 0) - goto out; - #endif - #if defined(WOLFSSL_AES_128) && defined(WOLFSSL_AES_256) - ret = aes_xts_sector_test(); - if (ret != 0) - goto out; - #endif - #ifdef WOLFSSL_AES_128 - ret = aes_xts_args_test(); - if (ret != 0) - goto out; - #endif -#endif - -#if defined(WOLFSSL_AES_CFB) - ret = aescfb_test(); - if (ret != 0) - goto out; -#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) - ret = aescfb1_test(); - if (ret != 0) - goto out; - - ret = aescfb8_test(); +#if defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_128) && \ + !defined(HAVE_RENESAS_SYNC) + ret = aes_cbc_test(); if (ret != 0) goto out; #endif -#endif #if defined(HAVE_AES_ECB) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) ret = aesecb_test(); @@ -10868,7 +13963,7 @@ wc_AesFree(enc); #endif (void)cipher; -#ifdef HAVE_AES_DECRYPT +#if defined(HAVE_AES_DECRYPT) || defined(WOLFSSL_AES_COUNTER) #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if (dec) { if (dec_inited) @@ -10880,21 +13975,82 @@ wc_AesFree(dec); #endif (void)plain; -#endif /* HAVE_AES_DECRYPT */ +#endif /* HAVE_AES_DECRYPT || WOLFSSL_AES_COUNTER */ #endif /* HAVE_AES_CBC || WOLFSSL_AES_COUNTER || WOLFSSL_AES_DIRECT */ return ret; } +#if defined(WOLFSSL_AES_CFB) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_cfb_test(void) +{ + int ret; + WOLFSSL_ENTER("aes_cfb_test"); + + ret = aescfb_test_0(); + if (ret != 0) + return ret; +#if !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) + ret = aescfb1_test(); + if (ret != 0) + return ret; + + ret = aescfb8_test(); + if (ret != 0) + return ret; +#endif + return 0; +} +#endif + +#if defined(WOLFSSL_AES_XTS) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_xts_test(void) +{ + int ret = 0; + WOLFSSL_ENTER("aes_xts_test"); + + #ifdef WOLFSSL_AES_128 + ret = aes_xts_128_test(); + if (ret != 0) + return ret; + #endif + + #ifdef WOLFSSL_AES_192 + ret = aes_xts_192_test(); + if (ret != 0) + return ret; + #endif + + #ifdef WOLFSSL_AES_256 + ret = aes_xts_256_test(); + if (ret != 0) + return ret; + #endif + #if defined(WOLFSSL_AES_128) && defined(WOLFSSL_AES_256) + ret = aes_xts_sector_test(); + if (ret != 0) + return ret; + #endif + #ifdef WOLFSSL_AES_128 + ret = aes_xts_args_test(); + if (ret != 0) + return ret; + #endif + return 0; +} +#endif + #ifdef WOLFSSL_AES_192 -WOLFSSL_TEST_SUBROUTINE int aes192_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes192_test(void) { + wc_test_ret_t ret = 0; #ifdef HAVE_AES_CBC #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = NULL; #else Aes enc[1]; #endif + int enc_inited = 0; byte cipher[AES_BLOCK_SIZE]; #ifdef HAVE_AES_DECRYPT #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -10904,10 +14060,10 @@ #endif byte plain[AES_BLOCK_SIZE]; #endif -#endif /* HAVE_AES_CBC */ - int ret = 0; +#ifdef HAVE_AES_DECRYPT + int dec_inited = 0; +#endif -#ifdef HAVE_AES_CBC /* Test vectors from NIST Special Publication 800-38A, 2001 Edition * Appendix F.2.3 */ @@ -10922,15 +14078,16 @@ 0x71,0x78,0x18,0x3a,0x9f,0xa0,0x71,0xe8 }; - WOLFSSL_SMALL_STACK_STATIC byte key[] = { + WOLFSSL_SMALL_STACK_STATIC const byte key[] = { 0x8e,0x73,0xb0,0xf7,0xda,0x0e,0x64,0x52, 0xc8,0x10,0xf3,0x2b,0x80,0x90,0x79,0xe5, 0x62,0xf8,0xea,0xd2,0x52,0x2c,0x6b,0x7b }; - WOLFSSL_SMALL_STACK_STATIC byte iv[] = { + WOLFSSL_SMALL_STACK_STATIC const byte iv[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; + WOLFSSL_ENTER("aes192_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((enc = (Aes *)XMALLOC(sizeof *enc, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) @@ -10944,10 +14101,12 @@ ret = wc_AesInit(enc, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + enc_inited = 1; #ifdef HAVE_AES_DECRYPT ret = wc_AesInit(dec, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + dec_inited = 1; #endif ret = wc_AesSetKey(enc, key, (int) sizeof(key), iv, AES_ENCRYPTION); @@ -10966,6 +14125,9 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(cipher, verify, (int) sizeof(cipher))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + #ifdef HAVE_AES_DECRYPT XMEMSET(plain, 0, AES_BLOCK_SIZE); ret = wc_AesCbcDecrypt(dec, plain, cipher, (int) sizeof(cipher)); @@ -10975,25 +14137,31 @@ if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(plain, msg, (int) sizeof(plain))) { + WOLFSSL_MSG("failed wc_AesCbcDecrypt plain-msg compare"); ERROR_OUT(WC_TEST_RET_ENC_NC, out); } #endif - if (XMEMCMP(cipher, verify, (int) sizeof(cipher))) - ERROR_OUT(WC_TEST_RET_ENC_NC, out); - - wc_AesFree(enc); -#ifdef HAVE_AES_DECRYPT - wc_AesFree(dec); -#endif - out: #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) - if (enc) + if (enc) { + if (enc_inited) + wc_AesFree(enc); XFREE(enc, HEAP_HINT, DYNAMIC_TYPE_AES); + } #ifdef HAVE_AES_DECRYPT - if (dec) + if (dec) { + if (dec_inited) + wc_AesFree(dec); XFREE(dec, HEAP_HINT, DYNAMIC_TYPE_AES); + } +#endif +#else /* !WOLFSSL_SMALL_STACK || WOLFSSL_NO_MALLOC */ + if (enc_inited) + wc_AesFree(enc); +#ifdef HAVE_AES_DECRYPT + if (dec_inited) + wc_AesFree(dec); #endif #endif #endif /* HAVE_AES_CBC */ @@ -11003,7 +14171,7 @@ #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 -WOLFSSL_TEST_SUBROUTINE int aes256_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes256_test(void) { #ifdef HAVE_AES_CBC #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -11011,6 +14179,7 @@ #else Aes enc[1]; #endif + int enc_inited = 0; byte cipher[AES_BLOCK_SIZE]; #ifdef HAVE_AES_DECRYPT #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -11018,10 +14187,11 @@ #else Aes dec[1]; #endif + int dec_inited = 0; byte plain[AES_BLOCK_SIZE]; #endif #endif /* HAVE_AES_CBC */ - int ret = 0; + wc_test_ret_t ret = 0; #ifdef HAVE_AES_CBC /* Test vectors from NIST Special Publication 800-38A, 2001 Edition, @@ -11036,17 +14206,24 @@ 0xf5,0x8c,0x4c,0x04,0xd6,0xe5,0xf1,0xba, 0x77,0x9e,0xab,0xfb,0x5f,0x7b,0xfb,0xd6 }; - - WOLFSSL_SMALL_STACK_STATIC byte key[] = { +#ifdef HAVE_RENESAS_SYNC + byte *key = + (byte*)guser_PKCbInfo.wrapped_key_aes256; + int keySz = (256/8); +#else + WOLFSSL_SMALL_STACK_STATIC const byte key[] = { 0x60,0x3d,0xeb,0x10,0x15,0xca,0x71,0xbe, 0x2b,0x73,0xae,0xf0,0x85,0x7d,0x77,0x81, 0x1f,0x35,0x2c,0x07,0x3b,0x61,0x08,0xd7, 0x2d,0x98,0x10,0xa3,0x09,0x14,0xdf,0xf4 }; - WOLFSSL_SMALL_STACK_STATIC byte iv[] = { + int keySz = (int)sizeof(key); +#endif + WOLFSSL_SMALL_STACK_STATIC const byte iv[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F }; + WOLFSSL_ENTER("aes256_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((enc = (Aes *)XMALLOC(sizeof *enc, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) @@ -11060,17 +14237,19 @@ ret = wc_AesInit(enc, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + enc_inited = 1; #ifdef HAVE_AES_DECRYPT ret = wc_AesInit(dec, HEAP_HINT, devId); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + dec_inited = 1; #endif - ret = wc_AesSetKey(enc, key, (int) sizeof(key), iv, AES_ENCRYPTION); + ret = wc_AesSetKey(enc, key, (word32)keySz, iv, AES_ENCRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #ifdef HAVE_AES_DECRYPT - ret = wc_AesSetKey(dec, key, (int) sizeof(key), iv, AES_DECRYPTION); + ret = wc_AesSetKey(dec, key, (word32)keySz, iv, AES_DECRYPTION); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif @@ -11094,24 +14273,111 @@ ERROR_OUT(WC_TEST_RET_ENC_NC, out); } #endif +#ifndef HAVE_RENESAS_SYNC + if (XMEMCMP(cipher, verify, (int) sizeof(cipher))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + ret = wc_AesSetKey(enc, key, keySz, iv, AES_ENCRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#ifdef HAVE_AES_DECRYPT + ret = wc_AesSetKey(dec, key, keySz, iv, AES_DECRYPTION); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif + + XMEMSET(cipher, 0, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesCbcEncrypt(enc, cipher, msg, (int) sizeof(msg)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &enc->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#ifdef HAVE_AES_DECRYPT + XMEMSET(plain, 0, AES_BLOCK_SIZE); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesCbcDecrypt(dec, plain, cipher, (int) sizeof(cipher)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(plain, msg, (int) sizeof(plain))) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } +#endif +#ifndef HAVE_RENESAS_SYNC if (XMEMCMP(cipher, verify, (int) sizeof(cipher))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif - wc_AesFree(enc); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesSetKey(enc, key, keySz, iv, AES_ENCRYPTION); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #ifdef HAVE_AES_DECRYPT - wc_AesFree(dec); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); + ret = wc_AesSetKey(dec, key, keySz, iv, AES_DECRYPTION); + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif + XMEMSET(cipher, 0, AES_BLOCK_SIZE); + ret = wc_AesCbcEncrypt(enc, cipher, msg, (int) sizeof(msg)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &enc->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#ifdef HAVE_AES_DECRYPT + XMEMSET(plain, 0, AES_BLOCK_SIZE); + ret = wc_AesCbcDecrypt(dec, plain, cipher, (int) sizeof(cipher)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(plain, msg, (int) sizeof(plain))) { + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } +#endif +#ifndef HAVE_RENESAS_SYNC + if (XMEMCMP(cipher, verify, (int) sizeof(cipher))) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif + +#endif /* DEBUG_VECTOR_REGISTER_ACCESS && WC_C_DYNAMIC_FALLBACK */ + out: + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) - if (enc) + if (enc) { + if (enc_inited) + wc_AesFree(enc); XFREE(enc, HEAP_HINT, DYNAMIC_TYPE_AES); + } #ifdef HAVE_AES_DECRYPT - if (dec) + if (dec) { + if (dec_inited) + wc_AesFree(dec); XFREE(dec, HEAP_HINT, DYNAMIC_TYPE_AES); + } #endif -#endif +#else /* !WOLFSSL_SMALL_STACK || WOLFSSL_NO_MALLOC */ + if (enc_inited) + wc_AesFree(enc); +#ifdef HAVE_AES_DECRYPT + if (dec_inited) + wc_AesFree(dec); +#endif /* HAVE_AES_DECRYPT */ +#endif /* !WOLFSSL_SMALL_STACK || WOLFSSL_NO_MALLOC */ #endif /* HAVE_AES_CBC */ return ret; @@ -11122,11 +14388,12 @@ #ifdef HAVE_AESGCM #ifdef WOLFSSL_AES_128 -static int aesgcm_default_test_helper(byte* key, int keySz, byte* iv, int ivSz, +static wc_test_ret_t aesgcm_default_test_helper(byte* key, int keySz, byte* iv, int ivSz, byte* plain, int plainSz, byte* cipher, int cipherSz, byte* aad, int aadSz, byte* tag, int tagSz) { - int ret, enc_inited = 0, dec_inited = 0; + wc_test_ret_t ret; + int enc_inited = 0, dec_inited = 0; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = NULL; Aes *dec = NULL; @@ -11161,17 +14428,33 @@ else dec_inited = 1; - ret = wc_AesGcmSetKey(enc, key, keySz); + ret = wc_AesGcmSetKey(enc, key, (word32)keySz); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); /* AES-GCM encrypt and decrypt both use AES encrypt internally */ + ret = wc_AesGcmEncrypt(enc, resultC, plain, (word32)plainSz, iv, ivSz, + resultT, (word32)tagSz, aad, aadSz); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &enc->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (cipher != NULL) { + if (XMEMCMP(cipher, resultC, cipherSz)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + if (XMEMCMP(tag, resultT, tagSz)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); ret = wc_AesGcmEncrypt(enc, resultC, plain, plainSz, iv, ivSz, resultT, tagSz, aad, aadSz); - #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &enc->asyncDev, WC_ASYNC_FLAG_NONE); #endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (cipher != NULL) { @@ -11180,24 +14463,40 @@ } if (XMEMCMP(tag, resultT, tagSz)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - +#endif #ifdef HAVE_AES_DECRYPT - ret = wc_AesGcmSetKey(dec, key, keySz); + ret = wc_AesGcmSetKey(dec, key, (word32)keySz); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ret = wc_AesGcmDecrypt(dec, resultP, resultC, (word32)cipherSz, + iv, (word32)ivSz, resultT, tagSz, aad, aadSz); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (plain != NULL) { + if (XMEMCMP(plain, resultP, plainSz)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); + } + +#if defined(DEBUG_VECTOR_REGISTER_ACCESS) && defined(WC_C_DYNAMIC_FALLBACK) + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(SYSLIB_FAILED_E); ret = wc_AesGcmDecrypt(dec, resultP, resultC, cipherSz, iv, ivSz, resultT, tagSz, aad, aadSz); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); #endif + WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(0); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (plain != NULL) { if (XMEMCMP(plain, resultP, plainSz)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); } +#endif #endif /* HAVE_AES_DECRYPT */ @@ -11216,7 +14515,7 @@ wc_AesFree(dec); XFREE(dec, HEAP_HINT, DYNAMIC_TYPE_AES); } -#else +#else /* !WOLFSSL_SMALL_STACK || WOLFSSL_NO_MALLOC */ if (enc_inited) wc_AesFree(enc); if (dec_inited) @@ -11231,7 +14530,7 @@ /* tests that only use 12 byte IV and 16 or less byte AAD * test vectors are from NIST SP 800-38D * https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/CAVP-TESTING-BLOCK-CIPHER-MODES*/ -WOLFSSL_TEST_SUBROUTINE int aesgcm_default_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesgcm_default_test(void) { #ifdef WOLFSSL_AES_128 byte key1[] = { @@ -11308,7 +14607,9 @@ 0x11, 0x64, 0xb2, 0xff }; - int ret; + wc_test_ret_t ret; + WOLFSSL_ENTER("aesgcm_default_test"); + ret = aesgcm_default_test_helper(key1, sizeof(key1), iv1, sizeof(iv1), plain1, sizeof(plain1), cipher1, sizeof(cipher1), aad1, sizeof(aad1), tag1, sizeof(tag1)); @@ -11332,7 +14633,7 @@ return 0; } -WOLFSSL_TEST_SUBROUTINE int aesgcm_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesgcm_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc = NULL; @@ -11359,16 +14660,18 @@ 0xba, 0x63, 0x7b, 0x39 }; -#if defined(WOLFSSL_AES_256) || defined(WOLFSSL_AES_192) WOLFSSL_SMALL_STACK_STATIC const byte a[] = { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef, 0xab, 0xad, 0xda, 0xd2 }; -#endif #ifdef WOLFSSL_AES_256 +#ifdef HAVE_RENESAS_SYNC + const byte *k1 = (byte*)guser_PKCbInfo.wrapped_key_aes256; + int k1Sz = (int)(256/8); +#else WOLFSSL_SMALL_STACK_STATIC const byte k1[] = { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, @@ -11376,13 +14679,14 @@ 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c, 0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 }; - + int k1Sz = (int)sizeof(k1); +#endif +#endif /* WOLFSSL_AES_256 */ WOLFSSL_SMALL_STACK_STATIC const byte iv1[] = { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad, 0xde, 0xca, 0xf8, 0x88 }; -#endif /* WOLFSSL_AES_256 */ #if defined(WOLFSSL_AES_256) || defined(WOLFSSL_AES_192) WOLFSSL_SMALL_STACK_STATIC const byte c1[] = @@ -11462,11 +14766,18 @@ 0x8e, 0x1a, 0xa2, 0x3b, 0x77, 0xcb, 0xaf, 0xe2 }; +#ifdef HAVE_RENESAS_SYNC + const byte *k3 = + (byte*)guser_PKCbInfo.wrapped_key_aes128; + int k3Sz = (int)(128/8); +#else WOLFSSL_SMALL_STACK_STATIC const byte k3[] = { 0xbb, 0x01, 0xd7, 0x03, 0x81, 0x1c, 0x10, 0x1a, 0x35, 0xe0, 0xff, 0xd2, 0x91, 0xba, 0xf2, 0x4b }; + int k3Sz = (int)sizeof(k3); +#endif WOLFSSL_SMALL_STACK_STATIC const byte iv3[] = { @@ -11499,15 +14810,10 @@ byte resultT[sizeof(t1) + AES_BLOCK_SIZE]; byte resultP[sizeof(p) + AES_BLOCK_SIZE]; byte resultC[sizeof(p) + AES_BLOCK_SIZE]; - int ret = 0; -#ifdef WOLFSSL_AES_256 - #if !(defined(WOLF_CRYPTO_CB) && defined(HAVE_INTEL_QA_SYNC)) + wc_test_ret_t ret = 0; + int alen; - #endif - #if !defined(WOLFSSL_AFALG_XILINX_AES) && !defined(WOLFSSL_XILINX_CRYPT) int plen; - #endif -#endif #if defined(WOLFSSL_XILINX_CRYPT_VERSAL) byte buf[sizeof(p) + AES_BLOCK_SIZE]; byte bufA[sizeof(a) + 1]; @@ -11524,12 +14830,15 @@ byte *large_output = (byte *)XMALLOC(BENCH_AESGCM_LARGE + AES_BLOCK_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *large_outdec = (byte *)XMALLOC(BENCH_AESGCM_LARGE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + (void)alen; + (void)plen; + if ((! large_input) || (! large_output) || (! large_outdec)) ERROR_OUT(MEMORY_E, out); #else byte large_input[BENCH_AESGCM_LARGE]; - byte large_output[BENCH_AESGCM_LARGE]; + byte large_output[BENCH_AESGCM_LARGE + AES_BLOCK_SIZE]; byte large_outdec[BENCH_AESGCM_LARGE]; #endif @@ -11537,6 +14846,7 @@ XMEMSET(large_output, 0, BENCH_AESGCM_LARGE + AES_BLOCK_SIZE); XMEMSET(large_outdec, 0, BENCH_AESGCM_LARGE); #endif + WOLFSSL_ENTER("aesgcm_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((enc = (Aes *)XMALLOC(sizeof *enc, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) @@ -11557,7 +14867,7 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #ifdef WOLFSSL_AES_256 - ret = wc_AesGcmSetKey(enc, k1, sizeof(k1)); + ret = wc_AesGcmSetKey(enc, k1, (word32)k1Sz); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -11569,13 +14879,15 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#ifndef HAVE_RENESAS_SYNC if (XMEMCMP(c1, resultC, sizeof(c1))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(t1, resultT, sizeof(t1))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif #ifdef HAVE_AES_DECRYPT - ret = wc_AesGcmSetKey(dec, k1, sizeof(k1)); + ret = wc_AesGcmSetKey(dec, k1, (word32)k1Sz); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -11613,15 +14925,15 @@ #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); #endif - if (ret != 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(large_input, large_outdec, BENCH_AESGCM_LARGE)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif /* HAVE_AES_DECRYPT */ #endif /* BENCH_AESGCM_LARGE */ #if defined(ENABLE_NON_12BYTE_IV_TEST) && defined(WOLFSSL_AES_256) /* Variable IV length test */ - for (ivlen=1; ivlen<(int)sizeof(k1); ivlen++) { + for (ivlen=1; ivlenasyncDev, WC_ASYNC_FLAG_NONE); @@ -11731,7 +15043,7 @@ #ifdef HAVE_AES_DECRYPT ret = wc_AesGcmDecrypt(dec, large_outdec, large_output, - plen, iv1, sizeof(iv1), resultT, + (word32)plen, iv1, sizeof(iv1), resultT, sizeof(t1), a, sizeof(a)); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); @@ -11798,12 +15110,44 @@ ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif /* HAVE_AES_DECRYPT */ + /* Large buffer test */ +#ifdef BENCH_AESGCM_LARGE + wc_AesGcmSetKey(enc, k2, (word32)sizeof(k2)); + wc_AesGcmSetKey(dec, k2, (word32)sizeof(k2)); + /* setup test buffer */ + for (alen=0; alenasyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + +#ifdef HAVE_AES_DECRYPT + ret = wc_AesGcmDecrypt(dec, large_outdec, large_output, + BENCH_AESGCM_LARGE, iv1, sizeof(iv1), resultT, + sizeof(t1), a, sizeof(a)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(large_input, large_outdec, BENCH_AESGCM_LARGE)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* HAVE_AES_DECRYPT */ +#endif /* BENCH_AESGCM_LARGE */ + XMEMSET(resultT, 0, sizeof(resultT)); XMEMSET(resultC, 0, sizeof(resultC)); XMEMSET(resultP, 0, sizeof(resultP)); #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_128 - wc_AesGcmSetKey(enc, k3, sizeof(k3)); + wc_AesGcmSetKey(enc, k3, (word32)k3Sz); /* AES-GCM encrypt and decrypt both use AES encrypt internally */ ret = wc_AesGcmEncrypt(enc, resultC, p3, sizeof(p3), iv3, sizeof(iv3), resultT, sizeof(t3), a3, sizeof(a3)); @@ -11812,10 +15156,12 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#ifndef HAVE_RENESAS_SYNC if (XMEMCMP(c3, resultC, sizeof(c3))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(t3, resultT, sizeof(t3))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif #ifdef HAVE_AES_DECRYPT ret = wc_AesGcmDecrypt(enc, resultP, resultC, sizeof(c3), @@ -11828,6 +15174,38 @@ if (XMEMCMP(p3, resultP, sizeof(p3))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif /* HAVE_AES_DECRYPT */ + + /* Large buffer test */ +#ifdef BENCH_AESGCM_LARGE + wc_AesGcmSetKey(enc, k3, (word32)k3Sz); + wc_AesGcmSetKey(dec, k3, (word32)k3Sz); + /* setup test buffer */ + for (alen=0; alenasyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + +#ifdef HAVE_AES_DECRYPT + ret = wc_AesGcmDecrypt(dec, large_outdec, large_output, + BENCH_AESGCM_LARGE, iv1, sizeof(iv1), resultT, + sizeof(t1), a, sizeof(a)); +#if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &dec->asyncDev, WC_ASYNC_FLAG_NONE); +#endif + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (XMEMCMP(large_input, large_outdec, BENCH_AESGCM_LARGE)) + ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* HAVE_AES_DECRYPT */ +#endif /* BENCH_AESGCM_LARGE */ #endif /* WOLFSSL_AES_128 */ #endif /* ENABLE_NON_12BYTE_IV_TEST */ @@ -11839,7 +15217,7 @@ XMEMSET(resultC, 0, sizeof(resultC)); XMEMSET(resultP, 0, sizeof(resultP)); - wc_AesGcmSetKey(enc, k1, sizeof(k1)); + wc_AesGcmSetKey(enc, k1, (word32)k1Sz); /* AES-GCM encrypt and decrypt both use AES encrypt internally */ ret = wc_AesGcmEncrypt(enc, resultC, p, sizeof(p), iv1, sizeof(iv1), resultT + 1, sizeof(t1) - 1, a, sizeof(a)); @@ -11848,11 +15226,12 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#ifndef HAVE_RENESAS_SYNC if (XMEMCMP(c1, resultC, sizeof(c1))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(t1, resultT + 1, sizeof(t1) - 1)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - +#endif #ifdef HAVE_AES_DECRYPT ret = wc_AesGcmDecrypt(enc, resultP, resultC, sizeof(p), iv1, sizeof(iv1), resultT + 1, sizeof(t1) - 1, a, sizeof(a)); @@ -11884,7 +15263,7 @@ XMEMSET(resultC, 0, sizeof(resultC)); XMEMSET(resultP, 0, sizeof(resultP)); - wc_AesGcmSetKey(enc, k1, sizeof(k1)); + wc_AesGcmSetKey(enc, k1, (word32)k1Sz); ret = wc_AesGcmSetIV(enc, sizeof(randIV), NULL, 0, &rng); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -11911,7 +15290,7 @@ } #ifdef HAVE_AES_DECRYPT - wc_AesGcmSetKey(dec, k1, sizeof(k1)); + wc_AesGcmSetKey(dec, k1, (word32)k1Sz); ret = wc_AesGcmSetIV(dec, sizeof(randIV), NULL, 0, &rng); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -11976,7 +15355,7 @@ for (plen = 0; plen < (int)sizeof(a); plen += alen) { int len = sizeof(a) - plen; if (len > alen) len = alen; - ret = wc_AesGcmEncryptUpdate(enc, NULL, NULL, 0, a + plen, len); + ret = wc_AesGcmEncryptUpdate(enc, NULL, NULL, 0, a + plen, (word32)len); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } @@ -11984,7 +15363,7 @@ for (plen = 0; plen < (int)sizeof(p); plen += alen) { int len = sizeof(p) - plen; if (len > alen) len = alen; - ret = wc_AesGcmEncryptUpdate(enc, resultC + plen, p + plen, len, + ret = wc_AesGcmEncryptUpdate(enc, resultC + plen, p + plen, (word32)len, NULL, 0); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -12008,7 +15387,7 @@ for (plen = 0; plen < (int)sizeof(a); plen += alen) { int len = sizeof(a) - plen; if (len > alen) len = alen; - ret = wc_AesGcmDecryptUpdate(enc, NULL, NULL, 0, a + plen, len); + ret = wc_AesGcmDecryptUpdate(enc, NULL, NULL, 0, a + plen, (word32)len); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } @@ -12016,7 +15395,7 @@ for (plen = 0; plen < (int)sizeof(c1); plen += alen) { int len = sizeof(c1) - plen; if (len > alen) len = alen; - ret = wc_AesGcmDecryptUpdate(enc, resultP + plen, c1 + plen, len, + ret = wc_AesGcmDecryptUpdate(enc, resultP + plen, c1 + plen, (word32)len, NULL, 0); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -12088,14 +15467,14 @@ } #ifdef WOLFSSL_AES_128 -WOLFSSL_TEST_SUBROUTINE int gmac_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t gmac_test(void) { - int ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Gmac *gmac; #else Gmac gmac[1]; #endif + wc_test_ret_t ret; WOLFSSL_SMALL_STACK_STATIC const byte k1[] = { @@ -12146,6 +15525,7 @@ #endif byte tag[16]; + WOLFSSL_ENTER("gmac_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((gmac = (Gmac *)XMALLOC(sizeof *gmac, HEAP_HINT, DYNAMIC_TYPE_AES)) == NULL) @@ -12235,9 +15615,9 @@ #if defined(WOLFSSL_AES_256) -static int aesccm_256_test(void) +static wc_test_ret_t aesccm_256_test(void) { - int ret; + wc_test_ret_t ret; /* Test vectors from NIST AES CCM 256-bit CAST Example #1 */ WOLFSSL_SMALL_STACK_STATIC const byte in_key[32] = { 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, @@ -12284,6 +15664,7 @@ ret = WC_TEST_RET_ENC_NC; } +#ifdef HAVE_AES_DECRYPT if (ret == 0) { /* decrypt inline */ ret = wc_AesCcmDecrypt(aes, output, output, sizeof(output), @@ -12297,6 +15678,7 @@ XMEMCMP(output, in_plaintext, sizeof(output))) { ret = WC_TEST_RET_ENC_NC; } +#endif wc_AesFree(aes); @@ -12311,9 +15693,9 @@ #if defined(WOLFSSL_AES_128) -static int aesccm_128_test(void) +static wc_test_ret_t aesccm_128_test(void) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Aes *enc; #else @@ -12437,6 +15819,7 @@ if (XMEMCMP(t, t2, sizeof(t2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#ifdef HAVE_AES_DECRYPT ret = wc_AesCcmDecrypt(enc, p2, c2, sizeof(p2), iv, sizeof(iv), t2, sizeof(t2), a, sizeof(a)); if (ret != 0) @@ -12456,6 +15839,7 @@ XMEMSET(c2, 0, sizeof(c2)); if (XMEMCMP(p2, c2, sizeof(p2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif wc_AesFree(enc); XMEMSET(enc, 0, sizeof(Aes)); /* clear context */ @@ -12464,6 +15848,10 @@ XMEMSET(p2, 0, sizeof(p2)); XMEMSET(iv2, 0, sizeof(iv2)); + ret = wc_AesInit(enc, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + #ifndef HAVE_SELFTEST /* selftest build does not have wc_AesCcmSetNonce() or * wc_AesCcmEncrypt_ex() */ @@ -12510,12 +15898,14 @@ if (XMEMCMP(tl, tl2, sizeof(tl2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#ifdef HAVE_AES_DECRYPT ret = wc_AesCcmDecrypt(enc, pl2, cl2, sizeof(pl2), iv, sizeof(iv), tl2, sizeof(tl2), a, sizeof(a)); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(pl, pl2, sizeof(pl2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#endif /* test empty message as null input or output with nonzero inSz. */ ret = wc_AesCcmEncrypt(enc, pl2 /* out */, NULL /* in */, 1 /* inSz */, @@ -12528,6 +15918,7 @@ a, sizeof(a)); if (ret != BAD_FUNC_ARG) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#ifdef HAVE_AES_DECRYPT ret = wc_AesCcmDecrypt(enc, pl2, NULL /* in */, 1 /* inSz */, iv, sizeof(iv), t_empty2, sizeof(t_empty2), a, sizeof(a)); @@ -12538,6 +15929,7 @@ sizeof(a)); if (ret != BAD_FUNC_ARG) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif /* test empty message as null input and output with zero inSz -- * must either succeed, or fail early with BAD_FUNC_ARG. @@ -12551,11 +15943,13 @@ if (XMEMCMP(t_empty, t_empty2, sizeof(t_empty2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#ifdef HAVE_AES_DECRYPT ret = wc_AesCcmDecrypt(enc, NULL /* out */, NULL /* in */, 0 /* inSz */, iv, sizeof(iv), t_empty2, sizeof(t_empty2), a, sizeof(a)); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif } /* test empty message as zero-length string -- must work. */ @@ -12567,11 +15961,13 @@ if (XMEMCMP(t_empty, t_empty2, sizeof(t_empty2))) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#ifdef HAVE_AES_DECRYPT ret = wc_AesCcmDecrypt(enc, pl2, (const byte *)"", 0 /* inSz */, iv, sizeof(iv), t_empty2, sizeof(t_empty2), a, sizeof(a)); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif wc_AesFree(enc); @@ -12586,9 +15982,11 @@ } #endif /* WOLFSSL_AES_128 */ -WOLFSSL_TEST_SUBROUTINE int aesccm_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aesccm_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; + WOLFSSL_ENTER("aesccm_test"); + #ifdef WOLFSSL_AES_128 if (ret == 0) ret = aesccm_128_test(); @@ -12602,6 +16000,164 @@ #endif /* HAVE_AESCCM */ +#if defined(WOLFSSL_AES_EAX) && \ + (!defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3)) && !defined(HAVE_SELFTEST) + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_eax_test(void) +{ + typedef struct { + byte key[AES_256_KEY_SIZE]; + int key_length; + byte iv[AES_BLOCK_SIZE]; + int iv_length; + byte aad[AES_BLOCK_SIZE * 2]; + int aad_length; + byte msg[AES_BLOCK_SIZE * 2]; + int msg_length; + byte ct[AES_BLOCK_SIZE * 2]; + int ct_length; + byte tag[AES_BLOCK_SIZE]; + int tag_length; + int valid; + } AadVector; + + /* A small selection of Google wycheproof vectors that use vectors + * from the original paper: eprint.iacr.org/2003/069 + * https://github.com/google/wycheproof/blob/master/testvectors/aes_eax_test.json + */ + WOLFSSL_SMALL_STACK_STATIC const AadVector vectors[] = { + /* Vector from paper - empty message with auth data */ + { + /* key, key length */ + {0x23, 0x39, 0x52, 0xde, 0xe4, 0xd5, 0xed, 0x5f, + 0x9b, 0x9c, 0x6d, 0x6f, 0xf8, 0x0f, 0xf4, 0x78}, 16, + /* iv, iv length */ + {0x62, 0xec, 0x67, 0xf9, 0xc3, 0xa4, 0xa4, 0x07, + 0xfc, 0xb2, 0xa8, 0xc4, 0x90, 0x31, 0xa8, 0xb3}, 16, + /* aad, aad length */ + {0x6b, 0xfb, 0x91, 0x4f, 0xd0, 0x7e, 0xae, 0x6b}, 8, + /* msg, msg length */ + {0}, 0, + /* ct, ct length */ + {0}, 0, + /* tag, tag length */ + {0xe0, 0x37, 0x83, 0x0e, 0x83, 0x89, 0xf2, + 0x7b, 0x02, 0x5a, 0x2d, 0x65, 0x27, 0xe7, 0x9d, 0x01}, 16, + /* valid */ + 1, + }, + /* Vector from paper - no auth data, valid auth tag */ + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv , iv length */ + {0x3c, 0x8c, 0xc2, 0x97, 0x0a, 0x00, 0x8f, 0x75, + 0xcc, 0x5b, 0xea, 0xe2, 0x84, 0x72, 0x58, 0xc2}, 16, + /* aad, aad length */ + {0}, 0, + /* msg, msg length */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11}, 32, + /* ct, ct length */ + {0x3c, 0x44, 0x1f, 0x32, 0xce, 0x07, 0x82, 0x23, + 0x64, 0xd7, 0xa2, 0x99, 0x0e, 0x50, 0xbb, 0x13, + 0xd7, 0xb0, 0x2a, 0x26, 0x96, 0x9e, 0x4a, 0x93, + 0x7e, 0x5e, 0x90, 0x73, 0xb0, 0xd9, 0xc9, 0x68}, 32, + /* tag, tag length */ + {0xdb, 0x90, 0xbd, 0xb3, 0xda, 0x3d, 0x00, 0xaf, + 0xd0, 0xfc, 0x6a, 0x83, 0x55, 0x1d, 0xa9, 0x5e}, 16, + /* valid */ + 1, + }, + /* Vector from paper - no auth data with invalid auth tag */ + { + /* key, key length */ + {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}, 16, + /* iv, iv length */ + {0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f}, 16, + /* aad, aad length */ + {0}, 0, + /* msg, msg length */ + {0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f}, 16, + /* ct , ct length */ + {0x29, 0xa0, 0x91, 0x4f, 0xec, 0x4b, 0xef, 0x54, + 0xba, 0xbf, 0x66, 0x13, 0xa9, 0xf9, 0xcd, 0x70}, 16, + /* tag, tag length */ + {0xe7, 0x0e, 0x7c, 0x50, 0x13, 0xa6, 0xdb, 0xf2, + 0x52, 0x98, 0xb1, 0x92, 0x9b, 0xc3, 0x56, 0xa7}, 16, + /* valid */ + 0, + }, + }; + + WOLFSSL_SMALL_STACK_STATIC byte ciphertext[sizeof(vectors[0].ct)]; + WOLFSSL_SMALL_STACK_STATIC byte authtag[sizeof(vectors[0].tag)]; + int i; + int len; + wc_test_ret_t ret; + WOLFSSL_ENTER("aes_eax_test"); + + + for (i = 0; i < (int)(sizeof(vectors)/sizeof(vectors[0])); i++) { + + XMEMSET(ciphertext, 0, sizeof(ciphertext)); + + len = sizeof(authtag); + ret = wc_AesEaxEncryptAuth(vectors[i].key, (word32)vectors[i].key_length, + ciphertext, + vectors[i].msg, (word32)vectors[i].msg_length, + vectors[i].iv, (word32)vectors[i].iv_length, + authtag, (word32)len, + vectors[i].aad, (word32)vectors[i].aad_length); + if (ret != 0) { + return WC_TEST_RET_ENC_EC(ret); + } + + /* check ciphertext matches vector */ + if (XMEMCMP(ciphertext, vectors[i].ct, (size_t)vectors[i].ct_length)) { + return WC_TEST_RET_ENC_NC; + } + + /* check that tag matches vector only for vectors marked as valid */ + ret = XMEMCMP(authtag, vectors[i].tag, len); + if (vectors[i].valid == 1 && ret != 0 ) { + return WC_TEST_RET_ENC_NC; + } + else if (vectors[i].valid == 0 && ret == 0) { + return WC_TEST_RET_ENC_NC; + } + + XMEMSET(ciphertext, 0, sizeof(ciphertext)); + + ret = wc_AesEaxDecryptAuth(vectors[i].key, (word32)vectors[i].key_length, + ciphertext, + vectors[i].ct, (word32)vectors[i].ct_length, + vectors[i].iv, (word32)vectors[i].iv_length, + authtag, (word32)len, + vectors[i].aad, (word32)vectors[i].aad_length); + if (ret != 0) { + return WC_TEST_RET_ENC_EC(ret); + } + + /* check decrypted ciphertext matches vector plaintext */ + if (XMEMCMP(ciphertext, vectors[i].msg, (size_t)vectors[i].msg_length)) { + return WC_TEST_RET_ENC_NC; + } + + } + return 0; +} + +#endif /* WOLFSSL_AES_EAX */ + + + #ifdef HAVE_AES_KEYWRAP #define MAX_KEYWRAP_TEST_OUTLEN 40 @@ -12616,7 +16172,7 @@ word32 verifyLen; } keywrapVector; -WOLFSSL_TEST_SUBROUTINE int aeskeywrap_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aeskeywrap_test(void) { int wrapSz, plainSz, testSz, i; @@ -12772,6 +16328,9 @@ {k6, d6, v6, sizeof(k6), sizeof(d6), sizeof(v6)} #endif }; + + WOLFSSL_ENTER("aeskeywrap_test"); + testSz = sizeof(test_wrap) / sizeof(keywrapVector); XMEMSET(output, 0, sizeof(output)); @@ -12790,7 +16349,7 @@ return WC_TEST_RET_ENC_NC; plainSz = wc_AesKeyUnWrap((byte*)test_wrap[i].kek, test_wrap[i].kekLen, - output, wrapSz, + output, (word32)wrapSz, plain, sizeof(plain), NULL); if ( (plainSz < 0) || (plainSz != (int)test_wrap[i].dataLen) ) @@ -12807,6 +16366,88 @@ #endif /* NO_AES */ +#ifdef HAVE_ARIA +void printOutput(const char *strName, unsigned char *data, unsigned int dataSz) +{ + #ifndef DEBUG_WOLFSSL + (void)strName; + (void)data; + (void)dataSz; + #else + WOLFSSL_MSG_EX("%s (%d):", strName,dataSz); + WOLFSSL_BUFFER(data,dataSz); + #endif +} + +WOLFSSL_TEST_SUBROUTINE int ariagcm_test(MC_ALGID algo) +{ + byte data[] = TEST_STRING; + word32 dataSz = TEST_STRING_SZ; + + /* Arbitrarily random long key that we will truncate to the right size */ + byte key[] = { 0x1E, 0xCC, 0x95, 0xCB, 0xD3, 0x74, 0x58, 0x4F, + 0x6F, 0x8A, 0x70, 0x26, 0xF7, 0x3C, 0x8D, 0xB6, + 0xDC, 0x32, 0x76, 0x20, 0xCF, 0x05, 0x4A, 0xCF, + 0x11, 0x86, 0xCD, 0x23, 0x5E, 0xC1, 0x6E, 0x2B }; + byte cipher[2*TEST_STRING_SZ], plain[TEST_STRING_SZ], ad[256], authTag[AES_BLOCK_SIZE]; + word32 keySz, adSz = 256, authTagSz = sizeof(authTag); + + wc_Aria aria; + int ret = 0; + WOLFSSL_ENTER("ariagcm_test"); + + XMEMSET((void *)&aria, 0, sizeof(aria)); + ret = wc_AriaInitCrypt(&aria, algo); + if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret),out); } + + ret = wc_AriaSetKey(&aria, key); + if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret),out); } + + MC_GetObjectValue(aria.hSession, aria.hKey, key, &keySz); + printOutput("Key", key, keySz); + + WC_RNG rng; + + ret = wc_InitRng_ex(&rng, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_AriaGcmSetIV(&aria, GCM_NONCE_MID_SZ, NULL, 0, &rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + wc_FreeRng(&rng); + + printOutput("Plaintext", data, sizeof(data)); + XMEMSET(cipher, 0, sizeof(cipher)); + + ret = wc_AriaEncrypt(&aria, cipher, data, dataSz, + (byte *)aria.nonce, aria.nonceSz, ad, adSz, + authTag, authTagSz); + if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret),out); } + + printOutput("Ciphertext", cipher, sizeof(cipher)); + printOutput("AuthTag", authTag, sizeof(authTag)); + + XMEMSET(plain, 0, sizeof(plain)); + + ret = wc_AriaDecrypt(&aria, plain, cipher, dataSz, + (byte *)aria.nonce, aria.nonceSz, ad, adSz, + authTag, authTagSz); + if (ret != 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret),out); } + + printOutput("Plaintext", plain, sizeof(plain)); + + if (XMEMCMP(plain, data, dataSz) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC,out); +out: + if (ret != 0) { wc_AriaFreeCrypt(&aria); } + else { ret = wc_AriaFreeCrypt(&aria); } + + return ret; +} +#endif /* HAVE_ARIA */ + #ifdef HAVE_CAMELLIA @@ -12824,7 +16465,7 @@ int errorCode; } test_vector_t; -WOLFSSL_TEST_SUBROUTINE int camellia_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t camellia_test(void) { /* Camellia ECB Test Plaintext */ WOLFSSL_SMALL_STACK_STATIC const byte pte[] = @@ -12930,7 +16571,6 @@ byte out[CAMELLIA_BLOCK_SIZE]; Camellia cam; - int i, testsSz, ret; WOLFSSL_SMALL_STACK_STATIC const test_vector_t testVectors[] = { {CAM_ECB_ENC, pte, ive, c1, k1, sizeof(k1), -114}, @@ -12946,6 +16586,9 @@ {CAM_CBC_DEC, ptc, ivc, c5, k5, sizeof(k5), -124}, {CAM_CBC_DEC, ptc, ivc, c6, k6, sizeof(k6), -125} }; + int i, testsSz; + int ret; + WOLFSSL_ENTER("camellia_test"); testsSz = sizeof(testVectors)/sizeof(test_vector_t); for (i = 0; i < testsSz; i++) { @@ -13017,10 +16660,532 @@ } #endif /* HAVE_CAMELLIA */ -#ifdef HAVE_XCHACHA -WOLFSSL_TEST_SUBROUTINE int XChaCha_test(void) { +#ifdef WOLFSSL_SM4 +#ifdef WOLFSSL_SM4_ECB +static int sm4_ecb_test(void) +{ + /* draft-ribose-cfrg-sm4-10 A.2.1.1 */ + WOLFSSL_SMALL_STACK_STATIC const byte k1[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 + }; + WOLFSSL_SMALL_STACK_STATIC const byte p1[] = { + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, + 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB + }; + WOLFSSL_SMALL_STACK_STATIC const byte c1_ecb[] = { + 0x5E, 0xC8, 0x14, 0x3D, 0xE5, 0x09, 0xCF, 0xF7, + 0xB5, 0x17, 0x9F, 0x8F, 0x47, 0x4B, 0x86, 0x19, + 0x2F, 0x1D, 0x30, 0x5A, 0x7F, 0xB1, 0x7D, 0xF9, + 0x85, 0xF8, 0x1C, 0x84, 0x82, 0x19, 0x23, 0x04 + }; + + wc_Sm4 sm4; + byte enc[SM4_BLOCK_SIZE * 4]; + byte dec[SM4_BLOCK_SIZE * 4]; int ret; + ret = wc_Sm4Init(&sm4, NULL, INVALID_DEVID); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + /* Encrypt and decrypt with ECB. */ + ret = wc_Sm4SetKey(&sm4, k1, sizeof(k1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_Sm4EcbEncrypt(&sm4, enc, p1, sizeof(p1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c1_ecb, sizeof(c1_ecb)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4EcbDecrypt(&sm4, dec, enc, sizeof(c1_ecb)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(dec, p1, sizeof(p1)) != 0) + return WC_TEST_RET_ENC_NC; + + wc_Sm4Free(&sm4); + + return 0; +} +#endif + +#ifdef WOLFSSL_SM4_CBC +static int sm4_cbc_test(void) +{ + /* draft-ribose-cfrg-sm4-10 A.2.2.1 */ + WOLFSSL_SMALL_STACK_STATIC const byte k1[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 + }; + WOLFSSL_SMALL_STACK_STATIC const byte p1[] = { + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, + 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB + }; + WOLFSSL_SMALL_STACK_STATIC const byte i1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F + }; + WOLFSSL_SMALL_STACK_STATIC const byte c1_cbc[] = { + 0x78, 0xEB, 0xB1, 0x1C, 0xC4, 0x0B, 0x0A, 0x48, + 0x31, 0x2A, 0xAE, 0xB2, 0x04, 0x02, 0x44, 0xCB, + 0x4C, 0xB7, 0x01, 0x69, 0x51, 0x90, 0x92, 0x26, + 0x97, 0x9B, 0x0D, 0x15, 0xDC, 0x6A, 0x8F, 0x6D + }; + + wc_Sm4 sm4; + byte enc[SM4_BLOCK_SIZE * 4]; + byte dec[SM4_BLOCK_SIZE * 4]; + int ret; + + ret = wc_Sm4Init(&sm4, NULL, INVALID_DEVID); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + /* Encrypt and decrypt with CBC. */ + ret = wc_Sm4SetKey(&sm4, k1, sizeof(k1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_Sm4SetIV(&sm4, i1); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_Sm4CbcEncrypt(&sm4, enc, p1, sizeof(p1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c1_cbc, sizeof(c1_cbc)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4SetIV(&sm4, i1); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_Sm4CbcDecrypt(&sm4, dec, enc, sizeof(c1_cbc)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(dec, p1, sizeof(p1)) != 0) + return WC_TEST_RET_ENC_NC; + + /* Encrypt and decrypt in-place with CBC. */ + ret = wc_Sm4SetKey(&sm4, k1, sizeof(k1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_Sm4SetIV(&sm4, i1); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + XMEMCPY(enc, p1, sizeof(p1)); + ret = wc_Sm4CbcEncrypt(&sm4, enc, enc, sizeof(p1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c1_cbc, sizeof(c1_cbc)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4SetIV(&sm4, i1); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_Sm4CbcDecrypt(&sm4, enc, enc, sizeof(c1_cbc)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, p1, sizeof(p1)) != 0) + return WC_TEST_RET_ENC_NC; + + wc_Sm4Free(&sm4); + + return 0; +} +#endif + +#ifdef WOLFSSL_SM4_CTR +static int sm4_ctr_test(void) +{ + /* draft-ribose-cfrg-sm4-10 A.2.5.1 */ + WOLFSSL_SMALL_STACK_STATIC const byte k1[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 + }; + WOLFSSL_SMALL_STACK_STATIC const byte i1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F + }; + WOLFSSL_SMALL_STACK_STATIC const byte p2[] = { + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB + }; + WOLFSSL_SMALL_STACK_STATIC const byte c2_ctr[] = { + 0xAC, 0x32, 0x36, 0xCB, 0x97, 0x0C, 0xC2, 0x07, + 0x91, 0x36, 0x4C, 0x39, 0x5A, 0x13, 0x42, 0xD1, + 0xA3, 0xCB, 0xC1, 0x87, 0x8C, 0x6F, 0x30, 0xCD, + 0x07, 0x4C, 0xCE, 0x38, 0x5C, 0xDD, 0x70, 0xC7, + 0xF2, 0x34, 0xBC, 0x0E, 0x24, 0xC1, 0x19, 0x80, + 0xFD, 0x12, 0x86, 0x31, 0x0C, 0xE3, 0x7B, 0x92, + 0x6E, 0x02, 0xFC, 0xD0, 0xFA, 0xA0, 0xBA, 0xF3, + 0x8B, 0x29, 0x33, 0x85, 0x1D, 0x82, 0x45, 0x14 + }; + + wc_Sm4 sm4; + byte enc[SM4_BLOCK_SIZE * 4]; + byte dec[SM4_BLOCK_SIZE * 4]; + int chunk; + int i; + int ret; + + ret = wc_Sm4Init(&sm4, NULL, INVALID_DEVID); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + /* Encrypt and decrypt using encrypt with CTR. */ + ret = wc_Sm4SetKey(&sm4, k1, sizeof(k1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_Sm4SetIV(&sm4, i1); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_Sm4CtrEncrypt(&sm4, enc, p2, sizeof(p2)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c2_ctr, sizeof(c2_ctr)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4SetIV(&sm4, i1); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_Sm4CtrEncrypt(&sm4, dec, enc, sizeof(c2_ctr)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(dec, p2, sizeof(p2)) != 0) + return WC_TEST_RET_ENC_NC; + + for (chunk = 1; chunk <= SM4_BLOCK_SIZE + 1; chunk++) { + ret = wc_Sm4SetIV(&sm4, i1); + if (ret != 0) + return WC_TEST_RET_ENC_I(chunk); + + XMEMSET(enc, 0, sizeof(enc)); + for (i = 0; i + chunk <= (int)sizeof(p2); i += chunk) { + ret = wc_Sm4CtrEncrypt(&sm4, enc + i, p2 + i, chunk); + if (ret != 0) + return WC_TEST_RET_ENC_I(i); + } + if (i < (int)sizeof(p2)) { + ret = wc_Sm4CtrEncrypt(&sm4, enc + i, p2 + i, sizeof(p2) - i); + if (ret != 0) + return WC_TEST_RET_ENC_I(chunk); + } + if (XMEMCMP(enc, c2_ctr, sizeof(c2_ctr)) != 0) + return WC_TEST_RET_ENC_I(chunk); + } + + wc_Sm4Free(&sm4); + + return 0; +} +#endif + +#ifdef WOLFSSL_SM4_GCM +static int sm4_gcm_test(void) +{ + WOLFSSL_SMALL_STACK_STATIC const byte k1[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 + }; + WOLFSSL_SMALL_STACK_STATIC const byte p1[] = { + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, + 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB + }; + WOLFSSL_SMALL_STACK_STATIC const byte i1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B + }; + WOLFSSL_SMALL_STACK_STATIC const byte a1[] = { + 0xFF, 0xEE, 0xDD + }; + WOLFSSL_SMALL_STACK_STATIC const byte tag1[] = { + 0x83, 0xb2, 0x91, 0xcf, 0x22, 0xc9, 0x5f, 0x89, + 0xde, 0x3d, 0x52, 0x8d, 0xd7, 0x13, 0x50, 0x89 + }; + WOLFSSL_SMALL_STACK_STATIC const byte c1[] = { + 0xff, 0x8b, 0xb2, 0x3b, 0x0a, 0x0a, 0x12, 0xa4, + 0xa8, 0x4c, 0x4f, 0x67, 0x06, 0x81, 0xbb, 0x88, + 0x66, 0x17, 0xc7, 0x43, 0xbf, 0xae, 0x41, 0x40, + 0xec, 0x1e, 0x03, 0x85, 0x2b, 0x56, 0xa8, 0xc0 + }; + /* RFC8998 A.1. */ + WOLFSSL_SMALL_STACK_STATIC const byte i2[] = { + 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, + 0x00, 0x00, 0xAB, 0xCD + }; + WOLFSSL_SMALL_STACK_STATIC const byte k2[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 + }; + WOLFSSL_SMALL_STACK_STATIC const byte p2[] = { + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA + }; + WOLFSSL_SMALL_STACK_STATIC const byte a2[] = { + 0xFE, 0xED, 0xFA, 0xCE, 0xDE, 0xAD, 0xBE, 0xEF, + 0xFE, 0xED, 0xFA, 0xCE, 0xDE, 0xAD, 0xBE, 0xEF, + 0xAB, 0xAD, 0xDA, 0xD2 + }; + WOLFSSL_SMALL_STACK_STATIC const byte c2[] = { + 0x17, 0xF3, 0x99, 0xF0, 0x8C, 0x67, 0xD5, 0xEE, + 0x19, 0xD0, 0xDC, 0x99, 0x69, 0xC4, 0xBB, 0x7D, + 0x5F, 0xD4, 0x6F, 0xD3, 0x75, 0x64, 0x89, 0x06, + 0x91, 0x57, 0xB2, 0x82, 0xBB, 0x20, 0x07, 0x35, + 0xD8, 0x27, 0x10, 0xCA, 0x5C, 0x22, 0xF0, 0xCC, + 0xFA, 0x7C, 0xBF, 0x93, 0xD4, 0x96, 0xAC, 0x15, + 0xA5, 0x68, 0x34, 0xCB, 0xCF, 0x98, 0xC3, 0x97, + 0xB4, 0x02, 0x4A, 0x26, 0x91, 0x23, 0x3B, 0x8D + }; + WOLFSSL_SMALL_STACK_STATIC const byte tag2[] = { + 0x83, 0xDE, 0x35, 0x41, 0xE4, 0xC2, 0xB5, 0x81, + 0x77, 0xE0, 0x65, 0xA9, 0xBF, 0x7B, 0x62, 0xEC + }; + + wc_Sm4 sm4; + byte enc[SM4_BLOCK_SIZE * 4]; + byte dec[SM4_BLOCK_SIZE * 4]; + byte tag[SM4_BLOCK_SIZE]; + int ret; + + ret = wc_Sm4Init(&sm4, NULL, INVALID_DEVID); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + /* Encrypt and decrypt using encrypt with GCM. */ + ret = wc_Sm4GcmSetKey(&sm4, k1, sizeof(k1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_Sm4GcmEncrypt(&sm4, enc, p1, sizeof(p1), i1, sizeof(i1), tag, + sizeof(tag), a1, sizeof(a1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c1, sizeof(c1)) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(tag, tag1, sizeof(tag1)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4GcmDecrypt(&sm4, dec, enc, sizeof(c1), i1, sizeof(i1), tag, + sizeof(tag), a1, sizeof(a1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(dec, p1, sizeof(p1)) != 0) + return WC_TEST_RET_ENC_NC; + + /* RFC8998 test vector. */ + ret = wc_Sm4GcmSetKey(&sm4, k2, sizeof(k2)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_Sm4GcmEncrypt(&sm4, enc, p2, sizeof(p2), i2, sizeof(i2), tag, + sizeof(tag), a2, sizeof(a2)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c2, sizeof(c2)) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(tag, tag2, sizeof(tag2)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4GcmDecrypt(&sm4, dec, enc, sizeof(c2), i2, sizeof(i2), tag, + sizeof(tag), a2, sizeof(a2)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(dec, p2, sizeof(p2)) != 0) + return WC_TEST_RET_ENC_NC; + + wc_Sm4Free(&sm4); + + return 0; +} +#endif + +#ifdef WOLFSSL_SM4_CCM +static int sm4_ccm_test(void) +{ + WOLFSSL_SMALL_STACK_STATIC const byte k1[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 + }; + WOLFSSL_SMALL_STACK_STATIC const byte p1[] = { + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, 0xDD, 0xDD, 0xDD, 0xDD, + 0xEE, 0xEE, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, + 0xAA, 0xAA, 0xAA, 0xAA, 0xBB, 0xBB, 0xBB, 0xBB + }; + WOLFSSL_SMALL_STACK_STATIC const byte i1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0A, 0x0B + }; + WOLFSSL_SMALL_STACK_STATIC const byte a1[] = { + 0xFF, 0xEE, 0xDD + }; + WOLFSSL_SMALL_STACK_STATIC const byte tag1[] = { + 0x9a, 0x98, 0x04, 0xb6, 0x0f, 0x19, 0x4a, 0x46, + 0xba, 0xed, 0xe6, 0x89, 0x69, 0x34, 0xad, 0x61 + }; + WOLFSSL_SMALL_STACK_STATIC const byte c1[] = { + 0xbd, 0xc0, 0x72, 0x60, 0xda, 0x2d, 0x11, 0xdc, + 0x66, 0x33, 0xcc, 0xec, 0xb2, 0xf4, 0x53, 0x59, + 0x9e, 0xb1, 0xb3, 0x6b, 0x1f, 0x1c, 0xfb, 0x29, + 0xf5, 0x37, 0xfc, 0x00, 0xf2, 0x4e, 0x70, 0x6f + }; + /* RFC8998 A.1. */ + WOLFSSL_SMALL_STACK_STATIC const byte i2[] = { + 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, + 0x00, 0x00, 0xAB, 0xCD + }; + WOLFSSL_SMALL_STACK_STATIC const byte k2[] = { + 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 + }; + WOLFSSL_SMALL_STACK_STATIC const byte p2[] = { + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, + 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, + 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, + 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA + }; + WOLFSSL_SMALL_STACK_STATIC const byte a2[] = { + 0xFE, 0xED, 0xFA, 0xCE, 0xDE, 0xAD, 0xBE, 0xEF, + 0xFE, 0xED, 0xFA, 0xCE, 0xDE, 0xAD, 0xBE, 0xEF, + 0xAB, 0xAD, 0xDA, 0xD2 + }; + WOLFSSL_SMALL_STACK_STATIC const byte c2[] = { + 0x48, 0xAF, 0x93, 0x50, 0x1F, 0xA6, 0x2A, 0xDB, + 0xCD, 0x41, 0x4C, 0xCE, 0x60, 0x34, 0xD8, 0x95, + 0xDD, 0xA1, 0xBF, 0x8F, 0x13, 0x2F, 0x04, 0x20, + 0x98, 0x66, 0x15, 0x72, 0xE7, 0x48, 0x30, 0x94, + 0xFD, 0x12, 0xE5, 0x18, 0xCE, 0x06, 0x2C, 0x98, + 0xAC, 0xEE, 0x28, 0xD9, 0x5D, 0xF4, 0x41, 0x6B, + 0xED, 0x31, 0xA2, 0xF0, 0x44, 0x76, 0xC1, 0x8B, + 0xB4, 0x0C, 0x84, 0xA7, 0x4B, 0x97, 0xDC, 0x5B + }; + WOLFSSL_SMALL_STACK_STATIC const byte tag2[] = { + 0x16, 0x84, 0x2D, 0x4F, 0xA1, 0x86, 0xF5, 0x6A, + 0xB3, 0x32, 0x56, 0x97, 0x1F, 0xA1, 0x10, 0xF4 + }; + + wc_Sm4 sm4; + byte enc[SM4_BLOCK_SIZE * 4]; + byte dec[SM4_BLOCK_SIZE * 4]; + byte tag[SM4_BLOCK_SIZE]; + int ret; + + ret = wc_Sm4Init(&sm4, NULL, INVALID_DEVID); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + /* Encrypt and decrypt using encrypt with CCM. */ + ret = wc_Sm4SetKey(&sm4, k1, sizeof(k1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_Sm4CcmEncrypt(&sm4, enc, p1, sizeof(p1), i1, sizeof(i1), tag, + sizeof(tag), a1, sizeof(a1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c1, sizeof(c1)) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(tag, tag1, sizeof(tag1)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4CcmDecrypt(&sm4, dec, enc, sizeof(c1), i1, sizeof(i1), tag, + sizeof(tag), a1, sizeof(a1)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(dec, p1, sizeof(p1)) != 0) + return WC_TEST_RET_ENC_NC; + + /* RFC8998 test vector. */ + ret = wc_Sm4SetKey(&sm4, k2, sizeof(k2)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_Sm4CcmEncrypt(&sm4, enc, p2, sizeof(p2), i2, sizeof(i2), tag, + sizeof(tag), a2, sizeof(a2)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(enc, c2, sizeof(c2)) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(tag, tag2, sizeof(tag2)) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_Sm4CcmDecrypt(&sm4, dec, enc, sizeof(c2), i2, sizeof(i2), tag, + sizeof(tag), a2, sizeof(a2)); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(dec, p2, sizeof(p2)) != 0) + return WC_TEST_RET_ENC_NC; + + wc_Sm4Free(&sm4); + + return 0; +} +#endif + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sm4_test(void) +{ + wc_test_ret_t ret; + WOLFSSL_ENTER("sm4_test"); + +#ifdef WOLFSSL_SM4_ECB + ret = sm4_ecb_test(); + if (ret != 0) + return ret; +#endif +#ifdef WOLFSSL_SM4_CBC + ret = sm4_cbc_test(); + if (ret != 0) + return ret; +#endif +#ifdef WOLFSSL_SM4_CTR + ret = sm4_ctr_test(); + if (ret != 0) + return ret; +#endif +#ifdef WOLFSSL_SM4_GCM + ret = sm4_gcm_test(); + if (ret != 0) + return ret; +#endif +#ifdef WOLFSSL_SM4_CCM + ret = sm4_ccm_test(); + if (ret != 0) + return ret; +#endif + + return 0; +} +#endif + +#ifdef HAVE_XCHACHA +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t XChaCha_test(void) { + WOLFSSL_SMALL_STACK_STATIC const byte Plaintext[] = { 0x54, 0x68, 0x65, 0x20, 0x64, 0x68, 0x6f, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x72, 0x6f, 0x6e, 0x6f, /* The dhole (prono */ 0x75, 0x6e, 0x63, 0x65, 0x64, 0x20, 0x22, 0x64, 0x6f, 0x6c, 0x65, 0x22, 0x29, 0x20, 0x69, 0x73, /* unced "dole") is */ @@ -13074,17 +17239,21 @@ 0x93, 0xb9, 0x31, 0x11, 0xc1, 0xa5, 0x5d, 0xd7, 0x42, 0x1a, 0x10, 0x18, 0x49, 0x74, 0xc7, 0xc5 }; + wc_test_ret_t ret; + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) struct ChaCha *chacha = (struct ChaCha *)XMALLOC(sizeof *chacha, HEAP_HINT, DYNAMIC_TYPE_CIPHER); byte *buf1 = (byte *)XMALLOC(sizeof Plaintext, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *buf2 = (byte *)XMALLOC(sizeof Plaintext, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + WOLFSSL_ENTER("XChaCha_test"); if ((chacha == NULL) || (buf1 == NULL) || (buf2 == NULL)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); #else struct ChaCha chacha[1]; byte buf1[sizeof Plaintext]; byte buf2[sizeof Plaintext]; + WOLFSSL_ENTER("XChaCha_test"); #endif ret = wc_XChacha_SetKey(chacha, Key, sizeof Key, IV, sizeof IV, 0); @@ -13125,8 +17294,7 @@ #endif /* HAVE_XCHACHA */ #if defined(HAVE_XCHACHA) && defined(HAVE_POLY1305) -WOLFSSL_TEST_SUBROUTINE int XChaCha20Poly1305_test(void) { - int ret; +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t XChaCha20Poly1305_test(void) { WOLFSSL_SMALL_STACK_STATIC const byte Plaintext[] = { 0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c, /* Ladies and Gentl */ @@ -13163,15 +17331,20 @@ 0xc0, 0x87, 0x59, 0x24, 0xc1, 0xc7, 0x98, 0x79, 0x47, 0xde, 0xaf, 0xd8, 0x78, 0x0a, 0xcf, 0x49 }; + wc_test_ret_t ret; + + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) byte *buf1 = (byte *)XMALLOC(sizeof Ciphertext + sizeof Tag, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *buf2 = (byte *)XMALLOC(sizeof Plaintext, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + WOLFSSL_ENTER("XChaCha20Poly1305_test"); if ((buf1 == NULL) || (buf2 == NULL)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); #else byte buf1[sizeof Ciphertext + sizeof Tag]; byte buf2[sizeof Plaintext]; + WOLFSSL_ENTER("XChaCha20Poly1305_test"); #endif ret = wc_XChaCha20Poly1305_Encrypt(buf1, sizeof Ciphertext + sizeof Tag, @@ -13215,10 +17388,11 @@ #endif /* defined(HAVE_XCHACHA) && defined(HAVE_POLY1305) */ #ifndef WC_NO_RNG -static int _rng_test(WC_RNG* rng, int errorOffset) +static wc_test_ret_t _rng_test(WC_RNG* rng, int errorOffset) { byte block[32]; - int ret, i; + wc_test_ret_t ret; + int i; XMEMSET(block, 0, sizeof(block)); @@ -13278,11 +17452,12 @@ return ret; } -static int random_rng_test(void) + +static wc_test_ret_t random_rng_test(void) { WC_RNG localRng; WC_RNG* rng; - int ret; + wc_test_ret_t ret; rng = &localRng; /* Test stack based RNG. */ @@ -13305,17 +17480,30 @@ #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && !defined(WOLFSSL_NO_MALLOC) { byte nonce[8] = { 0 }; - /* Test dynamic RNG. */ + + /* Test dynamic RNG */ rng = wc_rng_new(nonce, (word32)sizeof(nonce), HEAP_HINT); if (rng == NULL) return WC_TEST_RET_ENC_ERRNO; - #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLF_CRYPTO_CB) - rng->devId = devId; - #endif ret = _rng_test(rng, WC_TEST_RET_ENC_NC); + wc_rng_free(rng); + rng = NULL; + + if (ret != 0) + return ret; + /* Test dynamic RNG using extended API */ + ret = wc_rng_new_ex(&rng, nonce, (word32)sizeof(nonce), + HEAP_HINT, devId); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = _rng_test(rng, WC_TEST_RET_ENC_NC); wc_rng_free(rng); + + if (ret != 0) + return ret; } #endif @@ -13335,7 +17523,7 @@ return 0; } -static int rng_seed_test(void) +static wc_test_ret_t rng_seed_test(void) { #ifndef HAVE_FIPS WOLFSSL_SMALL_STACK_STATIC const byte check[] = @@ -13357,7 +17545,7 @@ #endif byte output[WC_SHA256_DIGEST_SIZE]; WC_RNG rng; - int ret; + wc_test_ret_t ret; ret = wc_SetSeed_Cb(seed_cb); if (ret != 0) { @@ -13390,7 +17578,7 @@ #endif -WOLFSSL_TEST_SUBROUTINE int random_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t random_test(void) { WOLFSSL_SMALL_STACK_STATIC const byte test1Entropy[] = { @@ -13442,7 +17630,8 @@ }; byte output[WC_SHA256_DIGEST_SIZE * 4]; - int ret; + wc_test_ret_t ret; + WOLFSSL_ENTER("random_test"); ret = wc_RNG_HealthTest(0, test1Entropy, sizeof(test1Entropy), NULL, 0, output, sizeof(output)); @@ -13507,8 +17696,10 @@ #else -WOLFSSL_TEST_SUBROUTINE int random_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t random_test(void) { + WOLFSSL_ENTER("random_test"); + /* Basic RNG generate block test */ return random_rng_test(); } @@ -13547,9 +17738,43 @@ } #endif -WOLFSSL_TEST_SUBROUTINE int memory_test(void) +/* If successful, returns the first letter of the byte array `in`. +** +** This is a deceptively simple test of a read-only embedded Linux file system. +** (e.g CFLAGS `-mfdpic` and `-mforce-l32`) for Xtensa Linux ESP32. When the +** `-mforce-l32` is missing, access to `in` will fail with Illegal Instruction. +** Const is on read-only memory-mapped file system, *not* loaded in app memory. +** +** Edit with caution. See PR #6523. */ +static wc_test_ret_t const_byte_ptr_test(const byte* in, word32 *outJ) { - int ret = 0; + wc_test_ret_t ret = 0; + volatile word32 j = (word32)-1; /* must be volatile to properly detect error */ + + ret = (wc_test_ret_t)*in; /* accessed *in value. */ + (void)ret; + j = *outJ; /* Found index to use in const array. */ + + if (j == 0) { +#ifdef WOLFSSL_DEBUG + printf("Testing const byte ptr reference...\n"); +#endif + /* although j is zero, in[0] does not detect the Illegal instruction */ + ret = in[j]; /* The big test: can we actually access the `in` data? */ + } + else { + ret = WC_TEST_RET_ENC_I(j); + } + + return ret; +} + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t memory_test(void) +{ + wc_test_ret_t ret = 0; + word32 j = 0; /* used in embedded const pointer test */ + WOLFSSL_ENTER("memory_test"); + #if defined(COMPLEX_MEM_TEST) || defined(WOLFSSL_STATIC_MEMORY) int i; #endif @@ -13564,27 +17789,32 @@ #ifdef WOLFSSL_STATIC_MEMORY /* check macro settings */ - if (sizeof(size)/sizeof(word32) != WOLFMEM_MAX_BUCKETS) { + if (sizeof(size)/sizeof(word32) != WOLFMEM_DEF_BUCKETS) { + return WC_TEST_RET_ENC_NC; + } + + if (sizeof(dist)/sizeof(word32) != WOLFMEM_DEF_BUCKETS) { return WC_TEST_RET_ENC_NC; } - if (sizeof(dist)/sizeof(word32) != WOLFMEM_MAX_BUCKETS) { + if (WOLFMEM_DEF_BUCKETS > WOLFMEM_MAX_BUCKETS) { return WC_TEST_RET_ENC_NC; } - for (i = 0; i < WOLFMEM_MAX_BUCKETS; i++) { + for (i = 0; i < WOLFMEM_DEF_BUCKETS; i++) { if ((size[i] % WOLFSSL_STATIC_ALIGN) != 0) { /* each element in array should be divisible by alignment size */ return WC_TEST_RET_ENC_NC; } } - for (i = 1; i < WOLFMEM_MAX_BUCKETS; i++) { + for (i = 1; i < WOLFMEM_DEF_BUCKETS; i++) { if (size[i - 1] >= size[i]) { return WC_TEST_RET_ENC_NC; /* sizes should be in increasing order */ } } +#ifndef WOLFSSL_STATIC_MEMORY_LEAN /* check that padding size returned is possible */ if (wolfSSL_MemoryPaddingSz() < WOLFSSL_STATIC_ALIGN) { return WC_TEST_RET_ENC_NC; /* no room for wc_Memory struct */ @@ -13649,7 +17879,9 @@ return WC_TEST_RET_ENC_NC; /* should round to 0 since struct + bucket will not fit */ } +#endif + (void)pad; (void)dist; /* avoid static analysis warning of variable not used */ #endif @@ -13685,9 +17917,9 @@ #endif if (b) XFREE(b, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if ((b == NULL) + if (b == NULL #ifndef WOLFSSL_NO_REALLOC - || (c == NULL) + || c == NULL #endif ) { return WC_TEST_RET_ENC_ERRNO; @@ -13695,6 +17927,13 @@ } #endif + if (ret == 0) { + /* This test is only interesting on embedded R/O Flash systems */ + if (const_byte_ptr_test(const_byte_array, &j) != CBPTR_EXPECTED) { + ret = 1; + } + } + return ret; } @@ -13763,8 +18002,10 @@ #if !defined(NO_ASN) && !defined(NO_DH) #if defined(WOLFSSL_DH_EXTRA) && (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION > 2))) - static const char* dhKeyFile = CERT_ROOT "statickeys/dh-ffdhe2048.der"; - static const char* dhKeyPubFile = CERT_ROOT "statickeys/dh-ffdhe2048-pub.der"; + #if !defined(USE_CERT_BUFFERS_2048) + static const char* dhKeyFile = CERT_ROOT "statickeys/dh-ffdhe2048.der"; + static const char* dhKeyPubFile = CERT_ROOT "statickeys/dh-ffdhe2048-pub.der"; + #endif #endif #endif #if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) @@ -13826,6 +18067,16 @@ CERT_ROOT "test" CERT_PATH_SEP "cert-ext-ia.der"; static const char* certExtNct = CERT_ROOT "test" CERT_PATH_SEP "cert-ext-nct.der"; +#ifndef WOLFSSL_ASN_INT_LEAD_0_ANY + static const char* certBadNegInt = + CERT_ROOT "test" CERT_PATH_SEP "cert-bad-neg-int.der"; +#endif + static const char* certBadOid = + CERT_ROOT "test" CERT_PATH_SEP "cert-bad-oid.der"; +#ifndef WOLFSSL_NO_ASN_STRICT + static const char* certBadUtf8 = + CERT_ROOT "test" CERT_PATH_SEP "cert-bad-utf8.der"; +#endif #endif #ifndef NO_WRITE_TEMP_FILES @@ -13951,30 +18202,27 @@ WOLFSSL_SMALL_STACK_STATIC const char certKeyUsage[] = "digitalSignature,nonRepudiation"; #endif - #if !defined(NO_RSA) && defined(WOLFSSL_CERT_GEN) && \ - !defined(NO_ASN_TIME) && defined(WOLFSSL_CERT_REQ) && \ - !defined(WOLFSSL_NO_MALLOC) + #if defined(WOLFSSL_CERT_REQ) && !defined(NO_RSA) && !defined(NO_ASN_TIME) WOLFSSL_SMALL_STACK_STATIC const char certKeyUsage2[] = "digitalSignature,nonRepudiation,keyEncipherment,keyAgreement"; #endif #endif /* WOLFSSL_CERT_EXT */ -#endif /* WOLFSSL_CERT_GEN && (!NO_RSA || HAVE_ECC) || (WOLFSSL_TEST_CERT && - * (HAVE_ED25519 || HAVE_ED448)) */ +#endif /* WOLFSSL_CERT_GEN */ #ifndef NO_RSA #if !defined(NO_ASN_TIME) && !defined(NO_RSA) && defined(WOLFSSL_TEST_CERT) && \ !defined(NO_FILESYSTEM) -static byte minSerial[] = { 0x02, 0x01, 0x01 }; -static byte minName[] = { 0x30, 0x00 }; -static byte nameBad[] = { +static const byte minSerial[] = { 0x02, 0x01, 0x01 }; +static const byte minName[] = { 0x30, 0x00 }; +static const byte nameBad[] = { 0x30, 0x08, 0x31, 0x06, 0x30, 0x04, 0x06, 0x02, 0x55, 0x04, }; -static byte minDates[] = { +static const byte minDates[] = { 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x38, 0x30, 0x34, 0x31, 0x33, 0x31, 0x35, @@ -13983,7 +18231,7 @@ 0x32, 0x31, 0x30, 0x31, 0x30, 0x37, 0x31, 0x35, 0x32, 0x33, 0x31, 0x30, 0x5a }; -static byte minPubKey[] = { +static const byte minPubKey[] = { 0x30, 0x1c, 0x30, 0x0d, 0x06, 0x09, @@ -13997,14 +18245,14 @@ 0x02, 0x03, 0x01, 0x00, 0x01 }; -static byte minSigAlg[] = { +static const byte minSigAlg[] = { 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00 }; -static byte minSig[] = { +static const byte minSig[] = { 0x03, 0x01, 0x00 }; @@ -14016,15 +18264,15 @@ certData[offset++] = length; return offset + length; } -static int add_data(byte* certData, int offset, byte* data, byte length) +static int add_data(byte* certData, int offset, const byte* data, byte length) { XMEMCPY(certData + offset, data, length); return offset + length; } -static int cert_asn1_test(void) +static wc_test_ret_t cert_asn1_test(void) { - int ret; + wc_test_ret_t ret; int len[3]; DecodedCert cert; byte certData[114]; @@ -14078,14 +18326,81 @@ return ret; } -WOLFSSL_TEST_SUBROUTINE int cert_test(void) +static wc_test_ret_t cert_load_bad(const char* fname, byte* tmp, int err) +{ + wc_test_ret_t ret; + DecodedCert cert; + XFILE file; + size_t bytes; + + if ((fname == NULL) || (tmp == NULL)) { + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + } + file = XFOPEN(fname, "rb"); + if (!file) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); + } + bytes = XFREAD(tmp, 1, FOURK_BUF, file); + XFCLOSE(file); + if (bytes == 0) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); + } + InitDecodedCert(&cert, tmp, (word32)bytes, 0); + ret = ParseCert(&cert, CERT_TYPE, NO_VERIFY, NULL); + FreeDecodedCert(&cert); + if (ret != err) { + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + } + ret = 0; + +done: + return ret; +} + +static wc_test_ret_t cert_bad_asn1_test(void) +{ + wc_test_ret_t ret = 0; + byte* tmp; + + tmp = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (tmp == NULL) { + ret = WC_TEST_RET_ENC_ERRNO; + } + +#ifndef WOLFSSL_ASN_INT_LEAD_0_ANY + if (ret == 0) { + /* Serial number: 0xff 0xa8. 0xff and top bit set on next byte invalid. + */ + ret = cert_load_bad(certBadNegInt, tmp, ASN_EXPECT_0_E); + } +#endif + if (ret == 0) { + /* Subject name OID: 55 04 f4. Last byte with top bit set invalid. */ + ret = cert_load_bad(certBadOid, tmp, ASN_PARSE_E); + } +#ifndef WOLFSSL_NO_ASN_STRICT + if (ret == 0) { + /* Issuer name UTF8STRING: df 52 4e 44. Top bit of second byte not set. + */ + ret = cert_load_bad(certBadUtf8, tmp, ASN_PARSE_E); + } +#endif + + XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + + return ret; +} + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cert_test(void) { #if !defined(NO_FILESYSTEM) DecodedCert cert; byte* tmp; size_t bytes; XFILE file; - int ret; + wc_test_ret_t ret; + WOLFSSL_ENTER("cert_test"); + tmp = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (tmp == NULL) @@ -14149,6 +18464,8 @@ if (ret == 0) ret = cert_asn1_test(); + if (ret == 0) + ret = cert_bad_asn1_test(); return ret; } @@ -14156,13 +18473,13 @@ #if defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_TEST_CERT) && \ !defined(NO_FILESYSTEM) && defined(WOLFSSL_CERT_GEN) -WOLFSSL_TEST_SUBROUTINE int certext_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t certext_test(void) { DecodedCert cert; byte* tmp; size_t bytes; XFILE file; - int ret; + wc_test_ret_t ret; /* created from rsa_test : othercert.der */ byte skid_rsa[] = "\x33\xD8\x45\x66\xD7\x68\x87\x18\x7E\x54" @@ -14188,6 +18505,7 @@ /* created from rsa_test : cert.der */ byte kid_ca[] = "\x33\xD8\x45\x66\xD7\x68\x87\x18\x7E\x54" "\x0D\x70\x27\x91\xC7\x26\xD7\x85\x65\xC0"; + WOLFSSL_ENTER("certext_test"); tmp = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (tmp == NULL) @@ -14351,13 +18669,14 @@ #if defined(WOLFSSL_CERT_GEN_CACHE) && defined(WOLFSSL_TEST_CERT) && \ defined(WOLFSSL_CERT_EXT) && defined(WOLFSSL_CERT_GEN) -WOLFSSL_TEST_SUBROUTINE int decodedCertCache_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t decodedCertCache_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; Cert cert; FILE* file; byte* der; word32 derSz; + WOLFSSL_ENTER("decodedCertCache_test"); derSz = FOURK_BUF; der = (byte *)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -14501,9 +18820,9 @@ #if !defined(NO_ASN) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \ !defined(WOLFSSL_RSA_VERIFY_ONLY) -static int rsa_flatten_test(RsaKey* key) +static wc_test_ret_t rsa_flatten_test(RsaKey* key) { - int ret; + wc_test_ret_t ret; byte e[RSA_TEST_BYTES]; byte n[RSA_TEST_BYTES]; word32 eSz = sizeof(e); @@ -14511,94 +18830,49 @@ /* Parameter Validation testing. */ ret = wc_RsaFlattenPublicKey(NULL, e, &eSz, n, &nSz); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#else if (ret != BAD_FUNC_ARG) -#endif return WC_TEST_RET_ENC_EC(ret); + ret = wc_RsaFlattenPublicKey(key, NULL, &eSz, n, &nSz); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#else if (ret != BAD_FUNC_ARG) -#endif return WC_TEST_RET_ENC_EC(ret); + ret = wc_RsaFlattenPublicKey(key, e, NULL, n, &nSz); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#else if (ret != BAD_FUNC_ARG) -#endif return WC_TEST_RET_ENC_EC(ret); + ret = wc_RsaFlattenPublicKey(key, e, &eSz, NULL, &nSz); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#else if (ret != BAD_FUNC_ARG) -#endif return WC_TEST_RET_ENC_EC(ret); + ret = wc_RsaFlattenPublicKey(key, e, &eSz, n, NULL); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#else if (ret != BAD_FUNC_ARG) -#endif return WC_TEST_RET_ENC_EC(ret); + ret = wc_RsaFlattenPublicKey(key, e, &eSz, n, &nSz); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); + eSz = 0; ret = wc_RsaFlattenPublicKey(key, e, &eSz, n, &nSz); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#elif defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - if (ret != 0) -#else if (ret != RSA_BUFFER_E) -#endif return WC_TEST_RET_ENC_EC(ret); + eSz = sizeof(e); nSz = 0; ret = wc_RsaFlattenPublicKey(key, e, &eSz, n, &nSz); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#else if (ret != RSA_BUFFER_E) -#endif return WC_TEST_RET_ENC_EC(ret); return 0; } #endif /* NO_ASN */ -#if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(NO_ASN) \ +#if !defined(HAVE_FIPS) && !defined(NO_ASN) \ && !defined(WOLFSSL_RSA_VERIFY_ONLY) -static int rsa_export_key_test(RsaKey* key) +static wc_test_ret_t rsa_export_key_test(RsaKey* key) { - int ret; + wc_test_ret_t ret; byte e[3]; word32 eSz = sizeof(e); byte n[RSA_TEST_BYTES]; @@ -14669,12 +18943,12 @@ return 0; } -#endif /* !HAVE_FIPS && !USER_RSA && !NO_ASN */ +#endif /* !HAVE_FIPS && !NO_ASN && !WOLFSSL_RSA_VERIFY_ONLY */ #ifndef NO_SIG_WRAPPER -static int rsa_sig_test(RsaKey* key, word32 keyLen, int modLen, WC_RNG* rng) +static wc_test_ret_t rsa_sig_test(RsaKey* key, word32 keyLen, int modLen, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; word32 sigSz; WOLFSSL_SMALL_STACK_STATIC const byte in[] = TEST_STRING; WOLFSSL_SMALL_STACK_STATIC const byte hash[] = { @@ -14731,12 +19005,7 @@ return WC_TEST_RET_ENC_EC(ret); ret = wc_SignatureGenerate(WC_HASH_TYPE_SHA256, WC_SIGNATURE_TYPE_RSA, in, inLen, out, &sigSz, key, keyLen, NULL); -#ifdef HAVE_USER_RSA - /* Implementation using IPP Libraries returns: - * -101 = USER_CRYPTO_ERROR - */ - if (ret == 0) -#elif defined(WOLFSSL_AFALG_XILINX_RSA) || defined(WOLFSSL_XILINX_CRYPT) +#if defined(WOLFSSL_AFALG_XILINX_RSA) || defined(WOLFSSL_XILINX_CRYPT) /* blinding / rng handled with hardware acceleration */ if (ret != 0) #elif defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLF_CRYPTO_CB) @@ -14867,10 +19136,11 @@ #endif /* !NO_SIG_WRAPPER */ #ifdef WC_RSA_NONBLOCK -static int rsa_nb_test(RsaKey* key, const byte* in, word32 inLen, byte* out, +static wc_test_ret_t rsa_nb_test(RsaKey* key, const byte* in, word32 inLen, byte* out, word32 outSz, byte* plain, word32 plainSz, WC_RNG* rng) { - int ret = 0, count; + wc_test_ret_t ret = 0; + int count; int signSz = 0; RsaNb nb; byte* inlinePlain = NULL; @@ -14953,10 +19223,10 @@ } #endif -#if !defined(HAVE_USER_RSA) && !defined(NO_ASN) -static int rsa_decode_test(RsaKey* keyPub) +#if !defined(NO_ASN) +static wc_test_ret_t rsa_decode_test(RsaKey* keyPub) { - int ret; + wc_test_ret_t ret; word32 inSz; word32 inOutIdx; WOLFSSL_SMALL_STACK_STATIC const byte n[2] = { 0x00, 0x23 }; @@ -15024,11 +19294,12 @@ goto done; } ret = wc_RsaPublicKeyDecodeRaw(n, (word32)-1, e, sizeof(e), keyPub); -#if !defined(WOLFSSL_SP_MATH) & !defined(WOLFSSL_SP_MATH_ALL) - if (ret != 0) { +#if defined(USE_INTEGER_HEAP_MATH) + if (ret != 0) #else - if (ret != ASN_GETINT_E) { + if (ret != ASN_GETINT_E) #endif + { ret = WC_TEST_RET_ENC_EC(ret); goto done; } @@ -15037,11 +19308,12 @@ if (ret != 0) return WC_TEST_RET_ENC_EC(ret); ret = wc_RsaPublicKeyDecodeRaw(n, sizeof(n), e, (word32)-1, keyPub); -#if !defined(WOLFSSL_SP_MATH) & !defined(WOLFSSL_SP_MATH_ALL) - if (ret != 0) { +#if defined(USE_INTEGER_HEAP_MATH) + if (ret != 0) #else - if (ret != ASN_GETINT_E) { + if (ret != ASN_GETINT_E) #endif + { ret = WC_TEST_RET_ENC_EC(ret); goto done; } @@ -15242,10 +19514,10 @@ /* Need to create known good signatures to test with this. */ #if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \ !defined(WOLF_CRYPTO_CB_ONLY_RSA) -static int rsa_pss_test(WC_RNG* rng, RsaKey* key) +static wc_test_ret_t rsa_pss_test(WC_RNG* rng, RsaKey* key) { byte digest[WC_MAX_DIGEST_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; const char inStr[] = TEST_STRING; word32 inLen = (word32)TEST_STRING_SZ; word32 outSz; @@ -15294,6 +19566,10 @@ WC_DECLARE_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); WC_DECLARE_VAR(sig, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(in, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(sig, byte, RSA_TEST_BYTES, HEAP_HINT); + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC if (in == NULL || out == NULL || sig == NULL) ERROR_OUT(MEMORY_E, exit_rsa_pss); @@ -15306,7 +19582,7 @@ ret = wc_Hash(hash[j], in, inLen, digest, sizeof(digest)); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); - digestSz = wc_HashGetDigestSize(hash[j]); + digestSz = (word32)wc_HashGetDigestSize(hash[j]); #ifdef WOLFSSL_SE050 /* SE050 only supports MGF matched to same hash type */ @@ -15327,7 +19603,7 @@ } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); - outSz = ret; + outSz = (word32)ret; XMEMCPY(sig, out, outSz); plain = NULL; @@ -15345,7 +19621,7 @@ } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); - plainSz = ret; + plainSz = (word32)ret; TEST_SLEEP(); #if defined(HAVE_SELFTEST) && \ @@ -15393,7 +19669,7 @@ /* SE050 generates salts internally only of hash length */ #ifndef WOLFSSL_SE050 /* Test that a salt length of zero works. */ - digestSz = wc_HashGetDigestSize(hash[0]); + digestSz = (word32)wc_HashGetDigestSize(hash[0]); outSz = RSA_TEST_BYTES; do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -15407,7 +19683,7 @@ } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); - outSz = ret; + outSz = (word32)ret; TEST_SLEEP(); do { @@ -15422,7 +19698,7 @@ } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); - plainSz = ret; + plainSz = (word32)ret; TEST_SLEEP(); do { @@ -15461,7 +19737,7 @@ } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); - plainSz = ret; + plainSz = (word32)ret; TEST_SLEEP(); #if defined(HAVE_SELFTEST) && \ @@ -15479,7 +19755,7 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); /* Test bad salt lengths in various APIs. */ - digestSz = wc_HashGetDigestSize(hash[0]); + digestSz = (word32)wc_HashGetDigestSize(hash[0]); outSz = RSA_TEST_BYTES; #ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER len = -2; @@ -15560,9 +19836,9 @@ if (ret != PSS_SALTLEN_E) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa_pss); #ifndef WOLFSSL_PSS_LONG_SALT - len = digestSz + 1; + len = (int)(digestSz + 1); #else - len = plainSz - digestSz - 1; + len = (int)(plainSz - digestSz - 1); #endif #if defined(HAVE_SELFTEST) && \ (!defined(HAVE_SELFTEST_VERSION) || (HAVE_SELFTEST_VERSION < 2)) @@ -15595,12 +19871,12 @@ #endif #ifdef WC_RSA_NO_PADDING -WOLFSSL_TEST_SUBROUTINE int rsa_no_pad_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t rsa_no_pad_test(void) { WC_RNG rng; byte* tmp = NULL; size_t bytes; - int ret; + wc_test_ret_t ret; word32 inLen = 0; word32 idx = 0; word32 outSz = RSA_TEST_BYTES; @@ -15614,6 +19890,11 @@ WC_DECLARE_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); WC_DECLARE_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(key, RsaKey, 1, HEAP_HINT); + WC_ALLOC_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); + WOLFSSL_ENTER("rsa_no_pad_test"); + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC if (key == NULL || out == NULL || plain == NULL) ERROR_OUT(MEMORY_E, exit_rsa_nopadding); @@ -15689,7 +19970,7 @@ } #ifndef WOLFSSL_RSA_VERIFY_ONLY - inLen = wc_RsaEncryptSize(key); + inLen = (word32)wc_RsaEncryptSize(key); outSz = inLen; plainSz = inLen; XMEMSET(tmp, 7, inLen); @@ -15751,7 +20032,7 @@ ret = wc_AsyncWait(ret, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret >= 0) { - ret = wc_RsaPublicEncrypt_ex(tmp, inLen, out, (int)outSz, key, &rng, + ret = wc_RsaPublicEncrypt_ex(tmp, inLen, out, outSz, key, &rng, WC_RSA_NO_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0); } } while (ret == WC_PENDING_E); @@ -15767,7 +20048,7 @@ ret = wc_AsyncWait(ret, &key->asyncDev, WC_ASYNC_FLAG_CALL_AGAIN); #endif if (ret >= 0) { - ret = wc_RsaPrivateDecrypt_ex(out, outSz, plain, (int)plainSz, key, + ret = wc_RsaPrivateDecrypt_ex(out, outSz, plain, plainSz, key, WC_RSA_NO_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0); } } while (ret == WC_PENDING_E); @@ -15823,11 +20104,11 @@ #endif /* WC_RSA_NO_PADDING */ #if defined(WOLFSSL_HAVE_SP_RSA) && defined(USE_FAST_MATH) -static int rsa_even_mod_test(WC_RNG* rng, RsaKey* key) +static wc_test_ret_t rsa_even_mod_test(WC_RNG* rng, RsaKey* key) { byte* tmp = NULL; size_t bytes; - int ret; + wc_test_ret_t ret; word32 inLen = 0; #ifndef NO_ASN word32 idx = 0; @@ -15844,6 +20125,12 @@ #ifndef WOLFSSL_RSA_PUBLIC_ONLY WC_DECLARE_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); #endif + + WC_ALLOC_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); +#ifndef WOLFSSL_RSA_PUBLIC_ONLY + WC_ALLOC_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); +#endif + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC if (out == NULL #ifndef WOLFSSL_RSA_PUBLIC_ONLY @@ -15992,7 +20279,7 @@ #endif /* WOLFSSL_HAVE_SP_RSA */ #if defined(WOLFSSL_CERT_GEN) && !defined(NO_ASN_TIME) -static int rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) +static wc_test_ret_t rsa_certgen_test(RsaKey* key, RsaKey* keypub, WC_RNG* rng, byte* tmp) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) RsaKey *caKey = (RsaKey *)XMALLOC(sizeof *caKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -16006,7 +20293,7 @@ #endif #endif byte* der = NULL; - int ret; + wc_test_ret_t ret; Cert* myCert = NULL; int certSz; size_t bytes3; @@ -16107,7 +20394,7 @@ if (ret < 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); } - certSz = ret; + certSz = (int)ret; #ifdef WOLFSSL_TEST_CERT InitDecodedCert(decode, der, certSz, HEAP_HINT); @@ -16130,8 +20417,7 @@ if (ret < 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); } - -#ifdef WOLFSSL_ALT_NAMES +#if defined(WOLFSSL_ALT_NAMES) || defined(HAVE_PKCS7) /* Get CA Cert for testing */ #ifdef USE_CERT_BUFFERS_1024 XMEMCPY(tmp, ca_cert_der_1024, sizeof_ca_cert_der_1024); @@ -16150,6 +20436,7 @@ ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa); #endif /* USE_CERT_BUFFERS */ + #if defined(WOLFSSL_ALT_NAMES) #if !defined(NO_FILESYSTEM) && !defined(USE_CERT_BUFFERS_1024) && \ !defined(USE_CERT_BUFFERS_2048) && !defined(NO_ASN) ret = wc_SetAltNames(myCert, rsaCaCertFile); @@ -16171,7 +20458,8 @@ if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); #endif -#endif /* WOLFSSL_ALT_NAMES */ + #endif /* WOLFSSL_ALT_NAMES */ +#endif /* WOLFSSL_ALT_NAMES || HAVE_PKCS7 */ /* Get CA Key */ #ifdef USE_CERT_BUFFERS_1024 @@ -16266,7 +20554,7 @@ } while (ret == WC_PENDING_E); if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); - certSz = ret; + certSz = (int)ret; #ifdef WOLFSSL_TEST_CERT InitDecodedCert(decode, der, certSz, HEAP_HINT); @@ -16309,7 +20597,7 @@ #if !defined(NO_RSA) && defined(HAVE_ECC) && !defined(NO_ECC_SECP) && \ defined(WOLFSSL_CERT_GEN) /* Make Cert / Sign example for ECC cert and RSA CA */ -static int rsa_ecc_certgen_test(WC_RNG* rng, byte* tmp) +static wc_test_ret_t rsa_ecc_certgen_test(WC_RNG* rng, byte* tmp) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) RsaKey *caKey = (RsaKey *)XMALLOC(sizeof *caKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -16333,9 +20621,11 @@ word32 idx3 = 0; #if (!defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048)) \ || !defined(USE_CERT_BUFFERS_256) - XFILE file3; + #ifndef NO_FILESYSTEM + XFILE file3; + #endif #endif - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((caKey == NULL) || (caEccKey == NULL) || (caEccKeyPub == NULL) @@ -16386,20 +20676,29 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); /* Get Cert Key */ -#ifdef USE_CERT_BUFFERS_256 - XMEMCPY(tmp, ecc_key_pub_der_256, sizeof_ecc_key_pub_der_256); - bytes3 = sizeof_ecc_key_pub_der_256; -#else - file3 = XFOPEN(eccKeyPubFileDer, "rb"); - if (!file3) { - ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa); + #if defined(USE_CERT_BUFFERS_256) + { + XMEMCPY(tmp, ecc_key_pub_der_256, sizeof_ecc_key_pub_der_256); + bytes3 = sizeof_ecc_key_pub_der_256; } + #elif !defined(NO_FILESYSTEM) + { + file3 = XFOPEN(eccKeyPubFileDer, "rb"); + if (!file3) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa); + } - bytes3 = XFREAD(tmp, 1, FOURK_BUF, file3); - XFCLOSE(file3); - if (bytes3 == 0) - ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa); -#endif + bytes3 = XFREAD(tmp, 1, FOURK_BUF, file3); + XFCLOSE(file3); + if (bytes3 == 0) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa); + } + #else + { + WOLFSSL_MSG("No file system and USE_CERT_BUFFERS_256 not defined.(1)"); + ERROR_OUT(ASN_PARSE_E, exit_rsa); + } + #endif ret = wc_ecc_init_ex(caEccKeyPub, HEAP_HINT, devId); if (ret != 0) @@ -16484,7 +20783,7 @@ } while (ret == WC_PENDING_E); if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); - certSz = ret; + certSz = (int)ret; #ifdef WOLFSSL_TEST_CERT InitDecodedCert(decode, der, certSz, 0); @@ -16539,15 +20838,19 @@ #endif /* !NO_RSA && HAVE_ECC && WOLFSSL_CERT_GEN */ #ifdef WOLFSSL_KEY_GEN -static int rsa_keygen_test(WC_RNG* rng) +static wc_test_ret_t rsa_keygen_test(WC_RNG* rng) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) RsaKey *genKey = (RsaKey *)XMALLOC(sizeof *genKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #else RsaKey genKey[1]; #endif - int ret; + wc_test_ret_t ret; +#ifndef WOLFSSL_NO_MALLOC byte* der = NULL; +#else + byte der[1024]; +#endif #ifndef WOLFSSL_CRYPTOCELL word32 idx = 0; #endif @@ -16592,11 +20895,12 @@ if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); #endif +#ifndef WOLFSSL_NO_MALLOC der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (der == NULL) { ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa); } - +#endif derSz = wc_RsaKeyToDer(genKey, der, FOURK_BUF); if (derSz < 0) { ERROR_OUT(WC_TEST_RET_ENC_EC(derSz), exit_rsa); @@ -16616,7 +20920,7 @@ #ifndef WOLFSSL_CRYPTOCELL idx = 0; /* The private key part of the key gen pairs from cryptocell can't be exported */ - ret = wc_RsaPrivateKeyDecode(der, &idx, genKey, derSz); + ret = wc_RsaPrivateKeyDecode(der, &idx, genKey, (word32)derSz); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); #endif /* WOLFSSL_CRYPTOCELL */ @@ -16632,10 +20936,12 @@ wc_FreeRsaKey(genKey); #endif +#ifndef WOLFSSL_NO_MALLOC if (der != NULL) { XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); der = NULL; } +#endif return ret; } @@ -16643,13 +20949,12 @@ #ifndef WOLFSSL_RSA_VERIFY_ONLY #if !defined(WC_NO_RSA_OAEP) && !defined(WC_NO_RNG) && \ - !defined(HAVE_FAST_RSA) && !defined(HAVE_USER_RSA) && \ - (!defined(HAVE_FIPS) || \ + (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))) \ && !defined(WOLF_CRYPTO_CB_ONLY_RSA) -static int rsa_oaep_padding_test(RsaKey* key, WC_RNG* rng) +static wc_test_ret_t rsa_oaep_padding_test(RsaKey* key, WC_RNG* rng) { - int ret = 0; + wc_test_ret_t ret = 0; word32 idx = 0; const char inStr[] = TEST_STRING; const word32 inLen = (word32)TEST_STRING_SZ; @@ -16661,6 +20966,10 @@ WC_DECLARE_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); WC_DECLARE_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(in, byte, TEST_STRING_SZ, HEAP_HINT); + WC_ALLOC_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC if (in == NULL || out == NULL || plain == NULL) ERROR_OUT(MEMORY_E, exit_rsa); @@ -16891,7 +21200,7 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); TEST_SLEEP(); - idx = ret; + idx = (word32)ret; #ifndef WOLFSSL_RSA_PUBLIC_ONLY do { #if defined(WOLFSSL_ASYNC_CRYPT) @@ -16966,9 +21275,9 @@ #endif #endif -WOLFSSL_TEST_SUBROUTINE int rsa_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t rsa_test(void) { - int ret; + wc_test_ret_t ret; size_t bytes; WC_RNG rng; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -17021,6 +21330,11 @@ WC_DECLARE_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); WC_DECLARE_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(in, byte, TEST_STRING_SZ, HEAP_HINT); + WC_ALLOC_VAR(out, byte, RSA_TEST_BYTES, HEAP_HINT); + WC_ALLOC_VAR(plain, byte, RSA_TEST_BYTES, HEAP_HINT); + WOLFSSL_ENTER("rsa_test"); + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC if (in == NULL || out == NULL || plain == NULL) ERROR_OUT(MEMORY_E, exit_rsa); @@ -17048,7 +21362,7 @@ XMEMSET(keypub, 0, sizeof *keypub); #endif -#if !defined(HAVE_USER_RSA) && !defined(NO_ASN) +#if !defined(NO_ASN) ret = rsa_decode_test(key); if (ret != 0) ERROR_OUT(ret, exit_rsa); @@ -17169,7 +21483,7 @@ #ifdef WC_RSA_BLINDING { - int tmpret = ret; + wc_test_ret_t tmpret = ret; ret = wc_RsaSetRNG(key, &rng); if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); @@ -17226,7 +21540,7 @@ #elif defined(WOLFSSL_PUBLIC_MP) { - static byte signature_2048[] = { + static const byte signature_2048[] = { 0x07, 0x6f, 0xc9, 0x85, 0x73, 0x9e, 0x21, 0x79, 0x47, 0xf1, 0xa3, 0xd7, 0xf4, 0x27, 0x29, 0xbe, 0x99, 0x5d, 0xac, 0xb2, 0x10, 0x3f, 0x95, 0xda, @@ -17312,19 +21626,18 @@ #ifndef WOLFSSL_RSA_VERIFY_ONLY #if !defined(WC_NO_RSA_OAEP) && !defined(WC_NO_RNG) - #if !defined(HAVE_FAST_RSA) && !defined(HAVE_USER_RSA) && \ - (!defined(HAVE_FIPS) || \ + #if (!defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2))) \ && !defined(WOLF_CRYPTO_CB_ONLY_RSA) ret = rsa_oaep_padding_test(key, &rng); if (ret != 0) return ret; - #endif /* !HAVE_FAST_RSA && !HAVE_FIPS */ + #endif /* !HAVE_FIPS */ #endif /* WC_NO_RSA_OAEP && !WC_NO_RNG */ #endif /* WOLFSSL_RSA_VERIFY_ONLY */ -#if !defined(HAVE_FIPS) && !defined(HAVE_USER_RSA) && !defined(NO_ASN) \ +#if !defined(HAVE_FIPS) && !defined(NO_ASN) \ && !defined(WOLFSSL_RSA_VERIFY_ONLY) ret = rsa_export_key_test(key); if (ret != 0) @@ -17548,7 +21861,7 @@ } while (ret == WC_PENDING_E); if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa); - derSz = ret; + derSz = (int)ret; ret = SaveDerAndPem(der, derSz, certReqDerFile, certReqPemFile, CERTREQ_TYPE); @@ -17654,9 +21967,9 @@ #ifndef NO_DH -static int dh_fips_generate_test(WC_RNG *rng) +static wc_test_ret_t dh_fips_generate_test(WC_RNG *rng) { - int ret = 0; + wc_test_ret_t ret = 0; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) DhKey *key = (DhKey *)XMALLOC(sizeof *key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #else @@ -17866,9 +22179,9 @@ return ret; } -static int dh_generate_test(WC_RNG *rng) +static wc_test_ret_t dh_generate_test(WC_RNG *rng) { - int ret = 0; + wc_test_ret_t ret = 0; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) DhKey *smallKey = NULL; #else @@ -17959,6 +22272,11 @@ if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_gen_test); + /* should fail since modSz is 16 and group size is 20 */ + ret = wc_DhGenerateParams(rng, 128, smallKey); + if (ret == 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_gen_test); + ret = wc_DhGenerateParams(rng, 2056, smallKey); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_gen_test); @@ -17993,9 +22311,9 @@ word32 len; } dh_pubvalue_test; -static int dh_test_check_pubvalue(void) +static wc_test_ret_t dh_test_check_pubvalue(void) { - int ret; + wc_test_ret_t ret; word32 i; WOLFSSL_SMALL_STACK_STATIC const byte prime[] = {0x01, 0x00, 0x01}; WOLFSSL_SMALL_STACK_STATIC const byte pubValZero[] = { 0x00 }; @@ -18071,12 +22389,12 @@ (defined(WOLFSSL_SP_ARM64_ASM) || defined(WOLFSSL_SP_ARM32_ASM))) #ifdef HAVE_PUBLIC_FFDHE -static int dh_ffdhe_test(WC_RNG *rng, const DhParams* params) +static wc_test_ret_t dh_ffdhe_test(WC_RNG *rng, const DhParams* params) #else -static int dh_ffdhe_test(WC_RNG *rng, int name) +static wc_test_ret_t dh_ffdhe_test(WC_RNG *rng, int name) #endif { - int ret; + wc_test_ret_t ret; word32 privSz, pubSz, privSz2, pubSz2; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) byte *priv = (byte*)XMALLOC(MAX_DH_PRIV_SZ, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -18181,7 +22499,8 @@ ERROR_OUT(WC_TEST_RET_ENC_NC, done); } -#if defined(WOLFSSL_HAVE_SP_DH) || defined(USE_FAST_MATH) +#if (defined(WOLFSSL_HAVE_SP_DH) || defined(USE_FAST_MATH)) && \ + !defined(HAVE_INTEL_QA) /* Make p even */ key->p.dp[0] &= (mp_digit)-2; if (ret != 0) @@ -18213,7 +22532,7 @@ /* Getting here means success - set ret to 0. */ ret = 0; -#endif +#endif /* (SP DH or Fast Math) and not Intel QuickAssist */ done: @@ -18250,9 +22569,9 @@ #endif /* !WC_NO_RNG */ #endif /* HAVE_FFDHE */ -WOLFSSL_TEST_SUBROUTINE int dh_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dh_test(void) { - int ret; + wc_test_ret_t ret; word32 bytes; word32 idx = 0, privSz, pubSz, privSz2, pubSz2; #ifndef WC_NO_RNG @@ -18304,6 +22623,8 @@ #endif #endif /* !WC_NO_RNG */ + WOLFSSL_ENTER("dh_test"); + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if (key == NULL || key2 == NULL || tmp == NULL) { ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); @@ -18479,6 +22800,11 @@ #else byte tmp2[DH_TEST_TMP_SIZE]; #endif + + #if defined(USE_CERT_BUFFERS_2048) + XMEMCPY(tmp, dh_ffdhe_statickey_der_2048, sizeof_dh_ffdhe_statickey_der_2048); + bytes = sizeof_dh_ffdhe_statickey_der_2048; + #else XFILE file = XFOPEN(dhKeyFile, "rb"); if (!file) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); @@ -18486,7 +22812,7 @@ XFCLOSE(file); if (bytes == 0) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); - + #endif #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) tmp2 = (byte*)XMALLOC(DH_TEST_TMP_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (tmp2 == NULL) @@ -18510,6 +22836,10 @@ /* DH Public Key - Export / Import */ + #if defined(USE_CERT_BUFFERS_2048) + XMEMCPY(tmp, dh_ffdhe_pub_statickey_der_2048, sizeof_dh_ffdhe_pub_statickey_der_2048); + bytes = sizeof_dh_ffdhe_pub_statickey_der_2048; + #else file = XFOPEN(dhKeyPubFile, "rb"); if (!file) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); @@ -18517,6 +22847,7 @@ XFCLOSE(file); if (bytes == 0) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); + #endif /* for HAVE_WOLF_BIGINT prevent leak */ wc_FreeDhKey(key); @@ -18677,17 +23008,22 @@ #ifndef NO_DSA -WOLFSSL_TEST_SUBROUTINE int dsa_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dsa_test(void) { - int ret = 0, answer; + wc_test_ret_t ret = 0; + int answer; word32 bytes; word32 idx = 0; WC_RNG rng; + int rng_inited = 0; wc_Sha sha; byte hash[WC_SHA_DIGEST_SIZE]; byte signature[40]; + int key_inited = 0; #ifdef WOLFSSL_KEY_GEN byte* der = 0; + int derIn_inited = 0; + int genKey_inited = 0; #endif #define DSA_TEST_TMP_SIZE 1024 #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -18697,6 +23033,9 @@ DsaKey *derIn = (DsaKey *)XMALLOC(sizeof *derIn, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); DsaKey *genKey = (DsaKey *)XMALLOC(sizeof *genKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #endif + WOLFSSL_ENTER("dsa_test"); + + if ((tmp == NULL) || (key == NULL) #ifdef WOLFSSL_KEY_GEN @@ -18745,6 +23084,7 @@ ret = wc_InitDsaKey(key); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + key_inited = 1; ret = wc_DsaPrivateKeyDecode(tmp, &idx, key, bytes); if (ret != 0) @@ -18757,6 +23097,7 @@ #endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + rng_inited = 1; ret = wc_DsaSign(hash, signature, key, &rng); if (ret != 0) @@ -18769,6 +23110,12 @@ ERROR_OUT(WC_TEST_RET_ENC_NC, out); wc_FreeDsaKey(key); + key_inited = 0; + + ret = wc_InitDsaKey_h(key, NULL); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + key_inited = 1; #ifdef WOLFSSL_KEY_GEN { @@ -18777,70 +23124,43 @@ ret = wc_InitDsaKey(genKey); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + genKey_inited = 1; ret = wc_MakeDsaParameters(&rng, 1024, genKey); - if (ret != 0) { - wc_FreeDsaKey(genKey); + if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - } ret = wc_MakeDsaKey(&rng, genKey); - if (ret != 0) { - wc_FreeDsaKey(genKey); + if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - } der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (der == NULL) { - wc_FreeDsaKey(genKey); + if (der == NULL) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - } derSz = wc_DsaKeyToDer(genKey, der, FOURK_BUF); - if (derSz < 0) { - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (derSz < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(derSz), out); - } ret = SaveDerAndPem(der, derSz, keyDerFile, keyPemFile, DSA_PRIVATEKEY_TYPE); - if (ret != 0) { - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - wc_FreeDsaKey(genKey); + if (ret != 0) goto out; - } ret = wc_InitDsaKey(derIn); - if (ret != 0) { - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - wc_FreeDsaKey(genKey); + if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - } + derIn_inited = 1; idx = 0; - ret = wc_DsaPrivateKeyDecode(der, &idx, derIn, derSz); - if (ret != 0) { - XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - wc_FreeDsaKey(derIn); - wc_FreeDsaKey(genKey); + ret = wc_DsaPrivateKeyDecode(der, &idx, derIn, (word32)derSz); + if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } - - } #endif /* WOLFSSL_KEY_GEN */ out: -#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) - if (key) { -#endif - ret = wc_InitDsaKey_h(key, NULL); - if (ret != 0) - ret = WC_TEST_RET_ENC_EC(ret); -#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) - } -#endif - #ifdef WOLFSSL_KEY_GEN if (der) XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -18849,29 +23169,39 @@ #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if (tmp) XFREE(tmp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); - if (key) + if (key) { + if (key_inited) + wc_FreeDsaKey(key); XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + } #ifdef WOLFSSL_KEY_GEN if (derIn) { - wc_FreeDsaKey(derIn); + if (derIn_inited) + wc_FreeDsaKey(derIn); XFREE(derIn, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } if (genKey) { - wc_FreeDsaKey(genKey); + if (genKey_inited) + wc_FreeDsaKey(genKey); XFREE(genKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); } #endif #else /* !WOLFSSL_SMALL_STACK || WOLFSSL_NO_MALLOC */ + if (key_inited) + wc_FreeDsaKey(key); #ifdef WOLFSSL_KEY_GEN - wc_FreeDsaKey(derIn); - wc_FreeDsaKey(genKey); + if (derIn_inited) + wc_FreeDsaKey(derIn); + if (genKey_inited) + wc_FreeDsaKey(genKey); #endif #endif - wc_FreeRng(&rng); + if (rng_inited) + wc_FreeRng(&rng); return ret; } @@ -18880,9 +23210,9 @@ #ifdef WOLFCRYPT_HAVE_SRP -static int generate_random_salt(byte *buf, word32 size) +static wc_test_ret_t generate_random_salt(byte *buf, word32 size) { - int ret = WC_TEST_RET_ENC_NC; + wc_test_ret_t ret = WC_TEST_RET_ENC_NC; WC_RNG rng; if(NULL == buf || !size) @@ -18897,9 +23227,9 @@ return ret; } -static int srp_test_digest(SrpType dgstType) +static wc_test_ret_t srp_test_digest(SrpType dgstType) { - int r; + wc_test_ret_t r; byte clientPubKey[192]; /* A */ byte serverPubKey[192]; /* B */ @@ -19042,9 +23372,10 @@ return r; } -WOLFSSL_TEST_SUBROUTINE int srp_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t srp_test(void) { - int ret; + wc_test_ret_t ret; + WOLFSSL_ENTER("srp_test"); #ifndef NO_SHA ret = srp_test_digest(SRP_TYPE_SHA); @@ -19075,7 +23406,7 @@ #if defined(OPENSSL_EXTRA) && !defined(WOLFCRYPT_ONLY) #if !defined(NO_AES) && !defined(WOLFCRYPT_ONLY) -static int openssl_aes_test(void) +static wc_test_ret_t openssl_aes_test(void) { #ifdef HAVE_AES_CBC #ifdef WOLFSSL_AES_128 @@ -19142,6 +23473,8 @@ if (total != 32) return 3408; + EVP_CIPHER_CTX_cleanup(en); + total = 0; EVP_CIPHER_CTX_init(de); if (EVP_CipherInit(de, EVP_aes_128_cbc(), @@ -19179,6 +23512,8 @@ if (XMEMCMP(plain, cbcPlain, 18)) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(de); + /* test with encrypting/decrypting more than 16 bytes at once */ total = 0; EVP_CIPHER_CTX_init(en); @@ -19207,6 +23542,8 @@ if (total != 32) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(en); + total = 0; EVP_CIPHER_CTX_init(de); if (EVP_CipherInit(de, EVP_aes_128_cbc(), @@ -19253,6 +23590,8 @@ plain[i] = i; } + EVP_CIPHER_CTX_cleanup(de); + total = 0; EVP_CIPHER_CTX_init(en); if (EVP_CipherInit(en, EVP_aes_128_cbc(), @@ -19273,6 +23612,8 @@ if (total != sizeof(plain)) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(en); + total = 0; EVP_CIPHER_CTX_init(de); if (EVP_CipherInit(de, EVP_aes_128_cbc(), @@ -19308,6 +23649,8 @@ } } + EVP_CIPHER_CTX_cleanup(de); + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) wolfSSL_EVP_CIPHER_CTX_free(en); wolfSSL_EVP_CIPHER_CTX_free(de); @@ -19371,6 +23714,8 @@ if (EVP_CipherFinal(en, (byte*)&cipher[total], &outlen) != 0) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(en); + /* turn padding back on and do successful encrypt */ total = 0; EVP_CIPHER_CTX_init(en); @@ -19393,6 +23738,8 @@ return WC_TEST_RET_ENC_NC; XMEMCPY(cipher, padded, EVP_TEST_BUF_SZ); + EVP_CIPHER_CTX_cleanup(en); + /* test out of bounds read on buffers w/o padding during decryption */ total = 0; EVP_CIPHER_CTX_init(de); @@ -19413,6 +23760,8 @@ if (EVP_CipherFinal(de, (byte*)&plain[total], &outlen) != 0) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(de); + total = 0; EVP_CIPHER_CTX_init(de); if (EVP_CipherInit(de, EVP_aes_128_cbc(), @@ -19432,6 +23781,8 @@ if (XMEMCMP(padded, cbcPlain, EVP_TEST_BUF_SZ)) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(de); + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) wolfSSL_EVP_CIPHER_CTX_free(en); wolfSSL_EVP_CIPHER_CTX_free(de); @@ -19480,6 +23831,8 @@ if (XMEMCMP(cipher, verify, AES_BLOCK_SIZE)) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(ctx); + EVP_CIPHER_CTX_init(ctx); if (EVP_CipherInit(ctx, EVP_aes_128_cbc(), key, iv, 0) == 0) return WC_TEST_RET_ENC_NC; @@ -19490,6 +23843,8 @@ if (XMEMCMP(plain, msg, AES_BLOCK_SIZE)) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(ctx); + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) wolfSSL_EVP_CIPHER_CTX_free(ctx); #endif @@ -19497,6 +23852,8 @@ #endif /* WOLFSSL_AES_128 */ #endif /* HAVE_AES_CBC */ +#ifndef WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API + #if defined(HAVE_AES_ECB) && defined(WOLFSSL_AES_256) { /* evp_cipher test: EVP_aes_256_ecb*/ #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -19630,6 +23987,8 @@ } #endif /* WOLFSSL_AES_DIRECT && WOLFSSL_AES_256 */ +#endif /* !WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API */ + /* EVP_Cipher with EVP_aes_xxx_ctr() */ #ifdef WOLFSSL_AES_COUNTER { @@ -19777,6 +24136,11 @@ AES_BLOCK_SIZE*4) != AES_BLOCK_SIZE*4) return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(en) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(de) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(cipherBuff, ctrCipher, AES_BLOCK_SIZE*4)) return WC_TEST_RET_ENC_NC; if (XMEMCMP(plainBuff, ctrPlain, AES_BLOCK_SIZE*4)) @@ -19804,6 +24168,11 @@ AES_BLOCK_SIZE*4) != AES_BLOCK_SIZE*4) return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(en) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(de) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + wolfSSL_EVP_CIPHER_CTX_free(p_en); wolfSSL_EVP_CIPHER_CTX_free(p_de); #endif /* WOLFSSL_SMALL_STACK && !WOLFSSL_NO_MALLOC */ @@ -19842,6 +24211,11 @@ return WC_TEST_RET_ENC_NC; if (XMEMCMP(cipherBuff, oddCipher, 9)) return WC_TEST_RET_ENC_NC; + + if (wolfSSL_EVP_CIPHER_CTX_cleanup(en) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(de) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; #endif /* WOLFSSL_AES_128 */ #ifdef WOLFSSL_AES_192 @@ -19866,6 +24240,11 @@ return WC_TEST_RET_ENC_NC; if (XMEMCMP(ctr192Cipher, cipherBuff, sizeof(ctr192Cipher))) return WC_TEST_RET_ENC_NC; + + if (wolfSSL_EVP_CIPHER_CTX_cleanup(en) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(de) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 @@ -19891,6 +24270,11 @@ if (XMEMCMP(ctr256Cipher, cipherBuff, sizeof(ctr256Cipher))) return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(en) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + if (wolfSSL_EVP_CIPHER_CTX_cleanup(de) != WOLFSSL_SUCCESS) + return WC_TEST_RET_ENC_NC; + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) wolfSSL_EVP_CIPHER_CTX_free(en); wolfSSL_EVP_CIPHER_CTX_free(de); @@ -19900,6 +24284,8 @@ } #endif /* HAVE_AES_COUNTER */ +#ifndef WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API + #if defined(WOLFSSL_AES_CFB) && defined(WOLFSSL_AES_128) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -19975,19 +24361,33 @@ #endif } #endif /* WOLFSSL_AES_CFB && WOLFSSL_AES_128 */ + +#endif /* !WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API */ + return 0; } #endif /* !defined(NO_AES) && !defined(WOLFCRYPT_ONLY) */ -WOLFSSL_TEST_SUBROUTINE int openssl_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void) { - int ret; - EVP_MD_CTX md_ctx; + wc_test_ret_t ret; +#ifdef WOLFSSL_SMALL_STACK + EVP_MD_CTX *md_ctx = (EVP_MD_CTX *)XMALLOC(sizeof(EVP_MD_CTX), NULL, DYNAMIC_TYPE_OPENSSL); +#else + EVP_MD_CTX md_ctx[1]; +#endif testVector a, b, c, d, e, f; byte hash[WC_SHA256_DIGEST_SIZE*2]; /* max size */ +#ifdef WOLFSSL_SMALL_STACK + if (md_ctx == NULL) + return WC_TEST_RET_ENC_EC(MEMORY_E); +#endif + + WOLFSSL_ENTER("openssl_test"); + a.inLen = 0; b.inLen = c.inLen = d.inLen = e.inLen = f.inLen = a.inLen; @@ -20019,15 +24419,15 @@ a.inLen = XSTRLEN(a.input); a.outLen = WC_MD5_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_md5()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_md5()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, a.input, (unsigned long)a.inLen); + ret = EVP_DigestUpdate(md_ctx, a.input, (unsigned long)a.inLen); } if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS) return WC_TEST_RET_ENC_NC; if (XMEMCMP(hash, a.output, WC_MD5_DIGEST_SIZE) != 0) @@ -20043,14 +24443,14 @@ b.inLen = XSTRLEN(b.input); b.outLen = WC_SHA_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha1()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha1()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, b.input, (unsigned long)b.inLen); + ret = EVP_DigestUpdate(md_ctx, b.input, (unsigned long)b.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS) return WC_TEST_RET_ENC_NC; if (XMEMCMP(hash, b.output, b.outLen) != 0) @@ -20065,14 +24465,14 @@ e.inLen = XSTRLEN(e.input); e.outLen = WC_SHA224_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha224()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha224()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen); + ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20086,14 +24486,14 @@ d.inLen = XSTRLEN(d.input); d.outLen = WC_SHA256_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha256()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha256()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, d.input, (unsigned long)d.inLen); + ret = EVP_DigestUpdate(md_ctx, d.input, (unsigned long)d.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, d.output, d.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20109,14 +24509,14 @@ e.inLen = XSTRLEN(e.input); e.outLen = WC_SHA384_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha384()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha384()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen); + ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20133,14 +24533,14 @@ f.inLen = XSTRLEN(f.input); f.outLen = WC_SHA512_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha512()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha512()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen); + ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, f.output, f.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20155,14 +24555,14 @@ f.inLen = XSTRLEN(f.input); f.outLen = WC_SHA512_224_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha512_224()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha512_224()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen); + ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, f.output, f.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20178,14 +24578,14 @@ f.inLen = XSTRLEN(f.input); f.outLen = WC_SHA512_256_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha512_256()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha512_256()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen); + ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, f.output, f.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20201,14 +24601,14 @@ e.inLen = XSTRLEN(e.input); e.outLen = WC_SHA3_224_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha3_224()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha3_224()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen); + ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20223,14 +24623,14 @@ d.inLen = XSTRLEN(d.input); d.outLen = WC_SHA3_256_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha3_256()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha3_256()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, d.input, (unsigned long)d.inLen); + ret = EVP_DigestUpdate(md_ctx, d.input, (unsigned long)d.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, d.output, d.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20245,14 +24645,14 @@ e.inLen = XSTRLEN(e.input); e.outLen = WC_SHA3_384_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha3_384()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha3_384()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen); + ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) { return WC_TEST_RET_ENC_NC; } @@ -20268,14 +24668,14 @@ f.inLen = XSTRLEN(f.input); f.outLen = WC_SHA3_512_DIGEST_SIZE; - EVP_MD_CTX_init(&md_ctx); - ret = EVP_DigestInit(&md_ctx, EVP_sha3_512()); + EVP_MD_CTX_init(md_ctx); + ret = EVP_DigestInit(md_ctx, EVP_sha3_512()); if (ret == WOLFSSL_SUCCESS) { - ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen); + ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen); if (ret == WOLFSSL_SUCCESS) - ret = EVP_DigestFinal(&md_ctx, hash, 0); + ret = EVP_DigestFinal(md_ctx, hash, 0); } - EVP_MD_CTX_cleanup(&md_ctx); + EVP_MD_CTX_cleanup(md_ctx); if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, f.output, f.outLen) != 0) { return WC_TEST_RET_ENC_NC; @@ -20283,6 +24683,11 @@ #endif /* WOLFSSL_NOSHA3_512 */ #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SMALL_STACK + XFREE(md_ctx, NULL, DYNAMIC_TYPE_OPENSSL); + md_ctx = NULL; +#endif + #ifndef WC_NO_RNG if (RAND_bytes(hash, sizeof(hash)) != WOLFSSL_SUCCESS) return WC_TEST_RET_ENC_NC; @@ -20534,6 +24939,8 @@ } /* end evp_cipher test */ #endif /* HAVE_AES_ECB && WOLFSSL_AES_128 */ +#ifndef WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API + #if defined(WOLFSSL_AES_DIRECT) && defined(WOLFSSL_AES_256) /* enable HAVE_AES_DECRYPT for AES_encrypt/decrypt */ { @@ -20609,6 +25016,8 @@ #endif /* WOLFSSL_AES_DIRECT && WOLFSSL_AES_256 */ +#endif /* !WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API */ + /* EVP_Cipher with EVP_aes_xxx_ctr() */ #ifdef WOLFSSL_AES_COUNTER { @@ -20759,6 +25168,9 @@ if (XMEMCMP(plainBuff, ctrPlain, AES_BLOCK_SIZE*4)) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(en); + EVP_CIPHER_CTX_cleanup(de); + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) p_en = wolfSSL_EVP_CIPHER_CTX_new(); if (p_en == NULL) @@ -20781,6 +25193,9 @@ AES_BLOCK_SIZE*4) != AES_BLOCK_SIZE*4) return WC_TEST_RET_ENC_NC; + EVP_CIPHER_CTX_cleanup(p_en); + EVP_CIPHER_CTX_cleanup(p_de); + wolfSSL_EVP_CIPHER_CTX_free(p_en); wolfSSL_EVP_CIPHER_CTX_free(p_de); #endif /* WOLFSSL_SMALL_STACK && !WOLFSSL_NO_MALLOC */ @@ -20819,6 +25234,9 @@ return WC_TEST_RET_ENC_NC; if (XMEMCMP(cipherBuff, oddCipher, 9)) return WC_TEST_RET_ENC_NC; + + EVP_CIPHER_CTX_cleanup(en); + EVP_CIPHER_CTX_cleanup(de); #endif /* WOLFSSL_AES_128 */ #ifdef WOLFSSL_AES_192 @@ -20843,6 +25261,9 @@ return WC_TEST_RET_ENC_NC; if (XMEMCMP(ctr192Cipher, cipherBuff, sizeof(ctr192Cipher))) return WC_TEST_RET_ENC_NC; + + EVP_CIPHER_CTX_cleanup(en); + EVP_CIPHER_CTX_cleanup(de); #endif /* WOLFSSL_AES_192 */ #ifdef WOLFSSL_AES_256 @@ -20867,6 +25288,9 @@ return WC_TEST_RET_ENC_NC; if (XMEMCMP(ctr256Cipher, cipherBuff, sizeof(ctr256Cipher))) return WC_TEST_RET_ENC_NC; + + EVP_CIPHER_CTX_cleanup(en); + EVP_CIPHER_CTX_cleanup(de); #endif /* WOLFSSL_AES_256 */ #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -21149,12 +25573,13 @@ return 0; } -WOLFSSL_TEST_SUBROUTINE int openSSL_evpMD_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openSSL_evpMD_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; #if !defined(NO_SHA256) && !defined(NO_SHA) WOLFSSL_EVP_MD_CTX* ctx; WOLFSSL_EVP_MD_CTX* ctx2; + WOLFSSL_ENTER("openSSL_evpMD_test"); ctx = EVP_MD_CTX_create(); ctx2 = EVP_MD_CTX_create(); @@ -21238,15 +25663,15 @@ printf("\n"); } #else -#define show(a,b,c) +#define show(a,b,c) WC_DO_NOTHING #endif #define FOURK_BUFF 4096 -WOLFSSL_TEST_SUBROUTINE int openssl_pkey0_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_pkey0_test(void) { - int ret = 0; -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) && !defined(NO_SHA) + wc_test_ret_t ret = 0; +#if !defined(NO_RSA) && !defined(NO_SHA) byte* prvTmp; byte* pubTmp; int prvBytes; @@ -21268,9 +25693,10 @@ XFILE keypubFile; char cliKey[] = "./certs/client-key.der"; char cliKeypub[] = "./certs/client-keyPub.der"; - #endif + WOLFSSL_ENTER("openssl_pkey0_test"); + prvTmp = (byte*)XMALLOC(FOURK_BUFF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (prvTmp == NULL) return WC_TEST_RET_ENC_ERRNO; @@ -21471,11 +25897,10 @@ } -WOLFSSL_TEST_SUBROUTINE int openssl_pkey1_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_pkey1_test(void) { - int ret = 0; -#if !defined(NO_FILESYSTEM) && !defined(NO_RSA) && !defined(HAVE_USER_RSA) && \ - !defined(NO_SHA) + wc_test_ret_t ret = 0; +#if !defined(NO_FILESYSTEM) && !defined(NO_RSA) && !defined(NO_SHA) EVP_PKEY_CTX* dec = NULL; EVP_PKEY_CTX* enc = NULL; EVP_PKEY* pubKey = NULL; @@ -21504,6 +25929,8 @@ unsigned char plain[RSA_TEST_BYTES]; #endif + WOLFSSL_ENTER("openssl_pkey1_test"); + #if defined(USE_CERT_BUFFERS_1024) XMEMCPY(tmp, client_key_der_1024, sizeof_client_key_der_1024); cliKeySz = (long)sizeof_client_key_der_1024; @@ -21625,7 +26052,7 @@ #endif XMEMSET(cipher, 0, RSA_TEST_BYTES); - outlen = keyLenBits/8; + outlen = (size_t)(keyLenBits/8); if (EVP_PKEY_encrypt(enc, cipher, &outlen, msg, sizeof(msg)) < 0) { ret = WC_TEST_RET_ENC_EC(ret); goto openssl_pkey1_test_done; @@ -21668,9 +26095,9 @@ } -WOLFSSL_TEST_SUBROUTINE int openssl_evpSig_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_evpSig_test(void) { -#if !defined(NO_RSA) && !defined(NO_SHA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) && !defined(NO_SHA) byte* prvTmp; byte* pubTmp; int prvBytes; @@ -21687,14 +26114,15 @@ unsigned int sigSz; const void* pt; unsigned int count; - int ret, ret1, ret2; + wc_test_ret_t ret, ret1, ret2; - #if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) +#if !defined(USE_CERT_BUFFERS_1024) && !defined(USE_CERT_BUFFERS_2048) XFILE keyFile; XFILE keypubFile; char cliKey[] = "./certs/client-key.der"; char cliKeypub[] = "./certs/client-keyPub.der"; - #endif +#endif + WOLFSSL_ENTER("openssl_evpSig_test"); prvTmp = (byte*)XMALLOC(FOURK_BUFF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (prvTmp == NULL) @@ -21868,12 +26296,12 @@ #ifndef NO_PWDBASED #ifdef HAVE_SCRYPT /* Test vectors taken from RFC 7914: scrypt PBKDF - Section 12. */ -WOLFSSL_TEST_SUBROUTINE int scrypt_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t scrypt_test(void) { #ifdef HAVE_FIPS /* RFC 7914 test vector keys are too short for FIPS. */ #else - int ret; + wc_test_ret_t ret; byte derived[64]; WOLFSSL_SMALL_STACK_STATIC const byte verify1[] = { @@ -21886,6 +26314,7 @@ 0xe8, 0xd3, 0xe0, 0xfb, 0x2e, 0x0d, 0x36, 0x28, 0xcf, 0x35, 0xe2, 0x0c, 0x38, 0xd1, 0x89, 0x06 }; +#if !defined(BENCH_EMBEDDED) WOLFSSL_SMALL_STACK_STATIC const byte verify2[] = { 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00, 0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe, @@ -21896,6 +26325,7 @@ 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d, 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40 }; +#endif #if !defined(BENCH_EMBEDDED) && !defined(WOLFSSL_LINUXKM) && !defined(HAVE_INTEL_QA) WOLFSSL_SMALL_STACK_STATIC const byte verify3[] = { 0x70, 0x23, 0xbd, 0xcb, 0x3a, 0xfd, 0x73, 0x48, @@ -21923,6 +26353,7 @@ 0xcb, 0xf4, 0x5c, 0x6f, 0xa7, 0x7a, 0x41, 0xa4 }; #endif + WOLFSSL_ENTER("scrypt_test"); ret = wc_scrypt(derived, NULL, 0, NULL, 0, 4, 1, 1, sizeof(verify1)); if (ret != 0) @@ -21930,16 +26361,18 @@ if (XMEMCMP(derived, verify1, sizeof(verify1)) != 0) return WC_TEST_RET_ENC_NC; +#if !defined(BENCH_EMBEDDED) ret = wc_scrypt(derived, (byte*)"password", 8, (byte*)"NaCl", 4, 10, 8, 16, sizeof(verify2)); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); if (XMEMCMP(derived, verify2, sizeof(verify2)) != 0) return WC_TEST_RET_ENC_NC; +#endif /* Test case with parallel overflowing */ ret = wc_scrypt(derived, (byte*)"password", 16, (byte*)"NaCl", 16, 2, 4, 8388608, - sizeof(verify2)); + sizeof(verify1)); if (ret != BAD_FUNC_ARG) return WC_TEST_RET_ENC_EC(ret); @@ -21960,14 +26393,20 @@ if (XMEMCMP(derived, verify4, sizeof(verify4)) != 0) return WC_TEST_RET_ENC_NC; #endif +#else +#ifdef SCRYPT_TEST_ALL + (void)verify4; +#endif #endif /* !BENCH_EMBEDDED && !defined(WOLFSSL_LINUXKM) && !HAVE_INTEL_QA */ +#if !defined(BENCH_EMBEDDED) ret = wc_scrypt_ex(derived, (byte*)"password", 8, (byte*)"NaCl", 4, 1<<10, 8, 16, sizeof(verify2)); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); if (XMEMCMP(derived, verify2, sizeof(verify2)) != 0) return WC_TEST_RET_ENC_NC; +#endif #endif /* !HAVE_FIPS */ @@ -21976,7 +26415,7 @@ #endif #ifdef HAVE_PKCS12 -WOLFSSL_TEST_SUBROUTINE int pkcs12_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs12_pbkdf_test(void) { WOLFSSL_SMALL_STACK_STATIC const byte passwd[] = { 0x00, 0x73, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x67, 0x00, 0x00 }; @@ -22002,9 +26441,11 @@ int id = 1; int kLen = 24; int iterations = 1; - int ret = wc_PKCS12_PBKDF(derived, passwd, sizeof(passwd), salt, 8, - iterations, kLen, WC_SHA256, id); + wc_test_ret_t ret; + WOLFSSL_ENTER("pkcs12_pbkdf_test"); + ret = wc_PKCS12_PBKDF(derived, passwd, sizeof(passwd), salt, 8, + iterations, kLen, WC_SHA256, id); if (ret < 0) return WC_TEST_RET_ENC_EC(ret); @@ -22030,10 +26471,11 @@ #endif /* HAVE_PKCS12 */ #if defined(HAVE_PBKDF2) && !defined(NO_SHA256) && !defined(NO_HMAC) -WOLFSSL_TEST_SUBROUTINE int pbkdf2_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pbkdf2_test(void) { char passwd[] = "passwordpassword"; - WOLFSSL_SMALL_STACK_STATIC const byte salt[] = { 0x78, 0x57, 0x8E, 0x5a, 0x5d, 0x63, 0xcb, 0x06 }; + WOLFSSL_SMALL_STACK_STATIC const byte salt[] = { 0x78, 0x57, 0x8E, 0x5a, + 0x5d, 0x63, 0xcb, 0x06 }; int iterations = 2048; int kLen = 24; byte derived[64]; @@ -22043,10 +26485,14 @@ 0x2d, 0xd4, 0xf9, 0x37, 0xd4, 0x95, 0x16, 0xa7, 0x2a, 0x9a, 0x21, 0xd1 }; - int ret = wc_PBKDF2_ex(derived, (byte*)passwd, (int)XSTRLEN(passwd), salt, - (int)sizeof(salt), iterations, kLen, WC_SHA256, HEAP_HINT, devId); + wc_test_ret_t ret; + WOLFSSL_ENTER("pbkdf2_test"); + + ret = wc_PBKDF2_ex(derived, (byte*)passwd, (int)XSTRLEN(passwd), + salt, (int)sizeof(salt), iterations, + kLen, WC_SHA256, HEAP_HINT, devId); if (ret != 0) - return ret; + return WC_TEST_RET_ENC_EC(ret); if (XMEMCMP(derived, verify, sizeof(verify)) != 0) return WC_TEST_RET_ENC_NC; @@ -22057,7 +26503,7 @@ #endif /* HAVE_PBKDF2 && !NO_SHA256 && !NO_HMAC */ #if defined(HAVE_PBKDF1) && !defined(NO_SHA) -WOLFSSL_TEST_SUBROUTINE int pbkdf1_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pbkdf1_test(void) { char passwd[] = "password"; WOLFSSL_SMALL_STACK_STATIC const byte salt[] = { 0x78, 0x57, 0x8E, 0x5a, 0x5d, 0x63, 0xcb, 0x06 }; @@ -22070,9 +26516,12 @@ 0xAF, 0x10, 0xEB, 0xFB, 0x4A, 0x3D, 0x2A, 0x20 }; - int ret = wc_PBKDF1_ex(derived, kLen, NULL, 0, (byte*)passwd, - (int)XSTRLEN(passwd), salt, (int)sizeof(salt), iterations, WC_SHA, - HEAP_HINT); + wc_test_ret_t ret; + WOLFSSL_ENTER("pbkdf1_test"); + + ret = wc_PBKDF1_ex(derived, kLen, NULL, 0, (byte*)passwd, + (int)XSTRLEN(passwd), salt, (int)sizeof(salt), iterations, WC_SHA, + HEAP_HINT); if (ret != 0) return ret; @@ -22083,41 +26532,152 @@ } #endif /* HAVE_PBKDF2 && !NO_SHA */ -WOLFSSL_TEST_SUBROUTINE int pwdbased_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pwdbased_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; + WOLFSSL_ENTER("pwdbased_test"); #if defined(HAVE_PBKDF1) && !defined(NO_SHA) - ret = pbkdf1_test(); - if (ret != 0) - return ret; + ret = pbkdf1_test(); + if (ret != 0) + return ret; #endif #if defined(HAVE_PBKDF2) && !defined(NO_SHA256) && !defined(NO_HMAC) - ret = pbkdf2_test(); - if (ret != 0) - return ret; + ret = pbkdf2_test(); + if (ret != 0) + return ret; #endif #ifdef HAVE_PKCS12 - ret = pkcs12_test(); - if (ret != 0) - return ret; + ret = pkcs12_pbkdf_test(); + if (ret != 0) + return ret; #endif #ifdef HAVE_SCRYPT - ret = scrypt_test(); - if (ret != 0) - return ret; + ret = scrypt_test(); + if (ret != 0) + return ret; #endif - return ret; + return ret; } #endif /* NO_PWDBASED */ +#if defined(USE_CERT_BUFFERS_2048) && \ + defined(HAVE_PKCS12) && \ + !defined(NO_ASN) && !defined(NO_PWDBASED) && !defined(NO_HMAC) && \ + !defined(NO_CERTS) && !defined(NO_DES3) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs12_test(void) +{ + wc_test_ret_t ret = 0; + WC_PKCS12* pkcs12 = NULL; + /* Gen vars */ + byte* pkcs12der = NULL; + int pkcs12derSz = 0; + WC_DerCertList derCaList = { + (byte*)ca_cert_der_2048, sizeof_ca_cert_der_2048, NULL + }; + char* pass = (char*)"wolfSSL test"; + /* Parsing vars */ + WC_DerCertList* derCaListOut = NULL; + byte* keyDer = NULL; + byte* certDer = NULL; + word32 keySz; + word32 certSz; + + WOLFSSL_ENTER("pkcs12_test"); + + pkcs12 = wc_PKCS12_create(pass, (word32)XSTRLEN(pass), + (char*)"friendlyName" /* not used currently */, + (byte*)server_key_der_2048, sizeof_server_key_der_2048, + (byte*)server_cert_der_2048, sizeof_server_cert_der_2048, + &derCaList, PBE_SHA1_DES3, PBE_SHA1_DES3, 100, 100, + 0 /* not used currently */, HEAP_HINT); + if (pkcs12 == NULL) { + ret = WC_TEST_RET_ENC_EC(MEMORY_E); + goto out; + } + + ret = wc_i2d_PKCS12(pkcs12, NULL, &pkcs12derSz); + if (ret != LENGTH_ONLY_E) { + if (ret == 0) + ret = WC_TEST_RET_ENC_NC; + else + ret = WC_TEST_RET_ENC_I(ret); + goto out; + } + + pkcs12der = (byte*)XMALLOC(pkcs12derSz, HEAP_HINT, DYNAMIC_TYPE_PKCS); + if (pkcs12der == NULL) { + ret = WC_TEST_RET_ENC_EC(MEMORY_E); + goto out; + } + + { + /* Use tmp pointer to avoid advancing pkcs12der */ + byte* tmp = pkcs12der; + ret = wc_i2d_PKCS12(pkcs12, &tmp, &pkcs12derSz); + if (ret <= 0) { + if (ret == 0) + ret = WC_TEST_RET_ENC_NC; + else + ret = WC_TEST_RET_ENC_I(ret); + goto out; + } + } + + wc_PKCS12_free(pkcs12); + pkcs12 = wc_PKCS12_new_ex(HEAP_HINT); + if (pkcs12 == NULL) { + ret = WC_TEST_RET_ENC_EC(MEMORY_E); + goto out; + } + + /* convert the DER file into an internal structure */ + ret = wc_d2i_PKCS12(pkcs12der, pkcs12derSz, pkcs12); + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + goto out; + } + + /* parse the internal structure into its parts */ + ret = wc_PKCS12_parse(pkcs12, "wolfSSL test", &keyDer, &keySz, + &certDer, &certSz, &derCaListOut); + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + goto out; + } + if (keyDer == NULL || certDer == NULL || derCaListOut == NULL) { + ret = WC_TEST_RET_ENC_NC; + goto out; + } + +out: + + if (derCaListOut) + wc_FreeCertList(derCaListOut, HEAP_HINT); + XFREE(keyDer, HEAP_HINT, DYNAMIC_TYPE_PKCS); + XFREE(certDer, HEAP_HINT, DYNAMIC_TYPE_PKCS); + if (pkcs12) + wc_PKCS12_free(pkcs12); + XFREE(pkcs12der, HEAP_HINT, DYNAMIC_TYPE_PKCS); + + return ret; +} +#endif + + #if defined(HAVE_HKDF) && !defined(NO_HMAC) +#if defined(WOLFSSL_AFALG_XILINX) || defined(WOLFSSL_AFALG_XILINX_AES) || \ + defined(WOLFSSL_AFALG_XILINX_SHA3) || defined(WOLFSSL_AFALG_HASH_KEEP) || \ + defined(WOLFSSL_AFALG_XILINX_RSA) /* hkdf_test has issue with WOLFSSL_TEST_SUBROUTINE set on Xilinx with afalg */ -static int hkdf_test(void) +static wc_test_ret_t hkdf_test(void) +#else +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hkdf_test(void) +#endif { - int ret = 0; + wc_test_ret_t ret = 0; #if !defined(NO_SHA) || !defined(NO_SHA256) int L; @@ -22163,13 +26723,14 @@ 0x58, 0x65 }; #endif #endif /* !NO_SHA256 */ + WOLFSSL_ENTER("hkdf_test"); XMEMSET(okm1, 0, sizeof(okm1)); L = (int)sizeof(okm1); #ifndef NO_SHA ret = wc_HKDF(WC_SHA, ikm1, (word32)sizeof(ikm1), NULL, 0, NULL, 0, - okm1, L); + okm1, (word32)L); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); @@ -22180,7 +26741,7 @@ /* fips can't have key size under 14 bytes, salt is key too */ L = (int)sizeof(okm1); ret = wc_HKDF(WC_SHA, ikm1, 11, salt1, (word32)sizeof(salt1), - info1, (word32)sizeof(info1), okm1, L); + info1, (word32)sizeof(info1), okm1, (word32)L); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); @@ -22191,7 +26752,7 @@ #ifndef NO_SHA256 ret = wc_HKDF(WC_SHA256, ikm1, (word32)sizeof(ikm1), NULL, 0, NULL, 0, - okm1, L); + okm1, (word32)L); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); @@ -22201,7 +26762,7 @@ #ifndef HAVE_FIPS /* fips can't have key size under 14 bytes, salt is key too */ ret = wc_HKDF(WC_SHA256, ikm1, (word32)sizeof(ikm1), - salt1, (word32)sizeof(salt1), info1, (word32)sizeof(info1), okm1, L); + salt1, (word32)sizeof(salt1), info1, (word32)sizeof(info1), okm1, (word32)L); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); @@ -22343,15 +26904,16 @@ }; -int sshkdf_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sshkdf_test(void) { - int result = 0; + byte cKey[32]; /* Greater of SHA256_DIGEST_SIZE and AES_BLOCK_SIZE */ word32 i; word32 tc = sizeof(sshKdfTestVectors)/sizeof(SshKdfTestVector); const SshKdfTestVector* tv = NULL; - byte cKey[32]; /* Greater of SHA256_DIGEST_SIZE and AES_BLOCK_SIZE */ - /* sId - Session ID, eKey - Expected Key, cKey - Calculated Key */ + wc_test_ret_t result = 0; + WOLFSSL_ENTER("sshkdf_test"); + /* sId - Session ID, eKey - Expected Key, cKey - Calculated Key */ for (i = 0, tv = sshKdfTestVectors; i < tc; i++, tv++) { result = wc_SSH_KDF(tv->hashId, tv->keyId, cKey, tv->expectedKeySz, @@ -22377,6 +26939,113 @@ #endif /* WOLFSSL_WOLFSSH */ +#if defined(WOLFSSL_HAVE_PRF) && !defined(NO_HMAC) && defined(WOLFSSL_SHA384) +#define DIGL 12 +#define SECL 48 +#define LBSL 63 +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t prf_test(void) +{ + int ret; + byte dig[DIGL] = {0}; + byte secret[SECL] = { + 0x10, 0xbc, 0xb4, 0xa2, 0xe8, 0xdc, 0xf1, 0x9b, 0x4c, + 0x51, 0x9c, 0xed, 0x31, 0x1b, 0x51, 0x57, 0x02, 0x3f, + 0xa1, 0x7d, 0xfb, 0x0e, 0xf3, 0x4e, 0x8f, 0x6f, 0x71, + 0xa3, 0x67, 0x76, 0x6b, 0xfa, 0x5d, 0x46, 0x4a, 0xe8, + 0x61, 0x18, 0x81, 0xc4, 0x66, 0xcc, 0x6f, 0x09, 0x99, + 0x9d, 0xfc, 0x47 + }; + byte lablSd[LBSL] = { + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x66, 0x69, + 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x0b, 0x46, 0xba, + 0x56, 0xbf, 0x1f, 0x5d, 0x99, 0xff, 0xe9, 0xbb, 0x43, + 0x01, 0xe7, 0xca, 0x2c, 0x00, 0xdf, 0x9a, 0x39, 0x6e, + 0xcf, 0x6d, 0x15, 0x27, 0x4d, 0xf2, 0x93, 0x96, 0x4a, + 0x91, 0xde, 0x5c, 0xc0, 0x47, 0x7c, 0xa8, 0xae, 0xcf, + 0x5d, 0x93, 0x5f, 0x4c, 0x92, 0xcc, 0x98, 0x5b, 0x43 + }; + byte expected[DIGL] = { + 0xee, 0xcb, 0xb1, 0x30, 0xf2, 0xcd, 0xb3, 0x4a, + 0xbe, 0xda, 0xc1, 0xf6 + }; + int digL = DIGL; + int secL = SECL; + int lblsdL = LBSL; + int hash_type = sha384_mac; + + ret = wc_PRF(dig, (word32)digL, secret, secL, lablSd, lblsdL, hash_type, + HEAP_HINT, INVALID_DEVID); + if (ret != 0) { + printf("Failed w/ code: %d\n", ret); + return WC_TEST_RET_ENC_EC(ret); + } + + if (XMEMCMP(expected, dig, DIGL) != 0) { + printf("Got unexpected digest\n"); + return WC_TEST_RET_ENC_NC; + } + + return 0; +} +#endif /* WOLFSSL_HAVE_PRF && !NO_HMAC */ + +#ifdef WOLFSSL_HAVE_PRF +#if defined(HAVE_HKDF) && !defined(NO_HMAC) +#ifdef WOLFSSL_BASE16 +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t tls12_kdf_test(void) +{ + const char* preMasterSecret = "D06F9C19BFF49B1E91E4EFE97345D089" + "4E6C2E6C34A165B24540E2970875D641" + "2AA6515871B389B4C199BB8389C71CED"; + const char* helloRandom = "162B81EDFBEAE4F25240320B87E7651C" + "865564191DD782DB0B9ECA275FBA1BB9" + "5A1DA3DF436D68DA86C5E7B4B4A36E46" + "B977C61767983A31BE270D74517BD0F6"; + const char* masterSecret = "EB38B8D89B98B1C266DE44BB3CA14E83" + "C32F009F9955B1D994E61D3C51EE8760" + "90B4EF89CC7AF42F46E72201BFCC7977"; + const char* label = "master secret"; + + byte pms[48] = {0}; + byte seed[64] = {0}; + byte ms[48] = {0}; + byte result[48] = {0}; + + word32 pmsSz = (word32)sizeof(pms); + word32 seedSz = (word32)sizeof(seed); + word32 msSz = (word32)sizeof(ms); + int ret; + + ret = Base16_Decode((const byte*)preMasterSecret, + (word32)XSTRLEN(preMasterSecret), pms, &pmsSz); + if (ret != 0) + return ret; + ret = Base16_Decode((const byte*)helloRandom, + (word32)XSTRLEN(helloRandom), seed, &seedSz); + if (ret != 0) + return ret; + ret = Base16_Decode((const byte*)masterSecret, + (word32)XSTRLEN(masterSecret), ms, &msSz); + if (ret != 0) + return ret; + + ret = wc_PRF_TLS(result, msSz, pms, pmsSz, + (const byte*)label, (word32)XSTRLEN(label), seed, seedSz, + 1, sha256_mac, NULL, INVALID_DEVID); + if (ret != 0) { + if (ret == FIPS_PRIVATE_KEY_LOCKED_E) { + printf(" wc_PRF_TLSv12: Private key locked.\n"); + } + return WC_TEST_RET_ENC_NC; + } + + if (XMEMCMP(result, ms, msSz) != 0) + return WC_TEST_RET_ENC_NC; + return 0; +} +#endif /* WOLFSSL_BASE16 */ +#endif /* WOLFSSL_HAVE_HKDF && !NO_HMAC */ +#endif /* WOLFSSL_HAVE_PRF */ #ifdef WOLFSSL_TLS13 @@ -22930,12 +27599,13 @@ static const char derivedLabel[] = "derived"; -WOLFSSL_TEST_SUBROUTINE int tls13_kdf_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t tls13_kdf_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; word32 i; word32 tc = sizeof(tls13KdfTestVectors)/sizeof(Tls13KdfTestVector); const Tls13KdfTestVector* tv = NULL; + WOLFSSL_ENTER("tls13_kdf_test"); for (i = 0, tv = tls13KdfTestVectors; i < tc; i++, tv++) { byte output[WC_MAX_DIGEST_SIZE]; @@ -22949,7 +27619,7 @@ hashAlgSz = wc_HashGetDigestSize(tv->hashAlg); if (hashAlgSz == BAD_FUNC_ARG) break; - ret = wc_Hash(tv->hashAlg, NULL, 0, hashZero, hashAlgSz); + ret = wc_Hash(tv->hashAlg, NULL, 0, hashZero, (word32)hashAlgSz); if (ret != 0) break; ret = wc_Tls13_HKDF_Extract(secret, NULL, 0, @@ -22957,105 +27627,105 @@ tv->pskSz, tv->hashAlg); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)ceTrafficLabel, (word32)XSTRLEN(ceTrafficLabel), - tv->hashHello1, hashAlgSz, tv->hashAlg); + tv->hashHello1, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->clientEarlyTrafficSecret, output, hashAlgSz); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)eExpMasterLabel, (word32)XSTRLEN(eExpMasterLabel), - tv->hashHello1, hashAlgSz, tv->hashAlg); + tv->hashHello1, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->earlyExporterMasterSecret, output, hashAlgSz); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(salt, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(salt, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)derivedLabel, (word32)XSTRLEN(derivedLabel), - hashZero, hashAlgSz, tv->hashAlg); + hashZero, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; - ret = wc_Tls13_HKDF_Extract(secret, salt, hashAlgSz, + ret = wc_Tls13_HKDF_Extract(secret, salt, (word32)(word32)hashAlgSz, (tv->dheSz == 0) ? zeroes : (byte*)tv->dhe, tv->dheSz, tv->hashAlg); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)cHsTrafficLabel, (word32)XSTRLEN(cHsTrafficLabel), - tv->hashHello2, hashAlgSz, tv->hashAlg); + tv->hashHello2, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->clientHandshakeTrafficSecret, output, hashAlgSz); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)sHsTrafficLabel, (word32)XSTRLEN(sHsTrafficLabel), - tv->hashHello2, hashAlgSz, tv->hashAlg); + tv->hashHello2, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->serverHandshakeTrafficSecret, output, hashAlgSz); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(salt, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(salt, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)derivedLabel, (word32)XSTRLEN(derivedLabel), - hashZero, hashAlgSz, tv->hashAlg); + hashZero, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; - ret = wc_Tls13_HKDF_Extract(secret, salt, hashAlgSz, - zeroes, hashAlgSz, tv->hashAlg); + ret = wc_Tls13_HKDF_Extract(secret, salt, (word32)(word32)hashAlgSz, + zeroes, (word32)(word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)cAppTrafficLabel, (word32)XSTRLEN(cAppTrafficLabel), - tv->hashFinished1, hashAlgSz, tv->hashAlg); + tv->hashFinished1, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->clientApplicationTrafficSecret, output, hashAlgSz); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)sAppTrafficLabel, (word32)XSTRLEN(sAppTrafficLabel), - tv->hashFinished1, hashAlgSz, tv->hashAlg); + tv->hashFinished1, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->serverApplicationTrafficSecret, output, hashAlgSz); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)expMasterLabel, (word32)XSTRLEN(expMasterLabel), - tv->hashFinished1, hashAlgSz, tv->hashAlg); + tv->hashFinished1, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->exporterMasterSecret, output, hashAlgSz); if (ret != 0) break; - ret = wc_Tls13_HKDF_Expand_Label(output, hashAlgSz, - secret, hashAlgSz, + ret = wc_Tls13_HKDF_Expand_Label(output, (word32)hashAlgSz, + secret, (word32)hashAlgSz, (byte*)protocolLabel, (word32)XSTRLEN(protocolLabel), (byte*)resMasterLabel, (word32)XSTRLEN(resMasterLabel), - tv->hashFinished2, hashAlgSz, tv->hashAlg); + tv->hashFinished2, (word32)hashAlgSz, tv->hashAlg); if (ret != 0) break; ret = XMEMCMP(tv->resumptionMasterSecret, output, hashAlgSz); @@ -23073,9 +27743,9 @@ #if defined(HAVE_ECC) && defined(HAVE_X963_KDF) -WOLFSSL_TEST_SUBROUTINE int x963kdf_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t x963kdf_test(void) { - int ret; + wc_test_ret_t ret; byte kek[128]; #ifndef NO_SHA @@ -23173,6 +27843,8 @@ }; #endif + WOLFSSL_ENTER("x963kdf_test"); + #ifndef NO_SHA ret = wc_X963_KDF(WC_HASH_TYPE_SHA, Z, sizeof(Z), NULL, 0, kek, sizeof(verify)); @@ -23216,12 +27888,13 @@ #endif /* HAVE_X963_KDF */ -#if defined(HAVE_HPKE) && (defined(HAVE_ECC) || defined(HAVE_CURVE25519)) && \ +#if defined(HAVE_HPKE) && \ + (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) && \ defined(HAVE_AESGCM) -static int hpke_test_single(Hpke* hpke) +static wc_test_ret_t hpke_test_single(Hpke* hpke) { - int ret = 0; + wc_test_ret_t ret = 0; int rngRet = 0; WC_RNG rng[1]; const char* start_text = "this is a test"; @@ -23232,33 +27905,39 @@ void* receiverKey = NULL; void* ephemeralKey = NULL; #ifdef WOLFSSL_SMALL_STACK - uint8_t *pubKey = NULL; /* public key */ + byte *pubKey = NULL; /* public key */ word16 pubKeySz = (word16)HPKE_Npk_MAX; #else - uint8_t pubKey[HPKE_Npk_MAX]; /* public key */ + byte pubKey[HPKE_Npk_MAX]; /* public key */ word16 pubKeySz = (word16)sizeof(pubKey); #endif rngRet = ret = wc_InitRng(rng); if (ret != 0) - return ret; + return WC_TEST_RET_ENC_EC(ret); #ifdef WOLFSSL_SMALL_STACK if (ret == 0) { - pubKey = (uint8_t *)XMALLOC(pubKeySz, HEAP_HINT, + pubKey = (byte *)XMALLOC(pubKeySz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (pubKey == NULL) - ret = MEMORY_E; + ret = WC_TEST_RET_ENC_EC(MEMORY_E); } #endif /* generate the keys */ - if (ret == 0) + if (ret == 0) { ret = wc_HpkeGenerateKeyPair(hpke, &ephemeralKey, rng); + if (ret != 0) + ret = WC_TEST_RET_ENC_EC(ret); + } - if (ret == 0) + if (ret == 0) { ret = wc_HpkeGenerateKeyPair(hpke, &receiverKey, rng); + if (ret != 0) + ret = WC_TEST_RET_ENC_EC(ret); + } /* seal */ if (ret == 0) { @@ -23267,11 +27946,16 @@ (byte*)aad_text, (word32)XSTRLEN(aad_text), (byte*)start_text, (word32)XSTRLEN(start_text), ciphertext); + if (ret != 0) + ret = WC_TEST_RET_ENC_EC(ret); } /* export ephemeral key */ - if (ret == 0) + if (ret == 0) { ret = wc_HpkeSerializePublicKey(hpke, ephemeralKey, pubKey, &pubKeySz); + if (ret != 0) + ret = WC_TEST_RET_ENC_EC(ret); + } /* open with exported ephemeral key */ if (ret == 0) { @@ -23280,10 +27964,40 @@ (byte*)aad_text, (word32)XSTRLEN(aad_text), ciphertext, (word32)XSTRLEN(start_text), plaintext); + if (ret != 0) + ret = WC_TEST_RET_ENC_EC(ret); } - if (ret == 0) + if (ret == 0) { ret = XMEMCMP(plaintext, start_text, XSTRLEN(start_text)); + if (ret != 0) + ret = WC_TEST_RET_ENC_NC; + } + + /* Negative test case with NULL argument */ + if (ret == 0) { + ret = wc_HpkeGenerateKeyPair(NULL, &receiverKey, rng); + if (ret != BAD_FUNC_ARG) + ret = WC_TEST_RET_ENC_EC(ret); + else + ret = 0; + } + + if (ret == 0) { + ret = wc_HpkeGenerateKeyPair(hpke, NULL, rng); + if (ret != BAD_FUNC_ARG) + ret = WC_TEST_RET_ENC_EC(ret); + else + ret = 0; + } + + if (ret == 0) { + ret = wc_HpkeGenerateKeyPair(hpke, &receiverKey, NULL); + if (ret != BAD_FUNC_ARG) + ret = WC_TEST_RET_ENC_EC(ret); + else + ret = 0; + } if (ephemeralKey != NULL) wc_HpkeFreeKey(hpke, hpke->kem, ephemeralKey, hpke->heap); @@ -23302,10 +28016,11 @@ return ret; } -WOLFSSL_TEST_SUBROUTINE int hpke_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hpke_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; Hpke hpke[1]; + WOLFSSL_ENTER("hpke_test"); #if defined(HAVE_ECC) #if defined(WOLFSSL_SHA224) || !defined(NO_SHA256) @@ -23314,7 +28029,7 @@ HPKE_AES_128_GCM, NULL); if (ret != 0) - return ret; + return WC_TEST_RET_ENC_EC(ret); ret = hpke_test_single(hpke); @@ -23329,7 +28044,7 @@ HPKE_AES_128_GCM, NULL); if (ret != 0) - return ret; + return WC_TEST_RET_ENC_EC(ret); ret = hpke_test_single(hpke); @@ -23344,7 +28059,7 @@ HPKE_AES_128_GCM, NULL); if (ret != 0) - return ret; + return WC_TEST_RET_ENC_EC(ret); ret = hpke_test_single(hpke); @@ -23356,10 +28071,10 @@ #if defined(HAVE_CURVE25519) /* test with curve25519 and aes256 */ ret = wc_HpkeInit(hpke, DHKEM_X25519_HKDF_SHA256, HKDF_SHA256, - HPKE_AES_256_GCM, NULL); + HPKE_AES_256_GCM, NULL); if (ret != 0) - return ret; + return WC_TEST_RET_ENC_EC(ret); ret = hpke_test_single(hpke); @@ -23367,16 +28082,561 @@ return ret; #endif + +#if defined(HAVE_CURVE448) && \ + (defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)) + /* test with curve448 and aes256 */ + ret = wc_HpkeInit(hpke, DHKEM_X448_HKDF_SHA512, HKDF_SHA512, + HPKE_AES_256_GCM, NULL); + + /* HPKE does not support X448 yet, so expect failure */ + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = hpke_test_single(hpke); + + /* HPKE does not support X448 yet, so expect failure */ + if (WC_TEST_RET_DEC_EC(ret) != BAD_FUNC_ARG) + return ret; + ret = 0; /* reset error code */ +#endif + + /* TODO: HPKE chacha20 is not implemented */ + return ret; -/* x448 and chacha20 are unimplemented */ } #endif /* HAVE_HPKE && HAVE_ECC && HAVE_AESGCM */ +#if defined(WC_SRTP_KDF) +typedef struct Srtp_Kdf_Tv { + const unsigned char* key; + word32 keySz; + const unsigned char* salt; + word32 saltSz; + int kdfIdx; + const unsigned char* index; + const unsigned char* ke; + const unsigned char* ka; + const unsigned char* ks; + const unsigned char* index_c; + const unsigned char* ke_c; + const unsigned char* ka_c; + const unsigned char* ks_c; + word32 keSz; + word32 kaSz; + word32 ksSz; +} Srtp_Kdf_Tv; + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t srtpkdf_test(void) +{ + wc_test_ret_t ret = 0; + /* 128-bit key, kdrIdx = -1 */ + WOLFSSL_SMALL_STACK_STATIC const byte key_0[] = { + 0xc4, 0x80, 0x9f, 0x6d, 0x36, 0x98, 0x88, 0x72, + 0x8e, 0x26, 0xad, 0xb5, 0x32, 0x12, 0x98, 0x90 + }; + WOLFSSL_SMALL_STACK_STATIC const byte salt_0[] = { + 0x0e, 0x23, 0x00, 0x6c, 0x6c, 0x04, 0x4f, 0x56, + 0x62, 0x40, 0x0e, 0x9d, 0x1b, 0xd6 + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_0[] = { + 0x48, 0x71, 0x65, 0x64, 0x9c, 0xca + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_0[] = { + 0xdc, 0x38, 0x21, 0x92, 0xab, 0x65, 0x10, 0x8a, + 0x86, 0xb2, 0x59, 0xb6, 0x1b, 0x3a, 0xf4, 0x6f + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_0[] = { + 0xb8, 0x39, 0x37, 0xfb, 0x32, 0x17, 0x92, 0xee, + 0x87, 0xb7, 0x88, 0x19, 0x3b, 0xe5, 0xa4, 0xe3, + 0xbd, 0x32, 0x6e, 0xe4 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_0[] = { + 0xf1, 0xc0, 0x35, 0xc0, 0x0b, 0x5a, 0x54, 0xa6, + 0x16, 0x92, 0xc0, 0x16, 0x27, 0x6c + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_c_0[] = { + 0x56, 0xf3, 0xf1, 0x97 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_c_0[] = { + 0xab, 0x5b, 0xe0, 0xb4, 0x56, 0x23, 0x5d, 0xcf, + 0x77, 0xd5, 0x08, 0x69, 0x29, 0xba, 0xfb, 0x38 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_c_0[] = { + 0xc5, 0x2f, 0xde, 0x0b, 0x80, 0xb0, 0xf0, 0xba, + 0xd8, 0xd1, 0x56, 0x45, 0xcb, 0x86, 0xe7, 0xc7, + 0xc3, 0xd8, 0x77, 0x0e + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_c_0[] = { + 0xde, 0xb5, 0xf8, 0x5f, 0x81, 0x33, 0x6a, 0x96, + 0x5e, 0xd3, 0x2b, 0xb7, 0xed, 0xe8 + }; + /* 192-bit key, kdrIdx = 0 */ + WOLFSSL_SMALL_STACK_STATIC const byte key_1[] = { + 0xbb, 0x04, 0x5b, 0x1f, 0x53, 0xc6, 0x93, 0x2c, + 0x2b, 0xa6, 0x88, 0xf5, 0xe3, 0xf2, 0x24, 0x70, + 0xe1, 0x7d, 0x7d, 0xec, 0x8a, 0x93, 0x4d, 0xf2 + }; + WOLFSSL_SMALL_STACK_STATIC const byte salt_1[] = { + 0xe7, 0x22, 0xab, 0x92, 0xfc, 0x7c, 0x89, 0xb6, + 0x53, 0x8a, 0xf9, 0x3c, 0xb9, 0x52 + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_1[] = { + 0xd7, 0x87, 0x8f, 0x33, 0xb1, 0x76 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_1[] = { + 0x2c, 0xc8, 0x3e, 0x54, 0xb2, 0x33, 0x89, 0xb3, + 0x71, 0x65, 0x0f, 0x51, 0x61, 0x65, 0xe4, 0x93, + 0x07, 0x4e, 0xb3, 0x47, 0xba, 0x2d, 0x60, 0x60 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_1[] = { + 0x2e, 0x80, 0xe4, 0x82, 0x55, 0xa2, 0xbe, 0x6d, + 0xe0, 0x46, 0xcc, 0xc1, 0x75, 0x78, 0x6e, 0x78, + 0xd1, 0xd1, 0x47, 0x08 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_1[] = { + 0xe0, 0xc1, 0xe6, 0xaf, 0x1e, 0x8d, 0x8c, 0xfe, + 0xe5, 0x60, 0x70, 0xb5, 0xe6, 0xea + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_c_1[] = { + 0x40, 0xbf, 0xd4, 0xa9 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_c_1[] = { + 0x94, 0x0f, 0x55, 0xce, 0x58, 0xd8, 0x16, 0x65, + 0xf0, 0xfa, 0x46, 0x40, 0x0c, 0xda, 0xb1, 0x11, + 0x9e, 0x69, 0xa0, 0x93, 0x4e, 0xd7, 0xf2, 0x84 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_c_1[] = { + 0xf5, 0x41, 0x6f, 0xc2, 0x65, 0xc5, 0xb3, 0xef, + 0xbb, 0x22, 0xc8, 0xfc, 0x6b, 0x00, 0x14, 0xb2, + 0xf3, 0x3b, 0x8e, 0x29 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_c_1[] = { + 0x35, 0xb7, 0x42, 0x43, 0xf0, 0x01, 0x01, 0xb4, + 0x68, 0xa1, 0x28, 0x80, 0x37, 0xf0 + }; + /* 256-bit key, kdrIdx = 1 */ + WOLFSSL_SMALL_STACK_STATIC const byte key_2[] = { + 0x10, 0x38, 0x0a, 0xcd, 0xd6, 0x47, 0xab, 0xee, + 0xc0, 0xd4, 0x44, 0xf4, 0x7e, 0x51, 0x36, 0x02, + 0x79, 0xa8, 0x94, 0x80, 0x35, 0x40, 0xed, 0x50, + 0xf4, 0x45, 0x30, 0x3d, 0xb5, 0xf0, 0x2b, 0xbb + }; + WOLFSSL_SMALL_STACK_STATIC const byte salt_2[] = { + 0xc7, 0x31, 0xf2, 0xc8, 0x40, 0x43, 0xb8, 0x74, + 0x8a, 0x61, 0x84, 0x7a, 0x25, 0x8a + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_2[] = { + 0x82, 0xf1, 0x84, 0x8c, 0xac, 0x42 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_2[] = { + 0xb2, 0x26, 0x60, 0xaf, 0x08, 0x23, 0x14, 0x98, + 0x91, 0xde, 0x5d, 0x87, 0x95, 0x61, 0xca, 0x8f, + 0x0e, 0xce, 0xfb, 0x68, 0x4d, 0xd6, 0x28, 0xcb, + 0x28, 0xe2, 0x27, 0x20, 0x2d, 0xff, 0x64, 0xbb + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_2[] = { + 0x12, 0x6f, 0x52, 0xe8, 0x07, 0x7f, 0x07, 0x84, + 0xa0, 0x61, 0x96, 0xf8, 0xee, 0x4d, 0x05, 0x57, + 0x65, 0xc7, 0x50, 0xc1 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_2[] = { + 0x18, 0x5a, 0x59, 0xe5, 0x91, 0x4d, 0xc9, 0x6c, + 0xfa, 0x5b, 0x36, 0x06, 0x8c, 0x9a + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_c_2[] = { + 0x31, 0x2d, 0x58, 0x15 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_c_2[] = { + 0x14, 0xf2, 0xc8, 0x25, 0x02, 0x79, 0x22, 0xa1, + 0x96, 0xb6, 0xf7, 0x07, 0x76, 0xa6, 0xa3, 0xc4, + 0x37, 0xdf, 0xa0, 0xf8, 0x78, 0x93, 0x2c, 0xfa, + 0xea, 0x35, 0xf0, 0xf3, 0x3f, 0x32, 0x6e, 0xfd + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_c_2[] = { + 0x6e, 0x3d, 0x4a, 0x99, 0xea, 0x2f, 0x9d, 0x13, + 0x4a, 0x1e, 0x71, 0x2e, 0x15, 0xc0, 0xca, 0xb6, + 0x35, 0x78, 0xdf, 0xa4 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_c_2[] = { + 0xae, 0xe4, 0xec, 0x18, 0x31, 0x70, 0x5d, 0x3f, + 0xdc, 0x97, 0x89, 0x88, 0xfd, 0xff + }; + /* 128-bit key, kdrIdx = 8 */ + WOLFSSL_SMALL_STACK_STATIC const byte key_3[] = { + 0x36, 0xb4, 0xde, 0xcb, 0x2e, 0x51, 0x23, 0x76, + 0xe0, 0x27, 0x7e, 0x3e, 0xc8, 0xf6, 0x54, 0x04 + }; + WOLFSSL_SMALL_STACK_STATIC const byte salt_3[] = { + 0x73, 0x26, 0xf4, 0x3f, 0xc0, 0xd9, 0xc6, 0xe3, + 0x2f, 0x92, 0x7d, 0x46, 0x12, 0x76 + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_3[] = { + 0x44, 0x73, 0xb2, 0x2d, 0xb2, 0x60 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_3[] = { + 0x79, 0x91, 0x3d, 0x7b, 0x20, 0x5d, 0xea, 0xe2, + 0xeb, 0x46, 0x89, 0x68, 0x5a, 0x06, 0x73, 0x74 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_3[] = { + 0x2d, 0x2e, 0x97, 0x4e, 0x76, 0x8c, 0x62, 0xa6, + 0x57, 0x80, 0x13, 0x42, 0x0b, 0x51, 0xa7, 0x66, + 0xea, 0x31, 0x24, 0xe6 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_3[] = { + 0xcc, 0xd7, 0x31, 0xf6, 0x3b, 0xf3, 0x89, 0x8a, + 0x5b, 0x7b, 0xb5, 0x8b, 0x4c, 0x3f + }; + WOLFSSL_SMALL_STACK_STATIC const byte index_c_3[] = { + 0x4a, 0x7d, 0xaa, 0x85 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ke_c_3[] = { + 0x34, 0x99, 0x71, 0xfe, 0x12, 0x93, 0xae, 0x8c, + 0x4a, 0xe9, 0x84, 0xe4, 0x93, 0x53, 0x63, 0x88 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ka_c_3[] = { + 0xa4, 0x53, 0x5e, 0x0a, 0x9c, 0xf2, 0xce, 0x13, + 0xef, 0x7a, 0x13, 0xee, 0x0a, 0xef, 0xba, 0x17, + 0x05, 0x18, 0xe3, 0xed + }; + WOLFSSL_SMALL_STACK_STATIC const byte ks_c_3[] = { + 0xe1, 0x29, 0x4f, 0x61, 0x30, 0x3c, 0x4d, 0x46, + 0x5f, 0x5c, 0x81, 0x3c, 0x38, 0xb6 + }; + + /* SRTCP w/ 48-bit idx - KDR 0 (-1) */ + WOLFSSL_SMALL_STACK_STATIC const byte mk48_1[] = { + 0xFF, 0xB6, 0xCB, 0x09, 0x71, 0x3F, 0x63, 0x4D, + 0x7F, 0x42, 0xED, 0xA8, 0x12, 0x81, 0x50, 0xE6 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ms48_1[] = { + 0x1F, 0x04, 0x76, 0xC8, 0x7F, 0x58, 0x23, 0xEF, + 0xD3, 0x57, 0xB2, 0xBD, 0xF1, 0x32 + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcp48idx_1[] = { + 0x00, 0x00, 0x08, 0x56, 0xBC, 0x39 + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcpKe_48_1[] = { + 0xD2, 0xC3, 0xF3, 0x49, 0x00, 0x1A, 0x18, 0x0F, + 0xB6, 0x05, 0x5A, 0x5A, 0x67, 0x8E, 0xE5, 0xB2 + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcpKa_48_1[] = { + 0x8D, 0x54, 0xBE, 0xB5, 0x7B, 0x7F, 0x7A, 0xAB, + 0xF5, 0x46, 0xCE, 0x5B, 0x45, 0x69, 0x4A, 0x75, + 0x81, 0x2A, 0xE2, 0xCB + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcpKs_48_1[] = { + 0x76, 0x3C, 0x97, 0x6A, 0x45, 0x31, 0xA7, 0x79, + 0x3C, 0x28, 0x4A, 0xA6, 0x82, 0x03 + }; + + /* SRTCP w/ 48-bit idx - KDR 19 */ + WOLFSSL_SMALL_STACK_STATIC const byte mk48_2[] = { + 0xBD, 0x1D, 0x71, 0x6B, 0xDA, 0x28, 0xE3, 0xFC, + 0xA5, 0xA0, 0x66, 0x3F, 0x2E, 0x34, 0xA8, 0x58 + }; + WOLFSSL_SMALL_STACK_STATIC const byte ms48_2[] = { + 0x79, 0x06, 0xE5, 0xAB, 0x5C, 0x2B, 0x1B, 0x69, + 0xFA, 0xEE, 0xD2, 0x29, 0x57, 0x3C + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcp48idx_2[] = { + 0x00, 0x00, 0x59, 0xD0, 0xC2, 0xE8 + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcpKe_48_2[] = { + 0xB9, 0xD7, 0xAD, 0xD8, 0x90, 0x94, 0xC2, 0x92, + 0xA5, 0x04, 0x87, 0xC4, 0x8C, 0xEF, 0xE2, 0xA3 + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcpKa_48_2[] = { + 0x07, 0xD5, 0xC4, 0xD2, 0x06, 0xFB, 0x63, 0x15, + 0xC2, 0x9C, 0x7F, 0x55, 0xD1, 0x16, 0x5C, 0xB5, + 0xB7, 0x44, 0x54, 0xBD + }; + WOLFSSL_SMALL_STACK_STATIC const byte srtcpKs_48_2[] = { + 0x0C, 0x5E, 0x53, 0xC1, 0xD0, 0x75, 0xAD, 0x65, + 0xBF, 0x51, 0x74, 0x50, 0x89, 0xD7 + }; + int kdr_48_1 = -1; + int kdr_48_2 = 19; + + #define SRTP_TV_CNT 4 + Srtp_Kdf_Tv tv[SRTP_TV_CNT] = { + { key_0, (word32)sizeof(key_0), salt_0, (word32)sizeof(salt_0), -1, + index_0, ke_0, ka_0, ks_0, index_c_0, ke_c_0, ka_c_0, ks_c_0, + 16, 20, 14 }, + { key_1, (word32)sizeof(key_1), salt_1, (word32)sizeof(salt_1), 0, + index_1, ke_1, ka_1, ks_1, index_c_1, ke_c_1, ka_c_1, ks_c_1, + 24, 20, 14 }, + { key_2, (word32)sizeof(key_2), salt_2, (word32)sizeof(salt_2), 1, + index_2, ke_2, ka_2, ks_2, index_c_2, ke_c_2, ka_c_2, ks_c_2, + 32, 20, 14 }, + { key_3, (word32)sizeof(key_3), salt_3, (word32)sizeof(salt_3), 8, + index_3, ke_3, ka_3, ks_3, index_c_3, ke_c_3, ka_c_3, ks_c_3, + 16, 20, 14 }, + }; + int i; + int idx; + unsigned char keyE[32]; + unsigned char keyA[20]; + unsigned char keyS[14]; + WOLFSSL_ENTER("srtpkdf_test"); + + for (i = 0; (ret == 0) && (i < SRTP_TV_CNT); i++) { + #ifndef WOLFSSL_AES_128 + if (tv[i].keySz == AES_128_KEY_SIZE) { + continue; + } + #endif + #ifndef WOLFSSL_AES_192 + if (tv[i].keySz == AES_192_KEY_SIZE) { + continue; + } + #endif + #ifndef WOLFSSL_AES_256 + if (tv[i].keySz == AES_256_KEY_SIZE) { + continue; + } + #endif + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyE, tv[i].ke, tv[i].keSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyA, tv[i].ka, tv[i].kaSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyS, tv[i].ks, tv[i].ksSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTP_KDF_label(tv[i].key, tv[i].keySz, tv[i].salt, + tv[i].saltSz, tv[i].kdfIdx, tv[i].index, WC_SRTP_LABEL_ENCRYPTION, + keyE, tv[i].keSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyE, tv[i].ke, tv[i].keSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTP_KDF_label(tv[i].key, tv[i].keySz, tv[i].salt, + tv[i].saltSz, tv[i].kdfIdx, tv[i].index, WC_SRTP_LABEL_MSG_AUTH, + keyA, tv[i].kaSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyA, tv[i].ka, tv[i].kaSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTP_KDF_label(tv[i].key, tv[i].keySz, tv[i].salt, + tv[i].saltSz, tv[i].kdfIdx, tv[i].index, WC_SRTP_LABEL_SALT, keyS, + tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyS, tv[i].ks, tv[i].ksSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyE, tv[i].ke_c, tv[i].keSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyA, tv[i].ka_c, tv[i].kaSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyS, tv[i].ks_c, tv[i].ksSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTCP_KDF_label(tv[i].key, tv[i].keySz, tv[i].salt, + tv[i].saltSz, tv[i].kdfIdx, tv[i].index_c, + WC_SRTCP_LABEL_ENCRYPTION, keyE, tv[i].keSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyE, tv[i].ke_c, tv[i].keSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTCP_KDF_label(tv[i].key, tv[i].keySz, tv[i].salt, + tv[i].saltSz, tv[i].kdfIdx, tv[i].index_c, WC_SRTCP_LABEL_MSG_AUTH, + keyA, tv[i].kaSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyA, tv[i].ka_c, tv[i].kaSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTCP_KDF_label(tv[i].key, tv[i].keySz, tv[i].salt, + tv[i].saltSz, tv[i].kdfIdx, tv[i].index_c, WC_SRTCP_LABEL_SALT, + keyS, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyS, tv[i].ks_c, tv[i].ksSz) != 0) + return WC_TEST_RET_ENC_NC; + } + +#ifdef WOLFSSL_AES_128 + i = 0; +#elif defined(WOLFSSL_AES_192) + i = 1; +#else + i = 2; +#endif + ret = wc_SRTP_KDF(tv[i].key, 33, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, 33, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, 15, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, 15, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, 15, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, 15, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(NULL, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(NULL, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, NULL, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, NULL, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + 25, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + 25, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + -2, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + -2, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != BAD_FUNC_ARG) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, NULL, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, NULL, tv[i].keSz, keyA, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, NULL, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, NULL, tv[i].kaSz, + keyS, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + ret = wc_SRTP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index, keyE, tv[i].keSz, keyA, tv[i].kaSz, + NULL, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + ret = wc_SRTCP_KDF(tv[i].key, tv[i].keySz, tv[i].salt, tv[i].saltSz, + tv[i].kdfIdx, tv[i].index_c, keyE, tv[i].keSz, keyA, tv[i].kaSz, + NULL, tv[i].ksSz); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + + idx = wc_SRTP_KDF_kdr_to_idx(0); + if (idx != -1) + return WC_TEST_RET_ENC_NC; + for (i = 0; i < 32; i++) { + word32 kdr = 1U << i; + + /* SRTCP w/ 48-bit IDX, 128-bit key test */ + if (i == 0) { + ret = wc_SRTCP_KDF_ex(mk48_1, (word32)sizeof(mk48_1), + ms48_1, (word32)sizeof(ms48_1), + kdr_48_1, srtcp48idx_1, keyE, tv[i].keSz, + keyA, tv[i].kaSz, keyS, tv[i].ksSz, + WC_SRTCP_48BIT_IDX); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyE, srtcpKe_48_1, tv[i].keSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyA, srtcpKa_48_1, tv[i].kaSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyS, srtcpKs_48_1, tv[i].ksSz) != 0) + return WC_TEST_RET_ENC_NC; + + ret = wc_SRTCP_KDF_ex(mk48_2, (word32)sizeof(mk48_2), + ms48_2, (word32)sizeof(ms48_2), + kdr_48_2, srtcp48idx_2, keyE, tv[i].keSz, + keyA, tv[i].kaSz, keyS, tv[i].ksSz, + WC_SRTCP_48BIT_IDX); + if (ret != 0) + return WC_TEST_RET_ENC_EC(ret); + if (XMEMCMP(keyE, srtcpKe_48_2, tv[i].keSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyA, srtcpKa_48_2, tv[i].kaSz) != 0) + return WC_TEST_RET_ENC_NC; + if (XMEMCMP(keyS, srtcpKs_48_2, tv[i].ksSz) != 0) + return WC_TEST_RET_ENC_NC; + } + idx = wc_SRTP_KDF_kdr_to_idx(kdr); + if (idx != i) + return WC_TEST_RET_ENC_NC; + } + + return 0; +} +#endif + #ifdef HAVE_ECC /* size to use for ECC key gen tests */ #ifndef ECC_KEYGEN_SIZE - #ifndef NO_ECC256 + #if !defined(NO_ECC256) || defined(WOLFSSL_SM2) #define ECC_KEYGEN_SIZE 32 #elif defined(HAVE_ECC384) #define ECC_KEYGEN_SIZE 48 @@ -23433,9 +28693,10 @@ } eccVector; #if !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_test_vector_item(const eccVector* vector) +static wc_test_ret_t ecc_test_vector_item(const eccVector* vector) { - int ret = 0, verify = 0; + wc_test_ret_t ret = 0; + int verify = 0; word32 sigSz; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *userA = (ecc_key *)XMALLOC(sizeof *userA, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -23450,6 +28711,13 @@ WC_DECLARE_VAR(s, byte, MAX_ECC_BYTES, HEAP_HINT); #endif + WC_ALLOC_VAR(sig, byte, ECC_SIG_SIZE, HEAP_HINT); +#if !defined(NO_ASN) && !defined(HAVE_SELFTEST) + WC_ALLOC_VAR(sigRaw, byte, ECC_SIG_SIZE, HEAP_HINT); + WC_ALLOC_VAR(r, byte, MAX_ECC_BYTES, HEAP_HINT); + WC_ALLOC_VAR(s, byte, MAX_ECC_BYTES, HEAP_HINT); +#endif + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC if (sig == NULL) ERROR_OUT(MEMORY_E, done); @@ -23539,9 +28807,9 @@ return ret; } -static int ecc_test_vector(int keySize) +static wc_test_ret_t ecc_test_vector(int keySize) { - int ret; + wc_test_ret_t ret; eccVector vec; XMEMSET(&vec, 0, sizeof(vec)); @@ -23789,9 +29057,9 @@ defined(WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT)) \ && (!defined(FIPS_VERSION_GE) || FIPS_VERSION_GE(5,3)) #if defined(HAVE_ECC256) -static int ecc_test_deterministic_k(WC_RNG* rng) +static wc_test_ret_t ecc_test_deterministic_k(WC_RNG* rng) { - int ret; + wc_test_ret_t ret; #ifdef WOLFSSL_SMALL_STACK ecc_key *key = NULL; #else @@ -23895,9 +29163,9 @@ #ifdef WOLFSSL_PUBLIC_MP #if defined(HAVE_ECC384) /* KAT from RFC6979 */ -static int ecc384_test_deterministic_k(WC_RNG* rng) +static wc_test_ret_t ecc384_test_deterministic_k(WC_RNG* rng) { - int ret; + wc_test_ret_t ret; #ifdef WOLFSSL_SMALL_STACK ecc_key *key; mp_int *r, *s, *expR, *expS; @@ -24008,9 +29276,9 @@ #if defined(HAVE_ECC521) /* KAT from RFC6979 */ -static int ecc521_test_deterministic_k(WC_RNG* rng) +static wc_test_ret_t ecc521_test_deterministic_k(WC_RNG* rng) { - int ret; + wc_test_ret_t ret; #ifdef WOLFSSL_SMALL_STACK ecc_key *key; mp_int *r, *s, *expR, *expS; @@ -24067,7 +29335,7 @@ } ret = wc_ecc_init_ex(key, HEAP_HINT, devId); if (ret != 0) { - return ret; + return WC_TEST_RET_ENC_EC(ret); } key_inited = 1; @@ -24132,9 +29400,9 @@ #if defined(HAVE_ECC_SIGN) && defined(WOLFSSL_ECDSA_SET_K) && \ !defined(WOLFSSL_KCAPI_ECC) -static int ecc_test_sign_vectors(WC_RNG* rng) +static wc_test_ret_t ecc_test_sign_vectors(WC_RNG* rng) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *key = NULL; #else @@ -24232,9 +29500,9 @@ #endif #if defined(HAVE_ECC_CDH) && defined(HAVE_ECC_DHE) -static int ecc_test_cdh_vectors(WC_RNG* rng) +static wc_test_ret_t ecc_test_cdh_vectors(WC_RNG* rng) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *pub_key = (ecc_key *)XMALLOC(sizeof *pub_key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); ecc_key *priv_key = (ecc_key *)XMALLOC(sizeof *priv_key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -24336,7 +29604,7 @@ #ifdef HAVE_ECC_KEY_IMPORT /* returns 0 on success */ -static int ecc_test_make_pub(WC_RNG* rng) +static wc_test_ret_t ecc_test_make_pub(WC_RNG* rng) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *key = (ecc_key *)XMALLOC(sizeof *key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -24357,7 +29625,7 @@ const byte* msg = (const byte*)"test wolfSSL ECC public gen"; word32 x; word32 tmpSz; - int ret = 0; + wc_test_ret_t ret = 0; ecc_point* pubPoint = NULL; #ifdef HAVE_ECC_VERIFY int verify = 0; @@ -24381,10 +29649,12 @@ wc_ecc_init_ex(key, HEAP_HINT, devId); #ifndef NO_ECC256 -#ifdef USE_CERT_BUFFERS_256 - XMEMCPY(tmp, ecc_key_der_256, (size_t)sizeof_ecc_key_der_256); - tmpSz = (size_t)sizeof_ecc_key_der_256; -#else +#if defined(USE_CERT_BUFFERS_256) + { + XMEMCPY(tmp, ecc_key_der_256, (size_t)sizeof_ecc_key_der_256); + tmpSz = (size_t)sizeof_ecc_key_der_256; + } +#elif !defined(NO_FILESYSTEM) { XFILE file = XFOPEN(eccKeyDerFile, "rb"); if (!file) { @@ -24396,6 +29666,11 @@ if (tmpSz == 0) ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); } +#else + { + WOLFSSL_MSG("No file system and USE_CERT_BUFFERS_256 not defined.(2)"); + ERROR_OUT(ASN_PARSE_E, done); + } #endif /* USE_CERT_BUFFERS_256 */ /* import private only then test with */ @@ -24612,9 +29887,9 @@ #if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) && \ !defined(WC_NO_RNG) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_test_key_decode(WC_RNG* rng, int keySize) +static wc_test_ret_t ecc_test_key_decode(WC_RNG* rng, int keySize) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *eccKey = (ecc_key *)XMALLOC(sizeof *eccKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); byte *tmpBuf = (byte *)XMALLOC(ECC_BUFSIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -24648,7 +29923,7 @@ if (ret < 0) { goto done; } - tmpSz = ret; + tmpSz = (word32)ret; ret = wc_ecc_init(eccKey); if (ret != 0) { @@ -24694,9 +29969,9 @@ #if defined(HAVE_ECC_KEY_EXPORT) && !defined(NO_ASN_CRYPT) && \ !defined(WC_NO_RNG) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_test_key_gen(WC_RNG* rng, int keySize) +static wc_test_ret_t ecc_test_key_gen(WC_RNG* rng, int keySize) { - int ret = 0; + wc_test_ret_t ret = 0; int derSz; #ifdef HAVE_PKCS8 word32 pkcs8Sz; @@ -24711,41 +29986,40 @@ #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((der == NULL) || (userA == NULL)) - ERROR_OUT(MEMORY_E, done); + ERROR_OUT(WC_TEST_RET_ENC_EC(MEMORY_E), done); #endif ret = wc_ecc_init_ex(userA, HEAP_HINT, devId); if (ret != 0) - goto done; + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); ret = wc_ecc_make_key(rng, keySize, userA); #if defined(WOLFSSL_ASYNC_CRYPT) ret = wc_AsyncWait(ret, &userA->asyncDev, WC_ASYNC_FLAG_NONE); #endif if (ret != 0) - goto done; + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); TEST_SLEEP(); ret = wc_ecc_check_key(userA); if (ret != 0) - goto done; + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); TEST_SLEEP(); derSz = wc_EccKeyToDer(userA, der, ECC_BUFSIZE); if (derSz < 0) { - ERROR_OUT(derSz, done); + ERROR_OUT(WC_TEST_RET_ENC_I(derSz), done); } ret = SaveDerAndPem(der, derSz, eccCaKeyTempFile, eccCaKeyPemFile, ECC_PRIVATEKEY_TYPE); - if (ret != 0) { - goto done; - } + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); /* test export of public key */ derSz = wc_EccPublicKeyToDer(userA, der, ECC_BUFSIZE, 1); if (derSz < 0) { - ERROR_OUT(derSz, done); + ERROR_OUT(WC_TEST_RET_ENC_I(derSz), done); } if (derSz == 0) { ERROR_OUT(WC_TEST_RET_ENC_NC, done); @@ -24755,7 +30029,7 @@ /* test export of compressed public key */ derSz = wc_EccPublicKeyToDer_ex(userA, der, ECC_BUFSIZE, 1, 1); if (derSz < 0) { - ERROR_OUT(derSz, done); + ERROR_OUT(WC_TEST_RET_ENC_I(derSz), done); } if (derSz == 0) { ERROR_OUT(WC_TEST_RET_ENC_NC, done); @@ -24763,16 +30037,15 @@ #endif ret = SaveDerAndPem(der, derSz, eccPubKeyDerFile, NULL, 0); - if (ret != 0) { - goto done; - } + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); #ifdef HAVE_PKCS8 /* test export of PKCS#8 unencrypted private key */ pkcs8Sz = FOURK_BUF; derSz = wc_EccPrivateKeyToPKCS8(userA, der, &pkcs8Sz); if (derSz < 0) { - ERROR_OUT(derSz, done); + ERROR_OUT(WC_TEST_RET_ENC_I(derSz), done); } if (derSz == 0) { @@ -24802,7 +30075,7 @@ } #endif /* HAVE_ECC_KEY_EXPORT && !NO_ASN_CRYPT */ -static int ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, +static wc_test_ret_t ecc_test_curve_size(WC_RNG* rng, int keySize, int testVerifyCount, int curve_id, const ecc_set_type* dp) { #if defined(HAVE_ECC_DHE) && !defined(WC_NO_RNG) && \ @@ -24826,7 +30099,7 @@ int verify; #endif /* HAVE_ECC_VERIFY */ #endif /* HAVE_ECC_SIGN */ - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *userA = (ecc_key *)XMALLOC(sizeof *userA, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); ecc_key *userB = (ecc_key *)XMALLOC(sizeof *userB, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -24840,6 +30113,21 @@ int curveSize; #endif +#if defined(HAVE_ECC_DHE) && !defined(WC_NO_RNG) && \ + !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) + WC_ALLOC_VAR(sharedA, byte, ECC_SHARED_SIZE, HEAP_HINT); + WC_ALLOC_VAR(sharedB, byte, ECC_SHARED_SIZE, HEAP_HINT); +#endif +#ifdef HAVE_ECC_KEY_EXPORT + WC_ALLOC_VAR(exportBuf, byte, ECC_KEY_EXPORT_BUF_SIZE, HEAP_HINT); +#endif +#if !defined(ECC_TIMING_RESISTANT) || (defined(ECC_TIMING_RESISTANT) && \ + !defined(WC_NO_RNG) && !defined(WOLFSSL_KCAPI_ECC)) && \ + defined(HAVE_ECC_SIGN) + WC_ALLOC_VAR(sig, byte, ECC_SIG_SIZE, HEAP_HINT); + WC_ALLOC_VAR(digest, byte, ECC_DIGEST_SIZE, HEAP_HINT); +#endif + #ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC #if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) && \ !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) @@ -24937,7 +30225,8 @@ /* only perform the below tests if the key size matches */ if (dp == NULL && keySize > 0 && wc_ecc_size(userA) != keySize) - ERROR_OUT(ECC_CURVE_OID_E, done); + /* Not an error, just not a key size match */ + WARNING_OUT(ECC_CURVE_OID_E, done); #ifdef HAVE_ECC_DHE #if defined(ECC_TIMING_RESISTANT) && (!defined(HAVE_FIPS) || \ @@ -25243,12 +30532,22 @@ #undef ECC_TEST_VERIFY_COUNT #define ECC_TEST_VERIFY_COUNT 2 -static int ecc_test_curve(WC_RNG* rng, int keySize) +static wc_test_ret_t ecc_test_curve(WC_RNG* rng, int keySize, int curve_id) { - int ret; + wc_test_ret_t ret; + WOLFSSL_MSG_EX("ecc_test_curve keySize = %d", keySize); - ret = ecc_test_curve_size(rng, keySize, ECC_TEST_VERIFY_COUNT, - ECC_CURVE_DEF, NULL); +#if FIPS_VERSION3_GE(6,0,0) + #ifdef DEBUG_WOLFSSL + printf("keySize is %d\n", keySize); + #endif + if (keySize < WC_ECC_FIPS_GEN_MIN) { + goto skip_A; + } +#endif + + ret = ecc_test_curve_size(rng, keySize, ECC_TEST_VERIFY_COUNT, curve_id, + NULL); if (ret < 0) { if (ret == ECC_CURVE_OID_E) { /* ignore error for curves not found */ @@ -25257,20 +30556,28 @@ and HAVE_ECC_KOBLITZ */ } else { - printf("ecc_test_curve_size %d failed!: %d\n", keySize, ret); + printf("ecc_test_curve_size %d failed!\n", keySize); return ret; } } #ifndef WOLF_CRYPTO_CB_ONLY_ECC - +#if FIPS_VERSION3_GE(6,0,0) + skip_A: +#endif #ifdef HAVE_ECC_VECTOR_TEST ret = ecc_test_vector(keySize); if (ret < 0) { - printf("ecc_test_vector %d failed!: %d\n", keySize, ret); + printf("ecc_test_vector %d failed!\n", keySize); return ret; } #endif +#if FIPS_VERSION3_GE(6,0,0) + if (keySize < WC_ECC_FIPS_GEN_MIN) { + goto skip_B; + } +#endif + #if defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) && \ !defined(NO_ASN_CRYPT) && !defined(WC_NO_RNG) ret = ecc_test_key_decode(rng, keySize); @@ -25279,7 +30586,7 @@ /* ignore error for curves not found */ } else { - printf("ecc_test_key_decode %d failed!: %d\n", keySize, ret); + printf("ecc_test_key_decode %d failed!\n", keySize); return ret; } } @@ -25292,11 +30599,14 @@ /* ignore error for curves not found */ } else { - printf("ecc_test_key_gen %d failed!: %d\n", keySize, ret); + printf("ecc_test_key_gen %d failed!\n", keySize); return ret; } } #endif +#if FIPS_VERSION3_GE(6,0,0) + skip_B: +#endif #endif /* WOLF_CRYPTO_CB_ONLY_ECC */ return 0; } @@ -25305,9 +30615,9 @@ #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) && \ !defined(WOLFSSL_NO_MALLOC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_point_test(void) +static wc_test_ret_t ecc_point_test(void) { - int ret; + wc_test_ret_t ret; ecc_point* point; ecc_point* point2; #ifdef HAVE_COMP_KEY @@ -25548,9 +30858,9 @@ #endif /* !WOLFSSL_ATECC508A && HAVE_ECC_KEY_IMPORT && HAVE_ECC_KEY_EXPORT */ #if !defined(NO_SIG_WRAPPER) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_sig_test(WC_RNG* rng, ecc_key* key) +static wc_test_ret_t ecc_sig_test(WC_RNG* rng, ecc_key* key) { - int ret; + wc_test_ret_t ret; word32 sigSz; int size; byte out[ECC_MAX_SIG_SIZE]; @@ -25602,9 +30912,9 @@ #if defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT) && \ !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_exp_imp_test(ecc_key* key) +static wc_test_ret_t ecc_exp_imp_test(ecc_key* key) { - int ret; + wc_test_ret_t ret; int curve_id; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *keyImp = (ecc_key *)XMALLOC(sizeof *keyImp, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -25732,9 +31042,9 @@ #if defined(HAVE_ECC_KEY_IMPORT) && !defined(WOLFSSL_VALIDATE_ECC_IMPORT) && \ !defined(WOLFSSL_CRYPTOCELL) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_mulmod_test(ecc_key* key1) +static wc_test_ret_t ecc_mulmod_test(ecc_key* key1) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *key2 = (ecc_key *)XMALLOC(sizeof *key2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); ecc_key *key3 = (ecc_key *)XMALLOC(sizeof *key3, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -25742,6 +31052,9 @@ ecc_key key2[1]; ecc_key key3[1]; #endif +#ifdef WOLFSSL_PUBLIC_MP + mp_int* priv; +#endif #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((key2 == NULL) || (key3 == NULL)) @@ -25776,6 +31089,26 @@ goto done; } +#ifdef WOLFSSL_PUBLIC_MP + priv = wc_ecc_key_get_priv(key1); + mp_zero(priv); + ret = wc_ecc_mulmod(wc_ecc_key_get_priv(key1), &key2->pubkey, &key3->pubkey, + wc_ecc_key_get_priv(key2), wc_ecc_key_get_priv(key3), + 1); + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + goto done; + } + if (!wc_ecc_point_is_at_infinity(&key3->pubkey)) { + ret = WC_TEST_RET_ENC_EC(ret); + goto done; + } + if (mp_cmp_d(key3->pubkey.z, 1) != MP_EQ) { + ret = WC_TEST_RET_ENC_EC(ret); + goto done; + } +#endif + done: #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -25797,10 +31130,12 @@ #endif #if defined(HAVE_ECC_DHE) && !defined(WC_NO_RNG) && \ - !defined(WOLF_CRYPTO_CB_ONLY_ECC) -static int ecc_ssh_test(ecc_key* key, WC_RNG* rng) + !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(WOLFSSL_ATECC508A) && \ + !defined(WOLFSSL_ATECC608A) && !defined(PLUTON_CRYPTO_ECC) && \ + !defined(WOLFSSL_CRYPTOCELL) +static wc_test_ret_t ecc_ssh_test(ecc_key* key, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; byte out[128]; word32 outLen = sizeof(out); @@ -25845,17 +31180,17 @@ } #endif /* HAVE_ECC_DHE && !WC_NO_RNG */ -static int ecc_def_curve_test(WC_RNG *rng) +static wc_test_ret_t ecc_def_curve_test(WC_RNG *rng) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *key = (ecc_key *)XMALLOC(sizeof *key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #else ecc_key key[1]; #endif -#if ((defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT)) || \ - (defined(HAVE_ECC_KEY_IMPORT) && !defined(WOLFSSL_VALIDATE_ECC_IMPORT))) \ - && !defined(NO_ECC_SECP) +#if !defined(NO_ECC_SECP) && \ + ((defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT)) || \ + (defined(HAVE_ECC_KEY_IMPORT) && !defined(WOLFSSL_VALIDATE_ECC_IMPORT))) word32 idx = 0; #endif @@ -25906,14 +31241,16 @@ (void)rng; #endif /* !WC_NO_RNG */ -#if ((defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT)) || \ - (defined(HAVE_ECC_KEY_IMPORT) && !defined(WOLFSSL_VALIDATE_ECC_IMPORT))) \ - && !defined(NO_ECC_SECP) +#if !defined(NO_ECC_SECP) && \ + ((defined(HAVE_ECC_KEY_IMPORT) && defined(HAVE_ECC_KEY_EXPORT)) || \ + (defined(HAVE_ECC_KEY_IMPORT) && !defined(WOLFSSL_VALIDATE_ECC_IMPORT))) /* Use test ECC key - ensure real private "d" exists */ - #ifdef USE_CERT_BUFFERS_256 - ret = wc_EccPrivateKeyDecode(ecc_key_der_256, &idx, key, - sizeof_ecc_key_der_256); - #else + #if defined(USE_CERT_BUFFERS_256) + { + ret = wc_EccPrivateKeyDecode(ecc_key_der_256, &idx, key, + sizeof_ecc_key_der_256); + } + #elif !defined(NO_FILESYSTEM) { XFILE file = XFOPEN(eccKeyDerFile, "rb"); byte der[128]; @@ -25927,6 +31264,12 @@ ERROR_OUT(WC_TEST_RET_ENC_ERRNO, done); ret = wc_EccPrivateKeyDecode(der, &idx, key, derSz); } + #else + { + (void)idx; + WOLFSSL_MSG("No file system and USE_CERT_BUFFERS_256 not defined.(3)"); + ERROR_OUT(ASN_PARSE_E, done); + } #endif if (ret != 0) { goto done; @@ -25963,9 +31306,9 @@ #if defined(WOLFSSL_CERT_EXT) && \ (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 -static int ecc_decode_test(void) +static wc_test_ret_t ecc_decode_test(void) { - int ret; + wc_test_ret_t ret; word32 inSz; word32 inOutIdx; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -26170,9 +31513,9 @@ 0xac, 0xf0, 0x1d, 0x86, 0xf4, 0x2f, 0x65, 0x0b }; -static int ecc_test_custom_curves(WC_RNG* rng) +static wc_test_ret_t ecc_test_custom_curves(WC_RNG* rng) { - int ret; + wc_test_ret_t ret; word32 inOutIdx; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *key = (ecc_key *)XMALLOC(sizeof *key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -26226,7 +31569,7 @@ ret = ecc_test_curve_size(rng, 0, ECC_TEST_VERIFY_COUNT, ECC_CURVE_DEF, &ecc_dp_brainpool256r1); if (ret != 0) { - printf("ECC test for custom curve failed! %d\n", ret); + printf("ECC test for custom curve failed!\n"); goto done; } #endif @@ -26242,7 +31585,7 @@ /* Test and demonstrate use of non-SECP curve */ ret = ecc_test_curve_size(rng, 0, ECC_TEST_VERIFY_COUNT, curve_id, NULL); if (ret < 0) { - printf("ECC test for curve_id %d failed! %d\n", curve_id, ret); + printf("ECC test for curve_id %d failed!\n", curve_id); goto done; } } @@ -26277,12 +31620,586 @@ } #endif /* WOLFSSL_CUSTOM_CURVES */ +#ifdef WOLFSSL_SM2 +#ifdef HAVE_ECC_VERIFY +#if defined(WOLFSSL_PUBLIC_MP) && defined(WOLFSSL_CUSTOM_CURVES) + #ifdef HAVE_OID_ENCODING + #define CODED_SM2P256V1 {1,2,156,10197,1,301} + #define CODED_SM2P256V1_SZ 6 + #else + #define CODED_SM2P256V1 {0x06,0x08,0x2A,0x81,0x1C,0xCF,0x55,0x01,0x82,0x2D} + #define CODED_SM2P256V1_SZ 10 + #endif + #ifndef WOLFSSL_ECC_CURVE_STATIC + static const ecc_oid_t ecc_oid_sm2p256v1[] = CODED_SM2P256V1; + #else + #define ecc_oid_sm2p256v1 CODED_SM2P256V1 + #endif + #define ecc_oid_sm2p256v1_sz CODED_SM2P256V1_SZ + #define ECC_SM2P256V1_TEST 102 +static int test_sm2_verify_caseA2(void) +{ + ecc_key key; + int ret, res; + mp_int r,s; + + /* test key values */ + const char qx[] = "0AE4C7798AA0F119471BEE11825BE46202BB79E2A5844495E97C04FF4DF2548A"; + const char qy[] = "7C0240F88F1CD4E16352A73C17B7F16F07353E53A176D684A9FE0C6BB798E857"; + const char d[] = "128B2FA8BD433C6C068C8D803DFF79792A519A55171B1B650C23661D15897263"; + + const ecc_set_type ecc_sm2_A2 = { + 32, /* size/bytes */ + ECC_SM2P256V1_TEST, /* ID */ + "SM2P256V1_TEST", /* curve name */ + + /* from test case A.2 in draft-shen-sm2-ecdsa-02 */ + "8542D69E4C044F18E8B92435BF6FF7DE457283915C45517D722EDB8B08F1DFC3", /* prime */ + "787968B4FA32C3FD2417842E73BBFEFF2F3C848B6831D7E0EC65228B3937E498", /* A */ + "63E4C6D3B23B0C849CF84241484BFE48F61D59A5B16BA06E6E12D1DA27C5249A", /* B */ + "8542D69E4C044F18E8B92435BF6FF7DD297720630485628D5AE74EE7C32E79B7", /* order n */ + "421DEBD61B62EAB6746434EBC3CC315E32220B3BADD50BDC4C4E6C147FEDD43D", /* Gx */ + "0680512BCBB42C07D47349D2153B70C4E5D7FDFCBFA36EA1A85841B9E46E09A2", /* Gy */ + ecc_oid_sm2p256v1, /* oid/oidSz */ + ecc_oid_sm2p256v1_sz, + ECC_SM2P256V1_OID, /* oid sum */ + 1, /* cofactor */ + }; + + /* use canned hash value hash = H(ZA||M) */ + const byte hash[] = { + 0xB5,0x24,0xF5,0x52,0xCD,0x82,0xB8,0xB0, + 0x28,0x47,0x6E,0x00,0x5C,0x37,0x7F,0xB1, + 0x9A,0x87,0xE6,0xFC,0x68,0x2D,0x48,0xBB, + 0x5D,0x42,0xE3,0xD9,0xB9,0xEF,0xFE,0x76 + }; + + /* canned r and s */ + const byte rCan[] = { + 0x40,0xF1,0xEC,0x59,0xF7,0x93,0xD9,0xF4, + 0x9E,0x09,0xDC,0xEF,0x49,0x13,0x0D,0x41, + 0x94,0xF7,0x9F,0xB1,0xEE,0xD2,0xCA,0xA5, + 0x5B,0xAC,0xDB,0x49,0xC4,0xE7,0x55,0xD1 + }; + + const byte sCan[] = { + 0x6F,0xC6,0xDA,0xC3,0x2C,0x5D,0x5C,0xF1, + 0x0C,0x77,0xDF,0xB2,0x0F,0x7C,0x2E,0xB6, + 0x67,0xA4,0x57,0x87,0x2F,0xB0,0x9E,0xC5, + 0x63,0x27,0xA6,0x7E,0xC7,0xDE,0xEB,0xE7 + }; + mp_init(&r); + mp_init(&s); + + ret = wc_ecc_init_ex(&key, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + ret = wc_ecc_set_custom_curve(&key, &ecc_sm2_A2); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + ret = wc_ecc_import_raw_ex(&key, qx, qy, d, ECC_SM2P256V1_TEST); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + mp_read_unsigned_bin(&r, rCan, sizeof(rCan)); + mp_read_unsigned_bin(&s, sCan, sizeof(sCan)); + + ret = wc_ecc_sm2_verify_hash_ex(&r, &s, hash, sizeof(hash), &res, &key); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + if (res != 1) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + +done: + mp_free(&r); + mp_free(&s); + wc_ecc_free(&key); + return ret; +} +#endif /* WOLFSSL_PUBLIC_MP && WOLFSSL_CUSTOM_CURVES */ + +static int test_sm2_verify_case(void) +{ + ecc_key key; + int ret, res; + + /* test key values */ + const char qx[] = "637F1B135036C933DC3F7A8EBB1B7B2FD1DFBD268D4F894B5AD47DBDBECD558F"; + const char qy[] = "E88101D08048E36CCBF61CA38DDF7ABA542B4486E99E49F3A7470A857A096433"; + + /* use canned hash value hash = H(ZA||M) */ + const byte hash[] = { + 0x3B,0xFA,0x5F,0xFB,0xC4,0x27,0x8C,0x9D, + 0x02,0x3A,0x19,0xCB,0x1E,0xAA,0xD2,0xF1, + 0x50,0x69,0x5B,0x20 + }; + + const byte sig[] = { + 0x30,0x45,0x02,0x21,0x00,0xD2,0xFC,0xA3, + 0x88,0xE3,0xDF,0xA3,0x00,0x73,0x9B,0x3C, + 0x2A,0x0D,0xAD,0x44,0xA2,0xFC,0x62,0xD5, + 0x6B,0x84,0x54,0xD8,0x40,0x22,0x62,0x3D, + 0x5C,0xA6,0x61,0x9B,0xE7,0x02,0x20,0x1D, + 0xB5,0xB5,0xD9,0xD8,0xF1,0x20,0xDD,0x97, + 0x92,0xBF,0x7E,0x9B,0x3F,0xE6,0x3C,0x4B, + 0x03,0xD8,0x80,0xBD,0xB7,0x27,0x7E,0x6A, + 0x84,0x23,0xDE,0x61,0x7C,0x8D,0xDC + }; + + const byte badSig[] = { + 0x30,0x45,0x02,0x21,0x00,0xD2,0xFC,0xA3, + 0x88,0xE3,0xDF,0xA3,0x00,0x73,0x9B,0x3C, + 0x2A,0x0D,0xAD,0x44,0xA2,0xFC,0x62,0xD5, + 0x6B,0x84,0x54,0xD8,0x40,0x22,0x62,0x3D, + 0x5C,0xA6,0x61,0x9B,0xE7,0x02,0x20,0x1D, + 0xB5,0xB5,0xE9,0xD8,0xF1,0x20,0xDD,0x97, + 0x92,0xBF,0x7E,0x9B,0x3F,0xE6,0x3C,0x4B, + 0x03,0xD8,0x80,0xBD,0xB7,0x27,0x7E,0x6A, + 0x84,0x23,0xDE,0x61,0x7C,0x8D,0xDC + }; + + + ret = wc_ecc_init_ex(&key, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + ret = wc_ecc_import_raw(&key, qx, qy, NULL, "SM2P256V1"); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + ret = wc_ecc_sm2_verify_hash(sig, sizeof(sig), hash, sizeof(hash), &res, + &key); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + if (res != 1) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + + /* now test a case that should fail */ + ret = wc_ecc_sm2_verify_hash(badSig, sizeof(badSig), hash, sizeof(hash), + &res, &key); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + if (res == 1) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +done: + wc_ecc_free(&key); + return ret; +} + +static int ecc_sm2_test_curve(WC_RNG* rng, int testVerifyCount) +{ + const ecc_set_type* dp = wc_ecc_get_curve_params( + wc_ecc_get_curve_idx(ECC_SM2P256V1)); + int keySize = 32; + int curve_id = ECC_SM2P256V1; +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) + WC_DECLARE_VAR(sharedA, byte, ECC_SHARED_SIZE, HEAP_HINT); + WC_DECLARE_VAR(sharedB, byte, ECC_SHARED_SIZE, HEAP_HINT); +#endif +#ifdef HAVE_ECC_KEY_EXPORT + #define ECC_KEY_EXPORT_BUF_SIZE (MAX_ECC_BYTES * 2 + 32) + WC_DECLARE_VAR(exportBuf, byte, ECC_KEY_EXPORT_BUF_SIZE, HEAP_HINT); +#endif + word32 x = 0; +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) + word32 y; +#endif +#ifdef HAVE_ECC_SIGN + WC_DECLARE_VAR(sig, byte, ECC_SIG_SIZE, HEAP_HINT); + WC_DECLARE_VAR(digest, byte, ECC_DIGEST_SIZE, HEAP_HINT); + int i; + int verify; +#endif /* HAVE_ECC_SIGN */ + int ret; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + ecc_key *userA = (ecc_key *)XMALLOC(sizeof *userA, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + ecc_key *userB = (ecc_key *)XMALLOC(sizeof *userB, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + ecc_key *pubKey = (ecc_key *)XMALLOC(sizeof *pubKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#else + ecc_key userA[1]; + ecc_key userB[1]; + ecc_key pubKey[1]; +#endif +#ifndef WC_NO_RNG + int curveSize; +#endif + +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) + WC_ALLOC_VAR(sharedA, byte, ECC_SHARED_SIZE, HEAP_HINT); + WC_ALLOC_VAR(sharedB, byte, ECC_SHARED_SIZE, HEAP_HINT); +#endif +#ifdef HAVE_ECC_KEY_EXPORT + WC_ALLOC_VAR(exportBuf, byte, ECC_KEY_EXPORT_BUF_SIZE, HEAP_HINT); +#endif +#ifdef HAVE_ECC_SIGN + WC_ALLOC_VAR(sig, byte, ECC_SIG_SIZE, HEAP_HINT); + WC_ALLOC_VAR(digest, byte, ECC_DIGEST_SIZE, HEAP_HINT); +#endif + +#ifdef WC_DECLARE_VAR_IS_HEAP_ALLOC +#if (defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH)) && !defined(WC_NO_RNG) + if (sharedA == NULL || sharedB == NULL) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +#endif + +#ifdef HAVE_ECC_KEY_EXPORT + if (exportBuf == NULL) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +#endif + +#ifdef HAVE_ECC_SIGN + if (sig == NULL || digest == NULL) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +#endif +#endif /* WOLFSSL_SMALL_STACK && !WOLFSSL_NO_MALLOC */ + + (void)testVerifyCount; + (void)dp; + (void)x; + +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + if ((userA == NULL) || + (userB == NULL) || + (pubKey == NULL)) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +#endif + + XMEMSET(userA, 0, sizeof *userA); + XMEMSET(userB, 0, sizeof *userB); + XMEMSET(pubKey, 0, sizeof *pubKey); + + ret = wc_ecc_init_ex(userA, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + ret = wc_ecc_init_ex(userB, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + ret = wc_ecc_init_ex(pubKey, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + +#ifndef WC_NO_RNG + ret = wc_ecc_sm2_make_key(rng, userA, WC_ECC_FLAG_NONE); + if (ret == ECC_CURVE_OID_E) + goto done; /* catch case, where curve is not supported */ + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + TEST_SLEEP(); + + if (wc_ecc_get_curve_idx(curve_id) != -1) { + curveSize = wc_ecc_get_curve_size_from_id(userA->dp->id); + if (curveSize != userA->dp->size) { + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + } + } + + ret = wc_ecc_check_key(userA); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + TEST_SLEEP(); + + ret = wc_ecc_sm2_make_key(rng, userB, WC_ECC_FLAG_NONE); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + /* only perform the below tests if the key size matches */ + if (dp == NULL && keySize > 0 && wc_ecc_size(userA) != keySize) + if (ret != 0) { + ret = ECC_CURVE_OID_E; + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + } + +#ifdef HAVE_ECC_DHE +#if defined(ECC_TIMING_RESISTANT) + ret = wc_ecc_set_rng(userA, rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + ret = wc_ecc_set_rng(userB, rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); +#endif + + x = ECC_SHARED_SIZE; + ret = wc_ecc_sm2_shared_secret(userA, userB, sharedA, &x); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + y = ECC_SHARED_SIZE; + ret = wc_ecc_sm2_shared_secret(userB, userA, sharedB, &y); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + if (y != x) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + + if (XMEMCMP(sharedA, sharedB, x)) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +#endif /* HAVE_ECC_DHE */ + +#ifdef HAVE_ECC_KEY_EXPORT + x = ECC_KEY_EXPORT_BUF_SIZE; + ret = wc_ecc_export_x963_ex(userA, exportBuf, &x, 0); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + +#ifdef HAVE_ECC_KEY_IMPORT + ret = wc_ecc_import_x963_ex(exportBuf, x, pubKey, curve_id); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + +#ifdef HAVE_ECC_DHE + y = ECC_SHARED_SIZE; + ret = wc_ecc_sm2_shared_secret(userB, pubKey, sharedB, &y); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + if (XMEMCMP(sharedA, sharedB, y)) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +#endif /* HAVE_ECC_DHE */ + + #ifdef HAVE_COMP_KEY + /* try compressed export / import too */ + x = ECC_KEY_EXPORT_BUF_SIZE; + ret = wc_ecc_export_x963_ex(userA, exportBuf, &x, 1); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + wc_ecc_free(pubKey); + + ret = wc_ecc_init_ex(pubKey, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + #endif + ret = wc_ecc_import_x963_ex(exportBuf, x, pubKey, curve_id); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + #ifdef HAVE_ECC_DHE + y = ECC_SHARED_SIZE; + ret = wc_ecc_sm2_shared_secret(userB, pubKey, sharedB, &y); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + if (XMEMCMP(sharedA, sharedB, y)) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + #endif /* HAVE_ECC_DHE */ + +#endif /* HAVE_ECC_KEY_IMPORT */ +#endif /* HAVE_ECC_KEY_EXPORT */ +#endif /* !WC_NO_RNG */ + +#if !defined(ECC_TIMING_RESISTANT) || (defined(ECC_TIMING_RESISTANT) && \ + !defined(WC_NO_RNG)) +#ifdef HAVE_ECC_SIGN + /* ECC w/out Shamir has issue with all 0 digest */ + /* WC_BIGINT doesn't have 0 len well on hardware */ + /* Cryptocell has issues with all 0 digest */ +#if defined(ECC_SHAMIR) + /* test DSA sign hash with zeros */ + for (i = 0; i < (int)ECC_DIGEST_SIZE; i++) { + digest[i] = 0; + } + + x = ECC_SIG_SIZE; + ret = wc_ecc_sm2_sign_hash(digest, ECC_DIGEST_SIZE, sig, &x, rng, userA); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + for (i = 0; i < testVerifyCount; i++) { + verify = 0; + ret = wc_ecc_sm2_verify_hash(sig, x, digest, ECC_DIGEST_SIZE, &verify, + userA); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + if (verify != 1) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + } +#endif /* ECC_SHAMIR */ + + /* test DSA sign hash with sequence (0,1,2,3,4,...) */ + for (i = 0; i < (int)ECC_DIGEST_SIZE; i++) { + digest[i] = (byte)i; + } + + x = ECC_SIG_SIZE; + ret = wc_ecc_sm2_sign_hash(digest, ECC_DIGEST_SIZE, sig, &x, rng, userA); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + for (i = 0; i < testVerifyCount; i++) { + verify = 0; + ret = wc_ecc_sm2_verify_hash(sig, x, digest, ECC_DIGEST_SIZE, &verify, + userA); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + if (verify != 1) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + } +#endif /* HAVE_ECC_SIGN */ +#endif /* !ECC_TIMING_RESISTANT || (ECC_TIMING_RESISTANT && !WC_NO_RNG) */ + +#if defined(HAVE_ECC_KEY_EXPORT) && !defined(WC_NO_RNG) + x = ECC_KEY_EXPORT_BUF_SIZE; + ret = wc_ecc_export_private_only(userA, exportBuf, &x); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); +#elif defined(HAVE_ECC_KEY_EXPORT) + (void)exportBuf; +#endif /* HAVE_ECC_KEY_EXPORT */ + +done: + +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + if (userA != NULL) { + wc_ecc_free(userA); + XFREE(userA, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + } + if (userB != NULL) { + wc_ecc_free(userB); + XFREE(userB, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + } + if (pubKey != NULL) { + wc_ecc_free(pubKey); + XFREE(pubKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + } +#else + wc_ecc_free(pubKey); + wc_ecc_free(userB); + wc_ecc_free(userA); +#endif + +#if defined(HAVE_ECC_DHE) || defined(HAVE_ECC_CDH) + WC_FREE_VAR(sharedA, HEAP_HINT); + WC_FREE_VAR(sharedB, HEAP_HINT); +#endif +#ifdef HAVE_ECC_KEY_EXPORT + WC_FREE_VAR(exportBuf, HEAP_HINT); +#endif +#ifdef HAVE_ECC_SIGN + WC_FREE_VAR(sig, HEAP_HINT); + WC_FREE_VAR(digest, HEAP_HINT); +#endif + + (void)keySize; + (void)curve_id; + (void)rng; + + return ret; +} +#endif /* HAVE_ECC_VERIFY */ + +static int test_sm2_create_digest(void) +{ +#ifndef WOLFSSL_SM3 + const byte msg[] = "message to sign"; + const byte id[] = "0123456789"; + const byte badId[] = "0123556789"; + byte expected[] = { + 0xdd, 0x4d, 0x65, 0x49, 0xa3, 0x64, 0x76, 0xc0, + 0x73, 0x05, 0xdc, 0x05, 0x16, 0xb5, 0xee, 0x9f, + 0x82, 0xf9, 0xe9, 0x7d, 0x01, 0x1a, 0xdc, 0x88, + 0x5a, 0x59, 0x9c, 0x44, 0xcc, 0x47, 0xa4, 0x78 + }; + ecc_key key; + int ret; + + /* test key values */ + const char qx[] = + "af178b7b8740cc9d5b493fbd22049c12621bc27dcc5802e75ff4d045a4158baf"; + const char qy[] = + "89933faf7a4798f48c5b9b4cd3a7693d54c9e05449946eb489c0dd50a5294805"; + const char d[] = + "b3e66c2dbfb50c6ff6830c1fac4b51293a2562f9e667052b03df2d4b43c1f34a"; + int hash_type = WC_HASH_TYPE_SHA256; + byte digest[WC_SHA256_DIGEST_SIZE]; +#else + ecc_key key; + int ret; + const byte msg[] = { 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, + 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x00 }; + const byte id[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, + 0x00 }; + const byte badId[] = "0123556789"; + const char qx[] = + "09F9DF311E5421A150DD7D161E4BC5C672179FAD1833FC076BB08FF356F35020"; + const char qy[] = + "CCEA490CE26775A52DC6EA718CC1AA600AED05FBF35E084A6632F6072DA9AD13"; + const char d[] = + "3945208F7B2144B13F36E38AC6D39F95889393692860B51A42FB81EF4DF7C5B8"; + byte expected[] = { + 0xf0, 0xb4, 0x3e, 0x94, 0xba, 0x45, 0xac, 0xca, + 0xac, 0xe6, 0x92, 0xed, 0x53, 0x43, 0x82, 0xeb, + 0x17, 0xe6, 0xab, 0x5a, 0x19, 0xce, 0x7b, 0x31, + 0xf4, 0x48, 0x6f, 0xdf, 0xc0, 0xd2, 0x86, 0x40 + }; + int hash_type = WC_HASH_TYPE_SM3; + byte digest[WC_SM3_DIGEST_SIZE]; +#endif + + ret = wc_ecc_init_ex(&key, HEAP_HINT, devId); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + ret = wc_ecc_import_raw(&key, qx, qy, d, "SM2P256V1"); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + ret = wc_ecc_sm2_create_digest(id, (int)XSTRLEN((const char*)id), + msg, (int)XSTRLEN((const char*)msg), hash_type, digest, sizeof(digest), + &key); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); + + if (XMEMCMP(digest, expected, WC_SHA256_DIGEST_SIZE) != 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); + + ret = wc_ecc_sm2_create_digest(badId, (int)XSTRLEN((const char*)badId), + msg, (int)XSTRLEN((const char*)msg), hash_type, digest, sizeof(digest), + &key); + if (ret != 0) + goto done; + + /* should be different than the previous ID used */ + if (XMEMCMP(digest, expected, WC_SHA256_DIGEST_SIZE) == 0) + ERROR_OUT(WC_TEST_RET_ENC_NC, done); +done: + wc_ecc_free(&key); + return ret; +} + +static int test_sm2_verify(void) +{ + int ret = 0; + +#ifdef HAVE_ECC_VERIFY +#if defined(WOLFSSL_PUBLIC_MP) && defined(WOLFSSL_CUSTOM_CURVES) + ret = test_sm2_verify_caseA2(); + if (ret != 0) + return ret; +#endif + + ret = test_sm2_verify_case(); + if (ret != 0) + return ret; +#endif /* HAVE_ECC_VERIFY */ + + ret = test_sm2_create_digest(); + + return ret; +} +#endif /* WOLFSSL_SM2 */ + + #if defined(WOLFSSL_CERT_GEN) && !defined(NO_ECC_SECP) && !defined(NO_ASN_TIME) /* Make Cert / Sign example for ECC cert and ECC CA */ -static int ecc_test_cert_gen(WC_RNG* rng) +static wc_test_ret_t ecc_test_cert_gen(WC_RNG* rng) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) Cert *myCert = (Cert *)XMALLOC(sizeof *myCert, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); #ifdef WOLFSSL_TEST_CERT @@ -26299,9 +32216,9 @@ ecc_key certPubKey[1]; #endif int certSz; - size_t bytes; + size_t bytes = 0; word32 idx = 0; -#ifndef USE_CERT_BUFFERS_256 +#if !defined(USE_CERT_BUFFERS_256) && !defined(NO_FILESYSTEM) XFILE file; #endif #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -26332,38 +32249,46 @@ /* Get cert private key */ #ifdef ENABLE_ECC384_CERT_GEN_TEST /* Get Cert Key 384 */ -#ifdef USE_CERT_BUFFERS_256 - XMEMCPY(der, ca_ecc_key_der_384, sizeof_ca_ecc_key_der_384); - bytes = sizeof_ca_ecc_key_der_384; -#else - file = XFOPEN(eccCaKey384File, "rb"); - if (!file) { - ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); - } + #ifdef USE_CERT_BUFFERS_256 + XMEMCPY(der, ca_ecc_key_der_384, sizeof_ca_ecc_key_der_384); + bytes = sizeof_ca_ecc_key_der_384; + #elif !defined(NO_FILESYSTEM) + file = XFOPEN(eccCaKey384File, "rb"); + if (!file) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); + } - bytes = XFREAD(der, 1, FOURK_BUF, file); - XFCLOSE(file); - if (bytes == 0) - ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); - (void)eccCaKeyFile; -#endif /* USE_CERT_BUFFERS_256 */ -#else -#ifdef USE_CERT_BUFFERS_256 - XMEMCPY(der, ca_ecc_key_der_256, sizeof_ca_ecc_key_der_256); - bytes = sizeof_ca_ecc_key_der_256; + bytes = XFREAD(der, 1, FOURK_BUF, file); + XFCLOSE(file); + if (bytes == 0) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); + (void)eccCaKeyFile; + #else + WOLFSSL_MSG("No file system and USE_CERT_BUFFERS_256 not defined.(4)"); + ERROR_OUT(ASN_PARSE_E, exit); + #endif /* USE_CERT_BUFFERS_256 */ + + /* end if ENABLE_ECC384_CERT_GEN_TEST */ #else - file = XFOPEN(eccCaKeyFile, "rb"); - if (!file) { - ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); - } - bytes = XFREAD(der, 1, FOURK_BUF, file); - XFCLOSE(file); - if (bytes == 0) - ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); -#ifdef ENABLE_ECC384_CERT_GEN_TEST - (void)eccCaKey384File; -#endif -#endif /* USE_CERT_BUFFERS_256 */ + /* !ENABLE_ECC384_CERT_GEN_TEST */ + + #ifdef USE_CERT_BUFFERS_256 + XMEMCPY(der, ca_ecc_key_der_256, sizeof_ca_ecc_key_der_256); + bytes = sizeof_ca_ecc_key_der_256; + #else + file = XFOPEN(eccCaKeyFile, "rb"); + if (!file) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); + } + bytes = XFREAD(der, 1, FOURK_BUF, file); + XFCLOSE(file); + if (bytes == 0) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit); + + #ifdef ENABLE_ECC384_CERT_GEN_TEST + (void)eccCaKey384File; + #endif + #endif /* USE_CERT_BUFFERS_256 */ #endif /* ENABLE_ECC384_CERT_GEN_TEST */ /* Get CA Key */ @@ -26424,23 +32349,28 @@ #endif /* WOLFSSL_CERT_EXT */ #ifdef ENABLE_ECC384_CERT_GEN_TEST -#if defined(USE_CERT_BUFFERS_256) - ret = wc_SetIssuerBuffer(myCert, ca_ecc_cert_der_384, - sizeof_ca_ecc_cert_der_384); -#else - ret = wc_SetIssuer(myCert, eccCaCert384File); - (void)eccCaCertFile; -#endif -#else -#if defined(USE_CERT_BUFFERS_256) - ret = wc_SetIssuerBuffer(myCert, ca_ecc_cert_der_256, - sizeof_ca_ecc_cert_der_256); + #if defined(USE_CERT_BUFFERS_256) + ret = wc_SetIssuerBuffer(myCert, ca_ecc_cert_der_384, + sizeof_ca_ecc_cert_der_384); + #elif !defined(NO_FILESYSTEM) + ret = wc_SetIssuer(myCert, eccCaCert384File); + (void)eccCaCertFile; + #else + /* not testing with embedded, no file system target */ + ERROR_OUT(ASN_PARSE_E, exit); + #endif /* USE_CERT_BUFFERS_256 */ + #else - ret = wc_SetIssuer(myCert, eccCaCertFile); - #ifdef ENABLE_ECC384_CERT_GEN_TEST - (void)eccCaCert384File; + /* not ENABLE_ECC384_CERT_GEN_TEST */ + #if defined(USE_CERT_BUFFERS_256) + ret = wc_SetIssuerBuffer(myCert, ca_ecc_cert_der_256, + sizeof_ca_ecc_cert_der_256); + #else + ret = wc_SetIssuer(myCert, eccCaCertFile); + #ifdef ENABLE_ECC384_CERT_GEN_TEST + (void)eccCaCert384File; + #endif #endif -#endif #endif /* ENABLE_ECC384_CERT_GEN_TEST */ if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); @@ -26462,7 +32392,7 @@ } while (ret == WC_PENDING_E); if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit); - certSz = ret; + certSz = (int)ret; TEST_SLEEP(); #ifdef WOLFSSL_TEST_CERT @@ -26515,9 +32445,9 @@ !defined(WOLFSSL_NO_MALLOC) && !defined(WOLF_CRYPTO_CB_ONLY_ECC) && \ (!defined(NO_ECC_SECP) || defined(WOLFSSL_CUSTOM_CURVES)) /* Test for the wc_ecc_key_new() and wc_ecc_key_free() functions. */ -static int ecc_test_allocator(WC_RNG* rng) +static wc_test_ret_t ecc_test_allocator(WC_RNG* rng) { - int ret = 0; + wc_test_ret_t ret = 0; ecc_key* key; #ifdef WC_NO_RNG word32 idx = 0; @@ -26651,11 +32581,12 @@ /* perform verify of signature and hash using public key */ /* key is public Qx + public Qy */ /* sig is r + s */ -static int crypto_ecc_verify(const byte *key, uint32_t keySz, +static wc_test_ret_t crypto_ecc_verify(const byte *key, uint32_t keySz, const byte *hash, uint32_t hashSz, const byte *sig, uint32_t sigSz, uint32_t curveSz, int curveId) { - int ret, verify_res = 0, count = 0; + wc_test_ret_t ret; + int verify_res = 0, count = 0; mp_int r, s; ecc_key ecc; ecc_nb_ctx_t nb_ctx; @@ -26752,11 +32683,12 @@ } /* perform signature operation against hash using private key */ -static int crypto_ecc_sign(const byte *key, uint32_t keySz, +static wc_test_ret_t crypto_ecc_sign(const byte *key, uint32_t keySz, const byte *hash, uint32_t hashSz, byte *sig, uint32_t* sigSz, uint32_t curveSz, int curveId, WC_RNG* rng) { - int ret, count = 0; + wc_test_ret_t ret; + int count = 0; mp_int r, s; ecc_key ecc; ecc_nb_ctx_t nb_ctx; @@ -26847,10 +32779,10 @@ * don't have non-blocking versions of the key checking functions, yet. */ #if defined(HAVE_ECC_DHE) && !defined(WOLFSSL_VALIDATE_ECC_KEYGEN) -static int ecc_test_nonblock_dhe(int curveId, word32 curveSz, +static wc_test_ret_t ecc_test_nonblock_dhe(int curveId, word32 curveSz, const byte* privKey, const byte* pubKey, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; ecc_key keyA; ecc_key keyB; ecc_nb_ctx_t nbCtxA; @@ -26933,11 +32865,11 @@ #endif /* HAVE_ECC_DHE && !WOLFSSL_VALIDATE_ECC_KEYGEN */ #if defined(HAVE_ECC_SIGN) && defined(HAVE_ECC_VERIFY) -static int ecc_test_nonblock_ecdsa(int curveId, word32 curveSz, +static wc_test_ret_t ecc_test_nonblock_ecdsa(int curveId, word32 curveSz, const byte* privKey, word32 privKeySz, const byte* pubKey, word32 pubKeySz, WC_RNG* rng) { - int ret = 0; + wc_test_ret_t ret = 0; byte* sig = NULL; word32 sigSz = curveSz * 2; static const byte hash[] = { @@ -26972,9 +32904,9 @@ } #endif /* HAVE_ECC_SIGN && HAVE_ECC_VERIFY */ -static int ecc_test_nonblock(WC_RNG* rng) +static wc_test_ret_t ecc_test_nonblock(WC_RNG* rng) { - int ret = 0; + wc_test_ret_t ret = 0; word32 i; int curveIds[3] = {0, 0, 0}; word32 curveSzs[3] = {0, 0, 0}; @@ -27028,10 +32960,68 @@ } #endif /* WC_ECC_NONBLOCK && WOLFSSL_HAVE_SP_ECC && WOLFSSL_PUBLIC_MP */ -WOLFSSL_TEST_SUBROUTINE int ecc_test(void) +#if !defined(NO_ASN) && !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2))) +static int ecc_test_raw_enc_dec(void) { int ret; + unsigned char r[1]; + word32 rSz; + unsigned char s[1]; + word32 sSz; + unsigned char rZero[] = { 0, 0, 0, 0 }; + unsigned char sOne[] = { 0, 0, 1 }; + unsigned char sigRaw[32]; + word32 sigRawSz; + unsigned char expSig[] = { 0x30, 0x06, 0x02, 0x01, 0x00, 0x02, 0x01, 0x01 }; + + sigRawSz = sizeof(sigRaw); + ret = wc_ecc_rs_raw_to_sig(rZero, sizeof(rZero), sOne, sizeof(sOne), + sigRaw, &sigRawSz); + if (ret != 0) { + return WC_TEST_RET_ENC_EC(ret); + } + if (sigRawSz != sizeof(expSig)) { + return WC_TEST_RET_ENC_EC((int)sigRawSz); + } + if (XMEMCMP(sigRaw, expSig, sizeof(expSig)) != 0) { + return WC_TEST_RET_ENC_NC; + } + + rSz = sizeof(r); + sSz = sizeof(s); + ret = wc_ecc_sig_to_rs(sigRaw, sigRawSz, r, &rSz, s, &sSz); + if (ret != 0) { + return WC_TEST_RET_ENC_EC(ret); + } + if (rSz != 1) { + return WC_TEST_RET_ENC_EC((int)rSz); + } + if (sSz != 1) { + return WC_TEST_RET_ENC_EC((int)sSz); + } + if (r[0] != 0) { + return WC_TEST_RET_ENC_EC(r[0]); + } + if (s[0] != 1) { + return WC_TEST_RET_ENC_EC(s[0]); + } + + return ret; +} +#endif + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ecc_test(void) +{ + wc_test_ret_t ret; WC_RNG rng; + WOLFSSL_ENTER("ecc_test"); +#if defined(ECC_MIN_KEY_SZ) + WOLFSSL_MSG_EX("ecc_test ECC_MIN_KEY_SZ = %d\n", ECC_MIN_KEY_SZ); +#else + WOLFSSL_MSG("ecc_test ECC_MIN_KEY_SZ not defined."); +#endif #if defined(WOLFSSL_CERT_EXT) && \ (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 @@ -27053,44 +33043,53 @@ #endif #if (defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 112 - ret = ecc_test_curve(&rng, 14); + ret = ecc_test_curve(&rng, 14, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=14, Default\n"); goto done; } #endif /* HAVE_ECC112 */ #if (defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 128 - ret = ecc_test_curve(&rng, 16); + ret = ecc_test_curve(&rng, 16, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=16, Default\n"); goto done; } #endif /* HAVE_ECC128 */ #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 - ret = ecc_test_curve(&rng, 20); + ret = ecc_test_curve(&rng, 20, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=20, Default\n"); goto done; } #endif /* HAVE_ECC160 */ #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 - ret = ecc_test_curve(&rng, 24); +#if !FIPS_VERSION3_GE(6,0,0) + ret = ecc_test_curve(&rng, 24, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=24, Default\n"); goto done; } +#endif #endif /* HAVE_ECC192 */ #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 - ret = ecc_test_curve(&rng, 28); + ret = ecc_test_curve(&rng, 28, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=28, Default\n"); goto done; } #endif /* HAVE_ECC224 */ #if (defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 239 - ret = ecc_test_curve(&rng, 30); + ret = ecc_test_curve(&rng, 30, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=30, Default\n"); goto done; } #endif /* HAVE_ECC239 */ #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 - ret = ecc_test_curve(&rng, 32); + ret = ecc_test_curve(&rng, 32, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=32, Default\n"); goto done; } #if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ @@ -27104,38 +33103,74 @@ #if !defined(NO_ECC_SECP) || defined(WOLFSSL_CUSTOM_CURVES) ret = ecc_def_curve_test(&rng); if (ret < 0) { + printf("Default\n"); goto done; } #endif #endif /* !NO_ECC256 */ #if (defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 320 - ret = ecc_test_curve(&rng, 40); + ret = ecc_test_curve(&rng, 40, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=40, Default\n"); goto done; } #endif /* HAVE_ECC320 */ #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 - ret = ecc_test_curve(&rng, 48); + ret = ecc_test_curve(&rng, 48, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=48, Default\n"); goto done; } #endif /* HAVE_ECC384 */ #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512 - ret = ecc_test_curve(&rng, 64); + ret = ecc_test_curve(&rng, 64, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=64, Default\n"); goto done; } #endif /* HAVE_ECC512 */ #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 - ret = ecc_test_curve(&rng, 66); + ret = ecc_test_curve(&rng, 66, ECC_CURVE_DEF); if (ret < 0) { + printf("keySize=66, Default\n"); goto done; } #endif /* HAVE_ECC521 */ +#ifdef WOLFSSL_SM2 + ret = ecc_test_curve(&rng, 32, ECC_SM2P256V1); + if (ret < 0) { + printf("SM2\n"); + goto done; + } +#endif + +#if !defined(NO_ASN) && !defined(HAVE_SELFTEST) && \ + (!defined(HAVE_FIPS) || (defined(HAVE_FIPS_VERSION) && \ + (HAVE_FIPS_VERSION > 2))) + ret = ecc_test_raw_enc_dec(); + if (ret != 0) { + printf("raw sig encode/decode\n"); + goto done; + } +#endif #if defined(WOLFSSL_CUSTOM_CURVES) ret = ecc_test_custom_curves(&rng); if (ret != 0) { + printf("Custom\n"); + goto done; + } +#endif + +#if defined(WOLFSSL_SM2) + ret = test_sm2_verify(); + if (ret != 0) { + printf("SM2 Verify\n"); + goto done; + } + ret = ecc_sm2_test_curve(&rng, ECC_TEST_VERIFY_COUNT); + if (ret != 0) { + printf("SM2 test\n"); goto done; } #endif @@ -27146,7 +33181,7 @@ #ifdef HAVE_ECC256 ret = ecc_test_deterministic_k(&rng); if (ret != 0) { - printf("ecc_test_deterministic_k failed! %d\n", ret); + printf("ecc_test_deterministic_k failed!\n"); goto done; } #endif @@ -27154,14 +33189,14 @@ #if defined(HAVE_ECC384) ret = ecc384_test_deterministic_k(&rng); if (ret != 0) { - printf("ecc384_test_deterministic_k failed! %d\n", ret); + printf("ecc384_test_deterministic_k failed!\n"); goto done; } #endif #if defined(HAVE_ECC521) ret = ecc521_test_deterministic_k(&rng); if (ret != 0) { - printf("ecc512_test_deterministic_k failed! %d\n", ret); + printf("ecc512_test_deterministic_k failed!\n"); goto done; } #endif @@ -27172,7 +33207,7 @@ !defined(WOLFSSL_KCAPI_ECC) ret = ecc_test_sign_vectors(&rng); if (ret != 0) { - printf("ecc_test_sign_vectors failed! %d\n", ret); + printf("ecc_test_sign_vectors failed!\n"); goto done; } #endif @@ -27180,7 +33215,7 @@ defined(HAVE_ECC_DHE) ret = ecc_test_cdh_vectors(&rng); if (ret != 0) { - printf("ecc_test_cdh_vectors failed! %d\n", ret); + printf("ecc_test_cdh_vectors failed!\n"); goto done; } #endif @@ -27189,7 +33224,7 @@ !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(NO_ECC_SECP) ret = ecc_test_make_pub(&rng); if (ret != 0) { - printf("ecc_test_make_pub failed!: %d\n", ret); + printf("ecc_test_make_pub failed!\n"); goto done; } #elif defined(HAVE_ECC_KEY_IMPORT) @@ -27198,7 +33233,7 @@ #if defined(WOLFSSL_CERT_GEN) && !defined(NO_ECC_SECP) && !defined(NO_ASN_TIME) ret = ecc_test_cert_gen(&rng); if (ret != 0) { - printf("ecc_test_cert_gen failed!: %d\n", ret); + printf("ecc_test_cert_gen failed!\n"); goto done; } #endif @@ -27207,7 +33242,7 @@ defined(WOLFSSL_CUSTOM_CURVES)) ret = ecc_test_allocator(&rng); if (ret != 0) { - printf("ecc_test_allocator failed!: %d\n", ret); + printf("ecc_test_allocator failed!\n"); goto done; } #endif @@ -27216,7 +33251,7 @@ defined(HAVE_ECC_SIGN) && defined(HAVE_ECC_VERIFY) ret = ecc_test_nonblock(&rng); if (ret != 0) { - printf("ecc_test_nonblock failed!: %d\n", ret); + printf("ecc_test_nonblock failed!\n"); goto done; } #endif @@ -27231,7 +33266,7 @@ (defined(WOLFSSL_AES_128) || defined(WOLFSSL_AES_256)) #if ((! defined(HAVE_FIPS)) || FIPS_VERSION_GE(5,3)) -static int ecc_ctx_kdf_salt_test(WC_RNG* rng, ecc_key* a, ecc_key* b) +static wc_test_ret_t ecc_ctx_kdf_salt_test(WC_RNG* rng, ecc_key* a, ecc_key* b) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) byte* plaintext; @@ -27246,7 +33281,7 @@ ecEncCtx* bCtx = NULL; static const byte salt[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; - int ret = 0; + wc_test_ret_t ret = 0; static const char message[] = "Hello wolfSSL!"; word32 plaintextLen; word32 encryptLen = 128; @@ -27353,9 +33388,9 @@ #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \ ECC_MIN_KEY_SZ <= 256 && defined(WOLFSSL_AES_128) -static int ecc_encrypt_kat(WC_RNG *rng) +static wc_test_ret_t ecc_encrypt_kat(WC_RNG *rng) { - int ret = 0; + wc_test_ret_t ret = 0; #ifdef WOLFSSL_ECIES_OLD #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key* userA = NULL; @@ -27591,10 +33626,10 @@ } #endif -static int ecc_encrypt_e2e_test(WC_RNG* rng, ecc_key* userA, ecc_key* userB, +static wc_test_ret_t ecc_encrypt_e2e_test(WC_RNG* rng, ecc_key* userA, ecc_key* userB, byte encAlgo, byte kdfAlgo, byte macAlgo) { - int ret = 0; + wc_test_ret_t ret = 0; byte msg[48]; byte plain[48]; #ifdef WOLFSSL_ECIES_OLD @@ -27862,10 +33897,10 @@ #endif /* !HAVE_FIPS || FIPS_VERSION_GE(5,3) */ -WOLFSSL_TEST_SUBROUTINE int ecc_encrypt_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ecc_encrypt_test(void) { WC_RNG rng; - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) ecc_key *userA; ecc_key *userB; @@ -27873,6 +33908,7 @@ ecc_key userA[1]; ecc_key userB[1]; #endif + WOLFSSL_ENTER("ecc_encrypt_test"); #ifndef HAVE_FIPS ret = wc_InitRng_ex(&rng, HEAP_HINT, devId); @@ -27942,6 +33978,22 @@ printf("ECIES: AES_128_CBC, HKDF_SHA256, HMAC_SHA256\n"); } } +#ifdef HAVE_X963_KDF + if (ret == 0) { + ret = ecc_encrypt_e2e_test(&rng, userA, userB, ecAES_128_CBC, + ecKDF_X963_SHA256, ecHMAC_SHA256); + if (ret != 0) { + printf("ECIES: AES_128_CBC, KDF_X963_SHA256, HMAC_SHA256\n"); + } + } + if (ret == 0) { + ret = ecc_encrypt_e2e_test(&rng, userA, userB, ecAES_128_CBC, + ecKDF_SHA256, ecHMAC_SHA256); + if (ret != 0) { + printf("ECIES: AES_128_CBC, KDF_SHA256, HMAC_SHA256\n"); + } + } +#endif #endif #ifdef WOLFSSL_AES_256 if (ret == 0) { @@ -28007,7 +34059,7 @@ !defined(WOLFSSL_ATECC608A) && !defined(NO_ECC256) && \ defined(HAVE_ECC_VERIFY) && defined(HAVE_ECC_SIGN) && \ !defined(WOLF_CRYPTO_CB_ONLY_ECC) && !defined(NO_ECC_SECP) -WOLFSSL_TEST_SUBROUTINE int ecc_test_buffers(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ecc_test_buffers(void) { size_t bytes; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -28021,7 +34073,7 @@ #endif WC_RNG rng; word32 idx = 0; - int ret; + wc_test_ret_t ret; /* pad our test message to 32 bytes so evenly divisible by AES_BLOCK_SZ */ byte in[] = "Everyone gets Friday off. ecc p"; word32 inLen = (word32)XSTRLEN((char*)in); @@ -28029,6 +34081,7 @@ byte plain[256]; int verify = 0; word32 x; + WOLFSSL_ENTER("ecc_test_buffers"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((cliKey == NULL) || (servKey == NULL) || (tmpKey == NULL)) @@ -28186,7 +34239,7 @@ #else #define X25519_TEST_CNT 1 #endif -static int curve25519_overflow_test(void) +static wc_test_ret_t curve25519_overflow_test(void) { /* secret key for party a */ byte sa[X25519_TEST_CNT][32] = { @@ -28297,7 +34350,7 @@ #endif }; - int ret = 0; + wc_test_ret_t ret = 0; int i; word32 y; byte shared[32]; @@ -28332,9 +34385,9 @@ * * returns 0 on success and -ve on failure. */ -static int curve25519_check_public_test(void) +static wc_test_ret_t curve25519_check_public_test(void) { - int ret; + wc_test_ret_t ret; /* Little-endian values that will fail */ byte fail_le[][CURVE25519_KEYSIZE] = { { @@ -28408,11 +34461,11 @@ for (i = 1; i < CURVE25519_KEYSIZE + 2; i++) { if (i == CURVE25519_KEYSIZE) continue; - if (wc_curve25519_check_public(good, i, EC25519_LITTLE_ENDIAN) != + if (wc_curve25519_check_public(good, (word32)i, EC25519_LITTLE_ENDIAN) != ECC_BAD_ARG_E) { return WC_TEST_RET_ENC_I(i); } - if (wc_curve25519_check_public(good, i, EC25519_BIG_ENDIAN) != + if (wc_curve25519_check_public(good, (word32)i, EC25519_BIG_ENDIAN) != ECC_BAD_ARG_E) { return WC_TEST_RET_ENC_I(i); } @@ -28452,9 +34505,9 @@ #if !defined(NO_ASN) && defined(HAVE_CURVE25519_KEY_EXPORT) && \ defined(HAVE_CURVE25519_KEY_IMPORT) -static int curve255519_der_test(void) +static wc_test_ret_t curve255519_der_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; /* certs/statickeys/x25519.der */ const byte kCurve25519PrivDer[] = { 0x30, 0x2E, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2B, 0x65, 0x6E, @@ -28490,7 +34543,7 @@ outputSz = (word32)sizeof(output); ret = wc_Curve25519PrivateKeyToDer(&key, output, outputSz); if (ret >= 0) { - outputSz = ret; + outputSz = (word32)ret; ret = 0; } else { @@ -28514,7 +34567,7 @@ outputSz = (word32)sizeof(output); ret = wc_Curve25519PublicKeyToDer(&key, output, outputSz, 1); if (ret >= 0) { - outputSz = ret; + outputSz = (word32)ret; ret = 0; } else { @@ -28532,10 +34585,10 @@ } #endif /* !NO_ASN && HAVE_CURVE25519_KEY_EXPORT && HAVE_CURVE25519_KEY_IMPORT */ -WOLFSSL_TEST_SUBROUTINE int curve25519_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t curve25519_test(void) { WC_RNG rng; - int ret; + wc_test_ret_t ret; #ifdef HAVE_CURVE25519_SHARED_SECRET byte sharedA[32]; byte sharedB[32]; @@ -28595,6 +34648,7 @@ #endif /* HAVE_CURVE25519_SHARED_SECRET */ (void)x; + WOLFSSL_ENTER("curve25519_test"); #ifndef HAVE_FIPS ret = wc_InitRng_ex(&rng, HEAP_HINT, devId); @@ -28621,13 +34675,13 @@ /* find shared secret key */ x = sizeof(sharedA); if ((ret = wc_curve25519_shared_secret(&userA, &userB, sharedA, &x)) != 0) { - printf("wc_curve25519_shared_secret 1 %d\n", ret); + printf("wc_curve25519_shared_secret 1 failed\n"); return WC_TEST_RET_ENC_EC(ret); } y = sizeof(sharedB); if ((ret = wc_curve25519_shared_secret(&userB, &userA, sharedB, &y)) != 0) { - printf("wc_curve25519_shared_secret 2 %d\n", ret); + printf("wc_curve25519_shared_secret 2 failed\n"); return WC_TEST_RET_ENC_EC(ret); } @@ -28755,7 +34809,7 @@ #ifdef HAVE_ED25519 #ifdef WOLFSSL_TEST_CERT -static int ed25519_test_cert(void) +static wc_test_ret_t ed25519_test_cert(void) { DecodedCert cert[2]; DecodedCert* serverCert = NULL; @@ -28765,7 +34819,7 @@ ed25519_key* pubKey = NULL; int verify; #endif /* HAVE_ED25519_VERIFY */ - int ret; + wc_test_ret_t ret; byte* tmp; size_t bytes; XFILE file; @@ -28853,14 +34907,14 @@ return ret; } -static int ed25519_test_make_cert(void) +static wc_test_ret_t ed25519_test_make_cert(void) { WC_RNG rng; Cert cert; DecodedCert decode; ed25519_key key; ed25519_key* privKey = NULL; - int ret = 0; + wc_test_ret_t ret = 0; byte* tmp = NULL; wc_InitCert_ex(&cert, HEAP_HINT, devId); @@ -28907,7 +34961,7 @@ if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); - InitDecodedCert(&decode, tmp, ret, HEAP_HINT); + InitDecodedCert(&decode, tmp, (word32)ret, HEAP_HINT); ret = ParseCert(&decode, CERT_TYPE, NO_VERIFY, 0); FreeDecodedCert(&decode); if (ret != 0) @@ -28922,11 +34976,93 @@ } #endif /* WOLFSSL_TEST_CERT */ +#if defined(HAVE_ED25519_KEY_IMPORT) +static wc_test_ret_t ed25519_test_check_key(void) +{ + /* Fails to find x-ordinate from this y-ordinate. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_bad_y[] = { + 0x40, + 0x02,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, + }; + /* Y-ordinate value larger than prime. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_bad_y_max[] = { + 0x40, + 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,0x7f, + }; + /* Y-ordinate value equal to prime. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_bad_y_is_p[] = { + 0x40, + 0xed,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,0x7f, + }; + /* Y-ordinate value equal to prime - 1. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_y_is_p_minus_1[] = { + 0x40, + 0xec,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,0x7f, + }; + ed25519_key key; + int ret; + int res = 0; + + /* Initialize key for use. */ + ret = wc_ed25519_init_ex(&key, HEAP_HINT, devId); + if (ret != 0) { + return WC_TEST_RET_ENC_NC; + } + + /* Load bad public key only and perform checks. */ + ret = wc_ed25519_import_public(key_bad_y, ED25519_PUB_KEY_SIZE + 1, &key); + if (ret != PUBLIC_KEY_E) { + res = WC_TEST_RET_ENC_NC; + } + if (res == 0) { + /* Load bad public key only and perform checks. */ + ret = wc_ed25519_import_public(key_bad_y_max, ED25519_PUB_KEY_SIZE + 1, + &key); + if (ret != PUBLIC_KEY_E) { + res = WC_TEST_RET_ENC_NC; + } + } + if (res == 0) { + /* Load bad public key only and perform checks. */ + ret = wc_ed25519_import_public(key_bad_y_is_p, ED25519_PUB_KEY_SIZE + 1, + &key); + if (ret != PUBLIC_KEY_E) { + res = WC_TEST_RET_ENC_NC; + } + } + if (res == 0) { + /* Load good public key only and perform checks. */ + ret = wc_ed25519_import_public(key_y_is_p_minus_1, + ED25519_PUB_KEY_SIZE + 1, &key); + if (ret != 0) { + res = WC_TEST_RET_ENC_NC; + } + } + + /* Dispose of key. */ + wc_ed25519_free(&key); + + return res; +} +#endif + #if defined(HAVE_ED25519_SIGN) && defined(HAVE_ED25519_KEY_EXPORT) && \ defined(HAVE_ED25519_KEY_IMPORT) -static int ed25519ctx_test(void) +static wc_test_ret_t ed25519ctx_test(void) { - int ret; + wc_test_ret_t ret; byte out[ED25519_SIG_SIZE]; word32 outlen; #ifdef HAVE_ED25519_VERIFY @@ -29024,9 +35160,9 @@ return ret; } -static int ed25519ph_test(void) +static wc_test_ret_t ed25519ph_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; byte out[ED25519_SIG_SIZE]; word32 outlen; #ifdef HAVE_ED25519_VERIFY @@ -29166,9 +35302,9 @@ } #endif /* HAVE_ED25519_SIGN && HAVE_ED25519_KEY_EXPORT && HAVE_ED25519_KEY_IMPORT */ -WOLFSSL_TEST_SUBROUTINE int ed25519_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed25519_test(void) { - int ret; + wc_test_ret_t ret; WC_RNG rng; #if defined(HAVE_ED25519_SIGN) && defined(HAVE_ED25519_KEY_EXPORT) &&\ defined(HAVE_ED25519_KEY_IMPORT) @@ -29510,7 +35646,7 @@ sizeof(msg4) }; #ifndef NO_ASN - static byte privateEd25519[] = { + static const byte privateEd25519[] = { 0x30,0x2e,0x02,0x01,0x00,0x30,0x05,0x06, 0x03,0x2b,0x65,0x70,0x04,0x22,0x04,0x20, 0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60, @@ -29518,7 +35654,7 @@ 0x44,0x49,0xc5,0x69,0x7b,0x32,0x69,0x19, 0x70,0x3b,0xac,0x03,0x1c,0xae,0x7f,0x60 }; - static byte badPrivateEd25519[] = { + static const byte badPrivateEd25519[] = { 0x30,0x52,0x02,0x01,0x00,0x30,0x05,0x06, 0x03,0x2b,0x65,0x70,0x04,0x22,0x04,0x20, 0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60, @@ -29532,7 +35668,7 @@ 0xf7,0x07,0x51,0x1a, 0x00 /* add additional bytes to make the pubkey bigger */ }; - static byte publicEd25519[] = { + static const byte publicEd25519[] = { 0x30,0x2a,0x30,0x05,0x06,0x03,0x2b,0x65, 0x70,0x03,0x21,0x00,0xd7,0x5a,0x98,0x01, 0x82,0xb1,0x0a,0xb7,0xd5,0x4b,0xfe,0xd3, @@ -29542,7 +35678,7 @@ }; /* size has been altered to catch if sanity check is done */ - static byte badPublicEd25519[] = { + static const byte badPublicEd25519[] = { 0x30,0x2a,0x30,0x05,0x06,0x03,0x2b,0x65, 0x70,0x03,0x21,0x00,0xd7,0x5a,0x98,0x01, 0x82,0xb1,0x0a,0xb7,0xd5,0x4b,0xfe,0xd3, @@ -29551,7 +35687,7 @@ 0xf7,0x07,0x51,0x1a, 0x00 /* add an additional byte to make the pubkey appear bigger */ }; - static byte privPubEd25519[] = { + static const byte privPubEd25519[] = { 0x30,0x50,0x02,0x01,0x00,0x30,0x05,0x06, 0x03,0x2b,0x65,0x70,0x04,0x22,0x04,0x20, 0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60, @@ -29571,6 +35707,7 @@ #if !defined(NO_ASN) && defined(HAVE_ED25519_SIGN) ed25519_key key3; #endif + WOLFSSL_ENTER("ed25519_test"); /* create ed25519 keys */ #ifndef HAVE_FIPS @@ -29586,12 +35723,14 @@ #if !defined(NO_ASN) && defined(HAVE_ED25519_SIGN) wc_ed25519_init_ex(&key3, HEAP_HINT, devId); #endif +#ifdef HAVE_ED25519_MAKE_KEY wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key); wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key2); +#endif /* helper functions for signature and key size */ - keySz = wc_ed25519_size(&key); - sigSz = wc_ed25519_sig_size(&key); + keySz = (word32)wc_ed25519_size(&key); + sigSz = (word32)wc_ed25519_sig_size(&key); #if defined(HAVE_ED25519_SIGN) && defined(HAVE_ED25519_KEY_EXPORT) &&\ defined(HAVE_ED25519_KEY_IMPORT) @@ -29668,6 +35807,79 @@ #endif /* HAVE_ED25519_VERIFY */ } + { + /* Run tests for some rare code paths */ + /* sig is exactly equal to the order */ + static const byte rareEd1[] = { + 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, + 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, + 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 + }; + /* sig is larger than the order before we get to the low part */ + static const byte rareEd2[] = { + 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, + 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, + 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10 + }; + /* sig is larger than the order in the low part */ + static const byte rareEd3[] = { + 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, + 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, + 0xd6, 0x9c, 0xf9, 0xa2, 0xde, 0xf9, 0xde, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 + }; + /* sig is smaller than the order */ + static const byte rareEd4[] = { + 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, + 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, + 0xd6, 0x9c, 0xf1, 0xa2, 0xde, 0xf9, 0xde, 0x14, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 + }; + + ret = wc_ed25519_import_private_key(sKeys[0], ED25519_KEY_SIZE, + pKeys[0], pKeySz[0], &key); + if (ret != 0) + return ret; + + ret = wc_ed25519_verify_msg(rareEd1, sizeof(rareEd1), msgs[0], msgSz[0], + &verify, &key); + if (ret != BAD_FUNC_ARG) + return ret; + + ret = wc_ed25519_verify_msg(rareEd2, sizeof(rareEd2), msgs[0], msgSz[0], + &verify, &key); + if (ret != BAD_FUNC_ARG) + return ret; + + ret = wc_ed25519_verify_msg(rareEd3, sizeof(rareEd3), msgs[0], msgSz[0], + &verify, &key); + if (ret != BAD_FUNC_ARG) + return ret; + + ret = wc_ed25519_verify_msg(rareEd4, sizeof(rareEd4), msgs[0], msgSz[0], + &verify, &key); + if (ret != SIG_VERIFY_E) + return ret; + } + ret = ed25519ctx_test(); if (ret != 0) return ret; @@ -29752,11 +35964,14 @@ (void)keySz; (void)sigSz; + ret = ed25519_test_check_key(); + if (ret < 0) + return ret; #ifdef WOLFSSL_TEST_CERT ret = ed25519_test_cert(); if (ret < 0) return ret; -#ifdef WOLFSSL_CERT_GEN +#if defined(WOLFSSL_CERT_GEN) && defined(HAVE_ED25519_MAKE_KEY) ret = ed25519_test_make_cert(); if (ret < 0) return ret; @@ -29774,7 +35989,7 @@ * * returns 0 on success and -ve on failure. */ -static int curve448_check_public_test(void) +static wc_test_ret_t curve448_check_public_test(void) { /* Little-endian values that will fail */ byte fail_le[][CURVE448_KEY_SIZE] = { @@ -29829,7 +36044,7 @@ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01 }; int i; - int ret; + wc_test_ret_t ret; /* Parameter checks */ /* NULL pointer */ @@ -29851,11 +36066,11 @@ for (i = 1; i < CURVE448_KEY_SIZE + 2; i++) { if (i == CURVE448_KEY_SIZE) continue; - if (wc_curve448_check_public(good, i, EC448_LITTLE_ENDIAN) != + if (wc_curve448_check_public(good, (word32)i, EC448_LITTLE_ENDIAN) != ECC_BAD_ARG_E) { return WC_TEST_RET_ENC_I(i); } - if (wc_curve448_check_public(good, i, EC448_BIG_ENDIAN) != + if (wc_curve448_check_public(good, (word32)i, EC448_BIG_ENDIAN) != ECC_BAD_ARG_E) { return WC_TEST_RET_ENC_I(i); } @@ -29890,10 +36105,10 @@ #endif /* HAVE_CURVE448_SHARED_SECRET && HAVE_CURVE448_KEY_IMPORT */ -WOLFSSL_TEST_SUBROUTINE int curve448_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t curve448_test(void) { WC_RNG rng; - int ret; + wc_test_ret_t ret; #ifdef HAVE_CURVE448_SHARED_SECRET byte sharedA[CURVE448_KEY_SIZE]; byte sharedB[CURVE448_KEY_SIZE]; @@ -29902,7 +36117,7 @@ #ifdef HAVE_CURVE448_KEY_EXPORT byte exportBuf[CURVE448_KEY_SIZE]; #endif - word32 x; + word32 x = 0; curve448_key userA, userB, pubKey; #if defined(HAVE_CURVE448_SHARED_SECRET) && \ @@ -29968,6 +36183,7 @@ #endif /* HAVE_CURVE448_SHARED_SECRET */ (void)x; + WOLFSSL_ENTER("curve448_test"); #ifndef HAVE_FIPS ret = wc_InitRng_ex(&rng, HEAP_HINT, devId); @@ -30109,7 +36325,7 @@ #ifdef HAVE_ED448 #ifdef WOLFSSL_TEST_CERT -static int ed448_test_cert(void) +static wc_test_ret_t ed448_test_cert(void) { DecodedCert cert[2]; DecodedCert* serverCert = NULL; @@ -30119,7 +36335,7 @@ ed448_key* pubKey = NULL; int verify; #endif /* HAVE_ED448_VERIFY */ - int ret; + wc_test_ret_t ret; byte* tmp; size_t bytes; XFILE file; @@ -30207,14 +36423,14 @@ return ret; } -static int ed448_test_make_cert(void) +static wc_test_ret_t ed448_test_make_cert(void) { WC_RNG rng; Cert cert; DecodedCert decode; ed448_key key; ed448_key* privKey = NULL; - int ret = 0; + wc_test_ret_t ret = 0; byte* tmp = NULL; wc_InitCert_ex(&cert, HEAP_HINT, devId); @@ -30261,7 +36477,7 @@ if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); - InitDecodedCert(&decode, tmp, ret, HEAP_HINT); + InitDecodedCert(&decode, tmp, (word32)ret, HEAP_HINT); ret = ParseCert(&decode, CERT_TYPE, NO_VERIFY, 0); FreeDecodedCert(&decode); if (ret != 0) @@ -30276,11 +36492,109 @@ } #endif /* WOLFSSL_TEST_CERT */ +#if defined(HAVE_ED448_KEY_IMPORT) +static wc_test_ret_t ed448_test_check_key(void) +{ + /* Fails to find x-ordinate from this y-ordinate. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_bad_y[] = { + 0x40, + 0x02,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00 + }; + /* Y-ordinate value larger than prime. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_bad_y_max[] = { + 0x40, + 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, + 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 + }; + /* Y-ordinate value equal to prime. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_bad_y_is_p[] = { + 0x40, + 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,0xfe,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 + }; + /* Y-ordinate value equal to prime - 1. */ + WOLFSSL_SMALL_STACK_STATIC const byte key_y_is_p_minus_1[] = { + 0x40, + 0xfe,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,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 + }; + ed448_key key; + int ret; + int res = 0; + + /* Initialize key for use. */ + ret = wc_ed448_init_ex(&key, HEAP_HINT, devId); + if (ret != 0) { + return WC_TEST_RET_ENC_NC; + } + + /* Load bad public key only and perform checks. */ + ret = wc_ed448_import_public(key_bad_y, ED448_PUB_KEY_SIZE + 1, &key); + if (ret != PUBLIC_KEY_E) { + res = WC_TEST_RET_ENC_NC; + } + if (ret == 0) { + /* Load bad public key only and perform checks. */ + ret = wc_ed448_import_public(key_bad_y_max, ED448_PUB_KEY_SIZE + 1, + &key); + if (ret != PUBLIC_KEY_E) { + res = WC_TEST_RET_ENC_NC; + } + } + if (res == 0) { + /* Load bad public key only and perform checks. */ + ret = wc_ed448_import_public(key_bad_y_is_p, ED448_PUB_KEY_SIZE + 1, + &key); + if (ret != PUBLIC_KEY_E) { + res = WC_TEST_RET_ENC_NC; + } + } + if (res == 0) { + /* Load good public key only and perform checks. */ + ret = wc_ed448_import_public(key_y_is_p_minus_1, ED448_PUB_KEY_SIZE + 1, + &key); + if (ret != 0) { + res = WC_TEST_RET_ENC_NC; + } + } + + /* Dispose of key. */ + wc_ed448_free(&key); + + return res; +} +#endif + #if defined(HAVE_ED448_SIGN) && defined(HAVE_ED448_KEY_EXPORT) && \ defined(HAVE_ED448_KEY_IMPORT) -static int ed448_ctx_test(void) +static wc_test_ret_t ed448_ctx_test(void) { - int ret; + wc_test_ret_t ret; byte out[ED448_SIG_SIZE]; word32 outlen; #ifdef HAVE_ED448_VERIFY @@ -30369,9 +36683,9 @@ return 0; } -static int ed448ph_test(void) +static wc_test_ret_t ed448ph_test(void) { - int ret; + wc_test_ret_t ret; byte out[ED448_SIG_SIZE]; word32 outlen; #ifdef HAVE_ED448_VERIFY @@ -30541,9 +36855,9 @@ } #endif /* HAVE_ED448_SIGN && HAVE_ED448_KEY_EXPORT && HAVE_ED448_KEY_IMPORT */ -WOLFSSL_TEST_SUBROUTINE int ed448_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed448_test(void) { - int ret; + wc_test_ret_t ret; WC_RNG rng; #if defined(HAVE_ED448_SIGN) && defined(HAVE_ED448_KEY_EXPORT) &&\ defined(HAVE_ED448_KEY_IMPORT) @@ -30827,7 +37141,7 @@ WOLFSSL_SMALL_STACK_STATIC const byte* sigs[] = {sig1, sig2, sig3, sig4, sig5, sig6}; #define SIGSZ sizeof(sig1) - PEDANTIC_EXTENSION WOLFSSL_SMALL_STACK_STATIC const byte msg1[] = { }; + PEDANTIC_EXTENSION WOLFSSL_SMALL_STACK_STATIC const byte msg1[] = { 0 }; WOLFSSL_SMALL_STACK_STATIC const byte msg2[] = { 0x03 }; WOLFSSL_SMALL_STACK_STATIC const byte msg3[] = { 0x64, 0xa6, 0x5f, 0x3c, 0xde, 0xdc, 0xdd, 0x66, 0x81, 0x1e, 0x29, 0x15 }; @@ -31026,6 +37340,7 @@ ed448_key key3[1]; #endif #endif + WOLFSSL_ENTER("ed448_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) key = (ed448_key *)XMALLOC(sizeof(*key), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -31065,8 +37380,8 @@ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); /* helper functions for signature and key size */ - keySz = wc_ed448_size(key); - sigSz = wc_ed448_sig_size(key); + keySz = (word32)wc_ed448_size(key); + sigSz = (word32)wc_ed448_sig_size(key); #if defined(HAVE_ED448_SIGN) && defined(HAVE_ED448_KEY_EXPORT) &&\ defined(HAVE_ED448_KEY_IMPORT) @@ -31273,6 +37588,9 @@ (void)keySz; (void)sigSz; + ret = ed448_test_check_key(); + if (ret < 0) + return ret; #ifdef WOLFSSL_TEST_CERT ret = ed448_test_cert(); if (ret < 0) @@ -31291,16 +37609,26 @@ #ifdef WOLFSSL_HAVE_KYBER #ifdef WOLFSSL_WC_KYBER /* OQS and PQM4 do not support KATs */ #ifdef WOLFSSL_KYBER512 -static int kyber512_kat(void) +static wc_test_ret_t kyber512_kat(void) { - KyberKey key; - int ret; + wc_test_ret_t ret; +#ifdef WOLFSSL_SMALL_STACK + KyberKey *key = NULL; + byte *priv = NULL; + byte *pub = NULL; + byte *ct = NULL; + byte *ss = NULL; + byte *ss_dec = NULL; +#else + KyberKey key[1]; byte priv[KYBER512_PRIVATE_KEY_SIZE]; byte pub[KYBER512_PUBLIC_KEY_SIZE]; byte ct[KYBER512_CIPHER_TEXT_SIZE]; byte ss[KYBER_SS_SZ]; byte ss_dec[KYBER_SS_SZ]; - const byte kyber512_rand[] = { +#endif + int key_inited = 0; + WOLFSSL_SMALL_STACK_STATIC const byte kyber512_rand[] = { 0x7c, 0x99, 0x35, 0xa0, 0xb0, 0x76, 0x94, 0xaa, 0x0c, 0x6d, 0x10, 0xe4, 0xdb, 0x6b, 0x1a, 0xdd, 0x2f, 0xd8, 0x1a, 0x25, 0xcc, 0xb1, 0x48, 0x03, @@ -31310,13 +37638,13 @@ 0x0E, 0x55, 0x60, 0x67, 0x40, 0x7D, 0x13, 0xDC, 0x90, 0xFA, 0x9E, 0x8B, 0x87, 0x2B, 0xFB, 0x8F }; - const byte kyber512enc_rand[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber512enc_rand[] = { 0x14, 0x7c, 0x03, 0xf7, 0xa5, 0xbe, 0xbb, 0xa4, 0x06, 0xc8, 0xfa, 0xe1, 0x87, 0x4d, 0x7f, 0x13, 0xc8, 0x0e, 0xfe, 0x79, 0xa3, 0xa9, 0xa8, 0x74, 0xcc, 0x09, 0xfe, 0x76, 0xf6, 0x99, 0x76, 0x15 }; - const byte kyber512_pk[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber512_pk[] = { 0x11, 0x5A, 0xCE, 0x0E, 0x64, 0x67, 0x7C, 0xBB, 0x7D, 0xCF, 0xC9, 0x3C, 0x16, 0xD3, 0xA3, 0x05, 0xF6, 0x76, 0x15, 0xA4, 0x88, 0xD7, 0x11, 0xAA, @@ -31418,7 +37746,7 @@ 0x89, 0x9D, 0x59, 0xA5, 0x43, 0xD8, 0x20, 0x8C, 0x54, 0xA3, 0x16, 0x65, 0x29, 0xB5, 0x39, 0x22 }; - const byte kyber512_sk[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber512_sk[] = { 0x6C, 0x89, 0x2B, 0x02, 0x97, 0xA9, 0xC7, 0x64, 0x14, 0x93, 0xF8, 0x7D, 0xAF, 0x35, 0x33, 0xEE, 0xD6, 0x1F, 0x07, 0xF4, 0x65, 0x20, 0x66, 0x33, @@ -31624,7 +37952,8 @@ 0x0E, 0x55, 0x60, 0x67, 0x40, 0x7D, 0x13, 0xDC, 0x90, 0xFA, 0x9E, 0x8B, 0x87, 0x2B, 0xFB, 0x8F }; - const byte kyber512_ct[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber512_ct[] = { +#ifndef WOLFSSL_ML_KEM 0xED, 0xF2, 0x41, 0x45, 0xE4, 0x3B, 0x4F, 0x6D, 0xC6, 0xBF, 0x83, 0x32, 0xF5, 0x4E, 0x02, 0xCA, 0xB0, 0x2D, 0xBF, 0x3B, 0x56, 0x05, 0xDD, 0xC9, @@ -31721,72 +38050,219 @@ 0x80, 0x5B, 0x9C, 0xFE, 0x8F, 0xE9, 0xB1, 0x23, 0x7C, 0x80, 0xF9, 0x67, 0x87, 0xCD, 0x92, 0x81, 0xCC, 0xF2, 0x70, 0xC1, 0xAF, 0xC0, 0x67, 0x0D +#else + 0x75, 0x49, 0x99, 0x8d, 0x46, 0x9e, 0x2e, 0x47, + 0x90, 0x02, 0x30, 0x5b, 0x09, 0xb4, 0x4d, 0xba, + 0xdb, 0xc2, 0x45, 0x7f, 0xfd, 0x31, 0x25, 0xf6, + 0xd3, 0x1b, 0x0f, 0x27, 0xb8, 0x03, 0xd5, 0x81, + 0x07, 0x1c, 0x1d, 0xc6, 0x18, 0x11, 0x96, 0xfe, + 0x76, 0xdf, 0x78, 0xde, 0x20, 0xdd, 0xa6, 0x09, + 0xcf, 0x1b, 0x7c, 0xb7, 0xa3, 0x52, 0xc4, 0xdd, + 0x9c, 0x2c, 0xfc, 0x18, 0x80, 0x1f, 0x03, 0x6f, + 0xe4, 0x0f, 0x8f, 0x7e, 0x6f, 0x3d, 0xd7, 0x3f, + 0x38, 0x71, 0x30, 0xbe, 0x38, 0x7b, 0x17, 0x13, + 0x41, 0x8f, 0x83, 0xd9, 0x3d, 0xc7, 0xf8, 0x07, + 0x4a, 0x03, 0x24, 0x55, 0xc4, 0x6f, 0x85, 0x7c, + 0x6b, 0x6b, 0x35, 0x42, 0x9c, 0x79, 0x00, 0x65, + 0x42, 0x0d, 0x74, 0x22, 0x52, 0xee, 0x53, 0xf5, + 0x3f, 0x6e, 0x64, 0xa9, 0xb7, 0x8a, 0x49, 0xbc, + 0x29, 0xb8, 0xce, 0x84, 0x83, 0x1a, 0x01, 0xc3, + 0x42, 0x9e, 0x34, 0x69, 0x60, 0xdc, 0x55, 0x95, + 0x26, 0xd9, 0x78, 0x53, 0xc3, 0x66, 0x31, 0xb4, + 0x77, 0x32, 0x85, 0xfa, 0xfe, 0x8e, 0x3c, 0xa4, + 0x25, 0x5a, 0x87, 0x23, 0xae, 0x4f, 0x02, 0xdd, + 0xd8, 0x5a, 0x47, 0x81, 0xb9, 0xf4, 0x18, 0x6d, + 0x67, 0xa8, 0x3b, 0x5d, 0x9e, 0xdd, 0xc3, 0xae, + 0x7c, 0xd4, 0x09, 0x6c, 0x33, 0xf4, 0xd9, 0x7f, + 0xe0, 0x20, 0x30, 0xec, 0xb6, 0xa1, 0xa8, 0xad, + 0x9b, 0x19, 0xd3, 0xeb, 0x32, 0xf1, 0xb8, 0xf2, + 0x71, 0xb3, 0x03, 0x53, 0xe9, 0xe1, 0x9d, 0xd1, + 0x83, 0xf0, 0x6b, 0x54, 0xc3, 0xcb, 0x02, 0xef, + 0x16, 0x62, 0x82, 0x75, 0x2a, 0xa1, 0x1c, 0x81, + 0x58, 0xe4, 0x8b, 0xbc, 0x68, 0x30, 0x17, 0x1c, + 0xa7, 0xdd, 0xb7, 0x5a, 0x35, 0xe4, 0x6c, 0x35, + 0x32, 0x1a, 0xbe, 0x6a, 0x74, 0x20, 0x32, 0xc7, + 0x72, 0xa1, 0x6b, 0x3d, 0x1c, 0xdd, 0xfc, 0x6f, + 0x28, 0x01, 0xe2, 0xb8, 0x17, 0x30, 0x2d, 0xbc, + 0x94, 0xf3, 0x33, 0xc0, 0xcb, 0x91, 0xe1, 0xce, + 0xbd, 0x5e, 0xc6, 0x1e, 0x49, 0xfa, 0x5a, 0x14, + 0xaa, 0xa3, 0x93, 0x75, 0x5f, 0xc3, 0xe6, 0xf4, + 0xb8, 0xc5, 0xc4, 0xfa, 0x4b, 0xaa, 0x07, 0xa0, + 0x8c, 0x4f, 0x33, 0x94, 0x62, 0x63, 0x58, 0xa1, + 0x5e, 0x69, 0x0e, 0xe1, 0xe4, 0x82, 0x9b, 0x11, + 0x1c, 0x17, 0x24, 0x1a, 0xee, 0x37, 0xd5, 0xc8, + 0x32, 0xf4, 0x84, 0x76, 0x88, 0xfe, 0x5b, 0x5d, + 0x1b, 0x19, 0xe8, 0xe0, 0x4d, 0x9d, 0x19, 0x37, + 0x00, 0x19, 0x87, 0xf3, 0xb4, 0xb8, 0x35, 0x49, + 0xc3, 0xe5, 0x30, 0xe4, 0x11, 0x9d, 0x16, 0x4b, + 0x20, 0xef, 0x9d, 0x3a, 0x72, 0xf7, 0x4c, 0x04, + 0x4a, 0x97, 0x45, 0x91, 0x22, 0x8b, 0x41, 0xe6, + 0x80, 0xec, 0x56, 0x40, 0xa9, 0x72, 0x34, 0xc2, + 0xc6, 0x01, 0x7c, 0x95, 0xe9, 0x1b, 0xe2, 0xbd, + 0x49, 0x85, 0x47, 0xd5, 0x7a, 0x52, 0x22, 0xb8, + 0x16, 0x2a, 0x35, 0x46, 0x65, 0x6d, 0x59, 0x98, + 0x0d, 0x51, 0xaf, 0x59, 0x5b, 0xf5, 0xf2, 0x3a, + 0x63, 0x2f, 0x6d, 0x85, 0x44, 0xb8, 0x10, 0x74, + 0xae, 0xd3, 0x4c, 0x03, 0x52, 0xba, 0x56, 0x0d, + 0xea, 0xfb, 0x07, 0x44, 0x1a, 0x55, 0xa9, 0x37, + 0x63, 0x42, 0xe5, 0x0a, 0x0e, 0xc2, 0x53, 0x72, + 0x28, 0x25, 0x5a, 0x4b, 0x5d, 0x03, 0xc9, 0x29, + 0x57, 0xf4, 0xea, 0x35, 0x07, 0xb4, 0xba, 0xad, + 0xce, 0x53, 0xcc, 0xdf, 0xb7, 0x36, 0x4f, 0xfc, + 0x18, 0x17, 0xb5, 0x8c, 0x50, 0xef, 0x28, 0xe3, + 0x22, 0xe1, 0xb9, 0x45, 0xe0, 0xeb, 0x9b, 0x12, + 0x33, 0x97, 0x5c, 0x30, 0xa5, 0x54, 0x53, 0x68, + 0x68, 0x27, 0x14, 0xbf, 0x50, 0x2b, 0x61, 0xe1, + 0xd0, 0x45, 0x7a, 0x97, 0x53, 0xe1, 0x0d, 0xe0, + 0xf1, 0xbf, 0x35, 0xec, 0x3a, 0x3f, 0x47, 0x0a, + 0x3c, 0x69, 0xcc, 0xb0, 0x4d, 0x2d, 0x98, 0xfa, + 0xb3, 0xa0, 0xb6, 0x72, 0x9a, 0x98, 0x75, 0xe1, + 0xdb, 0x53, 0x3c, 0x96, 0xb4, 0x1e, 0x3d, 0x98, + 0x62, 0x8a, 0x6f, 0x8c, 0xf6, 0x68, 0x40, 0x6c, + 0x5f, 0x03, 0x8e, 0x6b, 0x7b, 0x24, 0x2f, 0xdf, + 0x86, 0xa7, 0xf1, 0xe6, 0x97, 0xae, 0xb1, 0x36, + 0x11, 0x41, 0x67, 0xb1, 0x3f, 0x89, 0xf2, 0x31, + 0xbc, 0xec, 0x7a, 0x41, 0x66, 0xb3, 0x9e, 0xab, + 0x4a, 0x37, 0x09, 0x23, 0x78, 0x22, 0x05, 0x0c, + 0x49, 0xc9, 0x25, 0x95, 0xa2, 0x37, 0xf2, 0xeb, + 0x48, 0x3b, 0x9e, 0x1d, 0xd6, 0x12, 0x4b, 0xed, + 0x5e, 0xb9, 0xb7, 0xb5, 0x12, 0x12, 0x96, 0x37, + 0x6b, 0x7d, 0x20, 0x14, 0xa7, 0x75, 0x60, 0xca, + 0x65, 0x83, 0x3d, 0x8b, 0xeb, 0x4d, 0x6a, 0xe6, + 0x8e, 0xfd, 0x7a, 0x11, 0xac, 0xc7, 0xde, 0x87, + 0xd8, 0x2b, 0xe1, 0xad, 0x57, 0x3a, 0xe9, 0xf6, + 0xf0, 0x76, 0x6f, 0xd7, 0x86, 0x38, 0x7d, 0x1a, + 0x8c, 0x12, 0xd1, 0xc8, 0xa2, 0x96, 0xb4, 0xf7, + 0x26, 0x34, 0xf7, 0x05, 0x77, 0x68, 0x88, 0x48, + 0xe5, 0x76, 0x85, 0x1f, 0x13, 0xbe, 0x48, 0xdf, + 0x33, 0x5d, 0x4a, 0xcd, 0x89, 0x79, 0x3a, 0x6c, + 0x6c, 0x06, 0x55, 0xfc, 0x39, 0xbc, 0x9e, 0x1e, + 0x27, 0xb4, 0xa5, 0x00, 0xf7, 0x08, 0xcd, 0x4a, + 0x9f, 0x2e, 0xc6, 0x72, 0xba, 0x5b, 0xf8, 0xad, + 0x23, 0x99, 0x8d, 0x4c, 0x0c, 0x95, 0x8f, 0x29, + 0x0f, 0x2a, 0x6c, 0x4e, 0x6c, 0xd8, 0xc0, 0xcd, + 0xc8, 0x5f, 0x57, 0x16, 0xec, 0x98, 0xa4, 0xc8, + 0x99, 0x5d, 0x37, 0x8c, 0xc6, 0xe2, 0xa1, 0xe8, + 0xb8, 0x28, 0x00, 0xdd, 0xf0, 0x3b, 0x32, 0x26, + 0xa2, 0xe7, 0x81, 0x77, 0x71, 0xe5, 0x09, 0xb4, + 0x95, 0x5e, 0xe2, 0xbe, 0xd4, 0x21, 0x7b, 0xdf, + 0x06, 0x30, 0xb5, 0x84, 0x0f, 0x25, 0x24, 0xab +#endif }; - const byte kyber512_ss[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber512_ss[] = { +#ifndef WOLFSSL_ML_KEM 0x0A, 0x69, 0x25, 0x67, 0x6F, 0x24, 0xB2, 0x2C, 0x28, 0x6F, 0x4C, 0x81, 0xA4, 0x22, 0x4C, 0xEC, 0x50, 0x6C, 0x9B, 0x25, 0x7D, 0x48, 0x0E, 0x02, 0xE3, 0xB4, 0x9F, 0x44, 0xCA, 0xA3, 0x23, 0x7F +#else + 0xc6, 0x08, 0x77, 0x70, 0x86, 0xed, 0x9f, 0xfd, + 0xf9, 0x2c, 0xd4, 0xf1, 0xc9, 0x99, 0xae, 0xdd, + 0x0b, 0x42, 0xe5, 0xe8, 0xef, 0x67, 0x32, 0xf4, + 0x11, 0x12, 0x46, 0x48, 0x1e, 0x26, 0x04, 0x63 +#endif }; - ret = wc_KyberKey_Init(KYBER512, &key, HEAP_HINT, INVALID_DEVID); +#ifdef WOLFSSL_SMALL_STACK + key = (KyberKey *)XMALLOC(sizeof(KyberKey), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + priv = (byte *)XMALLOC(KYBER512_PRIVATE_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + pub = (byte *)XMALLOC(KYBER512_PUBLIC_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ct = (byte *)XMALLOC(KYBER512_CIPHER_TEXT_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss_dec = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + + if (! (key && priv && pub && ct && ss && ss_dec)) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); +#endif + + ret = wc_KyberKey_Init(KYBER512, key, HEAP_HINT, INVALID_DEVID); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + else + key_inited = 1; - ret = wc_KyberKey_MakeKeyWithRandom(&key, kyber512_rand, + ret = wc_KyberKey_MakeKeyWithRandom(key, kyber512_rand, sizeof(kyber512_rand)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - ret = wc_KyberKey_EncodePublicKey(&key, pub, sizeof(pub)); + ret = wc_KyberKey_EncodePublicKey(key, pub, KYBER512_PUBLIC_KEY_SIZE); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - ret = wc_KyberKey_EncodePrivateKey(&key, priv, sizeof(priv)); + ret = wc_KyberKey_EncodePrivateKey(key, priv, KYBER512_PRIVATE_KEY_SIZE); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(pub, kyber512_pk, sizeof(kyber512_pk)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(priv, kyber512_sk, sizeof(kyber512_sk)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - ret = wc_KyberKey_EncapsulateWithRandom(&key, ct, ss, kyber512enc_rand, + ret = wc_KyberKey_EncapsulateWithRandom(key, ct, ss, kyber512enc_rand, sizeof(kyber512enc_rand)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(ct, kyber512_ct, sizeof(kyber512_ct)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(ss, kyber512_ss, sizeof(kyber512_ss)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - ret = wc_KyberKey_Decapsulate(&key, ss_dec, ct, sizeof(kyber512_ct)); + ret = wc_KyberKey_Decapsulate(key, ss_dec, ct, sizeof(kyber512_ct)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(ss_dec, kyber512_ss, sizeof(kyber512_ss)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_KyberKey_Free(&key); +out: - return 0; + if (key_inited) + wc_KyberKey_Free(key); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ct, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss_dec, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; } #endif /* WOLFSSL_KYBER512 */ #ifdef WOLFSSL_KYBER768 -static int kyber768_kat(void) +static wc_test_ret_t kyber768_kat(void) { - KyberKey key; - int ret; + wc_test_ret_t ret; +#ifdef WOLFSSL_SMALL_STACK + KyberKey *key = NULL; + byte *priv = NULL; + byte *pub = NULL; + byte *ct = NULL; + byte *ss = NULL; + byte *ss_dec = NULL; +#else + KyberKey key[1]; byte priv[KYBER768_PRIVATE_KEY_SIZE]; byte pub[KYBER768_PUBLIC_KEY_SIZE]; byte ct[KYBER768_CIPHER_TEXT_SIZE]; byte ss[KYBER_SS_SZ]; byte ss_dec[KYBER_SS_SZ]; - const byte kyber768_rand[] = { +#endif + int key_inited = 0; + WOLFSSL_SMALL_STACK_STATIC const byte kyber768_rand[] = { 0x7c, 0x99, 0x35, 0xa0, 0xb0, 0x76, 0x94, 0xaa, 0x0c, 0x6d, 0x10, 0xe4, 0xdb, 0x6b, 0x1a, 0xdd, 0x2f, 0xd8, 0x1a, 0x25, 0xcc, 0xb1, 0x48, 0x03, @@ -31796,14 +38272,14 @@ 0x0E, 0x55, 0x60, 0x67, 0x40, 0x7D, 0x13, 0xDC, 0x90, 0xFA, 0x9E, 0x8B, 0x87, 0x2B, 0xFB, 0x8F }; - const byte kyber768enc_rand[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber768enc_rand[] = { 0x14, 0x7c, 0x03, 0xf7, 0xa5, 0xbe, 0xbb, 0xa4, 0x06, 0xc8, 0xfa, 0xe1, 0x87, 0x4d, 0x7f, 0x13, 0xc8, 0x0e, 0xfe, 0x79, 0xa3, 0xa9, 0xa8, 0x74, 0xcc, 0x09, 0xfe, 0x76, 0xf6, 0x99, 0x76, 0x15 }; - const byte kyber768_pk[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber768_pk[] = { 0xA7, 0x2C, 0x2D, 0x9C, 0x84, 0x3E, 0xE9, 0xF8, 0x31, 0x3E, 0xCC, 0x7F, 0x86, 0xD6, 0x29, 0x4D, 0x59, 0x15, 0x9D, 0x9A, 0x87, 0x9A, 0x54, 0x2E, @@ -31953,7 +38429,7 @@ 0x89, 0x9D, 0x59, 0xA5, 0x43, 0xD8, 0x20, 0x8C, 0x54, 0xA3, 0x16, 0x65, 0x29, 0xB5, 0x39, 0x22 }; - const byte kyber768_sk[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber768_sk[] = { 0x07, 0x63, 0x8F, 0xB6, 0x98, 0x68, 0xF3, 0xD3, 0x20, 0xE5, 0x86, 0x2B, 0xD9, 0x69, 0x33, 0xFE, 0xB3, 0x11, 0xB3, 0x62, 0x09, 0x3C, 0x9B, 0x5D, @@ -32255,7 +38731,8 @@ 0x0E, 0x55, 0x60, 0x67, 0x40, 0x7D, 0x13, 0xDC, 0x90, 0xFA, 0x9E, 0x8B, 0x87, 0x2B, 0xFB, 0x8F }; - const byte kyber768_ct[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber768_ct[] = { +#ifndef WOLFSSL_ML_KEM 0xB5, 0x2C, 0x56, 0xB9, 0x2A, 0x4B, 0x7C, 0xE9, 0xE4, 0xCB, 0x7C, 0x5B, 0x1B, 0x16, 0x31, 0x67, 0xA8, 0xA1, 0x67, 0x5B, 0x2F, 0xDE, 0xF8, 0x4A, @@ -32392,72 +38869,259 @@ 0x24, 0x62, 0xDC, 0x44, 0xD3, 0x49, 0x65, 0x10, 0x24, 0x82, 0xA8, 0xED, 0x9E, 0x4E, 0x96, 0x4D, 0x56, 0x83, 0xE5, 0xD4, 0x5D, 0x0C, 0x82, 0x69 +#else + 0xa4, 0x13, 0xbe, 0x81, 0x04, 0x72, 0x59, 0x20, + 0x24, 0x01, 0xee, 0x35, 0x98, 0x9d, 0x25, 0xa3, + 0x85, 0x6c, 0xd1, 0xc0, 0x26, 0x0c, 0xe2, 0x39, + 0x1d, 0xe3, 0x23, 0x73, 0x6b, 0x67, 0x8f, 0x32, + 0x80, 0x05, 0xc8, 0x21, 0xad, 0x09, 0x21, 0x80, + 0xb4, 0x49, 0x6f, 0x21, 0x29, 0x28, 0x0f, 0x4f, + 0x29, 0x94, 0x04, 0x36, 0x2b, 0x9d, 0x14, 0x19, + 0x48, 0xb6, 0xbb, 0x02, 0xac, 0xd5, 0x73, 0x65, + 0x59, 0xfc, 0x90, 0x39, 0x01, 0x8c, 0x96, 0x1d, + 0xdd, 0xd9, 0x4e, 0xe5, 0x59, 0x19, 0x84, 0x71, + 0xd4, 0xa0, 0x49, 0xe5, 0x47, 0xb5, 0x63, 0x6c, + 0xf8, 0xbb, 0xf7, 0xdb, 0x1a, 0x90, 0xc7, 0x2b, + 0x87, 0x09, 0x23, 0xdc, 0xd5, 0x4b, 0x14, 0x8c, + 0x60, 0xc9, 0xc8, 0xee, 0x60, 0x4d, 0x30, 0xee, + 0xbb, 0x69, 0x01, 0xe6, 0xdf, 0x25, 0x96, 0x12, + 0x18, 0x26, 0x05, 0x8d, 0x25, 0x02, 0x9a, 0xe3, + 0x99, 0xc9, 0x5f, 0x6a, 0xac, 0xba, 0xaf, 0xe3, + 0x4f, 0x11, 0x8d, 0xdb, 0xa7, 0xa6, 0x9d, 0x7c, + 0xd8, 0x99, 0xb5, 0xf4, 0xd5, 0x8d, 0x3d, 0xf2, + 0xa8, 0x89, 0xb0, 0x30, 0xce, 0x9a, 0x7e, 0xa6, + 0x44, 0x6d, 0x41, 0xa6, 0x0a, 0x17, 0x5f, 0x12, + 0x7d, 0xa9, 0x4c, 0x27, 0x6b, 0xaa, 0x1e, 0xdf, + 0xb3, 0x57, 0xd4, 0x1b, 0x28, 0x57, 0xad, 0x46, + 0x2c, 0x83, 0xd8, 0xff, 0x00, 0x23, 0x6d, 0x9b, + 0xac, 0x59, 0x32, 0x5e, 0x0c, 0x3b, 0xdd, 0xcb, + 0x37, 0xbf, 0xe0, 0xfd, 0xa4, 0xe1, 0x67, 0xfc, + 0xf6, 0xae, 0xc1, 0x49, 0xfe, 0x5f, 0x9f, 0x63, + 0x93, 0xfc, 0x47, 0x15, 0xc6, 0x99, 0x5d, 0x67, + 0xf2, 0xb4, 0xdd, 0xb0, 0xc7, 0x67, 0x8e, 0xe1, + 0x40, 0xbc, 0xfd, 0xd2, 0x36, 0x5e, 0x81, 0x22, + 0xca, 0x92, 0xcb, 0xba, 0x1a, 0xc7, 0x03, 0x35, + 0x7e, 0xdf, 0x15, 0x21, 0x0c, 0x68, 0x92, 0x66, + 0x9f, 0x1a, 0x2b, 0x88, 0xd7, 0x92, 0xbe, 0x7d, + 0x9a, 0xa5, 0x6c, 0x5e, 0x8d, 0xf7, 0x58, 0xab, + 0xb4, 0xbb, 0xae, 0x83, 0x14, 0x1d, 0x27, 0x59, + 0xdf, 0xc4, 0xea, 0x8f, 0x2c, 0xf0, 0x0d, 0xd8, + 0x6a, 0x73, 0x12, 0xfb, 0xae, 0xa9, 0xcf, 0xe6, + 0xd7, 0xfd, 0x3f, 0x13, 0xfc, 0x8c, 0xb7, 0x5d, + 0x25, 0x2c, 0xb3, 0xec, 0x7e, 0x7b, 0x37, 0xcd, + 0x81, 0xd8, 0x8f, 0x38, 0xae, 0x59, 0x3e, 0xde, + 0x6f, 0x8a, 0x81, 0xd5, 0x11, 0x83, 0xd7, 0xdc, + 0x7f, 0x57, 0xab, 0xb2, 0x1c, 0xe2, 0xc5, 0x93, + 0xdb, 0x72, 0xf0, 0xbf, 0x77, 0x9c, 0xcc, 0xc8, + 0x24, 0x20, 0xf5, 0x3c, 0x2f, 0xe3, 0x64, 0xb1, + 0xfd, 0x3c, 0xd2, 0xec, 0x54, 0xb9, 0x24, 0xa6, + 0x2a, 0xfa, 0x4c, 0x31, 0x95, 0x57, 0x8e, 0x48, + 0xaa, 0x5f, 0x50, 0x7e, 0x79, 0x28, 0xd7, 0x52, + 0x7d, 0x65, 0x77, 0xd3, 0xfc, 0xa8, 0x7e, 0x7b, + 0x7b, 0x19, 0xa8, 0x9f, 0x69, 0xf0, 0x01, 0x8e, + 0xeb, 0x36, 0x87, 0x1b, 0xaa, 0xdf, 0xcc, 0x70, + 0x94, 0xe3, 0x44, 0xfb, 0x36, 0x48, 0x1f, 0xb1, + 0x4a, 0x5c, 0x53, 0xc3, 0x08, 0x67, 0xcf, 0x1c, + 0x5c, 0x02, 0xcf, 0x62, 0x27, 0xf9, 0xaa, 0xe8, + 0xd8, 0xa1, 0x2b, 0x24, 0xc5, 0xac, 0x2b, 0x8e, + 0xb9, 0x12, 0xb8, 0x7d, 0xe8, 0x32, 0x54, 0x09, + 0xe4, 0x40, 0xa4, 0x7b, 0x5c, 0x74, 0x23, 0x71, + 0x79, 0xa6, 0xce, 0x55, 0x58, 0xee, 0x09, 0x10, + 0x1c, 0xa4, 0xe6, 0x45, 0xe2, 0x4b, 0xdc, 0x28, + 0x77, 0x87, 0x35, 0xab, 0xf9, 0x8b, 0x06, 0x88, + 0xf6, 0x28, 0x9d, 0x50, 0x32, 0x51, 0x58, 0x2a, + 0xab, 0x6e, 0x81, 0xce, 0xd0, 0x17, 0x98, 0x29, + 0xf7, 0x31, 0x17, 0x31, 0xd0, 0x61, 0x5d, 0x0a, + 0x0d, 0x95, 0x59, 0x78, 0xaa, 0xfb, 0xf8, 0xaa, + 0x44, 0x0a, 0x5c, 0x85, 0x87, 0x0c, 0x58, 0xb3, + 0xe5, 0xc1, 0xff, 0x92, 0x67, 0xf0, 0x94, 0xb7, + 0x42, 0xf5, 0x16, 0xe8, 0xe9, 0x75, 0x9d, 0x0f, + 0x88, 0x02, 0x1d, 0x99, 0xa7, 0xfd, 0x65, 0xbb, + 0xee, 0x80, 0x12, 0x17, 0x27, 0x66, 0x56, 0xd2, + 0x1f, 0x37, 0x34, 0xde, 0x0a, 0x55, 0x89, 0xb3, + 0x3f, 0xe9, 0x96, 0xec, 0xb9, 0x9c, 0x0d, 0x8a, + 0x52, 0xd5, 0x4b, 0x39, 0xdc, 0xfe, 0x70, 0x7f, + 0xc1, 0x1e, 0x35, 0x63, 0x8a, 0x69, 0xd9, 0x08, + 0xcc, 0xb0, 0xed, 0xac, 0xfb, 0x2a, 0xa4, 0x35, + 0xe3, 0xbe, 0xb9, 0x81, 0xd3, 0xfd, 0xef, 0x59, + 0xca, 0xde, 0x6f, 0x63, 0xcd, 0xa0, 0x56, 0xc5, + 0x26, 0xcd, 0xc5, 0x5b, 0x87, 0xa3, 0xef, 0x26, + 0x38, 0xbc, 0xae, 0xed, 0xf4, 0x06, 0x71, 0x10, + 0x53, 0xa0, 0x9d, 0x31, 0x06, 0x99, 0xdc, 0x8e, + 0x3d, 0x07, 0xac, 0xc1, 0x0e, 0x1e, 0xa8, 0xec, + 0x8d, 0x51, 0xab, 0x31, 0xc0, 0x4c, 0xa8, 0x8c, + 0x21, 0x77, 0xa5, 0x11, 0x93, 0xb4, 0x18, 0xcc, + 0xc4, 0xb2, 0x54, 0x8e, 0xcd, 0xa8, 0x61, 0x59, + 0x8f, 0xfa, 0xa8, 0xb1, 0x6e, 0xaf, 0x89, 0xd5, + 0x9c, 0x84, 0x03, 0xc3, 0x9c, 0x8d, 0x94, 0xc4, + 0x28, 0xcf, 0x19, 0x18, 0x0e, 0x14, 0x20, 0x28, + 0x7b, 0x45, 0x5f, 0xb6, 0xe4, 0xe5, 0xbf, 0xbd, + 0x38, 0x3a, 0xef, 0x18, 0xca, 0x99, 0xf8, 0x10, + 0xf6, 0xce, 0xa7, 0x03, 0xbe, 0x4b, 0x9b, 0xf0, + 0xcb, 0x6f, 0x0c, 0x53, 0x83, 0xe8, 0x3e, 0xd3, + 0xa7, 0x23, 0xa2, 0x7d, 0x8e, 0x39, 0x91, 0x06, + 0x76, 0x56, 0x72, 0x69, 0x25, 0xb2, 0x0f, 0xb7, + 0x35, 0xb1, 0x27, 0x52, 0xfa, 0xcf, 0x68, 0x4e, + 0x5c, 0x03, 0xdc, 0x5b, 0xe7, 0xa6, 0x3a, 0xf4, + 0xbd, 0x93, 0x07, 0x54, 0xfd, 0xb5, 0xf7, 0x49, + 0x30, 0x6c, 0x2c, 0xfa, 0x6e, 0x39, 0x89, 0x25, + 0xc3, 0x46, 0xd9, 0xd5, 0x72, 0x92, 0x4b, 0x15, + 0x3b, 0x76, 0x73, 0xb7, 0xa5, 0x02, 0x21, 0x40, + 0x26, 0x4f, 0xd5, 0xa0, 0xab, 0xe0, 0x0b, 0x5d, + 0x85, 0xc6, 0x86, 0xf2, 0x96, 0xfb, 0xc4, 0x9d, + 0xd3, 0x15, 0x5a, 0xd2, 0xf7, 0x48, 0x25, 0x55, + 0x06, 0x90, 0x9b, 0x35, 0x5c, 0x70, 0x60, 0xdd, + 0xed, 0x4d, 0xd2, 0xfa, 0x21, 0xc7, 0xbf, 0x68, + 0x12, 0x51, 0xe7, 0xd6, 0x32, 0x89, 0xe1, 0x5f, + 0x85, 0x85, 0x4a, 0x25, 0xb4, 0xfb, 0x08, 0x5e, + 0xf0, 0x3a, 0x03, 0xcd, 0x05, 0x0f, 0x4f, 0x50, + 0x21, 0xd1, 0x12, 0xf3, 0x29, 0x1a, 0x9f, 0xd6, + 0x0a, 0xd0, 0x1e, 0x0b, 0x57, 0x97, 0xe7, 0x8d, + 0x9b, 0x94, 0xbe, 0xfe, 0x97, 0x46, 0xd7, 0x54, + 0xe6, 0xce, 0x41, 0xda, 0x34, 0xc5, 0x7d, 0xa3, + 0xd7, 0xde, 0xda, 0x6b, 0x23, 0x30, 0x82, 0xc4, + 0x13, 0x76, 0x14, 0xe9, 0x64, 0xff, 0xf0, 0xe3, + 0x84, 0x72, 0xe3, 0x6e, 0x49, 0x5f, 0x54, 0xe2, + 0xd2, 0x37, 0x1a, 0x75, 0x81, 0xb6, 0x94, 0xcb, + 0x26, 0x3d, 0xdf, 0x80, 0xbd, 0xd4, 0x3f, 0x63, + 0x83, 0x57, 0x8b, 0x5e, 0x18, 0x24, 0x4a, 0x69, + 0xca, 0xc9, 0xcd, 0xab, 0xea, 0x3d, 0x05, 0x71, + 0x8f, 0x5c, 0x23, 0xb1, 0xd4, 0xce, 0x66, 0x84, + 0x45, 0x75, 0x97, 0xd0, 0x12, 0x84, 0xb3, 0x8b, + 0x9d, 0x3e, 0xb1, 0xeb, 0xa4, 0xf5, 0xbe, 0xff, + 0x99, 0x0b, 0xb7, 0x49, 0xf0, 0x96, 0xa3, 0x0f, + 0x1b, 0xde, 0x72, 0x4a, 0xde, 0x37, 0x89, 0xde, + 0x5e, 0xf1, 0x83, 0xa6, 0x01, 0x63, 0xe2, 0x8f, + 0x15, 0x84, 0x50, 0x09, 0x84, 0xca, 0x51, 0x53, + 0x55, 0x5c, 0x38, 0xc6, 0x16, 0x49, 0x68, 0x3a, + 0x72, 0x79, 0x21, 0xff, 0xcc, 0xe3, 0x00, 0x7c, + 0x26, 0x77, 0x83, 0xbd, 0xdb, 0xdb, 0x9d, 0xe4, + 0x88, 0x80, 0xc4, 0xe8, 0x45, 0x2d, 0xab, 0x29, + 0xe7, 0xc4, 0xf8, 0xd1, 0xd5, 0xdf, 0xd3, 0x03, + 0xa9, 0x08, 0xb1, 0xce, 0x08, 0xbe, 0x0b, 0x9f, + 0xae, 0x98, 0x89, 0x4d, 0xcb, 0x26, 0x92, 0xd0, + 0xb3, 0x2f, 0xa3, 0x9d, 0xa9, 0x8b, 0xd4, 0xff, + 0x0e, 0xa1, 0x0f, 0x0b, 0x43, 0x8a, 0x49, 0x71, + 0xa7, 0xfc, 0x47, 0x18, 0x2f, 0xbe, 0x52, 0xd6, + 0xde, 0x71, 0xfe, 0xe3, 0xe8, 0x24, 0xa3, 0x9f, + 0x19, 0xc2, 0x7f, 0x51, 0xae, 0xc6, 0xd9, 0x2b, + 0xc7, 0xf8, 0xb8, 0xf0, 0x71, 0x84, 0x7b, 0xca +#endif }; - const byte kyber768_ss[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber768_ss[] = { +#ifndef WOLFSSL_ML_KEM 0x91, 0x4C, 0xB6, 0x7F, 0xE5, 0xC3, 0x8E, 0x73, 0xBF, 0x74, 0x18, 0x1C, 0x0A, 0xC5, 0x04, 0x28, 0xDE, 0xDF, 0x77, 0x50, 0xA9, 0x80, 0x58, 0xF7, 0xD5, 0x36, 0x70, 0x87, 0x74, 0x53, 0x5B, 0x29 +#else + 0x72, 0x9f, 0xa0, 0x6a, 0xc9, 0x3c, 0x5e, 0xfd, + 0xfb, 0xf1, 0x27, 0x2a, 0x96, 0xce, 0xf1, 0x67, + 0xa3, 0x93, 0x94, 0x7a, 0xb7, 0xdc, 0x2d, 0x11, + 0xed, 0x7d, 0xe8, 0xac, 0x3c, 0x94, 0x7f, 0xa8 +#endif }; - ret = wc_KyberKey_Init(KYBER768, &key, HEAP_HINT, INVALID_DEVID); +#ifdef WOLFSSL_SMALL_STACK + key = (KyberKey *)XMALLOC(sizeof(KyberKey), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + priv = (byte *)XMALLOC(KYBER768_PRIVATE_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + pub = (byte *)XMALLOC(KYBER768_PUBLIC_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ct = (byte *)XMALLOC(KYBER768_CIPHER_TEXT_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss_dec = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + + if (! (key && priv && pub && ct && ss && ss_dec)) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); +#endif + + ret = wc_KyberKey_Init(KYBER768, key, HEAP_HINT, INVALID_DEVID); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + else + key_inited = 1; - ret = wc_KyberKey_MakeKeyWithRandom(&key, kyber768_rand, + ret = wc_KyberKey_MakeKeyWithRandom(key, kyber768_rand, sizeof(kyber768_rand)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - ret = wc_KyberKey_EncodePublicKey(&key, pub, sizeof(pub)); + ret = wc_KyberKey_EncodePublicKey(key, pub, KYBER768_PUBLIC_KEY_SIZE); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - ret = wc_KyberKey_EncodePrivateKey(&key, priv, sizeof(priv)); + ret = wc_KyberKey_EncodePrivateKey(key, priv, KYBER768_PRIVATE_KEY_SIZE); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(pub, kyber768_pk, sizeof(kyber768_pk)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(priv, kyber768_sk, sizeof(kyber768_sk)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - ret = wc_KyberKey_EncapsulateWithRandom(&key, ct, ss, kyber768enc_rand, + ret = wc_KyberKey_EncapsulateWithRandom(key, ct, ss, kyber768enc_rand, sizeof(kyber768enc_rand)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(ct, kyber768_ct, sizeof(kyber768_ct)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(ss, kyber768_ss, sizeof(kyber768_ss)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - ret = wc_KyberKey_Decapsulate(&key, ss_dec, ct, sizeof(kyber768_ct)); + ret = wc_KyberKey_Decapsulate(key, ss_dec, ct, sizeof(kyber768_ct)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(ss_dec, kyber768_ss, sizeof(kyber768_ss)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_KyberKey_Free(&key); +out: - return 0; + if (key_inited) + wc_KyberKey_Free(key); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ct, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss_dec, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; } #endif /* WOLFSSL_KYBER768 */ #ifdef WOLFSSL_KYBER1024 -static int kyber1024_kat(void) +static wc_test_ret_t kyber1024_kat(void) { - KyberKey key; - int ret; + wc_test_ret_t ret; +#ifdef WOLFSSL_SMALL_STACK + KyberKey *key = NULL; + byte *priv = NULL; + byte *pub = NULL; + byte *ct = NULL; + byte *ss = NULL; + byte *ss_dec = NULL; +#else + KyberKey key[1]; byte priv[KYBER1024_PRIVATE_KEY_SIZE]; byte pub[KYBER1024_PUBLIC_KEY_SIZE]; byte ct[KYBER1024_CIPHER_TEXT_SIZE]; byte ss[KYBER_SS_SZ]; byte ss_dec[KYBER_SS_SZ]; - const byte kyber1024_rand[] = { +#endif + int key_inited = 0; + WOLFSSL_SMALL_STACK_STATIC const byte kyber1024_rand[] = { 0x7c, 0x99, 0x35, 0xa0, 0xb0, 0x76, 0x94, 0xaa, 0x0c, 0x6d, 0x10, 0xe4, 0xdb, 0x6b, 0x1a, 0xdd, 0x2f, 0xd8, 0x1a, 0x25, 0xcc, 0xb1, 0x48, 0x03, @@ -32467,13 +39131,13 @@ 0x0E, 0x55, 0x60, 0x67, 0x40, 0x7D, 0x13, 0xDC, 0x90, 0xFA, 0x9E, 0x8B, 0x87, 0x2B, 0xFB, 0x8F }; - const byte kyber1024enc_rand[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber1024enc_rand[] = { 0x14, 0x7c, 0x03, 0xf7, 0xa5, 0xbe, 0xbb, 0xa4, 0x06, 0xc8, 0xfa, 0xe1, 0x87, 0x4d, 0x7f, 0x13, 0xc8, 0x0e, 0xfe, 0x79, 0xa3, 0xa9, 0xa8, 0x74, 0xcc, 0x09, 0xfe, 0x76, 0xf6, 0x99, 0x76, 0x15 }; - const byte kyber1024_pk[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber1024_pk[] = { 0xD2, 0x23, 0x02, 0xCB, 0xD3, 0x39, 0x9F, 0xAC, 0xC6, 0x30, 0x99, 0x1F, 0xC8, 0xF2, 0x8B, 0xDB, 0x43, 0x54, 0x76, 0x25, 0x41, 0x52, 0x76, 0x78, @@ -32671,7 +39335,7 @@ 0x89, 0x9D, 0x59, 0xA5, 0x43, 0xD8, 0x20, 0x8C, 0x54, 0xA3, 0x16, 0x65, 0x29, 0xB5, 0x39, 0x22 }; - const byte kyber1024_sk[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber1024_sk[] = { 0x07, 0x63, 0x8F, 0xB6, 0x98, 0x68, 0xF3, 0xD3, 0x20, 0xE5, 0x86, 0x2B, 0xD9, 0x69, 0x33, 0xFE, 0xB3, 0x11, 0xB3, 0x62, 0x09, 0x3C, 0x9B, 0x5D, @@ -33069,7 +39733,8 @@ 0x0E, 0x55, 0x60, 0x67, 0x40, 0x7D, 0x13, 0xDC, 0x90, 0xFA, 0x9E, 0x8B, 0x87, 0x2B, 0xFB, 0x8F }; - const byte kyber1024_ct[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber1024_ct[] = { +#ifndef WOLFSSL_ML_KEM 0xA6, 0xAF, 0x29, 0xD5, 0xF5, 0xB8, 0x0B, 0xD1, 0x30, 0xF5, 0x18, 0xBA, 0xDD, 0xD6, 0xC8, 0xF1, 0x75, 0x45, 0x41, 0x3D, 0x86, 0x0F, 0xB3, 0xDE, @@ -33266,68 +39931,315 @@ 0x93, 0x23, 0x93, 0x29, 0x98, 0xD5, 0x6E, 0xF4, 0x30, 0xC7, 0x3B, 0xC2, 0x4F, 0x5D, 0x95, 0xF7, 0x37, 0x85, 0x8D, 0xDC, 0x4F, 0x32, 0xC0, 0x13 +#else + 0xb1, 0x56, 0x96, 0xac, 0xab, 0xf3, 0xf5, 0xc7, + 0x1c, 0x09, 0x60, 0x5d, 0xf3, 0x50, 0xf9, 0x8e, + 0xf9, 0x89, 0x74, 0x74, 0xf2, 0x41, 0xc7, 0xf7, + 0xd1, 0x6f, 0x7a, 0x69, 0x60, 0x43, 0x58, 0x50, + 0x84, 0x58, 0x91, 0x6d, 0x2c, 0x85, 0x52, 0xc7, + 0x04, 0xcb, 0x6e, 0x0d, 0xa4, 0x30, 0x5a, 0x11, + 0x72, 0x0a, 0x2b, 0x59, 0xa6, 0xd8, 0x19, 0x0f, + 0xc3, 0xe3, 0x89, 0xe6, 0x55, 0x1e, 0x7c, 0x59, + 0x57, 0x8f, 0xe2, 0xb0, 0x5d, 0x75, 0x91, 0xba, + 0xb3, 0x26, 0xd8, 0x94, 0xe2, 0x36, 0x56, 0xc6, + 0xb5, 0xfe, 0x4b, 0x7a, 0xbd, 0x65, 0x05, 0xa8, + 0xc2, 0x6d, 0x1d, 0xf8, 0xb4, 0x4a, 0x0e, 0xd5, + 0x3a, 0xff, 0xff, 0x9a, 0x58, 0x5f, 0xce, 0x86, + 0xda, 0x3b, 0x3f, 0xf2, 0x2b, 0x1f, 0xda, 0xe2, + 0xf6, 0xd2, 0x55, 0xc2, 0x65, 0x35, 0xf6, 0x16, + 0x94, 0xd5, 0x04, 0x71, 0xf1, 0xd8, 0x4d, 0x17, + 0x67, 0x3e, 0x48, 0x1f, 0x4e, 0x82, 0x4c, 0x82, + 0x81, 0x0c, 0xe8, 0xf2, 0xec, 0xc9, 0xbb, 0x3f, + 0x5f, 0x07, 0xbf, 0x14, 0x30, 0xe7, 0xbf, 0xd9, + 0x9f, 0xb9, 0x8f, 0x3d, 0x2f, 0x94, 0x1e, 0xdf, + 0x64, 0x2d, 0x7b, 0x9e, 0x73, 0xbc, 0x15, 0x95, + 0xa0, 0x4c, 0xd9, 0x49, 0xfa, 0x76, 0x64, 0x68, + 0x48, 0x9f, 0x40, 0x2f, 0x92, 0x32, 0x5f, 0x6d, + 0x9e, 0xc5, 0xd6, 0x96, 0xe0, 0xfa, 0xc2, 0xc6, + 0xa3, 0x79, 0x83, 0xa6, 0x45, 0x13, 0x84, 0xce, + 0x9d, 0x9d, 0xe4, 0x48, 0xf1, 0x58, 0x74, 0xe5, + 0x30, 0x94, 0x3e, 0x8e, 0x0f, 0xe2, 0x99, 0x60, + 0x58, 0x7a, 0x89, 0xb8, 0x05, 0x2c, 0x9d, 0x0e, + 0x6b, 0x0e, 0xa5, 0xdb, 0xb7, 0x34, 0xd2, 0xa9, + 0xc0, 0x5c, 0xbb, 0x6d, 0x0c, 0x79, 0xf4, 0xa5, + 0x7d, 0xb5, 0xaf, 0xde, 0xd6, 0xa7, 0xdf, 0x0e, + 0xcf, 0x47, 0xb7, 0xa3, 0x1d, 0xea, 0xf3, 0x7d, + 0xfa, 0x1d, 0xc8, 0x97, 0x22, 0xa4, 0x7b, 0x40, + 0xb4, 0xa5, 0x0c, 0x7a, 0x2f, 0x32, 0xe8, 0xab, + 0x3d, 0xa9, 0x73, 0xaa, 0x68, 0x3c, 0x0a, 0x69, + 0x82, 0x94, 0xca, 0x3a, 0x04, 0x54, 0x83, 0x17, + 0x5d, 0x87, 0x78, 0x6b, 0x47, 0xf7, 0x8a, 0xb0, + 0x29, 0x5b, 0x82, 0x67, 0xed, 0xfe, 0xed, 0xa4, + 0x42, 0xc3, 0x51, 0xa3, 0x8e, 0x95, 0xcf, 0x43, + 0xb0, 0x83, 0x42, 0xc6, 0x7d, 0x0b, 0xc5, 0xdd, + 0x59, 0x74, 0xf6, 0xc5, 0xc0, 0x03, 0xea, 0x31, + 0xb5, 0x80, 0x4a, 0x31, 0x1c, 0x29, 0xeb, 0xa1, + 0x7b, 0xdb, 0x54, 0x7a, 0x62, 0x9e, 0xc8, 0x39, + 0x74, 0x04, 0x3b, 0xd0, 0x3a, 0x37, 0xd0, 0xec, + 0x7f, 0xf3, 0x9d, 0xe1, 0xdf, 0xb8, 0xe6, 0x32, + 0xa8, 0x6b, 0x26, 0x02, 0x1e, 0x75, 0x3e, 0x7d, + 0xc7, 0x31, 0xbc, 0x4e, 0xd7, 0xe7, 0xfe, 0xce, + 0x78, 0xb0, 0x7d, 0xff, 0x5e, 0x87, 0x75, 0xb2, + 0x22, 0x3e, 0x19, 0xdf, 0xb3, 0xa0, 0x6a, 0x18, + 0x65, 0xed, 0x4f, 0x08, 0xa8, 0x45, 0x44, 0x49, + 0x25, 0x04, 0xf2, 0x96, 0x2e, 0x00, 0x5f, 0xde, + 0x5d, 0xe6, 0xe4, 0xff, 0x48, 0x99, 0x4d, 0x4f, + 0xf8, 0x11, 0xce, 0x31, 0xe3, 0x90, 0x98, 0x03, + 0xc3, 0x53, 0x4c, 0x1c, 0x6c, 0x6d, 0xdc, 0x9e, + 0x1a, 0x43, 0xc8, 0x45, 0xe7, 0xe7, 0xe2, 0xa1, + 0x08, 0x11, 0x86, 0xbe, 0xde, 0x4b, 0x5b, 0xcf, + 0x1b, 0x80, 0xb1, 0x3d, 0x21, 0x8a, 0x4a, 0xb4, + 0x46, 0xf4, 0x79, 0xe3, 0x8c, 0x1d, 0xe4, 0xa5, + 0x94, 0xe0, 0xf2, 0x0c, 0xdc, 0x23, 0xa9, 0xea, + 0x58, 0x77, 0x8c, 0xb2, 0xfb, 0x10, 0x4f, 0x1d, + 0xc9, 0x1b, 0xa5, 0xc1, 0x7e, 0x74, 0x00, 0x4c, + 0x43, 0x0a, 0xab, 0x1a, 0x3d, 0x16, 0x79, 0xda, + 0xeb, 0x50, 0x82, 0xe5, 0x17, 0xaf, 0x6a, 0x4e, + 0x28, 0xf5, 0x64, 0x44, 0x1b, 0x73, 0x23, 0x5d, + 0x08, 0x4a, 0x58, 0x31, 0xcb, 0xb3, 0x94, 0xce, + 0xcd, 0x99, 0x7f, 0xe0, 0x8b, 0x1b, 0x4a, 0xa9, + 0x95, 0xbd, 0xd9, 0x72, 0x6c, 0x04, 0x61, 0x58, + 0x59, 0xff, 0xfd, 0x1c, 0x99, 0x06, 0xfb, 0x2d, + 0x04, 0x01, 0xed, 0x6f, 0x59, 0x1e, 0x13, 0xc6, + 0xe7, 0x9e, 0xc5, 0xe8, 0x62, 0x07, 0x9e, 0x6d, + 0xfd, 0x3c, 0xa6, 0x88, 0xfa, 0x5a, 0xc7, 0xf8, + 0xd2, 0x79, 0x07, 0x53, 0x05, 0x49, 0xac, 0x71, + 0xfd, 0xeb, 0x5f, 0x86, 0x9d, 0x2a, 0x9b, 0x23, + 0x5a, 0x0e, 0x54, 0xb3, 0xb8, 0x66, 0x02, 0x1d, + 0x6b, 0x5c, 0x98, 0xd1, 0xc6, 0xc0, 0xc0, 0x04, + 0x89, 0x99, 0x5e, 0x3c, 0x34, 0x96, 0xb6, 0x9c, + 0x76, 0x33, 0x8a, 0xc4, 0x22, 0xc9, 0xf9, 0x41, + 0x58, 0xed, 0x5c, 0xf9, 0xcc, 0x6b, 0xe9, 0x38, + 0x46, 0x03, 0x4d, 0x4b, 0xa5, 0x33, 0xa3, 0x42, + 0x2c, 0x29, 0xd6, 0x75, 0x40, 0x5a, 0xe8, 0x53, + 0xb8, 0x49, 0x7d, 0xc9, 0x12, 0xf4, 0xa8, 0x35, + 0x00, 0xc8, 0x9d, 0xb7, 0x6b, 0xcd, 0xd7, 0x04, + 0x6d, 0x98, 0x32, 0xfa, 0x3d, 0x2b, 0xf3, 0xd0, + 0x24, 0x65, 0xeb, 0xb4, 0x16, 0x80, 0x35, 0x11, + 0x8f, 0x08, 0x7d, 0xdd, 0x47, 0x64, 0x3d, 0x2d, + 0xb7, 0x1f, 0x47, 0x41, 0x9a, 0xed, 0x97, 0x3e, + 0xc4, 0x38, 0x48, 0x66, 0xd4, 0x5e, 0x1d, 0xf2, + 0x16, 0xed, 0xa5, 0xbf, 0x61, 0x33, 0xf8, 0x4a, + 0x32, 0x8c, 0x11, 0x29, 0x62, 0x1e, 0xc1, 0x50, + 0x1f, 0xc4, 0x6f, 0xe3, 0xed, 0xa4, 0x60, 0x68, + 0x0b, 0x39, 0x7a, 0x42, 0xa4, 0x36, 0x8e, 0xb3, + 0xdc, 0x88, 0x45, 0x1b, 0x2b, 0x61, 0x6e, 0xec, + 0x5f, 0x1e, 0xc0, 0x5e, 0x5b, 0xd2, 0x08, 0x4b, + 0x49, 0x45, 0xd2, 0x0e, 0xa8, 0x63, 0x0d, 0x81, + 0x49, 0x2c, 0x78, 0xcf, 0x06, 0xa7, 0x8e, 0xc5, + 0x08, 0xa0, 0xc5, 0x71, 0x3b, 0x48, 0x60, 0x21, + 0x64, 0x32, 0x66, 0xa6, 0x0d, 0x99, 0x74, 0x46, + 0x78, 0xe5, 0x98, 0xb1, 0x52, 0xcf, 0x18, 0x29, + 0x89, 0x7a, 0xf7, 0x20, 0xc1, 0x8e, 0xb6, 0x89, + 0x3d, 0x8b, 0x1f, 0x81, 0xc8, 0xbb, 0xc5, 0x5c, + 0x80, 0x47, 0x39, 0x1a, 0x90, 0x51, 0xa6, 0xd0, + 0xd6, 0x54, 0x71, 0x89, 0x1a, 0xc2, 0xdf, 0xd8, + 0xac, 0x98, 0x4a, 0xa7, 0xaf, 0xf3, 0x97, 0x44, + 0x92, 0xb7, 0x51, 0xfd, 0xc5, 0xde, 0xa1, 0x39, + 0x68, 0x86, 0xe8, 0xc9, 0x4b, 0x94, 0x48, 0xe1, + 0xee, 0x63, 0x3f, 0x6c, 0x21, 0x43, 0x55, 0x2e, + 0xb8, 0x49, 0xc6, 0xd7, 0xe7, 0x2b, 0x6a, 0x7c, + 0x81, 0x21, 0x46, 0x15, 0x44, 0x51, 0x5e, 0x34, + 0x6d, 0x69, 0x97, 0x31, 0x11, 0xc9, 0x24, 0xac, + 0xda, 0x06, 0x47, 0x0b, 0x5d, 0xf2, 0x32, 0x0e, + 0x06, 0xb8, 0xf1, 0xaf, 0xf4, 0x13, 0xf9, 0xe8, + 0x88, 0x43, 0x6c, 0x31, 0x37, 0x80, 0x25, 0xbe, + 0x66, 0x72, 0x6a, 0x0b, 0xa5, 0x59, 0x17, 0x7b, + 0x11, 0x37, 0xc4, 0x31, 0xcc, 0xe1, 0xa6, 0xfb, + 0x00, 0xde, 0x36, 0xc6, 0xaf, 0xce, 0x92, 0xf1, + 0x1b, 0xc7, 0x5a, 0x88, 0x5f, 0xbb, 0xd9, 0xb1, + 0x08, 0xe6, 0xea, 0xd4, 0x3f, 0xee, 0x47, 0xda, + 0x31, 0x12, 0x30, 0xf9, 0x22, 0xba, 0xb9, 0x3a, + 0x76, 0x77, 0x71, 0x1e, 0x97, 0xea, 0x41, 0x29, + 0x80, 0x2c, 0x5d, 0xff, 0x20, 0xd0, 0xd9, 0xdb, + 0x97, 0xf8, 0x82, 0xc6, 0x33, 0x79, 0xfc, 0x27, + 0xd0, 0x8a, 0x6f, 0xec, 0xc2, 0x88, 0xcc, 0x06, + 0xe2, 0x57, 0x65, 0x4b, 0x38, 0x8e, 0x50, 0x18, + 0x80, 0x1f, 0xf1, 0x9b, 0xac, 0x2c, 0x94, 0x87, + 0xa5, 0xf4, 0x7e, 0x07, 0x31, 0x01, 0xdd, 0x37, + 0xb1, 0x0d, 0x43, 0xc9, 0x35, 0x11, 0x9b, 0x6f, + 0x70, 0xed, 0xdf, 0x9b, 0xa5, 0x14, 0x9e, 0xd6, + 0x4e, 0x8c, 0x12, 0x9d, 0x97, 0x8c, 0xbf, 0x2c, + 0x1a, 0x30, 0x6f, 0x83, 0xa6, 0x34, 0x7b, 0xfc, + 0x44, 0x5e, 0x8f, 0xd6, 0x45, 0xab, 0x0e, 0x4b, + 0x2a, 0x93, 0x93, 0x28, 0xcb, 0x55, 0xa7, 0x95, + 0x1a, 0x3a, 0x93, 0x8a, 0x06, 0xae, 0xd2, 0x4e, + 0xf3, 0x25, 0x62, 0x14, 0x9c, 0x8b, 0x7f, 0x2d, + 0xad, 0xd7, 0x5d, 0x2d, 0xb3, 0x78, 0x2b, 0x64, + 0xf4, 0xcb, 0x1f, 0x56, 0xa0, 0x94, 0x52, 0x77, + 0xc9, 0xc5, 0xe1, 0x60, 0x5a, 0x0c, 0x0e, 0xb6, + 0x5d, 0x7f, 0xe3, 0x42, 0x1c, 0x90, 0x87, 0x4b, + 0xb9, 0xcc, 0xb9, 0x45, 0xea, 0x74, 0xc9, 0x97, + 0xec, 0xa7, 0x3c, 0x94, 0x05, 0x9b, 0x77, 0xc7, + 0xc3, 0xf0, 0x8d, 0xd6, 0xe5, 0xe4, 0x94, 0xe3, + 0xf2, 0x33, 0x99, 0xf2, 0xfc, 0xe0, 0x56, 0xe9, + 0xf1, 0x30, 0xfe, 0xb6, 0xce, 0xcb, 0xb3, 0xe8, + 0xde, 0xce, 0x49, 0xe5, 0x67, 0x37, 0x57, 0x51, + 0x57, 0x42, 0x09, 0x4a, 0xc3, 0x82, 0x56, 0x38, + 0x57, 0xb5, 0xd4, 0x12, 0xd7, 0x19, 0x1c, 0xdc, + 0x5d, 0xe0, 0x68, 0x1c, 0x72, 0xc5, 0xda, 0xf8, + 0x33, 0xbe, 0xed, 0xcd, 0x88, 0xe4, 0x01, 0x23, + 0xa6, 0x17, 0xd2, 0xbd, 0x0d, 0x75, 0x95, 0x91, + 0x6a, 0x68, 0x94, 0xb9, 0x26, 0x3b, 0x6e, 0xb9, + 0x1e, 0x23, 0x80, 0x15, 0x4e, 0x0c, 0xfc, 0x52, + 0x78, 0x42, 0x58, 0xcf, 0x73, 0x20, 0xc4, 0xf0, + 0x2e, 0xad, 0x0b, 0x44, 0x71, 0xea, 0x0d, 0xd0, + 0xab, 0xeb, 0x5e, 0x63, 0x62, 0x8f, 0x48, 0x36, + 0xa2, 0x3d, 0xb2, 0x69, 0xce, 0xe0, 0x9e, 0x46, + 0xf3, 0x5b, 0x9d, 0xe8, 0x7e, 0xcb, 0x04, 0x22, + 0xad, 0x8e, 0xc6, 0xcb, 0x60, 0xb7, 0x17, 0xee, + 0xc2, 0x12, 0x16, 0xf0, 0xb7, 0x91, 0xc8, 0x52, + 0xa9, 0xf8, 0xa4, 0xc2, 0x61, 0x67, 0xd7, 0x35, + 0x0e, 0x17, 0xfa, 0x3e, 0xc7, 0x45, 0xb4, 0x63, + 0x11, 0xa6, 0x71, 0xcb, 0x8d, 0x7f, 0x14, 0x88, + 0x5f, 0xf0, 0x1b, 0xab, 0x0e, 0xf4, 0x69, 0xd0, + 0x85, 0x0f, 0xe8, 0x07, 0xe7, 0x0d, 0x36, 0xa4, + 0xb7, 0x36, 0xb2, 0xc3, 0x2c, 0x67, 0x62, 0x58, + 0xae, 0x7d, 0x55, 0x3d, 0xca, 0xb8, 0xad, 0xe6, + 0x36, 0x8a, 0xa2, 0x31, 0x79, 0x77, 0x8a, 0xdd, + 0x21, 0x4d, 0xd9, 0x15, 0x4f, 0x51, 0x0f, 0x50, + 0xe5, 0x56, 0x0c, 0x65, 0xfc, 0xec, 0x35, 0xe8, + 0x78, 0x82, 0x53, 0x0e, 0xdc, 0x65, 0xbe, 0xe6, + 0x6b, 0x25, 0xa5, 0x35, 0xda, 0x21, 0x46, 0xe1, + 0x4f, 0x83, 0x90, 0xbc, 0xf5, 0x79, 0xc3, 0x37, + 0xba, 0xd9, 0x74, 0x57, 0x5d, 0x5f, 0x09, 0xa8, + 0x76, 0x88, 0x83, 0xf9, 0x39, 0x3a, 0x14, 0x41, + 0x71, 0xfe, 0xb3, 0xfc, 0x66, 0x3e, 0xee, 0xf1, + 0x38, 0xb2, 0x1b, 0xd5, 0x57, 0xab, 0xbb, 0xad, + 0x2c, 0x02, 0x24, 0x34, 0x1f, 0xab, 0xfb, 0x6c, + 0x6f, 0xde, 0xa6, 0xf3, 0xc2, 0x65, 0xe5, 0xd8, + 0xaf, 0x16, 0x9a, 0x96, 0x4a, 0x7a, 0x86, 0xa1, + 0xa0, 0xe2, 0x22, 0xdd, 0x63, 0x71, 0x38, 0x20, + 0x79, 0xf8, 0x38, 0x23, 0x4a, 0xea, 0x8f, 0xf6, + 0xe2, 0xb8, 0x94, 0xe0, 0x4a, 0x9a, 0x34, 0xcf, + 0xac, 0xab, 0x81, 0xb0, 0x70, 0x4b, 0x14, 0xd7, + 0xd1, 0x09, 0x94, 0x9c, 0x68, 0x64, 0x4c, 0x01, + 0x5b, 0xc2, 0xf2, 0x6a, 0x9c, 0x29, 0x42, 0x87, + 0xec, 0xf1, 0x52, 0xd8, 0x46, 0xf9, 0x14, 0xc0, + 0x74, 0x5c, 0xeb, 0x7e, 0xc3, 0xd3, 0x6a, 0xd9, + 0xd7, 0x23, 0xc1, 0x5f, 0x89, 0xe2, 0xd8, 0xfe, + 0x2c, 0x18, 0xe1, 0x11, 0x80, 0xd0, 0x70, 0x9d, + 0x70, 0x02, 0xa5, 0x0f, 0x87, 0xd1, 0xc7, 0x3d, + 0xbb, 0x61, 0x6f, 0xd8, 0xde, 0x30, 0x33, 0x9d, + 0x83, 0xda, 0x5a, 0x8e, 0xd5, 0x03, 0x21, 0xcc, + 0x12, 0xf9, 0x4d, 0xff, 0x84, 0xd9, 0xe5, 0x44, + 0xf1, 0x7e, 0xc3, 0x4a, 0x60, 0xeb, 0x41, 0x4b, + 0x28, 0x78, 0xcc, 0x1a, 0x05, 0xc2, 0x64, 0xa0, + 0x66, 0xdd, 0xd3, 0x7f, 0x0c, 0x50, 0x4f, 0x0e, + 0x6c, 0xcd, 0x0f, 0x31, 0x1e, 0xb5, 0x21, 0x2d, + 0xe3, 0x2e, 0x9d, 0x65, 0x51, 0x25, 0xe4, 0xf4 +#endif }; - const byte kyber1024_ss[] = { + WOLFSSL_SMALL_STACK_STATIC const byte kyber1024_ss[] = { +#ifndef WOLFSSL_ML_KEM 0xB1, 0x0F, 0x73, 0x94, 0x92, 0x6A, 0xD3, 0xB4, 0x9C, 0x5D, 0x62, 0xD5, 0xAE, 0xB5, 0x31, 0xD5, 0x75, 0x75, 0x38, 0xBC, 0xC0, 0xDA, 0x9E, 0x55, 0x0D, 0x43, 0x8F, 0x1B, 0x61, 0xBD, 0x74, 0x19 +#else + 0x63, 0xa1, 0x03, 0x90, 0x74, 0xf0, 0x1f, 0x26, + 0x51, 0x21, 0x3a, 0xd9, 0x35, 0x0d, 0x65, 0x61, + 0xcb, 0x03, 0xa6, 0x04, 0x00, 0xe7, 0x41, 0x18, + 0xbb, 0x44, 0x64, 0xd8, 0x7b, 0x9d, 0xb2, 0x05 +#endif }; - ret = wc_KyberKey_Init(KYBER1024, &key, HEAP_HINT, INVALID_DEVID); +#ifdef WOLFSSL_SMALL_STACK + key = (KyberKey *)XMALLOC(sizeof(KyberKey), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + priv = (byte *)XMALLOC(KYBER1024_PRIVATE_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + pub = (byte *)XMALLOC(KYBER1024_PUBLIC_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ct = (byte *)XMALLOC(KYBER1024_CIPHER_TEXT_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss_dec = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + + if (! (key && priv && pub && ct && ss && ss_dec)) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); +#endif + + ret = wc_KyberKey_Init(KYBER1024, key, HEAP_HINT, INVALID_DEVID); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + else + key_inited = 1; - ret = wc_KyberKey_MakeKeyWithRandom(&key, kyber1024_rand, + ret = wc_KyberKey_MakeKeyWithRandom(key, kyber1024_rand, sizeof(kyber1024_rand)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - ret = wc_KyberKey_EncodePublicKey(&key, pub, sizeof(pub)); + ret = wc_KyberKey_EncodePublicKey(key, pub, KYBER_MAX_PUBLIC_KEY_SIZE); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); - ret = wc_KyberKey_EncodePrivateKey(&key, priv, sizeof(priv)); + ret = wc_KyberKey_EncodePrivateKey(key, priv, KYBER_MAX_PRIVATE_KEY_SIZE); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(pub, kyber1024_pk, sizeof(kyber1024_pk)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(priv, kyber1024_sk, sizeof(kyber1024_sk)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - ret = wc_KyberKey_EncapsulateWithRandom(&key, ct, ss, kyber1024enc_rand, + ret = wc_KyberKey_EncapsulateWithRandom(key, ct, ss, kyber1024enc_rand, sizeof(kyber1024enc_rand)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(ct, kyber1024_ct, sizeof(kyber1024_ct)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); if (XMEMCMP(ss, kyber1024_ss, sizeof(kyber1024_ss)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - ret = wc_KyberKey_Decapsulate(&key, ss_dec, ct, sizeof(kyber1024_ct)); + ret = wc_KyberKey_Decapsulate(key, ss_dec, ct, sizeof(kyber1024_ct)); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(ss_dec, kyber1024_ss, sizeof(kyber1024_ss)) != 0) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); - wc_KyberKey_Free(&key); +out: - return 0; + if (key_inited) + wc_KyberKey_Free(key); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ct, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss_dec, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; } #endif /* WOLFSSL_KYBER1024 */ #endif /* WOLFSSL_WC_KYBER */ -WOLFSSL_TEST_SUBROUTINE int kyber_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t kyber_test(void) { - int ret; - KyberKey key; + wc_test_ret_t ret; WC_RNG rng; int i; +#ifdef WOLFSSL_SMALL_STACK + KyberKey *key = NULL; + byte *priv = NULL; + byte *pub = NULL; + byte *priv2 = NULL; + byte *pub2 = NULL; + byte *ct = NULL; + byte *ss = NULL; + byte *ss_dec = NULL; +#else + KyberKey key[1]; byte priv[KYBER_MAX_PRIVATE_KEY_SIZE]; byte pub[KYBER_MAX_PUBLIC_KEY_SIZE]; byte priv2[KYBER_MAX_PRIVATE_KEY_SIZE]; @@ -33335,7 +40247,9 @@ byte ct[KYBER_MAX_CIPHER_TEXT_SIZE]; byte ss[KYBER_SS_SZ]; byte ss_dec[KYBER_SS_SZ]; - int testData[][4] = { +#endif + int key_inited = 0; + static const int testData[][4] = { #ifdef WOLFSSL_KYBER512 { KYBER512, KYBER512_PRIVATE_KEY_SIZE, KYBER512_PUBLIC_KEY_SIZE, KYBER512_CIPHER_TEXT_SIZE }, @@ -33349,6 +40263,29 @@ KYBER1024_CIPHER_TEXT_SIZE }, #endif }; + WOLFSSL_ENTER("kyber_test"); + +#ifdef WOLFSSL_SMALL_STACK + key = (KyberKey *)XMALLOC(sizeof(KyberKey), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + priv = (byte *)XMALLOC(KYBER_MAX_PRIVATE_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + pub = (byte *)XMALLOC(KYBER_MAX_PUBLIC_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + priv2 = (byte *)XMALLOC(KYBER_MAX_PRIVATE_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + pub2 = (byte *)XMALLOC(KYBER_MAX_PUBLIC_KEY_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ct = (byte *)XMALLOC(KYBER_MAX_CIPHER_TEXT_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + ss_dec = (byte *)XMALLOC(KYBER_SS_SZ, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + + if (! (key && priv && pub && priv2 && pub2 && ct && ss && ss_dec)) + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); +#endif #ifndef HAVE_FIPS ret = wc_InitRng_ex(&rng, HEAP_HINT, INVALID_DEVID); @@ -33356,67 +40293,67 @@ ret = wc_InitRng(&rng); #endif if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); for (i = 0; i < (int)(sizeof(testData) / sizeof(*testData)); i++) { - ret = wc_KyberKey_Init(testData[i][0], &key, HEAP_HINT, INVALID_DEVID); + ret = wc_KyberKey_Init(testData[i][0], key, HEAP_HINT, INVALID_DEVID); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); + else + key_inited = 1; - ret = wc_KyberKey_MakeKey(&key, &rng); + ret = wc_KyberKey_MakeKey(key, &rng); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_EncodePublicKey(&key, pub, testData[i][2]); + ret = wc_KyberKey_EncodePublicKey(key, pub, testData[i][2]); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_EncodePrivateKey(&key, priv, testData[i][1]); + ret = wc_KyberKey_EncodePrivateKey(key, priv, testData[i][1]); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_Init(testData[i][0], &key, HEAP_HINT, INVALID_DEVID); + ret = wc_KyberKey_Init(testData[i][0], key, HEAP_HINT, INVALID_DEVID); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_DecodePublicKey(&key, pub, testData[i][2]); + ret = wc_KyberKey_DecodePublicKey(key, pub, testData[i][2]); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_Encapsulate(&key, ct, ss, &rng); + ret = wc_KyberKey_Encapsulate(key, ct, ss, &rng); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_EncodePublicKey(&key, pub2, testData[i][2]); + ret = wc_KyberKey_EncodePublicKey(key, pub2, testData[i][2]); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); if (XMEMCMP(pub, pub2, testData[i][2]) != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_Init(testData[i][0], &key, HEAP_HINT, INVALID_DEVID); + ret = wc_KyberKey_Init(testData[i][0], key, HEAP_HINT, INVALID_DEVID); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_DecodePrivateKey(&key, priv, testData[i][1]); + ret = wc_KyberKey_DecodePrivateKey(key, priv, testData[i][1]); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_Decapsulate(&key, ss_dec, ct, testData[i][3]); + ret = wc_KyberKey_Decapsulate(key, ss_dec, ct, testData[i][3]); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - if (XMEMCMP(ss, ss_dec, sizeof(ss)) != 0) - return WC_TEST_RET_ENC_I(i); + if (XMEMCMP(ss, ss_dec, KYBER_SS_SZ) != 0) + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); - ret = wc_KyberKey_EncodePrivateKey(&key, priv2, testData[i][1]); + ret = wc_KyberKey_EncodePrivateKey(key, priv2, testData[i][1]); if (ret != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); if (XMEMCMP(priv, priv2, testData[i][2]) != 0) - return WC_TEST_RET_ENC_I(i); - - wc_KyberKey_Free(&key); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); } wc_FreeRng(&rng); @@ -33425,33 +40362,3052 @@ #ifdef WOLFSSL_KYBER512 ret = kyber512_kat(); if (ret != 0) - return ret; + goto out; #endif #ifdef WOLFSSL_KYBER768 ret = kyber768_kat(); if (ret != 0) - return ret; + goto out; #endif #ifdef WOLFSSL_KYBER1024 ret = kyber1024_kat(); if (ret != 0) - return ret; + goto out; #endif #endif /* WOLFSSL_WC_KYBER */ - return 0; +out: + + if (key_inited) + wc_KyberKey_Free(key); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(priv2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(pub2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ct, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(ss_dec, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; } #endif /* WOLFSSL_HAVE_KYBER */ +#ifdef HAVE_DILITHIUM +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY +static wc_test_ret_t dilithium_param_vfy_test(int param, const byte* pubKey, + word32 pubKeyLen, const byte* sig, word32 sigLen) +{ + byte msg[512]; + dilithium_key* key; + wc_test_ret_t ret; + int i; + int res = 0; + + key = (dilithium_key*)XMALLOC(sizeof(*key), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (key == NULL) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); + } + + /* make dummy msg */ + for (i = 0; i < (int)sizeof(msg); i++) { + msg[i] = (byte)i; + } + + ret = wc_dilithium_init(key); + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + return ret; + } + + ret = wc_dilithium_set_level(key, param); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_dilithium_import_public(pubKey, pubKeyLen, key); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_dilithium_verify_msg(sig, sigLen, msg, (word32)sizeof(msg), &res, + key); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (res != 1) + ERROR_OUT(WC_TEST_RET_ENC_EC(res), out); +out: + wc_dilithium_free(key); + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + return ret; +} + +#ifndef WOLFSSL_NO_ML_DSA_44 +static wc_test_ret_t dilithium_param_44_vfy_test(void) +{ + WOLFSSL_SMALL_STACK_STATIC const byte ml_dsa_44_pub_key[] = { + 0xea, 0x05, 0x24, 0x0d, 0x80, 0x72, 0x25, 0x55, 0xf4, 0x5b, + 0xc2, 0x13, 0x8b, 0x87, 0x5d, 0x31, 0x99, 0x2f, 0x1d, 0xa9, + 0x41, 0x09, 0x05, 0x76, 0xa7, 0xb7, 0x5e, 0x8c, 0x44, 0xe2, + 0x64, 0x79, 0xa0, 0xec, 0x1f, 0x24, 0xb6, 0xc8, 0x05, 0x5b, + 0xc1, 0x18, 0xb0, 0xb7, 0xcf, 0x8c, 0x60, 0x67, 0x6b, 0x81, + 0x44, 0x27, 0xb6, 0x0e, 0xfd, 0x9b, 0xc3, 0xcb, 0x52, 0x31, + 0xfa, 0xc9, 0x34, 0x8d, 0x22, 0x1e, 0x07, 0x9d, 0x96, 0x6a, + 0x63, 0x83, 0x5c, 0xd7, 0x83, 0x2d, 0x7f, 0x48, 0x64, 0x79, + 0xca, 0xb4, 0x9f, 0xa2, 0x02, 0xb7, 0x86, 0x1d, 0x0e, 0xc7, + 0xf9, 0x6c, 0x07, 0xc0, 0x35, 0x6a, 0x34, 0x79, 0x7c, 0xb8, + 0x0f, 0xed, 0x98, 0x50, 0xfb, 0x51, 0xe0, 0x36, 0x44, 0x4c, + 0xc6, 0x35, 0xa2, 0xbb, 0x55, 0xb0, 0x5c, 0x39, 0x08, 0x02, + 0x20, 0x35, 0x5c, 0x56, 0x6d, 0x2e, 0xb9, 0xef, 0x21, 0x26, + 0x87, 0x87, 0x85, 0x8a, 0x32, 0xb5, 0xa7, 0x68, 0x70, 0x3a, + 0xfd, 0x0d, 0x21, 0x48, 0x91, 0xa3, 0x29, 0xc1, 0x2a, 0x38, + 0xe5, 0x26, 0x31, 0x1f, 0x42, 0xde, 0x0b, 0x25, 0xff, 0x1d, + 0x6b, 0xb4, 0xe0, 0x5d, 0x2d, 0xcf, 0x44, 0xd5, 0x7d, 0xc4, + 0xf6, 0x95, 0xf2, 0x06, 0x4f, 0x83, 0x88, 0x9d, 0x1e, 0xeb, + 0x1c, 0x09, 0x45, 0x62, 0x67, 0x3d, 0xff, 0x51, 0x47, 0xe8, + 0xbc, 0x9b, 0x03, 0x1f, 0xc7, 0x72, 0x65, 0xce, 0xa8, 0x8c, + 0xc2, 0xa0, 0xc2, 0xbd, 0x5b, 0x7c, 0x17, 0x16, 0x8b, 0x72, + 0xfa, 0xb1, 0xbd, 0xdf, 0x49, 0xd6, 0xa1, 0x00, 0x65, 0xbe, + 0x82, 0xe7, 0x68, 0xc7, 0xe7, 0xbc, 0xc2, 0xa4, 0xdb, 0xaa, + 0xcc, 0xea, 0x41, 0x52, 0x7f, 0x56, 0xb4, 0x68, 0x1f, 0x92, + 0x96, 0x0f, 0xce, 0xd4, 0xd0, 0x87, 0x4c, 0x4a, 0x73, 0xb5, + 0x6c, 0xd4, 0x69, 0x55, 0x15, 0x47, 0xdc, 0x94, 0x7f, 0xd2, + 0x54, 0x5e, 0xb2, 0x90, 0xc2, 0x47, 0xe4, 0xf5, 0xde, 0x8b, + 0x9b, 0xc6, 0x5d, 0x50, 0x95, 0x60, 0xe0, 0xf0, 0xa7, 0x4e, + 0xe0, 0xcd, 0x41, 0x09, 0xef, 0xb3, 0x3d, 0x90, 0x5c, 0x77, + 0x54, 0xec, 0x9e, 0x5d, 0x8a, 0xe7, 0x09, 0x5c, 0xc9, 0x58, + 0x0c, 0xd0, 0x42, 0x35, 0xd2, 0x14, 0x59, 0x38, 0x69, 0xad, + 0xf9, 0xb5, 0xbf, 0x8a, 0x8e, 0x33, 0xd8, 0x5e, 0x7a, 0x55, + 0xd0, 0x53, 0x15, 0x40, 0x4e, 0xc5, 0x86, 0xd7, 0x8f, 0x5f, + 0x2f, 0x55, 0x82, 0xc2, 0x4f, 0x16, 0xe5, 0xea, 0x1c, 0xbc, + 0xff, 0x5e, 0x1f, 0x39, 0x46, 0x70, 0x54, 0x7a, 0x3a, 0x27, + 0x16, 0x1a, 0x2b, 0x6c, 0xd2, 0xb7, 0x80, 0xd3, 0xd1, 0x9d, + 0x25, 0x59, 0xed, 0xe6, 0x51, 0xb1, 0xf2, 0xad, 0x7e, 0x51, + 0x78, 0x14, 0x2b, 0x19, 0xae, 0x64, 0x72, 0x0f, 0xd8, 0x18, + 0x79, 0x8e, 0x66, 0x88, 0xd3, 0xa4, 0xa3, 0xc3, 0x76, 0x21, + 0xcb, 0xe4, 0x79, 0x5e, 0x95, 0x74, 0xe3, 0x31, 0x18, 0x79, + 0xed, 0xc7, 0xe7, 0xfb, 0x86, 0x48, 0x1b, 0x7b, 0x75, 0x5b, + 0x7f, 0x7c, 0x82, 0xc5, 0xab, 0x11, 0xb4, 0x5d, 0x59, 0x6f, + 0x78, 0xb2, 0xa5, 0x39, 0xc6, 0x63, 0x38, 0x6c, 0xeb, 0x50, + 0x06, 0x14, 0x76, 0xf0, 0xe8, 0xfb, 0x11, 0x95, 0x1f, 0x9d, + 0x9c, 0xa6, 0xe1, 0xe2, 0x0d, 0xa3, 0x66, 0xfc, 0x20, 0x83, + 0x50, 0x0e, 0x53, 0x75, 0xb5, 0x12, 0xf4, 0xdf, 0x31, 0x46, + 0x83, 0xac, 0x5b, 0xf3, 0x99, 0xa6, 0xd1, 0x7b, 0x2b, 0xc5, + 0xdc, 0x71, 0x07, 0x27, 0x33, 0x35, 0x34, 0xf5, 0x30, 0x19, + 0xc1, 0x3b, 0xba, 0x8a, 0xaf, 0x7e, 0x49, 0x93, 0x48, 0x5b, + 0x38, 0xc0, 0xbc, 0x2e, 0xc7, 0x59, 0x1b, 0xd9, 0xf5, 0xcc, + 0x86, 0xf5, 0x7b, 0x4d, 0xd7, 0x39, 0xa7, 0xa2, 0x56, 0x20, + 0x48, 0x98, 0x7d, 0x4f, 0x75, 0x56, 0x9b, 0xb8, 0x95, 0x45, + 0x17, 0xf3, 0x86, 0x3d, 0x97, 0x0a, 0x49, 0x1b, 0xca, 0xff, + 0x20, 0xc0, 0x24, 0x2c, 0x51, 0xc2, 0x0a, 0x3c, 0xbf, 0x07, + 0x60, 0x1c, 0x88, 0x85, 0x9b, 0x85, 0x2d, 0x4a, 0xfe, 0x5a, + 0x1c, 0x90, 0xf5, 0x90, 0x12, 0xd3, 0x03, 0x3c, 0x8c, 0x2e, + 0x95, 0x4a, 0x47, 0x76, 0x0f, 0x1f, 0x5d, 0x9e, 0xed, 0xc5, + 0x64, 0xc4, 0x9b, 0xbf, 0x86, 0xc5, 0x63, 0x84, 0x33, 0x00, + 0xf1, 0x26, 0x18, 0x21, 0xf3, 0x88, 0x1a, 0x08, 0x18, 0x6d, + 0x2f, 0xef, 0xd5, 0xeb, 0x2f, 0x69, 0xc8, 0x6e, 0x92, 0x34, + 0xfc, 0x72, 0x3d, 0x9a, 0xa7, 0x9e, 0x51, 0xfb, 0x56, 0xe3, + 0xdc, 0xf4, 0x8f, 0x9b, 0x6d, 0x0d, 0x2a, 0xec, 0x66, 0x12, + 0x26, 0x35, 0xbd, 0x61, 0xc2, 0x67, 0x19, 0xf5, 0x7e, 0xa1, + 0x67, 0xa2, 0x9c, 0x3b, 0x67, 0xb0, 0xc2, 0x51, 0x6a, 0x37, + 0x7c, 0x48, 0xe9, 0x4b, 0xb9, 0xa3, 0x38, 0x2f, 0xfc, 0xde, + 0xb4, 0x7c, 0xda, 0x52, 0x84, 0x0b, 0xb0, 0xd9, 0x08, 0xe9, + 0x7a, 0x4a, 0x6f, 0x79, 0x29, 0x3d, 0xc4, 0x5c, 0x78, 0xee, + 0x63, 0xb6, 0x96, 0x68, 0xd9, 0x82, 0x4e, 0xc1, 0x1b, 0x6f, + 0x52, 0xf5, 0xb3, 0xfb, 0xe8, 0xc4, 0x2a, 0x07, 0xc6, 0x3b, + 0x85, 0x0d, 0xf4, 0xbf, 0xb0, 0x6b, 0xfb, 0xce, 0x1d, 0xb4, + 0xbf, 0x63, 0x0b, 0x91, 0x67, 0xc4, 0xa3, 0x06, 0xa4, 0xaf, + 0x6c, 0xd3, 0xe5, 0x8b, 0x87, 0x4e, 0x64, 0x9c, 0xb1, 0xf3, + 0x70, 0x7c, 0x68, 0x43, 0x46, 0x13, 0x46, 0xee, 0x27, 0x75, + 0x12, 0x45, 0x42, 0xde, 0xa5, 0x8d, 0xcf, 0xf7, 0x09, 0x87, + 0xa8, 0x80, 0x3d, 0xb6, 0x45, 0xee, 0x41, 0x2d, 0x7c, 0x45, + 0x01, 0x9d, 0xaa, 0x78, 0xa8, 0x10, 0xa4, 0xfd, 0xb5, 0x5f, + 0xee, 0x0f, 0x77, 0xba, 0x73, 0xff, 0x49, 0xdc, 0xfa, 0x39, + 0xd6, 0xa3, 0x6f, 0x25, 0xb9, 0x63, 0x2c, 0x92, 0xc5, 0xdf, + 0xfb, 0xba, 0x89, 0xf9, 0xfa, 0x94, 0x5b, 0x6f, 0x5a, 0x4d, + 0x1c, 0xe4, 0xc9, 0x10, 0xf9, 0xa0, 0xe8, 0xc4, 0xcb, 0x55, + 0x1a, 0xdb, 0x56, 0x5f, 0x8e, 0x91, 0x03, 0x23, 0xca, 0xb0, + 0x1f, 0xef, 0xb8, 0x6c, 0x13, 0x5a, 0x99, 0x25, 0xf0, 0x49, + 0xa9, 0x5a, 0x45, 0xf7, 0xfd, 0x1a, 0xc2, 0x71, 0x06, 0xe3, + 0x2d, 0x25, 0x64, 0xb0, 0x52, 0x12, 0x03, 0x62, 0xc7, 0xb6, + 0xf9, 0xdc, 0x1f, 0x78, 0xff, 0x8b, 0xfa, 0xde, 0x7f, 0x71, + 0xa6, 0x35, 0x3e, 0xac, 0x20, 0x54, 0x94, 0xa7, 0x2e, 0x9d, + 0x47, 0x17, 0x4b, 0xad, 0x92, 0xb3, 0x14, 0x26, 0x8c, 0x5a, + 0xd0, 0x16, 0x4b, 0x22, 0xe9, 0x0c, 0x79, 0x6b, 0x8e, 0xac, + 0x0d, 0x12, 0xf5, 0x66, 0x8e, 0x82, 0x1a, 0x44, 0xf3, 0xe9, + 0x56, 0x5a, 0xcd, 0x1c, 0x1b, 0x81, 0x7b, 0x63, 0x59, 0xfe, + 0xc8, 0xc0, 0xe3, 0xda, 0x16, 0x6b, 0x6f, 0x0d, 0xba, 0x0e, + 0x47, 0x12, 0x86, 0x9e, 0xf0, 0x3b, 0x4d, 0x87, 0x3b, 0xf2, + 0x75, 0x73, 0x2d, 0xdf, 0xca, 0x76, 0x0b, 0xbd, 0xe7, 0xb7, + 0x74, 0x24, 0xf3, 0xc6, 0xe6, 0x75, 0x3f, 0x8b, 0x6a, 0xd9, + 0xad, 0xed, 0xc0, 0x70, 0x04, 0x1e, 0x0b, 0x8e, 0x8b, 0x7f, + 0xea, 0xbc, 0x39, 0x6b, 0x8a, 0x44, 0xa6, 0x9a, 0x2d, 0x0d, + 0x8c, 0x21, 0x60, 0x09, 0xd2, 0x4a, 0xe0, 0x62, 0xcf, 0xfa, + 0xe8, 0x9b, 0x35, 0x6f, 0x23, 0x2f, 0xb5, 0x65, 0x08, 0x60, + 0x92, 0x15, 0xd0, 0x5b, 0x63, 0xcc, 0x65, 0x05, 0xd1, 0xef, + 0x0f, 0x7e, 0x1b, 0xb3, 0x8e, 0xc6, 0x12, 0x85, 0xc9, 0x82, + 0x53, 0x79, 0x2e, 0x80, 0x5f, 0x0c, 0x7b, 0xc7, 0x1c, 0x83, + 0x41, 0x06, 0xd8, 0x41, 0xc9, 0xe7, 0xb9, 0x4b, 0xa1, 0x61, + 0xc6, 0x86, 0x67, 0xf5, 0x10, 0xf7, 0x34, 0x0d, 0x39, 0x9e, + 0x2b, 0x5f, 0x19, 0x06, 0x02, 0xa5, 0x02, 0x23, 0x71, 0xc2, + 0x12, 0x65, 0xcc, 0x81, 0x06, 0xfd, 0x8d, 0x09, 0x68, 0x37, + 0x06, 0x3b, 0xff, 0xc4, 0x24, 0xb3, 0x1f, 0xd6, 0xe6, 0x8f, + 0x9c, 0x74, 0x2c, 0x5e, 0xc5, 0xf4, 0xe9, 0xeb, 0xca, 0xd3, + 0x04, 0x5b, 0x92, 0x9e, 0x5c, 0x1a, 0x1d, 0xa1, 0xa7, 0x34, + 0xd2, 0x05, 0xae, 0xdb, 0x3d, 0x71, 0x10, 0x6e, 0x30, 0xd9, + 0xa3, 0x44, 0xa0, 0xbd, 0x9e, 0x7b, 0xb5, 0x12, 0x8a, 0x12, + 0x07, 0x60, 0xd7, 0x1f, 0x92, 0xe6, 0xfe, 0x04, 0xa9, 0x3e, + 0x62, 0x64, 0x00, 0x5f, 0x7c, 0x7b, 0x34, 0x09, 0xeb, 0x4a, + 0x18, 0x9e, 0x77, 0x72, 0x3a, 0x31, 0x1a, 0x62, 0x2a, 0xb5, + 0xcb, 0x4e, 0x53, 0xce, 0xad, 0x8b, 0x5a, 0x20, 0x4f, 0xd7, + 0x3e, 0x16, 0xf8, 0x10, 0xe2, 0xae, 0xbd, 0x3f, 0x02, 0xa9, + 0x18, 0xa0, 0x01, 0x18, 0x84, 0x95, 0x22, 0x2e, 0x93, 0x76, + 0x44, 0x4e, 0x11, 0x7b, 0x03, 0x51, 0x50, 0x19, 0x79, 0xe7, + 0xbb, 0x5c, 0x7b, 0xca, 0x74, 0xb4, 0x25, 0x26, 0xdb, 0x66, + 0xaa, 0x0b, 0x21, 0x07, 0xfb, 0x7a, 0x96, 0x10, 0x7d, 0x99, + 0xa9, 0x16, 0xcb, 0x0e, 0xba, 0x63, 0xab, 0x95, 0xfc, 0x5a, + 0xbe, 0xa6, 0x7f, 0xd8, 0xb4, 0xcd, 0x7c, 0xc5, 0xd0, 0xb1, + 0x1b, 0x48, 0x40, 0xfb, 0xe6, 0x2f, 0x2b, 0x94, 0xfe, 0x68, + 0xa2, 0xc4, 0x36, 0xd9, 0xcd, 0xc1, 0x93, 0x6d, 0xef, 0x39, + 0x5e, 0x43, 0x30, 0x5a, 0x2e, 0x66, 0xb6, 0xf2, 0xed, 0x9a, + 0x8d, 0x12, 0xdf, 0x5c, 0xae, 0xad, 0x16, 0x12, 0x7e, 0x81, + 0x82, 0x91, 0x7d, 0x2b, 0x12, 0xe9, 0x96, 0xb8, 0xb7, 0x42, + 0xcb, 0x1f, 0xf8, 0xd1, 0xfd, 0x83, 0x7a, 0xe4, 0x36, 0x1d, + 0x04, 0x27, 0x4c, 0xe5, 0xbd, 0x75, 0x24, 0xf7, 0xbd, 0xb6, + 0x6a, 0x68, 0x4e, 0x2c, 0x1b, 0x56, 0x3e, 0x60, 0xa4, 0x42, + 0xca, 0x7a, 0x54, 0xe5, 0x06, 0xe3, 0xda, 0x05, 0xf7, 0x77, + 0x36, 0x8b, 0x81, 0x26, 0x99, 0x92, 0x42, 0xda, 0x45, 0xb1, + 0xfe, 0x4b, + }; + WOLFSSL_SMALL_STACK_STATIC const byte ml_dsa_44_sig[] = { + 0x5e, 0xc1, 0xce, 0x0e, 0x31, 0xea, 0x10, 0x52, 0xa3, 0x7a, + 0xfe, 0x4d, 0xac, 0x07, 0x89, 0x5a, 0x45, 0xbd, 0x5a, 0xe5, + 0x22, 0xed, 0x98, 0x4d, 0x2f, 0xc8, 0x27, 0x00, 0x99, 0x40, + 0x00, 0x79, 0xcd, 0x93, 0x27, 0xd0, 0x40, 0x33, 0x79, 0x4f, + 0xe5, 0x16, 0x89, 0x9f, 0xbd, 0xa6, 0x3f, 0xdd, 0x68, 0x74, + 0x73, 0xc3, 0x97, 0x54, 0x11, 0x1d, 0xc8, 0xb8, 0xc8, 0xfd, + 0x3a, 0xbe, 0xca, 0x17, 0x0f, 0x10, 0x6d, 0x89, 0x6d, 0xe0, + 0xb2, 0xff, 0x3b, 0xe5, 0xa1, 0x75, 0xea, 0x35, 0x16, 0xa3, + 0x0c, 0x6e, 0x4a, 0x7b, 0xdb, 0x28, 0xc6, 0x2a, 0x76, 0x0e, + 0x78, 0x78, 0xa0, 0x4f, 0x4e, 0xf8, 0x99, 0xff, 0xe7, 0x47, + 0x7e, 0xc4, 0x62, 0xa7, 0xb4, 0xb9, 0x2b, 0xc1, 0xc7, 0xd0, + 0x00, 0xb6, 0xaa, 0xa7, 0x37, 0xd5, 0x1e, 0x19, 0xc4, 0xc4, + 0x59, 0x2f, 0xa5, 0x09, 0xa3, 0xda, 0x5d, 0xd4, 0x48, 0x64, + 0x16, 0x0e, 0x92, 0xdf, 0x61, 0xb7, 0x25, 0x3b, 0x90, 0x5a, + 0x08, 0xb5, 0x88, 0xe8, 0x64, 0x80, 0x63, 0xee, 0xbf, 0x59, + 0x0f, 0x4a, 0x48, 0x1e, 0x77, 0xa9, 0x46, 0xc6, 0x9c, 0x0b, + 0x83, 0xad, 0xb5, 0xbf, 0xb5, 0x5b, 0x99, 0xf3, 0x55, 0xe8, + 0xe5, 0xe7, 0x5c, 0x12, 0xac, 0x06, 0x06, 0xe0, 0xc0, 0x32, + 0x5d, 0xb6, 0x9f, 0x2b, 0x8e, 0x19, 0x5c, 0x2a, 0x58, 0xbb, + 0x37, 0xf1, 0x68, 0x56, 0x8b, 0x74, 0x94, 0x58, 0x48, 0x28, + 0xee, 0xf7, 0x0a, 0x8f, 0xad, 0x43, 0x67, 0xe1, 0xa3, 0x8c, + 0x3b, 0x35, 0x48, 0xcc, 0x52, 0x14, 0x36, 0x99, 0x18, 0x71, + 0x1c, 0xb2, 0xfc, 0x82, 0xda, 0xac, 0xd5, 0x55, 0x0a, 0x77, + 0x44, 0x6a, 0x48, 0xed, 0xfc, 0x5a, 0x68, 0xa6, 0x4d, 0x65, + 0xe7, 0x30, 0xaa, 0x23, 0x66, 0x84, 0xdf, 0x83, 0xf1, 0x17, + 0x5c, 0x46, 0xfe, 0x63, 0xcb, 0xc3, 0x6e, 0x4e, 0x47, 0x8d, + 0x30, 0x48, 0x06, 0xda, 0x97, 0x6b, 0x04, 0x5d, 0x44, 0xf3, + 0xb7, 0x2a, 0x6d, 0x2b, 0xbb, 0xcd, 0x97, 0x4e, 0x26, 0x8e, + 0xc9, 0x03, 0x0b, 0x5d, 0x68, 0xed, 0x81, 0xf7, 0x19, 0x61, + 0x81, 0xe9, 0xac, 0x3a, 0x35, 0xcd, 0xe8, 0xfd, 0x99, 0xdb, + 0x89, 0x83, 0x7d, 0x23, 0x6a, 0xc1, 0xc1, 0x10, 0xe9, 0xd3, + 0xfa, 0x9e, 0x5a, 0xcd, 0x73, 0xa3, 0x0a, 0x37, 0xa3, 0x12, + 0xef, 0x72, 0xa2, 0x28, 0xd4, 0x3d, 0x67, 0x53, 0x24, 0x0d, + 0x61, 0x98, 0xbb, 0x07, 0xf3, 0xa7, 0x79, 0x22, 0x74, 0x57, + 0x99, 0xe8, 0x7a, 0xbf, 0x90, 0x84, 0xa2, 0x6b, 0x29, 0x34, + 0xac, 0xc9, 0xff, 0x67, 0x82, 0xd0, 0xd2, 0x7d, 0x69, 0xc0, + 0xf3, 0xd7, 0x4b, 0x5c, 0xf2, 0xa8, 0x53, 0x8b, 0x78, 0x57, + 0xfc, 0x74, 0xf5, 0x81, 0x6e, 0xc2, 0x5b, 0x32, 0x52, 0x9e, + 0x58, 0x84, 0xa1, 0x71, 0xd5, 0x8c, 0xf5, 0x16, 0x36, 0x4d, + 0x11, 0xd4, 0xb5, 0xc2, 0x05, 0xc4, 0x03, 0xce, 0x83, 0xea, + 0x0b, 0x6a, 0x2e, 0xf6, 0x28, 0x5e, 0xb2, 0x40, 0x8c, 0xa3, + 0x6a, 0xc7, 0xee, 0x04, 0x54, 0x93, 0x0f, 0x3b, 0xf9, 0x57, + 0x92, 0x00, 0xf1, 0xc7, 0x1b, 0x48, 0x63, 0xcb, 0xd3, 0xdd, + 0x40, 0x90, 0x46, 0xb0, 0x87, 0x2a, 0xb8, 0xec, 0xbc, 0x07, + 0x09, 0x83, 0x25, 0xb1, 0x88, 0x2c, 0xa0, 0x0a, 0x40, 0x4f, + 0xfd, 0xec, 0xfd, 0xbe, 0x18, 0xae, 0xdd, 0x83, 0x89, 0x83, + 0x2d, 0x10, 0xb4, 0x14, 0x30, 0xac, 0x6c, 0xd9, 0xc9, 0xaa, + 0xbc, 0xdb, 0x5e, 0x14, 0xab, 0x19, 0x64, 0xaa, 0xb1, 0x9c, + 0xc3, 0xf5, 0xdc, 0x2b, 0xcd, 0x26, 0x0b, 0x81, 0x1a, 0x0e, + 0x0a, 0xd6, 0x39, 0x79, 0x10, 0x06, 0xbf, 0xe0, 0xc1, 0x8b, + 0x20, 0x24, 0x90, 0x8b, 0x0f, 0xa4, 0x2d, 0x2d, 0x46, 0x2a, + 0xd4, 0xf3, 0xa9, 0x58, 0x4b, 0xd9, 0xa6, 0x6c, 0x75, 0x3d, + 0xbc, 0x36, 0x76, 0x7f, 0xef, 0x1b, 0xa1, 0x41, 0xba, 0xd0, + 0xfe, 0x16, 0x19, 0xc3, 0x92, 0xe3, 0x59, 0x07, 0x3f, 0x48, + 0x11, 0x70, 0xe0, 0x8a, 0xff, 0x97, 0xbc, 0x71, 0xd5, 0xb9, + 0x4a, 0x9b, 0x4c, 0xb8, 0x4b, 0x50, 0xd6, 0x43, 0xe8, 0x84, + 0x0a, 0x95, 0xd0, 0x20, 0x28, 0xd3, 0x20, 0x4a, 0x0e, 0x1b, + 0xe6, 0x5d, 0x2f, 0x0c, 0xdb, 0x76, 0xab, 0xa3, 0xc2, 0xad, + 0xd5, 0x86, 0xae, 0xb9, 0x26, 0xb2, 0x5d, 0x72, 0x27, 0xbb, + 0xec, 0x23, 0x9f, 0x42, 0x90, 0x58, 0xe1, 0xf8, 0xe9, 0x63, + 0xdf, 0x1a, 0x46, 0x53, 0x65, 0x05, 0xfb, 0x20, 0x21, 0xa6, + 0x64, 0xc8, 0x5c, 0x67, 0x6b, 0x41, 0x6c, 0x04, 0x34, 0xeb, + 0x05, 0x71, 0xeb, 0xbe, 0xed, 0x6d, 0xa2, 0x96, 0x67, 0x45, + 0xe7, 0x47, 0x22, 0x64, 0xaf, 0x82, 0xf8, 0x78, 0x0e, 0xe6, + 0xa1, 0x4a, 0x2d, 0x82, 0x1e, 0xd0, 0xc2, 0x79, 0x4e, 0x29, + 0x89, 0xd9, 0xf3, 0x3f, 0xb6, 0xc4, 0xee, 0x69, 0xb2, 0x8f, + 0x8b, 0xd9, 0x13, 0xd9, 0x6e, 0x3a, 0xc5, 0x9f, 0xdf, 0x25, + 0xb7, 0xc3, 0x16, 0xb8, 0xa2, 0x85, 0x17, 0xae, 0xe9, 0x95, + 0x5d, 0xb8, 0x1d, 0x21, 0xbb, 0xd9, 0x38, 0x11, 0x8f, 0x44, + 0xea, 0xe8, 0x4c, 0x91, 0x82, 0xf5, 0x45, 0xee, 0x8f, 0xf5, + 0x6a, 0x0d, 0x08, 0xe7, 0x6b, 0xb0, 0x91, 0xd5, 0x42, 0x17, + 0x8c, 0x37, 0x6a, 0x5a, 0x0a, 0x87, 0x53, 0x76, 0xc3, 0x59, + 0x35, 0x13, 0x1c, 0xf1, 0x72, 0x2c, 0x2b, 0xb2, 0x9e, 0xda, + 0x10, 0x2a, 0xce, 0x38, 0xb4, 0x67, 0x8c, 0x4b, 0x08, 0xa1, + 0xb6, 0xa3, 0x08, 0x9c, 0xeb, 0xd8, 0x93, 0x1b, 0x29, 0x5a, + 0xa7, 0x03, 0x17, 0x7e, 0xec, 0x58, 0x6b, 0x5b, 0xc5, 0x46, + 0x03, 0x33, 0x7f, 0x0e, 0x93, 0x9a, 0xdd, 0xb5, 0x89, 0xb1, + 0x16, 0x4c, 0xa7, 0xd8, 0x0e, 0x73, 0xd8, 0xc3, 0xd2, 0x36, + 0x85, 0x66, 0xcb, 0x5b, 0x64, 0xf2, 0xdc, 0xba, 0x39, 0xcc, + 0xa5, 0xe0, 0x9b, 0xaa, 0x2a, 0x95, 0x6d, 0xdc, 0x49, 0xde, + 0x3b, 0x61, 0xa2, 0x3b, 0x1f, 0xed, 0x32, 0xfa, 0x10, 0xe4, + 0x88, 0x59, 0xca, 0x5a, 0xe4, 0xf9, 0x5e, 0xe2, 0xca, 0x21, + 0x5a, 0xdc, 0x02, 0x73, 0x7a, 0xc8, 0x90, 0x7a, 0x8e, 0x91, + 0x19, 0x04, 0x53, 0x3c, 0x50, 0x15, 0x8a, 0x84, 0x93, 0x8f, + 0xac, 0x99, 0x82, 0xdd, 0xc6, 0xce, 0xfb, 0x18, 0x84, 0x29, + 0x2a, 0x8d, 0xa2, 0xc5, 0x7f, 0x87, 0xce, 0x4c, 0xf5, 0xdf, + 0x73, 0xd2, 0xba, 0xc2, 0x4f, 0xe3, 0x74, 0xa5, 0x8f, 0xc3, + 0xf4, 0x99, 0xd1, 0xe8, 0x4e, 0xb8, 0xe0, 0x2e, 0xef, 0xd6, + 0x87, 0x70, 0xcf, 0x45, 0x3b, 0xff, 0x03, 0xfd, 0x59, 0x7f, + 0x7c, 0xd0, 0x4e, 0x49, 0xf7, 0xd5, 0x08, 0xd9, 0x06, 0x53, + 0x90, 0x0a, 0x5a, 0x1b, 0x2e, 0xf5, 0xb0, 0x85, 0xb6, 0xb6, + 0x61, 0xa5, 0x71, 0x47, 0xbf, 0x4a, 0xf6, 0xae, 0x9a, 0x19, + 0x6c, 0xd8, 0x2d, 0x9b, 0xb4, 0x40, 0x9e, 0x15, 0x77, 0x2e, + 0x7e, 0xe9, 0xb4, 0x3d, 0x0f, 0x1b, 0xb5, 0x1c, 0xc2, 0x58, + 0x4e, 0x4b, 0xf6, 0x53, 0x9e, 0x6f, 0x09, 0x55, 0xa0, 0xb8, + 0x73, 0x11, 0x64, 0x70, 0x54, 0xb4, 0xcb, 0xb7, 0x27, 0xe5, + 0xdf, 0x58, 0x67, 0x5b, 0xc0, 0xd6, 0xf5, 0x64, 0xa6, 0x66, + 0x6d, 0xdf, 0xd8, 0xf8, 0xd6, 0x85, 0xba, 0xba, 0x30, 0xa7, + 0xca, 0x34, 0xf4, 0x9a, 0xba, 0x0a, 0xfb, 0x0e, 0xa0, 0x65, + 0x98, 0x78, 0xee, 0xaa, 0x14, 0x6a, 0x99, 0x77, 0x67, 0xad, + 0x01, 0x95, 0x5e, 0x50, 0x22, 0xe9, 0x74, 0x95, 0xa7, 0x13, + 0x3f, 0xdd, 0xa6, 0x69, 0x64, 0xf6, 0x50, 0x06, 0x6d, 0xba, + 0x90, 0x5a, 0x8c, 0x81, 0xa0, 0xda, 0x55, 0xe9, 0x97, 0x0e, + 0xd7, 0x10, 0x8e, 0x1f, 0x23, 0x65, 0xd9, 0x14, 0xd4, 0xde, + 0xa5, 0xf9, 0xec, 0xb6, 0xad, 0x65, 0xce, 0x0b, 0x1b, 0x0a, + 0x4c, 0x7d, 0xb0, 0x97, 0xa6, 0xfe, 0x67, 0xfb, 0x4f, 0x8f, + 0x00, 0x92, 0xb6, 0x0d, 0x20, 0x78, 0x65, 0x1d, 0x9a, 0x56, + 0x57, 0xc6, 0x15, 0x88, 0xba, 0x55, 0x02, 0x7a, 0x9a, 0xac, + 0x50, 0x4c, 0xc7, 0x9e, 0x66, 0x8b, 0xfc, 0xf3, 0x67, 0x48, + 0x07, 0xbf, 0x84, 0x94, 0x9b, 0x22, 0x2a, 0xae, 0x1b, 0x25, + 0xe9, 0x94, 0x06, 0xa7, 0xe8, 0x61, 0x52, 0x89, 0xdc, 0x93, + 0x6e, 0x89, 0xdc, 0x30, 0x6e, 0xd9, 0xee, 0xcb, 0x12, 0x38, + 0x58, 0x9d, 0x8b, 0xc5, 0x05, 0x2c, 0x50, 0x4e, 0xc8, 0xc2, + 0xe0, 0x65, 0xb6, 0x49, 0xc4, 0xf0, 0x1e, 0x5c, 0x8e, 0x3c, + 0xe9, 0x77, 0xd2, 0x9e, 0xa8, 0xd5, 0xf5, 0xd9, 0xc5, 0xad, + 0x5b, 0x74, 0x48, 0x08, 0x3a, 0x30, 0x84, 0x57, 0x71, 0x1e, + 0x69, 0x45, 0x09, 0xdd, 0xea, 0x62, 0xec, 0x7c, 0xa3, 0xf9, + 0x92, 0xee, 0x16, 0xdc, 0xe5, 0x9d, 0xcf, 0xb7, 0x08, 0x51, + 0x8a, 0x76, 0x3a, 0x23, 0x94, 0x50, 0x8e, 0x4d, 0x3a, 0xea, + 0xf3, 0xc1, 0x53, 0x2c, 0x65, 0x9c, 0x36, 0x8c, 0x10, 0xe3, + 0x9c, 0x01, 0xa4, 0xe6, 0x45, 0x77, 0xa6, 0x5d, 0x7e, 0x37, + 0x31, 0x95, 0x2f, 0xec, 0x61, 0x92, 0x69, 0x65, 0x53, 0x54, + 0x6d, 0xbe, 0x9e, 0x5a, 0x68, 0x12, 0xc4, 0xe7, 0xe4, 0x06, + 0x51, 0x5a, 0xc0, 0x63, 0xb9, 0x69, 0xb8, 0x3c, 0xd8, 0xae, + 0x8b, 0xff, 0x96, 0x4d, 0x55, 0xce, 0x25, 0x2b, 0x8b, 0x89, + 0xc9, 0x3a, 0x16, 0x48, 0x2a, 0x73, 0xb2, 0x70, 0x8b, 0x62, + 0xd5, 0xb1, 0xa0, 0x30, 0xe5, 0x46, 0xab, 0x8b, 0xc3, 0xeb, + 0x37, 0x2f, 0xbd, 0xb8, 0x4e, 0x6c, 0x30, 0xdc, 0x6c, 0x8a, + 0xf1, 0x89, 0x06, 0xce, 0x64, 0x0a, 0x3e, 0xb2, 0x16, 0x31, + 0xa1, 0xe4, 0x4b, 0x98, 0xe7, 0xf1, 0x99, 0x76, 0x00, 0x5f, + 0xd2, 0xd3, 0x30, 0xf0, 0xbf, 0xa7, 0x4a, 0xf6, 0x9e, 0xa5, + 0x75, 0x74, 0x78, 0xfe, 0xec, 0x72, 0x7c, 0x89, 0xe9, 0xf6, + 0x0d, 0x7e, 0x15, 0xd6, 0xd8, 0x79, 0x85, 0x3c, 0xcf, 0xb0, + 0x21, 0xc8, 0x9c, 0x54, 0x87, 0x63, 0xb3, 0x05, 0xbb, 0x8a, + 0x02, 0xe4, 0x79, 0xdc, 0xa1, 0xa2, 0xd3, 0x19, 0xd8, 0x86, + 0xff, 0x8a, 0x0e, 0x82, 0x89, 0xaf, 0xaa, 0x62, 0x2e, 0xd4, + 0xb2, 0xd0, 0x5d, 0x0d, 0x4f, 0x2a, 0xda, 0x0e, 0x9f, 0x8a, + 0x2b, 0x32, 0xe9, 0x09, 0xf5, 0x55, 0x51, 0xe7, 0xd5, 0x69, + 0x12, 0xdd, 0x33, 0x6b, 0x3d, 0xd7, 0xe9, 0xfd, 0xb2, 0xa7, + 0xf5, 0x97, 0x2a, 0x6d, 0x89, 0x30, 0x65, 0x2a, 0x0d, 0xf2, + 0x00, 0x81, 0xbe, 0xfb, 0xd9, 0xd7, 0x1b, 0xc2, 0x48, 0x7a, + 0x22, 0x30, 0xae, 0x35, 0xf6, 0x32, 0x41, 0x9d, 0xd9, 0x12, + 0xb3, 0xa7, 0x6d, 0xba, 0x74, 0x93, 0x2d, 0x0d, 0xb2, 0xb6, + 0xdc, 0xa9, 0x98, 0x5b, 0x3b, 0xaa, 0x2b, 0x47, 0x06, 0xc4, + 0x36, 0xfd, 0x04, 0x10, 0x94, 0x61, 0x61, 0x47, 0x1c, 0x02, + 0x54, 0x85, 0x4a, 0xcb, 0x75, 0x6b, 0x75, 0xf5, 0xb4, 0x61, + 0x26, 0xb3, 0x12, 0x43, 0x31, 0x55, 0xb5, 0xda, 0x4b, 0xb5, + 0x11, 0xb4, 0xb8, 0xfb, 0x0a, 0xd9, 0xa7, 0x0e, 0x9f, 0x2a, + 0x74, 0x01, 0xf6, 0x1a, 0x33, 0x10, 0x9e, 0x66, 0xff, 0x82, + 0xfa, 0xa9, 0xa4, 0xa0, 0x9b, 0x25, 0x2d, 0x16, 0xbf, 0x60, + 0x0d, 0x87, 0xea, 0x94, 0xad, 0xdd, 0xc4, 0xd0, 0xa8, 0xdd, + 0x2d, 0xc7, 0xc8, 0xac, 0x39, 0x9e, 0x87, 0x69, 0xc4, 0x3a, + 0xbc, 0x28, 0x7e, 0x36, 0x69, 0xfd, 0x20, 0x25, 0xac, 0xa3, + 0xa7, 0x37, 0x96, 0xe9, 0x8a, 0x65, 0xe4, 0xb0, 0x2a, 0x61, + 0x23, 0x28, 0x64, 0xff, 0x17, 0x6c, 0x36, 0x9e, 0x0a, 0xba, + 0xe4, 0x4b, 0xeb, 0x84, 0x24, 0x20, 0x57, 0x0f, 0x34, 0x05, + 0x95, 0x56, 0xc3, 0x2f, 0x2b, 0xf0, 0x36, 0xef, 0xca, 0x68, + 0xfe, 0x78, 0xf8, 0x98, 0x09, 0x4a, 0x25, 0xcc, 0x17, 0xbe, + 0x05, 0x00, 0xff, 0xf9, 0xa5, 0x5b, 0xe6, 0xaa, 0x5b, 0x56, + 0xb6, 0x89, 0x64, 0x9c, 0x16, 0x48, 0xe1, 0xcd, 0x67, 0x87, + 0xdd, 0xba, 0xbd, 0x02, 0x0d, 0xd8, 0xb4, 0xc9, 0x7c, 0x37, + 0x92, 0xd0, 0x39, 0x46, 0xd2, 0xc4, 0x78, 0x13, 0xf0, 0x76, + 0x45, 0x5f, 0xeb, 0x52, 0xd2, 0x3f, 0x61, 0x87, 0x34, 0x09, + 0xb7, 0x24, 0x4e, 0x93, 0xf3, 0xc5, 0x10, 0x19, 0x66, 0x66, + 0x3f, 0x15, 0xe3, 0x05, 0x55, 0x43, 0xb7, 0xf4, 0x62, 0x57, + 0xb4, 0xd9, 0xef, 0x46, 0x47, 0xb5, 0xfb, 0x79, 0xc9, 0x67, + 0xc5, 0xc3, 0x18, 0x91, 0x73, 0x75, 0xec, 0xd5, 0x68, 0x2b, + 0xf6, 0x42, 0xb4, 0xff, 0xfb, 0x27, 0x61, 0x77, 0x28, 0x10, + 0x6b, 0xce, 0x19, 0xad, 0x87, 0xc3, 0x85, 0xe3, 0x78, 0x00, + 0xdb, 0x21, 0xee, 0xd8, 0xfa, 0x9c, 0x81, 0x11, 0x97, 0xac, + 0xd0, 0x50, 0x89, 0x45, 0x23, 0xf6, 0x85, 0x7d, 0x60, 0xb2, + 0xad, 0x0c, 0x5d, 0xd8, 0x9e, 0xe4, 0xe1, 0x25, 0xb2, 0x13, + 0x1a, 0x54, 0x54, 0xfd, 0x7b, 0xab, 0x85, 0x20, 0xe8, 0xda, + 0x52, 0x0f, 0xac, 0x49, 0x70, 0xf1, 0x4c, 0x66, 0x74, 0x8c, + 0x87, 0x6e, 0xca, 0xc1, 0x0d, 0x92, 0xc0, 0xa8, 0x08, 0xfd, + 0x0f, 0x60, 0x55, 0xaf, 0x24, 0xcb, 0x04, 0xb7, 0xff, 0xa9, + 0xc5, 0x07, 0x26, 0xf6, 0xe2, 0x1e, 0x2f, 0xd1, 0x99, 0x6d, + 0xef, 0xc0, 0xdb, 0x5b, 0xf7, 0x06, 0x80, 0x92, 0x5f, 0x56, + 0x54, 0xdb, 0x2e, 0xba, 0x93, 0xb2, 0x94, 0xf2, 0xad, 0xbc, + 0x91, 0x6e, 0x4e, 0xce, 0x21, 0xc4, 0x8b, 0x18, 0xc4, 0xfc, + 0xab, 0xb4, 0x4f, 0xd7, 0xa2, 0xef, 0x55, 0x00, 0x6d, 0x34, + 0x17, 0x59, 0x8d, 0x79, 0x75, 0x02, 0xa3, 0x7a, 0x52, 0x57, + 0x5c, 0x26, 0xb9, 0xae, 0xd6, 0x19, 0x2e, 0x31, 0x02, 0x98, + 0x98, 0xe5, 0x3d, 0xc2, 0xa5, 0x56, 0xb6, 0x02, 0xae, 0x0d, + 0x3b, 0x35, 0x97, 0xd2, 0x43, 0x38, 0x8a, 0x65, 0xfa, 0x86, + 0x20, 0xb7, 0xb5, 0xb0, 0xda, 0x19, 0x01, 0x2f, 0x13, 0xb5, + 0x6d, 0xbd, 0xb2, 0x34, 0xa7, 0xff, 0xae, 0x7e, 0x8f, 0x98, + 0x1b, 0xc4, 0x27, 0xbd, 0xa9, 0x64, 0xdc, 0xab, 0x2a, 0xd2, + 0xb4, 0x27, 0xd0, 0x25, 0xdd, 0xff, 0xdc, 0x0a, 0x96, 0xd3, + 0x85, 0x3e, 0xc5, 0x11, 0x34, 0x60, 0xa2, 0x33, 0x92, 0x90, + 0xbb, 0x4c, 0x86, 0xdd, 0xd6, 0x1e, 0xcb, 0x0a, 0x17, 0xc6, + 0x87, 0x4e, 0x3e, 0x7a, 0x4b, 0xab, 0xef, 0x0a, 0x00, 0x3d, + 0x94, 0x34, 0x8b, 0x63, 0x36, 0xd9, 0xaf, 0x5d, 0x63, 0x40, + 0xbb, 0x32, 0x4b, 0x64, 0xf0, 0x31, 0x48, 0xdb, 0x44, 0x2b, + 0x48, 0x60, 0x6a, 0xea, 0xa4, 0x8c, 0xdd, 0xaf, 0x81, 0x3f, + 0x86, 0x81, 0x99, 0x7a, 0x98, 0xe1, 0xff, 0x21, 0x7a, 0x28, + 0xbc, 0x33, 0xe6, 0x4e, 0xb0, 0x85, 0x6b, 0xec, 0x11, 0x37, + 0x81, 0x7f, 0xf9, 0xdc, 0xbf, 0x1a, 0xa6, 0x6d, 0x4d, 0x0f, + 0x5b, 0x99, 0x73, 0xb8, 0xd2, 0x6e, 0x37, 0xf0, 0x71, 0xf1, + 0x1a, 0xc3, 0x5c, 0xea, 0x12, 0x5f, 0x2e, 0x85, 0x3f, 0xfd, + 0xd5, 0x87, 0x67, 0x9f, 0x67, 0x9f, 0xd7, 0xef, 0x9f, 0x81, + 0xa4, 0xbc, 0x63, 0x1d, 0x00, 0x81, 0xf6, 0x20, 0x77, 0xae, + 0x0b, 0x90, 0xe5, 0x9c, 0xa9, 0x44, 0xb5, 0xd7, 0xb1, 0x61, + 0x33, 0x4f, 0x75, 0xa9, 0xb7, 0xf4, 0xa4, 0x72, 0x9e, 0x72, + 0xec, 0x7b, 0xcd, 0x83, 0xb3, 0xd6, 0x22, 0x50, 0x50, 0x97, + 0x0f, 0x63, 0x0f, 0xe1, 0x15, 0xb3, 0x07, 0xb6, 0xa3, 0xfa, + 0x2f, 0xb5, 0xf3, 0x5b, 0x5d, 0x7f, 0x90, 0x20, 0xcd, 0x5f, + 0x40, 0x48, 0x87, 0x43, 0xfd, 0xa3, 0x69, 0xdc, 0xf8, 0x51, + 0x08, 0x67, 0xc2, 0x2d, 0xff, 0xfe, 0xbf, 0x85, 0x3e, 0x80, + 0xff, 0x91, 0x62, 0xc5, 0x83, 0xe0, 0x80, 0xeb, 0xce, 0xdc, + 0xff, 0xb1, 0xdb, 0x02, 0xb7, 0x01, 0x1e, 0xa6, 0xf0, 0x32, + 0xfb, 0x95, 0x6a, 0x47, 0x44, 0x84, 0x42, 0x6e, 0x3a, 0xb1, + 0xcf, 0xf9, 0x28, 0xb4, 0x3a, 0x8e, 0xa7, 0x8d, 0x48, 0x81, + 0x1c, 0x7e, 0xf5, 0x0b, 0x46, 0x7e, 0x92, 0x4e, 0xb9, 0xa8, + 0x36, 0xb8, 0x81, 0x6d, 0x8c, 0x70, 0x59, 0x33, 0x12, 0x61, + 0xbb, 0xe6, 0x10, 0x8a, 0xe4, 0xc1, 0x2c, 0x50, 0x12, 0xbf, + 0xd3, 0xc6, 0x3c, 0x53, 0x91, 0x50, 0x07, 0xc8, 0x85, 0x32, + 0x3c, 0xe1, 0x67, 0x99, 0x68, 0xc1, 0xf4, 0x74, 0x86, 0x35, + 0x8a, 0x6c, 0x75, 0x1d, 0x8f, 0x8a, 0x60, 0xe1, 0xc7, 0x59, + 0x4e, 0xb0, 0xe0, 0x45, 0x5a, 0x11, 0x05, 0x24, 0xa7, 0x8d, + 0x39, 0x93, 0x60, 0x4c, 0xc5, 0x9e, 0x8a, 0x70, 0xcc, 0x44, + 0x96, 0x92, 0xc8, 0xf7, 0x23, 0x14, 0xc7, 0xf4, 0x82, 0x9d, + 0x5b, 0x1c, 0x26, 0xd0, 0x3c, 0x76, 0x36, 0xe9, 0x98, 0x8a, + 0xbb, 0xe6, 0xa0, 0xad, 0xed, 0xf7, 0xd9, 0x06, 0x50, 0x67, + 0x79, 0x50, 0x4e, 0xd5, 0x80, 0x4e, 0x59, 0x72, 0x5d, 0x8b, + 0xcb, 0x86, 0x3b, 0x57, 0xc4, 0xb2, 0x3d, 0xbc, 0x35, 0x6d, + 0xb1, 0x50, 0xf5, 0x8c, 0xf2, 0x89, 0x72, 0x20, 0xd0, 0x47, + 0x68, 0x13, 0x42, 0x25, 0x1a, 0xb6, 0xc5, 0x07, 0xdf, 0x45, + 0x11, 0xa9, 0x05, 0x5d, 0xad, 0xf0, 0x49, 0x9e, 0x70, 0x78, + 0xed, 0xe7, 0xf9, 0x00, 0x1f, 0x62, 0x76, 0x47, 0xb5, 0x48, + 0x4f, 0x2c, 0x2e, 0xe3, 0x78, 0x6a, 0x44, 0x46, 0x1e, 0x6b, + 0x00, 0x74, 0x54, 0xb9, 0xd1, 0x4f, 0x6d, 0x45, 0xc1, 0xa6, + 0x45, 0x2e, 0x1a, 0xaf, 0x94, 0x3f, 0xd0, 0x72, 0x67, 0x0d, + 0x2e, 0xa9, 0x8d, 0x16, 0xc4, 0x05, 0x01, 0x07, 0x13, 0x1b, + 0x1c, 0x3d, 0x43, 0x71, 0x91, 0x95, 0x9a, 0xae, 0xaf, 0xc4, + 0xe5, 0xe6, 0xe9, 0xff, 0x02, 0x0c, 0x0f, 0x3e, 0x62, 0x67, + 0x68, 0x81, 0xc7, 0xd0, 0xd8, 0xdd, 0xe0, 0xf5, 0x0b, 0x25, + 0x35, 0x45, 0x4a, 0x4b, 0x63, 0x74, 0x79, 0x7e, 0x82, 0xa2, + 0xaf, 0xc6, 0xc7, 0xcc, 0xd2, 0xfa, 0x2a, 0x2d, 0x2f, 0x32, + 0x35, 0x38, 0x3f, 0x4c, 0x7f, 0x80, 0x81, 0x8b, 0x9b, 0x9c, + 0x9d, 0xa7, 0xa9, 0xcb, 0xe9, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x20, 0x32, 0x46, + }; + + return dilithium_param_vfy_test(WC_ML_DSA_44, ml_dsa_44_pub_key, + (word32)sizeof(ml_dsa_44_pub_key), ml_dsa_44_sig, + (word32)sizeof(ml_dsa_44_sig)); +} +#endif + +#ifndef WOLFSSL_NO_ML_DSA_65 +static wc_test_ret_t dilithium_param_65_vfy_test(void) +{ + WOLFSSL_SMALL_STACK_STATIC const byte ml_dsa_65_pub_key[] = { + 0x15, 0xc9, 0xe5, 0x53, 0x2f, 0xd8, 0x1f, 0xb4, 0xa3, 0x9f, + 0xae, 0xad, 0xb3, 0x10, 0xd0, 0x72, 0x69, 0xd3, 0x02, 0xf3, + 0xdf, 0x67, 0x5a, 0x31, 0x52, 0x19, 0xca, 0x39, 0x27, 0x77, + 0x61, 0x6d, 0x0f, 0xc1, 0x33, 0x26, 0x09, 0xf0, 0xf9, 0x4d, + 0x12, 0x7a, 0xef, 0xf7, 0x21, 0x26, 0x2c, 0xe0, 0xe2, 0x92, + 0x1f, 0x9d, 0xd1, 0xaa, 0xaf, 0x08, 0x14, 0xf2, 0xaa, 0x24, + 0x99, 0x0f, 0x20, 0x57, 0x35, 0x04, 0x32, 0x96, 0x8e, 0x6e, + 0x10, 0x64, 0xe3, 0xe3, 0x57, 0x26, 0x33, 0x32, 0x7b, 0xe4, + 0x18, 0x41, 0x77, 0xd3, 0x24, 0x63, 0x3d, 0x11, 0xea, 0xdc, + 0xbe, 0x59, 0xff, 0x8d, 0xc2, 0xe4, 0xc7, 0x04, 0xf3, 0xd4, + 0xe0, 0x1d, 0x5e, 0x09, 0x46, 0xbf, 0x02, 0x05, 0xc7, 0xa6, + 0xb7, 0x82, 0x40, 0x1f, 0x55, 0xe9, 0x77, 0x82, 0xc0, 0xcc, + 0x86, 0x99, 0x19, 0x99, 0xa2, 0xc9, 0x1b, 0x4f, 0xdd, 0x49, + 0x4c, 0x78, 0x0a, 0x58, 0xb8, 0xf0, 0x23, 0xac, 0x1a, 0x71, + 0x57, 0x6d, 0xd6, 0x3a, 0x3a, 0x6f, 0x93, 0xb3, 0x2b, 0x09, + 0xbe, 0xec, 0x7b, 0x5b, 0xf7, 0x3a, 0xed, 0xf9, 0xd0, 0xb1, + 0xfe, 0x9f, 0x9b, 0xec, 0x11, 0xb6, 0x6b, 0xd1, 0xb6, 0x00, + 0x72, 0x7f, 0x68, 0x9a, 0x61, 0xa5, 0xf5, 0x6e, 0xe9, 0x46, + 0xa4, 0x82, 0x08, 0x9f, 0x50, 0x4c, 0x75, 0xc3, 0x48, 0x85, + 0x76, 0x39, 0xea, 0x0c, 0xf2, 0xe8, 0x7e, 0x48, 0x69, 0xd9, + 0x6f, 0x9a, 0x89, 0x7d, 0x98, 0xc1, 0x16, 0xdc, 0x2f, 0xc7, + 0x0a, 0x11, 0xa8, 0xbb, 0xe7, 0x91, 0xb1, 0x0f, 0x0e, 0xf0, + 0xb4, 0xc8, 0x41, 0x7e, 0x62, 0x9e, 0x3c, 0x30, 0x4c, 0xbc, + 0x4c, 0xeb, 0x37, 0xaf, 0x48, 0x72, 0x59, 0x64, 0x8e, 0xfb, + 0x77, 0x11, 0x28, 0xdd, 0x30, 0x52, 0x8e, 0x69, 0x8c, 0x9f, + 0x3d, 0xec, 0xdf, 0xa7, 0x5f, 0x42, 0x18, 0xda, 0xba, 0x1a, + 0x96, 0x91, 0x7d, 0x62, 0xd5, 0x52, 0xff, 0x44, 0xc9, 0x1d, + 0x29, 0xa6, 0xb9, 0x03, 0x9a, 0x26, 0x26, 0xcf, 0x57, 0x40, + 0x70, 0x7e, 0x2b, 0xbd, 0xf0, 0x81, 0x71, 0x0f, 0x0b, 0x2e, + 0x9b, 0x03, 0xba, 0x31, 0x41, 0x68, 0x37, 0xc8, 0xff, 0xea, + 0xc4, 0x73, 0xa5, 0xf9, 0xc2, 0x92, 0x78, 0x0c, 0xe7, 0xfd, + 0x5d, 0xb2, 0x01, 0xb5, 0x8d, 0xeb, 0x64, 0xd4, 0x14, 0xea, + 0x7a, 0xd1, 0x42, 0xc8, 0x99, 0xe4, 0x7d, 0x5b, 0x7e, 0x3b, + 0x8f, 0xab, 0x82, 0x12, 0xdf, 0xbb, 0xa1, 0x45, 0x30, 0xc9, + 0x0f, 0xb9, 0xe5, 0xba, 0xe6, 0x8a, 0xf3, 0x78, 0x61, 0xcc, + 0x9f, 0xe1, 0x46, 0x2a, 0x9a, 0x18, 0x0e, 0x2a, 0x57, 0xf3, + 0xe5, 0x56, 0xd1, 0x42, 0x48, 0xe1, 0x5a, 0x8e, 0x33, 0xce, + 0x19, 0xe5, 0x3e, 0x7f, 0x00, 0x70, 0x9c, 0x4c, 0xd3, 0xe1, + 0x0c, 0xa1, 0x7e, 0xd4, 0xa9, 0x9e, 0x8b, 0xe2, 0xf0, 0xac, + 0xdb, 0xa6, 0x72, 0x75, 0x67, 0xa6, 0x57, 0xed, 0x79, 0x2e, + 0xca, 0x8d, 0xeb, 0x9b, 0x9e, 0xb7, 0xbf, 0x30, 0x02, 0x2b, + 0xb3, 0x43, 0x89, 0x9b, 0xa8, 0x88, 0xa5, 0xbb, 0x33, 0xd9, + 0x99, 0x30, 0x7c, 0xc7, 0xd4, 0x28, 0x5e, 0x5e, 0x3f, 0x9d, + 0x6d, 0x35, 0x75, 0x33, 0x8e, 0xff, 0x84, 0x2e, 0x2d, 0xda, + 0xf0, 0xff, 0x70, 0xe5, 0xb5, 0x62, 0x96, 0x33, 0x3a, 0xd9, + 0xb5, 0x82, 0x25, 0x81, 0x81, 0x40, 0x5d, 0x4f, 0x11, 0x86, + 0x63, 0x1a, 0x06, 0xc1, 0x67, 0xc7, 0x49, 0x03, 0xc7, 0xe4, + 0x6f, 0xb4, 0x13, 0x3e, 0x57, 0x62, 0xfd, 0x8a, 0xc6, 0x2b, + 0x65, 0x5b, 0xa4, 0x29, 0x57, 0x8d, 0xde, 0xa5, 0xee, 0x32, + 0xc2, 0x76, 0x03, 0xca, 0xce, 0xc1, 0x48, 0xec, 0x45, 0xcf, + 0x30, 0x21, 0x28, 0x7f, 0x10, 0x47, 0xd2, 0xdb, 0xee, 0xca, + 0x5b, 0x0f, 0xd5, 0x39, 0x3a, 0xc3, 0xa6, 0x78, 0xb2, 0x15, + 0xaf, 0x82, 0x3c, 0x2f, 0xc4, 0x51, 0x5c, 0x52, 0xad, 0xf2, + 0x89, 0x92, 0x8e, 0xf3, 0x50, 0x38, 0xed, 0xf8, 0xc9, 0x14, + 0x4c, 0xe4, 0xa3, 0x9a, 0xaf, 0xc4, 0x5c, 0xf3, 0x9f, 0xc3, + 0xa3, 0xc0, 0xbe, 0x45, 0x1b, 0x21, 0x63, 0xfa, 0xe0, 0xe0, + 0x91, 0x2b, 0x42, 0xca, 0x91, 0xfb, 0x5e, 0x97, 0x9a, 0x0a, + 0xd4, 0x88, 0xba, 0xb8, 0x22, 0xc6, 0xbf, 0x56, 0x58, 0x1e, + 0x92, 0xa9, 0x9d, 0xa7, 0xed, 0xc9, 0xab, 0x54, 0x4f, 0x75, + 0x8d, 0x42, 0xc1, 0xe1, 0x61, 0xd0, 0x91, 0x9a, 0x3a, 0x40, + 0x9a, 0xa3, 0xfb, 0x7b, 0x4e, 0xf0, 0x85, 0xf0, 0xdc, 0x40, + 0x72, 0x9f, 0x05, 0xa8, 0xbe, 0x95, 0x5a, 0x7f, 0xba, 0x75, + 0x00, 0x6e, 0x95, 0x76, 0xbd, 0xb2, 0x40, 0xf5, 0xb0, 0x64, + 0x0a, 0x2f, 0x06, 0x3d, 0x9f, 0xac, 0x6a, 0xa5, 0x46, 0x5a, + 0x85, 0xa4, 0x6f, 0xee, 0x27, 0xa0, 0xeb, 0x5f, 0x1f, 0x91, + 0xbd, 0x2b, 0x02, 0x16, 0xdf, 0x74, 0x97, 0x2c, 0xd0, 0xa8, + 0x9f, 0x3a, 0x7b, 0xdf, 0x3e, 0x98, 0x4a, 0x91, 0xdc, 0x19, + 0x96, 0x88, 0x75, 0x21, 0x1a, 0x6a, 0xa8, 0x4b, 0x1f, 0x35, + 0xd1, 0x92, 0xf5, 0x76, 0xf4, 0x72, 0x55, 0x13, 0xdb, 0x5d, + 0x07, 0x8d, 0xd9, 0x72, 0xe4, 0x75, 0xde, 0x80, 0xbc, 0xe9, + 0x9c, 0xf0, 0x5c, 0x6a, 0x8a, 0x0e, 0x34, 0xf6, 0x3f, 0x5c, + 0xef, 0x0e, 0xcc, 0x52, 0x38, 0x2d, 0x7b, 0xc2, 0x1b, 0x69, + 0x9f, 0xe5, 0xed, 0x14, 0xb0, 0x91, 0x0b, 0xe9, 0x4d, 0x34, + 0xd5, 0xaa, 0xd4, 0xd2, 0x46, 0x39, 0x45, 0x7e, 0x85, 0x2f, + 0xdb, 0x89, 0xf4, 0xff, 0x05, 0x74, 0x51, 0xba, 0xdd, 0xee, + 0xf6, 0xc2, 0xc1, 0x0a, 0x8f, 0xd9, 0xeb, 0xc7, 0x61, 0x30, + 0x8f, 0x86, 0x8b, 0x1f, 0x82, 0xc1, 0x22, 0xfd, 0x83, 0xf4, + 0x5d, 0xc5, 0x94, 0xf5, 0xd7, 0x17, 0xc7, 0x7b, 0x71, 0xf5, + 0x5e, 0x15, 0x49, 0x70, 0xb2, 0x57, 0xa0, 0xc0, 0x57, 0x63, + 0x53, 0x35, 0xb6, 0x52, 0x20, 0x7b, 0x83, 0xd4, 0x57, 0x63, + 0x25, 0x8e, 0x83, 0xb3, 0x8e, 0x26, 0x1f, 0x09, 0xde, 0x14, + 0xd6, 0xa6, 0xfc, 0xe5, 0x93, 0x3c, 0x88, 0x8e, 0xf5, 0x10, + 0x57, 0xb9, 0xc9, 0x9b, 0xff, 0x72, 0x9d, 0x3d, 0x3f, 0x97, + 0xd9, 0x3c, 0x20, 0xe2, 0x57, 0xfd, 0x2a, 0x5c, 0x17, 0x12, + 0xe6, 0x08, 0xaf, 0xe4, 0x26, 0x96, 0xb9, 0x6d, 0xc3, 0xac, + 0x22, 0xf3, 0x8b, 0x89, 0xde, 0xc7, 0x8a, 0x93, 0x06, 0xf7, + 0x1d, 0x08, 0x21, 0x36, 0x16, 0x74, 0x2b, 0x97, 0x23, 0xe4, + 0x79, 0x31, 0x08, 0x23, 0x62, 0x30, 0x67, 0xe2, 0xed, 0x30, + 0x9b, 0x0c, 0xf9, 0x08, 0x7a, 0x29, 0x73, 0xc6, 0x77, 0x8a, + 0xbb, 0x2a, 0x1c, 0x66, 0xd0, 0xdd, 0x9e, 0xa3, 0xe9, 0x62, + 0xcc, 0xb7, 0x88, 0x25, 0x4a, 0x5f, 0xbc, 0xaa, 0xe3, 0xe4, + 0x4f, 0xec, 0xa6, 0x8e, 0xa6, 0xa4, 0x1b, 0x22, 0x2b, 0x2c, + 0x8f, 0x57, 0x7f, 0xb7, 0x33, 0xfe, 0x16, 0x43, 0x85, 0xc5, + 0xd2, 0x95, 0xe6, 0xb9, 0x21, 0x68, 0x88, 0x98, 0x33, 0x8c, + 0x1d, 0x15, 0x9c, 0x4d, 0x62, 0x1f, 0x6b, 0xe8, 0x7a, 0x2d, + 0x6b, 0x0e, 0xc3, 0xde, 0x1a, 0xa8, 0xed, 0x67, 0xb3, 0xb3, + 0x36, 0x5b, 0x4b, 0xcb, 0xe8, 0xa8, 0x5c, 0x0b, 0x2f, 0xca, + 0xd7, 0x71, 0xe8, 0x85, 0xe7, 0x4d, 0xe5, 0x7b, 0x45, 0xed, + 0xb2, 0x4c, 0x69, 0x04, 0x7e, 0x4f, 0xc0, 0xef, 0x1a, 0xca, + 0x0d, 0xa6, 0xc4, 0x79, 0x15, 0x78, 0x9c, 0xd2, 0x91, 0x3c, + 0x32, 0x55, 0x40, 0xe7, 0xcb, 0x7e, 0xde, 0x07, 0xa6, 0x97, + 0x00, 0x2d, 0x70, 0xf6, 0x3d, 0x15, 0xdf, 0x29, 0x8e, 0xa3, + 0x96, 0x6d, 0xf2, 0xbb, 0xa5, 0x1b, 0x7b, 0x58, 0x30, 0xf6, + 0x17, 0xbd, 0xda, 0x13, 0xf7, 0x33, 0xc2, 0x62, 0x32, 0xd4, + 0x1c, 0x2e, 0x31, 0x74, 0x92, 0xad, 0x99, 0x8c, 0x0e, 0x7c, + 0x50, 0x21, 0xcd, 0xff, 0x41, 0xeb, 0xd1, 0xca, 0x14, 0xb7, + 0xb2, 0x31, 0x2f, 0xbe, 0x16, 0xce, 0x4f, 0x26, 0x16, 0x04, + 0xc2, 0xaf, 0xbe, 0x0d, 0x24, 0xab, 0x9a, 0x21, 0x37, 0x06, + 0xac, 0x50, 0x23, 0xf1, 0xbe, 0x5c, 0xbb, 0x64, 0xf3, 0xd3, + 0x66, 0xa3, 0xb8, 0xbe, 0x8b, 0x49, 0x8d, 0xf6, 0xc7, 0xb9, + 0x8f, 0x4e, 0x31, 0x06, 0x51, 0xe5, 0xf3, 0x0e, 0x56, 0xc4, + 0x24, 0x30, 0xf5, 0xe9, 0x36, 0x71, 0xbc, 0xc9, 0x70, 0x2c, + 0x6c, 0x4c, 0x15, 0x43, 0x44, 0xa4, 0xfc, 0xf1, 0xd2, 0x71, + 0x6c, 0x4c, 0xce, 0x30, 0x6c, 0x05, 0x7d, 0x2e, 0xb7, 0xbc, + 0xe4, 0x65, 0x76, 0x24, 0x75, 0x36, 0xdf, 0x28, 0xfc, 0xcd, + 0x9a, 0xba, 0xc2, 0xcd, 0xb0, 0x30, 0xdb, 0xe7, 0x2e, 0x3c, + 0x92, 0x63, 0x1d, 0x30, 0x23, 0x74, 0xb1, 0xb8, 0xcc, 0xd7, + 0xb6, 0x90, 0x65, 0x73, 0xa2, 0x2a, 0x6e, 0x49, 0x95, 0x0d, + 0xab, 0x24, 0xdf, 0x2d, 0xbf, 0x76, 0x46, 0x01, 0x44, 0xe4, + 0x18, 0x8e, 0xd5, 0x9a, 0x76, 0xc9, 0xc6, 0xbc, 0xdb, 0x7f, + 0x80, 0x52, 0xc6, 0x40, 0x41, 0x12, 0x36, 0x7c, 0x80, 0x69, + 0xce, 0x7b, 0xe1, 0xa0, 0x53, 0xa2, 0xd6, 0x8f, 0x3f, 0xf7, + 0xd7, 0x61, 0x09, 0x70, 0xa2, 0xa0, 0xc6, 0xaf, 0xa0, 0xd0, + 0xfa, 0x13, 0xbf, 0xc0, 0x69, 0x15, 0xce, 0x15, 0xec, 0x24, + 0x4b, 0x6b, 0xdc, 0x93, 0x51, 0xc6, 0x82, 0x19, 0x92, 0x84, + 0x5d, 0x99, 0xb0, 0x90, 0x2c, 0xcc, 0x2a, 0x81, 0x6b, 0x22, + 0x64, 0x0a, 0xcb, 0x51, 0x25, 0x82, 0x50, 0x02, 0x2d, 0x3e, + 0xd4, 0x72, 0xb3, 0x0c, 0x15, 0x77, 0xd2, 0xca, 0x98, 0x2f, + 0x41, 0x93, 0x14, 0xb2, 0x7f, 0xa1, 0x97, 0xa3, 0xb8, 0x8a, + 0x56, 0x24, 0x38, 0xa7, 0x36, 0xc5, 0x01, 0xc0, 0x9f, 0x3f, + 0x3e, 0x9a, 0xf6, 0xe9, 0x16, 0x82, 0x01, 0x58, 0x70, 0x0e, + 0x0d, 0xbc, 0xfa, 0x03, 0x57, 0x65, 0xa8, 0x5a, 0x3d, 0x57, + 0x81, 0x23, 0xbe, 0x6e, 0xa9, 0xe8, 0x22, 0xdf, 0x2f, 0x70, + 0xeb, 0x0a, 0x03, 0x96, 0x6b, 0xef, 0x20, 0x9f, 0xf2, 0x62, + 0xe7, 0xb2, 0x6e, 0x3a, 0x1e, 0x40, 0x1f, 0xd2, 0x97, 0x48, + 0xd1, 0x18, 0xf0, 0xeb, 0x52, 0x58, 0x02, 0x26, 0xce, 0x75, + 0xb1, 0x3a, 0x9d, 0x5b, 0x52, 0x94, 0xb2, 0x6e, 0x0e, 0x3f, + 0x39, 0xb6, 0xd9, 0x8a, 0x9d, 0xe8, 0x7c, 0x83, 0x32, 0xcc, + 0x43, 0x35, 0x9b, 0x7a, 0xed, 0xb2, 0x1e, 0x51, 0x37, 0x6c, + 0x14, 0xd8, 0xb8, 0x55, 0xb3, 0x91, 0xef, 0x0c, 0x3a, 0xe5, + 0x77, 0xd0, 0xbd, 0xb0, 0x7d, 0x38, 0x84, 0x2a, 0x47, 0xb2, + 0xb6, 0xda, 0xd7, 0x75, 0xd6, 0x2e, 0x60, 0xc7, 0x10, 0x52, + 0xf7, 0xdd, 0x09, 0x15, 0x6f, 0x04, 0x31, 0xc3, 0x5a, 0x6b, + 0x0c, 0x60, 0x10, 0xa8, 0x6e, 0x20, 0xa9, 0xdd, 0xb7, 0x72, + 0xc3, 0x9e, 0x85, 0xd2, 0x8f, 0x16, 0x7e, 0x3d, 0xe0, 0x63, + 0x81, 0x32, 0xfd, 0xca, 0xbc, 0x0f, 0xef, 0x3e, 0x74, 0x6a, + 0xb1, 0x60, 0xc1, 0x10, 0x50, 0x7c, 0x67, 0xa4, 0x19, 0xa7, + 0xb8, 0xed, 0xe6, 0xf5, 0x4e, 0x41, 0x53, 0xa6, 0x72, 0x1b, + 0x2c, 0x33, 0x6a, 0x37, 0xf1, 0xb5, 0x1c, 0x01, 0x7d, 0xa2, + 0x1f, 0x2c, 0x4e, 0x0a, 0xbf, 0xd4, 0x2c, 0x24, 0x91, 0x58, + 0x62, 0xfb, 0xf8, 0x63, 0xd9, 0xf8, 0x78, 0xf5, 0xc7, 0x78, + 0x32, 0xda, 0x99, 0xeb, 0x58, 0x20, 0x25, 0x19, 0xb1, 0x06, + 0x7f, 0x6a, 0x29, 0x20, 0xdb, 0xc8, 0x22, 0x48, 0xa9, 0x7f, + 0x24, 0x54, 0x8d, 0x7d, 0x8d, 0xb1, 0x69, 0xb2, 0xa3, 0x98, + 0x14, 0x0f, 0xba, 0xfa, 0xb6, 0x15, 0xe8, 0x28, 0x99, 0x3f, + 0x30, 0x04, 0x50, 0xab, 0x5a, 0x3c, 0xf1, 0x97, 0xe1, 0xc8, + 0x0f, 0x0e, 0xb4, 0x11, 0x63, 0x5a, 0x79, 0x08, 0x48, 0x75, + 0xaf, 0x9b, 0xca, 0xd9, 0x13, 0x18, 0xcc, 0xb1, 0xb3, 0xee, + 0xdd, 0x63, 0xdd, 0xf4, 0x21, 0x98, 0x76, 0xe2, 0x3e, 0xd5, + 0x86, 0x23, 0x33, 0x7e, 0xc7, 0xb4, 0x35, 0x4b, 0xc2, 0x2d, + 0xe1, 0xe2, 0xb0, 0x6c, 0x8b, 0x9b, 0x20, 0x3d, 0x48, 0x24, + 0x7c, 0xea, 0xa1, 0x75, 0x27, 0xe5, 0xf4, 0x70, 0xeb, 0x3b, + 0xc7, 0x26, 0x37, 0x04, 0xff, 0x8a, 0x7a, 0xd0, 0xc2, 0xb7, + 0x84, 0xb7, 0x29, 0xfb, 0x0e, 0xa3, 0xa8, 0x71, 0xcd, 0x58, + 0x06, 0x36, 0xe2, 0xf2, 0x77, 0xcc, 0x0f, 0x78, 0x08, 0x2b, + 0xbb, 0xe3, 0x53, 0x05, 0x71, 0xdc, 0x6c, 0x37, 0x32, 0x91, + 0x46, 0x42, 0x4f, 0x21, 0xe0, 0x34, 0xad, 0x3f, 0x30, 0x5a, + 0xc7, 0x0d, 0x17, 0x19, 0x39, 0x31, 0x58, 0x69, 0x3c, 0x8c, + 0xbe, 0xe7, 0xa6, 0x3b, 0xad, 0xfb, 0x46, 0x89, 0x06, 0xc1, + 0x8c, 0x16, 0x9a, 0x06, 0x3a, 0xd0, 0x7e, 0xd6, 0xb0, 0x7b, + 0x7d, 0xf8, 0x91, 0x7c, 0xfa, 0xd9, 0x66, 0x39, 0xfa, 0xbc, + 0x57, 0xa7, 0x78, 0x8b, 0x36, 0x78, 0xc0, 0x1c, 0x0e, 0x23, + 0x05, 0x0e, 0x04, 0x61, 0x16, 0x34, 0xf9, 0xc6, 0x63, 0x58, + 0xdf, 0xf4, 0x52, 0xce, 0xd0, 0x0f, 0x0c, 0xec, 0xb1, 0x82, + 0xf4, 0x72, 0x73, 0x72, 0x3f, 0x02, 0xbe, 0xe3, 0x9c, 0x63, + 0x73, 0xc8, 0x21, 0x65, 0xba, 0x57, 0x52, 0xa9, 0x19, 0xac, + 0x68, 0x50, 0xbd, 0x2d, 0x72, 0x5b, 0x93, 0x0f, 0x1c, 0x81, + 0x77, 0xd7, 0x2e, 0xc3, 0x93, 0x52, 0x6e, 0xdc, 0x79, 0x52, + 0x9f, 0xe3, 0xde, 0xe1, 0xba, 0x58, 0x55, 0xab, 0x8a, 0xf2, + 0x35, 0x6a, 0xcf, 0x94, 0x1f, 0x17, 0xa4, 0x23, 0x2e, 0x8e, + 0x18, 0x21, 0xbe, 0x14, 0xfa, 0xe7, 0x59, 0xc5, 0x44, 0x34, + 0xce, 0x03, 0xf4, 0xb7, 0x75, 0xd3, 0x51, 0x55, 0xdf, 0xff, + 0xcf, 0x4f, 0x44, 0xee, 0x13, 0x9b, 0xcb, 0x12, 0xae, 0xe5, + 0x5b, 0x44, 0x65, 0x28, 0xcb, 0x6a, 0x9c, 0x24, 0x1d, 0xea, + 0x2d, 0x5e, 0xa5, 0xc3, 0x78, 0xad, 0xed, 0x0c, 0x05, 0xa6, + 0xaf, 0x95, 0x04, 0xd2, 0xb5, 0x91, 0x0e, 0xa0, 0x06, 0x77, + 0xc5, 0x82, 0xf6, 0xdd, 0x72, 0x83, 0x04, 0xcc, 0xb0, 0xab, + 0x7a, 0xf0, 0xb4, 0x4d, 0x36, 0x71, 0x72, 0x1a, 0x9a, 0x0d, + 0xcd, 0xa3, 0x11, 0xa8, 0x0d, 0x7d, 0x49, 0xce, 0x9c, 0x09, + 0x1d, 0x08, 0xa4, 0x39, 0x2e, 0x03, 0xdf, 0x3a, 0xc8, 0xfe, + 0x6a, 0x2b, 0x0b, 0x07, 0x80, 0x55, 0x8a, 0xa8, 0xe6, 0x0e, + 0xc9, 0x7e, 0x83, 0xce, 0x3a, 0x98, 0x98, 0x4e, 0x3e, 0x08, + 0x20, 0x8f, 0x10, 0xfc, 0xc1, 0xc4, 0xcf, 0x37, 0x8d, 0x69, + 0xd8, 0x57, 0x9d, 0x48, 0x80, 0x6a, 0xef, 0x0c, 0xdd, 0x27, + 0x99, 0xf9, 0xe7, 0xd0, 0xd2, 0x36, 0xd8, 0xed, 0x41, 0x14, + 0x1b, 0x10, + }; + WOLFSSL_SMALL_STACK_STATIC const byte ml_dsa_65_sig[] = { + 0x3e, 0xff, 0xf4, 0x48, 0x80, 0x2d, 0x88, 0x87, 0xf4, 0xcc, + 0xa4, 0x61, 0xe1, 0x27, 0x20, 0x55, 0x66, 0xc8, 0xfe, 0x3e, + 0xdd, 0xf5, 0x5c, 0x70, 0x6c, 0x54, 0xba, 0x50, 0x8a, 0xa2, + 0x4b, 0x88, 0xbc, 0xb8, 0x87, 0xf9, 0x4e, 0x50, 0x3a, 0x04, + 0x18, 0xb3, 0xf4, 0x5f, 0x77, 0x4a, 0x7e, 0xa8, 0xf5, 0xca, + 0x49, 0x00, 0xdc, 0x24, 0xaa, 0x05, 0x35, 0x0f, 0x34, 0xf7, + 0xbf, 0x09, 0xa6, 0xcf, 0x75, 0x37, 0x07, 0xcd, 0x07, 0x99, + 0x92, 0x1d, 0xc7, 0xc9, 0x17, 0x1c, 0xdd, 0x27, 0x8c, 0x66, + 0xf2, 0x8b, 0x75, 0xb0, 0x86, 0x2d, 0xbd, 0x51, 0x16, 0xc2, + 0x50, 0xe0, 0x7e, 0x0a, 0x21, 0x58, 0x93, 0x22, 0x06, 0xcb, + 0x85, 0x8b, 0xfd, 0x97, 0x61, 0xc0, 0xdb, 0xab, 0xfa, 0x4a, + 0x69, 0xef, 0x9c, 0xc1, 0x4e, 0xae, 0xb2, 0xb3, 0xa2, 0x74, + 0xa4, 0x94, 0x0a, 0xed, 0x39, 0x9e, 0xe8, 0x58, 0xeb, 0xfd, + 0x43, 0x05, 0x73, 0x38, 0xd6, 0xbb, 0xeb, 0xb9, 0x9d, 0x3b, + 0xf8, 0x85, 0xb4, 0x4b, 0x16, 0x5c, 0x9e, 0xfe, 0xb8, 0x13, + 0xf8, 0x68, 0x44, 0x90, 0x05, 0x61, 0xb3, 0xed, 0x6f, 0x47, + 0xc9, 0x50, 0xcf, 0x6c, 0xc0, 0xac, 0xdf, 0x4c, 0x4c, 0x1b, + 0x42, 0xce, 0x0a, 0x32, 0x69, 0xb0, 0xfd, 0x87, 0xef, 0xf3, + 0x9c, 0xcc, 0xba, 0x2f, 0x03, 0xd7, 0xdb, 0x76, 0xee, 0xa0, + 0x71, 0x4a, 0x80, 0xcb, 0x90, 0x9e, 0xbb, 0x8f, 0x00, 0x46, + 0x81, 0xe0, 0xde, 0xa6, 0x43, 0xb5, 0x37, 0x79, 0xf2, 0x35, + 0xce, 0x9e, 0xd2, 0xb1, 0x5b, 0xff, 0x91, 0xfb, 0x98, 0xc1, + 0xe1, 0x66, 0x2c, 0x00, 0x1b, 0x89, 0xf2, 0x57, 0x81, 0x73, + 0x7e, 0x9f, 0x8d, 0x50, 0xd0, 0xe0, 0xe3, 0x93, 0xf2, 0x87, + 0x41, 0x64, 0x6c, 0xb7, 0x09, 0x60, 0x91, 0x4e, 0x0b, 0xbe, + 0xbe, 0xd4, 0x98, 0xfa, 0x14, 0x8c, 0x46, 0x09, 0xfa, 0xaa, + 0x82, 0xd6, 0xdd, 0x65, 0x93, 0x39, 0x45, 0x50, 0x90, 0x10, + 0xae, 0x1b, 0xff, 0xab, 0x7e, 0x86, 0xda, 0xb9, 0x4d, 0xf1, + 0xc2, 0x00, 0x54, 0x66, 0xee, 0x40, 0xc0, 0x56, 0x2f, 0xe8, + 0x43, 0x89, 0xbb, 0xb8, 0x59, 0x24, 0x63, 0x45, 0x9a, 0xde, + 0x08, 0xf3, 0x16, 0x94, 0xd2, 0x8d, 0xee, 0xf9, 0xbe, 0x4f, + 0x29, 0xe1, 0x4b, 0x5e, 0x2b, 0x14, 0xef, 0x66, 0xe2, 0x12, + 0xf8, 0x87, 0x2e, 0xb1, 0x75, 0x8b, 0x21, 0xb5, 0x8f, 0x8e, + 0xc5, 0x0e, 0x60, 0x27, 0x15, 0xbd, 0x72, 0xe4, 0x26, 0x4e, + 0x62, 0x7d, 0x3a, 0x46, 0x49, 0x93, 0xa9, 0x52, 0x7f, 0xc2, + 0x27, 0xb9, 0x55, 0x6a, 0x45, 0x9f, 0x2c, 0x7a, 0x5a, 0xc9, + 0xf4, 0x55, 0xaf, 0x49, 0xb3, 0xd5, 0xc0, 0x84, 0xdb, 0x89, + 0x5f, 0x21, 0x04, 0xf5, 0x4c, 0x66, 0x1e, 0x2e, 0x69, 0xdf, + 0x5b, 0x14, 0x60, 0x89, 0x84, 0xf8, 0xa3, 0xaf, 0xdf, 0xb9, + 0x18, 0x5e, 0xbf, 0x81, 0x95, 0x9a, 0x5e, 0x4f, 0x24, 0x45, + 0xad, 0xab, 0xe2, 0x36, 0x7c, 0x19, 0xde, 0xc0, 0xf4, 0x1a, + 0x42, 0xb2, 0xc2, 0x58, 0x2f, 0x5f, 0xd0, 0x2e, 0x28, 0x33, + 0x59, 0x75, 0xc2, 0xde, 0x41, 0xe3, 0x9b, 0x85, 0x46, 0xad, + 0x6d, 0xf1, 0x06, 0xf0, 0x6a, 0xb9, 0xed, 0x71, 0x7b, 0xfd, + 0xf1, 0xc4, 0x56, 0xd8, 0xb3, 0x1a, 0x5f, 0x04, 0xae, 0xe8, + 0xce, 0xde, 0xa1, 0x6d, 0x46, 0x2a, 0x4f, 0x62, 0xee, 0x25, + 0xdf, 0x22, 0x21, 0xb2, 0x8f, 0x5f, 0x26, 0x33, 0x5a, 0xdd, + 0xbe, 0x08, 0xb3, 0x93, 0x16, 0x16, 0xad, 0x2e, 0x00, 0xb8, + 0x14, 0x0c, 0x10, 0xa3, 0x29, 0x89, 0x1f, 0xd7, 0x06, 0x7a, + 0x09, 0xf3, 0x84, 0xf9, 0x18, 0x04, 0x56, 0x2f, 0x7f, 0xbd, + 0x8e, 0x12, 0xdf, 0x4d, 0x58, 0x5c, 0x1d, 0x81, 0x0c, 0x7d, + 0x62, 0x02, 0xe0, 0xf9, 0x1b, 0x69, 0xe9, 0x38, 0x45, 0x84, + 0x2d, 0x9a, 0x4a, 0x3d, 0x7b, 0x48, 0xd5, 0x0d, 0x76, 0xba, + 0xff, 0x20, 0x00, 0xf8, 0x42, 0x7f, 0xd2, 0x25, 0x70, 0x90, + 0x88, 0xb3, 0x98, 0xac, 0xe9, 0xd9, 0xac, 0x58, 0xa6, 0x49, + 0xcc, 0x93, 0xa5, 0x04, 0x0c, 0x68, 0x53, 0x64, 0x72, 0x8c, + 0xfc, 0x8d, 0x61, 0xeb, 0x3f, 0x93, 0x8b, 0x85, 0x98, 0x05, + 0xce, 0x06, 0xd7, 0xbf, 0xbb, 0xa5, 0x22, 0xda, 0xe9, 0x8a, + 0x29, 0x30, 0x5e, 0x82, 0xe4, 0x46, 0x7c, 0x36, 0x5e, 0xf5, + 0xc7, 0xe3, 0x09, 0xdf, 0x20, 0x76, 0x73, 0x33, 0x31, 0x75, + 0xc2, 0x99, 0xe9, 0x74, 0x43, 0x82, 0xb1, 0xeb, 0x74, 0x6f, + 0xad, 0x59, 0x48, 0x12, 0xa0, 0x24, 0xe3, 0x38, 0x48, 0x61, + 0x0c, 0xf6, 0x38, 0x83, 0x3a, 0xcd, 0xd6, 0x45, 0x10, 0x0e, + 0x09, 0x79, 0x31, 0x30, 0x80, 0xfb, 0x34, 0x60, 0x1e, 0x72, + 0x98, 0xe9, 0x5c, 0xbf, 0xab, 0x21, 0x7f, 0xa3, 0x19, 0x7e, + 0x8c, 0xa9, 0xa7, 0xfc, 0x25, 0xe0, 0x8e, 0x6d, 0xa1, 0xb9, + 0x7b, 0x5b, 0x37, 0x33, 0x96, 0xd8, 0x6e, 0x7a, 0xce, 0xa6, + 0x1a, 0xbd, 0xe6, 0x6e, 0x62, 0xc4, 0x8c, 0x69, 0xfe, 0xe4, + 0xcb, 0x0a, 0xa1, 0x6c, 0x66, 0x0e, 0x1a, 0x5e, 0xb9, 0xd1, + 0x4a, 0xa3, 0x91, 0x39, 0xcf, 0x85, 0x07, 0x5b, 0xaf, 0x99, + 0x11, 0xca, 0xee, 0x6f, 0x2e, 0x33, 0xda, 0x60, 0xbf, 0xd6, + 0xa0, 0x7a, 0xdb, 0x91, 0x13, 0xb7, 0xa3, 0x5d, 0x0e, 0x1e, + 0x3b, 0xf9, 0x7a, 0x3e, 0x4f, 0x8d, 0xb3, 0x81, 0xe8, 0x0c, + 0x4d, 0x48, 0x61, 0x06, 0x14, 0x0f, 0x3e, 0x33, 0x9e, 0xea, + 0xa6, 0xd8, 0xd8, 0x4d, 0x9b, 0x00, 0x34, 0x0d, 0x31, 0x62, + 0x54, 0x93, 0x04, 0xd2, 0x02, 0x21, 0x38, 0x91, 0x58, 0xca, + 0x77, 0xd3, 0x6c, 0xd1, 0x94, 0x05, 0xfa, 0x30, 0x6a, 0x0b, + 0xf0, 0x52, 0x52, 0xb7, 0xdb, 0x34, 0xff, 0x18, 0x5c, 0x78, + 0x25, 0x44, 0x39, 0xe4, 0x54, 0x8a, 0xf1, 0x49, 0x04, 0xab, + 0x8a, 0x5f, 0x87, 0xe1, 0x6e, 0x1a, 0xf2, 0xba, 0x39, 0xb4, + 0x7c, 0x71, 0x5b, 0xbe, 0x8d, 0xbb, 0xed, 0x3b, 0xed, 0x20, + 0x95, 0xdf, 0xa7, 0x50, 0xb5, 0x66, 0xff, 0xd0, 0x3a, 0x92, + 0xde, 0xf2, 0xa3, 0xf2, 0xd6, 0x48, 0x6b, 0xd8, 0xef, 0x80, + 0x4d, 0xc2, 0x3c, 0xc7, 0xc6, 0x6e, 0xdf, 0xd1, 0x54, 0xfb, + 0x22, 0xac, 0x1a, 0x11, 0x81, 0x02, 0xc7, 0x66, 0xe0, 0xf3, + 0xad, 0x0b, 0xd0, 0xec, 0xae, 0x93, 0x53, 0xa5, 0xbf, 0xa5, + 0x17, 0x59, 0x14, 0x7d, 0x7e, 0x1e, 0x26, 0x15, 0x7a, 0x74, + 0xfb, 0xb1, 0x7a, 0x0e, 0xd3, 0xb5, 0x7c, 0x8c, 0x3a, 0xd7, + 0x45, 0x38, 0x55, 0xae, 0x4b, 0xe1, 0xfe, 0x5b, 0x57, 0x20, + 0x73, 0x38, 0xb9, 0x67, 0x34, 0xb1, 0xf3, 0x15, 0xb0, 0xb7, + 0x46, 0xa7, 0x1b, 0x19, 0x6d, 0xaf, 0x5e, 0x2c, 0x9c, 0x02, + 0x3f, 0x0f, 0xa3, 0x56, 0x2f, 0x9f, 0x1a, 0x82, 0x0e, 0xb4, + 0x46, 0xf5, 0x69, 0x89, 0x91, 0xf9, 0x2d, 0x99, 0x45, 0xa6, + 0x3c, 0x82, 0x74, 0xac, 0xeb, 0x58, 0x4a, 0xdd, 0x03, 0xaf, + 0xd1, 0x0a, 0xca, 0x4b, 0xe8, 0x4c, 0x63, 0xd4, 0x73, 0x94, + 0xbf, 0xd1, 0xc5, 0x8a, 0x3f, 0x6e, 0x58, 0xfc, 0x70, 0x76, + 0x69, 0x92, 0x05, 0xe0, 0xb9, 0xed, 0x5f, 0x19, 0xd7, 0x6f, + 0xd0, 0x35, 0xbb, 0x5a, 0x8d, 0x45, 0xac, 0x43, 0xcb, 0x74, + 0xcc, 0x92, 0xc3, 0x62, 0x56, 0x02, 0xb0, 0x0a, 0xb6, 0x88, + 0x40, 0x6f, 0x76, 0x1b, 0x89, 0xe4, 0x51, 0xeb, 0x7e, 0x08, + 0x8c, 0xce, 0x24, 0xc8, 0xd8, 0x58, 0xbd, 0x0e, 0x48, 0x57, + 0xc8, 0x9f, 0xad, 0x64, 0xcf, 0x69, 0x72, 0x35, 0xbf, 0x04, + 0x09, 0xfb, 0x0e, 0x62, 0x92, 0x76, 0x8b, 0x8d, 0xd5, 0x16, + 0xa2, 0x51, 0xdb, 0x71, 0xa9, 0x08, 0xb2, 0xf9, 0x1e, 0x07, + 0xe7, 0xf8, 0xf4, 0x79, 0x59, 0x2f, 0x8f, 0xf1, 0x5b, 0x45, + 0xe1, 0xb8, 0xb7, 0xef, 0x86, 0x69, 0x71, 0x51, 0x1c, 0xe5, + 0x61, 0xee, 0xb8, 0x1d, 0xa7, 0xdc, 0x48, 0xba, 0x51, 0xa5, + 0x70, 0x4d, 0xfd, 0x2c, 0x46, 0x21, 0x63, 0x0c, 0x9f, 0xb7, + 0x68, 0x58, 0x7b, 0xb3, 0x7d, 0x64, 0xfd, 0xaf, 0x87, 0x3d, + 0x86, 0x06, 0x36, 0x8a, 0x6d, 0xfe, 0xdf, 0xce, 0xa8, 0x16, + 0x42, 0x46, 0x15, 0xe5, 0xcf, 0x48, 0xa6, 0x4b, 0xe5, 0xc1, + 0xad, 0x14, 0x3a, 0x6d, 0xeb, 0xf9, 0xc9, 0x32, 0xd1, 0x82, + 0x60, 0x23, 0xf0, 0xff, 0xa7, 0xe6, 0x2e, 0xd6, 0x8d, 0x9d, + 0x4f, 0x6d, 0xb3, 0xc4, 0xad, 0xd9, 0xf0, 0xf5, 0x5c, 0x47, + 0x6c, 0x67, 0xf4, 0x0e, 0x18, 0x25, 0xbb, 0x67, 0xfa, 0x11, + 0x70, 0xd5, 0xbc, 0x3a, 0x34, 0xae, 0xa2, 0x76, 0x4b, 0x9f, + 0x59, 0x01, 0x18, 0x69, 0x44, 0xc4, 0x8a, 0xff, 0x00, 0xfc, + 0x2a, 0x45, 0xa9, 0x50, 0x8e, 0x37, 0x6b, 0x78, 0x14, 0x69, + 0xe7, 0x92, 0x3d, 0xf1, 0x34, 0xd5, 0x5c, 0x48, 0xc2, 0x50, + 0xb3, 0x0c, 0x7d, 0x54, 0x05, 0x31, 0x1e, 0xce, 0xaa, 0xc1, + 0x4c, 0xc9, 0x13, 0x33, 0x26, 0x1f, 0x56, 0x7e, 0x7e, 0x74, + 0xd3, 0x78, 0x3e, 0x00, 0x4a, 0xc8, 0xc6, 0x20, 0x5b, 0xb8, + 0x80, 0xb4, 0x13, 0x35, 0x23, 0xff, 0x50, 0xde, 0x25, 0x92, + 0x67, 0x08, 0xb8, 0xa3, 0xb6, 0x39, 0xd4, 0x30, 0xdc, 0xa5, + 0x88, 0x8a, 0x44, 0x08, 0x8b, 0x6d, 0x2e, 0xb8, 0xf3, 0x0d, + 0x23, 0xda, 0x35, 0x08, 0x5a, 0x92, 0xe1, 0x40, 0xac, 0xc7, + 0x15, 0x05, 0x8a, 0xdf, 0xe5, 0x71, 0xd8, 0xe0, 0xd7, 0x9f, + 0x58, 0x03, 0xf4, 0xec, 0x99, 0x3c, 0xb0, 0xe0, 0x07, 0x42, + 0x9b, 0xa0, 0x10, 0x7c, 0x24, 0x60, 0x19, 0xe8, 0x84, 0xd4, + 0xb1, 0x86, 0x19, 0x0a, 0x52, 0x70, 0x6e, 0xc2, 0x3c, 0xe2, + 0x73, 0x8d, 0xfe, 0xf8, 0x7e, 0xdf, 0x78, 0xe7, 0x92, 0x36, + 0x10, 0xf7, 0x2d, 0x76, 0x93, 0x8a, 0x0f, 0x20, 0xc8, 0x30, + 0x59, 0x81, 0xff, 0x3b, 0x70, 0x22, 0xce, 0x6e, 0x23, 0x68, + 0x35, 0x59, 0x0e, 0xcf, 0xf8, 0xf6, 0xcd, 0x45, 0xb6, 0x41, + 0xba, 0xda, 0xe6, 0x35, 0x0b, 0xd1, 0xef, 0xa5, 0x7c, 0xe0, + 0xb9, 0x6f, 0x5b, 0xa9, 0xab, 0x87, 0xe3, 0x3b, 0x92, 0xce, + 0xbe, 0xfe, 0xf7, 0xab, 0x82, 0xa3, 0xe6, 0xbd, 0xfe, 0xce, + 0xa6, 0x17, 0xcb, 0x4c, 0xb4, 0x4c, 0xd6, 0xfe, 0xbb, 0x1c, + 0x10, 0xde, 0x29, 0x3e, 0x92, 0x66, 0x20, 0xf8, 0xee, 0x83, + 0x86, 0x66, 0xe0, 0x66, 0x97, 0x85, 0xaf, 0x3a, 0x8f, 0xa9, + 0x97, 0x09, 0xde, 0x77, 0xda, 0xb7, 0x81, 0x41, 0x10, 0xca, + 0x66, 0x00, 0xec, 0xf8, 0x46, 0x73, 0xa6, 0x24, 0x36, 0xec, + 0x25, 0xbe, 0x93, 0x5e, 0x74, 0x9f, 0xbe, 0xf4, 0x84, 0x15, + 0x9c, 0xc5, 0x43, 0xd9, 0xea, 0x5a, 0xcc, 0x2c, 0x4e, 0x2e, + 0x4e, 0x32, 0xa6, 0x88, 0xb1, 0x25, 0x34, 0xf7, 0xba, 0xab, + 0xd3, 0xa0, 0xc2, 0x06, 0x70, 0xed, 0x66, 0x4d, 0x71, 0x34, + 0xaf, 0x10, 0x99, 0x10, 0x11, 0x4f, 0xe4, 0x7d, 0x42, 0x03, + 0x04, 0x02, 0xc2, 0x41, 0x85, 0x1e, 0xc4, 0xca, 0xae, 0xf0, + 0x83, 0x78, 0x34, 0x98, 0x55, 0x8b, 0x4c, 0xa0, 0x14, 0xea, + 0x15, 0x2c, 0xa1, 0x30, 0xd8, 0xcf, 0xac, 0xd4, 0xca, 0xf7, + 0xf4, 0xc4, 0x20, 0xca, 0xa1, 0xef, 0xce, 0x5d, 0x6b, 0x32, + 0xb6, 0xf0, 0x22, 0x08, 0x49, 0x21, 0x0c, 0x57, 0x0f, 0xf8, + 0xc0, 0xd2, 0xe3, 0xc0, 0xa6, 0x31, 0xc7, 0x87, 0x96, 0xa9, + 0xfe, 0x69, 0xa0, 0x7f, 0xf7, 0x8e, 0x31, 0x92, 0x37, 0xce, + 0xde, 0x36, 0x3f, 0xf5, 0x7d, 0x07, 0xaa, 0xa9, 0x43, 0xee, + 0x3c, 0x8c, 0xd3, 0x7d, 0x2c, 0xa6, 0xc3, 0x98, 0xab, 0xbe, + 0x90, 0x4c, 0xa5, 0x5a, 0x27, 0xeb, 0x0e, 0xed, 0xa1, 0x1e, + 0x3e, 0x44, 0xa3, 0x4b, 0x49, 0xad, 0xe4, 0x19, 0x90, 0xc8, + 0x9e, 0x6e, 0x5b, 0x68, 0xbc, 0x37, 0x54, 0xaf, 0xa6, 0xb7, + 0x71, 0x5c, 0x5d, 0x74, 0x83, 0xf4, 0xb9, 0x2f, 0xe5, 0x1a, + 0x0c, 0x73, 0x30, 0x56, 0x82, 0x04, 0xb3, 0x0e, 0x32, 0x98, + 0xfd, 0x27, 0xa0, 0xfe, 0xe0, 0xe0, 0xf5, 0xb7, 0xe0, 0x47, + 0x2a, 0xa6, 0x4a, 0xe0, 0xfc, 0xb5, 0xd8, 0xfd, 0x01, 0xfe, + 0x4e, 0x96, 0x17, 0x06, 0xcc, 0x92, 0x7c, 0xa1, 0x2f, 0xb5, + 0x04, 0x08, 0x76, 0xcc, 0x40, 0x75, 0x37, 0x4d, 0x2c, 0x74, + 0xcd, 0xc7, 0x62, 0xa6, 0xe6, 0xd8, 0x9e, 0x21, 0x7f, 0x2e, + 0xf5, 0x2c, 0xcf, 0x0b, 0x3f, 0xd7, 0xed, 0x17, 0xee, 0x92, + 0xaf, 0xf9, 0xa4, 0x71, 0x5d, 0x5f, 0x81, 0xb9, 0x2f, 0x12, + 0xe5, 0x57, 0x2d, 0x1e, 0xf1, 0x67, 0x47, 0x2a, 0xde, 0xab, + 0xf2, 0xea, 0xb7, 0xb5, 0x83, 0xdc, 0x46, 0xd4, 0xf3, 0x25, + 0x65, 0x15, 0x4d, 0x66, 0x34, 0x54, 0xab, 0x94, 0x89, 0x80, + 0x39, 0xd3, 0x39, 0xe3, 0xa2, 0xb1, 0x91, 0x2a, 0x5e, 0x55, + 0xe1, 0xa4, 0x0f, 0xc3, 0x4b, 0x5a, 0xa5, 0x4a, 0xb3, 0xc0, + 0x40, 0xea, 0x16, 0x0c, 0xd5, 0x2d, 0x83, 0x3e, 0x28, 0x20, + 0xac, 0x0a, 0x1b, 0x5b, 0x87, 0xcf, 0xf1, 0x51, 0xd6, 0xda, + 0xd1, 0xc9, 0xb1, 0x27, 0xf5, 0x62, 0x03, 0x10, 0xcf, 0x76, + 0x28, 0xa2, 0xea, 0x4b, 0x76, 0xaf, 0x9c, 0x3d, 0xf1, 0x1b, + 0x92, 0xff, 0xb0, 0xca, 0x16, 0xa2, 0x29, 0x94, 0x0e, 0x1e, + 0x51, 0xfb, 0xe1, 0x2b, 0x5a, 0x50, 0xfd, 0xaf, 0xab, 0xd7, + 0x32, 0xaa, 0x43, 0xa7, 0xcb, 0xd3, 0xd3, 0xe9, 0x1e, 0xb1, + 0x70, 0xd2, 0xbb, 0x15, 0x68, 0x49, 0xee, 0x6e, 0x1e, 0xc5, + 0x64, 0x4b, 0x26, 0x08, 0xe7, 0x32, 0x1c, 0x1d, 0x73, 0x8f, + 0x42, 0xfe, 0xeb, 0x67, 0x89, 0x42, 0x25, 0x40, 0xd6, 0x15, + 0x02, 0x55, 0x87, 0xe3, 0x87, 0xdd, 0x78, 0xc1, 0x01, 0x94, + 0xbc, 0x30, 0x5f, 0xbd, 0x89, 0xe1, 0xb0, 0x5c, 0xcd, 0xb7, + 0x68, 0xd5, 0xbb, 0xf4, 0xa0, 0x5d, 0x3d, 0xdd, 0x89, 0x12, + 0xc7, 0xb8, 0x5d, 0x51, 0x8a, 0xf4, 0xd5, 0x05, 0xc6, 0xdd, + 0x7b, 0x44, 0x38, 0xce, 0xb1, 0x24, 0x24, 0xe1, 0x9d, 0xc7, + 0x80, 0x86, 0x46, 0x2a, 0xd2, 0xa4, 0x0f, 0xec, 0xd3, 0x6b, + 0x31, 0xc0, 0x05, 0x31, 0xff, 0xf5, 0x1a, 0x33, 0x35, 0x68, + 0x2e, 0x68, 0x24, 0xbd, 0x62, 0xfc, 0x46, 0x79, 0x54, 0x5e, + 0x1e, 0x27, 0x93, 0x07, 0xed, 0x78, 0x94, 0x50, 0x42, 0x98, + 0x53, 0x88, 0xb7, 0x57, 0x04, 0x7d, 0xe2, 0xe1, 0xb5, 0x61, + 0x9e, 0x5a, 0x88, 0x31, 0x3e, 0x6c, 0x69, 0xbc, 0x8a, 0xe6, + 0xbc, 0x9d, 0x20, 0x7a, 0x86, 0xe5, 0x73, 0x93, 0x02, 0xc5, + 0xde, 0xdc, 0xcc, 0xbf, 0x89, 0x76, 0xdc, 0x4e, 0xa1, 0x89, + 0xe7, 0x95, 0x75, 0x01, 0xf7, 0x43, 0xaa, 0x3f, 0x1b, 0xb7, + 0x8c, 0x92, 0x66, 0x22, 0xbe, 0x34, 0xf1, 0x2f, 0xc3, 0xc7, + 0x21, 0xaf, 0x25, 0x57, 0x9a, 0x2c, 0x80, 0xf0, 0xb3, 0xdd, + 0xb3, 0xb2, 0x82, 0x97, 0x85, 0x73, 0xa9, 0x76, 0xe4, 0x37, + 0xa2, 0x65, 0xf9, 0xc1, 0x3d, 0x11, 0xbf, 0xcb, 0x3c, 0x8e, + 0xdd, 0xaf, 0x98, 0x57, 0x6a, 0xe1, 0x33, 0xe7, 0xf0, 0xff, + 0xed, 0x61, 0x53, 0xfe, 0x1e, 0x2d, 0x06, 0x2f, 0xb8, 0x9e, + 0xf9, 0xa5, 0x21, 0x06, 0xf3, 0x72, 0xf6, 0xa3, 0x77, 0xbb, + 0x63, 0x6e, 0x52, 0xb2, 0x42, 0x47, 0x9b, 0x92, 0x4c, 0xf8, + 0xd2, 0xe6, 0x02, 0xa5, 0x57, 0x2d, 0x6f, 0x30, 0x05, 0xe2, + 0xfd, 0x33, 0xe5, 0xb6, 0x23, 0x85, 0x89, 0x4a, 0x99, 0x20, + 0x33, 0xea, 0x2f, 0xcd, 0x28, 0x27, 0xff, 0xfd, 0x2e, 0x73, + 0x52, 0x29, 0x19, 0x7c, 0x65, 0xf5, 0x6a, 0xaa, 0x97, 0x6e, + 0xe9, 0x42, 0xa8, 0x55, 0x97, 0x56, 0x92, 0x9d, 0xd2, 0xd1, + 0xc4, 0x30, 0xaa, 0x95, 0x86, 0xba, 0x71, 0xdd, 0x2f, 0xf1, + 0xed, 0x66, 0x54, 0x78, 0x4b, 0x13, 0x31, 0xed, 0x9d, 0x2c, + 0xae, 0x0a, 0xc3, 0xca, 0xfb, 0x3f, 0x92, 0x92, 0x30, 0xa3, + 0x8e, 0xc8, 0x6d, 0x7b, 0x42, 0xd5, 0x5d, 0x99, 0x79, 0x42, + 0x28, 0x63, 0x9f, 0x97, 0x8e, 0x94, 0x6d, 0x1d, 0xb4, 0x21, + 0x39, 0xc7, 0x64, 0x48, 0x44, 0x5e, 0x15, 0x10, 0x45, 0x9f, + 0x8a, 0x01, 0x45, 0x20, 0x5c, 0xd1, 0x28, 0x0d, 0xe9, 0xfb, + 0xa9, 0x72, 0x68, 0x07, 0x31, 0x20, 0x75, 0x76, 0x82, 0x76, + 0x5d, 0x7c, 0xc1, 0x5d, 0x42, 0x40, 0xfd, 0x06, 0xa9, 0x66, + 0xb0, 0x36, 0x55, 0x86, 0x6c, 0x96, 0xbd, 0xb8, 0xf7, 0x36, + 0x87, 0xf2, 0xa1, 0x37, 0xd8, 0x2d, 0x83, 0xf5, 0xdc, 0xd8, + 0xde, 0x9e, 0x69, 0xd6, 0xe1, 0x0d, 0xd5, 0x93, 0xc5, 0xee, + 0xba, 0xd3, 0x40, 0x71, 0xbb, 0xc7, 0xbb, 0x50, 0x1a, 0x10, + 0x80, 0x99, 0x62, 0x1c, 0xe3, 0x1f, 0xa2, 0xcc, 0x98, 0xe1, + 0xaa, 0xff, 0xd9, 0x69, 0xe7, 0x87, 0x04, 0x87, 0x76, 0xec, + 0x55, 0x18, 0xaf, 0x82, 0x34, 0x4d, 0x4f, 0xf7, 0x57, 0x1f, + 0xa5, 0x43, 0xcc, 0xe9, 0x7a, 0x4a, 0xc8, 0xb4, 0x1f, 0x61, + 0x40, 0x5e, 0x1d, 0x11, 0xdd, 0xdc, 0xdc, 0xb4, 0x57, 0xf9, + 0x47, 0x96, 0xbc, 0x47, 0x29, 0xf8, 0xf2, 0x43, 0xc4, 0xa0, + 0x8c, 0x14, 0x5e, 0x73, 0x52, 0xac, 0xac, 0x39, 0x3b, 0x06, + 0x19, 0x1a, 0xca, 0x22, 0xc8, 0x96, 0x12, 0x2e, 0x4c, 0x7b, + 0xa0, 0x96, 0x53, 0x16, 0xce, 0x6d, 0x6e, 0xac, 0xb2, 0x07, + 0x17, 0x22, 0x07, 0x30, 0x20, 0x84, 0x9b, 0x0e, 0x92, 0x31, + 0x07, 0xe2, 0x77, 0xcd, 0x6a, 0x3e, 0x16, 0x4f, 0xd6, 0x12, + 0x88, 0x8a, 0x70, 0x5a, 0x87, 0xd8, 0xb9, 0xef, 0x76, 0xab, + 0x14, 0x65, 0x87, 0x3a, 0xef, 0xd8, 0x0e, 0x24, 0x40, 0x73, + 0x93, 0x2b, 0xbf, 0xac, 0xfe, 0x96, 0x8a, 0x9d, 0x12, 0xe6, + 0xc1, 0x5b, 0x00, 0x3b, 0x23, 0xee, 0xe2, 0x10, 0xb6, 0xbe, + 0x0e, 0x2f, 0xa2, 0x77, 0x16, 0x17, 0xfc, 0x4b, 0x2c, 0xd7, + 0x9c, 0xad, 0x66, 0xb4, 0xf2, 0xfd, 0xc1, 0xaf, 0x81, 0x12, + 0xd9, 0xed, 0x14, 0x32, 0xcf, 0x1b, 0xee, 0xc6, 0x63, 0xe8, + 0xe5, 0xe6, 0xb6, 0x91, 0x8d, 0x1b, 0x90, 0x75, 0x5d, 0x69, + 0x4c, 0x5d, 0xd6, 0xac, 0x79, 0xe8, 0xb6, 0xdf, 0xbf, 0x43, + 0x39, 0xd3, 0xb8, 0xf0, 0x39, 0xf4, 0x90, 0xaf, 0x73, 0x26, + 0xc7, 0x73, 0x6f, 0x93, 0xbb, 0xce, 0x6e, 0xdc, 0x1c, 0xd0, + 0x36, 0x23, 0x17, 0xb2, 0x39, 0x37, 0x15, 0xf5, 0x3a, 0x61, + 0xa9, 0x15, 0x52, 0x6e, 0xc5, 0x3a, 0x63, 0x79, 0x5d, 0x45, + 0xdc, 0x3a, 0xd5, 0x26, 0x01, 0x56, 0x97, 0x80, 0x7f, 0x83, + 0xf9, 0xec, 0xde, 0xa0, 0x2e, 0x7a, 0xb2, 0x4b, 0x04, 0x63, + 0x60, 0x05, 0xce, 0x96, 0xeb, 0xe0, 0x0a, 0x5f, 0xb0, 0x7e, + 0x6d, 0x0a, 0x24, 0x32, 0x47, 0x82, 0x7f, 0x0b, 0xd7, 0xe9, + 0xd5, 0x14, 0xa9, 0x6b, 0x10, 0x5d, 0x1e, 0x1f, 0x8a, 0xad, + 0x70, 0x91, 0xd4, 0x33, 0x1d, 0xc2, 0x3e, 0xf8, 0xc8, 0x52, + 0x9a, 0x27, 0x1f, 0x45, 0x2f, 0xb5, 0xc7, 0xb1, 0x8b, 0xf9, + 0xc6, 0x7b, 0xb5, 0x92, 0x7a, 0xdd, 0xeb, 0x07, 0x6c, 0x6f, + 0x11, 0xd7, 0x5b, 0x56, 0x56, 0xec, 0x88, 0x1c, 0xc9, 0xb4, + 0xe8, 0x43, 0xab, 0xdf, 0x0b, 0xc5, 0x28, 0xba, 0x70, 0x5d, + 0xd3, 0xb2, 0xe2, 0xcf, 0xa7, 0xbb, 0x53, 0x04, 0x6b, 0x73, + 0xdf, 0x27, 0xa6, 0x63, 0x58, 0xe1, 0x39, 0x26, 0x2a, 0x1a, + 0x21, 0xec, 0xbb, 0x5f, 0x46, 0x98, 0x3d, 0x48, 0x66, 0xfe, + 0xf3, 0xcb, 0xfc, 0x6e, 0x99, 0x82, 0x91, 0xce, 0x53, 0xfd, + 0x75, 0xc9, 0xb6, 0x08, 0xa8, 0xf3, 0xe4, 0xe0, 0xa0, 0x24, + 0x45, 0xb4, 0x69, 0x11, 0xac, 0x06, 0x1c, 0x39, 0x71, 0xcf, + 0x72, 0xfc, 0x77, 0x9b, 0x5f, 0xf4, 0x8b, 0x02, 0x31, 0xf3, + 0x67, 0xd1, 0x9b, 0xe0, 0x49, 0xa4, 0x69, 0x20, 0x99, 0x38, + 0xa7, 0xf5, 0x43, 0xd2, 0x45, 0x9f, 0x7a, 0xe7, 0xad, 0x7e, + 0x36, 0xee, 0xfd, 0x8c, 0xc5, 0x6a, 0x12, 0x58, 0x15, 0x3b, + 0x02, 0x81, 0x73, 0x8b, 0x10, 0xda, 0x21, 0xc7, 0x1d, 0x38, + 0xd8, 0x40, 0x7a, 0xa3, 0x59, 0x55, 0x35, 0x44, 0xa9, 0x9c, + 0xf5, 0xf4, 0xe4, 0x14, 0xc1, 0xc4, 0x15, 0x26, 0x01, 0xe3, + 0x31, 0xbf, 0xdc, 0xbc, 0x69, 0x0b, 0xcf, 0x71, 0x8c, 0xdb, + 0x16, 0xab, 0x36, 0x3e, 0xb3, 0xa4, 0x9f, 0xcc, 0xbf, 0xa2, + 0x93, 0x93, 0x9a, 0x3b, 0xaf, 0x72, 0x8d, 0x8b, 0x92, 0x44, + 0x5d, 0x6f, 0xc5, 0xf0, 0xdc, 0x65, 0x62, 0xea, 0xba, 0x33, + 0xe7, 0x6c, 0xa4, 0x35, 0xcf, 0xd9, 0xbc, 0x3c, 0xbf, 0x25, + 0x7b, 0x7c, 0x0b, 0x62, 0x92, 0x5a, 0x66, 0x63, 0xe1, 0x27, + 0x89, 0x12, 0xe2, 0xae, 0xb7, 0xf8, 0x04, 0x70, 0xda, 0x4a, + 0x3d, 0xa6, 0x67, 0x12, 0x14, 0x9e, 0x8e, 0xdc, 0xa2, 0xf2, + 0x3d, 0xc7, 0xd2, 0x8f, 0x18, 0x3a, 0x53, 0x8c, 0x83, 0x5d, + 0x66, 0xbb, 0x9f, 0x8c, 0xaf, 0xa8, 0x73, 0x08, 0x2e, 0x6d, + 0x30, 0xa0, 0xd0, 0x20, 0x94, 0x48, 0xad, 0x5e, 0x31, 0xfd, + 0x5e, 0xfd, 0xf9, 0xb5, 0xa2, 0x39, 0xa3, 0xb9, 0xdf, 0x4d, + 0xa4, 0xb1, 0x54, 0xcc, 0x92, 0x63, 0x2c, 0x66, 0x2d, 0x01, + 0x88, 0x8b, 0x7d, 0xc6, 0x5c, 0x9f, 0x18, 0x9a, 0x53, 0x91, + 0x59, 0x66, 0x70, 0xd7, 0x81, 0x0e, 0xa1, 0x3c, 0x7e, 0x86, + 0x85, 0x64, 0x38, 0x6f, 0xec, 0x76, 0x57, 0x80, 0x41, 0x9d, + 0xef, 0x61, 0xb8, 0xb2, 0x8a, 0xeb, 0xe9, 0x26, 0xbb, 0x69, + 0xb3, 0x8d, 0xd4, 0x6b, 0x05, 0xd8, 0x55, 0x1c, 0xbd, 0x9f, + 0x6b, 0x23, 0x46, 0x2b, 0xf7, 0xfb, 0x4d, 0x33, 0x3b, 0x21, + 0x6d, 0xea, 0x1b, 0x15, 0xaf, 0x0f, 0x8c, 0x98, 0xc8, 0xf4, + 0xd1, 0x3c, 0xdd, 0x21, 0xd0, 0x45, 0xdc, 0xaf, 0x89, 0x89, + 0xbf, 0xde, 0xbf, 0x46, 0x9e, 0x9e, 0x18, 0x56, 0x9d, 0x05, + 0x4d, 0x63, 0x5f, 0x1c, 0xd9, 0x15, 0xd1, 0x43, 0x17, 0x0c, + 0x48, 0x3d, 0x36, 0x8b, 0x14, 0x87, 0xc8, 0x10, 0x44, 0xdf, + 0x9c, 0xfd, 0x6e, 0x88, 0x88, 0xae, 0x7f, 0x7f, 0x67, 0xa3, + 0x33, 0x4d, 0xa3, 0x84, 0x8b, 0x58, 0x07, 0x17, 0xd8, 0x1d, + 0x9e, 0x43, 0xd6, 0x41, 0x9c, 0xff, 0xfa, 0x35, 0xa2, 0x42, + 0xa9, 0x5d, 0xa9, 0x4b, 0x95, 0x23, 0x6a, 0x6e, 0x42, 0xd7, + 0xa2, 0x0a, 0x70, 0x00, 0x61, 0x8b, 0x45, 0xbb, 0xac, 0x20, + 0x27, 0xcd, 0xfc, 0x61, 0x17, 0xfe, 0xab, 0x6b, 0xe8, 0xe0, + 0x51, 0xab, 0xa3, 0xbf, 0xe4, 0x85, 0x69, 0x8e, 0xd7, 0xa6, + 0x62, 0x33, 0x8f, 0x7c, 0xba, 0x48, 0xfa, 0x83, 0x94, 0xa5, + 0xdf, 0xa1, 0x76, 0xdc, 0xa9, 0x4b, 0x3c, 0x27, 0xff, 0xd9, + 0xbe, 0xf4, 0x80, 0x5a, 0xca, 0x33, 0xf3, 0x9a, 0x1d, 0xf8, + 0xf3, 0xe1, 0x83, 0x27, 0x0b, 0x59, 0x87, 0x31, 0x7d, 0x4f, + 0x5a, 0x5e, 0xe1, 0xbe, 0xa9, 0x68, 0xe9, 0x6f, 0x10, 0x0a, + 0xe2, 0x70, 0x05, 0xaa, 0xcb, 0xdd, 0x41, 0xd7, 0x49, 0x8a, + 0x98, 0xa0, 0x40, 0x2d, 0xc6, 0x56, 0x49, 0xca, 0x60, 0x16, + 0x9c, 0x38, 0xc9, 0xfe, 0x99, 0x15, 0xfb, 0x79, 0x01, 0x33, + 0xcd, 0x54, 0x2f, 0xf3, 0x70, 0x37, 0x82, 0x36, 0x32, 0x76, + 0x8f, 0x63, 0x00, 0xa2, 0x42, 0xce, 0x39, 0x90, 0xfc, 0xf8, + 0xff, 0x34, 0x38, 0x0a, 0x17, 0x5e, 0x9d, 0x34, 0x86, 0xde, + 0x33, 0x45, 0xac, 0xbf, 0x81, 0xdf, 0xd2, 0xbc, 0xc7, 0xd7, + 0xd1, 0xee, 0xde, 0x2b, 0x5b, 0x50, 0x56, 0xb5, 0x88, 0x00, + 0x92, 0x76, 0x5a, 0x34, 0x0c, 0xfe, 0x8f, 0xc5, 0xa0, 0x92, + 0xb0, 0xed, 0x43, 0xe7, 0x81, 0x39, 0x36, 0x6e, 0xb7, 0x4d, + 0x5b, 0xcf, 0xc7, 0xf0, 0x83, 0xe5, 0xdc, 0xb7, 0x74, 0xf4, + 0xf3, 0xbd, 0xa8, 0xa6, 0x7b, 0xe0, 0xc5, 0x50, 0xaa, 0xc7, + 0x83, 0x4d, 0xd9, 0xc5, 0x97, 0x03, 0x7c, 0x0c, 0x3b, 0x3a, + 0x18, 0xb2, 0x8c, 0xee, 0x67, 0x91, 0x38, 0x84, 0x8f, 0xef, + 0xb4, 0xf4, 0xe4, 0x7c, 0x1a, 0x3f, 0xa3, 0x0a, 0xd9, 0xba, + 0xff, 0x56, 0xd8, 0xe2, 0x82, 0xfc, 0x58, 0x8f, 0xf6, 0x12, + 0x10, 0x65, 0x6a, 0x68, 0x53, 0x2d, 0x9f, 0x2c, 0x77, 0xd1, + 0xb8, 0x21, 0x8a, 0xcb, 0xe9, 0xd4, 0x25, 0x18, 0x22, 0x46, + 0x3e, 0x72, 0x29, 0x2a, 0x68, 0x70, 0x73, 0xe2, 0x61, 0xa2, + 0xa8, 0x1f, 0x24, 0x48, 0x92, 0xa0, 0xd4, 0xdd, 0xde, 0xe5, + 0x02, 0x1b, 0x59, 0x5c, 0x7e, 0x92, 0x9c, 0xd8, 0xf4, 0x2d, + 0x6b, 0x79, 0x7b, 0xc7, 0xcd, 0xef, 0x21, 0x2a, 0x50, 0x7e, + 0xba, 0xdd, 0x02, 0x45, 0x7e, 0xc1, 0xdd, 0xeb, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x0c, 0x15, 0x1c, 0x22, 0x28, + }; + + return dilithium_param_vfy_test(WC_ML_DSA_65, ml_dsa_65_pub_key, + (word32)sizeof(ml_dsa_65_pub_key), ml_dsa_65_sig, + (word32)sizeof(ml_dsa_65_sig)); +} +#endif + +#ifndef WOLFSSL_NO_ML_DSA_87 +static wc_test_ret_t dilithium_param_87_vfy_test(void) +{ + WOLFSSL_SMALL_STACK_STATIC const byte ml_dsa_87_pub_key[] = { + 0xef, 0x49, 0x79, 0x47, 0x15, 0xc4, 0x8a, 0xa9, 0x74, 0x2a, + 0xf0, 0x36, 0x94, 0x5c, 0x91, 0x1c, 0x5d, 0xff, 0x2c, 0x83, + 0xf2, 0x8b, 0x04, 0xfc, 0x5d, 0x64, 0xbd, 0x49, 0x73, 0xcd, + 0xcc, 0x99, 0x50, 0x5f, 0x2b, 0x16, 0x3a, 0xbb, 0x98, 0xc0, + 0xa7, 0x69, 0x0e, 0x95, 0x99, 0x0b, 0xa2, 0x6c, 0xfe, 0x6c, + 0xdb, 0xc8, 0xa7, 0x09, 0x46, 0x6c, 0x90, 0x50, 0xa4, 0x75, + 0x30, 0xf7, 0x90, 0xac, 0x31, 0xb6, 0xdd, 0x21, 0xaf, 0xc6, + 0xf9, 0xfe, 0xee, 0xc6, 0x5b, 0xa8, 0x8f, 0x0a, 0x2e, 0xd0, + 0x42, 0xab, 0xa8, 0x3c, 0x8d, 0xbf, 0xf7, 0x44, 0xbd, 0x0d, + 0xcf, 0xf4, 0x68, 0xfc, 0x16, 0x67, 0xf7, 0x39, 0x48, 0x5f, + 0x56, 0xd1, 0xe7, 0x1f, 0x49, 0x80, 0x50, 0xbe, 0x54, 0xd1, + 0xb7, 0xc9, 0xd2, 0x32, 0xc7, 0x08, 0x8c, 0xde, 0x2c, 0x31, + 0xf6, 0x1d, 0xc7, 0xac, 0xb3, 0x79, 0xd7, 0x4b, 0x1b, 0x23, + 0x89, 0x0a, 0xdc, 0x8e, 0x44, 0x41, 0x14, 0x28, 0x99, 0x13, + 0xb3, 0x26, 0xa6, 0x0e, 0x83, 0x60, 0xaa, 0x8d, 0x7c, 0x23, + 0x13, 0xba, 0x6c, 0x28, 0x90, 0x56, 0x84, 0xa1, 0x23, 0x8b, + 0x81, 0x20, 0x97, 0x7c, 0x66, 0x3f, 0xed, 0x5d, 0xd0, 0xe4, + 0x5d, 0xee, 0x46, 0xbc, 0x4b, 0x3c, 0x03, 0xb5, 0xbc, 0x4d, + 0x8d, 0x37, 0xa3, 0x56, 0x4b, 0x33, 0xad, 0xef, 0xd4, 0xb6, + 0xec, 0xdb, 0x04, 0x9a, 0x19, 0x58, 0x57, 0xd8, 0x00, 0x3a, + 0x92, 0x61, 0x0c, 0x0b, 0xc8, 0x52, 0xe5, 0x04, 0x02, 0x9a, + 0x00, 0x7e, 0xec, 0x7e, 0x94, 0xaa, 0xef, 0x2d, 0x7f, 0xb6, + 0x2e, 0x7c, 0xb0, 0x73, 0xa2, 0x20, 0xc0, 0x07, 0x30, 0x41, + 0x50, 0x20, 0x14, 0x18, 0x21, 0x5e, 0x2a, 0x6f, 0x70, 0x21, + 0xd6, 0x97, 0x13, 0xb9, 0xc1, 0x9e, 0x90, 0x67, 0xcc, 0x55, + 0x8a, 0xec, 0xec, 0x0a, 0x1e, 0x90, 0xdc, 0x3f, 0xb0, 0x4d, + 0xd1, 0x18, 0xea, 0x4f, 0xcb, 0x5d, 0x15, 0x4c, 0xb8, 0x35, + 0x9b, 0x34, 0x24, 0x30, 0x06, 0x53, 0x17, 0xf0, 0xbe, 0x27, + 0x36, 0xb3, 0x04, 0x6a, 0xbd, 0xbf, 0xa7, 0x39, 0xee, 0xa9, + 0x8f, 0x0e, 0x98, 0xc5, 0xf5, 0x9f, 0x46, 0x25, 0x93, 0xc9, + 0xf2, 0xf6, 0x2b, 0x8e, 0x92, 0x06, 0x01, 0x3d, 0x81, 0x18, + 0xf2, 0xec, 0xf1, 0x05, 0x4c, 0xad, 0x4b, 0xcb, 0x98, 0xa4, + 0xb5, 0x61, 0x20, 0xda, 0x81, 0xa1, 0xfb, 0x92, 0x4c, 0xaf, + 0x87, 0x6f, 0x6e, 0xd2, 0x57, 0xec, 0xcd, 0x94, 0xb3, 0x79, + 0xbf, 0x59, 0x88, 0x17, 0x81, 0xce, 0x8a, 0x57, 0xce, 0x57, + 0xae, 0x3e, 0x82, 0x81, 0x2f, 0x83, 0x61, 0xd8, 0xf9, 0x68, + 0x21, 0xe7, 0x72, 0x5b, 0xd6, 0x80, 0x55, 0x68, 0x5d, 0x67, + 0x15, 0x0c, 0x8b, 0xdc, 0x4f, 0xc3, 0x89, 0x36, 0x3c, 0xac, + 0xaf, 0x16, 0x5e, 0x1c, 0xfa, 0x68, 0x74, 0x6a, 0xab, 0x68, + 0xd8, 0x59, 0x96, 0x2d, 0x33, 0x62, 0xe4, 0xbd, 0xb3, 0xb7, + 0x4d, 0x88, 0x35, 0xb8, 0xed, 0xb2, 0x16, 0x85, 0x97, 0x08, + 0x71, 0x71, 0x39, 0x7e, 0x0c, 0x53, 0x16, 0xda, 0x38, 0xe5, + 0x28, 0x09, 0x9c, 0xd9, 0x46, 0xec, 0x68, 0xda, 0x8d, 0xd0, + 0xad, 0xb2, 0x79, 0x28, 0x3b, 0x1e, 0x12, 0xc9, 0xdf, 0xa9, + 0x6d, 0x3d, 0x29, 0x99, 0x2f, 0x53, 0xc2, 0xd0, 0xf9, 0x88, + 0x26, 0x94, 0x47, 0xaf, 0xf6, 0x96, 0xf3, 0xe1, 0x11, 0xa6, + 0x82, 0x3d, 0x43, 0x3f, 0x1f, 0xbc, 0xf6, 0x98, 0xbe, 0xff, + 0x06, 0x86, 0x61, 0x27, 0xdc, 0x91, 0x54, 0xd4, 0xfc, 0x68, + 0x83, 0xe8, 0x35, 0x3e, 0xee, 0x94, 0x59, 0x28, 0x2f, 0xde, + 0xdd, 0x03, 0x60, 0x66, 0xc1, 0x49, 0x57, 0xdd, 0xbc, 0xd5, + 0x0a, 0x67, 0x34, 0xf1, 0xa6, 0x0a, 0x57, 0x94, 0x65, 0x02, + 0x2c, 0x52, 0x43, 0x70, 0x3b, 0xc1, 0x9a, 0xff, 0xda, 0x6f, + 0xb9, 0x54, 0x47, 0x01, 0xda, 0x27, 0xe4, 0x48, 0x4a, 0x90, + 0x9f, 0xb5, 0xc3, 0xee, 0x0e, 0x09, 0x57, 0xfe, 0x48, 0x51, + 0x08, 0x34, 0x5e, 0x8f, 0x16, 0xc9, 0x0b, 0x74, 0xd9, 0x7d, + 0x22, 0x3f, 0xd6, 0xb7, 0x5d, 0xd6, 0x76, 0x00, 0x8d, 0x4e, + 0x78, 0x73, 0x86, 0xd6, 0xdb, 0x2a, 0x65, 0xab, 0xdf, 0xb0, + 0xea, 0x11, 0xad, 0xdf, 0xba, 0x43, 0xdb, 0xa8, 0x0a, 0xfb, + 0x04, 0x38, 0x81, 0x2b, 0xa3, 0x29, 0xfc, 0x95, 0x73, 0x9a, + 0x0c, 0x6c, 0x9e, 0xcd, 0xdc, 0xcf, 0x0a, 0x0c, 0x18, 0x41, + 0x6f, 0x1d, 0xa3, 0xf6, 0x12, 0x4c, 0x13, 0xf2, 0x02, 0xc6, + 0x50, 0x99, 0x86, 0x73, 0xa7, 0xf9, 0x7e, 0x84, 0x7f, 0x4c, + 0x00, 0xce, 0x2e, 0x21, 0x76, 0x8e, 0x17, 0x7a, 0x87, 0x6f, + 0x81, 0xe6, 0xc0, 0x52, 0xa5, 0xa0, 0x3c, 0x54, 0x3c, 0xec, + 0xb0, 0x9d, 0x1c, 0x3b, 0xec, 0xe5, 0x4e, 0x4a, 0x37, 0xe7, + 0xd5, 0xa9, 0x07, 0x87, 0x23, 0x28, 0x5d, 0x3d, 0x22, 0x02, + 0x79, 0x40, 0x3f, 0x2d, 0x40, 0xc9, 0xe5, 0xa6, 0x9b, 0xa8, + 0xb8, 0x76, 0xf6, 0x77, 0x5b, 0x8d, 0x72, 0x96, 0x3e, 0x13, + 0xbf, 0x76, 0xfa, 0x7b, 0xb7, 0x82, 0x5f, 0xe7, 0x9d, 0x54, + 0x0e, 0x05, 0x1a, 0x9f, 0xa4, 0x42, 0xa5, 0xb4, 0x93, 0x23, + 0x06, 0x59, 0x43, 0xa8, 0xe8, 0x5c, 0xfc, 0x18, 0x97, 0xdb, + 0xad, 0x9a, 0x80, 0x0a, 0xf2, 0x20, 0x50, 0xac, 0xc1, 0x13, + 0x3e, 0x98, 0x09, 0xde, 0xf2, 0x70, 0x9e, 0x14, 0xc2, 0x5c, + 0xec, 0x65, 0x07, 0x0b, 0xfa, 0x02, 0x5c, 0xf8, 0x71, 0xaa, + 0x9b, 0x45, 0x62, 0xe2, 0x27, 0xaf, 0x77, 0xf8, 0xe3, 0xeb, + 0x7b, 0x24, 0x7b, 0x3c, 0x67, 0xc2, 0x6d, 0x6e, 0x17, 0xae, + 0x6e, 0x86, 0x6f, 0x98, 0xc9, 0xac, 0x13, 0x9f, 0x87, 0x64, + 0x3d, 0x4d, 0x6f, 0xa0, 0xb3, 0x39, 0xc6, 0x68, 0x1b, 0xa7, + 0xeb, 0x3e, 0x0f, 0x6b, 0xc7, 0xa4, 0xe2, 0x20, 0x27, 0x75, + 0x3f, 0x09, 0x16, 0xff, 0x1a, 0xcc, 0xa7, 0xc4, 0x6d, 0xc2, + 0xfc, 0xc3, 0x0b, 0x37, 0x63, 0xff, 0x9b, 0x10, 0xe6, 0x00, + 0xf7, 0x18, 0x43, 0x9f, 0x07, 0x50, 0x31, 0x51, 0xd4, 0xfd, + 0xad, 0xa2, 0x0f, 0x77, 0xda, 0x41, 0xc1, 0x0a, 0x6f, 0x86, + 0xd7, 0xdc, 0x8a, 0x52, 0xd6, 0xa1, 0x27, 0xdb, 0x14, 0x67, + 0x26, 0x91, 0xb3, 0xcd, 0x01, 0x5f, 0x60, 0xa1, 0x7f, 0x43, + 0x15, 0x1a, 0x82, 0x0f, 0xd3, 0x66, 0x5f, 0x60, 0x57, 0x2f, + 0xb2, 0x8c, 0x27, 0x2a, 0x9d, 0x1b, 0xf9, 0xf2, 0x59, 0x20, + 0x39, 0xd9, 0xc5, 0xaf, 0xf2, 0x36, 0x8c, 0x58, 0x00, 0x1b, + 0xd0, 0xc5, 0x8e, 0x1a, 0x49, 0xa8, 0x60, 0xbe, 0xd1, 0xd7, + 0x2a, 0xb0, 0xc2, 0xab, 0x58, 0x8a, 0x7a, 0xa9, 0x41, 0x68, + 0x70, 0xbd, 0xea, 0x73, 0xa5, 0x03, 0x11, 0xb2, 0x27, 0xd9, + 0xcd, 0xf5, 0x09, 0xe8, 0x1c, 0xe2, 0x4f, 0x50, 0x6a, 0x84, + 0x34, 0x62, 0x2e, 0x36, 0xaa, 0x4c, 0xc1, 0x83, 0x78, 0x98, + 0x35, 0x7a, 0x27, 0x7e, 0xfe, 0xf1, 0x6f, 0x59, 0x27, 0x35, + 0x73, 0xce, 0x74, 0xaa, 0xb4, 0x72, 0x82, 0xa8, 0xe2, 0x81, + 0x7a, 0x6b, 0xca, 0x33, 0xa5, 0xda, 0xa2, 0x63, 0xca, 0x2e, + 0x90, 0x03, 0x32, 0xec, 0x63, 0xdb, 0x52, 0x7b, 0x16, 0xfc, + 0x01, 0x2d, 0x30, 0x12, 0x1e, 0xf9, 0xa3, 0x72, 0x21, 0x3c, + 0x75, 0x0c, 0x61, 0x9c, 0x7e, 0x73, 0x04, 0x71, 0x41, 0x45, + 0x5d, 0x7f, 0x49, 0x1c, 0x09, 0x08, 0xa4, 0xec, 0x2f, 0xfd, + 0xc4, 0xfb, 0x59, 0x6a, 0x27, 0x7a, 0xd4, 0xfc, 0x5f, 0x20, + 0x04, 0x34, 0x7d, 0x08, 0xed, 0x82, 0x5a, 0x90, 0xe1, 0xab, + 0xfd, 0x35, 0x3a, 0x8d, 0xbb, 0x0a, 0x9d, 0x73, 0xff, 0x69, + 0xe5, 0xe9, 0x09, 0x55, 0x14, 0xd9, 0x7b, 0x6f, 0x0d, 0x99, + 0xd2, 0x7e, 0x71, 0xf8, 0x4f, 0x72, 0x2f, 0xbb, 0xc6, 0xc4, + 0x36, 0xc9, 0x01, 0xd3, 0x9b, 0x94, 0xab, 0x41, 0x0f, 0x4a, + 0x61, 0x5c, 0x68, 0xe5, 0xd7, 0x0d, 0x94, 0xaa, 0xee, 0xba, + 0x95, 0xcb, 0x8c, 0x0e, 0x85, 0x3a, 0x02, 0x6b, 0x95, 0x50, + 0xfd, 0x02, 0xfd, 0xa4, 0x58, 0x29, 0x78, 0x4f, 0xd0, 0xae, + 0x66, 0xd6, 0x5c, 0xe7, 0x45, 0xfe, 0x98, 0xb0, 0xa3, 0xe2, + 0x87, 0xc0, 0xd2, 0x81, 0x08, 0xf1, 0xf1, 0xe7, 0xda, 0x62, + 0x9e, 0xa0, 0x34, 0x86, 0xeb, 0xa1, 0x6e, 0x4a, 0x26, 0x8e, + 0x39, 0x0c, 0x51, 0x10, 0x33, 0x11, 0x87, 0xf8, 0x79, 0x3c, + 0x49, 0x7a, 0x8b, 0xce, 0xc1, 0x0a, 0x0e, 0xe1, 0xd5, 0x2a, + 0xac, 0xf0, 0x3a, 0x1d, 0x6a, 0x6a, 0xe5, 0xe1, 0x81, 0x70, + 0xad, 0xaf, 0x15, 0x4c, 0x2a, 0x70, 0x2a, 0x6b, 0x22, 0x0d, + 0x30, 0xe7, 0x56, 0xed, 0x2d, 0x4b, 0x85, 0x17, 0x49, 0x72, + 0x3a, 0x1b, 0x6f, 0x57, 0x1c, 0xf7, 0x72, 0x9e, 0x20, 0xdb, + 0x57, 0x1c, 0xfb, 0x36, 0x50, 0x52, 0xec, 0x5b, 0xd6, 0x6a, + 0x1b, 0xf8, 0x74, 0xad, 0xe6, 0x00, 0x74, 0x04, 0xc5, 0x99, + 0x83, 0xe4, 0x5a, 0x0c, 0xc3, 0xe8, 0x6d, 0x3a, 0xd7, 0x3c, + 0x3c, 0xc0, 0x1a, 0x28, 0xb3, 0x29, 0x7a, 0x10, 0x9e, 0x39, + 0x66, 0x5b, 0xc1, 0x38, 0xac, 0x21, 0x4e, 0xcd, 0x01, 0xf2, + 0xf6, 0x30, 0x2c, 0x2b, 0xb6, 0xbf, 0xf5, 0xea, 0x61, 0xaf, + 0x0c, 0xa6, 0x01, 0x11, 0x15, 0x19, 0x09, 0x8c, 0x7e, 0x69, + 0xdf, 0x3b, 0xea, 0xd3, 0x0a, 0x3a, 0xd7, 0xbd, 0xe1, 0x17, + 0xaf, 0x92, 0x3c, 0xf5, 0xfe, 0x35, 0xd6, 0xcf, 0x07, 0xa6, + 0xf7, 0xe9, 0xc1, 0x99, 0xed, 0x80, 0xe3, 0x12, 0xd5, 0x4b, + 0xb9, 0xdf, 0xaf, 0x4e, 0x52, 0xad, 0x8e, 0x66, 0x87, 0xe5, + 0x2c, 0xd0, 0x45, 0x70, 0xd9, 0x78, 0x8f, 0x4b, 0xf4, 0xe1, + 0xf1, 0x22, 0xf2, 0xe3, 0xed, 0x1f, 0xeb, 0xe9, 0x70, 0x31, + 0x4c, 0x65, 0x5f, 0x55, 0xee, 0x5d, 0xaa, 0x83, 0x87, 0x76, + 0xbe, 0x11, 0xae, 0xd7, 0xf2, 0xfb, 0x43, 0xe7, 0x17, 0x81, + 0x33, 0x15, 0x47, 0xa0, 0xf3, 0x8e, 0x84, 0x57, 0xff, 0x35, + 0x9e, 0x4a, 0x8a, 0xab, 0x50, 0x3a, 0x45, 0xe0, 0xc3, 0x73, + 0xca, 0x77, 0x61, 0x68, 0x38, 0xd0, 0xa3, 0x5f, 0x03, 0x8d, + 0x41, 0xc2, 0xd3, 0x4a, 0x17, 0xe0, 0xa8, 0xaa, 0x00, 0xf3, + 0xf2, 0x5b, 0xa8, 0xe1, 0x06, 0xa6, 0x2b, 0xdb, 0xe1, 0x74, + 0xbd, 0xc4, 0xd2, 0x2b, 0x55, 0x9a, 0xb0, 0xf8, 0x35, 0xd8, + 0x6b, 0xec, 0xdb, 0xc5, 0xf4, 0x6c, 0x40, 0x90, 0x6a, 0x68, + 0xc9, 0xb5, 0xcb, 0xbb, 0xd0, 0xb0, 0xbc, 0x9f, 0xb9, 0xaa, + 0x50, 0x14, 0x93, 0x3b, 0x9f, 0x25, 0xcb, 0x40, 0xb8, 0x08, + 0xcc, 0x13, 0xe5, 0xdc, 0x3f, 0x84, 0x96, 0xe0, 0x73, 0x7b, + 0x7d, 0x9e, 0x41, 0x92, 0x5d, 0xcc, 0xa4, 0xea, 0x4f, 0x93, + 0x0c, 0x40, 0x2e, 0x42, 0x8a, 0xe9, 0xb9, 0x12, 0x74, 0xbb, + 0x79, 0x7c, 0xb0, 0x37, 0x20, 0xb6, 0xaf, 0x43, 0x3a, 0x88, + 0x59, 0x7c, 0x68, 0x28, 0x5f, 0x98, 0xc2, 0xf0, 0x2a, 0xbc, + 0xa1, 0x61, 0x88, 0x1f, 0x43, 0xbc, 0x42, 0x8f, 0x43, 0xf3, + 0x7e, 0x16, 0x96, 0xfa, 0x92, 0x70, 0xaf, 0x3c, 0x9f, 0x4b, + 0xd9, 0x60, 0xe9, 0xf6, 0x2e, 0x84, 0xda, 0x88, 0x31, 0x34, + 0xa6, 0x85, 0x10, 0x05, 0xef, 0x40, 0xa8, 0xa5, 0x4f, 0x92, + 0x59, 0xf7, 0xe0, 0xc4, 0x2b, 0x12, 0x17, 0x71, 0xbe, 0x8c, + 0x4a, 0x02, 0xfe, 0x12, 0xb6, 0x3b, 0x85, 0x75, 0x37, 0xf3, + 0x73, 0x2d, 0x9c, 0x00, 0x5d, 0x80, 0xad, 0x20, 0x2f, 0x5a, + 0x0b, 0x17, 0x7e, 0x67, 0x72, 0x24, 0x5a, 0xb9, 0xf3, 0xb1, + 0x33, 0xa4, 0x57, 0x1d, 0x49, 0x72, 0x2c, 0x7f, 0x47, 0x15, + 0x07, 0xe0, 0x45, 0x14, 0xdd, 0x77, 0x86, 0x6d, 0x03, 0xbe, + 0x57, 0xd0, 0xaa, 0x18, 0xa6, 0xdd, 0x94, 0x18, 0x3f, 0x8a, + 0xf3, 0xb5, 0xd7, 0x5a, 0xec, 0xc8, 0x79, 0x7f, 0x51, 0x61, + 0x3c, 0x9b, 0xb2, 0x9b, 0xf3, 0xb4, 0x35, 0xd1, 0x38, 0xbf, + 0x37, 0xce, 0x54, 0xd1, 0xf8, 0xb6, 0x45, 0xeb, 0x52, 0x0d, + 0x9a, 0x09, 0x58, 0x0d, 0x2c, 0x0b, 0xb1, 0xf2, 0x30, 0x3a, + 0x95, 0xc1, 0x13, 0x91, 0xd2, 0x9f, 0x8d, 0x8d, 0xd0, 0x38, + 0x3e, 0x4c, 0xae, 0x4a, 0x55, 0xa7, 0x42, 0x11, 0x83, 0xc4, + 0x70, 0xf0, 0x2b, 0x68, 0x9e, 0x07, 0xad, 0xb7, 0x83, 0xc6, + 0x53, 0x3c, 0xfb, 0x0a, 0x5d, 0x24, 0xdc, 0xe1, 0x55, 0x72, + 0xcf, 0xce, 0x3e, 0xc8, 0xd0, 0x57, 0x8a, 0x82, 0x5e, 0x78, + 0x2b, 0x80, 0xc5, 0xb9, 0x09, 0x46, 0xf8, 0x90, 0x39, 0x52, + 0xa9, 0xce, 0x3f, 0x3d, 0x41, 0x3b, 0x28, 0x45, 0xa3, 0xb3, + 0x21, 0xc2, 0xcd, 0x14, 0x49, 0x41, 0x6c, 0x38, 0xda, 0x1b, + 0x5f, 0x16, 0x49, 0xf9, 0x65, 0x00, 0x4e, 0xb4, 0x20, 0x55, + 0x70, 0xe8, 0x58, 0x1a, 0x18, 0xbf, 0x41, 0xef, 0x31, 0xb1, + 0xe7, 0x8d, 0x89, 0xc1, 0x48, 0xe8, 0xf5, 0x57, 0x35, 0xfa, + 0xc1, 0x79, 0xee, 0x2c, 0xe8, 0x7d, 0xb6, 0x03, 0xcc, 0x66, + 0x09, 0x6f, 0x52, 0x84, 0x0a, 0x34, 0x18, 0x2c, 0x01, 0x45, + 0x81, 0x00, 0xe5, 0x5e, 0x8d, 0xae, 0x1c, 0x96, 0x8b, 0x45, + 0x73, 0x00, 0x0a, 0xb5, 0xcf, 0x8d, 0x0e, 0x35, 0x5d, 0x1a, + 0x0e, 0xbf, 0x64, 0x9a, 0x52, 0x20, 0x48, 0xc6, 0xb9, 0x40, + 0xd3, 0x2c, 0x52, 0xca, 0x93, 0xcf, 0xbb, 0x94, 0x06, 0xf3, + 0x97, 0xee, 0xcc, 0x5d, 0xa3, 0xea, 0xf8, 0x5a, 0x39, 0x77, + 0x34, 0xd7, 0xf6, 0x4e, 0xbe, 0x8a, 0x07, 0x5f, 0x51, 0x53, + 0xc5, 0x1b, 0x8c, 0x47, 0x8f, 0x34, 0x0e, 0x60, 0x0a, 0x90, + 0xe2, 0xda, 0x7b, 0xef, 0xd6, 0xf5, 0x5d, 0xe5, 0x32, 0x37, + 0x75, 0x99, 0x81, 0x4a, 0x2a, 0x78, 0x71, 0xdc, 0xf4, 0xe5, + 0xca, 0xd8, 0x6b, 0x3b, 0x90, 0x68, 0x2e, 0x93, 0xc5, 0x10, + 0x42, 0x5d, 0x38, 0x90, 0x32, 0x46, 0xea, 0x87, 0xe0, 0xbc, + 0xb8, 0x9a, 0x18, 0x20, 0x68, 0x85, 0x6d, 0x9b, 0xc9, 0x8f, + 0x9b, 0xd2, 0xbe, 0x15, 0x12, 0x68, 0xd0, 0xb0, 0x16, 0x5f, + 0xe2, 0x69, 0x1d, 0x04, 0x00, 0xfc, 0x63, 0x33, 0xcd, 0x1f, + 0x89, 0xcd, 0x52, 0xff, 0xec, 0x19, 0x69, 0x74, 0xa3, 0xce, + 0x4d, 0xab, 0x93, 0xe4, 0xc6, 0x13, 0x56, 0x27, 0xc9, 0x25, + 0x5a, 0x01, 0xb2, 0x36, 0x8b, 0x61, 0xe5, 0x8b, 0x98, 0xac, + 0xe4, 0x2a, 0xb6, 0x40, 0x9f, 0x42, 0xe4, 0x1b, 0x52, 0xf7, + 0xfd, 0xd8, 0x30, 0x07, 0x33, 0xf9, 0x47, 0xcb, 0x3c, 0xad, + 0x12, 0xc1, 0xcc, 0x29, 0x62, 0x49, 0x04, 0x0c, 0x23, 0x97, + 0x5a, 0xa4, 0x84, 0x67, 0xde, 0x5a, 0xe5, 0x36, 0xd2, 0x88, + 0xf1, 0xd4, 0xeb, 0x13, 0x81, 0x54, 0x51, 0x11, 0xe3, 0xba, + 0xbc, 0xee, 0xdd, 0x6c, 0xcd, 0xe6, 0xb4, 0xa1, 0x8b, 0x0b, + 0x66, 0xfb, 0x8e, 0x50, 0xa0, 0xda, 0x69, 0x8d, 0xcc, 0x2d, + 0xe4, 0x2c, 0xc4, 0x37, 0xdf, 0x61, 0xc0, 0x03, 0xbd, 0x8b, + 0x28, 0xca, 0xd2, 0x8c, 0x1c, 0xf1, 0xa4, 0x26, 0x69, 0xe5, + 0xcf, 0x45, 0xdb, 0x5a, 0x47, 0x79, 0xed, 0x9f, 0xf7, 0xd2, + 0xdb, 0xba, 0x46, 0x53, 0x4f, 0xce, 0xa8, 0xbe, 0x8f, 0x4a, + 0xd6, 0xdf, 0x2e, 0x06, 0xe6, 0x4c, 0x9a, 0xc1, 0xb6, 0x49, + 0xed, 0xc4, 0xeb, 0xaa, 0xa4, 0x29, 0x6d, 0xd4, 0xcc, 0x8c, + 0xb6, 0x40, 0x11, 0x39, 0x69, 0xf7, 0x75, 0xcd, 0xb1, 0x99, + 0x46, 0x4e, 0xde, 0xcb, 0xf6, 0x9d, 0x32, 0xf3, 0xc9, 0x47, + 0x47, 0x7a, 0xcb, 0xfb, 0xa3, 0x0c, 0x3b, 0xdf, 0xb7, 0xde, + 0xec, 0x99, 0xde, 0xb0, 0x26, 0x04, 0x34, 0xae, 0x6b, 0xfc, + 0x99, 0xbc, 0xde, 0xd5, 0xbe, 0xe7, 0xeb, 0xf9, 0xe7, 0xa6, + 0x01, 0x9a, 0x0c, 0x5e, 0x66, 0xe6, 0x53, 0xe4, 0xd1, 0x58, + 0xac, 0xda, 0x69, 0x77, 0x7b, 0x68, 0xd6, 0x30, 0x2a, 0x9c, + 0x6b, 0xbe, 0x9f, 0x3d, 0x71, 0xd6, 0x54, 0xcd, 0x59, 0x4e, + 0x1f, 0xe3, 0x83, 0x4e, 0xd1, 0x8e, 0xaf, 0x97, 0xa8, 0xe5, + 0xb6, 0x59, 0x77, 0xa8, 0x02, 0x20, 0xe4, 0xeb, 0x44, 0x71, + 0xbc, 0x07, 0x14, 0x79, 0x4f, 0x0c, 0x27, 0x06, 0x39, 0xcf, + 0x7c, 0xef, 0x2b, 0x9b, 0x5e, 0xc4, 0x6d, 0x79, 0x13, 0x00, + 0x43, 0x6f, 0x51, 0x77, 0xb5, 0xc3, 0x72, 0xad, 0x13, 0xa9, + 0xe5, 0x9a, 0x5b, 0x1a, 0x99, 0x74, 0xc0, 0x7a, 0xf9, 0xc5, + 0xb0, 0x58, 0x35, 0x1c, 0xa5, 0x51, 0xdb, 0xa1, 0x14, 0xcd, + 0x26, 0x71, 0xb1, 0xe7, 0xaa, 0x14, 0xa7, 0x46, 0x93, 0xd3, + 0x5c, 0x8c, 0x1a, 0x91, 0x77, 0x46, 0x2e, 0x15, 0xaa, 0x9e, + 0xf7, 0x2b, 0x79, 0x41, 0x76, 0xf7, 0x22, 0x53, 0x7d, 0x51, + 0xdb, 0x98, 0x3d, 0x5b, 0x78, 0x5f, 0xc3, 0xc9, 0x29, 0xa3, + 0xff, 0x75, 0x82, 0x06, 0x9a, 0x16, 0x5e, 0xa4, 0x79, 0x0d, + 0xd1, 0x6d, 0x08, 0xff, 0x43, 0xef, 0x9c, 0xf3, 0x1b, 0x7a, + 0x3f, 0x34, 0xbe, 0x19, 0x15, 0x06, 0x33, 0xdb, 0xa5, 0x71, + 0xcb, 0x5f, 0x6b, 0x8d, 0xbd, 0x5b, 0x32, 0x91, 0xb2, 0x37, + 0x3d, 0xb4, 0x40, 0x9e, 0x02, 0x9b, 0xb7, 0x68, 0x20, 0x58, + 0x5c, 0xab, 0xcb, 0xc8, 0x23, 0x2d, 0x77, 0xcc, 0x0b, 0xf6, + 0x78, 0x6b, 0x80, 0x06, 0x91, 0xa9, 0xfd, 0x7e, 0xfa, 0x25, + 0x98, 0x9f, 0xcc, 0x79, 0x0a, 0x1a, 0x54, 0x83, 0xac, 0x64, + 0x16, 0x90, 0xe5, 0xd9, 0xa7, 0xd7, 0x1b, 0x86, 0x0d, 0xe6, + 0xe6, 0x22, 0x2b, 0x1f, 0x44, 0x49, 0x98, 0x9c, 0x51, 0x6f, + 0xcf, 0x58, 0x4a, 0xfa, 0xfa, 0x84, 0x12, 0xa5, 0x10, 0xf4, + 0xca, 0xf0, 0x98, 0x2b, 0xc9, 0x03, 0x71, 0x37, 0xe7, 0xdc, + 0xc2, 0xb1, 0x4e, 0x64, 0xde, 0x4f, 0x46, 0x0d, 0x6b, 0x25, + 0x88, 0x5d, 0xd6, 0xff, 0x23, 0x46, 0x57, 0x36, 0x14, 0x18, + 0xa7, 0xcb, 0xb8, 0xbd, 0xf0, 0xc5, 0x37, 0x36, 0xee, 0xe1, + 0xed, 0x9f, 0x4d, 0xd4, 0x39, 0xe5, 0x92, 0xcf, 0x95, 0x4d, + 0x66, 0x36, 0x5d, 0xd0, 0xcc, 0x07, 0xcf, 0x15, 0x5a, 0xce, + 0x14, 0xb8, 0xda, 0x0d, 0x3d, 0x1b, 0x45, 0xc5, 0x2e, 0x34, + 0x43, 0x25, 0x02, 0x3a, 0xcd, 0x14, 0x45, 0xfb, 0x3e, 0xf9, + 0x88, 0x5d, 0x0d, 0x29, 0x31, 0xb9, 0xa1, 0xe6, 0x31, 0x18, + 0x52, 0x46, 0x3f, 0x22, 0x4f, 0x9f, 0x7a, 0x65, 0x36, 0x88, + 0xa3, 0x1c, 0x3e, 0x6f, 0x50, 0x7a, 0x36, 0xbe, 0x56, 0x7e, + 0x50, 0xcb, 0x7a, 0x10, 0xa0, 0xec, 0xf6, 0x82, 0xd6, 0x30, + 0x1c, 0xe8, 0x4c, 0x50, 0xf9, 0x3e, 0xdb, 0xac, 0xbe, 0x4f, + 0x90, 0xb1, 0xd5, 0x1b, 0x12, 0x95, 0xfb, 0xe8, 0x08, 0x64, + 0x56, 0x7c, 0x96, 0xcc, 0x90, 0xb1, 0xbc, 0xa0, 0xf5, 0x32, + 0x69, 0xb3, 0x5f, 0x27, 0x0f, 0xbe, 0xc9, 0xbd, 0xeb, 0xfa, + 0x4b, 0x5c, 0xc5, 0x99, 0x9e, 0x5a, 0x04, 0xcc, 0xd0, 0x4d, + 0x29, 0xe8, 0x84, 0x55, 0x8c, 0xd7, 0xc4, 0x06, 0x13, 0x4d, + 0x92, 0xe5, 0x98, 0x9c, 0x4c, 0xc1, 0xf7, 0xaf, 0x7b, 0xd5, + 0x2b, 0x92, 0x68, 0x68, 0x19, 0x70, 0x4c, 0x9e, 0x46, 0xb8, + 0x34, 0xeb, 0x01, 0x47, 0xbe, 0x59, 0xab, 0x0b, 0x22, 0x25, + 0xe7, 0x56, 0xa8, 0xb4, 0x93, 0x3c, 0xd5, 0x98, 0x9f, 0x61, + 0x2e, 0xfa, 0xcb, 0x5f, 0x5b, 0xd8, 0x09, 0x83, 0xe9, 0x40, + 0xe9, 0x0e, 0x42, 0xdd, 0x17, 0xd7, 0x6e, 0x19, 0x8d, 0x95, + 0x0a, 0x93, + }; + WOLFSSL_SMALL_STACK_STATIC const byte ml_dsa_87_sig[] = { + 0x78, 0xed, 0x1a, 0x3f, 0x41, 0xab, 0xf8, 0x93, 0x80, 0xf0, + 0xc6, 0xbf, 0x4a, 0xde, 0xaf, 0x29, 0x93, 0xe5, 0x9a, 0xbf, + 0x38, 0x08, 0x18, 0x33, 0xca, 0x7d, 0x5e, 0x65, 0xa4, 0xd2, + 0xd7, 0x45, 0xe3, 0xe7, 0x58, 0xfb, 0x05, 0xab, 0x65, 0x57, + 0xac, 0x6f, 0xf5, 0x43, 0x28, 0x5f, 0x9c, 0x9a, 0x3e, 0x35, + 0x84, 0xe4, 0xef, 0xa5, 0x57, 0x17, 0xad, 0x51, 0x44, 0x70, + 0x09, 0x00, 0x81, 0xbe, 0xfe, 0x14, 0x01, 0xfe, 0x0c, 0x94, + 0xbe, 0xa9, 0x89, 0xfd, 0x47, 0xfc, 0xb9, 0xd8, 0x17, 0x4d, + 0xd8, 0x73, 0xd5, 0x50, 0x9f, 0x13, 0x6c, 0x07, 0x71, 0x47, + 0xaa, 0x3c, 0xc0, 0x64, 0x00, 0x19, 0x2e, 0x74, 0x51, 0x0e, + 0x0f, 0x25, 0x30, 0x7f, 0x13, 0x96, 0xc6, 0xc5, 0xbf, 0xd4, + 0x82, 0xd3, 0x0d, 0xd3, 0x65, 0x4c, 0x72, 0x67, 0xe2, 0x37, + 0x6b, 0x3c, 0x8e, 0xa3, 0x36, 0x84, 0xe9, 0xaa, 0xac, 0x7d, + 0xf3, 0xac, 0xfc, 0x01, 0x50, 0x87, 0x88, 0xf6, 0xbf, 0x84, + 0xc3, 0xa0, 0x23, 0xe4, 0xe8, 0x01, 0x38, 0x39, 0x30, 0x8a, + 0xf3, 0xba, 0x92, 0x62, 0x37, 0xd7, 0x20, 0xd7, 0xf7, 0x41, + 0xff, 0xae, 0x81, 0x02, 0x29, 0x2a, 0x66, 0x8b, 0x20, 0xbe, + 0x61, 0x8d, 0xfb, 0x7c, 0x70, 0x14, 0xad, 0xf4, 0x94, 0x8c, + 0xee, 0x64, 0x3b, 0x9f, 0xe1, 0x6e, 0x68, 0x17, 0x07, 0xb8, + 0xfc, 0x99, 0xdc, 0xde, 0x69, 0x58, 0x8c, 0x97, 0x7d, 0xb3, + 0x2c, 0x9e, 0x90, 0x33, 0x2e, 0x7b, 0xbf, 0xf8, 0x6f, 0xf8, + 0x12, 0x64, 0xda, 0xc0, 0xfb, 0x30, 0xe6, 0xbf, 0x7b, 0x9a, + 0xde, 0xb5, 0xac, 0x9d, 0x6b, 0xcb, 0xe1, 0x0d, 0xf1, 0xbb, + 0xf3, 0x97, 0xc5, 0x08, 0xd3, 0x3e, 0xe3, 0xa4, 0xeb, 0x6f, + 0x6b, 0x62, 0x61, 0xc5, 0x0b, 0xa8, 0x02, 0xc2, 0xf1, 0xbe, + 0xbb, 0x93, 0x13, 0xa5, 0x8d, 0x7b, 0x5a, 0x6d, 0x1f, 0x28, + 0xbc, 0x35, 0xd8, 0xe8, 0xcf, 0x80, 0x8b, 0x4b, 0x02, 0x80, + 0x3b, 0xdc, 0x00, 0xce, 0x88, 0xb0, 0x62, 0x35, 0x7d, 0x51, + 0x7f, 0x5c, 0xb2, 0x23, 0x85, 0x47, 0x7e, 0x73, 0x88, 0x65, + 0xfd, 0x0d, 0x47, 0x33, 0xef, 0xb9, 0x75, 0x05, 0x86, 0x5d, + 0xd3, 0x98, 0xa6, 0x91, 0xe6, 0x8c, 0xe2, 0x71, 0x7a, 0x95, + 0xe0, 0x8c, 0x54, 0x4b, 0x68, 0x4d, 0x5a, 0xec, 0xad, 0xae, + 0x54, 0x4e, 0x3b, 0x0e, 0xcd, 0x70, 0xe6, 0x81, 0xbf, 0xf4, + 0x86, 0xab, 0xfe, 0xd8, 0xed, 0x69, 0xdd, 0x0f, 0x75, 0x8f, + 0x8e, 0xcd, 0x72, 0x40, 0x21, 0xee, 0x80, 0x6f, 0x9e, 0xa0, + 0x80, 0xf7, 0xf6, 0xa2, 0xf5, 0x04, 0x82, 0xea, 0xb6, 0xb1, + 0xa3, 0xfe, 0xa2, 0x2d, 0x83, 0xc7, 0x01, 0x4b, 0x27, 0x19, + 0x6a, 0x31, 0x04, 0x70, 0xce, 0x75, 0x22, 0x4b, 0x7a, 0x21, + 0x29, 0xfd, 0xe9, 0xcb, 0xbb, 0xca, 0x95, 0x0a, 0xd8, 0xcd, + 0x20, 0x2a, 0xb7, 0xbe, 0xdf, 0x2f, 0x0f, 0xfa, 0xf1, 0xc0, + 0x39, 0xf3, 0x74, 0x22, 0x05, 0x33, 0xca, 0x2a, 0x9c, 0x9f, + 0x06, 0x71, 0x90, 0x1e, 0x74, 0x4b, 0xbe, 0x9a, 0xc7, 0x1e, + 0x37, 0x9b, 0x96, 0x19, 0xfd, 0xa0, 0x61, 0x87, 0x93, 0xab, + 0x75, 0x79, 0xac, 0x2f, 0x83, 0xe1, 0x8c, 0x70, 0x54, 0x70, + 0x01, 0x93, 0xce, 0x76, 0x7a, 0x08, 0xe7, 0x75, 0xfb, 0x5e, + 0xa4, 0xcc, 0xd6, 0xeb, 0x90, 0xe2, 0x57, 0x07, 0x53, 0x88, + 0x8f, 0x7f, 0x29, 0x39, 0x80, 0xc4, 0x7f, 0x70, 0x6f, 0xff, + 0x44, 0x25, 0x2b, 0x9e, 0xa1, 0xbb, 0xda, 0x43, 0x53, 0x14, + 0xf8, 0x97, 0x08, 0xa4, 0xaf, 0xa0, 0xa5, 0x0c, 0xfa, 0xcc, + 0xba, 0xcd, 0x4f, 0xd3, 0x90, 0x28, 0x02, 0x25, 0xbe, 0xc6, + 0x35, 0x66, 0x99, 0xb0, 0x69, 0x46, 0xe5, 0xbf, 0x7e, 0x4f, + 0x53, 0x11, 0x1f, 0xa5, 0x2c, 0x9b, 0xd1, 0x70, 0x90, 0x34, + 0x66, 0xaa, 0x9f, 0xa8, 0x02, 0x3a, 0x05, 0x2b, 0x0a, 0xd0, + 0x72, 0x5d, 0x01, 0x7b, 0x02, 0xce, 0x18, 0xb9, 0x63, 0xd1, + 0x7d, 0xd2, 0x34, 0xa3, 0x2d, 0xaa, 0x78, 0xf0, 0x30, 0x6e, + 0x59, 0xe3, 0xf1, 0x1e, 0xf1, 0x33, 0x41, 0xde, 0xc4, 0x4e, + 0x88, 0x61, 0xc3, 0xb4, 0x6b, 0x21, 0x5d, 0xcc, 0x69, 0x44, + 0xf3, 0xb0, 0x84, 0x54, 0x2a, 0x23, 0x22, 0xa2, 0xc4, 0xba, + 0xad, 0x00, 0x57, 0x5b, 0xdf, 0xa0, 0xf7, 0x1c, 0x00, 0xc3, + 0x23, 0x93, 0xc0, 0x2f, 0x3b, 0x9d, 0x6e, 0x8c, 0x38, 0xa6, + 0x5e, 0xd8, 0x98, 0x7a, 0x6c, 0x90, 0xd5, 0x40, 0x3f, 0x8c, + 0xc3, 0xf0, 0x92, 0x66, 0xc4, 0xe5, 0xa8, 0x42, 0x25, 0x4c, + 0x56, 0x42, 0x37, 0x9a, 0xa4, 0x1d, 0xf5, 0xb0, 0xe3, 0x8a, + 0x9c, 0x57, 0x52, 0x63, 0xdc, 0xd9, 0xb0, 0xbf, 0xc3, 0xfc, + 0xfc, 0x6c, 0xab, 0x41, 0xae, 0xec, 0xc7, 0x40, 0x80, 0xb6, + 0x0b, 0x3c, 0xa9, 0xf5, 0x4f, 0x2d, 0xf6, 0x72, 0xe3, 0xba, + 0x13, 0x2c, 0x73, 0x61, 0x98, 0x66, 0x6f, 0x03, 0x88, 0x3b, + 0xe6, 0x95, 0x43, 0x33, 0x3b, 0xfe, 0xfd, 0x63, 0x8c, 0x00, + 0x8a, 0x67, 0x1c, 0x46, 0x0e, 0x0b, 0x51, 0x26, 0x79, 0x4f, + 0x7b, 0xb1, 0x36, 0x34, 0x52, 0x41, 0x7e, 0x74, 0xbb, 0x71, + 0x52, 0x8f, 0xcc, 0xf2, 0x99, 0x24, 0x3f, 0x18, 0xe6, 0xcf, + 0xdf, 0x6b, 0xfe, 0x77, 0xfa, 0xa8, 0x3f, 0xe3, 0x6b, 0xb7, + 0x32, 0x30, 0x8e, 0x16, 0x08, 0x59, 0x66, 0xdf, 0x95, 0x75, + 0x7d, 0xa3, 0x80, 0xf0, 0x0c, 0x1a, 0xa8, 0xe7, 0x87, 0x2f, + 0xe3, 0x39, 0x11, 0x82, 0x00, 0x3e, 0xe5, 0x71, 0x05, 0x7d, + 0x0c, 0x90, 0xae, 0xbc, 0xbf, 0xe0, 0x4b, 0x8f, 0x91, 0x85, + 0x1d, 0x0a, 0xa2, 0x36, 0x66, 0x18, 0x78, 0xd0, 0x0a, 0xa0, + 0xaf, 0x0f, 0x1c, 0x01, 0xdb, 0xb2, 0x21, 0x96, 0x25, 0xf7, + 0x9e, 0x3a, 0x9e, 0xc3, 0xe8, 0x92, 0x34, 0xaf, 0x7e, 0x3b, + 0x5f, 0xd9, 0x23, 0x97, 0x09, 0xf1, 0x87, 0x31, 0x3a, 0x94, + 0xc8, 0x9b, 0x52, 0xf4, 0x57, 0x54, 0x7b, 0x3e, 0x50, 0xd3, + 0x75, 0x2a, 0xba, 0x97, 0xd7, 0xec, 0x95, 0x6c, 0x35, 0x63, + 0xa4, 0xa1, 0x8f, 0xf5, 0xcc, 0xbe, 0x42, 0x65, 0x4e, 0x69, + 0x35, 0x55, 0xa5, 0x3e, 0xc4, 0xf0, 0xde, 0x60, 0x54, 0xdf, + 0xbb, 0x83, 0xad, 0xdf, 0xa5, 0x24, 0x8f, 0xbe, 0x0b, 0x16, + 0xfc, 0xf2, 0x64, 0xd5, 0x79, 0x68, 0xf3, 0x91, 0x81, 0x2a, + 0xd7, 0x1c, 0xc0, 0xdd, 0xe6, 0xb6, 0xb3, 0xa2, 0x4f, 0xc0, + 0x6d, 0x77, 0x02, 0xee, 0x43, 0xd6, 0x5e, 0x82, 0x66, 0x7f, + 0xb4, 0xe6, 0x5c, 0xff, 0x87, 0x1e, 0x1d, 0x6f, 0x1d, 0x96, + 0x6d, 0xbd, 0x90, 0x57, 0x65, 0xc2, 0x01, 0x35, 0xfa, 0x9a, + 0xc6, 0xe0, 0x4e, 0x2c, 0x4b, 0x16, 0xfa, 0x0d, 0x38, 0x87, + 0x39, 0x2c, 0x2b, 0x48, 0x14, 0x92, 0x3d, 0x83, 0x00, 0xa9, + 0x1a, 0x3d, 0x4d, 0x30, 0x23, 0x48, 0xcd, 0xd5, 0xcd, 0x01, + 0xb1, 0x45, 0x85, 0xcc, 0x66, 0x47, 0x1d, 0x63, 0x3d, 0x70, + 0xb8, 0x0c, 0xfd, 0xe3, 0xb2, 0x0f, 0x64, 0x6e, 0xb9, 0x2b, + 0xe5, 0xb0, 0x4d, 0x44, 0x4d, 0x66, 0x1a, 0xfa, 0x49, 0xbb, + 0xc3, 0xb8, 0xad, 0x64, 0x23, 0x7e, 0x71, 0x9f, 0x59, 0xec, + 0x25, 0xa8, 0x5e, 0x11, 0xd6, 0x6e, 0xc9, 0x09, 0xe7, 0xb9, + 0x6a, 0x63, 0x91, 0xaa, 0x5d, 0xd2, 0x8c, 0x91, 0xe8, 0x8d, + 0x35, 0x6d, 0x10, 0xf6, 0xfc, 0x6a, 0x3c, 0x77, 0x90, 0xf8, + 0x2a, 0x49, 0x13, 0x7f, 0xdb, 0xf5, 0x0c, 0xe9, 0xc8, 0x57, + 0xc6, 0xfd, 0x26, 0x8d, 0x79, 0xb5, 0xdd, 0x47, 0x74, 0x6e, + 0xe8, 0x8f, 0x50, 0xf5, 0xa7, 0x9e, 0xd1, 0x74, 0x10, 0xbb, + 0xf4, 0x8f, 0x8f, 0x0d, 0xcd, 0x1f, 0xf6, 0x59, 0xb8, 0x6c, + 0xd2, 0x37, 0x83, 0x28, 0xb2, 0x36, 0xc1, 0x39, 0x5b, 0xde, + 0x59, 0xee, 0x77, 0xa2, 0x6e, 0x67, 0xc6, 0xea, 0x1d, 0x2b, + 0x41, 0x8f, 0x6f, 0x96, 0x94, 0x1b, 0x5d, 0xab, 0x30, 0x53, + 0x1e, 0xf8, 0x17, 0x06, 0xea, 0xcc, 0x98, 0xa8, 0xdf, 0x81, + 0xe1, 0x80, 0xb7, 0xad, 0x69, 0xcb, 0x8f, 0x81, 0x1e, 0x76, + 0x75, 0x3c, 0x11, 0x9b, 0x38, 0x95, 0xa7, 0x87, 0x1f, 0xd9, + 0x76, 0x82, 0x21, 0x13, 0x25, 0x20, 0x42, 0xd3, 0x8c, 0xd9, + 0x1c, 0x64, 0xed, 0xe9, 0x55, 0xb5, 0x29, 0x98, 0x85, 0x7c, + 0x01, 0x94, 0xaa, 0xdd, 0x8c, 0x78, 0x08, 0x99, 0x99, 0x5a, + 0xf6, 0x61, 0x4c, 0xe0, 0x99, 0xf8, 0x15, 0x74, 0x2e, 0x0d, + 0x14, 0x89, 0x11, 0x84, 0xcd, 0x78, 0x0c, 0x6b, 0x48, 0xde, + 0xb4, 0xd6, 0x05, 0xbd, 0x99, 0x58, 0xb7, 0xe5, 0xc5, 0x7a, + 0x43, 0x18, 0x55, 0x33, 0x16, 0x2b, 0xfa, 0x27, 0xf5, 0xbb, + 0xaa, 0x52, 0xb5, 0x28, 0x5c, 0xfe, 0x61, 0x7f, 0x7a, 0x70, + 0xc2, 0x32, 0x4b, 0x05, 0x8d, 0x7b, 0x4d, 0x22, 0x57, 0x25, + 0x40, 0x46, 0x7c, 0xad, 0x2f, 0x8a, 0xc8, 0x16, 0xd6, 0xac, + 0x4e, 0xe3, 0xe3, 0x29, 0xe4, 0xe8, 0x00, 0x2b, 0xc9, 0xe3, + 0x3a, 0x6f, 0x66, 0xf1, 0x37, 0x37, 0x52, 0x88, 0x77, 0xf6, + 0xbd, 0x59, 0x5f, 0xf8, 0x11, 0x46, 0x7b, 0x12, 0x88, 0x2f, + 0x4b, 0x0d, 0x16, 0x89, 0x3e, 0x2a, 0x56, 0x58, 0xa8, 0x1c, + 0xee, 0x23, 0xd5, 0x66, 0x86, 0x5f, 0x59, 0x55, 0xac, 0x07, + 0xfd, 0xda, 0x6b, 0xf1, 0xc7, 0x01, 0x19, 0xdb, 0xff, 0x63, + 0x6f, 0x27, 0xdb, 0xa1, 0xc7, 0xe9, 0xe0, 0xdb, 0xe4, 0x9a, + 0xce, 0xf5, 0xac, 0x68, 0xab, 0x59, 0x0c, 0x83, 0xa3, 0x1c, + 0x2a, 0x86, 0x55, 0xe2, 0xaa, 0xa1, 0xb3, 0xed, 0xc2, 0x2d, + 0x43, 0xc5, 0x13, 0x68, 0xe4, 0x83, 0x3e, 0xd5, 0x7f, 0xf7, + 0xd5, 0xd0, 0x60, 0xd3, 0x70, 0x7f, 0x88, 0xaa, 0xca, 0x74, + 0xcc, 0x50, 0x8d, 0x55, 0x9c, 0xfe, 0x4a, 0xc6, 0xc9, 0x36, + 0xf7, 0x27, 0x26, 0x64, 0xd3, 0x6c, 0xdb, 0x16, 0x31, 0x81, + 0xe9, 0xce, 0x73, 0x60, 0x61, 0x9c, 0x0f, 0xb5, 0x6e, 0x68, + 0xbc, 0xb1, 0x9e, 0x9f, 0xcd, 0x6c, 0x27, 0x31, 0x2d, 0x40, + 0x36, 0xce, 0x91, 0xee, 0x47, 0xdc, 0xa0, 0x4f, 0xd7, 0x14, + 0x4f, 0x93, 0x00, 0xc4, 0x34, 0xca, 0xd4, 0x42, 0x21, 0x90, + 0xf6, 0x9d, 0xea, 0x45, 0x15, 0xfe, 0x2d, 0xd6, 0xab, 0xc2, + 0x36, 0x47, 0xc0, 0x5b, 0xd2, 0xae, 0x53, 0x33, 0xb0, 0x2d, + 0x29, 0xa3, 0x14, 0xda, 0xa4, 0x48, 0xc1, 0x57, 0x0c, 0xdc, + 0x72, 0x4a, 0xd0, 0xf5, 0x5b, 0x9a, 0x57, 0x1d, 0x06, 0xc8, + 0x0f, 0xc7, 0x5b, 0x70, 0xbb, 0x27, 0xf4, 0xe2, 0xf4, 0xf3, + 0x3c, 0xdc, 0xba, 0x43, 0xc4, 0x4e, 0xe2, 0x96, 0xd4, 0x6c, + 0x33, 0x3e, 0xbf, 0x85, 0xf7, 0x3c, 0x1d, 0x46, 0x59, 0x4e, + 0xa1, 0xa7, 0xa3, 0x76, 0x55, 0x8a, 0x72, 0x83, 0xd0, 0x45, + 0x86, 0x38, 0xa5, 0x4d, 0xc8, 0x62, 0xe4, 0x8a, 0xd5, 0x8e, + 0xb7, 0x4c, 0x6e, 0xaf, 0xa4, 0xbe, 0x88, 0x87, 0x77, 0xd1, + 0x7b, 0xb2, 0x1d, 0xe0, 0x1e, 0x53, 0x30, 0x31, 0x15, 0x6c, + 0x10, 0x81, 0x03, 0x55, 0xa7, 0x69, 0xb6, 0xa5, 0x48, 0xf4, + 0xb2, 0x3b, 0x76, 0x8b, 0x2e, 0x42, 0xa6, 0xaa, 0x7e, 0x66, + 0x57, 0xc2, 0x11, 0xc5, 0x2c, 0x7d, 0x96, 0xdf, 0xe3, 0x58, + 0x12, 0x98, 0x18, 0x0d, 0x87, 0xbd, 0x64, 0xbd, 0xfe, 0x6d, + 0xad, 0x6d, 0x1e, 0xf6, 0x34, 0x01, 0xb5, 0x56, 0xe8, 0x6a, + 0xb3, 0x8c, 0x70, 0x84, 0x36, 0x17, 0xd6, 0x4b, 0xaa, 0x57, + 0xab, 0xb3, 0x45, 0x30, 0x36, 0x10, 0xd4, 0xee, 0x8a, 0xc9, + 0x29, 0xd1, 0x92, 0x9b, 0xe2, 0x7c, 0x12, 0xd1, 0x29, 0x62, + 0x41, 0x69, 0xae, 0x3a, 0x50, 0xcc, 0x89, 0x50, 0x2e, 0xe6, + 0x07, 0xf8, 0x9c, 0x98, 0x80, 0xd5, 0xa3, 0xc8, 0x74, 0xfb, + 0xfc, 0x91, 0x16, 0x02, 0xdc, 0xf0, 0x42, 0x49, 0xbc, 0xc9, + 0x2f, 0x7f, 0x8d, 0x93, 0xf7, 0xf0, 0x74, 0xb7, 0xd1, 0x55, + 0xfc, 0x79, 0x03, 0x37, 0xfb, 0xf6, 0x7d, 0x2f, 0x2d, 0xf8, + 0x6b, 0xc5, 0xf9, 0x66, 0x38, 0xf5, 0xfd, 0x64, 0xc6, 0x08, + 0x99, 0xb3, 0x25, 0xad, 0xf4, 0xfd, 0x69, 0x2f, 0xf1, 0x18, + 0x46, 0xd6, 0x5c, 0x1a, 0x37, 0xcd, 0xee, 0xa3, 0xbf, 0x0f, + 0x57, 0x5c, 0xc3, 0x97, 0x94, 0x84, 0x89, 0xbe, 0x00, 0xf6, + 0x40, 0xe9, 0x5a, 0x52, 0xaf, 0x3a, 0x5b, 0xf4, 0x56, 0xb0, + 0x04, 0x49, 0xc6, 0x32, 0x8c, 0xa1, 0x0a, 0xd8, 0x88, 0xa1, + 0xc3, 0xb7, 0x8b, 0x96, 0xc3, 0x39, 0x51, 0x50, 0x83, 0xa6, + 0xf0, 0x6d, 0xe7, 0x6e, 0x20, 0xff, 0x9d, 0xac, 0x03, 0x57, + 0xbc, 0xcb, 0x6a, 0x19, 0xa7, 0xc5, 0xd2, 0x44, 0x4f, 0x17, + 0x1e, 0x9a, 0x8d, 0x97, 0x25, 0x55, 0x52, 0x49, 0xe2, 0x48, + 0xae, 0x4b, 0x3f, 0x94, 0x5a, 0xb2, 0x2d, 0x40, 0xd9, 0x85, + 0xef, 0x03, 0xa0, 0xd3, 0x66, 0x9a, 0x8f, 0x7b, 0xc0, 0x8d, + 0x54, 0x95, 0x42, 0x49, 0xeb, 0x15, 0x00, 0xf3, 0x6d, 0x6f, + 0x40, 0xf2, 0x8b, 0xc1, 0x50, 0xa6, 0x22, 0x3b, 0xd6, 0x88, + 0xa1, 0xf7, 0xb0, 0x1f, 0xcd, 0x20, 0x4e, 0x5b, 0xad, 0x66, + 0x4a, 0xda, 0x40, 0xee, 0x4c, 0x4c, 0x3e, 0xa7, 0x75, 0x51, + 0x90, 0xba, 0xee, 0x59, 0xbc, 0xe3, 0xcd, 0x4d, 0xb9, 0x57, + 0xb7, 0xf8, 0xc1, 0xb9, 0x8d, 0x0f, 0x58, 0x2c, 0x4c, 0x98, + 0xa6, 0x9c, 0xd9, 0x0e, 0x25, 0x4f, 0xea, 0x4c, 0x15, 0x0b, + 0x89, 0xe4, 0xac, 0xa1, 0x5a, 0xa1, 0xfd, 0x5b, 0xc6, 0xfe, + 0xf0, 0xf1, 0x4c, 0xa7, 0x60, 0xbc, 0xc3, 0xa5, 0x80, 0x00, + 0x3b, 0x3f, 0x22, 0x38, 0x60, 0x40, 0x76, 0x52, 0x83, 0x32, + 0xee, 0x20, 0x6a, 0xf9, 0x1e, 0x6b, 0x99, 0x52, 0xe7, 0x04, + 0xdc, 0x5a, 0x9d, 0x77, 0x8a, 0xdd, 0x9b, 0x53, 0x19, 0xff, + 0x69, 0x8c, 0xbc, 0xc6, 0xe0, 0x79, 0x0d, 0x3d, 0x3d, 0x54, + 0x5b, 0xe0, 0x47, 0x5b, 0x71, 0x05, 0x98, 0x8f, 0xbb, 0x65, + 0xe1, 0x31, 0x9a, 0xc8, 0x1e, 0x7a, 0x4a, 0xf8, 0xcb, 0x17, + 0xd1, 0x83, 0x58, 0xb1, 0xc0, 0xe4, 0xb1, 0x85, 0xca, 0xa5, + 0xf8, 0x0e, 0xd1, 0x0c, 0xe8, 0x71, 0xc3, 0xfa, 0xbf, 0x1d, + 0xd6, 0x98, 0x03, 0xed, 0x77, 0x3b, 0x55, 0xaf, 0x69, 0x72, + 0x6b, 0x42, 0x31, 0x98, 0x95, 0xd5, 0x79, 0xa5, 0x4c, 0x51, + 0xcf, 0x02, 0x65, 0x93, 0xf2, 0x71, 0xdc, 0xde, 0x9a, 0xa3, + 0x86, 0xa7, 0xea, 0xcf, 0xd7, 0xe5, 0x00, 0xde, 0x40, 0x02, + 0xcd, 0x6b, 0x46, 0x0b, 0xbb, 0xbf, 0x77, 0x5f, 0x9d, 0x7c, + 0xa4, 0x7f, 0x7c, 0x8a, 0xba, 0xd6, 0x99, 0xc5, 0xaa, 0x06, + 0x36, 0xe1, 0x7e, 0x9c, 0x6f, 0x28, 0xd4, 0x6e, 0x1d, 0x5b, + 0xdd, 0x01, 0x24, 0xbd, 0x6c, 0x5d, 0x87, 0x3c, 0xc1, 0xf6, + 0x93, 0x37, 0xe2, 0x3b, 0x70, 0xc4, 0xd8, 0x10, 0x0e, 0x44, + 0x37, 0x00, 0xe3, 0x07, 0xbd, 0x67, 0xd3, 0x9d, 0xe6, 0xe7, + 0x48, 0x1b, 0xe0, 0x79, 0xb3, 0x30, 0x91, 0x89, 0x0f, 0x89, + 0x77, 0xfa, 0x13, 0x85, 0xd0, 0x32, 0xbd, 0xc1, 0x9e, 0x52, + 0x04, 0x80, 0x54, 0xb1, 0x08, 0x39, 0x20, 0xda, 0x3e, 0xf1, + 0xd9, 0x15, 0x74, 0x55, 0x06, 0xfc, 0x4d, 0x85, 0xd4, 0x98, + 0x02, 0x64, 0x10, 0x86, 0xd7, 0xcd, 0x01, 0x0d, 0x85, 0xa0, + 0x78, 0xb0, 0x58, 0x99, 0x7b, 0xdf, 0xe4, 0x8c, 0x3f, 0xab, + 0xc0, 0xbc, 0xa5, 0x30, 0x28, 0xe1, 0x4e, 0x02, 0x98, 0xab, + 0x03, 0xf3, 0x21, 0xe7, 0xa7, 0xe7, 0xc3, 0x5f, 0x98, 0xc0, + 0x83, 0x02, 0xe8, 0x8a, 0x30, 0x75, 0x95, 0xcf, 0x77, 0x83, + 0xfb, 0x32, 0x5a, 0xf9, 0x13, 0xed, 0xdb, 0xda, 0xc3, 0x84, + 0x4b, 0x8f, 0x1a, 0xf0, 0xad, 0x8e, 0xcf, 0xe3, 0xa7, 0x2b, + 0xb5, 0x44, 0x75, 0xd6, 0xda, 0x33, 0x81, 0x22, 0xa7, 0x6a, + 0xbd, 0x21, 0x64, 0x85, 0xfa, 0x65, 0x8e, 0xc4, 0x58, 0xec, + 0xc4, 0x18, 0x90, 0xa3, 0xcc, 0x2e, 0xaa, 0xa2, 0x2e, 0x46, + 0x7a, 0x4a, 0x35, 0xbf, 0x58, 0x78, 0x2b, 0x1e, 0x72, 0xe5, + 0x80, 0xc9, 0xe0, 0x9e, 0x43, 0x01, 0xcc, 0xe1, 0x0c, 0x00, + 0xe9, 0xc1, 0xa5, 0x1a, 0x9b, 0x4e, 0x6e, 0x34, 0x32, 0xfd, + 0x86, 0xb7, 0xae, 0xc3, 0x6e, 0x69, 0x04, 0xf6, 0x6a, 0x92, + 0x78, 0xb1, 0x1f, 0x9d, 0x5e, 0x0c, 0xf9, 0xc4, 0x1a, 0xf6, + 0xb4, 0x8a, 0x63, 0xb5, 0x87, 0x5b, 0xfb, 0x50, 0xbf, 0xd5, + 0x17, 0x97, 0x8e, 0x55, 0x1c, 0xfe, 0x82, 0xf6, 0xa7, 0x9c, + 0x0b, 0xc9, 0x0a, 0xf6, 0x7f, 0x70, 0xd1, 0x00, 0xed, 0x1c, + 0x6c, 0x3a, 0x95, 0xed, 0x61, 0xa4, 0xd6, 0x57, 0xfb, 0x57, + 0xf8, 0x9b, 0x4c, 0xce, 0x50, 0x26, 0x5c, 0x19, 0xd2, 0xa7, + 0xd6, 0xe8, 0x3c, 0x29, 0x34, 0xfb, 0x26, 0x7f, 0xc5, 0x78, + 0xbf, 0xfe, 0xb6, 0x2a, 0x5a, 0x62, 0x8e, 0x31, 0x9b, 0x57, + 0xa4, 0xe7, 0x4d, 0x3d, 0x18, 0x05, 0xf0, 0x94, 0xbb, 0x04, + 0xfa, 0x0a, 0x92, 0xf4, 0xc6, 0x7f, 0x16, 0xa2, 0x31, 0xed, + 0xc1, 0xb4, 0x62, 0x54, 0x3a, 0x23, 0x12, 0x6a, 0x76, 0xcc, + 0x8c, 0x91, 0x89, 0x58, 0x8c, 0x20, 0x23, 0xd9, 0xaa, 0x0d, + 0x80, 0xbe, 0xb9, 0xb4, 0x40, 0x1e, 0xff, 0xa9, 0xf7, 0x71, + 0x0a, 0xa0, 0x0a, 0xdf, 0x11, 0x0b, 0x66, 0x3f, 0xf2, 0x4d, + 0x5d, 0x39, 0x7c, 0x77, 0xe1, 0xb1, 0x09, 0xa1, 0x6b, 0x2e, + 0x30, 0x43, 0x33, 0x80, 0x6e, 0x6a, 0x1d, 0x47, 0xd9, 0xd6, + 0xac, 0xdc, 0x3f, 0x16, 0xb1, 0x58, 0x11, 0x9f, 0x67, 0xd7, + 0x15, 0x45, 0xd8, 0xc3, 0x69, 0x24, 0x8d, 0xac, 0xff, 0xc3, + 0x43, 0xfd, 0x24, 0xaf, 0xf1, 0xc8, 0x3a, 0xc7, 0xd6, 0x1f, + 0x56, 0x26, 0x16, 0xe6, 0x30, 0xcd, 0x6e, 0x0a, 0x63, 0x2a, + 0x7b, 0x86, 0xd7, 0x65, 0x39, 0x45, 0x7c, 0xe6, 0xa0, 0xe6, + 0x38, 0xed, 0x54, 0x84, 0x00, 0x4d, 0x8e, 0xc2, 0xba, 0x56, + 0x9b, 0xf3, 0xe1, 0xe8, 0x7d, 0xfe, 0x47, 0xf0, 0x58, 0xe7, + 0x59, 0x60, 0x97, 0x2e, 0x57, 0x1a, 0x09, 0x1f, 0x8b, 0x2b, + 0x0b, 0x47, 0x75, 0xc0, 0xb3, 0x79, 0xce, 0x10, 0x47, 0x6d, + 0xfc, 0xcb, 0x22, 0x61, 0x5c, 0x39, 0xc4, 0x3f, 0xc5, 0xef, + 0xb8, 0xc8, 0x88, 0x52, 0xce, 0x90, 0x17, 0xf5, 0x3c, 0xa9, + 0x87, 0x6f, 0xcb, 0x2f, 0x11, 0x53, 0x65, 0x9b, 0x74, 0x21, + 0x3e, 0xdd, 0x7b, 0x1f, 0x19, 0x9f, 0x53, 0xe6, 0xab, 0xc0, + 0x56, 0xba, 0x80, 0x19, 0x5d, 0x3f, 0xc7, 0xe2, 0xfb, 0x8c, + 0xe2, 0x93, 0xe0, 0x31, 0xc9, 0x33, 0x31, 0x23, 0x31, 0xa1, + 0x36, 0x4c, 0x62, 0xd8, 0x0a, 0xfd, 0x85, 0x97, 0xae, 0xa9, + 0xe9, 0x58, 0x29, 0x17, 0x33, 0x09, 0x5a, 0x8e, 0xa3, 0x90, + 0x41, 0xd3, 0xfc, 0x24, 0x98, 0x61, 0x4d, 0x30, 0x1f, 0x76, + 0x8f, 0xfc, 0xd0, 0x96, 0x8b, 0x2e, 0x9b, 0x24, 0x73, 0x35, + 0x00, 0xb7, 0xf6, 0xe8, 0xba, 0xec, 0x98, 0x74, 0x41, 0xa4, + 0x47, 0x10, 0x0d, 0xbc, 0xba, 0xd1, 0xe7, 0xdb, 0x12, 0xcb, + 0x5f, 0x02, 0xb1, 0xa6, 0xa0, 0xd7, 0x28, 0x30, 0x3e, 0x0a, + 0x5c, 0x5f, 0xe6, 0x2f, 0x3c, 0xde, 0x46, 0x60, 0xaf, 0x07, + 0x5f, 0xed, 0x08, 0xc0, 0x06, 0x58, 0xba, 0xd7, 0x36, 0x5b, + 0xa0, 0x4a, 0xf7, 0xa1, 0x05, 0x9b, 0x00, 0xda, 0x49, 0xdc, + 0xbf, 0xea, 0xe1, 0x03, 0xda, 0x95, 0x95, 0xa0, 0xfa, 0x2e, + 0xf1, 0x60, 0x11, 0x47, 0xdd, 0xb3, 0xfb, 0x0b, 0xa2, 0x92, + 0xcf, 0x73, 0xbb, 0xce, 0x82, 0x71, 0xbc, 0xbd, 0x50, 0x64, + 0xf1, 0x96, 0x48, 0x48, 0x93, 0xf8, 0xdc, 0x1c, 0x18, 0x12, + 0xc6, 0x17, 0x6a, 0xa9, 0xc1, 0x4d, 0x6f, 0x76, 0xda, 0x2f, + 0x4e, 0x59, 0xdd, 0x8b, 0x1c, 0xa5, 0x30, 0xb6, 0xe9, 0x88, + 0x8f, 0x75, 0x0c, 0xcd, 0xd8, 0x61, 0xf4, 0x28, 0xc5, 0x9a, + 0xcd, 0x77, 0x0d, 0x36, 0x5f, 0x75, 0xa5, 0x0a, 0x77, 0x20, + 0x28, 0x5a, 0xac, 0x5f, 0xa1, 0x83, 0x67, 0x70, 0xb7, 0xd8, + 0x23, 0x48, 0x60, 0xa8, 0xd0, 0xaf, 0xee, 0x7a, 0xb8, 0x25, + 0xd7, 0x8f, 0x82, 0x8c, 0xd0, 0x81, 0x7a, 0x49, 0x69, 0xe4, + 0x22, 0x73, 0x29, 0x48, 0xc8, 0x09, 0x72, 0x16, 0xf8, 0x3d, + 0xff, 0x13, 0xac, 0x98, 0x03, 0x76, 0x33, 0xcb, 0x19, 0xb0, + 0x22, 0x5b, 0x1e, 0x16, 0x29, 0xb9, 0xcc, 0xa6, 0x92, 0xd8, + 0xed, 0x93, 0x0f, 0xbd, 0x10, 0x98, 0x53, 0x0a, 0x07, 0x7f, + 0xd6, 0x51, 0x76, 0xda, 0xdc, 0x0c, 0xeb, 0x2a, 0x95, 0xd0, + 0x3e, 0xa6, 0xc4, 0xc6, 0xd8, 0xfb, 0x1b, 0x2a, 0x7f, 0xf1, + 0x08, 0xbe, 0xd3, 0xed, 0x67, 0x63, 0x5f, 0x1d, 0x29, 0xdb, + 0x47, 0x03, 0x4a, 0xf4, 0x6b, 0xb4, 0x46, 0x02, 0x28, 0x4f, + 0x88, 0x9b, 0x46, 0x66, 0x40, 0x56, 0x34, 0x4c, 0xec, 0x8e, + 0x0b, 0x5d, 0x14, 0x94, 0x91, 0xfc, 0xdc, 0x0c, 0xdc, 0x5b, + 0x45, 0x12, 0x7e, 0xa1, 0xe9, 0x75, 0x38, 0xcb, 0xd3, 0x6b, + 0xd7, 0xa4, 0x24, 0x94, 0x78, 0x09, 0x7f, 0x77, 0xc8, 0x6d, + 0xe1, 0x82, 0x1c, 0x1c, 0x91, 0xc6, 0x38, 0x9e, 0x3b, 0x3d, + 0x31, 0xdd, 0x9e, 0x46, 0x58, 0x7a, 0x42, 0x16, 0x6f, 0xfd, + 0x7d, 0x8c, 0xf5, 0xf0, 0x9f, 0x92, 0x6e, 0xbe, 0x47, 0xa6, + 0x1e, 0x8e, 0x82, 0x15, 0x24, 0xc3, 0x1b, 0xb0, 0xd1, 0x68, + 0xf9, 0xd1, 0x7c, 0x60, 0x98, 0x86, 0xd9, 0x53, 0xa2, 0x38, + 0x62, 0xf4, 0x72, 0x71, 0xcb, 0xb9, 0x35, 0xef, 0xb9, 0x49, + 0x3a, 0x73, 0xb2, 0xd7, 0x0f, 0x90, 0xf5, 0x2c, 0x5b, 0xf5, + 0xfd, 0x39, 0x17, 0xf7, 0xe4, 0x69, 0x81, 0x0f, 0x6b, 0xe7, + 0x32, 0xd2, 0xdc, 0x5d, 0x40, 0xbf, 0x41, 0x95, 0x89, 0x81, + 0x29, 0x80, 0x40, 0xa3, 0xac, 0xd2, 0xc7, 0xf7, 0xe8, 0xd0, + 0x45, 0xed, 0x48, 0x43, 0x3a, 0xed, 0x8d, 0xef, 0x37, 0xe1, + 0x24, 0x9a, 0x67, 0x9a, 0x6b, 0x71, 0x4f, 0x9a, 0xb9, 0x2c, + 0x1b, 0x10, 0x48, 0xe2, 0x31, 0x1e, 0xbb, 0xf2, 0x4a, 0xad, + 0x04, 0xc7, 0xd7, 0xf2, 0xe8, 0x83, 0x5f, 0xe8, 0xa2, 0x81, + 0x95, 0xf9, 0x60, 0x51, 0x9c, 0x99, 0x76, 0x69, 0x76, 0x4e, + 0xbd, 0x44, 0x52, 0x36, 0xca, 0xd8, 0x6e, 0xf7, 0x1a, 0xa1, + 0x54, 0xdf, 0x90, 0x52, 0x94, 0xb6, 0x3a, 0xcb, 0x43, 0x56, + 0x11, 0xde, 0xa0, 0xe1, 0x45, 0x8a, 0x80, 0x2d, 0xaf, 0x1f, + 0x24, 0x3f, 0x80, 0x17, 0x1f, 0x28, 0xbb, 0xcc, 0x1a, 0xd2, + 0x2d, 0xa6, 0x9e, 0xe0, 0xdc, 0xf0, 0x98, 0x16, 0x58, 0x88, + 0xc6, 0xf1, 0x81, 0x71, 0x91, 0x8f, 0xa2, 0xab, 0xa5, 0xe6, + 0x68, 0x1f, 0xa5, 0x86, 0xb5, 0xd9, 0x05, 0xba, 0x50, 0x67, + 0x0b, 0x1e, 0xfe, 0x42, 0x50, 0xf8, 0x01, 0xf8, 0x38, 0x92, + 0x57, 0x86, 0x08, 0x47, 0xee, 0x23, 0x11, 0x60, 0x61, 0x1a, + 0x77, 0x3c, 0x1a, 0x8e, 0x08, 0xe3, 0xaf, 0x84, 0x04, 0x75, + 0x15, 0x47, 0x7a, 0x83, 0x8e, 0x92, 0x3e, 0xe8, 0xf0, 0xc2, + 0x81, 0x89, 0x3b, 0x73, 0x81, 0xe5, 0xe8, 0x97, 0x97, 0x63, + 0x64, 0xf3, 0xa9, 0x1b, 0x61, 0x65, 0x7f, 0x0e, 0x47, 0x6b, + 0x14, 0x57, 0x29, 0x8f, 0x91, 0x35, 0x43, 0x10, 0x12, 0x86, + 0x99, 0xec, 0xc8, 0x9e, 0x67, 0x90, 0x20, 0x21, 0x3c, 0x83, + 0xdb, 0x73, 0x4e, 0x8e, 0x7d, 0x86, 0xde, 0xb8, 0xd8, 0xfa, + 0x23, 0x1f, 0x5a, 0xe4, 0xc7, 0x0c, 0x1d, 0x5e, 0xd1, 0x10, + 0x58, 0xd5, 0x86, 0xfa, 0x40, 0x30, 0x0a, 0x78, 0x0a, 0xa5, + 0x56, 0xd5, 0xe6, 0x86, 0xd4, 0x14, 0x77, 0x32, 0xcd, 0x07, + 0xf9, 0xbe, 0x7a, 0xd8, 0xbc, 0x91, 0xe0, 0xda, 0x76, 0x6b, + 0x97, 0x10, 0xda, 0xea, 0x27, 0xa2, 0x67, 0x6d, 0x94, 0x27, + 0x6e, 0xea, 0xca, 0x56, 0x45, 0x32, 0x1d, 0x38, 0x12, 0x21, + 0x33, 0x2c, 0x3c, 0x5c, 0x33, 0xb0, 0x9e, 0x80, 0x0b, 0x4e, + 0xbb, 0x09, 0x5e, 0x56, 0x54, 0xb0, 0x9b, 0x7e, 0xb6, 0x00, + 0xe8, 0x63, 0x19, 0x85, 0xf1, 0x4d, 0x65, 0x9d, 0x1f, 0x8d, + 0x18, 0xcc, 0x63, 0xc6, 0xd9, 0xa6, 0xbc, 0xe7, 0x42, 0x55, + 0x12, 0xdc, 0x8c, 0x26, 0x2d, 0x8d, 0xc2, 0xe9, 0x3b, 0xbc, + 0xed, 0x06, 0x08, 0x31, 0xb0, 0xe0, 0x99, 0xe2, 0x86, 0x81, + 0x88, 0x4a, 0xac, 0x1f, 0x4a, 0xb2, 0x1e, 0x1e, 0x4c, 0xb2, + 0x9f, 0x27, 0xa0, 0xd9, 0x8a, 0x7e, 0xe7, 0xa3, 0xad, 0xeb, + 0x2c, 0xfd, 0x14, 0xc6, 0x4b, 0x26, 0xce, 0x38, 0xb9, 0x01, + 0x9e, 0xde, 0xc8, 0x7b, 0x82, 0x2f, 0xaa, 0x72, 0x80, 0xbe, + 0x3a, 0x35, 0x95, 0xc8, 0xf3, 0x7c, 0x36, 0x68, 0x02, 0xdc, + 0xa2, 0xda, 0xef, 0xd7, 0xf1, 0x3e, 0x81, 0xb3, 0x5d, 0x2f, + 0xcf, 0x7e, 0xe6, 0x9c, 0xa0, 0x32, 0x29, 0x8b, 0x52, 0x24, + 0xbd, 0x0d, 0x36, 0xdc, 0x1d, 0xcc, 0x6a, 0x0a, 0x74, 0x52, + 0x1b, 0x68, 0x4d, 0x15, 0x05, 0x47, 0xe1, 0x2f, 0x97, 0x45, + 0x52, 0x17, 0x4b, 0x2a, 0x3b, 0x74, 0xc5, 0x20, 0x35, 0x5c, + 0x37, 0xae, 0xe6, 0xa7, 0x24, 0x0f, 0x34, 0x70, 0xea, 0x7c, + 0x03, 0xa3, 0xde, 0x2d, 0x22, 0x55, 0x88, 0x01, 0x45, 0xf2, + 0x5f, 0x1f, 0xaf, 0x3b, 0xb1, 0xa6, 0x5d, 0xcd, 0x93, 0xfb, + 0xf8, 0x2f, 0x87, 0xcc, 0x26, 0xc5, 0x36, 0xde, 0x06, 0x9b, + 0xe9, 0xa7, 0x66, 0x7e, 0x8c, 0xcd, 0x99, 0x6b, 0x51, 0x1c, + 0xb0, 0xa0, 0xfa, 0xc7, 0x46, 0xfe, 0x65, 0xe4, 0x80, 0x5b, + 0x5f, 0x24, 0x3b, 0xa4, 0xe6, 0x81, 0x31, 0xe5, 0x87, 0x2c, + 0xa4, 0x83, 0xaf, 0x8b, 0x9f, 0x89, 0xb4, 0x3c, 0x7a, 0xbe, + 0x4c, 0xb3, 0xbf, 0x3d, 0xec, 0x78, 0xb0, 0x8a, 0xdd, 0xc8, + 0x43, 0x8c, 0x45, 0xa1, 0xa3, 0x3a, 0x82, 0x7d, 0x06, 0xdf, + 0x20, 0x27, 0x9b, 0x4e, 0x09, 0x90, 0x6a, 0x23, 0xbf, 0x1b, + 0x04, 0x1d, 0x50, 0xe2, 0xb4, 0xff, 0xe0, 0xd0, 0x9b, 0x40, + 0x2b, 0xc0, 0x52, 0xc1, 0x39, 0x29, 0x60, 0x83, 0x06, 0x9b, + 0x48, 0xb8, 0xa7, 0xe1, 0x2b, 0xfb, 0xf0, 0x2b, 0x82, 0xf1, + 0xda, 0xc9, 0x30, 0x47, 0x3f, 0xf5, 0xf9, 0xf7, 0x6c, 0xf0, + 0x0f, 0xe7, 0xb1, 0x4d, 0x46, 0x49, 0xf8, 0xb3, 0xe1, 0xfe, + 0x85, 0x61, 0xcc, 0xf7, 0xfa, 0xd2, 0xf1, 0xbc, 0xf0, 0x7f, + 0x3b, 0xe6, 0x45, 0xa2, 0x1b, 0x55, 0xf6, 0x0c, 0x02, 0x95, + 0xdc, 0x78, 0x94, 0xa0, 0xc4, 0x6a, 0x21, 0x7e, 0xa8, 0x5f, + 0xbd, 0xc3, 0xb3, 0x4d, 0x9b, 0x30, 0x31, 0x1d, 0x5b, 0x8b, + 0x45, 0x3c, 0x18, 0xe9, 0x61, 0xe8, 0x76, 0x3e, 0x91, 0xd2, + 0xfd, 0x1a, 0xd7, 0x30, 0x4d, 0xfe, 0xef, 0x7f, 0xc0, 0x7e, + 0x45, 0x43, 0xe9, 0xf9, 0x23, 0xfe, 0xd8, 0xef, 0xbc, 0xd6, + 0x99, 0x79, 0x54, 0xed, 0x7a, 0x8b, 0x39, 0xa6, 0xe7, 0x9d, + 0x3f, 0x9f, 0x35, 0xe1, 0xe4, 0xd5, 0x26, 0x31, 0x3a, 0x44, + 0x03, 0x79, 0xde, 0xdc, 0x29, 0x1e, 0x8e, 0x26, 0x41, 0xc6, + 0x60, 0xaa, 0xfd, 0xe1, 0x5e, 0xa6, 0xc0, 0x2f, 0x90, 0x1e, + 0x3b, 0xc1, 0xe6, 0xf6, 0xde, 0x60, 0x87, 0x57, 0x51, 0x11, + 0x6a, 0x8e, 0x9d, 0x70, 0x9d, 0x6d, 0x36, 0x21, 0x05, 0x55, + 0xc1, 0x56, 0x9b, 0xc9, 0x91, 0x50, 0x3e, 0xb4, 0xbd, 0x19, + 0x53, 0x44, 0x99, 0xc7, 0xb8, 0xce, 0xce, 0x86, 0x06, 0x5d, + 0x99, 0x85, 0x33, 0xd4, 0x16, 0x21, 0x4a, 0xe9, 0x7e, 0x2e, + 0xcc, 0x7e, 0x3f, 0xc1, 0x47, 0x3b, 0x32, 0xd0, 0x57, 0x1c, + 0xc2, 0x26, 0x67, 0xf0, 0xd9, 0xc4, 0x9e, 0xbb, 0x65, 0xa4, + 0xf7, 0xf7, 0x8d, 0x7d, 0x08, 0xd4, 0x9c, 0x1e, 0x0f, 0xb9, + 0xff, 0x24, 0x2f, 0xaf, 0xfa, 0x24, 0x26, 0xb7, 0xb1, 0x78, + 0xc1, 0xd1, 0xfe, 0x85, 0x55, 0xa0, 0x86, 0x77, 0xf6, 0xc2, + 0xe0, 0x12, 0xe4, 0x45, 0x85, 0xd0, 0xe7, 0x68, 0xf0, 0x31, + 0x4c, 0x9c, 0xb0, 0x5f, 0x89, 0xca, 0xfe, 0xc2, 0xf0, 0x1e, + 0xeb, 0xee, 0x75, 0x64, 0xea, 0x09, 0xd4, 0x1c, 0x72, 0x12, + 0xd4, 0x31, 0xf0, 0x89, 0x71, 0x74, 0x6e, 0x01, 0x32, 0xca, + 0x8a, 0x91, 0x0c, 0xdf, 0xd7, 0x05, 0xe9, 0x35, 0xed, 0x06, + 0x1a, 0x17, 0x5a, 0xf3, 0x65, 0xc5, 0xbd, 0x37, 0xf2, 0x53, + 0x49, 0x2f, 0xcd, 0xc6, 0x15, 0xb3, 0x36, 0x88, 0xd8, 0x7a, + 0x2f, 0xfa, 0x21, 0x7f, 0x55, 0x20, 0xc6, 0xf4, 0x23, 0x59, + 0x6b, 0x3c, 0xeb, 0xe5, 0xd3, 0x78, 0xdc, 0x31, 0xeb, 0x87, + 0x86, 0x3d, 0x7c, 0x10, 0x64, 0x66, 0xa4, 0xad, 0x07, 0xe1, + 0x93, 0x15, 0x07, 0x4c, 0xe4, 0xb4, 0x4a, 0x06, 0xca, 0x2a, + 0x50, 0xa2, 0x85, 0xc6, 0xa1, 0x19, 0x89, 0x7f, 0x8a, 0x05, + 0x00, 0x23, 0x72, 0x5f, 0x89, 0x74, 0x8e, 0x22, 0xa1, 0x5d, + 0x26, 0xf9, 0xfe, 0xdf, 0x6d, 0x98, 0x3a, 0xc4, 0x7c, 0x93, + 0xcf, 0xc4, 0xfe, 0xed, 0x98, 0xb0, 0x31, 0x4c, 0x81, 0x83, + 0x0d, 0x5d, 0x3d, 0x0c, 0x27, 0x4e, 0xca, 0xcf, 0x38, 0x0c, + 0x37, 0xb0, 0xf8, 0xc5, 0xc8, 0x52, 0x14, 0xec, 0x53, 0x80, + 0xb9, 0xd8, 0x8a, 0x05, 0x4e, 0x31, 0x3d, 0x67, 0x57, 0xf0, + 0x7a, 0xa2, 0xc5, 0xc9, 0x02, 0x25, 0x69, 0x83, 0xb9, 0x3e, + 0x1b, 0x04, 0xbf, 0xb2, 0xe6, 0x97, 0x7a, 0x6b, 0x8e, 0x37, + 0x77, 0x2e, 0x16, 0x8b, 0x33, 0xe1, 0xea, 0x2b, 0x30, 0x01, + 0x6e, 0xa0, 0x28, 0x14, 0x17, 0xe9, 0x98, 0xa8, 0x89, 0x72, + 0x68, 0x64, 0x81, 0x60, 0xa8, 0xf7, 0x72, 0xdf, 0x1a, 0xae, + 0xf5, 0xf0, 0x9f, 0x69, 0x35, 0xbc, 0x58, 0x27, 0x38, 0xd6, + 0x7f, 0x7a, 0xd4, 0xc4, 0xf1, 0xcf, 0xee, 0x59, 0x49, 0x31, + 0xda, 0xc1, 0x08, 0x46, 0x65, 0x68, 0xe9, 0x44, 0x18, 0x2b, + 0xf2, 0x2a, 0x13, 0x60, 0x07, 0xae, 0xe4, 0x96, 0xdb, 0x0a, + 0x6f, 0x52, 0x23, 0x9a, 0xcf, 0x9d, 0xa4, 0xc5, 0xc1, 0x74, + 0xa8, 0x0e, 0xe1, 0x5e, 0xfa, 0xa4, 0x06, 0x9c, 0x2e, 0x70, + 0x08, 0x22, 0x25, 0x4f, 0xc1, 0xf1, 0x13, 0x5a, 0x66, 0xa0, + 0x6c, 0x59, 0xa3, 0xfc, 0x03, 0x9c, 0x8a, 0x23, 0x01, 0x00, + 0xa9, 0x49, 0xf0, 0x22, 0xa3, 0x8f, 0x6c, 0xef, 0xcb, 0x69, + 0x06, 0x3a, 0x69, 0x99, 0x96, 0xd2, 0xa7, 0xa0, 0x0b, 0x7e, + 0x44, 0x7d, 0x04, 0xff, 0x7e, 0x9e, 0x1e, 0x77, 0xa0, 0x30, + 0xd1, 0xdf, 0x18, 0xe4, 0xd8, 0xa5, 0x64, 0xbe, 0x8c, 0x80, + 0x28, 0xe2, 0x98, 0x5e, 0xec, 0x9e, 0xb1, 0x0a, 0xb5, 0x25, + 0xaa, 0xb8, 0x0f, 0x78, 0x30, 0x48, 0x06, 0xe5, 0x76, 0xf9, + 0x24, 0x96, 0x87, 0x2a, 0x91, 0x89, 0xb6, 0xce, 0x04, 0xdf, + 0xfc, 0x13, 0x42, 0x19, 0xba, 0x14, 0x46, 0x20, 0x08, 0x47, + 0xe1, 0x82, 0x57, 0x51, 0x74, 0x3b, 0x5b, 0x23, 0x5c, 0xb2, + 0x85, 0x8c, 0xed, 0xe6, 0xda, 0x4d, 0x56, 0xe8, 0x61, 0x31, + 0xec, 0x97, 0x27, 0xeb, 0xf2, 0xa7, 0x7c, 0x13, 0x1b, 0xc5, + 0x44, 0xfe, 0x63, 0x4b, 0x2b, 0x33, 0x22, 0x23, 0x60, 0x86, + 0x7c, 0x3b, 0x57, 0xba, 0x16, 0xde, 0x47, 0x04, 0x3e, 0x2b, + 0xe5, 0xbd, 0x23, 0xa0, 0xab, 0xdf, 0x5d, 0x6e, 0x20, 0xb1, + 0x37, 0x44, 0xcb, 0xbd, 0x03, 0xa9, 0x5c, 0xe6, 0x92, 0x5e, + 0x2f, 0x6f, 0x95, 0xc6, 0x5b, 0x6d, 0xab, 0x39, 0xdd, 0x1e, + 0x34, 0xd5, 0x21, 0xca, 0x92, 0xee, 0x59, 0xf0, 0xb9, 0x65, + 0xe6, 0x81, 0x49, 0xf8, 0x11, 0xec, 0x45, 0x14, 0x6a, 0x19, + 0xb4, 0xce, 0xbf, 0x9e, 0xf7, 0x32, 0x8d, 0x99, 0x78, 0xc3, + 0x07, 0x3d, 0xfd, 0x18, 0x2d, 0x0e, 0x06, 0x2f, 0x27, 0x24, + 0x6f, 0x16, 0xd8, 0x01, 0x33, 0xc8, 0xbb, 0x7f, 0x7d, 0xfa, + 0x73, 0xf6, 0x7d, 0x54, 0xf2, 0xd4, 0x8a, 0x53, 0xe1, 0x62, + 0x45, 0xf4, 0x01, 0xa6, 0x31, 0x6b, 0x3a, 0x06, 0x56, 0xfd, + 0x79, 0x7f, 0x58, 0xd8, 0x47, 0x33, 0x53, 0xc5, 0x78, 0x70, + 0xce, 0x81, 0x7f, 0x66, 0xa1, 0x58, 0x7c, 0x5a, 0xdb, 0x4a, + 0xad, 0x29, 0xff, 0x93, 0x75, 0x95, 0x35, 0xa9, 0xd2, 0xb1, + 0xeb, 0xa0, 0x4f, 0x10, 0x0a, 0xc9, 0x38, 0x69, 0xc8, 0x8d, + 0x57, 0xef, 0x99, 0x0f, 0xa5, 0x69, 0x86, 0xa6, 0xfb, 0x2b, + 0x37, 0xe4, 0xc7, 0xab, 0x3e, 0xcd, 0x8f, 0x3f, 0x93, 0x8c, + 0x0b, 0xc4, 0x4d, 0x16, 0xe0, 0xb0, 0x94, 0x5a, 0x0d, 0x17, + 0xaf, 0x6e, 0x4b, 0x2e, 0x18, 0x29, 0x0e, 0xe0, 0xf5, 0x72, + 0x1a, 0x21, 0x37, 0xef, 0x7d, 0x6a, 0x39, 0xe9, 0xa8, 0xd7, + 0x96, 0xd6, 0xb3, 0x7d, 0x83, 0x0c, 0x13, 0x30, 0x49, 0x03, + 0xe8, 0x6b, 0xe6, 0x77, 0xe8, 0x69, 0x48, 0x56, 0x5f, 0x39, + 0x63, 0xbc, 0x86, 0xa8, 0x26, 0xa1, 0xbd, 0x4b, 0x24, 0xbd, + 0xdd, 0xe8, 0x02, 0x64, 0xcb, 0xae, 0x24, 0x17, 0x62, 0xbd, + 0x27, 0xa7, 0x22, 0x60, 0x51, 0x0c, 0x53, 0xff, 0x9d, 0x63, + 0x1b, 0xf9, 0xff, 0x76, 0x3b, 0x74, 0x05, 0x98, 0x46, 0x0b, + 0xe8, 0xcb, 0xd4, 0x0a, 0xcd, 0x91, 0xdb, 0x5b, 0x21, 0x4d, + 0xa1, 0x87, 0xbd, 0xb7, 0x58, 0xec, 0x28, 0x00, 0x92, 0xc2, + 0x98, 0xe4, 0x8c, 0x1f, 0x9d, 0xa4, 0x80, 0x83, 0x40, 0xb9, + 0x63, 0xfe, 0xc9, 0x18, 0x3f, 0xd6, 0xab, 0x34, 0x00, 0x2c, + 0x53, 0x40, 0x38, 0x0e, 0xb1, 0x69, 0xa8, 0xb8, 0xa9, 0x2e, + 0x9b, 0x7b, 0x89, 0x8d, 0xff, 0x86, 0x01, 0x51, 0x42, 0xde, + 0x04, 0xd6, 0x1d, 0xd1, 0x29, 0x8d, 0x42, 0x46, 0x5f, 0xd6, + 0x02, 0xde, 0x73, 0xee, 0x2d, 0xe9, 0x6e, 0xb0, 0x3f, 0xf0, + 0x47, 0x72, 0xfe, 0x45, 0xff, 0x05, 0x82, 0x2d, 0xc6, 0x4f, + 0xc9, 0xd3, 0xec, 0xf9, 0x5a, 0x22, 0x50, 0x6c, 0x4f, 0x1e, + 0xc8, 0x5f, 0xfc, 0x2c, 0x04, 0x4f, 0xdf, 0xce, 0xe4, 0x18, + 0xd2, 0xd7, 0x8b, 0x67, 0x83, 0x39, 0x96, 0x47, 0x5e, 0x5b, + 0xad, 0x7f, 0x5d, 0x42, 0x56, 0x97, 0x71, 0x39, 0x28, 0x44, + 0x9d, 0x35, 0xde, 0xde, 0x03, 0x20, 0x34, 0x44, 0xdb, 0xdf, + 0xfc, 0xff, 0x1e, 0x3d, 0x58, 0x5f, 0x7a, 0x8e, 0x90, 0xa1, + 0xd3, 0xeb, 0x0c, 0x23, 0x3f, 0x4e, 0x61, 0x77, 0x79, 0xb2, + 0xdc, 0xfb, 0x21, 0x46, 0x5c, 0x82, 0xb6, 0xf6, 0x34, 0x3c, + 0x3f, 0x45, 0x4b, 0x80, 0x9e, 0xa4, 0xe6, 0x02, 0x13, 0x38, + 0x40, 0x7e, 0x87, 0x92, 0x96, 0x51, 0x63, 0x87, 0xae, 0xc8, + 0x02, 0x6a, 0x70, 0xc8, 0xcd, 0xd0, 0xe2, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x12, 0x1c, 0x22, 0x2b, 0x33, 0x38, 0x3f, + }; + + return dilithium_param_vfy_test(WC_ML_DSA_87, ml_dsa_87_pub_key, + (word32)sizeof(ml_dsa_87_pub_key), ml_dsa_87_sig, + (word32)sizeof(ml_dsa_87_sig)); +} +#endif +#endif + +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY +static wc_test_ret_t dilithium_param_test(int param, WC_RNG* rng) +{ + wc_test_ret_t ret; + dilithium_key* key; + byte* sig = NULL; +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + word32 sigLen; + byte msg[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + int res = 0; +#endif +#endif + + key = (dilithium_key*)XMALLOC(sizeof(*key), HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (key == NULL) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); + } + sig = (byte*)XMALLOC(DILITHIUM_MAX_SIG_SIZE, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (sig == NULL) { + ERROR_OUT(WC_TEST_RET_ENC_ERRNO, out); + } + + ret = wc_dilithium_init(key); + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + return ret; + } + + ret = wc_dilithium_set_level(key, param); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_dilithium_make_key(key, rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + sigLen = wc_dilithium_sig_size(key); + if (sigLen <= 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + + ret = wc_dilithium_sign_msg(msg, (word32)sizeof(msg), sig, &sigLen, key, + rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + ret = wc_dilithium_verify_msg(sig, sigLen, msg, (word32)sizeof(msg), &res, + key); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + if (res != 1) + ERROR_OUT(WC_TEST_RET_ENC_EC(res), out); +#endif +#endif + +out: + wc_dilithium_free(key); + XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + return ret; +} +#endif + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t dilithium_test(void) +{ + wc_test_ret_t ret; + WC_RNG rng; + +#ifndef HAVE_FIPS + ret = wc_InitRng_ex(&rng, HEAP_HINT, INVALID_DEVID); +#else + ret = wc_InitRng(&rng); +#endif + if (ret != 0) { + ret = WC_TEST_RET_ENC_EC(ret); + return ret; + } + +#ifndef WOLFSSL_NO_ML_DSA_44 +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + ret = dilithium_param_44_vfy_test(); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY + ret = dilithium_param_test(WC_ML_DSA_44, &rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif +#endif +#ifndef WOLFSSL_NO_ML_DSA_65 +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + ret = dilithium_param_65_vfy_test(); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY + ret = dilithium_param_test(WC_ML_DSA_65, &rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif +#endif +#ifndef WOLFSSL_NO_ML_DSA_87 +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + ret = dilithium_param_87_vfy_test(); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif +#ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY + ret = dilithium_param_test(WC_ML_DSA_87, &rng); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); +#endif +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) +out: +#endif + wc_FreeRng(&rng); + return ret; +} +#endif /* HAVE_DILITHIUM */ + +#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY) +static enum wc_XmssRc xmss_write_key_mem(const byte * priv, word32 privSz, + void *context) +{ + /* WARNING: THIS IS AN INSECURE WRITE CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! Production applications should + * write only to non-volatile storage. */ + XMEMCPY(context, priv, privSz); + return WC_XMSS_RC_SAVED_TO_NV_MEMORY; +} + +static enum wc_XmssRc xmss_read_key_mem(byte * priv, word32 privSz, + void *context) +{ + /* WARNING: THIS IS AN INSECURE READ CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! */ + XMEMCPY(priv, context, privSz); + return WC_XMSS_RC_READ_TO_MEMORY; +} + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t xmss_test(void) +{ + int i = 0; + int j = 0; + XmssKey signingKey; + XmssKey verifyKey; + WC_RNG rng; + word32 pkSz = 0; + word32 skSz = 0; + word32 sigSz = 0; + word32 bufSz = 0; + unsigned char * sk = NULL; + unsigned char * old_sk = NULL; + const char * msg = "XMSS post quantum signature test"; + word32 msgSz = (word32) XSTRLEN(msg); +#if WOLFSSL_XMSS_MIN_HEIGHT <= 10 + const char * param = "XMSS-SHA2_10_256"; +#elif WOLFSSL_XMSS_MIN_HEIGHT <= 20 + const char * param = "XMSSMT-SHA2_20/4_256"; +#elif WOLFSSL_XMSS_MIN_HEIGHT <= 40 + const char * param = "XMSSMT-SHA2_40/8_256"; +#else + const char * param = "XMSSMT-SHA2_60/12_256"; +#endif + byte * sig = NULL; + int ret2 = -1; + int ret = WC_TEST_RET_ENC_NC; + WOLFSSL_ENTER("xmss_test"); + +#ifndef HAVE_FIPS + ret = wc_InitRng_ex(&rng, HEAP_HINT, INVALID_DEVID); +#else + ret = wc_InitRng(&rng); +#endif + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_Init(&signingKey, NULL, INVALID_DEVID); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_Init(&verifyKey, NULL, INVALID_DEVID); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + /* Set the parameter string to the signing key, and + * get sizes for secret key, pub key, and signature. */ + ret = wc_XmssKey_SetParamStr(&signingKey, param); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_GetPubLen(&signingKey, &pkSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + if (pkSz != XMSS_SHA256_PUBLEN) { + return WC_TEST_RET_ENC_EC(pkSz); + } + + ret = wc_XmssKey_GetPrivLen(&signingKey, &skSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_GetSigLen(&signingKey, &sigSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + /* Allocate signature array. */ + sig = (byte *)XMALLOC(sigSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (sig == NULL) { return WC_TEST_RET_ENC_ERRNO; } + + bufSz = sigSz; + +#if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_DEBUG_NONBLOCK) + fprintf(stderr, "param: %s\n", param); + fprintf(stderr, "pkSz: %d\n", pkSz); + fprintf(stderr, "skSz: %d\n", skSz); + fprintf(stderr, "sigSz: %d\n", sigSz); +#endif + + /* Allocate current and old secret keys.*/ + sk = (unsigned char *)XMALLOC(skSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (sk == NULL) { return WC_TEST_RET_ENC_ERRNO; } + + old_sk = (unsigned char *)XMALLOC(skSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (old_sk == NULL) { return WC_TEST_RET_ENC_ERRNO; } + + XMEMSET(sk, 0, skSz); + XMEMSET(old_sk, 0, skSz); + XMEMSET(sig, 0, sigSz); + + ret = wc_XmssKey_SetWriteCb(&signingKey, xmss_write_key_mem); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_SetReadCb(&signingKey, xmss_read_key_mem); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_SetContext(&signingKey, (void *) sk); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_MakeKey(&signingKey, &rng); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + /* Export the pub to a verify key. */ + ret = wc_XmssKey_ExportPub(&verifyKey, &signingKey); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + /* Repeat a few times to check that: + * 1. The secret key is mutated on each sign. + * 2. We can verify each new signature. + * Only do a few times, because the full signature space + * for this parameter set is huge. */ + for (i = 0; i < 10; ++i) { + XMEMCPY(old_sk, sk, skSz); + + ret = wc_XmssKey_Sign(&signingKey, sig, &sigSz, (byte *) msg, msgSz); + if (ret != 0) { return WC_TEST_RET_ENC_I(i); } + if (sigSz != bufSz) { return WC_TEST_RET_ENC_I(i); } + + /* Old secret key and current secret key should not match. */ + ret = XMEMCMP(old_sk, sk, skSz); + if (ret == 0) { return WC_TEST_RET_ENC_I(i); } + + ret = wc_XmssKey_Verify(&verifyKey, sig, sigSz, (byte *) msg, msgSz); + if (ret != 0) { return WC_TEST_RET_ENC_I(i); } + + /* Flip bits in a few places throughout the signature, stepping in multiple + * of hash size. These should all fail with -1. */ + for (j = 0; j < (int) sigSz; j+= 4 * 32) { + sig[j] ^= 1; + + ret2 = wc_XmssKey_Verify(&verifyKey, sig, sigSz, (byte *) msg, + msgSz); + if ((ret2 != -1) && (ret2 != SIG_VERIFY_E)) { + /* Verify passed when it should have failed. */ + return WC_TEST_RET_ENC_I(j); + } + + /* Flip this spot back. */ + sig[j] ^= 1; + } + } + + /* Cleanup everything. */ + if (sig != NULL) { + XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + sig = NULL; + } + + if (sk != NULL) { + XFREE(sk, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + sk = NULL; + } + + if (old_sk != NULL) { + XFREE(old_sk, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + old_sk = NULL; + } + + wc_XmssKey_Free(&signingKey); + wc_FreeRng(&rng); + + return ret; +} +#endif /*if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_XMSS_VERIFY_ONLY)*/ + +#if defined(WOLFSSL_HAVE_XMSS) && !defined(WOLFSSL_SMALL_STACK) && \ + WOLFSSL_XMSS_MIN_HEIGHT <= 10 + +/* A simple xmss verify only test using: + * XMSS-SHA2_10_256 + * pub len: 68 + * msg len: 32 + * sig len: 2500 + * + * These were generated with the test xmss_fast, from the unpatched + * xmss-reference repository: + * https://github.com/XMSS/xmss-reference + * */ + +static const byte xmss_pub[XMSS_SHA256_PUBLEN] = +{ + 0x00,0x00,0x00,0x01,0xA5,0x41,0x31,0x96, + 0x0A,0xF9,0xF3,0xB2,0x4B,0x2E,0x5B,0x3E, + 0xCA,0x74,0xAD,0x6C,0xA5,0x89,0xAD,0x2C, + 0x0E,0x96,0xB3,0x54,0xFB,0x5B,0x63,0x50, + 0x96,0x81,0xE2,0x59,0x72,0x10,0x09,0x54, + 0xBB,0x39,0xAC,0xEE,0x78,0xEF,0x95,0xEC, + 0x01,0x1D,0xF0,0x36,0x68,0xE2,0xC4,0xA5, + 0x2F,0x60,0x42,0x7E,0xD3,0x8E,0xAA,0x27, + 0xC9,0xB7,0x39,0x4E +}; + +static /* not const */ byte xmss_msg[32] = +{ + 0x07,0x9F,0x80,0x86,0xDB,0x76,0x27,0xDF, + 0xED,0x5B,0x2A,0x81,0x60,0x60,0x7D,0xB4, + 0xE8,0x7A,0x69,0x45,0x20,0x6B,0xA2,0x96, + 0xC0,0x21,0xA5,0x46,0x29,0x63,0x9B,0x37 +}; + +/* This was actually the 5th signature produced from + * xmss_fast test in xmss-reference. */ +static /* not const */ byte xmss_sig[2500] = +{ + 0x00,0x00,0x00,0x05,0xF0,0x15,0x34,0xBA, + 0x92,0x03,0x6A,0xB9,0xA5,0x23,0x86,0x11, + 0xAE,0x65,0x0A,0x5C,0x78,0x2C,0xC9,0xBE, + 0x7E,0xA6,0xDC,0xA2,0x8B,0xA9,0x9C,0x50, + 0xF6,0x61,0x8D,0x9D,0xD7,0xE9,0xC0,0xF8, + 0x67,0xCD,0x8A,0xC4,0x9B,0x74,0x96,0x07, + 0x5D,0xF2,0xC9,0xCC,0x28,0x05,0xB1,0xBE, + 0x5E,0xA4,0xBA,0xBE,0xAB,0xD8,0x21,0x6B, + 0x21,0x5F,0xAB,0xB7,0x6C,0xEC,0x2F,0xC8, + 0xC6,0x74,0x3E,0x97,0x1B,0xC3,0x45,0x57, + 0xAF,0xAA,0x1E,0xA8,0xF2,0x86,0xA8,0xAA, + 0x43,0x6D,0x66,0xE9,0x81,0x14,0xDE,0x09, + 0x39,0xD2,0xAF,0xD1,0x4C,0xE7,0x75,0x18, + 0x0D,0xAA,0x29,0xA1,0x92,0x53,0xCC,0xE9, + 0xF3,0x0B,0x1E,0x3B,0xE2,0xAE,0x80,0x0C, + 0xE7,0x7A,0x7C,0x13,0x8A,0x28,0xC6,0x5F, + 0x0A,0xA4,0xA3,0x73,0x0A,0x3A,0xC2,0xA6, + 0x3B,0xB4,0x30,0x67,0xC0,0x36,0x18,0xA1, + 0x58,0xCD,0xAD,0x54,0x36,0x64,0xCE,0xFD, + 0x52,0xFF,0x70,0x7E,0x09,0xFB,0x13,0xA2, + 0xEA,0xDF,0x67,0x8D,0x6C,0x42,0xB2,0x78, + 0xF5,0x7D,0x5C,0x4B,0xF7,0x8E,0xCF,0x3E, + 0xB7,0xC6,0xC1,0x23,0xFA,0x65,0xDE,0xD2, + 0xFA,0x40,0x51,0x97,0x0D,0x52,0x32,0x76, + 0x7E,0x82,0x8D,0xD0,0xB9,0x1E,0x62,0xD9, + 0x1E,0xC1,0xDB,0x40,0x43,0x37,0x4A,0x23, + 0x8A,0x1D,0x35,0xFA,0xF4,0x53,0x11,0x5A, + 0xB5,0x6D,0x1E,0x8B,0x22,0xC8,0x7D,0x2A, + 0xE4,0x94,0xAA,0x25,0x20,0x40,0x96,0xDB, + 0x82,0x62,0xBA,0x8F,0x8B,0x45,0xCB,0x4F, + 0x35,0x88,0x33,0xEB,0xEF,0xB3,0xBA,0xA7, + 0x09,0x72,0xB3,0x4C,0xEC,0xF2,0xC3,0xC7, + 0x5E,0x02,0x6C,0x41,0x93,0xCB,0x3C,0x89, + 0x12,0x09,0x68,0x54,0x8E,0xEC,0x6A,0x7E, + 0x20,0xE1,0x70,0x3D,0x8C,0xEB,0xB4,0x36, + 0xBE,0x91,0xBE,0x97,0xB5,0xA6,0x34,0x16, + 0x95,0x0F,0x10,0x26,0xA9,0x13,0x80,0x88, + 0x9C,0xAA,0x68,0xEC,0x34,0x70,0x4A,0x15, + 0x9B,0x5E,0x57,0x05,0x87,0x1C,0xF8,0x35, + 0x45,0x29,0xE9,0x6E,0xF2,0x70,0x13,0x42, + 0x89,0x4E,0x77,0xC0,0x18,0xC7,0x55,0x6D, + 0xE7,0xFA,0x0D,0x63,0x83,0x16,0x19,0x01, + 0x2D,0xFD,0x31,0x14,0x94,0xCA,0x3E,0x0E, + 0xD6,0x11,0x34,0x81,0x57,0x58,0xEC,0x24, + 0xA4,0x17,0x63,0xD3,0x25,0x00,0xBF,0x7D, + 0x78,0x5D,0xC5,0xD8,0xC6,0xC1,0xBD,0x8C, + 0xD0,0x94,0x0A,0xB1,0x33,0xA5,0x4B,0x31, + 0x25,0xF5,0xAF,0xE7,0x84,0x26,0xAA,0x05, + 0xBB,0xF3,0x9A,0xAF,0x58,0x36,0x40,0xEF, + 0x3D,0xA2,0xBD,0xCA,0xA1,0x8D,0x2F,0x6D, + 0x54,0xD2,0x62,0x33,0x09,0xAE,0xE6,0x73, + 0xD6,0x44,0xE8,0x7C,0x5C,0x39,0x2B,0x78, + 0x94,0x14,0xC7,0xC9,0xAF,0xEC,0x77,0x36, + 0xA1,0x61,0x61,0xF1,0xD0,0x09,0xA2,0xEE, + 0xE7,0x55,0xD7,0x35,0x89,0x89,0x9B,0xCF, + 0xFA,0xA6,0x09,0x1E,0x3B,0xBD,0x5D,0xD9, + 0x25,0xE7,0xED,0xDD,0x7C,0xF0,0x1C,0x57, + 0xE0,0x06,0xBB,0x08,0x39,0x59,0xDF,0xD7, + 0xAF,0x4B,0x88,0x0D,0x87,0x8F,0x4A,0xF3, + 0x1C,0xD4,0x4B,0xB3,0xE2,0xF3,0x1B,0x86, + 0x4F,0xCD,0x35,0x75,0xE2,0x03,0xF9,0x1D, + 0xBF,0x3E,0xD1,0x7B,0xC7,0x23,0x11,0x75, + 0x5F,0x92,0x0D,0x98,0xEE,0x14,0xE1,0xDA, + 0x7A,0x02,0x17,0x47,0x6B,0x41,0xEA,0x47, + 0xA1,0xAF,0x06,0x79,0x1A,0x52,0x6F,0x19, + 0x31,0x70,0x71,0xBD,0xC2,0x61,0x8D,0xB7, + 0xEE,0x6B,0x69,0x2A,0xE8,0x21,0x7A,0x95, + 0xBE,0x86,0x2A,0xA1,0xF4,0xE2,0x2F,0x17, + 0x02,0xFD,0xAD,0x17,0x9F,0x0A,0x0A,0x78, + 0xA9,0x92,0x30,0x21,0x72,0x2B,0x28,0xF8, + 0xF2,0x3E,0x05,0xD5,0xAC,0xC0,0x82,0xF8, + 0xD2,0xDA,0xD0,0xA3,0xBC,0x93,0xDB,0xA5, + 0x46,0xDE,0x14,0x1E,0xD4,0x3A,0x5D,0x79, + 0x3D,0x31,0x4B,0x06,0xCE,0x22,0x29,0x3C, + 0x98,0xB6,0x18,0x8A,0xAE,0xF7,0xBA,0x22, + 0x88,0xA1,0xEE,0xC0,0x14,0x4C,0x4A,0xA0, + 0x57,0x0A,0xD3,0x18,0xA2,0x3D,0xDD,0xC7, + 0x83,0x73,0xFC,0x38,0x9B,0x31,0xA3,0xE1, + 0x17,0x76,0xA1,0xA2,0x69,0xFC,0xAB,0x08, + 0x80,0x72,0x8D,0xF5,0xE4,0x14,0xB7,0x6B, + 0x03,0xFF,0xE8,0x11,0x4B,0x06,0x55,0x7E, + 0x36,0x21,0x2F,0xD7,0x54,0x82,0xC9,0x31, + 0xB4,0x85,0x68,0x41,0xEF,0x75,0xB0,0x3A, + 0xEA,0x4F,0xE0,0xEC,0x72,0xCC,0x33,0x96, + 0xCE,0x7D,0xAD,0xDD,0x0D,0x27,0x05,0x6E, + 0xA2,0xD4,0x11,0x07,0xD8,0x7D,0x27,0xD4, + 0x80,0x8F,0x00,0x22,0xE4,0xFC,0x2C,0x9D, + 0xD5,0xD8,0x18,0x7F,0x4E,0xF4,0xB9,0x7F, + 0xEF,0xD6,0x00,0x08,0x5C,0x05,0x04,0x1E, + 0x9A,0xC6,0x8D,0xCC,0x19,0xD9,0x0B,0x06, + 0xCC,0x6A,0x17,0xE2,0x03,0x23,0xDB,0x1C, + 0xBC,0xA2,0xB9,0xA2,0x95,0x3C,0x73,0xD8, + 0xFF,0xE6,0x0E,0xAE,0x04,0xB2,0xFC,0x91, + 0x4F,0xEF,0x8A,0x58,0xB7,0x31,0x68,0x4C, + 0x1E,0xD0,0x5B,0x85,0xCC,0x03,0xDC,0xF4, + 0xAC,0xDB,0x03,0x9B,0x35,0x33,0x08,0x71, + 0xD0,0x50,0x8D,0xDC,0xE3,0x3A,0x98,0x40, + 0x41,0x80,0xDD,0x35,0xE1,0xA2,0xAF,0x14, + 0x9A,0xDB,0xD3,0x68,0x14,0xE2,0x50,0x7A, + 0x76,0x3F,0xE4,0xA4,0x1B,0xAA,0xC1,0x06, + 0x87,0x9A,0x92,0xF9,0xBE,0x9E,0x86,0x8C, + 0x92,0x1D,0x74,0xB1,0x7F,0x27,0x43,0xC0, + 0xEE,0x2E,0xC2,0x6C,0x6D,0xAA,0x0C,0x0E, + 0x71,0xC9,0x56,0xD6,0x3A,0x56,0xCB,0x90, + 0xD1,0x7E,0x6E,0x1C,0x6A,0x00,0x2D,0x02, + 0x2C,0x96,0xF0,0x2A,0x37,0x37,0x18,0x07, + 0x0B,0xF4,0xB4,0x8C,0x30,0xF2,0xA4,0xAB, + 0x66,0xFB,0x8B,0x22,0xC0,0x00,0x7E,0x05, + 0xB6,0xF9,0x95,0x49,0x33,0xA1,0xDC,0x97, + 0x0C,0x5C,0x61,0x46,0xE2,0xD7,0x87,0x4B, + 0xC4,0xC7,0x5F,0x26,0x06,0x84,0xD7,0x47, + 0x05,0xF1,0x33,0xFF,0x85,0x85,0xB2,0xBD, + 0x1F,0x44,0xC6,0xC2,0x7D,0x51,0xBE,0x0E, + 0xB5,0xC4,0x44,0x2F,0xFE,0x73,0x5F,0xF4, + 0xA4,0xEF,0xE2,0xF1,0x73,0x0B,0xEF,0x3E, + 0x2B,0xD7,0xCC,0x9F,0xDA,0x1A,0x7E,0x92, + 0x39,0xA1,0x55,0xBF,0x60,0x0A,0xDB,0x23, + 0x74,0xFE,0xE7,0x05,0x63,0xA9,0x85,0x52, + 0x9F,0xCC,0xC3,0xFF,0xF6,0x6C,0x1B,0x4E, + 0x4F,0x01,0xBD,0xC3,0xEB,0x37,0xEC,0x29, + 0x21,0x3B,0x2C,0xC9,0x2E,0x93,0x20,0x3E, + 0x19,0xC0,0x8B,0xE8,0x33,0xCD,0xC6,0x6A, + 0x6E,0x72,0x13,0x15,0xA1,0x90,0x20,0x0C, + 0x14,0x66,0xED,0xCC,0xA4,0xDD,0x7F,0x58, + 0x53,0xBC,0x4A,0x68,0xFC,0x86,0x3E,0xAA, + 0xF1,0x17,0x0F,0x3E,0x20,0x54,0x93,0xF4, + 0x98,0xBF,0xB4,0x07,0x05,0xBD,0x70,0xE7, + 0xD7,0x34,0xFD,0xE3,0x69,0xDF,0xCD,0xF5, + 0x1A,0x73,0x6E,0xC9,0x2B,0x21,0xFB,0xB8, + 0x7E,0x44,0x10,0x83,0x56,0xCE,0xD5,0x15, + 0x9A,0x75,0xFC,0x91,0x8E,0x6B,0x9E,0x1A, + 0x3A,0x33,0x39,0x35,0xB4,0x0D,0x74,0xF4, + 0xFB,0x4C,0x0E,0x37,0xFE,0x82,0x95,0x46, + 0x6B,0xD2,0x6E,0xEE,0xCD,0x4D,0x38,0xAF, + 0x0A,0xAA,0xF1,0xD5,0xA4,0x7C,0x04,0xD8, + 0xB9,0xDB,0x11,0x68,0x88,0x35,0x41,0xDE, + 0x31,0x33,0x0C,0xDC,0x2D,0x4C,0xA8,0x20, + 0xCC,0x2C,0x4C,0x63,0xAB,0xBA,0xDF,0x48, + 0x84,0xD5,0x25,0xBC,0x70,0xE3,0x49,0xAA, + 0x43,0xCA,0x8B,0xE7,0x9F,0xDD,0x20,0x76, + 0x9B,0x38,0xF4,0xBA,0x4D,0x4E,0x34,0x4A, + 0xAF,0x81,0xE7,0x0B,0xEC,0xE9,0x59,0xC1, + 0x35,0x22,0x7F,0x69,0x46,0x62,0xD2,0x18, + 0x6E,0x1F,0x79,0xD1,0xAD,0xC3,0x84,0x95, + 0x96,0xB2,0x18,0x58,0x5E,0x7E,0x0C,0x25, + 0x0A,0x0F,0x69,0xA3,0x1D,0xEC,0x29,0xCB, + 0xDA,0xA2,0xD1,0x1A,0x10,0xA5,0x52,0xC3, + 0x62,0x1E,0xC5,0x83,0xFF,0xA3,0x56,0xC2, + 0xFD,0x87,0x3B,0x57,0x52,0x98,0x36,0x95, + 0x77,0x6B,0xE5,0x49,0x10,0x8E,0x39,0xDD, + 0xCA,0x4B,0xB3,0x9F,0x4C,0x0C,0x11,0x62, + 0xF3,0x22,0x78,0xDB,0x48,0xEB,0x68,0xFE, + 0xE4,0x2A,0xE9,0xAA,0x8F,0x7A,0x2F,0x69, + 0xA5,0xC5,0x03,0x2D,0xEF,0x62,0xA8,0x71, + 0x65,0x06,0x40,0x84,0x10,0x0F,0xF2,0xED, + 0xBC,0x70,0x71,0x69,0x24,0xA2,0xBF,0x83, + 0x39,0xDD,0xFA,0xA2,0x7B,0xE5,0xEC,0x3D, + 0xFE,0x3B,0x52,0x6E,0x3D,0x82,0xA6,0x2A, + 0x86,0x01,0x61,0x51,0x63,0xBF,0xF9,0x0A, + 0x06,0x72,0xF1,0xD5,0x39,0x0C,0xBA,0xC9, + 0x78,0xC6,0x77,0x22,0xE4,0x96,0x6E,0xB1, + 0x48,0x62,0x84,0x62,0x2D,0xEA,0x49,0x56, + 0x50,0x86,0x3F,0x90,0xC3,0x01,0x42,0x45, + 0xED,0xE6,0x9A,0x65,0x19,0x93,0x7F,0x48, + 0x16,0xF2,0x50,0xA7,0x70,0xB3,0xF5,0xDB, + 0x0E,0x5E,0x22,0x9E,0x64,0x04,0x26,0x69, + 0xC1,0x16,0xEE,0x65,0x08,0x82,0x27,0x65, + 0xEC,0x3D,0xDF,0x51,0x5E,0x2D,0xE8,0x76, + 0xF2,0xE3,0xE4,0x24,0x04,0x88,0x06,0x0F, + 0xB2,0x7B,0x9B,0x72,0x3D,0x4C,0x7D,0x6A, + 0x1F,0xB2,0xA2,0xD2,0x35,0xD6,0x40,0x25, + 0xC2,0x0B,0x25,0xF9,0xDF,0x26,0xE4,0xDC, + 0xFB,0xB1,0x84,0x84,0x77,0x1B,0x45,0x51, + 0x60,0xD5,0xF0,0xB6,0x09,0xE6,0xBC,0xE3, + 0x1C,0x70,0x96,0x2C,0xD3,0x9D,0x7D,0x7F, + 0xB1,0x70,0xDA,0x79,0xB8,0x74,0x99,0xBF, + 0x84,0x95,0xCC,0x93,0xD7,0x51,0xDD,0x66, + 0xD3,0x70,0x0C,0x75,0x86,0x09,0x06,0xFD, + 0x66,0x14,0x80,0xCD,0xF3,0x59,0xB4,0x92, + 0x5F,0xE4,0xEE,0x00,0xA8,0xB0,0x8B,0x5C, + 0x3E,0xDB,0x8A,0x9C,0x0B,0xB5,0x99,0xC2, + 0x0D,0x81,0x09,0x06,0x6C,0x28,0xC0,0x7E, + 0xA5,0x07,0x70,0x64,0xD7,0x41,0xF4,0xC3, + 0x66,0x61,0x1C,0xA8,0x51,0xF6,0x3C,0xBA, + 0xE0,0x94,0xA3,0x11,0x8C,0x2E,0xBA,0x13, + 0xB2,0x47,0x48,0x93,0xB4,0x1A,0x2C,0x9A, + 0x6E,0x8E,0x30,0x66,0x7B,0xD3,0xBB,0x3B, + 0x5D,0x97,0x0D,0xE4,0xEA,0x24,0x28,0x9E, + 0xB4,0x88,0xCE,0x1D,0x7D,0x6F,0x39,0xB3, + 0x87,0x21,0xE5,0x08,0x93,0xF0,0xD4,0x9D, + 0x2D,0x91,0xC9,0xFD,0x0C,0x74,0x34,0xB4, + 0x1F,0xFE,0xDA,0xDC,0x10,0x5B,0x8D,0x2B, + 0x87,0xD3,0x42,0xB4,0xAE,0x32,0x9C,0xAE, + 0x4C,0x99,0xD8,0xED,0x44,0x41,0x07,0xE0, + 0x8F,0xBD,0xA5,0x7C,0x5A,0xDF,0x91,0x29, + 0x00,0xB5,0x4B,0xC3,0x3A,0x40,0x6C,0x48, + 0xAB,0x2A,0xF3,0x02,0xCB,0xB3,0x69,0xDA, + 0x06,0x0C,0x4D,0x5C,0x45,0xC3,0x28,0xAC, + 0x7A,0x01,0xD4,0xF8,0xCB,0x07,0x63,0x89, + 0x09,0x34,0x78,0xA7,0x14,0x39,0xCF,0x2D, + 0x94,0x8D,0x7A,0x4E,0x4E,0xBD,0xC4,0x32, + 0xAB,0x21,0xC9,0xDA,0x3F,0x5F,0x04,0x6B, + 0x14,0x40,0x18,0x18,0x2F,0xF9,0x46,0x17, + 0x57,0x54,0x9B,0x28,0x7B,0xBD,0xF9,0xA2, + 0x13,0xAC,0x69,0x24,0xB1,0x31,0x39,0xBF, + 0x8D,0x75,0xC3,0xFD,0x03,0x54,0x5A,0xFD, + 0xD4,0x7A,0xB7,0x56,0x4F,0x66,0x43,0x57, + 0x1B,0xFB,0xF9,0x92,0x7A,0x83,0xE6,0xFF, + 0xB4,0xBA,0x83,0xD2,0x61,0x8E,0x4A,0x82, + 0x82,0xA8,0xF5,0x0C,0xD2,0x43,0x53,0xA8, + 0x85,0x0A,0xD4,0x69,0x7B,0x04,0x71,0x3B, + 0x80,0x49,0x27,0x47,0x12,0xB6,0xB0,0xEA, + 0x90,0x0A,0xFA,0xA8,0xC8,0x78,0x61,0xDE, + 0x30,0x12,0xBB,0xDC,0xA6,0x57,0x56,0x30, + 0x6E,0xF1,0xA8,0x3B,0xF6,0x09,0x07,0xEA, + 0x31,0xE2,0x08,0x23,0x31,0x0F,0xD4,0x34, + 0xE3,0x60,0xC2,0x2B,0xDB,0x5A,0x99,0xCF, + 0xD4,0x6B,0x4E,0x75,0x65,0x35,0xE8,0x8B, + 0x93,0x7D,0xCA,0x11,0x47,0xF0,0x3E,0x11, + 0x5C,0xD1,0xEE,0x4B,0x11,0xB4,0x65,0x2B, + 0x6B,0x79,0xC0,0x86,0x60,0xA4,0x4B,0x24, + 0xA0,0x5C,0x70,0x34,0xC3,0x7C,0xE7,0x4F, + 0x97,0x89,0x4D,0xFE,0x22,0x89,0x3A,0xE9, + 0x07,0xB9,0x1A,0x86,0xB8,0x7A,0x12,0x38, + 0xE1,0x24,0x46,0xBC,0x9B,0x21,0xCD,0xAC, + 0x30,0xAB,0x98,0x21,0x31,0xC5,0x17,0x3F, + 0x1E,0x56,0xC3,0x18,0xCE,0xF0,0xA1,0xCC, + 0xFF,0x9D,0xA8,0x53,0xAF,0x74,0x77,0x54, + 0x02,0x9A,0x8F,0xA4,0xD4,0xBD,0xB2,0x1A, + 0xBA,0x52,0x2E,0x19,0xBE,0x49,0x11,0x45, + 0x02,0x01,0x7A,0xBF,0x28,0xD6,0x18,0xED, + 0xBD,0xCE,0xE4,0xDE,0xB5,0xF1,0x53,0x5D, + 0x65,0xF9,0x5F,0x83,0x8F,0x2D,0xF2,0x82, + 0xA0,0x2D,0x28,0xD3,0x0A,0x9E,0x0F,0x7F, + 0xC7,0xC4,0x43,0x7F,0xC3,0x0E,0x06,0xEB, + 0x4E,0xB4,0x2D,0xFA,0xDD,0x48,0xAB,0xF4, + 0x7D,0x41,0x48,0x33,0x5A,0xE6,0x70,0x02, + 0xE7,0x71,0x8D,0xD9,0x6B,0x0C,0x5A,0x8F, + 0xA4,0xC1,0xB7,0x4E,0x96,0x83,0xD6,0xA7, + 0x1D,0xF1,0x88,0xB3,0x6E,0xF4,0x12,0xA9, + 0xF6,0x31,0x69,0x66,0xFE,0xFE,0x02,0xF2, + 0x86,0x6D,0xBB,0x57,0x51,0x8C,0x4C,0xE9, + 0x7C,0x92,0x3E,0x3A,0xD3,0x2D,0xA8,0x82, + 0x53,0x84,0x26,0x89,0xBB,0xCC,0x13,0x12, + 0x3D,0x94,0xBB,0xDF,0x3D,0x4C,0xDF,0x27, + 0x9B,0x1F,0xB8,0xB6,0xE4,0xEA,0xA2,0x07, + 0xF8,0x4D,0x42,0x8F,0x29,0x90,0xFE,0x21, + 0x20,0xE9,0x55,0x02,0xAD,0x90,0xA7,0x77, + 0x4E,0x29,0xB6,0xD9,0x14,0x94,0xB2,0x25, + 0xA4,0xB2,0x0E,0x96,0x31,0xAB,0x9E,0x93, + 0x49,0xAC,0xA9,0xCB,0x68,0x22,0xBA,0xB8, + 0x57,0x5C,0x9D,0x65,0xC1,0xF1,0xFC,0x99, + 0x7C,0x3C,0xE9,0xEA,0x4B,0x29,0x22,0x2F, + 0xDB,0x17,0x21,0x8D,0xB0,0x13,0xBF,0xEE, + 0x7D,0xE4,0x8B,0x6D,0x17,0xE0,0x53,0x92, + 0x0B,0x32,0x6B,0xB1,0x65,0x2E,0xA7,0x83, + 0xFD,0x62,0x62,0xE3,0xAA,0x81,0xE8,0xD6, + 0xF7,0xB1,0x30,0x65,0x80,0x9F,0x77,0x1E, + 0x4A,0xEA,0xE8,0x45,0x32,0x12,0x3A,0xFB, + 0x22,0xE9,0xA9,0xF6,0xCB,0xAB,0xA8,0x0C, + 0x20,0xA8,0x7C,0xF9,0xF7,0x53,0xC1,0xB4, + 0xC0,0x5D,0x06,0x45,0xDD,0x7E,0xA7,0x34, + 0xA1,0x21,0xC2,0x62,0xAB,0x22,0x45,0x3D, + 0x73,0x4C,0x26,0xD1,0x1A,0xB2,0xF0,0xB2, + 0x6D,0x11,0x70,0x58,0xAA,0xF5,0xA4,0xF5, + 0xF8,0x0B,0x3D,0xC1,0xF6,0x17,0x70,0x15, + 0xCD,0x72,0x02,0x7E,0x4E,0x94,0x96,0x0A, + 0x56,0xCC,0xA5,0xA3,0xB3,0x7E,0xDD,0x5A, + 0x72,0xD2,0xFB,0xAC,0x3D,0x0E,0x66,0x65, + 0xE9,0x08,0x6C,0xB0,0x1C,0xE2,0x1A,0x82, + 0xF6,0xF3,0x34,0x89,0x73,0x02,0x5B,0x42, + 0x6D,0x40,0x61,0xB6,0xE0,0xE6,0x53,0x32, + 0xA5,0x72,0x17,0x4F,0x3B,0x51,0x4F,0xBC, + 0x00,0xE0,0x69,0x26,0xA9,0xAE,0x83,0xE3, + 0x73,0x7F,0x71,0x97,0xE0,0xDC,0x7C,0x63, + 0x9C,0x85,0x5F,0xDF,0x7D,0xE4,0x6C,0xD8, + 0xA9,0x3A,0x6F,0x5E,0x4A,0x2E,0xB0,0xE7, + 0x8B,0x45,0xE2,0x90,0x05,0x37,0xE8,0xAB, + 0x49,0x48,0x4C,0xC0,0x59,0x1D,0x8C,0x46, + 0x5B,0x84,0xE0,0x83,0xCE,0xEA,0x4B,0xF9, + 0xD4,0xDC,0x63,0xDF,0x79,0xB7,0x5C,0x11, + 0x25,0x7F,0x90,0x2E,0x0A,0x38,0x03,0xEA, + 0xEA,0xA1,0x26,0x52,0x20,0x19,0xA3,0xBE, + 0xFC,0x9D,0xB7,0x6E,0xA6,0x58,0x8E,0x6D, + 0xC5,0x58,0xE9,0xED,0x2F,0x55,0x43,0x8B, + 0x03,0x8B,0xE6,0xA4,0xC2,0x25,0x4B,0x36, + 0xBA,0xD3,0x27,0x48,0x40,0x2E,0x87,0xA2, + 0xD4,0x12,0xC6,0x05,0x36,0x03,0x11,0x51, + 0xD1,0xF2,0xAC,0x71,0x2C,0xB6,0xC3,0xA5, + 0x57,0x0F,0xAF,0x4B,0xBD,0xCD,0x47,0x4C, + 0x3A,0x52,0x6F,0x47,0xE7,0x0B,0xB7,0xD5, + 0xF7,0xA6,0x39,0x63,0x82,0x08,0x4C,0x41, + 0x0E,0x2A,0x52,0x42,0x5A,0xEA,0x59,0xC7, + 0x94,0xFB,0xD0,0x88,0x47,0x27,0xF6,0x97, + 0x03,0x9E,0x29,0xB8,0x3A,0x67,0xE6,0xF3, + 0x95,0xA7,0x42,0xC1,0x96,0xD1,0x9A,0xA6, + 0xF0,0x09,0x0C,0xEA,0xE0,0xAB,0x0F,0x15, + 0xE9,0xC3,0xEB,0xA5,0x89,0x86,0x98,0x32, + 0x83,0xAB,0x30,0x33,0xAE,0x90,0x8D,0x2E, + 0xB3,0xAA,0x91,0xA6,0xD9,0xA4,0x4A,0x54, + 0xE0,0xD3,0x08,0xCC,0x79,0xCE,0xE4,0x15, + 0x31,0xA6,0xCE,0x61,0xCF,0x03,0x06,0xEE, + 0x8E,0xE2,0x64,0x29,0xD1,0x54,0x9B,0xD0, + 0x5F,0x09,0x2B,0x8B,0xD5,0xF8,0xD4,0x7D, + 0xF1,0x97,0x32,0xD9,0xEA,0x5A,0x0E,0x10, + 0x8C,0x4D,0xFB,0x55,0xE6,0x27,0x0C,0xBA, + 0xC1,0x73,0xC1,0x73,0xE3,0x1C,0x09,0xB3, + 0x6F,0xB4,0x12,0xFA,0xF3,0x29,0xDC,0x23, + 0x32,0xED,0x80,0x87,0x83,0xC2,0xF6,0x07, + 0xB5,0xA9,0x22,0xDE,0x66,0x1A,0xA7,0x4A, + 0x86,0xF1,0x39,0x9B,0xF4,0xE7,0x50,0x15, + 0x4A,0x55,0x3C,0x93,0xB9,0xF9,0xFD,0xDC, + 0xB3,0x5D,0x73,0x52 +}; + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t xmss_test_verify_only(void) +{ + XmssKey verifyKey; + unsigned char pub_raw[XMSS_SHA256_PUBLEN]; + word32 pub_len = sizeof(pub_raw); + word32 pkSz = 0; + word32 sigSz = 0; + const char * param = "XMSS-SHA2_10_256"; + int j = 0; + int ret2 = WC_TEST_RET_ENC_NC; + int ret = WC_TEST_RET_ENC_NC; + int n_diff = 0; + WOLFSSL_ENTER("xmss_test_verify_only"); + + XMEMSET(pub_raw, 0, sizeof(pub_raw)); + + ret = wc_XmssKey_Init(&verifyKey, NULL, INVALID_DEVID); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_SetParamStr(&verifyKey, param); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_GetPubLen(&verifyKey, &pkSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + if (pkSz != XMSS_SHA256_PUBLEN) { + return WC_TEST_RET_ENC_EC(pkSz); + } + + ret = wc_XmssKey_GetSigLen(&verifyKey, &sigSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + +#if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_DEBUG_NONBLOCK) + fprintf(stderr, "param: %s\n", param); + fprintf(stderr, "pkSz: %d\n", pkSz); + fprintf(stderr, "sigSz: %d\n", sigSz); +#endif + + if (sigSz != sizeof(xmss_sig)) { + return WC_TEST_RET_ENC_EC(sigSz); + } + + ret = wc_XmssKey_ImportPubRaw(&verifyKey, xmss_pub, XMSS_SHA256_PUBLEN); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_XmssKey_Verify(&verifyKey, xmss_sig, sizeof(xmss_sig), + (byte *) xmss_msg, sizeof(xmss_msg)); + if (ret != 0) { + printf("error: wc_XmssKey_Verify returned %d, expected 0\n", ret); + return WC_TEST_RET_ENC_EC(ret); + } + + /* Now test the ExportPubRaw API, verify we recover the original pub. */ + ret = wc_XmssKey_ExportPubRaw(&verifyKey, pub_raw, &pub_len); + if (ret != 0) { + printf("error: wc_XmssKey_ExportPubRaw returned %d, expected 0\n", ret); + return WC_TEST_RET_ENC_EC(ret); + } + + if (pub_len != XMSS_SHA256_PUBLEN) { + printf("error: xmss pub len %u, expected %d\n", pub_len, + XMSS_SHA256_PUBLEN); + return WC_TEST_RET_ENC_EC(pub_len); + } + + n_diff = XMEMCMP(pub_raw, xmss_pub, sizeof(xmss_pub)); + + if (n_diff != 0) { + printf("error: exported and imported pub raw do not match: %d\n", + n_diff); + return WC_TEST_RET_ENC_EC(n_diff); + } + + /* Flip bits in message. This should fail. */ + xmss_msg[sizeof(xmss_msg) / 2] ^= 1; + ret2 = wc_XmssKey_Verify(&verifyKey, xmss_sig, sizeof(xmss_sig), + (byte *) xmss_msg, sizeof(xmss_msg)); + if ((ret2 != -1) && (ret2 != SIG_VERIFY_E)) { + printf("error: wc_XmssKey_Verify returned %d, expected -1\n", ret2); + return WC_TEST_RET_ENC_EC(ret2); + } + + /* Flip it back. This should pass again. */ + xmss_msg[sizeof(xmss_msg) / 2] ^= 1; + ret = wc_XmssKey_Verify(&verifyKey, xmss_sig, sizeof(xmss_sig), + (byte *) xmss_msg, sizeof(xmss_msg)); + if (ret != 0) { + printf("error: wc_XmssKey_Verify returned %d, expected 0\n", ret); + return WC_TEST_RET_ENC_EC(ret); + } + + /* Flip bits in a few places throughout the signature, stepping in multiple + * of hash size. These should all fail with -1. */ + for (j = 0; j < (int) sizeof(xmss_sig); j+= 4 * 32) { + xmss_sig[j] ^= 1; + + ret2 = wc_XmssKey_Verify(&verifyKey, xmss_sig, sizeof(xmss_sig), + (byte *) xmss_msg, sizeof(xmss_msg)); + if ((ret2 != -1) && (ret2 != SIG_VERIFY_E)) { + /* Verify passed when it should have failed. */ + return WC_TEST_RET_ENC_I(j); + } + + /* Flip this spot back. */ + xmss_sig[j] ^= 1; + } + + /* Cleanup everything. */ + wc_XmssKey_Free(&verifyKey); + + return ret; +} +#endif /* WOLFSSL_HAVE_XMSS && !WOLFSSL_SMALL_STACK && + * WOLFSSL_XMSS_MIN_HEIGHT <= 10 */ + + +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) +static int lms_write_key_mem(const byte * priv, word32 privSz, void *context) +{ + /* WARNING: THIS IS AN INSECURE WRITE CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! Production applications should + * write only to non-volatile storage. */ + XMEMCPY(context, priv, privSz); + return WC_LMS_RC_SAVED_TO_NV_MEMORY; +} + +static int lms_read_key_mem(byte * priv, word32 privSz, void *context) +{ + /* WARNING: THIS IS AN INSECURE READ CALLBACK THAT SHOULD ONLY + * BE USED FOR TESTING PURPOSES! */ + XMEMCPY(priv, context, privSz); + return WC_LMS_RC_READ_TO_MEMORY; +} + +/* LMS signature sizes are a function of their parameters. This + * test has a signature of 8688 bytes. */ +#define WC_TEST_LMS_SIG_LEN (8688) + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test(void) +{ + int i = 0; + int j = 0; + int ret = WC_TEST_RET_ENC_NC; + int ret2 = WC_TEST_RET_ENC_NC; + int sigsLeft = 0; + LmsKey signingKey; + LmsKey verifyKey; + WC_RNG rng; + word32 sigSz = 0; + const char * msg = "LMS HSS post quantum signature test"; + word32 msgSz = (word32) XSTRLEN(msg); + unsigned char priv[HSS_MAX_PRIVATE_KEY_LEN]; + unsigned char old_priv[HSS_MAX_PRIVATE_KEY_LEN]; +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + byte * sig = XMALLOC(WC_TEST_LMS_SIG_LEN, HEAP_HINT, + DYNAMIC_TYPE_TMP_BUFFER); + if (sig == NULL) { + return WC_TEST_RET_ENC_ERRNO; + } +#else + byte sig[WC_TEST_LMS_SIG_LEN]; +#endif + WOLFSSL_ENTER("lms_test"); + + XMEMSET(priv, 0, sizeof(priv)); + XMEMSET(old_priv, 0, sizeof(old_priv)); + XMEMSET(sig, 0, WC_TEST_LMS_SIG_LEN); + +#ifndef HAVE_FIPS + ret = wc_InitRng_ex(&rng, HEAP_HINT, INVALID_DEVID); +#else + ret = wc_InitRng(&rng); +#endif + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + /* This test: + * levels: 1 + * height: 5 + * winternitz: 1 + * + * max sigs: 2 ** (1 * 5) = 32 + * signature length: 8688 + */ + + ret = wc_LmsKey_Init(&signingKey, NULL, INVALID_DEVID); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_Init(&verifyKey, NULL, INVALID_DEVID); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_SetParameters(&signingKey, 1, 5, 1); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_SetWriteCb(&signingKey, lms_write_key_mem); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_SetReadCb(&signingKey, lms_read_key_mem); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_SetContext(&signingKey, (void *) priv); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_MakeKey(&signingKey, &rng); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + XMEMCPY(old_priv, priv, sizeof(priv)); + + ret = wc_LmsKey_ExportPub(&verifyKey, &signingKey); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_GetSigLen(&verifyKey, &sigSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + if (sigSz != WC_TEST_LMS_SIG_LEN) { + printf("error: got %u, expected %d\n", sigSz, WC_TEST_LMS_SIG_LEN); + return WC_TEST_RET_ENC_EC(sigSz); + } + + /* 2 ** 5 should be the max number of signatures */ + for (i = 0; i < 32; ++i) { + /* We should have remaining signstures. */ + sigsLeft = wc_LmsKey_SigsLeft(&signingKey); + if (sigsLeft == 0) { + return WC_TEST_RET_ENC_EC(sigsLeft); + } + + /* Sign with key. The private key will be updated on every signature. */ + ret = wc_LmsKey_Sign(&signingKey, sig, &sigSz, (byte *) msg, msgSz); + if (ret != 0) { return WC_TEST_RET_ENC_I(i); } + + /* The updated private key should not match the old one. */ + if (XMEMCMP(old_priv, priv, sizeof(priv)) == 0) { + printf("error: current priv key should not match old: %d\n", i); + return WC_TEST_RET_ENC_I(i); + } + + XMEMCPY(old_priv, priv, sizeof(priv)); + + ret = wc_LmsKey_Verify(&verifyKey, sig, sigSz, (byte *) msg, msgSz); + if (ret != 0) { return WC_TEST_RET_ENC_I(i); } + + /* Flip bits in a few places throughout the signature, stepping in multiple + * of hash size. These should all fail with -1. */ + for (j = 0; j < (int) sigSz; j+= 4 * 32) { + sig[j] ^= 1; + + ret2 = wc_LmsKey_Verify(&verifyKey, sig, sigSz, (byte *) msg, + msgSz); + if ((ret2 != -1) && (ret2 != SIG_VERIFY_E)) { + /* Verify passed when it should have failed. */ + return WC_TEST_RET_ENC_I(j); + } + + /* Flip this spot back. */ + sig[j] ^= 1; + } + } + + /* This should be the last signature. */ + sigsLeft = wc_LmsKey_SigsLeft(&signingKey); + if (sigsLeft != 0) { + return WC_TEST_RET_ENC_EC(sigsLeft); + } + + wc_LmsKey_Free(&signingKey); + wc_LmsKey_Free(&verifyKey); + + wc_FreeRng(&rng); + +#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) + XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif + + return ret; +} + +#endif /* if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_VERIFY_ONLY) */ + +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_SMALL_STACK) +#if (defined(WOLFSSL_WC_LMS) && (LMS_MAX_HEIGHT >= 10)) || \ + defined(HAVE_LIBLMS) + +/* A simple LMS verify only test. + * + * Note: LMS signature sizes are a function of their parameters. This + * test has a signature of 1456 bytes: + * levels: 1 + * height: 10 + * winternitz: 8 + * max sigs: 2 ** (1 * 10) = 1024 + * signature length: 1456 + * */ + +/* "wolfSSL LMS example message!" without null terminator. */ +static byte lms_msg[28] = +{ + 0x77,0x6F,0x6C,0x66,0x53,0x53,0x4C,0x20, + 0x4C,0x4D,0x53,0x20,0x65,0x78,0x61,0x6D, + 0x70,0x6C,0x65,0x20,0x6D,0x65,0x73,0x73, + 0x61,0x67,0x65,0x21 +}; + +static const byte lms_L1H10W8_pub[HSS_MAX_PUBLIC_KEY_LEN] = +{ + 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x06, + 0x00,0x00,0x00,0x04,0xA1,0x26,0x76,0xF8, + 0xBB,0x0B,0xC0,0x82,0x21,0x71,0x0B,0x2E, + 0x8C,0xA6,0xEF,0x12,0xED,0x41,0x0E,0x8C, + 0xAF,0x11,0x93,0x34,0x7B,0x49,0x79,0xB7, + 0xDE,0x63,0x1C,0xFE,0x1F,0xD1,0x17,0x49, + 0xCD,0x5C,0xD4,0x26,0xA0,0x53,0x26,0x1A, + 0xC5,0xB4,0x8F,0x23 +}; + +#define LMS_L1H10W8_SIGLEN (1456) + +static byte lms_L1H10W8_sig[LMS_L1H10W8_SIGLEN] = +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x04,0x18,0x70,0x09,0x2E, + 0x21,0xC9,0x6A,0xC9,0x5C,0xB6,0xB0,0xAA, + 0xC3,0xED,0x6E,0x66,0x2F,0xCC,0x45,0x81, + 0xBC,0xBA,0x44,0x96,0x1C,0xBF,0x4E,0xFB, + 0x7A,0x46,0xFB,0xBE,0x9A,0x0C,0xE4,0x50, + 0x90,0xC7,0x92,0xAC,0x53,0xAE,0x53,0x76, + 0x29,0xA6,0x65,0xF1,0x09,0xED,0x1A,0x8E, + 0x03,0x2E,0x5A,0x06,0x51,0xE3,0x1E,0xE6, + 0xF6,0xFE,0x3A,0x6E,0xD1,0x92,0x31,0x1D, + 0xA1,0x6A,0x5C,0x30,0x3A,0xC7,0xFD,0x5B, + 0xFE,0x71,0x2C,0x5C,0x2F,0x5B,0x5B,0xCF, + 0xBC,0x7F,0xBF,0x6C,0xAF,0x44,0x8A,0xAE, + 0x14,0x60,0xAB,0x88,0xED,0x0E,0x4F,0xF8, + 0xC7,0x1B,0x74,0x28,0x72,0xB3,0x96,0xA6, + 0xE6,0x46,0x22,0x82,0xCF,0x1F,0x4D,0xA6, + 0xEA,0x22,0x06,0x07,0x52,0xF5,0x26,0x16, + 0x0B,0x90,0xE3,0xFF,0x64,0xA9,0xE4,0x61, + 0x1E,0x9C,0x12,0x9C,0xF6,0xD4,0x63,0x29, + 0xEA,0x02,0xF7,0x18,0x52,0x79,0x6C,0x43, + 0xDC,0xCF,0x43,0x23,0xB9,0xCC,0x4A,0x25, + 0x9D,0x10,0xAF,0xA3,0xE6,0x47,0x5A,0x1C, + 0xFE,0x68,0x89,0xAF,0x1B,0x2D,0x88,0x3E, + 0xCA,0xDC,0x70,0xEA,0xAC,0x11,0x00,0x8A, + 0x6E,0xE0,0xC7,0xD0,0xD2,0x1A,0x36,0x18, + 0x97,0xB3,0x5F,0x0E,0x75,0x48,0x28,0xF8, + 0xA8,0xF5,0x90,0xD1,0xA1,0x84,0xFB,0xA4, + 0xAD,0x50,0xBE,0xE9,0x39,0x8C,0xC5,0xA1, + 0x67,0x51,0xA1,0x8C,0xD6,0x6B,0x97,0x1F, + 0x47,0x99,0xEE,0xE0,0x70,0x01,0xC7,0x07, + 0x50,0xF3,0x5E,0x3F,0xE7,0x06,0xD6,0x8D, + 0x26,0xD6,0x5A,0x59,0x18,0x72,0x6B,0x12, + 0xD2,0xAF,0x9B,0xB4,0x2B,0xD0,0xB2,0xF2, + 0x96,0x2F,0x40,0xEA,0xBE,0xE6,0xAC,0x1F, + 0xB8,0x33,0xC2,0x76,0xDC,0x8C,0xAC,0xC1, + 0x46,0x5E,0x04,0x84,0x1B,0xC8,0xB9,0x65, + 0x8D,0xAD,0x96,0xB5,0xB1,0xF6,0x17,0x4A, + 0x19,0x87,0xE7,0xBF,0x29,0xC7,0x9B,0xB9, + 0xD6,0x11,0x2C,0x92,0x2F,0xB7,0x24,0xD5, + 0x01,0x1D,0x80,0x37,0x54,0xED,0x33,0x32, + 0xAB,0x7A,0x12,0xD4,0x02,0x1D,0x27,0x52, + 0x89,0xDB,0x32,0xBF,0x61,0xD4,0xBB,0xB4, + 0x46,0x78,0x1B,0x64,0x17,0x84,0x4B,0x8A, + 0xBA,0xC6,0xC1,0xCF,0xC7,0x5D,0x8F,0x93, + 0xC5,0x9A,0x27,0x90,0xAC,0x17,0x98,0xFF, + 0xC8,0x22,0x59,0x55,0x90,0xB2,0x29,0x39, + 0xA0,0xBE,0x00,0x23,0x55,0x6B,0xDA,0x83, + 0xD8,0x5B,0x57,0x7C,0x67,0x1B,0xC3,0x6B, + 0x6D,0xC7,0x9B,0x2B,0x9E,0xB7,0x95,0xB3, + 0xF0,0x1B,0x89,0x5A,0xD7,0x4B,0x67,0xAF, + 0xDC,0x9E,0xCF,0x7E,0x1A,0xBA,0x1B,0xB9, + 0x3B,0x7A,0xDD,0x3F,0x0D,0xEE,0x4C,0x0B, + 0xD1,0x4F,0x34,0xF2,0x93,0xF7,0x21,0x64, + 0x2C,0x07,0x00,0x15,0x4F,0xE3,0x6A,0x9F, + 0x08,0x52,0xC2,0x65,0x47,0x1F,0x34,0x64, + 0x66,0x07,0xBC,0xEA,0xAF,0x9B,0xAA,0x39, + 0x15,0x8B,0x08,0x8C,0x24,0x41,0x9B,0x46, + 0x1B,0x5B,0x91,0x11,0xC4,0xFD,0xA9,0x88, + 0x35,0x0E,0x7D,0xAF,0xFD,0xB7,0x90,0x7E, + 0xD7,0x29,0x02,0x0A,0xDC,0xC8,0x3F,0xC0, + 0xFD,0x97,0xAF,0x50,0x49,0xA6,0x5E,0x12, + 0xC1,0xCD,0xEC,0x52,0xC5,0x51,0xF2,0x80, + 0x17,0x61,0xC7,0x7E,0xBE,0xD1,0x1B,0x65, + 0xA4,0xAB,0x92,0x8D,0x89,0xB2,0xC5,0x8F, + 0xFF,0xA5,0x6F,0xFA,0x62,0x75,0xE4,0xA1, + 0xD4,0x22,0xA8,0x9E,0x40,0x04,0x27,0x1F, + 0xCC,0x81,0xBA,0x28,0x67,0xA0,0x1C,0x80, + 0xEB,0xCA,0xB0,0x61,0xA5,0x48,0xD0,0x8A, + 0x25,0xEB,0x9E,0x67,0x8C,0x8E,0x9B,0xD1, + 0xAD,0xBB,0xC3,0xEA,0xD3,0xD4,0xC5,0x12, + 0x7B,0xDD,0x00,0x57,0x7F,0xF6,0xF7,0xF6, + 0x3C,0x05,0xCF,0xFC,0x12,0xE1,0x93,0x05, + 0xE5,0x9B,0x79,0x87,0x69,0xD8,0x82,0xD9, + 0xD7,0x1D,0x41,0x73,0xE4,0x52,0x1D,0x3E, + 0xE5,0x8C,0x8D,0x34,0xE1,0x75,0xA9,0xF1, + 0x9D,0x09,0xA2,0x5B,0xEF,0xDA,0x96,0x6E, + 0x76,0x3D,0xEA,0x50,0xD9,0xCF,0x4F,0xAC, + 0xAD,0x1D,0x35,0x72,0x1B,0x88,0x8B,0xCD, + 0x8C,0x8A,0x8A,0xE0,0x96,0x04,0xD8,0xBB, + 0x28,0x43,0x16,0x77,0x60,0x98,0x63,0xF9, + 0xB9,0x71,0x46,0xB7,0xE1,0xA7,0xA9,0x84, + 0xC3,0x65,0x82,0xE1,0x1B,0x67,0x04,0x2D, + 0x55,0x6B,0xF9,0xC0,0x79,0x09,0x09,0xE7, + 0xFD,0x06,0x4D,0x09,0x9B,0x1A,0xCE,0x35, + 0xFA,0x27,0x6F,0x2F,0x01,0x65,0x0D,0xA0, + 0x97,0x59,0x11,0xF0,0x48,0xD2,0xE7,0x46, + 0xBE,0xB4,0x0A,0xA3,0xE2,0x75,0x0E,0x09, + 0x94,0xD9,0x69,0x28,0xD4,0xDA,0x64,0xBA, + 0xFE,0xA4,0xB9,0xF0,0xBA,0xEB,0xBA,0xAC, + 0xA8,0xF9,0xD3,0x82,0x4C,0x36,0x80,0xFA, + 0xE5,0xF6,0x76,0xC3,0x80,0xFA,0x90,0x29, + 0xF4,0x85,0xA4,0xC6,0x25,0x22,0x79,0x7E, + 0x39,0x1E,0x30,0xB8,0x65,0x72,0xCF,0xE1, + 0x99,0xF0,0x75,0xE8,0x09,0xB4,0x92,0x96, + 0x1B,0x68,0x50,0x88,0xF1,0x2C,0x97,0xE3, + 0x2D,0x26,0x8F,0xC5,0x30,0xCF,0x24,0xCB, + 0xB2,0x60,0x77,0xDC,0x02,0x72,0x0D,0xD9, + 0x2E,0xF2,0x52,0xEA,0x00,0xF6,0x32,0x65, + 0xA5,0xC6,0x43,0x29,0x29,0x69,0xAB,0x27, + 0x0C,0x39,0xDF,0x76,0x3E,0x93,0x95,0xB1, + 0x2C,0xA2,0x0D,0x18,0xCE,0xA0,0x97,0x10, + 0x3C,0x90,0xC0,0xEF,0x0E,0x04,0xA6,0xC8, + 0xA0,0x21,0x3C,0x0B,0x22,0x77,0x7A,0x66, + 0xA5,0x90,0x25,0xA4,0x09,0x3E,0xD5,0x27, + 0x1F,0x6C,0x99,0x85,0x5C,0xA2,0x99,0x7A, + 0x25,0xEE,0x8D,0x32,0x3D,0xD3,0xDC,0xF5, + 0x00,0x5A,0x34,0x61,0xB6,0xCD,0x4E,0xBC, + 0x26,0x36,0xFB,0x44,0x97,0x35,0xBD,0x06, + 0x7D,0x2E,0x4A,0xA2,0xDC,0x24,0xFE,0x70, + 0x0A,0xF9,0x57,0xE3,0xEE,0xAB,0xD1,0x17, + 0xF3,0x7C,0xD6,0x37,0x26,0xFA,0x83,0x9F, + 0xDD,0xB2,0xE1,0xD7,0xF9,0xC7,0x0E,0x15, + 0x01,0xA6,0x58,0x32,0x98,0x04,0x32,0xD4, + 0xDE,0xB9,0xEF,0x09,0xFA,0xE4,0x5A,0xD7, + 0xDD,0x09,0x1C,0xC9,0xAC,0xB8,0x6A,0xF5, + 0x00,0x5D,0x6B,0x95,0x12,0x8C,0x2F,0xCC, + 0xD8,0xB9,0x50,0x3A,0xEB,0x74,0x86,0xD2, + 0x3F,0xA1,0x05,0x8F,0x6E,0xEF,0xF5,0xA4, + 0xD6,0x6E,0x53,0xFA,0x9E,0xFA,0xCE,0xDB, + 0x99,0x46,0xE7,0xC5,0xDA,0x92,0x51,0x4F, + 0x22,0x07,0xF3,0xA5,0x38,0x26,0xD3,0xEC, + 0xD6,0x01,0xDD,0x31,0x3A,0x48,0x93,0xF6, + 0x69,0x4F,0xD8,0xF6,0xC2,0x91,0xA5,0x7C, + 0xDF,0x51,0x64,0xF1,0x3B,0x79,0xBC,0x0A, + 0x2C,0xDC,0x33,0x5A,0x29,0xF6,0xB2,0x09, + 0x66,0xCA,0x24,0x9F,0x1A,0x18,0xF3,0x76, + 0x4C,0x5E,0x0B,0x81,0x7F,0x29,0x84,0xD8, + 0x7A,0xA8,0xD6,0x11,0xAC,0xEC,0xD9,0x07, + 0x91,0xEC,0xB6,0x6D,0xEC,0xDB,0xBE,0x6F, + 0x9F,0xC5,0x19,0x5E,0x56,0x87,0x20,0x80, + 0x75,0xD5,0x64,0xE9,0x80,0xBF,0x2D,0xD5, + 0x94,0x9F,0x8C,0xA4,0x54,0x41,0xAB,0xB1, + 0x8E,0xAD,0x51,0xE4,0x3C,0x24,0xF7,0x1D, + 0xFE,0x02,0x48,0x7C,0x6D,0xED,0xF1,0xAC, + 0xD9,0x79,0x42,0xE5,0x3A,0xCF,0x6A,0x4C, + 0x6D,0xE2,0x13,0xD2,0x2B,0x9D,0xAB,0x1F, + 0x70,0xD3,0xC0,0x6F,0x81,0xE9,0x9A,0x86, + 0x33,0x39,0x60,0xE7,0x6A,0x00,0x1F,0x97, + 0xEB,0xE5,0x1D,0x0D,0x66,0x15,0xC9,0xA2, + 0xB1,0xC0,0xF0,0x2E,0xF4,0x07,0xA2,0x2E, + 0x49,0x92,0x95,0x13,0xA3,0x18,0x46,0x25, + 0xB9,0x3C,0xA1,0x4B,0x00,0x00,0x00,0x06, + 0xAB,0xAA,0xF9,0x3F,0x7E,0x21,0xF4,0x0E, + 0xCE,0xFD,0xE0,0x44,0xAC,0xC7,0x1A,0x30, + 0x22,0x9D,0x0A,0xD7,0x96,0x2D,0x8F,0x9A, + 0x99,0x1F,0x40,0x75,0x7F,0x62,0xF9,0xC1, + 0x81,0x7B,0x4A,0x1B,0xFA,0xD6,0x87,0xB9, + 0xEF,0x58,0x48,0xE4,0x5C,0x79,0xE5,0xB1, + 0x2C,0x59,0xA4,0x42,0xDB,0xA6,0x53,0x70, + 0x80,0x61,0x17,0xD4,0xD3,0x77,0xBD,0x53, + 0x26,0x7C,0x0E,0x0E,0xFF,0x30,0x4B,0xD0, + 0x86,0xFC,0x02,0x20,0x24,0x46,0x5B,0xF5, + 0xE3,0x99,0x73,0x85,0x60,0x00,0x36,0x47, + 0x17,0xEE,0x0C,0xD2,0x80,0x71,0x46,0x0E, + 0x2B,0xB0,0xEF,0x7F,0xFE,0x3B,0xE5,0xE1, + 0x87,0xC2,0xAF,0x1A,0x6F,0x63,0xF4,0x5A, + 0xC4,0x16,0xF7,0xAD,0x07,0x70,0x71,0x85, + 0x7D,0x3D,0x67,0x08,0xB8,0xD8,0xE2,0xF0, + 0xA1,0xAC,0xD2,0x94,0x7D,0x93,0x03,0xDD, + 0x54,0xF9,0x64,0x19,0xB3,0xED,0x24,0x22, + 0x01,0xD7,0x12,0x5E,0xC1,0x2B,0x39,0x10, + 0x13,0xE2,0x56,0x1C,0xEE,0xF4,0x2A,0x49, + 0x7B,0xFB,0x36,0x8D,0xF8,0xAF,0x60,0xDF, + 0x10,0xF0,0x72,0xA2,0xED,0xB6,0x53,0x88, + 0xA9,0x0C,0xED,0x9C,0x18,0x33,0x7D,0x65, + 0x9B,0xB2,0x9C,0x3E,0xE9,0x1E,0x43,0x51, + 0x7E,0xBE,0x01,0x95,0xF6,0x60,0x65,0xBE, + 0xD1,0xF4,0xE2,0x83,0x6B,0xCA,0x7A,0x70, + 0x41,0x83,0x72,0xC0,0x23,0x51,0x13,0x11, + 0x2D,0xF9,0xC0,0x0D,0x7D,0x73,0x76,0xA5, + 0x30,0x83,0x68,0x10,0x35,0xA2,0x18,0x22, + 0x4E,0x21,0x93,0x27,0x6A,0x19,0x28,0x83, + 0x7F,0xDD,0xDD,0xFF,0xC3,0x8A,0x64,0x00, + 0x5F,0x1C,0x0D,0xF8,0xBB,0xD7,0x15,0xB9, + 0xEF,0xE0,0x07,0x62,0x05,0x9E,0xCF,0xFC, + 0x08,0x52,0x1E,0x65,0x41,0x56,0x6A,0xEB, + 0x81,0x53,0x30,0x7B,0xF2,0xFD,0x65,0xFF, + 0xA2,0x14,0xF5,0x62,0x1E,0x24,0x48,0x47, + 0xA5,0x41,0x80,0xB4,0xC5,0xDC,0xB2,0xB4, + 0x2D,0x17,0xE7,0xBE,0x49,0x53,0x7A,0x25, + 0xC5,0x0D,0x19,0x59,0xF4,0x88,0x59,0xED, + 0x92,0x13,0xEE,0x7A,0x4F,0x12,0x98,0x4C +}; + +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t lms_test_verify_only(void) +{ + LmsKey verifyKey; + unsigned char pub_raw[HSS_MAX_PUBLIC_KEY_LEN]; + word32 pub_len = sizeof(pub_raw); + word32 sigSz = 0; + word32 msgSz = sizeof(lms_msg); + word32 pubSz = 0; + int levels = 0; + int height = 0; + int winternitz = 0; + int ret = WC_TEST_RET_ENC_NC; + int ret2 = WC_TEST_RET_ENC_NC; + int j = 0; + int n_diff = 0; + WOLFSSL_ENTER("lms_test_verify_only"); + + XMEMSET(pub_raw, 0, sizeof(pub_raw)); + + ret = wc_LmsKey_Init(&verifyKey, NULL, INVALID_DEVID); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_SetParameters(&verifyKey, 1, 10, 8); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + ret = wc_LmsKey_ImportPubRaw(&verifyKey, lms_L1H10W8_pub, + HSS_MAX_PUBLIC_KEY_LEN); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + /* Verify parameters, pub length, and sig length are correct. */ + ret = wc_LmsKey_GetParameters(&verifyKey, &levels, &height, &winternitz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + if (levels != 1 || height != 10 || winternitz != 8) { + printf("error: invalid LMS parameters: L%d-H%d-W%d\n", levels, height, + winternitz); + return WC_TEST_RET_ENC_NC; + } + + ret = wc_LmsKey_GetPubLen(&verifyKey, &pubSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + if (pubSz != HSS_MAX_PUBLIC_KEY_LEN) { + printf("error: got %u, expected %d\n", pubSz, HSS_MAX_PUBLIC_KEY_LEN); + return WC_TEST_RET_ENC_EC(pubSz); + } + + ret = wc_LmsKey_GetSigLen(&verifyKey, &sigSz); + if (ret != 0) { return WC_TEST_RET_ENC_EC(ret); } + + if (sigSz != LMS_L1H10W8_SIGLEN) { + printf("error: got %u, expected %d\n", sigSz, LMS_L1H10W8_SIGLEN); + return WC_TEST_RET_ENC_EC(sigSz); + } + + ret = wc_LmsKey_Verify(&verifyKey, lms_L1H10W8_sig, LMS_L1H10W8_SIGLEN, + (byte *) lms_msg, msgSz); + if (ret != 0) { + printf("error: wc_LmsKey_Verify returned %d\n", ret); + return WC_TEST_RET_ENC_EC(ret); + } + + /* Now test the ExportPubRaw API, verify we recover the original pub. */ + ret = wc_LmsKey_ExportPubRaw(&verifyKey, pub_raw, &pub_len); + if (ret != 0) { + printf("error: wc_LmsKey_ExportPubRaw returned %d, expected 0\n", ret); + return WC_TEST_RET_ENC_EC(ret); + } + + if (pub_len != HSS_MAX_PUBLIC_KEY_LEN) { + printf("error: LMS pub len %u, expected %d\n", pub_len, + HSS_MAX_PUBLIC_KEY_LEN); + return WC_TEST_RET_ENC_EC(pub_len); + } + + n_diff = XMEMCMP(pub_raw, lms_L1H10W8_pub, sizeof(lms_L1H10W8_pub)); + + if (n_diff != 0) { + printf("error: exported and imported pub raw do not match: %d\n", + n_diff); + return WC_TEST_RET_ENC_EC(n_diff); + } + + /* Flip bits in message. This should fail. */ + lms_msg[msgSz / 2] ^= 1; + ret2 = wc_LmsKey_Verify(&verifyKey, lms_L1H10W8_sig, LMS_L1H10W8_SIGLEN, + (byte *) lms_msg, msgSz); + if ((ret2 != -1) && (ret2 != SIG_VERIFY_E)) { + printf("error: wc_LmsKey_Verify returned %d, expected -1\n", ret2); + return WC_TEST_RET_ENC_EC(ret); + } + + /* Flip it back. This should pass again. */ + lms_msg[msgSz / 2] ^= 1; + ret = wc_LmsKey_Verify(&verifyKey, lms_L1H10W8_sig, LMS_L1H10W8_SIGLEN, + (byte *) lms_msg, msgSz); + if (ret != 0) { + printf("error: wc_LmsKey_Verify returned %d, expected 0\n", ret); + return WC_TEST_RET_ENC_EC(ret); + } + + /* Flip bits in a few places throughout the signature, stepping in multiple + * of hash size. These should all fail with -1. */ + for (j = 0; j < (int) sigSz; j+= 4 * 32) { + lms_L1H10W8_sig[j] ^= 1; + + ret2 = wc_LmsKey_Verify(&verifyKey, lms_L1H10W8_sig, + LMS_L1H10W8_SIGLEN, + (byte *) lms_msg, msgSz); + if ((ret2 != -1) && (ret2 != SIG_VERIFY_E)) { + /* Verify passed when it should have failed. */ + return WC_TEST_RET_ENC_I(j); + } + + /* Flip this spot back. */ + lms_L1H10W8_sig[j] ^= 1; + } + + wc_LmsKey_Free(&verifyKey); + return ret; +} + +#endif +#endif /* if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_SMALL_STACK) */ + static const int fiducial3 = WC_TEST_RET_LN; /* source code reference point -- * see print_fiducials() below. */ #ifdef WOLFCRYPT_HAVE_ECCSI -static int eccsi_api_test(WC_RNG* rng, EccsiKey* key, mp_int* ssk, +static wc_test_ret_t eccsi_api_test(WC_RNG* rng, EccsiKey* key, mp_int* ssk, ecc_point* pvt) { - int ret; + wc_test_ret_t ret; byte id[1] = { 0x00 }; int valid; word32 sz; @@ -33867,9 +43823,9 @@ } /* RFC 6507: Appendix A */ -static int eccsi_kat_verify_test(EccsiKey* key, ecc_point* pvt) +static wc_test_ret_t eccsi_kat_verify_test(EccsiKey* key, ecc_point* pvt) { - int ret; + wc_test_ret_t ret; int verified; const byte msg[] = { 0x6D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x00 }; word32 msgSz = sizeof(msg); @@ -33949,9 +43905,9 @@ return 0; } -static int eccsi_enc_dec_pair_test(EccsiKey* priv, mp_int* ssk, ecc_point* pvt) +static wc_test_ret_t eccsi_enc_dec_pair_test(EccsiKey* priv, mp_int* ssk, ecc_point* pvt) { - int ret; + wc_test_ret_t ret; byte data[32 * 3]; word32 sz; ecc_point* decPvt = NULL; @@ -34050,9 +44006,9 @@ return ret; } -static int eccsi_imp_exp_key_test(EccsiKey* priv) +static wc_test_ret_t eccsi_imp_exp_key_test(EccsiKey* priv) { - int ret; + wc_test_ret_t ret; byte data[32 * 3]; byte out[32 * 3]; word32 sz; @@ -34108,9 +44064,9 @@ return 0; } -static int eccsi_imp_exp_pubkey_test(EccsiKey* key1, EccsiKey* key2) +static wc_test_ret_t eccsi_imp_exp_pubkey_test(EccsiKey* key1, EccsiKey* key2) { - int ret; + wc_test_ret_t ret; byte data[32 * 2 + 1]; byte pubData[32 * 2 + 1]; word32 sz; @@ -34154,10 +44110,10 @@ return 0; } -static int eccsi_make_key_test(EccsiKey* priv, EccsiKey* pub, WC_RNG* rng, +static wc_test_ret_t eccsi_make_key_test(EccsiKey* priv, EccsiKey* pub, WC_RNG* rng, mp_int* ssk, ecc_point* pvt) { - int ret; + wc_test_ret_t ret; char mail[] = "test@wolfssl.com"; byte* id = (byte*)mail; word32 idSz = (word32) XSTRLEN(mail); @@ -34193,10 +44149,10 @@ return 0; } -static int eccsi_sign_verify_test(EccsiKey* priv, EccsiKey* pub, WC_RNG* rng, +static wc_test_ret_t eccsi_sign_verify_test(EccsiKey* priv, EccsiKey* pub, WC_RNG* rng, mp_int* ssk, ecc_point* pvt) { - int ret; + wc_test_ret_t ret; byte hashPriv[WC_MAX_DIGEST_SIZE]; byte hashPub[WC_MAX_DIGEST_SIZE]; byte hashSz; @@ -34348,15 +44304,16 @@ return 0; } -int eccsi_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t eccsi_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; WC_RNG rng; int rng_inited = 0; EccsiKey* priv = NULL; EccsiKey* pub = NULL; mp_int* ssk = NULL; ecc_point* pvt = NULL; + WOLFSSL_ENTER("eccsi_test"); priv = (EccsiKey*)XMALLOC(sizeof(EccsiKey), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -34457,9 +44414,9 @@ #endif /* WOLFCRYPT_HAVE_ECCSI */ #ifdef WOLFCRYPT_HAVE_SAKKE -static int sakke_api_test(WC_RNG* rng, SakkeKey* key, ecc_point* rsk) +static wc_test_ret_t sakke_api_test(WC_RNG* rng, SakkeKey* key, ecc_point* rsk) { - int ret; + wc_test_ret_t ret; byte id[1] = { 0x00 }; int valid; byte data[256]; @@ -34893,7 +44850,7 @@ return 0; } -static int sakke_kat_derive_test(SakkeKey* key, ecc_point* rsk) +static wc_test_ret_t sakke_kat_derive_test(SakkeKey* key, ecc_point* rsk) { WOLFSSL_SMALL_STACK_STATIC const byte pubData[] = { 0x59, 0x58, 0xEF, 0x1B, 0x16, 0x79, 0xBF, 0x09, @@ -35013,7 +44970,7 @@ 0x89, 0xE0, 0xBC, 0x66, 0x1A, 0xA1, 0xE9, 0x16, 0x38, 0xE6, 0xAC, 0xC8, 0x4E, 0x49, 0x65, 0x07 }; - int ret; + wc_test_ret_t ret; int valid; byte pubKey[sizeof(pubData) + 1]; word32 sz = sizeof(pubKey); @@ -35127,7 +45084,7 @@ return 0; } -static int sakke_kat_encapsulate_test(SakkeKey* key) +static wc_test_ret_t sakke_kat_encapsulate_test(SakkeKey* key) { static const byte pubData[] = { 0x59, 0x58, 0xEF, 0x1B, 0x16, 0x79, 0xBF, 0x09, @@ -35169,12 +45126,12 @@ 0x37, 0x30, 0x30, 0x39, 0x30, 0x30, 0x31, 0x32, 0x33, 0x00 }; - static word32 idSz = sizeof(id); + static const word32 idSz = sizeof(id); byte ssv[] = { 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0 }; - static word16 ssvSz = sizeof(ssv); + static const word16 ssvSz = sizeof(ssv); static const byte expAuth[] = { 0x04, 0x44, 0xE8, 0xAD, 0x44, 0xAB, 0x85, 0x92, 0xA6, @@ -35214,7 +45171,7 @@ 0x89, 0xE0, 0xBC, 0x66, 0x1A, 0xA1, 0xE9, 0x16, 0x38, 0xE6, 0xAC, 0xC8, 0x4E, 0x49, 0x65, 0x07 }; - int ret; + wc_test_ret_t ret; byte auth[257]; word16 authSz = sizeof(auth); @@ -35241,10 +45198,10 @@ return 0; } -static int sakke_make_key_test(SakkeKey* priv, SakkeKey* pub, SakkeKey* key, +static wc_test_ret_t sakke_make_key_test(SakkeKey* priv, SakkeKey* pub, SakkeKey* key, WC_RNG* rng, ecc_point* rsk) { - int ret; + wc_test_ret_t ret; byte data[440]; byte pubData[257]; word32 sz; @@ -35387,10 +45344,10 @@ return 0; } -static int sakke_op_test(SakkeKey* priv, SakkeKey* pub, WC_RNG* rng, +static wc_test_ret_t sakke_op_test(SakkeKey* priv, SakkeKey* pub, WC_RNG* rng, ecc_point* rsk) { - int ret; + wc_test_ret_t ret; byte ssv[16]; word16 ssvSz; byte auth[257]; @@ -35503,15 +45460,16 @@ return 0; } -int sakke_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sakke_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; WC_RNG rng; int rng_inited = 0; SakkeKey* priv = NULL; SakkeKey* pub = NULL; SakkeKey* key = NULL; ecc_point* rsk = NULL; + WOLFSSL_ENTER("sakke_test"); priv = (SakkeKey*)XMALLOC(sizeof(SakkeKey), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -35623,7 +45581,7 @@ word32 tSz; } CMAC_Test_Case; -WOLFSSL_TEST_SUBROUTINE int cmac_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cmac_test(void) { #ifdef WOLFSSL_AES_128 WOLFSSL_SMALL_STACK_STATIC const byte k128[] = @@ -35775,7 +45733,8 @@ byte tag[AES_BLOCK_SIZE]; const CMAC_Test_Case* tc; word32 i, tagSz; - int ret; + wc_test_ret_t ret; + WOLFSSL_ENTER("cmac_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((cmac = (Cmac *)XMALLOC(sizeof *cmac, HEAP_HINT, DYNAMIC_TYPE_CMAC)) == NULL) @@ -35822,16 +45781,42 @@ XMEMSET(tag, 0, sizeof(tag)); tagSz = sizeof(tag); +#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3) + ret = wc_AesCmacGenerate_ex(cmac, tag, &tagSz, tc->m, tc->mSz, + tc->k, tc->kSz, NULL, devId); +#else ret = wc_AesCmacGenerate(tag, &tagSz, tc->m, tc->mSz, tc->k, tc->kSz); +#endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); if (XMEMCMP(tag, tc->t, AES_BLOCK_SIZE) != 0) ERROR_OUT(WC_TEST_RET_ENC_NC, out); +#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3) + ret = wc_AesCmacVerify_ex(cmac, tc->t, tc->tSz, tc->m, tc->mSz, + tc->k, tc->kSz, HEAP_HINT, devId); +#else ret = wc_AesCmacVerify(tc->t, tc->tSz, tc->m, tc->mSz, tc->k, tc->kSz); +#endif if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + +#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(5, 3) + /* Test that keyless generate with init is the same */ + XMEMSET(tag, 0, sizeof(tag)); + tagSz = sizeof(tag); + ret = wc_InitCmac_ex(cmac, tc->k, tc->kSz, tc->type, NULL, HEAP_HINT, devId); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + } + ret = wc_AesCmacGenerate_ex(cmac, tag, &tagSz, tc->m, tc->mSz, + NULL, 0, HEAP_HINT, devId); + if (ret != 0) { + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + } +#endif + } ret = 0; @@ -36066,20 +46051,21 @@ }; #endif -WOLFSSL_TEST_SUBROUTINE int siphash_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t siphash_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; int i; #if WOLFSSL_SIPHASH_CROUNDS == 2 && WOLFSSL_SIPHASH_DROUNDS == 4 unsigned char res[SIPHASH_MAC_SIZE_16]; unsigned char tmp[SIPHASH_MAC_SIZE_8]; SipHash siphash; + WOLFSSL_ENTER("siphash_test (1)"); for (i = 0; i < 64; i++) { ret = wc_InitSipHash(&siphash, siphash_key, SIPHASH_MAC_SIZE_8); if (ret != 0) return WC_TEST_RET_ENC_I(i); - ret = wc_SipHashUpdate(&siphash, siphash_msg, i); + ret = wc_SipHashUpdate(&siphash, siphash_msg, (word32)i); if (ret != 0) return WC_TEST_RET_ENC_I(i); ret = wc_SipHashFinal(&siphash, res, SIPHASH_MAC_SIZE_8); @@ -36087,7 +46073,7 @@ return WC_TEST_RET_ENC_I(i); if (XMEMCMP(res, siphash_r8[i], SIPHASH_MAC_SIZE_8) != 0) return WC_TEST_RET_ENC_I(i); - ret = wc_SipHash(siphash_key, siphash_msg, i, res, SIPHASH_MAC_SIZE_8); + ret = wc_SipHash(siphash_key, siphash_msg, (word32)i, res, SIPHASH_MAC_SIZE_8); if (ret != 0) return WC_TEST_RET_ENC_I(i); if (XMEMCMP(res, siphash_r8[i], SIPHASH_MAC_SIZE_8) != 0) @@ -36097,7 +46083,7 @@ ret = wc_InitSipHash(&siphash, siphash_key, SIPHASH_MAC_SIZE_16); if (ret != 0) return WC_TEST_RET_ENC_I(i); - ret = wc_SipHashUpdate(&siphash, siphash_msg, i); + ret = wc_SipHashUpdate(&siphash, siphash_msg, (word32)i); if (ret != 0) return WC_TEST_RET_ENC_I(i); ret = wc_SipHashFinal(&siphash, res, SIPHASH_MAC_SIZE_16); @@ -36105,12 +46091,14 @@ return WC_TEST_RET_ENC_I(i); if (XMEMCMP(res, siphash_r16[i], SIPHASH_MAC_SIZE_16) != 0) return WC_TEST_RET_ENC_I(i); - ret = wc_SipHash(siphash_key, siphash_msg, i, res, SIPHASH_MAC_SIZE_16); + ret = wc_SipHash(siphash_key, siphash_msg, (word32)i, res, SIPHASH_MAC_SIZE_16); if (ret != 0) return WC_TEST_RET_ENC_I(i); if (XMEMCMP(res, siphash_r16[i], SIPHASH_MAC_SIZE_16) != 0) return WC_TEST_RET_ENC_I(i); } +#else + WOLFSSL_ENTER("siphash_test (1)"); #endif /* Testing bad parameters. */ @@ -36426,13 +46414,14 @@ 0x6F, 0x86, 0x43, 0x51, 0xB6, 0x11, 0x00, 0x00 }; -WOLFSSL_TEST_SUBROUTINE int compress_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t compress_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; word32 dSz = sizeof(sample_text); word32 cSz = (dSz + (word32)(dSz * 0.001) + 12); byte *c; byte *d; + WOLFSSL_ENTER("compress_test"); c = (byte *)XMALLOC(cSz * sizeof(byte), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); d = (byte *)XMALLOC(dSz * sizeof(byte), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -36536,7 +46525,7 @@ * * Returns 0 on success, negative on error */ -static int pkcs7_load_certs_keys( +static wc_test_ret_t pkcs7_load_certs_keys( byte* rsaClientCertBuf, word32* rsaClientCertBufSz, byte* rsaClientPrivKeyBuf, word32* rsaClientPrivKeyBufSz, byte* rsaServerCertBuf, word32* rsaServerCertBufSz, @@ -36869,7 +46858,9 @@ int i; /* make sure buffers are large enough */ - if ((*oriValueSz < (2 + cekSz)) || (*oriTypeSz < sizeof(oriType))) + if (*oriValueSz < (2 + cekSz)) + return WC_TEST_RET_ENC_NC; + if (*oriTypeSz < sizeof(asnDataOid)) return WC_TEST_RET_ENC_NC; /* our simple encryption algorithm will be take the bitwise complement */ @@ -36935,7 +46926,8 @@ byte* aad, word32 aadSz, byte* authTag, word32 authTagSz, byte* in, int inSz, byte* out, void* usrCtx) { - int keyId = -1, ret, keySz; + wc_test_ret_t ret; + int keyId = -1, keySz; word32 keyIdSz = 8; const byte* key; byte keyIdRaw[8]; @@ -37028,7 +47020,7 @@ #ifdef WOLFSSL_AES_256 case AES256CBCb: if ((keySz != 32 ) || (ivSz != AES_BLOCK_SIZE)) - ERROR_OUT(BAD_FUNC_ARG, out); + WARNING_OUT(BAD_FUNC_ARG, out); break; #endif #ifdef WOLFSSL_AES_128 @@ -37045,9 +47037,9 @@ ret = wc_AesInit(aes, HEAP_HINT, INVALID_DEVID); if (ret == 0) { - ret = wc_AesSetKey(aes, key, keySz, iv, AES_DECRYPTION); + ret = wc_AesSetKey(aes, key, (word32)keySz, iv, AES_DECRYPTION); if (ret == 0) - ret = wc_AesCbcDecrypt(aes, out, in, inSz); + ret = wc_AesCbcDecrypt(aes, out, in, (word32)inSz); wc_AesFree(aes); } @@ -37061,19 +47053,20 @@ (void)aadSz; (void)authTag; (void)authTagSz; - return ret; + return (int)ret; } #endif /* !NO_AES && HAVE_AES_CBC */ #define PKCS7_BUF_SIZE 2048 -static int pkcs7enveloped_run_vectors(byte* rsaCert, word32 rsaCertSz, +static wc_test_ret_t pkcs7enveloped_run_vectors(byte* rsaCert, word32 rsaCertSz, byte* rsaPrivKey, word32 rsaPrivKeySz, byte* eccCert, word32 eccCertSz, byte* eccPrivKey, word32 eccPrivKeySz) { - int ret = 0, testSz = 0, i; + wc_test_ret_t ret = 0; + int testSz = 0, i; int envelopedSz, decodedSz; byte *enveloped = NULL; @@ -37461,7 +47454,7 @@ /* decode envelopedData */ pkcs7->contentOID = 0; - decodedSz = wc_PKCS7_DecodeEnvelopedData(pkcs7, enveloped, envelopedSz, + decodedSz = wc_PKCS7_DecodeEnvelopedData(pkcs7, enveloped, (word32)envelopedSz, decoded, PKCS7_BUF_SIZE); if (pkcs7->contentOID != testVectors[i].contentOID || decodedSz <= 0) { @@ -37542,9 +47535,9 @@ } -WOLFSSL_TEST_SUBROUTINE int pkcs7enveloped_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7enveloped_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; byte* rsaCert = NULL; byte* rsaPrivKey = NULL; @@ -37555,6 +47548,7 @@ byte* eccPrivKey = NULL; word32 eccCertSz = 0; word32 eccPrivKeySz = 0; + WOLFSSL_ENTER("pkcs7enveloped_test"); #ifndef NO_RSA /* read client RSA cert and key in DER format */ @@ -37686,12 +47680,13 @@ } pkcs7AuthEnvelopedVector; -static int pkcs7authenveloped_run_vectors(byte* rsaCert, word32 rsaCertSz, +static wc_test_ret_t pkcs7authenveloped_run_vectors(byte* rsaCert, word32 rsaCertSz, byte* rsaPrivKey, word32 rsaPrivKeySz, byte* eccCert, word32 eccCertSz, byte* eccPrivKey, word32 eccPrivKeySz) { - int ret = 0, testSz = 0, i; + wc_test_ret_t ret = 0; + int testSz = 0, i; int envelopedSz, decodedSz; byte *enveloped = NULL; @@ -37724,7 +47719,7 @@ #endif #if !defined(NO_AES) && defined(WOLFSSL_AES_256) && defined(HAVE_ECC) && \ - defined(WOLFSSL_SHA512) + defined(WOLFSSL_SHA512) && defined(HAVE_AESGCM) WOLFSSL_SMALL_STACK_STATIC const byte optionalUkm[] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07 }; @@ -37827,7 +47822,12 @@ NULL, 0, 0, NULL, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, "pkcs7authEnvelopedDataAES256GCM_IANDS.der"); #endif - #endif /* NO_AES */ + #else /* NO_AES || !HAVE_AESGCM */ + (void)rsaCert; + (void)rsaCertSz; + (void)rsaPrivKey; + (void)rsaPrivKeySz; + #endif /* NO_AES || !HAVE_AESGCM */ #endif /* key agreement key encryption technique*/ @@ -38178,7 +48178,7 @@ #endif /* decode envelopedData */ decodedSz = wc_PKCS7_DecodeAuthEnvelopedData(pkcs7, enveloped, - envelopedSz, decoded, + (word32)envelopedSz, decoded, PKCS7_BUF_SIZE); if (decodedSz <= 0) { wc_PKCS7_Free(pkcs7); @@ -38242,9 +48242,9 @@ return ret; } -WOLFSSL_TEST_SUBROUTINE int pkcs7authenveloped_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7authenveloped_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; byte* rsaCert = NULL; byte* rsaPrivKey = NULL; @@ -38255,6 +48255,7 @@ byte* eccPrivKey = NULL; word32 eccCertSz = 0; word32 eccPrivKeySz = 0; + WOLFSSL_ENTER("pkcs7authenveloped_test"); #ifndef NO_RSA /* read client RSA cert and key in DER format */ @@ -38349,7 +48350,7 @@ word32 keyIdSz, byte* orginKey, word32 orginKeySz, byte* out, word32 outSz, int keyWrapAlgo, int type, int direction) { - int ret; + wc_test_ret_t ret; if (cek == NULL || out == NULL) return BAD_FUNC_ARG; @@ -38372,7 +48373,7 @@ ret = wc_AesKeyUnWrap(p7DefKey, sizeof(p7DefKey), cek, cekSz, out, outSz, NULL); if (ret <= 0) - return ret; + return (int)ret; break; default: @@ -38384,14 +48385,14 @@ (void)direction; (void)orginKey; /* used with KAKRI */ (void)orginKeySz; - return ret; + return (int)ret; } /* returns key size on success */ -static int getFirmwareKey(PKCS7* pkcs7, byte* key, word32 keySz) +static wc_test_ret_t getFirmwareKey(PKCS7* pkcs7, byte* key, word32 keySz) { - int ret; + wc_test_ret_t ret; word32 atrSz; byte atr[256]; @@ -38444,10 +48445,10 @@ /* create a KEKRI enveloped data * return size on success */ -static int envelopedData_encrypt(byte* in, word32 inSz, byte* out, +static wc_test_ret_t envelopedData_encrypt(byte* in, word32 inSz, byte* out, word32 outSz) { - int ret; + wc_test_ret_t ret; PKCS7* pkcs7; WOLFSSL_SMALL_STACK_STATIC const byte keyId[] = { 0x00 }; @@ -38467,7 +48468,7 @@ sizeof(p7DefKey), (byte*)keyId, sizeof(keyId), NULL, NULL, 0, NULL, 0, 0); if (ret < 0) { - printf("wc_PKCS7_AddRecipient_KEKRI() failed, ret = %d\n", ret); + printf("wc_PKCS7_AddRecipient_KEKRI() failed\n"); wc_PKCS7_Free(pkcs7); return WC_TEST_RET_ENC_EC(ret); } @@ -38475,7 +48476,7 @@ /* encode envelopedData, returns size */ ret = wc_PKCS7_EncodeEnvelopedData(pkcs7, out, outSz); if (ret <= 0) { - printf("wc_PKCS7_EncodeEnvelopedData() failed, ret = %d\n", ret); + printf("wc_PKCS7_EncodeEnvelopedData() failed\n"); wc_PKCS7_Free(pkcs7); return WC_TEST_RET_ENC_EC(ret); @@ -38491,11 +48492,12 @@ * keyHint is the KeyID to be set in the fwDecryptKeyID attribute * returns size of buffer output on success */ -static int generateBundle(byte* out, word32 *outSz, const byte* encryptKey, +static wc_test_ret_t generateBundle(byte* out, word32 *outSz, const byte* encryptKey, word32 encryptKeySz, byte keyHint, byte* cert, word32 certSz, byte* key, word32 keySz) { - int ret, attribNum = 1; + wc_test_ret_t ret; + int attribNum = 1; PKCS7* pkcs7; /* KEY ID @@ -38532,7 +48534,7 @@ if (ret <= 0) { return ret; } - attribs[1].valueSz = ret; + attribs[1].valueSz = (word32)ret; attribNum++; } @@ -38559,13 +48561,13 @@ ret = wc_PKCS7_EncodeSignedEncryptedFPD(pkcs7, (byte*)encryptKey, encryptKeySz, key, keySz, AES128CBCb, RSAk, SHA256h, (byte*)data, sizeof(data), NULL, 0, - attribs, attribNum, out, *outSz); + attribs, (word32)attribNum, out, *outSz); } else { ret = wc_PKCS7_EncodeSignedEncryptedFPD(pkcs7, (byte*)encryptKey, encryptKeySz, key, keySz, AES256CBCb, RSAk, SHA256h, (byte*)data, sizeof(data), NULL, 0, - attribs, attribNum, out, *outSz); + attribs, (word32)attribNum, out, *outSz); } if (ret <= 0) { printf("ERROR: wc_PKCS7_EncodeSignedEncryptedFPD() failed, " @@ -38574,7 +48576,7 @@ return WC_TEST_RET_ENC_EC(ret); } else { - *outSz = ret; + *outSz = (word32)ret; } wc_PKCS7_Free(pkcs7); @@ -38586,9 +48588,9 @@ /* test verification and decryption of PKCS7 bundle * return 0 on success */ -static int verifyBundle(byte* derBuf, word32 derSz, int keyHint) +static wc_test_ret_t verifyBundle(byte* derBuf, word32 derSz, int keyHint) { - int ret = 0; + wc_test_ret_t ret = 0; int usrCtx = 1; /* test value to pass as user context to callback */ PKCS7* pkcs7 = NULL; byte* sid = NULL; @@ -38674,7 +48676,7 @@ if (ret < 0) goto out; pkcs7->encryptionKey = key; - pkcs7->encryptionKeySz = ret; + pkcs7->encryptionKeySz = (word32)ret; } else { decodedSz = PKCS7_BUF_SIZE; @@ -38688,7 +48690,7 @@ } decodedSz = wc_PKCS7_DecodeEncryptedData(pkcs7, pkcs7->content, - pkcs7->contentSz, decoded, decodedSz); + pkcs7->contentSz, decoded, (word32)decodedSz); if (decodedSz < 0) { ret = decodedSz; goto out; @@ -38709,12 +48711,13 @@ } -WOLFSSL_TEST_SUBROUTINE int pkcs7callback_test(byte* cert, word32 certSz, byte* key, word32 keySz) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7callback_test(byte* cert, word32 certSz, byte* key, word32 keySz) { - int ret = 0; + wc_test_ret_t ret = 0; word32 derSz; byte *derBuf = (byte *)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + WOLFSSL_ENTER("pkcs7callback_test"); if (! derBuf) ERROR_OUT(WC_TEST_RET_ENC_NC, out); @@ -38781,9 +48784,9 @@ } pkcs7EncryptedVector; -WOLFSSL_TEST_SUBROUTINE int pkcs7encrypted_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7encrypted_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; int i, testSz; int encryptedSz, decodedSz, attribIdx; PKCS7* pkcs7; @@ -38839,8 +48842,8 @@ /* Attribute example from RFC 4134, Section 7.2 * OID = 1.2.5555 * OCTET STRING = 'This is a test General ASN Attribute, number 1.' */ - static byte genAttrOid[] = { 0x06, 0x03, 0x2a, 0xab, 0x33 }; - static byte genAttr[] = { 0x04, 47, + static const byte genAttrOid[] = { 0x06, 0x03, 0x2a, 0xab, 0x33 }; + static const byte genAttr[] = { 0x04, 47, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x41, @@ -38848,8 +48851,8 @@ 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x31, 0x2e }; - static byte genAttrOid2[] = { 0x06, 0x03, 0x2a, 0xab, 0x34 }; - static byte genAttr2[] = { 0x04, 47, + static const byte genAttrOid2[] = { 0x06, 0x03, 0x2a, 0xab, 0x34 }; + static const byte genAttr2[] = { 0x04, 47, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x41, @@ -38911,6 +48914,7 @@ #endif #endif /* !NO_AES && HAVE_AES_CBC */ }; + WOLFSSL_ENTER("pkcs7encrypted_test"); encrypted = (byte *)XMALLOC(PKCS7_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); decoded = (byte *)XMALLOC(PKCS7_BUF_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -38963,7 +48967,7 @@ } } #endif - decodedSz = wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, encryptedSz, + decodedSz = wc_PKCS7_DecodeEncryptedData(pkcs7, encrypted, (word32)encryptedSz, decoded, PKCS7_BUF_SIZE); if (decodedSz <= 0){ wc_PKCS7_Free(pkcs7); @@ -39049,9 +49053,9 @@ } pkcs7CompressedVector; -WOLFSSL_TEST_SUBROUTINE int pkcs7compressed_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7compressed_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; int i, testSz; int compressedSz, decodedSz; PKCS7* pkcs7; @@ -39087,6 +49091,7 @@ ERROR_OUT(MEMORY_E, out); } #endif + WOLFSSL_ENTER("pkcs7compressed_test"); testSz = sizeof(testVectors) / sizeof(pkcs7CompressedVector); @@ -39182,12 +49187,12 @@ word32 signedAttribsSz; const char* outFileName; int contentOID; - byte* contentType; + const byte* contentType; word32 contentTypeSz; int sidType; int encryptOID; /* for single-shot encrypt alg OID */ int encCompFlag; /* for single-shot. 1 = enc, 2 = comp, 3 = both*/ - byte* encryptKey; /* for single-shot, encryptedData */ + const byte* encryptKey; /* for single-shot, encryptedData */ word32 encryptKeySz; /* for single-shot, encryptedData */ PKCS7Attrib* unprotectedAttribs; /* for single-shot, encryptedData */ word32 unprotectedAttribsSz; /* for single-shot, encryptedData */ @@ -39195,7 +49200,7 @@ } pkcs7SignedVector; -static int pkcs7signed_run_vectors( +static wc_test_ret_t pkcs7signed_run_vectors( byte* rsaClientCertBuf, word32 rsaClientCertBufSz, byte* rsaClientPrivKeyBuf, word32 rsaClientPrivKeyBufSz, byte* rsaServerCertBuf, word32 rsaServerCertBufSz, @@ -39205,7 +49210,8 @@ byte* eccClientCertBuf, word32 eccClientCertBufSz, byte* eccClientPrivKeyBuf, word32 eccClientPrivKeyBufSz) { - int ret, testSz = 0, i; + wc_test_ret_t ret; + int testSz = 0, i; int encodedSz; byte* out = NULL; word32 outSz; @@ -39220,24 +49226,24 @@ 0x72,0x6c,0x64 }; - static byte transIdOid[] = + static const byte transIdOid[] = { 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x09, 0x07 }; - static byte messageTypeOid[] = + static const byte messageTypeOid[] = { 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x09, 0x02 }; - static byte senderNonceOid[] = + static const byte senderNonceOid[] = { 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x09, 0x05 }; #ifndef NO_SHA - static byte transId[(WC_SHA_DIGEST_SIZE + 1) * 2 + 1]; + byte transId[(WC_SHA_DIGEST_SIZE + 1) * 2 + 1]; #else - static byte transId[(WC_SHA256_DIGEST_SIZE + 1) * 2 + 1]; + byte transId[(WC_SHA256_DIGEST_SIZE + 1) * 2 + 1]; #endif - static byte messageType[] = { 0x13, 2, '1', '9' }; - static byte senderNonce[PKCS7_NONCE_SZ + 2]; + static const byte messageType[] = { 0x13, 2, '1', '9' }; + byte senderNonce[PKCS7_NONCE_SZ + 2]; - static PKCS7Attrib attribs[] = + PKCS7Attrib attribs[] = { { transIdOid, sizeof(transIdOid), transId, sizeof(transId) - 1 }, /* take off the null */ @@ -39248,13 +49254,13 @@ }; /* for testing custom contentType, FirmwarePkgData */ - static byte customContentType[] = { 0x06, 0x0B, 0x2A, 0x86, + static const byte customContentType[] = { 0x06, 0x0B, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x10, 0x01, 0x10 }; #define MAX_TESTVECTORS_LEN 20 #define ADD_PKCS7SIGNEDVECTOR(...) { \ - pkcs7SignedVector _this_vector = { __VA_ARGS__ }; \ + const pkcs7SignedVector _this_vector = { __VA_ARGS__ }; \ if (testSz == MAX_TESTVECTORS_LEN) { \ ret = WC_TEST_RET_ENC_NC; \ goto out; \ @@ -39465,6 +49471,11 @@ XMEMSET(out, 0, outSz); + /* test inner pad size error with block size being 0 */ + ret = wc_PKCS7_PadData((byte*)data, sizeof(data), out, outSz, 0); + if (ret > 0) + ERROR_OUT(-1, out); + ret = wc_PKCS7_PadData((byte*)data, sizeof(data), out, outSz, 16); if (ret < 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -39511,7 +49522,8 @@ /* optional custom contentType, default is DATA, overrides contentOID if set */ if (testVectors[i].contentType != NULL) { - ret = wc_PKCS7_SetContentType(pkcs7, testVectors[i].contentType, + ret = wc_PKCS7_SetContentType(pkcs7, + (byte *)testVectors[i].contentType, testVectors[i].contentTypeSz); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -39633,12 +49645,12 @@ #else byte buf[(WC_SHA256_DIGEST_SIZE + 1) * 2 + 1]; #endif - byte* oidPt = transIdOid + 2; /* skip object id tag and size */ + const byte* oidPt = transIdOid + 2; /* skip object id tag and size */ int oidSz = (int)sizeof(transIdOid) - 2; int bufSz = 0; if (testVectors[i].signedAttribs != NULL) { - ret = wc_PKCS7_GetAttributeValue(pkcs7, oidPt, oidSz, + ret = wc_PKCS7_GetAttributeValue(pkcs7, oidPt, (word32)oidSz, NULL, (word32*)&bufSz); if (ret != LENGTH_ONLY_E) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); @@ -39648,7 +49660,7 @@ if (bufSz > (int)sizeof(buf)) ERROR_OUT(WC_TEST_RET_ENC_NC, out); - bufSz = wc_PKCS7_GetAttributeValue(pkcs7, oidPt, oidSz, + bufSz = wc_PKCS7_GetAttributeValue(pkcs7, oidPt, (word32)oidSz, buf, (word32*)&bufSz); if ((testVectors[i].signedAttribs != NULL && bufSz < 0) || (testVectors[i].signedAttribs == NULL && bufSz > 0)) @@ -39706,7 +49718,7 @@ } -static int pkcs7signed_run_SingleShotVectors( +static wc_test_ret_t pkcs7signed_run_SingleShotVectors( byte* rsaClientCertBuf, word32 rsaClientCertBufSz, byte* rsaClientPrivKeyBuf, word32 rsaClientPrivKeyBufSz, byte* rsaServerCertBuf, word32 rsaServerCertBufSz, @@ -39716,7 +49728,8 @@ byte* eccClientCertBuf, word32 eccClientCertBufSz, byte* eccClientPrivKeyBuf, word32 eccClientPrivKeyBufSz) { - int ret, testSz = 0, i; + wc_test_ret_t ret; + int testSz = 0, i; int encodedSz; byte* out = NULL; word32 outSz; @@ -39738,7 +49751,7 @@ #if !defined(NO_PKCS7_ENCRYPTED_DATA) && \ defined(HAVE_AES_CBC) && defined(WOLFSSL_AES_256) - static byte aes256Key[] = { + static const byte aes256Key[] = { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, @@ -39746,10 +49759,10 @@ }; #endif - static byte messageTypeOid[] = + static const byte messageTypeOid[] = { 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x45, 0x01, 0x09, 0x02 }; - static byte messageType[] = { 0x13, 2, '1', '9' }; + static const byte messageType[] = { 0x13, 2, '1', '9' }; PKCS7Attrib attribs[] = { @@ -40039,7 +50052,7 @@ /* encode Signed Encrypted FirmwarePkgData */ encodedSz = wc_PKCS7_EncodeSignedEncryptedFPD(pkcs7, - testVectors[i].encryptKey, testVectors[i].encryptKeySz, + (byte *)testVectors[i].encryptKey, testVectors[i].encryptKeySz, testVectors[i].privateKey, testVectors[i].privateKeySz, testVectors[i].encryptOID, testVectors[i].signOID, testVectors[i].hashOID, (byte*)testVectors[i].content, @@ -40071,7 +50084,7 @@ /* encode Signed Encrypted Compressed FirmwarePkgData */ encodedSz = wc_PKCS7_EncodeSignedEncryptedCompressedFPD(pkcs7, - testVectors[i].encryptKey, testVectors[i].encryptKeySz, + (byte*)testVectors[i].encryptKey, testVectors[i].encryptKeySz, testVectors[i].privateKey, testVectors[i].privateKeySz, testVectors[i].encryptOID, testVectors[i].signOID, testVectors[i].hashOID, (byte*)testVectors[i].content, @@ -40142,7 +50155,7 @@ else if (testVectors[i].encCompFlag == 1) { /* decrypt inner encryptedData */ - pkcs7->encryptionKey = testVectors[i].encryptKey; + pkcs7->encryptionKey = (byte *)testVectors[i].encryptKey; pkcs7->encryptionKeySz = testVectors[i].encryptKeySz; ret = wc_PKCS7_DecodeEncryptedData(pkcs7, pkcs7->content, @@ -40180,7 +50193,7 @@ XMEMSET(encryptedTmp, 0, encryptedTmpSz); /* decrypt inner encryptedData */ - pkcs7->encryptionKey = testVectors[i].encryptKey; + pkcs7->encryptionKey = (byte*)testVectors[i].encryptKey; pkcs7->encryptionKeySz = testVectors[i].encryptKeySz; encryptedTmpSz = wc_PKCS7_DecodeEncryptedData(pkcs7, pkcs7->content, @@ -40245,9 +50258,9 @@ } -WOLFSSL_TEST_SUBROUTINE int pkcs7signed_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t pkcs7signed_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; byte* rsaClientCertBuf = NULL; byte* rsaServerCertBuf = NULL; @@ -40266,6 +50279,7 @@ word32 rsaServerPrivKeyBufSz = 0; word32 rsaCaPrivKeyBufSz = 0; word32 eccClientPrivKeyBufSz = 0; + WOLFSSL_ENTER("pkcs7signed_test"); #ifndef NO_RSA /* read client RSA cert and key in DER format */ @@ -40394,18 +50408,18 @@ /* Maximum number of bytes in a number to test. */ #define MP_MAX_TEST_BYTE_LEN 32 -static int randNum(mp_int* n, int len, WC_RNG* rng, void* heap) +static wc_test_ret_t randNum(mp_int* n, int len, WC_RNG* rng, void* heap) { byte d[MP_MAX_TEST_BYTE_LEN]; - int ret; + wc_test_ret_t ret; (void)heap; do { - ret = wc_RNG_GenerateBlock(rng, d, len); + ret = wc_RNG_GenerateBlock(rng, d, (word32)len); if (ret != 0) return ret; - ret = mp_read_unsigned_bin(n, d, len); + ret = mp_read_unsigned_bin(n, d, (word32)len); if (ret != 0) return ret; } while (mp_iszero(n)); @@ -40414,12 +50428,12 @@ } #if defined(WOLFSSL_SP_MATH_ALL) || !defined(USE_FAST_MATH) -static int mp_test_div_3(mp_int* a, mp_int* r, WC_RNG* rng) +static wc_test_ret_t mp_test_div_3(mp_int* a, mp_int* r, WC_RNG* rng) { int i, j; mp_digit rem; mp_digit rem2; - int ret; + wc_test_ret_t ret; #if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \ defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY) @@ -40508,15 +50522,15 @@ !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \ (!defined WOLFSSL_SP_MATH && !defined(WOLFSSL_SP_MATH_ALL) && \ (defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY))) -static int mp_test_radix_10(mp_int* a, mp_int* r, WC_RNG* rng) +static wc_test_ret_t mp_test_radix_10(mp_int* a, mp_int* r, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int i, j; int size; char str[30]; WOLFSSL_SMALL_STACK_STATIC const char* badStr1 = "A"; WOLFSSL_SMALL_STACK_STATIC const char* badStr2 = "a"; - WOLFSSL_SMALL_STACK_STATIC const char* badStr3 = " "; + WOLFSSL_SMALL_STACK_STATIC const char* empty2 = " "; WOLFSSL_SMALL_STACK_STATIC const char* zeros = "000"; WOLFSSL_SMALL_STACK_STATIC const char* empty = ""; @@ -40548,8 +50562,8 @@ ret = mp_read_radix(r, badStr2, MP_RADIX_DEC); if (ret != MP_VAL) return WC_TEST_RET_ENC_EC(ret); - ret = mp_read_radix(r, badStr3, MP_RADIX_DEC); - if (ret != MP_VAL) + ret = mp_read_radix(r, empty2, MP_RADIX_DEC); + if (ret != MP_OKAY) return WC_TEST_RET_ENC_EC(ret); ret = mp_read_radix(r, zeros, MP_RADIX_DEC); @@ -40587,16 +50601,16 @@ #if defined(WOLFSSL_SP_MATH_ALL) || (!defined WOLFSSL_SP_MATH && \ defined(HAVE_ECC)) -static int mp_test_radix_16(mp_int* a, mp_int* r, WC_RNG* rng) +static wc_test_ret_t mp_test_radix_16(mp_int* a, mp_int* r, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int i, j; int size; char str[30]; #if defined(WOLFSSL_SP_MATH) || defined(USE_FAST_MATH) static char longStr[2 * sizeof(a->dp) + 2]; #endif - WOLFSSL_SMALL_STACK_STATIC const char* badStr1 = " "; + WOLFSSL_SMALL_STACK_STATIC const char* empty2 = " "; WOLFSSL_SMALL_STACK_STATIC const char* badStr2 = "}"; WOLFSSL_SMALL_STACK_STATIC const char* empty = ""; @@ -40616,8 +50630,8 @@ } } - ret = mp_read_radix(r, badStr1, MP_RADIX_HEX); - if (ret != MP_VAL) + ret = mp_read_radix(r, empty2, MP_RADIX_HEX); + if (ret != MP_OKAY) return WC_TEST_RET_ENC_EC(ret); ret = mp_read_radix(r, badStr2, MP_RADIX_HEX); if (ret != MP_VAL) @@ -40674,10 +50688,10 @@ } #endif -static int mp_test_shift(mp_int* a, mp_int* r1, WC_RNG* rng) +static wc_test_ret_t mp_test_shift(mp_int* a, mp_int* r1, WC_RNG* rng) { int i; - int ret; + wc_test_ret_t ret; ret = randNum(a, 4, rng, NULL); if (ret != 0) @@ -40711,10 +50725,10 @@ return 0; } -static int mp_test_add_sub_d(mp_int* a, mp_int* r1) +static wc_test_ret_t mp_test_add_sub_d(mp_int* a, mp_int* r1) { int i, j; - int ret; + wc_test_ret_t ret; for (i = 0; i <= DIGIT_BIT * 2; i++) { mp_zero(a); @@ -40751,7 +50765,7 @@ return 0; } -static int mp_test_read_to_bin(mp_int* a) +static wc_test_ret_t mp_test_read_to_bin(mp_int* a) { WOLFSSL_SMALL_STACK_STATIC const byte in[16] = { 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe6, 0xf7, 0x08, @@ -40760,11 +50774,11 @@ byte out[24]; int i, j, k; const byte* p; - int ret; + wc_test_ret_t ret; for (i = 0; i < (int)sizeof(in); i++) { p = in + sizeof(in) - i; - ret = mp_read_unsigned_bin(a, p, i); + ret = mp_read_unsigned_bin(a, p, (word32)i); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); for (j = i; j < (int)sizeof(out); j++) { @@ -40798,7 +50812,7 @@ } #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL) -static int mp_test_set_int(mp_int* a) +static wc_test_ret_t mp_test_set_int(mp_int* a) { #if SP_ULONG_BITS == 64 unsigned long n = 0xfedcba9876543210UL; @@ -40817,7 +50831,7 @@ byte exp[1] = { 0xfe }; byte out[1] = { 0 }; #endif - int ret; + wc_test_ret_t ret; ret = mp_set_int(a, n); if (ret != 0) @@ -40837,7 +50851,7 @@ #endif #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL) -static int mp_test_param(mp_int* a, mp_int* b, mp_int* r, WC_RNG* rng) +static wc_test_ret_t mp_test_param(mp_int* a, mp_int* b, mp_int* r, WC_RNG* rng) { byte buffer[16]; #if defined(HAVE_ECC) || defined(WOLFSSL_SP_MATH_ALL) @@ -40850,7 +50864,7 @@ defined(HAVE_COMP_KEY) char decStr[] = "0987654321"; #endif - int ret; + wc_test_ret_t ret; #ifdef WOLFSSL_SP_MATH_ALL mp_digit rho; int size; @@ -41852,10 +51866,10 @@ #endif #if !defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL) -static int mp_test_set_is_bit(mp_int* a) +static wc_test_ret_t mp_test_set_is_bit(mp_int* a) { int i, j; - int ret; + wc_test_ret_t ret; mp_zero(a); for (i = 0; i <= DIGIT_BIT * 2; i++) { @@ -41944,9 +51958,9 @@ } #endif /* !WOLFSSL_SP_MATH || WOLFSSL_SP_MATH_ALL */ -static int mp_test_cmp(mp_int* a, mp_int* b) +static wc_test_ret_t mp_test_cmp(mp_int* a, mp_int* b) { - int ret; + wc_test_ret_t ret; mp_zero(a); mp_zero(b); @@ -42017,13 +52031,74 @@ return WC_TEST_RET_ENC_NC; #endif +#if defined(HAVE_ECC) && !defined(WC_NO_RNG) && \ + defined(WOLFSSL_ECC_GEN_REJECT_SAMPLING) + mp_zero(a); + mp_zero(b); + ret = mp_cmp_ct(a, b, 1); + if (ret != MP_EQ) + return WC_TEST_RET_ENC_EC(ret); + ret = mp_cmp_ct(a, a, a->used); + if (ret != MP_EQ) + return WC_TEST_RET_ENC_EC(ret); + +#ifdef WOLFSSL_SP_MATH_ALL + ret = mp_cmp_ct(a, NULL, a->used); + if (ret != MP_GT) + return WC_TEST_RET_ENC_EC(ret); + ret = mp_cmp_ct(NULL, a, a->used); + if (ret != MP_LT) + return WC_TEST_RET_ENC_EC(ret); +#endif + + mp_read_radix(a, "1", MP_RADIX_HEX); + ret = mp_cmp_ct(a, b, 1); + if (ret != MP_GT) + return WC_TEST_RET_ENC_EC(ret); + ret = mp_cmp_ct(b, a, 1); + if (ret != MP_LT) + return WC_TEST_RET_ENC_EC(ret); + + mp_read_radix(a, "0123456789abcdef0123456789abcdef", MP_RADIX_HEX); + ret = mp_cmp_ct(a, b, a->used); + if (ret != MP_GT) + return WC_TEST_RET_ENC_EC(ret); + ret = mp_cmp_ct(b, a, a->used); + if (ret != MP_LT) + return WC_TEST_RET_ENC_EC(ret); + + mp_read_radix(b, "1123456789abcdef0123456789abcdef", MP_RADIX_HEX); + ret = mp_cmp_ct(b, a, a->used); + if (ret != MP_GT) + return WC_TEST_RET_ENC_EC(ret); + ret = mp_cmp_ct(a, b, a->used); + if (ret != MP_LT) + return WC_TEST_RET_ENC_EC(ret); + + mp_read_radix(b, "0123456789abcdef0123456789abcdf0", MP_RADIX_HEX); + ret = mp_cmp_ct(b, a, a->used); + if (ret != MP_GT) + return WC_TEST_RET_ENC_EC(ret); + ret = mp_cmp_ct(a, b, a->used); + if (ret != MP_LT) + return WC_TEST_RET_ENC_EC(ret); + + mp_read_radix(b, "0123456789abcdf0", MP_RADIX_HEX); + ret = mp_cmp_ct(a, b, a->used); + if (ret != MP_GT) + return WC_TEST_RET_ENC_EC(ret); + ret = mp_cmp_ct(b, a, a->used); + if (ret != MP_LT) + return WC_TEST_RET_ENC_EC(ret); +#endif + return 0; } #if !defined(NO_DH) || defined(HAVE_ECC) || !defined(WOLFSSL_RSA_VERIFY_ONLY) -static int mp_test_shbd(mp_int* a, mp_int* b, WC_RNG* rng) +static wc_test_ret_t mp_test_shbd(mp_int* a, mp_int* b, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int i, j, k; #ifndef WOLFSSL_SP_MATH @@ -42092,10 +52167,10 @@ #if defined(WOLFSSL_SP_MATH_ALL) || !defined(NO_DH) || defined(HAVE_ECC) || \ (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \ !defined(WOLFSSL_RSA_PUBLIC_ONLY)) -static int mp_test_div(mp_int* a, mp_int* d, mp_int* r, mp_int* rem, +static wc_test_ret_t mp_test_div(mp_int* a, mp_int* d, mp_int* r, mp_int* rem, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int i, j, k; mp_zero(a); @@ -42231,9 +52306,9 @@ #if defined(WOLFSSL_KEY_GEN) && (!defined(NO_DH) || !defined(NO_DSA)) && \ !defined(WC_NO_RNG) -static int mp_test_prime(mp_int* a, WC_RNG* rng) +static wc_test_ret_t mp_test_prime(mp_int* a, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int res; ret = mp_rand_prime(a, 1, rng, NULL); @@ -42335,10 +52410,10 @@ #endif #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && !defined(WC_RSA_BLINDING) -static int mp_test_lcm_gcd(mp_int* a, mp_int* b, mp_int* r, mp_int* exp, +static wc_test_ret_t mp_test_lcm_gcd(mp_int* a, mp_int* b, mp_int* r, mp_int* exp, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int i; WOLFSSL_SMALL_STACK_STATIC const int kat[][3] = { { 1, 1, 1 }, { 2, 1, 2 }, { 1, 2, 2 }, { 2, 4, 4 }, { 4, 2, 4 }, @@ -42421,9 +52496,9 @@ #if (!defined(WOLFSSL_SP_MATH) && !defined(USE_FAST_MATH)) || \ defined(WOLFSSL_SP_MATH_ALL) -static int mp_test_mod_2d(mp_int* a, mp_int* r, mp_int* t, WC_RNG* rng) +static wc_test_ret_t mp_test_mod_2d(mp_int* a, mp_int* r, mp_int* t, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int i; int j; @@ -42506,9 +52581,9 @@ #if defined(WOLFSSL_SP_MATH_ALL) || defined(OPENSSL_EXTRA) || \ (defined(HAVE_ECC) && defined(HAVE_COMP_KEY)) -static int mp_test_mod_d(mp_int* a, WC_RNG* rng) +static wc_test_ret_t mp_test_mod_d(mp_int* a, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; mp_digit r; #if defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_MATH) mp_digit rem; @@ -42555,10 +52630,10 @@ } #endif -static int mp_test_mul_sqr(mp_int* a, mp_int* b, mp_int* r1, mp_int* r2, +static wc_test_ret_t mp_test_mul_sqr(mp_int* a, mp_int* b, mp_int* r1, mp_int* r2, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; int i; for (i = 1; i < 16; i++) { @@ -42644,9 +52719,9 @@ #if !defined(NO_RSA) || defined(HAVE_ECC) || !defined(NO_DSA) || \ defined(OPENSSL_EXTRA) -static int mp_test_invmod(mp_int* a, mp_int* m, mp_int* r) +static wc_test_ret_t mp_test_invmod(mp_int* a, mp_int* m, mp_int* r) { - int ret; + wc_test_ret_t ret; mp_set(a, 0); mp_set(m, 1); @@ -42755,9 +52830,9 @@ #if !defined(NO_RSA) || !defined(NO_DSA) || !defined(NO_DH) || \ (defined(HAVE_ECC) && defined(HAVE_COMP_KEY)) || defined(OPENSSL_EXTRA) -static int mp_test_exptmod(mp_int* b, mp_int* e, mp_int* m, mp_int* r) +static wc_test_ret_t mp_test_exptmod(mp_int* b, mp_int* e, mp_int* m, mp_int* r) { - int ret; + wc_test_ret_t ret; mp_set(b, 0x2); mp_set(e, 0x3); @@ -42885,9 +52960,9 @@ #if defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_HAVE_SP_DH) || \ defined(HAVE_ECC) || (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) -static int mp_test_mont(mp_int* a, mp_int* m, mp_int* n, mp_int* r, WC_RNG* rng) +static wc_test_ret_t mp_test_mont(mp_int* a, mp_int* m, mp_int* n, mp_int* r, WC_RNG* rng) { - int ret; + wc_test_ret_t ret; mp_digit mp; static int exp[] = { 7, 8, 16, 27, 32, 64, 127, 128, 255, 256, @@ -42995,11 +53070,11 @@ } #endif -WOLFSSL_TEST_SUBROUTINE int mp_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mp_test(void) { WC_RNG rng; int rng_inited = 0; - int ret; + wc_test_ret_t ret; #if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) int i, j; #ifndef WOLFSSL_SP_MATH @@ -43007,6 +53082,7 @@ #endif mp_digit d = 0; #endif + #ifdef WOLFSSL_SMALL_STACK mp_int *a = (mp_int *)XMALLOC(sizeof(mp_int), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER), @@ -43029,6 +53105,7 @@ #else mp_int a[1], b[1], r1[1], r2[1], p[1]; #endif + WOLFSSL_ENTER("mp_test"); ret = mp_init_multi(a, b, r1, r2, NULL, NULL); if (ret != 0) @@ -43082,8 +53159,10 @@ ret = mp_mulmod(a, a, p, r2); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), done); - if (mp_cmp(r1, r2) != 0) + if (mp_cmp(r1, r2) != 0) { + WOLFSSL_MSG("Fail: mp_mulmod result does not match mp_sqrmod!"); ERROR_OUT(WC_TEST_RET_ENC_NC, done); + } #endif #if defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY) @@ -43244,7 +53323,9 @@ if ((ret = mp_test_set_is_bit(a)) != 0) goto done; #endif -#if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL) +#if defined(WOLFSSL_SP_MATH_ALL) || !defined(NO_DH) || defined(HAVE_ECC) || \ + (!defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY) && \ + !defined(WOLFSSL_RSA_PUBLIC_ONLY)) if ((ret = mp_test_div(a, b, r1, r2, &rng)) != 0) goto done; #endif @@ -43383,9 +53464,9 @@ static const unsigned char testOne[] = { 1 }; -static int GenerateNextP(mp_int* p1, mp_int* p2, int k) +static wc_test_ret_t GenerateNextP(mp_int* p1, mp_int* p2, int k) { - int ret; + wc_test_ret_t ret; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) mp_int *ki = (mp_int *)XMALLOC(sizeof(*ki), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -43399,7 +53480,7 @@ if (ret != 0) ret = WC_TEST_RET_ENC_EC(ret); if (ret == 0) { - ret = mp_set(ki, k); + ret = mp_set(ki, (mp_digit)k); if (ret != 0) ret = WC_TEST_RET_ENC_EC(ret); } @@ -43428,7 +53509,7 @@ } -static int GenerateP(mp_int* p1, mp_int* p2, mp_int* p3, +static wc_test_ret_t GenerateP(mp_int* p1, mp_int* p2, mp_int* p3, const pairs_t* ecPairs, int ecPairsSz, const int* k) { @@ -43437,7 +53518,8 @@ #else mp_int x[1], y[1]; #endif - int ret, i; + wc_test_ret_t ret; + int i; #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if (((x = (mp_int *)XMALLOC(sizeof(*x), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) || @@ -43453,7 +53535,7 @@ goto out; } for (i = 0; ret == 0 && i < ecPairsSz; i++) { - ret = mp_read_unsigned_bin(x, ecPairs[i].coeff, ecPairs[i].coeffSz); + ret = mp_read_unsigned_bin(x, ecPairs[i].coeff, (word32)ecPairs[i].coeffSz); if (ret != 0) { ret = WC_TEST_RET_ENC_EC(ret); break; @@ -43504,7 +53586,7 @@ return ret; } -WOLFSSL_TEST_SUBROUTINE int prime_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t prime_test(void) { #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) mp_int *n = (mp_int *)XMALLOC(sizeof *n, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER), @@ -43517,8 +53599,10 @@ p2[1], p3[1]; #endif - int ret, isPrime = 0; + wc_test_ret_t ret; + int isPrime = 0; WC_RNG rng; + WOLFSSL_ENTER("prime_test"); #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((n == NULL) || @@ -43657,9 +53741,9 @@ word32 outSz; } berDerTestData; -WOLFSSL_TEST_SUBROUTINE int berder_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t berder_test(void) { - int ret; + wc_test_ret_t ret; int i; word32 len = 0, l; byte out[32]; @@ -43704,6 +53788,7 @@ { good4_in, sizeof(good4_in), good4_out, sizeof(good4_out) }, { good5_in, sizeof(good5_in), good5_in , sizeof(good5_in ) }, }; + WOLFSSL_ENTER("berder_test"); for (i = 0; i < (int)(sizeof(testData) / sizeof(*testData)); i++) { ret = wc_BerToDer(testData[i].in, testData[i].inSz, NULL, &len); @@ -43775,14 +53860,15 @@ } #endif /* DEBUG_WOLFSSL */ -WOLFSSL_TEST_SUBROUTINE int logging_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t logging_test(void) { - int ret; + wc_test_ret_t ret; #ifdef DEBUG_WOLFSSL const char* msg = "Testing, testing. 1, 2, 3, 4 ..."; byte a[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; byte b[256]; int i; + WOLFSSL_ENTER("logging_test (debug)"); for (i = 0; i < (int)sizeof(b); i++) b[i] = i; @@ -43829,6 +53915,7 @@ (void)b; #else + WOLFSSL_ENTER("logging_test"); ret = wolfSSL_Debugging_ON(); if (ret != NOT_COMPILED_IN) return WC_TEST_RET_ENC_EC(ret); @@ -43841,9 +53928,9 @@ } #if defined(__INCLUDE_NUTTX_CONFIG_H) -WOLFSSL_TEST_SUBROUTINE int wolfcrypt_mutex_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t wolfcrypt_mutex_test(void) #else -WOLFSSL_TEST_SUBROUTINE int mutex_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t mutex_test(void) #endif { #ifdef WOLFSSL_PTHREADS @@ -43851,22 +53938,25 @@ #endif #if defined(WOLFSSL_PTHREADS) || (!defined(WOLFSSL_NO_MALLOC) && \ !defined(WOLFSSL_USER_MUTEX) && defined(WOLFSSL_STATIC_MEMORY)) - int ret; + wc_test_ret_t ret; #endif + #if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_USER_MUTEX) - #ifndef WOLFSSL_STATIC_MEMORY - wolfSSL_Mutex *mm = wc_InitAndAllocMutex(); - #else - wolfSSL_Mutex *mm = (wolfSSL_Mutex*) XMALLOC(sizeof(wolfSSL_Mutex), + #ifndef WOLFSSL_STATIC_MEMORY + wolfSSL_Mutex *mm = wc_InitAndAllocMutex(); + WOLFSSL_ENTER("[wolfcrypt_]mutex_test (1)"); + #else + wolfSSL_Mutex *mm = (wolfSSL_Mutex*) XMALLOC(sizeof(wolfSSL_Mutex), HEAP_HINT, DYNAMIC_TYPE_MUTEX); - if (mm != NULL) { - ret = wc_InitMutex(mm); - if (ret != 0) { - WOLFSSL_MSG("Init Mutex failed"); - XFREE(mm, HEAP_HINT, DYNAMIC_TYPE_MUTEX); - return WC_TEST_RET_ENC_EC(ret); + WOLFSSL_ENTER("[wolfcrypt_]mutex_test (2)"); + if (mm != NULL) { + ret = wc_InitMutex(mm); + if (ret != 0) { + WOLFSSL_MSG("Init Mutex failed"); + XFREE(mm, HEAP_HINT, DYNAMIC_TYPE_MUTEX); + return WC_TEST_RET_ENC_EC(ret); + } } - } #endif if (mm == NULL) return WC_TEST_RET_ENC_ERRNO; @@ -43913,9 +54003,9 @@ #if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_LINUXKM) && \ !defined(WOLFSSL_STATIC_MEMORY) -static int malloc_cnt = 0; -static int realloc_cnt = 0; -static int free_cnt = 0; +static wc_test_ret_t malloc_cnt = 0; +static wc_test_ret_t realloc_cnt = 0; +static wc_test_ret_t free_cnt = 0; #ifdef WOLFSSL_DEBUG_MEMORY static void *my_Malloc_cb(size_t size, const char* func, unsigned int line) @@ -43975,24 +54065,25 @@ } #endif /* !WOLFSSL_NO_MALLOC */ -WOLFSSL_TEST_SUBROUTINE int memcb_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t memcb_test(void) { - int ret = 0; -#if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_LINUXKM) && \ - !defined(WOLFSSL_STATIC_MEMORY) + wc_test_ret_t ret = 0; +#if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_NO_REALLOC) && \ + !defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_STATIC_MEMORY) byte* b = NULL; #endif wolfSSL_Malloc_cb mc; wolfSSL_Free_cb fc; wolfSSL_Realloc_cb rc; + WOLFSSL_ENTER("memcb_test"); /* Save existing memory callbacks */ ret = wolfSSL_GetAllocators(&mc, &fc, &rc); if (ret != 0) return WC_TEST_RET_ENC_EC(ret); -#if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_LINUXKM) && \ - !defined(WOLFSSL_STATIC_MEMORY) +#if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_NO_REALLOC) && \ + !defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_STATIC_MEMORY) /* test realloc */ b = (byte*)XREALLOC(b, 1024, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); @@ -44027,8 +54118,8 @@ ret = WC_TEST_RET_ENC_NC; #endif /* !WOLFSSL_NO_MALLOC */ -#if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_LINUXKM) && \ - !defined(WOLFSSL_STATIC_MEMORY) +#if !defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_NO_REALLOC) && \ + !defined(WOLFSSL_LINUXKM) && !defined(WOLFSSL_STATIC_MEMORY) exit_memcb: /* reset malloc/free/realloc counts */ @@ -44046,9 +54137,9 @@ #if defined(WOLFSSL_CAAM_BLOB) -WOLFSSL_TEST_SUBROUTINE int blob_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t blob_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; byte out[112]; byte blob[112]; word32 outSz; @@ -44070,7 +54161,7 @@ 0xf6,0x9f,0x24,0x45,0xdf,0x4f,0x9b,0x17, 0xad,0x2b,0x41,0x7b,0xe6,0x6c,0x37,0x10 }; - + WOLFSSL_ENTER("blob_test"); XMEMSET(blob, 0, sizeof(blob)); XMEMSET(out, 0, sizeof(out)); @@ -44133,9 +54224,9 @@ * ctx callback ctx * returen 0 on success, otherwise return negative */ -static int rsa_onlycb_test(myCryptoDevCtx *ctx) +static wc_test_ret_t rsa_onlycb_test(myCryptoDevCtx *ctx) { - int ret = 0; + wc_test_ret_t ret = 0; #if !defined(NO_RSA) #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -44295,9 +54386,9 @@ * ctx callback ctx * returen 0 on success, otherwise return negative */ -static int ecc_onlycb_test(myCryptoDevCtx *ctx) +static wc_test_ret_t ecc_onlycb_test(myCryptoDevCtx *ctx) { - int ret = 0; + wc_test_ret_t ret = 0; #if defined(HAVE_ECC) #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -44618,7 +54709,7 @@ return BAD_FUNC_ARG; #ifdef DEBUG_WOLFSSL - printf("CryptoDevCb: Algo Type %d\n", info->algo_type); + WOLFSSL_MSG_EX("CryptoDevCb: Algo Type %d\n", info->algo_type); #endif if (info->algo_type == WC_ALGO_TYPE_RNG) { @@ -44660,7 +54751,7 @@ } else if (info->algo_type == WC_ALGO_TYPE_PK) { #ifdef DEBUG_WOLFSSL - printf("CryptoDevCb: Pk Type %d\n", info->pk.type); + WOLFSSL_MSG_EX("CryptoDevCb: Pk Type %d\n", info->pk.type); #endif #ifndef NO_RSA @@ -44830,7 +54921,7 @@ info->pk.curve25519.private_key->devId = devIdArg; } #endif /* HAVE_CURVE25519 */ - #ifdef HAVE_ED25519 + #if defined(HAVE_ED25519) && defined(HAVE_ED25519_MAKE_KEY) if (info->pk.type == WC_PK_TYPE_ED25519_KEYGEN) { /* set devId to invalid, so software is used */ info->pk.ed25519kg.key->devId = INVALID_DEVID; @@ -45179,6 +55270,97 @@ } else #endif + #if defined(WOLFSSL_SHA3) && (!defined(HAVE_FIPS) || FIPS_VERSION_GE(6, 0)) + if (info->hash.type == WC_HASH_TYPE_SHA3_224) { + if (info->hash.sha3 == NULL) + return NOT_COMPILED_IN; + + /* set devId to invalid, so software is used */ + info->hash.sha3->devId = INVALID_DEVID; + + if (info->hash.in != NULL) { + ret = wc_Sha3_224_Update( + info->hash.sha3, + info->hash.in, + info->hash.inSz); + } + if (info->hash.digest != NULL) { + ret = wc_Sha3_224_Final( + info->hash.sha3, + info->hash.digest); + } + + /* reset devId */ + info->hash.sha3->devId = devIdArg; + } + else if (info->hash.type == WC_HASH_TYPE_SHA3_256) { + if (info->hash.sha3 == NULL) + return NOT_COMPILED_IN; + + /* set devId to invalid, so software is used */ + info->hash.sha3->devId = INVALID_DEVID; + + if (info->hash.in != NULL) { + ret = wc_Sha3_256_Update( + info->hash.sha3, + info->hash.in, + info->hash.inSz); + } + if (info->hash.digest != NULL) { + ret = wc_Sha3_256_Final( + info->hash.sha3, + info->hash.digest); + } + + /* reset devId */ + info->hash.sha3->devId = devIdArg; + } + else if (info->hash.type == WC_HASH_TYPE_SHA3_384) { + if (info->hash.sha3 == NULL) + return NOT_COMPILED_IN; + + /* set devId to invalid, so software is used */ + info->hash.sha3->devId = INVALID_DEVID; + + if (info->hash.in != NULL) { + ret = wc_Sha3_384_Update( + info->hash.sha3, + info->hash.in, + info->hash.inSz); + } + if (info->hash.digest != NULL) { + ret = wc_Sha3_384_Final( + info->hash.sha3, + info->hash.digest); + } + + /* reset devId */ + info->hash.sha3->devId = devIdArg; + } + else if (info->hash.type == WC_HASH_TYPE_SHA3_512) { + if (info->hash.sha3 == NULL) + return NOT_COMPILED_IN; + + /* set devId to invalid, so software is used */ + info->hash.sha3->devId = INVALID_DEVID; + + if (info->hash.in != NULL) { + ret = wc_Sha3_512_Update( + info->hash.sha3, + info->hash.in, + info->hash.inSz); + } + if (info->hash.digest != NULL) { + ret = wc_Sha3_512_Final( + info->hash.sha3, + info->hash.digest); + } + + /* reset devId */ + info->hash.sha3->devId = devIdArg; + } + else + #endif { } } @@ -45191,13 +55373,13 @@ /* set devId to invalid, so software is used */ info->hmac.hmac->devId = INVALID_DEVID; - if (info->hash.in != NULL) { + if (info->hmac.in != NULL) { ret = wc_HmacUpdate( info->hmac.hmac, info->hmac.in, info->hmac.inSz); } - else if (info->hash.digest != NULL) { + else if (info->hmac.digest != NULL) { ret = wc_HmacFinal( info->hmac.hmac, info->hmac.digest); @@ -45207,6 +55389,49 @@ info->hmac.hmac->devId = devIdArg; } #endif +#if defined(WOLFSSL_CMAC) && !defined(NO_AES) + else if (info->algo_type == WC_ALGO_TYPE_CMAC) { + if (info->cmac.cmac == NULL) { + return NOT_COMPILED_IN; + } + + /* set devId to invalid so software is used */ + info->cmac.cmac->devId = INVALID_DEVID; + + /* Handle one-shot cases */ + if (info->cmac.key != NULL && info->cmac.in != NULL + && info->cmac.out != NULL) { + ret = wc_AesCmacGenerate(info->cmac.out, + info->cmac.outSz, + info->cmac.in, + info->cmac.inSz, + info->cmac.key, + info->cmac.keySz); + /* Sequentially handle incremental cases */ + } else { + if (info->cmac.key != NULL) { + ret = wc_InitCmac(info->cmac.cmac, + info->cmac.key, + info->cmac.keySz, + info->cmac.type, + NULL); + } + if ((ret == 0) && (info->cmac.in != NULL)) { + ret = wc_CmacUpdate(info->cmac.cmac, + info->cmac.in, + info->cmac.inSz); + } + if ((ret ==0) && (info->cmac.out != NULL)) { + ret = wc_CmacFinal(info->cmac.cmac, + info->cmac.out, + info->cmac.outSz); + } + } + + /* reset devId */ + info->cmac.cmac->devId = devIdArg; + } +#endif /* WOLFSSL_CMAC && !(NO_AES) && WOLFSSL_AES_DIRECT */ (void)devIdArg; (void)myCtx; @@ -45241,11 +55466,12 @@ #endif /* WOLF_CRYPTO_CB_FIND */ -WOLFSSL_TEST_SUBROUTINE int cryptocb_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cryptocb_test(void) { - int ret = 0; + wc_test_ret_t ret = 0; int origDevId = devId; myCryptoDevCtx myCtx; + WOLFSSL_ENTER("cryptocb_test"); /* example data for callback */ myCtx.exampleVar = 1; @@ -45285,8 +55511,10 @@ PRIVATE_KEY_LOCK(); #endif #ifdef HAVE_ED25519 + PRIVATE_KEY_UNLOCK(); if (ret == 0) ret = ed25519_test(); + PRIVATE_KEY_LOCK(); #endif #ifdef HAVE_CURVE25519 if (ret == 0) @@ -45301,6 +55529,10 @@ if (ret == 0) ret = aes_test(); #endif + #ifdef WOLFSSL_AES_XTS + if (ret == 0) + ret = aes_xts_test(); + #endif #if defined(HAVE_AESCCM) && defined(WOLFSSL_AES_128) if (ret == 0) ret = aesccm_test(); @@ -45325,6 +55557,10 @@ #ifdef WOLFSSL_SHA512 if (ret == 0) ret = sha512_test(); +#ifdef WOLFSSL_SHA3 + if (ret == 0) + ret = sha3_test(); +#endif #endif #ifndef NO_HMAC #ifndef NO_SHA @@ -45335,11 +55571,17 @@ if (ret == 0) ret = hmac_sha256_test(); #endif + #ifdef WOLFSSL_SHA3 + if (ret == 0) + ret = hmac_sha3_test(); + #endif #endif #ifndef NO_PWDBASED - #if defined(HAVE_PBKDF2) && !defined(NO_SHA256) + #if defined(HAVE_PBKDF2) && !defined(NO_SHA256) && !defined(NO_HMAC) + PRIVATE_KEY_UNLOCK(); if (ret == 0) ret = pbkdf2_test(); + PRIVATE_KEY_LOCK(); #endif #endif #if defined(WOLFSSL_CMAC) && !defined(NO_AES) @@ -45355,9 +55597,9 @@ #endif /* WOLF_CRYPTO_CB */ #ifdef WOLFSSL_CERT_PIV -WOLFSSL_TEST_SUBROUTINE int certpiv_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t certpiv_test(void) { - int ret; + wc_test_ret_t ret; wc_CertPIV piv; /* Template for Identiv PIV cert, nonce and signature */ @@ -45371,7 +55613,7 @@ 0x0B, 0x01, 0x00, /* Nonce */ 0x0C, 0x01, 0x00, /* Signed Nonce */ }; - /* PIV certificate data including certificate, info and error dectection. */ + /* PIV certificate data including certificate, info and error detection. */ WOLFSSL_SMALL_STACK_STATIC const byte pivCert[] = { 0x53, 0x09, /* NIST PIV Cert */ 0x70, 0x02, /* Certificate */ @@ -45379,6 +55621,7 @@ 0x71, 0x01, 0x04, /* Cert Info */ 0xFE, 0x00, /* Error Detection */ }; + WOLFSSL_ENTER("certpiv_test"); XMEMSET(&piv, 0, sizeof(piv)); /* Test with Identiv 0x0A, 0x0B and 0x0C markers */ @@ -45444,10 +55687,11 @@ return 99; } -WOLFSSL_TEST_SUBROUTINE int time_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t time_test(void) { time_t t; - int ret; + wc_test_ret_t ret; + WOLFSSL_ENTER("time_test"); ret = wc_SetTimeCb(time_cb); if (ret != 0) @@ -45486,7 +55730,7 @@ #define AES_SIV_TEST_VECTORS 7 -WOLFSSL_TEST_SUBROUTINE int aes_siv_test(void) +WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_siv_test(void) { /* These test vectors come from chrony 4.1's SIV unit tests. */ WOLFSSL_SMALL_STACK_STATIC const AesSivTestVector testVectors[AES_SIV_TEST_VECTORS] = { @@ -45570,7 +55814,8 @@ byte computedCiphertext[82]; byte computedPlaintext[82]; byte siv[AES_BLOCK_SIZE]; - int ret = 0; + wc_test_ret_t ret = 0; + WOLFSSL_ENTER("aes_siv_test"); for (i = 0; i < AES_SIV_TEST_VECTORS; ++i) { ret = wc_AesSivEncrypt(testVectors[i].key, testVectors[i].keySz, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/test/test.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/test/test.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/test/test.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/test/test.h 2024-08-03 07:30:01.000000000 +0000 @@ -23,19 +23,28 @@ #ifndef WOLFCRYPT_TEST_H #define WOLFCRYPT_TEST_H +#include #ifdef __cplusplus extern "C" { #endif +#ifdef WC_TEST_RET_CUSTOM_TYPE + typedef WC_TEST_RET_CUSTOM_TYPE wc_test_ret_t; +#else + typedef sword32 wc_test_ret_t; +#endif + +#include + #ifdef HAVE_STACK_SIZE THREAD_RETURN WOLFSSL_THREAD wolfcrypt_test(void* args); #else -int wolfcrypt_test(void* args); +wc_test_ret_t wolfcrypt_test(void* args); #endif #ifndef NO_MAIN_DRIVER -int wolfcrypt_test_main(int argc, char** argv); +wc_test_ret_t wolfcrypt_test_main(int argc, char** argv); #endif #if defined(WOLFSSL_ESPIDF) || defined(_WIN32_WCE) @@ -44,13 +53,13 @@ #ifndef WC_TEST_RET_HAVE_CUSTOM_MACROS -#define WC_TEST_RET_TAG_NC 0 -#define WC_TEST_RET_TAG_EC 1 -#define WC_TEST_RET_TAG_ERRNO 2 -#define WC_TEST_RET_TAG_I 3 +#define WC_TEST_RET_TAG_NC 0L +#define WC_TEST_RET_TAG_EC 1L +#define WC_TEST_RET_TAG_ERRNO 2L +#define WC_TEST_RET_TAG_I 3L #define WC_TEST_RET_ENC(line, i, tag) \ - (-((line) + ((int)((unsigned)(i) & 0x7ff) * 100000) + ((tag) << 29))) + ((wc_test_ret_t)(-((wc_test_ret_t)(line) + ((wc_test_ret_t)((word32)(i) & 0x7ffL) * 100000L) + ((wc_test_ret_t)(tag) << 29L)))) #ifndef WC_TEST_RET_LN #define WC_TEST_RET_LN __LINE__ @@ -74,16 +83,16 @@ #define WC_TEST_RET_ENC_ERRNO WC_TEST_RET_ENC_NC #endif -#define WC_TEST_RET_DEC_TAG(x) ((-(x)) >> 29) +#define WC_TEST_RET_DEC_TAG(x) ((-(x)) >> 29L) /* decode line number */ -#define WC_TEST_RET_DEC_LN(x) (((-(x)) & ~(3 << 29)) % 100000) +#define WC_TEST_RET_DEC_LN(x) ((int)(((-(x)) & ~(3L << 29L)) % 100000L)) /* decode integer or errno */ -#define WC_TEST_RET_DEC_I(x) (((-(x)) & ~(3 << 29)) / 100000) +#define WC_TEST_RET_DEC_I(x) ((int)((((-(x)) & ~(3L << 29L)) / 100000L))) /* decode error code */ -#define WC_TEST_RET_DEC_EC(x) (-WC_TEST_RET_DEC_I(x)) +#define WC_TEST_RET_DEC_EC(x) ((int)(-WC_TEST_RET_DEC_I(x))) #endif /* !WC_TEST_RET_HAVE_CUSTOM_MACROS */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/Makefile.am mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/Makefile.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/Makefile.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/Makefile.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -AM_CFLAGS=-I m4 - -#add in wolfssl directory -AM_CPPFLAGS+=-I$(abs_srcdir)/../../ -I$(srcdir)/include/ -lib_LTLIBRARIES = lib/libusercrypto.la -lib_libusercrypto_la_CPPFLAGS = $(AM_CPPFLAGS) -lib_libusercrypto_la_LDFLAGS = $(AM_LDFLAGS) -lib_libusercrypto_la_SOURCES = src/rsa.c -include_HEADERS = include/user_rsa.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/README.txt mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/README.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/README.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/README.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* - Created to use intel's IPP see their license for linking to intel's IPP library - */ - - -##BUILDING ON 64BIT MAC OSX -Tested and developed on MAC OSX linking to IPP v9.0 - -for me exporting the IPP library was needed. As an example it was -export DYLD_LIBRARY_PATH="/opt/intel/ipp/lib" - -first go to the root wolfssl dir and run ./autogen.sh && ./configure it with desired settings then make. This is to set up the define options and wolfssl library for the user crypto to link to. - -Then go to the wolfssl/user-crypto directory and run ./autogen.sh && ./configure then make make install this creates a usercrypto library to use - -Finally go back to the root wolfssl directory and follow these build instructions - -building wolfSSL add CPPFLAGS=-I/opt/intel/ipp/include for finding the IPP include files -An example build would be -./configure --with-user-crypto CPPFLAGS=-I/opt/intel/ipp/include --enable-lighty - - -##BUILDING IN 32BIT UBUNTU -Tested on UBUNTU 32 bit linking to IPP v9.0 - -for me exporting the IPP library. As an example it was -export LD_LIBRARY_PATH="/opt/intel/ipp/lib/ia32_lin/:$LD_LIBRARY_PATH" - -first go to the root wolfssl dir and configure it with desired settings and make install. This is to set up the define options and wolfssl library for the user crypto to link to. - -For me on Ubuntu the IPP libraries had been installed into /opt/intel/ipp/lib/ia32_lin/ so the ./configure LDFLAGS=-L/opt/intel/ipp/lib/ia32_lin was needed to be looking at that directory. -Run make && make install from the directory wolfssl_root/wolfssl/user-crypto/ this creates a usercrypto library to use - -Finally go back to the root wolfssl directory and follow these build instructions - -building wolfSSL add CPPFLAGS=-I/opt/intel/ipp/include for finding the IPP include files - -./configure --with-user-crypto=root_wolfssl/wolfssl/user-crypto CPPFLAGS=-I/opt/intel/ipp/include (plus any desired additional flags) - - -##THINGS TO CHECK FOR IF NOT ABLE TO LINK WITH USERCRYPTO LIB -Check that the path has been exported for the IPP library. If usercrypto is unable to use the function to init an RSA key then the link to it will fail in configure. Check for this by $DYLD_LIBRARY_PATH on mac or $LD_LIBRARY_PATH on ubuntu. If the directory for the Intel IPP libraries are not displayed than use "export DYLD_LIBRARY_PATH=path_to_ipp_libraries:$DYLD_LIBRARY_PATH". - - -##CREATING OWN RSA CRYPTO PLUGIN - -It is required to have a header file named user_rsa.h. This is what is looked for by wolfssl/wolfcrypt/rsa.h and should contain the user defined rsa key struct. - -It is required to have a library called usercrypto. This is linked to when configuring wolfSSL with the option --with-user-crypto - -It is required when compiled with RSA cert generation to have key struct elements named n and e containing the corresponding big numbers. And the three helper functions to work with the big numbers. These functions are called by wolfcrypt/src/asn.c when working with certificates. -To view the needed functions look at wolfssl/wolfcrypt/rsa.h they will be extern functions surrounded by HAVE_USER_RSA define. -Cert Generation for other sign and verify such as ECC are not yet supported. - -When building with openssl compatibility layer extra developent needs to be done, having the two functions SetRsaExernal and SetRsaInternal - -wolfSSL does not take responsibility for the strength of security of third party cryptography libraries plugged in by the user. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/autogen.sh mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/autogen.sh --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/autogen.sh 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/autogen.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -#!/bin/sh -# -# Create configure and makefile stuff... -# - -# Git hooks should come before autoreconf. -if test -d .git; then - if ! test -d .git/hooks; then - mkdir .git/hooks - fi - ln -s -f ../../pre-commit.sh .git/hooks/pre-commit - ln -s -f ../../pre-push.sh .git/hooks/pre-push -fi - -# If this is a source checkout then call autoreconf with error as well -if test -d .git; then - WARNINGS="all,error" -else - WARNINGS="all" -fi - -autoreconf --install --force --verbose - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/configure.ac mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/configure.ac --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/configure.ac 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/configure.ac 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ([2.63]) -AC_INIT([usercypto], [0.1], []) -AC_CONFIG_SRCDIR([src/rsa.c]) - -AM_INIT_AUTOMAKE([1.11 -Wall -Werror -Wno-portability foreign tar-ustar subdir-objects no-define color-tests]) - -LT_PREREQ([2.2]) -LT_INIT([disable-static]) -LT_LANG([C++]) -LT_LANG([C]) - -# Checks for programs. -AC_PROG_CC -AC_CONFIG_MACRO_DIR([m4]) - -# Checks for libraries. -AM_LDFLAGS=$LDFLAGS -LDFLAGS="$LDFLAGS -L/opt/intel/ipp/lib -lippcp -lippcore" - -# Path to find wolfssl/options and other includes -AM_CPPFLAGS=$CPPFLAGS -CPPFLAGS="$CPPFLAGS -I../../ -I/opt/intel/ipp/include" -AC_CHECK_LIB([ippcore], [ippGetStatusString], [], [AC_MSG_ERROR([ippcore library needed ./configure LDFLAGS=/path/to/ipp/lib])]) -AC_CHECK_LIB([ippcp], [ippsRSA_InitPublicKey], [], [AC_MSG_ERROR([ippcp library needed ./configure LDFLAGS=/path/to/ipp/lib])]) - -# check headers -AC_CHECK_HEADER([ippcp.h], [], [AC_MSG_ERROR([ippcp.h not found ./configure CPPFLAGS=-I/ipp/headers])]) -AC_CHECK_HEADER([ipp.h], [], [AC_MSG_ERROR([ipp.h not found ./configure CPPFLAGS=-I/ipp/headers])]) - -LDFLAGS=$AM_LDFLAGS -CPPFLAGS=$AM_CPPFLAGS - -AM_LDFLAGS="-L/opt/intel/ipp/lib -lippcp -lippcore" -AM_CPPFLAGS="-I/opt/intel/ipp/include" - -AC_SUBST([AM_CPPFLAGS]) -AC_SUBST([AM_LDFLAGS]) -AC_C_INLINE - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include/user_rsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include/user_rsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include/user_rsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include/user_rsa.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,137 +0,0 @@ -/* user_rsa.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -/* - Created to use intel's IPP see their license for linking to intel's IPP library - */ - -#ifndef USER_WOLF_CRYPT_RSA_H -#define USER_WOLF_CRYPT_RSA_H - -#include - -#ifndef NO_RSA - -#include -#include - -/* intels crypto */ -#include -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/* needed for WOLFSSL_RSA type but use macro guard against redefine */ -#if defined(OPENSSL_EXTRA) && !defined(WOLFSSL_TYPES_DEFINED) \ - && !defined(WOLFSSL_RSA_TYPE_DEFINED) - struct WOLFSSL_RSA; - typedef struct WOLFSSL_RSA WOLFSSL_RSA; - #define WOLFSSL_RSA_TYPE_DEFINED -#endif - - -enum { - RSA_PUBLIC = 0, - RSA_PRIVATE = 1, -}; - -/* RSA */ -struct RsaKey { - IppsBigNumState* n; - IppsBigNumState* e; - IppsBigNumState* dipp; - IppsBigNumState* pipp; - IppsBigNumState* qipp; - IppsBigNumState* dPipp; - IppsBigNumState* dQipp; - IppsBigNumState* uipp; - int nSz, eSz, dSz; - IppsRSAPublicKeyState* pPub; - IppsRSAPrivateKeyState* pPrv; - word32 prvSz; /* size of private key */ - word32 sz; /* size of signature */ - int type; /* public or private */ - void* heap; /* for user memory overrides */ -}; - -#ifndef WC_RSAKEY_TYPE_DEFINED - typedef struct RsaKey RsaKey; - #define WC_RSAKEY_TYPE_DEFINED -#endif - -WOLFSSL_API int wc_InitRsaKey(RsaKey* key, void*); -WOLFSSL_API int wc_InitRsaKey_ex(RsaKey* key, void* heap, int devId); -WOLFSSL_API int wc_FreeRsaKey(RsaKey* key); - -WOLFSSL_API int wc_RsaPublicEncrypt(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key, WC_RNG* rng); -WOLFSSL_API int wc_RsaPrivateDecryptInline(byte* in, word32 inLen, byte** out, - RsaKey* key); -WOLFSSL_API int wc_RsaPrivateDecrypt(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key); -WOLFSSL_API int wc_RsaSSL_Sign(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key, WC_RNG* rng); -WOLFSSL_API int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out, - RsaKey* key); -WOLFSSL_API int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out, - word32 outLen, RsaKey* key); -WOLFSSL_API int wc_RsaEncryptSize(RsaKey* key); - -WOLFSSL_API int wc_RsaPrivateKeyDecode(const byte* input, word32* inOutIdx, - RsaKey*, word32); -WOLFSSL_API int wc_RsaPublicKeyDecode_ex(const byte* input, word32* inOutIdx, - word32 inSz, const byte** n, word32* nSz, const byte** e, word32* eSz); -WOLFSSL_API int wc_RsaPublicKeyDecode(const byte* input, word32* inOutIdx, - RsaKey*, word32); -WOLFSSL_API int wc_RsaPublicKeyDecodeRaw(const byte* n, word32 nSz, - const byte* e, word32 eSz, RsaKey* key); -WOLFSSL_API int wc_RsaKeyToDer(RsaKey*, byte* output, word32 inLen); -WOLFSSL_API int wc_RsaKeyToPublicDer(RsaKey*, byte* output, word32 inLen); -#ifdef WOLFSSL_KEY_GEN - WOLFSSL_API int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng); -#endif -WOLFSSL_API int wc_RsaFlattenPublicKey(RsaKey*, byte*, word32*, byte*, - word32*); -WOLFSSL_API int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng); - - -#if defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) - /* abstracted BN operations with RSA key */ - WOLFSSL_API int wc_Rsa_leading_bit(void* BN); - WOLFSSL_API int wc_Rsa_unsigned_bin_size(void* BN); - - /* return MP_OKAY on success */ - WOLFSSL_API int wc_Rsa_to_unsigned_bin(void* BN, byte* in, int inLen); -#endif - -#ifdef OPENSSL_EXTRA /* abstracted functions to deal with rsa key */ - WOLFSSL_API int SetRsaExternal(WOLFSSL_RSA* rsa); - WOLFSSL_API int SetRsaInternal(WOLFSSL_RSA* rsa); -#endif -#ifdef __cplusplus - } /* extern "C" */ -#endif - -#endif /* NO_RSA */ -#endif /* USER_WOLF_CRYPT_RSA_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/include.am 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - -if BUILD_FAST_RSA -include_HEADERS += wolfcrypt/user-crypto/include/user_rsa.h -endif - -# user crypto plug in example -EXTRA_DIST+= wolfcrypt/user-crypto/configure.ac -EXTRA_DIST+= wolfcrypt/user-crypto/autogen.sh -EXTRA_DIST+= wolfcrypt/user-crypto/include/user_rsa.h -EXTRA_DIST+= wolfcrypt/user-crypto/src/rsa.c -EXTRA_DIST+= wolfcrypt/user-crypto/lib/.gitkeep -EXTRA_DIST+= wolfcrypt/user-crypto/README.txt -EXTRA_DIST+= wolfcrypt/user-crypto/Makefile.am diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/src/rsa.c mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/src/rsa.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/src/rsa.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfcrypt/user-crypto/src/rsa.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,2797 +0,0 @@ -/* rsa.c - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - - -#ifdef HAVE_CONFIG_H /* configure options when using autoconf */ - #include -#endif - -#include -#include - -#ifndef NO_RSA - -#define USER_CRYPTO_ERROR -101 - -#ifdef OPENSSL_EXTRA - #include /* include for openssl compatibility */ - #include -#endif -#include "user_rsa.h" - -#ifdef DEBUG_WOLFSSL /* debug done without variadric to allow older compilers */ - #include - #define USER_DEBUG(x) printf x -#else - #define USER_DEBUG(x) -#endif - -#define ASN_INTEGER 0x02 -#define ASN_BIT_STRING 0x03 -#define ASN_TAG_NULL 0x05 -#define ASN_OBJECT_ID 0x06 - - -/* Make sure compiler doesn't skip -- used from wolfSSL */ -static inline void ForceZero(const void* mem, word32 len) -{ - volatile byte* z = (volatile byte*)mem; - - while (len--) *z++ = 0; -} - -enum { - RSA_PUBLIC_ENCRYPT = 0, - RSA_PUBLIC_DECRYPT = 1, - RSA_PRIVATE_ENCRYPT = 2, - RSA_PRIVATE_DECRYPT = 3, - - RSA_BLOCK_TYPE_1 = 1, - RSA_BLOCK_TYPE_2 = 2, - - RSA_MIN_SIZE = 512, - RSA_MAX_SIZE = 4096, /* max allowed in IPP library */ - - RSA_MIN_PAD_SZ = 11 /* separator + 0 + pad value + 8 pads */ -}; - - -int wc_InitRsaKey_ex(RsaKey* key, void* heap, int devId) -{ - - USER_DEBUG(("Entering wc_InitRsaKey\n")); - - if (key == NULL) - return USER_CRYPTO_ERROR; - - /* set full struct as 0 */ - ForceZero(key, sizeof(RsaKey)); - - USER_DEBUG(("\tExit wc_InitRsaKey\n")); - - (void)devId; - (void)heap; - return 0; -} - -int wc_InitRsaKey(RsaKey* key, void* heap) -{ - return wc_InitRsaKey_ex(key, heap, INVALID_DEVID); -} - - -/* three functions needed for cert and key gen */ -#if defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) -/* return 1 if there is a leading bit*/ -int wc_Rsa_leading_bit(void* bn) -{ - int ret = 0; - int dataSz; - Ipp32u* data; - Ipp32u q; - int qSz = sizeof(Ipp32u); - - if (ippsExtGet_BN(NULL, &dataSz, NULL, bn) != ippStsNoErr) { - USER_DEBUG(("ippsExtGet_BN Rsa leading bit error\n")); - return USER_CRYPTO_ERROR; - } - - /* convert from size in binary to Ipp32u */ - dataSz = dataSz / 32 + ((dataSz % 32)? 1 : 0); - data = (Ipp32u*)XMALLOC(dataSz * sizeof(Ipp32u), NULL, - DYNAMIC_TYPE_USER_CRYPTO); - if (data == NULL) { - USER_DEBUG(("Rsa leading bit memory error\n")); - return 0; - } - - /* extract value from BN */ - if (ippsExtGet_BN(NULL, NULL, data, bn) != ippStsNoErr) { - USER_DEBUG(("Rsa leading bit error\n")); - XFREE(data, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return 0; - } - - /* use method like what's used in wolfssl tfm.c */ - q = data[dataSz - 1]; - - ret = 0; - while (qSz > 0) { - if (q != 0) - ret = (q & 0x80) != 0; - q >>= 8; - qSz--; - } - - XFREE(data, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - return ret; -} - - -/* get the size in bytes of BN */ -int wc_Rsa_unsigned_bin_size(void* bn) -{ - int ret = 0; - if (ippsExtGet_BN(NULL, &ret, NULL, bn) != ippStsNoErr) { - USER_DEBUG(("Rsa unsigned bin size error\n")); - return USER_CRYPTO_ERROR; - } - return (ret / 8) + ((ret % 8)? 1: 0); /* size in bytes */ -} - -#ifndef MP_OKAY -#define MP_OKAY 0 -#endif - -/* extract the bn value to a unsigned byte array and return MP_OKAY on success */ -int wc_Rsa_to_unsigned_bin(void* bn, byte* in, int inLen) -{ - if (ippsGetOctString_BN((Ipp8u*)in, inLen, bn) != ippStsNoErr) { - USER_DEBUG(("Rsa to unsigned bin error\n")); - return USER_CRYPTO_ERROR; - } - return MP_OKAY; -} -#endif /* WOLFSSL_CERT_GEN || WOLFSSL_KEY_GEN || OPENSSL_EXTRA */ - - -#ifdef OPENSSL_EXTRA /* functions needed for openssl compatibility layer */ -static int SetIndividualExternal(WOLFSSL_BIGNUM** bn, IppsBigNumState* in) -{ - IppStatus ret; - byte* data; - int sz; - - USER_DEBUG(("Entering SetIndividualExternal\n")); - - if (bn == NULL || in == NULL) { - USER_DEBUG(("inputs NULL error\n")); - return USER_CRYPTO_ERROR; - } - - if (*bn == NULL) { - *bn = wolfSSL_BN_new(); - if (*bn == NULL) { - USER_DEBUG(("SetIndividualExternal alloc failed\n")); - return USER_CRYPTO_ERROR; - } - } - - /* get size of array needed and extract oct array of data */ - ret = ippsGetSize_BN(in, &sz); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - data = (byte*)XMALLOC(sz, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (data == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsGetOctString_BN(data, sz, in); - if (ret != ippStsNoErr) { - XFREE(data, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return USER_CRYPTO_ERROR; - } - - /* store the data into a wolfSSL Big Number */ - *bn = wolfSSL_BN_bin2bn(data, sz, *bn); - - XFREE(data, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - return 0; -} - - -static int SetIndividualInternal(WOLFSSL_BIGNUM* bn, IppsBigNumState** mpi) -{ - int length, ctxSz, sz; - IppStatus ret; - Ipp8u* data; - - USER_DEBUG(("Entering SetIndividualInternal\n")); - - if (bn == NULL || bn->internal == NULL) { - USER_DEBUG(("bn NULL error\n")); - return USER_CRYPTO_ERROR; - } - - length = wolfSSL_BN_num_bytes(bn); - - /* if not IPP BN then create one */ - if (*mpi == NULL) { - ret = ippsBigNumGetSize(length, &ctxSz); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - *mpi = (IppsBigNumState*)XMALLOC(ctxSz, 0, DYNAMIC_TYPE_USER_CRYPTO); - if (*mpi == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsBigNumInit(length, *mpi); - if (ret != ippStsNoErr) { - XFREE(*mpi, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return USER_CRYPTO_ERROR; - } - - } - - /* get the size of array needed and check IPP BigNum */ - if (ippsGetSize_BN(*mpi, &sz) != ippStsNoErr) - return USER_CRYPTO_ERROR; - - if (sz < length) { - USER_DEBUG(("big num size is too small\n")); - return USER_CRYPTO_ERROR; - } - - data = (Ipp8u*)XMALLOC(length, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (data == NULL) - return USER_CRYPTO_ERROR; - - /* extract the wolfSSL BigNum and store it into IPP BigNum */ - if (wolfSSL_BN_bn2bin(bn, data) < 0) { - XFREE(data, NULL, DYNAMIC_TYPE_USER_CRYPTO); - USER_DEBUG(("error in getting bin from wolfssl bn\n")); - return USER_CRYPTO_ERROR; - } - - ret = ippsSetOctString_BN(data, length, *mpi); - if (ret != ippStsNoErr) { - XFREE(data, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return USER_CRYPTO_ERROR; - } - - XFREE(data, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - return 0; -} - - -/* WolfSSL -> OpenSSL */ -int SetRsaExternal(WOLFSSL_RSA* rsa) -{ - RsaKey* key; - USER_DEBUG(("Entering SetRsaExternal\n")); - - if (rsa == NULL || rsa->internal == NULL) { - USER_DEBUG(("rsa key NULL error\n")); - return USER_CRYPTO_ERROR; - } - - key = (RsaKey*)rsa->internal; - - if (SetIndividualExternal(&rsa->n, key->n) != 0) { - USER_DEBUG(("rsa n key error\n")); - return USER_CRYPTO_ERROR; - } - - if (SetIndividualExternal(&rsa->e, key->e) != 0) { - USER_DEBUG(("rsa e key error\n")); - return USER_CRYPTO_ERROR; - } - - if (key->type == RSA_PRIVATE) { - if (SetIndividualExternal(&rsa->d, key->dipp) != 0) { - USER_DEBUG(("rsa d key error\n")); - return USER_CRYPTO_ERROR; - } - - if (SetIndividualExternal(&rsa->p, key->pipp) != 0) { - USER_DEBUG(("rsa p key error\n")); - return USER_CRYPTO_ERROR; - } - - if (SetIndividualExternal(&rsa->q, key->qipp) != 0) { - USER_DEBUG(("rsa q key error\n")); - return USER_CRYPTO_ERROR; - } - - if (SetIndividualExternal(&rsa->dmp1, key->dPipp) != 0) { - USER_DEBUG(("rsa dP key error\n")); - return USER_CRYPTO_ERROR; - } - - if (SetIndividualExternal(&rsa->dmq1, key->dQipp) != 0) { - USER_DEBUG(("rsa dQ key error\n")); - return USER_CRYPTO_ERROR; - } - - if (SetIndividualExternal(&rsa->iqmp, key->uipp) != 0) { - USER_DEBUG(("rsa u key error\n")); - return USER_CRYPTO_ERROR; - } - } - - rsa->exSet = 1; - - /* SSL_SUCCESS */ - return 1; -} - - -/* Openssl -> WolfSSL */ -int SetRsaInternal(WOLFSSL_RSA* rsa) -{ - int ctxSz, pSz, qSz; - IppStatus ret; - RsaKey* key; - USER_DEBUG(("Entering SetRsaInternal\n")); - - if (rsa == NULL || rsa->internal == NULL) { - USER_DEBUG(("rsa key NULL error\n")); - return USER_CRYPTO_ERROR; - } - - key = (RsaKey*)rsa->internal; - - if (SetIndividualInternal(rsa->n, &key->n) != 0) { - USER_DEBUG(("rsa n key error\n")); - return USER_CRYPTO_ERROR; - } - - if (SetIndividualInternal(rsa->e, &key->e) != 0) { - USER_DEBUG(("rsa e key error\n")); - return USER_CRYPTO_ERROR; - } - - /* public key */ - key->type = RSA_PUBLIC; - - if (rsa->d != NULL) { - if (SetIndividualInternal(rsa->d, &key->dipp) != 0) { - USER_DEBUG(("rsa d key error\n")); - return USER_CRYPTO_ERROR; - } - - /* private key */ - key->type = RSA_PRIVATE; - } - - if (rsa->p != NULL && - SetIndividualInternal(rsa->p, &key->pipp) != 0) { - USER_DEBUG(("rsa p key error\n")); - return USER_CRYPTO_ERROR; - } - - if (rsa->q != NULL && - SetIndividualInternal(rsa->q, &key->qipp) != 0) { - USER_DEBUG(("rsa q key error\n")); - return USER_CRYPTO_ERROR; - } - - if (rsa->dmp1 != NULL && - SetIndividualInternal(rsa->dmp1, &key->dPipp) != 0) { - USER_DEBUG(("rsa dP key error\n")); - return USER_CRYPTO_ERROR; - } - - if (rsa->dmq1 != NULL && - SetIndividualInternal(rsa->dmq1, &key->dQipp) != 0) { - USER_DEBUG(("rsa dQ key error\n")); - return USER_CRYPTO_ERROR; - } - - if (rsa->iqmp != NULL && - SetIndividualInternal(rsa->iqmp, &key->uipp) != 0) { - USER_DEBUG(("rsa u key error\n")); - return USER_CRYPTO_ERROR; - } - - rsa->inSet = 1; - - /* get sizes of IPP BN key states created from input */ - ret = ippsGetSize_BN(key->n, &key->nSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsGetSize_BN(key->e, &key->eSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->sz = key->nSz; /* set modulus size */ - - /* convert to size in bits */ - key->nSz = key->nSz * 8; - key->eSz = key->eSz * 8; - - /* set up public key state */ - ret = ippsRSA_GetSizePublicKey(key->nSz, key->eSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->pPub = (IppsRSAPublicKeyState*)XMALLOC(ctxSz, NULL, - DYNAMIC_TYPE_USER_CRYPTO); - if (key->pPub == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsRSA_InitPublicKey(key->nSz, key->eSz, key->pPub, ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_InitPublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsRSA_SetPublicKey(key->n, key->e, key->pPub); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_SetPublicKey error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - if (key->pipp != NULL && key->qipp != NULL && key->dipp != NULL && - key->dPipp != NULL && key->dQipp != NULL && key->uipp != NULL) { - /* get bn sizes needed for private key set up */ - ret = ippsGetSize_BN(key->pipp, &pSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsGetSize_BN(key->qipp, &qSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - /* store sizes needed for creating tmp private keys */ - ret = ippsGetSize_BN(key->dipp, &key->dSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - /* convert to size in bits */ - key->dSz = key->dSz * 8; - pSz = pSz * 8; - qSz = qSz * 8; - - /* set up private key state */ - ret = ippsRSA_GetSizePrivateKeyType2(pSz, qSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->prvSz = ctxSz; - key->pPrv = (IppsRSAPrivateKeyState*)XMALLOC(ctxSz, 0, - DYNAMIC_TYPE_USER_CRYPTO); - if (key->pPrv == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsRSA_InitPrivateKeyType2(pSz, qSz, key->pPrv, ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_InitPrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsRSA_SetPrivateKeyType2(key->pipp, key->qipp, key->dPipp, - key->dQipp, key->uipp, key->pPrv); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_SetPrivateKey error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - } - - /* SSL_SUCCESS */ - return 1; -} -#endif /* OPENSSLEXTRA */ - - -/* Padding scheme function used in wolfSSL for signing needed for matching - existing API signing scheme - input : the msg to be signed - inputLen : length of input msg - pkcsBlock : the outputted padded msg - pkcsBlockLen : length of outputted padded msg buffer - padValue : the padded value after first 00 , is either 01 or 02 - rng : random number generator structure - */ -static int wc_RsaPad(const byte* input, word32 inputLen, byte* pkcsBlock, - word32 pkcsBlockLen, byte padValue, WC_RNG* rng) -{ - if (inputLen == 0 || pkcsBlockLen == 0) { - return USER_CRYPTO_ERROR; - } - - pkcsBlock[0] = 0x0; /* set first byte to zero and advance */ - pkcsBlock++; pkcsBlockLen--; - pkcsBlock[0] = padValue; /* insert padValue */ - - if (padValue == RSA_BLOCK_TYPE_1) { - if (pkcsBlockLen < inputLen + 2) { - return USER_CRYPTO_ERROR; - } - - /* pad with 0xff bytes */ - XMEMSET(&pkcsBlock[1], 0xFF, pkcsBlockLen - inputLen - 2); - } - else { - /* pad with non-zero random bytes */ - word32 padLen, i; - int ret; - - if (pkcsBlockLen < inputLen + 1) { - return USER_CRYPTO_ERROR; - } - - padLen = pkcsBlockLen - inputLen - 1; - ret = wc_RNG_GenerateBlock(rng, &pkcsBlock[1], padLen); - - if (ret != 0) - return ret; - - /* remove zeros */ - for (i = 1; i < padLen; i++) - if (pkcsBlock[i] == 0) pkcsBlock[i] = 0x01; - } - - pkcsBlock[pkcsBlockLen-inputLen-1] = 0; /* separator */ - XMEMCPY(pkcsBlock+pkcsBlockLen-inputLen, input, inputLen); - - return 0; -} - - -/* UnPad plaintext, set start to *output, return length of plaintext, - * < 0 on error */ -static int RsaUnPad(const byte *pkcsBlock, unsigned int pkcsBlockLen, - byte **output, byte padValue) -{ - word32 maxOutputLen = (pkcsBlockLen > 10) ? (pkcsBlockLen - 10) : 0, - invalid = 0, - i = 1, - outputLen; - - if (pkcsBlockLen == 0) { - return USER_CRYPTO_ERROR; - } - - if (pkcsBlock[0] != 0x0) /* skip past zero */ - invalid = 1; - pkcsBlock++; pkcsBlockLen--; - - /* Require block type padValue */ - invalid = (pkcsBlock[0] != padValue) || invalid; - - /* verify the padding until we find the separator */ - if (padValue == RSA_BLOCK_TYPE_1) { - while (i maxOutputLen) || invalid; - - if (invalid) { - USER_DEBUG(("RsaUnPad error, bad formatting\n")); - return USER_CRYPTO_ERROR; - } - - *output = (byte *)(pkcsBlock + i); - return outputLen; -} - - -/* Set up memory and structure for a Big Number - * returns ippStsNoErr on success - */ -static IppStatus init_bn(IppsBigNumState** in, int sz) -{ - int ctxSz; - IppStatus ret; - - ret = ippsBigNumGetSize(sz, &ctxSz); - if (ret != ippStsNoErr) { - return ret; - } - - *in = (IppsBigNumState*)XMALLOC(ctxSz, 0, DYNAMIC_TYPE_USER_CRYPTO); - if (*in == NULL) { - return ippStsNoMemErr; - } - - ret = ippsBigNumInit(sz, *in); - if (ret != ippStsNoErr) { - XFREE(*in, NULL, DYNAMIC_TYPE_USER_CRYPTO); - *in = NULL; - return ret; - } - - return ippStsNoErr; -} - - -/* Set up memory and structure for a Montgomery struct - * returns ippStsNoErr on success - */ -static IppStatus init_mont(IppsMontState** mont, int* ctxSz, - IppsBigNumState* modul) -{ - int mSz; - Ipp32u* m; - IppStatus ret; - - ret = ippsExtGet_BN(NULL, ctxSz, NULL, modul); - if (ret != ippStsNoErr) { - return ret; - } - - /* convert bits to Ipp32u array size and round up - 32 is number of bits in type */ - mSz = (*ctxSz/32)+((*ctxSz % 32)? 1: 0); - m = (Ipp32u*)XMALLOC(mSz * sizeof(Ipp32u), 0, DYNAMIC_TYPE_USER_CRYPTO); - if (m == NULL) { - XFREE(m, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return ippStsNoMemErr; - } - - ret = ippsExtGet_BN(NULL, NULL, m, modul); - if (ret != ippStsNoErr) { - XFREE(m, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return ret; - } - - ret = ippsMontGetSize(IppsSlidingWindows, mSz, ctxSz); - if (ret != ippStsNoErr) { - XFREE(m, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return ret; - } - - /* 2. Allocate working buffer using malloc */ - *mont = (IppsMontState*)XMALLOC(*ctxSz, 0, DYNAMIC_TYPE_USER_CRYPTO); - if (*mont == NULL) { - XFREE(m, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return ippStsNoMemErr; - } - ret = ippsMontInit(IppsSlidingWindows, mSz, *mont); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsMontInit error of %s\n", ippGetStatusString(ret))); - XFREE(m, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(*mont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - *mont = NULL; - return ret; - } - - /* 3. Call the function MontSet to set big number module */ - ret = ippsMontSet(m, mSz, *mont); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsMontSet error of %s\n", ippGetStatusString(ret))); - XFREE(m, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(*mont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - *mont = NULL; - return ret; - } - - XFREE(m, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - return ippStsNoErr; -} - - - -int wc_FreeRsaKey(RsaKey* key) -{ - if (key == NULL) - return 0; - - USER_DEBUG(("Entering wc_FreeRsaKey\n")); - - if (key->pPub != NULL) { - XFREE(key->pPub, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->pPub = NULL; - } - - if (key->pPrv != NULL) { - /* write over sensitive information */ - ForceZero(key->pPrv, key->prvSz); - XFREE(key->pPrv, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->pPrv = NULL; - } - - if (key->n != NULL) { - XFREE(key->n, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->n = NULL; - } - - if (key->e != NULL) { - XFREE(key->e, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->e = NULL; - } - - if (key->dipp != NULL) { - XFREE(key->dipp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->dipp = NULL; - } - - if (key->pipp != NULL) { - XFREE(key->pipp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->pipp = NULL; - } - - if (key->qipp != NULL) { - XFREE(key->qipp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->qipp = NULL; - } - - if (key->dPipp != NULL) { - XFREE(key->dPipp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->dPipp = NULL; - } - - if (key->dQipp != NULL) { - XFREE(key->dQipp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->dQipp = NULL; - } - - if (key->uipp != NULL) { - XFREE(key->uipp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - key->uipp = NULL; - } - - USER_DEBUG(("\tExit wc_FreeRsaKey\n")); - (void)key; - - return 0; -} - - -/* Some parsing functions from wolfSSL code needed to match wolfSSL API used */ -static int GetLength(const byte* input, word32* inOutIdx, int* len, - word32 maxIdx) -{ - int length = 0; - word32 idx = *inOutIdx; - byte b; - - *len = 0; /* default length */ - - if ((idx + 1) > maxIdx) { /* for first read */ - USER_DEBUG(("GetLength bad index on input\n")); - return USER_CRYPTO_ERROR; - } - - b = input[idx++]; - if (b >= 0x80) { - word32 bytes = b & 0x7F; - - if ((idx + bytes) > maxIdx) { /* for reading bytes */ - USER_DEBUG(("GetLength bad long length\n")); - return USER_CRYPTO_ERROR; - } - - while (bytes--) { - b = input[idx++]; - length = (length << 8) | b; - } - } - else - length = b; - - if ((idx + length) > maxIdx) { /* for user of length */ - USER_DEBUG(("GetLength value exceeds buffer length\n")); - return USER_CRYPTO_ERROR; - } - - *inOutIdx = idx; - if (length > 0) - *len = length; - - return length; -} - -static int GetASNHeader(const byte* input, byte tag, word32* inOutIdx, int* len, - word32 maxIdx) -{ - word32 idx = *inOutIdx; - byte b; - int length; - - if ((idx + 1) > maxIdx) - return USER_CRYPTO_ERROR; - - b = input[idx++]; - if (b != tag) - return USER_CRYPTO_ERROR; - - if (GetLength(input, &idx, &length, maxIdx) < 0) - return USER_CRYPTO_ERROR; - - *len = length; - *inOutIdx = idx; - return length; -} - -static int GetASNInt(const byte* input, word32* inOutIdx, int* len, - word32 maxIdx) -{ - int ret; - - ret = GetASNHeader(input, ASN_INTEGER, inOutIdx, len, maxIdx); - if (ret < 0) - return ret; - - if (*len > 0) { - /* remove leading zero, unless there is only one 0x00 byte */ - if ((input[*inOutIdx] == 0x00) && (*len > 1)) { - (*inOutIdx)++; - (*len)--; - - if (*len > 0 && (input[*inOutIdx] & 0x80) == 0) - return USER_CRYPTO_ERROR; - } - } - - return 0; -} - -static int GetInt(IppsBigNumState** mpi, const byte* input, word32* inOutIdx, - word32 maxIdx) -{ - IppStatus ret; - word32 idx = *inOutIdx; - int length; - int ctxSz; - - if (GetASNInt(input, &idx, &length, maxIdx) < 0) { - return USER_CRYPTO_ERROR; - } - - ret = ippsBigNumGetSize(length, &ctxSz); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - *mpi = (IppsBigNumState*)XMALLOC(ctxSz, 0, DYNAMIC_TYPE_USER_CRYPTO); - if (*mpi == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsBigNumInit(length, *mpi); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - ret = ippsSetOctString_BN((Ipp8u*)input + idx, length, *mpi); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - *inOutIdx = idx + length; - return 0; -} - - -static int GetSequence(const byte* input, word32* inOutIdx, int* len, - word32 maxIdx) -{ - int length = -1; - word32 idx = *inOutIdx; - - if ((idx + 1) > maxIdx) - return USER_CRYPTO_ERROR; - - if (input[idx++] != (0x10 | 0x20) || - GetLength(input, &idx, &length, maxIdx) < 0) - return USER_CRYPTO_ERROR; - - *len = length; - *inOutIdx = idx; - - return length; -} - - -static int GetMyVersion(const byte* input, word32* inOutIdx, - int* version, word32 maxIdx) -{ - word32 idx = *inOutIdx; - - if ((idx + 3) > maxIdx) - return USER_CRYPTO_ERROR; - - if (input[idx++] != 0x02) - return USER_CRYPTO_ERROR; - - if (input[idx++] != 0x01) - return USER_CRYPTO_ERROR; - - *version = input[idx++]; - *inOutIdx = idx; - - return *version; -} - - -int wc_RsaPrivateKeyDecode(const byte* input, word32* inOutIdx, RsaKey* key, - word32 inSz) -{ - int version, length; - int ctxSz, pSz, qSz; - IppStatus ret; - - if (input == NULL || inOutIdx == NULL || key == NULL) { - return USER_CRYPTO_ERROR; - } - - USER_DEBUG(("Entering wc_RsaPrivateKeyDecode\n")); - - /* read in key information */ - if (GetSequence(input, inOutIdx, &length, inSz) < 0) - return USER_CRYPTO_ERROR; - - if (GetMyVersion(input, inOutIdx, &version, inSz) < 0) - return USER_CRYPTO_ERROR; - - key->type = RSA_PRIVATE; - - if (GetInt(&key->n, input, inOutIdx, inSz) < 0 || - GetInt(&key->e, input, inOutIdx, inSz) < 0 || - GetInt(&key->dipp, input, inOutIdx, inSz) < 0 || - GetInt(&key->pipp, input, inOutIdx, inSz) < 0 || - GetInt(&key->qipp, input, inOutIdx, inSz) < 0 || - GetInt(&key->dPipp, input, inOutIdx, inSz) < 0 || - GetInt(&key->dQipp, input, inOutIdx, inSz) < 0 || - GetInt(&key->uipp, input, inOutIdx, inSz) < 0 ) - return USER_CRYPTO_ERROR; - - /* get sizes of IPP BN key states created from input */ - ret = ippsGetSize_BN(key->n, &key->nSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsGetSize_BN(key->e, &key->eSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->sz = key->nSz; /* set modulus size */ - - /* convert to size in bits */ - key->nSz = key->nSz * 8; - key->eSz = key->eSz * 8; - - /* set up public key state */ - ret = ippsRSA_GetSizePublicKey(key->nSz, key->eSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->pPub = (IppsRSAPublicKeyState*)XMALLOC(ctxSz, NULL, - DYNAMIC_TYPE_USER_CRYPTO); - if (key->pPub == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsRSA_InitPublicKey(key->nSz, key->eSz, key->pPub, ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_InitPublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsRSA_SetPublicKey(key->n, key->e, key->pPub); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_SetPublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - /* get bn sizes needed for private key set up */ - ret = ippsGetSize_BN(key->pipp, &pSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsGetSize_BN(key->qipp, &qSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - /* store sizes needed for creating tmp private keys */ - ret = ippsGetSize_BN(key->dipp, &key->dSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - /* convert to size in bits */ - key->dSz = key->dSz * 8; - pSz = pSz * 8; - qSz = qSz * 8; - - /* set up private key state */ - ret = ippsRSA_GetSizePrivateKeyType2(pSz, qSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->prvSz = ctxSz; - key->pPrv = (IppsRSAPrivateKeyState*)XMALLOC(ctxSz, 0, - DYNAMIC_TYPE_USER_CRYPTO); - if (key->pPrv == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsRSA_InitPrivateKeyType2(pSz, qSz, key->pPrv, ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_InitPrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsRSA_SetPrivateKeyType2(key->pipp, key->qipp, key->dPipp, - key->dQipp, key->uipp, key->pPrv); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_SetPrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - USER_DEBUG(("\tExit wc_RsaPrivateKeyDecode\n")); - - return 0; -} - - -int wc_RsaPublicKeyDecode_ex(const byte* input, word32* inOutIdx, - word32 inSz, const byte** n, word32* nSz, const byte** e, word32* eSz) -{ - IppStatus ret = 0; - int length; -#if defined(OPENSSL_EXTRA) || defined(RSA_DECODE_EXTRA) - byte b; -#endif - - if (input == NULL || inOutIdx == NULL) { - return USER_CRYPTO_ERROR; - } - - USER_DEBUG(("Entering wc_RsaPublicKeyDecode_ex\n")); - - if (GetSequence(input, inOutIdx, &length, inSz) < 0) - return USER_CRYPTO_ERROR; - -#if defined(OPENSSL_EXTRA) || defined(RSA_DECODE_EXTRA) - if ((*inOutIdx + 1) > inSz) - return USER_CRYPTO_ERROR; - - b = input[*inOutIdx]; - if (b != ASN_INTEGER) { - /* not from decoded cert, will have algo id, skip past */ - if (GetSequence(input, inOutIdx, &length, inSz) < 0) - return USER_CRYPTO_ERROR; - - b = input[(*inOutIdx)++]; - if (b != ASN_OBJECT_ID) - return USER_CRYPTO_ERROR; - - if (GetLength(input, inOutIdx, &length, inSz) < 0) - return USER_CRYPTO_ERROR; - - *inOutIdx += length; /* skip past */ - - /* could have NULL tag and 0 terminator, but may not */ - b = input[(*inOutIdx)++]; - - if (b == ASN_TAG_NULL) { - b = input[(*inOutIdx)++]; - if (b != 0) - return USER_CRYPTO_ERROR; - } - else { - /* go back, didn't have it */ - (*inOutIdx)--; - } - - /* should have bit tag length and seq next */ - b = input[(*inOutIdx)++]; - if (b != ASN_BIT_STRING) - return USER_CRYPTO_ERROR; - - if (GetLength(input, inOutIdx, &length, inSz) <= 0) - return USER_CRYPTO_ERROR; - - /* could have 0 */ - b = input[(*inOutIdx)++]; - if (b != 0) - (*inOutIdx)--; - - if (GetSequence(input, inOutIdx, &length, inSz) < 0) - return USER_CRYPTO_ERROR; - } -#endif /* OPENSSL_EXTRA || RSA_DECODE_EXTRA */ - - /* Get modulus */ - ret = GetASNInt(input, inOutIdx, &length, inSz); - if (ret < 0) { - return USER_CRYPTO_ERROR; - } - if (nSz) - *nSz = length; - if (n) - *n = &input[*inOutIdx]; - *inOutIdx += length; - - /* Get exponent */ - ret = GetASNInt(input, inOutIdx, &length, inSz); - if (ret < 0) { - return USER_CRYPTO_ERROR; - } - if (eSz) - *eSz = length; - if (e) - *e = &input[*inOutIdx]; - *inOutIdx += length; - - USER_DEBUG(("\tExit wc_RsaPublicKeyDecode_ex\n")); - - return ret; -} - -/* read in a public RSA key */ -int wc_RsaPublicKeyDecode(const byte* input, word32* inOutIdx, RsaKey* key, - word32 inSz) -{ - IppStatus ret; - const byte *n = NULL, *e = NULL; - word32 nSz = 0, eSz = 0; - - if (key == NULL) - return USER_CRYPTO_ERROR; - - USER_DEBUG(("Entering wc_RsaPublicKeyDecode\n")); - - ret = wc_RsaPublicKeyDecode_ex(input, inOutIdx, inSz, &n, &nSz, &e, &eSz); - if (ret == 0) { - ret = wc_RsaPublicKeyDecodeRaw(n, nSz, e, eSz, key); - } - - USER_DEBUG(("\tExit RsaPublicKeyDecode\n")); - - return ret; -} - -/* import RSA public key elements (n, e) into RsaKey structure (key) */ -int wc_RsaPublicKeyDecodeRaw(const byte* n, word32 nSz, const byte* e, - word32 eSz, RsaKey* key) -{ - IppStatus ret; - int ctxSz; - - USER_DEBUG(("Entering wc_RsaPublicKeyDecodeRaw\n")); - - if (n == NULL || e == NULL || key == NULL) - return USER_CRYPTO_ERROR; - - /* set up IPP key states -- read in n */ - ret = init_bn(&key->n, nSz); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - ret = ippsSetOctString_BN((Ipp8u*)n, nSz, key->n); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - /* read in e */ - ret = init_bn(&key->e, eSz); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - ret = ippsSetOctString_BN((Ipp8u*)e, eSz, key->e); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - /* store size and convert to binary */ - key->sz = nSz; - nSz = nSz * 8; - eSz = eSz * 8; - - /* set up public key state */ - ret = ippsRSA_GetSizePublicKey(nSz, eSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->pPub = (IppsRSAPublicKeyState*)XMALLOC(ctxSz, NULL, - DYNAMIC_TYPE_USER_CRYPTO); - if (key->pPub == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsRSA_InitPublicKey(nSz, eSz, key->pPub, ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_InitPublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsRSA_SetPublicKey(key->n,key->e, key->pPub); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_SetPublicKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - key->nSz = nSz; - key->eSz = eSz; - key->type = RSA_PUBLIC; - - return 0; -} - - -/* encrypt using PKCS v15 */ -int wc_RsaPublicEncrypt(const byte* in, word32 inLen, byte* out, word32 outLen, - RsaKey* key, WC_RNG* rng) -{ - IppStatus ret; - Ipp8u* scratchBuffer; - int scratchSz; - - if (key == NULL || in == NULL || out == NULL) - return USER_CRYPTO_ERROR; - - if (key->pPub == NULL || outLen < key->sz) - return USER_CRYPTO_ERROR; - - /* set size of scratch buffer */ - ret = ippsRSA_GetBufferSizePublicKey(&scratchSz, key->pPub); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - scratchBuffer = (Ipp8u*)XMALLOC(scratchSz*(sizeof(Ipp8u)), 0, - DYNAMIC_TYPE_USER_CRYPTO); - if (scratchBuffer == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsRSAEncrypt_PKCSv15((Ipp8u*)in, inLen, NULL, (Ipp8u*)out, - key->pPub, scratchBuffer); - if (ret != ippStsNoErr) { - XFREE(scratchBuffer, NULL, DYNAMIC_TYPE_USER_CRYPTO); - USER_DEBUG(("encrypt error of %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - XFREE(scratchBuffer, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - (void)rng; - return key->sz; -} - - -/* decrypt using PLCS v15 */ -int wc_RsaPrivateDecrypt(const byte* in, word32 inLen, byte* out, word32 outLen, - RsaKey* key) -{ - IppStatus ret; - Ipp8u* scratchBuffer; - int scratchSz; - int outSz; - - if (in == NULL || out == NULL || key == NULL) - return USER_CRYPTO_ERROR; - - if (key->pPrv == NULL || inLen != key->sz) - return USER_CRYPTO_ERROR; - - outSz = outLen; - - /* set size of scratch buffer */ - ret = ippsRSA_GetBufferSizePrivateKey(&scratchSz, key->pPrv); - if (ret != ippStsNoErr) { - return USER_CRYPTO_ERROR; - } - - scratchBuffer = (Ipp8u*)XMALLOC(scratchSz*(sizeof(Ipp8u)), 0, - DYNAMIC_TYPE_USER_CRYPTO); - if (scratchBuffer == NULL) { - return USER_CRYPTO_ERROR; - } - - /* perform decryption using IPP */ - ret = ippsRSADecrypt_PKCSv15((Ipp8u*)in, (Ipp8u*)out, &outSz, key->pPrv, - scratchBuffer); - if (ret != ippStsNoErr) { - XFREE(scratchBuffer, NULL, DYNAMIC_TYPE_USER_CRYPTO); - USER_DEBUG(("decrypt error of %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - XFREE(scratchBuffer, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - return outSz; -} - - -/* out is a pointer that is set to the location in byte array "in" where input - data has been decrypted */ -int wc_RsaPrivateDecryptInline(byte* in, word32 inLen, byte** out, RsaKey* key) -{ - int outSz; - byte* tmp; - - USER_DEBUG(("Entering wc_RsaPrivateDecryptInline\n")); - - /* allocate a buffer for max decrypted text */ - tmp = (byte*)XMALLOC(key->sz, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (tmp == NULL) - return USER_CRYPTO_ERROR; - - outSz = wc_RsaPrivateDecrypt(in, inLen, tmp, key->sz, key); - if (outSz >= 0) { - XMEMCPY(in, tmp, outSz); - *out = in; - } - else { - XFREE(tmp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return USER_CRYPTO_ERROR; - } - - XFREE(tmp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - USER_DEBUG(("\tExit wc_RsaPrivateDecryptInline\n")); - - return outSz; -} - - -/* Used to clean up memory when exiting, clean up memory used */ -static int FreeHelper(IppsBigNumState* pTxt, IppsBigNumState* cTxt, - Ipp8u* scratchBuffer, void* pPub) -{ - if (pTxt != NULL) - XFREE(pTxt, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (cTxt != NULL) - XFREE(cTxt, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (scratchBuffer != NULL) - XFREE(scratchBuffer, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (pPub != NULL) - XFREE(pPub, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - return 0; -} - - -/* for Rsa Verify - in : byte array to be verified - inLen : length of input array - out : pointer to location of in byte array that has been verified - */ -int wc_RsaSSL_VerifyInline(byte* in, word32 inLen, byte** out, RsaKey* key) -{ - - int ctxSz; - int scratchSz; - Ipp8u* scratchBuffer = NULL; - IppStatus ret; - IppsRSAPrivateKeyState* pPub = NULL; - IppsBigNumState* pTxt = NULL; - IppsBigNumState* cTxt = NULL; - - USER_DEBUG(("Entering wc_RsaSSL_VerifyInline\n")); - - if (key == NULL || key->n == NULL || key->e == NULL) { - USER_DEBUG(("n or e element was null\n")); - return USER_CRYPTO_ERROR; - } - - if (in == NULL || inLen == 0 || out == NULL) - return USER_CRYPTO_ERROR; - - /* set up a private key state using public key values */ - ret = ippsRSA_GetSizePrivateKeyType1(key->nSz, key->eSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - pPub = (IppsRSAPrivateKeyState*)XMALLOC(ctxSz, 0, DYNAMIC_TYPE_USER_CRYPTO); - if (pPub == NULL) - return USER_CRYPTO_ERROR; - - ret = ippsRSA_InitPrivateKeyType1(key->nSz, key->eSz, pPub, ctxSz); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - USER_DEBUG(("ippsRSA_InitPrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - ret = ippsRSA_SetPrivateKeyType1(key->n, key->e, pPub); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - USER_DEBUG(("ippsRSA_SetPrivateKey error %s\n", - ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - /* set size of scratch buffer */ - ret = ippsRSA_GetBufferSizePrivateKey(&scratchSz, pPub); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - return USER_CRYPTO_ERROR; - } - - scratchBuffer = (Ipp8u*)XMALLOC(scratchSz*(sizeof(Ipp8u)), 0, - DYNAMIC_TYPE_USER_CRYPTO); - if (scratchBuffer == NULL) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - return USER_CRYPTO_ERROR; - } - - /* load plain and cipher into big num states */ - ret = init_bn(&pTxt, key->sz); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - return USER_CRYPTO_ERROR; - } - ret = ippsSetOctString_BN((Ipp8u*)in, key->sz, pTxt); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - return USER_CRYPTO_ERROR; - } - - /* set up cipher to hold signature */ - ret = init_bn(&cTxt, key->sz); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - return USER_CRYPTO_ERROR; - } - ret = ippsSetOctString_BN((Ipp8u*)in, key->sz, cTxt); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - return USER_CRYPTO_ERROR; - } - - /* decrypt using public key information */ - ret = ippsRSA_Decrypt(cTxt, pTxt, pPub, scratchBuffer); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - USER_DEBUG(("decrypt error of %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - /* extract big num struct to octet string */ - ret = ippsGetOctString_BN((Ipp8u*)in, key->sz, pTxt); - if (ret != ippStsNoErr) { - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - USER_DEBUG(("BN get string error of %s\n", ippGetStatusString(ret))); - return USER_CRYPTO_ERROR; - } - - FreeHelper(pTxt, cTxt, scratchBuffer, pPub); - - /* unpad the decrypted information and return size of array */ - return RsaUnPad(in, inLen, out, RSA_BLOCK_TYPE_1); -} - - -/* sets up and call VerifyInline to verify a signature */ -int wc_RsaSSL_Verify(const byte* in, word32 inLen, byte* out, word32 outLen, - RsaKey* key) -{ - int plainLen; - byte* tmp; - byte* pad = 0; - - if (out == NULL || in == NULL || key == NULL) - return USER_CRYPTO_ERROR; - - tmp = (byte*)XMALLOC(inLen, key->heap, DYNAMIC_TYPE_USER_CRYPTO); - if (tmp == NULL) { - return USER_CRYPTO_ERROR; - } - - XMEMCPY(tmp, in, inLen); - - /* verify signature and test if output buffer is large enough */ - plainLen = wc_RsaSSL_VerifyInline(tmp, inLen, &pad, key); - if (plainLen < 0) { - XFREE(tmp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return plainLen; - } - - if (plainLen > (int)outLen) - plainLen = USER_CRYPTO_ERROR; - else - XMEMCPY(out, pad, plainLen); - - ForceZero(tmp, inLen); - XFREE(tmp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - return plainLen; -} - - -/* Check if a > b , if so c = a mod b - return ippStsNoErr on success */ -static IppStatus reduce(IppsBigNumState* a, IppsBigNumState* b, - IppsBigNumState* c) -{ - IppStatus ret; - - if ((ret = ippsMod_BN(a, b, c)) != ippStsNoErr) - return ret; - - return ippStsNoErr; -} - - -static IppStatus exptmod(IppsBigNumState* a, IppsBigNumState* b, - IppsMontState* mont, IppsBigNumState* out, IppsBigNumState* one) -{ - IppStatus ret; - - ret = ippsMontForm(a, mont, a); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsMontForm error of %s\n", ippGetStatusString(ret))); - return ret; - } - - /* a = a^b mod mont */ - ret = ippsMontExp(a, b, mont, out); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsMontExp error of %s\n", ippGetStatusString(ret))); - return ret; - } - - /* convert back from montgomery */ - ret = ippsMontMul(out, one, mont, out); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsMontMul error of %s\n", ippGetStatusString(ret))); - return ret; - } - - return ippStsNoErr; -} - - -static void Free_BN(IppsBigNumState* bn) -{ - int sz, ctxSz; - IppStatus ret; - - if (bn != NULL) { - ret = ippStsNoErr; - ret |= ippsGetSize_BN(bn, &sz); - ret |= ippsBigNumGetSize(sz, &ctxSz); - if (ret == ippStsNoErr) { - ForceZero(bn, ctxSz); - } - else { - USER_DEBUG(("Issue with clearing a struct in RsaSSL_Sign free\n")); - } - XFREE(bn, NULL, DYNAMIC_TYPE_USER_CRYPTO); - } -} - - -/* free up memory used during CRT sign operation */ -static void FreeSignHelper(IppsBigNumState* one, IppsBigNumState* tmp, - IppsBigNumState* tmpP, IppsBigNumState* tmpQ, IppsBigNumState* tmpa, - IppsBigNumState* tmpb) -{ - Free_BN(one); - Free_BN(tmp); - Free_BN(tmpP); - Free_BN(tmpQ); - Free_BN(tmpa); - Free_BN(tmpb); -} - - -/* for Rsa Sign */ -int wc_RsaSSL_Sign(const byte* in, word32 inLen, byte* out, word32 outLen, - RsaKey* key, WC_RNG* rng) -{ - int sz, pSz, qSz; - IppStatus ret; - word32 outSz; - - IppsMontState* pMont = NULL; - IppsMontState* qMont = NULL; - - IppsBigNumState* one = NULL; - IppsBigNumState* tmp = NULL; - IppsBigNumState* tmpP = NULL; - IppsBigNumState* tmpQ = NULL; - IppsBigNumState* tmpa = NULL; - IppsBigNumState* tmpb = NULL; - - IppsBigNumSGN sa, sb; - - Ipp8u o[1]; - o[0] = 1; - - USER_DEBUG(("Entering wc_RsaSSL_Sign\n")); - - if (in == NULL || out == NULL || key == NULL || rng == NULL) { - USER_DEBUG(("Bad argument to wc_RsaSSL_Sign\n")); - return USER_CRYPTO_ERROR; - } - - sz = key->sz; - - - /* sanity check on key being used */ - if (key->pipp == NULL || key->qipp == NULL || key->uipp == NULL || - key->dPipp == NULL || key->dQipp == NULL) { - USER_DEBUG(("Bad key argument to wc_RsaSSL_Sign\n")); - return USER_CRYPTO_ERROR; - } - - if (sz > (int)outLen) { - USER_DEBUG(("Bad argument outLen to wc_RsaSSL_Sign\n")); - return USER_CRYPTO_ERROR; - } - - if (sz < RSA_MIN_PAD_SZ) { - USER_DEBUG(("Key size is too small\n")); - return USER_CRYPTO_ERROR; - } - - if (inLen > (word32)(sz - RSA_MIN_PAD_SZ)) { - USER_DEBUG(("Bad argument inLen to wc_RsaSSL_Sign\n")); - return USER_CRYPTO_ERROR; - } - - /* Set up needed pkcs v15 padding */ - if (wc_RsaPad(in, inLen, out, sz, RSA_BLOCK_TYPE_1, rng) != 0) { - USER_DEBUG(("RSA Padding error\n")); - return USER_CRYPTO_ERROR; - } - - /* tmp = input to sign */ - ret = init_bn(&tmp, sz); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_BN error of %s\n", ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - ret = ippsSetOctString_BN(out, sz, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsSetOctString_BN error of %s\n", - ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* tmpP = tmp mod p */ - ret = init_bn(&tmpP, sz); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_BN error of %s\n", ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* tmpQ = tmp mod q */ - ret = init_bn(&tmpQ, sz); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_BN error of %s\n", ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* tmpa */ - ret = init_bn(&tmpa, sz); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_BN error of %s\n", ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* tmpb */ - ret = init_bn(&tmpb, sz); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_BN error of %s\n", ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* one : used for conversion from Montgomery to classical */ - ret = init_bn(&one, sz); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_BN error of %s\n", ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - ret = ippsSetOctString_BN(o, 1, one); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsSetOctString_BN error of %s\n", - ippGetStatusString(ret))); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /** - Set up Montgomery state - */ - ret = init_mont(&pMont, &pSz, key->pipp); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_mont error of %s\n", ippGetStatusString(ret))); - if (pMont != NULL) { - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - } - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - ret = init_mont(&qMont, &qSz, key->qipp); - if (ret != ippStsNoErr) { - USER_DEBUG(("init_mont error of %s\n", ippGetStatusString(ret))); - if (qMont != NULL) { - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - } - ForceZero(pMont, pSz); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /** - Check and reduce input - This is needed for calls to MontExp since required value of a < modulus - */ - ret = reduce(tmp, key->pipp, tmpP); - if (ret != ippStsNoErr) - { - USER_DEBUG(("reduce error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - ret = reduce(tmp, key->qipp, tmpQ); - if (ret != ippStsNoErr) - { - USER_DEBUG(("reduce error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* tmpa = (tmp mod p)^dP mod p */ - ret = exptmod(tmpP, key->dPipp, pMont, tmpa, one); - if (ret != ippStsNoErr) { - USER_DEBUG(("exptmod error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* tmpb = (tmp mod q)^dQ mod q */ - ret = exptmod(tmpQ, key->dQipp, qMont, tmpb, one); - if (ret != ippStsNoErr) { - USER_DEBUG(("exptmod error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* tmp = (tmpa - tmpb) * qInv (mod p) */ - ret = ippsSub_BN(tmpa, tmpb, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsSub_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - ret = ippsMul_BN(tmp, key->uipp, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsMul_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* mod performed the same was as wolfSSL fp_mod -- tmpa is just scratch */ - ret = ippsDiv_BN(tmp, key->pipp, tmpa, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsDiv_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* Check sign of values and perform conditional add */ - ret = ippsExtGet_BN(&sa, NULL, NULL, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsExtGet_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - ret = ippsExtGet_BN(&sb, NULL, NULL, key->pipp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsExtGet_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - if (sa != sb) { - ret = ippsAdd_BN(tmp, key->pipp, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsAdd_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - } - - /* tmp = tmpb + q * tmp */ - ret = ippsMul_BN(tmp, key->qipp, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsSub_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - - ret = ippsAdd_BN(tmp, tmpb, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsSub_BN error of %s\n", ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - /* Extract the output */ - ret = ippsGetOctString_BN(out, sz, tmp); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetOctString_BN error of %s\n", - ippGetStatusString(ret))); - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - return USER_CRYPTO_ERROR; - } - - outSz = sz; - - /* clear memory and free */ - ForceZero(pMont, pSz); - ForceZero(qMont, qSz); - XFREE(qMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pMont, NULL, DYNAMIC_TYPE_USER_CRYPTO); - FreeSignHelper(one, tmp, tmpP, tmpQ, tmpa, tmpb); - - return outSz; -} - - -int wc_RsaEncryptSize(RsaKey* key) -{ - if (key == NULL) - return 0; - - return key->sz; -} - - -/* flatten RsaKey structure into individual elements (e, n) */ -int wc_RsaFlattenPublicKey(RsaKey* key, byte* e, word32* eSz, byte* n, - word32* nSz) -{ - int sz, bytSz; - IppStatus ret; - - USER_DEBUG(("Entering wc_RsaFlattenPublicKey\n")); - - if (key == NULL || e == NULL || eSz == NULL || n == NULL || nSz == NULL) - return USER_CRYPTO_ERROR; - - bytSz = sizeof(byte) * 8; - ret = ippsExtGet_BN(NULL, &sz, NULL, key->e); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - /* sz is in bits change to bytes */ - sz = (sz / bytSz) + ((sz % bytSz)? 1 : 0); - - if (*eSz < (word32)sz) - return USER_CRYPTO_ERROR; - - ret = ippsGetOctString_BN(e, sz, key->e); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - *eSz = (word32)sz; - - /* flatten n */ - ret = ippsExtGet_BN(NULL, &sz, NULL, key->n); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - /* sz is in bits change to bytes */ - sz = (sz / bytSz) + ((sz % bytSz)? 1: 0); - - if (*nSz < (word32)sz) - return USER_CRYPTO_ERROR; - - ret = ippsGetOctString_BN(n, sz, key->n); - if (ret != ippStsNoErr) - return USER_CRYPTO_ERROR; - - *nSz = (word32)sz; - - return 0; -} - - -IppStatus wolfSSL_rng(Ipp32u* pData, int nBits, void* pEbsParams); -IppStatus wolfSSL_rng(Ipp32u* pData, int nBits, void* pEbsParams) -{ - int nBytes; - - if (pData == NULL) { - USER_DEBUG(("error with wolfSSL_rng argument\n")); - return ippStsErr; - } - - nBytes = (nBits/8) + ((nBits % 8)? 1: 0); - if (wc_RNG_GenerateBlock((WC_RNG*)pEbsParams, (byte*)pData, nBytes) != 0) { - USER_DEBUG(("error in generating random wolfSSL block\n")); - return ippStsErr; - } - - return ippStsNoErr; -} - - -#ifdef WOLFSSL_KEY_GEN -/* Make an RSA key for size bits, with e specified, 65537 is a good e */ -int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng) -{ - IppStatus ret; - int scratchSz; - int i; /* for trys on calling make key */ - int ctxSz; - - IppsBigNumState* pSrcPublicExp = NULL; - Ipp8u* scratchBuffer = NULL; - Ipp8u eAry[8]; - int trys = 8; /* Miller-Rabin test parameter */ - IppsPrimeState* pPrime = NULL; - - int qBitSz; /* size of q factor */ - int bytSz; /* size of key in bytes */ - int leng; - - USER_DEBUG(("Entering wc_MakeRsaKey\n")); - - /* get byte size and individual private key size -- round up */ - qBitSz = (size / 2) + ((size % 2)? 1: 0); - bytSz = (size / 8) + ((size % 8)? 1: 0); - - if (key == NULL || rng == NULL) { - USER_DEBUG(("Error, NULL argument passed in\n")); - return USER_CRYPTO_ERROR; - } - - if (e < 3 || (e&1) == 0) - return USER_CRYPTO_ERROR; - - if (size > RSA_MAX_SIZE || size < RSA_MIN_SIZE) - return USER_CRYPTO_ERROR; - - key->type = RSA_PRIVATE; - key->sz = bytSz; - - /* initialize prime number */ - ret = ippsPrimeGetSize(size, &ctxSz); /* size in bits */ - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsPrimeGetSize error of %s\n", ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - pPrime = (IppsPrimeState*)XMALLOC(ctxSz, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (pPrime == NULL) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - ret = ippsPrimeInit(size, pPrime); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsPrimeInit error of %s\n", ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* define RSA privete key type 2 */ - /* length in bits of p and q factors */ - ret = ippsRSA_GetSizePrivateKeyType2(qBitSz, qBitSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePrivateKeyType2 error of %s\n", - ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - key->prvSz = ctxSz; /* used when freeing private key */ - key->pPrv = (IppsRSAPrivateKeyState*)XMALLOC(ctxSz, NULL, - DYNAMIC_TYPE_USER_CRYPTO); - if (key->pPrv == NULL) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* length in bits of p and q factors */ - ret = ippsRSA_InitPrivateKeyType2(qBitSz, qBitSz, key->pPrv, ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_InitPrivateKeyType2 error of %s\n", - ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* allocate scratch buffer */ - ret = ippsRSA_GetBufferSizePrivateKey(&scratchSz, key->pPrv); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetBufferSizePrivateKey error of %s\n", - ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - scratchBuffer = (Ipp8u*)XMALLOC(scratchSz, 0, DYNAMIC_TYPE_USER_CRYPTO); - if (scratchBuffer == NULL) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* set up initial value of pScrPublicExp */ - leng = (int)sizeof(long); /* # of Ipp32u in long */ - - /* place the value of e into the array eAry then load into BN */ - for (i = 0; i < leng; i++) { - eAry[i] = (e >> (8 * (leng - 1 - i))) & 0XFF; - } - ret = init_bn(&pSrcPublicExp, leng); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - ret = ippsSetOctString_BN(eAry, leng, pSrcPublicExp); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* initializing key->n */ - ret = init_bn(&key->n, bytSz); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* initializing public exponent key->e */ - ret = init_bn(&key->e, leng); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* private exponent key->dipp */ - ret = init_bn(&key->dipp, bytSz); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* call IPP to generate keys, if inseficent entropy error call again */ - ret = ippStsInsufficientEntropy; - while (ret == ippStsInsufficientEntropy) { - ret = ippsRSA_GenerateKeys(pSrcPublicExp, key->n, key->e, - key->dipp, key->pPrv, scratchBuffer, trys, pPrime, - wolfSSL_rng, rng); - if (ret == ippStsNoErr) { - break; - } - - /* catch all errors other than entropy error */ - if (ret != ippStsInsufficientEntropy) { - USER_DEBUG(("ippsRSA_GeneratKeys error of %s\n", - ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - } - - /* get bn sizes needed for private key set up */ - ret = ippsExtGet_BN(NULL, &key->eSz, NULL, key->e); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - ret = ippsExtGet_BN(NULL, &key->nSz, NULL, key->n); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsGetSize_BN error %s\n", ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* set up public key state */ - ret = ippsRSA_GetSizePublicKey(key->nSz, key->eSz, &ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetSizePublicKey error %s nSz = %d eSz = %d\n", - ippGetStatusString(ret), key->nSz, key->eSz)); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - key->pPub = (IppsRSAPublicKeyState*)XMALLOC(ctxSz, NULL, - DYNAMIC_TYPE_USER_CRYPTO); - if (key->pPub == NULL) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - ret = ippsRSA_InitPublicKey(key->nSz, key->eSz, key->pPub, ctxSz); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_InitPublicKey error %s\n", - ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - ret = ippsRSA_SetPublicKey(key->n, key->e, key->pPub); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_SetPublicKey error %s\n", - ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* get private key information for key struct */ - leng = size/16; /* size of q, p, u, dP, dQ */ - ret = init_bn(&key->pipp, leng); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* set up q BN for key */ - ret = init_bn(&key->qipp, leng); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* set up dP BN for key */ - ret = init_bn(&key->dPipp, leng); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* set up dQ BN for key */ - ret = init_bn(&key->dQipp, leng); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* set up u BN for key */ - ret = init_bn(&key->uipp, leng); - if (ret != ippStsNoErr) { - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - - /* get values from created key */ - ret = ippsRSA_GetPrivateKeyType2(key->pipp, key->qipp, key->dPipp, - key->dQipp, key->uipp, key->pPrv); - if (ret != ippStsNoErr) { - USER_DEBUG(("ippsRSA_GetPrivateKeyType2 error %s\n", - ippGetStatusString(ret))); - ret = USER_CRYPTO_ERROR; - goto makeKeyEnd; - } - ret = 0; /* success case */ - -makeKeyEnd: - /* clean up memory used */ - XFREE(pSrcPublicExp, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(scratchBuffer, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(pPrime, NULL, DYNAMIC_TYPE_USER_CRYPTO); - - if (ret != 0) { /* with fail case free RSA components created */ - wc_FreeRsaKey(key); - } - - return ret; -} - -#endif - -#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) - -/********** duplicate code needed -- future refactor */ -#define MAX_VERSION_SZ 5 -#define MAX_SEQ_SZ 5 -#define ASN_CONTEXT_SPECIFIC 0x80 -#define ASN_CONSTRUCTED 0x20 -#define ASN_LONG_LENGTH 0x80 -#define ASN_SEQUENCE 0x10 -#define RSA_INTS 8 -#define FALSE 0 -#define TRUE 1 - -#define MAX_LENGTH_SZ 4 -#define RSAk 645 -#define keyType 2 -#define MAX_RSA_INT_SZ 517 -#define MAX_RSA_E_SZ 16 -#define MAX_ALGO_SZ 20 - -static word32 BytePrecision(word32 value) -{ - word32 i; - for (i = sizeof(value); i; --i) - if (value >> ((i - 1) * WOLFSSL_BIT_SIZE)) - break; - - return i; -} - - -static int SetMyVersion(word32 version, byte* output, int header) -{ - int i = 0; - - if (output == NULL) - return USER_CRYPTO_ERROR; - - if (header) { - output[i++] = ASN_CONTEXT_SPECIFIC | ASN_CONSTRUCTED; - output[i++] = ASN_BIT_STRING; - } - output[i++] = ASN_INTEGER; - output[i++] = 0x01; - output[i++] = (byte)version; - - return i; -} - - -static word32 SetLength(word32 length, byte* output) -{ - word32 i = 0, j; - - if (length < 0x80) - output[i++] = (byte)length; - else { - output[i++] = (byte)(BytePrecision(length) | ASN_LONG_LENGTH); - - for (j = BytePrecision(length); j; --j) { - output[i] = (byte)(length >> ((j - 1) * WOLFSSL_BIT_SIZE)); - i++; - } - } - - return i; -} - - -static word32 SetSequence(word32 len, byte* output) -{ - output[0] = ASN_SEQUENCE | ASN_CONSTRUCTED; - return SetLength(len, output + 1) + 1; -} - - -static word32 SetAlgoID(int algoOID, byte* output, int type, int curveSz) -{ - /* adding TAG_NULL and 0 to end */ - - /* RSA keyType */ - #ifndef NO_RSA - static const byte RSA_AlgoID[] = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x01, 0x01, 0x05, 0x00}; - #endif /* NO_RSA */ - - int algoSz = 0; - int tagSz = 2; /* tag null and terminator */ - word32 idSz, seqSz; - const byte* algoName = 0; - byte ID_Length[MAX_LENGTH_SZ]; - byte seqArray[MAX_SEQ_SZ + 1]; /* add object_id to end */ - - if (type == keyType) { /* keyType */ - switch (algoOID) { - #ifndef NO_RSA - case RSAk: - algoSz = sizeof(RSA_AlgoID); - algoName = RSA_AlgoID; - break; - #endif /* NO_RSA */ - default: - /* unknown key algo */ - return 0; - } - } - else { - /* unknown algo type */ - return 0; - } - - idSz = SetLength(algoSz - tagSz, ID_Length); /* don't include tags */ - seqSz = SetSequence(idSz + algoSz + 1 + curveSz, seqArray); - /* +1 for object id, curveID of curveSz follows for ecc */ - seqArray[seqSz++] = ASN_OBJECT_ID; - - XMEMCPY(output, seqArray, seqSz); - XMEMCPY(output + seqSz, ID_Length, idSz); - XMEMCPY(output + seqSz + idSz, algoName, algoSz); - - return seqSz + idSz + algoSz; - -} - - -/* Write a public RSA key to output */ -static int SetRsaPublicKey(byte* output, RsaKey* key, - int outLen, int with_header) -{ -#ifdef WOLFSSL_SMALL_STACK - byte* n = NULL; - byte* e = NULL; -#else - byte n[MAX_RSA_INT_SZ]; - byte e[MAX_RSA_E_SZ]; -#endif - byte seq[MAX_SEQ_SZ]; - byte len[MAX_LENGTH_SZ + 1]; /* trailing 0 */ - int nSz; - int eSz; - int seqSz; - int lenSz; - int idx; - int rawLen; - int leadingBit; - int err; - - if (output == NULL || key == NULL || outLen < MAX_SEQ_SZ) - return USER_CRYPTO_ERROR; - - /* n */ -#ifdef WOLFSSL_SMALL_STACK - n = (byte*)XMALLOC(MAX_RSA_INT_SZ, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (n == NULL) - return USER_CRYPTO_ERROR; -#endif - - leadingBit = wc_Rsa_leading_bit(key->n); - rawLen = wc_Rsa_unsigned_bin_size(key->n); - if ((int)rawLen < 0) { - return USER_CRYPTO_ERROR; - } - - rawLen = rawLen + leadingBit; - n[0] = ASN_INTEGER; - nSz = SetLength(rawLen, n + 1) + 1; /* int tag */ - - if ( (nSz + rawLen) < MAX_RSA_INT_SZ) { - if (leadingBit) - n[nSz] = 0; - err = ippsGetOctString_BN((Ipp8u*)n + nSz, rawLen - leadingBit, key->n); - if (err == ippStsNoErr) - nSz += rawLen; - else { -#ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - return USER_CRYPTO_ERROR; - } - } - else { -#ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - return USER_CRYPTO_ERROR; - } - - /* e */ -#ifdef WOLFSSL_SMALL_STACK - e = (byte*)XMALLOC(MAX_RSA_E_SZ, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (e == NULL) { -#ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - return USER_CRYPTO_ERROR; - } -#endif - - leadingBit = wc_Rsa_leading_bit(key->e); - rawLen = wc_Rsa_unsigned_bin_size(key->e); - if ((int)rawLen < 0) { - return USER_CRYPTO_ERROR; - } - - rawLen = rawLen + leadingBit; - e[0] = ASN_INTEGER; - eSz = SetLength(rawLen, e + 1) + 1; /* int tag */ - - if ( (eSz + rawLen) < MAX_RSA_E_SZ) { - if (leadingBit) - e[eSz] = 0; - err = ippsGetOctString_BN((Ipp8u*)e + eSz, rawLen - leadingBit, key->e); - if (err == ippStsNoErr) - eSz += rawLen; - else { -#ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(e, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - return USER_CRYPTO_ERROR; - } - } - else { -#ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(e, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - return USER_CRYPTO_ERROR; - } - - seqSz = SetSequence(nSz + eSz, seq); - - /* check output size */ - if ( (seqSz + nSz + eSz) > outLen) { -#ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(e, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - return USER_CRYPTO_ERROR; - } - - /* headers */ - if (with_header) { - int algoSz; -#ifdef WOLFSSL_SMALL_STACK - byte* algo; - - algo = (byte*)XMALLOC(MAX_ALGO_SZ, NULL, DYNAMIC_TYPE_USER_CRYPTO); - if (algo == NULL) { - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(e, NULL, DYNAMIC_TYPE_USER_CRYPTO); - return USER_CRYPTO_ERROR; - } -#else - byte algo[MAX_ALGO_SZ]; -#endif - algoSz = SetAlgoID(RSAk, algo, keyType, 0); - lenSz = SetLength(seqSz + nSz + eSz + 1, len); - len[lenSz++] = 0; /* trailing 0 */ - - /* write, 1 is for ASN_BIT_STRING */ - idx = SetSequence(nSz + eSz + seqSz + lenSz + 1 + algoSz, output); - - /* check output size */ - if ( (idx + algoSz + 1 + lenSz + seqSz + nSz + eSz) > outLen) { - #ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(e, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(algo, NULL, DYNAMIC_TYPE_USER_CRYPTO); - #endif - - return USER_CRYPTO_ERROR; - } - - /* algo */ - XMEMCPY(output + idx, algo, algoSz); - idx += algoSz; - /* bit string */ - output[idx++] = ASN_BIT_STRING; - /* length */ - XMEMCPY(output + idx, len, lenSz); - idx += lenSz; -#ifdef WOLFSSL_SMALL_STACK - XFREE(algo, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - } - else - idx = 0; - - /* seq */ - XMEMCPY(output + idx, seq, seqSz); - idx += seqSz; - /* n */ - XMEMCPY(output + idx, n, nSz); - idx += nSz; - /* e */ - XMEMCPY(output + idx, e, eSz); - idx += eSz; - -#ifdef WOLFSSL_SMALL_STACK - XFREE(n, NULL, DYNAMIC_TYPE_USER_CRYPTO); - XFREE(e, NULL, DYNAMIC_TYPE_USER_CRYPTO); -#endif - - return idx; -} - - -static IppsBigNumState* GetRsaInt(RsaKey* key, int idx) -{ - if (idx == 0) - return key->n; - if (idx == 1) - return key->e; - if (idx == 2) - return key->dipp; - if (idx == 3) - return key->pipp; - if (idx == 4) - return key->qipp; - if (idx == 5) - return key->dPipp; - if (idx == 6) - return key->dQipp; - if (idx == 7) - return key->uipp; - - return NULL; -} - - -/* Release Tmp RSA resources */ -static WC_INLINE void FreeTmpRsas(byte** tmps, void* heap) -{ - int i; - - (void)heap; - - for (i = 0; i < RSA_INTS; i++) - XFREE(tmps[i], heap, DYNAMIC_TYPE_USER_CRYPTO); -} - - -/* Convert RsaKey key to DER format, write to output (inLen), return bytes - written */ -int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen) -{ - word32 seqSz, verSz, rawLen, intTotalLen = 0; - word32 sizes[RSA_INTS]; - int i, j, outLen, ret = 0, lbit; - - byte seq[MAX_SEQ_SZ]; - byte ver[MAX_VERSION_SZ]; - byte* tmps[RSA_INTS]; - - USER_DEBUG(("Entering RsaKeyToDer\n")); - - if (!key) - return USER_CRYPTO_ERROR; - - if (key->type != RSA_PRIVATE) - return USER_CRYPTO_ERROR; - - for (i = 0; i < RSA_INTS; i++) - tmps[i] = NULL; - - /* write all big ints from key to DER tmps */ - for (i = 0; i < RSA_INTS; i++) { - Ipp32u isZero; - IppsBigNumState* keyInt = GetRsaInt(key, i); - - ippsCmpZero_BN(keyInt, &isZero); /* makes isZero 0 if true */ - rawLen = wc_Rsa_unsigned_bin_size(keyInt); - if ((int)rawLen < 0) { - return USER_CRYPTO_ERROR; - } - - /* leading zero */ - if (!isZero || wc_Rsa_leading_bit(keyInt)) - lbit = 1; - else - lbit = 0; - - rawLen += lbit; - - tmps[i] = (byte*)XMALLOC(rawLen + MAX_SEQ_SZ, key->heap, - DYNAMIC_TYPE_USER_CRYPTO); - if (tmps[i] == NULL) { - ret = USER_CRYPTO_ERROR; - break; - } - - tmps[i][0] = ASN_INTEGER; - sizes[i] = SetLength(rawLen, tmps[i] + 1) + 1 + lbit; /* tag & lbit */ - - if (sizes[i] <= MAX_SEQ_SZ) { - int err; - - /* leading zero */ - if (lbit) - tmps[i][sizes[i]-1] = 0x00; - - /* extract data*/ - err = ippsGetOctString_BN((Ipp8u*)(tmps[i] + sizes[i]), - rawLen - lbit, keyInt); - if (err == ippStsOk) { - sizes[i] += (rawLen-lbit); /* lbit included in rawLen */ - intTotalLen += sizes[i]; - ret = 0; - } - else { - ret = USER_CRYPTO_ERROR; - USER_DEBUG(("ippsGetOctString_BN error %s\n", - ippGetStatusString(err))); - break; - } - } - else { - ret = USER_CRYPTO_ERROR; - break; - } - } - - if (ret != 0) { - FreeTmpRsas(tmps, key->heap); - return ret; - } - - /* make headers */ - verSz = SetMyVersion(0, ver, FALSE); - seqSz = SetSequence(verSz + intTotalLen, seq); - - outLen = seqSz + verSz + intTotalLen; - if (output) { - if (outLen > (int)inLen) { - return USER_CRYPTO_ERROR; - } - - /* write to output */ - XMEMCPY(output, seq, seqSz); - j = seqSz; - XMEMCPY(output + j, ver, verSz); - j += verSz; - - for (i = 0; i < RSA_INTS; i++) { - XMEMCPY(output + j, tmps[i], sizes[i]); - j += sizes[i]; - } - } - FreeTmpRsas(tmps, key->heap); - - return outLen; -} - - -/* Convert Rsa Public key to DER format, write to output (inLen), return bytes - written -*/ -int wc_RsaKeyToPublicDer(RsaKey* key, byte* output, word32 inLen) -{ - return SetRsaPublicKey(output, key, inLen, 1); -} - -/* Returns public DER version of the RSA key. If with_header is 0 then only a - * seq + n + e is returned in ASN.1 DER format */ -int wc_RsaKeyToPublicDer_ex(RsaKey* key, byte* output, word32 inLen, - int with_header) -{ - return SetRsaPublicKey(output, key, inLen, with_header); -} - -#endif /* WOLFSSL_KEY_GEN || OPENSSL_EXTRA */ - -#ifdef WC_RSA_BLINDING - -int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng) -{ - if (key == NULL) - return USER_CRYPTO_ERROR; - - (void)rng; - - return 0; -} - -#endif /* WC_RSA_BLINDING */ - -#endif /* NO_RSA */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/certs_test.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/certs_test.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/certs_test.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/certs_test.h 2024-08-03 07:30:01.000000000 +0000 @@ -100,9 +100,9 @@ static const unsigned char client_cert_der_1024[] = { 0x30, 0x82, 0x04, 0x18, 0x30, 0x82, 0x03, 0x81, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x41, 0x1F, 0xEC, 0xCF, 0x49, - 0x20, 0x14, 0x81, 0xDC, 0xAB, 0x32, 0x02, 0x01, 0x6A, 0xCD, - 0x18, 0xBD, 0xF5, 0xE3, 0x53, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x59, 0xF2, 0xEA, 0x44, 0x08, + 0xB5, 0x12, 0x30, 0xA0, 0x96, 0x93, 0xD1, 0xD1, 0x7F, 0xE1, + 0xEC, 0x49, 0x75, 0x9B, 0xA2, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -120,10 +120,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, @@ -180,8 +180,8 @@ 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, - 0x41, 0x1F, 0xEC, 0xCF, 0x49, 0x20, 0x14, 0x81, 0xDC, 0xAB, - 0x32, 0x02, 0x01, 0x6A, 0xCD, 0x18, 0xBD, 0xF5, 0xE3, 0x53, + 0x59, 0xF2, 0xEA, 0x44, 0x08, 0xB5, 0x12, 0x30, 0xA0, 0x96, + 0x93, 0xD1, 0xD1, 0x7F, 0xE1, 0xEC, 0x49, 0x75, 0x9B, 0xA2, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, @@ -191,20 +191,20 @@ 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, - 0x03, 0x81, 0x81, 0x00, 0x64, 0x0E, 0x1B, 0xA2, 0xB2, 0x39, - 0xCC, 0xDF, 0x9C, 0x63, 0x48, 0x4B, 0x58, 0x2C, 0xE5, 0xAF, - 0xE2, 0xBA, 0xD2, 0x74, 0x37, 0xF8, 0xA0, 0xC8, 0x2F, 0x62, - 0x36, 0x84, 0x49, 0x55, 0xD6, 0x8D, 0x2B, 0x4D, 0x96, 0x4F, - 0xB4, 0x2E, 0x83, 0xF9, 0x00, 0xE8, 0xCB, 0x7E, 0x04, 0xF1, - 0x19, 0xF2, 0x00, 0x24, 0x0D, 0x2B, 0xBA, 0x30, 0x89, 0x7F, - 0x8A, 0xE3, 0x64, 0xE2, 0xD5, 0x1B, 0x5A, 0x0A, 0x9D, 0x26, - 0xDB, 0xE8, 0x6A, 0x60, 0xC2, 0x79, 0xAA, 0xAD, 0x8D, 0xF1, - 0x1C, 0x2A, 0x33, 0xD4, 0x66, 0x42, 0x98, 0x7A, 0x94, 0xD4, - 0xB7, 0x2D, 0x0B, 0xCB, 0xF5, 0xB5, 0x62, 0xAE, 0xE1, 0x88, - 0x47, 0xAD, 0xEE, 0x8D, 0x32, 0xB5, 0x60, 0x1A, 0x5B, 0xA1, - 0xD3, 0xA1, 0x58, 0xCC, 0x0C, 0x40, 0x30, 0x0D, 0x05, 0xCB, - 0x4B, 0xD2, 0xE1, 0xD7, 0xCA, 0x63, 0xDE, 0xA8, 0x78, 0x56, - 0x96, 0xE7 + 0x03, 0x81, 0x81, 0x00, 0x45, 0x63, 0x6F, 0xF9, 0xED, 0xF4, + 0x12, 0x3C, 0x3C, 0xC5, 0x2C, 0x51, 0x08, 0x94, 0x61, 0x7E, + 0x08, 0xE8, 0x32, 0x46, 0x2B, 0x22, 0x02, 0xD0, 0xE8, 0x2B, + 0xA4, 0x23, 0x15, 0x48, 0x47, 0x87, 0x5D, 0x72, 0xAB, 0x38, + 0xD5, 0x34, 0xB9, 0xFC, 0xF4, 0x86, 0x93, 0x49, 0x95, 0xD8, + 0x81, 0x32, 0x1C, 0x21, 0xE3, 0xEF, 0xB8, 0x40, 0xC5, 0x87, + 0x02, 0xE8, 0x28, 0xAA, 0x54, 0x93, 0x2D, 0x8A, 0xE9, 0x1E, + 0xDD, 0x5D, 0x11, 0xF8, 0xBF, 0xCA, 0x4E, 0x33, 0x20, 0x56, + 0x4E, 0x6F, 0x53, 0xBB, 0x79, 0xB0, 0xDA, 0x65, 0xA1, 0x4B, + 0x9F, 0xC8, 0x55, 0xFA, 0x53, 0x26, 0x84, 0xC6, 0x1E, 0x0A, + 0x5E, 0x7A, 0x6E, 0xF2, 0x2D, 0x2A, 0x81, 0xA5, 0xD0, 0x2B, + 0xEC, 0xD5, 0x8E, 0xB9, 0xF0, 0xC7, 0x57, 0xD7, 0xD6, 0x14, + 0x1A, 0x3B, 0xDC, 0x09, 0x41, 0xB4, 0x9D, 0x0D, 0x72, 0x20, + 0x44, 0x79 }; static const int sizeof_client_cert_der_1024 = sizeof(client_cert_der_1024); @@ -418,9 +418,9 @@ static const unsigned char ca_cert_der_1024[] = { 0x30, 0x82, 0x04, 0x09, 0x30, 0x82, 0x03, 0x72, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x0E, 0x75, 0x3B, 0x39, 0xAD, - 0x1F, 0x53, 0xD1, 0x85, 0x3B, 0x05, 0x3B, 0x11, 0x62, 0x4F, - 0xDC, 0x7B, 0x11, 0x72, 0x11, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x5C, 0x44, 0x2B, 0xBF, 0xD3, + 0xA8, 0x2A, 0xD8, 0xFD, 0x54, 0xC9, 0xCD, 0xAA, 0x7F, 0xF7, + 0xD4, 0x59, 0x07, 0xAA, 0xDD, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x99, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -438,9 +438,9 @@ 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, - 0x32, 0x32, 0x31, 0x32, 0x31, 0x36, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x17, 0x0D, 0x32, 0x35, 0x30, 0x39, 0x31, - 0x31, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x30, 0x81, + 0x32, 0x33, 0x31, 0x32, 0x31, 0x33, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x17, 0x0D, 0x32, 0x36, 0x30, 0x39, 0x30, + 0x38, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x30, 0x81, 0x99, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, @@ -496,9 +496,9 @@ 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x0E, 0x75, 0x3B, 0x39, 0xAD, - 0x1F, 0x53, 0xD1, 0x85, 0x3B, 0x05, 0x3B, 0x11, 0x62, 0x4F, - 0xDC, 0x7B, 0x11, 0x72, 0x11, 0x30, 0x0C, 0x06, 0x03, 0x55, + 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x5C, 0x44, 0x2B, 0xBF, 0xD3, + 0xA8, 0x2A, 0xD8, 0xFD, 0x54, 0xC9, 0xCD, 0xAA, 0x7F, 0xF7, + 0xD4, 0x59, 0x07, 0xAA, 0xDD, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, @@ -507,20 +507,20 @@ 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, - 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0xB8, - 0x80, 0xBF, 0xB2, 0xF5, 0x83, 0x95, 0x51, 0x81, 0x6A, 0x7E, - 0x41, 0x87, 0x29, 0xD7, 0xC3, 0xC9, 0xC6, 0x9B, 0x60, 0xE4, - 0x65, 0xA1, 0x04, 0x97, 0x1D, 0x1B, 0x3B, 0xE9, 0x27, 0xFA, - 0x43, 0xD6, 0x89, 0x6A, 0x3C, 0x9E, 0xBF, 0x28, 0xD1, 0x75, - 0x37, 0x21, 0xF3, 0x0D, 0x64, 0x17, 0xB2, 0xA3, 0x2D, 0x83, - 0x52, 0xFF, 0x57, 0xF0, 0x42, 0xA9, 0x48, 0xAA, 0xD8, 0x84, - 0xEA, 0x0D, 0x80, 0x05, 0x71, 0x0A, 0xAA, 0x23, 0xB4, 0x6C, - 0xC6, 0xD6, 0x7F, 0x13, 0x4A, 0xF4, 0x82, 0xB9, 0xE2, 0x81, - 0xAE, 0x46, 0x8C, 0x59, 0xFB, 0xC3, 0x8C, 0x6D, 0x5B, 0xF3, - 0x32, 0xEC, 0x86, 0xF0, 0x6E, 0xDA, 0x2A, 0x78, 0xAB, 0xF2, - 0x36, 0xFB, 0x48, 0xFA, 0x74, 0x09, 0x0E, 0x19, 0xC2, 0xBF, - 0xEB, 0xCC, 0xFB, 0xA9, 0x05, 0xC1, 0xC9, 0xE1, 0xAB, 0x8B, - 0x79, 0xF6, 0xF1, 0xAD, 0x4A, 0x9F, 0xAA + 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x70, + 0x7D, 0x83, 0x94, 0xD0, 0xEE, 0xE1, 0x19, 0x8B, 0x17, 0xCA, + 0x79, 0x87, 0x12, 0x5B, 0x7F, 0x70, 0xA3, 0x51, 0x20, 0x4F, + 0x21, 0x99, 0x71, 0x69, 0x21, 0x28, 0x55, 0x61, 0x70, 0x85, + 0x54, 0x21, 0xA9, 0x70, 0xA2, 0xA9, 0x12, 0xDB, 0x44, 0x11, + 0x44, 0xE7, 0x41, 0x00, 0x70, 0x80, 0xB5, 0x37, 0x0C, 0x7E, + 0x78, 0x8F, 0x88, 0x64, 0xBC, 0xE5, 0xC0, 0x44, 0xA7, 0xA5, + 0x3D, 0xDB, 0x62, 0xC4, 0xD6, 0xCD, 0xAA, 0x4B, 0xAC, 0xFB, + 0x01, 0x46, 0xBB, 0xEC, 0xCB, 0x6F, 0x01, 0x67, 0xB4, 0x65, + 0xF3, 0x5E, 0x53, 0x39, 0x64, 0x99, 0x9B, 0x68, 0x80, 0x14, + 0x91, 0xA4, 0xA4, 0xEB, 0x04, 0xF3, 0x76, 0x9A, 0x7D, 0xB4, + 0x38, 0x05, 0x9C, 0xA5, 0xE0, 0xBC, 0x7E, 0xD9, 0xD2, 0xD3, + 0xD4, 0xE8, 0xC3, 0x9F, 0x38, 0x4B, 0x6C, 0x29, 0x94, 0xBE, + 0x35, 0xBD, 0x30, 0x1F, 0xB5, 0xB7, 0x3D }; static const int sizeof_ca_cert_der_1024 = sizeof(ca_cert_der_1024); @@ -613,9 +613,9 @@ 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, - 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, 0x36, 0x32, 0x31, 0x31, - 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, 0x32, 0x35, 0x30, 0x39, - 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x30, + 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, 0x33, 0x32, 0x32, 0x31, + 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, 0x32, 0x36, 0x30, 0x39, + 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x30, 0x81, 0x95, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, @@ -671,9 +671,9 @@ 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x82, 0x14, 0x0E, 0x75, 0x3B, 0x39, 0xAD, 0x1F, 0x53, 0xD1, - 0x85, 0x3B, 0x05, 0x3B, 0x11, 0x62, 0x4F, 0xDC, 0x7B, 0x11, - 0x72, 0x11, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, + 0x82, 0x14, 0x5C, 0x44, 0x2B, 0xBF, 0xD3, 0xA8, 0x2A, 0xD8, + 0xFD, 0x54, 0xC9, 0xCD, 0xAA, 0x7F, 0xF7, 0xD4, 0x59, 0x07, + 0xAA, 0xDD, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, @@ -682,20 +682,20 @@ 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, - 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0xC0, 0x94, 0x34, 0x0D, - 0x41, 0xA3, 0x03, 0x17, 0x05, 0x08, 0xD9, 0x54, 0xD9, 0xA2, - 0xF0, 0xE9, 0x22, 0x58, 0x25, 0x50, 0x10, 0x6D, 0xDA, 0x09, - 0x2D, 0x7D, 0xFC, 0x0D, 0xC0, 0x13, 0x35, 0x0E, 0x96, 0x7F, - 0x1E, 0x38, 0xA1, 0x11, 0x97, 0x42, 0xDF, 0x83, 0x07, 0x05, - 0xCE, 0xD6, 0xDE, 0x90, 0x22, 0xAB, 0x0F, 0x6D, 0x56, 0x90, - 0x02, 0x9A, 0xA5, 0xCF, 0x5A, 0x9B, 0x96, 0x66, 0x0F, 0x71, - 0xED, 0xB2, 0x72, 0x7A, 0xE4, 0x9D, 0x61, 0x9F, 0x2A, 0x45, - 0xB8, 0x51, 0xB9, 0xA6, 0xEE, 0xD6, 0x73, 0x2A, 0x03, 0xF4, - 0x03, 0x32, 0x6E, 0x19, 0x6E, 0x70, 0x48, 0x6B, 0x72, 0x29, - 0x30, 0x19, 0x87, 0x06, 0x30, 0xD6, 0x2F, 0x19, 0xF5, 0x39, - 0x78, 0x2F, 0x2F, 0xC2, 0x49, 0x38, 0x5A, 0xD8, 0x38, 0x06, - 0xF9, 0xFE, 0xBF, 0x45, 0xEA, 0x7B, 0xE6, 0x7B, 0xA6, 0x0B, - 0xB5, 0xBA, 0x06, 0x80 + 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x35, 0x2E, 0x7B, 0x57, + 0x7B, 0x64, 0x70, 0x53, 0xE0, 0x81, 0xED, 0xF4, 0xAC, 0xB3, + 0x3A, 0x3B, 0xBA, 0x82, 0x8D, 0xA2, 0x31, 0xD9, 0xD4, 0xAC, + 0xD1, 0x8A, 0x6D, 0x35, 0x41, 0x15, 0xB3, 0xE8, 0x06, 0x91, + 0xCA, 0x2A, 0xF7, 0xFF, 0x28, 0x0E, 0x3D, 0xCD, 0xE7, 0x28, + 0xF0, 0x07, 0xC0, 0x78, 0x62, 0x9E, 0x88, 0x3D, 0xDC, 0x98, + 0xF0, 0x8C, 0x89, 0xA7, 0x1C, 0x5B, 0x77, 0x37, 0xB2, 0x55, + 0x38, 0xB2, 0x60, 0x42, 0xE8, 0x02, 0x81, 0xBF, 0x7C, 0xC3, + 0x54, 0x86, 0x7E, 0xE4, 0x2F, 0x7D, 0x74, 0x74, 0x27, 0xF7, + 0x9A, 0xE2, 0x8D, 0xA9, 0x2F, 0x7C, 0x82, 0x31, 0x41, 0xF1, + 0xCB, 0x48, 0xA0, 0x05, 0x00, 0x26, 0x3D, 0xA4, 0x6B, 0x27, + 0x43, 0x4C, 0x3F, 0x6F, 0x2F, 0x41, 0x2E, 0xEE, 0xBA, 0x0D, + 0x8F, 0x39, 0x42, 0x0D, 0x2D, 0x76, 0x00, 0x12, 0x4C, 0xF9, + 0x49, 0x2D, 0x7F, 0xED }; static const int sizeof_server_cert_der_1024 = sizeof(server_cert_der_1024); @@ -869,9 +869,9 @@ static const unsigned char client_cert_der_2048[] = { 0x30, 0x82, 0x05, 0x1D, 0x30, 0x82, 0x04, 0x05, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x73, 0xFB, 0x54, 0xD6, 0x03, - 0x7D, 0x4C, 0x07, 0x84, 0xE2, 0x00, 0x11, 0x8C, 0xDD, 0x90, - 0xDC, 0x48, 0x8D, 0xEA, 0x53, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x08, 0xB0, 0x54, 0x7A, 0x03, + 0x5A, 0xEC, 0x55, 0x8A, 0x12, 0xE8, 0xF9, 0x8E, 0x34, 0xB6, + 0x13, 0xD9, 0x59, 0xB8, 0xE8, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -889,10 +889,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, @@ -962,9 +962,9 @@ 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x82, 0x14, 0x73, 0xFB, 0x54, 0xD6, 0x03, 0x7D, 0x4C, 0x07, - 0x84, 0xE2, 0x00, 0x11, 0x8C, 0xDD, 0x90, 0xDC, 0x48, 0x8D, - 0xEA, 0x53, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, + 0x82, 0x14, 0x08, 0xB0, 0x54, 0x7A, 0x03, 0x5A, 0xEC, 0x55, + 0x8A, 0x12, 0xE8, 0xF9, 0x8E, 0x34, 0xB6, 0x13, 0xD9, 0x59, + 0xB8, 0xE8, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, @@ -973,33 +973,33 @@ 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x36, 0xCB, 0xBC, - 0xC5, 0x52, 0x9A, 0x66, 0xCD, 0x91, 0x4D, 0x8F, 0x27, 0x9F, - 0xB3, 0x64, 0x80, 0x0E, 0x64, 0xB4, 0xCB, 0x1A, 0xCD, 0x75, - 0x9E, 0x82, 0x7C, 0x55, 0x67, 0xD8, 0x9F, 0x90, 0xA3, 0x34, - 0x96, 0x99, 0x43, 0xF7, 0x49, 0x53, 0xA2, 0x58, 0x85, 0xA0, - 0xB3, 0x83, 0x4F, 0xAF, 0xB8, 0x15, 0x8A, 0x88, 0x1E, 0xF3, - 0x60, 0xF4, 0x7C, 0x94, 0xB5, 0x58, 0x68, 0xF1, 0x2A, 0x13, - 0x80, 0x34, 0xC2, 0x6F, 0xA5, 0xF8, 0x7E, 0x76, 0x16, 0x81, - 0x4F, 0x36, 0x8B, 0xC3, 0x59, 0xBD, 0x51, 0xDD, 0x60, 0x87, - 0xD7, 0x1D, 0x96, 0x44, 0x69, 0x07, 0x3C, 0x8F, 0x28, 0x56, - 0xB1, 0x11, 0x5C, 0x4E, 0x81, 0x3F, 0x57, 0x25, 0xFD, 0x65, - 0xDD, 0x07, 0xCF, 0x17, 0x0A, 0x01, 0x7E, 0x4E, 0x3F, 0x8E, - 0x73, 0xDB, 0xFE, 0xF4, 0xF2, 0xC5, 0xFF, 0xA3, 0x76, 0xA8, - 0x74, 0x46, 0x2E, 0x47, 0x0D, 0xB0, 0xED, 0x0A, 0xC0, 0xC5, - 0x0A, 0x65, 0xD3, 0xDC, 0x62, 0xB2, 0xE0, 0x1E, 0x8E, 0xBD, - 0xF3, 0xBD, 0xAF, 0xAF, 0x66, 0x84, 0x36, 0x92, 0xE2, 0x3B, - 0x80, 0xD0, 0x57, 0xA6, 0x41, 0xA3, 0x62, 0xD1, 0xA6, 0x6D, - 0x14, 0x6C, 0xCD, 0x82, 0xB1, 0xC1, 0xC1, 0x35, 0x55, 0xAE, - 0x59, 0x49, 0xA8, 0x26, 0x52, 0xBD, 0xEF, 0x1B, 0x2C, 0x1F, - 0x9D, 0x39, 0x04, 0xD2, 0x82, 0xA0, 0x6B, 0x39, 0x71, 0x59, - 0x33, 0x82, 0xBA, 0x55, 0x6C, 0x97, 0xF2, 0x1B, 0x5B, 0xE0, - 0x4D, 0xE2, 0xCF, 0x89, 0xE7, 0x26, 0xB8, 0x2C, 0x6C, 0x9F, - 0x83, 0xD6, 0xED, 0x4E, 0x2F, 0x75, 0xA9, 0x30, 0x4E, 0x01, - 0x95, 0x0D, 0x4F, 0x83, 0x5E, 0xC8, 0xAF, 0x7F, 0x67, 0xEA, - 0x53, 0xBF, 0xCA, 0x9B, 0x1F, 0xD4, 0xFF, 0x36, 0x97, 0x02, - 0x71, 0x8E, 0x33, 0xDE, 0xE2, 0x58, 0x27, 0xAA, 0x70, 0x0C, - 0x5B, 0xDE, 0x0E + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x89, 0x84, 0xEB, + 0x6A, 0x70, 0x3B, 0x2A, 0x6E, 0xA8, 0x8B, 0xF2, 0x92, 0x79, + 0x97, 0x5C, 0xBD, 0x98, 0x8B, 0x71, 0xDB, 0xDB, 0x7C, 0xDF, + 0xDB, 0xA4, 0x2C, 0x59, 0xD3, 0xA6, 0x75, 0x41, 0xC2, 0x06, + 0xB6, 0x17, 0x1E, 0x0C, 0x1F, 0x7D, 0x0B, 0x7F, 0x58, 0x3E, + 0xC1, 0xE7, 0x0C, 0xF0, 0x62, 0x92, 0x77, 0xAB, 0x99, 0x79, + 0x7B, 0x85, 0xF4, 0xD9, 0x6C, 0xD0, 0x0E, 0xE5, 0x8B, 0x13, + 0x35, 0x65, 0x9E, 0xD7, 0x9A, 0x51, 0x98, 0xE4, 0x49, 0x44, + 0x51, 0xC8, 0xE3, 0xE0, 0x9A, 0xFF, 0xC2, 0xCB, 0x3D, 0x81, + 0xEB, 0xEE, 0xF4, 0x1A, 0xD1, 0x96, 0x4B, 0xE9, 0x7D, 0xDE, + 0x5B, 0xF2, 0x64, 0x40, 0xAD, 0xE1, 0xD9, 0xD6, 0xB7, 0xE1, + 0xEB, 0xA9, 0x3A, 0x52, 0x29, 0x89, 0xAA, 0x07, 0x37, 0x96, + 0x44, 0xE3, 0x23, 0x49, 0xF3, 0xBE, 0xF3, 0x0D, 0x70, 0xD1, + 0xA2, 0xCE, 0x78, 0x86, 0x22, 0xFC, 0x76, 0x00, 0x84, 0x1D, + 0xFA, 0x8B, 0x8A, 0xD2, 0x43, 0x93, 0x88, 0xFA, 0xEE, 0x22, + 0xCC, 0xA6, 0x86, 0xF5, 0x3F, 0x24, 0xF1, 0xD4, 0x70, 0x05, + 0x4F, 0x3B, 0x18, 0x32, 0x50, 0x67, 0xC1, 0x80, 0x77, 0x0D, + 0x3C, 0x78, 0x75, 0x35, 0xD0, 0xFD, 0x60, 0xF3, 0xED, 0xA1, + 0x30, 0xD0, 0x62, 0x25, 0x99, 0x6B, 0x80, 0x56, 0x17, 0x3D, + 0xB4, 0xAF, 0x1D, 0xDF, 0xAB, 0x48, 0x21, 0xC1, 0xD2, 0x0B, + 0x6B, 0x94, 0xA7, 0x33, 0xD1, 0xD0, 0x82, 0xB7, 0x3B, 0x92, + 0xEB, 0x9D, 0xD6, 0x6C, 0x32, 0x81, 0x5E, 0x07, 0x3C, 0x46, + 0x34, 0x32, 0x7B, 0xEA, 0x22, 0xDB, 0xA6, 0xA3, 0x18, 0x69, + 0x7C, 0xAD, 0x17, 0xE4, 0xC8, 0xA9, 0x8F, 0xA8, 0xBA, 0x67, + 0xAF, 0x99, 0x39, 0xEF, 0x6E, 0x0C, 0xF8, 0xA9, 0xB3, 0xBD, + 0xAB, 0x71, 0x94, 0xE0, 0x41, 0xAA, 0xA4, 0x2D, 0x72, 0x60, + 0x51, 0xD1, 0x5C }; static const int sizeof_client_cert_der_2048 = sizeof(client_cert_der_2048); @@ -1098,6 +1098,107 @@ }; static const int sizeof_dh_pub_key_der_2048 = sizeof(dh_pub_key_der_2048); +/* ./certs/statickeys/dh-ffdhe2048.der, 2048-bit */ +static const unsigned char dh_ffdhe_statickey_der_2048[] = +{ + 0x30, 0x82, 0x01, 0x3F, 0x02, 0x01, 0x00, 0x30, 0x82, 0x01, + 0x17, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, + 0x03, 0x01, 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, + 0xF8, 0x54, 0x58, 0xA2, 0xBB, 0x4A, 0x9A, 0xAF, 0xDC, 0x56, + 0x20, 0x27, 0x3D, 0x3C, 0xF1, 0xD8, 0xB9, 0xC5, 0x83, 0xCE, + 0x2D, 0x36, 0x95, 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, + 0xFB, 0xCC, 0x93, 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, 0x7D, + 0x2F, 0xE3, 0x63, 0x63, 0x0C, 0x75, 0xD8, 0xF6, 0x81, 0xB2, + 0x02, 0xAE, 0xC4, 0x61, 0x7A, 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, + 0xFD, 0x65, 0x61, 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, + 0xD0, 0x85, 0x63, 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, 0xB5, + 0x57, 0x13, 0x5E, 0x7F, 0x57, 0xC9, 0x35, 0x98, 0x4F, 0x0C, + 0x70, 0xE0, 0xE6, 0x8B, 0x77, 0xE2, 0xA6, 0x89, 0xDA, 0xF3, + 0xEF, 0xE8, 0x72, 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, + 0x35, 0x30, 0xAC, 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, 0xBC, + 0x0A, 0xB1, 0x82, 0xB3, 0x24, 0xFB, 0x61, 0xD1, 0x08, 0xA9, + 0x4B, 0xB2, 0xC8, 0xE3, 0xFB, 0xB9, 0x6A, 0xDA, 0xB7, 0x60, + 0xD7, 0xF4, 0x68, 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, + 0xF4, 0xAE, 0x56, 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, 0x0B, + 0x07, 0xA7, 0xC8, 0xEE, 0x0A, 0x6D, 0x70, 0x9E, 0x02, 0xFC, + 0xE1, 0xCD, 0xF7, 0xE2, 0xEC, 0xC0, 0x34, 0x04, 0xCD, 0x28, + 0x34, 0x2F, 0x61, 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, + 0xFF, 0x8E, 0x4F, 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, 0xC3, + 0xFE, 0x3B, 0x1B, 0x4C, 0x6F, 0xAD, 0x73, 0x3B, 0xB5, 0xFC, + 0xBC, 0x2E, 0xC2, 0x20, 0x05, 0xC5, 0x8E, 0xF1, 0x83, 0x7D, + 0x16, 0x83, 0xB2, 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, + 0xFA, 0x88, 0x6B, 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, + 0x04, 0x1F, 0x02, 0x1D, 0x5C, 0xFB, 0x86, 0xF7, 0xFA, 0x51, + 0x02, 0x79, 0x71, 0x9E, 0xC0, 0x29, 0x98, 0x03, 0xCF, 0x3E, + 0x65, 0x46, 0xF6, 0x34, 0xB8, 0xB0, 0xC1, 0x55, 0x3A, 0xF7, + 0xC8, 0x43, 0xB8 +}; +static const int sizeof_dh_ffdhe_statickey_der_2048 = sizeof(dh_ffdhe_statickey_der_2048); + +/* ./certs/statickeys/dh-ffdhe2048-pub.der, 2048-bit */ +static const unsigned char dh_ffdhe_pub_statickey_der_2048[] = +{ + 0x30, 0x82, 0x02, 0x24, 0x30, 0x82, 0x01, 0x17, 0x06, 0x09, + 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x03, 0x01, 0x30, + 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAD, 0xF8, 0x54, 0x58, + 0xA2, 0xBB, 0x4A, 0x9A, 0xAF, 0xDC, 0x56, 0x20, 0x27, 0x3D, + 0x3C, 0xF1, 0xD8, 0xB9, 0xC5, 0x83, 0xCE, 0x2D, 0x36, 0x95, + 0xA9, 0xE1, 0x36, 0x41, 0x14, 0x64, 0x33, 0xFB, 0xCC, 0x93, + 0x9D, 0xCE, 0x24, 0x9B, 0x3E, 0xF9, 0x7D, 0x2F, 0xE3, 0x63, + 0x63, 0x0C, 0x75, 0xD8, 0xF6, 0x81, 0xB2, 0x02, 0xAE, 0xC4, + 0x61, 0x7A, 0xD3, 0xDF, 0x1E, 0xD5, 0xD5, 0xFD, 0x65, 0x61, + 0x24, 0x33, 0xF5, 0x1F, 0x5F, 0x06, 0x6E, 0xD0, 0x85, 0x63, + 0x65, 0x55, 0x3D, 0xED, 0x1A, 0xF3, 0xB5, 0x57, 0x13, 0x5E, + 0x7F, 0x57, 0xC9, 0x35, 0x98, 0x4F, 0x0C, 0x70, 0xE0, 0xE6, + 0x8B, 0x77, 0xE2, 0xA6, 0x89, 0xDA, 0xF3, 0xEF, 0xE8, 0x72, + 0x1D, 0xF1, 0x58, 0xA1, 0x36, 0xAD, 0xE7, 0x35, 0x30, 0xAC, + 0xCA, 0x4F, 0x48, 0x3A, 0x79, 0x7A, 0xBC, 0x0A, 0xB1, 0x82, + 0xB3, 0x24, 0xFB, 0x61, 0xD1, 0x08, 0xA9, 0x4B, 0xB2, 0xC8, + 0xE3, 0xFB, 0xB9, 0x6A, 0xDA, 0xB7, 0x60, 0xD7, 0xF4, 0x68, + 0x1D, 0x4F, 0x42, 0xA3, 0xDE, 0x39, 0x4D, 0xF4, 0xAE, 0x56, + 0xED, 0xE7, 0x63, 0x72, 0xBB, 0x19, 0x0B, 0x07, 0xA7, 0xC8, + 0xEE, 0x0A, 0x6D, 0x70, 0x9E, 0x02, 0xFC, 0xE1, 0xCD, 0xF7, + 0xE2, 0xEC, 0xC0, 0x34, 0x04, 0xCD, 0x28, 0x34, 0x2F, 0x61, + 0x91, 0x72, 0xFE, 0x9C, 0xE9, 0x85, 0x83, 0xFF, 0x8E, 0x4F, + 0x12, 0x32, 0xEE, 0xF2, 0x81, 0x83, 0xC3, 0xFE, 0x3B, 0x1B, + 0x4C, 0x6F, 0xAD, 0x73, 0x3B, 0xB5, 0xFC, 0xBC, 0x2E, 0xC2, + 0x20, 0x05, 0xC5, 0x8E, 0xF1, 0x83, 0x7D, 0x16, 0x83, 0xB2, + 0xC6, 0xF3, 0x4A, 0x26, 0xC1, 0xB2, 0xEF, 0xFA, 0x88, 0x6B, + 0x42, 0x38, 0x61, 0x28, 0x5C, 0x97, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0x02, 0x01, 0x02, 0x03, 0x82, 0x01, + 0x05, 0x00, 0x02, 0x82, 0x01, 0x00, 0x4D, 0x3F, 0x4C, 0xE4, + 0x6C, 0x46, 0x71, 0xFF, 0x61, 0x02, 0x73, 0x0B, 0x65, 0x4F, + 0x46, 0xE7, 0x2E, 0x0F, 0x9E, 0x41, 0x04, 0x55, 0x41, 0x51, + 0x89, 0xA9, 0x5E, 0x84, 0xBC, 0x7A, 0x0A, 0x35, 0x34, 0x15, + 0xBE, 0xB1, 0xC3, 0x1E, 0xCD, 0xC7, 0x5A, 0x17, 0x98, 0x5F, + 0xFF, 0x96, 0x3D, 0x1B, 0x9B, 0xFA, 0xCC, 0x1F, 0x1E, 0xA7, + 0x22, 0x8B, 0x95, 0xEE, 0x2B, 0xD4, 0x74, 0xE2, 0x63, 0xE2, + 0xFD, 0x9C, 0xAA, 0x4F, 0xBE, 0x64, 0x69, 0x83, 0x31, 0x5E, + 0x90, 0x5C, 0x85, 0x5D, 0xB2, 0x99, 0xE0, 0x05, 0xB5, 0xF2, + 0xB6, 0x19, 0xCD, 0x06, 0xCD, 0xA8, 0xB3, 0x59, 0x8D, 0x87, + 0x84, 0x7F, 0x8F, 0x09, 0xEE, 0xBD, 0x61, 0x6F, 0xC5, 0xCD, + 0xB8, 0x9C, 0xA7, 0x15, 0x97, 0xD0, 0x44, 0x2E, 0x2D, 0x2E, + 0x32, 0x20, 0xC5, 0x3B, 0xDF, 0x50, 0x6F, 0x8D, 0x17, 0xB8, + 0x84, 0xA3, 0x67, 0x24, 0x7E, 0xA3, 0xEC, 0x8C, 0x08, 0x78, + 0x6C, 0x25, 0x88, 0x02, 0xD3, 0xA0, 0x68, 0xCE, 0x1A, 0x25, + 0x46, 0x2E, 0x9B, 0x4C, 0x82, 0xF4, 0xEB, 0xB3, 0xC9, 0x1D, + 0x17, 0x0C, 0x92, 0x94, 0x54, 0x0F, 0xB5, 0xDF, 0x3F, 0x71, + 0x45, 0x33, 0x97, 0x4D, 0x87, 0x1A, 0x4B, 0x40, 0x0A, 0x71, + 0xB4, 0x19, 0xBE, 0x33, 0xBD, 0xCF, 0xF3, 0x15, 0x63, 0x06, + 0x37, 0x5C, 0xA1, 0x9D, 0xC0, 0xE7, 0xA7, 0x8B, 0xD3, 0xA2, + 0x6B, 0x3F, 0xF1, 0x42, 0xC8, 0x36, 0x6B, 0x0A, 0x43, 0x8B, + 0xE9, 0xD0, 0x8C, 0xCD, 0x0F, 0x31, 0xCD, 0x22, 0xE7, 0x39, + 0xC8, 0x8D, 0xEB, 0x5D, 0x91, 0x8B, 0x06, 0x6E, 0x1F, 0x07, + 0xDB, 0xAB, 0x2B, 0x4F, 0x85, 0xF8, 0xBB, 0x55, 0xE3, 0xBD, + 0x70, 0x51, 0x5C, 0x73, 0x66, 0x5D, 0xD1, 0xB6, 0xF8, 0x44, + 0x10, 0xE0, 0xF2, 0x09, 0x1C, 0x6D, 0x02, 0x5D, 0xFC, 0x7A, + 0x08, 0x82 +}; +static const int sizeof_dh_ffdhe_pub_statickey_der_2048 = sizeof(dh_ffdhe_pub_statickey_der_2048); + /* ./certs/dsa-pubkey-2048.der, 2048-bit */ static const unsigned char dsa_pub_key_der_2048[] = { @@ -1535,9 +1636,9 @@ static const unsigned char ca_cert_der_2048[] = { 0x30, 0x82, 0x04, 0xFF, 0x30, 0x82, 0x03, 0xE7, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x2C, 0x80, 0xCE, 0xDB, 0x47, - 0x9D, 0x07, 0x66, 0x92, 0x3D, 0x68, 0xD7, 0xCA, 0xAC, 0x90, - 0x4F, 0xCA, 0x69, 0x41, 0x4B, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x33, 0x44, 0x1A, 0xA8, 0x6C, + 0x01, 0xEC, 0xF6, 0x60, 0xF2, 0x70, 0x51, 0x0A, 0x4C, 0xD1, + 0x14, 0xFA, 0xBC, 0xE9, 0x44, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -1554,10 +1655,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, @@ -1625,9 +1726,9 @@ 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x82, 0x14, 0x2C, 0x80, 0xCE, 0xDB, 0x47, 0x9D, 0x07, 0x66, - 0x92, 0x3D, 0x68, 0xD7, 0xCA, 0xAC, 0x90, 0x4F, 0xCA, 0x69, - 0x41, 0x4B, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, + 0x82, 0x14, 0x33, 0x44, 0x1A, 0xA8, 0x6C, 0x01, 0xEC, 0xF6, + 0x60, 0xF2, 0x70, 0x51, 0x0A, 0x4C, 0xD1, 0x14, 0xFA, 0xBC, + 0xE9, 0x44, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, @@ -1636,33 +1737,33 @@ 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xAE, 0xB0, 0xA4, - 0x35, 0x8E, 0x8A, 0x1B, 0xA6, 0xEB, 0xB3, 0xA2, 0x57, 0xCF, - 0x3A, 0x1F, 0xDC, 0x6E, 0xBC, 0xD2, 0xD0, 0xA6, 0x4A, 0x8F, - 0x88, 0x0A, 0x6E, 0x74, 0xD5, 0xD1, 0x7C, 0xD1, 0x44, 0xB1, - 0xD4, 0x3B, 0x17, 0x03, 0x09, 0x5A, 0x46, 0xED, 0x08, 0x08, - 0xCF, 0xF1, 0xFD, 0x20, 0x07, 0x67, 0xC0, 0x97, 0xEC, 0x35, - 0xF3, 0x75, 0xCA, 0x20, 0x61, 0x98, 0x3E, 0xF5, 0x4D, 0xBE, - 0xE6, 0x9D, 0x75, 0x1E, 0xE4, 0x03, 0xAD, 0x8C, 0xA6, 0x1E, - 0x3D, 0xEC, 0xE4, 0x1A, 0x92, 0x5B, 0xF9, 0xA3, 0xAD, 0x83, - 0xCA, 0x4F, 0xCD, 0xAA, 0x38, 0xBB, 0x6E, 0xAE, 0xAD, 0xFA, - 0xA7, 0x46, 0xF1, 0x8B, 0x73, 0xEC, 0x09, 0x23, 0xBC, 0xF2, - 0x18, 0xE5, 0xB7, 0x92, 0x86, 0x3E, 0xA4, 0x75, 0x60, 0xC7, - 0x3D, 0x0F, 0x3F, 0x83, 0x00, 0xC3, 0x06, 0x08, 0x9C, 0xD1, - 0x54, 0xD6, 0xBA, 0x6D, 0x95, 0x3D, 0x34, 0xA1, 0xBE, 0x24, - 0x91, 0xCC, 0x20, 0x03, 0x11, 0x5B, 0x72, 0x1C, 0xD4, 0x65, - 0xD0, 0x11, 0x88, 0x75, 0x26, 0x04, 0x26, 0xEF, 0x66, 0x70, - 0xE6, 0x3B, 0x38, 0x87, 0x9C, 0x53, 0x71, 0x1B, 0x09, 0x51, - 0x70, 0x50, 0x99, 0x4C, 0x31, 0x0C, 0x62, 0x44, 0x57, 0x30, - 0x60, 0x04, 0xFC, 0x12, 0x2C, 0xA3, 0x24, 0xB4, 0xF7, 0x11, - 0xD5, 0x0E, 0xB5, 0x21, 0x0B, 0xED, 0x86, 0x11, 0x67, 0x4D, - 0x36, 0xFA, 0x57, 0xA0, 0x59, 0x55, 0x21, 0xB3, 0x6D, 0xE4, - 0x77, 0x5E, 0xEC, 0x7E, 0xF0, 0x09, 0x13, 0x8E, 0x99, 0x98, - 0xB2, 0xE1, 0x82, 0xB6, 0x4B, 0x3E, 0x0F, 0x41, 0xA6, 0x0C, - 0xCD, 0x49, 0x99, 0x7E, 0xE4, 0x8A, 0xCB, 0x37, 0xED, 0x53, - 0xCF, 0x86, 0x5D, 0xA9, 0x26, 0xA8, 0xE5, 0x01, 0x25, 0x5A, - 0xB4, 0xBC, 0x25, 0x35, 0xF1, 0xFA, 0x5A, 0x5C, 0xCE, 0xD4, - 0xB8, 0x9A, 0x2C + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x2D, 0xFC, 0xF9, + 0x32, 0x5A, 0xBE, 0xD6, 0x9D, 0x42, 0x8B, 0x86, 0x4E, 0x67, + 0x22, 0xC3, 0x50, 0x2D, 0xCB, 0x14, 0x27, 0x1D, 0x94, 0xF3, + 0xCD, 0x88, 0x42, 0xDA, 0x41, 0x1C, 0x39, 0x24, 0x67, 0xA7, + 0x92, 0x4D, 0x27, 0xEA, 0x56, 0x82, 0x19, 0xBF, 0x11, 0xB2, + 0x43, 0xA4, 0x8D, 0x5D, 0x87, 0xB2, 0x27, 0x64, 0x66, 0x82, + 0x81, 0xDF, 0xC4, 0xFD, 0x5B, 0x62, 0xB0, 0xC2, 0x4D, 0x9D, + 0x29, 0xF2, 0x41, 0x32, 0xCC, 0x2E, 0xB5, 0xDA, 0x38, 0x06, + 0x1B, 0xE8, 0x7F, 0x8C, 0x6E, 0x3D, 0x80, 0x1E, 0x00, 0x56, + 0x49, 0xBF, 0x39, 0xE0, 0xDA, 0x68, 0x2F, 0xC4, 0xFD, 0x00, + 0xE6, 0xD1, 0x81, 0x1A, 0xD1, 0x4A, 0xBB, 0x76, 0x52, 0xCE, + 0x4D, 0x24, 0x9D, 0xC4, 0xA3, 0xA7, 0xF1, 0x65, 0x14, 0x2F, + 0x1F, 0xA8, 0x2D, 0xC6, 0xCB, 0xCE, 0xB1, 0xA7, 0x89, 0x74, + 0x26, 0x27, 0xC3, 0xF3, 0xA3, 0x84, 0x4C, 0x34, 0x01, 0x14, + 0x03, 0x7D, 0x16, 0x3A, 0xC8, 0x8B, 0x25, 0x2E, 0x7B, 0x90, + 0xCC, 0x46, 0xB1, 0x52, 0x34, 0xBA, 0x93, 0x6E, 0xEF, 0xFE, + 0x43, 0xA3, 0xAD, 0xC6, 0x6F, 0x51, 0xFB, 0xBA, 0xEA, 0x38, + 0xE3, 0x6F, 0xD6, 0xEE, 0x63, 0x62, 0x36, 0xEA, 0x5E, 0x08, + 0xB4, 0xE2, 0x2A, 0x46, 0x89, 0xE3, 0xAE, 0xB3, 0xB4, 0x06, + 0xEF, 0x63, 0x7A, 0x6E, 0x5D, 0xDD, 0xC9, 0xEC, 0x02, 0x4F, + 0xF7, 0x64, 0xC0, 0x27, 0x07, 0xB4, 0x6F, 0x4A, 0x18, 0x72, + 0x5B, 0x34, 0x74, 0x7C, 0xD0, 0xA9, 0x04, 0x8F, 0x40, 0x8B, + 0x6A, 0x39, 0xD2, 0x6B, 0x1A, 0x01, 0xF2, 0x01, 0xA8, 0x81, + 0x34, 0x3A, 0xE5, 0xB0, 0x55, 0xD1, 0x3C, 0x95, 0xCA, 0xB0, + 0x82, 0xD6, 0xED, 0x98, 0x28, 0x15, 0x59, 0x7E, 0x95, 0xA7, + 0x69, 0xC7, 0xB5, 0x7B, 0xEC, 0x01, 0xA7, 0x4D, 0xE6, 0xB9, + 0xA2, 0xFE, 0x35 }; static const int sizeof_ca_cert_der_2048 = sizeof(ca_cert_der_2048); @@ -1670,9 +1771,9 @@ static const unsigned char ca_cert_chain_der[] = { 0x30, 0x82, 0x03, 0xFA, 0x30, 0x82, 0x03, 0x63, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x5C, 0x79, 0xE0, 0x7D, 0x3D, - 0xBC, 0xB0, 0xFE, 0x85, 0xCF, 0xA0, 0x28, 0xE9, 0xF6, 0x27, - 0xDD, 0x0C, 0xBF, 0xA3, 0x36, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x5D, 0x82, 0xE6, 0x32, 0x61, + 0xE7, 0x3B, 0x5E, 0x77, 0x3D, 0xDA, 0xA6, 0xF3, 0xFC, 0x54, + 0xB5, 0x04, 0xD4, 0x10, 0x4E, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -1689,10 +1790,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x94, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, @@ -1747,8 +1848,8 @@ 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, - 0x5C, 0x79, 0xE0, 0x7D, 0x3D, 0xBC, 0xB0, 0xFE, 0x85, 0xCF, - 0xA0, 0x28, 0xE9, 0xF6, 0x27, 0xDD, 0x0C, 0xBF, 0xA3, 0x36, + 0x5D, 0x82, 0xE6, 0x32, 0x61, 0xE7, 0x3B, 0x5E, 0x77, 0x3D, + 0xDA, 0xA6, 0xF3, 0xFC, 0x54, 0xB5, 0x04, 0xD4, 0x10, 0x4E, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, @@ -1758,20 +1859,20 @@ 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, - 0x03, 0x81, 0x81, 0x00, 0x84, 0x96, 0x5D, 0x69, 0x2C, 0xEF, - 0x4C, 0x96, 0xD6, 0x90, 0xB8, 0xE5, 0x98, 0x2F, 0x35, 0x84, - 0xE3, 0x05, 0x83, 0xE2, 0x69, 0xA3, 0xBF, 0x39, 0xF8, 0xD3, - 0x2A, 0xB5, 0x50, 0x16, 0xCB, 0xD6, 0x02, 0x5B, 0x1B, 0x9B, - 0x7F, 0x84, 0x87, 0xB0, 0x71, 0xC3, 0xC5, 0xC6, 0xDF, 0xBF, - 0xAE, 0xC5, 0x19, 0x18, 0x23, 0x5E, 0x71, 0x52, 0xED, 0x00, - 0xC5, 0x75, 0x22, 0xDA, 0x46, 0x3A, 0x80, 0x7C, 0xF9, 0x63, - 0xE7, 0x15, 0x6D, 0xD5, 0x0B, 0x1C, 0x0A, 0x9C, 0xCC, 0x23, - 0xEC, 0x51, 0xAE, 0x2B, 0xB5, 0x47, 0x02, 0x42, 0xF4, 0x8E, - 0x06, 0x89, 0xE9, 0x71, 0x52, 0x16, 0x04, 0x0C, 0xBC, 0xC8, - 0x05, 0x2A, 0xE5, 0xAC, 0xE8, 0x0F, 0xC8, 0xCD, 0x22, 0x02, - 0x7E, 0x7A, 0x63, 0x55, 0x10, 0x0B, 0x8C, 0xB9, 0x02, 0x9B, - 0x17, 0x62, 0xA7, 0x84, 0x26, 0x24, 0xDB, 0xEF, 0x34, 0x1E, - 0xF9, 0x0D + 0x03, 0x81, 0x81, 0x00, 0x23, 0x19, 0xF7, 0x04, 0xB7, 0x99, + 0x84, 0x86, 0xCE, 0x45, 0x9E, 0xA4, 0x55, 0x2D, 0x14, 0xAC, + 0xC5, 0x1C, 0x2D, 0x2F, 0x8D, 0xD3, 0x14, 0x81, 0x91, 0x27, + 0x1C, 0x0C, 0x3C, 0x44, 0x14, 0x8B, 0x99, 0x46, 0xF2, 0x43, + 0xB3, 0x51, 0x33, 0x1B, 0xFA, 0x77, 0x95, 0x07, 0x5C, 0xE4, + 0x3C, 0x11, 0x17, 0x55, 0x57, 0xBF, 0x9D, 0xF4, 0xB5, 0xD4, + 0xAD, 0x7C, 0xB1, 0x82, 0x62, 0x77, 0xC8, 0xAA, 0x02, 0xEE, + 0x73, 0xEE, 0x77, 0x67, 0xD5, 0xB5, 0x58, 0xD7, 0x19, 0x6F, + 0x0F, 0xFD, 0x8B, 0xFC, 0xD4, 0x32, 0xFF, 0x86, 0x48, 0xF8, + 0x49, 0x5B, 0xD8, 0xF1, 0xFB, 0x36, 0x28, 0x27, 0xC1, 0x7D, + 0xDD, 0x0F, 0xFF, 0x7F, 0x95, 0x16, 0x5B, 0x85, 0xCA, 0x3E, + 0x9B, 0xDC, 0x78, 0xB7, 0x6B, 0xB1, 0xF1, 0x75, 0xFA, 0x61, + 0xDA, 0xCE, 0x8A, 0x4E, 0x5F, 0x90, 0x7C, 0x38, 0x9E, 0x31, + 0x00, 0x66 }; static const int sizeof_ca_cert_chain_der = sizeof(ca_cert_chain_der); @@ -1922,10 +2023,10 @@ 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, - 0x31, 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, - 0x0D, 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, - 0x37, 0x34, 0x39, 0x5A, 0x30, 0x81, 0x90, 0x31, 0x0B, 0x30, + 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, + 0x31, 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, + 0x0D, 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, + 0x39, 0x32, 0x38, 0x5A, 0x30, 0x81, 0x90, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, @@ -1992,9 +2093,9 @@ 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x2C, - 0x80, 0xCE, 0xDB, 0x47, 0x9D, 0x07, 0x66, 0x92, 0x3D, 0x68, - 0xD7, 0xCA, 0xAC, 0x90, 0x4F, 0xCA, 0x69, 0x41, 0x4B, 0x30, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x33, + 0x44, 0x1A, 0xA8, 0x6C, 0x01, 0xEC, 0xF6, 0x60, 0xF2, 0x70, + 0x51, 0x0A, 0x4C, 0xD1, 0x14, 0xFA, 0xBC, 0xE9, 0x44, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, @@ -2004,32 +2105,32 @@ 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0xB9, 0x10, 0xF0, 0xBE, 0xFE, 0xC8, - 0x67, 0x5E, 0x7D, 0x0F, 0x36, 0x33, 0xC7, 0x17, 0x2A, 0x01, - 0xC4, 0xBB, 0x74, 0x83, 0x4C, 0xBC, 0xBB, 0xE2, 0xBA, 0x92, - 0x82, 0x3A, 0xD9, 0x2D, 0x8C, 0x0E, 0xE3, 0x75, 0x1B, 0xC0, - 0x14, 0xAA, 0x40, 0x1E, 0xA8, 0x11, 0x7D, 0x94, 0x9C, 0x3D, - 0x74, 0x7A, 0x3B, 0x16, 0x7B, 0xD8, 0x9D, 0xF0, 0xE8, 0x7D, - 0x1D, 0xFA, 0x3B, 0x14, 0x42, 0x20, 0xE3, 0x05, 0xA3, 0xFD, - 0xB1, 0x0C, 0xF1, 0x2A, 0xC4, 0x00, 0x50, 0x8D, 0x1E, 0x97, - 0x93, 0x6A, 0xDE, 0x82, 0x13, 0x24, 0x9E, 0x2B, 0xFA, 0x08, - 0x85, 0xE3, 0x4F, 0x40, 0xFD, 0x63, 0xC7, 0x3D, 0xE9, 0xBD, - 0x6F, 0x7C, 0x03, 0x98, 0x85, 0xFE, 0xB4, 0x51, 0x5D, 0x7F, - 0x8C, 0x83, 0xB3, 0xAD, 0x4A, 0x88, 0xE9, 0xF3, 0x4C, 0x33, - 0x84, 0x77, 0xD3, 0x02, 0x35, 0x59, 0xE3, 0x4E, 0x64, 0xA1, - 0xB7, 0xBB, 0xFB, 0xF8, 0xFB, 0x14, 0x2A, 0xAE, 0x36, 0xBF, - 0xD9, 0x82, 0xE7, 0xCB, 0x98, 0x48, 0x16, 0xC8, 0x81, 0xD6, - 0xA0, 0xF1, 0x74, 0x14, 0xE3, 0x74, 0x4A, 0x72, 0x4A, 0xF1, - 0x6F, 0xDD, 0xBE, 0x86, 0x1E, 0x20, 0xF3, 0x05, 0x16, 0x83, - 0x1F, 0xAA, 0x7C, 0x59, 0x35, 0x97, 0x24, 0xB8, 0x27, 0xB7, - 0x56, 0x9F, 0x30, 0x2E, 0x90, 0xE0, 0x19, 0xE0, 0x21, 0xCA, - 0x9D, 0x3F, 0xDA, 0x99, 0x07, 0x94, 0x79, 0x49, 0x53, 0x14, - 0x5C, 0xA2, 0x2C, 0x56, 0x5B, 0xB2, 0x55, 0x68, 0x5C, 0x1F, - 0x91, 0x58, 0x9A, 0xCD, 0x53, 0xB5, 0xEA, 0x63, 0x5A, 0x72, - 0x49, 0x41, 0xCC, 0x76, 0x9F, 0x88, 0x35, 0x86, 0x0D, 0x60, - 0x5D, 0xE5, 0x91, 0xBD, 0xAC, 0x6F, 0xCF, 0xD5, 0x92, 0x27, - 0x72, 0x4A, 0x21, 0xF4, 0x58, 0x98, 0x8E, 0x3B, 0xD2, 0x29, - 0xE6, 0xEE, 0xFA, 0xE6, 0xB0, 0x6C, 0x8B, 0x1E, 0xE0, 0x54 + 0x82, 0x01, 0x01, 0x00, 0x4A, 0xFF, 0xB9, 0xE5, 0x85, 0x9B, + 0xDA, 0x53, 0x66, 0x7F, 0x07, 0x22, 0xBF, 0xB6, 0x19, 0xEA, + 0x42, 0xEB, 0xA4, 0x11, 0x07, 0x62, 0xFF, 0x39, 0x5F, 0x33, + 0x37, 0x3A, 0x87, 0x26, 0x71, 0x3D, 0x13, 0xB2, 0xCA, 0xB8, + 0x64, 0x38, 0x7B, 0x8A, 0x99, 0x48, 0x0E, 0xA5, 0xA4, 0x6B, + 0xB1, 0x99, 0x6E, 0xE0, 0x46, 0x51, 0xBD, 0x19, 0x52, 0xAD, + 0xBC, 0xA6, 0x7E, 0x2A, 0x7A, 0x7C, 0x23, 0xA7, 0xCC, 0xDB, + 0x5E, 0x43, 0x7D, 0x6B, 0x04, 0xC8, 0xB7, 0xDD, 0x95, 0xAD, + 0xF0, 0x91, 0x80, 0x59, 0xC5, 0x19, 0x91, 0x26, 0x27, 0x91, + 0xB8, 0x48, 0x1C, 0xEB, 0x55, 0xB6, 0xAA, 0x7D, 0xA4, 0x38, + 0xF1, 0x03, 0xBC, 0x6C, 0x8B, 0xAA, 0x94, 0xD6, 0x3C, 0x05, + 0x7A, 0x96, 0xC5, 0x06, 0xF1, 0x26, 0x14, 0x2E, 0x75, 0xFB, + 0xDD, 0xE5, 0x35, 0xB3, 0x01, 0x2C, 0xB3, 0xAD, 0x62, 0x5A, + 0x21, 0x9A, 0x08, 0xBE, 0x56, 0xFC, 0xF9, 0xA2, 0x42, 0x87, + 0x86, 0xE5, 0xA9, 0xC5, 0x99, 0xCF, 0xAE, 0x14, 0xBE, 0xE0, + 0xB9, 0x08, 0x24, 0x0D, 0x1D, 0x5C, 0xD6, 0x14, 0xE1, 0x4C, + 0x9F, 0x40, 0xB3, 0xA9, 0xE9, 0x2D, 0x52, 0x8B, 0x4C, 0xBF, + 0xAC, 0x44, 0x31, 0x67, 0xC1, 0x8D, 0x06, 0x85, 0xEC, 0x0F, + 0xE4, 0x99, 0xD7, 0x4B, 0x7B, 0x21, 0x06, 0x66, 0xD4, 0xE4, + 0xF5, 0x9D, 0xFF, 0x8E, 0xF0, 0x86, 0x39, 0x58, 0x1D, 0xA4, + 0x5B, 0xE2, 0x63, 0xEF, 0x7C, 0xC9, 0x18, 0x87, 0xA8, 0x02, + 0x25, 0x10, 0x3E, 0x87, 0x28, 0xF9, 0xF5, 0xEF, 0x47, 0x9E, + 0xA5, 0x80, 0x08, 0x11, 0x90, 0x68, 0xFE, 0xD1, 0xA3, 0xA8, + 0x51, 0xB9, 0x37, 0xFF, 0xD5, 0xCA, 0x7C, 0x87, 0x7F, 0x6B, + 0xBC, 0x2C, 0x12, 0xC8, 0xC5, 0x85, 0x8B, 0xFC, 0x0C, 0xC6, + 0xB9, 0x86, 0xB8, 0xC9, 0x04, 0xC3, 0x51, 0x37, 0xD2, 0x4F }; static const int sizeof_server_cert_der_2048 = sizeof(server_cert_der_2048); @@ -2634,9 +2735,9 @@ static const unsigned char client_cert_der_3072[] = { 0x30, 0x82, 0x06, 0x1D, 0x30, 0x82, 0x04, 0x85, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x03, 0x33, 0x56, 0x6E, 0x5F, - 0xE0, 0x69, 0x69, 0x99, 0x6B, 0xEB, 0xD0, 0xEB, 0x47, 0xCF, - 0xF2, 0x05, 0x3F, 0x98, 0x15, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x0B, 0x5C, 0x9F, 0x12, 0x25, + 0x90, 0xAA, 0x52, 0xC0, 0xDF, 0xE1, 0xE1, 0x1F, 0xED, 0xA9, + 0x31, 0x01, 0x0A, 0x09, 0x8B, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, @@ -2654,10 +2755,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, @@ -2740,8 +2841,8 @@ 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, - 0x03, 0x33, 0x56, 0x6E, 0x5F, 0xE0, 0x69, 0x69, 0x99, 0x6B, - 0xEB, 0xD0, 0xEB, 0x47, 0xCF, 0xF2, 0x05, 0x3F, 0x98, 0x15, + 0x0B, 0x5C, 0x9F, 0x12, 0x25, 0x90, 0xAA, 0x52, 0xC0, 0xDF, + 0xE1, 0xE1, 0x1F, 0xED, 0xA9, 0x31, 0x01, 0x0A, 0x09, 0x8B, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, @@ -2751,45 +2852,45 @@ 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, - 0x03, 0x82, 0x01, 0x81, 0x00, 0x90, 0xE4, 0x43, 0x8E, 0xBE, - 0x9D, 0xDE, 0x45, 0x4E, 0xDF, 0xDF, 0x8D, 0xE7, 0x7C, 0x2D, - 0x1B, 0xA9, 0x1A, 0xEF, 0x90, 0x15, 0xFB, 0xD3, 0xA9, 0x99, - 0xA8, 0x5B, 0xD7, 0xF9, 0xB8, 0x95, 0x19, 0xFE, 0xE0, 0x00, - 0x09, 0xC1, 0xE3, 0xE8, 0x27, 0x82, 0x11, 0x7C, 0x39, 0x23, - 0x92, 0x38, 0x45, 0x86, 0x6D, 0x77, 0xC2, 0x83, 0x8C, 0x1A, - 0x0F, 0x4B, 0xC5, 0x94, 0x0D, 0xE9, 0x17, 0x28, 0x8C, 0xCF, - 0x8F, 0x6D, 0xE9, 0x43, 0x82, 0x0F, 0x31, 0x67, 0xBB, 0xD5, - 0xD7, 0x3F, 0x0B, 0xCE, 0xCE, 0x22, 0xF4, 0xA8, 0x5B, 0x84, - 0x8D, 0xFD, 0xD2, 0xCB, 0xD6, 0xDC, 0xEE, 0x31, 0xF3, 0xE7, - 0x26, 0xB7, 0x58, 0x6A, 0xC5, 0x9E, 0xFF, 0x89, 0x5F, 0xF6, - 0x70, 0xFB, 0x6B, 0x02, 0xBA, 0x79, 0x6A, 0x9A, 0x12, 0x1B, - 0x82, 0x94, 0x1B, 0x02, 0x22, 0x30, 0x7D, 0x74, 0x44, 0x46, - 0x25, 0x85, 0xA1, 0xA8, 0x7D, 0xA0, 0xAB, 0xC3, 0xA7, 0x9E, - 0x08, 0xA3, 0xD7, 0x5C, 0x42, 0xA2, 0xAF, 0x96, 0x42, 0x9C, - 0x76, 0x9B, 0x8D, 0xEC, 0x08, 0x68, 0x71, 0x95, 0x92, 0xA5, - 0xB9, 0xAA, 0x12, 0xF9, 0xC5, 0x62, 0xAC, 0x8E, 0x4F, 0xDF, - 0xCC, 0xB7, 0x53, 0xE3, 0xC4, 0x70, 0x74, 0x9B, 0x38, 0xD2, - 0xE9, 0xDA, 0x3F, 0xEF, 0xC4, 0x55, 0x01, 0x9A, 0xB9, 0x3E, - 0xC4, 0x33, 0xE7, 0x33, 0xDB, 0x0F, 0xBA, 0x55, 0x84, 0x0F, - 0x3C, 0x4C, 0xA5, 0x85, 0xEC, 0x5A, 0xF2, 0x98, 0x75, 0xE0, - 0xEB, 0x47, 0xB8, 0x4B, 0xD3, 0x85, 0x63, 0xDC, 0xB0, 0x29, - 0x85, 0x51, 0x62, 0xBF, 0x6A, 0x61, 0x9B, 0x40, 0x01, 0x66, - 0x0D, 0x72, 0x42, 0xBD, 0x4F, 0xE0, 0xC6, 0x31, 0xA6, 0x06, - 0xDF, 0xC1, 0xE9, 0x8A, 0xA0, 0x57, 0xC7, 0x4D, 0x4F, 0xE7, - 0xC0, 0x45, 0x7F, 0x7F, 0xA7, 0x53, 0xCA, 0x90, 0x1D, 0x70, - 0xA8, 0x46, 0x95, 0x99, 0xEF, 0x19, 0xEE, 0xE2, 0x45, 0x35, - 0x1A, 0xDC, 0x0D, 0xCB, 0xC3, 0xB0, 0xD5, 0x88, 0x8B, 0xB9, - 0x9F, 0xB5, 0xEA, 0xC1, 0xFE, 0x5E, 0x7A, 0xC1, 0x83, 0xC8, - 0x74, 0xF5, 0x1A, 0x29, 0x52, 0x38, 0x5D, 0x14, 0xEA, 0x17, - 0x2D, 0x39, 0xF6, 0x19, 0x16, 0xC4, 0x91, 0xB0, 0xE7, 0x18, - 0x36, 0x56, 0xA0, 0x64, 0x75, 0x8D, 0x66, 0x57, 0x48, 0x1B, - 0x38, 0xF2, 0xA0, 0x01, 0xB1, 0x44, 0x32, 0x34, 0xA5, 0x0E, - 0xBC, 0x28, 0x46, 0x77, 0xED, 0x65, 0xC1, 0x75, 0x34, 0xF8, - 0x06, 0x12, 0x45, 0x1A, 0x70, 0x78, 0x81, 0xD1, 0x55, 0x27, - 0xCF, 0xAD, 0xB3, 0xD4, 0x5A, 0x97, 0x43, 0x88, 0x02, 0xBB, - 0x93, 0xBA, 0x17, 0x42, 0x51, 0x59, 0x52, 0x13, 0xEC, 0xFC, - 0xEF, 0x6B, 0x53, 0xF7, 0xF2, 0x41, 0x8A, 0x42, 0x06, 0x56, - 0xE2, 0xF4, 0x97, 0xD2, 0x22, 0x31, 0x02, 0x2A, 0x47 + 0x03, 0x82, 0x01, 0x81, 0x00, 0x14, 0x27, 0x57, 0x47, 0x12, + 0xA4, 0x78, 0xA2, 0xC9, 0xDC, 0x93, 0xF8, 0x47, 0xEE, 0xF4, + 0xFD, 0x66, 0x80, 0x13, 0x43, 0x9E, 0xDE, 0x23, 0x8C, 0xF7, + 0x3F, 0xFE, 0x46, 0x9C, 0x85, 0x58, 0x2A, 0x6F, 0x8D, 0x22, + 0x92, 0x8C, 0xD6, 0x36, 0xCA, 0x90, 0x4F, 0x45, 0xC3, 0xAB, + 0x78, 0xCA, 0x3C, 0xFE, 0xD0, 0xF5, 0x0F, 0x6D, 0x00, 0xFE, + 0x3B, 0x42, 0xB0, 0x86, 0x0B, 0x75, 0xF2, 0x7C, 0xD3, 0xC7, + 0xDB, 0x0B, 0x70, 0xE8, 0xEC, 0xB7, 0xBF, 0x26, 0x30, 0xA8, + 0x19, 0x67, 0xBD, 0x74, 0x03, 0xCF, 0xD1, 0x08, 0x8E, 0x9C, + 0xD5, 0x1B, 0x45, 0x28, 0xB2, 0x67, 0x8E, 0x3A, 0xA5, 0x27, + 0xC9, 0x1B, 0x6A, 0xE9, 0x93, 0xCE, 0x94, 0xC0, 0x00, 0x0C, + 0xE8, 0xF1, 0x76, 0x02, 0xA4, 0x30, 0x72, 0xA8, 0xFD, 0x55, + 0x1C, 0xD1, 0xB8, 0x25, 0xF1, 0x62, 0xF6, 0xBA, 0x28, 0xFD, + 0x30, 0xB1, 0x11, 0x63, 0xF7, 0xB3, 0x78, 0x54, 0x09, 0x04, + 0xC1, 0x66, 0x12, 0xC7, 0x01, 0xAE, 0x99, 0xE3, 0x55, 0xC4, + 0x29, 0xBD, 0x1B, 0x1A, 0xDA, 0xB9, 0x77, 0xFD, 0x04, 0xDB, + 0xB1, 0x68, 0x56, 0x35, 0x65, 0xE1, 0xAA, 0x67, 0xC8, 0xAC, + 0xBE, 0xE5, 0xF8, 0x27, 0xFB, 0xB4, 0x51, 0x4F, 0x38, 0xE5, + 0xDE, 0x09, 0xA6, 0x81, 0xA9, 0xEF, 0xDC, 0xD6, 0x4A, 0x96, + 0x47, 0xB8, 0x38, 0x14, 0xF8, 0x25, 0x5D, 0xAC, 0xF3, 0xE5, + 0x3B, 0xF2, 0x1B, 0x70, 0x32, 0x3B, 0x2D, 0xFA, 0x20, 0xCA, + 0x2E, 0xA5, 0xCA, 0x13, 0x9D, 0x84, 0xD2, 0xD4, 0x35, 0x16, + 0x58, 0x6E, 0x52, 0x5E, 0x09, 0x61, 0x83, 0xC2, 0xE2, 0x56, + 0x2C, 0xAB, 0x52, 0xBF, 0x54, 0xDC, 0xBD, 0xF3, 0xBF, 0xA7, + 0x16, 0x6E, 0x0E, 0xCA, 0x68, 0x54, 0xD1, 0x5C, 0x4D, 0x06, + 0x7A, 0x93, 0x47, 0x1C, 0xCC, 0xA9, 0x66, 0xDA, 0x69, 0x0F, + 0xF9, 0x1F, 0x25, 0x64, 0x29, 0x40, 0x97, 0x50, 0x3B, 0xCF, + 0x0C, 0x50, 0x9B, 0x4D, 0xFF, 0x60, 0xBC, 0xD3, 0xE4, 0xA0, + 0xB7, 0x64, 0xC6, 0x66, 0x2A, 0xF6, 0x02, 0xE2, 0x3F, 0x92, + 0x31, 0x3B, 0xD7, 0xEA, 0x1A, 0xC3, 0x1A, 0x0C, 0x19, 0x88, + 0xAB, 0x5F, 0x74, 0xB7, 0x9D, 0x7B, 0x8D, 0x4D, 0x3A, 0x84, + 0x43, 0xF2, 0x67, 0xB1, 0xBE, 0xA0, 0x9E, 0xFD, 0x3D, 0xAA, + 0xC1, 0x38, 0x1A, 0xDF, 0xAC, 0x30, 0xFE, 0x63, 0x69, 0xAF, + 0xD6, 0xF2, 0x21, 0x63, 0x11, 0x63, 0x29, 0xAC, 0x63, 0x9E, + 0x9F, 0x9F, 0xC4, 0x53, 0xB3, 0xDB, 0x78, 0xC0, 0x2D, 0x79, + 0x68, 0x1F, 0xD2, 0xD1, 0x36, 0xD1, 0xFB, 0xE3, 0xC0, 0xA7, + 0x31, 0xEB, 0x15, 0x63, 0x99, 0x0B, 0x93, 0x9D, 0x87, 0xC7, + 0xFE, 0x56, 0x5D, 0xFC, 0xE7, 0x29, 0x2A, 0x9E, 0x15, 0xBE, + 0xEF, 0x54, 0xE7, 0x0F, 0x6D, 0x9B, 0x36, 0xB6, 0x17 }; static const int sizeof_client_cert_der_3072 = sizeof(client_cert_der_3072); @@ -3103,189 +3204,189 @@ /* ./certs/4096/client-cert.der, 4096-bit */ static const unsigned char client_cert_der_4096[] = { - 0x30, 0x82, 0x07, 0x1B, 0x30, 0x82, 0x05, 0x03, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x13, 0x31, 0xFE, 0x22, 0xAF, 0x75, - 0x2F, 0xDC, 0x63, 0xBD, 0xE4, 0x94, 0xF2, 0x94, 0x38, 0xC3, - 0x0D, 0x7D, 0x9A, 0xD1, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x30, - 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, - 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, - 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, - 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, - 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x5F, - 0x34, 0x30, 0x39, 0x36, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, - 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, 0x72, - 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, 0x34, 0x30, 0x39, - 0x36, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, - 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, 0x36, - 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, 0x32, - 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, 0x34, - 0x39, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, - 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, - 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, - 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, - 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, - 0x53, 0x4C, 0x5F, 0x34, 0x30, 0x39, 0x36, 0x31, 0x19, 0x30, - 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, - 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, - 0x34, 0x30, 0x39, 0x36, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, - 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, - 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, - 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, 0x06, - 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, - 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, 0x00, 0x30, 0x82, 0x02, - 0x0A, 0x02, 0x82, 0x02, 0x01, 0x00, 0xF5, 0xD0, 0x31, 0xE4, - 0x71, 0x59, 0x58, 0xB3, 0x07, 0x50, 0xDD, 0x16, 0x79, 0xFC, - 0xC6, 0x95, 0x50, 0xFC, 0x46, 0x0E, 0x57, 0x12, 0x86, 0x71, - 0x8D, 0xE3, 0x9B, 0x4A, 0x33, 0xEA, 0x4F, 0xD9, 0x17, 0x13, - 0x6D, 0x48, 0x69, 0xDF, 0x59, 0x11, 0x08, 0x02, 0x9D, 0xAF, - 0x2B, 0xC7, 0x30, 0xBE, 0x0C, 0xDC, 0x87, 0xD4, 0x5A, 0x12, - 0x09, 0x23, 0x5D, 0xE1, 0x76, 0x5A, 0x62, 0x37, 0x46, 0x74, - 0xEF, 0x03, 0x05, 0xBB, 0x1E, 0x6D, 0x29, 0x75, 0x6C, 0x2E, - 0x9D, 0x87, 0x0D, 0x8F, 0x87, 0xCB, 0x14, 0x95, 0x9B, 0xBE, - 0x17, 0x6B, 0x51, 0xD1, 0x4C, 0xDA, 0xD7, 0x91, 0x66, 0xC5, - 0x36, 0xEB, 0xE0, 0x07, 0x1A, 0x76, 0x4D, 0xB0, 0xFB, 0xC1, - 0xF5, 0x5E, 0x05, 0xDB, 0xBA, 0xCB, 0x25, 0xD9, 0x99, 0x13, - 0x1C, 0xC0, 0x35, 0xDC, 0x40, 0xE9, 0x36, 0xCD, 0xC4, 0xD5, - 0x7A, 0x41, 0x70, 0x0F, 0x36, 0xEB, 0xA5, 0x4E, 0x17, 0x05, - 0xD5, 0x75, 0x1B, 0x64, 0x62, 0x7A, 0x3F, 0x0D, 0x28, 0x48, - 0x6A, 0xE3, 0xAC, 0x9C, 0xA8, 0x8F, 0xE9, 0xED, 0xF7, 0xCD, - 0x24, 0xA0, 0xB1, 0xA0, 0x03, 0xAC, 0xE3, 0x03, 0xF5, 0x3F, - 0xD1, 0x96, 0xFF, 0x2A, 0x7E, 0x08, 0xB1, 0xD3, 0xE0, 0x18, - 0x14, 0xEC, 0x65, 0x37, 0x50, 0x43, 0xC2, 0x6A, 0x8C, 0xF4, - 0x5B, 0xFE, 0xC4, 0xCB, 0x8D, 0x3F, 0x81, 0x02, 0xF7, 0xC2, - 0xDD, 0xE4, 0xC1, 0x8E, 0x80, 0x0C, 0x04, 0x25, 0x2D, 0x80, - 0x5A, 0x2E, 0x0F, 0x22, 0x35, 0x4A, 0xF4, 0x85, 0xED, 0x51, - 0xD8, 0xAB, 0x6D, 0x8F, 0xA2, 0x3B, 0x24, 0x00, 0x6E, 0x81, - 0xE2, 0x1E, 0x76, 0xD6, 0xAC, 0x31, 0x12, 0xDB, 0xF3, 0x8E, - 0x07, 0xA1, 0xDE, 0x89, 0x4A, 0x39, 0x60, 0x77, 0xC5, 0xAA, - 0xF1, 0x51, 0xE6, 0x06, 0xF1, 0x95, 0x56, 0x2A, 0xE1, 0x8E, - 0x92, 0x30, 0x9F, 0xFE, 0x58, 0x44, 0xAC, 0x46, 0xF2, 0xFD, - 0x9A, 0xFC, 0xA8, 0x1D, 0xA1, 0xD3, 0x55, 0x37, 0x4A, 0x8B, - 0xFC, 0x9C, 0x33, 0xF8, 0xA7, 0x61, 0x48, 0x41, 0x7C, 0x9C, - 0x77, 0x3F, 0xF5, 0x80, 0x23, 0x7D, 0x43, 0xB4, 0xD5, 0x88, - 0x0A, 0xC9, 0x75, 0xD7, 0x44, 0x19, 0x4D, 0x77, 0x6C, 0x0B, - 0x0A, 0x49, 0xAA, 0x1C, 0x2F, 0xD6, 0x5A, 0x44, 0xA6, 0x47, - 0x4D, 0xE5, 0x36, 0x96, 0x40, 0x99, 0x2C, 0x56, 0x26, 0xB1, - 0xF2, 0x92, 0x31, 0x59, 0xD7, 0x2C, 0xD4, 0xB4, 0x21, 0xD6, - 0x65, 0x13, 0x0B, 0x3E, 0xFB, 0xFF, 0x04, 0xEB, 0xB9, 0x85, - 0xB9, 0xD8, 0xD8, 0x28, 0x4F, 0x5C, 0x17, 0x96, 0xA3, 0x51, - 0xBE, 0xFE, 0x7D, 0x0B, 0x1B, 0x48, 0x40, 0x25, 0x76, 0x94, - 0xDC, 0x41, 0xFB, 0xBF, 0x73, 0x76, 0xDA, 0xEB, 0xB3, 0x62, - 0xE7, 0xC1, 0xC8, 0x54, 0x6A, 0x93, 0xE1, 0x8D, 0x31, 0xE8, - 0x3E, 0x3E, 0xDF, 0xBC, 0x87, 0x02, 0x30, 0x22, 0x57, 0xC4, - 0xE0, 0x18, 0x7A, 0xD3, 0xAE, 0xE4, 0x02, 0x9B, 0xAA, 0xBD, - 0x4E, 0x49, 0x47, 0x72, 0xE9, 0x8D, 0x13, 0x2D, 0x54, 0x9B, - 0x00, 0xA7, 0x91, 0x61, 0x71, 0xC9, 0xCC, 0x48, 0x4F, 0xEE, - 0xDF, 0x5E, 0x1B, 0x1A, 0xDF, 0x67, 0xD3, 0x20, 0xE6, 0x44, - 0x45, 0x98, 0x7E, 0xE7, 0x0E, 0x63, 0x16, 0x83, 0xC9, 0x26, - 0x5D, 0x90, 0xC1, 0xE5, 0x2A, 0x5C, 0x45, 0x54, 0x13, 0xB2, - 0x81, 0x18, 0x06, 0x20, 0x2E, 0x2E, 0x66, 0x5A, 0xB5, 0x7B, - 0x6E, 0xD6, 0x0C, 0x4E, 0x89, 0x01, 0x56, 0x70, 0xBB, 0xAE, - 0xDE, 0xE9, 0x99, 0x5E, 0xD1, 0xB9, 0x3A, 0xB7, 0x6C, 0x17, - 0xB6, 0x03, 0xA9, 0x08, 0xDD, 0x9C, 0xF4, 0x14, 0xC9, 0xC9, - 0x59, 0x39, 0x72, 0xD4, 0x7E, 0x02, 0x37, 0x31, 0xCD, 0x0E, - 0xA7, 0x3D, 0xF8, 0xF2, 0xCF, 0x6B, 0x15, 0xAB, 0x02, 0x03, - 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x4E, 0x30, 0x82, 0x01, - 0x4A, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, - 0x04, 0x14, 0xFA, 0x54, 0x89, 0x67, 0xE5, 0x5F, 0xB7, 0x31, - 0x40, 0xEA, 0xFD, 0xE7, 0xF6, 0xA3, 0xC6, 0x5A, 0x56, 0x16, - 0xA5, 0x6E, 0x30, 0x81, 0xDD, 0x06, 0x03, 0x55, 0x1D, 0x23, - 0x04, 0x81, 0xD5, 0x30, 0x81, 0xD2, 0x80, 0x14, 0xFA, 0x54, - 0x89, 0x67, 0xE5, 0x5F, 0xB7, 0x31, 0x40, 0xEA, 0xFD, 0xE7, - 0xF6, 0xA3, 0xC6, 0x5A, 0x56, 0x16, 0xA5, 0x6E, 0xA1, 0x81, - 0xA4, 0xA4, 0x81, 0xA1, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, - 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, - 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, - 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, - 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, - 0x66, 0x53, 0x53, 0x4C, 0x5F, 0x34, 0x30, 0x39, 0x36, 0x31, - 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, - 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, - 0x67, 0x2D, 0x34, 0x30, 0x39, 0x36, 0x31, 0x18, 0x30, 0x16, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, - 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, - 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, - 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, - 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x13, 0x31, 0xFE, 0x22, - 0xAF, 0x75, 0x2F, 0xDC, 0x63, 0xBD, 0xE4, 0x94, 0xF2, 0x94, - 0x38, 0xC3, 0x0D, 0x7D, 0x9A, 0xD1, 0x30, 0x0C, 0x06, 0x03, - 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, - 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, - 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, - 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, 0x7F, 0x00, 0x00, 0x01, - 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x16, 0x30, - 0x14, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, - 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, - 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, - 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, - 0x00, 0xDD, 0x6B, 0x7F, 0xCA, 0xDC, 0x80, 0xE0, 0x6D, 0xE2, - 0x5F, 0x6C, 0x32, 0x01, 0x2F, 0x8F, 0x3A, 0xE9, 0x41, 0x5F, - 0x35, 0xC6, 0xBB, 0xA9, 0xA5, 0x84, 0x57, 0xEE, 0xA4, 0x21, - 0x4F, 0xB3, 0xB9, 0xAE, 0x24, 0xDC, 0xD1, 0x80, 0x30, 0x7A, - 0x2A, 0x7F, 0x7E, 0xFC, 0x6C, 0xBE, 0x50, 0xD3, 0x5A, 0x51, - 0x2D, 0xE6, 0xFD, 0x15, 0xDB, 0x9D, 0xFF, 0xFA, 0xCA, 0xC0, - 0xCF, 0xBE, 0x97, 0x59, 0xD0, 0x83, 0x20, 0xCE, 0x3A, 0xD8, - 0x10, 0xFE, 0x41, 0xD5, 0xA9, 0x6B, 0x19, 0xE2, 0x9F, 0x28, - 0xFE, 0xC0, 0x21, 0x75, 0x47, 0x46, 0x94, 0x31, 0x6A, 0xC4, - 0xC4, 0x52, 0x3B, 0x02, 0x73, 0xC4, 0x47, 0x2A, 0xB5, 0xCE, - 0x65, 0x6D, 0x58, 0xC7, 0xFA, 0x3E, 0x0A, 0x6F, 0xE1, 0xA8, - 0xA1, 0x3B, 0x33, 0x8A, 0x6F, 0xCA, 0x4A, 0xEF, 0x52, 0x88, - 0x09, 0xCA, 0xB2, 0xF2, 0x1D, 0x3D, 0x69, 0xF5, 0x5B, 0x80, - 0x4F, 0x29, 0x66, 0xB1, 0x25, 0xC7, 0xEB, 0xD1, 0xBB, 0xDF, - 0xCF, 0x91, 0xC8, 0xCE, 0x58, 0x3B, 0x9D, 0x10, 0x5B, 0x8E, - 0x55, 0x93, 0x5A, 0x32, 0xED, 0x0B, 0xC7, 0x7F, 0xC8, 0xF5, - 0xF2, 0x7F, 0x0A, 0xCE, 0xAD, 0xBB, 0xDB, 0x43, 0x2A, 0x92, - 0xF6, 0xF2, 0xA0, 0x34, 0x8E, 0x7C, 0x22, 0x4A, 0x5A, 0xF9, - 0x84, 0xB0, 0x88, 0xE3, 0xA4, 0x2A, 0xBF, 0x23, 0x3A, 0xEC, - 0xAA, 0x32, 0x77, 0xC9, 0xAB, 0xBC, 0x4B, 0xBB, 0x82, 0xBC, - 0xC0, 0x07, 0xE6, 0xFC, 0xCF, 0x33, 0x72, 0x8F, 0xB2, 0x4E, - 0xDA, 0x2B, 0x7E, 0x08, 0x44, 0x72, 0x2B, 0xA0, 0xC7, 0x3A, - 0x7E, 0x6F, 0xB4, 0x31, 0xB1, 0x3A, 0x34, 0xC3, 0x5C, 0xBE, - 0x9C, 0x85, 0xD8, 0x82, 0x99, 0x35, 0x92, 0xB4, 0xB4, 0x31, - 0x24, 0x31, 0xDF, 0xFB, 0x17, 0xDB, 0x1D, 0x3B, 0xA7, 0xD1, - 0xE2, 0xA4, 0x44, 0xC7, 0x3F, 0x6B, 0x17, 0x1C, 0x32, 0xCC, - 0xF9, 0x48, 0xF0, 0xC0, 0x38, 0x45, 0xE8, 0xF5, 0x84, 0x6C, - 0x59, 0x29, 0x5A, 0xEC, 0x38, 0x43, 0x10, 0x97, 0x67, 0x76, - 0xB5, 0x60, 0xB7, 0x8C, 0x42, 0x11, 0x44, 0x9A, 0x62, 0x87, - 0xDB, 0x02, 0xAA, 0xE7, 0x1E, 0xEC, 0x9F, 0x6B, 0x7F, 0xC5, - 0xFA, 0x9E, 0x03, 0x80, 0x73, 0x74, 0x20, 0xE9, 0x7A, 0xE1, - 0x3F, 0x49, 0x41, 0xBB, 0xC4, 0x9A, 0x70, 0x14, 0xA1, 0x13, - 0x2A, 0x90, 0xEF, 0x06, 0xCC, 0x9D, 0xBA, 0x32, 0x94, 0x8C, - 0xA9, 0x95, 0x45, 0xA4, 0x89, 0x04, 0xD2, 0x68, 0xB9, 0x13, - 0xFD, 0x73, 0x43, 0xEA, 0xC5, 0xEE, 0x7F, 0x00, 0x75, 0xF0, - 0xCA, 0x4D, 0x91, 0xD3, 0x04, 0x72, 0xE6, 0xAF, 0xC8, 0xAD, - 0x43, 0x11, 0x70, 0x36, 0x45, 0xAA, 0xB5, 0x46, 0xA6, 0xBF, - 0xAC, 0x6C, 0x20, 0x86, 0x3E, 0x5E, 0x66, 0xA5, 0x15, 0x6A, - 0xA2, 0x58, 0xE6, 0x6F, 0xE8, 0xAE, 0xB4, 0x1D, 0x67, 0xDA, - 0x18, 0xD6, 0xAD, 0xDE, 0x11, 0x9C, 0xF3, 0xD1, 0xA4, 0x06, - 0x3F, 0xD5, 0x01, 0xFD, 0x3D, 0xB8, 0xFD, 0x14, 0x0F, 0x1A, - 0xE8, 0x7E, 0xB4, 0xA3, 0x2B, 0x8B, 0x52, 0x4C, 0x71, 0x72, - 0x5E, 0x7C, 0x9E, 0x23, 0xFF, 0x50, 0x83, 0x7D, 0x5B, 0xEC, - 0x60, 0xD5, 0xAD, 0xA5, 0x44, 0x0B, 0xDD, 0x66, 0xCC, 0xA5, - 0xF8, 0x0C, 0x65, 0xDB, 0xB2, 0x76, 0x1E, 0x1C, 0x01, 0x87, - 0xCB, 0x1C, 0x76, 0x17, 0x5D, 0x12, 0xCD, 0x28, 0xDC, 0x20, - 0xE0, 0x3A, 0xC8, 0x65, 0xFE, 0xDD, 0xE3, 0xBC, 0x6A, 0x8B, - 0x24, 0x6B, 0x86, 0xA7, 0x2D, 0xBC, 0x4F, 0x26, 0x3F, 0xD7, - 0x3F, 0x04, 0xBF, 0xA4, 0x5D, 0x06, 0x52, 0xB5, 0xE4, 0xFD, - 0x85, 0xB0, 0x2C, 0x52, 0xAC, 0x99, 0x49, 0xEF, 0x56, 0x76, - 0x2A, 0x7C, 0xE3, 0xD8, 0x8E, 0xE4, 0xEB, 0xB2, 0xDB, 0xC1, - 0x54, 0x20, 0x64 + 0x30, 0x82, 0x07, 0x1D, 0x30, 0x82, 0x05, 0x05, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x2F, 0x36, 0x54, 0x05, 0x64, + 0x52, 0xDD, 0x0E, 0x75, 0x75, 0x33, 0x7C, 0xB2, 0xCE, 0x9F, + 0x5C, 0x48, 0x9B, 0xAB, 0x0E, 0x30, 0x0D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, + 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, + 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, + 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, + 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, 0x7A, 0x65, 0x6D, + 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, + 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, + 0x5F, 0x34, 0x30, 0x39, 0x36, 0x31, 0x19, 0x30, 0x17, 0x06, + 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, 0x72, 0x6F, 0x67, + 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, 0x2D, 0x34, 0x30, + 0x39, 0x36, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x9E, 0x31, 0x0B, 0x30, 0x09, + 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, + 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, + 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x42, 0x6F, + 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, 0x13, 0x06, + 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, 0x6C, 0x66, + 0x53, 0x53, 0x4C, 0x5F, 0x34, 0x30, 0x39, 0x36, 0x31, 0x19, + 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x10, 0x50, + 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, 0x6E, 0x67, + 0x2D, 0x34, 0x30, 0x39, 0x36, 0x31, 0x18, 0x30, 0x16, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, + 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, + 0x2E, 0x63, 0x6F, 0x6D, 0x30, 0x82, 0x02, 0x22, 0x30, 0x0D, + 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x02, 0x0F, 0x00, 0x30, 0x82, + 0x02, 0x0A, 0x02, 0x82, 0x02, 0x01, 0x00, 0xF5, 0xD0, 0x31, + 0xE4, 0x71, 0x59, 0x58, 0xB3, 0x07, 0x50, 0xDD, 0x16, 0x79, + 0xFC, 0xC6, 0x95, 0x50, 0xFC, 0x46, 0x0E, 0x57, 0x12, 0x86, + 0x71, 0x8D, 0xE3, 0x9B, 0x4A, 0x33, 0xEA, 0x4F, 0xD9, 0x17, + 0x13, 0x6D, 0x48, 0x69, 0xDF, 0x59, 0x11, 0x08, 0x02, 0x9D, + 0xAF, 0x2B, 0xC7, 0x30, 0xBE, 0x0C, 0xDC, 0x87, 0xD4, 0x5A, + 0x12, 0x09, 0x23, 0x5D, 0xE1, 0x76, 0x5A, 0x62, 0x37, 0x46, + 0x74, 0xEF, 0x03, 0x05, 0xBB, 0x1E, 0x6D, 0x29, 0x75, 0x6C, + 0x2E, 0x9D, 0x87, 0x0D, 0x8F, 0x87, 0xCB, 0x14, 0x95, 0x9B, + 0xBE, 0x17, 0x6B, 0x51, 0xD1, 0x4C, 0xDA, 0xD7, 0x91, 0x66, + 0xC5, 0x36, 0xEB, 0xE0, 0x07, 0x1A, 0x76, 0x4D, 0xB0, 0xFB, + 0xC1, 0xF5, 0x5E, 0x05, 0xDB, 0xBA, 0xCB, 0x25, 0xD9, 0x99, + 0x13, 0x1C, 0xC0, 0x35, 0xDC, 0x40, 0xE9, 0x36, 0xCD, 0xC4, + 0xD5, 0x7A, 0x41, 0x70, 0x0F, 0x36, 0xEB, 0xA5, 0x4E, 0x17, + 0x05, 0xD5, 0x75, 0x1B, 0x64, 0x62, 0x7A, 0x3F, 0x0D, 0x28, + 0x48, 0x6A, 0xE3, 0xAC, 0x9C, 0xA8, 0x8F, 0xE9, 0xED, 0xF7, + 0xCD, 0x24, 0xA0, 0xB1, 0xA0, 0x03, 0xAC, 0xE3, 0x03, 0xF5, + 0x3F, 0xD1, 0x96, 0xFF, 0x2A, 0x7E, 0x08, 0xB1, 0xD3, 0xE0, + 0x18, 0x14, 0xEC, 0x65, 0x37, 0x50, 0x43, 0xC2, 0x6A, 0x8C, + 0xF4, 0x5B, 0xFE, 0xC4, 0xCB, 0x8D, 0x3F, 0x81, 0x02, 0xF7, + 0xC2, 0xDD, 0xE4, 0xC1, 0x8E, 0x80, 0x0C, 0x04, 0x25, 0x2D, + 0x80, 0x5A, 0x2E, 0x0F, 0x22, 0x35, 0x4A, 0xF4, 0x85, 0xED, + 0x51, 0xD8, 0xAB, 0x6D, 0x8F, 0xA2, 0x3B, 0x24, 0x00, 0x6E, + 0x81, 0xE2, 0x1E, 0x76, 0xD6, 0xAC, 0x31, 0x12, 0xDB, 0xF3, + 0x8E, 0x07, 0xA1, 0xDE, 0x89, 0x4A, 0x39, 0x60, 0x77, 0xC5, + 0xAA, 0xF1, 0x51, 0xE6, 0x06, 0xF1, 0x95, 0x56, 0x2A, 0xE1, + 0x8E, 0x92, 0x30, 0x9F, 0xFE, 0x58, 0x44, 0xAC, 0x46, 0xF2, + 0xFD, 0x9A, 0xFC, 0xA8, 0x1D, 0xA1, 0xD3, 0x55, 0x37, 0x4A, + 0x8B, 0xFC, 0x9C, 0x33, 0xF8, 0xA7, 0x61, 0x48, 0x41, 0x7C, + 0x9C, 0x77, 0x3F, 0xF5, 0x80, 0x23, 0x7D, 0x43, 0xB4, 0xD5, + 0x88, 0x0A, 0xC9, 0x75, 0xD7, 0x44, 0x19, 0x4D, 0x77, 0x6C, + 0x0B, 0x0A, 0x49, 0xAA, 0x1C, 0x2F, 0xD6, 0x5A, 0x44, 0xA6, + 0x47, 0x4D, 0xE5, 0x36, 0x96, 0x40, 0x99, 0x2C, 0x56, 0x26, + 0xB1, 0xF2, 0x92, 0x31, 0x59, 0xD7, 0x2C, 0xD4, 0xB4, 0x21, + 0xD6, 0x65, 0x13, 0x0B, 0x3E, 0xFB, 0xFF, 0x04, 0xEB, 0xB9, + 0x85, 0xB9, 0xD8, 0xD8, 0x28, 0x4F, 0x5C, 0x17, 0x96, 0xA3, + 0x51, 0xBE, 0xFE, 0x7D, 0x0B, 0x1B, 0x48, 0x40, 0x25, 0x76, + 0x94, 0xDC, 0x41, 0xFB, 0xBF, 0x73, 0x76, 0xDA, 0xEB, 0xB3, + 0x62, 0xE7, 0xC1, 0xC8, 0x54, 0x6A, 0x93, 0xE1, 0x8D, 0x31, + 0xE8, 0x3E, 0x3E, 0xDF, 0xBC, 0x87, 0x02, 0x30, 0x22, 0x57, + 0xC4, 0xE0, 0x18, 0x7A, 0xD3, 0xAE, 0xE4, 0x02, 0x9B, 0xAA, + 0xBD, 0x4E, 0x49, 0x47, 0x72, 0xE9, 0x8D, 0x13, 0x2D, 0x54, + 0x9B, 0x00, 0xA7, 0x91, 0x61, 0x71, 0xC9, 0xCC, 0x48, 0x4F, + 0xEE, 0xDF, 0x5E, 0x1B, 0x1A, 0xDF, 0x67, 0xD3, 0x20, 0xE6, + 0x44, 0x45, 0x98, 0x7E, 0xE7, 0x0E, 0x63, 0x16, 0x83, 0xC9, + 0x26, 0x5D, 0x90, 0xC1, 0xE5, 0x2A, 0x5C, 0x45, 0x54, 0x13, + 0xB2, 0x81, 0x18, 0x06, 0x20, 0x2E, 0x2E, 0x66, 0x5A, 0xB5, + 0x7B, 0x6E, 0xD6, 0x0C, 0x4E, 0x89, 0x01, 0x56, 0x70, 0xBB, + 0xAE, 0xDE, 0xE9, 0x99, 0x5E, 0xD1, 0xB9, 0x3A, 0xB7, 0x6C, + 0x17, 0xB6, 0x03, 0xA9, 0x08, 0xDD, 0x9C, 0xF4, 0x14, 0xC9, + 0xC9, 0x59, 0x39, 0x72, 0xD4, 0x7E, 0x02, 0x37, 0x31, 0xCD, + 0x0E, 0xA7, 0x3D, 0xF8, 0xF2, 0xCF, 0x6B, 0x15, 0xAB, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xA3, 0x82, 0x01, 0x4F, 0x30, 0x82, + 0x01, 0x4B, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, + 0x16, 0x04, 0x14, 0xFA, 0x54, 0x89, 0x67, 0xE5, 0x5F, 0xB7, + 0x31, 0x40, 0xEA, 0xFD, 0xE7, 0xF6, 0xA3, 0xC6, 0x5A, 0x56, + 0x16, 0xA5, 0x6E, 0x30, 0x81, 0xDE, 0x06, 0x03, 0x55, 0x1D, + 0x23, 0x04, 0x81, 0xD6, 0x30, 0x81, 0xD3, 0x80, 0x14, 0xFA, + 0x54, 0x89, 0x67, 0xE5, 0x5F, 0xB7, 0x31, 0x40, 0xEA, 0xFD, + 0xE7, 0xF6, 0xA3, 0xC6, 0x5A, 0x56, 0x16, 0xA5, 0x6E, 0xA1, + 0x81, 0xA4, 0xA4, 0x81, 0xA1, 0x30, 0x81, 0x9E, 0x31, 0x0B, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, + 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, + 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, + 0x42, 0x6F, 0x7A, 0x65, 0x6D, 0x61, 0x6E, 0x31, 0x15, 0x30, + 0x13, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x0C, 0x77, 0x6F, + 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x5F, 0x34, 0x30, 0x39, 0x36, + 0x31, 0x19, 0x30, 0x17, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, + 0x10, 0x50, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x6D, 0x69, + 0x6E, 0x67, 0x2D, 0x34, 0x30, 0x39, 0x36, 0x31, 0x18, 0x30, + 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0C, 0x0F, 0x77, 0x77, + 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, + 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, + 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, + 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, + 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x2F, 0x36, + 0x54, 0x05, 0x64, 0x52, 0xDD, 0x0E, 0x75, 0x75, 0x33, 0x7C, + 0xB2, 0xCE, 0x9F, 0x5C, 0x48, 0x9B, 0xAB, 0x0E, 0x30, 0x0C, + 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, + 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, + 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x87, 0x04, 0x7F, 0x00, + 0x00, 0x01, 0x30, 0x1D, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, + 0x16, 0x30, 0x14, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, + 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, 0x82, + 0x02, 0x01, 0x00, 0xC2, 0x72, 0x38, 0x27, 0xF0, 0x5C, 0x45, + 0x04, 0x4B, 0x09, 0x0E, 0x5D, 0x98, 0x6E, 0x38, 0x6A, 0xBC, + 0xFB, 0xA8, 0x85, 0x4F, 0xF2, 0x04, 0x38, 0x63, 0x4F, 0x86, + 0x4F, 0x3C, 0xF5, 0xFD, 0xF8, 0xCD, 0x89, 0x09, 0x76, 0x72, + 0x47, 0x97, 0xDF, 0xF8, 0x17, 0x6A, 0x81, 0x3A, 0xB2, 0xB4, + 0xFC, 0xAC, 0xE9, 0xFC, 0xE2, 0x47, 0x9B, 0x07, 0x6D, 0x9C, + 0x53, 0xED, 0xD8, 0x64, 0xBC, 0x6C, 0x4D, 0xA9, 0xBD, 0x3E, + 0x5E, 0xCD, 0x61, 0xBC, 0x8E, 0x82, 0x20, 0xB2, 0x50, 0xBC, + 0x9E, 0x72, 0xE6, 0x9F, 0x40, 0xFF, 0x6C, 0x4B, 0x38, 0xF8, + 0x4B, 0x82, 0x0F, 0x7E, 0x49, 0xCD, 0x45, 0x5C, 0xCD, 0x44, + 0xDE, 0x47, 0x25, 0xB3, 0x57, 0xD0, 0x1A, 0x0D, 0x8D, 0x4D, + 0xC7, 0xEA, 0x23, 0xFA, 0x03, 0xE8, 0x86, 0xD8, 0x37, 0x89, + 0x84, 0x2E, 0xE8, 0x53, 0x7A, 0x77, 0xBE, 0x94, 0xEC, 0x70, + 0xE7, 0xC4, 0x7B, 0x8F, 0x6F, 0x28, 0x67, 0x33, 0x89, 0xEC, + 0xC9, 0xDF, 0x98, 0x6D, 0x4A, 0xD9, 0xC6, 0x7B, 0xD3, 0xB5, + 0x82, 0xD0, 0x8A, 0xCE, 0x8F, 0x06, 0xBF, 0xA2, 0xF7, 0xDE, + 0x4A, 0x45, 0x22, 0x6F, 0xFF, 0x41, 0x6F, 0x08, 0xF5, 0xC3, + 0x65, 0x25, 0x27, 0xFB, 0x43, 0x3E, 0xCC, 0x25, 0x0A, 0xD3, + 0x3D, 0xD2, 0x34, 0x9F, 0x89, 0x6B, 0xE2, 0x97, 0x9C, 0x42, + 0xD9, 0x3E, 0x64, 0x03, 0x45, 0x5F, 0x07, 0x95, 0xED, 0x1A, + 0x70, 0x6A, 0xBE, 0x3E, 0x7F, 0x7F, 0x16, 0xBE, 0x47, 0xA6, + 0x6D, 0x3B, 0x0D, 0x27, 0xB3, 0x89, 0xB1, 0xF1, 0xF6, 0xCE, + 0x99, 0x71, 0x18, 0xB6, 0xC0, 0xC5, 0x9E, 0x76, 0x7A, 0x8E, + 0xFB, 0x4A, 0xBE, 0x4F, 0xCD, 0xBC, 0x21, 0xA9, 0x4E, 0x9C, + 0xFC, 0x48, 0x86, 0xFF, 0xE4, 0x63, 0x14, 0x96, 0x3A, 0xEB, + 0xC8, 0x48, 0xAE, 0x27, 0xBD, 0x43, 0x0C, 0x27, 0x85, 0xE1, + 0x25, 0x1A, 0x69, 0x48, 0x6C, 0xE7, 0x11, 0xF8, 0xF3, 0x68, + 0x9D, 0xEE, 0x15, 0x1A, 0xBE, 0xAD, 0x46, 0x33, 0x24, 0x3D, + 0xBE, 0xB8, 0x0E, 0x6E, 0x4D, 0xEF, 0x12, 0xB6, 0xAE, 0x1B, + 0x88, 0xBD, 0x0E, 0xA6, 0xFF, 0x91, 0x08, 0xDC, 0xED, 0xAF, + 0xFA, 0x13, 0x2B, 0xF2, 0xB4, 0x2C, 0xEA, 0x72, 0xC2, 0x85, + 0xD6, 0xEE, 0x64, 0x09, 0xE1, 0x4E, 0x1A, 0x5A, 0xBD, 0xC2, + 0x44, 0xC2, 0x95, 0x82, 0x59, 0x0A, 0xD8, 0x27, 0xBC, 0x48, + 0x4A, 0x8A, 0xA3, 0xC3, 0x77, 0xAC, 0x92, 0xB6, 0x8B, 0x0B, + 0x13, 0xE2, 0x87, 0xEC, 0x21, 0x7E, 0x7E, 0x52, 0x29, 0x51, + 0x5C, 0x59, 0xE1, 0xC8, 0xDB, 0x05, 0xCE, 0x9E, 0xF4, 0x36, + 0xD8, 0x63, 0x42, 0x45, 0x71, 0x9A, 0xEE, 0x0E, 0x24, 0xB0, + 0xBA, 0xA5, 0xA5, 0xAA, 0xC9, 0xEE, 0x9E, 0xA3, 0xE3, 0xE9, + 0x7F, 0xC6, 0x64, 0x6C, 0x9E, 0x65, 0x78, 0x88, 0xF2, 0x61, + 0x6F, 0xD3, 0x3B, 0x9E, 0x0D, 0x16, 0xFA, 0xAD, 0xC2, 0x58, + 0xAC, 0xBC, 0x14, 0xB1, 0xF7, 0x6F, 0xDB, 0xB9, 0x7E, 0x79, + 0x81, 0xF1, 0xF8, 0xE9, 0x41, 0x5B, 0xFE, 0xD9, 0xE2, 0x89, + 0x86, 0x5C, 0x01, 0x03, 0x5D, 0x0C, 0xD9, 0xA9, 0xD6, 0xDF, + 0x4B, 0x26, 0x5C, 0xAE, 0xE6, 0xDF, 0xB5, 0xC9, 0xF0, 0x86, + 0xCA, 0x7B, 0x80, 0xDB, 0x6A, 0x86, 0xFD, 0xA9, 0x00, 0x46, + 0x32, 0x39, 0x5A, 0x72, 0xC4, 0x67, 0x20, 0xDB, 0xD8, 0x7A, + 0x5D, 0x2D, 0x78, 0xB9, 0xA7, 0xDE, 0x7F, 0xF4, 0x7A, 0x5B, + 0x0F, 0x38, 0xB0, 0x9E, 0x1A, 0xAE, 0xC5, 0xCC, 0xFF, 0x61, + 0x5E, 0xEC, 0xF1, 0x0D, 0xF7, 0x0A, 0x22, 0xBB, 0xCB, 0x08, + 0x2B, 0x91, 0x58, 0x77, 0x1F, 0x90, 0x2B, 0xA3, 0x78, 0xBE, + 0xEF, 0x4D, 0xD8, 0x8D, 0xE8, 0xF7, 0x31, 0xF8, 0x92, 0x84, + 0xE5, 0xB2, 0x2A, 0xE8, 0x3A }; static const int sizeof_client_cert_der_4096 = sizeof(client_cert_der_4096); @@ -3350,7 +3451,7 @@ #endif /* USE_CERT_BUFFERS_4096 */ -#if defined(HAVE_PQC) && defined(HAVE_FALCON) +#if defined(HAVE_FALCON) /* certs/falcon/bench_falcon_level1_key.der */ static const unsigned char bench_falcon_level1_key[] = @@ -3998,1783 +4099,1818 @@ }; static const int sizeof_bench_falcon_level5_key = sizeof(bench_falcon_level5_key); -#endif /* HAVE_PQC && HAVE_FALCON */ +#endif /* HAVE_FALCON */ -#if defined (HAVE_PQC) && defined(HAVE_DILITHIUM) +#if defined(HAVE_DILITHIUM) -/* certs/dilithium/bench_dilithium_level2_key.der */ -static const unsigned char bench_dilithium_level2_key[] = -{ - 0x30, 0x82, 0x0F, 0x1A, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, - 0x0B, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x02, 0x82, 0x0B, 0x07, - 0x04, 0x04, 0x04, 0x82, 0x0F, 0x04, 0x04, 0x82, 0x0F, 0x00, - 0xA2, 0xBD, 0x74, 0xB9, 0x8E, 0x34, 0xF0, 0xEC, 0xF7, 0x40, - 0x22, 0x33, 0xE8, 0x50, 0x43, 0x66, 0xF0, 0x25, 0x41, 0x20, - 0xD9, 0x3F, 0x8A, 0xC6, 0xAD, 0x69, 0xC6, 0x9C, 0xD9, 0xE0, - 0x0D, 0xFF, 0x77, 0x85, 0xCD, 0x88, 0x58, 0x17, 0x6B, 0x85, - 0xD2, 0x5D, 0xF0, 0x41, 0xCE, 0x6D, 0x94, 0x7F, 0xF4, 0xDB, - 0xD3, 0x60, 0x52, 0x1A, 0x83, 0x42, 0xD8, 0x7C, 0x2D, 0xD9, - 0x55, 0x7B, 0xFB, 0xB8, 0x87, 0xAA, 0xDA, 0x75, 0x42, 0x86, - 0x3E, 0x5A, 0xE4, 0xD4, 0x7D, 0xC3, 0x38, 0xA2, 0xEE, 0x0D, - 0xF5, 0xAD, 0xDA, 0x12, 0x5B, 0xD6, 0x3A, 0x89, 0x87, 0xED, - 0x57, 0xD1, 0xA9, 0xC2, 0xB3, 0xC0, 0xDC, 0x90, 0x88, 0x0C, - 0x86, 0x48, 0xD2, 0xA6, 0x60, 0x1B, 0x22, 0x8C, 0x03, 0x34, - 0x69, 0x19, 0x96, 0x24, 0x04, 0xB3, 0x65, 0x10, 0x34, 0x31, - 0x09, 0x38, 0x31, 0x5C, 0x10, 0x8C, 0x02, 0x15, 0x66, 0xD0, - 0x48, 0x50, 0x53, 0x22, 0x41, 0xC4, 0x98, 0x41, 0xE2, 0x42, - 0x62, 0x42, 0x38, 0x45, 0xC2, 0xB8, 0x08, 0x20, 0x31, 0x21, - 0x13, 0x10, 0x88, 0x00, 0xB9, 0x24, 0x93, 0x06, 0x6D, 0x44, - 0x20, 0x64, 0x98, 0x84, 0x29, 0x91, 0x12, 0x6A, 0xC9, 0x14, - 0x10, 0x11, 0x40, 0x2A, 0x24, 0xC9, 0x85, 0xCC, 0x42, 0x2A, - 0x1C, 0x44, 0x28, 0xE0, 0xB4, 0x00, 0x20, 0x99, 0x11, 0x0B, - 0x09, 0x61, 0x24, 0x14, 0x10, 0x41, 0x94, 0x20, 0xC9, 0x46, - 0x64, 0x43, 0x02, 0x6E, 0x08, 0x39, 0x71, 0x81, 0x06, 0x2D, - 0x63, 0x14, 0x71, 0x62, 0xC0, 0x11, 0x20, 0xB2, 0x61, 0xD1, - 0x30, 0x24, 0x44, 0x06, 0x89, 0x04, 0x16, 0x88, 0x10, 0x33, - 0x48, 0x51, 0xB8, 0x00, 0x4A, 0x12, 0x68, 0x14, 0x04, 0x10, - 0xD8, 0x92, 0x8D, 0x22, 0x32, 0x61, 0x0C, 0x23, 0x91, 0x10, - 0x39, 0x24, 0x51, 0x80, 0x08, 0x0B, 0x30, 0x61, 0x00, 0x89, - 0x01, 0x98, 0x34, 0x05, 0x9A, 0xA2, 0x70, 0xC4, 0x46, 0x40, - 0x52, 0x38, 0x42, 0xC0, 0x92, 0x6D, 0xCC, 0x08, 0x22, 0xD4, - 0x42, 0x4A, 0x02, 0x23, 0x40, 0x40, 0x92, 0x25, 0x12, 0x36, - 0x65, 0x42, 0x06, 0x10, 0x02, 0x10, 0x10, 0x20, 0xA3, 0x41, - 0x0A, 0x15, 0x10, 0x20, 0x23, 0x80, 0x99, 0xB6, 0x0C, 0x11, - 0x26, 0x11, 0x9B, 0xC8, 0x44, 0x1C, 0xC9, 0x05, 0xA4, 0x38, - 0x11, 0x1B, 0xB0, 0x05, 0xDC, 0x22, 0x00, 0xC8, 0x22, 0x72, - 0xA3, 0x30, 0x2E, 0xC1, 0xA8, 0x41, 0x1C, 0xA6, 0x20, 0xE2, - 0xB0, 0x21, 0x9B, 0x10, 0x01, 0x61, 0x32, 0x46, 0xC1, 0x92, - 0x61, 0x1C, 0xA4, 0x85, 0x0A, 0xB7, 0x70, 0xE4, 0x26, 0x6C, - 0x58, 0xA4, 0x00, 0x19, 0x86, 0x4C, 0xDC, 0xA6, 0x40, 0xA1, - 0x32, 0x12, 0x04, 0x81, 0x90, 0x8C, 0x04, 0x05, 0x10, 0x30, - 0x26, 0x09, 0x31, 0x2C, 0x50, 0x88, 0x89, 0x82, 0x44, 0x62, - 0x10, 0x23, 0x8A, 0x04, 0x44, 0x22, 0x0A, 0x30, 0x4E, 0xA4, - 0x34, 0x32, 0x4C, 0x18, 0x8C, 0x21, 0x21, 0x41, 0x23, 0x13, - 0x72, 0x08, 0x84, 0x24, 0x1A, 0x04, 0x24, 0x14, 0x06, 0x02, - 0xC4, 0x40, 0x70, 0xCA, 0x00, 0x6E, 0xC1, 0xC6, 0x09, 0x83, - 0x42, 0x62, 0xA0, 0x30, 0x12, 0x1B, 0x14, 0x0C, 0x08, 0x03, - 0x22, 0xCA, 0x46, 0x65, 0x64, 0x46, 0x26, 0x10, 0x39, 0x20, - 0xCA, 0x80, 0x28, 0x62, 0x14, 0x6D, 0x10, 0x26, 0x11, 0x49, - 0xA2, 0x45, 0x53, 0x98, 0x0D, 0x64, 0x40, 0x05, 0x0C, 0x31, - 0x09, 0x13, 0x11, 0x60, 0xD8, 0x02, 0x50, 0x11, 0x41, 0x41, - 0x23, 0xC1, 0x4C, 0x22, 0xC6, 0x30, 0x99, 0x06, 0x08, 0xCA, - 0x40, 0x81, 0xCC, 0x32, 0x0E, 0x11, 0xC4, 0x20, 0xD9, 0x92, - 0x41, 0xC4, 0x20, 0x08, 0xE4, 0xA0, 0x00, 0xCB, 0x88, 0x21, - 0x03, 0x03, 0x90, 0x54, 0x00, 0x49, 0x14, 0x98, 0x04, 0xC8, - 0xC0, 0x31, 0x11, 0x31, 0x69, 0x04, 0x93, 0x90, 0x00, 0xB9, - 0x21, 0x22, 0x38, 0x48, 0x00, 0x34, 0x0C, 0x61, 0x98, 0x00, - 0x01, 0xB4, 0x69, 0x60, 0x26, 0x81, 0x1C, 0xA4, 0x10, 0x22, - 0xB6, 0x10, 0x21, 0xC6, 0x20, 0x4A, 0x22, 0x26, 0xD0, 0x92, - 0x41, 0xDA, 0x84, 0x69, 0x03, 0x42, 0x2A, 0x04, 0x09, 0x02, - 0xE1, 0x24, 0x42, 0xA2, 0x46, 0x28, 0x10, 0xB1, 0x08, 0x82, - 0x86, 0x84, 0xE0, 0x24, 0x51, 0x0A, 0xC9, 0x28, 0x59, 0x86, - 0x20, 0xDB, 0xB6, 0x40, 0x13, 0xC3, 0x40, 0x1C, 0xA9, 0x09, - 0x80, 0x34, 0x50, 0xDC, 0x84, 0x2C, 0x53, 0x24, 0x08, 0xC0, - 0xB4, 0x6D, 0x88, 0x26, 0x30, 0x82, 0xC8, 0x0D, 0x62, 0x22, - 0x28, 0x64, 0xA2, 0x09, 0x10, 0x25, 0x26, 0xDB, 0x34, 0x02, - 0x4A, 0x04, 0x11, 0x53, 0xB8, 0x28, 0x82, 0x34, 0x11, 0xC2, - 0x12, 0x25, 0x20, 0xB5, 0x40, 0x19, 0xA8, 0x31, 0x80, 0x22, - 0x66, 0x21, 0xB2, 0x10, 0x0B, 0x42, 0x2A, 0x61, 0x20, 0x50, - 0x40, 0x24, 0x4C, 0x99, 0x12, 0x48, 0x21, 0xB4, 0x11, 0xD1, - 0x44, 0x48, 0x00, 0x40, 0x0C, 0x58, 0x46, 0x68, 0x04, 0x12, - 0x12, 0x93, 0x22, 0x20, 0xC2, 0x32, 0x4C, 0x01, 0xB0, 0x88, - 0xE3, 0x20, 0x8E, 0x03, 0x00, 0x6C, 0x52, 0x14, 0x30, 0xD2, - 0x44, 0x88, 0x10, 0x44, 0x4A, 0x61, 0x86, 0x29, 0x14, 0x42, - 0x24, 0x24, 0x35, 0x2E, 0x11, 0xC4, 0x0D, 0x23, 0x24, 0x66, - 0x0A, 0x90, 0x71, 0xE0, 0xC2, 0x69, 0x48, 0x38, 0x91, 0x82, - 0xC8, 0x08, 0x1C, 0x93, 0x31, 0xD9, 0x06, 0x51, 0x8A, 0xA4, - 0x6C, 0x50, 0x34, 0x68, 0x5A, 0x18, 0x89, 0x4A, 0x96, 0x85, - 0x8A, 0x18, 0x44, 0x4A, 0x34, 0x40, 0x5B, 0x36, 0x80, 0xCC, - 0x20, 0x6E, 0x09, 0x19, 0x89, 0x02, 0x38, 0x6A, 0x24, 0xA3, - 0x69, 0x58, 0x32, 0x6D, 0x21, 0x01, 0x84, 0x88, 0x86, 0x28, - 0xA3, 0x22, 0x89, 0x93, 0xA6, 0x80, 0x00, 0x88, 0x81, 0xE1, - 0x48, 0x70, 0xA2, 0x34, 0x60, 0x18, 0x02, 0x04, 0x18, 0x29, - 0x01, 0x1B, 0x31, 0x51, 0xD4, 0xA4, 0x49, 0xCC, 0x08, 0x8C, - 0xDA, 0x36, 0x11, 0x01, 0x39, 0x26, 0x42, 0x92, 0x88, 0xC8, - 0x46, 0x52, 0x8C, 0xA4, 0x08, 0x14, 0x11, 0x52, 0xCA, 0x40, - 0x66, 0x8B, 0x32, 0x8E, 0x89, 0x44, 0x02, 0x9B, 0x42, 0x02, - 0x93, 0xA4, 0x01, 0x1A, 0x00, 0x50, 0x94, 0x44, 0x42, 0x08, - 0x09, 0x8C, 0xE2, 0xA8, 0x81, 0x98, 0x00, 0x48, 0x63, 0x02, - 0x85, 0x1B, 0x05, 0x2D, 0xC1, 0xBE, 0x5F, 0xA4, 0xAC, 0xB4, - 0xF0, 0xC7, 0x94, 0xBD, 0xEC, 0xFB, 0x09, 0xAF, 0x16, 0xF1, - 0x23, 0x58, 0xAB, 0x82, 0xFA, 0x74, 0xD1, 0x84, 0x51, 0xD0, - 0x58, 0x9B, 0xFA, 0xF4, 0x11, 0xC1, 0x17, 0x2F, 0xCE, 0xD1, - 0xCA, 0xC6, 0xCE, 0x1C, 0x8F, 0x8F, 0x1B, 0x43, 0xBF, 0xB9, - 0x43, 0x41, 0x02, 0x3E, 0x5D, 0xFA, 0x24, 0x88, 0x0E, 0xA5, - 0x36, 0xA9, 0x9B, 0x25, 0x43, 0xD6, 0xEE, 0xDE, 0xAE, 0x93, - 0x54, 0xC8, 0x6C, 0x55, 0xE9, 0x5C, 0xC8, 0xC1, 0xA5, 0xD7, - 0xFC, 0xDA, 0xAF, 0xF8, 0x40, 0x1F, 0x02, 0x5C, 0x8E, 0x48, - 0x51, 0x4B, 0x3F, 0xFD, 0x76, 0x9A, 0xD0, 0x87, 0xF4, 0xD0, - 0x68, 0x9C, 0x44, 0x3B, 0xB4, 0x4A, 0xAB, 0x34, 0x2A, 0xD4, - 0x0C, 0xA4, 0x7A, 0xBB, 0x98, 0x7F, 0x8D, 0xF6, 0xA7, 0x6A, - 0x42, 0x8C, 0x7A, 0xB4, 0x32, 0xC6, 0x8A, 0xD6, 0x5E, 0x06, - 0x50, 0xC0, 0xDD, 0x3E, 0xE2, 0x44, 0x5C, 0xB9, 0x83, 0xCF, - 0x92, 0x0C, 0x3C, 0xFB, 0x53, 0x0D, 0xF0, 0xD1, 0xED, 0x77, - 0xF3, 0x02, 0x9F, 0xA6, 0xC6, 0xFA, 0x30, 0xA5, 0xC7, 0x42, - 0x06, 0x1F, 0x38, 0xE5, 0xE1, 0x56, 0x01, 0x7A, 0xD1, 0xE1, - 0xC1, 0x20, 0x44, 0x37, 0xE6, 0x18, 0x8A, 0x7E, 0x70, 0xBA, - 0x6B, 0x1C, 0x99, 0x4E, 0xFB, 0xCA, 0xCF, 0x3D, 0x29, 0x26, - 0xF4, 0x12, 0x95, 0x74, 0x11, 0x23, 0x0E, 0x2E, 0x31, 0xCF, - 0x73, 0xE6, 0x99, 0xD0, 0x72, 0x23, 0x4A, 0x46, 0x07, 0xA1, - 0x03, 0x4C, 0x3A, 0x79, 0x72, 0x3B, 0xD1, 0x79, 0x5A, 0x66, - 0x29, 0xCD, 0x34, 0xB6, 0x6A, 0xA5, 0x6A, 0x4C, 0x71, 0xE5, - 0xB3, 0xA6, 0xAC, 0x4D, 0x13, 0xDC, 0x70, 0xE4, 0x0C, 0x6A, - 0x98, 0x48, 0x1C, 0xA0, 0x6C, 0xFC, 0xDD, 0x6A, 0x3F, 0x10, - 0x3B, 0xBD, 0xC9, 0xC8, 0xEA, 0x01, 0x86, 0x5B, 0x3B, 0x19, - 0x3E, 0x6F, 0xA9, 0x4A, 0xD4, 0x38, 0x1D, 0x9C, 0x2B, 0x19, - 0xAE, 0x47, 0x54, 0xE2, 0x4E, 0xB5, 0xDF, 0xA7, 0xBD, 0x6F, - 0x01, 0x8A, 0x10, 0x5B, 0x83, 0x17, 0xB3, 0x77, 0xE1, 0x9D, - 0xBF, 0x6B, 0x25, 0xBF, 0x90, 0xC4, 0x92, 0xE1, 0x5E, 0xE1, - 0xC3, 0x0C, 0xC5, 0x05, 0x24, 0x40, 0x61, 0xA1, 0x01, 0x4A, - 0x7B, 0xE4, 0x65, 0x73, 0x1F, 0x3C, 0xA2, 0xD8, 0x54, 0xA4, - 0x64, 0xA3, 0x06, 0xDA, 0x18, 0x9A, 0xD7, 0xE4, 0x90, 0x59, - 0xAF, 0xBC, 0x1A, 0x79, 0xC4, 0x08, 0xE9, 0x87, 0x95, 0x04, - 0x48, 0x18, 0xD2, 0x33, 0x15, 0x38, 0x9C, 0x00, 0x7B, 0x72, - 0x35, 0xC1, 0x03, 0x77, 0xF1, 0x0B, 0xEC, 0x38, 0x33, 0xB7, - 0xB4, 0xBC, 0xC4, 0xBD, 0xB3, 0xBB, 0x9C, 0x34, 0x0B, 0x28, - 0x03, 0x1D, 0x99, 0x7A, 0x12, 0x0C, 0x95, 0xFE, 0x0D, 0x53, - 0x79, 0xE7, 0xE6, 0x99, 0x3F, 0xA1, 0x31, 0x9E, 0xA9, 0xB8, - 0x9B, 0xB7, 0xC0, 0x3F, 0x9C, 0x18, 0x1B, 0xA2, 0x73, 0xBC, - 0x10, 0xDB, 0x1B, 0x09, 0xE7, 0x5E, 0x67, 0x8E, 0x69, 0x92, - 0xCF, 0x99, 0xC3, 0x97, 0x58, 0xE8, 0x9A, 0x40, 0x83, 0xF2, - 0x14, 0xA3, 0x25, 0xB5, 0x51, 0x30, 0xDA, 0x91, 0x87, 0x91, - 0x1E, 0xF2, 0x5E, 0x55, 0x49, 0x68, 0x5E, 0xC9, 0x21, 0x67, - 0x03, 0xBC, 0x21, 0xE4, 0xD1, 0xFC, 0x79, 0xC7, 0xDB, 0x44, - 0xB9, 0xAB, 0x1E, 0xB4, 0x65, 0x3D, 0x63, 0xCB, 0x64, 0x76, - 0xE4, 0x1B, 0x93, 0x91, 0xB0, 0xF3, 0x4F, 0xBA, 0xD3, 0x20, - 0x47, 0x37, 0x5A, 0xCA, 0x1B, 0xDB, 0xCA, 0xA1, 0xE7, 0xED, - 0x7D, 0x8D, 0x4E, 0x7C, 0x19, 0xB2, 0x73, 0x67, 0x55, 0x11, - 0xE4, 0xA1, 0x98, 0x44, 0x5F, 0x58, 0xF7, 0xAA, 0x09, 0xFD, - 0x09, 0x4A, 0x54, 0x68, 0x32, 0xD4, 0xCA, 0xE1, 0x96, 0xFD, - 0x27, 0x05, 0x88, 0x78, 0x7B, 0x83, 0x74, 0x78, 0x6F, 0x09, - 0xC7, 0x3C, 0x66, 0xA8, 0x17, 0x3A, 0xCF, 0xB3, 0x6E, 0x5A, - 0xD7, 0x16, 0xE5, 0x2E, 0x40, 0xD7, 0x30, 0x18, 0x47, 0x5F, - 0x95, 0x19, 0x4E, 0x0F, 0x69, 0xD3, 0x11, 0xDE, 0xBB, 0x55, - 0x1B, 0xD1, 0x13, 0x71, 0x3D, 0x45, 0x3E, 0xDC, 0x72, 0x4F, - 0x89, 0x34, 0x72, 0x96, 0x77, 0xBB, 0x42, 0x29, 0x4A, 0x88, - 0x44, 0xFB, 0x05, 0x57, 0x38, 0xA6, 0xAC, 0x3E, 0x03, 0xF6, - 0xE1, 0x9D, 0xE3, 0xE9, 0x5A, 0x1B, 0x64, 0xCE, 0xC8, 0x6E, - 0x1B, 0xE8, 0xE3, 0x78, 0xF8, 0xE9, 0xF1, 0x47, 0x09, 0x0E, - 0x66, 0x50, 0x7A, 0x10, 0x51, 0xE1, 0x60, 0x73, 0x78, 0x95, - 0x00, 0x2E, 0xB8, 0x05, 0x8C, 0x22, 0x72, 0xD9, 0x88, 0xC8, - 0x8D, 0x16, 0xEF, 0x18, 0x8F, 0xC6, 0x51, 0x1E, 0xC3, 0xBA, - 0x27, 0x57, 0xB4, 0xFE, 0x74, 0x0F, 0x54, 0x45, 0x5A, 0x0B, - 0xAC, 0x6C, 0xA7, 0x46, 0x95, 0xC7, 0x35, 0x3D, 0x38, 0xBE, - 0xC5, 0x4E, 0xE0, 0x83, 0xED, 0x68, 0x8D, 0x01, 0x31, 0x7D, - 0x90, 0xA7, 0x38, 0xEE, 0x57, 0x8E, 0xD2, 0xFB, 0x87, 0x08, - 0x7A, 0x44, 0x34, 0x0B, 0x99, 0x5E, 0x2F, 0xA8, 0x4E, 0xC0, - 0x80, 0xEF, 0x62, 0xFE, 0xFB, 0x3C, 0x73, 0xF1, 0x8C, 0x56, - 0x12, 0x08, 0x8C, 0xD3, 0x9F, 0xBA, 0x44, 0x90, 0xB7, 0xDB, - 0x9C, 0xD9, 0xB4, 0x91, 0xBA, 0xFF, 0x4A, 0xB0, 0x1C, 0x91, - 0x44, 0x34, 0x52, 0xBE, 0x0D, 0xBA, 0x72, 0x33, 0x5C, 0x36, - 0xB5, 0x5E, 0x91, 0xB7, 0xE9, 0xCE, 0xD0, 0x01, 0x61, 0x19, - 0xEE, 0x2D, 0x1F, 0xBE, 0x97, 0x7C, 0x8C, 0x30, 0x91, 0x8C, - 0xB1, 0x8A, 0x04, 0xCA, 0xB8, 0x33, 0xCB, 0xA9, 0x9A, 0x2C, - 0x1B, 0x25, 0xD2, 0xDB, 0x73, 0x95, 0x3F, 0x02, 0x67, 0xEB, - 0x2C, 0xEC, 0xCC, 0x92, 0xCD, 0x1E, 0x1F, 0xC2, 0xF2, 0xA7, - 0x23, 0xAD, 0x7C, 0xA5, 0x50, 0x44, 0x76, 0x7D, 0x74, 0x13, - 0x20, 0x21, 0xF2, 0x09, 0xD9, 0x70, 0x82, 0xB0, 0x30, 0xA3, - 0x8A, 0xC0, 0x9D, 0xD2, 0x16, 0x4F, 0x65, 0xDF, 0x42, 0x37, - 0xC2, 0x63, 0xD6, 0x6C, 0xA9, 0xD1, 0x95, 0x5D, 0x84, 0xD2, - 0xB5, 0xC7, 0x7A, 0x87, 0x9B, 0x9B, 0xAF, 0x21, 0x65, 0x64, - 0xF7, 0x0B, 0x21, 0xC7, 0xF6, 0xA5, 0x27, 0xEB, 0xAA, 0x8D, - 0xF2, 0x10, 0x60, 0xFB, 0xC9, 0xB3, 0xB0, 0x32, 0x7C, 0x9F, - 0xC1, 0xDE, 0xA8, 0x77, 0x6F, 0xCC, 0x35, 0x1F, 0xBD, 0x74, - 0x0E, 0xA9, 0x84, 0x3C, 0x05, 0x9D, 0xFF, 0xBC, 0x46, 0x9A, - 0x8E, 0x43, 0xB5, 0x8B, 0x1C, 0x24, 0xB5, 0xC3, 0xB0, 0xFE, - 0x14, 0xCC, 0x3C, 0xCF, 0xF2, 0x26, 0xCE, 0x0B, 0x3A, 0x5B, - 0x5C, 0x8E, 0x59, 0xBF, 0x0D, 0xDC, 0xA6, 0xCA, 0x78, 0xE5, - 0xD9, 0xC5, 0x46, 0x56, 0x38, 0x98, 0xC4, 0xAC, 0x43, 0x64, - 0xB1, 0x78, 0x0A, 0x81, 0x34, 0x7D, 0x3D, 0xC0, 0xF5, 0x25, - 0x14, 0x66, 0xA2, 0x2A, 0x81, 0x64, 0x82, 0x62, 0x86, 0xD0, - 0x65, 0xCB, 0x2A, 0x09, 0x01, 0xF5, 0x03, 0xEC, 0xB5, 0xD1, - 0xED, 0xC7, 0x60, 0x62, 0x3D, 0x38, 0x28, 0x9C, 0x32, 0xEE, - 0x9F, 0x45, 0x72, 0x71, 0xA9, 0x6D, 0x9A, 0x54, 0x83, 0xF9, - 0xE7, 0x37, 0xC7, 0xCC, 0x28, 0xC0, 0xC2, 0x24, 0x09, 0xC3, - 0x96, 0xF6, 0xED, 0x9B, 0x60, 0xF3, 0x24, 0x4C, 0xFC, 0xAB, - 0xD0, 0x38, 0x7A, 0x1C, 0x68, 0xED, 0x63, 0x83, 0x5A, 0x28, - 0x37, 0x70, 0x31, 0xBB, 0x9D, 0xC7, 0xAA, 0x3A, 0x5B, 0xAF, - 0x88, 0x82, 0xE2, 0x30, 0xCB, 0xF5, 0xC1, 0x63, 0x9C, 0x59, - 0x41, 0xD3, 0x24, 0x92, 0xB1, 0x71, 0xA4, 0x16, 0x26, 0x0B, - 0x9C, 0x96, 0x0B, 0xE9, 0x0B, 0x69, 0xFC, 0x1F, 0xD2, 0x99, - 0xC2, 0xB6, 0x7A, 0x24, 0x28, 0x5A, 0x3D, 0x88, 0x2C, 0xF0, - 0x76, 0xFC, 0x25, 0x04, 0xBE, 0xB6, 0x19, 0x94, 0xD1, 0xBA, - 0x1A, 0x58, 0x0E, 0x9A, 0xFB, 0x4C, 0x9D, 0x21, 0x34, 0x8D, - 0x45, 0xEC, 0x50, 0xC6, 0x94, 0x1B, 0x0B, 0x87, 0x36, 0x4E, - 0xE4, 0x96, 0xF6, 0x9A, 0x34, 0xEC, 0xD8, 0x65, 0x6A, 0x46, - 0xFA, 0xC5, 0x40, 0x35, 0xD0, 0x07, 0x74, 0x02, 0xA3, 0xCF, - 0x23, 0x60, 0x15, 0xAC, 0x54, 0x98, 0x59, 0xEF, 0x94, 0x17, - 0x0A, 0xEF, 0xBB, 0xC2, 0x7B, 0x3B, 0xEF, 0xF5, 0xD1, 0x9C, - 0xB7, 0xB1, 0xDF, 0x45, 0xF5, 0x57, 0xD1, 0x18, 0x05, 0x97, - 0x8F, 0x8C, 0x30, 0x8C, 0x11, 0xF4, 0x81, 0x4D, 0x75, 0x18, - 0x97, 0x9F, 0x30, 0x64, 0xE2, 0x5B, 0x18, 0x95, 0xAC, 0x4E, - 0xDC, 0x47, 0xB5, 0x45, 0xAA, 0xD4, 0x7E, 0xF4, 0x70, 0x46, - 0x34, 0xF3, 0xB3, 0x85, 0xC2, 0x46, 0x98, 0xB5, 0xB5, 0x33, - 0x52, 0xF4, 0x36, 0x39, 0xCA, 0x23, 0xF9, 0x66, 0xB9, 0xA4, - 0x63, 0xC6, 0x3D, 0x02, 0xE7, 0x8F, 0x95, 0xF3, 0x25, 0xFD, - 0x21, 0xD0, 0x62, 0xC2, 0xEE, 0xE2, 0x2F, 0x69, 0x55, 0x31, - 0x42, 0x78, 0x2D, 0x53, 0xDC, 0x7F, 0x0E, 0x93, 0xD5, 0x4D, - 0x21, 0x64, 0x8B, 0x9E, 0x2C, 0xBE, 0xBA, 0xD3, 0x39, 0x41, - 0xE3, 0x10, 0xE5, 0x07, 0xE4, 0x0E, 0x20, 0x38, 0x63, 0xF7, - 0x02, 0xF2, 0x17, 0x99, 0xEB, 0xC6, 0xE7, 0x5F, 0xBE, 0xAE, - 0x53, 0xD1, 0x12, 0xB2, 0x9A, 0x90, 0x25, 0x6A, 0xAA, 0xFD, - 0x5D, 0x69, 0x2F, 0x32, 0x33, 0x53, 0x57, 0x1B, 0xC4, 0x24, - 0xC0, 0xC5, 0x90, 0x04, 0x04, 0x67, 0xCA, 0x85, 0x1E, 0x94, - 0x31, 0x95, 0x78, 0x76, 0x5D, 0xCF, 0x15, 0xE6, 0x06, 0x6B, - 0x1A, 0x1D, 0x0E, 0xF6, 0x64, 0x91, 0x84, 0xAE, 0xE4, 0xF0, - 0x1F, 0x0A, 0x76, 0x1C, 0x74, 0xF3, 0xC1, 0x97, 0x80, 0x5B, - 0xD9, 0xC6, 0xB6, 0x2B, 0xA8, 0xD7, 0xD8, 0xD2, 0xB5, 0x8E, - 0x05, 0xB5, 0x16, 0x6A, 0xF7, 0xCB, 0xD2, 0xFE, 0xE0, 0xA7, - 0x3E, 0x1C, 0x3E, 0x84, 0xDC, 0x89, 0x33, 0xD7, 0x2F, 0x2A, - 0x40, 0x41, 0x18, 0xB8, 0x58, 0xB6, 0x54, 0xC6, 0xC9, 0xDF, - 0x24, 0x91, 0xCD, 0x62, 0xA0, 0x9D, 0x17, 0xCC, 0xA6, 0xCF, - 0xD9, 0x25, 0xA1, 0xBC, 0x63, 0x09, 0xFB, 0xD1, 0x65, 0x5C, - 0xFC, 0xB8, 0x3A, 0x3D, 0x50, 0xEC, 0x1A, 0x26, 0x37, 0xCB, - 0x9C, 0x29, 0x9E, 0x15, 0x06, 0xC9, 0x14, 0x45, 0x41, 0x5F, - 0x6C, 0x41, 0x46, 0xEA, 0xC6, 0xF8, 0x18, 0x01, 0x7D, 0xCD, - 0x30, 0xEE, 0x5D, 0xB5, 0xA0, 0x96, 0x19, 0x80, 0x96, 0xB1, - 0x03, 0x55, 0x86, 0x57, 0xBE, 0x19, 0x13, 0x46, 0x88, 0x00, - 0xCE, 0x5E, 0xD0, 0xBE, 0xEC, 0x13, 0x2B, 0x93, 0x3C, 0xE1, - 0xEC, 0xBD, 0x15, 0x6F, 0xA5, 0xF5, 0x20, 0x59, 0x3C, 0xDD, - 0xBD, 0xFD, 0xDF, 0x9D, 0x9F, 0x07, 0x73, 0x25, 0x93, 0x42, - 0x41, 0xCF, 0x4A, 0xE5, 0x8F, 0x04, 0xAC, 0x5F, 0x6A, 0x56, - 0x87, 0x49, 0xD5, 0x64, 0x00, 0x9D, 0xF4, 0xA5, 0x6B, 0xBE, - 0x8F, 0xC8, 0xE8, 0xBC, 0xC7, 0x1C, 0x99, 0xC0, 0x2F, 0xA1, - 0xDA, 0xDF, 0x6B, 0xE5, 0x62, 0x9D, 0xC9, 0x73, 0x5B, 0x2A, - 0x3E, 0xD7, 0x8A, 0xBE, 0x0A, 0x5F, 0x2B, 0x0B, 0x61, 0xEF, - 0x4A, 0x09, 0x15, 0x70, 0xE6, 0x5C, 0xA1, 0xB6, 0xDE, 0x54, - 0x71, 0x74, 0x55, 0x63, 0x77, 0x8F, 0xC9, 0xAF, 0x22, 0x9A, - 0xFE, 0x2C, 0x09, 0x62, 0x3E, 0xA1, 0xAA, 0x89, 0xB8, 0x6B, - 0x50, 0x84, 0x20, 0x66, 0x5D, 0x8F, 0x39, 0x7F, 0xC1, 0x2D, - 0xFA, 0x78, 0x8F, 0x8E, 0xD0, 0x39, 0x33, 0xD4, 0x9A, 0x40, - 0x56, 0xBC, 0x86, 0x22, 0x07, 0xEB, 0x22, 0xB8, 0x52, 0xC0, - 0x1A, 0xD2, 0x35, 0x1F, 0x56, 0x7E, 0xDA, 0x2B, 0xC1, 0x08, - 0xD2, 0x39, 0x28, 0x46, 0x63, 0x9A, 0xAD, 0x44, 0xB3, 0xEF, - 0x1C, 0x2A, 0xD6, 0x68, 0x67, 0xE4, 0x63, 0x73, 0x78, 0x29, - 0xA7, 0xA0, 0x70, 0x2E, 0xD9, 0xB4, 0x14, 0x4D, 0x04, 0xD3, - 0x2D, 0x8A, 0x70, 0x07, 0xAD, 0x8A, 0xC0, 0xA5, 0x1D, 0xE7, - 0x17, 0xD8, 0xBB, 0xAA, 0xB5, 0xF7, 0xC8, 0x8D, 0x29, 0x8E, - 0x49, 0x32, 0xA0, 0x40, 0x34, 0xBB, 0x2E, 0x10, 0x30, 0xDD, - 0xEA, 0x3E, 0xCC, 0xC1, 0xB9, 0xF2, 0x42, 0xCC, 0x4A, 0xF2, - 0xF4, 0x93, 0x2E, 0x3F, 0x0C, 0xE8, 0xE4, 0x96, 0x1F, 0x33, - 0x2D, 0x67, 0x4F, 0x8E, 0x1B, 0x01, 0xD6, 0xE2, 0xF2, 0xFD, - 0x5D, 0xCC, 0xFD, 0x18, 0x9C, 0xD6, 0x50, 0x1F, 0xE1, 0xC5, - 0x7C, 0xBE, 0x59, 0x95, 0x7D, 0x21, 0x25, 0x3E, 0xF3, 0xBC, - 0xCE, 0x31, 0x80, 0x79, 0x34, 0x0F, 0x86, 0x78, 0x18, 0xA6, - 0x36, 0x17, 0xD9, 0x70, 0xA7, 0x22, 0xA7, 0xE8, 0xA2, 0xBD, - 0x74, 0xB9, 0x8E, 0x34, 0xF0, 0xEC, 0xF7, 0x40, 0x22, 0x33, - 0xE8, 0x50, 0x43, 0x66, 0xF0, 0x25, 0x41, 0x20, 0xD9, 0x3F, - 0x8A, 0xC6, 0xAD, 0x69, 0xC6, 0x9C, 0xD9, 0xE0, 0x0D, 0xFF, - 0x93, 0x32, 0x5D, 0x57, 0x45, 0xCC, 0xA4, 0xF9, 0x32, 0xD4, - 0x5A, 0x49, 0x17, 0x1B, 0xFB, 0x2F, 0x91, 0xAA, 0x5B, 0xC5, - 0xC8, 0xC8, 0x2B, 0x20, 0x30, 0x1B, 0xB2, 0x01, 0xC3, 0xA7, - 0x8E, 0x6C, 0xB8, 0xF7, 0xB3, 0x95, 0x4A, 0x28, 0x82, 0xAA, - 0x0C, 0x4B, 0xDA, 0x26, 0x4A, 0x34, 0x7F, 0x17, 0x55, 0x4C, - 0x5D, 0x3C, 0x0B, 0x16, 0xA2, 0xEB, 0x33, 0xFB, 0x38, 0x63, - 0xF2, 0x15, 0x7D, 0xFA, 0x52, 0xA9, 0x58, 0xDD, 0x41, 0x58, - 0xA0, 0x13, 0xD2, 0x55, 0x22, 0xF9, 0xC2, 0xF8, 0x4E, 0x3F, - 0xAC, 0xDC, 0x11, 0x0A, 0xBB, 0x7C, 0xB1, 0x2B, 0xFB, 0x60, - 0xC5, 0x08, 0xB9, 0xB0, 0xED, 0xE8, 0xB9, 0x88, 0xBD, 0x07, - 0xDE, 0x53, 0xD0, 0x6B, 0xE5, 0x6E, 0xA0, 0x17, 0x8C, 0xCF, - 0x02, 0xF0, 0x64, 0xDE, 0xCE, 0x8C, 0x91, 0xED, 0xB4, 0x4F, - 0xB0, 0xEE, 0x12, 0x26, 0xC6, 0x55, 0xA0, 0x4D, 0xCC, 0xF3, - 0x1A, 0x86, 0x5A, 0x01, 0x53, 0x01, 0xAA, 0xED, 0x6D, 0x11, - 0xCD, 0x8A, 0x4A, 0xCA, 0x85, 0x35, 0x35, 0xFA, 0x22, 0x55, - 0xF3, 0xB8, 0xFA, 0x43, 0xD6, 0x9E, 0xB5, 0x0D, 0xD3, 0x85, - 0x59, 0xC9, 0xAF, 0xCD, 0xAB, 0xFA, 0xB6, 0x65, 0x20, 0xCC, - 0x11, 0xF1, 0xDE, 0x87, 0x6F, 0x58, 0xA1, 0x41, 0xF2, 0x80, - 0x75, 0xEA, 0x26, 0x72, 0x8C, 0xE9, 0x17, 0x1C, 0x2B, 0x4D, - 0xA4, 0x9C, 0xAA, 0x32, 0xAA, 0x2C, 0x84, 0xBA, 0x87, 0xAA, - 0x81, 0x66, 0x56, 0x76, 0x0F, 0x1C, 0x58, 0xFE, 0xD1, 0x7F, - 0x33, 0x59, 0xF1, 0xF0, 0x56, 0x50, 0x00, 0x4F, 0x96, 0xF7, - 0x1C, 0x11, 0x7C, 0x36, 0xD8, 0xAD, 0x3E, 0x82, 0x15, 0x68, - 0x40, 0x83, 0xFE, 0x62, 0x94, 0xD5, 0x2A, 0x43, 0x88, 0xD8, - 0x12, 0xE2, 0x37, 0x8A, 0x3E, 0x9E, 0x24, 0x8B, 0x70, 0x3C, - 0xBD, 0x97, 0x0B, 0x59, 0xAC, 0x4B, 0x88, 0x36, 0x2D, 0x2F, - 0xE9, 0x49, 0x14, 0xC0, 0x28, 0x7F, 0x0D, 0xE8, 0x93, 0x76, - 0x22, 0xF3, 0x08, 0x17, 0x34, 0x91, 0x39, 0xA6, 0x84, 0xCA, - 0xF1, 0xD2, 0x8A, 0x9D, 0xF1, 0xD4, 0xA4, 0x85, 0xA6, 0x1E, - 0xFB, 0x6B, 0x75, 0x07, 0x80, 0x84, 0x32, 0xF5, 0x51, 0xD6, - 0x42, 0xA8, 0x69, 0x96, 0xC3, 0xBD, 0xEF, 0x2F, 0xA4, 0x23, - 0x58, 0x07, 0xBC, 0xDE, 0x45, 0xD4, 0x1E, 0x67, 0xF1, 0x00, - 0x65, 0xB5, 0x03, 0xF3, 0x83, 0x9D, 0xE8, 0xDE, 0x63, 0x42, - 0x2B, 0xB6, 0xED, 0x7F, 0x63, 0xF6, 0xCF, 0x53, 0x1B, 0xBD, - 0x9D, 0x6C, 0x26, 0xBC, 0xC2, 0xC3, 0xAF, 0x86, 0x06, 0x5F, - 0x49, 0xBF, 0x7E, 0x76, 0xF5, 0x6C, 0x5B, 0x41, 0xF7, 0xAF, - 0x02, 0x1F, 0x35, 0x43, 0x0D, 0x64, 0x65, 0xFE, 0xD7, 0x9A, - 0x3F, 0x21, 0xD5, 0x74, 0x6E, 0x8A, 0xA8, 0xAF, 0x3B, 0xCE, - 0x85, 0xBB, 0xF7, 0x7B, 0xCA, 0xF7, 0x9D, 0x02, 0x52, 0x55, - 0xE9, 0x3E, 0x4A, 0x4B, 0x62, 0x85, 0x35, 0xFA, 0xBD, 0xEB, - 0x92, 0x25, 0x24, 0x01, 0xFF, 0xEE, 0xFB, 0x94, 0xF6, 0xE6, - 0x9F, 0xE3, 0x3D, 0x93, 0xCF, 0x69, 0xEB, 0x3D, 0x8F, 0x1F, - 0xBE, 0xAE, 0x85, 0x6F, 0x8F, 0x0B, 0x22, 0x57, 0x00, 0x3D, - 0x8E, 0xF4, 0x6B, 0x4D, 0x82, 0x76, 0x91, 0x25, 0x4B, 0x2C, - 0xF1, 0xBC, 0x64, 0x96, 0x54, 0x35, 0xFD, 0xBD, 0xFC, 0x71, - 0xF7, 0x48, 0x40, 0xEB, 0x4C, 0x1C, 0xC4, 0xAB, 0x4F, 0xC9, - 0xC7, 0xB0, 0x8C, 0xBF, 0x27, 0xE2, 0x18, 0xCA, 0x78, 0xAA, - 0xA0, 0x04, 0xAB, 0x6B, 0x6D, 0xBC, 0x89, 0xCB, 0x71, 0xA7, - 0xF8, 0x81, 0x0D, 0x4F, 0x2A, 0x9A, 0x37, 0x60, 0xA0, 0x6A, - 0x14, 0xE7, 0x30, 0x2E, 0x72, 0xF9, 0xE2, 0x39, 0x27, 0xD9, - 0xC6, 0xB2, 0x9E, 0xBC, 0x3D, 0xD6, 0x2D, 0xE4, 0xCD, 0xC2, - 0x40, 0x15, 0xC5, 0x7B, 0x8A, 0x06, 0x42, 0x46, 0xF2, 0x45, - 0x14, 0x83, 0x82, 0xAB, 0x30, 0x6C, 0x73, 0x92, 0x55, 0x51, - 0xE7, 0x8B, 0x3C, 0xD1, 0x2C, 0x8A, 0xC0, 0x16, 0x79, 0xC9, - 0xFD, 0x7C, 0x78, 0x1E, 0xE9, 0xDF, 0xF4, 0x08, 0xEF, 0x38, - 0xEC, 0xCB, 0x81, 0xF1, 0x87, 0x53, 0x8A, 0x0B, 0xF3, 0x56, - 0x0C, 0xBC, 0xEE, 0x03, 0xAE, 0xBC, 0xF8, 0x43, 0x3E, 0xA2, - 0xEA, 0x84, 0x37, 0x72, 0x8A, 0x80, 0x8D, 0x61, 0x1C, 0x79, - 0x3E, 0x4A, 0x5A, 0xC2, 0x73, 0xA0, 0x95, 0xDC, 0x46, 0x2B, - 0x5E, 0x4B, 0x89, 0xE3, 0x9F, 0xD7, 0x14, 0x61, 0x8B, 0x59, - 0xD1, 0x71, 0xB0, 0x04, 0xAA, 0x4B, 0x2A, 0xCA, 0xEF, 0x8D, - 0x3B, 0x4B, 0x52, 0x8F, 0x0B, 0x76, 0xB8, 0x38, 0xF8, 0xDD, - 0xD2, 0xE6, 0x46, 0x53, 0x1C, 0xD5, 0xC8, 0x1E, 0x85, 0x54, - 0x67, 0xC0, 0x77, 0x7E, 0x28, 0x2F, 0x91, 0xC5, 0xE5, 0x28, - 0x54, 0x37, 0xF6, 0x77, 0xEC, 0x6C, 0x36, 0x1D, 0x91, 0xA9, - 0x45, 0xCC, 0x85, 0x61, 0xAB, 0x14, 0xBE, 0x81, 0x6C, 0xFF, - 0x35, 0x8C, 0x13, 0x61, 0xE7, 0x66, 0x83, 0xFF, 0x67, 0x6C, - 0x80, 0x59, 0xD5, 0x6D, 0xAB, 0x5B, 0x81, 0x76, 0x39, 0x1B, - 0xBB, 0xD2, 0xFF, 0x1B, 0x7B, 0x66, 0xD6, 0x42, 0xD0, 0x86, - 0x62, 0x4A, 0xA1, 0x4F, 0x00, 0x41, 0x7E, 0x9C, 0xE5, 0xD6, - 0x82, 0x31, 0xA7, 0x34, 0x16, 0x20, 0x62, 0xFA, 0x1F, 0x6B, - 0x21, 0xBE, 0x62, 0x19, 0xE9, 0x56, 0x7A, 0x4C, 0xF0, 0x7B, - 0xB4, 0x2E, 0x4A, 0xA7, 0x20, 0xC3, 0x5F, 0x7F, 0x5A, 0xA2, - 0xAF, 0xF5, 0xC5, 0xFD, 0x1A, 0x7C, 0xB6, 0x06, 0xCA, 0xE3, - 0x74, 0x72, 0x4E, 0x77, 0xC9, 0xDD, 0x3B, 0x44, 0x16, 0x8C, - 0x45, 0x46, 0xC5, 0xE3, 0x81, 0x1E, 0x3C, 0x4D, 0xAC, 0x1A, - 0x7F, 0xAA, 0x6D, 0xFD, 0xE1, 0x45, 0x59, 0x11, 0x44, 0x48, - 0xB5, 0x09, 0xEF, 0x7E, 0xF2, 0x75, 0x0C, 0xBF, 0xC7, 0x17, - 0xB4, 0x9E, 0x10, 0xC0, 0x11, 0xDD, 0xB2, 0x59, 0xCF, 0x25, - 0x3B, 0xA8, 0x97, 0x56, 0x08, 0xE0, 0x65, 0x27, 0xC5, 0x29, - 0x34, 0xBD, 0x38, 0xB1, 0x39, 0xAA, 0x27, 0xFC, 0x96, 0xCB, - 0x9A, 0x2B, 0x92, 0x74, 0xDF, 0x0A, 0x52, 0xE4, 0x93, 0xA8, - 0x18, 0x15, 0x2C, 0x8C, 0x61, 0xD3, 0xBC, 0xD0, 0x9E, 0x9D, - 0x40, 0x1C, 0x69, 0x95, 0x0D, 0x52, 0x76, 0x3F, 0xD7, 0xD7, - 0xC1, 0x1C, 0x34, 0xE7, 0xD4, 0xD4, 0x17, 0x2D, 0xF0, 0x6A, - 0x1C, 0xE2, 0x53, 0x18, 0x60, 0xC6, 0xA1, 0xCD, 0x4F, 0xAA, - 0x16, 0xA0, 0xC3, 0x3B, 0xCE, 0x4D, 0x73, 0x0B, 0x63, 0x02, - 0x1C, 0xEE, 0x18, 0xBF, 0xF9, 0x33, 0x24, 0xD3, 0x02, 0x34, - 0xCC, 0xB9, 0xD7, 0xC2, 0x00, 0x7F, 0xB4, 0x08, 0x4B, 0xFC, - 0x1D, 0xDF, 0x42, 0x8C, 0x75, 0xEE, 0x13, 0x90, 0x37, 0x14, - 0x0D, 0xD2, 0xE0, 0x50, 0x90, 0x6A, 0xB9, 0xEF, 0x7F, 0x70, - 0x38, 0x2E, 0xCD, 0x39, 0x2E, 0x09, 0x51, 0xDF, 0x58, 0xBE, - 0x8E, 0x82, 0x91, 0xEB, 0xBC, 0xB4, 0x6B, 0x12, 0x40, 0x4E, - 0x44, 0xB8, 0x08, 0x97, 0x57, 0xF0, 0xFE, 0x61, 0xBD, 0x77, - 0xED, 0x46, 0xDA, 0xB7, 0xA4, 0xF5, 0x4F, 0xB2, 0xA6, 0xF1, - 0x47, 0x2D, 0x11, 0x26, 0x74, 0x55, 0x81, 0xFF, 0xFB, 0xEA, - 0x00, 0x03, 0x96, 0xD8, 0xE6, 0x6B, 0xEA, 0x3F, 0x0B, 0x0C, - 0xC0, 0xE4, 0x0A, 0x3D, 0x21, 0x3C, 0x99, 0x51, 0x91, 0x11, - 0xF0, 0x91, 0x68, 0xEE, 0xEE, 0xCD, 0x71, 0x42, 0xAD, 0xBA, - 0x34, 0x68, 0x9F, 0x67, 0xB1, 0xEE, 0x1C, 0x70, 0x7A, 0xFC, - 0x1E, 0x86, 0xF8, 0x96, 0x6C, 0x13, 0xD6, 0x36, 0x57, 0x5F, - 0x11, 0x2E, 0x1B, 0x97, 0xAB, 0x8B, 0x65, 0x3E, 0x8E, 0x91, - 0x69, 0x1C, 0x76, 0xAD, 0xB5, 0x8C, 0xE6, 0x02, 0x93, 0x16, - 0xA4, 0xF5, 0x14, 0x86, 0xB5, 0x16, 0x07, 0xF5, 0x0C, 0x01, - 0xE9, 0xDC, 0xEA, 0x86, 0x58, 0x98, 0xBA, 0x2C, 0x04, 0x0A, - 0x16, 0x8A, 0xF3, 0x10, 0x25, 0x48, 0x51, 0x21, 0x77, 0x69, - 0xF1, 0x22, 0xC3, 0xF4, 0x1D, 0xD5, 0x6D, 0x59, 0x1B, 0x44, - 0x88, 0xFC, 0xE5, 0x4B, 0xE1, 0xD6, 0xF4, 0x46, 0x4C, 0x9D, - 0x45, 0x93, 0xE1, 0xB5, 0x26, 0xDF, 0x48, 0x90, 0x13, 0xA6, - 0x65, 0x7E, 0x18, 0x6A, 0x79, 0x19, 0x81, 0x10, 0x08, 0x80, - 0xA4, 0x99, 0xD3, 0x98, 0x3C, 0x9E, 0x91, 0x31, 0xE9, 0x71, - 0xA0, 0x6A, 0xF9, 0x2F, 0x61, 0xA5, 0x72, 0x13, 0x6C, 0x4C, - 0xD2, 0xAF, 0x40, 0x8B, 0x0D, 0x3D, 0xE4, 0x24, 0x7B, 0x30, - 0x9C, 0xD0, 0x62, 0x42, 0x67, 0x54, 0xC6, 0x34, 0xF2, 0x55, - 0x70, 0x95, 0xAE, 0x16, 0x9F, 0xCC, 0x6F, 0xEA, 0x0B, 0x40, - 0x38, 0xAE, 0x74, 0x89, 0xCB, 0x64, 0x79, 0xF7, 0x08, 0x68, - 0x2C, 0x1E, 0xEE, 0x28, 0xEA, 0x77, 0xA2, 0xA3, 0x8E, 0xF4, - 0xEE, 0xFE, 0x62, 0x25, 0x98, 0xB1, 0xDE, 0x4B, 0x3A, 0x62, - 0xD9, 0x12, 0xD6, 0x09, 0x32, 0x6C, 0x80, 0x27, 0x21, 0x0A, - 0xFE, 0x4D, 0xBF, 0x29, 0x90, 0xCD, 0x6C, 0xE0, 0xAF, 0x06, - 0xB3, 0xC2, 0xDF, 0xB8, 0x50, 0x59, 0xD8, 0x0A, 0xB5, 0x98, - 0xC1, 0xA8, 0x80, 0xD7, 0x61, 0xFC, 0x59, 0xDB, 0xB1, 0x2A, - 0xA5, 0xD7, 0xFA, 0x9E, 0x93, 0x60, 0xD4, 0xB0, 0x6B, 0x44, - 0xB3, 0xC3, 0x3F, 0x9B, 0xEA, 0xD4, 0x8C, 0x08, 0x4B, 0x09, - 0x97, 0xC6, 0x2B, 0xC0, 0x8A, 0x92, 0x35, 0xCA, 0x6F, 0x93, - 0xD6, 0x71, 0x1E, 0xAB, 0x0F, 0x65, 0x42, 0xC2, 0x97, 0x77, - 0x10, 0x6E, 0xD4, 0xEE, 0x2A, 0xDF, 0x54, 0x2A, 0x5F, 0xB4, - 0xD4, 0x72, 0x18, 0x90, 0x42, 0x09, 0xAA, 0xC3, 0x31, 0x89 +#ifndef WOLFSSL_DILITHIUM_NO_SIGN +static const unsigned char bench_dilithium_level2_key[] = { + 0xea, 0x05, 0x24, 0x0d, 0x80, 0x72, 0x25, 0x55, 0xf4, 0x5b, + 0xc2, 0x13, 0x8b, 0x87, 0x5d, 0x31, 0x99, 0x2f, 0x1d, 0xa9, + 0x41, 0x09, 0x05, 0x76, 0xa7, 0xb7, 0x5e, 0x8c, 0x44, 0xe2, + 0x64, 0x79, 0xd8, 0x79, 0x4c, 0xee, 0x92, 0x2b, 0x37, 0xab, + 0xb1, 0x16, 0x65, 0x72, 0xc3, 0x49, 0xc2, 0xec, 0xfd, 0x9a, + 0xe6, 0x2d, 0x1e, 0x5b, 0xe3, 0x04, 0x96, 0x16, 0xad, 0x97, + 0x5d, 0xac, 0xf2, 0xcc, 0x62, 0x2e, 0x34, 0x5d, 0x67, 0x19, + 0x47, 0xee, 0x0f, 0x8b, 0x97, 0x60, 0xb4, 0x0b, 0xeb, 0x6a, + 0x7a, 0x75, 0x14, 0x27, 0x00, 0x39, 0xd6, 0x60, 0xce, 0x39, + 0x6e, 0x69, 0x46, 0xe1, 0x0d, 0xf9, 0xa6, 0xfa, 0x8c, 0xcf, + 0x65, 0x50, 0x59, 0x1d, 0xb0, 0x26, 0xc2, 0xe2, 0xf1, 0xb9, + 0xcd, 0x09, 0x60, 0xcc, 0xbb, 0x57, 0xd6, 0xac, 0xcc, 0xf9, + 0x58, 0x73, 0xa8, 0x81, 0x61, 0x2f, 0xd2, 0xa4, 0x5b, 0x98, + 0x0d, 0x12, 0x88, 0x51, 0x63, 0x38, 0x6e, 0xa2, 0x46, 0x64, + 0x52, 0xc0, 0x71, 0xc1, 0x42, 0x68, 0xd8, 0x42, 0x32, 0x5c, + 0xb4, 0x44, 0x08, 0x95, 0x48, 0xa2, 0x46, 0x6c, 0x0b, 0x10, + 0x09, 0xc8, 0x24, 0x4d, 0x18, 0x37, 0x4c, 0x4c, 0x82, 0x05, + 0x02, 0x22, 0x10, 0x4a, 0x86, 0x30, 0x03, 0x03, 0x11, 0x44, + 0x22, 0x62, 0x01, 0xa9, 0x51, 0x13, 0x02, 0x2c, 0x19, 0x85, + 0x65, 0x51, 0x14, 0x01, 0x9c, 0xb2, 0x81, 0x0a, 0x49, 0x52, + 0xa2, 0xb2, 0x4c, 0x98, 0x34, 0x01, 0x0a, 0x07, 0x06, 0x58, + 0xb2, 0x69, 0x51, 0x24, 0x2d, 0x59, 0x12, 0x52, 0xe0, 0xb4, + 0x04, 0x14, 0x40, 0x29, 0xa2, 0xb0, 0x31, 0x54, 0xc0, 0x40, + 0x63, 0x00, 0x69, 0x18, 0x47, 0x85, 0xc8, 0x30, 0x81, 0x0b, + 0x15, 0x0a, 0xd8, 0xa0, 0x0c, 0x5c, 0x20, 0x4a, 0x11, 0x38, + 0x64, 0x04, 0x94, 0x84, 0xd3, 0x24, 0x72, 0x58, 0x38, 0x28, + 0x18, 0x37, 0x6d, 0x94, 0xc0, 0x4d, 0xa0, 0xa6, 0x0c, 0x9a, + 0x82, 0x31, 0xc2, 0x40, 0x48, 0xda, 0x46, 0x85, 0x03, 0x00, + 0x05, 0xd8, 0x02, 0x4d, 0x0b, 0x85, 0x40, 0xe2, 0x32, 0x86, + 0x4c, 0xa0, 0x65, 0x8a, 0x36, 0x65, 0x42, 0x18, 0x6e, 0x60, + 0x36, 0x0d, 0x40, 0xc0, 0x01, 0x5a, 0x44, 0x42, 0xc4, 0xa4, + 0x0d, 0xd4, 0x88, 0x8d, 0x88, 0x22, 0x52, 0x00, 0xc0, 0x0c, + 0x5b, 0x36, 0x90, 0x09, 0x20, 0x22, 0x08, 0x03, 0x12, 0x90, + 0x12, 0x42, 0x04, 0x20, 0x29, 0x8c, 0x48, 0x6d, 0x20, 0x32, + 0x08, 0x94, 0x88, 0x6c, 0x10, 0x87, 0x21, 0xc1, 0x44, 0x02, + 0x52, 0x40, 0x12, 0xdb, 0xc8, 0x24, 0x14, 0x09, 0x2c, 0x93, + 0x40, 0x09, 0x64, 0xc8, 0x4c, 0x08, 0x48, 0x70, 0xa1, 0x10, + 0x81, 0x4a, 0x80, 0x8c, 0x20, 0x03, 0x31, 0x18, 0xb3, 0x80, + 0xd3, 0x82, 0x25, 0x4c, 0x94, 0x8c, 0x1c, 0x93, 0x89, 0x1a, + 0x91, 0x51, 0xd1, 0xb6, 0x68, 0x43, 0x14, 0x25, 0x84, 0x48, + 0x61, 0x82, 0x40, 0x24, 0xdb, 0x22, 0x4d, 0x63, 0x16, 0x66, + 0x62, 0x90, 0x50, 0xa1, 0x18, 0x86, 0x49, 0x28, 0x25, 0xa0, + 0x10, 0x68, 0x8c, 0x04, 0x00, 0x08, 0x32, 0x4e, 0x22, 0x43, + 0x31, 0x42, 0x96, 0x28, 0x11, 0x23, 0x89, 0xd2, 0xc4, 0x6d, + 0x11, 0x82, 0x8d, 0x8a, 0xa8, 0x90, 0xd2, 0x06, 0x29, 0x80, + 0x82, 0x89, 0x00, 0xa8, 0x41, 0x00, 0x13, 0x6a, 0x12, 0xa8, + 0x04, 0x83, 0xc2, 0x51, 0x13, 0x09, 0x08, 0x62, 0xb4, 0x8d, + 0x94, 0xc2, 0x44, 0x5a, 0xb4, 0x08, 0x0a, 0x10, 0x48, 0xa1, + 0x28, 0x20, 0x1b, 0xb7, 0x64, 0x60, 0x24, 0x25, 0x48, 0xc0, + 0x00, 0x0a, 0x10, 0x09, 0x64, 0xb8, 0x88, 0xcb, 0x44, 0x64, + 0x54, 0x90, 0x05, 0xd2, 0xb8, 0x21, 0x49, 0x28, 0x28, 0x49, + 0x42, 0x0d, 0x63, 0xa0, 0x65, 0xcb, 0x90, 0x30, 0x51, 0x82, + 0x8d, 0x5c, 0xc6, 0x0c, 0x51, 0x06, 0x6a, 0x1a, 0x27, 0x22, + 0x01, 0xa8, 0x24, 0x61, 0xb2, 0x84, 0x23, 0x40, 0x86, 0xa3, + 0xb4, 0x48, 0x19, 0x28, 0x0c, 0x14, 0x06, 0x2e, 0xe2, 0x02, + 0x0d, 0xc4, 0x90, 0x09, 0x08, 0x06, 0x66, 0x9b, 0xc8, 0x10, + 0x5c, 0x46, 0x21, 0xca, 0xa8, 0x30, 0x83, 0x20, 0x89, 0x03, + 0x83, 0x6c, 0xa1, 0x46, 0x8c, 0x90, 0x14, 0x4c, 0x99, 0x02, + 0x81, 0x53, 0x02, 0x10, 0x8b, 0x48, 0x91, 0xe4, 0x40, 0x4a, + 0x22, 0xb1, 0x88, 0xc1, 0x06, 0x0e, 0xc3, 0xa8, 0x08, 0xc8, + 0x46, 0x92, 0x03, 0xb5, 0x4c, 0x23, 0x03, 0x0c, 0xa4, 0x06, + 0x2e, 0xdc, 0x92, 0x81, 0x0c, 0x45, 0x22, 0x40, 0x34, 0x91, + 0x90, 0x96, 0x48, 0x81, 0x82, 0x31, 0xcb, 0x16, 0x72, 0x49, + 0xc8, 0x29, 0x44, 0x86, 0x90, 0x60, 0x22, 0x4e, 0x42, 0x42, + 0x09, 0x4b, 0x82, 0x20, 0x0a, 0xb2, 0x64, 0x20, 0x86, 0x70, + 0x1a, 0xc0, 0x00, 0x1c, 0x41, 0x49, 0x89, 0x84, 0x05, 0x0c, + 0x36, 0x49, 0x19, 0x99, 0x6d, 0x00, 0x08, 0x50, 0x23, 0x96, + 0x6c, 0xe0, 0x44, 0x08, 0x98, 0x24, 0x2c, 0x0a, 0x23, 0x20, + 0x12, 0x04, 0x31, 0xc9, 0x06, 0x32, 0x14, 0x01, 0x41, 0x08, + 0x37, 0x08, 0x58, 0x00, 0x0c, 0x19, 0x04, 0x29, 0x90, 0x18, + 0x05, 0xe1, 0x88, 0x44, 0xc2, 0x20, 0x6c, 0xd1, 0x46, 0x64, + 0xd9, 0x26, 0x62, 0x09, 0x88, 0x68, 0x02, 0x29, 0x29, 0xe1, + 0x18, 0x65, 0x98, 0x04, 0x24, 0xe4, 0x34, 0x0c, 0x12, 0x85, + 0x2d, 0x20, 0x14, 0x06, 0x24, 0x15, 0x82, 0x89, 0x08, 0x91, + 0x60, 0x84, 0x28, 0x24, 0x34, 0x41, 0x1b, 0x49, 0x22, 0xd3, + 0x96, 0x64, 0x1b, 0x86, 0x4c, 0x0c, 0xb9, 0x20, 0x20, 0x39, + 0x04, 0x04, 0x34, 0x6d, 0xc1, 0x28, 0x32, 0x08, 0x14, 0x44, + 0x81, 0x18, 0x2e, 0xda, 0x38, 0x41, 0x63, 0x18, 0x26, 0xd8, + 0x48, 0x26, 0x12, 0x20, 0x21, 0x09, 0xc5, 0x25, 0x92, 0x42, + 0x0c, 0x88, 0x04, 0x64, 0x11, 0x43, 0x8a, 0x19, 0x92, 0x60, + 0x5c, 0xc6, 0x31, 0xa1, 0x24, 0x6a, 0xd8, 0xb6, 0x49, 0x1b, + 0x81, 0x90, 0xe2, 0x32, 0x4e, 0x62, 0x44, 0x21, 0x80, 0xb8, + 0x10, 0x4b, 0x90, 0x49, 0x5c, 0x06, 0x09, 0x48, 0x20, 0x49, + 0xa2, 0x92, 0x71, 0x5c, 0x48, 0x02, 0xc8, 0x08, 0x81, 0xa4, + 0x32, 0x66, 0xc9, 0x30, 0x11, 0xca, 0x92, 0x91, 0xc0, 0x00, + 0x41, 0x44, 0x98, 0x4d, 0x98, 0x12, 0x4e, 0x92, 0x46, 0x8e, + 0x49, 0xb8, 0x64, 0xdc, 0x18, 0x50, 0x51, 0xb4, 0x48, 0x08, + 0x47, 0x24, 0x08, 0x46, 0x32, 0x1b, 0x23, 0x00, 0x09, 0xb8, + 0x04, 0x0a, 0x44, 0x0c, 0x0b, 0xc7, 0x8d, 0x19, 0xa4, 0x09, + 0x11, 0x30, 0x41, 0xe3, 0x24, 0x45, 0x89, 0x1f, 0x65, 0x54, + 0xf6, 0x38, 0x04, 0x37, 0xcc, 0x89, 0xc3, 0xc5, 0xdc, 0x43, + 0xd9, 0x13, 0x56, 0x06, 0x05, 0x50, 0x29, 0x4e, 0x0f, 0xa5, + 0x5c, 0x5d, 0xd7, 0x82, 0xa1, 0x63, 0x59, 0x0d, 0x3e, 0x5b, + 0x00, 0xe6, 0x0e, 0xd8, 0x1c, 0xc7, 0xaf, 0xc0, 0x48, 0xb6, + 0x07, 0x5c, 0x65, 0x00, 0x89, 0xb3, 0x09, 0xbc, 0x4a, 0xaa, + 0xa6, 0x72, 0xbe, 0x6b, 0x9a, 0xb3, 0x5b, 0x27, 0x82, 0x65, + 0x9b, 0xc9, 0x6f, 0x19, 0x88, 0x94, 0x0b, 0x37, 0x44, 0x2f, + 0xe3, 0x9a, 0x02, 0xda, 0xff, 0x11, 0xb0, 0x48, 0x89, 0x70, + 0x8c, 0x84, 0xc2, 0xc0, 0x31, 0x4a, 0xad, 0x70, 0xe1, 0xa7, + 0x15, 0xfd, 0xb2, 0x6d, 0x93, 0xda, 0x17, 0x68, 0xc4, 0xe3, + 0xfd, 0x2c, 0x08, 0x15, 0xb9, 0xa4, 0xc5, 0x1b, 0x97, 0xc9, + 0xa3, 0xaf, 0x0d, 0x21, 0x06, 0x3d, 0xf1, 0x05, 0xd4, 0x35, + 0x80, 0x2e, 0x23, 0x99, 0xbd, 0x3a, 0x1a, 0x6c, 0xad, 0xbf, + 0x56, 0xb5, 0xd3, 0x95, 0x1b, 0x30, 0x4d, 0x56, 0xc1, 0x77, + 0xe6, 0xd6, 0xab, 0x94, 0x46, 0x68, 0xd7, 0xb8, 0xe4, 0x9d, + 0xb2, 0x8d, 0xc4, 0xd1, 0xc8, 0x92, 0xbe, 0x5d, 0x1f, 0x58, + 0x55, 0x7f, 0x11, 0x55, 0xc5, 0x2e, 0xc3, 0x9e, 0x2a, 0x29, + 0x51, 0xe8, 0x75, 0x49, 0xa7, 0xa3, 0xda, 0x0b, 0xcf, 0xf8, + 0x3f, 0x78, 0xac, 0x4c, 0x4e, 0x78, 0x6f, 0x0e, 0x67, 0xad, + 0x94, 0x59, 0x20, 0x5e, 0x37, 0x18, 0xb9, 0x09, 0x87, 0xdb, + 0xdd, 0xf0, 0xc2, 0x4d, 0x03, 0xcc, 0x98, 0x22, 0x4b, 0xe5, + 0x7d, 0x8e, 0x74, 0x7e, 0xa9, 0x1b, 0xeb, 0x7a, 0xae, 0xaf, + 0x2e, 0x7c, 0x3c, 0xc0, 0x1a, 0x30, 0x40, 0x0d, 0x79, 0x86, + 0x53, 0xcc, 0x0b, 0x2b, 0xbe, 0xa5, 0x72, 0x3b, 0xbb, 0x53, + 0x9e, 0xd5, 0xc2, 0x23, 0x1d, 0x35, 0xcd, 0x22, 0x12, 0xed, + 0x9a, 0xee, 0xc8, 0xf9, 0x05, 0x27, 0xdb, 0x46, 0x56, 0xcc, + 0x24, 0x4d, 0xee, 0xaf, 0xab, 0xa9, 0x78, 0x75, 0x75, 0xb9, + 0xd1, 0xfd, 0x39, 0x3a, 0xb2, 0xa2, 0xeb, 0x87, 0x76, 0xb2, + 0x19, 0x47, 0x88, 0xab, 0x42, 0x85, 0x4b, 0xd9, 0x76, 0x22, + 0x68, 0x4b, 0xc9, 0x88, 0x38, 0x28, 0x0a, 0x34, 0x5d, 0x12, + 0x4f, 0xf5, 0x43, 0x64, 0x44, 0x8c, 0x3c, 0xc2, 0x99, 0x91, + 0x4e, 0xfd, 0xfd, 0x9c, 0x73, 0xbf, 0x85, 0xf9, 0x9f, 0xe1, + 0x53, 0x19, 0xc8, 0x19, 0xcb, 0x7c, 0xdb, 0x9a, 0x3a, 0x2c, + 0x34, 0x55, 0x8c, 0x64, 0x6f, 0xc5, 0xb7, 0x93, 0x53, 0xb4, + 0x97, 0x7e, 0xc2, 0xf8, 0x7e, 0x8d, 0x44, 0x10, 0xca, 0x49, + 0xf5, 0x5c, 0xe8, 0xce, 0xc4, 0xcc, 0x42, 0xf0, 0x85, 0xf1, + 0xf2, 0x10, 0xa7, 0x0b, 0x37, 0x6a, 0x8e, 0x50, 0x96, 0x96, + 0x9d, 0xd9, 0x8f, 0x54, 0x45, 0x56, 0xf8, 0x64, 0x88, 0xab, + 0x51, 0x4f, 0x9f, 0x61, 0xd9, 0x12, 0x87, 0xac, 0x1d, 0xc1, + 0x23, 0xea, 0xb3, 0x5d, 0xa4, 0x6d, 0xfa, 0x58, 0x92, 0x8f, + 0x77, 0x78, 0x61, 0xe5, 0xe4, 0x33, 0xdb, 0x10, 0x2d, 0xdd, + 0xb6, 0xd7, 0xb4, 0xd0, 0x8d, 0xd1, 0xa8, 0x0b, 0x94, 0xdf, + 0xcf, 0xd7, 0xac, 0xdf, 0x47, 0x0b, 0x38, 0xe0, 0xa5, 0xf8, + 0xc3, 0xd2, 0xc3, 0xfb, 0x0f, 0x98, 0x00, 0x2b, 0x17, 0x3c, + 0x44, 0x70, 0x36, 0x47, 0x27, 0x89, 0x41, 0xcb, 0x87, 0x5a, + 0xa4, 0x2c, 0x57, 0x6d, 0x8c, 0xcb, 0xc0, 0x7d, 0x6b, 0xf5, + 0xa1, 0x17, 0x39, 0x4a, 0xb5, 0xac, 0xc6, 0x41, 0x90, 0x66, + 0x85, 0xc4, 0x4b, 0x18, 0xc6, 0xe6, 0x09, 0x6d, 0x6e, 0xbb, + 0x7f, 0x72, 0x96, 0xd3, 0x21, 0x5a, 0x96, 0xaf, 0x9e, 0xb6, + 0x0b, 0x3f, 0xe8, 0x83, 0xe5, 0x53, 0x11, 0x81, 0xc6, 0xab, + 0x40, 0xa9, 0x09, 0xb6, 0x74, 0x5e, 0xe1, 0xc3, 0x82, 0x1e, + 0xda, 0x2f, 0x24, 0xe0, 0x94, 0x8f, 0x07, 0xb7, 0x9b, 0xc6, + 0x50, 0xef, 0x3a, 0x79, 0x89, 0x4d, 0x6f, 0x16, 0x33, 0x04, + 0x24, 0x7e, 0x4a, 0xab, 0x5d, 0x03, 0x29, 0xad, 0xba, 0xa3, + 0x6c, 0xe2, 0x05, 0xab, 0x4d, 0x69, 0xb6, 0x61, 0x39, 0x9d, + 0xc3, 0x53, 0x11, 0xc0, 0xe3, 0xaa, 0x2e, 0xdc, 0x74, 0x09, + 0xbd, 0x19, 0xb5, 0xbb, 0x51, 0x1e, 0x77, 0x3e, 0xce, 0x64, + 0x13, 0xeb, 0x74, 0x03, 0xb7, 0x49, 0x99, 0xb0, 0x71, 0x99, + 0xe6, 0x17, 0x3c, 0x80, 0xe6, 0xb5, 0x51, 0xe9, 0xb3, 0xe4, + 0x2b, 0xaa, 0x52, 0x15, 0x99, 0x4e, 0x46, 0x6d, 0x67, 0x8e, + 0x79, 0xc4, 0x3c, 0xa6, 0xdc, 0x8f, 0xed, 0x87, 0xb9, 0x68, + 0x6d, 0xdc, 0x19, 0xa1, 0x52, 0x37, 0x06, 0x76, 0xad, 0xe9, + 0x61, 0x5c, 0x82, 0x16, 0x81, 0xaf, 0x3a, 0x89, 0xbf, 0x72, + 0xb0, 0xc7, 0x88, 0x3c, 0x58, 0xfe, 0xe4, 0xa5, 0x41, 0x50, + 0xfc, 0x8a, 0x15, 0xb0, 0x78, 0xd4, 0x77, 0x06, 0x4b, 0xc4, + 0x21, 0x7f, 0xaa, 0x2b, 0x88, 0x7f, 0x8c, 0x3b, 0x9b, 0xbb, + 0x2e, 0x41, 0xcf, 0x9b, 0x06, 0xd3, 0x4d, 0xcf, 0xb2, 0x9c, + 0x91, 0x46, 0x35, 0x3a, 0x5a, 0x0b, 0xe4, 0xac, 0x96, 0x7c, + 0xe0, 0xd4, 0x34, 0xe5, 0xab, 0xae, 0xa7, 0x67, 0xbf, 0x4d, + 0xab, 0x48, 0xfd, 0xcb, 0x3f, 0x5c, 0xde, 0x3f, 0x83, 0xcc, + 0x52, 0x0f, 0xdd, 0x7f, 0x20, 0x25, 0xed, 0xee, 0xd0, 0x14, + 0x38, 0xf7, 0x33, 0x4c, 0x3c, 0x5e, 0x23, 0x80, 0xa3, 0x0a, + 0xe8, 0xb0, 0xef, 0x5b, 0xca, 0xc9, 0x97, 0x13, 0x98, 0xfe, + 0x91, 0x62, 0x14, 0xa8, 0x64, 0xf6, 0x20, 0xc9, 0xc9, 0x6f, + 0x8b, 0xc0, 0xec, 0x39, 0x15, 0xa7, 0x59, 0x62, 0x68, 0x21, + 0xe1, 0x5f, 0xf6, 0xa1, 0x76, 0xb0, 0xca, 0x1b, 0x2a, 0x71, + 0xe3, 0x1a, 0x24, 0x91, 0x1f, 0x3a, 0xbb, 0xf1, 0xc9, 0x09, + 0x42, 0x48, 0x7e, 0x19, 0x1b, 0xf1, 0xf0, 0x13, 0x33, 0xf1, + 0x62, 0x31, 0x00, 0x97, 0x73, 0x9b, 0x3c, 0x26, 0xf8, 0x42, + 0xd0, 0xd4, 0x41, 0x1b, 0x9f, 0x7e, 0x43, 0x4b, 0x0b, 0x08, + 0xd7, 0xa0, 0xa8, 0x32, 0x34, 0x0a, 0xc9, 0xef, 0xb8, 0xeb, + 0xe7, 0x64, 0x3b, 0x40, 0x88, 0xe0, 0x60, 0x59, 0x07, 0xef, + 0xb9, 0x5f, 0x71, 0x92, 0x90, 0xa4, 0x5f, 0x34, 0x38, 0x93, + 0x92, 0x43, 0x87, 0xaf, 0xdd, 0x87, 0x63, 0x8c, 0x1d, 0xe5, + 0x86, 0x9e, 0xe6, 0xde, 0x94, 0xdd, 0x33, 0x5d, 0x95, 0x64, + 0xd8, 0xc4, 0x8a, 0x3c, 0xe7, 0x4b, 0xd6, 0x3f, 0xc5, 0x69, + 0x6a, 0xa8, 0x7f, 0x0f, 0x93, 0x77, 0x02, 0x46, 0x66, 0xa5, + 0xa0, 0x60, 0x8b, 0xec, 0xb1, 0xa2, 0xfc, 0x2a, 0x09, 0xb8, + 0x08, 0x1c, 0x05, 0x6b, 0x78, 0xb7, 0x7a, 0xe5, 0x60, 0xa4, + 0xaf, 0x3a, 0x9d, 0xaa, 0xf5, 0x22, 0x9b, 0x5e, 0xef, 0xc3, + 0x46, 0xed, 0x67, 0xd0, 0x8b, 0xda, 0xb4, 0xa3, 0x34, 0x32, + 0x20, 0x9d, 0x88, 0x7e, 0x43, 0x42, 0x6f, 0x02, 0xf8, 0x48, + 0x9b, 0xc5, 0x02, 0xad, 0xaa, 0xa9, 0xee, 0x19, 0x1b, 0xde, + 0x02, 0x83, 0x81, 0x10, 0xa6, 0x79, 0x4e, 0xad, 0x15, 0xf7, + 0x3e, 0x4e, 0x1e, 0x72, 0xfe, 0x52, 0x49, 0x24, 0xce, 0x82, + 0x31, 0x59, 0x72, 0xae, 0xd5, 0x34, 0x50, 0x87, 0x8b, 0xe3, + 0x8e, 0xec, 0x61, 0x35, 0x13, 0x57, 0xb1, 0xe6, 0xac, 0xfb, + 0x16, 0xc3, 0x1a, 0x98, 0x92, 0xcb, 0xcd, 0xc9, 0xf7, 0x10, + 0x6a, 0x43, 0x96, 0x33, 0x2d, 0x6f, 0x6c, 0x76, 0xb0, 0xf6, + 0x48, 0x4c, 0xae, 0x13, 0x67, 0x5d, 0x42, 0x01, 0x8e, 0x54, + 0x51, 0xcc, 0x65, 0xf1, 0x95, 0x11, 0x3c, 0x96, 0x2a, 0x5a, + 0x42, 0x3d, 0x9b, 0xbb, 0xb7, 0x7b, 0x28, 0x96, 0x09, 0xbb, + 0xed, 0x2d, 0xbc, 0xb7, 0x90, 0x62, 0xd3, 0xbe, 0xbd, 0xae, + 0x50, 0x15, 0x96, 0xc1, 0x03, 0x91, 0x14, 0x34, 0x4f, 0x21, + 0xa5, 0x6e, 0x78, 0x4a, 0x5d, 0x8b, 0xcf, 0x5b, 0x1a, 0x8a, + 0x57, 0x43, 0xb8, 0x25, 0xd3, 0xa2, 0xcd, 0x78, 0xb4, 0x93, + 0x07, 0x7a, 0x14, 0xc1, 0x0c, 0x6f, 0x5f, 0x5e, 0xcb, 0x11, + 0x17, 0x81, 0x0d, 0x7d, 0x0f, 0xda, 0xd1, 0x92, 0x43, 0x56, + 0xaf, 0x75, 0x53, 0x44, 0x1f, 0xc7, 0x9c, 0xd3, 0xc5, 0x47, + 0xe0, 0xac, 0x4a, 0x11, 0xe4, 0xfe, 0x6c, 0x80, 0x79, 0xcc, + 0x60, 0x7a, 0xd9, 0x56, 0x65, 0x83, 0x5e, 0xcf, 0x37, 0x27, + 0x55, 0xe2, 0x4d, 0xf9, 0xd6, 0x09, 0x2d, 0xee, 0xda, 0x10, + 0x6b, 0xdc, 0xd2, 0x70, 0x46, 0x94, 0xaa, 0xf5, 0x21, 0xc5, + 0xf0, 0x79, 0xdb, 0x9b, 0x8e, 0x9a, 0xdb, 0x5a, 0x56, 0x41, + 0x43, 0xe7, 0x1f, 0x8d, 0xfd, 0xda, 0x12, 0x5f, 0xf7, 0x9e, + 0x47, 0x1a, 0xf7, 0x73, 0x40, 0x67, 0xc2, 0x61, 0x07, 0x33, + 0x16, 0x78, 0x60, 0x05, 0x85, 0x5c, 0x2f, 0x2b, 0xbf, 0x2c, + 0x7a, 0x39, 0xc6, 0xed, 0xcb, 0x43, 0x66, 0x27, 0x93, 0xcd, + 0x92, 0x8d, 0x62, 0x8c, 0xaa, 0x61, 0x1c, 0x9c, 0x4c, 0x90, + 0xba, 0xba, 0x4b, 0xc1, 0xf1, 0x22, 0xde, 0xe0, 0xf9, 0x3e, + 0x04, 0xb9, 0x56, 0xa3, 0x1c, 0xe8, 0xda, 0xd6, 0x09, 0x4a, + 0x7d, 0x89, 0xbc, 0xf4, 0xe8, 0x4d, 0xa1, 0xe8, 0x34, 0x90, + 0xa5, 0x31, 0x3a, 0xec, 0x56, 0xc5, 0xd2, 0x92, 0x0b, 0xe9, + 0x58, 0xbb, 0xb2, 0x84, 0x9b, 0xa9, 0x1d, 0x19, 0xdb, 0x7a, + 0x02, 0x75, 0x79, 0x16, 0x35, 0xee, 0x3a, 0x3f, 0x4e, 0x5e, + 0x11, 0x90, 0x04, 0x03, 0xce, 0x8b, 0xa0, 0xd8, 0xc1, 0xee, + 0x52, 0x33, 0x6e, 0xd2, 0x6e, 0x06, 0x5c, 0x99, 0x24, 0x6f, + 0x16, 0xd9, 0x90, 0x28, 0xe5, 0x2d, 0x91, 0x6f, 0x1a, 0x57, + 0xf0, 0x4c, 0x7c, 0x3f, 0x7b, 0xd7, 0x30, 0xed, 0x6d, 0x21, + 0xb7, 0xf8, 0xed, 0xf3, 0x34, 0x89, 0xfa, 0xf0, 0x51, 0x6f, + 0x99, 0xa0, 0x5e, 0xf8, 0x74, 0xc7, 0x4f, 0xb5, 0x59, 0x52, + 0xbe, 0x45, 0xac, 0x3f, 0x34, 0x51, 0x87, 0x6e, 0x84, 0xea, + 0xb0, 0x40, 0xe1, 0x84, 0x16, 0x66, 0x30, 0xf1, 0x5c, 0xb2, + 0x74, 0x25, 0x03, 0xe3, 0x2e, 0x82, 0xc5, 0x60, 0x9d, 0xe4, + 0xca, 0xec, 0x49, 0x6b, 0x4e, 0x5a, 0x09, 0xa8, 0xfe, 0xff, + 0x1d, 0xa1, 0xe8, 0xec, 0x9a, 0x22, 0x3b, 0xd6, 0x72, 0x93, + 0x6f, 0x6b, 0x5a, 0xfb, 0x2d, 0x5a, 0xde, 0x01, 0x3e, 0xf6, + 0xdc, 0x77, 0x55, 0x1e, 0x32, 0x19, 0xc8, 0xa1, 0xbb, 0xcf, + 0xcb, 0x41, 0x54, 0xa2, 0xcb, 0xe6, 0x61, 0xca, 0x43, 0x63, + 0xd2, 0x2c, 0xae, 0xf4, 0xd9, 0x49, 0xb1, 0x75, 0x1a, 0x06, + 0x92, 0x13, 0x90, 0x57, 0x89, 0x8e, 0x9f, 0x26, 0xc5, 0x14, + 0xd8, 0xc7, 0x93, 0xb2, 0xaa, 0x3a, 0x9c, 0x10, 0xd5, 0x68, + 0x52, 0x28, 0x39, 0xee, 0x30, 0xdc, 0x00, 0x4b, 0x65, 0x72, + 0x59, 0x98, 0xad, 0x2e, 0x8c, 0xaf, 0x4e, 0x79, 0x0a, 0x8c, + 0x0c, 0x9d, 0xb6, 0x43, 0x26, 0x83, 0x71, 0x7b, 0x1e, 0x86, + 0x4d, 0x33, 0xd7, 0x20, 0x29, 0x6a, 0xbf, 0x2f, 0x8e, 0x4b, + 0x13, 0x35, 0x65, 0xc8, 0xec, 0xe3, 0x2c, 0xde, 0xfb, 0x30, + 0x57, 0xa9, 0x92, 0x22, 0x5d, 0x79, 0x16, 0x07, 0x73, 0x9b, + 0xe2, 0x6e, 0xd4, 0x99, 0xb4, 0x35, 0xfd, 0xa2, 0xb5, 0xd9, + 0xe5, 0x74, 0xd1, 0xb2, 0xcf, 0x32, 0xf1, 0x19, 0x69, 0xcf, + 0x1e, 0x10, 0xcc, 0x3c, 0xaf, 0xbe, 0xa4, 0x33, 0x11, 0x83, + 0x64, 0xc0, 0x39, 0xe5, 0xb0, 0x8f, 0x32, 0xf4, 0x01, 0x6a, + 0x2a, 0x11, 0x8e, 0xdd, 0x03, 0x81, 0x39, 0xe7, 0x70, 0x16, + 0x2f, 0x0e, 0x24, 0xa9, 0x12, 0x0b, 0xdb, 0xa8, 0x6c, 0xb3, + 0xf3, 0x74, 0x95, 0xca, 0x64, 0x1d, 0xee, 0x25, 0xc5, 0x27, + 0xed, 0x0f, 0x82, 0xb5, 0x7a, 0x62, 0x27, 0xb2, 0x87, 0x53, + 0x11, 0x39, 0x5e, 0xb8, 0x11, 0xca, 0x25, 0xe8, 0x17, 0x46, + 0xd3, 0x0f, 0x5d, 0x70, 0x68, 0xe1, 0x5f, 0xd1, 0xab, 0x65, + 0xe5, 0x42, 0x87, 0x1e, 0x96, 0xaf, 0x13, 0x0c, 0x9b, 0x15, + 0x75, 0x14, 0x31, 0x75, 0xcc, 0x15, 0xbf, 0x2c, 0x74, 0xab, + 0xc9, 0x9c, 0xda, 0x62, 0x1d, 0xeb, 0x19, 0x81, 0x67, 0x5e, + 0xcd, 0x54, 0x87, 0x07, 0x67, 0xba, 0xe3, 0xf6, 0x03, 0xbe, + 0x6d, 0x64, 0x2d, 0xbc, 0xec, 0x54, 0x13, 0x12, 0x5b, 0x44, + 0x90, 0x95, 0x86, 0x77, 0x8c, 0x59, 0xbd, 0x8e, 0xba, 0xb1, + 0x12, 0xea, 0xc1, 0x94, 0x37, 0xa0, 0x11, 0xff, 0xb2, 0xa4, + 0xc3, 0x61, 0xf2, 0xa3, 0x49, 0xbe, 0xe7, 0xb6, 0x96, 0x2f, }; static const int sizeof_bench_dilithium_level2_key = sizeof(bench_dilithium_level2_key); -/* certs/dilithium/bench_dilithium_level3_key.der */ -static const unsigned char bench_dilithium_level3_key[] = -{ - 0x30, 0x82, 0x17, 0x5A, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, - 0x0B, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x02, 0x82, 0x0B, 0x07, - 0x06, 0x05, 0x04, 0x82, 0x17, 0x44, 0x04, 0x82, 0x17, 0x40, - 0x2E, 0xFE, 0x07, 0xDF, 0x5E, 0xF9, 0x18, 0xB4, 0x0E, 0xBF, - 0x9C, 0x1C, 0xCA, 0x84, 0xBA, 0x62, 0xB9, 0xA2, 0x96, 0x76, - 0xB6, 0xB7, 0x77, 0x9C, 0xBE, 0x0C, 0xF8, 0xA5, 0xEF, 0x74, - 0xB1, 0xC2, 0x8D, 0x95, 0x6D, 0x38, 0x49, 0x01, 0xA8, 0x3D, - 0x63, 0x0B, 0xDF, 0x4B, 0x5D, 0xF4, 0xC4, 0x98, 0x27, 0x77, - 0x88, 0xA0, 0xA9, 0xF2, 0x38, 0x32, 0x62, 0x17, 0x11, 0xD6, - 0xBE, 0xA0, 0xFD, 0xEB, 0xBF, 0x4A, 0xF2, 0x6C, 0x44, 0x62, - 0x2D, 0x87, 0x3D, 0xAD, 0x0C, 0x47, 0x06, 0x00, 0x7E, 0xAF, - 0x52, 0xE7, 0xA1, 0x8E, 0x7A, 0xA7, 0x7D, 0x3C, 0xE5, 0xB2, - 0x59, 0xDA, 0x89, 0x76, 0xF7, 0xD4, 0x73, 0x16, 0x33, 0x67, - 0x88, 0x46, 0x51, 0x13, 0x12, 0x38, 0x64, 0x76, 0x73, 0x40, - 0x16, 0x55, 0x70, 0x06, 0x32, 0x84, 0x47, 0x25, 0x33, 0x44, - 0x70, 0x68, 0x36, 0x25, 0x62, 0x47, 0x76, 0x65, 0x73, 0x11, - 0x28, 0x00, 0x75, 0x33, 0x81, 0x13, 0x62, 0x51, 0x31, 0x33, - 0x11, 0x41, 0x51, 0x62, 0x55, 0x33, 0x07, 0x60, 0x14, 0x18, - 0x30, 0x58, 0x22, 0x67, 0x26, 0x86, 0x12, 0x78, 0x17, 0x47, - 0x30, 0x06, 0x05, 0x36, 0x37, 0x23, 0x08, 0x67, 0x05, 0x05, - 0x06, 0x85, 0x33, 0x83, 0x14, 0x63, 0x44, 0x35, 0x00, 0x04, - 0x56, 0x03, 0x23, 0x03, 0x33, 0x13, 0x02, 0x23, 0x25, 0x80, - 0x22, 0x00, 0x53, 0x73, 0x13, 0x70, 0x03, 0x84, 0x15, 0x50, - 0x14, 0x20, 0x06, 0x74, 0x03, 0x41, 0x26, 0x74, 0x63, 0x65, - 0x42, 0x03, 0x00, 0x72, 0x66, 0x44, 0x36, 0x88, 0x60, 0x85, - 0x76, 0x86, 0x17, 0x72, 0x16, 0x37, 0x23, 0x82, 0x15, 0x84, - 0x57, 0x14, 0x20, 0x72, 0x15, 0x55, 0x26, 0x42, 0x82, 0x66, - 0x40, 0x54, 0x03, 0x54, 0x62, 0x61, 0x83, 0x35, 0x20, 0x76, - 0x62, 0x14, 0x37, 0x35, 0x42, 0x04, 0x32, 0x72, 0x08, 0x35, - 0x42, 0x74, 0x51, 0x24, 0x54, 0x86, 0x36, 0x56, 0x11, 0x83, - 0x64, 0x44, 0x54, 0x78, 0x80, 0x50, 0x55, 0x72, 0x84, 0x16, - 0x48, 0x13, 0x04, 0x17, 0x06, 0x36, 0x25, 0x48, 0x21, 0x33, - 0x45, 0x71, 0x21, 0x54, 0x10, 0x26, 0x13, 0x72, 0x12, 0x30, - 0x03, 0x73, 0x48, 0x84, 0x16, 0x22, 0x11, 0x38, 0x26, 0x43, - 0x53, 0x36, 0x56, 0x12, 0x15, 0x70, 0x07, 0x57, 0x00, 0x65, - 0x72, 0x11, 0x73, 0x48, 0x01, 0x13, 0x31, 0x58, 0x82, 0x60, - 0x61, 0x17, 0x78, 0x44, 0x48, 0x15, 0x48, 0x26, 0x62, 0x43, - 0x72, 0x44, 0x62, 0x76, 0x40, 0x15, 0x63, 0x26, 0x10, 0x51, - 0x82, 0x21, 0x05, 0x82, 0x30, 0x56, 0x58, 0x62, 0x76, 0x48, - 0x67, 0x82, 0x86, 0x51, 0x32, 0x37, 0x78, 0x38, 0x13, 0x82, - 0x55, 0x22, 0x45, 0x22, 0x68, 0x66, 0x15, 0x30, 0x35, 0x77, - 0x04, 0x28, 0x45, 0x85, 0x72, 0x48, 0x30, 0x26, 0x06, 0x24, - 0x12, 0x75, 0x42, 0x53, 0x88, 0x14, 0x15, 0x07, 0x08, 0x86, - 0x05, 0x08, 0x01, 0x56, 0x77, 0x44, 0x38, 0x53, 0x22, 0x21, - 0x20, 0x56, 0x25, 0x15, 0x72, 0x68, 0x27, 0x03, 0x71, 0x25, - 0x64, 0x11, 0x44, 0x34, 0x77, 0x60, 0x68, 0x58, 0x44, 0x74, - 0x76, 0x63, 0x86, 0x16, 0x01, 0x40, 0x68, 0x51, 0x20, 0x12, - 0x36, 0x55, 0x01, 0x84, 0x61, 0x80, 0x46, 0x36, 0x28, 0x82, - 0x44, 0x66, 0x14, 0x80, 0x50, 0x32, 0x34, 0x46, 0x21, 0x34, - 0x63, 0x04, 0x22, 0x20, 0x17, 0x84, 0x88, 0x88, 0x47, 0x02, - 0x52, 0x60, 0x45, 0x35, 0x86, 0x72, 0x71, 0x43, 0x30, 0x58, - 0x24, 0x11, 0x11, 0x64, 0x45, 0x36, 0x25, 0x18, 0x82, 0x18, - 0x16, 0x80, 0x27, 0x76, 0x53, 0x08, 0x70, 0x87, 0x64, 0x43, - 0x68, 0x86, 0x07, 0x04, 0x34, 0x10, 0x68, 0x30, 0x21, 0x01, - 0x86, 0x66, 0x06, 0x50, 0x41, 0x72, 0x18, 0x00, 0x05, 0x40, - 0x36, 0x35, 0x60, 0x50, 0x82, 0x82, 0x24, 0x73, 0x31, 0x35, - 0x81, 0x35, 0x02, 0x50, 0x22, 0x76, 0x44, 0x52, 0x27, 0x43, - 0x82, 0x66, 0x51, 0x38, 0x86, 0x72, 0x18, 0x54, 0x20, 0x65, - 0x45, 0x26, 0x03, 0x42, 0x24, 0x25, 0x27, 0x36, 0x02, 0x04, - 0x38, 0x77, 0x18, 0x44, 0x17, 0x78, 0x46, 0x34, 0x68, 0x00, - 0x72, 0x57, 0x72, 0x67, 0x53, 0x82, 0x51, 0x06, 0x34, 0x56, - 0x71, 0x26, 0x73, 0x55, 0x58, 0x11, 0x44, 0x15, 0x26, 0x81, - 0x14, 0x88, 0x25, 0x45, 0x52, 0x84, 0x13, 0x60, 0x12, 0x26, - 0x12, 0x36, 0x11, 0x61, 0x30, 0x25, 0x32, 0x83, 0x00, 0x71, - 0x73, 0x04, 0x48, 0x40, 0x70, 0x21, 0x36, 0x54, 0x45, 0x33, - 0x43, 0x00, 0x76, 0x62, 0x63, 0x71, 0x15, 0x35, 0x27, 0x50, - 0x06, 0x16, 0x30, 0x45, 0x08, 0x12, 0x51, 0x68, 0x38, 0x21, - 0x71, 0x61, 0x61, 0x18, 0x35, 0x15, 0x25, 0x47, 0x14, 0x62, - 0x51, 0x14, 0x76, 0x12, 0x62, 0x60, 0x63, 0x16, 0x20, 0x68, - 0x62, 0x31, 0x56, 0x64, 0x05, 0x84, 0x56, 0x26, 0x40, 0x42, - 0x88, 0x05, 0x60, 0x84, 0x82, 0x10, 0x23, 0x87, 0x63, 0x33, - 0x60, 0x40, 0x58, 0x12, 0x83, 0x26, 0x03, 0x13, 0x85, 0x23, - 0x02, 0x73, 0x05, 0x27, 0x40, 0x02, 0x75, 0x85, 0x46, 0x51, - 0x83, 0x71, 0x37, 0x16, 0x05, 0x86, 0x35, 0x01, 0x45, 0x00, - 0x53, 0x68, 0x27, 0x11, 0x06, 0x08, 0x82, 0x60, 0x58, 0x28, - 0x50, 0x07, 0x32, 0x56, 0x26, 0x46, 0x78, 0x63, 0x71, 0x16, - 0x48, 0x46, 0x86, 0x41, 0x37, 0x75, 0x06, 0x01, 0x11, 0x46, - 0x45, 0x21, 0x03, 0x82, 0x42, 0x75, 0x83, 0x30, 0x66, 0x00, - 0x74, 0x74, 0x46, 0x05, 0x33, 0x82, 0x33, 0x07, 0x34, 0x53, - 0x07, 0x78, 0x53, 0x07, 0x41, 0x37, 0x78, 0x54, 0x06, 0x11, - 0x42, 0x47, 0x05, 0x02, 0x62, 0x34, 0x27, 0x17, 0x78, 0x70, - 0x70, 0x46, 0x00, 0x38, 0x75, 0x48, 0x74, 0x46, 0x83, 0x35, - 0x08, 0x46, 0x14, 0x12, 0x20, 0x68, 0x00, 0x73, 0x57, 0x81, - 0x84, 0x62, 0x43, 0x11, 0x28, 0x87, 0x13, 0x30, 0x06, 0x70, - 0x15, 0x46, 0x51, 0x14, 0x74, 0x13, 0x53, 0x26, 0x84, 0x78, - 0x86, 0x15, 0x84, 0x18, 0x70, 0x56, 0x41, 0x33, 0x61, 0x56, - 0x28, 0x11, 0x30, 0x73, 0x82, 0x00, 0x57, 0x68, 0x61, 0x44, - 0x04, 0x64, 0x78, 0x68, 0x14, 0x02, 0x83, 0x88, 0x86, 0x88, - 0x40, 0x16, 0x81, 0x20, 0x68, 0x72, 0x67, 0x05, 0x76, 0x06, - 0x54, 0x74, 0x35, 0x71, 0x02, 0x67, 0x45, 0x24, 0x73, 0x64, - 0x87, 0x31, 0x60, 0x37, 0x04, 0x11, 0x85, 0x63, 0x40, 0x71, - 0x38, 0x46, 0x65, 0x16, 0x10, 0x85, 0x06, 0x37, 0x25, 0x53, - 0x05, 0x58, 0x45, 0x87, 0x17, 0x47, 0x78, 0x10, 0x22, 0x26, - 0x24, 0x86, 0x44, 0x63, 0x45, 0x00, 0x14, 0x77, 0x60, 0x04, - 0x54, 0x45, 0x40, 0x32, 0x45, 0x03, 0x60, 0x87, 0x05, 0x02, - 0x18, 0x22, 0x20, 0x61, 0x07, 0x36, 0x72, 0x52, 0x53, 0x65, - 0x27, 0x26, 0x37, 0x54, 0x31, 0x34, 0x22, 0x54, 0x37, 0x25, - 0x83, 0x14, 0x74, 0x75, 0x17, 0x61, 0x48, 0x74, 0x24, 0x43, - 0x80, 0x81, 0x15, 0x06, 0x88, 0x23, 0x84, 0x55, 0x20, 0x11, - 0x87, 0x83, 0x64, 0x36, 0x48, 0x88, 0x32, 0x20, 0x28, 0x54, - 0x88, 0x85, 0x35, 0x61, 0x00, 0x21, 0x01, 0x31, 0x44, 0x13, - 0x71, 0x48, 0x23, 0x47, 0x31, 0x62, 0x40, 0x18, 0x21, 0x78, - 0x34, 0x12, 0x88, 0x10, 0x76, 0x46, 0x72, 0x37, 0x70, 0x84, - 0x15, 0x41, 0x84, 0x22, 0x20, 0x22, 0x27, 0x44, 0x81, 0x03, - 0x46, 0x48, 0x26, 0x16, 0x21, 0x15, 0x31, 0x85, 0x73, 0x74, - 0x73, 0x06, 0x55, 0x21, 0x12, 0x53, 0x13, 0x34, 0x01, 0x64, - 0x40, 0x83, 0x08, 0x57, 0x24, 0x04, 0x18, 0x33, 0x70, 0x18, - 0x17, 0x06, 0x14, 0x28, 0x12, 0x58, 0x00, 0x25, 0x57, 0x20, - 0x00, 0x76, 0x73, 0x45, 0x68, 0x16, 0x60, 0x22, 0x17, 0x22, - 0x37, 0x75, 0x53, 0x48, 0x40, 0x21, 0x64, 0x27, 0x52, 0x48, - 0x53, 0x61, 0x64, 0x87, 0x57, 0x61, 0x13, 0x75, 0x80, 0x08, - 0x63, 0x33, 0x60, 0x26, 0x10, 0x25, 0x61, 0x78, 0x47, 0x78, - 0x07, 0x16, 0x00, 0x52, 0x31, 0x30, 0x63, 0x66, 0x46, 0x80, - 0x07, 0x10, 0x45, 0x11, 0x13, 0x80, 0x25, 0x61, 0x25, 0x53, - 0x80, 0x71, 0x38, 0x31, 0x47, 0x55, 0x02, 0x25, 0x50, 0x87, - 0x57, 0x35, 0x74, 0x11, 0x46, 0x44, 0x53, 0x24, 0x60, 0x33, - 0x15, 0x12, 0x77, 0x20, 0x36, 0x24, 0x70, 0x04, 0x87, 0x05, - 0x71, 0x07, 0x77, 0x36, 0x47, 0x01, 0x73, 0x61, 0x32, 0x62, - 0x28, 0x81, 0x67, 0x17, 0x38, 0x45, 0x21, 0x03, 0x24, 0x72, - 0x82, 0x64, 0x84, 0x43, 0x07, 0x11, 0x20, 0x72, 0x71, 0x04, - 0x58, 0x36, 0x22, 0x21, 0x33, 0x67, 0x55, 0x48, 0x03, 0x68, - 0x32, 0x70, 0x04, 0x63, 0x11, 0x34, 0x27, 0x82, 0x42, 0x56, - 0x28, 0x74, 0x77, 0x72, 0x18, 0x27, 0x35, 0x87, 0x03, 0x18, - 0x40, 0x32, 0x78, 0x07, 0x14, 0x43, 0x73, 0x73, 0x84, 0x63, - 0x78, 0x68, 0x03, 0x22, 0x55, 0x30, 0x18, 0x88, 0x15, 0x86, - 0x18, 0x51, 0x12, 0x42, 0x13, 0x60, 0x22, 0x44, 0x61, 0x44, - 0x35, 0x73, 0x08, 0x85, 0x53, 0x02, 0x73, 0x83, 0x25, 0x85, - 0x64, 0x78, 0x16, 0x12, 0x13, 0x63, 0x48, 0x35, 0x02, 0x71, - 0x72, 0x58, 0x12, 0x10, 0x65, 0x42, 0x22, 0x54, 0x80, 0x60, - 0x57, 0x84, 0x72, 0x76, 0x67, 0x35, 0x25, 0x14, 0x73, 0x70, - 0x48, 0x03, 0x78, 0x07, 0x74, 0x48, 0x67, 0x48, 0x01, 0x62, - 0x78, 0x05, 0x37, 0x66, 0x42, 0x45, 0x33, 0x65, 0x08, 0x70, - 0x42, 0x15, 0x72, 0x53, 0x13, 0x20, 0x14, 0x38, 0x05, 0x53, - 0x00, 0x45, 0x25, 0x20, 0x80, 0x75, 0x01, 0x65, 0x80, 0x70, - 0x61, 0x50, 0x15, 0x10, 0x77, 0x23, 0x38, 0x31, 0x21, 0x51, - 0x78, 0x11, 0x88, 0x71, 0x18, 0x06, 0x45, 0x62, 0x47, 0x35, - 0x43, 0x00, 0x52, 0x34, 0x41, 0x75, 0x18, 0x13, 0x51, 0x35, - 0x72, 0x11, 0x78, 0x17, 0x30, 0x44, 0x83, 0x25, 0x64, 0x42, - 0x65, 0x23, 0x50, 0x32, 0x85, 0x30, 0x67, 0x10, 0x70, 0x01, - 0x16, 0x62, 0x36, 0x46, 0x18, 0x53, 0x53, 0x80, 0x13, 0x65, - 0x66, 0x53, 0x61, 0x55, 0x07, 0x71, 0x34, 0x56, 0x31, 0x67, - 0x64, 0x42, 0x64, 0x41, 0x22, 0x56, 0x44, 0x67, 0x25, 0x52, - 0x08, 0x17, 0x38, 0x45, 0x76, 0x83, 0x37, 0x15, 0x76, 0x31, - 0x83, 0x47, 0x30, 0x21, 0x55, 0x73, 0x37, 0x82, 0x11, 0x56, - 0x67, 0x27, 0x23, 0x44, 0x72, 0x82, 0x10, 0x80, 0x43, 0x11, - 0x16, 0x02, 0x21, 0x40, 0x42, 0x10, 0x12, 0x74, 0x58, 0x40, - 0x74, 0x00, 0x66, 0x02, 0x85, 0x76, 0x21, 0x17, 0x83, 0x78, - 0x80, 0x40, 0x46, 0x87, 0x66, 0x24, 0x35, 0x80, 0x31, 0x77, - 0x87, 0x10, 0x47, 0x02, 0x20, 0x65, 0x43, 0x73, 0x41, 0x61, - 0x72, 0x18, 0x21, 0x52, 0x32, 0x82, 0x08, 0x82, 0x00, 0x57, - 0x52, 0x41, 0x45, 0x10, 0x51, 0x41, 0x28, 0x37, 0x72, 0x45, - 0x77, 0x10, 0x56, 0x06, 0x54, 0x30, 0x03, 0x74, 0x13, 0x56, - 0x77, 0x54, 0x04, 0x86, 0x13, 0x77, 0x81, 0x77, 0x57, 0x15, - 0x76, 0x13, 0x51, 0x75, 0x4C, 0xD3, 0x8C, 0xF8, 0x0F, 0x87, - 0x37, 0xBC, 0x26, 0x1B, 0x7A, 0x1C, 0xDC, 0x05, 0xFD, 0x9B, - 0x97, 0x8C, 0x4D, 0xE5, 0x06, 0xFF, 0x57, 0x65, 0xDC, 0xFC, - 0xBF, 0x55, 0x20, 0x8F, 0xC9, 0xAB, 0x63, 0x4C, 0x37, 0x02, - 0xB5, 0x51, 0x79, 0x6B, 0xC2, 0x02, 0x74, 0xE5, 0x74, 0x72, - 0xC4, 0x3C, 0x8F, 0xD2, 0x79, 0xCB, 0x65, 0x3C, 0xBD, 0xA6, - 0xC5, 0x19, 0xDF, 0xFC, 0x24, 0xB9, 0x91, 0x81, 0x41, 0x4D, - 0xDF, 0x2E, 0x6A, 0xBD, 0x5A, 0xC4, 0x04, 0x03, 0x7F, 0x71, - 0x7D, 0x51, 0xDD, 0x2F, 0xAE, 0x4C, 0x9A, 0xF8, 0x98, 0x11, - 0xA0, 0xCE, 0xF7, 0xDE, 0xF5, 0xC6, 0x91, 0xD3, 0xDC, 0xE7, - 0xAA, 0xD0, 0x7D, 0xDF, 0x5F, 0xF2, 0x5B, 0x55, 0x9C, 0xD6, - 0x8D, 0xC9, 0x1E, 0xC7, 0x80, 0xD9, 0xC5, 0xFA, 0x15, 0xEB, - 0xCE, 0x6B, 0x99, 0x71, 0xBD, 0xED, 0x0C, 0x24, 0x1B, 0x97, - 0x52, 0xFA, 0x54, 0xF5, 0x72, 0x48, 0x97, 0x05, 0x8B, 0x04, - 0xE5, 0xAA, 0xE0, 0xDC, 0x98, 0x13, 0xD2, 0x27, 0xB0, 0x0B, - 0x49, 0x8B, 0xA0, 0xD1, 0x2C, 0x18, 0xA5, 0xFA, 0x2A, 0x80, - 0x4B, 0xF7, 0x4B, 0x8C, 0xE0, 0xA4, 0xCD, 0xD0, 0x75, 0xE9, - 0x4A, 0x75, 0x15, 0x1B, 0xB8, 0x51, 0xD8, 0x8D, 0x1E, 0xA4, - 0xD1, 0xCD, 0x0E, 0xEE, 0xD4, 0xAA, 0x55, 0x0C, 0x6A, 0xB3, - 0xC9, 0x51, 0x66, 0x72, 0x76, 0xF4, 0xF9, 0xA4, 0xC2, 0x56, - 0x9D, 0xF9, 0x7C, 0x4C, 0x91, 0x27, 0xAC, 0xB3, 0x3E, 0x6B, - 0x2D, 0x5B, 0x84, 0xF3, 0x68, 0xD7, 0x28, 0xAE, 0xB6, 0x75, - 0x41, 0x46, 0xF2, 0x50, 0xF4, 0x20, 0x04, 0x4E, 0xB3, 0x0D, - 0xC3, 0xAE, 0xA9, 0x87, 0x9E, 0xB2, 0x05, 0xAE, 0x33, 0x76, - 0x76, 0x1A, 0x7A, 0xAB, 0xFD, 0x55, 0x77, 0x64, 0xF0, 0x0A, - 0x7C, 0x4F, 0x75, 0xE7, 0xBC, 0x09, 0x2D, 0x99, 0x4B, 0x90, - 0x13, 0x42, 0x62, 0xBD, 0x70, 0x14, 0x39, 0x23, 0x3A, 0x8A, - 0x32, 0x30, 0xEA, 0x66, 0x24, 0x85, 0xAF, 0x0B, 0xD7, 0x72, - 0xC4, 0xFC, 0x89, 0xD9, 0xB6, 0x9A, 0x1D, 0xA4, 0x10, 0x50, - 0x69, 0x98, 0x8E, 0x00, 0xA1, 0xCF, 0x94, 0x6C, 0x1B, 0x79, - 0x3A, 0xB7, 0xD8, 0x86, 0x1C, 0xD1, 0x95, 0x72, 0x0A, 0x3A, - 0xDA, 0xEF, 0x26, 0x15, 0xA5, 0xE4, 0x67, 0xD6, 0x04, 0xC5, - 0x0A, 0xBA, 0x50, 0x21, 0x9C, 0xB7, 0x1A, 0xF1, 0x1F, 0x1D, - 0x90, 0x5A, 0x6E, 0x40, 0xF8, 0xC1, 0xAB, 0xBD, 0x88, 0xA7, - 0xB8, 0x25, 0xBD, 0xCB, 0x93, 0xFA, 0x79, 0xAE, 0xAF, 0x1A, - 0xBD, 0x7B, 0xC4, 0x9F, 0x89, 0x7C, 0xFF, 0xFB, 0x0E, 0x27, - 0x32, 0x20, 0x6D, 0x47, 0x6B, 0x0E, 0x0D, 0xA1, 0x6A, 0x55, - 0x7F, 0xFD, 0x73, 0x9B, 0xC5, 0x3F, 0xF8, 0x08, 0xAA, 0xFE, - 0x0F, 0x7E, 0xAD, 0xB8, 0x13, 0x50, 0x79, 0x8D, 0x58, 0xAF, - 0xB2, 0xC6, 0x66, 0x24, 0xA8, 0x19, 0xD6, 0x90, 0x81, 0x54, - 0x92, 0x7B, 0xAF, 0xA8, 0xB8, 0x3D, 0x27, 0xD0, 0xC0, 0x08, - 0xB6, 0x45, 0x3D, 0x24, 0x46, 0xA0, 0x04, 0x8A, 0x26, 0x95, - 0xCF, 0x3F, 0x3C, 0x31, 0x43, 0x5D, 0xCA, 0x7A, 0xED, 0xF7, - 0xD3, 0xB5, 0xA0, 0xEE, 0xDC, 0x97, 0x76, 0xB3, 0x2F, 0x89, - 0x18, 0x62, 0xAC, 0x4B, 0x8B, 0xFC, 0x06, 0x1E, 0x15, 0xE5, - 0x25, 0x72, 0x46, 0xB9, 0x02, 0xD9, 0x0C, 0x38, 0xCF, 0x82, - 0x13, 0x19, 0x6E, 0x18, 0x85, 0xC6, 0x76, 0xF9, 0x10, 0xF9, - 0xCD, 0x72, 0x05, 0xED, 0x5E, 0xAE, 0xBB, 0xD2, 0xAB, 0x64, - 0x13, 0x3E, 0x9F, 0x20, 0xCF, 0x8C, 0xC0, 0x37, 0x71, 0x38, - 0x22, 0x49, 0x38, 0x9C, 0x23, 0xCB, 0x0B, 0xC3, 0xE8, 0xE5, - 0xEB, 0x31, 0x61, 0x07, 0xFE, 0x2A, 0xAC, 0xDE, 0x90, 0x35, - 0x24, 0xEB, 0x6B, 0xB6, 0x34, 0x51, 0x9C, 0xE2, 0x7D, 0xD0, - 0x8B, 0x38, 0xDB, 0x81, 0x7B, 0x24, 0x7B, 0x69, 0x84, 0x1D, - 0x17, 0x9F, 0x64, 0x63, 0x6F, 0x3F, 0x43, 0xFC, 0xFE, 0x07, - 0x72, 0x66, 0x84, 0xE3, 0xCD, 0x4F, 0x25, 0x70, 0x81, 0x64, - 0x66, 0x2C, 0xA8, 0x35, 0x11, 0x1B, 0xF3, 0x03, 0x1B, 0x5B, - 0xDC, 0xFB, 0x7D, 0xAD, 0x14, 0x11, 0xC8, 0xB1, 0x0C, 0x7E, - 0x36, 0x79, 0x34, 0x79, 0x1A, 0x88, 0x8A, 0x8F, 0xF6, 0x66, - 0xB4, 0x95, 0xD4, 0xA1, 0x02, 0xF9, 0x1D, 0x26, 0x53, 0x7A, - 0x34, 0x00, 0x36, 0x0E, 0xE7, 0xFB, 0x7A, 0x60, 0xF9, 0xC3, - 0xCF, 0x30, 0xCB, 0xF0, 0x27, 0xB5, 0xD6, 0xCF, 0x15, 0x33, - 0x53, 0x88, 0x7C, 0x50, 0x07, 0xF4, 0x27, 0xE0, 0x40, 0x47, - 0xFE, 0x86, 0x0E, 0xFF, 0x07, 0x5F, 0x55, 0xB8, 0x3B, 0xAA, - 0xFB, 0xB0, 0x6B, 0x98, 0x47, 0x59, 0xB8, 0x33, 0xAA, 0x67, - 0x6B, 0x36, 0xEB, 0x76, 0x43, 0xAF, 0x31, 0x52, 0x62, 0x3D, - 0x7F, 0x64, 0x6A, 0xFC, 0x36, 0x92, 0x96, 0xF8, 0xD9, 0xE7, - 0x13, 0x77, 0x1D, 0xD0, 0xFB, 0x0D, 0x70, 0x29, 0x61, 0x52, - 0x82, 0xF4, 0xE4, 0xA7, 0x08, 0x47, 0x4C, 0x67, 0xEE, 0x36, - 0xD1, 0x1C, 0x18, 0x8B, 0xF1, 0x2D, 0xE2, 0x47, 0x16, 0x4D, - 0x1F, 0x05, 0xC6, 0x4E, 0xFB, 0x35, 0x51, 0x3A, 0x9E, 0xF9, - 0xE0, 0x1E, 0xC1, 0x64, 0x21, 0x0B, 0x8A, 0xF0, 0x1D, 0x32, - 0x78, 0x18, 0xF2, 0xB3, 0xB5, 0xBD, 0x66, 0x6B, 0xAD, 0x92, - 0x4F, 0x22, 0xDC, 0xB9, 0xCC, 0xF4, 0x98, 0x22, 0x99, 0xF6, - 0x3D, 0xC6, 0x8F, 0x28, 0x77, 0x60, 0x34, 0xD0, 0x73, 0xF5, - 0x4D, 0x9F, 0x6C, 0x5D, 0x94, 0xC2, 0x3D, 0x19, 0xCD, 0xC2, - 0x18, 0x41, 0x9B, 0x5F, 0x32, 0x2D, 0x5E, 0x3D, 0x92, 0xBE, - 0x26, 0x39, 0x85, 0x50, 0xE6, 0xE2, 0x49, 0x17, 0x19, 0xD3, - 0x57, 0xAF, 0x45, 0x85, 0x74, 0xF7, 0x16, 0x35, 0x0A, 0x94, - 0x54, 0x64, 0x45, 0xD5, 0x31, 0x51, 0x49, 0x8F, 0xA4, 0x4C, - 0x33, 0xBB, 0x62, 0x59, 0x6B, 0x08, 0xBD, 0x1C, 0xDD, 0x38, - 0x93, 0x22, 0x0B, 0xCF, 0x9B, 0x23, 0x87, 0x30, 0xA2, 0xA0, - 0x6D, 0x97, 0x2D, 0xD7, 0x2B, 0x16, 0x88, 0x72, 0x01, 0x9A, - 0x51, 0xBA, 0x56, 0xCE, 0xDC, 0xDD, 0xF9, 0x87, 0x41, 0xC8, - 0x44, 0xF1, 0xA2, 0x20, 0x9A, 0x11, 0x44, 0x13, 0xDF, 0x49, - 0x04, 0x85, 0x4C, 0x01, 0x46, 0x3E, 0xD6, 0xB8, 0xE2, 0xC2, - 0x2E, 0xED, 0xA4, 0x07, 0x29, 0x89, 0xA2, 0x46, 0x23, 0x98, - 0xA5, 0xEF, 0x59, 0x1A, 0xE7, 0x67, 0x64, 0x59, 0xF7, 0x2C, - 0x5B, 0x30, 0x29, 0x57, 0xE3, 0xDE, 0x5C, 0x84, 0x1B, 0x8F, - 0x3E, 0xB3, 0x5B, 0xF5, 0x0C, 0x6E, 0xB1, 0x4E, 0x2F, 0xB6, - 0xB6, 0x5B, 0x29, 0xCD, 0xBB, 0xB8, 0xC9, 0xF0, 0x39, 0xF9, - 0xB9, 0x11, 0x47, 0xEF, 0xF8, 0x90, 0xE0, 0x0F, 0x91, 0x70, - 0x97, 0xB4, 0xFC, 0xFD, 0xB5, 0x69, 0x8C, 0x61, 0x9A, 0x26, - 0xD2, 0xC9, 0x47, 0x67, 0xB7, 0xDB, 0x73, 0x11, 0xA3, 0xC1, - 0x3B, 0x4E, 0x5F, 0x60, 0xDA, 0x73, 0x39, 0x9B, 0xD4, 0x3D, - 0x24, 0xA6, 0x8A, 0xB5, 0x56, 0x5D, 0xBD, 0x27, 0xDE, 0x6C, - 0x67, 0xA1, 0x4A, 0x77, 0xB7, 0x44, 0x1D, 0x28, 0x44, 0xA0, - 0xA3, 0xF2, 0xEB, 0x3A, 0x9F, 0xE5, 0x5C, 0xF5, 0xE3, 0xFE, - 0xD0, 0xC3, 0xCA, 0x2A, 0x1A, 0x72, 0x86, 0xB3, 0x4E, 0x9D, - 0x25, 0x0B, 0x4C, 0xFF, 0x45, 0xB7, 0xDE, 0xE8, 0x8C, 0x0A, - 0x06, 0xED, 0x30, 0x26, 0x8F, 0xA1, 0xBF, 0x74, 0x22, 0x3D, - 0x50, 0x39, 0x17, 0xA9, 0x6B, 0x7C, 0xAC, 0xA0, 0x6A, 0xEA, - 0x14, 0x95, 0x5F, 0xAD, 0x3C, 0xB1, 0x4E, 0xE1, 0x30, 0x2F, - 0x4A, 0x77, 0x72, 0xC1, 0x1F, 0x4C, 0x91, 0x6B, 0xCF, 0x81, - 0x46, 0xAF, 0x2D, 0xEC, 0x59, 0x9E, 0x99, 0xD9, 0x60, 0x23, - 0x95, 0x08, 0x0D, 0xBB, 0xFD, 0xEC, 0x2A, 0xF7, 0x7B, 0x73, - 0x53, 0xF3, 0x88, 0xB7, 0xAF, 0x51, 0x69, 0xD5, 0x08, 0xFC, - 0xCC, 0x03, 0xD3, 0x61, 0x5C, 0xDD, 0x39, 0x56, 0x6B, 0xE4, - 0xEE, 0x1F, 0x0A, 0xD6, 0x1A, 0x84, 0x65, 0x45, 0x0C, 0x0A, - 0x34, 0xDE, 0x96, 0x24, 0xBB, 0x74, 0xF4, 0xB7, 0xE5, 0x2F, - 0xB5, 0x1F, 0x85, 0x9D, 0xD7, 0xEA, 0xB3, 0x33, 0xBE, 0xCF, - 0x19, 0x45, 0xCE, 0xF9, 0x13, 0xF5, 0xFD, 0x65, 0x5D, 0xBB, - 0xDB, 0x64, 0x94, 0xAC, 0xB8, 0x39, 0xAF, 0x9B, 0x56, 0xE4, - 0x5C, 0x95, 0x85, 0xFD, 0xB3, 0xF8, 0x3C, 0x98, 0xD3, 0x58, - 0xCE, 0xAB, 0x09, 0x0E, 0xA7, 0x42, 0x9B, 0x16, 0xA7, 0x63, - 0xEB, 0xB8, 0x7C, 0x01, 0xA2, 0xD4, 0x3C, 0x2B, 0xA7, 0xA3, - 0x52, 0x8C, 0x08, 0xA5, 0xA9, 0xAF, 0x63, 0x07, 0xDA, 0x45, - 0x86, 0x91, 0x64, 0xE6, 0x41, 0x75, 0x78, 0x46, 0x6F, 0xB9, - 0xB4, 0xEA, 0x6A, 0xDD, 0xC7, 0x1A, 0x1F, 0xC0, 0x8A, 0x00, - 0x81, 0x70, 0x74, 0x37, 0xC8, 0x84, 0x3F, 0xA8, 0xC9, 0xC1, - 0xC1, 0x60, 0x2B, 0x25, 0x9B, 0x66, 0x5F, 0x73, 0x15, 0x51, - 0xE2, 0xE4, 0x49, 0x5B, 0xEE, 0x20, 0xC8, 0x18, 0xE7, 0x65, - 0xED, 0x29, 0xEA, 0x96, 0x85, 0xB5, 0x63, 0xFB, 0xA6, 0x23, - 0x22, 0xB7, 0x4F, 0x6E, 0xE3, 0xF2, 0x9C, 0x01, 0x23, 0x7A, - 0xB9, 0x16, 0x2A, 0x93, 0xAF, 0x4F, 0xEA, 0x05, 0x15, 0x84, - 0x46, 0x32, 0x2F, 0x99, 0xB8, 0x78, 0x20, 0x78, 0x93, 0xC9, - 0x42, 0x6D, 0xBC, 0x70, 0xCE, 0x88, 0x6F, 0x12, 0x92, 0x3F, - 0xDE, 0xFB, 0xDE, 0x8E, 0xD3, 0x69, 0x09, 0x54, 0x7D, 0x0A, - 0xE1, 0x93, 0x3D, 0x10, 0x04, 0xDE, 0x66, 0x9D, 0x2D, 0xAD, - 0xA4, 0x53, 0x4C, 0xF6, 0xFC, 0x08, 0xE4, 0x58, 0x05, 0x09, - 0x78, 0x09, 0xE6, 0xF3, 0xEE, 0x83, 0xC2, 0xD0, 0xA9, 0x04, - 0xE6, 0xAC, 0x30, 0xD7, 0x34, 0x52, 0xEB, 0xCD, 0x1A, 0x7E, - 0xB9, 0xCF, 0x18, 0x68, 0x16, 0xB9, 0x9A, 0x18, 0xDA, 0xC8, - 0xE3, 0x1C, 0xF0, 0x9A, 0x2E, 0x64, 0x28, 0xBE, 0xA4, 0x9F, - 0xCB, 0xC0, 0x53, 0xE6, 0x2A, 0x88, 0xB5, 0xE7, 0xF3, 0x6F, - 0x46, 0x1C, 0xBA, 0xAD, 0x76, 0x17, 0x85, 0xAE, 0x95, 0x13, - 0x7B, 0xF9, 0xB8, 0xD3, 0x08, 0x6A, 0x38, 0x63, 0x67, 0xD8, - 0x8B, 0x51, 0x8F, 0x49, 0x44, 0xB4, 0x10, 0xB8, 0x74, 0x38, - 0xDD, 0x17, 0xEA, 0x52, 0x67, 0xB2, 0xCC, 0xC9, 0x77, 0xDD, - 0x44, 0x2E, 0xDF, 0x03, 0xC7, 0xF4, 0x87, 0xF4, 0xBC, 0x6F, - 0x94, 0x9F, 0x58, 0xDB, 0xE2, 0x09, 0xA1, 0x4C, 0xCA, 0x89, - 0x9D, 0x04, 0x5A, 0xAB, 0xDF, 0x8B, 0x82, 0x3F, 0x0E, 0xF2, - 0xE7, 0xBD, 0x9A, 0x16, 0x3A, 0xAF, 0x72, 0x18, 0xB9, 0x47, - 0xB3, 0xBC, 0xFE, 0x84, 0x43, 0x92, 0x98, 0xF4, 0x3A, 0x49, - 0x3A, 0x26, 0xB7, 0xF3, 0x37, 0x54, 0x06, 0xD8, 0x92, 0x09, - 0xE6, 0xFE, 0x9A, 0xDB, 0x68, 0x16, 0x6F, 0x5D, 0x5D, 0x8E, - 0xBB, 0xFC, 0xAC, 0x5A, 0x72, 0xFE, 0x0B, 0xEB, 0xDB, 0x90, - 0xA4, 0x6C, 0x37, 0x1A, 0x8B, 0x5A, 0xD8, 0xE9, 0xF6, 0x15, - 0xFC, 0x54, 0x1B, 0x95, 0xE3, 0xAE, 0x08, 0x46, 0xB5, 0xFB, - 0xC5, 0x66, 0xC5, 0x79, 0x17, 0x9D, 0x5C, 0x45, 0xE5, 0x4E, - 0xFF, 0xA2, 0x86, 0xD7, 0x4F, 0xD4, 0x1D, 0x17, 0xA3, 0x77, - 0x00, 0x54, 0x70, 0xDF, 0x12, 0xCA, 0xD6, 0x71, 0x05, 0x54, - 0xFA, 0x47, 0x96, 0x38, 0x2D, 0x4D, 0x70, 0x3E, 0x2E, 0x40, - 0xE7, 0x52, 0x32, 0x66, 0x4D, 0x92, 0x1B, 0x76, 0x66, 0xF1, - 0xD4, 0x38, 0x8B, 0x76, 0x47, 0xE1, 0x66, 0xDE, 0xA2, 0x06, - 0xD7, 0xA7, 0x96, 0x52, 0xED, 0xC9, 0xF3, 0xD6, 0x99, 0xDF, - 0x2F, 0x98, 0xC5, 0xBF, 0x16, 0x95, 0x80, 0x41, 0xE4, 0xEB, - 0x8B, 0x16, 0xEF, 0x6A, 0x76, 0x84, 0xE7, 0x5F, 0x6C, 0xBD, - 0x1D, 0x2A, 0x74, 0x08, 0x5B, 0x4E, 0xCA, 0xE1, 0xF5, 0xD0, - 0x42, 0x2C, 0x03, 0x9B, 0x80, 0xBD, 0x05, 0x5F, 0x87, 0xF0, - 0x84, 0x08, 0x96, 0xBE, 0xAC, 0xBF, 0xF1, 0x8F, 0x51, 0x69, - 0x9E, 0xC2, 0xE9, 0x96, 0x9D, 0x97, 0xCD, 0x56, 0x32, 0x29, - 0xC8, 0x53, 0xC2, 0x1A, 0x5A, 0xD3, 0xDA, 0x31, 0x94, 0x09, - 0x35, 0x08, 0x75, 0x27, 0x66, 0xC5, 0x10, 0x5F, 0xD1, 0x94, - 0x12, 0x03, 0x8A, 0x1B, 0x69, 0x81, 0xEB, 0xBE, 0xBC, 0x6B, - 0xE4, 0xB9, 0x84, 0x65, 0x7D, 0xE3, 0xFE, 0xFB, 0x45, 0x58, - 0x31, 0xF3, 0x66, 0x13, 0x64, 0xB2, 0xBD, 0xBC, 0xF6, 0xA5, - 0x07, 0x07, 0x8A, 0xC8, 0x43, 0xCA, 0x38, 0x94, 0x70, 0xC0, - 0x25, 0xDA, 0xC6, 0xD9, 0x74, 0x5A, 0x60, 0xE3, 0x9D, 0x74, - 0x6C, 0x72, 0xF5, 0xAF, 0xD3, 0xD7, 0xF5, 0xBD, 0x17, 0x02, - 0xE5, 0x17, 0xEC, 0xBD, 0xCB, 0x5D, 0x1A, 0x8F, 0x39, 0x31, - 0x7E, 0x4B, 0x1F, 0x1A, 0x87, 0xE2, 0x69, 0x65, 0x07, 0x42, - 0x6D, 0xD2, 0x2D, 0x04, 0x52, 0x51, 0xA7, 0xF2, 0x23, 0xC6, - 0x01, 0xD1, 0x47, 0x5F, 0x42, 0x44, 0x2A, 0x88, 0x5E, 0xBB, - 0x98, 0x5A, 0x34, 0xBB, 0x0E, 0x05, 0xA7, 0x1D, 0x7E, 0xFB, - 0x3E, 0x85, 0xD8, 0x74, 0x70, 0xE8, 0x71, 0xC2, 0x31, 0x80, - 0x37, 0xF9, 0x15, 0xA4, 0xC1, 0xFC, 0x9B, 0x68, 0x2B, 0x54, - 0x9B, 0x37, 0x9C, 0xE7, 0x62, 0x80, 0x20, 0x1E, 0x27, 0x78, - 0xBF, 0x11, 0xC4, 0x86, 0xAC, 0x7B, 0x34, 0x57, 0x76, 0x86, - 0x77, 0x15, 0x51, 0x7C, 0xDC, 0x32, 0xDF, 0x48, 0xB9, 0xC6, - 0x63, 0xC6, 0x9A, 0xDE, 0x5E, 0x9D, 0xAB, 0x4A, 0x92, 0xEE, - 0x0C, 0x10, 0x7E, 0xB5, 0x33, 0x17, 0xF6, 0x0C, 0x8D, 0x26, - 0x89, 0xCD, 0x2B, 0xB8, 0x49, 0x4A, 0x4D, 0x5D, 0x66, 0x38, - 0x86, 0x42, 0x37, 0xC5, 0x1B, 0xE7, 0x78, 0x90, 0x21, 0xAE, - 0x8F, 0xE7, 0x0C, 0x01, 0xB9, 0x31, 0x6A, 0x50, 0x1A, 0x2B, - 0xDA, 0xC2, 0x99, 0xCB, 0xEB, 0xF9, 0xAE, 0x91, 0x8B, 0xB7, - 0x08, 0x01, 0x1E, 0xCC, 0x9E, 0x20, 0x05, 0xEC, 0x45, 0x21, - 0xBE, 0xDE, 0xFE, 0x06, 0x7D, 0x92, 0x9C, 0xE7, 0x47, 0xD9, - 0x85, 0x63, 0xC3, 0xBB, 0x38, 0x15, 0x2D, 0x94, 0xCA, 0xAF, - 0xCF, 0xCA, 0x1D, 0x53, 0x1A, 0xBD, 0x23, 0xF1, 0x87, 0x99, - 0x24, 0xF3, 0x16, 0xE9, 0x7F, 0xBE, 0x00, 0x8A, 0x61, 0xA7, - 0x65, 0xF7, 0xA9, 0x53, 0x2A, 0x29, 0x20, 0x3E, 0x0B, 0xCF, - 0x12, 0x69, 0x22, 0x84, 0x27, 0x5D, 0x1C, 0xC8, 0x45, 0xA1, - 0xA5, 0x5A, 0xB0, 0xDB, 0x95, 0x5D, 0xF7, 0xCE, 0xAC, 0x98, - 0x44, 0x3B, 0xE1, 0x27, 0x9A, 0x93, 0x5D, 0x2B, 0x8A, 0x20, - 0xB1, 0x82, 0x2C, 0xDD, 0xB8, 0xCC, 0xFA, 0x77, 0x0F, 0xA7, - 0x80, 0x00, 0x87, 0x54, 0x1C, 0xCC, 0x0B, 0x1E, 0xF6, 0x52, - 0x89, 0x03, 0x65, 0x83, 0xF1, 0x97, 0x4E, 0x81, 0x99, 0xE1, - 0xDD, 0x73, 0x30, 0x31, 0xEC, 0xA7, 0xD5, 0x76, 0x28, 0xC3, - 0xCE, 0x29, 0x30, 0x7B, 0xB1, 0x27, 0x3F, 0xC4, 0x6D, 0x54, - 0xAF, 0xE2, 0x84, 0xEA, 0xF5, 0x91, 0xBD, 0xB9, 0x6C, 0x4E, - 0x98, 0x0F, 0xFB, 0xDE, 0x7C, 0x32, 0xF8, 0xED, 0xEF, 0xD0, - 0xE9, 0xA3, 0x57, 0xC0, 0x91, 0x06, 0x4C, 0x43, 0x3F, 0x32, - 0x21, 0xB5, 0xF2, 0x11, 0x5A, 0xDF, 0xFC, 0x7E, 0x91, 0x10, - 0xC0, 0x4D, 0xD4, 0x4E, 0xA8, 0x38, 0xD6, 0xE0, 0xB6, 0x27, - 0x38, 0x63, 0xF2, 0xD3, 0xFD, 0x68, 0x4C, 0xDD, 0x76, 0xA9, - 0x89, 0xCE, 0xBE, 0x7C, 0xAD, 0x45, 0x4C, 0x8C, 0x24, 0xCC, - 0x32, 0x66, 0x3A, 0x1A, 0x45, 0xDA, 0x47, 0x5C, 0x4C, 0xC6, - 0x8A, 0x9A, 0xC3, 0x99, 0xFB, 0x4C, 0x94, 0xE2, 0x20, 0xD7, - 0xE4, 0x37, 0x22, 0x99, 0x32, 0x6F, 0xFB, 0x1C, 0xE5, 0x9B, - 0xB5, 0xFC, 0xBD, 0xD2, 0xA1, 0xDD, 0x66, 0xD5, 0x47, 0x2F, - 0x6A, 0xAA, 0x50, 0xF5, 0xE8, 0x1A, 0xDC, 0x74, 0x50, 0x6A, - 0x92, 0x23, 0x93, 0xED, 0xB0, 0x58, 0x61, 0x7D, 0xB6, 0x5C, - 0x22, 0x7B, 0x54, 0x75, 0xF0, 0x69, 0xD4, 0x27, 0x0B, 0x70, - 0x3F, 0xBB, 0x76, 0x63, 0xB3, 0x1D, 0x7E, 0x33, 0x96, 0xD6, - 0x84, 0x2D, 0x28, 0x4F, 0x97, 0x65, 0xC9, 0x95, 0xCF, 0x30, - 0xBA, 0xEA, 0x08, 0xF5, 0xC6, 0x24, 0x45, 0x20, 0x85, 0x67, - 0x9F, 0x34, 0x37, 0x72, 0x44, 0x17, 0x98, 0x5F, 0xD0, 0xCE, - 0xA8, 0x6E, 0x0E, 0x50, 0x22, 0x14, 0xE1, 0x6B, 0xCB, 0xA5, - 0x12, 0x2A, 0x36, 0xF1, 0x6E, 0x81, 0x5C, 0x5A, 0x77, 0x4F, - 0xD7, 0xF9, 0xCE, 0x7A, 0xC9, 0x30, 0x2C, 0x1E, 0x7E, 0xFC, - 0x24, 0xCB, 0xE4, 0x53, 0xC3, 0x4A, 0x03, 0xED, 0xD5, 0x77, - 0xC6, 0x55, 0xEB, 0xA2, 0xB4, 0x92, 0x35, 0xE3, 0x20, 0xDA, - 0xD2, 0x58, 0xE2, 0xCC, 0xC4, 0x4E, 0xBB, 0xE3, 0x8F, 0x75, - 0xB1, 0xDB, 0x97, 0x15, 0x86, 0x43, 0xE5, 0xD4, 0x4F, 0x44, - 0x3F, 0x20, 0xE3, 0xB9, 0xA5, 0xFB, 0x3F, 0x36, 0xC9, 0x9C, - 0xEF, 0x8C, 0xD1, 0x46, 0x67, 0x16, 0xB6, 0xA6, 0x24, 0x8A, - 0xE9, 0xD7, 0x29, 0x4B, 0x5F, 0x7C, 0x06, 0xEF, 0xD7, 0xBB, - 0x88, 0xCB, 0x2C, 0xFB, 0x85, 0x19, 0x9F, 0x97, 0x74, 0xFE, - 0x76, 0x46, 0x44, 0x1E, 0xAD, 0xF3, 0x62, 0xD2, 0xAA, 0x24, - 0x37, 0xD0, 0x1E, 0xF3, 0xCB, 0x68, 0xE3, 0x17, 0xFF, 0x81, - 0x90, 0xA3, 0xD6, 0x28, 0xE6, 0xCE, 0x6D, 0x99, 0xF4, 0x2D, - 0xC6, 0xAE, 0x40, 0x52, 0x32, 0xE9, 0xC1, 0xC6, 0x79, 0x5C, - 0xF7, 0x69, 0x29, 0x0C, 0x75, 0x9F, 0x48, 0x57, 0x75, 0x1F, - 0x2F, 0x71, 0x9F, 0x24, 0x90, 0x14, 0xAE, 0xDC, 0x75, 0x2E, - 0x5E, 0xDD, 0x85, 0xE5, 0x6C, 0xC4, 0x72, 0x58, 0xF0, 0x35, - 0xDC, 0xFE, 0x03, 0xB7, 0x2F, 0xBD, 0xC3, 0x8A, 0xA3, 0x2C, - 0x62, 0xE0, 0xCD, 0x37, 0xFA, 0x9E, 0x11, 0xC0, 0x1D, 0xEF, - 0xB0, 0x58, 0x58, 0x12, 0xAF, 0x25, 0x6D, 0x75, 0x0D, 0x2F, - 0xBC, 0x89, 0xE9, 0x2E, 0x1E, 0x58, 0x64, 0x35, 0xA8, 0x90, - 0xC2, 0x61, 0x4D, 0xCE, 0x96, 0xC5, 0xF2, 0x37, 0xBD, 0xB8, - 0xDE, 0xB4, 0x0E, 0xEB, 0xDD, 0xED, 0xE6, 0x47, 0x24, 0xE6, - 0x36, 0xC9, 0x22, 0xD3, 0xE7, 0x1A, 0xEF, 0x9E, 0x16, 0x89, - 0xB9, 0x5C, 0xF4, 0x3B, 0x09, 0x7E, 0x9B, 0x87, 0x7F, 0xD6, - 0x84, 0x06, 0xCA, 0x0E, 0xA8, 0x54, 0x79, 0xCF, 0x02, 0xF6, - 0x1B, 0x57, 0x34, 0x9D, 0x97, 0x00, 0x05, 0x8B, 0x75, 0xA3, - 0x5C, 0x7C, 0xBA, 0xA7, 0x51, 0x85, 0xBC, 0xE6, 0xAC, 0xD9, - 0xD4, 0x31, 0xB3, 0x3A, 0xBD, 0x82, 0xC8, 0x60, 0x74, 0x46, - 0xA9, 0x2F, 0xC2, 0x29, 0x08, 0x59, 0x6B, 0x14, 0x19, 0x19, - 0x39, 0x7F, 0x8B, 0xA2, 0x2A, 0xFD, 0xE3, 0x09, 0x72, 0x50, - 0x74, 0x88, 0xEE, 0xC6, 0xED, 0x28, 0x37, 0xCD, 0xA9, 0xBA, - 0x2E, 0xFE, 0x07, 0xDF, 0x5E, 0xF9, 0x18, 0xB4, 0x0E, 0xBF, - 0x9C, 0x1C, 0xCA, 0x84, 0xBA, 0x62, 0xB9, 0xA2, 0x96, 0x76, - 0xB6, 0xB7, 0x77, 0x9C, 0xBE, 0x0C, 0xF8, 0xA5, 0xEF, 0x74, - 0xB1, 0xC2, 0x85, 0xCD, 0xD1, 0x25, 0xD5, 0xFC, 0xFB, 0x2C, - 0xC7, 0xD6, 0x2F, 0x30, 0x3F, 0x10, 0xEA, 0xA2, 0x99, 0xC4, - 0x22, 0x58, 0xB3, 0xC4, 0x46, 0x3C, 0x41, 0xE9, 0xE9, 0xA0, - 0x39, 0x6C, 0x09, 0x89, 0xE3, 0xAE, 0x4E, 0x35, 0xAB, 0x27, - 0x71, 0x43, 0xEB, 0xA7, 0xFA, 0x68, 0xA8, 0x42, 0x49, 0x3C, - 0x53, 0x70, 0x35, 0xCA, 0x14, 0xB7, 0x1D, 0xF8, 0x7E, 0x65, - 0x05, 0x33, 0xE3, 0x5A, 0x86, 0xCD, 0xA5, 0x18, 0x02, 0x24, - 0x23, 0xAD, 0x52, 0x6A, 0x47, 0x13, 0x14, 0x95, 0xD2, 0xF1, - 0xE1, 0x6F, 0x61, 0x70, 0x4F, 0xDC, 0x1A, 0x03, 0x0E, 0xD7, - 0x07, 0xBD, 0x84, 0x43, 0x65, 0x76, 0x9F, 0xFB, 0x1E, 0x89, - 0xEB, 0x92, 0x5E, 0xDE, 0x5B, 0xAA, 0x54, 0xEE, 0x0A, 0xF5, - 0x4A, 0x79, 0x46, 0xDA, 0xC1, 0xEC, 0x2F, 0xBC, 0xDD, 0xE5, - 0x61, 0xFA, 0xED, 0xB6, 0x97, 0x9C, 0x90, 0xD8, 0xF3, 0x2E, - 0x04, 0xCF, 0xB5, 0x89, 0x74, 0xC2, 0xD1, 0x70, 0xE0, 0x0F, - 0x53, 0x14, 0x09, 0x6A, 0x19, 0x5A, 0x65, 0xAC, 0xAA, 0x3C, - 0x25, 0x79, 0x43, 0x27, 0x47, 0x18, 0x19, 0x7A, 0x74, 0xD7, - 0x73, 0x43, 0xBD, 0x50, 0x1F, 0x68, 0xAF, 0xDF, 0x3E, 0x2A, - 0xC4, 0xDC, 0x6F, 0x85, 0x2A, 0xBC, 0x0F, 0x39, 0x4B, 0x97, - 0x6D, 0x2D, 0x87, 0x5F, 0x9A, 0x07, 0x82, 0xC7, 0x69, 0xB9, - 0xF2, 0xEF, 0xE3, 0x3C, 0x3C, 0x74, 0xB2, 0xFD, 0x81, 0x6F, - 0xC3, 0xAC, 0x93, 0x22, 0x49, 0xB5, 0x73, 0x5C, 0x58, 0x6E, - 0x5F, 0x7A, 0x6B, 0x91, 0x02, 0x25, 0x3B, 0xC8, 0x24, 0xD7, - 0xEF, 0xC8, 0x10, 0xD7, 0x54, 0xD4, 0xA7, 0xC1, 0x88, 0x77, - 0xDD, 0xCD, 0x3A, 0x92, 0xE5, 0x1D, 0xA1, 0x33, 0x10, 0xA4, - 0xF6, 0xB4, 0x43, 0xA4, 0xDB, 0x77, 0x4C, 0x91, 0x7C, 0xED, - 0xDD, 0xC7, 0xB9, 0x5A, 0xB4, 0x2A, 0x6C, 0x78, 0x54, 0xCA, - 0xBD, 0x16, 0x0C, 0x8C, 0x68, 0xE8, 0xBC, 0xDE, 0x65, 0x2F, - 0xAF, 0xEF, 0x09, 0xDC, 0x7C, 0x17, 0x7D, 0x05, 0xF7, 0xB1, - 0x8D, 0x09, 0x94, 0xDC, 0xF2, 0xAE, 0xF4, 0x21, 0x54, 0xF9, - 0x3E, 0xB0, 0x2A, 0x73, 0xFE, 0x9C, 0x51, 0xEB, 0x1E, 0x7B, - 0xFE, 0x65, 0xCB, 0x53, 0x80, 0x5B, 0xD2, 0x05, 0xA1, 0xE9, - 0xCB, 0x75, 0x60, 0x46, 0x08, 0x07, 0x83, 0x27, 0x4E, 0xD4, - 0xBF, 0x70, 0x83, 0xDE, 0xA9, 0xB4, 0x22, 0x55, 0xF1, 0x5F, - 0x91, 0x88, 0x4A, 0x43, 0xC1, 0xBF, 0x0A, 0xEF, 0xA7, 0xFF, - 0xE5, 0xA6, 0x50, 0xDD, 0xFD, 0x6E, 0x22, 0xFF, 0xC1, 0x55, - 0x82, 0x0B, 0x42, 0x86, 0x42, 0xA7, 0x91, 0xD3, 0x62, 0x69, - 0xB2, 0x8D, 0x11, 0xC5, 0xB8, 0x4F, 0xBF, 0x4D, 0xFE, 0x37, - 0x12, 0x1F, 0xBF, 0xDE, 0xA5, 0x86, 0xAD, 0xC7, 0x2C, 0x7F, - 0x27, 0x01, 0xB0, 0xA1, 0xED, 0x7D, 0xCE, 0x33, 0x68, 0x97, - 0x2E, 0xA4, 0xF4, 0xEE, 0xA4, 0x36, 0x67, 0xE3, 0xAB, 0x89, - 0xF8, 0xCE, 0xF7, 0x01, 0xB1, 0x83, 0xFB, 0x54, 0xAA, 0x69, - 0x05, 0x76, 0x24, 0xD9, 0x76, 0x9F, 0xA3, 0x9C, 0x52, 0x8C, - 0x2E, 0x27, 0xB9, 0xA3, 0x6E, 0xE2, 0xC0, 0x02, 0x09, 0xC6, - 0x18, 0xAD, 0x42, 0x88, 0x6B, 0x2F, 0x5D, 0xB4, 0xF7, 0xC6, - 0xB4, 0x18, 0xB7, 0x88, 0x0B, 0x81, 0x2C, 0x25, 0xCE, 0xC3, - 0x7E, 0x9E, 0xAE, 0xBB, 0x35, 0x3C, 0xEC, 0x78, 0x46, 0x8F, - 0x03, 0x16, 0x5E, 0x5B, 0x08, 0x63, 0xFB, 0xBC, 0x78, 0x75, - 0xAB, 0x07, 0x1A, 0xA7, 0x96, 0x41, 0xCD, 0xDC, 0x3B, 0x59, - 0xDB, 0x02, 0xBE, 0x42, 0x09, 0xF5, 0x87, 0x96, 0x5D, 0x63, - 0xC9, 0x8E, 0x06, 0xA2, 0xFF, 0xCE, 0xCD, 0xF3, 0xDE, 0x93, - 0x79, 0x63, 0x92, 0xD2, 0xB9, 0x1D, 0x76, 0x7E, 0x4F, 0x36, - 0x2A, 0x89, 0x7B, 0x93, 0xC1, 0x35, 0x0A, 0x83, 0x8B, 0xD6, - 0xF4, 0xEA, 0x2A, 0x72, 0xA9, 0xE7, 0x6A, 0x77, 0x43, 0x14, - 0x49, 0x5B, 0x01, 0xD9, 0xE7, 0x72, 0x15, 0xD9, 0x9C, 0xBE, - 0x87, 0x90, 0x2A, 0x7F, 0x68, 0x02, 0x1C, 0xB5, 0xA1, 0xC6, - 0x7B, 0x24, 0x49, 0xBF, 0x8E, 0x3D, 0xE0, 0xBA, 0x1C, 0x78, - 0x0A, 0x7C, 0x69, 0x82, 0xA1, 0x2F, 0xB6, 0x52, 0xC5, 0x25, - 0xD8, 0x9D, 0x4B, 0x38, 0xAA, 0xBA, 0xF7, 0x4C, 0xC4, 0xC2, - 0xAE, 0xED, 0x6C, 0x28, 0x1C, 0x76, 0xA9, 0x96, 0x08, 0xAB, - 0xC4, 0x15, 0xBC, 0x3E, 0xD7, 0xCC, 0xC4, 0xA2, 0xD4, 0x93, - 0xD1, 0x3A, 0xF4, 0x2F, 0x17, 0xDB, 0x1C, 0xBD, 0xCA, 0x0D, - 0x5C, 0xF9, 0x69, 0x32, 0xAF, 0xC5, 0x27, 0x37, 0xFC, 0x1B, - 0xBB, 0x8A, 0x5D, 0x41, 0xA9, 0xC7, 0xE7, 0xC5, 0x2E, 0x78, - 0xE3, 0x7A, 0x5A, 0x25, 0x49, 0x2A, 0x06, 0x3D, 0x15, 0x58, - 0x56, 0xFB, 0x66, 0xEC, 0x30, 0x7D, 0xF4, 0x02, 0xF3, 0x53, - 0x3D, 0x0D, 0xDD, 0xFE, 0xB5, 0x66, 0xB0, 0xD0, 0xAA, 0x0E, - 0x6A, 0x76, 0xA6, 0xAB, 0x87, 0x14, 0xFB, 0x47, 0xAC, 0x26, - 0x53, 0xA9, 0x2C, 0xF3, 0xD5, 0xA6, 0x4F, 0xF0, 0x3A, 0x7E, - 0x78, 0xC5, 0x69, 0x1F, 0xB7, 0xDC, 0xC4, 0xE8, 0xD7, 0x44, - 0x7B, 0xB2, 0xC4, 0x50, 0x68, 0xF4, 0x33, 0xFC, 0x65, 0x0D, - 0xDC, 0xCD, 0x71, 0xCB, 0x9C, 0x65, 0x3B, 0x72, 0xB7, 0x19, - 0x70, 0x45, 0xA7, 0x36, 0xA4, 0xCF, 0xE7, 0x6F, 0xC8, 0xF9, - 0x67, 0x52, 0x22, 0x8F, 0x8F, 0x64, 0x89, 0xD3, 0x3E, 0x50, - 0xCC, 0xBE, 0x2B, 0xF3, 0x0A, 0x22, 0x96, 0x33, 0x56, 0x30, - 0x27, 0x3F, 0x42, 0xDE, 0x69, 0xA3, 0x63, 0xDE, 0x41, 0x94, - 0x02, 0x97, 0x9D, 0x58, 0xF3, 0x27, 0xE3, 0xFE, 0x94, 0x10, - 0x20, 0x55, 0x52, 0xD2, 0x46, 0xFB, 0x5E, 0x8C, 0xDF, 0x71, - 0x9B, 0xBF, 0x33, 0x79, 0x7C, 0xF3, 0x78, 0xA3, 0x75, 0x84, - 0x6C, 0x13, 0xEF, 0xC0, 0x43, 0x82, 0xAC, 0xF0, 0x97, 0x7D, - 0x2A, 0xBC, 0xA3, 0xB7, 0xCD, 0x4C, 0x99, 0xB9, 0xB1, 0xE9, - 0x38, 0x5C, 0x97, 0xB3, 0xC0, 0x2C, 0xBD, 0x6F, 0xF7, 0x14, - 0x26, 0x3A, 0x27, 0x31, 0x52, 0x81, 0x04, 0x88, 0xE6, 0xD8, - 0x43, 0x21, 0x78, 0x87, 0x7C, 0x7E, 0x28, 0x26, 0x4F, 0x93, - 0x9D, 0x7B, 0x2D, 0x02, 0x6E, 0x91, 0x74, 0xD9, 0x2C, 0xF7, - 0x43, 0xD8, 0x66, 0x81, 0x91, 0x21, 0xA1, 0xEE, 0xBC, 0x78, - 0x71, 0x80, 0x78, 0x54, 0x16, 0x59, 0x37, 0xB8, 0x69, 0xD3, - 0x49, 0x40, 0xAB, 0x03, 0x47, 0x36, 0xFD, 0x5D, 0x60, 0x57, - 0x8F, 0xBE, 0xA8, 0xA0, 0x21, 0x38, 0x43, 0xA9, 0x5C, 0x9F, - 0xAD, 0xD8, 0xAE, 0x97, 0xA3, 0x0F, 0xFC, 0xE4, 0x4A, 0xCF, - 0x9F, 0xE9, 0x75, 0x3D, 0x60, 0x91, 0x55, 0x5C, 0x0A, 0xB9, - 0x18, 0xEF, 0xD4, 0x08, 0x58, 0x06, 0x64, 0xA1, 0x45, 0xA7, - 0x5D, 0x3F, 0x13, 0x87, 0x49, 0x76, 0x8B, 0x1B, 0x54, 0x9C, - 0x61, 0x05, 0xC6, 0x2C, 0xED, 0x24, 0x1B, 0x7F, 0x9E, 0x9B, - 0x17, 0xBB, 0x84, 0xD8, 0xE2, 0x55, 0x69, 0x0E, 0xCF, 0xB2, - 0xC3, 0x61, 0x35, 0x0D, 0x86, 0xD7, 0x81, 0x75, 0x43, 0x98, - 0x29, 0xDF, 0x19, 0x9C, 0xFB, 0xC0, 0xC0, 0x5A, 0x7E, 0xF7, - 0xC6, 0x86, 0xEF, 0x6E, 0xBA, 0x26, 0x1D, 0x07, 0xF9, 0xC0, - 0x1F, 0xC0, 0x8E, 0x41, 0x8F, 0x1A, 0xE3, 0x51, 0xE2, 0xD7, - 0xCA, 0x28, 0x7D, 0x7A, 0xA7, 0x57, 0xA3, 0x2D, 0x98, 0x56, - 0x32, 0x9D, 0xC0, 0xF8, 0x23, 0x1D, 0x2C, 0xF6, 0x64, 0x1E, - 0x70, 0x33, 0xD4, 0x8F, 0xF9, 0xB0, 0xF4, 0x57, 0x7F, 0xD1, - 0x9A, 0xD4, 0x1A, 0x7E, 0xB6, 0x07, 0xAA, 0x54, 0x19, 0x0D, - 0x5D, 0xB8, 0x26, 0x45, 0x1B, 0x38, 0x14, 0x20, 0xFB, 0xAA, - 0x09, 0x71, 0xAF, 0x96, 0xB1, 0x17, 0xF3, 0x45, 0xA3, 0xA6, - 0x90, 0x52, 0x3C, 0x3B, 0x43, 0x9A, 0x8D, 0xE3, 0xB1, 0xC5, - 0xE4, 0x32, 0x6C, 0xE0, 0x17, 0x98, 0x43, 0x34, 0x54, 0x10, - 0x17, 0x82, 0x27, 0xE8, 0x8F, 0x99, 0x88, 0x98, 0x26, 0x70, - 0x19, 0xD1, 0x2D, 0x23, 0x02, 0x5F, 0x44, 0x71, 0x2A, 0xF6, - 0x48, 0x83, 0x34, 0x3A, 0x37, 0x11, 0x9C, 0xA1, 0xCE, 0xF0, - 0xD7, 0x6E, 0xF7, 0x2B, 0xA3, 0xFC, 0x07, 0x40, 0x64, 0x1A, - 0xF1, 0xF6, 0xF8, 0x90, 0x21, 0x1C, 0x0E, 0x85, 0xAA, 0xC1, - 0xF7, 0x16, 0xF5, 0x4D, 0x27, 0x8E, 0x91, 0x4E, 0x84, 0x19, - 0xDB, 0x8C, 0xEA, 0x00, 0xEA, 0xA6, 0x86, 0x18, 0x2C, 0x8B, - 0x46, 0x5F, 0xED, 0x61, 0x38, 0x28, 0x31, 0x4A, 0x1A, 0x12, - 0x19, 0x6C, 0x2D, 0x43, 0x0E, 0xD0, 0xDD, 0x4B, 0xFA, 0xA0, - 0x39, 0xC2, 0x4B, 0x31, 0xD9, 0x56, 0xB4, 0x9E, 0xB5, 0xD1, - 0x79, 0xA3, 0x35, 0xC7, 0xAF, 0xFD, 0x0E, 0x11, 0xC7, 0x0F, - 0x55, 0x1D, 0xCA, 0x71, 0xD1, 0x37, 0x3B, 0xC2, 0x72, 0xA0, - 0xDB, 0xEE, 0xA0, 0xF2, 0x28, 0xF4, 0x77, 0x34, 0x7D, 0x9F, - 0xE8, 0x38, 0xD0, 0xF1, 0xEB, 0x51, 0x95, 0x93, 0x5D, 0x7B, - 0x4F, 0xE7, 0x1A, 0xD5, 0xA1, 0xF1, 0xF1, 0x85, 0xF7, 0x58, - 0x5C, 0x2C, 0x49, 0xAF, 0xDC, 0x93, 0xFE, 0x73, 0x0F, 0xC8, - 0xC8, 0x26, 0x1B, 0xDE, 0xD8, 0xA6, 0x8A, 0x44, 0xB4, 0x2B, - 0x67, 0xBD, 0x8E, 0xFF, 0xA5, 0x8C, 0x18, 0x95, 0xD3, 0x02, - 0x7F, 0x28, 0x93, 0xAE, 0x84, 0x1E, 0xB0, 0x5C, 0x70, 0x57, - 0x1C, 0xFF, 0x75, 0x95, 0xBF, 0xAD, 0x95, 0xF3, 0x3C, 0x19, - 0xA0, 0x7A, 0x0F, 0x62, 0x65, 0xF0, 0x0F, 0x18, 0x1E, 0x48, - 0xB3, 0x85, 0x5D, 0x11, 0x47, 0xC9, 0x95, 0x75, 0xBE, 0xFA, - 0x2D, 0x56, 0x35, 0xD0, 0x7A, 0x75, 0x68, 0xEA, 0x7D, 0x01, - 0x9E, 0xD5, 0x28, 0x9E, 0x80, 0x09, 0xE5, 0xE9, 0xF8, 0xD3, - 0x11, 0xA6, 0xC7, 0x5E, 0xD6, 0x38, 0x8B, 0x96, 0x7A, 0xFB, - 0xD8, 0x27, 0xD4, 0x47, 0x6B, 0x50, 0xAB, 0x21, 0x4E, 0xFB, - 0xC2, 0xA1, 0x8C, 0xB7, 0x50, 0xE2, 0xF7, 0xC3, 0x4C, 0x66, - 0x04, 0x28, 0x17, 0x5D, 0x6F, 0x48, 0x39, 0x9A, 0x0B, 0x4A, - 0xB0, 0x75, 0xDF, 0xA9, 0x6E, 0xE0, 0x72, 0x20, 0x68, 0xC5, - 0x9C, 0xDB, 0x41, 0xA4, 0xF9, 0xA4, 0xF5, 0x1D, 0xDD, 0x89, - 0x83, 0x11, 0xDD, 0x3A, 0xA4, 0x76, 0x38, 0x62, 0x75, 0x4C, - 0x5D, 0xC7, 0xF5, 0x99, 0x75, 0xFB, 0xB7, 0x87, 0xB8, 0x77, - 0x2B, 0x45, 0xEF, 0xC5, 0xE5, 0x10, 0xD9, 0x6B, 0x4C, 0x72, - 0x4B, 0x42, 0x13, 0x71, 0x3C, 0x9C, 0x2C, 0x2E, 0xFB, 0xA2, - 0x3A, 0xCD, 0x2B, 0x83, 0x12, 0xA7, 0xF3, 0xA5, 0xCE, 0x4B, - 0x77, 0x2B, 0xF5, 0x71, 0xA0, 0x1A, 0x40, 0x7F, 0xED, 0x97, - 0x4B, 0x0C, 0xA0, 0x55, 0x6B, 0x69, 0x73, 0x52, 0x47, 0x6A, - 0x20, 0xCB, 0xEE, 0xE0, 0xBE, 0x97, 0x8F, 0x05, 0xE0, 0x84, - 0x4A, 0x6E, 0x40, 0xCC, 0x02, 0x2C, 0xA8, 0x45, 0xD4, 0x6B, - 0xD4, 0xCD, 0x41, 0x29, 0xBE, 0x99, 0x3B, 0x51, 0x0F, 0x9C, - 0x70, 0x75, 0x83, 0x3D, 0x42, 0xCF, 0xA9, 0x02, 0xF3, 0x68, - 0x3C, 0x96, 0xE1, 0x36, 0x46, 0xB7, 0x86, 0x16, 0x03, 0x2C, - 0xBB, 0x71, 0x21, 0xBF, 0x13, 0x52, 0x03, 0x42, 0x31, 0xE3, - 0xA3, 0x26, 0xEE, 0xD7, 0x86, 0x78, 0xDA, 0x9E, 0x9A, 0x50, - 0xD1, 0x9C, 0x5B, 0xB7, 0xEB, 0xCF, 0x0A, 0x6D, 0x10, 0xA0, - 0xAB, 0x8C, 0x65, 0x4B, 0xFA, 0x9E, 0xAC, 0x0B, 0x66, 0x56, - 0xC7, 0x5D, 0x85, 0x88, 0x53, 0x1B, 0xC2, 0x37, 0xCC, 0x94, - 0x2E, 0xE1, 0xB1, 0xF7, 0xCC, 0x1F, 0x59, 0x24, 0xEC, 0x1A, - 0x27, 0xFA, 0x8D, 0xE5, 0x86, 0x9E, 0x3F, 0x21, 0xDA, 0x15, - 0xAE, 0xC7, 0x6C, 0xFB, 0x17, 0x0D, 0xF5, 0xCB, 0xE3, 0xB8, - 0x36, 0x95, 0x0F, 0xBD, 0x84, 0x19, 0x1D, 0xF5, 0x4F, 0x17, - 0xB8, 0x71, 0x9C, 0x0E, 0x3D, 0xD8, 0xFD, 0x9B, 0xD4, 0x0D, - 0x2D, 0x16, 0x5D, 0x75, 0xE7, 0x25, 0x94, 0x3D, 0xD3, 0x0C, - 0x07, 0x3D, 0x04, 0x46, 0xC8, 0x8F, 0x65, 0x06, 0xC7, 0x11, - 0xB2, 0xAB, 0x41, 0x5E, 0x96, 0x0C, 0x68, 0x76, 0x7D, 0x6D, - 0xB8, 0xB5, 0x27, 0x01, 0x2C, 0x00, 0xC2, 0xA0, 0x40, 0xB8, - 0xF7, 0xC6, 0x39, 0x56, 0xCF, 0x25, 0x56, 0xB3, 0x10, 0x04, - 0xE9, 0xC3, 0x85, 0x47, 0xE8, 0x6E, 0xC7, 0x89, 0xFE, 0x80, - 0x9A, 0x50, 0x9E, 0xBD, 0xF3, 0x2E, 0x5E, 0x96, 0x0A, 0xA8, - 0xB7, 0x6C, 0x5B, 0x9E, 0x32, 0x1E, 0x75, 0x68, 0x5E, 0x74, - 0x88, 0xFC, 0xC5, 0x3D, 0xB9, 0x21, 0x0A, 0xAD, 0x6D, 0xF6, - 0xBE, 0x2D, 0x9A, 0x8A, 0xA5, 0x2A, 0x40, 0x3C, 0xF6, 0x4C, - 0xFE, 0x18, 0xE3, 0x44, 0x7A, 0x5F, 0x31, 0x1A, 0xEE, 0x95, - 0x07, 0x96, 0xC1, 0x27, 0x7F, 0x64, 0x4E, 0xF0, 0x19, 0x2D, - 0x36, 0x33, 0x5D, 0x23, 0xC9, 0xC2, 0x36, 0x91, 0x22, 0xC9, - 0x58, 0x8C, 0xE4, 0xF1, 0x19, 0xD0, 0xBF, 0x51, 0xAA, 0x14, - 0x4C, 0x15, 0x4A, 0x93, 0xF3, 0x16, 0x6A, 0x21, 0xBE, 0xDE, - 0xA5, 0x4C, 0x84, 0xC5, 0x65, 0x06, 0xA7, 0x11, 0xDC, 0x00, - 0x5F, 0x0F, 0xF1, 0xDA, 0xA2, 0x11, 0xAB, 0x64, 0xE0, 0x1F, - 0x1A, 0x65, 0x32, 0xA7, 0x69, 0x65, 0xAF, 0x64, 0x95, 0x90, - 0xF1, 0xA5, 0xFA, 0x32, 0x4C, 0x59, 0x61, 0x87, 0x3D, 0x94, - 0x82, 0x7E, 0xE4, 0x04, 0x7B, 0x8A, 0xCD, 0x54, 0x00, 0x2A, - 0xC5, 0xC3, 0xB7, 0x2F, 0x8A, 0xA8, 0x19, 0x39, 0x93, 0x53, - 0x3E, 0xEB, 0xE7, 0x8F, 0xF7, 0xCF, 0xDA, 0x8A, 0x4E, 0xAB, - 0x91, 0x3D, 0xA3, 0x40, 0x55, 0x64, 0xE7, 0x48, 0x90, 0x03, - 0xE5, 0xE6, 0x03, 0xE8, 0x2A, 0x23, 0x78, 0x6F, 0xCA, 0xDE, - 0x7C, 0x6E, 0x56, 0x5B, 0xC8, 0x6D, 0x8C, 0x2F, 0xC8, 0x6C, - 0x7D, 0xD8, 0x60, 0x43, 0x8C, 0xF3, 0xE9, 0x9E, 0x70, 0x73, - 0xAC, 0x85, 0xB4, 0xA3, 0x29, 0x86, 0x88, 0x60, 0x6D, 0xDD, - 0x21, 0x07, 0x09, 0x8B, 0xFB, 0xA1, 0x67, 0xA5, 0xDA, 0x9D, - 0xCC, 0x2E, 0xE3, 0xBE, 0xAE, 0x06, 0x0E, 0x41, 0x4E, 0xBE, - 0x5F, 0xE4, 0x93, 0x81, 0xE8, 0x06, 0xAA, 0x2C, 0xC9, 0x1B, - 0x1C, 0x5A, 0x9E, 0x01, 0xEF, 0xFF, 0x82, 0x84, 0xD9, 0x2B, - 0x05, 0x20, 0x0D, 0xE1, 0x14, 0x6C, 0x0A, 0x85, 0x16, 0x2E, - 0x79, 0xA3, 0x64, 0xBF, 0xFC, 0x89, 0xB8, 0xFD, 0xB0, 0xC8, - 0x39, 0x9A, 0x83, 0x1B, 0x74, 0x41, 0x7C, 0xEA, 0xFD, 0x5F, - 0x83, 0x19 +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + +static const unsigned char bench_dilithium_level2_pubkey[] = { + 0xea, 0x05, 0x24, 0x0d, 0x80, 0x72, 0x25, 0x55, 0xf4, 0x5b, + 0xc2, 0x13, 0x8b, 0x87, 0x5d, 0x31, 0x99, 0x2f, 0x1d, 0xa9, + 0x41, 0x09, 0x05, 0x76, 0xa7, 0xb7, 0x5e, 0x8c, 0x44, 0xe2, + 0x64, 0x79, 0xa0, 0xec, 0x1f, 0x24, 0xb6, 0xc8, 0x05, 0x5b, + 0xc1, 0x18, 0xb0, 0xb7, 0xcf, 0x8c, 0x60, 0x67, 0x6b, 0x81, + 0x44, 0x27, 0xb6, 0x0e, 0xfd, 0x9b, 0xc3, 0xcb, 0x52, 0x31, + 0xfa, 0xc9, 0x34, 0x8d, 0x22, 0x1e, 0x07, 0x9d, 0x96, 0x6a, + 0x63, 0x83, 0x5c, 0xd7, 0x83, 0x2d, 0x7f, 0x48, 0x64, 0x79, + 0xca, 0xb4, 0x9f, 0xa2, 0x02, 0xb7, 0x86, 0x1d, 0x0e, 0xc7, + 0xf9, 0x6c, 0x07, 0xc0, 0x35, 0x6a, 0x34, 0x79, 0x7c, 0xb8, + 0x0f, 0xed, 0x98, 0x50, 0xfb, 0x51, 0xe0, 0x36, 0x44, 0x4c, + 0xc6, 0x35, 0xa2, 0xbb, 0x55, 0xb0, 0x5c, 0x39, 0x08, 0x02, + 0x20, 0x35, 0x5c, 0x56, 0x6d, 0x2e, 0xb9, 0xef, 0x21, 0x26, + 0x87, 0x87, 0x85, 0x8a, 0x32, 0xb5, 0xa7, 0x68, 0x70, 0x3a, + 0xfd, 0x0d, 0x21, 0x48, 0x91, 0xa3, 0x29, 0xc1, 0x2a, 0x38, + 0xe5, 0x26, 0x31, 0x1f, 0x42, 0xde, 0x0b, 0x25, 0xff, 0x1d, + 0x6b, 0xb4, 0xe0, 0x5d, 0x2d, 0xcf, 0x44, 0xd5, 0x7d, 0xc4, + 0xf6, 0x95, 0xf2, 0x06, 0x4f, 0x83, 0x88, 0x9d, 0x1e, 0xeb, + 0x1c, 0x09, 0x45, 0x62, 0x67, 0x3d, 0xff, 0x51, 0x47, 0xe8, + 0xbc, 0x9b, 0x03, 0x1f, 0xc7, 0x72, 0x65, 0xce, 0xa8, 0x8c, + 0xc2, 0xa0, 0xc2, 0xbd, 0x5b, 0x7c, 0x17, 0x16, 0x8b, 0x72, + 0xfa, 0xb1, 0xbd, 0xdf, 0x49, 0xd6, 0xa1, 0x00, 0x65, 0xbe, + 0x82, 0xe7, 0x68, 0xc7, 0xe7, 0xbc, 0xc2, 0xa4, 0xdb, 0xaa, + 0xcc, 0xea, 0x41, 0x52, 0x7f, 0x56, 0xb4, 0x68, 0x1f, 0x92, + 0x96, 0x0f, 0xce, 0xd4, 0xd0, 0x87, 0x4c, 0x4a, 0x73, 0xb5, + 0x6c, 0xd4, 0x69, 0x55, 0x15, 0x47, 0xdc, 0x94, 0x7f, 0xd2, + 0x54, 0x5e, 0xb2, 0x90, 0xc2, 0x47, 0xe4, 0xf5, 0xde, 0x8b, + 0x9b, 0xc6, 0x5d, 0x50, 0x95, 0x60, 0xe0, 0xf0, 0xa7, 0x4e, + 0xe0, 0xcd, 0x41, 0x09, 0xef, 0xb3, 0x3d, 0x90, 0x5c, 0x77, + 0x54, 0xec, 0x9e, 0x5d, 0x8a, 0xe7, 0x09, 0x5c, 0xc9, 0x58, + 0x0c, 0xd0, 0x42, 0x35, 0xd2, 0x14, 0x59, 0x38, 0x69, 0xad, + 0xf9, 0xb5, 0xbf, 0x8a, 0x8e, 0x33, 0xd8, 0x5e, 0x7a, 0x55, + 0xd0, 0x53, 0x15, 0x40, 0x4e, 0xc5, 0x86, 0xd7, 0x8f, 0x5f, + 0x2f, 0x55, 0x82, 0xc2, 0x4f, 0x16, 0xe5, 0xea, 0x1c, 0xbc, + 0xff, 0x5e, 0x1f, 0x39, 0x46, 0x70, 0x54, 0x7a, 0x3a, 0x27, + 0x16, 0x1a, 0x2b, 0x6c, 0xd2, 0xb7, 0x80, 0xd3, 0xd1, 0x9d, + 0x25, 0x59, 0xed, 0xe6, 0x51, 0xb1, 0xf2, 0xad, 0x7e, 0x51, + 0x78, 0x14, 0x2b, 0x19, 0xae, 0x64, 0x72, 0x0f, 0xd8, 0x18, + 0x79, 0x8e, 0x66, 0x88, 0xd3, 0xa4, 0xa3, 0xc3, 0x76, 0x21, + 0xcb, 0xe4, 0x79, 0x5e, 0x95, 0x74, 0xe3, 0x31, 0x18, 0x79, + 0xed, 0xc7, 0xe7, 0xfb, 0x86, 0x48, 0x1b, 0x7b, 0x75, 0x5b, + 0x7f, 0x7c, 0x82, 0xc5, 0xab, 0x11, 0xb4, 0x5d, 0x59, 0x6f, + 0x78, 0xb2, 0xa5, 0x39, 0xc6, 0x63, 0x38, 0x6c, 0xeb, 0x50, + 0x06, 0x14, 0x76, 0xf0, 0xe8, 0xfb, 0x11, 0x95, 0x1f, 0x9d, + 0x9c, 0xa6, 0xe1, 0xe2, 0x0d, 0xa3, 0x66, 0xfc, 0x20, 0x83, + 0x50, 0x0e, 0x53, 0x75, 0xb5, 0x12, 0xf4, 0xdf, 0x31, 0x46, + 0x83, 0xac, 0x5b, 0xf3, 0x99, 0xa6, 0xd1, 0x7b, 0x2b, 0xc5, + 0xdc, 0x71, 0x07, 0x27, 0x33, 0x35, 0x34, 0xf5, 0x30, 0x19, + 0xc1, 0x3b, 0xba, 0x8a, 0xaf, 0x7e, 0x49, 0x93, 0x48, 0x5b, + 0x38, 0xc0, 0xbc, 0x2e, 0xc7, 0x59, 0x1b, 0xd9, 0xf5, 0xcc, + 0x86, 0xf5, 0x7b, 0x4d, 0xd7, 0x39, 0xa7, 0xa2, 0x56, 0x20, + 0x48, 0x98, 0x7d, 0x4f, 0x75, 0x56, 0x9b, 0xb8, 0x95, 0x45, + 0x17, 0xf3, 0x86, 0x3d, 0x97, 0x0a, 0x49, 0x1b, 0xca, 0xff, + 0x20, 0xc0, 0x24, 0x2c, 0x51, 0xc2, 0x0a, 0x3c, 0xbf, 0x07, + 0x60, 0x1c, 0x88, 0x85, 0x9b, 0x85, 0x2d, 0x4a, 0xfe, 0x5a, + 0x1c, 0x90, 0xf5, 0x90, 0x12, 0xd3, 0x03, 0x3c, 0x8c, 0x2e, + 0x95, 0x4a, 0x47, 0x76, 0x0f, 0x1f, 0x5d, 0x9e, 0xed, 0xc5, + 0x64, 0xc4, 0x9b, 0xbf, 0x86, 0xc5, 0x63, 0x84, 0x33, 0x00, + 0xf1, 0x26, 0x18, 0x21, 0xf3, 0x88, 0x1a, 0x08, 0x18, 0x6d, + 0x2f, 0xef, 0xd5, 0xeb, 0x2f, 0x69, 0xc8, 0x6e, 0x92, 0x34, + 0xfc, 0x72, 0x3d, 0x9a, 0xa7, 0x9e, 0x51, 0xfb, 0x56, 0xe3, + 0xdc, 0xf4, 0x8f, 0x9b, 0x6d, 0x0d, 0x2a, 0xec, 0x66, 0x12, + 0x26, 0x35, 0xbd, 0x61, 0xc2, 0x67, 0x19, 0xf5, 0x7e, 0xa1, + 0x67, 0xa2, 0x9c, 0x3b, 0x67, 0xb0, 0xc2, 0x51, 0x6a, 0x37, + 0x7c, 0x48, 0xe9, 0x4b, 0xb9, 0xa3, 0x38, 0x2f, 0xfc, 0xde, + 0xb4, 0x7c, 0xda, 0x52, 0x84, 0x0b, 0xb0, 0xd9, 0x08, 0xe9, + 0x7a, 0x4a, 0x6f, 0x79, 0x29, 0x3d, 0xc4, 0x5c, 0x78, 0xee, + 0x63, 0xb6, 0x96, 0x68, 0xd9, 0x82, 0x4e, 0xc1, 0x1b, 0x6f, + 0x52, 0xf5, 0xb3, 0xfb, 0xe8, 0xc4, 0x2a, 0x07, 0xc6, 0x3b, + 0x85, 0x0d, 0xf4, 0xbf, 0xb0, 0x6b, 0xfb, 0xce, 0x1d, 0xb4, + 0xbf, 0x63, 0x0b, 0x91, 0x67, 0xc4, 0xa3, 0x06, 0xa4, 0xaf, + 0x6c, 0xd3, 0xe5, 0x8b, 0x87, 0x4e, 0x64, 0x9c, 0xb1, 0xf3, + 0x70, 0x7c, 0x68, 0x43, 0x46, 0x13, 0x46, 0xee, 0x27, 0x75, + 0x12, 0x45, 0x42, 0xde, 0xa5, 0x8d, 0xcf, 0xf7, 0x09, 0x87, + 0xa8, 0x80, 0x3d, 0xb6, 0x45, 0xee, 0x41, 0x2d, 0x7c, 0x45, + 0x01, 0x9d, 0xaa, 0x78, 0xa8, 0x10, 0xa4, 0xfd, 0xb5, 0x5f, + 0xee, 0x0f, 0x77, 0xba, 0x73, 0xff, 0x49, 0xdc, 0xfa, 0x39, + 0xd6, 0xa3, 0x6f, 0x25, 0xb9, 0x63, 0x2c, 0x92, 0xc5, 0xdf, + 0xfb, 0xba, 0x89, 0xf9, 0xfa, 0x94, 0x5b, 0x6f, 0x5a, 0x4d, + 0x1c, 0xe4, 0xc9, 0x10, 0xf9, 0xa0, 0xe8, 0xc4, 0xcb, 0x55, + 0x1a, 0xdb, 0x56, 0x5f, 0x8e, 0x91, 0x03, 0x23, 0xca, 0xb0, + 0x1f, 0xef, 0xb8, 0x6c, 0x13, 0x5a, 0x99, 0x25, 0xf0, 0x49, + 0xa9, 0x5a, 0x45, 0xf7, 0xfd, 0x1a, 0xc2, 0x71, 0x06, 0xe3, + 0x2d, 0x25, 0x64, 0xb0, 0x52, 0x12, 0x03, 0x62, 0xc7, 0xb6, + 0xf9, 0xdc, 0x1f, 0x78, 0xff, 0x8b, 0xfa, 0xde, 0x7f, 0x71, + 0xa6, 0x35, 0x3e, 0xac, 0x20, 0x54, 0x94, 0xa7, 0x2e, 0x9d, + 0x47, 0x17, 0x4b, 0xad, 0x92, 0xb3, 0x14, 0x26, 0x8c, 0x5a, + 0xd0, 0x16, 0x4b, 0x22, 0xe9, 0x0c, 0x79, 0x6b, 0x8e, 0xac, + 0x0d, 0x12, 0xf5, 0x66, 0x8e, 0x82, 0x1a, 0x44, 0xf3, 0xe9, + 0x56, 0x5a, 0xcd, 0x1c, 0x1b, 0x81, 0x7b, 0x63, 0x59, 0xfe, + 0xc8, 0xc0, 0xe3, 0xda, 0x16, 0x6b, 0x6f, 0x0d, 0xba, 0x0e, + 0x47, 0x12, 0x86, 0x9e, 0xf0, 0x3b, 0x4d, 0x87, 0x3b, 0xf2, + 0x75, 0x73, 0x2d, 0xdf, 0xca, 0x76, 0x0b, 0xbd, 0xe7, 0xb7, + 0x74, 0x24, 0xf3, 0xc6, 0xe6, 0x75, 0x3f, 0x8b, 0x6a, 0xd9, + 0xad, 0xed, 0xc0, 0x70, 0x04, 0x1e, 0x0b, 0x8e, 0x8b, 0x7f, + 0xea, 0xbc, 0x39, 0x6b, 0x8a, 0x44, 0xa6, 0x9a, 0x2d, 0x0d, + 0x8c, 0x21, 0x60, 0x09, 0xd2, 0x4a, 0xe0, 0x62, 0xcf, 0xfa, + 0xe8, 0x9b, 0x35, 0x6f, 0x23, 0x2f, 0xb5, 0x65, 0x08, 0x60, + 0x92, 0x15, 0xd0, 0x5b, 0x63, 0xcc, 0x65, 0x05, 0xd1, 0xef, + 0x0f, 0x7e, 0x1b, 0xb3, 0x8e, 0xc6, 0x12, 0x85, 0xc9, 0x82, + 0x53, 0x79, 0x2e, 0x80, 0x5f, 0x0c, 0x7b, 0xc7, 0x1c, 0x83, + 0x41, 0x06, 0xd8, 0x41, 0xc9, 0xe7, 0xb9, 0x4b, 0xa1, 0x61, + 0xc6, 0x86, 0x67, 0xf5, 0x10, 0xf7, 0x34, 0x0d, 0x39, 0x9e, + 0x2b, 0x5f, 0x19, 0x06, 0x02, 0xa5, 0x02, 0x23, 0x71, 0xc2, + 0x12, 0x65, 0xcc, 0x81, 0x06, 0xfd, 0x8d, 0x09, 0x68, 0x37, + 0x06, 0x3b, 0xff, 0xc4, 0x24, 0xb3, 0x1f, 0xd6, 0xe6, 0x8f, + 0x9c, 0x74, 0x2c, 0x5e, 0xc5, 0xf4, 0xe9, 0xeb, 0xca, 0xd3, + 0x04, 0x5b, 0x92, 0x9e, 0x5c, 0x1a, 0x1d, 0xa1, 0xa7, 0x34, + 0xd2, 0x05, 0xae, 0xdb, 0x3d, 0x71, 0x10, 0x6e, 0x30, 0xd9, + 0xa3, 0x44, 0xa0, 0xbd, 0x9e, 0x7b, 0xb5, 0x12, 0x8a, 0x12, + 0x07, 0x60, 0xd7, 0x1f, 0x92, 0xe6, 0xfe, 0x04, 0xa9, 0x3e, + 0x62, 0x64, 0x00, 0x5f, 0x7c, 0x7b, 0x34, 0x09, 0xeb, 0x4a, + 0x18, 0x9e, 0x77, 0x72, 0x3a, 0x31, 0x1a, 0x62, 0x2a, 0xb5, + 0xcb, 0x4e, 0x53, 0xce, 0xad, 0x8b, 0x5a, 0x20, 0x4f, 0xd7, + 0x3e, 0x16, 0xf8, 0x10, 0xe2, 0xae, 0xbd, 0x3f, 0x02, 0xa9, + 0x18, 0xa0, 0x01, 0x18, 0x84, 0x95, 0x22, 0x2e, 0x93, 0x76, + 0x44, 0x4e, 0x11, 0x7b, 0x03, 0x51, 0x50, 0x19, 0x79, 0xe7, + 0xbb, 0x5c, 0x7b, 0xca, 0x74, 0xb4, 0x25, 0x26, 0xdb, 0x66, + 0xaa, 0x0b, 0x21, 0x07, 0xfb, 0x7a, 0x96, 0x10, 0x7d, 0x99, + 0xa9, 0x16, 0xcb, 0x0e, 0xba, 0x63, 0xab, 0x95, 0xfc, 0x5a, + 0xbe, 0xa6, 0x7f, 0xd8, 0xb4, 0xcd, 0x7c, 0xc5, 0xd0, 0xb1, + 0x1b, 0x48, 0x40, 0xfb, 0xe6, 0x2f, 0x2b, 0x94, 0xfe, 0x68, + 0xa2, 0xc4, 0x36, 0xd9, 0xcd, 0xc1, 0x93, 0x6d, 0xef, 0x39, + 0x5e, 0x43, 0x30, 0x5a, 0x2e, 0x66, 0xb6, 0xf2, 0xed, 0x9a, + 0x8d, 0x12, 0xdf, 0x5c, 0xae, 0xad, 0x16, 0x12, 0x7e, 0x81, + 0x82, 0x91, 0x7d, 0x2b, 0x12, 0xe9, 0x96, 0xb8, 0xb7, 0x42, + 0xcb, 0x1f, 0xf8, 0xd1, 0xfd, 0x83, 0x7a, 0xe4, 0x36, 0x1d, + 0x04, 0x27, 0x4c, 0xe5, 0xbd, 0x75, 0x24, 0xf7, 0xbd, 0xb6, + 0x6a, 0x68, 0x4e, 0x2c, 0x1b, 0x56, 0x3e, 0x60, 0xa4, 0x42, + 0xca, 0x7a, 0x54, 0xe5, 0x06, 0xe3, 0xda, 0x05, 0xf7, 0x77, + 0x36, 0x8b, 0x81, 0x26, 0x99, 0x92, 0x42, 0xda, 0x45, 0xb1, + 0xfe, 0x4b, +}; +static const int sizeof_bench_dilithium_level2_pubkey = + sizeof(bench_dilithium_level2_pubkey); + +#endif /* !WOLFSSL_DILITHIUM_NO_VERIFY */ + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + +static const unsigned char bench_dilithium_level3_key[] = { + 0x15, 0xc9, 0xe5, 0x53, 0x2f, 0xd8, 0x1f, 0xb4, 0xa3, 0x9f, + 0xae, 0xad, 0xb3, 0x10, 0xd0, 0x72, 0x69, 0xd3, 0x02, 0xf3, + 0xdf, 0x67, 0x5a, 0x31, 0x52, 0x19, 0xca, 0x39, 0x27, 0x77, + 0x61, 0x6d, 0x72, 0xdd, 0x85, 0x06, 0xf6, 0x94, 0x0a, 0x57, + 0x52, 0xcd, 0xac, 0x83, 0x4a, 0xe5, 0xbe, 0xa4, 0x30, 0x79, + 0x9e, 0xc6, 0xd6, 0x04, 0xc8, 0x73, 0xdc, 0x5e, 0x41, 0x75, + 0x2f, 0xac, 0x76, 0x57, 0x03, 0x08, 0x46, 0xcb, 0xaf, 0x4c, + 0x6a, 0x4f, 0x20, 0x18, 0xb3, 0x2e, 0x11, 0x54, 0xb5, 0x94, + 0xe6, 0x6f, 0x76, 0xf6, 0xb9, 0x73, 0x9a, 0x07, 0x73, 0xe8, + 0x90, 0xd1, 0x04, 0xda, 0xc5, 0x97, 0xb9, 0x52, 0x51, 0xc8, + 0xc9, 0xcc, 0x87, 0x29, 0xa1, 0xde, 0x79, 0x9b, 0xf8, 0x7f, + 0x80, 0x3f, 0xfd, 0xb3, 0x24, 0xa5, 0xba, 0xf5, 0xd6, 0xd4, + 0x07, 0xbd, 0xa7, 0x1b, 0xd0, 0xe1, 0xd0, 0x43, 0x14, 0x52, + 0x27, 0x03, 0x33, 0x76, 0x00, 0x67, 0x30, 0x23, 0x76, 0x34, + 0x72, 0x02, 0x41, 0x62, 0x12, 0x43, 0x86, 0x30, 0x18, 0x28, + 0x46, 0x27, 0x45, 0x20, 0x88, 0x33, 0x54, 0x10, 0x03, 0x81, + 0x44, 0x50, 0x06, 0x44, 0x56, 0x30, 0x37, 0x38, 0x38, 0x46, + 0x03, 0x85, 0x01, 0x86, 0x43, 0x80, 0x78, 0x28, 0x83, 0x55, + 0x37, 0x44, 0x80, 0x12, 0x17, 0x51, 0x78, 0x46, 0x22, 0x01, + 0x53, 0x54, 0x63, 0x87, 0x77, 0x38, 0x11, 0x81, 0x43, 0x30, + 0x15, 0x47, 0x66, 0x11, 0x40, 0x65, 0x70, 0x56, 0x62, 0x28, + 0x21, 0x65, 0x30, 0x45, 0x63, 0x53, 0x31, 0x80, 0x81, 0x71, + 0x23, 0x62, 0x85, 0x03, 0x07, 0x56, 0x16, 0x28, 0x18, 0x35, + 0x07, 0x38, 0x60, 0x68, 0x17, 0x30, 0x15, 0x20, 0x04, 0x13, + 0x13, 0x61, 0x51, 0x58, 0x00, 0x37, 0x51, 0x58, 0x14, 0x06, + 0x12, 0x55, 0x13, 0x46, 0x76, 0x05, 0x51, 0x87, 0x32, 0x62, + 0x50, 0x41, 0x88, 0x24, 0x50, 0x31, 0x65, 0x36, 0x31, 0x02, + 0x75, 0x35, 0x78, 0x27, 0x36, 0x08, 0x01, 0x77, 0x22, 0x77, + 0x30, 0x80, 0x11, 0x21, 0x28, 0x26, 0x68, 0x27, 0x13, 0x70, + 0x50, 0x44, 0x88, 0x20, 0x50, 0x67, 0x65, 0x74, 0x17, 0x46, + 0x50, 0x16, 0x42, 0x75, 0x35, 0x12, 0x60, 0x12, 0x17, 0x13, + 0x36, 0x72, 0x04, 0x77, 0x07, 0x55, 0x20, 0x27, 0x15, 0x02, + 0x25, 0x12, 0x57, 0x71, 0x37, 0x45, 0x43, 0x34, 0x40, 0x31, + 0x78, 0x50, 0x31, 0x28, 0x17, 0x84, 0x87, 0x43, 0x25, 0x75, + 0x58, 0x05, 0x61, 0x56, 0x41, 0x44, 0x57, 0x67, 0x85, 0x54, + 0x00, 0x88, 0x88, 0x50, 0x68, 0x11, 0x14, 0x42, 0x08, 0x74, + 0x73, 0x00, 0x38, 0x08, 0x45, 0x28, 0x62, 0x43, 0x36, 0x20, + 0x30, 0x10, 0x87, 0x83, 0x67, 0x62, 0x02, 0x48, 0x46, 0x50, + 0x08, 0x08, 0x41, 0x43, 0x78, 0x22, 0x65, 0x87, 0x43, 0x84, + 0x25, 0x36, 0x58, 0x64, 0x30, 0x10, 0x20, 0x68, 0x82, 0x47, + 0x60, 0x31, 0x76, 0x68, 0x74, 0x68, 0x75, 0x61, 0x16, 0x26, + 0x82, 0x50, 0x32, 0x61, 0x41, 0x22, 0x38, 0x20, 0x86, 0x75, + 0x74, 0x00, 0x77, 0x12, 0x81, 0x35, 0x51, 0x78, 0x88, 0x64, + 0x82, 0x00, 0x41, 0x55, 0x62, 0x87, 0x51, 0x41, 0x74, 0x51, + 0x53, 0x27, 0x33, 0x84, 0x68, 0x86, 0x57, 0x60, 0x44, 0x30, + 0x22, 0x32, 0x10, 0x52, 0x22, 0x83, 0x48, 0x53, 0x66, 0x74, + 0x14, 0x52, 0x32, 0x71, 0x41, 0x08, 0x83, 0x67, 0x41, 0x38, + 0x46, 0x80, 0x88, 0x14, 0x84, 0x30, 0x85, 0x35, 0x46, 0x20, + 0x54, 0x84, 0x56, 0x84, 0x54, 0x82, 0x14, 0x11, 0x52, 0x07, + 0x86, 0x46, 0x05, 0x82, 0x26, 0x85, 0x75, 0x07, 0x88, 0x75, + 0x51, 0x17, 0x54, 0x32, 0x68, 0x66, 0x08, 0x23, 0x66, 0x06, + 0x42, 0x28, 0x00, 0x84, 0x27, 0x27, 0x43, 0x47, 0x12, 0x27, + 0x13, 0x15, 0x17, 0x74, 0x85, 0x14, 0x12, 0x62, 0x06, 0x47, + 0x17, 0x60, 0x00, 0x10, 0x85, 0x16, 0x55, 0x64, 0x46, 0x62, + 0x77, 0x05, 0x51, 0x23, 0x52, 0x37, 0x51, 0x78, 0x35, 0x66, + 0x14, 0x15, 0x78, 0x40, 0x16, 0x54, 0x67, 0x30, 0x61, 0x24, + 0x26, 0x86, 0x56, 0x83, 0x62, 0x78, 0x88, 0x83, 0x50, 0x06, + 0x13, 0x21, 0x33, 0x73, 0x16, 0x44, 0x86, 0x77, 0x65, 0x28, + 0x12, 0x40, 0x62, 0x54, 0x55, 0x84, 0x00, 0x11, 0x77, 0x38, + 0x71, 0x51, 0x38, 0x32, 0x33, 0x67, 0x15, 0x77, 0x24, 0x33, + 0x44, 0x11, 0x05, 0x65, 0x13, 0x03, 0x72, 0x63, 0x81, 0x58, + 0x08, 0x03, 0x34, 0x23, 0x61, 0x00, 0x02, 0x63, 0x86, 0x40, + 0x03, 0x71, 0x34, 0x27, 0x45, 0x10, 0x34, 0x26, 0x83, 0x28, + 0x31, 0x35, 0x26, 0x05, 0x58, 0x41, 0x11, 0x10, 0x65, 0x35, + 0x22, 0x42, 0x28, 0x88, 0x46, 0x06, 0x57, 0x33, 0x88, 0x46, + 0x04, 0x86, 0x88, 0x88, 0x51, 0x74, 0x82, 0x27, 0x58, 0x14, + 0x11, 0x08, 0x13, 0x16, 0x61, 0x16, 0x14, 0x44, 0x83, 0x85, + 0x71, 0x44, 0x55, 0x82, 0x16, 0x62, 0x85, 0x05, 0x43, 0x41, + 0x73, 0x53, 0x60, 0x01, 0x80, 0x68, 0x33, 0x13, 0x43, 0x44, + 0x73, 0x36, 0x65, 0x35, 0x22, 0x26, 0x13, 0x31, 0x36, 0x83, + 0x30, 0x27, 0x15, 0x11, 0x54, 0x53, 0x24, 0x84, 0x75, 0x24, + 0x72, 0x78, 0x34, 0x24, 0x35, 0x80, 0x06, 0x38, 0x88, 0x11, + 0x41, 0x01, 0x34, 0x87, 0x77, 0x20, 0x14, 0x50, 0x55, 0x12, + 0x17, 0x48, 0x87, 0x74, 0x58, 0x42, 0x31, 0x46, 0x36, 0x37, + 0x26, 0x50, 0x04, 0x75, 0x77, 0x15, 0x41, 0x53, 0x04, 0x04, + 0x26, 0x61, 0x65, 0x87, 0x55, 0x56, 0x07, 0x81, 0x28, 0x21, + 0x41, 0x61, 0x41, 0x50, 0x17, 0x47, 0x25, 0x50, 0x20, 0x83, + 0x46, 0x87, 0x18, 0x45, 0x40, 0x21, 0x06, 0x08, 0x12, 0x25, + 0x71, 0x13, 0x35, 0x55, 0x54, 0x61, 0x00, 0x52, 0x74, 0x78, + 0x13, 0x84, 0x55, 0x40, 0x14, 0x40, 0x78, 0x12, 0x88, 0x43, + 0x33, 0x24, 0x66, 0x88, 0x22, 0x44, 0x15, 0x37, 0x81, 0x27, + 0x84, 0x18, 0x28, 0x11, 0x58, 0x51, 0x71, 0x21, 0x02, 0x83, + 0x70, 0x48, 0x32, 0x46, 0x00, 0x70, 0x17, 0x30, 0x63, 0x21, + 0x46, 0x60, 0x50, 0x72, 0x77, 0x45, 0x83, 0x75, 0x26, 0x31, + 0x47, 0x34, 0x47, 0x84, 0x87, 0x63, 0x22, 0x83, 0x21, 0x10, + 0x21, 0x51, 0x47, 0x46, 0x31, 0x06, 0x57, 0x82, 0x65, 0x24, + 0x61, 0x66, 0x24, 0x68, 0x14, 0x03, 0x43, 0x41, 0x04, 0x14, + 0x47, 0x61, 0x57, 0x87, 0x43, 0x83, 0x43, 0x25, 0x87, 0x36, + 0x72, 0x51, 0x38, 0x51, 0x54, 0x54, 0x84, 0x40, 0x15, 0x30, + 0x35, 0x34, 0x43, 0x61, 0x63, 0x42, 0x77, 0x31, 0x42, 0x06, + 0x61, 0x03, 0x01, 0x41, 0x08, 0x84, 0x02, 0x65, 0x04, 0x72, + 0x32, 0x00, 0x21, 0x10, 0x54, 0x73, 0x04, 0x42, 0x48, 0x11, + 0x74, 0x18, 0x63, 0x73, 0x28, 0x61, 0x36, 0x80, 0x20, 0x86, + 0x24, 0x42, 0x16, 0x11, 0x71, 0x83, 0x78, 0x38, 0x82, 0x47, + 0x67, 0x18, 0x56, 0x86, 0x85, 0x66, 0x18, 0x24, 0x50, 0x74, + 0x72, 0x02, 0x66, 0x83, 0x63, 0x08, 0x25, 0x32, 0x15, 0x78, + 0x33, 0x08, 0x34, 0x44, 0x08, 0x28, 0x10, 0x25, 0x40, 0x11, + 0x04, 0x76, 0x60, 0x16, 0x65, 0x16, 0x13, 0x30, 0x53, 0x14, + 0x77, 0x06, 0x06, 0x88, 0x64, 0x47, 0x08, 0x23, 0x11, 0x56, + 0x46, 0x61, 0x48, 0x64, 0x73, 0x66, 0x07, 0x65, 0x41, 0x24, + 0x67, 0x45, 0x42, 0x18, 0x62, 0x01, 0x70, 0x88, 0x03, 0x77, + 0x22, 0x85, 0x77, 0x02, 0x85, 0x03, 0x65, 0x15, 0x57, 0x51, + 0x28, 0x72, 0x53, 0x32, 0x05, 0x58, 0x84, 0x54, 0x03, 0x81, + 0x63, 0x23, 0x38, 0x27, 0x01, 0x85, 0x61, 0x12, 0x28, 0x62, + 0x22, 0x67, 0x56, 0x66, 0x63, 0x08, 0x74, 0x63, 0x21, 0x01, + 0x46, 0x10, 0x08, 0x18, 0x07, 0x86, 0x47, 0x70, 0x50, 0x25, + 0x45, 0x06, 0x55, 0x88, 0x46, 0x11, 0x23, 0x84, 0x70, 0x02, + 0x24, 0x88, 0x52, 0x60, 0x12, 0x72, 0x63, 0x05, 0x81, 0x21, + 0x26, 0x07, 0x64, 0x03, 0x56, 0x48, 0x27, 0x04, 0x38, 0x86, + 0x25, 0x65, 0x21, 0x25, 0x77, 0x21, 0x62, 0x28, 0x82, 0x71, + 0x85, 0x73, 0x78, 0x24, 0x78, 0x51, 0x61, 0x02, 0x81, 0x14, + 0x67, 0x61, 0x08, 0x88, 0x31, 0x77, 0x06, 0x24, 0x45, 0x13, + 0x67, 0x67, 0x54, 0x67, 0x00, 0x12, 0x62, 0x54, 0x11, 0x27, + 0x51, 0x48, 0x07, 0x33, 0x01, 0x24, 0x04, 0x64, 0x11, 0x83, + 0x18, 0x52, 0x55, 0x23, 0x24, 0x58, 0x53, 0x78, 0x30, 0x43, + 0x31, 0x76, 0x62, 0x01, 0x08, 0x73, 0x21, 0x32, 0x12, 0x78, + 0x22, 0x68, 0x33, 0x45, 0x33, 0x73, 0x02, 0x74, 0x21, 0x81, + 0x02, 0x16, 0x54, 0x31, 0x55, 0x76, 0x25, 0x76, 0x41, 0x36, + 0x75, 0x22, 0x78, 0x16, 0x60, 0x48, 0x58, 0x28, 0x83, 0x50, + 0x88, 0x66, 0x72, 0x70, 0x21, 0x21, 0x24, 0x16, 0x62, 0x57, + 0x20, 0x13, 0x80, 0x61, 0x15, 0x45, 0x42, 0x86, 0x00, 0x25, + 0x77, 0x58, 0x84, 0x01, 0x66, 0x16, 0x46, 0x56, 0x68, 0x57, + 0x12, 0x20, 0x75, 0x60, 0x41, 0x85, 0x02, 0x88, 0x12, 0x68, + 0x20, 0x02, 0x41, 0x18, 0x87, 0x13, 0x17, 0x33, 0x74, 0x11, + 0x08, 0x37, 0x47, 0x08, 0x31, 0x67, 0x08, 0x50, 0x61, 0x54, + 0x56, 0x71, 0x63, 0x26, 0x85, 0x22, 0x07, 0x87, 0x71, 0x28, + 0x20, 0x47, 0x48, 0x66, 0x54, 0x38, 0x03, 0x41, 0x38, 0x21, + 0x70, 0x50, 0x66, 0x53, 0x56, 0x70, 0x74, 0x55, 0x70, 0x28, + 0x52, 0x01, 0x42, 0x65, 0x53, 0x73, 0x32, 0x33, 0x67, 0x42, + 0x67, 0x85, 0x18, 0x45, 0x12, 0x37, 0x58, 0x82, 0x13, 0x73, + 0x78, 0x77, 0x03, 0x42, 0x04, 0x65, 0x55, 0x66, 0x07, 0x25, + 0x07, 0x37, 0x40, 0x78, 0x66, 0x71, 0x11, 0x21, 0x43, 0x25, + 0x87, 0x40, 0x58, 0x63, 0x33, 0x43, 0x52, 0x10, 0x31, 0x53, + 0x56, 0x48, 0x05, 0x55, 0x77, 0x77, 0x26, 0x87, 0x28, 0x43, + 0x61, 0x46, 0x11, 0x76, 0x82, 0x50, 0x42, 0x04, 0x32, 0x88, + 0x18, 0x66, 0x16, 0x36, 0x64, 0x41, 0x38, 0x17, 0x55, 0x43, + 0x06, 0x25, 0x80, 0x27, 0x21, 0x16, 0x81, 0x22, 0x64, 0x60, + 0x38, 0x16, 0x82, 0x40, 0x72, 0x34, 0x73, 0x52, 0x61, 0x85, + 0x11, 0x16, 0x00, 0x25, 0x03, 0x30, 0x06, 0x80, 0x21, 0x56, + 0x64, 0x52, 0x23, 0x26, 0x37, 0x75, 0x73, 0x65, 0x53, 0x27, + 0x37, 0x47, 0x56, 0x76, 0x80, 0x38, 0x53, 0x62, 0x14, 0x24, + 0x64, 0x03, 0x66, 0x21, 0x72, 0x16, 0x36, 0x34, 0x11, 0x65, + 0x61, 0x62, 0x86, 0x02, 0x83, 0x27, 0x80, 0x82, 0x70, 0x72, + 0x52, 0x60, 0x20, 0x87, 0x58, 0x58, 0x14, 0x38, 0x47, 0x03, + 0x10, 0x72, 0x60, 0x48, 0x02, 0x01, 0x17, 0x21, 0x61, 0x62, + 0x38, 0x64, 0x27, 0x53, 0x57, 0x13, 0x68, 0x18, 0x26, 0x62, + 0x43, 0x42, 0x21, 0x85, 0x70, 0x23, 0x58, 0x13, 0x72, 0x04, + 0x04, 0x08, 0x05, 0x82, 0x26, 0x18, 0x82, 0x47, 0x87, 0x71, + 0x32, 0x28, 0x68, 0x25, 0x87, 0x24, 0x06, 0x74, 0x41, 0x44, + 0x08, 0x64, 0x68, 0x30, 0x24, 0x44, 0x21, 0x73, 0x03, 0x45, + 0x70, 0x41, 0x06, 0x78, 0x38, 0x33, 0x88, 0x13, 0x31, 0x14, + 0x18, 0x17, 0x45, 0x06, 0x26, 0x67, 0x66, 0x73, 0x82, 0x56, + 0x66, 0x88, 0x70, 0x22, 0x55, 0x47, 0x27, 0x50, 0x86, 0x55, + 0x53, 0x00, 0x28, 0x55, 0x40, 0x62, 0xe9, 0x37, 0x65, 0xe1, + 0x30, 0x48, 0x6b, 0x35, 0x76, 0x96, 0x05, 0x21, 0xce, 0xed, + 0x46, 0xae, 0x7e, 0x6d, 0xc9, 0xf1, 0xc9, 0xb3, 0x7a, 0xa7, + 0xde, 0xa7, 0x62, 0x18, 0x11, 0xc0, 0xd8, 0xd0, 0x17, 0x0f, + 0x38, 0xaf, 0x0e, 0x3d, 0xaf, 0xe6, 0x63, 0xb0, 0xc4, 0x68, + 0x4e, 0x29, 0xa4, 0xf4, 0x20, 0x22, 0xbc, 0x82, 0x15, 0x1d, + 0x08, 0x39, 0x18, 0xfe, 0x69, 0x55, 0x06, 0x3d, 0xf4, 0xa3, + 0xe7, 0x29, 0x23, 0xa4, 0xd9, 0xa4, 0x22, 0x06, 0x2d, 0x5f, + 0x22, 0xb3, 0x9b, 0x1c, 0xb6, 0x3e, 0xf3, 0xf4, 0x8a, 0xb3, + 0x35, 0x18, 0x4c, 0x1f, 0xaf, 0xd4, 0xcf, 0x5b, 0x9b, 0xa7, + 0xf8, 0xd2, 0x86, 0x71, 0x8e, 0x64, 0x96, 0xd1, 0x6e, 0xad, + 0xd2, 0x7e, 0x16, 0x5b, 0x38, 0x91, 0x0e, 0x40, 0xaa, 0x07, + 0x6a, 0x63, 0x2a, 0xc0, 0x5b, 0x14, 0x79, 0x52, 0xcb, 0x23, + 0x6e, 0x76, 0x95, 0xd0, 0x90, 0x6c, 0x18, 0xe7, 0x89, 0xee, + 0xb9, 0x7f, 0x33, 0x08, 0x35, 0x8f, 0xa3, 0xaa, 0xaa, 0x10, + 0x2f, 0x8b, 0xc9, 0x6c, 0x1d, 0x95, 0xb5, 0xb8, 0x54, 0x0d, + 0x67, 0x86, 0xd4, 0x5d, 0xae, 0x8f, 0x33, 0x20, 0xe2, 0x35, + 0xda, 0x71, 0x53, 0x24, 0xad, 0x16, 0x84, 0x2e, 0x98, 0xcd, + 0x00, 0xa2, 0x69, 0x6a, 0x12, 0x9a, 0x86, 0xf3, 0x9f, 0x18, + 0x6c, 0x9f, 0x24, 0xbe, 0xb3, 0xf4, 0x90, 0xb3, 0xc4, 0xa4, + 0x8b, 0xce, 0x88, 0x60, 0xa0, 0x91, 0xb8, 0x9a, 0x52, 0xe5, + 0xfe, 0x16, 0x6d, 0xff, 0xb3, 0xdc, 0x50, 0x79, 0xfe, 0x31, + 0x24, 0xd4, 0x59, 0x5f, 0xf9, 0xb4, 0x70, 0x0b, 0x15, 0x93, + 0xd9, 0xe9, 0x92, 0xb6, 0xf5, 0x80, 0x34, 0x63, 0x66, 0x78, + 0xcf, 0xa9, 0xce, 0x48, 0xbf, 0xbe, 0x9e, 0xfa, 0xdd, 0x7d, + 0xf4, 0x16, 0xe2, 0xd2, 0x98, 0x13, 0xe2, 0x76, 0xdd, 0x0a, + 0xc7, 0x2d, 0xe8, 0x88, 0x8e, 0x1a, 0xc0, 0xfc, 0xe8, 0x35, + 0xaf, 0x5d, 0xe2, 0x4c, 0x96, 0x82, 0x4c, 0xe5, 0x89, 0x14, + 0xb8, 0x27, 0x39, 0xb5, 0x55, 0xc5, 0xa5, 0x8a, 0x01, 0xcc, + 0xfd, 0xbd, 0xa9, 0xec, 0xae, 0xc0, 0xe7, 0xd7, 0xf8, 0x11, + 0x84, 0x35, 0x99, 0x26, 0xb6, 0xc6, 0xf7, 0x35, 0xe0, 0x93, + 0xd8, 0xd7, 0xbf, 0xc0, 0xc8, 0x44, 0xfd, 0x46, 0xf5, 0xb7, + 0xc5, 0x5a, 0x75, 0xd3, 0xc7, 0xfa, 0xf4, 0xe1, 0xc0, 0x84, + 0x5e, 0x31, 0xfe, 0x69, 0x80, 0x5a, 0xe5, 0x4b, 0x9b, 0x5b, + 0xa4, 0x5c, 0x23, 0xaa, 0x85, 0xc9, 0x9a, 0xbd, 0x71, 0x49, + 0x11, 0x30, 0x8b, 0x81, 0xa1, 0xdd, 0xf8, 0xb8, 0x74, 0x91, + 0xe7, 0xf7, 0x82, 0x42, 0x70, 0x22, 0x95, 0xf0, 0xcc, 0x9f, + 0x02, 0x33, 0x0f, 0x08, 0x3b, 0x04, 0x31, 0xd7, 0x4f, 0x86, + 0x78, 0x49, 0xb9, 0x90, 0xf5, 0x8f, 0xec, 0x12, 0x84, 0x52, + 0x03, 0x1f, 0x64, 0x5e, 0xf0, 0x2a, 0xeb, 0x87, 0xa5, 0xec, + 0x95, 0x25, 0x64, 0x25, 0x49, 0x3b, 0x3c, 0x30, 0xed, 0x3b, + 0xe9, 0x36, 0xfd, 0xae, 0xa6, 0x26, 0xd3, 0x45, 0xbc, 0x1b, + 0x78, 0x5f, 0xce, 0x27, 0x45, 0x1c, 0xd5, 0xf9, 0xa7, 0xda, + 0x62, 0xe6, 0x7e, 0xd3, 0xbb, 0xd8, 0x0a, 0xfd, 0xf5, 0xa5, + 0x31, 0x09, 0x6e, 0x40, 0xe8, 0xcf, 0xc1, 0x42, 0x8e, 0x2e, + 0x75, 0x65, 0xaa, 0x91, 0x6f, 0xc7, 0x75, 0x3a, 0x1e, 0x40, + 0x99, 0x71, 0x5e, 0x00, 0xae, 0x07, 0xad, 0x43, 0x49, 0xdd, + 0x6d, 0x36, 0xe3, 0xa8, 0xdf, 0x2c, 0x39, 0xa2, 0x57, 0xd7, + 0x93, 0xa1, 0x16, 0x80, 0x89, 0xa6, 0x56, 0x69, 0x75, 0xea, + 0xb8, 0xb2, 0x43, 0x0c, 0xdf, 0x46, 0x05, 0x9a, 0x39, 0x08, + 0x3b, 0xb6, 0x76, 0xe3, 0x5b, 0x98, 0x5b, 0x48, 0xc0, 0x11, + 0x14, 0x6f, 0xcd, 0xb7, 0xaa, 0x08, 0x1e, 0x53, 0x9b, 0x94, + 0x9d, 0xa2, 0xe6, 0x99, 0xcb, 0x1c, 0xb4, 0xbf, 0x55, 0x84, + 0x12, 0xc9, 0xf1, 0xf0, 0x94, 0xd9, 0x7d, 0x61, 0xa9, 0xe7, + 0xe6, 0xc1, 0xe2, 0xca, 0x6b, 0x36, 0x80, 0x72, 0x31, 0x79, + 0xbf, 0xe7, 0x3e, 0x99, 0x9e, 0xd5, 0x59, 0xd4, 0x97, 0x14, + 0xd5, 0xfa, 0x93, 0x37, 0x8a, 0x65, 0xa5, 0xb6, 0x4e, 0xba, + 0xb3, 0x84, 0xf2, 0xc1, 0x55, 0xb6, 0x94, 0x31, 0x30, 0xe7, + 0xb2, 0x71, 0x4e, 0xc6, 0x21, 0x50, 0xf3, 0xcf, 0x7c, 0xbc, + 0x26, 0xb7, 0x20, 0xcb, 0x2d, 0x9e, 0x55, 0x23, 0x7c, 0xf0, + 0x97, 0x16, 0x57, 0x5b, 0xcc, 0xc5, 0x48, 0xc9, 0xc8, 0xee, + 0x1e, 0x11, 0x6b, 0x72, 0x3b, 0x29, 0x71, 0xa4, 0xed, 0x08, + 0x6c, 0x38, 0xc6, 0x2e, 0x64, 0x3b, 0x16, 0xd8, 0x4d, 0x19, + 0xe8, 0x94, 0xd3, 0xd5, 0xb4, 0x18, 0xb4, 0x03, 0x24, 0x62, + 0xe7, 0x44, 0x5e, 0x09, 0x60, 0xc6, 0xa9, 0xa6, 0xca, 0xbe, + 0x83, 0xe5, 0xf1, 0xbd, 0x04, 0x22, 0x4b, 0x1b, 0x08, 0x0b, + 0xa6, 0x20, 0x95, 0xf2, 0x78, 0x8c, 0x3e, 0x73, 0x03, 0x7b, + 0x75, 0x2c, 0xe5, 0x72, 0xec, 0xc9, 0x25, 0x06, 0x6b, 0x3a, + 0x5e, 0x0e, 0x96, 0xd0, 0xe3, 0x85, 0xb0, 0xb5, 0x6a, 0x83, + 0x40, 0x41, 0x94, 0xce, 0xa1, 0x07, 0x79, 0x07, 0xe2, 0x50, + 0xa4, 0xde, 0x7d, 0x64, 0x2f, 0x7e, 0x43, 0xd5, 0x72, 0xd1, + 0xa7, 0xb9, 0x76, 0xa3, 0xfc, 0x25, 0x33, 0xd7, 0x95, 0xb5, + 0xd9, 0x94, 0x93, 0x55, 0xaf, 0x04, 0x86, 0x4a, 0xfc, 0x2f, + 0x5f, 0x3d, 0x34, 0x86, 0xf2, 0x9a, 0x31, 0x4c, 0xc9, 0xad, + 0x08, 0xa5, 0x03, 0x91, 0x8a, 0x7e, 0x46, 0xc9, 0x44, 0x61, + 0x11, 0x59, 0x4f, 0xbb, 0x70, 0xf9, 0x9d, 0x3e, 0x6d, 0x53, + 0xb4, 0x16, 0x28, 0xd3, 0x67, 0x52, 0x14, 0xad, 0xba, 0xb1, + 0x21, 0xaf, 0x84, 0x18, 0xc9, 0x37, 0x78, 0xb3, 0x78, 0x92, + 0x95, 0xad, 0x1b, 0xc0, 0x70, 0xe7, 0xe9, 0x06, 0x02, 0xed, + 0x6c, 0x99, 0x4e, 0x43, 0xc0, 0xa4, 0x6f, 0x23, 0xa8, 0x02, + 0xc4, 0xbd, 0xc0, 0x16, 0xc4, 0xed, 0xe0, 0xe1, 0x56, 0x06, + 0x3f, 0xf4, 0x77, 0x12, 0x72, 0x52, 0x04, 0xe8, 0xe4, 0x26, + 0xe5, 0x01, 0x47, 0x5b, 0x8a, 0xca, 0x07, 0x3b, 0xc9, 0xb1, + 0x42, 0x8f, 0x7d, 0x64, 0x7d, 0x5d, 0x6a, 0x95, 0xde, 0x4d, + 0x4b, 0xd3, 0xfa, 0xcf, 0xf0, 0x25, 0x27, 0x96, 0x48, 0xb6, + 0xcc, 0x68, 0x29, 0x37, 0x95, 0xcd, 0x36, 0xb7, 0xb0, 0xd6, + 0xf1, 0xfc, 0x4f, 0xe9, 0xa8, 0x6b, 0x9d, 0x75, 0xc7, 0x9b, + 0x19, 0xaf, 0xbb, 0x8a, 0xaf, 0x4b, 0xb8, 0xe2, 0xeb, 0x8d, + 0xd9, 0xf5, 0x75, 0xc5, 0xc8, 0x0b, 0xf2, 0x1c, 0xf9, 0x9e, + 0xc7, 0x4d, 0x7c, 0x71, 0x47, 0xbd, 0x57, 0x7e, 0xe6, 0x59, + 0xca, 0x8c, 0xf2, 0x0c, 0x47, 0x4a, 0x90, 0xa7, 0xf5, 0xb8, + 0xb2, 0x43, 0x97, 0xdb, 0xbe, 0x76, 0x37, 0x29, 0x36, 0x40, + 0xaa, 0x7a, 0x81, 0xf0, 0xa0, 0xd0, 0x81, 0x39, 0x88, 0xf0, + 0x23, 0xb0, 0xa4, 0xbe, 0x5e, 0xd8, 0x33, 0x98, 0x5d, 0x9d, + 0xb5, 0xd4, 0x1c, 0x00, 0xe2, 0x30, 0xb8, 0x68, 0x58, 0x65, + 0x30, 0x94, 0x3d, 0xf2, 0x75, 0x0c, 0x8e, 0x3b, 0xee, 0x9b, + 0xce, 0x6c, 0x67, 0x68, 0x54, 0x86, 0x7d, 0x27, 0x2a, 0x2f, + 0xf7, 0x25, 0xff, 0x22, 0x1e, 0x74, 0xbd, 0x72, 0x11, 0xf4, + 0x47, 0x8e, 0x2f, 0x0d, 0xb9, 0x31, 0xac, 0x5c, 0x1d, 0xa0, + 0x11, 0xea, 0x16, 0x24, 0x86, 0x76, 0xbd, 0xa3, 0x41, 0x7f, + 0x00, 0xe6, 0xe2, 0x86, 0x93, 0xff, 0x02, 0x07, 0xce, 0x49, + 0xe4, 0xaf, 0x00, 0x9b, 0x15, 0xa6, 0x05, 0xf7, 0x54, 0xd1, + 0xbb, 0xa7, 0x09, 0x67, 0xe6, 0x99, 0xf9, 0x23, 0xe6, 0xaa, + 0x6f, 0xcb, 0xe1, 0xc1, 0xac, 0x7b, 0x98, 0xa9, 0x14, 0x43, + 0x55, 0x22, 0x2c, 0x7a, 0x4a, 0x4a, 0x63, 0xc1, 0xfe, 0x5c, + 0xca, 0xf4, 0x91, 0x3b, 0x6f, 0xf8, 0x7e, 0x2a, 0xa1, 0x4a, + 0xc3, 0x16, 0x1c, 0x1d, 0x53, 0x7d, 0x0e, 0x77, 0x0d, 0x72, + 0x07, 0x78, 0xea, 0xce, 0xe4, 0x0c, 0xf7, 0xce, 0xa0, 0xef, + 0xa1, 0xdb, 0x6b, 0x5f, 0xfd, 0xeb, 0x68, 0xc7, 0x76, 0xfd, + 0x35, 0xd2, 0xcb, 0xa4, 0xf6, 0xe6, 0x6b, 0xdb, 0xe9, 0xd5, + 0x1e, 0x05, 0x8a, 0xba, 0xed, 0x77, 0x94, 0x36, 0x6c, 0x3c, + 0xe2, 0x23, 0xf8, 0x84, 0xa1, 0xe3, 0xcd, 0xfa, 0x1d, 0x31, + 0x52, 0x4d, 0xbc, 0x16, 0x31, 0x92, 0xd7, 0xbe, 0x2e, 0xd6, + 0x6d, 0x1d, 0x58, 0x4e, 0xd8, 0x06, 0x8f, 0xb3, 0xe6, 0x79, + 0x60, 0x92, 0x71, 0x1f, 0x72, 0x84, 0x55, 0x7b, 0xfa, 0xc8, + 0xcf, 0x20, 0x16, 0x2f, 0xc7, 0x13, 0x17, 0xd1, 0x2d, 0xd1, + 0x0d, 0x84, 0x48, 0x08, 0x69, 0xd1, 0x55, 0xb1, 0x08, 0xb6, + 0x17, 0x8c, 0x38, 0x31, 0xa4, 0x77, 0x73, 0xc0, 0xe9, 0xfc, + 0x5f, 0x8e, 0xb3, 0x74, 0x1f, 0xab, 0xcf, 0xf5, 0x26, 0x26, + 0x20, 0x80, 0xd8, 0x13, 0x42, 0xcf, 0xc7, 0x9d, 0xd6, 0x5b, + 0x1a, 0xfd, 0x46, 0x83, 0xba, 0xc1, 0xe5, 0x92, 0xe9, 0x27, + 0xa8, 0xa0, 0x36, 0xd5, 0x31, 0x75, 0x7b, 0x8f, 0x53, 0xf6, + 0xbd, 0x08, 0x1a, 0x86, 0x81, 0x83, 0x85, 0x07, 0x44, 0x3e, + 0xf9, 0x72, 0x47, 0xe0, 0xf1, 0xbe, 0x43, 0x6a, 0xc3, 0x00, + 0x94, 0xd3, 0x19, 0x81, 0xde, 0xf3, 0xfd, 0x57, 0x98, 0xdc, + 0x57, 0xfe, 0x9f, 0x4b, 0x38, 0x23, 0xad, 0xa8, 0xd4, 0x07, + 0x07, 0x5c, 0xca, 0x25, 0xb8, 0x77, 0x7e, 0x45, 0x01, 0x9b, + 0xd4, 0x45, 0x5b, 0x94, 0x47, 0x18, 0x35, 0x66, 0xad, 0x0a, + 0x97, 0x06, 0xc6, 0xa7, 0xaa, 0x50, 0xbf, 0x07, 0x90, 0xfe, + 0x50, 0x8d, 0xd9, 0x1f, 0xdd, 0x33, 0xa4, 0xa7, 0x23, 0x48, + 0xa3, 0xd6, 0x5d, 0xb8, 0x9e, 0x97, 0x22, 0x32, 0xd3, 0x8a, + 0xb0, 0x5e, 0xb3, 0xc9, 0x0b, 0x24, 0x09, 0x66, 0x2e, 0xea, + 0x94, 0x9c, 0x90, 0x4f, 0x3e, 0x93, 0xcf, 0x30, 0x3f, 0xb4, + 0xbe, 0x5e, 0x6c, 0xaf, 0x1a, 0xff, 0x00, 0xc7, 0x74, 0x2e, + 0x8b, 0x08, 0xe9, 0x22, 0x61, 0xc5, 0xd1, 0x21, 0x15, 0xa1, + 0xba, 0x37, 0xd2, 0x24, 0xfd, 0xa5, 0x63, 0x9a, 0x97, 0xfa, + 0xfe, 0xb2, 0xa5, 0x1b, 0x3b, 0xbd, 0xb7, 0xb3, 0x2f, 0x3d, + 0xf1, 0x5a, 0xf2, 0xf6, 0xe4, 0x12, 0xe4, 0x3a, 0x26, 0x3c, + 0x21, 0x5c, 0xd6, 0x83, 0x65, 0x26, 0x86, 0xcc, 0x47, 0x84, + 0xd7, 0x26, 0x31, 0x31, 0xcf, 0x1d, 0xd6, 0xc4, 0xa4, 0xf2, + 0xd4, 0x25, 0x54, 0x2b, 0x81, 0x00, 0x1d, 0xd8, 0xdf, 0x04, + 0xb8, 0x4b, 0xcf, 0xe5, 0x16, 0xf4, 0x4a, 0x17, 0xc5, 0xd8, + 0xd3, 0xdf, 0xe4, 0xb7, 0xd3, 0x98, 0xb6, 0x73, 0xa0, 0x37, + 0x67, 0xbb, 0x8b, 0xc3, 0xfc, 0xac, 0x6e, 0x6c, 0x0e, 0x5d, + 0x44, 0xb0, 0x9d, 0xf8, 0xae, 0x17, 0x9b, 0xf9, 0xcb, 0xe8, + 0xfe, 0xc1, 0x7b, 0x78, 0x16, 0xf6, 0x74, 0x04, 0x7d, 0x38, + 0x17, 0x36, 0x09, 0xe3, 0x73, 0xa1, 0x76, 0x78, 0x7c, 0x14, + 0xb3, 0x83, 0x91, 0x59, 0x27, 0xea, 0x8c, 0x69, 0xe6, 0xa5, + 0x21, 0xcd, 0x78, 0xc7, 0x26, 0xa2, 0xfb, 0xd4, 0xf3, 0xaf, + 0x3f, 0xcf, 0x51, 0x10, 0xcc, 0x4b, 0xdd, 0x14, 0xf4, 0xf3, + 0xb8, 0xea, 0x07, 0xa7, 0x76, 0xe7, 0xbe, 0xec, 0x01, 0xb5, + 0x1e, 0xdc, 0xc3, 0x55, 0x19, 0xb1, 0x16, 0x3f, 0xfe, 0xd4, + 0x15, 0x49, 0xaf, 0x04, 0x9d, 0x38, 0xdd, 0x86, 0x53, 0x2a, + 0x80, 0x62, 0x42, 0xb7, 0x98, 0x42, 0x38, 0xaf, 0x9d, 0x87, + 0xe2, 0x3f, 0xea, 0x7e, 0x0a, 0x35, 0xb8, 0xee, 0xa5, 0x48, + 0x09, 0x08, 0xc5, 0x0d, 0xae, 0x01, 0xd5, 0xec, 0x43, 0x29, + 0x3b, 0xfb, 0x78, 0xc4, 0x96, 0x01, 0x1c, 0x21, 0xf2, 0xc9, + 0x44, 0x68, 0x24, 0x66, 0x86, 0x96, 0xb8, 0xc8, 0xe9, 0xd0, + 0x38, 0x0e, 0x96, 0x4d, 0xcc, 0x45, 0xab, 0xe1, 0xca, 0x50, + 0x10, 0x20, 0x01, 0xbe, 0x89, 0xc0, 0x43, 0x84, 0xd8, 0x38, + 0x52, 0xc0, 0xaf, 0x4d, 0x6b, 0x99, 0x0b, 0xc0, 0xc2, 0x99, + 0x07, 0xc6, 0x78, 0xa8, 0xf7, 0x32, 0x84, 0x86, 0xc5, 0x1a, + 0x95, 0x81, 0xa6, 0x6a, 0x05, 0xa7, 0x9d, 0x81, 0x0e, 0x32, + 0x18, 0x11, 0x4a, 0x0f, 0xfc, 0x17, 0x9e, 0xf7, 0xbf, 0x54, + 0x82, 0xed, 0xba, 0x6f, 0xbd, 0x41, 0xc1, 0xca, 0x55, 0x6c, + 0xff, 0x32, 0x6b, 0xa2, 0x59, 0xae, 0xae, 0x92, 0xc1, 0xb5, + 0xa6, 0xfc, 0xaf, 0x09, 0x48, 0x57, 0xd6, 0xee, 0x38, 0x99, + 0xb4, 0xe3, 0x8f, 0xb7, 0xfc, 0x6a, 0x0a, 0x3b, 0x08, 0xe1, + 0x81, 0x46, 0x11, 0xeb, 0x4a, 0x98, 0x43, 0x16, 0x16, 0x1f, + 0x68, 0xdb, 0xb9, 0x71, 0x19, 0xfe, 0x8b, 0xe6, 0xb7, 0x8b, + 0xc1, 0x3b, 0x90, 0xc5, 0x89, 0x1d, 0xca, 0xd9, 0x19, 0x6c, + 0xe8, 0x01, 0xf4, 0x19, 0x50, 0x3e, 0x93, 0x84, 0xbf, 0xaa, + 0x9a, 0x3d, 0x20, 0x4c, 0x4e, 0x79, 0x83, 0xec, 0x46, 0x83, + 0x09, 0x00, 0xc3, 0x8a, 0xad, 0xd5, 0x2b, 0x08, 0xd1, 0x47, + 0xac, 0x96, 0x0e, 0x34, 0xf0, 0x89, 0x1a, 0x0f, 0xf2, 0x51, + 0x8d, 0x2c, 0xb5, 0xf2, 0xfe, 0x8c, 0xdc, 0xed, 0x41, 0x51, + 0x8c, 0x71, 0x12, 0x05, 0xec, 0x68, 0x21, 0x86, 0x94, 0xf4, + 0xfb, 0xfc, 0xaa, 0xc7, 0xc7, 0xbb, 0x74, 0xa2, 0x8b, 0x76, + 0x62, 0x1c, 0x64, 0x11, 0xa0, 0xd0, 0x5f, 0x46, 0x64, 0xd4, + 0x47, 0xbc, 0x8a, 0x5b, 0x2b, 0xc2, 0xc1, 0x88, 0xb2, 0x30, + 0xbd, 0x02, 0x17, 0x18, 0x0a, 0xd7, 0x9b, 0x3d, 0x91, 0xb9, + 0x2c, 0x83, 0x24, 0xb4, 0x8b, 0x9d, 0x02, 0xaf, 0xb2, 0x4e, + 0x57, 0xe1, 0xb0, 0xa2, 0xf3, 0x7c, 0xde, 0x15, 0xba, 0x60, + 0xbd, 0x80, 0xbe, 0x6d, 0x6f, 0x16, 0xb3, 0xb9, 0xb8, 0x6a, + 0x55, 0xb4, 0xad, 0xf1, 0x01, 0x63, 0x40, 0x01, 0xba, 0x5b, + 0x5d, 0x9a, 0xbc, 0xf0, 0x58, 0xa8, 0xf7, 0xbb, 0x8e, 0x91, + 0xa0, 0xfd, 0x8c, 0x49, 0x8f, 0x1a, 0xbb, 0x2a, 0x28, 0x0d, + 0x7a, 0xa6, 0xc2, 0xd7, 0x41, 0x16, 0xed, 0x61, 0x5d, 0xc4, + 0xe7, 0xcf, 0x2b, 0xb4, 0xb9, 0x10, 0x6f, 0x38, 0x42, 0x88, + 0x94, 0x6e, 0x75, 0x2c, 0x89, 0xac, 0xa0, 0xe9, 0x81, 0xec, + 0x2d, 0x62, 0xa3, 0xba, 0x3c, 0x40, 0xdb, 0x65, 0x56, 0x8e, + 0xc7, 0xd8, 0xb0, 0xd4, 0xf9, 0x04, 0x2b, 0x4c, 0x83, 0x20, + 0xbe, 0xad, 0xb8, 0x66, 0x1c, 0x20, 0x32, 0xb3, 0xf6, 0xf1, + 0xac, 0xa5, 0x8a, 0x72, 0x9a, 0x41, 0x1d, 0x6e, 0xa0, 0x16, + 0xe0, 0x0c, 0x39, 0xb6, 0x06, 0x96, 0x55, 0xb7, 0xda, 0x1c, + 0x54, 0x08, 0xf6, 0x30, 0x1b, 0xb6, 0x57, 0xca, 0x7d, 0xb0, + 0xdc, 0x9e, 0xfa, 0x5c, 0x38, 0x7f, 0xac, 0x37, 0x80, 0x26, + 0xba, 0xdc, 0x7a, 0x95, 0xe5, 0x7b, 0x90, 0xf3, 0x1a, 0xc7, + 0x31, 0x8e, 0x97, 0x07, 0x9a, 0xb8, 0xbe, 0xae, 0x16, 0x11, + 0x44, 0xb0, 0x01, 0xf5, 0xe8, 0x37, 0x1a, 0x67, 0xfe, 0x00, + 0x8f, 0xa1, 0xf5, 0x03, 0x7c, 0xed, 0xbf, 0x42, 0xf4, 0x78, + 0x2b, 0xfb, 0x9f, 0x8c, 0xb3, 0x63, 0x0b, 0x42, 0xbf, 0xae, + 0x8e, 0xf7, 0x6f, 0xb4, 0xb1, 0xe8, 0x75, 0x8c, 0xdf, 0x69, + 0xc6, 0xe1, 0x3a, 0x26, 0x05, 0x47, 0x03, 0x61, 0xfc, 0xc5, + 0xa9, 0xc1, 0x4f, 0x70, 0xce, 0x18, 0xbb, 0x01, 0xe6, 0x11, + 0xc9, 0xa7, 0x7e, 0x65, 0xb8, 0xdc, 0x61, 0x3d, 0x9b, 0x47, + 0x2e, 0x34, 0x16, 0xa1, 0x73, 0x61, 0x91, 0xed, 0x45, 0xe3, + 0x01, 0x26, 0xee, 0x16, 0x76, 0x0e, 0xb7, 0xa1, 0xc0, 0xb3, + 0xac, 0xf0, 0xa5, 0x3b, 0xf6, 0x64, 0x1b, 0x93, 0x94, 0x5c, + 0x8f, 0x4c, 0x25, 0x89, 0xa1, 0x92, 0x32, 0x50, 0x28, 0x03, + 0x8b, 0xff, 0xc4, 0xf6, 0x2a, 0xe8, 0xda, 0x8d, 0xfe, 0x49, + 0xb5, 0x33, 0x01, 0xca, 0x2d, 0x2d, 0x60, 0x33, 0xd6, 0x30, + 0x38, 0x8a, 0x1e, 0x38, 0x3d, 0x78, 0x11, 0xff, 0xef, 0x1c, + 0x82, 0x33, 0xbb, 0xfc, 0x95, 0xef, 0x79, 0xb0, 0x59, 0xbd, + 0x2c, 0xfd, 0x1c, 0x3f, 0x42, 0xda, 0xdf, 0xbd, 0x56, 0xf2, + 0xd6, 0xae, 0x2d, 0x23, 0x36, 0xed, 0xb1, 0x8d, 0x62, 0x58, + 0x71, 0x66, 0x21, 0xe0, 0x4d, 0xee, 0xf4, 0x16, 0x48, 0xa6, + 0xcf, 0x1a, 0x8a, 0xf0, 0x8a, 0xd1, 0x53, 0xf6, 0xe5, 0x4e, + 0x98, 0x9d, 0x7d, 0x6c, 0xd2, 0xdf, 0xb8, 0x2d, 0xa6, 0xe5, + 0x8a, 0xd6, 0xb5, 0xae, 0x61, 0x96, 0xfa, 0x6b, 0xca, 0x7f, + 0x08, 0xc2, 0x2b, 0x67, 0x30, 0x5e, 0x21, 0x3b, 0xa4, 0x84, + 0x95, 0xc6, 0x2f, 0x2c, 0x1f, 0xe2, 0x0e, 0x1a, 0xc3, 0x89, + 0x6a, 0x6a, 0xe7, 0x08, 0xf9, 0x74, 0xee, 0x4f, 0xcd, 0x5e, + 0xe8, 0xce, 0x55, 0x4d, 0x38, 0xed, 0x62, 0x35, 0xee, 0xfc, + 0x14, 0x56, 0xb9, 0xf0, 0xce, 0x29, 0x1c, 0x21, 0x40, 0x51, + 0xe4, 0x76, 0xe3, 0xa6, 0xd8, 0x3d, 0x54, 0x58, 0x51, 0xe5, + 0xf0, 0xdc, 0x50, 0x39, 0x43, 0x67, 0x44, 0x14, 0xcc, 0x6e, + 0x5a, 0xb1, 0x15, 0xec, 0xb4, 0x3e, 0x0e, 0xef, 0x8e, 0x72, + 0x6a, 0xdf, 0xba, 0x37, 0x27, 0x15, 0x62, 0xc3, 0xbd, 0xee, + 0x1d, 0xb1, 0x24, 0x2f, 0x57, 0x51, 0xf1, 0x8f, 0xfb, 0xd1, + 0x10, 0x6f, 0x11, 0xb9, 0x94, 0x5c, 0x9c, 0x12, 0x26, 0x46, + 0x46, 0x7b, 0x31, 0x0e, 0xad, 0x93, 0xe4, 0x4f, 0x09, 0xe3, + 0xbf, 0xc5, 0xe3, 0x11, 0xa4, 0x25, 0x8d, 0x9b, 0x8e, 0x26, + 0x02, 0xaa, 0x72, 0x18, 0xce, 0x89, 0x67, 0xfc, 0x1c, 0x28, + 0xab, 0x11, 0x5a, 0x84, 0x23, 0x7c, 0x91, 0xac, 0x6b, 0x48, + 0x9c, 0x39, 0x14, 0xa3, 0xac, 0xc6, 0x30, 0xbc, 0x1e, 0x0c, + 0xd3, 0x34, 0x19, 0xa9, 0x2b, 0xe7, 0xa4, 0xf8, 0xc1, 0xf0, + 0x3c, 0x60, 0xa2, 0xf7, 0x51, 0x86, 0xcf, 0x42, 0xad, 0x34, + 0x81, 0xa6, 0x93, 0x0b, 0x88, 0x4c, 0xbf, 0xd2, 0x4f, 0xe0, + 0xdb, 0xb2, 0x1d, 0x6d, 0xb2, 0x5c, 0xac, 0xd8, 0x64, 0x85, + 0xc3, 0x35, 0x6e, 0x5d, 0xaf, 0x63, 0x3e, 0x47, 0xb7, 0x5d, + 0x39, 0x21, 0x36, 0xa6, 0xd4, 0xef, 0x9e, 0x1c, 0x1f, 0xd6, + 0xa4, 0xe0, 0xe4, 0x22, 0x75, 0x1e, 0xeb, 0x15, 0xb4, 0xee, + 0x43, 0x37, 0x06, 0xf9, 0x77, 0xbf, 0x68, 0x9b, 0x9a, 0x7f, + 0x38, 0x30, 0x87, 0xde, 0x0c, 0x6a, 0x39, 0x41, 0xe1, 0xed, + 0xf4, 0x18, 0x6e, 0x29, 0x44, 0xf0, 0xfc, 0xb6, 0x09, 0x5b, + 0xb3, 0x30, 0xc9, 0x0a, 0x8c, 0x41, 0x6f, 0x1e, 0x95, 0xbe, + 0x93, 0x3c, 0x11, 0x9b, 0x24, 0xf7, 0x57, 0xb8, 0xc5, 0x9b, + 0x08, 0xaa, 0xcd, 0x24, 0x86, 0x98, 0x59, 0x0f, 0xc6, 0x0e, + 0xd2, 0x71, 0xb2, 0x5e, 0xae, 0x72, 0xc9, 0x69, 0x3b, 0x80, + 0xc2, 0x27, }; static const int sizeof_bench_dilithium_level3_key = sizeof(bench_dilithium_level3_key); -/* certs/dilithium/bench_dilithium_level5_key.der */ -static const unsigned char bench_dilithium_level5_key[] = -{ - 0x30, 0x82, 0x1D, 0x3A, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, - 0x0B, 0x2B, 0x06, 0x01, 0x04, 0x01, 0x02, 0x82, 0x0B, 0x07, - 0x08, 0x07, 0x04, 0x82, 0x1D, 0x24, 0x04, 0x82, 0x1D, 0x20, - 0x0A, 0xDB, 0x85, 0x3A, 0x41, 0x2C, 0x30, 0x56, 0x65, 0x04, - 0x0A, 0x20, 0x31, 0x2A, 0xF3, 0x88, 0x4C, 0x38, 0x64, 0x86, - 0x14, 0x06, 0xF5, 0xF0, 0x7F, 0x63, 0xC1, 0x87, 0x24, 0x39, - 0xFB, 0xC0, 0x28, 0x0C, 0xBE, 0x81, 0xF7, 0xCD, 0x25, 0x8B, - 0x86, 0x42, 0xAD, 0x74, 0x54, 0xCB, 0xA4, 0xDA, 0xC7, 0x94, - 0x70, 0xA3, 0x41, 0xDA, 0x1F, 0xD8, 0x4F, 0x94, 0x5C, 0x0B, - 0xA5, 0x35, 0x60, 0xB2, 0x8C, 0x50, 0xED, 0x0B, 0xCB, 0x75, - 0x6F, 0x14, 0x64, 0x48, 0x86, 0x21, 0xBC, 0x4A, 0x4C, 0xC5, - 0x22, 0xBC, 0x2D, 0x28, 0x32, 0x39, 0x13, 0x57, 0xC9, 0xE5, - 0x74, 0xF4, 0xE6, 0x3A, 0xC2, 0xE2, 0x49, 0x24, 0x31, 0x88, - 0x82, 0x08, 0x03, 0x89, 0x6C, 0x8B, 0x84, 0x08, 0x81, 0xC2, - 0x08, 0xDB, 0x44, 0x60, 0xA0, 0xB2, 0x91, 0x88, 0x36, 0x28, - 0x12, 0x89, 0x89, 0x4B, 0xA4, 0x01, 0x62, 0x12, 0x4C, 0x08, - 0x02, 0x44, 0x19, 0x15, 0x64, 0x8B, 0x04, 0x65, 0xE4, 0x14, - 0x06, 0x08, 0xC7, 0x04, 0x5B, 0x28, 0x81, 0x89, 0xC2, 0x70, - 0xD0, 0xB4, 0x71, 0x4C, 0x24, 0x80, 0xA1, 0x28, 0x86, 0xD1, - 0x06, 0x25, 0x13, 0x03, 0x84, 0x8C, 0x18, 0x41, 0x49, 0x34, - 0x09, 0xCB, 0x22, 0x71, 0x0C, 0xA3, 0x90, 0x22, 0x94, 0x51, - 0x58, 0x02, 0x2D, 0x53, 0x30, 0x00, 0xC2, 0x06, 0x42, 0x48, - 0xC4, 0x70, 0x8A, 0x32, 0x89, 0x80, 0x16, 0x06, 0x90, 0x44, - 0x91, 0xCB, 0xC8, 0x71, 0xA2, 0xB6, 0x64, 0xD0, 0x26, 0x0A, - 0x21, 0x05, 0x88, 0x0C, 0xB0, 0x6C, 0x03, 0x49, 0x24, 0x80, - 0x02, 0x11, 0xD1, 0x36, 0x06, 0x84, 0x32, 0x11, 0x81, 0x44, - 0x91, 0x9B, 0xB0, 0x01, 0x91, 0x02, 0x25, 0x44, 0x92, 0x69, - 0x5A, 0x08, 0x6C, 0x90, 0x00, 0x0D, 0x09, 0x17, 0x64, 0x89, - 0xB2, 0x2D, 0x02, 0x06, 0x2C, 0xDC, 0x92, 0x45, 0xE1, 0x34, - 0x31, 0x11, 0x03, 0x2D, 0x00, 0x94, 0x29, 0xCA, 0x34, 0x89, - 0xA3, 0x40, 0x22, 0xC4, 0x30, 0x08, 0x02, 0x33, 0x6E, 0x1C, - 0x85, 0x10, 0xE4, 0x92, 0x30, 0xC4, 0x46, 0x84, 0xE0, 0x26, - 0x28, 0xC3, 0x10, 0x65, 0x51, 0x06, 0x4A, 0x03, 0xC1, 0x11, - 0x48, 0x32, 0x4E, 0x9A, 0xC4, 0x6C, 0x91, 0x38, 0x40, 0xC0, - 0x92, 0x64, 0xE3, 0xA4, 0x85, 0x22, 0x32, 0x52, 0x92, 0x08, - 0x20, 0x82, 0x22, 0x12, 0x49, 0x20, 0x6C, 0x91, 0x06, 0x01, - 0x1B, 0x30, 0x06, 0x12, 0xC3, 0x41, 0x4B, 0x40, 0x42, 0x0B, - 0xA7, 0x01, 0x60, 0x12, 0x89, 0x24, 0x98, 0x30, 0x99, 0xA6, - 0x64, 0x61, 0x26, 0x6A, 0x91, 0xB0, 0x11, 0x03, 0xC2, 0x2D, - 0x41, 0xC8, 0x6D, 0xD8, 0x38, 0x28, 0x4B, 0x98, 0x04, 0x98, - 0x18, 0x09, 0x18, 0xA6, 0x65, 0x81, 0x38, 0x69, 0x5B, 0xC4, - 0x6D, 0x98, 0x26, 0x0D, 0x62, 0xC6, 0x71, 0xC3, 0xC6, 0x4C, - 0xC2, 0x02, 0x46, 0x5B, 0x94, 0x65, 0x09, 0x29, 0x0E, 0xA2, - 0xA2, 0x41, 0xE4, 0x02, 0x69, 0xA3, 0x90, 0x4D, 0x8B, 0xA6, - 0x70, 0xA3, 0x40, 0x85, 0x5C, 0x36, 0x48, 0x22, 0xC5, 0x84, - 0x19, 0x91, 0x25, 0x00, 0xC2, 0x65, 0xC4, 0x46, 0x2E, 0xDC, - 0xB0, 0x51, 0x94, 0x28, 0x01, 0x9B, 0x22, 0x66, 0x01, 0xA8, - 0x90, 0x9A, 0xC4, 0x08, 0xD1, 0x22, 0x41, 0x42, 0x34, 0x62, - 0x60, 0x40, 0x92, 0x93, 0xC8, 0x45, 0xD8, 0x04, 0x20, 0x8A, - 0x30, 0x25, 0xE1, 0x14, 0x40, 0x11, 0x13, 0x00, 0x54, 0x22, - 0x62, 0x50, 0x10, 0x22, 0x03, 0xA9, 0x85, 0x9B, 0x42, 0x4D, - 0x50, 0xB2, 0x41, 0x10, 0x13, 0x48, 0x63, 0x38, 0x68, 0xA1, - 0xB0, 0x0D, 0x1B, 0x88, 0x84, 0x8A, 0x28, 0x51, 0xD4, 0x38, - 0x2A, 0x12, 0x43, 0x61, 0x80, 0x38, 0x32, 0x18, 0xC6, 0x29, - 0x22, 0xB5, 0x21, 0x02, 0x99, 0x28, 0xCC, 0x18, 0x85, 0x83, - 0xB4, 0x8C, 0x81, 0x24, 0x51, 0x10, 0x83, 0x68, 0x1C, 0x47, - 0x71, 0x8C, 0x40, 0x6C, 0x00, 0xB6, 0x0D, 0x88, 0x22, 0x90, - 0x0C, 0xC7, 0x49, 0xC0, 0x82, 0x89, 0xDA, 0x22, 0x4A, 0xC8, - 0x18, 0x08, 0xD1, 0x00, 0x2C, 0xDA, 0x30, 0x49, 0x49, 0xC8, - 0x91, 0x5A, 0x96, 0x64, 0x11, 0x96, 0x20, 0xD2, 0xC4, 0x60, - 0xE0, 0x46, 0x6A, 0x02, 0xB5, 0x21, 0x19, 0xB9, 0x81, 0x23, - 0x00, 0x22, 0x11, 0x37, 0x32, 0x19, 0xA4, 0x0D, 0x51, 0x96, - 0x89, 0x1B, 0x11, 0x11, 0xC3, 0x14, 0x88, 0x4C, 0x96, 0x0C, - 0x01, 0x13, 0x72, 0x83, 0x16, 0x12, 0x24, 0x38, 0x51, 0x40, - 0x34, 0x89, 0xD9, 0x26, 0x01, 0x54, 0x42, 0x8D, 0x00, 0xC1, - 0x85, 0x13, 0x14, 0x84, 0x82, 0x16, 0x25, 0x88, 0xB0, 0x51, - 0x11, 0x80, 0x30, 0x23, 0x25, 0x46, 0x04, 0x27, 0x66, 0x11, - 0x28, 0x30, 0xD4, 0x94, 0x84, 0x10, 0xA0, 0x8C, 0xC1, 0x36, - 0x0C, 0x14, 0x98, 0x28, 0x5B, 0x02, 0x90, 0xD9, 0x90, 0x31, - 0xD3, 0x28, 0x68, 0x23, 0x90, 0x80, 0x24, 0xC7, 0x84, 0xA1, - 0x00, 0x09, 0xC1, 0x36, 0x84, 0x58, 0xB6, 0x28, 0x4A, 0xB0, - 0x69, 0x08, 0x10, 0x51, 0x1C, 0xB6, 0x84, 0x83, 0x84, 0x81, - 0x03, 0x39, 0x90, 0x81, 0x42, 0x12, 0x13, 0xB4, 0x49, 0x0A, - 0x20, 0x09, 0x93, 0x22, 0x42, 0xD4, 0x26, 0x21, 0xA3, 0x32, - 0x89, 0x89, 0x84, 0x81, 0x0B, 0x02, 0x21, 0x64, 0x28, 0x90, - 0x89, 0xB2, 0x29, 0xE1, 0x36, 0x2C, 0x11, 0x30, 0x51, 0x21, - 0x83, 0x2C, 0x04, 0x36, 0x26, 0x61, 0x12, 0x8C, 0x19, 0x43, - 0x52, 0x89, 0x90, 0x88, 0x43, 0xB8, 0x71, 0x0C, 0x43, 0x09, - 0x84, 0x26, 0x6A, 0x50, 0x36, 0x20, 0x00, 0xC3, 0x68, 0x91, - 0x38, 0x0E, 0x12, 0x12, 0x52, 0x82, 0xC4, 0x4D, 0x64, 0x90, - 0x4D, 0x8C, 0x30, 0x22, 0x14, 0x26, 0x6E, 0x10, 0x46, 0x8E, - 0x58, 0x34, 0x46, 0x22, 0x97, 0x68, 0x02, 0x43, 0x61, 0x41, - 0x06, 0x01, 0x88, 0x42, 0x40, 0x08, 0x06, 0x6D, 0x80, 0x42, - 0x22, 0x84, 0x48, 0x89, 0xDB, 0x84, 0x90, 0xC0, 0x22, 0x71, - 0x43, 0x96, 0x45, 0x0A, 0xA3, 0x30, 0x12, 0x28, 0x44, 0x51, - 0x00, 0x52, 0x99, 0xA0, 0x8D, 0xC2, 0x28, 0x00, 0xC8, 0x18, - 0x6E, 0xA2, 0x40, 0x8E, 0x03, 0x47, 0x31, 0x61, 0x22, 0x41, - 0xD3, 0xB4, 0x01, 0x48, 0x14, 0x40, 0x4C, 0x06, 0x0C, 0x41, - 0x06, 0x2A, 0x5B, 0x90, 0x25, 0xCC, 0xC6, 0x41, 0xC3, 0x86, - 0x28, 0x99, 0x26, 0x50, 0x11, 0xC4, 0x8D, 0x8C, 0x30, 0x68, - 0x8C, 0x08, 0x0C, 0x50, 0x38, 0x86, 0xDC, 0x10, 0x92, 0xD4, - 0x18, 0x72, 0x02, 0xA8, 0x2C, 0x42, 0x82, 0x44, 0x53, 0x36, - 0x0E, 0x90, 0x32, 0x49, 0x84, 0x24, 0x09, 0x12, 0xA2, 0x41, - 0x82, 0x10, 0x4D, 0x01, 0xA0, 0x8C, 0x11, 0xB2, 0x80, 0x21, - 0x89, 0x69, 0x24, 0x21, 0x28, 0x02, 0x03, 0x6E, 0x49, 0x32, - 0x0C, 0x08, 0x88, 0x84, 0x91, 0x80, 0x10, 0x0C, 0x33, 0x12, - 0x43, 0x24, 0x8A, 0x82, 0x26, 0x10, 0x60, 0xC6, 0x60, 0x48, - 0xA2, 0x10, 0x12, 0x83, 0x24, 0x0B, 0x03, 0x40, 0xCA, 0x08, - 0x20, 0x99, 0x36, 0x86, 0x5B, 0x24, 0x41, 0x10, 0x87, 0x04, - 0x0C, 0x15, 0x04, 0x14, 0xB2, 0x68, 0x0B, 0x89, 0x29, 0x99, - 0x16, 0x8D, 0x00, 0x42, 0x00, 0x9B, 0x48, 0x44, 0x12, 0x45, - 0x6C, 0x0A, 0x25, 0x92, 0xC0, 0xC4, 0x00, 0x1A, 0xC8, 0x31, - 0x21, 0x26, 0x8A, 0x81, 0xA0, 0x2C, 0x11, 0x85, 0x65, 0x9A, - 0x08, 0x61, 0xD9, 0x22, 0x12, 0xCB, 0x36, 0x71, 0xA2, 0x08, - 0x0A, 0xE4, 0x06, 0x32, 0x19, 0x19, 0x4A, 0x1B, 0x34, 0x45, - 0x51, 0x06, 0x6E, 0x48, 0x02, 0x68, 0x13, 0xB7, 0x10, 0x44, - 0xC8, 0x85, 0x13, 0x81, 0x2C, 0xC4, 0x40, 0x45, 0x42, 0x98, - 0x21, 0x62, 0x18, 0x92, 0x9B, 0x44, 0x25, 0xA1, 0x06, 0x28, - 0x52, 0x82, 0x11, 0x44, 0x24, 0x32, 0x02, 0xC6, 0x80, 0x10, - 0x45, 0x4E, 0x22, 0x93, 0x0D, 0x44, 0x02, 0x68, 0x4A, 0x30, - 0x81, 0xC9, 0x94, 0x85, 0x08, 0x07, 0x08, 0x24, 0x39, 0x64, - 0xD2, 0x08, 0x22, 0xD0, 0xA0, 0x41, 0x81, 0x92, 0x91, 0x8C, - 0x24, 0x6A, 0xCA, 0x36, 0x32, 0x1C, 0x12, 0x45, 0x92, 0x94, - 0x80, 0x82, 0x86, 0x4C, 0xDA, 0xA2, 0x84, 0x98, 0x24, 0x49, - 0x0A, 0x13, 0x90, 0x1B, 0xC3, 0x01, 0x49, 0x28, 0x60, 0x08, - 0x21, 0x92, 0x0B, 0xB0, 0x20, 0x52, 0x90, 0x84, 0x8A, 0x32, - 0x11, 0x50, 0x28, 0x8C, 0x5B, 0x38, 0x2E, 0xDC, 0xB4, 0x08, - 0x12, 0x20, 0x84, 0xD1, 0x12, 0x22, 0x99, 0x08, 0x11, 0x19, - 0x95, 0x10, 0x80, 0x44, 0x6A, 0xE1, 0x12, 0x85, 0xCC, 0xB0, - 0x24, 0x23, 0x15, 0x4C, 0x63, 0x34, 0x68, 0x5C, 0xB6, 0x65, - 0x42, 0xC2, 0x4D, 0x20, 0x95, 0x84, 0x8A, 0x42, 0x00, 0x4C, - 0x24, 0x50, 0x98, 0x02, 0x6C, 0x21, 0x44, 0x84, 0x20, 0x85, - 0x21, 0x80, 0x48, 0x6C, 0x9C, 0x14, 0x86, 0x81, 0x86, 0x91, - 0x1C, 0x09, 0x04, 0xDC, 0xC6, 0x28, 0x09, 0x27, 0x30, 0x4B, - 0x02, 0x64, 0x44, 0x46, 0x30, 0x9C, 0xA2, 0x8C, 0x20, 0x11, - 0x68, 0x11, 0x24, 0x51, 0x0B, 0x02, 0x00, 0xD2, 0x82, 0x4D, - 0xC3, 0x80, 0x71, 0xE0, 0x48, 0x2C, 0x4A, 0x88, 0x50, 0xA0, - 0x20, 0x49, 0x4B, 0xB4, 0x31, 0x08, 0x12, 0x71, 0x90, 0xA2, - 0x89, 0xCA, 0x46, 0x85, 0x91, 0x96, 0x91, 0x8A, 0x30, 0x31, - 0x0B, 0xC2, 0x21, 0x61, 0x10, 0x49, 0x10, 0x99, 0x81, 0x53, - 0x36, 0x0C, 0x23, 0x81, 0x88, 0x62, 0x28, 0x0A, 0x12, 0x43, - 0x70, 0x02, 0xC7, 0x51, 0x14, 0x34, 0x88, 0x23, 0x84, 0x49, - 0x23, 0x86, 0x08, 0x0C, 0x28, 0x28, 0x94, 0xA0, 0x8D, 0x11, - 0x33, 0x60, 0xA3, 0x38, 0x6E, 0xC0, 0x42, 0x2E, 0x52, 0xB4, - 0x40, 0x0A, 0x25, 0x4D, 0x1C, 0x10, 0x2A, 0x9A, 0x96, 0x64, - 0x10, 0xC1, 0x60, 0x8C, 0x46, 0x60, 0x5A, 0x24, 0x89, 0x42, - 0x40, 0x86, 0xD0, 0x34, 0x89, 0x5C, 0x02, 0x02, 0x00, 0x34, - 0x21, 0x00, 0x24, 0x00, 0xA0, 0x20, 0x60, 0x03, 0xA6, 0x40, - 0xDC, 0x30, 0x80, 0x4B, 0xA8, 0x20, 0x0B, 0xA2, 0x24, 0xE2, - 0xB0, 0x89, 0xA2, 0xB2, 0x65, 0xD4, 0xA6, 0x68, 0x20, 0xA3, - 0x04, 0x4C, 0xC2, 0x11, 0x4A, 0x38, 0x24, 0x08, 0x17, 0x4D, - 0xE2, 0xA2, 0x00, 0x02, 0xC8, 0x00, 0x08, 0x00, 0x30, 0xA4, - 0xB6, 0x25, 0x5A, 0x30, 0x01, 0x40, 0x92, 0x4C, 0xC8, 0x44, - 0x92, 0x43, 0xC8, 0x60, 0xA3, 0x86, 0x84, 0x18, 0x04, 0x70, - 0x53, 0xB2, 0x40, 0x4C, 0x04, 0x84, 0x09, 0xC8, 0x48, 0x21, - 0x13, 0x31, 0x04, 0xA5, 0x0D, 0x90, 0x92, 0x88, 0xC1, 0x10, - 0x8D, 0xE0, 0x88, 0x28, 0x0B, 0x06, 0x84, 0x23, 0x22, 0x6C, - 0xDB, 0xB2, 0x05, 0xC8, 0x08, 0x6E, 0x93, 0x86, 0x4C, 0x0C, - 0x37, 0x86, 0xDA, 0x16, 0x51, 0x9B, 0x08, 0x32, 0x00, 0x91, - 0x45, 0xA4, 0x00, 0x2D, 0x14, 0x02, 0x0E, 0x60, 0x90, 0x4C, - 0x23, 0xB4, 0x09, 0x00, 0xA5, 0x81, 0x19, 0x21, 0x32, 0xC2, - 0x00, 0x02, 0x18, 0x10, 0x50, 0x08, 0xA2, 0x6D, 0x20, 0x31, - 0x6A, 0x90, 0x46, 0x90, 0x8B, 0x94, 0x30, 0x21, 0x44, 0x52, - 0x10, 0x19, 0x51, 0x94, 0xC0, 0x29, 0xC8, 0x20, 0x4E, 0x48, - 0xA6, 0x4C, 0x11, 0xC4, 0x64, 0xDC, 0x34, 0x10, 0x48, 0xC4, - 0x84, 0xCA, 0x46, 0x0C, 0x58, 0x12, 0x49, 0x0B, 0x16, 0x00, - 0x20, 0x42, 0x50, 0x04, 0x00, 0x46, 0xF8, 0x68, 0xB1, 0xA7, - 0x5E, 0xA7, 0xE6, 0xCE, 0xF5, 0x88, 0x8A, 0x5F, 0x79, 0xC9, - 0x3A, 0x5F, 0xF2, 0x7F, 0x5A, 0xED, 0xB4, 0xB4, 0x25, 0x44, - 0xD2, 0x7E, 0xED, 0xCE, 0x46, 0x40, 0xAC, 0xC2, 0x53, 0xD0, - 0xD3, 0xE7, 0xF6, 0x1C, 0xFA, 0x23, 0x4A, 0xB0, 0xEA, 0x32, - 0x91, 0xB7, 0xDA, 0x8B, 0x72, 0x35, 0xB7, 0x74, 0xD5, 0x9A, - 0x9B, 0x22, 0x3D, 0x49, 0x08, 0xBA, 0xD1, 0x7D, 0x9F, 0x64, - 0xD5, 0xAD, 0x7A, 0x37, 0xBD, 0x11, 0xD0, 0xA0, 0x7C, 0x53, - 0x05, 0x1A, 0x66, 0x6C, 0x5D, 0x42, 0x45, 0x55, 0x34, 0xC0, - 0x1F, 0xCA, 0xDB, 0x0D, 0x4F, 0x75, 0x95, 0x9F, 0x10, 0x9A, - 0x8D, 0x54, 0xCE, 0xC2, 0x5C, 0xF0, 0xCE, 0xBD, 0x39, 0x70, - 0xB0, 0x52, 0x2E, 0x4B, 0x11, 0x0D, 0x25, 0xD7, 0xE5, 0x4B, - 0xF1, 0xE3, 0x4F, 0xBE, 0xF2, 0x73, 0xA6, 0xDE, 0xB6, 0xC4, - 0x61, 0x71, 0xCC, 0x5C, 0xFE, 0x55, 0xF0, 0x50, 0xBA, 0x9C, - 0x18, 0x44, 0x13, 0xDD, 0xCB, 0x7A, 0xD2, 0xA2, 0xDC, 0xBF, - 0xF2, 0xC8, 0x84, 0xFF, 0x5B, 0xA7, 0xFA, 0x8D, 0x18, 0xF2, - 0x55, 0xD0, 0x3C, 0x4E, 0xB3, 0x77, 0x7C, 0x95, 0x91, 0x98, - 0x52, 0xF2, 0xB6, 0xCF, 0xFC, 0x45, 0xF4, 0x71, 0x62, 0x24, - 0xE2, 0x7B, 0xF7, 0x85, 0x08, 0x17, 0x6A, 0x62, 0xB4, 0xE9, - 0x08, 0x3E, 0xA1, 0xC6, 0x27, 0x8E, 0xB3, 0x26, 0xA5, 0x95, - 0x91, 0x84, 0xD0, 0xA0, 0xCD, 0xBF, 0x45, 0xD0, 0xE2, 0x26, - 0x65, 0x74, 0xD6, 0x49, 0x50, 0xF2, 0x6B, 0xAE, 0xF1, 0x8A, - 0x2A, 0x18, 0xDA, 0xF0, 0xAD, 0xE7, 0xF3, 0x0A, 0x0E, 0x33, - 0xA5, 0xCA, 0x11, 0x16, 0xCC, 0xD6, 0x81, 0x89, 0x83, 0x27, - 0x32, 0x97, 0x61, 0x48, 0x0D, 0x89, 0x3E, 0xB7, 0x7E, 0x02, - 0xC8, 0x96, 0x93, 0xFA, 0xD0, 0x1D, 0x76, 0xB4, 0xA4, 0x38, - 0x4C, 0xE3, 0xB4, 0x6F, 0xCE, 0x66, 0x90, 0x53, 0xDC, 0xCE, - 0xD6, 0x10, 0x16, 0x3E, 0xB8, 0xBD, 0xD9, 0x8C, 0xA9, 0x90, - 0x54, 0xAF, 0x86, 0x07, 0xB3, 0xC1, 0x82, 0xFB, 0x41, 0x61, - 0xB8, 0x6D, 0x8E, 0xA5, 0xA8, 0xEB, 0xE3, 0xC0, 0xCF, 0x51, - 0xAA, 0x94, 0x7A, 0x7F, 0x9C, 0x48, 0xA3, 0x40, 0x83, 0x33, - 0x22, 0x41, 0x61, 0x4C, 0xD4, 0x62, 0xD7, 0xC6, 0xC6, 0x5B, - 0xF3, 0x48, 0x42, 0xA7, 0x18, 0xD5, 0xAF, 0x05, 0xF6, 0x7A, - 0xF6, 0x6D, 0x82, 0xFF, 0x89, 0x68, 0x21, 0x13, 0x62, 0xA5, - 0x7E, 0xC9, 0x43, 0x03, 0x73, 0xF7, 0xD1, 0x01, 0x7D, 0xD9, - 0x13, 0x03, 0x9C, 0x99, 0x74, 0xD4, 0x92, 0x2E, 0xD1, 0xD3, - 0xCB, 0x53, 0x6C, 0xF9, 0xFE, 0xB4, 0x3D, 0x51, 0xF1, 0x63, - 0x42, 0x5B, 0xB2, 0x5D, 0x70, 0x03, 0xE5, 0x46, 0x5B, 0xC1, - 0xEB, 0x27, 0x11, 0x22, 0x15, 0x73, 0x6C, 0xF8, 0x51, 0x0A, - 0xFF, 0xD8, 0xFE, 0xB6, 0xE1, 0xBD, 0x42, 0xC0, 0x4C, 0xEB, - 0xCD, 0x1E, 0x3C, 0xD5, 0x7C, 0xEA, 0xC6, 0xD4, 0x34, 0xD2, - 0x8D, 0x99, 0xC4, 0x99, 0xA8, 0x8E, 0x9F, 0x60, 0xA8, 0xE8, - 0x7B, 0x1E, 0x7E, 0x50, 0x14, 0xAD, 0xFC, 0xDB, 0xA6, 0x00, - 0xE9, 0x00, 0x7A, 0x5A, 0xCD, 0x01, 0x26, 0xBB, 0x4E, 0x00, - 0x9E, 0xCC, 0xD3, 0x2D, 0x49, 0x1B, 0xB8, 0x60, 0x2C, 0x59, - 0x2A, 0x95, 0x8C, 0x92, 0x4D, 0x1A, 0x57, 0x3B, 0xEF, 0x6E, - 0xC4, 0x91, 0xE4, 0x99, 0x5E, 0xAE, 0x1B, 0xAF, 0x1E, 0x14, - 0x51, 0x38, 0x19, 0xBC, 0x33, 0x5C, 0x21, 0x4D, 0xAD, 0xA1, - 0x12, 0x17, 0xE6, 0xF5, 0x37, 0x98, 0xF6, 0xE6, 0x38, 0x4D, - 0x07, 0x80, 0x1D, 0xD8, 0x5E, 0xCC, 0x58, 0xDB, 0x7E, 0x3A, - 0x8F, 0x90, 0xDF, 0x9E, 0x80, 0xFB, 0xFC, 0x10, 0xEC, 0x7E, - 0x81, 0x53, 0x37, 0xC1, 0x66, 0xEE, 0xD7, 0x80, 0x0F, 0x0C, - 0xEB, 0xE8, 0x85, 0x2E, 0x37, 0x61, 0x8B, 0x9C, 0x63, 0xF6, - 0x27, 0x77, 0x16, 0x44, 0x61, 0x66, 0xC9, 0x79, 0x31, 0xDD, - 0xB4, 0x94, 0x9D, 0x8C, 0x8B, 0x1D, 0x28, 0xC2, 0x84, 0xC9, - 0x30, 0x71, 0xF4, 0x9E, 0xEF, 0x00, 0x2B, 0xA2, 0x9F, 0x38, - 0x65, 0xE6, 0xD1, 0x80, 0x26, 0x9B, 0xC4, 0xE8, 0x83, 0xCE, - 0x64, 0xD0, 0x8A, 0x9A, 0x1E, 0xEF, 0xA3, 0xB6, 0xD2, 0x0B, - 0x9C, 0x14, 0xF3, 0x08, 0xF1, 0x73, 0xD1, 0x34, 0xAE, 0x83, - 0xE7, 0x97, 0x5B, 0x97, 0x35, 0x0E, 0x35, 0xDC, 0x22, 0xD5, - 0xAA, 0xD1, 0xBC, 0xC7, 0x40, 0x20, 0xAD, 0x43, 0x36, 0x24, - 0x66, 0x7A, 0xB7, 0x1F, 0xF9, 0x1A, 0x1F, 0x37, 0xCE, 0xC2, - 0xFC, 0x98, 0xB1, 0x6A, 0x9A, 0x81, 0xD9, 0x4B, 0x53, 0x68, - 0xC5, 0xF3, 0xE6, 0x69, 0x76, 0xA6, 0x8B, 0x98, 0xFB, 0x84, - 0x2E, 0xD3, 0x4F, 0x77, 0xF9, 0x24, 0xF9, 0x13, 0x89, 0x8D, - 0xF6, 0x80, 0x2E, 0x0E, 0xA1, 0xCD, 0x90, 0x58, 0xCE, 0x63, - 0x36, 0x95, 0x8C, 0xF6, 0x68, 0xC3, 0x84, 0xF8, 0xB4, 0x5E, - 0x9E, 0x6C, 0x19, 0x32, 0x90, 0xA7, 0xD0, 0x2D, 0x47, 0x6B, - 0xCB, 0xAF, 0x85, 0x65, 0x92, 0x83, 0x11, 0x8E, 0xCC, 0x88, - 0xB1, 0x0B, 0xB8, 0x1E, 0x55, 0x4F, 0x18, 0x2A, 0xC4, 0x02, - 0xA8, 0x45, 0x6A, 0xCD, 0x75, 0x58, 0x6A, 0xAF, 0x83, 0x94, - 0x38, 0x1D, 0xA9, 0x09, 0x29, 0x1E, 0x0E, 0x43, 0xA9, 0x04, - 0x26, 0xF6, 0x1C, 0xC7, 0xCB, 0xC1, 0x10, 0xB9, 0x86, 0xC1, - 0xA2, 0xEC, 0x03, 0xDE, 0xF7, 0x53, 0x67, 0x2B, 0xDF, 0xEE, - 0xAF, 0xD2, 0xF2, 0xA8, 0xBD, 0xD9, 0x21, 0xCC, 0x8C, 0x72, - 0x02, 0x44, 0xF5, 0xA5, 0xED, 0x88, 0x5B, 0xAC, 0x5F, 0x5A, - 0x15, 0x81, 0xCC, 0x95, 0x15, 0x2E, 0x34, 0x72, 0x59, 0x6C, - 0x03, 0x36, 0x5E, 0x22, 0x7E, 0x3F, 0x65, 0xA6, 0x8C, 0x4F, - 0x89, 0xC1, 0xE7, 0x63, 0xB6, 0x1B, 0xE5, 0x41, 0xC7, 0xF8, - 0x96, 0xA4, 0x8F, 0x4F, 0x47, 0x59, 0x3E, 0x9D, 0x45, 0xCE, - 0xE4, 0x1B, 0xF1, 0x69, 0x0C, 0x39, 0x34, 0x16, 0x77, 0x6A, - 0xF5, 0xB5, 0x9E, 0x8B, 0x63, 0x86, 0x35, 0xFD, 0x4F, 0x2A, - 0x4B, 0x49, 0x21, 0x7C, 0xE3, 0xEA, 0x5C, 0xDE, 0x98, 0xE4, - 0x58, 0x32, 0x67, 0x98, 0xFC, 0x8F, 0xAB, 0x01, 0x0E, 0xA4, - 0x8B, 0x39, 0xA3, 0x55, 0x4C, 0x8E, 0x98, 0xBA, 0xCD, 0x3B, - 0xDB, 0x91, 0x8D, 0x94, 0x98, 0xBE, 0x37, 0x7B, 0xDB, 0x58, - 0xFC, 0xC1, 0x88, 0x7D, 0xD3, 0xBC, 0x8F, 0xB4, 0x7C, 0xB2, - 0xFE, 0x3E, 0x26, 0x36, 0x95, 0x7E, 0xDB, 0xD1, 0x38, 0x29, - 0xD9, 0xCF, 0x5D, 0x0E, 0xD1, 0xDF, 0x7F, 0xD1, 0x68, 0x04, - 0x70, 0x6F, 0x61, 0x39, 0x49, 0x44, 0xD2, 0x5C, 0x0C, 0xC3, - 0xD6, 0xF8, 0x1E, 0x96, 0x36, 0x43, 0x79, 0xB2, 0xE5, 0x1A, - 0xF1, 0x32, 0x03, 0xE1, 0x22, 0x45, 0x20, 0x1B, 0x36, 0x6A, - 0xB8, 0x62, 0xA5, 0xC5, 0x85, 0x8B, 0xED, 0x42, 0x69, 0xC6, - 0x30, 0x36, 0xA1, 0xF6, 0x22, 0x8D, 0x37, 0xD8, 0xE4, 0xBD, - 0x26, 0x8B, 0x89, 0xC2, 0xA9, 0x10, 0x82, 0xDD, 0x0C, 0x2D, - 0x04, 0x39, 0xB7, 0x59, 0x0B, 0x30, 0x2A, 0x6D, 0x84, 0x4A, - 0x74, 0xB9, 0x3F, 0xEA, 0xA5, 0x34, 0x76, 0xFA, 0xAD, 0x99, - 0xB0, 0xEF, 0xA0, 0xF1, 0x85, 0x3D, 0x00, 0x76, 0x00, 0xF8, - 0xFA, 0x1B, 0xAA, 0xB7, 0x5A, 0x62, 0x0E, 0xFD, 0xDC, 0x7A, - 0xCA, 0x18, 0x43, 0x32, 0x02, 0xB7, 0x20, 0x38, 0x0B, 0x50, - 0x4E, 0x57, 0xBF, 0x88, 0xBA, 0x09, 0xD3, 0x9D, 0x8B, 0x3A, - 0x88, 0x82, 0xD9, 0xC3, 0x60, 0x89, 0x10, 0xF5, 0x09, 0x61, - 0x72, 0x41, 0x83, 0xCB, 0x29, 0x38, 0xB3, 0x75, 0xD8, 0xBB, - 0x7E, 0x3F, 0x4A, 0x3C, 0x6B, 0xE5, 0xAE, 0xB7, 0x18, 0xC1, - 0x52, 0x3C, 0x8D, 0x8B, 0xF3, 0x8B, 0x84, 0x98, 0x3E, 0xE3, - 0x5F, 0x5B, 0x89, 0xB7, 0x07, 0x58, 0xD3, 0x7B, 0x84, 0x38, - 0x57, 0x3B, 0xF7, 0x59, 0x22, 0x6B, 0xA7, 0x31, 0x1D, 0xAF, - 0xBF, 0xFA, 0x15, 0x8B, 0xE0, 0x72, 0xFA, 0xCA, 0xB6, 0xC2, - 0xD6, 0x42, 0x43, 0x27, 0xF6, 0xAA, 0x3E, 0x5B, 0x07, 0x12, - 0x5C, 0xEF, 0xED, 0xCB, 0xDF, 0xAA, 0x5F, 0xF8, 0x77, 0xD0, - 0x8E, 0xC7, 0x03, 0x1E, 0x23, 0x5A, 0xF1, 0x3A, 0xA9, 0x10, - 0x6F, 0x05, 0x46, 0x04, 0x72, 0x63, 0xAC, 0xAE, 0x4B, 0x3D, - 0x1E, 0x2D, 0xC2, 0xE9, 0x38, 0x6A, 0xA9, 0x11, 0x1E, 0xE0, - 0xCA, 0x06, 0x7A, 0x5A, 0x45, 0xB2, 0x82, 0x0C, 0x10, 0xEB, - 0x0D, 0x10, 0x26, 0x74, 0xA5, 0x07, 0x1B, 0xBA, 0x61, 0xFD, - 0x8C, 0x73, 0xCB, 0x96, 0xFC, 0xF8, 0x98, 0x2D, 0x83, 0x12, - 0x0B, 0x6A, 0x9C, 0xA4, 0x70, 0x95, 0x4B, 0xD8, 0x11, 0x71, - 0x8F, 0x22, 0x89, 0xA2, 0x6A, 0x0A, 0xB0, 0x17, 0x93, 0x46, - 0x89, 0x60, 0x58, 0x2E, 0x1F, 0x3B, 0xE1, 0x6F, 0x49, 0x47, - 0xBC, 0x93, 0xD2, 0x14, 0x3D, 0xF2, 0x21, 0xA4, 0xFA, 0x1F, - 0x9D, 0x3F, 0x08, 0x40, 0x17, 0x77, 0x58, 0x7F, 0x65, 0xB4, - 0xFD, 0x01, 0x67, 0xF1, 0x62, 0x77, 0xD8, 0x6D, 0x46, 0x42, - 0x30, 0x52, 0x64, 0x4C, 0x76, 0x64, 0x7E, 0x09, 0xDD, 0x57, - 0x04, 0xB8, 0x4A, 0x7F, 0x8A, 0x68, 0xC3, 0x0D, 0xD9, 0xBE, - 0xF6, 0x61, 0x1C, 0x4D, 0x30, 0x80, 0x18, 0x83, 0xD6, 0x3F, - 0xB9, 0x58, 0x52, 0x20, 0xB9, 0x60, 0xEA, 0x22, 0xD0, 0xD0, - 0x61, 0x1A, 0x3B, 0x32, 0x69, 0x35, 0x8B, 0x22, 0x6E, 0x27, - 0x2E, 0xE2, 0x6D, 0xBA, 0xC7, 0x17, 0x02, 0xDA, 0x83, 0x22, - 0x5C, 0x31, 0x60, 0xD6, 0x78, 0x78, 0xBF, 0x0B, 0xEE, 0xD4, - 0x68, 0x32, 0xAE, 0x17, 0x80, 0x04, 0x7F, 0xD9, 0xA9, 0xA0, - 0xC9, 0xB7, 0x98, 0xEE, 0x9C, 0x8C, 0x61, 0x70, 0xBB, 0x2F, - 0x10, 0x39, 0x3E, 0xCC, 0x6E, 0xC8, 0x0A, 0x0F, 0xA2, 0x1E, - 0x31, 0x01, 0x75, 0x1E, 0x41, 0x9E, 0x63, 0x14, 0xC2, 0x3A, - 0xD9, 0x1A, 0x8B, 0x52, 0x0D, 0xFD, 0xDC, 0xE6, 0x23, 0x35, - 0xF1, 0x17, 0xE4, 0xA6, 0xDB, 0xAC, 0x3F, 0x67, 0x59, 0x02, - 0x8E, 0x20, 0x6F, 0x55, 0x69, 0xF8, 0x16, 0xFC, 0x33, 0x53, - 0xCA, 0xE8, 0x4E, 0x3F, 0xA4, 0x5C, 0xA6, 0xA4, 0x95, 0xCD, - 0xB7, 0x9D, 0x14, 0x79, 0xAE, 0x82, 0xF8, 0x2F, 0xE2, 0x13, - 0x0D, 0xDE, 0x75, 0x19, 0xA4, 0x0C, 0x32, 0x83, 0xD0, 0x14, - 0x35, 0xE7, 0x77, 0xD0, 0x18, 0x9C, 0xEF, 0xCC, 0xD5, 0xDA, - 0x39, 0x3B, 0xFF, 0x11, 0x39, 0x20, 0x3D, 0x5A, 0xB1, 0x16, - 0x2A, 0x57, 0x6B, 0x27, 0xC1, 0xB6, 0x69, 0xB5, 0x9B, 0x78, - 0x6F, 0x6B, 0x8A, 0xEF, 0x3F, 0x8F, 0xB8, 0x37, 0xBF, 0xCA, - 0x2D, 0x27, 0x25, 0x12, 0xC9, 0x81, 0x3A, 0x4C, 0x1A, 0x94, - 0xDF, 0x6D, 0x27, 0xF8, 0x85, 0x26, 0xA0, 0x88, 0x56, 0x7B, - 0x62, 0x5E, 0x84, 0xCF, 0x84, 0xAB, 0x81, 0xA3, 0xD4, 0xEB, - 0xE9, 0x85, 0x96, 0xED, 0x27, 0x42, 0xF6, 0x86, 0x28, 0xF1, - 0x8C, 0x69, 0x81, 0xD9, 0xAC, 0x1E, 0x9F, 0x12, 0xA4, 0x9E, - 0x78, 0xC5, 0x2E, 0x07, 0x66, 0xFF, 0x2F, 0xED, 0x93, 0xD2, - 0x62, 0x30, 0x30, 0x81, 0xE5, 0x76, 0x7A, 0x2A, 0x8E, 0xF3, - 0xC0, 0x21, 0x9C, 0xE8, 0xE3, 0x51, 0x4F, 0xDA, 0x96, 0xCF, - 0x6A, 0x0A, 0xC9, 0x90, 0x64, 0x93, 0x70, 0xE2, 0xAD, 0x6E, - 0x17, 0x06, 0x5E, 0xBD, 0x5C, 0x40, 0x4B, 0x43, 0x78, 0x1F, - 0x40, 0x55, 0x36, 0xBD, 0x2B, 0xD6, 0x92, 0x88, 0x02, 0xAA, - 0x3E, 0xDF, 0x3B, 0xC9, 0x90, 0x69, 0x28, 0xE6, 0xE1, 0x7D, - 0xBD, 0x2A, 0xC1, 0x6F, 0x70, 0x6D, 0xB8, 0x1A, 0xAD, 0x66, - 0x4F, 0x78, 0xF7, 0x00, 0x57, 0xED, 0xA8, 0xC3, 0x87, 0x8A, - 0x27, 0x2E, 0xFC, 0xC4, 0x37, 0xB9, 0xED, 0xAE, 0x06, 0x05, - 0x19, 0x60, 0x53, 0x85, 0x54, 0x83, 0x52, 0xEC, 0xBF, 0xA5, - 0x79, 0xFC, 0x18, 0xC3, 0xD8, 0x98, 0xC5, 0xD8, 0x81, 0x78, - 0x4F, 0xDA, 0x24, 0xAD, 0x6F, 0xF4, 0x78, 0x56, 0x79, 0x9F, - 0x5D, 0xE3, 0x6D, 0x35, 0x93, 0xEA, 0xA8, 0xB5, 0x44, 0x1A, - 0xDA, 0x87, 0xBD, 0x06, 0x4D, 0xFF, 0x35, 0x2A, 0x76, 0x51, - 0xD3, 0xC2, 0x73, 0x20, 0x93, 0x33, 0xC0, 0xEA, 0x88, 0xA0, - 0xCD, 0xE1, 0xEA, 0x79, 0x86, 0x32, 0xA7, 0xCE, 0xBA, 0x73, - 0xE9, 0x82, 0x32, 0x64, 0x88, 0x44, 0x66, 0x8A, 0x8C, 0xCB, - 0xF1, 0xDB, 0x42, 0x91, 0x3E, 0x78, 0x3A, 0x77, 0xEB, 0x4C, - 0xFD, 0xFE, 0x43, 0xD8, 0xEA, 0x9E, 0xED, 0x19, 0xAD, 0xA8, - 0x64, 0x1A, 0x12, 0xC3, 0x81, 0x75, 0xA0, 0x61, 0xAF, 0x4F, - 0x71, 0x25, 0x94, 0x76, 0x31, 0x9A, 0xF6, 0x14, 0x3F, 0x6D, - 0x36, 0xC0, 0x2F, 0x52, 0x3B, 0x4B, 0xCB, 0x2B, 0xCF, 0xB8, - 0x70, 0x19, 0x0D, 0x15, 0x1A, 0xF9, 0x48, 0xA8, 0x3A, 0x55, - 0xAF, 0x18, 0x66, 0x50, 0xC8, 0x32, 0x97, 0x43, 0x1E, 0x9F, - 0x8B, 0x66, 0xC1, 0x2E, 0x37, 0x69, 0xB8, 0x97, 0xF9, 0x6A, - 0x1E, 0x69, 0xBA, 0x5C, 0xEC, 0x6F, 0xFD, 0x99, 0x71, 0xB8, - 0xC4, 0x05, 0xB9, 0xB9, 0xE6, 0x4D, 0xA7, 0x01, 0x2D, 0xEB, - 0x26, 0x23, 0x40, 0x4D, 0x79, 0x1B, 0xE4, 0xD9, 0xAB, 0x9F, - 0xE9, 0x9B, 0x35, 0x78, 0xC0, 0x32, 0x8E, 0xF7, 0x5F, 0x7E, - 0xB5, 0x56, 0xD2, 0xA1, 0x35, 0x81, 0x72, 0xD2, 0x6A, 0x0A, - 0xC9, 0x6D, 0x0D, 0xDB, 0x2B, 0xA4, 0x02, 0x92, 0x76, 0x26, - 0xAF, 0x36, 0x27, 0x01, 0xDF, 0xA5, 0x5B, 0x09, 0x97, 0x06, - 0x5E, 0x80, 0xB0, 0x32, 0xFC, 0x1F, 0x72, 0x4E, 0x93, 0x2F, - 0x12, 0xF3, 0xA2, 0x60, 0x19, 0x74, 0x69, 0x03, 0x8B, 0x7D, - 0x6B, 0x2C, 0xE9, 0x54, 0x91, 0xF1, 0x3F, 0x2B, 0xF1, 0x65, - 0x71, 0x0B, 0x24, 0xEF, 0xCC, 0xB8, 0x79, 0x8E, 0x9B, 0x03, - 0xC1, 0xFF, 0xAC, 0xF0, 0x04, 0xEA, 0x92, 0xA3, 0x86, 0x64, - 0x6B, 0x63, 0x43, 0xA6, 0xC3, 0xCB, 0x43, 0xBE, 0xB0, 0xA9, - 0x11, 0x1B, 0x74, 0xC0, 0x87, 0x61, 0x5C, 0xDB, 0xF4, 0xA3, - 0x0E, 0xA6, 0x36, 0xEE, 0x41, 0x7F, 0xA8, 0xA6, 0xDF, 0x1B, - 0x05, 0xAE, 0x77, 0x90, 0x6A, 0xD4, 0x5B, 0x8E, 0x27, 0xE2, - 0xC0, 0x3E, 0x99, 0xAB, 0xFD, 0xFE, 0x6B, 0x71, 0xB4, 0x22, - 0x77, 0x7A, 0xB0, 0x43, 0x8B, 0x81, 0x33, 0x4D, 0x51, 0xD4, - 0xAB, 0xD9, 0xA0, 0x7C, 0xA7, 0x8A, 0x39, 0x92, 0x45, 0x39, - 0xAC, 0x54, 0x13, 0x6E, 0xA5, 0x22, 0x28, 0xC8, 0xAD, 0x3D, - 0xB1, 0xB2, 0xF3, 0x6B, 0xF6, 0x51, 0x17, 0xA3, 0x37, 0xE9, - 0xC9, 0x94, 0x54, 0xD7, 0x64, 0xC6, 0x04, 0xE7, 0xFA, 0x93, - 0xC1, 0xFA, 0xBA, 0xCA, 0x21, 0x1B, 0xF0, 0x6C, 0x99, 0x22, - 0x52, 0x53, 0xEF, 0xC2, 0xA2, 0x19, 0xB3, 0xCA, 0xF5, 0x30, - 0xC1, 0xD1, 0x24, 0x7F, 0x3A, 0x28, 0x8F, 0xAA, 0x70, 0xD2, - 0xBB, 0x7A, 0xF5, 0x8A, 0x23, 0x57, 0xE9, 0x79, 0x00, 0xF4, - 0x1C, 0x1D, 0xB1, 0x42, 0x0C, 0x53, 0x99, 0x7B, 0x99, 0x68, - 0x6E, 0x71, 0xD9, 0xD4, 0xE9, 0xC1, 0xA7, 0x5B, 0x05, 0xA7, - 0x6F, 0xF2, 0xE7, 0x11, 0x3B, 0x70, 0x5F, 0x11, 0x98, 0xBE, - 0xB5, 0xF8, 0x78, 0x5F, 0x5C, 0x19, 0xAC, 0x92, 0x4D, 0x18, - 0x0D, 0x7B, 0x6F, 0x8C, 0x90, 0xAB, 0x6B, 0x32, 0x3D, 0x51, - 0x11, 0xBC, 0x80, 0xC4, 0xCF, 0x4A, 0xF4, 0x7F, 0xCC, 0x68, - 0x92, 0x76, 0xF7, 0x9D, 0xF7, 0x07, 0x44, 0x8C, 0xB5, 0x4D, - 0x53, 0x7E, 0xE2, 0x58, 0x42, 0xB5, 0x8E, 0xB3, 0xC7, 0x0C, - 0x2F, 0xCA, 0x77, 0x2D, 0x56, 0x84, 0xCA, 0x98, 0x05, 0x09, - 0x43, 0xA9, 0x0E, 0x92, 0x4B, 0x57, 0x27, 0x46, 0x31, 0xF0, - 0xE3, 0xA4, 0x48, 0xD9, 0x42, 0x51, 0x32, 0xF0, 0x70, 0xA1, - 0x72, 0xA9, 0x2B, 0x1D, 0xB1, 0x2A, 0x09, 0x96, 0xAE, 0x3E, - 0x83, 0x41, 0x7B, 0x9B, 0x28, 0x6E, 0x85, 0xB7, 0xAD, 0x7F, - 0x10, 0xA3, 0x54, 0xBF, 0x24, 0xB6, 0xFB, 0x6D, 0xA5, 0x9F, - 0xE6, 0xBB, 0x33, 0x8A, 0x04, 0x83, 0x53, 0xFB, 0xB9, 0x79, - 0xF7, 0x76, 0xC9, 0x43, 0xC7, 0xE4, 0xB5, 0xE7, 0x19, 0x56, - 0x72, 0x55, 0xAC, 0x1D, 0xA8, 0xE4, 0xD8, 0x0C, 0x66, 0x15, - 0x7F, 0x17, 0x08, 0xB9, 0x33, 0x4B, 0x9C, 0x84, 0xDA, 0x49, - 0x9F, 0x1B, 0x42, 0x85, 0x0F, 0x4B, 0xC0, 0x70, 0x35, 0x23, - 0x34, 0xD9, 0x3C, 0x76, 0xF9, 0x22, 0x5C, 0x1A, 0xE9, 0x81, - 0xE5, 0x31, 0xA3, 0xF1, 0xB7, 0x7F, 0xE2, 0x75, 0x42, 0x27, - 0x82, 0xC7, 0xBA, 0x68, 0x20, 0x0E, 0xAC, 0xD0, 0x32, 0x28, - 0xB5, 0x99, 0x71, 0xBA, 0x48, 0x2C, 0x95, 0xA5, 0xC8, 0x65, - 0x2E, 0x19, 0x70, 0xAD, 0x12, 0x3A, 0xAD, 0x83, 0x87, 0x15, - 0xA7, 0xEA, 0x9D, 0x6E, 0x11, 0x94, 0x95, 0x23, 0x51, 0xDA, - 0x5F, 0x67, 0xBD, 0xDD, 0xA7, 0xF9, 0xF8, 0x76, 0xE4, 0x3C, - 0x83, 0x0A, 0xAB, 0xBE, 0x6A, 0xB0, 0xC5, 0xA8, 0xBE, 0xD9, - 0xDD, 0xBC, 0x4E, 0xA6, 0xCF, 0x91, 0xB3, 0x42, 0x30, 0x96, - 0x8E, 0x45, 0xC6, 0x1F, 0x55, 0x6B, 0x2C, 0x0A, 0xBC, 0x9F, - 0x69, 0x65, 0x98, 0x34, 0x95, 0x6A, 0x1E, 0x86, 0x78, 0x8B, - 0x26, 0x4F, 0x05, 0x76, 0x03, 0x22, 0xCB, 0x72, 0xF1, 0xD0, - 0x1A, 0x64, 0x19, 0xC7, 0x21, 0x5C, 0x51, 0xD0, 0x6C, 0x0B, - 0xDA, 0xB9, 0x67, 0x7A, 0x83, 0xC3, 0x1E, 0x16, 0x27, 0x4A, - 0x00, 0x5F, 0xBA, 0x0E, 0x45, 0x81, 0x6E, 0xE7, 0x5B, 0x5A, - 0x8F, 0x0D, 0x6D, 0x47, 0xB1, 0x30, 0xA7, 0x42, 0x1E, 0xA9, - 0x8A, 0x27, 0x4A, 0xB0, 0x60, 0x2F, 0xA9, 0x12, 0x42, 0xD6, - 0x7F, 0x10, 0x01, 0xF3, 0x59, 0xD2, 0x40, 0x11, 0x19, 0x92, - 0xFE, 0x80, 0x25, 0x1B, 0x60, 0xDC, 0x02, 0x7B, 0x10, 0x45, - 0x17, 0x66, 0x70, 0xB9, 0x64, 0x4A, 0xBA, 0xAD, 0xBF, 0x55, - 0x7C, 0xB3, 0xD8, 0x18, 0x6D, 0x16, 0x53, 0xED, 0x89, 0xE5, - 0xD2, 0x50, 0xFA, 0xA8, 0xFE, 0x74, 0x67, 0xC4, 0x35, 0x4C, - 0xC4, 0xBE, 0x52, 0x9A, 0x8E, 0xBB, 0xB6, 0xE0, 0xAF, 0x52, - 0x57, 0x3D, 0x99, 0x79, 0x10, 0xB8, 0xE6, 0xAB, 0x24, 0x9E, - 0x75, 0xC2, 0x2A, 0xFB, 0xDB, 0xF8, 0xE0, 0x02, 0xCB, 0x49, - 0x56, 0x52, 0x6B, 0x8C, 0xFA, 0x8E, 0xCF, 0xFA, 0x18, 0x50, - 0xDD, 0x98, 0x49, 0xEC, 0xA8, 0x08, 0x6C, 0x60, 0xC0, 0x68, - 0xBF, 0x7B, 0x49, 0xB4, 0xE6, 0x49, 0x59, 0x6E, 0x65, 0x0E, - 0x41, 0xEA, 0x64, 0xC8, 0xD3, 0x1A, 0x9F, 0x39, 0xAE, 0xEB, - 0x3C, 0x88, 0xFB, 0x40, 0xDC, 0xB8, 0x07, 0x82, 0x56, 0x01, - 0xAC, 0x04, 0x0B, 0x6B, 0x0B, 0x15, 0xAA, 0x4F, 0xD2, 0x04, - 0xF3, 0x65, 0xCD, 0xF7, 0x32, 0xB1, 0x95, 0xC4, 0x91, 0xB8, - 0x63, 0x02, 0x26, 0x47, 0x1D, 0x6E, 0x6D, 0xCF, 0x3D, 0x39, - 0x3D, 0xDC, 0x18, 0x33, 0xD8, 0xF5, 0x8C, 0xB0, 0x69, 0x53, - 0x48, 0x86, 0x14, 0x50, 0xA3, 0x65, 0xEE, 0x2C, 0x2F, 0x72, - 0xF7, 0x43, 0xE7, 0xEA, 0xA0, 0x3E, 0x3C, 0x30, 0x33, 0xD9, - 0x1D, 0x6E, 0x5D, 0xCB, 0xE1, 0xE0, 0x8D, 0x95, 0xD2, 0x58, - 0x8D, 0xD5, 0xB3, 0x1C, 0x22, 0x28, 0x6A, 0xBB, 0xB3, 0x09, - 0xB1, 0x91, 0x60, 0xE2, 0xC6, 0x48, 0x11, 0xF0, 0x49, 0xB6, - 0xE9, 0xEF, 0x4B, 0xC6, 0xDB, 0xB1, 0xBF, 0x6C, 0xB2, 0x92, - 0x5C, 0x65, 0x91, 0x67, 0x81, 0x9C, 0x71, 0x5A, 0x2C, 0xFE, - 0xC8, 0xF9, 0xF5, 0x96, 0x7D, 0x3E, 0xBB, 0x7F, 0xEF, 0xF7, - 0xBF, 0xF8, 0xAC, 0xCF, 0xA6, 0x6F, 0x28, 0x9C, 0x09, 0x65, - 0x8F, 0xF7, 0xDC, 0xEF, 0x3E, 0x4B, 0xCD, 0x6D, 0x97, 0xD3, - 0xCC, 0x9C, 0xF7, 0xF2, 0x4C, 0xE6, 0x64, 0x31, 0xE8, 0x1E, - 0xDE, 0x56, 0xAE, 0xA6, 0x04, 0xFB, 0xED, 0x2E, 0x3F, 0x23, - 0x7D, 0xBC, 0x6D, 0xCC, 0x4B, 0xD4, 0x9E, 0x06, 0x83, 0xE1, - 0x95, 0xAE, 0xC4, 0xAA, 0x6E, 0xFF, 0x9E, 0x1C, 0xB9, 0x07, - 0x60, 0x6D, 0xD5, 0x09, 0x06, 0x30, 0x0C, 0x3F, 0xB5, 0xE8, - 0x8B, 0x01, 0x94, 0x1B, 0x84, 0xE9, 0xB7, 0x37, 0x03, 0xA7, - 0xAF, 0x4B, 0x63, 0x3F, 0xD2, 0x57, 0xBB, 0xB8, 0xBF, 0xE2, - 0x53, 0x4F, 0xA1, 0x9E, 0xC7, 0x4C, 0xDA, 0x89, 0x25, 0x0E, - 0x7E, 0xC9, 0x44, 0x7F, 0x4C, 0x02, 0x7F, 0xA4, 0x08, 0xEC, - 0x7F, 0x44, 0xEA, 0xF7, 0xCF, 0x1B, 0x19, 0xFA, 0x6A, 0x0A, - 0x3E, 0xE1, 0xF4, 0x78, 0xDF, 0x93, 0xAB, 0x86, 0x9E, 0xE1, - 0x31, 0xBF, 0x70, 0x20, 0x8B, 0x87, 0xCE, 0xFC, 0x84, 0x03, - 0x8D, 0xF1, 0x25, 0xE6, 0x88, 0x30, 0x79, 0x63, 0xAF, 0x5C, - 0x3B, 0x84, 0xA9, 0xB8, 0x89, 0xB4, 0x23, 0x58, 0x78, 0xF9, - 0xAB, 0x76, 0x1B, 0x20, 0x56, 0xDB, 0x9E, 0xFE, 0x59, 0x29, - 0xB9, 0x8C, 0xD7, 0x4E, 0xA4, 0x5C, 0x7F, 0x40, 0xA8, 0xEB, - 0x0D, 0x90, 0xBA, 0x30, 0x68, 0x5E, 0x9C, 0x90, 0xBE, 0xD4, - 0x43, 0x4B, 0x67, 0x27, 0xE7, 0x7D, 0x06, 0xB8, 0xF0, 0x96, - 0xEF, 0xF4, 0x47, 0x5F, 0x8E, 0xCA, 0x46, 0x85, 0x3C, 0x94, - 0x9E, 0xDE, 0x09, 0x40, 0x45, 0xB3, 0x69, 0xF1, 0x8F, 0x90, - 0xF5, 0x5C, 0x22, 0x69, 0xBF, 0x5F, 0x11, 0x66, 0xD9, 0xDC, - 0x37, 0x6A, 0x2C, 0xAF, 0x72, 0x66, 0xC8, 0x28, 0xEA, 0x59, - 0x71, 0xB1, 0x7F, 0x10, 0xA5, 0xBC, 0x42, 0x99, 0xF6, 0xD6, - 0xB4, 0xC4, 0x18, 0x49, 0x72, 0x37, 0xF3, 0xCD, 0x01, 0xD6, - 0xAB, 0x2A, 0xFE, 0x1A, 0xBC, 0x52, 0x15, 0x38, 0x30, 0xF2, - 0x4F, 0xC0, 0xD3, 0x5B, 0x91, 0x5A, 0x55, 0xD1, 0x82, 0x5A, - 0x50, 0xE8, 0x16, 0x8C, 0x3D, 0xC8, 0x97, 0x3D, 0x2A, 0xA9, - 0xF3, 0xEA, 0x48, 0x57, 0x51, 0x29, 0xB0, 0x81, 0x4D, 0x6B, - 0x69, 0xFE, 0xF8, 0xA8, 0xE0, 0x5F, 0xF4, 0x98, 0xBE, 0x3D, - 0x39, 0xB6, 0x10, 0x3E, 0x70, 0x16, 0x60, 0x46, 0xA1, 0x74, - 0x5C, 0xF5, 0x53, 0x24, 0xF4, 0x56, 0x33, 0x97, 0x18, 0xB6, - 0x4A, 0x91, 0xE1, 0xF4, 0x36, 0x11, 0x80, 0xCF, 0xDE, 0xE3, - 0x7C, 0x8C, 0x27, 0xC9, 0x29, 0xA6, 0xCC, 0xA2, 0xE3, 0x61, - 0xED, 0x46, 0x10, 0x0D, 0x43, 0x1D, 0x63, 0xB2, 0x4B, 0xC0, - 0xFF, 0x79, 0x2D, 0x6D, 0xD1, 0x0E, 0xD4, 0x73, 0x24, 0xE2, - 0xFE, 0x07, 0x15, 0xC4, 0xB3, 0xFC, 0xDA, 0x14, 0x44, 0x81, - 0x89, 0xA9, 0x16, 0xEF, 0x8C, 0x60, 0xEE, 0x2D, 0xBC, 0x81, - 0xF1, 0xD8, 0xE1, 0x37, 0x5D, 0xC0, 0xD2, 0xA5, 0x8C, 0xF9, - 0xAF, 0xAA, 0xBE, 0xF6, 0x46, 0x65, 0xEB, 0x53, 0x97, 0x2F, - 0xDA, 0x28, 0x66, 0x29, 0x67, 0x1F, 0x1F, 0x0A, 0x61, 0x61, - 0x66, 0x61, 0xF2, 0xA7, 0x1F, 0x1C, 0x30, 0x1F, 0xDD, 0xDE, - 0xAB, 0xC7, 0x6C, 0x1C, 0xED, 0xC8, 0xDC, 0x09, 0xBA, 0xF9, - 0x93, 0x76, 0x4C, 0xCC, 0xAE, 0xF5, 0x2D, 0xA4, 0xAB, 0x3F, - 0xA0, 0x42, 0x4E, 0x8F, 0x28, 0x87, 0xE1, 0x64, 0xCA, 0xF4, - 0xB6, 0xAC, 0x39, 0x1E, 0x1C, 0xF2, 0x69, 0xFF, 0x30, 0x3B, - 0x2F, 0x5C, 0xB2, 0x82, 0xD8, 0x28, 0x2D, 0xA8, 0x2C, 0xDA, - 0x6D, 0x76, 0x38, 0xFC, 0x50, 0x6F, 0xA4, 0xB9, 0x52, 0x9F, - 0xD5, 0xFA, 0x94, 0xDC, 0x54, 0xED, 0xD9, 0x10, 0x6F, 0xDA, - 0x7E, 0x5E, 0x8A, 0xFB, 0xB3, 0x68, 0xD0, 0xD1, 0x25, 0x77, - 0x7E, 0x8B, 0x91, 0x68, 0x4E, 0xF4, 0x74, 0x99, 0x77, 0xB8, - 0x5C, 0xCE, 0xCC, 0x3D, 0x54, 0xA8, 0xD8, 0x4F, 0x01, 0x30, - 0x37, 0xB0, 0x82, 0x42, 0xB9, 0xB1, 0xBF, 0x83, 0xC8, 0xB6, - 0x40, 0x7F, 0xF2, 0xD8, 0x3C, 0xBD, 0x63, 0xCB, 0x23, 0x34, - 0xA4, 0xFB, 0x4C, 0xE0, 0x8B, 0x85, 0xA4, 0xA9, 0x7B, 0xA4, - 0x78, 0x86, 0xD4, 0xE9, 0x68, 0xA4, 0x40, 0x8D, 0xBC, 0x56, - 0x44, 0x8B, 0x24, 0x80, 0x6B, 0xC1, 0x84, 0xEC, 0xB3, 0x70, - 0x01, 0x0A, 0xFE, 0xED, 0x7D, 0xD9, 0x7E, 0xAB, 0x89, 0xDB, - 0xE3, 0x90, 0x5C, 0x6A, 0x75, 0x8E, 0x16, 0xF2, 0x0A, 0xFE, - 0x9E, 0x08, 0xC8, 0xB2, 0x35, 0x3C, 0xC3, 0x20, 0x29, 0xD4, - 0x8A, 0xA6, 0x58, 0x25, 0x43, 0x9B, 0x27, 0xAE, 0xBF, 0xC7, - 0x50, 0x82, 0x9F, 0x04, 0x88, 0x4C, 0xB0, 0x4E, 0x38, 0xA5, - 0x84, 0xC1, 0xBA, 0x6A, 0xA7, 0x16, 0x85, 0x76, 0xF5, 0x21, - 0x15, 0x3F, 0x00, 0x2C, 0x0A, 0xBD, 0x18, 0x66, 0x0C, 0xD1, - 0x46, 0x33, 0x1A, 0xF3, 0x85, 0x34, 0x68, 0x49, 0x05, 0x10, - 0x85, 0xF9, 0x61, 0xD6, 0xB6, 0x97, 0xFC, 0xAA, 0x2C, 0xBC, - 0xF1, 0x75, 0xF3, 0xFC, 0x57, 0x20, 0x54, 0xF2, 0x02, 0x5E, - 0xAB, 0xDD, 0x19, 0x31, 0xAB, 0x97, 0x5F, 0x11, 0x4F, 0xCE, - 0x4F, 0xB9, 0xBB, 0xA2, 0x01, 0x51, 0x48, 0x5A, 0x2C, 0x52, - 0xAD, 0x58, 0x00, 0x22, 0x41, 0x4D, 0x24, 0x68, 0x9F, 0xD9, - 0x13, 0x5C, 0x55, 0x0A, 0x62, 0xAD, 0x3E, 0x29, 0x86, 0x34, - 0x3B, 0x2D, 0x34, 0xBE, 0x0A, 0xDB, 0x85, 0x3A, 0x41, 0x2C, - 0x30, 0x56, 0x65, 0x04, 0x0A, 0x20, 0x31, 0x2A, 0xF3, 0x88, - 0x4C, 0x38, 0x64, 0x86, 0x14, 0x06, 0xF5, 0xF0, 0x7F, 0x63, - 0xC1, 0x87, 0x24, 0x39, 0xFB, 0xC0, 0xC2, 0x6B, 0x57, 0xB3, - 0xA9, 0x7C, 0x21, 0xD7, 0x17, 0xB5, 0x23, 0x89, 0x8B, 0x9A, - 0x53, 0xC6, 0x26, 0xD6, 0xC1, 0xD8, 0x3B, 0xD2, 0x30, 0x0B, - 0x30, 0x76, 0xB3, 0x21, 0x2B, 0xCF, 0x64, 0xB8, 0xCD, 0x8C, - 0xB9, 0x33, 0x73, 0xA5, 0x19, 0x5C, 0xBB, 0x4A, 0x6F, 0x9E, - 0xA7, 0x62, 0x61, 0x1C, 0x32, 0xBB, 0x3E, 0x1B, 0x8A, 0xAC, - 0xE5, 0xE1, 0xA9, 0xDD, 0x50, 0xFB, 0x3B, 0xCF, 0xB6, 0x49, - 0x7B, 0xED, 0x1A, 0x7E, 0x8E, 0x73, 0xAE, 0x8B, 0x31, 0x06, - 0x11, 0xC4, 0x84, 0x4C, 0xCA, 0x6D, 0x5A, 0x79, 0x50, 0x2E, - 0x66, 0x90, 0x0A, 0x13, 0x86, 0x15, 0x78, 0x06, 0xAD, 0x5D, - 0x8C, 0x5E, 0xC8, 0x73, 0xB0, 0x82, 0xFB, 0x03, 0xE6, 0x30, - 0xE7, 0x0B, 0x99, 0xF0, 0xD9, 0x8C, 0x2C, 0xFA, 0x34, 0xAB, - 0x8B, 0xDD, 0x06, 0x2F, 0x39, 0xE0, 0x53, 0x37, 0x61, 0x3D, - 0xC3, 0x77, 0x4C, 0x9F, 0x66, 0x95, 0x81, 0x94, 0x0A, 0xE5, - 0xCE, 0x59, 0xA1, 0x83, 0x5C, 0x77, 0xBD, 0xF5, 0xAD, 0xE2, - 0x9C, 0x10, 0x64, 0x22, 0xAD, 0x99, 0x02, 0x3F, 0x6A, 0xB2, - 0x96, 0x2C, 0xF3, 0x21, 0xEB, 0x5A, 0x7D, 0xFC, 0x02, 0x9B, - 0x53, 0x94, 0xB1, 0x88, 0x3E, 0x07, 0x78, 0x31, 0x8F, 0xDF, - 0xDA, 0xAF, 0xB7, 0x55, 0xC9, 0x30, 0x74, 0x61, 0xD1, 0x75, - 0x15, 0xF1, 0x29, 0xB0, 0x8B, 0xD9, 0x19, 0xB3, 0x2E, 0x8C, - 0x3C, 0x4C, 0xED, 0x22, 0x0B, 0x07, 0xEC, 0xA8, 0x2B, 0x26, - 0xBA, 0x2A, 0xE3, 0xEB, 0x91, 0x2C, 0xDF, 0x28, 0xFD, 0xE3, - 0x12, 0x6D, 0xA8, 0x8C, 0xA9, 0xA0, 0x18, 0xAE, 0x18, 0xC4, - 0x05, 0x53, 0xF6, 0xF7, 0x69, 0xEF, 0xBB, 0xF8, 0xFF, 0x55, - 0xD9, 0x4E, 0xA0, 0xC9, 0x58, 0x38, 0x67, 0x31, 0xE7, 0x5C, - 0x46, 0x41, 0x58, 0x26, 0x48, 0x8C, 0x82, 0x91, 0xE4, 0x46, - 0x91, 0xE0, 0xA4, 0x4F, 0xA5, 0xFD, 0x28, 0x14, 0xC8, 0x07, - 0x73, 0xB9, 0x20, 0x7D, 0x94, 0xAF, 0xDC, 0xBF, 0x4A, 0x55, - 0xA8, 0x82, 0xBF, 0x6D, 0x22, 0xD2, 0xFF, 0x18, 0x5E, 0xFB, - 0xC4, 0xDE, 0x8B, 0x12, 0x58, 0x1E, 0x05, 0x51, 0x4A, 0x31, - 0x54, 0x26, 0xA5, 0xFD, 0x36, 0xED, 0x14, 0x80, 0x4E, 0x3F, - 0xB2, 0x4F, 0x43, 0x70, 0xAF, 0x63, 0x77, 0x86, 0x68, 0xF4, - 0x35, 0xC2, 0x4E, 0x57, 0x43, 0x63, 0x06, 0x07, 0x21, 0xCE, - 0x61, 0xDD, 0x5D, 0x1D, 0xA3, 0xF7, 0x24, 0x72, 0xED, 0x73, - 0x6A, 0xA0, 0xE6, 0x9C, 0x1A, 0xA3, 0xCF, 0x98, 0x47, 0xC2, - 0xE1, 0x29, 0x22, 0x1B, 0x7C, 0x14, 0x0E, 0xE2, 0x6B, 0x58, - 0x54, 0xA7, 0x3E, 0x0F, 0x07, 0x1D, 0xAB, 0xFD, 0x1C, 0x1E, - 0xE0, 0x24, 0xCB, 0x2B, 0xC8, 0x7D, 0x90, 0x83, 0x8D, 0x46, - 0x43, 0xB4, 0x30, 0x39, 0x26, 0x29, 0xEE, 0xAF, 0x67, 0x61, - 0x4C, 0x16, 0xF1, 0xF4, 0x01, 0x55, 0x71, 0x30, 0x1B, 0x18, - 0xC2, 0xF3, 0x8A, 0x26, 0x52, 0x63, 0xD0, 0xEA, 0x66, 0x04, - 0xD7, 0xCC, 0x09, 0xF1, 0x66, 0x62, 0xD1, 0x29, 0xFD, 0xCE, - 0x0A, 0x85, 0xD5, 0x2C, 0x5B, 0x0D, 0xC3, 0x53, 0x8F, 0x45, - 0xA1, 0x95, 0xEE, 0xAF, 0xC3, 0xC5, 0xEE, 0xE6, 0xCE, 0x4A, - 0x33, 0xDB, 0x8B, 0x29, 0x79, 0xBC, 0xF7, 0xC5, 0x33, 0xCD, - 0xC1, 0x74, 0x25, 0x69, 0xEC, 0x75, 0xA4, 0x05, 0x1D, 0x6D, - 0x6E, 0xEC, 0x77, 0xDC, 0xF9, 0x08, 0xB1, 0xFA, 0x38, 0x7F, - 0x8E, 0xDF, 0x74, 0x10, 0x27, 0x19, 0x52, 0xAB, 0x6B, 0x08, - 0xEB, 0x51, 0x22, 0xE7, 0x79, 0xDA, 0x9F, 0xC0, 0xD2, 0x5E, - 0x5C, 0x2A, 0xC7, 0xF8, 0x6B, 0xB6, 0x63, 0x06, 0x49, 0xB4, - 0xDD, 0xEB, 0x20, 0x6F, 0x5A, 0x5E, 0x78, 0x79, 0xA5, 0xAF, - 0x35, 0x6D, 0x36, 0xBA, 0xA4, 0x38, 0x98, 0x38, 0xD9, 0x59, - 0x81, 0x16, 0x8C, 0xCE, 0x78, 0xCA, 0xD1, 0x86, 0x8B, 0x3A, - 0xD9, 0xA5, 0x5B, 0x7C, 0x53, 0x24, 0xB8, 0xD2, 0x2B, 0x09, - 0x73, 0x04, 0x87, 0x3E, 0x39, 0x64, 0x42, 0x5A, 0xE1, 0xC8, - 0x72, 0xD5, 0x00, 0x06, 0x06, 0x81, 0x91, 0x7A, 0x12, 0xA1, - 0x91, 0xEC, 0xBF, 0xD6, 0xBC, 0xFD, 0x82, 0xDA, 0xEE, 0x3A, - 0xB7, 0xF1, 0x54, 0xE3, 0xBD, 0xE5, 0xC0, 0x18, 0xE9, 0x5C, - 0x49, 0x0C, 0xFA, 0x64, 0x80, 0x98, 0x5C, 0x44, 0x9B, 0x4A, - 0x48, 0x3E, 0x0C, 0xBE, 0x5E, 0xBB, 0x68, 0xDA, 0x09, 0xD7, - 0x00, 0x51, 0x5B, 0x13, 0x96, 0xC2, 0x8A, 0xCE, 0xB0, 0x8F, - 0xDF, 0x84, 0x77, 0x70, 0x4B, 0x0F, 0x6E, 0xC7, 0x62, 0x47, - 0xFA, 0xA8, 0x35, 0x18, 0x43, 0x93, 0x4C, 0x83, 0x13, 0x45, - 0x74, 0x76, 0x19, 0xA7, 0x71, 0x98, 0x8C, 0x2E, 0xFC, 0xA9, - 0x83, 0x64, 0xD1, 0xA3, 0x95, 0x33, 0x31, 0xDB, 0xA8, 0xC3, - 0xB9, 0x72, 0x80, 0x58, 0xEC, 0xEB, 0xFC, 0xF3, 0x03, 0x44, - 0xDC, 0x11, 0x06, 0x3A, 0x95, 0x81, 0x28, 0xDB, 0xAB, 0x36, - 0xC4, 0x37, 0x0C, 0xD4, 0x6B, 0xAF, 0x04, 0xD0, 0x23, 0x3F, - 0xDD, 0x08, 0x88, 0x06, 0x23, 0x39, 0xCF, 0xB2, 0xCF, 0x13, - 0x27, 0xE1, 0x4E, 0x21, 0xDA, 0x81, 0x58, 0x29, 0x70, 0x2B, - 0x26, 0xB7, 0xA7, 0x69, 0xA1, 0x86, 0xBC, 0xD9, 0x88, 0xED, - 0x70, 0x61, 0x94, 0x2D, 0xCD, 0x47, 0x57, 0xD0, 0xBD, 0x07, - 0x05, 0x7E, 0xA5, 0x35, 0x29, 0x15, 0xFA, 0x62, 0x7E, 0xB7, - 0x2A, 0xEB, 0x4F, 0xC4, 0x0D, 0x6D, 0x2E, 0x6D, 0x8F, 0x53, - 0x7C, 0x0B, 0x62, 0x72, 0xA5, 0x01, 0x5D, 0xD9, 0x52, 0xAF, - 0x60, 0x22, 0x90, 0xD0, 0xE6, 0x37, 0x25, 0x57, 0x73, 0x66, - 0xD5, 0x96, 0x6A, 0x23, 0x75, 0x43, 0xF7, 0x6A, 0xC8, 0x3E, - 0xAC, 0x20, 0xC8, 0x8A, 0xE3, 0xD1, 0xB4, 0x07, 0x87, 0x8E, - 0x3A, 0xEB, 0x43, 0x10, 0x91, 0x7F, 0x17, 0x96, 0x4B, 0x7A, - 0x31, 0x2A, 0x84, 0xFC, 0xFE, 0xB1, 0x26, 0x67, 0xD6, 0xAD, - 0xB8, 0xB7, 0x3D, 0x3A, 0x2F, 0xEE, 0x94, 0x2F, 0x05, 0xF1, - 0xD8, 0x8E, 0xD4, 0x97, 0xAF, 0x36, 0xCE, 0x01, 0x18, 0x0B, - 0x68, 0x41, 0x26, 0xEB, 0x38, 0x2B, 0xF6, 0xD2, 0x8A, 0x5A, - 0x79, 0x02, 0xA1, 0xE4, 0x49, 0x48, 0xCF, 0x55, 0x2B, 0x74, - 0x16, 0x63, 0x27, 0x9D, 0x25, 0xAA, 0x7F, 0x8A, 0x5D, 0x96, - 0x68, 0xF3, 0x58, 0x7C, 0x10, 0xCF, 0x6A, 0xE3, 0xE2, 0x80, - 0x90, 0xD3, 0x39, 0xF5, 0x62, 0x01, 0x33, 0x5F, 0xC2, 0xFD, - 0xAD, 0xE6, 0x2A, 0xB2, 0x3D, 0x89, 0x99, 0x7B, 0x17, 0x35, - 0xE4, 0x5C, 0x62, 0x10, 0x69, 0x10, 0x93, 0x57, 0x92, 0x15, - 0x53, 0xEC, 0x82, 0x17, 0x00, 0xFC, 0x13, 0x49, 0x58, 0x79, - 0x90, 0x36, 0x0D, 0x50, 0xA5, 0xFE, 0xAE, 0xE1, 0xB3, 0xAF, - 0x40, 0x98, 0x3C, 0xB7, 0xAB, 0xC9, 0x0B, 0x2B, 0xE8, 0x31, - 0x71, 0x0D, 0x47, 0xE1, 0xE0, 0x3D, 0xCB, 0xB0, 0x3E, 0x44, - 0x00, 0x18, 0x66, 0xD5, 0x44, 0xEF, 0x58, 0x6A, 0xC3, 0x98, - 0x86, 0x19, 0xBA, 0xCE, 0x24, 0xF0, 0x9A, 0xED, 0x55, 0xA9, - 0x1F, 0x52, 0xB2, 0xBA, 0x1A, 0x2C, 0x71, 0x9F, 0xD7, 0xE6, - 0xA1, 0x01, 0x64, 0x8B, 0x22, 0x22, 0x23, 0xC8, 0x2A, 0xBA, - 0x13, 0x5A, 0xDD, 0xC4, 0x0C, 0x1A, 0x3C, 0x4F, 0x1E, 0x0B, - 0x5B, 0xB5, 0x45, 0xA3, 0xDD, 0x4D, 0xE9, 0x00, 0x06, 0x60, - 0x59, 0xFC, 0x48, 0xB2, 0x3E, 0x32, 0xBF, 0xF8, 0x74, 0x4E, - 0x65, 0x9F, 0x89, 0x8D, 0xE4, 0x0C, 0xC1, 0x89, 0xCF, 0x19, - 0xF0, 0xBC, 0x75, 0xDC, 0xE4, 0xEA, 0x23, 0x18, 0x23, 0xC2, - 0xD2, 0xA4, 0x96, 0xA6, 0xC2, 0x73, 0x41, 0x1E, 0xD8, 0x9D, - 0x02, 0x02, 0x35, 0x16, 0x61, 0x9B, 0x6F, 0xCC, 0x16, 0x80, - 0x2B, 0xA5, 0xE2, 0x9B, 0x63, 0x9B, 0x4E, 0x75, 0xBD, 0xBD, - 0xF3, 0x36, 0x16, 0x53, 0x6B, 0x34, 0x33, 0xF4, 0xBC, 0x05, - 0x79, 0x8A, 0x1F, 0x23, 0xD8, 0x36, 0xCC, 0xDB, 0x37, 0x5A, - 0x1E, 0xCE, 0x6D, 0x27, 0x7B, 0x6C, 0x66, 0x11, 0xE3, 0x96, - 0xAD, 0xC3, 0xF9, 0x57, 0xF9, 0xA7, 0x4C, 0x4F, 0x8E, 0x97, - 0x70, 0xB1, 0x70, 0xE9, 0x77, 0xF0, 0xC2, 0xD0, 0x79, 0x12, - 0x79, 0x3F, 0xDB, 0x71, 0x66, 0x48, 0xDB, 0x5A, 0xFC, 0xA7, - 0x8E, 0xE4, 0x1A, 0x93, 0xFE, 0x49, 0xF5, 0x7D, 0xEF, 0xC4, - 0x4B, 0xC1, 0x10, 0x2A, 0xD6, 0xF0, 0x5D, 0xC4, 0x80, 0x8B, - 0x9C, 0x2E, 0x44, 0xFB, 0x71, 0xD3, 0xA3, 0x80, 0xFB, 0x77, - 0x60, 0x16, 0xAD, 0x0B, 0xEC, 0x75, 0x9A, 0x58, 0x4B, 0x6E, - 0xD8, 0xFD, 0xE9, 0x41, 0x46, 0x85, 0x43, 0xFD, 0x82, 0x53, - 0x51, 0x65, 0xF8, 0xD0, 0x26, 0x2B, 0xF2, 0xF9, 0xE9, 0x26, - 0xD7, 0x15, 0x84, 0x31, 0x80, 0xAE, 0xFD, 0xA5, 0x30, 0x65, - 0xEE, 0x52, 0xCA, 0x3C, 0x76, 0x16, 0x91, 0x5A, 0x26, 0x49, - 0x1A, 0x28, 0xC7, 0x81, 0x10, 0x95, 0xB8, 0x96, 0x09, 0x50, - 0x6D, 0xB1, 0x64, 0xA2, 0x87, 0xCF, 0x38, 0x3C, 0x3C, 0x6E, - 0x0B, 0x96, 0x97, 0xFC, 0x81, 0xBD, 0x7D, 0xE7, 0xCC, 0xB6, - 0xF7, 0xE8, 0x15, 0x05, 0xAF, 0xDE, 0x1C, 0x68, 0xC0, 0xCF, - 0xF8, 0x68, 0x94, 0x90, 0x7B, 0x7D, 0x98, 0x57, 0xDC, 0x86, - 0x6D, 0x69, 0xD6, 0x98, 0x62, 0x0F, 0x38, 0x99, 0x93, 0x99, - 0x55, 0xD6, 0xA5, 0x8C, 0x94, 0x62, 0xCB, 0xD9, 0xE8, 0xA4, - 0x7C, 0xDF, 0x21, 0xF4, 0x36, 0x65, 0xCF, 0x3F, 0xE4, 0x10, - 0xA5, 0xB4, 0x71, 0x08, 0x65, 0x98, 0x59, 0x70, 0x19, 0x7E, - 0x27, 0x13, 0x71, 0x3F, 0xD2, 0x91, 0x20, 0xFF, 0x53, 0xDB, - 0xD2, 0xD4, 0x07, 0x3A, 0x49, 0x72, 0x05, 0x66, 0xED, 0x7D, - 0xBC, 0x61, 0x70, 0x7F, 0x64, 0x41, 0xDD, 0xB3, 0x1B, 0x03, - 0xB8, 0x20, 0xE1, 0x5D, 0x07, 0x39, 0xFC, 0xD2, 0x30, 0x72, - 0xE8, 0x0F, 0xA7, 0xA2, 0x71, 0xE8, 0x3D, 0xD9, 0x2B, 0x5B, - 0xB4, 0x97, 0x2B, 0xC3, 0x58, 0xE1, 0x2B, 0x0F, 0xAA, 0x8C, - 0x5A, 0x72, 0xC7, 0xBB, 0xB6, 0x59, 0x2B, 0x73, 0x39, 0x9A, - 0x20, 0xE5, 0x9A, 0x70, 0x30, 0x7B, 0x28, 0xBE, 0xD6, 0x6A, - 0x04, 0x18, 0x41, 0xEF, 0x18, 0xCD, 0xB5, 0x69, 0xB6, 0x00, - 0x50, 0xEE, 0xF9, 0x45, 0x2F, 0x86, 0xEE, 0x04, 0xBE, 0xF8, - 0x88, 0x9E, 0x0D, 0xAC, 0x1B, 0xA9, 0xD1, 0xC1, 0xA5, 0x3E, - 0xF6, 0xD9, 0x78, 0x99, 0x9D, 0x2E, 0x26, 0x6C, 0xCA, 0x7C, - 0x4C, 0xC7, 0xAF, 0xAB, 0xF0, 0xBB, 0x93, 0x32, 0x03, 0x22, - 0xAF, 0x27, 0x6A, 0x9F, 0x53, 0x77, 0xA9, 0x6C, 0x83, 0xA2, - 0x46, 0x15, 0x61, 0x6C, 0xB3, 0x08, 0x6F, 0x5B, 0x85, 0x73, - 0x8A, 0xCD, 0x8A, 0xB0, 0x70, 0xAC, 0xA5, 0x22, 0x18, 0x87, - 0x54, 0x91, 0x6B, 0x34, 0x7F, 0x0B, 0x4E, 0xCA, 0x44, 0xB3, - 0xBE, 0xB0, 0x77, 0x28, 0x85, 0x73, 0xDD, 0x29, 0x70, 0x53, - 0xD9, 0xA2, 0x4F, 0x12, 0xCB, 0x41, 0xFD, 0x99, 0x27, 0xC7, - 0xA9, 0xCF, 0xB7, 0x5B, 0xFB, 0xCC, 0x77, 0xBA, 0x12, 0xE1, - 0xD6, 0xF6, 0x7C, 0x22, 0xB4, 0xED, 0xB0, 0xA0, 0x71, 0x59, - 0xD2, 0xF3, 0x14, 0xB2, 0x7C, 0x4A, 0x0A, 0xD6, 0x43, 0x10, - 0xA0, 0xF6, 0xC0, 0x6F, 0xB4, 0x31, 0x8F, 0x7B, 0xF8, 0x5A, - 0xC9, 0x91, 0x0F, 0x7A, 0xE5, 0xDF, 0x29, 0x11, 0x66, 0xFF, - 0x4C, 0x73, 0xA6, 0xC7, 0xA0, 0xCC, 0x7B, 0x73, 0x79, 0x36, - 0x1D, 0x5E, 0x7C, 0xE2, 0xC9, 0xF7, 0x56, 0xC4, 0x88, 0x71, - 0xC1, 0x03, 0xEE, 0xE7, 0xE0, 0xEE, 0x12, 0xD7, 0x3D, 0x3A, - 0xB2, 0x91, 0x51, 0xE1, 0x18, 0xFE, 0x66, 0x22, 0x84, 0xA6, - 0xC3, 0xD2, 0x54, 0xE9, 0xE5, 0xF8, 0xDB, 0xF1, 0xF9, 0x6A, - 0x01, 0x61, 0xCF, 0x3D, 0xDA, 0x89, 0x5B, 0xED, 0x89, 0x10, - 0xBA, 0x18, 0xB8, 0xBA, 0x66, 0x38, 0x0D, 0x37, 0xEC, 0x1E, - 0xF7, 0x06, 0xD6, 0xC0, 0x84, 0x06, 0x2F, 0x43, 0xBD, 0x50, - 0xA0, 0x05, 0x9B, 0x50, 0xCD, 0xBB, 0xB7, 0x93, 0xF0, 0x70, - 0x50, 0xB7, 0x03, 0x0F, 0x27, 0x70, 0x47, 0x8E, 0xEB, 0x14, - 0xE0, 0x81, 0xBC, 0x7F, 0xA5, 0x60, 0xB0, 0x09, 0xCA, 0x38, - 0xCB, 0x59, 0x85, 0x49, 0xB3, 0xD4, 0x29, 0x50, 0xE1, 0x04, - 0xBD, 0x9F, 0x6C, 0xA5, 0x76, 0xCB, 0xE6, 0x79, 0xED, 0xDD, - 0xB8, 0x98, 0xA9, 0x94, 0xDD, 0xD3, 0x2E, 0xE0, 0xEA, 0xCD, - 0xD3, 0x34, 0xDA, 0x78, 0xBE, 0x7A, 0xC9, 0x8C, 0xD6, 0x12, - 0x5B, 0xD0, 0x36, 0x11, 0x79, 0x52, 0xCA, 0xA1, 0xCC, 0x3D, - 0x5B, 0x1F, 0x35, 0x80, 0xCC, 0x56, 0xDA, 0xC9, 0x88, 0xB7, - 0xD3, 0x28, 0x86, 0x6F, 0x4E, 0x20, 0x56, 0x56, 0x62, 0x12, - 0x79, 0xDA, 0x3F, 0x75, 0xEC, 0x89, 0xDC, 0x90, 0x44, 0xAE, - 0xB8, 0x0E, 0x34, 0x76, 0xF9, 0xAE, 0xDF, 0x2C, 0x28, 0x0F, - 0xCF, 0x28, 0x0B, 0x7B, 0x8A, 0xC4, 0x9B, 0x0B, 0x3C, 0x3E, - 0xC2, 0x70, 0x88, 0x71, 0xED, 0x3B, 0x3D, 0x61, 0x73, 0xDC, - 0x1B, 0x1A, 0x89, 0x16, 0xE2, 0x36, 0x50, 0x96, 0x38, 0x44, - 0xB1, 0xB6, 0x23, 0xB1, 0x83, 0x51, 0x43, 0x7C, 0x37, 0x9C, - 0x83, 0xDB, 0x63, 0x3E, 0x02, 0x42, 0xFA, 0xE9, 0x0B, 0x22, - 0xCB, 0xA5, 0x1F, 0x09, 0x03, 0x1C, 0xD0, 0xAD, 0xCB, 0xEE, - 0xB5, 0x3F, 0xFC, 0xCD, 0x80, 0x04, 0x63, 0x44, 0x4F, 0x3F, - 0x2B, 0x17, 0x66, 0xE0, 0xA7, 0x1E, 0xA2, 0xB5, 0xE3, 0xD3, - 0x23, 0x76, 0xF9, 0x75, 0x7C, 0x39, 0x5C, 0x6A, 0x64, 0xF8, - 0x61, 0xDE, 0x66, 0x3F, 0xCD, 0x4F, 0x06, 0xEF, 0x9C, 0xCA, - 0x43, 0xA9, 0x32, 0x30, 0xDC, 0xB8, 0xA2, 0xE0, 0xAA, 0xEB, - 0x4D, 0x30, 0x8D, 0x0C, 0xD1, 0x5E, 0x04, 0xEE, 0xED, 0x46, - 0x07, 0x9C, 0xF4, 0xD8, 0xD5, 0x78, 0x9A, 0x51, 0x93, 0xC6, - 0x95, 0x5C, 0x12, 0x48, 0x2B, 0x92, 0x7A, 0xE4, 0x57, 0x3D, - 0x37, 0xEC, 0xA0, 0x19, 0xEC, 0x0A, 0x45, 0x0B, 0xFE, 0x9F, - 0x5F, 0xA0, 0xB3, 0x05, 0xEE, 0xF9, 0x87, 0x76, 0x5C, 0xC1, - 0xAD, 0x92, 0x79, 0x50, 0xAC, 0x70, 0xB6, 0xE8, 0xBB, 0x7C, - 0xCA, 0xC2, 0x49, 0xAD, 0xB0, 0xDA, 0xD0, 0x28, 0x90, 0xC2, - 0xEE, 0x3D, 0x4C, 0xCD, 0xC8, 0x41, 0x89, 0x5C, 0x65, 0xB9, - 0x1C, 0xCA, 0x67, 0x7B, 0xEF, 0x0D, 0x7B, 0x69, 0x4B, 0x8E, - 0x51, 0x0D, 0xF7, 0x70, 0xB7, 0xB3, 0x4E, 0xC8, 0x87, 0x8D, - 0xD1, 0xDD, 0x20, 0x11, 0x3C, 0x34, 0xA3, 0x3B, 0x6F, 0xDD, - 0xF5, 0xB2, 0xB1, 0x21, 0x9A, 0xE0, 0x4A, 0xF0, 0xB9, 0xEB, - 0x64, 0xDB, 0xC6, 0xD6, 0x64, 0x8F, 0x1A, 0x2C, 0x40, 0x0A, - 0x24, 0xF4, 0x0C, 0x0F, 0x60, 0x04, 0xBA, 0x9D, 0x3A, 0xE7, - 0x05, 0x58, 0xB5, 0x29, 0xD4, 0xD3, 0x64, 0xED, 0xCE, 0x47, - 0x7B, 0xB0, 0x6E, 0xCC, 0x2F, 0x46, 0x3A, 0xFE, 0x11, 0xC6, - 0x6B, 0x91, 0x51, 0x6A, 0x17, 0xCD, 0x03, 0x35, 0x0E, 0x1C, - 0x0E, 0x8B, 0xDD, 0x46, 0x4F, 0x5D, 0x9A, 0x5C, 0xE1, 0x14, - 0x99, 0xE8, 0xF2, 0xA4, 0xED, 0xCF, 0x6F, 0xC6, 0xC1, 0x67, - 0x36, 0x49, 0x1F, 0x1E, 0x42, 0x92, 0x4D, 0x32, 0x05, 0x4E, - 0xA6, 0xD7, 0xC0, 0xEC, 0xB0, 0x3E, 0xFD, 0xA1, 0xA7, 0x08, - 0x6B, 0xE8, 0x7F, 0xCD, 0xF8, 0x3C, 0x53, 0x58, 0x4C, 0x97, - 0xE6, 0x8D, 0xFE, 0xA9, 0x49, 0x61, 0xD1, 0xF0, 0xA0, 0xC7, - 0xB4, 0x4F, 0xBE, 0xDD, 0x90, 0x92, 0x0B, 0xA0, 0x5E, 0x69, - 0xAC, 0xDA, 0x26, 0x99, 0xF8, 0xE3, 0x07, 0xB5, 0xB9, 0xB7, - 0x48, 0xC7, 0xA3, 0x64, 0x3E, 0xA0, 0xB6, 0xC1, 0xF8, 0x6E, - 0x23, 0xA3, 0x11, 0x52, 0xA8, 0x26, 0xBD, 0x1C, 0xAD, 0xEB, - 0xF7, 0xDF, 0xC6, 0x35, 0xB4, 0x92, 0xE5, 0xB0, 0x5B, 0x53, - 0x55, 0xAA, 0x6E, 0xAD, 0x36, 0x4B, 0xF0, 0xE5, 0x9E, 0x32, - 0xB6, 0xFF, 0x1C, 0x01, 0x35, 0x20, 0x5E, 0xAD, 0x3E, 0xA3, - 0x01, 0x5D, 0xA0, 0xC5, 0x1B, 0xC8, 0x69, 0xB8, 0xF2, 0x2B, - 0x2B, 0x69, 0xC4, 0x4E, 0xA3, 0xC6, 0x1C, 0xFE, 0xCC, 0x0C, - 0x79, 0x6E, 0xDD, 0xD4, 0x59, 0x93, 0x51, 0xA2, 0x41, 0x3A, - 0x7A, 0x7D, 0x19, 0x5C, 0x1A, 0x91, 0x3C, 0x68, 0x00, 0x42, - 0x58, 0x51, 0x26, 0x11, 0x1A, 0x1E, 0xDE, 0x3B, 0x64, 0x16, - 0xBC, 0xDC, 0x5A, 0xF7, 0x7E, 0x80, 0x04, 0x63, 0xED, 0xDB, - 0x68, 0x74, 0xC2, 0x6B, 0x36, 0x67, 0xFC, 0x81, 0xB3, 0x64, - 0xBC, 0xAC, 0xA4, 0x56, 0x55, 0x77, 0x86, 0x74, 0xE2, 0x68, - 0x02, 0xD5, 0x5A, 0x84, 0x8F, 0x0E, 0x7F, 0xA1, 0xE9, 0xA5, - 0x30, 0xEB, 0xB4, 0x3E, 0x31, 0x09, 0x7F, 0xE2, 0x21, 0x35, - 0x4F, 0xFA, 0x61, 0xD2, 0x42, 0xB5, 0xCC, 0x31, 0xDE, 0x9C, - 0xDD, 0x39, 0x71, 0x90, 0x69, 0x9C, 0xF3, 0x7B, 0x91, 0xB1, - 0x65, 0x44, 0x10, 0xEC, 0x5C, 0x31, 0xF5, 0xA5, 0x37, 0xFF, - 0x52, 0xDF, 0x21, 0x85, 0x8A, 0x08, 0x77, 0xD7, 0xEE, 0xCC, - 0xD8, 0x58, 0xEF, 0x5B, 0xDD, 0x12, 0xC0, 0x4E, 0xC2, 0x20, - 0xAD, 0x5E, 0x74, 0x37, 0xE0, 0x70, 0x1B, 0xBA, 0xA3, 0x84, - 0x39, 0x2C, 0x4F, 0x63, 0x77, 0x69, 0x6C, 0x60, 0x69, 0x00, - 0xF0, 0xCE, 0x19, 0x29, 0x62, 0xDA, 0x10, 0xD9, 0x15, 0x79, - 0xC5, 0x2B, 0xB0, 0xB3, 0x97, 0x8C, 0x98, 0x83, 0x9F, 0x25, - 0x3F, 0x56, 0x1F, 0x2C, 0x63, 0x77, 0xFA, 0xDB, 0x27, 0xDF, - 0x94, 0xAE, 0x08, 0x44, 0x75, 0x8A, 0xE8, 0x91, 0x72, 0xB0, - 0xD0, 0x93, 0xC5, 0x7B, 0xB1, 0xD0, 0xEB, 0xD8, 0xDD, 0x88, - 0x29, 0xF8, 0x36, 0xE7, 0x7C, 0xFD, 0x88, 0xFE, 0xA1, 0xEE, - 0x12, 0x9A, 0x0E, 0x84, 0x75, 0x15, 0xA8, 0xA0, 0xD7, 0xBC, - 0x72, 0x75, 0x7D, 0x4E, 0xDF, 0xEE, 0x30, 0x30, 0x23, 0x6D, - 0xCC, 0xE5, 0xD7, 0xFD, 0x11, 0xE0, 0x87, 0x65, 0xDE, 0xAA, - 0xF4, 0x2C, 0x64, 0x74, 0x1A, 0x0C, 0x7A, 0x0A, 0x5B, 0x85, - 0xF3, 0x35, 0xB8, 0x41, 0x27, 0x14, 0xFC, 0x2A, 0x8D, 0x28, - 0xD0, 0xA7, 0xDB, 0xB0, 0xD9, 0x5A, 0xA9, 0x0F, 0x0B, 0x2F, - 0xE0, 0x8E, 0x37, 0x82, 0x5E, 0x8E, 0x1E, 0x2F, 0xC2, 0xA6, - 0xF5, 0x89, 0x54, 0x77, 0x49, 0x49, 0xDC, 0xF4, 0x03, 0xF2, - 0x04, 0xD6, 0xC0, 0x43, 0xB1, 0x13, 0x2B, 0x0C, 0xC2, 0x14, - 0x93, 0x5A, 0x90, 0x20, 0x87, 0xA0, 0x4A, 0xB2, 0xD7, 0x25, - 0x81, 0x79, 0x3C, 0x9C, 0xF6, 0x92, 0xBB, 0x26, 0xB0, 0x25, - 0x93, 0x05, 0x60, 0xEC, 0x56, 0x3C, 0x92, 0x41, 0x63, 0x52, - 0x0F, 0x95, 0x06, 0x7D, 0xE8, 0x46, 0x90, 0x39, 0x69, 0xEA, - 0x6B, 0xA6, 0x64, 0x09, 0x7B, 0x2F, 0x34, 0xE0, 0x21, 0x29, - 0xDA, 0xE3, 0xCF, 0xFE, 0xA7, 0x8E, 0x14, 0x3A, 0xD7, 0x53, - 0x26, 0xD7, 0x82, 0x0E, 0x2A, 0x00, 0x43, 0xEB, 0x6A, 0x23, - 0x75, 0x28, 0xD0, 0x9B, 0x85, 0xE0, 0xFB, 0x14, 0x19, 0xF3, - 0x6A, 0x73, 0x6C, 0x97, 0x0E, 0x21, 0xFC, 0x0F, 0x26, 0xC5, - 0xCE, 0xB7, 0xC6, 0x59, 0xA2, 0xE6, 0x4C, 0xF4, 0xC7, 0xBB, - 0x9B, 0xA8, 0xFA, 0x12, 0xC7, 0xDA, 0x33, 0x26, 0x69, 0x83, - 0x49, 0xA8, 0x0A, 0x3E, 0xF0, 0xD4 +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ + +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + +static const unsigned char bench_dilithium_level3_pubkey[] = { + 0x15, 0xc9, 0xe5, 0x53, 0x2f, 0xd8, 0x1f, 0xb4, 0xa3, 0x9f, + 0xae, 0xad, 0xb3, 0x10, 0xd0, 0x72, 0x69, 0xd3, 0x02, 0xf3, + 0xdf, 0x67, 0x5a, 0x31, 0x52, 0x19, 0xca, 0x39, 0x27, 0x77, + 0x61, 0x6d, 0x0f, 0xc1, 0x33, 0x26, 0x09, 0xf0, 0xf9, 0x4d, + 0x12, 0x7a, 0xef, 0xf7, 0x21, 0x26, 0x2c, 0xe0, 0xe2, 0x92, + 0x1f, 0x9d, 0xd1, 0xaa, 0xaf, 0x08, 0x14, 0xf2, 0xaa, 0x24, + 0x99, 0x0f, 0x20, 0x57, 0x35, 0x04, 0x32, 0x96, 0x8e, 0x6e, + 0x10, 0x64, 0xe3, 0xe3, 0x57, 0x26, 0x33, 0x32, 0x7b, 0xe4, + 0x18, 0x41, 0x77, 0xd3, 0x24, 0x63, 0x3d, 0x11, 0xea, 0xdc, + 0xbe, 0x59, 0xff, 0x8d, 0xc2, 0xe4, 0xc7, 0x04, 0xf3, 0xd4, + 0xe0, 0x1d, 0x5e, 0x09, 0x46, 0xbf, 0x02, 0x05, 0xc7, 0xa6, + 0xb7, 0x82, 0x40, 0x1f, 0x55, 0xe9, 0x77, 0x82, 0xc0, 0xcc, + 0x86, 0x99, 0x19, 0x99, 0xa2, 0xc9, 0x1b, 0x4f, 0xdd, 0x49, + 0x4c, 0x78, 0x0a, 0x58, 0xb8, 0xf0, 0x23, 0xac, 0x1a, 0x71, + 0x57, 0x6d, 0xd6, 0x3a, 0x3a, 0x6f, 0x93, 0xb3, 0x2b, 0x09, + 0xbe, 0xec, 0x7b, 0x5b, 0xf7, 0x3a, 0xed, 0xf9, 0xd0, 0xb1, + 0xfe, 0x9f, 0x9b, 0xec, 0x11, 0xb6, 0x6b, 0xd1, 0xb6, 0x00, + 0x72, 0x7f, 0x68, 0x9a, 0x61, 0xa5, 0xf5, 0x6e, 0xe9, 0x46, + 0xa4, 0x82, 0x08, 0x9f, 0x50, 0x4c, 0x75, 0xc3, 0x48, 0x85, + 0x76, 0x39, 0xea, 0x0c, 0xf2, 0xe8, 0x7e, 0x48, 0x69, 0xd9, + 0x6f, 0x9a, 0x89, 0x7d, 0x98, 0xc1, 0x16, 0xdc, 0x2f, 0xc7, + 0x0a, 0x11, 0xa8, 0xbb, 0xe7, 0x91, 0xb1, 0x0f, 0x0e, 0xf0, + 0xb4, 0xc8, 0x41, 0x7e, 0x62, 0x9e, 0x3c, 0x30, 0x4c, 0xbc, + 0x4c, 0xeb, 0x37, 0xaf, 0x48, 0x72, 0x59, 0x64, 0x8e, 0xfb, + 0x77, 0x11, 0x28, 0xdd, 0x30, 0x52, 0x8e, 0x69, 0x8c, 0x9f, + 0x3d, 0xec, 0xdf, 0xa7, 0x5f, 0x42, 0x18, 0xda, 0xba, 0x1a, + 0x96, 0x91, 0x7d, 0x62, 0xd5, 0x52, 0xff, 0x44, 0xc9, 0x1d, + 0x29, 0xa6, 0xb9, 0x03, 0x9a, 0x26, 0x26, 0xcf, 0x57, 0x40, + 0x70, 0x7e, 0x2b, 0xbd, 0xf0, 0x81, 0x71, 0x0f, 0x0b, 0x2e, + 0x9b, 0x03, 0xba, 0x31, 0x41, 0x68, 0x37, 0xc8, 0xff, 0xea, + 0xc4, 0x73, 0xa5, 0xf9, 0xc2, 0x92, 0x78, 0x0c, 0xe7, 0xfd, + 0x5d, 0xb2, 0x01, 0xb5, 0x8d, 0xeb, 0x64, 0xd4, 0x14, 0xea, + 0x7a, 0xd1, 0x42, 0xc8, 0x99, 0xe4, 0x7d, 0x5b, 0x7e, 0x3b, + 0x8f, 0xab, 0x82, 0x12, 0xdf, 0xbb, 0xa1, 0x45, 0x30, 0xc9, + 0x0f, 0xb9, 0xe5, 0xba, 0xe6, 0x8a, 0xf3, 0x78, 0x61, 0xcc, + 0x9f, 0xe1, 0x46, 0x2a, 0x9a, 0x18, 0x0e, 0x2a, 0x57, 0xf3, + 0xe5, 0x56, 0xd1, 0x42, 0x48, 0xe1, 0x5a, 0x8e, 0x33, 0xce, + 0x19, 0xe5, 0x3e, 0x7f, 0x00, 0x70, 0x9c, 0x4c, 0xd3, 0xe1, + 0x0c, 0xa1, 0x7e, 0xd4, 0xa9, 0x9e, 0x8b, 0xe2, 0xf0, 0xac, + 0xdb, 0xa6, 0x72, 0x75, 0x67, 0xa6, 0x57, 0xed, 0x79, 0x2e, + 0xca, 0x8d, 0xeb, 0x9b, 0x9e, 0xb7, 0xbf, 0x30, 0x02, 0x2b, + 0xb3, 0x43, 0x89, 0x9b, 0xa8, 0x88, 0xa5, 0xbb, 0x33, 0xd9, + 0x99, 0x30, 0x7c, 0xc7, 0xd4, 0x28, 0x5e, 0x5e, 0x3f, 0x9d, + 0x6d, 0x35, 0x75, 0x33, 0x8e, 0xff, 0x84, 0x2e, 0x2d, 0xda, + 0xf0, 0xff, 0x70, 0xe5, 0xb5, 0x62, 0x96, 0x33, 0x3a, 0xd9, + 0xb5, 0x82, 0x25, 0x81, 0x81, 0x40, 0x5d, 0x4f, 0x11, 0x86, + 0x63, 0x1a, 0x06, 0xc1, 0x67, 0xc7, 0x49, 0x03, 0xc7, 0xe4, + 0x6f, 0xb4, 0x13, 0x3e, 0x57, 0x62, 0xfd, 0x8a, 0xc6, 0x2b, + 0x65, 0x5b, 0xa4, 0x29, 0x57, 0x8d, 0xde, 0xa5, 0xee, 0x32, + 0xc2, 0x76, 0x03, 0xca, 0xce, 0xc1, 0x48, 0xec, 0x45, 0xcf, + 0x30, 0x21, 0x28, 0x7f, 0x10, 0x47, 0xd2, 0xdb, 0xee, 0xca, + 0x5b, 0x0f, 0xd5, 0x39, 0x3a, 0xc3, 0xa6, 0x78, 0xb2, 0x15, + 0xaf, 0x82, 0x3c, 0x2f, 0xc4, 0x51, 0x5c, 0x52, 0xad, 0xf2, + 0x89, 0x92, 0x8e, 0xf3, 0x50, 0x38, 0xed, 0xf8, 0xc9, 0x14, + 0x4c, 0xe4, 0xa3, 0x9a, 0xaf, 0xc4, 0x5c, 0xf3, 0x9f, 0xc3, + 0xa3, 0xc0, 0xbe, 0x45, 0x1b, 0x21, 0x63, 0xfa, 0xe0, 0xe0, + 0x91, 0x2b, 0x42, 0xca, 0x91, 0xfb, 0x5e, 0x97, 0x9a, 0x0a, + 0xd4, 0x88, 0xba, 0xb8, 0x22, 0xc6, 0xbf, 0x56, 0x58, 0x1e, + 0x92, 0xa9, 0x9d, 0xa7, 0xed, 0xc9, 0xab, 0x54, 0x4f, 0x75, + 0x8d, 0x42, 0xc1, 0xe1, 0x61, 0xd0, 0x91, 0x9a, 0x3a, 0x40, + 0x9a, 0xa3, 0xfb, 0x7b, 0x4e, 0xf0, 0x85, 0xf0, 0xdc, 0x40, + 0x72, 0x9f, 0x05, 0xa8, 0xbe, 0x95, 0x5a, 0x7f, 0xba, 0x75, + 0x00, 0x6e, 0x95, 0x76, 0xbd, 0xb2, 0x40, 0xf5, 0xb0, 0x64, + 0x0a, 0x2f, 0x06, 0x3d, 0x9f, 0xac, 0x6a, 0xa5, 0x46, 0x5a, + 0x85, 0xa4, 0x6f, 0xee, 0x27, 0xa0, 0xeb, 0x5f, 0x1f, 0x91, + 0xbd, 0x2b, 0x02, 0x16, 0xdf, 0x74, 0x97, 0x2c, 0xd0, 0xa8, + 0x9f, 0x3a, 0x7b, 0xdf, 0x3e, 0x98, 0x4a, 0x91, 0xdc, 0x19, + 0x96, 0x88, 0x75, 0x21, 0x1a, 0x6a, 0xa8, 0x4b, 0x1f, 0x35, + 0xd1, 0x92, 0xf5, 0x76, 0xf4, 0x72, 0x55, 0x13, 0xdb, 0x5d, + 0x07, 0x8d, 0xd9, 0x72, 0xe4, 0x75, 0xde, 0x80, 0xbc, 0xe9, + 0x9c, 0xf0, 0x5c, 0x6a, 0x8a, 0x0e, 0x34, 0xf6, 0x3f, 0x5c, + 0xef, 0x0e, 0xcc, 0x52, 0x38, 0x2d, 0x7b, 0xc2, 0x1b, 0x69, + 0x9f, 0xe5, 0xed, 0x14, 0xb0, 0x91, 0x0b, 0xe9, 0x4d, 0x34, + 0xd5, 0xaa, 0xd4, 0xd2, 0x46, 0x39, 0x45, 0x7e, 0x85, 0x2f, + 0xdb, 0x89, 0xf4, 0xff, 0x05, 0x74, 0x51, 0xba, 0xdd, 0xee, + 0xf6, 0xc2, 0xc1, 0x0a, 0x8f, 0xd9, 0xeb, 0xc7, 0x61, 0x30, + 0x8f, 0x86, 0x8b, 0x1f, 0x82, 0xc1, 0x22, 0xfd, 0x83, 0xf4, + 0x5d, 0xc5, 0x94, 0xf5, 0xd7, 0x17, 0xc7, 0x7b, 0x71, 0xf5, + 0x5e, 0x15, 0x49, 0x70, 0xb2, 0x57, 0xa0, 0xc0, 0x57, 0x63, + 0x53, 0x35, 0xb6, 0x52, 0x20, 0x7b, 0x83, 0xd4, 0x57, 0x63, + 0x25, 0x8e, 0x83, 0xb3, 0x8e, 0x26, 0x1f, 0x09, 0xde, 0x14, + 0xd6, 0xa6, 0xfc, 0xe5, 0x93, 0x3c, 0x88, 0x8e, 0xf5, 0x10, + 0x57, 0xb9, 0xc9, 0x9b, 0xff, 0x72, 0x9d, 0x3d, 0x3f, 0x97, + 0xd9, 0x3c, 0x20, 0xe2, 0x57, 0xfd, 0x2a, 0x5c, 0x17, 0x12, + 0xe6, 0x08, 0xaf, 0xe4, 0x26, 0x96, 0xb9, 0x6d, 0xc3, 0xac, + 0x22, 0xf3, 0x8b, 0x89, 0xde, 0xc7, 0x8a, 0x93, 0x06, 0xf7, + 0x1d, 0x08, 0x21, 0x36, 0x16, 0x74, 0x2b, 0x97, 0x23, 0xe4, + 0x79, 0x31, 0x08, 0x23, 0x62, 0x30, 0x67, 0xe2, 0xed, 0x30, + 0x9b, 0x0c, 0xf9, 0x08, 0x7a, 0x29, 0x73, 0xc6, 0x77, 0x8a, + 0xbb, 0x2a, 0x1c, 0x66, 0xd0, 0xdd, 0x9e, 0xa3, 0xe9, 0x62, + 0xcc, 0xb7, 0x88, 0x25, 0x4a, 0x5f, 0xbc, 0xaa, 0xe3, 0xe4, + 0x4f, 0xec, 0xa6, 0x8e, 0xa6, 0xa4, 0x1b, 0x22, 0x2b, 0x2c, + 0x8f, 0x57, 0x7f, 0xb7, 0x33, 0xfe, 0x16, 0x43, 0x85, 0xc5, + 0xd2, 0x95, 0xe6, 0xb9, 0x21, 0x68, 0x88, 0x98, 0x33, 0x8c, + 0x1d, 0x15, 0x9c, 0x4d, 0x62, 0x1f, 0x6b, 0xe8, 0x7a, 0x2d, + 0x6b, 0x0e, 0xc3, 0xde, 0x1a, 0xa8, 0xed, 0x67, 0xb3, 0xb3, + 0x36, 0x5b, 0x4b, 0xcb, 0xe8, 0xa8, 0x5c, 0x0b, 0x2f, 0xca, + 0xd7, 0x71, 0xe8, 0x85, 0xe7, 0x4d, 0xe5, 0x7b, 0x45, 0xed, + 0xb2, 0x4c, 0x69, 0x04, 0x7e, 0x4f, 0xc0, 0xef, 0x1a, 0xca, + 0x0d, 0xa6, 0xc4, 0x79, 0x15, 0x78, 0x9c, 0xd2, 0x91, 0x3c, + 0x32, 0x55, 0x40, 0xe7, 0xcb, 0x7e, 0xde, 0x07, 0xa6, 0x97, + 0x00, 0x2d, 0x70, 0xf6, 0x3d, 0x15, 0xdf, 0x29, 0x8e, 0xa3, + 0x96, 0x6d, 0xf2, 0xbb, 0xa5, 0x1b, 0x7b, 0x58, 0x30, 0xf6, + 0x17, 0xbd, 0xda, 0x13, 0xf7, 0x33, 0xc2, 0x62, 0x32, 0xd4, + 0x1c, 0x2e, 0x31, 0x74, 0x92, 0xad, 0x99, 0x8c, 0x0e, 0x7c, + 0x50, 0x21, 0xcd, 0xff, 0x41, 0xeb, 0xd1, 0xca, 0x14, 0xb7, + 0xb2, 0x31, 0x2f, 0xbe, 0x16, 0xce, 0x4f, 0x26, 0x16, 0x04, + 0xc2, 0xaf, 0xbe, 0x0d, 0x24, 0xab, 0x9a, 0x21, 0x37, 0x06, + 0xac, 0x50, 0x23, 0xf1, 0xbe, 0x5c, 0xbb, 0x64, 0xf3, 0xd3, + 0x66, 0xa3, 0xb8, 0xbe, 0x8b, 0x49, 0x8d, 0xf6, 0xc7, 0xb9, + 0x8f, 0x4e, 0x31, 0x06, 0x51, 0xe5, 0xf3, 0x0e, 0x56, 0xc4, + 0x24, 0x30, 0xf5, 0xe9, 0x36, 0x71, 0xbc, 0xc9, 0x70, 0x2c, + 0x6c, 0x4c, 0x15, 0x43, 0x44, 0xa4, 0xfc, 0xf1, 0xd2, 0x71, + 0x6c, 0x4c, 0xce, 0x30, 0x6c, 0x05, 0x7d, 0x2e, 0xb7, 0xbc, + 0xe4, 0x65, 0x76, 0x24, 0x75, 0x36, 0xdf, 0x28, 0xfc, 0xcd, + 0x9a, 0xba, 0xc2, 0xcd, 0xb0, 0x30, 0xdb, 0xe7, 0x2e, 0x3c, + 0x92, 0x63, 0x1d, 0x30, 0x23, 0x74, 0xb1, 0xb8, 0xcc, 0xd7, + 0xb6, 0x90, 0x65, 0x73, 0xa2, 0x2a, 0x6e, 0x49, 0x95, 0x0d, + 0xab, 0x24, 0xdf, 0x2d, 0xbf, 0x76, 0x46, 0x01, 0x44, 0xe4, + 0x18, 0x8e, 0xd5, 0x9a, 0x76, 0xc9, 0xc6, 0xbc, 0xdb, 0x7f, + 0x80, 0x52, 0xc6, 0x40, 0x41, 0x12, 0x36, 0x7c, 0x80, 0x69, + 0xce, 0x7b, 0xe1, 0xa0, 0x53, 0xa2, 0xd6, 0x8f, 0x3f, 0xf7, + 0xd7, 0x61, 0x09, 0x70, 0xa2, 0xa0, 0xc6, 0xaf, 0xa0, 0xd0, + 0xfa, 0x13, 0xbf, 0xc0, 0x69, 0x15, 0xce, 0x15, 0xec, 0x24, + 0x4b, 0x6b, 0xdc, 0x93, 0x51, 0xc6, 0x82, 0x19, 0x92, 0x84, + 0x5d, 0x99, 0xb0, 0x90, 0x2c, 0xcc, 0x2a, 0x81, 0x6b, 0x22, + 0x64, 0x0a, 0xcb, 0x51, 0x25, 0x82, 0x50, 0x02, 0x2d, 0x3e, + 0xd4, 0x72, 0xb3, 0x0c, 0x15, 0x77, 0xd2, 0xca, 0x98, 0x2f, + 0x41, 0x93, 0x14, 0xb2, 0x7f, 0xa1, 0x97, 0xa3, 0xb8, 0x8a, + 0x56, 0x24, 0x38, 0xa7, 0x36, 0xc5, 0x01, 0xc0, 0x9f, 0x3f, + 0x3e, 0x9a, 0xf6, 0xe9, 0x16, 0x82, 0x01, 0x58, 0x70, 0x0e, + 0x0d, 0xbc, 0xfa, 0x03, 0x57, 0x65, 0xa8, 0x5a, 0x3d, 0x57, + 0x81, 0x23, 0xbe, 0x6e, 0xa9, 0xe8, 0x22, 0xdf, 0x2f, 0x70, + 0xeb, 0x0a, 0x03, 0x96, 0x6b, 0xef, 0x20, 0x9f, 0xf2, 0x62, + 0xe7, 0xb2, 0x6e, 0x3a, 0x1e, 0x40, 0x1f, 0xd2, 0x97, 0x48, + 0xd1, 0x18, 0xf0, 0xeb, 0x52, 0x58, 0x02, 0x26, 0xce, 0x75, + 0xb1, 0x3a, 0x9d, 0x5b, 0x52, 0x94, 0xb2, 0x6e, 0x0e, 0x3f, + 0x39, 0xb6, 0xd9, 0x8a, 0x9d, 0xe8, 0x7c, 0x83, 0x32, 0xcc, + 0x43, 0x35, 0x9b, 0x7a, 0xed, 0xb2, 0x1e, 0x51, 0x37, 0x6c, + 0x14, 0xd8, 0xb8, 0x55, 0xb3, 0x91, 0xef, 0x0c, 0x3a, 0xe5, + 0x77, 0xd0, 0xbd, 0xb0, 0x7d, 0x38, 0x84, 0x2a, 0x47, 0xb2, + 0xb6, 0xda, 0xd7, 0x75, 0xd6, 0x2e, 0x60, 0xc7, 0x10, 0x52, + 0xf7, 0xdd, 0x09, 0x15, 0x6f, 0x04, 0x31, 0xc3, 0x5a, 0x6b, + 0x0c, 0x60, 0x10, 0xa8, 0x6e, 0x20, 0xa9, 0xdd, 0xb7, 0x72, + 0xc3, 0x9e, 0x85, 0xd2, 0x8f, 0x16, 0x7e, 0x3d, 0xe0, 0x63, + 0x81, 0x32, 0xfd, 0xca, 0xbc, 0x0f, 0xef, 0x3e, 0x74, 0x6a, + 0xb1, 0x60, 0xc1, 0x10, 0x50, 0x7c, 0x67, 0xa4, 0x19, 0xa7, + 0xb8, 0xed, 0xe6, 0xf5, 0x4e, 0x41, 0x53, 0xa6, 0x72, 0x1b, + 0x2c, 0x33, 0x6a, 0x37, 0xf1, 0xb5, 0x1c, 0x01, 0x7d, 0xa2, + 0x1f, 0x2c, 0x4e, 0x0a, 0xbf, 0xd4, 0x2c, 0x24, 0x91, 0x58, + 0x62, 0xfb, 0xf8, 0x63, 0xd9, 0xf8, 0x78, 0xf5, 0xc7, 0x78, + 0x32, 0xda, 0x99, 0xeb, 0x58, 0x20, 0x25, 0x19, 0xb1, 0x06, + 0x7f, 0x6a, 0x29, 0x20, 0xdb, 0xc8, 0x22, 0x48, 0xa9, 0x7f, + 0x24, 0x54, 0x8d, 0x7d, 0x8d, 0xb1, 0x69, 0xb2, 0xa3, 0x98, + 0x14, 0x0f, 0xba, 0xfa, 0xb6, 0x15, 0xe8, 0x28, 0x99, 0x3f, + 0x30, 0x04, 0x50, 0xab, 0x5a, 0x3c, 0xf1, 0x97, 0xe1, 0xc8, + 0x0f, 0x0e, 0xb4, 0x11, 0x63, 0x5a, 0x79, 0x08, 0x48, 0x75, + 0xaf, 0x9b, 0xca, 0xd9, 0x13, 0x18, 0xcc, 0xb1, 0xb3, 0xee, + 0xdd, 0x63, 0xdd, 0xf4, 0x21, 0x98, 0x76, 0xe2, 0x3e, 0xd5, + 0x86, 0x23, 0x33, 0x7e, 0xc7, 0xb4, 0x35, 0x4b, 0xc2, 0x2d, + 0xe1, 0xe2, 0xb0, 0x6c, 0x8b, 0x9b, 0x20, 0x3d, 0x48, 0x24, + 0x7c, 0xea, 0xa1, 0x75, 0x27, 0xe5, 0xf4, 0x70, 0xeb, 0x3b, + 0xc7, 0x26, 0x37, 0x04, 0xff, 0x8a, 0x7a, 0xd0, 0xc2, 0xb7, + 0x84, 0xb7, 0x29, 0xfb, 0x0e, 0xa3, 0xa8, 0x71, 0xcd, 0x58, + 0x06, 0x36, 0xe2, 0xf2, 0x77, 0xcc, 0x0f, 0x78, 0x08, 0x2b, + 0xbb, 0xe3, 0x53, 0x05, 0x71, 0xdc, 0x6c, 0x37, 0x32, 0x91, + 0x46, 0x42, 0x4f, 0x21, 0xe0, 0x34, 0xad, 0x3f, 0x30, 0x5a, + 0xc7, 0x0d, 0x17, 0x19, 0x39, 0x31, 0x58, 0x69, 0x3c, 0x8c, + 0xbe, 0xe7, 0xa6, 0x3b, 0xad, 0xfb, 0x46, 0x89, 0x06, 0xc1, + 0x8c, 0x16, 0x9a, 0x06, 0x3a, 0xd0, 0x7e, 0xd6, 0xb0, 0x7b, + 0x7d, 0xf8, 0x91, 0x7c, 0xfa, 0xd9, 0x66, 0x39, 0xfa, 0xbc, + 0x57, 0xa7, 0x78, 0x8b, 0x36, 0x78, 0xc0, 0x1c, 0x0e, 0x23, + 0x05, 0x0e, 0x04, 0x61, 0x16, 0x34, 0xf9, 0xc6, 0x63, 0x58, + 0xdf, 0xf4, 0x52, 0xce, 0xd0, 0x0f, 0x0c, 0xec, 0xb1, 0x82, + 0xf4, 0x72, 0x73, 0x72, 0x3f, 0x02, 0xbe, 0xe3, 0x9c, 0x63, + 0x73, 0xc8, 0x21, 0x65, 0xba, 0x57, 0x52, 0xa9, 0x19, 0xac, + 0x68, 0x50, 0xbd, 0x2d, 0x72, 0x5b, 0x93, 0x0f, 0x1c, 0x81, + 0x77, 0xd7, 0x2e, 0xc3, 0x93, 0x52, 0x6e, 0xdc, 0x79, 0x52, + 0x9f, 0xe3, 0xde, 0xe1, 0xba, 0x58, 0x55, 0xab, 0x8a, 0xf2, + 0x35, 0x6a, 0xcf, 0x94, 0x1f, 0x17, 0xa4, 0x23, 0x2e, 0x8e, + 0x18, 0x21, 0xbe, 0x14, 0xfa, 0xe7, 0x59, 0xc5, 0x44, 0x34, + 0xce, 0x03, 0xf4, 0xb7, 0x75, 0xd3, 0x51, 0x55, 0xdf, 0xff, + 0xcf, 0x4f, 0x44, 0xee, 0x13, 0x9b, 0xcb, 0x12, 0xae, 0xe5, + 0x5b, 0x44, 0x65, 0x28, 0xcb, 0x6a, 0x9c, 0x24, 0x1d, 0xea, + 0x2d, 0x5e, 0xa5, 0xc3, 0x78, 0xad, 0xed, 0x0c, 0x05, 0xa6, + 0xaf, 0x95, 0x04, 0xd2, 0xb5, 0x91, 0x0e, 0xa0, 0x06, 0x77, + 0xc5, 0x82, 0xf6, 0xdd, 0x72, 0x83, 0x04, 0xcc, 0xb0, 0xab, + 0x7a, 0xf0, 0xb4, 0x4d, 0x36, 0x71, 0x72, 0x1a, 0x9a, 0x0d, + 0xcd, 0xa3, 0x11, 0xa8, 0x0d, 0x7d, 0x49, 0xce, 0x9c, 0x09, + 0x1d, 0x08, 0xa4, 0x39, 0x2e, 0x03, 0xdf, 0x3a, 0xc8, 0xfe, + 0x6a, 0x2b, 0x0b, 0x07, 0x80, 0x55, 0x8a, 0xa8, 0xe6, 0x0e, + 0xc9, 0x7e, 0x83, 0xce, 0x3a, 0x98, 0x98, 0x4e, 0x3e, 0x08, + 0x20, 0x8f, 0x10, 0xfc, 0xc1, 0xc4, 0xcf, 0x37, 0x8d, 0x69, + 0xd8, 0x57, 0x9d, 0x48, 0x80, 0x6a, 0xef, 0x0c, 0xdd, 0x27, + 0x99, 0xf9, 0xe7, 0xd0, 0xd2, 0x36, 0xd8, 0xed, 0x41, 0x14, + 0x1b, 0x10, +}; +static const int sizeof_bench_dilithium_level3_pubkey = + sizeof(bench_dilithium_level3_pubkey); + +#endif /* !WOLFSSL_DILITHIUM_NO_VERIFY */ + +#ifndef WOLFSSL_DILITHIUM_NO_SIGN + +static const unsigned char bench_dilithium_level5_key[] = { + 0xef, 0x49, 0x79, 0x47, 0x15, 0xc4, 0x8a, 0xa9, 0x74, 0x2a, + 0xf0, 0x36, 0x94, 0x5c, 0x91, 0x1c, 0x5d, 0xff, 0x2c, 0x83, + 0xf2, 0x8b, 0x04, 0xfc, 0x5d, 0x64, 0xbd, 0x49, 0x73, 0xcd, + 0xcc, 0x99, 0xfd, 0x0f, 0x8f, 0x6e, 0xad, 0x75, 0x9b, 0xc9, + 0xb1, 0xb9, 0x90, 0x93, 0xbf, 0xce, 0x02, 0x2d, 0x12, 0x0c, + 0x54, 0x2e, 0xe2, 0x3e, 0x52, 0xff, 0xe0, 0x7a, 0xca, 0x2d, + 0x81, 0x84, 0xea, 0x16, 0x1f, 0x10, 0xc4, 0xc9, 0xde, 0xcd, + 0xf6, 0xbd, 0x60, 0xc9, 0xb3, 0xd0, 0x0f, 0x57, 0xeb, 0x71, + 0x78, 0x9b, 0xb5, 0x72, 0x2a, 0x65, 0x11, 0x14, 0xff, 0x63, + 0x8d, 0x38, 0xcf, 0xa4, 0xf4, 0xad, 0xd0, 0x68, 0x84, 0x97, + 0xfe, 0xd3, 0x91, 0xa0, 0xe4, 0xc3, 0x74, 0xcf, 0x20, 0x87, + 0x89, 0x84, 0x1f, 0x75, 0x91, 0xe3, 0xb3, 0x47, 0x8b, 0xfe, + 0x76, 0xb7, 0x2d, 0x30, 0x89, 0x02, 0x04, 0xc9, 0x93, 0xa8, + 0x31, 0xd3, 0x84, 0x2d, 0xe4, 0x26, 0x12, 0xdb, 0x94, 0x08, + 0x12, 0x45, 0x45, 0xca, 0x44, 0x89, 0x52, 0xc4, 0x28, 0x41, + 0x46, 0x01, 0x1c, 0x93, 0x20, 0x8b, 0x40, 0x6d, 0x09, 0x36, + 0x65, 0x4c, 0xa2, 0x40, 0x62, 0xb8, 0x2c, 0x1b, 0x00, 0x20, + 0x61, 0x42, 0x8c, 0x24, 0xa7, 0x10, 0x19, 0x27, 0x25, 0x22, + 0x14, 0x31, 0x13, 0x33, 0x46, 0x0c, 0x22, 0x22, 0x18, 0xa7, + 0x91, 0x0c, 0x24, 0x61, 0xd9, 0x32, 0x46, 0xc8, 0x96, 0x49, + 0x5c, 0x90, 0x89, 0x9b, 0x84, 0x01, 0x5c, 0x08, 0x42, 0x64, + 0x84, 0x85, 0x0c, 0x42, 0x21, 0x20, 0x48, 0x21, 0x92, 0x00, + 0x28, 0x83, 0x20, 0x4c, 0x08, 0xc7, 0x51, 0x99, 0x06, 0x66, + 0x01, 0x18, 0x51, 0x13, 0x48, 0x0a, 0x0b, 0x42, 0x90, 0x4c, + 0x14, 0x08, 0x83, 0x14, 0x6d, 0x10, 0x10, 0x91, 0xe2, 0xc4, + 0x8d, 0xe1, 0x12, 0x11, 0x10, 0x40, 0x29, 0x99, 0x92, 0x30, + 0x12, 0x39, 0x6c, 0x91, 0x86, 0x68, 0x08, 0x83, 0x0c, 0x54, + 0x80, 0x80, 0xa2, 0x08, 0x52, 0x09, 0x30, 0x71, 0x0c, 0x10, + 0x04, 0x53, 0x00, 0x65, 0x91, 0x12, 0x2d, 0x0c, 0xa2, 0x8c, + 0x18, 0x14, 0x45, 0xd8, 0x14, 0x06, 0xe4, 0x36, 0x72, 0x93, + 0x10, 0x68, 0x09, 0xc2, 0x08, 0x51, 0x14, 0x8c, 0x13, 0x39, + 0x11, 0xd8, 0x44, 0x02, 0x18, 0x39, 0x29, 0x98, 0x16, 0x71, + 0x82, 0x40, 0x70, 0x01, 0x10, 0x8c, 0x1a, 0x30, 0x08, 0x02, + 0x03, 0x41, 0x5a, 0x00, 0x40, 0xa4, 0x16, 0x90, 0x20, 0x26, + 0x32, 0x00, 0x49, 0x61, 0x20, 0x20, 0x0c, 0x1a, 0xb0, 0x10, + 0x63, 0x10, 0x11, 0x58, 0x30, 0x0d, 0x59, 0x80, 0x68, 0x90, + 0x46, 0x2a, 0x91, 0xa8, 0x71, 0x98, 0x20, 0x40, 0x21, 0x83, + 0x6c, 0xc0, 0x48, 0x0d, 0x8b, 0x90, 0x11, 0x08, 0x09, 0x31, + 0x8c, 0x00, 0x12, 0x10, 0x14, 0x6e, 0xc2, 0x06, 0x32, 0x1a, + 0x26, 0x10, 0x0a, 0x91, 0x44, 0x08, 0x99, 0x8d, 0x60, 0x86, + 0x28, 0x11, 0x20, 0x6d, 0xa3, 0x12, 0x81, 0x8b, 0xc6, 0x51, + 0xcb, 0xa0, 0x61, 0x09, 0x97, 0x61, 0x48, 0xb6, 0x0d, 0x21, + 0x49, 0x51, 0x08, 0x13, 0x0c, 0x0a, 0x34, 0x86, 0x49, 0x80, + 0x65, 0x14, 0x39, 0x04, 0x21, 0x01, 0x81, 0x9a, 0xb8, 0x4d, + 0x04, 0x41, 0x48, 0x03, 0x92, 0x81, 0x62, 0x14, 0x6c, 0x10, + 0x16, 0x11, 0xe2, 0xa2, 0x49, 0xe3, 0x30, 0x65, 0x04, 0x93, + 0x8d, 0x1c, 0x33, 0x70, 0x1b, 0x15, 0x50, 0xe4, 0x38, 0x80, + 0x21, 0x37, 0x06, 0x20, 0xc6, 0x24, 0xc8, 0x22, 0x88, 0x4a, + 0x44, 0x80, 0x14, 0x43, 0x88, 0x54, 0x44, 0x42, 0x11, 0x49, + 0x41, 0x19, 0xb9, 0x2d, 0xcc, 0x04, 0x0d, 0x19, 0xc1, 0x65, + 0x5b, 0xa0, 0x11, 0x94, 0x00, 0x84, 0xe4, 0xb6, 0x41, 0xc2, + 0x18, 0x72, 0x5c, 0x02, 0x69, 0x11, 0x85, 0x24, 0x13, 0x35, + 0x00, 0x62, 0x34, 0x04, 0x58, 0x40, 0x21, 0x00, 0xc4, 0x28, + 0x0c, 0x17, 0x30, 0x10, 0x47, 0x60, 0x4b, 0xc2, 0x61, 0x9c, + 0x80, 0x2c, 0x20, 0x94, 0x31, 0x58, 0x92, 0x09, 0xcc, 0x00, + 0x02, 0x42, 0x94, 0x69, 0x99, 0x28, 0x06, 0x98, 0x02, 0x52, + 0x90, 0x32, 0x6e, 0x8a, 0x18, 0x2e, 0x54, 0x94, 0x81, 0x03, + 0xc6, 0x89, 0x03, 0xa1, 0x84, 0x48, 0x82, 0x48, 0x52, 0xc4, + 0x00, 0x91, 0x30, 0x24, 0x20, 0x12, 0x0d, 0x83, 0x80, 0x05, + 0x92, 0x48, 0x61, 0x98, 0x46, 0x92, 0xe1, 0xa6, 0x25, 0x20, + 0x93, 0x4d, 0x1c, 0x37, 0x2c, 0x9b, 0x94, 0x8d, 0xc8, 0x88, + 0x80, 0xa2, 0x18, 0x72, 0x0c, 0x09, 0x70, 0x81, 0x36, 0x90, + 0x24, 0x45, 0x69, 0x53, 0x36, 0x6c, 0xd2, 0x20, 0x51, 0x23, + 0xc1, 0x8c, 0x62, 0xb0, 0x70, 0x11, 0xb2, 0x70, 0xcb, 0x84, + 0x69, 0x4b, 0x32, 0x89, 0x01, 0x21, 0x81, 0x02, 0x38, 0x66, + 0xa3, 0x26, 0x12, 0x24, 0xa3, 0x30, 0x22, 0x24, 0x84, 0x18, + 0xb9, 0x84, 0x40, 0x16, 0x50, 0x22, 0x44, 0x31, 0x1b, 0x13, + 0x8d, 0x53, 0x02, 0x89, 0x4a, 0x22, 0x10, 0x53, 0x18, 0x01, + 0x58, 0x30, 0x2d, 0x00, 0x05, 0x08, 0x13, 0x80, 0x84, 0xc2, + 0x22, 0x0e, 0x88, 0x26, 0x2a, 0x04, 0xc4, 0x4c, 0x19, 0x43, + 0x01, 0xc8, 0x38, 0x4c, 0xd1, 0xb2, 0x90, 0x13, 0x29, 0x10, + 0x12, 0x48, 0x22, 0x01, 0xa8, 0x51, 0xd1, 0x92, 0x40, 0x11, + 0x27, 0x62, 0x10, 0x01, 0x0c, 0x0c, 0xc6, 0x28, 0xe3, 0x46, + 0x60, 0x24, 0x01, 0x8d, 0x14, 0xb6, 0x10, 0x50, 0xb6, 0x25, + 0x44, 0x38, 0x40, 0x44, 0xc2, 0x0c, 0x19, 0xc0, 0x64, 0x9c, + 0x44, 0x02, 0x21, 0x25, 0x65, 0x02, 0x23, 0x86, 0x1a, 0x12, + 0x70, 0x51, 0x24, 0x91, 0x09, 0x08, 0x44, 0x09, 0x35, 0x66, + 0x91, 0x04, 0x12, 0x43, 0x42, 0x8d, 0x22, 0xa0, 0x70, 0x14, + 0x91, 0x25, 0xa0, 0x00, 0x80, 0xe4, 0x00, 0x90, 0x44, 0xb2, + 0x61, 0x14, 0x20, 0x6e, 0xca, 0x14, 0x0d, 0x23, 0x85, 0x68, + 0xda, 0x40, 0x92, 0x0b, 0xb1, 0x20, 0x92, 0x04, 0x46, 0xc0, + 0x08, 0x8a, 0x40, 0xc4, 0x4d, 0x0c, 0x17, 0x45, 0xd3, 0x18, + 0x52, 0x1b, 0x46, 0x24, 0xc2, 0x24, 0x71, 0x83, 0x10, 0x80, + 0xc8, 0x82, 0x68, 0xc2, 0x96, 0x81, 0x0a, 0x01, 0x92, 0x60, + 0xb4, 0x84, 0x09, 0xc6, 0x00, 0x04, 0x37, 0x90, 0x0b, 0xa0, + 0x28, 0x12, 0x27, 0x09, 0x94, 0x80, 0x50, 0xd8, 0x04, 0x86, + 0x08, 0x13, 0x8a, 0x4a, 0x06, 0x89, 0x9b, 0xc4, 0x60, 0xe3, + 0xa2, 0x20, 0xe0, 0x38, 0x21, 0x22, 0xb4, 0x68, 0x0a, 0xa1, + 0x0c, 0x01, 0x24, 0x32, 0x4c, 0x48, 0x30, 0xa2, 0x80, 0x8d, + 0x58, 0x44, 0x10, 0xc8, 0x94, 0x6d, 0x21, 0xc3, 0x61, 0xcb, + 0x98, 0x24, 0xdc, 0x38, 0x11, 0xc9, 0x18, 0x11, 0x20, 0x01, + 0x50, 0x1c, 0x34, 0x8d, 0x02, 0x03, 0x09, 0x0a, 0x40, 0x61, + 0xd4, 0xb8, 0x84, 0x9c, 0xc2, 0x09, 0x04, 0xb1, 0x89, 0x83, + 0x86, 0x84, 0x19, 0x83, 0x0c, 0x5a, 0x86, 0x89, 0x10, 0x21, + 0x0d, 0xd1, 0xc2, 0x80, 0x18, 0x29, 0x2a, 0x0c, 0x01, 0x50, + 0x89, 0x88, 0x48, 0x03, 0xa7, 0x85, 0x21, 0x92, 0x64, 0xc4, + 0x16, 0x81, 0x94, 0x06, 0x6c, 0x53, 0x26, 0x12, 0x90, 0xb6, + 0x21, 0x0b, 0xa8, 0x64, 0x43, 0x96, 0x84, 0x41, 0x88, 0x70, + 0xe3, 0xa6, 0x44, 0x12, 0xc0, 0x09, 0x01, 0xc7, 0x60, 0xc3, + 0x20, 0x42, 0xc3, 0x40, 0x68, 0x10, 0xa6, 0x51, 0xa4, 0xa0, + 0x71, 0x54, 0x98, 0x04, 0x88, 0xb2, 0x00, 0x54, 0x18, 0x6a, + 0x48, 0x98, 0x20, 0x21, 0xb2, 0x8d, 0x82, 0x20, 0x81, 0x99, + 0x16, 0x81, 0x0a, 0xc5, 0x88, 0x0a, 0x23, 0x11, 0x8a, 0x16, + 0x44, 0x24, 0xc9, 0x29, 0x59, 0x08, 0x91, 0x1c, 0x29, 0x05, + 0x14, 0xc9, 0x44, 0xe3, 0x20, 0x10, 0x1b, 0xa1, 0x64, 0x82, + 0xa2, 0x90, 0x00, 0x00, 0x82, 0x98, 0xb2, 0x85, 0xc8, 0x04, + 0x28, 0xc8, 0xb2, 0x65, 0xc9, 0xc6, 0x88, 0xcc, 0x08, 0x91, + 0x84, 0x08, 0x30, 0x94, 0x94, 0x8d, 0xc0, 0x18, 0x46, 0x82, + 0x36, 0x4c, 0x83, 0x10, 0x72, 0x23, 0xb1, 0x88, 0x81, 0x20, + 0x8e, 0x19, 0x03, 0x8a, 0x94, 0x46, 0x22, 0x21, 0x35, 0x8e, + 0x04, 0xc0, 0x88, 0x5b, 0xb6, 0x09, 0x0a, 0x18, 0x44, 0x21, + 0x90, 0x65, 0x03, 0xb2, 0x21, 0xc4, 0x10, 0x50, 0xc1, 0x80, + 0x0c, 0x09, 0x40, 0x49, 0xe4, 0xa8, 0x8c, 0xa4, 0x36, 0x61, + 0x59, 0x12, 0x86, 0x20, 0x08, 0x2d, 0x10, 0x19, 0x85, 0xe4, + 0x34, 0x60, 0xc4, 0xb6, 0x60, 0x00, 0x18, 0x06, 0x8c, 0xb8, + 0x45, 0x19, 0x13, 0x4a, 0x53, 0xc4, 0x40, 0xc9, 0x38, 0x71, + 0xd9, 0x48, 0x10, 0x59, 0x08, 0x02, 0x02, 0x10, 0x69, 0x53, + 0x28, 0x80, 0x22, 0x81, 0x4c, 0xc9, 0x16, 0x26, 0xa1, 0x48, + 0x64, 0x19, 0x21, 0x11, 0x1c, 0x37, 0x88, 0x4b, 0x94, 0x2c, + 0x48, 0xc8, 0x6c, 0x63, 0x88, 0x65, 0x81, 0x40, 0x61, 0xa1, + 0x44, 0x31, 0x82, 0x18, 0x08, 0x80, 0x00, 0x26, 0x50, 0x14, + 0x49, 0xa1, 0x32, 0x50, 0x02, 0xc8, 0x45, 0x0c, 0x07, 0x24, + 0x13, 0x01, 0x6d, 0x0a, 0xb3, 0x90, 0x64, 0x30, 0x85, 0x21, + 0x09, 0x61, 0x44, 0x44, 0x72, 0x08, 0x32, 0x06, 0xe1, 0xa2, + 0x21, 0xdb, 0xa4, 0x09, 0x5a, 0xb4, 0x71, 0x43, 0xb2, 0x09, + 0x82, 0xc4, 0x64, 0x88, 0xa0, 0x91, 0xca, 0x14, 0x90, 0xa4, + 0xa8, 0x41, 0xc1, 0x38, 0x85, 0x12, 0x32, 0x60, 0x1a, 0x11, + 0x72, 0x53, 0x32, 0x2c, 0xe3, 0x08, 0x4d, 0x24, 0xc6, 0x28, + 0x0a, 0x03, 0x8c, 0x88, 0x06, 0x05, 0xa0, 0xa8, 0x05, 0x84, + 0xa2, 0x4c, 0x80, 0x40, 0x62, 0xda, 0x24, 0x81, 0x9a, 0x16, + 0x91, 0x24, 0x81, 0x04, 0xa4, 0x46, 0x51, 0xc2, 0xa8, 0x25, + 0x20, 0x28, 0x42, 0x13, 0x46, 0x2c, 0x63, 0x42, 0x72, 0x03, + 0x88, 0x28, 0xa3, 0x22, 0x24, 0x1a, 0x02, 0x26, 0x42, 0xa2, + 0x11, 0x11, 0xb0, 0x51, 0x92, 0xb4, 0x6c, 0xe2, 0x32, 0x85, + 0x10, 0xc2, 0x41, 0xc1, 0x40, 0x46, 0x4c, 0x26, 0x01, 0x1c, + 0x35, 0x02, 0x0c, 0x14, 0x0c, 0x18, 0x81, 0x00, 0x10, 0x26, + 0x02, 0xc8, 0x32, 0x8c, 0xe4, 0x02, 0x68, 0xcc, 0x14, 0x2e, + 0x89, 0x38, 0x60, 0x10, 0x12, 0x24, 0x93, 0x42, 0x65, 0xe3, + 0x24, 0x29, 0x08, 0x80, 0x41, 0x09, 0x29, 0x46, 0x5b, 0x26, + 0x49, 0x5b, 0x30, 0x80, 0x03, 0xc1, 0x2c, 0x04, 0x09, 0x82, + 0x4c, 0x48, 0x2d, 0x1c, 0x36, 0x4d, 0xdb, 0x02, 0x86, 0x21, + 0xb5, 0x51, 0x81, 0x80, 0x2d, 0xcb, 0x20, 0x81, 0x5b, 0x34, + 0x41, 0x89, 0x36, 0x48, 0x44, 0xa0, 0x05, 0x59, 0xb6, 0x64, + 0x12, 0x45, 0x21, 0x20, 0x31, 0x51, 0x0a, 0xc3, 0x8c, 0x14, + 0x48, 0x71, 0x18, 0x35, 0x24, 0x20, 0x45, 0x05, 0x88, 0x20, + 0x09, 0x08, 0xb1, 0x29, 0x18, 0xa0, 0x09, 0x4a, 0x00, 0x8a, + 0xe2, 0xb8, 0x45, 0x02, 0x27, 0x89, 0xd8, 0x10, 0x25, 0x51, + 0x82, 0x8c, 0x13, 0x92, 0x30, 0x1c, 0x24, 0x8e, 0x1c, 0x93, + 0x4d, 0xa3, 0x48, 0x51, 0x93, 0xa8, 0x69, 0xe2, 0x04, 0x89, + 0x13, 0x13, 0x61, 0xcb, 0x98, 0x8c, 0x09, 0x21, 0x62, 0x4b, + 0x14, 0x4e, 0x11, 0xa3, 0x09, 0x98, 0x40, 0x42, 0x91, 0x12, + 0x08, 0x80, 0x84, 0x2d, 0xc0, 0x12, 0x60, 0x03, 0xa4, 0x29, + 0x18, 0x80, 0x01, 0x94, 0x44, 0x8a, 0x12, 0x11, 0x72, 0xc4, + 0x22, 0x32, 0x9a, 0x46, 0x88, 0x1b, 0x16, 0x4d, 0x4b, 0x08, + 0x11, 0x02, 0x48, 0x45, 0x81, 0xa4, 0x64, 0xe1, 0x88, 0x0c, + 0x63, 0x10, 0x70, 0x48, 0x98, 0x05, 0x9b, 0xb8, 0x84, 0x03, + 0x14, 0x05, 0x44, 0x86, 0x0c, 0x20, 0x11, 0x68, 0xbe, 0x71, + 0x83, 0xc2, 0x69, 0xde, 0x49, 0xad, 0xb4, 0xdb, 0x93, 0xcb, + 0x20, 0x2b, 0xbd, 0x95, 0x97, 0x57, 0x7e, 0xcb, 0xbc, 0x73, + 0xb6, 0x3d, 0x16, 0x4a, 0x0e, 0xe4, 0x9c, 0x81, 0xb1, 0x5d, + 0x27, 0x64, 0xa2, 0x14, 0x12, 0x1b, 0x8e, 0xd0, 0xd8, 0x38, + 0xf6, 0xc7, 0xbb, 0x9f, 0x77, 0x3c, 0x62, 0x04, 0x92, 0xe1, + 0x97, 0xaf, 0x24, 0xa7, 0xf9, 0xf0, 0x8d, 0x3a, 0xbf, 0x5d, + 0xab, 0x5c, 0x97, 0x0f, 0xfc, 0x35, 0xbc, 0x62, 0xd8, 0x42, + 0xfd, 0xc7, 0x8b, 0xf7, 0x80, 0xd1, 0x38, 0x68, 0x14, 0x5e, + 0x4f, 0x99, 0x31, 0xc7, 0xaf, 0xbd, 0x27, 0xce, 0x1c, 0x5b, + 0x09, 0x1b, 0xcf, 0xbb, 0xfb, 0xf9, 0xf4, 0x90, 0x4c, 0xc1, + 0xa2, 0x12, 0xf9, 0xd0, 0xa5, 0x2c, 0xfd, 0x7b, 0x55, 0xb0, + 0xb1, 0xc6, 0x42, 0xe6, 0xeb, 0x10, 0x5e, 0xe9, 0x00, 0xe8, + 0x46, 0xe4, 0xe0, 0x8b, 0x21, 0xbc, 0xb1, 0xa9, 0x9e, 0x75, + 0x66, 0xf0, 0xb8, 0x87, 0xb9, 0x11, 0x7e, 0x28, 0x6c, 0x4d, + 0x58, 0xcd, 0x54, 0x71, 0x0c, 0x6a, 0xcc, 0xfb, 0x52, 0xc2, + 0x5b, 0xcc, 0x19, 0x67, 0x4f, 0xc2, 0x2f, 0x09, 0x62, 0x51, + 0x82, 0xeb, 0x9b, 0x94, 0x11, 0xb4, 0x5a, 0x67, 0x7f, 0x58, + 0x18, 0xb2, 0x3f, 0x37, 0x1f, 0x94, 0x44, 0x73, 0x6a, 0x02, + 0xf5, 0xfb, 0x5b, 0x03, 0xac, 0x5d, 0xc6, 0xa9, 0x79, 0x8f, + 0x0f, 0x50, 0xa0, 0x57, 0x46, 0x05, 0x6d, 0x58, 0xde, 0x6e, + 0x8d, 0x9c, 0x0e, 0x6a, 0xb5, 0x9b, 0x1b, 0x22, 0x74, 0xad, + 0x00, 0x55, 0x27, 0x46, 0xce, 0xbb, 0x82, 0x77, 0x4e, 0x6e, + 0x59, 0x38, 0x26, 0xb3, 0xc7, 0xbc, 0x97, 0x54, 0x83, 0x69, + 0x1f, 0x3e, 0xbd, 0x0f, 0xff, 0x2f, 0xca, 0xb9, 0xea, 0x91, + 0x26, 0x8e, 0x0a, 0x78, 0x25, 0xf6, 0x6b, 0x11, 0x30, 0xd7, + 0xe2, 0xf4, 0x2b, 0xda, 0xcf, 0xe1, 0x4a, 0x47, 0xab, 0x5f, + 0x54, 0x34, 0x38, 0xac, 0xd1, 0xbf, 0x45, 0xad, 0x4b, 0x52, + 0x0f, 0x4c, 0xa2, 0xac, 0x22, 0x7c, 0xb6, 0xed, 0x7f, 0xd5, + 0x63, 0x3b, 0x1a, 0x3b, 0xf2, 0x3d, 0x9b, 0x96, 0x92, 0x08, + 0xb9, 0x95, 0x13, 0xaf, 0x20, 0x26, 0x8b, 0x15, 0x97, 0x89, + 0xa5, 0x88, 0x8f, 0x78, 0xb4, 0x57, 0x9d, 0x51, 0x96, 0x9c, + 0x98, 0x93, 0xd5, 0x83, 0xf9, 0xff, 0x94, 0x29, 0x1e, 0xa5, + 0x28, 0xa4, 0x0c, 0x22, 0xab, 0xbc, 0x70, 0x48, 0xa2, 0x16, + 0x1c, 0xa4, 0xba, 0x8b, 0xfe, 0xb2, 0xa9, 0x03, 0x96, 0x5f, + 0xb4, 0x84, 0x8e, 0xb4, 0xbb, 0x7b, 0x11, 0xc5, 0xc2, 0xdb, + 0xe3, 0x88, 0xb5, 0xd3, 0xac, 0x07, 0x33, 0x53, 0xe8, 0x10, + 0x9e, 0xc5, 0x81, 0xb0, 0x77, 0x2f, 0x4f, 0x6d, 0x0d, 0x89, + 0xb4, 0x04, 0x98, 0x05, 0xe6, 0xd3, 0x36, 0x97, 0xcd, 0x3e, + 0x4d, 0xc6, 0x21, 0xe4, 0x0b, 0xcf, 0xed, 0xa7, 0x4d, 0xd9, + 0xd3, 0x25, 0xec, 0xec, 0x47, 0xfd, 0x06, 0x92, 0x77, 0x25, + 0x3c, 0x44, 0xe6, 0x5d, 0xb4, 0x35, 0x2b, 0x5d, 0x05, 0x65, + 0x63, 0x0b, 0xd9, 0xb8, 0x28, 0xdf, 0xdd, 0xfd, 0x64, 0x18, + 0x42, 0x19, 0x7f, 0x12, 0x78, 0xdd, 0xf0, 0x64, 0xd6, 0x99, + 0xb8, 0x74, 0x81, 0xe2, 0xb9, 0xc8, 0x67, 0x6d, 0x31, 0x22, + 0xa5, 0x68, 0xa1, 0x8d, 0x3e, 0x49, 0xbe, 0x10, 0x68, 0xa8, + 0x74, 0x1d, 0x18, 0xcf, 0x00, 0xe1, 0x4f, 0x77, 0xd8, 0xc6, + 0xe3, 0x08, 0xbb, 0x4c, 0xed, 0xff, 0xd9, 0x9b, 0xb0, 0xd1, + 0x50, 0xbb, 0x8b, 0x91, 0xcd, 0x5f, 0x2a, 0xfb, 0x8f, 0x4d, + 0x3c, 0x98, 0xba, 0xd7, 0x98, 0x99, 0xa7, 0x22, 0x14, 0xd7, + 0x94, 0xb5, 0xb8, 0xa4, 0x52, 0x31, 0xa7, 0xa1, 0xa4, 0x28, + 0xee, 0x31, 0xb5, 0xd0, 0xc1, 0x07, 0x05, 0x16, 0x1d, 0x53, + 0x45, 0x62, 0x23, 0x05, 0x44, 0xb6, 0x4f, 0x92, 0x03, 0x53, + 0x9a, 0x71, 0x56, 0xae, 0x16, 0x81, 0xb4, 0xc9, 0x98, 0xf4, + 0x7f, 0x11, 0x37, 0xc2, 0xc8, 0xf2, 0xe4, 0x48, 0xe3, 0xcc, + 0xf1, 0xe3, 0x3d, 0x8e, 0x13, 0x5b, 0x25, 0xad, 0xce, 0x6f, + 0xed, 0x60, 0x4f, 0x7d, 0x51, 0xe1, 0xd0, 0x74, 0xf4, 0xed, + 0xf3, 0x84, 0xa6, 0x0e, 0xba, 0xb4, 0x8e, 0x5a, 0xb9, 0x12, + 0x70, 0x43, 0x4c, 0xb5, 0xa5, 0x1e, 0x86, 0xa5, 0xe3, 0x4d, + 0x76, 0x95, 0xce, 0x2c, 0x53, 0x3a, 0x4e, 0x3f, 0x47, 0x73, + 0x85, 0x88, 0xd9, 0x39, 0x21, 0x83, 0x24, 0x68, 0x6a, 0x1e, + 0x77, 0xdf, 0x59, 0xc5, 0x1b, 0xe2, 0xb1, 0x47, 0x9d, 0xee, + 0x45, 0x1e, 0xc6, 0xd4, 0x43, 0xe2, 0xc7, 0x1c, 0x98, 0x84, + 0xe0, 0x39, 0xe9, 0x9f, 0xa0, 0xa2, 0x24, 0x4a, 0x88, 0x46, + 0xf3, 0x50, 0x52, 0xb5, 0xae, 0x37, 0x5c, 0xa1, 0x7d, 0xad, + 0x7c, 0x30, 0x3e, 0xcd, 0x80, 0x1c, 0xac, 0xf4, 0xe6, 0xb5, + 0x9f, 0x22, 0xb6, 0xfb, 0x0e, 0x6d, 0x80, 0x10, 0xf7, 0x3f, + 0xdd, 0x5b, 0xd9, 0xd4, 0x03, 0x14, 0x41, 0x90, 0x88, 0xa8, + 0xcf, 0x50, 0xa2, 0xf2, 0x7e, 0xf0, 0x0a, 0x7f, 0xed, 0x77, + 0x09, 0x48, 0x32, 0x55, 0xe9, 0x93, 0xe7, 0x27, 0x18, 0x46, + 0x17, 0x03, 0x25, 0x8e, 0x17, 0x5d, 0xe8, 0x9e, 0xb1, 0xb4, + 0x9d, 0x1a, 0x5e, 0xbe, 0xa8, 0xb8, 0x45, 0x30, 0xc6, 0xa5, + 0xb4, 0xaf, 0xf3, 0x0d, 0x91, 0x9c, 0xa9, 0x5b, 0x4c, 0xbb, + 0x19, 0x19, 0x39, 0x51, 0x36, 0x80, 0xf7, 0x10, 0xf7, 0x73, + 0x49, 0x17, 0xec, 0xbc, 0x92, 0x08, 0x21, 0xb1, 0x0c, 0x23, + 0xc4, 0xd6, 0xd2, 0xb3, 0xfd, 0xae, 0xe7, 0x71, 0xf3, 0x50, + 0x11, 0x27, 0x1a, 0x85, 0xf0, 0xab, 0xd8, 0x16, 0x64, 0xcb, + 0xad, 0xbb, 0xae, 0x54, 0x37, 0xa3, 0xa8, 0xf4, 0x09, 0x67, + 0x54, 0x61, 0x86, 0x0f, 0x0e, 0x25, 0x0d, 0xda, 0x4a, 0xc7, + 0xe7, 0x02, 0x80, 0x6b, 0x59, 0xd2, 0xc8, 0x88, 0x4d, 0x7d, + 0xfd, 0x3d, 0x48, 0x04, 0x6d, 0x95, 0xdf, 0xc2, 0x8b, 0x23, + 0x70, 0x4a, 0xf5, 0xdc, 0xc9, 0x24, 0x8d, 0x7e, 0x52, 0x22, + 0x7e, 0x9c, 0x5c, 0x32, 0xa5, 0xd5, 0xf2, 0x11, 0x08, 0xa0, + 0xd4, 0xa2, 0xd8, 0xdb, 0x1d, 0x9f, 0x1b, 0x54, 0x8f, 0xb5, + 0xf6, 0x71, 0x71, 0x49, 0xbc, 0x38, 0x09, 0xb6, 0x24, 0x94, + 0x80, 0x1f, 0x2d, 0x0c, 0xc7, 0xe4, 0xd6, 0xcd, 0xab, 0x53, + 0x79, 0x28, 0xed, 0x48, 0x23, 0x14, 0x2f, 0x0b, 0x3a, 0xd0, + 0xa7, 0x08, 0xe1, 0xfd, 0x1e, 0xb6, 0xdd, 0x12, 0x93, 0x2d, + 0x95, 0x06, 0xba, 0x95, 0xcb, 0x1a, 0xed, 0xfb, 0x60, 0xe7, + 0xf1, 0x1c, 0xad, 0xc3, 0xea, 0x8d, 0x3c, 0x53, 0x32, 0xb5, + 0x38, 0x26, 0xdd, 0x39, 0xf0, 0x39, 0x4e, 0x6f, 0x3e, 0xa9, + 0xea, 0x25, 0x29, 0xb8, 0x6c, 0x7d, 0x0a, 0x91, 0xd4, 0xb9, + 0x7b, 0x67, 0xe4, 0xe5, 0x63, 0xd7, 0x6b, 0x03, 0xa5, 0xd7, + 0xe8, 0xd2, 0xc0, 0x34, 0x53, 0xa6, 0x16, 0x21, 0x2a, 0x2a, + 0x09, 0xd3, 0xad, 0xa1, 0x2c, 0x6a, 0x88, 0x2d, 0x90, 0x06, + 0xba, 0x0b, 0xaa, 0xd1, 0xdb, 0xa4, 0xd0, 0x49, 0x0f, 0x42, + 0xe1, 0xca, 0xf0, 0x69, 0x15, 0x63, 0xcb, 0x0b, 0x4c, 0x2e, + 0x99, 0x20, 0x44, 0xe3, 0x6e, 0x32, 0x8a, 0xa1, 0x5c, 0x5b, + 0x03, 0xeb, 0xb5, 0x05, 0xff, 0x1a, 0x76, 0x38, 0x1c, 0xb0, + 0x74, 0xf1, 0x5a, 0x0d, 0x8a, 0xd2, 0x4e, 0x38, 0x11, 0x86, + 0xb0, 0x2d, 0xd3, 0x88, 0xe2, 0x0f, 0x51, 0x68, 0xb9, 0x79, + 0x96, 0x50, 0x95, 0xdc, 0x69, 0xcb, 0xa6, 0x25, 0x4a, 0xdf, + 0xa1, 0x39, 0x13, 0x47, 0x0a, 0xf0, 0xeb, 0xcb, 0x14, 0x01, + 0x28, 0x9c, 0x0f, 0xe2, 0x62, 0xca, 0xb5, 0x40, 0x51, 0x45, + 0x8e, 0x18, 0x88, 0xc9, 0x58, 0xaf, 0xb3, 0x48, 0xd5, 0x20, + 0xe8, 0xd8, 0x5b, 0xa2, 0x98, 0x74, 0x25, 0xfa, 0x25, 0x19, + 0x82, 0x22, 0xfa, 0x82, 0x7c, 0x38, 0x8d, 0x62, 0x86, 0x01, + 0x63, 0x20, 0x36, 0x8e, 0xaf, 0x15, 0x8a, 0x74, 0x1e, 0xfd, + 0x7f, 0xbe, 0x60, 0xc3, 0x65, 0x31, 0xce, 0xdb, 0x92, 0xb9, + 0x13, 0x2a, 0x78, 0xa9, 0xfc, 0x6a, 0x7b, 0x18, 0xec, 0x0c, + 0x7b, 0x4c, 0x86, 0xaf, 0xea, 0x6d, 0x52, 0x09, 0x76, 0x52, + 0x87, 0x8a, 0x0b, 0x2a, 0xf3, 0x93, 0x35, 0x92, 0x8b, 0x60, + 0x42, 0x2e, 0x12, 0xa9, 0xf7, 0x7c, 0x61, 0x5c, 0x8f, 0xc0, + 0xaa, 0x6e, 0x6a, 0xf6, 0x48, 0x48, 0xc6, 0x3e, 0xe0, 0x1d, + 0xb4, 0xfb, 0xc4, 0xd8, 0x01, 0xb8, 0xf2, 0xf4, 0xdf, 0xc1, + 0xba, 0xb5, 0xf2, 0x27, 0x3f, 0xdb, 0x78, 0x62, 0x1c, 0x0a, + 0xbe, 0xdb, 0xdd, 0x3c, 0x0c, 0x29, 0x85, 0xf1, 0x44, 0x5f, + 0x2b, 0x43, 0x80, 0x57, 0xa7, 0x5a, 0x4d, 0x1b, 0xbe, 0x03, + 0xe7, 0x55, 0x7b, 0x91, 0x9d, 0x4c, 0x8b, 0xd7, 0xfd, 0xde, + 0x65, 0x7e, 0xa8, 0x48, 0xbb, 0xa9, 0x96, 0x06, 0x7f, 0xc0, + 0x6c, 0xed, 0x87, 0x53, 0x77, 0xb4, 0x5a, 0x7c, 0xbb, 0xce, + 0xcf, 0x01, 0x08, 0x45, 0x61, 0xc1, 0x28, 0xb6, 0xf2, 0xb4, + 0x5b, 0x6b, 0x84, 0xfe, 0x18, 0x09, 0x39, 0xc1, 0xc8, 0x96, + 0x36, 0x6e, 0xba, 0x7e, 0x48, 0x12, 0xe6, 0xdc, 0x22, 0x48, + 0x17, 0x0b, 0xbd, 0x92, 0x64, 0xfa, 0xc9, 0x9b, 0x07, 0xda, + 0xed, 0x04, 0x68, 0x42, 0x15, 0x8c, 0xf9, 0xd8, 0xc3, 0x0d, + 0x21, 0x9d, 0x96, 0xbc, 0xc3, 0x07, 0x1a, 0x2c, 0x59, 0x3f, + 0x1a, 0x83, 0x43, 0xf0, 0xe0, 0xde, 0xe3, 0x40, 0x8e, 0x04, + 0x66, 0x3c, 0x87, 0x1e, 0xfa, 0x7b, 0x8a, 0x7b, 0xd2, 0x9e, + 0x15, 0xf5, 0xec, 0x3c, 0x72, 0x7e, 0x2d, 0x19, 0xf8, 0xfd, + 0xf0, 0x28, 0x71, 0x8a, 0xf5, 0xcb, 0x4c, 0x61, 0x5f, 0x85, + 0xe0, 0x6f, 0xb8, 0xf3, 0x17, 0x10, 0xcb, 0x44, 0x45, 0x8c, + 0x96, 0x08, 0xa1, 0xf1, 0x48, 0xa4, 0x1d, 0xea, 0x35, 0x2f, + 0x82, 0x2b, 0xc2, 0x0b, 0xef, 0x73, 0xe1, 0xc2, 0x35, 0xdb, + 0xe7, 0x68, 0xfd, 0xb0, 0xe8, 0x7b, 0x2d, 0x0f, 0xfd, 0x53, + 0x1b, 0xb8, 0x36, 0x54, 0xd6, 0x43, 0x30, 0xcf, 0x83, 0xb0, + 0x18, 0xda, 0x9b, 0x86, 0x82, 0xfa, 0xe6, 0x37, 0x5b, 0x9e, + 0xa4, 0xdb, 0x7c, 0x59, 0x25, 0x59, 0xc6, 0x46, 0x36, 0x72, + 0xc5, 0x72, 0xd8, 0x2f, 0x26, 0xe2, 0xee, 0xe3, 0xcb, 0xe5, + 0x33, 0x1f, 0x18, 0x2e, 0x16, 0xce, 0xd2, 0x9c, 0x89, 0x6e, + 0xd5, 0x21, 0xfa, 0x58, 0x83, 0xa9, 0x4c, 0x69, 0x97, 0x7d, + 0xae, 0x1f, 0x65, 0xd5, 0xdb, 0xf0, 0xfe, 0xd5, 0x32, 0xb1, + 0x50, 0x72, 0xdf, 0x2b, 0xe2, 0xc1, 0xe6, 0x2e, 0x8b, 0x87, + 0xa8, 0x4e, 0x84, 0xbe, 0xc9, 0x27, 0xb5, 0x74, 0x7e, 0x13, + 0x17, 0x57, 0x9c, 0xc6, 0xd3, 0x9f, 0xcd, 0x86, 0x50, 0x4b, + 0x6c, 0x50, 0xa2, 0xba, 0xfe, 0xf6, 0xd5, 0x85, 0x68, 0x31, + 0x89, 0xfb, 0xeb, 0xfe, 0x92, 0xb0, 0xd0, 0x4c, 0xbc, 0x65, + 0x4b, 0x62, 0xe2, 0xdf, 0x88, 0x7e, 0x90, 0xe0, 0xb3, 0xec, + 0x13, 0x69, 0x33, 0xea, 0x53, 0x69, 0x9a, 0x0b, 0x27, 0xfb, + 0xca, 0x9f, 0x9e, 0x1f, 0xcf, 0xb1, 0xeb, 0xf4, 0x8f, 0xe2, + 0x53, 0xc8, 0xe6, 0x51, 0x75, 0xee, 0xb1, 0x34, 0x3e, 0x37, + 0xdd, 0x2d, 0x3a, 0x72, 0x76, 0x33, 0xc1, 0x27, 0xe7, 0xbd, + 0xc1, 0x7f, 0xcb, 0x53, 0x5d, 0xdf, 0xc4, 0x1f, 0x36, 0xdb, + 0x6a, 0x91, 0x1f, 0x6a, 0xa5, 0xc6, 0xe2, 0x37, 0x68, 0x1a, + 0x7d, 0xf7, 0xed, 0x2a, 0xc7, 0x99, 0x5e, 0xbd, 0x59, 0x57, + 0x09, 0x22, 0x7e, 0x9c, 0xbd, 0x8e, 0xad, 0xbe, 0xee, 0xa5, + 0x2a, 0xe3, 0x9f, 0xff, 0x14, 0xda, 0xba, 0x90, 0x37, 0xba, + 0x3a, 0x42, 0xcd, 0x4a, 0x28, 0x47, 0x27, 0x58, 0x7a, 0x33, + 0x93, 0x77, 0x83, 0x29, 0xab, 0x47, 0x19, 0x43, 0x00, 0x6f, + 0xe7, 0x77, 0xc1, 0xaa, 0xd6, 0xbc, 0xc0, 0x1b, 0xd0, 0xdf, + 0xf9, 0x40, 0x4d, 0xb2, 0x60, 0xce, 0x59, 0x17, 0x0a, 0xa9, + 0x14, 0x4e, 0x6a, 0x30, 0x1b, 0x26, 0x68, 0x55, 0x12, 0x19, + 0x62, 0x85, 0x5d, 0xa6, 0xb4, 0x48, 0x4a, 0xe9, 0xe1, 0x57, + 0xb1, 0x48, 0xf3, 0x86, 0xd1, 0x50, 0x2e, 0x1d, 0x57, 0xbe, + 0x09, 0xf8, 0x53, 0x40, 0xd9, 0x55, 0xd9, 0x71, 0x4c, 0xa7, + 0xdb, 0x61, 0x82, 0x4e, 0x00, 0x58, 0xe4, 0x89, 0xae, 0xa6, + 0x1a, 0x4b, 0xe3, 0x9d, 0xec, 0x65, 0xee, 0xe1, 0x7b, 0xdb, + 0x4f, 0x8d, 0xf3, 0xd9, 0x89, 0xaa, 0xd1, 0x31, 0x30, 0xde, + 0xc3, 0x5c, 0xbc, 0xb9, 0x60, 0x0a, 0xe0, 0x13, 0x14, 0x85, + 0x08, 0x60, 0xc5, 0x1c, 0xc2, 0x9d, 0x8b, 0x6e, 0xb8, 0x94, + 0x11, 0x6f, 0xd3, 0xee, 0xfb, 0xf8, 0x15, 0xd8, 0xa4, 0x0b, + 0x92, 0xdf, 0x7c, 0x9a, 0xa2, 0xec, 0xa3, 0x3d, 0xbc, 0xcd, + 0xe8, 0xb5, 0xb3, 0xf5, 0xe8, 0xee, 0x2a, 0x57, 0xf7, 0x58, + 0xc4, 0xaa, 0xeb, 0x33, 0x44, 0x5f, 0x62, 0xbe, 0x90, 0x48, + 0xe5, 0xcb, 0x6a, 0xcb, 0x55, 0x94, 0x6d, 0xe6, 0x22, 0x03, + 0xeb, 0xcb, 0x05, 0xb8, 0xb4, 0xa5, 0xbe, 0xec, 0x79, 0x21, + 0x0d, 0xb3, 0x5c, 0x74, 0x11, 0xcb, 0xb3, 0xa6, 0x06, 0x2f, + 0x73, 0xd1, 0x14, 0xd9, 0x70, 0x4e, 0xc5, 0xf5, 0xff, 0xfd, + 0x49, 0x3b, 0xa9, 0x22, 0x80, 0x2a, 0x5e, 0xf9, 0xae, 0xa5, + 0xd4, 0x3c, 0x74, 0xd7, 0x5a, 0x5d, 0x88, 0x6f, 0x99, 0xe2, + 0x4c, 0xa3, 0x9b, 0x15, 0xb8, 0xfd, 0x0b, 0x0d, 0x57, 0x03, + 0xe8, 0xda, 0x78, 0xc4, 0x63, 0x49, 0x48, 0x7a, 0x39, 0xcd, + 0xfa, 0xad, 0x92, 0x55, 0x4a, 0x0e, 0x68, 0x08, 0xb9, 0x34, + 0xe0, 0x14, 0x6e, 0x19, 0xed, 0x69, 0x14, 0x7f, 0xc1, 0x7d, + 0x12, 0xac, 0x5d, 0xf7, 0x62, 0x6f, 0x77, 0x65, 0xa3, 0xc2, + 0xf9, 0xda, 0x43, 0x9e, 0x6b, 0x82, 0xd9, 0x14, 0x57, 0x02, + 0x09, 0x9f, 0xa7, 0x15, 0x27, 0xe8, 0xad, 0xa1, 0x73, 0xc7, + 0xb6, 0x11, 0x4c, 0x5e, 0xf4, 0x1a, 0x0a, 0x97, 0x98, 0x5e, + 0x29, 0x8a, 0x8b, 0xa5, 0xbd, 0x86, 0x7f, 0x6d, 0x31, 0x72, + 0x6d, 0xe5, 0xcf, 0x13, 0xff, 0xb9, 0x4e, 0x69, 0x66, 0x37, + 0x1b, 0xfb, 0xe8, 0xb7, 0x60, 0xfe, 0xbf, 0xaa, 0x06, 0x88, + 0xa4, 0xa2, 0x0b, 0x33, 0x55, 0xac, 0x61, 0x77, 0x0a, 0x6f, + 0x1f, 0xaf, 0xd8, 0x9b, 0xc7, 0x26, 0x13, 0xf6, 0xc4, 0xef, + 0xce, 0x0f, 0x16, 0x86, 0x64, 0x1b, 0xc0, 0x71, 0x35, 0xf9, + 0x1f, 0xaf, 0xc4, 0x7a, 0xa3, 0x3b, 0x89, 0x40, 0xcb, 0x09, + 0x11, 0x7b, 0x01, 0x54, 0xd5, 0xd2, 0x2a, 0xc8, 0xfe, 0x0e, + 0xef, 0x8c, 0xfb, 0x2b, 0x08, 0x12, 0x6d, 0xbb, 0xa8, 0x2e, + 0x7a, 0x2b, 0xc2, 0x91, 0x2a, 0x76, 0x0b, 0x31, 0x30, 0x4a, + 0x5b, 0xca, 0x96, 0xc9, 0x89, 0xa0, 0x12, 0x40, 0x76, 0xbe, + 0xcd, 0x59, 0x5f, 0xc2, 0x7b, 0xaf, 0xf6, 0x29, 0xde, 0xe9, + 0x24, 0x61, 0x3f, 0x46, 0x78, 0xa7, 0xda, 0x65, 0xb0, 0xb3, + 0xae, 0xf3, 0x72, 0x6e, 0x37, 0x6e, 0xae, 0xb1, 0x3b, 0xf6, + 0x60, 0xa1, 0x92, 0x86, 0x9e, 0x97, 0x4f, 0x5e, 0x86, 0x88, + 0x32, 0x06, 0x7c, 0xe3, 0x37, 0x7e, 0xb1, 0x83, 0xf5, 0x83, + 0x05, 0x43, 0xb3, 0xe3, 0xa1, 0x68, 0xe5, 0x4c, 0x92, 0x9c, + 0x61, 0xa3, 0x5d, 0xcf, 0x23, 0xe7, 0xce, 0xf5, 0x7f, 0xbb, + 0xf7, 0x89, 0x5e, 0xa8, 0xf0, 0xa1, 0xff, 0x1a, 0xaf, 0x15, + 0xc8, 0x3d, 0x8b, 0xce, 0x06, 0xa4, 0x60, 0xd6, 0x40, 0x19, + 0x48, 0x33, 0x53, 0x34, 0x9e, 0xd8, 0x75, 0xfc, 0x45, 0x73, + 0x35, 0x8f, 0x70, 0x04, 0x80, 0xa1, 0xe5, 0xfc, 0x98, 0xb0, + 0x52, 0x63, 0x41, 0x84, 0x57, 0xa2, 0x85, 0x4e, 0x68, 0x13, + 0x2d, 0x3e, 0x4b, 0x68, 0x7f, 0x43, 0x04, 0x05, 0x02, 0x5a, + 0x16, 0x67, 0x5a, 0xc5, 0xea, 0xac, 0x25, 0x61, 0xd4, 0xa4, + 0xe7, 0xbe, 0x13, 0x95, 0xbd, 0x03, 0xb4, 0x26, 0xe3, 0xbf, + 0x7e, 0xe5, 0x0b, 0x34, 0xeb, 0x59, 0x5d, 0xd7, 0xdb, 0x1e, + 0x07, 0xfc, 0x63, 0xab, 0xbb, 0xc6, 0x7a, 0x51, 0x50, 0x59, + 0x13, 0x4b, 0x27, 0x88, 0x98, 0xdc, 0x01, 0x37, 0xeb, 0x58, + 0x75, 0xde, 0x5a, 0xa4, 0x6b, 0xdd, 0xba, 0x01, 0x40, 0xf7, + 0x1c, 0x0a, 0xf3, 0x02, 0x3d, 0x54, 0x64, 0xf2, 0x85, 0x43, + 0x90, 0xc0, 0x69, 0x18, 0x94, 0x95, 0x6e, 0x57, 0x14, 0xda, + 0x27, 0x0a, 0x42, 0xb2, 0x5a, 0x78, 0xe4, 0xf1, 0x45, 0x85, + 0x54, 0xec, 0x44, 0xa0, 0xcb, 0xf4, 0xd1, 0x3a, 0x85, 0x74, + 0x0f, 0x04, 0x67, 0xf4, 0x42, 0x01, 0xc4, 0x04, 0x66, 0x48, + 0x6c, 0xbe, 0x84, 0x38, 0x6e, 0xda, 0x23, 0xd0, 0xd1, 0x26, + 0x94, 0x11, 0x65, 0x2e, 0xc6, 0xd8, 0x6e, 0x25, 0x17, 0x43, + 0x9f, 0x55, 0x2d, 0x1d, 0x55, 0xa9, 0xdd, 0x3b, 0xc7, 0x09, + 0xde, 0x26, 0x64, 0xd4, 0x85, 0x21, 0x15, 0x0d, 0x4a, 0x45, + 0x4d, 0xba, 0x13, 0x9e, 0x3b, 0x5e, 0xc2, 0xf7, 0xc1, 0x34, + 0xc5, 0x74, 0xd4, 0x95, 0x19, 0x3d, 0x69, 0x9c, 0xae, 0xef, + 0x13, 0x95, 0x2c, 0x77, 0xdd, 0x64, 0x2c, 0x12, 0x31, 0x7d, + 0xb5, 0x55, 0xde, 0x69, 0x35, 0x3f, 0x77, 0x72, 0xc6, 0x21, + 0x22, 0x23, 0x7a, 0x05, 0xbf, 0x92, 0xae, 0x49, 0x7f, 0x74, + 0x17, 0x97, 0x5f, 0x5b, 0x4d, 0x7d, 0x86, 0x23, 0x04, 0xe0, + 0xff, 0x10, 0x06, 0xc3, 0xd3, 0x05, 0xde, 0xc4, 0xae, 0xaf, + 0x3d, 0x2d, 0xaf, 0x3c, 0xaf, 0xd3, 0xd5, 0xfd, 0x84, 0xd8, + 0x3b, 0x6c, 0x8e, 0x8b, 0x23, 0x8b, 0x16, 0xaa, 0x67, 0xf1, + 0xde, 0xa4, 0x4b, 0x5a, 0x39, 0x60, 0x73, 0xd2, 0x9f, 0x1f, + 0x8c, 0xcf, 0xbc, 0xaa, 0x74, 0x9e, 0x8d, 0xfd, 0xc3, 0xb7, + 0x86, 0xe5, 0xbb, 0x5a, 0x4d, 0x3d, 0xe2, 0xc3, 0x28, 0x78, + 0x26, 0xd4, 0xb3, 0x45, 0x94, 0xd3, 0x2d, 0xbf, 0x8c, 0x92, + 0x56, 0x3c, 0x6e, 0xea, 0x53, 0x38, 0x7f, 0x22, 0x67, 0xc9, + 0xa7, 0x14, 0x20, 0xb9, 0x13, 0xc4, 0xa0, 0x44, 0x83, 0xc4, + 0x19, 0xca, 0x98, 0x71, 0xc7, 0x13, 0x70, 0x3a, 0xa7, 0xfb, + 0x9e, 0xc4, 0x94, 0x8c, 0xfd, 0x21, 0x36, 0x88, 0xea, 0x23, + 0xc7, 0x43, 0x52, 0x9f, 0xf4, 0x9e, 0xb1, 0xb4, 0xd3, 0x20, + 0x65, 0xd8, 0x18, 0x25, 0x80, 0xb7, 0xe4, 0x5c, 0x96, 0x3a, + 0xa3, 0xb5, 0x40, 0x63, 0xac, 0x02, 0x34, 0x51, 0xf7, 0x12, + 0xea, 0x97, 0x9d, 0x3e, 0xe7, 0xcb, 0x88, 0x15, 0xaa, 0xe3, + 0xfe, 0xe5, 0x42, 0xe5, 0x48, 0xcf, 0xc6, 0x8e, 0x0e, 0xc6, + 0x48, 0xdb, 0xe5, 0x1e, 0x79, 0x99, 0xed, 0x78, 0xa6, 0x37, + 0xdd, 0xe3, 0x7b, 0x01, 0xdd, 0x20, 0x63, 0x45, 0x57, 0xd1, + 0x0f, 0x05, 0x5d, 0x29, 0xad, 0x99, 0x6c, 0x27, 0xa3, 0x0c, + 0x72, 0x81, 0xb1, 0x26, 0x16, 0xaf, 0x11, 0x65, 0xba, 0x79, + 0xbc, 0xb8, 0xfe, 0xe7, 0xc5, 0xe6, 0x4c, 0xfa, 0x37, 0xc5, + 0xe0, 0x2e, 0x4e, 0xef, 0x75, 0xe4, 0x04, 0xaf, 0xfa, 0x41, + 0x7f, 0x58, 0x2e, 0x8f, 0x95, 0x5f, 0x15, 0x5c, 0x15, 0x23, + 0x81, 0xb7, 0x2c, 0x81, 0x70, 0xf5, 0xcc, 0x60, 0x09, 0x7e, + 0xf1, 0x0d, 0x9c, 0x9d, 0xcc, 0xa0, 0x30, 0xa8, 0x82, 0x23, + 0x5f, 0x94, 0xcb, 0x18, 0xc4, 0x32, 0xe6, 0xab, 0xcd, 0x96, + 0x9e, 0xab, 0xcd, 0x68, 0x6f, 0x88, 0xb7, 0x72, 0x65, 0xbc, + 0x1e, 0x05, 0x60, 0xfe, 0x6b, 0x77, 0x2a, 0x11, 0x63, 0x59, + 0x29, 0xdb, 0xba, 0xe0, 0x50, 0xd5, 0x51, 0x77, 0x16, 0xb8, + 0xb7, 0xf4, 0xa9, 0xbe, 0xf0, 0xa5, 0xaa, 0x20, 0x50, 0x2e, + 0x73, 0x21, 0xee, 0x77, 0xa3, 0xc8, 0xbc, 0x0c, 0x16, 0x0f, + 0x83, 0x7b, 0xaf, 0xbb, 0x91, 0x95, 0xd3, 0x6e, 0xe7, 0x28, + 0x77, 0x00, 0xbc, 0x83, 0x46, 0xa5, 0x0a, 0x19, 0xe8, 0x10, + 0xfb, 0x24, 0xeb, 0x27, 0xc2, 0xa3, 0xdd, 0xb8, 0x5b, 0x27, + 0xb9, 0xbb, 0x49, 0xd9, 0xd0, 0x32, 0x94, 0x48, 0x1b, 0xb8, + 0xf8, 0xb2, 0x30, 0xf4, 0x1f, 0x3d, 0xbf, 0xe6, 0xf3, 0x34, + 0xd3, 0x32, 0x85, 0x67, 0x85, 0x13, 0x3e, 0x20, 0xb7, 0xfa, + 0x74, 0x27, 0x74, 0x8f, 0x55, 0x47, 0x15, 0x91, 0x0b, 0x3f, + 0xb1, 0x18, 0xe7, 0x11, 0x1e, 0x52, 0xd8, 0xd1, 0x3f, 0xb9, + 0x5d, 0x4f, 0x88, 0xb9, 0x1e, 0x5a, 0xb6, 0x90, 0x64, 0xad, + 0x6f, 0x8d, 0x33, 0xb3, 0x57, 0xde, 0x3e, 0x13, 0xb3, 0x9f, + 0x2d, 0x00, 0xb1, 0x79, 0x84, 0x60, 0x6d, 0x3c, 0x5f, 0xc0, + 0x34, 0x08, 0x4b, 0x58, 0x33, 0x59, 0xfe, 0xe5, 0xed, 0xd3, + 0x10, 0xd8, 0xd8, 0x85, 0xc3, 0xc9, 0x71, 0xcf, 0x40, 0x96, + 0xc0, 0xd5, 0x5e, 0x62, 0xe7, 0xcb, 0x33, 0xee, 0x72, 0xb5, + 0xb8, 0x6e, 0xea, 0x13, 0xde, 0xeb, 0x82, 0x03, 0x8e, 0x6c, + 0xb3, 0x67, 0xb1, 0x5f, 0xd4, 0xe1, 0xd9, 0xc2, 0x7a, 0x97, + 0xbb, 0xd4, 0x5e, 0x0b, 0xfe, 0xc1, 0xb3, 0x1f, 0x2b, 0x1a, + 0x37, 0x98, 0x26, 0x27, 0xb1, 0xaf, 0x4c, 0x55, 0xe1, 0xae, + 0x4c, 0x86, 0x80, 0x4b, 0xc5, 0xf2, 0x35, 0x48, 0x81, 0xf7, + 0x83, 0x75, 0x63, 0x08, 0x0d, 0x77, 0x41, 0x14, 0xbc, 0xf3, + 0x6e, 0x46, 0xbd, 0x9c, 0x5a, 0x4f, 0x5c, 0x89, 0x26, 0xb6, + 0x6c, 0xde, 0x0d, 0x15, 0x31, 0xec, 0x7e, 0x13, 0xf2, 0x99, + 0x74, 0x40, 0x3c, 0xe1, 0xea, 0xa0, 0xc9, 0x99, 0x0a, 0x4b, + 0x17, 0x74, 0xff, 0x47, 0x15, 0x76, 0x5e, 0x44, 0xa2, 0x1c, + 0x93, 0xd3, 0xe6, 0xa2, 0x82, 0x0f, 0x7f, 0x55, 0xa8, 0xf3, + 0x79, 0xc3, 0xa8, 0x9f, 0x37, 0x2b, 0x97, 0x7e, 0x90, 0x71, + 0xfc, 0xa7, 0xff, 0xc6, 0xc7, 0x93, 0x5c, 0xc9, 0xed, 0x20, + 0x60, 0xbd, 0x5c, 0x36, 0x05, 0x55, 0x51, 0x55, 0x51, 0x15, + 0x36, 0x01, 0x17, 0xa9, 0x56, 0x27, 0x44, 0x66, 0xc9, 0x3a, + 0xb9, 0xbb, 0xee, 0x04, 0xb6, 0x2a, 0xfd, 0x10, 0x9a, 0x46, + 0xdd, 0x5d, 0x6d, 0xad, 0x21, 0x86, 0x6d, 0x62, 0x8a, 0x4a, + 0xbc, 0x73, 0xf0, 0x9d, 0x93, 0x0d, 0xf1, 0x62, 0xfa, 0x58, + 0x64, 0x37, 0x4f, 0x0b, 0xa3, 0xa1, 0x52, 0xce, 0x03, 0xce, + 0x0f, 0x77, 0x29, 0xad, 0x47, 0x38, 0xca, 0xbc, 0x61, 0xe6, + 0xad, 0xe4, 0x8b, 0xf1, 0x82, 0xa8, 0xd5, 0xe3, 0x8c, 0xd3, + 0xa0, 0xc4, 0xc0, 0x5e, 0x3b, 0xa1, 0x66, 0x2a, 0x6e, 0x88, + 0x24, 0x56, 0xe4, 0x84, 0x0a, 0x36, 0x72, 0xf3, 0x5c, 0x11, + 0xd9, 0x66, 0xd8, 0x45, 0x5c, 0x83, 0x9e, 0x1c, 0x8c, 0xc6, + 0xf6, 0x6e, 0x6a, 0xb1, 0x52, 0xed, 0x6c, 0x6a, 0x6d, 0x23, + 0xb9, 0x0b, 0x66, 0x26, 0x5a, 0x16, 0x16, 0x90, 0x43, 0xb9, + 0xc3, 0x02, 0xc1, 0x43, 0x93, 0x13, 0x94, 0xfe, 0xc3, 0x59, + 0x49, 0xbe, 0x1e, 0x26, 0x1b, 0x9d, 0x8e, 0xba, 0xc4, 0x29, + 0x51, 0x05, 0x28, 0x1f, 0x55, 0x59, 0x1c, 0x3e, 0x25, 0x86, + 0xcc, 0xc7, 0xd9, 0xd3, 0xa8, 0xe7, 0x10, 0xa0, 0xb6, 0x23, + 0xb9, 0xaf, 0x00, 0x8b, 0x7d, 0xf1, 0x5b, 0xd6, 0xb7, 0x56, + 0x44, 0x9b, 0x0a, 0xec, 0xa6, 0x2b, 0xb4, 0x4e, 0x1d, 0x4f, + 0xc5, 0x0b, 0x45, 0xd2, 0x3a, 0xc5, 0xc0, 0xbf, 0xb9, 0xdd, + 0x59, 0x21, 0xf2, 0x67, 0x25, 0x88, 0x9b, 0xb6, 0x66, 0x83, + 0xbf, 0x62, 0xfe, 0x7c, 0xfa, 0x9e, 0x50, 0xed, 0x15, 0x93, + 0xb6, 0x7a, 0xb0, 0xc4, 0xbe, 0xcf, 0x2a, 0x70, 0x4e, 0x52, + 0x20, 0xc1, 0x24, 0x08, 0x49, 0xd9, 0x05, 0x04, 0x53, 0x73, + 0xf3, 0xcf, 0x14, 0x70, 0xac, 0x3c, 0x45, 0x0f, 0x08, 0xa3, + 0xae, 0x43, 0xe7, 0x7f, 0x1f, 0xe2, 0x14, 0xf1, 0xbb, 0x25, + 0x20, 0xfd, 0xe4, 0xaf, 0x44, 0x9e, 0x77, 0x88, 0x4d, 0x26, + 0x09, 0xb1, 0xb0, 0x12, 0xf5, 0xdf, 0x3c, 0x53, 0x48, 0x78, + 0xb9, 0x60, 0x41, 0xd3, 0x8f, 0x8d, 0x11, 0x63, 0x60, 0x28, + 0x30, 0x07, 0xa2, 0x14, 0x3b, 0x8c, 0x50, 0xe2, 0xee, 0x73, + 0x39, 0x66, 0xd1, 0x51, 0x87, 0xac, 0x90, 0x9b, 0x2c, 0x6d, + 0x8d, 0xd5, 0x75, 0x3f, 0xc6, 0xf1, 0x8f, 0xdf, 0xdb, 0x45, + 0x38, 0xf8, 0xd6, 0x7e, 0xc7, 0x7c, 0x44, 0x08, 0x4a, 0x14, + 0xa0, 0x84, 0x7c, 0x8b, 0x88, 0x40, 0x93, 0x89, 0xae, 0x2c, + 0x20, 0x07, 0x80, 0xec, 0xce, 0x4c, 0x2c, 0x4e, 0x49, 0x79, + 0x53, 0xe7, 0xde, 0xa2, 0x9e, 0x67, 0x21, 0x53, 0x7c, 0x85, + 0xe7, 0x6f, 0xbd, 0x93, 0xab, 0x63, 0xba, 0xf0, 0xbd, 0xea, + 0x39, 0x16, 0x47, 0xbf, 0xe6, 0x0c, 0xcb, 0x63, 0xc7, 0xc5, + 0xf1, 0xdc, 0x5a, 0x52, 0xcd, 0x4c, 0x53, 0x8b, 0x7e, 0xb1, + 0xc3, 0x4e, 0xe7, 0x61, 0x25, 0x01, 0xec, 0xae, 0x06, 0x74, + 0x9f, 0xbc, 0xbb, 0x2a, 0x47, 0x46, 0xe8, 0xae, 0xf2, 0xab, + 0x15, 0xed, 0xa6, 0x86, 0x8f, 0x2f, 0xe5, 0x67, 0x0f, 0xdd, + 0xbf, 0x70, 0x53, 0xaa, 0x9b, 0x74, }; static const int sizeof_bench_dilithium_level5_key = sizeof(bench_dilithium_level5_key); -#endif /* HAVE_PQC && HAVE_DILITHIUM */ +#endif /* !WOLFSSL_DILITHIUM_NO_SIGN */ -#if defined(HAVE_PQC) && defined(HAVE_SPHINCS) +#ifndef WOLFSSL_DILITHIUM_NO_VERIFY + +static const unsigned char bench_dilithium_level5_pubkey[] = { + 0xef, 0x49, 0x79, 0x47, 0x15, 0xc4, 0x8a, 0xa9, 0x74, 0x2a, + 0xf0, 0x36, 0x94, 0x5c, 0x91, 0x1c, 0x5d, 0xff, 0x2c, 0x83, + 0xf2, 0x8b, 0x04, 0xfc, 0x5d, 0x64, 0xbd, 0x49, 0x73, 0xcd, + 0xcc, 0x99, 0x50, 0x5f, 0x2b, 0x16, 0x3a, 0xbb, 0x98, 0xc0, + 0xa7, 0x69, 0x0e, 0x95, 0x99, 0x0b, 0xa2, 0x6c, 0xfe, 0x6c, + 0xdb, 0xc8, 0xa7, 0x09, 0x46, 0x6c, 0x90, 0x50, 0xa4, 0x75, + 0x30, 0xf7, 0x90, 0xac, 0x31, 0xb6, 0xdd, 0x21, 0xaf, 0xc6, + 0xf9, 0xfe, 0xee, 0xc6, 0x5b, 0xa8, 0x8f, 0x0a, 0x2e, 0xd0, + 0x42, 0xab, 0xa8, 0x3c, 0x8d, 0xbf, 0xf7, 0x44, 0xbd, 0x0d, + 0xcf, 0xf4, 0x68, 0xfc, 0x16, 0x67, 0xf7, 0x39, 0x48, 0x5f, + 0x56, 0xd1, 0xe7, 0x1f, 0x49, 0x80, 0x50, 0xbe, 0x54, 0xd1, + 0xb7, 0xc9, 0xd2, 0x32, 0xc7, 0x08, 0x8c, 0xde, 0x2c, 0x31, + 0xf6, 0x1d, 0xc7, 0xac, 0xb3, 0x79, 0xd7, 0x4b, 0x1b, 0x23, + 0x89, 0x0a, 0xdc, 0x8e, 0x44, 0x41, 0x14, 0x28, 0x99, 0x13, + 0xb3, 0x26, 0xa6, 0x0e, 0x83, 0x60, 0xaa, 0x8d, 0x7c, 0x23, + 0x13, 0xba, 0x6c, 0x28, 0x90, 0x56, 0x84, 0xa1, 0x23, 0x8b, + 0x81, 0x20, 0x97, 0x7c, 0x66, 0x3f, 0xed, 0x5d, 0xd0, 0xe4, + 0x5d, 0xee, 0x46, 0xbc, 0x4b, 0x3c, 0x03, 0xb5, 0xbc, 0x4d, + 0x8d, 0x37, 0xa3, 0x56, 0x4b, 0x33, 0xad, 0xef, 0xd4, 0xb6, + 0xec, 0xdb, 0x04, 0x9a, 0x19, 0x58, 0x57, 0xd8, 0x00, 0x3a, + 0x92, 0x61, 0x0c, 0x0b, 0xc8, 0x52, 0xe5, 0x04, 0x02, 0x9a, + 0x00, 0x7e, 0xec, 0x7e, 0x94, 0xaa, 0xef, 0x2d, 0x7f, 0xb6, + 0x2e, 0x7c, 0xb0, 0x73, 0xa2, 0x20, 0xc0, 0x07, 0x30, 0x41, + 0x50, 0x20, 0x14, 0x18, 0x21, 0x5e, 0x2a, 0x6f, 0x70, 0x21, + 0xd6, 0x97, 0x13, 0xb9, 0xc1, 0x9e, 0x90, 0x67, 0xcc, 0x55, + 0x8a, 0xec, 0xec, 0x0a, 0x1e, 0x90, 0xdc, 0x3f, 0xb0, 0x4d, + 0xd1, 0x18, 0xea, 0x4f, 0xcb, 0x5d, 0x15, 0x4c, 0xb8, 0x35, + 0x9b, 0x34, 0x24, 0x30, 0x06, 0x53, 0x17, 0xf0, 0xbe, 0x27, + 0x36, 0xb3, 0x04, 0x6a, 0xbd, 0xbf, 0xa7, 0x39, 0xee, 0xa9, + 0x8f, 0x0e, 0x98, 0xc5, 0xf5, 0x9f, 0x46, 0x25, 0x93, 0xc9, + 0xf2, 0xf6, 0x2b, 0x8e, 0x92, 0x06, 0x01, 0x3d, 0x81, 0x18, + 0xf2, 0xec, 0xf1, 0x05, 0x4c, 0xad, 0x4b, 0xcb, 0x98, 0xa4, + 0xb5, 0x61, 0x20, 0xda, 0x81, 0xa1, 0xfb, 0x92, 0x4c, 0xaf, + 0x87, 0x6f, 0x6e, 0xd2, 0x57, 0xec, 0xcd, 0x94, 0xb3, 0x79, + 0xbf, 0x59, 0x88, 0x17, 0x81, 0xce, 0x8a, 0x57, 0xce, 0x57, + 0xae, 0x3e, 0x82, 0x81, 0x2f, 0x83, 0x61, 0xd8, 0xf9, 0x68, + 0x21, 0xe7, 0x72, 0x5b, 0xd6, 0x80, 0x55, 0x68, 0x5d, 0x67, + 0x15, 0x0c, 0x8b, 0xdc, 0x4f, 0xc3, 0x89, 0x36, 0x3c, 0xac, + 0xaf, 0x16, 0x5e, 0x1c, 0xfa, 0x68, 0x74, 0x6a, 0xab, 0x68, + 0xd8, 0x59, 0x96, 0x2d, 0x33, 0x62, 0xe4, 0xbd, 0xb3, 0xb7, + 0x4d, 0x88, 0x35, 0xb8, 0xed, 0xb2, 0x16, 0x85, 0x97, 0x08, + 0x71, 0x71, 0x39, 0x7e, 0x0c, 0x53, 0x16, 0xda, 0x38, 0xe5, + 0x28, 0x09, 0x9c, 0xd9, 0x46, 0xec, 0x68, 0xda, 0x8d, 0xd0, + 0xad, 0xb2, 0x79, 0x28, 0x3b, 0x1e, 0x12, 0xc9, 0xdf, 0xa9, + 0x6d, 0x3d, 0x29, 0x99, 0x2f, 0x53, 0xc2, 0xd0, 0xf9, 0x88, + 0x26, 0x94, 0x47, 0xaf, 0xf6, 0x96, 0xf3, 0xe1, 0x11, 0xa6, + 0x82, 0x3d, 0x43, 0x3f, 0x1f, 0xbc, 0xf6, 0x98, 0xbe, 0xff, + 0x06, 0x86, 0x61, 0x27, 0xdc, 0x91, 0x54, 0xd4, 0xfc, 0x68, + 0x83, 0xe8, 0x35, 0x3e, 0xee, 0x94, 0x59, 0x28, 0x2f, 0xde, + 0xdd, 0x03, 0x60, 0x66, 0xc1, 0x49, 0x57, 0xdd, 0xbc, 0xd5, + 0x0a, 0x67, 0x34, 0xf1, 0xa6, 0x0a, 0x57, 0x94, 0x65, 0x02, + 0x2c, 0x52, 0x43, 0x70, 0x3b, 0xc1, 0x9a, 0xff, 0xda, 0x6f, + 0xb9, 0x54, 0x47, 0x01, 0xda, 0x27, 0xe4, 0x48, 0x4a, 0x90, + 0x9f, 0xb5, 0xc3, 0xee, 0x0e, 0x09, 0x57, 0xfe, 0x48, 0x51, + 0x08, 0x34, 0x5e, 0x8f, 0x16, 0xc9, 0x0b, 0x74, 0xd9, 0x7d, + 0x22, 0x3f, 0xd6, 0xb7, 0x5d, 0xd6, 0x76, 0x00, 0x8d, 0x4e, + 0x78, 0x73, 0x86, 0xd6, 0xdb, 0x2a, 0x65, 0xab, 0xdf, 0xb0, + 0xea, 0x11, 0xad, 0xdf, 0xba, 0x43, 0xdb, 0xa8, 0x0a, 0xfb, + 0x04, 0x38, 0x81, 0x2b, 0xa3, 0x29, 0xfc, 0x95, 0x73, 0x9a, + 0x0c, 0x6c, 0x9e, 0xcd, 0xdc, 0xcf, 0x0a, 0x0c, 0x18, 0x41, + 0x6f, 0x1d, 0xa3, 0xf6, 0x12, 0x4c, 0x13, 0xf2, 0x02, 0xc6, + 0x50, 0x99, 0x86, 0x73, 0xa7, 0xf9, 0x7e, 0x84, 0x7f, 0x4c, + 0x00, 0xce, 0x2e, 0x21, 0x76, 0x8e, 0x17, 0x7a, 0x87, 0x6f, + 0x81, 0xe6, 0xc0, 0x52, 0xa5, 0xa0, 0x3c, 0x54, 0x3c, 0xec, + 0xb0, 0x9d, 0x1c, 0x3b, 0xec, 0xe5, 0x4e, 0x4a, 0x37, 0xe7, + 0xd5, 0xa9, 0x07, 0x87, 0x23, 0x28, 0x5d, 0x3d, 0x22, 0x02, + 0x79, 0x40, 0x3f, 0x2d, 0x40, 0xc9, 0xe5, 0xa6, 0x9b, 0xa8, + 0xb8, 0x76, 0xf6, 0x77, 0x5b, 0x8d, 0x72, 0x96, 0x3e, 0x13, + 0xbf, 0x76, 0xfa, 0x7b, 0xb7, 0x82, 0x5f, 0xe7, 0x9d, 0x54, + 0x0e, 0x05, 0x1a, 0x9f, 0xa4, 0x42, 0xa5, 0xb4, 0x93, 0x23, + 0x06, 0x59, 0x43, 0xa8, 0xe8, 0x5c, 0xfc, 0x18, 0x97, 0xdb, + 0xad, 0x9a, 0x80, 0x0a, 0xf2, 0x20, 0x50, 0xac, 0xc1, 0x13, + 0x3e, 0x98, 0x09, 0xde, 0xf2, 0x70, 0x9e, 0x14, 0xc2, 0x5c, + 0xec, 0x65, 0x07, 0x0b, 0xfa, 0x02, 0x5c, 0xf8, 0x71, 0xaa, + 0x9b, 0x45, 0x62, 0xe2, 0x27, 0xaf, 0x77, 0xf8, 0xe3, 0xeb, + 0x7b, 0x24, 0x7b, 0x3c, 0x67, 0xc2, 0x6d, 0x6e, 0x17, 0xae, + 0x6e, 0x86, 0x6f, 0x98, 0xc9, 0xac, 0x13, 0x9f, 0x87, 0x64, + 0x3d, 0x4d, 0x6f, 0xa0, 0xb3, 0x39, 0xc6, 0x68, 0x1b, 0xa7, + 0xeb, 0x3e, 0x0f, 0x6b, 0xc7, 0xa4, 0xe2, 0x20, 0x27, 0x75, + 0x3f, 0x09, 0x16, 0xff, 0x1a, 0xcc, 0xa7, 0xc4, 0x6d, 0xc2, + 0xfc, 0xc3, 0x0b, 0x37, 0x63, 0xff, 0x9b, 0x10, 0xe6, 0x00, + 0xf7, 0x18, 0x43, 0x9f, 0x07, 0x50, 0x31, 0x51, 0xd4, 0xfd, + 0xad, 0xa2, 0x0f, 0x77, 0xda, 0x41, 0xc1, 0x0a, 0x6f, 0x86, + 0xd7, 0xdc, 0x8a, 0x52, 0xd6, 0xa1, 0x27, 0xdb, 0x14, 0x67, + 0x26, 0x91, 0xb3, 0xcd, 0x01, 0x5f, 0x60, 0xa1, 0x7f, 0x43, + 0x15, 0x1a, 0x82, 0x0f, 0xd3, 0x66, 0x5f, 0x60, 0x57, 0x2f, + 0xb2, 0x8c, 0x27, 0x2a, 0x9d, 0x1b, 0xf9, 0xf2, 0x59, 0x20, + 0x39, 0xd9, 0xc5, 0xaf, 0xf2, 0x36, 0x8c, 0x58, 0x00, 0x1b, + 0xd0, 0xc5, 0x8e, 0x1a, 0x49, 0xa8, 0x60, 0xbe, 0xd1, 0xd7, + 0x2a, 0xb0, 0xc2, 0xab, 0x58, 0x8a, 0x7a, 0xa9, 0x41, 0x68, + 0x70, 0xbd, 0xea, 0x73, 0xa5, 0x03, 0x11, 0xb2, 0x27, 0xd9, + 0xcd, 0xf5, 0x09, 0xe8, 0x1c, 0xe2, 0x4f, 0x50, 0x6a, 0x84, + 0x34, 0x62, 0x2e, 0x36, 0xaa, 0x4c, 0xc1, 0x83, 0x78, 0x98, + 0x35, 0x7a, 0x27, 0x7e, 0xfe, 0xf1, 0x6f, 0x59, 0x27, 0x35, + 0x73, 0xce, 0x74, 0xaa, 0xb4, 0x72, 0x82, 0xa8, 0xe2, 0x81, + 0x7a, 0x6b, 0xca, 0x33, 0xa5, 0xda, 0xa2, 0x63, 0xca, 0x2e, + 0x90, 0x03, 0x32, 0xec, 0x63, 0xdb, 0x52, 0x7b, 0x16, 0xfc, + 0x01, 0x2d, 0x30, 0x12, 0x1e, 0xf9, 0xa3, 0x72, 0x21, 0x3c, + 0x75, 0x0c, 0x61, 0x9c, 0x7e, 0x73, 0x04, 0x71, 0x41, 0x45, + 0x5d, 0x7f, 0x49, 0x1c, 0x09, 0x08, 0xa4, 0xec, 0x2f, 0xfd, + 0xc4, 0xfb, 0x59, 0x6a, 0x27, 0x7a, 0xd4, 0xfc, 0x5f, 0x20, + 0x04, 0x34, 0x7d, 0x08, 0xed, 0x82, 0x5a, 0x90, 0xe1, 0xab, + 0xfd, 0x35, 0x3a, 0x8d, 0xbb, 0x0a, 0x9d, 0x73, 0xff, 0x69, + 0xe5, 0xe9, 0x09, 0x55, 0x14, 0xd9, 0x7b, 0x6f, 0x0d, 0x99, + 0xd2, 0x7e, 0x71, 0xf8, 0x4f, 0x72, 0x2f, 0xbb, 0xc6, 0xc4, + 0x36, 0xc9, 0x01, 0xd3, 0x9b, 0x94, 0xab, 0x41, 0x0f, 0x4a, + 0x61, 0x5c, 0x68, 0xe5, 0xd7, 0x0d, 0x94, 0xaa, 0xee, 0xba, + 0x95, 0xcb, 0x8c, 0x0e, 0x85, 0x3a, 0x02, 0x6b, 0x95, 0x50, + 0xfd, 0x02, 0xfd, 0xa4, 0x58, 0x29, 0x78, 0x4f, 0xd0, 0xae, + 0x66, 0xd6, 0x5c, 0xe7, 0x45, 0xfe, 0x98, 0xb0, 0xa3, 0xe2, + 0x87, 0xc0, 0xd2, 0x81, 0x08, 0xf1, 0xf1, 0xe7, 0xda, 0x62, + 0x9e, 0xa0, 0x34, 0x86, 0xeb, 0xa1, 0x6e, 0x4a, 0x26, 0x8e, + 0x39, 0x0c, 0x51, 0x10, 0x33, 0x11, 0x87, 0xf8, 0x79, 0x3c, + 0x49, 0x7a, 0x8b, 0xce, 0xc1, 0x0a, 0x0e, 0xe1, 0xd5, 0x2a, + 0xac, 0xf0, 0x3a, 0x1d, 0x6a, 0x6a, 0xe5, 0xe1, 0x81, 0x70, + 0xad, 0xaf, 0x15, 0x4c, 0x2a, 0x70, 0x2a, 0x6b, 0x22, 0x0d, + 0x30, 0xe7, 0x56, 0xed, 0x2d, 0x4b, 0x85, 0x17, 0x49, 0x72, + 0x3a, 0x1b, 0x6f, 0x57, 0x1c, 0xf7, 0x72, 0x9e, 0x20, 0xdb, + 0x57, 0x1c, 0xfb, 0x36, 0x50, 0x52, 0xec, 0x5b, 0xd6, 0x6a, + 0x1b, 0xf8, 0x74, 0xad, 0xe6, 0x00, 0x74, 0x04, 0xc5, 0x99, + 0x83, 0xe4, 0x5a, 0x0c, 0xc3, 0xe8, 0x6d, 0x3a, 0xd7, 0x3c, + 0x3c, 0xc0, 0x1a, 0x28, 0xb3, 0x29, 0x7a, 0x10, 0x9e, 0x39, + 0x66, 0x5b, 0xc1, 0x38, 0xac, 0x21, 0x4e, 0xcd, 0x01, 0xf2, + 0xf6, 0x30, 0x2c, 0x2b, 0xb6, 0xbf, 0xf5, 0xea, 0x61, 0xaf, + 0x0c, 0xa6, 0x01, 0x11, 0x15, 0x19, 0x09, 0x8c, 0x7e, 0x69, + 0xdf, 0x3b, 0xea, 0xd3, 0x0a, 0x3a, 0xd7, 0xbd, 0xe1, 0x17, + 0xaf, 0x92, 0x3c, 0xf5, 0xfe, 0x35, 0xd6, 0xcf, 0x07, 0xa6, + 0xf7, 0xe9, 0xc1, 0x99, 0xed, 0x80, 0xe3, 0x12, 0xd5, 0x4b, + 0xb9, 0xdf, 0xaf, 0x4e, 0x52, 0xad, 0x8e, 0x66, 0x87, 0xe5, + 0x2c, 0xd0, 0x45, 0x70, 0xd9, 0x78, 0x8f, 0x4b, 0xf4, 0xe1, + 0xf1, 0x22, 0xf2, 0xe3, 0xed, 0x1f, 0xeb, 0xe9, 0x70, 0x31, + 0x4c, 0x65, 0x5f, 0x55, 0xee, 0x5d, 0xaa, 0x83, 0x87, 0x76, + 0xbe, 0x11, 0xae, 0xd7, 0xf2, 0xfb, 0x43, 0xe7, 0x17, 0x81, + 0x33, 0x15, 0x47, 0xa0, 0xf3, 0x8e, 0x84, 0x57, 0xff, 0x35, + 0x9e, 0x4a, 0x8a, 0xab, 0x50, 0x3a, 0x45, 0xe0, 0xc3, 0x73, + 0xca, 0x77, 0x61, 0x68, 0x38, 0xd0, 0xa3, 0x5f, 0x03, 0x8d, + 0x41, 0xc2, 0xd3, 0x4a, 0x17, 0xe0, 0xa8, 0xaa, 0x00, 0xf3, + 0xf2, 0x5b, 0xa8, 0xe1, 0x06, 0xa6, 0x2b, 0xdb, 0xe1, 0x74, + 0xbd, 0xc4, 0xd2, 0x2b, 0x55, 0x9a, 0xb0, 0xf8, 0x35, 0xd8, + 0x6b, 0xec, 0xdb, 0xc5, 0xf4, 0x6c, 0x40, 0x90, 0x6a, 0x68, + 0xc9, 0xb5, 0xcb, 0xbb, 0xd0, 0xb0, 0xbc, 0x9f, 0xb9, 0xaa, + 0x50, 0x14, 0x93, 0x3b, 0x9f, 0x25, 0xcb, 0x40, 0xb8, 0x08, + 0xcc, 0x13, 0xe5, 0xdc, 0x3f, 0x84, 0x96, 0xe0, 0x73, 0x7b, + 0x7d, 0x9e, 0x41, 0x92, 0x5d, 0xcc, 0xa4, 0xea, 0x4f, 0x93, + 0x0c, 0x40, 0x2e, 0x42, 0x8a, 0xe9, 0xb9, 0x12, 0x74, 0xbb, + 0x79, 0x7c, 0xb0, 0x37, 0x20, 0xb6, 0xaf, 0x43, 0x3a, 0x88, + 0x59, 0x7c, 0x68, 0x28, 0x5f, 0x98, 0xc2, 0xf0, 0x2a, 0xbc, + 0xa1, 0x61, 0x88, 0x1f, 0x43, 0xbc, 0x42, 0x8f, 0x43, 0xf3, + 0x7e, 0x16, 0x96, 0xfa, 0x92, 0x70, 0xaf, 0x3c, 0x9f, 0x4b, + 0xd9, 0x60, 0xe9, 0xf6, 0x2e, 0x84, 0xda, 0x88, 0x31, 0x34, + 0xa6, 0x85, 0x10, 0x05, 0xef, 0x40, 0xa8, 0xa5, 0x4f, 0x92, + 0x59, 0xf7, 0xe0, 0xc4, 0x2b, 0x12, 0x17, 0x71, 0xbe, 0x8c, + 0x4a, 0x02, 0xfe, 0x12, 0xb6, 0x3b, 0x85, 0x75, 0x37, 0xf3, + 0x73, 0x2d, 0x9c, 0x00, 0x5d, 0x80, 0xad, 0x20, 0x2f, 0x5a, + 0x0b, 0x17, 0x7e, 0x67, 0x72, 0x24, 0x5a, 0xb9, 0xf3, 0xb1, + 0x33, 0xa4, 0x57, 0x1d, 0x49, 0x72, 0x2c, 0x7f, 0x47, 0x15, + 0x07, 0xe0, 0x45, 0x14, 0xdd, 0x77, 0x86, 0x6d, 0x03, 0xbe, + 0x57, 0xd0, 0xaa, 0x18, 0xa6, 0xdd, 0x94, 0x18, 0x3f, 0x8a, + 0xf3, 0xb5, 0xd7, 0x5a, 0xec, 0xc8, 0x79, 0x7f, 0x51, 0x61, + 0x3c, 0x9b, 0xb2, 0x9b, 0xf3, 0xb4, 0x35, 0xd1, 0x38, 0xbf, + 0x37, 0xce, 0x54, 0xd1, 0xf8, 0xb6, 0x45, 0xeb, 0x52, 0x0d, + 0x9a, 0x09, 0x58, 0x0d, 0x2c, 0x0b, 0xb1, 0xf2, 0x30, 0x3a, + 0x95, 0xc1, 0x13, 0x91, 0xd2, 0x9f, 0x8d, 0x8d, 0xd0, 0x38, + 0x3e, 0x4c, 0xae, 0x4a, 0x55, 0xa7, 0x42, 0x11, 0x83, 0xc4, + 0x70, 0xf0, 0x2b, 0x68, 0x9e, 0x07, 0xad, 0xb7, 0x83, 0xc6, + 0x53, 0x3c, 0xfb, 0x0a, 0x5d, 0x24, 0xdc, 0xe1, 0x55, 0x72, + 0xcf, 0xce, 0x3e, 0xc8, 0xd0, 0x57, 0x8a, 0x82, 0x5e, 0x78, + 0x2b, 0x80, 0xc5, 0xb9, 0x09, 0x46, 0xf8, 0x90, 0x39, 0x52, + 0xa9, 0xce, 0x3f, 0x3d, 0x41, 0x3b, 0x28, 0x45, 0xa3, 0xb3, + 0x21, 0xc2, 0xcd, 0x14, 0x49, 0x41, 0x6c, 0x38, 0xda, 0x1b, + 0x5f, 0x16, 0x49, 0xf9, 0x65, 0x00, 0x4e, 0xb4, 0x20, 0x55, + 0x70, 0xe8, 0x58, 0x1a, 0x18, 0xbf, 0x41, 0xef, 0x31, 0xb1, + 0xe7, 0x8d, 0x89, 0xc1, 0x48, 0xe8, 0xf5, 0x57, 0x35, 0xfa, + 0xc1, 0x79, 0xee, 0x2c, 0xe8, 0x7d, 0xb6, 0x03, 0xcc, 0x66, + 0x09, 0x6f, 0x52, 0x84, 0x0a, 0x34, 0x18, 0x2c, 0x01, 0x45, + 0x81, 0x00, 0xe5, 0x5e, 0x8d, 0xae, 0x1c, 0x96, 0x8b, 0x45, + 0x73, 0x00, 0x0a, 0xb5, 0xcf, 0x8d, 0x0e, 0x35, 0x5d, 0x1a, + 0x0e, 0xbf, 0x64, 0x9a, 0x52, 0x20, 0x48, 0xc6, 0xb9, 0x40, + 0xd3, 0x2c, 0x52, 0xca, 0x93, 0xcf, 0xbb, 0x94, 0x06, 0xf3, + 0x97, 0xee, 0xcc, 0x5d, 0xa3, 0xea, 0xf8, 0x5a, 0x39, 0x77, + 0x34, 0xd7, 0xf6, 0x4e, 0xbe, 0x8a, 0x07, 0x5f, 0x51, 0x53, + 0xc5, 0x1b, 0x8c, 0x47, 0x8f, 0x34, 0x0e, 0x60, 0x0a, 0x90, + 0xe2, 0xda, 0x7b, 0xef, 0xd6, 0xf5, 0x5d, 0xe5, 0x32, 0x37, + 0x75, 0x99, 0x81, 0x4a, 0x2a, 0x78, 0x71, 0xdc, 0xf4, 0xe5, + 0xca, 0xd8, 0x6b, 0x3b, 0x90, 0x68, 0x2e, 0x93, 0xc5, 0x10, + 0x42, 0x5d, 0x38, 0x90, 0x32, 0x46, 0xea, 0x87, 0xe0, 0xbc, + 0xb8, 0x9a, 0x18, 0x20, 0x68, 0x85, 0x6d, 0x9b, 0xc9, 0x8f, + 0x9b, 0xd2, 0xbe, 0x15, 0x12, 0x68, 0xd0, 0xb0, 0x16, 0x5f, + 0xe2, 0x69, 0x1d, 0x04, 0x00, 0xfc, 0x63, 0x33, 0xcd, 0x1f, + 0x89, 0xcd, 0x52, 0xff, 0xec, 0x19, 0x69, 0x74, 0xa3, 0xce, + 0x4d, 0xab, 0x93, 0xe4, 0xc6, 0x13, 0x56, 0x27, 0xc9, 0x25, + 0x5a, 0x01, 0xb2, 0x36, 0x8b, 0x61, 0xe5, 0x8b, 0x98, 0xac, + 0xe4, 0x2a, 0xb6, 0x40, 0x9f, 0x42, 0xe4, 0x1b, 0x52, 0xf7, + 0xfd, 0xd8, 0x30, 0x07, 0x33, 0xf9, 0x47, 0xcb, 0x3c, 0xad, + 0x12, 0xc1, 0xcc, 0x29, 0x62, 0x49, 0x04, 0x0c, 0x23, 0x97, + 0x5a, 0xa4, 0x84, 0x67, 0xde, 0x5a, 0xe5, 0x36, 0xd2, 0x88, + 0xf1, 0xd4, 0xeb, 0x13, 0x81, 0x54, 0x51, 0x11, 0xe3, 0xba, + 0xbc, 0xee, 0xdd, 0x6c, 0xcd, 0xe6, 0xb4, 0xa1, 0x8b, 0x0b, + 0x66, 0xfb, 0x8e, 0x50, 0xa0, 0xda, 0x69, 0x8d, 0xcc, 0x2d, + 0xe4, 0x2c, 0xc4, 0x37, 0xdf, 0x61, 0xc0, 0x03, 0xbd, 0x8b, + 0x28, 0xca, 0xd2, 0x8c, 0x1c, 0xf1, 0xa4, 0x26, 0x69, 0xe5, + 0xcf, 0x45, 0xdb, 0x5a, 0x47, 0x79, 0xed, 0x9f, 0xf7, 0xd2, + 0xdb, 0xba, 0x46, 0x53, 0x4f, 0xce, 0xa8, 0xbe, 0x8f, 0x4a, + 0xd6, 0xdf, 0x2e, 0x06, 0xe6, 0x4c, 0x9a, 0xc1, 0xb6, 0x49, + 0xed, 0xc4, 0xeb, 0xaa, 0xa4, 0x29, 0x6d, 0xd4, 0xcc, 0x8c, + 0xb6, 0x40, 0x11, 0x39, 0x69, 0xf7, 0x75, 0xcd, 0xb1, 0x99, + 0x46, 0x4e, 0xde, 0xcb, 0xf6, 0x9d, 0x32, 0xf3, 0xc9, 0x47, + 0x47, 0x7a, 0xcb, 0xfb, 0xa3, 0x0c, 0x3b, 0xdf, 0xb7, 0xde, + 0xec, 0x99, 0xde, 0xb0, 0x26, 0x04, 0x34, 0xae, 0x6b, 0xfc, + 0x99, 0xbc, 0xde, 0xd5, 0xbe, 0xe7, 0xeb, 0xf9, 0xe7, 0xa6, + 0x01, 0x9a, 0x0c, 0x5e, 0x66, 0xe6, 0x53, 0xe4, 0xd1, 0x58, + 0xac, 0xda, 0x69, 0x77, 0x7b, 0x68, 0xd6, 0x30, 0x2a, 0x9c, + 0x6b, 0xbe, 0x9f, 0x3d, 0x71, 0xd6, 0x54, 0xcd, 0x59, 0x4e, + 0x1f, 0xe3, 0x83, 0x4e, 0xd1, 0x8e, 0xaf, 0x97, 0xa8, 0xe5, + 0xb6, 0x59, 0x77, 0xa8, 0x02, 0x20, 0xe4, 0xeb, 0x44, 0x71, + 0xbc, 0x07, 0x14, 0x79, 0x4f, 0x0c, 0x27, 0x06, 0x39, 0xcf, + 0x7c, 0xef, 0x2b, 0x9b, 0x5e, 0xc4, 0x6d, 0x79, 0x13, 0x00, + 0x43, 0x6f, 0x51, 0x77, 0xb5, 0xc3, 0x72, 0xad, 0x13, 0xa9, + 0xe5, 0x9a, 0x5b, 0x1a, 0x99, 0x74, 0xc0, 0x7a, 0xf9, 0xc5, + 0xb0, 0x58, 0x35, 0x1c, 0xa5, 0x51, 0xdb, 0xa1, 0x14, 0xcd, + 0x26, 0x71, 0xb1, 0xe7, 0xaa, 0x14, 0xa7, 0x46, 0x93, 0xd3, + 0x5c, 0x8c, 0x1a, 0x91, 0x77, 0x46, 0x2e, 0x15, 0xaa, 0x9e, + 0xf7, 0x2b, 0x79, 0x41, 0x76, 0xf7, 0x22, 0x53, 0x7d, 0x51, + 0xdb, 0x98, 0x3d, 0x5b, 0x78, 0x5f, 0xc3, 0xc9, 0x29, 0xa3, + 0xff, 0x75, 0x82, 0x06, 0x9a, 0x16, 0x5e, 0xa4, 0x79, 0x0d, + 0xd1, 0x6d, 0x08, 0xff, 0x43, 0xef, 0x9c, 0xf3, 0x1b, 0x7a, + 0x3f, 0x34, 0xbe, 0x19, 0x15, 0x06, 0x33, 0xdb, 0xa5, 0x71, + 0xcb, 0x5f, 0x6b, 0x8d, 0xbd, 0x5b, 0x32, 0x91, 0xb2, 0x37, + 0x3d, 0xb4, 0x40, 0x9e, 0x02, 0x9b, 0xb7, 0x68, 0x20, 0x58, + 0x5c, 0xab, 0xcb, 0xc8, 0x23, 0x2d, 0x77, 0xcc, 0x0b, 0xf6, + 0x78, 0x6b, 0x80, 0x06, 0x91, 0xa9, 0xfd, 0x7e, 0xfa, 0x25, + 0x98, 0x9f, 0xcc, 0x79, 0x0a, 0x1a, 0x54, 0x83, 0xac, 0x64, + 0x16, 0x90, 0xe5, 0xd9, 0xa7, 0xd7, 0x1b, 0x86, 0x0d, 0xe6, + 0xe6, 0x22, 0x2b, 0x1f, 0x44, 0x49, 0x98, 0x9c, 0x51, 0x6f, + 0xcf, 0x58, 0x4a, 0xfa, 0xfa, 0x84, 0x12, 0xa5, 0x10, 0xf4, + 0xca, 0xf0, 0x98, 0x2b, 0xc9, 0x03, 0x71, 0x37, 0xe7, 0xdc, + 0xc2, 0xb1, 0x4e, 0x64, 0xde, 0x4f, 0x46, 0x0d, 0x6b, 0x25, + 0x88, 0x5d, 0xd6, 0xff, 0x23, 0x46, 0x57, 0x36, 0x14, 0x18, + 0xa7, 0xcb, 0xb8, 0xbd, 0xf0, 0xc5, 0x37, 0x36, 0xee, 0xe1, + 0xed, 0x9f, 0x4d, 0xd4, 0x39, 0xe5, 0x92, 0xcf, 0x95, 0x4d, + 0x66, 0x36, 0x5d, 0xd0, 0xcc, 0x07, 0xcf, 0x15, 0x5a, 0xce, + 0x14, 0xb8, 0xda, 0x0d, 0x3d, 0x1b, 0x45, 0xc5, 0x2e, 0x34, + 0x43, 0x25, 0x02, 0x3a, 0xcd, 0x14, 0x45, 0xfb, 0x3e, 0xf9, + 0x88, 0x5d, 0x0d, 0x29, 0x31, 0xb9, 0xa1, 0xe6, 0x31, 0x18, + 0x52, 0x46, 0x3f, 0x22, 0x4f, 0x9f, 0x7a, 0x65, 0x36, 0x88, + 0xa3, 0x1c, 0x3e, 0x6f, 0x50, 0x7a, 0x36, 0xbe, 0x56, 0x7e, + 0x50, 0xcb, 0x7a, 0x10, 0xa0, 0xec, 0xf6, 0x82, 0xd6, 0x30, + 0x1c, 0xe8, 0x4c, 0x50, 0xf9, 0x3e, 0xdb, 0xac, 0xbe, 0x4f, + 0x90, 0xb1, 0xd5, 0x1b, 0x12, 0x95, 0xfb, 0xe8, 0x08, 0x64, + 0x56, 0x7c, 0x96, 0xcc, 0x90, 0xb1, 0xbc, 0xa0, 0xf5, 0x32, + 0x69, 0xb3, 0x5f, 0x27, 0x0f, 0xbe, 0xc9, 0xbd, 0xeb, 0xfa, + 0x4b, 0x5c, 0xc5, 0x99, 0x9e, 0x5a, 0x04, 0xcc, 0xd0, 0x4d, + 0x29, 0xe8, 0x84, 0x55, 0x8c, 0xd7, 0xc4, 0x06, 0x13, 0x4d, + 0x92, 0xe5, 0x98, 0x9c, 0x4c, 0xc1, 0xf7, 0xaf, 0x7b, 0xd5, + 0x2b, 0x92, 0x68, 0x68, 0x19, 0x70, 0x4c, 0x9e, 0x46, 0xb8, + 0x34, 0xeb, 0x01, 0x47, 0xbe, 0x59, 0xab, 0x0b, 0x22, 0x25, + 0xe7, 0x56, 0xa8, 0xb4, 0x93, 0x3c, 0xd5, 0x98, 0x9f, 0x61, + 0x2e, 0xfa, 0xcb, 0x5f, 0x5b, 0xd8, 0x09, 0x83, 0xe9, 0x40, + 0xe9, 0x0e, 0x42, 0xdd, 0x17, 0xd7, 0x6e, 0x19, 0x8d, 0x95, + 0x0a, 0x93, +}; +static const int sizeof_bench_dilithium_level5_pubkey = + sizeof(bench_dilithium_level5_pubkey); + +#endif /* !WOLFSSL_DILITHIUM_NO_VERIFY */ + +#endif /* HAVE_DILITHIUM */ + +#if defined(HAVE_SPHINCS) /* certs/sphincs/bench_sphincs_fast_level1_key.der */ static const unsigned char bench_sphincs_fast_level1_key[] = { 0x30, 0x71, 0x02, 0x01, 0x00, 0x30, 0x08, 0x06, 0x06, 0x2B, - 0xCE, 0x0F, 0x06, 0x07, 0x04, 0x04, 0x62, 0x04, 0x60, 0x59, - 0xE0, 0xD4, 0x1F, 0x22, 0x74, 0xBD, 0xAC, 0x46, 0x01, 0xE4, - 0x8C, 0x89, 0xB7, 0x39, 0x20, 0x9F, 0x6F, 0x96, 0xC4, 0xE7, - 0x78, 0x0F, 0xA1, 0x7D, 0xEC, 0xE8, 0xD5, 0xC3, 0xDD, 0x45, - 0x13, 0x56, 0xCF, 0xEA, 0x68, 0x70, 0x2A, 0xFF, 0xDA, 0x9A, - 0xA3, 0x2B, 0xEC, 0x4D, 0xBF, 0x7D, 0x09, 0xC0, 0xCC, 0xF4, - 0x2F, 0xF2, 0xAC, 0x74, 0xDF, 0x0E, 0x20, 0x9D, 0xC2, 0x9E, - 0xD1, 0xB4, 0x12, 0x56, 0xCF, 0xEA, 0x68, 0x70, 0x2A, 0xFF, - 0xDA, 0x9A, 0xA3, 0x2B, 0xEC, 0x4D, 0xBF, 0x7D, 0x09, 0xC0, - 0xCC, 0xF4, 0x2F, 0xF2, 0xAC, 0x74, 0xDF, 0x0E, 0x20, 0x9D, - 0xC2, 0x9E, 0xD1, 0xB4, 0x12 + 0xCE, 0x0F, 0x06, 0x07, 0x0D, 0x04, 0x62, 0x04, 0x60, 0xD8, + 0xC4, 0x6E, 0x8D, 0x3B, 0xB7, 0xE7, 0x48, 0x8D, 0x6F, 0x0C, + 0x3D, 0xDF, 0xAB, 0x79, 0xB6, 0x62, 0xAE, 0x89, 0x19, 0x6F, + 0x5E, 0xF9, 0xD3, 0x3A, 0x69, 0xBA, 0xFF, 0x4C, 0x46, 0xDE, + 0xAA, 0x7C, 0x40, 0x79, 0x8C, 0xE1, 0xE5, 0x30, 0xE6, 0xDF, + 0x4E, 0x23, 0x5E, 0x14, 0xDB, 0x0A, 0x48, 0x4E, 0xF6, 0x57, + 0xCE, 0x45, 0x8F, 0x8B, 0x1D, 0x68, 0x63, 0xAA, 0x24, 0xA4, + 0xE1, 0x0D, 0xFB, 0x7C, 0x40, 0x79, 0x8C, 0xE1, 0xE5, 0x30, + 0xE6, 0xDF, 0x4E, 0x23, 0x5E, 0x14, 0xDB, 0x0A, 0x48, 0x4E, + 0xF6, 0x57, 0xCE, 0x45, 0x8F, 0x8B, 0x1D, 0x68, 0x63, 0xAA, + 0x24, 0xA4, 0xE1, 0x0D, 0xFB }; static const int sizeof_bench_sphincs_fast_level1_key = sizeof(bench_sphincs_fast_level1_key); @@ -5782,22 +5918,22 @@ static const unsigned char bench_sphincs_fast_level3_key[] = { 0x30, 0x81, 0xA3, 0x02, 0x01, 0x00, 0x30, 0x08, 0x06, 0x06, - 0x2B, 0xCE, 0x0F, 0x06, 0x08, 0x03, 0x04, 0x81, 0x93, 0x04, - 0x81, 0x90, 0x00, 0x8E, 0xB0, 0x75, 0x2E, 0xC5, 0x61, 0x66, - 0xEE, 0x01, 0xEE, 0x97, 0x13, 0xD7, 0x65, 0x69, 0xEA, 0x5C, - 0x23, 0xAA, 0x6E, 0x86, 0x04, 0xE9, 0x2A, 0xEC, 0x8C, 0xA3, - 0xB7, 0x28, 0xEB, 0xDF, 0x0E, 0x77, 0x07, 0x59, 0x3F, 0xB6, - 0x10, 0xB3, 0xCC, 0xE1, 0x09, 0x64, 0xC4, 0x42, 0x37, 0x71, - 0xDC, 0xB4, 0x20, 0x2D, 0x03, 0x00, 0x6C, 0x4C, 0x3F, 0xE3, - 0x80, 0x28, 0xEC, 0x90, 0xF9, 0xDB, 0x50, 0xFC, 0x0A, 0x58, - 0xC2, 0x81, 0xE2, 0x17, 0x06, 0x7A, 0x58, 0xBB, 0x21, 0x90, - 0xC8, 0xE6, 0x64, 0x8B, 0xF4, 0x68, 0x70, 0x1D, 0xE2, 0xAB, - 0x8F, 0x50, 0x4D, 0xEE, 0x29, 0xD7, 0x15, 0x5E, 0xDC, 0xB4, - 0x20, 0x2D, 0x03, 0x00, 0x6C, 0x4C, 0x3F, 0xE3, 0x80, 0x28, - 0xEC, 0x90, 0xF9, 0xDB, 0x50, 0xFC, 0x0A, 0x58, 0xC2, 0x81, - 0xE2, 0x17, 0x06, 0x7A, 0x58, 0xBB, 0x21, 0x90, 0xC8, 0xE6, - 0x64, 0x8B, 0xF4, 0x68, 0x70, 0x1D, 0xE2, 0xAB, 0x8F, 0x50, - 0x4D, 0xEE, 0x29, 0xD7, 0x15, 0x5E + 0x2B, 0xCE, 0x0F, 0x06, 0x08, 0x0A, 0x04, 0x81, 0x93, 0x04, + 0x81, 0x90, 0xB2, 0x3A, 0x67, 0xA6, 0x4B, 0x8E, 0xB9, 0xEF, + 0xAD, 0x99, 0xE4, 0x3D, 0x65, 0xE8, 0xEE, 0xCF, 0xAC, 0xCF, + 0x2F, 0xDE, 0xBC, 0x11, 0x67, 0x8D, 0x8F, 0x8D, 0x3E, 0x99, + 0x31, 0x67, 0xED, 0x31, 0x6A, 0x05, 0x47, 0xC1, 0xDA, 0xC5, + 0x14, 0x17, 0xA1, 0x93, 0x83, 0x44, 0x58, 0x09, 0x80, 0x3A, + 0x47, 0x67, 0x42, 0x6D, 0x4C, 0xB7, 0xC8, 0x7D, 0x37, 0xF3, + 0x90, 0xF7, 0x46, 0x92, 0xB6, 0x26, 0xF7, 0x4E, 0x0D, 0x8D, + 0xB8, 0xCA, 0x8B, 0xA8, 0x20, 0x5D, 0x67, 0x85, 0xD2, 0x83, + 0x2C, 0x2A, 0x38, 0x1F, 0x57, 0x89, 0x76, 0x8C, 0x6D, 0x88, + 0xCE, 0x18, 0x4F, 0xA7, 0x88, 0x48, 0x7C, 0x0D, 0x47, 0x67, + 0x42, 0x6D, 0x4C, 0xB7, 0xC8, 0x7D, 0x37, 0xF3, 0x90, 0xF7, + 0x46, 0x92, 0xB6, 0x26, 0xF7, 0x4E, 0x0D, 0x8D, 0xB8, 0xCA, + 0x8B, 0xA8, 0x20, 0x5D, 0x67, 0x85, 0xD2, 0x83, 0x2C, 0x2A, + 0x38, 0x1F, 0x57, 0x89, 0x76, 0x8C, 0x6D, 0x88, 0xCE, 0x18, + 0x4F, 0xA7, 0x88, 0x48, 0x7C, 0x0D }; static const int sizeof_bench_sphincs_fast_level3_key = sizeof(bench_sphincs_fast_level3_key); @@ -5805,27 +5941,27 @@ static const unsigned char bench_sphincs_fast_level5_key[] = { 0x30, 0x81, 0xD3, 0x02, 0x01, 0x00, 0x30, 0x08, 0x06, 0x06, - 0x2B, 0xCE, 0x0F, 0x06, 0x09, 0x03, 0x04, 0x81, 0xC3, 0x04, - 0x81, 0xC0, 0x91, 0x8B, 0xB7, 0x1A, 0x08, 0x61, 0x50, 0x70, - 0x26, 0x71, 0xCD, 0x36, 0x10, 0xE2, 0xB8, 0x95, 0x0D, 0xA7, - 0x57, 0xC7, 0x18, 0xFF, 0x55, 0xA4, 0x16, 0x9D, 0x3C, 0xF8, - 0xA3, 0x48, 0xB0, 0x9B, 0xFD, 0x22, 0xBE, 0x20, 0x3D, 0x88, - 0x96, 0x0B, 0xF1, 0x6D, 0x05, 0x8A, 0x1B, 0x71, 0xCE, 0xCD, - 0x31, 0x01, 0xEA, 0xAC, 0x62, 0x61, 0x1F, 0x4A, 0xC1, 0x62, - 0x05, 0x36, 0xBB, 0x7F, 0xEF, 0x5B, 0x42, 0x8B, 0xC6, 0xCD, - 0xEF, 0xCE, 0xE1, 0x00, 0x39, 0x4F, 0x01, 0xBC, 0x03, 0x94, - 0x00, 0xA8, 0x7F, 0x22, 0xB9, 0x9F, 0x79, 0x51, 0x25, 0x61, - 0x1B, 0x43, 0x47, 0x52, 0xD0, 0x39, 0x2B, 0x93, 0xC5, 0xD4, - 0x2A, 0xE1, 0xEF, 0x0B, 0x01, 0x36, 0xC3, 0x54, 0xC8, 0xDE, - 0xF4, 0xA2, 0x6F, 0x4C, 0x4B, 0xEC, 0x5D, 0x9D, 0xEE, 0xC9, - 0xFA, 0xBE, 0xFA, 0x5F, 0xC4, 0x89, 0xC1, 0xFC, 0xEB, 0xA8, - 0x42, 0x8B, 0xC6, 0xCD, 0xEF, 0xCE, 0xE1, 0x00, 0x39, 0x4F, - 0x01, 0xBC, 0x03, 0x94, 0x00, 0xA8, 0x7F, 0x22, 0xB9, 0x9F, - 0x79, 0x51, 0x25, 0x61, 0x1B, 0x43, 0x47, 0x52, 0xD0, 0x39, - 0x2B, 0x93, 0xC5, 0xD4, 0x2A, 0xE1, 0xEF, 0x0B, 0x01, 0x36, - 0xC3, 0x54, 0xC8, 0xDE, 0xF4, 0xA2, 0x6F, 0x4C, 0x4B, 0xEC, - 0x5D, 0x9D, 0xEE, 0xC9, 0xFA, 0xBE, 0xFA, 0x5F, 0xC4, 0x89, - 0xC1, 0xFC, 0xEB, 0xA8 + 0x2B, 0xCE, 0x0F, 0x06, 0x09, 0x0A, 0x04, 0x81, 0xC3, 0x04, + 0x81, 0xC0, 0xAB, 0xD3, 0xFD, 0x3B, 0x17, 0x00, 0xCD, 0xD5, + 0xB2, 0xEE, 0xD2, 0x36, 0xE5, 0xF7, 0x1D, 0xDC, 0xC8, 0x42, + 0xDB, 0x53, 0x6A, 0x8A, 0x0D, 0x6D, 0xD2, 0x3C, 0x1C, 0x7C, + 0x98, 0x4D, 0x73, 0xC8, 0xAB, 0x2E, 0xAA, 0x7A, 0xC0, 0x26, + 0xC4, 0x0D, 0x7E, 0xB4, 0xD3, 0xBB, 0x13, 0xF4, 0x6E, 0xFE, + 0x0E, 0xA5, 0xA4, 0x58, 0x57, 0xA2, 0xDD, 0x99, 0x62, 0xB9, + 0xBA, 0xC2, 0x5B, 0x26, 0xED, 0x6E, 0x99, 0xFA, 0x11, 0x0E, + 0xCF, 0x33, 0x54, 0x85, 0x56, 0x0C, 0xEB, 0x2A, 0xB0, 0xAA, + 0xEB, 0x74, 0x14, 0x89, 0x1A, 0xB9, 0x38, 0xF5, 0x29, 0x66, + 0x28, 0x28, 0x17, 0xF5, 0x72, 0x42, 0xEE, 0xC0, 0x14, 0x59, + 0xA0, 0x72, 0x9B, 0x9B, 0x1E, 0x7F, 0x70, 0x70, 0xBB, 0x89, + 0x0C, 0x7E, 0x87, 0x8B, 0x83, 0x80, 0x2B, 0x66, 0x58, 0x64, + 0x1D, 0x94, 0xAF, 0x58, 0xB5, 0x23, 0x2C, 0xA1, 0xE9, 0x95, + 0x99, 0xFA, 0x11, 0x0E, 0xCF, 0x33, 0x54, 0x85, 0x56, 0x0C, + 0xEB, 0x2A, 0xB0, 0xAA, 0xEB, 0x74, 0x14, 0x89, 0x1A, 0xB9, + 0x38, 0xF5, 0x29, 0x66, 0x28, 0x28, 0x17, 0xF5, 0x72, 0x42, + 0xEE, 0xC0, 0x14, 0x59, 0xA0, 0x72, 0x9B, 0x9B, 0x1E, 0x7F, + 0x70, 0x70, 0xBB, 0x89, 0x0C, 0x7E, 0x87, 0x8B, 0x83, 0x80, + 0x2B, 0x66, 0x58, 0x64, 0x1D, 0x94, 0xAF, 0x58, 0xB5, 0x23, + 0x2C, 0xA1, 0xE9, 0x95 }; static const int sizeof_bench_sphincs_fast_level5_key = sizeof(bench_sphincs_fast_level5_key); @@ -5833,17 +5969,17 @@ static const unsigned char bench_sphincs_small_level1_key[] = { 0x30, 0x71, 0x02, 0x01, 0x00, 0x30, 0x08, 0x06, 0x06, 0x2B, - 0xCE, 0x0F, 0x06, 0x07, 0x0A, 0x04, 0x62, 0x04, 0x60, 0x44, - 0x7A, 0xCF, 0xB9, 0x03, 0xF2, 0xB2, 0x41, 0xBC, 0x1A, 0xE6, - 0x75, 0x29, 0x04, 0xDA, 0x6C, 0x6E, 0x08, 0x17, 0x1E, 0x46, - 0x75, 0xE8, 0x32, 0x23, 0xCD, 0x11, 0xC8, 0x88, 0xF7, 0x00, - 0x11, 0x4C, 0xBD, 0x14, 0x62, 0xC2, 0x4B, 0x83, 0x36, 0xDE, - 0x61, 0x78, 0x7F, 0x09, 0x16, 0x97, 0x98, 0x3D, 0x52, 0x70, - 0x7F, 0xED, 0x86, 0xDB, 0x75, 0x42, 0x52, 0xF3, 0xB1, 0xAE, - 0x70, 0x7F, 0xD3, 0x4C, 0xBD, 0x14, 0x62, 0xC2, 0x4B, 0x83, - 0x36, 0xDE, 0x61, 0x78, 0x7F, 0x09, 0x16, 0x97, 0x98, 0x3D, - 0x52, 0x70, 0x7F, 0xED, 0x86, 0xDB, 0x75, 0x42, 0x52, 0xF3, - 0xB1, 0xAE, 0x70, 0x7F, 0xD3 + 0xCE, 0x0F, 0x06, 0x07, 0x10, 0x04, 0x62, 0x04, 0x60, 0xFF, + 0x26, 0x56, 0x65, 0xAC, 0x6C, 0x0B, 0x72, 0x2D, 0x8D, 0xB8, + 0x29, 0x4A, 0x15, 0x7E, 0xEF, 0x55, 0xFD, 0xBE, 0xF4, 0xC0, + 0xE6, 0x6F, 0x2B, 0x7A, 0x97, 0x60, 0x51, 0x1C, 0xCB, 0x82, + 0x43, 0x44, 0xDE, 0x14, 0x3D, 0x4F, 0xE7, 0x3C, 0x1C, 0xB3, + 0xBB, 0x9F, 0xE8, 0x9F, 0x8F, 0xA4, 0xAD, 0xB9, 0x52, 0xC1, + 0x31, 0xF7, 0xC1, 0x86, 0x7E, 0x73, 0xFB, 0x9E, 0x72, 0x57, + 0x8A, 0xD7, 0x44, 0x44, 0xDE, 0x14, 0x3D, 0x4F, 0xE7, 0x3C, + 0x1C, 0xB3, 0xBB, 0x9F, 0xE8, 0x9F, 0x8F, 0xA4, 0xAD, 0xB9, + 0x52, 0xC1, 0x31, 0xF7, 0xC1, 0x86, 0x7E, 0x73, 0xFB, 0x9E, + 0x72, 0x57, 0x8A, 0xD7, 0x44 }; static const int sizeof_bench_sphincs_small_level1_key = sizeof(bench_sphincs_small_level1_key); @@ -5851,22 +5987,22 @@ static const unsigned char bench_sphincs_small_level3_key[] = { 0x30, 0x81, 0xA3, 0x02, 0x01, 0x00, 0x30, 0x08, 0x06, 0x06, - 0x2B, 0xCE, 0x0F, 0x06, 0x08, 0x07, 0x04, 0x81, 0x93, 0x04, - 0x81, 0x90, 0x7E, 0x80, 0x20, 0x6C, 0x20, 0xAE, 0x7D, 0xAB, - 0xC1, 0x4E, 0x15, 0x51, 0x0C, 0xDD, 0x96, 0xAC, 0xFB, 0xD2, - 0x5B, 0xF1, 0xEB, 0x51, 0xDC, 0xC3, 0xB3, 0x92, 0x33, 0xC2, - 0x54, 0x59, 0x4F, 0xB2, 0x33, 0x7C, 0x10, 0xC6, 0xA3, 0x49, - 0x8D, 0x07, 0x52, 0xB2, 0xA1, 0x14, 0x0C, 0x54, 0x21, 0xD4, - 0xB1, 0xCC, 0xBD, 0xB1, 0x20, 0xAC, 0xF1, 0xBD, 0xF5, 0x60, - 0x2F, 0x07, 0x98, 0x57, 0x4E, 0x31, 0x6F, 0x42, 0x84, 0xCE, - 0x71, 0x72, 0x74, 0x20, 0xDF, 0x38, 0x39, 0xFB, 0xD3, 0xEE, - 0xAD, 0xFB, 0xB6, 0x2B, 0x60, 0x61, 0x85, 0xF1, 0x2A, 0x59, - 0x00, 0xA5, 0xCA, 0xC8, 0xE3, 0x3F, 0x96, 0xE9, 0xB1, 0xCC, - 0xBD, 0xB1, 0x20, 0xAC, 0xF1, 0xBD, 0xF5, 0x60, 0x2F, 0x07, - 0x98, 0x57, 0x4E, 0x31, 0x6F, 0x42, 0x84, 0xCE, 0x71, 0x72, - 0x74, 0x20, 0xDF, 0x38, 0x39, 0xFB, 0xD3, 0xEE, 0xAD, 0xFB, - 0xB6, 0x2B, 0x60, 0x61, 0x85, 0xF1, 0x2A, 0x59, 0x00, 0xA5, - 0xCA, 0xC8, 0xE3, 0x3F, 0x96, 0xE9 + 0x2B, 0xCE, 0x0F, 0x06, 0x08, 0x0C, 0x04, 0x81, 0x93, 0x04, + 0x81, 0x90, 0x59, 0xC1, 0x44, 0x8A, 0x5F, 0xF3, 0xF1, 0xB3, + 0xB8, 0xFF, 0x98, 0x7F, 0x86, 0x4A, 0x4C, 0x19, 0xFC, 0x51, + 0xB8, 0x12, 0x87, 0x9C, 0x52, 0xD6, 0x7F, 0xD6, 0xB0, 0xA9, + 0xF7, 0xED, 0x44, 0x26, 0xAF, 0xC2, 0xCE, 0x47, 0xD9, 0xE3, + 0x95, 0x1A, 0xE6, 0x11, 0xC1, 0x37, 0x67, 0xA5, 0x89, 0xDD, + 0x37, 0x6A, 0xE9, 0xC3, 0x8C, 0x9B, 0x3E, 0xBA, 0xB1, 0x76, + 0x4A, 0x5A, 0xEE, 0xCD, 0x96, 0x66, 0xF2, 0x53, 0xDA, 0x8C, + 0x89, 0x69, 0xBF, 0xBF, 0xF9, 0xA5, 0xBC, 0x7D, 0x80, 0xA8, + 0x97, 0x63, 0x90, 0x55, 0x58, 0x6C, 0x0A, 0x52, 0x61, 0x0B, + 0xF3, 0xBC, 0xE1, 0x1F, 0xB4, 0xA6, 0x5F, 0x9F, 0x37, 0x6A, + 0xE9, 0xC3, 0x8C, 0x9B, 0x3E, 0xBA, 0xB1, 0x76, 0x4A, 0x5A, + 0xEE, 0xCD, 0x96, 0x66, 0xF2, 0x53, 0xDA, 0x8C, 0x89, 0x69, + 0xBF, 0xBF, 0xF9, 0xA5, 0xBC, 0x7D, 0x80, 0xA8, 0x97, 0x63, + 0x90, 0x55, 0x58, 0x6C, 0x0A, 0x52, 0x61, 0x0B, 0xF3, 0xBC, + 0xE1, 0x1F, 0xB4, 0xA6, 0x5F, 0x9F }; static const int sizeof_bench_sphincs_small_level3_key = sizeof(bench_sphincs_small_level3_key); @@ -5874,31 +6010,31 @@ static const unsigned char bench_sphincs_small_level5_key[] = { 0x30, 0x81, 0xD3, 0x02, 0x01, 0x00, 0x30, 0x08, 0x06, 0x06, - 0x2B, 0xCE, 0x0F, 0x06, 0x09, 0x07, 0x04, 0x81, 0xC3, 0x04, - 0x81, 0xC0, 0x5E, 0xEA, 0x46, 0x6D, 0xE5, 0xA1, 0x70, 0x07, - 0xF0, 0x5C, 0x59, 0xD5, 0xD7, 0x37, 0x06, 0xC7, 0xD6, 0x1C, - 0xEA, 0x06, 0x15, 0x6E, 0xB3, 0x07, 0x71, 0x34, 0xE8, 0xD4, - 0x13, 0x65, 0x58, 0xAE, 0xAC, 0xE9, 0x32, 0x26, 0x76, 0xCD, - 0x2C, 0x3D, 0x11, 0xF7, 0xAB, 0x8A, 0x84, 0x4F, 0x56, 0x6F, - 0x2F, 0x63, 0x82, 0x1A, 0x37, 0xAA, 0xAA, 0x49, 0x50, 0xC8, - 0xA5, 0x92, 0x6E, 0x3F, 0xD6, 0x67, 0xEA, 0x5C, 0x18, 0x8A, - 0x99, 0xD2, 0xB6, 0xE3, 0xD7, 0x68, 0x9E, 0x65, 0x21, 0xDD, - 0xE3, 0x44, 0x8B, 0x32, 0x30, 0x31, 0xA8, 0xF2, 0xBB, 0xED, - 0xC0, 0x3E, 0x1A, 0x7B, 0x36, 0xD8, 0xAD, 0x2A, 0xA4, 0x81, - 0xAC, 0xD3, 0x08, 0xAC, 0x54, 0x2A, 0xAC, 0xAA, 0x1B, 0x64, - 0x58, 0x7B, 0x94, 0xE0, 0x16, 0x36, 0xC9, 0x92, 0x09, 0x6A, - 0x8C, 0x4D, 0xE3, 0xAB, 0x0F, 0x1C, 0xE8, 0x77, 0x1F, 0xE5, - 0xEA, 0x5C, 0x18, 0x8A, 0x99, 0xD2, 0xB6, 0xE3, 0xD7, 0x68, - 0x9E, 0x65, 0x21, 0xDD, 0xE3, 0x44, 0x8B, 0x32, 0x30, 0x31, - 0xA8, 0xF2, 0xBB, 0xED, 0xC0, 0x3E, 0x1A, 0x7B, 0x36, 0xD8, - 0xAD, 0x2A, 0xA4, 0x81, 0xAC, 0xD3, 0x08, 0xAC, 0x54, 0x2A, - 0xAC, 0xAA, 0x1B, 0x64, 0x58, 0x7B, 0x94, 0xE0, 0x16, 0x36, - 0xC9, 0x92, 0x09, 0x6A, 0x8C, 0x4D, 0xE3, 0xAB, 0x0F, 0x1C, - 0xE8, 0x77, 0x1F, 0xE5 + 0x2B, 0xCE, 0x0F, 0x06, 0x09, 0x0C, 0x04, 0x81, 0xC3, 0x04, + 0x81, 0xC0, 0x53, 0xE5, 0x25, 0x41, 0x1C, 0xCB, 0x8F, 0xAF, + 0x83, 0xBE, 0x64, 0x43, 0x70, 0x4E, 0x1D, 0x86, 0xF8, 0xFA, + 0xEA, 0x65, 0x9B, 0x45, 0xBC, 0xF1, 0x79, 0x57, 0x87, 0x51, + 0x2F, 0x6D, 0x50, 0xB8, 0x0D, 0x9A, 0x9F, 0x8C, 0xE8, 0x9B, + 0xE8, 0xFA, 0x1E, 0xF0, 0xA1, 0x98, 0xCA, 0x8B, 0x34, 0xD4, + 0x71, 0x53, 0xF0, 0xA7, 0x1D, 0xD6, 0x0D, 0xDF, 0x63, 0x61, + 0xA7, 0x12, 0x80, 0x64, 0xF7, 0x73, 0x14, 0x03, 0xD4, 0x54, + 0x01, 0x9D, 0x9D, 0x5D, 0x42, 0xC1, 0x2B, 0x91, 0xC3, 0xA2, + 0xD3, 0x12, 0x67, 0x35, 0x3B, 0xD7, 0x67, 0x31, 0xD5, 0xDC, + 0xDF, 0x4C, 0x4C, 0xAA, 0x45, 0xA8, 0x5D, 0x1E, 0xFB, 0x9E, + 0x34, 0x5D, 0x4B, 0x83, 0x77, 0xBF, 0x52, 0x8A, 0xDB, 0x67, + 0x7A, 0x52, 0xA4, 0x02, 0x29, 0xEB, 0x34, 0x9A, 0x4E, 0x86, + 0x25, 0x66, 0xFF, 0xA0, 0x79, 0x47, 0xBE, 0x94, 0xC2, 0x69, + 0x14, 0x03, 0xD4, 0x54, 0x01, 0x9D, 0x9D, 0x5D, 0x42, 0xC1, + 0x2B, 0x91, 0xC3, 0xA2, 0xD3, 0x12, 0x67, 0x35, 0x3B, 0xD7, + 0x67, 0x31, 0xD5, 0xDC, 0xDF, 0x4C, 0x4C, 0xAA, 0x45, 0xA8, + 0x5D, 0x1E, 0xFB, 0x9E, 0x34, 0x5D, 0x4B, 0x83, 0x77, 0xBF, + 0x52, 0x8A, 0xDB, 0x67, 0x7A, 0x52, 0xA4, 0x02, 0x29, 0xEB, + 0x34, 0x9A, 0x4E, 0x86, 0x25, 0x66, 0xFF, 0xA0, 0x79, 0x47, + 0xBE, 0x94, 0xC2, 0x69 }; static const int sizeof_bench_sphincs_small_level5_key = sizeof(bench_sphincs_small_level5_key); -#endif /* HAVE_PQC && HAVE_SPHINCS */ +#endif /* HAVE_SPHINCS */ #if defined(HAVE_ECC) && defined(USE_CERT_BUFFERS_256) @@ -5940,10 +6076,10 @@ /* ./certs/client-ecc-cert.der, ECC */ static const unsigned char cliecc_cert_der_256[] = { - 0x30, 0x82, 0x03, 0x5E, 0x30, 0x82, 0x03, 0x04, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x59, 0xE6, 0x5A, 0x21, 0xE0, - 0xC4, 0x3F, 0x67, 0x06, 0x9B, 0x21, 0x43, 0x3E, 0x76, 0xCA, - 0xF0, 0x3F, 0x68, 0x5B, 0x53, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x30, 0x82, 0x03, 0x5D, 0x30, 0x82, 0x03, 0x04, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x37, 0x67, 0x2A, 0x05, 0x24, + 0xB5, 0x2B, 0xB6, 0xAE, 0x40, 0x6B, 0xE1, 0x75, 0xE0, 0x97, + 0xCC, 0x1D, 0x12, 0x8B, 0x2A, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0x8D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, @@ -5959,10 +6095,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x8D, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x8D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x0F, 0x30, 0x0D, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x06, 0x4F, 0x72, 0x65, 0x67, 0x6F, 0x6E, 0x31, 0x0E, 0x30, 0x0C, @@ -6008,9 +6144,9 @@ 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x59, 0xE6, 0x5A, 0x21, 0xE0, - 0xC4, 0x3F, 0x67, 0x06, 0x9B, 0x21, 0x43, 0x3E, 0x76, 0xCA, - 0xF0, 0x3F, 0x68, 0x5B, 0x53, 0x30, 0x0C, 0x06, 0x03, 0x55, + 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x37, 0x67, 0x2A, 0x05, 0x24, + 0xB5, 0x2B, 0xB6, 0xAE, 0x40, 0x6B, 0xE1, 0x75, 0xE0, 0x97, + 0xCC, 0x1D, 0x12, 0x8B, 0x2A, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, @@ -6019,14 +6155,14 @@ 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, - 0x03, 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, 0x20, 0x70, - 0xF8, 0x0E, 0x6E, 0x91, 0xC9, 0x09, 0x77, 0x25, 0x8C, 0xBA, - 0x99, 0x6D, 0x54, 0x2D, 0xA8, 0x52, 0x87, 0x17, 0x51, 0x24, - 0x8B, 0x13, 0x92, 0x89, 0x7D, 0xC9, 0xBA, 0xB4, 0x43, 0x2E, - 0x48, 0x02, 0x21, 0x00, 0xAB, 0x41, 0x13, 0x3A, 0xD5, 0xEB, - 0x68, 0x66, 0x36, 0x56, 0x7C, 0x75, 0x5D, 0x37, 0xE3, 0xF6, - 0x27, 0x7F, 0x54, 0xD5, 0x42, 0x80, 0x29, 0xDB, 0xE5, 0x9B, - 0x16, 0x8A, 0xD3, 0xC2, 0xAD, 0xD6 + 0x03, 0x02, 0x03, 0x47, 0x00, 0x30, 0x44, 0x02, 0x20, 0x7A, + 0x6D, 0xC5, 0xBD, 0x6F, 0x9D, 0x54, 0x4F, 0xC5, 0x4C, 0xD0, + 0x12, 0x8C, 0x31, 0x3B, 0xB6, 0x17, 0x80, 0x9E, 0xC7, 0x34, + 0xF8, 0xC5, 0xDA, 0xFB, 0x61, 0x23, 0x35, 0xE6, 0x93, 0x35, + 0xB4, 0x02, 0x20, 0x1B, 0x6A, 0x86, 0xC4, 0x11, 0xBE, 0x7C, + 0x15, 0xA7, 0x5E, 0xAB, 0x85, 0xEE, 0xB7, 0x8C, 0x20, 0xDC, + 0xEB, 0x17, 0xA3, 0xF2, 0x66, 0x63, 0xAA, 0x6B, 0x67, 0xE0, + 0x62, 0x1F, 0x17, 0x3E, 0xAC }; static const int sizeof_cliecc_cert_der_256 = sizeof(cliecc_cert_der_256); @@ -6065,13 +6201,32 @@ }; static const int sizeof_ecc_key_pub_der_256 = sizeof(ecc_key_pub_der_256); +/* ./certs/statickeys/ecc-secp256r1.der, ECC */ +static const unsigned char ecc_secp_r1_statickey_der_256[] = +{ + 0x30, 0x77, 0x02, 0x01, 0x01, 0x04, 0x20, 0xD3, 0x6B, 0xC6, + 0x68, 0x76, 0xDE, 0xD8, 0x97, 0x95, 0xF6, 0xD9, 0x8E, 0x2F, + 0x41, 0x73, 0x53, 0xF8, 0x03, 0x57, 0xED, 0x90, 0x80, 0x19, + 0xEB, 0xAA, 0x4A, 0x91, 0x8A, 0x8F, 0x31, 0x63, 0x45, 0xA0, + 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, + 0x07, 0xA1, 0x44, 0x03, 0x42, 0x00, 0x04, 0x58, 0xA0, 0x80, + 0x7C, 0x51, 0xEC, 0xDD, 0x41, 0x5F, 0x93, 0xA8, 0x7A, 0x60, + 0x47, 0x47, 0xE9, 0xCF, 0x5A, 0x40, 0xE4, 0xDD, 0x37, 0xEC, + 0xCA, 0xA7, 0x10, 0x1C, 0x43, 0xDA, 0xE8, 0x73, 0x8C, 0x28, + 0xF5, 0xC9, 0xEC, 0x1A, 0x33, 0x0B, 0x26, 0x2E, 0x97, 0x80, + 0x2E, 0xE0, 0xB8, 0x01, 0x91, 0x16, 0xB4, 0xCC, 0x02, 0x18, + 0xB5, 0x1D, 0xCC, 0xBA, 0x3C, 0xED, 0x04, 0xC9, 0xA8, 0x92, + 0x37 +}; +static const int sizeof_ecc_secp_r1_statickey_der_256 = sizeof(ecc_secp_r1_statickey_der_256); + /* ./certs/server-ecc-comp.der, ECC */ static const unsigned char serv_ecc_comp_der_256[] = { 0x30, 0x82, 0x03, 0x77, 0x30, 0x82, 0x03, 0x1D, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x04, 0xD0, 0xEE, 0xF8, 0x6F, - 0x67, 0x42, 0xA9, 0x6F, 0x3F, 0xD2, 0x7D, 0x6E, 0x7B, 0xCE, - 0x29, 0xCE, 0x14, 0xD2, 0x1B, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x21, 0xD7, 0x53, 0x80, 0x24, + 0x5C, 0xEB, 0xBF, 0xC0, 0xA4, 0x40, 0xF4, 0x42, 0x19, 0x3B, + 0x83, 0xFD, 0x58, 0xC5, 0xA6, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0xA0, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, @@ -6089,10 +6244,10 @@ 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, 0x36, - 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, 0x32, - 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, 0x34, - 0x39, 0x5A, 0x30, 0x81, 0xA0, 0x31, 0x0B, 0x30, 0x09, 0x06, + 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, 0x33, + 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, 0x32, + 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, 0x32, + 0x38, 0x5A, 0x30, 0x81, 0xA0, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, 0x30, 0x0E, @@ -6139,8 +6294,8 @@ 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, - 0x04, 0xD0, 0xEE, 0xF8, 0x6F, 0x67, 0x42, 0xA9, 0x6F, 0x3F, - 0xD2, 0x7D, 0x6E, 0x7B, 0xCE, 0x29, 0xCE, 0x14, 0xD2, 0x1B, + 0x21, 0xD7, 0x53, 0x80, 0x24, 0x5C, 0xEB, 0xBF, 0xC0, 0xA4, + 0x40, 0xF4, 0x42, 0x19, 0x3B, 0x83, 0xFD, 0x58, 0xC5, 0xA6, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, @@ -6150,14 +6305,14 @@ 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x03, 0x48, 0x00, - 0x30, 0x45, 0x02, 0x21, 0x00, 0x8D, 0x97, 0x8F, 0xD4, 0x70, - 0xBF, 0x10, 0x7A, 0x3F, 0xF4, 0x35, 0xBB, 0x8E, 0x6D, 0x39, - 0x5B, 0xA1, 0x02, 0xEE, 0x32, 0xDA, 0x02, 0x91, 0x57, 0x02, - 0x0B, 0x43, 0x08, 0x3E, 0x61, 0xDA, 0xF1, 0x02, 0x20, 0x73, - 0x55, 0x17, 0x84, 0x06, 0x34, 0x0E, 0x9B, 0xCD, 0x55, 0xC4, - 0x6D, 0x3B, 0x26, 0xA3, 0xED, 0x3A, 0x8B, 0xBA, 0x22, 0xE3, - 0xDC, 0x35, 0xFB, 0x8C, 0x0F, 0xB7, 0xBA, 0x6C, 0x63, 0x9D, - 0xE1 + 0x30, 0x45, 0x02, 0x20, 0x57, 0x1A, 0x59, 0xBC, 0xC9, 0x45, + 0x0A, 0x46, 0xE6, 0x16, 0xDA, 0x17, 0xCE, 0xC3, 0x0A, 0x57, + 0x57, 0xF2, 0x3D, 0x15, 0xCD, 0xCA, 0x1B, 0xA7, 0xA8, 0x39, + 0x2E, 0x9D, 0x09, 0xF3, 0x3E, 0xA0, 0x02, 0x21, 0x00, 0xDE, + 0xA3, 0x3A, 0x4D, 0x88, 0x38, 0x2B, 0x3A, 0x84, 0xDE, 0x2F, + 0x0A, 0x81, 0x14, 0x57, 0x7F, 0x7F, 0x2E, 0xD6, 0xA5, 0x4D, + 0x61, 0x10, 0x69, 0xB9, 0xA2, 0xC6, 0x51, 0xCD, 0x80, 0x4A, + 0x63 }; static const int sizeof_serv_ecc_comp_der_256 = sizeof(serv_ecc_comp_der_256); @@ -6182,10 +6337,10 @@ 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, - 0x31, 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, - 0x0D, 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, - 0x37, 0x34, 0x39, 0x5A, 0x30, 0x81, 0x9D, 0x31, 0x0B, 0x30, + 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, + 0x31, 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, + 0x0D, 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, + 0x39, 0x32, 0x38, 0x5A, 0x30, 0x81, 0x9D, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, 0x10, @@ -6233,9 +6388,9 @@ 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x2C, - 0x80, 0xCE, 0xDB, 0x47, 0x9D, 0x07, 0x66, 0x92, 0x3D, 0x68, - 0xD7, 0xCA, 0xAC, 0x90, 0x4F, 0xCA, 0x69, 0x41, 0x4B, 0x30, + 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x82, 0x14, 0x33, + 0x44, 0x1A, 0xA8, 0x6C, 0x01, 0xEC, 0xF6, 0x60, 0xF2, 0x70, + 0x51, 0x0A, 0x4C, 0xD1, 0x14, 0xFA, 0xBC, 0xE9, 0x44, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, @@ -6245,32 +6400,32 @@ 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0B, 0x05, 0x00, 0x03, - 0x82, 0x01, 0x01, 0x00, 0x44, 0xDA, 0x4D, 0xA2, 0xD3, 0x96, - 0x51, 0x31, 0x35, 0x74, 0x21, 0xD5, 0x27, 0x0D, 0xAB, 0x72, - 0xEB, 0xD8, 0x24, 0x11, 0x3C, 0x52, 0x07, 0x01, 0x51, 0xE8, - 0x26, 0x11, 0x39, 0xDA, 0xAC, 0x57, 0xCA, 0xE3, 0x8D, 0x8C, - 0x91, 0x16, 0x28, 0xE3, 0x7B, 0xFE, 0x58, 0x76, 0x0A, 0x3E, - 0x9D, 0xAC, 0xF3, 0xCE, 0x9F, 0x5A, 0xFF, 0x07, 0xC9, 0xA1, - 0x27, 0x9A, 0x9A, 0x5C, 0xDB, 0x82, 0xBA, 0x0E, 0xD0, 0x80, - 0xBC, 0xCF, 0xB1, 0x34, 0x6A, 0x26, 0xAF, 0x15, 0x7A, 0x21, - 0xF6, 0xA9, 0x48, 0x3C, 0xC6, 0x02, 0xD0, 0x4E, 0x32, 0xAC, - 0x75, 0x17, 0x60, 0x19, 0x45, 0x12, 0x37, 0x5D, 0x75, 0x65, - 0x84, 0xCA, 0xE8, 0x40, 0x73, 0xF5, 0x1C, 0x71, 0x82, 0xAE, - 0xE2, 0x3A, 0x1C, 0xD7, 0x4C, 0x59, 0xF2, 0x83, 0x16, 0x1F, - 0x77, 0x02, 0x91, 0xCC, 0x9C, 0xAA, 0xC9, 0xE7, 0x72, 0x6B, - 0xFF, 0x40, 0x7E, 0xDA, 0x35, 0x65, 0x47, 0xBD, 0x55, 0x90, - 0xC8, 0xC8, 0x21, 0xB2, 0xFB, 0x89, 0xD4, 0xD4, 0xCC, 0x39, - 0x02, 0x54, 0x20, 0x83, 0x17, 0x46, 0xEB, 0x5F, 0x60, 0x58, - 0x35, 0x4E, 0xCA, 0x24, 0x8D, 0x0B, 0x77, 0x10, 0xB0, 0x4A, - 0x2A, 0x51, 0xA9, 0xD0, 0x74, 0x27, 0x35, 0x61, 0x76, 0x0F, - 0x94, 0x2C, 0x0B, 0x10, 0x1D, 0xB8, 0x4A, 0x3E, 0x38, 0x95, - 0x17, 0x0A, 0x0A, 0x7E, 0xC6, 0x35, 0xC3, 0x68, 0x89, 0xC0, - 0x82, 0x8B, 0x61, 0xB8, 0xE6, 0x2F, 0xF9, 0xC8, 0x58, 0x96, - 0xC7, 0x1F, 0xEB, 0x1D, 0x2F, 0x09, 0x34, 0x5F, 0xBF, 0x76, - 0xAF, 0x00, 0x6C, 0x33, 0x80, 0x10, 0x5B, 0xA0, 0xD2, 0x76, - 0x6F, 0xE2, 0x4C, 0x96, 0xB6, 0x2D, 0xDC, 0xC0, 0x21, 0x43, - 0x6E, 0xF3, 0x58, 0x2A, 0x4B, 0xA6, 0xEF, 0x15, 0xB5, 0xCA, - 0x00, 0x28, 0x1A, 0xC6, 0xE0, 0x31, 0xF0, 0x5D, 0x99, 0x70 + 0x82, 0x01, 0x01, 0x00, 0x16, 0xB7, 0xD3, 0x9C, 0x7C, 0x6E, + 0xD2, 0xB7, 0x79, 0xAA, 0x5A, 0x16, 0x0B, 0x1E, 0xDA, 0xD0, + 0xF7, 0xDF, 0x64, 0xC9, 0x3C, 0xB8, 0x41, 0x24, 0x4B, 0x1B, + 0xC2, 0x83, 0x5E, 0xDF, 0xDE, 0xA8, 0x8A, 0x7C, 0xEB, 0x07, + 0x75, 0x20, 0xF6, 0xF3, 0x4C, 0xBD, 0x3F, 0x2E, 0xF0, 0xF0, + 0xDA, 0x4B, 0xC5, 0xD2, 0xC4, 0xF8, 0xDB, 0x34, 0x75, 0xE2, + 0x32, 0xB4, 0x34, 0x92, 0x8A, 0x7F, 0xD7, 0x84, 0xEA, 0xDF, + 0x99, 0xCA, 0x64, 0xE6, 0x7C, 0x68, 0x05, 0x1C, 0x75, 0xDE, + 0x3F, 0x06, 0x65, 0x5D, 0xFC, 0x29, 0xC9, 0x73, 0x0F, 0x4A, + 0xAD, 0xFD, 0xBC, 0x0D, 0x91, 0x37, 0x67, 0x63, 0x55, 0x65, + 0x93, 0x99, 0x56, 0x84, 0x25, 0x1B, 0xF1, 0x50, 0x03, 0x31, + 0x2D, 0x48, 0xAD, 0xA3, 0x38, 0x91, 0x29, 0x88, 0xB8, 0x72, + 0x08, 0x4C, 0x11, 0x36, 0x35, 0x20, 0x13, 0x78, 0x98, 0xD8, + 0x84, 0x30, 0xC5, 0x7B, 0x70, 0x24, 0x45, 0x8C, 0xE1, 0x55, + 0x80, 0x06, 0x5F, 0x19, 0x57, 0x89, 0x58, 0x1C, 0x2A, 0x40, + 0xFB, 0xF3, 0xA6, 0xBF, 0xEA, 0x41, 0x7A, 0x79, 0x2C, 0xAB, + 0xFE, 0xB6, 0x16, 0x5D, 0xD5, 0xFA, 0x32, 0x50, 0x9D, 0x89, + 0xF2, 0xCC, 0x87, 0x7A, 0x57, 0xCF, 0x4D, 0x38, 0xC4, 0xD5, + 0x33, 0x9A, 0x4D, 0x83, 0xC9, 0x00, 0xB8, 0x36, 0x66, 0x14, + 0x76, 0x20, 0xC1, 0x7A, 0xC7, 0xF7, 0x0A, 0x94, 0x69, 0xCE, + 0x0A, 0x0F, 0x81, 0x04, 0x12, 0x5F, 0x71, 0xD0, 0xD1, 0xFF, + 0x08, 0xD0, 0x89, 0x6F, 0xAC, 0x45, 0xD3, 0x06, 0x23, 0xA0, + 0x76, 0x88, 0xAD, 0x5D, 0x9A, 0x7A, 0x8C, 0x1F, 0x61, 0xD4, + 0xD8, 0x21, 0x1D, 0x8E, 0x05, 0x89, 0xD1, 0xD4, 0xD6, 0x86, + 0x5B, 0x4B, 0x43, 0xE6, 0x03, 0x4A, 0x10, 0x48, 0xF4, 0x1B, + 0x9D, 0x3B, 0x76, 0xD8, 0x2C, 0xAD, 0xFA, 0x33, 0xA5, 0x70 }; static const int sizeof_serv_ecc_rsa_der_256 = sizeof(serv_ecc_rsa_der_256); @@ -6278,7 +6433,7 @@ /* ./certs/server-ecc.der, ECC */ static const unsigned char serv_ecc_der_256[] = { - 0x30, 0x82, 0x02, 0xA1, 0x30, 0x82, 0x02, 0x47, 0xA0, 0x03, + 0x30, 0x82, 0x02, 0xA2, 0x30, 0x82, 0x02, 0x48, 0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x03, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, @@ -6296,56 +6451,56 @@ 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, - 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, - 0x31, 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, - 0x0D, 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, - 0x37, 0x34, 0x39, 0x5A, 0x30, 0x81, 0x8F, 0x31, 0x0B, 0x30, + 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, + 0x31, 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, + 0x0D, 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, + 0x39, 0x32, 0x38, 0x5A, 0x30, 0x81, 0x90, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0C, 0x07, 0x53, 0x65, 0x61, 0x74, 0x74, 0x6C, 0x65, 0x31, - 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x07, - 0x45, 0x6C, 0x69, 0x70, 0x74, 0x69, 0x63, 0x31, 0x0C, 0x30, - 0x0A, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x03, 0x45, 0x43, - 0x43, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, 0x66, - 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, 0x30, - 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, - 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, - 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, - 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, 0xCE, - 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, - 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xBB, 0x33, 0xAC, - 0x4C, 0x27, 0x50, 0x4A, 0xC6, 0x4A, 0xA5, 0x04, 0xC3, 0x3C, - 0xDE, 0x9F, 0x36, 0xDB, 0x72, 0x2D, 0xCE, 0x94, 0xEA, 0x2B, - 0xFA, 0xCB, 0x20, 0x09, 0x39, 0x2C, 0x16, 0xE8, 0x61, 0x02, - 0xE9, 0xAF, 0x4D, 0xD3, 0x02, 0x93, 0x9A, 0x31, 0x5B, 0x97, - 0x92, 0x21, 0x7F, 0xF0, 0xCF, 0x18, 0xDA, 0x91, 0x11, 0x02, - 0x34, 0x86, 0xE8, 0x20, 0x58, 0x33, 0x0B, 0x80, 0x34, 0x89, - 0xD8, 0xA3, 0x81, 0x89, 0x30, 0x81, 0x86, 0x30, 0x1D, 0x06, - 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x5D, 0x5D, - 0x26, 0xEF, 0xAC, 0x7E, 0x36, 0xF9, 0x9B, 0x76, 0x15, 0x2B, - 0x4A, 0x25, 0x02, 0x23, 0xEF, 0xB2, 0x89, 0x30, 0x30, 0x1F, - 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, - 0x14, 0x56, 0x8E, 0x9A, 0xC3, 0xF0, 0x42, 0xDE, 0x18, 0xB9, - 0x45, 0x55, 0x6E, 0xF9, 0x93, 0xCF, 0xEA, 0xC3, 0xF3, 0xA5, - 0x21, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, 0x01, - 0xFF, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0E, 0x06, 0x03, 0x55, - 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x03, - 0xA8, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, 0x0C, - 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, - 0x03, 0x01, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, - 0x86, 0xF8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, - 0x40, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, - 0x04, 0x03, 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, 0x21, - 0x00, 0xCF, 0x3A, 0x17, 0x97, 0xD4, 0xBE, 0x7C, 0x50, 0xE1, - 0xBE, 0x1B, 0x53, 0x95, 0x7B, 0xA3, 0xB8, 0xC6, 0x73, 0xC4, - 0x34, 0xE0, 0x73, 0x5A, 0xDB, 0x3E, 0xCB, 0x3A, 0xB6, 0xA8, - 0xF1, 0xCD, 0xBF, 0x02, 0x20, 0x2B, 0xE6, 0xF9, 0x65, 0xB2, - 0xAB, 0x0F, 0xBB, 0x2B, 0x36, 0x5C, 0xCC, 0x2E, 0x19, 0xA9, - 0x59, 0x1C, 0x6F, 0x6F, 0xCE, 0x9B, 0x7A, 0xE6, 0x5B, 0x65, - 0x31, 0x33, 0x80, 0x05, 0xCB, 0x7C, 0x96 + 0x11, 0x30, 0x0F, 0x06, 0x03, 0x55, 0x04, 0x0A, 0x0C, 0x08, + 0x45, 0x6C, 0x6C, 0x69, 0x70, 0x74, 0x69, 0x63, 0x31, 0x0C, + 0x30, 0x0A, 0x06, 0x03, 0x55, 0x04, 0x0B, 0x0C, 0x03, 0x45, + 0x43, 0x43, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0C, 0x0F, 0x77, 0x77, 0x77, 0x2E, 0x77, 0x6F, 0x6C, + 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x1F, + 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, + 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, + 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, + 0x6D, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86, 0x48, + 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, + 0x3D, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, 0xBB, 0x33, + 0xAC, 0x4C, 0x27, 0x50, 0x4A, 0xC6, 0x4A, 0xA5, 0x04, 0xC3, + 0x3C, 0xDE, 0x9F, 0x36, 0xDB, 0x72, 0x2D, 0xCE, 0x94, 0xEA, + 0x2B, 0xFA, 0xCB, 0x20, 0x09, 0x39, 0x2C, 0x16, 0xE8, 0x61, + 0x02, 0xE9, 0xAF, 0x4D, 0xD3, 0x02, 0x93, 0x9A, 0x31, 0x5B, + 0x97, 0x92, 0x21, 0x7F, 0xF0, 0xCF, 0x18, 0xDA, 0x91, 0x11, + 0x02, 0x34, 0x86, 0xE8, 0x20, 0x58, 0x33, 0x0B, 0x80, 0x34, + 0x89, 0xD8, 0xA3, 0x81, 0x89, 0x30, 0x81, 0x86, 0x30, 0x1D, + 0x06, 0x03, 0x55, 0x1D, 0x0E, 0x04, 0x16, 0x04, 0x14, 0x5D, + 0x5D, 0x26, 0xEF, 0xAC, 0x7E, 0x36, 0xF9, 0x9B, 0x76, 0x15, + 0x2B, 0x4A, 0x25, 0x02, 0x23, 0xEF, 0xB2, 0x89, 0x30, 0x30, + 0x1F, 0x06, 0x03, 0x55, 0x1D, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0x56, 0x8E, 0x9A, 0xC3, 0xF0, 0x42, 0xDE, 0x18, + 0xB9, 0x45, 0x55, 0x6E, 0xF9, 0x93, 0xCF, 0xEA, 0xC3, 0xF3, + 0xA5, 0x21, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x01, + 0x01, 0xFF, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0E, 0x06, 0x03, + 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, + 0x03, 0xA8, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1D, 0x25, 0x04, + 0x0C, 0x30, 0x0A, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, + 0x07, 0x03, 0x01, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x86, 0xF8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, + 0x06, 0x40, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, + 0x3D, 0x04, 0x03, 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, + 0x21, 0x00, 0x86, 0xBD, 0x87, 0x16, 0xD2, 0x9C, 0x66, 0xE7, + 0x5E, 0x5C, 0x28, 0x0E, 0x5F, 0xEF, 0x94, 0x61, 0x2F, 0xD4, + 0x21, 0x6D, 0x8E, 0xC3, 0x94, 0x0A, 0x1E, 0xB5, 0x6A, 0x1D, + 0xC6, 0x04, 0x87, 0xC6, 0x02, 0x20, 0x66, 0x46, 0xC4, 0x29, + 0xD9, 0x8E, 0xEB, 0x0B, 0xF7, 0x5B, 0x32, 0x13, 0xEB, 0x0A, + 0xEA, 0x47, 0x99, 0x4B, 0x74, 0x56, 0xBA, 0x21, 0x97, 0xB1, + 0x67, 0x75, 0x5C, 0xF3, 0xF3, 0xC0, 0x88, 0xAA }; static const int sizeof_serv_ecc_der_256 = sizeof(serv_ecc_der_256); @@ -6371,10 +6526,10 @@ /* ./certs/ca-ecc-cert.der, ECC */ static const unsigned char ca_ecc_cert_der_256[] = { - 0x30, 0x82, 0x02, 0x96, 0x30, 0x82, 0x02, 0x3B, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x65, 0x67, 0x42, 0x4C, 0x06, - 0xE7, 0xE4, 0xC3, 0x68, 0x01, 0xA9, 0x94, 0xA9, 0x07, 0xE6, - 0xFE, 0xBD, 0x2C, 0xD6, 0x3D, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x30, 0x82, 0x02, 0x95, 0x30, 0x82, 0x02, 0x3B, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x0F, 0x17, 0x46, 0x70, 0xFD, + 0xC2, 0x70, 0xD1, 0xF9, 0x42, 0x49, 0x9C, 0x1A, 0xC3, 0x5D, + 0xDD, 0x30, 0xC8, 0x5F, 0x85, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, @@ -6391,10 +6546,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, @@ -6430,14 +6585,14 @@ 0x01, 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, - 0x02, 0x03, 0x49, 0x00, 0x30, 0x46, 0x02, 0x21, 0x00, 0xB0, - 0x12, 0x16, 0x03, 0x26, 0x79, 0xD4, 0x6B, 0x94, 0xD9, 0x7E, - 0xCA, 0xE1, 0x2D, 0x24, 0x64, 0xEF, 0x11, 0x6E, 0xF2, 0x12, - 0x81, 0xE4, 0xCE, 0x1D, 0x77, 0x7D, 0xCA, 0x5C, 0x47, 0x50, - 0x62, 0x02, 0x21, 0x00, 0x80, 0xBF, 0x46, 0x3C, 0x5D, 0xD8, - 0xE5, 0xAB, 0x47, 0xCE, 0xA2, 0x19, 0xBD, 0x21, 0xDE, 0x85, - 0x6F, 0xAB, 0xC9, 0x8F, 0x01, 0xF3, 0xAB, 0x1B, 0xB9, 0xE1, - 0x53, 0xD6, 0x24, 0x77, 0xA6, 0x4D + 0x02, 0x03, 0x48, 0x00, 0x30, 0x45, 0x02, 0x21, 0x00, 0xC8, + 0x64, 0x7F, 0xEE, 0x4B, 0xBE, 0x83, 0x48, 0x13, 0xEA, 0x92, + 0xF8, 0x1A, 0x82, 0x1E, 0x85, 0xB1, 0x5A, 0xA4, 0x1C, 0xE3, + 0xE8, 0xEA, 0x25, 0x44, 0x6F, 0xE7, 0x70, 0xFD, 0xEB, 0xF3, + 0x76, 0x02, 0x20, 0x44, 0x02, 0xA2, 0xEC, 0xC5, 0xA1, 0xAE, + 0xE2, 0xA4, 0x8A, 0xD9, 0x13, 0x95, 0x2B, 0xA6, 0x5B, 0x09, + 0x57, 0x86, 0x61, 0x42, 0x96, 0x97, 0xF0, 0x95, 0x62, 0x0C, + 0x03, 0xE6, 0x53, 0x04, 0x25 }; static const int sizeof_ca_ecc_cert_der_256 = sizeof(ca_ecc_cert_der_256); @@ -6467,10 +6622,10 @@ /* ./certs/ca-ecc384-cert.der, ECC */ static const unsigned char ca_ecc_cert_der_384[] = { - 0x30, 0x82, 0x02, 0xD1, 0x30, 0x82, 0x02, 0x58, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x0A, 0xF8, 0xC7, 0xEE, 0x86, - 0x55, 0x2F, 0x18, 0x21, 0xBF, 0x88, 0x49, 0x50, 0x03, 0x5A, - 0xFC, 0x2D, 0x93, 0x31, 0x0A, 0x30, 0x0A, 0x06, 0x08, 0x2A, + 0x30, 0x82, 0x02, 0xD2, 0x30, 0x82, 0x02, 0x58, 0xA0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x2E, 0xEA, 0xF0, 0x11, 0x40, + 0x1E, 0xAD, 0xFA, 0xA7, 0x85, 0x68, 0x65, 0x7A, 0x25, 0x2B, + 0x13, 0xB7, 0x61, 0xD7, 0x80, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, @@ -6487,10 +6642,10 @@ 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, 0x63, 0x6F, - 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, - 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x17, 0x0D, - 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, + 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, + 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x38, 0x5A, 0x17, 0x0D, + 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x38, 0x5A, 0x30, 0x81, 0x97, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x0A, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6E, 0x67, 0x74, 0x6F, 0x6E, @@ -6529,17 +6684,17 @@ 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x0A, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x03, - 0x03, 0x67, 0x00, 0x30, 0x64, 0x02, 0x30, 0x03, 0x31, 0x8C, - 0xD3, 0x04, 0xF5, 0xB2, 0xBF, 0xBD, 0xA2, 0x27, 0x6A, 0xFF, - 0xDD, 0x7F, 0xBD, 0x88, 0xD5, 0x3E, 0x09, 0x9A, 0xCF, 0xDA, - 0x79, 0x95, 0x6B, 0x32, 0x6F, 0xFA, 0x98, 0xD8, 0x48, 0x8B, - 0x99, 0x91, 0xFE, 0x39, 0x9E, 0x7B, 0x35, 0x2C, 0x78, 0x32, - 0xBA, 0xA3, 0x0B, 0x65, 0x1C, 0x02, 0x30, 0x3E, 0x6A, 0x10, - 0x8C, 0x57, 0x47, 0x85, 0x73, 0x3C, 0xEB, 0x2A, 0x02, 0xB2, - 0x27, 0x62, 0x1F, 0x44, 0x52, 0x2B, 0xB1, 0x34, 0x3F, 0x9C, - 0x78, 0x70, 0x0A, 0x59, 0x01, 0x3E, 0xAD, 0xC0, 0x08, 0xBC, - 0xD5, 0xD1, 0xA6, 0xC0, 0xDD, 0x2C, 0x8B, 0x2A, 0x8B, 0xF4, - 0x04, 0xAD, 0xD3, 0x01, 0xE6 + 0x03, 0x68, 0x00, 0x30, 0x65, 0x02, 0x31, 0x00, 0xBD, 0x2E, + 0x67, 0x71, 0x54, 0xBE, 0xB8, 0x5E, 0x29, 0x19, 0xD3, 0x18, + 0xF7, 0xE1, 0xAE, 0x79, 0xF0, 0xCC, 0x09, 0xC3, 0x91, 0xC0, + 0x81, 0xAB, 0xD7, 0xB7, 0x21, 0xF8, 0x4F, 0xDA, 0xBC, 0xAD, + 0x0E, 0xFC, 0x3D, 0x54, 0x32, 0x21, 0x3A, 0x67, 0xC5, 0x26, + 0x35, 0xE9, 0x33, 0xB2, 0x58, 0xD2, 0x02, 0x30, 0x64, 0x2F, + 0xFB, 0x10, 0xD0, 0x65, 0xB5, 0xAC, 0xBB, 0xB3, 0x41, 0x64, + 0x24, 0xEB, 0x0A, 0x6B, 0xAE, 0xA4, 0xED, 0x3E, 0xC8, 0x62, + 0x81, 0x45, 0x97, 0x92, 0xAD, 0x61, 0xEB, 0x69, 0x54, 0xCE, + 0x42, 0x83, 0xBB, 0x68, 0x23, 0x20, 0xF7, 0xB2, 0x5A, 0x55, + 0x0C, 0xD4, 0xE6, 0x13, 0x42, 0x61 }; static const int sizeof_ca_ecc_cert_der_384 = sizeof(ca_ecc_cert_der_384); @@ -6628,9 +6783,9 @@ 0x6D, 0x31, 0x17, 0x30, 0x15, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x01, 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x30, 0x1E, 0x17, 0x0D, - 0x32, 0x32, 0x31, 0x32, 0x31, 0x36, 0x32, 0x31, 0x31, 0x37, - 0x34, 0x39, 0x5A, 0x17, 0x0D, 0x32, 0x35, 0x30, 0x39, 0x31, - 0x31, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, 0x30, 0x81, + 0x32, 0x33, 0x31, 0x32, 0x31, 0x33, 0x32, 0x32, 0x31, 0x39, + 0x32, 0x39, 0x5A, 0x17, 0x0D, 0x32, 0x36, 0x30, 0x39, 0x30, + 0x38, 0x32, 0x32, 0x31, 0x39, 0x32, 0x39, 0x5A, 0x30, 0x81, 0xB8, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, @@ -6668,14 +6823,14 @@ 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xF8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x06, 0x40, 0x30, - 0x05, 0x06, 0x03, 0x2B, 0x65, 0x70, 0x03, 0x41, 0x00, 0x36, - 0x3F, 0x8D, 0x2F, 0x28, 0xBD, 0x51, 0x83, 0xB8, 0xD8, 0x9C, - 0x09, 0x64, 0xC4, 0x77, 0xFD, 0xCD, 0xC6, 0xC3, 0x86, 0xB0, - 0x8D, 0x81, 0xE3, 0xE9, 0xCE, 0x7A, 0x2A, 0x32, 0x15, 0xE9, - 0xF9, 0x6A, 0x75, 0x1A, 0xA0, 0x5E, 0x71, 0x62, 0x72, 0xDE, - 0x46, 0x11, 0xA8, 0x9D, 0xDB, 0x80, 0x6B, 0x73, 0x38, 0x61, - 0x0C, 0xF3, 0x24, 0x11, 0x45, 0xC9, 0xA1, 0xD3, 0xD2, 0x3B, - 0x05, 0xD5, 0x05 + 0x05, 0x06, 0x03, 0x2B, 0x65, 0x70, 0x03, 0x41, 0x00, 0x22, + 0xD7, 0x34, 0xAC, 0x33, 0x65, 0x8B, 0x18, 0xA4, 0x34, 0xF9, + 0x3A, 0xE6, 0xCE, 0xC1, 0x77, 0xA6, 0x3D, 0x2A, 0x2A, 0xEE, + 0x22, 0xAD, 0x6E, 0xFC, 0x36, 0xFC, 0x98, 0x8D, 0x8A, 0xFD, + 0x3F, 0xCB, 0xA9, 0x74, 0x01, 0x25, 0x96, 0x05, 0xE1, 0x39, + 0x13, 0x8B, 0xD9, 0x05, 0x6D, 0xC9, 0xBA, 0x0E, 0x5D, 0x36, + 0xBF, 0x39, 0x03, 0x57, 0x2A, 0x55, 0xFC, 0xE3, 0x53, 0xC3, + 0x1B, 0xE1, 0x0B }; static const int sizeof_server_ed25519_cert = sizeof(server_ed25519_cert); @@ -6711,10 +6866,10 @@ 0x31, 0x1F, 0x30, 0x1D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x09, 0x01, 0x16, 0x10, 0x69, 0x6E, 0x66, 0x6F, 0x40, 0x77, 0x6F, 0x6C, 0x66, 0x73, 0x73, 0x6C, 0x2E, - 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, - 0x32, 0x31, 0x36, 0x32, 0x31, 0x31, 0x37, 0x34, 0x39, 0x5A, - 0x17, 0x0D, 0x32, 0x35, 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, - 0x31, 0x37, 0x34, 0x39, 0x5A, 0x30, 0x81, 0xB4, 0x31, 0x0B, + 0x63, 0x6F, 0x6D, 0x30, 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, + 0x32, 0x31, 0x33, 0x32, 0x32, 0x31, 0x39, 0x32, 0x39, 0x5A, + 0x17, 0x0D, 0x32, 0x36, 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, + 0x31, 0x39, 0x32, 0x39, 0x5A, 0x30, 0x81, 0xB4, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, 0x6E, 0x74, 0x61, 0x6E, 0x61, 0x31, @@ -6748,13 +6903,13 @@ 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x1D, 0x0F, 0x01, 0x01, 0xFF, 0x04, 0x04, 0x03, 0x02, 0x01, 0x86, 0x30, 0x05, 0x06, 0x03, 0x2B, 0x65, 0x70, - 0x03, 0x41, 0x00, 0x40, 0x01, 0x0F, 0x0B, 0x8D, 0xD6, 0xAA, - 0xDC, 0x2C, 0xB3, 0x40, 0x22, 0xE7, 0x78, 0xEF, 0x1C, 0x8B, - 0x08, 0x27, 0xEE, 0xD9, 0xD7, 0xB6, 0x91, 0xB3, 0x2D, 0x3D, - 0xAC, 0xB9, 0x50, 0xFB, 0x2F, 0xB5, 0x25, 0x63, 0x5A, 0x1A, - 0x3D, 0x3E, 0xCD, 0x81, 0xA1, 0xA9, 0xE7, 0xD5, 0xA1, 0x4A, - 0x19, 0xB8, 0x4C, 0xB0, 0x1D, 0x3C, 0x8A, 0xE3, 0x47, 0xC0, - 0xF6, 0x41, 0x95, 0xE6, 0x59, 0x23, 0x08 + 0x03, 0x41, 0x00, 0xE6, 0x71, 0xA0, 0x59, 0x63, 0xB4, 0x31, + 0x31, 0x1F, 0x75, 0x06, 0xCE, 0xF1, 0x89, 0xF0, 0xE7, 0xA2, + 0xDB, 0xA8, 0xC1, 0xE4, 0xC8, 0x61, 0x38, 0x0C, 0xE6, 0xE9, + 0xE7, 0xB9, 0x9F, 0xCE, 0xE2, 0xF5, 0x49, 0xA3, 0xF5, 0x04, + 0x1E, 0x85, 0xF7, 0x7D, 0x10, 0xFB, 0x1D, 0xEE, 0xB6, 0xDC, + 0x5E, 0x51, 0xF1, 0x82, 0x33, 0xA4, 0xED, 0xE0, 0x0A, 0x65, + 0x09, 0x2B, 0x0E, 0x1E, 0xB2, 0xAF, 0x0B }; static const int sizeof_ca_ed25519_cert = sizeof(ca_ed25519_cert); @@ -6762,9 +6917,9 @@ static const unsigned char client_ed25519_cert[] = { 0x30, 0x82, 0x03, 0x9F, 0x30, 0x82, 0x03, 0x51, 0xA0, 0x03, - 0x02, 0x01, 0x02, 0x02, 0x14, 0x69, 0xAC, 0xB8, 0xB4, 0xF7, - 0xE4, 0x11, 0xCB, 0xC5, 0x63, 0xB2, 0xCC, 0x2A, 0xA8, 0xE2, - 0x0F, 0x55, 0xEE, 0x86, 0x86, 0x30, 0x05, 0x06, 0x03, 0x2B, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x31, 0xE6, 0x4A, 0xB1, 0x6B, + 0x4E, 0x2E, 0x77, 0x7B, 0xD6, 0xE3, 0x94, 0x8A, 0xCF, 0x02, + 0xB7, 0x58, 0x5A, 0xFB, 0xAB, 0x30, 0x05, 0x06, 0x03, 0x2B, 0x65, 0x70, 0x30, 0x81, 0xB8, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, @@ -6784,9 +6939,9 @@ 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x17, 0x30, 0x15, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x01, 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, 0x30, - 0x1E, 0x17, 0x0D, 0x32, 0x32, 0x31, 0x32, 0x31, 0x36, 0x32, - 0x31, 0x31, 0x37, 0x35, 0x30, 0x5A, 0x17, 0x0D, 0x32, 0x35, - 0x30, 0x39, 0x31, 0x31, 0x32, 0x31, 0x31, 0x37, 0x35, 0x30, + 0x1E, 0x17, 0x0D, 0x32, 0x33, 0x31, 0x32, 0x31, 0x33, 0x32, + 0x32, 0x31, 0x39, 0x32, 0x39, 0x5A, 0x17, 0x0D, 0x32, 0x36, + 0x30, 0x39, 0x30, 0x38, 0x32, 0x32, 0x31, 0x39, 0x32, 0x39, 0x5A, 0x30, 0x81, 0xB8, 0x31, 0x0B, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0E, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0C, 0x07, 0x4D, 0x6F, @@ -6837,9 +6992,9 @@ 0x6C, 0x2E, 0x63, 0x6F, 0x6D, 0x31, 0x17, 0x30, 0x15, 0x06, 0x0A, 0x09, 0x92, 0x26, 0x89, 0x93, 0xF2, 0x2C, 0x64, 0x01, 0x01, 0x0C, 0x07, 0x77, 0x6F, 0x6C, 0x66, 0x53, 0x53, 0x4C, - 0x82, 0x14, 0x69, 0xAC, 0xB8, 0xB4, 0xF7, 0xE4, 0x11, 0xCB, - 0xC5, 0x63, 0xB2, 0xCC, 0x2A, 0xA8, 0xE2, 0x0F, 0x55, 0xEE, - 0x86, 0x86, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, + 0x82, 0x14, 0x31, 0xE6, 0x4A, 0xB1, 0x6B, 0x4E, 0x2E, 0x77, + 0x7B, 0xD6, 0xE3, 0x94, 0x8A, 0xCF, 0x02, 0xB7, 0x58, 0x5A, + 0xFB, 0xAB, 0x30, 0x0C, 0x06, 0x03, 0x55, 0x1D, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xFF, 0x30, 0x1C, 0x06, 0x03, 0x55, 0x1D, 0x11, 0x04, 0x15, 0x30, 0x13, 0x82, 0x0B, 0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, @@ -6847,14 +7002,14 @@ 0x55, 0x1D, 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2B, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x05, 0x06, - 0x03, 0x2B, 0x65, 0x70, 0x03, 0x41, 0x00, 0x2E, 0x4A, 0xB8, - 0x2A, 0xF0, 0x75, 0xEE, 0x31, 0x6A, 0x51, 0x0A, 0x6A, 0x54, - 0x5B, 0x45, 0x6E, 0xAC, 0x03, 0xA8, 0xA9, 0x9A, 0xD4, 0xD6, - 0x38, 0x02, 0xEB, 0x76, 0xB6, 0xA7, 0x66, 0x86, 0xEA, 0xE9, - 0xF3, 0x6F, 0x31, 0x4E, 0xE4, 0x50, 0xD1, 0x75, 0xFE, 0x88, - 0x3F, 0x23, 0x9D, 0x76, 0xD9, 0x9C, 0x07, 0x14, 0x13, 0x16, - 0x30, 0xC3, 0x40, 0x51, 0x06, 0xDA, 0xA5, 0x39, 0x5F, 0x0A, - 0x09 + 0x03, 0x2B, 0x65, 0x70, 0x03, 0x41, 0x00, 0x92, 0xAC, 0x52, + 0xCF, 0x34, 0xC2, 0x76, 0x8A, 0x78, 0xF7, 0xEF, 0xDA, 0x3F, + 0x79, 0xE9, 0x66, 0xD1, 0xDE, 0xE1, 0xD7, 0x56, 0xB5, 0x4B, + 0xCF, 0xA7, 0xC2, 0x03, 0xAF, 0xCC, 0x23, 0x11, 0x4B, 0x44, + 0x0C, 0x33, 0xCE, 0x45, 0xE0, 0x33, 0xEB, 0xCC, 0xC9, 0xF8, + 0x38, 0x5B, 0x19, 0x6F, 0x86, 0x4D, 0x97, 0x30, 0xD1, 0x55, + 0x6E, 0xCB, 0x5F, 0x39, 0xC9, 0xA3, 0x22, 0x16, 0x66, 0x5F, + 0x07 }; static const int sizeof_client_ed25519_cert = sizeof(client_ed25519_cert); @@ -6871,5 +7026,31 @@ #endif /* HAVE_ED25519 */ +#if defined(USE_CERT_BUFFERS_25519) + +/* ./certs/statickeys/x25519.der, CURVE25519 */ +static const unsigned char x25519_statickey_der[] = +{ + 0x30, 0x2E, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2B, + 0x65, 0x6E, 0x04, 0x22, 0x04, 0x20, 0x78, 0x8E, 0x31, 0x5C, + 0x33, 0xA9, 0x19, 0xC0, 0x5E, 0x36, 0x70, 0x1B, 0xA4, 0xE8, + 0xEF, 0xC1, 0x89, 0x8C, 0xB3, 0x15, 0xC6, 0x79, 0xD3, 0xAC, + 0x22, 0x00, 0xAE, 0xFA, 0xB3, 0xB7, 0x0F, 0x78 +}; +static const int sizeof_x25519_statickey_der = sizeof(x25519_statickey_der); + +/* ./certs/statickeys/x25519-pub.der, CURVE25519 */ +static const unsigned char x25519_pub_statickey_der[] = +{ + 0x30, 0x2A, 0x30, 0x05, 0x06, 0x03, 0x2B, 0x65, 0x6E, 0x03, + 0x21, 0x00, 0x09, 0xBC, 0x8C, 0xC7, 0x45, 0x0D, 0xC1, 0xC2, + 0x02, 0x57, 0x9A, 0x68, 0x3A, 0xFD, 0x7A, 0xA8, 0xA5, 0x2F, + 0xF0, 0x99, 0x39, 0x98, 0xEA, 0x26, 0xA2, 0x5B, 0x38, 0xFD, + 0x96, 0xDB, 0x2A, 0x26 +}; +static const int sizeof_x25519_pub_statickey_der = sizeof(x25519_pub_statickey_der); + +#endif /* USE_CERT_BUFFERS_25519 */ + #endif /* WOLFSSL_CERTS_TEST_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/crl.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/crl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/crl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/crl.h 2024-08-03 07:30:01.000000000 +0000 @@ -42,6 +42,9 @@ WOLFSSL_LOCAL int BufferLoadCRL(WOLFSSL_CRL* crl, const byte* buff, long sz, int type, int verify); WOLFSSL_LOCAL int CheckCertCRL(WOLFSSL_CRL* crl, DecodedCert* cert); +WOLFSSL_LOCAL int CheckCertCRL_ex(WOLFSSL_CRL* crl, byte* issuerHash, + byte* serial, int serialSz, byte* serialHash, const byte* extCrlInfo, + int extCrlInfoSz, void* issuerName); #ifdef __cplusplus diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/error-ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/error-ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/error-ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/error-ssl.h 2024-08-03 07:30:01.000000000 +0000 @@ -30,6 +30,10 @@ extern "C" { #endif +#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES_H + #include +#endif + enum wolfSSL_ErrorCodes { INPUT_CASE_ERROR = -301, /* process input state error */ PREFIX_ERROR = -302, /* bad index to key rounds */ @@ -191,7 +195,8 @@ COMPRESSION_ERROR = -502, /* compression mismatch */ KEY_SHARE_ERROR = -503, /* key share mismatch */ POST_HAND_AUTH_ERROR = -504, /* client won't do post-hand auth */ - HRR_COOKIE_ERROR = -505 /* HRR msg cookie mismatch */ + HRR_COOKIE_ERROR = -505, /* HRR msg cookie mismatch */ + UNSUPPORTED_CERTIFICATE = -506 /* unsupported certificate type */ /* end negotiation parameter errors only 10 for now */ /* add strings to wolfSSL_ERR_reason_error_string in internal.c !!!!! */ @@ -210,6 +215,9 @@ WOLFSSL_LOCAL void SetErrorString(int err, char* buff); +#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES + #include +#endif #ifdef __cplusplus } /* extern "C" */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/include.am 2024-08-03 07:30:01.000000000 +0000 @@ -31,3 +31,9 @@ else nobase_include_HEADERS+= wolfssl/options.h endif + +wolfssl/debug-trace-error-codes.h wolfssl/debug-untrace-error-codes.h: wolfssl/wolfcrypt/error-crypt.h wolfssl/error-ssl.h + @support/gen-debug-trace-error-codes.sh + +DISTCLEANFILES += wolfssl/debug-trace-error-codes.h \ + wolfssl/debug-untrace-error-codes.h diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/internal.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/internal.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/internal.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/internal.h 2024-08-03 07:30:01.000000000 +0000 @@ -55,9 +55,15 @@ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && defined(OPENSSL_EXTRA) #include #endif +#ifdef HAVE_ARIA + #include +#endif #ifdef HAVE_CAMELLIA #include #endif +#ifdef WOLFSSL_SM4 + #include +#endif #include #ifndef NO_HMAC #include @@ -83,6 +89,9 @@ #ifdef WOLFSSL_SHA512 #include #endif +#ifdef WOLFSSL_SM3 + #include +#endif #ifdef HAVE_AESGCM #include #endif @@ -95,6 +104,9 @@ #ifdef HAVE_ECC #include #endif +#ifdef WOLFSSL_SM2 + #include +#endif #ifndef NO_DH #include #endif @@ -110,8 +122,10 @@ #ifdef HAVE_CURVE448 #include #endif -#ifdef HAVE_PQC +#ifdef HAVE_FALCON #include +#endif +#ifdef HAVE_DILITHIUM #include #endif #ifdef HAVE_HKDF @@ -194,7 +208,12 @@ #endif #elif defined(WOLFSSL_ZEPHYR) #ifndef SINGLE_THREADED - #include + #include + #if KERNEL_VERSION_NUMBER >= 0x30100 + #include + #else + #include + #endif #endif #elif defined(WOLFSSL_TELIT_M2MB) /* do nothing */ @@ -267,6 +286,10 @@ #include +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) +#include +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ + #ifdef __cplusplus extern "C" { #endif @@ -327,7 +350,7 @@ #endif #endif - #if !defined(NO_RSA) && !defined(NO_DES3) + #if !defined(NO_RSA) && !defined(NO_DES3) && !defined(NO_DES3_TLS_SUITES) #if !defined(NO_SHA) #if defined(WOLFSSL_STATIC_RSA) #define BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA @@ -484,7 +507,7 @@ #if defined(WOLFSSL_AES_256) && defined(HAVE_AES_CBC) #define BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA #endif - #if !defined(NO_DES3) + #if !defined(NO_DES3) && !defined(NO_DES3_TLS_SUITES) #define BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA #endif #endif @@ -640,6 +663,10 @@ #endif #endif #endif /* NO_AES */ + #ifdef HAVE_ARIA + #define BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 + #define BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 + #endif /* HAVE_ARIA */ #if !defined(NO_RC4) && !defined(WSSL_HARDEN_TLS) /* MUST NOT negotiate RC4 cipher suites * https://www.rfc-editor.org/rfc/rfc9325#section-4.1 */ @@ -666,7 +693,8 @@ #endif #endif #if !defined(NO_DES3) && !(defined(WSSL_HARDEN_TLS) && \ - WSSL_HARDEN_TLS > 112) + WSSL_HARDEN_TLS > 112) && \ + !defined(NO_DES3_TLS_SUITES) /* 3DES offers only 112 bits of security. * Using guidance from section 5.6.1 * https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r5.pdf */ @@ -840,6 +868,17 @@ #endif #endif + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + #ifdef WOLFSSL_SM4_CBC + #define BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 + #endif + #ifdef WOLFSSL_SM4_GCM + #define BUILD_TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 + #endif + #ifdef WOLFSSL_SM4_CCM + #define BUILD_TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 + #endif + #endif #endif #if defined(WOLFSSL_TLS13) @@ -872,6 +911,16 @@ #define BUILD_TLS_SHA384_SHA384 #endif #endif + + #ifdef WOLFSSL_SM3 + #ifdef WOLFSSL_SM4_GCM + #define BUILD_TLS_SM4_GCM_SM3 + #endif + + #ifdef WOLFSSL_SM4_CCM + #define BUILD_TLS_SM4_CCM_SM3 + #endif + #endif #endif #if !defined(WOLFCRYPT_ONLY) && defined(NO_PSK) && \ @@ -924,6 +973,11 @@ #define NO_AESGCM_AEAD #endif +#if defined(BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256) || \ + defined(BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384) + #define BUILD_ARIA +#endif + #if defined(BUILD_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256) || \ defined(BUILD_TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256) || \ defined(BUILD_TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256) || \ @@ -969,8 +1023,10 @@ #if defined(WOLFSSL_MAX_STRENGTH) || \ (defined(HAVE_AESGCM) && !defined(NO_AESGCM_AEAD)) || \ defined(HAVE_AESCCM) || \ + defined(HAVE_ARIA) || \ (defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \ !defined(NO_CHAPOL_AEAD)) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || \ (defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER)) #define HAVE_AEAD @@ -999,6 +1055,13 @@ #undef WSSL_HARDEN_TLS +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY) +#define SSL_CA_NAMES(ssl) ((ssl)->client_ca_names != NULL ? (ssl)->client_ca_names : \ + (ssl)->ctx->client_ca_names) +#else +#define WOLFSSL_NO_CA_NAMES +#endif + /* actual cipher values, 2nd byte */ enum { TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x16, @@ -1140,6 +1203,21 @@ TLS_SHA256_SHA256 = 0xB4, TLS_SHA384_SHA384 = 0xB5, + /* ARIA-GCM, first byte is 0xC0 (ECC_BYTE) + * See: https://www.rfc-editor.org/rfc/rfc6209.html#section-5 + */ + TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 = 0x5c, + TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 = 0x5d, + + /* TLS v1.3 SM cipher suites - 0x00 (CIPHER_BYTE) is first byte */ + TLS_SM4_GCM_SM3 = 0xC6, + TLS_SM4_CCM_SM3 = 0xC7, + + /* TLS v1.2 SM cipher suites - 0xE0 (SM_BYTE) is first byte */ + TLS_ECDHE_ECDSA_WITH_SM4_CBC_SM3 = 0x11, + TLS_ECDHE_ECDSA_WITH_SM4_GCM_SM3 = 0x51, + TLS_ECDHE_ECDSA_WITH_SM4_CCM_SM3 = 0x52, + /* Fallback SCSV (Signaling Cipher Suite Value) */ TLS_FALLBACK_SCSV = 0x56, /* Renegotiation Indication Extension Special Suite */ @@ -1395,6 +1473,15 @@ #define DTLS_AEAD_AES_CCM_FAIL_LIMIT w64From32(0x00B5, 0x04F3) #define DTLS_AEAD_AES_CCM_FAIL_KU_LIMIT w64From32(0x005A, 0x8279) +/* Limit is (2^22 - 1) full messages [2^36 - 31 octets] + * https://www.rfc-editor.org/rfc/rfc8998.html#name-aead_sm4_gcm + */ +#define AEAD_SM4_GCM_LIMIT w64From32(0, (1 << 22) - 1) +/* Limit is (2^10 - 1) full messages [2^24 - 1 octets] + * https://www.rfc-editor.org/rfc/rfc8998.html#name-aead_sm4_ccm + */ +#define AEAD_SM4_CCM_LIMIT w64From32(0, (1 << 10) - 1) + #if defined(WOLFSSL_TLS13) || !defined(NO_PSK) #define TLS13_TICKET_NONCE_MAX_SZ 255 @@ -1432,6 +1519,7 @@ CHACHA_BYTE = 0xCC, /* ChaCha first cipher suite */ TLS13_BYTE = 0x13, /* TLS v1.3 first byte of cipher suite */ ECDHE_PSK_BYTE = 0xD0, /* RFC 8442 */ + SM_BYTE = 0xE0, /* SM first byte - private range */ SEND_CERT = 1, SEND_BLANK_CERT = 2, @@ -1468,8 +1556,9 @@ MAXEARLYDATASZ_LEN = 4, /* maxEarlyDataSz size in ticket */ #endif #endif -#ifdef HAVE_PQC - ENCRYPT_LEN = 4600, /* allow 4600 byte buffer for dilithium. */ +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) + ENCRYPT_LEN = 5120, /* Allow 5k byte buffer for dilithium and + * hybridization with other algs. */ #else #ifndef NO_PSK ENCRYPT_LEN = (ENCRYPT_BASE_BITS / 8) + MAX_PSK_ID_LEN + 2, @@ -1479,7 +1568,6 @@ #endif SIZEOF_SENDER = 4, /* clnt or srvr */ FINISHED_SZ = 36, /* WC_MD5_DIGEST_SIZE + WC_SHA_DIGEST_SIZE */ - MAX_RECORD_SIZE = 16384, /* 2^14, max size by standard */ MAX_PLAINTEXT_SZ = (1 << 14), /* Max plaintext sz */ MAX_TLS_CIPHER_SZ = (1 << 14) + 2048, /* Max TLS encrypted data sz */ #ifdef WOLFSSL_TLS13 @@ -1572,7 +1660,8 @@ DTLS_EXPORT_PRO = 165,/* wolfSSL protocol for serialized session */ DTLS_EXPORT_STATE_PRO = 166,/* wolfSSL protocol for serialized state */ TLS_EXPORT_PRO = 167,/* wolfSSL protocol for serialized TLS */ - DTLS_EXPORT_OPT_SZ = 61, /* amount of bytes used from Options */ + DTLS_EXPORT_OPT_SZ = 62, /* amount of bytes used from Options */ + DTLS_EXPORT_OPT_SZ_4 = 61, /* amount of bytes used from Options */ TLS_EXPORT_OPT_SZ = 65, /* amount of bytes used from Options */ DTLS_EXPORT_OPT_SZ_3 = 60, /* amount of bytes used from Options */ DTLS_EXPORT_KEY_SZ = 325 + (DTLS_SEQ_SZ * 2), @@ -1585,8 +1674,9 @@ WOLFSSL_EXPORT_SPC_SZ = 16, /* amount of bytes used from CipherSpecs */ #endif WOLFSSL_EXPORT_LEN = 2, /* 2 bytes for length and protocol */ - WOLFSSL_EXPORT_VERSION = 4, /* wolfSSL version for serialized session */ + WOLFSSL_EXPORT_VERSION = 5, /* wolfSSL version for serialized session */ + WOLFSSL_EXPORT_VERSION_4 = 4, /* 5.6.4 release and before */ /* older export versions supported */ WOLFSSL_EXPORT_VERSION_3 = 3, /* wolfSSL version before TLS 1.3 addition */ @@ -1611,21 +1701,16 @@ SESSION_FLUSH_COUNT = 256, /* Flush session cache unless user turns off */ TLS_MAX_PAD_SZ = 255, /* Max padding in TLS */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - MAX_SYM_KEY_SIZE = AES_256_KEY_SIZE, -#else - #if defined(HAVE_NULL_CIPHER) && defined(WOLFSSL_TLS13) - #if defined(WOLFSSL_SHA384) && WC_MAX_SYM_KEY_SIZE < 48 - MAX_SYM_KEY_SIZE = WC_SHA384_DIGEST_SIZE, - #elif !defined(NO_SHA256) && WC_MAX_SYM_KEY_SIZE < 32 - MAX_SYM_KEY_SIZE = WC_SHA256_DIGEST_SIZE, - #else - MAX_SYM_KEY_SIZE = WC_MAX_SYM_KEY_SIZE, - #endif +#if defined(HAVE_NULL_CIPHER) && defined(WOLFSSL_TLS13) + #if defined(WOLFSSL_SHA384) && WC_MAX_SYM_KEY_SIZE < 48 + MAX_SYM_KEY_SIZE = WC_SHA384_DIGEST_SIZE, + #elif !defined(NO_SHA256) && WC_MAX_SYM_KEY_SIZE < 32 + MAX_SYM_KEY_SIZE = WC_SHA256_DIGEST_SIZE, #else MAX_SYM_KEY_SIZE = WC_MAX_SYM_KEY_SIZE, #endif +#else + MAX_SYM_KEY_SIZE = WC_MAX_SYM_KEY_SIZE, #endif #if defined(HAVE_SELFTEST) && \ @@ -1648,9 +1733,14 @@ AEAD_LEN_OFFSET = 11, /* Auth Data: Length */ AEAD_AUTH_DATA_SZ = 13, /* Size of the data to authenticate */ AEAD_NONCE_SZ = 12, - AESGCM_IMP_IV_SZ = 4, /* Size of GCM/CCM AEAD implicit IV */ + AESGCM_IMP_IV_SZ = 4, /* Size of GCM AEAD implicit IV */ + AESCCM_IMP_IV_SZ = 4, /* Size of CCM AEAD implicit IV */ AESGCM_EXP_IV_SZ = 8, /* Size of GCM/CCM AEAD explicit IV */ AESGCM_NONCE_SZ = AESGCM_EXP_IV_SZ + AESGCM_IMP_IV_SZ, + GCM_IMP_IV_SZ = 4, /* Size of GCM AEAD implicit IV */ + CCM_IMP_IV_SZ = 4, /* Size of CCM AEAD implicit IV */ + GCM_EXP_IV_SZ = 8, /* Size of GCM/CCM AEAD explicit IV */ + GCM_NONCE_SZ = GCM_EXP_IV_SZ + GCM_IMP_IV_SZ, CHACHA20_IMP_IV_SZ = 12, /* Size of ChaCha20 AEAD implicit IV */ CHACHA20_NONCE_SZ = 12, /* Size of ChacCha20 nonce */ @@ -1663,6 +1753,11 @@ AES_CCM_8_AUTH_SZ = 8, /* AES-CCM-8 Auth Tag Length */ AESCCM_NONCE_SZ = 12, + SM4_GCM_AUTH_SZ = 16, /* SM4-GCM Auth Tag length */ + SM4_GCM_NONCE_SZ = 12, /* SM4 GCM Nonce length */ + SM4_CCM_AUTH_SZ = 16, /* SM4-CCM Auth Tag length */ + SM4_CCM_NONCE_SZ = 12, /* SM4 CCM Nonce length */ + CAMELLIA_128_KEY_SIZE = 16, /* for 128 bit */ CAMELLIA_192_KEY_SIZE = 24, /* for 192 bit */ CAMELLIA_256_KEY_SIZE = 32, /* for 256 bit */ @@ -1681,35 +1776,39 @@ #ifndef ECDHE_SIZE /* allow this to be overridden at compile-time */ ECDHE_SIZE = 32, /* ECDHE server size defaults to 256 bit */ #endif - MAX_EXPORT_ECC_SZ = 256, /* Export ANS X9.62 max future size */ - MAX_CURVE_NAME_SZ = 16, /* Maximum size of curve name string */ + MAX_EXPORT_ECC_SZ = 256, /* Export ANSI X9.62 max future size */ + MAX_CURVE_NAME_SZ = 18, /* Maximum size of curve name string */ NEW_SA_MAJOR = 8, /* Most significant byte used with new sig algos */ ED25519_SA_MAJOR = 8, /* Most significant byte for ED25519 */ ED25519_SA_MINOR = 7, /* Least significant byte for ED25519 */ ED448_SA_MAJOR = 8, /* Most significant byte for ED448 */ ED448_SA_MINOR = 8, /* Least significant byte for ED448 */ + SM2_SA_MAJOR = 7, /* Most significant byte for SM2 with SM3 */ + SM2_SA_MINOR = 8, /* Least significant byte for SM2 with SM3 */ PQC_SA_MAJOR = 0xFE,/* Most significant byte used with PQC sig algs */ - /* These values for falcon and dilithium match what OQS has defined in their OpenSSL fork. */ + /* These values for falcon and dilithium match what OQS has defined. */ FALCON_LEVEL1_SA_MAJOR = 0xFE, - FALCON_LEVEL1_SA_MINOR = 0x0B, + FALCON_LEVEL1_SA_MINOR = 0xAE, FALCON_LEVEL5_SA_MAJOR = 0xFE, - FALCON_LEVEL5_SA_MINOR = 0x0E, + FALCON_LEVEL5_SA_MINOR = 0xB1, DILITHIUM_LEVEL2_SA_MAJOR = 0xFE, - DILITHIUM_LEVEL2_SA_MINOR = 0xA0, + DILITHIUM_LEVEL2_SA_MINOR = 0xD0, DILITHIUM_LEVEL3_SA_MAJOR = 0xFE, - DILITHIUM_LEVEL3_SA_MINOR = 0xA3, + DILITHIUM_LEVEL3_SA_MINOR = 0xD1, DILITHIUM_LEVEL5_SA_MAJOR = 0xFE, - DILITHIUM_LEVEL5_SA_MINOR = 0xA5, + DILITHIUM_LEVEL5_SA_MINOR = 0xD2, MIN_RSA_SHA512_PSS_BITS = 512 * 2 + 8 * 8, /* Min key size */ MIN_RSA_SHA384_PSS_BITS = 384 * 2 + 8 * 8, /* Min key size */ -#if defined(HAVE_PQC) +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) MAX_CERT_VERIFY_SZ = 6000, /* For Dilithium */ +#elif defined(WOLFSSL_CERT_EXT) + MAX_CERT_VERIFY_SZ = 2048, /* For larger extensions */ #elif !defined(NO_RSA) && defined(WOLFSSL_MAX_RSA_BITS) MAX_CERT_VERIFY_SZ = WOLFSSL_MAX_RSA_BITS / 8, /* max RSA bytes */ #elif defined(HAVE_ECC) @@ -1737,13 +1836,6 @@ MAX_WOLFSSL_FILE_SIZE = 1024UL * 1024UL * 4, /* 4 mb file size alloc limit */ #endif -#if defined(HAVE_PQC) - MAX_X509_SIZE = 8*1024, /* max static x509 buffer size; dilithium is big */ -#elif defined(WOLFSSL_HAPROXY) - MAX_X509_SIZE = 3072, /* max static x509 buffer size */ -#else - MAX_X509_SIZE = 2048, /* max static x509 buffer size */ -#endif CERT_MIN_SIZE = 256, /* min PEM cert size with header/footer */ NO_SNIFF = 0, /* not sniffing */ @@ -1765,12 +1857,13 @@ #define WOLFSSL_NAMED_GROUP_IS_FFHDE(group) \ (MIN_FFHDE_GROUP <= (group) && (group) <= MAX_FFHDE_GROUP) -#ifdef HAVE_PQC +#ifdef WOLFSSL_HAVE_KYBER #define WOLFSSL_NAMED_GROUP_IS_PQC(group) \ - (WOLFSSL_PQC_MIN <= (group) && (group) <= WOLFSSL_PQC_MAX) + ((WOLFSSL_PQC_SIMPLE_MIN <= (group) && (group) <= WOLFSSL_PQC_SIMPLE_MAX) || \ + (WOLFSSL_PQC_HYBRID_MIN <= (group) && (group) <= WOLFSSL_PQC_HYBRID_MAX)) #else #define WOLFSSL_NAMED_GROUP_IS_PQC(group) ((void)(group), 0) -#endif /* HAVE_PQC */ +#endif /* WOLFSSL_HAVE_KYBER */ /* minimum Downgrade Minor version */ #ifndef WOLFSSL_MIN_DOWNGRADE @@ -1800,7 +1893,7 @@ /* number of items in the signature algo list */ #ifndef WOLFSSL_MAX_SIGALGO -#ifdef HAVE_PQC +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) /* If we are building with post-quantum algorithms, we likely want to * inter-op with OQS's OpenSSL and they send a lot more sigalgs. */ @@ -1829,12 +1922,14 @@ #endif #define MIN_ECCKEY_SZ (WOLFSSL_MIN_ECC_BITS / 8) -#ifdef HAVE_PQC +#ifdef HAVE_FALCON #ifndef MIN_FALCONKEY_SZ - #define MIN_FALCONKEY_SZ 897 + #define MIN_FALCONKEY_SZ 1281 #endif +#endif +#ifdef HAVE_DILITHIUM #ifndef MIN_DILITHIUMKEY_SZ - #define MIN_DILITHIUMKEY_SZ 1312 + #define MIN_DILITHIUMKEY_SZ 2528 #endif #endif @@ -1876,6 +1971,15 @@ #define SESSIDX_IDX_MASK 0x0F #endif +#ifndef MAX_X509_SIZE + #if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) + #define MAX_X509_SIZE (8*1024) /* max static x509 buffer size; dilithium is big */ + #elif defined(WOLFSSL_HAPROXY) + #define MAX_X509_SIZE 3072 /* max static x509 buffer size */ + #else + #define MAX_X509_SIZE 2048 /* max static x509 buffer size */ + #endif +#endif /* max cert chain peer depth */ #ifndef MAX_CHAIN_DEPTH @@ -1929,11 +2033,19 @@ #define MAX_ENCRYPT_SZ ENCRYPT_LEN -#define WOLFSSL_ASSERT_SIZEOF_GE(x, y) do { \ - typedef char _args_test_[sizeof((x)) >= sizeof((y)) ? 1 : -1]; \ - (void)sizeof(_args_test_); \ +/* A static check to assert a relation between x and y */ +#define WOLFSSL_ASSERT_TEST(x, y, op) do { \ + typedef char _args_test_[(x) op (y) ? 1 : -1]; \ + (void)sizeof(_args_test_); \ } while(0) +#define WOLFSSL_ASSERT_EQ(x, y) WOLFSSL_ASSERT_TEST(x, y, ==) + +#define WOLFSSL_ASSERT_SIZEOF_TEST(x, y, op) \ + WOLFSSL_ASSERT_TEST(sizeof((x)), sizeof((y)), op) + +#define WOLFSSL_ASSERT_SIZEOF_GE(x, y) WOLFSSL_ASSERT_SIZEOF_TEST(x, y, >=) + /* states. Adding state before HANDSHAKE_DONE will break session importing */ enum states { NULL_STATE = 0, @@ -2040,6 +2152,9 @@ WOLFSSL_LOCAL int InitSSL_Suites(WOLFSSL* ssl); WOLFSSL_LOCAL int InitSSL_Side(WOLFSSL* ssl, word16 side); + +WOLFSSL_LOCAL int DoHandShakeMsgType(WOLFSSL* ssl, byte* input, + word32* inOutIdx, byte type, word32 size, word32 totalSz); /* for sniffer */ WOLFSSL_LOCAL int DoFinished(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size, word32 totalSz, int sniff); @@ -2050,8 +2165,7 @@ WOLFSSL_LOCAL int DoApplicationData(WOLFSSL* ssl, byte* input, word32* inOutIdx, int sniff); /* TLS v1.3 needs these */ -WOLFSSL_LOCAL int HandleTlsResumption(WOLFSSL* ssl, int bogusID, - Suites* clSuites); +WOLFSSL_LOCAL int HandleTlsResumption(WOLFSSL* ssl, Suites* clSuites); #ifdef WOLFSSL_TLS13 WOLFSSL_LOCAL byte SuiteMac(const byte* suite); #endif @@ -2066,14 +2180,22 @@ WOLFSSL_LOCAL int CompleteServerHello(WOLFSSL *ssl); WOLFSSL_LOCAL int CheckVersion(WOLFSSL *ssl, ProtocolVersion pv); WOLFSSL_LOCAL int PickHashSigAlgo(WOLFSSL* ssl, const byte* hashSigAlgo, - word32 hashSigAlgoSz); + word32 hashSigAlgoSz, int matchSuites); #if defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_CHECK_PRIVATE_KEY) WOLFSSL_LOCAL int CreateDevPrivateKey(void** pkey, byte* data, word32 length, int hsType, int label, int id, void* heap, int devId); #endif -WOLFSSL_LOCAL int DecodePrivateKey(WOLFSSL *ssl, word16* length); -#ifdef WOLF_PRIVATE_KEY_ID +#ifdef WOLFSSL_BLIND_PRIVATE_KEY +WOLFSSL_LOCAL int wolfssl_priv_der_blind(WC_RNG* rng, DerBuffer* key, + DerBuffer** mask); +WOLFSSL_LOCAL void wolfssl_priv_der_unblind(DerBuffer* key, DerBuffer* mask); +#endif +WOLFSSL_LOCAL int DecodePrivateKey(WOLFSSL *ssl, word32* length); +#ifdef WOLFSSL_DUAL_ALG_CERTS +WOLFSSL_LOCAL int DecodeAltPrivateKey(WOLFSSL *ssl, word32* length); +#endif +#if defined(WOLF_PRIVATE_KEY_ID) || defined(HAVE_PK_CALLBACKS) WOLFSSL_LOCAL int GetPrivateKeySigSize(WOLFSSL* ssl); #ifndef NO_ASN WOLFSSL_LOCAL int InitSigPkCb(WOLFSSL* ssl, SignatureCtx* sigCtx); @@ -2089,11 +2211,13 @@ WOLFSSL_LOCAL void FreeKeyExchange(WOLFSSL* ssl); WOLFSSL_LOCAL void FreeSuites(WOLFSSL* ssl); WOLFSSL_LOCAL int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, word32 totalSz); -WOLFSSL_LOCAL int MatchDomainName(const char* pattern, int len, const char* str); +WOLFSSL_LOCAL int MatchDomainName(const char* pattern, int len, const char* str, word32 strLen); #ifndef NO_CERTS -WOLFSSL_LOCAL int CheckForAltNames(DecodedCert* dCert, const char* domain, int* checkCN); +WOLFSSL_LOCAL int CheckForAltNames(DecodedCert* dCert, const char* domain, word32 domainLen, int* checkCN); WOLFSSL_LOCAL int CheckIPAddr(DecodedCert* dCert, const char* ipasc); +WOLFSSL_LOCAL void CopyDecodedName(WOLFSSL_X509_NAME* name, DecodedCert* dCert, int nameType); #endif +WOLFSSL_LOCAL int SetupTicket(WOLFSSL* ssl); WOLFSSL_LOCAL int CreateTicket(WOLFSSL* ssl); WOLFSSL_LOCAL int HashRaw(WOLFSSL* ssl, const byte* output, int sz); WOLFSSL_LOCAL int HashOutput(WOLFSSL* ssl, const byte* output, int sz, @@ -2112,6 +2236,8 @@ WOLFSSL_LOCAL int ChachaAEADEncrypt(WOLFSSL* ssl, byte* out, const byte* input, word16 sz); /* needed by sniffer */ +WOLFSSL_LOCAL int ChachaAEADDecrypt(WOLFSSL* ssl, byte* plain, const byte* input, + word16 sz); /* needed by sniffer */ #ifdef WOLFSSL_TLS13 WOLFSSL_LOCAL int DecryptTls13(WOLFSSL* ssl, byte* output, const byte* input, @@ -2163,6 +2289,8 @@ /* determine maximum record size */ +#define MAX_RECORD_SIZE 16384 /* 2^14, max size by standard */ + #ifdef RECORD_SIZE /* user supplied value */ #if RECORD_SIZE < 128 || RECORD_SIZE > MAX_RECORD_SIZE @@ -2230,7 +2358,7 @@ word16 hashSigAlgoSz; /* SigAlgo extension length in bytes */ byte suites[WOLFSSL_MAX_SUITE_SZ]; byte hashSigAlgo[WOLFSSL_MAX_SIGALGO]; /* sig/algo to offer */ - byte setSuites; /* user set suites from default */ + byte setSuites:1; /* user set suites from default */ }; typedef struct CipherSuite { @@ -2243,14 +2371,10 @@ #endif } CipherSuite; -WOLFSSL_LOCAL void InitSuitesHashSigAlgo(Suites* suites, int haveECDSAsig, - int haveRSAsig, int haveFalconSig, - int haveDilithiumSig, int haveAnon, - int tls1_2, int keySz); -WOLFSSL_LOCAL void InitSuitesHashSigAlgo_ex(byte* hashSigAlgo, int haveECDSAsig, - int haveRSAsig, int haveFalconSig, - int haveDilithiumSig, int haveAnon, - int tls1_2, int keySz, word16* len); +/* use wolfSSL_API visibility to be able to test in tests/api.c */ +WOLFSSL_API void InitSuitesHashSigAlgo(byte* hashSigAlgo, int have, + int tls1_2, int keySz, + word16* len); WOLFSSL_LOCAL int AllocateCtxSuites(WOLFSSL_CTX* ctx); WOLFSSL_LOCAL int AllocateSuites(WOLFSSL* ssl); WOLFSSL_LOCAL void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, @@ -2264,7 +2388,9 @@ WOLFSSL_LOCAL int MatchSuite_ex(const WOLFSSL* ssl, Suites* peerSuites, CipherSuite* cs, TLSX* extensions); WOLFSSL_LOCAL int MatchSuite(WOLFSSL* ssl, Suites* peerSuites); -WOLFSSL_LOCAL int SetCipherList(WOLFSSL_CTX* ctx, Suites* suites, +WOLFSSL_LOCAL int SetCipherList_ex(const WOLFSSL_CTX* ctx, const WOLFSSL* ssl, + Suites* suites, const char* list); +WOLFSSL_LOCAL int SetCipherList(const WOLFSSL_CTX* ctx, Suites* suites, const char* list); WOLFSSL_LOCAL int SetCipherListFromBytes(WOLFSSL_CTX* ctx, Suites* suites, const byte* list, const int listSz); @@ -2340,7 +2466,9 @@ typedef struct CRL_Entry CRL_Entry; -#ifdef NO_SHA +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + #define CRL_DIGEST_SIZE WC_SM3_DIGEST_SIZE +#elif defined(NO_SHA) #define CRL_DIGEST_SIZE WC_SHA256_DIGEST_SIZE #else #define CRL_DIGEST_SIZE WC_SHA_DIGEST_SIZE @@ -2358,7 +2486,16 @@ #endif /* Complete CRL */ struct CRL_Entry { + byte* toBeSigned; + byte* signature; +#if defined(OPENSSL_EXTRA) + WOLFSSL_X509_NAME* issuer; /* X509_NAME type issuer */ +#endif CRL_Entry* next; /* next entry */ + wolfSSL_Mutex verifyMutex; + /* DupCRL_Entry copies data after the `verifyMutex` member. Using the mutex + * as the marker because clang-tidy doesn't like taking the sizeof a + * pointer. */ byte issuerHash[CRL_DIGEST_SIZE]; /* issuer hash */ /* byte crlHash[CRL_DIGEST_SIZE]; raw crl data hash */ /* restore the hash here if needed for optimized comparisons */ @@ -2378,22 +2515,22 @@ int totalCerts; /* number on list */ int version; /* version of certificate */ int verified; - byte* toBeSigned; word32 tbsSz; - byte* signature; word32 signatureSz; word32 signatureOID; +#ifdef WC_RSA_PSS + word32 sigParamsSz; /* length of signature parameters */ + byte* sigParams; /* buffer with signature parameters */ +#endif #if !defined(NO_SKID) && !defined(NO_ASN) byte extAuthKeyIdSet; byte extAuthKeyId[KEYID_SIZE]; #endif int crlNumber; /* CRL number extension */ -#if defined(OPENSSL_EXTRA) - WOLFSSL_X509_NAME* issuer; /* X509_NAME type issuer */ -#endif }; +#ifdef HAVE_CRL_MONITOR typedef struct CRL_Monitor CRL_Monitor; /* CRL directory monitor */ @@ -2407,6 +2544,20 @@ #undef HAVE_CRL_MONITOR #endif +/* PEM and DER possible */ +#define WOLFSSL_CRL_MONITORS_LEN (2) + +#if defined(__MACH__) || defined(__FreeBSD__) || defined(__linux__) +typedef int wolfSSL_CRL_mfd_t; /* monitor fd, -1 if no init yet */ +/* mfd for bsd is kqueue fd, eventfd for linux */ +#define WOLFSSL_CRL_MFD_INIT_VAL (-1) +#elif defined(_MSC_VER) +typedef HANDLE wolfSSL_CRL_mfd_t; /* monitor fd, INVALID_HANDLE_VALUE if + * no init yet */ +#define WOLFSSL_CRL_MFD_INIT_VAL (INVALID_HANDLE_VALUE) +#endif +#endif + /* wolfSSL CRL controller */ struct WOLFSSL_CRL { WOLFSSL_CERT_MANAGER* cm; /* pointer back to cert manager */ @@ -2415,12 +2566,12 @@ #ifdef HAVE_CRL_IO CbCrlIO crlIOCb; #endif - wolfSSL_Mutex crlLock; /* CRL list lock */ - CRL_Monitor monitors[2]; /* PEM and DER possible */ + wolfSSL_RwLock crlLock; /* CRL list lock */ #ifdef HAVE_CRL_MONITOR - pthread_cond_t cond; /* condition to signal setup */ - pthread_t tid; /* monitoring thread */ - int mfd; /* monitor fd, -1 if no init yet */ + CRL_Monitor monitors[WOLFSSL_CRL_MONITORS_LEN]; + COND_TYPE cond; /* condition to signal setup */ + THREAD_TYPE tid; /* monitoring thread */ + wolfSSL_CRL_mfd_t mfd; int setup; /* thread is setup predicate */ #endif void* heap; /* heap hint for dynamic memory */ @@ -2490,11 +2641,16 @@ /* with CTX free. */ #endif wolfSSL_Ref ref; -#ifdef HAVE_PQC - short minFalconKeySz; /* minimum allowed Falcon key size */ - short minDilithiumKeySz; /* minimum allowed Dilithium key size */ +#ifdef HAVE_FALCON + short minFalconKeySz; /* minimum allowed Falcon key size */ +#endif +#ifdef HAVE_DILITHIUM + short minDilithiumKeySz; /* minimum allowed Dilithium key size */ +#endif +#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ + && defined(HAVE_OID_DECODING) + wc_UnknownExtCallback unknownExtCallback; #endif - }; WOLFSSL_LOCAL int CM_SaveCertCache(WOLFSSL_CERT_MANAGER* cm, @@ -2507,7 +2663,7 @@ const void* mem, int sz); WOLFSSL_LOCAL int CM_GetCertCacheMemSize(WOLFSSL_CERT_MANAGER* cm); WOLFSSL_LOCAL int CM_VerifyBuffer_ex(WOLFSSL_CERT_MANAGER* cm, const byte* buff, - long sz, int format, int err_val); + long sz, int format, int prev_err); #ifndef NO_CERTS @@ -2539,6 +2695,14 @@ } ProcPeerCertArgs; WOLFSSL_LOCAL int DoVerifyCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, int ret, ProcPeerCertArgs* args); +WOLFSSL_LOCAL void DoCrlCallback(WOLFSSL_CERT_MANAGER* cm, WOLFSSL* ssl, + ProcPeerCertArgs* args, int* outRet); + +WOLFSSL_LOCAL int SetupStoreCtxCallback(WOLFSSL_X509_STORE_CTX** store_pt, + WOLFSSL* ssl, WOLFSSL_CERT_MANAGER* cm, ProcPeerCertArgs* args, + int cert_err, void* heap, int* x509Free); +WOLFSSL_LOCAL void CleanupStoreCtxCallback(WOLFSSL_X509_STORE_CTX* store, + WOLFSSL* ssl, void* heap, int x509Free); #endif /* !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) */ #endif /* !defined NO_CERTS */ @@ -2649,10 +2813,9 @@ tsip_hmac_sha_key_index_t tsip_server_write_MAC_secret; #endif -#ifdef WOLFSSL_RENESAS_SCEPROTECT - - sce_hmac_sha_wrapped_key_t sce_client_write_MAC_secret; - sce_hmac_sha_wrapped_key_t sce_server_write_MAC_secret; +#ifdef WOLFSSL_RENESAS_FSPSM_TLS + FSPSM_HMAC_WKEY fspsm_client_write_MAC_secret; + FSPSM_HMAC_WKEY fspsm_server_write_MAC_secret; #endif } Keys; @@ -2663,66 +2826,141 @@ /** TLS Extensions - RFC 6066 */ #ifdef HAVE_TLS_EXTENSIONS +#define TLSXT_SERVER_NAME 0x0000 /* a.k.a. SNI */ +#define TLSXT_MAX_FRAGMENT_LENGTH 0x0001 +#define TLSXT_TRUSTED_CA_KEYS 0x0003 +#define TLSXT_TRUNCATED_HMAC 0x0004 +#define TLSXT_STATUS_REQUEST 0x0005 /* a.k.a. OCSP stapling */ +#define TLSXT_SUPPORTED_GROUPS 0x000a /* a.k.a. Supported Curves */ +#define TLSXT_EC_POINT_FORMATS 0x000b +#define TLSXT_SIGNATURE_ALGORITHMS 0x000d /* HELLO_EXT_SIG_ALGO */ +#define TLSXT_USE_SRTP 0x000e /* 14 */ +#define TLSXT_APPLICATION_LAYER_PROTOCOL 0x0010 /* a.k.a. ALPN */ +#define TLSXT_STATUS_REQUEST_V2 0x0011 /* a.k.a. OCSP stapling v2 */ +#define TLSXT_CLIENT_CERTIFICATE 0x0013 /* RFC8446 */ +#define TLSXT_SERVER_CERTIFICATE 0x0014 /* RFC8446 */ +#define TLSXT_ENCRYPT_THEN_MAC 0x0016 /* RFC 7366 */ +#define TLSXT_EXTENDED_MASTER_SECRET 0x0017 /* HELLO_EXT_EXTMS */ +#define TLSXT_SESSION_TICKET 0x0023 +#define TLSXT_PRE_SHARED_KEY 0x0029 +#define TLSXT_EARLY_DATA 0x002a +#define TLSXT_SUPPORTED_VERSIONS 0x002b +#define TLSXT_COOKIE 0x002c +#define TLSXT_PSK_KEY_EXCHANGE_MODES 0x002d +#define TLSXT_CERTIFICATE_AUTHORITIES 0x002f +#define TLSXT_POST_HANDSHAKE_AUTH 0x0031 +#define TLSXT_SIGNATURE_ALGORITHMS_CERT 0x0032 +#define TLSXT_KEY_SHARE 0x0033 +#define TLSXT_CONNECTION_ID 0x0036 +#define TLSXT_KEY_QUIC_TP_PARAMS 0x0039 /* RFC 9001, ch. 8.2 */ +#define TLSXT_ECH 0xfe0d /* from */ + /* draft-ietf-tls-esni-13 */ +/* The 0xFF section is experimental/custom/personal use */ +#define TLSXT_CKS 0xff92 /* X9.146 */ +#define TLSXT_RENEGOTIATION_INFO 0xff01 +#define TLSXT_KEY_QUIC_TP_PARAMS_DRAFT 0xffa5 /* from */ + /* draft-ietf-quic-tls-27 */ + typedef enum { #ifdef HAVE_SNI - TLSX_SERVER_NAME = 0x0000, /* a.k.a. SNI */ + TLSX_SERVER_NAME = TLSXT_SERVER_NAME, #endif - TLSX_MAX_FRAGMENT_LENGTH = 0x0001, - TLSX_TRUSTED_CA_KEYS = 0x0003, - TLSX_TRUNCATED_HMAC = 0x0004, - TLSX_STATUS_REQUEST = 0x0005, /* a.k.a. OCSP stapling */ - TLSX_SUPPORTED_GROUPS = 0x000a, /* a.k.a. Supported Curves */ - TLSX_EC_POINT_FORMATS = 0x000b, + TLSX_MAX_FRAGMENT_LENGTH = TLSXT_MAX_FRAGMENT_LENGTH, + TLSX_TRUSTED_CA_KEYS = TLSXT_TRUSTED_CA_KEYS, + TLSX_TRUNCATED_HMAC = TLSXT_TRUNCATED_HMAC, + TLSX_STATUS_REQUEST = TLSXT_STATUS_REQUEST, + TLSX_SUPPORTED_GROUPS = TLSXT_SUPPORTED_GROUPS, + TLSX_EC_POINT_FORMATS = TLSXT_EC_POINT_FORMATS, #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) - TLSX_SIGNATURE_ALGORITHMS = 0x000d, /* HELLO_EXT_SIG_ALGO */ + TLSX_SIGNATURE_ALGORITHMS = TLSXT_SIGNATURE_ALGORITHMS, #endif #ifdef WOLFSSL_SRTP - TLSX_USE_SRTP = 0x000e, /* 14 */ + TLSX_USE_SRTP = TLSXT_USE_SRTP, +#endif + TLSX_APPLICATION_LAYER_PROTOCOL = TLSXT_APPLICATION_LAYER_PROTOCOL, + TLSX_STATUS_REQUEST_V2 = TLSXT_STATUS_REQUEST_V2, +#ifdef HAVE_RPK + TLSX_CLIENT_CERTIFICATE_TYPE = TLSXT_CLIENT_CERTIFICATE, + TLSX_SERVER_CERTIFICATE_TYPE = TLSXT_SERVER_CERTIFICATE, #endif - TLSX_APPLICATION_LAYER_PROTOCOL = 0x0010, /* a.k.a. ALPN */ - TLSX_STATUS_REQUEST_V2 = 0x0011, /* a.k.a. OCSP stapling v2 */ #if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY) - TLSX_ENCRYPT_THEN_MAC = 0x0016, /* RFC 7366 */ + TLSX_ENCRYPT_THEN_MAC = TLSXT_ENCRYPT_THEN_MAC, #endif - TLSX_EXTENDED_MASTER_SECRET = 0x0017, /* HELLO_EXT_EXTMS */ - TLSX_SESSION_TICKET = 0x0023, + TLSX_EXTENDED_MASTER_SECRET = TLSXT_EXTENDED_MASTER_SECRET, + TLSX_SESSION_TICKET = TLSXT_SESSION_TICKET, #ifdef WOLFSSL_TLS13 #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) - TLSX_PRE_SHARED_KEY = 0x0029, + TLSX_PRE_SHARED_KEY = TLSXT_PRE_SHARED_KEY, #endif #ifdef WOLFSSL_EARLY_DATA - TLSX_EARLY_DATA = 0x002a, + TLSX_EARLY_DATA = TLSXT_EARLY_DATA, #endif - TLSX_SUPPORTED_VERSIONS = 0x002b, + TLSX_SUPPORTED_VERSIONS = TLSXT_SUPPORTED_VERSIONS, #ifdef WOLFSSL_SEND_HRR_COOKIE - TLSX_COOKIE = 0x002c, + TLSX_COOKIE = TLSXT_COOKIE, #endif #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) - TLSX_PSK_KEY_EXCHANGE_MODES = 0x002d, + TLSX_PSK_KEY_EXCHANGE_MODES = TLSXT_PSK_KEY_EXCHANGE_MODES, + #endif + #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_CA_NAMES) + TLSX_CERTIFICATE_AUTHORITIES = TLSXT_CERTIFICATE_AUTHORITIES, #endif #ifdef WOLFSSL_POST_HANDSHAKE_AUTH - TLSX_POST_HANDSHAKE_AUTH = 0x0031, + TLSX_POST_HANDSHAKE_AUTH = TLSXT_POST_HANDSHAKE_AUTH, #endif #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG) - TLSX_SIGNATURE_ALGORITHMS_CERT = 0x0032, + TLSX_SIGNATURE_ALGORITHMS_CERT = TLSXT_SIGNATURE_ALGORITHMS_CERT, #endif - TLSX_KEY_SHARE = 0x0033, + TLSX_KEY_SHARE = TLSXT_KEY_SHARE, #if defined(WOLFSSL_DTLS_CID) - TLSX_CONNECTION_ID = 0x0036, + TLSX_CONNECTION_ID = TLSXT_CONNECTION_ID, #endif /* defined(WOLFSSL_DTLS_CID) */ #ifdef WOLFSSL_QUIC - TLSX_KEY_QUIC_TP_PARAMS = 0x0039, /* RFC 9001, ch. 8.2 */ + TLSX_KEY_QUIC_TP_PARAMS = TLSXT_KEY_QUIC_TP_PARAMS, + #endif + #ifdef HAVE_ECH + TLSX_ECH = TLSXT_ECH, #endif #endif - TLSX_RENEGOTIATION_INFO = 0xff01, -#ifdef WOLFSSL_QUIC - TLSX_KEY_QUIC_TP_PARAMS_DRAFT = 0xffa5, /* from draft-ietf-quic-tls-27 */ +#if defined(WOLFSSL_TLS13) && defined(WOLFSSL_DUAL_ALG_CERTS) + TLSX_CKS = TLSXT_CKS, #endif -#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) - TLSX_ECH = 0xfe0d, /* from draft-ietf-tls-esni-13 */ + TLSX_RENEGOTIATION_INFO = TLSXT_RENEGOTIATION_INFO, +#ifdef WOLFSSL_QUIC + TLSX_KEY_QUIC_TP_PARAMS_DRAFT = TLSXT_KEY_QUIC_TP_PARAMS_DRAFT, #endif } TLSX_Type; +/* TLS Certificate type defined RFC7250 + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#tls-extensiontype-values-3 + */ +#if defined(HAVE_RPK) +typedef struct RpkConfig { + /* user's preference */ + byte preferred_ClientCertTypeCnt; + byte preferred_ClientCertTypes[MAX_CLIENT_CERT_TYPE_CNT]; + byte preferred_ServerCertTypeCnt; + byte preferred_ServerCertTypes[MAX_CLIENT_CERT_TYPE_CNT]; + /* reflect to client_certificate_type extension in xxxHello */ +} RpkConfig; + +typedef struct RpkState { + byte sending_ClientCertTypeCnt; + byte sending_ClientCertTypes[MAX_CLIENT_CERT_TYPE_CNT]; + /* reflect to server_certificate_type extension in xxxHello */ + byte sending_ServerCertTypeCnt; + byte sending_ServerCertTypes[MAX_SERVER_CERT_TYPE_CNT]; + /* client_certificate_type extension in received yyyHello */ + byte received_ClientCertTypeCnt; + byte received_ClientCertTypes[MAX_CLIENT_CERT_TYPE_CNT]; + /* server_certificate_type extension in received yyyHello */ + byte received_ServerCertTypeCnt; + byte received_ServerCertTypes[MAX_SERVER_CERT_TYPE_CNT]; + /* set if Raw-public-key cert is loaded as own certificate */ + int isRPKLoaded; +} RpkState; +#endif /* HAVE_RPK */ + #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) typedef enum { @@ -2802,9 +3040,9 @@ #if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_CLIENT) WOLFSSL_LOCAL int TLSX_GetRequestSize(WOLFSSL* ssl, byte msgType, - word16* pLength); + word32* pLength); WOLFSSL_LOCAL int TLSX_WriteRequest(WOLFSSL* ssl, byte* output, - byte msgType, word16* pOffset); + byte msgType, word32* pOffset); #endif #if defined(WOLFSSL_TLS13) || !defined(NO_WOLFSSL_SERVER) @@ -2860,7 +3098,7 @@ word16 size, void* heap); WOLFSSL_LOCAL byte TLSX_SNI_Status(TLSX* extensions, byte type); WOLFSSL_LOCAL word16 TLSX_SNI_GetRequest(TLSX* extensions, byte type, - void** data); + void** data, byte ignoreStatus); #ifndef NO_WOLFSSL_SERVER WOLFSSL_LOCAL void TLSX_SNI_SetOptions(TLSX* extensions, byte type, @@ -2929,7 +3167,7 @@ union { OcspRequest ocsp; } request; -#if defined(WOLFSSL_TLS13) +#ifdef WOLFSSL_TLS13 buffer response; #endif } CertificateStatusRequest; @@ -2956,11 +3194,17 @@ OcspRequest ocsp[1 + MAX_CHAIN_DEPTH]; } request; struct CSRIv2* next; + Signer *pendingSigners; } CertificateStatusRequestItemV2; WOLFSSL_LOCAL int TLSX_UseCertificateStatusRequestV2(TLSX** extensions, byte status_type, byte options, void* heap, int devId); #ifndef NO_CERTS +WOLFSSL_LOCAL int TLSX_CSR2_IsMulti(TLSX *extensions); +WOLFSSL_LOCAL int TLSX_CSR2_AddPendingSigner(TLSX *extensions, Signer *s); +WOLFSSL_LOCAL Signer* TLSX_CSR2_GetPendingSigners(TLSX *extensions); +WOLFSSL_LOCAL int TLSX_CSR2_ClearPendingCA(WOLFSSL *ssl); +WOLFSSL_LOCAL int TLSX_CSR2_MergePendingCA(WOLFSSL* ssl); WOLFSSL_LOCAL int TLSX_CSR2_InitRequests(TLSX* extensions, DecodedCert* cert, byte isPeer, void* heap); #endif @@ -3084,6 +3328,10 @@ #ifdef WOLFSSL_TICKET_HAVE_ID byte id[ID_LEN]; #endif +#ifdef OPENSSL_EXTRA + byte sessionCtxSz; /* sessionCtx length */ + byte sessionCtx[ID_LEN]; /* app specific context id */ +#endif /* OPENSSL_EXTRA */ } InternalTicket; #ifndef WOLFSSL_TICKET_EXTRA_PADDING_SZ @@ -3181,8 +3429,9 @@ word32 keyLen; /* Key size (bytes) */ byte* pubKey; /* Public key */ word32 pubKeyLen; /* Public key length */ -#if !defined(NO_DH) || defined(HAVE_PQC) +#if !defined(NO_DH) || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) byte* privKey; /* Private key - DH and PQ KEMs only */ + word32 privKeyLen;/* Only for PQ KEMs. */ #endif #ifdef WOLFSSL_ASYNC_CRYPT int lastRet; @@ -3194,10 +3443,11 @@ word16 len, byte* data, KeyShareEntry **kse, TLSX** extensions); WOLFSSL_LOCAL int TLSX_KeyShare_Empty(WOLFSSL* ssl); WOLFSSL_LOCAL int TLSX_KeyShare_SetSupported(const WOLFSSL* ssl, - TLSX** extensions); + TLSX** extensions); WOLFSSL_LOCAL int TLSX_KeyShare_GenKey(WOLFSSL *ssl, KeyShareEntry *kse); WOLFSSL_LOCAL int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions, - KeyShareEntry** kse, byte* searched); + byte cipherSuite0, byte cipherSuite, KeyShareEntry** kse, + byte* searched); WOLFSSL_LOCAL int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE); WOLFSSL_LOCAL int TLSX_KeyShare_Establish(WOLFSSL* ssl, int* doHelloRetry); WOLFSSL_LOCAL int TLSX_KeyShare_DeriveSecret(WOLFSSL* sclientKSEclientKSEsl); @@ -3205,8 +3455,11 @@ word16 length, byte msgType); WOLFSSL_LOCAL int TLSX_KeyShare_Parse_ClientHello(const WOLFSSL* ssl, const byte* input, word16 length, TLSX** extensions); - - +#ifdef WOLFSSL_DUAL_ALG_CERTS +WOLFSSL_LOCAL int TLSX_CKS_Parse(WOLFSSL* ssl, byte* input, + word16 length, TLSX** extensions); +WOLFSSL_LOCAL int TLSX_CKS_Set(WOLFSSL* ssl, TLSX** extensions); +#endif #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK) enum PskDecryptReturn { @@ -3369,8 +3622,8 @@ DerBuffer* certificate; DerBuffer* certChain; /* chain after self, in DER, with leading size for each cert */ - #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY) - WOLF_STACK_OF(WOLFSSL_X509_NAME)* ca_names; + #ifndef WOLFSSL_NO_CA_NAMES + WOLF_STACK_OF(WOLFSSL_X509_NAME)* client_ca_names; #endif #ifdef OPENSSL_EXTRA WOLF_STACK_OF(WOLFSSL_X509)* x509Chain; @@ -3382,11 +3635,26 @@ int certChainCnt; #endif DerBuffer* privateKey; - byte privateKeyType:6; +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + DerBuffer* privateKeyMask; /* Mask of private key DER. */ +#endif + byte privateKeyType; byte privateKeyId:1; byte privateKeyLabel:1; int privateKeySz; int privateKeyDevId; + +#ifdef WOLFSSL_DUAL_ALG_CERTS + DerBuffer* altPrivateKey; +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + DerBuffer* altPrivateKeyMask; /* Mask of alt private key DER. */ +#endif + byte altPrivateKeyType; + byte altPrivateKeyId:1; + byte altPrivateKeyLabel:1; + int altPrivateKeySz; + int altPrivateKeyDevId; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #ifdef OPENSSL_ALL WOLFSSL_EVP_PKEY* privateKeyPKey; #endif @@ -3412,7 +3680,7 @@ byte sendVerify:2; /* for client side (can not be single bit) */ byte haveRSA:1; /* RSA available */ byte haveECC:1; /* ECC available */ - byte haveDH:1; /* server DH parms set by user */ + byte haveDH:1; /* server DH params set by user */ byte haveECDSAsig:1; /* server cert signed w/ ECDSA */ byte haveFalconSig:1; /* server cert signed w/ Falcon */ byte haveDilithiumSig:1;/* server cert signed w/ Dilithium */ @@ -3468,7 +3736,10 @@ #endif word16 minProto:1; /* sets min to min available */ word16 maxProto:1; /* sets max to max available */ - +#if defined(HAVE_RPK) + RpkConfig rpkConfig; + RpkState rpkState; +#endif /* HAVE_RPK */ #ifdef WOLFSSL_SRTP word16 dtlsSrtpProfiles; /* DTLS-with-SRTP mode * (list of selected profiles - up to 16) */ @@ -3491,19 +3762,23 @@ #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) short minEccKeySz; /* minimum ECC key size */ #endif -#ifdef HAVE_PQC +#ifdef HAVE_FALCON short minFalconKeySz; /* minimum Falcon key size */ +#endif +#ifdef HAVE_DILITHIUM short minDilithiumKeySz;/* minimum Dilithium key size */ #endif unsigned long mask; /* store SSL_OP_ flags */ #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL) word32 disabledCurves; /* curves disabled by user */ #endif -#ifdef OPENSSL_EXTRA +#ifdef WOLFSSL_SESSION_ID_CTX byte sessionCtx[ID_LEN]; /* app session context ID */ + byte sessionCtxSz; +#endif +#ifdef OPENSSL_EXTRA const unsigned char *alpn_cli_protos;/* ALPN client protocol list */ unsigned int alpn_cli_protos_len; - byte sessionCtxSz; byte cbioFlag; /* WOLFSSL_CBIO_RECV/SEND: CBIORecv/Send is set */ CallbackInfoState* CBIS; /* used to get info about SSL state */ WOLFSSL_X509_VERIFY_PARAM* param; /* verification parameters*/ @@ -3567,7 +3842,7 @@ word32 maxEarlyDataSz; #endif #ifdef HAVE_ANON - byte haveAnon; /* User wants to allow Anon suites */ + byte useAnon; /* User wants to allow Anon suites */ #endif /* HAVE_ANON */ #ifdef WOLFSSL_ENCRYPTED_KEYS wc_pem_password_cb* passwd_cb; @@ -3755,6 +4030,13 @@ #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) WOLFSSL_EchConfig* echConfigs; #endif +#if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) + byte doAppleNativeCertValidationFlag:1; +#endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + byte *sigSpec; + word16 sigSpecSz; +#endif }; WOLFSSL_LOCAL @@ -3778,6 +4060,7 @@ word32 inSz, word16 sz); #ifndef NO_CERTS + WOLFSSL_LOCAL int AddSigner(WOLFSSL_CERT_MANAGER* cm, Signer *s); WOLFSSL_LOCAL int AddCA(WOLFSSL_CERT_MANAGER* cm, DerBuffer** pDer, int type, int verify); WOLFSSL_LOCAL @@ -3824,6 +4107,17 @@ ecc_static_diffie_hellman_kea /* for verify suite only */ }; +/* Used with InitSuitesHashSigAlgo */ +#define SIG_ECDSA 0x01 +#define SIG_RSA 0x02 +#define SIG_SM2 0x04 +#define SIG_FALCON 0x08 +#define SIG_DILITHIUM 0x10 +#define SIG_ANON 0x20 +/* SIG_ANON is omitted by default */ +#define SIG_ALL (SIG_ECDSA | SIG_RSA | SIG_SM2 | SIG_FALCON | \ + SIG_DILITHIUM) + /* Supported Authentication Schemes */ enum SignatureAlgorithm { anonymous_sa_algo = 0, @@ -3839,6 +4133,7 @@ dilithium_level2_sa_algo = 14, dilithium_level3_sa_algo = 15, dilithium_level5_sa_algo = 16, + sm2_sa_algo = 17, invalid_sa_algo = 255 }; @@ -3854,6 +4149,18 @@ pss_sha512 = 0x0b, }; +#ifdef WOLFSSL_SM2 + /* Default SM2 signature ID. */ + #define TLS12_SM2_SIG_ID ((byte*)"1234567812345678") + /* Length of default SM2 signature ID. */ + #define TLS12_SM2_SIG_ID_SZ 16 + + /* https://www.rfc-editor.org/rfc/rfc8998.html#name-sm2-signature-scheme */ + /* ID to use when signing/verifying TLS v1.3 data. */ + #define TLS13_SM2_SIG_ID ((byte*)"TLSv1.3+GM+Cipher+Suite") + /* Length of ID to use when signing/verifying TLS v1.3 data. */ + #define TLS13_SM2_SIG_ID_SZ 23 +#endif /* Supported ECC Curve Types */ enum EccCurves { @@ -3885,8 +4192,8 @@ #endif -#if defined(BUILD_AES) || defined(BUILD_AESGCM) || (defined(HAVE_CHACHA) && \ - defined(HAVE_POLY1305)) || defined(WOLFSSL_TLS13) +#if defined(BUILD_AES) || defined(BUILD_AESGCM) || defined(HAVE_ARIA) || \ + (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(WOLFSSL_TLS13) #define CIPHER_NONCE #endif @@ -3915,10 +4222,12 @@ #endif #if defined(BUILD_AES) || defined(BUILD_AESGCM) Aes* aes; - #if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && \ - !defined(WOLFSSL_NO_TLS12) - byte* additional; - #endif +#endif +#if (defined(BUILD_AESGCM) || defined(HAVE_AESCCM)) && !defined(WOLFSSL_NO_TLS12) + byte* additional; +#endif +#ifdef HAVE_ARIA + wc_Aria* aria; #endif #ifdef CIPHER_NONCE byte* nonce; @@ -3929,6 +4238,9 @@ #ifdef HAVE_CHACHA ChaCha* chacha; #endif +#ifdef WOLFSSL_SM4 + wc_Sm4* sm4; +#endif #if defined(WOLFSSL_TLS13) && defined(HAVE_NULL_CIPHER) && !defined(NO_HMAC) Hmac* hmac; #endif @@ -3975,7 +4287,8 @@ #if !defined(NO_MD5) && !defined(NO_OLD_TLS) byte md5[WC_MD5_DIGEST_SIZE]; #endif - #if !defined(NO_SHA) + #if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ + defined(WOLFSSL_ALLOW_TLS_SHA1)) byte sha[WC_SHA_DIGEST_SIZE]; #endif #ifndef NO_SHA256 @@ -3987,6 +4300,9 @@ #ifdef WOLFSSL_SHA512 byte sha512[WC_SHA512_DIGEST_SIZE]; #endif + #ifdef WOLFSSL_SM3 + byte sm3[WC_SM3_DIGEST_SIZE]; + #endif } Hashes; WOLFSSL_LOCAL int BuildCertHashes(const WOLFSSL* ssl, Hashes* hashes); @@ -4002,6 +4318,9 @@ #ifdef WOLFSSL_SHA512 wc_Sha512 sha512; #endif +#ifdef WOLFSSL_SM3 + wc_Sm3 sm3; +#endif } Digest; #endif @@ -4123,10 +4442,10 @@ word16 idLen; /* serverID length */ byte serverID[SERVER_ID_LEN]; /* for easier client lookup */ #endif -#ifdef OPENSSL_EXTRA +#ifdef WOLFSSL_SESSION_ID_CTX byte sessionCtxSz; /* sessionCtx length */ byte sessionCtx[ID_LEN]; /* app specific context id */ -#endif /* OPENSSL_EXTRA */ +#endif /* WOLFSSL_SESSION_ID_CTX */ #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) byte peerVerifyRet; /* cert verify error */ #endif @@ -4163,6 +4482,10 @@ #ifdef HAVE_EX_DATA WOLFSSL_CRYPTO_EX_DATA ex_data; #endif +#ifdef HAVE_MAX_FRAGMENT + byte mfl; /* max fragment length negotiated i.e. + * WOLFSSL_MFL_2_8 (6) */ +#endif byte isSetup:1; }; @@ -4289,7 +4612,10 @@ when got WANT_WRITE */ byte weOwnCert; /* SSL own cert flag */ byte weOwnCertChain; /* SSL own cert chain flag */ - byte weOwnKey; /* SSL own key flag */ + byte weOwnKey; /* SSL own key flag */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + byte weOwnAltKey; /* SSL own alt key flag */ +#endif byte weOwnDH; /* SSL own dh (p,g) flag */ #ifndef NO_DH buffer serverDH_P; /* WOLFSSL_CTX owns, unless we own */ @@ -4301,11 +4627,25 @@ #ifndef NO_CERTS DerBuffer* certificate; /* WOLFSSL_CTX owns, unless we own */ DerBuffer* key; /* WOLFSSL_CTX owns, unless we own */ - byte keyType:6; /* Type of key: RSA, ECC, Ed25519 */ +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + DerBuffer* keyMask; /* Mask of private key DER. */ +#endif + byte keyType; /* Type of key */ byte keyId:1; /* Key data is an id not data */ byte keyLabel:1; /* Key data is a label not data */ int keySz; /* Size of RSA key */ int keyDevId; /* Device Id for key */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + DerBuffer* altKey; /* WOLFSSL_CTX owns, unless we own */ +#ifdef WOLFSSL_BLIND_PRIVATE_KEY + DerBuffer* altKeyMask; /* Mask of alt private key DER. */ +#endif + byte altKeyType; /* Type of alt key */ + byte altKeyId:1; /* Key data is an id not data */ + byte altKeyLabel:1; /* Key data is a label not data */ + int altKeySz; /* Size of alt key */ + int altKeyDevId; /* Device Id for alt key */ +#endif DerBuffer* certChain; /* WOLFSSL_CTX owns, unless we own */ /* chain after self, in DER, with leading size for each cert */ #ifdef WOLFSSL_TLS13 @@ -4407,13 +4747,19 @@ word16 failNoCertxPSK:1; /* fail for no cert except with PSK */ word16 downgrade:1; /* allow downgrade of versions */ word16 resuming:1; +#ifdef HAVE_SECURE_RENEGOTIATION + word16 resumed:1; /* resuming may be reset on SCR */ +#endif word16 isPSK:1; word16 haveSessionId:1; /* server may not send */ word16 tls:1; /* using TLS ? */ word16 tls1_1:1; /* using TLSv1.1+ ? */ word16 tls1_3:1; /* using TLSv1.3+ ? */ + word16 seenUnifiedHdr:1; /* received msg with unified header */ word16 dtls:1; /* using datagrams ? */ +#ifdef WOLFSSL_DTLS word16 dtlsStateful:1; /* allow stateful processing ? */ +#endif word16 connReset:1; /* has the peer reset */ word16 isClosed:1; /* if we consider conn closed */ word16 closeNotify:1; /* we've received a close notify */ @@ -4422,7 +4768,7 @@ word16 usingCompression:1; /* are we using compression */ word16 haveRSA:1; /* RSA available */ word16 haveECC:1; /* ECC available */ - word16 haveDH:1; /* server DH parms set by user */ + word16 haveDH:1; /* server DH params set by user */ word16 haveECDSAsig:1; /* server ECDSA signed cert */ word16 haveStaticECC:1; /* static server ECC private key */ word16 haveFalconSig:1; /* server Falcon signed cert */ @@ -4449,7 +4795,7 @@ #ifdef HAVE_POLY1305 word16 oldPoly:1; /* set when to use old rfc way of poly*/ #endif - word16 haveAnon:1; /* User wants to allow Anon suites */ + word16 useAnon:1; /* User wants to allow Anon suites */ #ifdef HAVE_SESSION_TICKET word16 createTicket:1; /* Server to create new Ticket */ word16 useTicket:1; /* Use Ticket not session cache */ @@ -4497,7 +4843,8 @@ word16 sentChangeCipher:1; /* Change Cipher Spec sent */ #endif #if !defined(WOLFSSL_NO_CLIENT_AUTH) && \ - ((defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ + ((defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3)) || \ + (defined(HAVE_ED25519) && !defined(NO_ED25519_CLIENT_AUTH)) || \ (defined(HAVE_ED448) && !defined(NO_ED448_CLIENT_AUTH))) word16 cacheMessages:1; /* Cache messages for sign/verify */ #endif @@ -4523,6 +4870,12 @@ #ifdef WOLFSSL_DTLS13 word16 dtls13SendMoreAcks:1; /* Send more acks during the * handshake process */ +#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME + word16 dtls13NoHrrOnResume:1; +#endif +#ifdef WOLFSSL_DTLS_CH_FRAG + word16 dtls13ChFrag:1; +#endif #endif #ifdef WOLFSSL_TLS13 word16 tls13MiddleBoxCompat:1; /* TLSv1.3 middlebox compatibility */ @@ -4536,6 +4889,13 @@ #ifdef WOLFSSL_SEND_HRR_COOKIE word16 cookieGood:1; #endif +#if defined(HAVE_DANE) + word16 useDANE:1; +#endif /* HAVE_DANE */ +#if defined(HAVE_RPK) + RpkConfig rpkConfig; + RpkState rpkState; +#endif /* HAVE_RPK */ /* need full byte values for this section */ byte processReply; /* nonblocking resume */ @@ -4543,6 +4903,8 @@ byte cipherSuite; /* second byte, actual suite */ byte hashAlgo; /* selected hash algorithm */ byte sigAlgo; /* selected sig algorithm */ + byte peerHashAlgo; /* peer's chosen hash algo */ + byte peerSigAlgo; /* peer's chosen sig algo */ byte serverState; byte clientState; byte handShakeState; @@ -4567,8 +4929,10 @@ #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) short minEccKeySz; /* minimum ECC key size */ #endif -#if defined(HAVE_PQC) +#if defined(HAVE_FALCON) short minFalconKeySz; /* minimum Falcon key size */ +#endif +#if defined(HAVE_DILITHIUM) short minDilithiumKeySz;/* minimum Dilithium key size */ #endif #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) @@ -4613,8 +4977,8 @@ !defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION) byte tsip_masterSecret[TSIP_TLS_MASTERSECRET_SIZE]; #endif -#if defined(WOLFSSL_RENESAS_SCEPROTECT) - byte sce_masterSecret[SCE_TLS_MASTERSECRET_SIZE]; +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) + byte fspsm_masterSecret[FSPSM_TLS_MASTERSECRET_SIZE]; #endif #ifdef WOLFSSL_DTLS byte cookie[MAX_COOKIE_LEN]; @@ -4711,7 +5075,7 @@ WOLFSSL_X509_NAME_ENTRY entry[MAX_NAME_ENTRIES]; /* all entries i.e. CN */ WOLFSSL_X509* x509; /* x509 that struct belongs to */ #endif /* OPENSSL_EXTRA */ -#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(HAVE_LIGHTY) +#ifndef WOLFSSL_NO_CA_NAMES byte raw[ASN_NAME_MAX]; int rawLen; @@ -4762,9 +5126,9 @@ int pubKeyOID; DNS_entry* altNamesNext; /* hint for retrieval */ #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) || \ - defined(HAVE_PQC) + defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) word32 pkCurveOID; -#endif /* HAVE_ECC || HAVE_PQC */ +#endif #ifndef NO_CERTS DerBuffer* derCert; /* may need */ #endif @@ -4864,6 +5228,17 @@ byte notBeforeData[CTC_DATE_SIZE]; byte notAfterData[CTC_DATE_SIZE]; #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + /* Subject Alternative Public Key Info */ + byte *sapkiDer; + int sapkiLen; + /* Alternative Signature Algorithm */ + byte *altSigAlgDer; + int altSigAlgLen; + /* Alternative Signature Value */ + byte *altSigValDer; + int altSigValLen; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ }; @@ -4919,6 +5294,7 @@ byte type; byte fragBucketListCount; byte ready:1; + byte encrypted:1; } DtlsMsg; @@ -4961,7 +5337,8 @@ typedef struct HS_Hashes { Hashes verifyHashes; Hashes certHashes; /* for cert verify */ -#ifndef NO_SHA +#if !defined(NO_SHA) && (!defined(NO_OLD_TLS) || \ + defined(WOLFSSL_ALLOW_TLS_SHA1)) wc_Sha hashSha; /* sha hash of handshake msgs */ #endif #if !defined(NO_MD5) && !defined(NO_OLD_TLS) @@ -4976,8 +5353,12 @@ #ifdef WOLFSSL_SHA512 wc_Sha512 hashSha512; /* sha512 hash of handshake msgs */ #endif -#if (defined(HAVE_ED25519) || defined(HAVE_ED448)) && \ - !defined(WOLFSSL_NO_CLIENT_AUTH) +#ifdef WOLFSSL_SM3 + wc_Sm3 hashSm3; /* sm3 hash of handshake msgs */ +#endif +#if (defined(HAVE_ED25519) || defined(HAVE_ED448) || \ + (defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3))) && \ + !defined(WOLFSSL_NO_CLIENT_AUTH) byte* messages; /* handshake messages */ int length; /* length of handshake messages' data */ int prevLen; /* length of messages but last */ @@ -5144,7 +5525,7 @@ typedef struct CIDInfo CIDInfo; #endif /* WOLFSSL_DTLS_CID */ -/* The idea is to re-use the context suites object whenever possible to save +/* The idea is to reuse the context suites object whenever possible to save * space. */ #define WOLFSSL_SUITES(ssl) \ ((const Suites*) ((ssl)->suites != NULL ? \ @@ -5154,10 +5535,16 @@ /* wolfSSL ssl type */ struct WOLFSSL { WOLFSSL_CTX* ctx; +#if defined(WOLFSSL_HAPROXY) + WOLFSSL_CTX* initial_ctx; /* preserve session key materials */ +#endif Suites* suites; /* Only need during handshake. Can be NULL when * re-using the context's object. When WOLFSSL * object needs separate instance of suites use * AllocateSuites(). */ +#ifdef OPENSSL_EXTRA + const Suites* clSuites; +#endif #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) WOLF_STACK_OF(WOLFSSL_CIPHER)* suitesStack; /* stack of available cipher * suites */ @@ -5198,13 +5585,13 @@ WOLFSSL_HEAP_HINT heap_hint; #endif #if defined(WOLFSSL_DTLS) && !defined(NO_WOLFSSL_SERVER) - ClientHelloGoodCb chGoodCb; /* notify user we parsed a verified - * ClientHello */ - void* chGoodCtx; /* user ClientHello cb context */ + ClientHelloGoodCb chGoodCb; /* notify user we parsed a verified + * ClientHello that passed basic tests */ + void* chGoodCtx; /* user ClientHello cb context */ #endif #ifndef NO_HANDSHAKE_DONE_CB - HandShakeDoneCb hsDoneCb; /* notify user handshake done */ - void* hsDoneCtx; /* user handshake cb context */ + HandShakeDoneCb hsDoneCb; /* notify user handshake done */ + void* hsDoneCtx; /* user handshake cb context */ #endif #ifdef WOLFSSL_ASYNC_IO #ifdef WOLFSSL_ASYNC_CRYPT @@ -5218,6 +5605,11 @@ * allocated from heap */ word32 hsType; /* Type of Handshake key (hsKey) */ WOLFSSL_CIPHER cipher; +#ifdef WOLFSSL_DUAL_ALG_CERTS + void* hsAltKey; /* Handshake key (dilithium, falcon) + * allocated from heap */ + word32 hsAltType; /* Type of Handshake key (hsAltKey) */ +#endif #ifndef WOLFSSL_AEAD_ONLY hmacfp hmac; #endif @@ -5238,6 +5630,7 @@ word32 timeout; /* session timeout */ word32 fragOffset; /* fragment offset */ word16 curSize; + word32 curStartIdx; byte verifyDepth; RecordLayerHeader curRL; MsgsReceived msgsReceived; /* peer messages received */ @@ -5246,31 +5639,34 @@ CipherSpecs specs; Keys keys; Options options; +#ifdef WOLFSSL_SESSION_ID_CTX + byte sessionCtx[ID_LEN]; /* app session context ID */ + byte sessionCtxSz; /* size of sessionCtx stored */ +#endif #ifdef OPENSSL_EXTRA CallbackInfoState* CBIS; /* used to get info about SSL state */ int cbmode; /* read or write on info callback */ int cbtype; /* event type in info callback */ WOLFSSL_BIO* biord; /* socket bio read to free/close */ WOLFSSL_BIO* biowr; /* socket bio write to free/close */ - byte sessionCtx[ID_LEN]; /* app session context ID */ WOLFSSL_X509_VERIFY_PARAM* param; /* verification parameters*/ #endif #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL) word32 disabledCurves; /* curves disabled by user */ #endif -#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) +#if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ + defined(OPENSSL_ALL) unsigned long peerVerifyRet; #endif #ifdef OPENSSL_EXTRA byte readAhead; - byte sessionCtxSz; /* size of sessionCtx stored */ #ifdef HAVE_PK_CALLBACKS void* loggingCtx; /* logging callback argument */ #endif #endif /* OPENSSL_EXTRA */ #ifndef NO_RSA RsaKey* peerRsaKey; -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) void* RenesasUserCtx; byte* peerSceTsipEncRsaKeyIndex; #endif @@ -5325,9 +5721,11 @@ curve448_key* peerX448Key; byte peerX448KeyPresent; #endif -#ifdef HAVE_PQC +#ifdef HAVE_FALCON falcon_key* peerFalconKey; byte peerFalconKeyPresent; +#endif +#ifdef HAVE_DILITHIUM dilithium_key* peerDilithiumKey; byte peerDilithiumKeyPresent; #endif @@ -5349,7 +5747,6 @@ DtlsMsg* dtls_tx_msg; DtlsMsg* dtls_rx_msg_list; void* IOCB_CookieCtx; /* gen cookie ctx */ - word32 dtls_expected_rx; #ifdef WOLFSSL_SESSION_EXPORT wc_dtls_export dtls_export; /* export function for session */ #endif @@ -5556,6 +5953,10 @@ #ifdef HAVE_SECRET_CALLBACK SessionSecretCb sessionSecretCb; void* sessionSecretCtx; + TicketParseCb ticketParseCb; + void* ticketParseCtx; + TlsSecretCb tlsSecretCb; + void* tlsSecretCtx; #ifdef WOLFSSL_TLS13 Tls13SecretCb tls13SecretCb; void* tls13SecretCtx; @@ -5575,9 +5976,6 @@ word32 earlyDataSz; byte earlyDataStatus; #endif -#ifdef OPENSSL_ALL - long verifyCallbackResult; -#endif #if defined(OPENSSL_EXTRA) WOLFSSL_STACK* supportedCiphers; /* Used in wolfSSL_get_ciphers_compat */ WOLFSSL_STACK* peerCertChain; /* Used in wolfSSL_get_peer_cert_chain */ @@ -5602,8 +6000,8 @@ byte clientFinished_len; byte serverFinished_len; #endif -#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA) || defined(HAVE_LIGHTY) - WOLF_STACK_OF(WOLFSSL_X509_NAME)* ca_names; +#ifndef WOLFSSL_NO_CA_NAMES + WOLF_STACK_OF(WOLFSSL_X509_NAME)* client_ca_names; #endif #if defined(WOLFSSL_IOTSAFE) && defined(HAVE_PK_CALLBACKS) IOTSAFE iotsafe; @@ -5635,6 +6033,16 @@ #if defined(WOLFSSL_TLS13) && defined(HAVE_ECH) WOLFSSL_EchConfig* echConfigs; #endif + +#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_KEYLOGFILE) + SSLSnifferSecretCb snifferSecretCb; +#endif /* WOLFSSL_SNIFFER && WOLFSSL_SNIFFER_KEYLOGFILE */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + byte *sigSpec; /* This pointer never owns the memory. */ + word16 sigSpecSz; + byte *peerSigSpec; /* This pointer always owns the memory. */ + word16 peerSigSpecSz; +#endif }; /* @@ -5659,16 +6067,24 @@ * Always use SSL specific objects when available and revert to CTX otherwise. */ #ifdef WOLFSSL_LOCAL_X509_STORE -#define SSL_CM(ssl) ((ssl)->x509_store_pt ? (ssl)->x509_store_pt->cm : (ssl)->ctx->cm) +#define SSL_CM(ssl) ((ssl)->x509_store_pt ? (ssl)->x509_store_pt->cm : \ + ((ssl)->ctx->x509_store_pt ? (ssl)->ctx->x509_store_pt->cm : \ + (ssl)->ctx->cm)) #define SSL_STORE(ssl) ((ssl)->x509_store_pt ? (ssl)->x509_store_pt : \ ((ssl)->ctx->x509_store_pt ? (ssl)->ctx->x509_store_pt : \ &(ssl)->ctx->x509_store)) +#define CTX_STORE(ctx) ((ctx)->x509_store_pt ? (ctx)->x509_store_pt : \ + &(ctx)->x509_store) #else #define SSL_CM(ssl) (ssl)->ctx->cm #endif - -#define SSL_CA_NAMES(ssl) ((ssl)->ca_names != NULL ? (ssl)->ca_names : \ - (ssl)->ctx->ca_names) +/* Issue warning when we are modifying the overall context CM */ +#define SSL_CM_WARNING(ssl) \ + do { \ + if (SSL_CM( (ssl) ) == (ssl)->ctx->cm) { \ + WOLFSSL_MSG("Modifying SSL_CTX CM not SSL specific CM"); \ + } \ + } while (0) WOLFSSL_LOCAL int SetSSL_CTX(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup); WOLFSSL_LOCAL int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup); @@ -5768,6 +6184,16 @@ PROVISION_CLIENT_SERVER = 3 }; +/* cipher requirements */ +enum { + REQUIRES_RSA, + REQUIRES_DHE, + REQUIRES_ECC, + REQUIRES_ECC_STATIC, + REQUIRES_PSK, + REQUIRES_RSA_SIG, + REQUIRES_AEAD +}; static const byte kTlsClientStr[SIZEOF_SENDER+1] = { 0x43, 0x4C, 0x4E, 0x54, 0x00 }; /* CLNT */ static const byte kTlsServerStr[SIZEOF_SENDER+1] = { 0x53, 0x52, 0x56, 0x52, 0x00 }; /* SRVR */ @@ -5780,16 +6206,11 @@ int name_len; const char *name; int nid; + word16 curve; } WOLF_EC_NIST_NAME; extern const WOLF_EC_NIST_NAME kNistCurves[]; -/* This is the longest and shortest curve name in the kNistCurves list. Note we - * also have quantum-safe group names as well. */ -#define kNistCurves_MIN_NAME_LEN 5 -#ifdef HAVE_PQC -#define kNistCurves_MAX_NAME_LEN 32 -#else -#define kNistCurves_MAX_NAME_LEN 7 -#endif +WOLFSSL_LOCAL int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, + const char* names, byte curves_only); #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ /* internal functions */ @@ -5849,9 +6270,10 @@ WOLFSSL_LOCAL int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side); WOLFSSL_LOCAL int IsTLS(const WOLFSSL* ssl); +WOLFSSL_LOCAL int IsTLS_ex(const ProtocolVersion pv); WOLFSSL_LOCAL int IsAtLeastTLSv1_2(const WOLFSSL* ssl); WOLFSSL_LOCAL int IsAtLeastTLSv1_3(ProtocolVersion pv); -WOLFSSL_LOCAL int IsEncryptionOn(WOLFSSL* ssl, int isSend); +WOLFSSL_LOCAL int IsEncryptionOn(const WOLFSSL* ssl, int isSend); WOLFSSL_LOCAL int TLSv1_3_Capable(WOLFSSL* ssl); WOLFSSL_LOCAL void FreeHandshakeResources(WOLFSSL* ssl); @@ -5859,6 +6281,7 @@ WOLFSSL_LOCAL void ShrinkOutputBuffer(WOLFSSL* ssl); WOLFSSL_LOCAL byte* GetOutputBuffer(WOLFSSL* ssl); +WOLFSSL_LOCAL int CipherRequires(byte first, byte second, int requirement); WOLFSSL_LOCAL int VerifyClientSuite(word16 havePSK, byte cipherSuite0, byte cipherSuite); @@ -5877,9 +6300,15 @@ #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL) WOLFSSL_LOCAL int wolfSSL_curve_is_disabled(const WOLFSSL* ssl, - word16 named_curve); + word16 curve_id); #else -#define wolfSSL_curve_is_disabled(ssl, c) ((void)(ssl), (void)(c), 0) +static WC_INLINE int wolfSSL_curve_is_disabled(const WOLFSSL* ssl, + word16 curve_id) +{ + (void)ssl; + (void)curve_id; + return 0; +} #endif WOLFSSL_LOCAL WC_RNG* WOLFSSL_RSA_GetRNG(WOLFSSL_RSA *rsa, WC_RNG **tmpRNG, @@ -5917,6 +6346,14 @@ ecc_key* pub_key, byte* pubKeyDer, word32* pubKeySz, byte* out, word32* outlen, int side); #endif /* HAVE_ECC */ + #if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + WOLFSSL_LOCAL int Sm2wSm3Sign(WOLFSSL* ssl, const byte* id, word32 idSz, + const byte* in, word32 inSz, byte* out, word32* outSz, ecc_key* key, + DerBuffer* keyBufInfo); + WOLFSSL_LOCAL int Sm2wSm3Verify(WOLFSSL* ssl, const byte* id, + word32 idSz, const byte* in, word32 inSz, const byte* out, + word32 outSz, ecc_key* key, buffer* keyBufInfo); + #endif /* WOLFSSL_SM2 && WOLFSSL_SM3 */ #ifdef HAVE_ED25519 WOLFSSL_LOCAL int Ed25519CheckPubKey(WOLFSSL* ssl); WOLFSSL_LOCAL int Ed25519Sign(WOLFSSL* ssl, const byte* in, word32 inSz, @@ -5946,8 +6383,14 @@ DecodedCert* cert); #endif - WOLFSSL_LOCAL Signer* GetCA(void* cm, byte* hash); - #ifndef NO_SKID + #ifndef GetCA + WOLFSSL_LOCAL Signer* GetCA(void* vp, byte* hash); + #endif + #ifdef WOLFSSL_AKID_NAME + WOLFSSL_LOCAL Signer* GetCAByAKID(void* vp, const byte* issuer, + word32 issuerSz, const byte* serial, word32 serialSz); + #endif + #if !defined(NO_SKID) && !defined(GetCAByName) WOLFSSL_LOCAL Signer* GetCAByName(void* cm, byte* hash); #endif #endif /* !NO_CERTS */ @@ -5958,6 +6401,9 @@ WOLFSSL_LOCAL void FreeArrays(WOLFSSL* ssl, int keep); WOLFSSL_LOCAL int CheckAvailableSize(WOLFSSL *ssl, int size); WOLFSSL_LOCAL int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength); +WOLFSSL_LOCAL int MsgCheckEncryption(WOLFSSL* ssl, byte type, byte encrypted); +WOLFSSL_LOCAL int EarlySanityCheckMsgReceived(WOLFSSL* ssl, byte type, + word32 msgSz); #if !defined(NO_WOLFSSL_CLIENT) || !defined(WOLFSSL_NO_CLIENT_AUTH) WOLFSSL_LOCAL void DoCertFatalAlert(WOLFSSL* ssl, int ret); #endif @@ -5972,6 +6418,7 @@ WOLFSSL_LOCAL int cipherExtraData(WOLFSSL* ssl); #ifndef NO_WOLFSSL_CLIENT + WOLFSSL_LOCAL int HaveUniqueSessionObj(WOLFSSL* ssl); WOLFSSL_LOCAL int SendClientHello(WOLFSSL* ssl); WOLFSSL_LOCAL int DoHelloVerifyRequest(WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 size); @@ -5996,7 +6443,7 @@ WOLFSSL_LOCAL int DtlsMsgSet(DtlsMsg* msg, word32 seq, word16 epoch, const byte* data, byte type, word32 fragOffset, word32 fragSz, void* heap, - word32 totalLen); + word32 totalLen, byte encrypted); /* Use WOLFSSL_API to enable src/api.c testing */ WOLFSSL_API DtlsMsg* DtlsMsgFind(DtlsMsg* head, word16 epoch, word32 seq); @@ -6025,7 +6472,7 @@ #if !defined(NO_WOLFSSL_SERVER) WOLFSSL_LOCAL int DoClientHelloStateless(WOLFSSL* ssl, - const byte* input, word32* inOutIdx, word32 helloSz); + const byte* input, word32 helloSz, byte isFirstCHFrag, byte* tls13); #endif /* !defined(NO_WOLFSSL_SERVER) */ #endif /* WOLFSSL_DTLS */ @@ -6052,6 +6499,11 @@ WOLFSSL_LOCAL word32 LowResTimer(void); WOLFSSL_LOCAL int FindSuiteSSL(const WOLFSSL* ssl, byte* suite); +WOLFSSL_LOCAL int FindSuite(const Suites* suites, byte first, byte second); + +WOLFSSL_LOCAL void DecodeSigAlg(const byte* input, byte* hashAlgo, + byte* hsType); +WOLFSSL_LOCAL enum wc_HashType HashAlgoToType(int hashAlgo); #ifndef NO_CERTS WOLFSSL_LOCAL void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag, @@ -6125,10 +6577,8 @@ /* Set*Internal and Set*External functions */ WOLFSSL_LOCAL int SetDsaInternal(WOLFSSL_DSA* dsa); WOLFSSL_LOCAL int SetDsaExternal(WOLFSSL_DSA* dsa); -#ifndef HAVE_USER_RSA WOLFSSL_LOCAL int SetRsaExternal(WOLFSSL_RSA* rsa); WOLFSSL_LOCAL int SetRsaInternal(WOLFSSL_RSA* rsa); -#endif typedef enum elem_set { ELEMENT_P = 0x01, @@ -6231,6 +6681,7 @@ #ifdef WOLFSSL_DTLS WOLFSSL_API int wolfSSL_DtlsUpdateWindow(word16 cur_hi, word32 cur_lo, word16* next_hi, word32* next_lo, word32 *window); +WOLFSSL_LOCAL int DtlsUpdateWindow(WOLFSSL* ssl); WOLFSSL_LOCAL void DtlsResetState(WOLFSSL *ssl); WOLFSSL_LOCAL int DtlsIgnoreError(int err); WOLFSSL_LOCAL void DtlsSetSeqNumForReply(WOLFSSL* ssl); @@ -6294,9 +6745,12 @@ WOLFSSL_LOCAL int Dtls13HashClientHello(const WOLFSSL* ssl, byte* hash, int* hashSz, const byte* body, word32 length, CipherSpecs* specs); WOLFSSL_LOCAL void Dtls13FreeFsmResources(WOLFSSL* ssl); +WOLFSSL_LOCAL void Dtls13RtxFlushBuffered(WOLFSSL* ssl, + byte keepNewSessionTicket); WOLFSSL_LOCAL int Dtls13RtxTimeout(WOLFSSL* ssl); WOLFSSL_LOCAL int Dtls13ProcessBufferedMessages(WOLFSSL* ssl); WOLFSSL_LOCAL int Dtls13CheckAEADFailLimit(WOLFSSL* ssl); +WOLFSSL_LOCAL int Dtls13UpdateWindowRecordRecvd(WOLFSSL* ssl); #endif /* WOLFSSL_DTLS13 */ #ifdef WOLFSSL_STATIC_EPHEMERAL @@ -6351,7 +6805,7 @@ #endif #endif -#if !defined(NO_RSA) && !defined(HAVE_USER_RSA) +#if !defined(NO_RSA) WOLFSSL_LOCAL int wolfSSL_RSA_To_Der(WOLFSSL_RSA* rsa, byte** outBuf, int publicKey, void* heap); #endif @@ -6375,6 +6829,22 @@ #define WOLFSSL_IS_QUIC(s) 0 #endif /* WOLFSSL_QUIC (else) */ +#if defined(SHOW_SECRETS) && defined(WOLFSSL_SSLKEYLOGFILE) +WOLFSSL_LOCAL int tls13ShowSecrets(WOLFSSL* ssl, int id, const unsigned char* secret, + int secretSz, void* ctx); +#endif + +#if defined(SHOW_SECRETS) +WOLFSSL_LOCAL int tlsShowSecrets(WOLFSSL* ssl, void* secret, + int secretSz, void* ctx); +#endif + +/* Optional Pre-Master-Secret logging for Wireshark */ +#if !defined(NO_FILESYSTEM) && defined(WOLFSSL_SSLKEYLOGFILE) +#ifndef WOLFSSL_SSLKEYLOGFILE_OUTPUT + #define WOLFSSL_SSLKEYLOGFILE_OUTPUT "sslkeylog.log" +#endif +#endif #if defined(WOLFSSL_TLS13) && !defined(NO_PSK) WOLFSSL_LOCAL int FindPskSuite(const WOLFSSL* ssl, PreSharedKey* psk, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/ocsp.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/ocsp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/ocsp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/ocsp.h 2024-08-03 07:30:01.000000000 +0000 @@ -53,15 +53,19 @@ WOLFSSL_LOCAL int InitOCSP(WOLFSSL_OCSP* ocsp, WOLFSSL_CERT_MANAGER* cm); WOLFSSL_LOCAL void FreeOCSP(WOLFSSL_OCSP* ocsp, int dynamic); -WOLFSSL_LOCAL int CheckCertOCSP(WOLFSSL_OCSP* ocsp, DecodedCert* cert, - WOLFSSL_BUFFER_INFO* responseBuffer); +WOLFSSL_LOCAL int CheckCertOCSP(WOLFSSL_OCSP* ocsp, DecodedCert* cert); WOLFSSL_LOCAL int CheckCertOCSP_ex(WOLFSSL_OCSP* ocsp, DecodedCert* cert, - WOLFSSL_BUFFER_INFO* responseBuffer, WOLFSSL* ssl); + WOLFSSL* ssl); WOLFSSL_LOCAL int CheckOcspRequest(WOLFSSL_OCSP* ocsp, - OcspRequest* ocspRequest, WOLFSSL_BUFFER_INFO* responseBuffer); + OcspRequest* ocspRequest, WOLFSSL_BUFFER_INFO* responseBuffer, + void* heap); WOLFSSL_LOCAL int CheckOcspResponse(WOLFSSL_OCSP *ocsp, byte *response, int responseSz, WOLFSSL_BUFFER_INFO *responseBuffer, CertStatus *status, - OcspEntry *entry, OcspRequest *ocspRequest); + OcspEntry *entry, OcspRequest *ocspRequest, + void* heap); + +WOLFSSL_LOCAL int CheckOcspResponder(OcspResponse *bs, DecodedCert *cert, + void* vp); #if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || defined(WOLFSSL_HAPROXY) || \ defined(WOLFSSL_APACHE_HTTPD) || defined(HAVE_LIGHTY) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/aes.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/aes.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/aes.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/aes.h 2024-08-03 07:30:01.000000000 +0000 @@ -33,6 +33,14 @@ #ifndef NO_AES #include + +#if !defined(WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API) && \ + defined(WC_AESFREE_IS_MANDATORY) +#define WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API +#endif + +#ifndef WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API + #include /* for size_t */ #ifdef __cplusplus @@ -95,6 +103,8 @@ } /* extern "C" */ #endif +#endif /* !WOLFSSL_NO_OPENSSL_AES_LOW_LEVEL_API */ + #endif /* NO_AES */ #endif /* WOLFSSL_AES_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/bio.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/bio.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/bio.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/bio.h 2024-08-03 07:30:01.000000000 +0000 @@ -25,6 +25,7 @@ #ifndef WOLFSSL_BIO_H_ #define WOLFSSL_BIO_H_ +#include #ifdef __cplusplus extern "C" { @@ -52,6 +53,9 @@ #define BIO_ctrl_pending wolfSSL_BIO_ctrl_pending #define BIO_wpending wolfSSL_BIO_wpending #define BIO_get_mem_ptr wolfSSL_BIO_get_mem_ptr +#ifdef OPENSSL_ALL +#define BIO_set_mem_buf wolfSSL_BIO_set_mem_buf +#endif #define BIO_int_ctrl wolfSSL_BIO_int_ctrl #define BIO_reset wolfSSL_BIO_reset #define BIO_s_file wolfSSL_BIO_s_file @@ -79,6 +83,8 @@ #define BIO_puts wolfSSL_BIO_puts #define BIO_should_retry wolfSSL_BIO_should_retry +#define BIO_should_read wolfSSL_BIO_should_read +#define BIO_should_write wolfSSL_BIO_should_write #define BIO_TYPE_FILE WOLFSSL_BIO_FILE #define BIO_TYPE_BIO WOLFSSL_BIO_BIO diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/bn.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/bn.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/bn.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/bn.h 2024-08-03 07:30:01.000000000 +0000 @@ -30,7 +30,7 @@ #ifndef WOLFSSL_BN_H_ #define WOLFSSL_BN_H_ -#include +#include #include #ifdef __cplusplus @@ -40,7 +40,9 @@ typedef struct WOLFSSL_BIGNUM { int neg; /* openssh deference */ void *internal; /* our big num */ +#if !defined(NO_BIG_INT) || defined(WOLFSSL_SP_MATH) mp_int mpi; +#endif } WOLFSSL_BIGNUM; #define WOLFSSL_BN_ULONG unsigned long @@ -271,7 +273,7 @@ #define BN_mod_inverse wolfSSL_BN_mod_inverse -#define BN_set_flags(x1, x2) +#define BN_set_flags(x1, x2) WC_DO_NOTHING #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L #define BN_get_rfc2409_prime_768 wolfSSL_DH_768_prime diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/crypto.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/crypto.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/crypto.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/crypto.h 2024-08-03 07:30:01.000000000 +0000 @@ -96,13 +96,9 @@ #define SSLeay_version wolfSSLeay_version #define SSLeay wolfSSLeay #define OpenSSL_version_num wolfSSL_OpenSSL_version_num +#define SSLEAY_VERSION_NUMBER OPENSSL_VERSION_NUMBER +#define SSLEAY_VERSION OPENSSL_VERSION -#ifdef WOLFSSL_QT - #define SSLEAY_VERSION 0x10001000L -#else - #define SSLEAY_VERSION 0x0090600fL -#endif -#define SSLEAY_VERSION_NUMBER SSLEAY_VERSION #define CRYPTO_lock wc_LockMutex_ex /* this function was used to set the default malloc, free, and realloc */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/ec.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/ec.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/ec.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/ec.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,6 +24,7 @@ #ifndef WOLFSSL_EC_H_ #define WOLFSSL_EC_H_ +#include #include #include #include @@ -73,9 +74,15 @@ #ifdef HAVE_ED448 NID_ED448 = ED448k, #endif +#ifdef HAVE_CURVE448 + NID_X448 = X448k, +#endif #ifdef HAVE_ED25519 NID_ED25519 = ED25519k, #endif +#ifdef HAVE_CURVE25519 + NID_X25519 = X25519k, +#endif OPENSSL_EC_EXPLICIT_CURVE = 0x000, OPENSSL_EC_NAMED_CURVE = 0x001, @@ -137,6 +144,12 @@ typedef int point_conversion_form_t; +typedef struct WOLFSSL_EC_KEY_METHOD { + /* Not implemented */ + /* Just here so that some C compilers don't complain. To be removed. */ + void* dummy_member; +} WOLFSSL_EC_KEY_METHOD; + WOLFSSL_API size_t wolfSSL_EC_get_builtin_curves(WOLFSSL_EC_BUILTIN_CURVE *r,size_t nitems); @@ -264,6 +277,9 @@ int wolfSSL_EC_METHOD_get_field_type(const WOLFSSL_EC_METHOD *meth); WOLFSSL_API WOLFSSL_EC_POINT *wolfSSL_EC_POINT_new(const WOLFSSL_EC_GROUP *group); +WOLFSSL_LOCAL +int ec_point_convert_to_affine(const WOLFSSL_EC_GROUP *group, + WOLFSSL_EC_POINT *point); WOLFSSL_API int wolfSSL_EC_POINT_get_affine_coordinates_GFp(const WOLFSSL_EC_GROUP *group, const WOLFSSL_EC_POINT *p, @@ -302,12 +318,29 @@ int wolfSSL_EC_POINT_is_at_infinity(const WOLFSSL_EC_GROUP *group, const WOLFSSL_EC_POINT *a); -#ifndef HAVE_SELFTEST WOLFSSL_API char* wolfSSL_EC_POINT_point2hex(const WOLFSSL_EC_GROUP* group, const WOLFSSL_EC_POINT* point, int form, WOLFSSL_BN_CTX* ctx); -#endif +WOLFSSL_API +WOLFSSL_EC_POINT *wolfSSL_EC_POINT_hex2point + (const WOLFSSL_EC_GROUP *group, const char *hex, + WOLFSSL_EC_POINT *p, WOLFSSL_BN_CTX *ctx); + +WOLFSSL_API const WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_OpenSSL(void); +WOLFSSL_API WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_METHOD_new( + const WOLFSSL_EC_KEY_METHOD *meth); +WOLFSSL_API void wolfSSL_EC_KEY_METHOD_free(WOLFSSL_EC_KEY_METHOD *meth); +/* TODO when implementing change the types to the real callback signatures + * and use real parameter names */ +WOLFSSL_API void wolfSSL_EC_KEY_METHOD_set_init(WOLFSSL_EC_KEY_METHOD *meth, + void* a1, void* a2, void* a3, void* a4, void* a5, void* a6); +WOLFSSL_API void wolfSSL_EC_KEY_METHOD_set_sign(WOLFSSL_EC_KEY_METHOD *meth, + void* a1, void* a2, void* a3); +WOLFSSL_API const WOLFSSL_EC_KEY_METHOD *wolfSSL_EC_KEY_get_method( + const WOLFSSL_EC_KEY *key); +WOLFSSL_API int wolfSSL_EC_KEY_set_method(WOLFSSL_EC_KEY *key, + const WOLFSSL_EC_KEY_METHOD *meth); #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) @@ -316,6 +349,7 @@ typedef WOLFSSL_EC_GROUP EC_METHOD; typedef WOLFSSL_EC_POINT EC_POINT; typedef WOLFSSL_EC_BUILTIN_CURVE EC_builtin_curve; +typedef WOLFSSL_EC_KEY_METHOD EC_KEY_METHOD; #ifndef HAVE_ECC #define OPENSSL_NO_EC @@ -352,7 +386,7 @@ #define EC_GROUP_order_bits wolfSSL_EC_GROUP_order_bits #define EC_GROUP_method_of wolfSSL_EC_GROUP_method_of #ifndef NO_WOLFSSL_STUB -#define EC_GROUP_set_point_conversion_form(...) +#define EC_GROUP_set_point_conversion_form(...) WC_DO_NOTHING #endif #define EC_METHOD_get_field_type wolfSSL_EC_METHOD_get_field_type @@ -391,9 +425,8 @@ #define EC_KEY_set_conv_form wolfSSL_EC_KEY_set_conv_form #define EC_KEY_get_conv_form wolfSSL_EC_KEY_get_conv_form -#ifndef HAVE_SELFTEST - #define EC_POINT_point2hex wolfSSL_EC_POINT_point2hex -#endif +#define EC_POINT_point2hex wolfSSL_EC_POINT_point2hex +#define EC_POINT_hex2point wolfSSL_EC_POINT_hex2point #define EC_POINT_dump wolfSSL_EC_POINT_dump #define EC_get_builtin_curves wolfSSL_EC_get_builtin_curves @@ -401,6 +434,14 @@ #define EC_curve_nid2nist wolfSSL_EC_curve_nid2nist #define EC_curve_nist2nid wolfSSL_EC_curve_nist2nid +#define EC_KEY_OpenSSL wolfSSL_EC_KEY_OpenSSL +#define EC_KEY_METHOD_new wolfSSL_EC_KEY_METHOD_new +#define EC_KEY_METHOD_free wolfSSL_EC_KEY_METHOD_free +#define EC_KEY_METHOD_set_init wolfSSL_EC_KEY_METHOD_set_init +#define EC_KEY_METHOD_set_sign wolfSSL_EC_KEY_METHOD_set_sign +#define EC_KEY_get_method wolfSSL_EC_KEY_get_method +#define EC_KEY_set_method wolfSSL_EC_KEY_set_method + #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ #ifdef __cplusplus diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/engine.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/engine.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/engine.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/engine.h 2024-08-03 07:30:01.000000000 +0000 @@ -6,5 +6,4 @@ /* ENGINE_load_builtin_engines not needed, as all builtin engines are already loaded into memory and used on startup. */ -#define ENGINE_load_builtin_engines() - +#define ENGINE_load_builtin_engines() WC_DO_NOTHING diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/evp.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/evp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/evp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/evp.h 2024-08-03 07:30:01.000000000 +0000 @@ -30,7 +30,7 @@ #ifndef WOLFSSL_EVP_H_ #define WOLFSSL_EVP_H_ -#include +#include #ifdef WOLFSSL_PREFIX #include "prefix_evp.h" @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -57,11 +58,21 @@ #include #include #include +#ifdef WOLFSSL_SM3 + #include +#endif +#ifdef WOLFSSL_SM4 + #include +#endif #if defined(WOLFSSL_BASE64_ENCODE) || defined(WOLFSSL_BASE64_DECODE) #include #endif +#ifdef HAVE_ARIA + #include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -91,6 +102,8 @@ WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_384(void); WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sha3_512(void); +WOLFSSL_API const WOLFSSL_EVP_MD* wolfSSL_EVP_sm3(void); + WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ecb(void); WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ecb(void); WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ecb(void); @@ -134,6 +147,11 @@ WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_128_ctr(void); WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_192_ctr(void); WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aes_256_ctr(void); +#if defined(HAVE_ARIA) +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_128_gcm(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_192_gcm(void); +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_aria_256_gcm(void); +#endif WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ecb(void); WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_ede3_ecb(void); WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_des_cbc(void); @@ -149,7 +167,21 @@ #define WOLFSSL_EVP_CHACHA_IV_BYTES (CHACHA_IV_BYTES + sizeof(word32)) WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_chacha20(void); #endif - +#ifdef WOLFSSL_SM4_ECB +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ecb(void); +#endif +#ifdef WOLFSSL_SM4_CBC +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_cbc(void); +#endif +#ifdef WOLFSSL_SM4_CTR +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ctr(void); +#endif +#ifdef WOLFSSL_SM4_GCM +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_gcm(void); +#endif +#ifdef WOLFSSL_SM4_CCM +WOLFSSL_API const WOLFSSL_EVP_CIPHER* wolfSSL_EVP_sm4_ccm(void); +#endif typedef union { #ifndef NO_MD4 @@ -186,6 +218,9 @@ #ifndef WOLFSSL_NOSHA3_512 WOLFSSL_SHA3_512_CTX sha3_512; #endif + #ifdef WOLFSSL_SM3 + wc_Sm3 sm3; + #endif } WOLFSSL_Hasher; @@ -211,6 +246,9 @@ XtsAes xts; #endif #endif +#ifdef HAVE_ARIA + wc_Aria aria; +#endif #ifndef NO_DES3 Des des; Des3 des3; @@ -225,6 +263,9 @@ #ifdef HAVE_CHACHA ChaCha chacha; #endif +#ifdef WOLFSSL_SM4 + wc_Sm4 sm4; +#endif } WOLFSSL_Cipher; #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) @@ -266,6 +307,11 @@ #define NID_camellia_256_cbc 753 #define NID_chacha20_poly1305 1018 #define NID_chacha20 1019 +#define NID_sm4_ecb 1133 +#define NID_sm4_cbc 1134 +#define NID_sm4_ctr 1139 +#define NID_sm4_gcm 1248 +#define NID_sm4_ccm 1249 #define NID_md5WithRSA 104 #define NID_md2WithRSAEncryption 9 #define NID_md5WithRSAEncryption 99 @@ -303,6 +349,7 @@ #define NID_shake256 1101 #define NID_sha1 64 #define NID_sha224 675 +#define NID_sm3 1143 #define NID_md2 77 #define NID_md4 257 #define NID_md5 40 @@ -346,9 +393,15 @@ #define NID_auth_srp 1052 #define NID_auth_null 1054 #define NID_auth_any 1055 +/* Curve */ +#define NID_aria_128_gcm 1123 +#define NID_aria_192_gcm 1124 +#define NID_aria_256_gcm 1125 +#define NID_sm2 1172 #define NID_X9_62_id_ecPublicKey EVP_PKEY_EC #define NID_rsaEncryption EVP_PKEY_RSA +#define NID_rsa EVP_PKEY_RSA #define NID_dsa EVP_PKEY_DSA #define EVP_PKEY_OP_SIGN (1 << 3) @@ -360,52 +413,60 @@ #define EVP_PKEY_PRINT_INDENT_MAX 128 enum { - AES_128_CBC_TYPE = 1, - AES_192_CBC_TYPE = 2, - AES_256_CBC_TYPE = 3, - AES_128_CTR_TYPE = 4, - AES_192_CTR_TYPE = 5, - AES_256_CTR_TYPE = 6, - AES_128_ECB_TYPE = 7, - AES_192_ECB_TYPE = 8, - AES_256_ECB_TYPE = 9, - DES_CBC_TYPE = 10, - DES_ECB_TYPE = 11, - DES_EDE3_CBC_TYPE = 12, - DES_EDE3_ECB_TYPE = 13, - ARC4_TYPE = 14, - NULL_CIPHER_TYPE = 15, - EVP_PKEY_RSA = 16, - EVP_PKEY_DSA = 17, - EVP_PKEY_EC = 18, - AES_128_GCM_TYPE = 21, - AES_192_GCM_TYPE = 22, - AES_256_GCM_TYPE = 23, - EVP_PKEY_DH = NID_dhKeyAgreement, - EVP_PKEY_HMAC = NID_hmac, - EVP_PKEY_CMAC = NID_cmac, - EVP_PKEY_HKDF = NID_hkdf, - EVP_PKEY_FALCON = 300, /* Randomly picked value. */ - EVP_PKEY_DILITHIUM= 301, /* Randomly picked value. */ - AES_128_CFB1_TYPE = 24, - AES_192_CFB1_TYPE = 25, - AES_256_CFB1_TYPE = 26, - AES_128_CFB8_TYPE = 27, - AES_192_CFB8_TYPE = 28, - AES_256_CFB8_TYPE = 29, - AES_128_CFB128_TYPE = 30, - AES_192_CFB128_TYPE = 31, - AES_256_CFB128_TYPE = 32, - AES_128_OFB_TYPE = 33, - AES_192_OFB_TYPE = 34, - AES_256_OFB_TYPE = 35, - AES_128_XTS_TYPE = 36, - AES_256_XTS_TYPE = 37, + AES_128_CBC_TYPE = 1, + AES_192_CBC_TYPE = 2, + AES_256_CBC_TYPE = 3, + AES_128_CTR_TYPE = 4, + AES_192_CTR_TYPE = 5, + AES_256_CTR_TYPE = 6, + AES_128_ECB_TYPE = 7, + AES_192_ECB_TYPE = 8, + AES_256_ECB_TYPE = 9, + DES_CBC_TYPE = 10, + DES_ECB_TYPE = 11, + DES_EDE3_CBC_TYPE = 12, + DES_EDE3_ECB_TYPE = 13, + ARC4_TYPE = 14, + NULL_CIPHER_TYPE = 15, + EVP_PKEY_RSA = 16, + EVP_PKEY_DSA = 17, + EVP_PKEY_EC = 18, + AES_128_GCM_TYPE = 21, + AES_192_GCM_TYPE = 22, + AES_256_GCM_TYPE = 23, + EVP_PKEY_DH = NID_dhKeyAgreement, + EVP_PKEY_HMAC = NID_hmac, + EVP_PKEY_CMAC = NID_cmac, + EVP_PKEY_HKDF = NID_hkdf, + EVP_PKEY_FALCON = 300, /* Randomly picked value. */ + EVP_PKEY_DILITHIUM = 301, /* Randomly picked value. */ + AES_128_CFB1_TYPE = 24, + AES_192_CFB1_TYPE = 25, + AES_256_CFB1_TYPE = 26, + AES_128_CFB8_TYPE = 27, + AES_192_CFB8_TYPE = 28, + AES_256_CFB8_TYPE = 29, + AES_128_CFB128_TYPE = 30, + AES_192_CFB128_TYPE = 31, + AES_256_CFB128_TYPE = 32, + AES_128_OFB_TYPE = 33, + AES_192_OFB_TYPE = 34, + AES_256_OFB_TYPE = 35, + AES_128_XTS_TYPE = 36, + AES_256_XTS_TYPE = 37, CHACHA20_POLY1305_TYPE = 38, - CHACHA20_TYPE = 39, - AES_128_CCM_TYPE = 40, - AES_192_CCM_TYPE = 41, - AES_256_CCM_TYPE = 42 + CHACHA20_TYPE = 39, + AES_128_CCM_TYPE = 40, + AES_192_CCM_TYPE = 41, + AES_256_CCM_TYPE = 42, + SM4_ECB_TYPE = 43, + SM4_CBC_TYPE = 44, + SM4_CTR_TYPE = 45, + SM4_GCM_TYPE = 46, + SM4_CCM_TYPE = 47, + ARIA_128_GCM_TYPE = 48, + ARIA_192_GCM_TYPE = 49, + ARIA_256_GCM_TYPE = 50 }; #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ @@ -421,6 +482,8 @@ #if !defined(NO_AES) /* working iv pointer into cipher */ ALIGN16 unsigned char iv[AES_BLOCK_SIZE]; +#elif defined(WOLFSSL_SM4) + ALIGN16 unsigned char iv[SM4_BLOCK_SIZE]; #elif defined(HAVE_CHACHA) && defined(HAVE_POLY1305) ALIGN16 unsigned char iv[CHACHA20_POLY1305_AEAD_IV_SIZE]; #elif !defined(NO_DES3) @@ -433,10 +496,12 @@ int lastUsed; #if !defined(NO_AES) || !defined(NO_DES3) || defined(HAVE_AESGCM) || \ defined (WOLFSSL_AES_XTS) || (defined(HAVE_CHACHA) || \ - defined(HAVE_POLY1305) || defined(HAVE_AESCCM)) + defined(HAVE_POLY1305) || defined(HAVE_AESCCM)) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) #define HAVE_WOLFSSL_EVP_CIPHER_CTX_IV int ivSz; -#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) byte* authBuffer; int authBufferLen; byte* authIn; @@ -445,16 +510,20 @@ #if defined(HAVE_CHACHA) && defined(HAVE_POLY1305) byte* key; /* used in partial Init()s */ #endif -#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \ - (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) -#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) || \ + (defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || defined(HAVE_ARIA) ALIGN16 unsigned char authTag[AES_BLOCK_SIZE]; +#elif defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) + ALIGN16 unsigned char authTag[SM4_BLOCK_SIZE]; #else ALIGN16 unsigned char authTag[CHACHA20_POLY1305_AEAD_AUTHTAG_SIZE]; #endif int authTagSz; #endif -#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) +#if defined(HAVE_AESGCM) || defined(HAVE_AESCCM) || \ + defined(WOLFSSL_SM4_GCM) || defined(WOLFSSL_SM4_CCM) byte authIvGenEnable:1; byte authIncIv:1; #endif @@ -786,6 +855,7 @@ #define WOLFSSL_EVP_CIPH_FLAG_AEAD_CIPHER 0x20 #define WOLFSSL_EVP_CIPH_NO_PADDING 0x100 #define WOLFSSL_EVP_CIPH_VARIABLE_LENGTH 0x200 +#define WOLFSSL_EVP_CIPH_LOW_LEVEL_INITED 0x400 #define WOLFSSL_EVP_CIPH_TYPE_INIT 0xff @@ -877,6 +947,7 @@ #define EVP_ripemd160 wolfSSL_EVP_ripemd160 #define EVP_shake128 wolfSSL_EVP_shake128 #define EVP_shake256 wolfSSL_EVP_shake256 +#define EVP_sm3 wolfSSL_EVP_sm3 #define EVP_set_pw_prompt wolfSSL_EVP_set_pw_prompt #define EVP_sha3_224 wolfSSL_EVP_sha3_224 @@ -923,6 +994,14 @@ #define EVP_rc4 wolfSSL_EVP_rc4 #define EVP_chacha20 wolfSSL_EVP_chacha20 #define EVP_chacha20_poly1305 wolfSSL_EVP_chacha20_poly1305 +#define EVP_aria_128_gcm wolfSSL_EVP_aria_128_gcm +#define EVP_aria_192_gcm wolfSSL_EVP_aria_192_gcm +#define EVP_aria_256_gcm wolfSSL_EVP_aria_256_gcm +#define EVP_sm4_ecb wolfSSL_EVP_sm4_ecb +#define EVP_sm4_cbc wolfSSL_EVP_sm4_cbc +#define EVP_sm4_ctr wolfSSL_EVP_sm4_ctr +#define EVP_sm4_gcm wolfSSL_EVP_sm4_gcm +#define EVP_sm4_ccm wolfSSL_EVP_sm4_ccm #define EVP_enc_null wolfSSL_EVP_enc_null #define EVP_MD_size wolfSSL_EVP_MD_size @@ -941,7 +1020,7 @@ #define EVP_MD_block_size wolfSSL_EVP_MD_block_size #define EVP_MD_type wolfSSL_EVP_MD_type #ifndef NO_WOLFSSL_STUB -#define EVP_MD_CTX_set_flags(...) +#define EVP_MD_CTX_set_flags(...) WC_DO_NOTHING #endif #define EVP_Digest wolfSSL_EVP_Digest @@ -1124,7 +1203,7 @@ #define EVP_CTRL_CCM_SET_MSGLEN 0x15 #define EVP_PKEY_print_public wolfSSL_EVP_PKEY_print_public -#define EVP_PKEY_print_private(arg1, arg2, arg3, arg4) +#define EVP_PKEY_print_private(arg1, arg2, arg3, arg4) WC_DO_NOTHING #ifndef EVP_MAX_MD_SIZE #define EVP_MAX_MD_SIZE 64 /* sha512 */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/hmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/hmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/hmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/hmac.h 2024-08-03 07:30:01.000000000 +0000 @@ -45,7 +45,7 @@ WOLFSSL_API unsigned char* wolfSSL_HMAC(const WOLFSSL_EVP_MD* evp_md, const void* key, int key_len, - const unsigned char* d, int n, unsigned char* md, + const unsigned char* d, size_t n, unsigned char* md, unsigned int* md_len); WOLFSSL_API WOLFSSL_HMAC_CTX* wolfSSL_HMAC_CTX_new(void); @@ -69,7 +69,7 @@ typedef struct WOLFSSL_HMAC_CTX HMAC_CTX; -#define HMAC(a,b,c,d,e,f,g) wolfSSL_HMAC((a),(b),(c),(d),(e),(f),(g)) +#define HMAC wolfSSL_HMAC #define HMAC_CTX_new wolfSSL_HMAC_CTX_new #define HMAC_CTX_init wolfSSL_HMAC_CTX_Init diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/objects.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/objects.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/objects.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/objects.h 2024-08-03 07:30:01.000000000 +0000 @@ -23,7 +23,7 @@ #ifndef WOLFSSL_OBJECTS_H_ #define WOLFSSL_OBJECTS_H_ -#include +#include #ifndef OPENSSL_EXTRA_SSL_GUARD #define OPENSSL_EXTRA_SSL_GUARD #include @@ -62,7 +62,7 @@ #define i2t_ASN1_OBJECT wolfSSL_i2t_ASN1_OBJECT /* not required for wolfSSL */ -#define OPENSSL_load_builtin_modules() +#define OPENSSL_load_builtin_modules() WC_DO_NOTHING #define NID_ad_OCSP 178 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/opensslv.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/opensslv.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/opensslv.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/opensslv.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,6 +24,9 @@ #ifndef WOLFSSL_OPENSSLV_H_ #define WOLFSSL_OPENSSLV_H_ +#include +#include + #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) /* api version compatibility */ @@ -34,16 +37,17 @@ /* valid version */ #elif defined(WOLFSSL_APACHE_HTTPD) || defined(HAVE_LIBEST) || \ defined(WOLFSSL_BIND) || defined(WOLFSSL_NGINX) || \ - defined(WOLFSSL_RSYSLOG) || defined(WOLFSSL_KRB) || defined(HAVE_STUNNEL) + defined(WOLFSSL_RSYSLOG) || defined(WOLFSSL_KRB) || defined(HAVE_STUNNEL) || \ + defined(WOLFSSL_OPENSSH) /* For Apache httpd, Use 1.1.0 compatibility */ #define OPENSSL_VERSION_NUMBER 0x10100003L -#elif defined(WOLFSSL_QT) || defined(WOLFSSL_PYTHON) +#elif defined(WOLFSSL_QT) || defined(WOLFSSL_PYTHON) || defined(WOLFSSL_KRB) /* For Qt and Python 3.8.5 compatibility */ #define OPENSSL_VERSION_NUMBER 0x10101000L #elif defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_FFMPEG) #define OPENSSL_VERSION_NUMBER 0x1010000fL #elif defined(OPENSSL_ALL) || defined(HAVE_LIGHTY) || \ - defined(WOLFSSL_NGINX) || defined(WOLFSSL_OPENSSH) || defined(WOLFSSL_OPENVPN) + defined(WOLFSSL_NGINX) || defined(WOLFSSL_OPENVPN) /* version number can be increased for Lighty after compatibility for ECDH is added */ #define OPENSSL_VERSION_NUMBER 0x10001040L @@ -54,6 +58,10 @@ #define OPENSSL_VERSION_TEXT "wolfSSL " LIBWOLFSSL_VERSION_STRING #define OPENSSL_VERSION 0 +#ifndef OPENSSL_IS_WOLFSSL +#define OPENSSL_IS_WOLFSSL +#endif + #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ #endif /* header */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/rsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/rsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/rsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/rsa.h 2024-08-03 07:30:01.000000000 +0000 @@ -54,6 +54,8 @@ #define RSA_PSS_SALTLEN_DIGEST (-1) /* Old max salt length */ #define RSA_PSS_SALTLEN_MAX_SIGN (-2) +/* Verification only value to indicate to discover salt length. */ +#define RSA_PSS_SALTLEN_AUTO (-2) /* Max salt length */ #define RSA_PSS_SALTLEN_MAX (-3) #endif /* OPENSSL_EXTRA || OPENSSL_EXTRA_X509_SMALL */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/sha.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/sha.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/sha.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/sha.h 2024-08-03 07:30:01.000000000 +0000 @@ -27,7 +27,7 @@ #include #include - +#include #ifdef WOLFSSL_PREFIX #include "prefix_sha.h" #endif @@ -41,8 +41,8 @@ #define CTX_SHA_HW_ADDER sizeof(STM32_HASH_Context) #elif defined(WOLFSSL_IMXRT1170_CAAM) #define CTX_SHA_HW_ADDER (sizeof(caam_hash_ctx_t) + sizeof(caam_handle_t)) -#elif defined(WOLFSSL_ESPWROOM32) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +#elif defined(WOLFSSL_ESP32) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) #define CTX_SHA_HW_ADDER sizeof(WC_ESP32SHA) #else #define CTX_SHA_HW_ADDER 0 @@ -151,7 +151,7 @@ * to Sha256, is expected to also be 16 byte aligned addresses. */ typedef struct WOLFSSL_SHA256_CTX { /* big enough to hold wolfcrypt Sha256, but check on init */ - ALIGN16 void* holder[(274 + CTX_SHA_HW_ADDER + WC_ASYNC_DEV_SIZE) / + ALIGN16 void* holder[sizeof(wc_Sha256) / sizeof(void*)]; #if defined(WOLFSSL_DEVCRYPTO_HASH) || defined(WOLFSSL_HASH_KEEP) ALIGN16 void* keephash_holder[sizeof(void*) + (2 * sizeof(unsigned int))]; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/sha3.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/sha3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/sha3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/sha3.h 2024-08-03 07:30:01.000000000 +0000 @@ -27,6 +27,7 @@ #include #include +#include #ifdef WOLFSSL_PREFIX #include "prefix_sha.h" @@ -41,7 +42,11 @@ * to Sha3 is expected to also be 16 byte aligned addresses. */ struct WOLFSSL_SHA3_CTX { /* big enough to hold wolfcrypt Sha3, but check on init */ +#ifdef WOLFSSL_SHA3 + ALIGN16 void* holder[sizeof(wc_Sha3)]; +#else ALIGN16 void* holder[(424 + WC_ASYNC_DEV_SIZE) / sizeof(void*)]; +#endif }; #ifndef WOLFSSL_NOSHA3_224 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/ssl.h 2024-08-03 07:30:01.000000000 +0000 @@ -29,6 +29,8 @@ #ifndef WOLFSSL_OPENSSL_H_ #define WOLFSSL_OPENSSL_H_ +#include + /* wolfssl_openssl compatibility layer */ #ifndef OPENSSL_EXTRA_SSL_GUARD #define OPENSSL_EXTRA_SSL_GUARD @@ -165,6 +167,7 @@ #define CRYPTO_WRITE 0x08 #define CRYPTO_set_locking_callback wolfSSL_set_locking_callback +#define CRYPTO_get_locking_callback wolfSSL_get_locking_callback #define CRYPTO_set_dynlock_create_callback wolfSSL_set_dynlock_create_callback #define CRYPTO_set_dynlock_lock_callback wolfSSL_set_dynlock_lock_callback #define CRYPTO_set_dynlock_destroy_callback wolfSSL_set_dynlock_destroy_callback @@ -207,6 +210,7 @@ #define i2d_PKCS8PrivateKey_bio wolfSSL_PEM_write_bio_PKCS8PrivateKey #define PKCS8_PRIV_KEY_INFO_free wolfSSL_EVP_PKEY_free #define d2i_PKCS12_fp wolfSSL_d2i_PKCS12_fp +#define SSL_set_ecdh_auto wolfSSL_set_ecdh_auto #define SSL_CTX_set_ecdh_auto wolfSSL_CTX_set_ecdh_auto #define i2d_PUBKEY wolfSSL_i2d_PUBKEY @@ -337,6 +341,9 @@ #define SSL_CTX_set1_sigalgs_list wolfSSL_CTX_set1_sigalgs_list #define SSL_set1_sigalgs_list wolfSSL_set1_sigalgs_list #define SSL_get_signature_nid wolfSSL_get_signature_nid +#define SSL_get_signature_type_nid wolfSSL_get_signature_type_nid +#define SSL_get_peer_signature_nid wolfSSL_get_peer_signature_nid +#define SSL_get_peer_signature_type_nid wolfSSL_get_peer_signature_type_nid #define SSL_CTX_set1_groups wolfSSL_CTX_set1_groups #define SSL_set1_groups wolfSSL_set1_groups @@ -360,6 +367,8 @@ #define SSL_SESSION_dup wolfSSL_SESSION_dup #define SSL_SESSION_free wolfSSL_SESSION_free #define SSL_SESSION_set_cipher wolfSSL_SESSION_set_cipher +#define SSL_SESSION_get_max_fragment_length \ + wolfSSL_SESSION_get_max_fragment_length #define SSL_is_init_finished wolfSSL_is_init_finished #define SSL_SESSION_set1_id wolfSSL_SESSION_set1_id @@ -494,6 +503,8 @@ #define X509_set_pubkey wolfSSL_X509_set_pubkey #define X509_set_notAfter wolfSSL_X509_set_notAfter #define X509_set_notBefore wolfSSL_X509_set_notBefore +#define X509_set1_notAfter wolfSSL_X509_set1_notAfter +#define X509_set1_notBefore wolfSSL_X509_set1_notBefore #define X509_set_serialNumber wolfSSL_X509_set_serialNumber #define X509_set_version wolfSSL_X509_set_version #define X509_REQ_set_version wolfSSL_X509_set_version @@ -628,6 +639,9 @@ #define X509_V_FLAG_CRL_CHECK WOLFSSL_CRL_CHECK #define X509_V_FLAG_CRL_CHECK_ALL WOLFSSL_CRL_CHECKALL +#define X509_V_FLAG_PARTIAL_CHAIN 0 +#define X509_V_FLAG_TRUSTED_FIRST 0 + #define X509_V_FLAG_USE_CHECK_TIME WOLFSSL_USE_CHECK_TIME #define X509_V_FLAG_NO_CHECK_TIME WOLFSSL_NO_CHECK_TIME #define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT WOLFSSL_ALWAYS_CHECK_SUBJECT @@ -668,10 +682,13 @@ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_CTX_verify_cb)(c)) #define X509_STORE_set_verify_cb_func(s, c) \ wolfSSL_X509_STORE_set_verify_cb((WOLFSSL_X509_STORE *)(s), (WOLFSSL_X509_STORE_CTX_verify_cb)(c)) +#define X509_STORE_set_get_crl wolfSSL_X509_STORE_set_get_crl +#define X509_STORE_set_check_crl wolfSSL_X509_STORE_set_check_crl #define X509_STORE_new wolfSSL_X509_STORE_new #define X509_STORE_free wolfSSL_X509_STORE_free +#define X509_STORE_up_ref wolfSSL_X509_STORE_up_ref #define X509_STORE_add_lookup wolfSSL_X509_STORE_add_lookup #define X509_STORE_add_cert wolfSSL_X509_STORE_add_cert #define X509_STORE_add_crl wolfSSL_X509_STORE_add_crl @@ -680,8 +697,10 @@ #define X509_STORE_get_by_subject wolfSSL_X509_STORE_get_by_subject #define X509_STORE_set_ex_data wolfSSL_X509_STORE_set_ex_data #define X509_STORE_get_ex_data wolfSSL_X509_STORE_get_ex_data +#define X509_STORE_get0_param wolfSSL_X509_STORE_get0_param #define X509_STORE_CTX_get1_issuer wolfSSL_X509_STORE_CTX_get1_issuer #define X509_STORE_CTX_set_time wolfSSL_X509_STORE_CTX_set_time +#define X509_STORE_CTX_get0_param wolfSSL_X509_STORE_CTX_get0_param #define X509_VERIFY_PARAM_new wolfSSL_X509_VERIFY_PARAM_new #define X509_VERIFY_PARAM_free wolfSSL_X509_VERIFY_PARAM_free #define X509_VERIFY_PARAM_set_flags wolfSSL_X509_VERIFY_PARAM_set_flags @@ -705,6 +724,7 @@ #define d2i_X509_CRL_fp wolfSSL_d2i_X509_CRL_fp #define PEM_read_X509_CRL wolfSSL_PEM_read_X509_CRL +#define X509_CRL_dup wolfSSL_X509_CRL_dup #define X509_CRL_free wolfSSL_X509_CRL_free #define X509_CRL_get_lastUpdate wolfSSL_X509_CRL_get_lastUpdate #define X509_CRL_get0_lastUpdate wolfSSL_X509_CRL_get_lastUpdate @@ -783,6 +803,7 @@ #define BIO_method_type wolfSSL_BIO_method_type #define BIO_set_ssl wolfSSL_BIO_set_ssl #define BIO_get_ssl wolfSSL_BIO_get_ssl +#define BIO_new_ssl wolfSSL_BIO_new_ssl #define BIO_new_ssl_connect wolfSSL_BIO_new_ssl_connect #define BIO_set_conn_hostname wolfSSL_BIO_set_conn_hostname #define BIO_eof wolfSSL_BIO_eof @@ -815,6 +836,10 @@ #define COMP_rle wolfSSL_COMP_rle #define SSL_COMP_add_compression_method wolfSSL_COMP_add_compression_method +#define SSL_get_current_compression(ssl) 0 +#define SSL_get_current_expansion(ssl) 0 +#define SSL_COMP_get_name wolfSSL_COMP_get_name + #define SSL_get_ex_new_index wolfSSL_get_ex_new_index #define RSA_get_ex_new_index wolfSSL_get_ex_new_index @@ -828,18 +853,21 @@ #ifndef NO_ASN_TIME #define ASN1_TIME_new wolfSSL_ASN1_TIME_new #define ASN1_UTCTIME_new wolfSSL_ASN1_TIME_new +#define ASN1_GENERALIZEDTIME_new wolfSSL_ASN1_TIME_new #define ASN1_TIME_free wolfSSL_ASN1_TIME_free #define ASN1_UTCTIME_free wolfSSL_ASN1_TIME_free +#define ASN1_GENERALIZEDTIME_free wolfSSL_ASN1_TIME_free #define ASN1_TIME_adj wolfSSL_ASN1_TIME_adj #define ASN1_TIME_print wolfSSL_ASN1_TIME_print #define ASN1_TIME_to_string wolfSSL_ASN1_TIME_to_string #define ASN1_TIME_to_tm wolfSSL_ASN1_TIME_to_tm #define ASN1_TIME_to_generalizedtime wolfSSL_ASN1_TIME_to_generalizedtime +#define ASN1_UTCTIME_set wolfSSL_ASN1_UTCTIME_set #endif #define ASN1_TIME_set wolfSSL_ASN1_TIME_set #define ASN1_TIME_set_string wolfSSL_ASN1_TIME_set_string +#define ASN1_GENERALIZEDTIME_set_string wolfSSL_ASN1_TIME_set_string #define ASN1_GENERALIZEDTIME_print wolfSSL_ASN1_GENERALIZEDTIME_print -#define ASN1_GENERALIZEDTIME_free wolfSSL_ASN1_GENERALIZEDTIME_free #define ASN1_tag2str wolfSSL_ASN1_tag2str @@ -885,6 +913,11 @@ #define ASN1_UTF8STRING_free wolfSSL_ASN1_STRING_free #define ASN1_UTF8STRING_set wolfSSL_ASN1_STRING_set +#define ASN1_IA5STRING WOLFSSL_ASN1_STRING +#define ASN1_IA5STRING_new wolfSSL_ASN1_STRING_new +#define ASN1_IA5STRING_free wolfSSL_ASN1_STRING_free +#define ASN1_IA5STRING_set wolfSSL_ASN1_STRING_set + #define ASN1_PRINTABLE_type(...) V_ASN1_PRINTABLESTRING #define ASN1_UTCTIME_pr wolfSSL_ASN1_UTCTIME_pr @@ -899,9 +932,12 @@ #define SSL_CTX_set_client_CA_list wolfSSL_CTX_set_client_CA_list #define SSL_CTX_set_client_cert_cb wolfSSL_CTX_set_client_cert_cb #define SSL_CTX_set_cert_store wolfSSL_CTX_set_cert_store +#ifdef OPENSSL_ALL +#define SSL_CTX_set1_verify_cert_store wolfSSL_CTX_set1_verify_cert_store +#endif #define SSL_set0_verify_cert_store wolfSSL_set0_verify_cert_store #define SSL_set1_verify_cert_store wolfSSL_set1_verify_cert_store -#define SSL_CTX_get_cert_store(x) wolfSSL_CTX_get_cert_store ((WOLFSSL_CTX*) (x)) +#define SSL_CTX_get_cert_store(x) wolfSSL_CTX_get_cert_store ((x)) #define SSL_get_client_CA_list wolfSSL_get_client_CA_list #define SSL_set_client_CA_list wolfSSL_set_client_CA_list #define SSL_get_ex_data_X509_STORE_CTX_idx wolfSSL_get_ex_data_X509_STORE_CTX_idx @@ -913,6 +949,7 @@ #define SSL_CTX_set_timeout(ctx, to) \ wolfSSL_CTX_set_timeout(ctx, (unsigned int)(to)) #define SSL_CTX_set_info_callback wolfSSL_CTX_set_info_callback +#define SSL_set_info_callback wolfSSL_set_info_callback #define SSL_CTX_set_alpn_protos wolfSSL_CTX_set_alpn_protos #define SSL_CTX_keylog_cb_func wolfSSL_CTX_keylog_cb_func @@ -921,7 +958,7 @@ #define SSL_alert_type_string wolfSSL_alert_type_string #define SSL_alert_desc_string wolfSSL_alert_desc_string -#define SSL_state_string wolfSSL_state_string +#define SSL_state_string wolfSSL_state_string_long #define RSA_free wolfSSL_RSA_free #define RSA_generate_key wolfSSL_RSA_generate_key @@ -1083,6 +1120,7 @@ wolfSSL_SESSION_get_ticket_lifetime_hint #define SSL_SESSION_set_timeout wolfSSL_SSL_SESSION_set_timeout #define SSL_SESSION_get_timeout wolfSSL_SESSION_get_timeout +#define SSL_SESSION_set_time wolfSSL_SESSION_set_time #define SSL_SESSION_get_time wolfSSL_SESSION_get_time #define SSL_CTX_get_ex_new_index wolfSSL_CTX_get_ex_new_index @@ -1092,16 +1130,16 @@ #define PEM_do_header wolfSSL_PEM_do_header /*#if OPENSSL_API_COMPAT < 0x10100000L*/ -#define CONF_modules_free() -#define ENGINE_cleanup() +#define CONF_modules_free() WC_DO_NOTHING +#define ENGINE_cleanup() WC_DO_NOTHING #define SSL_CTX_need_tmp_RSA(ctx) 0 #define SSL_CTX_set_tmp_rsa(ctx,rsa) 1 #define SSL_need_tmp_RSA(ssl) 0 #define SSL_set_tmp_rsa(ssl,rsa) 1 /*#endif*/ -#define CONF_modules_unload(a) -#define CONF_get1_default_config_file wolfSSL_CONF_get1_default_config_file +#define CONF_modules_unload(a) WC_DO_NOTHING +#define CONF_get1_default_config_file wolfSSL_CONF_get1_default_config_file #define SSL_get_hit wolfSSL_session_reused @@ -1195,6 +1233,7 @@ #define TLSEXT_STATUSTYPE_ocsp 1 +#define TLSEXT_max_fragment_length_DISABLED WOLFSSL_MFL_DISABLED #define TLSEXT_max_fragment_length_512 WOLFSSL_MFL_2_9 #define TLSEXT_max_fragment_length_1024 WOLFSSL_MFL_2_10 #define TLSEXT_max_fragment_length_2048 WOLFSSL_MFL_2_11 @@ -1233,7 +1272,8 @@ #define SSL_CTX_set_tlsext_max_fragment_length \ wolfSSL_CTX_set_tlsext_max_fragment_length #define SSL_get_server_random wolfSSL_get_server_random -#define SSL_get_server_tmp_key wolfSSL_get_server_tmp_key +#define SSL_get_server_tmp_key wolfSSL_get_peer_tmp_key +#define SSL_get_peer_tmp_key wolfSSL_get_peer_tmp_key #define SSL_CTX_set_min_proto_version wolfSSL_CTX_set_min_proto_version #define SSL_CTX_set_max_proto_version wolfSSL_CTX_set_max_proto_version @@ -1268,6 +1308,7 @@ #define SSL_CTRL_SET_GROUPS 91 #define SSL_CTRL_GET_PEER_TMP_KEY 109 #define SSL_CTRL_GET_SERVER_TMP_KEY SSL_CTRL_GET_PEER_TMP_KEY +#define SSL_CTRL_GET_CHAIN_CERTS 115 #define SSL_CTRL_SET_MIN_PROTO_VERSION 123 #define SSL_CTRL_SET_MAX_PROTO_VERSION 124 #define SSL_CTRL_GET_MIN_PROTO_VERSION 125 @@ -1318,6 +1359,10 @@ #define SSL_CONF_TYPE_FILE WOLFSSL_CONF_TYPE_FILE #define SSL_CONF_TYPE_DIR WOLFSSL_CONF_TYPE_DIR +#define OPENSSL_INIT_new wolfSSL_OPENSSL_INIT_new +#define OPENSSL_INIT_free wolfSSL_OPENSSL_INIT_free +#define OPENSSL_INIT_set_config_appname wolfSSL_OPENSSL_INIT_set_config_appname + #if defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL) @@ -1353,6 +1398,7 @@ #define GENERAL_NAME_dup wolfSSL_GENERAL_NAME_dup #define GENERAL_NAME_print wolfSSL_GENERAL_NAME_print #define GENERAL_NAME_set0_othername wolfSSL_GENERAL_NAME_set0_othername +#define GENERAL_NAME_set0_value wolfSSL_GENERAL_NAME_set0_value #define sk_GENERAL_NAME_push wolfSSL_sk_GENERAL_NAME_push #define sk_GENERAL_NAME_value wolfSSL_sk_GENERAL_NAME_value @@ -1380,6 +1426,7 @@ #define sk_ASN1_OBJECT_pop_free wolfSSL_sk_ASN1_OBJECT_pop_free #define GENERAL_NAME_free wolfSSL_GENERAL_NAME_free #define GENERAL_NAMES_free wolfSSL_GENERAL_NAMES_free +#define EXTENDED_KEY_USAGE_free wolfSSL_EXTENDED_KEY_USAGE_free #define AUTHORITY_INFO_ACCESS_free wolfSSL_AUTHORITY_INFO_ACCESS_free #define AUTHORITY_INFO_ACCESS_pop_free wolfSSL_AUTHORITY_INFO_ACCESS_pop_free @@ -1490,7 +1537,8 @@ #define OPENSSL_STRING WOLFSSL_STRING #define OPENSSL_CSTRING WOLFSSL_STRING -#define TLSEXT_TYPE_application_layer_protocol_negotiation 16 +#define TLSEXT_TYPE_application_layer_protocol_negotiation \ + TLSXT_APPLICATION_LAYER_PROTOCOL #define OPENSSL_NPN_UNSUPPORTED 0 #define OPENSSL_NPN_NEGOTIATED 1 @@ -1510,6 +1558,11 @@ #define SSL_R_UNEXPECTED_MESSAGE OUT_OF_ORDER_E #define SSL_R_UNEXPECTED_RECORD SANITY_MSG_E #define SSL_R_UNKNOWN_ALERT_TYPE BUFFER_ERROR +#define SSL_R_BAD_DIGEST_LENGTH BUFFER_ERROR +#define SSL_R_BAD_PACKET_LENGTH BUFFER_ERROR +#define SSL_R_DATA_LENGTH_TOO_LONG BUFFER_ERROR +#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG BUFFER_ERROR +#define SSL_R_BAD_LENGTH BUFFER_ERROR #define SSL_R_UNKNOWN_PROTOCOL VERSION_ERROR #define SSL_R_WRONG_VERSION_NUMBER VERSION_ERROR #define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC ENCRYPT_ERROR @@ -1519,6 +1572,7 @@ #define SSL_R_CERTIFICATE_VERIFY_FAILED VERIFY_CERT_ERROR #define SSL_R_CERT_CB_ERROR CLIENT_CERT_CB_ERROR #define SSL_R_NULL_SSL_METHOD_PASSED BAD_FUNC_ARG +#define SSL_R_CCS_RECEIVED_EARLY OUT_OF_ORDER_E #ifdef HAVE_SESSION_TICKET #define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB 72 @@ -1529,6 +1583,7 @@ #define SSL_OP_SINGLE_DH_USE WOLFSSL_OP_SINGLE_DH_USE #define SSL_OP_SINGLE_ECDH_USE WOLFSSL_OP_SINGLE_ECDH_USE #define SSL_OP_CIPHER_SERVER_PREFERENCE WOLFSSL_OP_CIPHER_SERVER_PREFERENCE +#define SSL_OP_NO_RENEGOTIATION WOLFSSL_OP_NO_RENEGOTIATION #define OPENSSL_config wolfSSL_OPENSSL_config #define OPENSSL_memdup wolfSSL_OPENSSL_memdup @@ -1540,6 +1595,7 @@ #define SSL_get_wbio wolfSSL_SSL_get_wbio #define SSL_do_handshake wolfSSL_SSL_do_handshake #define SSL_in_init wolfSSL_SSL_in_init +#define SSL_in_before wolfSSL_SSL_in_before #define SSL_in_connect_init wolfSSL_SSL_in_connect_init #define SSL_get0_session wolfSSL_SSL_get0_session #define SSL_CTX_set_tlsext_ticket_key_cb wolfSSL_CTX_set_tlsext_ticket_key_cb @@ -1637,8 +1693,8 @@ #endif #ifndef NO_WOLFSSL_STUB -#define OBJ_create_objects(...) -#define sk_SSL_COMP_free(...) +#define OBJ_create_objects(...) WC_DO_NOTHING +#define sk_SSL_COMP_free(...) WC_DO_NOTHING #endif #define OBJ_dup wolfSSL_ASN1_OBJECT_dup diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/tls1.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/tls1.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/tls1.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/tls1.h 2024-08-03 07:30:01.000000000 +0000 @@ -45,8 +45,10 @@ #ifdef WOLFSSL_QUIC /* from rfc9001 */ -#define TLSEXT_TYPE_quic_transport_parameters_draft 0xffa5 -#define TLSEXT_TYPE_quic_transport_parameters 0x0039 +#define TLSEXT_TYPE_quic_transport_parameters_draft \ + TLSXT_KEY_QUIC_TP_PARAMS_DRAFT +#define TLSEXT_TYPE_quic_transport_parameters \ + TLSXT_KEY_QUIC_TP_PARAMS #endif #endif /* WOLFSSL_OPENSSL_TLS1_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/x509.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/x509.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/x509.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/x509.h 2024-08-03 07:30:01.000000000 +0000 @@ -50,7 +50,6 @@ #define X509_FLAG_NO_IDS (1UL << 12) #define XN_FLAG_FN_SN 0 -#define XN_FLAG_ONELINE 0 #define XN_FLAG_COMPAT 0 #define XN_FLAG_RFC2253 1 #define XN_FLAG_SEP_COMMA_PLUS (1 << 16) @@ -68,53 +67,48 @@ #define XN_FLAG_FN_ALIGN (1 << 25) #define XN_FLAG_MULTILINE 0xFFFF +#define XN_FLAG_ONELINE (XN_FLAG_SEP_CPLUS_SPC | XN_FLAG_SPC_EQ | XN_FLAG_FN_SN) /* * All of these aren't actually used in wolfSSL. Some are included to * satisfy OpenSSL compatibility consumers to prevent compilation errors. * The list was taken from * https://github.com/openssl/openssl/blob/master/include/openssl/x509_vfy.h.in + * One requirement for HAProxy is that the values should be literal constants. */ -#define X509_V_OK WOLFSSL_X509_V_OK +#define X509_V_OK 0 #define X509_V_ERR_UNSPECIFIED 1 #define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 #define X509_V_ERR_UNABLE_TO_GET_CRL 3 #define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 #define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 #define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 -#define X509_V_ERR_CERT_SIGNATURE_FAILURE \ - WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE +#define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 #define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 -#define X509_V_ERR_CERT_NOT_YET_VALID WOLFSSL_X509_V_ERR_CERT_NOT_YET_VALID -#define X509_V_ERR_CERT_HAS_EXPIRED WOLFSSL_X509_V_ERR_CERT_HAS_EXPIRED +#define X509_V_ERR_CERT_NOT_YET_VALID 9 +#define X509_V_ERR_CERT_HAS_EXPIRED 10 #define X509_V_ERR_CRL_NOT_YET_VALID 11 #define X509_V_ERR_CRL_HAS_EXPIRED 12 -#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD \ - WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD -#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD \ - WOLFSSL_X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD +#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 +#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 #define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 #define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 #define X509_V_ERR_OUT_OF_MEM 17 -#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT \ - WOLFSSL_X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT +#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 #define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 -#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY \ - WOLFSSL_X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY -#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE \ - WOLFSSL_X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE -#define X509_V_ERR_CERT_CHAIN_TOO_LONG WOLFSSL_X509_V_ERR_CERT_CHAIN_TOO_LONG -#define X509_V_ERR_CERT_REVOKED WOLFSSL_X509_V_ERR_CERT_REVOKED -#define X509_V_ERR_NO_ISSUER_PUBLIC_KEY WOLFSSL_X509_V_ERR_INVALID_CA -#define X509_V_ERR_PATH_LENGTH_EXCEEDED WOLFSSL_X509_V_ERR_PATH_LENGTH_EXCEEDED +#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 +#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 +#define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 +#define X509_V_ERR_CERT_REVOKED 23 +#define X509_V_ERR_NO_ISSUER_PUBLIC_KEY 24 +#define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 #define X509_V_ERR_INVALID_PURPOSE 26 #define X509_V_ERR_CERT_UNTRUSTED 27 -#define X509_V_ERR_CERT_REJECTED WOLFSSL_X509_V_ERR_CERT_REJECTED +#define X509_V_ERR_CERT_REJECTED 28 /* These are 'informational' when looking for issuer cert */ -#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH \ - WOLFSSL_X509_V_ERR_SUBJECT_ISSUER_MISMATCH +#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 #define X509_V_ERR_AKID_SKID_MISMATCH 30 #define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 #define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/x509v3.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/x509v3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/openssl/x509v3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/openssl/x509v3.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,6 +24,7 @@ #ifndef WOLFSSL_x509v3_H #define WOLFSSL_x509v3_H +#include #include #include #include @@ -144,7 +145,7 @@ #define BASIC_CONSTRAINTS_free wolfSSL_BASIC_CONSTRAINTS_free #define AUTHORITY_KEYID_free wolfSSL_AUTHORITY_KEYID_free -#define SSL_CTX_get_cert_store(x) wolfSSL_CTX_get_cert_store ((WOLFSSL_CTX*) (x)) +#define SSL_CTX_get_cert_store(x) wolfSSL_CTX_get_cert_store ((x)) #define ASN1_INTEGER WOLFSSL_ASN1_INTEGER #define ASN1_OCTET_STRING WOLFSSL_ASN1_STRING #define X509V3_EXT_get wolfSSL_X509V3_EXT_get @@ -159,8 +160,8 @@ #define X509V3_EXT_conf_nid wolfSSL_X509V3_EXT_conf_nid #define X509V3_set_ctx wolfSSL_X509V3_set_ctx #ifndef NO_WOLFSSL_STUB -#define X509V3_set_nconf(...) -#define X509V3_EXT_cleanup(...) +#define X509V3_set_nconf(...) WC_DO_NOTHING +#define X509V3_EXT_cleanup(...) WC_DO_NOTHING #endif #define X509V3_set_ctx_test(ctx) wolfSSL_X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST) #define X509V3_set_ctx_nodb wolfSSL_X509V3_set_ctx_nodb diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/options.h.in mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/options.h.in --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/options.h.in 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/options.h.in 2024-08-03 07:30:01.000000000 +0000 @@ -37,4 +37,3 @@ #endif /* WOLFSSL_OPTIONS_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/quic.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/quic.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/quic.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/quic.h 2024-08-03 07:30:01.000000000 +0000 @@ -32,6 +32,8 @@ #ifdef WOLFSSL_QUIC +#include + /* QUIC operates on three encryption levels which determine * which keys/algos are used for de-/encryption. These are * kept separately for incoming and outgoing data and. @@ -52,7 +54,7 @@ struct wolfssl_quic_method_t { /** - * Provide secrets to the QUIC stack when they becaome available in the SSL + * Provide secrets to the QUIC stack when they become available in the SSL * instance during handshake processing. read/write secrets have the same * length. A call may only provide one, passing NULL as the other. */ @@ -288,6 +290,15 @@ const uint8_t* salt, size_t saltlen, const uint8_t* info, size_t infolen); +/* most common QUIC packet size as of 2022 was 1,200 bytes + * largest packet size listed in the RFC is 1,392 bytes + * this gives plenty of breathing room for capacity of records but keeps sizes + * read from the wire sane */ +#ifndef WOLFSSL_QUIC_MAX_RECORD_CAPACITY + /* 1024*1024 -- 1 MB */ + #define WOLFSSL_QUIC_MAX_RECORD_CAPACITY (1048576) +#endif + #endif /* WOLFSSL_QUIC */ #ifdef __cplusplus diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/sniffer.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/sniffer.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer.h 2024-08-03 07:30:01.000000000 +0000 @@ -313,6 +313,35 @@ #endif /* WOLFSSL_ASYNC_CRYPT */ +#ifdef WOLFSSL_SNIFFER_KEYLOGFILE + +typedef enum { + SNIFFER_SECRET_TLS12_MASTER_SECRET, +#if defined(WOLFSSL_TLS13) + SNIFFER_SECRET_CLIENT_EARLY_TRAFFIC_SECRET, + SNIFFER_SECRET_CLIENT_HANDSHAKE_TRAFFIC_SECRET, + SNIFFER_SECRET_SERVER_HANDSHAKE_TRAFFIC_SECRET, + SNIFFER_SECRET_CLIENT_TRAFFIC_SECRET, + SNIFFER_SECRET_SERVER_TRAFFIC_SECRET, +#endif /* WOLFSSL_TLS13 */ + SNIFFER_SECRET_NUM_SECRET_TYPES +} SnifferSecretType; + + +WOLFSSL_API +SSL_SNIFFER_API int ssl_CreateKeyLogSnifferServer(const char* address, + int port, + char* error); + +WOLFSSL_API +SSL_SNIFFER_API int ssl_LoadSecretsFromKeyLogFile(const char* keylogfile, + char* error); + +typedef int (*SSLSnifferSecretCb)(unsigned char* client_random, + int type, + unsigned char* output_secret); + +#endif /* WOLFSSL_SNIFFER_KEYLOGFILE */ #ifdef __cplusplus diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/sniffer_error.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer_error.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/sniffer_error.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer_error.h 2024-08-03 07:30:01.000000000 +0000 @@ -142,6 +142,8 @@ #define SNIFFER_KEY_SETUP_STR 96 #define UNSUPPORTED_TLS_VER_STR 97 #define KEY_MISMATCH_STR 98 + +#define KEYLOG_FILE_INVALID 99 /* !!!! also add to msgTable in sniffer.c and .rc file !!!! */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/sniffer_error.rc mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer_error.rc --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/sniffer_error.rc 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/sniffer_error.rc 2024-08-03 07:30:01.000000000 +0000 @@ -1,5 +1,5 @@ -STRINGTABLE +STRINGTABLE { 1, "Out of Memory" 2, "New SSL Sniffer Server Registered" @@ -60,7 +60,7 @@ 48, "Wrong Protocol type" 49, "Packet Short for header processing" 50, "Got Unknown Record Type" - + 51, "Can't Open Trace File" 52, "Session in Fatal Error State" 53, "Partial SSL record received" @@ -72,7 +72,7 @@ 58, "Received an Overlap Duplicate Packet" 59, "Received an Overlap Reassembly Begin Duplicate Packet" 60, "Received an Overlap Reassembly End Duplicate Packet" - + 61, "Missed the Client Hello Entirely" 62, "Got Hello Request msg" 63, "Got Session Ticket msg" @@ -118,4 +118,6 @@ 96, "Setting up keys" 97, "Unsupported TLS Version" 98, "Server Client Key Mismatch" + + 99, "Invalid or missing keylog file" } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/ssl.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/ssl.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/ssl.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/ssl.h 2024-08-03 07:30:01.000000000 +0000 @@ -37,6 +37,7 @@ #include #include #include +#include /* For the types */ #include @@ -152,8 +153,6 @@ typedef struct WOLFSSL_CRL WOLFSSL_CRL; typedef struct WOLFSSL_X509_STORE_CTX WOLFSSL_X509_STORE_CTX; -typedef int (*WOLFSSL_X509_STORE_CTX_verify_cb)(int, WOLFSSL_X509_STORE_CTX *); - typedef struct WOLFSSL_BY_DIR_HASH WOLFSSL_BY_DIR_HASH; typedef struct WOLFSSL_BY_DIR_entry WOLFSSL_BY_DIR_entry; typedef struct WOLFSSL_BY_DIR WOLFSSL_BY_DIR; @@ -228,6 +227,12 @@ typedef struct WOLFSSL_CONF_CTX WOLFSSL_CONF_CTX; +typedef int (*WOLFSSL_X509_STORE_CTX_verify_cb)(int, WOLFSSL_X509_STORE_CTX *); +typedef int (*WOLFSSL_X509_STORE_CTX_get_crl_cb)(WOLFSSL_X509_STORE_CTX *, + WOLFSSL_X509_CRL **, WOLFSSL_X509 *); +typedef int (*WOLFSSL_X509_STORE_CTX_check_crl_cb)(WOLFSSL_X509_STORE_CTX *, + WOLFSSL_X509_CRL *); + #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || defined(HAVE_CURL) struct WOLFSSL_OBJ_NAME { @@ -525,6 +530,9 @@ wolfssl_BIO_meth_ctrl_info_cb ctrlInfoCb; }; +#define WOLFSSL_BIO_METHOD_INIT(bio_type) \ + { bio_type, { 0 }, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } + /* wolfSSL BIO type */ typedef long (*wolf_bio_info_cb)(WOLFSSL_BIO *bio, int event, const char *parg, int iarg, long larg, long return_value); @@ -600,6 +608,7 @@ #endif #if defined(OPENSSL_ALL) || defined(WOLFSSL_QT) WOLFSSL_X509_STORE_CTX_verify_cb verify_cb; + WOLFSSL_X509_STORE_CTX_get_crl_cb get_crl_cb; #endif #ifdef HAVE_EX_DATA WOLFSSL_CRYPTO_EX_DATA ex_data; @@ -701,6 +710,7 @@ int totalCerts; /* number of peer cert buffers */ WOLFSSL_BUFFER_INFO* certs; /* peer certs */ WOLFSSL_X509_STORE_CTX_verify_cb verify_cb; /* verify callback */ + void* heap; }; typedef char* WOLFSSL_STRING; @@ -790,9 +800,9 @@ * functions should use this macro to fill this gap. Users who want them * to return the same return value as OpenSSL can define * WOLFSSL_ERR_CODE_OPENSSL. - * Give item1 a variable that contains the potentially negative + * Give rc a variable that contains the potentially negative * wolfSSL-defined return value or the return value itself, and - * give item2 the openSSL-defined return value. + * give fail_rc the openSSL-defined return value. * Note that this macro replaces only negative return values with the * specified value. * Since wolfSSL 4.7.0, the following functions use this macro: @@ -801,11 +811,15 @@ * - wolfSSL_EVP_PKEY_cmp */ #if defined(WOLFSSL_ERROR_CODE_OPENSSL) - #define WS_RETURN_CODE(item1,item2) \ - (((item1) < 0) ? (int)(item2) : (int)(item1)) + #define WS_RETURN_CODE(rc, fail_rc) \ + (((rc) < 0) ? (int)(fail_rc) : (int)(rc)) #else - #define WS_RETURN_CODE(item1,item2) (item1) + #define WS_RETURN_CODE(rc, fail_rc) (rc) #endif +#define WS_RC(rc) \ + (((rc) == 1) ? 1 : 0) +#define WC_TO_WS_RC(ret) \ + (((ret) == 0) ? 1 : (ret)) /* Maximum master key length (SECRET_LEN) */ #define WOLFSSL_MAX_MASTER_KEY_LENGTH 48 @@ -1053,16 +1067,21 @@ WOLFSSL_CTX* ctx, const char* file, int format); WOLFSSL_ABI WOLFSSL_API int wolfSSL_CTX_use_PrivateKey_file( WOLFSSL_CTX* ctx, const char* file, int format); - -#endif +#ifdef WOLFSSL_DUAL_ALG_CERTS +WOLFSSL_API int wolfSSL_CTX_use_AltPrivateKey_file( + WOLFSSL_CTX* ctx, const char* file, int format); +#endif /* WOLFSSL_DUAL_ALG_CERTS */ +#endif /* !NO_FILESYSTEM && !NO_CERTS */ #ifndef NO_CERTS #define WOLFSSL_LOAD_FLAG_NONE 0x00000000 #define WOLFSSL_LOAD_FLAG_IGNORE_ERR 0x00000001 #define WOLFSSL_LOAD_FLAG_DATE_ERR_OKAY 0x00000002 #define WOLFSSL_LOAD_FLAG_PEM_CA_ONLY 0x00000004 -#if defined(WOLFSSL_QT) +#if defined(WOLFSSL_QT) || defined(WOLFSSL_IGNORE_BAD_CERT_PATH) #define WOLFSSL_LOAD_FLAG_IGNORE_BAD_PATH_ERR 0x00000008 +#endif +#if defined(WOLFSSL_QT) #define WOLFSSL_LOAD_FLAG_IGNORE_ZEROFILE 0x00000010 #endif @@ -1122,14 +1141,19 @@ WOLFSSL_ABI WOLFSSL_API WOLFSSL_CTX* wolfSSL_CTX_new(WOLFSSL_METHOD* method); WOLFSSL_API int wolfSSL_CTX_up_ref(WOLFSSL_CTX* ctx); #ifdef OPENSSL_EXTRA +WOLFSSL_API int wolfSSL_set_ecdh_auto(WOLFSSL* ssl, int onoff); WOLFSSL_API int wolfSSL_CTX_set_ecdh_auto(WOLFSSL_CTX* ctx, int onoff); WOLFSSL_API int wolfSSL_get_signature_nid(WOLFSSL* ssl, int* nid); +WOLFSSL_API int wolfSSL_get_signature_type_nid(const WOLFSSL* ssl, int* nid); +WOLFSSL_API int wolfSSL_get_peer_signature_nid(WOLFSSL* ssl, int* nid); +WOLFSSL_API int wolfSSL_get_peer_signature_type_nid(const WOLFSSL* ssl, + int* nid); WOLFSSL_API int wolfSSL_CTX_set1_sigalgs_list(WOLFSSL_CTX* ctx, const char* list); WOLFSSL_API int wolfSSL_set1_sigalgs_list(WOLFSSL* ssl, const char* list); #endif WOLFSSL_ABI WOLFSSL_API WOLFSSL* wolfSSL_new(WOLFSSL_CTX* ctx); -WOLFSSL_API WOLFSSL_CTX* wolfSSL_get_SSL_CTX(WOLFSSL* ssl); +WOLFSSL_API WOLFSSL_CTX* wolfSSL_get_SSL_CTX(const WOLFSSL* ssl); WOLFSSL_API WOLFSSL_X509_VERIFY_PARAM* wolfSSL_CTX_get0_param(WOLFSSL_CTX* ctx); WOLFSSL_API WOLFSSL_X509_VERIFY_PARAM* wolfSSL_get0_param(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_CTX_set1_param(WOLFSSL_CTX* ctx, WOLFSSL_X509_VERIFY_PARAM *vpm); @@ -1165,6 +1189,21 @@ WOLFSSL_ABI WOLFSSL_API int wolfSSL_accept(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_CTX_mutual_auth(WOLFSSL_CTX* ctx, int req); WOLFSSL_API int wolfSSL_mutual_auth(WOLFSSL* ssl, int req); + +WOLFSSL_API int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, + int count); +WOLFSSL_API int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count); +#if defined(OPENSSL_EXTRA) && defined(HAVE_SUPPORTED_CURVES) +WOLFSSL_API int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups, + int count); +WOLFSSL_API int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count); + +#ifdef HAVE_ECC +WOLFSSL_API int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, const char *list); +WOLFSSL_API int wolfSSL_set1_groups_list(WOLFSSL *ssl, const char *list); +#endif +#endif + #ifdef WOLFSSL_TLS13 WOLFSSL_API int wolfSSL_send_hrr_cookie(WOLFSSL* ssl, const unsigned char* secret, unsigned int secretSz); @@ -1181,19 +1220,7 @@ WOLFSSL_API int wolfSSL_allow_post_handshake_auth(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_request_certificate(WOLFSSL* ssl); -WOLFSSL_API int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, char *list); -WOLFSSL_API int wolfSSL_set1_groups_list(WOLFSSL *ssl, char *list); - WOLFSSL_API int wolfSSL_preferred_group(WOLFSSL* ssl); -WOLFSSL_API int wolfSSL_CTX_set_groups(WOLFSSL_CTX* ctx, int* groups, - int count); -WOLFSSL_API int wolfSSL_set_groups(WOLFSSL* ssl, int* groups, int count); - -#ifdef OPENSSL_EXTRA -WOLFSSL_API int wolfSSL_CTX_set1_groups(WOLFSSL_CTX* ctx, int* groups, - int count); -WOLFSSL_API int wolfSSL_set1_groups(WOLFSSL* ssl, int* groups, int count); -#endif WOLFSSL_API int wolfSSL_connect_TLSv13(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_accept_TLSv13(WOLFSSL* ssl); @@ -1222,6 +1249,7 @@ WOLFSSL_ABI WOLFSSL_API void wolfSSL_CTX_free(WOLFSSL_CTX* ctx); WOLFSSL_ABI WOLFSSL_API void wolfSSL_free(WOLFSSL* ssl); WOLFSSL_ABI WOLFSSL_API int wolfSSL_shutdown(WOLFSSL* ssl); +WOLFSSL_API int wolfSSL_SendUserCanceled(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_send(WOLFSSL* ssl, const void* data, int sz, int flags); WOLFSSL_API int wolfSSL_recv(WOLFSSL* ssl, void* data, int sz, int flags); @@ -1233,6 +1261,7 @@ WOLFSSL_ABI WOLFSSL_API int wolfSSL_set_session(WOLFSSL* ssl, WOLFSSL_SESSION* session); WOLFSSL_API long wolfSSL_SSL_SESSION_set_timeout(WOLFSSL_SESSION* ses, long t); +WOLFSSL_API long wolfSSL_SESSION_set_time(WOLFSSL_SESSION *ses, long t); WOLFSSL_ABI WOLFSSL_API WOLFSSL_SESSION* wolfSSL_get_session(WOLFSSL* ssl); WOLFSSL_ABI WOLFSSL_API void wolfSSL_flush_sessions(WOLFSSL_CTX* ctx, long tm); WOLFSSL_API void wolfSSL_CTX_flush_sessions(WOLFSSL_CTX* ctx, long tm); @@ -1346,8 +1375,17 @@ #ifdef HAVE_SECRET_CALLBACK typedef int (*SessionSecretCb)(WOLFSSL* ssl, void* secret, int* secretSz, void* ctx); -WOLFSSL_API int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb, - void*); +/* This callback is used to set the master secret during resumption */ +WOLFSSL_API int wolfSSL_set_session_secret_cb(WOLFSSL* ssl, SessionSecretCb cb, + void* ctx); +typedef int (*TicketParseCb)(WOLFSSL *ssl, const unsigned char *data, + int len, void *ctx); +WOLFSSL_API int wolfSSL_set_session_ticket_ext_cb(WOLFSSL* ssl, + TicketParseCb cb, void *ctx); +typedef int (*TlsSecretCb)(WOLFSSL* ssl, void* secret, int secretSz, + void* ctx); +/* This callback is used to log the secret for TLS <= 1.2 */ +WOLFSSL_API int wolfSSL_set_secret_cb(WOLFSSL* ssl, TlsSecretCb cb, void* ctx); #ifdef WOLFSSL_TLS13 typedef int (*Tls13SecretCb)(WOLFSSL* ssl, int id, const unsigned char* secret, int secretSz, void* ctx); @@ -1470,8 +1508,10 @@ } WOLFSSL_SRTP_PROTECTION_PROFILE; /* Compatibility API's for SRTP */ -WOLFSSL_API int wolfSSL_CTX_set_tlsext_use_srtp(WOLFSSL_CTX* ctx, const char*); -WOLFSSL_API int wolfSSL_set_tlsext_use_srtp(WOLFSSL* ssl, const char*); +WOLFSSL_API int wolfSSL_CTX_set_tlsext_use_srtp(WOLFSSL_CTX* ctx, + const char* profile_str); +WOLFSSL_API int wolfSSL_set_tlsext_use_srtp(WOLFSSL* ssl, + const char* wolfSSL_set_tlsext_use_srtp); WOLFSSL_API const WOLFSSL_SRTP_PROTECTION_PROFILE* wolfSSL_get_selected_srtp_profile(WOLFSSL* ssl); WOLFSSL_API WOLF_STACK_OF(WOLFSSL_SRTP_PROTECTION_PROFILE)* @@ -1479,7 +1519,7 @@ /* Non standard API for getting the SRTP session keys using KDF */ WOLFSSL_API int wolfSSL_export_dtls_srtp_keying_material(WOLFSSL* ssl, - unsigned char*, size_t*); + unsigned char* out, size_t* olen); #endif /* WOLFSSL_SRTP */ WOLFSSL_API int wolfSSL_dtls_get_drop_stats(WOLFSSL* ssl, @@ -1518,11 +1558,13 @@ WOLFSSL_API void wolfSSL_sk_free(WOLFSSL_STACK* sk); WOLFSSL_API void wolfSSL_sk_free_node(WOLFSSL_STACK* in); WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_dup(WOLFSSL_STACK* sk); +WOLFSSL_API WOLFSSL_STACK* wolfSSL_shallow_sk_dup(WOLFSSL_STACK* sk); WOLFSSL_API int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in); WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx); WOLFSSL_API int wolfSSL_sk_push(WOLFSSL_STACK *st, const void *data); -#if defined(HAVE_OCSP) || defined(HAVE_CRL) +#if defined(HAVE_OCSP) || defined(HAVE_CRL) || (defined(WOLFSSL_CUSTOM_OID) && \ + defined(WOLFSSL_ASN_TEMPLATE) && defined(HAVE_OID_DECODING)) #include "wolfssl/wolfcrypt/asn.h" #endif @@ -1561,6 +1603,8 @@ WOLFSSL_API int wolfSSL_GENERAL_NAME_set0_othername(WOLFSSL_GENERAL_NAME* gen, WOLFSSL_ASN1_OBJECT* oid, WOLFSSL_ASN1_TYPE* value); +WOLFSSL_API void wolfSSL_GENERAL_NAME_set0_value(WOLFSSL_GENERAL_NAME *a, + int type, void *value); WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_GENERAL_NAME_new(void *cmpFunc); WOLFSSL_API int wolfSSL_sk_GENERAL_NAME_push(WOLFSSL_GENERAL_NAMES* sk, @@ -1574,6 +1618,7 @@ WOLFSSL_API void wolfSSL_GENERAL_NAMES_free(WOLFSSL_GENERAL_NAMES* name); WOLFSSL_API int wolfSSL_GENERAL_NAME_print(WOLFSSL_BIO* out, WOLFSSL_GENERAL_NAME* name); +WOLFSSL_API void wolfSSL_EXTENDED_KEY_USAGE_free(WOLFSSL_STACK * sk); WOLFSSL_API WOLFSSL_DIST_POINT* wolfSSL_DIST_POINT_new(void); WOLFSSL_API void wolfSSL_DIST_POINT_free(WOLFSSL_DIST_POINT* dp); @@ -1637,6 +1682,11 @@ WOLFSSL_API void wolfSSL_set_connect_state(WOLFSSL* ssl); WOLFSSL_API void wolfSSL_set_accept_state(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_session_reused(WOLFSSL* ssl); +#ifdef OPENSSL_EXTRA +/* using unsigned char instead of uint8_t here to avoid stdint include */ +WOLFSSL_API unsigned char wolfSSL_SESSION_get_max_fragment_length( + WOLFSSL_SESSION* session); +#endif WOLFSSL_API int wolfSSL_SESSION_up_ref(WOLFSSL_SESSION* session); WOLFSSL_API WOLFSSL_SESSION* wolfSSL_SESSION_dup(WOLFSSL_SESSION* session); WOLFSSL_API WOLFSSL_SESSION* wolfSSL_SESSION_new(void); @@ -1646,7 +1696,7 @@ WOLFSSL_SESSION* session); WOLFSSL_API int wolfSSL_SESSION_set_cipher(WOLFSSL_SESSION* session, const WOLFSSL_CIPHER* cipher); -WOLFSSL_API int wolfSSL_is_init_finished(WOLFSSL* ssl); +WOLFSSL_API int wolfSSL_is_init_finished(const WOLFSSL* ssl); WOLFSSL_API const char* wolfSSL_get_version(const WOLFSSL* ssl); WOLFSSL_API int wolfSSL_get_current_cipher_suite(WOLFSSL* ssl); @@ -1665,8 +1715,10 @@ WOLFSSL_API const char* wolfSSL_get_cipher(WOLFSSL* ssl); WOLFSSL_API void wolfSSL_sk_CIPHER_free(WOLF_STACK_OF(WOLFSSL_CIPHER)* sk); WOLFSSL_API WOLFSSL_SESSION* wolfSSL_get1_session(WOLFSSL* ssl); +WOLFSSL_API int wolfSSL_SessionIsSetup(WOLFSSL_SESSION* session); WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_new(void); +WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_new_ex(void* heap); WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_dup(WOLFSSL_X509* x); #if defined(OPENSSL_EXTRA_X509_SMALL) || defined(OPENSSL_EXTRA) WOLFSSL_API int wolfSSL_RSA_up_ref(WOLFSSL_RSA* rsa); @@ -1683,7 +1735,7 @@ #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L WOLFSSL_API WOLFSSL_BIO* wolfSSL_BIO_new(const WOLFSSL_BIO_METHOD* method); #else -WOLFSSL_API WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD*); +WOLFSSL_API WOLFSSL_BIO* wolfSSL_BIO_new(WOLFSSL_BIO_METHOD* method); #endif WOLFSSL_API int wolfSSL_BIO_free(WOLFSSL_BIO* bio); WOLFSSL_API void wolfSSL_BIO_vfree(WOLFSSL_BIO* bio); @@ -1739,6 +1791,8 @@ WOLFSSL_API int wolfSSL_BIO_get_shutdown(WOLFSSL_BIO* bio); WOLFSSL_API void wolfSSL_BIO_clear_retry_flags(WOLFSSL_BIO* bio); WOLFSSL_API int wolfSSL_BIO_should_retry(WOLFSSL_BIO *bio); +WOLFSSL_API int wolfSSL_BIO_should_read(WOLFSSL_BIO *bio); +WOLFSSL_API int wolfSSL_BIO_should_write(WOLFSSL_BIO *bio); WOLFSSL_API WOLFSSL_BIO_METHOD *wolfSSL_BIO_meth_new(int type, const char* name); WOLFSSL_API void wolfSSL_BIO_meth_free(WOLFSSL_BIO_METHOD* biom); @@ -1774,6 +1828,7 @@ WOLFSSL_API long wolfSSL_BIO_set_conn_port(WOLFSSL_BIO *b, char* port); WOLFSSL_API long wolfSSL_BIO_do_connect(WOLFSSL_BIO *b); WOLFSSL_API int wolfSSL_BIO_do_accept(WOLFSSL_BIO *b); +WOLFSSL_API WOLFSSL_BIO* wolfSSL_BIO_new_ssl(WOLFSSL_CTX* ctx, int client); WOLFSSL_API WOLFSSL_BIO* wolfSSL_BIO_new_ssl_connect(WOLFSSL_CTX* ctx); WOLFSSL_API long wolfSSL_BIO_do_handshake(WOLFSSL_BIO *b); @@ -1796,6 +1851,10 @@ WOLFSSL_API int wolfSSL_BIO_write_filename(WOLFSSL_BIO *bio, char *name); WOLFSSL_API long wolfSSL_BIO_set_mem_eof_return(WOLFSSL_BIO *bio, int v); WOLFSSL_API long wolfSSL_BIO_get_mem_ptr(WOLFSSL_BIO *bio, WOLFSSL_BUF_MEM **m); +#ifdef OPENSSL_ALL +WOLFSSL_API int wolfSSL_BIO_set_mem_buf(WOLFSSL_BIO* bio, WOLFSSL_BUF_MEM* bufMem, + int closeFlag); +#endif WOLFSSL_API int wolfSSL_BIO_get_len(WOLFSSL_BIO *bio); #endif @@ -1815,8 +1874,10 @@ WOLFSSL_API unsigned long wolfSSL_thread_id(void); WOLFSSL_API void wolfSSL_set_id_callback(unsigned long (*f)(void)); -WOLFSSL_API void wolfSSL_set_locking_callback(void (*f)(int, int, const char*, - int)); +#if defined(OPENSSL_EXTRA) || defined(HAVE_WEBSERVER) +WOLFSSL_API void wolfSSL_set_locking_callback(mutex_cb* f); +WOLFSSL_API mutex_cb* wolfSSL_get_locking_callback(void); +#endif WOLFSSL_API void wolfSSL_set_dynlock_create_callback(WOLFSSL_dynlock_value* (*f) (const char*, int)); WOLFSSL_API void wolfSSL_set_dynlock_lock_callback(void (*f)(int, @@ -1834,6 +1895,10 @@ WOLFSSL_X509_STORE_CTX_verify_cb verify_cb); WOLFSSL_API void wolfSSL_X509_STORE_set_verify_cb(WOLFSSL_X509_STORE *st, WOLFSSL_X509_STORE_CTX_verify_cb verify_cb); +WOLFSSL_API void wolfSSL_X509_STORE_set_get_crl(WOLFSSL_X509_STORE *st, + WOLFSSL_X509_STORE_CTX_get_crl_cb get_cb); +WOLFSSL_API void wolfSSL_X509_STORE_set_check_crl(WOLFSSL_X509_STORE *st, + WOLFSSL_X509_STORE_CTX_check_crl_cb check_crl); WOLFSSL_API int wolfSSL_i2d_X509_NAME(WOLFSSL_X509_NAME* n, unsigned char** out); WOLFSSL_API int wolfSSL_i2d_X509_NAME_canon(WOLFSSL_X509_NAME* name, @@ -1895,8 +1960,12 @@ WOLFSSL_API int wolfSSL_X509_set_pubkey(WOLFSSL_X509* cert, WOLFSSL_EVP_PKEY* pkey); WOLFSSL_API int wolfSSL_X509_set_notAfter(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t); +WOLFSSL_API int wolfSSL_X509_set1_notAfter(WOLFSSL_X509* x509, + const WOLFSSL_ASN1_TIME *t); WOLFSSL_API int wolfSSL_X509_set_notBefore(WOLFSSL_X509* x509, const WOLFSSL_ASN1_TIME* t); +WOLFSSL_API int wolfSSL_X509_set1_notBefore(WOLFSSL_X509* x509, + const WOLFSSL_ASN1_TIME *t); WOLFSSL_API WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notBefore(const WOLFSSL_X509* x509); WOLFSSL_API WOLFSSL_ASN1_TIME* wolfSSL_X509_get_notAfter(const WOLFSSL_X509* x509); WOLFSSL_API int wolfSSL_X509_set_serialNumber(WOLFSSL_X509* x509, @@ -1953,6 +2022,8 @@ WOLFSSL_API int wolfSSL_X509_STORE_up_ref(WOLFSSL_X509_STORE* store); WOLFSSL_API int wolfSSL_X509_STORE_add_cert( WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509); +WOLFSSL_API WOLFSSL_X509_VERIFY_PARAM *wolfSSL_X509_STORE_get0_param( + const WOLFSSL_X509_STORE *ctx); WOLFSSL_API WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get_chain( WOLFSSL_X509_STORE_CTX* ctx); WOLFSSL_API WOLFSSL_STACK* wolfSSL_X509_STORE_CTX_get1_chain( @@ -1964,7 +2035,10 @@ WOLFSSL_API int wolfSSL_X509_STORE_set_default_paths(WOLFSSL_X509_STORE* store); WOLFSSL_API int wolfSSL_X509_STORE_get_by_subject(WOLFSSL_X509_STORE_CTX* ctx, int idx, WOLFSSL_X509_NAME* name, WOLFSSL_X509_OBJECT* obj); +WOLFSSL_API WOLFSSL_X509_VERIFY_PARAM *wolfSSL_X509_STORE_CTX_get0_param( + WOLFSSL_X509_STORE_CTX *ctx); WOLFSSL_API WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new(void); +WOLFSSL_API WOLFSSL_X509_STORE_CTX* wolfSSL_X509_STORE_CTX_new_ex(void* heap); WOLFSSL_API int wolfSSL_X509_STORE_CTX_init(WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_STORE* store, WOLFSSL_X509* x509, WOLF_STACK_OF(WOLFSSL_X509)*); WOLFSSL_API void wolfSSL_X509_STORE_CTX_free(WOLFSSL_X509_STORE_CTX* ctx); @@ -2100,6 +2174,19 @@ typedef int (*CertSetupCallback)(WOLFSSL* ssl, void*); WOLFSSL_API void wolfSSL_CTX_set_cert_cb(WOLFSSL_CTX* ctx, CertSetupCallback cb, void *arg); +WOLFSSL_API int wolfSSL_get_client_suites_sigalgs(const WOLFSSL* ssl, + const byte** suites, word16* suiteSz, + const byte** hashSigAlgo, word16* hashSigAlgoSz); +typedef struct WOLFSSL_CIPHERSUITE_INFO { + byte rsaAuth:1; + byte eccAuth:1; + byte eccStatic:1; + byte psk:1; +} WOLFSSL_CIPHERSUITE_INFO; +WOLFSSL_API WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first, + byte second); +WOLFSSL_API int wolfSSL_get_sigalg_info(byte first, + byte second, int* hashAlgo, int* sigAlgo); WOLFSSL_LOCAL int CertSetupCbWrapper(WOLFSSL* ssl); WOLFSSL_API void* wolfSSL_X509_STORE_CTX_get_ex_data( @@ -2148,6 +2235,8 @@ WOLFSSL_API void wolfSSL_CTX_set_info_callback(WOLFSSL_CTX* ctx, void (*f)(const WOLFSSL* ssl, int type, int val)); +WOLFSSL_API void wolfSSL_set_info_callback(WOLFSSL* ssl, + void (*f)(const WOLFSSL* ssl, int type, int val)); WOLFSSL_API unsigned long wolfSSL_ERR_peek_error(void); WOLFSSL_API int wolfSSL_GET_REASON(int); @@ -2250,26 +2339,27 @@ WOLFSSL_OP_TLS_D5_BUG = 0x00000080, WOLFSSL_OP_TLS_BLOCK_PADDING_BUG = 0x00000100, WOLFSSL_OP_TLS_ROLLBACK_BUG = 0x00000200, + WOLFSSL_OP_NO_RENEGOTIATION = 0x00000400, WOLFSSL_OP_EPHEMERAL_RSA = 0x00000800, - WOLFSSL_OP_NO_SSLv3 = 0x00001000, - WOLFSSL_OP_NO_TLSv1 = 0x00002000, + WOLFSSL_OP_NO_SSLv3 = 0x00001000, + WOLFSSL_OP_NO_TLSv1 = 0x00002000, WOLFSSL_OP_PKCS1_CHECK_1 = 0x00004000, WOLFSSL_OP_PKCS1_CHECK_2 = 0x00008000, WOLFSSL_OP_NETSCAPE_CA_DN_BUG = 0x00010000, WOLFSSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG = 0x00020000, - WOLFSSL_OP_SINGLE_DH_USE = 0x00040000, + WOLFSSL_OP_SINGLE_DH_USE = 0x00040000, WOLFSSL_OP_NO_TICKET = 0x00080000, WOLFSSL_OP_DONT_INSERT_EMPTY_FRAGMENTS = 0x00100000, WOLFSSL_OP_NO_QUERY_MTU = 0x00200000, WOLFSSL_OP_COOKIE_EXCHANGE = 0x00400000, WOLFSSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION = 0x00800000, - WOLFSSL_OP_SINGLE_ECDH_USE = 0x01000000, - WOLFSSL_OP_CIPHER_SERVER_PREFERENCE = 0x02000000, - WOLFSSL_OP_NO_TLSv1_1 = 0x04000000, - WOLFSSL_OP_NO_TLSv1_2 = 0x08000000, - WOLFSSL_OP_NO_COMPRESSION = 0x10000000, - WOLFSSL_OP_NO_TLSv1_3 = 0x20000000, - WOLFSSL_OP_NO_SSLv2 = 0x40000000, + WOLFSSL_OP_SINGLE_ECDH_USE = 0x01000000, + WOLFSSL_OP_CIPHER_SERVER_PREFERENCE = 0x02000000, + WOLFSSL_OP_NO_TLSv1_1 = 0x04000000, + WOLFSSL_OP_NO_TLSv1_2 = 0x08000000, + WOLFSSL_OP_NO_COMPRESSION = 0x10000000, + WOLFSSL_OP_NO_TLSv1_3 = 0x20000000, + WOLFSSL_OP_NO_SSLv2 = 0x40000000, WOLFSSL_OP_ALL = (WOLFSSL_OP_MICROSOFT_SESS_ID_BUG | WOLFSSL_OP_NETSCAPE_CHALLENGE_BUG @@ -2285,7 +2375,7 @@ }; #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ - defined(HAVE_WEBSERVER) + defined(HAVE_WEBSERVER) || defined(HAVE_MEMCACHED) /* for compatibility these must be macros */ #define SSL_OP_MICROSOFT_SESS_ID_BUG WOLFSSL_OP_MICROSOFT_SESS_ID_BUG @@ -2386,8 +2476,8 @@ * limit the possibility of an infinite retry loop */ SSL_MODE_RELEASE_BUFFERS = -1, /* For libwebsockets build. No current use. */ - /* Errors used in wolfSSL. - * Should map the defines in wolfssl/openssl/x509.h + /* Errors used in wolfSSL. utilize the values from the defines in + * wolfssl/openssl/x509.h, but without the WOLFSSL_ prefix. */ WOLFSSL_X509_V_OK = 0, WOLFSSL_X509_V_ERR_CERT_SIGNATURE_FAILURE = 7, @@ -2492,7 +2582,8 @@ WOLFSSL_FAILURE = 0, /* for some functions */ WOLFSSL_SUCCESS = 1, -/* WOLFSSL_SHUTDOWN_NOT_DONE is returned by wolfSSL_shutdown when the other end +/* WOLFSSL_SHUTDOWN_NOT_DONE is returned by wolfSSL_shutdown and + * wolfSSL_SendUserCanceled when the other end * of the connection has yet to send its close notify alert as part of the * bidirectional shutdown. To complete the shutdown, either keep calling * wolfSSL_shutdown until it returns WOLFSSL_SUCCESS or call wolfSSL_read until @@ -2535,7 +2626,9 @@ WOLFSSL_SESS_CACHE_NO_AUTO_CLEAR = 0x0008, WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP = 0x0100, WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE = 0x0200, - WOLFSSL_SESS_CACHE_NO_INTERNAL = 0x0300, + WOLFSSL_SESS_CACHE_NO_INTERNAL = + (WOLFSSL_SESS_CACHE_NO_INTERNAL_STORE | + WOLFSSL_SESS_CACHE_NO_INTERNAL_LOOKUP), WOLFSSL_ERROR_WANT_READ = 2, WOLFSSL_ERROR_WANT_WRITE = 3, @@ -2844,6 +2937,9 @@ const unsigned char** in, int len); WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_d2i(WOLFSSL_X509** x509, const unsigned char* in, int len); +WOLFSSL_API WOLFSSL_X509* + wolfSSL_X509_d2i_ex(WOLFSSL_X509** x509, const unsigned char* in, int len, + void* heap); #ifdef WOLFSSL_CERT_REQ WOLFSSL_API WOLFSSL_X509* wolfSSL_X509_REQ_d2i(WOLFSSL_X509** x509, const unsigned char* in, int len); @@ -2871,6 +2967,7 @@ byte* in, int* inOutSz); #endif #if defined(HAVE_CRL) && (defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL)) +WOLFSSL_API WOLFSSL_X509_CRL* wolfSSL_X509_CRL_dup(const WOLFSSL_X509_CRL* crl); WOLFSSL_API void wolfSSL_X509_CRL_free(WOLFSSL_X509_CRL *crl); #endif @@ -2911,7 +3008,6 @@ /* PKCS12 compatibility */ -typedef struct WC_PKCS12 WC_PKCS12; WOLFSSL_API WC_PKCS12* wolfSSL_d2i_PKCS12_bio(WOLFSSL_BIO* bio, WC_PKCS12** pkcs12); WOLFSSL_API int wolfSSL_i2d_PKCS12_bio(WOLFSSL_BIO *bio, WC_PKCS12 *pkcs12); @@ -2991,23 +3087,26 @@ #ifdef __PPU #include #include - #elif !defined(WOLFSSL_MDK_ARM) && !defined(WOLFSSL_IAR_ARM) && \ + #elif defined(ARDUINO) + /* TODO board specific */ + #elif !defined(WOLFSSL_MDK_ARM) && !defined(WOLFSSL_IAR_ARM) && \ !defined(WOLFSSL_PICOTCP) && !defined(WOLFSSL_ROWLEY_ARM) && \ - !defined(WOLFSSL_EMBOS) && !defined(WOLFSSL_FROSTED) && \ - !defined(WOLFSSL_CHIBIOS) && !defined(WOLFSSL_CONTIKI) && \ - !defined(WOLFSSL_ZEPHYR) && !defined(NETOS) + !defined(WOLFSSL_EMBOS) && !defined(WOLFSSL_FROSTED) && \ + !defined(WOLFSSL_CHIBIOS) && !defined(WOLFSSL_CONTIKI) && \ + !defined(WOLFSSL_ZEPHYR) && !defined(NETOS) #include #endif /* allow writev style writing */ WOLFSSL_API int wolfSSL_writev(WOLFSSL* ssl, const struct iovec* iov, int iovcnt); - #endif -#endif + #endif /* !NO_WRITEV */ +#endif /* !_WIN32 */ #ifndef NO_CERTS /* SSL_CTX versions */ WOLFSSL_API int wolfSSL_CTX_UnloadCAs(WOLFSSL_CTX* ctx); + WOLFSSL_API int wolfSSL_CTX_UnloadIntermediateCerts(WOLFSSL_CTX* ctx); #ifdef WOLFSSL_TRUST_PEER_CERT WOLFSSL_API int wolfSSL_CTX_Unload_trust_peers(WOLFSSL_CTX* ctx); #ifdef WOLFSSL_LOCAL_X509_STORE @@ -3040,6 +3139,17 @@ const unsigned char* in, long sz, int format); WOLFSSL_API int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, long sz); +#ifdef WOLFSSL_DUAL_ALG_CERTS + WOLFSSL_API int wolfSSL_CTX_use_AltPrivateKey_buffer(WOLFSSL_CTX* ctx, + const unsigned char* in, long sz, int format); + WOLFSSL_API int wolfSSL_CTX_use_AltPrivateKey_id(WOLFSSL_CTX* ctx, + const unsigned char* id, long sz, + int devId, long keySz); + WOLFSSL_API int wolfSSL_CTX_use_AltPrivateKey_Id(WOLFSSL_CTX* ctx, + const unsigned char* id, long sz, int devId); + WOLFSSL_API int wolfSSL_CTX_use_AltPrivateKey_Label(WOLFSSL_CTX* ctx, + const char* label, int devId); +#endif /* SSL versions */ WOLFSSL_API int wolfSSL_use_certificate_buffer(WOLFSSL* ssl, const unsigned char* in, @@ -3058,6 +3168,17 @@ WOLFSSL_API int wolfSSL_use_certificate_chain_buffer(WOLFSSL* ssl, const unsigned char* in, long sz); WOLFSSL_API int wolfSSL_UnloadCertsKeys(WOLFSSL* ssl); +#ifdef WOLFSSL_DUAL_ALG_CERTS + WOLFSSL_API int wolfSSL_use_AltPrivateKey_buffer(WOLFSSL* ssl, + const unsigned char* in, long sz, int format); + WOLFSSL_API int wolfSSL_use_AltPrivateKey_id(WOLFSSL* ssl, + const unsigned char* id, long sz, + int devId, long keySz); + WOLFSSL_API int wolfSSL_use_AltPrivateKey_Id(WOLFSSL* ssl, + const unsigned char* id, long sz, int devId); + WOLFSSL_API int wolfSSL_use_AltPrivateKey_Label(WOLFSSL* ssl, + const char* label, int devId); +#endif #if (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL)) && \ defined(KEEP_OUR_CERT) @@ -3227,7 +3348,11 @@ wolfssl_aes_gcm = 7, wolfssl_aes_ccm = 8, wolfssl_chacha = 9, - wolfssl_camellia = 10 + wolfssl_camellia = 10, + wolfssl_sm4_cbc = 11, + wolfssl_sm4_gcm = 12, + wolfssl_sm4_ccm = 13, + wolfssl_aria_gcm = 14 }; @@ -3235,7 +3360,8 @@ enum KDF_MacAlgorithm { wolfssl_sha256 = 4, /* needs to match hash.h wc_MACAlgorithm */ wolfssl_sha384, - wolfssl_sha512 + wolfssl_sha512, + wolfssl_sm3 = 9 }; @@ -3541,70 +3667,82 @@ WOLFSSL_API void wolfSSL_CertManagerFree(WOLFSSL_CERT_MANAGER* cm); WOLFSSL_API int wolfSSL_CertManager_up_ref(WOLFSSL_CERT_MANAGER* cm); - WOLFSSL_API int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, const char* f, - const char* d); +#if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ + && defined(HAVE_OID_DECODING) + WOLFSSL_API void wolfSSL_CertManagerSetUnknownExtCallback( + WOLFSSL_CERT_MANAGER* cm, + wc_UnknownExtCallback cb); +#endif + + WOLFSSL_API int wolfSSL_CertManagerLoadCA(WOLFSSL_CERT_MANAGER* cm, + const char* f, const char* d); WOLFSSL_API int wolfSSL_CertManagerLoadCABuffer_ex(WOLFSSL_CERT_MANAGER* cm, - const unsigned char* in, long sz, int format, int userChain, - word32 flags); + const unsigned char* buff, long sz, int format, int userChain, + word32 flags); WOLFSSL_API int wolfSSL_CertManagerLoadCABuffer(WOLFSSL_CERT_MANAGER* cm, - const unsigned char* in, long sz, int format); + const unsigned char* buff, long sz, int format); WOLFSSL_API int wolfSSL_CertManagerUnloadCAs(WOLFSSL_CERT_MANAGER* cm); + WOLFSSL_API int wolfSSL_CertManagerUnloadIntermediateCerts( + WOLFSSL_CERT_MANAGER* cm); #ifdef WOLFSSL_TRUST_PEER_CERT - WOLFSSL_API int wolfSSL_CertManagerUnload_trust_peers(WOLFSSL_CERT_MANAGER* cm); + WOLFSSL_API int wolfSSL_CertManagerUnload_trust_peers( + WOLFSSL_CERT_MANAGER* cm); #endif - WOLFSSL_API int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, const char* f, - int format); + WOLFSSL_API int wolfSSL_CertManagerVerify(WOLFSSL_CERT_MANAGER* cm, + const char* f, int format); WOLFSSL_API int wolfSSL_CertManagerVerifyBuffer(WOLFSSL_CERT_MANAGER* cm, - const unsigned char* buff, long sz, int format); + const unsigned char* buff, long sz, int format); WOLFSSL_API int wolfSSL_CertManagerCheckCRL(WOLFSSL_CERT_MANAGER* cm, - unsigned char* der, int sz); + const unsigned char* der, int sz); WOLFSSL_API int wolfSSL_CertManagerEnableCRL(WOLFSSL_CERT_MANAGER* cm, - int options); + int options); WOLFSSL_API int wolfSSL_CertManagerDisableCRL(WOLFSSL_CERT_MANAGER* cm); WOLFSSL_API void wolfSSL_CertManagerSetVerify(WOLFSSL_CERT_MANAGER* cm, - VerifyCallback vc); + VerifyCallback vc); WOLFSSL_API int wolfSSL_CertManagerLoadCRL(WOLFSSL_CERT_MANAGER* cm, - const char* path, int type, int monitor); + const char* path, int type, int monitor); WOLFSSL_API int wolfSSL_CertManagerLoadCRLFile(WOLFSSL_CERT_MANAGER* cm, - const char* file, int type); + const char* file, int type); WOLFSSL_API int wolfSSL_CertManagerLoadCRLBuffer(WOLFSSL_CERT_MANAGER* cm, - const unsigned char* buff, long sz, int type); + const unsigned char* buff, long sz, int type); WOLFSSL_API int wolfSSL_CertManagerSetCRL_Cb(WOLFSSL_CERT_MANAGER* cm, - CbMissingCRL cb); + CbMissingCRL cb); WOLFSSL_API int wolfSSL_CertManagerFreeCRL(WOLFSSL_CERT_MANAGER* cm); #ifdef HAVE_CRL_IO WOLFSSL_API int wolfSSL_CertManagerSetCRL_IOCb(WOLFSSL_CERT_MANAGER* cm, - CbCrlIO cb); + CbCrlIO cb); #endif #if defined(HAVE_OCSP) - WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse(WOLFSSL_CERT_MANAGER* cm, - byte *response, int responseSz, WOLFSSL_BUFFER_INFO *responseBuffer, - CertStatus *status, OcspEntry *entry, OcspRequest *ocspRequest); + WOLFSSL_API int wolfSSL_CertManagerCheckOCSPResponse( + WOLFSSL_CERT_MANAGER* cm, unsigned char *response, int responseSz, + WOLFSSL_BUFFER_INFO *responseBuffer, CertStatus *status, + OcspEntry *entry, OcspRequest *ocspRequest); #endif WOLFSSL_API int wolfSSL_CertManagerCheckOCSP(WOLFSSL_CERT_MANAGER* cm, - unsigned char* der, int sz); + const unsigned char* der, int sz); WOLFSSL_API int wolfSSL_CertManagerEnableOCSP(WOLFSSL_CERT_MANAGER* cm, - int options); + int options); WOLFSSL_API int wolfSSL_CertManagerDisableOCSP(WOLFSSL_CERT_MANAGER* cm); - WOLFSSL_API int wolfSSL_CertManagerSetOCSPOverrideURL(WOLFSSL_CERT_MANAGER* cm, - const char* url); + WOLFSSL_API int wolfSSL_CertManagerSetOCSPOverrideURL( + WOLFSSL_CERT_MANAGER* cm, const char* url); WOLFSSL_API int wolfSSL_CertManagerSetOCSP_Cb(WOLFSSL_CERT_MANAGER* cm, - CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx); + CbOCSPIO ioCb, CbOCSPRespFree respFreeCb, void* ioCbCtx); WOLFSSL_API int wolfSSL_CertManagerEnableOCSPStapling( - WOLFSSL_CERT_MANAGER* cm); + WOLFSSL_CERT_MANAGER* cm); WOLFSSL_API int wolfSSL_CertManagerDisableOCSPStapling( - WOLFSSL_CERT_MANAGER* cm); + WOLFSSL_CERT_MANAGER* cm); WOLFSSL_API int wolfSSL_CertManagerEnableOCSPMustStaple( - WOLFSSL_CERT_MANAGER* cm); + WOLFSSL_CERT_MANAGER* cm); WOLFSSL_API int wolfSSL_CertManagerDisableOCSPMustStaple( - WOLFSSL_CERT_MANAGER* cm); + WOLFSSL_CERT_MANAGER* cm); #if defined(OPENSSL_EXTRA) && defined(WOLFSSL_SIGNER_DER_CERT) && \ !defined(NO_FILESYSTEM) -WOLFSSL_API WOLFSSL_STACK* wolfSSL_CertManagerGetCerts(WOLFSSL_CERT_MANAGER* cm); +WOLFSSL_API WOLFSSL_STACK* wolfSSL_CertManagerGetCerts( + WOLFSSL_CERT_MANAGER* cm); WOLFSSL_API WOLF_STACK_OF(WOLFSSL_X509)* wolfSSL_X509_STORE_get1_certs( - WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_NAME* name); + WOLFSSL_X509_STORE_CTX* ctx, WOLFSSL_X509_NAME* name); #endif /* OPENSSL_EXTRA && WOLFSSL_SIGNER_DER_CERT && !NO_FILESYSTEM */ WOLFSSL_API int wolfSSL_EnableCRL(WOLFSSL* ssl, int options); WOLFSSL_API int wolfSSL_DisableCRL(WOLFSSL* ssl); @@ -3680,7 +3818,6 @@ /* SNI types */ enum { WOLFSSL_SNI_HOST_NAME = 0, - WOLFSSL_SNI_HOST_NAME_OUTER = 0, }; WOLFSSL_ABI WOLFSSL_API int wolfSSL_UseSNI(WOLFSSL* ssl, unsigned char type, @@ -3785,6 +3922,7 @@ /* Fragment lengths */ enum { + WOLFSSL_MFL_DISABLED = 0, WOLFSSL_MFL_2_9 = 1, /* 512 bytes */ WOLFSSL_MFL_2_10 = 2, /* 1024 bytes */ WOLFSSL_MFL_2_11 = 3, /* 2048 bytes */ @@ -3895,8 +4033,12 @@ WOLFSSL_ECC_BRAINPOOLP512R1 = 28, WOLFSSL_ECC_X25519 = 29, WOLFSSL_ECC_X448 = 30, - WOLFSSL_ECC_MAX = 30, + WOLFSSL_ECC_SM2P256V1 = 41, + WOLFSSL_ECC_MAX = 41, + WOLFSSL_ECC_MAX_AVAIL = 46, + /* Update use of disabled curves when adding value greater than 46. */ + WOLFSSL_FFDHE_START = 256, WOLFSSL_FFDHE_2048 = 256, WOLFSSL_FFDHE_3072 = 257, WOLFSSL_FFDHE_4096 = 258, @@ -3927,7 +4069,7 @@ WOLFSSL_KYBER_LEVEL5 = 573, /* KYBER_1024 */ WOLFSSL_PQC_SIMPLE_MAX = 573, - WOLFSSL_PQC_HYBRID_MIN = 12052, + WOLFSSL_PQC_HYBRID_MIN = 12090, WOLFSSL_P256_KYBER_LEVEL1 = 12090, WOLFSSL_P384_KYBER_LEVEL3 = 12092, WOLFSSL_P521_KYBER_LEVEL5 = 12093, @@ -3955,14 +4097,26 @@ WOLFSSL_API int wolfSSL_NoKeyShares(WOLFSSL* ssl); #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS +#define WOLFSSL_CKS_SIGSPEC_NATIVE 0x0001 +#define WOLFSSL_CKS_SIGSPEC_ALTERNATIVE 0x0002 +#define WOLFSSL_CKS_SIGSPEC_BOTH 0x0003 +#define WOLFSSL_CKS_SIGSPEC_EXTERNAL 0x0004 + +WOLFSSL_API int wolfSSL_UseCKS(WOLFSSL* ssl, byte *sigSpec, word16 sigSpecSz); +WOLFSSL_API int wolfSSL_CTX_UseCKS(WOLFSSL_CTX* ctx, byte *sigSpec, + word16 sigSpecSz); +#endif /* WOLFSSL_DUAL_ALG_CERTS */ /* Secure Renegotiation */ #if defined(HAVE_SECURE_RENEGOTIATION) || defined(HAVE_SERVER_RENEGOTIATION_INFO) WOLFSSL_API int wolfSSL_UseSecureRenegotiation(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_CTX_UseSecureRenegotiation(WOLFSSL_CTX* ctx); +#ifdef HAVE_SECURE_RENEGOTIATION WOLFSSL_API int wolfSSL_Rehandshake(WOLFSSL* ssl); WOLFSSL_API int wolfSSL_SecureResume(WOLFSSL* ssl); +#endif WOLFSSL_API long wolfSSL_SSL_get_secure_renegotiation_support(WOLFSSL* ssl); #endif @@ -4226,6 +4380,7 @@ WOLFSSL_API int wolfSSL_X509_NAME_cmp(const WOLFSSL_X509_NAME* x, const WOLFSSL_X509_NAME* y); WOLFSSL_API WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new(void); +WOLFSSL_API WOLFSSL_X509_NAME* wolfSSL_X509_NAME_new_ex(void *heap); WOLFSSL_API WOLFSSL_X509_NAME* wolfSSL_X509_NAME_dup(WOLFSSL_X509_NAME* name); WOLFSSL_API int wolfSSL_X509_NAME_copy(WOLFSSL_X509_NAME* from, WOLFSSL_X509_NAME* to); WOLFSSL_API int wolfSSL_check_private_key(const WOLFSSL* ssl); @@ -4337,11 +4492,15 @@ const WOLFSSL *ssl); WOLFSSL_API void wolfSSL_CTX_set_cert_store(WOLFSSL_CTX* ctx, WOLFSSL_X509_STORE* str); +#ifdef OPENSSL_ALL +WOLFSSL_API int wolfSSL_CTX_set1_verify_cert_store(WOLFSSL_CTX* ctx, + WOLFSSL_X509_STORE* str); +#endif WOLFSSL_API int wolfSSL_set0_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str); WOLFSSL_API int wolfSSL_set1_verify_cert_store(WOLFSSL *ssl, WOLFSSL_X509_STORE* str); -WOLFSSL_API WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(WOLFSSL_CTX* ctx); +WOLFSSL_API WOLFSSL_X509_STORE* wolfSSL_CTX_get_cert_store(const WOLFSSL_CTX* ctx); #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ #if defined(OPENSSL_EXTRA) || defined(WOLFSSL_WPAS_SMALL) || \ defined(HAVE_SECRET_CALLBACK) @@ -4357,7 +4516,9 @@ WOLFSSL_API int wolfSSL_BIO_supports_pending(const WOLFSSL_BIO *bio); WOLFSSL_API size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO *b); -WOLFSSL_API int wolfSSL_get_server_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey); +/* Definition for backwards comaptiblity */ +#define wolfSSL_get_server_tmp_key wolfSSL_get_peer_tmp_key +WOLFSSL_API int wolfSSL_get_peer_tmp_key(const WOLFSSL* ssl, WOLFSSL_EVP_PKEY** pkey); WOLFSSL_API int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version); WOLFSSL_API int wolfSSL_CTX_set_max_proto_version(WOLFSSL_CTX* ctx, int version); @@ -4435,7 +4596,7 @@ WOLFSSL_API void wolfSSL_X509_NAME_ENTRY_free(WOLFSSL_X509_NAME_ENTRY* ne); WOLFSSL_API WOLFSSL_X509_NAME_ENTRY* wolfSSL_X509_NAME_ENTRY_new(void); WOLFSSL_API void wolfSSL_X509_NAME_free(WOLFSSL_X509_NAME* name); -WOLFSSL_API char wolfSSL_CTX_use_certificate(WOLFSSL_CTX* ctx, WOLFSSL_X509* x); +WOLFSSL_API int wolfSSL_CTX_use_certificate(WOLFSSL_CTX* ctx, WOLFSSL_X509* x); WOLFSSL_API int wolfSSL_CTX_add0_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509); WOLFSSL_API int wolfSSL_CTX_add1_chain_cert(WOLFSSL_CTX* ctx, WOLFSSL_X509* x509); WOLFSSL_API int wolfSSL_add0_chain_cert(WOLFSSL* ssl, WOLFSSL_X509* x509); @@ -4719,14 +4880,17 @@ WOLFSSL_API void wolfSSL_CTX_set_servername_callback(WOLFSSL_CTX* ctx, CallbackSniRecv cb); -WOLFSSL_API int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx, - CallbackSniRecv cb); WOLFSSL_API int wolfSSL_CTX_set_servername_arg(WOLFSSL_CTX* ctx, void* arg); #endif -#if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) \ - || defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) +#if defined(OPENSSL_ALL) || defined(HAVE_STUNNEL) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_HAPROXY) || defined(OPENSSL_EXTRA) || defined(HAVE_LIGHTY) + +#ifdef HAVE_SNI +WOLFSSL_API int wolfSSL_CTX_set_tlsext_servername_callback(WOLFSSL_CTX* ctx, + CallbackSniRecv cb); +#endif WOLFSSL_API void wolfSSL_ERR_remove_thread_state(void* pid); @@ -4762,10 +4926,11 @@ WOLFSSL_API void wolfSSL_sk_X509_pop_free(WOLF_STACK_OF(WOLFSSL_X509)* sk, void (*f) (WOLFSSL_X509*)); #endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */ -#if (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) && defined(HAVE_ECC) +#if (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) && (defined(HAVE_ECC) || \ + defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)) WOLFSSL_API int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names); WOLFSSL_API int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names); -#endif /* (OPENSSL_EXTRA || HAVE_CURL) && HAVE_ECC */ +#endif #if defined(OPENSSL_ALL) || \ defined(HAVE_STUNNEL) || defined(WOLFSSL_MYSQL_COMPATIBLE) || \ @@ -4889,12 +5054,17 @@ #ifdef OPENSSL_EXTRA WOLFSSL_API int wolfSSL_OPENSSL_init_ssl(word64 opts, const OPENSSL_INIT_SETTINGS *settings); +WOLFSSL_API OPENSSL_INIT_SETTINGS* wolfSSL_OPENSSL_INIT_new(void); +WOLFSSL_API void wolfSSL_OPENSSL_INIT_free(OPENSSL_INIT_SETTINGS* init); +WOLFSSL_API int wolfSSL_OPENSSL_INIT_set_config_appname( + OPENSSL_INIT_SETTINGS* init, char* appname); #endif #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L WOLFSSL_API int wolfSSL_SSL_in_init(const WOLFSSL* ssl); #else WOLFSSL_API int wolfSSL_SSL_in_init(WOLFSSL* ssl); #endif +WOLFSSL_API int wolfSSL_SSL_in_before(const WOLFSSL* ssl); WOLFSSL_API int wolfSSL_SSL_in_connect_init(WOLFSSL* ssl); #ifndef NO_SESSION_CACHE @@ -4954,7 +5124,7 @@ WOLFSSL_API long wolfSSL_CTX_get_tlsext_ticket_keys(WOLFSSL_CTX *ctx, unsigned char *keys, int keylen); WOLFSSL_API long wolfSSL_CTX_set_tlsext_ticket_keys(WOLFSSL_CTX *ctx, - unsigned char *keys, int keylen); + const void *keys_vp, int keylen); #endif WOLFSSL_API void wolfSSL_get0_alpn_selected(const WOLFSSL *ssl, @@ -4964,6 +5134,13 @@ const unsigned char *in, unsigned int inlen, const unsigned char *client, unsigned int client_len); +WOLFSSL_API void wolfSSL_set_alpn_select_cb(WOLFSSL *ssl, + int (*cb) (WOLFSSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *arg), void *arg); WOLFSSL_API void wolfSSL_CTX_set_alpn_select_cb(WOLFSSL_CTX *ctx, int (*cb) (WOLFSSL *ssl, const unsigned char **out, @@ -5030,6 +5207,7 @@ WOLFSSL_API int wolfSSL_i2d_ASN1_OBJECT(WOLFSSL_ASN1_OBJECT *a, unsigned char **pp); WOLFSSL_API void SSL_CTX_set_tmp_dh_callback(WOLFSSL_CTX *ctx, WOLFSSL_DH *(*dh) (WOLFSSL *ssl, int is_export, int keylength)); WOLFSSL_API WOLF_STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void); +WOLFSSL_API const char* wolfSSL_COMP_get_name(const void* comp); WOLFSSL_API int wolfSSL_X509_STORE_load_locations(WOLFSSL_X509_STORE *str, const char *file, const char *dir); WOLFSSL_API int wolfSSL_X509_STORE_add_crl(WOLFSSL_X509_STORE *ctx, WOLFSSL_X509_CRL *x); WOLFSSL_API int wolfSSL_sk_SSL_CIPHER_num(const WOLF_STACK_OF(WOLFSSL_CIPHER)* p); @@ -5049,6 +5227,7 @@ WOLFSSL_API unsigned char* wolfSSL_ASN1_TIME_get_data(const WOLFSSL_ASN1_TIME *t); WOLFSSL_API WOLFSSL_ASN1_TIME *wolfSSL_ASN1_TIME_to_generalizedtime(WOLFSSL_ASN1_TIME *t, WOLFSSL_ASN1_TIME **out); +WOLFSSL_API WOLFSSL_ASN1_TIME* wolfSSL_ASN1_UTCTIME_set(WOLFSSL_ASN1_TIME *s, time_t t); WOLFSSL_API int wolfSSL_i2c_ASN1_INTEGER(WOLFSSL_ASN1_INTEGER *a, unsigned char **pp); WOLFSSL_API int wolfSSL_a2i_ASN1_INTEGER(WOLFSSL_BIO *bio, WOLFSSL_ASN1_INTEGER *asn1, char *buf, int size); @@ -5103,6 +5282,29 @@ const unsigned char** key, unsigned int* keySz); #endif +#ifdef HAVE_RPK +/* cert type for client_certificate_type/server_certificate_type extensions */ +enum { + WOLFSSL_CERT_TYPE_UNKNOWN = -1, + WOLFSSL_CERT_TYPE_X509 = 0, + WOLFSSL_CERT_TYPE_RPK = 2, +}; +#define MAX_CLIENT_CERT_TYPE_CNT 2 +#define MAX_SERVER_CERT_TYPE_CNT 2 + +WOLFSSL_API int wolfSSL_CTX_set_client_cert_type(WOLFSSL_CTX* ctx, + const char* buf, int len); +WOLFSSL_API int wolfSSL_CTX_set_server_cert_type(WOLFSSL_CTX* ctx, + const char* buf, int len); +WOLFSSL_API int wolfSSL_set_client_cert_type(WOLFSSL* ssl, + const char* buf, int len); +WOLFSSL_API int wolfSSL_set_server_cert_type(WOLFSSL* ssl, + const char* buf, int len); +WOLFSSL_API int wolfSSL_get_negotiated_client_cert_type(WOLFSSL* ssl, int* tp); +WOLFSSL_API int wolfSSL_get_negotiated_server_cert_type(WOLFSSL* ssl, int* tp); +#endif /* HAVE_RPK */ + + #if defined(OPENSSL_EXTRA) #ifndef WOLFCRYPT_ONLY WOLFSSL_API int wolfSSL_EVP_PKEY_param_check(WOLFSSL_EVP_PKEY_CTX* ctx); @@ -5158,6 +5360,13 @@ unsigned int bufferSz); #endif /* defined(WOLFSSL_DTLS_CID) */ +#ifdef WOLFSSL_DTLS_CH_FRAG + WOLFSSL_API int wolfSSL_dtls13_allow_ch_frag(WOLFSSL *ssl, int enabled); +#endif +#ifdef WOLFSSL_DTLS13_NO_HRR_ON_RESUME + WOLFSSL_API int wolfSSL_dtls13_no_hrr_on_resume(WOLFSSL *ssl, int enabled); +#endif + /* */ #define SSL2_VERSION 0x0002 #define SSL3_VERSION 0x0300 @@ -5169,6 +5378,247 @@ #define DTLS1_2_VERSION 0xFEFD #define DTLS1_3_VERSION 0xFEFC +/* These minimums where determined whilst referencing their RFC specs. The + * values represent the minimum sizes of the data types in the required struct + * for the `extension_data` field. A length of 0 was assumed when necassary. + * + * Documents Used for the respective extension: + * - https://datatracker.ietf.org/doc/html/rfc6066 + * - Server Name Indication (SNI) + * - Maximum Fragment Length Negotiation (MFL) + * - Trusted CA Indication (TCA) + * - Certificate Status Request (CSR) + * - Truncate HMAC (THM) + * - https://datatracker.ietf.org/doc/html/rfc8446 + * - Early Data Indication (EDI) + * - Pre-Shared Key (PSK) + * - Pre-Shared Key Exchange Modes (PKM) + * - Key Share (KS) + * - Post-Handshake Authentication (PHA) + * - Signature Algorithms (SA) + * - Signature Algorithms Certificate (SAC) + * - Support Groups (EC) + * - Cookie (CKE) + * - Supported Versions (SV) + * - Certificate Authorities (CAN) + * - https://datatracker.ietf.org/doc/html/rfc6961 + * - Certificate Status Request v2 (CSR2) + * - https://datatracker.ietf.org/doc/rfc9146/ + * - Connection Identifier (CID) + * - https://datatracker.ietf.org/doc/rfc7301/ + * - Application-Layer Protocol Negotiation (ALPN) + * - https://datatracker.ietf.org/doc/html/rfc3711 + * - Secure Real-time Transport Protocol (SRTP) + * - https://datatracker.ietf.org/doc/html/rfc7366 + * - Encrypt Then Mac (ETM) + * - https://datatracker.ietf.org/doc/html/rfc7250 + * - Client Certificate Type (CCT) + * - Server Certificate Type (SCT) + * - https://datatracker.ietf.org/doc/draft-ietf-tls-esni/ + * - Encrypted Client Hello (ECH) + * - https://datatracker.ietf.org/doc/html/rfc5746 + * - Secure Renegotiation (SCR) + * - https://datatracker.ietf.org/doc/rfc4492/ + * - Point Frame (PF) + * - https://datatracker.ietf.org/doc/rfc9000/ + * - QUIC (QTP) + * - https://datatracker.ietf.org/doc/html/rfc5077 + * - Session Ticket (STK) + * Example: + * For `WOLFSSL_CSR_MIN_SIZE_CLIENT = 5`, 5 was determined by looking at the + * struct below defined in its respective RFC. + * The below struct for `CertificateStatusRequest` is made up of the types: + * `CertificateStatusType` is an enum with a max value of 255, thus its + * length is 1 byte. + * `OCSPStatusRequest` is a struct of the following: + * - `responder_id_list`: which is 2 bytes + * - `request_extensions`: which is 2 bytes + * This then gives the minimum size/length of 5 bytes for this extension + * for the client + * struct { + * CertificateStatusType status_type; + * select (status_type) { + * case ocsp: OCSPStatusRequest; + * } request; + * } CertificateStatusRequest; + * enum { ocsp(1), (255) } CertificateStatusType; + * struct { + * ResponderID responder_id_list<0..2^16-1>; + * Extensions request_extensions; + * } OCSPStatusRequest; + * opaque ResponderID<1..2^16-1>; + * opaque Extensions<0..2^16-1>; + */ + +#ifndef WOLFSSL_SNI_MIN_SIZE_CLIENT + #define WOLFSSL_SNI_MIN_SIZE_CLIENT 4 +#endif +#ifndef WOLFSSL_SNI_MIN_SIZE_SERVER + #define WOLFSSL_SNI_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_EDI_MIN_SIZE_CLIENT + #define WOLFSSL_EDI_MIN_SIZE_CLIENT 0 +#endif +#ifndef WOLFSSL_EDI_MIN_SIZE_SERVER + #define WOLFSSL_EDI_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_TCA_MIN_SIZE_CLIENT + #define WOLFSSL_TCA_MIN_SIZE_CLIENT 2 +#endif +#ifndef WOLFSSL_TCA_MIN_SIZE_SERVER + #define WOLFSSL_TCA_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_CSR_MIN_SIZE_CLIENT + #define WOLFSSL_CSR_MIN_SIZE_CLIENT 5 +#endif +#ifndef WOLFSSL_CSR_MIN_SIZE_SERVER + #define WOLFSSL_CSR_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_PKM_MIN_SIZE_CLIENT + #define WOLFSSL_PKM_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_PKM_MIN_SIZE_SERVER + #define WOLFSSL_PKM_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_CSR2_MIN_SIZE_CLIENT + #define WOLFSSL_CSR2_MIN_SIZE_CLIENT 7 +#endif +#ifndef WOLFSSL_CSR2_MIN_SIZE_SERVER + #define WOLFSSL_CSR2_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_CID_MIN_SIZE_CLIENT + #define WOLFSSL_CID_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_CID_MIN_SIZE_SERVER + #define WOLFSSL_CID_MIN_SIZE_SERVER 1 +#endif +#ifndef WOLFSSL_ALPN_MIN_SIZE_CLIENT + #define WOLFSSL_ALPN_MIN_SIZE_CLIENT 2 +#endif +#ifndef WOLFSSL_ALPN_MIN_SIZE_SERVER + #define WOLFSSL_ALPN_MIN_SIZE_SERVER 2 +#endif +#ifndef WOLFSSL_SRTP_MIN_SIZE_CLIENT + #define WOLFSSL_SRTP_MIN_SIZE_CLIENT 3 +#endif +#ifndef WOLFSSL_SRTP_MIN_SIZE_SERVER + #define WOLFSSL_SRTP_MIN_SIZE_SERVER 3 +#endif +#ifndef WOLFSSL_KS_MIN_SIZE_CLIENT + #define WOLFSSL_KS_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_KS_MIN_SIZE_SERVER + #define WOLFSSL_KS_MIN_SIZE_SERVER 1 +#endif +#ifndef WOLFSSL_ETM_MIN_SIZE_CLIENT + #define WOLFSSL_ETM_MIN_SIZE_CLIENT 0 +#endif +#ifndef WOLFSSL_ETM_MIN_SIZE_SERVER + #define WOLFSSL_ETM_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_PSK_MIN_SIZE_CLIENT + #define WOLFSSL_PSK_MIN_SIZE_CLIENT 2 +#endif +#ifndef WOLFSSL_PSK_MIN_SIZE_SERVER + #define WOLFSSL_PSK_MIN_SIZE_SERVER 2 +#endif +#ifndef WOLFSSL_CCT_MIN_SIZE_CLIENT + #define WOLFSSL_CCT_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_CCT_MIN_SIZE_SERVER + #define WOLFSSL_CCT_MIN_SIZE_SERVER 1 +#endif +#ifndef WOLFSSL_SCT_MIN_SIZE_CLIENT + #define WOLFSSL_SCT_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_SCT_MIN_SIZE_SERVER + #define WOLFSSL_SCT_MIN_SIZE_SERVER 1 +#endif +#ifndef WOLFSSL_PHA_MIN_SIZE_CLIENT + #define WOLFSSL_PHA_MIN_SIZE_CLIENT 0 +#endif +#ifndef WOLFSSL_PHA_MIN_SIZE_SERVER + #define WOLFSSL_PHA_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_THM_MIN_SIZE_CLIENT + #define WOLFSSL_THM_MIN_SIZE_CLIENT 0 +#endif +#ifndef WOLFSSL_THM_MIN_SIZE_SERVER + #define WOLFSSL_THM_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_SA_MIN_SIZE_CLIENT + #define WOLFSSL_SA_MIN_SIZE_CLIENT 2 +#endif +#ifndef WOLFSSL_SA_MIN_SIZE_SERVER + #define WOLFSSL_SA_MIN_SIZE_SERVER 2 +#endif +#ifndef WOLFSSL_SAC_MIN_SIZE_CLIENT + #define WOLFSSL_SAC_MIN_SIZE_CLIENT 2 +#endif +#ifndef WOLFSSL_SAC_MIN_SIZE_SERVER + #define WOLFSSL_SAC_MIN_SIZE_SERVER 2 +#endif +#ifndef WOLFSSL_EC_MIN_SIZE_CLIENT + #define WOLFSSL_EC_MIN_SIZE_CLIENT 2 +#endif +#ifndef WOLFSSL_EC_MIN_SIZE_SERVER + #define WOLFSSL_EC_MIN_SIZE_SERVER 2 +#endif +#ifndef WOLFSSL_ECH_MIN_SIZE_CLIENT + #define WOLFSSL_ECH_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_ECH_MIN_SIZE_SERVER + #define WOLFSSL_ECH_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_MFL_MIN_SIZE_CLIENT + #define WOLFSSL_MFL_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_MFL_MIN_SIZE_SERVER + #define WOLFSSL_MFL_MIN_SIZE_SERVER 1 +#endif +#ifndef WOLFSSL_CKE_MIN_SIZE_CLIENT + #define WOLFSSL_CKE_MIN_SIZE_CLIENT 3 +#endif +#ifndef WOLFSSL_CKE_MIN_SIZE_SERVER + #define WOLFSSL_CKE_MIN_SIZE_SERVER 3 +#endif +#ifndef WOLFSSL_SV_MIN_SIZE_CLIENT + #define WOLFSSL_SV_MIN_SIZE_CLIENT 2 +#endif +#ifndef WOLFSSL_SV_MIN_SIZE_SERVER + #define WOLFSSL_SV_MIN_SIZE_SERVER 2 +#endif +#ifndef WOLFSSL_SCR_MIN_SIZE_CLIENT + #define WOLFSSL_SCR_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_SCR_MIN_SIZE_SERVER + #define WOLFSSL_SCR_MIN_SIZE_SERVER 1 +#endif +#ifndef WOLFSSL_PF_MIN_SIZE_CLIENT + #define WOLFSSL_PF_MIN_SIZE_CLIENT 1 +#endif +#ifndef WOLFSSL_PF_MIN_SIZE_SERVER + #define WOLFSSL_PF_MIN_SIZE_SERVER 1 +#endif +#ifndef WOLFSSL_CAN_MIN_SIZE_CLIENT + #define WOLFSSL_CAN_MIN_SIZE_CLIENT 3 +#endif +#ifndef WOLFSSL_CAN_MIN_SIZE_SERVER + #define WOLFSSL_CAN_MIN_SIZE_SERVER 3 +#endif +#ifndef WOLFSSL_QTP_MIN_SIZE_CLIENT + #define WOLFSSL_QTP_MIN_SIZE_CLIENT 0 +#endif +#ifndef WOLFSSL_QTP_MIN_SIZE_SERVER + #define WOLFSSL_QTP_MIN_SIZE_SERVER 0 +#endif +#ifndef WOLFSSL_STK_MIN_SIZE_CLIENT + #define WOLFSSL_STK_MIN_SIZE_CLIENT 0 +#endif +#ifndef WOLFSSL_STK_MIN_SIZE_SERVER + #define WOLFSSL_STK_MIN_SIZE_SERVER 0 +#endif + #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/test.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/test.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/test.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/test.h 2024-08-03 07:30:01.000000000 +0000 @@ -28,6 +28,9 @@ #ifndef wolfSSL_TEST_H #define wolfSSL_TEST_H +#include +#include + #ifdef FUSION_RTOS #include #include @@ -107,7 +110,9 @@ #elif defined(WOLFSSL_TIRTOS) #include #include - #include + #if !defined(__ti__) /* conflicts with sys/socket.h */ + #include + #endif #include #include #include @@ -138,9 +143,26 @@ #include #define SOCKET_T int #elif defined(WOLFSSL_ZEPHYR) + #include #include #include - #include + #if KERNEL_VERSION_NUMBER >= 0x30100 + #include + #ifdef CONFIG_POSIX_API + #include + #include + #include + #include + #endif + #else + #include + #ifdef CONFIG_POSIX_API + #include + #include + #include + #include + #endif + #endif #define SOCKET_T int #define SOL_SOCKET 1 #define WOLFSSL_USE_GETADDRINFO @@ -170,6 +192,8 @@ int h_length; /* length of address */ char** h_addr_list; /* list of addresses from the name server */ }; +#elif defined(ARDUINO) + /* TODO, define board-specific */ #else #include #include @@ -182,7 +206,9 @@ #include #include #include - #include + #ifdef HAVE_PTHREAD + #include + #endif #include #ifdef TEST_IPV6 #include @@ -248,7 +274,7 @@ #elif defined(WOLFSSL_TIRTOS) #define WOLFSSL_SOCKET_INVALID ((SOCKET_T)-1) #else - #define WOLFSSL_SOCKET_INVALID (SOCKET_T)(0) + #define WOLFSSL_SOCKET_INVALID (SOCKET_T)(-1) #endif #endif /* WOLFSSL_SOCKET_INVALID */ @@ -280,6 +306,14 @@ #endif #endif + +#if defined(DEBUG_PK_CB) || defined(TEST_PK_PRIVKEY) || defined(TEST_PK_PSK) + #define WOLFSSL_PKMSG(...) printf(__VA_ARGS__) +#else + #define WOLFSSL_PKMSG(...) WC_DO_NOTHING +#endif + + #ifndef MY_EX_USAGE #define MY_EX_USAGE 2 #endif @@ -358,13 +392,13 @@ } \ } while(0) -#define PTHREAD_CHECK_RET(...) do { \ - int _pthread_ret = (__VA_ARGS__); \ - if (_pthread_ret != 0) { \ - errno = _pthread_ret; \ +#define THREAD_CHECK_RET(...) do { \ + int _thread_ret = (__VA_ARGS__); \ + if (_thread_ret != 0) { \ + errno = _thread_ret; \ fprintf(stderr, "%s L%d error %d for \"%s\"\n", \ - __FILE__, __LINE__, _pthread_ret, #__VA_ARGS__); \ - err_sys("pthread call failed"); \ + __FILE__, __LINE__, _thread_ret, #__VA_ARGS__); \ + err_sys("thread call failed"); \ } \ } while(0) @@ -529,12 +563,13 @@ word16 ready; /* predicate */ word16 port; char* srfName; /* server ready file name */ -#if defined(_POSIX_THREADS) && !defined(__MINGW32__) - pthread_mutex_t mutex; - pthread_cond_t cond; +#ifndef SINGLE_THREADED +#ifdef WOLFSSL_COND + wolfSSL_Mutex mutex; + COND_TYPE cond; +#else /* No signaling available, rely only on the mutex */ + wolfSSL_Mutex mutex; #endif -#ifdef NETOS - TX_MUTEX mutex; #endif } tcp_ready; @@ -543,12 +578,12 @@ ready->ready = 0; ready->port = 0; ready->srfName = NULL; -#ifdef SINGLE_THREADED -#elif defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_mutex_init(&ready->mutex, 0)); - PTHREAD_CHECK_RET(pthread_cond_init(&ready->cond, 0)); -#elif defined(NETOS) - tx_mutex_create(&ready->mutex, "wolfSSL Lock", TX_INHERIT); + +#ifndef SINGLE_THREADED + THREAD_CHECK_RET(wc_InitMutex(&ready->mutex)); + #ifdef WOLFSSL_COND + THREAD_CHECK_RET(wolfSSL_CondInit(&ready->cond)); + #endif #endif } @@ -558,13 +593,11 @@ static WC_INLINE void FreeTcpReady(tcp_ready* ready) { -#ifdef SINGLE_THREADED - (void)ready; -#elif defined(_POSIX_THREADS) && !defined(__MINGW32__) - PTHREAD_CHECK_RET(pthread_mutex_destroy(&ready->mutex)); - PTHREAD_CHECK_RET(pthread_cond_destroy(&ready->cond)); -#elif defined(NETOS) - tx_mutex_delete(&ready->mutex); +#ifndef SINGLE_THREADED + THREAD_CHECK_RET(wc_FreeMutex(&ready->mutex)); +#ifdef WOLFSSL_COND + THREAD_CHECK_RET(wolfSSL_CondFree(&ready->cond)); +#endif #else (void)ready; #endif @@ -599,14 +632,14 @@ unsigned char doUdp:1; } callback_functions; -#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND) typedef struct srtp_test_helper { - pthread_mutex_t mutex; - pthread_cond_t cond; + wolfSSL_Mutex mutex; + COND_TYPE cond; uint8_t* server_srtp_ekm; size_t server_srtp_ekm_size; } srtp_test_helper; -#endif +#endif /* WOLFSSL_SRTP WOLFSSL_COND */ typedef struct func_args { int argc; @@ -614,7 +647,7 @@ int return_code; tcp_ready* signal; callback_functions *callbacks; -#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND) srtp_test_helper* srtp_helper; #endif } func_args; @@ -627,14 +660,10 @@ void wait_tcp_ready(func_args* args); -#ifdef WOLFSSL_ZEPHYR -typedef void THREAD_FUNC(void*, void*, void*); -#else -typedef THREAD_RETURN WOLFSSL_THREAD THREAD_FUNC(void*); -#endif - -void start_thread(THREAD_FUNC fun, func_args* args, THREAD_TYPE* thread); +#ifndef SINGLE_THREADED +void start_thread(THREAD_CB fun, func_args* args, THREAD_TYPE* thread); void join_thread(THREAD_TYPE thread); +#endif typedef int (*cbType)(WOLFSSL_CTX *ctx, WOLFSSL *ssl); @@ -643,6 +672,26 @@ void test_wolfSSL_client_server_nofail(callback_functions* client_cb, callback_functions* server_cb); +/* Return + * tmpDir on success + * NULL on failure */ +char* create_tmp_dir(char* tmpDir, int len); +/* Remaining functions return + * 0 on success + * -1 on failure */ +int rem_dir(const char* dirName); +int rem_file(const char* fileName); +int copy_file(const char* in, const char* out); + +#if defined(__MACH__) || defined(__FreeBSD__) + int link_file(const char* in, const char* out); + #define STAGE_FILE(x,y) link_file((x),(y)) +#else + #define STAGE_FILE(x,y) copy_file((x),(y)) +#endif + +void signal_ready(tcp_ready* ready); + /* wolfSSL */ #ifndef TEST_IPV6 static const char* const wolfSSLIP = "127.0.0.1"; @@ -655,15 +704,15 @@ extern int myoptind; extern char* myoptarg; -#if defined(WOLFSSL_SRTP) && !defined(SINGLE_THREADED) && defined(_POSIX_THREADS) +#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND) static WC_INLINE void srtp_helper_init(srtp_test_helper *srtp) { srtp->server_srtp_ekm_size = 0; srtp->server_srtp_ekm = NULL; - PTHREAD_CHECK_RET(pthread_mutex_init(&srtp->mutex, 0)); - PTHREAD_CHECK_RET(pthread_cond_init(&srtp->cond, 0)); + THREAD_CHECK_RET(wc_InitMutex(&srtp->mutex)); + THREAD_CHECK_RET(wolfSSL_CondInit(&srtp->cond)); } /** @@ -678,19 +727,17 @@ static WC_INLINE void srtp_helper_get_ekm(srtp_test_helper *srtp, uint8_t **ekm, size_t *size) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&srtp->mutex)); - - if (srtp->server_srtp_ekm == NULL) - PTHREAD_CHECK_RET(pthread_cond_wait(&srtp->cond, &srtp->mutex)); - + THREAD_CHECK_RET(wolfSSL_CondStart(&srtp->cond)); + if (srtp->server_srtp_ekm == NULL) { + THREAD_CHECK_RET(wolfSSL_CondWait(&srtp->cond)); + } *ekm = srtp->server_srtp_ekm; *size = srtp->server_srtp_ekm_size; /* reset */ srtp->server_srtp_ekm = NULL; srtp->server_srtp_ekm_size = 0; - - PTHREAD_CHECK_RET(pthread_mutex_unlock(&srtp->mutex)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&srtp->cond)); } /** @@ -707,22 +754,21 @@ static WC_INLINE void srtp_helper_set_ekm(srtp_test_helper *srtp, uint8_t *ekm, size_t size) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&srtp->mutex)); - + THREAD_CHECK_RET(wolfSSL_CondStart(&srtp->cond)); srtp->server_srtp_ekm_size = size; srtp->server_srtp_ekm = ekm; - PTHREAD_CHECK_RET(pthread_cond_signal(&srtp->cond)); - - PTHREAD_CHECK_RET(pthread_mutex_unlock(&srtp->mutex)); + THREAD_CHECK_RET(wolfSSL_CondSignal(&srtp->cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&srtp->cond)); } static WC_INLINE void srtp_helper_free(srtp_test_helper *srtp) { - PTHREAD_CHECK_RET(pthread_mutex_destroy(&srtp->mutex)); - PTHREAD_CHECK_RET(pthread_cond_destroy(&srtp->cond)); + THREAD_CHECK_RET(wc_FreeMutex(&srtp->mutex)); + THREAD_CHECK_RET(wolfSSL_CondFree(&srtp->cond)); } -#endif /* WOLFSSL_SRTP && !SINGLE_THREADED && POSIX_THREADS */ +#endif /* WOLFSSL_SRTP && WOLFSSL_COND */ + /** * @@ -956,11 +1002,11 @@ (void)rw; (void)userdata; if (userdata != NULL) { - strncpy(passwd, (char*)userdata, sz); + strncpy(passwd, (char*)userdata, (size_t) sz); return (int)XSTRLEN((char*)userdata); } else { - strncpy(passwd, "yassl123", sz); + strncpy(passwd, "yassl123", (size_t) sz); return 8; } } @@ -1215,7 +1261,7 @@ #ifndef TEST_IPV6 /* peer could be in human readable form */ - if ( ((size_t)peer != INADDR_ANY) && isalpha((int)peer[0])) { + if ( ((size_t)peer != INADDR_ANY) && isalpha((unsigned char)peer[0])) { #ifdef WOLFSSL_USE_POPEN_HOST char host_ipaddr[4] = { 127, 0, 0, 1 }; int found = 1; @@ -1274,7 +1320,7 @@ int err; struct hostent* entry = gethostbyname(peer, &err); #elif defined(WOLFSSL_TIRTOS) - struct hostent* entry = DNSGetHostByName(peer); + struct hostent* entry = (struct hostent*)DNSGetHostByName(peer); #elif defined(WOLFSSL_VXWORKS) struct hostent* entry = (struct hostent*)hostGetByName((char*)peer); #else @@ -1283,7 +1329,7 @@ if (entry) { XMEMCPY(&addr->sin_addr.s_addr, entry->h_addr_list[0], - entry->h_length); + (size_t) entry->h_length); useLookup = 1; } #else @@ -1417,554 +1463,7 @@ #if defined(WOLFSSL_WOLFSENTRY_HOOKS) && defined(WOLFSENTRY_H) -#include - -#if !defined(NO_FILESYSTEM) && !defined(WOLFSENTRY_NO_JSON) -#include -#endif - -#if defined(WOLFSENTRY_VERSION_GE) -#if WOLFSENTRY_VERSION_GE(0, 8, 0) -#define HAVE_WOLFSENTRY_API_0v8 -#endif -#endif - -#ifndef HAVE_WOLFSENTRY_API_0v8 -#define WOLFSENTRY_CONTEXT_ARGS_OUT_EX(x) (x) -#define WOLFSENTRY_CONTEXT_ARGS_OUT_EX4(x, y) (x) -#endif - -struct wolfsentry_data { - WOLFSENTRY_SOCKADDR(128) remote; - WOLFSENTRY_SOCKADDR(128) local; - wolfsentry_route_flags_t flags; - void *heap; - int alloctype; -}; - -static void free_wolfsentry_data(struct wolfsentry_data *data) { - XFREE(data, data->heap, data->alloctype); -} - -static struct wolfsentry_context *wolfsentry = NULL; - -static int wolfsentry_data_index = -1; - -static WC_INLINE int wolfsentry_store_endpoints( - WOLFSSL *ssl, - SOCKADDR_IN_T *remote, - SOCKADDR_IN_T *local, - int proto, - wolfsentry_route_flags_t flags, - struct wolfsentry_data **wolfsentry_data_out) -{ - struct wolfsentry_data *wolfsentry_data = (struct wolfsentry_data *)XMALLOC( - sizeof *wolfsentry_data, NULL, DYNAMIC_TYPE_SOCKADDR); - if (wolfsentry_data == NULL) - return WOLFSSL_FAILURE; - - wolfsentry_data->heap = NULL; - wolfsentry_data->alloctype = DYNAMIC_TYPE_SOCKADDR; - -#ifdef TEST_IPV6 - if ((sizeof wolfsentry_data->remote.addr < sizeof remote->sin6_addr) || - (sizeof wolfsentry_data->local.addr < sizeof local->sin6_addr)) - return WOLFSSL_FAILURE; - wolfsentry_data->remote.sa_family = wolfsentry_data->local.sa_family = remote->sin6_family; - wolfsentry_data->remote.sa_port = ntohs(remote->sin6_port); - wolfsentry_data->local.sa_port = ntohs(local->sin6_port); - if (WOLFSENTRY_MASKIN_BITS(flags, WOLFSENTRY_ROUTE_FLAG_SA_REMOTE_ADDR_WILDCARD)) { - wolfsentry_data->remote.addr_len = 0; - XMEMSET(wolfsentry_data->remote.addr, 0, sizeof remote->sin6_addr); - } else { - wolfsentry_data->remote.addr_len = sizeof remote->sin6_addr * BITS_PER_BYTE; - XMEMCPY(wolfsentry_data->remote.addr, &remote->sin6_addr, sizeof remote->sin6_addr); - } - if (WOLFSENTRY_MASKIN_BITS(flags, WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_ADDR_WILDCARD)) { - wolfsentry_data->local.addr_len = 0; - XMEMSET(wolfsentry_data->local.addr, 0, sizeof local->sin6_addr); - } else { - wolfsentry_data->local.addr_len = sizeof local->sin6_addr * BITS_PER_BYTE; - XMEMCPY(wolfsentry_data->local.addr, &local->sin6_addr, sizeof local->sin6_addr); - } -#else - if ((sizeof wolfsentry_data->remote.addr < sizeof remote->sin_addr) || - (sizeof wolfsentry_data->local.addr < sizeof local->sin_addr)) - return WOLFSSL_FAILURE; - wolfsentry_data->remote.sa_family = wolfsentry_data->local.sa_family = remote->sin_family; - wolfsentry_data->remote.sa_port = ntohs(remote->sin_port); - wolfsentry_data->local.sa_port = ntohs(local->sin_port); - if (WOLFSENTRY_MASKIN_BITS(flags, WOLFSENTRY_ROUTE_FLAG_SA_REMOTE_ADDR_WILDCARD)) { - wolfsentry_data->remote.addr_len = 0; - XMEMSET(wolfsentry_data->remote.addr, 0, sizeof remote->sin_addr); - } else { - wolfsentry_data->remote.addr_len = sizeof remote->sin_addr * BITS_PER_BYTE; - XMEMCPY(wolfsentry_data->remote.addr, &remote->sin_addr, sizeof remote->sin_addr); - } - if (WOLFSENTRY_MASKIN_BITS(flags, WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_ADDR_WILDCARD)) { - wolfsentry_data->local.addr_len = 0; - XMEMSET(wolfsentry_data->local.addr, 0, sizeof local->sin_addr); - } else { - wolfsentry_data->local.addr_len = sizeof local->sin_addr * BITS_PER_BYTE; - XMEMCPY(wolfsentry_data->local.addr, &local->sin_addr, sizeof local->sin_addr); - } -#endif - wolfsentry_data->remote.sa_proto = wolfsentry_data->local.sa_proto = proto; - wolfsentry_data->remote.interface = wolfsentry_data->local.interface = 0; - wolfsentry_data->flags = flags; - - if (wolfSSL_set_ex_data_with_cleanup( - ssl, wolfsentry_data_index, wolfsentry_data, - (wolfSSL_ex_data_cleanup_routine_t)free_wolfsentry_data) != - WOLFSSL_SUCCESS) { - free_wolfsentry_data(wolfsentry_data); - return WOLFSSL_FAILURE; - } - - if (wolfsentry_data_out != NULL) - *wolfsentry_data_out = wolfsentry_data; - - return WOLFSSL_SUCCESS; -} - -static int wolfSentry_NetworkFilterCallback( - WOLFSSL *ssl, - struct wolfsentry_context *_wolfsentry, - wolfSSL_netfilter_decision_t *decision) -{ - struct wolfsentry_data *data; - char inet_ntop_buf[INET6_ADDRSTRLEN], inet_ntop_buf2[INET6_ADDRSTRLEN]; - wolfsentry_errcode_t ret; - wolfsentry_action_res_t action_results; - -#if defined(WOLFSENTRY_THREADSAFE) && defined(HAVE_WOLFSENTRY_API_0v8) - WOLFSENTRY_THREAD_HEADER(WOLFSENTRY_THREAD_FLAG_NONE); - if (WOLFSENTRY_THREAD_GET_ERROR < 0) { - fprintf(stderr, "wolfsentry thread init error: " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(WOLFSENTRY_THREAD_GET_ERROR)); - return WOLFSSL_FAILURE; - } -#endif /* WOLFSENTRY_THREADSAFE && HAVE_WOLFSENTRY_API_0v8 */ - - if ((data = wolfSSL_get_ex_data(ssl, wolfsentry_data_index)) == NULL) - return WOLFSSL_FAILURE; - - ret = wolfsentry_route_event_dispatch( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(_wolfsentry), - (const struct wolfsentry_sockaddr *)&data->remote, - (const struct wolfsentry_sockaddr *)&data->local, - data->flags, - NULL /* event_label */, - 0 /* event_label_len */, - NULL /* caller_context */, - NULL /* id */, - NULL /* inexact_matches */, - &action_results); - - if (ret >= 0) { - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) - *decision = WOLFSSL_NETFILTER_REJECT; - else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_ACCEPT)) - *decision = WOLFSSL_NETFILTER_ACCEPT; - else - *decision = WOLFSSL_NETFILTER_PASS; - } else { - fprintf(stderr, "wolfsentry_route_event_dispatch error " - WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(ret)); - *decision = WOLFSSL_NETFILTER_PASS; - } - - printf("wolfSentry got network filter callback: family=%d proto=%d rport=%d" - " lport=%d raddr=%s laddr=%s interface=%d; decision=%d (%s)\n", - data->remote.sa_family, - data->remote.sa_proto, - data->remote.sa_port, - data->local.sa_port, - inet_ntop(data->remote.sa_family, data->remote.addr, inet_ntop_buf, - sizeof inet_ntop_buf), - inet_ntop(data->local.sa_family, data->local.addr, inet_ntop_buf2, - sizeof inet_ntop_buf2), - data->remote.interface, - *decision, - *decision == WOLFSSL_NETFILTER_REJECT ? "REJECT" : - *decision == WOLFSSL_NETFILTER_ACCEPT ? "ACCEPT" : - *decision == WOLFSSL_NETFILTER_PASS ? "PASS" : - "???"); - -#if defined(WOLFSENTRY_THREADSAFE) && defined(HAVE_WOLFSENTRY_API_0v8) - ret = WOLFSENTRY_THREAD_TAILER(WOLFSENTRY_THREAD_FLAG_NONE); - if (ret < 0) { - fprintf(stderr, "wolfsentry thread exit error: " - WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(ret)); - } -#endif - - return WOLFSSL_SUCCESS; -} - -static int wolfsentry_setup( - struct wolfsentry_context **_wolfsentry, - const char *_wolfsentry_config_path, - wolfsentry_route_flags_t route_flags) -{ - wolfsentry_errcode_t ret; - -#ifdef HAVE_WOLFSENTRY_API_0v8 -#ifdef WOLFSENTRY_THREADSAFE - WOLFSENTRY_THREAD_HEADER(WOLFSENTRY_THREAD_FLAG_NONE); - if (WOLFSENTRY_THREAD_GET_ERROR < 0) { - fprintf(stderr, "wolfsentry thread init error: " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(WOLFSENTRY_THREAD_GET_ERROR)); - err_sys("unable to initialize wolfSentry thread context"); - } -#endif - ret = wolfsentry_init(wolfsentry_build_settings, - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(NULL /* hpi */), - NULL /* default config */, - _wolfsentry); -#else - ret = wolfsentry_init(NULL /* hpi */, NULL /* default config */, - _wolfsentry); -#endif - if (ret < 0) { - fprintf(stderr, "wolfsentry_init() returned " WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); - err_sys("unable to initialize wolfSentry"); - } - - if (wolfsentry_data_index < 0) - wolfsentry_data_index = wolfSSL_get_ex_new_index(0, NULL, NULL, NULL, - NULL); - -#if !defined(NO_FILESYSTEM) && !defined(WOLFSENTRY_NO_JSON) - if (_wolfsentry_config_path != NULL) { - unsigned char buf[512]; - char err_buf[512]; - struct wolfsentry_json_process_state *jps; - - FILE *f = fopen(_wolfsentry_config_path, "r"); - - if (f == NULL) { - fprintf(stderr, "fopen(%s): %s\n",_wolfsentry_config_path,strerror(errno)); - err_sys("unable to open wolfSentry config file"); - } - - if ((ret = wolfsentry_config_json_init( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry), - WOLFSENTRY_CONFIG_LOAD_FLAG_NONE, - &jps)) < 0) { - fprintf(stderr, "wolfsentry_config_json_init() returned " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); - err_sys("error while initializing wolfSentry config parser"); - } - - for (;;) { - size_t n = fread(buf, 1, sizeof buf, f); - if ((n < sizeof buf) && ferror(f)) { - fprintf(stderr,"fread(%s): %s\n",_wolfsentry_config_path, strerror(errno)); - err_sys("error while reading wolfSentry config file"); - } - - ret = wolfsentry_config_json_feed(jps, buf, n, err_buf, sizeof err_buf); - if (ret < 0) { - fprintf(stderr, "%.*s\n", (int)sizeof err_buf, err_buf); - err_sys("error while loading wolfSentry config file"); - } - if ((n < sizeof buf) && feof(f)) - break; - } - fclose(f); - - if ((ret = wolfsentry_config_json_fini(&jps, err_buf, sizeof err_buf)) < 0) { - fprintf(stderr, "%.*s\n", (int)sizeof err_buf, err_buf); - err_sys("error while loading wolfSentry config file"); - } - - } else -#endif /* !NO_FILESYSTEM && !WOLFSENTRY_NO_JSON */ - { - struct wolfsentry_route_table *table; - -#ifdef WOLFSENTRY_THREADSAFE - ret = WOLFSENTRY_SHARED_EX(*_wolfsentry); - if (ret < 0) { - fprintf(stderr, "wolfsentry shared lock op failed: " - WOLFSENTRY_ERROR_FMT ".\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); - return ret; - } -#endif - - if ((ret = wolfsentry_route_get_main_table( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry), - &table)) < 0) - { - fprintf(stderr, "wolfsentry_route_get_main_table() returned " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); -#ifdef WOLFSENTRY_THREADSAFE - WOLFSENTRY_WARN_ON_FAILURE( - wolfsentry_context_unlock( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry))); -#endif - return ret; - } - - if (WOLFSENTRY_MASKIN_BITS(route_flags, WOLFSENTRY_ROUTE_FLAG_DIRECTION_OUT)) { - WOLFSENTRY_SOCKADDR(128) remote, local; - wolfsentry_ent_id_t id; - wolfsentry_action_res_t action_results; - - if ((ret = wolfsentry_route_table_default_policy_set( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry), - table, - WOLFSENTRY_ACTION_RES_ACCEPT)) - < 0) { - fprintf(stderr, - "wolfsentry_route_table_default_policy_set() returned " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); -#ifdef WOLFSENTRY_THREADSAFE - WOLFSENTRY_WARN_ON_FAILURE( - wolfsentry_context_unlock( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry))); -#endif - return ret; - } - - XMEMSET(&remote, 0, sizeof remote); - XMEMSET(&local, 0, sizeof local); -#ifdef TEST_IPV6 - remote.sa_family = local.sa_family = AF_INET6; - remote.addr_len = 128; - XMEMCPY(remote.addr, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001", 16); -#else - remote.sa_family = local.sa_family = AF_INET; - remote.addr_len = 32; - XMEMCPY(remote.addr, "\177\000\000\001", 4); -#endif - - if ((ret = wolfsentry_route_insert - (WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry), - NULL /* caller_context */, - (const struct wolfsentry_sockaddr *)&remote, - (const struct wolfsentry_sockaddr *)&local, - route_flags | - WOLFSENTRY_ROUTE_FLAG_GREENLISTED | - WOLFSENTRY_ROUTE_FLAG_PARENT_EVENT_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_REMOTE_INTERFACE_WILDCARD| - WOLFSENTRY_ROUTE_FLAG_LOCAL_INTERFACE_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_ADDR_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_PROTO_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_REMOTE_PORT_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_PORT_WILDCARD, - 0 /* event_label_len */, 0 /* event_label */, &id, - &action_results)) < 0) { - fprintf(stderr, "wolfsentry_route_insert() returned " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); -#ifdef WOLFSENTRY_THREADSAFE - WOLFSENTRY_WARN_ON_FAILURE( - wolfsentry_context_unlock( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry))); -#endif - return ret; - } - } else if (WOLFSENTRY_MASKIN_BITS(route_flags, WOLFSENTRY_ROUTE_FLAG_DIRECTION_IN)) { - WOLFSENTRY_SOCKADDR(128) remote, local; - wolfsentry_ent_id_t id; - wolfsentry_action_res_t action_results; - - if ((ret = wolfsentry_route_table_default_policy_set( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry), table, - WOLFSENTRY_ACTION_RES_REJECT|WOLFSENTRY_ACTION_RES_STOP)) - < 0) { - fprintf(stderr, - "wolfsentry_route_table_default_policy_set() returned " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); -#ifdef WOLFSENTRY_THREADSAFE - WOLFSENTRY_WARN_ON_FAILURE( - wolfsentry_context_unlock( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry))); -#endif - return ret; - } - - XMEMSET(&remote, 0, sizeof remote); - XMEMSET(&local, 0, sizeof local); -#ifdef TEST_IPV6 - remote.sa_family = local.sa_family = AF_INET6; - remote.addr_len = 128; - XMEMCPY(remote.addr, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001", 16); -#else - remote.sa_family = local.sa_family = AF_INET; - remote.addr_len = 32; - XMEMCPY(remote.addr, "\177\000\000\001", 4); -#endif - - if ((ret = wolfsentry_route_insert - (WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry), - NULL /* caller_context */, - (const struct wolfsentry_sockaddr *)&remote, - (const struct wolfsentry_sockaddr *)&local, - route_flags | - WOLFSENTRY_ROUTE_FLAG_GREENLISTED | - WOLFSENTRY_ROUTE_FLAG_PARENT_EVENT_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_REMOTE_INTERFACE_WILDCARD| - WOLFSENTRY_ROUTE_FLAG_LOCAL_INTERFACE_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_ADDR_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_PROTO_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_REMOTE_PORT_WILDCARD | - WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_PORT_WILDCARD, - 0 /* event_label_len */, 0 /* event_label */, &id, - &action_results)) < 0) { - fprintf(stderr, "wolfsentry_route_insert() returned " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(ret)); -#ifdef WOLFSENTRY_THREADSAFE - WOLFSENTRY_WARN_ON_FAILURE( - wolfsentry_context_unlock( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry))); -#endif - return ret; - } - } -#ifdef WOLFSENTRY_THREADSAFE - WOLFSENTRY_WARN_ON_FAILURE( - wolfsentry_context_unlock( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(*_wolfsentry))); -#endif - } - -#if defined(WOLFSENTRY_THREADSAFE) && defined(HAVE_WOLFSENTRY_API_0v8) - ret = WOLFSENTRY_THREAD_TAILER(WOLFSENTRY_THREAD_FLAG_NONE); - if (ret < 0) { - fprintf(stderr, "wolfsentry thread exit error: " - WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(ret)); - } -#endif - - return 0; -} - -static WC_INLINE int tcp_connect_with_wolfSentry( - SOCKET_T* sockfd, - const char* ip, - word16 port, - int udp, - int sctp, - WOLFSSL* ssl, - struct wolfsentry_context *_wolfsentry) -{ - SOCKADDR_IN_T remote_addr; - struct wolfsentry_data *wolfsentry_data; - char inet_ntop_buf[INET6_ADDRSTRLEN], inet_ntop_buf2[INET6_ADDRSTRLEN]; - wolfsentry_errcode_t ret; - wolfsentry_action_res_t action_results; - wolfSSL_netfilter_decision_t decision; - -#if defined(WOLFSENTRY_THREADSAFE) && defined(HAVE_WOLFSENTRY_API_0v8) - WOLFSENTRY_THREAD_HEADER(WOLFSENTRY_THREAD_FLAG_NONE); - if (WOLFSENTRY_THREAD_GET_ERROR < 0) { - fprintf(stderr, "wolfsentry thread init error: " - WOLFSENTRY_ERROR_FMT "\n", - WOLFSENTRY_ERROR_FMT_ARGS(WOLFSENTRY_THREAD_GET_ERROR)); - err_sys("unable to initialize wolfSentry thread context"); - } -#endif - - build_addr(&remote_addr, ip, port, udp, sctp); - - { - SOCKADDR_IN_T local_addr; -#ifdef TEST_IPV6 - local_addr.sin6_port = 0; -#else - local_addr.sin_port = 0; -#endif - ((struct sockaddr *)&local_addr)->sa_family = ((struct sockaddr *)&remote_addr)->sa_family; - - if (wolfsentry_store_endpoints( - ssl, &remote_addr, &local_addr, - udp ? IPPROTO_UDP : IPPROTO_TCP, - WOLFSENTRY_ROUTE_FLAG_DIRECTION_OUT| - WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_ADDR_WILDCARD| - WOLFSENTRY_ROUTE_FLAG_SA_LOCAL_PORT_WILDCARD, &wolfsentry_data) != WOLFSSL_SUCCESS) - return WOLFSSL_FAILURE; - } - - ret = wolfsentry_route_event_dispatch( - WOLFSENTRY_CONTEXT_ARGS_OUT_EX(_wolfsentry), - (const struct wolfsentry_sockaddr *)&wolfsentry_data->remote, - (const struct wolfsentry_sockaddr *)&wolfsentry_data->local, - wolfsentry_data->flags, - NULL /* event_label */, - 0 /* event_label_len */, - NULL /* caller_context */, - NULL /* id */, - NULL /* inexact_matches */, - &action_results); - - if (ret < 0) { - fprintf(stderr, "wolfsentry_route_event_dispatch error " - WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(ret)); - decision = WOLFSSL_NETFILTER_PASS; - } else { - if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_REJECT)) - decision = WOLFSSL_NETFILTER_REJECT; - else if (WOLFSENTRY_MASKIN_BITS(action_results, WOLFSENTRY_ACTION_RES_ACCEPT)) - decision = WOLFSSL_NETFILTER_ACCEPT; - else - decision = WOLFSSL_NETFILTER_PASS; - } - - printf("wolfSentry callin from tcp_connect_with_wolfSentry: family=%d proto=%d rport=%d" - " lport=%d raddr=%s laddr=%s interface=%d; decision=%d (%s)\n", - wolfsentry_data->remote.sa_family, - wolfsentry_data->remote.sa_proto, - wolfsentry_data->remote.sa_port, - wolfsentry_data->local.sa_port, - inet_ntop(wolfsentry_data->remote.sa_family, wolfsentry_data->remote.addr, inet_ntop_buf, - sizeof inet_ntop_buf), - inet_ntop(wolfsentry_data->local.sa_family, wolfsentry_data->local.addr, inet_ntop_buf2, - sizeof inet_ntop_buf2), - wolfsentry_data->remote.interface, - decision, - decision == WOLFSSL_NETFILTER_REJECT ? "REJECT" : - decision == WOLFSSL_NETFILTER_ACCEPT ? "ACCEPT" : - decision == WOLFSSL_NETFILTER_PASS ? "PASS" : - "???"); - - if (decision == WOLFSSL_NETFILTER_REJECT) - return SOCKET_FILTERED_E; - - if (udp) { - wolfSSL_dtls_set_peer(ssl, &remote_addr, sizeof(remote_addr)); - } - tcp_socket(sockfd, udp, sctp); - - if (!udp) { - if (connect(*sockfd, (const struct sockaddr*)&remote_addr, sizeof(remote_addr)) != 0) - err_sys_with_errno("tcp connect failed"); - } - -#if defined(WOLFSENTRY_THREADSAFE) && defined(HAVE_WOLFSENTRY_API_0v8) - ret = WOLFSENTRY_THREAD_TAILER(WOLFSENTRY_THREAD_FLAG_NONE); - if (ret < 0) { - fprintf(stderr, "wolfsentry thread exit error: " - WOLFSENTRY_ERROR_FMT "\n", WOLFSENTRY_ERROR_FMT_ARGS(ret)); - } -#endif - - return WOLFSSL_SUCCESS; -} - -#define tcp_connect(sockfd, ip, port, udp, sctp, ssl) \ - tcp_connect_with_wolfSentry(sockfd, ip, port, udp, sctp, ssl, wolfsentry) +#include #else /* !WOLFSSL_WOLFSENTRY_HOOKS */ @@ -2187,7 +1686,8 @@ if (bind(*sockfd, (const struct sockaddr*)&addr, sizeof(addr)) != 0) err_sys_with_errno("tcp bind failed"); - #if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_TIRTOS) + #if !defined(USE_WINDOWS_API) && !defined(WOLFSSL_TIRTOS) && \ + !defined(SINGLE_THREADED) if (port == 0) { socklen_t len = sizeof(addr); if (getsockname(*sockfd, (struct sockaddr*)&addr, &len) == 0) { @@ -2198,31 +1698,24 @@ #endif } } + #else + (void)port; #endif if (args != NULL && args->signal != NULL) { -#if defined(_POSIX_THREADS) && !defined(__MINGW32__) - /* signal ready to accept data */ +#ifndef SINGLE_THREADED tcp_ready* ready = args->signal; - PTHREAD_CHECK_RET(pthread_mutex_lock(&ready->mutex)); - ready->ready = 1; - ready->port = port; - PTHREAD_CHECK_RET(pthread_cond_signal(&ready->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&ready->mutex)); -#elif defined (WOLFSSL_TIRTOS) - /* Need mutex? */ - tcp_ready* ready = args->signal; - ready->ready = 1; - ready->port = port; -#elif defined(NETOS) - tcp_ready* ready = args->signal; - (void)tx_mutex_get(&ready->mutex, TX_WAIT_FOREVER); + #ifdef WOLFSSL_COND + THREAD_CHECK_RET(wolfSSL_CondStart(&ready->cond)); + #endif ready->ready = 1; ready->port = port; - (void)tx_mutex_put(&ready->mutex); -#else - (void)port; -#endif + #ifdef WOLFSSL_COND + /* signal ready to accept data */ + THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&ready->cond)); + #endif +#endif /* !SINGLE_THREADED */ } else { fprintf(stderr, "args or args->signal was NULL. Not setting ready info."); @@ -2248,36 +1741,22 @@ if(do_listen) { tcp_listen(sockfd, &port, useAnyAddr, udp, sctp); - #if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && !defined(__MINGW32__) - /* signal ready to tcp_accept */ - if (args) - ready = args->signal; - if (ready) { - PTHREAD_CHECK_RET(pthread_mutex_lock(&ready->mutex)); - ready->ready = 1; - ready->port = port; - PTHREAD_CHECK_RET(pthread_cond_signal(&ready->cond)); - PTHREAD_CHECK_RET(pthread_mutex_unlock(&ready->mutex)); - } - #elif defined (WOLFSSL_TIRTOS) - /* Need mutex? */ - if (args) - ready = args->signal; - if (ready) { - ready->ready = 1; - ready->port = port; - } - #elif defined(NETOS) +#ifndef SINGLE_THREADED /* signal ready to tcp_accept */ if (args) ready = args->signal; if (ready) { - (void)tx_mutex_get(&ready->mutex, TX_WAIT_FOREVER); + #ifdef WOLFSSL_COND + THREAD_CHECK_RET(wolfSSL_CondStart(&ready->cond)); + #endif ready->ready = 1; ready->port = port; - (void)tx_mutex_put(&ready->mutex); + #ifdef WOLFSSL_COND + THREAD_CHECK_RET(wolfSSL_CondSignal(&ready->cond)); + THREAD_CHECK_RET(wolfSSL_CondEnd(&ready->cond)); + #endif } - #endif +#endif /* !SINGLE_THREADED */ if (ready_file) { #if !defined(NO_FILESYSTEM) || defined(FORCE_BUFFER_TEST) && \ @@ -2313,7 +1792,7 @@ static WC_INLINE void tcp_set_nonblocking(SOCKET_T* sockfd) { - #ifdef USE_WINDOWS_API + #if defined(USE_WINDOWS_API) || defined(EBSNET) unsigned long blocking = 1; int ret = ioctlsocket(*sockfd, FIONBIO, &blocking); if (ret == SOCKET_ERROR) @@ -2353,7 +1832,6 @@ #endif } - #ifndef NO_PSK /* identity is OpenSSL testing default for openssl s_client, keep same */ @@ -2363,6 +1841,8 @@ char* identity, unsigned int id_max_len, unsigned char* key, unsigned int key_max_len) { + unsigned int ret; + (void)ssl; (void)hint; (void)key_max_len; @@ -2372,13 +1852,13 @@ if (wolfSSL_GetVersion(ssl) < WOLFSSL_TLSV1_3) { /* test key in hex is 0x1a2b3c4d , in decimal 439,041,101 , we're using - unsigned binary */ + * unsigned binary */ key[0] = 0x1a; key[1] = 0x2b; key[2] = 0x3c; key[3] = 0x4d; - return 4; /* length of key in octets or 0 for error */ + ret = 4; /* length of key in octets or 0 for error */ } else { int i; @@ -2387,17 +1867,26 @@ for (i = 0; i < 32; i++, b += 0x22) { if (b >= 0x100) b = 0x01; - key[i] = b; + key[i] = (unsigned char) b; } - return 32; /* length of key in octets or 0 for error */ + ret = 32; /* length of key in octets or 0 for error */ } + +#if defined(HAVE_PK_CALLBACKS) && defined(TEST_PK_PSK) + WOLFSSL_PKMSG("PSK Client using HW (Len %d, Hint %s)\n", ret, hint); + ret = (unsigned int)USE_HW_PSK; +#endif + + return ret; } static WC_INLINE unsigned int my_psk_server_cb(WOLFSSL* ssl, const char* identity, unsigned char* key, unsigned int key_max_len) { + unsigned int ret; + (void)ssl; (void)key_max_len; @@ -2407,13 +1896,13 @@ if (wolfSSL_GetVersion(ssl) < WOLFSSL_TLSV1_3) { /* test key in hex is 0x1a2b3c4d , in decimal 439,041,101 , we're using - unsigned binary */ + * unsigned binary */ key[0] = 0x1a; key[1] = 0x2b; key[2] = 0x3c; key[3] = 0x4d; - return 4; /* length of key in octets or 0 for error */ + ret = 4; /* length of key in octets or 0 for error */ } else { int i; @@ -2422,11 +1911,17 @@ for (i = 0; i < 32; i++, b += 0x22) { if (b >= 0x100) b = 0x01; - key[i] = b; + key[i] = (unsigned char) b; } - return 32; /* length of key in octets or 0 for error */ + ret = 32; /* length of key in octets or 0 for error */ } +#if defined(HAVE_PK_CALLBACKS) && defined(TEST_PK_PSK) + WOLFSSL_PKMSG("PSK Server using HW (Len %d, Hint %s)\n", ret, identity); + ret = (unsigned int)USE_HW_PSK; +#endif + + return ret; } #ifdef WOLFSSL_TLS13 @@ -2434,6 +1929,7 @@ const char* hint, char* identity, unsigned int id_max_len, unsigned char* key, unsigned int key_max_len, const char** ciphersuite) { + unsigned int ret; int i; int b = 0x01; const char* userCipher = (const char*)wolfSSL_get_psk_callback_ctx(ssl); @@ -2448,12 +1944,19 @@ for (i = 0; i < 32; i++, b += 0x22) { if (b >= 0x100) b = 0x01; - key[i] = b; + key[i] = (unsigned char) b; } *ciphersuite = userCipher ? userCipher : "TLS13-AES128-GCM-SHA256"; - return 32; /* length of key in octets or 0 for error */ + ret = 32; /* length of key in octets or 0 for error */ + +#if defined(HAVE_PK_CALLBACKS) && defined(TEST_PK_PSK) + WOLFSSL_PKMSG("PSK Client TLS 1.3 using HW (Len %d, Hint %s)\n", ret, hint); + ret = (unsigned int)USE_HW_PSK; +#endif + + return ret; } @@ -2461,9 +1964,10 @@ const char* identity, unsigned char* key, unsigned int key_max_len, const char** ciphersuite) { + unsigned int ret; int i; int b = 0x01; - int kIdLen = (int)XSTRLEN(kIdentityStr); + size_t kIdLen = XSTRLEN(kIdentityStr); const char* userCipher = (const char*)wolfSSL_get_psk_callback_ctx(ssl); (void)ssl; @@ -2479,12 +1983,20 @@ for (i = 0; i < 32; i++, b += 0x22) { if (b >= 0x100) b = 0x01; - key[i] = b; + key[i] = (unsigned char) b; } *ciphersuite = userCipher ? userCipher : "TLS13-AES128-GCM-SHA256"; - return 32; /* length of key in octets or 0 for error */ + ret = 32; /* length of key in octets or 0 for error */ + +#if defined(HAVE_PK_CALLBACKS) && defined(TEST_PK_PSK) + WOLFSSL_PKMSG("PSK Server TLS 1.3 using HW (Len %d, Hint %s)\n", + ret, identity); + ret = (unsigned int)USE_HW_PSK; +#endif + + return ret; } #endif @@ -2534,7 +2046,7 @@ for (i = 0; i < 32; i++, b += 0x22) { if (b >= 0x100) b = 0x01; - local_psk[i] = b; + local_psk[i] = (unsigned char) b; } *id = local_psk; @@ -2574,7 +2086,7 @@ #ifdef WOLFSSL_PSK_MULTI_ID_PER_CS /* Multiple calls for each cipher suite. First identity byte indicates the - * number of identites seen so far for cipher suite. */ + * number of identities seen so far for cipher suite. */ if (identity[0] != 0) { return 0; } @@ -2587,7 +2099,7 @@ for (i = 0; i < 32; i++, b += 0x22) { if (b >= 0x100) b = 0x01; - key[i] = b; + key[i] = (unsigned char) b; } return 32; /* length of key in octets or 0 for error */ @@ -2897,7 +2409,8 @@ char buffer[WOLFSSL_MAX_ERROR_SZ]; #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) WOLFSSL_X509* peer; -#if defined(SHOW_CERTS) && !defined(NO_FILESYSTEM) +#if defined(SHOW_CERTS) && !defined(NO_FILESYSTEM) && \ + !defined(OPENSSL_EXTRA_X509_SMALL) WOLFSSL_BIO* bio = NULL; WOLFSSL_STACK* sk = NULL; X509* x509 = NULL; @@ -2920,7 +2433,7 @@ */ fprintf(stderr, "In verification callback, error = %d, %s\n", store->error, - wolfSSL_ERR_error_string(store->error, buffer)); + wolfSSL_ERR_error_string((unsigned long) store->error, buffer)); #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) peer = store->current_cert; if (peer) { @@ -2942,7 +2455,8 @@ XFREE(subject, 0, DYNAMIC_TYPE_OPENSSL); XFREE(issuer, 0, DYNAMIC_TYPE_OPENSSL); -#if defined(SHOW_CERTS) && !defined(NO_FILESYSTEM) +#if defined(SHOW_CERTS) && !defined(NO_FILESYSTEM) && \ + !defined(OPENSSL_EXTRA_X509_SMALL) /* avoid printing duplicate certs */ if (store->depth == 1) { int i; @@ -3044,37 +2558,42 @@ #endif #ifndef NO_DH -static WC_INLINE void SetDH(WOLFSSL* ssl) -{ - /* dh1024 p */ - static const unsigned char p[] = +#if defined(WOLFSSL_SP_MATH) && !defined(WOLFSS_SP_MATH_ALL) + /* dh2048 p */ + static const unsigned char test_dh_p[] = { - 0xE6, 0x96, 0x9D, 0x3D, 0x49, 0x5B, 0xE3, 0x2C, 0x7C, 0xF1, 0x80, 0xC3, - 0xBD, 0xD4, 0x79, 0x8E, 0x91, 0xB7, 0x81, 0x82, 0x51, 0xBB, 0x05, 0x5E, - 0x2A, 0x20, 0x64, 0x90, 0x4A, 0x79, 0xA7, 0x70, 0xFA, 0x15, 0xA2, 0x59, - 0xCB, 0xD5, 0x23, 0xA6, 0xA6, 0xEF, 0x09, 0xC4, 0x30, 0x48, 0xD5, 0xA2, - 0x2F, 0x97, 0x1F, 0x3C, 0x20, 0x12, 0x9B, 0x48, 0x00, 0x0E, 0x6E, 0xDD, - 0x06, 0x1C, 0xBC, 0x05, 0x3E, 0x37, 0x1D, 0x79, 0x4E, 0x53, 0x27, 0xDF, - 0x61, 0x1E, 0xBB, 0xBE, 0x1B, 0xAC, 0x9B, 0x5C, 0x60, 0x44, 0xCF, 0x02, - 0x3D, 0x76, 0xE0, 0x5E, 0xEA, 0x9B, 0xAD, 0x99, 0x1B, 0x13, 0xA6, 0x3C, - 0x97, 0x4E, 0x9E, 0xF1, 0x83, 0x9E, 0xB5, 0xDB, 0x12, 0x51, 0x36, 0xF7, - 0x26, 0x2E, 0x56, 0xA8, 0x87, 0x15, 0x38, 0xDF, 0xD8, 0x23, 0xC6, 0x50, - 0x50, 0x85, 0xE2, 0x1F, 0x0D, 0xD5, 0xC8, 0x6B, + 0xD3, 0xB2, 0x99, 0x84, 0x5C, 0x0A, 0x4C, 0xE7, 0x37, 0xCC, 0xFC, 0x18, + 0x37, 0x01, 0x2F, 0x5D, 0xC1, 0x4C, 0xF4, 0x5C, 0xC9, 0x82, 0x8D, 0xB7, + 0xF3, 0xD4, 0xA9, 0x8A, 0x9D, 0x34, 0xD7, 0x76, 0x57, 0xE5, 0xE5, 0xC3, + 0xE5, 0x16, 0x85, 0xCA, 0x4D, 0xD6, 0x5B, 0xC1, 0xF8, 0xCF, 0x89, 0x26, + 0xD0, 0x38, 0x8A, 0xEE, 0xF3, 0xCD, 0x33, 0xE5, 0x56, 0xBB, 0x90, 0x83, + 0x9F, 0x97, 0x8E, 0x71, 0xFB, 0x27, 0xE4, 0x35, 0x15, 0x45, 0x86, 0x09, + 0x71, 0xA8, 0x9A, 0xB9, 0x3E, 0x0F, 0x51, 0x8A, 0xC2, 0x75, 0x51, 0x23, + 0x12, 0xFB, 0x94, 0x31, 0x44, 0xBF, 0xCE, 0xF6, 0xED, 0xA6, 0x3A, 0xB7, + 0x92, 0xCE, 0x16, 0xA9, 0x14, 0xB3, 0x88, 0xB7, 0x13, 0x81, 0x71, 0x83, + 0x88, 0xCD, 0xB1, 0xA2, 0x37, 0xE1, 0x59, 0x5C, 0xD0, 0xDC, 0xCA, 0x82, + 0x87, 0xFA, 0x43, 0x44, 0xDD, 0x78, 0x3F, 0xCA, 0x27, 0x7E, 0xE1, 0x6B, + 0x93, 0x19, 0x7C, 0xD9, 0xA6, 0x96, 0x47, 0x0D, 0x12, 0xC1, 0x13, 0xD7, + 0xB9, 0x0A, 0x40, 0xD9, 0x1F, 0xFF, 0xB8, 0xB4, 0x00, 0xC8, 0xAA, 0x5E, + 0xD2, 0x66, 0x4A, 0x05, 0x8E, 0x9E, 0xF5, 0x34, 0xE7, 0xD7, 0x09, 0x7B, + 0x15, 0x49, 0x1D, 0x76, 0x31, 0xD6, 0x71, 0xEC, 0x13, 0x4E, 0x89, 0x8C, + 0x09, 0x22, 0xD8, 0xE7, 0xA3, 0xE9, 0x7D, 0x21, 0x51, 0x26, 0x6E, 0x9F, + 0x30, 0x8A, 0xBB, 0xBC, 0x74, 0xC1, 0xC3, 0x27, 0x6A, 0xCE, 0xA3, 0x12, + 0x60, 0x68, 0x01, 0xD2, 0x34, 0x07, 0x80, 0xCC, 0x2D, 0x7F, 0x5C, 0xAE, + 0xA2, 0x97, 0x40, 0xC8, 0x3C, 0xAC, 0xDB, 0x6F, 0xFE, 0x6C, 0x6D, 0xD2, + 0x06, 0x1C, 0x43, 0xA2, 0xB2, 0x2B, 0x82, 0xB7, 0xD0, 0xAB, 0x3F, 0x2C, + 0xE7, 0x9C, 0x19, 0x16, 0xD1, 0x5E, 0x26, 0x86, 0xC7, 0x92, 0xF9, 0x16, + 0x0B, 0xFA, 0x66, 0x83 }; - /* dh1024 g */ - static const unsigned char g[] = + /* dh2048 g */ + static const unsigned char test_dh_g[] = { 0x02, }; - - wolfSSL_SetTmpDH(ssl, p, sizeof(p), g, sizeof(g)); -} - -static WC_INLINE void SetDHCtx(WOLFSSL_CTX* ctx) -{ +#else /* dh1024 p */ - static const unsigned char p[] = + static const unsigned char test_dh_p[] = { 0xE6, 0x96, 0x9D, 0x3D, 0x49, 0x5B, 0xE3, 0x2C, 0x7C, 0xF1, 0x80, 0xC3, 0xBD, 0xD4, 0x79, 0x8E, 0x91, 0xB7, 0x81, 0x82, 0x51, 0xBB, 0x05, 0x5E, @@ -3090,12 +2609,22 @@ }; /* dh1024 g */ - static const unsigned char g[] = + static const unsigned char test_dh_g[] = { 0x02, }; +#endif + +static WC_INLINE void SetDH(WOLFSSL* ssl) +{ + wolfSSL_SetTmpDH(ssl, test_dh_p, sizeof(test_dh_p), test_dh_g, + sizeof(test_dh_g)); +} - wolfSSL_CTX_SetTmpDH(ctx, p, sizeof(p), g, sizeof(g)); +static WC_INLINE void SetDHCtx(WOLFSSL_CTX* ctx) +{ + wolfSSL_CTX_SetTmpDH(ctx, test_dh_p, sizeof(test_dh_p), test_dh_g, + sizeof(test_dh_g)); } #endif /* NO_DH */ @@ -3195,7 +2724,7 @@ if (ret != 0) return ret; ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl), - wolfSSL_GetMacSecret(ssl, macVerify), wolfSSL_GetHmacSize(ssl)); + wolfSSL_GetMacSecret(ssl, macVerify), (word32) wolfSSL_GetHmacSize(ssl)); if (ret != 0) return ret; ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner)); @@ -3224,7 +2753,12 @@ iv = wolfSSL_GetServerWriteIV(ssl); } - ret = wc_AesSetKey(&encCtx->aes, key, keyLen, iv, AES_ENCRYPTION); + ret = wc_AesInit(&encCtx->aes, NULL, INVALID_DEVID); + if (ret != 0) { + fprintf(stderr, "AesInit failed in myMacEncryptCb\n"); + return ret; + } + ret = wc_AesSetKey(&encCtx->aes, key, (word32) keyLen, iv, AES_ENCRYPTION); if (ret != 0) { fprintf(stderr, "AesSetKey failed in myMacEncryptCb\n"); return ret; @@ -3243,7 +2777,7 @@ { AtomicDecCtx* decCtx = (AtomicDecCtx*)ctx; int ret = 0; - int macInSz = 0; + unsigned int macInSz = 0; int ivExtra = 0; int digestSz = wolfSSL_GetHmacSize(ssl); unsigned int pad = 0; @@ -3280,7 +2814,12 @@ iv = wolfSSL_GetServerWriteIV(ssl); } - ret = wc_AesSetKey(&decCtx->aes, key, keyLen, iv, AES_DECRYPTION); + ret = wc_AesInit(&decCtx->aes, NULL, INVALID_DEVID); + if (ret != 0) { + fprintf(stderr, "AesInit failed in myDecryptVerifyCb\n"); + return ret; + } + ret = wc_AesSetKey(&decCtx->aes, key, (word32) keyLen, iv, AES_DECRYPTION); if (ret != 0) { fprintf(stderr, "AesSetKey failed in myDecryptVerifyCb\n"); return ret; @@ -3294,7 +2833,7 @@ return ret; if (wolfSSL_GetCipherType(ssl) == WOLFSSL_AEAD_TYPE) { - *padSz = wolfSSL_GetAeadMacSize(ssl); + *padSz = (unsigned int)wolfSSL_GetAeadMacSize(ssl); return 0; /* hmac, not needed if aead mode */ } @@ -3305,8 +2844,8 @@ ivExtra = wolfSSL_GetCipherBlockSize(ssl); } - *padSz = wolfSSL_GetHmacSize(ssl) + pad + padByte; - macInSz = decSz - ivExtra - digestSz - pad - padByte; + *padSz = (unsigned int)wolfSSL_GetHmacSize(ssl) + pad + padByte; + macInSz = decSz - (unsigned int)ivExtra - (unsigned int)digestSz - pad - padByte; wolfSSL_SetTlsHmacInner(ssl, myInner, macInSz, macContent, macVerify); @@ -3314,7 +2853,7 @@ if (ret != 0) return ret; ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl), - wolfSSL_GetMacSecret(ssl, macVerify), digestSz); + wolfSSL_GetMacSecret(ssl, macVerify), (unsigned int) digestSz); if (ret != 0) return ret; ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner)); @@ -3328,7 +2867,7 @@ return ret; if (XMEMCMP(verify, decOut + decSz - digestSz - pad - padByte, - digestSz) != 0) { + (size_t) digestSz) != 0) { printf("myDecryptVerify verify failed\n"); return -1; } @@ -3374,7 +2913,12 @@ iv = wolfSSL_GetServerWriteIV(ssl); } - ret = wc_AesSetKey(&encCtx->aes, key, keyLen, iv, AES_ENCRYPTION); + ret = wc_AesInit(&encCtx->aes, NULL, INVALID_DEVID); + if (ret != 0) { + fprintf(stderr, "AesInit failed in myMacEncryptCb\n"); + return ret; + } + ret = wc_AesSetKey(&encCtx->aes, key, (word32) keyLen, iv, AES_ENCRYPTION); if (ret != 0) { fprintf(stderr, "AesSetKey failed in myMacEncryptCb\n"); return ret; @@ -3394,7 +2938,7 @@ if (ret != 0) return ret; ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl), - wolfSSL_GetMacSecret(ssl, macVerify), wolfSSL_GetHmacSize(ssl)); + wolfSSL_GetMacSecret(ssl, macVerify), (word32) wolfSSL_GetHmacSize(ssl)); if (ret != 0) return ret; ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner)); @@ -3438,7 +2982,7 @@ if (ret != 0) return ret; ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl), - wolfSSL_GetMacSecret(ssl, macVerify), digestSz); + wolfSSL_GetMacSecret(ssl, macVerify), (word32) digestSz); if (ret != 0) return ret; ret = wc_HmacUpdate(&hmac, myInner, sizeof(myInner)); @@ -3451,7 +2995,7 @@ if (ret != 0) return ret; - if (XMEMCMP(verify, decOut + decSz, digestSz) != 0) { + if (XMEMCMP(verify, decOut + decSz, (size_t) digestSz) != 0) { printf("myDecryptVerify verify failed\n"); return -1; } @@ -3472,7 +3016,12 @@ iv = wolfSSL_GetServerWriteIV(ssl); } - ret = wc_AesSetKey(&decCtx->aes, key, keyLen, iv, AES_DECRYPTION); + ret = wc_AesInit(&decCtx->aes, NULL, INVALID_DEVID); + if (ret != 0) { + fprintf(stderr, "AesInit failed in myDecryptVerifyCb\n"); + return ret; + } + ret = wc_AesSetKey(&decCtx->aes, key, (word32) keyLen, iv, AES_DECRYPTION); if (ret != 0) { fprintf(stderr, "AesSetKey failed in myDecryptVerifyCb\n"); return ret; @@ -3496,6 +3045,7 @@ static WC_INLINE void SetupAtomicUser(WOLFSSL_CTX* ctx, WOLFSSL* ssl) { +#if !defined(NO_HMAC) && !defined(NO_AES) && defined(HAVE_AES_CBC) AtomicEncCtx* encCtx; AtomicDecCtx* decCtx; @@ -3511,7 +3061,6 @@ } XMEMSET(decCtx, 0, sizeof(AtomicDecCtx)); -#if !defined(NO_HMAC) && !defined(NO_AES) && defined(HAVE_AES_CBC) wolfSSL_CTX_SetMacEncryptCb(ctx, myMacEncryptCb); wolfSSL_SetMacEncryptCtx(ssl, encCtx); @@ -3547,13 +3096,13 @@ if (decCtx != NULL) { if (decCtx->keySetup == 1) wc_AesFree(&decCtx->aes); - free(decCtx); + free(decCtx); } } #endif /* ATOMIC_USER */ -#ifdef WOLFSSL_STATIC_MEMORY +#if defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY_LEAN) static WC_INLINE int wolfSSL_PrintStats(WOLFSSL_MEM_STATS* stats) { word16 i; @@ -3610,12 +3159,6 @@ #endif } PkCbInfo; -#if defined(DEBUG_PK_CB) || defined(TEST_PK_PRIVKEY) - #define WOLFSSL_PKMSG(...) printf(__VA_ARGS__) -#else - #define WOLFSSL_PKMSG(...) -#endif - #ifdef HAVE_ECC static WC_INLINE int myEccKeyGen(WOLFSSL* ssl, ecc_key* key, word32 keySz, @@ -3641,7 +3184,7 @@ WC_RNG *rng = wolfSSL_GetRNG(ssl); /* create new key */ - ret = wc_ecc_make_key_ex(rng, keySz, new_key, ecc_curve); + ret = wc_ecc_make_key_ex(rng, (int) keySz, new_key, ecc_curve); #ifdef TEST_PK_PRIVKEY if (ret == 0 && new_key != key) { @@ -3837,7 +3380,7 @@ byte* ikm, word32 ikmLen, int digest, void* ctx) { int ret; - int len = 0; + word32 len = 0; switch (digest) { #ifndef NO_SHA256 @@ -3968,7 +3511,7 @@ if (ret != 0) return ret; - ret = wc_curve25519_make_key(&rng, keySz, key); + ret = wc_curve25519_make_key(&rng, (int) keySz, key); wc_FreeRng(&rng); @@ -4139,7 +3682,7 @@ if (ret != 0) return ret; - ret = wc_curve448_make_key(&rng, keySz, key); + ret = wc_curve448_make_key(&rng, (int) keySz, key); wc_FreeRng(&rng); @@ -4272,7 +3815,7 @@ if (ret == 0) ret = wc_RsaSSL_Sign(in, inSz, out, *outSz, &myKey, &rng); if (ret > 0) { /* save and convert to 0 success */ - *outSz = ret; + *outSz = (word32) ret; ret = 0; } wc_FreeRsaKey(&myKey); @@ -4406,7 +3949,7 @@ &rng); } if (ret > 0) { /* save and convert to 0 success */ - *outSz = ret; + *outSz = (word32) ret; ret = 0; } wc_FreeRsaKey(&myKey); @@ -4557,7 +4100,7 @@ if (ret == 0) { ret = wc_RsaPublicEncrypt(in, inSz, out, *outSz, &myKey, &rng); if (ret > 0) { - *outSz = ret; + *outSz = (word32) ret; ret = 0; /* reset to success */ } } @@ -5283,210 +4826,4 @@ #define DTLS_CID_BUFFER_SIZE 256 -#if !defined(NO_FILESYSTEM) && ( \ - defined(WOLFSSL_TICKET_NONCE_MALLOC) && defined(HAVE_SESSION_TICKET) \ - && defined(WOLFSSL_TLS13) && \ - (!defined(HAVE_FIPS) || (defined(FIPS_VERSION_GE) && FIPS_VERSION_GE(5,3)))\ - || \ - (defined(WOLFSSL_DTLS) && !defined(WOLFSSL_NO_TLS12) && \ - !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER)) \ - || \ - (defined(HAVE_SECURE_RENEGOTIATION) && \ - !defined(NO_RSA) && \ - defined(HAVE_CHACHA) && defined(HAVE_POLY1305) && \ - defined(WOLFSSL_SHA384) && defined(WOLFSSL_AES_256) && \ - defined(HAVE_AESGCM)) \ - ) || \ - (defined(HAVE_SESSION_TICKET) && !defined(WOLFSSL_NO_TLS12) && \ - !defined(WOLFSSL_TICKET_DECRYPT_NO_CREATE) && \ - !defined(NO_WOLFSSL_CLIENT) && !defined(NO_WOLFSSL_SERVER) && \ - !defined(WOLFSSL_NO_DEF_TICKET_ENC_CB)) || \ - (defined(WOLFSSL_EXTRA_ALERTS) && !defined(WOLFSSL_NO_TLS12) && \ - !defined(NO_FILESYSTEM) && !defined(NO_CERTS) && \ - !defined(NO_RSA) && !defined(SINGLE_THREADED) && \ - !defined(NO_WOLFSSL_SERVER) && !defined(NO_WOLFSSL_CLIENT)) -#define TEST_MEMIO_BUF_SZ (64 * 1024) -struct test_memio_ctx -{ - byte c_buff[TEST_MEMIO_BUF_SZ]; - int c_len; - const char* c_ciphers; - byte s_buff[TEST_MEMIO_BUF_SZ]; - int s_len; - const char* s_ciphers; -}; - -static WC_INLINE int test_memio_write_cb(WOLFSSL *ssl, char *data, int sz, - void *ctx) -{ - struct test_memio_ctx *test_ctx; - byte *buf; - int *len; - - test_ctx = (struct test_memio_ctx*)ctx; - - if (wolfSSL_GetSide(ssl) == WOLFSSL_SERVER_END) { - buf = test_ctx->c_buff; - len = &test_ctx->c_len; - } - else { - buf = test_ctx->s_buff; - len = &test_ctx->s_len; - } - - if ((unsigned)(*len + sz) > TEST_MEMIO_BUF_SZ) - return WOLFSSL_CBIO_ERR_WANT_READ; - - XMEMCPY(buf + *len, data, sz); - *len += sz; - - return sz; -} - -static WC_INLINE int test_memio_read_cb(WOLFSSL *ssl, char *data, int sz, - void *ctx) -{ - struct test_memio_ctx *test_ctx; - int read_sz; - byte *buf; - int *len; - - test_ctx = (struct test_memio_ctx*)ctx; - - if (wolfSSL_GetSide(ssl) == WOLFSSL_SERVER_END) { - buf = test_ctx->s_buff; - len = &test_ctx->s_len; - } - else { - buf = test_ctx->c_buff; - len = &test_ctx->c_len; - } - - if (*len == 0) - return WOLFSSL_CBIO_ERR_WANT_READ; - - read_sz = sz < *len ? sz : *len; - - XMEMCPY(data, buf, read_sz); - XMEMMOVE(buf, buf + read_sz, *len - read_sz); - - *len -= read_sz; - - return read_sz; -} - -static WC_INLINE int test_memio_do_handshake(WOLFSSL *ssl_c, WOLFSSL *ssl_s, - int max_rounds, int *rounds) -{ - byte handshake_complete = 0, hs_c = 0, hs_s = 0; - int ret, err; - - if (rounds != NULL) - *rounds = 0; - while (!handshake_complete && max_rounds > 0) { - if (!hs_c) { - ret = wolfSSL_connect(ssl_c); - if (ret == WOLFSSL_SUCCESS) { - hs_c = 1; - } - else { - err = wolfSSL_get_error(ssl_c, ret); - if (err != WOLFSSL_ERROR_WANT_READ && - err != WOLFSSL_ERROR_WANT_WRITE) - return -1; - } - } - if (!hs_s) { - ret = wolfSSL_accept(ssl_s); - if (ret == WOLFSSL_SUCCESS) { - hs_s = 1; - } - else { - err = wolfSSL_get_error(ssl_s, ret); - if (err != WOLFSSL_ERROR_WANT_READ && - err != WOLFSSL_ERROR_WANT_WRITE) - return -1; - } - } - handshake_complete = hs_c && hs_s; - max_rounds--; - if (rounds != NULL) - *rounds = *rounds + 1; - } - - if (!handshake_complete) - return -1; - - return 0; -} - -static WC_INLINE int test_memio_setup(struct test_memio_ctx *ctx, - WOLFSSL_CTX **ctx_c, WOLFSSL_CTX **ctx_s, WOLFSSL **ssl_c, WOLFSSL **ssl_s, - method_provider method_c, method_provider method_s) -{ - int ret; - - if (ctx_c != NULL && *ctx_c == NULL) { - *ctx_c = wolfSSL_CTX_new(method_c()); - if (*ctx_c == NULL) - return -1; -#ifndef NO_CERTS - ret = wolfSSL_CTX_load_verify_locations(*ctx_c, caCertFile, 0); - if (ret != WOLFSSL_SUCCESS) - return -1; -#endif /* NO_CERTS */ - wolfSSL_SetIORecv(*ctx_c, test_memio_read_cb); - wolfSSL_SetIOSend(*ctx_c, test_memio_write_cb); - if (ctx->c_ciphers != NULL) { - ret = wolfSSL_CTX_set_cipher_list(*ctx_c, ctx->c_ciphers); - if (ret != WOLFSSL_SUCCESS) - return -1; - } - } - - if (ctx_s != NULL && *ctx_s == NULL) { - *ctx_s = wolfSSL_CTX_new(method_s()); - if (*ctx_s == NULL) - return -1; -#ifndef NO_CERTS - ret = wolfSSL_CTX_use_PrivateKey_file(*ctx_s, svrKeyFile, - WOLFSSL_FILETYPE_PEM); - if (ret != WOLFSSL_SUCCESS) - return- -1; - ret = wolfSSL_CTX_use_certificate_file(*ctx_s, svrCertFile, - WOLFSSL_FILETYPE_PEM); - if (ret != WOLFSSL_SUCCESS) - return -1; -#endif - wolfSSL_SetIORecv(*ctx_s, test_memio_read_cb); - wolfSSL_SetIOSend(*ctx_s, test_memio_write_cb); - if (ctx->s_ciphers != NULL) { - ret = wolfSSL_CTX_set_cipher_list(*ctx_s, ctx->s_ciphers); - if (ret != WOLFSSL_SUCCESS) - return -1; - } - } - - if (ctx_c != NULL && ssl_c != NULL) { - *ssl_c = wolfSSL_new(*ctx_c); - if (*ssl_c == NULL) - return -1; - wolfSSL_SetIOWriteCtx(*ssl_c, ctx); - wolfSSL_SetIOReadCtx(*ssl_c, ctx); - } - if (ctx_s != NULL && ssl_s != NULL) { - *ssl_s = wolfSSL_new(*ctx_s); - if (*ssl_s == NULL) - return -1; - wolfSSL_SetIOWriteCtx(*ssl_s, ctx); - wolfSSL_SetIOReadCtx(*ssl_s, ctx); -#if !defined(NO_DH) - SetDH(*ssl_s); -#endif - } - - return 0; -} -#endif - #endif /* wolfSSL_TEST_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/version.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/version.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/version.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/version.h 2024-08-03 07:30:01.000000000 +0000 @@ -28,8 +28,8 @@ extern "C" { #endif -#define LIBWOLFSSL_VERSION_STRING "5.6.3" -#define LIBWOLFSSL_VERSION_HEX 0x05006003 +#define LIBWOLFSSL_VERSION_STRING "5.7.2" +#define LIBWOLFSSL_VERSION_HEX 0x05007002 #ifdef __cplusplus } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/aes.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/aes.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/aes.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/aes.h 2024-08-03 07:30:01.000000000 +0000 @@ -36,6 +36,38 @@ #include +#if !defined(NO_AES) || defined(WOLFSSL_SM4) +typedef struct Gcm { + ALIGN16 byte H[16]; +#ifdef OPENSSL_EXTRA + word32 aadH[4]; /* additional authenticated data GHASH */ + word32 aadLen; /* additional authenticated data len */ +#endif +#ifdef GCM_TABLE + /* key-based fast multiplication table. */ + ALIGN16 byte M0[256][16]; +#elif defined(GCM_TABLE_4BIT) + #if defined(BIG_ENDIAN_ORDER) || defined(WC_16BIT_CPU) + ALIGN16 byte M0[16][16]; + #else + ALIGN16 byte M0[32][16]; + #endif +#endif /* GCM_TABLE */ +} Gcm; + +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_aes_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_AES_sanity(void); +#endif + +WOLFSSL_LOCAL void GenerateM0(Gcm* gcm); +#ifdef WOLFSSL_ARMASM +WOLFSSL_LOCAL void GMULT(byte* X, byte* Y); +#endif +WOLFSSL_LOCAL void GHASH(Gcm* gcm, const byte* a, word32 aSz, const byte* c, + word32 cSz, byte* s, word32 sSz); +#endif + #ifndef NO_AES #if defined(HAVE_FIPS) && \ @@ -43,18 +75,6 @@ #include #endif /* HAVE_FIPS_VERSION >= 2 */ -/* included for fips @wc_fips */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -#include -#if defined(CYASSL_AES_COUNTER) && !defined(WOLFSSL_AES_COUNTER) - #define WOLFSSL_AES_COUNTER -#endif -#if !defined(WOLFSSL_AES_DIRECT) && defined(CYASSL_AES_DIRECT) - #define WOLFSSL_AES_DIRECT -#endif -#endif - #ifndef WC_NO_RNG #include #endif @@ -70,10 +90,14 @@ #ifdef WOLFSSL_XILINX_CRYPT_VERSAL #include #include -#define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_AES_USER_KEY_0 +#if !defined(WOLFSSL_XILINX_AES_KEY_SRC) + #define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_AES_USER_KEY_0 +#endif #else /* versal */ #include -#define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_CSU_AES_KEY_SRC_KUP +#if !defined(WOLFSSL_XILINX_AES_KEY_SRC) + #define WOLFSSL_XILINX_AES_KEY_SRC XSECURE_CSU_AES_KEY_SRC_KUP +#endif #endif /* !versal */ #endif /* WOLFSSL_XILINX_CRYPT */ @@ -117,15 +141,21 @@ #include #endif -#if defined(WOLFSSL_RENESAS_TSIP_TLS) && \ - defined(WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT) +#if (defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + defined(WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT)) ||\ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) #include #endif +#if defined(WOLFSSL_RENESAS_FSPSM) + #include +#endif + #ifdef WOLFSSL_MAXQ10XX_CRYPTO #include #endif + #ifdef __cplusplus extern "C" { #endif @@ -154,6 +184,9 @@ AES_ENC_TYPE = WC_CIPHER_AES, /* cipher unique type */ AES_ENCRYPTION = 0, AES_DECRYPTION = 1, +#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + AES_ENCRYPTION_AND_DECRYPTION = 2, +#endif AES_BLOCK_SIZE = 16, @@ -184,11 +217,53 @@ WOLF_ENUM_DUMMY_LAST_ELEMENT(AES) }; +#ifdef WC_AES_BITSLICED + #ifdef WC_AES_BS_WORD_SIZE + #define BS_WORD_SIZE WC_AES_BS_WORD_SIZE + #elif defined(NO_64BIT) + #define BS_WORD_SIZE 32 + #else + #define BS_WORD_SIZE 64 + #endif + + /* Number of bits to a block. */ + #define AES_BLOCK_BITS (AES_BLOCK_SIZE * 8) + /* Number of bytes of input that can be processed in one call. */ + #define BS_BLOCK_SIZE (AES_BLOCK_SIZE * BS_WORD_SIZE) + /* Number of words in a block. */ + #define BS_BLOCK_WORDS (AES_BLOCK_BITS / BS_WORD_SIZE) + + #if BS_WORD_SIZE == 64 + typedef word64 bs_word; + #define BS_WORD_SHIFT 6 + #define bs_bswap(x) ByteReverseWord64(x) + #elif BS_WORD_SIZE == 32 + typedef word32 bs_word; + #define BS_WORD_SHIFT 5 + #define bs_bswap(x) ByteReverseWord32(x) + #elif BS_WORD_SIZE == 16 + typedef word16 bs_word; + #define BS_WORD_SHIFT 4 + #define bs_bswap(x) ByteReverseWord16(x) + #elif BS_WORD_SIZE == 8 + typedef word8 bs_word; + #define BS_WORD_SHIFT 3 + #define bs_bswap(x) (x) + #else + #error "Word size not supported" + #endif +#endif struct Aes { - /* AESNI needs key first, rounds 2nd, not sure why yet */ ALIGN16 word32 key[60]; +#ifdef WC_AES_BITSLICED + /* Extra key schedule space required for bit-slicing technique. */ + ALIGN16 bs_word bs_key[15 * AES_BLOCK_SIZE * BS_WORD_SIZE]; +#endif word32 rounds; +#ifdef WC_C_DYNAMIC_FALLBACK + word32 key_C_fallback[60]; +#endif int keylen; ALIGN16 word32 reg[AES_BLOCK_SIZE / sizeof(word32)]; /* for CBC mode */ @@ -199,11 +274,7 @@ word32 nonceSz; #endif #ifdef HAVE_AESGCM - ALIGN16 byte H[AES_BLOCK_SIZE]; -#ifdef OPENSSL_EXTRA - word32 aadH[4]; /* additional authenticated data GHASH */ - word32 aadLen; /* additional authenticated data len */ -#endif + Gcm gcm; #ifdef WOLFSSL_SE050 sss_symmetric_t aes_ctx; /* used as the function context */ @@ -212,16 +283,6 @@ byte keyIdSet; byte useSWCrypt; /* Use SW crypt instead of SE050, before SCP03 auth */ #endif -#ifdef GCM_TABLE - /* key-based fast multiplication table. */ - ALIGN16 byte M0[256][AES_BLOCK_SIZE]; -#elif defined(GCM_TABLE_4BIT) - #if defined(BIG_ENDIAN_ORDER) || defined(WC_16BIT_CPU) - ALIGN16 byte M0[16][AES_BLOCK_SIZE]; - #else - ALIGN16 byte M0[32][AES_BLOCK_SIZE]; - #endif -#endif /* GCM_TABLE */ #ifdef HAVE_CAVIUM_OCTEON_SYNC word32 y0; #endif @@ -292,13 +353,13 @@ #if defined(WOLFSSL_CRYPTOCELL) aes_context_t ctx; #endif -#if defined(WOLFSSL_RENESAS_TSIP_TLS) && \ - defined(WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT) +#if (defined(WOLFSSL_RENESAS_TSIP_TLS) && \ + defined(WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT)) ||\ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) TSIP_AES_CTX ctx; #endif -#if defined(WOLFSSL_RENESAS_SCEPROTECT) ||\ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - SCE_AES_CTX ctx; +#if defined(WOLFSSL_RENESAS_FSPSM) + FSPSM_AES_CTX ctx; #endif #if defined(WOLFSSL_IMXRT_DCP) dcp_handle_t handle; @@ -331,6 +392,11 @@ byte nonceSet:1; byte ctrSet:1; #endif +#ifdef WC_DEBUG_CIPHER_LIFECYCLE + void *CipherLifecycleTag; /* used for dummy allocation and initialization, + * trackable by sanitizers. + */ +#endif }; #ifndef WC_AES_TYPE_DEFINED @@ -339,16 +405,67 @@ #endif #ifdef WOLFSSL_AES_XTS -typedef struct XtsAes { - Aes aes; - Aes tweak; -} XtsAes; + #if FIPS_VERSION3_GE(6,0,0) + /* SP800-38E - Restrict data unit to 2^20 blocks per key. A block is + * AES_BLOCK_SIZE or 16-bytes (128-bits). So each key may only be used to + * protect up to 1,048,576 blocks of AES_BLOCK_SIZE (16,777,216 bytes) + */ + #define FIPS_AES_XTS_MAX_BYTES_PER_TWEAK 16777216 + #endif + struct XtsAes { + Aes aes; + #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS + Aes aes_decrypt; + #endif + Aes tweak; + }; + + #ifdef WOLFSSL_AESXTS_STREAM + struct XtsAesStreamData { + byte tweak_block[AES_BLOCK_SIZE]; + word32 bytes_crypted_with_this_tweak; + }; + #endif + + #ifndef WC_AESXTS_TYPE_DEFINED + typedef struct XtsAes XtsAes; + typedef struct XtsAesStreamData XtsAesStreamData; + #define WC_AESXTS_TYPE_DEFINED + #endif + +#endif + + +#if (!defined(WC_AESFREE_IS_MANDATORY)) && \ + (defined(WC_DEBUG_CIPHER_LIFECYCLE) || \ + (defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_AES)) || \ + defined(WOLFSSL_AFALG) || defined(WOLFSSL_AFALG_XILINX_AES) || \ + defined(WOLFSSL_KCAPI_AES) || \ + (defined(WOLFSSL_DEVCRYPTO) && \ + (defined(WOLFSSL_DEVCRYPTO_AES) || \ + defined(WOLFSSL_DEVCRYPTO_CBC))) || \ + defined(WOLFSSL_IMXRT_DCP) || \ + (defined(WOLFSSL_AESGCM_STREAM) && defined(WOLFSSL_SMALL_STACK) && \ + !defined(WOLFSSL_AESNI)) || \ + (defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_CRYPT)) || \ + (defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_AES)) || \ + defined(WOLFSSL_MAXQ10XX_CRYPTO) || \ + ((defined(WOLFSSL_RENESAS_FSPSM_TLS) || \ + defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY)) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_AES))) +#define WC_AESFREE_IS_MANDATORY #endif #ifdef HAVE_AESGCM -typedef struct Gmac { +struct Gmac { Aes aes; -} Gmac; +}; + +#ifndef WC_AESGCM_TYPE_DEFINED + typedef struct Gmac Gmac; + #define WC_AESGCM_TYPE_DEFINED +#endif + #endif /* HAVE_AESGCM */ #endif /* HAVE_FIPS */ @@ -414,16 +531,13 @@ #ifdef WOLFSSL_AES_COUNTER WOLFSSL_API int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz); + WOLFSSL_API int wc_AesCtrSetKey(Aes* aes, const byte* key, word32 len, + const byte* iv, int dir); + #endif /* AES-DIRECT */ #if defined(WOLFSSL_AES_DIRECT) -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - WOLFSSL_API void wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in); - WOLFSSL_API void wc_AesDecryptDirect(Aes* aes, byte* out, const byte* in); - WOLFSSL_API int wc_AesSetKeyDirect(Aes* aes, const byte* key, word32 len, - const byte* iv, int dir); -#elif defined(BUILDING_WOLFSSL) +#if defined(BUILDING_WOLFSSL) WOLFSSL_API WARN_UNUSED_RESULT int wc_AesEncryptDirect(Aes* aes, byte* out, const byte* in); WOLFSSL_API WARN_UNUSED_RESULT int wc_AesDecryptDirect(Aes* aes, byte* out, @@ -505,8 +619,6 @@ const byte* authIn, word32 authInSz, const byte* authTag, word32 authTagSz); #endif /* WC_NO_RNG */ - WOLFSSL_LOCAL void GHASH(Aes* aes, const byte* a, word32 aSz, const byte* c, - word32 cSz, byte* s, word32 sSz); #endif /* HAVE_AESGCM */ #ifdef HAVE_AESCCM WOLFSSL_LOCAL int wc_AesCcmCheckTagSize(int sz); @@ -529,6 +641,7 @@ byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz); #endif /* HAVE_AESCCM */ + #ifdef HAVE_AES_KEYWRAP WOLFSSL_API int wc_AesKeyWrap(const byte* key, word32 keySz, const byte* in, word32 inSz, @@ -550,6 +663,11 @@ #ifdef WOLFSSL_AES_XTS +WOLFSSL_API int wc_AesXtsInit(XtsAes* aes, void* heap, int devId); + +WOLFSSL_API int wc_AesXtsSetKeyNoInit(XtsAes* aes, const byte* key, + word32 len, int dir); + WOLFSSL_API int wc_AesXtsSetKey(XtsAes* aes, const byte* key, word32 len, int dir, void* heap, int devId); @@ -565,6 +683,36 @@ WOLFSSL_API int wc_AesXtsDecrypt(XtsAes* aes, byte* out, const byte* in, word32 sz, const byte* i, word32 iSz); +WOLFSSL_API int wc_AesXtsEncryptConsecutiveSectors(XtsAes* aes, + byte* out, const byte* in, word32 sz, word64 sector, + word32 sectorSz); + +WOLFSSL_API int wc_AesXtsDecryptConsecutiveSectors(XtsAes* aes, + byte* out, const byte* in, word32 sz, word64 sector, + word32 sectorSz); + +#ifdef WOLFSSL_AESXTS_STREAM + +WOLFSSL_API int wc_AesXtsEncryptInit(XtsAes* aes, const byte* i, word32 iSz, + struct XtsAesStreamData *stream); + +WOLFSSL_API int wc_AesXtsDecryptInit(XtsAes* aes, const byte* i, word32 iSz, + struct XtsAesStreamData *stream); + +WOLFSSL_API int wc_AesXtsEncryptUpdate(XtsAes* aes, byte* out, + const byte* in, word32 sz, struct XtsAesStreamData *stream); + +WOLFSSL_API int wc_AesXtsDecryptUpdate(XtsAes* aes, byte* out, + const byte* in, word32 sz, struct XtsAesStreamData *stream); + +WOLFSSL_API int wc_AesXtsEncryptFinal(XtsAes* aes, byte* out, + const byte* in, word32 sz, struct XtsAesStreamData *stream); + +WOLFSSL_API int wc_AesXtsDecryptFinal(XtsAes* aes, byte* out, + const byte* in, word32 sz, struct XtsAesStreamData *stream); + +#endif /* WOLFSSL_AESXTS_STREAM */ + WOLFSSL_API int wc_AesXtsFree(XtsAes* aes); #endif @@ -590,6 +738,71 @@ const byte* in, word32 inSz, byte* siv, byte* out); #endif +#ifdef WOLFSSL_AES_EAX + +/* Because of the circular dependency between AES and CMAC, we need to prevent + * inclusion of AES EAX from CMAC to avoid a recursive inclusion */ +#ifndef WOLF_CRYPT_CMAC_H +#include +struct AesEax { + Aes aes; + Cmac nonceCmac; + Cmac aadCmac; + Cmac ciphertextCmac; + byte nonceCmacFinal[AES_BLOCK_SIZE]; + byte aadCmacFinal[AES_BLOCK_SIZE]; + byte ciphertextCmacFinal[AES_BLOCK_SIZE]; + byte prefixBuf[AES_BLOCK_SIZE]; +}; +#endif /* !defined(WOLF_CRYPT_CMAC_H) */ + +typedef struct AesEax AesEax; + +/* One-shot API */ +WOLFSSL_API int wc_AesEaxEncryptAuth(const byte* key, word32 keySz, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + /* output computed auth tag */ + byte* authTag, word32 authTagSz, + /* input data to authenticate (header) */ + const byte* authIn, word32 authInSz); + +WOLFSSL_API int wc_AesEaxDecryptAuth(const byte* key, word32 keySz, byte* out, + const byte* in, word32 inSz, + const byte* nonce, word32 nonceSz, + /* auth tag to verify against */ + const byte* authTag, word32 authTagSz, + /* input data to authenticate (header) */ + const byte* authIn, word32 authInSz); + +/* Incremental API */ +WOLFSSL_API int wc_AesEaxInit(AesEax* eax, + const byte* key, word32 keySz, + const byte* nonce, word32 nonceSz, + const byte* authIn, word32 authInSz); + +WOLFSSL_API int wc_AesEaxEncryptUpdate(AesEax* eax, byte* out, + const byte* in, word32 inSz, + const byte* authIn, word32 authInSz); + +WOLFSSL_API int wc_AesEaxDecryptUpdate(AesEax* eax, byte* out, + const byte* in, word32 inSz, + const byte* authIn, word32 authInSz); + +WOLFSSL_API int wc_AesEaxAuthDataUpdate(AesEax* eax, + const byte* authIn, word32 authInSz); + +WOLFSSL_API int wc_AesEaxEncryptFinal(AesEax* eax, + byte* authTag, word32 authTagSz); + +WOLFSSL_API int wc_AesEaxDecryptFinal(AesEax* eax, + const byte* authIn, word32 authInSz); + +WOLFSSL_API int wc_AesEaxFree(AesEax* eax); + +#endif /* WOLFSSL_AES_EAX */ + + #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn.h 2024-08-03 07:30:01.000000000 +0000 @@ -45,12 +45,6 @@ #include -/* fips declare of RsaPrivateKeyDecode @wc_fips */ -#if defined(HAVE_FIPS) && !defined(NO_RSA) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - #include -#endif - #ifndef NO_DH #include #endif @@ -64,6 +58,9 @@ #include #endif #include +#ifdef WOLFSSL_SM3 + #include +#endif #include /* public interface */ #if defined(NO_SHA) && defined(NO_SHA256) @@ -139,6 +136,7 @@ ASN_DIR_TYPE = 0x04, ASN_URI_TYPE = 0x06, /* the value 6 is from GeneralName OID */ ASN_IP_TYPE = 0x07, /* the value 7 is from GeneralName OID */ + ASN_RID_TYPE = 0x08, /* PKCS #7 types */ ASN_ENC_CONTENT = 0x00, @@ -707,8 +705,10 @@ ASN_DNQUALIFIER = 0x2e, /* dnQualifier */ #endif /* WOLFSSL_CERT_NAME_ALL */ - ASN_EMAIL_NAME = 0x98, /* not actual OID (see attrEmailOid) */ - ASN_CUSTOM_NAME = 0x99, /* not actual OID (see CertOidField) */ + + ASN_CONTENT_TYPE = 0x97, /* not actual OID (see attrPkcs9ContentTypeOid) */ + ASN_EMAIL_NAME = 0x98, /* not actual OID (see attrEmailOid) */ + ASN_CUSTOM_NAME = 0x99, /* not actual OID (see CertOidField) */ /* pilot attribute types * OID values of 0.9.2342.19200300.100.1.* */ @@ -765,6 +765,7 @@ #define WOLFSSL_USER_ID "/UID=" #define WOLFSSL_DOMAIN_COMPONENT "/DC=" #define WOLFSSL_FAVOURITE_DRINK "/favouriteDrink=" +#define WOLFSSL_CONTENT_TYPE "/contentType=" #if defined(WOLFSSL_APACHE_HTTPD) /* otherName strings */ @@ -779,6 +780,20 @@ #define WOLFSSL_TLS_FEATURE_SUM 92 #endif +/* Maximum number of allowed subject alternative names in a certificate. + * Any certificate containing more than this number of subject + * alternative names will cause an error when attempting to parse. */ +#ifndef WOLFSSL_MAX_ALT_NAMES +#define WOLFSSL_MAX_ALT_NAMES 128 +#endif + +/* Maximum number of allowed name constraints in a certificate. + * Any certificate containing more than this number of name constraints + * will cause an error when attempting to parse. */ +#ifndef WOLFSSL_MAX_NAME_CONSTRAINTS +#define WOLFSSL_MAX_NAME_CONSTRAINTS 128 +#endif + #if defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) /* NIDs */ #define NID_undef 0 @@ -897,13 +912,22 @@ #endif #endif +/* Maximum OID dotted form size. */ +#define ASN1_OID_DOTTED_MAX_SZ 16 + +#ifndef WOLFSSL_ASN_MAX_LENGTH_SZ + #define WOLFSSL_ASN_MAX_LENGTH_SZ 5 /* 1 byte length + 4 bytes of number */ +#endif + enum Misc_ASN { MAX_SALT_SIZE = 64, /* MAX PKCS Salt length */ MAX_IV_SIZE = 64, /* MAX PKCS Iv length */ ASN_BOOL_SIZE = 2, /* including type */ ASN_ECC_HEADER_SZ = 2, /* String type + 1 byte len */ ASN_ECC_CONTEXT_SZ = 2, /* Content specific type + 1 byte len */ -#if defined(NO_SHA) || (!defined(NO_SHA256) && defined(WC_ASN_HASH_SHA256)) +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + KEYID_SIZE = WC_SM3_DIGEST_SIZE, +#elif defined(NO_SHA) || (!defined(NO_SHA256) && defined(WC_ASN_HASH_SHA256)) KEYID_SIZE = WC_SHA256_DIGEST_SIZE, #else KEYID_SIZE = WC_SHA_DIGEST_SIZE, @@ -922,7 +946,11 @@ MIN_DATE_SIZE = 12, MAX_DATE_SIZE = 32, ASN_GEN_TIME_SZ = 15, /* 7 numbers * 2 + Zulu tag */ -#ifndef NO_RSA +#ifdef HAVE_SPHINCS + MAX_ENCODED_SIG_SZ = 51200, +#elif defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) + MAX_ENCODED_SIG_SZ = 5120, +#elif !defined(NO_RSA) #ifdef WOLFSSL_HAPROXY MAX_ENCODED_SIG_SZ = 1024, /* Supports 8192 bit keys */ #else @@ -937,24 +965,27 @@ #endif MAX_SIG_SZ = 256, MAX_ALGO_SZ = 20, - MAX_SHORT_SZ = 6, /* asn int + byte len + 4 byte length */ - MAX_LENGTH_SZ = 4, /* Max length size for DER encoding */ - MAX_SEQ_SZ = 5, /* enum(seq | con) + length(4) */ - MAX_SET_SZ = 5, /* enum(set | con) + length(4) */ - MAX_OCTET_STR_SZ = 5, /* enum(set | con) + length(4) */ - MAX_EXP_SZ = 5, /* enum(contextspec|con|exp) + length(4) */ - MAX_PRSTR_SZ = 5, /* enum(prstr) + length(4) */ + MAX_LENGTH_SZ = WOLFSSL_ASN_MAX_LENGTH_SZ, /* Max length size for DER encoding */ + MAX_SHORT_SZ = (1 + MAX_LENGTH_SZ), /* asn int + byte len + 4 byte length */ + MAX_SEQ_SZ = (1 + MAX_LENGTH_SZ), /* enum(seq | con) + length(5) */ + MAX_SET_SZ = (1 + MAX_LENGTH_SZ), /* enum(set | con) + length(5) */ + MAX_OCTET_STR_SZ = (1 + MAX_LENGTH_SZ), /* enum(set | con) + length(5) */ + MAX_EXP_SZ = (1 + MAX_LENGTH_SZ), /* enum(contextspec|con|exp) + length(5) */ + MAX_PRSTR_SZ = (1 + MAX_LENGTH_SZ), /* enum(prstr) + length(5) */ MAX_VERSION_SZ = 5, /* enum + id + version(byte) + (header(2))*/ - MAX_ENCODED_DIG_ASN_SZ= 9, /* enum(bit or octet) + length(4) */ + MAX_ENCODED_DIG_ASN_SZ = (5 + MAX_LENGTH_SZ), /* enum(bit or octet) + length(5) */ MAX_ENCODED_DIG_SZ = 64 + MAX_ENCODED_DIG_ASN_SZ, /* asn header + sha512 */ - MAX_RSA_INT_SZ = 517, /* RSA raw sz 4096 for bits + tag + len(4) */ - MAX_DSA_INT_SZ = 389, /* DSA raw sz 3072 for bits + tag + len(4) */ + MAX_RSA_INT_SZ = (512 + 1 + MAX_LENGTH_SZ), /* RSA raw sz 4096 for bits + tag + len(5) */ + MAX_DSA_INT_SZ = (384 + 1 + MAX_LENGTH_SZ), /* DSA raw sz 3072 for bits + tag + len(5) */ MAX_DSA_PUBKEY_SZ = (DSA_PUB_INTS * MAX_DSA_INT_SZ) + (2 * MAX_SEQ_SZ) + 2 + MAX_LENGTH_SZ, /* Maximum size of a DSA public key taken from wc_SetDsaPublicKey. */ MAX_DSA_PRIVKEY_SZ = (DSA_INTS * MAX_DSA_INT_SZ) + MAX_SEQ_SZ + MAX_VERSION_SZ, /* Maximum size of a DSA Private key taken from DsaKeyIntsToDer. */ +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) + MAX_PQC_PUBLIC_KEY_SZ = 2592, /* Maximum size of a Dilithium public key. */ +#endif MAX_RSA_E_SZ = 16, /* Max RSA public e size */ MAX_CA_SZ = 32, /* Max encoded CA basic constraint length */ MAX_SN_SZ = 35, /* Max encoded serial number (INT) length */ @@ -998,11 +1029,14 @@ MAX_CERTPOL_NB = CTC_MAX_CERTPOL_NB,/* Max number of Cert Policy */ MAX_CERTPOL_SZ = CTC_MAX_CERTPOL_SZ, #endif - MAX_AIA_SZ = 2, /* Max Authority Info Access extension size*/ OCSP_NONCE_EXT_SZ = 35, /* OCSP Nonce Extension size */ MAX_OCSP_EXT_SZ = 58, /* Max OCSP Extension length */ MAX_OCSP_NONCE_SZ = 16, /* OCSP Nonce size */ +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) + MAX_PUBLIC_KEY_SZ = MAX_PQC_PUBLIC_KEY_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ * 2, +#else MAX_PUBLIC_KEY_SZ = MAX_DSA_PUBKEY_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ * 2, +#endif #ifdef WOLFSSL_ENCRYPTED_KEYS HEADER_ENCRYPTED_KEY_SIZE = 88,/* Extra header size for encrypted key */ #else @@ -1010,6 +1044,7 @@ #endif TRAILING_ZERO = 1, /* Used for size of zero pad */ ASN_TAG_SZ = 1, /* single byte ASN.1 tag */ + ASN_INDEF_END_SZ = 2, /* 0x00 0x00 at end of indef */ MIN_VERSION_SZ = 3, /* Min bytes needed for GetMyVersion */ MAX_X509_VERSION = 3, /* Max X509 version allowed */ MIN_X509_VERSION = 0, /* Min X509 version allowed */ @@ -1085,7 +1120,8 @@ SHA3_384h = 422, SHA3_512h = 423, SHAKE128h = 424, - SHAKE256h = 425 + SHAKE256h = 425, + SM3h = 640 }; #if !defined(NO_DES3) || !defined(NO_AES) @@ -1114,21 +1150,23 @@ enum Key_Sum { + ANONk = 0, DSAk = 515, RSAk = 645, RSAPSSk = 654, RSAESOAEPk = 651, /* 1.2.840.113549.1.1.7 */ ECDSAk = 518, + SM2k = 667, ED25519k = 256, /* 1.3.101.112 */ X25519k = 254, /* 1.3.101.110 */ ED448k = 257, /* 1.3.101.113 */ X448k = 255, /* 1.3.101.111 */ DHk = 647, /* dhKeyAgreement OID: 1.2.840.113549.1.3.1 */ - FALCON_LEVEL1k = 268, /* 1.3.9999.3.1 */ - FALCON_LEVEL5k = 271, /* 1.3.9999.3.4 */ - DILITHIUM_LEVEL2k = 213, /* 1.3.6.1.4.1.2.267.7.4.4 */ - DILITHIUM_LEVEL3k = 216, /* 1.3.6.1.4.1.2.267.7.6.5 */ - DILITHIUM_LEVEL5k = 220, /* 1.3.6.1.4.1.2.267.7.8.7 */ + FALCON_LEVEL1k = 273, /* 1.3.9999.3.6 */ + FALCON_LEVEL5k = 276, /* 1.3.9999.3.9 */ + DILITHIUM_LEVEL2k = 218, /* 1.3.6.1.4.1.2.267.12.4.4 */ + DILITHIUM_LEVEL3k = 221, /* 1.3.6.1.4.1.2.267.12.6.5 */ + DILITHIUM_LEVEL5k = 225, /* 1.3.6.1.4.1.2.267.12.8.7 */ SPHINCS_FAST_LEVEL1k = 281, /* 1 3 9999 6 7 4 */ SPHINCS_FAST_LEVEL3k = 283, /* 1 3 9999 6 8 3 + 2 (See GetOID() in asn.c) */ SPHINCS_FAST_LEVEL5k = 282, /* 1 3 9999 6 9 3 */ @@ -1209,7 +1247,12 @@ AKEY_PACKAGE_OID = 1048, /* 2.16.840.1.101.2.1.2.78.5 RFC 5958 - Asymmetric Key Packages */ FASCN_OID = 419, /* 2.16.840.1.101.3.6.6 Federal PKI Policy FASC-N */ - UPN_OID = 265 /* 1.3.6.1.4.1.311.20.2.3 UPN */ + UPN_OID = 265, /* 1.3.6.1.4.1.311.20.2.3 UPN */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + SUBJ_ALT_PUB_KEY_INFO_OID = 186, /* 2.5.29.72 subject alt public key info */ + ALT_SIG_ALG_OID = 187, /* 2.5.29.73 alt sig alg */ + ALT_SIG_VAL_OID = 188 /* 2.5.29.74 alt sig val */ +#endif }; enum CertificatePolicy_Sum { @@ -1359,6 +1402,10 @@ #if defined(OPENSSL_ALL) || defined(WOLFSSL_IP_ALT_NAME) char* ipString; /* human readable form of IP address */ #endif +#if defined(OPENSSL_ALL) + char* ridString; /* human readable form of registeredID */ +#endif + #ifdef WOLFSSL_FPKI int oidSum; /* provide oid sum for verification */ #endif @@ -1405,7 +1452,7 @@ #endif #endif /* HAVE_PK_CALLBACKS */ -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) ||\ +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) ||\ defined(HAVE_PK_CALLBACKS) typedef struct tagCertAttribute { byte verifyByTSIP_SCE; @@ -1450,9 +1497,13 @@ #ifdef HAVE_ED448 struct ed448_key* ed448; #endif - #ifdef HAVE_PQC + #if defined(HAVE_FALCON) struct falcon_key* falcon; + #endif + #if defined(HAVE_DILITHIUM) struct dilithium_key* dilithium; + #endif + #if defined(HAVE_SPHINCS) struct sphincs_key* sphincs; #endif void* ptr; @@ -1478,7 +1529,7 @@ #endif #endif /* HAVE_PK_CALLBACKS */ #ifndef NO_RSA -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) ||\ +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) ||\ defined(HAVE_PK_CALLBACKS) CertAttribute CertAtt; #endif @@ -1653,6 +1704,12 @@ int extCrlInfoSz; /* length of the URI */ byte extSubjKeyId[KEYID_SIZE]; /* Subject Key ID */ byte extAuthKeyId[KEYID_SIZE]; /* Authority Key ID */ +#ifdef WOLFSSL_AKID_NAME + const byte* extAuthKeyIdIssuer; /* Authority Key ID authorityCertIssuer */ + word32 extAuthKeyIdIssuerSz; /* Authority Key ID authorityCertIssuer length */ + const byte* extAuthKeyIdIssuerSN; /* Authority Key ID authorityCertSerialNumber */ + word32 extAuthKeyIdIssuerSNSz; /* Authority Key ID authorityCertSerialNumber length */ +#endif byte pathLength; /* CA basic constraint path length */ byte maxPathLen; /* max_path_len see RFC 5280 section * 6.1.2 "Initialization" - (k) for @@ -1699,6 +1756,9 @@ #if defined(HAVE_ECC) || defined(HAVE_ED25519) || defined(HAVE_ED448) word32 pkCurveOID; /* Public Key's curve OID */ + #ifdef WOLFSSL_CUSTOM_CURVES + int pkCurveSize; /* Public Key's curve size */ + #endif #endif /* HAVE_ECC */ const byte* beforeDate; int beforeDateLen; @@ -1846,7 +1906,7 @@ #ifndef NO_CERTS SignatureCtx sigCtx; #endif -#if defined(WOLFSSL_RENESAS_TSIP) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP) || defined(WOLFSSL_RENESAS_FSPSM_TLS) byte* sce_tsip_encRsaKeyIdx; #endif #ifdef WOLFSSL_MAXQ10XX_TLS @@ -1901,19 +1961,42 @@ #ifdef WOLFSSL_SUBJ_INFO_ACC byte extSubjInfoAccSet : 1; #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + byte extSapkiSet : 1; + byte extAltSigAlgSet : 1; + byte extAltSigValSet : 1; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #if defined(WOLFSSL_SEP) || defined(WOLFSSL_QT) byte extCertPolicyCrit : 1; #endif #ifdef WOLFSSL_CERT_REQ byte isCSR : 1; /* Do we intend on parsing a CSR? */ #endif +#ifdef HAVE_RPK + byte isRPK : 1; /* indicate the cert is Raw-Public-Key cert in RFC7250 */ +#endif #if defined(WOLFSSL_CUSTOM_OID) && defined(WOLFSSL_ASN_TEMPLATE) \ && defined(HAVE_OID_DECODING) wc_UnknownExtCallback unknownExtCallback; #endif -}; - -#ifdef NO_SHA +#ifdef WOLFSSL_DUAL_ALG_CERTS + /* Subject Alternative Public Key Info */ + byte *sapkiDer; + int sapkiLen; + word32 sapkiOID; + /* Alternative Signature Algorithm */ + byte *altSigAlgDer; + int altSigAlgLen; + word32 altSigAlgOID; + /* Alternative Signature Value */ + byte *altSigValDer; + int altSigValLen; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ +}; + +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + #define SIGNER_DIGEST_SIZE WC_SM3_DIGEST_SIZE +#elif defined(NO_SHA) #define SIGNER_DIGEST_SIZE WC_SHA256_DIGEST_SIZE #else #define SIGNER_DIGEST_SIZE WC_SHA_DIGEST_SIZE @@ -1926,8 +2009,6 @@ word32 keyOID; /* key type */ word16 keyUsage; byte maxPathLen; - byte pathLength; - byte pathLengthSet : 1; byte selfSigned : 1; const byte* publicKey; int nameLen; @@ -1938,19 +2019,35 @@ #endif /* IGNORE_NAME_CONSTRAINTS */ byte subjectNameHash[SIGNER_DIGEST_SIZE]; /* sha hash of names in certificate */ + #if defined(HAVE_OCSP) || defined(HAVE_CRL) + byte issuerNameHash[SIGNER_DIGEST_SIZE]; + /* sha hash of issuer names in certificate. + * Used in OCSP to check for authorized + * responders. */ + #endif #ifndef NO_SKID byte subjectKeyIdHash[SIGNER_DIGEST_SIZE]; - /* sha hash of names in certificate */ + /* sha hash of key in certificate */ #endif #ifdef HAVE_OCSP byte subjectKeyHash[KEYID_SIZE]; #endif +#if defined(WOLFSSL_AKID_NAME) || defined(HAVE_CRL) + byte serialHash[SIGNER_DIGEST_SIZE]; /* serial number hash */ +#endif #ifdef WOLFSSL_SIGNER_DER_CERT DerBuffer* derCert; #endif -#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_SCEPROTECT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS) word32 cm_idx; #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + word32 sapkiOID; /* key type */ + byte* sapkiDer; + int sapkiLen; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + byte type; + Signer* next; }; @@ -2021,14 +2118,20 @@ #endif /* HAVE_SMIME */ +WOLFSSL_LOCAL int HashIdAlg(word32 oidSum); WOLFSSL_LOCAL int CalcHashId(const byte* data, word32 len, byte* hash); +WOLFSSL_LOCAL int CalcHashId_ex(const byte* data, word32 len, byte* hash, + int hashAlg); WOLFSSL_LOCAL int GetName(DecodedCert* cert, int nameType, int maxIdx); WOLFSSL_ASN_API int wc_BerToDer(const byte* ber, word32 berSz, byte* der, word32* derSz); +WOLFSSL_LOCAL int StreamOctetString(const byte* inBuf, word32 inBufSz, + byte* out, word32* outSz, word32* idx); WOLFSSL_ASN_API void FreeAltNames(DNS_entry* altNames, void* heap); WOLFSSL_ASN_API DNS_entry* AltNameNew(void* heap); +WOLFSSL_ASN_API DNS_entry* AltNameDup(DNS_entry* from, void* heap); #ifndef IGNORE_NAME_CONSTRAINTS WOLFSSL_ASN_API void FreeNameSubtrees(Base_entry* names, void* heap); #endif /* IGNORE_NAME_CONSTRAINTS */ @@ -2050,14 +2153,27 @@ word32 inSz); WOLFSSL_LOCAL int EncodePolicyOID(byte *out, word32 *outSz, const char *in, void* heap); -WOLFSSL_API int CheckCertSignature(const byte*,word32,void*,void* cm); WOLFSSL_LOCAL int CheckCertSignaturePubKey(const byte* cert, word32 certSz, void* heap, const byte* pubKey, word32 pubKeySz, int pubKeyOID); -#ifdef OPENSSL_EXTRA -WOLFSSL_API int wc_CheckCertSigPubKey(const byte* cert, word32 certSz, - void* heap, const byte* pubKey, - word32 pubKeySz, int pubKeyOID); -#endif +#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_SMALL_CERT_VERIFY) + WOLFSSL_API int wc_CheckCertSignature(const byte* cert, word32 certSz, + void* heap, void* cm); + /* Depricated public API name kept for backwards build compatibility */ + #define CheckCertSignature(cert, certSz, heap, cm) \ + wc_CheckCertSignature(cert, certSz, heap, cm) + + WOLFSSL_API int wc_CheckCertSigPubKey(const byte* cert, word32 certSz, + void* heap, const byte* pubKey, + word32 pubKeySz, int pubKeyOID); +#endif /* OPENSSL_EXTRA || WOLFSSL_SMALL_CERT_VERIFY */ + +#ifdef WOLFSSL_DUAL_ALG_CERTS +WOLFSSL_LOCAL int wc_ConfirmAltSignature( + const byte* buf, word32 bufSz, + const byte* key, word32 keySz, word32 keyOID, + const byte* sig, word32 sigSz, word32 sigOID, + void *heap); +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #if (defined(HAVE_ED25519) && defined(HAVE_ED25519_KEY_IMPORT) || \ (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT))) WOLFSSL_LOCAL int wc_CertGetPubKey(const byte* cert, word32 certSz, @@ -2071,17 +2187,22 @@ WOLFSSL_ASN_API int AddSignature(byte* buf, int bodySz, const byte* sig, int sigSz, int sigAlgoType); WOLFSSL_LOCAL int ParseCertRelative(DecodedCert* cert, int type, int verify, - void* cm); + void* cm, Signer *extraCa); WOLFSSL_LOCAL int DecodeToKey(DecodedCert* cert, int verify); #ifdef WOLFSSL_ASN_TEMPLATE WOLFSSL_LOCAL int DecodeCert(DecodedCert* cert, int verify, int* criticalExt); #endif +WOLFSSL_LOCAL int TryDecodeRPKToKey(DecodedCert* cert); WOLFSSL_LOCAL int wc_GetPubX509(DecodedCert* cert, int verify, int* badDate); WOLFSSL_LOCAL const byte* OidFromId(word32 id, word32 type, word32* oidSz); +WOLFSSL_LOCAL Signer* findSignerByName(Signer *list, byte *hash); +WOLFSSL_LOCAL int FillSigner(Signer* signer, DecodedCert* cert, int type, DerBuffer *der); WOLFSSL_LOCAL Signer* MakeSigner(void* heap); WOLFSSL_LOCAL void FreeSigner(Signer* signer, void* heap); WOLFSSL_LOCAL void FreeSignerTable(Signer** table, int rows, void* heap); +WOLFSSL_LOCAL void FreeSignerTableType(Signer** table, int rows, byte type, + void* heap); #ifdef WOLFSSL_TRUST_PEER_CERT WOLFSSL_LOCAL void FreeTrustedPeer(TrustedPeerCert* tp, void* heap); WOLFSSL_LOCAL void FreeTrustedPeerTable(TrustedPeerCert** table, int rows, @@ -2159,12 +2280,17 @@ int* version, word32 maxIdx); WOLFSSL_LOCAL int GetInt(mp_int* mpi, const byte* input, word32* inOutIdx, word32 maxIdx); +WOLFSSL_ASN_API int GetASNInt(const byte* input, word32* inOutIdx, int* len, + word32 maxIdx); #ifdef HAVE_OID_ENCODING + WOLFSSL_API int wc_EncodeObjectId(const word16* in, word32 inSz, + byte* out, word32* outSz); WOLFSSL_LOCAL int EncodeObjectId(const word16* in, word32 inSz, byte* out, word32* outSz); #endif -#if defined(HAVE_OID_DECODING) || defined(WOLFSSL_ASN_PRINT) +#if defined(HAVE_OID_DECODING) || defined(WOLFSSL_ASN_PRINT) || \ + defined(OPENSSL_ALL) WOLFSSL_LOCAL int DecodeObjectId(const byte* in, word32 inSz, word16* out, word32* outSz); #endif @@ -2187,14 +2313,20 @@ WOLFSSL_LOCAL word32 SetASNSet(word32 len, byte* output); WOLFSSL_LOCAL word32 SetLength(word32 length, byte* output); +WOLFSSL_LOCAL word32 SetLengthEx(word32 length, byte* output, byte isIndef); WOLFSSL_LOCAL word32 SetSequence(word32 len, byte* output); +WOLFSSL_LOCAL word32 SetSequenceEx(word32 len, byte* output, byte isIndef); +WOLFSSL_LOCAL word32 SetIndefEnd(byte* output); WOLFSSL_LOCAL word32 SetOctetString(word32 len, byte* output); +WOLFSSL_LOCAL word32 SetOctetStringEx(word32 len, byte* output, byte indef); WOLFSSL_LOCAL int SetASNInt(int len, byte firstByte, byte* output); WOLFSSL_LOCAL word32 SetBitString(word32 len, byte unusedBits, byte* output); -WOLFSSL_LOCAL word32 SetImplicit(byte tag,byte number,word32 len,byte* output); -WOLFSSL_LOCAL word32 SetExplicit(byte number, word32 len, byte* output); +WOLFSSL_LOCAL word32 SetImplicit(byte tag,byte number,word32 len,byte* output, + byte isIndef); +WOLFSSL_LOCAL word32 SetExplicit(byte number, word32 len, byte* output, + byte isIndef); WOLFSSL_LOCAL word32 SetSet(word32 len, byte* output); -WOLFSSL_LOCAL word32 SetAlgoID(int algoOID,byte* output,int type,int curveSz); +WOLFSSL_API word32 SetAlgoID(int algoOID, byte* output, int type, int curveSz); WOLFSSL_LOCAL int SetMyVersion(word32 version, byte* output, int header); WOLFSSL_LOCAL int SetSerialNumber(const byte* sn, word32 snSz, byte* output, word32 outputSz, int maxSnSz); @@ -2207,7 +2339,10 @@ #endif WOLFSSL_LOCAL int GetNameHash(const byte* source, word32* idx, byte* hash, int maxIdx); -WOLFSSL_LOCAL int wc_CheckPrivateKeyCert(const byte* key, word32 keySz, DecodedCert* der); +WOLFSSL_LOCAL int GetNameHash_ex(const byte* source, word32* idx, byte* hash, + int maxIdx, word32 sigOID); +WOLFSSL_LOCAL int wc_CheckPrivateKeyCert(const byte* key, word32 keySz, + DecodedCert* der, int checkAlt); WOLFSSL_LOCAL int wc_CheckPrivateKey(const byte* privKey, word32 privKeySz, const byte* pubKey, word32 pubKeySz, enum Key_Sum ks); WOLFSSL_LOCAL int StoreDHparams(byte* out, word32* outLen, mp_int* p, mp_int* g); @@ -2246,8 +2381,11 @@ WOLFSSL_LOCAL int SetAsymKeyDerPublic(const byte* pubKey, word32 pubKeyLen, byte* output, word32 outLen, int keyType, int withHeader); -WOLFSSL_LOCAL int DecodeAsymKeyPublic(const byte* input, word32* inOutIdx, word32 inSz, - byte* pubKey, word32* pubKeyLen, int keyType); +WOLFSSL_LOCAL int DecodeAsymKeyPublic_Assign(const byte* input, + word32* inOutIdx, word32 inSz, const byte** pubKey, word32* pubKeyLen, + int keyType); +WOLFSSL_LOCAL int DecodeAsymKeyPublic(const byte* input, word32* inOutIdx, + word32 inSz, byte* pubKey, word32* pubKeyLen, int keyType); #ifndef NO_CERTS @@ -2257,9 +2395,20 @@ WOLFSSL_LOCAL int PemToDer(const unsigned char* buff, long sz, int type, DerBuffer** pDer, void* heap, EncryptedInfo* info, int* eccKey); -WOLFSSL_LOCAL int AllocDer(DerBuffer** der, word32 length, int type, void* heap); +WOLFSSL_LOCAL int AllocDer(DerBuffer** der, word32 length, int type, + void* heap); +WOLFSSL_LOCAL int AllocCopyDer(DerBuffer** der, const unsigned char* buff, + word32 length, int type, void* heap); WOLFSSL_LOCAL void FreeDer(DerBuffer** der); +#if (defined(WOLFSSL_CERT_GEN) && defined(WOLFSSL_CERT_EXT)) || \ + (defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA)) +WOLFSSL_LOCAL int ParseKeyUsageStr(const char* value, word16* keyUsage, + void* heap); +WOLFSSL_LOCAL int ParseExtKeyUsageStr(const char* value, byte* extKeyUsage, + void* heap); +#endif /* (CERT_GEN && CERT_EXT) || (OPENSSL_ALL || OPENSSL_EXTRA) */ + #endif /* !NO_CERTS */ #ifdef HAVE_SMIME @@ -2364,7 +2513,9 @@ typedef struct OcspEntry OcspEntry; -#ifdef NO_SHA +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) +#define OCSP_DIGEST_SIZE WC_SM3_DIGEST_SIZE +#elif defined(NO_SHA) #define OCSP_DIGEST_SIZE WC_SHA256_DIGEST_SIZE #else #define OCSP_DIGEST_SIZE WC_SHA_DIGEST_SIZE @@ -2416,7 +2567,7 @@ byte* source; /* pointer to source buffer, not owned */ word32 maxIdx; /* max offset based on init size */ - + Signer* pendingCAs; #ifdef OPENSSL_EXTRA int verifyError; #endif @@ -2427,11 +2578,19 @@ struct OcspRequest { byte issuerHash[KEYID_SIZE]; byte issuerKeyHash[KEYID_SIZE]; +#if defined(WOLFSSL_SM2) && defined(WOLFSSL_SM3) + int hashSz; +#endif byte* serial; /* copy of the serial number in source cert */ int serialSz; #ifdef OPENSSL_EXTRA WOLFSSL_ASN1_INTEGER* serialInt; #endif +#if defined(OPENSSL_ALL) || defined(WOLFSSL_NGINX) || \ + defined(WOLFSSL_HAPROXY) || defined(WOLFSSL_APACHE_HTTPD) || \ + defined(HAVE_LIGHTY) + void* cid; /* WOLFSSL_OCSP_CERTID kept to free */ +#endif byte* url; /* copy of the extAuthInfo in source cert */ int urlSz; @@ -2482,6 +2641,10 @@ word32 sigIndex; /* offset to start of signature */ word32 sigLength; /* length of signature */ word32 signatureOID; /* sum of algorithm object id */ +#ifdef WC_RSA_PSS + word32 sigParamsIndex; /* start of signature parameters */ + word32 sigParamsLength; /* length of signature parameters */ +#endif byte* signature; /* pointer into raw source, not owned */ byte issuerHash[SIGNER_DIGEST_SIZE]; /* issuer name hash */ byte crlHash[SIGNER_DIGEST_SIZE]; /* raw crl data hash */ @@ -2508,8 +2671,8 @@ WOLFSSL_LOCAL int VerifyCRL_Signature(SignatureCtx* sigCtx, const byte* toBeSigned, word32 tbsSz, const byte* signature, word32 sigSz, - word32 signatureOID, Signer *ca, - void* heap); + word32 signatureOID, const byte* sigParams, + int sigParamsSz, Signer *ca, void* heap); WOLFSSL_LOCAL int ParseCRL(RevokedCert* rcert, DecodedCRL* dcrl, const byte* buff, word32 sz, int verify, void* cm); WOLFSSL_LOCAL void FreeDecodedCRL(DecodedCRL* dcrl); @@ -2529,9 +2692,10 @@ || (defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_IMPORT)) \ || (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)) \ || (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_IMPORT)) \ - || (defined(HAVE_PQC) && defined(HAVE_FALCON)) \ - || (defined(HAVE_PQC) && defined(HAVE_DILITHIUM)) \ - || (defined(HAVE_PQC) && defined(HAVE_SPHINCS))) + || defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS)) +WOLFSSL_LOCAL int DecodeAsymKey_Assign(const byte* input, word32* inOutIdx, + word32 inSz, const byte** privKey, word32* privKeyLen, const byte** pubKey, + word32* pubKeyLen, int keyType); WOLFSSL_LOCAL int DecodeAsymKey(const byte* input, word32* inOutIdx, word32 inSz, byte* privKey, word32* privKeyLen, byte* pubKey, word32* pubKeyLen, int keyType); @@ -2566,11 +2730,12 @@ PBE_AES128_CBC = 5, PBE_SHA1_40RC2_CBC = 6, - PBE_SHA1_RC4_128_SUM = 657, - PBE_SHA1_DES3_SUM = 659, - PBE_MD5_DES_SUM = 651, - PBE_SHA1_DES_SUM = 658, - PBES2_SUM = 661, + PBE_SHA1_RC4_128_SUM = 657, + PBE_SHA1_DES3_SUM = 659, + PBE_SHA1_40RC2_CBC_SUM = 662, + PBE_MD5_DES_SUM = 651, + PBE_SHA1_DES_SUM = 658, + PBES2_SUM = 661, PBES2 = 13, /* algo ID */ PBES1_MD5_DES = 3, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn_public.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn_public.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn_public.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/asn_public.h 2024-08-03 07:30:01.000000000 +0000 @@ -104,6 +104,7 @@ ECC_SECP256R1_OID = 526, ECC_SECP256K1_OID = 186, ECC_BRAINPOOLP256R1_OID = 104, + ECC_SM2P256V1_OID = 667, ECC_X25519_OID = 365, ECC_ED25519_OID = 256, ECC_BRAINPOOLP320R1_OID = 106, @@ -116,10 +117,31 @@ }; +enum EncPkcs8Types { + ENC_PKCS8_VER_PKCS12 = 1, + ENC_PKCS8_VER_PKCS5 = 5, + + ENC_PKCS8_PBES2 = 13, + + ENC_PKCS8_PBE_SHA1_RC4_128 = 1, + ENC_PKCS8_PBE_SHA1_DES = 2, + ENC_PKCS8_PBE_SHA1_DES3 = 3, + ENC_PKCS8_PBE_SHA1_40RC2_CBC = 6, + + ENC_PKCS8_PBES1_MD5_DES = 3, + ENC_PKCS8_PBES1_SHA1_DES = 10, + + ENC_PKCS8_ALG_AES128CBC = 414, + ENC_PKCS8_ALG_AES256CBC = 454, + ENC_PKCS8_ALG_DES = 69, + ENC_PKCS8_ALG_DES3 = 652 +}; + /* Certificate file Type */ enum CertType { CERT_TYPE = 0, PRIVATEKEY_TYPE, + ALT_PRIVATEKEY_TYPE, DH_PARAM_TYPE, DSA_PARAM_TYPE, CRL_TYPE, @@ -154,7 +176,8 @@ SPHINCS_SMALL_LEVEL1_TYPE, SPHINCS_SMALL_LEVEL3_TYPE, SPHINCS_SMALL_LEVEL5_TYPE, - ECC_PARAM_TYPE + ECC_PARAM_TYPE, + CHAIN_CERT_TYPE }; @@ -187,15 +210,17 @@ CTC_RSASSAPSS = 654, + CTC_SM3wSM2 = 740, /* 1.2.156.10197.1.501 */ + CTC_ED25519 = 256, CTC_ED448 = 257, - CTC_FALCON_LEVEL1 = 268, - CTC_FALCON_LEVEL5 = 271, + CTC_FALCON_LEVEL1 = 273, + CTC_FALCON_LEVEL5 = 276, - CTC_DILITHIUM_LEVEL2 = 213, - CTC_DILITHIUM_LEVEL3 = 216, - CTC_DILITHIUM_LEVEL5 = 220, + CTC_DILITHIUM_LEVEL2 = 218, + CTC_DILITHIUM_LEVEL3 = 221, + CTC_DILITHIUM_LEVEL5 = 225, CTC_SPHINCS_FAST_LEVEL1 = 281, CTC_SPHINCS_FAST_LEVEL3 = 283, @@ -368,7 +393,9 @@ } CertExtension; #endif -#if defined(WOLFSSL_CERT_GEN) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) +#if defined(WOLFSSL_CERT_GEN) || defined(OPENSSL_EXTRA) || \ + defined(OPENSSL_EXTRA_X509_SMALL) || defined(WOLFSSL_CERT_EXT) || \ + defined(WOLFSSL_CERT_REQ) typedef struct CertName { char country[CTC_NAME_SIZE]; char countryEnc; @@ -422,6 +449,7 @@ #ifndef NUM_CUSTOM_EXT #define NUM_CUSTOM_EXT 16 +#endif /* NUM_CUSTOM_EXT */ /* for user to fill for certificate generation */ typedef struct Cert { @@ -486,6 +514,19 @@ byte issRaw[sizeof(CertName)]; /* raw issuer info */ byte sbjRaw[sizeof(CertName)]; /* raw subject info */ #endif +#ifdef WOLFSSL_DUAL_ALG_CERTS + /* These will not point to managed buffers. They will point to buffers that + * are managed by others. No cleanup necessary. */ + /* Subject Alternative Public Key Info */ + byte *sapkiDer; + int sapkiLen; + /* Alternative Signature Algorithm */ + byte *altSigAlgDer; + int altSigAlgLen; + /* Alternative Signature Value */ + byte *altSigValDer; + int altSigValLen; +#endif /* WOLFSSL_DUAL_ALG_CERTS */ #ifdef WOLFSSL_CERT_REQ char challengePw[CTC_NAME_SIZE]; char unstructuredName[CTC_NAME_SIZE]; @@ -503,6 +544,9 @@ byte* der; /* Pointer to buffer of current DecodedCert cache */ void* heap; /* heap hint */ byte basicConstSet:1; /* Indicator for when Basic Constraint is set */ +#ifdef WOLFSSL_ALLOW_ENCODING_CA_FALSE + byte isCaSet:1; /* Indicator for when isCA is set */ +#endif byte pathLenSet:1; /* Indicator for when path length is set */ #ifdef WOLFSSL_ALT_NAMES byte altNamesCrit:1; /* Indicator of criticality of SAN extension */ @@ -542,6 +586,11 @@ WC_RNG* rng); WOLFSSL_API int wc_SignCert(int requestSz, int sType, byte* buf, word32 buffSz, RsaKey* rsaKey, ecc_key* eccKey, WC_RNG* rng); +#ifdef WOLFSSL_DUAL_ALG_CERTS +WOLFSSL_API int wc_MakeSigWithBitStr(byte *sig, int sigSz, int sType, byte* buf, + word32 bufSz, int keyType, void* key, + WC_RNG* rng); +#endif WOLFSSL_ABI WOLFSSL_API int wc_MakeSelfCert(Cert* cert, byte* buf, word32 buffSz, RsaKey* key, WC_RNG* rng); @@ -618,7 +667,6 @@ #endif #endif /* WOLFSSL_CERT_EXT */ -#endif /* WOLFSSL_CERT_GEN */ WOLFSSL_API int wc_GetDateInfo(const byte* certDate, int certDateSz, const byte** date, byte* format, int* length); @@ -675,7 +723,6 @@ #endif #ifndef NO_RSA - #if !defined(HAVE_USER_RSA) WOLFSSL_API int wc_RsaPublicKeyDecode_ex(const byte* input, word32* inOutIdx, word32 inSz, const byte** n, word32* nSz, const byte** e, word32* eSz); /* For FIPS v1/v2 and selftest this is in rsa.h */ @@ -688,7 +735,6 @@ (! ((HAVE_FIPS_VERSION == 5) && (HAVE_FIPS_VERSION_MINOR == 0))))) WOLFSSL_API int wc_RsaKeyToPublicDer(RsaKey* key, byte* output, word32 inLen); #endif - #endif /* !HAVE_USER_RSA */ WOLFSSL_API int wc_RsaPublicKeyDerSize(RsaKey* key, int with_header); WOLFSSL_API int wc_RsaKeyToPublicDer_ex(RsaKey* key, byte* output, word32 inLen, int with_header); @@ -723,6 +769,8 @@ WOLFSSL_ABI WOLFSSL_API int wc_EccPrivateKeyDecode(const byte* input, word32* inOutIdx, ecc_key* key, word32 inSz); + WOLFSSL_LOCAL int wc_BuildEccKeyDer(ecc_key* key, byte* output, word32 *inLen, + int pubIn, int curveIn); WOLFSSL_ABI WOLFSSL_API int wc_EccKeyToDer(ecc_key* key, byte* output, word32 inLen); WOLFSSL_API int wc_EccPrivateKeyToDer(ecc_key* key, byte* output, @@ -751,8 +799,7 @@ (defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_EXPORT)) || \ (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_EXPORT)) || \ (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_EXPORT)) || \ - (defined(HAVE_PQC) && (defined(HAVE_FALCON) || \ - defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS)))) + (defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS))) #define WC_ENABLE_ASYM_KEY_EXPORT #endif @@ -761,8 +808,7 @@ (defined(HAVE_CURVE25519) && defined(HAVE_CURVE25519_KEY_IMPORT)) || \ (defined(HAVE_ED448) && defined(HAVE_ED448_KEY_IMPORT)) || \ (defined(HAVE_CURVE448) && defined(HAVE_CURVE448_KEY_IMPORT)) || \ - (defined(HAVE_PQC) && (defined(HAVE_FALCON) || \ - defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS)))) + (defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) || defined(HAVE_SPHINCS))) #define WC_ENABLE_ASYM_KEY_IMPORT #endif @@ -911,8 +957,10 @@ WOLFSSL_API int wc_GetFASCNFromCert(struct DecodedCert* cert, byte* fascn, word32* fascnSz); #endif /* WOLFSSL_FPKI */ -#ifdef __cplusplus - } /* extern "C" */ + +#ifdef WOLFSSL_DUAL_ALG_CERTS +WOLFSSL_API int wc_GeneratePreTBS(struct DecodedCert* cert, byte *der, + int derSz); #endif #if !defined(XFPRINTF) || defined(NO_FILESYSTEM) || \ @@ -1015,4 +1063,8 @@ #endif /* WOLFSSL_ASN_PRINT */ +#ifdef __cplusplus + } /* extern "C" */ +#endif + #endif /* WOLF_CRYPT_ASN_PUBLIC_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/chacha.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/chacha.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/chacha.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/chacha.h 2024-08-03 07:30:01.000000000 +0000 @@ -77,7 +77,7 @@ typedef struct ChaCha { word32 X[CHACHA_CHUNK_WORDS]; /* state of cipher */ -#ifdef HAVE_INTEL_AVX1 +#if defined(USE_INTEL_CHACHA_SPEEDUP) /* vpshufd reads 16 bytes but we only use bottom 4. */ byte extra[12]; #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cmac.h 2024-08-03 07:30:01.000000000 +0000 @@ -38,8 +38,7 @@ #endif /* avoid redefinition of structs */ -#if !defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(2,0,0) #ifndef WC_CMAC_TYPE_DEFINED typedef struct Cmac Cmac; @@ -82,6 +81,11 @@ #define WC_CMAC_TAG_MAX_SZ AES_BLOCK_SIZE #define WC_CMAC_TAG_MIN_SZ (AES_BLOCK_SIZE/4) +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_cmac_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_CMAC_sanity(void); +#endif + #endif /* HAVE_FIPS */ WOLFSSL_API @@ -98,18 +102,38 @@ int wc_CmacUpdate(Cmac* cmac, const byte* in, word32 inSz); WOLFSSL_API +int wc_CmacFinalNoFree(Cmac* cmac, + byte* out, word32* outSz); +WOLFSSL_API int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz); WOLFSSL_API +int wc_CmacFree(Cmac* cmac); + +WOLFSSL_API int wc_AesCmacGenerate(byte* out, word32* outSz, const byte* in, word32 inSz, const byte* key, word32 keySz); +WOLFSSL_API +int wc_AesCmacGenerate_ex(Cmac *cmac, + byte* out, word32* outSz, + const byte* in, word32 inSz, + const byte* key, word32 keySz, + void* heap, + int devId); WOLFSSL_API int wc_AesCmacVerify(const byte* check, word32 checkSz, const byte* in, word32 inSz, const byte* key, word32 keySz); +WOLFSSL_API +int wc_AesCmacVerify_ex(Cmac* cmac, + const byte* check, word32 checkSz, + const byte* in, word32 inSz, + const byte* key, word32 keySz, + void* heap, + int devId); WOLFSSL_LOCAL void ShiftAndXorRb(byte* out, byte* in); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cpuid.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cpuid.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cpuid.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cpuid.h 2024-08-03 07:30:01.000000000 +0000 @@ -50,6 +50,7 @@ #define CPUID_ADX 0x0040 /* ADCX, ADOX */ #define CPUID_MOVBE 0x0080 /* Move and byte swap */ #define CPUID_BMI1 0x0100 /* ANDN */ + #define CPUID_SHA 0x0200 /* SHA-1 and SHA-256 instructions */ #define IS_INTEL_AVX1(f) ((f) & CPUID_AVX1) #define IS_INTEL_AVX2(f) ((f) & CPUID_AVX2) @@ -60,6 +61,7 @@ #define IS_INTEL_ADX(f) ((f) & CPUID_ADX) #define IS_INTEL_MOVBE(f) ((f) & CPUID_MOVBE) #define IS_INTEL_BMI1(f) ((f) & CPUID_BMI1) + #define IS_INTEL_SHA(f) ((f) & CPUID_SHA) #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cryptocb.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cryptocb.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cryptocb.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/cryptocb.h 2024-08-03 07:30:01.000000000 +0000 @@ -71,6 +71,32 @@ #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) #include #endif +#ifdef WOLFSSL_HAVE_KYBER + #include +#ifdef WOLFSSL_WC_KYBER + #include +#elif defined(HAVE_LIBOQS) || defined(HAVE_PQM4) + #include +#endif +#endif +#if defined(HAVE_DILITHIUM) + #include +#endif +#if defined(HAVE_FALCON) + #include +#endif + + +#ifdef WOLF_CRYPTO_CB_CMD +/* CryptoCb Commands */ +enum wc_CryptoCbCmdType { + WC_CRYPTOCB_CMD_TYPE_NONE = 0, + WC_CRYPTOCB_CMD_TYPE_REGISTER, + WC_CRYPTOCB_CMD_TYPE_UNREGISTER, + + WC_CRYPTOCB_CMD_TYPE_MAX = WC_CRYPTOCB_CMD_TYPE_UNREGISTER +}; +#endif /* Crypto Information Structure for callbacks */ typedef struct wc_CryptoInfo { @@ -78,7 +104,6 @@ #if HAVE_ANONYMOUS_INLINE_AGGREGATES union { #endif -#if !defined(NO_RSA) || defined(HAVE_ECC) struct { int type; /* enum wc_PkType */ #if HAVE_ANONYMOUS_INLINE_AGGREGATES @@ -191,11 +216,67 @@ byte contextLen; } ed25519verify; #endif + #if defined(WOLFSSL_HAVE_KYBER) + struct { + WC_RNG* rng; + int size; + void* key; + int type; /* enum wc_PqcKemType */ + } pqc_kem_kg; + struct { + byte* ciphertext; + word32 ciphertextLen; + byte* sharedSecret; + word32 sharedSecretLen; + WC_RNG* rng; + void* key; + int type; /* enum wc_PqcKemType */ + } pqc_encaps; + struct { + const byte* ciphertext; + word32 ciphertextLen; + byte* sharedSecret; + word32 sharedSecretLen; + void* key; + int type; /* enum wc_PqcKemType */ + } pqc_decaps; + #endif + #if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) + struct { + WC_RNG* rng; + int size; + void* key; + int type; /* enum wc_PqcSignatureType */ + } pqc_sig_kg; + struct { + const byte* in; + word32 inlen; + byte* out; + word32* outlen; + WC_RNG* rng; + void* key; + int type; /* enum wc_PqcSignatureType */ + } pqc_sign; + struct { + const byte* sig; + word32 siglen; + const byte* msg; + word32 msglen; + int* res; + void* key; + int type; /* enum wc_PqcSignatureType */ + } pqc_verify; + struct { + void* key; + const byte* pubKey; + word32 pubKeySz; + int type; /* enum wc_PqcSignatureType */ + } pqc_sig_check; + #endif #if HAVE_ANONYMOUS_INLINE_AGGREGATES }; #endif } pk; -#endif /* !NO_RSA || HAVE_ECC */ #if !defined(NO_AES) || !defined(NO_DES3) struct { int type; /* enum wc_CipherType */ @@ -287,6 +368,7 @@ word32 sz; } des3; #endif + void* ctx; #if HAVE_ANONYMOUS_INLINE_AGGREGATES }; #endif @@ -317,6 +399,10 @@ #ifdef WOLFSSL_SHA512 wc_Sha512* sha512; #endif + #ifdef WOLFSSL_SHA3 + wc_Sha3* sha3; + #endif + void* ctx; #if HAVE_ANONYMOUS_INLINE_AGGREGATES }; #endif @@ -356,6 +442,12 @@ int type; } cmac; #endif +#ifdef WOLF_CRYPTO_CB_CMD + struct { /* uses wc_AlgoType=ALGO_NONE */ + int type; /* enum wc_CryptoCbCmdType */ + void *ctx; + } cmd; +#endif #if HAVE_ANONYMOUS_INLINE_AGGREGATES }; #endif @@ -365,6 +457,7 @@ typedef int (*CryptoDevCallbackFunc)(int devId, wc_CryptoInfo* info, void* ctx); WOLFSSL_LOCAL void wc_CryptoCb_Init(void); +WOLFSSL_LOCAL void wc_CryptoCb_Cleanup(void); WOLFSSL_LOCAL int wc_CryptoCb_GetDevIdAtIndex(int startIdx); WOLFSSL_API int wc_CryptoCb_RegisterDevice(int devId, CryptoDevCallbackFunc cb, void* ctx); WOLFSSL_API void wc_CryptoCb_UnRegisterDevice(int devId); @@ -434,6 +527,37 @@ const byte* context, byte contextLen); #endif /* HAVE_ED25519 */ +#if defined(WOLFSSL_HAVE_KYBER) +WOLFSSL_LOCAL int wc_CryptoCb_PqcKemGetDevId(int type, void* key); + +WOLFSSL_LOCAL int wc_CryptoCb_MakePqcKemKey(WC_RNG* rng, int type, + int keySize, void* key); + +WOLFSSL_LOCAL int wc_CryptoCb_PqcEncapsulate(byte* ciphertext, + word32 ciphertextLen, byte* sharedSecret, word32 sharedSecretLen, + WC_RNG* rng, int type, void* key); + +WOLFSSL_LOCAL int wc_CryptoCb_PqcDecapsulate(const byte* ciphertext, + word32 ciphertextLen, byte* sharedSecret, word32 sharedSecretLen, + int type, void* key); +#endif /* WOLFSSL_HAVE_KYBER */ + +#if defined(HAVE_FALCON) || defined(HAVE_DILITHIUM) +WOLFSSL_LOCAL int wc_CryptoCb_PqcSigGetDevId(int type, void* key); + +WOLFSSL_LOCAL int wc_CryptoCb_MakePqcSignatureKey(WC_RNG* rng, int type, + int keySize, void* key); + +WOLFSSL_LOCAL int wc_CryptoCb_PqcSign(const byte* in, word32 inlen, byte* out, + word32 *outlen, WC_RNG* rng, int type, void* key); + +WOLFSSL_LOCAL int wc_CryptoCb_PqcVerify(const byte* sig, word32 siglen, + const byte* msg, word32 msglen, int* res, int type, void* key); + +WOLFSSL_LOCAL int wc_CryptoCb_PqcSignatureCheckPrivKey(void* key, int type, + const byte* pubKey, word32 pubKeySz); +#endif /* HAVE_FALCON || HAVE_DILITHIUM */ + #ifndef NO_AES #ifdef HAVE_AESGCM WOLFSSL_LOCAL int wc_CryptoCb_AesGcmEncrypt(Aes* aes, byte* out, @@ -501,6 +625,11 @@ word32 inSz, byte* digest); #endif +#ifdef WOLFSSL_SHA3 +WOLFSSL_LOCAL int wc_CryptoCb_Sha3Hash(wc_Sha3* sha3, int type, const byte* in, + word32 inSz, byte* digest); +#endif + #ifndef NO_HMAC WOLFSSL_LOCAL int wc_CryptoCb_Hmac(Hmac* hmac, int macType, const byte* in, word32 inSz, byte* digest); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/curve25519.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/curve25519.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/curve25519.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/curve25519.h 2024-08-03 07:30:01.000000000 +0000 @@ -61,9 +61,9 @@ /* ECC point, the internal structure is Little endian * the mathematical functions used the endianness */ typedef struct ECPoint { - byte point[CURVE25519_KEYSIZE]; + ALIGN16 byte point[CURVE25519_KEYSIZE]; #ifdef FREESCALE_LTC_ECC - byte pointY[CURVE25519_KEYSIZE]; + ALIGN16 byte pointY[CURVE25519_KEYSIZE]; #endif byte pointSz; } ECPoint; @@ -80,13 +80,14 @@ curve in dp */ const curve25519_set_type* dp; /* domain parameters, either points to curves (idx >= 0) or user supplied */ - ECPoint p; /* public point for key */ - byte k[CURVE25519_KEYSIZE]; /* private scaler for key */ + ECPoint p; /* public point for key */ + ALIGN16 byte k[CURVE25519_KEYSIZE]; /* private scaler for key */ #ifdef WOLFSSL_ASYNC_CRYPT WC_ASYNC_DEV asyncDev; #endif #if defined(WOLF_CRYPTO_CB) + void* devCtx; int devId; #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/des3.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/des3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/des3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/des3.h 2024-08-03 07:30:01.000000000 +0000 @@ -35,12 +35,6 @@ #include #endif /* HAVE_FIPS_VERSION >= 2 */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - /* included for fips @wc_fips */ - #include -#endif - #ifdef __cplusplus extern "C" { #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dh.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dh.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dh.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dh.h 2024-08-03 07:30:01.000000000 +0000 @@ -30,8 +30,7 @@ #ifndef NO_DH -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) #include #endif /* HAVE_FIPS_VERSION >= 2 */ @@ -120,6 +119,11 @@ #endif #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_dh_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_DH_sanity(void); +#endif + #ifdef HAVE_PUBLIC_FFDHE #ifdef HAVE_FFDHE_2048 WOLFSSL_API const DhParams* wc_Dh_ffdhe2048_Get(void); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dilithium.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dilithium.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dilithium.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/dilithium.h 2024-08-03 07:30:01.000000000 +0000 @@ -31,10 +31,62 @@ #include -#if defined(HAVE_PQC) && defined(HAVE_DILITHIUM) +#ifdef WOLF_CRYPTO_CB + #include +#endif + +#if defined(HAVE_DILITHIUM) #ifdef HAVE_LIBOQS #include +#include +#endif + +#if defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) && \ + defined(WOLFSSL_DILITHIUM_NO_SIGN) && \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) && \ + !defined(WOLFSSL_DILITHIUM_VERIFY_ONLY) + #define WOLFSSL_DILITHIUM_VERIFY_ONLY +#endif +#ifdef WOLFSSL_DILITHIUM_VERIFY_ONLY + #ifndef WOLFSSL_DILITHIUM_NO_MAKE_KEY + #define WOLFSSL_DILITHIUM_NO_MAKE_KEY + #endif + #ifndef WOLFSSL_DILITHIUM_NO_SIGN + #define WOLFSSL_DILITHIUM_NO_SIGN + #endif +#endif + +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + #define WOLFSSL_DILITHIUM_PUBLIC_KEY +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_MAKE_KEY) || \ + !defined(WOLFSSL_DILITHIUM_NO_SIGN) + #define WOLFSSL_DILITHIUM_PRIVATE_KEY +#endif + +#if defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) && \ + defined(WOLFSSL_DILITHIUM_PRIVATE_KEY) && \ + !defined(WOLFSSL_DILITHIUM_NO_CHECK_KEY) && \ + !defined(WOLFSSL_DILITHIUM_CHECK_KEY) + #define WOLFSSL_DILITHIUM_CHECK_KEY +#endif + +#ifdef WOLFSSL_WC_DILITHIUM + #include +#ifndef WOLFSSL_DILITHIUM_VERIFY_ONLY + #include +#endif +#endif + +#if defined(WC_DILITHIUM_CACHE_PRIV_VECTORS) && \ + !defined(WC_DILITHIUM_CACHE_MATRIX_A) + #define WC_DILITHIUM_CACHE_MATRIX_A +#endif +#if defined(WC_DILITHIUM_CACHE_PUB_VECTORS) && \ + !defined(WC_DILITHIUM_CACHE_MATRIX_A) + #define WC_DILITHIUM_CACHE_MATRIX_A #endif #ifdef __cplusplus @@ -43,36 +95,490 @@ /* Macros Definitions */ -#ifdef HAVE_LIBOQS -#define DILITHIUM_LEVEL2_KEY_SIZE OQS_SIG_dilithium_2_length_secret_key -#define DILITHIUM_LEVEL2_SIG_SIZE OQS_SIG_dilithium_2_length_signature -#define DILITHIUM_LEVEL2_PUB_KEY_SIZE OQS_SIG_dilithium_2_length_public_key -#define DILITHIUM_LEVEL2_PRV_KEY_SIZE (DILITHIUM_LEVEL2_PUB_KEY_SIZE+DILITHIUM_LEVEL2_KEY_SIZE) - -#define DILITHIUM_LEVEL3_KEY_SIZE OQS_SIG_dilithium_3_length_secret_key -#define DILITHIUM_LEVEL3_SIG_SIZE OQS_SIG_dilithium_3_length_signature -#define DILITHIUM_LEVEL3_PUB_KEY_SIZE OQS_SIG_dilithium_3_length_public_key -#define DILITHIUM_LEVEL3_PRV_KEY_SIZE (DILITHIUM_LEVEL3_PUB_KEY_SIZE+DILITHIUM_LEVEL3_KEY_SIZE) - -#define DILITHIUM_LEVEL5_KEY_SIZE OQS_SIG_dilithium_5_length_secret_key -#define DILITHIUM_LEVEL5_SIG_SIZE OQS_SIG_dilithium_5_length_signature -#define DILITHIUM_LEVEL5_PUB_KEY_SIZE OQS_SIG_dilithium_5_length_public_key -#define DILITHIUM_LEVEL5_PRV_KEY_SIZE (DILITHIUM_LEVEL5_PUB_KEY_SIZE+DILITHIUM_LEVEL5_KEY_SIZE) +#ifdef WOLFSSL_WC_DILITHIUM + +#ifndef WOLFSSL_DILITHIUM_ALIGNMENT + #if defined(__arch64__) + #define WOLFSSL_DILITHIUM_ALIGNMENT 8 + #elif defined(__arm__) + #define WOLFSSL_DILITHIUM_ALIGNMENT 4 + #elif !defined(WOLFSSL_AESNI) && defined(WOLFSSL_GENERAL_ALIGNMENT) + #define WOLFSSL_DILITHIUM_ALIGNMENT WOLFSSL_GENERAL_ALIGNMENT + #else + #define WOLFSSL_DILITHIUM_ALIGNMENT 8 + #endif +#endif /* WOLFSSL_DILITHIUM_ALIGNMENT */ + +#define DILITHIUM_LEVEL2_KEY_SIZE 2560 +#define DILITHIUM_LEVEL2_SIG_SIZE 2420 +#define DILITHIUM_LEVEL2_PUB_KEY_SIZE 1312 +#define DILITHIUM_LEVEL2_PRV_KEY_SIZE \ + (DILITHIUM_LEVEL2_PUB_KEY_SIZE + DILITHIUM_LEVEL2_KEY_SIZE) + +#define DILITHIUM_LEVEL3_KEY_SIZE 4032 +#define DILITHIUM_LEVEL3_SIG_SIZE 3309 +#define DILITHIUM_LEVEL3_PUB_KEY_SIZE 1952 +#define DILITHIUM_LEVEL3_PRV_KEY_SIZE \ + (DILITHIUM_LEVEL3_PUB_KEY_SIZE + DILITHIUM_LEVEL3_KEY_SIZE) + +#define DILITHIUM_LEVEL5_KEY_SIZE 4896 +#define DILITHIUM_LEVEL5_SIG_SIZE 4627 +#define DILITHIUM_LEVEL5_PUB_KEY_SIZE 2592 +#define DILITHIUM_LEVEL5_PRV_KEY_SIZE \ + (DILITHIUM_LEVEL5_PUB_KEY_SIZE + DILITHIUM_LEVEL5_KEY_SIZE) + + +/* Modulus. */ +#define DILITHIUM_Q 0x7fe001 +/* Number of bits in modulus. */ +#define DILITHIUM_Q_BITS 23 +/* Number of elements in polynomial. */ +#define DILITHIUM_N 256 + +/* Number of dropped bits. */ +#define DILITHIUM_D 13 +/* Maximum value of dropped bits. */ +#define DILITHIUM_D_MAX (1 << DILITHIUM_D) +/* Half maximum value. */ +#define DILITHIUM_D_MAX_HALF (1 << (DILITHIUM_D - 1)) +/* Number of undropped bits. */ +#define DILITHIUM_U (DILITHIUM_Q_BITS - DILITHIUM_D) + +/* Bits in coefficient range of y, GAMMA1, of 2^17 is 17. */ +#define DILITHIUM_GAMMA1_BITS_17 17 +/* Coefficient range of y, GAMMA1, of 2^17. */ +#define DILITHIUM_GAMMA1_17 (1 << 17) +/* # encoding bits of y is GAMMA1 + 1. */ +#define DILITHIUM_GAMMA1_17_ENC_BITS 18 +/* Coefficient range of y, GAMMA1, of 2^17. */ +/* Bits in coefficient range of y, GAMMA1, of 2^19 is 19. */ +#define DILITHIUM_GAMMA1_BITS_19 19 +/* Coefficient range of y, GAMMA1, of 2^19. */ +#define DILITHIUM_GAMMA1_19 (1 << 19) +/* # encoding bits of y is GAMMA1 + 1. */ +#define DILITHIUM_GAMMA1_19_ENC_BITS 20 + +/* Low-order rounding range, GAMMA2, is Q divided by 88. */ +#define DILITHIUM_Q_LOW_88 ((DILITHIUM_Q - 1) / 88) +/* Absolute low-order rounding range, GAMMA2, is Q divided by 88. */ +#define DILITHIUM_Q_LOW_88_2 (((DILITHIUM_Q - 1) / 88) * 2) +/* # encoding bits of w1 when range is 88. */ +#define DILITHIUM_Q_HI_88_ENC_BITS 6 +/* Low-order rounding range, GAMMA2, is Q divided by 32. */ +#define DILITHIUM_Q_LOW_32 ((DILITHIUM_Q - 1) / 32) +/* Absolute low-order rounding range, GAMMA2, is Q divided by 32. */ +#define DILITHIUM_Q_LOW_32_2 (((DILITHIUM_Q - 1) / 32) * 2) +/* # encoding bits of w1 when range is 32. */ +#define DILITHIUM_Q_HI_32_ENC_BITS 4 + +/* Private key range, eta, of 2. */ +#define DILITHIUM_ETA_2 2 +/* Bits needed to encode values in range -2..2 as a positive number. */ +#define DILITHIUM_ETA_2_BITS 3 +/* Extract count of valid values. */ +#define DILITHIUM_ETA_2_MOD 15 +/* Private key range, eta, of 4. */ +#define DILITHIUM_ETA_4 4 +/* Bits needed to encode values in range -4..4 as a positive number. */ +#define DILITHIUM_ETA_4_BITS 4 +/* Extract count of valid values. */ +#define DILITHIUM_ETA_4_MOD 9 + +/* Number of bytes in a polynomial in memory. */ +#define DILITHIUM_POLY_SIZE (DILITHIUM_N * sizeof(sword32)) + +#ifndef WOLFSSL_NO_ML_DSA_44 + +/* Fist dimension of A, k, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_K 4 +/* Second dimension of A, l, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_L 4 +/* Private key range, ETA, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_ETA DILITHIUM_ETA_2 +/* Number of bits in private key for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_ETA_BITS DILITHIUM_ETA_2_BITS +/* Collision strength of c-tilde, LAMBDA, in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_LAMBDA 16 +/* # +/-1's in polynomial c, TAU, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_TAU 39 +/* BETA = TAU * ETA for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_BETA \ + (PARAMS_ML_DSA_44_TAU * PARAMS_ML_DSA_44_ETA) +/* Max # 1's in the hint h, OMEGA, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_OMEGA 80 +/* Bits in coefficient range of y, GAMMA1, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_GAMMA1_BITS DILITHIUM_GAMMA1_BITS_17 +/* Ccoefficient range of y, GAMMA1, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_GAMMA1 (1 << PARAMS_ML_DSA_44_GAMMA1_BITS) +/* Low-order rounding range, GAMMA2, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_GAMMA2 DILITHIUM_Q_LOW_88 +/* Bits in high-order rounding range, GAMMA2, for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_GAMMA2_HI_BITS 6 +/* Encoding size of w1 in bytes for ML-DSA-44. + * K * N / 8 * 6 - 6 bits as max value is 43 in high bits. */ +#define PARAMS_ML_DSA_44_W1_ENC_SZ \ + (PARAMS_ML_DSA_44_K * DILITHIUM_N / 8 * PARAMS_ML_DSA_44_GAMMA2_HI_BITS) +/* Size of memory used for matrix a in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_A_SIZE \ + (PARAMS_ML_DSA_44_K * PARAMS_ML_DSA_44_L * DILITHIUM_POLY_SIZE) +/* Size of memory used for vector s1 in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_S1_SIZE \ + (PARAMS_ML_DSA_44_L * DILITHIUM_POLY_SIZE) +/* Encoding size of s1 in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_S1_ENC_SIZE \ + (PARAMS_ML_DSA_44_S1_SIZE / sizeof(sword32) * PARAMS_ML_DSA_44_ETA_BITS / 8) +/* Size of memory used for vector s2 in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_S2_SIZE \ + (PARAMS_ML_DSA_44_K * DILITHIUM_POLY_SIZE) +/* Encoding size of s2 in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_S2_ENC_SIZE \ + (PARAMS_ML_DSA_44_S2_SIZE / sizeof(sword32) * PARAMS_ML_DSA_44_ETA_BITS / 8) +/* Encoding size of z in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_Z_ENC_SIZE \ + (PARAMS_ML_DSA_44_S1_SIZE / sizeof(sword32) / 8 * \ + (PARAMS_ML_DSA_44_GAMMA1_BITS + 1)) +/* Encoding size of public key in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_PK_SIZE \ + (DILITHIUM_PUB_SEED_SZ + PARAMS_ML_DSA_44_K * DILITHIUM_N * DILITHIUM_U / 8) +/* Encoding size of signature in bytes for ML-DSA-44. */ +#define PARAMS_ML_DSA_44_SIG_SIZE \ + ((PARAMS_ML_DSA_44_LAMBDA * 2) + \ + PARAMS_ML_DSA_44_L * DILITHIUM_N/8 * (PARAMS_ML_DSA_44_GAMMA1_BITS + 1) + \ + PARAMS_ML_DSA_44_OMEGA + PARAMS_ML_DSA_44_K) + +#endif /* WOLFSSL_NO_ML_DSA_44 */ + +#ifndef WOLFSSL_NO_ML_DSA_65 + +/* Fist dimension of A, k, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_K 6 +/* Second dimension of A, l, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_L 5 +/* Private key range, ETA, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_ETA DILITHIUM_ETA_4 +/* Number of bits in private key for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_ETA_BITS DILITHIUM_ETA_4_BITS +/* Collision strength of c-tilde, LAMBDA, in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_LAMBDA 24 +/* # +/-1's in polynomial c, TAU, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_TAU 49 +/* BETA = TAU * ETA for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_BETA \ + (PARAMS_ML_DSA_65_TAU * PARAMS_ML_DSA_65_ETA) +/* Max # 1's in the hint h, OMEGA, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_OMEGA 55 +/* Bits in coefficient range of y, GAMMA1, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_GAMMA1_BITS DILITHIUM_GAMMA1_BITS_19 +/* Ccoefficient range of y, GAMMA1, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_GAMMA1 (1 << PARAMS_ML_DSA_65_GAMMA1_BITS) +/* Low-order rounding range, GAMMA2, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_GAMMA2 DILITHIUM_Q_LOW_32 +/* Bits in high-order rounding range, GAMMA2, for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_GAMMA2_HI_BITS 4 +/* Encoding size of w1 in bytes for ML-DSA-65. + * K * N / 8 * 4 - 4 bits as max value is 15 in high bits. */ +#define PARAMS_ML_DSA_65_W1_ENC_SZ \ + (PARAMS_ML_DSA_65_K * DILITHIUM_N / 8 * PARAMS_ML_DSA_65_GAMMA2_HI_BITS) +/* Size of memory used for matrix a in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_A_SIZE \ + (PARAMS_ML_DSA_65_K * PARAMS_ML_DSA_65_L * DILITHIUM_POLY_SIZE) +/* Size of memory used for vector s1 in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_S1_SIZE \ + (PARAMS_ML_DSA_65_L * DILITHIUM_POLY_SIZE) +/* Encoding size of s1 in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_S1_ENC_SIZE \ + (PARAMS_ML_DSA_65_S1_SIZE / sizeof(sword32) * PARAMS_ML_DSA_65_ETA_BITS / 8) +/* Size of memory used for vector s2 in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_S2_SIZE \ + (PARAMS_ML_DSA_65_K * DILITHIUM_POLY_SIZE) +/* Encoding size of s2 in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_S2_ENC_SIZE \ + (PARAMS_ML_DSA_65_S2_SIZE / sizeof(sword32) * PARAMS_ML_DSA_65_ETA_BITS / 8) +/* Encoding size of z in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_Z_ENC_SIZE \ + (PARAMS_ML_DSA_65_S1_SIZE / sizeof(sword32) / 8 * \ + (PARAMS_ML_DSA_65_GAMMA1_BITS + 1)) +/* Encoding size of public key in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_PK_SIZE \ + (DILITHIUM_PUB_SEED_SZ + PARAMS_ML_DSA_65_K * DILITHIUM_N * DILITHIUM_U / 8) +/* Encoding size of signature in bytes for ML-DSA-65. */ +#define PARAMS_ML_DSA_65_SIG_SIZE \ + ((PARAMS_ML_DSA_65_LAMBDA * 2) + \ + PARAMS_ML_DSA_65_L * DILITHIUM_N/8 * (PARAMS_ML_DSA_65_GAMMA1_BITS + 1) + \ + PARAMS_ML_DSA_65_OMEGA + PARAMS_ML_DSA_65_K) + +#endif /* WOLFSSL_NO_ML_DSA_65 */ + +#ifndef WOLFSSL_NO_ML_DSA_87 + +/* Fist dimension of A, k, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_K 8 +/* Second dimension of A, l, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_L 7 +/* Private key range, ETA, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_ETA DILITHIUM_ETA_2 +/* Number of bits in private key for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_ETA_BITS DILITHIUM_ETA_2_BITS +/* Collision strength of c-tilde, LAMBDA, in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_LAMBDA 32 +/* # +/-1's in polynomial c, TAU, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_TAU 60 +/* BETA = TAU * ETA for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_BETA \ + (PARAMS_ML_DSA_87_TAU * PARAMS_ML_DSA_87_ETA) +/* Max # 1's in the hint h, OMEGA, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_OMEGA 75 +/* Bits in coefficient range of y, GAMMA1, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_GAMMA1_BITS DILITHIUM_GAMMA1_BITS_19 +/* Ccoefficient range of y, GAMMA1, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_GAMMA1 (1 << PARAMS_ML_DSA_87_GAMMA1_BITS) +/* Low-order rounding range, GAMMA2, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_GAMMA2 DILITHIUM_Q_LOW_32 +/* Bits in high-order rounding range, GAMMA2, for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_GAMMA2_HI_BITS 4 +/* Encoding size of w1 in bytes for ML-DSA-87. + * K * N / 8 * 4 - 4 bits as max value is 15 in high bits. */ +#define PARAMS_ML_DSA_87_W1_ENC_SZ \ + (PARAMS_ML_DSA_87_K * DILITHIUM_N / 8 * PARAMS_ML_DSA_87_GAMMA2_HI_BITS) +/* Size of memory used for matrix A in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_A_SIZE \ + (PARAMS_ML_DSA_87_K * PARAMS_ML_DSA_87_L * DILITHIUM_POLY_SIZE) +#define PARAMS_ML_DSA_87_S_SIZE 4 +/* Size of memory used for vector s1 in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_S1_SIZE \ + (PARAMS_ML_DSA_87_L * DILITHIUM_POLY_SIZE) +/* Encoding size of s1 in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_S1_ENC_SIZE \ + (PARAMS_ML_DSA_87_S1_SIZE / sizeof(sword32) * PARAMS_ML_DSA_87_ETA_BITS / 8) +/* Size of memory used for vector s2 in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_S2_SIZE \ + (PARAMS_ML_DSA_87_K * DILITHIUM_POLY_SIZE) +/* Encoding size of s2 in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_S2_ENC_SIZE \ + (PARAMS_ML_DSA_87_S2_SIZE / sizeof(sword32) * PARAMS_ML_DSA_87_ETA_BITS / 8) +/* Encoding size of z in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_Z_ENC_SIZE \ + (PARAMS_ML_DSA_87_S1_SIZE / sizeof(sword32) / 8 * \ + (PARAMS_ML_DSA_87_GAMMA1_BITS + 1)) +/* Encoding size of public key in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_PK_SIZE \ + (DILITHIUM_PUB_SEED_SZ + PARAMS_ML_DSA_87_K * DILITHIUM_N * DILITHIUM_U / 8) +/* Encoding size of signature in bytes for ML-DSA-87. */ +#define PARAMS_ML_DSA_87_SIG_SIZE \ + ((PARAMS_ML_DSA_87_LAMBDA * 2) + \ + PARAMS_ML_DSA_87_L * DILITHIUM_N/8 * (PARAMS_ML_DSA_87_GAMMA1_BITS + 1) + \ + PARAMS_ML_DSA_87_OMEGA + PARAMS_ML_DSA_87_K) + +#endif /* WOLFSSL_NO_ML_DSA_87 */ + + +#ifndef WOLFSSL_NO_ML_DSA_87 + +#define DILITHIUM_MAX_W1_ENC_SZ PARAMS_ML_DSA_87_W1_ENC_SZ +/* Maximum collision strength of c-tilde in bytes. */ +#define DILITHIUM_MAX_LAMBDA PARAMS_ML_DSA_87_LAMBDA + +/* Maximum count of elements of a vector with dimension K. */ +#define DILITHIUM_MAX_K_VECTOR_COUNT \ + (PARAMS_ML_DSA_87_K * DILITHIUM_N) +/* Maximum count of elements of a vector with dimension L. */ +#define DILITHIUM_MAX_L_VECTOR_COUNT \ + (PARAMS_ML_DSA_87_L * DILITHIUM_N) + +#elif !defined(WOLFSSL_NO_ML_DSA_65) + +/* Maximum w1 encoding size in bytes. */ +#define DILITHIUM_MAX_W1_ENC_SZ PARAMS_ML_DSA_65_W1_ENC_SZ +/* Maximum collision strength of c-tilde in bytes. */ +#define DILITHIUM_MAX_LAMBDA PARAMS_ML_DSA_65_LAMBDA + +/* Maximum count of elements of a vector with dimension K. */ +#define DILITHIUM_MAX_K_VECTOR_COUNT \ + (PARAMS_ML_DSA_65_K * DILITHIUM_N) +/* Maximum count of elements of a vector with dimension L. */ +#define DILITHIUM_MAX_L_VECTOR_COUNT \ + (PARAMS_ML_DSA_65_L * DILITHIUM_N) + +#else + +/* Maximum w1 encoding size in bytes. */ +#define DILITHIUM_MAX_W1_ENC_SZ PARAMS_ML_DSA_44_W1_ENC_SZ +/* Maximum collision strength of c-tilde in bytes. */ +#define DILITHIUM_MAX_LAMBDA PARAMS_ML_DSA_44_LAMBDA + +/* Maximum count of elements of a vector with dimension K. */ +#define DILITHIUM_MAX_K_VECTOR_COUNT \ + (PARAMS_ML_DSA_44_K * DILITHIUM_N) +/* Maximum count of elements of a vector with dimension L. */ +#define DILITHIUM_MAX_L_VECTOR_COUNT \ + (PARAMS_ML_DSA_44_L * DILITHIUM_N) + +#endif + +/* Length of K in bytes. */ +#define DILITHIUM_K_SZ 32 +/* Length of TR in bytes. */ +#define DILITHIUM_TR_SZ 64 +/* Length of public key seed in bytes when expanding a. */ +#define DILITHIUM_PUB_SEED_SZ 32 +/* Length of private key seed in bytes when generating a key. */ +#define DILITHIUM_PRIV_SEED_SZ 64 + +/* Length of seed when creating vector c. */ +#define DILITHIUM_SEED_SZ 32 +/* Length of seeds created when making a key. */ +#define DILITHIUM_SEEDS_SZ 128 + +/* Length of MU in bytes. */ +#define DILITHIUM_MU_SZ 64 +/* Length of random in bytes when generating a signature. */ +#define DILITHIUM_RND_SZ 32 +/* Length of private random in bytes when generating a signature. */ +#define DILITHIUM_PRIV_RAND_SEED_SZ 64 + +/* 5 blocks, each block 21 * 8 bytes = 840 bytes. + * Minimum required is 256 * 3 = 768. */ +#define DILITHIUM_GEN_A_NBLOCKS 5 +/* Number of bytes to generate with Shake128 when generating A. */ +#define DILITHIUM_GEN_A_BYTES \ + (DILITHIUM_GEN_A_NBLOCKS * WC_SHA3_128_COUNT * 8) +/* Number of bytes to a block of SHAKE-128 when generating A. */ +#define DILITHIUM_GEN_A_BLOCK_BYTES (WC_SHA3_128_COUNT * 8) + +/* Number of bytes to a block of SHAKE-256 when generating c. */ +#define DILITHIUM_GEN_C_BLOCK_BYTES (WC_SHA3_256_COUNT * 8) + + +#ifndef WOLFSSL_DILITHIUM_SMALL +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* A block SHAKE-128 output plus one for reading 4 bytes at a time. */ + #define DILITHIUM_REJ_NTT_POLY_H_SIZE (DILITHIUM_GEN_A_BYTES + 1) +#else + /* A block SHAKE-128 output. */ + #define DILITHIUM_REJ_NTT_POLY_H_SIZE DILITHIUM_GEN_A_BYTES +#endif /* LITTLE_ENDIAN_ORDER && WOLFSSL_DILITHIUM_ALIGNMENT == 0 */ +#else +#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_DILITHIUM_ALIGNMENT == 0) + /* A block SHAKE-128 output plus one for reading 4 bytes at a time. */ + #define DILITHIUM_REJ_NTT_POLY_H_SIZE (DILITHIUM_GEN_A_BLOCK_BYTES + 1) +#else + /* A block SHAKE-128 output. */ + #define DILITHIUM_REJ_NTT_POLY_H_SIZE DILITHIUM_GEN_A_BLOCK_BYTES +#endif /* LITTLE_ENDIAN_ORDER && WOLFSSL_DILITHIUM_ALIGNMENT == 0 */ +#endif + +#elif defined(HAVE_LIBOQS) + +#define DILITHIUM_LEVEL2_KEY_SIZE OQS_SIG_ml_dsa_44_ipd_length_secret_key +#define DILITHIUM_LEVEL2_SIG_SIZE OQS_SIG_ml_dsa_44_ipd_length_signature +#define DILITHIUM_LEVEL2_PUB_KEY_SIZE OQS_SIG_ml_dsa_44_ipd_length_public_key +#define DILITHIUM_LEVEL2_PRV_KEY_SIZE \ + (DILITHIUM_LEVEL2_PUB_KEY_SIZE+DILITHIUM_LEVEL2_KEY_SIZE) + +#define DILITHIUM_LEVEL3_KEY_SIZE OQS_SIG_ml_dsa_65_ipd_length_secret_key +#define DILITHIUM_LEVEL3_SIG_SIZE OQS_SIG_ml_dsa_65_ipd_length_signature +#define DILITHIUM_LEVEL3_PUB_KEY_SIZE OQS_SIG_ml_dsa_65_ipd_length_public_key +#define DILITHIUM_LEVEL3_PRV_KEY_SIZE \ + (DILITHIUM_LEVEL3_PUB_KEY_SIZE+DILITHIUM_LEVEL3_KEY_SIZE) + +#define DILITHIUM_LEVEL5_KEY_SIZE OQS_SIG_ml_dsa_87_ipd_length_secret_key +#define DILITHIUM_LEVEL5_SIG_SIZE OQS_SIG_ml_dsa_87_ipd_length_signature +#define DILITHIUM_LEVEL5_PUB_KEY_SIZE OQS_SIG_ml_dsa_87_ipd_length_public_key +#define DILITHIUM_LEVEL5_PRV_KEY_SIZE \ + (DILITHIUM_LEVEL5_PUB_KEY_SIZE+DILITHIUM_LEVEL5_KEY_SIZE) + #endif -#define DILITHIUM_MAX_KEY_SIZE DILITHIUM_LEVEL5_PRV_KEY_SIZE +#define DILITHIUM_MAX_KEY_SIZE DILITHIUM_LEVEL5_KEY_SIZE #define DILITHIUM_MAX_SIG_SIZE DILITHIUM_LEVEL5_SIG_SIZE #define DILITHIUM_MAX_PUB_KEY_SIZE DILITHIUM_LEVEL5_PUB_KEY_SIZE #define DILITHIUM_MAX_PRV_KEY_SIZE DILITHIUM_LEVEL5_PRV_KEY_SIZE +#ifdef WOLF_PRIVATE_KEY_ID +#define DILITHIUM_MAX_ID_LEN 32 +#define DILITHIUM_MAX_LABEL_LEN 32 +#endif + /* Structs */ +#ifdef WOLFSSL_WC_DILITHIUM +typedef struct wc_dilithium_params { + byte level; + byte k; + byte l; + byte eta; + byte eta_bits; + byte tau; + byte beta; + byte omega; + byte lambda; + byte gamma1_bits; + word32 gamma2; + word32 w1EncSz; + word16 aSz; + word16 s1Sz; + word16 s1EncSz; + word16 s2Sz; + word16 s2EncSz; + word16 zEncSz; + word16 pkSz; + word16 sigSz; +} wc_dilithium_params; +#endif + struct dilithium_key { - bool pubKeySet; - bool prvKeySet; + byte pubKeySet; + byte prvKeySet; byte level; /* 2,3 or 5 */ + +#ifdef WOLF_CRYPTO_CB + void* devCtx; + int devId; +#endif +#ifdef WOLF_PRIVATE_KEY_ID + byte id[DILITHIUM_MAX_ID_LEN]; + int idLen; + char label[DILITHIUM_MAX_LABEL_LEN]; + int labelLen; +#endif + +#ifndef WOLFSSL_DILITHIUM_ASSIGN_KEY byte p[DILITHIUM_MAX_PUB_KEY_SIZE]; - byte k[DILITHIUM_MAX_PRV_KEY_SIZE]; + byte k[DILITHIUM_MAX_KEY_SIZE]; +#else + const byte* p; + const byte* k; +#endif + +#ifdef WOLFSSL_WC_DILITHIUM + const wc_dilithium_params* params; + wc_Shake shake; +#ifdef WC_DILITHIUM_CACHE_MATRIX_A + sword32* a; + byte aSet; +#endif +#ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS + sword32* s1; + sword32* s2; + sword32* t0; + byte privVecsSet; +#endif +#ifdef WC_DILITHIUM_CACHE_PUB_VECTORS + sword32* t1; + byte pubVecSet; +#endif +#if defined(WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC) && \ + defined(WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM) + sword32 z[DILITHIUM_MAX_L_VECTOR_COUNT]; + sword32 c[DILITHIUM_N]; + sword32 w[DILITHIUM_N]; + sword32 t1[DILITHIUM_N]; + byte w1e[DILITHIUM_MAX_W1_ENC_SZ]; + byte h[DILITHIUM_REJ_NTT_POLY_H_SIZE]; + byte block[DILITHIUM_GEN_C_BLOCK_BYTES]; +#endif /* WOLFSSL_DILITHIUM_VERIFY_NO_MALLOC && + * WOLFSSL_DILITHIUM_VERIFY_SMALL_MEM */ +#endif /* WOLFSSL_WC_DILITHIUM */ }; #ifndef WC_DILITHIUMKEY_TYPE_DEFINED @@ -82,70 +588,179 @@ /* Functions */ +#ifndef WOLFSSL_DILITHIUM_VERIFY_ONLY WOLFSSL_API -int wc_dilithium_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen, - dilithium_key* key); +int wc_dilithium_make_key(dilithium_key* key, WC_RNG* rng); +WOLFSSL_API +int wc_dilithium_make_key_from_seed(dilithium_key* key, const byte* seed); + +WOLFSSL_API +int wc_dilithium_sign_msg(const byte* in, word32 inLen, byte* out, + word32 *outLen, dilithium_key* key, WC_RNG* rng); +WOLFSSL_API +int wc_dilithium_sign_msg_with_seed(const byte* in, word32 inLen, byte* out, + word32 *outLen, dilithium_key* key, byte* seed); +#endif WOLFSSL_API int wc_dilithium_verify_msg(const byte* sig, word32 sigLen, const byte* msg, - word32 msgLen, int* res, dilithium_key* key); + word32 msgLen, int* res, dilithium_key* key); WOLFSSL_API int wc_dilithium_init(dilithium_key* key); + WOLFSSL_API -int wc_dilithium_set_level(dilithium_key* key, byte level); +int wc_dilithium_init_ex(dilithium_key* key, void* heap, int devId); + +#ifdef WOLF_PRIVATE_KEY_ID WOLFSSL_API -int wc_dilithium_get_level(dilithium_key* key, byte* level); +int wc_dilithium_init_id(dilithium_key* key, const unsigned char* id, int len, + void* heap, int devId); WOLFSSL_API -void wc_dilithium_free(dilithium_key* key); +int wc_dilithium_init_label(dilithium_key* key, const char* label, void* heap, + int devId); +#endif WOLFSSL_API -int wc_dilithium_import_public(const byte* in, word32 inLen, dilithium_key* key); +int wc_dilithium_set_level(dilithium_key* key, byte level); WOLFSSL_API -int wc_dilithium_import_private_only(const byte* priv, word32 privSz, - dilithium_key* key); +int wc_dilithium_get_level(dilithium_key* key, byte* level); WOLFSSL_API -int wc_dilithium_import_private_key(const byte* priv, word32 privSz, - const byte* pub, word32 pubSz, - dilithium_key* key); +void wc_dilithium_free(dilithium_key* key); +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY WOLFSSL_API -int wc_dilithium_export_public(dilithium_key*, byte* out, word32* outLen); +int wc_dilithium_size(dilithium_key* key); +#endif +#if defined(WOLFSSL_DILITHIUM_PRIVATE_KEY) && \ + defined(WOLFSSL_DILITHIUM_PUBLIC_KEY) WOLFSSL_API -int wc_dilithium_export_private_only(dilithium_key* key, byte* out, word32* outLen); +int wc_dilithium_priv_size(dilithium_key* key); +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY WOLFSSL_API -int wc_dilithium_export_private(dilithium_key* key, byte* out, word32* outLen); +int wc_dilithium_pub_size(dilithium_key* key); +#endif +#if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) WOLFSSL_API -int wc_dilithium_export_key(dilithium_key* key, byte* priv, word32 *privSz, - byte* pub, word32 *pubSz); +int wc_dilithium_sig_size(dilithium_key* key); +#endif +#ifdef WOLFSSL_DILITHIUM_CHECK_KEY WOLFSSL_API int wc_dilithium_check_key(dilithium_key* key); +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY WOLFSSL_API -int wc_dilithium_size(dilithium_key* key); +int wc_dilithium_import_public(const byte* in, word32 inLen, + dilithium_key* key); +#endif +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY WOLFSSL_API -int wc_dilithium_priv_size(dilithium_key* key); +int wc_dilithium_import_private(const byte* priv, word32 privSz, + dilithium_key* key); +#define wc_dilithium_import_private_only wc_dilithium_import_private WOLFSSL_API -int wc_dilithium_pub_size(dilithium_key* key); +int wc_dilithium_import_key(const byte* priv, word32 privSz, + const byte* pub, word32 pubSz, dilithium_key* key); +#endif + +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY WOLFSSL_API -int wc_dilithium_sig_size(dilithium_key* key); +int wc_dilithium_export_public(dilithium_key* key, byte* out, word32* outLen); +#endif +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY +WOLFSSL_API +int wc_dilithium_export_private(dilithium_key* key, byte* out, word32* outLen); +#endif +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY +WOLFSSL_API +int wc_dilithium_export_key(dilithium_key* key, byte* priv, word32 *privSz, + byte* pub, word32 *pubSz); +#endif +#ifndef WOLFSSL_DILITHIUM_NO_ASN1 +#if defined(WOLFSSL_DILITHIUM_PRIVATE_KEY) WOLFSSL_API int wc_Dilithium_PrivateKeyDecode(const byte* input, - word32* inOutIdx, - dilithium_key* key, word32 inSz); + word32* inOutIdx, dilithium_key* key, word32 inSz); +#endif +#ifdef WOLFSSL_DILITHIUM_PUBLIC_KEY WOLFSSL_API int wc_Dilithium_PublicKeyDecode(const byte* input, - word32* inOutIdx, - dilithium_key* key, word32 inSz); + word32* inOutIdx, dilithium_key* key, word32 inSz); +#endif + +#ifdef WC_ENABLE_ASYM_KEY_EXPORT +WOLFSSL_API int wc_Dilithium_PublicKeyToDer(dilithium_key* key, byte* output, + word32 inLen, int withAlg); +#endif +#if defined(WOLFSSL_DILITHIUM_PRIVATE_KEY) WOLFSSL_API int wc_Dilithium_KeyToDer(dilithium_key* key, byte* output, - word32 inLen); + word32 inLen); +#endif +#ifdef WOLFSSL_DILITHIUM_PRIVATE_KEY WOLFSSL_API int wc_Dilithium_PrivateKeyToDer(dilithium_key* key, byte* output, - word32 inLen); -WOLFSSL_API int wc_Dilithium_PublicKeyToDer(dilithium_key* key, byte* output, - word32 inLen, int withAlg); + word32 inLen); +#endif +#endif /* WOLFSSL_DILITHIUM_NO_ASN1 */ + + + +#define WC_ML_DSA_44 2 +#define WC_ML_DSA_65 3 +#define WC_ML_DSA_87 5 + +#define DILITHIUM_ML_DSA_44_KEY_SIZE 2560 +#define DILITHIUM_ML_DSA_44_SIG_SIZE 2420 +#define DILITHIUM_ML_DSA_44_PUB_KEY_SIZE 1312 +#define DILITHIUM_ML_DSA_44_PRV_KEY_SIZE \ + (DILITHIUM_ML_DSA_44_PUB_KEY_SIZE + DILITHIUM_ML_DSA_44_KEY_SIZE) + +#define DILITHIUM_ML_DSA_65_KEY_SIZE 4032 +#define DILITHIUM_ML_DSA_65_SIG_SIZE 3309 +#define DILITHIUM_ML_DSA_65_PUB_KEY_SIZE 1952 +#define DILITHIUM_ML_DSA_65_PRV_KEY_SIZE \ + (DILITHIUM_ML_DSA_65_PUB_KEY_SIZE + DILITHIUM_ML_DSA_65_KEY_SIZE) + +#define DILITHIUM_ML_DSA_87_KEY_SIZE 4896 +#define DILITHIUM_ML_DSA_87_SIG_SIZE 4627 +#define DILITHIUM_ML_DSA_87_PUB_KEY_SIZE 2592 +#define DILITHIUM_ML_DSA_87_PRV_KEY_SIZE \ + (DILITHIUM_ML_DSA_87_PUB_KEY_SIZE + DILITHIUM_ML_DSA_87_KEY_SIZE) + + +#define MlDsaKey dilithium_key + + +#define wc_MlDsaKey_Init(key, heap, devId) \ + wc_dilithium_init_ex(key, heap, devId) +#define wc_MlDsaKey_SetParams(key, id) \ + wc_dilithium_set_level(key, id) +#define wc_MlDsaKey_GetParams(key, id) \ + wc_dilithium_get_level(key, id) +#define wc_MlDsaKey_MakeKey(key, rng) \ + wc_dilithium_make_key(key, rng) +#define wc_MlDsaKey_ExportPrivRaw(key, out, outLen) \ + wc_dilithium_export_private_only(key, out, outLen) +#define wc_MlDsaKey_ImportPrivRaw(key, in, inLen) \ + wc_dilithium_import_private_only(out, outLen, key) +#define wc_MlDsaKey_Sign(key, sig, sigSz, msg, msgSz, rng) \ + wc_dilithium_sign_msg(msg, msgSz, sig, sigSz, key, rng) +#define wc_MlDsaKey_Free(key) \ + wc_dilithium_free(key) +#define wc_MlDsaKey_ExportPubRaw(key, out, outLen) \ + wc_dilithium_export_public(key, out, outLen) +#define wc_MlDsaKey_ImportPubRaw(key, in, inLen) \ + wc_dilithium_import_public(out, outLen, key) +#define wc_MlDsaKey_Verify(key, sig, sigSz, msg, msgSz, res) \ + wc_dilithium_verify_msg(sig, sigSz, msg, msgSz, res, key) + +int wc_MlDsaKey_GetPrivLen(MlDsaKey* key, int* len); +int wc_MlDsaKey_GetPubLen(MlDsaKey* key, int* len); +int wc_MlDsaKey_GetSigLen(MlDsaKey* key, int* len); #ifdef __cplusplus } /* extern "C" */ #endif -#endif /* HAVE_PQC && HAVE_DILITHIUM */ +#endif /* HAVE_DILITHIUM */ #endif /* WOLF_CRYPT_DILITHIUM_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ecc.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ecc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ecc.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ecc.h 2024-08-03 07:30:01.000000000 +0000 @@ -31,8 +31,7 @@ #ifdef HAVE_ECC -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) #include #endif /* HAVE_FIPS_VERSION >= 2 */ @@ -83,6 +82,10 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_ecc_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_ECC_sanity(void); +#endif /* Enable curve B parameter if needed */ #if defined(HAVE_COMP_KEY) || defined(ECC_CACHE_CURVE) @@ -107,7 +110,7 @@ #define MAX_ECC_BITS_NEEDED 384 #elif defined(HAVE_ECC320) #define MAX_ECC_BITS_NEEDED 320 -#elif !defined(NO_ECC256) +#elif !defined(NO_ECC256) || defined(WOLFSSL_SM2) #define MAX_ECC_BITS_NEEDED 256 #elif defined(HAVE_ECC239) #define MAX_ECC_BITS_NEEDED 239 @@ -131,6 +134,14 @@ #endif #endif +#if FIPS_VERSION3_GE(6,0,0) + #define WC_ECC_FIPS_SIG_MIN 224 + #define WC_ECC_FIPS_GEN_MIN (WC_ECC_FIPS_SIG_MIN/8) +#endif + +#ifdef WOLFSSL_SM2 + #define WOLFSSL_SM2_KEY_BITS 256 +#endif /* calculate max ECC bytes */ #if ((MAX_ECC_BITS * 2) % 8) == 0 @@ -209,13 +220,13 @@ ECC_CURVE_DEF = 0, /* NIST or SECP */ /* NIST Prime Curves */ - ECC_SECP192R1, + ECC_SECP192R1, /* 1 */ ECC_PRIME192V2, ECC_PRIME192V3, ECC_PRIME239V1, ECC_PRIME239V2, ECC_PRIME239V3, - ECC_SECP256R1, + ECC_SECP256R1, /* 7 */ /* SECP Curves */ ECC_SECP112R1, @@ -224,9 +235,9 @@ ECC_SECP128R2, ECC_SECP160R1, ECC_SECP160R2, - ECC_SECP224R1, - ECC_SECP384R1, - ECC_SECP521R1, + ECC_SECP224R1, /* 14 */ + ECC_SECP384R1, /* 15 */ + ECC_SECP521R1, /* 16 */ /* Koblitz */ ECC_SECP160K1, @@ -243,6 +254,9 @@ ECC_BRAINPOOLP384R1, ECC_BRAINPOOLP512R1, + /* SM2 */ + ECC_SM2P256V1, + /* Twisted Edwards Curves */ #ifdef HAVE_CURVE25519 ECC_X25519, @@ -283,7 +297,7 @@ /* ECC set type defined a GF(p) curve */ #ifndef WOLFSSL_ECC_CURVE_STATIC -typedef struct ecc_set_type { +struct ecc_set_type { int size; /* The size of the curve in octets */ int id; /* id of this curve */ const char* name; /* name of this curve */ @@ -297,13 +311,13 @@ word32 oidSz; word32 oidSum; /* sum of encoded OID bytes */ int cofactor; -} ecc_set_type; +}; #else #define MAX_ECC_NAME 16 #define MAX_ECC_STRING ((MAX_ECC_BYTES * 2) + 2) /* The values are stored as text strings. */ -typedef struct ecc_set_type { +struct ecc_set_type { int size; /* The size of the curve in octets */ int id; /* id of this curve */ char name[MAX_ECC_NAME]; /* name of this curve */ @@ -317,7 +331,7 @@ word32 oidSz; word32 oidSum; /* sum of encoded OID bytes */ int cofactor; -} ecc_set_type; +}; #endif @@ -427,10 +441,19 @@ #define WC_ECCKEY_TYPE_DEFINED #endif +#ifndef WC_ECCPOINT_TYPE_DEFINED + typedef struct ecc_point ecc_point; + #define WC_ECCPOINT_TYPE_DEFINED +#endif + +#ifndef WC_ECCSET_TYPE_DEFINED + typedef struct ecc_set_type ecc_set_type; + #define WC_ECCSET_TYPE_DEFINED +#endif /* A point on an ECC curve, stored in Jacobian format such that (x,y,z) => (x/z^2, y/z^3, 1) when interpreted as affine */ -typedef struct { +struct ecc_point { #ifndef ALT_ECC_SIZE mp_int x[1]; /* The x coordinate */ mp_int y[1]; /* The y coordinate */ @@ -444,7 +467,7 @@ #if defined(WOLFSSL_SMALL_STACK_CACHE) && !defined(WOLFSSL_ECC_NO_SMALL_STACK) ecc_key* key; #endif -} ecc_point; +}; /* ECC Flags */ enum { @@ -487,6 +510,17 @@ mp_int* k; alt_fp_int ka[1]; #endif +#ifdef WOLFSSL_ECC_BLIND_K +#ifndef ALT_ECC_SIZE + mp_int kb[1]; + mp_int ku[1]; +#else + mp_int* kb; + mp_int* ku; + alt_fp_int kba[1]; + alt_fp_int kua[1]; +#endif +#endif #ifdef WOLFSSL_CAAM word32 blackKey; /* address of key encrypted and in secure memory */ @@ -502,11 +536,9 @@ byte pubkey_raw[ECC_MAX_CRYPTO_HW_PUBKEY_SIZE]; #endif #if defined(PLUTON_CRYPTO_ECC) || defined(WOLF_CRYPTO_CB) + void* devCtx; int devId; #endif -#if defined(HAVE_PKCS11) - byte isPkcs11 : 1; /* indicate if PKCS11 is preferred */ -#endif #ifdef WOLFSSL_SILABS_SE_ACCEL sl_se_command_context_t cmd_ctx; sl_se_key_descriptor_t key; @@ -586,7 +618,20 @@ #endif }; -#define wc_ecc_key_get_priv(key) ((key)->k) +#ifndef WOLFSSL_ECC_BLIND_K +#define ecc_get_k(key) (key)->k +#define ecc_blind_k(key, b) (void)b +#define ecc_blind_k_rng(key, rng) 0 + +#define wc_ecc_key_get_priv(key) (key)->k +#else +mp_int* ecc_get_k(ecc_key* key); +void ecc_blind_k(ecc_key* key, mp_int* b); +int ecc_blind_k_rng(ecc_key* key, WC_RNG* rng); + +WOLFSSL_API mp_int* wc_ecc_key_get_priv(ecc_key* key); +#endif + #define WOLFSSL_HAVE_ECC_KEY_GET_PRIV @@ -655,10 +700,8 @@ int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point, byte* out, word32* outlen); -#if defined(WOLFSSL_ATECC508A) || defined(WOLFSSL_ATECC608A) || \ - defined(PLUTON_CRYPTO_ECC) || defined(WOLFSSL_CRYPTOCELL) -#define wc_ecc_shared_secret_ssh wc_ecc_shared_secret -#else +#if !defined(WOLFSSL_ATECC508A) && !defined(WOLFSSL_ATECC608A) && \ + !defined(PLUTON_CRYPTO_ECC) && !defined(WOLFSSL_CRYPTOCELL) #define wc_ecc_shared_secret_ssh wc_ecc_shared_secret_ex /* For backwards compat */ #endif @@ -892,8 +935,12 @@ }; enum ecKdfAlgo { - ecHKDF_SHA256 = 1, /* default */ - ecHKDF_SHA1 = 2 + ecHKDF_SHA256 = 1, /* default */ + ecHKDF_SHA1 = 2, + ecKDF_X963_SHA1 = 3, + ecKDF_X963_SHA256 = 4, + ecKDF_SHA1 = 5, + ecKDF_SHA256 = 6 }; enum ecMacAlgo { @@ -940,6 +987,8 @@ WOLFSSL_API int wc_ecc_ctx_set_peer_salt(ecEncCtx* ctx, const byte* salt); WOLFSSL_API +int wc_ecc_ctx_set_own_salt(ecEncCtx* ctx, const byte* salt, word32 sz); +WOLFSSL_API int wc_ecc_ctx_set_kdf_salt(ecEncCtx* ctx, const byte* salt, word32 sz); WOLFSSL_API int wc_ecc_ctx_set_info(ecEncCtx* ctx, const byte* info, int sz); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed25519.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed25519.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed25519.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed25519.h 2024-08-03 07:30:01.000000000 +0000 @@ -31,8 +31,6 @@ #ifdef HAVE_ED25519 -#include -#include #include #ifndef WOLFSSL_SHA512 #error ED25519 requires SHA512 @@ -47,6 +45,10 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_ed25519_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_ED25519_sanity(void); +#endif /* info about EdDSA curve specifically ed25519, defined as an elliptic curve over GF(p) */ @@ -72,11 +74,6 @@ Ed25519ph = 1 }; -#ifndef WC_ED25519KEY_TYPE_DEFINED - typedef struct ed25519_key ed25519_key; - #define WC_ED25519KEY_TYPE_DEFINED -#endif - /* ED25519 Flags */ enum { WC_ED25519_FLAG_NONE = 0x00, @@ -85,12 +82,12 @@ /* An ED25519 Key */ struct ed25519_key { - byte p[ED25519_PUB_KEY_SIZE]; /* compressed public key */ - byte k[ED25519_PRV_KEY_SIZE]; /* private key : 32 secret -- 32 public */ + ALIGN16 byte p[ED25519_PUB_KEY_SIZE]; /* compressed public key */ + ALIGN16 byte k[ED25519_PRV_KEY_SIZE]; /* private key: 32 secret, 32 pub */ #ifdef FREESCALE_LTC_ECC /* uncompressed point coordinates */ - byte pointX[ED25519_KEY_SIZE]; /* recovered X coordinate */ - byte pointY[ED25519_KEY_SIZE]; /* Y coordinate is the public key with The most significant bit of the final octet always zero. */ + ALIGN16 byte pointX[ED25519_KEY_SIZE]; /* recovered X coordinate */ + ALIGN16 byte pointY[ED25519_KEY_SIZE]; /* Y coordinate is the public key with The most significant bit of the final octet always zero. */ #endif #ifdef WOLFSSL_SE050 word32 keyId; @@ -103,6 +100,7 @@ WC_ASYNC_DEV asyncDev; #endif #if defined(WOLF_CRYPTO_CB) + void* devCtx; int devId; #endif void *heap; @@ -112,6 +110,11 @@ #endif }; +#ifndef WC_ED25519KEY_TYPE_DEFINED + typedef struct ed25519_key ed25519_key; + #define WC_ED25519KEY_TYPE_DEFINED +#endif + WOLFSSL_API int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed448.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed448.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed448.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ed448.h 2024-08-03 07:30:01.000000000 +0000 @@ -47,6 +47,10 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_ed448_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_ED448_sanity(void); +#endif /* info about EdDSA curve specifically ed448, defined as an elliptic curve * over GF(p) @@ -72,15 +76,10 @@ Ed448ph = 1 }; -#ifndef WC_ED448KEY_TYPE_DEFINED - typedef struct ed448_key ed448_key; - #define WC_ED448KEY_TYPE_DEFINED -#endif - /* An ED448 Key */ struct ed448_key { byte p[ED448_PUB_KEY_SIZE]; /* compressed public key */ - byte k[ED448_PRV_KEY_SIZE]; /* private key : 56 secret -- 56 public */ + byte k[ED448_PRV_KEY_SIZE]; /* private key : 57 secret -- 57 public */ #ifdef FREESCALE_LTC_ECC /* uncompressed point coordinates */ byte pointX[ED448_KEY_SIZE]; /* recovered X coordinate */ @@ -92,6 +91,7 @@ WC_ASYNC_DEV asyncDev; #endif #if defined(WOLF_CRYPTO_CB) + void* devCtx; int devId; #endif void *heap; @@ -101,6 +101,10 @@ #endif }; +#ifndef WC_ED448KEY_TYPE_DEFINED + typedef struct ed448_key ed448_key; + #define WC_ED448KEY_TYPE_DEFINED +#endif WOLFSSL_API int wc_ed448_make_public(ed448_key* key, unsigned char* pubKey, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/error-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/error-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/error-crypt.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/error-crypt.h 2024-08-03 07:30:01.000000000 +0000 @@ -33,11 +33,6 @@ #include -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - #include -#endif /* HAVE_FIPS V1 */ - #ifdef __cplusplus extern "C" { #endif @@ -54,7 +49,7 @@ BAD_MUTEX_E = -106, /* Bad mutex operation */ WC_TIMEOUT_E = -107, /* timeout error */ WC_PENDING_E = -108, /* wolfCrypt operation pending (would block) */ - WC_NOT_PENDING_E = -109, /* wolfCrypt operation not pending */ + WC_NO_PENDING_E = -109, /* no asynchronous operation pending */ MP_INIT_E = -110, /* mp_init error state */ MP_READ_E = -111, /* mp_read error state */ @@ -69,8 +64,17 @@ MP_CMP_E = -120, /* mp_cmp error state */ MP_ZERO_E = -121, /* got a mp zero result, not expected */ + AES_EAX_AUTH_E = -122, /* AES-EAX Authentication check failure */ + KEY_EXHAUSTED_E = -123, /* No longer usable for operation. */ + + /* -124 unused. */ + MEMORY_E = -125, /* out of memory error */ VAR_STATE_CHANGE_E = -126, /* var state modified by different thread */ + FIPS_DEGRADED_E = -127, /* FIPS Module in degraded mode */ + + FIPS_CODE_SZ_E = -128, /* Module CODE too big */ + FIPS_DATA_SZ_E = -129, /* Module DATA too big */ RSA_WRONG_TYPE_E = -130, /* RSA wrong block type for RSA function */ RSA_BUFFER_E = -131, /* RSA buffer error, output too small or @@ -103,9 +107,14 @@ ASN_SIG_HASH_E = -156, /* ASN sig error, unsupported hash type */ ASN_SIG_KEY_E = -157, /* ASN sig error, unsupported key type */ ASN_DH_KEY_E = -158, /* ASN key init error, invalid input */ + KDF_SRTP_KAT_FIPS_E = -159, /* SRTP-KDF Known Answer Test Failure */ ASN_CRIT_EXT_E = -160, /* ASN unsupported critical extension */ ASN_ALT_NAME_E = -161, /* ASN alternate name error */ ASN_NO_PEM_HEADER = -162, /* ASN no PEM header found */ + ED25519_KAT_FIPS_E = -163, /* Ed25519 Known answer test failure */ + ED448_KAT_FIPS_E = -164, /* Ed448 Known answer test failure */ + PBKDF2_KAT_FIPS_E = -165, /* PBKDF2 Known answer test failure */ + /* -166..-169 unused. */ ECC_BAD_ARG_E = -170, /* ECC input argument of wrong type */ ASN_ECC_KEY_E = -171, /* ASN ECC bad input */ @@ -181,9 +190,12 @@ WC_INIT_E = -228, /* wolfcrypt failed to initialize */ SIG_VERIFY_E = -229, /* wolfcrypt signature verify error */ BAD_COND_E = -230, /* Bad condition variable operation */ - SIG_TYPE_E = -231, /* Signature Type not enabled/available */ + SIG_TYPE_E = -231, /* Signature Type not enabled/available + * NOTE: 1024-bit sign disabled in FIPS mode */ HASH_TYPE_E = -232, /* Hash Type not enabled/available */ + FIPS_INVALID_VER_E = -233, /* Invalid FIPS Version defined */ + WC_KEY_SIZE_E = -234, /* Key size error, either too small or large */ ASN_COUNTRY_SIZE_E = -235, /* ASN Cert Gen, invalid country code size */ MISSING_RNG_E = -236, /* RNG required but not provided */ @@ -240,19 +252,19 @@ BAD_LENGTH_E = -279, /* Value of length parameter is invalid. */ ECDSA_KAT_FIPS_E = -280, /* ECDSA KAT failure */ RSA_PAT_FIPS_E = -281, /* RSA Pairwise failure */ - KDF_TLS12_KAT_FIPS_E = -282, /* TLS12 KDF KAT failure */ - KDF_TLS13_KAT_FIPS_E = -283, /* TLS13 KDF KAT failure */ + KDF_TLS12_KAT_FIPS_E = -282, /* TLS12 KDF KAT failure */ + KDF_TLS13_KAT_FIPS_E = -283, /* TLS13 KDF KAT failure */ KDF_SSH_KAT_FIPS_E = -284, /* SSH KDF KAT failure */ DHE_PCT_E = -285, /* DHE Pairwise Consistency Test failure */ ECC_PCT_E = -286, /* ECDHE Pairwise Consistency Test failure */ FIPS_PRIVATE_KEY_LOCKED_E = -287, /* Cannot export private key. */ PROTOCOLCB_UNAVAILABLE = -288, /* Protocol callback unavailable */ - AES_SIV_AUTH_E = -289, /* AES-SIV authentication failed */ - NO_VALID_DEVID = -290, /* no valid device ID */ + AES_SIV_AUTH_E = -289, /* AES-SIV authentication failed */ + NO_VALID_DEVID = -290, /* no valid device ID */ - IO_FAILED_E = -291, /* Input/output failure */ - SYSLIB_FAILED_E = -292, /* System/library call failed */ - USE_HW_PSK = -293, /* Callback return to indicate HW has PSK */ + IO_FAILED_E = -291, /* Input/output failure */ + SYSLIB_FAILED_E = -292, /* System/library call failed */ + USE_HW_PSK = -293, /* Callback return to indicate HW has PSK */ ENTROPY_RT_E = -294, /* Entropy Repetition Test failed */ ENTROPY_APT_E = -295, /* Entropy Adaptive Proportion Test failed */ @@ -260,7 +272,10 @@ ASN_DEPTH_E = -296, /* Invalid ASN.1 - depth check */ ASN_LEN_E = -297, /* ASN.1 length invalid */ - WC_LAST_E = -297, /* Update this to indicate last error */ + SM4_GCM_AUTH_E = -298, /* SM4-GCM Authentication check failure */ + SM4_CCM_AUTH_E = -299, /* SM4-CCM Authentication check failure */ + + WC_LAST_E = -299, /* Update this to indicate last error */ MIN_CODE_E = -300 /* errors -101 - -299 */ /* add new companion error id strings for any new error codes @@ -279,6 +294,22 @@ WOLFSSL_ABI WOLFSSL_API const char* wc_GetErrorString(int error); #endif +#if defined(WOLFSSL_DEBUG_TRACE_ERROR_CODES) && !defined(BUILDING_WOLFSSL) + #undef WOLFSSL_DEBUG_TRACE_ERROR_CODES +#endif +#ifdef WOLFSSL_DEBUG_TRACE_ERROR_CODES + #define WC_NO_ERR_TRACE(label) (CONST_NUM_ERR_ ## label) + #ifndef WC_ERR_TRACE + #define WC_ERR_TRACE(label) \ + ( fprintf(stderr, \ + "ERR TRACE: %s L %d " #label " (%d)\n", \ + __FILE__, __LINE__, label), label) + #endif + #include +#else + #define WC_NO_ERR_TRACE(label) (label) +#endif + #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_kyber.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_kyber.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_kyber.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_kyber.h 2024-08-03 07:30:01.000000000 +0000 @@ -22,6 +22,10 @@ #ifndef EXT_KYBER_H #define EXT_KYBER_H +#ifdef WOLF_CRYPTO_CB + #include +#endif + #ifdef WOLFSSL_HAVE_KYBER #include @@ -56,6 +60,12 @@ * Note we don't save the variant (SHAKE vs AES) as that is decided at * configuration time. */ int type; + +#ifdef WOLF_CRYPTO_CB + void* devCtx; + int devId; +#endif + byte priv[EXT_KYBER_MAX_PRIV_SZ]; byte pub[EXT_KYBER_MAX_PUB_SZ]; }; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_lms.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_lms.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_lms.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_lms.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,65 @@ +/* ext_lms.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef EXT_LMS_H +#define EXT_LMS_H + +#ifdef WOLFSSL_HAVE_LMS +#include + +#if !defined(HAVE_LIBLMS) +#error "This code requires liblms" +#endif + +/* hash-sigs LMS HSS includes */ +#include + +#if defined(WOLFSSL_WC_LMS) +#error "This code is incompatible with wolfCrypt's implementation of LMS." +#endif + +/* + * The hash-sigs LMS lib supports from MIN_HSS_LEVELS to MAX_HSS_LEVELS + * number of levels of Merkle trees. It allows for the tree height and + * winternitz parameter to be unique per level. + */ + +/* hss structs */ +typedef struct hss_working_key hss_working_key; +typedef struct hss_extra_info hss_extra_info; + +struct LmsKey { + unsigned levels; /* Number of tree levels. */ + param_set_t lm_type[MAX_HSS_LEVELS]; /* Height param per level. */ + param_set_t lm_ots_type[MAX_HSS_LEVELS]; /* Winternitz param per level. */ + unsigned char pub[HSS_MAX_PUBLIC_KEY_LEN]; +#ifndef WOLFSSL_LMS_VERIFY_ONLY + hss_working_key * working_key; + wc_lms_write_private_key_cb write_private_key; /* Callback to write/update key. */ + wc_lms_read_private_key_cb read_private_key; /* Callback to read key. */ + void * context; /* Context arg passed to callbacks. */ + hss_extra_info info; +#endif /* ifndef WOLFSSL_LMS_VERIFY_ONLY */ + enum wc_LmsState state; +}; + +#endif /* WOLFSSL_HAVE_LMS */ +#endif /* EXT_LMS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_xmss.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_xmss.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_xmss.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ext_xmss.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,56 @@ +/* ext_xmss.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef EXT_XMSS_H +#define EXT_XMSS_H + +#ifdef WOLFSSL_HAVE_XMSS +#include + +#if !defined(HAVE_LIBXMSS) + #error "This code requires libxmss" +#endif + +#include +#include + +#if defined(WOLFSSL_WC_XMSS) + #error "This code is incompatible with wolfCrypt's implementation of XMSS." +#endif + +struct XmssKey { + unsigned char pk[XMSS_SHA256_PUBLEN]; + uint32_t oid; + int is_xmssmt; + xmss_params params; +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + /* The secret key length is a function of xmss_params. */ + unsigned char * sk; + word32 sk_len; + wc_xmss_write_private_key_cb write_private_key; /* Callback to write/update key. */ + wc_xmss_read_private_key_cb read_private_key; /* Callback to read key. */ + void * context; /* Context arg passed to callbacks. */ +#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY */ + enum wc_XmssState state; +}; + +#endif /* WOLFSSL_HAVE_XMSS */ +#endif /* EXT_XMSS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/falcon.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/falcon.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/falcon.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/falcon.h 2024-08-03 07:30:01.000000000 +0000 @@ -31,10 +31,15 @@ #include +#ifdef WOLF_CRYPTO_CB + #include +#endif + #if defined(HAVE_PQC) && defined(HAVE_FALCON) #ifdef HAVE_LIBOQS #include +#include #endif #ifdef __cplusplus @@ -55,17 +60,35 @@ #define FALCON_LEVEL5_PRV_KEY_SIZE (FALCON_LEVEL5_PUB_KEY_SIZE+FALCON_LEVEL5_KEY_SIZE) #endif -#define FALCON_MAX_KEY_SIZE FALCON_LEVEL5_PRV_KEY_SIZE +#define FALCON_MAX_KEY_SIZE FALCON_LEVEL5_KEY_SIZE #define FALCON_MAX_SIG_SIZE FALCON_LEVEL5_SIG_SIZE #define FALCON_MAX_PUB_KEY_SIZE FALCON_LEVEL5_PUB_KEY_SIZE #define FALCON_MAX_PRV_KEY_SIZE FALCON_LEVEL5_PRV_KEY_SIZE +#ifdef WOLF_PRIVATE_KEY_ID +#define FALCON_MAX_ID_LEN 32 +#define FALCON_MAX_LABEL_LEN 32 +#endif + + /* Structs */ struct falcon_key { bool pubKeySet; bool prvKeySet; byte level; + +#ifdef WOLF_CRYPTO_CB + void* devCtx; + int devId; +#endif +#ifdef WOLF_PRIVATE_KEY_ID + byte id[FALCON_MAX_ID_LEN]; + int idLen; + char label[FALCON_MAX_LABEL_LEN]; + int labelLen; +#endif + byte p[FALCON_MAX_PUB_KEY_SIZE]; byte k[FALCON_MAX_PRV_KEY_SIZE]; }; @@ -79,13 +102,26 @@ WOLFSSL_API int wc_falcon_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen, - falcon_key* key); + falcon_key* key, WC_RNG* rng); WOLFSSL_API int wc_falcon_verify_msg(const byte* sig, word32 sigLen, const byte* msg, word32 msgLen, int* res, falcon_key* key); WOLFSSL_API int wc_falcon_init(falcon_key* key); + +WOLFSSL_API +int wc_falcon_init_ex(falcon_key* key, void* heap, int devId); + +#ifdef WOLF_PRIVATE_KEY_ID +WOLFSSL_API +int wc_falcon_init_id(falcon_key* key, const unsigned char* id, int len, + void* heap, int devId); +WOLFSSL_API +int wc_falcon_init_label(falcon_key* key, const char* label, void* heap, + int devId); +#endif + WOLFSSL_API int wc_falcon_set_level(falcon_key* key, byte level); WOLFSSL_API @@ -104,7 +140,7 @@ falcon_key* key); WOLFSSL_API -int wc_falcon_export_public(falcon_key*, byte* out, word32* outLen); +int wc_falcon_export_public(falcon_key* key, byte* out, word32* outLen); WOLFSSL_API int wc_falcon_export_private_only(falcon_key* key, byte* out, word32* outLen); WOLFSSL_API diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_448.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_448.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_448.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_448.h 2024-08-03 07:30:01.000000000 +0000 @@ -66,7 +66,7 @@ #if !defined(CURVED448_128BIT) WOLFSSL_LOCAL void fe448_reduce(fe448*); #else -#define fe448_reduce(a) +#define fe448_reduce(a) WC_DO_NOTHING #endif WOLFSSL_LOCAL void fe448_neg(fe448* r, const fe448* a); WOLFSSL_LOCAL void fe448_add(fe448* r, const fe448* a, const fe448* b); @@ -93,7 +93,7 @@ WOLFSSL_LOCAL void fe448_init(void); WOLFSSL_LOCAL int curve448(byte* r, const byte* n, const byte* a); -#define fe448_reduce(a) +#define fe448_reduce(a) WC_DO_NOTHING WOLFSSL_LOCAL void fe448_neg(word8* r, const word8* a); WOLFSSL_LOCAL void fe448_add(word8* r, const word8* a, const word8* b); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_operations.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_operations.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_operations.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fe_operations.h 2024-08-03 07:30:01.000000000 +0000 @@ -116,32 +116,10 @@ WOLFSSL_LOCAL void fe_pow22523(fe out,const fe z); /* 64 type needed for SHA512 */ -WOLFSSL_LOCAL word64 load_3(const unsigned char *in); -WOLFSSL_LOCAL word64 load_4(const unsigned char *in); +WOLFSSL_LOCAL sword64 load_3(const unsigned char *in); +WOLFSSL_LOCAL sword64 load_4(const unsigned char *in); #ifdef CURVED25519_ASM -WOLFSSL_LOCAL void fe_ge_to_p2(fe rx, fe ry, fe rz, const fe px, const fe py, - const fe pz, const fe pt); -WOLFSSL_LOCAL void fe_ge_to_p3(fe rx, fe ry, fe rz, fe rt, const fe px, - const fe py, const fe pz, const fe pt); -WOLFSSL_LOCAL void fe_ge_dbl(fe rx, fe ry, fe rz, fe rt, const fe px, - const fe py, const fe pz); -WOLFSSL_LOCAL void fe_ge_madd(fe rx, fe ry, fe rz, fe rt, const fe px, - const fe py, const fe pz, const fe pt, - const fe qxy2d, const fe qyplusx, - const fe qyminusx); -WOLFSSL_LOCAL void fe_ge_msub(fe rx, fe ry, fe rz, fe rt, const fe px, - const fe py, const fe pz, const fe pt, - const fe qxy2d, const fe qyplusx, - const fe qyminusx); -WOLFSSL_LOCAL void fe_ge_add(fe rx, fe ry, fe rz, fe rt, const fe px, - const fe py, const fe pz, const fe pt, const fe qz, - const fe qt2d, const fe qyplusx, - const fe qyminusx); -WOLFSSL_LOCAL void fe_ge_sub(fe rx, fe ry, fe rz, fe rt, const fe px, - const fe py, const fe pz, const fe pt, const fe qz, - const fe qt2d, const fe qyplusx, - const fe qyminusx); WOLFSSL_LOCAL void fe_cmov_table(fe* r, fe* base, signed char b); #endif /* CURVED25519_ASM */ #endif /* !CURVE25519_SMALL || !ED25519_SMALL */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fips_test.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fips_test.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fips_test.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/fips_test.h 2024-08-03 07:30:01.000000000 +0000 @@ -51,39 +51,44 @@ enum FipsCastId { - FIPS_CAST_AES_CBC, - FIPS_CAST_AES_GCM, - FIPS_CAST_HMAC_SHA1, - FIPS_CAST_HMAC_SHA2_256, - FIPS_CAST_HMAC_SHA2_512, - FIPS_CAST_HMAC_SHA3_256, - FIPS_CAST_DRBG, - FIPS_CAST_RSA_SIGN_PKCS1v15, - FIPS_CAST_ECC_CDH, - FIPS_CAST_ECC_PRIMITIVE_Z, - FIPS_CAST_DH_PRIMITIVE_Z, - FIPS_CAST_ECDSA, - FIPS_CAST_KDF_TLS12, - FIPS_CAST_KDF_TLS13, - FIPS_CAST_KDF_SSH, - FIPS_CAST_COUNT + /* v5.2.0 & v5.2.1 + */ + FIPS_CAST_AES_CBC = 0, + FIPS_CAST_AES_GCM = 1, + FIPS_CAST_HMAC_SHA1 = 2, + FIPS_CAST_HMAC_SHA2_256 = 3, + FIPS_CAST_HMAC_SHA2_512 = 4, + FIPS_CAST_HMAC_SHA3_256 = 5, + FIPS_CAST_DRBG = 6, + FIPS_CAST_RSA_SIGN_PKCS1v15 = 7, + FIPS_CAST_ECC_CDH = 8, + FIPS_CAST_ECC_PRIMITIVE_Z = 9, + FIPS_CAST_DH_PRIMITIVE_Z = 10, + FIPS_CAST_ECDSA = 11, + FIPS_CAST_KDF_TLS12 = 12, + FIPS_CAST_KDF_TLS13 = 13, + FIPS_CAST_KDF_SSH = 14, + /* v6.0.0 + */ + FIPS_CAST_KDF_SRTP = 15, + FIPS_CAST_ED25519 = 16, + FIPS_CAST_ED448 = 17, + FIPS_CAST_PBKDF2 = 18, + FIPS_CAST_COUNT = 19 }; enum FipsCastStateId { - FIPS_CAST_STATE_INIT, - FIPS_CAST_STATE_PROCESSING, - FIPS_CAST_STATE_SUCCESS, - FIPS_CAST_STATE_FAILURE + FIPS_CAST_STATE_INIT = 0, + FIPS_CAST_STATE_PROCESSING = 1, + FIPS_CAST_STATE_SUCCESS = 2, + FIPS_CAST_STATE_FAILURE = 3 }; enum FipsModeId { - FIPS_MODE_INIT, - FIPS_MODE_NORMAL, - FIPS_MODE_DEGRADED, - FIPS_MODE_FAILED + FIPS_MODE_INIT = 0, + FIPS_MODE_NORMAL = 1, + FIPS_MODE_DEGRADED = 2, + FIPS_MODE_FAILED = 3 }; - /* FIPS failure callback */ typedef void(*wolfCrypt_fips_cb)(int ok, int err, const char* hash); @@ -92,7 +97,9 @@ /* Public get status functions */ WOLFSSL_API int wolfCrypt_GetStatus_fips(void); +WOLFSSL_API int wolfCrypt_GetMode_fips(void); WOLFSSL_API const char* wolfCrypt_GetCoreHash_fips(void); +WOLFSSL_API const char* wolfCrypt_GetRawComputedHash_fips(void); #ifdef HAVE_FORCE_FIPS_FAILURE /* Public function to force failure mode for operational testing */ @@ -105,6 +112,7 @@ WOLFSSL_API int wc_RunCast_fips(int type); WOLFSSL_API int wc_GetCastStatus_fips(int type); +WOLFSSL_API int wc_RunAllCast_fips(void); #ifdef __cplusplus } /* extern "C" */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_448.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_448.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_448.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_448.h 2024-08-03 07:30:01.000000000 +0000 @@ -64,7 +64,7 @@ WOLFSSL_LOCAL int ge448_double_scalarmult_vartime(ge448_p2 *r, const byte *a, const ge448_p2 *A, const byte *b); -WOLFSSL_LOCAL void ge448_scalarmult_base(ge448_p2* h, const byte* a); +WOLFSSL_LOCAL int ge448_scalarmult_base(ge448_p2* h, const byte* a); WOLFSSL_LOCAL void sc448_reduce(byte* b); WOLFSSL_LOCAL void sc448_muladd(byte* r, const byte* a, const byte* b, const byte* d); WOLFSSL_LOCAL void ge448_to_bytes(byte *s, const ge448_p2 *h); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_operations.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_operations.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_operations.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/ge_operations.h 2024-08-03 07:30:01.000000000 +0000 @@ -46,15 +46,15 @@ */ #ifdef ED25519_SMALL - typedef byte ge[F25519_SIZE]; + ALIGN16 typedef byte ge[F25519_SIZE]; #elif defined(CURVED25519_ASM_64BIT) - typedef sword64 ge[4]; + ALIGN16 typedef sword64 ge[4]; #elif defined(CURVED25519_ASM_32BIT) - typedef sword32 ge[8]; + ALIGN16 typedef sword32 ge[8]; #elif defined(CURVED25519_128BIT) - typedef sword64 ge[5]; + ALIGN16 typedef sword64 ge[5]; #else - typedef sword32 ge[10]; + ALIGN16 typedef sword32 ge[10]; #endif typedef struct { @@ -70,6 +70,9 @@ ge T; } ge_p3; +#ifdef __cplusplus + extern "C" { +#endif WOLFSSL_LOCAL int ge_compress_key(byte* out, const byte* xIn, const byte* yIn, word32 keySz); @@ -82,7 +85,11 @@ WOLFSSL_LOCAL void sc_muladd(byte* s, const byte* a, const byte* b, const byte* c); WOLFSSL_LOCAL void ge_tobytes(unsigned char *s,const ge_p2 *h); +#ifndef GE_P3_TOBYTES_IMPL +#define ge_p3_tobytes(s, h) ge_tobytes((s), (const ge_p2 *)(h)) +#else WOLFSSL_LOCAL void ge_p3_tobytes(unsigned char *s,const ge_p3 *h); +#endif #ifndef ED25519_SMALL @@ -105,9 +112,23 @@ ge Z; ge T2d; } ge_cached; - #endif /* !ED25519_SMALL */ +#ifdef CURVED25519_ASM +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_dbl(ge_p1p1 *r, const ge_p2 *p); +#define ge_p3_dbl(r, p) ge_p2_dbl((ge_p1p1 *)(r), (ge_p2 *)(p)) +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_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); +#endif + +#ifdef __cplusplus + } /* extern "C" */ +#endif + #endif /* HAVE_ED25519 */ #endif /* WOLF_CRYPT_GE_OPERATIONS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hash.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hash.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hash.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hash.h 2024-08-03 07:30:01.000000000 +0000 @@ -55,6 +55,9 @@ #if defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S) #include #endif +#ifdef WOLFSSL_SM3 + #include +#endif #ifdef __cplusplus @@ -76,7 +79,8 @@ sha384_mac, sha512_mac, rmd_mac, - blake2b_mac + blake2b_mac, + sm3_mac, }; enum wc_HashFlags { @@ -112,6 +116,9 @@ #ifdef WOLFSSL_SHA3 wc_Sha3 sha3; #endif + #ifdef WOLFSSL_SM3 + wc_Sm3 sm3; + #endif } wc_HashAlg; #endif /* !NO_HASH_WRAPPER */ @@ -132,6 +139,9 @@ #elif !defined(NO_SHA256) #define WC_MAX_DIGEST_SIZE WC_SHA256_DIGEST_SIZE #define WC_MAX_BLOCK_SIZE WC_SHA256_BLOCK_SIZE +#elif defined(WOLFSSL_SM3) + #define WC_MAX_DIGEST_SIZE WC_SM3_DIGEST_SIZE + #define WC_MAX_BLOCK_SIZE WC_SM3_BLOCK_SIZE #elif defined(WOLFSSL_SHA224) #define WC_MAX_DIGEST_SIZE WC_SHA224_DIGEST_SIZE #define WC_MAX_BLOCK_SIZE WC_SHA224_BLOCK_SIZE @@ -160,6 +170,9 @@ WOLFSSL_API int wc_Hash(enum wc_HashType hash_type, const byte* data, word32 data_len, byte* hash, word32 hash_len); +WOLFSSL_API int wc_Hash_ex(enum wc_HashType hash_type, + const byte* data, word32 data_len, + byte* hash, word32 hash_len, void* heap, int devId); /* generic hash operation wrappers */ WOLFSSL_API int wc_HashInit_ex(wc_HashAlg* hash, enum wc_HashType type, @@ -181,26 +194,36 @@ #ifndef NO_MD5 #include WOLFSSL_API int wc_Md5Hash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_Md5Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); #endif #ifndef NO_SHA #include WOLFSSL_API int wc_ShaHash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_ShaHash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); #endif #ifdef WOLFSSL_SHA224 #include WOLFSSL_API int wc_Sha224Hash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_Sha224Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); #endif /* defined(WOLFSSL_SHA224) */ #ifndef NO_SHA256 #include WOLFSSL_API int wc_Sha256Hash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_Sha256Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); #endif #ifdef WOLFSSL_SHA384 #include WOLFSSL_API int wc_Sha384Hash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_Sha384Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); #endif /* defined(WOLFSSL_SHA384) */ #ifdef WOLFSSL_SHA512 @@ -208,6 +231,12 @@ WOLFSSL_API int wc_Sha512Hash(const byte* data, word32 len, byte* hash); WOLFSSL_API int wc_Sha512_224Hash(const byte* data, word32 len, byte* hash); WOLFSSL_API int wc_Sha512_256Hash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_Sha512Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); +WOLFSSL_API int wc_Sha512_224Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); +WOLFSSL_API int wc_Sha512_256Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); #endif /* WOLFSSL_SHA512 */ #ifdef WOLFSSL_SHA3 @@ -216,16 +245,34 @@ WOLFSSL_API int wc_Sha3_256Hash(const byte* data, word32 len, byte* hash); WOLFSSL_API int wc_Sha3_384Hash(const byte* data, word32 len, byte* hash); WOLFSSL_API int wc_Sha3_512Hash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_Sha3_224Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); +WOLFSSL_API int wc_Sha3_256Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); +WOLFSSL_API int wc_Sha3_384Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); +WOLFSSL_API int wc_Sha3_512Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); #ifdef WOLFSSL_SHAKE128 WOLFSSL_API int wc_Shake128Hash(const byte* data, word32 len, byte* hash, word32 hashLen); +WOLFSSL_API int wc_Shake128Hash_ex(const byte* data, word32 len, byte* hash, + word32 hashLen, void* heap, int devId); #endif #ifdef WOLFSSL_SHAKE256 WOLFSSL_API int wc_Shake256Hash(const byte* data, word32 len, byte* hash, word32 hashLen); +WOLFSSL_API int wc_Shake256Hash_ex(const byte* data, word32 len, byte* hash, + word32 hashLen, void* heap, int devId); #endif #endif /* WOLFSSL_SHA3 */ +#ifdef WOLFSSL_SM3 +WOLFSSL_API int wc_Sm3Hash(const byte* data, word32 len, byte* hash); +WOLFSSL_API int wc_Sm3Hash_ex(const byte* data, word32 len, byte* hash, + void* heap, int devId); +#endif + #endif /* !NO_HASH_WRAPPER */ #if defined(WOLFSSL_HASH_KEEP) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/hmac.h 2024-08-03 07:30:01.000000000 +0000 @@ -30,16 +30,7 @@ #ifndef NO_HMAC -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -/* for fips @wc_fips */ - #include - #define WC_HMAC_BLOCK_SIZE HMAC_BLOCK_SIZE -#endif - - -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) #include #endif @@ -47,9 +38,17 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_hmac_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_HMAC_sanity(void); +#endif + +#if FIPS_VERSION3_GE(6,0,0) + #define FIPS_ALLOW_SHORT 1 +#endif + /* avoid redefinition of structs */ -#if !defined(HAVE_FIPS) || \ - (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(2,0,0) #ifdef WOLFSSL_ASYNC_CRYPT #include @@ -144,6 +143,9 @@ #ifdef WOLFSSL_SHA3 wc_Sha3 sha3; #endif +#ifdef WOLFSSL_SM3 + wc_Sm3 sm3; +#endif } wc_HmacHash; /* Hmac digest */ @@ -189,7 +191,10 @@ #endif /* HAVE_FIPS */ /* does init */ -WOLFSSL_API int wc_HmacSetKey(Hmac* hmac, int type, const byte* key, word32 keySz); +WOLFSSL_API int wc_HmacSetKey(Hmac* hmac, int type, const byte* key, + word32 keySz); +WOLFSSL_API int wc_HmacSetKey_ex(Hmac* hmac, int type, const byte* key, + word32 length, int allowFlag); WOLFSSL_API int wc_HmacUpdate(Hmac* hmac, const byte* in, word32 sz); WOLFSSL_API int wc_HmacFinal(Hmac* hmac, byte* out); #ifdef WOLFSSL_KCAPI_HMAC @@ -215,8 +220,16 @@ #ifdef HAVE_HKDF +WOLFSSL_API int wc_HKDF_Extract_ex(int type, const byte* salt, word32 saltSz, + const byte* inKey, word32 inKeySz, byte* out, + void* heap, int devId); + WOLFSSL_API int wc_HKDF_Extract(int type, const byte* salt, word32 saltSz, const byte* inKey, word32 inKeySz, byte* out); + +WOLFSSL_API int wc_HKDF_Expand_ex(int type, const byte* inKey, word32 inKeySz, + const byte* info, word32 infoSz, + byte* out, word32 outSz, void* heap, int devId); WOLFSSL_API int wc_HKDF_Expand(int type, const byte* inKey, word32 inKeySz, const byte* info, word32 infoSz, byte* out, word32 outSz); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/include.am 2024-08-03 07:30:01.000000000 +0000 @@ -75,9 +75,20 @@ wolfssl/wolfcrypt/cryptocb.h \ wolfssl/wolfcrypt/kyber.h \ wolfssl/wolfcrypt/wc_kyber.h \ - wolfssl/wolfcrypt/ext_kyber.h + wolfssl/wolfcrypt/ext_kyber.h \ + wolfssl/wolfcrypt/sm2.h \ + wolfssl/wolfcrypt/sm3.h \ + wolfssl/wolfcrypt/sm4.h \ + wolfssl/wolfcrypt/lms.h \ + wolfssl/wolfcrypt/wc_lms.h \ + wolfssl/wolfcrypt/ext_lms.h \ + wolfssl/wolfcrypt/xmss.h \ + wolfssl/wolfcrypt/wc_xmss.h \ + wolfssl/wolfcrypt/ext_xmss.h noinst_HEADERS+= \ + wolfssl/wolfcrypt/port/aria/aria-crypt.h \ + wolfssl/wolfcrypt/port/aria/aria-cryptocb.h \ wolfssl/wolfcrypt/port/pic32/pic32mz-crypt.h \ wolfssl/wolfcrypt/port/ti/ti-hash.h \ wolfssl/wolfcrypt/port/ti/ti-ccm.h \ @@ -97,9 +108,11 @@ wolfssl/wolfcrypt/port/st/stm32.h \ wolfssl/wolfcrypt/port/st/stsafe.h \ wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h \ + wolfssl/wolfcrypt/port/Espressif/esp-sdk-lib.h \ wolfssl/wolfcrypt/port/arm/cryptoCell.h \ wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h \ - wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h \ + wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h \ + wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-types.h \ wolfssl/wolfcrypt/port/Renesas/renesas_sync.h \ wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h \ wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h \ @@ -127,6 +140,15 @@ nobase_include_HEADERS+= wolfssl/wolfcrypt/port/devcrypto/wc_devcrypto.h endif +if BUILD_ARIA +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/aria/aria-crypt.h +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/aria/aria-cryptocb.h +endif + +if BUILD_LIBOQS +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/liboqs/liboqs.h +endif + if BUILD_ASYNCCRYPT nobase_include_HEADERS+= wolfssl/wolfcrypt/async.h endif @@ -201,3 +223,15 @@ if BUILD_MAXQ10XX nobase_include_HEADERS+= wolfssl/wolfcrypt/port/maxim/maxq10xx.h endif + +if BUILD_AUTOSAR +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/autosar/Csm.h +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/autosar/CryIf.h +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/autosar/Crypto.h +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/autosar/StandardTypes.h +endif + +if BUILD_RISCV_ASM +nobase_include_HEADERS+= wolfssl/wolfcrypt/port/riscv/riscv-64-asm.h +endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/integer.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/integer.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/integer.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/integer.h 2024-08-03 07:30:01.000000000 +0000 @@ -69,7 +69,7 @@ #else /* C on the other hand doesn't care */ -#define OPT_CAST(x) +#define OPT_CAST(x) /* null expansion */ #endif /* __cplusplus */ @@ -206,7 +206,7 @@ #define NEW_MP_INT_SIZE(name, bits, heap, type) \ XMEMSET(name, 0, sizeof(mp_int)) /* Dispose of static mp_int. */ -#define FREE_MP_INT_SIZE(name, heap, type) +#define FREE_MP_INT_SIZE(name, heap, type) WC_DO_NOTHING /* Initialize an mp_int. */ #define INIT_MP_INT_SIZE(name, bits) \ mp_init(name) @@ -313,6 +313,7 @@ MP_API int mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c); MP_API int mp_to_unsigned_bin_at_pos(int x, mp_int *t, unsigned char *b); MP_API int mp_to_unsigned_bin (mp_int * a, unsigned char *b); +#define mp_to_unsigned_bin_len_ct mp_to_unsigned_bin_len MP_API int mp_to_unsigned_bin_len(mp_int * a, unsigned char *b, int c); MP_API int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y); MP_API int mp_exptmod_ex (mp_int * G, mp_int * X, int digits, mp_int * P, @@ -329,6 +330,8 @@ MP_API void mp_zero (mp_int * a); MP_API void mp_clamp (mp_int * a); MP_API int mp_exch (mp_int * a, mp_int * b); +MP_API int mp_cond_swap_ct_ex (mp_int * a, mp_int * b, int c, int m, + mp_int * t); MP_API int mp_cond_swap_ct (mp_int * a, mp_int * b, int c, int m); MP_API void mp_rshd (mp_int * a, int b); MP_API void mp_rshb (mp_int * a, int b); @@ -341,6 +344,7 @@ MP_API int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c); MP_API int mp_cmp_mag (mp_int * a, mp_int * b); MP_API int mp_cmp (mp_int * a, mp_int * b); +#define mp_cmp_ct(a, b, n) mp_cmp(a, b) MP_API int mp_cmp_d(mp_int * a, mp_digit b); MP_API int mp_set (mp_int * a, mp_digit b); MP_API int mp_is_bit_set (mp_int * a, mp_digit b); @@ -363,6 +367,7 @@ int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho); MP_API int mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho); #define mp_montgomery_reduce_ex(x, n, rho, ct) mp_montgomery_reduce (x, n, rho) +#define mp_montgomery_reduce_ct(x, n, rho) mp_montgomery_reduce (x, n, rho) MP_API void mp_dr_setup(mp_int *a, mp_digit *d); MP_API int mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k); MP_API int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); @@ -406,7 +411,7 @@ #ifdef WOLFSSL_DEBUG_MATH MP_API void mp_dump(const char* desc, mp_int* a, byte verbose); #else - #define mp_dump(desc, a, verbose) + #define mp_dump(desc, a, verbose) WC_DO_NOTHING #endif #if defined(HAVE_ECC) || defined(WOLFSSL_KEY_GEN) || !defined(NO_RSA) || \ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kdf.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kdf.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kdf.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kdf.h 2024-08-03 07:30:01.000000000 +0000 @@ -39,6 +39,11 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_kdf_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_KDF_sanity(void); +#endif + enum max_prf { #ifdef HAVE_FFDHE_8192 MAX_PRF_HALF = 516, /* Maximum half secret len */ @@ -76,9 +81,20 @@ MAX_TLS13_HKDF_LABEL_SZ = 47 + WC_MAX_DIGEST_SIZE }; +WOLFSSL_API int wc_Tls13_HKDF_Extract_ex(byte* prk, const byte* salt, + word32 saltLen, byte* ikm, word32 ikmLen, int digest, + void* heap, int devId); + WOLFSSL_API int wc_Tls13_HKDF_Extract(byte* prk, const byte* salt, word32 saltLen, byte* ikm, word32 ikmLen, int digest); +WOLFSSL_API int wc_Tls13_HKDF_Expand_Label_ex(byte* okm, word32 okmLen, + const byte* prk, word32 prkLen, + const byte* protocol, word32 protocolLen, + const byte* label, word32 labelLen, + const byte* info, word32 infoLen, + int digest, void* heap, int devId); + WOLFSSL_API int wc_Tls13_HKDF_Expand_Label(byte* okm, word32 okmLen, const byte* prk, word32 prkLen, const byte* protocol, word32 protocolLen, @@ -105,6 +121,56 @@ #endif /* WOLFSSL_WOLFSSH */ +#ifdef WC_SRTP_KDF +/* Label values for purpose. */ +#define WC_SRTP_LABEL_ENCRYPTION 0x00 +#define WC_SRTP_LABEL_MSG_AUTH 0x01 +#define WC_SRTP_LABEL_SALT 0x02 +#define WC_SRTCP_LABEL_ENCRYPTION 0x03 +#define WC_SRTCP_LABEL_MSG_AUTH 0x04 +#define WC_SRTCP_LABEL_SALT 0x05 +#define WC_SRTP_LABEL_HDR_ENCRYPTION 0x06 +#define WC_SRTP_LABEL_HDR_SALT 0x07 + +/* Length of index for SRTP KDF. */ +#define WC_SRTP_INDEX_LEN 6 +/* Length of index for SRTCP KDF. */ +#define WC_SRTCP_INDEX_LEN 4 + +/* Indicators */ +enum { + WC_SRTCP_32BIT_IDX = 0, + WC_SRTCP_48BIT_IDX = 1, +}; + +/* Maximum length of salt that can be used with SRTP/SRTCP. */ +#define WC_SRTP_MAX_SALT 14 + +WOLFSSL_API int wc_SRTP_KDF(const byte* key, word32 keySz, const byte* salt, + word32 saltSz, int kdrIdx, const byte* index, byte* key1, word32 key1Sz, + byte* key2, word32 key2Sz, byte* key3, word32 key3Sz); +WOLFSSL_API int wc_SRTCP_KDF(const byte* key, word32 keySz, const byte* salt, + word32 saltSz, int kdrIdx, const byte* index, byte* key1, word32 key1Sz, + byte* key2, word32 key2Sz, byte* key3, word32 key3Sz); +WOLFSSL_API int wc_SRTCP_KDF_ex(const byte* key, word32 keySz, const byte* salt, + word32 saltSz, int kdrIdx, const byte* index, byte* key1, word32 key1Sz, + byte* key2, word32 key2Sz, byte* key3, word32 key3Sz, int idxLenIndicator); +WOLFSSL_API int wc_SRTP_KDF_label(const byte* key, word32 keySz, + const byte* salt, word32 saltSz, int kdrIdx, const byte* index, byte label, + byte* outKey, word32 outKeySz); +WOLFSSL_API int wc_SRTCP_KDF_label(const byte* key, word32 keySz, + const byte* salt, word32 saltSz, int kdrIdx, const byte* index, byte label, + byte* outKey, word32 outKeySz); + +WOLFSSL_API int wc_SRTP_KDF_kdr_to_idx(word32 kdr); + +#endif /* WC_SRTP_KDF */ + +#ifdef WC_KDF_NIST_SP_800_56C +WOLFSSL_API int wc_KDA_KDF_onestep(const byte* z, word32 zSz, + const byte* fixedInfo, word32 fixedInfoSz, word32 derivedSecretSz, + enum wc_HashType hashType, byte* output, word32 outputSz); +#endif #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kyber.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kyber.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kyber.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/kyber.h 2024-08-03 07:30:01.000000000 +0000 @@ -49,12 +49,12 @@ /* Size of a polynomial vector based on dimensions. */ -#define KYBER_POLY_VEC_SZ(k) (k * KYBER_POLY_SIZE) +#define KYBER_POLY_VEC_SZ(k) ((k) * KYBER_POLY_SIZE) /* Size of a compressed polynomial based on bits per coefficient. */ -#define KYBER_POLY_COMPRESSED_SZ(b) (b * (KYBER_N / 8)) +#define KYBER_POLY_COMPRESSED_SZ(b) ((b) * (KYBER_N / 8)) /* Size of a compressed vector polynomial based on dimensions and bits per * coefficient. */ -#define KYBER_POLY_VEC_COMPRESSED_SZ(k, b) (k * (b * (KYBER_N / 8))) +#define KYBER_POLY_VEC_COMPRESSED_SZ(k, b) ((k) * ((b) * (KYBER_N / 8))) /* Kyber-512 parameters */ @@ -201,10 +201,10 @@ WOLFSSL_API int wc_KyberKey_Decapsulate(KyberKey* key, unsigned char* ss, const unsigned char* ct, word32 len); -WOLFSSL_API int wc_KyberKey_DecodePrivateKey(KyberKey* key, unsigned char* in, - word32 len); -WOLFSSL_API int wc_KyberKey_DecodePublicKey(KyberKey* key, unsigned char* in, - word32 len); +WOLFSSL_API int wc_KyberKey_DecodePrivateKey(KyberKey* key, + const unsigned char* in, word32 len); +WOLFSSL_API int wc_KyberKey_DecodePublicKey(KyberKey* key, + const unsigned char* in, word32 len); WOLFSSL_API int wc_KyberKey_PrivateKeySize(KyberKey* key, word32* len); WOLFSSL_API int wc_KyberKey_PublicKeySize(KyberKey* key, word32* len); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/lms.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/lms.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/lms.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/lms.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,169 @@ +/* lms.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/*! + \file wolfssl/wolfcrypt/lms.h + */ + +#ifndef WOLF_CRYPT_LMS_H +#define WOLF_CRYPT_LMS_H + +#include +#include + +#ifdef WOLFSSL_HAVE_LMS + +typedef struct LmsKey LmsKey; + +/* Private key write and read callbacks. */ +typedef int (*wc_lms_write_private_key_cb)(const byte * priv, word32 privSz, void *context); +typedef int (*wc_lms_read_private_key_cb)(byte * priv, word32 privSz, void *context); + +/* Return codes returned by private key callbacks. */ +enum wc_LmsRc { + WC_LMS_RC_NONE, + WC_LMS_RC_BAD_ARG, /* Bad arg in read or write callback. */ + WC_LMS_RC_WRITE_FAIL, /* Write or update private key failed. */ + WC_LMS_RC_READ_FAIL, /* Read private key failed. */ + WC_LMS_RC_SAVED_TO_NV_MEMORY, /* Wrote private key to nonvolatile storage. */ + WC_LMS_RC_READ_TO_MEMORY /* Read private key from storage. */ +}; + +/* LMS/HSS signatures are defined by 3 parameters: + * levels: number of levels of Merkle trees. + * height: height of an individual Merkle tree. + * winternitz: number of bits from hash used in a Winternitz chain. + * + * The acceptable parameter values are those in RFC8554: + * levels = {1..8} + * height = {5, 10, 15, 20, 25} + * winternitz = {1, 2, 4, 8} + * + * The number of available signatures is: + * N = 2 ** (levels * height) + * + * Signature sizes are determined by levels and winternitz + * parameters primarily, and height to a lesser extent: + * - Larger levels values increase signature size significantly. + * - Larger height values increase signature size moderately. + * - Larger winternitz values will reduce the signature size, at + * the expense of longer key generation and sign/verify times. + * + * Key generation time is strongly determined by the height of + * the first level tree. A 3 level, 5 height tree is much faster + * than 1 level, 15 height at initial key gen, even if the number + * of available signatures is the same. + * */ + +/* Predefined LMS/HSS parameter sets for convenience. + * + * Not predefining many sets with Winternitz=1, because the signatures + * will be large. */ +enum wc_LmsParm { + WC_LMS_PARM_NONE = 0, + WC_LMS_PARM_L1_H5_W1 = 1, + WC_LMS_PARM_L1_H5_W2 = 2, + WC_LMS_PARM_L1_H5_W4 = 3, + WC_LMS_PARM_L1_H5_W8 = 4, + WC_LMS_PARM_L1_H10_W2 = 5, + WC_LMS_PARM_L1_H10_W4 = 6, + WC_LMS_PARM_L1_H10_W8 = 7, + WC_LMS_PARM_L1_H15_W2 = 8, + WC_LMS_PARM_L1_H15_W4 = 9, + WC_LMS_PARM_L1_H15_W8 = 10, + WC_LMS_PARM_L1_H20_W2 = 11, + WC_LMS_PARM_L1_H20_W4 = 12, + WC_LMS_PARM_L1_H20_W8 = 13, + WC_LMS_PARM_L2_H5_W2 = 14, + WC_LMS_PARM_L2_H5_W4 = 15, + WC_LMS_PARM_L2_H5_W8 = 16, + WC_LMS_PARM_L2_H10_W2 = 17, + WC_LMS_PARM_L2_H10_W4 = 18, + WC_LMS_PARM_L2_H10_W8 = 19, + WC_LMS_PARM_L2_H15_W2 = 20, + WC_LMS_PARM_L2_H15_W4 = 21, + WC_LMS_PARM_L2_H15_W8 = 22, + WC_LMS_PARM_L2_H20_W2 = 23, + WC_LMS_PARM_L2_H20_W4 = 24, + WC_LMS_PARM_L2_H20_W8 = 25, + WC_LMS_PARM_L3_H5_W2 = 26, + WC_LMS_PARM_L3_H5_W4 = 27, + WC_LMS_PARM_L3_H5_W8 = 28, + WC_LMS_PARM_L3_H10_W4 = 29, + WC_LMS_PARM_L3_H10_W8 = 30, + WC_LMS_PARM_L4_H5_W2 = 31, + WC_LMS_PARM_L4_H5_W4 = 32, + WC_LMS_PARM_L4_H5_W8 = 33, + WC_LMS_PARM_L4_H10_W4 = 34, + WC_LMS_PARM_L4_H10_W8 = 35, +}; + +/* enum wc_LmsState is to help track the state of an LMS/HSS Key. */ +enum wc_LmsState { + WC_LMS_STATE_FREED, /* Key has been freed from memory. */ + WC_LMS_STATE_INITED, /* Key has been inited, ready to set params.*/ + WC_LMS_STATE_PARMSET, /* Params are set, ready to MakeKey or Reload. */ + WC_LMS_STATE_OK, /* Able to sign signatures and verify. */ + WC_LMS_STATE_VERIFYONLY, /* A public only LmsKey. */ + WC_LMS_STATE_BAD, /* Can't guarantee key's state. */ + WC_LMS_STATE_NOSIGS /* Signatures exhausted. */ +}; + +#ifdef __cplusplus + extern "C" { +#endif +WOLFSSL_API int wc_LmsKey_Init(LmsKey * key, void * heap, int devId); +WOLFSSL_API int wc_LmsKey_SetLmsParm(LmsKey * key, enum wc_LmsParm lmsParm); +WOLFSSL_API int wc_LmsKey_SetParameters(LmsKey * key, int levels, + int height, int winternitz); +WOLFSSL_API int wc_LmsKey_GetParameters(const LmsKey * key, int * levels, + int * height, int * winternitz); +#ifndef WOLFSSL_LMS_VERIFY_ONLY +WOLFSSL_API int wc_LmsKey_SetWriteCb(LmsKey * key, + wc_lms_write_private_key_cb write_cb); +WOLFSSL_API int wc_LmsKey_SetReadCb(LmsKey * key, + wc_lms_read_private_key_cb read_cb); +WOLFSSL_API int wc_LmsKey_SetContext(LmsKey * key, void * context); +WOLFSSL_API int wc_LmsKey_MakeKey(LmsKey * key, WC_RNG * rng); +WOLFSSL_API int wc_LmsKey_Reload(LmsKey * key); +WOLFSSL_API int wc_LmsKey_GetPrivLen(const LmsKey * key, word32 * len); +WOLFSSL_API int wc_LmsKey_Sign(LmsKey * key, byte * sig, word32 * sigSz, + const byte * msg, int msgSz); +WOLFSSL_API int wc_LmsKey_SigsLeft(LmsKey * key); +#endif /* ifndef WOLFSSL_LMS_VERIFY_ONLY */ +WOLFSSL_API void wc_LmsKey_Free(LmsKey * key); +WOLFSSL_API int wc_LmsKey_GetSigLen(const LmsKey * key, word32 * len); +WOLFSSL_API int wc_LmsKey_GetPubLen(const LmsKey * key, word32 * len); +WOLFSSL_API int wc_LmsKey_ExportPub(LmsKey * keyDst, const LmsKey * keySrc); +WOLFSSL_API int wc_LmsKey_ExportPubRaw(const LmsKey * key, byte * out, + word32 * outLen); +WOLFSSL_API int wc_LmsKey_ImportPubRaw(LmsKey * key, const byte * in, + word32 inLen); +WOLFSSL_API int wc_LmsKey_Verify(LmsKey * key, const byte * sig, word32 sigSz, + const byte * msg, int msgSz); +WOLFSSL_API const char * wc_LmsKey_ParmToStr(enum wc_LmsParm lmsParm); +WOLFSSL_API const char * wc_LmsKey_RcToStr(enum wc_LmsRc lmsRc); +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFSSL_HAVE_LMS */ +#endif /* WOLF_CRYPT_LMS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/logging.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/logging.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/logging.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/logging.h 2024-08-03 07:30:01.000000000 +0000 @@ -89,6 +89,11 @@ }; #endif +#if defined(ARDUINO) +/* implemented in Arduino wolfssl.h */ +extern WOLFSSL_API int wolfSSL_Arduino_Serial_Print(const char* const s); +#endif /* ARDUINO */ + typedef void (*wolfSSL_Logging_cb)(const int logLevel, const char *const logMessage); @@ -100,6 +105,8 @@ /* turn logging off */ WOLFSSL_API void wolfSSL_Debugging_OFF(void); +WOLFSSL_API void wolfSSL_SetLoggingPrefix(const char* prefix); + #ifdef HAVE_WC_INTROSPECTION WOLFSSL_API const char *wolfSSL_configure_args(void); WOLFSSL_API const char *wolfSSL_global_cflags(void); @@ -107,11 +114,12 @@ #if (defined(OPENSSL_EXTRA) && !defined(_WIN32) && \ - !defined(NO_ERROR_QUEUE)) || defined(DEBUG_WOLFSSL_VERBOSE) + !defined(NO_ERROR_QUEUE)) || defined(DEBUG_WOLFSSL_VERBOSE) \ + || defined(HAVE_MEMCACHED) #define WOLFSSL_HAVE_ERROR_QUEUE #endif -#if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) +#if defined(OPENSSL_EXTRA) || defined(DEBUG_WOLFSSL_VERBOSE) || defined(HAVE_MEMCACHED) WOLFSSL_LOCAL int wc_LoggingInit(void); WOLFSSL_LOCAL int wc_LoggingCleanup(void); WOLFSSL_LOCAL int wc_AddErrorNode(int error, int line, char* buf, @@ -133,7 +141,7 @@ WOLFSSL_API void wc_ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u), void *u); #endif -#endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE */ +#endif /* OPENSSL_EXTRA || DEBUG_WOLFSSL_VERBOSE || HAVE_MEMCACHED */ #ifdef WOLFSSL_FUNC_TIME /* WARNING: This code is only to be used for debugging performance. @@ -144,9 +152,9 @@ WOLFSSL_API void WOLFSSL_END(int funcNum); WOLFSSL_API void WOLFSSL_TIME(int count); #else - #define WOLFSSL_START(n) - #define WOLFSSL_END(n) - #define WOLFSSL_TIME(n) + #define WOLFSSL_START(n) WC_DO_NOTHING + #define WOLFSSL_END(n) WC_DO_NOTHING + #define WOLFSSL_TIME(n) WC_DO_NOTHING #endif #if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_DEBUG_ERRORS_ONLY) @@ -166,25 +174,44 @@ #define WOLFSSL_STUB(m) \ WOLFSSL_MSG(WOLFSSL_LOG_CAT(wolfSSL Stub, m, not implemented)) WOLFSSL_API int WOLFSSL_IS_DEBUG_ON(void); -#if !defined(_WIN32) && defined(XVSNPRINTF) +#if defined(XVSNPRINTF) WOLFSSL_API void WOLFSSL_MSG_EX(const char* fmt, ...); #define HAVE_WOLFSSL_MSG_EX #else - #define WOLFSSL_MSG_EX(...) do{} while(0) + #define WOLFSSL_MSG_EX(...) WC_DO_NOTHING #endif WOLFSSL_API void WOLFSSL_MSG(const char* msg); +#ifdef WOLFSSL_DEBUG_CODEPOINTS + WOLFSSL_API void WOLFSSL_MSG2( + const char *file, int line, const char* msg); + WOLFSSL_API void WOLFSSL_ENTER2( + const char *file, int line, const char* msg); + WOLFSSL_API void WOLFSSL_LEAVE2( + const char *file, int line, const char* msg, int ret); + #define WOLFSSL_MSG(msg) WOLFSSL_MSG2(__FILE__, __LINE__, msg) + #define WOLFSSL_ENTER(msg) WOLFSSL_ENTER2(__FILE__, __LINE__, msg) + #define WOLFSSL_LEAVE(msg, ret) WOLFSSL_LEAVE2(__FILE__, __LINE__, msg, ret) + #ifdef XVSNPRINTF + WOLFSSL_API void WOLFSSL_MSG_EX2( + const char *file, int line, const char* fmt, ...); + #define WOLFSSL_MSG_EX(fmt, args...) \ + WOLFSSL_MSG_EX2(__FILE__, __LINE__, fmt, ## args) + #else + #define WOLFSSL_MSG_EX2(...) WC_DO_NOTHING + #endif +#endif WOLFSSL_API void WOLFSSL_BUFFER(const byte* buffer, word32 length); #else - #define WOLFSSL_ENTER(m) - #define WOLFSSL_LEAVE(m, r) - #define WOLFSSL_STUB(m) + #define WOLFSSL_ENTER(m) WC_DO_NOTHING + #define WOLFSSL_LEAVE(m, r) WC_DO_NOTHING + #define WOLFSSL_STUB(m) WC_DO_NOTHING #define WOLFSSL_IS_DEBUG_ON() 0 - #define WOLFSSL_MSG_EX(...) do{} while(0) - #define WOLFSSL_MSG(m) do{} while(0) - #define WOLFSSL_BUFFER(b, l) do{} while(0) + #define WOLFSSL_MSG_EX(...) WC_DO_NOTHING + #define WOLFSSL_MSG(m) WC_DO_NOTHING + #define WOLFSSL_BUFFER(b, l) WC_DO_NOTHING #endif /* DEBUG_WOLFSSL && !WOLFSSL_DEBUG_ERRORS_ONLY */ @@ -202,8 +229,8 @@ WOLFSSL_API void WOLFSSL_ERROR_MSG(const char* msg); #else - #define WOLFSSL_ERROR(e) - #define WOLFSSL_ERROR_MSG(m) + #define WOLFSSL_ERROR(e) (void)(e) + #define WOLFSSL_ERROR_MSG(m) (void)(m) #endif /* DEBUG_WOLFSSL | OPENSSL_ALL || WOLFSSL_NGINX || WOLFSSL_HAPROXY || OPENSSL_EXTRA */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/mem_track.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/mem_track.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/mem_track.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/mem_track.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,8 +24,6 @@ #ifndef WOLFSSL_MEM_TRACK_H #define WOLFSSL_MEM_TRACK_H -#if defined(USE_WOLFSSL_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY) - /* The memory tracker overrides the wolfSSL memory callback system and uses a * static to track the total, peak and currently allocated bytes. * @@ -61,7 +59,9 @@ */ #include "wolfssl/wolfcrypt/settings.h" +#include "wolfssl/wolfcrypt/types.h" #include "wolfssl/wolfcrypt/logging.h" +#include "wolfssl/wolfcrypt/error-crypt.h" #include "wolfssl/wolfcrypt/memory.h" #if defined(WOLFSSL_TRACK_MEMORY) || defined(HAVE_STACK_SIZE) || \ @@ -77,14 +77,15 @@ #endif #endif -#if defined(WOLFSSL_TRACK_MEMORY) - #define DO_MEM_STATS - #if (defined(__linux__) && !defined(WOLFSSL_LINUXKM)) || defined(__MACH__) - #define DO_MEM_LIST - #endif +/* Track Memory */ +#if defined(WOLFSSL_TRACK_MEMORY) && defined(USE_WOLFSSL_MEMORY) && \ + !defined(WOLFSSL_STATIC_MEMORY) + +#define DO_MEM_STATS +#if (defined(__linux__) && !defined(WOLFSSL_LINUXKM)) || defined(__MACH__) + #define DO_MEM_LIST #endif - typedef struct memoryStats { long totalAllocs; /* number of allocations */ long totalDeallocs; /* number of deallocations */ @@ -93,12 +94,12 @@ long currentBytes; /* total current bytes in use */ #ifdef WOLFSSL_TRACK_MEMORY_VERBOSE long peakAllocsTripOdometer; /* peak number of concurrent allocations, - * subject to reset by - * wolfCrypt_heap_peak_checkpoint() - */ + * subject to reset by + * wolfCrypt_heap_peak_checkpoint() + */ long peakBytesTripOdometer; /* peak concurrent bytes, subject to reset - * by wolfCrypt_heap_peak_checkpoint() - */ + * by wolfCrypt_heap_peak_checkpoint() + */ #endif } memoryStats; @@ -119,7 +120,8 @@ typedef struct memoryTrack { union { memHint hint; - byte alignit[sizeof(memHint) + ((16-1) & ~(16-1))]; /* make sure we have strong alignment */ + /* make sure we have strong alignment */ + byte alignit[sizeof(memHint) + ((16-1) & ~(16-1))]; } u; } memoryTrack; @@ -132,7 +134,7 @@ } memoryList; #endif -#if defined(WOLFSSL_TRACK_MEMORY) + static memoryStats ourMemStats; #ifdef DO_MEM_LIST @@ -140,7 +142,6 @@ static memoryList ourMemList; static pthread_mutex_t memLock = PTHREAD_MUTEX_INITIALIZER; #endif -#endif #ifdef WOLFSSL_DEBUG_MEMORY static WC_INLINE void* TrackMalloc(size_t sz, const char* func, @@ -169,31 +170,41 @@ #ifdef WOLFSSL_DEBUG_MEMORY #ifdef WOLFSSL_DEBUG_MEMORY_PRINT - wc_mem_printf("Alloc: %p -> %u at %s:%d\n", header->thisMemory, (word32)sz, func, line); + wc_mem_printf("Alloc: %p -> %u at %s:%d\n", + header->thisMemory, (word32)sz, func, line); #else (void)func; (void)line; #endif #endif +#if defined(DO_MEM_LIST) || defined(DO_MEM_STATS) + if (pthread_mutex_lock(&memLock) == 0) + { +#endif #ifdef DO_MEM_STATS - ourMemStats.totalAllocs++; - ourMemStats.totalBytes += sz; - ourMemStats.currentBytes += sz; - #ifdef WOLFSSL_TRACK_MEMORY_VERBOSE - if (ourMemStats.peakAllocsTripOdometer < ourMemStats.totalAllocs - ourMemStats.totalDeallocs) - ourMemStats.peakAllocsTripOdometer = ourMemStats.totalAllocs - ourMemStats.totalDeallocs; - if (ourMemStats.peakBytesTripOdometer < ourMemStats.currentBytes) { - ourMemStats.peakBytesTripOdometer = ourMemStats.currentBytes; - #endif - if (ourMemStats.currentBytes > ourMemStats.peakBytes) - ourMemStats.peakBytes = ourMemStats.currentBytes; + ourMemStats.totalAllocs++; + ourMemStats.totalBytes += sz; + ourMemStats.currentBytes += sz; #ifdef WOLFSSL_TRACK_MEMORY_VERBOSE - } + if (ourMemStats.peakAllocsTripOdometer < ourMemStats.totalAllocs - + ourMemStats.totalDeallocs) { + ourMemStats.peakAllocsTripOdometer = ourMemStats.totalAllocs - + ourMemStats.totalDeallocs; + } + if (ourMemStats.peakBytesTripOdometer < ourMemStats.currentBytes) #endif -#endif + { + #ifdef WOLFSSL_TRACK_MEMORY_VERBOSE + ourMemStats.peakBytesTripOdometer = ourMemStats.currentBytes; + #endif + if (ourMemStats.currentBytes > ourMemStats.peakBytes) + ourMemStats.peakBytes = ourMemStats.currentBytes; + } + +#endif /* DO_MEM_STATS */ + #ifdef DO_MEM_LIST - if (pthread_mutex_lock(&memLock) == 0) { #ifdef WOLFSSL_DEBUG_MEMORY header->func = func; header->line = line; @@ -211,10 +222,11 @@ } ourMemList.tail = header; /* add to the end either way */ ourMemList.count++; - +#endif +#if defined(DO_MEM_LIST) || defined(DO_MEM_STATS) pthread_mutex_unlock(&memLock); } -#endif +#endif /* DO_MEM_LIST */ return header->thisMemory; } @@ -238,7 +250,7 @@ header = &mt->u.hint; sz = header->thisSize; -#ifdef DO_MEM_LIST +#if defined(DO_MEM_LIST) || defined(DO_MEM_STATS) if (pthread_mutex_lock(&memLock) == 0) { #endif @@ -270,7 +282,9 @@ prev->next = next; } ourMemList.count--; +#endif +#if defined(DO_MEM_LIST) || defined(DO_MEM_STATS) pthread_mutex_unlock(&memLock); } #endif @@ -332,7 +346,6 @@ return ret; } -#ifdef WOLFSSL_TRACK_MEMORY static wolfSSL_Malloc_cb mfDefault = NULL; static wolfSSL_Free_cb ffDefault = NULL; static wolfSSL_Realloc_cb rfDefault = NULL; @@ -353,27 +366,26 @@ #ifdef DO_MEM_LIST if (pthread_mutex_lock(&memLock) == 0) - { -#endif - -#ifdef DO_MEM_STATS - ourMemStats.totalAllocs = 0; - ourMemStats.totalDeallocs = 0; - ourMemStats.totalBytes = 0; - ourMemStats.peakBytes = 0; - ourMemStats.currentBytes = 0; -#ifdef WOLFSSL_TRACK_MEMORY_VERBOSE - ourMemStats.peakAllocsTripOdometer = 0; - ourMemStats.peakBytesTripOdometer = 0; -#endif #endif + { + #ifdef DO_MEM_STATS + ourMemStats.totalAllocs = 0; + ourMemStats.totalDeallocs = 0; + ourMemStats.totalBytes = 0; + ourMemStats.peakBytes = 0; + ourMemStats.currentBytes = 0; + #ifdef WOLFSSL_TRACK_MEMORY_VERBOSE + ourMemStats.peakAllocsTripOdometer = 0; + ourMemStats.peakBytesTripOdometer = 0; + #endif + #endif /* DO_MEM_STATS */ -#ifdef DO_MEM_LIST - XMEMSET(&ourMemList, 0, sizeof(ourMemList)); + #ifdef DO_MEM_LIST + XMEMSET(&ourMemList, 0, sizeof(ourMemList)); - pthread_mutex_unlock(&memLock); + pthread_mutex_unlock(&memLock); + #endif } -#endif return ret; } @@ -382,36 +394,38 @@ { #ifdef DO_MEM_LIST if (pthread_mutex_lock(&memLock) == 0) - { -#endif - -#ifdef DO_MEM_STATS - wc_mem_printf("total Allocs = %9ld\n", ourMemStats.totalAllocs); - wc_mem_printf("total Deallocs = %9ld\n", ourMemStats.totalDeallocs); - wc_mem_printf("total Bytes = %9ld\n", ourMemStats.totalBytes); - wc_mem_printf("peak Bytes = %9ld\n", ourMemStats.peakBytes); - wc_mem_printf("current Bytes = %9ld\n", ourMemStats.currentBytes); #endif + { + #ifdef DO_MEM_STATS + wc_mem_printf("total Allocs = %9ld\n", ourMemStats.totalAllocs); + wc_mem_printf("total Deallocs = %9ld\n", ourMemStats.totalDeallocs); + wc_mem_printf("total Bytes = %9ld\n", ourMemStats.totalBytes); + wc_mem_printf("peak Bytes = %9ld\n", ourMemStats.peakBytes); + wc_mem_printf("current Bytes = %9ld\n", ourMemStats.currentBytes); + #endif -#ifdef DO_MEM_LIST - if (ourMemList.count > 0) { - /* print list of allocations */ - memHint* header; - for (header = ourMemList.head; header != NULL; header = header->next) { - #ifdef WOLFSSL_DEBUG_MEMORY - wc_mem_printf("Leak: Ptr %p, Size %u, Func %s, Line %d\n", - (byte*)header + sizeof(memHint), (unsigned int)header->thisSize, - header->func, header->line); -#else - wc_mem_printf("Leak: Ptr %p, Size %u\n", - (byte*)header + sizeof(memHint), (unsigned int)header->thisSize); -#endif + #ifdef DO_MEM_LIST + if (ourMemList.count > 0) { + /* print list of allocations */ + memHint* header; + for (header = ourMemList.head; + header != NULL; + header = header->next) { + #ifdef WOLFSSL_DEBUG_MEMORY + wc_mem_printf("Leak: Ptr %p, Size %u, Func %s, Line %d\n", + (byte*)header + sizeof(memHint), + (unsigned int)header->thisSize, header->func, header->line); + #else + wc_mem_printf("Leak: Ptr %p, Size %u\n", + (byte*)header + sizeof(memHint), + (unsigned int)header->thisSize); + #endif + } } - } - pthread_mutex_unlock(&memLock); + pthread_mutex_unlock(&memLock); + #endif } -#endif } static WC_INLINE int CleanupMemoryTracker(void) @@ -419,9 +433,8 @@ /* restore default allocators */ return wolfSSL_SetAllocators(mfDefault, ffDefault, rfDefault); } -#endif /* WOLFSSL_TRACK_MEMORY */ - -#endif /* USE_WOLFSSL_MEMORY && !WOLFSSL_STATIC_MEMORY */ +#endif /* WOLFSSL_TRACK_MEMORY && USE_WOLFSSL_MEMORY && \ + !WOLFSSL_STATIC_MEMORY */ #ifdef HAVE_STACK_SIZE @@ -432,10 +445,6 @@ #include #include -#include -#include -#include - typedef void* (*thread_func)(void* args); #define STACK_CHECK_VAL 0x01 @@ -557,7 +566,8 @@ _ret = StackSizeHWMReset(); \ if ((max >= 0) && (HWM > (ssize_t)(max))) { \ wc_mem_printf( \ - " relative stack usage at %s L%d exceeds designated max %ld bytes.\n", \ + " relative stack usage at %s L%d exceeds designated " \ + "max %ld bytes.\n", \ __FILE__, __LINE__, (long int)(max)); \ _ret = -1; \ } \ @@ -720,7 +730,8 @@ return 0; } -static WC_INLINE int StackSizeCheck_reap(pthread_t threadId, void *stack_context) +static WC_INLINE int StackSizeCheck_reap(pthread_t threadId, + void *stack_context) { struct stack_size_debug_context *shim_args = (struct stack_size_debug_context *)stack_context; @@ -755,7 +766,6 @@ return (int)((size_t)status); } - #endif /* HAVE_STACK_SIZE */ @@ -799,13 +809,13 @@ #define STACK_SIZE_CHECKPOINT(...) (__VA_ARGS__) #endif #ifndef STACK_SIZE_CHECKPOINT_MSG -#define STACK_SIZE_CHECKPOINT_MSG(msg) +#define STACK_SIZE_CHECKPOINT_MSG(msg) WC_DO_NOTHING #endif #ifndef STACK_SIZE_CHECKPOINT_WITH_MAX_CHECK #define STACK_SIZE_CHECKPOINT_WITH_MAX_CHECK(max, ...) (__VA_ARGS__, 0) #endif #ifndef STACK_SIZE_INIT -#define STACK_SIZE_INIT() +#define STACK_SIZE_INIT() WC_DO_NOTHING #endif #endif /* WOLFSSL_MEM_TRACK_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/memory.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/memory.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/memory.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/memory.h 2024-08-03 07:30:01.000000000 +0000 @@ -101,48 +101,72 @@ #ifndef WOLFSSL_STATIC_ALIGN #define WOLFSSL_STATIC_ALIGN 16 #endif +/* WOLFMEM_BUCKETS - list of the sizes of buckets in the pool + * WOLFMEM_DIST - list of quantities of buffers in the buckets + * WOLFMEM_DEF_BUCKETS - number of values in WOLFMEM_BUCKETS and WOLFMEM_DIST + * WOLFMEM_MAX_BUCKETS - size of the arrays used to store the buckets and + * dists in the memory pool; defaults to WOLFMEM_DEF_BUCKETS + * + * The following defines provide a reasonable set of buckets in the memory + * pool for running wolfSSL on a Linux box. The bucket and dist lists below + * have nine items each, so WOLFMEM_DEF_BUCKETS is set to 9. + * + * If WOLFMEM_DEF_BUCKETS is less then WOLFMEM_MAX_BUCKETS, the unused values + * are set to zero and ignored. If WOLFMEM_MAX_BUCKETS is less than + * WOLFMEM_DEF_BUCKETS, not all the buckets will be created in the pool. + */ + #ifndef WOLFMEM_DEF_BUCKETS + #define WOLFMEM_DEF_BUCKETS 9 /* number of default memory blocks */ + #endif + #ifndef WOLFMEM_MAX_BUCKETS - #define WOLFMEM_MAX_BUCKETS 9 + #define WOLFMEM_MAX_BUCKETS WOLFMEM_DEF_BUCKETS + #endif + + #if WOLFMEM_MAX_BUCKETS < WOLFMEM_DEF_BUCKETS + #warning "ignoring excess buckets, MAX_BUCKETS less than DEF_BUCKETS" #endif - #define WOLFMEM_DEF_BUCKETS 9 /* number of default memory blocks */ + #ifndef WOLFMEM_IO_SZ #define WOLFMEM_IO_SZ 16992 /* 16 byte aligned */ #endif + + #ifndef LARGEST_MEM_BUCKET + #ifndef SESSION_CERTS + #define LARGEST_MEM_BUCKET 16128 + #elif defined(OPENSSL_EXTRA) + #ifdef WOLFSSL_TLS13 + #define LARGEST_MEM_BUCKET 30400 + #else + #define LARGEST_MEM_BUCKET 25600 + #endif + #elif defined(WOLFSSL_CERT_EXT) + /* certificate extensions requires 24k for the SSL struct */ + #define LARGEST_MEM_BUCKET 24576 + #else + /* increase 23k for object member of WOLFSSL_X509_NAME_ENTRY */ + #define LARGEST_MEM_BUCKET 23440 + #endif + #endif + #ifndef WOLFMEM_BUCKETS #ifndef SESSION_CERTS /* default size of chunks of memory to separate into */ - #ifndef LARGEST_MEM_BUCKET - #define LARGEST_MEM_BUCKET 16128 - #endif #define WOLFMEM_BUCKETS 64,128,256,512,1024,2432,3456,4544,\ LARGEST_MEM_BUCKET - #elif defined (OPENSSL_EXTRA) + #elif defined(OPENSSL_EXTRA) /* extra storage in structs for multiple attributes and order */ - #ifndef LARGEST_MEM_BUCKET - #ifdef WOLFSSL_TLS13 - #define LARGEST_MEM_BUCKET 30400 - #else - #define LARGEST_MEM_BUCKET 25600 - #endif - #endif #define WOLFMEM_BUCKETS 64,128,256,512,1024,2432,3360,4480,\ LARGEST_MEM_BUCKET - #elif defined (WOLFSSL_CERT_EXT) - /* certificate extensions requires 24k for the SSL struct */ - #ifndef LARGEST_MEM_BUCKET - #define LARGEST_MEM_BUCKET 24576 - #endif + #elif defined(WOLFSSL_CERT_EXT) #define WOLFMEM_BUCKETS 64,128,256,512,1024,2432,3456,4544,\ LARGEST_MEM_BUCKET #else - /* increase 23k for object member of WOLFSSL_X509_NAME_ENTRY */ - #ifndef LARGEST_MEM_BUCKET - #define LARGEST_MEM_BUCKET 23440 - #endif #define WOLFMEM_BUCKETS 64,128,256,512,1024,2432,3456,4544,\ LARGEST_MEM_BUCKET #endif #endif + #ifndef WOLFMEM_DIST #ifndef WOLFSSL_STATIC_MEMORY_SMALL #define WOLFMEM_DIST 49,10,6,14,5,6,9,1,1 @@ -190,7 +214,14 @@ typedef struct wc_Memory wc_Memory; /* internal structure for mem bucket */ typedef struct WOLFSSL_HEAP { wc_Memory* ava[WOLFMEM_MAX_BUCKETS]; + #ifndef WOLFSSL_STATIC_MEMORY_LEAN wc_Memory* io; /* list of buffers to use for IO */ + #endif + + #ifdef WOLFSSL_STATIC_MEMORY_LEAN + word16 sizeList[WOLFMEM_MAX_BUCKETS];/* memory sizes in ava list */ + byte distList[WOLFMEM_MAX_BUCKETS];/* general distribution */ + #else word32 maxHa; /* max concurrent handshakes */ word32 curHa; word32 maxIO; /* max concurrent IO connections */ @@ -199,10 +230,16 @@ word32 distList[WOLFMEM_MAX_BUCKETS];/* general distribution */ word32 inUse; /* amount of memory currently in use */ word32 ioUse; + #endif + + #ifndef WOLFSSL_STATIC_MEMORY_LEAN word32 alloc; /* total number of allocs */ word32 frAlc; /* total number of frees */ int flag; + #endif + #ifndef SINGLE_THREADED wolfSSL_Mutex memory_mutex; + #endif } WOLFSSL_HEAP; /* structure passed into XMALLOC as heap hint @@ -211,22 +248,41 @@ typedef struct WOLFSSL_HEAP_HINT { WOLFSSL_HEAP* memory; WOLFSSL_MEM_CONN_STATS* stats; /* hold individual connection stats */ + #ifndef WOLFSSL_STATIC_MEMORY_LEAN wc_Memory* outBuf; /* set if using fixed io buffers */ wc_Memory* inBuf; byte haFlag; /* flag used for checking handshake count */ + #endif } WOLFSSL_HEAP_HINT; + WOLFSSL_API void* wolfSSL_SetGlobalHeapHint(void* heap); + WOLFSSL_API void* wolfSSL_GetGlobalHeapHint(void); + WOLFSSL_API int wc_LoadStaticMemory_ex(WOLFSSL_HEAP_HINT** pHint, + unsigned int listSz, const unsigned int *sizeList, + const unsigned int *distList, unsigned char* buf, unsigned int sz, + int flag, int max); +#ifdef WOLFSSL_STATIC_MEMORY_DEBUG_CALLBACK + #define WOLFSSL_DEBUG_MEMORY_ALLOC 0 + #define WOLFSSL_DEBUG_MEMORY_FAIL 1 + #define WOLFSSL_DEBUG_MEMORY_FREE 2 + #define WOLFSSL_DEBUG_MEMORY_INIT 3 + + + typedef void (*DebugMemoryCb)(size_t sz, int bucketSz, byte st, int type); + WOLFSSL_API void wolfSSL_SetDebugMemoryCb(DebugMemoryCb cb); +#endif WOLFSSL_API int wc_LoadStaticMemory(WOLFSSL_HEAP_HINT** pHint, unsigned char* buf, unsigned int sz, int flag, int max); + WOLFSSL_API void wc_UnloadStaticMemory(WOLFSSL_HEAP_HINT* heap); - WOLFSSL_LOCAL int wolfSSL_init_memory_heap(WOLFSSL_HEAP* heap); - WOLFSSL_LOCAL int wolfSSL_load_static_memory(byte* buffer, word32 sz, - int flag, WOLFSSL_HEAP* heap); - WOLFSSL_LOCAL int wolfSSL_GetMemStats(WOLFSSL_HEAP* heap, + WOLFSSL_API int wolfSSL_GetMemStats(WOLFSSL_HEAP* heap, WOLFSSL_MEM_STATS* stats); WOLFSSL_LOCAL int SetFixedIO(WOLFSSL_HEAP* heap, wc_Memory** io); WOLFSSL_LOCAL int FreeFixedIO(WOLFSSL_HEAP* heap, wc_Memory** io); + WOLFSSL_API int wolfSSL_StaticBufferSz_ex(unsigned int listSz, + const unsigned int *sizeList, const unsigned int *distList, + byte* buffer, word32 sz, int flag); WOLFSSL_API int wolfSSL_StaticBufferSz(byte* buffer, word32 sz, int flag); WOLFSSL_API int wolfSSL_MemoryPaddingSz(void); #endif /* WOLFSSL_STATIC_MEMORY */ @@ -251,9 +307,201 @@ WOLFSSL_LOCAL void wc_MemZero_Check(void* addr, size_t len); #endif +#ifdef WC_DEBUG_CIPHER_LIFECYCLE +WOLFSSL_LOCAL int wc_debug_CipherLifecycleInit(void **CipherLifecycleTag, + void *heap); +WOLFSSL_LOCAL int wc_debug_CipherLifecycleCheck(void *CipherLifecycleTag, + int abort_p); +WOLFSSL_LOCAL int wc_debug_CipherLifecycleFree(void **CipherLifecycleTag, + void *heap, int abort_p); +#else +#define wc_debug_CipherLifecycleInit(CipherLifecycleTag, heap) \ + ((void)(CipherLifecycleTag), (void)(heap), 0) +#define wc_debug_CipherLifecycleCheck(CipherLifecycleTag, abort_p) \ + ((void)(CipherLifecycleTag), (void)(abort_p), 0) +#define wc_debug_CipherLifecycleFree(CipherLifecycleTag, heap, abort_p) \ + ((void)(CipherLifecycleTag), (void)(heap), (void)(abort_p), 0) +#endif + +#ifdef DEBUG_VECTOR_REGISTER_ACCESS_FUZZING + WOLFSSL_LOCAL int SAVE_VECTOR_REGISTERS2_fuzzer(void); + #ifndef WC_DEBUG_VECTOR_REGISTERS_FUZZING_SEED + #define WC_DEBUG_VECTOR_REGISTERS_FUZZING_SEED 0 + #endif + #ifndef CAN_SAVE_VECTOR_REGISTERS + #define CAN_SAVE_VECTOR_REGISTERS() (SAVE_VECTOR_REGISTERS2_fuzzer() == 0) + #endif +#endif + +#ifdef DEBUG_VECTOR_REGISTER_ACCESS + WOLFSSL_API extern THREAD_LS_T int wc_svr_count; + WOLFSSL_API extern THREAD_LS_T const char *wc_svr_last_file; + WOLFSSL_API extern THREAD_LS_T int wc_svr_last_line; + + #ifdef DEBUG_VECTOR_REGISTERS_ABORT_ON_FAIL + #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE abort(); + #elif defined(DEBUG_VECTOR_REGISTERS_EXIT_ON_FAIL) + #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE exit(1); + #elif !defined(DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE) + #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE + #endif + + #define SAVE_VECTOR_REGISTERS(fail_clause) { \ + int _svr_ret = wc_debug_vector_registers_retval; \ + if (_svr_ret != 0) { fail_clause } \ + else { \ + ++wc_svr_count; \ + if (wc_svr_count > 5) { \ + fprintf(stderr, \ + ("%s @ L%d : incr : " \ + "wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + } \ + wc_svr_last_file = __FILE__; \ + wc_svr_last_line = __LINE__; \ + } \ + } + + WOLFSSL_API extern THREAD_LS_T int wc_debug_vector_registers_retval; + +#ifndef WC_DEBUG_VECTOR_REGISTERS_RETVAL_INITVAL +#define WC_DEBUG_VECTOR_REGISTERS_RETVAL_INITVAL 0 +#endif +#define WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(x) do { \ + if (((x) != 0) && (wc_svr_count > 0)) { \ + fprintf(stderr, \ + ("%s @ L%d : incr : " \ + "wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + } \ + wc_debug_vector_registers_retval = (x); \ + } while (0) + +#ifdef DEBUG_VECTOR_REGISTER_ACCESS_FUZZING + #define SAVE_VECTOR_REGISTERS2(...) ({ \ + int _svr2_val = SAVE_VECTOR_REGISTERS2_fuzzer(); \ + if (_svr2_val == 0) { \ + ++wc_svr_count; \ + if (wc_svr_count > 5) { \ + fprintf(stderr, \ + ("%s @ L%d : incr : " \ + "wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + } \ + wc_svr_last_file = __FILE__; \ + wc_svr_last_line = __LINE__; \ + _svr2_val = 0; \ + } \ + _svr2_val; \ + }) + +#else + + #define SAVE_VECTOR_REGISTERS2(...) ({ \ + int _svr2_val; \ + if (wc_debug_vector_registers_retval != 0) { \ + if (wc_svr_count > 0) { \ + fprintf(stderr, \ + ("%s @ L%d : incr : " \ + "wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + } \ + _svr2_val = wc_debug_vector_registers_retval; \ + } else { \ + ++wc_svr_count; \ + if (wc_svr_count > 5) { \ + fprintf(stderr, \ + ("%s @ L%d : incr : " \ + "wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + } \ + wc_svr_last_file = __FILE__; \ + wc_svr_last_line = __LINE__; \ + _svr2_val = 0; \ + } \ + _svr2_val; \ + }) + +#endif + + #define ASSERT_SAVED_VECTOR_REGISTERS(fail_clause) do { \ + if (wc_svr_count <= 0) { \ + fprintf(stderr, \ + ("ASSERT_SAVED_VECTOR_REGISTERS : %s @ L%d : " \ + "wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + { fail_clause } \ + } \ + } while (0) + #define ASSERT_RESTORED_VECTOR_REGISTERS(fail_clause) do { \ + if (wc_svr_count != 0) { \ + fprintf(stderr, \ + ("ASSERT_RESTORED_VECTOR_REGISTERS : %s @ L%d" \ + " : wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + { fail_clause } \ + } \ + } while (0) + #define RESTORE_VECTOR_REGISTERS(...) do { \ + --wc_svr_count; \ + if ((wc_svr_count > 4) || (wc_svr_count < 0)) { \ + fprintf(stderr, \ + ("%s @ L%d : decr : " \ + "wc_svr_count %d (last op %s L%d)\n"), \ + __FILE__, \ + __LINE__, \ + wc_svr_count, \ + wc_svr_last_file, \ + wc_svr_last_line); \ + DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ + } \ + wc_svr_last_file = __FILE__; \ + wc_svr_last_line = __LINE__; \ + } while(0) + +#else /* !DEBUG_VECTOR_REGISTER_ACCESS */ + #if !defined(SAVE_VECTOR_REGISTERS2) && defined(DEBUG_VECTOR_REGISTER_ACCESS_FUZZING) + #define SAVE_VECTOR_REGISTERS2(...) SAVE_VECTOR_REGISTERS2_fuzzer() + #endif +#endif + #ifdef __cplusplus } /* extern "C" */ #endif #endif /* WOLFSSL_MEMORY_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/misc.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/misc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/misc.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/misc.h 2024-08-03 07:30:01.000000000 +0000 @@ -102,17 +102,19 @@ void c32to24(word32 in, word24 out); -void c16toa(word16 u16, byte* c); -void c32toa(word32 u32, byte* c); -void c24to32(const word24 u24, word32* u32); -void ato16(const byte* c, word16* u16); -void ato24(const byte* c, word32* u24); -void ato32(const byte* c, word32* u32); +void c16toa(word16 wc_u16, byte* c); +void c32toa(word32 wc_u32, byte* c); +void c24to32(const word24 wc_u24, word32* wc_u32); +void ato16(const byte* c, word16* wc_u16); +void ato24(const byte* c, word32* wc_u24); +void ato32(const byte* c, word32* wc_u32); +void ato32le(const byte* c, word32* wc_u32); word32 btoi(byte b); WOLFSSL_LOCAL signed char HexCharToByte(char ch); WOLFSSL_LOCAL char ByteToHex(byte in); WOLFSSL_LOCAL int ByteToHexStr(byte in, char* out); +WOLFSSL_LOCAL int CharIsWhiteSpace(char ch); WOLFSSL_LOCAL byte ctMaskGT(int a, int b); WOLFSSL_LOCAL byte ctMaskGTE(int a, int b); @@ -133,6 +135,8 @@ WOLFSSL_LOCAL void ctMaskCopy(byte mask, byte* dst, byte* src, word16 size); WOLFSSL_LOCAL word32 MakeWordFromHash(const byte* hashID); WOLFSSL_LOCAL word32 HashObject(const byte* o, word32 len, int* error); +WOLFSSL_LOCAL char* CopyString(const char* src, int srcLen, void* heap, + int type); WOLFSSL_LOCAL void w64Increment(w64wrapper *n); WOLFSSL_LOCAL void w64Decrement(w64wrapper *n); @@ -151,11 +155,33 @@ WOLFSSL_LOCAL byte w64LT(w64wrapper a, w64wrapper b); WOLFSSL_LOCAL w64wrapper w64Sub(w64wrapper a, w64wrapper b); WOLFSSL_LOCAL void w64Zero(w64wrapper *a); +WOLFSSL_LOCAL w64wrapper w64ShiftRight(w64wrapper a, int shift); +WOLFSSL_LOCAL w64wrapper w64ShiftLeft(w64wrapper a, int shift); #else /* !NO_INLINE */ #define WC_MISC_STATIC static +/* Declarations for user defined functions */ +#ifdef WOLFSSL_NO_FORCE_ZERO +void ForceZero(void* mem, word32 len); +#endif +#ifdef WOLFSSL_NO_CONST_CMP +int ConstantCompare(const byte* a, const byte* b, int length); +#endif +#ifdef WOLFSSL_NO_INT_ENCODE +void c32to24(word32 in, word24 out); +void c16toa(word16 wc_u16, byte* c); +void c32toa(word32 wc_u32, byte* c); +#endif +#ifdef WOLFSSL_NO_INT_DECODE +void c24to32(const word24 wc_u24, word32* wc_u32); +void ato24(const byte* c, word32* wc_u24); +void ato16(const byte* c, word16* wc_u16); +void ato32(const byte* c, word32* wc_u32); +void ato32le(const byte* c, word32* wc_u32); +word32 btoi(byte b); +#endif #endif /* NO_INLINE */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs12.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs12.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs12.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs12.h 2024-08-03 07:30:01.000000000 +0000 @@ -29,9 +29,7 @@ extern "C" { #endif -#ifndef WOLFSSL_TYPES_DEFINED /* do not redeclare from ssl.h */ - typedef struct WC_PKCS12 WC_PKCS12; -#endif +typedef struct WC_PKCS12 WC_PKCS12; typedef struct WC_DerCertList { /* dereferenced in ssl.c */ byte* buffer; @@ -47,6 +45,7 @@ }; WOLFSSL_API WC_PKCS12* wc_PKCS12_new(void); +WOLFSSL_API WC_PKCS12* wc_PKCS12_new_ex(void* heap); WOLFSSL_API void wc_PKCS12_free(WC_PKCS12* pkcs12); WOLFSSL_API int wc_d2i_PKCS12(const byte* der, word32 derSz, WC_PKCS12* pkcs12); #ifndef NO_FILESYSTEM @@ -67,7 +66,7 @@ WOLFSSL_LOCAL int wc_PKCS12_SetHeap(WC_PKCS12* pkcs12, void* heap); WOLFSSL_LOCAL void* wc_PKCS12_GetHeap(WC_PKCS12* pkcs12); -WOLFSSL_LOCAL void wc_FreeCertList(WC_DerCertList* list, void* heap); +WOLFSSL_API void wc_FreeCertList(WC_DerCertList* list, void* heap); #ifdef __cplusplus } /* extern "C" */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs7.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs7.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs7.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pkcs7.h 2024-08-03 07:30:01.000000000 +0000 @@ -112,6 +112,7 @@ WC_PKCS7_VERIFY_STAGE4, WC_PKCS7_VERIFY_STAGE5, WC_PKCS7_VERIFY_STAGE6, + WC_PKCS7_VERIFY_STAGE7, /* parse info set */ WC_PKCS7_INFOSET_START, @@ -224,6 +225,11 @@ byte* out, word32 outSz, int keyWrapAlgo, int type, int dir); +/* Callbacks for supporting different stream cases */ +typedef int (*CallbackGetContent)(PKCS7* pkcs7, byte** content, void* ctx); +typedef int (*CallbackStreamOut)(PKCS7* pkcs7, const byte* output, + word32 outputSz, void* ctx); + #if defined(HAVE_PKCS7_RSA_RAW_SIGN_CALLBACK) && !defined(NO_RSA) /* RSA sign raw digest callback, user builds DigestInfo */ typedef int (*CallbackRsaSignRawDigest)(PKCS7* pkcs7, byte* digest, @@ -247,7 +253,13 @@ #ifdef ASN_BER_TO_DER byte* der; /* DER encoded version of message */ word32 derSz; + CallbackGetContent getContentCb; + CallbackStreamOut streamOutCb; + void* streamCtx; /* passed to getcontentCb and streamOutCb */ #endif + byte encodeStream:1; /* use BER when encoding */ + byte noCerts:1; /* if certificates should be added into bundle + during creation */ byte* cert[MAX_PKCS7_CERTS]; /* array of certs parsed from bundle */ byte* verifyCert; /* cert from array used for verify */ word32 verifyCertSz; @@ -341,6 +353,7 @@ byte* cachedEncryptedContent; word32 cachedEncryptedContentSz; word16 contentCRLF:1; /* have content line endings been converted to CRLF */ + word16 contentIsPkcs7Type:1; /* eContent follows PKCS#7 RFC not CMS */ /* !! NEW DATA MEMBERS MUST BE ADDED AT END !! */ }; @@ -494,6 +507,15 @@ WOLFSSL_API int wc_PKCS7_SetDecodeEncryptedCtx(PKCS7* pkcs7, void* ctx); #endif /* NO_PKCS7_ENCRYPTED_DATA */ +/* stream and certs */ +WOLFSSL_LOCAL int wc_PKCS7_WriteOut(PKCS7* pkcs7, byte* output, + const byte* input, word32 inputSz); +WOLFSSL_API int wc_PKCS7_SetStreamMode(PKCS7* pkcs7, byte flag, + CallbackGetContent getContentCb, CallbackStreamOut streamOutCb, void* ctx); +WOLFSSL_API int wc_PKCS7_GetStreamMode(PKCS7* pkcs7); +WOLFSSL_API int wc_PKCS7_SetNoCerts(PKCS7* pkcs7, byte flag); +WOLFSSL_API int wc_PKCS7_GetNoCerts(PKCS7* pkcs7); + /* CMS/PKCS#7 CompressedData */ #if defined(HAVE_LIBZ) && !defined(NO_PKCS7_COMPRESSED_DATA) WOLFSSL_API int wc_PKCS7_EncodeCompressedData(PKCS7* pkcs7, byte* output, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/poly1305.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/poly1305.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/poly1305.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/poly1305.h 2024-08-03 07:30:01.000000000 +0000 @@ -48,7 +48,14 @@ #define WC_HAS_GCC_4_4_64BIT #endif -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef WOLFSSL_X86_64_BUILD +#if defined(USE_INTEL_SPEEDUP) && !defined(NO_POLY1305_ASM) + #define USE_INTEL_POLY1305_SPEEDUP + #define HAVE_INTEL_AVX1 +#endif +#endif + +#if defined(USE_INTEL_POLY1305_SPEEDUP) #elif (defined(WC_HAS_SIZEOF_INT128_64BIT) || defined(WC_HAS_MSVC_64BIT) || \ defined(WC_HAS_GCC_4_4_64BIT)) #define POLY130564 @@ -67,7 +74,7 @@ /* Poly1305 state */ typedef struct Poly1305 { -#if defined(WOLFSSL_X86_64_BUILD) && defined(USE_INTEL_SPEEDUP) +#ifdef USE_INTEL_POLY1305_SPEEDUP word64 r[3]; word64 h[3]; word64 pad[2]; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp-sdk-lib.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp-sdk-lib.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp-sdk-lib.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp-sdk-lib.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,229 @@ +/* esp-sdk-lib.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef __ESP_SDK_LIB_H__ + +#define __ESP_SDK_LIB_H__ + +/* Always include wolfcrypt/settings.h before any other wolfSSL file. */ +/* Reminder: settings.h pulls in user_settings.h; don't include it here. */ +#include + +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ + +/* WOLFSSL_USER_SETTINGS must be defined, typically in the CMakeLists.txt: */ +/* set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") */ +#ifndef WOLFSSL_USER_SETTINGS + #error "WOLFSSL_USER_SETTINGS must be defined for Espressif targts" +#endif + +/* FreeRTOS */ +#include +#include +#include + +/* Espressif */ +#include "sdkconfig.h" /* ensure ESP-IDF settings are available everywhere */ +#include +#include + +#define ESP_SDK_MEM_LIB_VERSION 1 + +/** + ****************************************************************************** + ****************************************************************************** + ** USER APPLICATION SETTINGS BEGIN + ****************************************************************************** + ****************************************************************************** + **/ + +/* when using a private config with plain text passwords, + * file my_private_config.h should be excluded from git updates */ +/* #define USE_MY_PRIVATE_CONFIG */ + +/* Note that IntelliSense may not work properly in the next section for the + * Espressif SDK 3.4 on the ESP8266. Macros should still be defined. + * See the project-level Makefile. Example found in: + * https://github.com/wolfSSL/wolfssl/tree/master/IDE/Espressif/ESP-IDF/examples/template + * + * The USE_MY_PRIVATE_[OS]_CONFIG is typically an environment variable that + * triggers the make (not cmake) to add compiler defines. + */ +#if defined(USE_MY_PRIVATE_WINDOWS_CONFIG) + #include "/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_WSL_CONFIG) + #include "/mnt/c/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_LINUX_CONFIG) + #include "~/workspace/my_private_config.h" +#elif defined(USE_MY_PRIVATE_MAC_CONFIG) + #include "~/Documents/my_private_config.h" +#elif defined(USE_MY_PRIVATE_CONFIG) + /* This section works best with cmake & non-environment variable setting */ + #if defined(WOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS) + #define WOLFSSL_CMAKE + #include "/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_WINDOWS) + #define WOLFSSL_MAKE + #include "/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_WSL) + #define WOLFSSL_CMAKE + #include "/mnt/c/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_WSL) + #define WOLFSSL_MAKE + #include "/mnt/c/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_LINUX) + #define WOLFSSL_CMAKE + #include "~/workspace/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_LINUX) + #define WOLFSSL_MAKE + #include "~/workspace/my_private_config.h" + #elif defined(WOLFSSL_CMAKE_SYSTEM_NAME_APPLE) + #include "~/Documents/my_private_config.h" + #elif defined(WOLFSSL_MAKE_SYSTEM_NAME_APPLE) + #define WOLFSSL_MAKE + #include "~/Documents/my_private_config.h" + #elif defined(OS_WINDOWS) + #include "/workspace/my_private_config.h" + #else + /* Edit as needed for your private config: */ + #warning "default private config using /workspace/my_private_config.h" + #include "/workspace/my_private_config.h" + #endif +#else + + /* + ** The examples use WiFi configuration that you can set via project + ** configuration menu + ** + ** If you'd rather not, just change the below entries to strings with + ** the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" + */ + #if defined(CONFIG_ESP_WIFI_SSID) + /* tyically from ESP32 with ESP-IDF v4 ot v5 */ + #define EXAMPLE_ESP_WIFI_SSID CONFIG_ESP_WIFI_SSID + #elif defined(CONFIG_EXAMPLE_WIFI_SSID) + /* typically from ESP8266 rtos-sdk/v3.4 */ + #undef EXAMPLE_ESP_WIFI_SSID + #define EXAMPLE_ESP_WIFI_SSID CONFIG_EXAMPLE_WIFI_SSID + #else + #define EXAMPLE_ESP_WIFI_SSID "MYSSID_WIFI_CONNECT" + #endif + + #if defined(CONFIG_ESP_WIFI_PASSWORD) + /* tyically from ESP32 with ESP-IDF v4 or v5 */ + #define EXAMPLE_ESP_WIFI_PASS CONFIG_ESP_WIFI_PASSWORD + #elif defined(CONFIG_EXAMPLE_WIFI_SSID) + /* typically from ESP8266 rtos-sdk/v3.4 */ + #undef EXAMPLE_ESP_WIFI_PASS + #define EXAMPLE_ESP_WIFI_PASS CONFIG_EXAMPLE_WIFI_PASSWORD + #else + #define EXAMPLE_ESP_WIFI_PASS "MYPASSWORD_WIFI_CONNECT" + #endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +WOLFSSL_LOCAL esp_err_t esp_sdk_time_mem_init(void); + +WOLFSSL_LOCAL esp_err_t sdk_var_whereis(const char* v_name, void* v); + +WOLFSSL_LOCAL intptr_t esp_sdk_stack_pointer(void); + +/****************************************************************************** +* Time helpers +******************************************************************************/ +WOLFSSL_LOCAL esp_err_t esp_sdk_time_lib_init(void); + +/* a function to show the current data and time */ +WOLFSSL_LOCAL esp_err_t esp_show_current_datetime(void); + +/* worst case, if GitHub time not available, used fixed time */ +WOLFSSL_LOCAL esp_err_t set_fixed_default_time(void); + +/* set time from string (e.g. GitHub commit time) */ +WOLFSSL_LOCAL esp_err_t set_time_from_string(const char* time_buffer); + +/* set time from NTP servers, + * also initially calls set_fixed_default_time or set_time_from_string */ +WOLFSSL_LOCAL esp_err_t set_time(void); + +/* wait NTP_RETRY_COUNT seconds before giving up on NTP time */ +WOLFSSL_LOCAL esp_err_t set_time_wait_for_ntp(void); + +#ifndef NO_ESP_SDK_WIFI + +/****************************************************************************** +* WiFi helpers +******************************************************************************/ +/* ESP lwip */ +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY + +#define TLS_SMP_WIFI_SSID CONFIG_WIFI_SSID +#define TLS_SMP_WIFI_PASS CONFIG_WIFI_PASSWORD + +/* Optionally enable WiFi. Typically not used for wolfcrypt tests */ +/* #define USE_WIFI_EXAMPLE */ +#ifdef USE_WIFI_EXAMPLE + #include "esp_netif.h" + #if defined(CONFIG_IDF_TARGET_ESP8266) + /* TODO find and implement ESP8266 example include */ + #else + #include "protocol_examples_common.h" /* see project CMakeLists.txt */ + #endif +#endif + + +/* ESP lwip */ +#define EXAMPLE_ESP_MAXIMUM_RETRY CONFIG_ESP_MAXIMUM_RETRY + +WOLFSSL_LOCAL esp_err_t esp_sdk_wifi_lib_init(void); + +WOLFSSL_LOCAL esp_err_t esp_sdk_wifi_init_sta(void); + +WOLFSSL_LOCAL esp_err_t esp_sdk_wifi_show_ip(void); + +#endif /* !NO_ESP_SDK_WIFI */ + + +/****************************************************************************** +* Debug helpers +******************************************************************************/ +WOLFSSL_LOCAL esp_err_t sdk_init_meminfo(void); +WOLFSSL_LOCAL void* wc_debug_pvPortMalloc(size_t size, + const char* file, int line, const char* fname); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/* Check for traps */ +#if defined(CONFIG_IDF_TARGET_ESP8266) + #if !defined(NO_SESSION_CACHE) && \ + !defined(MICRO_SESSION_CACHE) && \ + !defined(SMALL_SESSION_CACHE) + #warning "Limited DRAM/IRAM on ESP8266. Check session cache settings" + #endif +#endif + +#endif /* WOLFSSL_ESPIDF */ + +#endif /* __ESP_SDK_LIB_H__ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h 2024-08-03 07:30:01.000000000 +0000 @@ -1,6 +1,6 @@ /* esp32-crypt.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -22,108 +22,691 @@ #define __ESP32_CRYPT_H__ -#include "wolfssl/wolfcrypt/settings.h" -#include /* for MATH_INT_T */ +/* WOLFSSL_USER_SETTINGS must be defined, typically in the CMakeLists.txt: + * + * set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS") */ +#include /* references user_settings.h */ + +#if defined(WOLFSSL_ESPIDF) /* Entire file is only for Espressif EDP-IDF */ + +#ifndef WOLFSSL_USER_SETTINGS + #error "WOLFSSL_USER_SETTINGS must be defined for Espressif targts" +#endif + +#include "sdkconfig.h" /* ensure ESP-IDF settings are available everywhere */ + +/* wolfSSL */ +#include +#include /* for MATH_INT_T */ + +/* Espressif */ +#include +#include +#include + +#ifndef _INTPTR_T_DECLARED + #define intptr_t (void*) +#endif + +#ifndef _UINTPTR_T_DECLARED + #define uintptr_t (void*) +#endif + +#ifndef NULLPTR + #define NULLPTR ((uintptr_t)NULL) +#endif -#include "esp_idf_version.h" -#include "esp_types.h" -#include "esp_log.h" +#if ESP_IDF_VERSION_MAJOR >= 4 + #define WOLFSSL_ESPIDF_BLANKLINE_MESSAGE "" +#else + /* Older ESP-IDF such as that for ESP8266 do not support empty strings */ + #define WOLFSSL_ESPIDF_BLANKLINE_MESSAGE "." +#endif -#ifdef WOLFSSL_ESP32WROOM32_CRYPT_DEBUG +#if defined(WOLFSSL_STACK_CHECK) + #define CTX_STACK_CHECK(ctx) esp_sha_stack_check(ctx) +#else + #define CTX_STACK_CHECK(ctx) {} +#endif + +#if defined(CONFIG_IDF_TARGET) + #define FOUND_CONFIG_IDF_TARGET CONFIG_IDF_TARGET +#else + #define FOUND_CONFIG_IDF_TARGET "(unknown device)" +#endif + +/* Optional exit message. + * The WOLFSSL_COMPLETE keyword exits wolfSSL test harness script. */ +#define WOLFSSL_ESPIDF_EXIT_MESSAGE \ + "\n\nDevice: " FOUND_CONFIG_IDF_TARGET \ + "\n\nDone!" \ + "\n\nWOLFSSL_COMPLETE" \ + "\n\nIf running from idf.py monitor, press twice: Ctrl+]" + +#define WOLFSSL_ESPIDF_VERBOSE_EXIT_MESSAGE(s, err) \ + "\n\nDevice: " FOUND_CONFIG_IDF_TARGET \ + "\n\nExit code: %d " \ + "\n\n"s \ + "\n\nWOLFSSL_COMPLETE" \ + "\n\nIf running from idf.py monitor, press twice: Ctrl+]", \ + (err) + +/* exit codes to be used in tfm.c, sp_int.c, integer.c, etc. + * + * see wolfssl/wolfcrypt/error-crypt.h + * + * WC_HW_E - generic hardware failure. Consider falling back to SW. + * WC_HW_WAIT_E - waited too long for HW, fall back to SW + */ + +/* Exit codes only used in Espressif port: */ +enum { + ESP_MP_HW_FALLBACK = (WC_LAST_E - 2), + ESP_MP_HW_VALIDATION_ACTIVE = (WC_LAST_E - 3) +}; + +/* MP_HW_FALLBACK: signal to caller to fall back to SW for math: + * algorithm not supported in SW + * known state needing only SW, (e.g. ctx copy) + * any other reason to force SW (was -108)*/ +#define MP_HW_FALLBACK ESP_MP_HW_FALLBACK + +/* MP_HW_VALIDATION_ACTIVE this is informative only: + * typically also means "MP_HW_FALLBACK": fall back to SW. + * optional HW validation active, so compute in SW to compare. + * fall back to SW, typically only used during debugging. (was -109) + */ +#define MP_HW_VALIDATION_ACTIVE ESP_MP_HW_VALIDATION_ACTIVE + +/* +******************************************************************************* +******************************************************************************* +** Global Settings: +** +** Settings that start with "CONFIG_" are typically defined in sdkconfig.h +** +** Primary Settings: +** +** WC_NO_HARDEN +** Disables some timing resistance / side-channel attack prevention. +** +** NO_ESPIDF_DEFAULT +** When defined, disables some default definitions. See wolfcrypt/settings.h +** +** NO_ESP32_CRYPT +** When defined, disables all hardware acceleration on the ESP32 +** +** NO_WOLFSSL_ESP32_CRYPT_HASH +** Used to disabled only hash hardware, all algorithms: SHA2, etc. +** +** NO_WOLFSSL_ESP32_CRYPT_HASH_SHA +** When defined, disables only SHA hardware acceleration, uses SW. +** +** NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 +** When defined, disables only SHA-224 hardware acceleration, uses SW. +** +** NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 +** When defined, disables only SHA-384 hardware acceleration, uses SW. +** +** NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 +** When defined, disables only SHA-256 hardware acceleration, uses SW. +** +** NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 +** When defined, disables only SHA-512 hardware acceleration, uses SW. +** +** WOLFSSL_NOSHA512_224 +** Define to disable SHA-512/224 +** +** WOLFSSL_NOSHA512_256 +** Define to disable SHA-512/512 +** +** WOLFSSL_ESP32_CRYPT_RSA_PRI +** Defined in wolfSSL settings.h: this turns on or off esp32_mp math library. +** Unless turned off, this is enabled by default for the ESP32 +** +** NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL +** Turns off hardware acceleration esp_mp_mul() +** +** NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD +** Turns off hardware acceleration esp_mp_exptmod() +** +** NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD +** Turns off hardware acceleration esp_mp_mulmod() +** +** NO_WOLFSSL_ESP32_CRYPT_AES +** Used to disable only AES hardware algorithms. Software used instead. +** +******************************************************************************* +** Math library settings: TFM +******************************************************************************* +** Listed in increasing order of complexity: +** +** WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL +** When defined, use hardware acceleration esp_mp_mul() +** for Large Number Multiplication: Z = X * Y +** Currently defined by default in tfm.c, see above to disable. +** +** WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD +** When defined, use hardware acceleration esp_mp_exptmod() +** for Large Number Modular Exponentiation Z = X^Y mod M +** Currently defined by default in tfm.c, see above to disable. +** +** WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD +** When defined, use hardware acceleration esp_mp_mulmod() +** for Large Number Modular Multiplication: Z = X * Y mod M +** Currently defined by default in tfm.c, see above to disable. +** +** +******************************************************************************* +** Optional Settings: +******************************************************************************* +** +** WOLFSSL_HW_METRICS +** Enables metric counters for calls to HW, success, fall back, oddities. +** +** WOLFSSL_HAS_METRICS +** Indicates that we actually have metrics to show. Useful for old wolfSSL +** libraries tested with newer examples, or when all HW turned off. +** +** DEBUG_WOLFSSL +** Turns on development testing. Validates HW accelerated results to software +** - Automatically turns on WOLFSSL_HW_METRICS +** +** DEBUG_WOLFSSL_SHA_MUTEX +** Turns on diagnostic messages for SHA mutex. Note that given verbosity, +** there may be TLS timing issues encountered. Use with caution. +** +** LOG_LOCAL_LEVEL +** Debugging. Default value is ESP_LOG_DEBUG +** +** ESP_VERIFY_MEMBLOCK +** Used to re-read data from registers in esp32_mp & verify written contents +** actually match the source data. +** +** WOLFSSL_ESP32_CRYPT_DEBUG +** When defined, enables hardware cryptography debugging. +** +** WOLFSSL_DEBUG_ESP_RSA_MULM_BITS +** Shows a warning when mulm falls back for minimum number of bits. +** +** NO_HW_MATH_TEST +** Even if HW is enabled, do not run HW math tests. See HW_MATH_ENABLED. +** +** NO_ESP_MP_MUL_EVEN_ALT_CALC +** Used during Z = X * Y mod M +** By default, even moduli use a two step HW esp_mp_mul with SW mp_mod. +** Enable this to instead fall back to pure software mp_mulmod. +** +** NO_RECOVER_SOFTWARE_CALC +** When defined, will NOT recover software calculation result when not +** matched with hardware. Useful only during development. Needs DEBUG_WOLFSSL +** +** ESP_PROHIBIT_SMALL_X +** When set to 1 X operands less than 8 bits will fall back to SW. +** +** ESP_NO_ERRATA_MITIGATION +** Disable all errata mitigation code. +** +** USE_ESP_DPORT_ACCESS_READ_BUFFER +** Sets ESP_NO_ERRATA_MITIGATION and uses esp_dport_access_read_buffer() +** +** ESP_MONITOR_HW_TASK_LOCK +** Although wolfSSL is in general not fully thread safe, this option +** enables some features that can be useful in a multi-threaded environment. +** +******************************************************************************* +** Settings used from +** see .\esp-idf\v[N]\components\esp_common\include +******************************************************************************* +** +** ESP_IDF_VERSION_MAJOR +** Espressif ESP-IDF Version (e.g. 4, 5) +** +******************************************************************************* +** Settings used from ESP-IDF (sdkconfig.h) +******************************************************************************* +** +** CONFIG_IDF_TARGET_[SoC] +** CONFIG_IDF_TARGET_ESP32 +** CONFIG_IDF_TARGET_ESP32C2 +** CONFIG_IDF_TARGET_ESP32C3 +** CONFIG_IDF_TARGET_ESP32C6 +** CONFIG_IDF_TARGET_ESP32S2 +** CONFIG_IDF_TARGET_ESP32S3 +** CONFIG_IDF_TARGET_ESP32H2 +** +]******************************************************************************* +** Informative settings. Not meant to be edited: +******************************************************************************* +** +** HW_MATH_ENABLED +** Used to detect if any hardware math acceleration algorithms are used. +** This is typically only used to flag wolfCrypt tests to run HW tests. +** See NO_HW_MATH_TEST. +** +******************************************************************************* +** WOLFSSL_FULL_WOLFSSH_SUPPORT +** TODO - there's a known, unresolved problem with SHA256 in wolfSSH +** Until fixed by a release version or this macro being define once resolved, +** this macro should remain undefined. +** +*/ +#ifdef WOLFSSL_ESP32_CRYPT_DEBUG #undef LOG_LOCAL_LEVEL #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG #else #undef LOG_LOCAL_LEVEL - #define LOG_LOCAL_LEVEL ESP_LOG_DEBUG + #define LOG_LOCAL_LEVEL CONFIG_LOG_DEFAULT_LEVEL #endif #include -#if defined(CONFIG_IDF_TARGET_ESP32C3) - /* no includes for ESP32C3 at this time (no HW implemented yet) */ -#elif defined(CONFIG_IDF_TARGET_ESP32S3) + +#if defined(CONFIG_IDF_TARGET_ESP32) + /* there's no SHA-224 HW on the ESP32 */ + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 #include "soc/dport_reg.h" - #include "soc/hwcrypto_reg.h" + #include + + #if ESP_IDF_VERSION_MAJOR < 5 + #include + #endif + #if defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR >= 5 - #include "esp_private/periph_ctrl.h" + #include #else - #include "driver/periph_ctrl.h" + #include #endif -#else - #include "soc/dport_reg.h" - #include "soc/hwcrypto_reg.h" + + #if ESP_IDF_VERSION_MAJOR >= 4 + #include + #else + #include + #endif + #define ESP_PROHIBIT_SMALL_X FALSE + /***** END CONFIG_IDF_TARGET_ESP32 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + /* ESP8684 is essentially ESP32-C2 chip + flash embedded together in a + * single QFN 4x4 mm package. Out of released documentation, Technical + * Reference Manual as well as ESP-IDF Programming Guide is applicable + * to both ESP32-C2 and ESP8684. + * + * Note there is not currently an expected CONFIG_IDF_TARGET_ESP8684. + * The ESP8684 is detected with CONFIG_IDF_TARGET_ESP32C2. + * The macro is included for clarity, and possible future rename. */ + + /* #define NO_ESP32_CRYPT */ + /* #define NO_WOLFSSL_ESP32_CRYPT_HASH */ + /* No AES HW */ + #define NO_WOLFSSL_ESP32_CRYPT_AES + /* No RSA HW: */ + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /* No RSA, so no mp_mul: */ + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + /* No RSA, so no mp_mulmod: */ + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + /* No RSA, no mp_exptmod: */ + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + + #include + #include #if ESP_IDF_VERSION_MAJOR < 5 - #include "soc/cpu.h" + #include #endif #if defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR >= 5 - #include "esp_private/periph_ctrl.h" + #include #else - #include "driver/periph_ctrl.h" + #include #endif #if ESP_IDF_VERSION_MAJOR >= 4 - #include + /* #include */ + #else + #include + #endif + +/* If for some reason there's a desire to disable specific HW on the C2: */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA there is SHA HW on C2 */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 there is SHA224 HW on C2 */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 there is SHA256 HW on C2 */ + + /* Code will fall back to SW with warning if these are removed: + * Note there is no SHA384/SHA512 HW on ESP32-C3 */ + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + /***** END CONFIG_IDF_TARGET_ESP32C2 aka CONFIG_IDF_TARGET_ESP8684 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #include + #include + + #if ESP_IDF_VERSION_MAJOR < 5 + #include + #endif + + #if defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR >= 5 + #include + #else + #include + #endif + + #if ESP_IDF_VERSION_MAJOR >= 4 + /* #include */ + #else + #include + #endif + +/* If for some reason there's a desire to disable specific HW on the C3: */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA there is SHA HW on C3 */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 there is SHA224 HW on C3 */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 there is SHA256 HW on C3 */ + + /* Code will fall back to SW with warning if these are removed: + * Note there is no SHA384/SHA512 HW on ESP32-C3 */ + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + /***** END CONFIG_IDF_TARGET_ESP32C3 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + #include + #include + + #if ESP_IDF_VERSION_MAJOR < 5 + #include + #endif + + #if defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR >= 5 + #include + #else + #include + #endif + + #if ESP_IDF_VERSION_MAJOR >= 4 + /* #include */ #else #include #endif +/* If for some reason there's a desire to disable specific SHA HW on the C6: */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA there *is* SHA HW on C6 */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 there *is* SHA224 HW on C6 */ +/* #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 */ +/* #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 there *is* SHA225 HW on C6 */ + + /* Code will fall back to SW with warning if these are removed: + * note there is no SHA384/SHA512 HW on C6 */ + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + /***** END CONFIG_IDF_TARGET_ESP32C6 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32H2) + /* wolfSSL Hardware Acceleration not yet implemented. Note: no WiFi. */ + #define NO_ESP32_CRYPT + /***** END CONFIG_IDF_TARGET_ESP32H2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S2) + #include "soc/dport_reg.h" + #include + #if defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR >= 5 + #include + #else + #include + #endif + #define ESP_PROHIBIT_SMALL_X 0 + /***** END CONFIG_IDF_TARGET_ESP32S2 *****/ + +#elif defined(CONFIG_IDF_TARGET_ESP32S3) + #include "soc/dport_reg.h" + #include + #if defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR >= 5 + #include + #else + #include + #endif + #define ESP_PROHIBIT_SMALL_X 0 + /***** END CONFIG_IDF_TARGET_ESP32S3 *****/ +#else + /* Unknown: Not yet supported. Assume no HW. */ + #define NO_ESP32_CRYPT + /***** END CONFIG_IDF_TARGET_[x] config unknown *****/ + +#endif /* CONFIG_IDF_TARGET target check */ + +#ifdef NO_ESP32_CRYPT + /* There's no hardware acceleration, so ensure everything is disabled: */ + #undef NO_WOLFSSL_ESP32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #undef NO_WOLFSSL_ESP32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_AES + #undef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI #endif +#ifdef NO_WOLFSSL_ESP32_CRYPT_HASH + /* There's no SHA hardware acceleration, so ensure all are disabled: */ + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224 + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256 + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 + #undef NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + #define NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 + /***** END CONFIG_IDF_TARGET_[x] config unknown *****/ + +#endif /* CONFIG_IDF_TARGET target check */ + +#ifdef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + /* With RSA disabled (or not available), explicitly disable each: */ + #undef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL + #undef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD + #undef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD +#else + #if defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL) && \ + defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD) && \ + defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD) + #warning "MP_MUL, MULMOD, EXPTMOD all turned off. " && \ + "Define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI to disable all math HW" + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #endif +#endif /* !NO_WOLFSSL_ESP32_CRYPT_RSA_PRI */ + +#if defined(USE_ESP_DPORT_ACCESS_READ_BUFFER) + #define ESP_NO_ERRATA_MITIGATION +#endif + +#ifdef SINGLE_THREADED + #ifdef WOLFSSL_DEBUG_MUTEX + #undef ESP_MONITOR_HW_TASK_LOCK + #define ESP_MONITOR_HW_TASK_LOCK + #endif +#else + /* Unless explicitly disabled, monitor task lock when not single thread. */ + #ifndef ESP_DISABLE_HW_TASK_LOCK + #define ESP_MONITOR_HW_TASK_LOCK + #endif +#endif + +/* Resulting settings review for syntax highlighter review only: */ +#if defined(NO_ESP32_CRYPT) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_AES) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) || \ + defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) || \ + defined(WOLFSSL_ESP32_CRYPT_DEBUG) +#endif #ifdef __cplusplus - extern "C" { +extern "C" +{ #endif -int esp_ShowExtendedSystemInfo(void); +/* +****************************************************************************** +** Some common esp utilities +****************************************************************************** +*/ -int esp_CryptHwMutexInit(wolfSSL_Mutex* mutex); -int esp_CryptHwMutexLock(wolfSSL_Mutex* mutex, TickType_t xBloxkTime); -int esp_CryptHwMutexUnLock(wolfSSL_Mutex* mutex); + WOLFSSL_LOCAL int esp_ShowExtendedSystemInfo(void); -#ifndef NO_AES + WOLFSSL_LOCAL esp_err_t esp_DisableWatchdog(void); + WOLFSSL_LOCAL esp_err_t esp_EnableWatchdog(void); + + /* Compare MATH_INT_T A to MATH_INT_T B + * During debug, the strings name_A and name_B can help + * identify variable name. */ + WOLFSSL_LOCAL int esp_mp_cmp(char* name_A, MATH_INT_T* A, + char* name_B, MATH_INT_T* B); + + /* Show MATH_INT_T value attributes. */ + WOLFSSL_LOCAL int esp_show_mp_attributes(char* c, MATH_INT_T* X); + + /* Show MATH_INT_T value. + * + * Calls esp_show_mp_attributes(). + * + * During debug, the string name_A can help + * identify variable name. */ + WOLFSSL_LOCAL int esp_show_mp(char* name_X, MATH_INT_T* X); + + /* To use a Mutex, it must first be initialized. */ + WOLFSSL_LOCAL int esp_CryptHwMutexInit(wolfSSL_Mutex* mutex); + + /* Take the mutex to indicate the HW is in use. Wait up to [block_time]. + * When the HW in use the mutex will be locked. */ + WOLFSSL_LOCAL int esp_CryptHwMutexLock(wolfSSL_Mutex* mutex, + TickType_t block_time); + + /* Release the mutex to indicate the HW is no longer in use. */ + WOLFSSL_LOCAL int esp_CryptHwMutexUnLock(wolfSSL_Mutex* mutex); + + /* Validation active check. When active, we'll fall back to SW. */ + WOLFSSL_LOCAL int esp_hw_validation_active(void); + +/* +******************************************************************************* +** AES features: +******************************************************************************* +*/ + +#ifndef NO_AES #if ESP_IDF_VERSION_MAJOR >= 4 #include "esp32/rom/aes.h" + #elif defined(CONFIG_IDF_TARGET_ESP8266) + /* no hardware includes for ESP8266*/ #else #include "rom/aes.h" #endif - typedef enum tagES32_AES_PROCESS { - ESP32_AES_LOCKHW = 1, + typedef enum tagES32_AES_PROCESS /* TODO what's this ? */ + { + ESP32_AES_LOCKHW = 1, ESP32_AES_UPDATEKEY_ENCRYPT = 2, ESP32_AES_UPDATEKEY_DECRYPT = 3, ESP32_AES_UNLOCKHW = 4 } ESP32_AESPROCESS; struct Aes; /* see aes.h */ - int wc_esp32AesCbcEncrypt(struct Aes* aes, byte* out, const byte* in, word32 sz); - int wc_esp32AesCbcDecrypt(struct Aes* aes, byte* out, const byte* in, word32 sz); - int wc_esp32AesEncrypt(struct Aes *aes, const byte* in, byte* out); - int wc_esp32AesDecrypt(struct Aes *aes, const byte* in, byte* out); - +#if defined(WOLFSSL_HW_METRICS) + WOLFSSL_LOCAL int esp_hw_show_aes_metrics(void); + WOLFSSL_LOCAL int wc_esp32AesUnupportedLengthCountAdd(void); #endif + WOLFSSL_LOCAL int wc_esp32AesSupportedKeyLenValue(int keylen); + WOLFSSL_LOCAL int wc_esp32AesSupportedKeyLen(struct Aes* aes); + + WOLFSSL_LOCAL int wc_esp32AesCbcEncrypt(struct Aes* aes, + byte* out, + const byte* in, + word32 sz); + WOLFSSL_LOCAL int wc_esp32AesCbcDecrypt(struct Aes* aes, + byte* out, + const byte* in, + word32 sz); + WOLFSSL_LOCAL int wc_esp32AesEncrypt( struct Aes* aes, + const byte* in, + byte* out); + WOLFSSL_LOCAL int wc_esp32AesDecrypt( struct Aes* aes, + const byte* in, + byte* out); +#endif /* ! NO_AES */ -#ifdef WOLFSSL_ESP32WROOM32_CRYPT_DEBUG +#ifdef WOLFSSL_ESP32_CRYPT_DEBUG void wc_esp32TimerStart(void); - uint64_t wc_esp32elapsedTime(void); + uint64_t wc_esp32elapsedTime(void); + +#endif /* WOLFSSL_ESP32_CRYPT_DEBUG */ -#endif /* WOLFSSL_ESP32WROOM32_CRYPT_DEBUG */ +/* +******************************************************************************* +** Cryptographic hash algorithms (e.g. SHA[x]): +******************************************************************************* +*/ -#if !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) && \ +#if !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ (!defined(NO_SHA) || !defined(NO_SHA256) || \ defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512) \ ) - /* RAW hash function APIs are not implemented with esp32 hardware acceleration*/ - #define WOLFSSL_NO_HASH_RAW #define SHA_CTX ETS_SHAContext #if ESP_IDF_VERSION_MAJOR >= 4 - #include "esp32/rom/sha.h" - #elif defined(CONFIG_IDF_TARGET_ESP32S3) - #include "esp32s3/rom/sha.h" + #if defined(CONFIG_IDF_TARGET_ESP32) + #include "esp32/rom/sha.h" + #define WC_ESP_SHA_TYPE enum SHA_TYPE + #elif defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP8684) + #include "esp32c2/rom/sha.h" + #define WC_ESP_SHA_TYPE SHA_TYPE + #elif defined(CONFIG_IDF_TARGET_ESP32C3) + #include "esp32c3/rom/sha.h" + #define WC_ESP_SHA_TYPE SHA_TYPE + #elif defined(CONFIG_IDF_TARGET_ESP32C6) + #include "esp32c6/rom/sha.h" + #define WC_ESP_SHA_TYPE SHA_TYPE + #elif defined(CONFIG_IDF_TARGET_ESP32H2) + #include "esp32h2/rom/sha.h" + #define WC_ESP_SHA_TYPE SHA_TYPE + #elif defined(CONFIG_IDF_TARGET_ESP32S2) + #include "esp32s2/rom/sha.h" + #define WC_ESP_SHA_TYPE SHA_TYPE + #elif defined(CONFIG_IDF_TARGET_ESP32S3) + #include "esp32s3/rom/sha.h" + #define WC_ESP_SHA_TYPE SHA_TYPE + #else + #include "rom/sha.h" + #define WC_ESP_SHA_TYPE SHA_TYPE + #endif + #elif defined(CONFIG_IDF_TARGET_ESP8266) + /* there's no HW to include */ #else #include "rom/sha.h" #endif @@ -136,13 +719,20 @@ ESP32_SHA_HW = 1, ESP32_SHA_SW = 2, ESP32_SHA_HW_COPY = 3, + ESP32_SHA_FREED = 4, ESP32_SHA_FAIL_NEED_UNROLL = -1 } ESP32_MODE; typedef struct { - /* pointer to object the initialized HW; to track copies */ - void* initializer; + #if defined(WOLFSSL_STACK_CHECK) + word32 first_word; + #endif + /* Pointer to object that initialized HW, to track copies: */ + uintptr_t initializer; + #if defined(ESP_MONITOR_HW_TASK_LOCK) && !defined(SINGLE_THREADED) + TaskHandle_t task_owner; + #endif /* an ESP32_MODE value; typically: ** 0 init, @@ -154,56 +744,94 @@ ** ** the Espressif type: SHA1, SHA256, etc. */ - enum SHA_TYPE sha_type; + + WC_ESP_SHA_TYPE sha_type; /* we'll keep track of our own locks. ** actual enable/disable only occurs for ref_counts[periph] == 0 ** ** see ref_counts[periph] in periph_ctrl.c */ - byte lockDepth:7; /* 7 bits for a small number, pack with below. */ + byte lockDepth : 7; /* 7 bits for a small number, pack with below. */ /* 0 (false) this is NOT first block. ** 1 (true ) this is first block. */ - byte isfirstblock:1; /* 1 bit only for true / false */ + byte isfirstblock : 1; /* 1 bit only for true / false */ + #if defined(WOLFSSL_STACK_CHECK) + word32 last_word; + #endif } WC_ESP32SHA; - int esp_sha_init(WC_ESP32SHA* ctx, enum wc_HashType hash_type); - int esp_sha_init_ctx(WC_ESP32SHA* ctx); - int esp_sha_try_hw_lock(WC_ESP32SHA* ctx); - int esp_sha_hw_unlock(WC_ESP32SHA* ctx); + WOLFSSL_LOCAL int esp_sha_need_byte_reversal(WC_ESP32SHA* ctx); + WOLFSSL_LOCAL int esp_sha_init(WC_ESP32SHA* ctx, + enum wc_HashType hash_type); + WOLFSSL_LOCAL int esp_sha_init_ctx(WC_ESP32SHA* ctx); + WOLFSSL_LOCAL int esp_sha_try_hw_lock(WC_ESP32SHA* ctx); + WOLFSSL_LOCAL int esp_sha_hw_unlock(WC_ESP32SHA* ctx); + + /* esp_sha_hw_islocked: returns 0 if not locked, otherwise owner address */ + WOLFSSL_LOCAL uintptr_t esp_sha_hw_islocked(WC_ESP32SHA* ctx); + + /* esp_sha_hw_in_use returns 1 (true) if SHA HW in use, otherwise 0 */ + WOLFSSL_LOCAL int esp_sha_hw_in_use(void); + WOLFSSL_LOCAL int esp_sha_call_count(void); + WOLFSSL_LOCAL int esp_sha_lock_count(void); + WOLFSSL_LOCAL uintptr_t esp_sha_release_unfinished_lock(WC_ESP32SHA* ctx); + WOLFSSL_LOCAL uintptr_t esp_sha_set_stray(WC_ESP32SHA* ctx); +#ifndef NO_SHA struct wc_Sha; - int esp_sha_ctx_copy(struct wc_Sha* src, struct wc_Sha* dst); - int esp_sha_digest_process(struct wc_Sha* sha, byte blockprocess); - int esp_sha_process(struct wc_Sha* sha, const byte* data); - - #ifndef NO_SHA256 - struct wc_Sha256; - int esp_sha224_ctx_copy(struct wc_Sha256* src, struct wc_Sha256* dst); - int esp_sha256_ctx_copy(struct wc_Sha256* src, struct wc_Sha256* dst); - int esp_sha256_digest_process(struct wc_Sha256* sha, byte blockprocess); - int esp_sha256_process(struct wc_Sha256* sha, const byte* data); - int esp32_Transform_Sha256_demo(struct wc_Sha256* sha256, const byte* data); - #endif + WOLFSSL_LOCAL int esp_sha_ctx_copy(struct wc_Sha* src, struct wc_Sha* dst); + WOLFSSL_LOCAL int esp_sha_digest_process(struct wc_Sha* sha, + byte blockprocess); + WOLFSSL_LOCAL int esp_sha_process(struct wc_Sha* sha, const byte* data); +#endif /* NO_SHA */ + +#ifdef WOLFSSL_DEBUG_MUTEX + /* Testing HW release in task that did not lock: */ + extern WC_ESP32SHA* stray_ctx; +#endif + +#ifndef NO_SHA256 + struct wc_Sha256; + WOLFSSL_LOCAL int esp_sha224_ctx_copy(struct wc_Sha256* src, + struct wc_Sha256* dst); + WOLFSSL_LOCAL int esp_sha256_ctx_copy(struct wc_Sha256* src, + struct wc_Sha256* dst); + WOLFSSL_LOCAL int esp_sha256_digest_process(struct wc_Sha256* sha, + byte blockprocess); + WOLFSSL_LOCAL int esp_sha256_process(struct wc_Sha256* sha, + const byte* data); + WOLFSSL_LOCAL int esp32_Transform_Sha256_demo(struct wc_Sha256* sha256, + const byte* data); +#endif - /* TODO do we really call esp_sha512_process for WOLFSSL_SHA384 ? */ #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) - struct wc_Sha512; - int esp_sha384_ctx_copy(struct wc_Sha512* src, struct wc_Sha512* dst); - int esp_sha512_ctx_copy(struct wc_Sha512* src, struct wc_Sha512* dst); - int esp_sha512_process(struct wc_Sha512* sha); - int esp_sha512_digest_process(struct wc_Sha512* sha, byte blockproc); - #endif + struct wc_Sha512; + WOLFSSL_LOCAL int esp_sha384_ctx_copy(struct wc_Sha512* src, + struct wc_Sha512* dst); + WOLFSSL_LOCAL int esp_sha512_ctx_copy(struct wc_Sha512* src, + struct wc_Sha512* dst); + WOLFSSL_LOCAL int esp_sha512_process(struct wc_Sha512* sha); + WOLFSSL_LOCAL int esp_sha512_digest_process(struct wc_Sha512* sha, + byte blockproc); +#endif -#endif /* NO_SHA && */ +#endif /* NO_SHA && etc */ +/* +******************************************************************************* +** RSA Big Math +******************************************************************************* +*/ + #if !defined(NO_RSA) || defined(HAVE_ECC) #if !defined(ESP_RSA_TIMEOUT_CNT) #define ESP_RSA_TIMEOUT_CNT 0x249F00 #endif +#ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD /* * The parameter names in the Espressif implementation are arbitrary. * @@ -214,29 +842,150 @@ /* Z = (X ^ Y) mod M : Espressif generic notation */ /* Y = (G ^ X) mod P : wolfSSL DH reference notation */ - int esp_mp_exptmod(MATH_INT_T* X, /* G */ - MATH_INT_T* Y, /* X */ - word32 Xbits, /* Ys typically = mp_count_bits (X) */ - MATH_INT_T* M, /* P */ - MATH_INT_T* Z); /* Y */ + WOLFSSL_LOCAL int esp_mp_exptmod(MATH_INT_T* X, /* G */ + MATH_INT_T* Y, /* X */ + MATH_INT_T* M, /* P */ + MATH_INT_T* Z); /* Y */ + + /* HW_MATH_ENABLED is typically used in wolfcrypt tests */ + #undef HW_MATH_ENABLED + #define HW_MATH_ENABLED +#endif /* ! NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_EXPTMOD */ +#ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL /* Z = X * Y */ - int esp_mp_mul(MATH_INT_T* X, - MATH_INT_T* Y, - MATH_INT_T* Z); - + WOLFSSL_LOCAL int esp_mp_mul(MATH_INT_T* X, + MATH_INT_T* Y, + MATH_INT_T* Z); + /* HW_MATH_ENABLED is typically used in wolfcrypt tests */ + #undef HW_MATH_ENABLED + #define HW_MATH_ENABLED +#endif /* ! NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MP_MUL */ +#ifndef NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD /* Z = X * Y (mod M) */ - int esp_mp_mulmod(MATH_INT_T* X, - MATH_INT_T* Y, - MATH_INT_T* M, - MATH_INT_T* Z); + WOLFSSL_LOCAL int esp_mp_mulmod(MATH_INT_T* X, + MATH_INT_T* Y, + MATH_INT_T* M, + MATH_INT_T* Z); + /* HW_MATH_ENABLED is typically used in wolfcrypt tests */ + #undef HW_MATH_ENABLED + #define HW_MATH_ENABLED +#endif /* ! NO_WOLFSSL_ESP32_CRYPT_RSA_PRI_MULMOD */ #endif /* !NO_RSA || HAVE_ECC*/ + +/* Optionally enable some metrics to count interesting usage */ +/* +******************************************************************************* +** Usage metrics +******************************************************************************* +*/ +#ifdef WOLFSSL_HW_METRICS + #define WOLFSSL_HAS_METRICS + + /* Allow sha256 code to keep track of SW fallback during active HW */ + WOLFSSL_LOCAL int esp_sw_sha256_count_add(void); + + /* show MP HW Metrics*/ + WOLFSSL_LOCAL int esp_hw_show_mp_metrics(void); + + /* show SHA HW Metrics*/ + WOLFSSL_LOCAL int esp_hw_show_sha_metrics(void); + + /* show all HW Metrics*/ + WOLFSSL_LOCAL int esp_hw_show_metrics(void); +#endif + + +#if defined(WOLFSSL_STACK_CHECK) + +WOLFSSL_LOCAL int esp_sha_stack_check(WC_ESP32SHA* sha); + +#endif /* WOLFSSL_STACK_CHECK */ + +/* + * Errata Mitigation. See + * https://www.espressif.com/sites/default/files/documentation/esp32_errata_en.pdf + * https://www.espressif.com/sites/default/files/documentation/esp32-c3_errata_en.pdf + * https://www.espressif.com/sites/default/files/documentation/esp32-s3_errata_en.pdf + */ +#define ESP_MP_HW_LOCK_MAX_DELAY ( TickType_t ) 0xffUL + +#if defined(CONFIG_IDF_TARGET_ESP32) && !defined(ESP_NO_ERRATA_MITIGATION) + /* some of these may be tuned for specific silicon versions */ + #define ESP_EM__MP_HW_WAIT_CLEAN {__asm__ __volatile__("memw");} + #define ESP_EM__MP_HW_WAIT_DONE {__asm__ __volatile__("memw");} + #define ESP_EM__POST_SP_MP_HW_LOCK {__asm__ __volatile__("memw");} + #define ESP_EM__PRE_MP_HW_WAIT_CLEAN {__asm__ __volatile__("memw");} + #define ESP_EM__PRE_DPORT_READ {__asm__ __volatile__("memw");} + #define ESP_EM__PRE_DPORT_WRITE {__asm__ __volatile__("memw");} + + /* Non-FIFO read may not be needed in chip revision v3.0. */ + #define ESP_EM__READ_NON_FIFO_REG {DPORT_SEQUENCE_REG_READ(0x3FF40078);} + + /* When the CPU frequency is 160 MHz, add six nops between two consecutive + ** FIFO reads. When the CPU frequency is 240 MHz, add seven nops between + ** two consecutive FIFO reads. See 3.16 */ + #if defined(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80) + #define ESP_EM__3_16 { \ + __asm__ __volatile__("memw"); \ + __asm__ __volatile__("nop"); /* 1 */ \ + __asm__ __volatile__("nop"); /* 2 */ \ + __asm__ __volatile__("nop"); /* 3 */ \ + __asm__ __volatile__("nop"); /* 4 */ \ + __asm__ __volatile__("nop"); /* 5 */ \ + }; + #elif defined(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160) + #define ESP_EM__3_16 { \ + __asm__ __volatile__("memw"); \ + __asm__ __volatile__("nop"); /* 1 */ \ + __asm__ __volatile__("nop"); /* 2 */ \ + __asm__ __volatile__("nop"); /* 3 */ \ + __asm__ __volatile__("nop"); /* 4 */ \ + __asm__ __volatile__("nop"); /* 5 */ \ + __asm__ __volatile__("nop"); /* 6 */ \ + __asm__ __volatile__("nop"); /* 7 */ \ + __asm__ __volatile__("nop"); /* 8 */ \ + }; + #elif defined(CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240) + #define ESP_EM__3_16 { \ + __asm__ __volatile__("memw"); \ + __asm__ __volatile__("nop"); /* 1 */ \ + __asm__ __volatile__("nop"); /* 2 */ \ + __asm__ __volatile__("nop"); /* 3 */ \ + __asm__ __volatile__("nop"); /* 4 */ \ + __asm__ __volatile__("nop"); /* 5 */ \ + __asm__ __volatile__("nop"); /* 6 */ \ + __asm__ __volatile__("nop"); /* 7 */ \ + __asm__ __volatile__("nop"); /* 8 */ \ + __asm__ __volatile__("nop"); /* 9 */ \ + }; + #else + #define ESP_EM__3_16 {}; + #endif + + #define ESP_EM__POST_PROCESS_START { ESP_EM__3_16 }; + #define ESP_EM__DPORT_FIFO_READ { ESP_EM__3_16 }; +#else + #define ESP_EM__3_16 {}; + #define ESP_EM__MP_HW_WAIT_CLEAN {}; + #define ESP_EM__MP_HW_WAIT_DONE {}; + #define ESP_EM__POST_SP_MP_HW_LOCK {}; + #define ESP_EM__PRE_MP_HW_WAIT_CLEAN {}; + #define ESP_EM__POST_PROCESS_START {}; + #define ESP_EM__DPORT_FIFO_READ {}; + #define ESP_EM__READ_NON_FIFO_REG {}; + #define ESP_EM__PRE_DPORT_READ {}; + #define ESP_EM__PRE_DPORT_WRITE {}; +#endif + /* end c++ wrapper */ #ifdef __cplusplus } #endif +#endif /* WOLFSSL_ESPIDF (entire contents excluded when not Espressif ESP-IDF) */ + #endif /* __ESP32_CRYPT_H__ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,345 @@ +/* renesas-fspsm-crypt.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef __RENESAS_FSPSM_CRYPT_H__ +#define __RENESAS_FSPSM_CRYPT_H__ + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define WOLFSSL_FSPSM_ILLEGAL_CIPHERSUITE -1 +#define MAX_FSPSM_CBINDEX 5 + +typedef void* FSPSM_W_KEYVAR; + +/* flsgas related to TLS */ +struct FSPSM_tls_flg_ST { + uint8_t pk_key_set:1; + uint8_t session_key_set:1; +}; + +/* flags Crypt Only */ +struct FSPSM_key_flg_ST { + uint8_t aes256_installedkey_set:1; + uint8_t aes128_installedkey_set:1; + uint8_t rsapri2048_installedkey_set:1; + uint8_t rsapub2048_installedkey_set:1; + uint8_t rsapri1024_installedkey_set:1; + uint8_t rsapub1024_installedkey_set:1; + uint8_t message_type:1;/*message 0, hashed 1*/ +}; + +typedef struct FSPSM_tag_ST { + /* unique number for each session */ + int devId; + #if defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ + !defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + /* out from R_SCE_TLS_ServerKeyExchangeVerify */ + uint32_t + encrypted_ephemeral_ecdh_public_key[FSPSM_TLS_ENCRYPTED_ECCPUBKEY_SZ]; + /* out from R_SCE_TLS_ECC_secp256r1_EphemeralWrappedKeyPairGenerate */ + sce_tls_p256_ecc_wrapped_key_t ecc_p256_wrapped_key; + uint8_t ecc_ecdh_public_key[HW_SCE_ECC_PUBLIC_KEY_BYTE_SIZE]; + + uint32_t masterSecret[FSPSM_TLS_MASTERSECRET_SIZE/4]; + uint8_t clientRandom[FSPSM_TLS_CLIENTRANDOM_SZ]; + uint8_t serverRandom[FSPSM_TLS_SERVERRANDOM_SZ]; + uint8_t cipher; + + #endif + + /* installed key handling */ + /* aes */ + FSPSM_W_KEYVAR wrapped_key_aes256; + FSPSM_W_KEYVAR wrapped_key_aes128; + + #if defined(WOLFSSL_RENESAS_FSPSM_CRYPTONLY) + /* rsa */ + FSPSM_W_KEYVAR wrapped_key_rsapri2048; + FSPSM_W_KEYVAR wrapped_key_rsapub2048; + FSPSM_W_KEYVAR wrapped_key_rsapri1024; + FSPSM_W_KEYVAR wrapped_key_rsapub1024; + #endif + + #if defined(WOLFSSL_RENESAS_RSIP) + uint8_t hash_type; + #endif + /* key status flags */ + /* flag whether encrypted ec key is set */ + union { + uint8_t chr; + struct FSPSM_tls_flg_ST bits; + } keyflgs_tls; + /* key status flags */ + /* flags shows status if wrapped keys are installed */ + union { + uint8_t chr; + struct FSPSM_key_flg_ST bits; + } keyflgs_crypt; +} FSPSM_ST; + +typedef struct tagPKCbInfo { + FSPSM_ST *user_PKCbInfo[MAX_FSPSM_CBINDEX]; + uint32_t num_session; +} FSPSM_ST_PKC; + +#ifdef WOLFSSL_RENESAS_FSPSM_TLS +typedef struct +{ + uint8_t *encrypted_provisioning_key; + uint8_t *iv; + uint8_t *encrypted_user_tls_key; + uint32_t encrypted_user_tls_key_type; + FSPSM_CACERT_PUB_WKEY user_rsa2048_tls_wrappedkey; +} fspsm_key_data; +#endif + +struct WOLFSSL; +struct WOLFSSL_CTX; +struct ecc_key; + +WOLFSSL_LOCAL int wc_fspsm_Open(); +WOLFSSL_LOCAL void wc_fspsm_Close(); +WOLFSSL_LOCAL int wc_fspsm_hw_lock(); +WOLFSSL_LOCAL void wc_fspsm_hw_unlock( void ); +WOLFSSL_LOCAL int wc_fspsm_usable(const struct WOLFSSL *ssl, + uint8_t session_key_generated); + +typedef struct { + FSPSM_AES_PWKEY wrapped_key; + word32 keySize; +#ifdef WOLFSSL_RENESAS_FSPSM_TLS + byte setup; +#endif +} FSPSM_AES_CTX; + +struct Aes; +WOLFSSL_LOCAL void wc_fspsm_Aesfree(struct Aes* aes); +WOLFSSL_LOCAL int wc_fspsm_AesCbcEncrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz); +WOLFSSL_LOCAL int wc_fspsm_AesCbcDecrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz); + +WOLFSSL_LOCAL int wc_fspsm_AesGcmEncrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz, + byte* iv, word32 ivSz, + byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, + void* ctx); + +WOLFSSL_LOCAL int wc_fspsm_AesGcmDecrypt(struct Aes* aes, byte* out, + const byte* in, word32 sz, + const byte* iv, word32 ivSz, + const byte* authTag, word32 authTagSz, + const byte* authIn, word32 authInSz, + void* ctx); + +#if (!defined(NO_SHA) || !defined(NO_SHA256) || defined(WOLFSSL_SH224) || \ + defined(WOLFSSL_SHA384) || defined(WOLFSSL_SHA512)) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + +typedef enum { +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + FSPSM_SHA256 = 1, +#elif defined(WOLFSSL_RENESAS_RSIP) + FSPSM_SHA1 = RSIP_HASH_TYPE_SHA1, + FSPSM_SHA224 = RSIP_HASH_TYPE_SHA224, + FSPSM_SHA256 = RSIP_HASH_TYPE_SHA256, + FSPSM_SHA384 = RSIP_HASH_TYPE_SHA384, + FSPSM_SHA512 = RSIP_HASH_TYPE_SHA512, + FSPSM_SHA512_224 = RSIP_HASH_TYPE_SHA512_224, + FSPSM_SHA512_256 = RSIP_HASH_TYPE_SHA512_256, +#endif +} FSPSM_SHA_TYPE; + +typedef struct { + void* heap; + word32 sha_type; +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + word32 used; + word32 len; + byte* msg; +#endif +#if defined(WOLFSSL_RENESAS_RSIP) + FSPSM_SHA_HANDLE handle; +#endif +#if defined(WOLF_CRYPTO_CB) + word32 flags; + int devId; +#endif +} wolfssl_FSPSM_Hash; + +/* RAW hash function APIs are not implemented with SCE */ +#undef WOLFSSL_NO_HASH_RAW +#define WOLFSSL_NO_HASH_RAW + +#if !defined(NO_SHA) && defined(WOLFSSL_RENESAS_RSIP) + typedef wolfssl_FSPSM_Hash wc_Sha; +#endif + +#if defined(WOLFSSL_SHA224) && defined(WOLFSSL_RENESAS_RSIP) + typedef wolfssl_FSPSM_Hash wc_Sha224; + #define WC_SHA224_TYPE_DEFINED +#endif + +#if !defined(NO_SHA256) && \ + (defined(WOLFSSL_RENESAS_SCEPROTECT) || defined(WOLFSSL_RENESAS_RSIP)) + typedef wolfssl_FSPSM_Hash wc_Sha256; +#endif + +#if defined(WOLFSSL_SHA384) && defined(WOLFSSL_RENESAS_RSIP) + typedef wolfssl_FSPSM_Hash wc_Sha384; + #define WC_SHA384_TYPE_DEFINED +#endif + +#if defined(WOLFSSL_SHA512) && defined(WOLFSSL_RENESAS_RSIP) + typedef wolfssl_FSPSM_Hash wc_Sha512; + typedef wolfssl_FSPSM_Hash wc_Sha512_224; + typedef wolfssl_FSPSM_Hash wc_Sha512_256; + #define WC_SHA512_TYPE_DEFINED +#endif + +#endif /* NO_SHA */ + +#if defined(WOLFSSL_RENESAS_FSPSM_TLS) && \ + !defined(WOLFSSL_RENESAS_FSPSM_CRYPT_ONLY) + +WOLFSSL_LOCAL int wc_fspsm_tls_RootCertVerify( + const uint8_t* cert, uint32_t cert_len, + uint32_t key_n_start, uint32_t key_n_len, + uint32_t key_e_start, uint32_t key_e_len, + uint32_t cm_row); + +WOLFSSL_LOCAL int wc_sce_tls_CertVerify( + const uint8_t* cert, uint32_t certSz, + const uint8_t* signature, uint32_t sigSz, + uint32_t key_n_start, uint32_t key_n_len, + uint32_t key_e_start, uint32_t key_e_len, + uint8_t* sce_encRsaKeyIdx); + + +WOLFSSL_LOCAL int wc_fspsm_generatePremasterSecret( + uint8_t* premaster, + uint32_t preSz); + +WOLFSSL_LOCAL int wc_fspsm_generateEncryptPreMasterSecret( + struct WOLFSSL* ssl, + uint8_t* out, + uint32_t* outSz); + +WOLFSSL_LOCAL int wc_fspsm_Sha256GenerateHmac( + const struct WOLFSSL *ssl, + const uint8_t* myInner, + uint32_t innerSz, + const uint8_t* in, + uint32_t sz, + uint8_t* digest); + +WOLFSSL_LOCAL int wc_fspsm_Sha256VerifyHmac( + const struct WOLFSSL *ssl, + const uint8_t* message, + uint32_t messageSz, + uint32_t macSz, + uint32_t content); + +WOLFSSL_LOCAL int wc_fspsm_storeKeyCtx( + struct WOLFSSL* ssl, + FSPSM_ST* info); + +WOLFSSL_LOCAL int wc_fspsm_generateVerifyData( + const uint8_t* ms, /* master secret */ + const uint8_t* side, + const uint8_t* handshake_hash, + uint8_t* hashes /* out */); + +WOLFSSL_LOCAL int wc_fspsm_generateSessionKey( + struct WOLFSSL* ssl, + FSPSM_ST* cbInfo, + int devId); + +WOLFSSL_LOCAL int wc_fspsm_generateMasterSecret( + uint8_t cipherSuiteFirst, + uint8_t cipherSuite, + const uint8_t *pr, /* pre-master */ + const uint8_t *cr, /* client random */ + const uint8_t *sr, /* server random */ + uint8_t *ms); + +WOLFSSL_LOCAL int wc_fspsm_RsaVerifyTLS(struct WOLFSSL* ssl, byte* sig, + uint32_t sigSz, uint8_t** out, + const byte* key, uint32_t keySz, void* ctx); +WOLFSSL_LOCAL int wc_fspsm_EccVerifyTLS(struct WOLFSSL* ssl, + const uint8_t* sig, uint32_t sigSz, + const uint8_t* hash, uint32_t hashSz, + const uint8_t* key, uint32_t keySz, + int* result, void* ctx); +WOLFSSL_LOCAL int wc_fspsm_tls_CertVerify( + const uint8_t* cert, uint32_t certSz, + const uint8_t* signature, uint32_t sigSz, + uint32_t key_n_start,uint32_t key_n_len, + uint32_t key_e_start,uint32_t key_e_len, + uint8_t* fspsm_encPublickey); + +/* Callback for EccShareSecret */ +WOLFSSL_LOCAL int fspsm_EccSharedSecret(struct WOLFSSL* ssl, + struct ecc_key* otherKey, + uint8_t* pubKeyDer, unsigned int* pubKeySz, + uint8_t* out, unsigned int* outlen, int side, void* ctx); + +/* user API */ +WOLFSSL_API void FSPSM_INFORM_FUNC( + uint8_t* encrypted_provisioning_key, + uint8_t* iv, + uint8_t* encrypted_user_tls_key, + uint32_t encrypted_user_tls_key_type); + +WOLFSSL_API void FSPSM_CALLBACK_FUNC(struct WOLFSSL_CTX* ctx); +WOLFSSL_API int FSPSM_CALLBACK_CTX_FUNC(struct WOLFSSL* ssl, void* user_ctx); +WOLFSSL_API void FSPSM_INFORM_CERT_SIGN(const uint8_t *sign); + + +#endif /* WOLFSSL_RENESAS_FSPSM_TLS && + * !WOLFSSL_RENESAS_FSPSM_CRYPT_ONLY */ + +typedef struct FSPSM_RSA_CTX { + FSPSM_RSA1024_WPI_KEY *wrapped_pri1024_key; + FSPSM_RSA1024_WPB_KEY *wrapped_pub1024_key; + FSPSM_RSA2048_WPI_KEY *wrapped_pri2048_key; + FSPSM_RSA2048_WPB_KEY *wrapped_pub2048_key; + word32 keySz; +} FSPSM_RSA_CTX; + +/* rsa */ +struct RsaKey; +struct WC_RNG; +WOLFSSL_LOCAL void wc_fspsm_RsaKeyFree(struct RsaKey *key); +WOLFSSL_LOCAL int wc_fspsm_RsaFunction(const byte* in, word32 inLen, byte* out, + word32 *outLen, int type, struct RsaKey* key, struct WC_RNG* rng); +WOLFSSL_LOCAL int wc_fspsm_MakeRsaKey(struct RsaKey* key, int size, void* ctx); +WOLFSSL_LOCAL int wc_fspsm_RsaSign(const byte* in, word32 inLen, byte* out, + word32* outLen, struct RsaKey* key, void* ctx); +WOLFSSL_LOCAL int wc_fspsm_RsaVerify(const byte* in, word32 inLen, byte* out, + word32* outLen,struct RsaKey* key, void* ctx); +WOLFSSL_LOCAL int wc_fspsm_GenerateRandBlock(byte* output, word32 size); +#endif /* __RENESAS_FSPSM_CRYPT_H__ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-types.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-types.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-types.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-types.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,325 @@ +/* renesas-fsp-crypt.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ +#ifndef __RENESAS_FSP_CRYPT_H__ +#define __RENESAS_FSP_CRYPT_H__ + +#include +#include + + +#if defined(WOLFSSL_RENESAS_SCEPROTECT) + + #include "r_sce.h" + + #define FSPSM_W_KEYVAR renesas_sce_wrappedkey + #define FSPSM_tls_flg_ST sce_keyflgs_tls + #define FSPSM_key_flg_ST sce_keyflgs_cryt + #define FSPSM_tag_ST tagUser_SCEPKCbInfo + #define FSPSM_ST User_SCEPKCbInfo + #define FSPSM_ST_PKC SCE_PKCbInfo + + /* map SCE API to macro */ + #define FSPSM_INSTANCE sce_instance_ctrl_t + #define gFSPSM_ctrl sce_ctrl + #define FSPSM_CONFIG sce_cfg_t + #define gFSPSM_cfg sce_cfg + #define H_INSTANCE _handle + #define FSPSM_OPEN R_SCE_Open + #define FSPSM_CLOSE R_SCE_Close + + /* rand generation func */ + #define R_RANDOM_GEN(b) R_SCE_RandomNumberGenerate(b) + + #define FSPSM_ROOTCA_RSA2048 \ + R_SCE_TLS_RootCertificateRSA2048PublicKeyInstall + #define FSPSM_TLS_SVRKEYExVfy R_SCE_TLS_ServerKeyExchangeVerify + #define FSPSM_TLS_ECCS256R1_KPG \ + R_SCE_TLS_ECC_secp256r1_EphemeralWrappedKeyPairGenerate + #define FSPSM_TLS_PREMASTERGEN \ + R_SCE_TLS_PreMasterSecretGenerateForECC_secp256r1 + /* hmac */ + #define FSPSM_S256HMAC_GInt R_SCE_SHA256HMAC_GenerateInit + #define FSPSM_S256HMAC_GUp R_SCE_SHA256HMAC_GenerateUpdate + #define FSPSM_S256HMAC_GFnl R_SCE_SHA256HMAC_GenerateFinal + #define FSPSM_S256HMAC_VInt R_SCE_SHA256HMAC_VerifyInit + #define FSPSM_S256HMAC_VUp R_SCE_SHA256HMAC_VerifyUpdate + #define FSPSM_S256HMAC_VFnl R_SCE_SHA256HMAC_VerifyFinal + #define FSPSM_HMAC_HANDLE sce_hmac_sha_handle_t + #define FSPSM_HMAC_WKEY sce_hmac_sha_wrapped_key_t + + /* TLS */ + #define FSPSM_SESSIONKEY_GEN_FUNC R_SCE_TLS_SessionKeyGenerate + #define FSPSM_MASTERSECRET_GEN_FUNC R_SCE_TLS_MasterSecretGenerate + #define FSPSM_PREGEN_FUNC R_SCE_TLS_PreMasterSecretGenerateForRSA2048 + #define FSPSM_PREGENENC_FUNC R_SCE_TLS_PreMasterSecretEncryptWithRSA2048 + + /* certificate */ + #define FSPSM_TLSCERT_VRY R_SCE_TLS_CertificateVerify + #define FSPSM_TLSROOTCERT_VRY R_SCE_TLS_RootCertificateVerify + #define FSPSM_CACERT_PUB_WKEY \ + sce_tls_ca_certification_public_wrapped_key_t + + /* verify data */ + #define FSPSM_VERIFY_DATA_FUNC R_SCE_TLS_VerifyDataGenerate + + /* aes */ + #define FSPSM_AES_WKEY sce_aes_wrapped_key_t + #define FSPSM_AES_PWKEY sce_aes_wrapped_key_t* + #define FSPSM_AESGCM_HANDLE sce_gcm_handle_t + #define FSPSM_AES_HANDLE sce_aes_handle_t + /* aes 128 cbc */ + #define FSPSM_AES128CBCEnc_Init R_SCE_AES128CBC_EncryptInit + #define FSPSM_AES128CBCEnc_Up R_SCE_AES128CBC_EncryptUpdate + #define FSPSM_AES128CBCEnc_Final R_SCE_AES128CBC_EncryptFinal + #define FSPSM_AES128CBCDec_Init R_SCE_AES128CBC_DecryptInit + #define FSPSM_AES128CBCDec_Up R_SCE_AES128CBC_DecryptUpdate + #define FSPSM_AES128CBCDec_Final R_SCE_AES128CBC_DecryptFinal + + /* aes 256 cbc */ + #define FSPSM_AES256CBCEnc_Init R_SCE_AES256CBC_EncryptInit + #define FSPSM_AES256CBCEnc_Up R_SCE_AES256CBC_EncryptUpdate + #define FSPSM_AES256CBCEnc_Final R_SCE_AES256CBC_EncryptFinal + #define FSPSM_AES256CBCDec_Init R_SCE_AES256CBC_DecryptInit + #define FSPSM_AES256CBCDec_Up R_SCE_AES256CBC_DecryptUpdate + #define FSPSM_AES256CBCDec_Final R_SCE_AES256CBC_DecryptFinal + + /* aes128 gcm */ + #define FSPSM_AES128GCMEnc_Init R_SCE_AES128GCM_EncryptInit + #define FSPSM_AES128GCMEnc_Up R_SCE_AES128GCM_EncryptUpdate + #define FSPSM_AES128GCMEnc_Final R_SCE_AES128GCM_EncryptFinal + #define FSPSM_AES128GCMDec_Init R_SCE_AES128GCM_DecryptInit + #define FSPSM_AES128GCMDec_Up R_SCE_AES128GCM_DecryptUpdate + #define FSPSM_AES128GCMDec_Final R_SCE_AES128GCM_DecryptFinal + + /* aes256 gcm */ + #define FSPSM_AES256GCMEnc_Init R_SCE_AES256GCM_EncryptInit + #define FSPSM_AES256GCMEnc_Up R_SCE_AES256GCM_EncryptUpdate + #define FSPSM_AES256GCMEnc_Final R_SCE_AES256GCM_EncryptFinal + #define FSPSM_AES256GCMDec_Init R_SCE_AES256GCM_DecryptInit + #define FSPSM_AES256GCMDec_Up R_SCE_AES256GCM_DecryptUpdate + #define FSPSM_AES256GCMDec_Final R_SCE_AES256GCM_DecryptFinal + + /* rsa */ + /* rsa data */ + #define FSPSM_RSA_DATA sce_rsa_byte_data_t + /* rsa 1024 key */ + #define FSPSM_RSA1024_WPA_KEY sce_rsa1024_wrapped_pair_key_t + #define FSPSM_RSA1024_WPB_KEY sce_rsa1024_public_wrapped_key_t + #define FSPSM_RSA1024_WPI_KEY sce_rsa1024_private_wrapped_key_t + /* rsa 2048 key */ + #define FSPSM_RSA2048_WPA_KEY sce_rsa2048_wrapped_pair_key_t + #define FSPSM_RSA2048_WPB_KEY sce_rsa2048_public_wrapped_key_t + #define FSPSM_RSA2048_WPI_KEY sce_rsa2048_private_wrapped_key_t + + /* rsa key gen */ + #define FSPSM_RSA1024_KEYPA_GEN(x,y) R_SCE_RSA1024_WrappedKeyPairGenerate\ + (x) + #define FSPSM_RSA2048_KEYPA_GEN(x,y) R_SCE_RSA2048_WrappedKeyPairGenerate\ + (x) + + /* rsa function */ + #define FSPSM_RSA1024_PKCSENC_FUNC(p,c,k) R_SCE_RSAES_PKCS1024_Encrypt\ + (p,c,k) + #define FSPSM_RSA2048_PKCSENC_FUNC(p,c,k) R_SCE_RSAES_PKCS2048_Encrypt\ + (p,c,k) + #define FSPSM_RSA1024_PKCSDEC_FUNC(p,c,k,l) R_SCE_RSAES_PKCS1024_Decrypt\ + (p,c,k) + #define FSPSM_RSA2048_PKCSDEC_FUNC(p,c,k,l) R_SCE_RSAES_PKCS2048_Decrypt\ + (p,c,k) + #define FSPSM_RSA1024_SIGN_FUNC(m,s,k,t) \ + R_SCE_RSASSA_PKCS1024_SignatureGenerate(m,s,k,t) + #define FSPSM_RSA2048_SIGN_FUNC(m,s,k,t) \ + R_SCE_RSASSA_PKCS2048_SignatureGenerate(m,s,k,t) + #define FSPSM_RSA1024_VRY_FUNC(m,s,k,t) \ + R_SCE_RSASSA_PKCS1024_SignatureVerify(m,s,k,t) + #define FSPSM_RSA2048_VRY_FUNC(m,s,k,t) \ + R_SCE_RSASSA_PKCS2048_SignatureVerify(m,s,k,t) + /* sha */ + #define FSPSM_SHA_HANDLE sce_sha_md5_handle_t + #define FSPSM_SHA256_Init R_SCE_SHA256_Init + #define FSPSM_SHA256_Up R_SCE_SHA256_Update + #define FSPSM_SHA256_Final R_SCE_SHA256_Final + + /* user API */ + #define FSPSM_INFORM_FUNC wc_sce_inform_user_keys + #define FSPSM_CALLBACK_FUNC wc_sce_set_callbacks + #define FSPSM_CALLBACK_CTX_FUNC wc_sce_set_callback_ctx + #define FSPSM_INFORM_CERT_SIGN wc_sce_inform_cert_sign + +#elif defined(WOLFSSL_RENESAS_RSIP) + + #include "r_rsip.h" + + /* structure, type so on */ + #define FSPSM_W_KEYVAR renesas_rsip_wrappedkey + #define FSPSM_tls_flg_ST rsip_keyflgs_tls + #define FSPSM_key_flg_ST rsip_keyflgs_cryt + #define FSPSM_tag_ST tagUser_RSIPPKCbInfo + #define FSPSM_ST User_RSIPPKCbInfo + #define FSPSM_ST_PKC RSIP_PKCbInfo + #define FSPSM_KEY_TYPE rsip_key_type_t + + #define FSPSM_INSTANCE rsip_instance_ctrl_t + #define gFSPSM_ctrl rsip_ctrl + #define FSPSM_CONFIG rsip_cfg_t + #define gFSPSM_cfg rsip_cfg + #define H_INSTANCE gFSPSM_ctrl + #define FSPSM_OPEN R_RSIP_Open + #define FSPSM_CLOSE R_RSIP_Close + + /* rnd generation func */ + #define R_RANDOM_GEN(b) R_RSIP_RandomNumberGenerate(&gFSPSM_ctrl,b) + /* sha 1*/ + #define FSPSM_SHA_HANDLE rsip_sha_handle_t + #define FSPSM_SHA1_Init _R_RSIP_SHA1_GenerateInit + #define FSPSM_SHA1_Up _R_RSIP_SHA_GenerateUpdate + #define FSPSM_SHA1_Final _R_RSIP_SHA_GenerateFinal + + /* sha 224 */ + #define FSPSM_SHA224_Init _R_RSIP_SHA224_GenerateInit + #define FSPSM_SHA224_Up _R_RSIP_SHA_GenerateUpdate + #define FSPSM_SHA224_Final _R_RSIP_SHA_GenerateFinal + + /* sha 256 */ + #define FSPSM_SHA256_Init _R_RSIP_SHA256_GenerateInit + #define FSPSM_SHA256_Up _R_RSIP_SHA_GenerateUpdate + #define FSPSM_SHA256_Final _R_RSIP_SHA_GenerateFinal + + /* sha 384 */ + #define FSPSM_SHA384_Init _R_RSIP_SHA384_GenerateInit + #define FSPSM_SHA384_Up _R_RSIP_SHA_GenerateUpdate + #define FSPSM_SHA384_Final _R_RSIP_SHA_GenerateFinal + + /* sha 512 */ + #define FSPSM_SHA512_Init _R_RSIP_SHA512_GenerateInit + #define FSPSM_SHA512_Up _R_RSIP_SHA_GenerateUpdate + #define FSPSM_SHA512_Final _R_RSIP_SHA_GenerateFinal + + /* sha 512 224*/ + #define FSPSM_SHA512_224_Init _R_RSIP_SHA512_224_GenerateInit + #define FSPSM_SHA512_224_Up _R_RSIP_SHA_GenerateUpdate + #define FSPSM_SHA512_224_Final _R_RSIP_SHA_GenerateFinal + + /* sha 512 256 */ + #define FSPSM_SHA512_256_Init _R_RSIP_SHA512_256_GenerateInit + #define FSPSM_SHA512_256_Up _R_RSIP_SHA_GenerateUpdate + #define FSPSM_SHA512_256_Final _R_RSIP_SHA_GenerateFinal + /* aes */ + #define FSPSM_AES_WKEY rsip_wrapped_key_t + #define FSPSM_AES_PWKEY rsip_wrapped_key_t* + #define FSPSM_AESGCM_HANDLE rsip_instance_ctrl_t* + #define FSPSM_AES_HANDLE rsip_instance_ctrl_t* + #define FSPSM_AES_KEYGEN_FUNC _R_RSIP_KeyGenerate + + /* aes 128 cbc */ + /* mode : RSIP_AES_MODE_CBC */ + #define FSPSM_AES128CBCEnc_Init _R_RSIP_AESCBC_Cipher_EncryptInit + #define FSPSM_AES128CBCEnc_Up _R_RSIP_AESCBC_Cipher_EncryptUpdate + #define FSPSM_AES128CBCEnc_Final _R_RSIP_AESCBC_Cipher_EncryptFinal + #define FSPSM_AES128CBCDec_Init _R_RSIP_AESCBC_Cipher_DecryptInit + #define FSPSM_AES128CBCDec_Up _R_RSIP_AESCBC_Cipher_DecryptUpdate + #define FSPSM_AES128CBCDec_Final _R_RSIP_AESCBC_Cipher_DecryptFinal + + /* aes 256 cbc */ + /* mode : RSIP_AES_MODE_CBC */ + #define FSPSM_AES256CBCEnc_Init _R_RSIP_AESCBC_Cipher_EncryptInit + #define FSPSM_AES256CBCEnc_Up _R_RSIP_AESCBC_Cipher_EncryptUpdate + #define FSPSM_AES256CBCEnc_Final _R_RSIP_AESCBC_Cipher_EncryptFinal + #define FSPSM_AES256CBCDec_Init _R_RSIP_AESCBC_Cipher_DecryptInit + #define FSPSM_AES256CBCDec_Up _R_RSIP_AESCBC_Cipher_DecryptUpdate + #define FSPSM_AES256CBCDec_Final _R_RSIP_AESCBC_Cipher_DecryptFinal + + /* aes128 gcm */ + #define FSPSM_AES128GCMEnc_Init _R_RSIP_AES_GCM_EncryptInit + #define FSPSM_AES128GCMEnc_Up _R_RSIP_AES_GCM_EncryptUpdate + #define FSPSM_AES128GCMEnc_Final _R_RSIP_AES_GCM_EncryptFinal + #define FSPSM_AES128GCMDec_Init _R_RSIP_AES_GCM_DecryptInit + #define FSPSM_AES128GCMDec_Up _R_RSIP_AES_GCM_DecryptUpdate + #define FSPSM_AES128GCMDec_Final _R_RSIP_AES_GCM_DecryptFinal + + /* aes256 gcm */ + #define FSPSM_AES256GCMEnc_Init _R_RSIP_AES_GCM_EncryptInit + #define FSPSM_AES256GCMEnc_Up _R_RSIP_AES_GCM_EncryptUpdate + #define FSPSM_AES256GCMEnc_Final _R_RSIP_AES_GCM_EncryptFinal + #define FSPSM_AES256GCMDec_Init _R_RSIP_AES_GCM_DecryptInit + #define FSPSM_AES256GCMDec_Up _R_RSIP_AES_GCM_DecryptUpdate + #define FSPSM_AES256GCMDec_Final _R_RSIP_AES_GCM_DecryptFinal + + /* rsa */ + /* rsa data */ + typedef struct { + uint8_t *pdata; + uint32_t data_length; + uint32_t data_type;/* no use for RSIP */ + uint32_t hash_type;/* for rsip, hash type */ + } tmpRSIP_RSA_DATA; + + #define FSPSM_RSA_DATA tmpRSIP_RSA_DATA + + /* rsa 1024 key */ + #define FSPSM_RSA1024_WPA_KEY rsip_wrapped_key_t + #define FSPSM_RSA1024_WPB_KEY rsip_wrapped_key_t + #define FSPSM_RSA1024_WPI_KEY rsip_wrapped_key_t + /* rsa 2048 key */ + #define FSPSM_RSA2048_WPA_KEY rsip_wrapped_key_t + #define FSPSM_RSA2048_WPB_KEY rsip_wrapped_key_t + #define FSPSM_RSA2048_WPI_KEY rsip_wrapped_key_t + + /* rsa key gen */ + #define FSPSM_RSA1024_KEYPA_GEN(x,y) R_RSIP_KeyPairGenerate\ + (&gFSPSM_ctrl, RSIP_KEY_PAIR_TYPE_RSA_1024,\ + x,y) + #define FSPSM_RSA2048_KEYPA_GEN(x,y) R_RSIP_KeyPairGenerate\ + (&gFSPSM_ctrl, RSIP_KEY_PAIR_TYPE_RSA_2048,\ + x,y) + + /* rsa function */ + /* encrypt */ + #define FSPSM_RSA1024_PKCSENC_FUNC(p,c,k) R_RSIP_RSAES_PKCS1_V1_5_Encrypt\ + (&gFSPSM_ctrl, k, (uint8_t const *const)(p)->pdata, \ + (uint32_t const)(p)->data_length, \ + (uint8_t *const)(c)->pdata); + + #define FSPSM_RSA2048_PKCSENC_FUNC(p,c,k) FSPSM_RSA1024_PKCSENC_FUNC(p,c,k) + /* decrypt */ + #define FSPSM_RSA1024_PKCSDEC_FUNC(c,p,k,l) R_RSIP_RSAES_PKCS1_V1_5_Decrypt\ + (&gFSPSM_ctrl, k, (uint8_t const *const)(c)->pdata, \ + (uint8_t *const)(p)->pdata,\ + (uint32_t *const)l, \ + (uint32_t const)(p)->data_length); + #define FSPSM_RSA2048_PKCSDEC_FUNC(c,p,k,l) \ + FSPSM_RSA1024_PKCSDEC_FUNC(c,p,k,l) + + /* sign */ + #define FSPSM_RSA1024_SIGN_FUNC(m,s,k,t) R_RSIP_RSASSA_PKCS1_V1_5_Sign\ + (&gFSPSM_ctrl, k, (m)->hash_type, (uint8_t const *const)(m)->pdata,\ + (uint8_t *const)(s)->pdata) + #define FSPSM_RSA2048_SIGN_FUNC(m,s,k,t) FSPSM_RSA1024_SIGN_FUNC(m,s,k,t) + + /* verify */ + #define FSPSM_RSA1024_VRY_FUNC(s,m,k,t) R_RSIP_RSASSA_PKCS1_V1_5_Verify\ + (&gFSPSM_ctrl, k, (m)->hash_type, (uint8_t const *const)(m)->pdata,\ + (uint8_t *const)(s)->pdata) + #define FSPSM_RSA2048_VRY_FUNC(s,m,k,t) FSPSM_RSA1024_VRY_FUNC(s,m,k,t) + +#endif + +#endif /* __RENESAS_FSP_CRYPT_H__ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,278 +0,0 @@ -/* renesas-sce-crypt.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ -#ifndef __RENESAS_SCE_CRYPT_H__ -#define __RENESAS_SCE_CRYPT_H__ - -#include "r_sce.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define SCE_SESSIONKEY_NONCE_SIZE 8 -#define WOLFSSL_SCE_ILLEGAL_CIPHERSUITE -1 - -#define MAX_SCE_CBINDEX 5 - -typedef void* renesas_sce_wrappedkey; - -/* flsgas related to TLS */ -struct sce_keyflgs_tls { - uint8_t pk_key_set:1; - uint8_t session_key_set:1; -}; - -/* flags Crypt Only */ -struct sce_keyflgs_cryt { - uint8_t aes256_installedkey_set:1; - uint8_t aes128_installedkey_set:1; - uint8_t rsapri2048_installedkey_set:1; - uint8_t rsapub2048_installedkey_set:1; - uint8_t rsapri1024_installedkey_set:1; - uint8_t rsapub1024_installedkey_set:1; - uint8_t message_type:1;/*message 0, hashed 1*/ -}; - -typedef struct tagUser_SCEPKCbInfo { - /* unique number for each session */ - int devId; - #if defined(WOLFSSL_RENESAS_SCEPROTECT) && \ - !defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - /* out from R_SCE_TLS_ServerKeyExchangeVerify */ - uint32_t encrypted_ephemeral_ecdh_public_key[SCE_TLS_ENCRYPTED_ECCPUBKEY_SZ]; - /* out from R_SCE_TLS_ECC_secp256r1_EphemeralWrappedKeyPairGenerate */ - sce_tls_p256_ecc_wrapped_key_t ecc_p256_wrapped_key; - uint8_t ecc_ecdh_public_key[HW_SCE_ECC_PUBLIC_KEY_BYTE_SIZE]; - - uint32_t sce_masterSecret[SCE_TLS_MASTERSECRET_SIZE/4]; - uint8_t sce_clientRandom[SCE_TLS_CLIENTRANDOM_SZ]; - uint8_t sce_serverRandom[SCE_TLS_SERVERRANDOM_SZ]; - uint8_t sce_cipher; - - #endif - - /* installed key handling */ - /* aes */ - renesas_sce_wrappedkey sce_wrapped_key_aes256; - renesas_sce_wrappedkey sce_wrapped_key_aes128; - - #if defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY) - /* rsa */ - renesas_sce_wrappedkey sce_wrapped_key_rsapri2048; - renesas_sce_wrappedkey sce_wrapped_key_rsapub2048; - renesas_sce_wrappedkey sce_wrapped_key_rsapri1024; - renesas_sce_wrappedkey sce_wrapped_key_rsapub1024; - #endif - - /* key status flags */ - /* flag whether encrypted ec key is set */ - union { - uint8_t chr; - struct sce_keyflgs_tls bits; - } keyflgs_tls; - /* key status flags */ - /* flags shows status if wrapped keys are installed */ - union { - uint8_t chr; - struct sce_keyflgs_cryt bits; - } keyflgs_crypt; - -} User_SCEPKCbInfo; - -typedef struct tagSCE_PKCbInfo { - User_SCEPKCbInfo *user_PKCbInfo[MAX_SCE_CBINDEX]; - uint32_t num_session; -} SCE_PKCbInfo; - -typedef struct -{ - uint8_t *encrypted_provisioning_key; - uint8_t *iv; - uint8_t *encrypted_user_tls_key; - uint32_t encrypted_user_tls_key_type; - sce_tls_ca_certification_public_wrapped_key_t user_rsa2048_tls_wrappedkey; -} sce_key_data; - -struct WOLFSSL; -struct WOLFSSL_CTX; -struct ecc_key; - -WOLFSSL_LOCAL int wc_sce_Open(); -WOLFSSL_LOCAL void wc_sce_Close(); -WOLFSSL_LOCAL int wc_sce_hw_lock(); -WOLFSSL_LOCAL void wc_sce_hw_unlock( void ); -WOLFSSL_LOCAL int wc_sce_usable(const struct WOLFSSL *ssl, - uint8_t session_key_generated); - -typedef struct { - sce_aes_wrapped_key_t sce_wrapped_key; - word32 keySize; - byte setup; -} SCE_AES_CTX; - -struct Aes; -WOLFSSL_LOCAL int wc_sce_AesCbcEncrypt(struct Aes* aes, byte* out, const byte* in, - word32 sz); -WOLFSSL_LOCAL int wc_sce_AesCbcDecrypt(struct Aes* aes, byte* out, const byte* in, - word32 sz); - -WOLFSSL_LOCAL int wc_sce_AesGcmEncrypt(struct Aes* aes, byte* out, - const byte* in, word32 sz, - byte* iv, word32 ivSz, - byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, - void* ctx); - -WOLFSSL_LOCAL int wc_sce_AesGcmDecrypt(struct Aes* aes, byte* out, - const byte* in, word32 sz, - const byte* iv, word32 ivSz, - const byte* authTag, word32 authTagSz, - const byte* authIn, word32 authInSz, - void* ctx); - -#if !defined(NO_SHA256) && !defined(NO_WOLFSSL_RENESAS_SCEPROTECT_HASH) - -typedef enum { - SCE_SHA256 = 1, -} SCE_SHA_TYPE; - -typedef struct { - byte* msg; - void* heap; - word32 used; - word32 len; - word32 sha_type; -#if defined(WOLF_CRYPTO_CB) - word32 flags; - int devId; -#endif -} wolfssl_SCE_Hash; - -/* RAW hash function APIs are not implemented with SCE */ -#undef WOLFSSL_NO_HASH_RAW -#define WOLFSSL_NO_HASH_RAW - -typedef wolfssl_SCE_Hash wc_Sha256; - -#endif /* NO_SHA */ - -#if defined(WOLFSSL_RENESAS_SCEPROTECT) && \ - !defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPT_ONLY) - -WOLFSSL_LOCAL int wc_sce_tls_RootCertVerify( - const uint8_t* cert, uint32_t cert_len, - uint32_t key_n_start, uint32_t key_n_len, - uint32_t key_e_start, uint32_t key_e_len, - uint32_t cm_row); - -WOLFSSL_LOCAL int wc_sce_tls_CertVerify( - const uint8_t* cert, uint32_t certSz, - const uint8_t* signature, uint32_t sigSz, - uint32_t key_n_start, uint32_t key_n_len, - uint32_t key_e_start, uint32_t key_e_len, - uint8_t* sce_encRsaKeyIdx); - - -WOLFSSL_LOCAL int wc_sce_generatePremasterSecret( - uint8_t* premaster, - uint32_t preSz); - -WOLFSSL_LOCAL int wc_sce_generateEncryptPreMasterSecret( - struct WOLFSSL* ssl, - uint8_t* out, - uint32_t* outSz); - -WOLFSSL_LOCAL int wc_sce_Sha256GenerateHmac( - const struct WOLFSSL *ssl, - const uint8_t* myInner, - uint32_t innerSz, - const uint8_t* in, - uint32_t sz, - uint8_t* digest); - -WOLFSSL_LOCAL int wc_sce_Sha256VerifyHmac( - const struct WOLFSSL *ssl, - const uint8_t* message, - uint32_t messageSz, - uint32_t macSz, - uint32_t content); - -WOLFSSL_LOCAL int wc_sce_storeKeyCtx( - struct WOLFSSL* ssl, - User_SCEPKCbInfo* info); - -WOLFSSL_LOCAL int wc_sce_generateVerifyData( - const uint8_t* ms, /* master secret */ - const uint8_t* side, - const uint8_t* handshake_hash, - uint8_t* hashes /* out */); - -WOLFSSL_LOCAL int wc_sce_generateSessionKey( - struct WOLFSSL* ssl, - User_SCEPKCbInfo* cbInfo, - int devId); - -WOLFSSL_LOCAL int wc_sce_generateMasterSecret( - uint8_t cipherSuiteFirst, - uint8_t cipherSuite, - const uint8_t *pr, /* pre-master */ - const uint8_t *cr, /* client random */ - const uint8_t *sr, /* server random */ - uint8_t *ms); - -WOLFSSL_LOCAL int wc_SCE_RsaVerify(struct WOLFSSL* ssl, byte* sig, uint32_t sigSz, - uint8_t** out, const byte* key, uint32_t keySz, void* ctx); -WOLFSSL_LOCAL int wc_SCE_EccVerify(struct WOLFSSL* ssl, const uint8_t* sig, uint32_t sigSz, - const uint8_t* hash, uint32_t hashSz, const uint8_t* key, uint32_t keySz, - int* result, void* ctx); -/* Callback for EccShareSecret */ -WOLFSSL_LOCAL int SCE_EccSharedSecret(struct WOLFSSL* ssl, struct ecc_key* otherKey, - uint8_t* pubKeyDer, unsigned int* pubKeySz, - uint8_t* out, unsigned int* outlen, int side, void* ctx); - -/* user API */ -WOLFSSL_API void wc_sce_inform_user_keys( - uint8_t* encrypted_provisioning_key, - uint8_t* iv, - uint8_t* encrypted_user_tls_key, - uint32_t encrypted_user_tls_key_type); - -WOLFSSL_API void wc_sce_set_callbacks(struct WOLFSSL_CTX* ctx); -WOLFSSL_API int wc_sce_set_callback_ctx(struct WOLFSSL* ssl, void* user_ctx); -WOLFSSL_API void wc_sce_inform_cert_sign(const uint8_t *sign); - -/* rsa */ -struct RsaKey; -struct WC_RNG; -WOLFSSL_API int wc_sce_RsaFunction(const byte* in, word32 inLen, byte* out, - word32 outLen, int type, struct RsaKey* key, struct WC_RNG* rng, void* ctx); -WOLFSSL_API int wc_sce_MakeRsaKey(int size, void* ctx); -WOLFSSL_API int wc_sce_RsaSign(const byte* in, word32 inLen, byte* out, - word32* outLen, struct RsaKey* key, void* ctx); -WOLFSSL_API int wc_sce_RsaVerify(const byte* in, word32 inLen, byte* out, - word32* outLen,struct RsaKey* key, void* ctx); - -#endif /* WOLFSSL_RENESAS_SCEPROTECT && - * !WOLFSSL_RENESAS_SCEPROTECT_CRYPT_ONLY */ - -#endif /* __RENESAS_SCE_CRYPT_H__ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas-tsip-crypt.h 2024-08-03 07:30:01.000000000 +0000 @@ -21,7 +21,8 @@ #ifndef __RENESAS_TSIP_CRYPT_H__ #define __RENESAS_TSIP_CRYPT_H__ -#if !defined(WOLFCRYPT_ONLY) +#if !defined(WOLFCRYPT_ONLY) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) #if defined(WOLFSSL_RENESAS_TSIP_IAREWRX) #include "r_bsp/mcu/all/r_rx_compiler.h" @@ -29,8 +30,9 @@ #include "r_tsip_rx_if.h" #endif -#if defined(WOLFSSL_RENESAS_TSIP) - #include "r_tsip_rx_if.h" +#if defined(WOLFSSL_RENESAS_TSIP) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) + #include "r_tsip_rx_if.h" #endif @@ -69,7 +71,7 @@ l_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0x23, l_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0x27, l_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0x2b, - l_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0x2f, + l_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0x2f, l_TLS_AES_128_GCM_SHA256 = 0x01, l_TLS_AES_128_CCM_SHA256 = 0x04, }; @@ -88,6 +90,10 @@ TSIP_KEY_TYPE_RSA2048 = 0, TSIP_KEY_TYPE_RSA4096 = 1, TSIP_KEY_TYPE_ECDSAP256 = 2, + #ifdef WOLFSSL_RENESAS_TSIP_CRYPTONLY + TSIP_KEY_TYPE_RSA1024 = 3, + #endif + } wolfssl_TSIP_KEY_TYPE; struct WOLFSSL; @@ -95,11 +101,11 @@ /* MsgBag stands for message bag and acts as a buffer for holding plain text * handshake messages exchanged between client and server. - * MsgBag was introduced as a workaround for the TSIP's limitation that TSIP + * MsgBag was introduced as a workaround for the TSIP's limitation that TSIP * can not process multiple hash algorithms at the same time. If the - * limitation is resolved in a future TSIP, MsgBag should be removed. + * limitation is resolved in a future TSIP, MsgBag should be removed. * The contents in this MsgBag is used for transcript hashing. The hash value - * is used for the key derivation and Finished-message. + * is used for the key derivation and Finished-message. * The capacity of the MsgBag is defined as MSGBAG_SIZE and the actual * size is 8KB. The size should be large enough to hold all the handshake * messages including the server and client certificate messages. @@ -114,20 +120,34 @@ byte buff[MSGBAG_SIZE]; } MsgBag; +#ifdef WOLFSSL_RENESAS_TSIP_CRYPTONLY + typedef void* renesas_tsip_key; + + /* flags Crypt Only */ + struct tsip_keyflgs_cryt { + uint8_t aes256_key_set:1; + uint8_t aes128_key_set:1; + uint8_t rsapri2048_key_set:1; + uint8_t rsapub2048_key_set:1; + uint8_t rsapri1024_key_set:1; + uint8_t rsapub1024_key_set:1; + uint8_t message_type:1;/*message 0, hashed 1*/ + }; +#endif /* * TsipUserCtx holds mainly keys used for TLS handshake in TSIP specific format. */ typedef struct TsipUserCtx { /* unique number for each session */ int devId; - +#ifdef WOLFSSL_RENESAS_TSIP_TLS /* 0:working as a TLS client, 1: as a server */ byte side; /* public key index for verification of RootCA cert */ uint32_t user_key_id; - + /* WOLFSSL object associated with */ struct WOLFSSL* ssl; struct WOLFSSL_CTX* ctx; @@ -139,12 +159,13 @@ /* handle is used as work area for Tls13 handshake */ tsip_tls13_handle_t handle13; - +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ /* client key pair wrapped by provisioning key */ byte* wrappedPrivateKey; byte* wrappedPublicKey; - int wrappedKeyType; + int wrappedKeyType; +#ifdef WOLFSSL_RENESAS_TSIP_TLS #if !defined(NO_RSA) /* RSA-2048bit private and public key-index for client authentication */ tsip_rsa2048_private_key_index_t Rsa2048PrivateKeyIdx; @@ -162,10 +183,10 @@ /* ECDHE pre-master secret */ tsip_tls13_ephemeral_shared_secret_key_index_t sharedSecret13Idx; - + /* Handshake secret for Tls13 handshake */ tsip_tls13_ephemeral_handshake_secret_key_index_t handshakeSecret13Idx; - + /* the key to decrypt server-finished message */ tsip_tls13_ephemeral_server_finished_key_index_t serverFinished13Idx; @@ -205,12 +226,12 @@ /* signature data area for TLS1.3 CertificateVerify message */ byte sigDataCertVerify[TSIP_TLS_MAX_SIGDATA_SZ]; - + #if (WOLFSSL_RENESAS_TSIP_VER >=109) /* out from R_SCE_TLS_ServerKeyExchangeVerify */ uint32_t encrypted_ephemeral_ecdh_public_key[ENCRYPTED_ECDHE_PUBKEY_SZ]; - - /* ephemeral ECDH pubkey index + + /* ephemeral ECDH pubkey index * got from R_TSIP_GenerateTlsP256EccKeyIndex. * Input to R_TSIP_TlsGeneratePreMasterSecretWithEccP256Key. */ @@ -227,17 +248,38 @@ uint32_t tsip_masterSecret[TSIP_TLS_MASTERSECRET_SIZE/4]; uint8_t tsip_clientRandom[TSIP_TLS_CLIENTRANDOM_SZ]; uint8_t tsip_serverRandom[TSIP_TLS_SERVERRANDOM_SZ]; +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ +/* for tsip crypt only mode */ +#ifdef WOLFSSL_RENESAS_TSIP_CRYPTONLY + + renesas_tsip_key rsa1024pri_keyIdx; + renesas_tsip_key rsa1024pub_keyIdx; + renesas_tsip_key rsa2048pri_keyIdx; + renesas_tsip_key rsa2048pub_keyIdx; + /* sign/verify hash type : + * md5, sha1 or sha256 + */ + int sing_hash_type; + + /* flags shows status if tsip keys are installed */ + union { + uint8_t chr; + struct tsip_keyflgs_cryt bits; + } keyflgs_crypt; + +#endif /* installed key handling */ tsip_aes_key_index_t user_aes256_key_index; uint8_t user_aes256_key_set:1; tsip_aes_key_index_t user_aes128_key_index; uint8_t user_aes128_key_set:1; - + /* TSIP defined cipher suite number */ uint32_t tsip_cipher; - + /* flags */ +#ifdef WOLFSSL_RENESAS_TSIP_TLS #if !defined(NO_RSA) uint8_t ClientRsa2048PrivKey_set:1; uint8_t ClientRsa2048PubKey_set:1; @@ -264,7 +306,7 @@ uint8_t ServerWriteTrafficKey_set:1; uint8_t ClientWriteTrafficKey_set:1; uint8_t session_key_set:1; - +#endif /* WOLFSSL_RENESAS_TSIP_TLS */ } TsipUserCtx; @@ -273,7 +315,7 @@ typedef struct { - TsipUserCtx* userCtx; + TsipUserCtx* userCtx; } TsipPKCbInfo; @@ -289,7 +331,7 @@ uint32_t encrypted_user_private_key_type; uint8_t * encrypted_user_public_key; uint32_t encrypted_user_public_key_type; - tsip_ecc_private_key_index_t client_private_key_index; + tsip_ecc_private_key_index_t client_private_key_index; tsip_tls_ca_certification_public_key_index_t user_rsa2048_tls_pubindex; } tsip_key_data; @@ -321,10 +363,21 @@ WOLFSSL_API int tsip_set_clientPrivateKeyEnc(const byte* key, int keyType); #if defined(WOLF_PRIVATE_KEY_ID) -WOLFSSL_API int tsip_use_PrivateKey_buffer(struct WOLFSSL* ssl, + +#if defined(WOLFSSL_RENESAS_TSIP_TLS) +WOLFSSL_API int tsip_use_PublicKey_buffer_TLS(WOLFSSL* ssl, const char* keyBuf, int keyBufLen, int keyType); -WOLFSSL_API int tsip_use_PublicKey_buffer(struct WOLFSSL* ssl, +WOLFSSL_API int tsip_use_PrivateKey_buffer_TLS(struct WOLFSSL* ssl, const char* keyBuf, int keyBufLen, int keyType); +#endif + +#if defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) +WOLFSSL_API int tsip_use_PubicKey_buffer_crypt(TsipUserCtx *uc, + const char* keyBuf, int keyBufLen, int keyType); +WOLFSSL_API int tsip_use_PrivateKey_buffer_crypt(TsipUserCtx *uc, + const char* keyBuf, int keyBufLen, int keyType); +#endif + #endif /* WOLF_PRIVATE_KEY_ID */ #if (WOLFSSL_RENESAS_TSIP_VER >=109) @@ -334,25 +387,24 @@ byte* provisioning_key, /* key got from DLM server */ byte* iv, /* iv used for public key */ byte* encrypted_public_key,/*RSA2048 or ECDSAp256 public key*/ - word32 public_key_type); /* 0: RSA-2048 2:ECDSA P-256 */ + word32 public_key_type); /* 0: RSA-2048 2:ECDSA P-256 */ #else WOLFSSL_API void tsip_inform_user_keys( - byte* encrypted_session_key, + byte* encrypted_session_key, byte* iv, byte* encrypted_user_tls_key); #endif - /*----------------------------------------------------*/ /* internal use functions */ /*----------------------------------------------------*/ WOLFSSL_LOCAL int tsip_SignRsaPkcs(wc_CryptoInfo* info, TsipUserCtx* tuc); WOLFSSL_LOCAL int tsip_VerifyRsaPkcsCb( - WOLFSSL* ssl, + WOLFSSL* ssl, unsigned char* sig, unsigned int sigSz, unsigned char** out, const unsigned char* keyDer, unsigned int keySz, @@ -375,7 +427,7 @@ WOLFSSL_LOCAL int tsip_Tls13GetHmacMessages(struct WOLFSSL* ssl, byte* mac); -WOLFSSL_LOCAL int tsip_Tls13GenEccKeyPair(struct WOLFSSL* ssl, +WOLFSSL_LOCAL int tsip_Tls13GenEccKeyPair(struct WOLFSSL* ssl, struct KeyShareEntry* kse); WOLFSSL_LOCAL int tsip_Tls13GenSharedSecret(struct WOLFSSL* ssl, @@ -414,13 +466,13 @@ const byte* input, byte* hash, word32* pHashSz); -WOLFSSL_LOCAL int tsip_Tls13AesDecrypt(struct WOLFSSL* ssl, +WOLFSSL_LOCAL int tsip_Tls13AesDecrypt(struct WOLFSSL* ssl, byte* output, const byte* input, word16 sz); WOLFSSL_LOCAL int tsip_Tls13AesEncrypt(struct WOLFSSL* ssl, byte* output, const byte* input, word16 sz); -WOLFSSL_LOCAL int tsip_Tls13CertificateVerify(struct WOLFSSL* ssl, +WOLFSSL_LOCAL int tsip_Tls13CertificateVerify(struct WOLFSSL* ssl, const byte* input, word32* inOutIdx, word32 totalSz); @@ -431,7 +483,7 @@ #if (WOLFSSL_RENESAS_TSIP_VER >=109) -WOLFSSL_LOCAL int wc_tsip_AesCipher(int devIdArg, struct wc_CryptoInfo* info, +WOLFSSL_LOCAL int wc_tsip_AesCipher(int devIdArg, struct wc_CryptoInfo* info, void* ctx); WOLFSSL_LOCAL int wc_tsip_generateMasterSecretEx( byte cipherSuiteFirst, @@ -478,7 +530,7 @@ void* ctx); WOLFSSL_LOCAL int wc_tsip_EccVerify( - WOLFSSL* ssl, + WOLFSSL* ssl, const byte* sig, word32 sigSz, const byte* hash, word32 hashSz, const byte* key, word32 keySz, @@ -489,7 +541,7 @@ const uint8_t* side, const uint8_t* handshake_hash, uint8_t* hashes); - +#ifndef NO_AES WOLFSSL_LOCAL int wc_tsip_AesCbcEncrypt( Aes* aes, byte* out, @@ -501,7 +553,7 @@ byte* out, const byte* in, word32 sz); - + WOLFSSL_LOCAL int wc_tsip_AesGcmEncrypt( Aes* aes, byte* out, const byte* in, word32 sz, @@ -509,7 +561,7 @@ byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz, void* ctx); - + WOLFSSL_LOCAL int wc_tsip_AesGcmDecrypt( Aes* aes, byte* out, const byte* in, word32 sz, @@ -517,20 +569,20 @@ const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz, void* ctx); - +#endif /* NO_AES */ WOLFSSL_LOCAL int wc_tsip_ShaXHmacVerify( const WOLFSSL *ssl, - const byte* message, + const byte* message, word32 messageSz, word32 macSz, word32 content); WOLFSSL_LOCAL int wc_tsip_Sha1HmacGenerate( const WOLFSSL *ssl, - const byte* myInner, + const byte* myInner, word32 innerSz, const byte* in, - word32 sz, + word32 sz, byte* digest); WOLFSSL_LOCAL int wc_tsip_Sha256HmacGenerate( @@ -553,7 +605,7 @@ uint8_t session_key_generated); WOLFSSL_LOCAL void tsip_inform_sflash_signedcacert( - const byte* ps_flash, + const byte* ps_flash, const byte* psigned_ca_cert, word32 len); @@ -583,8 +635,11 @@ TsipUserCtx* ctx, int devId); +WOLFSSL_LOCAL int wc_tsip_MakeRsaKey(int size, void* ctx); +WOLFSSL_LOCAL int wc_tsip_RsaVerifyPkcs(wc_CryptoInfo* info, + TsipUserCtx* tuc); - +WOLFSSL_LOCAL int wc_tsip_GenerateRandBlock(byte* output, word32 size); #if defined(WOLFSSL_RENESAS_TSIP_CRYPT_DEBUG) byte *ret2err(word32 ret); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h 2024-08-03 07:30:01.000000000 +0000 @@ -36,15 +36,15 @@ const unsigned char* keyDer, unsigned int keySz, void* ctx); WOLFSSL_LOCAL int Renesas_cmn_genMasterSecret(WOLFSSL* ssl, void* ctx); -WOLFSSL_LOCAL int Renesas_cmn_generatePremasterSecret(WOLFSSL* ssl, +WOLFSSL_LOCAL int Renesas_cmn_generatePremasterSecret(WOLFSSL* ssl, byte *premaster, word32 preSz, void* ctx); -WOLFSSL_LOCAL int Renesas_cmn_RsaEnc(WOLFSSL* ssl, const unsigned char* in, +WOLFSSL_LOCAL int Renesas_cmn_RsaEnc(WOLFSSL* ssl, const unsigned char* in, unsigned int inSz, unsigned char* out, word32* outSz, const unsigned char* keyDer, unsigned int keySz, void* ctx); -WOLFSSL_LOCAL int Renesas_cmn_VerifyHmac(WOLFSSL *ssl, const byte* message, +WOLFSSL_LOCAL int Renesas_cmn_VerifyHmac(WOLFSSL *ssl, const byte* message, word32 messageSz, word32 macSz, word32 content, void* ctx); WOLFSSL_LOCAL int Renesas_cmn_EccVerify(WOLFSSL* ssl, const unsigned char* sig, - unsigned int sigSz, const unsigned char* hash, unsigned int hashSz, + unsigned int sigSz, const unsigned char* hash, unsigned int hashSz, const unsigned char* key, unsigned int keySz, int* result, void* ctx); WOLFSSL_LOCAL int Renesas_cmn_RsaVerify(WOLFSSL* ssl, unsigned char* sig, unsigned int sigSz, @@ -55,7 +55,7 @@ unsigned char** out, const unsigned char* keyDer, unsigned int keySz, void* ctx); - + WOLFSSL_LOCAL int Renesas_cmn_TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz, int content, int verify, int epochOrder); WOLFSSL_LOCAL int Renesas_cmn_usable(const WOLFSSL *ssl, byte seskey_gennerated); @@ -68,11 +68,16 @@ int* result, void* ctx); /* Common Methods */ +WOLFSSL_LOCAL void* Renesas_cmn_GetCbCtxBydevId(int devId); int wc_CryptoCb_CryptInitRenesasCmn(WOLFSSL* ssl, void* ctx); void wc_CryptoCb_CleanupRenesasCmn(int* id); -int wc_Renesas_cmn_RootCertVerify(const byte* cert, word32 cert_len, - word32 key_n_start, word32 key_n_len, word32 key_e_start, +int wc_Renesas_cmn_RootCertVerify(const byte* cert, word32 cert_len, + word32 key_n_start, word32 key_n_len, word32 key_e_start, word32 key_e_len, word32 cm_row); WOLFSSL_LOCAL int Renesas_cmn_Cleanup(WOLFSSL* ssl); WOLFSSL_LOCAL byte Renesas_cmn_checkCA(word32 cmIdx); +WOLFSSL_LOCAL int Renesas_cmn_TlsFinished(WOLFSSL* ssl, const byte *side, + const byte *handshake_hash, word32 hashSz, + byte *hashes, void* ctx); +WOLFSSL_LOCAL int Renesas_cmn_generateSessionKey(WOLFSSL* ssl, void* ctx); #endif /* __RENESAS_CMN_H__ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_sync.h 2024-08-03 07:30:01.000000000 +0000 @@ -25,8 +25,8 @@ #ifdef HAVE_RENESAS_SYNC struct WOLFSSL; -struct User_SCEPKCbInfo; -extern User_SCEPKCbInfo guser_PKCbInfo; +struct FSPSM_ST; +extern FSPSM_ST guser_PKCbInfo; WOLFSSL_API int wc_CryptoCb_CryptInitRenesasCmn(struct WOLFSSL* ssl, void* ctx); WOLFSSL_API void wc_CryptoCb_CleanupRenesasCmn(int* id); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h 2024-08-03 07:30:01.000000000 +0000 @@ -19,7 +19,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ - + #ifndef __RENESAS_TSIP_TYPES_H__ #define __RENESAS_TSIP_TYPES_H__ @@ -48,7 +48,7 @@ #if defined(WOLF_CRYPTO_CB) word32 flags; int devId; -#endif +#endif } wolfssl_TSIP_Hash; /* RAW hash function APIs are not implemented with TSIP */ @@ -63,7 +63,8 @@ #endif /* NO_SHA */ -#if defined(WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT) +#if defined(WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT) ||\ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY) #include "r_tsip_rx_if.h" typedef struct { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-crypt.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-crypt.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-crypt.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-crypt.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,80 @@ +/* aria-crypt.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/*! + \file wolfssl/wolfcrypt/port/aria/aria-crypt.h +*/ +/* + +DESCRIPTION +This library provides the interfaces to the ARIA cipher implementation for +encrypting and decrypting data. + +*/ +#ifndef WOLF_CRYPT_ARIA_CRYPT_H +#define WOLF_CRYPT_ARIA_CRYPT_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +#include "mcapi.h" +#include "mcapi_error.h" + +#define ARIA_128_KEY_SIZE 16 +#define ARIA_192_KEY_SIZE 24 +#define ARIA_256_KEY_SIZE 32 + +#define ARIA_BLOCK_SIZE 16 +#define ARIA_GCM_AUTH_SZ 16 + +#define WC_ARIA_GCM_GET_CIPHERTEXT_SIZE(x) (x+ARIA_GCM_AUTH_SZ) + +typedef struct { + MC_HSESSION hSession; + MC_ALGID algo; + MC_HOBJECT hKey; + word32 nonce[ARIA_BLOCK_SIZE / sizeof(word32)]; + word32 nonceSz; +} wc_Aria; + +WOLFSSL_API int wc_AriaInitCrypt(wc_Aria* aria, MC_ALGID algo); +WOLFSSL_API int wc_AriaFreeCrypt(wc_Aria* aria); +WOLFSSL_API int wc_AriaSetKey(wc_Aria* aria, byte* key); +WOLFSSL_API int wc_AriaGcmSetExtIV(wc_Aria* aria, const byte* iv, word32 ivSz); +WOLFSSL_API int wc_AriaGcmSetIV(wc_Aria* aria, word32 ivSz, + const byte* ivFixed, word32 ivFixedSz, + WC_RNG* rng); + +WOLFSSL_API int wc_AriaEncrypt(wc_Aria *aria, byte* out, byte* in, word32 inSz, + byte* iv, word32 ivSz, byte* aad, word32 aadSz, + byte* authTag, word32 authTagSz); +WOLFSSL_API int wc_AriaDecrypt(wc_Aria *aria, byte* out, byte* in, word32 inSz, + byte* iv, word32 ivSz, byte* aad, word32 aadSz, + byte* authTag, word32 authTagSz); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLF_CRYPT_ARIA_CRYPT_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-cryptocb.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-cryptocb.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-cryptocb.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/aria/aria-cryptocb.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,69 @@ +/* aria-cryptocb.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/*! + \file wolfssl/wolfcrypt/port/aria/aria-cryptocb.h +*/ +/* + +DESCRIPTION +This library provides the interfaces to the ARIA cipher implementation for +signing, verifying and hashing data. + +*/ +#ifndef WOLF_CRYPT_ARIA_CRYPTOCB_H +#define WOLF_CRYPT_ARIA_CRYPTOCB_H + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +#include "mcapi.h" +#include "mcapi_error.h" + +int wc_AriaInit(void); +int wc_AriaInitSha(MC_HSESSION* hSession, MC_ALGID algo); +int wc_AriaShaUpdate(MC_HSESSION hSession, byte* data, word32 len); +int wc_AriaShaFinal(MC_HSESSION hSession, byte* out, word32* len); +int wc_AriaFree(MC_HSESSION* hSession, MC_HOBJECT *obj1); + +int wc_AriaSign(byte* in, word32 inSz, byte* out, word32* outSz, ecc_key* key); +int wc_AriaVerify(byte* sig, word32 sigSz, byte* hash, word32 hashSz, int* res, ecc_key* key); +int wc_AriaDerive(ecc_key* private_key, ecc_key* public_key, byte* out, word32* outSz); + +#ifndef ARIA_KEYASN1_MAXSZ +#define ARIA_KEYASN1_MAXSZ 128 +#endif + +#ifdef WOLF_CRYPTO_CB + +#define WOLFSSL_ARIA_DEVID 8 +int wc_AriaCryptoCb(int devIdArg, wc_CryptoInfo* info, void* ctx); +#endif + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLF_CRYPT_ARIA_CRYPTOCB_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/CryIf.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/CryIf.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/CryIf.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/CryIf.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,49 @@ +/* CryIf.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef WOLFSSL_CRYIF_H +#define WOLFSSL_CRYIF_H + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/* implementation specific structure, for now not used */ +typedef struct CryIf_ConfigType { + void* heap; +} CryIf_ConfigType; + +WOLFSSL_LOCAL void CryIf_Init(const CryIf_ConfigType* in); +WOLFSSL_LOCAL void CryIf_GetVersionInfo(Std_VersionInfoType* ver); +WOLFSSL_LOCAL Std_ReturnType CryIf_ProcessJob(uint32 id, Crypto_JobType* job); +WOLFSSL_LOCAL Std_ReturnType CryIf_CancelJob(uint32 id, Crypto_JobType* job); +WOLFSSL_LOCAL Std_ReturnType CryIf_KeyElementSet(uint32 keyId, uint32 eId, + const uint8* key, uint32 keySz); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFSSL_CRYIF_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Crypto.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Crypto.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Crypto.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Crypto.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,55 @@ +/* Crypto.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef WOLFSSL_CRYPTO_H +#define WOLFSSL_CRYPTO_H + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/* key format */ +enum { + CRYPTO_KE_FORMAT_BIN_OCTET = 0x01, + CRYPTO_KE_FORMAT_BIN_RSA_PRIVATEKEY = 0x05, + CRYPTO_KE_FORMAT_BIN_RSA_PUBLICKEY = 0x06 +}; + +/* implementation specific structure, for now not used */ +typedef struct Crypto_ConfigType { + void* heap; +} Crypto_ConfigType; + +WOLFSSL_LOCAL Std_ReturnType Crypto_KeyElementSet(uint32 keyId, uint32 eId, + const uint8* key, uint32 keySz); +WOLFSSL_LOCAL void Crypto_Init(const Crypto_ConfigType* config); +WOLFSSL_LOCAL Std_ReturnType Crypto_ProcessJob(uint32 objectId, + Crypto_JobType* job); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFSSL_CRYPTO_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Csm.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Csm.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Csm.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/Csm.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,295 @@ +/* csm.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +/* specifications from AUTOSAR_SWS_CryptoServiceManager Release 4.4.0 */ +/* naming scheme from 4.4 specifications, needed for applications to use + * standardized names when linking */ + + +#ifndef WOLFSSL_CSM_H +#define WOLFSSL_CSM_H + +#ifdef WOLFSSL_AUTOSAR + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + + +/* Error values */ +#define WOLFSSL_CSM_E_PARAM_POINTER 0x01 +#define WOLFSSL_CSM_E_SMALL_BUFFER 0x03 +#define WOLFSSL_CSM_E_PARAM_HANDLE 0x04 +#define WOLFSSL_CSM_E_UNINIT 0x05 +#define WOLFSSL_CSM_E_INIT_FAILED 0x07 +#define WOLFSSL_CSM_E_PROCESSING_MOD 0x08 + + +#define Crypto_JobType WOLFSSL_JOBTYPE +#define Crypto_JobPrimitiveInputOutputType WOLFSSL_JOBIO +#define Crypto_JobStateType WOLFSSL_JOBSTATE +#define Crypto_VerifyResultType WOLFSSL_VERIFY +#define Crypto_OperationModeType WOLFSSL_OMODE_TYPE + +/* implementation specific structure, for now not used */ +typedef struct Csm_ConfigType { + void* heap; +} Csm_ConfigType; + +typedef enum WOLFSSL_JOBSTATE { + CRYPTO_JOBSTATE_IDLE = 0x00, + CRYPTO_JOBSTATE_ACTIVE = 0x01 +} WOLFSSL_JOBSTATE; + +typedef enum WOLFSSL_VERIFY { + CRYPTO_E_VER_OK = 0x00, + CRYPTO_E_VER_NOT_OK = 0x01 +} WOLFSSL_VERIFY; + +/* operation modes */ +typedef enum WOLFSSL_OMODE_TYPE { + CRYPTO_OPERATIONMODE_START = 0x01, + CRYPTO_OPERATIONMODE_UPDATE = 0x02, + CRYPTO_OPERATIONMODE_STREAMSTART = 0x03, + CRYPTO_OPERATIONMODE_FINISH = 0x04, + CRYPTO_OPERATIONMODE_SINGLECALL = 0x07 +} WOLFSSL_OMODE_TYPE; + + +typedef enum Crypto_ServiceInfoType { + CRYPTO_ENCRYPT = 0x03, + CRYPTO_DECRYPT = 0x04, + CRYPTO_RANDOMGENERATE = 0x0B, + +#ifdef CSM_UNSUPPORTED_ALGS + /* not yet supported */ + CRYPTO_HASH = 0x00, + CRYPTO_MACGENERATE = 0x01, + CRYPTO_MACVERIFY = 0x02, + CRYPTO_AEADENCRYPT = 0x05, + CRYPTO_AEADDECRYPT = 0x06, + CRYPTO_SIGNATUREGENERATE = 0x07, + CRYPTO_SIGNATUREVERIFY = 0x08, + CRYPTO_RANDOMSEED = 0x0C, + CRYPTO_KEYGENERATE= 0x0D, + CRYPTO_KEYDERIVE = 0x0E, + CRYPTO_KEYEXCHANGECALCPUBVAL = 0x0F, + CRYPTO_KEYEXCHANGECALCSECRET = 0x10, + CRYPTO_CERTIFICATEPARSE = 0x11, + CRYPTO_CERTIFICATEVERIFY = 0x12, + CRYPTO_KEYSETVALID = 0x13, +#endif +} Crypto_ServiceInfoType; + + +typedef enum Crypto_AlgorithmModeType { + CRYPTO_ALGOMODE_NOT_SET = 0x00, + CRYPTO_ALGOMODE_CBC = 0x02, + +#ifdef CSM_UNSUPPORTED_ALGS + /* not yet supported */ + CRYPTO_ALGOMODE_ECB = 0x01, + CRYPTO_ALGOMODE_CFB = 0x03, + CRYPTO_ALGOMODE_OFB = 0x04, + CRYPTO_ALGOMODE_CTR = 0x05, + CRYPTO_ALGOMODE_GCM = 0x06, + CRYPTO_ALGOMODE_XTS = 0x07, + CRYPTO_ALGOMODE_RSAES_OAEP = 0x08, + CRYPTO_ALGOMODE_RSAAES_PKCS1_V1_5 = 0x09, + CRYPTO_ALGOMODE_RSAAES_PSS = 0x0A, + CRYPTO_ALGOMODE_RSAASA_PKCS1_V1_5 = 0x0B, + CRYPTO_ALGOMODE_8ROUNDS = 0x0C, /* ChaCha8 */ + CRYPTO_ALGOMODE_12ROUNDS = 0x0D, /* ChaCha12 */ + CRYPTO_ALGOMODE_20ROUNDS = 0x0E, /* ChaCha20 */ + CRYPTO_ALGOMODE_HMAC = 0x0F, + CRYPTO_ALGOMODE_CMAC = 0x10, + CRYPTO_ALGOMODE_GMAC = 0x11, +#endif +} Crypto_AlgorithmModeType; + +typedef enum Crypto_AlgorithmFamilyType { + CRYPTO_ALGOFAM_NOT_SET = 0x00, + CRYPTO_ALGOFAM_SHA1 = 0x01, + CRYPTO_ALGOFAM_SHA2_224 = 0x02, + CRYPTO_ALGOFAM_SHA2_256 = 0x03, + CRYPTO_ALGOFAM_SHA2_384 = 0x04, + CRYPTO_ALGOFAM_SHA2_512 = 0x05, + CRYPTO_ALGOFAM_SHA2_512_224 = 0x06, + CRYPTO_ALGOFAM_SHA2_512_256 = 0x07, + CRYPTO_ALGOFAM_SHA3_224 = 0x08, + CRYPTO_ALGOFAM_SHA3_256 = 0x09, + CRYPTO_ALGOFAM_SHA3_384 = 0x0A, + CRYPTO_ALGOFAM_SHA3_512 = 0x0B, + CRYPTO_ALGOFAM_SHAKE128 = 0x0C, + CRYPTO_ALGOFAM_SHAKE256 = 0x0D, + CRYPTO_ALGOFAM_RIPEMD160 = 0x0E, + CRYPTO_ALGOFAM_BLAKE_1_256 = 0x0D, + CRYPTO_ALGOFAM_BLAKE_1_512 = 0x10, + CRYPTO_ALGOFAM_BLAKE_2s_256 = 0x11, + CRYPTO_ALGOFAM_BLAKE_2s_512 = 0x12, + CRYPTO_ALGOFAM_3DES = 0x13, + CRYPTO_ALGOFAM_AES = 0x14, + CRYPTO_ALGOFAM_CHACHA = 0x15, + CRYPTO_ALGOFAM_RSA = 0x16, + CRYPTO_ALGOFAM_ED25519 = 0x17, + CRYPTO_ALGOFAM_BRAINPOOL = 0x18, + CRYPTO_ALGOFAM_ECCNIST = 0x19, + CRYPTO_ALGOFAM_RNG = 0x1B, + CRYPTO_ALGOFAM_SIPHASH = 0x1C, + CRYPTO_ALGOFAM_ECIES = 0x1D, + CRYPTO_ALGOFAM_ECCANSI = 0x1E, + CRYPTO_ALGOFAM_ECCSEC = 0x1F, + CRYPTO_ALGOFAM_DRBG = 0x20, + CRYPTO_ALGOFAM_FIPS186 = 0x21, /* random number gen according to FIPS 186 */ + CRYPTO_ALGOFAM_PADDING_PKCS7 = 0x22, + CRYPTO_ALGOFAM_PADDING_ONEWITHZEROS = 0x23 /* fill with 0's but first bit + * after data is 1 */ +} Crypto_AlgorithmFamilyType; + +typedef enum Crypto_KeyID { + /* Cipher/AEAD */ + CRYPTO_KE_CIPHER_KEY = 0x01, + CRYPTO_KE_CIPHER_IV = 0x05, + CRYPTO_KE_CIPHER_PROOF = 0x06, + CRYPTO_KE_CIPHER_2NDKEY = 0x07 +} Crypto_KeyID; + + +typedef enum Crypto_ProcessingType { + CRYPTO_PROCESSING_ASYNC = 0x00, + CRYPTO_PROCESSING_SYNC = 0x01 +} Crypto_ProcessingType; + + +/* removed const on elements @TODO which is different than 8.2.8 in + * AUTOSAR_SWS_CryptoServiceManager.pdf */ +typedef struct Crypto_JobInfoType { + uint32 jobId; + uint32 jobPriority; +} Crypto_JobInfoType; + +typedef struct Crypto_JobRedirectionInfoType { + uint8 redirectionConfig; + uint32 inputKeyId; + uint32 inputKeyElementId; + uint32 secondaryInputKeyId; + uint32 secondaryInputKeyElementId; + uint32 tertiaryInputKeyId; + uint32 tertiaryInputKeyElementId; + uint32 outputKeyId; + uint32 outputKeyElementId; + uint32 secondaryOutputKeyId; + uint32 secondaryOutputKeyElementId; +} Crypto_JobRedirectionInfoType; + + +enum Crypto_InputOutputRedirectionConfigType { + CRYPTO_REDIRECT_CONFIG_PRIMARY_INPUT = 0x01, + CRYPTO_REDIRECT_CONFIG_SECONDARY_INPUT = 0x02, + CRYPTO_REDIRECT_CONFIG_TERTIARY_INPUT = 0x04, + CRYPTO_REDIRECT_CONFIG_PRIMARY_OUTPUT = 0x10, + CRYPTO_REDIRECT_CONFIG_SECONDARY_OUTPUT = 0x20 +}; + + +typedef struct WOLFSSL_JOBIO { + const uint8 *inputPtr; + uint32 inputLength; + const uint8 *secondaryInputPtr; /* secondary data for verify */ + uint32 secondaryInputLength; + const uint8 *tertiaryInputPtr; /* third input data for verify */ + uint32 tertiaryInputLength; + uint8 *outputPtr; + uint32 *outputLengthPtr; + uint8 *secondaryOutputPtr; + uint32 *secondaryOutputLengthPtr; + uint64 input64; /* input parameter */ + Crypto_VerifyResultType *verifyPtr; + uint64 *output64Ptr; + Crypto_OperationModeType mode; + uint32 cryIfKeyId; + uint32 targetCryIfKeyId; +} WOLFSSL_JOBIO; + + +typedef struct Crypto_AlgorithmInfoType { + Crypto_AlgorithmFamilyType family; + Crypto_AlgorithmFamilyType secondaryFamily; /* second algo type if needed */ + uint32 keyLength; + Crypto_AlgorithmModeType mode; /* i.e. CBC / RSA OAEP */ +} Crypto_AlgorithmInfoType; + + +/* removed const on all 3 elements which is slightly different than AutoSAR */ +typedef struct Crypto_PrimitiveInfoType { + uint32 resultLength; + Crypto_ServiceInfoType service; + Crypto_AlgorithmInfoType algorithm; +} Crypto_PrimitiveInfoType; + + +typedef struct Crypto_JobPrimitiveInfoType { + uint32 callbackId; + const Crypto_PrimitiveInfoType *primitiveInfo; + uint32 cryIfKeyId; + Crypto_ProcessingType processingType; + boolean callbackUpdateNotification; +} Crypto_JobPrimitiveInfoType; + + +typedef struct WOLFSSL_JOBTYPE { + uint32 jobId; + WOLFSSL_JOBSTATE jobState; + WOLFSSL_JOBIO jobPrimitiveInputOutput; + const Crypto_JobPrimitiveInfoType* jobPrimitiveInfo; + const Crypto_JobInfoType* jobInfo; + Crypto_JobRedirectionInfoType* jobRedirectionInfoRef; +} WOLFSSL_JOBTYPE; + + +WOLFSSL_API void Csm_Init(const Csm_ConfigType* config); + +/* can be called before init, all else return WOLFSSL_CSM_E_UNINIT */ +WOLFSSL_API void Csm_GetVersionInfo(Std_VersionInfoType* version); + +WOLFSSL_API Std_ReturnType Csm_Decrypt(uint32 jobId, + Crypto_OperationModeType mode, const uint8* dataPtr, uint32 dataLength, + uint8* resultPtr, uint32* resultLengthPtr); +WOLFSSL_API Std_ReturnType Csm_Encrypt(uint32 jobId, + Crypto_OperationModeType mode, const uint8* dataPtr, uint32 dataLength, + uint8* resultPtr, uint32* resultLengthPtr); +WOLFSSL_API Std_ReturnType Csm_KeyElementSet(uint32 keyId, uint32 keyElementId, + const uint8* keyPtr, uint32 keyLength); +WOLFSSL_API Std_ReturnType Csm_RandomGenerate( uint32 jobId, uint8* resultPtr, + uint32* resultLengthPtr); +WOLFSSL_LOCAL void ReportToDET(int err); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFSSL_AUTOSAR */ +#endif /* WOLFSSL_CSM_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/StandardTypes.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/StandardTypes.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/StandardTypes.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/autosar/StandardTypes.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,66 @@ +/* StandardTypes.h + * + * Copyright (C) 2006-2019 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef WOLFSSL_AUTOSAR + +#ifndef WOLFSSL_STANDARDTYPES_H +#define WOLFSSL_STANDARDTYPES_H +#include + +/* remap primitives */ +typedef byte uint8; +typedef byte boolean; +typedef word16 uint16; +typedef word32 uint32; +typedef word64 uint64; + +#ifndef TRUE + #define TRUE 1 +#endif +#ifndef FALSE + #define FALSE 0 +#endif + +/* return types */ +typedef enum Std_ReturnType { + E_OK = 0x00, + E_NOT_OK = 0x01, + E_SMALL_BUFFER = 0x02, + E_ENTROPY_EXHAUSTION = 0x03, + E_KEY_READ_FAIL = 0x04, + E_KEY_NOT_AVAILABLE = 0x05, + E_KEY_NOT_VALID = 0x06, + E_JOB_CANCELED = 0x07, + E_KEY_EMPTY = 0x08 +} Std_ReturnType; + + +typedef struct Std_VersionInfoType { + uint16 vendorID; + uint16 moduleID; + uint8 sw_major_version; + uint8 sw_minor_version; + uint8 sw_patch_version; +} Std_VersionInfoType; +#endif /* WOLFSSL_AUTOSAR */ + +#endif /* WOLFSSL_STANDARDTYPES_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_driver.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_driver.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_driver.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_driver.h 2024-08-03 07:30:01.000000000 +0000 @@ -54,8 +54,8 @@ #define WOLFSSL_MSG(in) printf("%s\n", (in)) void DEBUG_PRINT_ARRAY(void* a, int aSz, char* str); #else - #define WOLFSSL_MSG(in) - #define DEBUG_PRINT_ARRAY(a,aSz,str) + #define WOLFSSL_MSG(in) do {} while (0) + #define DEBUG_PRINT_ARRAY(a,aSz,str) do {} while (0) #endif #define CAAM_PAGE_MAX 6 @@ -455,5 +455,6 @@ #define MAX_ECDSA_SIGN_ADDR 8 #define BLACK_KEY_MAC_SZ 16 #define BLACK_BLOB_KEYMOD_SZ 16 -#define RED_BLOB_KEYMOD_SZ 8 +#define RED_BLOB_KEYMOD_SZ 16 +#define SM_BLOB_KEYMOD_SZ 8 #endif /* CAAM_DRIVER_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_qnx.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_qnx.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_qnx.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/caam_qnx.h 2024-08-03 07:30:01.000000000 +0000 @@ -47,7 +47,7 @@ #define CAAM_ADDRESS uintptr_t #define Success 1 #define Failure 0 -#define INTERRUPT_Panic() +#define INTERRUPT_Panic() do {} while (0) #define MemoryMapMayNotBeEmpty -1 #define CAAM_WAITING -2 #define NoActivityReady -1 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam.h 2024-08-03 07:30:01.000000000 +0000 @@ -36,7 +36,7 @@ #if defined(WOLFSSL_IMX6_CAAM) || defined(WOLFSSL_IMX6_CAAM_RNG) || \ defined(WOLFSSL_QNX_CAAM) || defined(WOLFSSL_SECO_CAAM) || \ - defined(WOLFSSL_IMXRT1170_CAAM) + defined(WOLFSSL_IMXRT1170_CAAM) /* unique devId for CAAM use on crypto callbacks */ @@ -75,9 +75,9 @@ WOLFSSL_LOCAL int caamReadPartition(CAAM_ADDRESS addr, unsigned char* out, int outSz); WOLFSSL_API int wc_caamOpenBlob(byte* data, word32 dataSz, byte* out, - word32* outSz); + word32* outSz); WOLFSSL_API int wc_caamCreateBlob(byte* data, word32 dataSz, byte* out, - word32* outSz); + word32* outSz); WOLFSSL_API int wc_caamOpenBlob_ex(byte* data, word32 dataSz, byte* out, word32* outSz, int type, byte* mod, word32 modSz); @@ -91,12 +91,13 @@ #define WC_CAAM_MAC_SZ 16 #define WC_CAAM_BLOB_RED 1 #define WC_CAAM_BLOB_BLACK 2 -#define WC_CAAM_RED_KEYMOD_SZ 8 +#define WC_CAAM_RED_KEYMOD_SZ 16 #define WC_CAAM_BLACK_KEYMOD_SZ 16 +#define WC_SM_BLOB_KEYMOD_SZ 8 #define WC_CAAM_MAX_ENTROPY 44 #if !defined(WOLFSSL_QNX_CAAM) && !defined(WOLFSSL_SECO_CAAM) && \ - !defined(WOLFSSL_IMXRT1170_CAAM) + !defined(WOLFSSL_IMXRT1170_CAAM) WOLFSSL_API int wc_caamSetResource(IODevice ioDev); #ifndef WC_CAAM_READ #define WC_CAAM_READ(reg) wc_caamReadRegister((reg)) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_fsl_nxp.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_fsl_nxp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_fsl_nxp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_fsl_nxp.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,7 +24,7 @@ #ifndef WOLFCAAM_FSL_NXP_H #define WOLFCAAM_FSL_NXP_H -#include +#include #ifdef WOLFSSL_IMXRT1170_CAAM @@ -44,7 +44,7 @@ #define Boolean int #define Success 1 #define Failure 0 -#define INTERRUPT_Panic() +#define INTERRUPT_Panic() WC_DO_NOTHING #define MemoryMapMayNotBeEmpty -1 #define CAAM_WAITING -2 #define NoActivityReady -1 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_qnx.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,7 +24,7 @@ #ifndef WOLFCAAM_QNX_H #define WOLFCAAM_QNX_H -#include +#include #ifdef WOLFSSL_QNX_CAAM #include @@ -35,7 +35,7 @@ #define Boolean int #define Success 1 #define Failure 0 -#define INTERRUPT_Panic() +#define INTERRUPT_Panic() WC_DO_NOTHING #define MemoryMapMayNotBeEmpty -1 #define CAAM_WAITING -2 #define NoActivityReady -1 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/caam/wolfcaam_seco.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,7 +24,7 @@ #ifndef WOLFCAAM_SECO_H #define WOLFCAAM_SECO_H -#include +#include #ifdef WOLFSSL_SECO_CAAM @@ -38,7 +38,7 @@ #define Boolean int #define Success 1 #define Failure 0 -#define INTERRUPT_Panic() +#define INTERRUPT_Panic() WC_DO_NOTHING #define MemoryMapMayNotBeEmpty -1 #define CAAM_WAITING -2 #define NoActivityReady -1 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/iotsafe/iotsafe.h 2024-08-03 07:30:01.000000000 +0000 @@ -93,6 +93,11 @@ word16 ecdh_keypair_slot; word16 peer_pubkey_slot; word16 peer_cert_slot; +#elif (IOTSAFE_ID_SIZE == 4) + word32 privkey_id; + word32 ecdh_keypair_slot; + word32 peer_pubkey_slot; + word32 peer_cert_slot; #else #error "IOTSAFE: ID_SIZE not supported" #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/kcapi/kcapi_hmac.h 2024-08-03 07:30:01.000000000 +0000 @@ -27,11 +27,5 @@ #include #include -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -int HmacInit(Hmac* hmac, void* heap, int devId); -void HmacFree(Hmac* hmac); -#endif - #endif /* WOLF_CRYPT_KCAPI_HMAC_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/liboqs/liboqs.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/liboqs/liboqs.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/liboqs/liboqs.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/liboqs/liboqs.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,62 @@ +/* liboqs.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/*! + \file wolfssl/wolfcrypt/port/liboqs/liboqs.h +*/ +/* + +DESCRIPTION +This library provides the support interfaces to the liboqs library providing +implementations for Post-Quantum cryptography algorithms. +*/ + +#ifndef WOLF_CRYPT_LIBOQS_H +#define WOLF_CRYPT_LIBOQS_H + +#include +#include + + +#ifdef __cplusplus + extern "C" { +#endif + +#if defined(HAVE_LIBOQS) + +#include "oqs/oqs.h" + + +int wolfSSL_liboqsInit(void); + +void wolfSSL_liboqsClose(void); + +int wolfSSL_liboqsRngMutexLock(WC_RNG* rng); + +int wolfSSL_liboqsRngMutexUnlock(void); + +#endif /* HAVE_LIBOQS */ + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLF_CRYPT_LIBOQS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/nxp/ksdk_port.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/nxp/ksdk_port.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/nxp/ksdk_port.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/nxp/ksdk_port.h 2024-08-03 07:30:01.000000000 +0000 @@ -34,13 +34,13 @@ /* software algorithm, by wolfcrypt */ #if defined(FREESCALE_LTC_TFM) - int wolfcrypt_mp_mul(mp_int *A, mp_int *B, mp_int *C); - int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c); - int wolfcrypt_mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); - int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c); - int wolfcrypt_mp_invmod(mp_int *a, mp_int *b, mp_int *c); - int wolfcrypt_mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y); - int wolfcrypt_mp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng); + int wolfcrypt_mp_mul(mp_int *A, mp_int *B, mp_int *C); + int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c); + int wolfcrypt_mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + int wolfcrypt_mp_mod(mp_int *a, mp_int *b, mp_int *c); + int wolfcrypt_mp_invmod(mp_int *a, mp_int *b, mp_int *c); + int wolfcrypt_mp_exptmod(mp_int *G, mp_int *X, mp_int *P, mp_int *Y); + int wolfcrypt_mp_prime_is_prime_ex(mp_int* a, int t, int* result, WC_RNG* rng); /* Exported mp_mulmod function */ int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); @@ -48,40 +48,40 @@ #endif /* FREESCALE_LTC_TFM */ #if defined(FREESCALE_LTC_ECC) - #include "fsl_ltc.h" + #include "fsl_ltc.h" - typedef enum _fsl_ltc_ecc_coordinate_system - { - kLTC_Weierstrass = 0U, /*< Point coordinates on an elliptic curve in Weierstrass form */ - kLTC_Curve25519 = 1U, /*< Point coordinates on an Curve25519 elliptic curve in Montgomery form */ - kLTC_Ed25519 = 2U, /*< Point coordinates on an Ed25519 elliptic curve in twisted Edwards form */ - } fsl_ltc_ecc_coordinate_system_t; - - int wc_ecc_point_add(ecc_point *mG, ecc_point *mQ, ecc_point *mR, mp_int *m); - - #ifdef HAVE_CURVE25519 - int nxp_ltc_curve25519(ECPoint *q, const byte *n, const ECPoint *p, fsl_ltc_ecc_coordinate_system_t type); - const ECPoint *nxp_ltc_curve25519_GetBasePoint(void); - status_t LTC_PKHA_Curve25519ToWeierstrass(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); - status_t LTC_PKHA_WeierstrassToCurve25519(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); - status_t LTC_PKHA_Curve25519ComputeY(ltc_pkha_ecc_point_t *ltcPoint); - #endif - - #ifdef HAVE_ED25519 - status_t LTC_PKHA_Ed25519ToWeierstrass(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); - status_t LTC_PKHA_WeierstrassToEd25519(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); - status_t LTC_PKHA_Ed25519_PointMul(const ltc_pkha_ecc_point_t *ltcPointIn, - const uint8_t *N, - size_t sizeN, - ltc_pkha_ecc_point_t *ltcPointOut, - fsl_ltc_ecc_coordinate_system_t typeOut); - const ltc_pkha_ecc_point_t *LTC_PKHA_Ed25519_BasePoint(void); - status_t LTC_PKHA_Ed25519_PointDecompress(const uint8_t *pubkey, size_t pubKeySize, ltc_pkha_ecc_point_t *ltcPointOut); - status_t LTC_PKHA_sc_reduce(uint8_t *a); - status_t LTC_PKHA_sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, const uint8_t *c); - status_t LTC_PKHA_SignatureForVerify(uint8_t *rcheck, const unsigned char *a, const unsigned char *b, ed25519_key *key); - status_t LTC_PKHA_Ed25519_Compress(const ltc_pkha_ecc_point_t *ltcPointIn, uint8_t *p); - #endif + typedef enum _fsl_ltc_ecc_coordinate_system + { + kLTC_Weierstrass = 0U, /*< Point coordinates on an elliptic curve in Weierstrass form */ + kLTC_Curve25519 = 1U, /*< Point coordinates on an Curve25519 elliptic curve in Montgomery form */ + kLTC_Ed25519 = 2U, /*< Point coordinates on an Ed25519 elliptic curve in twisted Edwards form */ + } fsl_ltc_ecc_coordinate_system_t; + + int wc_ecc_point_add(ecc_point *mG, ecc_point *mQ, ecc_point *mR, mp_int *m); + + #ifdef HAVE_CURVE25519 + int nxp_ltc_curve25519(ECPoint *q, const byte *n, const ECPoint *p, fsl_ltc_ecc_coordinate_system_t type); + const ECPoint *nxp_ltc_curve25519_GetBasePoint(void); + status_t LTC_PKHA_Curve25519ToWeierstrass(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); + status_t LTC_PKHA_WeierstrassToCurve25519(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); + status_t LTC_PKHA_Curve25519ComputeY(ltc_pkha_ecc_point_t *ltcPoint); + #endif + + #ifdef HAVE_ED25519 + status_t LTC_PKHA_Ed25519ToWeierstrass(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); + status_t LTC_PKHA_WeierstrassToEd25519(const ltc_pkha_ecc_point_t *ltcPointIn, ltc_pkha_ecc_point_t *ltcPointOut); + status_t LTC_PKHA_Ed25519_PointMul(const ltc_pkha_ecc_point_t *ltcPointIn, + const uint8_t *N, + size_t sizeN, + ltc_pkha_ecc_point_t *ltcPointOut, + fsl_ltc_ecc_coordinate_system_t typeOut); + const ltc_pkha_ecc_point_t *LTC_PKHA_Ed25519_BasePoint(void); + status_t LTC_PKHA_Ed25519_PointDecompress(const uint8_t *pubkey, size_t pubKeySize, ltc_pkha_ecc_point_t *ltcPointOut); + status_t LTC_PKHA_sc_reduce(uint8_t *a); + status_t LTC_PKHA_sc_muladd(uint8_t *s, const uint8_t *a, const uint8_t *b, const uint8_t *c); + status_t LTC_PKHA_SignatureForVerify(uint8_t *rcheck, const unsigned char *a, const unsigned char *b, ed25519_key *key); + status_t LTC_PKHA_Ed25519_Compress(const ltc_pkha_ecc_point_t *ltcPointIn, uint8_t *p); + #endif #endif /* FREESCALE_LTC_ECC */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/psa/psa.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/psa/psa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/psa/psa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/psa/psa.h 2024-08-03 07:30:01.000000000 +0000 @@ -42,14 +42,7 @@ #include #endif -#include - -/* PSA implementation takes over the Sha struct and Sha functions implementation - completely. Devoiding the struct of the DevId field and hooks to make - crypto_cb work. */ -#if !defined(WOLFSSL_PSA_NO_HASH) && defined(WOLF_CRYPTO_CB) -#error "WOLFSSL PSA is not supported with WOLF_CRYPTO_CB" -#endif +#include #if defined(WOLFSSL_HAVE_PSA) @@ -78,8 +71,8 @@ void PSA_LOCK(void); void PSA_UNLOCK(void); #else -#define PSA_LOCK() -#define PSA_UNLOCK() +#define PSA_LOCK() WC_DO_NOTHING +#define PSA_UNLOCK() WC_DO_NOTHING #endif int wc_psa_init(void); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/riscv/riscv-64-asm.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/riscv/riscv-64-asm.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/riscv/riscv-64-asm.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/riscv/riscv-64-asm.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,133 @@ +/* riscv-64-asm.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef WOLF_CRYPT_RISCV_64_ASM_H +#define WOLF_CRYPT_RISCV_64_ASM_H + +#ifdef WOLFSSL_RISCV_ASM + +#define ASM_WORD(i) \ + ".word " #i "\n\t" + +#define REG_X0 0 +#define REG_X1 1 +#define REG_X2 2 +#define REG_X3 3 +#define REG_X4 4 +#define REG_X5 5 +#define REG_X6 6 +#define REG_X7 7 +#define REG_X8 8 +#define REG_X9 9 +#define REG_X10 10 +#define REG_X11 11 +#define REG_X12 12 +#define REG_X13 13 +#define REG_X14 14 +#define REG_X15 15 +#define REG_X16 16 +#define REG_X17 17 +#define REG_X18 18 +#define REG_X19 19 +#define REG_X20 20 +#define REG_X21 21 +#define REG_X22 22 +#define REG_X23 23 +#define REG_X24 24 +#define REG_X25 25 +#define REG_X26 26 +#define REG_X27 27 +#define REG_X28 28 +#define REG_X29 29 +#define REG_X30 30 +#define REG_X31 31 + +#define REG_ZERO REG_X0 +#define REG_RA REG_X1 +#define REG_SP REG_X2 +#define REG_GP REG_X3 +#define REG_TP REG_X4 +#define REG_T0 REG_X5 +#define REG_T1 REG_X6 +#define REG_T2 REG_X7 +#define REG_S0 REG_X8 +#define REG_FP REG_X8 +#define REG_S1 REG_X9 +#define REG_A0 REG_X10 +#define REG_A1 REG_X11 +#define REG_A2 REG_X12 +#define REG_A3 REG_X13 +#define REG_A4 REG_X14 +#define REG_A5 REG_X15 +#define REG_A6 REG_X16 +#define REG_A7 REG_X17 +#define REG_S2 REG_X18 +#define REG_S3 REG_X19 +#define REG_S4 REG_X20 +#define REG_S5 REG_X21 +#define REG_S6 REG_X22 +#define REG_S7 REG_X23 +#define REG_S8 REG_X24 +#define REG_S9 REG_X25 +#define REG_S10 REG_X26 +#define REG_S11 REG_X27 +#define REG_T3 REG_X28 +#define REG_T4 REG_X29 +#define REG_T5 REG_X30 +#define REG_T6 REG_X31 + +#define REG_V0 0 +#define REG_V1 1 +#define REG_V2 2 +#define REG_V3 3 +#define REG_V4 4 +#define REG_V5 5 +#define REG_V6 6 +#define REG_V7 7 +#define REG_V8 8 +#define REG_V9 9 +#define REG_V10 10 +#define REG_V11 11 +#define REG_V12 12 +#define REG_V13 13 +#define REG_V14 14 +#define REG_V15 15 +#define REG_V16 16 +#define REG_V17 17 +#define REG_V18 18 +#define REG_V19 19 +#define REG_V20 20 +#define REG_V21 21 +#define REG_V22 22 +#define REG_V23 23 +#define REG_V24 24 +#define REG_V25 25 +#define REG_V26 26 +#define REG_V27 27 +#define REG_V28 28 +#define REG_V29 29 +#define REG_V30 30 +#define REG_V31 31 + +#endif /* WOLFSSL_RISCV_ASM */ + +#endif /* WOLF_CRYPT_RISCV_64_ASM_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_ecc.h 2024-08-03 07:30:01.000000000 +0000 @@ -44,20 +44,19 @@ int* stat, ecc_key* key); - int silabs_ecc_make_key(ecc_key* key, int keysize); -int silabs_ecc_import(ecc_key* key, word32 keysize); - -int silabs_ecc_import_private(ecc_key* key, word32 keysize); - -int silabs_ecc_sig_to_rs(ecc_key* key, word32 keySz); - -int silabs_ecc_import_private_raw(ecc_key* key, word32 keySz, const char* d, int encType); +int silabs_ecc_import(ecc_key* key, word32 keysize, int pub, int priv); +int silabs_ecc_export_public(ecc_key* key, sl_se_key_descriptor_t* seKey); int silabs_ecc_shared_secret(ecc_key* private_key, ecc_key* public_key, byte* out, word32* outlen); +#if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT) +int silabs_ecc_load_vault(ecc_key* key); +#endif + + #endif /* WOLFSSL_SILABS_SE_ACCEL */ #endif /* _SILABS_ECC_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_hash.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_hash.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_hash.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/silabs/silabs_hash.h 2024-08-03 07:30:01.000000000 +0000 @@ -22,45 +22,75 @@ #ifndef _SILABS_HASH_H_ #define _SILABS_HASH_H_ -#include +#include #if defined(WOLFSSL_SILABS_SE_ACCEL) +#include + #include #include #include -#if defined(SL_SE_HASH_SHA384) && !defined(NO_SHA384) -#define WOLFSSL_SILABS_SHA384 +/* workaround to detect older Gecko SDK version 3 */ +#if !defined(WOLFSSL_SILABS_SE_ACCEL_3) && !defined(SL_SE_PRF_HMAC_SHA1) + /* Use streaming instead of new multipart */ + #define WOLFSSL_SILABS_SE_ACCEL_3 #endif -#if defined(SL_SE_HASH_SHA512) && !defined(NO_SHA384) -#define WOLFSSL_SILABS_SHA512 +/* Enable SHA2-2384 and SHA2-512 if HW supports and enabled */ +#if (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT) + #ifdef WOLFSSL_SHA384 + #define WOLFSSL_SILABS_SHA384 + #endif + #ifdef WOLFSSL_SHA512 + #define WOLFSSL_SILABS_SHA512 + #endif #endif +#ifdef WOLFSSL_SILABS_SE_ACCEL_3 +/* Gecko SDK v3 uses "streaming" interface */ typedef struct { - sl_se_hash_streaming_context_t hash_ctx; - sl_se_command_context_t cmd_ctx; - union hash_type_ctx_u { - sl_se_sha1_streaming_context_t sha1_ctx; - sl_se_sha224_streaming_context_t sha224_ctx; - sl_se_sha256_streaming_context_t sha256_ctx; -#ifdef WOLFSSL_SILABS_SHA384 - sl_se_sha384_streaming_context_t sha384_ctx; -#endif -#ifdef WOLFSSL_SILABS_SHA512 - sl_se_sha512_streaming_context_t sha512_ctx; -#endif - } hash_type_ctx; + sl_se_hash_streaming_context_t hash_ctx; + sl_se_command_context_t cmd_ctx; + union hash_type_ctx_u { + sl_se_sha1_streaming_context_t sha1_ctx; + sl_se_sha224_streaming_context_t sha224_ctx; + sl_se_sha256_streaming_context_t sha256_ctx; + #ifdef WOLFSSL_SILABS_SHA384 + sl_se_sha384_streaming_context_t sha384_ctx; + #endif + #ifdef WOLFSSL_SILABS_SHA512 + sl_se_sha512_streaming_context_t sha512_ctx; + #endif + } hash_type_ctx; +} wc_silabs_sha_t; +#else +/* Gecko SDK v4 or later uses "multipart" interface */ +typedef struct { + sl_se_command_context_t cmd_ctx; + union hash_type_ctx_u { + sl_se_sha1_multipart_context_t sha1_ctx; + sl_se_sha224_multipart_context_t sha224_ctx; + sl_se_sha256_multipart_context_t sha256_ctx; + #ifdef WOLFSSL_SILABS_SHA384 + sl_se_sha384_multipart_context_t sha384_ctx; + #endif + #ifdef WOLFSSL_SILABS_SHA512 + sl_se_sha512_multipart_context_t sha512_ctx; + #endif + } hash_type_ctx; } wc_silabs_sha_t; +#endif -int wc_silabs_se_hash_init (wc_silabs_sha_t* sha, enum wc_HashType type); -int wc_silabs_se_hash_update (wc_silabs_sha_t* sha, const byte* data, word32 len); -int wc_silabs_se_hash_final (wc_silabs_sha_t* sha, byte* hash); +int wc_silabs_se_hash_init(wc_silabs_sha_t* sha, enum wc_HashType type); +int wc_silabs_se_hash_update(wc_silabs_sha_t* sha, const byte* data, + word32 len); +int wc_silabs_se_hash_final(wc_silabs_sha_t* sha, byte* hash, word32 len); -#endif /* defined(WOLFSSL_SILABS_SE_ACCEL) */ +#endif /* WOLFSSL_SILABS_SE_ACCEL */ #endif /* _SILABS_HASH_H_ */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/st/stm32.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/st/stm32.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/st/stm32.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/st/stm32.h 2024-08-03 07:30:01.000000000 +0000 @@ -126,21 +126,29 @@ #if !defined(STM32_CRYPTO_AES_GCM) && (defined(WOLFSSL_STM32F4) || \ defined(WOLFSSL_STM32F7) || defined(WOLFSSL_STM32L4) || \ defined(WOLFSSL_STM32L5) || defined(WOLFSSL_STM32H7) || \ - defined(WOLFSSL_STM32U5)) + defined(WOLFSSL_STM32U5) || defined(WOLFSSL_STM32H5)) /* Hardware supports AES GCM acceleration */ #define STM32_CRYPTO_AES_GCM #endif - #if defined(WOLFSSL_STM32WB) + #if defined(WOLFSSL_STM32WB) || defined(WOLFSSL_STM32WL) #define STM32_CRYPTO_AES_ONLY /* crypto engine only supports AES */ - #define CRYP AES1 + #ifdef WOLFSSL_STM32WB + #define CRYP AES1 + #else + #define CRYP AES + #endif #define STM32_HAL_V2 #endif #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) || \ - defined(WOLFSSL_STM32U5) + defined(WOLFSSL_STM32U5) || defined(WOLFSSL_STM32H5) #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32U5) #define STM32_CRYPTO_AES_ONLY /* crypto engine only supports AES */ #endif + #if defined(WOLFSSL_STM32H5) + #define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE + #define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE + #endif #define CRYP AES #ifndef CRYP_AES_GCM #define CRYP_AES_GCM CRYP_AES_GCM_GMAC @@ -168,9 +176,11 @@ struct Aes; #ifdef WOLFSSL_STM32_CUBEMX int wc_Stm32_Aes_Init(struct Aes* aes, CRYP_HandleTypeDef* hcryp); + void wc_Stm32_Aes_Cleanup(void); #else /* Standard Peripheral Library */ int wc_Stm32_Aes_Init(struct Aes* aes, CRYP_InitTypeDef* cryptInit, CRYP_KeyInitTypeDef* keyInit); + void wc_Stm32_Aes_Cleanup(void); #endif /* WOLFSSL_STM32_CUBEMX */ #endif /* !NO_AES */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/ti/ti-ccm.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/ti/ti-ccm.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/ti/ti-ccm.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/ti/ti-ccm.h 2024-08-03 07:30:01.000000000 +0000 @@ -27,7 +27,7 @@ #include #endif -#include +#include #if defined(WOLFSSL_TI_CRYPT) || defined(WOLFSSL_TI_HASH) @@ -37,8 +37,8 @@ void wolfSSL_TI_lockCCM(void) ; void wolfSSL_TI_unlockCCM(void) ; #else -#define wolfSSL_TI_lockCCM() -#define wolfSSL_TI_unlockCCM() +#define wolfSSL_TI_lockCCM() WC_DO_NOTHING +#define wolfSSL_TI_unlockCCM() WC_DO_NOTHING #endif #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-sha3.h 2024-08-03 07:30:01.000000000 +0000 @@ -35,7 +35,7 @@ #endif /* Sha3 digest */ -typedef struct Sha3 { +typedef struct wc_Sha3 { #ifdef WOLFSSL_XILINX_CRYPT_VERSAL wc_Xsecure xSec; #else diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/port/xilinx/xil-versal-glue.h 2024-08-03 07:30:01.000000000 +0000 @@ -37,8 +37,8 @@ #define XIL_CAST_U64(v) ((u64)(UINTPTR)(v)) #ifdef XSECURE_CACHE_DISABLE -#define WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(p, l) do{}while(0) -#define WOLFSSL_XIL_DCACHE_FLUSH_RANGE(p, l) do{}while(0) +#define WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(p, l) WC_DO_NOTHING +#define WOLFSSL_XIL_DCACHE_FLUSH_RANGE(p, l) WC_DO_NOTHING #else #define WOLFSSL_XIL_DCACHE_INVALIDATE_RANGE(p, l) \ do{ Xil_DCacheInvalidateRange((p), (l)); }while(0) @@ -51,7 +51,7 @@ #include #define WOLFSSL_XIL_SLEEP(n) do{ sleep(n); }while(0) #else -#define WOLFSSL_XIL_SLEEP(n) do{}while(0) +#define WOLFSSL_XIL_SLEEP(n) WC_DO_NOTHING #endif /* Provide our own message macro since the Versal PLM maybe diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pwdbased.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pwdbased.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pwdbased.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/pwdbased.h 2024-08-03 07:30:01.000000000 +0000 @@ -35,6 +35,10 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_pbkdf_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_PBKDF_sanity(void); +#endif /* * hashType renamed to typeH to avoid shadowing global declaration here: * wolfssl/wolfcrypt/asn.h line 173 in enum Oid_Types diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/random.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/random.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/random.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/random.h 2024-08-03 07:30:01.000000000 +0000 @@ -30,21 +30,19 @@ #include -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) #include #endif /* HAVE_FIPS_VERSION >= 2 */ -/* included for fips @wc_fips */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -#include -#endif - #ifdef __cplusplus extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_drbg_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_DRBG_sanity(void); +#endif + /* Maximum generate block length */ #ifndef RNG_MAX_BLOCK_LEN #ifdef HAVE_INTEL_QA @@ -211,7 +209,10 @@ #endif /* HAVE_WNR */ -WOLFSSL_ABI WOLFSSL_API WC_RNG* wc_rng_new(byte* nonce, word32 nonceSz, void* heap); +WOLFSSL_ABI WOLFSSL_API WC_RNG* wc_rng_new(byte* nonce, word32 nonceSz, + void* heap); +WOLFSSL_API int wc_rng_new_ex(WC_RNG **rng, byte* nonce, word32 nonceSz, + void* heap, int devId); WOLFSSL_ABI WOLFSSL_API void wc_rng_free(WC_RNG* rng); @@ -245,8 +246,8 @@ #endif #ifdef HAVE_HASHDRBG - WOLFSSL_LOCAL int wc_RNG_DRBG_Reseed(WC_RNG* rng, const byte* entropy, - word32 entropySz); + WOLFSSL_API int wc_RNG_DRBG_Reseed(WC_RNG* rng, const byte* entropy, + word32 entropySz); WOLFSSL_API int wc_RNG_TestSeed(const byte* seed, word32 seedSz); WOLFSSL_API int wc_RNG_HealthTest(int reseed, const byte* entropyA, word32 entropyASz, diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/rsa.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/rsa.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/rsa.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/rsa.h 2024-08-03 07:30:01.000000000 +0000 @@ -58,23 +58,10 @@ #define NO_RSA_BOUNDS_CHECK #endif -/* allow for user to plug in own crypto */ -#if !defined(HAVE_FIPS) && (defined(HAVE_USER_RSA) || defined(HAVE_FAST_RSA)) - #include "user_rsa.h" -#else +#include +#include #if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -/* for fips @wc_fips */ -#include -#if defined(CYASSL_KEY_GEN) && !defined(WOLFSSL_KEY_GEN) - #define WOLFSSL_KEY_GEN -#endif -#else - #include - #include -#endif /* HAVE_FIPS && HAVE_FIPS_VERION 1 */ -#if defined(HAVE_FIPS) && \ defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) #include #endif @@ -102,10 +89,19 @@ #include #endif +#if defined(WOLFSSL_RENESAS_FSPSM) + #include +#endif + #ifdef __cplusplus extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_rsa_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_RSA_sanity(void); +#endif + #ifndef RSA_MIN_SIZE #define RSA_MIN_SIZE 512 #endif @@ -145,6 +141,11 @@ #endif #endif +#if FIPS_VERSION3_GE(6,0,0) + #define WC_RSA_FIPS_GEN_MIN 2048 + #define WC_RSA_FIPS_SIG_MIN (WC_RSA_FIPS_GEN_MIN/8) +#endif + enum { RSA_PUBLIC = 0, RSA_PRIVATE = 1, @@ -213,11 +214,9 @@ byte keyIdSet; #endif #ifdef WOLF_CRYPTO_CB + void* devCtx; int devId; #endif -#if defined(HAVE_PKCS11) - byte isPkcs11 : 1; /* indicate if PKCS11 is preferred */ -#endif #ifdef WOLFSSL_ASYNC_CRYPT WC_ASYNC_DEV asyncDev; #ifdef WOLFSSL_CERT_GEN @@ -243,8 +242,8 @@ char label[RSA_MAX_LABEL_LEN]; int labelLen; #endif -#if defined(WOLFSSL_ASYNC_CRYPT) || !defined(WOLFSSL_RSA_VERIFY_INLINE) && \ - !defined(WOLFSSL_NO_MALLOC) +#if !defined(WOLFSSL_NO_MALLOC) && (defined(WOLFSSL_ASYNC_CRYPT) || \ + (!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_VERIFY_INLINE))) byte dataIsAlloc; #endif #ifdef WC_RSA_NONBLOCK @@ -263,6 +262,9 @@ #if defined(WOLFSSL_DEVCRYPTO_RSA) WC_CRYPTODEV ctx; #endif +#if defined(WOLFSSL_RENESAS_FSPSM) + FSPSM_RSA_CTX ctx; +#endif }; #ifndef WC_RSAKEY_TYPE_DEFINED @@ -439,18 +441,23 @@ int nlen, int* isPrime); #endif -WOLFSSL_LOCAL int wc_RsaPad_ex(const byte* input, word32 inputLen, byte* pkcsBlock, - word32 pkcsBlockLen, byte padValue, WC_RNG* rng, int padType, - enum wc_HashType hType, int mgf, byte* optLabel, word32 labelLen, - int saltLen, int bits, void* heap); -WOLFSSL_LOCAL int wc_RsaUnPad_ex(byte* pkcsBlock, word32 pkcsBlockLen, byte** out, - byte padValue, int padType, enum wc_HashType hType, - int mgf, byte* optLabel, word32 labelLen, int saltLen, - int bits, void* heap); +WOLFSSL_API int wc_RsaPad_ex(const byte* input, word32 inputLen, + byte* pkcsBlock, word32 pkcsBlockLen, byte padValue, + WC_RNG* rng, int padType, enum wc_HashType hType, int mgf, + byte* optLabel, word32 labelLen, int saltLen, int bits, void* heap); +WOLFSSL_API int wc_RsaUnPad_ex(byte* pkcsBlock, word32 pkcsBlockLen, + byte** out, byte padValue, int padType, enum wc_HashType hType, int mgf, + byte* optLabel, word32 labelLen, int saltLen, int bits, void* heap); WOLFSSL_LOCAL int wc_hash2mgf(enum wc_HashType hType); +WOLFSSL_LOCAL int RsaFunctionCheckIn(const byte* in, word32 inLen, RsaKey* key, + int checkSmallCt); -#endif /* HAVE_USER_RSA */ +WOLFSSL_API int wc_RsaPrivateKeyDecodeRaw(const byte* n, word32 nSz, + const byte* e, word32 eSz, const byte* d, word32 dSz, + const byte* u, word32 uSz, const byte* p, word32 pSz, + const byte* q, word32 qSz, const byte* dP, word32 dPSz, + const byte* dQ, word32 dQSz, RsaKey* key); #ifdef __cplusplus } /* extern "C" */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/settings.h 2024-08-03 07:30:01.000000000 +0000 @@ -1,6 +1,6 @@ /* settings.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -224,7 +224,7 @@ /* #define WOLFSSL_ESPIDF */ /* Uncomment next line if using Espressif ESP32-WROOM-32 */ -/* #define WOLFSSL_ESPWROOM32 */ +/* #define WOLFSSL_ESP32 */ /* Uncomment next line if using Espressif ESP32-WROOM-32SE */ /* #define WOLFSSL_ESPWROOM32SE */ @@ -265,6 +265,54 @@ /* Uncomment next line if using MAXQ108x */ /* #define WOLFSSL_MAXQ108X */ +/* Check PLATFORMIO first, as it may define other known environments. */ +#ifdef PLATFORMIO + #ifdef ESP_PLATFORM + /* Turn on the wolfSSL ESPIDF flag for the PlatformIO ESP-IDF detect */ + #define WOLFSSL_ESPIDF + #endif /* ESP_PLATFORM */ + + /* Ensure all PlatformIO boards have the wolfSSL user_setting.h enabled. */ + #ifndef WOLFSSL_USER_SETTINGS + #define WOLFSSL_USER_SETTINGS + #endif /* WOLFSSL_USER_SETTINGS */ + + /* Similar to Arduino we have limited build control, so suppress warning */ + #undef WOLFSSL_IGNORE_FILE_WARN + #define WOLFSSL_IGNORE_FILE_WARN +#endif + +#if defined(ARDUINO) + /* Due to limited build control, we'll ignore file warnings. */ + /* See https://github.com/arduino/arduino-cli/issues/631 */ + #undef WOLFSSL_IGNORE_FILE_WARN + #define WOLFSSL_IGNORE_FILE_WARN + + /* we don't have the luxury of compiler options, so manually define */ + #if defined(__arm__) + #undef WOLFSSL_ARDUINO + #define WOLFSSL_ARDUINO + /* ESP32? */ + #endif + + #undef FREERTOS + #ifndef WOLFSSL_USER_SETTINGS + #define WOLFSSL_USER_SETTINGS + #endif /* WOLFSSL_USER_SETTINGS */ + + /* board-specific */ + #if defined(__AVR__) + #define WOLFSSL_NO_SOCK + #define NO_WRITEV + #elif defined(__arm__) + #define WOLFSSL_NO_SOCK + #define NO_WRITEV + #elif defined(ESP32) || defined(ESP8266) + /* assume sockets available */ + #else + #define WOLFSSL_NO_SOCK + #endif +#endif #ifdef WOLFSSL_USER_SETTINGS #include "user_settings.h" @@ -275,29 +323,72 @@ #include -#define WOLFSSL_MAKE_FIPS_VERSION(major, minor) (((major) * 256) + (minor)) +/*------------------------------------------------------------*/ +#define WOLFSSL_MAKE_FIPS_VERSION3(major, minor, patch) \ + (((major) * 65536) + ((minor) * 256) + (patch)) +#define WOLFSSL_MAKE_FIPS_VERSION(major, minor) \ + WOLFSSL_MAKE_FIPS_VERSION3(major, minor, 0) + #if !defined(HAVE_FIPS) - #define WOLFSSL_FIPS_VERSION_CODE WOLFSSL_MAKE_FIPS_VERSION(0,0) + #define WOLFSSL_FIPS_VERSION_CODE WOLFSSL_MAKE_FIPS_VERSION3(0,0,0) + #define WOLFSSL_FIPS_VERSION2_CODE WOLFSSL_FIPS_VERSION_CODE #elif !defined(HAVE_FIPS_VERSION) - #define WOLFSSL_FIPS_VERSION_CODE WOLFSSL_MAKE_FIPS_VERSION(1,0) + #define WOLFSSL_FIPS_VERSION_CODE WOLFSSL_MAKE_FIPS_VERSION3(1,0,0) + #define WOLFSSL_FIPS_VERSION2_CODE WOLFSSL_FIPS_VERSION_CODE #elif !defined(HAVE_FIPS_VERSION_MINOR) - #define WOLFSSL_FIPS_VERSION_CODE WOLFSSL_MAKE_FIPS_VERSION(HAVE_FIPS_VERSION,0) + #define WOLFSSL_FIPS_VERSION_CODE \ + WOLFSSL_MAKE_FIPS_VERSION3(HAVE_FIPS_VERSION,0,0) + #define WOLFSSL_FIPS_VERSION2_CODE WOLFSSL_FIPS_VERSION_CODE +#elif !defined(HAVE_FIPS_VERSION_PATCH) + #define WOLFSSL_FIPS_VERSION_CODE \ + WOLFSSL_MAKE_FIPS_VERSION3(HAVE_FIPS_VERSION, \ + HAVE_FIPS_VERSION_MINOR, 0) + #define WOLFSSL_FIPS_VERSION2_CODE WOLFSSL_FIPS_VERSION_CODE #else - #define WOLFSSL_FIPS_VERSION_CODE WOLFSSL_MAKE_FIPS_VERSION(HAVE_FIPS_VERSION,HAVE_FIPS_VERSION_MINOR) -#endif + #define WOLFSSL_FIPS_VERSION_CODE \ + WOLFSSL_MAKE_FIPS_VERSION3(HAVE_FIPS_VERSION,\ + HAVE_FIPS_VERSION_MINOR, \ + HAVE_FIPS_VERSION_PATCH) + #define WOLFSSL_FIPS_VERSION2_CODE \ + WOLFSSL_MAKE_FIPS_VERSION3(HAVE_FIPS_VERSION,\ + HAVE_FIPS_VERSION_MINOR, \ + 0) +#endif + +#define FIPS_VERSION_LT(major,minor) \ + (WOLFSSL_FIPS_VERSION2_CODE < WOLFSSL_MAKE_FIPS_VERSION(major,minor)) +#define FIPS_VERSION_LE(major,minor) \ + (WOLFSSL_FIPS_VERSION2_CODE <= WOLFSSL_MAKE_FIPS_VERSION(major,minor)) +#define FIPS_VERSION_EQ(major,minor) \ + (WOLFSSL_FIPS_VERSION2_CODE == WOLFSSL_MAKE_FIPS_VERSION(major,minor)) +#define FIPS_VERSION_GE(major,minor) \ + (WOLFSSL_FIPS_VERSION2_CODE >= WOLFSSL_MAKE_FIPS_VERSION(major,minor)) +#define FIPS_VERSION_GT(major,minor) \ + (WOLFSSL_FIPS_VERSION2_CODE > WOLFSSL_MAKE_FIPS_VERSION(major,minor)) + +#define FIPS_VERSION3_LT(major,minor,patch) \ + (WOLFSSL_FIPS_VERSION_CODE < WOLFSSL_MAKE_FIPS_VERSION3(major,minor,patch)) +#define FIPS_VERSION3_LE(major,minor,patch) \ + (WOLFSSL_FIPS_VERSION_CODE <= WOLFSSL_MAKE_FIPS_VERSION3(major,minor,patch)) +#define FIPS_VERSION3_EQ(major,minor,patch) \ + (WOLFSSL_FIPS_VERSION_CODE == WOLFSSL_MAKE_FIPS_VERSION3(major,minor,patch)) +#define FIPS_VERSION3_GE(major,minor,patch) \ + (WOLFSSL_FIPS_VERSION_CODE >= WOLFSSL_MAKE_FIPS_VERSION3(major,minor,patch)) +#define FIPS_VERSION3_GT(major,minor,patch) \ + (WOLFSSL_FIPS_VERSION_CODE > WOLFSSL_MAKE_FIPS_VERSION3(major,minor,patch)) +/*------------------------------------------------------------*/ -#define FIPS_VERSION_LT(major,minor) (WOLFSSL_FIPS_VERSION_CODE < WOLFSSL_MAKE_FIPS_VERSION(major,minor)) -#define FIPS_VERSION_LE(major,minor) (WOLFSSL_FIPS_VERSION_CODE <= WOLFSSL_MAKE_FIPS_VERSION(major,minor)) -#define FIPS_VERSION_EQ(major,minor) (WOLFSSL_FIPS_VERSION_CODE == WOLFSSL_MAKE_FIPS_VERSION(major,minor)) -#define FIPS_VERSION_GE(major,minor) (WOLFSSL_FIPS_VERSION_CODE >= WOLFSSL_MAKE_FIPS_VERSION(major,minor)) -#define FIPS_VERSION_GT(major,minor) (WOLFSSL_FIPS_VERSION_CODE > WOLFSSL_MAKE_FIPS_VERSION(major,minor)) /* make sure old RNG name is used with CTaoCrypt FIPS */ #ifdef HAVE_FIPS #if FIPS_VERSION_LT(2,0) #define WC_RNG RNG #else - #ifndef WOLFSSL_STM32L4 + /* RNG needs to be defined to WC_RNG anytime another library on the + * system or other set of headers included by wolfSSL already defines + * RNG. Examples are: + * wolfEngine, wolfProvider and potentially other use-cases */ + #if !defined(RNG) && !defined(NO_OLD_RNGNAME) #define RNG WC_RNG #endif #endif @@ -312,6 +403,44 @@ #endif #endif +/* --------------------------------------------------------------------------- + * Dual Algorithm Certificate Required Features. + * --------------------------------------------------------------------------- + */ +#ifdef WOLFSSL_DUAL_ALG_CERTS + +#ifndef WOLFSSL_ASN_TEMPLATE + #error "Dual alg cert support requires the ASN.1 template feature." +#endif + +#ifdef NO_RSA + #error "Need RSA or else dual alg cert example will not work." +#endif + +#ifndef HAVE_ECC + #error "Need ECDSA or else dual alg cert example will not work." +#endif + +#undef WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_GEN + +#undef WOLFSSL_CUSTOM_OID +#define WOLFSSL_CUSTOM_OID + +#undef HAVE_OID_ENCODING +#define HAVE_OID_ENCODING + +#undef WOLFSSL_CERT_EXT +#define WOLFSSL_CERT_EXT + +#undef OPENSSL_EXTRA +#define OPENSSL_EXTRA + +#undef HAVE_OID_DECODING +#define HAVE_OID_DECODING +#endif /* WOLFSSL_DUAL_ALG_CERTS */ + + #if defined(_WIN32) && !defined(_M_X64) && \ defined(HAVE_AESGCM) && defined(WOLFSSL_AESNI) @@ -338,42 +467,151 @@ #include #endif +#if defined(ARDUINO) + #if defined(ESP32) + #ifndef NO_ARDUINO_DEFAULT + #define SIZEOF_LONG_LONG 8 + #ifdef FREERTOS + #undef FREERTOS + #endif + + #define WOLFSSL_LWIP + #define NO_WRITEV + #define NO_WOLFSSL_DIR + #define WOLFSSL_NO_CURRDIR + + #define TFM_TIMING_RESISTANT + #define ECC_TIMING_RESISTANT + #define WC_RSA_BLINDING + #define WC_NO_CACHE_RESISTANT + #endif /* !NO_ARDUINO_DEFAULT */ + #elif defined(__arm__) + #define NO_WRITEV + #define NO_WOLFSSL_DIR + #define WOLFSSL_NO_CURRDIR + #elif defined(OTHERBOARD) + /* TODO: define other Arduino boards here */ + #endif +#endif + #if defined(WOLFSSL_ESPIDF) - #define FREERTOS - #define WOLFSSL_LWIP - #define NO_WRITEV #define SIZEOF_LONG_LONG 8 - #define NO_WOLFSSL_DIR - #define WOLFSSL_NO_CURRDIR + #ifndef NO_ESPIDF_DEFAULT + #define FREERTOS + #define WOLFSSL_LWIP + #define NO_WRITEV + #define NO_WOLFSSL_DIR + #define WOLFSSL_NO_CURRDIR - #define TFM_TIMING_RESISTANT - #define ECC_TIMING_RESISTANT - #define WC_RSA_BLINDING + #define TFM_TIMING_RESISTANT + #define ECC_TIMING_RESISTANT + + /* WC_RSA_BLINDING takes up extra space! */ + #define WC_RSA_BLINDING + + /* Cache Resistant features are on by default, but has performance + * penalty on embedded systems. May not be needed here. Disabled: */ + #define WC_NO_CACHE_RESISTANT + #endif /* !WOLFSSL_ESPIDF_NO_DEFAULT */ -#if defined(WOLFSSL_ESPWROOM32) || defined(WOLFSSL_ESPWROOM32SE) - #ifndef NO_ESP32WROOM32_CRYPT - #define WOLFSSL_ESP32WROOM32_CRYPT + #if defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) + #error "NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 cannot be defined without" \ + "NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 (enable or disable both)" + #endif + #if defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384) + #error "NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512 cannot be defined without" \ + "NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384 (enable or disable both)" + #endif +#if defined(WOLFSSL_ESPWROOM32) + /* WOLFSSL_ESPWROOM32 is a legacy macro gate. + ** Not be be confused with WOLFSSL_ESPWROOM32SE, naming a specific board */ + #undef WOLFSSL_ESP32 + #define WOLFSSL_ESP32 +#endif + +#if defined(NO_ESP32WROOM32_CRYPT) + #undef NO_ESP32WROOM32_CRYPT + #define NO_ESP32_CRYPT + #error "Please use NO_ESP32_CRYPT not NO_ESP32WROOM32_CRYPT" +#endif + +#if defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + #undef NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH + #define NO_WOLFSSL_ESP32_CRYPT_HASH + #error "Please use NO_WOLFSSL_ESP32_CRYPT_HASH not NO_ESP32WROOM32_CRYPT" +#endif + +#if defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_AES) + #undef NO_WOLFSSL_ESP32WROOM32_CRYPT_AES + #define NO_WOLFSSL_ESP32_CRYPT_AES + #error "Please use NO_WOLFSSL_ESP32_CRYPT_AES" \ + " not " "NO_WOLFSSL_ESP32WROOM32_CRYPT_AES" +#endif + +#if defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) + #undef NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI + #define NO_WOLFSSL_ESP32_CRYPT_RSA_PRI + #error "Please use NO_WOLFSSL_ESP32_CRYPT_RSA_PRI" \ + " not " "NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI" +#endif + +#if defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) + #ifndef NO_ESP32_CRYPT + #define WOLFSSL_ESP32_CRYPT #if defined(ESP32_USE_RSA_PRIMITIVE) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI) - #define WOLFSSL_ESP32WROOM32_CRYPT_RSA_PRI + !defined(NO_WOLFSSL_ESP32_CRYPT_RSA_PRI) + #define WOLFSSL_ESP32_CRYPT_RSA_PRI #define WOLFSSL_SMALL_STACK #endif - #endif -#endif + #endif + + #if defined(WOLFSSL_SP_RISCV32) + #if defined(CONFIG_IDF_TARGET_ESP32C2) || \ + defined(CONFIG_IDF_TARGET_ESP32C3) || \ + defined(CONFIG_IDF_TARGET_ESP32C6) + /* ok, only the known C2, C3, C6 chips allowed */ + #else + #error "WOLFSSL_SP_RISCV32 can only be used on RISC-V architecture" + #endif + #endif + #if defined(WOLFSSL_SM2) || defined(WOLFSSL_SM3) || defined(WOLFSSL_SM4) + /* SM settings */ + #undef WOLFSSL_BASE16 + #define WOLFSSL_BASE16 /* required for WOLFSSL_SM2 */ + + #undef WOLFSSL_SM4_ECB + #define WOLFSSL_SM4_ECB + + #undef WOLFSSL_SM4_CBC + #define WOLFSSL_SM4_CBC + + #undef WOLFSSL_SM4_CTR + #define WOLFSSL_SM4_CTR + + #undef WOLFSSL_SM4_GCM + #define WOLFSSL_SM4_GCM + + #undef WOLFSSL_SM4_CCM + #define WOLFSSL_SM4_CCM + + #undef HAVE_POLY1305 + #define HAVE_POLY1305 + + #undef HAVE_CHACHA + #define HAVE_CHACHA + + #undef HAVE_AESGCM + #define HAVE_AESGCM + #endif /* SM */ +#endif /* defined(WOLFSSL_ESP32) || defined(WOLFSSL_ESPWROOM32SE) */ #endif /* WOLFSSL_ESPIDF */ -#if defined(WOLFCRYPT_ONLY) - #undef WOLFSSL_RENESAS_TSIP -#endif /* WOLFCRYPT_ONLY */ #if defined(WOLFSSL_RENESAS_TSIP) #define TSIP_TLS_HMAC_KEY_INDEX_WORDSIZE 64 #define TSIP_TLS_MASTERSECRET_SIZE 80 /* 20 words */ #define TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY 560 /* in byte */ - #if !defined(NO_RENESAS_TSIP_CRYPT) && defined(WOLFSSL_RENESAS_RX65N) - #define WOLFSSL_RENESAS_TSIP_CRYPT - #define WOLFSSL_RENESAS_TSIP_TLS - #define WOLFSSL_RENESAS_TSIP_TLS_AES_CRYPT - #endif #endif /* WOLFSSL_RENESAS_TSIP */ #if !defined(WOLFSSL_NO_HASH_RAW) && defined(WOLFSSL_RENESAS_RX64_HASH) @@ -382,15 +620,15 @@ #endif #if defined(WOLFSSL_RENESAS_SCEPROTECT) - #define SCE_TLS_MASTERSECRET_SIZE 80 /* 20 words */ + #define FSPSM_TLS_MASTERSECRET_SIZE 80 /* 20 words */ #define TSIP_TLS_HMAC_KEY_INDEX_WORDSIZE 64 - #define TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY 560 /* in bytes */ - #define SCE_TLS_CLIENTRANDOM_SZ 36 /* in bytes */ - #define SCE_TLS_SERVERRANDOM_SZ 36 /* in bytes */ - #define SCE_TLS_ENCRYPTED_ECCPUBKEY_SZ 96 /* in bytes */ + #define TSIP_TLS_ENCPUBKEY_SZ_BY_CERTVRFY 560 /* in bytes */ + #define FSPSM_TLS_CLIENTRANDOM_SZ 36 /* in bytes */ + #define FSPSM_TLS_SERVERRANDOM_SZ 36 /* in bytes */ + #define FSPSM_TLS_ENCRYPTED_ECCPUBKEY_SZ 96 /* in bytes */ - #define WOLFSSL_RENESAS_SCEPROTECT_ECC - #if defined(WOLFSSL_RENESAS_SCEPROTECT_ECC) + #define WOLFSSL_RENESAS_FSPSM_ECC + #if defined(WOLFSSL_RENESAS_FSPSM_ECC) #define HAVE_PK_CALLBACKS /* #define DEBUG_PK_CB */ #endif @@ -559,8 +797,8 @@ #ifdef WOLFSSL_PICOTCP_DEMO #define WOLFSSL_STM32 #define TFM_TIMING_RESISTANT - #define XMALLOC(s, h, type) PICO_ZALLOC((s)) - #define XFREE(p, h, type) PICO_FREE((p)) + #define XMALLOC(s, h, type) ((void)(h), (void)(type), PICO_ZALLOC((s))) + #define XFREE(p, h, type) ((void)(h), (void)(type), PICO_FREE((p))) #define SINGLE_THREADED #define NO_WRITEV #define WOLFSSL_USER_IO @@ -591,11 +829,20 @@ #ifdef WOLFSSL_ARDUINO + /* Define WOLFSSL_USER_IO here to avoid check in internal.c */ + #define WOLFSSL_USER_IO + #define NO_WRITEV #define NO_WOLFSSL_DIR #define SINGLE_THREADED #define NO_DEV_RANDOM - #ifndef INTEL_GALILEO /* Galileo has time.h compatibility */ + #if defined(INTEL_GALILEO) || defined(ESP32) + /* boards with has time.h compatibility */ + #elif defined(__arm__) + /* TODO is time really missing from Arduino Due? */ + /* This is a brute-force solution to make it work: */ + #define NO_ASN_TIME + #else #define TIME_OVERRIDES #ifndef XTIME #error "Must define XTIME externally see porting guide" @@ -747,9 +994,9 @@ extern void *uITRON4_realloc(void *p, size_t sz) ; extern void uITRON4_free(void *p) ; -#define XMALLOC(sz, heap, type) uITRON4_malloc(sz) -#define XREALLOC(p, sz, heap, type) uITRON4_realloc(p, sz) -#define XFREE(p, heap, type) uITRON4_free(p) +#define XMALLOC(sz, heap, type) ((void)(heap), (void)(type), uITRON4_malloc(sz)) +#define XREALLOC(p, sz, heap, type) ((void)(heap), (void)(type), uITRON4_realloc(p, sz)) +#define XFREE(p, heap, type) ((void)(heap), (void)(type), uITRON4_free(p)) #endif #if defined(WOLFSSL_uTKERNEL2) @@ -759,9 +1006,9 @@ void* uTKernel_malloc(unsigned int sz); void* uTKernel_realloc(void *p, unsigned int sz); void uTKernel_free(void *p); - #define XMALLOC(s, h, type) uTKernel_malloc((s)) - #define XREALLOC(p, n, h, t) uTKernel_realloc((p), (n)) - #define XFREE(p, h, type) uTKernel_free((p)) + #define XMALLOC(s, h, type) ((void)(h), (void)(type), uTKernel_malloc((s))) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), uTKernel_realloc((p), (n))) + #define XFREE(p, h, type) ((void)(h), (void)(type), uTKernel_free((p))) #endif #ifndef NO_STDIO_FGETS_REMAP @@ -789,11 +1036,11 @@ #if defined(WOLFSSL_LEANPSK) && !defined(XMALLOC_USER) && \ - !defined(NO_WOLFSSL_MEMORY) + !defined(NO_WOLFSSL_MEMORY) && !defined(WOLFSSL_STATIC_MEMORY) #include - #define XMALLOC(s, h, type) malloc((s)) - #define XFREE(p, h, type) free((p)) - #define XREALLOC(p, n, h, t) realloc((p), (n)) + #define XMALLOC(s, h, type) ((void)(h), (void)(type), malloc((s))) + #define XFREE(p, h, type) ((void)(h), (void)(type), free((p))) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), realloc((p), (n))) #endif #if defined(XMALLOC_USER) && defined(SSN_BUILDING_LIBYASSL) @@ -807,21 +1054,45 @@ #ifdef FREERTOS - #include "FreeRTOS.h" - #include + + #ifdef PLATFORMIO + #include + #include + #else + #include "FreeRTOS.h" + #include + #endif #if !defined(XMALLOC_USER) && !defined(NO_WOLFSSL_MEMORY) && \ !defined(WOLFSSL_STATIC_MEMORY) && !defined(WOLFSSL_TRACK_MEMORY) - #define XMALLOC(s, h, type) pvPortMalloc((s)) - #define XFREE(p, h, type) vPortFree((p)) + + /* XMALLOC */ + #if defined(WOLFSSL_ESPIDF) && \ + (defined(DEBUG_WOLFSSL) || defined(DEBUG_WOLFSSL_MALLOC)) + #include + #define XMALLOC(s, h, type) \ + ((void)(h), (void)(type), wc_debug_pvPortMalloc( \ + (s), (__FILE__), (__LINE__), (__FUNCTION__) )) + #else + #define XMALLOC(s, h, type) \ + ((void)(h), (void)(type), pvPortMalloc((s))) + #endif + + /* XFREE */ + #define XFREE(p, h, type) ((void)(h), (void)(type), vPortFree((p))) + + /* XREALLOC */ #if defined(WOLFSSL_ESPIDF) - /* In IDF, realloc(p, n) is equivalent to - * heap_caps_realloc(p, s, MALLOC_CAP_8BIT) */ - #define XREALLOC(p, n, h, t) realloc((p), (n)) - /* FreeRTOS pvPortRealloc() implementation can be found here: - * https://github.com/wolfSSL/wolfssl-freertos/pull/3/files */ + /* In the Espressif EDP-IDF, realloc(p, n) is equivalent to + * heap_caps_realloc(p, s, MALLOC_CAP_8BIT) + * There's no pvPortRealloc available: */ + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), realloc((p), (n))) #elif defined(USE_INTEGER_HEAP_MATH) || defined(OPENSSL_EXTRA) - #define XREALLOC(p, n, h, t) pvPortRealloc((p), (n)) + /* FreeRTOS pvPortRealloc() implementation can be found here: + * https://github.com/wolfSSL/wolfssl-freertos/pull/3/files */ + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), pvPortRealloc((p), (n))) + #else + /* no XREALLOC available */ #endif #endif @@ -838,12 +1109,18 @@ #define NO_DH #endif #endif - #ifndef NO_DSA - #define NO_DSA + #ifndef HAVE_DSA + #ifndef NO_DSA + #define NO_DSA + #endif #endif #ifndef SINGLE_THREADED - #include "semphr.h" + #ifdef PLATFORMIO + #include + #else + #include "semphr.h" + #endif #endif #endif @@ -862,12 +1139,6 @@ #define NO_MAIN_DRIVER #endif -#ifdef WOLFSSL_TI_CRYPT - #define NO_GCM_ENCRYPT_EXTRA - #define NO_PUBLIC_GCM_SET_IV - #define NO_PUBLIC_CCM_SET_NONCE -#endif - #ifdef WOLFSSL_TIRTOS #define SIZEOF_LONG_LONG 8 #define NO_WRITEV @@ -877,35 +1148,57 @@ * specified in user_settings. */ #ifndef USE_FAST_MATH - #define WOLFSSL_HAVE_SP_ECC #define SP_WORD_SIZE 32 - #define WOLFSSL_HAVE_SP_RSA - #define WOLFSSL_SP_4096 + #define WOLFSSL_HAVE_SP_ECC + #ifndef NO_RSA + #define WOLFSSL_HAVE_SP_RSA + #endif + #ifndef NO_DH + #define WOLFSSL_HAVE_SP_DH + #endif + #if !defined(NO_RSA) || !defined(NO_DH) + /* DH/RSA 2048, 3072 and 4096 */ + #if defined(SP_INT_MAX_BITS) && SP_INT_MAX_BITS >= 4096 + #define WOLFSSL_SP_4096 + #endif + #endif #endif #define TFM_TIMING_RESISTANT #define ECC_TIMING_RESISTANT #define WC_RSA_BLINDING #define NO_DEV_RANDOM #define NO_FILESYSTEM - #define NO_SIG_WRAPPER #define NO_MAIN_DRIVER - #define USE_CERT_BUFFERS_2048 - #define NO_ERROR_STRINGS - /* Uncomment this setting if your toolchain does not offer time.h header */ - /* #define USER_TIME */ + #ifndef NO_CRYPT_TEST + #define USE_CERT_BUFFERS_2048 + #endif + #ifndef DEBUG_WOLFSSL + #define NO_ERROR_STRINGS + #endif + #define HAVE_ECC #define HAVE_ALPN #define USE_WOLF_STRTOK /* use with HAVE_ALPN */ #define HAVE_TLS_EXTENSIONS - #define HAVE_AESGCM #define HAVE_SUPPORTED_CURVES + + #define HAVE_AESGCM + #ifdef __IAR_SYSTEMS_ICC__ #pragma diag_suppress=Pa089 #elif !defined(__GNUC__) /* Suppress the sslpro warning */ #pragma diag_suppress=11 #endif + + /* Uncomment this setting if your toolchain does not offer time.h header */ + /* #define USER_TIME */ #include + #if defined(__ti__) && !defined(USER_TIME) + /* TI internal time() offsets by 2208988800 (1990 -> 1970), + * which overflows signed 32-bit */ + #define NO_TIME_SIGNEDNESS_CHECK + #endif #endif #ifdef EBSNET @@ -918,7 +1211,7 @@ #define SINGLE_THREADED #endif - #if (RTPLATFORM) + #if (defined(RTPLATFORM) && (RTPLATFORM != 0)) #if (!RTP_LITTLE_ENDIAN) #define BIG_ENDIAN_ORDER #endif @@ -937,9 +1230,13 @@ #endif #endif - #define XMALLOC(s, h, type) ((void *)rtp_malloc((s), SSL_PRO_MALLOC)) - #define XFREE(p, h, type) (rtp_free(p)) - #define XREALLOC(p, n, h, t) (rtp_realloc((p), (n))) + #if (WINMSP3) + #define strtok_r strtok_s + #endif + + #define XMALLOC(s, h, type) ((void)(h), (void)(type), ((void *)rtp_malloc((s), SSL_PRO_MALLOC))) + #define XFREE(p, h, type) ((void)(h), (void)(type), rtp_free(p)) + #define XREALLOC(p, n, h, t) ((void)(h), rtp_realloc((p), (n), (t))) #if (WINMSP3) #define XSTRNCASECMP(s1,s2,n) _strnicmp((s1),(s2),(n)) @@ -999,14 +1296,14 @@ #endif #if !defined(XMALLOC_USER) && !defined(NO_WOLFSSL_MEMORY) && \ !defined(WOLFSSL_STATIC_MEMORY) - #define XMALLOC(s, h, type) pvPortMalloc((s)) - #define XFREE(p, h, type) vPortFree((p)) + #define XMALLOC(s, h, type) ((void)(h), (void)(type), pvPortMalloc((s))) + #define XFREE(p, h, type) ((void)(h), (void)(type), vPortFree((p))) /* FreeRTOS pvPortRealloc() implementation can be found here: https://github.com/wolfSSL/wolfssl-freertos/pull/3/files */ #if !defined(USE_FAST_MATH) || defined(HAVE_ED25519) || \ defined(HAVE_ED448) - #define XREALLOC(p, n, h, t) pvPortRealloc((p), (n)) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), pvPortRealloc((p), (n))) #endif #endif #endif @@ -1030,8 +1327,10 @@ /* Copy data out of flash memory and into SRAM */ #define XMEMCPY_P(pdest, psrc, size) memcpy_P((pdest), (psrc), (size)) #else +#ifndef FLASH_QUALIFIER #define FLASH_QUALIFIER #endif +#endif #ifdef FREESCALE_MQX_5_0 /* use normal Freescale MQX port, but with minor changes for 5.0 */ @@ -1062,8 +1361,13 @@ #if !defined(XMALLOC_OVERRIDE) && !defined(XMALLOC_USER) #define XMALLOC_OVERRIDE - #define XMALLOC(s, h, t) (void *)_mem_alloc_system((s)) - #define XFREE(p, h, t) {void* xp = (p); if ((xp)) _mem_free((xp));} + #define XMALLOC(s, h, t) ((void)(h), (void)(t), (void *)_mem_alloc_system((s))) + #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK + #define XFREE(p, h, t) {(void)(h); (void)(t); _mem_free(p);} + #else + #define XFREE(p, h, t) {void* xp = (p); (void)(h); (void)(t); if ((xp)) _mem_free((xp));} + #endif + /* Note: MQX has no realloc, using fastmath above */ #endif #ifdef USE_FAST_MATH @@ -1093,8 +1397,12 @@ #include #endif - #define XMALLOC(s, h, t) (void *)_mem_alloc_system((s)) - #define XFREE(p, h, t) {void* xp = (p); if ((xp)) _mem_free((xp));} + #define XMALLOC(s, h, t) ((void)(h), (void)(t), (void *)_mem_alloc_system((s))) + #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK + #define XFREE(p, h, t) {(void)(h); (void)(t); _mem_free(p);} + #else + #define XFREE(p, h, t) {void* xp = (p); (void)(h); (void)(t); if ((xp)) _mem_free((xp));} + #endif #define XREALLOC(p, n, h, t) _mem_realloc((p), (n)) /* since MQX 4.1.2 */ #define MQX_FILE_PTR FILE * @@ -1107,8 +1415,8 @@ #define WOLFSSL_CRYPT_HW_MUTEX 1 #if !defined(XMALLOC_USER) && !defined(NO_WOLFSSL_MEMORY) - #define XMALLOC(s, h, type) pvPortMalloc((s)) - #define XFREE(p, h, type) vPortFree((p)) + #define XMALLOC(s, h, type) ((void)(h), (void)(type), pvPortMalloc((s))) + #define XFREE(p, h, type) ((void)(h), (void)(type), vPortFree((p))) #endif /* #define USER_TICKS */ @@ -1363,7 +1671,7 @@ defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) || \ defined(WOLFSSL_STM32WB) || defined(WOLFSSL_STM32H7) || \ defined(WOLFSSL_STM32G0) || defined(WOLFSSL_STM32U5) || \ - defined(WOLFSSL_STM32H5) + defined(WOLFSSL_STM32H5) || defined(WOLFSSL_STM32WL) #define SIZEOF_LONG_LONG 8 #ifndef CHAR_BIT @@ -1383,7 +1691,8 @@ #define STM32_CRYPTO #if defined(WOLFSSL_STM32L4) || defined(WOLFSSL_STM32L5) || \ - defined(WOLFSSL_STM32WB) || defined(WOLFSSL_STM32U5) + defined(WOLFSSL_STM32WB) || defined(WOLFSSL_STM32U5) || \ + defined(WOLFSSL_STM32WL) #define NO_AES_192 /* hardware does not support 192-bit */ #endif #endif @@ -1414,6 +1723,8 @@ #include "stm32h7xx_hal.h" #elif defined(WOLFSSL_STM32WB) #include "stm32wbxx_hal.h" + #elif defined(WOLFSSL_STM32WL) + #include "stm32wlxx_hal.h" #elif defined(WOLFSSL_STM32G0) #include "stm32g0xx_hal.h" #elif defined(WOLFSSL_STM32U5) @@ -1428,6 +1739,11 @@ #ifndef STM32_HAL_TIMEOUT #define STM32_HAL_TIMEOUT 0xFF #endif + + #if defined(WOLFSSL_STM32_PKA) && !defined(WOLFSSL_SP_INT_NEGATIVE) + /* enable the negative support for abs(a) |a| */ + #define WOLFSSL_SP_INT_NEGATIVE + #endif #else #if defined(WOLFSSL_STM32F2) #include "stm32f2xx.h" @@ -1524,6 +1840,7 @@ #ifdef MICRIUM #include #include + #include #if defined(RTOS_MODULE_NET_AVAIL) || (APP_CFG_TCPIP_EN == DEF_ENABLED) #include #include @@ -1696,7 +2013,10 @@ #if !defined(WOLFSSL_XILINX_CRYPT_VERSAL) #define NO_DEV_RANDOM #endif + #undef NO_WOLFSSL_DIR #define NO_WOLFSSL_DIR + + #undef HAVE_AESGCM #define HAVE_AESGCM #endif @@ -1761,21 +2081,29 @@ #define NO_SESSION_CACHE #define NO_ERROR_STRINGS #define XMALLOC_USER - #define XMALLOC(sz, heap, type) os_malloc(sz) - #define XREALLOC(p, sz, heap, type) os_realloc(p, sz) - #define XFREE(p, heap, type) os_free(p) + #define XMALLOC(sz, heap, type) ((void)(heap), (void)(type), os_malloc(sz)) + #define XREALLOC(p, sz, heap, type) ((void)(heap), (void)(type), os_realloc(p, sz)) + #define XFREE(p, heap, type) ((void)(heap), (void)(type), os_free(p)) #endif /*(WOLFSSL_APACHE_MYNEWT)*/ #ifdef WOLFSSL_ZEPHYR + #include +#if KERNEL_VERSION_NUMBER >= 0x30100 #include #include #include +#else + #include + #include + #include +#endif #include #define WOLFSSL_DH_CONST #define WOLFSSL_HAVE_MAX #define NO_WRITEV + #define NO_STDLIB_ISASCII #define USE_FLAT_BENCHMARK_H #define USE_FLAT_TEST_H @@ -1785,7 +2113,7 @@ void *z_realloc(void *ptr, size_t size); #define realloc z_realloc - #ifndef CONFIG_NET_SOCKETS_POSIX_NAMES + #if !defined(CONFIG_NET_SOCKETS_POSIX_NAMES) && !defined(CONFIG_POSIX_API) #define CONFIG_NET_SOCKETS_POSIX_NAMES #endif #endif @@ -1876,11 +2204,13 @@ #endif #endif -#ifdef _MSC_VER - #ifndef HAVE_SSIZE_T - #include - typedef SSIZE_T ssize_t; - #endif +#if defined(NO_WC_SSIZE_TYPE) || defined(ssize_t) + /* ssize_t comes from system headers or user_settings.h */ +#elif defined(WC_SSIZE_TYPE) + typedef WC_SSIZE_TYPE ssize_t; +#elif defined(_MSC_VER) + #include + typedef SSIZE_T ssize_t; #endif /* If DCP is used without SINGLE_THREADED, enforce WOLFSSL_CRYPT_HW_MUTEX */ @@ -1899,9 +2229,17 @@ #include "RTOS.h" #if !defined(XMALLOC_USER) && !defined(NO_WOLFSSL_MEMORY) && \ !defined(WOLFSSL_STATIC_MEMORY) - #define XMALLOC(s, h, type) OS_HEAP_malloc((s)) - #define XFREE(p, h, type) OS_HEAP_free((p)) - #define XREALLOC(p, n, h, t) OS_HEAP_realloc(((p), (n)) + /* Per the user manual of embOS https://www.segger.com/downloads/embos/UM01001 + * this API has changed with V5. */ + #if (OS_VERSION >= 50000U) + #define XMALLOC(s, h, type) ((void)(h), (void)(type), OS_HEAP_malloc((s))) + #define XFREE(p, h, type) ((void)(h), (void)(type), OS_HEAP_free((p))) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), OS_HEAP_realloc((p), (n))) + #else + #define XMALLOC(s, h, type) ((void)(h), (void)(type), OS_malloc((s))) + #define XFREE(p, h, type) ((void)(h), (void)(type), OS_free((p))) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), OS_realloc((p), (n))) + #endif #endif #endif @@ -2014,8 +2352,6 @@ #pragma warning(disable:2259) /* explicit casts to smaller sizes, disable */ #endif - - /* --------------------------------------------------------------------------- * Math Library Selection (in order of preference) * --------------------------------------------------------------------------- @@ -2027,17 +2363,22 @@ * Constant time: Always * Enable: WOLFSSL_SP_MATH_ALL */ + #undef USE_FAST_MATH + #undef USE_INTEGER_HEAP_MATH #elif defined(WOLFSSL_SP_MATH) /* 2) SP Math with restricted key sizes: wolfSSL proprietary math * implementation (sp_*.c). * Constant time: Always * Enable: WOLFSSL_SP_MATH */ + #undef USE_FAST_MATH + #undef USE_INTEGER_HEAP_MATH #elif defined(USE_FAST_MATH) /* 3) Tom's Fast Math: Stack based (tfm.c) * Constant time: Only with TFM_TIMING_RESISTANT * Enable: USE_FAST_MATH */ + #undef USE_INTEGER_HEAP_MATH #elif defined(USE_INTEGER_HEAP_MATH) /* 4) Integer Heap Math: Heap based (integer.c) * Constant time: Not supported @@ -2078,6 +2419,9 @@ #ifdef WOLFSSL_SP_MATH /* for single precision math only make sure the enabled key sizes are * included in the ECC curve table */ + #if defined(WOLFSSL_SP_NO_256) && !defined(NO_ECC256) + #define NO_ECC256 + #endif #if defined(WOLFSSL_SP_384) && !defined(HAVE_ECC384) #define HAVE_ECC384 #endif @@ -2184,8 +2528,15 @@ /* Ed25519 Configs */ #ifdef HAVE_ED25519 - /* By default enable sign, verify, key export and import */ + /* By default enable make key, sign, verify, key export and import */ + #ifndef NO_ED25519_MAKE_KEY + #undef HAVE_ED25519_MAKE_KEY + #define HAVE_ED25519_MAKE_KEY + #endif #ifndef NO_ED25519_SIGN + #ifndef HAVE_ED25519_MAKE_KEY + #error "Need HAVE_ED25519_MAKE_KEY with HAVE_ED25519_SIGN" + #endif #undef HAVE_ED25519_SIGN #define HAVE_ED25519_SIGN #endif @@ -2421,6 +2772,7 @@ /* Asynchronous Crypto */ #ifdef WOLFSSL_ASYNC_CRYPT #if !defined(HAVE_CAVIUM) && !defined(HAVE_INTEL_QA) && \ + !defined(WOLF_CRYPTO_CB) && !defined(HAVE_PK_CALLBACKS) && \ !defined(WOLFSSL_ASYNC_CRYPT_SW) #error No async backend defined with WOLFSSL_ASYNC_CRYPT! #endif @@ -2436,7 +2788,9 @@ #endif /* Enable ECC_CACHE_CURVE for ASYNC */ - #if !defined(ECC_CACHE_CURVE) + #if !defined(ECC_CACHE_CURVE) && !defined(NO_ECC_CACHE_CURVE) + /* Enabled by default for increased async performance, + * but not required */ #define ECC_CACHE_CURVE #endif #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -2463,9 +2817,6 @@ !defined(WOLFSSL_SP_MATH) && !defined(NO_BIG_INT) #error The static memory option is only supported for fast math or SP Math #endif - #ifdef WOLFSSL_SMALL_STACK - #error static memory does not support small stack please undefine - #endif #endif /* WOLFSSL_STATIC_MEMORY */ #ifdef HAVE_AES_KEYWRAP @@ -2518,6 +2869,14 @@ #define WOLFSSL_IPV6 #endif +/* --------------------------------------------------------------------------- + * ASN Library Selection (default to ASN_TEMPLATE) + * --------------------------------------------------------------------------- + */ +#if !defined(WOLFSSL_ASN_TEMPLATE) && !defined(WOLFSSL_ASN_ORIGINAL) && \ + !defined(NO_ASN) + #define WOLFSSL_ASN_TEMPLATE +#endif #ifdef WOLFSSL_LINUXKM #ifdef HAVE_CONFIG_H @@ -2554,6 +2913,7 @@ #ifndef WOLFSSL_TEST_SUBROUTINE #define WOLFSSL_TEST_SUBROUTINE static #endif + #undef HAVE_PTHREAD #undef HAVE_STRINGS_H #undef HAVE_ERRNO_H #undef HAVE_THREAD_LS @@ -2568,6 +2928,9 @@ #ifndef WOLFSSL_SP_DIV_WORD_HALF #define WOLFSSL_SP_DIV_WORD_HALF #endif + #ifdef __PIE__ + #define WC_NO_INTERNAL_FUNCTION_POINTERS + #endif #endif @@ -2600,8 +2963,61 @@ #ifndef HAVE_SNI #define HAVE_SNI #endif + #ifndef WOLFSSL_RSA_KEY_CHECK + #define WOLFSSL_RSA_KEY_CHECK + #endif +#endif + +/* Make sure setting OPENSSL_ALL also sets OPENSSL_EXTRA. */ +#if defined(OPENSSL_ALL) && !defined(OPENSSL_EXTRA) + #define OPENSSL_EXTRA #endif +/* --------------------------------------------------------------------------- + * OpenSSL compat layer + * --------------------------------------------------------------------------- + */ +#if defined(OPENSSL_EXTRA) && !defined(OPENSSL_COEXIST) + #undef WOLFSSL_ALWAYS_VERIFY_CB + #define WOLFSSL_ALWAYS_VERIFY_CB + + #undef WOLFSSL_VERIFY_CB_ALL_CERTS + #define WOLFSSL_VERIFY_CB_ALL_CERTS + + #undef WOLFSSL_EXTRA_ALERTS + #define WOLFSSL_EXTRA_ALERTS + + #undef HAVE_EXT_CACHE + #define HAVE_EXT_CACHE + + #undef WOLFSSL_FORCE_CACHE_ON_TICKET + #define WOLFSSL_FORCE_CACHE_ON_TICKET + + #undef WOLFSSL_AKID_NAME + #define WOLFSSL_AKID_NAME + + #undef HAVE_CTS + #define HAVE_CTS + + #undef WOLFSSL_SESSION_ID_CTX + #define WOLFSSL_SESSION_ID_CTX +#endif /* OPENSSL_EXTRA && !OPENSSL_COEXIST */ + +/* --------------------------------------------------------------------------- + * Special small OpenSSL compat layer for certs + * --------------------------------------------------------------------------- + */ +#ifdef OPENSSL_EXTRA_X509_SMALL + #undef WOLFSSL_EKU_OID + #define WOLFSSL_EKU_OID + + #undef WOLFSSL_MULTI_ATTRIB + #define WOLFSSL_MULTI_ATTRIB + + #undef WOLFSSL_NO_OPENSSL_RAND_CB + #define WOLFSSL_NO_OPENSSL_RAND_CB +#endif /* OPENSSL_EXTRA_X509_SMALL */ + #ifdef HAVE_SNI #define SSL_CTRL_SET_TLSEXT_HOSTNAME 55 #endif @@ -2759,7 +3175,7 @@ #if defined(WOLFCRYPT_ONLY) && defined(NO_AES) && !defined(WOLFSSL_SHA384) && \ !defined(WOLFSSL_SHA512) && defined(WC_NO_RNG) && \ !defined(WOLFSSL_SP_MATH) && !defined(WOLFSSL_SP_MATH_ALL) \ - && !defined(USE_FAST_MATH) + && !defined(USE_FAST_MATH) && defined(NO_SHA256) #undef WOLFSSL_NO_FORCE_ZERO #define WOLFSSL_NO_FORCE_ZERO #endif @@ -2844,8 +3260,16 @@ /* Do not allow using small stack with no malloc */ #if defined(WOLFSSL_NO_MALLOC) && \ - (defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_SMALL_STACK_CACHE)) - #error Small stack cannot be used with no malloc (WOLFSSL_NO_MALLOC) + (defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_SMALL_STACK_CACHE)) && \ + !defined(WOLFSSL_STATIC_MEMORY) + #error Small stack cannot be used with no malloc (WOLFSSL_NO_MALLOC) and \ + without staticmemory (WOLFSSL_STATIC_MEMORY) +#endif + +/* If malloc is disabled make sure it is also disabled in SP math */ +#if defined(WOLFSSL_NO_MALLOC) && !defined(WOLFSSL_SP_NO_MALLOC) && \ + (defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)) + #define WOLFSSL_SP_NO_MALLOC #endif /* Enable DH Extra for QT, openssl all, openssh and static ephemeral */ @@ -2873,6 +3297,13 @@ #define HAVE_ONE_TIME_AUTH #endif +/* This is checked for in configure.ac, so might want to do it in here as well. + */ +#if defined(HAVE_SECURE_RENEGOTIATION) && defined(HAVE_RENEGOTIATION_INDICATION) + #error HAVE_RENEGOTIATION_INDICATION cannot be defined together with \ + HAVE_SECURE_RENEGOTIATION +#endif + /* Check for insecure build combination: * secure renegotiation [enabled] * extended master secret [disabled] @@ -2921,8 +3352,12 @@ #ifdef HAVE_LIBOQS #define HAVE_PQC #define HAVE_FALCON -#define HAVE_DILITHIUM -#define HAVE_SPHINCS +#ifndef HAVE_DILITHIUM + #define HAVE_DILITHIUM +#endif +#ifndef WOLFSSL_NO_SPHINCS + #define HAVE_SPHINCS +#endif #ifndef WOLFSSL_HAVE_KYBER #define WOLFSSL_HAVE_KYBER #define WOLFSSL_KYBER512 @@ -2939,6 +3374,16 @@ #define WOLFSSL_NO_KYBER1024 #endif +#if (defined(HAVE_LIBOQS) || \ + defined(WOLFSSL_WC_KYBER) || \ + defined(WOLFSSL_WC_DILITHIUM) || \ + defined(HAVE_LIBXMSS) || \ + defined(HAVE_LIBLMS) || \ + defined(WOLFSSL_DUAL_ALG_CERTS)) && \ + !defined(WOLFSSL_EXPERIMENTAL_SETTINGS) + #error Experimental settings without WOLFSSL_EXPERIMENTAL_SETTINGS +#endif + #if defined(HAVE_PQC) && !defined(HAVE_LIBOQS) && !defined(HAVE_PQM4) && \ !defined(WOLFSSL_HAVE_KYBER) #error Please do not define HAVE_PQC yourself. @@ -2948,11 +3393,25 @@ #error Please do not define both HAVE_LIBOQS and HAVE_PQM4. #endif +#if defined(HAVE_PQC) && defined(WOLFSSL_DTLS13) && \ + !defined(WOLFSSL_DTLS_CH_FRAG) +#warning "Using DTLS 1.3 + pqc without WOLFSSL_DTLS_CH_FRAG will probably" \ + "fail.Use --enable-dtls-frag-ch to enable it." +#endif +#if !defined(WOLFSSL_DTLS13) && defined(WOLFSSL_DTLS_CH_FRAG) +#error "WOLFSSL_DTLS_CH_FRAG only works with DTLS 1.3" +#endif + /* SRTP requires DTLS */ #if defined(WOLFSSL_SRTP) && !defined(WOLFSSL_DTLS) #error The SRTP extension requires DTLS #endif +/* FIPS v5 and older doesn't support WOLF_PRIVATE_KEY_ID with PK callbacks */ +#if defined(HAVE_FIPS) && FIPS_VERSION_LT(5,3) && defined(HAVE_PK_CALLBACKS) + #define NO_WOLF_PRIVATE_KEY_ID +#endif + /* Are we using an external private key store like: * PKCS11 / HSM / crypto callback / PK callback */ #if !defined(WOLF_PRIVATE_KEY_ID) && !defined(NO_WOLF_PRIVATE_KEY_ID) && \ @@ -2969,12 +3428,21 @@ #define NO_SESSION_CACHE_REF #endif -/* (D)TLS v1.3 requires 64-bit number wrappers */ -#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_DTLS_DROP_STATS) +/* (D)TLS v1.3 requires 64-bit number wrappers as does XMSS and LMS. */ +#if defined(WOLFSSL_TLS13) || defined(WOLFSSL_DTLS_DROP_STATS) || \ + (defined(WOLFSSL_WC_XMSS) && (!defined(WOLFSSL_XMSS_MAX_HEIGHT) || \ + WOLFSSL_XMSS_MAX_HEIGHT > 32)) || (defined(WOLFSSL_WC_LMS) && \ + !defined(WOLFSSL_LMS_VERIFY_ONLY)) #undef WOLFSSL_W64_WRAPPER #define WOLFSSL_W64_WRAPPER #endif +/* wc_xmss and wc_lms require these misc.c functions. */ +#if defined(WOLFSSL_WC_XMSS) || defined(WOLFSSL_WC_LMS) + #undef WOLFSSL_NO_INT_ENCODE + #undef WOLFSSL_NO_INT_DECODE +#endif + /* DTLS v1.3 requires AES ECB if using AES */ #if defined(WOLFSSL_DTLS13) && !defined(NO_AES) && \ !defined(WOLFSSL_AES_DIRECT) @@ -2990,13 +3458,16 @@ #error "ConnectionID is supported for DTLSv1.3 only" #endif +#if defined(WOLFSSL_QUIC) && defined(WOLFSSL_CALLBACKS) + #error WOLFSSL_QUIC is incompatible with WOLFSSL_CALLBACKS. +#endif + /* RSA Key Checking is disabled by default unless WOLFSSL_RSA_KEY_CHECK is * defined or FIPS v2 3389, FIPS v5 or later. * Not allowed for: * RSA public only, CAVP selftest, fast RSA, user RSA, QAT or CryptoCell */ #if (defined(WOLFSSL_RSA_KEY_CHECK) || (defined(HAVE_FIPS) && FIPS_VERSION_GE(2,0))) && \ !defined(WOLFSSL_NO_RSA_KEY_CHECK) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) && \ - !defined(HAVE_USER_RSA) && !defined(HAVE_FAST_RSA) && \ !defined(HAVE_INTEL_QA) && !defined(WOLFSSL_CRYPTOCELL) && \ !defined(HAVE_SELFTEST) @@ -3065,11 +3536,6 @@ /* Turning off WOLFSSL_SYS_CA_CERTS b/c NO_CERTS is defined */ #undef WOLFSSL_SYS_CA_CERTS #endif - - #if defined(__APPLE__) && !defined(HAVE_SECURITY_SECTRUSTSETTINGS_H) - /* Turning off WOLFSSL_SYS_CA_CERTS b/c no Security/SecTrustSettings.h header */ - #undef WOLFSSL_SYS_CA_CERTS - #endif #endif /* WOLFSSL_SYS_CA_CERTS */ #if defined(SESSION_CACHE_DYNAMIC_MEM) && defined(PERSIST_SESSION_CACHE) @@ -3093,6 +3559,68 @@ /* Ciphersuite check done in internal.h */ #endif +/* Some final sanity checks */ +#ifdef WOLFSSL_APPLE_HOMEKIT + #ifndef WOLFCRYPT_HAVE_SRP + #error "WOLFCRYPT_HAVE_SRP is required for Apple Homekit" + #endif + #ifndef HAVE_CHACHA + #error "HAVE_CHACHA is required for Apple Homekit" + #endif + #ifdef USE_FAST_MATH + #ifdef FP_MAX_BITS + #if FP_MAX_BITS < (8192 * 2) + #error "HomeKit FP_MAX_BITS must at least (8192 * 2)" + #endif + #else + #error "HomeKit FP_MAX_BITS must be assigned a value (8192 * 2)" + #endif + #endif +#endif + +#if defined(WOLFSSL_ESPIDF) && defined(ARDUINO) + #error "Found both ESPIDF and ARDUINO. Pick one." +#endif + +#if defined(HAVE_FIPS) && defined(HAVE_PKCS11) + #error "PKCS11 not allowed with FIPS enabled (Crypto outside boundary)" +#endif + +#if defined(WOLFSSL_CAAM_BLOB) + #ifndef WOLFSSL_CAAM + #error "WOLFSSL_CAAM_BLOB requires WOLFSSL_CAAM" + #endif +#endif + +#if defined(HAVE_ED25519) + #ifndef WOLFSSL_SHA512 + #error "HAVE_ED25519 requires WOLFSSL_SHA512" + #endif +#endif + +#if (defined(OPENSSL_EXTRA) || defined(OPENSSL_ALL)) && \ + defined(OPENSSL_COEXIST) + #error "OPENSSL_EXTRA can not be defined with OPENSSL_COEXIST" +#endif + +#if !defined(NO_DSA) && defined(NO_SHA) + #error "Please disable DSA if disabling SHA-1" +#endif + +/* if configure.ac turned on this feature, HAVE_ENTROPY_MEMUSE will be set, + * also define HAVE_WOLFENTROPY */ +#ifdef HAVE_ENTROPY_MEMUSE + #ifndef HAVE_WOLFENTROPY + #define HAVE_WOLFENTROPY + #endif +#elif defined(HAVE_WOLFENTROPY) + /* else if user_settings.h only defined HAVE_WOLFENTROPY + * also define HAVE_ENTROPY_MEMUSE */ + #ifndef HAVE_ENTROPY_MEMUSE + #define HAVE_ENTROPY_MEMUSE + #endif +#endif /* HAVE_ENTROPY_MEMUSE */ + #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha.h 2024-08-03 07:30:01.000000000 +0000 @@ -31,23 +31,10 @@ #ifndef NO_SHA -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) #include #endif /* HAVE_FIPS_VERSION >= 2 */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) -#define wc_Sha Sha -#define WC_SHA SHA -#define WC_SHA_BLOCK_SIZE SHA_BLOCK_SIZE -#define WC_SHA_DIGEST_SIZE SHA_DIGEST_SIZE -#define WC_SHA_PAD_SIZE SHA_PAD_SIZE - -/* for fips @wc_fips */ -#include -#endif - #ifdef FREESCALE_LTC_SHA #include "fsl_ltc.h" #endif @@ -65,6 +52,11 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_sha_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_SHA_sanity(void); +#endif + /* avoid redefinition of structs */ #if !defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) @@ -78,7 +70,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT #include #endif -#ifdef WOLFSSL_ESP32WROOM32_CRYPT +#ifdef WOLFSSL_ESP32_CRYPT #include #endif #if defined(WOLFSSL_SILABS_SE_ACCEL) @@ -110,11 +102,15 @@ #elif defined(WOLFSSL_IMX6_CAAM) && !defined(WOLFSSL_QNX_CAAM) #include "wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h" -#elif defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ +#elif (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) #include "wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h" #elif defined(WOLFSSL_RENESAS_RX64_HASH) #include "wolfssl/wolfcrypt/port/Renesas/renesas-rx64-hw-crypt.h" +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + #include "wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h" #else #if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) @@ -130,51 +126,51 @@ /* Sha digest */ struct wc_Sha { #ifdef FREESCALE_LTC_SHA - ltc_hash_ctx_t ctx; + ltc_hash_ctx_t ctx; #elif defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) - SE050_HASH_Context se050Ctx; + SE050_HASH_Context se050Ctx; #elif defined(STM32_HASH) - STM32_HASH_Context stmCtx; + STM32_HASH_Context stmCtx; #elif defined(WOLFSSL_SILABS_SE_ACCEL) - wc_silabs_sha_t silabsCtx; + wc_silabs_sha_t silabsCtx; #elif defined(WOLFSSL_IMXRT_DCP) - dcp_handle_t handle; - dcp_hash_ctx_t ctx; + dcp_handle_t handle; + dcp_hash_ctx_t ctx; #elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_HASH) - psa_hash_operation_t psa_ctx; + psa_hash_operation_t psa_ctx; #else - word32 buffLen; /* in bytes */ - word32 loLen; /* length in bytes */ - word32 hiLen; /* length in bytes */ - word32 buffer[WC_SHA_BLOCK_SIZE / sizeof(word32)]; + word32 buffLen; /* in bytes */ + word32 loLen; /* length in bytes */ + word32 hiLen; /* length in bytes */ + word32 buffer[WC_SHA_BLOCK_SIZE / sizeof(word32)]; #ifdef WOLFSSL_PIC32MZ_HASH - word32 digest[PIC32_DIGEST_SIZE / sizeof(word32)]; + word32 digest[PIC32_DIGEST_SIZE / sizeof(word32)]; #else - word32 digest[WC_SHA_DIGEST_SIZE / sizeof(word32)]; - #endif - void* heap; - #ifdef WOLFSSL_PIC32MZ_HASH - hashUpdCache cache; /* cache for updates */ - #endif - #ifdef WOLFSSL_ASYNC_CRYPT - WC_ASYNC_DEV asyncDev; - #endif /* WOLFSSL_ASYNC_CRYPT */ - #ifdef WOLF_CRYPTO_CB - int devId; - void* devCtx; /* generic crypto callback context */ - #endif - #ifdef WOLFSSL_IMXRT1170_CAAM - caam_hash_ctx_t ctx; - caam_handle_t hndl; - #endif - #if defined(WOLFSSL_DEVCRYPTO_HASH) || defined(WOLFSSL_HASH_KEEP) - byte* msg; - word32 used; - word32 len; + word32 digest[WC_SHA_DIGEST_SIZE / sizeof(word32)]; #endif + void* heap; +#endif +#ifdef WOLFSSL_PIC32MZ_HASH + hashUpdCache cache; /* cache for updates */ +#endif +#ifdef WOLFSSL_ASYNC_CRYPT + WC_ASYNC_DEV asyncDev; +#endif /* WOLFSSL_ASYNC_CRYPT */ +#ifdef WOLF_CRYPTO_CB + int devId; + void* devCtx; /* generic crypto callback context */ +#endif +#ifdef WOLFSSL_IMXRT1170_CAAM + caam_hash_ctx_t ctx; + caam_handle_t hndl; +#endif +#if defined(WOLFSSL_DEVCRYPTO_HASH) || defined(WOLFSSL_HASH_KEEP) + byte* msg; + word32 used; + word32 len; #endif -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +#if defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) WC_ESP32SHA ctx; #endif #ifdef WOLFSSL_HASH_FLAGS diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha256.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha256.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha256.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha256.h 2024-08-03 07:30:01.000000000 +0000 @@ -32,31 +32,10 @@ #ifndef NO_SHA256 -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) #include #endif /* HAVE_FIPS_VERSION >= 2 */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - #define wc_Sha256 Sha256 - #define WC_SHA256 SHA256 - #define WC_SHA256_BLOCK_SIZE SHA256_BLOCK_SIZE - #define WC_SHA256_DIGEST_SIZE SHA256_DIGEST_SIZE - #define WC_SHA256_PAD_SIZE SHA256_PAD_SIZE - - #ifdef WOLFSSL_SHA224 - #define wc_Sha224 Sha224 - #define WC_SHA224 SHA224 - #define WC_SHA224_BLOCK_SIZE SHA224_BLOCK_SIZE - #define WC_SHA224_DIGEST_SIZE SHA224_DIGEST_SIZE - #define WC_SHA224_PAD_SIZE SHA224_PAD_SIZE - #endif - - /* for fips @wc_fips */ - #include -#endif - #ifdef FREESCALE_LTC_SHA #include "fsl_ltc.h" #endif @@ -81,6 +60,11 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_sha256_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_SHA256_sanity(void); +#endif + /* avoid redefinition of structs */ #if !defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) @@ -97,7 +81,7 @@ #if defined(WOLFSSL_DEVCRYPTO) && defined(WOLFSSL_DEVCRYPTO_HASH) #include #endif -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) +#if defined(WOLFSSL_ESP32_CRYPT) #include "wolfssl/wolfcrypt/port/Espressif/esp32-crypt.h" #endif #if defined(WOLFSSL_CRYPTOCELL) @@ -150,13 +134,14 @@ #include "wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h" #elif defined(WOLFSSL_AFALG_HASH) #include "wolfssl/wolfcrypt/port/af_alg/afalg_hash.h" -#elif defined(WOLFSSL_RENESAS_TSIP_CRYPT) && \ +#elif (defined(WOLFSSL_RENESAS_TSIP_TLS) || \ + defined(WOLFSSL_RENESAS_TSIP_CRYPTONLY)) && \ !defined(NO_WOLFSSL_RENESAS_TSIP_CRYPT_HASH) #include "wolfssl/wolfcrypt/port/Renesas/renesas_tsip_types.h" #elif (defined(WOLFSSL_RENESAS_SCEPROTECT) || \ - defined(WOLFSSL_RENESAS_SCEPROTECT_CRYPTONLY)) && \ - !defined(NO_WOLFSSL_RENESAS_SCEPROTECT_HASH) - #include "wolfssl/wolfcrypt/port/Renesas/renesas-sce-crypt.h" + defined(WOLFSSL_RENESAS_RSIP)) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + #include "wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h" #elif defined(WOLFSSL_RENESAS_RX64_HASH) #include "wolfssl/wolfcrypt/port/Renesas/renesas-rx64-hw-crypt.h" #else @@ -169,6 +154,11 @@ #include #endif +#ifdef HAVE_ARIA + #include "mcapi.h" + #include "mcapi_error.h" +#endif + /* wc_Sha256 digest */ struct wc_Sha256 { #ifdef FREESCALE_LTC_SHA @@ -178,7 +168,7 @@ #elif defined(STM32_HASH_SHA2) STM32_HASH_Context stmCtx; #elif defined(WOLFSSL_SILABS_SE_ACCEL) - wc_silabs_sha_t silabsCtx; + wc_silabs_sha_t silabsCtx; #elif defined(WOLFSSL_IMXRT_DCP) dcp_handle_t handle; dcp_hash_ctx_t ctx; @@ -189,13 +179,23 @@ #elif defined(WOLFSSL_HAVE_PSA) && !defined(WOLFSSL_PSA_NO_HASH) psa_hash_operation_t psa_ctx; #else +#ifdef WC_64BIT_CPU /* alignment on digest and buffer speeds up ARMv8 crypto operations */ ALIGN16 word32 digest[WC_SHA256_DIGEST_SIZE / sizeof(word32)]; ALIGN16 word32 buffer[WC_SHA256_BLOCK_SIZE / sizeof(word32)]; +#else + word32 digest[WC_SHA256_DIGEST_SIZE / sizeof(word32)]; + word32 buffer[WC_SHA256_BLOCK_SIZE / sizeof(word32)]; +#endif word32 buffLen; /* in bytes */ word32 loLen; /* length in bytes */ word32 hiLen; /* length in bytes */ void* heap; + +#ifdef WC_C_DYNAMIC_FALLBACK + int sha_method; +#endif + #endif #ifdef WOLFSSL_PIC32MZ_HASH hashUpdCache cache; /* cache for updates */ @@ -214,8 +214,10 @@ word32 used; word32 len; #endif -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) +#if defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA256) || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA224)) WC_ESP32SHA ctx; #endif #ifdef WOLFSSL_MAXQ10XX_CRYPTO @@ -235,6 +237,9 @@ caam_hash_ctx_t ctx; caam_handle_t hndl; #endif +#ifdef HAVE_ARIA + MC_HSESSION hSession; +#endif #ifdef WOLFSSL_HASH_FLAGS word32 flags; /* enum wc_HashFlags in hash.h */ #endif @@ -258,6 +263,10 @@ #if defined(OPENSSL_EXTRA) || defined(HAVE_CURL) WOLFSSL_API int wc_Sha256Transform(wc_Sha256* sha, const unsigned char* data); #endif +#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH) +WOLFSSL_API int wc_Sha256HashBlock(wc_Sha256* sha, const unsigned char* data, + unsigned char* hash); +#endif #if defined(WOLFSSL_HASH_KEEP) WOLFSSL_API int wc_Sha256_Grow(wc_Sha256* sha256, const byte* in, int inSz); #endif @@ -329,4 +338,3 @@ #endif /* NO_SHA256 */ #endif /* WOLF_CRYPT_SHA256_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha3.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha3.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha3.h 2024-08-03 07:30:01.000000000 +0000 @@ -36,6 +36,11 @@ extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_sha3_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_SHA3_sanity(void); +#endif + #ifdef WOLFSSL_ASYNC_CRYPT #include #endif @@ -119,6 +124,16 @@ void* heap; +#ifdef WOLF_CRYPTO_CB + int devId; +#endif + +#ifdef WC_C_DYNAMIC_FALLBACK + void (*sha3_block)(word64 *s); + void (*sha3_block_n)(word64 *s, const byte* data, word32 n, + word64 c); +#endif + #ifdef WOLFSSL_ASYNC_CRYPT WC_ASYNC_DEV asyncDev; #endif /* WOLFSSL_ASYNC_CRYPT */ @@ -135,7 +150,10 @@ #endif #if defined(WOLFSSL_SHAKE128) || defined(WOLFSSL_SHAKE256) -typedef wc_Sha3 wc_Shake; + #ifndef WC_SHAKE_TYPE_DEFINED + typedef wc_Sha3 wc_Shake; + #define WC_SHAKE_TYPE_DEFINED + #endif #endif WOLFSSL_API int wc_InitSha3_224(wc_Sha3* sha3, void* heap, int devId); @@ -202,7 +220,8 @@ WOLFSSL_LOCAL void sha3_block_avx2(word64* s); WOLFSSL_LOCAL void BlockSha3(word64 *s); #endif -#if defined(WOLFSSL_ARMASM) && defined(WOLFSSL_ARMASM_CRYPTO_SHA3) +#if defined(WOLFSSL_ARMASM) && (defined(__arm__) || \ + defined(WOLFSSL_ARMASM_CRYPTO_SHA3)) WOLFSSL_LOCAL void BlockSha3(word64 *s); #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha512.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha512.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha512.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sha512.h 2024-08-03 07:30:01.000000000 +0000 @@ -32,42 +32,19 @@ #if defined(WOLFSSL_SHA512) || defined(WOLFSSL_SHA384) -#if defined(HAVE_FIPS) && \ - defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2) +#if FIPS_VERSION3_GE(2,0,0) #include #endif /* HAVE_FIPS_VERSION >= 2 */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - #ifdef WOLFSSL_SHA512 - #define wc_Sha512 Sha512 - #define WC_SHA512 SHA512 - #define WC_SHA512_BLOCK_SIZE SHA512_BLOCK_SIZE - #define WC_SHA512_DIGEST_SIZE SHA512_DIGEST_SIZE - #define WC_SHA512_PAD_SIZE SHA512_PAD_SIZE - #define wc_Sha512_224 Sha512_224 - #define wc_Sha512_256 Sha512_256 - #endif /* WOLFSSL_SHA512 */ - #ifdef WOLFSSL_SHA384 - #define wc_Sha384 Sha384 - #define WC_SHA384 SHA384 - #define WC_SHA384_BLOCK_SIZE SHA384_BLOCK_SIZE - #define WC_SHA384_DIGEST_SIZE SHA384_DIGEST_SIZE - #define WC_SHA384_PAD_SIZE SHA384_PAD_SIZE - #endif /* WOLFSSL_SHA384 */ - - #define CYASSL_SHA512 - #if defined(WOLFSSL_SHA384) - #define CYASSL_SHA384 - #endif - /* for fips @wc_fips */ - #include -#endif - #ifdef __cplusplus extern "C" { #endif +#if FIPS_VERSION3_GE(6,0,0) + extern const unsigned int wolfCrypt_FIPS_sha512_ro_sanity[2]; + WOLFSSL_LOCAL int wolfCrypt_FIPS_SHA512_sanity(void); +#endif + /* avoid redefinition of structs */ #if !defined(HAVE_FIPS) || \ (defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)) @@ -75,7 +52,7 @@ #ifdef WOLFSSL_ASYNC_CRYPT #include #endif -#ifdef WOLFSSL_ESP32WROOM32_CRYPT +#ifdef WOLFSSL_ESP32_CRYPT #include #endif #if defined(WOLFSSL_SILABS_SE_ACCEL) @@ -146,10 +123,18 @@ #if defined(WOLFSSL_IMX6_CAAM) && !defined(WOLFSSL_QNX_CAAM) #include "wolfssl/wolfcrypt/port/caam/wolfcaam_sha.h" +#elif defined(WOLFSSL_RENESAS_RSIP) && \ + !defined(NO_WOLFSSL_RENESAS_FSPSM_HASH) + #include "wolfssl/wolfcrypt/port/Renesas/renesas-fspsm-crypt.h" + #else #if defined(WOLFSSL_SE050) && defined(WOLFSSL_SE050_HASH) #include "wolfssl/wolfcrypt/port/nxp/se050_port.h" #endif +#ifdef HAVE_ARIA + #include "mcapi.h" + #include "mcapi_error.h" +#endif /* wc_Sha512 digest */ struct wc_Sha512 { #ifdef WOLFSSL_PSOC6_CRYPTO @@ -166,18 +151,24 @@ #ifdef USE_INTEL_SPEEDUP const byte* data; #endif +#ifdef WC_C_DYNAMIC_FALLBACK + int sha_method; +#endif #ifdef WOLFSSL_ASYNC_CRYPT WC_ASYNC_DEV asyncDev; #endif /* WOLFSSL_ASYNC_CRYPT */ #ifdef WOLFSSL_SMALL_STACK_CACHE word64* W; #endif -#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \ - !defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH) + +#if defined(WOLFSSL_ESP32_CRYPT) && \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH) && \ + (!defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA512) || \ + !defined(NO_WOLFSSL_ESP32_CRYPT_HASH_SHA384)) WC_ESP32SHA ctx; #endif #if defined(WOLFSSL_SILABS_SE_ACCEL) - wc_silabs_sha_t silabsCtx; + wc_silabs_sha_t silabsCtx; #endif #ifdef WOLFSSL_KCAPI_HASH wolfssl_KCAPI_Hash kcapi; @@ -201,6 +192,9 @@ caam_hash_ctx_t ctx; caam_handle_t hndl; #endif +#ifdef HAVE_ARIA + MC_HSESSION hSession; +#endif #endif /* WOLFSSL_PSOC6_CRYPTO */ }; @@ -218,6 +212,23 @@ #ifdef WOLFSSL_SHA512 +#ifdef WOLFSSL_ARMASM +#ifdef __aarch64__ +#ifndef WOLFSSL_ARMASM_CRYPTO_SHA512 + void Transform_Sha512_Len_neon(wc_Sha512* sha512, const byte* data, + word32 len); + #define Transform_Sha512_Len Transform_Sha512_Len_neon +#else + void Transform_Sha512_Len_crypto(wc_Sha512* sha512, const byte* data, + word32 len); + #define Transform_Sha512_Len Transform_Sha512_Len_crypto +#endif +#else +extern void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, + word32 len); +#endif +#endif + WOLFSSL_API int wc_InitSha512(wc_Sha512* sha); WOLFSSL_API int wc_InitSha512_ex(wc_Sha512* sha, void* heap, int devId); WOLFSSL_API int wc_Sha512Update(wc_Sha512* sha, const byte* data, word32 len); @@ -342,4 +353,3 @@ #endif /* WOLFSSL_SHA512 || WOLFSSL_SHA384 */ #endif /* WOLF_CRYPT_SHA512_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm2.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm2.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm2.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm2.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,27 @@ +/* sm2.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef WOLFSSL_SM2 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm3.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm3.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm3.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm3.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,27 @@ +/* sm3.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef WOLFSSL_SM3 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm4.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm4.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm4.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sm4.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,27 @@ +/* sm4.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifdef WOLFSSL_SM4 + +#error "See https://github.com/wolfSSL/wolfsm for implementation of this file" + +#endif + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,6 +24,7 @@ #define WOLF_CRYPT_SP_H #include +#include #if defined(WOLFSSL_HAVE_SP_RSA) || defined(WOLFSSL_HAVE_SP_DH) || \ defined(WOLFSSL_HAVE_SP_ECC) @@ -41,7 +42,11 @@ #include #include -#include +#if defined(HAVE_ECC) && defined(WOLFSSL_HAVE_SP_ECC) + #include +#else + #undef WOLFSSL_HAVE_SP_ECC +#endif #ifdef noinline #define SP_NOINLINE noinline @@ -326,6 +331,36 @@ WOLFSSL_LOCAL int sp_ecc_check_key_1024(const mp_int* pX, const mp_int* pY, const mp_int* privm, void* heap); +WOLFSSL_LOCAL int sp_ecc_mulmod_sm2_256(const mp_int* km, const ecc_point* gm, + ecc_point* rm, int map, void* heap); +WOLFSSL_LOCAL int sp_ecc_mulmod_add_sm2_256(const mp_int* km, const ecc_point* gm, + const ecc_point* am, int inMont, ecc_point* rm, int map, void* heap); +WOLFSSL_LOCAL int sp_ecc_mulmod_base_sm2_256(const mp_int* km, ecc_point* rm, + int map, void* heap); +WOLFSSL_LOCAL int sp_ecc_mulmod_base_add_sm2_256(const mp_int* km, + const ecc_point* am, int inMont, ecc_point* rm, int map, void* heap); + +WOLFSSL_LOCAL int sp_ecc_make_key_sm2_256(WC_RNG* rng, mp_int* priv, + ecc_point* pub, void* heap); +WOLFSSL_LOCAL int sp_ecc_secret_gen_sm2_256(const mp_int* priv, + const ecc_point* pub, byte* out, word32* outlen, void* heap); +WOLFSSL_LOCAL int sp_ecc_sign_sm2_256(const byte* hash, word32 hashLen, + WC_RNG* rng, const mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, + void* heap); +WOLFSSL_LOCAL int sp_ecc_verify_sm2_256(const byte* hash, word32 hashLen, + const mp_int* pX, const mp_int* pY, const mp_int* pZ, const mp_int* r, + const mp_int* sm, int* res, void* heap); +WOLFSSL_LOCAL int sp_ecc_is_point_sm2_256(const mp_int* pX, const mp_int* pY); +WOLFSSL_LOCAL int sp_ecc_check_key_sm2_256(const mp_int* pX, const mp_int* pY, + const mp_int* privm, void* heap); +WOLFSSL_LOCAL int sp_ecc_proj_add_point_sm2_256(mp_int* pX, mp_int* pY, + mp_int* pZ, mp_int* qX, mp_int* qY, mp_int* qZ, mp_int* rX, mp_int* rY, + mp_int* rZ); +WOLFSSL_LOCAL int sp_ecc_proj_dbl_point_sm2_256(mp_int* pX, mp_int* pY, + mp_int* pZ, mp_int* rX, mp_int* rY, mp_int* rZ); +WOLFSSL_LOCAL int sp_ecc_map_sm2_256(mp_int* pX, mp_int* pY, mp_int* pZ); +WOLFSSL_LOCAL int sp_ecc_uncompress_sm2_256(mp_int* xm, int odd, mp_int* ym); + #endif /* HAVE_FIPS_VERSION && HAVE_FIPS_VERSION == 2 && !WOLFSSL_SP_ARM[32|64]_ASM */ #ifdef WOLFSSL_SP_NONBLOCK @@ -366,6 +401,39 @@ const mp_int* r, const mp_int* sm, int* res, void* heap); #endif /* WOLFSSL_SP_NONBLOCK */ +#ifdef HAVE_ECC_SM2 + +WOLFSSL_LOCAL int sp_ecc_mulmod_sm2_256(mp_int* km, ecc_point* gm, + ecc_point* rm, int map, void* heap); +WOLFSSL_LOCAL int sp_ecc_mulmod_base_sm2_256(mp_int* km, ecc_point* rm, int map, + void* heap); + +WOLFSSL_LOCAL int sp_ecc_make_key_sm2_256(WC_RNG* rng, mp_int* priv, + ecc_point* pub, void* heap); +WOLFSSL_LOCAL int sp_ecc_secret_gen_sm2_256(mp_int* priv, ecc_point* pub, + byte* out, word32* outlen, void* heap); + +WOLFSSL_LOCAL int sp_ecc_sign_sm2_256(const byte* hash, word32 hashLen, + WC_RNG* rng, mp_int* priv, mp_int* rm, mp_int* sm, mp_int* km, void* heap); +WOLFSSL_LOCAL int sp_ecc_verify_sm2_256(const byte* hash, word32 hashLen, + mp_int* pX, mp_int* pY, mp_int* pZ, mp_int* r, mp_int* sm, int* res, + void* heap); + +WOLFSSL_LOCAL int sp_ecc_is_point_sm2_256(mp_int* pX, mp_int* pY); +WOLFSSL_LOCAL int sp_ecc_check_key_sm2_256(mp_int* pX, mp_int* pY, + mp_int* privm, void* heap); + +WOLFSSL_LOCAL int sp_ecc_proj_add_point_sm2_256(mp_int* pX, mp_int* pY, + mp_int* pZ, mp_int* qX, mp_int* qY, mp_int* qZ, mp_int* rX, mp_int* rY, + mp_int* rZ); +WOLFSSL_LOCAL int sp_ecc_proj_dbl_point_sm2_256(mp_int* pX, mp_int* pY, + mp_int* pZ, mp_int* rX, mp_int* rY, mp_int* rZ); +WOLFSSL_LOCAL int sp_ecc_map_sm2_256(mp_int* pX, mp_int* pY, mp_int* pZ); +WOLFSSL_LOCAL int sp_ecc_uncompress_sm2_256(mp_int* xm, int odd, mp_int* ym); + +#endif + + #endif /* WOLFSSL_HAVE_SP_ECC */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp_int.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp_int.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp_int.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sp_int.h 2024-08-03 07:30:01.000000000 +0000 @@ -37,6 +37,10 @@ extern "C" { #endif +#if defined(WOLFSSL_SP_ARM_ARCH) && !defined(WOLFSSL_ARM_ARCH) + #define WOLFSSL_ARM_ARCH WOLFSSL_SP_ARM_ARCH +#endif + #if defined(OPENSSL_EXTRA) && !defined(NO_ASN) && \ !defined(WOLFSSL_SP_INT_NEGATIVE) #define WOLFSSL_SP_INT_NEGATIVE @@ -174,6 +178,13 @@ #define WOLFSSL_SP_DIV_WORD_HALF #endif +/* Detect Cortex M3 (no UMAAL) */ +#if defined(WOLFSSL_SP_ARM_CORTEX_M_ASM) && defined(__ARM_ARCH_7M__) + #undef WOLFSSL_SP_NO_UMAAL + #define WOLFSSL_SP_NO_UMAAL +#endif + + /* Make sure WOLFSSL_SP_ASM build option defined when requested */ #if !defined(WOLFSSL_SP_ASM) && ( \ defined(WOLFSSL_SP_X86_64_ASM) || defined(WOLFSSL_SP_ARM32_ASM) || \ @@ -548,9 +559,9 @@ /* No filesystem, no output * TODO: Use logging API? */ - #define sp_print(a, s) - #define sp_print_digit(a, s) - #define sp_print_int(a, s) + #define sp_print(a, s) WC_DO_NOTHING + #define sp_print_digit(a, s) WC_DO_NOTHING + #define sp_print_int(a, s) WC_DO_NOTHING #endif /* !NO_FILESYSTEM */ @@ -656,7 +667,7 @@ /* Sets the multi-precision number negative. * * Negative support not compiled in, so does nothing. */ -#define sp_setneg(a) do{}while(0) +#define sp_setneg(a) WC_DO_NOTHING #else /* Returns whether multi-precision number is negative. * @@ -684,9 +695,11 @@ #define sp_clamp(a) \ do { \ int ii; \ - for (ii = (int)(a)->used - 1; ii >= 0 && (a)->dp[ii] == 0; ii--) { \ + if ((a)->used > 0) { \ + for (ii = (int)(a)->used - 1; ii >= 0 && (a)->dp[ii] == 0; ii--) { \ + } \ + (a)->used = (unsigned int)ii + 1; \ } \ - (a)->used = (unsigned int)ii + 1; \ } while (0) /* Check the compiled and linked math implementation are the same. @@ -830,7 +843,7 @@ #define NEW_MP_INT_SIZE(name, bits, heap, type) \ XMEMSET(name, 0, MP_INT_SIZEOF(MP_BITS_CNT(bits))) /* Dispose of static mp_int. */ -#define FREE_MP_INT_SIZE(name, heap, type) +#define FREE_MP_INT_SIZE(name, heap, type) WC_DO_NOTHING /* Type to force compiler to not complain about size. */ #define MP_INT_SIZE sp_int_minimal #endif @@ -924,6 +937,8 @@ MP_API int sp_copy(const sp_int* a, sp_int* r); MP_API int sp_exch(sp_int* a, sp_int* b); MP_API int sp_cond_swap_ct(sp_int* a, sp_int* b, int cnt, int swap); +MP_API int sp_cond_swap_ct_ex(sp_int* a, sp_int* b, int cnt, int swap, + sp_int* t); #ifdef WOLFSSL_SP_INT_NEGATIVE MP_API int sp_abs(const sp_int* a, sp_int* r); @@ -932,6 +947,7 @@ MP_API int sp_cmp_mag(const sp_int* a, const sp_int* b); #endif MP_API int sp_cmp(const sp_int* a, const sp_int* b); +MP_API int sp_cmp_ct(const sp_int* a, const sp_int* b, unsigned int n); MP_API int sp_is_bit_set(const sp_int* a, unsigned int b); MP_API int sp_count_bits(const sp_int* a); @@ -982,6 +998,9 @@ MP_API int sp_addmod_ct(const sp_int* a, const sp_int* b, const sp_int* m, sp_int* r); #endif +#if defined(WOLFSSL_SP_MATH_ALL) && defined(HAVE_ECC) +MP_API void sp_xor_ct(const sp_int* a, const sp_int* b, int len, sp_int* r); +#endif MP_API int sp_lshd(sp_int* a, int s); #ifdef WOLFSSL_SP_MATH_ALL @@ -1017,14 +1036,17 @@ #if defined(WOLFSSL_SP_MATH_ALL) || defined(OPENSSL_ALL) MP_API int sp_div_2d(const sp_int* a, int e, sp_int* r, sp_int* rem); -MP_API int sp_mod_2d(const sp_int* a, int e, sp_int* r); MP_API int sp_mul_2d(const sp_int* a, int e, sp_int* r); #endif +#if defined(WOLFSSL_SP_MATH_ALL) || defined(HAVE_ECC) || defined(OPENSSL_ALL) +MP_API int sp_mod_2d(const sp_int* a, int e, sp_int* r); +#endif MP_API int sp_sqr(const sp_int* a, sp_int* r); MP_API int sp_sqrmod(const sp_int* a, const sp_int* m, sp_int* r); -MP_API int sp_mont_red(sp_int* a, const sp_int* m, sp_int_digit mp); +MP_API int sp_mont_red_ex(sp_int* a, const sp_int* m, sp_int_digit mp, int ct); +#define sp_mont_red(a, m, mp) sp_mont_red_ex(a, m, mp, 0) MP_API int sp_mont_setup(const sp_int* m, sp_int_digit* rho); MP_API int sp_mont_norm(sp_int* norm, const sp_int* m); @@ -1032,6 +1054,7 @@ MP_API int sp_read_unsigned_bin(sp_int* a, const byte* in, word32 inSz); MP_API int sp_to_unsigned_bin(const sp_int* a, byte* out); MP_API int sp_to_unsigned_bin_len(const sp_int* a, byte* out, int outSz); +MP_API int sp_to_unsigned_bin_len_ct(const sp_int* a, byte* out, int outSz); #ifdef WOLFSSL_SP_MATH_ALL MP_API int sp_to_unsigned_bin_at_pos(int o, const sp_int* a, unsigned char* out); @@ -1049,7 +1072,7 @@ MP_API int sp_prime_is_prime(const sp_int* a, int t, int* result); MP_API int sp_prime_is_prime_ex(const sp_int* a, int t, int* result, WC_RNG* rng); -#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) +#if !defined(NO_RSA) || defined(WOLFSSL_KEY_GEN) MP_API int sp_gcd(const sp_int* a, const sp_int* b, sp_int* r); #endif #if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN) && \ @@ -1071,7 +1094,8 @@ #define mp_div_3(a, r, rem) sp_div_d(a, 3, r, rem) #define mp_rshb(A,x) sp_rshb(A,x,A) #define mp_is_bit_set(a,b) sp_is_bit_set(a,(unsigned int)(b)) -#define mp_montgomery_reduce sp_mont_red +#define mp_montgomery_reduce(a, m, mp) sp_mont_red_ex(a, m, mp, 0) +#define mp_montgomery_reduce_ct(a, m, mp) sp_mont_red_ex(a, m, mp, 1) #define mp_montgomery_setup sp_mont_setup #define mp_montgomery_calc_normalization sp_mont_norm @@ -1100,8 +1124,10 @@ #define mp_init_copy sp_init_copy #define mp_exch sp_exch #define mp_cond_swap_ct sp_cond_swap_ct +#define mp_cond_swap_ct_ex sp_cond_swap_ct_ex #define mp_cmp_mag sp_cmp_mag #define mp_cmp sp_cmp +#define mp_cmp_ct sp_cmp_ct #define mp_count_bits sp_count_bits #define mp_cnt_lsb sp_cnt_lsb #define mp_leading_bit sp_leading_bit @@ -1123,6 +1149,7 @@ #define mp_submod sp_submod #define mp_addmod_ct sp_addmod_ct #define mp_submod_ct sp_submod_ct +#define mp_xor_ct sp_xor_ct #define mp_lshd sp_lshd #define mp_rshd sp_rshd #define mp_div sp_div @@ -1144,6 +1171,7 @@ #define mp_read_unsigned_bin sp_read_unsigned_bin #define mp_to_unsigned_bin sp_to_unsigned_bin #define mp_to_unsigned_bin_len sp_to_unsigned_bin_len +#define mp_to_unsigned_bin_len_ct sp_to_unsigned_bin_len_ct #define mp_to_unsigned_bin_at_pos sp_to_unsigned_bin_at_pos #define mp_read_radix sp_read_radix #define mp_tohex sp_tohex diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sphincs.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sphincs.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sphincs.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/sphincs.h 2024-08-03 07:30:01.000000000 +0000 @@ -24,12 +24,12 @@ */ /* Interfaces for Sphincs: - * - SPHINCS_FAST_LEVEL1 (AKA SPHINCS+-SHAKE256-128f-simple) - * - SPHINCS_FAST_LEVEL3 (AKA SPHINCS+-SHAKE256-192f-simple) - * - SPHINCS_FAST_LEVEL5 (AKA SPHINCS+-SHAKE256-256f-simple) - * - SPHINCS_SMALL_LEVEL1 (AKA SPHINCS+-SHAKE256-128s-simple) - * - SPHINCS_SMALL_LEVEL3 (AKA SPHINCS+-SHAKE256-192s-simple) - * - SPHINCS_SMALL_LEVEL5 (AKA SPHINCS+-SHAKE256-256s-simple) + * - SPHINCS_FAST_LEVEL1 (AKA SPHINCS+-SHAKE-128f-simple) + * - SPHINCS_FAST_LEVEL3 (AKA SPHINCS+-SHAKE-192f-simple) + * - SPHINCS_FAST_LEVEL5 (AKA SPHINCS+-SHAKE-256f-simple) + * - SPHINCS_SMALL_LEVEL1 (AKA SPHINCS+-SHAKE-128s-simple) + * - SPHINCS_SMALL_LEVEL3 (AKA SPHINCS+-SHAKE-192s-simple) + * - SPHINCS_SMALL_LEVEL5 (AKA SPHINCS+-SHAKE-256s-simple) */ #ifndef WOLF_CRYPT_SPHINCS_H @@ -41,6 +41,7 @@ #ifdef HAVE_LIBOQS #include +#include #endif #ifdef __cplusplus @@ -51,23 +52,23 @@ #ifdef HAVE_LIBOQS -#define SPHINCS_FAST_LEVEL1_SIG_SIZE OQS_SIG_sphincs_shake256_128f_simple_length_signature -#define SPHINCS_FAST_LEVEL3_SIG_SIZE OQS_SIG_sphincs_shake256_192f_simple_length_signature -#define SPHINCS_FAST_LEVEL5_SIG_SIZE OQS_SIG_sphincs_shake256_256f_simple_length_signature -#define SPHINCS_SMALL_LEVEL1_SIG_SIZE OQS_SIG_sphincs_shake256_128s_simple_length_signature -#define SPHINCS_SMALL_LEVEL3_SIG_SIZE OQS_SIG_sphincs_shake256_192s_simple_length_signature -#define SPHINCS_SMALL_LEVEL5_SIG_SIZE OQS_SIG_sphincs_shake256_256s_simple_length_signature +#define SPHINCS_FAST_LEVEL1_SIG_SIZE OQS_SIG_sphincs_shake_128f_simple_length_signature +#define SPHINCS_FAST_LEVEL3_SIG_SIZE OQS_SIG_sphincs_shake_192f_simple_length_signature +#define SPHINCS_FAST_LEVEL5_SIG_SIZE OQS_SIG_sphincs_shake_256f_simple_length_signature +#define SPHINCS_SMALL_LEVEL1_SIG_SIZE OQS_SIG_sphincs_shake_128s_simple_length_signature +#define SPHINCS_SMALL_LEVEL3_SIG_SIZE OQS_SIG_sphincs_shake_192s_simple_length_signature +#define SPHINCS_SMALL_LEVEL5_SIG_SIZE OQS_SIG_sphincs_shake_256s_simple_length_signature -#define SPHINCS_LEVEL1_KEY_SIZE OQS_SIG_sphincs_shake256_128f_simple_length_secret_key -#define SPHINCS_LEVEL1_PUB_KEY_SIZE OQS_SIG_sphincs_shake256_128f_simple_length_public_key +#define SPHINCS_LEVEL1_KEY_SIZE OQS_SIG_sphincs_shake_128f_simple_length_secret_key +#define SPHINCS_LEVEL1_PUB_KEY_SIZE OQS_SIG_sphincs_shake_128f_simple_length_public_key #define SPHINCS_LEVEL1_PRV_KEY_SIZE (SPHINCS_LEVEL1_PUB_KEY_SIZE+SPHINCS_LEVEL1_KEY_SIZE) -#define SPHINCS_LEVEL3_KEY_SIZE OQS_SIG_sphincs_shake256_192f_simple_length_secret_key -#define SPHINCS_LEVEL3_PUB_KEY_SIZE OQS_SIG_sphincs_shake256_192f_simple_length_public_key +#define SPHINCS_LEVEL3_KEY_SIZE OQS_SIG_sphincs_shake_192f_simple_length_secret_key +#define SPHINCS_LEVEL3_PUB_KEY_SIZE OQS_SIG_sphincs_shake_192f_simple_length_public_key #define SPHINCS_LEVEL3_PRV_KEY_SIZE (SPHINCS_LEVEL3_PUB_KEY_SIZE+SPHINCS_LEVEL3_KEY_SIZE) -#define SPHINCS_LEVEL5_KEY_SIZE OQS_SIG_sphincs_shake256_256f_simple_length_secret_key -#define SPHINCS_LEVEL5_PUB_KEY_SIZE OQS_SIG_sphincs_shake256_256f_simple_length_public_key +#define SPHINCS_LEVEL5_KEY_SIZE OQS_SIG_sphincs_shake_256f_simple_length_secret_key +#define SPHINCS_LEVEL5_PUB_KEY_SIZE OQS_SIG_sphincs_shake_256f_simple_length_public_key #define SPHINCS_LEVEL5_PRV_KEY_SIZE (SPHINCS_LEVEL5_PUB_KEY_SIZE+SPHINCS_LEVEL5_KEY_SIZE) #endif @@ -99,7 +100,7 @@ WOLFSSL_API int wc_sphincs_sign_msg(const byte* in, word32 inLen, byte* out, word32 *outLen, - sphincs_key* key); + sphincs_key* key, WC_RNG* rng); WOLFSSL_API int wc_sphincs_verify_msg(const byte* sig, word32 sigLen, const byte* msg, word32 msgLen, int* res, sphincs_key* key); @@ -124,7 +125,7 @@ sphincs_key* key); WOLFSSL_API -int wc_sphincs_export_public(sphincs_key*, byte* out, word32* outLen); +int wc_sphincs_export_public(sphincs_key* key, byte* out, word32* outLen); WOLFSSL_API int wc_sphincs_export_private_only(sphincs_key* key, byte* out, word32* outLen); WOLFSSL_API diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/tfm.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/tfm.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/tfm.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/tfm.h 2024-08-03 07:30:01.000000000 +0000 @@ -290,6 +290,8 @@ #define FP_MASK (fp_digit)(-1) #define FP_DIGIT_MAX FP_MASK #define FP_SIZE (FP_MAX_SIZE/DIGIT_BIT) +#define MP_SIZE (FP_MAX_SIZE/DIGIT_BIT) /* for compatibility with SP_INT */ + #define FP_MAX_PRIME_SIZE (FP_MAX_BITS/(2*CHAR_BIT)) /* In terms of FP_MAX_BITS, it is double the size possible for a number @@ -356,13 +358,13 @@ #define NEW_MP_INT_SIZE(name, bits, heap, type) \ XMEMSET(name, 0, sizeof(mp_int)) /* Dispose of static mp_int. */ -#define FREE_MP_INT_SIZE(name, heap, type) +#define FREE_MP_INT_SIZE(name, heap, type) WC_DO_NOTHING #endif /* Initialize an mp_int. */ #define INIT_MP_INT_SIZE(name, bits) \ mp_init(name) -/* Type to cast to when using size marcos. */ +/* Type to cast to when using size macros. */ #define MP_INT_SIZE mp_int @@ -836,18 +838,20 @@ MP_API int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d); MP_API int mp_cmp(mp_int *a, mp_int *b); +#define mp_cmp_ct(a, b, n) mp_cmp(a, b) MP_API int mp_cmp_d(mp_int *a, mp_digit b); MP_API int mp_unsigned_bin_size(const mp_int * a); MP_API int mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c); MP_API int mp_to_unsigned_bin_at_pos(int x, mp_int *t, unsigned char *b); MP_API int mp_to_unsigned_bin (mp_int * a, unsigned char *b); +#define mp_to_unsigned_bin_len_ct mp_to_unsigned_bin_len MP_API int mp_to_unsigned_bin_len(mp_int * a, unsigned char *b, int c); MP_API int mp_sub_d(fp_int *a, fp_digit b, fp_int *c); MP_API int mp_copy(const fp_int* a, fp_int* b); -MP_API int mp_isodd(mp_int* a); -MP_API int mp_iszero(mp_int* a); +MP_API int mp_isodd(const mp_int* a); +MP_API int mp_iszero(const mp_int* a); MP_API int mp_count_bits(const mp_int *a); MP_API int mp_leading_bit(mp_int *a); MP_API int mp_set_int(mp_int *a, unsigned long b); @@ -861,19 +865,21 @@ #ifdef WOLFSSL_DEBUG_MATH MP_API void mp_dump(const char* desc, mp_int* a, byte verbose); #else - #define mp_dump(desc, a, verbose) + #define mp_dump(desc, a, verbose) WC_DO_NOTHING #endif #if defined(OPENSSL_EXTRA) || !defined(NO_DSA) || defined(HAVE_ECC) MP_API int mp_read_radix(mp_int* a, const char* str, int radix); #endif +#define mp_montgomery_reduce_ct(a, m, mp) \ + mp_montgomery_reduce_ex(a, m, mp, 1) +MP_API int mp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp); +MP_API int mp_montgomery_reduce_ex(fp_int *a, fp_int *m, fp_digit mp, int ct); +MP_API int mp_montgomery_setup(fp_int *a, fp_digit *rho); +MP_API int mp_sqr(fp_int *a, fp_int *b); + #ifdef HAVE_ECC - MP_API int mp_sqr(fp_int *a, fp_int *b); - MP_API int mp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp); - MP_API int mp_montgomery_reduce_ex(fp_int *a, fp_int *m, fp_digit mp, - int ct); - MP_API int mp_montgomery_setup(fp_int *a, fp_digit *rho); MP_API int mp_div_2(fp_int * a, fp_int * b); MP_API int mp_div_2_mod_ct(mp_int *a, mp_int *b, mp_int *c); #endif @@ -899,10 +905,12 @@ MP_API int mp_rand_prime(mp_int* a, int len, WC_RNG* rng, void* heap); MP_API int mp_exch(mp_int *a, mp_int *b); #endif /* WOLFSSL_KEY_GEN */ -MP_API int mp_cond_swap_ct (mp_int * a, mp_int * b, int c, int m); +MP_API int mp_cond_swap_ct_ex(mp_int* a, mp_int* b, int c, int m, mp_int* t); +MP_API int mp_cond_swap_ct(mp_int* a, mp_int* b, int c, int m); MP_API int mp_cnt_lsb(fp_int *a); MP_API int mp_div_2d(fp_int *a, int b, fp_int *c, fp_int *d); +MP_API int mp_mod_2d(fp_int *a, int b, fp_int *c); MP_API int mp_mod_d(fp_int* a, fp_digit b, fp_digit* c); MP_API int mp_lshd (mp_int * a, int b); MP_API int mp_abs(mp_int* a, mp_int* b); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/types.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/types.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/types.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/types.h 2024-08-03 07:30:01.000000000 +0000 @@ -131,7 +131,7 @@ #if defined(WOLF_C89) || defined(WOLF_NO_TRAILING_ENUM_COMMAS) #define WOLF_ENUM_DUMMY_LAST_ELEMENT(prefix) _wolf_ ## prefix ## _enum_dummy_last_element #else - #define WOLF_ENUM_DUMMY_LAST_ELEMENT(prefix) + #define WOLF_ENUM_DUMMY_LAST_ELEMENT(prefix) /* null expansion */ #endif /* helpers for stringifying the expanded value of a macro argument rather @@ -259,7 +259,9 @@ #endif #elif defined(WC_16BIT_CPU) + #ifndef MICROCHIP_PIC24 #undef WORD64_AVAILABLE + #endif typedef word16 wolfssl_word; #define MP_16BIT /* for mp_int, mp_word needs to be twice as big as \ * mp_digit, no 64 bit type so make mp_digit 16 bit */ @@ -301,7 +303,8 @@ #ifndef WARN_UNUSED_RESULT #if defined(WOLFSSL_LINUXKM) && defined(__must_check) #define WARN_UNUSED_RESULT __must_check - #elif defined(__GNUC__) && (__GNUC__ >= 4) + #elif (defined(__GNUC__) && (__GNUC__ >= 4)) || \ + (defined(__IAR_SYSTEMS_ICC__) && (__VER__ >= 9040001)) #define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) #else #define WARN_UNUSED_RESULT @@ -309,13 +312,23 @@ #endif /* WARN_UNUSED_RESULT */ #ifndef WC_MAYBE_UNUSED - #if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) + #if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) || defined(__IAR_SYSTEMS_ICC__) #define WC_MAYBE_UNUSED __attribute__((unused)) #else #define WC_MAYBE_UNUSED #endif #endif /* WC_MAYBE_UNUSED */ + #ifndef WC_DO_NOTHING + #define WC_DO_NOTHING do {} while (0) + #ifdef _MSC_VER + /* disable buggy MSC warning around while(0), + *"warning C4127: conditional expression is constant" + */ + #pragma warning(disable: 4127) + #endif + #endif + /* use inlining if compiler allows */ #ifndef WC_INLINE #ifndef NO_INLINE @@ -346,7 +359,7 @@ #define WC_INLINE inline #endif #else - #define WC_INLINE + #define WC_INLINE WC_MAYBE_UNUSED #endif #else #define WC_INLINE WC_MAYBE_UNUSED @@ -416,6 +429,11 @@ #define XSTR_SIZEOF(x) (sizeof(x) - 1) /* -1 to not count the null char */ + #define XELEM_CNT(x) (sizeof((x))/sizeof(*(x))) + + #define WC_SAFE_SUM_WORD32(in1, in2, out) ((in2) <= 0xffffffffU - (in1) ? \ + ((out) = (in1) + (in2), 1) : ((out) = 0xffffffffU, 0)) + /* idea to add global alloc override by Moises Guimaraes */ /* default to libc stuff */ /* XREALLOC is used once in normal math lib, not in fast math lib */ @@ -476,7 +494,7 @@ #elif defined(WOLFSSL_TELIT_M2MB) /* Telit M2MB SDK requires use m2mb_os API's, not std malloc/free */ /* Use of malloc/free will cause CPU reboot */ - #define XMALLOC(s, h, t) ((void)h, (void)t, m2mb_os_malloc((s))) + #define XMALLOC(s, h, t) ((void)(h), (void)(t), m2mb_os_malloc((s))) #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK #define XFREE(p, h, t) m2mb_os_free(xp) #else @@ -493,24 +511,25 @@ fprintf(stderr, "wolfSSL_malloc failed"); return NULL; }; - #define XMALLOC(s, h, t) malloc_check((s)) - #define XFREE(p, h, t) - #define XREALLOC(p, n, h, t) (NULL) + #define XMALLOC(s, h, t) ((void)(h), (void)(t), malloc_check((s))) + #define XFREE(p, h, t) (void)(h); (void)(t) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), NULL) #else - #define XMALLOC(s, h, t) (NULL) - #define XFREE(p, h, t) - #define XREALLOC(p, n, h, t) (NULL) + #define XMALLOC(s, h, t) ((void)(s), (void)(h), (void)(t), NULL) + #define XFREE(p, h, t) (void)(p); (void)(h); (void)(t) + #define XREALLOC(p, n, h, t) ((void)(p), (void)(n), (void)(h), (void)(t), NULL) #endif #else - /* just use plain C stdlib stuff if desired */ - #include - #define XMALLOC(s, h, t) malloc((size_t)(s)) - #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK - #define XFREE(p, h, t) free(xp) - #else - #define XFREE(p, h, t) {void* xp = (p); if (xp) free(xp);} - #endif - #define XREALLOC(p, n, h, t) realloc((p), (size_t)(n)) + /* just use plain C stdlib stuff if desired */ + #include + #define XMALLOC(s, h, t) ((void)(h), (void)(t), malloc((size_t)(s))) + #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK + #define XFREE(p, h, t) ((void)(h), (void)(t), free(p)) + #else + #define XFREE(p, h, t) {void* xp = (p); (void)(h); if (xp) free(xp);} + #endif + #define XREALLOC(p, n, h, t) \ + ((void)(h), (void)(t), realloc((p), (size_t)(n))) #endif #elif defined(WOLFSSL_LINUXKM) @@ -543,93 +562,120 @@ #endif #define XREALLOC(p, n, h, t) wolfSSL_Realloc((p), (n), (h), (t)) #endif /* WOLFSSL_DEBUG_MEMORY */ + #elif defined(WOLFSSL_EMBOS) && !defined(XMALLOC_USER) \ + && !defined(NO_WOLFSSL_MEMORY) \ + && !defined(WOLFSSL_STATIC_MEMORY) + /* settings.h solve this case already. Avoid redefinition. */ #elif (!defined(FREERTOS) && !defined(FREERTOS_TCP)) || defined(WOLFSSL_TRACK_MEMORY) #ifdef WOLFSSL_DEBUG_MEMORY #define XMALLOC(s, h, t) ((void)(h), (void)(t), wolfSSL_Malloc((s), __func__, __LINE__)) #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK - #define XFREE(p, h, t) wolfSSL_Free(xp, __func__, __LINE__) + #define XFREE(p, h, t) ((void)(h), (void)(t), wolfSSL_Free(xp, __func__, __LINE__)) #else - #define XFREE(p, h, t) {void* xp = (p); if (xp) wolfSSL_Free(xp, __func__, __LINE__);} + #define XFREE(p, h, t) {void* xp = (p); (void)(h); (void)(t); if (xp) wolfSSL_Free(xp, __func__, __LINE__);} #endif - #define XREALLOC(p, n, h, t) wolfSSL_Realloc((p), (n), __func__, __LINE__) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), wolfSSL_Realloc((p), (n), __func__, __LINE__)) #else #define XMALLOC(s, h, t) ((void)(h), (void)(t), wolfSSL_Malloc((s))) #ifdef WOLFSSL_XFREE_NO_NULLNESS_CHECK - #define XFREE(p, h, t) wolfSSL_Free(p) + #define XFREE(p, h, t) ((void)(h), (void)(t), wolfSSL_Free(p)) #else - #define XFREE(p, h, t) {void* xp = (p); if (xp) wolfSSL_Free(xp);} + #define XFREE(p, h, t) {void* xp = (p); (void)(h); (void)(t); if (xp) wolfSSL_Free(xp);} #endif - #define XREALLOC(p, n, h, t) wolfSSL_Realloc((p), (n)) + #define XREALLOC(p, n, h, t) ((void)(h), (void)(t), wolfSSL_Realloc((p), (n))) #endif /* WOLFSSL_DEBUG_MEMORY */ #endif /* WOLFSSL_STATIC_MEMORY */ #endif /* declare/free variable handling for async and smallstack */ + #ifndef WC_ALLOC_DO_ON_FAILURE + #define WC_ALLOC_DO_ON_FAILURE() WC_DO_NOTHING + #endif + + #define WC_DECLARE_HEAP_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ + VAR_TYPE* VAR_NAME[VAR_ITEMS] = { NULL, }; \ + int idx##VAR_NAME = 0, inner_idx_##VAR_NAME + #define WC_HEAP_ARRAY_ARG(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE) \ + VAR_TYPE* VAR_NAME[VAR_ITEMS] + #define WC_ALLOC_HEAP_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ + for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \ + (VAR_NAME)[idx##VAR_NAME] = (VAR_TYPE*)XMALLOC(VAR_SIZE, (HEAP), DYNAMIC_TYPE_TMP_BUFFER); \ + if ((VAR_NAME)[idx##VAR_NAME] == NULL) { \ + for (inner_idx_##VAR_NAME = 0; inner_idx_##VAR_NAME < idx##VAR_NAME; inner_idx_##VAR_NAME++) { \ + XFREE((VAR_NAME)[inner_idx_##VAR_NAME], (HEAP), DYNAMIC_TYPE_TMP_BUFFER); \ + (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \ + } \ + for (inner_idx_##VAR_NAME = idx##VAR_NAME + 1; inner_idx_##VAR_NAME < (VAR_ITEMS); inner_idx_##VAR_NAME++) { \ + (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \ + } \ + idx##VAR_NAME = 0; \ + WC_ALLOC_DO_ON_FAILURE(); \ + break; \ + } \ + } + #define WC_CALLOC_HEAP_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ + do { \ + WC_ALLOC_HEAP_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP); \ + if (idx##VAR_NAME != 0) { \ + for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \ + XMEMSET((VAR_NAME)[idx##VAR_NAME], 0, VAR_SIZE); \ + } \ + } \ + } while (0) + #define WC_HEAP_ARRAY_OK(VAR_NAME) (idx##VAR_NAME != 0) + #define WC_FREE_HEAP_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) \ + if (WC_HEAP_ARRAY_OK(VAR_NAME)) { \ + for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \ + XFREE((VAR_NAME)[idx##VAR_NAME], (HEAP), DYNAMIC_TYPE_TMP_BUFFER); \ + } \ + idx##VAR_NAME = 0; \ + } + #if defined(WOLFSSL_ASYNC_CRYPT) || defined(WOLFSSL_SMALL_STACK) #define WC_DECLARE_VAR_IS_HEAP_ALLOC #define WC_DECLARE_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) \ - VAR_TYPE* VAR_NAME = (VAR_TYPE*)XMALLOC(sizeof(VAR_TYPE) * (VAR_SIZE), (HEAP), DYNAMIC_TYPE_WOLF_BIGINT) - #define WC_DECLARE_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ - VAR_TYPE* VAR_NAME[VAR_ITEMS]; \ - int idx##VAR_NAME, inner_idx_##VAR_NAME - #define WC_INIT_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ - for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \ - (VAR_NAME)[idx##VAR_NAME] = (VAR_TYPE*)XMALLOC(VAR_SIZE, (HEAP), DYNAMIC_TYPE_WOLF_BIGINT); \ - if ((VAR_NAME)[idx##VAR_NAME] == NULL) { \ - for (inner_idx_##VAR_NAME = 0; inner_idx_##VAR_NAME < idx##VAR_NAME; inner_idx_##VAR_NAME++) { \ - XFREE((VAR_NAME)[inner_idx_##VAR_NAME], (HEAP), DYNAMIC_TYPE_WOLF_BIGINT); \ - (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \ - } \ - for (inner_idx_##VAR_NAME = idx##VAR_NAME + 1; inner_idx_##VAR_NAME < (VAR_ITEMS); inner_idx_##VAR_NAME++) { \ - (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \ - } \ - break; \ - } \ - } + VAR_TYPE* VAR_NAME = NULL + #define WC_ALLOC_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) \ + do { \ + (VAR_NAME) = (VAR_TYPE*)XMALLOC(sizeof(VAR_TYPE) * (VAR_SIZE), (HEAP), DYNAMIC_TYPE_WOLF_BIGINT); \ + if ((VAR_NAME) == NULL) { \ + WC_ALLOC_DO_ON_FAILURE(); \ + } \ + } while (0) + #define WC_CALLOC_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) \ + do { \ + WC_ALLOC_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP); \ + XMEMSET(VAR_NAME, 0, sizeof(VAR_TYPE) * (VAR_SIZE)); \ + } while (0) #define WC_FREE_VAR(VAR_NAME, HEAP) \ XFREE(VAR_NAME, (HEAP), DYNAMIC_TYPE_WOLF_BIGINT) + #define WC_DECLARE_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ + WC_DECLARE_HEAP_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) + #define WC_ARRAY_ARG(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE) \ + WC_HEAP_ARRAY_ARG(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE) + #define WC_ALLOC_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ + WC_ALLOC_HEAP_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) + #define WC_CALLOC_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ + WC_CALLOC_HEAP_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) + #define WC_ARRAY_OK(VAR_NAME) WC_HEAP_ARRAY_OK(VAR_NAME) #define WC_FREE_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) \ - for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \ - XFREE((VAR_NAME)[idx##VAR_NAME], (HEAP), DYNAMIC_TYPE_WOLF_BIGINT); \ - } - - #define WC_DECLARE_ARRAY_DYNAMIC_DEC(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ - WC_DECLARE_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) - #define WC_DECLARE_ARRAY_DYNAMIC_EXE(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ - WC_INIT_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) - #define WC_FREE_ARRAY_DYNAMIC(VAR_NAME, VAR_ITEMS, HEAP) \ - WC_FREE_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) + WC_FREE_HEAP_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) #else #undef WC_DECLARE_VAR_IS_HEAP_ALLOC #define WC_DECLARE_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) \ VAR_TYPE VAR_NAME[VAR_SIZE] + #define WC_ALLOC_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) WC_DO_NOTHING + #define WC_CALLOC_VAR(VAR_NAME, VAR_TYPE, VAR_SIZE, HEAP) \ + XMEMSET(VAR_NAME, 0, sizeof(var)) + #define WC_FREE_VAR(VAR_NAME, HEAP) WC_DO_NOTHING /* nothing to free, its stack */ #define WC_DECLARE_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ - VAR_TYPE VAR_NAME[VAR_ITEMS][VAR_SIZE] - #define WC_INIT_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) do {} while(0) - #define WC_FREE_VAR(VAR_NAME, HEAP) do {} while(0) /* nothing to free, its stack */ - #define WC_FREE_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) do {} while(0) /* nothing to free, its stack */ - - #define WC_DECLARE_ARRAY_DYNAMIC_DEC(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ - VAR_TYPE* VAR_NAME[VAR_ITEMS]; \ - int idx##VAR_NAME, inner_idx_##VAR_NAME - #define WC_DECLARE_ARRAY_DYNAMIC_EXE(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) \ - for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \ - (VAR_NAME)[idx##VAR_NAME] = (VAR_TYPE*)XMALLOC(VAR_SIZE, (HEAP), DYNAMIC_TYPE_TMP_BUFFER); \ - if ((VAR_NAME)[idx##VAR_NAME] == NULL) { \ - for (inner_idx_##VAR_NAME = 0; inner_idx_##VAR_NAME < idx##VAR_NAME; inner_idx_##VAR_NAME++) { \ - XFREE((VAR_NAME)[inner_idx_##VAR_NAME], HEAP, DYNAMIC_TYPE_TMP_BUFFER); \ - (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \ - } \ - for (inner_idx_##VAR_NAME = idx##VAR_NAME + 1; inner_idx_##VAR_NAME < (VAR_ITEMS); inner_idx_##VAR_NAME++) { \ - (VAR_NAME)[inner_idx_##VAR_NAME] = NULL; \ - } \ - break; \ - } \ - } - #define WC_FREE_ARRAY_DYNAMIC(VAR_NAME, VAR_ITEMS, HEAP) \ - for (idx##VAR_NAME=0; idx##VAR_NAME<(VAR_ITEMS); idx##VAR_NAME++) { \ - XFREE((VAR_NAME)[idx##VAR_NAME], (HEAP), DYNAMIC_TYPE_TMP_BUFFER); \ - } + VAR_TYPE VAR_NAME[VAR_ITEMS][(VAR_SIZE) / sizeof(VAR_TYPE)] /* // NOLINT(bugprone-sizeof-expression) */ + #define WC_ARRAY_ARG(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE) \ + VAR_TYPE VAR_NAME[VAR_ITEMS][(VAR_SIZE) / sizeof(VAR_TYPE)] /* // NOLINT(bugprone-sizeof-expression) */ + #define WC_ALLOC_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) WC_DO_NOTHING + #define WC_CALLOC_ARRAY(VAR_NAME, VAR_TYPE, VAR_ITEMS, VAR_SIZE, HEAP) XMEMSET(VAR_NAME, 0, sizeof(VAR_NAME)) + #define WC_ARRAY_OK(VAR_NAME) 1 + #define WC_FREE_ARRAY(VAR_NAME, VAR_ITEMS, HEAP) WC_DO_NOTHING /* nothing to free, its stack */ #endif #if defined(HAVE_FIPS) || defined(HAVE_SELFTEST) @@ -638,9 +684,9 @@ #define DECLARE_ARRAY WC_DECLARE_ARRAY #define FREE_VAR WC_FREE_VAR #define FREE_ARRAY WC_FREE_ARRAY - #define DECLARE_ARRAY_DYNAMIC_DEC WC_DECLARE_ARRAY_DYNAMIC_DEC - #define DECLARE_ARRAY_DYNAMIC_EXE WC_DECLARE_ARRAY_DYNAMIC_EXE - #define FREE_ARRAY_DYNAMIC WC_FREE_ARRAY_DYNAMIC + #define DECLARE_ARRAY_DYNAMIC_DEC WC_DECLARE_HEAP_ARRAY + #define DECLARE_ARRAY_DYNAMIC_EXE WC_ALLOC_HEAP_ARRAY + #define FREE_ARRAY_DYNAMIC WC_FREE_HEAP_ARRAY #endif /* HAVE_FIPS */ #if !defined(USE_WOLF_STRTOK) && \ @@ -687,11 +733,11 @@ #endif #ifndef XSTRCASECMP - #if defined(MICROCHIP_PIC32) && (__XC32_VERSION >= 1000) - /* XC32 supports str[n]casecmp in version >= 1.0. */ + #if defined(MICROCHIP_PIC32) && (__XC32_VERSION >= 1000) && (__XC32_VERSION < 4000) + /* XC32 supports str[n]casecmp in version >= 1.0 through 4.0. */ #define XSTRCASECMP(s1,s2) strcasecmp((s1),(s2)) #elif defined(MICROCHIP_PIC32) || defined(WOLFSSL_TIRTOS) || \ - defined(WOLFSSL_ZEPHYR) + defined(WOLFSSL_ZEPHYR) || defined(MICROCHIP_PIC24) /* XC32 version < 1.0 does not support strcasecmp. */ #define USE_WOLF_STRCASECMP #define XSTRCASECMP(s1,s2) wc_strcasecmp(s1,s2) @@ -721,10 +767,10 @@ /* XC32 supports str[n]casecmp in version >= 1.0. */ #define XSTRNCASECMP(s1,s2,n) strncasecmp((s1),(s2),(n)) #elif defined(MICROCHIP_PIC32) || defined(WOLFSSL_TIRTOS) || \ - defined(WOLFSSL_ZEPHYR) + defined(WOLFSSL_ZEPHYR) || defined(MICROCHIP_PIC24) /* XC32 version < 1.0 does not support strncasecmp. */ #define USE_WOLF_STRNCASECMP - #define XSTRNCASECMP(s1,s2) wc_strncasecmp(s1,s2) + #define XSTRNCASECMP(s1,s2,n) wc_strncasecmp((s1),(s2),(n)) #elif defined(USE_WINDOWS_API) || defined(FREERTOS_TCP_WINSIM) #define XSTRNCASECMP(s1,s2,n) _strnicmp((s1),(s2),(n)) #else @@ -748,15 +794,8 @@ /* snprintf is used in asn.c for GetTimeString, PKCS7 test, and when debugging is turned on */ + #ifndef XSNPRINTF #ifndef USE_WINDOWS_API - #ifndef XSNPRINTF - #if defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) && \ - (defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) || \ - defined(WOLFSSL_CERT_EXT) || defined(HAVE_PKCS7)) - /* case where stdio is not included else where but is needed - for snprintf */ - #include - #endif #if defined(WOLFSSL_ESPIDF) && \ (!defined(NO_ASN_TIME) && defined(HAVE_PKCS7)) #include @@ -785,12 +824,17 @@ return ret; } #define XSNPRINTF _xsnprintf_ + #elif defined(FREESCALE_MQX) + /* see wc_port.h for fio.h and nio.h includes. MQX does not + have stdio.h available, so it needs its own section. */ + #define XSNPRINTF snprintf #elif defined(WOLF_C89) + #include #define XSPRINTF sprintf #else + #include #define XSNPRINTF snprintf #endif - #endif #else #if defined(_MSC_VER) || defined(__CYGWIN__) || defined(__MINGW32__) #if defined(_MSC_VER) && (_MSC_VER >= 1900) @@ -826,6 +870,7 @@ #define XSNPRINTF snprintf #endif /* _MSC_VER */ #endif /* USE_WINDOWS_API */ + #endif /* !XSNPRINTF */ #if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA) || \ defined(HAVE_ALPN) || defined(WOLFSSL_SNIFFER) @@ -874,8 +919,12 @@ #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM) #ifndef XGETENV - #include - #define XGETENV getenv + #ifdef NO_GETENV + #define XGETENV(x) (NULL) + #else + #include + #define XGETENV getenv + #endif #endif #endif /* !NO_FILESYSTEM && !NO_STDIO_FILESYSTEM */ @@ -890,7 +939,11 @@ #endif #if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(OPENSSL_EXTRA_X509_SMALL) #define XISALNUM(c) isalnum((c)) - #define XISASCII(c) isascii((c)) + #ifdef NO_STDLIB_ISASCII + #define XISASCII(c) (((c) >= 0 && (c) <= 127) ? 1 : 0) + #else + #define XISASCII(c) isascii((c)) + #endif #define XISSPACE(c) isspace((c)) #endif /* needed by wolfSSL_check_domain_name() */ @@ -1005,13 +1058,18 @@ DYNAMIC_TYPE_SESSION = 96, DYNAMIC_TYPE_DILITHIUM = 97, DYNAMIC_TYPE_SPHINCS = 98, - DYNAMIC_TYPE_SNIFFER_SERVER = 1000, - DYNAMIC_TYPE_SNIFFER_SESSION = 1001, - DYNAMIC_TYPE_SNIFFER_PB = 1002, - DYNAMIC_TYPE_SNIFFER_PB_BUFFER = 1003, - DYNAMIC_TYPE_SNIFFER_TICKET_ID = 1004, - DYNAMIC_TYPE_SNIFFER_NAMED_KEY = 1005, - DYNAMIC_TYPE_SNIFFER_KEY = 1006 + DYNAMIC_TYPE_SM4_BUFFER = 99, + DYNAMIC_TYPE_DEBUG_TAG = 100, + DYNAMIC_TYPE_LMS = 101, + DYNAMIC_TYPE_SNIFFER_SERVER = 1000, + DYNAMIC_TYPE_SNIFFER_SESSION = 1001, + DYNAMIC_TYPE_SNIFFER_PB = 1002, + DYNAMIC_TYPE_SNIFFER_PB_BUFFER = 1003, + DYNAMIC_TYPE_SNIFFER_TICKET_ID = 1004, + DYNAMIC_TYPE_SNIFFER_NAMED_KEY = 1005, + DYNAMIC_TYPE_SNIFFER_KEY = 1006, + DYNAMIC_TYPE_SNIFFER_KEYLOG_NODE = 1007, + DYNAMIC_TYPE_AES_EAX = 1008, }; /* max error buffer string size */ @@ -1063,7 +1121,7 @@ WC_HASH_TYPE_SHA3_512 = 13, WC_HASH_TYPE_BLAKE2B = 14, WC_HASH_TYPE_BLAKE2S = 19, - WC_HASH_TYPE_MAX = WC_HASH_TYPE_BLAKE2S + WC_HASH_TYPE_MAX = WC_HASH_TYPE_BLAKE2S, #ifndef WOLFSSL_NOSHA512_224 #define WOLFSSL_NOSHA512_224 #endif @@ -1100,12 +1158,19 @@ #endif #ifdef WOLFSSL_SHAKE128 WC_HASH_TYPE_SHAKE128 = 18, + #undef _WC_HASH_TYPE_MAX + #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SHAKE128 #endif #ifdef WOLFSSL_SHAKE256 WC_HASH_TYPE_SHAKE256 = 19, #undef _WC_HASH_TYPE_MAX #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SHAKE256 #endif + #ifdef WOLFSSL_SM3 + WC_HASH_TYPE_SM3 = 20, + #undef _WC_HASH_TYPE_MAX + #define _WC_HASH_TYPE_MAX WC_HASH_TYPE_SM3 + #endif WC_HASH_TYPE_MAX = _WC_HASH_TYPE_MAX #undef _WC_HASH_TYPE_MAX @@ -1150,9 +1215,57 @@ WC_PK_TYPE_ED25519_KEYGEN = 15, WC_PK_TYPE_CURVE25519_KEYGEN = 16, WC_PK_TYPE_RSA_GET_SIZE = 17, - WC_PK_TYPE_MAX = WC_PK_TYPE_RSA_GET_SIZE + #define _WC_PK_TYPE_MAX WC_PK_TYPE_RSA_GET_SIZE + #if defined(WOLFSSL_HAVE_KYBER) + WC_PK_TYPE_PQC_KEM_KEYGEN = 18, + WC_PK_TYPE_PQC_KEM_ENCAPS = 19, + WC_PK_TYPE_PQC_KEM_DECAPS = 20, + #undef _WC_PK_TYPE_MAX + #define _WC_PK_TYPE_MAX WC_PK_TYPE_PQC_KEM_DECAPS + #endif + #if defined(HAVE_DILITHIUM) || defined(HAVE_FALCON) + WC_PK_TYPE_PQC_SIG_KEYGEN = 21, + WC_PK_TYPE_PQC_SIG_SIGN = 22, + WC_PK_TYPE_PQC_SIG_VERIFY = 23, + WC_PK_TYPE_PQC_SIG_CHECK_PRIV_KEY = 24, + #undef _WC_PK_TYPE_MAX + #define _WC_PK_TYPE_MAX WC_PK_TYPE_PQC_SIG_CHECK_PRIV_KEY + #endif + WC_PK_TYPE_MAX = _WC_PK_TYPE_MAX + }; + +#if defined(WOLFSSL_HAVE_KYBER) + /* Post quantum KEM algorithms */ + enum wc_PqcKemType { + WC_PQC_KEM_TYPE_NONE = 0, + #define _WC_PQC_KEM_TYPE_MAX WC_PQC_KEM_TYPE_NONE + #if defined(WOLFSSL_HAVE_KYBER) + WC_PQC_KEM_TYPE_KYBER = 1, + #undef _WC_PQC_KEM_TYPE_MAX + #define _WC_PQC_KEM_TYPE_MAX WC_PQC_KEM_TYPE_KYBER + #endif + WC_PQC_KEM_TYPE_MAX = _WC_PQC_KEM_TYPE_MAX }; +#endif +#if defined(HAVE_DILITHIUM) || defined(HAVE_FALCON) + /* Post quantum signature algorithms */ + enum wc_PqcSignatureType { + WC_PQC_SIG_TYPE_NONE = 0, + #define _WC_PQC_SIG_TYPE_MAX WC_PQC_SIG_TYPE_NONE + #if defined(HAVE_DILITHIUM) + WC_PQC_SIG_TYPE_DILITHIUM = 1, + #undef _WC_PQC_SIG_TYPE_MAX + #define _WC_PQC_SIG_TYPE_MAX WC_PQC_SIG_TYPE_DILITHIUM + #endif + #if defined(HAVE_FALCON) + WC_PQC_SIG_TYPE_FALCON = 2, + #undef _WC_PQC_SIG_TYPE_MAX + #define _WC_PQC_SIG_TYPE_MAX WC_PQC_SIG_TYPE_FALCON + #endif + WC_PQC_SIG_TYPE_MAX = _WC_PQC_SIG_TYPE_MAX + }; +#endif /* settings detection for compile vs runtime math incompatibilities */ enum { @@ -1197,9 +1310,9 @@ #elif defined(XASM_LINK) /* keep user-supplied definition */ #elif defined(WOLFSSL_NO_ASM) - #define XASM_LINK(f) + #define XASM_LINK(f) /* null expansion */ #elif defined(_MSC_VER) - #define XASM_LINK(f) + #define XASM_LINK(f) /* null expansion */ #elif defined(__APPLE__) #define XASM_LINK(f) asm("_" f) #elif defined(__GNUC__) @@ -1218,87 +1331,57 @@ #ifndef WOLFSSL_USE_ALIGN #define WOLFSSL_USE_ALIGN #endif - #endif /* WOLFSSL_AESNI || WOLFSSL_ARMASM || USE_INTEL_SPEEDUP || WOLFSSL_AFALG_XILINX */ - - #ifdef WOLFSSL_USE_ALIGN - #if !defined(ALIGN16) - #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \ - defined(__llvm__) - #define ALIGN16 __attribute__ ( (aligned (16))) - #elif defined(_MSC_VER) - /* disable align warning, we want alignment ! */ - #pragma warning(disable: 4324) - #define ALIGN16 __declspec (align (16)) - #else - #define ALIGN16 - #endif - #endif /* !ALIGN16 */ + #endif /* WOLFSSL_AESNI || WOLFSSL_ARMASM || USE_INTEL_SPEEDUP || \ + * WOLFSSL_AFALG_XILINX */ - #if !defined (ALIGN32) - #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \ - defined(__llvm__) - #define ALIGN32 __attribute__ ( (aligned (32))) - #elif defined(_MSC_VER) - /* disable align warning, we want alignment ! */ - #pragma warning(disable: 4324) - #define ALIGN32 __declspec (align (32)) - #else - #define ALIGN32 - #endif - #endif /* !ALIGN32 */ - - #if !defined(ALIGN64) - #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \ - defined(__llvm__) - #define ALIGN64 __attribute__ ( (aligned (64))) - #elif defined(_MSC_VER) - /* disable align warning, we want alignment ! */ - #pragma warning(disable: 4324) - #define ALIGN64 __declspec (align (64)) - #else - #define ALIGN64 - #endif - #endif /* !ALIGN64 */ - - #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \ - defined(__llvm__) - #define ALIGN128 __attribute__ ( (aligned (128))) + /* Helpers for memory alignment */ + #ifndef XALIGNED + #if defined(__GNUC__) || defined(__llvm__) || \ + defined(__IAR_SYSTEMS_ICC__) + #define XALIGNED(x) __attribute__ ( (aligned (x))) + #elif defined(__KEIL__) + #define XALIGNED(x) __align(x) #elif defined(_MSC_VER) /* disable align warning, we want alignment ! */ #pragma warning(disable: 4324) - #define ALIGN128 __declspec (align (128)) + #define XALIGNED(x) __declspec (align (x)) #else - #define ALIGN128 + #define XALIGNED(x) /* null expansion */ #endif + #endif - #if defined(__IAR_SYSTEMS_ICC__) || defined(__GNUC__) || \ - defined(__llvm__) - #define ALIGN256 __attribute__ ( (aligned (256))) - #elif defined(_MSC_VER) - /* disable align warning, we want alignment ! */ - #pragma warning(disable: 4324) - #define ALIGN256 __declspec (align (256)) + /* Only use alignment in wolfSSL/wolfCrypt if WOLFSSL_USE_ALIGN is set */ + #ifdef WOLFSSL_USE_ALIGN + /* For IAR ARM the maximum variable alignment on stack is 8-bytes. + * Variables declared outside stack (like static globals) can have + * higher alignment. */ + #if defined(__ICCARM__) + #define WOLFSSL_ALIGN(x) XALIGNED(8) #else - #define ALIGN256 + #define WOLFSSL_ALIGN(x) XALIGNED(x) #endif - #else - #ifndef ALIGN16 - #define ALIGN16 - #endif - #ifndef ALIGN32 - #define ALIGN32 - #endif - #ifndef ALIGN64 - #define ALIGN64 - #endif - #ifndef ALIGN128 - #define ALIGN128 - #endif - #ifndef ALIGN256 - #define ALIGN256 - #endif - #endif /* WOLFSSL_USE_ALIGN */ + #define WOLFSSL_ALIGN(x) /* null expansion */ + #endif + + #ifndef ALIGN8 + #define ALIGN8 WOLFSSL_ALIGN(8) + #endif + #ifndef ALIGN16 + #define ALIGN16 WOLFSSL_ALIGN(16) + #endif + #ifndef ALIGN32 + #define ALIGN32 WOLFSSL_ALIGN(32) + #endif + #ifndef ALIGN64 + #define ALIGN64 WOLFSSL_ALIGN(64) + #endif + #ifndef ALIGN128 + #define ALIGN128 WOLFSSL_ALIGN(128) + #endif + #ifndef ALIGN256 + #define ALIGN256 WOLFSSL_ALIGN(256) + #endif #if !defined(PEDANTIC_EXTENSION) #if defined(__GNUC__) @@ -1324,6 +1407,20 @@ #endif typedef void* THREAD_TYPE; #define WOLFSSL_THREAD + #elif defined(WOLFSSL_USER_THREADING) + /* User can define user specific threading types + * THREAD_RETURN + * TREAD_TYPE + * WOLFSSL_THREAD + * e.g. + * typedef unsigned int THREAD_RETURN; + * typedef size_t THREAD_TYPE; + * #define WOLFSSL_THREAD void + * + * User can also implement their own wolfSSL_NewThread(), + * wolfSSL_JoinThread() and wolfSSL_Cond signaling if they want. + * Otherwise, those functions are omitted. + */ #elif defined(WOLFSSL_MDK_ARM) || defined(WOLFSSL_KEIL_TCP_NET) || \ defined(FREESCALE_MQX) typedef unsigned int THREAD_RETURN; @@ -1335,15 +1432,24 @@ #define WOLFSSL_THREAD #elif defined(WOLFSSL_TIRTOS) typedef void THREAD_RETURN; + #define WOLFSSL_THREAD_VOID_RETURN typedef Task_Handle THREAD_TYPE; #define WOLFSSL_THREAD #elif defined(WOLFSSL_ZEPHYR) typedef void THREAD_RETURN; - typedef struct k_thread THREAD_TYPE; + #define WOLFSSL_THREAD_VOID_RETURN + typedef struct { + struct k_thread tid; + k_thread_stack_t* threadStack; + } THREAD_TYPE; #define WOLFSSL_THREAD + extern void* wolfsslThreadHeapHint; #elif defined(NETOS) typedef UINT THREAD_RETURN; - typedef TX_THREAD THREAD_TYPE; + typedef struct { + TX_THREAD tid; + void* threadStack; + } THREAD_TYPE; #define WOLFSSL_THREAD #define INFINITE TX_WAIT_FOREVER #define WAIT_OBJECT_0 TX_NO_WAIT @@ -1351,23 +1457,128 @@ typedef unsigned int THREAD_RETURN; typedef size_t THREAD_TYPE; #define WOLFSSL_THREAD - #elif (defined(_POSIX_THREADS) || defined(HAVE_PTHREAD)) && \ - !defined(__MINGW32__) + #elif defined(WOLFSSL_PTHREADS) + #ifndef __MACH__ + #include + typedef struct COND_TYPE { + pthread_mutex_t mutex; + pthread_cond_t cond; + } COND_TYPE; + #else + #include + typedef struct COND_TYPE { + wolfSSL_Mutex mutex; + dispatch_semaphore_t cond; + } COND_TYPE; + #endif typedef void* THREAD_RETURN; typedef pthread_t THREAD_TYPE; + #define WOLFSSL_COND + #define WOLFSSL_THREAD + #ifndef HAVE_SELFTEST + #define WOLFSSL_THREAD_NO_JOIN + #endif + #elif defined(FREERTOS) && defined(WOLFSSL_ESPIDF) + typedef void* THREAD_RETURN; + typedef pthread_t THREAD_TYPE; #define WOLFSSL_THREAD - #define INFINITE (-1) - #define WAIT_OBJECT_0 0L #elif defined(FREERTOS) typedef unsigned int THREAD_RETURN; typedef TaskHandle_t THREAD_TYPE; #define WOLFSSL_THREAD + #elif defined(USE_WINDOWS_API) + typedef unsigned THREAD_RETURN; + typedef uintptr_t THREAD_TYPE; + typedef struct COND_TYPE { + wolfSSL_Mutex mutex; + HANDLE cond; + } COND_TYPE; + #define WOLFSSL_COND + #define INVALID_THREAD_VAL ((THREAD_TYPE)(INVALID_HANDLE_VALUE)) + #define WOLFSSL_THREAD __stdcall + #if !defined(__MINGW32__) + #define WOLFSSL_THREAD_NO_JOIN __cdecl + #endif #else typedef unsigned int THREAD_RETURN; typedef size_t THREAD_TYPE; #define WOLFSSL_THREAD __stdcall #endif + + #ifndef SINGLE_THREADED + /* Necessary headers should already be included. */ + + #ifndef INVALID_THREAD_VAL + #define INVALID_THREAD_VAL ((THREAD_TYPE)(-1)) + #endif + + #ifndef WOLFSSL_THREAD_VOID_RETURN + #define WOLFSSL_RETURN_FROM_THREAD(x) return (THREAD_RETURN)(x) + #else + #define WOLFSSL_RETURN_FROM_THREAD(x) \ + do { (void)(x); return; } while(0) + #endif + + /* List of defines/types and what they mean: + * THREAD_RETURN - return type of a thread callback + * THREAD_TYPE - type that should be passed into thread handling API + * INVALID_THREAD_VAL - a value that THREAD_TYPE can be checked against + * to check if the value is an invalid thread + * WOLFSSL_THREAD - attribute that should be used to declare thread + * callbacks + * WOLFSSL_THREAD_NO_JOIN - attribute that should be used to declare + * thread callbacks that don't require cleanup + * WOLFSSL_COND - defined if this system supports signaling + * COND_TYPE - type that should be passed into the signaling API + * WOLFSSL_THREAD_VOID_RETURN - defined if the thread callback has a + * void return + * WOLFSSL_RETURN_FROM_THREAD - define used to correctly return from a + * thread callback + * THREAD_CB - thread callback type for regular threading API + * THREAD_CB_NOJOIN - thread callback type for threading API that don't + * require cleanup + * + * Other defines/types are specific for the threading implementation + */ + + /* Internal wolfSSL threading interface. It does NOT need to be ported + * during initial porting efforts. This is a very basic interface. Some + * areas don't use this interface on purpose as they need more control + * over threads. + * + * It is currently used for: + * - CRL monitor + * - Testing + * - Entropy generation */ + + /* We don't support returns from threads */ + typedef THREAD_RETURN (WOLFSSL_THREAD *THREAD_CB)(void* arg); + WOLFSSL_API int wolfSSL_NewThread(THREAD_TYPE* thread, + THREAD_CB cb, void* arg); + #ifdef WOLFSSL_THREAD_NO_JOIN + /* Create a thread that will be automatically cleaned up. We can't + * return a handle/pointer to the new thread because there are no + * guarantees for how long it will be valid. */ + typedef THREAD_RETURN (WOLFSSL_THREAD_NO_JOIN *THREAD_CB_NOJOIN) + (void* arg); + WOLFSSL_API int wolfSSL_NewThreadNoJoin(THREAD_CB_NOJOIN cb, + void* arg); + #endif + WOLFSSL_API int wolfSSL_JoinThread(THREAD_TYPE thread); + + #ifdef WOLFSSL_COND + WOLFSSL_API int wolfSSL_CondInit(COND_TYPE* cond); + WOLFSSL_API int wolfSSL_CondFree(COND_TYPE* cond); + WOLFSSL_API int wolfSSL_CondSignal(COND_TYPE* cond); + WOLFSSL_API int wolfSSL_CondWait(COND_TYPE* cond); + WOLFSSL_API int wolfSSL_CondStart(COND_TYPE* cond); + WOLFSSL_API int wolfSSL_CondEnd(COND_TYPE* cond); + #endif + #else + #define WOLFSSL_RETURN_FROM_THREAD(x) return (THREAD_RETURN)(x) + #endif /* SINGLE_THREADED */ + #if defined(HAVE_STACK_SIZE) #define EXIT_TEST(ret) return (THREAD_RETURN)((size_t)(ret)) #else @@ -1413,9 +1624,9 @@ #define PRAGMA(str) PRAGMA_GCC(str) #define PRAGMA_DIAG_POP PRAGMA_GCC_DIAG_POP #else - #define PRAGMA_GCC_DIAG_PUSH - #define PRAGMA_GCC(str) - #define PRAGMA_GCC_DIAG_POP + #define PRAGMA_GCC_DIAG_PUSH /* null expansion */ + #define PRAGMA_GCC(str) /* null expansion */ + #define PRAGMA_GCC_DIAG_POP /* null expansion */ #endif #ifdef __clang__ @@ -1426,119 +1637,50 @@ #define PRAGMA(str) PRAGMA_CLANG(str) #define PRAGMA_DIAG_POP PRAGMA_CLANG_DIAG_POP #else - #define PRAGMA_CLANG_DIAG_PUSH - #define PRAGMA_CLANG(str) - #define PRAGMA_CLANG_DIAG_POP + #define PRAGMA_CLANG_DIAG_PUSH /* null expansion */ + #define PRAGMA_CLANG(str) /* null expansion */ + #define PRAGMA_CLANG_DIAG_POP /* null expansion */ #endif #ifndef PRAGMA_DIAG_PUSH - #define PRAGMA_DIAG_PUSH + #define PRAGMA_DIAG_PUSH /* null expansion */ #endif #ifndef PRAGMA - #define PRAGMA(str) + #define PRAGMA(str) /* null expansion */ #endif #ifndef PRAGMA_DIAG_POP - #define PRAGMA_DIAG_POP + #define PRAGMA_DIAG_POP /* null expansion */ #endif - #ifdef DEBUG_VECTOR_REGISTER_ACCESS - WOLFSSL_API extern THREAD_LS_T int wc_svr_count; - WOLFSSL_API extern THREAD_LS_T const char *wc_svr_last_file; - WOLFSSL_API extern THREAD_LS_T int wc_svr_last_line; - - #ifdef DEBUG_VECTOR_REGISTERS_ABORT_ON_FAIL - #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE abort(); - #elif defined(DEBUG_VECTOR_REGISTERS_EXIT_ON_FAIL) - #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE exit(1); - #else - #define DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE - #endif - - #define SAVE_VECTOR_REGISTERS(...) { \ - ++wc_svr_count; \ - if (wc_svr_count > 5) { \ - fprintf(stderr, \ - "%s @ L%d : incr : wc_svr_count %d (last op %s L%d)\n", \ - __FILE__, \ - __LINE__, \ - wc_svr_count, \ - wc_svr_last_file, \ - wc_svr_last_line); \ - DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ - } \ - wc_svr_last_file = __FILE__; \ - wc_svr_last_line = __LINE__; \ - } - #define ASSERT_SAVED_VECTOR_REGISTERS(fail_clause) { \ - if (wc_svr_count <= 0) { \ - fprintf(stderr, \ - "ASSERT_SAVED_VECTOR_REGISTERS : %s @ L%d : wc_svr_count %d (last op %s L%d)\n", \ - __FILE__, \ - __LINE__, \ - wc_svr_count, \ - wc_svr_last_file, \ - wc_svr_last_line); \ - DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ - { fail_clause } \ - } \ - } - #define ASSERT_RESTORED_VECTOR_REGISTERS(fail_clause) { \ - if (wc_svr_count != 0) { \ - fprintf(stderr, \ - "ASSERT_RESTORED_VECTOR_REGISTERS : %s @ L%d : wc_svr_count %d (last op %s L%d)\n", \ - __FILE__, \ - __LINE__, \ - wc_svr_count, \ - wc_svr_last_file, \ - wc_svr_last_line); \ - DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ - { fail_clause } \ - } \ - } - #define RESTORE_VECTOR_REGISTERS(...) { \ - --wc_svr_count; \ - if ((wc_svr_count > 4) || (wc_svr_count < 0)) { \ - fprintf(stderr, \ - "%s @ L%d : decr : wc_svr_count %d (last op %s L%d)\n", \ - __FILE__, \ - __LINE__, \ - wc_svr_count, \ - wc_svr_last_file, \ - wc_svr_last_line); \ - DEBUG_VECTOR_REGISTERS_EXTRA_FAIL_CLAUSE \ - } \ - wc_svr_last_file = __FILE__; \ - wc_svr_last_line = __LINE__; \ - } - #else - #ifdef _MSC_VER - /* disable buggy MSC warning around while(0), - *"warning C4127: conditional expression is constant" - */ - #pragma warning(disable: 4127) - #endif - #ifndef SAVE_VECTOR_REGISTERS - #define SAVE_VECTOR_REGISTERS(...) do{}while(0) - #endif - #ifndef ASSERT_SAVED_VECTOR_REGISTERS - #define ASSERT_SAVED_VECTOR_REGISTERS(...) do{}while(0) - #endif - #ifndef ASSERT_RESTORED_VECTOR_REGISTERS - #define ASSERT_RESTORED_VECTOR_REGISTERS(...) do{}while(0) - #endif - #ifndef RESTORE_VECTOR_REGISTERS - #define RESTORE_VECTOR_REGISTERS() do{}while(0) - #endif + #ifndef SAVE_VECTOR_REGISTERS + #define SAVE_VECTOR_REGISTERS(...) WC_DO_NOTHING + #endif + #ifndef SAVE_VECTOR_REGISTERS2 + #define SAVE_VECTOR_REGISTERS2() 0 + #endif + #ifndef CAN_SAVE_VECTOR_REGISTERS + #define CAN_SAVE_VECTOR_REGISTERS() 1 + #endif + #ifndef WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL + #define WC_DEBUG_SET_VECTOR_REGISTERS_RETVAL(x) WC_DO_NOTHING + #endif + #ifndef ASSERT_SAVED_VECTOR_REGISTERS + #define ASSERT_SAVED_VECTOR_REGISTERS(...) WC_DO_NOTHING + #endif + #ifndef ASSERT_RESTORED_VECTOR_REGISTERS + #define ASSERT_RESTORED_VECTOR_REGISTERS(...) WC_DO_NOTHING + #endif + #ifndef RESTORE_VECTOR_REGISTERS + #define RESTORE_VECTOR_REGISTERS() WC_DO_NOTHING #endif - #if FIPS_VERSION_GE(5,1) #define WC_SPKRE_F(x,y) wolfCrypt_SetPrivateKeyReadEnable_fips((x),(y)) #define PRIVATE_KEY_LOCK() WC_SPKRE_F(0,WC_KEYTYPE_ALL) #define PRIVATE_KEY_UNLOCK() WC_SPKRE_F(1,WC_KEYTYPE_ALL) #else - #define PRIVATE_KEY_LOCK() do{}while(0) - #define PRIVATE_KEY_UNLOCK() do{}while(0) + #define PRIVATE_KEY_LOCK() WC_DO_NOTHING + #define PRIVATE_KEY_UNLOCK() WC_DO_NOTHING #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/visibility.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/visibility.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/visibility.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/visibility.h 2024-08-03 07:30:01.000000000 +0000 @@ -25,17 +25,6 @@ #ifndef WOLF_CRYPT_VISIBILITY_H #define WOLF_CRYPT_VISIBILITY_H - -/* for compatibility and so that fips is using same name of macro @wc_fips */ -/* The following visibility wrappers are for old FIPS. New FIPS should use - * the same as a non-FIPS build. */ -#if defined(HAVE_FIPS) && \ - (!defined(HAVE_FIPS_VERSION) || (HAVE_FIPS_VERSION < 2)) - #include - #define WOLFSSL_API CYASSL_API - #define WOLFSSL_LOCAL CYASSL_LOCAL -#else - /* WOLFSSL_API is used for the public API symbols. It either imports or exports (or does nothing for static builds) @@ -76,8 +65,6 @@ #endif #endif /* BUILDING_WOLFSSL */ -#endif /* HAVE_FIPS */ - /* WOLFSSL_ABI is used for public API symbols that must not change * their signature. This tag is used for all APIs that are a * part of the fixed ABI. diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_kyber.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_kyber.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_kyber.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_kyber.h 2024-08-03 07:30:01.000000000 +0000 @@ -1,3 +1,283 @@ +/* wc_kyber.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ -#error "Contact wolfSSL to get the implementation of this file" +/*! + \file wolfssl/wolfcrypt/wc_kyber.h +*/ + + +#ifndef WOLF_CRYPT_WC_KYBER_H +#define WOLF_CRYPT_WC_KYBER_H + +#include +#include +#include +#include + +#ifdef WOLFSSL_HAVE_KYBER + +#ifdef noinline + #define KYBER_NOINLINE noinline +#elif defined(_MSC_VER) + #define KYBER_NOINLINE __declspec(noinline) +#elif defined(__GNUC__) + #define KYBER_NOINLINE __attribute__((noinline)) +#else + #define KYBER_NOINLINE +#endif + +/* Define algorithm type when not excluded. */ + +#ifndef WOLFSSL_NO_KYBER512 +#define WOLFSSL_KYBER512 +#endif +#ifndef WOLFSSL_NO_KYBER768 +#define WOLFSSL_KYBER768 +#endif +#ifndef WOLFSSL_NO_KYBER1024 +#define WOLFSSL_KYBER1024 +#endif + +enum { + /* Flags of Kyber keys. */ + KYBER_FLAG_PRIV_SET = 0x0001, + KYBER_FLAG_PUB_SET = 0x0002, + KYBER_FLAG_BOTH_SET = 0x0003, + KYBER_FLAG_H_SET = 0x0004, + + /* 2 bits of random used to create noise value. */ + KYBER_CBD_ETA2 = 2, + /* 3 bits of random used to create noise value. */ + KYBER_CBD_ETA3 = 3, + + /* Number of bits to compress to. */ + KYBER_COMP_4BITS = 4, + KYBER_COMP_5BITS = 5, + KYBER_COMP_10BITS = 10, + KYBER_COMP_11BITS = 11, +}; + + +/* SHAKE128 rate. */ +#define XOF_BLOCK_SIZE 168 + +/* Modulus of co-efficients of polynomial. */ +#define KYBER_Q 3329 + + +/* Kyber-512 parameters */ +#ifdef WOLFSSL_KYBER512 +/* Number of bits of random to create noise from. */ +#define KYBER512_ETA1 KYBER_CBD_ETA3 +#endif /* WOLFSSL_KYBER512 */ + +/* Kyber-768 parameters */ +#ifdef WOLFSSL_KYBER768 +/* Number of bits of random to create noise from. */ +#define KYBER768_ETA1 KYBER_CBD_ETA2 +#endif /* WOLFSSL_KYBER768 */ + +/* Kyber-1024 parameters */ +#ifdef WOLFSSL_KYBER1024 +/* Number of bits of random to create noise from. */ +#define KYBER1024_ETA1 KYBER_CBD_ETA2 +#endif /* WOLFSSL_KYBER1024 */ + + + +/* The data type of the pseudo-random function. */ +#define KYBER_PRF_T wc_Shake + +/* Kyber key. */ +struct KyberKey { + /* Type of key: KYBER512, KYBER768, KYBER1024 */ + int type; + /* Dynamic memory allocation hint. */ + void* heap; +#if defined(WOLF_CRYPTO_CB) + /* Device Id. */ + int devId; +#endif + /* Flags indicating what is stored in the key. */ + int flags; + + /* A pseudo-random function object. */ + KYBER_PRF_T prf; + + /* Private key as a vector. */ + sword16 priv[KYBER_MAX_K * KYBER_N]; + /* Public key as a vector. */ + sword16 pub[KYBER_MAX_K * KYBER_N]; + /* Public seed. */ + byte pubSeed[KYBER_SYM_SZ]; + /* Public hash - hash of encoded public key. */ + byte h[KYBER_SYM_SZ]; + /* Randomizer for decapsulation. */ + byte z[KYBER_SYM_SZ]; +}; + +#ifdef __cplusplus + extern "C" { +#endif + +WOLFSSL_LOCAL +void kyber_init(void); +WOLFSSL_LOCAL +void kyber_keygen(sword16* priv, sword16* pub, sword16* e, const sword16* a, + int kp); +WOLFSSL_LOCAL +void kyber_encapsulate(const sword16* pub, sword16* bp, sword16* v, + const sword16* at, sword16* sp, const sword16* ep, const sword16* epp, + const sword16* m, int kp); +WOLFSSL_LOCAL +void kyber_decapsulate(const sword16* priv, sword16* mp, sword16* bp, + const sword16* v, int kp); + +WOLFSSL_LOCAL +int kyber_gen_matrix(KYBER_PRF_T* prf, sword16* a, int kp, byte* seed, + int transposed); +WOLFSSL_LOCAL +int kyber_get_noise(KYBER_PRF_T* prf, int kp, sword16* vec1, sword16* vec2, + sword16* poly, byte* seed); + +#ifdef USE_INTEL_SPEEDUP +WOLFSSL_LOCAL +int kyber_kdf(byte* seed, int seedLen, byte* out, int outLen); +#endif +WOLFSSL_LOCAL +void kyber_prf_init(KYBER_PRF_T* prf); +WOLFSSL_LOCAL +int kyber_prf_new(KYBER_PRF_T* prf, void* heap, int devId); +WOLFSSL_LOCAL +void kyber_prf_free(KYBER_PRF_T* prf); + +WOLFSSL_LOCAL +int kyber_cmp(const byte* a, const byte* b, int sz); + +WOLFSSL_LOCAL +void kyber_vec_compress_10(byte* r, sword16* v, unsigned int kp); +WOLFSSL_LOCAL +void kyber_vec_compress_11(byte* r, sword16* v); +WOLFSSL_LOCAL +void kyber_vec_decompress_10(sword16* v, const unsigned char* b, + unsigned int kp); +WOLFSSL_LOCAL +void kyber_vec_decompress_11(sword16* v, const unsigned char* b); + +WOLFSSL_LOCAL +void kyber_compress_4(byte* b, sword16* p); +WOLFSSL_LOCAL +void kyber_compress_5(byte* b, sword16* p); +WOLFSSL_LOCAL +void kyber_decompress_4(sword16* p, const unsigned char* b); +WOLFSSL_LOCAL +void kyber_decompress_5(sword16* p, const unsigned char* b); + +WOLFSSL_LOCAL +void kyber_from_msg(sword16* p, const byte* msg); +WOLFSSL_LOCAL +void kyber_to_msg(byte* msg, sword16* p); +WOLFSSL_LOCAL +void kyber_from_bytes(sword16* p, const byte* b, int k); +WOLFSSL_LOCAL +void kyber_to_bytes(byte* b, sword16* p, int k); + +#ifdef USE_INTEL_SPEEDUP +WOLFSSL_LOCAL +void kyber_keygen_avx2(sword16* priv, sword16* pub, sword16* e, + const sword16* a, int kp); +WOLFSSL_LOCAL +void kyber_encapsulate_avx2(const sword16* pub, sword16* bp, sword16* v, + const sword16* at, sword16* sp, const sword16* ep, const sword16* epp, + const sword16* m, int kp); +WOLFSSL_LOCAL +void kyber_decapsulate_avx2(const sword16* priv, sword16* mp, sword16* bp, + const sword16* v, int kp); + +WOLFSSL_LOCAL +unsigned int kyber_rej_uniform_n_avx2(sword16* p, unsigned int len, + const byte* r, unsigned int rLen); +WOLFSSL_LOCAL +unsigned int kyber_rej_uniform_avx2(sword16* p, unsigned int len, const byte* r, + unsigned int rLen); +WOLFSSL_LOCAL +void kyber_redistribute_21_rand_avx2(const word64* s, byte* r0, byte* r1, + byte* r2, byte* r3); +void kyber_redistribute_17_rand_avx2(const word64* s, byte* r0, byte* r1, + byte* r2, byte* r3); +void kyber_redistribute_16_rand_avx2(const word64* s, byte* r0, byte* r1, + byte* r2, byte* r3); +void kyber_redistribute_8_rand_avx2(const word64* s, byte* r0, byte* r1, + byte* r2, byte* r3); + +WOLFSSL_LOCAL +void kyber_sha3_blocksx4_avx2(word64* s); +WOLFSSL_LOCAL +void kyber_sha3_128_blocksx4_seed_avx2(word64* s, byte* seed); +WOLFSSL_LOCAL +void kyber_sha3_256_blocksx4_seed_avx2(word64* s, byte* seed); + +WOLFSSL_LOCAL +void kyber_cbd_eta2_avx2(sword16* p, const byte* r); +WOLFSSL_LOCAL +void kyber_cbd_eta3_avx2(sword16* p, const byte* r); + +WOLFSSL_LOCAL +void kyber_from_msg_avx2(sword16* p, const byte* msg); +WOLFSSL_LOCAL +void kyber_to_msg_avx2(byte* msg, sword16* p); + +WOLFSSL_LOCAL +void kyber_from_bytes_avx2(sword16* p, const byte* b); +WOLFSSL_LOCAL +void kyber_to_bytes_avx2(byte* b, sword16* p); + +WOLFSSL_LOCAL +void kyber_compress_10_avx2(byte* r, const sword16* p, int n); +WOLFSSL_LOCAL +void kyber_decompress_10_avx2(sword16* p, const byte* r, int n); +WOLFSSL_LOCAL +void kyber_compress_11_avx2(byte* r, const sword16* p, int n); +WOLFSSL_LOCAL +void kyber_decompress_11_avx2(sword16* p, const byte* r, int n); + +WOLFSSL_LOCAL +void kyber_compress_4_avx2(byte* r, const sword16* p); +WOLFSSL_LOCAL +void kyber_decompress_4_avx2(sword16* p, const byte* r); +WOLFSSL_LOCAL +void kyber_compress_5_avx2(byte* r, const sword16* p); +WOLFSSL_LOCAL +void kyber_decompress_5_avx2(sword16* p, const byte* r); + + +WOLFSSL_LOCAL +int kyber_cmp_avx2(const byte* a, const byte* b, int sz); +#endif + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFSSL_HAVE_KYBER */ + +#endif /* WOLF_CRYPT_WC_KYBER_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_lms.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_lms.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_lms.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_lms.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,470 @@ +/* wc_lms.h + * + * Copyright (C) 2006-2024 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Implementation based on: + * RFC 8554: Leighton-Micali Hash-Based Signatures + * https://datatracker.ietf.org/doc/html/rfc8554 + * Implementation by Sean Parkinson. + */ + +/* Possible LMS options: + * + * WOLFSSL_LMS_LARGE_CACHES Default: OFF + * Authentication path caches are large and signing faster. + * WOLFSSL_LMS_ROOT_LEVELS Default: 5 (Large: 7) + * Number of levels of interior nodes from the to to cached. + * Valid value are: 1..height of subtree. + * The bigger the number, the larger the LmsKey but faster signing. + * Only applies when !WOLFSSL_WC_LMS_SMALL. + * WOLFSSL_LMS_CACHE_BITS Default: 5 (Large: 7) + * 2 to the power of the value is the number of leaf nodes to cache. + * Maximum valid value is height of subtree. + * Valid value are: 0..height of subtree. + * The bigger the number, the larger the LmsKey but faster signing. + * Only applies when !WOLFSSL_WC_LMS_SMALL. + * + * Memory/Level | R/C | Approx. Time (% of 5/5) + * (Bytes) | | H=10 | H=15 | H=20 + * -------------+--------------+--------+-------- + * 2016 | 5/5 | 100.0% | 100.0% | 100.0% + * 3040 | 5/6 | 75.5% | 89.2% | + * 4064 | 6/6 | 75.3% | 78.8% | + * 4576 | 4/7 | 72.4% | 87.6% | + * 6112 | 6/7 | 72.1% | 67.5% | + * 8160 | 7/7 | 72.2% | 56.8% | + * 8416 | 3/8 | 66.4% | 84.9% | + * 12256 | 7/8 | 66.5% | 45.9% | + * 16352 | 8/8 | 66.0% | 35.0% | + * 16416 | 1/9 | 54.1% | 79.5% | + * R = Root levels + * C = Cache bits + * To mimic the dynamic memory usage of XMSS, use 3/3. + * + * WOLFSSL_LMS_NO_SIGN SMOOTHING Default: OFF + * Disable precalculation of next subtree. + * Use less dynamic memory. + * At certain indexes, signing will take a long time compared to the mean. + * When OFF, the private key holds a second copy of caches. + * + * WOLFSSL_LMS_NO_SIG_CACHE Default: OFF + * Signature cache is disabled. + * This will use less dynamic memory and make signing slower when multiple + * levels. + * + * Sig cache holds the C and y hashes for a tree that is not the lowest. + * Sig cache size = (levels - 1) * (1 + p) * 32 bytes + * p is the number of y terms based on Winternitz width. + * + * w | p | l | Bytes + * ---+----+---+------ + * 4 | 67 | 2 | 2176 + * 4 | 67 | 3 | 4353 + * 4 | 67 | 4 | 6528 + * 8 | 34 | 2 | 1120 + * 8 | 34 | 3 | 2240 + * 8 | 34 | 4 | 3360 + * w = Winternitz width + * l = #levels + */ + +#ifndef WC_LMS_H +#define WC_LMS_H + +#if defined(WOLFSSL_HAVE_LMS) && defined(WOLFSSL_WC_LMS) + +#include +#include + +#ifdef WOLFSSL_LMS_MAX_LEVELS + /* Maximum number of levels of trees supported by implementation. */ + #define LMS_MAX_LEVELS WOLFSSL_LMS_MAX_LEVELS +#else + /* Maximum number of levels of trees supported by implementation. */ + #define LMS_MAX_LEVELS 4 +#endif +#if (LMS_MAX_LEVELS < 1) || (LMS_MAX_LEVELS > 4) + #error "LMS parameters only support heights 1-4." +#endif + +/* Smoothing is only used when there are 2 or more levels. */ +#if LMS_MAX_LEVELS == 1 && !defined(WOLFSSL_LMS_NO_SIGN_SMOOTHING) + #define WOLFSSL_LMS_NO_SIGN_SMOOTHING +#endif + +#ifdef WOLFSSL_LMS_MAX_HEIGHT + /* Maximum height of a tree supported by implementation. */ + #define LMS_MAX_HEIGHT WOLFSSL_LMS_MAX_HEIGHT +#else + /* Maximum height of a tree supported by implementation. */ + #define LMS_MAX_HEIGHT 20 +#endif +#if (LMS_MAX_HEIGHT < 5) || (LMS_MAX_HEIGHT > 20) + #error "LMS parameters only support heights 5-20." +#endif + +/* Length of I in bytes. */ +#define LMS_I_LEN 16 +/* Length of L in bytes. */ +#define LMS_L_LEN 4 +/* Length of Q for a level. */ +#define LMS_Q_LEN 4 +/* Length of P in bytes. */ +#define LMS_P_LEN 2 +/* Length of W in bytes. */ +#define LMS_W_LEN 1 + +/* Length of numeric types when encoding. */ +#define LMS_TYPE_LEN 4 + +/* Maximum size of a node hash. */ +#define LMS_MAX_NODE_LEN WC_SHA256_DIGEST_SIZE +/* Maximum size of SEED (produced by hash). */ +#define LMS_SEED_LEN WC_SHA256_DIGEST_SIZE +/* Maximum number of P, number of n-byte string elements in LM-OTS signature. + * Value of P when N=32 and W=1. + */ +#define LMS_MAX_P 265 +/* Length of SEED and I in bytes. */ +#define LMS_SEED_I_LEN (LMS_SEED_LEN + LMS_I_LEN) + + +#ifndef WOLFSSL_LMS_ROOT_LEVELS + #ifdef WOLFSSL_LMS_LARGE_CACHES + /* Number of root levels of interior nodes to store. */ + #define LMS_ROOT_LEVELS 7 + #else + /* Number of root levels of interior nodes to store. */ + #define LMS_ROOT_LEVELS 5 + #endif +#else + #define LMS_ROOT_LEVELS WOLFSSL_LMS_ROOT_LEVELS +#endif +#if LMS_ROOT_LEVELS <= 0 + #error "LMS_ROOT_LEVELS must be greater than 0." +#endif +/* Count of root nodes to store per level. */ +#define LMS_ROOT_COUNT ((1 << (LMS_ROOT_LEVELS)) - 1) + +#ifndef WOLFSSL_LMS_CACHE_BITS + #ifdef WOLFSSL_LMS_LARGE_CACHES + /* 2 to the power of the value is the number of leaf nodes to cache. */ + #define LMS_CACHE_BITS 7 + #else + /* 2 to the power of the value is the number of leaf nodes to cache. */ + #define LMS_CACHE_BITS 5 + #endif +#else + #define LMS_CACHE_BITS WOLFSSL_LMS_CACHE_BITS +#endif +#if LMS_CACHE_BITS < 0 + #error "LMS_CACHE_BITS must be greater than or equal to 0." +#endif +/* Number of leaf nodes to cache. */ +#define LMS_LEAF_CACHE (1 << LMS_CACHE_BITS) + +/* Maximum number of levels of trees described in private key. */ +#define HSS_MAX_LEVELS 8 +/* Length of full Q in bytes. Q from all levels combined. */ +#define HSS_Q_LEN 8 + +/* Compressed parameter set length in bytes. */ +#define HSS_COMPRESS_PARAM_SET_LEN 1 +/* Total compressed parameter set length for private key in bytes. */ +#define HSS_PRIV_KEY_PARAM_SET_LEN \ + (HSS_COMPRESS_PARAM_SET_LEN * HSS_MAX_LEVELS) + +/* Private key length for one level. */ +#define LMS_PRIV_LEN \ + (LMS_Q_LEN + LMS_SEED_LEN + LMS_I_LEN) +/* Public key length in signature. */ +#define LMS_PUBKEY_LEN \ + (LMS_TYPE_LEN + LMS_TYPE_LEN + LMS_I_LEN + LMS_MAX_NODE_LEN) + +/* LMS signature data length. */ +#define LMS_SIG_LEN(h, p) \ + (LMS_Q_LEN + LMS_TYPE_LEN + LMS_MAX_NODE_LEN + (p) * LMS_MAX_NODE_LEN + \ + LMS_TYPE_LEN + (h) * LMS_MAX_NODE_LEN) + +/* Length of public key. */ +#define HSS_PUBLIC_KEY_LEN (LMS_L_LEN + LMS_PUBKEY_LEN) +/* Length of private key. */ +#define HSS_PRIVATE_KEY_LEN \ + (HSS_Q_LEN + HSS_PRIV_KEY_PARAM_SET_LEN + LMS_SEED_LEN + LMS_I_LEN) +/* Maximum public key length - length is constant for all parameters. */ +#define HSS_MAX_PRIVATE_KEY_LEN HSS_PRIVATE_KEY_LEN +/* Maximum private key length - length is constant for all parameters. */ +#define HSS_MAX_PUBLIC_KEY_LEN HSS_PUBLIC_KEY_LEN +/* Maximum signature length. */ +#define HSS_MAX_SIG_LEN \ + (LMS_TYPE_LEN + \ + LMS_MAX_LEVELS * (LMS_Q_LEN + LMS_TYPE_LEN + LMS_TYPE_LEN + \ + LMS_MAX_NODE_LEN * (1 + LMS_MAX_P + LMS_MAX_HEIGHT)) + \ + (LMS_MAX_LEVELS - 1) * LMS_PUBKEY_LEN \ + ) + +/* Maximum buffer length required for use when hashing. */ +#define LMS_MAX_BUFFER_LEN \ + (LMS_I_LEN + LMS_Q_LEN + LMS_P_LEN + LMS_W_LEN + 2 * LMS_MAX_NODE_LEN) + + +/* Private key data length. + * + * HSSPrivKey.priv + */ +#define LMS_PRIV_KEY_LEN(l) \ + ((l) * LMS_PRIV_LEN) + +/* Stack of nodes. */ +#define LMS_STACK_CACHE_LEN(h) \ + (((h) + 1) * LMS_MAX_NODE_LEN) + +/* Root cache length. */ +#define LMS_ROOT_CACHE_LEN(rl) \ + (((1 << (rl)) - 1) * LMS_MAX_NODE_LEN) + +/* Leaf cache length. */ +#define LMS_LEAF_CACHE_LEN(cb) \ + ((1 << (cb)) * LMS_MAX_NODE_LEN) + +/* Length of LMS private key state. + * + * LmsPrivState + * auth_path + + * root + + * stack.stack + stack.offset + + * cache.leaf + cache.index + cache.offset + */ +#define LMS_PRIV_STATE_LEN(h, rl, cb) \ + (((h) * LMS_MAX_NODE_LEN) + \ + LMS_STACK_CACHE_LEN(h) + 4 + \ + LMS_ROOT_CACHE_LEN(rl) + \ + LMS_LEAF_CACHE_LEN(cb) + 4 + 4) + +#ifndef WOLFSSL_WC_LMS_SMALL + /* Private key data state for all levels. */ + #define LMS_PRIV_STATE_ALL_LEN(l, h, rl, cb) \ + ((l) * LMS_PRIV_STATE_LEN(h, rl, cb)) +#else + /* Private key data state for all levels. */ + #define LMS_PRIV_STATE_ALL_LEN(l, h, rl, cb) 0 +#endif + +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + /* Extra private key data for smoothing. */ + #define LMS_PRIV_SMOOTH_LEN(l, h, rl, cb) \ + (LMS_PRIV_KEY_LEN(l) + \ + ((l) - 1) * LMS_PRIV_STATE_LEN(h, rl, cb)) +#else + /* Extra private key data for smoothing. */ + #define LMS_PRIV_SMOOTH_LEN(l, h, rl, cb) 0 +#endif + +#ifndef WOLFSSL_LMS_NO_SIG_CACHE + #define LMS_PRIV_Y_TREE_LEN(p) \ + (LMS_MAX_NODE_LEN + (p) * LMS_MAX_NODE_LEN) + /* Length of the y data cached in private key data. */ + #define LMS_PRIV_Y_LEN(l, p) \ + (((l) - 1) * (LMS_MAX_NODE_LEN + (p) * LMS_MAX_NODE_LEN)) +#else + /* Length of the y data cached in private key data. */ + #define LMS_PRIV_Y_LEN(l, p) 0 +#endif + +#ifndef WOLFSSL_WC_LMS_SMALL +/* Length of private key data. */ +#define LMS_PRIV_DATA_LEN(l, h, p, rl, cb) \ + (LMS_PRIV_KEY_LEN(l) + \ + LMS_PRIV_STATE_ALL_LEN(l, h, rl, cb) + \ + LMS_PRIV_SMOOTH_LEN(l, h, rl, cb) + \ + LMS_PRIV_Y_LEN(l, p)) +#else +#define LMS_PRIV_DATA_LEN(l, h, p, rl, cb) \ + LMS_PRIV_KEY_LEN(l) +#endif + + +/* LMS Parameters. */ +/* SHA-256 hash, 32-bytes of hash used, tree height of 5. */ +#define LMS_SHA256_M32_H5 5 +/* SHA-256 hash, 32-bytes of hash used, tree height of 10. */ +#define LMS_SHA256_M32_H10 6 +/* SHA-256 hash, 32-bytes of hash used, tree height of 15. */ +#define LMS_SHA256_M32_H15 7 +/* SHA-256 hash, 32-bytes of hash used, tree height of 20. */ +#define LMS_SHA256_M32_H20 8 +/* SHA-256 hash, 32-bytes of hash used, tree height of 25. */ +#define LMS_SHA256_M32_H25 9 + +/* SHA-256 hash, 32-bytes of hash used, Winternitz width of 1 bit. */ +#define LMOTS_SHA256_N32_W1 1 +/* SHA-256 hash, 32-bytes of hash used, Winternitz width of 2 bits. */ +#define LMOTS_SHA256_N32_W2 2 +/* SHA-256 hash, 32-bytes of hash used, Winternitz width of 4 bits. */ +#define LMOTS_SHA256_N32_W4 3 +/* SHA-256 hash, 32-bytes of hash used, Winternitz width of 8 bits. */ +#define LMOTS_SHA256_N32_W8 4 + +typedef struct LmsParams { + /* Number of tree levels. */ + word8 levels; + /* Height of each tree. */ + word8 height; + /* Width or Winternitz coefficient. */ + word8 width; + /* Number of left-shift bits used in checksum calculation. */ + word8 ls; + /* Number of n-byte string elements in LM-OTS signature. */ + word16 p; + /* LMS type. */ + word16 lmsType; + /* LMOTS type. */ + word16 lmOtsType; + /* Length of LM-OTS signature. */ + word16 sig_len; +#ifndef WOLFSSL_WC_LMS_SMALL + /* Number of root levels of interior nodes to store. */ + word8 rootLevels; + /* 2 to the power of the value is the number of leaf nodes to cache. */ + word8 cacheBits; +#endif +} LmsParams; + +/* Mapping of id and string to parameters. */ +typedef struct wc_LmsParamsMap { + /* Identifier of parameters. */ + enum wc_LmsParm id; + /* String representation of identifier of parameters. */ + const char* str; + /* LMS parameter set. */ + LmsParams params; +} wc_LmsParamsMap; + +typedef struct LmsState { + /* Buffer to hold data to hash. */ + ALIGN16 byte buffer[LMS_MAX_BUFFER_LEN]; +#ifdef WOLFSSL_SMALL_STACK + /* Buffer to hold expanded Q coefficients. */ + ALIGN16 byte a[LMS_MAX_P]; +#endif + /* LMS parameters. */ + const LmsParams* params; + /* Hash algorithm. */ + wc_Sha256 hash; + /* Hash algorithm for calculating K. */ + wc_Sha256 hash_k; +} LmsState; + +#ifndef WOLFSSL_WC_LMS_SMALL +/* Stack of interior node hashes. */ +typedef struct LmsStack { + /* Stack nodes. */ + byte* stack; + /* Top of stack offset. */ + word32 offset; +} LmsStack; + +/* Cache of leaf hashes. */ +typedef struct HssLeafCache { + /* Cache of leaf nodes. Circular queue. */ + byte* cache; + /* Start index of cached leaf nodes. */ + word32 idx; + /* Index into cache of first leaf node. */ + word32 offset; +} HssLeafCache; + +typedef struct LmsPrivState { + /* Authentication path for current index. */ + byte* auth_path; + /* Stack nodes. */ + LmsStack stack; + /* Root nodes. */ + byte* root; + /* Cache of leaf nodes. */ + HssLeafCache leaf; +} LmsPrivState; +#endif /* WOLFSSL_WC_LMS_SMALL */ + +typedef struct HssPrivKey { + /* Private key. */ + byte* priv; +#ifndef WOLFSSL_WC_LMS_SMALL + /* Per level state of the private key. */ + LmsPrivState state[LMS_MAX_LEVELS]; +#ifndef WOLFSSL_LMS_NO_SIGN_SMOOTHING + /* Next private key. */ + byte* next_priv; + /* Next private state. */ + LmsPrivState next_state[LMS_MAX_LEVELS - 1]; +#endif +#ifndef WOLFSSL_LMS_NO_SIG_CACHE + /* Per level state of the private key. */ + byte* y; +#endif + /* Indicates the key has all levels initialized. */ + word8 inited:1; +#endif +} HssPrivKey; + +struct LmsKey { + /* Public key. */ + ALIGN16 byte pub[HSS_PUBLIC_KEY_LEN]; +#ifndef WOLFSSL_LMS_VERIFY_ONLY + /* Encoded private key. */ + ALIGN16 byte priv_raw[HSS_PRIVATE_KEY_LEN]; + + /* Packed private key data. */ + byte* priv_data; + /* HSS Private key. */ + HssPrivKey priv; + + /* Callback to write/update key. */ + wc_lms_write_private_key_cb write_private_key; + /* Callback to read key. */ + wc_lms_read_private_key_cb read_private_key; + /* Context arg passed to callbacks. */ + void* context; + /* Dynamic memory hint. */ + void* heap; +#endif /* !WOLFSSL_LMS_VERIFY_ONLY */ + /* Parameters of key. */ + const LmsParams* params; + /* Current state of key. */ + enum wc_LmsState state; +#ifdef WOLF_CRYPTO_CB + /* Device Identifier. */ + int devId; +#endif +}; + +int wc_hss_make_key(LmsState* state, WC_RNG* rng, byte* priv_raw, + HssPrivKey* priv_key, byte* priv_data, byte* pub); +int wc_hss_reload_key(LmsState* state, const byte* priv_raw, + HssPrivKey* priv_key, byte* priv_data, byte* pub_root); +int wc_hss_sign(LmsState* state, byte* priv_raw, HssPrivKey* priv_key, + byte* priv_data, const byte* msg, word32 msgSz, byte* sig); +int wc_hss_sigsleft(const LmsParams* params, const byte* priv_raw); +int wc_hss_verify(LmsState* state, const byte* pub, const byte* msg, + word32 msgSz, const byte* sig); + +#endif /* WOLFSSL_HAVE_LMS && WOLFSSL_WC_LMS */ + +#endif /* WC_LMS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_port.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_port.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_port.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_port.h 2024-08-03 07:30:01.000000000 +0000 @@ -60,6 +60,9 @@ /* THREADING/MUTEX SECTION */ #ifdef USE_WINDOWS_API + #if defined(WOLFSSL_PTHREADS) + #include + #endif #ifdef WOLFSSL_GAME_BUILD #include "system/xtl.h" #else @@ -77,6 +80,9 @@ #endif #endif /* WOLFSSL_SGX */ #endif + #if !defined(SINGLE_THREADED) && !defined(_WIN32_WCE) + #include + #endif #elif defined(THREADX) #ifndef SINGLE_THREADED #ifdef NEED_THREADX_TYPES @@ -124,6 +130,7 @@ #include "cmsis_os.h" #elif defined(WOLFSSL_TIRTOS) #include + #include #include #elif defined(WOLFSSL_FROSTED) #include @@ -138,13 +145,20 @@ #elif defined(WOLFSSL_APACHE_MYNEWT) /* do nothing */ #elif defined(WOLFSSL_ZEPHYR) + #include #ifndef SINGLE_THREADED #ifndef CONFIG_PTHREAD_IPC #error "Need CONFIG_PTHREAD_IPC for threading" #endif + #if KERNEL_VERSION_NUMBER >= 0x30100 #include #include #include + #else + #include + #include + #include + #endif #endif #elif defined(WOLFSSL_TELIT_M2MB) @@ -224,7 +238,7 @@ signed char mutexBuffer[portQUEUE_OVERHEAD_BYTES]; xSemaphoreHandle mutex; } wolfSSL_Mutex; - #elif defined(USE_WINDOWS_API) + #elif defined(USE_WINDOWS_API) && !defined(WOLFSSL_PTHREADS) typedef CRITICAL_SECTION wolfSSL_Mutex; #elif defined(MAXQ10XX_MUTEX) #include @@ -237,6 +251,7 @@ typedef pthread_rwlock_t wolfSSL_RwLock; #endif typedef pthread_mutex_t wolfSSL_Mutex; + #define WOLFSSL_MUTEX_INITIALIZER(lockname) PTHREAD_MUTEX_INITIALIZER #elif defined(THREADX) typedef TX_MUTEX wolfSSL_Mutex; #elif defined(WOLFSSL_DEOS) @@ -244,7 +259,11 @@ #elif defined(MICRIUM) typedef OS_MUTEX wolfSSL_Mutex; #elif defined(EBSNET) - typedef RTP_MUTEX wolfSSL_Mutex; + #if (defined(RTPLATFORM) && (RTPLATFORM != 0)) + typedef RTP_MUTEX wolfSSL_Mutex; + #else + typedef KS_RTIPSEM wolfSSL_Mutex; + #endif #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) typedef MUTEX_STRUCT wolfSSL_Mutex; #elif defined(FREESCALE_FREE_RTOS) @@ -294,6 +313,13 @@ #endif /* USE_WINDOWS_API */ #endif /* SINGLE_THREADED */ + +#ifdef WOLFSSL_MUTEX_INITIALIZER + #define WOLFSSL_MUTEX_INITIALIZER_CLAUSE(lockname) = WOLFSSL_MUTEX_INITIALIZER(lockname) +#else + #define WOLFSSL_MUTEX_INITIALIZER_CLAUSE(lockname) /* null expansion */ +#endif + #if !defined(WOLFSSL_USE_RWLOCK) || defined(SINGLE_THREADED) typedef wolfSSL_Mutex wolfSSL_RwLock; #endif @@ -316,7 +342,11 @@ #endif #elif defined(_MSC_VER) /* Use MSVC compiler intrinsics for atomic ops */ - #include + #ifdef _WIN32_WCE + #include + #else + #include + #endif typedef volatile long wolfSSL_Atomic_Int; #define WOLFSSL_ATOMIC_OPS #endif @@ -349,7 +379,7 @@ (ref)->count = 1; \ *(err) = 0; \ } while(0) -#define wolfSSL_RefFree(ref) +#define wolfSSL_RefFree(ref) WC_DO_NOTHING #define wolfSSL_RefInc(ref, err) \ do { \ (ref)->count++; \ @@ -369,7 +399,7 @@ wolfSSL_Atomic_Int_Init(&(ref)->count, 1); \ *(err) = 0; \ } while(0) -#define wolfSSL_RefFree(ref) +#define wolfSSL_RefFree(ref) WC_DO_NOTHING #define wolfSSL_RefInc(ref, err) \ do { \ (void)wolfSSL_Atomic_Int_FetchAdd(&(ref)->count, 1); \ @@ -440,6 +470,7 @@ WOLFSSL_API int wc_LockMutex_ex(int flag, int type, const char* file, int line); WOLFSSL_API int wc_SetMutexCb(mutex_cb* cb); +WOLFSSL_API mutex_cb* wc_GetMutexCb(void); #endif /* main crypto initialization function */ @@ -474,6 +505,8 @@ #define XSEEK_END VSEEK_END #define XBADFILE -1 #define XFGETS(b,s,f) -2 /* Not ported yet */ + #define XSNPRINTF rtp_snprintf + #define XFPRINTF fprintf #elif defined(LSR_FS) #include @@ -615,7 +648,7 @@ #define XFREAD fread #define XFWRITE fwrite #define XFCLOSE fclose - #define XSEEK_END SEEK_SET + #define XSEEK_SET SEEK_SET #define XSEEK_END SEEK_END #define XBADFILE NULL #define XFGETS fgets @@ -680,59 +713,85 @@ #define XFGETS fgets #define XFPRINTF fprintf #define XFFLUSH fflush + #define XFEOF(fp) feof(fp) + #define XFERROR(fp) ferror(fp) + #define XCLEARERR(fp) clearerr(fp) #if !defined(NO_WOLFSSL_DIR)\ && !defined(WOLFSSL_NUCLEUS) && !defined(WOLFSSL_NUCLEUS_1_2) - #if defined(USE_WINDOWS_API) - #include - #ifndef XSTAT - #define XSTAT _stat - #endif - #define XS_ISREG(s) (s & _S_IFREG) - #define SEPARATOR_CHAR ';' + #if defined(USE_WINDOWS_API) + #include + #include + #ifndef XSTAT + #define XSTAT _stat + #endif + #define XS_ISREG(s) (s & _S_IFREG) + #define SEPARATOR_CHAR ';' + #define XWRITE _write + #define XREAD _read + #define XALTHOMEVARNAME "USERPROFILE" + + #elif defined(ARDUINO) + #ifndef XSTAT + #define XSTAT _stat + #endif + #define XS_ISREG(s) (s & _S_IFREG) + #define SEPARATOR_CHAR ';' - #elif defined(INTIME_RTOS) - #include - #ifndef XSTAT - #define XSTAT _stat64 - #endif - #define XS_ISREG(s) S_ISREG(s) - #define SEPARATOR_CHAR ';' - #define XWRITE write - #define XREAD read - #define XCLOSE close + #elif defined(INTIME_RTOS) + #include + #ifndef XSTAT + #define XSTAT _stat64 + #endif + #define XS_ISREG(s) S_ISREG(s) + #define SEPARATOR_CHAR ';' + #define XWRITE write + #define XREAD read + #define XCLOSE close + + #elif defined(WOLFSSL_TELIT_M2MB) + #ifndef XSTAT + #define XSTAT m2mb_fs_stat + #endif + #define XS_ISREG(s) (s & M2MB_S_IFREG) + #define SEPARATOR_CHAR ':' - #elif defined(WOLFSSL_TELIT_M2MB) - #ifndef XSTAT - #define XSTAT m2mb_fs_stat - #endif - #define XS_ISREG(s) (s & M2MB_S_IFREG) - #define SEPARATOR_CHAR ':' - #else - #include - #include - #include - #define XWRITE write - #define XREAD read - #define XCLOSE close - #ifndef XSTAT - #define XSTAT stat + #else + #ifndef NO_WOLFSSL_DIR + #include + #endif + #include + #include + #define XWRITE write + #define XREAD read + #define XCLOSE close + #ifndef XSTAT + #define XSTAT stat + #endif + #define XS_ISREG(s) S_ISREG(s) + #define SEPARATOR_CHAR ':' #endif - #define XS_ISREG(s) S_ISREG(s) - #define SEPARATOR_CHAR ':' - #endif - #ifndef XSTAT_TYPE - #define XSTAT_TYPE struct XSTAT - #endif - #endif + #ifndef XSTAT_TYPE + #define XSTAT_TYPE struct XSTAT + #endif + #endif /* !NO_WOLFSSL_DIR !WOLFSSL_NUCLEUS !WOLFSSL_NUCLEUS_1_2 */ #endif #ifndef MAX_FILENAME_SZ - #define MAX_FILENAME_SZ 256 /* max file name length */ + #define MAX_FILENAME_SZ (260 + 1) /* max file name length */ #endif #ifndef MAX_PATH - #define MAX_PATH 256 + #define MAX_PATH (260 + 1) + #endif + #ifndef XFEOF + #define XFEOF(fp) 0 + #endif + #ifndef XFERROR + #define XFERROR(fp) 0 + #endif + #ifndef XCLEARERR + #define XCLEARERR(fp) WC_DO_NOTHING #endif WOLFSSL_LOCAL int wc_FileLoad(const char* fname, unsigned char** buf, @@ -762,6 +821,8 @@ #define IntimeFindNext(data) (0 == _findnext64(data)) #define IntimeFindClose(data) (0 == _findclose64(data)) #define IntimeFilename(ctx) ctx->FindFileData.f_filename + #elif defined(ARDUINO) + /* TODO: board specific features */ #else struct dirent* entry; DIR* dir; @@ -856,7 +917,7 @@ #include "os.h" /* dc_rtc_api needs */ #include "dc_rtc_api.h" /* to get current time */ - /* uses parital structures */ + /* uses partial structures */ #define XTIME(tl) (0) #define XGMTIME(c, t) rtpsys_gmtime((c)) @@ -965,10 +1026,23 @@ #define USE_WOLF_TIME_T #elif defined(WOLFSSL_ZEPHYR) + #include #ifndef _POSIX_C_SOURCE - #include + #if KERNEL_VERSION_NUMBER >= 0x30100 + #include + #else + #include + #endif #else - #include + #include + #endif + + #if defined(CONFIG_RTC) + #if defined(CONFIG_PICOLIBC) || defined(CONFIG_NEWLIB_LIBC) + #include + #else + #warning "RTC support needs picolibc or newlib (nano)" + #endif #endif time_t z_time(time_t *timer); @@ -1041,6 +1115,11 @@ #define XTIME(tl) time((tl)) #endif #endif + +#if defined(WOLFSSL_GMTIME) && !defined(HAVE_GMTIME_R) + #define HAVE_GMTIME_R +#endif + #if !defined(XGMTIME) && !defined(TIME_OVERRIDES) /* Always use gmtime_r if available. */ #if defined(HAVE_GMTIME_S) @@ -1106,8 +1185,9 @@ extern struct tm* XGMTIME(const time_t* timer, struct tm* tmp); #elif defined(WOLFSSL_GMTIME) struct tm* gmtime(const time_t* timer); + struct tm* gmtime_r(const time_t* timer, struct tm *ret); #endif -#endif /* NO_ASN_TIME */ +#endif /* !NO_ASN_TIME */ #ifndef WOLFSSL_LEANPSK @@ -1151,6 +1231,50 @@ #endif #endif +#ifdef WOLF_C99 + /* use alternate keyword for compatibility with -std=c99 */ + #define XASM_VOLATILE(a) __asm__ volatile(a) +#elif defined(__IAR_SYSTEMS_ICC__) + #define XASM_VOLATILE(a) asm volatile(a) +#elif defined(__KEIL__) + #define XASM_VOLATILE(a) __asm volatile(a) +#else + #define XASM_VOLATILE(a) __asm__ __volatile__(a) +#endif + +#ifndef WOLFSSL_NO_FENCE + #if defined (__i386__) || defined(__x86_64__) + #define XFENCE() XASM_VOLATILE("lfence") + #elif (defined (__arm__) && (__ARM_ARCH > 6)) || defined(__aarch64__) + #define XFENCE() XASM_VOLATILE("isb") + #elif defined(__riscv) + #define XFENCE() XASM_VOLATILE("fence") + #elif defined(__PPC__) + #define XFENCE() XASM_VOLATILE("isync; sync") + #else + #define XFENCE() do{}while(0) + #endif +#else + #define XFENCE() do{}while(0) +#endif + + + /* AFTER user_settings.h is loaded, + ** determine if POSIX multi-threaded: HAVE_PTHREAD */ + #if defined(SINGLE_THREADED) || defined(__MINGW32__) + /* Never HAVE_PTHREAD in single thread, or non-POSIX mode. + ** Reminder: MING32 is win32 threads, not POSIX threads */ + #undef HAVE_PTHREAD + #else + /* _POSIX_THREADS is defined by unistd.h so this check needs to happen + * after we include all the platform relevant libs. */ + #ifdef _POSIX_THREADS + /* HAVE_PTHREAD == POSIX threads capable and enabled. */ + #undef HAVE_PTHREAD + #define HAVE_PTHREAD 1 + #endif + #endif + #ifdef __cplusplus } /* extern "C" */ #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_xmss.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_xmss.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_xmss.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/wc_xmss.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,285 @@ +/* wc_xmss.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* Based on: + * o RFC 8391 - XMSS: eXtended Merkle Signature Scheme + * o [HDSS] "Hash-based Digital Signature Schemes", Buchmann, Dahmen and Szydlo + * from "Post Quantum Cryptography", Springer 2009. + */ + +#ifndef WC_XMSS_H +#define WC_XMSS_H + +#ifdef WOLFSSL_HAVE_XMSS +#include +#include +#include +#include + +#if !defined(WOLFSSL_WC_XMSS) + #error "This code is incompatible with external implementation of XMSS." +#endif + +#if (defined(WC_XMSS_SHA512) || defined(WC_XMSS_SHAKE256)) && \ + (WOLFSSL_WC_XMSS_MAX_HASH_SIZE >= 512) + #define WC_XMSS_MAX_N 64 + #define WC_XMSS_MAX_PADDING_LEN 64 +#else + #define WC_XMSS_MAX_N 32 + #define WC_XMSS_MAX_PADDING_LEN 32 +#endif +#define WC_XMSS_MAX_MSG_PRE_LEN \ + (WC_XMSS_MAX_PADDING_LEN + 3 * WC_XMSS_MAX_N) +#define WC_XMSS_MAX_TREE_HEIGHT 20 +#define WC_XMSS_MAX_CSUM_BYTES 4 +#define WC_XMSS_MAX_WOTS_LEN (8 * WC_XMSS_MAX_N / 4 + 3) +#define WC_XMSS_MAX_WOTS_SIG_LEN (WC_XMSS_MAX_WOTS_LEN * WC_XMSS_MAX_N) +#define WC_XMSS_MAX_STACK_LEN \ + ((WC_XMSS_MAX_TREE_HEIGHT + 1) * WC_XMSS_MAX_N) +#define WC_XMSS_MAX_D 12 +#define WC_XMSS_MAX_BDS_STATES (2 * WC_XMSS_MAX_D - 1) +#define WC_XMSS_MAX_TREE_HASH \ + ((2 * WC_XMSS_MAX_D - 1) * WC_XMSS_MAX_TREE_HEIGHT) +#define WC_XMSS_MAX_BDS_K 0 + +#define WC_XMSS_ADDR_LEN 32 + +#define WC_XMSS_HASH_PRF_MAX_DATA_LEN \ + (WC_XMSS_MAX_PADDING_LEN + 2 * WC_XMSS_MAX_N + WC_XMSS_ADDR_LEN) +#define WC_XMSS_HASH_MAX_DATA_LEN \ + (WC_XMSS_MAX_PADDING_LEN + 3 * WC_XMSS_MAX_N) + + +#define WC_XMSS_SHA256_N 32 +#define WC_XMSS_SHA256_PADDING_LEN 32 +#define WC_XMSS_SHA256_WOTS_LEN 67 + +#define XMSS_OID_LEN 4 + +#define XMSS_MAX_HASH_LEN WC_SHA256_DIGEST_SIZE + +#define XMSS_RETAIN_LEN(k, n) ((!!(k)) * ((1 << (k)) - (k) - 1) * (n)) + +/* XMMS Algorithm OIDs + * Note: values are used in mathematical calculations in OID to parames. */ +#define WC_XMSS_OID_SHA2_10_256 0x01 +#define WC_XMSS_OID_SHA2_16_256 0x02 +#define WC_XMSS_OID_SHA2_20_256 0x03 +#define WC_XMSS_OID_SHA2_10_512 0x04 +#define WC_XMSS_OID_SHA2_16_512 0x05 +#define WC_XMSS_OID_SHA2_20_512 0x06 +#define WC_XMSS_OID_SHAKE_10_256 0x07 +#define WC_XMSS_OID_SHAKE_16_256 0x08 +#define WC_XMSS_OID_SHAKE_20_256 0x09 +#define WC_XMSS_OID_SHAKE_10_512 0x0a +#define WC_XMSS_OID_SHAKE_16_512 0x0b +#define WC_XMSS_OID_SHAKE_20_512 0x0c +#define WC_XMSS_OID_SHA2_10_192 0x0d +#define WC_XMSS_OID_SHA2_16_192 0x0e +#define WC_XMSS_OID_SHA2_20_192 0x0f +#define WC_XMSS_OID_SHAKE256_10_256 0x10 +#define WC_XMSS_OID_SHAKE256_16_256 0x11 +#define WC_XMSS_OID_SHAKE256_20_256 0x12 +#define WC_XMSS_OID_SHAKE256_10_192 0x13 +#define WC_XMSS_OID_SHAKE256_16_192 0x14 +#define WC_XMSS_OID_SHAKE256_20_192 0x15 +#define WC_XMSS_OID_FIRST WC_XMSS_OID_SHA2_10_256 +#define WC_XMSS_OID_LAST WC_XMSS_OID_SHAKE256_20_192 + +/* XMMS^MT Algorithm OIDs + * Note: values are used in mathematical calculations in OID to parames. */ +#define WC_XMSSMT_OID_SHA2_20_2_256 0x01 +#define WC_XMSSMT_OID_SHA2_20_4_256 0x02 +#define WC_XMSSMT_OID_SHA2_40_2_256 0x03 +#define WC_XMSSMT_OID_SHA2_40_4_256 0x04 +#define WC_XMSSMT_OID_SHA2_40_8_256 0x05 +#define WC_XMSSMT_OID_SHA2_60_3_256 0x06 +#define WC_XMSSMT_OID_SHA2_60_6_256 0x07 +#define WC_XMSSMT_OID_SHA2_60_12_256 0x08 +#define WC_XMSSMT_OID_SHA2_20_2_512 0x09 +#define WC_XMSSMT_OID_SHA2_20_4_512 0x0a +#define WC_XMSSMT_OID_SHA2_40_2_512 0x0b +#define WC_XMSSMT_OID_SHA2_40_4_512 0x0c +#define WC_XMSSMT_OID_SHA2_40_8_512 0x0d +#define WC_XMSSMT_OID_SHA2_60_3_512 0x0e +#define WC_XMSSMT_OID_SHA2_60_6_512 0x0f +#define WC_XMSSMT_OID_SHA2_60_12_512 0x10 +#define WC_XMSSMT_OID_SHAKE_20_2_256 0x11 +#define WC_XMSSMT_OID_SHAKE_20_4_256 0x12 +#define WC_XMSSMT_OID_SHAKE_40_2_256 0x13 +#define WC_XMSSMT_OID_SHAKE_40_4_256 0x14 +#define WC_XMSSMT_OID_SHAKE_40_8_256 0x15 +#define WC_XMSSMT_OID_SHAKE_60_3_256 0x16 +#define WC_XMSSMT_OID_SHAKE_60_6_256 0x17 +#define WC_XMSSMT_OID_SHAKE_60_12_256 0x18 +#define WC_XMSSMT_OID_SHAKE_20_2_512 0x19 +#define WC_XMSSMT_OID_SHAKE_20_4_512 0x1a +#define WC_XMSSMT_OID_SHAKE_40_2_512 0x1b +#define WC_XMSSMT_OID_SHAKE_40_4_512 0x1c +#define WC_XMSSMT_OID_SHAKE_40_8_512 0x1d +#define WC_XMSSMT_OID_SHAKE_60_3_512 0x1e +#define WC_XMSSMT_OID_SHAKE_60_6_512 0x1f +#define WC_XMSSMT_OID_SHAKE_60_12_512 0x20 +#define WC_XMSSMT_OID_SHA2_20_2_192 0x21 +#define WC_XMSSMT_OID_SHA2_20_4_192 0x22 +#define WC_XMSSMT_OID_SHA2_40_2_192 0x23 +#define WC_XMSSMT_OID_SHA2_40_4_192 0x24 +#define WC_XMSSMT_OID_SHA2_40_8_192 0x25 +#define WC_XMSSMT_OID_SHA2_60_3_192 0x26 +#define WC_XMSSMT_OID_SHA2_60_6_192 0x27 +#define WC_XMSSMT_OID_SHA2_60_12_192 0x28 +#define WC_XMSSMT_OID_SHAKE256_20_2_256 0x29 +#define WC_XMSSMT_OID_SHAKE256_20_4_256 0x2a +#define WC_XMSSMT_OID_SHAKE256_40_2_256 0x2b +#define WC_XMSSMT_OID_SHAKE256_40_4_256 0x2c +#define WC_XMSSMT_OID_SHAKE256_40_8_256 0x2d +#define WC_XMSSMT_OID_SHAKE256_60_3_256 0x2e +#define WC_XMSSMT_OID_SHAKE256_60_6_256 0x2f +#define WC_XMSSMT_OID_SHAKE256_60_12_256 0x30 +#define WC_XMSSMT_OID_SHAKE256_20_2_192 0x31 +#define WC_XMSSMT_OID_SHAKE256_20_4_192 0x32 +#define WC_XMSSMT_OID_SHAKE256_40_2_192 0x33 +#define WC_XMSSMT_OID_SHAKE256_40_4_192 0x34 +#define WC_XMSSMT_OID_SHAKE256_40_8_192 0x35 +#define WC_XMSSMT_OID_SHAKE256_60_3_192 0x36 +#define WC_XMSSMT_OID_SHAKE256_60_6_192 0x37 +#define WC_XMSSMT_OID_SHAKE256_60_12_192 0x38 +#define WC_XMSSMT_OID_FIRST WC_XMSSMT_OID_SHA2_20_2_256 +#define WC_XMSSMT_OID_LAST WC_XMSSMT_OID_SHAKE256_60_12_192 + + +/* Type for hash address. */ +typedef word32 HashAddress[8]; + +/* XMSS/XMSS^MT fixed parameters. */ +typedef struct XmssParams { + /* Hash algorithm to use. */ + word8 hash; + /* Size of hash output. */ + word8 n; + /* Number of bytes of padding before rest of hash data. */ + word8 pad_len; + /* Number of values to chain = 2 * n + 3. */ + word8 wots_len; + /* Number of bytes in each WOTS+ signature. */ + word16 wots_sig_len; + /* Full height of tree. */ + word8 h; + /* Height of tree each subtree. */ + word8 sub_h; + /* Number of subtrees = h / sub_h. */ + word8 d; + /* Number of bytes to encode index into in private/secret key. */ + word8 idx_len; + /* Number of bytes in a signature. */ + word32 sig_len; + /* Number of bytes in a secret/private key. */ + word32 sk_len; + /* Number of bytes in a public key. */ + word8 pk_len; + /* BDS parameter for fast C implementation. */ + word8 bds_k; +} XmssParams; + +struct XmssKey { + /* Public key. */ + unsigned char pk[2 * WC_XMSS_MAX_N]; + /* OID that identifies parameters. */ + word32 oid; + /* Indicates whether the parameters are for XMSS^MT. */ + int is_xmssmt; + /* XMSS/XMSS^MT parameters. */ + const XmssParams* params; +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + /* Secret/private key. */ + unsigned char* sk; + /* Length of secret key. */ + word32 sk_len; + /* Callback to write/update key. */ + wc_xmss_write_private_key_cb write_private_key; + /* Callback to read key. */ + wc_xmss_read_private_key_cb read_private_key; + /* Context arg passed to callbacks. */ + void* context; +#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY */ + /* State of key. */ + enum wc_XmssState state; +}; + +typedef struct XmssState { + const XmssParams* params; + + /* Digest is assumed to be at the end. */ + union { + #ifdef WC_XMSS_SHA256 + wc_Sha256 sha256; + #endif + #ifdef WC_XMSS_SHA512 + wc_Sha512 sha512; + #endif + #if defined(WC_XMSS_SHAKE128) || defined(WC_XMSS_SHAKE256) + wc_Shake shake; + #endif + } digest; +#if !defined(WOLFSSL_WC_XMSS_SMALL) && defined(WC_XMSS_SHA256) && \ + !defined(WC_XMSS_FULL_HASH) + ALIGN16 word32 dgst_state[WC_SHA256_DIGEST_SIZE / sizeof(word32)]; +#endif + ALIGN16 byte prf_buf[WC_XMSS_HASH_PRF_MAX_DATA_LEN]; + ALIGN16 byte buf[WC_XMSS_HASH_MAX_DATA_LEN]; + ALIGN16 byte pk[WC_XMSS_MAX_WOTS_SIG_LEN]; +#ifndef WOLFSSL_XMSS_VERIFY_ONLY + ALIGN16 byte stack[WC_XMSS_MAX_STACK_LEN]; +#else + ALIGN16 byte stack[WC_XMSS_ADDR_LEN]; +#endif + byte encMsg[WC_XMSS_MAX_WOTS_LEN]; + HashAddress addr; + + int ret; +} XmssState; + +#ifdef __cplusplus + extern "C" { +#endif + +WOLFSSL_LOCAL int wc_xmssmt_keygen(XmssState *state, const unsigned char* seed, + unsigned char *sk, unsigned char *pk); +WOLFSSL_LOCAL int wc_xmss_keygen(XmssState *state, const unsigned char* seed, + unsigned char *sk, unsigned char *pk); + +WOLFSSL_LOCAL int wc_xmssmt_sign(XmssState *state, const unsigned char *m, + word32 mlen, unsigned char *sk, unsigned char *sm); +WOLFSSL_LOCAL int wc_xmss_sign(XmssState *state, const unsigned char *m, + word32 mlen, unsigned char *sk, unsigned char *sm); + +WOLFSSL_LOCAL int wc_xmss_sigsleft(const XmssParams* params, unsigned char* sk); + +WOLFSSL_LOCAL int wc_xmssmt_verify(XmssState *state, const unsigned char *m, + word32 mlen, const unsigned char *sm, const unsigned char *pk); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFSSL_HAVE_XMSS */ +#endif /* WC_XMSS_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/xmss.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/xmss.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/xmss.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfcrypt/xmss.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,203 @@ +/* xmss.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/*! + \file wolfssl/wolfcrypt/xmss.h + */ + +#ifndef WOLF_CRYPT_XMSS_H +#define WOLF_CRYPT_XMSS_H + +#include +#include + +#ifdef WOLFSSL_HAVE_XMSS + +/* Note on XMSS/XMSS^MT pub/priv key sizes: + * - The XMSS/XMSS^MT pub key has a defined format and size. + * - The XMSS/XMSS^MT private key is implementation and parameter + * specific. It does not have a standardized format or size. + * + * The XMSS/XMSS^MT public and secret key format and length is: + * PK = OID || root || SEED; + * PK_len = 4 + 2 * n + * + * SK = OID || (implementation defined) + * SK_len = 4 + (implementation defined) + * + * where n is the number of bytes in the hash function, which is 32 + * in this SHA256 implementation. + * + * However the private key is implementation specific. For example, + * in xmss-reference the private key size varies from 137 bytes to + * 1377 bytes between slow and fast implementations with param name + * "XMSSMT-SHA2_20/2_256". + * + * References: + * - RFC 8391 + * - Table 2 of Kampanakis, Fluhrer, IACR, 2017. + * */ + +#define XMSS_SHA256_PUBLEN (68) + +/* Supported XMSS/XMSS^MT parameter set names: + * We are supporting all SHA256 parameter sets with n=32 and + * Winternitz=16, from RFC 8391 and NIST SP 800-208. + * + * ---------------------------------------------------------- + * | Name OID n w len h d | + * XMSS: | "XMSS-SHA2_10_256" 0x00000001 32 16 67 10 1 | + * | "XMSS-SHA2_16_256" 0x00000002 32 16 67 16 1 | + * | "XMSS-SHA2_20_256" 0x00000003 32 16 67 20 1 | + * | | + * XMSSMT: | "XMSSMT-SHA2_20/2_256" 0x00000001 32 16 67 20 2 | + * | "XMSSMT-SHA2_20/4_256" 0x00000002 32 16 67 20 4 | + * | "XMSSMT-SHA2_40/2_256" 0x00000003 32 16 67 40 2 | + * | "XMSSMT-SHA2_40/4_256" 0x00000004 32 16 67 40 4 | + * | "XMSSMT-SHA2_40/8_256" 0x00000005 32 16 67 40 8 | + * | "XMSSMT-SHA2_60/3_256" 0x00000006 32 16 67 60 3 | + * | "XMSSMT-SHA2_60/6_256" 0x00000007 32 16 67 60 6 | + * | "XMSSMT-SHA2_60/12_256" 0x00000008 32 16 67 60 12 | + * ---------------------------------------------------------- + * + * Note that some XMSS and XMSSMT names do have overlapping OIDs. + * + * References: + * 1. NIST SP 800-208 + * 2. RFC 8391 + * */ + +#define XMSS_NAME_LEN (16) /* strlen("XMSS-SHA2_10_256") */ +#define XMSSMT_NAME_MIN_LEN (20) /* strlen("XMSSMT-SHA2_20/2_256") */ +#define XMSSMT_NAME_MAX_LEN (21) /* strlen("XMSSMT-SHA2_60/12_256") */ + +#if defined(HAVE_FIPS) || defined(HAVE_LIBXMSS) + #undef WOLFSSL_WC_XMSS_NO_SHA512 + #define WOLFSSL_WC_XMSS_NO_SHA512 + #undef WOLFSSL_WC_XMSS_NO_SHAKE128 + #define WOLFSSL_WC_XMSS_NO_SHAKE128 + #undef WOLFSSL_WC_XMSS_MAX_HASH_SIZE + #ifdef HAVE_LIBXMSS + #define WOLFSSL_WC_XMSS_MIN_HASH_SIZE 256 + #else + #define WOLFSSL_WC_XMSS_MIN_HASH_SIZE 192 + #endif + #define WOLFSSL_WC_XMSS_MAX_HASH_SIZE 256 +#endif + +#if !defined(NO_SHA256) && !defined(WOLFSSL_WC_XMSS_NO_SHA256) + #define WC_XMSS_SHA256 +#endif +#if defined(WOLFSSL_SHA512) && !defined(WOLFSSL_WC_XMSS_NO_SHA512) + #define WC_XMSS_SHA512 +#endif +#if defined(WOLFSSL_SHAKE128) && !defined(WOLFSSL_WC_XMSS_NO_SHAKE128) + #define WC_XMSS_SHAKE128 +#endif +#if defined(WOLFSSL_SHAKE256) && !defined(WOLFSSL_WC_XMSS_NO_SHAKE256) + #define WC_XMSS_SHAKE256 +#endif + +#ifndef WOLFSSL_WC_XMSS_MIN_HASH_SIZE + #define WOLFSSL_WC_XMSS_MIN_HASH_SIZE 192 +#endif +#ifndef WOLFSSL_WC_XMSS_MAX_HASH_SIZE + #define WOLFSSL_WC_XMSS_MAX_HASH_SIZE 512 +#endif +#if WOLFSSL_WC_XMSS_MIN_HASH_SIZE > WOLFSSL_WC_XMSS_MAX_HASH_SIZE + #error "XMSS minimum hash size is greater than maximum hash size" +#endif + +#ifndef WOLFSSL_XMSS_MIN_HEIGHT + #define WOLFSSL_XMSS_MIN_HEIGHT 10 +#endif +#ifndef WOLFSSL_XMSS_MAX_HEIGHT + #define WOLFSSL_XMSS_MAX_HEIGHT 60 +#endif +#if WOLFSSL_XMSS_MIN_HEIGHT > WOLFSSL_XMSS_MAX_HEIGHT + #error "XMSS minimum height is greater than maximum height" +#endif + +typedef struct XmssKey XmssKey; + +/* Return codes returned by private key callbacks. */ +enum wc_XmssRc { + WC_XMSS_RC_NONE, + WC_XMSS_RC_BAD_ARG, /* Bad arg in read or write callback. */ + WC_XMSS_RC_WRITE_FAIL, /* Write or update private key failed. */ + WC_XMSS_RC_READ_FAIL, /* Read private key failed. */ + WC_XMSS_RC_SAVED_TO_NV_MEMORY, /* Wrote private key to nonvolatile storage. */ + WC_XMSS_RC_READ_TO_MEMORY /* Read private key from storage. */ +}; + +/* enum wc_XmssState is to help track the state of an XMSS Key. */ +enum wc_XmssState { + WC_XMSS_STATE_FREED, /* Key has been freed from memory. */ + WC_XMSS_STATE_INITED, /* Key has been inited, ready to set params.*/ + WC_XMSS_STATE_PARMSET, /* Params are set, ready to MakeKey or Reload. */ + WC_XMSS_STATE_OK, /* Able to sign signatures and verify. */ + WC_XMSS_STATE_VERIFYONLY, /* A public only XmssKey. */ + WC_XMSS_STATE_BAD, /* Can't guarantee key's state. */ + WC_XMSS_STATE_NOSIGS /* Signatures exhausted. */ +}; + +/* Private key write and read callbacks. */ +typedef enum wc_XmssRc (*wc_xmss_write_private_key_cb)(const byte* priv, word32 privSz, + void* context); +typedef enum wc_XmssRc (*wc_xmss_read_private_key_cb)(byte* priv, word32 privSz, + void* context); + +#ifdef __cplusplus + extern "C" { +#endif + +WOLFSSL_API int wc_XmssKey_Init(XmssKey* key, void* heap, int devId); +WOLFSSL_API int wc_XmssKey_SetParamStr(XmssKey* key, const char* str); +#ifndef WOLFSSL_XMSS_VERIFY_ONLY +WOLFSSL_API int wc_XmssKey_SetWriteCb(XmssKey* key, + wc_xmss_write_private_key_cb write_cb); +WOLFSSL_API int wc_XmssKey_SetReadCb(XmssKey* key, + wc_xmss_read_private_key_cb read_cb); +WOLFSSL_API int wc_XmssKey_SetContext(XmssKey* key, void* context); +WOLFSSL_API int wc_XmssKey_MakeKey(XmssKey* key, WC_RNG* rng); +WOLFSSL_API int wc_XmssKey_Reload(XmssKey* key); +WOLFSSL_API int wc_XmssKey_GetPrivLen(const XmssKey* key, word32* len); +WOLFSSL_API int wc_XmssKey_Sign(XmssKey* key, byte* sig, word32* sigSz, + const byte* msg, int msgSz); +WOLFSSL_API int wc_XmssKey_SigsLeft(XmssKey* key); +#endif /* ifndef WOLFSSL_XMSS_VERIFY_ONLY */ +WOLFSSL_API void wc_XmssKey_Free(XmssKey* key); +WOLFSSL_API int wc_XmssKey_GetSigLen(const XmssKey* key, word32* len); +WOLFSSL_API int wc_XmssKey_GetPubLen(const XmssKey* key, word32* len); +WOLFSSL_API int wc_XmssKey_ExportPub(XmssKey* keyDst, const XmssKey* keySrc); +WOLFSSL_API int wc_XmssKey_ExportPubRaw(const XmssKey* key, byte* out, + word32* outLen); +WOLFSSL_API int wc_XmssKey_ImportPubRaw(XmssKey* key, const byte* in, + word32 inLen); +WOLFSSL_API int wc_XmssKey_Verify(XmssKey* key, const byte* sig, word32 sigSz, + const byte* msg, int msgSz); + +#ifdef __cplusplus + } /* extern "C" */ +#endif + +#endif /* WOLFSSL_HAVE_XMSS */ +#endif /* WOLF_CRYPT_XMSS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfio.h mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfio.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl/wolfio.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl/wolfio.h 2024-08-03 07:30:01.000000000 +0000 @@ -26,6 +26,8 @@ #ifndef WOLFSSL_IO_H #define WOLFSSL_IO_H +#include + #ifdef __cplusplus extern "C" { #endif @@ -64,6 +66,8 @@ #include #define LWIP_PROVIDE_ERRNO 1 #endif + #elif defined(ARDUINO) + /* TODO Add specific boards */ #elif defined(FREESCALE_MQX) #include #include @@ -116,8 +120,6 @@ #include #include #include - #include - #include #elif defined(WOLFSSL_SGX) #include #elif defined(WOLFSSL_APACHE_MYNEWT) && !defined(WOLFSSL_LWIP) @@ -127,7 +129,18 @@ #include #include #elif defined(WOLFSSL_ZEPHYR) - #include + #include + #if KERNEL_VERSION_NUMBER >= 0x30100 + #include + #ifdef CONFIG_POSIX_API + #include + #endif + #else + #include + #ifdef CONFIG_POSIX_API + #include + #endif + #endif #elif defined(MICROCHIP_PIC32) #include #elif defined(HAVE_NETX) @@ -137,6 +150,8 @@ #include #include #include + #elif defined(WOLFSSL_EMNET) + #include #elif !defined(WOLFSSL_NO_SOCK) #include #include @@ -159,17 +174,16 @@ #include #include #include - #include #ifdef __PPU #include #else - #include #endif #endif #endif #if defined(WOLFSSL_RENESAS_RA6M3G) || defined(WOLFSSL_RENESAS_RA6M3) ||\ - defined(WOLFSSL_RENESAS_RA6M4) + defined(WOLFSSL_RENESAS_RA6M4) || \ + defined(WOLFSSL_RENESAS_RZN2L) /* Uses FREERTOS_TCP */ #include #endif @@ -205,7 +219,8 @@ #define SOCKET_ECONNREFUSED SYS_NET_ECONNREFUSED #define SOCKET_ECONNABORTED SYS_NET_ECONNABORTED #elif defined(FREESCALE_MQX) || defined(FREESCALE_KSDK_MQX) - #if MQX_USE_IO_OLD + #if (defined(MQX_USE_IO_OLD) && MQX_USE_IO_OLD) || \ + defined(FREESCALE_MQX_5_0) /* RTCS old I/O doesn't have an EWOULDBLOCK */ #define SOCKET_EWOULDBLOCK EAGAIN #define SOCKET_EAGAIN EAGAIN @@ -292,7 +307,7 @@ #define SOCKET_ECONNREFUSED ERR_CONN #define SOCKET_ECONNABORTED ERR_ABRT #elif defined(WOLFSSL_EMNET) - #include + #define XSOCKLENT int #define SOCKET_EWOULDBLOCK IP_ERR_WOULD_BLOCK #define SOCKET_EAGAIN IP_ERR_WOULD_BLOCK #define SOCKET_ECONNRESET IP_ERR_CONN_RESET @@ -315,6 +330,12 @@ #include #define SEND_FUNCTION net_send #define RECV_FUNCTION net_recv +#elif defined(WOLFSSL_ESPIDF) + #define SEND_FUNCTION send + #define RECV_FUNCTION recv + #if !defined(HAVE_SOCKADDR) && !defined(WOLFSSL_NO_SOCK) + #define HAVE_SOCKADDR + #endif #elif defined(WOLFSSL_LWIP) && !defined(WOLFSSL_APACHE_MYNEWT) #define SEND_FUNCTION lwip_send #define RECV_FUNCTION lwip_recv @@ -381,6 +402,13 @@ #define XSOCKLENT socklen_t #endif #endif + #ifndef XSOCKOPT_TYPE_OPTVAL_TYPE + #ifdef USE_WINDOWS_API + #define XSOCKOPT_TYPE_OPTVAL_TYPE void* + #else + #define XSOCKOPT_TYPE_OPTVAL_TYPE char* + #endif + #endif /* Socket Addr Support */ #ifdef HAVE_SOCKADDR @@ -429,7 +457,7 @@ extern int closesocket(int); #define CloseSocket(s) closesocket(s) #endif - #define StartTCP() + #define StartTCP() WC_DO_NOTHING #elif defined(FUSION_RTOS) #ifndef CloseSocket #define CloseSocket(s) do { \ @@ -441,7 +469,7 @@ #ifndef CloseSocket #define CloseSocket(s) close(s) #endif - #define StartTCP() + #define StartTCP() WC_DO_NOTHING #ifdef FREERTOS_TCP_WINSIM extern int close(int); #endif Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl.rc and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl.rc differ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl.vcproj mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl.vcproj --- mariadb-10.11.6/extra/wolfssl/wolfssl/wolfssl.vcproj 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wolfssl.vcproj 2024-08-03 07:30:01.000000000 +0000 @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="./;./IDE/WIN" - PreprocessorDefinitions="WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WOLFSSL_LIB;WOLFSSL_USER_SETTINGS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -107,7 +107,7 @@ Optimization="2" EnableIntrinsicFunctions="true" AdditionalIncludeDirectories="./;./IDE/WIN" - PreprocessorDefinitions="WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS" + PreprocessorDefinitions="WOLFSSL_LIB;WOLFSSL_USER_SETTINGS" RuntimeLibrary="2" EnableFunctionLevelLinking="true" UsePrecompiledHeader="0" @@ -200,6 +200,10 @@ > + + @@ -228,6 +232,10 @@ > + + @@ -236,6 +244,10 @@ > + + @@ -252,6 +264,14 @@ > + + + + @@ -280,6 +300,14 @@ > + + + + @@ -312,6 +340,10 @@ > + + @@ -344,6 +376,10 @@ > + + @@ -391,6 +427,10 @@ RelativePath=".\wolfcrypt\src\wolfevent.c" > + + Disabled ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -162,7 +162,7 @@ Disabled ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL @@ -183,7 +183,7 @@ Disabled ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -197,7 +197,7 @@ Disabled ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL @@ -217,7 +217,7 @@ MaxSpeed true ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -230,7 +230,7 @@ MaxSpeed true ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -248,7 +248,7 @@ MaxSpeed true ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -262,7 +262,7 @@ MaxSpeed true ./;./IDE/WIN;%(AdditionalIncludeDirectories) - WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;CYASSL_USER_SETTINGS;%(PreprocessorDefinitions) + WOLFSSL_LIB;BUILDING_WOLFSSL;WOLFSSL_DLL;WOLFSSL_USER_SETTINGS;%(PreprocessorDefinitions) MultiThreadedDLL true @@ -299,13 +299,17 @@ + + + + @@ -316,6 +320,8 @@ + + @@ -334,6 +340,7 @@ + @@ -345,6 +352,7 @@ + @@ -366,6 +374,48 @@ false false ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) + ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) + $(OutDir)%(Filename).obj + $(IntDir)%(Filename).obj + + + false + false + ml64.exe /c /Zi /Fo"$(OutDir)%(Filename).obj" %(Identity) ml64.exe /c /Zi /Fo"$(IntDir)%(Filename).obj" %(Identity) $(OutDir)%(Filename).obj $(IntDir)%(Filename).obj diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/.gitignore mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/.gitignore --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/.gitignore 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1 @@ +obj diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/README.md 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/README.md 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,117 @@ +# Ada Binding Example +The source code for the Ada/SPARK binding of the WolfSSL library +is the WolfSSL Ada package in the wolfssl.ads and wolfssl.adb files. + +The source code here also demonstrates a (D)TLS v1.3 server and client +using the WolfSSL Ada binding. The implementation is cross-platform +and compiles on Linux, Mac OS X and Windows. + +Security: The WolfSSL Ada binding avoids usage of the +Secondary Stack. The GNAT compiler has a number of hardening +features for example Stack Scrubbing; the compiler can generate +code to zero-out stack frames used by subprograms. +Unfortunately this works well for the primary stack but not +for the secondary stack. The GNAT User's Guide recommends +avoiding the secondary stack using the restriction +No_Secondary_Stack (see the GNAT configuration file gnat.adc +which instructs compilation of the WolfSSL Ada binding under +this restriction). Note, however, that the examples do make use of the +secondary stack. + +Portability: The WolfSSL Ada binding makes no usage of controlled types +and has no dependency upon the Ada.Finalization package. +Lighter Ada run-times for embedded systems often have +the restriction No_Finalization. The WolfSSL Ada binding has +been developed with maximum portability in mind. + +Not only can the WolfSSL Ada binding be used in Ada applications but +also SPARK applications (a subset of the Ada language suitable +formal verification). To formally verify the Ada code in this repository +open the client.gpr with GNAT Studio and then select +SPARK -> Prove All Sources and use Proof Level 2. + +``` +Summary of SPARK analysis +========================= + +--------------------------------------------------------------------------------------------------------------- +SPARK Analysis results Total Flow CodePeer Provers Justified Unproved +--------------------------------------------------------------------------------------------------------------- +Data Dependencies 2 2 . . . . +Flow Dependencies . . . . . . +Initialization 15 15 . . . . +Non-Aliasing . . . . . . +Run-time Checks 58 . . 58 (CVC4 85%, Trivial 15%) . . +Assertions 6 . . 6 (CVC4) . . +Functional Contracts 91 . . 91 (CVC4) . . +LSP Verification . . . . . . +Termination . . . . . . +Concurrency . . . . . . +--------------------------------------------------------------------------------------------------------------- +Total 172 17 (10%) . 155 (90%) . . +``` + +## Compiler and Build System installation + +### GNAT Community Edition 2021 +Download and install the GNAT community Edition 2021 compiler and studio: +https://www.adacore.com/download + +Linux Install: + +```sh +chmod +x gnat-2021-20210519-x86_64-linux-bin +./gnat-2021-20210519-x86_64-linux-bin +``` + +```sh +export PATH="/opt/GNAT/2021/bin:$PATH" +cd wrapper/Ada +gprclean +gprbuild default.gpr +gprbuild client.gpr + +cd obj/ +./tls_server_main & +./tls_client_main 127.0.0.1 +``` + +On Windows, build the executables with: +```sh +gprbuild -XOS=Windows default.gpr +gprbuild -XOS=Windows client.gpr +``` + + +### GNAT FSF Compiler and GPRBuild manual installation +In May 2022 AdaCore announced the end of the GNAT Community releases. +Pre-built binaries for the GNAT FSF compiler and GPRBuild can be +downloaded and manually installed from here: +https://github.com/alire-project/GNAT-FSF-builds/releases +Make sure the executables for the compiler and GPRBuild are on the PATH +and use gprbuild to build the source code. + +## Files +The (D)TLS v1.3 client example in the Ada/SPARK programming language +using the WolfSSL library can be found in the files: +tls_client_main.adb +tls_client.ads +tls_client.adb + +The (D)TLS v1.3 server example in the Ada/SPARK programming language +using the WolfSSL library can be found in the files: +tls_server_main.adb +tls_server.ads +tls_server.adb + +A feature of the Ada language that is not part of SPARK is exceptions. +Some packages of the Ada standard library and GNAT specific packages +provided by the GNAT compiler can therefore not be used directly but +need to be put into wrapper packages that does not raise exceptions. +The packages that provide access to sockets and command line arguments +to applications implemented in the SPARK programming language can be +found in the files: +spark_sockets.ads +spark_sockets.adb +spark_terminal.ads +spark_terminal.adb diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/ada_binding.c mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/ada_binding.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/ada_binding.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/ada_binding.c 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,105 @@ +/* ada_binding.c + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +/* wolfSSL */ +#include +#include + +/* These functions give access to the integer values of the enumeration + constants used in WolfSSL. These functions make it possible + for the WolfSSL implementation to change the values of the constants + without the need to make a corresponding change in the Ada code. */ +extern int get_wolfssl_error_want_read(void); +extern int get_wolfssl_error_want_write(void); +extern int get_wolfssl_max_error_size (void); +extern int get_wolfssl_success(void); +extern int get_wolfssl_failure(void); +extern int get_wolfssl_verify_none(void); +extern int get_wolfssl_verify_peer(void); +extern int get_wolfssl_verify_fail_if_no_peer_cert(void); +extern int get_wolfssl_verify_client_once(void); +extern int get_wolfssl_verify_post_handshake(void); +extern int get_wolfssl_verify_fail_except_psk(void); +extern int get_wolfssl_verify_default(void); + +extern int get_wolfssl_filetype_asn1(void); +extern int get_wolfssl_filetype_pem(void); +extern int get_wolfssl_filetype_default(void); + +extern int get_wolfssl_error_want_read(void) { + return WOLFSSL_ERROR_WANT_READ; +} + +extern int get_wolfssl_error_want_write(void) { + return WOLFSSL_ERROR_WANT_WRITE; +} + +extern int get_wolfssl_max_error_size(void) { + return WOLFSSL_MAX_ERROR_SZ; +} + +extern int get_wolfssl_success(void) { + return WOLFSSL_SUCCESS; +} + +extern int get_wolfssl_failure(void) { + return WOLFSSL_FAILURE; +} + +extern int get_wolfssl_verify_none(void) { + return WOLFSSL_VERIFY_NONE; +} + +extern int get_wolfssl_verify_peer(void) { + return WOLFSSL_VERIFY_PEER; +} + +extern int get_wolfssl_verify_fail_if_no_peer_cert(void) { + return WOLFSSL_VERIFY_FAIL_IF_NO_PEER_CERT; +} + +extern int get_wolfssl_verify_client_once(void) { + return WOLFSSL_VERIFY_CLIENT_ONCE; +} + +extern int get_wolfssl_verify_post_handshake(void) { + return WOLFSSL_VERIFY_POST_HANDSHAKE; +} + +extern int get_wolfssl_verify_fail_except_psk(void) { + return WOLFSSL_VERIFY_FAIL_EXCEPT_PSK; +} + +extern int get_wolfssl_verify_default(void) { + return WOLFSSL_VERIFY_DEFAULT; +} + +extern int get_wolfssl_filetype_asn1(void) { + return WOLFSSL_FILETYPE_ASN1; +} + +extern int get_wolfssl_filetype_pem(void) { + return WOLFSSL_FILETYPE_PEM; +} + +extern int get_wolfssl_filetype_default(void) { + return WOLFSSL_FILETYPE_DEFAULT; +} diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/client.gpr mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/client.gpr --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/client.gpr 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/client.gpr 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,78 @@ +project Client is + type OS_Kind is ("Windows", "Linux_Or_Mac"); + + OS : OS_Kind := external ("OS", "Linux_Or_Mac"); + + for Languages use ("C", "Ada"); + + for Source_Dirs use (".", + "../../", + "../../src", + "../../wolfcrypt/src"); + + for Object_Dir use "obj"; + + for Main use ("tls_client_main.adb"); + + package Naming is + for Spec_Suffix ("C") use ".h"; + end Naming; + + package Compiler is + for Switches ("C") use + ("-DWOLFSSL_USER_SETTINGS", -- Use the user_settings.h file. + "-Wno-pragmas", + "-Wall", + "-Wextra", + "-Wunknown-pragmas", + "--param=ssp-buffer-size=1", + "-Waddress", + "-Warray-bounds", + "-Wbad-function-cast", + "-Wchar-subscripts", + "-Wcomment", + "-Wfloat-equal", + "-Wformat-security", + "-Wformat=2", + "-Wmaybe-uninitialized", + "-Wmissing-field-initializers", + "-Wmissing-noreturn", + "-Wmissing-prototypes", + "-Wnested-externs", + "-Wnormalized=id", + "-Woverride-init", + "-Wpointer-arith", + "-Wpointer-sign", + "-Wshadow", + "-Wsign-compare", + "-Wstrict-overflow=1", + "-Wstrict-prototypes", + "-Wswitch-enum", + "-Wundef", + "-Wunused", + "-Wunused-result", + "-Wunused-variable", + "-Wwrite-strings", + "-fwrapv"); + + for Switches ("Ada") use ("-g"); + end Compiler; + + package Linker is + case OS is + when "Windows" => + for Switches ("Ada") use + ("-lm", -- To include the math library (used by WolfSSL). + "-lcrypt32"); -- Needed on Windows. + + when "Linux_Or_Mac" => + for Switches ("Ada") use + ("-lm"); -- To include the math library (used by WolfSSL). + end case; + end Linker; + + package Binder is + for Switches ("Ada") use ("-Es"); -- To include stack traces. + end Binder; + +end Client; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/default.gpr mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/default.gpr --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/default.gpr 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/default.gpr 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,86 @@ +project Default is + + type OS_Kind is ("Windows", "Linux_Or_Mac"); + + OS : OS_Kind := external ("OS", "Linux_Or_Mac"); + + for Languages use ("C", "Ada"); + + for Source_Dirs use (".", + "../../", + "../../src", + "../../wolfcrypt/src"); + + -- Don't build the tls client application because it makes use + -- of the Secondary Stack due to usage of the Ada.Command_Line + -- package. All other Ada source code does not use the secondary stack. + for Excluded_Source_Files use ("tls_client_main.adb", + "tls_client.ads", + "tls_client.adb"); + + for Object_Dir use "obj"; + + for Main use ("tls_server_main.adb"); + + package Naming is + for Spec_Suffix ("C") use ".h"; + end Naming; + + package Compiler is + for Switches ("C") use + ("-DWOLFSSL_USER_SETTINGS", -- Use the user_settings.h file. + "-Wno-pragmas", + "-Wall", + "-Wextra", + "-Wunknown-pragmas", + "--param=ssp-buffer-size=1", + "-Waddress", + "-Warray-bounds", + "-Wbad-function-cast", + "-Wchar-subscripts", + "-Wcomment", + "-Wfloat-equal", + "-Wformat-security", + "-Wformat=2", + "-Wmaybe-uninitialized", + "-Wmissing-field-initializers", + "-Wmissing-noreturn", + "-Wmissing-prototypes", + "-Wnested-externs", + "-Wnormalized=id", + "-Woverride-init", + "-Wpointer-arith", + "-Wpointer-sign", + "-Wshadow", + "-Wsign-compare", + "-Wstrict-overflow=1", + "-Wstrict-prototypes", + "-Wswitch-enum", + "-Wundef", + "-Wunused", + "-Wunused-result", + "-Wunused-variable", + "-Wwrite-strings", + "-fwrapv"); + + for Switches ("Ada") use ("-g"); + end Compiler; + + package Linker is + case OS is + when "Windows" => + for Switches ("Ada") use + ("-lm", -- To include the math library (used by WolfSSL). + "-lcrypt32"); -- Needed on Windows. + + when "Linux_Or_Mac" => + for Switches ("Ada") use + ("-lm"); -- To include the math library (used by WolfSSL). + end case; + end Linker; + + package Binder is + for Switches ("Ada") use ("-Es"); -- To include stack traces. + end Binder; + +end Default; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/gnat.adc mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/gnat.adc --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/gnat.adc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/gnat.adc 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1 @@ +pragma Restrictions (No_Secondary_Stack); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/include.am 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/include.am 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,17 @@ +# vim:ft=automake +# included from Top Level Makefile.am +# All paths should be given relative to the root + +EXTRA_DIST+= wrapper/Ada/README.md +EXTRA_DIST+= wrapper/Ada/default.gpr +EXTRA_DIST+= wrapper/Ada/gnat.adc +EXTRA_DIST+= wrapper/Ada/ada_binding.c +EXTRA_DIST+= wrapper/Ada/tls_client_main.adb +EXTRA_DIST+= wrapper/Ada/tls_client.adb +EXTRA_DIST+= wrapper/Ada/tls_client.ads +EXTRA_DIST+= wrapper/Ada/tls_server_main.adb +EXTRA_DIST+= wrapper/Ada/tls_server.adb +EXTRA_DIST+= wrapper/Ada/tls_server.ads +EXTRA_DIST+= wrapper/Ada/user_settings.h +EXTRA_DIST+= wrapper/Ada/wolfssl.adb +EXTRA_DIST+= wrapper/Ada/wolfssl.ads diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.adb mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.adb --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.adb 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.adb 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,174 @@ +-- spark_sockets.adb +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +with Ada.Streams; +with Interfaces.C; + +package body SPARK_Sockets is + + function Inet_Addr (Image : String) return Optional_Inet_Addr is + A : Inet_Addr_Type; + begin + A := GNAT.Sockets.Inet_Addr (Image); + return (Exists => True, Addr => A); + exception + when others => + return (Exists => False); + end Inet_Addr; + + procedure Create_Socket + (Socket : in out Optional_Socket; + Family : GNAT.Sockets.Family_Type; + Mode : GNAT.Sockets.Mode_Type) is + S : Socket_Type; + begin + GNAT.Sockets.Create_Socket (S, Family, Mode); + Socket := (Exists => True, Socket => S); + exception + when others => + Socket := (Exists => False); + end Create_Socket; + + procedure Create_Stream_Socket (Socket : in out Optional_Socket) is + begin + Create_Socket + (Socket => Socket, + Family => GNAT.Sockets.Family_Inet, + Mode => GNAT.Sockets.Socket_Stream); + end Create_Stream_Socket; + + procedure Create_Datagram_Socket (Socket : in out Optional_Socket) is + begin + Create_Socket + (Socket => Socket, + Family => GNAT.Sockets.Family_Inet, + Mode => GNAT.Sockets.Socket_Datagram); + end Create_Datagram_Socket; + + function Connect_Socket (Socket : Socket_Type; + Server : Sock_Addr_Type) + return Subprogram_Result is + begin + GNAT.Sockets.Connect_Socket (Socket, Server); + return Success; + exception + when others => + return Failure; + end Connect_Socket; + + function To_C (Socket : Socket_Type) return Integer is + begin + -- The call to GNAT.Sockets.To_C can never raise an exception. + return GNAT.Sockets.To_C (Socket); + end To_C; + + procedure Close_Socket (Socket : in out Optional_Socket) is + begin + GNAT.Sockets.Close_Socket (Socket.Socket); + Socket := (Exists => False); + end Close_Socket; + + function Set_Socket_Option (Socket : Socket_Type; + Level : Level_Type; + Option : Option_Type) + return Subprogram_Result is + begin + GNAT.Sockets.Set_Socket_Option (Socket, Level, Option); + return Success; + exception + when others => + return Failure; + end Set_Socket_Option; + + function Bind_Socket (Socket : Socket_Type; + Address : Sock_Addr_Type) + return Subprogram_Result is + begin + GNAT.Sockets.Bind_Socket (Socket, Address); + return Success; + exception + when others => + return Failure; + end Bind_Socket; + + function Listen_Socket (Socket : Socket_Type; + Length : Natural) return Subprogram_Result is + begin + GNAT.Sockets.Listen_Socket (Socket, Length); + return Success; + exception + when others => + return Failure; + end Listen_Socket; + + function Receive_Socket + (Socket : Socket_Type) + return Subprogram_Result is + + Item : Ada.Streams.Stream_Element_Array (1 .. 4096); + Last : Ada.Streams.Stream_Element_Offset; + From : GNAT.Sockets.Sock_Addr_Type; + + begin + GNAT.Sockets.Receive_Socket (Socket, Item, Last, From); + return Success; + exception + when others => + return Failure; + end Receive_Socket; + + procedure Accept_Socket (Server : Socket_Type; + Socket : out Optional_Socket; + Address : out Sock_Addr_Type; + Result : out Subprogram_Result) is + C : Socket_Type; + begin + GNAT.Sockets.Accept_Socket (Server, C, Address); + Socket := (Exists => True, Socket => C); + Result := Success; + exception + when others => + Socket := (Exists => False); + Address := (Family => GNAT.Sockets.Family_Unspec); + Result := Failure; + end Accept_Socket; + + procedure To_C (Item : String; + Target : out Byte_Array; + Count : out Byte_Index) is + begin + Interfaces.C.To_C (Item => Item, + Target => Target, + Count => Count, + Append_Nul => False); + end To_C; + + procedure To_Ada (Item : Byte_Array; + Target : out String; + Count : out Natural) is + begin + Interfaces.C.To_Ada (Item => Item, + Target => Target, + Count => Count, + Trim_Nul => False); + end To_Ada; + +end SPARK_Sockets; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.ads mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.ads --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.ads 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_sockets.ads 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,142 @@ +-- spark_sockets.ads +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +-- GNAT Library packages. +with GNAT.Sockets; + +-- The WolfSSL package. +with WolfSSL; + +-- This is a wrapper package around the GNAT.Sockets package. +-- GNAT.Sockets raises exceptions to signal errors but exceptions +-- are not supported by SPARK. This package converts raised exceptions +-- into returned enumeration values by functions indicating success +-- or failure. +-- +-- The intended use of this package is to demonstrate the usage +-- of the WolfSSL Ada binding in Ada/SPARK code. +package SPARK_Sockets with SPARK_Mode is + + subtype Byte_Array is WolfSSL.Byte_Array; + subtype Byte_Index is WolfSSL.Byte_Index; use type Byte_Index; + + subtype Port_Type is GNAT.Sockets.Port_Type; + + subtype Level_Type is GNAT.Sockets.Level_Type; + + subtype Socket_Type is GNAT.Sockets.Socket_Type; + subtype Option_Name is GNAT.Sockets.Option_Name; + subtype Option_Type is GNAT.Sockets.Option_Type; + subtype Family_Type is GNAT.Sockets.Family_Type; + + subtype Sock_Addr_Type is GNAT.Sockets.Sock_Addr_Type; + subtype Inet_Addr_Type is GNAT.Sockets.Inet_Addr_Type; + + Socket_Error : exception renames GNAT.Sockets.Socket_Error; + + Reuse_Address : Option_Name renames GNAT.Sockets.Reuse_Address; + + Socket_Level : Level_Type renames GNAT.Sockets.Socket_Level; + + Family_Inet : Family_Type renames GNAT.Sockets.Family_Inet; + use type GNAT.Sockets.Family_Type; + + Any_Inet_Addr : Inet_Addr_Type renames GNAT.Sockets.Any_Inet_Addr; + + subtype Subprogram_Result is WolfSSL.Subprogram_Result; + use type Subprogram_Result; + + Success : Subprogram_Result renames WolfSSL.Success; + Failure : Subprogram_Result renames WolfSSL.Failure; + + type Optional_Inet_Addr (Exists : Boolean := False) is record + case Exists is + when True => Addr : Inet_Addr_Type; + when False => null; + end case; + end record; + + function Inet_Addr (Image : String) return Optional_Inet_Addr; + + type Optional_Socket (Exists : Boolean := False) is record + case Exists is + when True => Socket : Socket_Type; + when False => null; + end case; + end record; + + procedure Create_Stream_Socket (Socket : in out Optional_Socket) with + Pre => not Socket.Exists; + + procedure Create_Datagram_Socket (Socket : in out Optional_Socket) with + Pre => not Socket.Exists; + + function Connect_Socket (Socket : Socket_Type; + Server : Sock_Addr_Type) + return Subprogram_Result; + + function To_C (Socket : Socket_Type) return Integer with Inline; + + -- Close a socket and more specifically a non-connected socket. + procedure Close_Socket (Socket : in out Optional_Socket) with + Pre => Socket.Exists, + Post => not Socket.Exists; + + function Set_Socket_Option (Socket : Socket_Type; + Level : Level_Type; + Option : Option_Type) + return Subprogram_Result; + -- Manipulate socket options. + + function Bind_Socket (Socket : Socket_Type; + Address : Sock_Addr_Type) + return Subprogram_Result; + + function Listen_Socket (Socket : Socket_Type; + Length : Natural) return Subprogram_Result; + -- To accept connections, a socket is first created with + -- Create_Socket, a willingness to accept incoming connections and + -- a queue Length for incoming connections are specified. + -- The queue length of 15 is an example value that should be + -- appropriate in usual cases. It can be adjusted according to each + -- application's particular requirements. + + function Receive_Socket (Socket : Socket_Type) return Subprogram_Result; + + procedure Accept_Socket (Server : Socket_Type; + Socket : out Optional_Socket; + Address : out Sock_Addr_Type; + Result : out Subprogram_Result) with + Post => (if Result = Success then Socket.Exists else not Socket.Exists); + + procedure To_C (Item : String; + Target : out Byte_Array; + Count : out Byte_Index) with + Pre => Item'Length <= Target'Length, + Post => Count <= Target'Last; + + procedure To_Ada (Item : Byte_Array; + Target : out String; + Count : out Natural) with + Pre => Item'Length <= Target'Length, + Post => Count <= Target'Last; + +end SPARK_Sockets; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.adb mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.adb --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.adb 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.adb 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,18 @@ +package body SPARK_Terminal is + + procedure Set_Exit_Status (Status : Exit_Status) is + begin + Ada.Command_Line.Set_Exit_Status (Status); + end Set_Exit_Status; + + function Argument_Count return Natural is + begin + return Ada.Command_Line.Argument_Count; + end Argument_Count; + + function Argument (Number : Positive) return String is + begin + return Ada.Command_Line.Argument (Number); + end Argument; + +end SPARK_Terminal; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.ads mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.ads --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.ads 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/spark_terminal.ads 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,43 @@ +-- spark_sockets.ads +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +with Ada.Command_Line; + +-- SPARK wrapper package around Ada.Command_Line and Interfaces.C +-- packages because these packages lack contracts in their specification +-- files that SPARK can use to verify the context in which +-- subprograms can safely be called. +package SPARK_Terminal with SPARK_Mode is + + subtype Exit_Status is Ada.Command_Line.Exit_Status; + + Exit_Status_Success : Exit_Status renames Ada.Command_Line.Success; + Exit_Status_Failure : Exit_Status renames Ada.Command_Line.Failure; + + procedure Set_Exit_Status (Status : Exit_Status) with + Global => null; + + function Argument_Count return Natural; + + function Argument (Number : Positive) return String with + Pre => Number <= Argument_Count; + +end SPARK_Terminal; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.adb mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.adb --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.adb 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.adb 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,376 @@ +-- tls_client.adb +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +-- Ada Standard Library packages. +with Ada.Characters.Handling; +with Ada.Strings.Bounded; +with Ada.Text_IO; +with Interfaces.C; + +with SPARK_Terminal; + +package body Tls_Client with SPARK_Mode is + + use type WolfSSL.Mode_Type; + use type WolfSSL.Byte_Index; + use type WolfSSL.Byte_Array; + use type WolfSSL.Subprogram_Result; + + subtype Byte_Index is WolfSSL.Byte_Index; + + Success : WolfSSL.Subprogram_Result renames WolfSSL.Success; + + subtype Byte_Type is WolfSSL.Byte_Type; + + package Natural_IO is new Ada.Text_IO.Integer_IO (Natural); + + procedure Put (Text : String) is + begin + Ada.Text_IO.Put (Text); + end Put; + + procedure Put (Number : Natural) + with + Annotate => (GNATprove, Might_Not_Return) + is + begin + Natural_IO.Put (Item => Number, Width => 0, Base => 10); + end Put; + + procedure Put (Number : Byte_Index) + with + Annotate => (GNATprove, Might_Not_Return) + is + begin + Natural_IO.Put (Item => Natural (Number), Width => 0, Base => 10); + end Put; + + procedure Put_Line (Text : String) is + begin + Ada.Text_IO.Put_Line (Text); + end Put_Line; + + procedure New_Line is + begin + Ada.Text_IO.New_Line; + end New_Line; + + subtype Exit_Status is SPARK_Terminal.Exit_Status; + + Exit_Status_Success : Exit_Status renames SPARK_Terminal.Exit_Status_Success; + Exit_Status_Failure : Exit_Status renames SPARK_Terminal.Exit_Status_Failure; + + procedure Set (Status : Exit_Status) with Global => null is + begin + SPARK_Terminal.Set_Exit_Status (Status); + end Set; + + subtype Port_Type is SPARK_Sockets.Port_Type; + + subtype Level_Type is SPARK_Sockets.Level_Type; + + subtype Socket_Type is SPARK_Sockets.Socket_Type; + subtype Option_Name is SPARK_Sockets.Option_Name; + subtype Option_Type is SPARK_Sockets.Option_Type; + subtype Family_Type is SPARK_Sockets.Family_Type; + + subtype Sock_Addr_Type is SPARK_Sockets.Sock_Addr_Type; + subtype Inet_Addr_Type is SPARK_Sockets.Inet_Addr_Type; + + use type Family_Type; + + Socket_Error : exception renames SPARK_Sockets.Socket_Error; + + Reuse_Address : Option_Name renames SPARK_Sockets.Reuse_Address; + + Socket_Level : Level_Type renames SPARK_Sockets.Socket_Level; + + Family_Inet : Family_Type renames SPARK_Sockets.Family_Inet; + + Any_Inet_Addr : Inet_Addr_Type renames SPARK_Sockets.Any_Inet_Addr; + + CERT_FILE : constant String := "../../../certs/client-cert.pem"; + KEY_FILE : constant String := "../../../certs/client-key.pem"; + CA_FILE : constant String := "../../../certs/ca-cert.pem"; + + subtype Byte_Array is WolfSSL.Byte_Array; + + function Argument_Count return Natural renames + SPARK_Terminal.Argument_Count; + + function Argument (Number : Positive) return String with + Pre => Number <= Argument_Count; + + function Argument (Number : Positive) return String is + begin + return SPARK_Terminal.Argument (Number); + end Argument; + + procedure Run (Ssl : in out WolfSSL.WolfSSL_Type; + Ctx : in out WolfSSL.Context_Type; + Client : in out SPARK_Sockets.Optional_Socket) is + A : Sock_Addr_Type; + C : SPARK_Sockets.Optional_Socket renames Client; + D : Byte_Array (1 .. 200); + P : constant Port_Type := 11111; + + Addr : SPARK_Sockets.Optional_Inet_Addr; + + Count : WolfSSL.Byte_Index; + + Text : String (1 .. 200); + Last : Natural; + + Input : WolfSSL.Read_Result; + Output : WolfSSL.Write_Result; + + Result : WolfSSL.Subprogram_Result; + DTLS : Boolean; + begin + Result := WolfSSL.Initialize; + if Result /= Success then + Put_Line ("ERROR: Failed to initialize the WolfSSL library."); + return; + end if; + + if Argument_Count < 1 + or Argument_Count > 2 + or (Argument_Count = 2 and then Argument (2) /= "--dtls") + then + Put_Line ("usage: tls_client_main [--dtls]"); + return; + end if; + + DTLS := (SPARK_Terminal.Argument_Count = 2); + + if DTLS then + SPARK_Sockets.Create_Datagram_Socket (C); + else + SPARK_Sockets.Create_Stream_Socket (C); + end if; + + if not C.Exists then + declare + Mode : constant String := (if DTLS then "datagram" else "stream"); + begin + Put_Line ("ERROR: Failed to create " & Mode & " socket."); + return; + end; + end if; + + Addr := SPARK_Sockets.Inet_Addr (Argument (1)); + if not Addr.Exists or + (Addr.Exists and then Addr.Addr.Family /= Family_Inet) + then + Put_Line ("ERROR: please specify IPv4 address."); + SPARK_Sockets.Close_Socket (C); + Set (Exit_Status_Failure); + return; + end if; + A := (Family => Family_Inet, + Addr => Addr.Addr, + Port => P); + + if not DTLS then + Result := SPARK_Sockets.Connect_Socket (Socket => C.Socket, + Server => A); + if Result /= Success then + Put_Line ("ERROR: Failed to connect to server."); + SPARK_Sockets.Close_Socket (C); + Set (Exit_Status_Failure); + return; + end if; + end if; + + -- Create and initialize WOLFSSL_CTX. + WolfSSL.Create_Context + (Method => + (if DTLS then + WolfSSL.DTLSv1_3_Client_Method + else + WolfSSL.TLSv1_3_Client_Method), + Context => Ctx); + + if not WolfSSL.Is_Valid (Ctx) then + Put_Line ("ERROR: failed to create WOLFSSL_CTX."); + SPARK_Sockets.Close_Socket (C); + Set (Exit_Status_Failure); + return; + end if; + + -- Require mutual authentication. + WolfSSL.Set_Verify + (Context => Ctx, + Mode => WolfSSL.Verify_Peer & WolfSSL.Verify_Fail_If_No_Peer_Cert); + + -- Load client certificate into WOLFSSL_CTX. + Result := WolfSSL.Use_Certificate_File (Context => Ctx, + File => CERT_FILE, + Format => WolfSSL.Format_Pem); + if Result /= Success then + Put ("ERROR: failed to load "); + Put (CERT_FILE); + Put (", please check the file."); + New_Line; + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Load client key into WOLFSSL_CTX. + Result := WolfSSL.Use_Private_Key_File (Context => Ctx, + File => KEY_FILE, + Format => WolfSSL.Format_Pem); + if Result /= Success then + Put ("ERROR: failed to load "); + Put (KEY_FILE); + Put (", please check the file."); + New_Line; + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Load CA certificate into WOLFSSL_CTX. + Result := WolfSSL.Load_Verify_Locations (Context => Ctx, + File => CA_FILE, + Path => ""); + if Result /= Success then + Put ("ERROR: failed to load "); + Put (CA_FILE); + Put (", please check the file."); + New_Line; + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Create a WOLFSSL object. + WolfSSL.Create_WolfSSL (Context => Ctx, Ssl => Ssl); + if not WolfSSL.Is_Valid (Ssl) then + Put_Line ("ERROR: failed to create WOLFSSL object."); + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + if DTLS then + Result := WolfSSL.DTLS_Set_Peer(Ssl => Ssl, + Address => A); + if Result /= Success then + Put_Line ("ERROR: Failed to set the DTLS peer."); + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Ssl); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + end if; + + -- Attach wolfSSL to the socket. + Result := WolfSSL.Attach (Ssl => Ssl, + Socket => SPARK_Sockets.To_C (C.Socket)); + if Result /= Success then + Put_Line ("ERROR: Failed to set the file descriptor."); + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Ssl); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + Result := WolfSSL.Connect (Ssl); + if Result /= Success then + Put_Line ("ERROR: failed to connect to wolfSSL."); + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Ssl); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + Put ("Message for server: "); + Ada.Text_IO.Get_Line (Text, Last); + + SPARK_Sockets.To_C (Item => Text (1 .. Last), + Target => D, + Count => Count); + Output := WolfSSL.Write (Ssl => Ssl, + Data => D (1 .. Count)); + if not Output.Success then + Put ("ERROR: write failure"); + New_Line; + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Ssl); + WolfSSL.Free (Context => Ctx); + return; + end if; + + if Natural (Output.Bytes_Written) < Last then + Put ("ERROR: failed to write entire message"); + New_Line; + Put (Output.Bytes_Written); + Put (" bytes of "); + Put (Last); + Put ("bytes were sent"); + New_Line; + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Ssl); + WolfSSL.Free (Context => Ctx); + return; + end if; + + Input := WolfSSL.Read (Ssl); + if not Input.Success then + Put_Line ("Read error."); + Set (Exit_Status_Failure); + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Ssl); + WolfSSL.Free (Context => Ctx); + return; + end if; + if Input.Buffer'Length > Text'Length then + SPARK_Sockets.To_Ada (Item => Input.Buffer (1 .. 200), + Target => Text, + Count => Last); + else + SPARK_Sockets.To_Ada (Item => Input.Buffer, + Target => Text, + Count => Last); + end if; + Put ("Server: "); + Put (Text (1 .. Last)); + New_Line; + + SPARK_Sockets.Close_Socket (C); + WolfSSL.Free (Ssl); + WolfSSL.Free (Context => Ctx); + Result := WolfSSL.Finalize; + if Result /= Success then + Put_Line ("ERROR: Failed to finalize the WolfSSL library."); + end if; + end Run; + +end Tls_Client; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.ads mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.ads --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.ads 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client.ads 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,38 @@ +-- tls_client.ads +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +-- The WolfSSL package. +with WolfSSL; pragma Elaborate_All (WolfSSL); + +with SPARK_Sockets; pragma Elaborate_All (SPARK_Sockets); + +package Tls_Client with SPARK_Mode is + + procedure Run (Ssl : in out WolfSSL.WolfSSL_Type; + Ctx : in out WolfSSL.Context_Type; + Client : in out SPARK_Sockets.Optional_Socket) with + Pre => (not Client.Exists and not + WolfSSL.Is_Valid (Ssl) and not WolfSSL.Is_Valid (Ctx)), + Post => (not Client.Exists and not WolfSSL.Is_Valid (Ssl) and + not WolfSSL.Is_Valid (Ctx)), + Annotate => (GNATprove, Might_Not_Return); + +end Tls_Client; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_client_main.adb mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client_main.adb --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_client_main.adb 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_client_main.adb 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,33 @@ +-- tls_client_main.adb +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +with Tls_Client; pragma Elaborate_All (Tls_Client); +with SPARK_Sockets; pragma Elaborate_All (SPARK_Sockets); +with WolfSSL; pragma Elaborate_All (WolfSSL); +-- Application entry point for the Ada translation of the +-- tls client v1.3 example in C. +procedure Tls_Client_Main is + Ssl : WolfSSL.WolfSSL_Type; + Ctx : WolfSSL.Context_Type; + C : SPARK_Sockets.Optional_Socket; +begin + Tls_Client.Run (Ssl, Ctx, Client => C); +end Tls_Client_Main; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.adb mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.adb --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.adb 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.adb 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,393 @@ +-- tls_server.adb +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +-- Ada Standard Library packages. +with Ada.Characters.Handling; +with Ada.Strings.Bounded; +with Ada.Text_IO.Bounded_IO; + +with SPARK_Terminal; pragma Elaborate_All (SPARK_Terminal); + +package body Tls_Server with SPARK_Mode is + + use type WolfSSL.Mode_Type; + use type WolfSSL.Byte_Index; + use type WolfSSL.Byte_Array; + use type WolfSSL.Subprogram_Result; + + Success : WolfSSL.Subprogram_Result renames WolfSSL.Success; + + procedure Put (Char : Character) is + begin + Ada.Text_IO.Put (Char); + end Put; + + procedure Put (Text : String) is + begin + Ada.Text_IO.Put (Text); + end Put; + + procedure Put_Line (Text : String) is + begin + Ada.Text_IO.Put_Line (Text); + end Put_Line; + + procedure New_Line is + begin + Ada.Text_IO.New_Line; + end New_Line; + + subtype Exit_Status is SPARK_Terminal.Exit_Status; + + Exit_Status_Success : Exit_Status renames SPARK_Terminal.Exit_Status_Success; + Exit_Status_Failure : Exit_Status renames SPARK_Terminal.Exit_Status_Failure; + + procedure Set (Status : Exit_Status) with Global => null is + begin + SPARK_Terminal.Set_Exit_Status (Status); + end Set; + + subtype Port_Type is SPARK_Sockets.Port_Type; + + subtype Level_Type is SPARK_Sockets.Level_Type; + + subtype Socket_Type is SPARK_Sockets.Socket_Type; + subtype Option_Name is SPARK_Sockets.Option_Name; + subtype Option_Type is SPARK_Sockets.Option_Type; + subtype Family_Type is SPARK_Sockets.Family_Type; + + subtype Sock_Addr_Type is SPARK_Sockets.Sock_Addr_Type; + subtype Inet_Addr_Type is SPARK_Sockets.Inet_Addr_Type; + + Socket_Error : exception renames SPARK_Sockets.Socket_Error; + + Reuse_Address : Option_Name renames SPARK_Sockets.Reuse_Address; + + Socket_Level : Level_Type renames SPARK_Sockets.Socket_Level; + + Family_Inet : Family_Type renames SPARK_Sockets.Family_Inet; + + Any_Inet_Addr : Inet_Addr_Type renames SPARK_Sockets.Any_Inet_Addr; + + CERT_FILE : constant String := "../../../certs/server-cert.pem"; + KEY_FILE : constant String := "../../../certs/server-key.pem"; + CA_FILE : constant String := "../../../certs/client-cert.pem"; + + subtype Byte_Array is WolfSSL.Byte_Array; + + Reply : constant Byte_Array := "I hear ya fa shizzle!"; + + procedure Run (Ssl : in out WolfSSL.WolfSSL_Type; + Ctx : in out WolfSSL.Context_Type; + L : in out SPARK_Sockets.Optional_Socket; + C : in out SPARK_Sockets.Optional_Socket) is + A : Sock_Addr_Type; + P : constant Port_Type := 11111; + + Ch : Character; + + Result : WolfSSL.Subprogram_Result; + DTLS : Boolean; + Shall_Continue : Boolean := True; + + Input : WolfSSL.Read_Result; + Output : WolfSSL.Write_Result; + Option : Option_Type; + begin + Result := WolfSSL.Initialize; + if Result /= Success then + Put_Line ("ERROR: Failed to initialize the WolfSSL library."); + return; + end if; + + if SPARK_Terminal.Argument_Count > 1 + or (SPARK_Terminal.Argument_Count = 1 + and then SPARK_Terminal.Argument (1) /= "--dtls") + then + Put_Line ("usage: tls_server_main [--dtls]"); + return; + end if; + + DTLS := (SPARK_Terminal.Argument_Count = 1); + + if DTLS then + SPARK_Sockets.Create_Datagram_Socket (Socket => L); + else + SPARK_Sockets.Create_Stream_Socket (Socket => L); + end if; + + if not L.Exists then + declare + Mode : constant String := (if DTLS then "datagram" else "stream"); + begin + Put_Line ("ERROR: Failed to create " & Mode & " socket."); + return; + end; + end if; + + Option := (Name => Reuse_Address, Enabled => True); + Result := SPARK_Sockets.Set_Socket_Option (Socket => L.Socket, + Level => Socket_Level, + Option => Option); + if Result /= Success then + Put_Line ("ERROR: Failed to set socket option."); + SPARK_Sockets.Close_Socket (L); + return; + end if; + + A := (Family => Family_Inet, + Addr => Any_Inet_Addr, + Port => P); + Result := SPARK_Sockets.Bind_Socket (Socket => L.Socket, + Address => A); + if Result /= Success then + Put_Line ("ERROR: Failed to bind socket."); + SPARK_Sockets.Close_Socket (L); + return; + end if; + + if DTLS then + Result := SPARK_Sockets.Receive_Socket (Socket => L.Socket); + else + Result := SPARK_Sockets.Listen_Socket (Socket => L.Socket, + Length => 5); + end if; + + if Result /= Success then + declare + Operation : constant String := (if DTLS then "receiver" else "listener"); + begin + Put_Line ("ERROR: Failed to configure " & Operation & " socket."); + SPARK_Sockets.Close_Socket (L); + return; + end; + end if; + + -- Create and initialize WOLFSSL_CTX. + WolfSSL.Create_Context + (Method => + (if DTLS then + WolfSSL.DTLSv1_3_Server_Method + else + WolfSSL.TLSv1_3_Server_Method), + Context => Ctx); + + if not WolfSSL.Is_Valid (Ctx) then + Put_Line ("ERROR: failed to create WOLFSSL_CTX."); + SPARK_Sockets.Close_Socket (L); + Set (Exit_Status_Failure); + return; + end if; + + -- Require mutual authentication. + WolfSSL.Set_Verify + (Context => Ctx, + Mode => WolfSSL.Verify_Peer & WolfSSL.Verify_Fail_If_No_Peer_Cert); + + -- Load server certificates into WOLFSSL_CTX. + Result := WolfSSL.Use_Certificate_File (Context => Ctx, + File => CERT_FILE, + Format => WolfSSL.Format_Pem); + if Result /= Success then + Put ("ERROR: failed to load "); + Put (CERT_FILE); + Put (", please check the file."); + New_Line; + SPARK_Sockets.Close_Socket (L); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Load server key into WOLFSSL_CTX. + Result := WolfSSL.Use_Private_Key_File (Context => Ctx, + File => KEY_FILE, + Format => WolfSSL.Format_Pem); + if Result /= Success then + Put ("ERROR: failed to load "); + Put (KEY_FILE); + Put (", please check the file."); + New_Line; + SPARK_Sockets.Close_Socket (L); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Load client certificate as "trusted" into WOLFSSL_CTX. + Result := WolfSSL.Load_Verify_Locations (Context => Ctx, + File => CA_FILE, + Path => ""); + if Result /= Success then + Put ("ERROR: failed to load "); + Put (CA_FILE); + Put (", please check the file."); + New_Line; + SPARK_Sockets.Close_Socket (L); + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + while Shall_Continue loop + pragma Loop_Invariant (not C.Exists); + pragma Loop_Invariant (not WolfSSL.Is_Valid (Ssl)); + pragma Loop_Invariant (WolfSSL.Is_Valid (Ctx)); + + if not DTLS then + Put_Line ("Waiting for a connection..."); + SPARK_Sockets.Accept_Socket (Server => L.Socket, + Socket => C, + Address => A, + Result => Result); + if Result /= Success then + Put_Line ("ERROR: failed to accept the connection."); + SPARK_Sockets.Close_Socket (L); + WolfSSL.Free (Context => Ctx); + return; + end if; + end if; + + -- Create a WOLFSSL object. + WolfSSL.Create_WolfSSL (Context => Ctx, Ssl => Ssl); + if not WolfSSL.Is_Valid (Ssl) then + Put_Line ("ERROR: failed to create WOLFSSL object."); + SPARK_Sockets.Close_Socket (L); + + if not DTLS then + SPARK_Sockets.Close_Socket (C); + end if; + + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Attach wolfSSL to the socket. + Result := WolfSSL.Attach + (Ssl => Ssl, + Socket => SPARK_Sockets.To_C (if DTLS then L.Socket else C.Socket)); + if Result /= Success then + Put_Line ("ERROR: Failed to set the file descriptor."); + WolfSSL.Free (Ssl); + SPARK_Sockets.Close_Socket (L); + + if not DTLS then + SPARK_Sockets.Close_Socket (C); + end if; + + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Establish (D)TLS connection. + Result := WolfSSL.Accept_Connection (Ssl); + if Result /= Success then + Put_Line ("Accept error."); + WolfSSL.Free (Ssl); + SPARK_Sockets.Close_Socket (L); + + if not DTLS then + SPARK_Sockets.Close_Socket (C); + end if; + + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + Put_Line ("Client connected successfully."); + + Input := WolfSSL.Read (Ssl); + if not Input.Success then + Put_Line ("Read error."); + WolfSSL.Free (Ssl); + SPARK_Sockets.Close_Socket (L); + + if not DTLS then + SPARK_Sockets.Close_Socket (C); + end if; + + WolfSSL.Free (Context => Ctx); + Set (Exit_Status_Failure); + return; + end if; + + -- Print to stdout any data the client sends. + for I in Input.Buffer'Range loop + Ch := Character (Input.Buffer (I)); + if Ada.Characters.Handling.Is_Graphic (Ch) then + Put (Ch); + else + null; + -- Ignore the "newline" characters at end of message. + end if; + end loop; + New_Line; + + -- Check for server shutdown command. + if Input.Last >= 8 then + if Input.Buffer (1 .. 8) = "shutdown" then + Put_Line ("Shutdown command issued!"); + Shall_Continue := False; + end if; + end if; + + Output := WolfSSL.Write (Ssl, Reply); + if not Output.Success then + Put_Line ("ERROR: write failure."); + elsif Output.Bytes_Written /= Reply'Length then + Put_Line ("ERROR: failed to write full response."); + end if; + + for I in 1 .. 3 loop + + Result := WolfSSL.Shutdown (Ssl); + + exit when DTLS or Result = Success; + delay 0.001; -- Delay is expressed in seconds. + + end loop; + if not DTLS and then Result /= Success then + Put_Line ("ERROR: Failed to shutdown WolfSSL context."); + end if; + + WolfSSL.Free (Ssl); + + if DTLS then + Shall_Continue := False; + else + SPARK_Sockets.Close_Socket (C); + end if; + + Put_Line ("Shutdown complete."); + end loop; + SPARK_Sockets.Close_Socket (L); + WolfSSL.Free (Context => Ctx); + Result := WolfSSL.Finalize; + if Result /= Success then + Put_Line ("ERROR: Failed to finalize the WolfSSL library."); + return; + end if; + end Run; + +end Tls_Server; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.ads mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.ads --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.ads 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server.ads 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,39 @@ +-- tls_server.ads +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +-- SPARK wrapper package around GNAT Library packages. +with SPARK_Sockets; pragma Elaborate_All (SPARK_Sockets); + +-- The WolfSSL package. +with WolfSSL; pragma Elaborate_All (WolfSSL); + +package Tls_Server with SPARK_Mode is + + procedure Run (Ssl : in out WolfSSL.WolfSSL_Type; + Ctx : in out WolfSSL.Context_Type; + L : in out SPARK_Sockets.Optional_Socket; + C : in out SPARK_Sockets.Optional_Socket) with + Pre => (not C.Exists and not L.Exists and not + WolfSSL.Is_Valid (Ssl) and not WolfSSL.Is_Valid (Ctx)), + Post => (not C.Exists and not L.Exists and not + WolfSSL.Is_Valid (Ssl) and not WolfSSL.Is_Valid (Ctx)); + +end Tls_Server; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_server_main.adb mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server_main.adb --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/tls_server_main.adb 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/tls_server_main.adb 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,39 @@ +-- tls_server_main.ads +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +with Tls_Server; pragma Elaborate_All (Tls_Server); + +-- SPARK wrapper package around GNAT Library packages. +with SPARK_Sockets; pragma Elaborate_All (SPARK_Sockets); + +-- The WolfSSL package. +with WolfSSL; pragma Elaborate_All (WolfSSL); + +-- Application entry point for the Ada translation of the +-- tls server v1.3 example in C. +procedure Tls_Server_Main is + Ssl : WolfSSL.WolfSSL_Type; + Ctx : WolfSSL.Context_Type; + L : SPARK_Sockets.Optional_Socket; + C : SPARK_Sockets.Optional_Socket; +begin + Tls_Server.Run (Ssl, Ctx, L, C); +end Tls_Server_Main; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/user_settings.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/user_settings.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,381 @@ +/* user_settings.h + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + + +/* should be renamed to user_settings.h for customer use + * generated from configure options ./configure --enable-all + * + * Cleaned up by David Garske + */ + +#ifndef WOLFSSL_USER_SETTINGS_H +#define WOLFSSL_USER_SETTINGS_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Usually comes from configure -> config.h */ +#define HAVE_SYS_TIME_H + +/* Features */ +#define SINGLE_THREADED +#define WOLFSSL_IGNORE_FILE_WARN /* Ignore *.c include warnings */ +#define WOLFSSL_PUBLIC_MP /* Make math API's public */ +#define WOLFSSL_ENCRYPTED_KEYS /* Support for encrypted keys PKCS8 */ +//#define WOLFSSL_SYS_CA_CERTS /* Enable ability to load CA certs from OS */ + +#if 0 /* Not needed */ + #define KEEP_PEER_CERT /* Retain peer's certificate */ + #define KEEP_OUR_CERT /* Keep our certificate */ + #define WOLFSSL_ALWAYS_VERIFY_CB /* Always call verify callback (configured via wolfSSL_CTX_set_verify API) */ + #define WOLFSSL_VERIFY_CB_ALL_CERTS /* Call verify callback for all intermediate certs */ + #define WOLFSSL_ALWAYS_KEEP_SNI + #define WOLFSSL_EXTRA_ALERTS /* Allow sending other TLS alerts */ + #define HAVE_EX_DATA /* Enable "extra" EX data API's for user information in CTX/WOLFSSL */ + #define HAVE_EXT_CACHE + #define ATOMIC_USER /* Enable Atomic Record Layer callbacks */ + #define HAVE_PK_CALLBACKS /* Enable public key callbacks */ + #define WOLFSSL_ALT_NAMES /* Allow alternate cert chain validation to any trusted cert (not entire chain presented by peer) */ + #define HAVE_NULL_CIPHER /* Enable use of TLS cipher suites without cipher (clear text / no encryption) */ + #define WOLFSSL_HAVE_CERT_SERVICE + #define WOLFSSL_JNI + #define WOLFSSL_SEP /* certificate policy set extension */ + #define WOLFCRYPT_HAVE_SRP + #define WOLFSSL_HAVE_WOLFSCEP + #define HAVE_PKCS7 + #define WOLFSSL_SIGNER_DER_CERT + #define WOLFSSL_TRUST_PEER_CERT + #define WOLFSSL_WOLFSSH + #define WC_NO_ASYNC_THREADING +#endif + +/* TLS Features */ +#define WOLFSSL_TLS13 +#define WOLFSSL_EITHER_SIDE /* allow generic server/client method for WOLFSSL_CTX new */ +#define WOLFSSL_TLS13_NO_PEEK_HANDSHAKE_DONE + +/* DTLS */ +#define WOLFSSL_DTLS +// #define WOLFSSL_MULTICAST +#define WOLFSSL_DTLS13 + +/* DG Disabled SSLv3 and TLSv1.0 - should avoid using */ +//#define WOLFSSL_ALLOW_SSLV3 +//#define WOLFSSL_ALLOW_TLSV10 + +/* TLS Extensions */ +#define HAVE_TLS_EXTENSIONS +#define HAVE_SUPPORTED_CURVES +#define HAVE_ONE_TIME_AUTH +#define HAVE_SNI +#define HAVE_ALPN +#define HAVE_MAX_FRAGMENT +#define HAVE_TRUNCATED_HMAC +#define HAVE_SESSION_TICKET +#define WOLFSSL_TICKET_HAVE_ID +#define WOLFSSL_FORCE_CACHE_ON_TICKET +#define HAVE_EXTENDED_MASTER +#define HAVE_TRUSTED_CA +#define HAVE_ENCRYPT_THEN_MAC +#define WOLFSSL_POST_HANDSHAKE_AUTH +#define WOLFSSL_SEND_HRR_COOKIE /* Used by DTLS v1.3 */ +#define HAVE_ANON /* anon cipher suites */ +#define HAVE_FALLBACK_SCSV /* TLS_FALLBACK_SCSV */ +#define WOLFSSL_EARLY_DATA +#define HAVE_SERVER_RENEGOTIATION_INFO + +/* TLS Session Cache */ +#define SESSION_CERTS +#define PERSIST_SESSION_CACHE +#define PERSIST_CERT_CACHE + +/* Key and Certificate Generation */ +#define WOLFSSL_KEY_GEN +#define WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_EXT +#define WOLFSSL_MULTI_ATTRIB +#define HAVE_SMIME +#define WOLFSSL_DER_LOAD +#define ASN_BER_TO_DER /* BER to DER support */ +#define WOLFSSL_HAVE_ISSUER_NAMES /* Store pointers to issuer name components and their lengths and encodings */ +#define WOLFSSL_SUBJ_DIR_ATTR /* Enable support for SubjectDirectoryAttributes extension */ +#define WOLFSSL_SUBJ_INFO_ACC /* Enable support for SubjectInfoAccess extension */ +#define WOLFSSL_CERT_NAME_ALL /* Adds more certificate name capability at the cost of taking up more memory. Adds initials, givenname, dnQualifer for example */ +#define WOLFSSL_FPKI /* Enable support for FPKI (Federal PKI) extensions */ +#define WOLFSSL_AKID_NAME /* Enable support for full AuthorityKeyIdentifier extension. Only supports copying full AKID from an existing certificate */ +#define HAVE_CTS /* Ciphertext stealing interface */ +#define WOLFSSL_PEM_TO_DER +#define WOLFSSL_DER_TO_PEM +#define WOLFSSL_CUSTOM_OID +#define HAVE_OID_ENCODING +#define WOLFSSL_ASN_TEMPLATE + +/* Certificate Revocation */ +#define HAVE_OCSP +#define HAVE_CERTIFICATE_STATUS_REQUEST +#define HAVE_CERTIFICATE_STATUS_REQUEST_V2 +#define HAVE_CRL +#define HAVE_CRL_IO +#define HAVE_IO_TIMEOUT +//#define HAVE_CRL_MONITOR /* DG Disabled (Monitors CRL files on filesystem) - not portable feature */ + + +#if 1 + /* sp_int.c */ + #define WOLFSSL_SP_MATH_ALL +#else + /* Fast math key size 4096-bit max */ + #define USE_FAST_MATH +#endif +//#define HAVE___UINT128_T 1 /* DG commented: May not be portable */ + +/* Max Sizes */ +#define RSA_MAX_SIZE 4096 +#define FP_MAX_BITS 8192 +#define SP_INT_BITS 4096 + + +/* Timing Resistance */ +#define TFM_TIMING_RESISTANT +#define ECC_TIMING_RESISTANT +#define WC_RSA_BLINDING + +/* DH Key Sizes */ +#define HAVE_FFDHE_2048 +#define HAVE_FFDHE_3072 +#define WOLFSSL_DH_EXTRA /* Enable additional DH key import/export */ +#define HAVE_DH_DEFAULT_PARAMS + +/* ECC Features */ +#define HAVE_ECC +#define TFM_ECC256 +#define ECC_SHAMIR +#define WOLFSSL_CUSTOM_CURVES /* enable other curves (not just prime) */ +#define HAVE_ECC_SECPR2 +#define HAVE_ECC_SECPR3 +#define HAVE_ECC_BRAINPOOL +#define HAVE_ECC_KOBLITZ +#define HAVE_ECC_CDH /* Co-factor */ +#define HAVE_COMP_KEY /* Compressed key support */ +#define FP_ECC /* Fixed point caching - speed repeated operations against same key */ +#define HAVE_ECC_ENCRYPT +#define WOLFCRYPT_HAVE_ECCSI +#define WOLFCRYPT_HAVE_SAKKE +#define WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT + +/* RSA */ +#define WC_RSA_PSS +#define WOLFSSL_PSS_LONG_SALT +#define WC_RSA_NO_PADDING + +/* AES */ +#define HAVE_AES_DECRYPT +#define HAVE_AES_ECB +#define WOLFSSL_AES_DIRECT +#define WOLFSSL_AES_COUNTER +#define HAVE_AESGCM +#define GCM_TABLE_4BIT +#define WOLFSSL_AESGCM_STREAM +#define HAVE_AESCCM +#define WOLFSSL_AES_OFB +#define WOLFSSL_AES_CFB +#define WOLFSSL_AES_XTS +#define HAVE_AES_KEYWRAP +#define WOLFSSL_AES_CBC_LENGTH_CHECKS +#define WOLFSSL_USE_ALIGN +#define WOLFSSL_AES_SIV + +/* Hashing */ +#define WOLFSSL_SHA224 +#define WOLFSSL_SHA512 +#define WOLFSSL_SHA384 +#define WOLFSSL_SHAKE256 +#define WOLFSSL_SHA3 +#define WOLFSSL_HASH_FLAGS /* enable hash flag API's */ +#define WOLFSSL_SHAKE256 + +/* Additional Algorithms */ +#define HAVE_HASHDRBG +#define HAVE_CURVE25519 +#define HAVE_ED25519 +#define WOLFSSL_ED25519_STREAMING_VERIFY +#define CURVED25519_SMALL +#define HAVE_ED448 +#define WOLFSSL_ED448_STREAMING_VERIFY +#define HAVE_CURVE448 +#define HAVE_POLY1305 +#define HAVE_CHACHA +#define HAVE_XCHACHA +#define HAVE_HKDF +#define HAVE_X963_KDF +#define WOLFSSL_CMAC +#define WOLFSSL_DES_ECB +#define HAVE_BLAKE2 +#define HAVE_BLAKE2B +#define HAVE_BLAKE2S +#define WOLFSSL_SIPHASH +#define HAVE_KEYING_MATERIAL +#define WOLFSSL_HAVE_PRF + +/* Encrypted Client Hello */ +#define HAVE_HPKE +#define HAVE_ECH + +/* Non-Standard Algorithms (DG disabled) */ +//#define HAVE_CAMELLIA +//#define WOLFSSL_RIPEMD +//#define HAVE_SCRYPT +//#define WOLFSSL_MD2 +//#define WOLFSSL_ALLOW_RC4 + +/* Encoding */ +#define WOLFSSL_BASE16 +#define WOLFSSL_BASE64_ENCODE + + +/* Openssl compatibility */ +#if 0 /* DG Disabled */ + /* Openssl compatibility API's */ + #define OPENSSL_EXTRA + #define OPENSSL_ALL + #define HAVE_OPENSSL_CMD + #define SSL_TXT_TLSV1_2 + #define SSL_TXT_TLSV1_1 + #define OPENSSL_NO_SSL2 + #define OPENSSL_NO_SSL3 + #define NO_OLD_RNGNAME + #define NO_OLD_WC_NAMES + #define NO_OLD_SSL_NAMES + #define NO_OLD_SHA_NAMES + #define NO_OLD_MD5_NAME + #define OPENSSL_NO_EC /* macro to enable ECC in openssl */ + #define WOLFSSL_VERBOSE_ERRORS + #define ERROR_QUEUE_PER_THREAD + #define WOLFSSL_ERROR_CODE_OPENSSL + #define HAVE_WOLFSSL_SSL_H 1 + #define OPENSSL_COMPATIBLE_DEFAULTS + + /* Openssl compatibility application specific */ + #define WOLFSSL_LIBWEBSOCKETS + #define WOLFSSL_OPENSSH + #define WOLFSSL_QT + #define FORTRESS + #define HAVE_WEBSERVER + #define HAVE_LIGHTY + #define WOLFSSL_NGINX + #define WOLFSSL_HAPROXY + #define HAVE_STUNNEL + #define WOLFSSL_ASIO + #define ASIO_USE_WOLFSSL + #define BOOST_ASIO_USE_WOLFSSL + #define WOLFSSL_OPENVPN + + #define NO_WOLFSSL_STUB +#endif + +/* TLS static cipher support - off by default */ +#if 0 + #define WOLFSSL_STATIC_RSA + #define WOLFSSL_STATIC_DH + #define WOLFSSL_STATIC_PSK +#endif + +/* TLS sniffer support - off by default */ +#if 0 + #define WOLFSSL_STATIC_EPHEMERAL + #define WOLFSSL_SNIFFER +#endif + +/* Deprecated */ +#define NO_DSA +#define NO_MD4 +#define NO_MD5 +#define NO_OLD_TLS + +/* Used to manually test disable edge cases */ +#ifdef TEST_DISABLES + #define NO_SESSION_CACHE + + //#define NO_ECC256 + //#define NO_ECC_KEY_EXPORT + //#define NO_ECC_DHE + //#define NO_ECC_SIGN + //#define NO_ECC_VERIFY + + //#define NO_RSA + #define NO_DH + + #define NO_SHA + #define NO_SHA256 + #ifdef NO_SHA256 + #undef WOLFSSL_SHA224 + #endif + #define NO_SHA512 + #ifdef NO_SHA512 + #undef WOLFSSL_SHA384 + #undef WOLFSSL_SHA512 + #undef HAVE_ED25519 + #endif + + //#define NO_KDF + //#define NO_HMAC + + #define NO_RC4 + #define NO_DES3 + //#define NO_AES + #define NO_AES_CBC + #define WOLFSSL_NO_SHAKE128 + + #define NO_PSK + #define NO_PWDBASED + + //#define WOLFSSL_NO_TLS12 + + //#define NO_64BIT + #define WOLFSSL_SP_NO_MALLOC + #define NO_FILESYSTEM + #define NO_WRITEV + + #define NO_ERROR_STRINGS + //#define NO_WOLFSSL_CLIENT + //#define NO_WOLFSSL_SERVER + + #define NO_MULTIBYTE_PRINT + //#define NO_ASN_TIME + //#define NO_ASN_CRYPT + //#define NO_CODING + #define NO_SIG_WRAPPER + //#define NO_HASH_WRAPPER + //#define WC_NO_HARDEN + + //#define NO_CERTS + //#define NO_ASN +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* WOLFSSL_USER_SETTINGS_H */ diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.adb mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.adb --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.adb 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.adb 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,768 @@ +-- wolfssl.adb +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +pragma Warnings (Off, "* is an internal GNAT unit"); +with GNAT.Sockets.Thin_Common; +pragma Warnings (On, "* is an internal GNAT unit"); +with Interfaces.C.Extensions; +with Interfaces.C.Strings; +with System; + +package body WolfSSL is + + subtype size_t is Interfaces.C.size_t; use type size_t; + + subtype long is Interfaces.C.long; + subtype unsigned_long is Interfaces.C.unsigned_long; + + WOLFSSL_SUCCESS : constant int := Get_WolfSSL_Success; + + function Initialize_WolfSSL return int with + Convention => C, + External_Name => "wolfSSL_Init", + Import => True; + + function Finalize_WolfSSL return int with + Convention => C, + External_Name => "wolfSSL_Cleanup", + Import => True; + + function Initialize return Subprogram_Result is + Result : constant int := Initialize_WolfSSL; + begin + return Subprogram_Result (Result); + end Initialize; + + function Finalize return Subprogram_Result is + Result : constant int := Finalize_WolfSSL; + begin + return Subprogram_Result (Result); + end Finalize; + + function Is_Valid (Context : Context_Type) return Boolean is + begin + return Context /= null; + end Is_Valid; + + function WolfTLSv1_2_Server_Method return Method_Type with + Convention => C, + External_Name => "wolfTLSv1_2_server_method", + Import => True; + + function TLSv1_2_Server_Method return Method_Type is + begin + return WolfTLSv1_2_Server_Method; + end TLSv1_2_Server_Method; + + function WolfTLSv1_2_Client_Method return Method_Type with + Convention => C, + External_Name => "wolfTLSv1_2_client_method", + Import => True; + + function TLSv1_2_Client_Method return Method_Type is + begin + return WolfTLSv1_2_Client_Method; + end TLSv1_2_Client_Method; + + function WolfTLSv1_3_Server_Method return Method_Type with + Convention => C, + External_Name => "wolfTLSv1_3_server_method", + Import => True; + + function TLSv1_3_Server_Method return Method_Type is + begin + return WolfTLSv1_3_Server_Method; + end TLSv1_3_Server_Method; + + function WolfTLSv1_3_Client_Method return Method_Type with + Convention => C, + External_Name => "wolfTLSv1_3_client_method", + Import => True; + + function TLSv1_3_Client_Method return Method_Type is + begin + return WolfTLSv1_3_Client_Method; + end TLSv1_3_Client_Method; + + function WolfDTLSv1_2_Server_Method return Method_Type with + Convention => C, + External_Name => "wolfDTLSv1_2_server_method", + Import => True; + + function DTLSv1_2_Server_Method return Method_Type is + begin + return WolfDTLSv1_2_Server_Method; + end DTLSv1_2_Server_Method; + + function WolfDTLSv1_2_Client_Method return Method_Type with + Convention => C, + External_Name => "wolfDTLSv1_2_client_method", + Import => True; + + function DTLSv1_2_Client_Method return Method_Type is + begin + return WolfDTLSv1_2_Client_Method; + end DTLSv1_2_Client_Method; + + function WolfDTLSv1_3_Server_Method return Method_Type with + Convention => C, + External_Name => "wolfDTLSv1_3_server_method", + Import => True; + + function DTLSv1_3_Server_Method return Method_Type is + begin + return WolfDTLSv1_3_Server_Method; + end DTLSv1_3_Server_Method; + + function WolfDTLSv1_3_Client_Method return Method_Type with + Convention => C, + External_Name => "wolfDTLSv1_3_client_method", + Import => True; + + function DTLSv1_3_Client_Method return Method_Type is + begin + return WolfDTLSv1_3_Client_Method; + end DTLSv1_3_Client_Method; + + function WolfSSL_CTX_new (Method : Method_Type) + return Context_Type with + Convention => C, External_Name => "wolfSSL_CTX_new", Import => True; + + procedure Create_Context (Method : Method_Type; + Context : out Context_Type) is + begin + Context := WolfSSL_CTX_new (Method); + end Create_Context; + + procedure WolfSSL_CTX_free (Context : Context_Type) with + Convention => C, External_Name => "wolfSSL_CTX_free", Import => True; + + procedure Free (Context : in out Context_Type) is + begin + WolfSSL_CTX_free (Context); + Context := null; + end Free; + + type Opaque_X509_Store_Context is limited null record; + type X509_Store_Context is access Opaque_X509_Store_Context with + Convention => C; + + type Verify_Callback is access function + (A : int; + Context : X509_Store_Context) + return int + with Convention => C; + + procedure WolfSSL_CTX_Set_Verify (Context : Context_Type; + Mode : int; + Callback : Verify_Callback) with + Convention => C, + External_Name => "wolfSSL_CTX_set_verify", + Import => True; + -- This function sets the verification method for remote peers and + -- also allows a verify callback to be registered with the SSL + -- context. The verify callback will be called only when a + -- verification failure has occurred. If no verify callback is + -- desired, the NULL pointer can be used for verify_callback. + -- The verification mode of peer certificates is a logically OR'd + -- list of flags. The possible flag values include: + -- SSL_VERIFY_NONE Client mode: the client will not verify the + -- certificate received from the server and the handshake will + -- continue as normal. Server mode: the server will not send a + -- certificate request to the client. As such, client verification + -- will not be enabled. SSL_VERIFY_PEER Client mode: the client will + -- verify the certificate received from the server during the + -- handshake. This is turned on by default in wolfSSL, therefore, + -- using this option has no effect. Server mode: the server will send + -- a certificate request to the client and verify the client + -- certificate received. SSL_VERIFY_FAIL_IF_NO_PEER_CERT Client mode: + -- no effect when used on the client side. Server mode: + -- the verification will fail on the server side if the client fails + -- to send a certificate when requested to do so (when using + -- SSL_VERIFY_PEER on the SSL server). + -- SSL_VERIFY_FAIL_EXCEPT_PSK Client mode: no effect when used on + -- the client side. Server mode: the verification is the same as + -- SSL_VERIFY_FAIL_IF_NO_PEER_CERT except in the case of a + -- PSK connection. If a PSK connection is being made then the + -- connection will go through without a peer cert. + + function "&" (Left, Right : Mode_Type) return Mode_Type is + L : constant Unsigned_32 := Unsigned_32 (Left); + R : constant Unsigned_32 := Unsigned_32 (Right); + begin + return Mode_Type (L and R); + end "&"; + + procedure Set_Verify (Context : Context_Type; + Mode : Mode_Type) is + begin + WolfSSL_CTX_Set_Verify (Context => Context, + Mode => int (Mode), + Callback => null); + end Set_Verify; + + function Use_Certificate_File (Context : Context_Type; + File : char_array; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_CTX_use_certificate_file", + Import => True; + + function Use_Certificate_File (Context : Context_Type; + File : String; + Format : File_Format) + return Subprogram_Result is + Ctx : constant Context_Type := Context; + C : size_t; + F : char_array (1 .. File'Length + 1); + Result : int; + begin + Interfaces.C.To_C (Item => File, + Target => F, + Count => C, + Append_Nul => True); + Result := Use_Certificate_File (Ctx, F (1 .. C), int (Format)); + return Subprogram_Result (Result); + end Use_Certificate_File; + + function Use_Certificate_Buffer (Context : Context_Type; + Input : char_array; + Size : long; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_CTX_use_certificate_buffer", + Import => True; + + function Use_Certificate_Buffer (Context : Context_Type; + Input : char_array; + Format : File_Format) + return Subprogram_Result is + Result : int; + begin + Result := Use_Certificate_Buffer (Context, Input, + Input'Length, int (Format)); + return Subprogram_Result (Result); + end Use_Certificate_Buffer; + + function Use_Private_Key_File (Context : Context_Type; + File : char_array; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_CTX_use_PrivateKey_file", + Import => True; + + function Use_Private_Key_File (Context : Context_Type; + File : String; + Format : File_Format) + return Subprogram_Result is + Ctx : constant Context_Type := Context; + C : size_t; + F : char_array (1 .. File'Length + 1); + Result : int; + begin + Interfaces.C.To_C (Item => File, + Target => F, + Count => C, + Append_Nul => True); + Result := Use_Private_Key_File (Ctx, F (1 .. C), int (Format)); + return Subprogram_Result (Result); + end Use_Private_Key_File; + + function Use_Private_Key_Buffer (Context : Context_Type; + Input : char_array; + Size : long; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_CTX_use_PrivateKey_buffer", + Import => True; + + function Use_Private_Key_Buffer (Context : Context_Type; + Input : Byte_Array; + Format : File_Format) + return Subprogram_Result is + Result : int; + begin + Result := Use_Private_Key_Buffer (Context, Input, + Input'Length, int (Format)); + return Subprogram_Result (Result); + end Use_Private_Key_Buffer; + + function Load_Verify_Locations1 + (Context : Context_Type; + File : char_array; + Path : char_array) return int with + Convention => C, + External_Name => "wolfSSL_CTX_load_verify_locations", + Import => True; + -- This function loads PEM-formatted CA certificate files into + -- the SSL context (WOLFSSL_CTX). These certificates will be treated + -- as trusted root certificates and used to verify certs received + -- from peers during the SSL handshake. The root certificate file, + -- provided by the file argument, may be a single certificate or a + -- file containing multiple certificates. If multiple CA certs are + -- included in the same file, wolfSSL will load them in the same order + -- they are presented in the file. The path argument is a pointer to + -- the name of a directory that contains certificates of trusted + -- root CAs. If the value of file is not NULL, path may be specified + -- as NULL if not needed. If path is specified and NO_WOLFSSL_DIR was + -- not defined when building the library, wolfSSL will load all + -- CA certificates located in the given directory. This function will + -- attempt to load all files in the directory. This function expects + -- PEM formatted CERT_TYPE file with header "--BEGIN CERTIFICATE--". + + subtype char_array_ptr is Interfaces.C.Strings.char_array_access; + + function Load_Verify_Locations2 + (Context : Context_Type; + File : char_array; + Path : char_array_ptr) return int with + Convention => C, + External_Name => "wolfSSL_CTX_load_verify_locations", + Import => True; + + function Load_Verify_Locations3 + (Context : Context_Type; + File : char_array_ptr; + Path : char_array) return int with + Convention => C, + External_Name => "wolfSSL_CTX_load_verify_locations", + Import => True; + + function Load_Verify_Locations4 + (Context : Context_Type; + File : char_array_ptr; + Path : char_array_ptr) return int with + Convention => C, + External_Name => "wolfSSL_CTX_load_verify_locations", + Import => True; + + function Load_Verify_Locations (Context : Context_Type; + File : String; + Path : String) + return Subprogram_Result is + Ctx : constant Context_Type := Context; + FC : size_t; -- File Count, specifies the characters used in F. + F : aliased char_array := (1 .. File'Length + 1 => '#'); + + PC : size_t; -- Path Count, specifies the characters used in P. + P : aliased char_array := (1 .. Path'Length + 1 => '#'); + + Result : int; + begin + if File = "" then + if Path = "" then + Result := Load_Verify_Locations4 (Ctx, null, null); + else + Interfaces.C.To_C (Item => Path, + Target => P, + Count => PC, + Append_Nul => True); + Result := Load_Verify_Locations3 (Ctx, null, P); + end if; + else + Interfaces.C.To_C (Item => File, + Target => F, + Count => FC, + Append_Nul => True); + if Path = "" then + Result := Load_Verify_Locations2 (Ctx, F, null); + else + Interfaces.C.To_C (Item => Path, + Target => P, + Count => PC, + Append_Nul => True); + Interfaces.C.To_C (Item => Path, + Target => P, + Count => PC, + Append_Nul => True); + Result := Load_Verify_Locations1 (Context => Ctx, + File => F, + Path => P); + end if; + end if; + return Subprogram_Result (Result); + end Load_Verify_Locations; + + function Load_Verify_Buffer + (Context : Context_Type; + Input : char_array; + Size : int; + Format : int) return int with + Convention => C, + External_Name => "wolfSSL_CTX_load_verify_buffer", + Import => True; + + function Load_Verify_Buffer (Context : Context_Type; + Input : Byte_Array; + Format : File_Format) + return Subprogram_Result is + Result : int; + begin + Result := Load_Verify_Buffer (Context => Context, + Input => Input, + Size => Input'Length, + Format => int(Format)); + return Subprogram_Result (Result); + end Load_Verify_Buffer; + + function Is_Valid (Ssl : WolfSSL_Type) return Boolean is + begin + return Ssl /= null; + end Is_Valid; + + function WolfSSL_New (Context : Context_Type) + return WolfSSL_Type with + Convention => C, + External_Name => "wolfSSL_new", + Import => True; + + procedure Create_WolfSSL (Context : Context_Type; + Ssl : out WolfSSL_Type) is + begin + Ssl := WolfSSL_New (Context); + end Create_WolfSSL; + + function Use_Certificate_File (Ssl : WolfSSL_Type; + File : char_array; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_use_certificate_file", + Import => True; + + function Use_Certificate_File (Ssl : WolfSSL_Type; + File : String; + Format : File_Format) + return Subprogram_Result is + C : size_t; + F : char_array (1 .. File'Length + 1); + Result : int; + begin + Interfaces.C.To_C (Item => File, + Target => F, + Count => C, + Append_Nul => True); + Result := Use_Certificate_File (Ssl, F (1 .. C), int (Format)); + return Subprogram_Result (Result); + end Use_Certificate_File; + + function Use_Certificate_Buffer (Ssl : WolfSSL_Type; + Input : char_array; + Size : long; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_use_certificate_buffer", + Import => True; + + function Use_Certificate_Buffer (Ssl : WolfSSL_Type; + Input : char_array; + Format : File_Format) + return Subprogram_Result is + Result : int; + begin + Result := Use_Certificate_Buffer (Ssl, Input, + Input'Length, int (Format)); + return Subprogram_Result (Result); + end Use_Certificate_Buffer; + + function Use_Private_Key_File (Ssl : WolfSSL_Type; + File : char_array; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_use_PrivateKey_file", + Import => True; + + function Use_Private_Key_File (Ssl : WolfSSL_Type; + File : String; + Format : File_Format) + return Subprogram_Result is + C : size_t; + F : char_array (1 .. File'Length + 1); + Result : int; + begin + Interfaces.C.To_C (Item => File, + Target => F, + Count => C, + Append_Nul => True); + Result := Use_Private_Key_File (Ssl, F (1 .. C), int (Format)); + return Subprogram_Result (Result); + end Use_Private_Key_File; + + function Use_Private_Key_Buffer (Ssl : WolfSSL_Type; + Input : char_array; + Size : long; + Format : int) + return int with + Convention => C, + External_Name => "wolfSSL_use_PrivateKey_buffer", + Import => True; + + function Use_Private_Key_Buffer (Ssl : WolfSSL_Type; + Input : Byte_Array; + Format : File_Format) + return Subprogram_Result is + Result : int; + begin + Result := Use_Private_Key_Buffer (Ssl, Input, + Input'Length, int (Format)); + return Subprogram_Result (Result); + end Use_Private_Key_Buffer; + + function WolfSSL_DTLS_Set_Peer + (ssl : WolfSSL_Type; + peer : GNAT.Sockets.Thin_Common.Sockaddr_Access; + peerSz : Interfaces.C.unsigned) + return int with + Convention => C, + External_Name => "wolfSSL_dtls_set_peer", + Import => True; + + function DTLS_Set_Peer + (Ssl : WolfSSL_Type; + Address : GNAT.Sockets.Sock_Addr_Type) + return Subprogram_Result is + + Sin : aliased GNAT.Sockets.Thin_Common.Sockaddr; + Length : Interfaces.C.int; + + begin + + GNAT.Sockets.Thin_Common.Set_Address + (Sin => Sin'Unchecked_Access, + Address => Address, + Length => Length); + + pragma Assert (Length >= 0); + + return + Subprogram_Result + (WolfSSL_DTLS_Set_Peer + (ssl => Ssl, + peer => Sin'Unchecked_Access, + peerSz => Interfaces.C.unsigned (Length))); + + end DTLS_Set_Peer; + + function WolfSSL_Set_Fd (Ssl : WolfSSL_Type; Fd : int) return int with + Convention => C, + External_Name => "wolfSSL_set_fd", + Import => True; + + function Attach (Ssl : WolfSSL_Type; + Socket : Integer) + return Subprogram_Result is + Result : int := WolfSSL_Set_Fd (Ssl, int (Socket)); + begin + return Subprogram_Result (Result); + end Attach; + + procedure WolfSSL_Keep_Arrays (Ssl : WolfSSL_Type) with + Convention => C, + External_Name => "wolfSSL_KeepArrays", + Import => True; + + procedure Keep_Arrays (Ssl : WolfSSL_Type) is + begin + WolfSSL_Keep_Arrays (Ssl); + end Keep_Arrays; + + function WolfSSL_Accept (Ssl : WolfSSL_Type) return int with + Convention => C, + External_Name => "wolfSSL_accept", + Import => True; + + function Accept_Connection (Ssl : WolfSSL_Type) + return Subprogram_Result is + Result : int := WolfSSL_Accept (Ssl); + begin + return Subprogram_Result (Result); + end Accept_Connection; + + procedure WolfSSL_Free_Arrays (Ssl : WolfSSL_Type) with + Convention => C, + External_Name => "wolfSSL_FreeArrays", + Import => True; + + procedure Free_Arrays (Ssl : WolfSSL_Type) is + begin + WolfSSL_Free_Arrays (Ssl); + end Free_Arrays; + + function WolfSSL_Read (Ssl : WolfSSL_Type; + Data : out char_array; + Sz : int) return int with + Convention => C, + External_Name => "wolfSSL_read", + Import => True; + -- This function reads sz bytes from the SSL session (ssl) internal + -- read buffer into the buffer data. The bytes read are removed from + -- the internal receive buffer. If necessary wolfSSL_read() will + -- negotiate an SSL/TLS session if the handshake has not already + -- been performed yet by wolfSSL_connect() or wolfSSL_accept(). + -- The SSL/TLS protocol uses SSL records which have a maximum size + -- of 16kB (the max record size can be controlled by the + -- MAX_RECORD_SIZE define in /wolfssl/internal.h). As such, wolfSSL + -- needs to read an entire SSL record internally before it is able + -- to process and decrypt the record. Because of this, a call to + -- wolfSSL_read() will only be able to return the maximum buffer + -- size which has been decrypted at the time of calling. There may + -- be additional not-yet-decrypted data waiting in the internal + -- wolfSSL receive buffer which will be retrieved and decrypted with + -- the next call to wolfSSL_read(). If sz is larger than the number + -- of bytes in the internal read buffer, SSL_read() will return + -- the bytes available in the internal read buffer. If no bytes are + -- buffered in the internal read buffer yet, a call to wolfSSL_read() + -- will trigger processing of the next record. + -- + -- The integer returned is the number of bytes read upon success. + -- 0 will be returned upon failure. This may be caused by a either + -- a clean (close notify alert) shutdown or just that the peer closed + -- the connection. Call wolfSSL_get_error() for the specific + -- error code. SSL_FATAL_ERROR will be returned upon failure when + -- either an error occurred or, when using non-blocking sockets, + -- the SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE error was received + -- and and the application needs to call wolfSSL_read() again. + -- Use wolfSSL_get_error() to get a specific error code. + + function Read (Ssl : WolfSSL_Type) return Read_Result is + Data : char_array (1 .. Byte_Index'Last); + Size : int; + begin + Size := WolfSSL_Read (Ssl, Data, int (Byte_Index'Last)); + if Size <= 0 then + return (Success => False, + Last => 0, + Code => Subprogram_Result (Size)); + else + return (Success => True, + Last => Byte_Index (Size), + Buffer => Data (1 .. Byte_Index (Size))); + end if; + end Read; + + function WolfSSL_Write (Ssl : WolfSSL_Type; + Data : char_array; + Sz : int) return int with + Convention => C, + External_Name => "wolfSSL_write", + Import => True; + + function Write (Ssl : WolfSSL_Type; + Data : Byte_Array) return Write_Result is + Size : constant int := Data'Length; + Result : int; + begin + Result := WolfSSL_Write (Ssl, Data, Size); + if Result > 0 then + return (Success => True, + Bytes_Written => Byte_Index (Result)); + else + return (Success => False, Code => Subprogram_Result (Result)); + end if; + end Write; + + function WolfSSL_Shutdown (Ssl : WolfSSL_Type) return int with + Convention => C, + External_Name => "wolfSSL_shutdown", + Import => True; + + function Shutdown (Ssl : WolfSSL_Type) return Subprogram_Result is + Result : constant int := WolfSSL_Shutdown (Ssl); + begin + return Subprogram_Result (Result); + end Shutdown; + + function WolfSSL_Connect (Ssl : WolfSSL_Type) return int with + Convention => C, + External_Name => "wolfSSL_connect", + Import => True; + + function Connect (Ssl : WolfSSL_Type) return Subprogram_Result is + Result : constant int := WolfSSL_Connect (Ssl); + begin + return Subprogram_Result (Result); + end Connect; + + procedure WolfSSL_Free (Ssl : WolfSSL_Type) with + Convention => C, + External_Name => "wolfSSL_free", + Import => True; + + procedure Free (Ssl : in out WolfSSL_Type) is + begin + if Ssl /= null then + WolfSSL_Free (Ssl); + end if; + Ssl := null; + end Free; + + function WolfSSL_Get_Error (Ssl : WolfSSL_Type; + Ret : int) return int with + Convention => C, + External_Name => "wolfSSL_get_error", + Import => True; + + function Get_Error (Ssl : WolfSSL_Type; + Result : Subprogram_Result) return Error_Code is + begin + return Error_Code (WolfSSL_Get_Error (Ssl, int (Result))); + end Get_Error; + + procedure WolfSSL_Error_String (Error : unsigned_long; + Data : out Byte_Array; + Size : unsigned_long) with + Convention => C, + External_Name => "wolfSSL_ERR_error_string_n", + Import => True; + + function Error (Code : Error_Code) return Error_Message is + S : String (1 .. Error_Message_Index'Last); + B : Byte_Array (1 .. size_t (Error_Message_Index'Last)); + C : Natural; + begin + WolfSSL_Error_String (Error => unsigned_long (Code), + Data => B, + Size => unsigned_long (B'Last)); + Interfaces.C.To_Ada (Item => B, + Target => S, + Count => C, + Trim_Nul => True); + return (Last => C, + Text => S (1 .. C)); + end Error; + + function Get_WolfSSL_Max_Error_Size return int with + Convention => C, + External_Name => "get_wolfssl_max_error_size", + Import => True; + + function Max_Error_Size return Natural is + begin + return Natural (Get_WolfSSL_Max_Error_Size); + end Max_Error_Size; + +end WolfSSL; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.ads mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.ads --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.ads 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/Ada/wolfssl.ads 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,631 @@ +-- wolfssl.ads +-- +-- Copyright (C) 2006-2023 wolfSSL Inc. +-- +-- This file is part of wolfSSL. +-- +-- wolfSSL 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 of the License, or +-- (at your option) any later version. +-- +-- wolfSSL 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, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA +-- + +with GNAT.Sockets; +with Interfaces.C; + +-- This package is annotated "with SPARK_Mode" that SPARK can verify +-- the API of this package is used correctly. +package WolfSSL with SPARK_Mode is + + type Subprogram_Result is new Integer; + Success : constant Subprogram_Result; + Failure : constant Subprogram_Result; + + function Initialize return Subprogram_Result; + -- Initializes the wolfSSL library for use. Must be called once per + -- application and before any other call to the library. + + function Finalize return Subprogram_Result; + -- Un-initializes the wolfSSL library from further use. + -- Doesn't have to be called, though it will free any resources + -- used by the library. + + subtype char_array is Interfaces.C.char_array; -- Remove? + + subtype Byte_Type is Interfaces.C.char; + subtype Byte_Index is Interfaces.C.size_t range 0 .. 16_000; + subtype Byte_Array is Interfaces.C.char_array; + + type Context_Type is limited private; + -- Instances of this type are called SSL Contexts. + + function Is_Valid (Context : Context_Type) return Boolean; + -- Indicates if the SSL Context has successfully been initialized. + -- If initialized, the SSL Context has allocated resources + -- that needs to be deallocated before application exit. + + type Method_Type is limited private; + + function TLSv1_2_Server_Method return Method_Type; + -- This function is used to indicate that the application is a server + -- and will only support the TLS 1.2 protocol. + + function TLSv1_2_Client_Method return Method_Type; + -- This function is used to indicate that the application is a client + -- and will only support the TLS 1.2 protocol. + + function TLSv1_3_Server_Method return Method_Type; + -- This function is used to indicate that the application is a server + -- and will only support the TLS 1.3 protocol. + + function TLSv1_3_Client_Method return Method_Type; + -- This function is used to indicate that the application is a client + -- and will only support the TLS 1.3 protocol. + + function DTLSv1_2_Server_Method return Method_Type; + -- This function is used to indicate that the application is a server + -- and will only support the DTLS 1.2 protocol. + + function DTLSv1_2_Client_Method return Method_Type; + -- This function is used to indicate that the application is a client + -- and will only support the DTLS 1.2 protocol. + + function DTLSv1_3_Server_Method return Method_Type; + -- This function is used to indicate that the application is a server + -- and will only support the DTLS 1.3 protocol. + + function DTLSv1_3_Client_Method return Method_Type; + -- This function is used to indicate that the application is a client + -- and will only support the DTLS 1.3 protocol. + + procedure Create_Context (Method : Method_Type; + Context : out Context_Type); + -- This function creates a new SSL context, taking a desired SSL/TLS + -- protocol method for input. + -- If successful Is_Valid (Context) = True, otherwise False. + + procedure Free (Context : in out Context_Type) with + Pre => Is_Valid (Context), + Post => not Is_Valid (Context); + -- This function frees an allocated SSL Context object. + + type Mode_Type is private; + + function "&" (Left, Right : Mode_Type) return Mode_Type; + + Verify_None : constant Mode_Type; + -- Client mode: the client will not verify the certificate received + -- from the server and the handshake will continue as normal. + -- + -- Server mode: the server will not send a certificate request to + -- the client. As such, client verification will not be enabled. + + Verify_Peer : constant Mode_Type; + -- Client mode: the client will verify the certificate received from + -- the server during the handshake. This is turned on by default + -- in wolfSSL, therefore, using this option has no effect. + -- + -- Server mode: the server will send a certificate request to + -- the client and verify the client certificate received. + + Verify_Fail_If_No_Peer_Cert : constant Mode_Type; + -- Client mode: no effect when used on the client side. + -- + -- Server mode: the verification will fail on the server side if + -- the client fails to send a certificate when requested to do so + -- (when using Verify_Peer on the SSL server). + + Verify_Client_Once : constant Mode_Type; + + Verify_Post_Handshake : constant Mode_Type; + + Verify_Fail_Except_Psk : constant Mode_Type; + -- Client mode: no effect when used on the client side. + -- + -- Server mode: the verification is the same as + -- Verify_Fail_If_No_Peer_Cert except in the case of a PSK connection. + -- If a PSK connection is being made then the connection + -- will go through without a peer cert. + + Verify_Default : constant Mode_Type; + + procedure Set_Verify (Context : Context_Type; + Mode : Mode_Type) with + Pre => Is_Valid (Context); + -- This function sets the verification method for remote peers + + type File_Format is private; + + Format_Asn1 : constant File_Format; + Format_Pem : constant File_Format; + Format_Default : constant File_Format; + + function Use_Certificate_File (Context : Context_Type; + File : String; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Context); + -- This function loads a certificate file into the SSL context. + -- The file is provided by the file argument. The format argument + -- specifies the format type of the file, either ASN1 or + -- PEM file types. Please see the examples for proper usage. + + function Use_Certificate_Buffer (Context : Context_Type; + Input : char_array; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Context); + -- This function loads a certificate buffer into the SSL Context. + -- It behaves like the non-buffered version (Use_Certificate_File), + -- only differing in its ability to be called with a buffer as input + -- instead of a file. The buffer is provided by the Input argument. + -- Format specifies the format type of the buffer; ASN1 or PEM. + -- Please see the examples for proper usage. + + function Use_Private_Key_File (Context : Context_Type; + File : String; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Context); + -- This function loads a private key file into the SSL context. + -- The file is provided by the File argument. The Format argument + -- specifies the format type of the file - ASN1 or PEM. + -- Please see the examples for proper usage. + + function Use_Private_Key_Buffer (Context : Context_Type; + Input : Byte_Array; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Context); + -- This function loads a private key buffer into the SSL Context. + -- It behaves like the non-buffered version (Use_Private_Key_File), + -- only differing in its ability to be called with a buffer as input + -- instead of a file. The buffer is provided by the Input argument. + -- Format specifies the format type of the buffer; ASN1 or PEM. + -- Please see the examples for proper usage. + + function Load_Verify_Locations (Context : Context_Type; + File : String; + Path : String) + return Subprogram_Result with + Pre => Is_Valid (Context); + -- This function loads PEM-formatted CA certificate files into + -- the SSL context. These certificates will be treated as trusted + -- root certificates and used to verify certs received from peers + -- during the SSL handshake. The root certificate file, + -- provided by the File argument, may be a single certificate or + -- a file containing multiple certificates. If multiple CA certs + -- are included in the same file, wolfSSL will load them in the same + -- order they are presented in the file. The path argument is + -- a pointer to the name of a directory that contains certificates + -- of trusted root CAs. If the value of File is not empty "", + -- path may be specified as "" if not needed. If path is specified + -- and NO_WOLFSSL_DIR was not defined when building the library, + -- wolfSSL will load all CA certificates located in the given + -- directory. This function will attempt to load all files in + -- the directory. This function expects PEM formatted CERT_TYPE file + -- with header "--BEGIN CERTIFICATE--". + + function Load_Verify_Buffer (Context : Context_Type; + Input : Byte_Array; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Context); + -- This function loads a CA certificate buffer into the SSL + -- Context. It behaves like the non-buffered version, only differing + -- in its ability to be called with a buffer as input instead of + -- a file. The buffer is provided by the Input argument. + -- Format specifies the format type of the buffer; ASN1 or PEM. + -- More than one CA certificate may be loaded + -- per buffer as long as the format is in PEM. + -- Please see the examples for proper usage. + + type WolfSSL_Type is limited private; + -- Instances of this type are called SSL Sessions. + + function Is_Valid (Ssl : WolfSSL_Type) return Boolean; + -- Indicates if the SSL Session has successfully been initialized. + -- If initialized, the SSL Session has allocated resources + -- that needs to be deallocated before application exit. + + procedure Create_WolfSSL (Context : Context_Type; + Ssl : out WolfSSL_Type) with + Pre => Is_Valid (Context); + -- This function creates a new SSL session, taking an already created + -- SSL context as input. + -- If successful Is_Valid (Ssl) = True, otherwise False. + + function Use_Certificate_File (Ssl : WolfSSL_Type; + File : String; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- This function loads a certificate file into the SSL session. + -- The certificate file is provided by the file argument. + -- The format argument specifies the format type of the file + -- either ASN1 or PEM. + + function Use_Certificate_Buffer (Ssl : WolfSSL_Type; + Input : char_array; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- This function loads a certificate buffer into the SSL session + -- object. It behaves like the non-buffered version, only differing + -- in its ability to be called with a buffer as input instead + -- of a file. The buffer is provided by the Input argument. + -- Format specifies the format type of the buffer; ASN1 or PEM. + -- Please see the examples for proper usage. + + function Use_Private_Key_File (Ssl : WolfSSL_Type; + File : String; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- This function loads a private key file into the SSL session. + -- The key file is provided by the File argument. The Format argument + -- specifies the format type of the file - ASN1 or PEM. + + function Use_Private_Key_Buffer (Ssl : WolfSSL_Type; + Input : Byte_Array; + Format : File_Format) + return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- This function loads a private key buffer into the SSL session + -- object. It behaves like the non-buffered version, only differing + -- in its ability to be called with a buffer as input instead + -- of a file. The buffer is provided by the Input argument. + -- Format specifies the format type of the buffer; ASN1 or PEM. + -- Please see the examples for proper usage. + + function DTLS_Set_Peer + (Ssl : WolfSSL_Type; + Address : GNAT.Sockets.Sock_Addr_Type) + return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- This function wraps the corresponding WolfSSL C function to allow + -- clients to use Ada socket types when implementing a DTLS client. + + function Attach (Ssl : WolfSSL_Type; + Socket : Integer) + return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- Attach wolfSSL to the socket. + -- + -- This function assigns a file descriptor (Socket) as + -- the input/output facility for the SSL connection. + -- Typically this will be a socket file descriptor. + + procedure Keep_Arrays (Ssl : WolfSSL_Type) with + Pre => Is_Valid (Ssl); + -- Normally, at the end of the SSL handshake, wolfSSL frees + -- temporary arrays. Calling this function before the handshake + -- begins will prevent wolfSSL from freeing temporary arrays. + -- Temporary arrays may be needed for things such as + -- wolfSSL_get_keys() or PSK hints. When the user is done with + -- temporary arrays, either Free_Arrays(..) may be called to free + -- the resources immediately, or alternatively the resources will + -- be freed when the associated SSL object is freed. + + procedure Free_Arrays (Ssl : WolfSSL_Type) with + Pre => Is_Valid (Ssl); + -- Normally, at the end of the SSL handshake, wolfSSL frees temporary + -- arrays. If Keep_Arrays(..) has been called before the handshake, + -- wolfSSL will not free temporary arrays. This function explicitly + -- frees temporary arrays and should be called when the user is done + -- with temporary arrays and does not want to wait for the SSL object + -- to be freed to free these resources. + + function Accept_Connection (Ssl : WolfSSL_Type) + return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- The name of this function is not Accept (..) because the word + -- "accept" is a reserved keyword in the Ada language. + -- + -- This function is called on the server side and waits for an + -- SSL client to initiate the SSL/TLS handshake. When this function + -- is called, the underlying communication channel has already been + -- set up. This function works with both blocking and + -- non-blocking I/O. When the underlying I/O is non-blocking, + -- Accept_Connection (..) will return when the underlying I/O could + -- not satisfy the needs of Accept_Connection (..) to continue + -- the handshake. In this case, a call to Get_Error(..) will + -- yield either Error_Want_Read or Error_Want_Write. + -- The calling process must then repeat the call to + -- Accept_Connection (..) when data is available to read and + -- wolfSSL will pick up where it left off. When using a + -- non_blocking socket, nothing needs to be done, but select() can + -- be used to check for the required condition. + -- If the underlying I/O is blocking, Accept_Connection (..) will + -- only return once the handshake has been finished or + -- an error occurred. + + -- This record type has discriminants with default values to be able + -- to compile this code under the restriction No Secondary Stack. + type Read_Result (Success : Boolean := False; + Last : Byte_Index := Byte_Index'Last) is record + case Success is + when True => Buffer : Byte_Array (1 .. Last); + when False => Code : Subprogram_Result; -- Error code + end case; + end record; + + function Read (Ssl : WolfSSL_Type) return Read_Result with + Pre => Is_Valid (Ssl); + -- This function reads a number of bytes from the SSL session (ssl) + -- internal read buffer into the buffer data. The bytes read are + -- removed from the internal receive buffer. + -- If necessary Read(..) will negotiate an SSL/TLS session + -- if the handshake has not already + -- been performed yet by Connect(..) or Accept_Connection (..). + -- The SSL/TLS protocol uses SSL records which have a maximum size + -- of 16kB (the max record size can be controlled by the + -- MAX_RECORD_SIZE define in /wolfssl/internal.h). As such, wolfSSL + -- needs to read an entire SSL record internally before it is able + -- to process and decrypt the record. Because of this, a call to + -- Read(..) will only be able to return the maximum buffer + -- size which has been decrypted at the time of calling. There may + -- be additional not-yet-decrypted data waiting in the internal + -- wolfSSL receive buffer which will be retrieved and decrypted with + -- the next call to Read(..). + + -- This record type has discriminants with default values to be able + -- to compile this code under the restriction No Secondary Stack. + type Write_Result (Success : Boolean := False) is record + case Success is + when True => Bytes_Written : Byte_Index; + when False => Code : Subprogram_Result; -- Error code + end case; + end record; + + function Write (Ssl : WolfSSL_Type; + Data : Byte_Array) return Write_Result with + Pre => Is_Valid (Ssl); + -- The number of bytes written is returned. + -- This function writes bytes from the buffer, Data, + -- to the SSL connection, ssl. If necessary, Write(..) will + -- negotiate an SSL/TLS session if the handshake has not already + -- been performed yet by Connect(..) or Accept_Connection(..). + -- Write(..) works with both blocking and non-blocking I/O. + -- When the underlying I/O is non-blocking, Write(..) will return + -- when the underlying I/O could not satisfy the needs of Write(..) + -- to continue. In this case, a call to Get_Error(..) will + -- yield either Error_Want_Read or Error_Want_Write. + -- The calling process must then repeat the call to Write(..) + -- when the underlying I/O is ready. If the underlying I/O is + -- blocking, Write(..) will only return once the buffer data + -- has been completely written or an error occurred. + + function Shutdown (Ssl : WolfSSL_Type) return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- This function shuts down an active SSL/TLS connection using + -- the SSL session, ssl. This function will try to send a + -- "close notify" alert to the peer. The calling application can + -- choose to wait for the peer to send its "close notify" alert + -- in response or just go ahead and shut down the underlying + -- connection after directly calling wolfSSL_shutdown (to save + -- resources). Either option is allowed by the TLS specification. + -- If the underlying connection will be used again in the future, + -- the complete two_directional shutdown procedure must be performed + -- to keep synchronization intact between the peers. + -- Shutdown(..) works with both blocking and non_blocking I/O. + -- When the underlying I/O is non_blocking, Shutdown(..) will + -- return an error if the underlying I/O could not satisfy the needs + -- of Shutdown(..) to continue. In this case, a call to + -- Get_Error(..) will yield either Error_Want_Read or + -- Error_Want_Write. The calling process must then repeat + -- the call to Shutdown() when the underlying I/O is ready. + + procedure Free (Ssl : in out WolfSSL_Type) with + Pre => Is_Valid (Ssl), + Post => not Is_Valid (Ssl); + -- Frees the resources allocated by the SSL session object. + + function Connect (Ssl : WolfSSL_Type) return Subprogram_Result with + Pre => Is_Valid (Ssl); + -- This function is called on the client side and initiates + -- an SSL/TLS handshake with a server. When this function is called, + -- the underlying communication channel has already been set up. + -- Connect(..) works with both blocking and non_blocking I/O. + -- When the underlying I/O is non_blocking, Connect(..) will + -- return when the underlying I/O could not satisfy the needs + -- of wolfSSL_connect to continue the handshake. In this case, + -- a call to Get_Error(..) will yield either + -- Error_Want_Read or SSL_ERROR_WANT_WRITE. The calling process + -- must then repeat the call to Connect(..) when + -- the underlying I/O is ready and wolfSSL will pick up where + -- it left off. When using a non_blocking socket, nothing needs + -- to be done, but select() can be used to check for the required + -- condition. If the underlying I/O is blocking, Connect(..) + -- will only return once the handshake has been finished or an error + -- occurred. wolfSSL takes a different approach to certificate + -- verification than OpenSSL does. The default policy for the client + -- is to verify the server, this means that if you don't load CAs + -- to verify the server you'll get a connect error, + -- unable to verify. It you want to mimic OpenSSL behavior + -- of having SSL_connect succeed even if verifying the server fails + -- and reducing security you can do this by calling: + -- Set_Verify (Ctx, Verify_None, 0); before calling + -- Create_WolfSSL(...); Though it's not recommended. + + type Error_Code is new Integer; + + Error_Want_Read : constant Error_Code; + Error_Want_Write : constant Error_Code; + + function Get_Error (Ssl : WolfSSL_Type; + Result : Subprogram_Result) return Error_Code; + -- This function returns a unique error code describing why + -- the previous API function call (Connect, Accept_Connection, + -- Read, Write, etc.) resulted in an error return code. + -- After Get_Error is called and returns the unique error code, + -- wolfSSL_ERR_error_string() may be called to get a human readable + -- error string. + + subtype Error_Message_Index is Natural range 0 .. 80; + -- The default error message length is 80 in WolfSSL unless + -- configured to another value. See the result + -- of the Max_Error_Size function. + + type Error_Message (Last : Error_Message_Index := 0) is record + Text : String (1 .. Last); + end record; + + function Error (Code : Error_Code) return Error_Message; + -- This function converts an error code returned by Get_Error(..) + -- into a more human readable error string. Code is the error code + -- returned by Get_error(). The maximum length of error strings is + -- 80 characters by default, as defined by MAX_ERROR_SZ + -- is wolfssl/wolfcrypt/error.h. + + function Max_Error_Size return Natural; + -- Returns the value of the defined MAX_ERROR_SZ integer + -- in wolfssl/wolfcrypt/error.h. + +private + pragma SPARK_Mode (Off); + + subtype int is Interfaces.C.int; use type int; + + type Opaque_Method is limited null record; + type Opaque_Context is limited null record; + type Opaque_WolfSSL is limited null record; + + -- Access-to-object types with convention C uses the same amount of + -- memory for storing pointers as is done in the C programming + -- language. The following access type definitions are used in + -- the Ada binding to the WolfSSL library: + type Context_Type is access Opaque_Context with Convention => C; + type Method_Type is access Opaque_Method with Convention => C; + type WolfSSL_Type is access Opaque_WolfSSL with Convention => C; + + subtype Unsigned_32 is Interfaces.Unsigned_32; use type Unsigned_32; + + type Mode_Type is new Unsigned_32; + + -- The following imported subprograms are used to initialize + -- the constants defined in the public part of this package + -- specification. They cannot therefore be moved to the body + -- of this package. + + function WolfSSL_Verify_None return int with + Convention => C, + External_Name => "get_wolfssl_verify_none", + Import => True; + + function WolfSSL_Verify_Peer return int with + Convention => C, + External_Name => "get_wolfssl_verify_peer", + Import => True; + + function WolfSSL_Verify_Fail_If_No_Peer_Cert return int with + Convention => C, + External_Name => "get_wolfssl_verify_fail_if_no_peer_cert", + Import => True; + + function WolfSSL_Verify_Client_Once return int with + Convention => C, + External_Name => "get_wolfssl_verify_client_once", + Import => True; + + function WolfSSL_Verify_Post_Handshake return int with + Convention => C, + External_Name => "get_wolfssl_verify_post_handshake", + Import => True; + + function WolfSSL_Verify_Fail_Except_Psk return int with + Convention => C, + External_Name => "get_wolfssl_verify_fail_except_psk", + Import => True; + + function WolfSSL_Verify_Default return int with + Convention => C, + External_Name => "get_wolfssl_verify_default", + Import => True; + + Verify_None : constant Mode_Type := Mode_Type (WolfSSL_Verify_None); + Verify_Peer : constant Mode_Type := Mode_Type (WolfSSL_Verify_Peer); + + Verify_Fail_If_No_Peer_Cert : constant Mode_Type := + Mode_Type (WolfSSL_Verify_Fail_If_No_Peer_Cert); + + Verify_Client_Once : constant Mode_Type := + Mode_Type (WolfSSL_Verify_Client_Once); + + Verify_Post_Handshake : constant Mode_Type := + Mode_Type (WolfSSL_Verify_Post_Handshake); + + Verify_Fail_Except_Psk : constant Mode_Type := + Mode_Type (WolfSSL_Verify_Fail_Except_Psk); + + Verify_Default : constant Mode_Type := + Mode_Type (WolfSSL_Verify_Default); + + type File_Format is new Unsigned_32; + + function WolfSSL_Filetype_Asn1 return int with + Convention => C, + External_Name => "get_wolfssl_filetype_asn1", + Import => True; + + function WolfSSL_Filetype_Pem return int with + Convention => C, + External_Name => "get_wolfssl_filetype_pem", + Import => True; + + function WolfSSL_Filetype_Default return int with + Convention => C, + External_Name => "get_wolfssl_filetype_default", + Import => True; + + Format_Asn1 : constant File_Format := + File_Format (WolfSSL_Filetype_Asn1); + + Format_Pem : constant File_Format := + File_Format (WolfSSL_Filetype_Pem); + + Format_Default : constant File_Format := + File_Format (WolfSSL_Filetype_Default); + + function Get_WolfSSL_Success return int with + Convention => C, + External_Name => "get_wolfssl_success", + Import => True; + + function Get_WolfSSL_Failure return int with + Convention => C, + External_Name => "get_wolfssl_failure", + Import => True; + + Success : constant Subprogram_Result := + Subprogram_Result (Get_WolfSSL_Success); + + Failure : constant Subprogram_Result := + Subprogram_Result (Get_WolfSSL_Failure); + + function Get_WolfSSL_Error_Want_Read return int with + Convention => C, + External_Name => "get_wolfssl_error_want_read", + Import => True; + + function Get_WolfSSL_Error_Want_Write return int with + Convention => C, + External_Name => "get_wolfssl_error_want_write", + Import => True; + + Error_Want_Read : constant Error_Code := + Error_Code (Get_WolfSSL_Error_Want_Read); + + Error_Want_Write : constant Error_Code := + Error_Code (Get_WolfSSL_Error_Want_Write); + +end WolfSSL; diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/README.md 2024-08-03 07:30:01.000000000 +0000 @@ -20,15 +20,17 @@ to build the wrapper library and examples. It includes the wolfSSL Visual Studio project directly. -## Linux (using Mono) +## Linux (Ubuntu) using mono Prerequisites for linux: ``` -apt install mono-tools-devel +apt-get update +apt-get upgrade +apt-get install mono-complete ``` -Build wolfSSL and install: +### Build wolfSSL and install ``` ./autogen.sh @@ -38,24 +40,52 @@ sudo make install ``` -Build and run the wrapper: +### Build and run the wrapper + +From the wolfssl root directory: ``` cd wrapper/CSharp +``` + +Compile server: -csc wolfSSL_CSharp/wolfSSL.cs wolfSSL_CSharp/X509.cs \ - wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs +``` +mcs wolfSSL_CSharp/wolfSSL.cs wolfSSL_CSharp/X509.cs \ +wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs -OUT:server.exe +``` -Run the example: +Compile client: ``` -cp wolfSSL-TLS-Server.exe ../../certs -cd ../../certs +mcs wolfSSL_CSharp/wolfSSL.cs wolfSSL_CSharp/X509.cs \ +wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs -OUT:client.exe +``` + +### Run the example + +In one terminal instance run the server: + +``` +mono server.exe +``` -mono wolfSSL-TLS-Server.exe +And in another terminal instance run the client: -Calling ctx Init from wolfSSL -Finished init of ctx .... now load in cert and key -Ciphers : TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-OLD:ECDHE-ECDSA-CHACHA20-POLY1305-OLD:DHE-RSA-CHACHA20-POLY1305-OLD -Started TCP and waiting for a connection +``` +mono client.exe +``` + +### Enabling SNI + +To enable SNI, just pass the `-S` argument with the specified hostname to the client: + +``` +mono client.exe -S hostname +``` + +And run the server with the `-S` flag: + +``` +mono server.exe -S ``` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-PSK-Server/wolfSSL-DTLS-PSK-Server.cs 2024-08-03 07:30:01.000000000 +0000 @@ -78,9 +78,14 @@ IntPtr ssl; /* These paths should be changed according to use */ - string fileCert = @"server-cert.pem"; - string fileKey = @"server-key.pem"; - StringBuilder dhparam = new StringBuilder("dh2048.pem"); + string fileCert = wolfssl.setPath("server-cert.pem"); + string fileKey = wolfssl.setPath("server-key.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + + if (fileCert == "" || fileKey == "" || dhparam.Length == 0) { + Console.WriteLine("Platform not supported"); + return; + } wolfssl.psk_delegate psk_cb = new wolfssl.psk_delegate(my_psk_server_cb); @@ -105,6 +110,12 @@ wolfssl.CTX_free(ctx); return; } + + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } if (wolfssl.CTX_use_certificate_file(ctx, fileCert, wolfssl.SSL_FILETYPE_PEM) != wolfssl.SUCCESS) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-DTLS-Server/wolfSSL-DTLS-Server.cs 2024-08-03 07:30:01.000000000 +0000 @@ -58,9 +58,14 @@ IntPtr ssl; /* These paths should be changed for use */ - string fileCert = @"server-cert.pem"; - string fileKey = @"server-key.pem"; - StringBuilder dhparam = new StringBuilder("dh2048.pem"); + string fileCert = wolfssl.setPath("server-cert.pem"); + string fileKey = wolfssl.setPath(@"server-key.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + + if (fileCert == "" || fileKey == "" || dhparam.Length == 0) { + Console.WriteLine("Platform not supported"); + return; + } StringBuilder buff = new StringBuilder(1024); StringBuilder reply = new StringBuilder("Hello, this is the wolfSSL C# wrapper"); @@ -86,6 +91,12 @@ wolfssl.CTX_free(ctx); return; } + + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } if (wolfssl.CTX_use_certificate_file(ctx, fileCert, wolfssl.SSL_FILETYPE_PEM) != wolfssl.SUCCESS) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-Example-IOCallbacks/wolfSSL-Example-IOCallbacks.cs 2024-08-03 07:30:01.000000000 +0000 @@ -214,12 +214,17 @@ IntPtr ssl; Socket fd; - wolfssl.psk_delegate psk_cb = new wolfssl.psk_delegate(my_psk_server_cb); wolfssl.CallbackVerify_delegate verify_cb = new wolfssl.CallbackVerify_delegate(my_verify_cb); /* These paths should be changed according to use */ - string fileCert = @"server-cert.pem"; - string fileKey = @"server-key.pem"; + string fileCert = wolfssl.setPath("server-cert.pem"); + string fileKey = wolfssl.setPath("server-key.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + + if (fileCert == "" || fileKey == "" || dhparam.Length == 0) { + Console.WriteLine("Platform not supported"); + return; + } StringBuilder buff = new StringBuilder(1024); StringBuilder reply = new StringBuilder("Hello, this is the wolfSSL C# wrapper"); @@ -241,6 +246,12 @@ wolfssl.CTX_free(ctx); return; } + + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } if (wolfssl.CTX_use_certificate_file(ctx, fileCert, wolfssl.SSL_FILETYPE_PEM) != wolfssl.SUCCESS) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Client/wolfSSL-TLS-Client.cs 2024-08-03 07:30:01.000000000 +0000 @@ -19,7 +19,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ - using System; using System.Runtime.InteropServices; using System.Text; @@ -60,15 +59,39 @@ return preverify; } + /// + /// Checks if the SNI option was enabled via command line. + /// Must be enabled with ./configure --enable-sni when configuring + /// wolfSSL. + /// Parameters passed via command line + /// + private static int haveSNI(string[] args) + { + for (int i = 0; i < args.Length; i++) { + if (args[i] == "-S") { + Console.WriteLine("SNI IS ON"); + return i+1; + } + } + Console.WriteLine("SNI IS OFF"); + return -1; + } + public static void Main(string[] args) { IntPtr ctx; IntPtr ssl; Socket tcp; + IntPtr sniHostName; /* These paths should be changed for use */ - string caCert = @"ca-cert.pem"; - StringBuilder dhparam = new StringBuilder("dh2048.pem"); + string caCert = wolfssl.setPath("ca-cert.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + + if (caCert == "" || dhparam.Length == 0) { + Console.WriteLine("Platform not supported."); + return; + } StringBuilder buff = new StringBuilder(1024); StringBuilder reply = new StringBuilder("Hello, this is the wolfSSL C# wrapper"); @@ -78,7 +101,6 @@ wolfssl.Init(); - Console.WriteLine("Calling ctx Init from wolfSSL"); ctx = wolfssl.CTX_new(wolfssl.usev23_client()); if (ctx == IntPtr.Zero) @@ -96,11 +118,34 @@ return; } + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } if (wolfssl.CTX_load_verify_locations(ctx, caCert, null) != wolfssl.SUCCESS) { Console.WriteLine("Error loading CA cert"); + wolfssl.CTX_free(ctx); + return; + } + + int sniArg = haveSNI(args); + if (sniArg >= 0) + { + string sniHostNameString = args[sniArg].Trim(); + sniHostName = Marshal.StringToHGlobalAnsi(sniHostNameString); + + ushort size = (ushort)sniHostNameString.Length; + + if (wolfssl.CTX_UseSNI(ctx, (byte)wolfssl.WOLFSSL_SNI_HOST_NAME, sniHostName, size) != wolfssl.SUCCESS) + { + Console.WriteLine("UseSNI failed"); + wolfssl.CTX_free(ctx); + return; + } } StringBuilder ciphers = new StringBuilder(new String(' ', 4096)); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Client/wolfSSL-TLS-PSK-Client.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Client/wolfSSL-TLS-PSK-Client.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Client/wolfSSL-TLS-PSK-Client.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Client/wolfSSL-TLS-PSK-Client.cs 2024-08-03 07:30:01.000000000 +0000 @@ -82,7 +82,11 @@ wolfssl.psk_client_delegate psk_cb = new wolfssl.psk_client_delegate(my_psk_client_cb); - StringBuilder dhparam = new StringBuilder("dh2048.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + if (dhparam.Length == 0) { + Console.WriteLine("Platform not supported"); + return; + } StringBuilder buff = new StringBuilder(1024); StringBuilder reply = new StringBuilder("Hello, this is the wolfSSL C# client psk wrapper"); @@ -157,6 +161,12 @@ return; } + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } + wolfssl.SetTmpDH_file(ssl, dhparam, wolfssl.SSL_FILETYPE_PEM); if (wolfssl.connect(ssl) != wolfssl.SUCCESS) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-PSK-Server/wolfSSL-TLS-PSK-Server.cs 2024-08-03 07:30:01.000000000 +0000 @@ -80,9 +80,14 @@ wolfssl.psk_delegate psk_cb = new wolfssl.psk_delegate(my_psk_server_cb); /* These paths should be changed according to use */ - string fileCert = @"server-cert.pem"; - string fileKey = @"server-key.pem"; - StringBuilder dhparam = new StringBuilder("dh2048.pem"); + string fileCert = wolfssl.setPath("server-cert.pem"); + string fileKey = wolfssl.setPath("server-key.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + + if (fileCert == "" || fileKey == "" || dhparam.Length == 0) { + Console.WriteLine("Platform not supported"); + return; + } StringBuilder buff = new StringBuilder(1024); StringBuilder reply = new StringBuilder("Hello, this is the wolfSSL C# wrapper"); @@ -104,6 +109,12 @@ wolfssl.CTX_free(ctx); return; } + + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } if (wolfssl.CTX_use_certificate_file(ctx, fileCert, wolfssl.SSL_FILETYPE_PEM) != wolfssl.SUCCESS) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs 2024-08-03 07:30:01.000000000 +0000 @@ -19,9 +19,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA */ - - - using System; using System.Runtime.InteropServices; using System.Text; @@ -50,17 +47,55 @@ wolfssl.Cleanup(); } + /// + /// Checks if the SNI option was enabled via command line. + /// Must be enabled with ./configure --enable-sni when configuring + /// wolfSSL. + /// Parameters passed via command line + /// + private static bool haveSNI(string[] args) + { + bool sniON = false; + for (int i = 0; i < args.Length; i++) { + if (args[i] == "-S") { + sniON = true; + break; + } + } + Console.WriteLine("SNI IS: " + sniON); + return sniON; + } + + /// + /// Example of a SNI function call back + /// + /// pointer to ssl structure + /// alert code + /// context arg, can be set with the function wolfssl.CTX_set_servername_arg + /// + public static int my_sni_server_cb(IntPtr ssl, IntPtr ret, IntPtr exArg) { + /* Trivial callback just for testing */ + Console.WriteLine("my sni server callback"); + + return 0; + } public static void Main(string[] args) { IntPtr ctx; IntPtr ssl; Socket fd; + IntPtr arg_sni; /* These paths should be changed for use */ - string fileCert = @"server-cert.pem"; - string fileKey = @"server-key.pem"; - StringBuilder dhparam = new StringBuilder("dh2048.pem"); + string fileCert = wolfssl.setPath("server-cert.pem"); + string fileKey = wolfssl.setPath("server-key.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + + if (fileCert == "" || fileKey == "" || dhparam.Length == 0) { + Console.WriteLine("Platform not supported."); + return; + } StringBuilder buff = new StringBuilder(1024); StringBuilder reply = new StringBuilder("Hello, this is the wolfSSL C# wrapper"); @@ -70,7 +105,6 @@ wolfssl.Init(); - Console.WriteLine("Calling ctx Init from wolfSSL"); ctx = wolfssl.CTX_new(wolfssl.usev23_server()); if (ctx == IntPtr.Zero) @@ -87,6 +121,12 @@ return; } + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } + if (wolfssl.CTX_use_certificate_file(ctx, fileCert, wolfssl.SSL_FILETYPE_PEM) != wolfssl.SUCCESS) { Console.WriteLine("Error in setting cert file"); @@ -101,7 +141,6 @@ return; } - StringBuilder ciphers = new StringBuilder(new String(' ', 4096)); wolfssl.get_ciphers(ciphers, 4096); Console.WriteLine("Ciphers : " + ciphers.ToString()); @@ -116,6 +155,7 @@ Console.WriteLine("Started TCP and waiting for a connection"); fd = tcp.AcceptSocket(); + ssl = wolfssl.new_ssl(ctx); if (ssl == IntPtr.Zero) { @@ -124,6 +164,23 @@ return; } + if (haveSNI(args)) + { + // Allocating memory and setting SNI arg + int test_value = 32; + arg_sni = Marshal.AllocHGlobal(sizeof(int)); + Marshal.WriteInt32(arg_sni, test_value); + if (wolfssl.CTX_set_servername_arg(ctx, arg_sni) == wolfssl.FAILURE) { + Console.WriteLine("wolfssl.CTX_set_servername_arg failed"); + wolfssl.CTX_free(ctx); + return; + } + + // Setting SNI delegate + wolfssl.sni_delegate sni_cb = new wolfssl.sni_delegate(my_sni_server_cb); + wolfssl.CTX_set_servername_callback(ctx, sni_cb); + } + Console.WriteLine("Connection made wolfSSL_accept "); if (wolfssl.set_fd(ssl, fd) != wolfssl.SUCCESS) { @@ -134,7 +191,14 @@ return; } - wolfssl.SetTmpDH_file(ssl, dhparam, wolfssl.SSL_FILETYPE_PEM); + if (wolfssl.SetTmpDH_file(ssl, dhparam, wolfssl.SSL_FILETYPE_PEM) != wolfssl.SUCCESS) + { + Console.WriteLine("Error in setting dh2048Pem"); + Console.WriteLine(wolfssl.get_error(ssl)); + tcp.Stop(); + clean(ssl, ctx); + return; + } if (wolfssl.accept(ssl) != wolfssl.SUCCESS) { @@ -145,6 +209,16 @@ return; } + /* get and print sni used by the client */ + if (haveSNI(args)) { + IntPtr data = IntPtr.Zero; + + ushort size = wolfssl.SNI_GetRequest(ssl, 0, ref data); + string dataStr = Marshal.PtrToStringAnsi(data); + Console.WriteLine("(SNI_GetRequest) Size of SNI used by client: " + size); + Console.WriteLine("(SNI_GetRequest) SNI used by client: " + dataStr); + } + /* print out results of TLS/SSL accept */ Console.WriteLine("SSL version is " + wolfssl.get_version(ssl)); Console.WriteLine("SSL cipher suite is " + wolfssl.get_current_cipher(ssl)); @@ -159,6 +233,45 @@ } Console.WriteLine(buff); + /* get and print sni from a sample buffer, can be used by using the raw client hello */ + if (haveSNI(args)) { + IntPtr result = Marshal.AllocHGlobal(32); + IntPtr inOutSz = Marshal.AllocHGlobal(sizeof(int)); + Marshal.WriteInt32(inOutSz, 32); + byte []buffer = { /* from TextMate website client hello example */ + 0x16, 0x03, 0x01, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xc2, 0x03, 0x03, 0x52, + 0x8b, 0x7b, 0xca, 0x69, 0xec, 0x97, 0xd5, 0x08, 0x03, 0x50, 0xfe, 0x3b, + 0x99, 0xc3, 0x20, 0xce, 0xa5, 0xf6, 0x99, 0xa5, 0x71, 0xf9, 0x57, 0x7f, + 0x04, 0x38, 0xf6, 0x11, 0x0b, 0xb8, 0xd3, 0x00, 0x00, 0x5e, 0x00, 0xff, + 0xc0, 0x24, 0xc0, 0x23, 0xc0, 0x0a, 0xc0, 0x09, 0xc0, 0x07, 0xc0, 0x08, + 0xc0, 0x28, 0xc0, 0x27, 0xc0, 0x14, 0xc0, 0x13, 0xc0, 0x11, 0xc0, 0x12, + 0xc0, 0x26, 0xc0, 0x25, 0xc0, 0x2a, 0xc0, 0x29, 0xc0, 0x05, 0xc0, 0x04, + 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x0f, 0xc0, 0x0e, 0xc0, 0x0c, 0xc0, 0x0d, + 0x00, 0x3d, 0x00, 0x3c, 0x00, 0x2f, 0x00, 0x05, 0x00, 0x04, 0x00, 0x35, + 0x00, 0x0a, 0x00, 0x67, 0x00, 0x6b, 0x00, 0x33, 0x00, 0x39, 0x00, 0x16, + 0x00, 0xaf, 0x00, 0xae, 0x00, 0x8d, 0x00, 0x8c, 0x00, 0x8a, 0x00, 0x8b, + 0x00, 0xb1, 0x00, 0xb0, 0x00, 0x2c, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x3b, + 0x00, 0x00, 0x00, 0x15, 0x00, 0x13, 0x00, 0x00, 0x10, 0x61, 0x70, 0x69, + 0x2e, 0x74, 0x65, 0x78, 0x74, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x6f, 0x72, + 0x67, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x17, 0x00, 0x18, 0x00, + 0x19, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x0c, 0x00, + 0x0a, 0x05, 0x01, 0x04, 0x01, 0x02, 0x01, 0x04, 0x03, 0x02, 0x03 + }; + + int ret = wolfssl.SNI_GetFromBuffer(buffer, 1024, 0, result, inOutSz); + + if (ret != wolfssl.SUCCESS) { + Console.WriteLine("Error on reading SNI from buffer, ret value = " + ret); + tcp.Stop(); + clean(ssl, ctx); + return; + } + + string resultStr = Marshal.PtrToStringAnsi(result); + Console.WriteLine("(SNI_GetFromBuffer) SNI used by client: " + resultStr); + + } + if (wolfssl.write(ssl, reply, reply.Length) != reply.Length) { Console.WriteLine("Error in write"); @@ -170,6 +283,7 @@ wolfssl.shutdown(ssl); fd.Close(); tcp.Stop(); + clean(ssl, ctx); } } diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL-TLS-ServerThreaded/wolfSSL-TLS-ServerThreaded.cs 2024-08-03 07:30:01.000000000 +0000 @@ -116,9 +116,14 @@ IntPtr ctx; /* These paths should be changed for use */ - string fileCert = @"server-cert.pem"; - string fileKey = @"server-key.pem"; - StringBuilder dhparam = new StringBuilder("dh2048.pem"); + string fileCert = wolfssl.setPath("server-cert.pem"); + string fileKey = wolfssl.setPath("server-key.pem"); + StringBuilder dhparam = new StringBuilder(wolfssl.setPath("dh2048.pem")); + + if (fileCert == "" || fileKey == "" || dhparam.Length == 0) { + Console.WriteLine("Platform not supported"); + return; + } /* example of function used for setting logging */ wolfssl.SetLogging(standard_log); @@ -139,6 +144,12 @@ wolfssl.CTX_free(ctx); return; } + + if (!File.Exists(dhparam.ToString())) { + Console.WriteLine("Could not find dh file"); + wolfssl.CTX_free(ctx); + return; + } if (wolfssl.CTX_use_certificate_file(ctx, fileCert, wolfssl.SSL_FILETYPE_PEM) != wolfssl.SUCCESS) { diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs 2024-08-03 07:30:01.000000000 +0000 @@ -59,6 +59,8 @@ private GCHandle rec_cb; private GCHandle snd_cb; private GCHandle psk_cb; + private GCHandle sni_cb; + private GCHandle sni_arg; private GCHandle vrf_cb; private IntPtr ctx; @@ -89,6 +91,22 @@ return this.psk_cb; } + public void set_sni(GCHandle input) { + this.sni_cb = input; + } + + public GCHandle get_sni(GCHandle input) { + return this.sni_cb; + } + + public void set_arg(GCHandle input) { + this.sni_arg= input; + } + + public GCHandle get_arg(GCHandle input) { + return this.sni_arg; + } + public void set_vrf(GCHandle input) { if (!Object.Equals(this.vrf_cb, default(GCHandle))) @@ -129,6 +147,10 @@ { this.psk_cb.Free(); } + if (!Object.Equals(this.sni_cb, default(GCHandle))) + { + this.sni_cb.Free(); + } if (!Object.Equals(this.vrf_cb, default(GCHandle))) { this.vrf_cb.Free(); @@ -144,6 +166,7 @@ { private GCHandle fd_pin; private GCHandle psk_cb; + private GCHandle sni_cb; private GCHandle vrf_cb; private IntPtr ssl; @@ -198,6 +221,10 @@ { this.psk_cb.Free(); } + if (!Object.Equals(this.sni_cb, default(GCHandle))) + { + this.sni_cb.Free(); + } if (!Object.Equals(this.vrf_cb, default(GCHandle))) { this.vrf_cb.Free(); @@ -290,6 +317,23 @@ [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] private extern static int wolfSSL_CTX_use_psk_identity_hint(IntPtr ctx, StringBuilder identity); + /******************************** + * SNI + */ + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate int sni_delegate(IntPtr ssl, IntPtr ret, IntPtr exArg); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static void wolfSSL_CTX_set_servername_callback(IntPtr ctx, sni_delegate sni_cb); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wolfSSL_CTX_set_servername_arg(IntPtr ctx, IntPtr arg); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wolfSSL_CTX_UseSNI(IntPtr ctx, byte type, IntPtr data, ushort size); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wolfSSL_UseSNI(IntPtr ssl, byte type, IntPtr data, ushort size); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static ushort wolfSSL_SNI_GetRequest(IntPtr ssl, byte type, ref IntPtr data); + [DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)] + private extern static int wolfSSL_SNI_GetFromBuffer(byte[] clientHello, uint helloSz, byte type, IntPtr sni, IntPtr inOutSz); /******************************** * SSL Structure @@ -417,6 +461,7 @@ public static readonly int SUCCESS = 1; public static readonly int FAILURE = 0; + public static readonly int WOLFSSL_SNI_HOST_NAME = 0; private static IntPtr unwrap_ctx(IntPtr ctx) @@ -444,6 +489,26 @@ } } + /// + /// Utility function used to access the certificates + /// based on the platform. + /// return the platform specific path to the certificate + /// + public static string setPath(string file) { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Console.WriteLine("Linux - " + file); + return @"../../certs/" + file; + } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Console.WriteLine("Windows - " + file); + return @"../../../../certs/" + file; + } else + { + return ""; + } + } + /// /// Call back to allow receiving TLS information @@ -725,7 +790,7 @@ int ret; byte[] msg; - buf.Clear(); /* Clear incomming buffer */ + buf.Clear(); /* Clear incoming buffer */ if (sslCtx == IntPtr.Zero) { @@ -1084,6 +1149,83 @@ } } + public static void CTX_set_servername_callback(IntPtr ctx, sni_delegate sni_cb) + { + try { + GCHandle gch = GCHandle.FromIntPtr(ctx); + ctx_handle handles = (ctx_handle)gch.Target; + + handles.set_sni(GCHandle.Alloc(sni_cb)); + + wolfSSL_CTX_set_servername_callback(handles.get_ctx(), sni_cb); + } catch (Exception e) { + log(ERROR_LOG, "wolfssl servername callback error: " + e.ToString()); + } + } + + public static int CTX_set_servername_arg(IntPtr ctx, IntPtr arg) + { + try { + GCHandle gch = GCHandle.FromIntPtr(ctx); + ctx_handle handles = (ctx_handle)gch.Target; + + handles.set_arg(GCHandle.Alloc(arg)); + + return wolfSSL_CTX_set_servername_arg(handles.get_ctx(), arg); + } catch (Exception e) { + log(ERROR_LOG, "wolfssl arg servername callback error: " + e.ToString()); + return FAILURE; + } + } + + public static int CTX_UseSNI(IntPtr ctx, byte type, IntPtr data, ushort size) + { + try { + GCHandle gch = GCHandle.FromIntPtr(ctx); + ctx_handle handles = (ctx_handle)gch.Target; + + return wolfSSL_CTX_UseSNI(handles.get_ctx(), type, data, size); + } catch (Exception e) { + log(ERROR_LOG, "wolfssl ctx use sni error: " + e.ToString()); + return FAILURE; + } + } + + public static int UseSNI(IntPtr ssl, byte type, IntPtr data, ushort size) + { + try { + GCHandle gch = GCHandle.FromIntPtr(ssl); + ssl_handle handles = (ssl_handle)gch.Target; + + return wolfSSL_UseSNI(handles.get_ssl(), type, data, size); + } catch (Exception e) { + log(ERROR_LOG, "wolfssl use sni error: " + e.ToString()); + return FAILURE; + } + } + + public static ushort SNI_GetRequest(IntPtr ssl, byte type, ref IntPtr data) + { + try { + GCHandle gch = GCHandle.FromIntPtr(ssl); + ssl_handle handles = (ssl_handle)gch.Target; + + return wolfSSL_SNI_GetRequest(handles.get_ssl(), type, ref data); + } catch (Exception e) { + log(ERROR_LOG, "wolfssl sni get request error: " + e.ToString()); + return ushort.MaxValue; + } + } + + public static int SNI_GetFromBuffer(byte []clientHello, uint helloSz, byte type, IntPtr sni, IntPtr inOutSz) + { + try { + return wolfSSL_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz); + } catch(Exception e) { + log(ERROR_LOG, "wolfssl sni get from buffer error: " + e.ToString()); + return FAILURE; + } + } /// /// Set identity hint to use @@ -1760,7 +1902,7 @@ /// Used to load in the private key from a file /// /// CTX structure for TLS/SSL connections - /// Name of the file, includeing absolute directory + /// Name of the file, including absolute directory /// Type of file ie PEM or DER /// 1 on success public static int CTX_use_PrivateKey_file(IntPtr ctx, string fileKey, int type) diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/wrapper/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/wrapper/include.am 2024-08-03 07:30:01.000000000 +0000 @@ -2,6 +2,7 @@ # included from Top Level Makefile.am # All paths should be given relative to the root +include wrapper/Ada/include.am include wrapper/CSharp/include.am EXTRA_DIST+= wrapper/python/README.md diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/CMakeLists.txt mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/CMakeLists.txt --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/CMakeLists.txt 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/CMakeLists.txt 2024-08-03 07:30:01.000000000 +0000 @@ -1,20 +1,26 @@ if(CONFIG_WOLFSSL) zephyr_interface_library_named(wolfSSL) - + if(CONFIG_WOLFSSL_BUILTIN) - target_compile_definitions(wolfSSL INTERFACE - WOLFSSL_SETTINGS_FILE="${CONFIG_WOLFSSL_SETTINGS_FILE}" - ) - + if(CONFIG_WOLFSSL_SETTINGS_FILE) + target_compile_definitions(wolfSSL INTERFACE + WOLFSSL_SETTINGS_FILE="${CONFIG_WOLFSSL_SETTINGS_FILE}" + ) + zephyr_include_directories( + ${APPLICATION_CONFIG_DIR} + ${APPLICATION_CONFIG_DIR}/src + ) + endif() + zephyr_include_directories( ${ZEPHYR_CURRENT_MODULE_DIR} ${ZEPHYR_CURRENT_MODULE_DIR}/wolfssl ${ZEPHYR_CURRENT_MODULE_DIR}/zephyr ) - + zephyr_library() zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/zephyr/zephyr_init.c) - + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/src/crl.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/src/dtls13.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/src/internal.c) @@ -25,8 +31,29 @@ zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/src/tls.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/src/tls13.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/src/wolfio.c) - + + # FIPS Boundary + if(CONFIG_WOLFCRYPT_FIPS) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wolfcrypt_first.c) + endif() + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/hmac.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/random.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/kdf.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/rsa.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ecc.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/aes.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha256.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha512.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha3.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/dh.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/cmac.c) + if(CONFIG_WOLFCRYPT_FIPS) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fips.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fips_test.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wolfcrypt_last.c) + endif() + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/arc4.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/asm.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/asn.c) @@ -36,7 +63,6 @@ zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/camellia.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/chacha.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/chacha20_poly1305.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/cmac.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/coding.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/compress.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/cpuid.c) @@ -44,27 +70,23 @@ zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/curve25519.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/curve448.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/des3.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/dh.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/dilithium.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/dsa.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ecc.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ecc_fp.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/eccsi.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ed25519.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ed448.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/error.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ext_kyber.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/falcon.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fe_448.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fe_low_mem.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fe_operations.c) - #zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fips.c) - #zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/fips_test.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ge_448.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ge_low_mem.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ge_operations.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/hash.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/hmac.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/integer.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/kdf.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/logging.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/md2.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/md4.c) @@ -75,15 +97,9 @@ zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/pkcs7.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/poly1305.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/pwdbased.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/random.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/ripemd.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/rsa.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sakke.c) #zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/selftest.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha256.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha3.c) - zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha512.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/signature.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/siphash.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sp_arm32.c) @@ -95,37 +111,72 @@ zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sp_dsp32.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sp_int.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sp_x86_64.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sphincs.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/srp.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/tfm.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_dsp.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_encrypt.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_pkcs11.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wc_port.c) - #zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wolfcrypt_first.c) - #zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wolfcrypt_last.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wolfevent.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/wolfmath.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/liboqs/liboqs.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/psa/psa.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/psa/psa_aes.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/psa/psa_hash.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/psa/psa_pkcbs.c) zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/st/stm32.c) - + + if(CONFIG_WOLFCRYPT_ARMASM) + # tested with board: "qemu_kvm_arm64" + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-aes.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-32-aes-asm_c.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-sha256.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-sha512.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-sha512-asm_c.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-sha3-asm_c.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-poly1305.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-chacha.c) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/port/arm/armv8-curve25519_c.c) + + # Note: The cmake/gcc-m-cpu.cmake make need updated to add "+crypto -mstrict-align" + set(TOOLCHAIN_C_FLAGS "-mcpu=cortex-a53+crypto -mstrict-align") + endif() + + if(CONFIG_WOLFCRYPT_INTELASM) + # tested with board: "qemu_x86_64" + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha256_asm.S) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha512_asm.S) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/sha3_asm.S) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/chacha_asm.S) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/poly1305_asm.S) + + # AESNI + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/aes_asm.S) + zephyr_library_sources(${ZEPHYR_CURRENT_MODULE_DIR}/wolfcrypt/src/aes_gcm_x86_asm.S) + set(TOOLCHAIN_C_FLAGS "-march=native -maes -msse4 -mpclmul ") + endif() + zephyr_library_link_libraries(wolfSSL) - - add_definitions(-DWOLFSSL_USER_SETTINGS) - add_definitions(-DWOLFSSL_ZEPHYR) + + target_compile_definitions(wolfSSL INTERFACE WOLFSSL_ZEPHYR) + target_compile_definitions(wolfSSL INTERFACE WOLFSSL_USER_SETTINGS) + if(CONFIG_WOLFSSL_DEBUG) + target_compile_definitions(wolfSSL INTERFACE DEBUG_WOLFSSL) + zephyr_library_compile_options(-g3 -O0) + endif() else() assert(CONFIG_WOLFSSL_LIBRARY "wolfSSL was enabled, but neither BUILTIN or LIBRARY was selected.") - + # NB: CONFIG_WOLFSSL_LIBRARY is not regression tested and is # therefore susceptible to bit rot - + target_include_directories(wolfSSL INTERFACE ${CONFIG_WOLFSSL_INSTALL_PATH} ) - + zephyr_link_libraries( wolfssl_external -L${CONFIG_WOLFSSL_INSTALL_PATH} @@ -135,7 +186,7 @@ # wolfssl to link with gcc we need to ensure it is placed # after wolfssl_external on the linkers command line. endif() - + target_link_libraries(wolfSSL INTERFACE zephyr_interface) endif() diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/Kconfig mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/Kconfig --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/Kconfig 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/Kconfig 2024-08-03 07:30:01.000000000 +0000 @@ -24,7 +24,7 @@ Symbol to disable the prompt for WOLFSSL selection. This symbol may be used internally in a Kconfig tree to hide the wolfSSL menu prompt and instead handle the selection of WOLFSSL from - dependent sub-configurations and thus preven stuck symbol behavior. + dependent sub-configurations and thus prevent stuck symbol behavior. menuconfig WOLFSSL @@ -53,7 +53,6 @@ config WOLFSSL_SETTINGS_FILE string "wolfSSL settings file" depends on WOLFSSL_BUILTIN - default "user_settings-tls-generic.h" help Use a specific wolfSSL settings file. The default config file file can be tweaked with Kconfig. The default settings is @@ -64,6 +63,26 @@ rsource "Kconfig.tls-generic" +config WOLFCRYPT_FIPS + bool "wolfCrypt FIPS support" + depends on WOLFSSL_BUILTIN + help + Enables FIPS support in wolfCrypt. Requires the wolfSSL FIPS ready + download that includes fips.c/fips_test.c. + +config WOLFCRYPT_ARMASM + bool "wolfCrypt ARM Assembly support" + depends on WOLFSSL_BUILTIN + help + wolfCrypt ARM (ARMv8/ARMv7) assembly support for AES, SHA-2, SHA-3, + ChaCha20/Poly1305 and Curve25519 + +config WOLFCRYPT_INTELASM + bool "wolfCrypt Intel Assembly support" + depends on WOLFSSL_BUILTIN + help + wolfCrypt Intel Aassembly support (AVX/AVX2/AESNI) + config WOLFSSL_DEBUG bool "wolfSSL debug activation" depends on WOLFSSL_BUILTIN diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/Kconfig.tls-generic mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/Kconfig.tls-generic --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/Kconfig.tls-generic 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/Kconfig.tls-generic 2024-08-03 07:30:01.000000000 +0000 @@ -264,9 +264,4 @@ of asymmetric cryptography, however this might have an impact on the code size. -config WOLFSSL_USER_SETTTINGS - string "User settings file for wolfSSL" - help - User settings file that contains wolfSSL defines. - endmenu diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/README.md mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/README.md --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/README.md 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/README.md 2024-08-03 07:30:01.000000000 +0000 @@ -60,6 +60,14 @@ ## Build and Run wolfCrypt Test Application +If you want to run build apps without running `west zephyr-export` then it is +possible by setting the `CMAKE_PREFIX_PATH` variable to the location of the +zephyr sdk and building from the `zephyr` directory. For example: + +``` +CMAKE_PREFIX_PATH=/path/to/zephyr-sdk- west build -p always -b qemu_x86 ../modules/crypto/wolfssl/zephyr/samples/wolfssl_test/ +``` + build and execute `wolfssl_test` ``` diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/include.am mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/include.am --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/include.am 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/include.am 2024-08-03 07:30:01.000000000 +0000 @@ -8,9 +8,7 @@ EXTRA_DIST+= zephyr/zephyr_init.c EXTRA_DIST+= zephyr/module.yml EXTRA_DIST+= zephyr/wolfssl/options.h -EXTRA_DIST+= zephyr/nrf5340dk_nrf5340_user_settings.h EXTRA_DIST+= zephyr/user_settings.h -EXTRA_DIST+= zephyr/user_settings-tls-generic.h EXTRA_DIST+= zephyr/README.md EXTRA_DIST+= zephyr/samples/wolfssl_benchmark/ EXTRA_DIST+= zephyr/samples/wolfssl_benchmark/CMakeLists.txt diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/nrf5340dk_nrf5340_user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/nrf5340dk_nrf5340_user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/nrf5340dk_nrf5340_user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/nrf5340dk_nrf5340_user_settings.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,133 +0,0 @@ -/* nrf5340dk_nrf5340_user_settings.h - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#ifndef WOLFSSL_OPTIONS_H -#define WOLFSSL_OPTIONS_H - - -#ifdef __cplusplus -extern "C" { -#endif - -/* Platform */ -#undef WOLFSSL_ZEPHYR -#define WOLFSSL_ZEPHYR - -#define WOLFSSL_GENERAL_ALIGNMENT 4 -#define SIZEOF_LONG_LONG 8 - -/* Enable PSA Crypto API for CryptoCell 312 crypto use */ -#define WOLFSSL_HAVE_PSA -#define WOLFSSL_PSA_GLOBAL_LOCK - -/* Enable SP Math */ -#define WOLFSSL_SP_MATH -#define WOLFSSL_SP_MATH_ALL -#define WOLFSSL_HAVE_SP_RSA -#define WOLFSSL_HAVE_SP_DH -#define WOLFSSL_HAVE_SP_ECC - -/* Enable SP Math assembly support for ARM32 */ -#define SP_WORD_SIZE 32 -#define WOLFSSL_SP_ASM -#define WOLFSSL_SP_ARM32 -#define WOLFSSL_SP_ARM32_ASM - -/* Crypto */ -#define WC_RSA_BLINDING -#define WC_RSA_PSS -#define WOLFSSL_DH_CONST -#define HAVE_FFDHE_2048 - -#define HAVE_ECC -#define ECC_USER_CURVES -/* #define HAVE_ECC192 */ -/* #define HAVE_ECC224 */ -#undef NO_ECC256 -/* #define HAVE_ECC384 */ -/* #define HAVE_ECC521 */ -#define ECC_SHAMIR -#define ECC_TIMING_RESISTANT - -#define WOLFSSL_AES_DIRECT -#define HAVE_AES_ECB -#define HAVE_AES_CBC -#define HAVE_AESCCM -#define HAVE_AESGCM -#define GCM_TABLE_4BIT - -/* AES-CTR is not working correctly with Nordic PSA Crypto API */ -/* #define WOLFSSL_AES_COUNTER */ - -#define HAVE_CHACHA -#define HAVE_POLY1305 -#define HAVE_ONE_TIME_AUTH - -/* Nordic Security PSA Crypto CryptoCell integration does not support SHA-1 */ -#define NO_SHA -#define WOLFSSL_SHA224 -#define WOLFSSL_SHA384 -#define WOLFSSL_SHA512 -#define WOLFSSL_SHA3 - -#define HAVE_HKDF -#define WOLFSSL_CMAC - -/* Benchmark / Test */ -#define BENCH_EMBEDDED -#define USE_CERT_BUFFERS_256 -#define USE_CERT_BUFFERS_2048 -#define NO_FILESYSTEM - -/* RNG */ -#define HAVE_HASHDRBG - -/* Features */ -#define WOLFSSL_TLS13 -#define WOLFSSL_OLD_PRIME_CHECK -#define HAVE_TLS_EXTENSIONS -#define HAVE_SUPPORTED_CURVES -#define HAVE_EXTENDED_MASTER -#define WOLFSSL_BASE64_ENCODE -#define WC_NO_ASYNC_THREADING - -/* Disable features that require SHA-1 (see note above) */ -#define NO_OLD_TLS -#define NO_DSA - -/* Disable other features (re-enable if needed) */ -#define NO_RC4 -#define NO_PSK -#define NO_MD4 -#define NO_PWDBASED -#define NO_DES3 - -#if defined(CONFIG_WOLFSSL_DEBUG) -#undef DEBUG_WOLFSSL -#define DEBUG_WOLFSSL -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* WOLFSSL_OPTIONS_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp.conf 2024-08-03 07:30:01.000000000 +0000 @@ -1,5 +1,5 @@ # Set user_settings.h file to be used for native wolfSSL build settings -CONFIG_WOLFSSL_SETTINGS_FILE="nrf5340dk_nrf5340_user_settings.h" +#CONFIG_WOLFSSL_SETTINGS_FILE="user_settings_custom.h" ##### PSA and CC3XX ##### # Enable Nordic Security Module diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp_ns.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp_ns.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp_ns.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/boards/nrf5340dk_nrf5340_cpuapp_ns.conf 2024-08-03 07:30:01.000000000 +0000 @@ -2,7 +2,7 @@ CONFIG_TFM_PROFILE_TYPE_NOT_SET=y # Set user_settings.h file to be used for native wolfSSL build settings -CONFIG_WOLFSSL_SETTINGS_FILE="nrf5340dk_nrf5340_user_settings.h" +#CONFIG_WOLFSSL_SETTINGS_FILE="user_settings_custom.h" ##### PSA and CC3XX ##### # Enable Nordic Security Module diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/prj.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/prj.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/prj.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/prj.conf 2024-08-03 07:30:01.000000000 +0000 @@ -1,7 +1,6 @@ - # Configure stack and heap sizes CONFIG_MAIN_STACK_SIZE=32768 -CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE=16384 +CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=8192 # Pthreads CONFIG_PTHREAD_IPC=y @@ -24,9 +23,14 @@ CONFIG_LOG=y CONFIG_LOG_BACKEND_UART=y CONFIG_LOG_BUFFER_SIZE=15360 +CONFIG_LOG_MODE_IMMEDIATE=y #CONFIG_WOLFSSL_DEBUG=y # Entropy +CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_ENTROPY_GENERATOR=y CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR=y +# Optional ARM or Intel Assembly +#CONFIG_WOLFCRYPT_ARMASM=y +#CONFIG_WOLFCRYPT_INTELASM=y diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/sample.yaml mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/sample.yaml --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/sample.yaml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_benchmark/sample.yaml 2024-08-03 07:30:01.000000000 +0000 @@ -2,9 +2,14 @@ description: wolfCrypt benchmark sample app name: wolfCrypt benchmark common: - min_flash: 65 - min_ram: 36 tags: crypto wolfssl userspace random + harness: console + harness_config: + type: one_line + regex: + - "Benchmark complete" tests: - crypto.wolfssl_benchmark: - platform_allow: qemu_x86 nrf5340dk_nrf5340_cpuapp_ns nrf5340dk_nrf5340_cpuapp + sample.crypto.wolfssl_benchmark: + platform_allow: qemu_x86 + integration_platforms: + - qemu_x86 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp.conf 2024-08-03 07:30:01.000000000 +0000 @@ -1,5 +1,5 @@ # Set user_settings.h file to be used for native wolfSSL build settings -CONFIG_WOLFSSL_SETTINGS_FILE="nrf5340dk_nrf5340_user_settings.h" +#CONFIG_WOLFSSL_SETTINGS_FILE="user_settings_custom.h" ##### PSA and CC3XX ##### # Enable Nordic Security Module diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp_ns.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp_ns.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp_ns.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/boards/nrf5340dk_nrf5340_cpuapp_ns.conf 2024-08-03 07:30:01.000000000 +0000 @@ -2,7 +2,7 @@ CONFIG_TFM_PROFILE_TYPE_NOT_SET=y # Set user_settings.h file to be used for native wolfSSL build settings -CONFIG_WOLFSSL_SETTINGS_FILE="nrf5340dk_nrf5340_user_settings.h" +#CONFIG_WOLFSSL_SETTINGS_FILE="user_settings_custom.h" ##### PSA and CC3XX ##### # Enable Nordic Security Module diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj-no-malloc.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj-no-malloc.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj-no-malloc.conf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj-no-malloc.conf 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,30 @@ +# Configure stack and heap sizes +CONFIG_MAIN_STACK_SIZE=655360 +#CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=65536 + +# Pthreads +CONFIG_PTHREAD_IPC=y + +# Clock for time() +CONFIG_POSIX_CLOCK=y + +# TLS configuration +CONFIG_WOLFSSL_SETTINGS_FILE="user_settings-no-malloc.h" +CONFIG_WOLFSSL=y +CONFIG_WOLFSSL_BUILTIN=y + +# Logging +CONFIG_PRINTK=y +CONFIG_CBPRINTF_LIBC_SUBSTS=y +CONFIG_CBPRINTF_FP_SUPPORT=y +CONFIG_CONSOLE=y +CONFIG_LOG=y +CONFIG_LOG_BACKEND_UART=y +CONFIG_LOG_BUFFER_SIZE=15360 +CONFIG_LOG_MODE_IMMEDIATE=y +#CONFIG_WOLFSSL_DEBUG=y + +# Entropy +CONFIG_TEST_RANDOM_GENERATOR=y +CONFIG_ENTROPY_GENERATOR=y +CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR=y diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/prj.conf 2024-08-03 07:30:01.000000000 +0000 @@ -1,7 +1,6 @@ - # Configure stack and heap sizes CONFIG_MAIN_STACK_SIZE=32768 -CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE=16384 +CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=16384 # Pthreads CONFIG_PTHREAD_IPC=y @@ -21,9 +20,10 @@ CONFIG_LOG=y CONFIG_LOG_BACKEND_UART=y CONFIG_LOG_BUFFER_SIZE=15360 +CONFIG_LOG_MODE_IMMEDIATE=y #CONFIG_WOLFSSL_DEBUG=y # Entropy +CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_ENTROPY_GENERATOR=y CONFIG_ENTROPY_DEVICE_RANDOM_GENERATOR=y - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/sample.yaml mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/sample.yaml --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/sample.yaml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_test/sample.yaml 2024-08-03 07:30:01.000000000 +0000 @@ -2,9 +2,20 @@ description: wolfCrypt test sample app name: wolfCrypt test common: - min_flash: 65 - min_ram: 36 - tags: crypto wolfssl userspace random + harness: console + harness_config: + type: one_line + regex: + - "Exiting main with return code: 0" tests: - crypto.wolfssl_test: - platform_allow: qemu_x86 nrf5340dk_nrf5340_cpuapp_ns nrf5340dk_nrf5340_cpuapp + sample.crypto.wolfssl_test: + timeout: 120 + platform_allow: qemu_x86 + integration_platforms: + - qemu_x86 + sample.crypto.wolfssl_test_no_malloc: + timeout: 120 + platform_allow: qemu_x86 + extra_args: CONF_FILE="prj-no-malloc.conf" + integration_platforms: + - qemu_x86 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj-no-malloc.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj-no-malloc.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj-no-malloc.conf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj-no-malloc.conf 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,57 @@ +# Kernel options +CONFIG_MAIN_STACK_SIZE=655360 +CONFIG_ENTROPY_GENERATOR=y +CONFIG_INIT_STACKS=y + +# General config +CONFIG_NEWLIB_LIBC=y + +# Pthreads +CONFIG_PTHREAD_IPC=y + +# Clock for time() +CONFIG_POSIX_CLOCK=y + +# Networking config +CONFIG_NETWORKING=y +CONFIG_NET_IPV4=y +CONFIG_NET_IPV6=n +CONFIG_NET_TCP=y +CONFIG_NET_SOCKETS=y +CONFIG_NET_SOCKETS_POSIX_NAMES=y + +CONFIG_NET_TEST=y +CONFIG_NET_LOOPBACK=y + +# Network driver config +CONFIG_TEST_RANDOM_GENERATOR=y + +# Network address config +CONFIG_NET_CONFIG_SETTINGS=y +CONFIG_NET_CONFIG_NEED_IPV4=y +CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.0.2.1" +CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.0.2.2" +CONFIG_NET_CONFIG_MY_IPV4_GW="192.0.2.2" + +CONFIG_NET_PKT_TX_COUNT=10 + +# Network debug config +#CONFIG_NET_LOG=y +#CONFIG_NET_PKT_LOG_LEVEL_DBG=y + +# Logging +CONFIG_PRINTK=y +#CONFIG_WOLFSSL_DEBUG=y +CONFIG_LOG=y +CONFIG_LOG_MODE_IMMEDIATE=y + +# TLS configuration +CONFIG_WOLFSSL_SETTINGS_FILE="user_settings-no-malloc.h" +CONFIG_WOLFSSL=y +CONFIG_WOLFSSL_BUILTIN=y + +CONFIG_WOLFSSL_TLS_VERSION_1_2=y +CONFIG_WOLFSSL_KEY_EXCHANGE_ALL_ENABLED=y +CONFIG_WOLFSSL_CIPHER_ALL_ENABLED=y +CONFIG_WOLFSSL_MAC_ALL_ENABLED=y +CONFIG_WOLFSSL_HMAC_DRBG_ENABLED=y diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/prj.conf 2024-08-03 07:30:01.000000000 +0000 @@ -2,7 +2,7 @@ CONFIG_MAIN_STACK_SIZE=16384 CONFIG_ENTROPY_GENERATOR=y CONFIG_INIT_STACKS=y -CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE=8192 +CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=8192 # General config CONFIG_NEWLIB_LIBC=y @@ -23,9 +23,6 @@ CONFIG_NET_TEST=y CONFIG_NET_LOOPBACK=y -CONFIG_DNS_RESOLVER=y -CONFIG_DNS_SERVER_IP_ADDRESSES=y -CONFIG_DNS_SERVER1="192.0.2.2" # Network driver config CONFIG_TEST_RANDOM_GENERATOR=y @@ -46,14 +43,14 @@ # Logging CONFIG_PRINTK=y #CONFIG_WOLFSSL_DEBUG=y -#CONFIG_LOG=y -#CONFIG_LOG_MODE_IMMEDIATE=y +CONFIG_LOG=y +CONFIG_LOG_MODE_IMMEDIATE=y # TLS configuration CONFIG_WOLFSSL=y CONFIG_WOLFSSL_BUILTIN=y -CONFIG_WOLFSSL_TLS_VERSION_1_2=y +CONFIG_WOLFSSL_TLS_VERSION_1_3=y CONFIG_WOLFSSL_KEY_EXCHANGE_ALL_ENABLED=y CONFIG_WOLFSSL_CIPHER_ALL_ENABLED=y CONFIG_WOLFSSL_MAC_ALL_ENABLED=y diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/sample.yaml mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/sample.yaml --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/sample.yaml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/sample.yaml 2024-08-03 07:30:01.000000000 +0000 @@ -1,9 +1,23 @@ -common: - harness: crypto - tags: crypto sample: description: wolfSSL TLS test application name: wolfSSL TLS Test +common: + harness: console + harness_config: + type: multi_line + regex: + - "Server Return: 0" + - "Client Return: 0" + - "Done" tests: - test: - platform_whitelist: qemu_x86 + sample.crypto.wolfssl_tls_sock: + timeout: 60 + platform_allow: qemu_x86 + integration_platforms: + - qemu_x86 + sample.crypto.wolfssl_tls_sock_no_malloc: + timeout: 60 + platform_allow: qemu_x86 + extra_args: CONF_FILE="prj-no-malloc.conf" + integration_platforms: + - qemu_x86 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/src/tls_sock.c mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/src/tls_sock.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/src/tls_sock.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_sock/src/tls_sock.c 2024-08-03 07:30:01.000000000 +0000 @@ -32,13 +32,9 @@ #endif #define BUFFER_SIZE 2048 -#define STATIC_MEM_SIZE (192*1024) -#define THREAD_STACK_SIZE (24*1024) +#define STATIC_MEM_SIZE (256*1024) #define MAX_SEND_SIZE 256 -/* The stack to use in the server's thread. */ -K_THREAD_STACK_DEFINE(server_stack, THREAD_STACK_SIZE); - #ifdef WOLFSSL_STATIC_MEMORY static WOLFSSL_HEAP_HINT* HEAP_HINT_SERVER; static WOLFSSL_HEAP_HINT* HEAP_HINT_CLIENT; @@ -66,6 +62,20 @@ "\n" "\n"; +#ifdef HAVE_FIPS +static void myFipsCb(int ok, int err, const char* hash) +{ + printf("in my Fips callback, ok = %d, err = %d\n", ok, err); + printf("message = %s\n", wc_GetErrorString(err)); + printf("hash = %s\n", hash); + + if (err == IN_CORE_FIPS_E) { + printf("In core integrity hash check failure, copy above hash\n"); + printf("into verifyCore[] in fips_test.c and rebuild\n"); + } +} +#endif + /* DO NOT use this in production. You should implement a way * to get the current date. */ static int verifyIgnoreDateError(int preverify, WOLFSSL_X509_STORE_CTX* store) @@ -84,7 +94,7 @@ WOLFSSL* client_ssl = NULL; /* Create and initialize WOLFSSL_CTX */ - if ((client_ctx = wolfSSL_CTX_new_ex(wolfTLSv1_2_client_method(), + if ((client_ctx = wolfSSL_CTX_new_ex(wolfTLSv1_3_client_method_ex(HEAP_HINT_CLIENT), HEAP_HINT_CLIENT)) == NULL) { printf("ERROR: failed to create WOLFSSL_CTX\n"); ret = -1; @@ -155,7 +165,7 @@ WOLFSSL* server_ssl = NULL; /* Create and initialize WOLFSSL_CTX */ - if ((server_ctx = wolfSSL_CTX_new_ex(wolfTLSv1_2_server_method(), + if ((server_ctx = wolfSSL_CTX_new_ex(wolfTLSv1_3_server_method_ex(HEAP_HINT_SERVER), HEAP_HINT_SERVER)) == NULL) { printf("ERROR: failed to create WOLFSSL_CTX\n"); ret = -1; @@ -292,20 +302,6 @@ #endif } - -/* Start the server thread. */ -void start_thread(THREAD_FUNC func, func_args* args, THREAD_TYPE* thread) -{ - k_thread_create(thread, server_stack, K_THREAD_STACK_SIZEOF(server_stack), - func, args, NULL, NULL, 5, 0, K_NO_WAIT); -} - -void join_thread(THREAD_TYPE thread) -{ - /* Threads are handled in the kernel. */ -} - - int wolfssl_server_accept_tcp(WOLFSSL* ssl, SOCKET_T* fd, SOCKET_T* acceptfd) { int ret = 0; @@ -350,7 +346,7 @@ } /* Thread to do the server operations. */ -void server_thread(void* arg1, void* arg2, void* arg3) +void server_thread(void* arg1) { int ret = 0; WOLFSSL_CTX* server_ctx = NULL; @@ -449,20 +445,8 @@ WOLFSSL* client_ssl = NULL; SOCKET_T sockfd = WOLFSSL_SOCKET_INVALID; -#ifdef WOLFSSL_STATIC_MEMORY - if (wc_LoadStaticMemory(&HEAP_HINT_CLIENT, gMemoryClient, - sizeof(gMemoryClient), - WOLFMEM_GENERAL | WOLFMEM_TRACK_STATS, 1) != 0) { - printf("unable to load static memory"); - ret = -1; - } - - if (ret == 0) -#endif - { - /* Client connection */ - ret = wolfssl_client_new(&client_ctx, &client_ssl); - } + /* Client connection */ + ret = wolfssl_client_new(&client_ctx, &client_ssl); if (ret == 0) ret = wolfssl_client_connect_tcp(client_ssl, &sockfd); @@ -503,18 +487,41 @@ { THREAD_TYPE serverThread; +#ifdef HAVE_FIPS + wolfCrypt_SetCb_fips(myFipsCb); +#endif wolfSSL_Init(); #ifdef DEBUG_WOLFSSL wolfSSL_Debugging_ON(); #endif +#ifdef WOLFSSL_STATIC_MEMORY + if (wc_LoadStaticMemory(&HEAP_HINT_CLIENT, gMemoryClient, + sizeof(gMemoryClient), + WOLFMEM_GENERAL | WOLFMEM_TRACK_STATS, 1) != 0) { + printf("unable to load static memory"); + return -1; + } + + wolfsslThreadHeapHint = HEAP_HINT_CLIENT; +#endif + /* Start server */ - start_thread(server_thread, NULL, &serverThread); + if (wolfSSL_NewThread(&serverThread, server_thread, NULL) != 0) { + printf("Failed to start server thread\n"); + return -1; + } k_sleep(Z_TIMEOUT_TICKS(100)); client_thread(); + /* Join is not working in qemu when the thread is still active. Wait for it + * to shut down to join it. */ + k_sleep(Z_TIMEOUT_TICKS(100)); - join_thread(serverThread); + if (wolfSSL_JoinThread(serverThread) != 0) { + printf("Failed to join server thread\n"); + return -1; + } wolfSSL_Cleanup(); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp.conf 2024-08-03 07:30:01.000000000 +0000 @@ -1,5 +1,5 @@ # Set user_settings.h file to be used for native wolfSSL build settings -CONFIG_WOLFSSL_SETTINGS_FILE="nrf5340dk_nrf5340_user_settings.h" +#CONFIG_WOLFSSL_SETTINGS_FILE="user_settings_custom.h" ##### PSA and CC3XX ##### # Enable Nordic Security Module diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp_ns.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp_ns.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp_ns.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/boards/nrf5340dk_nrf5340_cpuapp_ns.conf 2024-08-03 07:30:01.000000000 +0000 @@ -2,7 +2,7 @@ CONFIG_TFM_PROFILE_TYPE_NOT_SET=y # Set user_settings.h file to be used for native wolfSSL build settings -CONFIG_WOLFSSL_SETTINGS_FILE="nrf5340dk_nrf5340_user_settings.h" +#CONFIG_WOLFSSL_SETTINGS_FILE="user_settings_custom.h" ##### PSA and CC3XX ##### # Enable Nordic Security Module diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/prj.conf mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/prj.conf --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/prj.conf 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/prj.conf 2024-08-03 07:30:01.000000000 +0000 @@ -1,8 +1,9 @@ # Kernel options CONFIG_MAIN_STACK_SIZE=16384 CONFIG_ENTROPY_GENERATOR=y +CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_INIT_STACKS=y -CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE=65536 +CONFIG_COMMON_LIBC_MALLOC_ARENA_SIZE=131072 # Pthreads CONFIG_PTHREAD_IPC=y @@ -22,7 +23,7 @@ CONFIG_PRINTK=y CONFIG_LOG=y CONFIG_LOG_MODE_IMMEDIATE=y -#CONFIG_WOLFSSL_DEBUG=y +CONFIG_WOLFSSL_DEBUG=y # Enable logging using RTT and UART #CONFIG_CBPRINTF_LIBC_SUBSTS=y @@ -35,7 +36,7 @@ CONFIG_WOLFSSL=y CONFIG_WOLFSSL_BUILTIN=y -CONFIG_WOLFSSL_TLS_VERSION_1_2=y +CONFIG_WOLFSSL_TLS_VERSION_1_3=y CONFIG_WOLFSSL_KEY_EXCHANGE_ALL_ENABLED=y CONFIG_WOLFSSL_CIPHER_ALL_ENABLED=y CONFIG_WOLFSSL_MAC_ALL_ENABLED=y diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/sample.yaml mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/sample.yaml --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/sample.yaml 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/sample.yaml 2024-08-03 07:30:01.000000000 +0000 @@ -1,9 +1,18 @@ -common: - harness: crypto - tags: crypto sample: description: wolfSSL TLS test application name: wolfSSL TLS Test +common: + harness: console + harness_config: + type: multi_line + regex: + - "Server Return: 0" + - "Server Error: 0" + - "Client Return: 0" + - "Client Error: 0" tests: - test: - platform_whitelist: qemu_x86 + sample.crypto.wolfssl_tls_thread: + timeout: 60 + platform_allow: qemu_x86 + integration_platforms: + - qemu_x86 diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/src/tls_threaded.c mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/src/tls_threaded.c --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/src/tls_threaded.c 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/samples/wolfssl_tls_thread/src/tls_threaded.c 2024-08-03 07:30:01.000000000 +0000 @@ -44,10 +44,6 @@ #define BUFFER_SIZE 2048 #define STATIC_MEM_SIZE (192*1024) -#define THREAD_STACK_SIZE (24*1024) - -/* The stack to use in the server's thread. */ -K_THREAD_STACK_DEFINE(server_stack, THREAD_STACK_SIZE); #ifdef WOLFSSL_STATIC_MEMORY static WOLFSSL_HEAP_HINT* HEAP_HINT_SERVER; @@ -93,6 +89,20 @@ "\n" "\n"; +#ifdef HAVE_FIPS +static void myFipsCb(int ok, int err, const char* hash) +{ + printf("in my Fips callback, ok = %d, err = %d\n", ok, err); + printf("message = %s\n", wc_GetErrorString(err)); + printf("hash = %s\n", hash); + + if (err == IN_CORE_FIPS_E) { + printf("In core integrity hash check failure, copy above hash\n"); + printf("into verifyCore[] in fips_test.c and rebuild\n"); + } +} +#endif + /* wolfSSL client wants to read data from the server. */ static int recv_client(WOLFSSL* ssl, char* buff, int sz, void* ctx) { @@ -515,22 +525,8 @@ #endif } - -/* Start the server thread. */ -void start_thread(THREAD_FUNC func, func_args* args, THREAD_TYPE* thread) -{ - k_thread_create(thread, server_stack, K_THREAD_STACK_SIZEOF(server_stack), - func, args, NULL, NULL, 5, 0, K_NO_WAIT); -} - -void join_thread(THREAD_TYPE thread) -{ - /* Threads are handled in the kernel. */ -} - - /* Thread to do the server operations. */ -void server_thread(void* arg1, void* arg2, void* arg3) +void server_thread(void* arg1) { int ret = 0; WOLFSSL_CTX* server_ctx = NULL; @@ -593,6 +589,9 @@ utctime.tv_nsec = 0; clock_settime(CLOCK_REALTIME, &utctime); +#ifdef HAVE_FIPS + wolfCrypt_SetCb_fips(myFipsCb); +#endif wolfSSL_Init(); #ifdef DEBUG_WOLFSSL wolfSSL_Debugging_ON(); @@ -602,7 +601,10 @@ wc_InitMutex(&server_mutex); /* Start server */ - start_thread(server_thread, NULL, &serverThread); + if (wolfSSL_NewThread(&serverThread, server_thread, NULL) != 0) { + printf("Failed to start server thread\n"); + return -1; + } #ifdef WOLFSSL_STATIC_MEMORY if (wc_LoadStaticMemory(&HEAP_HINT_CLIENT, gMemoryClient, @@ -643,8 +645,10 @@ printf("Client Return: %d\n", ret); printf("Client Error: %d\n", wolfSSL_get_error(client_ssl, ret)); - - join_thread(serverThread); + if (wolfSSL_JoinThread(serverThread) != 0) { + printf("Failed to join server thread\n"); + return -1; + } #ifdef WOLFSSL_STATIC_MEMORY printf("Client Memory Stats\n"); diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/user_settings-no-malloc.h mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings-no-malloc.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/user_settings-no-malloc.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings-no-malloc.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,170 @@ +/* user_settings-tls-generic.h + * generated from configure options + * + * Copyright (C) 2006-2023 wolfSSL Inc. + * + * This file is part of wolfSSL. + * + * wolfSSL 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 of the License, or + * (at your option) any later version. + * + * wolfSSL 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, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA + */ + +#ifndef WOLFSSL_OPTIONS_H +#define WOLFSSL_OPTIONS_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#if 0 +#undef SINGLE_THREADED +#define SINGLE_THREADED +#endif + +#undef TFM_TIMING_RESISTANT +#define TFM_TIMING_RESISTANT + +#undef ECC_TIMING_RESISTANT +#define ECC_TIMING_RESISTANT + +#undef WC_RSA_BLINDING +#define WC_RSA_BLINDING + +#undef HAVE_AESGCM +#define HAVE_AESGCM + +#undef WOLFSSL_SHA512 +#define WOLFSSL_SHA512 + +#undef WOLFSSL_SHA384 +#define WOLFSSL_SHA384 + +#undef NO_DSA +#define NO_DSA + +#undef HAVE_ECC +#define HAVE_ECC + +#undef TFM_ECC256 +#define TFM_ECC256 + +#undef WOLFSSL_BASE64_ENCODE +#define WOLFSSL_BASE64_ENCODE + +#undef NO_RC4 +#define NO_RC4 + +#undef WOLFSSL_SHA224 +#define WOLFSSL_SHA224 + +#undef WOLFSSL_SHA3 +#define WOLFSSL_SHA3 + +#undef HAVE_POLY1305 +#define HAVE_POLY1305 + +#undef HAVE_ONE_TIME_AUTH +#define HAVE_ONE_TIME_AUTH + +#undef HAVE_CHACHA +#define HAVE_CHACHA + +#undef HAVE_HASHDRBG +#define HAVE_HASHDRBG + +#undef NO_FILESYSTEM +#define NO_FILESYSTEM + +#undef HAVE_TLS_EXTENSIONS +#define HAVE_TLS_EXTENSIONS + +#undef HAVE_SUPPORTED_CURVES +#define HAVE_SUPPORTED_CURVES + +#undef HAVE_EXTENDED_MASTER +#define HAVE_EXTENDED_MASTER + +#undef NO_PSK +#define NO_PSK + +#undef NO_MD4 +#define NO_MD4 + +#undef USE_FAST_MATH +#define USE_FAST_MATH + +#undef WOLFSSL_NO_ASM +#define WOLFSSL_NO_ASM + +#undef WOLFSSL_X86_BUILD +#define WOLFSSL_X86_BUILD + +#undef WC_NO_ASYNC_THREADING +#define WC_NO_ASYNC_THREADING + +#undef WOLFSSL_STATIC_MEMORY +#define WOLFSSL_STATIC_MEMORY + +#undef WOLFSSL_TLS13 +#define WOLFSSL_TLS13 + +#undef HAVE_HKDF +#define HAVE_HKDF + +#undef WC_RSA_PSS +#define WC_RSA_PSS + +#undef HAVE_FFDHE_2048 +#define HAVE_FFDHE_2048 + +#undef WOLFSSL_NO_MALLOC +#define WOLFSSL_NO_MALLOC +//#define WOLFSSL_DEBUG_STATIC_MEMORY +//#define WOLFSSL_DEBUG_MEMORY_PRINT +//#define WOLFSSL_DEBUG_MEMORY +//#define WOLFSSL_TRACK_MEMORY +#define LARGEST_MEM_BUCKET 65536 + +#undef WOLFSSL_DYN_CERT +#define WOLFSSL_DYN_CERT + +#undef WOLFSSL_CERT_GEN +#define WOLFSSL_CERT_GEN + +#undef WOLFSSL_CERT_REQ +#define WOLFSSL_CERT_REQ + +#undef HAVE_PKCS12 +#define HAVE_PKCS12 + +#undef WOLFSSL_TLS13 +#define WOLFSSL_TLS13 + +#if 0 +#undef WOLFSSL_HAVE_SP_RSA +#define WOLFSSL_HAVE_SP_RSA +#undef WOLFSSL_HAVE_SP_DH +#define WOLFSSL_HAVE_SP_DH +#undef WOLFSSL_HAVE_SP_ECC +#define WOLFSSL_HAVE_SP_ECC +#endif + +#ifdef __cplusplus +} +#endif + + +#endif /* WOLFSSL_OPTIONS_H */ + diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/user_settings-tls-generic.h mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings-tls-generic.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/user_settings-tls-generic.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings-tls-generic.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,161 +0,0 @@ -/* user_settings-tls-generic.h - * generated from configure options - * - * Copyright (C) 2006-2023 wolfSSL Inc. - * - * This file is part of wolfSSL. - * - * wolfSSL 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 of the License, or - * (at your option) any later version. - * - * wolfSSL 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, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA - */ - -#ifndef WOLFSSL_OPTIONS_H -#define WOLFSSL_OPTIONS_H - - -#ifdef __cplusplus -extern "C" { -#endif - -#undef WOLFSSL_ZEPHYR -#define WOLFSSL_ZEPHYR - -#if 0 -#undef SINGLE_THREADED -#define SINGLE_THREADED -#endif - -#undef TFM_TIMING_RESISTANT -#define TFM_TIMING_RESISTANT - -#undef ECC_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT - -#undef WC_RSA_BLINDING -#define WC_RSA_BLINDING - -#undef HAVE_AESGCM -#define HAVE_AESGCM - -#undef WOLFSSL_SHA512 -#define WOLFSSL_SHA512 - -#undef WOLFSSL_SHA384 -#define WOLFSSL_SHA384 - -#undef NO_DSA -#define NO_DSA - -#undef HAVE_ECC -#define HAVE_ECC - -#undef TFM_ECC256 -#define TFM_ECC256 - -#undef WOLFSSL_BASE64_ENCODE -#define WOLFSSL_BASE64_ENCODE - -#undef NO_RC4 -#define NO_RC4 - -#undef WOLFSSL_SHA224 -#define WOLFSSL_SHA224 - -#undef WOLFSSL_SHA3 -#define WOLFSSL_SHA3 - -#undef HAVE_POLY1305 -#define HAVE_POLY1305 - -#undef HAVE_ONE_TIME_AUTH -#define HAVE_ONE_TIME_AUTH - -#undef HAVE_CHACHA -#define HAVE_CHACHA - -#undef HAVE_HASHDRBG -#define HAVE_HASHDRBG - -#undef NO_FILESYSTEM -#define NO_FILESYSTEM - -#undef HAVE_TLS_EXTENSIONS -#define HAVE_TLS_EXTENSIONS - -#undef HAVE_SUPPORTED_CURVES -#define HAVE_SUPPORTED_CURVES - -#undef HAVE_EXTENDED_MASTER -#define HAVE_EXTENDED_MASTER - -#undef NO_PSK -#define NO_PSK - -#undef NO_MD4 -#define NO_MD4 - -#undef NO_PWDBASED -#define NO_PWDBASED - -#undef USE_FAST_MATH -#define USE_FAST_MATH - -#undef WOLFSSL_NO_ASM -#define WOLFSSL_NO_ASM - -#undef WOLFSSL_X86_BUILD -#define WOLFSSL_X86_BUILD - -#undef WC_NO_ASYNC_THREADING -#define WC_NO_ASYNC_THREADING - -#undef NO_DES3 -#define NO_DES3 - -#undef WOLFSSL_STATIC_MEMORY -#define WOLFSSL_STATIC_MEMORY - -#undef WOLFSSL_TLS13 -#define WOLFSSL_TLS13 - -#undef HAVE_HKDF -#define HAVE_HKDF - -#undef WC_RSA_PSS -#define WC_RSA_PSS - -#undef HAVE_FFDHE_2048 -#define HAVE_FFDHE_2048 - -#if 0 -#undef WOLFSSL_HAVE_SP_RSA -#define WOLFSSL_HAVE_SP_RSA -#undef WOLFSSL_HAVE_SP_DH -#define WOLFSSL_HAVE_SP_DH -#undef WOLFSSL_HAVE_SP_ECC -#define WOLFSSL_HAVE_SP_ECC -#endif - -#if defined(CONFIG_WOLFSSL_DEBUG) -#undef DEBUG_WOLFSSL -#define DEBUG_WOLFSSL -#endif - -#ifdef __cplusplus -} -#endif - - -#endif /* WOLFSSL_OPTIONS_H */ - diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/user_settings.h mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/user_settings.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/user_settings.h 2024-08-03 07:30:01.000000000 +0000 @@ -1,6 +1,6 @@ /* user_settings.h * - * Copyright (C) 2006-2023 wolfSSL Inc. + * Copyright (C) 2006-2024 wolfSSL Inc. * * This file is part of wolfSSL. * @@ -23,128 +23,408 @@ #define USER_SETTINGS_H #ifdef CONFIG_WOLFSSL -#ifdef CONFIG_WOLFSSL_SETTINGS_FILE - -#include CONFIG_WOLFSSL_SETTINGS_FILE +/* If a custom user_settings file is provided use it instead. + * CONFIG_WOLFSSL_SETTINGS_FILE is always defined. If it is not explicitly set + * in prj.conf then it is auto-defined to "". This obviously causes issues here. + * That is why we define WOLFSSL_SETTINGS_FILE in CMakeLists.txt. */ +#ifdef WOLFSSL_SETTINGS_FILE +#include WOLFSSL_SETTINGS_FILE #else #ifdef __cplusplus extern "C" { #endif -#undef WOLFSSL_ZEPHYR -#define WOLFSSL_ZEPHYR +/* ------------------------------------------------------------------------- */ +/* Platform */ +/* ------------------------------------------------------------------------- */ +#define WOLFSSL_GENERAL_ALIGNMENT 4 /* platform requires 32-bit alignment on uint32_t */ +#define SIZEOF_LONG_LONG 8 /* long long is 8 bytes / 64-bit */ +//#define WOLFSSL_NO_ASM /* optionally disable inline assembly support */ +#define WOLFSSL_IGNORE_FILE_WARN /* ignore file includes not required */ +//#define WOLFSSL_SMALL_STACK /* option to reduce stack size, offload to heap */ +#define BENCH_EMBEDDED /* use smaller buffers in benchmark / tests */ + +/* Network stack */ +/* Default is POSIX sockets */ +//#define WOLFSSL_USER_IO /* Use the SetIO callbacks, not the internal wolfio.c socket code */ +//#define WOLFSSL_LWIP +//#define WOLFSSL_LWIP_NATIVE +//#define FREERTOS_TCP + +/* RTOS */ +/* Default is POSIX mutex and pthreads*/ +//#define SINGLE_THREADED +//#define FREERTOS +#define NO_FILESYSTEM +#define NO_WRITEV + +/* ------------------------------------------------------------------------- */ +/* Hardware */ +/* ------------------------------------------------------------------------- */ +/* CryptoCell support */ #if 0 -#undef SINGLE_THREADED -#define SINGLE_THREADED + //#define WOLFSSL_CRYPTOCELL + //#define WOLFSSL_CRYPTOCELL_AES +#endif +/* PSA support */ +#ifdef CONFIG_MBEDTLS_PSA_CRYPTO_C + #define WOLFSSL_HAVE_PSA + #ifndef SINGLE_THREADED + #define WOLFSSL_PSA_GLOBAL_LOCK + #endif + #define WC_NO_HASHDRBG /* use PSA RNG directly via wc_psa_get_random */ #endif -#undef TFM_TIMING_RESISTANT -#define TFM_TIMING_RESISTANT +/* ------------------------------------------------------------------------- */ +/* FIPS */ +/* ------------------------------------------------------------------------- */ +#ifdef CONFIG_WOLFCRYPT_FIPS + /* FIPS Ready */ + #define HAVE_FIPS_VERSION 5 + #define HAVE_FIPS_VERSION_MINOR 3 +#endif -#undef ECC_TIMING_RESISTANT -#define ECC_TIMING_RESISTANT -#undef WC_RSA_BLINDING -#define WC_RSA_BLINDING +/* ------------------------------------------------------------------------- */ +/* TLS */ +/* ------------------------------------------------------------------------- */ +/* TLS v1.2 (on by default) */ +#ifdef CONFIG_WOLFSSL_TLS_VERSION_1_2 + #undef WOLFSSL_NO_TLS12 +#else + #define WOLFSSL_NO_TLS12 +#endif +//#define NO_WOLFSSL_SERVER /* Optionally disable TLS server code */ +//#define NO_WOLFSSL_CLIENT /* Optionally disable TLS client code */ -#undef HAVE_AESGCM -#define HAVE_AESGCM +/* TLS v1.3 */ +#if defined(CONFIG_WOLFSSL_TLS_VERSION_1_3) || defined(CONFIG_WOLFSSL_TLS13_ENABLED) + #define WOLFSSL_TLS13 +#endif -#undef WOLFSSL_SHA512 -#define WOLFSSL_SHA512 +/* Disable older TLS version prior to 1.2 */ +#define NO_OLD_TLS -#undef WOLFSSL_SHA384 -#define WOLFSSL_SHA384 +/* Enable default TLS extensions */ +#define HAVE_TLS_EXTENSIONS +#define HAVE_SUPPORTED_CURVES +#define HAVE_EXTENDED_MASTER +#define HAVE_ENCRYPT_THEN_MAC +#define HAVE_SERVER_RENEGOTIATION_INFO +#define HAVE_SNI /* optional Server Name Indicator (SNI) */ + +/* ASN */ +#define WOLFSSL_ASN_TEMPLATE /* use newer ASN template asn.c code (default) */ +#if 0 /* optional space reductions */ + #define WOLFSSL_NO_ASN_STRICT + #define IGNORE_NAME_CONSTRAINTS +#endif -#undef NO_DSA -#define NO_DSA +/* Session Cache */ +#if 1 + #define SMALL_SESSION_CACHE + #ifdef WOLFSSL_TLS13 + #define HAVE_SESSION_TICKET /* session tickets required for resumption in TLS v1.3 */ + #endif +#else + #define NO_SESSION_CACHE /* disable session resumption */ +#endif -#undef HAVE_ECC -#define HAVE_ECC +/* PSK */ +#define NO_PSK /* disable pre-shared-key support */ -#undef TFM_ECC256 -#define TFM_ECC256 -#undef WOLFSSL_BASE64_ENCODE -#define WOLFSSL_BASE64_ENCODE +/* ------------------------------------------------------------------------- */ +/* Algorithms */ +/* ------------------------------------------------------------------------- */ +/* RNG */ +#ifndef WC_NO_HASHDRBG + #define HAVE_HASHDRBG /* Use DRBG SHA2-256 and seed */ +#endif -#undef NO_RC4 -#define NO_RC4 +/* ECC */ +#if 1 + #define HAVE_ECC + #define ECC_USER_CURVES /* Enable only ECC curves specific */ + #undef NO_ECC256 /* Enable SECP256R1 only (on by default) */ + #define ECC_TIMING_RESISTANT /* Enable Timing Resistance */ + + //#define ECC_SHAMIR /* Optional ECC calculation speed improvement if not using SP implementation */ + //#define WOLFSSL_CUSTOM_CURVES /* enable other curves (not just prime) */ + //#define HAVE_ECC_SECPR2 + //#define HAVE_ECC_SECPR3 + //#define HAVE_ECC_BRAINPOOL + //#define HAVE_ECC_KOBLITZ + //#define HAVE_ECC_CDH /* Co-factor */ + //#define HAVE_COMP_KEY /* Compressed key support */ + //#define FP_ECC /* Fixed point caching - speed repeated operations against same key */ + //#define HAVE_ECC_ENCRYPT + //#define WOLFCRYPT_HAVE_ECCSI + //#define WOLFSSL_ECDSA_DETERMINISTIC_K_VARIANT +#endif -#undef WOLFSSL_SHA224 -#define WOLFSSL_SHA224 +#define WOLFSSL_OLD_PRIME_CHECK /* Use faster DH prime checking */ -#undef WOLFSSL_SHA3 -#define WOLFSSL_SHA3 +/* RSA */ +#if 1 + #undef NO_RSA + #define WC_RSA_BLINDING + //#define WC_RSA_NO_PADDING + //#define RSA_LOW_MEM + + #if 0 + #define WOLFSSL_KEY_GEN /* For RSA Key gen only */ + #endif + #if defined(WOLFSSL_TLS13) || defined(CONFIG_WOLFSSL_RSA_PSS) + /* TLS v1.3 requires RSA PSS padding */ + #define WC_RSA_PSS + //#define WOLFSSL_PSS_LONG_SALT + #endif +#else + #define NO_RSA +#endif -#undef HAVE_POLY1305 -#define HAVE_POLY1305 +/* DH */ +#if 0 + #undef NO_DH /* on by default */ + #define WOLFSSL_DH_CONST /* don't rely on pow/log */ + #define HAVE_FFDHE_2048 + #define HAVE_FFDHE_3072 + #define HAVE_DH_DEFAULT_PARAMS + //#define WOLFSSL_DH_EXTRA /* Enable additional DH key import/export */ +#else + #define NO_DH +#endif -#undef HAVE_ONE_TIME_AUTH -#define HAVE_ONE_TIME_AUTH +/* ChaCha20 / Poly1305 */ +#if 1 + #define HAVE_CHACHA + #define HAVE_POLY1305 -#undef HAVE_CHACHA -#define HAVE_CHACHA + /* Needed for Poly1305 */ + #define HAVE_ONE_TIME_AUTH +#endif -#undef HAVE_HASHDRBG -#define HAVE_HASHDRBG +/* Ed25519 / Curve25519 */ +#if 0 + #define HAVE_CURVE25519 + #define HAVE_ED25519 /* ED25519 Requires SHA512 */ -#undef NO_FILESYSTEM -#define NO_FILESYSTEM + /* Optionally use small math (less flash usage, but much slower) */ + //#define CURVED25519_SMALL +#endif -#undef HAVE_TLS_EXTENSIONS -#define HAVE_TLS_EXTENSIONS +/* SHA-1 */ +#if 0 + #undef NO_SHA /* on by default */ + //#define USE_SLOW_SHA /* 1k smaller, but 25% slower */ +#else + // #define NO_SHA /* Necessary for pkcs12 tests */ +#endif -#undef HAVE_SUPPORTED_CURVES -#define HAVE_SUPPORTED_CURVES +/* SHA2-256 */ +#if 1 + #undef NO_SHA256 /* on by default */ + //#define USE_SLOW_SHA256 /* ~2k smaller and about 25% slower */ + #define WOLFSSL_SHA224 +#else + #define NO_SHA256 +#endif -#undef HAVE_EXTENDED_MASTER -#define HAVE_EXTENDED_MASTER +/* SHA2-384/512 */ +#if 1 + #define WOLFSSL_SHA384 + #define WOLFSSL_SHA512 + //#define USE_SLOW_SHA512 /* Over twice as small, but 50% slower */ +#endif -#undef NO_PSK -#define NO_PSK +/* SHA-3 */ +#if 1 + #define WOLFSSL_SHA3 +#endif -#undef NO_MD4 -#define NO_MD4 +/* AES */ +#define HAVE_AES_ECB +/* AES-CBC */ +#if 1 + #define HAVE_AES_CBC +#else + #define NO_AES_CBC +#endif +/* AES-GCM */ +#if 1 + #define HAVE_AESGCM + #define GCM_SMALL /* GCM Method: GCM_TABLE_4BIT, GCM_SMALL, GCM_WORD32 or GCM_TABLE */ + //#define WOLFSSL_AESGCM_STREAM +#endif +//#define HAVE_AES_DECRYPT +//#define WOLFSSL_AES_COUNTER +//#define WOLFSSL_AES_CFB +//#define WOLFSSL_AES_OFB +//#define HAVE_AESCCM +//#define WOLFSSL_AES_XTS + +//#define NO_AES_128 +//#define NO_AES_192 +//#define NO_AES_256 +//#define WOLFSSL_AES_SMALL_TABLES +//#define WOLFSSL_AES_NO_UNROLL + + +/* HKDF */ +#if defined(WOLFSSL_TLS13) || defined(CONFIG_WOLFSSL_HKDF) + #define HAVE_HKDF +#endif -#undef NO_PWDBASED -#define NO_PWDBASED +/* CMAC - Zephyr nRF BTLE needs CMAC */ +#if 1 + #define WOLFSSL_AES_DIRECT + #define WOLFSSL_CMAC +#endif -#undef USE_FAST_MATH -#define USE_FAST_MATH -#undef WOLFSSL_NO_ASM -#define WOLFSSL_NO_ASM +/* Optional Features */ +#define WOLFSSL_BASE64_ENCODE /* Enable Base64 encoding */ +//#define WC_NO_CACHE_RESISTANT /* systems with cache should enable this for AES, ECC, RSA and DH */ +//#define WOLFSSL_CERT_GEN +//#define WOLFSSL_CERT_REQ +//#define WOLFSSL_CERT_EXT +//#define NO_PWDBASED -#undef WOLFSSL_X86_BUILD -#define WOLFSSL_X86_BUILD -#undef WC_NO_ASYNC_THREADING -#define WC_NO_ASYNC_THREADING +/* Disable Algorithms */ +#define NO_DSA +#define NO_RC4 +#define NO_MD4 +#define NO_MD5 +//#define NO_DES3 /* Necessary for pkcs12 tests */ +#define WOLFSSL_NO_SHAKE128 +#define WOLFSSL_NO_SHAKE256 -#undef NO_DES3 -#define NO_DES3 -#undef WOLFSSL_STATIC_MEMORY -#define WOLFSSL_STATIC_MEMORY -#if 0 -#undef WOLFSSL_HAVE_SP_RSA -#define WOLFSSL_HAVE_SP_RSA -#undef WOLFSSL_HAVE_SP_DH -#define WOLFSSL_HAVE_SP_DH -#undef WOLFSSL_HAVE_SP_ECC -#define WOLFSSL_HAVE_SP_ECC +/* ------------------------------------------------------------------------- */ +/* Math */ +/* ------------------------------------------------------------------------- */ +/* Math Options */ +/* Multi-precision - generic math for all keys sizes and curves */ +#if 1 + #define WOLFSSL_SP_MATH /* no multi-precision math, only single */ +#elif 1 + /* wolf mp math (sp_int.c) */ + #define WOLFSSL_SP_MATH_ALL /* use SP math for all key sizes and curves */ + //#define WOLFSSL_SP_NO_MALLOC + + /* use smaller version of code */ + #define WOLFSSL_SP_SMALL + + /* Define the maximum math bits used */ + #if !defined(NO_RSA) || !defined(NO_DH) + #define SP_INT_BITS 2048 + #elif defined(HAVE_ECC) + #define SP_INT_BITS 256 + #endif + +#elif 1 + /* Fast Math (tfm.c) (stack based and timing resistant) */ + #define USE_FAST_MATH + #define TFM_TIMING_RESISTANT + + /* Define the maximum math bits used (2 * max) */ + #if !defined(NO_RSA) || !defined(NO_DH) + #define FP_MAX_BITS (2*2048) + #ifdef HAVE_ECC + #define ALT_ECC_SIZE /* use heap allocation for ECC point */ + #endif + #elif defined(HAVE_ECC) + #define FP_MAX_BITS (2*256) + #endif + #ifdef HAVE_ECC + //#define TFM_ECC256 /* optional speedup for ECC-256 bit */ + #endif +#else + /* Normal (integer.c) (heap based, not timing resistant) - not recommended */ + #define USE_INTEGER_HEAP_MATH +#endif + +/* Single Precision (optional) */ +/* Math written for specific curves and key sizes */ +#if 1 + #ifdef HAVE_ECC + #define WOLFSSL_HAVE_SP_ECC + //#define WOLFSSL_SP_NO_256 + //#define WOLFSSL_SP_384 + //#define WOLFSSL_SP_521 + #endif + #ifndef NO_RSA + #define WOLFSSL_HAVE_SP_RSA + //#define WOLFSSL_SP_NO_2048 + //#define WOLFSSL_SP_NO_3072 + //#define WOLFSSL_SP_4096 + #endif + #ifndef NO_DH + #define WOLFSSL_HAVE_SP_DH + #endif + + #define WOLFSSL_SP_SMALL /* use smaller version of code */ + //#define WOLFSSL_SP_NO_MALLOC /* disable heap in wolf/SP math */ + //#define SP_DIV_WORD_USE_DIV /* no div64 */ + + #if 0 + /* optional speedup with inline assembly */ + //#define WOLFSSL_SP_ARM_CORTEX_M_ASM /* Cortex-M3+ */ + //#define WOLFSSL_SP_ARM_THUMB_ASM /* Cortex-M0+ thumb */ + //#define WOLFSSL_SP_ARM32_ASM /* Cortex-R */ + //#define WOLFSSL_SP_ARM64_ASM /* Cortex-A */ + //#define WOLFSSL_SP_USE_UDIV + #endif +#endif + +/* ------------------------------------------------------------------------- */ +/* Assembly Speedups for Symmetric Algorithms */ +/* ------------------------------------------------------------------------- */ + +#ifdef CONFIG_WOLFCRYPT_ARMASM + #define WOLFSSL_ARMASM + #define WOLFSSL_NO_HASH_RAW + #define WOLFSSL_ARMASM_INLINE /* use inline .c versions */ + #define WOLFSSL_ARMASM_NO_NEON + + /* Default is ARMv8 */ + + #if 0 /* ARMv7 */ + #define WOLFSSL_ARM_ARCH 7 + #define WOLFSSL_ARMASM_NO_HW_CRYPTO /* enable if processor does not support aes/sha instructions */ + #endif #endif -#if defined(CONFIG_WOLFSSL_DEBUG) -#undef DEBUG_WOLFSSL -#define DEBUG_WOLFSSL +#ifdef CONFIG_WOLFCRYPT_INTELASM + #define USE_INTEL_SPEEDUP + #define WOLFSSL_X86_64_BUILD /* 64-bit */ + //#define WOLFSSL_X86_BUILD /* 32-bit */ + + /* Issues with building AESNI "_mm_aesimc_si128" always_inline */ + //#define WOLFSSL_AESNI #endif + +/* ------------------------------------------------------------------------- */ +/* Debugging */ +/* ------------------------------------------------------------------------- */ +#undef DEBUG_WOLFSSL +#undef NO_ERROR_STRINGS +#ifdef CONFIG_WOLFSSL_DEBUG + #define DEBUG_WOLFSSL +#else + #if 1 + #define NO_ERROR_STRINGS + #endif +#endif + + #ifdef __cplusplus } #endif diff -Nru mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/wolfssl/options.h mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/wolfssl/options.h --- mariadb-10.11.6/extra/wolfssl/wolfssl/zephyr/wolfssl/options.h 2023-06-19 04:16:56.000000000 +0000 +++ mariadb-10.11.9/extra/wolfssl/wolfssl/zephyr/wolfssl/options.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1 @@ +/* default blank options to appease code that may require it */ diff -Nru mariadb-10.11.6/include/byte_order_generic_x86_64.h mariadb-10.11.9/include/byte_order_generic_x86_64.h --- mariadb-10.11.6/include/byte_order_generic_x86_64.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/byte_order_generic_x86_64.h 2024-08-03 07:29:56.000000000 +0000 @@ -83,7 +83,7 @@ #define HAVE_mi_uint5korr #define HAVE_mi_uint6korr #define HAVE_mi_uint7korr -#define HAVE_mi_uint78orr +#define HAVE_mi_uint8korr /* Read numbers stored in high-bytes-first order */ diff -Nru mariadb-10.11.6/include/m_ctype.h mariadb-10.11.9/include/m_ctype.h --- mariadb-10.11.6/include/m_ctype.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/m_ctype.h 2024-08-03 07:29:56.000000000 +0000 @@ -447,7 +447,8 @@ MY_LEX_IDENT_OR_KEYWORD, MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR, MY_LEX_STRING_OR_DELIMITER, MY_LEX_MINUS_OR_COMMENT, MY_LEX_PLACEHOLDER, - MY_LEX_COMMA + MY_LEX_COMMA, + MY_LEX_IDENT_OR_QUALIFIED_SPECIAL_FUNC }; struct charset_info_st; diff -Nru mariadb-10.11.6/include/m_string.h mariadb-10.11.9/include/m_string.h --- mariadb-10.11.6/include/m_string.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/m_string.h 2024-08-03 07:29:56.000000000 +0000 @@ -239,15 +239,14 @@ lex_str->length= len; } -/* - Copies src into dst and ensures dst is a NULL terminated C string. +/** + Copies a string. - Returns 1 if the src string was truncated due to too small size of dst. - Returns 0 if src completely fit within dst. Pads the remaining dst with '\0' - - Note: dst_size must be > 0 + @param dst destination buffer, will be NUL padded. + @param dst_size size of dst buffer, must be > 0 + @param src NUL terminated source string */ -static inline int safe_strcpy(char *dst, size_t dst_size, const char *src) +static inline void safe_strcpy(char *dst, size_t dst_size, const char *src) { DBUG_ASSERT(dst_size > 0); @@ -256,45 +255,49 @@ * * 2) IF there is no 0 byte in the first dst_size bytes of src, strncpy will * copy dst_size bytes, and the final byte won't be 0. - * - * In GCC 8+, the `-Wstringop-truncation` warning will object to strncpy() - * being used in this way, so we need to disable this warning for this - * single statement. */ -#if defined(__GNUC__) && __GNUC__ >= 8 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wstringop-truncation" -#endif strncpy(dst, src, dst_size); -#if defined(__GNUC__) && __GNUC__ >= 8 -#pragma GCC diagnostic pop -#endif + dst[dst_size - 1]= 0; +} - if (dst[dst_size-1]) +/** + Copies a string, checking for truncation. + + @param dst destination buffer, will be NUL padded. + @param dst_size size of dst buffer, must be > 0 + @param src NUL terminated source string + + @retval 1 if the src string was truncated due to too small size of dst. + @retval 0 if src completely fit within dst, +*/ +static inline int safe_strcpy_truncated(char *dst, size_t dst_size, + const char *src) +{ + DBUG_ASSERT(dst_size > 0); + + strncpy(dst, src, dst_size); + if (dst[dst_size - 1]) { - /* Only possible in case (2), meaning src was truncated. */ - dst[dst_size-1]= 0; + dst[dst_size - 1]= 0; return 1; } return 0; } -/* - Appends src to dst and ensures dst is a NULL terminated C string. - - Returns 1 if the src string was truncated due to too small size of dst. - Returns 0 if src completely fit within the remaining dst space. Pads the - remaining dst with '\0'. +/** + Appends src to dst and ensures dst is a NUL terminated C string. - Note: dst_size must be > 0 + @retval 1 if the src string was truncated due to too small size of dst. + @retval 0 if src completely fit within the remaining dst space, + including NUL termination. */ static inline int safe_strcat(char *dst, size_t dst_size, const char *src) { size_t init_len= strlen(dst); - if (init_len >= dst_size - 1) + if (init_len > dst_size) return 1; - return safe_strcpy(dst + init_len, dst_size - init_len, src); + return safe_strcpy_truncated(dst + init_len, dst_size - init_len, src); } #ifdef __cplusplus diff -Nru mariadb-10.11.6/include/my_alloc.h mariadb-10.11.9/include/my_alloc.h --- mariadb-10.11.6/include/my_alloc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_alloc.h 2024-08-03 07:29:56.000000000 +0000 @@ -25,6 +25,8 @@ #define ALLOC_MAX_BLOCK_TO_DROP 4096 #define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP 10 +#define ROOT_FLAG_READ_ONLY 4 + #ifdef __cplusplus extern "C" { #endif @@ -53,10 +55,6 @@ unsigned short first_block_usage; unsigned short flags; -#ifdef PROTECT_STATEMENT_MEMROOT - int read_only; -#endif - void (*error_handler)(void); PSI_memory_key psi_key; diff -Nru mariadb-10.11.6/include/my_attribute.h mariadb-10.11.9/include/my_attribute.h --- mariadb-10.11.6/include/my_attribute.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_attribute.h 2024-08-03 07:29:56.000000000 +0000 @@ -70,5 +70,19 @@ # endif /* GNUC >= 3.1 */ #endif +/* Define pragmas to disable warnings for stack frame checking */ +#if defined(__clang__) +#define PRAGMA_DISABLE_CHECK_STACK_FRAME \ +_Pragma("clang diagnostic push") \ +_Pragma("clang diagnostic ignored \"-Wframe-larger-than=\"") + +#define PRAGMA_REENABLE_CHECK_STACK_FRAME \ +_Pragma("clang diagnostic pop") + +#else +#define PRAGMA_DISABLE_CHECK_STACK_FRAME +#define PRAGMA_REENABLE_CHECK_STACK_FRAME #endif + +#endif /* _my_attribute_h */ diff -Nru mariadb-10.11.6/include/my_base.h mariadb-10.11.9/include/my_base.h --- mariadb-10.11.6/include/my_base.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_base.h 2024-08-03 07:29:56.000000000 +0000 @@ -49,6 +49,7 @@ #define HA_OPEN_MERGE_TABLE 2048U #define HA_OPEN_FOR_CREATE 4096U #define HA_OPEN_FOR_DROP (1U << 13) /* Open part of drop */ +#define HA_OPEN_GLOBAL_TMP_TABLE (1U << 14) /* TMP table used by repliction */ /* Allow opening even if table is incompatible as this is for ALTER TABLE which @@ -369,6 +370,12 @@ #define HA_CREATE_INTERNAL_TABLE 256U #define HA_PRESERVE_INSERT_ORDER 512U #define HA_CREATE_NO_ROLLBACK 1024U +/* + A temporary table that can be used by different threads, eg. replication + threads. This flag ensure that memory is not allocated with THREAD_SPECIFIC, + as we do for other temporary tables. +*/ +#define HA_CREATE_GLOBAL_TMP_TABLE 2048U /* Flags used by start_bulk_insert */ diff -Nru mariadb-10.11.6/include/my_bitmap.h mariadb-10.11.9/include/my_bitmap.h --- mariadb-10.11.6/include/my_bitmap.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_bitmap.h 2024-08-03 07:29:56.000000000 +0000 @@ -22,14 +22,15 @@ #include #include -typedef uint32 my_bitmap_map; +typedef ulonglong my_bitmap_map; typedef struct st_bitmap { my_bitmap_map *bitmap; my_bitmap_map *last_word_ptr; - my_bitmap_map last_word_mask; + my_bitmap_map last_bit_mask; uint32 n_bits; /* number of bits occupied by the above */ + my_bool bitmap_allocated; } MY_BITMAP; #ifdef __cplusplus @@ -39,7 +40,7 @@ /* Reset memory. Faster then doing a full bzero */ #define my_bitmap_clear(A) ((A)->bitmap= 0) -extern void create_last_word_mask(MY_BITMAP *map); +extern void create_last_bit_mask(MY_BITMAP *map); extern my_bool my_bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits); extern my_bool bitmap_is_clear_all(const MY_BITMAP *map); extern my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size); @@ -53,12 +54,12 @@ extern my_bool bitmap_fast_test_and_clear(MY_BITMAP *map, uint bitmap_bit); extern my_bool bitmap_union_is_set_all(const MY_BITMAP *map1, const MY_BITMAP *map2); -extern my_bool bitmap_exists_intersection(const MY_BITMAP **bitmap_array, +extern my_bool bitmap_exists_intersection(MY_BITMAP **bitmap_array, uint bitmap_count, uint start_bit, uint end_bit); extern uint bitmap_set_next(MY_BITMAP *map); -extern uint bitmap_get_first(const MY_BITMAP *map); +extern uint bitmap_get_first_clear(const MY_BITMAP *map); extern uint bitmap_get_first_set(const MY_BITMAP *map); extern uint bitmap_bits_set(const MY_BITMAP *map); extern uint bitmap_get_next_set(const MY_BITMAP *map, uint bitmap_bit); @@ -71,54 +72,70 @@ extern void bitmap_xor(MY_BITMAP *map, const MY_BITMAP *map2); extern void bitmap_invert(MY_BITMAP *map); extern void bitmap_copy(MY_BITMAP *map, const MY_BITMAP *map2); +/* Functions to export/import bitmaps to an architecture independent format */ +extern void bitmap_export(uchar *to, MY_BITMAP *map); +extern void bitmap_import(MY_BITMAP *map, uchar *from); + +#define my_bitmap_map_bytes sizeof(my_bitmap_map) +#define my_bitmap_map_bits (my_bitmap_map_bytes*8) +/* Size in bytes to store 'bits' number of bits */ +#define bitmap_buffer_size(bits) (MY_ALIGN((bits), my_bitmap_map_bits)/8) +#define my_bitmap_buffer_size(map) bitmap_buffer_size((map)->n_bits) +#define no_bytes_in_export_map(map) (((map)->n_bits + 7)/8) +#define no_words_in_map(map) (((map)->n_bits + (my_bitmap_map_bits-1))/my_bitmap_map_bits) /* Fast, not thread safe, bitmap functions */ -#define bitmap_buffer_size(bits) (((bits)+31)/32)*4 -#define no_bytes_in_map(map) (((map)->n_bits + 7)/8) -#define no_words_in_map(map) (((map)->n_bits + 31)/32) -#define bytes_word_aligned(bytes) (4*((bytes + 3)/4)) -/* The following functions must be compatible with create_last_word_mask()! */ +/* The following functions must be compatible with create_last_bit_mask()! */ static inline void bitmap_set_bit(MY_BITMAP *map,uint bit) { - uchar *b= (uchar*) map->bitmap + bit / 8; DBUG_ASSERT(bit < map->n_bits); - *b= (uchar) (*b | 1U << (bit & 7)); + map->bitmap[bit/my_bitmap_map_bits]|= + (1ULL << (bit & (my_bitmap_map_bits-1))); } static inline void bitmap_flip_bit(MY_BITMAP *map,uint bit) { - uchar *b= (uchar*) map->bitmap + bit / 8; DBUG_ASSERT(bit < map->n_bits); - *b= (uchar) (*b ^ 1U << (bit & 7)); + map->bitmap[bit/my_bitmap_map_bits]^= + (1ULL << (bit & (my_bitmap_map_bits-1))); } static inline void bitmap_clear_bit(MY_BITMAP *map,uint bit) { - uchar *b= (uchar*) map->bitmap + bit / 8; DBUG_ASSERT(bit < map->n_bits); - *b= (uchar) (*b & ~(1U << (bit & 7))); + map->bitmap[bit/my_bitmap_map_bits]&= + ~(1ULL << (bit & (my_bitmap_map_bits-1))); } static inline uint bitmap_is_set(const MY_BITMAP *map,uint bit) { - const uchar *b= (const uchar*) map->bitmap + bit / 8; DBUG_ASSERT(bit < map->n_bits); - return !!(*b & (1U << (bit & 7))); + return (!!(map->bitmap[bit/my_bitmap_map_bits] & + (1ULL << (bit & (my_bitmap_map_bits-1))))); } +/* Return true if bitmaps are equal */ static inline my_bool bitmap_cmp(const MY_BITMAP *map1, const MY_BITMAP *map2) { - if (memcmp(map1->bitmap, map2->bitmap, 4*(no_words_in_map(map1)-1)) != 0) - return FALSE; - return ((*map1->last_word_ptr | map1->last_word_mask) == - (*map2->last_word_ptr | map2->last_word_mask)); + DBUG_ASSERT(map1->n_bits == map2->n_bits); + return (memcmp(map1->bitmap, map2->bitmap, + my_bitmap_buffer_size(map1)) == 0); } #define bitmap_clear_all(MAP) \ - { memset((MAP)->bitmap, 0, 4*no_words_in_map((MAP))); } -#define bitmap_set_all(MAP) \ - (memset((MAP)->bitmap, 0xFF, 4*no_words_in_map((MAP)))) + { memset((MAP)->bitmap, 0, my_bitmap_buffer_size(MAP)); } + +static inline void +bitmap_set_all(const MY_BITMAP *map) +{ + if (map->n_bits) + { + memset(map->bitmap, 0xFF, my_bitmap_map_bytes * (no_words_in_map(map)-1)); + DBUG_ASSERT(map->bitmap + no_words_in_map(map)-1 == map->last_word_ptr); + *map->last_word_ptr= ~map->last_bit_mask; + } +} #ifdef __cplusplus } diff -Nru mariadb-10.11.6/include/my_global.h mariadb-10.11.9/include/my_global.h --- mariadb-10.11.6/include/my_global.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_global.h 2024-08-03 07:29:56.000000000 +0000 @@ -973,6 +973,7 @@ #define SOCKET_ECONNRESET WSAECONNRESET #define SOCKET_ENFILE ENFILE #define SOCKET_EMFILE EMFILE +#define SOCKET_CLOSED EIO #else /* Unix */ #define socket_errno errno #define closesocket(A) close(A) @@ -982,6 +983,7 @@ #define SOCKET_EADDRINUSE EADDRINUSE #define SOCKET_ETIMEDOUT ETIMEDOUT #define SOCKET_ECONNRESET ECONNRESET +#define SOCKET_CLOSED EIO #define SOCKET_ENFILE ENFILE #define SOCKET_EMFILE EMFILE #endif diff -Nru mariadb-10.11.6/include/my_pthread.h mariadb-10.11.9/include/my_pthread.h --- mariadb-10.11.6/include/my_pthread.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_pthread.h 2024-08-03 07:29:56.000000000 +0000 @@ -147,9 +147,6 @@ #ifndef _REENTRANT #define _REENTRANT #endif -#ifdef HAVE_THR_SETCONCURRENCY -#include /* Probably solaris */ -#endif #ifdef HAVE_SCHED_H #include #endif @@ -618,9 +615,6 @@ #define GETHOSTBYADDR_BUFF_SIZE 2048 -#ifndef HAVE_THR_SETCONCURRENCY -#define thr_setconcurrency(A) pthread_dummy(0) -#endif #if !defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) && ! defined(pthread_attr_setstacksize) #define pthread_attr_setstacksize(A,B) pthread_dummy(0) #endif @@ -667,15 +661,19 @@ We need to have at least 256K stack to handle calls to myisamchk_init() with the current number of keys and key parts. */ -#if defined(__SANITIZE_ADDRESS__) || defined(WITH_UBSAN) -#ifndef DBUG_OFF -#define DEFAULT_THREAD_STACK (1024*1024L) -#else -#define DEFAULT_THREAD_STACK (383*1024L) /* 392192 */ -#endif -#else -#define DEFAULT_THREAD_STACK (292*1024L) /* 299008 */ -#endif +# if defined(__SANITIZE_ADDRESS__) || defined(WITH_UBSAN) +/* + Optimized WITH_ASAN=ON executables produced + by GCC 12.3.0, GCC 13.2.0, or clang 16.0.6 + would fail ./mtr main.1st when the stack size is 5 MiB. + The minimum is more than 6 MiB for CMAKE_BUILD_TYPE=RelWithDebInfo and + more than 10 MiB for CMAKE_BUILD_TYPE=Debug. + Let us add some safety margin. +*/ +# define DEFAULT_THREAD_STACK (11L<<20) +# else +# define DEFAULT_THREAD_STACK (292*1024L) /* 299008 */ +# endif #endif #define MY_PTHREAD_LOCK_READ 0 diff -Nru mariadb-10.11.6/include/my_rdtsc.h mariadb-10.11.9/include/my_rdtsc.h --- mariadb-10.11.6/include/my_rdtsc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_rdtsc.h 2024-08-03 07:29:56.000000000 +0000 @@ -111,7 +111,7 @@ On AARCH64, we use the generic timer base register. We override clang implementation for aarch64 as it access a PMU register which is not guaranteed to be active. - On RISC-V, we use the rdcycle instruction to read from mcycle register. + On RISC-V, we use the rdtime instruction to read from mtime register. Sadly, we have nothing for the Digital Alpha, MIPS, Motorola m68k, HP PA-RISC or other non-mainstream (or obsolete) processors. @@ -211,15 +211,15 @@ } #elif defined(__riscv) #define MY_TIMER_ROUTINE_CYCLES MY_TIMER_ROUTINE_RISCV - /* Use RDCYCLE (and RDCYCLEH on riscv32) */ + /* Use RDTIME (and RDTIMEH on riscv32) */ { # if __riscv_xlen == 32 ulong result_lo, result_hi0, result_hi1; /* Implemented in assembly because Clang insisted on branching. */ __asm __volatile__( - "rdcycleh %0\n" - "rdcycle %1\n" - "rdcycleh %2\n" + "rdtimeh %0\n" + "rdtime %1\n" + "rdtimeh %2\n" "sub %0, %0, %2\n" "seqz %0, %0\n" "sub %0, zero, %0\n" @@ -228,7 +228,7 @@ return (static_cast(result_hi1) << 32) | result_lo; # else ulonglong result; - __asm __volatile__("rdcycle %0" : "=r"(result)); + __asm __volatile__("rdtime %0" : "=r"(result)); return result; } # endif @@ -242,6 +242,18 @@ #endif } +#if MY_TIMER_ROUTINE_CYCLES == 0 +static inline size_t my_pseudo_random(void) +{ + /* In some platforms, pthread_self() might return a structure + that cannot be converted to a number like this. Possible alternatives + could include gettid() or sched_getcpu(). */ + return ((size_t) pthread_self()) / 16; +} +#else +# define my_pseudo_random my_timer_cycles +#endif + /** A nanosecond timer. @return the current timer value, in nanoseconds. diff -Nru mariadb-10.11.6/include/my_sys.h mariadb-10.11.9/include/my_sys.h --- mariadb-10.11.6/include/my_sys.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/my_sys.h 2024-08-03 07:29:56.000000000 +0000 @@ -154,7 +154,7 @@ void sf_report_leaked_memory(my_thread_id id); int sf_sanity(); extern my_thread_id (*sf_malloc_dbug_id)(void); -#define SAFEMALLOC_REPORT_MEMORY(X) sf_report_leaked_memory(X) +#define SAFEMALLOC_REPORT_MEMORY(X) if (!sf_leaking_memory) sf_report_leaked_memory(X) #else #define SAFEMALLOC_REPORT_MEMORY(X) do {} while(0) #endif @@ -655,6 +655,7 @@ myf MyFlags); extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags); extern my_off_t my_ftell(FILE *stream,myf MyFlags); +extern void (*my_sleep_for_space)(unsigned int seconds); /* implemented in my_memmem.c */ extern void *my_memmem(const void *haystack, size_t haystacklen, @@ -884,6 +885,7 @@ extern void *alloc_root(MEM_ROOT *mem_root, size_t Size); extern void *multi_alloc_root(MEM_ROOT *mem_root, ...); extern void free_root(MEM_ROOT *root, myf MyFLAGS); +extern void move_root(MEM_ROOT *to, MEM_ROOT *from); extern void set_prealloc_root(MEM_ROOT *root, char *ptr); extern void reset_root_defaults(MEM_ROOT *mem_root, size_t block_size, size_t prealloc_size); diff -Nru mariadb-10.11.6/include/myisamchk.h mariadb-10.11.9/include/myisamchk.h --- mariadb-10.11.6/include/myisamchk.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/myisamchk.h 2024-08-03 07:29:56.000000000 +0000 @@ -112,6 +112,7 @@ uint progress_counter; /* How often to call _report_progress() */ ulonglong progress, max_progress; + void (*init_fix_record)(void *); int (*fix_record)(struct st_myisam_info *info, uchar *record, int keynum); mysql_mutex_t print_msg_mutex; diff -Nru mariadb-10.11.6/include/mysql/plugin.h mariadb-10.11.9/include/mysql/plugin.h --- mariadb-10.11.6/include/mysql/plugin.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin.h 2024-08-03 07:29:56.000000000 +0000 @@ -531,7 +531,13 @@ const char *author; /* plugin author (for I_S.PLUGINS) */ const char *descr; /* general descriptive text (for I_S.PLUGINS) */ int license; /* the plugin license (PLUGIN_LICENSE_XXX) */ - int (*init)(void *); /* the function to invoke when plugin is loaded */ + /* + The function to invoke when plugin is loaded. Plugin + initialisation done here should defer any ALTER TABLE queries to + after the ddl recovery is done, in the signal_ddl_recovery_done() + callback called by ha_signal_ddl_recovery_done(). + */ + int (*init)(void *); int (*deinit)(void *);/* the function to invoke when plugin is unloaded */ unsigned int version; /* plugin version (for I_S.PLUGINS) */ struct st_mysql_show_var *status_vars; @@ -555,7 +561,13 @@ const char *author; /* plugin author (for SHOW PLUGINS) */ const char *descr; /* general descriptive text (for SHOW PLUGINS ) */ int license; /* the plugin license (PLUGIN_LICENSE_XXX) */ - int (*init)(void *); /* the function to invoke when plugin is loaded */ + /* + The function to invoke when plugin is loaded. Plugin + initialisation done here should defer any ALTER TABLE queries to + after the ddl recovery is done, in the signal_ddl_recovery_done() + callback called by ha_signal_ddl_recovery_done(). + */ + int (*init)(void *); int (*deinit)(void *);/* the function to invoke when plugin is unloaded */ unsigned int version; /* plugin version (for SHOW PLUGINS) */ struct st_mysql_show_var *status_vars; diff -Nru mariadb-10.11.6/include/mysql/plugin_audit.h.pp mariadb-10.11.9/include/mysql/plugin_audit.h.pp --- mariadb-10.11.6/include/mysql/plugin_audit.h.pp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin_audit.h.pp 2024-08-03 07:29:56.000000000 +0000 @@ -487,6 +487,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; MYSQL *mysql_real_connect_local(MYSQL *mysql); } diff -Nru mariadb-10.11.6/include/mysql/plugin_auth.h.pp mariadb-10.11.9/include/mysql/plugin_auth.h.pp --- mariadb-10.11.6/include/mysql/plugin_auth.h.pp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin_auth.h.pp 2024-08-03 07:29:56.000000000 +0000 @@ -487,6 +487,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; MYSQL *mysql_real_connect_local(MYSQL *mysql); } diff -Nru mariadb-10.11.6/include/mysql/plugin_data_type.h.pp mariadb-10.11.9/include/mysql/plugin_data_type.h.pp --- mariadb-10.11.6/include/mysql/plugin_data_type.h.pp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin_data_type.h.pp 2024-08-03 07:29:56.000000000 +0000 @@ -487,6 +487,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; MYSQL *mysql_real_connect_local(MYSQL *mysql); } diff -Nru mariadb-10.11.6/include/mysql/plugin_encryption.h.pp mariadb-10.11.9/include/mysql/plugin_encryption.h.pp --- mariadb-10.11.6/include/mysql/plugin_encryption.h.pp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin_encryption.h.pp 2024-08-03 07:29:56.000000000 +0000 @@ -487,6 +487,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; MYSQL *mysql_real_connect_local(MYSQL *mysql); } diff -Nru mariadb-10.11.6/include/mysql/plugin_ftparser.h.pp mariadb-10.11.9/include/mysql/plugin_ftparser.h.pp --- mariadb-10.11.6/include/mysql/plugin_ftparser.h.pp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin_ftparser.h.pp 2024-08-03 07:29:56.000000000 +0000 @@ -487,6 +487,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; MYSQL *mysql_real_connect_local(MYSQL *mysql); } diff -Nru mariadb-10.11.6/include/mysql/plugin_function.h.pp mariadb-10.11.9/include/mysql/plugin_function.h.pp --- mariadb-10.11.6/include/mysql/plugin_function.h.pp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin_function.h.pp 2024-08-03 07:29:56.000000000 +0000 @@ -487,6 +487,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; MYSQL *mysql_real_connect_local(MYSQL *mysql); } diff -Nru mariadb-10.11.6/include/mysql/plugin_password_validation.h.pp mariadb-10.11.9/include/mysql/plugin_password_validation.h.pp --- mariadb-10.11.6/include/mysql/plugin_password_validation.h.pp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/plugin_password_validation.h.pp 2024-08-03 07:29:56.000000000 +0000 @@ -487,6 +487,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; MYSQL *mysql_real_connect_local(MYSQL *mysql); } diff -Nru mariadb-10.11.6/include/mysql/service_print_check_msg.h mariadb-10.11.9/include/mysql/service_print_check_msg.h --- mariadb-10.11.6/include/mysql/service_print_check_msg.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/include/mysql/service_print_check_msg.h 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,44 @@ +/* Copyright (c) 2019, MariaDB Corporation. + + 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; version 2 of the License. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#pragma once + +/** + @file include/mysql/service_print_check_msg.h + This service provides functions to write messages for check or repair +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + +extern struct print_check_msg_service_st { + void (*print_check_msg)(MYSQL_THD, const char *db_name, const char *table_name, + const char *op, const char *msg_type, const char *message, + my_bool print_to_log); +} *print_check_msg_service; + +#ifdef MYSQL_DYNAMIC_PLUGIN +# define print_check_msg_context(_THD) print_check_msg_service->print_check_msg +#else +extern void print_check_msg(MYSQL_THD, const char *db_name, const char *table_name, + const char *op, const char *msg_type, const char *message, + my_bool print_to_log); +#endif + +#ifdef __cplusplus +} +#endif diff -Nru mariadb-10.11.6/include/mysql/service_sql.h mariadb-10.11.9/include/mysql/service_sql.h --- mariadb-10.11.6/include/mysql/service_sql.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/service_sql.h 2024-08-03 07:29:56.000000000 +0000 @@ -68,6 +68,9 @@ int (STDCALL *mysql_set_character_set_func)(MYSQL *mysql, const char *cs_name); unsigned int (STDCALL *mysql_num_fields_func)(MYSQL_RES *res); int (STDCALL *mysql_select_db_func)(MYSQL *mysql, const char *db); + my_bool (STDCALL *mysql_ssl_set_func)(MYSQL *mysql, const char *key, + const char *cert, const char *ca, + const char *capath, const char *cipher); } *sql_service; #ifdef MYSQL_DYNAMIC_PLUGIN @@ -89,6 +92,7 @@ #define mysql_set_character_set(M,C) sql_service->mysql_set_character_set_func(M,C) #define mysql_num_fields(R) sql_service->mysql_num_fields_func(R) #define mysql_select_db(M,D) sql_service->mysql_select_db_func(M,D) +#define mysql_ssl_set(M,K,C,A,P,H) sql_service->mysql_ssl_set_func(M,K,C,A,P,H) #else @@ -111,5 +115,3 @@ #endif #endif /*MYSQL_SERVICE_SQL */ - - diff -Nru mariadb-10.11.6/include/mysql/service_wsrep.h mariadb-10.11.9/include/mysql/service_wsrep.h --- mariadb-10.11.6/include/mysql/service_wsrep.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql/service_wsrep.h 2024-08-03 07:29:56.000000000 +0000 @@ -95,6 +95,7 @@ void (*wsrep_thd_kill_LOCK_func)(const MYSQL_THD thd); void (*wsrep_thd_kill_UNLOCK_func)(const MYSQL_THD thd); void (*wsrep_thd_set_wsrep_PA_unsafe_func)(MYSQL_THD thd); + uint32 (*wsrep_get_domain_id_func)(); } *wsrep_service; #define MYSQL_SERVICE_WSREP_INCLUDED @@ -144,6 +145,7 @@ #define wsrep_thd_set_ignored_error(T,V) wsrep_service->wsrep_thd_set_ignored_error_func(T,V) #define wsrep_report_bf_lock_wait(T,I) wsrep_service->wsrep_report_bf_lock_wait(T,I) #define wsrep_thd_set_PA_unsafe(T) wsrep_service->wsrep_thd_set_PA_unsafe_func(T) +#define wsrep_get_domain_id(T) wsrep_service->wsrep_get_domain_id_func(T) #else #define MYSQL_SERVICE_WSREP_STATIC_INCLUDED @@ -253,5 +255,6 @@ unsigned long long trx_id); /* declare parallel applying unsafety for the THD */ extern "C" void wsrep_thd_set_PA_unsafe(MYSQL_THD thd); +extern "C" uint32 wsrep_get_domain_id(); #endif #endif /* MYSQL_SERVICE_WSREP_INCLUDED */ diff -Nru mariadb-10.11.6/include/mysql.h mariadb-10.11.9/include/mysql.h --- mariadb-10.11.6/include/mysql.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql.h 2024-08-03 07:29:56.000000000 +0000 @@ -268,7 +268,6 @@ char *host,*user,*passwd,*unix_socket,*server_version,*host_info; char *info, *db; const struct charset_info_st *charset; - MYSQL_FIELD *fields; MEM_ROOT field_alloc; my_ulonglong affected_rows; my_ulonglong insert_id; /* id if insert on table with NEXTNR */ @@ -290,7 +289,8 @@ /* session-wide random string */ char scramble[SCRAMBLE_LENGTH+1]; my_bool auto_local_infile; - void *unused2, *unused3, *unused4, *unused5; + void *unused2, *unused3, *unused4; + MYSQL_FIELD *fields; LIST *stmts; /* list of all statements */ const struct st_mysql_methods *methods; diff -Nru mariadb-10.11.6/include/mysql_com.h mariadb-10.11.9/include/mysql_com.h --- mariadb-10.11.6/include/mysql_com.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/mysql_com.h 2024-08-03 07:29:56.000000000 +0000 @@ -477,7 +477,8 @@ char net_skip_rest_factor; my_bool thread_specific_malloc; unsigned char compress; - my_bool unused3; /* Please remove with the next incompatible ABI change. */ + my_bool pkt_nr_can_be_reset; + my_bool using_proxy_protocol; /* Pointer to query object in query cache, do not equal NULL (0) for queries in cache that have not stored its results yet diff -Nru mariadb-10.11.6/include/service_versions.h mariadb-10.11.9/include/service_versions.h --- mariadb-10.11.6/include/service_versions.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/service_versions.h 2024-08-03 07:29:56.000000000 +0000 @@ -44,6 +44,7 @@ #define VERSION_wsrep 0x0500 #define VERSION_json 0x0100 #define VERSION_thd_mdl 0x0100 +#define VERSION_print_check_msg 0x0100 #define VERSION_sql_service 0x0101 #define VERSION_provider_bzip2 0x0100 diff -Nru mariadb-10.11.6/include/source_revision.h mariadb-10.11.9/include/source_revision.h --- mariadb-10.11.6/include/source_revision.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/include/source_revision.h 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1 @@ +#define SOURCE_REVISION "0e8fb977b00983d98c4c35e39bc1f36463095938" diff -Nru mariadb-10.11.6/include/sslopt-longopts.h mariadb-10.11.9/include/sslopt-longopts.h --- mariadb-10.11.6/include/sslopt-longopts.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/sslopt-longopts.h 2024-08-03 07:29:56.000000000 +0000 @@ -19,13 +19,12 @@ #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) - {"ssl", OPT_SSL_SSL, + {"ssl", 0, "Enable SSL for connection (automatically enabled with other flags).", &opt_use_ssl, &opt_use_ssl, 0, GET_BOOL, OPT_ARG, 1, 0, 0, 0, 0, 0}, {"ssl-ca", OPT_SSL_CA, "CA file in PEM format (check OpenSSL docs, implies --ssl).", - &opt_ssl_ca, &opt_ssl_ca, 0, GET_STR, REQUIRED_ARG, - 0, 0, 0, 0, 0, 0}, + &opt_ssl_ca, &opt_ssl_ca, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"ssl-capath", OPT_SSL_CAPATH, "CA directory (check OpenSSL docs, implies --ssl).", &opt_ssl_capath, &opt_ssl_capath, 0, GET_STR, REQUIRED_ARG, @@ -46,13 +45,12 @@ "Certificate revocation list path (implies --ssl).", &opt_ssl_crlpath, &opt_ssl_crlpath, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - {"tls-version", OPT_TLS_VERSION, - "TLS protocol version for secure connection.", + {"tls-version", 0, "TLS protocol version for secure connection.", &opt_tls_version, &opt_tls_version, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, #ifdef MYSQL_CLIENT - {"ssl-verify-server-cert", OPT_SSL_VERIFY_SERVER_CERT, + {"ssl-verify-server-cert", 0, "Verify server's \"Common Name\" in its cert against hostname used " "when connecting. This option is disabled by default.", &opt_ssl_verify_server_cert, &opt_ssl_verify_server_cert, diff -Nru mariadb-10.11.6/include/violite.h mariadb-10.11.9/include/violite.h --- mariadb-10.11.6/include/violite.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/include/violite.h 2024-08-03 07:29:56.000000000 +0000 @@ -41,6 +41,13 @@ VIO_TYPE_SSL /* see also vio_type_names[] */ }; + +enum enum_vio_state +{ + VIO_STATE_NOT_INITIALIZED, VIO_STATE_ACTIVE, VIO_STATE_SHUTDOWN, + VIO_STATE_CLOSED +}; + #define FIRST_VIO_TYPE VIO_CLOSED #define LAST_VIO_TYPE VIO_TYPE_SSL @@ -244,6 +251,7 @@ struct sockaddr_storage local; /* Local internet address */ struct sockaddr_storage remote; /* Remote internet address */ enum enum_vio_type type; /* Type of connection */ + enum enum_vio_state state; /* State of the connection */ const char *desc; /* String description */ char *read_buffer; /* buffer for vio_read_buff */ char *read_pos; /* start of unfetched data in the diff -Nru mariadb-10.11.6/libmariadb/.gitattributes mariadb-10.11.9/libmariadb/.gitattributes --- mariadb-10.11.6/libmariadb/.gitattributes 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/libmariadb/.gitattributes 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,9 @@ +# Normalise line endings: +* text=auto + +# Prevent certain files from being exported: +.gitattributes export-ignore +.gitignore export-ignore + +# merge +.travis.yml merge=cc diff -Nru mariadb-10.11.6/libmariadb/.gitignore mariadb-10.11.9/libmariadb/.gitignore --- mariadb-10.11.6/libmariadb/.gitignore 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/libmariadb/.gitignore 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,116 @@ +CMakeCache.txt +CMakeFiles/* +Makefile +include/my_config.h +include/mysql_version.h +CMakeFiles +mysql_config/mysql_config.c +examples/mysql_affected_rows +examples/mysql_debug +examples/test_output +mysql_config/mysql_config +mariadb_config/libmariadb.pc + +# Keep empty directories: +# Keep empty directories: >> .gitignore/.git* + +# Compiled Static libraries +*.lib +*.a +*.la +*.lai +*.lo + +# Compiled Dynamic libraries +*.so +*.so.* +*.dylib +*.dll + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +*.dgcov +.*.swp +.gdb_history +CTestTestfile.cmake +cmake_install.cmake +bin/ +include/config.h +include/ma_config.h +include/mariadb/mariadb/ +include/mariadb/ma_errmsg.h +include/mariadb/ma_list.h +include/mariadb/ma_pvio.h +include/mariadb/ma_tls.h +include/mariadb/mariadb_com.h +include/mariadb/mariadb_ctype.h +include/mariadb/mariadb_dyncol.h +include/mariadb/mariadb_stmt.h +include/mariadb/mariadb_version.h +include/mariadb/mysql.h +include/mariadb/mysql/ +include/mariadb_version.h +lib/ +libmariadb/home/ +libmariadb/ma_client_plugin.c +libmariadb/mariadbclient.def +mariadb_config/mariadb_config +mariadb_config/mariadb_config.c +manpages.list +unittest/libmariadb/async +unittest/libmariadb/basic-t +unittest/libmariadb/bulk1 +unittest/libmariadb/charset +unittest/libmariadb/connection +unittest/libmariadb/cursor +unittest/libmariadb/dyncol +unittest/libmariadb/errors +unittest/libmariadb/features-10_2 +unittest/libmariadb/fetch +unittest/libmariadb/fingerprint.list +unittest/libmariadb/logs +unittest/libmariadb/misc +unittest/libmariadb/performance +unittest/libmariadb/ps +unittest/libmariadb/ps_bugs +unittest/libmariadb/ps_new +unittest/libmariadb/result +unittest/libmariadb/rpl_api +unittest/libmariadb/sp +unittest/libmariadb/sqlite3 +unittest/libmariadb/ssl +unittest/libmariadb/t_aurora +unittest/libmariadb/t_conc173 +unittest/libmariadb/thread +unittest/libmariadb/view +unittest/libmariadb/conc336 + +benchmark/benchmark/ +benchmark/bld/ +benchmark/mariadb.json +benchmark/mysql.json +benchmark/main-benchmark + +#VS files/directories +*.vcxproj +*.filters +*.user +ipch +*.sln +*.suo +*.sdf +Win32 +x64 +*.dir +Debug +Release +RelWithDebInfo + +#vim backups +*.*~ diff -Nru mariadb-10.11.6/libmariadb/.travis.yml mariadb-10.11.9/libmariadb/.travis.yml --- mariadb-10.11.6/libmariadb/.travis.yml 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/.travis.yml 2024-08-03 07:30:01.000000000 +0000 @@ -1,10 +1,5 @@ -os: linux -dist: focal language: c -services: docker -addons: - hosts: - - mariadb.example.com +version: ~> 1.0 cache: apt: true @@ -12,98 +7,22 @@ directories: - $HOME/docker -before_install: - - git clone https://github.com/mariadb-corporation/connector-test-machine.git - # Load cached docker images - - if [[ -d $HOME/docker ]]; then ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c "zcat {file} | docker load"; fi +env: + global: local=0 DB=testc CLEAR_TEXT=0 -install: - - |- - if [ -z "$server_branch" ] ; then - case $TRAVIS_OS_NAME in - windows) - connector-test-machine/launch.bat -t "$srv" -v "$v" -d testc - ;; - linux) - source connector-test-machine/launch.sh -t "$srv" -v "$v" -d testc -l "$local" -n "$native" - ;; - esac - fi - - -env: local=0 - -stages: - - Minimal - - name: Enterprise - if: type = push AND fork = false - - Community +import: mariadb-corporation/connector-test-machine:common-build.yml@master jobs: - fast_finish: true - allow_failures: - - env: srv=maxscale - - env: srv=skysql - - env: srv=skysql-ha - - env: srv=xpand - - env: srv=mysql v=5.7 - - env: srv=mysql v=8.0 include: - - stage: Minimal - env: srv=mariadb v=10.6 packet=8 - name: "CS 10.6" - - env: srv=mariadb-es - name: "ES latest" - if: type = push AND fork = false - - env: server_branch=10.11 - name: "10.11 Server unit testing" - - - stage: Enterprise - env: srv=mariadb-es v=10.4 - dist: bionic - name: "ES 10.4" - - env: srv=mariadb-es v=10.5 - dist: bionic - name: "ES 10.5" - - env: srv=mariadb-es v=10.6 - name: "ES 10.6" - - env: srv=mariadb-es-test v=23.08 - name: "ES 23.08" - - env: srv=maxscale - name: "Maxscale" - - env: srv=xpand - name: "Xpand" - - stage: Community - env: srv=mariadb v=10.11 - os: windows - language: shell - name: "Windows" - - env: server_branch=10.6 - name: "10.6 Server unit testing" + env: srv=mariadb v=10.11 local=1 TEST_OPTION=--ps-protocol + name: "CS 10.11 with ps-protocol" + - stage: Other + env: server_branch=10.6 + name: "CS 10.6 Server unit testing" + - env: server_branch=10.11 + name: "CS 10.11 Server unit testing" - env: server_branch=11.3 TEST_OPTION=--ps-protocol name: "11.3 Server unit testing with ps-protocol" - - env: srv=mariadb v=10.4 local=1 - dist: bionic - name: "CS 10.4" - - env: srv=mariadb v=10.5 local=1 - dist: bionic - name: "CS 10.5" - - env: srv=mariadb v=10.9 local=1 - name: "CS 10.9" - - env: srv=mariadb v=10.10 local=1 - name: "CS 10.10" - - env: srv=mariadb v=10.11 local=1 - name: "CS 10.11" - - env: srv=mariadb v=10.11 local=1 TEST_OPTION=--ps-protocol - name: "CS 10.11 with ps-protocol" - - env: srv=mariadb v=11.0 local=1 - name: "CS 11.0" - - env: srv=mariadb v=11.1 local=1 - name: "CS 11.1" - - env: srv=mysql v=5.7 native=1 - name: "MySQL 5.7" - - env: srv=mysql v=8.0 native=1 - name: "MySQL 8.0" script: ./travis.sh diff -Nru mariadb-10.11.6/libmariadb/CMakeLists.txt mariadb-10.11.9/libmariadb/CMakeLists.txt --- mariadb-10.11.6/libmariadb/CMakeLists.txt 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/CMakeLists.txt 2024-08-03 07:30:01.000000000 +0000 @@ -36,7 +36,7 @@ SET(CPACK_PACKAGE_VERSION_MAJOR 3) SET(CPACK_PACKAGE_VERSION_MINOR 3) -SET(CPACK_PACKAGE_VERSION_PATCH 8) +SET(CPACK_PACKAGE_VERSION_PATCH 11) SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") MATH(EXPR MARIADB_PACKAGE_VERSION_ID "${CPACK_PACKAGE_VERSION_MAJOR} * 10000 + ${CPACK_PACKAGE_VERSION_MINOR} * 100 + @@ -307,8 +307,8 @@ ADD_DEFINITIONS(-DHAVE_OPENSSL -DHAVE_TLS) SET(SSL_SOURCES "${CC_SOURCE_DIR}/libmariadb/secure/openssl.c") SET(SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY}) - IF(WIN32) - CHECK_INCLUDE_FILES (${OPENSSL_INCLUDE_DIR}/openssl/applink.c HAVE_OPENSSL_APPLINK_C) + IF(WIN32 AND EXISTS ${OPENSSL_INCLUDE_DIR}/openssl/applink.c) + SET(HAVE_OPENSSL_APPLINK_C 1) ENDIF() INCLUDE_DIRECTORIES(BEFORE ${OPENSSL_INCLUDE_DIR}) @@ -395,7 +395,7 @@ MESSAGE1(SYSTEM_LIBS "SYSTEM_LIBS ${SYSTEM_LIBS}") MARK_AS_ADVANCED(SYSTEM_LIBS) -IF(NOT IS_SUBPROJECT) +IF(NOT IS_SUBPROJECT AND (NOT DEFINED CMAKE_COMPILE_WARNING_AS_ERROR)) IF ((NOT WIN32) AND (CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "GNU")) SET(WARNING_AS_ERROR "-Werror") ELSEIF(CMAKE_C_COMPILER_ID MATCHES "MSVC") diff -Nru mariadb-10.11.6/libmariadb/cmake/FindZStd.cmake mariadb-10.11.9/libmariadb/cmake/FindZStd.cmake --- mariadb-10.11.6/libmariadb/cmake/FindZStd.cmake 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/cmake/FindZStd.cmake 2024-08-03 07:30:01.000000000 +0000 @@ -10,7 +10,7 @@ HINTS ${ZSTD_ROOT_DIR}/include) find_library(ZSTD_LIBRARIES - NAMES zstd + NAMES zstd zstd_static HINTS ${ZSTD_ROOT_DIR}/lib) include(FindPackageHandleStandardArgs) diff -Nru mariadb-10.11.6/libmariadb/include/CMakeLists.txt mariadb-10.11.9/libmariadb/include/CMakeLists.txt --- mariadb-10.11.6/libmariadb/include/CMakeLists.txt 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/include/CMakeLists.txt 2024-08-03 07:30:01.000000000 +0000 @@ -17,7 +17,6 @@ ENDIF() SET(MYSQL_ADDITIONAL_INCLUDES ${CC_SOURCE_DIR}/include/mysql/client_plugin.h - ${CC_SOURCE_DIR}/include/mysql/plugin_auth_common.h ${CC_SOURCE_DIR}/include/mysql/plugin_auth.h ) SET(MARIADB_ADDITIONAL_INCLUDES diff -Nru mariadb-10.11.6/libmariadb/include/errmsg.h mariadb-10.11.9/libmariadb/include/errmsg.h --- mariadb-10.11.6/libmariadb/include/errmsg.h 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/include/errmsg.h 2024-08-03 07:30:01.000000000 +0000 @@ -114,10 +114,11 @@ #define CR_BINLOG_ERROR 5021 #define CR_BINLOG_INVALID_FILE 5022 #define CR_BINLOG_SEMI_SYNC_ERROR 5023 +#define CR_INVALID_CLIENT_FLAG 5024 /* Always last, if you add new error codes please update the value for CR_MARIADB_LAST_ERROR */ -#define CR_MARIADB_LAST_ERROR CR_BINLOG_INVALID_FILE +#define CR_MARIADB_LAST_ERROR CR_INVALID_CLIENT_FLAG #endif diff -Nru mariadb-10.11.6/libmariadb/include/ma_hash.h mariadb-10.11.9/libmariadb/include/ma_hash.h --- mariadb-10.11.6/libmariadb/include/ma_hash.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/libmariadb/include/ma_hash.h 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,22 @@ +#ifndef _ma_hash_h_ +#define _ma_hash_h_ + +/*! Hash algorithms */ +#define MA_HASH_MD5 1 +#define MA_HASH_SHA1 2 +#define MA_HASH_SHA224 3 +#define MA_HASH_SHA256 4 +#define MA_HASH_SHA384 5 +#define MA_HASH_SHA512 6 + +/*! Hash digest sizes */ +#define MA_MD5_HASH_SIZE 16 +#define MA_SHA1_HASH_SIZE 20 +#define MA_SHA224_HASH_SIZE 28 +#define MA_SHA256_HASH_SIZE 32 +#define MA_SHA384_HASH_SIZE 48 +#define MA_SHA512_HASH_SIZE 64 + +#define MA_MAX_HASH_SIZE 64 + +#endif diff -Nru mariadb-10.11.6/libmariadb/include/mariadb_com.h mariadb-10.11.9/libmariadb/include/mariadb_com.h --- mariadb-10.11.6/libmariadb/include/mariadb_com.h 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/include/mariadb_com.h 2024-08-03 07:30:01.000000000 +0000 @@ -205,11 +205,17 @@ CLIENT_MULTI_STATEMENTS |\ CLIENT_MULTI_RESULTS |\ CLIENT_PROGRESS |\ - CLIENT_SSL_VERIFY_SERVER_CERT |\ + CLIENT_SSL_VERIFY_SERVER_CERT |\ CLIENT_REMEMBER_OPTIONS |\ CLIENT_PLUGIN_AUTH |\ CLIENT_SESSION_TRACKING |\ CLIENT_CONNECT_ATTRS) +#define CLIENT_ALLOWED_FLAGS (CLIENT_SUPPORTED_FLAGS |\ + CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA |\ + CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS |\ + CLIENT_ZSTD_COMPRESSION |\ + CLIENT_PS_MULTI_RESULTS |\ + CLIENT_REMEMBER_OPTIONS) #define CLIENT_CAPABILITIES (CLIENT_MYSQL | \ CLIENT_LONG_FLAG |\ CLIENT_TRANSACTIONS |\ diff -Nru mariadb-10.11.6/libmariadb/include/mysql/client_plugin.h mariadb-10.11.9/libmariadb/include/mysql/client_plugin.h --- mariadb-10.11.6/libmariadb/include/mysql/client_plugin.h 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/include/mysql/client_plugin.h 2024-08-03 07:30:01.000000000 +0000 @@ -122,7 +122,7 @@ } MARIADB_PVIO_PLUGIN; /******** authentication plugin specific declarations *********/ -#include +#include struct st_mysql_client_plugin_AUTHENTICATION { diff -Nru mariadb-10.11.6/libmariadb/include/mysql/plugin_auth_common.h mariadb-10.11.9/libmariadb/include/mysql/plugin_auth_common.h --- mariadb-10.11.6/libmariadb/include/mysql/plugin_auth_common.h 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/include/mysql/plugin_auth_common.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -/* Copyright (C) 2010 Sergei Golubchik and Monty Program Ab - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - MA 02111-1301, USA */ - - -#ifndef MYSQL_PLUGIN_AUTH_COMMON_INCLUDED -/** - @file - - This file defines constants and data structures that are the same for - both client- and server-side authentication plugins. -*/ -#define MYSQL_PLUGIN_AUTH_COMMON_INCLUDED - -/** the max allowed length for a user name */ -#define MYSQL_USERNAME_LENGTH 512 - -/** - return values of the plugin authenticate_user() method. -*/ - -/** - Authentication failed. Additionally, all other CR_xxx values - (libmariadb error code) can be used too. - - The client plugin may set the error code and the error message directly - in the MYSQL structure and return CR_ERROR. If a CR_xxx specific error - code was returned, an error message in the MYSQL structure will be - overwritten. If CR_ERROR is returned without setting the error in MYSQL, - CR_UNKNOWN_ERROR will be user. -*/ -#define CR_ERROR 0 -/** - Authentication (client part) was successful. It does not mean that the - authentication as a whole was successful, usually it only means - that the client was able to send the user name and the password to the - server. If CR_OK is returned, the libmariadb reads the next packet expecting - it to be one of OK, ERROR, or CHANGE_PLUGIN packets. -*/ -#define CR_OK -1 -/** - Authentication was successful. - It means that the client has done its part successfully and also that - a plugin has read the last packet (one of OK, ERROR, CHANGE_PLUGIN). - In this case, libmariadb will not read a packet from the server, - but it will use the data at mysql->net.read_pos. - - A plugin may return this value if the number of roundtrips in the - authentication protocol is not known in advance, and the client plugin - needs to read one packet more to determine if the authentication is finished - or not. -*/ -#define CR_OK_HANDSHAKE_COMPLETE -2 - -typedef struct st_plugin_vio_info -{ - enum { MYSQL_VIO_INVALID, MYSQL_VIO_TCP, MYSQL_VIO_SOCKET, - MYSQL_VIO_PIPE, MYSQL_VIO_MEMORY } protocol; -#ifndef _WIN32 - int socket; /**< it's set, if the protocol is SOCKET or TCP */ -#else - SOCKET socket; /**< it's set, if the protocol is SOCKET or TCP */ - HANDLE handle; /**< it's set, if the protocol is PIPE or MEMORY */ -#endif -} MYSQL_PLUGIN_VIO_INFO; - -/** - Provides plugin access to communication channel -*/ -typedef struct st_plugin_vio -{ - /** - Plugin provides a pointer reference and this function sets it to the - contents of any incoming packet. Returns the packet length, or -1 if - the plugin should terminate. - */ - int (*read_packet)(struct st_plugin_vio *vio, - unsigned char **buf); - - /** - Plugin provides a buffer with data and the length and this - function sends it as a packet. Returns 0 on success, 1 on failure. - */ - int (*write_packet)(struct st_plugin_vio *vio, - const unsigned char *packet, - int packet_len); - - /** - Fills in a st_plugin_vio_info structure, providing the information - about the connection. - */ - void (*info)(struct st_plugin_vio *vio, struct st_plugin_vio_info *info); - -} MYSQL_PLUGIN_VIO; - -#endif - diff -Nru mariadb-10.11.6/libmariadb/libmariadb/ma_default.c mariadb-10.11.9/libmariadb/libmariadb/ma_default.c --- mariadb-10.11.6/libmariadb/libmariadb/ma_default.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/libmariadb/ma_default.c 2024-08-03 07:30:01.000000000 +0000 @@ -135,6 +135,7 @@ end: return configuration_dirs; error: + release_configuration_dirs(); return NULL; } diff -Nru mariadb-10.11.6/libmariadb/libmariadb/ma_errmsg.c mariadb-10.11.9/libmariadb/libmariadb/ma_errmsg.c --- mariadb-10.11.6/libmariadb/libmariadb/ma_errmsg.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/libmariadb/ma_errmsg.c 2024-08-03 07:30:01.000000000 +0000 @@ -53,7 +53,7 @@ /* 2023 */ "", /* 2024 */ "", /* 2025 */ "", -/* 2026 */ "TLS/SSL error: %-.100s", +/* 2026 */ "TLS/SSL error: %s", /* 2027 */ "Received malformed packet", /* 2028 */ "", /* 2029 */ "", @@ -118,6 +118,7 @@ /* 5021 */ "Binary log error (File: %.*s start_pos=%ld): %s.", /* 5022 */ "File '%s' is not a binary log file", /* 5023 */ "Semi sync request error: %s", + /* 5024 */ "Invalid client flags (%lu) specified. Supported flags: %lu", "" }; diff -Nru mariadb-10.11.6/libmariadb/libmariadb/mariadb_async.c mariadb-10.11.9/libmariadb/libmariadb/mariadb_async.c --- mariadb-10.11.6/libmariadb/libmariadb/mariadb_async.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/libmariadb/mariadb_async.c 2024-08-03 07:30:01.000000000 +0000 @@ -140,7 +140,7 @@ { int ssl_err; b->events_to_wait_for= 0; - if (res >= 0) + if (res > 0) return 1; ssl_err= SSL_get_error(ssl, res); if (ssl_err == SSL_ERROR_WANT_READ) diff -Nru mariadb-10.11.6/libmariadb/libmariadb/mariadb_lib.c mariadb-10.11.9/libmariadb/libmariadb/mariadb_lib.c --- mariadb-10.11.6/libmariadb/libmariadb/mariadb_lib.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/libmariadb/mariadb_lib.c 2024-08-03 07:30:01.000000000 +0000 @@ -241,18 +241,29 @@ } goto restart; } - net->last_errno= last_errno; - if (pos[0]== '#') + if (IS_MYSQL_ERROR(last_errno) || IS_MARIADB_ERROR(last_errno)) { - ma_strmake(net->sqlstate, pos+1, SQLSTATE_LENGTH); - pos+= SQLSTATE_LENGTH + 1; + /* The server appears to have sent an error code within the + * range(s) of error codes that should only be generated + * client-side. + */ + my_set_error(mysql, CR_MALFORMED_PACKET, SQLSTATE_UNKNOWN, 0); } else { - strncpy(net->sqlstate, SQLSTATE_UNKNOWN, SQLSTATE_LENGTH); + net->last_errno= last_errno; + if (pos[0]== '#') + { + ma_strmake(net->sqlstate, pos+1, SQLSTATE_LENGTH); + pos+= SQLSTATE_LENGTH + 1; + } + else + { + strncpy(net->sqlstate, SQLSTATE_UNKNOWN, SQLSTATE_LENGTH); + } + ma_strmake(net->last_error,(char*) pos, + min(len,sizeof(net->last_error)-1)); } - ma_strmake(net->last_error,(char*) pos, - min(len,sizeof(net->last_error)-1)); } else { @@ -699,6 +710,7 @@ {{MARIADB_OPT_TLS_PASSPHRASE}, MARIADB_OPTION_STR, "tls-passphrase"}, {{MYSQL_OPT_SSL_ENFORCE}, MARIADB_OPTION_BOOL, "tls-enforce"}, {{MYSQL_OPT_SSL_VERIFY_SERVER_CERT}, MARIADB_OPTION_BOOL,"tls-verify-peer"}, + {{MARIADB_OPT_RESTRICTED_AUTH}, MARIADB_OPTION_STR, "restricted-auth"}, {{0}, 0, NULL} }; @@ -799,7 +811,10 @@ option_val= &val_sizet; break; case MARIADB_OPTION_STR: - option_val= (void*)config_value; + if (config_value && !config_value[0]) + option_val= NULL; + else + option_val= (void*)config_value; break; case MARIADB_OPTION_NONE: break; @@ -895,7 +910,7 @@ if (!key) goto error; *pos++= 0; - if (pos < end) + if (pos <= end) val= pos; continue; break; @@ -1422,6 +1437,14 @@ char *connection_handler= (mysql->options.extension) ? mysql->options.extension->connection_handler : 0; + if ((client_flag & CLIENT_ALLOWED_FLAGS) != client_flag) + { + my_set_error(mysql, CR_INVALID_CLIENT_FLAG, SQLSTATE_UNKNOWN, + ER(CR_INVALID_CLIENT_FLAG), + client_flag, CLIENT_ALLOWED_FLAGS); + return NULL; + } + if (!mysql->methods) mysql->methods= &MARIADB_DEFAULT_METHODS; @@ -1787,11 +1810,24 @@ */ if ((pkt_length=ma_net_safe_read(mysql)) == packet_error) { - if (mysql->net.last_errno == CR_SERVER_LOST) + + unsigned int code= mysql->net.last_errno; + if (code == CR_SERVER_LOST) my_set_error(mysql, CR_SERVER_LOST, SQLSTATE_UNKNOWN, ER(CR_SERVER_LOST_EXTENDED), "handshake: reading initial communication packet", errno); + else if (IS_MYSQL_ERROR(code) || IS_MARIADB_ERROR(code)) + ; /* not forged - generated on the client side */ + else if (mysql->options.use_ssl) + { + char last_error[sizeof(mysql->net.last_error)]; + strcpy(last_error, mysql->net.last_error); + my_set_error(mysql, CR_CONNECTION_ERROR, SQLSTATE_UNKNOWN, + "Received error packet before completion of TLS handshake. " + "The authenticity of the following error cannot be verified: %d - %s", + code, last_error); + } goto error; } @@ -1803,17 +1839,6 @@ mysql->protocol_version= end[0]; end++; - /* Check if server sends an error */ - if (mysql->protocol_version == 0XFF) - { - net_get_error(end, pkt_length - 1, net->last_error, sizeof(net->last_error), - &net->last_errno, net->sqlstate); - /* fix for bug #26426 */ - if (net->last_errno == 1040) - memcpy(net->sqlstate, "08004", SQLSTATE_LENGTH); - goto error; - } - if (mysql->protocol_version < PROTOCOL_VERSION) { net->last_errno= CR_VERSION_ERROR; @@ -3278,10 +3303,17 @@ int STDCALL mysql_kill(MYSQL *mysql,ulong pid) { - char buff[12]; - int4store(buff,pid); - /* if we kill our own thread, reading the response packet will fail */ - return(ma_simple_command(mysql, COM_PROCESS_KILL,buff,4,0,0)); + char buff[16]; + + /* process id can't be larger than 4-bytes */ + if (pid & (~0xFFFFFFFFUL)) + { + my_set_error(mysql, CR_CONNECTION_ERROR, SQLSTATE_UNKNOWN, 0); + return 1; + } + + snprintf(buff, sizeof buff, "KILL %lu", pid); + return mysql_real_query(mysql, (char *)buff, (ulong)strlen(buff)); } diff -Nru mariadb-10.11.6/libmariadb/libmariadb/secure/openssl.c mariadb-10.11.9/libmariadb/libmariadb/secure/openssl.c --- mariadb-10.11.6/libmariadb/libmariadb/secure/openssl.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/libmariadb/secure/openssl.c 2024-08-03 07:30:01.000000000 +0000 @@ -533,7 +533,7 @@ { int ssl_err; b->events_to_wait_for= 0; - if (res >= 0) + if (res > 0) return 1; ssl_err= SSL_get_error(ssl, res); if (ssl_err == SSL_ERROR_WANT_READ) diff -Nru mariadb-10.11.6/libmariadb/plugins/io/remote_io.c mariadb-10.11.9/libmariadb/plugins/io/remote_io.c --- mariadb-10.11.6/libmariadb/plugins/io/remote_io.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/plugins/io/remote_io.c 2024-08-03 07:30:01.000000000 +0000 @@ -279,11 +279,11 @@ MA_REMOTE_FILE *rf; (void)operation; - if (!(file = (MA_FILE *)calloc(sizeof(MA_FILE), 1))) + if (!(file = (MA_FILE *)calloc(1, sizeof(MA_FILE)))) return NULL; file->type= MA_FILE_REMOTE; - if (!(file->ptr= rf= (MA_REMOTE_FILE *)calloc(sizeof(MA_REMOTE_FILE), 1))) + if (!(file->ptr= rf= (MA_REMOTE_FILE *)calloc(1, sizeof(MA_REMOTE_FILE)))) { free(file); return NULL; diff -Nru mariadb-10.11.6/libmariadb/plugins/pvio/pvio_npipe.c mariadb-10.11.9/libmariadb/plugins/pvio/pvio_npipe.c --- mariadb-10.11.6/libmariadb/plugins/pvio/pvio_npipe.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/plugins/pvio/pvio_npipe.c 2024-08-03 07:30:01.000000000 +0000 @@ -150,19 +150,38 @@ return GetOverlappedResult(file, ov, size, FALSE); } +/* + Disable posting IO completion event to the port. + Handle can be bound to IOCP outside of the connector for other purposes + (e.g polling functionality) +*/ + +static inline void disable_iocp_notification(HANDLE *h) +{ + *h= (HANDLE) ((ULONG_PTR) *h | 1); +} + +static inline void enable_iocp_notification(HANDLE *h) +{ + *h= (HANDLE) ((ULONG_PTR) *h & ~1); +} + ssize_t pvio_npipe_read(MARIADB_PVIO *pvio, uchar *buffer, size_t length) { BOOL ret; ssize_t r= -1; struct st_pvio_npipe *cpipe= NULL; DWORD size; + HANDLE *h; if (!pvio || !pvio->data) return -1; cpipe= (struct st_pvio_npipe *)pvio->data; - + h= &cpipe->overlapped.hEvent; + disable_iocp_notification(h); ret= ReadFile(cpipe->pipe, buffer, (DWORD)length, NULL, &cpipe->overlapped); + enable_iocp_notification(h); ret= complete_io(cpipe->pipe, &cpipe->overlapped, ret, pvio->timeout[PVIO_READ_TIMEOUT], &size); r= ret? (ssize_t) size:-1; @@ -175,13 +194,15 @@ struct st_pvio_npipe *cpipe= NULL; BOOL ret; DWORD size; - + HANDLE *h; if (!pvio || !pvio->data) return -1; cpipe= (struct st_pvio_npipe *)pvio->data; - + h= &cpipe->overlapped.hEvent; + disable_iocp_notification(h); ret= WriteFile(cpipe->pipe, buffer, (DWORD)length, NULL , &cpipe->overlapped); + enable_iocp_notification(h); ret= complete_io(cpipe->pipe, &cpipe->overlapped, ret, pvio->timeout[PVIO_WRITE_TIMEOUT], &size); r= ret ? (ssize_t)size : -1; return r; diff -Nru mariadb-10.11.6/libmariadb/plugins/pvio/pvio_socket.c mariadb-10.11.9/libmariadb/plugins/pvio/pvio_socket.c --- mariadb-10.11.6/libmariadb/plugins/pvio/pvio_socket.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/plugins/pvio/pvio_socket.c 2024-08-03 07:30:01.000000000 +0000 @@ -39,7 +39,7 @@ #include #endif #ifdef HAVE_POLL -#include +#include #endif #ifdef HAVE_SYS_IOCTL_H #include diff -Nru mariadb-10.11.6/libmariadb/plugins/trace/trace_example.c mariadb-10.11.9/libmariadb/plugins/trace/trace_example.c --- mariadb-10.11.6/libmariadb/plugins/trace/trace_example.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/plugins/trace/trace_example.c 2024-08-03 07:30:01.000000000 +0000 @@ -132,7 +132,7 @@ info= (TRACE_INFO *)info->next; } - if (!(info= (TRACE_INFO *)calloc(sizeof(TRACE_INFO), 1))) + if (!(info= (TRACE_INFO *)calloc(1, sizeof(TRACE_INFO)))) return NULL; info->thread_id= thread_id; info->next= trace_info; diff -Nru mariadb-10.11.6/libmariadb/unittest/libmariadb/bulk1.c mariadb-10.11.9/libmariadb/unittest/libmariadb/bulk1.c --- mariadb-10.11.6/libmariadb/unittest/libmariadb/bulk1.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/unittest/libmariadb/bulk1.c 2024-08-03 07:30:01.000000000 +0000 @@ -74,8 +74,8 @@ /* allocate memory */ buffer= calloc(TEST_ARRAY_SIZE, sizeof(char *)); - lengths= (unsigned long *)calloc(sizeof(long), TEST_ARRAY_SIZE); - vals= (unsigned int *)calloc(sizeof(int), TEST_ARRAY_SIZE); + lengths= calloc(TEST_ARRAY_SIZE, sizeof *lengths); + vals= calloc(TEST_ARRAY_SIZE, sizeof *vals); for (i=0; i < TEST_ARRAY_SIZE; i++) { diff -Nru mariadb-10.11.6/libmariadb/unittest/libmariadb/charset.c mariadb-10.11.9/libmariadb/unittest/libmariadb/charset.c --- mariadb-10.11.6/libmariadb/unittest/libmariadb/charset.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/unittest/libmariadb/charset.c 2024-08-03 07:30:01.000000000 +0000 @@ -47,6 +47,9 @@ MYSQL_RES *res; MYSQL_ROW row; + /* MXS-4898: MaxScale sends utf8mb4 in handshake OK packet */ + SKIP_MAXSCALE; + len= mysql_real_escape_string(mysql, out, TEST_BUG8378_IN, 4); FAIL_IF(memcmp(out, TEST_BUG8378_OUT, len), "wrong result"); @@ -791,6 +794,10 @@ MYSQL_ROW row; int found= 0; int mdev27266= 0; + int unsupported[]= { + 579, /* utf8mb3_general1400_as_ci added in 11.5 */ + 611, /* utf8mb4_general1400_as_ci added in 11.5 */ + 0}; SKIP_MYSQL(mysql); @@ -836,8 +843,11 @@ id= atoi(row[0]); if (!mariadb_get_charset_by_nr(id)) { - diag("%04d %s %s", id, row[1], row[2]); + int j=0; found++; + for (j=0; unsupported[j]; j++) + if (unsupported[j] == id) + found--; } } } diff -Nru mariadb-10.11.6/libmariadb/unittest/libmariadb/connection.c mariadb-10.11.9/libmariadb/unittest/libmariadb/connection.c --- mariadb-10.11.6/libmariadb/unittest/libmariadb/connection.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/unittest/libmariadb/connection.c 2024-08-03 07:30:01.000000000 +0000 @@ -1222,6 +1222,9 @@ int rc; FILE *fp; + /* MXS-4898: MaxScale sends utf8mb4 in handshake OK packet */ + SKIP_MAXSCALE; + if (!(fp= fopen("./mdev13100.cnf", "w"))) return FAIL; @@ -1240,6 +1243,7 @@ diag("Error: %s", mysql_error(mysql)); return FAIL; } + diag("Default charset: %s", mysql_character_set_name(mysql)); FAIL_IF(strcmp("latin2", mysql_character_set_name(mysql)), "Expected charset latin2"); mysql_close(mysql); @@ -2190,6 +2194,7 @@ { MARIADB_CONST_STRING *str= va_arg(ap, MARIADB_CONST_STRING *); strncpy(data->database, str->str, str->length); + data->database[str->length]= 0; } break; case SESSION_TRACK_SYSTEM_VARIABLES: @@ -2200,6 +2205,7 @@ if (!strncmp(key->str, "character_set_client", key->length)) { strncpy(data->charset, val->str, val->length); + data->charset[val->length]= 0; } } break; @@ -2301,7 +2307,33 @@ return OK; } +static int test_conc505(MYSQL *my __attribute__((unused))) +{ + MYSQL *mysql= mysql_init(NULL); + +#define CLIENT_DEPRECATE_EOF (1ULL << 24) + + if (my_test_connect(mysql, hostname, username, password, schema, port, socketname, CLIENT_DEPRECATE_EOF)) + { + diag("Error expected: Invalid client flag"); + mysql_close(mysql); + return FAIL; + } + diag("Error (expected): %s", mysql_error(mysql)); + FAIL_IF(mysql_errno(mysql) != CR_INVALID_CLIENT_FLAG, "Wrong error number"); + if (!my_test_connect(mysql, hostname, username, password, schema, port, socketname, CLIENT_MULTI_STATEMENTS | CLIENT_MULTI_RESULTS)) + { + diag("Error: %s", mysql_error(mysql)); + mysql_close(mysql); + return FAIL; + } + + mysql_close(mysql); + return OK; +} + struct my_tests_st my_tests[] = { + {"test_conc505", test_conc505, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_conc632", test_conc632, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_status_callback", test_status_callback, TEST_CONNECTION_NONE, 0, NULL, NULL}, {"test_conc365", test_conc365, TEST_CONNECTION_NONE, 0, NULL, NULL}, diff -Nru mariadb-10.11.6/libmariadb/unittest/libmariadb/ps_bugs.c mariadb-10.11.9/libmariadb/unittest/libmariadb/ps_bugs.c --- mariadb-10.11.6/libmariadb/unittest/libmariadb/ps_bugs.c 2023-11-01 10:28:04.000000000 +0000 +++ mariadb-10.11.9/libmariadb/unittest/libmariadb/ps_bugs.c 2024-08-03 07:30:01.000000000 +0000 @@ -3257,7 +3257,7 @@ static int test_mem_overun(MYSQL *mysql) { - char buffer[10000], field[12]; + char buffer[10000], field[20]; MYSQL_STMT *stmt; MYSQL_RES *field_res, *res; int rc, i, length; @@ -5159,7 +5159,7 @@ MYSQL_STMT *stmt= mysql_stmt_init(mysql); MYSQL_BIND* bind; - bind = calloc(sizeof(MYSQL_BIND), 65535); + bind = calloc(65535, sizeof *bind); rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); check_mysql_rc(rc, mysql); diff -Nru mariadb-10.11.6/libmysqld/CMakeLists.txt mariadb-10.11.9/libmysqld/CMakeLists.txt --- mariadb-10.11.6/libmysqld/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/libmysqld/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -23,9 +23,9 @@ ${CMAKE_SOURCE_DIR}/sql ${CMAKE_SOURCE_DIR}/tpool ${CMAKE_BINARY_DIR}/sql -${PCRE_INCLUDES} +${PCRE_INCLUDE_DIRS} ${LIBFMT_INCLUDE_DIR} -${ZLIB_INCLUDE_DIR} +${ZLIB_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS} ${SSL_INTERNAL_INCLUDE_DIRS} ) @@ -180,7 +180,7 @@ SET(LIBS dbug strings mysys mysys_ssl pcre2-8 vio - ${ZLIB_LIBRARY} ${SSL_LIBRARIES} + ${ZLIB_LIBRARIES} ${SSL_LIBRARIES} ${LIBWRAP} ${LIBCRYPT} ${CMAKE_DL_LIBS} ${EMBEDDED_PLUGIN_LIBS} sql_embedded diff -Nru mariadb-10.11.6/libmysqld/embedded_priv.h mariadb-10.11.9/libmysqld/embedded_priv.h --- mariadb-10.11.6/libmysqld/embedded_priv.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/libmysqld/embedded_priv.h 2024-08-03 07:29:56.000000000 +0000 @@ -23,6 +23,8 @@ void *create_embedded_thd(ulong client_flag); int check_embedded_connection(MYSQL *mysql, const char *db); void free_old_query(MYSQL *mysql); +THD *embedded_get_current_thd(); +void embedded_set_current_thd(THD *thd); extern MYSQL_METHODS embedded_methods; /* This one is used by embedded library to gather returning data */ diff -Nru mariadb-10.11.6/libmysqld/examples/CMakeLists.txt mariadb-10.11.9/libmysqld/examples/CMakeLists.txt --- mariadb-10.11.6/libmysqld/examples/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/libmysqld/examples/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -15,7 +15,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/libmysqld/include - ${PCRE_INCLUDES} + ${PCRE_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/sql ${MY_READLINE_INCLUDE_DIR} ) diff -Nru mariadb-10.11.6/libmysqld/lib_sql.cc mariadb-10.11.9/libmysqld/lib_sql.cc --- mariadb-10.11.6/libmysqld/lib_sql.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/libmysqld/lib_sql.cc 2024-08-03 07:29:56.000000000 +0000 @@ -111,7 +111,7 @@ MYSQL_STMT *stmt) { my_bool result= 1; - THD *thd=(THD *) mysql->thd; + THD *thd=(THD *) mysql->thd, *old_current_thd= current_thd; NET *net= &mysql->net; my_bool stmt_skip= stmt ? stmt->state != MYSQL_STMT_INIT_DONE : FALSE; @@ -122,6 +122,8 @@ else { free_embedded_thd(mysql); + if (old_current_thd == thd) + old_current_thd= 0; thd= 0; } } @@ -179,6 +181,8 @@ end: thd->reset_globals(); + if (old_current_thd) + old_current_thd->store_globals(); return result; } @@ -265,6 +269,7 @@ mysql->server_status|= SERVER_STATUS_IN_TRANS; stmt->fields= mysql->fields; + free_root(&stmt->mem_root, MYF(0)); stmt->mem_root= res->alloc; mysql->fields= NULL; my_free(res); @@ -374,6 +379,7 @@ set_stmt_errmsg(stmt, &stmt->mysql->net); return 1; } + free_root(&stmt->result.alloc, MYF(0)); stmt->result= *data; my_free(data); set_stmt_errmsg(stmt, &stmt->mysql->net); @@ -432,12 +438,15 @@ static void free_embedded_thd(MYSQL *mysql) { - THD *thd= (THD*)mysql->thd; + THD *thd= (THD*)mysql->thd, *org_current_thd= current_thd; server_threads.erase(thd); thd->clear_data_list(); thd->store_globals(); delete thd; - set_current_thd(nullptr); + if (thd == org_current_thd) + set_current_thd(nullptr); + else + set_current_thd(org_current_thd); mysql->thd=0; } @@ -459,6 +468,7 @@ return mysql_errno(mysql) ? (int)packet_error : 1 /* length of the OK packet */; } + static void emb_on_close_free(MYSQL *mysql) { my_free(mysql->info_buffer); @@ -470,6 +480,7 @@ } } + MYSQL_METHODS embedded_methods= { emb_read_query_result, @@ -632,8 +643,6 @@ udf_init(); #endif - (void) thr_setconcurrency(concurrency); // 10 by default - if (flush_time && flush_time != ~(ulong) 0L) start_handle_manager(); @@ -705,8 +714,7 @@ if (thd->variables.max_join_size == HA_POS_ERROR) thd->variables.option_bits |= OPTION_BIG_SELECTS; - thd->proc_info=0; // Remove 'login' - thd->set_command(COM_SLEEP); + thd->mark_connection_idle(); thd->set_time(); thd->init_for_queries(); thd->client_capabilities= client_flag | MARIADB_CLIENT_EXTENDED_METADATA; @@ -728,6 +736,17 @@ } +THD *embedded_get_current_thd() +{ + return current_thd; +} + +void embedded_set_current_thd(THD *thd) +{ + set_current_thd(thd); +} + + #ifdef NO_EMBEDDED_ACCESS_CHECKS static void emb_transfer_connect_attrs(MYSQL *mysql) @@ -1446,4 +1465,3 @@ } return 0; } - diff -Nru mariadb-10.11.6/libmysqld/libmysql.c mariadb-10.11.9/libmysqld/libmysql.c --- mariadb-10.11.6/libmysqld/libmysql.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/libmysqld/libmysql.c 2024-08-03 07:29:56.000000000 +0000 @@ -3229,7 +3229,8 @@ { longlong data= my_strtoll10(value, &endptr, &err); *param->error= (IS_TRUNCATED(data, param->is_unsigned, - INT_MIN32, INT_MAX32, UINT_MAX32) || err > 0); + (longlong) INT_MIN32, (longlong) INT_MAX32, + (longlong) UINT_MAX32) || err > 0); longstore(buffer, (int32) data); break; } @@ -3346,7 +3347,8 @@ break; case MYSQL_TYPE_LONG: *param->error= IS_TRUNCATED(value, param->is_unsigned, - INT_MIN32, INT_MAX32, UINT_MAX32); + (longlong) INT_MIN32, (longlong) INT_MAX32, + (longlong) UINT_MAX32); longstore(buffer, (int32) value); break; case MYSQL_TYPE_LONGLONG: diff -Nru mariadb-10.11.6/libmysqld/libmysqld.c mariadb-10.11.9/libmysqld/libmysqld.c --- mariadb-10.11.6/libmysqld/libmysqld.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/libmysqld/libmysqld.c 2024-08-03 07:29:56.000000000 +0000 @@ -78,7 +78,7 @@ uint port, const char *unix_socket,ulong client_flag) { char name_buff[USERNAME_LENGTH]; - + THD *org_current_thd= embedded_get_current_thd(); DBUG_ENTER("mysql_real_connect"); DBUG_PRINT("enter",("host: %s db: %s user: %s (libmysqld)", host ? host : "(Null)", @@ -200,6 +200,7 @@ } } } + embedded_set_current_thd(org_current_thd); DBUG_PRINT("exit",("Mysql handler: %p", mysql)); DBUG_RETURN(mysql); @@ -216,6 +217,7 @@ mysql_close(mysql); mysql->free_me=free_me; } + embedded_set_current_thd(org_current_thd); DBUG_RETURN(0); } diff -Nru mariadb-10.11.6/libservices/CMakeLists.txt mariadb-10.11.9/libservices/CMakeLists.txt --- mariadb-10.11.6/libservices/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/libservices/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -25,6 +25,7 @@ my_crypt_service.c my_md5_service.c my_print_error_service.c + print_check_msg_service.c my_sha1_service.c my_sha2_service.c my_snprintf_service.c diff -Nru mariadb-10.11.6/libservices/print_check_msg_service.c mariadb-10.11.9/libservices/print_check_msg_service.c --- mariadb-10.11.6/libservices/print_check_msg_service.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/libservices/print_check_msg_service.c 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,18 @@ +/* Copyright (c) 2024, MariaDB Plc + + 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; version 2 of the License. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +SERVICE_VERSION print_check_msg_context= (void*) VERSION_print_check_msg; diff -Nru mariadb-10.11.6/man/CMakeLists.txt mariadb-10.11.9/man/CMakeLists.txt --- mariadb-10.11.6/man/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/CMakeLists.txt 2024-08-03 07:29:56.000000000 +0000 @@ -14,7 +14,8 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA SET(MAN1_WSREP wsrep_sst_rsync.1 wsrep_sst_common.1 wsrep_sst_mariabackup.1 - wsrep_sst_mysqldump.1 wsrep_sst_rsync_wan.1 galera_recovery.1 galera_new_cluster.1) + wsrep_sst_mysqldump.1 wsrep_sst_rsync_wan.1 galera_recovery.1 galera_new_cluster.1 + wsrep_sst_backup.1) SET(MAN1_SERVER innochecksum.1 myisam_ftdump.1 myisamchk.1 aria_chk.1 aria_dump_log.1 aria_ftdump.1 aria_pack.1 aria_read_log.1 aria_s3_copy.1 diff -Nru mariadb-10.11.6/man/my_print_defaults.1 mariadb-10.11.9/man/my_print_defaults.1 --- mariadb-10.11.6/man/my_print_defaults.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/my_print_defaults.1 2024-08-03 07:29:56.000000000 +0000 @@ -1,6 +1,6 @@ '\" t .\" -.TH "\fBMY_PRINT_DEFAULTS\fR" "1" "15 May 2020" "MariaDB 10.11" "MariaDB Database System" +.TH "\fBMY_PRINT_DEFAULTS\fR" "1" "18 December 2023" "MariaDB 10.11" "MariaDB Database System" .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- @@ -146,6 +146,22 @@ .sp -1 .IP \(bu 2.3 .\} +.\" my_print_defaults: --mariadbd option +.\" mariadbd option: my_print_defaults +\fB\-\-mariadbd\fR +.sp +Read the same set of groups that the mariadbd binary does. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} + .\" my_print_defaults: --mysqld option .\" mysqld option: my_print_defaults \fB\-\-mysqld\fR diff -Nru mariadb-10.11.6/man/myisamchk.1 mariadb-10.11.9/man/myisamchk.1 --- mariadb-10.11.6/man/myisamchk.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/myisamchk.1 2024-08-03 07:29:56.000000000 +0000 @@ -38,7 +38,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br @@ -168,7 +168,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br diff -Nru mariadb-10.11.6/man/mysql_upgrade.1 mariadb-10.11.9/man/mysql_upgrade.1 --- mariadb-10.11.6/man/mysql_upgrade.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/mysql_upgrade.1 2024-08-03 07:29:56.000000000 +0000 @@ -36,7 +36,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br @@ -54,7 +54,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br diff -Nru mariadb-10.11.6/man/mysqladmin.1 mariadb-10.11.9/man/mysqladmin.1 --- mariadb-10.11.6/man/mysqladmin.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/mysqladmin.1 2024-08-03 07:29:56.000000000 +0000 @@ -409,7 +409,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br diff -Nru mariadb-10.11.6/man/mysqlbinlog.1 mariadb-10.11.9/man/mysqlbinlog.1 --- mariadb-10.11.6/man/mysqlbinlog.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/mysqlbinlog.1 2024-08-03 07:29:56.000000000 +0000 @@ -167,7 +167,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br @@ -424,7 +424,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br @@ -571,6 +571,22 @@ .sp -1 .IP \(bu 2.3 .\} +.\" mysqlbinlog: flashback option +.\" flashback option: mysqlbinlog +\fB\-\-flashback\fR, +\fB\-B\fR +.sp +Support flashback mode\&. +.RE +.sp +.RS 4 +.ie n \{\ +\h'-04'\(bu\h'+03'\c +.\} +.el \{\ +.sp -1 +.IP \(bu 2.3 +.\} .\" mysqlbinlog: force-if-open option .\" force-if-open option: mysqlbinlog \fB\-\-force\-if\-open\fR @@ -1337,7 +1353,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br @@ -1985,7 +2001,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br diff -Nru mariadb-10.11.6/man/mysqlcheck.1 mariadb-10.11.9/man/mysqlcheck.1 --- mariadb-10.11.6/man/mysqlcheck.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/mysqlcheck.1 2024-08-03 07:29:56.000000000 +0000 @@ -101,7 +101,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br diff -Nru mariadb-10.11.6/man/mysqld_safe.1 mariadb-10.11.9/man/mysqld_safe.1 --- mariadb-10.11.6/man/mysqld_safe.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/mysqld_safe.1 2024-08-03 07:29:56.000000000 +0000 @@ -733,7 +733,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br diff -Nru mariadb-10.11.6/man/mysqldump.1 mariadb-10.11.9/man/mysqldump.1 --- mariadb-10.11.6/man/mysqldump.1 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/man/mysqldump.1 2024-08-03 07:29:56.000000000 +0000 @@ -892,22 +892,6 @@ .sp -1 .IP \(bu 2.3 .\} -.\" mysqldump: flashback option -.\" flashback option: mysqldump -\fB\-\-flashback\fR, -\fB\-B\fR -.sp -Support flashback mode\&. -.RE -.sp -.RS 4 -.ie n \{\ -\h'-04'\(bu\h'+03'\c -.\} -.el \{\ -.sp -1 -.IP \(bu 2.3 -.\} .\" mysqldump: flush-logs option .\" flush-logs option: mysqldump \fB\-\-flush\-logs\fR, @@ -2358,7 +2342,7 @@ .sp .\} .RS 4 -.it 1 an-trap +.it 1 .nr an-no-space-flag 1 .nr an-break-flag 1 .br diff -Nru mariadb-10.11.6/man/wsrep_sst_backup.1 mariadb-10.11.9/man/wsrep_sst_backup.1 --- mariadb-10.11.6/man/wsrep_sst_backup.1 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/man/wsrep_sst_backup.1 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,16 @@ +'\" t +.\" +.TH "\FBWSREP_SST_BACKUP\FR" "1" "22 May 2022" "MariaDB 10\&.3" "MariaDB Database System" +.\" ----------------------------------------------------------------- +.\" * set default formatting +.\" ----------------------------------------------------------------- +.\" disable hyphenation +.nh +.\" disable justification (adjust text to left margin only) +.ad l +.SH NAME +wsrep_sst_backup \- backup helper script for the MariaDB Galera Cluster +.SH DESCRIPTION +Use: See source code of script\. +.PP +For more information, please refer to the MariaDB Knowledge Base, available online at https://mariadb.com/kb/ diff -Nru mariadb-10.11.6/mysql-test/README mariadb-10.11.9/mysql-test/README --- mariadb-10.11.6/mysql-test/README 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/README 2024-08-03 07:29:56.000000000 +0000 @@ -84,8 +84,8 @@ the bug is corrected in future releases. If you want to submit your test case you can send it -to maria-developers@lists.launchpad.net or attach it to a bug report on -https://mariadb.org/jira/. +to developers@lists.mariadb.org or attach it to a bug report on +http://mariadb.org/jira/. If the test case is really big or if it contains 'not public' data, then put your .test file and .result file(s) into a tar.gz archive, diff -Nru mariadb-10.11.6/mysql-test/collections/buildbot_suites.bat mariadb-10.11.9/mysql-test/collections/buildbot_suites.bat --- mariadb-10.11.6/mysql-test/collections/buildbot_suites.bat 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/collections/buildbot_suites.bat 2024-08-03 07:29:56.000000000 +0000 @@ -1,5 +1,5 @@ if "%MTR_PARALLEL%"=="" set MTR_PARALLEL=%NUMBER_OF_PROCESSORS% -perl mysql-test-run.pl --verbose-restart --force --suite-timeout=120 --max-test-fail=10 --retry=3 --suite=^ +perl mysql-test-run.pl --force --suite-timeout=120 --max-test-fail=10 --retry=3 --suite=^ vcol,gcol,perfschema,^ main,^ innodb,^ diff -Nru mariadb-10.11.6/mysql-test/dgcov.pl mariadb-10.11.9/mysql-test/dgcov.pl --- mariadb-10.11.6/mysql-test/dgcov.pl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/dgcov.pl 2024-08-03 07:29:56.000000000 +0000 @@ -112,8 +112,7 @@ $acc.=sprintf '%9s:%5s:%s', '', $lnum, $' if /^ /; ++$printme, $acc.=sprintf '%9s:%5s:%s', gcov_prefix($fcov->{$lnum}), $lnum, $' if /^\+/; die "$_^^^ dying", unless /^[- +]/; - ++$lnum; - --$cnt; + ++$lnum, --$cnt unless /^-/; } print $acc if $printme; close PIPE or die "command '$cmd' failed: $!: $?"; diff -Nru mariadb-10.11.6/mysql-test/include/analyze-format.inc mariadb-10.11.9/mysql-test/include/analyze-format.inc --- mariadb-10.11.6/mysql-test/include/analyze-format.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/analyze-format.inc 2024-08-03 07:29:56.000000000 +0000 @@ -4,4 +4,4 @@ # - r_engine_stats depends on buffer pool state and whether old record versions # were purged. ---replace_regex /("(r_[a-z_]*_time(_in_progress)?_ms|r_buffer_size)": )[^, \n]*/\1"REPLACED"/ /("r_engine_stats":) {[^}]*}/\1 REPLACED/ +--replace_regex /("(r_[a-z_]*_time(_in_progress)?_ms|r_buffer_size|r_partial_match_buffer_size)": )[^, \n]*/\1"REPLACED"/ /("r_engine_stats":) {[^}]*}/\1 REPLACED/ diff -Nru mariadb-10.11.6/mysql-test/include/aria_log_control_load.inc mariadb-10.11.9/mysql-test/include/aria_log_control_load.inc --- mariadb-10.11.6/mysql-test/include/aria_log_control_load.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/aria_log_control_load.inc 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,11 @@ +# +# This file loads aria_log_control file into a user variable @aria_log_control. +# Set $ARIA_DATADIR before including this file +# + +--disable_query_log +--copy_file $ARIA_DATADIR/aria_log_control $MYSQLTEST_VARDIR/aria_log_control_tmp +--chmod 0777 $MYSQLTEST_VARDIR/aria_log_control_tmp +--eval SET @aria_log_control=(SELECT LOAD_FILE('$MYSQLTEST_VARDIR/aria_log_control_tmp')) +--remove_file $MYSQLTEST_VARDIR/aria_log_control_tmp +--enable_query_log diff -Nru mariadb-10.11.6/mysql-test/include/check-testcase.test mariadb-10.11.9/mysql-test/include/check-testcase.test --- mariadb-10.11.6/mysql-test/include/check-testcase.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/check-testcase.test 2024-08-03 07:29:56.000000000 +0000 @@ -32,7 +32,6 @@ --echo Relay_Master_Log_File # --echo Slave_IO_Running No --echo Slave_SQL_Running No - --echo Replicate_Rewrite_DB # --echo Replicate_Do_DB # --echo Replicate_Ignore_DB # --echo Replicate_Do_Table # @@ -74,13 +73,22 @@ --echo Slave_DDL_Groups # --echo Slave_Non_Transactional_Groups # --echo Slave_Transactional_Groups # + --echo Replicate_Rewrite_DB # } if (!$tmp) { # Note: after WL#5177, fields 13-18 shall not be filtered-out. - --replace_column 4 # 5 # 6 # 7 # 8 # 9 # 10 # 13 # 14 # 15 # 16 # 17 # 18 # 19 # 23 # 24 # 25 # 26 # 27 # 41 # 42 # 43 # 45 # 52 # 53 # 54 # + --replace_column 4 # 5 # 6 # 7 # 8 # 9 # 10 # 13 # 14 # 15 # 16 # 17 # 18 # 22 # 23 # 24 # 25 # 26 # 40 # 41 # 42 # 44 # 51 # 52 # 53 # 54 # query_vertical SHOW SLAVE STATUS; } +# +# Note, we must never, _ever_, add extra rows to this output of SHOW SLAVE +# STATUS, except at the very end, as this breaks backwards compatibility +# with applications or scripts that parse the output. This also means that +# we cannot add _any_ new rows in a GA version if a different row was +# already added in a later MariaDB version, as this would make it impossible +# to merge the change up while preserving the order of rows. +# # # Ensure that we don't get warnings from mysql.proc (used by check_mysqld) diff -Nru mariadb-10.11.6/mysql-test/include/commit.inc mariadb-10.11.9/mysql-test/include/commit.inc --- mariadb-10.11.6/mysql-test/include/commit.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/commit.inc 2024-08-03 07:29:56.000000000 +0000 @@ -613,13 +613,17 @@ drop table t2; set sql_mode=no_engine_substitution; create temporary table t2 (a int); -call p_verify_status_increment(1, 0, 0, 0); +# One commit for the create temporary table, and two for committing the +# read of the stored procedure from Aria table (creating temporary table +# clears the sp cache). +call p_verify_status_increment(3, 0, 2, 0); set sql_mode=default; --echo # 19. A function changes temp-trans-table. --echo # select f1(); ---echo # Two commits because a binary log record is written -call p_verify_status_increment(2, 0, 1, 0); +--echo # Two commits because a binary log record is written, and another two +--echo # as the function f1() is reloaded after creating temporary table. +call p_verify_status_increment(4, 0, 3, 0); commit; call p_verify_status_increment(2, 0, 1, 0); @@ -672,9 +676,11 @@ --echo # 25. DDL: DROP TEMPORARY TABLE, does not start a transaction --echo # drop temporary table t2; -call p_verify_status_increment(1, 0, 1, 0); +# Dropping temporary table clears SP caches, so get another two commit +# increments from loading the p_verify_status_increment procedure. +call p_verify_status_increment(3, 0, 2, 0); commit; -call p_verify_status_increment(1, 0, 1, 0); +call p_verify_status_increment(1, 0, 0, 0); --echo # 26. Verify that SET AUTOCOMMIT issues an implicit commit --echo # @@ -721,7 +727,9 @@ create table t2 (a int); call p_verify_status_increment(0, 0, 0, 0); do (select f1() from t1 where a=2); -call p_verify_status_increment(2, 2, 2, 2); +# Again extra 2 commit increments from re-loading function f1 after +# dropping temporary table. +call p_verify_status_increment(4, 2, 4, 2); commit; call p_verify_status_increment(2, 2, 2, 2); diff -Nru mariadb-10.11.6/mysql-test/include/crash_mysqld.inc mariadb-10.11.9/mysql-test/include/crash_mysqld.inc --- mariadb-10.11.6/mysql-test/include/crash_mysqld.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/crash_mysqld.inc 2024-08-03 07:29:56.000000000 +0000 @@ -4,7 +4,7 @@ --source include/not_embedded.inc # Write file to make mysql-test-run.pl expect crash and restart ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Setup the mysqld to crash at shutdown SET debug_dbug="d,crash_shutdown"; diff -Nru mariadb-10.11.6/mysql-test/include/ctype_myanmar.inc mariadb-10.11.9/mysql-test/include/ctype_myanmar.inc --- mariadb-10.11.6/mysql-test/include/ctype_myanmar.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/ctype_myanmar.inc 2024-08-03 07:29:56.000000000 +0000 @@ -1293,11 +1293,9 @@ (_ucs2 0x101C1000103A10181000103A), (_ucs2 0x101C103910181000103A /* tea */); -# enable view-protocol after fix MDEV-27871 ---disable_view_protocol - -SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) FROM t1 ORDER BY id; ---enable_view_protocol +--disable_service_connection +SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) as exp FROM t1 ORDER BY id; +--enable_service_connection DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/include/ctype_numconv.inc mariadb-10.11.9/mysql-test/include/ctype_numconv.inc --- mariadb-10.11.6/mysql-test/include/ctype_numconv.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/ctype_numconv.inc 2024-08-03 07:29:56.000000000 +0000 @@ -1,7 +1,3 @@ -#remove this include after fix MDEV-27871 -# maybe some tests need to be excluded separately after fix ---source include/no_view_protocol.inc - SET TIME_ZONE = _latin1 '+03:00'; --echo # @@ -464,6 +460,7 @@ drop table t1; --disable_ps2_protocol +--disable_view_protocol # Ensure that row_count() value is reset after drop table. select 1; select hex(concat(row_count())); @@ -475,6 +472,7 @@ create table t1 as select concat(found_rows()) as c1; show create table t1; drop table t1; +--enable_view_protocol --enable_ps2_protocol create table t1 as select concat(uuid_short()) as c1; @@ -664,71 +662,71 @@ show create table t1; drop table t1; -select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); +select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; create table t1 as select concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; drop table t1; -select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))); +select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) as exp; create table t1 as select concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)'))) as c1; show create table t1; drop table t1; -select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); +select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; create table t1 as select concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; drop table t1; -select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))); +select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) as exp; create table t1 as select concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))'))) as c1; show create table t1; drop table t1; -select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))); +select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) as exp; create table t1 as select concat(IsEmpty(GeomFromText('Point(1 1)'))) as c1; show create table t1; drop table t1; -select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))); +select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) as exp; create table t1 as select concat(IsSimple(GeomFromText('Point(1 1)'))) as c1; show create table t1; drop table t1; -select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))); +select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) as exp; create table t1 as select concat(IsClosed(GeomFromText('LineString(1 1,2 2)'))) as c1; show create table t1; drop table t1; -select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))); +select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) as exp; create table t1 as select concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)'))) as c1; drop table t1; -select hex(concat(x(GeomFromText('Point(1 2)')))); +select hex(concat(x(GeomFromText('Point(1 2)')))) as exp; create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; drop table t1; -select hex(concat(y(GeomFromText('Point(1 2)')))); +select hex(concat(y(GeomFromText('Point(1 2)')))) as exp; create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; drop table t1; -select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))); +select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) as exp; create table t1 as select concat(GLength(GeomFromText('LineString(1 2, 2 2)'))) as c1; show create table t1; drop table t1; -select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))); +select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) as exp; create table t1 as select concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))'))) as c1; show create table t1; drop table t1; -select hex(concat(GeometryType(GeomFromText('Point(1 2)')))); +select hex(concat(GeometryType(GeomFromText('Point(1 2)')))) as exp; create table t1 as select concat(GeometryType(GeomFromText('Point(1 2)'))) as c1; show create table t1; drop table t1; -select hex(concat(AsText(GeomFromText('Point(1 2)')))); +select hex(concat(AsText(GeomFromText('Point(1 2)')))) as exp; create table t1 as select concat(AsText(GeomFromText('Point(1 2)'))) as c1; show create table t1; drop table t1; @@ -874,7 +872,7 @@ show create table t1; drop table t1; -select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))); +select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) as exp; create table t1 as select concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00')) as c1; show create table t1; drop table t1; @@ -894,12 +892,12 @@ show create table t1; drop table t1; -select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))); +select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) as exp; create table t1 as select concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00')) as c1; show create table t1; drop table t1; -select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))); +select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) as exp; create table t1 as select concat(date_add('2004-01-01 12:00:00', interval 1 day)) as c1; show create table t1; select * from t1; @@ -1646,9 +1644,11 @@ SELECT GROUP_CONCAT(IFNULL(a,'')) FROM t1; SELECT GROUP_CONCAT(IF(a,a,'')) FROM t1; SELECT GROUP_CONCAT(CASE WHEN a THEN a ELSE '' END) FROM t1; +--disable_view_protocol --enable_metadata SELECT COALESCE(a,'') FROM t1 GROUP BY 1; --disable_metadata +--enable_view_protocol --echo # All columns must be VARCHAR(9) with the same length: --disable_warnings CREATE TABLE t2 AS @@ -1764,15 +1764,17 @@ DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime; SHOW CREATE TABLE t1; DROP TABLE t1; ---enable_metadata # PS protocol gives different "Max length" value for DATETIME. --disable_ps_protocol +--disable_view_protocol +--enable_metadata SELECT DATE_SUB('2007-08-03', INTERVAL 1 DAY) AS field_str1, DATE_SUB('2007-08-03 17:33:00', INTERVAL 1 MINUTE) AS field1_str2, DATE_SUB(DATE('2007-08-03'), INTERVAL 1 DAY) AS field_date, DATE_SUB(CAST('2007-08-03 17:33:00' AS DATETIME), INTERVAL 1 MINUTE) AS field_datetime; --disable_metadata +--enable_view_protocol --enable_ps_protocol SELECT HEX(DATE_SUB('2007-08-03', INTERVAL 1 MINUTE)) AS field_str1, diff -Nru mariadb-10.11.6/mysql-test/include/ctype_pad.inc mariadb-10.11.9/mysql-test/include/ctype_pad.inc --- mariadb-10.11.6/mysql-test/include/ctype_pad.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/ctype_pad.inc 2024-08-03 07:29:56.000000000 +0000 @@ -52,14 +52,13 @@ --echo # --echo # IF, CASE, LEAST --echo # -#enable after fix MDEV-27871 ---disable_view_protocol -eval SELECT IF('abc' COLLATE $coll = 'abc ', 'pad', 'nopad'); -eval SELECT CASE 'abc' COLLATE $coll WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -eval SELECT CASE WHEN 'abc' COLLATE $coll = 'abc ' THEN 'pad' ELSE 'nopad' END; -eval SELECT HEX(LEAST('abc ' COLLATE $coll, 'abc ')); -eval SELECT HEX(GREATEST('abc ' COLLATE $coll, 'abc ')); ---enable_view_protocol + +eval SELECT IF('abc' COLLATE $coll = 'abc ', 'pad', 'nopad') as exp; +eval SELECT CASE 'abc' COLLATE $coll WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +eval SELECT CASE WHEN 'abc' COLLATE $coll = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +eval SELECT HEX(LEAST('abc ' COLLATE $coll, 'abc ')) as exp; +eval SELECT HEX(GREATEST('abc ' COLLATE $coll, 'abc ')) as exp; + --echo # --echo # Collation mix --echo # diff -Nru mariadb-10.11.6/mysql-test/include/ctype_str_to_date.inc mariadb-10.11.9/mysql-test/include/ctype_str_to_date.inc --- mariadb-10.11.6/mysql-test/include/ctype_str_to_date.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/ctype_str_to_date.inc 2024-08-03 07:29:56.000000000 +0000 @@ -3,10 +3,7 @@ --echo # SELECT @@character_set_connection, HEX(CAST(_utf8'÷' AS CHAR)); -# enable view-protocol after fix MDEV-27871 ---disable_view_protocol -SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)); ---enable_view_protocol +SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) as exp; CREATE TABLE t1 AS SELECT REPEAT(' ', 64) AS subject, REPEAT(' ',64) AS pattern LIMIT 0; SHOW COLUMNS FROM t1; INSERT INTO t1 VALUES (_utf8'2001÷01÷01',_utf8'%Y÷%m÷%d'); diff -Nru mariadb-10.11.6/mysql-test/include/ctype_utf8mb4.inc mariadb-10.11.9/mysql-test/include/ctype_utf8mb4.inc --- mariadb-10.11.6/mysql-test/include/ctype_utf8mb4.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/ctype_utf8mb4.inc 2024-08-03 07:29:56.000000000 +0000 @@ -2,11 +2,6 @@ # Tests with the utf8mb4 character set # -# Tests will be skipped for the view protocol because the view protocol uses -# an additional util connection and don't use for this nessesary configurations -# Also need to resolve MDEV-27871 --- source include/no_view_protocol.inc - --source include/default_optimizer_switch.inc --disable_warnings drop table if exists t1,t2; @@ -31,26 +26,26 @@ select locate('HE','hello' collate utf8mb4_bin,2); select locate('LO','hello' collate utf8mb4_bin,2); -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2); -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2); -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2); -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin); -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin); +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2) as exp; +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2) as exp; +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2) as exp; +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin) as exp; +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin) as exp; -select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1); +select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1) as exp; select 'a' like 'a'; select 'A' like 'a'; select 'A' like 'a' collate utf8mb4_bin; -select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%'); +select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%') as exp; # Bug #6040: can't retrieve records with umlaut # characters in case insensitive manner. # Case insensitive search LIKE comparison # was broken for multibyte characters: -select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4); -select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4); -select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4); +select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4) as exp; +select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4) as exp; +select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) as exp; # # Check the following: @@ -666,6 +661,7 @@ # # Bug #6043 erratic searching for diacriticals in indexed MyISAM UTF-8 table # +--disable_service_connection SET NAMES latin1; eval CREATE TABLE t1 ( id int unsigned NOT NULL auto_increment, @@ -682,6 +678,7 @@ SELECT id, term FROM t1 where (list_id = 1) AND (term = "testètest"); DROP TABLE t1; } +--enable_service_connection # # Bug #6019 SELECT tries to use too short prefix index on utf8mb4 data @@ -747,10 +744,10 @@ # # Bug#22638 SOUNDEX broken for international characters # -select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB); -select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)); -select soundex(_utf8mb4 0xD091D092D093); -select hex(soundex(_utf8mb4 0xD091D092D093)); +select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) as exp; +select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) as exp; +select soundex(_utf8mb4 0xD091D092D093) as exp; +select hex(soundex(_utf8mb4 0xD091D092D093)) as exp; SET collation_connection='utf8mb4_general_ci'; @@ -786,7 +783,7 @@ # # Bug#8385: utf8mb4_general_ci treats Cyrillic letters I and SHORT I as the same # -select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4); +select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4) as exp; # # Bugs#5980: NULL requires a characterset in a union @@ -1191,6 +1188,7 @@ # (see bug #16674 as well) # +--disable_service_connection SET NAMES latin2; if (!$is_heap) @@ -1220,6 +1218,7 @@ DROP TABLE t1; } +--enable_service_connection # # Bug 20709: problem with utf8mb4 fields in temporary tables @@ -1420,8 +1419,11 @@ eval create table t1 (a varchar(10) character set latin1, b int) engine $engine; insert into t1 values ('a',1); select concat(a, if(b>10, N'x', N'y')) from t1; +#Incorrect collation in error message with view protocol +--disable_view_protocol --error 1267 select concat(a, if(b>10, N'æ', N'ß')) from t1; +--enable_view_protocol drop table t1; # Conversion tests for character set introducers diff -Nru mariadb-10.11.6/mysql-test/include/deadlock.inc mariadb-10.11.9/mysql-test/include/deadlock.inc --- mariadb-10.11.6/mysql-test/include/deadlock.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/deadlock.inc 2024-08-03 07:29:56.000000000 +0000 @@ -103,7 +103,6 @@ # The following query should hang because con1 is locking the record update t2 set a=2 where b = 0; -select * from t2; --send update t1 set x=2 where id = 0; --sleep 2 diff -Nru mariadb-10.11.6/mysql-test/include/default_mysqld.cnf mariadb-10.11.9/mysql-test/include/default_mysqld.cnf --- mariadb-10.11.6/mysql-test/include/default_mysqld.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/default_mysqld.cnf 2024-08-03 07:29:56.000000000 +0000 @@ -71,7 +71,7 @@ loose-performance-schema-users-size=100 loose-performance-schema-max-mutex-instances=5000 loose-performance-schema-max-rwlock-instances=5000 -loose-performance-schema-max-cond-instances=1000 +loose-performance-schema-max-cond-instances=1500 loose-performance-schema-max-file-instances=10000 loose-performance-schema-max-socket-instances=1000 loose-performance-schema-max-table-instances=500 @@ -91,7 +91,7 @@ loose-performance-schema-events-statements-history-long-size=1000 loose-performance-schema-events-transactions-history-size=10 loose-performance-schema-events-transactions-history-long-size=1000 -loose-performance-schema-max-thread-instances=200 +loose-performance-schema-max-thread-instances=400 loose-performance-schema-session-connect-attrs-size=2048 loose-performance-schema-max-metadata-locks=10000 diff -Nru mariadb-10.11.6/mysql-test/include/delete_anonymous_users.inc mariadb-10.11.9/mysql-test/include/delete_anonymous_users.inc --- mariadb-10.11.6/mysql-test/include/delete_anonymous_users.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/delete_anonymous_users.inc 2024-08-03 07:29:56.000000000 +0000 @@ -1,7 +1,7 @@ # Remove anonymous users added by add_anonymous_users.inc disable_warnings; disable_query_log; -DELETE FROM mysql.user where host='localhost' and user=''; +DELETE FROM mysql.global_priv where host='localhost' and user=''; FLUSH PRIVILEGES; enable_query_log; enable_warnings; diff -Nru mariadb-10.11.6/mysql-test/include/empty_string_literal.inc mariadb-10.11.9/mysql-test/include/empty_string_literal.inc --- mariadb-10.11.6/mysql-test/include/empty_string_literal.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/empty_string_literal.inc 2024-08-03 07:29:56.000000000 +0000 @@ -1,17 +1,15 @@ SET SESSION character_set_connection=latin2; SET SESSION character_set_client=cp1250; ---disable_service_connection - --echo # --echo # Test litteral --echo # -#enable view protocol after fix MDEV-27871 and -# it is necessary that the view protocol uses the same connection, -# not util connection +# For "--view-protocol" NULLIF('','') converts to nullif(NULL,NULL) +# in view definition and CHARSET(nullif(NULL,NULL)) returns 'binary'. +# Also view does not allow columns with the same name, +# so it uses generated names --disable_view_protocol - SET sql_mode=@mode; select @@sql_mode; SELECT '',CHARSET(''), null, CHARSET(null), CAST(null as char(10)), CHARSET(CAST(null as char(10))), 'x', CHARSET('x'); @@ -21,7 +19,6 @@ SELECT CHARSET(NULLIF('','')),NULLIF('',''); - --echo # --echo # Test NCHAR litteral --echo # @@ -33,7 +30,6 @@ SELECT CHARSET(NULLIF(N'',N'')),NULLIF(N'',N''); - --echo # --echo # Test CHARSET prefix litteral --echo # @@ -63,12 +59,12 @@ SELECT '' '' '',CHARSET('' '' ''); SELECT _latin1'' '' '',CHARSET(_latin1'' '' ''); SELECT N'' '' '',CHARSET(N'' '' ''); - --enable_view_protocol --echo # --echo # UNION - implicit group by --echo # +--disable_service_connection SELECT 1, null UNION SELECT 1 , '' @@ -84,16 +80,10 @@ SELECT 1 , _cp1250 '' ORDER BY 1; -# it is necessary that the view protocol uses the same connection, -# not util connection ---disable_view_protocol - SELECT NULLIF(_cp1250 '',_cp1250 '') UNION SELECT NULLIF(N'',N''); ---enable_view_protocol - --error ER_CANT_AGGREGATE_2COLLATIONS SELECT 1 , _latin2 '' UNION @@ -131,5 +121,4 @@ EXPLAIN EXTENDED SELECT _latin1''; EXPLAIN EXTENDED SELECT N''; EXPLAIN EXTENDED SELECT '' ''; - --enable_service_connection diff -Nru mariadb-10.11.6/mysql-test/include/expect_crash.inc mariadb-10.11.9/mysql-test/include/expect_crash.inc --- mariadb-10.11.6/mysql-test/include/expect_crash.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/expect_crash.inc 2024-08-03 07:29:56.000000000 +0000 @@ -2,4 +2,4 @@ --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect # There should be a debug crash after using this .inc file ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name diff -Nru mariadb-10.11.6/mysql-test/include/explain_non_select.inc mariadb-10.11.9/mysql-test/include/explain_non_select.inc --- mariadb-10.11.6/mysql-test/include/explain_non_select.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/explain_non_select.inc 2024-08-03 07:29:56.000000000 +0000 @@ -306,6 +306,19 @@ --source include/explain_utils.inc DROP TABLE t1; +--echo #30a +--echo # +--echo # MDEV-32957 Unusable key notes report wrong predicates for > and >= +--echo # +CREATE TABLE t1(a INT, i CHAR(2), INDEX(i(1))); +INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19), + (20),(21),(22),(23),(24),(25),(26),(27),(28),(29), + (30),(31),(32),(33),(34),(35); +--let $query = DELETE FROM t1 WHERE i >= 10 AND i < 18 ORDER BY i LIMIT 5 +--let $select = SELECT * FROM t1 WHERE i >= 10 AND i < 18 ORDER BY i LIMIT 5 +--source include/explain_utils.inc +DROP TABLE t1; + --echo #31 CREATE TABLE t1 (i INT); INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19), diff -Nru mariadb-10.11.6/mysql-test/include/galera_sst_method.combinations mariadb-10.11.9/mysql-test/include/galera_sst_method.combinations --- mariadb-10.11.6/mysql-test/include/galera_sst_method.combinations 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/galera_sst_method.combinations 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,5 @@ +[rsync] +wsrep-sst-method=rsync + +[mariabackup] +wsrep_sst_method=mariabackup diff -Nru mariadb-10.11.6/mysql-test/include/galera_sst_method.inc mariadb-10.11.9/mysql-test/include/galera_sst_method.inc --- mariadb-10.11.6/mysql-test/include/galera_sst_method.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/galera_sst_method.inc 2024-08-03 07:29:56.000000000 +0000 @@ -0,0 +1,4 @@ +# The goal of including this file is to enable galera_sst_method combinations +# (see include/galera_sst_method.combinations) + +--source include/have_innodb.inc diff -Nru mariadb-10.11.6/mysql-test/include/gis_debug.inc mariadb-10.11.9/mysql-test/include/gis_debug.inc --- mariadb-10.11.6/mysql-test/include/gis_debug.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/gis_debug.inc 2024-08-03 07:29:57.000000000 +0000 @@ -119,28 +119,25 @@ --enable_query_log -#enable after fix MDEV-27871 ---disable_view_protocol SELECT ST_CONTAINS( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), - GeomFromText('POINT(5 10)')); + GeomFromText('POINT(5 10)')) as geom; SELECT AsText(ST_UNION( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), - GeomFromText('POINT(5 10)'))); + GeomFromText('POINT(5 10)'))) as geom; DROP PROCEDURE p1; --echo # --echo # Bug #13833019 ASSERTION `T1->RESULT_RANGE' FAILED IN GCALC_OPERATION_REDUCER::END_COUPLE --echo # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)); +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) as geom; --echo # --echo # Bug #13832749 HANDLE_FATAL_SIGNAL IN GCALC_FUNCTION::COUNT_INTERNAL --echo # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)); +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) as geom; ---enable_view_protocol --echo # --echo # Bug#13358363 - ASSERTION: N > 0 && N < SINUSES_CALCULATED*2+1 | GET_N_SINCOS/ADD_EDGE_BUFFER @@ -148,22 +145,19 @@ DO ST_BUFFER(ST_GEOMCOLLFROMTEXT('linestring(1 1,2 2)'),''); -#enable after fix MDEV-27871 ---disable_view_protocol SELECT ST_WITHIN( LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) '), - ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))); + ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))) as st; SELECT ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), - ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))); + ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) as st; SELECT ST_NUMINTERIORRINGS( ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), - SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))); + SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) as st; SELECT ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), - SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))); + SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) as st; ---enable_view_protocol diff -Nru mariadb-10.11.6/mysql-test/include/gis_generic.inc mariadb-10.11.9/mysql-test/include/gis_generic.inc --- mariadb-10.11.6/mysql-test/include/gis_generic.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/gis_generic.inc 2024-08-03 07:29:57.000000000 +0000 @@ -142,11 +142,13 @@ Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t, Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; +--disable_view_protocol explain extended SELECT g1.fid as first, g2.fid as second, Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o, Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t, Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; +--enable_view_protocol DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry; diff -Nru mariadb-10.11.6/mysql-test/include/have_innodb.combinations mariadb-10.11.9/mysql-test/include/have_innodb.combinations --- mariadb-10.11.6/mysql-test/include/have_innodb.combinations 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/have_innodb.combinations 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ -[innodb_plugin] -ignore-builtin-innodb -plugin-load-add=$HA_INNODB_SO -innodb -innodb-cmpmem -innodb-cmp-per-index -innodb-trx -innodb-locks -innodb-lock-waits -innodb-buffer-pool-stats -innodb-buffer-page -innodb-buffer-page-lru -innodb-sys-columns -innodb-sys-fields -innodb-sys-foreign -innodb-sys-foreign-cols -innodb-sys-indexes -innodb-sys-tables -innodb-sys-virtual -innodb-metrics - -[innodb] -innodb -innodb-cmpmem -innodb-cmp-per-index -innodb-trx -innodb-locks -innodb-lock-waits -innodb-metrics -innodb-buffer-pool-stats -innodb-buffer-page -innodb-buffer-page-lru -innodb-sys-columns -innodb-sys-fields -innodb-sys-foreign -innodb-sys-foreign-cols -innodb-sys-indexes -innodb-sys-tables -innodb-sys-virtual diff -Nru mariadb-10.11.6/mysql-test/include/have_innodb.inc mariadb-10.11.9/mysql-test/include/have_innodb.inc --- mariadb-10.11.6/mysql-test/include/have_innodb.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/have_innodb.inc 2024-08-03 07:29:57.000000000 +0000 @@ -3,6 +3,11 @@ # will be skipped unless innodb is enabled # --disable_query_log +if (`select version() like '%debug%'`) +{ +SET STATEMENT sql_log_bin=0 FOR +call mtr.add_suppression("InnoDB: Trying to delete tablespace.*pending operations"); +} if (`select count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like 'MSAN%'`) { SET STATEMENT sql_log_bin=0 FOR diff -Nru mariadb-10.11.6/mysql-test/include/have_innodb.opt mariadb-10.11.9/mysql-test/include/have_innodb.opt --- mariadb-10.11.6/mysql-test/include/have_innodb.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/have_innodb.opt 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,17 @@ +--innodb +--innodb-cmpmem +--innodb-cmp-per-index +--innodb-trx +--innodb-locks +--innodb-lock-waits +--innodb-metrics +--innodb-buffer-pool-stats +--innodb-buffer-page +--innodb-buffer-page-lru +--innodb-sys-columns +--innodb-sys-fields +--innodb-sys-foreign +--innodb-sys-foreign-cols +--innodb-sys-indexes +--innodb-sys-tables +--innodb-sys-virtual diff -Nru mariadb-10.11.6/mysql-test/include/have_normal_bzip.inc mariadb-10.11.9/mysql-test/include/have_normal_bzip.inc --- mariadb-10.11.6/mysql-test/include/have_normal_bzip.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/have_normal_bzip.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ ---source include/have_compress.inc - -# Test that the system is using the default/standard bzip library. -# If not, we have to skip the test as the compression lengths displayed -# in the test will not match the results from used compression library. - -if (`select length(COMPRESS(space(5000))) != 33`) { - skip Test skipped as standard bzip is needed; -} diff -Nru mariadb-10.11.6/mysql-test/include/have_normal_zlib.inc mariadb-10.11.9/mysql-test/include/have_normal_zlib.inc --- mariadb-10.11.6/mysql-test/include/have_normal_zlib.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/have_normal_zlib.inc 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,9 @@ +--source include/have_compress.inc + +# Test that the system is using the default/standard zlib library. +# If not, we have to skip the test as the compression lengths displayed +# in the test will not match the results from used compression library. + +if (`select length(COMPRESS(space(5000))) != 33`) { + skip Test skipped as standard zlib is needed; +} diff -Nru mariadb-10.11.6/mysql-test/include/index_merge1.inc mariadb-10.11.9/mysql-test/include/index_merge1.inc --- mariadb-10.11.6/mysql-test/include/index_merge1.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/index_merge1.inc 2024-08-03 07:29:57.000000000 +0000 @@ -301,31 +301,28 @@ # Test for BUG#4177 -# enable view-protocol after fix MDEV-27871 ---disable_view_protocol - drop table t4; create table t4 (a int); insert into t4 values (1),(4),(3); set @save_join_buffer_size=@@join_buffer_size; set join_buffer_size= 4096; -explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 < 500000 or A.key2 < 3) and (B.key1 < 500000 or B.key2 < 3); -select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 < 500000 or A.key2 < 3) and (B.key1 < 500000 or B.key2 < 3); update t0 set key1=1; -explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 = 1 or A.key2 = 1) and (B.key1 = 1 or B.key2 = 1); -select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 = 1 or A.key2 = 1) and (B.key1 = 1 or B.key2 = 1); @@ -338,12 +335,12 @@ # scan cost estimates depend on ha_myisam::ref_length) --replace_column 9 # --replace_result "4,4,4,4,4,4,4" X "4,4,4,4,4,4" X "i6,i7" "i6,i7?" "i6" "i6,i7?" -explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A straight_join t0 as B where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1) and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1); -select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A straight_join t0 as B where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1) and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1); @@ -353,8 +350,6 @@ drop table t0, t1, t2, t3, t4; ---enable_view_protocol - # BUG#16166 CREATE TABLE t1 ( cola char(3) not null, colb char(3) not null, filler char(200), diff -Nru mariadb-10.11.6/mysql-test/include/innodb_rollback_on_timeout.inc mariadb-10.11.9/mysql-test/include/innodb_rollback_on_timeout.inc --- mariadb-10.11.6/mysql-test/include/innodb_rollback_on_timeout.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/innodb_rollback_on_timeout.inc 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,3 @@ ---source include/have_innodb.inc # # Bug #24200: Provide backwards compatibility mode for 4.x "rollback on # transaction timeout" @@ -22,7 +21,6 @@ connection con1; begin work; insert into t1 values (5); -select * from t1; # Lock wait timeout set to 2 seconds in -master.opt; this # statement will time out; in 5.0.13+, it will not roll back transaction. --error ER_LOCK_WAIT_TIMEOUT diff -Nru mariadb-10.11.6/mysql-test/include/innodb_stable_estimates.inc mariadb-10.11.9/mysql-test/include/innodb_stable_estimates.inc --- mariadb-10.11.6/mysql-test/include/innodb_stable_estimates.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/innodb_stable_estimates.inc 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,12 @@ +# +# Include this file in your .test file if your testcase uses InnoDB tables +# requiring stable query plans, which likely requires that InnoDB produces +# stable estimates for #records in tables. +# +# How it works: +# Unstable InnoDB estimates are caused by InnoDB's background statistics +# collection. When you include this file, MTR will use server options from +# include/innodb_stable_estimates.opt, which disables background statistics +# collection. +# (and no, InnoDB team objects to using this configuration for all MTR tests) +# diff -Nru mariadb-10.11.6/mysql-test/include/innodb_stable_estimates.opt mariadb-10.11.9/mysql-test/include/innodb_stable_estimates.opt --- mariadb-10.11.6/mysql-test/include/innodb_stable_estimates.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/innodb_stable_estimates.opt 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1 @@ +--innodb_stats_auto_recalc=0 diff -Nru mariadb-10.11.6/mysql-test/include/kill_and_restart_mysqld.inc mariadb-10.11.9/mysql-test/include/kill_and_restart_mysqld.inc --- mariadb-10.11.6/mysql-test/include/kill_and_restart_mysqld.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/kill_and_restart_mysqld.inc 2024-08-03 07:29:57.000000000 +0000 @@ -7,7 +7,7 @@ --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect --echo # Kill and $restart_parameters ---exec echo "$restart_parameters" > $_expect_file_name +--write_line "$restart_parameters" $_expect_file_name --shutdown_server 0 --source include/wait_until_disconnected.inc --enable_reconnect diff -Nru mariadb-10.11.6/mysql-test/include/kill_galera.inc mariadb-10.11.9/mysql-test/include/kill_galera.inc --- mariadb-10.11.6/mysql-test/include/kill_galera.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/kill_galera.inc 2024-08-03 07:29:57.000000000 +0000 @@ -3,7 +3,7 @@ # Write file to make mysql-test-run.pl expect the crash, but don't start it --let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name # Kill the connected server --disable_reconnect diff -Nru mariadb-10.11.6/mysql-test/include/kill_mysqld.inc mariadb-10.11.9/mysql-test/include/kill_mysqld.inc --- mariadb-10.11.6/mysql-test/include/kill_mysqld.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/kill_mysqld.inc 2024-08-03 07:29:57.000000000 +0000 @@ -2,6 +2,6 @@ --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect --echo # Kill the server ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name --shutdown_server 0 --source include/wait_until_disconnected.inc diff -Nru mariadb-10.11.6/mysql-test/include/log_bin.combinations mariadb-10.11.9/mysql-test/include/log_bin.combinations --- mariadb-10.11.6/mysql-test/include/log_bin.combinations 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/log_bin.combinations 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,4 @@ +[binlogoff] + +[binlogon] +log-bin diff -Nru mariadb-10.11.6/mysql-test/include/log_bin.inc mariadb-10.11.9/mysql-test/include/log_bin.inc --- mariadb-10.11.6/mysql-test/include/log_bin.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/log_bin.inc 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,3 @@ +# include file for test files that can be run with and without log-bin +# (see include/log_bin.combinations) + diff -Nru mariadb-10.11.6/mysql-test/include/log_slow_grep.inc mariadb-10.11.9/mysql-test/include/log_slow_grep.inc --- mariadb-10.11.6/mysql-test/include/log_slow_grep.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/log_slow_grep.inc 2024-08-03 07:29:57.000000000 +0000 @@ -21,5 +21,10 @@ --source include/log_grep.inc # InnoDB/Engines ---let log_expected_matches = $log_slow_innodb_expected_matches ---let grep_pattern = ^# Pages_accessed: \d+ Pages_read: \d+ Pages_updated: \d+ Old_rows_read: \d+\n# Pages_read_time: \d+\.\d+ Engine_time: \d+\.\d+\$ +--let log_expected_matches = $log_slow_verbosity_innodb_expected_matches +--let grep_pattern = ^# Pages_accessed: \d+ Pages_read: \d+ Pages_prefetched: \d+ Pages_updated: \d+ Old_rows_read: \d+\$ +--source include/log_grep.inc + +--let grep_pattern = ^# Pages_read_time: \d+\.\d+ Engine_time: \d+\.\d+\$ +--source include/log_grep.inc + diff -Nru mariadb-10.11.6/mysql-test/include/not_valgrind_build.inc mariadb-10.11.9/mysql-test/include/not_valgrind_build.inc --- mariadb-10.11.6/mysql-test/include/not_valgrind_build.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/not_valgrind_build.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -if (`select version() like '%valgrind%' || version() like '%asan%'`) -{ - skip Does not run with binaries built with valgrind or asan; -} diff -Nru mariadb-10.11.6/mysql-test/include/read_head.inc mariadb-10.11.9/mysql-test/include/read_head.inc --- mariadb-10.11.6/mysql-test/include/read_head.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/read_head.inc 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,30 @@ +# Purpose: +# Print first LINES_TO_READ from a file. +# The environment variables SEARCH_FILE and LINES_TO_READ must be set +# before sourcing this routine. +# Use: +# When the test is slow ( example because of ASAN build) then it +# may not flush the lines when 'cat' command is called and the +# test could fail with missing lines. Hence this can be used to +# to print first N lines. +# + +perl; + +use strict; + +my $search_file = $ENV{SEARCH_FILE} or die "SEARCH_FILE not set"; +my $lines_to_read = $ENV{LINES_TO_READ} or die "LINES_TO_READ not set"; + +open(FILE, '<', $search_file) or die "Can't open file $search_file: $!"; + +my $line_count = 0; +while ($line_count < $lines_to_read and my $line = ) +{ + print $line; + $line_count++; +} + +close(FILE); + +EOF diff -Nru mariadb-10.11.6/mysql-test/include/rowid_filter_debug_kill.inc mariadb-10.11.9/mysql-test/include/rowid_filter_debug_kill.inc --- mariadb-10.11.6/mysql-test/include/rowid_filter_debug_kill.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/rowid_filter_debug_kill.inc 2024-08-03 07:29:57.000000000 +0000 @@ -55,5 +55,33 @@ reap; set debug_sync='RESET'; +--echo # +--echo # MDEV-30651: SIGSEGV in st_join_table::save_explain_data and +--echo # Assertion `sel->quick' failed in make_range_rowid_filters +--echo # + +--echo # Reusing table t2 and t3 from previous test +let $target_id= `select connection_id()`; + +set debug_sync='in_forced_range_optimize SIGNAL ready1 WAIT_FOR go1'; +send +explain +select * from t2, t3 +where + t3.key1=t2.a and t3.key2 in (2,3); + +connect (con1, localhost, root,,); +set debug_sync='now WAIT_FOR ready1'; +evalp kill query $target_id; +set debug_sync='now SIGNAL go1'; + +connection default; +disconnect con1; + +--error ER_QUERY_INTERRUPTED +reap; +set debug_sync='RESET'; + + drop table t2,t3; --source include/wait_until_count_sessions.inc diff -Nru mariadb-10.11.6/mysql-test/include/rpl_change_topology.inc mariadb-10.11.9/mysql-test/include/rpl_change_topology.inc --- mariadb-10.11.6/mysql-test/include/rpl_change_topology.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/rpl_change_topology.inc 2024-08-03 07:29:57.000000000 +0000 @@ -96,10 +96,11 @@ # Remove whitespace from $rpl_topology --let $rpl_topology= `SELECT REPLACE('$rpl_topology', ' ', '')` +--source include/slow_environ.inc + --let $include_filename= rpl_change_topology.inc [new topology=$rpl_topology] --source include/begin_include_file.inc - if ($rpl_debug) { --echo ---- Check input ---- @@ -235,11 +236,11 @@ } if ($rpl_master_log_file) { - eval CHANGE MASTER TO MASTER_HOST = '127.0.0.1', MASTER_PORT = $_rpl_port, MASTER_USER = 'root', MASTER_LOG_FILE = '$_rpl_master_log_file'$_rpl_master_log_pos, MASTER_CONNECT_RETRY = 1, MASTER_USE_GTID=NO; + eval CHANGE MASTER TO MASTER_HOST = '127.0.0.1', MASTER_PORT = $_rpl_port, MASTER_USER = 'root', MASTER_LOG_FILE = '$_rpl_master_log_file'$_rpl_master_log_pos, MASTER_CONNECT_RETRY = 1$_timeout_adjustment, MASTER_USE_GTID=NO; } if (!$rpl_master_log_file) { - eval CHANGE MASTER TO MASTER_HOST = '127.0.0.1', MASTER_PORT = $_rpl_port, MASTER_USER = 'root', MASTER_CONNECT_RETRY=1; + eval CHANGE MASTER TO MASTER_HOST = '127.0.0.1', MASTER_PORT = $_rpl_port, MASTER_USER = 'root', MASTER_CONNECT_RETRY=1$_timeout_adjustment; } } if ($_rpl_master == '') diff -Nru mariadb-10.11.6/mysql-test/include/rpl_clone_slave_using_mariadb-backup.inc mariadb-10.11.9/mysql-test/include/rpl_clone_slave_using_mariadb-backup.inc --- mariadb-10.11.6/mysql-test/include/rpl_clone_slave_using_mariadb-backup.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/rpl_clone_slave_using_mariadb-backup.inc 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,297 @@ +if ($cnf == "galera2_to_mariadb") +{ + --let MASTER_MYPORT= $NODE_MYPORT_1 + --connect master, 127.0.0.1, root, , test, $NODE_MYPORT_1 + --connect slave, 127.0.0.1, root, , test, $NODE_MYPORT_3 + --disable_query_log + --replace_result $MASTER_MYPORT ### + --eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root', MASTER_PORT=$MASTER_MYPORT, MASTER_USE_GTID=NO; + --enable_query_log + START SLAVE; + --source include/wait_for_slave_to_start.inc + + --let XTRABACKUP_BACKUP_OPTIONS=--no-defaults --user=root --host='127.0.0.1' --port=$NODE_MYPORT_3 + --let XTRABACKUP_COPY_BACK_OPTIONS= --no-defaults +} + +if ($cnf == "mariadb_to_mariadb") +{ + --let XTRABACKUP_BACKUP_OPTIONS=--defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffix=.2 + --let XTRABACKUP_COPY_BACK_OPTIONS=--defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffix=.2 +} + +--connection master +--let $MYSQLD_DATADIR_MASTER= `select @@datadir` +--connection slave +--let $MYSQLD_DATADIR_SLAVE= `select @@datadir` + +# This test covers the filename:pos based synchronization +# between the master and the slave. +# If we ever need to test a GTID based synchronization, +# it should be done in a separate test. + + +--echo ############################################################## +--echo ### Initial block with some transactions + +--echo ### Slave: Make sure replication is not using GTID +--connection slave +--let $value= query_get_value(SHOW SLAVE STATUS, "Using_Gtid", 1) +--echo # Using_Gtid=$value + +--echo ### Master: Create and populate t1 +--connection master +CREATE TABLE t1(a TEXT) ENGINE=InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#00:stmt#00 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#00:stmt#01 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#00:stmt#02 - slave run#0, before backup'); +COMMIT; +--sync_slave_with_master + + + +--echo ############################################################## +--echo ### Run the last transaction before mariadb-backup --backup +--echo ### Remember SHOW MASTER STATUS and @@gtid_binlog_pos +--echo ### before and after the transaction. + +--echo ### Master: Rember MASTER STATUS and @@gtid_binlog_pos before tr#01 +--connection master +--let $master_before_tr01_show_master_status_file=query_get_value(SHOW MASTER STATUS, File, 1) +--let $master_before_tr01_show_master_status_position=query_get_value(SHOW MASTER STATUS, Position, 1) +--let $master_before_tr01_gtid_binlog_pos=`SELECT @@global.gtid_binlog_pos` + +--echo ### Slave: Remember MASTER STATUS and @@gtid_binlog_pos before tr#01 +--connection slave +--let $slave_before_tr01_show_master_status_file=query_get_value(SHOW MASTER STATUS, File, 1) +--let $slave_before_tr01_show_master_status_position=query_get_value(SHOW MASTER STATUS, Position, 1) +--let $slave_before_tr01_gtid_binlog_pos=`SELECT @@global.gtid_binlog_pos` + +--echo ### Master: Run the actual last transaction before the backup +--connection master +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#01:stmt#00 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#01:stmt#01 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#01:stmt#02 - slave run#0, before backup'); +COMMIT; +--sync_slave_with_master + +--echo ### Master: Remember MASTER STATUS and @@gtid_binlog_pos after tr#01 +--connection master +--let $master_after_tr01_show_master_status_file=query_get_value(SHOW MASTER STATUS, File, 1) +--let $master_after_tr01_show_master_status_position=query_get_value(SHOW MASTER STATUS, Position, 1) +--let $master_after_tr01_gtid_binlog_pos=`SELECT @@global.gtid_binlog_pos` + +--echo ### Slave: Remember MASTER STATUS and @@gtid_binlog_pos after tr#01 +--connection slave +--let $slave_after_tr01_show_master_status_file=query_get_value(SHOW MASTER STATUS, File, 1) +--let $slave_after_tr01_show_master_status_position=query_get_value(SHOW MASTER STATUS, Position, 1) +--let $slave_after_tr01_gtid_binlog_pos=`SELECT @@global.gtid_binlog_pos` + + +--echo ############################################################## +--echo ### Running `mariadb-backup --backup,--prepare` and checking +--echo ### that xtrabackup_slave_info and xtrabackup_binlog_info are OK + +--echo ### Slave: Create a backup +--let $backup_slave=$MYSQLTEST_VARDIR/tmp/backup-slave +--disable_result_log +--exec $XTRABACKUP $XTRABACKUP_BACKUP_OPTIONS --slave-info --backup --target-dir=$backup_slave +--enable_result_log + +--echo ### Slave: Prepare the backup +--exec $XTRABACKUP --prepare --target-dir=$backup_slave + +--echo ### Slave: xtrabackup files: +--echo ############################ xtrabackup_slave_info +--replace_result $master_after_tr01_show_master_status_file master_after_tr01_show_master_status_file $master_after_tr01_show_master_status_position master_after_tr01_show_master_status_position +--cat_file $backup_slave/xtrabackup_slave_info +--echo ############################ xtrabackup_binlog_info +--replace_result $slave_after_tr01_show_master_status_file slave_after_tr01_show_master_status_file $slave_after_tr01_show_master_status_position slave_after_tr01_show_master_status_position $slave_after_tr01_gtid_binlog_pos slave_after_tr01_gtid_binlog_pos +--cat_file $backup_slave/xtrabackup_binlog_info +--echo ############################ + + +--echo ############################################################## +--echo ### Run more transactions after the backup: +--echo ### - while the slave is still running, then +--echo ### - while the slave is shut down + +--echo ### Master: Run another transaction while the slave is still running +--connection master +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#02:stmt#00 - slave run#0, after backup'); +INSERT INTO t1 VALUES ('tr#02:stmt#01 - slave run#0, after backup'); +INSERT INTO t1 VALUES ('tr#02:stmt@02 - slave run#0, after backup'); +COMMIT; +--sync_slave_with_master + +--echo ### Master: Remember MASTER STATUS and @@gtid_binlog_pos after tr#02 +--connection master +--let $master_after_tr02_show_master_status_file=query_get_value(SHOW MASTER STATUS, File, 1) +--let $master_after_tr02_show_master_status_position=query_get_value(SHOW MASTER STATUS, Position, 1) +--let $master_after_tr02_gtid_binlog_pos=`SELECT @@global.gtid_binlog_pos` + +--echo ### Slave: Remember MASTER STATUS and @@gtid_binlog_pos after tr#02 +--connection slave +--let $slave_after_tr02_show_master_status_file=query_get_value(SHOW MASTER STATUS, File, 1) +--let $slave_after_tr02_show_master_status_position=query_get_value(SHOW MASTER STATUS, Position, 1) +--let $slave_after_tr02_gtid_binlog_pos=`SELECT @@global.gtid_binlog_pos` + + +--echo ### Master: Checking SHOW BINLOG EVENTS + +--connection master +--vertical_results +### The BEGIN event +--replace_column 4 # 5 # +--replace_result $master_after_tr01_show_master_status_file master_after_tr01_show_master_status_file $master_after_tr01_show_master_status_position master_after_tr01_show_master_status_position $master_after_tr02_gtid_binlog_pos master_after_tr02_gtid_binlog_pos +--eval SHOW BINLOG EVENTS IN '$master_after_tr01_show_master_status_file' FROM $master_after_tr01_show_master_status_position LIMIT 0,1 +### The INSERT event +--replace_column 2 # 4 # 5 # +--replace_result $master_after_tr01_show_master_status_file master_after_tr01_show_master_status_file $master_after_tr01_show_master_status_position master_after_tr01_show_master_status_position +# Hide the difference between row and stmt binary logging +--replace_regex /use `test`; // /(Query|Annotate_rows)/Query_or_Annotate_rows/ +--eval SHOW BINLOG EVENTS IN '$master_after_tr01_show_master_status_file' FROM $master_after_tr01_show_master_status_position LIMIT 1,1 +--horizontal_results + +--echo ### Slave: Checking SHOW BINLOG EVENTS +--connection slave +--vertical_results +### The BEGIN event +--replace_column 2 # 5 # +--replace_result $slave_after_tr01_show_master_status_file slave_after_tr01_show_master_status_file $slave_after_tr01_show_master_status_position slave_after_tr01_show_master_status_position $slave_after_tr02_gtid_binlog_pos slave_after_tr02_gtid_binlog_pos +--eval SHOW BINLOG EVENTS IN '$slave_after_tr01_show_master_status_file' FROM $slave_after_tr01_show_master_status_position LIMIT 0,1 +### The INSERT event +--replace_column 2 # 4 # 5 # +--replace_result $slave_after_tr01_show_master_status_file slave_after_tr01_show_master_status_file $slave_after_tr01_show_master_status_position slave_after_tr01_show_master_status_position $slave_after_tr02_gtid_binlog_pos slave_after_tr02_gtid_binlog_pos +# Hide the difference between row and stmt binary logging +--replace_regex /use `test`; // /(Query|Annotate_rows)/Query_or_Annotate_rows/ +--eval SHOW BINLOG EVENTS IN '$slave_after_tr01_show_master_status_file' FROM $slave_after_tr01_show_master_status_position LIMIT 1,1 +--horizontal_results + +--echo ### Slave: Stop replication +--connection slave +STOP SLAVE; +--source include/wait_for_slave_to_stop.inc +RESET SLAVE; + +--echo ### Slave: Shutdown the server + +if ($cnf == "mariadb_to_mariadb") +{ + --let $rpl_server_number= 2 + --source include/rpl_stop_server.inc +} + +if ($cnf == "galera2_to_mariadb") +{ + --connection slave + --source $MYSQL_TEST_DIR/include/shutdown_mysqld.inc +} + +--echo ### Master: Run a transaction while the slave is shut down +--connection master +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#03:stmt#00 - after slave run#0, slave is shut down, after backup'); +INSERT INTO t1 VALUES ('tr#03:stmt#01 - after slave run#0, slave is shut down, after backup'); +INSERT INTO t1 VALUES ('tr#03:stmt#02 - after slave run#0, slave is shut down, after backup'); +COMMIT; + + +--echo ############################################################## +--echo ### Emulate starting a new virgin slave + +--echo ### Slave: Remove the data directory +--rmdir $MYSQLD_DATADIR_SLAVE + +--echo ### Slave: Copy back the backup +--exec $XTRABACKUP $XTRABACKUP_COPY_BACK_OPTIONS --copy-back --datadir=$MYSQLD_DATADIR_SLAVE --target-dir=$backup_slave + +--echo ### Slave: Restart the server +if ($cnf == "mariadb_to_mariadb") +{ + --let $rpl_server_number= 2 + --source include/rpl_start_server.inc + --source include/wait_until_connected_again.inc +} + +if ($cnf == "galera2_to_mariadb") +{ + --connection slave + --source $MYSQL_TEST_DIR/include/start_mysqld.inc +} + +--echo ### Slave: Display the restored data before START SLAVE +--connection slave +SELECT * FROM t1 ORDER BY a; + +--echo ### Slave: Execute the CHANGE MASTER statement to set up the host and port +--replace_result $MASTER_MYPORT ### +--eval CHANGE MASTER '' TO MASTER_USER='root', MASTER_HOST='127.0.0.1', MASTER_PORT=$MASTER_MYPORT, MASTER_CONNECT_RETRY=1 + +--echo ### Slave: Execute the CHANGE MASTER statement from xtrabackup_slave_info +--replace_result $master_after_tr01_show_master_status_file master_after_tr01_show_master_status_file $master_after_tr01_show_master_status_position master_after_tr01_show_master_status_position +--source $backup_slave/xtrabackup_slave_info + +--echo ### Slave: Execute START SLAVE +--source include/start_slave.inc + +--echo ### Master: Wait for the slave to apply all master events +--connection master +--sync_slave_with_master slave + +--echo ### Slave: Make sure replication is not using GTID after the slave restart +--connection slave +--let $value= query_get_value(SHOW SLAVE STATUS, "Using_Gtid", 1) +--echo # Using_Gtid=$value + +--echo ### Slave: Display the restored data after START SLAVE +--connection slave +SELECT * FROM t1 ORDER BY a; + + +--echo ############################################################## +--echo ### Continue master transactions, check the new slave replicates well. + +--echo ### Master: Run a transaction after restarting replication +--connection master +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#04:stmt#00 - slave run#1'); +INSERT INTO t1 VALUES ('tr#04:stmt#01 - slave run#1'); +INSERT INTO t1 VALUES ('tr#04:stmt#02 - slave run#1'); +COMMIT; +--sync_slave_with_master + +--echo ### Slave: Display the restored data + new transactions +--connection slave +SELECT * FROM t1 ORDER BY a; + + +--echo ############################################################## +--echo ### Cleanup + +--echo ### Removing the backup directory +--rmdir $backup_slave + +--connection master +DROP TABLE t1; +--sync_slave_with_master + +if ($cnf == "mariadb_to_mariadb") +{ + --source include/rpl_end.inc +} + +if ($cnf == "galera2_to_mariadb") +{ + STOP SLAVE; + --source include/wait_for_slave_to_stop.inc + RESET SLAVE ALL; + + --connection master + set global wsrep_on=OFF; + RESET MASTER; + set global wsrep_on=ON; +} diff -Nru mariadb-10.11.6/mysql-test/include/rpl_start_server.inc mariadb-10.11.9/mysql-test/include/rpl_start_server.inc --- mariadb-10.11.6/mysql-test/include/rpl_start_server.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/rpl_start_server.inc 2024-08-03 07:29:57.000000000 +0000 @@ -49,7 +49,7 @@ --source include/rpl_connection.inc # Write file to make mysql-test-run.pl start up the server again ---exec echo "$_rpl_start_server_command" > $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect +--write_line "$_rpl_start_server_command" $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect if (!$rpl_server_error) { diff -Nru mariadb-10.11.6/mysql-test/include/rpl_stop_server.inc mariadb-10.11.9/mysql-test/include/rpl_stop_server.inc --- mariadb-10.11.6/mysql-test/include/rpl_stop_server.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/rpl_stop_server.inc 2024-08-03 07:29:57.000000000 +0000 @@ -44,7 +44,7 @@ # Write file to make mysql-test-run.pl expect the "crash", but don't start # it until it's told to ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect # Send shutdown to the connected server and give # it 60 seconds (of mysqltest's default) to die before zapping it diff -Nru mariadb-10.11.6/mysql-test/include/search_pattern_in_file.inc mariadb-10.11.9/mysql-test/include/search_pattern_in_file.inc --- mariadb-10.11.6/mysql-test/include/search_pattern_in_file.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/search_pattern_in_file.inc 2024-08-03 07:29:57.000000000 +0000 @@ -9,9 +9,6 @@ # # The environment variables SEARCH_FILE and SEARCH_PATTERN must be set # before sourcing this routine. -# SEARCH_TYPE can also be set to either NULL(default) or _gm_ -# NULL is equivalent of using m/SEARCH_PATTERN/gs -# _gm_ is equivalent of using m/SEARCH_RANGE/gm # # Optionally, SEARCH_RANGE can be set to the max number of bytes of the file # to search. If negative, it will search that many bytes at the end of the @@ -25,6 +22,7 @@ # Supported formats: # - (default) : "FOUND n /pattern/ in FILE " or "NOT FOUND ..." # - "matches" : Each match is printed, on a separate line +# - "count" : "FOUND n matches in FILE" or "NOT FOUND ..." (omit pattern) # # In case of # - SEARCH_FILE and/or SEARCH_PATTERN is not set @@ -38,7 +36,7 @@ # let SEARCH_FILE= $error_log; # # Stop the server # let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect; -# --exec echo "wait" > $restart_file +# --write_line wait $restart_file # --shutdown_server # --source include/wait_until_disconnected.inc # @@ -80,25 +78,23 @@ close(FILE); $content.= $file_content; } - my @matches; - if (not defined($ENV{SEARCH_TYPE})) - { - @matches=($content =~ /$search_pattern/gs); - } - elsif($ENV{SEARCH_TYPE} == "_gm_") - { - @matches=($content =~ /$search_pattern/gm); - } + my @matches= ($content =~ /$search_pattern/gs); my $res=@matches ? "FOUND " . scalar(@matches) : "NOT FOUND"; + $ENV{SEARCH_FILE} =~ s{^.*?([^/\\]+)$}{$1}; if ($ENV{SEARCH_OUTPUT} eq "matches") { - foreach (@matches) { - print $_ . "\n"; - } + foreach (@matches) { + print $_ . "\n"; + } + } + elsif ($ENV{SEARCH_OUTPUT} eq "count") + { + print "$res matches in $ENV{SEARCH_FILE}\n"; + } + elsif ($ENV{SEARCH_ABORT} and $res =~ /^$ENV{SEARCH_ABORT}/) { + die "$res /$search_pattern/ in $ENV{SEARCH_FILE}\n"; } else { - print "$res /$search_pattern/ in $ENV{SEARCH_FILE}\n"; + print "$res /$search_pattern/ in $ENV{SEARCH_FILE}\n"; } - die "$ENV{SEARCH_ABORT}\n" - if $ENV{SEARCH_ABORT} && $res =~ /^$ENV{SEARCH_ABORT}/; EOF diff -Nru mariadb-10.11.6/mysql-test/include/shutdown_mysqld.inc mariadb-10.11.9/mysql-test/include/shutdown_mysqld.inc --- mariadb-10.11.6/mysql-test/include/shutdown_mysqld.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/shutdown_mysqld.inc 2024-08-03 07:29:57.000000000 +0000 @@ -24,18 +24,15 @@ # Write file to make mysql-test-run.pl expect the "crash", but don't start it --let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name # Avoid warnings from connection threads that does not have time to exit --disable_query_log set @@global.log_warnings=0; --enable_query_log ---let $server_shutdown_timeout= 60 -if ($VALGRIND_TEST) -{ - --let $server_shutdown_timeout= 300 -} +--source include/slow_environ.inc +--let $server_shutdown_timeout= 60$_timeout_adjustment if ($shutdown_timeout) { diff -Nru mariadb-10.11.6/mysql-test/include/slow_environ.inc mariadb-10.11.9/mysql-test/include/slow_environ.inc --- mariadb-10.11.6/mysql-test/include/slow_environ.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/slow_environ.inc 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,9 @@ +if (!$slow_environ_check) +{ + let $_timeout_adjustment=; + if (`select $VALGRIND_TEST + count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like '%SAN%'`) + { + let $_timeout_adjustment=0; + } + let $slow_environ_check=1; +} diff -Nru mariadb-10.11.6/mysql-test/include/start_mysqld.inc mariadb-10.11.9/mysql-test/include/start_mysqld.inc --- mariadb-10.11.6/mysql-test/include/start_mysqld.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/start_mysqld.inc 2024-08-03 07:29:57.000000000 +0000 @@ -21,7 +21,7 @@ if ($restart_parameters) { - --exec echo "$restart_cmd: $restart_parameters" > $_expect_file_name + --write_line "$restart_cmd: $restart_parameters" $_expect_file_name if (!$restart_noprint) { --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR $MYSQLTEST_VARDIR MYSQLTEST_VARDIR @@ -34,7 +34,7 @@ } if (!$restart_parameters) { - --exec echo "$restart_cmd" > $_expect_file_name + --write_line "$restart_cmd" $_expect_file_name if ($restart_noprint < 2) { --exec echo "# $restart_cmd" diff -Nru mariadb-10.11.6/mysql-test/include/stop_slave_io.inc mariadb-10.11.9/mysql-test/include/stop_slave_io.inc --- mariadb-10.11.6/mysql-test/include/stop_slave_io.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/stop_slave_io.inc 2024-08-03 07:29:57.000000000 +0000 @@ -34,8 +34,17 @@ --disable_query_log } - +let $_enable_warnings=0; +if ($rpl_allow_error) { + if ($ENABLED_WARNINGS) { + let $_enable_warnings=1; + disable_warnings; + } +} STOP SLAVE IO_THREAD; +if ($_enable_warnings) { + enable_warnings; +} --source include/wait_for_slave_io_to_stop.inc diff -Nru mariadb-10.11.6/mysql-test/include/sync_slave_sql_with_io.inc mariadb-10.11.9/mysql-test/include/sync_slave_sql_with_io.inc --- mariadb-10.11.6/mysql-test/include/sync_slave_sql_with_io.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/sync_slave_sql_with_io.inc 2024-08-03 07:29:57.000000000 +0000 @@ -25,11 +25,8 @@ let $_slave_timeout= $slave_timeout; if (!$_slave_timeout) { - let $_slave_timeout= 300; - if ($VALGRIND_TEST) - { - let $_slave_timeout= 1500; - } + source include/slow_environ.inc; + let $_slave_timeout= 300$_timeout_adjustment; } --let $_master_log_file= query_get_value(SHOW SLAVE STATUS, Master_Log_File, 1) diff -Nru mariadb-10.11.6/mysql-test/include/sync_with_master_gtid.inc mariadb-10.11.9/mysql-test/include/sync_with_master_gtid.inc --- mariadb-10.11.6/mysql-test/include/sync_with_master_gtid.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/sync_with_master_gtid.inc 2024-08-03 07:29:57.000000000 +0000 @@ -33,11 +33,8 @@ let $_slave_timeout= $slave_timeout; if (!$_slave_timeout) { - let $_slave_timeout= 120; - if ($VALGRIND_TEST) - { - let $_slave_timeout= 1200; - } + source include/slow_environ.inc; + let $_slave_timeout= 120$_timeout_adjustment; } --let $_result= `SELECT master_gtid_wait('$master_pos', $_slave_timeout)` diff -Nru mariadb-10.11.6/mysql-test/include/wait_for_pattern_in_file.inc mariadb-10.11.9/mysql-test/include/wait_for_pattern_in_file.inc --- mariadb-10.11.6/mysql-test/include/wait_for_pattern_in_file.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/wait_for_pattern_in_file.inc 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,55 @@ +# ==== Purpose ==== +# +# Waits until pattern comes into log file or until a timeout is reached. +# This is a timeout wrapper for search_pattern_in_file.inc +# +# +# ==== Usage ==== +# +# [--let $timeout= NUMBER in seconds] +# For other parameters, check search_pattern_in_file.inc + +--let $wait_save_keep_include_silent=$keep_include_silent +--let $include_filename= wait_for_pattern_in_file.inc +--source include/begin_include_file.inc +--let $keep_include_silent= 1 + +let $_timeout= $timeout; +if (!$_timeout) +{ + let $_timeout= 10; + if ($VALGRIND_TEST) + { + let $_timeout= 30; + } +} + +let $_timeout_counter=`SELECT $_timeout * 10`; +let SEARCH_ABORT=NOT FOUND; +let $_continue= 1; +disable_abort_on_error; +while ($_continue) +{ + source include/search_pattern_in_file.inc; + if (!$errno) + { + # Found match + let $_continue= 0; + } + if ($errno) + { + dec $_timeout_counter; + if ($_timeout_counter == 1) + { + enable_abort_on_error; + } + if (!$_timeout_counter) + { + let $_continue= 0; + } + } +} +enable_abort_on_error; + +--source include/end_include_file.inc +--let $keep_include_silent=$wait_save_keep_include_silent diff -Nru mariadb-10.11.6/mysql-test/include/wait_for_slave_io_error.inc mariadb-10.11.9/mysql-test/include/wait_for_slave_io_error.inc --- mariadb-10.11.6/mysql-test/include/wait_for_slave_io_error.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/wait_for_slave_io_error.inc 2024-08-03 07:29:57.000000000 +0000 @@ -59,7 +59,7 @@ if ($slave_io_errno == '') { --echo !!!ERROR IN TEST: you must set \$slave_io_errno before you source - --echo !!!wait_for_slave_sql_error.inc. The error we got this time was '$_wfsie_errno', + --echo !!!wait_for_slave_io_error.inc. The error we got this time was '$_wfsie_errno', --echo !!!so you probably want to add the following line to your test case: --echo !!! --let \$slave_io_errno= $_wfsie_errno --die !!!ERROR IN TEST: you must set \$slave_io_errno before sourcing wait_for_slave_io_error.inc diff -Nru mariadb-10.11.6/mysql-test/include/wait_for_slave_io_to_stop.inc mariadb-10.11.9/mysql-test/include/wait_for_slave_io_to_stop.inc --- mariadb-10.11.6/mysql-test/include/wait_for_slave_io_to_stop.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/wait_for_slave_io_to_stop.inc 2024-08-03 07:29:57.000000000 +0000 @@ -21,6 +21,17 @@ # $slave_timeout # See include/wait_for_slave_param.inc. # +# $rpl_allow_error +# By default, this file fails if there is an error in the IO +# thread. However, if an error in the IO thread is possible and allowed, +# setting $rpl_allow_error=1 will prevent this file from failing if +# there is an error in the IO thread. +# (If an error is _always_ expected, a better alternative might be to +# use wait_for_slave_io_error.inc instead of this file). +# Note: This is currently always enabled, since a simple STOP SLAVE +# IO_THREAD can cause an error if it interrupts the slave's initial +# communication with the master (MDEV-32892). +# # $rpl_debug # See include/rpl_init.inc @@ -31,9 +42,15 @@ --let $slave_param= Slave_IO_Running --let $slave_param_value= No ---let $slave_error_param= Last_IO_Errno +--let $_io_stop_save_allow_error= $slave_error_param +# Disabled, as IO errors are left behind when a normal STOP SLAVE interrupts +# the initial communication between the IO thread and the master (MDEV-32892). +#if (!$rpl_allow_error) +#{ +# --let $slave_error_param= Last_IO_Errno +#} --source include/wait_for_slave_param.inc ---let $slave_error_param= +--let $slave_error_param= $_io_stop_save_allow_error --let $include_filename= wait_for_slave_io_to_stop.inc diff -Nru mariadb-10.11.6/mysql-test/include/wait_for_slave_param.inc mariadb-10.11.9/mysql-test/include/wait_for_slave_param.inc --- mariadb-10.11.6/mysql-test/include/wait_for_slave_param.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/wait_for_slave_param.inc 2024-08-03 07:29:57.000000000 +0000 @@ -35,7 +35,7 @@ # $slave_error_param # If set, this script will check if the column of the output from # SHOW SLAVE STATUS named $slave_error_param is nonzero. If it is, -# this script will faile immediately. Typically, this should be set +# this script will fail immediately. Typically, this should be set # to Last_IO_Errno or Last_SQL_Errno. # # $rpl_debug @@ -49,16 +49,8 @@ let $_slave_timeout= $slave_timeout; if (!$_slave_timeout) { - let $_slave_timeout= 300; - if ($VALGRIND_TEST) - { - let $_slave_timeout= 1500; - } -} - -if ($slave_error_param == '') -{ - --let $slave_error_param= 1 + source include/slow_environ.inc; + let $_slave_timeout= 300$_timeout_adjustment; } let $_slave_param_comparison= $slave_param_comparison; @@ -90,7 +82,7 @@ --let $_show_slave_status_value= query_get_value("SHOW SLAVE STATUS", $slave_param, 1) # Check if an error condition is reached. - if (!$slave_error_param) + if ($slave_error_param) { --let $_show_slave_status_error_value= query_get_value("SHOW SLAVE STATUS", $slave_error_param, 1) if ($_show_slave_status_error_value) diff -Nru mariadb-10.11.6/mysql-test/include/wait_for_slave_sql_to_stop.inc mariadb-10.11.9/mysql-test/include/wait_for_slave_sql_to_stop.inc --- mariadb-10.11.6/mysql-test/include/wait_for_slave_sql_to_stop.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/wait_for_slave_sql_to_stop.inc 2024-08-03 07:29:57.000000000 +0000 @@ -21,6 +21,14 @@ # $slave_timeout # See include/wait_for_slave_param.inc # +# $rpl_allow_error +# By default, this file fails if there is an error in the SQL +# thread. However, if an error in the SQL thread is possible and allowed, +# setting $rpl_allow_error=1 will prevent this file from failing if +# there is an error in the SQL thread. +# (If an error is _always_ expected, a better alternative might be to +# use wait_for_slave_sql_error.inc instead of this file). +# # $rpl_debug # See include/rpl_init.inc @@ -31,7 +39,10 @@ --let $slave_param= Slave_SQL_Running --let $slave_param_value= No ---let $slave_error_param= Last_SQL_Errno +if (!$rpl_allow_error) +{ + --let $slave_error_param= Last_SQL_Errno +} --source include/wait_for_slave_param.inc --let $slave_error_param= diff -Nru mariadb-10.11.6/mysql-test/include/wait_until_connected_again.inc mariadb-10.11.9/mysql-test/include/wait_until_connected_again.inc --- mariadb-10.11.6/mysql-test/include/wait_until_connected_again.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/include/wait_until_connected_again.inc 2024-08-03 07:29:57.000000000 +0000 @@ -11,7 +11,7 @@ let $mysql_errno= 9999; while ($mysql_errno) { - --error 0,ER_ACCESS_DENIED_ERROR,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,ER_LOCK_WAIT_TIMEOUT,2002,2006,2013,HA_ERR_NO_ENCRYPTION + --error 0,ER_ACCESS_DENIED_ERROR,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,ER_LOCK_WAIT_TIMEOUT,2002,2006,2013,HA_ERR_NO_ENCRYPTION,2026 select 1; dec $counter; diff -Nru mariadb-10.11.6/mysql-test/lib/My/Debugger.pm mariadb-10.11.9/mysql-test/lib/My/Debugger.pm --- mariadb-10.11.6/mysql-test/lib/My/Debugger.pm 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/lib/My/Debugger.pm 2024-08-03 07:29:57.000000000 +0000 @@ -263,6 +263,7 @@ $::opt_suite_timeout= 24 * 60; # in minutes $::opt_shutdown_timeout= ($interactive ? 24 * 60 : 3) * 60; # in seconds $::opt_start_timeout= $::opt_shutdown_timeout; # in seconds + $::opt_debug_sync_timeout= 3000; # in seconds } } diff -Nru mariadb-10.11.6/mysql-test/lib/My/Platform.pm mariadb-10.11.9/mysql-test/lib/My/Platform.pm --- mariadb-10.11.6/mysql-test/lib/My/Platform.pm 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/lib/My/Platform.pm 2024-08-03 07:29:57.000000000 +0000 @@ -23,7 +23,7 @@ use Carp; use base qw(Exporter); -our @EXPORT= qw(IS_CYGWIN IS_MSYS IS_WINDOWS IS_WIN32PERL IS_AIX +our @EXPORT= qw(IS_CYGWIN IS_MSYS IS_WINDOWS IS_WIN32PERL IS_AIX IS_MAC IS_FREEBSD native_path posix_path mixed_path check_socket_path_length process_alive open_for_append); @@ -70,6 +70,23 @@ } } +BEGIN { + if ($^O eq "darwin") { + eval 'sub IS_MAC { 1 }'; + } + else { + eval 'sub IS_MAC { 0 }'; + } +} + +BEGIN { + if ($^O eq "freebsd") { + eval 'sub IS_FREEBSD { 1 }'; + } + else { + eval 'sub IS_FREEBSD { 0 }'; + } +} # # native_path diff -Nru mariadb-10.11.6/mysql-test/lib/mtr_cases.pm mariadb-10.11.9/mysql-test/lib/mtr_cases.pm --- mariadb-10.11.6/mysql-test/lib/mtr_cases.pm 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/lib/mtr_cases.pm 2024-08-03 07:29:57.000000000 +0000 @@ -398,7 +398,8 @@ { my @dirs = my_find_dir(dirname($::glob_mysql_test_dir), ["mysql-test/suite", @plugin_suitedirs ], - $suitename); + $suitename, + $::opt_skip_not_found ? NOT_REQUIRED : undef); # # if $suitename contained wildcards, we'll have many suites and # their overlays here. Let's group them appropriately. @@ -892,6 +893,12 @@ } my @no_combs = grep { $test_combs{$_} == 1 } keys %test_combs; if (@no_combs) { + if ($::opt_skip_not_found) { + push @{$tinfo->{combinations}}, @no_combs; + $tinfo->{'skip'}= 1; + $tinfo->{'comment'}= "combination not found"; + return $tinfo; + } mtr_error("Could not run $name with '".( join(',', sort @no_combs))."' combination(s)"); } diff -Nru mariadb-10.11.6/mysql-test/lib/mtr_report.pm mariadb-10.11.9/mysql-test/lib/mtr_report.pm --- mariadb-10.11.6/mysql-test/lib/mtr_report.pm 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/lib/mtr_report.pm 2024-08-03 07:29:57.000000000 +0000 @@ -87,12 +87,16 @@ $out_line = ""; } +use if $^O eq "MSWin32", "threads::shared"; +my $flush_lock :shared; + # Print to stdout sub print_out { if(IS_WIN32PERL) { $out_line .= $_[0]; # Flush buffered output on new lines. if (rindex($_[0], "\n") != -1) { + lock($flush_lock); flush_out(); } } else { diff -Nru mariadb-10.11.6/mysql-test/main/alter_table.result mariadb-10.11.9/mysql-test/main/alter_table.result --- mariadb-10.11.6/mysql-test/main/alter_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/alter_table.result 2024-08-03 07:29:57.000000000 +0000 @@ -1999,8 +1999,7 @@ affected rows: 0 info: Records: 0 Duplicates: 0 Warnings: 0 ALTER TABLE tm1 DROP FOREIGN KEY fm1; -affected rows: 2 -info: Records: 2 Duplicates: 0 Warnings: 0 +ERROR 42000: Can't DROP FOREIGN KEY `fm1`; check that it exists ALTER TABLE ti1 RENAME TO ti3; affected rows: 0 ALTER TABLE tm1 RENAME TO tm3; @@ -3125,6 +3124,14 @@ DROP TEMPORARY TABLE t2; DROP TABLE t1; # +# MDEV-33313 Incorrect error message for "ALTER TABLE ... DROP CONSTRAINT ..., DROP col, DROP col" +# +create table t2(id int primary key) engine=innodb; +create table t1(id int primary key, t2_id int, constraint t1_fk_t2_id foreign key(t2_id) references t2(id)) engine=innodb; +alter table t1 drop constraint t1_fk_t2_id, drop t2_id, drop t2_id; +ERROR 42000: Can't DROP COLUMN `t2_id`; check that it exists +drop table t1, t2; +# # End of 10.6 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/alter_table.test mariadb-10.11.9/mysql-test/main/alter_table.test --- mariadb-10.11.6/mysql-test/main/alter_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/alter_table.test 2024-08-03 07:29:57.000000000 +0000 @@ -1696,6 +1696,7 @@ ALTER TABLE tm1 DROP PRIMARY KEY; ALTER TABLE ti1 DROP FOREIGN KEY fi1; +--error ER_CANT_DROP_FIELD_OR_KEY ALTER TABLE tm1 DROP FOREIGN KEY fm1; ALTER TABLE ti1 RENAME TO ti3; @@ -2406,6 +2407,15 @@ DROP TABLE t1; --echo # +--echo # MDEV-33313 Incorrect error message for "ALTER TABLE ... DROP CONSTRAINT ..., DROP col, DROP col" +--echo # +create table t2(id int primary key) engine=innodb; +create table t1(id int primary key, t2_id int, constraint t1_fk_t2_id foreign key(t2_id) references t2(id)) engine=innodb; +--error ER_CANT_DROP_FIELD_OR_KEY +alter table t1 drop constraint t1_fk_t2_id, drop t2_id, drop t2_id; +drop table t1, t2; + +--echo # --echo # End of 10.6 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/analyze_engine_stats2.opt mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.opt --- mariadb-10.11.6/mysql-test/main/analyze_engine_stats2.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.opt 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1 @@ +--innodb-buffer-pool-size=32M --innodb_buffer_pool_dump_at_shutdown=off --innodb_buffer_pool_load_at_startup=off --innodb-stats-persistent=1 --innodb-stats-auto-recalc=off diff -Nru mariadb-10.11.6/mysql-test/main/analyze_engine_stats2.result mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.result --- mariadb-10.11.6/mysql-test/main/analyze_engine_stats2.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,32 @@ +# +# MDEV-34125: ANALYZE FORMAT=JSON: r_engine_stats.pages_read_time_ms has wrong scale +# +create table t1 ( +a varchar(255), +b varchar(255), +c varchar(255), +d varchar(255), +primary key(a,b,c,d) +) engine=innodb; +SET unique_checks=0, foreign_key_checks= 0; +begin; +insert into t1 select +repeat(uuid(), 7), +repeat(uuid(), 7), +repeat(uuid(), 7), +repeat(uuid(), 7) +from seq_1_to_16384; +commit; +SET GLOBAL innodb_fast_shutdown=0; +# restart +set log_slow_verbosity='engine'; +set long_query_time=0.0; +set @js='$analyze_output'; +set @pages_read_time_ms= +(select json_value(@js,'$.query_block.nested_loop[0].table.r_engine_stats.pages_read_time_ms')); + + + OK: pages_read_time is same in slow log and ANALYZE + +set long_query_time=default; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/analyze_engine_stats2.test mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.test --- mariadb-10.11.6/mysql-test/main/analyze_engine_stats2.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/analyze_engine_stats2.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,74 @@ +# +# r_engine_stats tests that require slow query log. +# +--source include/analyze-format.inc +--source include/have_sequence.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-34125: ANALYZE FORMAT=JSON: r_engine_stats.pages_read_time_ms has wrong scale +--echo # + +# Each row is 1K. +create table t1 ( + a varchar(255), + b varchar(255), + c varchar(255), + d varchar(255), + primary key(a,b,c,d) +) engine=innodb; + +SET unique_checks=0, foreign_key_checks= 0; +begin; + +# The data size is 160K * 1K = 160M +# 16M / (page_size=16K) = 1K pages. +insert into t1 select + repeat(uuid(), 7), + repeat(uuid(), 7), + repeat(uuid(), 7), + repeat(uuid(), 7) +from seq_1_to_16384; +commit; + +SET GLOBAL innodb_fast_shutdown=0; +source include/restart_mysqld.inc; +set log_slow_verbosity='engine'; +set long_query_time=0.0; + +let $analyze_output= `analyze format=json +select * from t1 force index (PRIMARY) order by a desc, b desc, c desc, d desc`; +evalp set @js='$analyze_output'; + +set @pages_read_time_ms= + (select json_value(@js,'$.query_block.nested_loop[0].table.r_engine_stats.pages_read_time_ms')); + +let ANALYZE_PAGES=`select @pages_read_time_ms`; +let SLOW_LOG_FILE= `select @@slow_query_log_file`; + +perl; + my $slow_log_file= $ENV{'SLOW_LOG_FILE'} or die "SLOW_LOG_FILE not set"; + my $analyze_pages=$ENV{'ANALYZE_PAGES'}; + open(FILE, $slow_log_file) or die "Failed to open $slow_log_file"; + # We didn't run any queries touching a storage engine after the query of + # interest, so we will be fine here if we just get the last occurrence of + # Pages_read_time: NNNN in the file + while() { + $slow_log_pages=$1 if (/Pages_read_time: ([0-9.]+)/); + } + close(FILE); + + if ( $slow_log_pages > $analyze_pages * 0.95 && + $slow_log_pages < $analyze_pages * 1.05) { + print "\n\n OK: pages_read_time is same in slow log and ANALYZE\n\n"; + } else { + print "\n\n FAIL: $slow_log_pages not equal to $analyze_pages\n"; + } + +EOF + + +set long_query_time=default; +drop table t1; + + diff -Nru mariadb-10.11.6/mysql-test/main/analyze_format_json.result mariadb-10.11.9/mysql-test/main/analyze_format_json.result --- mariadb-10.11.6/mysql-test/main/analyze_format_json.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/analyze_format_json.result 2024-08-03 07:29:57.000000000 +0000 @@ -817,26 +817,30 @@ ], "subqueries": [ { - "query_block": { - "select_id": 2, - "r_loops": 1, - "r_total_time_ms": "REPLACED", - "nested_loop": [ - { - "table": { - "table_name": "t1", - "access_type": "ALL", - "r_loops": 1, - "rows": 2, - "r_rows": 2, - "r_table_time_ms": "REPLACED", - "r_other_time_ms": "REPLACED", - "r_engine_stats": REPLACED, - "filtered": 100, - "r_filtered": 100 + "materialization": { + "r_strategy": "index_lookup", + "r_loops": 2, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } } - } - ] + ] + } } } ] diff -Nru mariadb-10.11.6/mysql-test/main/analyze_stmt_prefetch_count.opt mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.opt --- mariadb-10.11.6/mysql-test/main/analyze_stmt_prefetch_count.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.opt 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1 @@ +--innodb-buffer-pool-size=32M --innodb_buffer_pool_dump_at_shutdown=off --innodb_buffer_pool_load_at_startup=off --innodb-stats-persistent=1 --innodb-stats-auto-recalc=off diff -Nru mariadb-10.11.6/mysql-test/main/analyze_stmt_prefetch_count.result mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.result --- mariadb-10.11.6/mysql-test/main/analyze_stmt_prefetch_count.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,60 @@ +create table t1 ( +a varchar(255), +b varchar(255), +c varchar(255), +d varchar(255), +primary key(a,b,c,d) +) engine=innodb; +SET unique_checks=0, foreign_key_checks= 0; +begin; +insert into t1 select +repeat(uuid(), 7), +repeat(uuid(), 7), +repeat(uuid(), 7), +repeat(uuid(), 7) +from seq_1_to_16384; +insert into t1 values ('z','z','z','z'); +commit; +# Restart the server to make sure we have an empty InnoDB Buffer Pool +# (in the test's .opt file we've disabled buffer pool saving/loading +# and also tried to disable any background activity) +SET GLOBAL innodb_fast_shutdown=0; +# restart +set @innodb_pages_read0= +(select variable_value +from information_schema.session_status +where variable_name like 'innodb_pages_read'); +set @js='$analyze_output'; +set @js=json_extract(@js, '$.query_block.nested_loop[0].table.r_engine_stats'); +set @pages_accessed= cast(json_value(@js,'$.pages_accessed') as INT); +set @pages_read_count= cast(json_value(@js,'$.pages_read_count') as INT); +set @pages_prefetch_read_count= cast(json_value(@js,'$.pages_prefetch_read_count') as INT); +select @pages_accessed > 1000 and @pages_accessed < 1500; +@pages_accessed > 1000 and @pages_accessed < 1500 +1 +set @total_read = (@pages_read_count + @pages_prefetch_read_count); +select @pages_accessed*0.75 < @total_read, @total_read < @pages_accessed*1.25; +@pages_accessed*0.75 < @total_read @total_read < @pages_accessed*1.25 +1 1 +set @innodb_pages_read1= +(select variable_value +from information_schema.session_status +where variable_name like 'innodb_pages_read'); +set @innodb_pages_read_incr= (@innodb_pages_read1 - @innodb_pages_read0); +select @innodb_pages_read_incr > 1000, @innodb_pages_read_incr < 1500; +@innodb_pages_read_incr > 1000 @innodb_pages_read_incr < 1500 +1 1 +set @js='$analyze_output'; +set @js=json_extract(@js, '$.query_block.nested_loop[0].table.r_engine_stats'); +# This must just print pages_accessed. No page reads or prefetch reads, +# because the previous query has read all the needed pages into the +# buffer pool, which is set to be large enough to accomodate the whole +# table. +select @js; +@js +{"pages_accessed": NUMBER} +set @pages_accessed2= cast(json_value(@js,'$.pages_accessed') as INT); +select @pages_accessed2 = @pages_accessed; +@pages_accessed2 = @pages_accessed +1 +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/analyze_stmt_prefetch_count.test mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.test --- mariadb-10.11.6/mysql-test/main/analyze_stmt_prefetch_count.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/analyze_stmt_prefetch_count.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,77 @@ +--source include/have_innodb.inc +--source include/have_sequence.inc + + +# Each row is 1K. +create table t1 ( + a varchar(255), + b varchar(255), + c varchar(255), + d varchar(255), + primary key(a,b,c,d) +) engine=innodb; + +# The data size is 16K * 1K = 16M +# 16M / (page_size=16K) = 1K pages. +SET unique_checks=0, foreign_key_checks= 0; +begin; +insert into t1 select + repeat(uuid(), 7), + repeat(uuid(), 7), + repeat(uuid(), 7), + repeat(uuid(), 7) +from seq_1_to_16384; +insert into t1 values ('z','z','z','z'); +commit; + +--echo # Restart the server to make sure we have an empty InnoDB Buffer Pool +--echo # (in the test's .opt file we've disabled buffer pool saving/loading +--echo # and also tried to disable any background activity) +SET GLOBAL innodb_fast_shutdown=0; +--source include/restart_mysqld.inc + +set @innodb_pages_read0= + (select variable_value + from information_schema.session_status + where variable_name like 'innodb_pages_read'); + +let $analyze_output= `analyze format=json +select * from t1 force index (PRIMARY) order by a,b,c,d`; +evalp set @js='$analyze_output'; + +set @js=json_extract(@js, '$.query_block.nested_loop[0].table.r_engine_stats'); +#select @js; +set @pages_accessed= cast(json_value(@js,'$.pages_accessed') as INT); +set @pages_read_count= cast(json_value(@js,'$.pages_read_count') as INT); +set @pages_prefetch_read_count= cast(json_value(@js,'$.pages_prefetch_read_count') as INT); + +select @pages_accessed > 1000 and @pages_accessed < 1500; + +set @total_read = (@pages_read_count + @pages_prefetch_read_count); + +select @pages_accessed*0.75 < @total_read, @total_read < @pages_accessed*1.25; + +set @innodb_pages_read1= + (select variable_value + from information_schema.session_status + where variable_name like 'innodb_pages_read'); + +set @innodb_pages_read_incr= (@innodb_pages_read1 - @innodb_pages_read0); + +select @innodb_pages_read_incr > 1000, @innodb_pages_read_incr < 1500; + +let $analyze_output= `analyze format=json +select * from t1 force index (PRIMARY) order by a,b,c,d`; +evalp set @js='$analyze_output'; +set @js=json_extract(@js, '$.query_block.nested_loop[0].table.r_engine_stats'); + +--echo # This must just print pages_accessed. No page reads or prefetch reads, +--echo # because the previous query has read all the needed pages into the +--echo # buffer pool, which is set to be large enough to accomodate the whole +--echo # table. +--replace_regex /[0-9]+/NUMBER/ +select @js; +set @pages_accessed2= cast(json_value(@js,'$.pages_accessed') as INT); + +select @pages_accessed2 = @pages_accessed; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/backup_interaction.result mariadb-10.11.9/mysql-test/main/backup_interaction.result --- mariadb-10.11.6/mysql-test/main/backup_interaction.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_interaction.result 2024-08-03 07:29:57.000000000 +0000 @@ -95,7 +95,7 @@ # # BACKUP STAGE performs implicit commits # -create table t1(a int) engine=InnoDB; +create table t1(a int) stats_persistent=0, engine=InnoDB; begin; insert into t1 values(1); select lock_mode from information_schema.metadata_lock_info where thread_id>0; @@ -197,8 +197,9 @@ # CHECK: RO transaction under BACKUP STAGE is a potential deadlock # OTOH we most probably allow them under FTWRL as well # -CREATE TABLE t1 (col1 INT) ENGINE = InnoDB; +CREATE TABLE t1 (col1 INT)stats_persistent=0, ENGINE = InnoDB; insert into t1 values (1); +InnoDB 0 transactions not purged backup stage start; backup stage block_commit; begin; diff -Nru mariadb-10.11.6/mysql-test/main/backup_interaction.test mariadb-10.11.9/mysql-test/main/backup_interaction.test --- mariadb-10.11.6/mysql-test/main/backup_interaction.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_interaction.test 2024-08-03 07:29:57.000000000 +0000 @@ -120,7 +120,7 @@ --echo # BACKUP STAGE performs implicit commits --echo # --disable_view_protocol -create table t1(a int) engine=InnoDB; +create table t1(a int) stats_persistent=0, engine=InnoDB; begin; insert into t1 values(1); select lock_mode from information_schema.metadata_lock_info where thread_id>0; @@ -221,8 +221,9 @@ --echo # OTOH we most probably allow them under FTWRL as well --echo # --disable_view_protocol -CREATE TABLE t1 (col1 INT) ENGINE = InnoDB; +CREATE TABLE t1 (col1 INT)stats_persistent=0, ENGINE = InnoDB; insert into t1 values (1); +--source ../suite/innodb/include/wait_all_purged.inc backup stage start; backup stage block_commit; begin; diff -Nru mariadb-10.11.6/mysql-test/main/backup_lock.result mariadb-10.11.9/mysql-test/main/backup_lock.result --- mariadb-10.11.6/mysql-test/main/backup_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_lock.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,7 @@ # # Testing which locks we get from all stages # +InnoDB 0 transactions not purged BACKUP STAGE START; SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info WHERE TABLE_NAME NOT LIKE 'innodb_%_stats'; @@ -34,7 +35,8 @@ # # testing if BACKUP STAGE FLUSH causes deadlocks with ALTER TABLE # -create table t1 (a int) engine=innodb; +create table t1 (a int) stats_persistent= 0, engine=innodb; +InnoDB 0 transactions not purged connection con2; backup stage start; connection default; @@ -104,7 +106,8 @@ # # testing if BACKUP STAGE FLUSH causes deadlocks with DROP TABLE # -create table t1 (a int) engine=innodb; +create table t1 (a int)stats_persistent=0, engine=innodb; +InnoDB 0 transactions not purged start transaction; insert into t1 values (1); connection con1; @@ -132,6 +135,7 @@ # Check if backup stage block_dll + concurrent drop table blocks select # create table t1 (a int) engine=innodb; +InnoDB 0 transactions not purged backup stage start; backup stage block_ddl; connection con1; diff -Nru mariadb-10.11.6/mysql-test/main/backup_lock.test mariadb-10.11.9/mysql-test/main/backup_lock.test --- mariadb-10.11.6/mysql-test/main/backup_lock.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_lock.test 2024-08-03 07:29:57.000000000 +0000 @@ -15,6 +15,8 @@ let $mdl= LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info WHERE TABLE_NAME NOT LIKE 'innodb_%_stats'; +--source ../suite/innodb/include/wait_all_purged.inc + BACKUP STAGE START; eval SELECT $mdl; BACKUP STAGE FLUSH; @@ -39,7 +41,8 @@ --echo # testing if BACKUP STAGE FLUSH causes deadlocks with ALTER TABLE --echo # -create table t1 (a int) engine=innodb; +create table t1 (a int) stats_persistent= 0, engine=innodb; +--source ../suite/innodb/include/wait_all_purged.inc connection con2; backup stage start; @@ -129,7 +132,8 @@ --echo # testing if BACKUP STAGE FLUSH causes deadlocks with DROP TABLE --echo # -create table t1 (a int) engine=innodb; +create table t1 (a int)stats_persistent=0, engine=innodb; +--source ../suite/innodb/include/wait_all_purged.inc start transaction; # Acquires MDL lock insert into t1 values (1); @@ -165,6 +169,7 @@ --echo # create table t1 (a int) engine=innodb; +--source ../suite/innodb/include/wait_all_purged.inc backup stage start; backup stage block_ddl; connection con1; diff -Nru mariadb-10.11.6/mysql-test/main/backup_locks.result mariadb-10.11.9/mysql-test/main/backup_locks.result --- mariadb-10.11.6/mysql-test/main/backup_locks.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_locks.result 2024-08-03 07:29:57.000000000 +0000 @@ -23,7 +23,7 @@ # connect con1,localhost,root,,; connection default; -create table t1 (a int) engine=innodb; +create table t1 (a int) stats_persistent=0,engine=innodb; insert into t1 values (1); backup lock t1; select * from t1; @@ -184,5 +184,82 @@ BACKUP UNLOCK; DROP TABLE t3; # +# MDEV-28367: BACKUP LOCKS on table to be accessible to those +# with database LOCK TABLES privileges +# +create database db1; +create table db1.t1(t int); +create user user1@localhost; +select user,host from mysql.user where user='user1'; +User Host +user1 localhost +connect(localhost,user1,,db1,MASTER_PORT,MASTER_SOCKET); +connect con1, localhost, user1, ,db1; +ERROR 42000: Access denied for user 'user1'@'localhost' to database 'db1' +grant reload on *.* to user1@localhost; +grant select on db1.* to user1@localhost; +show grants for user1@localhost; +Grants for user1@localhost +GRANT RELOAD ON *.* TO `user1`@`localhost` +GRANT SELECT ON `db1`.* TO `user1`@`localhost` +connect con1, localhost, user1, ,db1; +BACKUP UNLOCK; +BACKUP LOCK db1.t1; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_SHARED_HIGH_PRIO Table metadata lock db1 t1 +BACKUP UNLOCK; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +connection default; +disconnect con1; +grant lock tables on db1.* to user1@localhost; +show grants for user1@localhost; +Grants for user1@localhost +GRANT RELOAD ON *.* TO `user1`@`localhost` +GRANT SELECT, LOCK TABLES ON `db1`.* TO `user1`@`localhost` +connect con1, localhost, user1, ,db1; +BACKUP UNLOCK; +BACKUP LOCK db1.t1; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_SHARED_HIGH_PRIO Table metadata lock db1 t1 +BACKUP UNLOCK; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +connection default; +disconnect con1; +revoke reload on *.* from user1@localhost; +show grants for user1@localhost; +Grants for user1@localhost +GRANT USAGE ON *.* TO `user1`@`localhost` +GRANT SELECT, LOCK TABLES ON `db1`.* TO `user1`@`localhost` +connect con1, localhost, user1, ,db1; +BACKUP UNLOCK; +ERROR 42000: Access denied; you need (at least one of) the RELOAD, LOCK TABLES privilege(s) for this operation +BACKUP LOCK db1.t1; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_SHARED_HIGH_PRIO Table metadata lock db1 t1 +BACKUP UNLOCK; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +connection default; +disconnect con1; +revoke lock tables on db1.* from user1@localhost; +show grants for user1@localhost; +Grants for user1@localhost +GRANT USAGE ON *.* TO `user1`@`localhost` +GRANT SELECT ON `db1`.* TO `user1`@`localhost` +connect con1, localhost, user1, ,db1; +BACKUP LOCK db1.t1; +ERROR 42000: Access denied; you need (at least one of) the RELOAD, LOCK TABLES privilege(s) for this operation +BACKUP UNLOCK; +ERROR 42000: Access denied; you need (at least one of) the RELOAD, LOCK TABLES privilege(s) for this operation +connection default; +disconnect con1; +drop database db1; +drop user user1@localhost; +# # End of MariaDB 10.4 tests # diff -Nru mariadb-10.11.6/mysql-test/main/backup_locks.test mariadb-10.11.9/mysql-test/main/backup_locks.test --- mariadb-10.11.6/mysql-test/main/backup_locks.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_locks.test 2024-08-03 07:29:57.000000000 +0000 @@ -29,7 +29,7 @@ connect (con1,localhost,root,,); connection default; -create table t1 (a int) engine=innodb; +create table t1 (a int) stats_persistent=0,engine=innodb; insert into t1 values (1); backup lock t1; select * from t1; @@ -214,7 +214,78 @@ DROP TABLE t3; BACKUP UNLOCK; DROP TABLE t3; +--echo # +--echo # MDEV-28367: BACKUP LOCKS on table to be accessible to those +--echo # with database LOCK TABLES privileges +--echo # + +--source include/have_metadata_lock_info.inc +create database db1; +create table db1.t1(t int); +create user user1@localhost; +select user,host from mysql.user where user='user1'; +--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT +--error ER_DBACCESS_DENIED_ERROR +--connect (con1, localhost, user1, ,db1) + +grant reload on *.* to user1@localhost; +# To access DB one need select privileges +grant select on db1.* to user1@localhost; +show grants for user1@localhost; +--connect (con1, localhost, user1, ,db1) + +# This should work we have RELOAD privilege +BACKUP UNLOCK; +BACKUP LOCK db1.t1; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +BACKUP UNLOCK; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; + +# Add LOCK TABLES DB privileges (all privileges for BACKUP LOCK are there) +connection default; +disconnect con1; +grant lock tables on db1.* to user1@localhost; +show grants for user1@localhost; +--connect (con1, localhost, user1, ,db1) +# This should work we have RELOAD & LOCK privilege +BACKUP UNLOCK; +BACKUP LOCK db1.t1; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +BACKUP UNLOCK; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; + +# Remove reload privilege, leave only LOCK TABLES privilege +connection default; +disconnect con1; +revoke reload on *.* from user1@localhost; +show grants for user1@localhost; +--connect (con1, localhost, user1, ,db1) +# There is no reload priv needed for unlock and there is no mdl_backup_lock taken +--error ER_SPECIFIC_ACCESS_DENIED_ERROR +BACKUP UNLOCK; +# BACKUP LOCK should work, since we have LOCK privilege +BACKUP LOCK db1.t1; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; +# This works since there was taken mdl_backup_lock before +BACKUP UNLOCK; +SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%"; + +# Remove LOCK TABLES privilege +connection default; +disconnect con1; +revoke lock tables on db1.* from user1@localhost; +show grants for user1@localhost; +--connect (con1, localhost, user1, ,db1) +--error ER_SPECIFIC_ACCESS_DENIED_ERROR +BACKUP LOCK db1.t1; +--error ER_SPECIFIC_ACCESS_DENIED_ERROR +BACKUP UNLOCK; + +connection default; +disconnect con1; +drop database db1; +drop user user1@localhost; --echo # --echo # End of MariaDB 10.4 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/backup_stages.result mariadb-10.11.9/mysql-test/main/backup_stages.result --- mariadb-10.11.6/mysql-test/main/backup_stages.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_stages.result 2024-08-03 07:29:57.000000000 +0000 @@ -17,6 +17,7 @@ ID USER COMMAND STATE INFO STAGE MAX_STAGE INFO_BINARY root Query Waiting for backup lock BACKUP STAGE START 0 0 BACKUP STAGE START BACKUP STAGE END; +InnoDB 0 transactions not purged connection con1; # The connection default has removed the backup lock. # And so the current connection con1 can reap for its BACKUP STAGE START diff -Nru mariadb-10.11.6/mysql-test/main/backup_stages.test mariadb-10.11.9/mysql-test/main/backup_stages.test --- mariadb-10.11.6/mysql-test/main/backup_stages.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/backup_stages.test 2024-08-03 07:29:57.000000000 +0000 @@ -50,6 +50,7 @@ # con1 uses @@global.lock_wait_timeout BACKUP STAGE END; +--source ../suite/innodb/include/wait_all_purged.inc --connection con1 --echo # The connection default has removed the backup lock. diff -Nru mariadb-10.11.6/mysql-test/main/bad_startup_options_debug.result mariadb-10.11.9/mysql-test/main/bad_startup_options_debug.result --- mariadb-10.11.6/mysql-test/main/bad_startup_options_debug.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/bad_startup_options_debug.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,7 @@ +# +# MDEV-34437 SIGSEGV in vio_get_normalized_ip when using extra-port +# +FOUND 1 /\[ERROR\] Can't create IP socket: Servname not supported/ in errorlog.err +FOUND 1 /\[ERROR\] Can't create IP socket: Servname not supported/ in errorlog.err +# restart +# End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/main/bad_startup_options_debug.test mariadb-10.11.9/mysql-test/main/bad_startup_options_debug.test --- mariadb-10.11.6/mysql-test/main/bad_startup_options_debug.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/bad_startup_options_debug.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,34 @@ +# mysqld refuses to run as root normally. +--source include/not_as_root.inc +--source include/have_debug.inc +--source include/not_embedded.inc +--source include/linux.inc + +--source include/shutdown_mysqld.inc + +# Try to start the server, with bad values for some options. +# Make sure, the starts fails, and expected message is in the error log + +--let errorlog=$MYSQL_TMP_DIR/errorlog.err +--let SEARCH_FILE=$errorlog + +--echo # +--echo # MDEV-34437 SIGSEGV in vio_get_normalized_ip when using extra-port +--echo # + +# getaddrinfo failure by fixing port to invalid value +--error 1 +--exec $MYSQLD --defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --debug='d,sabotage_port_number' --log-error=$errorlog +--let SEARCH_PATTERN=\[ERROR\] Can't create IP socket: Servname not supported +--source include/search_pattern_in_file.inc +--remove_file $SEARCH_FILE + +--error 1 +--exec $MYSQLD --defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --debug='d,sabotage_port_number' --bind-address=0.0.0.0 --log-error=$errorlog +--let SEARCH_PATTERN=\[ERROR\] Can't create IP socket: Servname not supported +--source include/search_pattern_in_file.inc +--remove_file $SEARCH_FILE + +--source include/start_mysqld.inc + +--echo # End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/main/bootstrap.test mariadb-10.11.9/mysql-test/main/bootstrap.test --- mariadb-10.11.6/mysql-test/main/bootstrap.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/bootstrap.test 2024-08-03 07:29:57.000000000 +0000 @@ -74,7 +74,7 @@ --echo # MDEV-13063 Server crashes in intern_plugin_lock or assertion `plugin_ptr->ref_count == 1' fails in plugin_init --echo # --error 1 ---exec $MYSQLD_BOOTSTRAP_CMD --myisam_recover_options=NONE +--exec $MYSQLD_BOOTSTRAP_CMD --myisam_recover_options=NONE 2>/dev/null --echo # --echo # MDEV-19349 mysql_install_db: segfault at tmp_file_prefix check diff -Nru mariadb-10.11.6/mysql-test/main/cast.result mariadb-10.11.9/mysql-test/main/cast.result --- mariadb-10.11.6/mysql-test/main/cast.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/cast.result 2024-08-03 07:29:57.000000000 +0000 @@ -814,7 +814,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, - `b` char(5) GENERATED ALWAYS AS (cast('a' as char(10) charset latin1) + `a`) VIRTUAL + `b` char(5) GENERATED ALWAYS AS (cast('a' as char(10) charset latin1 binary) + `a`) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; select collation(cast("a" as char(10) binary)); diff -Nru mariadb-10.11.6/mysql-test/main/cast.test mariadb-10.11.9/mysql-test/main/cast.test --- mariadb-10.11.6/mysql-test/main/cast.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/cast.test 2024-08-03 07:29:57.000000000 +0000 @@ -158,10 +158,9 @@ # set names binary; select cast(_latin1'test' as char character set latin2); -#enable after MDEV-32461 fix ---disable_view_protocol +--disable_service_connection select cast(_koi8r'ÔÅÓÔ' as char character set cp1251); ---enable_view_protocol +--enable_service_connection create table t1 select cast(_koi8r'ÔÅÓÔ' as char character set cp1251) as t; show create table t1; drop table t1; @@ -169,8 +168,7 @@ # # CAST to CHAR with/without length # -#enable after MDEV-32461 fix ---disable_view_protocol +--disable_service_connection select cast(_latin1'ab' AS char) as c1, cast(_latin1'a ' AS char) as c2, @@ -178,7 +176,7 @@ cast(_latin1'a ' AS char(2)) as c4, hex(cast(_latin1'a' AS char(2))) as c5; select cast(1000 as CHAR(3)); ---enable_view_protocol +--enable_service_connection SET STATEMENT sql_mode = 'NO_ENGINE_SUBSTITUTION' FOR create table t1 select @@ -239,15 +237,14 @@ # CREATE TABLE t1 (a enum ('aac','aab','aaa') not null); INSERT INTO t1 VALUES ('aaa'),('aab'),('aac'); -#enable after MDEV-32461 fix ---disable_view_protocol +--disable_service_connection # these two should be in enum order SELECT a, CAST(a AS CHAR) FROM t1 ORDER BY CAST(a AS UNSIGNED) ; SELECT a, CAST(a AS CHAR(3)) FROM t1 ORDER BY CAST(a AS CHAR(2)), a; # these two should be in alphabetic order SELECT a, CAST(a AS UNSIGNED) FROM t1 ORDER BY CAST(a AS CHAR) ; SELECT a, CAST(a AS CHAR(2)) FROM t1 ORDER BY CAST(a AS CHAR(3)), a; ---enable_view_protocol +--enable_service_connection DROP TABLE t1; # @@ -349,12 +346,11 @@ # Bug #17903: cast to char results in binary # set names latin1; -#enable after MDEV-32461 fix ---disable_view_protocol +--disable_service_connection select hex(cast('a' as char(2) binary)); select hex(cast('a' as binary(2))); select hex(cast('a' as char(2) binary)); ---enable_view_protocol +--enable_service_connection # # Bug#29898: Item_date_typecast::val_int doesn't reset the null_value flag. @@ -484,14 +480,13 @@ # # CAST (... BINARY) # -#enable after MDEV-32461 fix ---disable_view_protocol +--disable_service_connection select collation(cast("a" as char(10) binary)); select collation(cast("a" as char(10) charset utf8 binary)); select collation(cast("a" as char(10) ascii binary)); select collation(cast("a" as char(10) binary charset utf8)); select collation(cast("a" as char(10) binary ascii)); ---enable_view_protocol +--enable_service_connection --echo # --echo # MDEV-11030 Assertion `precision > 0' failed in decimal_bin_size @@ -773,10 +768,7 @@ SELECT * FROM t1; DROP TABLE t1; -#enable after MDEV-32461 fix ---disable_view_protocol SELECT CAST(-1e0 AS UNSIGNED); ---enable_view_protocol CREATE TABLE t1 (a BIGINT UNSIGNED); INSERT INTO t1 VALUES (-1e0); SELECT * FROM t1; diff -Nru mariadb-10.11.6/mysql-test/main/change_user.result mariadb-10.11.9/mysql-test/main/change_user.result --- mariadb-10.11.6/mysql-test/main/change_user.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/change_user.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,6 @@ set global secure_auth=0; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release create user test_nopw; grant select on test.* to test_nopw; create user test_oldpw identified by password "09301740536db389"; @@ -90,6 +92,8 @@ FLUSH STATUS; Value of com_select did not change set global secure_auth=default; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release set timestamp=unix_timestamp('2010-10-10 10:10:10'); select now(); now() diff -Nru mariadb-10.11.6/mysql-test/main/column_compression.result mariadb-10.11.9/mysql-test/main/column_compression.result --- mariadb-10.11.6/mysql-test/main/column_compression.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/column_compression.result 2024-08-03 07:29:57.000000000 +0000 @@ -8,7 +8,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); @@ -44,7 +44,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -61,7 +61,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t2; # Make sure implicit CREATE TABLE ... SELECT inherits compression @@ -69,7 +69,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t2; LEFT(a, 10) LENGTH(a) @@ -105,7 +105,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -223,7 +223,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); @@ -259,7 +259,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -276,7 +276,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t2; # Make sure implicit CREATE TABLE ... SELECT inherits compression @@ -284,7 +284,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t2; LEFT(a, 10) LENGTH(a) @@ -320,7 +320,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -438,7 +438,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varbinary(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varbinary(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); @@ -474,7 +474,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varbinary(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varbinary(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -491,7 +491,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` varbinary(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varbinary(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t2; # Make sure implicit CREATE TABLE ... SELECT inherits compression @@ -499,7 +499,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` varbinary(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varbinary(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t2; LEFT(a, 10) LENGTH(a) @@ -535,7 +535,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varbinary(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varbinary(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -653,7 +653,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); @@ -689,7 +689,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -706,7 +706,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` varchar(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t2; # Make sure implicit CREATE TABLE ... SELECT inherits compression @@ -714,7 +714,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` varchar(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t2; LEFT(a, 10) LENGTH(a) @@ -750,7 +750,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10000) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10000) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -868,7 +868,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); @@ -904,7 +904,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -921,7 +921,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t2; # Make sure implicit CREATE TABLE ... SELECT inherits compression @@ -929,7 +929,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t2; LEFT(a, 10) LENGTH(a) @@ -965,7 +965,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -1084,7 +1084,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); @@ -1120,7 +1120,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -1137,7 +1137,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t2; # Make sure implicit CREATE TABLE ... SELECT inherits compression @@ -1145,7 +1145,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t2; LEFT(a, 10) LENGTH(a) @@ -1181,7 +1181,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT LEFT(a, 10), LENGTH(a) FROM t1; LEFT(a, 10) LENGTH(a) @@ -1323,7 +1323,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ NOT NULL DEFAULT '' + `a` blob /*M!100301 COMPRESSED*/ NOT NULL DEFAULT '' ) ENGINE=CSV DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" DROP TABLE t1; @@ -1373,7 +1373,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(255) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(255) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SET column_compression_threshold=300; INSERT INTO t1 VALUES(REPEAT('a', 255)); @@ -1483,12 +1483,12 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(1000) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + `a` varchar(1000) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; COLUMN_TYPE -varchar(1000) /*!100301 COMPRESSED*/ +varchar(1000) /*M!100301 COMPRESSED*/ DROP TABLE t1; # # MDEV-17363 - Compressed columns cannot be restored from dump @@ -1507,10 +1507,10 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`a`)), - `b` varchar(1000) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, - `c` varchar(1000) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL, - `d` tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`a`)), + `b` varchar(1000) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, + `c` varchar(1000) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL, + `d` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1524,49 +1524,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varbinary(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1577,35 +1577,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varbinary(10) /*!100301 COMPRESSED*/ DEFAULT '' + `a` varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT '' + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1617,7 +1617,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) ASCII COMPRESSED); @@ -1626,7 +1626,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) BYTE COMPRESSED); @@ -1635,7 +1635,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varbinary(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1675,49 +1675,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1728,35 +1728,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ DEFAULT '' + `a` tinytext /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1768,7 +1768,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT ASCII COMPRESSED); @@ -1777,7 +1777,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinytext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinytext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT BYTE COMPRESSED); @@ -1786,7 +1786,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1826,49 +1826,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1879,35 +1879,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT '' + `a` blob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT '' + `a` text /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1919,7 +1919,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT ASCII COMPRESSED); @@ -1928,7 +1928,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` text /*!100301 COMPRESSED*/ DEFAULT NULL + `a` text /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TEXT BYTE COMPRESSED); @@ -1937,7 +1937,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -1977,49 +1977,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2030,35 +2030,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ DEFAULT '' + `a` mediumtext /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2070,7 +2070,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT ASCII COMPRESSED); @@ -2079,7 +2079,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumtext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT BYTE COMPRESSED); @@ -2088,7 +2088,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2128,49 +2128,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2181,35 +2181,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ DEFAULT '' + `a` longtext /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2221,7 +2221,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT ASCII COMPRESSED); @@ -2230,7 +2230,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longtext /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT BYTE COMPRESSED); @@ -2239,7 +2239,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2281,7 +2281,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2292,21 +2292,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT '' + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + `a` varchar(10) /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2318,7 +2318,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT '' + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) NULL COMPRESSED); @@ -2327,7 +2327,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2356,7 +2356,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2367,21 +2367,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYBLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYBLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + `a` tinyblob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2393,7 +2393,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a TINYBLOB NULL COMPRESSED); @@ -2402,7 +2402,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2431,7 +2431,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2442,21 +2442,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT '' + `a` blob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a BLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a BLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + `a` blob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2468,7 +2468,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT '' + `a` blob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a BLOB NULL COMPRESSED); @@ -2477,7 +2477,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` blob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2506,7 +2506,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2517,21 +2517,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMBLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMBLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + `a` mediumblob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2543,7 +2543,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a MEDIUMBLOB NULL COMPRESSED); @@ -2552,7 +2552,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2581,7 +2581,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2592,21 +2592,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGBLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGBLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + `a` longblob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2618,7 +2618,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT '' + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a LONGBLOB NULL COMPRESSED); @@ -2627,7 +2627,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` longblob /*!100301 COMPRESSED*/ DEFAULT NULL + `a` longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; # @@ -2656,7 +2656,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + `a` varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED BINARY COMPRESSED); diff -Nru mariadb-10.11.6/mysql-test/main/column_compression.test mariadb-10.11.9/mysql-test/main/column_compression.test --- mariadb-10.11.6/mysql-test/main/column_compression.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/column_compression.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ --source include/have_innodb.inc --source include/have_csv.inc ---source include/have_normal_bzip.inc +--source include/have_normal_zlib.inc let $MYSQLD_DATADIR= `select @@datadir`; diff -Nru mariadb-10.11.6/mysql-test/main/column_compression_parts.result mariadb-10.11.9/mysql-test/main/column_compression_parts.result --- mariadb-10.11.6/mysql-test/main/column_compression_parts.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/column_compression_parts.result 2024-08-03 07:29:57.000000000 +0000 @@ -12,7 +12,6 @@ INSERT INTO t1 VALUES (5,REPEAT('k',500)),(6,'April'),(7,7),(8,""),(9,"M"),(10,DEFAULT); ALTER TABLE t1 ANALYZE PARTITION p1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK ALTER TABLE t1 CHECK PARTITION p2; Table Op Msg_type Msg_text @@ -65,7 +64,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `i` int(11) DEFAULT NULL, - `a` varchar(1000) /*!100301 COMPRESSED*/ DEFAULT 'AAA' + `a` varchar(1000) /*M!100301 COMPRESSED*/ DEFAULT 'AAA' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PARTITION BY RANGE COLUMNS(`a`) (PARTITION `p1` VALUES LESS THAN ('m') ENGINE = MyISAM, @@ -133,7 +132,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(1000) /*!100301 COMPRESSED*/ DEFAULT NULL, + `a` varchar(1000) /*M!100301 COMPRESSED*/ DEFAULT NULL, `id` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PARTITION BY RANGE COLUMNS(`id`,`a`) @@ -166,7 +165,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(1000) /*!100301 COMPRESSED*/ DEFAULT '10-12-2010' + `a` varchar(1000) /*M!100301 COMPRESSED*/ DEFAULT '10-12-2010' ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PARTITION BY KEY (`a`) PARTITIONS 6 @@ -231,7 +230,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(200) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(200) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PARTITION BY KEY (`a`) (PARTITION `p0` ENGINE = MyISAM, @@ -248,7 +247,7 @@ SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `a` varchar(200) /*!100301 COMPRESSED*/ DEFAULT NULL + `a` varchar(200) /*M!100301 COMPRESSED*/ DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ALTER TABLE t1 EXCHANGE PARTITION pm WITH TABLE t2; DROP TABLE t1,t2; @@ -266,7 +265,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` blob /*!100301 COMPRESSED*/ DEFAULT 5, + `a` blob /*M!100301 COMPRESSED*/ DEFAULT 5, `i` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PARTITION BY HASH (`i`) @@ -283,7 +282,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` varchar(500) /*!100301 COMPRESSED*/ DEFAULT '5', + `a` varchar(500) /*M!100301 COMPRESSED*/ DEFAULT '5', `i` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PARTITION BY RANGE COLUMNS(`i`) diff -Nru mariadb-10.11.6/mysql-test/main/column_compression_rpl.test mariadb-10.11.9/mysql-test/main/column_compression_rpl.test --- mariadb-10.11.6/mysql-test/main/column_compression_rpl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/column_compression_rpl.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ --source include/have_innodb.inc +--source include/have_normal_zlib.inc --source include/master-slave.inc ---source include/have_normal_bzip.inc --let $engine_type= myisam --let $engine_type2= innodb diff -Nru mariadb-10.11.6/mysql-test/main/commit_1innodb.result mariadb-10.11.9/mysql-test/main/commit_1innodb.result --- mariadb-10.11.6/mysql-test/main/commit_1innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/commit_1innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -634,7 +634,7 @@ drop table t2; set sql_mode=no_engine_substitution; create temporary table t2 (a int); -call p_verify_status_increment(1, 0, 0, 0); +call p_verify_status_increment(3, 0, 2, 0); SUCCESS set sql_mode=default; @@ -643,8 +643,9 @@ select f1(); f1() 2 -# Two commits because a binary log record is written -call p_verify_status_increment(2, 0, 1, 0); +# Two commits because a binary log record is written, and another two +# as the function f1() is reloaded after creating temporary table. +call p_verify_status_increment(4, 0, 3, 0); SUCCESS commit; @@ -715,11 +716,11 @@ # 25. DDL: DROP TEMPORARY TABLE, does not start a transaction # drop temporary table t2; -call p_verify_status_increment(1, 0, 1, 0); +call p_verify_status_increment(3, 0, 2, 0); SUCCESS commit; -call p_verify_status_increment(1, 0, 1, 0); +call p_verify_status_increment(1, 0, 0, 0); SUCCESS # 26. Verify that SET AUTOCOMMIT issues an implicit commit @@ -801,7 +802,7 @@ SUCCESS do (select f1() from t1 where a=2); -call p_verify_status_increment(2, 2, 2, 2); +call p_verify_status_increment(4, 2, 4, 2); SUCCESS commit; diff -Nru mariadb-10.11.6/mysql-test/main/connect-no-db.result mariadb-10.11.9/mysql-test/main/connect-no-db.result --- mariadb-10.11.6/mysql-test/main/connect-no-db.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/connect-no-db.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,9 @@ +# +# MDEV-34226 On startup: UBSAN: applying zero offset to null pointer in my_copy_fix_mb from strings/ctype-mb.c and other locations +# +connect con1,localhost,root,,"*NO-ONE*"; +SELECT database(); +database() +NULL +disconnect con1; +connection default; diff -Nru mariadb-10.11.6/mysql-test/main/connect-no-db.test mariadb-10.11.9/mysql-test/main/connect-no-db.test --- mariadb-10.11.6/mysql-test/main/connect-no-db.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/connect-no-db.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,10 @@ +--echo # +--echo # MDEV-34226 On startup: UBSAN: applying zero offset to null pointer in my_copy_fix_mb from strings/ctype-mb.c and other locations +--echo # + +# Connect without a database + +connect (con1,localhost,root,,"*NO-ONE*"); +SELECT database(); +disconnect con1; +connection default; diff -Nru mariadb-10.11.6/mysql-test/main/connect.result mariadb-10.11.9/mysql-test/main/connect.result --- mariadb-10.11.6/mysql-test/main/connect.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/connect.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,6 @@ SET global secure_auth=0; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release connect con1,localhost,root,,mysql; show tables; Tables_in_mysql @@ -412,6 +414,8 @@ test drop procedure p1; SET global secure_auth=default; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release # # MDEV-19282: Log more specific warning with log_warnings=2 if # connection is aborted prior to authentication diff -Nru mariadb-10.11.6/mysql-test/main/constraints.result mariadb-10.11.9/mysql-test/main/constraints.result --- mariadb-10.11.6/mysql-test/main/constraints.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/constraints.result 2024-08-03 07:29:57.000000000 +0000 @@ -235,3 +235,16 @@ ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop procedure sp; drop table t1; +# +# MDEV-33768: Memory leak found in the test main.constraints run with --ps-protocol against a server built with the option -DWITH_PROTECT_STATEMENT_MEMROOT +# This test case was added by reviewer's request. +# +PREPARE stmt FROM 'CREATE TABLE t1 (a INT)'; +EXECUTE stmt; +DROP TABLE t1; +EXECUTE stmt; +EXECUTE stmt; +ERROR 42S01: Table 't1' already exists +# Clean up +DROP TABLE t1; +DEALLOCATE PREPARE stmt; diff -Nru mariadb-10.11.6/mysql-test/main/constraints.test mariadb-10.11.9/mysql-test/main/constraints.test --- mariadb-10.11.6/mysql-test/main/constraints.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/constraints.test 2024-08-03 07:29:57.000000000 +0000 @@ -189,3 +189,18 @@ show create table t1; drop procedure sp; drop table t1; + +--echo # +--echo # MDEV-33768: Memory leak found in the test main.constraints run with --ps-protocol against a server built with the option -DWITH_PROTECT_STATEMENT_MEMROOT +--echo # This test case was added by reviewer's request. +--echo # +PREPARE stmt FROM 'CREATE TABLE t1 (a INT)'; +EXECUTE stmt; +DROP TABLE t1; +EXECUTE stmt; +--error ER_TABLE_EXISTS_ERROR +EXECUTE stmt; + +--echo # Clean up +DROP TABLE t1; +DEALLOCATE PREPARE stmt; diff -Nru mariadb-10.11.6/mysql-test/main/crash_commit_before.test mariadb-10.11.9/mysql-test/main/crash_commit_before.test --- mariadb-10.11.6/mysql-test/main/crash_commit_before.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/crash_commit_before.test 2024-08-03 07:29:57.000000000 +0000 @@ -17,7 +17,7 @@ SET GLOBAL debug_dbug="d,crash_commit_before"; # Write file to make mysql-test-run.pl expect crash and restart ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Run the crashing query --error 2013 diff -Nru mariadb-10.11.6/mysql-test/main/create.result mariadb-10.11.9/mysql-test/main/create.result --- mariadb-10.11.6/mysql-test/main/create.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/create.result 2024-08-03 07:29:57.000000000 +0000 @@ -1803,7 +1803,7 @@ Table Create Table t1 CREATE TABLE `t1` ( `color` char(32) GENERATED ALWAYS AS (column_get(`dynamic_cols`,1 as char charset latin1)) STORED, - `cl` char(32) GENERATED ALWAYS AS (column_get(column_add(column_create(1,'blue' AS char charset latin1 ),2,'ttt'),`i` as char charset latin1)) STORED, + `cl` char(32) GENERATED ALWAYS AS (column_get(column_add(column_create(1,'blue' AS char charset latin1 collate latin1_swedish_ci ),2,'ttt'),`i` as char charset latin1)) STORED, `item_name` varchar(32) NOT NULL, `i` int(11) DEFAULT NULL, `dynamic_cols` blob DEFAULT NULL, @@ -2058,4 +2058,11 @@ # CREATE TABLE t1 (id1 INT, id2 INT, primary key (id1), unique index (id2) visible); drop table t1; +# +# MDEV-32376 SHOW CREATE DATABASE statement crashes the server when db name contains some unicode characters, ASAN stack-buffer-overflow +# +SET NAMES utf8mb3; +SHOW CREATE DATABASE `#testone#ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­`; +ERROR 42000: Incorrect database name '#testone#ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­...' +SET NAMES DEFAULT; # End of 10.5 Test diff -Nru mariadb-10.11.6/mysql-test/main/create.test mariadb-10.11.9/mysql-test/main/create.test --- mariadb-10.11.6/mysql-test/main/create.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/create.test 2024-08-03 07:29:57.000000000 +0000 @@ -1935,4 +1935,13 @@ CREATE TABLE t1 (id1 INT, id2 INT, primary key (id1), unique index (id2) visible); drop table t1; +--echo # +--echo # MDEV-32376 SHOW CREATE DATABASE statement crashes the server when db name contains some unicode characters, ASAN stack-buffer-overflow +--echo # + +SET NAMES utf8mb3; +--error ER_WRONG_DB_NAME +SHOW CREATE DATABASE `#testone#ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­ï¿­`; +SET NAMES DEFAULT; + --echo # End of 10.5 Test diff -Nru mariadb-10.11.6/mysql-test/main/create_or_replace.result mariadb-10.11.9/mysql-test/main/create_or_replace.result --- mariadb-10.11.6/mysql-test/main/create_or_replace.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/create_or_replace.result 2024-08-03 07:29:57.000000000 +0000 @@ -260,83 +260,91 @@ create table test.t1 (i int) engine=myisam; create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2 -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2 -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 +InnoDB 0 transactions not purged +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock mysqltest2 +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock mysqltest2 t2 +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 create or replace table test.t1; ERROR 42000: A table must have at least 1 column show tables; Tables_in_test t2 -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2 -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock mysqltest2 +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock mysqltest2 t2 create or replace table mysqltest2.t2; ERROR 42000: A table must have at least 1 column -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME create table t1 (i int); drop table t1; create table test.t1 (i int); create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2 -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2 -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock mysqltest2 +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock mysqltest2 t2 +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 create or replace table test.t1 (a int) select 1 as 'a', 2 as 'a'; ERROR 42S21: Duplicate column name 'a' show tables; Tables_in_test t2 -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2 -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock mysqltest2 +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock mysqltest2 t2 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock mysqltest2 +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock mysqltest2 t2 create or replace table mysqltest2.t2 (a int) select 1 as 'a', 2 as 'a'; ERROR 42S21: Duplicate column name 'a' -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME create table t1 (i int); drop table t1; create table test.t1 (i int) engine=innodb; create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2 -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2 -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock mysqltest2 +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock mysqltest2 t2 +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 unlock tables; drop table test.t1,mysqltest2.t2; create table test.t1 (i int) engine=aria transactional=1 checksum=1; create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2 -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2 -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock mysqltest2 +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock mysqltest2 t2 +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 unlock tables; drop table t1; create table test.t1 (i int); @@ -347,19 +355,19 @@ # create table t1 (i int); lock table t1 write; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 create or replace table t1 (a char(1)) engine=Innodb select 'foo' as a; ERROR 22001: Data too long for column 'a' at row 1 show tables; Tables_in_test t2 -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME create table t1 (i int); drop table t1; # @@ -446,37 +454,37 @@ # create table t1 (a int); lock table t1 write, t2 read; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 -# MDL_SHARED_READ NULL Table metadata lock test t2 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 +MDL_SHARED_READ Table metadata lock test t2 create or replace table t1 (i int); -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 -# MDL_SHARED_READ NULL Table metadata lock test t2 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 +MDL_SHARED_READ Table metadata lock test t2 create or replace table t1 like t2; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 -# MDL_SHARED_READ NULL Table metadata lock test t2 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 +MDL_SHARED_READ Table metadata lock test t2 create or replace table t1 select 1 as f1; -select * from information_schema.metadata_lock_info; -THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME -# MDL_BACKUP_DDL NULL Backup lock -# MDL_BACKUP_DML NULL Backup lock -# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test -# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1 -# MDL_SHARED_READ NULL Table metadata lock test t2 +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; +LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME +MDL_BACKUP_DDL Backup lock +MDL_BACKUP_DML Backup lock +MDL_INTENTION_EXCLUSIVE Schema metadata lock test +MDL_SHARED_NO_READ_WRITE Table metadata lock test t1 +MDL_SHARED_READ Table metadata lock test t2 drop table t1; unlock tables; # diff -Nru mariadb-10.11.6/mysql-test/main/create_or_replace.test mariadb-10.11.9/mysql-test/main/create_or_replace.test --- mariadb-10.11.6/mysql-test/main/create_or_replace.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/create_or_replace.test 2024-08-03 07:29:57.000000000 +0000 @@ -216,58 +216,52 @@ create table test.t1 (i int) engine=myisam; create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; ---replace_column 1 # +--source ../suite/innodb/include/wait_all_purged.inc --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; --error ER_TABLE_MUST_HAVE_COLUMNS create or replace table test.t1; show tables; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; --error ER_TABLE_MUST_HAVE_COLUMNS create or replace table mysqltest2.t2; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; create table t1 (i int); drop table t1; create table test.t1 (i int); create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; --error ER_DUP_FIELDNAME create or replace table test.t1 (a int) select 1 as 'a', 2 as 'a'; show tables; ---replace_column 1 # +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; --error ER_DUP_FIELDNAME create or replace table mysqltest2.t2 (a int) select 1 as 'a', 2 as 'a'; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; create table t1 (i int); drop table t1; create table test.t1 (i int) engine=innodb; create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; unlock tables; drop table test.t1,mysqltest2.t2; create table test.t1 (i int) engine=aria transactional=1 checksum=1; create table mysqltest2.t2 like test.t1; lock table test.t1 write, mysqltest2.t2 write; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; unlock tables; drop table t1; @@ -281,15 +275,13 @@ --echo # create table t1 (i int); lock table t1 write; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; --error ER_DATA_TOO_LONG create or replace table t1 (a char(1)) engine=Innodb select 'foo' as a; show tables; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; create table t1 (i int); drop table t1; --enable_view_protocol @@ -365,22 +357,18 @@ create table t1 (a int); lock table t1 write, t2 read; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; create or replace table t1 (i int); ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; create or replace table t1 like t2; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; create or replace table t1 select 1 as f1; ---replace_column 1 # --sorted_result -select * from information_schema.metadata_lock_info; +select LOCK_MODE,LOCK_TYPE, TABLE_SCHEMA,TABLE_NAME from information_schema.metadata_lock_info; drop table t1; unlock tables; diff -Nru mariadb-10.11.6/mysql-test/main/cset_narrowing.test mariadb-10.11.9/mysql-test/main/cset_narrowing.test --- mariadb-10.11.6/mysql-test/main/cset_narrowing.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/cset_narrowing.test 2024-08-03 07:29:57.000000000 +0000 @@ -88,10 +88,13 @@ explain select * from t10, t1 where t10.mb4=t1.mb3 and t10.pk=3; +#Enable after fix MDEV-32034 +--disable_view_protocol select json_detailed(json_extract(trace, '$**.range_scan_alternatives')) as JS from information_schema.optimizer_trace; +--enable_view_protocol select * from t10, t1 where t10.mb4=t1.mb3 and t10.pk=3; @@ -121,12 +124,15 @@ --echo # - ref acccess lookup keys do use equality substitution, --echo # - concat() arguments don't +#Enable after fix MDEV-32034 +--disable_view_protocol explain format=json select straight_join * from t10,t1 force index(mb3),t2 where t1.mb3=t2.mb4 and t2.mb4=t10.mb4 and concat(t1.mb3, t2.mb4, t10.mb4)<>'Bebebe'; select json_detailed(json_extract(trace, '$**.condition_processing')) as JS from information_schema.optimizer_trace; +--enable_view_protocol select straight_join * from t10,t1 force index(mb3),t2 where @@ -140,8 +146,11 @@ t1.mb3=t2.mb4 and t2.mb4=t10.mb4 and t10.mb4='hello' and concat(t1.mb3, t2.mb4, t10.mb4)<>'Bebebe'; +#Enable after fix MDEV-32034 +--disable_view_protocol select json_detailed(json_extract(trace, '$**.condition_processing')) as JS from information_schema.optimizer_trace; +--enable_view_protocol drop table t2; drop table t1, t10; diff -Nru mariadb-10.11.6/mysql-test/main/cte_nonrecursive.result mariadb-10.11.9/mysql-test/main/cte_nonrecursive.result --- mariadb-10.11.6/mysql-test/main/cte_nonrecursive.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/cte_nonrecursive.result 2024-08-03 07:29:57.000000000 +0000 @@ -2339,4 +2339,342 @@ with data as (select 1 as id) select id into @myid from data; set sql_mode= @save_sql_mode; +# +# MDEV-31995 Bogus error executing PS for query using CTE with renaming of columns +# +create table t1 (a int, b int); +insert into t1 values (1,1),(1,2),(1,3),(2,1),(2,2); +create table t2 (a int, b int); +insert into t2 values (3,1),(3,2),(3,3),(4,1),(4,2); +with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 group by col1) +select * from cte; +c1 c2 +1 6 +2 3 +prepare st from "with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 group by col1) +select * from cte"; +execute st; +c1 c2 +1 6 +2 3 +execute st; +c1 c2 +1 6 +2 3 +drop prepare st; +create procedure sp() with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 group by col1) +select * from cte; +call sp(); +c1 c2 +1 6 +2 3 +call sp(); +c1 c2 +1 6 +2 3 +drop procedure sp; +with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 order by col1) +select * from cte; +c1 c2 +1 9 +prepare st from "with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 order by col1) +select * from cte"; +execute st; +c1 c2 +1 9 +execute st; +c1 c2 +1 9 +drop prepare st; +create procedure sp() with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 order by col1) +select * from cte; +call sp(); +c1 c2 +1 9 +call sp(); +c1 c2 +1 9 +drop procedure sp; +with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 where a > 1 group by col1 +union select a as col3, sum(b) as col4 from t2 where b > 2 group by col3), +cte2 (c3, c4) as +(select a as col5, sum(b) as col6 from t1 where a <= 1 group by col5 +union select a as col7, sum(b) as col8 from t2 where b <= 2 group by col7) +select * from cte where c1=1 union select * from cte2 where c3=3; +c1 c2 +3 3 +prepare st from "with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 where a > 1 group by col1 +union select a as col3, sum(b) as col4 from t2 where b > 2 group by col3), +cte2 (c3, c4) as +(select a as col5, sum(b) as col6 from t1 where a <= 1 group by col5 +union select a as col7, sum(b) as col8 from t2 where b <= 2 group by col7) +select * from cte where c1=1 union select * from cte2 where c3=3"; +execute st; +c1 c2 +3 3 +execute st; +c1 c2 +3 3 +drop prepare st; +create procedure sp() with cte (c1,c2) as +(select a as col1, sum(b) as col2 from t1 where a > 1 group by col1 +union select a as col3, sum(b) as col4 from t2 where b > 2 group by col3), +cte2 (c3, c4) as +(select a as col5, sum(b) as col6 from t1 where a <= 1 group by col5 +union select a as col7, sum(b) as col8 from t2 where b <= 2 group by col7) +select * from cte where c1=1 union select * from cte2 where c3=3; +call sp(); +c1 c2 +3 3 +call sp(); +c1 c2 +3 3 +drop procedure sp; +with cte (c1,c2) as (select * from t1) +select cte.c1+1 as col1 , cte.c2 as col2 from cte where cte.c1 > 1 +union +select cte.c1 as col3, cte.c2+1 as col4 from cte where cte.c1 < 0; +col1 col2 +3 1 +3 2 +prepare st from "with cte (c1,c2) as (select * from t1) +select cte.c1+1 as col1 , cte.c2 as col2 from cte where cte.c1 > 1 +union +select cte.c1 as col3, cte.c2+1 as col4 from cte where cte.c1 < 0"; +execute st; +col1 col2 +3 1 +3 2 +execute st; +col1 col2 +3 1 +3 2 +save this to the end to test errors >drop prepare st; +create procedure sp() with cte (c1,c2) as (select * from t1) +select cte.c1+1 as col1 , cte.c2 as col2 from cte where cte.c1 > 1 +union +select cte.c1 as col3, cte.c2+1 as col4 from cte where cte.c1 < 0; +call sp(); +col1 col2 +3 1 +3 2 +call sp(); +col1 col2 +3 1 +3 2 +drop procedure sp; +insert into t1 select * from t2; +with cte (c1, c2) +as (select a, sum(b) from t1 where b > 1 group by a having sum(b) < 5) +select * from cte where c1 < 4 and c2 > 1; +c1 c2 +2 2 +# Check pushdown conditions in JSON output +explain format=json with cte (c1, c2) +as (select a, sum(b) from t1 where b > 1 group by a having sum(b) < 5) +select * from cte where c1 < 4 and c2 > 1; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 10, + "filtered": 100, + "attached_condition": "cte.c1 < 4 and cte.c2 > 1", + "materialized": { + "query_block": { + "select_id": 2, + "having_condition": "sum(t1.b) < 5 and c2 > 1", + "filesort": { + "sort_key": "t1.a", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 10, + "filtered": 100, + "attached_condition": "t1.b > 1 and t1.a < 4" + } + } + ] + } + } + } + } + } + } + ] + } +} +alter table t1 add column c int; +execute st; +ERROR HY000: WITH column list and SELECT field list have different column counts +drop prepare st; +drop table t1,t2; +Test out recursive CTEs +create table distances (src char(1), dest char(1), distance int); +create table city_population (city char(1), population int); +INSERT INTO `distances` VALUES ('A','A',0),('B','A',593),('C','A',800), +('D','A',221),('E','A',707),('F','A',869),('G','A',225),('H','A',519), +('A','B',919),('B','B',0),('C','B',440),('D','B',79),('E','B',79), +('F','B',154),('G','B',537),('H','B',220),('A','C',491),('B','C',794), +('C','C',0),('D','C',100),('E','C',350),('F','C',748),('G','C',712), +('H','C',315),('A','D',440),('B','D',256),('C','D',958),('D','D',0), +('E','D',255),('F','D',161),('G','D',63),('H','D',831),('A','E',968), +('B','E',345),('C','E',823),('D','E',81),('E','E',0),('F','E',436), +('G','E',373),('H','E',558),('A','F',670),('B','F',677),('C','F',375), +('D','F',843),('E','F',90),('F','F',0),('G','F',328),('H','F',881), +('A','G',422),('B','G',467),('C','G',67),('D','G',936),('E','G',480), +('F','G',592),('G','G',0),('H','G',819),('A','H',537),('B','H',229), +('C','H',534),('D','H',984),('E','H',319),('F','H',643),('G','H',257), +('H','H',0); +insert into city_population values ('A', 5000), ('B', 6000), ('C', 100000), +('D', 80000), ('E', 7000), ('F', 1000), ('G', 100), ('H', -80000); +#find the biggest city within 300 kellikams of 'E' +with recursive travel (src, path, dest, distance, population) as ( +select city, cast('' as varchar(10)), city, +0, population +from city_population where city='E' + union all +select src.src, concat(src.path, dst.dest), dst.dest, +src.distance + dst.distance, dstc.population +from travel src +join distances dst on src.dest != dst.dest +join city_population dstc on dst.dest = dstc.city +where dst.src = src.dest and src.distance + dst.distance < 300 +and length(path) < 10 +) +select * from travel where dest != 'E' order by population desc, distance +limit 1; +src path dest distance population +E FD D 251 80000 +prepare st from "with recursive travel (src, path, dest, distance, population) as ( +select city, cast('' as varchar(10)), city, +0, population +from city_population where city='E' + union all +select src.src, concat(src.path, dst.dest), dst.dest, +src.distance + dst.distance, dstc.population +from travel src +join distances dst on src.dest != dst.dest +join city_population dstc on dst.dest = dstc.city +where dst.src = src.dest and src.distance + dst.distance < 300 +and length(path) < 10 +) +select * from travel where dest != 'E' order by population desc, distance +limit 1"; +execute st; +src path dest distance population +E FD D 251 80000 +execute st; +src path dest distance population +E FD D 251 80000 +drop prepare st; +create procedure sp() with recursive travel (src, path, dest, distance, population) as ( +select city, cast('' as varchar(10)), city, +0, population +from city_population where city='E' + union all +select src.src, concat(src.path, dst.dest), dst.dest, +src.distance + dst.distance, dstc.population +from travel src +join distances dst on src.dest != dst.dest +join city_population dstc on dst.dest = dstc.city +where dst.src = src.dest and src.distance + dst.distance < 300 +and length(path) < 10 +) +select * from travel where dest != 'E' order by population desc, distance +limit 1; +call sp(); +src path dest distance population +E FD D 251 80000 +call sp(); +src path dest distance population +E FD D 251 80000 +drop procedure sp; +drop table distances, city_population; +# +# MDEV-28615: Multi-table UPDATE over derived table containing +# row that uses subquery with hanging CTE +# +CREATE TABLE t1 (a int) ENGINE=MYISAM; +INSERT INTO t1 VALUES (3), (7), (1); +UPDATE +(SELECT (5, (WITH cte AS (SELECT 1) SELECT a FROM t1))) dt +JOIN t1 t +ON t.a=dt.a +SET t.a = 1; +ERROR 21000: Operand should contain 1 column(s) +UPDATE +(SELECT a FROM t1 +WHERE (5, (WITH cte AS (SELECT 1) SELECT a FROM t1 WHERE a > 4)) <= +(5,a)) dt +JOIN t1 t +ON t.a=dt.a +SET t.a = 1; +SELECT * FROM t1; +a +3 +1 +1 +DROP TABLE t1; +# +# MDEV-31657: CTE with the same name as base table used twice +# in another CTE +# +create table t (a int); +insert into t values (3), (7), (1); +with +t as (select * from t), +cte as (select t1.a as t1a, t2.a as t2a from t as t1, t as t2 where t1.a=t2.a) +select * from cte; +t1a t2a +3 3 +7 7 +1 1 +create table s (a int); +insert into s values (1), (4), (7); +with +t as (select * from t), +s as (select a-1 as a from s), +cte as (select t.a as ta, s.a as sa from t, s where t.a=s.a +union +select t.a+1, s.a+1 from t, s where t.a=s.a+1) +select * from cte; +ta sa +3 3 +2 1 +8 7 +with +t as (select * from t), +cte as (select t.a as ta, s.a as sa from t, s where t.a=s.a +union +select t.a+1, s.a+1 from t, s where t.a=s.a), +s as (select a+10 as a from s) +select * from cte; +ta sa +1 1 +7 7 +2 2 +8 8 +drop table t,s; +with +t as (select * from t), +cte as (select t1.a as t1a, t2.a as t2a from t as t1, t as t2 where t1.a=t2.a) +select * from cte; +ERROR 42S02: Table 'test.t' doesn't exist # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/cte_nonrecursive.test mariadb-10.11.9/mysql-test/main/cte_nonrecursive.test --- mariadb-10.11.6/mysql-test/main/cte_nonrecursive.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/cte_nonrecursive.test 2024-08-03 07:29:57.000000000 +0000 @@ -1796,4 +1796,233 @@ select id into @myid from data; set sql_mode= @save_sql_mode; +--echo # +--echo # MDEV-31995 Bogus error executing PS for query using CTE with renaming of columns +--echo # + +create table t1 (a int, b int); +insert into t1 values (1,1),(1,2),(1,3),(2,1),(2,2); +create table t2 (a int, b int); +insert into t2 values (3,1),(3,2),(3,3),(4,1),(4,2); + +let $q= +with cte (c1,c2) as + (select a as col1, sum(b) as col2 from t1 group by col1) +select * from cte; + +eval $q; + +eval prepare st from "$q"; +execute st; +execute st; +drop prepare st; + +eval create procedure sp() $q; +call sp(); +call sp(); +drop procedure sp; + +let $q= +with cte (c1,c2) as + (select a as col1, sum(b) as col2 from t1 order by col1) +select * from cte; + +eval $q; + +eval prepare st from "$q"; +execute st; +execute st; +drop prepare st; + +eval create procedure sp() $q; +call sp(); +call sp(); +drop procedure sp; + +let $q= +with cte (c1,c2) as + (select a as col1, sum(b) as col2 from t1 where a > 1 group by col1 + union select a as col3, sum(b) as col4 from t2 where b > 2 group by col3), +cte2 (c3, c4) as + (select a as col5, sum(b) as col6 from t1 where a <= 1 group by col5 + union select a as col7, sum(b) as col8 from t2 where b <= 2 group by col7) +select * from cte where c1=1 union select * from cte2 where c3=3; + +eval $q; + +eval prepare st from "$q"; +execute st; +execute st; +drop prepare st; + +eval create procedure sp() $q; +call sp(); +call sp(); +drop procedure sp; + +let $q= +with cte (c1,c2) as (select * from t1) +select cte.c1+1 as col1 , cte.c2 as col2 from cte where cte.c1 > 1 +union +select cte.c1 as col3, cte.c2+1 as col4 from cte where cte.c1 < 0; + +eval $q; + +eval prepare st from "$q"; +execute st; +execute st; +--echo save this to the end to test errors >drop prepare st; + +eval create procedure sp() $q; +call sp(); +call sp(); +drop procedure sp; + +insert into t1 select * from t2; + +let $q= +with cte (c1, c2) + as (select a, sum(b) from t1 where b > 1 group by a having sum(b) < 5) +select * from cte where c1 < 4 and c2 > 1; + +eval $q; + +--echo # Check pushdown conditions in JSON output +--source include/analyze-format.inc +eval explain format=json $q; + +alter table t1 add column c int; + +--error ER_WITH_COL_WRONG_LIST +execute st; + +drop prepare st; +drop table t1,t2; + +--echo Test out recursive CTEs + +create table distances (src char(1), dest char(1), distance int); +create table city_population (city char(1), population int); +INSERT INTO `distances` VALUES ('A','A',0),('B','A',593),('C','A',800), +('D','A',221),('E','A',707),('F','A',869),('G','A',225),('H','A',519), +('A','B',919),('B','B',0),('C','B',440),('D','B',79),('E','B',79), +('F','B',154),('G','B',537),('H','B',220),('A','C',491),('B','C',794), +('C','C',0),('D','C',100),('E','C',350),('F','C',748),('G','C',712), +('H','C',315),('A','D',440),('B','D',256),('C','D',958),('D','D',0), +('E','D',255),('F','D',161),('G','D',63),('H','D',831),('A','E',968), +('B','E',345),('C','E',823),('D','E',81),('E','E',0),('F','E',436), +('G','E',373),('H','E',558),('A','F',670),('B','F',677),('C','F',375), +('D','F',843),('E','F',90),('F','F',0),('G','F',328),('H','F',881), +('A','G',422),('B','G',467),('C','G',67),('D','G',936),('E','G',480), +('F','G',592),('G','G',0),('H','G',819),('A','H',537),('B','H',229), +('C','H',534),('D','H',984),('E','H',319),('F','H',643),('G','H',257), +('H','H',0); +insert into city_population values ('A', 5000), ('B', 6000), ('C', 100000), +('D', 80000), ('E', 7000), ('F', 1000), ('G', 100), ('H', -80000); + +--echo #find the biggest city within 300 kellikams of 'E' +let $q= +with recursive travel (src, path, dest, distance, population) as ( + select city, cast('' as varchar(10)), city, + 0, population + from city_population where city='E' + union all + select src.src, concat(src.path, dst.dest), dst.dest, + src.distance + dst.distance, dstc.population + from travel src + join distances dst on src.dest != dst.dest + join city_population dstc on dst.dest = dstc.city + where dst.src = src.dest and src.distance + dst.distance < 300 + and length(path) < 10 + ) +select * from travel where dest != 'E' order by population desc, distance +limit 1; + +eval $q; + +eval prepare st from "$q"; +execute st; +execute st; +drop prepare st; + +eval create procedure sp() $q; +call sp(); +call sp(); +drop procedure sp; + +drop table distances, city_population; + +--echo # +--echo # MDEV-28615: Multi-table UPDATE over derived table containing +--echo # row that uses subquery with hanging CTE +--echo # + +CREATE TABLE t1 (a int) ENGINE=MYISAM; +INSERT INTO t1 VALUES (3), (7), (1); + +--error ER_OPERAND_COLUMNS +UPDATE + (SELECT (5, (WITH cte AS (SELECT 1) SELECT a FROM t1))) dt + JOIN t1 t + ON t.a=dt.a +SET t.a = 1; + +UPDATE + (SELECT a FROM t1 + WHERE (5, (WITH cte AS (SELECT 1) SELECT a FROM t1 WHERE a > 4)) <= + (5,a)) dt + JOIN t1 t + ON t.a=dt.a +SET t.a = 1; + +SELECT * FROM t1; + +DROP TABLE t1; + +--echo # +--echo # MDEV-31657: CTE with the same name as base table used twice +--echo # in another CTE +--echo # + +create table t (a int); +insert into t values (3), (7), (1); + +let $q1= +with +t as (select * from t), +cte as (select t1.a as t1a, t2.a as t2a from t as t1, t as t2 where t1.a=t2.a) +select * from cte; + +eval $q1; + +create table s (a int); +insert into s values (1), (4), (7); + +let $q2= +with +t as (select * from t), +s as (select a-1 as a from s), +cte as (select t.a as ta, s.a as sa from t, s where t.a=s.a + union + select t.a+1, s.a+1 from t, s where t.a=s.a+1) +select * from cte; + +eval $q2; + +let $q3= +with +t as (select * from t), +cte as (select t.a as ta, s.a as sa from t, s where t.a=s.a + union + select t.a+1, s.a+1 from t, s where t.a=s.a), +s as (select a+10 as a from s) +select * from cte; + +eval $q3; + +drop table t,s; + +--ERROR ER_NO_SUCH_TABLE +eval $q1; + --echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_big5.result mariadb-10.11.9/mysql-test/main/ctype_big5.result --- mariadb-10.11.6/mysql-test/main/ctype_big5.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_big5.result 2024-08-03 07:29:57.000000000 +0000 @@ -5115,20 +5115,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5253,20 +5253,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5392,20 +5392,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5530,20 +5530,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_binary.result mariadb-10.11.9/mysql-test/main/ctype_binary.result --- mariadb-10.11.6/mysql-test/main/ctype_binary.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_binary.result 2024-08-03 07:29:57.000000000 +0000 @@ -1131,8 +1131,8 @@ `c1` varbinary(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -1141,8 +1141,8 @@ `c1` varbinary(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))); -hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) +select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)'))) as c1; show create table t1; @@ -1151,8 +1151,8 @@ `c1` varbinary(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 30 create table t1 as select concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -1161,8 +1161,8 @@ `c1` varbinary(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))); -hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) +select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) as exp; +exp 31 create table t1 as select concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))'))) as c1; show create table t1; @@ -1171,8 +1171,8 @@ `c1` varbinary(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))); -hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) +select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) as exp; +exp 30 create table t1 as select concat(IsEmpty(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -1181,8 +1181,8 @@ `c1` varbinary(21) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))); -hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) +select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) as exp; +exp 31 create table t1 as select concat(IsSimple(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -1191,8 +1191,8 @@ `c1` varbinary(2) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))); -hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) +select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) as exp; +exp 30 create table t1 as select concat(IsClosed(GeomFromText('LineString(1 1,2 2)'))) as c1; show create table t1; @@ -1201,13 +1201,13 @@ `c1` varbinary(2) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))); -hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) +select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) as exp; +exp 31 create table t1 as select concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)'))) as c1; drop table t1; -select hex(concat(x(GeomFromText('Point(1 2)')))); -hex(concat(x(GeomFromText('Point(1 2)')))) +select hex(concat(x(GeomFromText('Point(1 2)')))) as exp; +exp 31 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1216,8 +1216,8 @@ `c1` varbinary(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(y(GeomFromText('Point(1 2)')))); -hex(concat(y(GeomFromText('Point(1 2)')))) +select hex(concat(y(GeomFromText('Point(1 2)')))) as exp; +exp 32 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1226,8 +1226,8 @@ `c1` varbinary(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))); -hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) +select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) as exp; +exp 31 create table t1 as select concat(GLength(GeomFromText('LineString(1 2, 2 2)'))) as c1; show create table t1; @@ -1236,8 +1236,8 @@ `c1` varbinary(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))); -hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) +select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) as exp; +exp 31 create table t1 as select concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))'))) as c1; show create table t1; @@ -1246,8 +1246,8 @@ `c1` varbinary(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GeometryType(GeomFromText('Point(1 2)')))); -hex(concat(GeometryType(GeomFromText('Point(1 2)')))) +select hex(concat(GeometryType(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E54 create table t1 as select concat(GeometryType(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1256,8 +1256,8 @@ `c1` varbinary(20) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(AsText(GeomFromText('Point(1 2)')))); -hex(concat(AsText(GeomFromText('Point(1 2)')))) +select hex(concat(AsText(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E542831203229 create table t1 as select concat(AsText(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1526,8 +1526,8 @@ `c1` varbinary(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))); -hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) +select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) as exp; +exp 32343A30303A3030 create table t1 as select concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00')) as c1; show create table t1; @@ -1566,8 +1566,8 @@ `c1` varbinary(19) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))); -hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) +select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) as exp; +exp 323030332D31322D33312032303A30303A3030 create table t1 as select concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00')) as c1; show create table t1; @@ -1576,8 +1576,8 @@ `c1` varbinary(19) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))); -hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) +select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) as exp; +exp 323030342D30312D30322031323A30303A3030 create table t1 as select concat(date_add('2004-01-01 12:00:00', interval 1 day)) as c1; show create table t1; diff -Nru mariadb-10.11.6/mysql-test/main/ctype_binary.test mariadb-10.11.9/mysql-test/main/ctype_binary.test --- mariadb-10.11.6/mysql-test/main/ctype_binary.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_binary.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,3 @@ - -#remove this include after fix MDEV-27871 ---source include/no_view_protocol.inc - set names binary; --source include/ctype_numconv.inc @@ -234,22 +230,30 @@ --echo # Binary format, binary result SELECT DATE_FORMAT('2004-02-02','%W'); SELECT HEX(DATE_FORMAT('2004-02-02','%W')); +#Enable after fix MDEV-33936 +--disable_view_protocol SELECT DATE_FORMAT(TIME'-01:01:01','%h'); SELECT HEX(DATE_FORMAT(TIME'-01:01:01','%h')); +--enable_view_protocol --echo # latin1 format, binary result SELECT DATE_FORMAT('2004-02-02',_latin1'%W'); SELECT HEX(DATE_FORMAT('2004-02-02',_latin1'%W')); +#Enable after fix MDEV-33936 +--disable_view_protocol SELECT DATE_FORMAT(TIME'-01:01:01',_latin1'%h'); SELECT HEX(DATE_FORMAT(TIME'-01:01:01',_latin1'%h')); +--enable_view_protocol --echo # Binary format, latin1 result SET NAMES latin1; SELECT DATE_FORMAT('2004-02-02',_binary'%W'); SELECT HEX(DATE_FORMAT('2004-02-02',_binary'%W')); +#Enable after fix MDEV-33936 +--disable_view_protocol SELECT DATE_FORMAT(TIME'-01:01:01',_binary'%h'); SELECT HEX(DATE_FORMAT(TIME'-01:01:01',_binary'%h')); - +--enable_view_protocol --echo # --echo # End of 10.4 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/ctype_collate.result mariadb-10.11.9/mysql-test/main/ctype_collate.result --- mariadb-10.11.6/mysql-test/main/ctype_collate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_collate.result 2024-08-03 07:29:57.000000000 +0000 @@ -614,18 +614,24 @@ EXPLAIN SELECT * FROM t1 WHERE s2 BETWEEN 'a' AND 'b' COLLATE latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where +Warnings: +Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` >= "'a'" of collation `latin1_german1_ci` EXPLAIN SELECT * FROM t1 WHERE s1 IN ('a','b' COLLATE latin1_german1_ci); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range s1 s1 11 NULL 2 Using index condition EXPLAIN SELECT * FROM t1 WHERE s2 IN ('a','b' COLLATE latin1_german1_ci); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where +Warnings: +Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german1_ci` EXPLAIN SELECT * FROM t1 WHERE s1 LIKE 'a' COLLATE latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range s1 s1 11 NULL 1 Using index condition EXPLAIN SELECT * FROM t1 WHERE s2 LIKE 'a' COLLATE latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where +Warnings: +Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` like "'a' collate latin1_german1_ci" of collation `latin1_german1_ci` DROP TABLE t1; create table t1(f1 varchar(10) character set latin2 collate latin2_hungarian_ci, key(f1)); insert into t1 set f1=0x3F3F9DC73F; @@ -774,3 +780,27 @@ # # End of 10.2 tests # +# +# MDEV-33318 ORDER BY COLLATE improperly applied to non-character columns +# +set names utf8; +create table t1 (ts datetime); +insert t1 values ('2024-01-26 21:37:54'), ('2024-01-26 21:37:54'), +('2024-01-26 21:37:54'), ('2024-01-26 21:37:54'), +('2024-01-26 21:37:58'), ('2024-01-26 21:37:58'), +('2024-01-26 21:37:58'), ('2024-01-26 21:38:02'), +('2024-01-26 21:38:02'), ('2024-01-26 21:38:02'); +select * from t1 order by ts collate utf8_bin; +ts +2024-01-26 21:37:54 +2024-01-26 21:37:54 +2024-01-26 21:37:54 +2024-01-26 21:37:54 +2024-01-26 21:37:58 +2024-01-26 21:37:58 +2024-01-26 21:37:58 +2024-01-26 21:38:02 +2024-01-26 21:38:02 +2024-01-26 21:38:02 +drop table t1; +# End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_collate.test mariadb-10.11.9/mysql-test/main/ctype_collate.test --- mariadb-10.11.6/mysql-test/main/ctype_collate.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_collate.test 2024-08-03 07:29:57.000000000 +0000 @@ -357,3 +357,18 @@ --echo # --echo # End of 10.2 tests --echo # + +--echo # +--echo # MDEV-33318 ORDER BY COLLATE improperly applied to non-character columns +--echo # +set names utf8; +create table t1 (ts datetime); +insert t1 values ('2024-01-26 21:37:54'), ('2024-01-26 21:37:54'), + ('2024-01-26 21:37:54'), ('2024-01-26 21:37:54'), + ('2024-01-26 21:37:58'), ('2024-01-26 21:37:58'), + ('2024-01-26 21:37:58'), ('2024-01-26 21:38:02'), + ('2024-01-26 21:38:02'), ('2024-01-26 21:38:02'); +select * from t1 order by ts collate utf8_bin; +drop table t1; + +--echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_collate_context.result mariadb-10.11.9/mysql-test/main/ctype_collate_context.result --- mariadb-10.11.6/mysql-test/main/ctype_collate_context.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_collate_context.result 2024-08-03 07:29:57.000000000 +0000 @@ -3716,3 +3716,103 @@ # # End of 10.9 tests # +# +# Start of 10.11 tests +# +# +# MDEV-10865 COLLATE keyword doesn't work in PREPARE query +# +SET NAMES utf8mb4; +# +# A context collation and an explicit NULL +# +SELECT NULL COLLATE uca1400_ai_ci; +ERROR HY000: 'NULL' is not allowed in this context +SELECT CONCAT(NULL) COLLATE uca1400_ai_ci; +ERROR HY000: 'NULL' is not allowed in this context +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT NULL COLLATE uca1400_ai_ci AS c1'; +ERROR HY000: 'NULL' is not allowed in this context +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE uca1400_ai_ci AS c1'; +ERROR HY000: 'NULL' is not allowed in this context +# +# A context collation and a parameter bound to NULL +# +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING NULL; +ERROR HY000: 'NULL' is not allowed in this context +EXECUTE stmt USING CONCAT(NULL); +ERROR HY000: 'NULL' is not allowed in this context +EXECUTE stmt USING NULL COLLATE uca1400_ai_ci; +ERROR HY000: 'NULL' is not allowed in this context +EXECUTE stmt USING CONCAT(NULL) COLLATE uca1400_ai_ci; +ERROR HY000: 'NULL' is not allowed in this context +# +# A context collation and CONVERT(NULL USING ...) +# +EXECUTE stmt USING CONVERT(NULL USING utf8mb4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +EXECUTE stmt USING CONVERT(NULL USING utf8mb4) COLLATE uca1400_ai_ci; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +EXECUTE stmt USING CONVERT(NULL USING binary); +ERROR 42000: COLLATION 'uca1400_ai_ci' is not valid for CHARACTER SET 'binary' +EXECUTE stmt USING CONVERT(NULL USING latin1); +ERROR 42000: COLLATION 'uca1400_ai_ci' is not valid for CHARACTER SET 'latin1' +# +# A context collation and an expression with a parameter +# whose character does not get resolved when bound to a not-NULL value +# +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT LEFT(NULL,?) COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING NULL; +ERROR HY000: 'NULL' is not allowed in this context +# +# A context collation and an expression with a parameter +# whose character set gets resolved when bound to a not-NULL value +# +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING 1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING _binary'test'; +ERROR 42000: COLLATION 'uca1400_ai_ci' is not valid for CHARACTER SET 'binary' +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING 'test' COLLATE utf8mb4_bin; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING _latin1'test' COLLATE latin1_bin; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/ctype_collate_context.test mariadb-10.11.9/mysql-test/main/ctype_collate_context.test --- mariadb-10.11.6/mysql-test/main/ctype_collate_context.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_collate_context.test 2024-08-03 07:29:57.000000000 +0000 @@ -401,3 +401,103 @@ --echo # --echo # End of 10.9 tests --echo # + +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-10865 COLLATE keyword doesn't work in PREPARE query +--echo # + +SET NAMES utf8mb4; + +--echo # +--echo # A context collation and an explicit NULL +--echo # + +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +SELECT NULL COLLATE uca1400_ai_ci; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +SELECT CONCAT(NULL) COLLATE uca1400_ai_ci; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT NULL COLLATE uca1400_ai_ci AS c1'; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE uca1400_ai_ci AS c1'; + + +--echo # +--echo # A context collation and a parameter bound to NULL +--echo # + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +EXECUTE stmt USING NULL; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +EXECUTE stmt USING CONCAT(NULL); +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +EXECUTE stmt USING NULL COLLATE uca1400_ai_ci; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +EXECUTE stmt USING CONCAT(NULL) COLLATE uca1400_ai_ci; + +--echo # +--echo # A context collation and CONVERT(NULL USING ...) +--echo # + +EXECUTE stmt USING CONVERT(NULL USING utf8mb4); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +EXECUTE stmt USING CONVERT(NULL USING utf8mb4) COLLATE uca1400_ai_ci; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--error ER_COLLATION_CHARSET_MISMATCH +EXECUTE stmt USING CONVERT(NULL USING binary); + +--error ER_COLLATION_CHARSET_MISMATCH +EXECUTE stmt USING CONVERT(NULL USING latin1); + +--echo # +--echo # A context collation and an expression with a parameter +--echo # whose character does not get resolved when bound to a not-NULL value +--echo # + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT LEFT(NULL,?) COLLATE uca1400_ai_ci AS c1'; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +EXECUTE stmt USING NULL; + + +--echo # +--echo # A context collation and an expression with a parameter +--echo # whose character set gets resolved when bound to a not-NULL value +--echo # + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING 1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +--error ER_COLLATION_CHARSET_MISMATCH +EXECUTE stmt USING _binary'test'; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING 'test' COLLATE utf8mb4_bin; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE uca1400_ai_ci AS c1'; +EXECUTE stmt USING _latin1'test' COLLATE latin1_bin; +SHOW CREATE TABLE t1; +DROP TABLE t1; + + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/ctype_cp1251.result mariadb-10.11.9/mysql-test/main/ctype_cp1251.result --- mariadb-10.11.6/mysql-test/main/ctype_cp1251.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_cp1251.result 2024-08-03 07:29:57.000000000 +0000 @@ -1543,8 +1543,8 @@ `c1` varchar(10) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -1553,8 +1553,8 @@ `c1` varchar(10) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))); -hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) +select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)'))) as c1; show create table t1; @@ -1563,8 +1563,8 @@ `c1` varchar(10) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 30 create table t1 as select concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -1573,8 +1573,8 @@ `c1` varchar(10) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))); -hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) +select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) as exp; +exp 31 create table t1 as select concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))'))) as c1; show create table t1; @@ -1583,8 +1583,8 @@ `c1` varchar(10) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))); -hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) +select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) as exp; +exp 30 create table t1 as select concat(IsEmpty(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -1593,8 +1593,8 @@ `c1` varchar(21) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))); -hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) +select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) as exp; +exp 31 create table t1 as select concat(IsSimple(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -1603,8 +1603,8 @@ `c1` varchar(2) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))); -hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) +select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) as exp; +exp 30 create table t1 as select concat(IsClosed(GeomFromText('LineString(1 1,2 2)'))) as c1; show create table t1; @@ -1613,13 +1613,13 @@ `c1` varchar(2) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))); -hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) +select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) as exp; +exp 31 create table t1 as select concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)'))) as c1; drop table t1; -select hex(concat(x(GeomFromText('Point(1 2)')))); -hex(concat(x(GeomFromText('Point(1 2)')))) +select hex(concat(x(GeomFromText('Point(1 2)')))) as exp; +exp 31 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1628,8 +1628,8 @@ `c1` varchar(23) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(y(GeomFromText('Point(1 2)')))); -hex(concat(y(GeomFromText('Point(1 2)')))) +select hex(concat(y(GeomFromText('Point(1 2)')))) as exp; +exp 32 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1638,8 +1638,8 @@ `c1` varchar(23) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))); -hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) +select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) as exp; +exp 31 create table t1 as select concat(GLength(GeomFromText('LineString(1 2, 2 2)'))) as c1; show create table t1; @@ -1648,8 +1648,8 @@ `c1` varchar(23) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))); -hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) +select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) as exp; +exp 31 create table t1 as select concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))'))) as c1; show create table t1; @@ -1658,8 +1658,8 @@ `c1` varchar(23) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GeometryType(GeomFromText('Point(1 2)')))); -hex(concat(GeometryType(GeomFromText('Point(1 2)')))) +select hex(concat(GeometryType(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E54 create table t1 as select concat(GeometryType(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1668,8 +1668,8 @@ `c1` varchar(20) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(AsText(GeomFromText('Point(1 2)')))); -hex(concat(AsText(GeomFromText('Point(1 2)')))) +select hex(concat(AsText(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E542831203229 create table t1 as select concat(AsText(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1938,8 +1938,8 @@ `c1` varchar(10) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))); -hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) +select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) as exp; +exp 32343A30303A3030 create table t1 as select concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00')) as c1; show create table t1; @@ -1978,8 +1978,8 @@ `c1` varchar(19) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))); -hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) +select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) as exp; +exp 323030332D31322D33312032303A30303A3030 create table t1 as select concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00')) as c1; show create table t1; @@ -1988,8 +1988,8 @@ `c1` varchar(19) CHARACTER SET cp1251 COLLATE cp1251_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))); -hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) +select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) as exp; +exp 323030342D30312D30322031323A30303A3030 create table t1 as select concat(date_add('2004-01-01 12:00:00', interval 1 day)) as c1; show create table t1; diff -Nru mariadb-10.11.6/mysql-test/main/ctype_cp932.result mariadb-10.11.9/mysql-test/main/ctype_cp932.result --- mariadb-10.11.6/mysql-test/main/ctype_cp932.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_cp932.result 2024-08-03 07:29:57.000000000 +0000 @@ -135,20 +135,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp932_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp932_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp932_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -273,20 +273,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp932_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp932_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp932_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp932_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp932_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -412,20 +412,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp932_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp932_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp932_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp932_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp932_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp932_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp932_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp932_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp932_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -550,20 +550,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp932_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp932_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp932_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp932_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp932_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp932_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp932_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp932_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp932_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp932_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -888,7 +888,7 @@ EXECUTE IMMEDIATE CONCAT('SET STATEMENT ',@seq, '.a=1 SELECT 1'); ERROR HY000: Invalid cp932 character string: '\x81\xAD' EXECUTE IMMEDIATE CONCAT('SET STATEMENT a.',@seq, '=1 SELECT 1'); -ERROR HY000: Invalid cp932 character string: '\x81\xAD' +ERROR HY000: Invalid cp932 character string: '\x81' # # SET SESSION (bad|good.bad|bad.good)=1 # @@ -897,7 +897,7 @@ EXECUTE IMMEDIATE CONCAT('SET SESSION ',@seq, '.a=1 SELECT 1'); ERROR HY000: Invalid cp932 character string: '\x81\xAD' EXECUTE IMMEDIATE CONCAT('SET SESSION a.',@seq, '=1 SELECT 1'); -ERROR HY000: Invalid cp932 character string: '\x81\xAD' +ERROR HY000: Invalid cp932 character string: '\x81' # # SET (bad|good.bad|bad.good)=1 # @@ -906,7 +906,7 @@ EXECUTE IMMEDIATE CONCAT('SET ', @seq, '.a=1'); ERROR HY000: Invalid cp932 character string: '\x81\xAD' EXECUTE IMMEDIATE CONCAT('SET a.', @seq, '=1'); -ERROR HY000: Invalid cp932 character string: '\x81\xAD' +ERROR HY000: Invalid cp932 character string: '\x81' # # Oracle SP call: BEGIN (bad|good.bad|bad.good)(params); END # @@ -916,7 +916,7 @@ EXECUTE IMMEDIATE CONCAT('BEGIN ',@seq, '.a(1); END;'); ERROR HY000: Invalid cp932 character string: '\x81\xAD' EXECUTE IMMEDIATE CONCAT('BEGIN a.',@seq, '(1); END;'); -ERROR HY000: Invalid cp932 character string: '\x81\xAD' +ERROR HY000: Invalid cp932 character string: '\x81' # # Oracle assignment: (bad|good.bad|bad.good):= value # @@ -925,7 +925,7 @@ EXECUTE IMMEDIATE CONCAT(@seq, '.a:=1'); ERROR HY000: Invalid cp932 character string: '\x81\xAD' EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); -ERROR HY000: Invalid cp932 character string: '\x81\xAD' +ERROR HY000: Invalid cp932 character string: '\x81' SET sql_mode=DEFAULT; # # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_cp932.test mariadb-10.11.9/mysql-test/main/ctype_cp932.test --- mariadb-10.11.6/mysql-test/main/ctype_cp932.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_cp932.test 2024-08-03 07:29:57.000000000 +0000 @@ -4,9 +4,6 @@ --echo # USED. --echo # -#remove this include in 10.6 version ---source include/no_view_protocol.inc - SET @old_character_set_client= @@character_set_client; SET @old_character_set_connection= @@character_set_connection; SET @old_character_set_results= @@character_set_results; diff -Nru mariadb-10.11.6/mysql-test/main/ctype_eucjpms.result mariadb-10.11.9/mysql-test/main/ctype_eucjpms.result --- mariadb-10.11.6/mysql-test/main/ctype_eucjpms.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_eucjpms.result 2024-08-03 07:29:57.000000000 +0000 @@ -34304,20 +34304,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'eucjpms_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'eucjpms_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'eucjpms_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -34442,20 +34442,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'eucjpms_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'eucjpms_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'eucjpms_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'eucjpms_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -34581,20 +34581,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'eucjpms_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'eucjpms_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'eucjpms_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'eucjpms_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'eucjpms_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'eucjpms_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'eucjpms_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'eucjpms_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'eucjpms_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -34719,20 +34719,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'eucjpms_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'eucjpms_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'eucjpms_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'eucjpms_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'eucjpms_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'eucjpms_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'eucjpms_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'eucjpms_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'eucjpms_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'eucjpms_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_euckr.result mariadb-10.11.9/mysql-test/main/ctype_euckr.result --- mariadb-10.11.6/mysql-test/main/ctype_euckr.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_euckr.result 2024-08-03 07:29:57.000000000 +0000 @@ -25817,20 +25817,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'euckr_korean_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'euckr_korean_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'euckr_korean_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -25955,20 +25955,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'euckr_korean_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'euckr_korean_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'euckr_korean_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'euckr_korean_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'euckr_korean_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -26094,20 +26094,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'euckr_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'euckr_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'euckr_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'euckr_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'euckr_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'euckr_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'euckr_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'euckr_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'euckr_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -26232,20 +26232,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'euckr_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'euckr_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'euckr_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'euckr_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'euckr_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'euckr_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'euckr_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'euckr_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'euckr_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'euckr_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_gb2312.result mariadb-10.11.9/mysql-test/main/ctype_gb2312.result --- mariadb-10.11.6/mysql-test/main/ctype_gb2312.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_gb2312.result 2024-08-03 07:29:57.000000000 +0000 @@ -4805,20 +4805,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gb2312_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gb2312_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gb2312_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4943,20 +4943,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gb2312_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gb2312_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gb2312_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gb2312_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_chinese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5082,20 +5082,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gb2312_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gb2312_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gb2312_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gb2312_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gb2312_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gb2312_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gb2312_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gb2312_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gb2312_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5220,20 +5220,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gb2312_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gb2312_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gb2312_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gb2312_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gb2312_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gb2312_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gb2312_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gb2312_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gb2312_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gb2312_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_gbk.result mariadb-10.11.9/mysql-test/main/ctype_gbk.result --- mariadb-10.11.6/mysql-test/main/ctype_gbk.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_gbk.result 2024-08-03 07:29:57.000000000 +0000 @@ -6273,20 +6273,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gbk_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gbk_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gbk_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6411,20 +6411,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gbk_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gbk_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gbk_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gbk_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gbk_chinese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6550,20 +6550,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gbk_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gbk_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gbk_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gbk_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gbk_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gbk_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gbk_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gbk_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gbk_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6688,20 +6688,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'gbk_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'gbk_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'gbk_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'gbk_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'gbk_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'gbk_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'gbk_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'gbk_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'gbk_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'gbk_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_gbk.test mariadb-10.11.9/mysql-test/main/ctype_gbk.test --- mariadb-10.11.6/mysql-test/main/ctype_gbk.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_gbk.test 2024-08-03 07:29:57.000000000 +0000 @@ -449,13 +449,10 @@ --echo # --echo # MDEV-7661 Unexpected result for: CAST(0xHHHH AS CHAR CHARACTER SET xxx) for incorrect byte sequences --echo # -#enable after fix MDEV-27871 ---disable_view_protocol set sql_mode=''; SELECT HEX(CAST(0xA341 AS CHAR CHARACTER SET gb2312)) as exp; SELECT HEX(CONVERT(CAST(0xA341 AS CHAR CHARACTER SET gb2312) USING utf8)) as exp; set sql_mode=default; ---enable_view_protocol --echo # --echo # End of 10.1 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_latin1.result mariadb-10.11.9/mysql-test/main/ctype_latin1.result --- mariadb-10.11.6/mysql-test/main/ctype_latin1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_latin1.result 2024-08-03 07:29:57.000000000 +0000 @@ -518,8 +518,8 @@ SELECT @@character_set_connection, HEX(CAST(_utf8'÷' AS CHAR)); @@character_set_connection HEX(CAST(_utf8'÷' AS CHAR)) latin1 F7 -SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)); -STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) +SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) as exp; +exp 2001-01-01 CREATE TABLE t1 AS SELECT REPEAT(' ', 64) AS subject, REPEAT(' ',64) AS pattern LIMIT 0; SHOW COLUMNS FROM t1; @@ -1852,8 +1852,8 @@ `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -1862,8 +1862,8 @@ `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))); -hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) +select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)'))) as c1; show create table t1; @@ -1872,8 +1872,8 @@ `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 30 create table t1 as select concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -1882,8 +1882,8 @@ `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))); -hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) +select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) as exp; +exp 31 create table t1 as select concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))'))) as c1; show create table t1; @@ -1892,8 +1892,8 @@ `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))); -hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) +select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) as exp; +exp 30 create table t1 as select concat(IsEmpty(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -1902,8 +1902,8 @@ `c1` varchar(21) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))); -hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) +select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) as exp; +exp 31 create table t1 as select concat(IsSimple(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -1912,8 +1912,8 @@ `c1` varchar(2) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))); -hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) +select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) as exp; +exp 30 create table t1 as select concat(IsClosed(GeomFromText('LineString(1 1,2 2)'))) as c1; show create table t1; @@ -1922,13 +1922,13 @@ `c1` varchar(2) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))); -hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) +select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) as exp; +exp 31 create table t1 as select concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)'))) as c1; drop table t1; -select hex(concat(x(GeomFromText('Point(1 2)')))); -hex(concat(x(GeomFromText('Point(1 2)')))) +select hex(concat(x(GeomFromText('Point(1 2)')))) as exp; +exp 31 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1937,8 +1937,8 @@ `c1` varchar(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(y(GeomFromText('Point(1 2)')))); -hex(concat(y(GeomFromText('Point(1 2)')))) +select hex(concat(y(GeomFromText('Point(1 2)')))) as exp; +exp 32 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1947,8 +1947,8 @@ `c1` varchar(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))); -hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) +select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) as exp; +exp 31 create table t1 as select concat(GLength(GeomFromText('LineString(1 2, 2 2)'))) as c1; show create table t1; @@ -1957,8 +1957,8 @@ `c1` varchar(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))); -hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) +select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) as exp; +exp 31 create table t1 as select concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))'))) as c1; show create table t1; @@ -1967,8 +1967,8 @@ `c1` varchar(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GeometryType(GeomFromText('Point(1 2)')))); -hex(concat(GeometryType(GeomFromText('Point(1 2)')))) +select hex(concat(GeometryType(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E54 create table t1 as select concat(GeometryType(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -1977,8 +1977,8 @@ `c1` varchar(20) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(AsText(GeomFromText('Point(1 2)')))); -hex(concat(AsText(GeomFromText('Point(1 2)')))) +select hex(concat(AsText(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E542831203229 create table t1 as select concat(AsText(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -2247,8 +2247,8 @@ `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))); -hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) +select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) as exp; +exp 32343A30303A3030 create table t1 as select concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00')) as c1; show create table t1; @@ -2287,8 +2287,8 @@ `c1` varchar(19) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))); -hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) +select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) as exp; +exp 323030332D31322D33312032303A30303A3030 create table t1 as select concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00')) as c1; show create table t1; @@ -2297,8 +2297,8 @@ `c1` varchar(19) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))); -hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) +select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) as exp; +exp 323030342D30312D30322031323A30303A3030 create table t1 as select concat(date_add('2004-01-01 12:00:00', interval 1 day)) as c1; show create table t1; @@ -8404,20 +8404,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8542,20 +8542,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8681,20 +8681,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8819,20 +8819,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_latin1.test mariadb-10.11.9/mysql-test/main/ctype_latin1.test --- mariadb-10.11.6/mysql-test/main/ctype_latin1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_latin1.test 2024-08-03 07:29:57.000000000 +0000 @@ -139,8 +139,10 @@ --echo # --echo # Bug#58022 ... like ... escape export_set ( ... ) crashes when export_set returns warnings --echo # +#view-protocol doubles warning message +--disable_view_protocol SELECT '' LIKE '' ESCAPE EXPORT_SET(1, 1, 1, 1, ''); - +--enable_view_protocol --echo End of 5.1 tests @@ -223,6 +225,8 @@ --echo # MDEV-6752 Trailing incomplete characters are not replaced to question marks on conversion --echo # SET NAMES utf8, character_set_connection=latin1; + +--disable_service_connection SELECT 'Â'; SELECT HEX('Â'); SELECT HEX(CAST('Â' AS CHAR CHARACTER SET utf8)); @@ -241,6 +245,7 @@ SHOW WARNINGS; SELECT HEX(a),a FROM t1; DROP TABLE t1; +--enable_service_connection --echo # --echo # MDEV-7629 Regression: Bit and hex string literals changed column names in 10.0.14 diff -Nru mariadb-10.11.6/mysql-test/main/ctype_ldml.result mariadb-10.11.9/mysql-test/main/ctype_ldml.result --- mariadb-10.11.6/mysql-test/main/ctype_ldml.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_ldml.result 2024-08-03 07:29:57.000000000 +0000 @@ -83,50 +83,50 @@ c1 a drop table t1; -SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_ci)); -hex(weight_string(_utf8mb4'a' collate utf8mb4_test_ci)) +SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_ci)) as exp; +exp 120F -SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 314A -SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)); -hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci) hex(lower(@a)) +SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)) as exp; +hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci) exp F0909080 F09090A8 -SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)); -hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_ci) hex(upper(@a)) +SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)) as exp; +hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_ci) exp F09090A8 F0909080 -SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)); -hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_ci) hex(lower(@a)) +SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)) as exp; +hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_ci) exp E2B080 E2B0B0 -SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)); -hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_ci) hex(upper(@a)) +SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)) as exp; +hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_ci) exp E2B0B0 E2B080 -SELECT hex(weight_string(convert(_utf32 0x61 using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_utf32 0x61 using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_utf32 0x61 using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 120F -SELECT hex(weight_string(convert(_utf32 0x62 using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_utf32 0x62 using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_utf32 0x62 using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 120F -SELECT hex(weight_string(convert(_utf32 0x10062 using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_utf32 0x10062 using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_utf32 0x10062 using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 120F -SELECT hex(weight_string(convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 30D2 -SELECT hex(weight_string(convert(_utf32 0x100400 using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_utf32 0x100400 using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_utf32 0x100400 using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 30D2 -SELECT hex(weight_string(_utf8mb4 0x64 collate utf8mb4_test_ci)); -hex(weight_string(_utf8mb4 0x64 collate utf8mb4_test_ci)) +SELECT hex(weight_string(_utf8mb4 0x64 collate utf8mb4_test_ci)) as exp; +exp 1250 -SELECT hex(weight_string(convert(_ucs2 0x0064017e using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_ucs2 0x0064017e using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_ucs2 0x0064017e using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 1251 -SELECT hex(weight_string(convert(_ucs2 0x0044017e using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_ucs2 0x0044017e using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_ucs2 0x0044017e using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 1251 -SELECT hex(weight_string(convert(_ucs2 0x0044017d using utf8mb4) collate utf8mb4_test_ci)); -hex(weight_string(convert(_ucs2 0x0044017d using utf8mb4) collate utf8mb4_test_ci)) +SELECT hex(weight_string(convert(_ucs2 0x0044017d using utf8mb4) collate utf8mb4_test_ci)) as exp; +exp 1251 CREATE TABLE t1 ( col1 varchar(100) character set utf8 collate utf8_test_ci @@ -533,23 +533,23 @@ Collation Charset Id Default Compiled Sortlen utf8mb3_phone_ci utf8mb3 352 8 SET NAMES utf8; -SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_400_ci)); -hex(weight_string(_utf8mb4'a' collate utf8mb4_test_400_ci)) +SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_400_ci)) as exp; +exp 0E33 -SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_400_ci)); -hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_400_ci)) +SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_400_ci)) as exp; +exp FFFD -SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)); -hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci) hex(lower(@a)) +SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)) as exp; +hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci) exp F0909080 F0909080 -SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)); -hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci) hex(upper(@a)) +SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)) as exp; +hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci) exp F09090A8 F09090A8 -SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)); -hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci) hex(lower(@a)) +SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)) as exp; +hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci) exp E2B080 E2B080 -SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)); -hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci) hex(upper(@a)) +SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)) as exp; +hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci) exp E2B0B0 E2B0B0 # # WL#5624 Collation customization improvements @@ -1019,9 +1019,9 @@ 15D3 09B809CD E0A6B8E0A78D 15D4 09B909CD E0A6B9E0A78D SELECT HEX(WEIGHT_STRING(a)) as wa, -GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a) +GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a) as ha FROM t1 GROUP BY a ORDER BY a; -wa GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a) +wa ha 15A2 0985 15A3 0986 15A4 0987 diff -Nru mariadb-10.11.6/mysql-test/main/ctype_ldml.test mariadb-10.11.9/mysql-test/main/ctype_ldml.test --- mariadb-10.11.6/mysql-test/main/ctype_ldml.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_ldml.test 2024-08-03 07:29:57.000000000 +0000 @@ -3,9 +3,6 @@ --source include/have_utf16.inc --source include/have_utf32.inc -#remove this include after fix MDEV-27871 ---source include/no_view_protocol.inc - --disable_query_log call mtr.add_suppression("Charset id.*trying to replace"); --enable_query_log @@ -70,25 +67,25 @@ drop table t1; # make sure utf8_test_ci is Unicode-5.0.0 -SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_ci)); -SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)); -SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)); -SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)); -SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)); +SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_ci)) as exp; +SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)) as exp; +SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)) as exp; +SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_ci), hex(lower(@a)) as exp; +SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_ci), hex(upper(@a)) as exp; # check that it works with supplementary characters -SELECT hex(weight_string(convert(_utf32 0x61 using utf8mb4) collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_utf32 0x62 using utf8mb4) collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_utf32 0x10062 using utf8mb4) collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_utf32 0x100400 using utf8mb4) collate utf8mb4_test_ci)); +SELECT hex(weight_string(convert(_utf32 0x61 using utf8mb4) collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_utf32 0x62 using utf8mb4) collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_utf32 0x10062 using utf8mb4) collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_utf32 0x100400 using utf8mb4) collate utf8mb4_test_ci)) as exp; # check contractions with non-ascii characters -SELECT hex(weight_string(_utf8mb4 0x64 collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_ucs2 0x0064017e using utf8mb4) collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_ucs2 0x0044017e using utf8mb4) collate utf8mb4_test_ci)); -SELECT hex(weight_string(convert(_ucs2 0x0044017d using utf8mb4) collate utf8mb4_test_ci)); +SELECT hex(weight_string(_utf8mb4 0x64 collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_ucs2 0x0064017e using utf8mb4) collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_ucs2 0x0044017e using utf8mb4) collate utf8mb4_test_ci)) as exp; +SELECT hex(weight_string(convert(_ucs2 0x0044017d using utf8mb4) collate utf8mb4_test_ci)) as exp; # @@ -189,10 +186,12 @@ show collation like 'ucs2_vn_ci'; create table t1 (c1 char(1) character set ucs2 collate ucs2_vn_ci); insert into t1 values (0x0061); +--disable_view_protocol --enable_metadata set @@character_set_results=NULL; select * from t1; --disable_metadata +--enable_view_protocol drop table t1; # @@ -212,12 +211,12 @@ SET NAMES utf8; # make sure utf8mb4_test_400_ci is Unicode-4.0.0 based -SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_400_ci)); -SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_400_ci)); -SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)); -SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)); -SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)); -SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)); +SELECT hex(weight_string(_utf8mb4'a' collate utf8mb4_test_400_ci)) as exp; +SELECT hex(weight_string(convert(_utf32 0x10002 using utf8mb4) collate utf8mb4_test_400_ci)) as exp; +SELECT hex(@a:=convert(_utf32 0x10400 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)) as exp; +SELECT hex(@a:=convert(_utf32 0x10428 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)) as exp; +SELECT hex(@a:=convert(_utf32 0x2C00 using utf8mb4) collate utf8mb4_test_400_ci), hex(lower(@a)) as exp; +SELECT hex(@a:=convert(_utf32 0x2C30 using utf8mb4) collate utf8mb4_test_400_ci), hex(upper(@a)) as exp; --echo # --echo # WL#5624 Collation customization improvements @@ -281,9 +280,14 @@ SET NAMES utf8 COLLATE utf8_5624_2; SHOW WARNINGS; +# "--view-protocol" generates a dublicate error message in ctype_ldml_log.err +# In one of the following cases, the number of similar error messages is counted, +# so doubling the error causes the case to fail +--disable_view_protocol --error ER_UNKNOWN_COLLATION SELECT _utf8'test' COLLATE utf8_5624_2; SHOW WARNINGS; +--enable_view_protocol --echo # --echo # WL#5624, reset before primary ignorable @@ -354,7 +358,7 @@ SELECT HEX(WEIGHT_STRING(a)), HEX(CONVERT(a USING ucs2)), HEX(a) FROM t1 ORDER BY a, BINARY(a); SELECT HEX(WEIGHT_STRING(a)) as wa, -GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a) +GROUP_CONCAT(HEX(CONVERT(a USING ucs2)) ORDER BY LENGTH(a), BINARY a) as ha FROM t1 GROUP BY a ORDER BY a; DROP TABLE t1; @@ -406,7 +410,6 @@ close(FILE); EOF - --echo # --echo # MDEV-8686 A user defined collation utf8_confusables doesn't work --echo # @@ -509,6 +512,7 @@ DROP TABLE t1; +--disable_service_connection SET NAMES utf8 COLLATE utf8_czech_test_w2; CREATE TABLE t1 AS SELECT SPACE(10) AS c1 LIMIT 0; --source include/ctype_unicode_latin.inc @@ -610,6 +614,7 @@ --error ER_UNKNOWN_COLLATION SELECT 'a' COLLATE utf8_czech_test_bad_w2; +--enable_service_connection --echo # --echo # End of 10.2 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_nopad_8bit.result mariadb-10.11.9/mysql-test/main/ctype_nopad_8bit.result --- mariadb-10.11.6/mysql-test/main/ctype_nopad_8bit.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_nopad_8bit.result 2024-08-03 07:29:57.000000000 +0000 @@ -97,20 +97,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'dec8_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'dec8_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'dec8_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -235,20 +235,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'dec8_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'dec8_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'dec8_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'dec8_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'dec8_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -374,20 +374,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'dec8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'dec8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'dec8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'dec8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'dec8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'dec8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'dec8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'dec8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'dec8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -512,20 +512,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'dec8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'dec8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'dec8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'dec8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'dec8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'dec8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'dec8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'dec8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'dec8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'dec8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -652,20 +652,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp850_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp850_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp850_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp850_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp850_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp850_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp850_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp850_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp850_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -790,20 +790,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp850_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp850_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp850_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp850_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp850_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp850_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp850_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp850_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp850_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp850_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -929,20 +929,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp850_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp850_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp850_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp850_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp850_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp850_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp850_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp850_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp850_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -1067,20 +1067,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp850_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp850_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp850_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp850_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp850_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp850_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp850_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp850_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp850_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp850_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -1207,20 +1207,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hp8_english_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hp8_english_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hp8_english_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hp8_english_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hp8_english_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hp8_english_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hp8_english_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hp8_english_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hp8_english_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -1345,20 +1345,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hp8_english_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hp8_english_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hp8_english_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hp8_english_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hp8_english_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hp8_english_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hp8_english_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hp8_english_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hp8_english_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hp8_english_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -1484,20 +1484,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hp8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hp8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hp8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hp8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hp8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hp8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hp8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hp8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hp8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -1622,20 +1622,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hp8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hp8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hp8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hp8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hp8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hp8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hp8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hp8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hp8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hp8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -1762,20 +1762,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8r_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8r_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8r_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -1900,20 +1900,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8r_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8r_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8r_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8r_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -2039,20 +2039,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8r_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8r_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8r_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8r_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8r_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8r_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8r_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8r_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8r_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -2177,20 +2177,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8r_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8r_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8r_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8r_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8r_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8r_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8r_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8r_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8r_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8r_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -2317,20 +2317,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin2_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin2_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin2_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -2455,20 +2455,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin2_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin2_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin2_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin2_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -2594,20 +2594,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin2_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin2_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin2_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -2732,20 +2732,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin2_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin2_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin2_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin2_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -2872,20 +2872,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3010,20 +3010,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3149,20 +3149,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3287,20 +3287,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3427,20 +3427,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ascii_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ascii_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ascii_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ascii_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ascii_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ascii_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ascii_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ascii_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ascii_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3565,20 +3565,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ascii_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ascii_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ascii_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ascii_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ascii_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ascii_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ascii_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ascii_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ascii_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ascii_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3704,20 +3704,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ascii_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ascii_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ascii_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ascii_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ascii_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ascii_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ascii_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ascii_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ascii_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3842,20 +3842,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ascii_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ascii_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ascii_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ascii_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ascii_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ascii_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ascii_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ascii_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ascii_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ascii_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3982,20 +3982,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hebrew_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hebrew_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hebrew_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4120,20 +4120,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hebrew_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hebrew_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hebrew_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hebrew_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4259,20 +4259,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hebrew_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hebrew_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hebrew_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hebrew_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hebrew_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hebrew_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hebrew_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hebrew_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hebrew_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4397,20 +4397,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'hebrew_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'hebrew_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'hebrew_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'hebrew_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'hebrew_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'hebrew_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'hebrew_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'hebrew_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'hebrew_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'hebrew_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4537,20 +4537,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8u_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8u_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8u_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4675,20 +4675,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8u_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8u_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8u_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8u_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4814,20 +4814,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8u_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8u_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8u_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8u_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8u_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8u_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8u_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8u_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8u_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4952,20 +4952,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'koi8u_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'koi8u_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'koi8u_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'koi8u_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'koi8u_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'koi8u_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'koi8u_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'koi8u_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'koi8u_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'koi8u_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5092,20 +5092,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'greek_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'greek_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'greek_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'greek_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'greek_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'greek_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'greek_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'greek_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'greek_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5230,20 +5230,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'greek_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'greek_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'greek_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'greek_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'greek_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'greek_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'greek_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'greek_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'greek_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'greek_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5369,20 +5369,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'greek_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'greek_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'greek_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'greek_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'greek_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'greek_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'greek_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'greek_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'greek_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'greek_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'greek_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5507,20 +5507,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'greek_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'greek_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'greek_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'greek_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'greek_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'greek_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'greek_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'greek_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'greek_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'greek_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'greek_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'greek_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5647,20 +5647,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1250_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1250_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1250_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5785,20 +5785,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1250_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1250_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1250_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1250_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -5924,20 +5924,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1250_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1250_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1250_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1250_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1250_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1250_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1250_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1250_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1250_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6062,20 +6062,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1250_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1250_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1250_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1250_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1250_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1250_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1250_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1250_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1250_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1250_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6202,20 +6202,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1257_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1257_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1257_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6340,20 +6340,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1257_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1257_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1257_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1257_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6479,20 +6479,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1257_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1257_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1257_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1257_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1257_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1257_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1257_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1257_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1257_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6617,20 +6617,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1257_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1257_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1257_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1257_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1257_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1257_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1257_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1257_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1257_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1257_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6757,20 +6757,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin5_turkish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin5_turkish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin5_turkish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6895,20 +6895,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin5_turkish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin5_turkish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin5_turkish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin5_turkish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin5_turkish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -7034,20 +7034,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin5_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin5_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin5_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -7172,20 +7172,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin5_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin5_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin5_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin5_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -7312,20 +7312,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'armscii8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'armscii8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'armscii8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -7450,20 +7450,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'armscii8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'armscii8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'armscii8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'armscii8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -7589,20 +7589,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'armscii8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'armscii8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'armscii8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'armscii8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'armscii8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'armscii8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'armscii8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'armscii8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'armscii8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -7727,20 +7727,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'armscii8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'armscii8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'armscii8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'armscii8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'armscii8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'armscii8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'armscii8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'armscii8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'armscii8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'armscii8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -7867,20 +7867,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp866_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp866_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp866_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp866_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp866_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp866_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp866_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp866_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp866_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8005,20 +8005,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp866_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp866_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp866_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp866_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp866_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp866_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp866_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp866_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp866_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp866_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8144,20 +8144,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp866_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp866_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp866_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp866_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp866_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp866_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp866_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp866_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp866_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8282,20 +8282,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp866_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp866_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp866_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp866_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp866_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp866_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp866_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp866_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp866_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp866_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8422,20 +8422,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'keybcs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'keybcs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'keybcs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8560,20 +8560,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'keybcs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'keybcs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'keybcs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'keybcs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8699,20 +8699,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'keybcs2_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'keybcs2_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'keybcs2_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'keybcs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'keybcs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'keybcs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'keybcs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'keybcs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'keybcs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8837,20 +8837,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'keybcs2_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'keybcs2_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'keybcs2_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'keybcs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'keybcs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'keybcs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'keybcs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'keybcs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'keybcs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'keybcs2_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -8977,20 +8977,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macce_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macce_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macce_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macce_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macce_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macce_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macce_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macce_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macce_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -9115,20 +9115,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macce_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macce_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macce_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macce_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macce_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macce_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macce_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macce_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macce_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macce_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -9254,20 +9254,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macce_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macce_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macce_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macce_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macce_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macce_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macce_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macce_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macce_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macce_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macce_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -9392,20 +9392,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macce_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macce_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macce_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macce_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macce_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macce_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macce_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macce_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macce_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macce_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macce_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macce_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -9532,20 +9532,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macroman_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macroman_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macroman_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macroman_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macroman_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macroman_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macroman_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macroman_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macroman_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -9670,20 +9670,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macroman_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macroman_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macroman_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macroman_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macroman_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macroman_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macroman_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macroman_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macroman_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macroman_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -9809,20 +9809,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macroman_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macroman_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macroman_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macroman_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macroman_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macroman_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macroman_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macroman_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macroman_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -9947,20 +9947,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'macroman_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'macroman_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'macroman_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'macroman_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'macroman_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'macroman_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'macroman_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'macroman_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'macroman_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'macroman_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10087,20 +10087,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp852_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp852_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp852_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp852_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp852_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp852_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp852_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp852_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp852_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10225,20 +10225,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp852_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp852_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp852_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp852_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp852_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp852_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp852_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp852_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp852_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp852_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10364,20 +10364,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp852_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp852_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp852_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp852_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp852_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp852_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp852_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp852_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp852_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10502,20 +10502,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp852_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp852_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp852_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp852_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp852_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp852_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp852_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp852_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp852_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp852_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10642,20 +10642,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin7_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin7_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin7_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin7_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin7_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin7_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin7_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin7_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin7_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10780,20 +10780,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin7_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin7_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin7_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin7_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin7_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin7_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin7_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin7_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin7_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin7_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10919,20 +10919,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin7_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin7_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin7_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11057,20 +11057,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin7_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin7_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin7_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin7_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11197,20 +11197,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1251_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1251_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1251_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11335,20 +11335,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1251_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1251_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1251_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1251_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11474,20 +11474,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1251_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1251_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1251_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1251_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1251_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1251_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1251_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1251_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1251_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11612,20 +11612,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1251_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1251_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1251_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1251_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1251_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1251_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1251_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1251_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1251_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1251_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11752,20 +11752,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1256_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1256_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1256_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11890,20 +11890,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1256_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1256_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1256_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1256_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -12029,20 +12029,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1256_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1256_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1256_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1256_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1256_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1256_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1256_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1256_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1256_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -12167,20 +12167,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'cp1256_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'cp1256_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'cp1256_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'cp1256_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'cp1256_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'cp1256_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'cp1256_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'cp1256_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'cp1256_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'cp1256_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -12307,20 +12307,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'geostd8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'geostd8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'geostd8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -12445,20 +12445,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'geostd8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'geostd8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'geostd8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'geostd8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -12584,20 +12584,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'geostd8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'geostd8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'geostd8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'geostd8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'geostd8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'geostd8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'geostd8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'geostd8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'geostd8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -12722,20 +12722,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'geostd8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'geostd8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'geostd8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'geostd8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'geostd8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'geostd8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'geostd8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'geostd8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'geostd8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'geostd8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_sjis.result mariadb-10.11.9/mysql-test/main/ctype_sjis.result --- mariadb-10.11.6/mysql-test/main/ctype_sjis.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_sjis.result 2024-08-03 07:29:57.000000000 +0000 @@ -218,8 +218,8 @@ SELECT @@character_set_connection, HEX(CAST(_utf8'÷' AS CHAR)); @@character_set_connection HEX(CAST(_utf8'÷' AS CHAR)) sjis 8180 -SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)); -STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) +SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) as exp; +exp 2001-01-01 CREATE TABLE t1 AS SELECT REPEAT(' ', 64) AS subject, REPEAT(' ',64) AS pattern LIMIT 0; SHOW COLUMNS FROM t1; @@ -19109,20 +19109,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'sjis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'sjis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'sjis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -19247,20 +19247,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'sjis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'sjis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'sjis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'sjis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'sjis_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -19386,20 +19386,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'sjis_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'sjis_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'sjis_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'sjis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'sjis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'sjis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'sjis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'sjis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'sjis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -19524,20 +19524,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'sjis_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'sjis_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'sjis_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'sjis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'sjis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'sjis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'sjis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'sjis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'sjis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'sjis_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -19619,7 +19619,7 @@ EXECUTE IMMEDIATE CONCAT('SET STATEMENT ',@seq, '.a=1 SELECT 1'); ERROR HY000: Invalid sjis character string: '_x81_xAD' EXECUTE IMMEDIATE CONCAT('SET STATEMENT a.',@seq, '=1 SELECT 1'); -ERROR HY000: Invalid sjis character string: '_x81_xAD' +ERROR HY000: Invalid sjis character string: '_x81' # # SET SESSION (bad|good.bad|bad.good)=1 # @@ -19628,7 +19628,7 @@ EXECUTE IMMEDIATE CONCAT('SET SESSION ',@seq, '.a=1 SELECT 1'); ERROR HY000: Invalid sjis character string: '_x81_xAD' EXECUTE IMMEDIATE CONCAT('SET SESSION a.',@seq, '=1 SELECT 1'); -ERROR HY000: Invalid sjis character string: '_x81_xAD' +ERROR HY000: Invalid sjis character string: '_x81' # # SET (bad|good.bad|bad.good)=1 # @@ -19637,7 +19637,7 @@ EXECUTE IMMEDIATE CONCAT('SET ', @seq, '.a=1'); ERROR HY000: Invalid sjis character string: '_x81_xAD' EXECUTE IMMEDIATE CONCAT('SET a.', @seq, '=1'); -ERROR HY000: Invalid sjis character string: '_x81_xAD' +ERROR HY000: Invalid sjis character string: '_x81' # # Oracle SP call: BEGIN (bad|good.bad|bad.good)(params); END # @@ -19647,7 +19647,7 @@ EXECUTE IMMEDIATE CONCAT('BEGIN ',@seq, '.a(1); END;'); ERROR HY000: Invalid sjis character string: '_x81_xAD' EXECUTE IMMEDIATE CONCAT('BEGIN a.',@seq, '(1); END;'); -ERROR HY000: Invalid sjis character string: '_x81_xAD' +ERROR HY000: Invalid sjis character string: '_x81' # # Oracle assignment: (bad|good.bad|bad.good):= value # @@ -19656,7 +19656,7 @@ EXECUTE IMMEDIATE CONCAT(@seq, '.a:=1'); ERROR HY000: Invalid sjis character string: '_x81_xAD' EXECUTE IMMEDIATE CONCAT('a.', @seq, ':=1'); -ERROR HY000: Invalid sjis character string: '_x81_xAD' +ERROR HY000: Invalid sjis character string: '_x81' SET sql_mode=DEFAULT; # # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_swe7.result mariadb-10.11.9/mysql-test/main/ctype_swe7.result --- mariadb-10.11.6/mysql-test/main/ctype_swe7.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_swe7.result 2024-08-03 07:29:57.000000000 +0000 @@ -3173,20 +3173,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3311,20 +3311,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3450,20 +3450,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3588,20 +3588,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'swe7_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'swe7_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'swe7_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'swe7_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_tis620.result mariadb-10.11.9/mysql-test/main/ctype_tis620.result --- mariadb-10.11.6/mysql-test/main/ctype_tis620.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_tis620.result 2024-08-03 07:29:57.000000000 +0000 @@ -4001,20 +4001,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'tis620_thai_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'tis620_thai_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'tis620_thai_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4139,20 +4139,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'tis620_thai_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'tis620_thai_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'tis620_thai_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'tis620_thai_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'tis620_thai_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4278,20 +4278,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'tis620_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'tis620_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'tis620_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'tis620_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'tis620_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'tis620_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'tis620_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'tis620_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'tis620_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4416,20 +4416,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'tis620_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'tis620_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'tis620_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'tis620_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'tis620_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'tis620_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'tis620_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'tis620_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'tis620_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'tis620_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_uca.result mariadb-10.11.9/mysql-test/main/ctype_uca.result --- mariadb-10.11.6/mysql-test/main/ctype_uca.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_uca.result 2024-08-03 07:29:57.000000000 +0000 @@ -10021,8 +10021,8 @@ (_ucs2 0x1011103910191004103A1038 /* cooked rice */), (_ucs2 0x101C1000103A10181000103A), (_ucs2 0x101C103910181000103A /* tea */); -SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) FROM t1 ORDER BY id; -id IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) +SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) as exp FROM t1 ORDER BY id; +id exp 1 2259 108C 2 22593ACB 1037 3 22593ACC 1038 @@ -12597,8 +12597,8 @@ (_ucs2 0x1011103910191004103A1038 /* cooked rice */), (_ucs2 0x101C1000103A10181000103A), (_ucs2 0x101C103910181000103A /* tea */); -SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) FROM t1 ORDER BY id; -id IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) +SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) as exp FROM t1 ORDER BY id; +id exp 1 2259 108C 2 22593ACB 1037 3 22593ACC 1038 @@ -15370,3 +15370,39 @@ # # End of MariaDB-10.2 tests # +# +# Start of 10.5 tests +# +# +# MDEV-34417 Wrong result set with utf8mb4_danish_ci and BNLH join +# +CREATE TABLE t1 (a VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_danish_ci); +INSERT INTO t1 VALUES ('aaaa'),('åå'); +SELECT * FROM t1 WHERE a='aaaa'; +a +aaaa +åå +SET join_cache_level=1; +SELECT * FROM t1 NATURAL JOIN t1 t2; +a +aaaa +åå +aaaa +åå +# Expect a BNHL join +SET join_cache_level=3; +EXPLAIN SELECT * FROM t1 NATURAL JOIN t1 t2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where +1 SIMPLE t2 hash_ALL NULL #hash#$hj 2003 test.t1.a 2 Using where; Using join buffer (flat, BNLH join) +SELECT * FROM t1 NATURAL JOIN t1 t2; +a +aaaa +åå +aaaa +åå +DROP TABLE t1; +SET join_cache_level=DEFAULT; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/ctype_uca.test mariadb-10.11.9/mysql-test/main/ctype_uca.test --- mariadb-10.11.6/mysql-test/main/ctype_uca.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_uca.test 2024-08-03 07:29:57.000000000 +0000 @@ -696,3 +696,32 @@ --echo # --echo # End of MariaDB-10.2 tests --echo # + + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-34417 Wrong result set with utf8mb4_danish_ci and BNLH join +--echo # + +CREATE TABLE t1 (a VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_danish_ci); +INSERT INTO t1 VALUES ('aaaa'),('åå'); +SELECT * FROM t1 WHERE a='aaaa'; + +SET join_cache_level=1; +SELECT * FROM t1 NATURAL JOIN t1 t2; + +--echo # Expect a BNHL join +SET join_cache_level=3; +EXPLAIN SELECT * FROM t1 NATURAL JOIN t1 t2; +SELECT * FROM t1 NATURAL JOIN t1 t2; + +DROP TABLE t1; +SET join_cache_level=DEFAULT; + + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/ctype_ucs.result mariadb-10.11.9/mysql-test/main/ctype_ucs.result --- mariadb-10.11.6/mysql-test/main/ctype_ucs.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_ucs.result 2024-08-03 07:29:57.000000000 +0000 @@ -989,8 +989,8 @@ SELECT @@character_set_connection, HEX(CAST(_utf8'÷' AS CHAR)); @@character_set_connection HEX(CAST(_utf8'÷' AS CHAR)) ucs2 00F7 -SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)); -STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) +SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) as exp; +exp 2001-01-01 CREATE TABLE t1 AS SELECT REPEAT(' ', 64) AS subject, REPEAT(' ',64) AS pattern LIMIT 0; SHOW COLUMNS FROM t1; @@ -2736,8 +2736,8 @@ `c1` varchar(10) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 0032 create table t1 as select concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -2746,8 +2746,8 @@ `c1` varchar(10) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))); -hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) +select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) as exp; +exp 0032 create table t1 as select concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)'))) as c1; show create table t1; @@ -2756,8 +2756,8 @@ `c1` varchar(10) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 0030 create table t1 as select concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -2766,8 +2766,8 @@ `c1` varchar(10) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))); -hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) +select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) as exp; +exp 0031 create table t1 as select concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))'))) as c1; show create table t1; @@ -2776,8 +2776,8 @@ `c1` varchar(10) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))); -hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) +select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) as exp; +exp 0030 create table t1 as select concat(IsEmpty(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -2786,8 +2786,8 @@ `c1` varchar(21) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))); -hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) +select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) as exp; +exp 0031 create table t1 as select concat(IsSimple(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -2796,8 +2796,8 @@ `c1` varchar(2) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))); -hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) +select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) as exp; +exp 0030 create table t1 as select concat(IsClosed(GeomFromText('LineString(1 1,2 2)'))) as c1; show create table t1; @@ -2806,13 +2806,13 @@ `c1` varchar(2) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))); -hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) +select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) as exp; +exp 0031 create table t1 as select concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)'))) as c1; drop table t1; -select hex(concat(x(GeomFromText('Point(1 2)')))); -hex(concat(x(GeomFromText('Point(1 2)')))) +select hex(concat(x(GeomFromText('Point(1 2)')))) as exp; +exp 0031 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -2821,8 +2821,8 @@ `c1` varchar(23) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(y(GeomFromText('Point(1 2)')))); -hex(concat(y(GeomFromText('Point(1 2)')))) +select hex(concat(y(GeomFromText('Point(1 2)')))) as exp; +exp 0032 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -2831,8 +2831,8 @@ `c1` varchar(23) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))); -hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) +select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) as exp; +exp 0031 create table t1 as select concat(GLength(GeomFromText('LineString(1 2, 2 2)'))) as c1; show create table t1; @@ -2841,8 +2841,8 @@ `c1` varchar(23) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))); -hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) +select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) as exp; +exp 0031 create table t1 as select concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))'))) as c1; show create table t1; @@ -2851,8 +2851,8 @@ `c1` varchar(23) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GeometryType(GeomFromText('Point(1 2)')))); -hex(concat(GeometryType(GeomFromText('Point(1 2)')))) +select hex(concat(GeometryType(GeomFromText('Point(1 2)')))) as exp; +exp 0050004F0049004E0054 create table t1 as select concat(GeometryType(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -2861,8 +2861,8 @@ `c1` varchar(20) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(AsText(GeomFromText('Point(1 2)')))); -hex(concat(AsText(GeomFromText('Point(1 2)')))) +select hex(concat(AsText(GeomFromText('Point(1 2)')))) as exp; +exp 0050004F0049004E005400280031002000320029 create table t1 as select concat(AsText(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -3131,8 +3131,8 @@ `c1` varchar(10) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))); -hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) +select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) as exp; +exp 00320034003A00300030003A00300030 create table t1 as select concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00')) as c1; show create table t1; @@ -3171,8 +3171,8 @@ `c1` varchar(19) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))); -hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) +select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) as exp; +exp 0032003000300033002D00310032002D00330031002000320030003A00300030003A00300030 create table t1 as select concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00')) as c1; show create table t1; @@ -3181,8 +3181,8 @@ `c1` varchar(19) CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))); -hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) +select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) as exp; +exp 0032003000300034002D00300031002D00300032002000310032003A00300030003A00300030 create table t1 as select concat(date_add('2004-01-01 12:00:00', interval 1 day)) as c1; show create table t1; @@ -5872,20 +5872,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -6010,20 +6010,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_general_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -6149,20 +6149,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -6287,20 +6287,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_nopad_bin', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -6520,5 +6520,25 @@ ERROR 42000: COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'ucs2' SET NAMES utf8; # +# MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion +# +SET NAMES utf8mb3, @@collation_connection=ucs2_general_ci; +CREATE TABLE t1 (c VARCHAR(10)) CHARACTER SET ucs2; +INSERT INTO t1 VALUES ('a'),('A'); +CREATE OR REPLACE VIEW v1 AS +SELECT COUNT(*) AS cnt, GROUP_CONCAT(c) AS c1 FROM t1 GROUP BY c; +SELECT * FROM v1; +cnt c1 +2 a,A +SELECT HEX(c1) FROM v1; +HEX(c1) +0061002C0041 +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select count(0) AS `cnt`,group_concat(`t1`.`c` separator ',') AS `c1` from `t1` group by `t1`.`c` utf8mb3 ucs2_general_ci +DROP VIEW v1; +DROP TABLE t1; +SET NAMES utf8mb3; +# # End of 10.5 tests # diff -Nru mariadb-10.11.6/mysql-test/main/ctype_ucs.test mariadb-10.11.9/mysql-test/main/ctype_ucs.test --- mariadb-10.11.6/mysql-test/main/ctype_ucs.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_ucs.test 2024-08-03 07:29:57.000000000 +0000 @@ -613,6 +613,7 @@ # # Bug#22638 SOUNDEX broken for international characters # +--disable_service_connection set names latin1; set character_set_connection=ucs2; select soundex(''),soundex('he'),soundex('hello all folks'),soundex('#3556 in bugdb'); @@ -623,6 +624,7 @@ # Make sure that "U+00BF INVERTED QUESTION MARK" is not considered as letter select hex(soundex(_ucs2 0x00BF00C0)); set names latin1; +--enable_service_connection # # Bug #14290: character_maximum_length for text fields @@ -794,10 +796,12 @@ --echo # Start of 5.5 tests --echo # +--disable_service_connection SET NAMES latin1; SET collation_connection=ucs2_general_ci; --source include/ctype_numconv.inc SET NAMES latin1; +--enable_service_connection --echo # --echo # Bug #13832953 MY_STRNXFRM_UNICODE: ASSERTION `SRC' FAILED @@ -1035,8 +1039,10 @@ --echo # --echo # MDEV-9178 Wrong result for CAST(CONVERT('1IJ3' USING ucs2) AS SIGNED) --echo # +--disable_service_connection SET NAMES utf8; SELECT CAST(CONVERT('1IJ3' USING ucs2) AS SIGNED); +--enable_service_connection --echo # --echo # End of 10.1 tests @@ -1070,6 +1076,7 @@ --echo # --echo # MDEV-10866 Extend PREPARE and EXECUTE IMMEDIATE to understand expressions --echo # +--disable_service_connection SET NAMES utf8, collation_connection=ucs2_bin; SET @stmt='SELECT COLLATION(''a'')'; EXECUTE IMMEDIATE @stmt; @@ -1097,6 +1104,7 @@ PREPARE stmt FROM @stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; +--enable_service_connection --echo # --echo # End of 10.2 tests @@ -1194,5 +1202,22 @@ SET NAMES utf8; --echo # +--echo # MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion +--echo # + +SET NAMES utf8mb3, @@collation_connection=ucs2_general_ci; +CREATE TABLE t1 (c VARCHAR(10)) CHARACTER SET ucs2; +INSERT INTO t1 VALUES ('a'),('A'); +CREATE OR REPLACE VIEW v1 AS + SELECT COUNT(*) AS cnt, GROUP_CONCAT(c) AS c1 FROM t1 GROUP BY c; +SELECT * FROM v1; +SELECT HEX(c1) FROM v1; +SHOW CREATE VIEW v1; +DROP VIEW v1; +DROP TABLE t1; +SET NAMES utf8mb3; + + +--echo # --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/ctype_ucs2_uca.result mariadb-10.11.9/mysql-test/main/ctype_ucs2_uca.result --- mariadb-10.11.6/mysql-test/main/ctype_ucs2_uca.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_ucs2_uca.result 2024-08-03 07:29:57.000000000 +0000 @@ -100,20 +100,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -238,20 +238,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -377,20 +377,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -515,20 +515,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ucs2_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ucs2_unicode_520_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_ujis.result mariadb-10.11.9/mysql-test/main/ctype_ujis.result --- mariadb-10.11.6/mysql-test/main/ctype_ujis.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_ujis.result 2024-08-03 07:29:57.000000000 +0000 @@ -322,14 +322,14 @@ select locate(_ujis 0xa1a3,_ujis 0xa1a2a1a3); locate(_ujis 0xa1a3,_ujis 0xa1a2a1a3) 2 -select 0xa1a2a1a3 like concat(_binary'%',0xa2a1,_binary'%'); -0xa1a2a1a3 like concat(_binary'%',0xa2a1,_binary'%') +select 0xa1a2a1a3 like concat(_binary'%',0xa2a1,_binary'%') as exp; +exp 1 -select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%'); -_ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') +select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') as exp; +exp 0 -select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') collate ujis_bin; -_ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') collate ujis_bin +select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') collate ujis_bin as exp; +exp 0 select 'a' like 'a'; 'a' like 'a' @@ -2810,8 +2810,8 @@ # Bug#57257 Replace(ExtractValue(...)) causes MySQL crash # SET NAMES utf8; -SELECT CONVERT(REPLACE(EXPORT_SET('a','a','a','','a'),'00','') USING ujis); -CONVERT(REPLACE(EXPORT_SET('a','a','a','','a'),'00','') USING ujis) +SELECT CONVERT(REPLACE(EXPORT_SET('a','a','a','','a'),'00','') USING ujis) as exp; +exp Warnings: Warning 1292 Truncated incorrect INTEGER value: 'a' @@ -26624,20 +26624,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ujis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ujis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ujis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -26762,20 +26762,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ujis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ujis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ujis_japanese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ujis_japanese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ujis_japanese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -26901,20 +26901,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ujis_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ujis_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ujis_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ujis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ujis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ujis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ujis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ujis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ujis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -27039,20 +27039,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'ujis_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'ujis_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'ujis_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'ujis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'ujis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'ujis_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'ujis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'ujis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'ujis_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'ujis_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_ujis.test mariadb-10.11.9/mysql-test/main/ctype_ujis.test --- mariadb-10.11.6/mysql-test/main/ctype_ujis.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_ujis.test 2024-08-03 07:29:57.000000000 +0000 @@ -45,13 +45,10 @@ select locate('LO','hello' collate ujis_bin,2); select locate(_ujis 0xa1a3,_ujis 0xa1a2a1a3); -select 0xa1a2a1a3 like concat(_binary'%',0xa2a1,_binary'%'); -select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%'); +select 0xa1a2a1a3 like concat(_binary'%',0xa2a1,_binary'%') as exp; +select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') as exp; -# enable view-protocol after fix MDEV-27871 ---disable_view_protocol -select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') collate ujis_bin; ---disable_view_protocol +select _ujis 0xa1a2a1a3 like concat(_ujis'%',_ujis 0xa2a1, _ujis'%') collate ujis_bin as exp; select 'a' like 'a'; select 'A' like 'a'; @@ -1231,11 +1228,8 @@ --echo # --echo # Bug#57257 Replace(ExtractValue(...)) causes MySQL crash --echo # -#enable after fix MDEV-27871 ---disable_view_protocol SET NAMES utf8; -SELECT CONVERT(REPLACE(EXPORT_SET('a','a','a','','a'),'00','') USING ujis); ---enable_view_protocol +SELECT CONVERT(REPLACE(EXPORT_SET('a','a','a','','a'),'00','') USING ujis) as exp; set names default; set character_set_database=@save_character_set_server; @@ -1357,8 +1351,6 @@ --echo # WL#3664 WEIGHT_STRING --echo # -# enable view-protocol after fix MDEV-27871 ---disable_view_protocol set names ujis; --source include/weight_string.inc --source include/weight_string_l1.inc @@ -1372,7 +1364,6 @@ --source include/weight_string_A1A1.inc --source include/weight_string_8EA1.inc --source include/weight_string_8FA2C3.inc ---enable_view_protocol --echo # --echo # End of 5.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf16.result mariadb-10.11.9/mysql-test/main/ctype_utf16.result --- mariadb-10.11.6/mysql-test/main/ctype_utf16.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf16.result 2024-08-03 07:29:57.000000000 +0000 @@ -2354,20 +2354,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -2492,20 +2492,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_general_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -2631,20 +2631,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -2769,20 +2769,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_nopad_bin', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf16_uca.result mariadb-10.11.9/mysql-test/main/ctype_utf16_uca.result --- mariadb-10.11.6/mysql-test/main/ctype_utf16_uca.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf16_uca.result 2024-08-03 07:29:57.000000000 +0000 @@ -5327,8 +5327,8 @@ (_ucs2 0x1011103910191004103A1038 /* cooked rice */), (_ucs2 0x101C1000103A10181000103A), (_ucs2 0x101C103910181000103A /* tea */); -SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) FROM t1 ORDER BY id; -id IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) +SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) as exp FROM t1 ORDER BY id; +id exp 1 2259 108C 2 22593ACB 1037 3 22593ACC 1038 @@ -7413,20 +7413,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -7551,20 +7551,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -7690,20 +7690,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix @@ -7828,20 +7828,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) as exp; +exp 0061006200630020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16_unicode_520_nopad_ci', 'abc ')) as exp; +exp 00610062006300200020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf16le.result mariadb-10.11.9/mysql-test/main/ctype_utf16le.result --- mariadb-10.11.6/mysql-test/main/ctype_utf16le.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf16le.result 2024-08-03 07:29:57.000000000 +0000 @@ -2540,20 +2540,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16le_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16le_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16le_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) as exp; +exp 6100620063002000 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) as exp; +exp 61006200630020002000 # # Collation mix @@ -2678,20 +2678,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16le_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16le_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16le_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16le_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) as exp; +exp 6100620063002000 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_general_nopad_ci', 'abc ')) as exp; +exp 61006200630020002000 # # Collation mix @@ -2817,20 +2817,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16le_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16le_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16le_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16le_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16le_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16le_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16le_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16le_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16le_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) as exp; +exp 6100620063002000 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) as exp; +exp 61006200630020002000 # # Collation mix @@ -2955,20 +2955,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf16le_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf16le_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf16le_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf16le_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf16le_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf16le_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf16le_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf16le_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf16le_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) as exp; +exp 6100620063002000 -SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf16le_nopad_bin', 'abc ')) as exp; +exp 61006200630020002000 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf32.result mariadb-10.11.9/mysql-test/main/ctype_utf32.result --- mariadb-10.11.6/mysql-test/main/ctype_utf32.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf32.result 2024-08-03 07:29:57.000000000 +0000 @@ -70,29 +70,29 @@ 00000420 00002004 DROP TABLE t1; -SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0421')); -hex(LPAD(_utf32 X'0420',10,_utf32 X'0421')) +SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0421')) as exp; +exp 00000421000004210000042100000421000004210000042100000421000004210000042100000420 -SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')); -hex(LPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')) +SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')) as exp; +exp 00000421000004220000042100000422000004210000042200000421000004220000042100000420 -SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')); -hex(LPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')) +SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')) as exp; +exp 00000421000004220000042300000421000004220000042300000421000004220000042300000420 -SELECT hex(LPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')); -hex(LPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')) +SELECT hex(LPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')) as exp; +exp 00000420000004210000042200000423000004240000042500000426000004270000042800000429 -SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0421')); -hex(RPAD(_utf32 X'0420',10,_utf32 X'0421')) +SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0421')) as exp; +exp 00000420000004210000042100000421000004210000042100000421000004210000042100000421 -SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')); -hex(RPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')) +SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')) as exp; +exp 00000420000004210000042200000421000004220000042100000422000004210000042200000421 -SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')); -hex(RPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')) +SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')) as exp; +exp 00000420000004210000042200000423000004210000042200000423000004210000042200000423 -SELECT hex(RPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')); -hex(RPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')) +SELECT hex(RPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')) as exp; +exp 00000420000004210000042200000423000004240000042500000426000004270000042800000429 CREATE TABLE t1 SELECT LPAD(_utf32 X'0420',10,_utf32 X'0421') l, @@ -329,11 +329,11 @@ word cat DROP TABLE t1; -select insert(_utf32 0x000000610000006200000063,10,2,_utf32 0x000000640000006500000066); -insert(_utf32 0x000000610000006200000063,10,2,_utf32 0x000000640000006500000066) +select insert(_utf32 0x000000610000006200000063,10,2,_utf32 0x000000640000006500000066) as exp; +exp abc -select insert(_utf32 0x000000610000006200000063,1,2,_utf32 0x000000640000006500000066); -insert(_utf32 0x000000610000006200000063,1,2,_utf32 0x000000640000006500000066) +select insert(_utf32 0x000000610000006200000063,1,2,_utf32 0x000000640000006500000066) as exp; +exp defc SET NAMES latin1; CREATE TABLE t1 ( @@ -1642,8 +1642,8 @@ # # incorrect charset for val_str_ascii # -SELECT '2010-10-10 10:10:10' + INTERVAL GeometryType(GeomFromText('POINT(1 1)')) hour_second; -'2010-10-10 10:10:10' + INTERVAL GeometryType(GeomFromText('POINT(1 1)')) hour_second +SELECT '2010-10-10 10:10:10' + INTERVAL GeometryType(GeomFromText('POINT(1 1)')) hour_second as exp; +exp 2010-10-10 10:10:10 # # MDEV-5745 analyze MySQL fix for bug#12368495 @@ -2410,20 +2410,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix @@ -2548,20 +2548,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_general_nopad_ci', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix @@ -2687,20 +2687,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix @@ -2825,20 +2825,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_nopad_bin', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix @@ -3024,3 +3024,88 @@ # # End of 10.4 tests # +# +# Start of 10.11 tests +# +# +# MDEV-10865 COLLATE keyword doesn't work in PREPARE query +# +# +# The collation is not applicable to the PS parameter +# +SET NAMES utf8mb4; +CREATE TABLE t1 ( +c1 varchar(500) COLLATE utf32_unicode_ci NOT NULL +); +INSERT INTO t1 VALUES ('jj'); +PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1 LIKE ? COLLATE utf32_unicode_ci'; +EXECUTE stmt USING 'jj'; +ERROR 42000: COLLATION 'utf32_unicode_ci' is not valid for CHARACTER SET 'utf8mb4' +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE utf32_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +ERROR 42000: COLLATION 'utf32_unicode_ci' is not valid for CHARACTER SET 'utf8mb4' +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(?) COLLATE utf32_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +ERROR 42000: COLLATION 'utf32_unicode_ci' is not valid for CHARACTER SET 'utf8mb4' +CREATE TABLE t1 AS SELECT NULL COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf32 COLLATE utf32_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf32 COLLATE utf32_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +# +# The collation is applicable to the PS parameter +# +SET NAMES utf8mb4, collation_connection=utf32_general_ci; +CREATE TABLE t1 ( +c1 varchar(500) COLLATE utf32_unicode_ci NOT NULL +); +INSERT INTO t1 VALUES ('jj'); +PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1 LIKE ? COLLATE utf32_unicode_ci'; +EXECUTE stmt USING 'jj'; +c1 +jj +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE utf32_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(4) CHARACTER SET utf32 COLLATE utf32_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(?) COLLATE utf32_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(4) CHARACTER SET utf32 COLLATE utf32_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT NULL COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf32 COLLATE utf32_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf32 COLLATE utf32_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +SET NAMES utf8mb4; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf32.test mariadb-10.11.9/mysql-test/main/ctype_utf32.test --- mariadb-10.11.6/mysql-test/main/ctype_utf32.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf32.test 2024-08-03 07:29:57.000000000 +0000 @@ -60,21 +60,15 @@ # # Check LPAD/RPAD # -SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0421')); -SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')); -SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT hex(LPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')); ---enable_view_protocol - -SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0421')); -SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')); -SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT hex(RPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')); ---enable_view_protocol +SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0421')) as exp; +SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')) as exp; +SELECT hex(LPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')) as exp; +SELECT hex(LPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')) as exp; + +SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0421')) as exp; +SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'0000042100000422')) as exp; +SELECT hex(RPAD(_utf32 X'0420',10,_utf32 X'000004210000042200000423')) as exp; +SELECT hex(RPAD(_utf32 X'000004200000042100000422000004230000042400000425000004260000042700000428000004290000042A0000042B',10,_utf32 X'000004210000042200000423')) as exp; CREATE TABLE t1 SELECT LPAD(_utf32 X'0420',10,_utf32 X'0421') l, @@ -124,11 +118,8 @@ # # Check that INSERT() works fine. # This invokes charpos() function. -#enable after fix MDEV-27871 ---disable_view_protocol -select insert(_utf32 0x000000610000006200000063,10,2,_utf32 0x000000640000006500000066); -select insert(_utf32 0x000000610000006200000063,1,2,_utf32 0x000000640000006500000066); ---enable_view_protocol +select insert(_utf32 0x000000610000006200000063,10,2,_utf32 0x000000640000006500000066) as exp; +select insert(_utf32 0x000000610000006200000063,1,2,_utf32 0x000000640000006500000066) as exp; ####################################################### @@ -884,10 +875,7 @@ --echo # --echo # incorrect charset for val_str_ascii --echo # -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT '2010-10-10 10:10:10' + INTERVAL GeometryType(GeomFromText('POINT(1 1)')) hour_second; ---enable_view_protocol +SELECT '2010-10-10 10:10:10' + INTERVAL GeometryType(GeomFromText('POINT(1 1)')) hour_second as exp; --echo # --echo # MDEV-5745 analyze MySQL fix for bug#12368495 @@ -1167,4 +1155,80 @@ --echo # End of 10.4 tests --echo # +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-10865 COLLATE keyword doesn't work in PREPARE query +--echo # + +--echo # +--echo # The collation is not applicable to the PS parameter +--echo # + +SET NAMES utf8mb4; +CREATE TABLE t1 ( + c1 varchar(500) COLLATE utf32_unicode_ci NOT NULL +); +INSERT INTO t1 VALUES ('jj'); +PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1 LIKE ? COLLATE utf32_unicode_ci'; +--error ER_COLLATION_CHARSET_MISMATCH +EXECUTE stmt USING 'jj'; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE utf32_unicode_ci AS c1'; +--error ER_COLLATION_CHARSET_MISMATCH +EXECUTE stmt USING 'test'; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(?) COLLATE utf32_unicode_ci AS c1'; +--error ER_COLLATION_CHARSET_MISMATCH +EXECUTE stmt USING 'test'; + +CREATE TABLE t1 AS SELECT NULL COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + + +--echo # +--echo # The collation is applicable to the PS parameter +--echo # + +SET NAMES utf8mb4, collation_connection=utf32_general_ci; +CREATE TABLE t1 ( + c1 varchar(500) COLLATE utf32_unicode_ci NOT NULL +); +INSERT INTO t1 VALUES ('jj'); +PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1 LIKE ? COLLATE utf32_unicode_ci'; +EXECUTE stmt USING 'jj'; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE utf32_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(?) COLLATE utf32_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT NULL COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE utf32_unicode_ci AS c1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +SET NAMES utf8mb4; + +--echo # +--echo # End of 10.11 tests +--echo # + --enable_service_connection diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf32_uca.result mariadb-10.11.9/mysql-test/main/ctype_utf32_uca.result --- mariadb-10.11.6/mysql-test/main/ctype_utf32_uca.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf32_uca.result 2024-08-03 07:29:57.000000000 +0000 @@ -5347,8 +5347,8 @@ (_ucs2 0x1011103910191004103A1038 /* cooked rice */), (_ucs2 0x101C1000103A10181000103A), (_ucs2 0x101C103910181000103A /* tea */); -SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) FROM t1 ORDER BY id; -id IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) +SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) as exp FROM t1 ORDER BY id; +id exp 1 2259 108C 2 22593ACB 1037 3 22593ACC 1038 @@ -7433,20 +7433,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix @@ -7571,20 +7571,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_nopad_ci', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix @@ -7710,20 +7710,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix @@ -7848,20 +7848,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf32_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf32_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf32_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf32_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) as exp; +exp 00000061000000620000006300000020 -SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf32_unicode_520_nopad_ci', 'abc ')) as exp; +exp 0000006100000062000000630000002000000020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8.result mariadb-10.11.9/mysql-test/main/ctype_utf8.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8.result 2024-08-03 07:29:57.000000000 +0000 @@ -63,17 +63,17 @@ select 'A' like 'a' collate utf8_bin; 'A' like 'a' collate utf8_bin 0 -select _utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%'); -_utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%') +select _utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%') as exp; +exp 1 -select convert(_latin1'Günter André' using utf8) like CONVERT(_latin1'GÜNTER%' USING utf8); -convert(_latin1'G\xFCnter Andr\xE9' using utf8) like CONVERT(_latin1'G\xDCNTER%' USING utf8) +select convert(_latin1'Günter André' using utf8) like CONVERT(_latin1'GÜNTER%' USING utf8) as exp; +exp 1 -select CONVERT(_koi8r'×ÁÓÑ' USING utf8) LIKE CONVERT(_koi8r'÷áóñ' USING utf8); -CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8) LIKE CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8) +select CONVERT(_koi8r'×ÁÓÑ' USING utf8) LIKE CONVERT(_koi8r'÷áóñ' USING utf8) as exp; +exp 1 -select CONVERT(_koi8r'÷áóñ' USING utf8) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8); -CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8) LIKE CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8) +select CONVERT(_koi8r'÷áóñ' USING utf8) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8) as exp; +exp 1 SELECT 'a' = 'a '; 'a' = 'a ' @@ -924,17 +924,17 @@ id a 1 Test drop table t1; -select soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB); -soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) +select soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) as exp; +exp 阅000 -select hex(soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)); -hex(soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) +select hex(soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) as exp; +exp E99885303030 -select soundex(_utf8 0xD091D092D093); -soundex(_utf8 0xD091D092D093) +select soundex(_utf8 0xD091D092D093) as exp; +exp Б000 -select hex(soundex(_utf8 0xD091D092D093)); -hex(soundex(_utf8 0xD091D092D093)) +select hex(soundex(_utf8 0xD091D092D093)) as exp; +exp D091303030 SET collation_connection='utf8_general_ci'; create table t1 select repeat('a',4000) a; @@ -1160,8 +1160,8 @@ SELECT @@character_set_connection, HEX(CAST(_utf8'÷' AS CHAR)); @@character_set_connection HEX(CAST(_utf8'÷' AS CHAR)) utf8mb3 C3B7 -SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)); -STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) +SELECT STR_TO_DATE(CAST(_utf8'2001÷01÷01' AS CHAR),CAST(_utf8'%Y÷%m÷%d' AS CHAR)) as exp; +exp 2001-01-01 CREATE TABLE t1 AS SELECT REPEAT(' ', 64) AS subject, REPEAT(' ',64) AS pattern LIMIT 0; SHOW COLUMNS FROM t1; @@ -1294,8 +1294,8 @@ -><- -><- drop table t1; -select convert(_koi8r'É' using utf8) < convert(_koi8r'Ê' using utf8); -convert(_koi8r'\xC9' using utf8) < convert(_koi8r'\xCA' using utf8) +select convert(_koi8r'É' using utf8) < convert(_koi8r'Ê' using utf8) as exp; +exp 1 set names latin1; create table t1 (a varchar(10)) character set utf8; @@ -3603,8 +3603,8 @@ `c1` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumGeometries(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -3613,8 +3613,8 @@ `c1` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))); -hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) +select hex(concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)')))) as exp; +exp 32 create table t1 as select concat(NumPoints(MultiPointFromText('LINESTRING(0 0,10 10)'))) as c1; show create table t1; @@ -3623,8 +3623,8 @@ `c1` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))); -hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) +select hex(concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)')))) as exp; +exp 30 create table t1 as select concat(SRID(MultiPointFromText('MULTIPOINT(0 0,10 10)'))) as c1; show create table t1; @@ -3633,8 +3633,8 @@ `c1` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))); -hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) +select hex(concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))')))) as exp; +exp 31 create table t1 as select concat(NumInteriorRings(PolygonFromText('POLYGON((0 0,50 0,50 50,0 50,0 0), (10 10,20 10,20 20,10 20,10 10))'))) as c1; show create table t1; @@ -3643,8 +3643,8 @@ `c1` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))); -hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) +select hex(concat(IsEmpty(GeomFromText('POINT(1 1)')))) as exp; +exp 30 create table t1 as select concat(IsEmpty(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -3653,8 +3653,8 @@ `c1` varchar(21) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))); -hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) +select hex(concat(IsSimple(GeomFromText('POINT(1 1)')))) as exp; +exp 31 create table t1 as select concat(IsSimple(GeomFromText('Point(1 1)'))) as c1; show create table t1; @@ -3663,8 +3663,8 @@ `c1` varchar(2) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))); -hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) +select hex(concat(IsClosed(GeomFromText('LineString(1 1,2 2)')))) as exp; +exp 30 create table t1 as select concat(IsClosed(GeomFromText('LineString(1 1,2 2)'))) as c1; show create table t1; @@ -3673,13 +3673,13 @@ `c1` varchar(2) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))); -hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) +select hex(concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)')))) as exp; +exp 31 create table t1 as select concat(Equals(GeomFromText('Point(1 1)'),GeomFromText('Point(1 1)'))) as c1; drop table t1; -select hex(concat(x(GeomFromText('Point(1 2)')))); -hex(concat(x(GeomFromText('Point(1 2)')))) +select hex(concat(x(GeomFromText('Point(1 2)')))) as exp; +exp 31 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -3688,8 +3688,8 @@ `c1` varchar(23) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(y(GeomFromText('Point(1 2)')))); -hex(concat(y(GeomFromText('Point(1 2)')))) +select hex(concat(y(GeomFromText('Point(1 2)')))) as exp; +exp 32 create table t1 as select concat(x(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -3698,8 +3698,8 @@ `c1` varchar(23) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))); -hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) +select hex(concat(GLength(GeomFromText('LineString(1 2,2 2)')))) as exp; +exp 31 create table t1 as select concat(GLength(GeomFromText('LineString(1 2, 2 2)'))) as c1; show create table t1; @@ -3708,8 +3708,8 @@ `c1` varchar(23) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))); -hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) +select hex(concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))')))) as exp; +exp 31 create table t1 as select concat(Area(GeomFromText('Polygon((0 0,1 0,1 1,0 1,0 0))'))) as c1; show create table t1; @@ -3718,8 +3718,8 @@ `c1` varchar(23) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(GeometryType(GeomFromText('Point(1 2)')))); -hex(concat(GeometryType(GeomFromText('Point(1 2)')))) +select hex(concat(GeometryType(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E54 create table t1 as select concat(GeometryType(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -3728,8 +3728,8 @@ `c1` varchar(20) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(AsText(GeomFromText('Point(1 2)')))); -hex(concat(AsText(GeomFromText('Point(1 2)')))) +select hex(concat(AsText(GeomFromText('Point(1 2)')))) as exp; +exp 504F494E542831203229 create table t1 as select concat(AsText(GeomFromText('Point(1 2)'))) as c1; show create table t1; @@ -3998,8 +3998,8 @@ `c1` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))); -hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) +select hex(concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00'))) as exp; +exp 32343A30303A3030 create table t1 as select concat(timediff('2001-01-02 00:00:00', '2001-01-01 00:00:00')) as c1; show create table t1; @@ -4038,8 +4038,8 @@ `c1` varchar(19) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))); -hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) +select hex(concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00'))) as exp; +exp 323030332D31322D33312032303A30303A3030 create table t1 as select concat(convert_tz('2004-01-01 12:00:00','+10:00','-6:00')) as c1; show create table t1; @@ -4048,8 +4048,8 @@ `c1` varchar(19) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; -select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))); -hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) +select hex(concat(date_add('2004-01-01 12:00:00', interval 1 day))) as exp; +exp 323030342D30312D30322031323A30303A3030 create table t1 as select concat(date_add('2004-01-01 12:00:00', interval 1 day)) as c1; show create table t1; @@ -10784,20 +10784,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -10922,20 +10922,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11061,20 +11061,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -11199,20 +11199,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8.test mariadb-10.11.9/mysql-test/main/ctype_utf8.test --- mariadb-10.11.6/mysql-test/main/ctype_utf8.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8.test 2024-08-03 07:29:57.000000000 +0000 @@ -3,9 +3,6 @@ # Tests with the utf8 character set # -# Enable after fix MDEV-27904 --- source include/no_view_protocol.inc - let $MYSQLD_DATADIR= `select @@datadir`; let collation=utf8mb3_unicode_ci; @@ -50,15 +47,15 @@ select 'a' like 'a'; select 'A' like 'a'; select 'A' like 'a' collate utf8_bin; -select _utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%'); +select _utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%') as exp; # Bug #6040: can't retrieve records with umlaut # characters in case insensitive manner. # Case insensitive search LIKE comparison # was broken for multibyte characters: -select convert(_latin1'Günter André' using utf8) like CONVERT(_latin1'GÜNTER%' USING utf8); -select CONVERT(_koi8r'×ÁÓÑ' USING utf8) LIKE CONVERT(_koi8r'÷áóñ' USING utf8); -select CONVERT(_koi8r'÷áóñ' USING utf8) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8); +select convert(_latin1'Günter André' using utf8) like CONVERT(_latin1'GÜNTER%' USING utf8) as exp; +select CONVERT(_koi8r'×ÁÓÑ' USING utf8) LIKE CONVERT(_koi8r'÷áóñ' USING utf8) as exp; +select CONVERT(_koi8r'÷áóñ' USING utf8) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8) as exp; # # Check the following: @@ -629,6 +626,7 @@ # # Bug #6043 erratic searching for diacriticals in indexed MyISAM UTF-8 table # +--disable_service_connection SET NAMES latin1; CREATE TABLE t1 ( id int unsigned NOT NULL auto_increment, @@ -644,6 +642,7 @@ SELECT id, term FROM t1 where (list_id = 1) AND (term = "testetest"); SELECT id, term FROM t1 where (list_id = 1) AND (term = "testètest"); DROP TABLE t1; +--enable_service_connection # # Bug #6019 SELECT tries to use too short prefix index on utf8 data @@ -696,10 +695,10 @@ # # Bug#22638 SOUNDEX broken for international characters # -select soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB); -select hex(soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)); -select soundex(_utf8 0xD091D092D093); -select hex(soundex(_utf8 0xD091D092D093)); +select soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) as exp; +select hex(soundex(_utf8 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) as exp; +select soundex(_utf8 0xD091D092D093) as exp; +select hex(soundex(_utf8 0xD091D092D093)) as exp; SET collation_connection='utf8_general_ci'; @@ -735,7 +734,7 @@ # # Bug#8385: utf8_general_ci treats Cyrillic letters I and SHORT I as the same # -select convert(_koi8r'É' using utf8) < convert(_koi8r'Ê' using utf8); +select convert(_koi8r'É' using utf8) < convert(_koi8r'Ê' using utf8) as exp; # # Bugs#5980: NULL requires a characterset in a union @@ -1113,6 +1112,7 @@ # (see bug #16674 as well) # +--disable_service_connection SET NAMES latin2; CREATE TABLE t1 ( @@ -1139,6 +1139,7 @@ SELECT * FROM t1 WHERE tid=72 and val LIKE 'VOLNÝ ADSL'; DROP TABLE t1; +--enable_service_connection # # Bug 20709: problem with utf8 fields in temporary tables @@ -1346,6 +1347,7 @@ # Conversion is possible if string repertoire is ASCII. # Conversion is not possible if the string have extended characters # +--disable_service_connection set names utf8; create table t1 (a varchar(10) character set latin1, b int); insert into t1 values ('a',1); @@ -1380,6 +1382,7 @@ --error 1267 select concat(a, if(b>10, 'x' 'æ', 'y' 'ß')) from t1; drop table t1; +--enable_service_connection # # Bug#19960: Inconsistent results when joining @@ -1496,7 +1499,10 @@ SELECT HEX(LPAD(_utf8 0xD18F, 3, 0x20)); SELECT HEX(INSERT(_utf8 0xD18F, 2, 1, 0x20)); +#Enable view-protocol after fix MDEV-33942 +--disable_view_protocol SELECT HEX(INSERT(_utf8 0xD18FD18E, 2, 1, 0x20)); +--enable_view_protocol --echo # --echo # Bug#11752408 - 43593: DUMP/BACKUP/RESTORE/UPGRADE TOOLS FAILS BECAUSE OF UTF8_GENERAL_CI @@ -1573,6 +1579,7 @@ s3 MEDIUMTEXT CHARACTER SET utf8, s4 LONGTEXT CHARACTER SET utf8 ); +--disable_view_protocol --enable_metadata SET NAMES utf8, @@character_set_results=NULL; SELECT *, HEX(s1) FROM t1; @@ -1581,6 +1588,7 @@ SET NAMES utf8; SELECT *, HEX(s1) FROM t1; --disable_metadata +--enable_view_protocol CREATE TABLE t2 AS SELECT CONCAT(s1) FROM t1; SHOW CREATE TABLE t2; DROP TABLE t1, t2; diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8_uca.result mariadb-10.11.9/mysql-test/main/ctype_utf8_uca.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8_uca.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8_uca.result 2024-08-03 07:29:57.000000000 +0000 @@ -100,20 +100,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -238,20 +238,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -377,20 +377,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -515,20 +515,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_unicode_520_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4.result mariadb-10.11.9/mysql-test/main/ctype_utf8mb4.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4.result 2024-08-03 07:29:57.000000000 +0000 @@ -3665,20 +3665,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3803,20 +3803,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -3942,20 +3942,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4080,20 +4080,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -4182,24 +4182,6 @@ # End of 10.2 tests # # -# Start of 10.5 tests -# -# -# MDEV-24584 Selecting INT column with COLLATE utf8mb4_general_ci throws an error -# -SET NAMES utf8mb4; -SELECT 1 COLLATE utf8mb4_general_ci; -1 COLLATE utf8mb4_general_ci -1 -SELECT 1 COLLATE utf8mb4_bin; -1 COLLATE utf8mb4_bin -1 -SELECT 1 COLLATE latin1_swedish_ci; -ERROR 42000: COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8mb4' -# -# End of 10.5 tests -# -# # Start of 10.6 tests # # @@ -4227,3 +4209,67 @@ # # End of 10.6 tests # +# +# Start of 10.11 tests +# +# +# MDEV-24584 Selecting INT column with COLLATE utf8mb4_general_ci throws an error +# +SET NAMES utf8mb4; +SELECT 1 COLLATE utf8mb4_general_ci; +1 COLLATE utf8mb4_general_ci +1 +SELECT 1 COLLATE utf8mb4_bin; +1 COLLATE utf8mb4_bin +1 +SELECT 1 COLLATE latin1_swedish_ci; +ERROR 42000: COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8mb4' +# +# MDEV-10865 COLLATE keyword doesn't work in PREPARE query +# +SET NAMES utf8mb4; +CREATE TABLE t1 ( +c1 varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL +) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES ('jj'); +SELECT * FROM t1 WHERE c1 LIKE 'jj' COLLATE utf8mb4_unicode_ci; +c1 +jj +PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1 LIKE ? COLLATE utf8mb4_unicode_ci'; +EXECUTE stmt USING 'jj'; +c1 +jj +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE utf8mb4_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(?) COLLATE utf8mb4_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT NULL COLLATE utf8mb4_unicode_ci AS c1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE utf8mb4_unicode_ci AS c1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` char(0) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4.test mariadb-10.11.9/mysql-test/main/ctype_utf8mb4.test --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4.test 2024-08-03 07:29:57.000000000 +0000 @@ -2068,25 +2068,6 @@ --echo # End of 10.2 tests --echo # - ---echo # ---echo # Start of 10.5 tests ---echo # - ---echo # ---echo # MDEV-24584 Selecting INT column with COLLATE utf8mb4_general_ci throws an error ---echo # - -SET NAMES utf8mb4; -SELECT 1 COLLATE utf8mb4_general_ci; -SELECT 1 COLLATE utf8mb4_bin; ---error ER_COLLATION_CHARSET_MISMATCH -SELECT 1 COLLATE latin1_swedish_ci; - ---echo # ---echo # End of 10.5 tests ---echo # - --echo # --echo # Start of 10.6 tests --echo # @@ -2112,3 +2093,55 @@ --echo # --echo # End of 10.6 tests --echo # + + +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-24584 Selecting INT column with COLLATE utf8mb4_general_ci throws an error +--echo # + +SET NAMES utf8mb4; +SELECT 1 COLLATE utf8mb4_general_ci; +SELECT 1 COLLATE utf8mb4_bin; +--error ER_COLLATION_CHARSET_MISMATCH +SELECT 1 COLLATE latin1_swedish_ci; + +--echo # +--echo # MDEV-10865 COLLATE keyword doesn't work in PREPARE query +--echo # + +SET NAMES utf8mb4; +CREATE TABLE t1 ( + c1 varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL +) CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES ('jj'); +SELECT * FROM t1 WHERE c1 LIKE 'jj' COLLATE utf8mb4_unicode_ci; +PREPARE stmt FROM 'SELECT * FROM t1 WHERE c1 LIKE ? COLLATE utf8mb4_unicode_ci'; +EXECUTE stmt USING 'jj'; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT ? COLLATE utf8mb4_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +PREPARE stmt FROM 'CREATE TABLE t1 AS SELECT CONCAT(?) COLLATE utf8mb4_unicode_ci AS c1'; +EXECUTE stmt USING 'test'; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT NULL COLLATE utf8mb4_unicode_ci AS c1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT CONCAT(NULL) COLLATE utf8mb4_unicode_ci AS c1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_heap.result mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_heap.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_heap.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_heap.result 2024-08-03 07:29:57.000000000 +0000 @@ -36,23 +36,23 @@ select locate('LO','hello' collate utf8mb4_bin,2); locate('LO','hello' collate utf8mb4_bin,2) 0 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2); -locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2) +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin); -locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin) +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin) as exp; +exp 0 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin) as exp; +exp 0 -select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1); -length(_utf8mb4 0xD0B1) bit_length(_utf8mb4 0xD0B1) char_length(_utf8mb4 0xD0B1) +select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1) as exp; +length(_utf8mb4 0xD0B1) bit_length(_utf8mb4 0xD0B1) exp 2 16 1 select 'a' like 'a'; 'a' like 'a' @@ -63,17 +63,17 @@ select 'A' like 'a' collate utf8mb4_bin; 'A' like 'a' collate utf8mb4_bin 0 -select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%'); -_utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%') +select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%') as exp; +exp 1 -select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4); -convert(_latin1'G\xFCnter Andr\xE9' using utf8mb4) like CONVERT(_latin1'G\xDCNTER%' USING utf8mb4) +select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4) as exp; +exp 1 -select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4); -CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8mb4) LIKE CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8mb4) +select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4) as exp; +exp 1 -select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4); -CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8mb4) LIKE CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8mb4) +select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) as exp; +exp 1 SELECT 'a' = 'a '; 'a' = 'a ' @@ -863,17 +863,17 @@ id a 1 Test drop table t1; -select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB); -soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) +select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) as exp; +exp 阅000 -select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)); -hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) +select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) as exp; +exp E99885303030 -select soundex(_utf8mb4 0xD091D092D093); -soundex(_utf8mb4 0xD091D092D093) +select soundex(_utf8mb4 0xD091D092D093) as exp; +exp Б000 -select hex(soundex(_utf8mb4 0xD091D092D093)); -hex(soundex(_utf8mb4 0xD091D092D093)) +select hex(soundex(_utf8mb4 0xD091D092D093)) as exp; +exp D091303030 SET collation_connection='utf8mb4_general_ci'; create table t1 select repeat('a',4000) a; @@ -1214,8 +1214,8 @@ -><- -><- drop table t1; -select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4); -convert(_koi8r'\xC9' using utf8mb4) < convert(_koi8r'\xCA' using utf8mb4) +select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4) as exp; +exp 1 set names latin1; create table t1 (a varchar(10)) character set utf8mb4 engine heap; diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_innodb.result mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_innodb.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -36,23 +36,23 @@ select locate('LO','hello' collate utf8mb4_bin,2); locate('LO','hello' collate utf8mb4_bin,2) 0 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2); -locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2) +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin); -locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin) +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin) as exp; +exp 0 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin) as exp; +exp 0 -select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1); -length(_utf8mb4 0xD0B1) bit_length(_utf8mb4 0xD0B1) char_length(_utf8mb4 0xD0B1) +select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1) as exp; +length(_utf8mb4 0xD0B1) bit_length(_utf8mb4 0xD0B1) exp 2 16 1 select 'a' like 'a'; 'a' like 'a' @@ -63,17 +63,17 @@ select 'A' like 'a' collate utf8mb4_bin; 'A' like 'a' collate utf8mb4_bin 0 -select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%'); -_utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%') +select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%') as exp; +exp 1 -select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4); -convert(_latin1'G\xFCnter Andr\xE9' using utf8mb4) like CONVERT(_latin1'G\xDCNTER%' USING utf8mb4) +select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4) as exp; +exp 1 -select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4); -CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8mb4) LIKE CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8mb4) +select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4) as exp; +exp 1 -select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4); -CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8mb4) LIKE CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8mb4) +select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) as exp; +exp 1 SELECT 'a' = 'a '; 'a' = 'a ' @@ -926,17 +926,17 @@ id a 1 Test drop table t1; -select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB); -soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) +select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) as exp; +exp 阅000 -select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)); -hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) +select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) as exp; +exp E99885303030 -select soundex(_utf8mb4 0xD091D092D093); -soundex(_utf8mb4 0xD091D092D093) +select soundex(_utf8mb4 0xD091D092D093) as exp; +exp Б000 -select hex(soundex(_utf8mb4 0xD091D092D093)); -hex(soundex(_utf8mb4 0xD091D092D093)) +select hex(soundex(_utf8mb4 0xD091D092D093)) as exp; +exp D091303030 SET collation_connection='utf8mb4_general_ci'; create table t1 select repeat('a',4000) a; @@ -1277,8 +1277,8 @@ -><- -><- drop table t1; -select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4); -convert(_koi8r'\xC9' using utf8mb4) < convert(_koi8r'\xCA' using utf8mb4) +select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4) as exp; +exp 1 set names latin1; create table t1 (a varchar(10)) character set utf8mb4 engine InnoDB; diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_innodb.test mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_innodb.test --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,3 @@ -# Enable after fix MDEV-27904 --- source include/no_view_protocol.inc - --source include/have_utf8mb4.inc --source include/have_innodb.inc diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_myisam.result mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_myisam.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_myisam.result 2024-08-03 07:29:57.000000000 +0000 @@ -36,23 +36,23 @@ select locate('LO','hello' collate utf8mb4_bin,2); locate('LO','hello' collate utf8mb4_bin,2) 0 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D0B1D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2); -locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2) +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2) as exp; +exp 2 -select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin); -locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin) +select locate(_utf8mb4 0xD091, _utf8mb4 0xD0B0D0B1D0B2 collate utf8mb4_bin) as exp; +exp 0 -select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin); -locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin) +select locate(_utf8mb4 0xD0B1, _utf8mb4 0xD0B0D091D0B2 collate utf8mb4_bin) as exp; +exp 0 -select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1); -length(_utf8mb4 0xD0B1) bit_length(_utf8mb4 0xD0B1) char_length(_utf8mb4 0xD0B1) +select length(_utf8mb4 0xD0B1), bit_length(_utf8mb4 0xD0B1), char_length(_utf8mb4 0xD0B1) as exp; +length(_utf8mb4 0xD0B1) bit_length(_utf8mb4 0xD0B1) exp 2 16 1 select 'a' like 'a'; 'a' like 'a' @@ -63,17 +63,17 @@ select 'A' like 'a' collate utf8mb4_bin; 'A' like 'a' collate utf8mb4_bin 0 -select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%'); -_utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%') +select _utf8mb4 0xD0B0D0B1D0B2 like concat(_utf8mb4'%',_utf8mb4 0xD0B1,_utf8mb4 '%') as exp; +exp 1 -select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4); -convert(_latin1'G\xFCnter Andr\xE9' using utf8mb4) like CONVERT(_latin1'G\xDCNTER%' USING utf8mb4) +select convert(_latin1'Günter André' using utf8mb4) like CONVERT(_latin1'GÜNTER%' USING utf8mb4) as exp; +exp 1 -select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4); -CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8mb4) LIKE CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8mb4) +select CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) LIKE CONVERT(_koi8r'÷áóñ' USING utf8mb4) as exp; +exp 1 -select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4); -CONVERT(_koi8r'\xF7\xE1\xF3\xF1' USING utf8mb4) LIKE CONVERT(_koi8r'\xD7\xC1\xD3\xD1' USING utf8mb4) +select CONVERT(_koi8r'÷áóñ' USING utf8mb4) LIKE CONVERT(_koi8r'×ÁÓÑ' USING utf8mb4) as exp; +exp 1 SELECT 'a' = 'a '; 'a' = 'a ' @@ -929,17 +929,17 @@ id a 1 Test drop table t1; -select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB); -soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) +select soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB) as exp; +exp 阅000 -select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)); -hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) +select hex(soundex(_utf8mb4 0xE99885E8A788E99A8FE697B6E69BB4E696B0E79A84E696B0E997BB)) as exp; +exp E99885303030 -select soundex(_utf8mb4 0xD091D092D093); -soundex(_utf8mb4 0xD091D092D093) +select soundex(_utf8mb4 0xD091D092D093) as exp; +exp Б000 -select hex(soundex(_utf8mb4 0xD091D092D093)); -hex(soundex(_utf8mb4 0xD091D092D093)) +select hex(soundex(_utf8mb4 0xD091D092D093)) as exp; +exp D091303030 SET collation_connection='utf8mb4_general_ci'; create table t1 select repeat('a',4000) a; @@ -1280,8 +1280,8 @@ -><- -><- drop table t1; -select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4); -convert(_koi8r'\xC9' using utf8mb4) < convert(_koi8r'\xCA' using utf8mb4) +select convert(_koi8r'É' using utf8mb4) < convert(_koi8r'Ê' using utf8mb4) as exp; +exp 1 set names latin1; create table t1 (a varchar(10)) character set utf8mb4 engine MyISAM; diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_uca.result mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_uca.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_uca.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_uca.result 2024-08-03 07:29:57.000000000 +0000 @@ -4031,8 +4031,8 @@ (_ucs2 0x1011103910191004103A1038 /* cooked rice */), (_ucs2 0x101C1000103A10181000103A), (_ucs2 0x101C103910181000103A /* tea */); -SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) FROM t1 ORDER BY id; -id IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) +SELECT id, IF(LEFT(s1,1)='-',s1,CONCAT(HEX(WEIGHT_STRING(s1)),'\t', HEX(CONVERT(s1 USING ucs2)))) as exp FROM t1 ORDER BY id; +id exp 1 2259 108C 2 22593ACB 1037 3 22593ACC 1038 @@ -6117,20 +6117,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6255,20 +6255,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6394,20 +6394,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -6532,20 +6532,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8mb4_unicode_520_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8mb4_unicode_520_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_unicode_ci_def.result mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_unicode_ci_def.result --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_unicode_ci_def.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_unicode_ci_def.result 2024-08-03 07:29:57.000000000 +0000 @@ -9,3 +9,48 @@ # # End of 10.3 tests # +# +# Start of 10.11 tests +# +# +# MDEV-34288 SET NAMES DEFAULT crashes `mariadbd --collation-server=utf8mb4_unicode_ci` +# +SET NAMES DEFAULT COLLATE latin1_bin; +ERROR 42000: COLLATION 'latin1_bin' is not valid for CHARACTER SET 'utf8mb4' +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +latin1 latin1_swedish_ci latin1 +SET NAMES DEFAULT COLLATE utf8mb4_bin; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +utf8mb4 utf8mb4_bin utf8mb4 +SET NAMES DEFAULT COLLATE uca1400_ai_ci; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +utf8mb4 utf8mb4_uca1400_ai_ci utf8mb4 +SET @@global.character_set_client=latin1; +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +latin1 latin1_swedish_ci latin1 +SET @@global.character_set_client=utf8mb3; +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +utf8mb3 utf8mb3_general_ci utf8mb3 +SET @@global.character_set_client=DEFAULT; +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +utf8mb4 utf8mb4_general_ci utf8mb4 +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +utf8mb4 utf8mb4_general_ci utf8mb4 +SET NAMES DEFAULT COLLATE DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; +@@character_set_connection @@collation_connection @@character_set_results +utf8mb4 utf8mb4_general_ci utf8mb4 +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_unicode_ci_def.test mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_unicode_ci_def.test --- mariadb-10.11.6/mysql-test/main/ctype_utf8mb4_unicode_ci_def.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ctype_utf8mb4_unicode_ci_def.test 2024-08-03 07:29:57.000000000 +0000 @@ -13,3 +13,45 @@ --echo # --echo # End of 10.3 tests --echo # + + +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-34288 SET NAMES DEFAULT crashes `mariadbd --collation-server=utf8mb4_unicode_ci` +--echo # + +--error ER_COLLATION_CHARSET_MISMATCH +SET NAMES DEFAULT COLLATE latin1_bin; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + +SET NAMES DEFAULT COLLATE utf8mb4_bin; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + +SET NAMES DEFAULT COLLATE uca1400_ai_ci; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + +SET @@global.character_set_client=latin1; +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + +SET @@global.character_set_client=utf8mb3; +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + +SET @@global.character_set_client=DEFAULT; +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + +SET NAMES DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + +SET NAMES DEFAULT COLLATE DEFAULT; +SELECT @@character_set_connection, @@collation_connection, @@character_set_results; + + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/date_formats.result mariadb-10.11.9/mysql-test/main/date_formats.result --- mariadb-10.11.6/mysql-test/main/date_formats.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/date_formats.result 2024-08-03 07:29:57.000000000 +0000 @@ -16,12 +16,11 @@ DATE_FORMAT %d.%m.%Y TIME_FORMAT %H.%i.%s select str_to_date(concat('15-01-2001',' 2:59:58.999'), -concat('%d-%m-%Y',' ','%H:%i:%s.%f')); -str_to_date(concat('15-01-2001',' 2:59:58.999'), -concat('%d-%m-%Y',' ','%H:%i:%s.%f')) +concat('%d-%m-%Y',' ','%H:%i:%s.%f')) as exp; +exp 2001-01-15 02:59:58.999000 -select STR_TO_DATE('2004.12.12 22.30.61','%Y.%m.%d %T'); -STR_TO_DATE('2004.12.12 22.30.61','%Y.%m.%d %T') +select STR_TO_DATE('2004.12.12 22.30.61','%Y.%m.%d %T') as exp; +exp NULL Warnings: Warning 1411 Incorrect time value: '22.30.61' for function str_to_date @@ -256,8 +255,8 @@ 15-01-2001 %d-%m-%Y %H:%i:%S 00:00:00.000000 15-01-20 %d-%m-%y 00:00:00.000000 15-2001-1 %d-%Y-%c 00:00:00.000000 -select concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d')); -concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d')) +select concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d')) as exp; +exp 2003-01-02 08:11:02.123456 truncate table t1; insert into t1 values @@ -551,8 +550,8 @@ # Bug#58005 utf8 + get_format causes failed assertion: !str || str != Ptr' # SET NAMES utf8; -SELECT LEAST('%', GET_FORMAT(datetime, 'eur'), CAST(GET_FORMAT(datetime, 'eur') AS CHAR(65535))); -LEAST('%', GET_FORMAT(datetime, 'eur'), CAST(GET_FORMAT(datetime, 'eur') AS CHAR(65535))) +SELECT LEAST('%', GET_FORMAT(datetime, 'eur'), CAST(GET_FORMAT(datetime, 'eur') AS CHAR(65535))) as exp; +exp % SET NAMES latin1; # diff -Nru mariadb-10.11.6/mysql-test/main/date_formats.test mariadb-10.11.9/mysql-test/main/date_formats.test --- mariadb-10.11.6/mysql-test/main/date_formats.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/date_formats.test 2024-08-03 07:29:57.000000000 +0000 @@ -2,9 +2,6 @@ # Test of date format functions # -#remove this include after fix MDEV-27871 --- source include/no_view_protocol.inc - --disable_warnings drop table if exists t1; --enable_warnings @@ -129,8 +126,8 @@ # select str_to_date(concat('15-01-2001',' 2:59:58.999'), - concat('%d-%m-%Y',' ','%H:%i:%s.%f')); -select STR_TO_DATE('2004.12.12 22.30.61','%Y.%m.%d %T'); + concat('%d-%m-%Y',' ','%H:%i:%s.%f')) as exp; +select STR_TO_DATE('2004.12.12 22.30.61','%Y.%m.%d %T') as exp; create table t1 (date char(30), format char(30) not null); insert into t1 values @@ -175,7 +172,7 @@ select date,format,TIME(str_to_date(date, format)) as time from t1; select date,format,concat(TIME(str_to_date(date, format))) as time2 from t1; # Test small bug in %f handling -select concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d')); +select concat('',str_to_date('8:11:2.123456 03-01-02','%H:%i:%S.%f %y-%m-%d')) as exp; # Test wrong dates or converion specifiers @@ -363,7 +360,7 @@ --echo # Bug#58005 utf8 + get_format causes failed assertion: !str || str != Ptr' --echo # SET NAMES utf8; -SELECT LEAST('%', GET_FORMAT(datetime, 'eur'), CAST(GET_FORMAT(datetime, 'eur') AS CHAR(65535))); +SELECT LEAST('%', GET_FORMAT(datetime, 'eur'), CAST(GET_FORMAT(datetime, 'eur') AS CHAR(65535))) as exp; SET NAMES latin1; --echo # diff -Nru mariadb-10.11.6/mysql-test/main/ddl_i18n_koi8r.result mariadb-10.11.9/mysql-test/main/ddl_i18n_koi8r.result --- mariadb-10.11.6/mysql-test/main/ddl_i18n_koi8r.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ddl_i18n_koi8r.result 2024-08-03 07:29:57.000000000 +0000 @@ -719,6 +719,7 @@ utf8mb3_general_ci utf8mb3_general_ci ---> Dump of mysqltest1 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -795,6 +796,7 @@ ---> Dumping mysqltest1 to ddl_i18n_koi8r.sp.mysqltest1.sql ---> Dump of mysqltest2 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -1723,6 +1725,7 @@ DELETE FROM mysqltest2.log| ---> Dump of mysqltest1 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -1805,6 +1808,7 @@ ---> Dumping mysqltest1 to ddl_i18n_koi8r.triggers.mysqltest1.sql ---> Dump of mysqltest2 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -2491,6 +2495,7 @@ END ONE TIME 1970-01-02 00:00:00 NULL NULL NULL NULL DISABLED PRESERVE CREATED LAST_ALTERED NULL 1 koi8r koi8r_general_ci utf8mb3_unicode_ci ---> Dump of mysqltest1 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -2558,6 +2563,7 @@ ---> Dumping mysqltest1 to ddl_i18n_koi8r.events.mysqltest1.sql ---> Dump of mysqltest2 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; diff -Nru mariadb-10.11.6/mysql-test/main/ddl_i18n_utf8.result mariadb-10.11.9/mysql-test/main/ddl_i18n_utf8.result --- mariadb-10.11.6/mysql-test/main/ddl_i18n_utf8.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ddl_i18n_utf8.result 2024-08-03 07:29:57.000000000 +0000 @@ -719,6 +719,7 @@ utf8mb3_general_ci utf8mb3_general_ci ---> Dump of mysqltest1 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -795,6 +796,7 @@ ---> Dumping mysqltest1 to ddl_i18n_utf8sp.mysqltest1.sql ---> Dump of mysqltest2 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -1723,6 +1725,7 @@ DELETE FROM mysqltest2.log| ---> Dump of mysqltest1 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -1805,6 +1808,7 @@ ---> Dumping mysqltest1 to ddl_i18n_utf8triggers.mysqltest1.sql ---> Dump of mysqltest2 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -2491,6 +2495,7 @@ END ONE TIME 1970-01-02 00:00:00 NULL NULL NULL NULL DISABLED PRESERVE CREATED LAST_ALTERED NULL 1 utf8mb3 utf8mb3_general_ci utf8mb3_unicode_ci ---> Dump of mysqltest1 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; @@ -2558,6 +2563,7 @@ ---> Dumping mysqltest1 to ddl_i18n_utf8events.mysqltest1.sql ---> Dump of mysqltest2 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET cp866 COLLATE cp866_general_ci */; diff -Nru mariadb-10.11.6/mysql-test/main/deadlock_innodb.result mariadb-10.11.9/mysql-test/main/deadlock_innodb.result --- mariadb-10.11.6/mysql-test/main/deadlock_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/deadlock_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -89,11 +89,6 @@ 300 300 connection con2; update t2 set a=2 where b = 0; -select * from t2; -b a -0 2 -1 20 -2 30 update t1 set x=2 where id = 0; connection con1; update t1 set x=1 where id = 0; diff -Nru mariadb-10.11.6/mysql-test/main/derived_cond_pushdown.result mariadb-10.11.9/mysql-test/main/derived_cond_pushdown.result --- mariadb-10.11.6/mysql-test/main/derived_cond_pushdown.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_cond_pushdown.result 2024-08-03 07:29:57.000000000 +0000 @@ -8803,10 +8803,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 2, + "table": { + "message": "Select tables optimized away" + } } } } @@ -8873,10 +8875,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 2, + "table": { + "message": "Select tables optimized away" + } } } } @@ -8973,10 +8977,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 3, + "table": { + "message": "Select tables optimized away" + } } } } @@ -9040,10 +9046,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 3, + "table": { + "message": "Select tables optimized away" + } } } } @@ -9102,10 +9110,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 3, + "table": { + "message": "Select tables optimized away" + } } } } @@ -9164,10 +9174,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 3, + "table": { + "message": "Select tables optimized away" + } } } } @@ -9228,10 +9240,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 3, + "table": { + "message": "Select tables optimized away" + } } } } @@ -9290,10 +9304,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 3, + "table": { + "message": "Select tables optimized away" + } } } } @@ -9352,10 +9368,12 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "table": { - "message": "Select tables optimized away" + "materialization": { + "query_block": { + "select_id": 3, + "table": { + "message": "Select tables optimized away" + } } } } @@ -9457,10 +9475,12 @@ }, "subqueries": [ { - "query_block": { - "select_id": 2, - "table": { - "message": "Impossible WHERE" + "materialization": { + "query_block": { + "select_id": 2, + "table": { + "message": "Impossible WHERE" + } } } } @@ -10672,41 +10692,43 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 5, - "filtered": 100, - "attached_condition": "d_tab.e > 1", - "materialized": { - "query_block": { - "select_id": 3, - "filesort": { - "sort_key": "t2.e", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 5, - "filtered": 100, - "attached_condition": "t2.e > 1" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 5, + "filtered": 100, + "attached_condition": "d_tab.e > 1", + "materialized": { + "query_block": { + "select_id": 3, + "filesort": { + "sort_key": "t2.e", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 5, + "filtered": 100, + "attached_condition": "t2.e > 1" + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -10788,41 +10810,43 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 5, - "filtered": 100, - "attached_condition": "d_tab.max_f > 20", - "materialized": { - "query_block": { - "select_id": 3, - "having_condition": "max_f > 20", - "filesort": { - "sort_key": "t2.e", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 5, - "filtered": 100 + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 5, + "filtered": 100, + "attached_condition": "d_tab.max_f > 20", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "max_f > 20", + "filesort": { + "sort_key": "t2.e", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 5, + "filtered": 100 + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -12417,21 +12441,23 @@ "attached_condition": "t4.c = ``.`sum(b)`", "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`f1(a)` > 1 and `sum(b)` > 123", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 3, - "filtered": 100, - "attached_condition": "t1.a + 1 > 10" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`f1(a)` > 1 and `sum(b)` > 123", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 3, + "filtered": 100, + "attached_condition": "t1.a + 1 > 10" + } } - } - ] + ] + } } } } @@ -20992,6 +21018,577 @@ 5 3289988 DROP TABLE t1,t2; # End of 10.4 tests +# MDEV-34506 2nd execution name resolution problem with pushdown into +# unions +# +# Statements affected by this bug need all the following to be true +# 1) a derived table table or view whose specification contains a set +# operation at the top level. +# 2) a grouping operator (group by/having) operating on a column alias +# other than in the first select of the union/intersect +# 3) an outer condition that will be pushed into all selects in this +# union/intersect, either into the where or having clause +# +# When pushing a condition into all selects of a unit with more than one +# select, pushdown_cond_for_derived() renames items so we can re-use the +# condition being pushed. +# These names need to be saved and reset for correct name resolution on +# second execution of prepared statements. +create table t1 (c1 int, c2 int, c3 int); +insert into t1 values (1,2,3),(1,2,2),(4,5,6); +insert into t1 values (17,8,9),(11,11,12); +create table t2 (c4 int, c5 int, c6 int); +insert into t2 values (7,8,9),(10,11,12); +prepare stmt from 'select * from +( +select c1, sum(c3) as s from t1 group by c1 +union +select c4 as c, sum(c6) as u from t2 group by c +) dt +where c1 > 6'; +execute stmt; +c1 s +11 12 +17 9 +7 9 +10 12 +execute stmt; +c1 s +11 12 +17 9 +7 9 +10 12 +prepare stmt from 'explain format=json select * from +( +select c1, sum(c3) as s from t1 group by c1 +union +select c4 as c, sum(c6) as u from t2 group by c +) dt +where c1 > 6'; +execute stmt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "dt.c1 > 6", + "materialized": { + "query_block": { + "union_result": { + "table_name": "", + "access_type": "ALL", + "query_specifications": [ + { + "query_block": { + "select_id": 2, + "filesort": { + "sort_key": "t1.c1", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 5, + "filtered": 100, + "attached_condition": "t1.c1 > 6" + } + } + ] + } + } + } + }, + { + "query_block": { + "select_id": 3, + "operation": "UNION", + "filesort": { + "sort_key": "t2.c4", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t2.c4 > 6" + } + } + ] + } + } + } + } + ] + } + } + } + } + } + ] + } +} +execute stmt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "dt.c1 > 6", + "materialized": { + "query_block": { + "union_result": { + "table_name": "", + "access_type": "ALL", + "query_specifications": [ + { + "query_block": { + "select_id": 2, + "filesort": { + "sort_key": "t1.c1", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 5, + "filtered": 100, + "attached_condition": "t1.c1 > 6" + } + } + ] + } + } + } + }, + { + "query_block": { + "select_id": 3, + "operation": "UNION", + "filesort": { + "sort_key": "t2.c4", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t2.c4 > 6" + } + } + ] + } + } + } + } + ] + } + } + } + } + } + ] + } +} +prepare stmt from 'select * from +( +select c1, c2, sum(c3) as s from t1 group by c1, c2 having s > 2 +union +select c4, c5, sum(c6) as u from t2 group by c4, c5 having u > 3 +) dt +where c2 > 5'; +execute stmt; +c1 c2 s +11 11 12 +17 8 9 +7 8 9 +10 11 12 +execute stmt; +c1 c2 s +11 11 12 +17 8 9 +7 8 9 +10 11 12 +prepare stmt from 'explain format=json select * from +( +select c1, c2, sum(c3) as s from t1 group by c1, c2 having s > 2 +union +select c4, c5, sum(c6) as u from t2 group by c4, c5 having u > 3 +) dt +where c2 > 5'; +execute stmt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "dt.c2 > 5", + "materialized": { + "query_block": { + "union_result": { + "table_name": "", + "access_type": "ALL", + "query_specifications": [ + { + "query_block": { + "select_id": 2, + "having_condition": "s > 2", + "filesort": { + "sort_key": "t1.c1, t1.c2", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 5, + "filtered": 100, + "attached_condition": "t1.c2 > 5" + } + } + ] + } + } + } + }, + { + "query_block": { + "select_id": 3, + "operation": "UNION", + "having_condition": "s > 3", + "filesort": { + "sort_key": "t2.c4, t2.c5", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t2.c5 > 5" + } + } + ] + } + } + } + } + ] + } + } + } + } + } + ] + } +} +execute stmt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "dt.c2 > 5", + "materialized": { + "query_block": { + "union_result": { + "table_name": "", + "access_type": "ALL", + "query_specifications": [ + { + "query_block": { + "select_id": 2, + "having_condition": "s > 2", + "filesort": { + "sort_key": "t1.c1, t1.c2", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 5, + "filtered": 100, + "attached_condition": "t1.c2 > 5" + } + } + ] + } + } + } + }, + { + "query_block": { + "select_id": 3, + "operation": "UNION", + "having_condition": "s > 3", + "filesort": { + "sort_key": "t2.c4, t2.c5", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t2.c5 > 5" + } + } + ] + } + } + } + } + ] + } + } + } + } + } + ] + } +} +prepare stmt from 'select * +from +( +select c1, c2, max(c3) as max_c, avg(c3) as avg_c +from t1 +group by c1,c2 +having max_c < 7 +union +select c4, c5, max(c6) as u, avg(c6) as w +from t2 +group by c4, c5 +having u < 10 +) dt, +t2 +where dt.max_c > 6 and t2.c6 > dt.c1'; +execute stmt; +c1 c2 max_c avg_c c4 c5 c6 +7 8 9 9.0000 7 8 9 +7 8 9 9.0000 10 11 12 +execute stmt; +c1 c2 max_c avg_c c4 c5 c6 +7 8 9 9.0000 7 8 9 +7 8 9 9.0000 10 11 12 +prepare stmt from 'explain format=json select * +from +( +select c1, c2, max(c3) as max_c, avg(c3) as avg_c +from t1 +group by c1,c2 +having max_c < 7 +union +select c4, c5, max(c6) as u, avg(c6) as w +from t2 +group by c4, c5 +having u < 10 +) dt, +t2 +where dt.max_c > 6 and t2.c6 > dt.c1'; +execute stmt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + }, + { + "block-nl-join": { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "dt.max_c > 6" + }, + "buffer_type": "flat", + "buffer_size": "173", + "join_type": "BNL", + "attached_condition": "t2.c6 > dt.c1", + "materialized": { + "query_block": { + "union_result": { + "table_name": "", + "access_type": "ALL", + "query_specifications": [ + { + "query_block": { + "select_id": 2, + "having_condition": "max_c < 7 and max_c > 6", + "filesort": { + "sort_key": "t1.c1, t1.c2", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 5, + "filtered": 100 + } + } + ] + } + } + } + }, + { + "query_block": { + "select_id": 3, + "operation": "UNION", + "having_condition": "max_c < 10 and max_c > 6", + "filesort": { + "sort_key": "t2.c4, t2.c5", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + ] + } + } + } + } + ] + } + } + } + } + } + ] + } +} +execute stmt; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + }, + { + "block-nl-join": { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 7, + "filtered": 100, + "attached_condition": "dt.max_c > 6" + }, + "buffer_type": "flat", + "buffer_size": "173", + "join_type": "BNL", + "attached_condition": "t2.c6 > dt.c1", + "materialized": { + "query_block": { + "union_result": { + "table_name": "", + "access_type": "ALL", + "query_specifications": [ + { + "query_block": { + "select_id": 2, + "having_condition": "max_c < 7 and max_c > 6", + "filesort": { + "sort_key": "t1.c1, t1.c2", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 5, + "filtered": 100 + } + } + ] + } + } + } + }, + { + "query_block": { + "select_id": 3, + "operation": "UNION", + "having_condition": "max_c < 10 and max_c > 6", + "filesort": { + "sort_key": "t2.c4, t2.c5", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + ] + } + } + } + } + ] + } + } + } + } + } + ] + } +} +drop table t1, t2; +# End of 10.5 tests # # MDEV-28958: condition pushable into view after simplification # contains constant TRUE/FALSE as subformula diff -Nru mariadb-10.11.6/mysql-test/main/derived_cond_pushdown.test mariadb-10.11.9/mysql-test/main/derived_cond_pushdown.test --- mariadb-10.11.6/mysql-test/main/derived_cond_pushdown.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_cond_pushdown.test 2024-08-03 07:29:57.000000000 +0000 @@ -4104,6 +4104,93 @@ --echo # End of 10.4 tests +--echo # MDEV-34506 2nd execution name resolution problem with pushdown into +--echo # unions +--echo # +--echo # Statements affected by this bug need all the following to be true +--echo # 1) a derived table table or view whose specification contains a set +--echo # operation at the top level. +--echo # 2) a grouping operator (group by/having) operating on a column alias +--echo # other than in the first select of the union/intersect +--echo # 3) an outer condition that will be pushed into all selects in this +--echo # union/intersect, either into the where or having clause +--echo # +--echo # When pushing a condition into all selects of a unit with more than one +--echo # select, pushdown_cond_for_derived() renames items so we can re-use the +--echo # condition being pushed. +--echo # These names need to be saved and reset for correct name resolution on +--echo # second execution of prepared statements. + +create table t1 (c1 int, c2 int, c3 int); +insert into t1 values (1,2,3),(1,2,2),(4,5,6); +insert into t1 values (17,8,9),(11,11,12); +create table t2 (c4 int, c5 int, c6 int); +insert into t2 values (7,8,9),(10,11,12); +let $q=select * from + ( + select c1, sum(c3) as s from t1 group by c1 + union + select c4 as c, sum(c6) as u from t2 group by c + ) dt + where c1 > 6; +eval prepare stmt from '$q'; +execute stmt; +execute stmt; + +eval prepare stmt from 'explain format=json $q'; +--source include/analyze-format.inc +execute stmt; +--source include/analyze-format.inc +execute stmt; + +let $q=select * from + ( + select c1, c2, sum(c3) as s from t1 group by c1, c2 having s > 2 + union + select c4, c5, sum(c6) as u from t2 group by c4, c5 having u > 3 + ) dt + where c2 > 5; + +eval prepare stmt from '$q'; +execute stmt; +execute stmt; + +eval prepare stmt from 'explain format=json $q'; +--source include/analyze-format.inc +execute stmt; +--source include/analyze-format.inc +execute stmt; + +let $q=select * + from + ( + select c1, c2, max(c3) as max_c, avg(c3) as avg_c + from t1 + group by c1,c2 + having max_c < 7 + union + select c4, c5, max(c6) as u, avg(c6) as w + from t2 + group by c4, c5 + having u < 10 + ) dt, + t2 + where dt.max_c > 6 and t2.c6 > dt.c1; + +eval prepare stmt from '$q'; +execute stmt; +execute stmt; + +eval prepare stmt from 'explain format=json $q'; +--source include/analyze-format.inc +execute stmt; +--source include/analyze-format.inc +execute stmt; + +drop table t1, t2; + +--echo # End of 10.5 tests + --echo # --echo # MDEV-28958: condition pushable into view after simplification --echo # contains constant TRUE/FALSE as subformula diff -Nru mariadb-10.11.6/mysql-test/main/derived_cond_pushdown_innodb.result mariadb-10.11.9/mysql-test/main/derived_cond_pushdown_innodb.result --- mariadb-10.11.6/mysql-test/main/derived_cond_pushdown_innodb.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_cond_pushdown_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,39 @@ +# +# MDEV-33010: Crash when pushing condition with CHARSET()/COERCIBILITY() +# into derived table +# +CREATE TABLE t1 (c1 BIGINT, KEY (c1)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (c2 DOUBLE UNSIGNED); +INSERT INTO t2 VALUES (1); +SET optimizer_switch='derived_merge=off'; +EXPLAIN EXTENDED +SELECT dt1_c1 FROM +(SELECT c1 AS dt1_c1 FROM t1) AS dt1 +JOIN +(SELECT 1 AS dt2_c2 FROM t2) AS dt2 +ON CHARSET(dt2_c2) BETWEEN dt1_c1 AND dt1_c1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY system NULL NULL NULL NULL 1 100.00 +1 PRIMARY ALL NULL NULL NULL NULL 2 100.00 Using where +3 DERIVED t2 system NULL NULL NULL NULL 1 100.00 +2 DERIVED t1 ref c1 c1 9 const 1 100.00 Using where; Using index +Warnings: +Warning 1292 Truncated incorrect DECIMAL value: 'binary' +Note 1003 /* select#1 */ select `dt1`.`dt1_c1` AS `dt1_c1` from (/* select#2 */ select `test`.`t1`.`c1` AS `dt1_c1` from `test`.`t1` where (charset(1)) between `test`.`t1`.`c1` and `test`.`t1`.`c1`) `dt1` where (charset(1)) between `dt1`.`dt1_c1` and `dt1`.`dt1_c1` +EXPLAIN EXTENDED +SELECT dt1_c1 FROM +(SELECT c1 AS dt1_c1 FROM t1) AS dt1 +JOIN +(SELECT 1 AS dt2_c2 FROM t2) AS dt2 +ON COERCIBILITY(dt2_c2) BETWEEN dt1_c1 AND dt1_c1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY system NULL NULL NULL NULL 1 100.00 +1 PRIMARY ALL NULL NULL NULL NULL 2 100.00 Using where +3 DERIVED t2 system NULL NULL NULL NULL 1 100.00 +2 DERIVED t1 ref c1 c1 9 const 1 100.00 Using where; Using index +Warnings: +Note 1003 /* select#1 */ select `dt1`.`dt1_c1` AS `dt1_c1` from (/* select#2 */ select `test`.`t1`.`c1` AS `dt1_c1` from `test`.`t1` where (coercibility(1)) between `test`.`t1`.`c1` and `test`.`t1`.`c1`) `dt1` where (coercibility(1)) between `dt1`.`dt1_c1` and `dt1`.`dt1_c1` +SET optimizer_switch=DEFAULT; +DROP TABLE t1, t2; +# End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/derived_cond_pushdown_innodb.test mariadb-10.11.9/mysql-test/main/derived_cond_pushdown_innodb.test --- mariadb-10.11.6/mysql-test/main/derived_cond_pushdown_innodb.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_cond_pushdown_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,31 @@ +--source include/have_innodb.inc + +--echo # +--echo # MDEV-33010: Crash when pushing condition with CHARSET()/COERCIBILITY() +--echo # into derived table +--echo # +CREATE TABLE t1 (c1 BIGINT, KEY (c1)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 (c2 DOUBLE UNSIGNED); +INSERT INTO t2 VALUES (1); + +SET optimizer_switch='derived_merge=off'; + +EXPLAIN EXTENDED + SELECT dt1_c1 FROM + (SELECT c1 AS dt1_c1 FROM t1) AS dt1 + JOIN + (SELECT 1 AS dt2_c2 FROM t2) AS dt2 + ON CHARSET(dt2_c2) BETWEEN dt1_c1 AND dt1_c1; + +EXPLAIN EXTENDED + SELECT dt1_c1 FROM + (SELECT c1 AS dt1_c1 FROM t1) AS dt1 + JOIN + (SELECT 1 AS dt2_c2 FROM t2) AS dt2 + ON COERCIBILITY(dt2_c2) BETWEEN dt1_c1 AND dt1_c1; + +SET optimizer_switch=DEFAULT; +DROP TABLE t1, t2; + +--echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/derived_split_innodb.result mariadb-10.11.9/mysql-test/main/derived_split_innodb.result --- mariadb-10.11.6/mysql-test/main/derived_split_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_split_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -862,5 +862,77 @@ a b DROP VIEW v; DROP TABLE t1, t2, t3; +# +# MDEV-31279 Crash when lateral derived is guaranteed to return no rows +# +CREATE TABLE t1 (a CHAR(1)) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('1'),('2'); +CREATE TABLE t2 (b INT, KEY(b)) ENGINE=MyISAM; +ALTER TABLE t2 DISABLE KEYS; +INSERT INTO t2 VALUES (1),(2),(3); +ALTER TABLE t2 ENABLE KEYS; +CREATE TABLE t3 (c INT) ENGINE=MyISAM; +INSERT INTO t3 (c) SELECT seq FROM seq_1_to_101; +SELECT * FROM t1 WHERE t1.a IN (SELECT b FROM +(SELECT t2.b FROM t2 WHERE NOT EXISTS (SELECT 1 FROM t3) GROUP BY b) sq); +a +DROP TABLE t1, t2, t3; +# +# MDEV-23878: Wrong result with semi-join and splittable derived table +# +CREATE TABLE t1 ( +groupId int, +id int unsigned, +PRIMARY KEY (groupId, id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +INSERT INTO t1 VALUES +(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(8,10), +(8,11),(8,12),(8,13),(8,14),(8,15),(8,16),(8,17),(8,18),(8,19); +set statement in_predicate_conversion_threshold=2 for SELECT COUNT(*) AS cnt FROM t1 +JOIN +( +SELECT groupId, id +FROM t1 +WHERE id IN (1,2,3,4,5,6) +GROUP BY groupId, id +) AS t2 +USING (groupId, id) +WHERE id IN (1,2,3,4,5,6,7,8); +cnt +6 +set statement in_predicate_conversion_threshold=2 for EXPLAIN SELECT COUNT(*) AS cnt FROM t1 +JOIN +( +SELECT groupId, id +FROM t1 +WHERE id IN (1,2,3,4,5,6) +GROUP BY groupId, id +) AS t2 +USING (groupId, id) +WHERE id IN (1,2,3,4,5,6,7,8); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 index PRIMARY PRIMARY 8 NULL 19 Using index +1 PRIMARY eq_ref distinct_key distinct_key 4 func 1 Using where +1 PRIMARY ref key0 key0 8 test.t1.groupId,test.t1.id 2 +4 MATERIALIZED ALL NULL NULL NULL NULL 8 +5 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used +3 LATERAL DERIVED t1 eq_ref PRIMARY PRIMARY 8 test.t1.groupId,test.t1.id 1 Using index +3 LATERAL DERIVED ref key0 key0 4 test.t1.id 2 Using where; FirstMatch(t1) +7 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used +set statement optimizer_switch='split_materialized=off, loosescan=off' for +set statement in_predicate_conversion_threshold=2 for +SELECT COUNT(*) AS cnt FROM t1 +JOIN +( +SELECT groupId, id +FROM t1 +WHERE id IN (1,2,3,4,5,6) +GROUP BY groupId, id +) AS t2 +USING (groupId, id) +WHERE id IN (1,2,3,4,5,6,7,8); +cnt +6 +DROP TABLE t1; # End of 10.4 tests SET GLOBAL innodb_stats_persistent=@save_innodb_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/main/derived_split_innodb.test mariadb-10.11.9/mysql-test/main/derived_split_innodb.test --- mariadb-10.11.6/mysql-test/main/derived_split_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_split_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -487,6 +487,66 @@ DROP VIEW v; DROP TABLE t1, t2, t3; +--echo # +--echo # MDEV-31279 Crash when lateral derived is guaranteed to return no rows +--echo # + +CREATE TABLE t1 (a CHAR(1)) ENGINE=MyISAM; +INSERT INTO t1 VALUES ('1'),('2'); +CREATE TABLE t2 (b INT, KEY(b)) ENGINE=MyISAM; +ALTER TABLE t2 DISABLE KEYS; +INSERT INTO t2 VALUES (1),(2),(3); +ALTER TABLE t2 ENABLE KEYS; +CREATE TABLE t3 (c INT) ENGINE=MyISAM; +INSERT INTO t3 (c) SELECT seq FROM seq_1_to_101; + +SELECT * FROM t1 WHERE t1.a IN (SELECT b FROM + (SELECT t2.b FROM t2 WHERE NOT EXISTS (SELECT 1 FROM t3) GROUP BY b) sq); + +DROP TABLE t1, t2, t3; + +--echo # +--echo # MDEV-23878: Wrong result with semi-join and splittable derived table +--echo # + +CREATE TABLE t1 ( + groupId int, + id int unsigned, + PRIMARY KEY (groupId, id) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO t1 VALUES + (8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(8,10), + (8,11),(8,12),(8,13),(8,14),(8,15),(8,16),(8,17),(8,18),(8,19); + +let $query= +SELECT COUNT(*) AS cnt FROM t1 +JOIN +( + SELECT groupId, id + FROM t1 + WHERE id IN (1,2,3,4,5,6) + GROUP BY groupId, id +) AS t2 +USING (groupId, id) +WHERE id IN (1,2,3,4,5,6,7,8); + +let $tvc_conversion_threshold = + set statement in_predicate_conversion_threshold=2 for; + +eval $tvc_conversion_threshold $query; +eval $tvc_conversion_threshold EXPLAIN $query; + +let $no_split_materialized_loosescan= + set statement optimizer_switch='split_materialized=off, loosescan=off' for; + +# Correct result with split materializied optimization disabled +eval $no_split_materialized_loosescan + $tvc_conversion_threshold + $query; + +DROP TABLE t1; + --echo # End of 10.4 tests SET GLOBAL innodb_stats_persistent=@save_innodb_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/main/derived_view.result mariadb-10.11.9/mysql-test/main/derived_view.result --- mariadb-10.11.6/mysql-test/main/derived_view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_view.result 2024-08-03 07:29:57.000000000 +0000 @@ -4246,8 +4246,119 @@ deallocate prepare stmt; drop view v; drop table t1,t2,t3; +# +# MDEV-32829 Crash when executing PS for query with eliminated subquery +# using view +# +create view v1 as select 1 as a; +prepare stmt from +'SELECT EXISTS (SELECT 1 FROM v1 GROUP BY a IN (SELECT a FROM v1))'; +execute stmt; +EXISTS (SELECT 1 FROM v1 GROUP BY a IN (SELECT a FROM v1)) +1 +drop view v1; +create table t1 (a int, b int); +insert into t1 values (1,2),(3,4),(5,6); +create view v1 as select * from t1; +create table t2 select * from t1; +prepare stmt from "select t2.a from t2 where exists +( +select * from t1 where t2.b = t1.b and t1.b != 6 +group by a in (select a from v1 where v1.a = t2.a) +)"; +execute stmt; +a +1 +3 +execute stmt; +a +1 +3 +deallocate prepare stmt; +create procedure aproc() select t2.a from t2 where exists +( +select * from t1 where t2.b = t1.b and t1.b != 6 +group by a in (select a from v1 where v1.a = t2.a) +); +call aproc(); +a +1 +3 +call aproc(); +a +1 +3 +drop table t1, t2; +drop view v1; +drop procedure aproc; +# +# MDEV-31305: Aggregation over materialized derived table +# +CREATE VIEW v AS +SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3, +FLOOR(RAND(13) * 5) AS p +FROM seq_100_to_105 seq1 +JOIN seq_10_to_15 seq2 +JOIN seq_1_to_5 seq3; +SELECT v.*, SUM(p) from v; +dim1 dim2 dim3 p SUM(p) +100 10 1 2 371 +SELECT d.*, SUM(p) +FROM ( +SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3, +FLOOR(RAND(13) * 5) AS p +FROM seq_100_to_105 seq1 +JOIN seq_10_to_15 seq2 +JOIN seq_1_to_5 seq3 +) d; +dim1 dim2 dim3 p SUM(p) +100 10 1 2 371 +WITH demo AS +( +SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3, +FLOOR(RAND(13) * 5) AS p +FROM seq_100_to_105 seq1 +JOIN seq_10_to_15 seq2 +JOIN seq_1_to_5 seq3 +) +SELECT d.*, SUM(p) FROM demo d; +dim1 dim2 dim3 p SUM(p) +100 10 1 2 371 +DROP VIEW v; # End of 10.4 tests # +# MDEV-31277: 2-nd execution of PS to select from materialized view +# specified as left join whose inner table is mergeable +# derived containing a constant column +# +create table t1 ( +Election int(10) unsigned NOT NULL +) engine=MyISAM; +insert into t1 (Election) values (1), (4); +create table t2 ( +VoteID int(10), +ElectionID int(10), +UserID int(10) +); +insert into t2 (ElectionID, UserID) values (2, 30), (3, 30); +create view v1 as select * from t1 +left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T +on T.ElectionID = t1.Election +limit 9; +prepare stmt1 from "select * from v1"; +execute stmt1; +Election Voted ElectionID +1 NULL NULL +4 NULL NULL +execute stmt1; +Election Voted ElectionID +1 NULL NULL +4 NULL NULL +deallocate prepare stmt1; +drop view v1; +drop table t1, t2; +# End of 10.5 tests +# # MDEV-31143: view with ORDER BY used in query with rownum() in WHERE # create table t1 (id int primary key); diff -Nru mariadb-10.11.6/mysql-test/main/derived_view.test mariadb-10.11.9/mysql-test/main/derived_view.test --- mariadb-10.11.6/mysql-test/main/derived_view.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/derived_view.test 2024-08-03 07:29:57.000000000 +0000 @@ -2759,9 +2759,117 @@ drop view v; drop table t1,t2,t3; +--echo # +--echo # MDEV-32829 Crash when executing PS for query with eliminated subquery +--echo # using view +--echo # + +create view v1 as select 1 as a; +prepare stmt from + 'SELECT EXISTS (SELECT 1 FROM v1 GROUP BY a IN (SELECT a FROM v1))'; +execute stmt; +drop view v1; + +create table t1 (a int, b int); +insert into t1 values (1,2),(3,4),(5,6); +create view v1 as select * from t1; +create table t2 select * from t1; + +let $q= +select t2.a from t2 where exists +( + select * from t1 where t2.b = t1.b and t1.b != 6 + group by a in (select a from v1 where v1.a = t2.a) +); + +eval prepare stmt from "$q"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +eval create procedure aproc() $q; +call aproc(); +call aproc(); + +drop table t1, t2; +drop view v1; +drop procedure aproc; + +--echo # +--echo # MDEV-31305: Aggregation over materialized derived table +--echo # + +--source include/have_sequence.inc + +CREATE VIEW v AS + SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3, + FLOOR(RAND(13) * 5) AS p + FROM seq_100_to_105 seq1 + JOIN seq_10_to_15 seq2 + JOIN seq_1_to_5 seq3; + +SELECT v.*, SUM(p) from v; + +SELECT d.*, SUM(p) + FROM ( + SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3, + FLOOR(RAND(13) * 5) AS p + FROM seq_100_to_105 seq1 + JOIN seq_10_to_15 seq2 + JOIN seq_1_to_5 seq3 +) d; + +WITH demo AS +( + SELECT seq1.seq AS dim1, seq2.seq AS dim2, seq3.seq AS dim3, + FLOOR(RAND(13) * 5) AS p + FROM seq_100_to_105 seq1 + JOIN seq_10_to_15 seq2 + JOIN seq_1_to_5 seq3 +) +SELECT d.*, SUM(p) FROM demo d; + +DROP VIEW v; + --echo # End of 10.4 tests --echo # +--echo # MDEV-31277: 2-nd execution of PS to select from materialized view +--echo # specified as left join whose inner table is mergeable +--echo # derived containing a constant column +--echo # + +create table t1 ( + Election int(10) unsigned NOT NULL +) engine=MyISAM; + +insert into t1 (Election) values (1), (4); + +create table t2 ( + VoteID int(10), + ElectionID int(10), + UserID int(10) +); + +insert into t2 (ElectionID, UserID) values (2, 30), (3, 30); +create view v1 as select * from t1 + left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T + on T.ElectionID = t1.Election +limit 9; + +prepare stmt1 from "select * from v1"; + +execute stmt1; +execute stmt1; + +deallocate prepare stmt1; + +drop view v1; +drop table t1, t2; + +--echo # End of 10.5 tests + +--echo # --echo # MDEV-31143: view with ORDER BY used in query with rownum() in WHERE --echo # diff -Nru mariadb-10.11.6/mysql-test/main/desc_index_range.result mariadb-10.11.9/mysql-test/main/desc_index_range.result --- mariadb-10.11.6/mysql-test/main/desc_index_range.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/desc_index_range.result 2024-08-03 07:29:57.000000000 +0000 @@ -7,9 +7,9 @@ explain select * from t1 force index(a) where a in (2, 4, 6); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range a a 5 NULL 3 Using where; Using index -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +jd [ [ "(6) <= (a DESC) <= (6)", @@ -38,18 +38,18 @@ explain select * from t1 force index(ab) where a>=8 and b>=50; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range ab ab 4 NULL 51 Using where; Using index -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +jd [ ["(8) <= (a)"] ] explain select * from t1 force index(ab) where a>=8 and b<=50; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range ab ab 8 NULL 46 Using where; Using index -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +jd [ ["(8,50) <= (a,b DESC)"] ] @@ -91,9 +91,9 @@ select * from t1 where a between 2 and 4 and b between 50 and 80; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range ab ab 8 NULL 17 Using where; Using index -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +jd [ ["(2,80) <= (a,b DESC) <= (4,50)"] ] @@ -122,9 +122,9 @@ select * from t2 where a between 2 and 4; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 range ab ab 4 NULL 40 Using where; Using index -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +jd [ ["(4) <= (a DESC) <= (2)"] ] @@ -132,9 +132,9 @@ select * from t2 where a between 2 and 4 and b between 50 and 80; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 range ab ab 8 NULL 31 Using where; Using index -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +jd [ ["(4,80) <= (a DESC,b DESC) <= (2,50)"] ] @@ -147,9 +147,9 @@ EXPLAIN select MIN(a) from t1 where p = 2 group by p; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref PRIMARY PRIMARY 4 const 1000 Using index -select json_detailed(json_extract(trace, '$**.potential_group_range_indexes')) +select json_detailed(json_extract(trace, '$**.potential_group_range_indexes')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.potential_group_range_indexes')) +jd [ [ { diff -Nru mariadb-10.11.6/mysql-test/main/desc_index_range.test mariadb-10.11.9/mysql-test/main/desc_index_range.test --- mariadb-10.11.6/mysql-test/main/desc_index_range.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/desc_index_range.test 2024-08-03 07:29:57.000000000 +0000 @@ -16,12 +16,12 @@ set optimizer_trace=1; explain select * from t1 force index(a) where a in (2, 4, 6); -#enable after fix MDEV-27871 +#Enable after fix MDEV-32034 --disable_view_protocol -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; ---enable_view_protocol set optimizer_trace=default; +--enable_view_protocol --echo # These should go in reverse order: select * from t1 force index(a) where a in (2, 4, 6); @@ -38,26 +38,29 @@ insert into t1 select A.seq, B.seq*10 from seq_1_to_10 A, seq_1_to_10 B; -#enable after fix MDEV-27871 ---disable_view_protocol set optimizer_trace=1; explain select * from t1 force index(ab) where a>=8 and b>=50; -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; +--enable_view_protocol explain select * from t1 force index(ab) where a>=8 and b<=50; -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; --enable_view_protocol select * from t1 force index(ab) where a>=8 and b<=50; select * from t1 ignore index(ab) where a>=8 and b<=50 order by a, b desc; -#enable after fix MDEV-27871 ---disable_view_protocol explain select * from t1 where a between 2 and 4 and b between 50 and 80; -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; --enable_view_protocol @@ -72,16 +75,19 @@ ); insert into t2 select A.seq, B.seq*10 from seq_1_to_10 A, seq_1_to_10 B; -#enable after fix MDEV-27871 ---disable_view_protocol explain select * from t2 where a between 2 and 4; -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; +--enable_view_protocol explain select * from t2 where a between 2 and 4 and b between 50 and 80; -select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.range_access_plan.ranges')) as jd from information_schema.optimizer_trace; --enable_view_protocol @@ -93,9 +99,9 @@ CREATE TABLE t1 (p int NOT NULL, a int NOT NULL, PRIMARY KEY (p,a desc)); insert into t1 select 2,seq from seq_0_to_1000; EXPLAIN select MIN(a) from t1 where p = 2 group by p; -#enable after fix MDEV-27871 +#Enable after fix MDEV-32034 --disable_view_protocol -select json_detailed(json_extract(trace, '$**.potential_group_range_indexes')) +select json_detailed(json_extract(trace, '$**.potential_group_range_indexes')) as jd from information_schema.optimizer_trace; --enable_view_protocol drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/disabled.def mariadb-10.11.9/mysql-test/main/disabled.def --- mariadb-10.11.6/mysql-test/main/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/disabled.def 2024-08-03 07:29:57.000000000 +0000 @@ -17,4 +17,3 @@ file_contents : MDEV-6526 these files are not installed anymore max_statement_time : cannot possibly work, depends on timing partition_open_files_limit : open_files_limit check broken by MDEV-18360 -partition_innodb : Waiting for fix MDEV-20169 diff -Nru mariadb-10.11.6/mysql-test/main/distinct_notembedded.result mariadb-10.11.9/mysql-test/main/distinct_notembedded.result --- mariadb-10.11.6/mysql-test/main/distinct_notembedded.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/distinct_notembedded.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,322 @@ +# +# MDEV-30660 COUNT DISTINCT seems unnecessarily slow when run on a PK +# +set @save_optimizer_trace = @@optimizer_trace; +SET optimizer_trace='enabled=on'; +CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b INT NOT NULL); +INSERT INTO t1 VALUES (1,1), (2,1), (3,1); +# Optimization is applied (aggregator=simple): +SELECT COUNT(DISTINCT a) FROM t1; +COUNT(DISTINCT a) +3 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.a)", + "aggregator_type": "simple" + } +] +SELECT AVG(DISTINCT a), SUM(DISTINCT b) FROM t1; +AVG(DISTINCT a) SUM(DISTINCT b) +2.0000 1 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "avg(distinct t1.a)", + "aggregator_type": "simple" + }, + { + "function": "sum(distinct t1.b)", + "aggregator_type": "distinct" + } +] +# Only `a` is unique but it's enough to eliminate DISTINCT: +SELECT COUNT(DISTINCT b, a) FROM t1; +COUNT(DISTINCT b, a) +3 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.b,t1.a)", + "aggregator_type": "simple" + } +] +SELECT COUNT(DISTINCT a, a + b) FROM t1; +COUNT(DISTINCT a, a + b) +3 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.a,t1.a + t1.b)", + "aggregator_type": "simple" + } +] +SELECT SUM(DISTINCT a), AVG(DISTINCT a), COUNT(DISTINCT a) FROM t1 WHERE a > 1; +SUM(DISTINCT a) AVG(DISTINCT a) COUNT(DISTINCT a) +5 2.5000 2 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "sum(distinct t1.a)", + "aggregator_type": "simple" + }, + { + "function": "avg(distinct t1.a)", + "aggregator_type": "simple" + }, + { + "function": "count(distinct t1.a)", + "aggregator_type": "simple" + } +] +# Optimization is not applied 'cause function argument is not a field +# (aggregator=distinct): +SELECT SUM(DISTINCT a + b) FROM t1; +SUM(DISTINCT a + b) +9 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "sum(distinct t1.a + t1.b)", + "aggregator_type": "distinct" + } +] +SELECT COUNT(DISTINCT b) FROM t1; +COUNT(DISTINCT b) +1 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.b)", + "aggregator_type": "distinct" + } +] +SELECT AVG(DISTINCT b / a) FROM t1; +AVG(DISTINCT b / a) +0.61110000 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "avg(distinct t1.b / t1.a)", + "aggregator_type": "distinct" + } +] +EXPLAIN SELECT COUNT(DISTINCT (SELECT a)) FROM t1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 index NULL PRIMARY 4 NULL 3 Using index +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct (/* select#2 */ select t1.a))", + "aggregator_type": "distinct" + } +] +CREATE TABLE t2 (a INT); +INSERT INTO t2 VALUES (1), (2); +# Optimization is not applied 'cause there is more than one table +SELECT COUNT(DISTINCT t1.a) FROM t1, t2; +COUNT(DISTINCT t1.a) +3 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.a)", + "aggregator_type": "distinct" + } +] +SELECT AVG(DISTINCT t1.a) FROM t1, t2; +AVG(DISTINCT t1.a) +2.0000 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "avg(distinct t1.a)", + "aggregator_type": "distinct" + } +] +# Const tables, optimization is applied +SELECT COUNT(DISTINCT a) FROM t1, (SELECT 1) AS t2; +COUNT(DISTINCT a) +3 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.a)", + "aggregator_type": "simple" + } +] +SELECT AVG(DISTINCT t1.a) FROM (SELECT 1 AS a) AS t2, t1, (SELECT 2 AS a) AS t3; +AVG(DISTINCT t1.a) +2.0000 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "avg(distinct t1.a)", + "aggregator_type": "simple" + } +] +SELECT COUNT(DISTINCT a) FROM t1, (SELECT 1 UNION SELECT 2) AS t2; +COUNT(DISTINCT a) +3 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.a)", + "aggregator_type": "distinct" + } +] +# Unique index on two columns +CREATE TABLE t3 (a INT NOT NULL, b INT NOT NULL); +INSERT INTO t3 VALUES (1,1), (1,2), (1,3), (2,1), (2,2), (3,1), (3,2); +CREATE UNIQUE INDEX t3_a_b ON t3 (a, b); +# Optimization is applied: +SELECT COUNT(DISTINCT a, b) FROM t3; +COUNT(DISTINCT a, b) +7 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t3.a,t3.b)", + "aggregator_type": "simple" + } +] +SELECT COUNT(DISTINCT b, a) FROM t3; +COUNT(DISTINCT b, a) +7 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t3.b,t3.a)", + "aggregator_type": "simple" + } +] +SELECT COUNT(DISTINCT b, a) FROM t3 WHERE a < 3; +COUNT(DISTINCT b, a) +5 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t3.b,t3.a)", + "aggregator_type": "simple" + } +] +# Optimization is applied to one of the functions: +SELECT COUNT(DISTINCT b), SUM(DISTINCT a), SUM(DISTINCT a + b) FROM t3 GROUP BY a; +COUNT(DISTINCT b) SUM(DISTINCT a) SUM(DISTINCT a + b) +3 1 9 +2 2 7 +2 3 9 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t3.b)", + "aggregator_type": "simple" + }, + { + "function": "sum(distinct t3.a)", + "aggregator_type": "distinct" + }, + { + "function": "sum(distinct t3.a + t3.b)", + "aggregator_type": "distinct" + } +] +# Can't apply optimization 'cause GROUP BY argument is not a field: +SELECT COUNT(DISTINCT b) FROM t3 GROUP BY a+b; +COUNT(DISTINCT b) +1 +2 +3 +1 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t3.b)", + "aggregator_type": "distinct" + } +] +# Test merged view +CREATE VIEW v1 AS SELECT * FROM t1; +# Optimization is applied +SELECT COUNT(DISTINCT a, b) FROM v1; +COUNT(DISTINCT a, b) +3 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "count(distinct t1.a,t1.b)", + "aggregator_type": "simple" + } +] +# GROUP_CONCAT implements non-standard distinct aggregator +SELECT GROUP_CONCAT(b) FROM t1; +GROUP_CONCAT(b) +1,1,1 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "group_concat(t1.b separator ',')", + "aggregator_type": "simple" + } +] +SELECT GROUP_CONCAT(DISTINCT b) FROM t1; +GROUP_CONCAT(DISTINCT b) +1 +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.prepare_sum_aggregators')) AS JS +FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS +[ + { + "function": "group_concat(distinct t1.b separator ',')", + "aggregator_type": "distinct" + } +] +DROP TABLE t1, t2, t3; +DROP VIEW v1; +SET optimizer_trace = @save_optimizer_trace; +# +# end of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/distinct_notembedded.test mariadb-10.11.9/mysql-test/main/distinct_notembedded.test --- mariadb-10.11.6/mysql-test/main/distinct_notembedded.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/distinct_notembedded.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,113 @@ +# Embedded doesn't have optimizer trace: +--source include/not_embedded.inc +--source include/have_sequence.inc + +--echo # +--echo # MDEV-30660 COUNT DISTINCT seems unnecessarily slow when run on a PK +--echo # + +#Enable after fix MDEV-32034 +--disable_view_protocol +set @save_optimizer_trace = @@optimizer_trace; +SET optimizer_trace='enabled=on'; +let $trace= +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '\$**.prepare_sum_aggregators')) AS JS + FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE; + +CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b INT NOT NULL); +INSERT INTO t1 VALUES (1,1), (2,1), (3,1); + +--echo # Optimization is applied (aggregator=simple): +SELECT COUNT(DISTINCT a) FROM t1; +eval $trace; + +SELECT AVG(DISTINCT a), SUM(DISTINCT b) FROM t1; +eval $trace; + +--echo # Only `a` is unique but it's enough to eliminate DISTINCT: +SELECT COUNT(DISTINCT b, a) FROM t1; +eval $trace; + +SELECT COUNT(DISTINCT a, a + b) FROM t1; +eval $trace; + +SELECT SUM(DISTINCT a), AVG(DISTINCT a), COUNT(DISTINCT a) FROM t1 WHERE a > 1; +eval $trace; + +--echo # Optimization is not applied 'cause function argument is not a field +--echo # (aggregator=distinct): +SELECT SUM(DISTINCT a + b) FROM t1; +eval $trace; + +SELECT COUNT(DISTINCT b) FROM t1; +eval $trace; + +SELECT AVG(DISTINCT b / a) FROM t1; +eval $trace; + +EXPLAIN SELECT COUNT(DISTINCT (SELECT a)) FROM t1; +eval $trace; + +CREATE TABLE t2 (a INT); +INSERT INTO t2 VALUES (1), (2); + +--echo # Optimization is not applied 'cause there is more than one table +SELECT COUNT(DISTINCT t1.a) FROM t1, t2; +eval $trace; + +SELECT AVG(DISTINCT t1.a) FROM t1, t2; +eval $trace; + +--echo # Const tables, optimization is applied +SELECT COUNT(DISTINCT a) FROM t1, (SELECT 1) AS t2; +eval $trace; + +SELECT AVG(DISTINCT t1.a) FROM (SELECT 1 AS a) AS t2, t1, (SELECT 2 AS a) AS t3; +eval $trace; + +SELECT COUNT(DISTINCT a) FROM t1, (SELECT 1 UNION SELECT 2) AS t2; +eval $trace; + +--echo # Unique index on two columns +CREATE TABLE t3 (a INT NOT NULL, b INT NOT NULL); +INSERT INTO t3 VALUES (1,1), (1,2), (1,3), (2,1), (2,2), (3,1), (3,2); +CREATE UNIQUE INDEX t3_a_b ON t3 (a, b); +--echo # Optimization is applied: +SELECT COUNT(DISTINCT a, b) FROM t3; +eval $trace; + +SELECT COUNT(DISTINCT b, a) FROM t3; +eval $trace; + +SELECT COUNT(DISTINCT b, a) FROM t3 WHERE a < 3; +eval $trace; + +--echo # Optimization is applied to one of the functions: +SELECT COUNT(DISTINCT b), SUM(DISTINCT a), SUM(DISTINCT a + b) FROM t3 GROUP BY a; +eval $trace; + +--echo # Can't apply optimization 'cause GROUP BY argument is not a field: +SELECT COUNT(DISTINCT b) FROM t3 GROUP BY a+b; +eval $trace; + +--echo # Test merged view +CREATE VIEW v1 AS SELECT * FROM t1; +--echo # Optimization is applied +SELECT COUNT(DISTINCT a, b) FROM v1; +eval $trace; + +--echo # GROUP_CONCAT implements non-standard distinct aggregator +SELECT GROUP_CONCAT(b) FROM t1; +eval $trace; + +SELECT GROUP_CONCAT(DISTINCT b) FROM t1; +eval $trace; + +DROP TABLE t1, t2, t3; +DROP VIEW v1; +SET optimizer_trace = @save_optimizer_trace; +--enable_view_protocol + +--echo # +--echo # end of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/drop.result mariadb-10.11.9/mysql-test/main/drop.result --- mariadb-10.11.6/mysql-test/main/drop.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/drop.result 2024-08-03 07:29:57.000000000 +0000 @@ -258,3 +258,8 @@ Warnings: Note 1008 Can't drop database 'mysqltest'; database doesn't exist set @@session.sql_if_exists=0; +# +# MDEV-34205 ASAN stack-buffer-overflow in strxnmov | frm_file_exists +# +DROP TABLE `##################################################_long`.`#################################################_long`; +ERROR 42S02: Unknown table '##################################################_long.#########################################...' diff -Nru mariadb-10.11.6/mysql-test/main/drop.test mariadb-10.11.9/mysql-test/main/drop.test --- mariadb-10.11.6/mysql-test/main/drop.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/drop.test 2024-08-03 07:29:57.000000000 +0000 @@ -361,3 +361,9 @@ drop database mysqltest; drop database mysqltest; set @@session.sql_if_exists=0; + +--echo # +--echo # MDEV-34205 ASAN stack-buffer-overflow in strxnmov | frm_file_exists +--echo # +--error ER_BAD_TABLE_ERROR +DROP TABLE `##################################################_long`.`#################################################_long`; diff -Nru mariadb-10.11.6/mysql-test/main/dyncol.result mariadb-10.11.9/mysql-test/main/dyncol.result --- mariadb-10.11.6/mysql-test/main/dyncol.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/dyncol.result 2024-08-03 07:29:57.000000000 +0000 @@ -150,7 +150,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select hex(column_create(1,'afaf' AS char charset utf8mb3 ,2,1212 AS unsigned int,3,1212 AS int,4,12.12 AS double,4 + 1,12.12 AS decimal,6,'2011-04-05' AS date,7,'- 0:45:49.000001' AS time,8,'2011-04-05 0:45:49.000001' AS datetime)) AS `ex` +Note 1003 select hex(column_create(1,'afaf' AS char charset utf8mb3 collate utf8mb3_general_ci ,2,1212 AS unsigned int,3,1212 AS int,4,12.12 AS double,4 + 1,12.12 AS decimal,6,'2011-04-05' AS date,7,'- 0:45:49.000001' AS time,8,'2011-04-05 0:45:49.000001' AS datetime)) AS `ex` select hex(column_create(1, 0.0 AS decimal)); hex(column_create(1, 0.0 AS decimal)) 000100010004 @@ -354,7 +354,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select column_get(column_create(1,'1212' AS char charset utf8mb3 ),1 as char charset utf8mb3) AS `ex` +Note 1003 select column_get(column_create(1,'1212' AS char charset utf8mb3 collate utf8mb3_general_ci ),1 as char charset utf8mb3) AS `ex` select column_get(column_create(1, 1212 AS unsigned int), 1 as char charset utf8) as ex; ex 1212 @@ -414,7 +414,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select column_get(column_create(1,'1212' AS char charset utf8mb3 ),1 as char charset binary) AS `ex` +Note 1003 select column_get(column_create(1,'1212' AS char charset utf8mb3 collate utf8mb3_general_ci ),1 as char charset binary) AS `ex` # # column get real # @@ -1882,7 +1882,7 @@ create view v1 as select column_get(column_add(column_create(1 , 'blue' as char), 2, 'ttt'), 1 as char); show create view v1; View Create View character_set_client collation_connection -v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select column_get(column_add(column_create(1,'blue' AS char charset utf8mb3 ),2,'ttt'),1 as char charset utf8mb3) AS `Name_exp_1` utf8mb3 utf8mb3_general_ci +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select column_get(column_add(column_create(1,'blue' AS char charset utf8mb3 collate utf8mb3_general_ci ),2,'ttt'),1 as char charset utf8mb3) AS `Name_exp_1` utf8mb3 utf8mb3_general_ci select * from v1; Name_exp_1 blue @@ -1949,3 +1949,28 @@ # # End of 10.4 tests # +# +# MDEV-33788 HEX(COLUMN_CREATE(.. AS CHAR ...)) fails with --view-protocol +# +SELECT hex(column_create(1,'a' AS CHAR CHARACTER SET utf8mb3 COLLATE utf8mb3_bin)) AS ex; +ex +0001000100035361 +SELECT hex(column_add(column_create( +1, 'a' AS CHAR CHARACTER SET utf8mb3 COLLATE utf8mb3_bin), +2, 'b' AS CHAR CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci)) AS ex; +ex +00020001000302001353612162 +# +# MDEV-31566 Fix buffer overrun of column_json function +# +create table t1 ( +c1 varchar(32) primary key, +d1 blob +); +insert into t1 values ('var', 0x0402000A0000000300030023076A736E7375626A6563742E0005006C0027000200290002002B0002002D0002002F0002000C31000C3B000C4B000C51000F62006631663266336634663509E5A79AE8BF9CE6B48B0FE8819AE9809AE98791E6A1A5E5BA970537343530301031313634332F393634352F31313630300C080000000000EFBFBDEFBFBD192E), ('zzz', 0x0402000900000003000300740C6A736E766F6C756D652E000900EFBFBD004300020045000200470003004A0004004E00050053000500580005005D000500620005000C67000C6A000C6D000C7000052C00051B00052C000CEFBFBD0007EFBFBD006638663966313070696332626F785F63626F785F67626F785F6B626F785F7666355F696402343402343402333241687474703A2F2F6F73732E68646238382E636F6D2F302F70686F746F2F30373865653765376336343634616236386130343833373333323636613532612E67696608302E303532323732244F1E00030180C106); +select c1,column_json(d1) as not_crashing from t1 order by c1; +c1 not_crashing +var {"jsn":"\u0000\u0005\u0000l\u0000'\u0000\u0002\u0000)\u0000\u0002\u0000+\u0000\u0002\u0000-\u0000\u0002\u0000/\u0000\u0002\u0000\u000C1\u0000\u000C;\u0000\u000CK\u0000\u000CQ\u0000\u000Fb\u0000f1f2f3f4f5\u0009姚远洋\u000Fèšé€šé‡‘桥店\u000574500\u001011643/9645/11600\u000C\u0008\u0000\u0000\u0000\u0000\u0000��\u0019","subject":""} +zzz {"jsn":"\u0000\u0009\u0000�\u0000C\u0000\u0002\u0000E\u0000\u0002\u0000G\u0000\u0003\u0000J\u0000\u0004\u0000N\u0000\u0005\u0000S\u0000\u0005\u0000X\u0000\u0005\u0000]\u0000\u0005\u0000b\u0000\u0005\u0000\u000Cg\u0000\u000Cj\u0000\u000Cm\u0000\u000Cp\u0000\u0005,\u0000\u0005\u001B\u0000\u0005,\u0000\u000C�\u0000\u0007�\u0000f8f9f10pic2box_cbox_gbox_kbox_vf5_id\u000244\u000244\u000232Ahttp://oss.hdb88.com/0/photo/078ee7e7c6464ab68a0483733266a52a.gif\u00080.052272$O\u001E\u0000","volume":193.6} +drop table t1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/dyncol.test mariadb-10.11.9/mysql-test/main/dyncol.test --- mariadb-10.11.6/mysql-test/main/dyncol.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/dyncol.test 2024-08-03 07:29:57.000000000 +0000 @@ -670,18 +670,16 @@ --echo # --echo # creation test (names) set names utf8; -#enable after MDEV-32465 fix ---disable_view_protocol +--disable_service_connection select hex(column_create("адын", 1212)); ---enable_view_protocol +--enable_service_connection select hex(column_create("1212", 1212)); select hex(column_create(1212, 2, "www", 3)); select hex(column_create("1212", 2, "www", 3)); select hex(column_create("1212", 2, 3, 3)); -#enable after MDEV-32465 fix ---disable_view_protocol +--disable_service_connection select hex(column_create("1212", 2, "адын", 1, 3, 3)); ---enable_view_protocol +--enable_service_connection set names latin1; --echo # fetching column test (names) @@ -708,15 +706,14 @@ set names latin1; --echo # column changing test (names) -#enable after MDEV-32465 fix ---disable_view_protocol +--disable_service_connection select hex(column_add(column_create(1, "AAA"), "b", "BBB")) as ex; select hex(column_add(column_create("1", "AAA"), "b", "BBB")) as ex; select column_get(column_add(column_create(1, "AAA"), "b", "BBB"), 1 as char) as ex; select column_get(column_add(column_create(1, "AAA"), "b", "BBB"), "b" as char) as ex; select hex(column_add(column_create("a", "AAA"), 1, "BBB")) as ex; select hex(column_add(column_create("a", "AAA"), "1", "BBB")) as ex; ---enable_view_protocol +--enable_service_connection select hex(column_add(column_create("a", 1212 as integer), "b", "1212" as integer)) as ex; select hex(column_add(column_create("a", 1212 as integer), "a", "1212" as integer)) as ex; select hex(column_add(column_create("a", 1212 as integer), "a", NULL as integer)) as ex; @@ -1003,3 +1000,29 @@ --echo # --echo # End of 10.4 tests --echo # + +--echo # +--echo # MDEV-33788 HEX(COLUMN_CREATE(.. AS CHAR ...)) fails with --view-protocol +--echo # + +SELECT hex(column_create(1,'a' AS CHAR CHARACTER SET utf8mb3 COLLATE utf8mb3_bin)) AS ex; +SELECT hex(column_add(column_create( + 1, 'a' AS CHAR CHARACTER SET utf8mb3 COLLATE utf8mb3_bin), + 2, 'b' AS CHAR CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci)) AS ex; + +--echo # +--echo # MDEV-31566 Fix buffer overrun of column_json function +--echo # + + +create table t1 ( + c1 varchar(32) primary key, + d1 blob +); +insert into t1 values ('var', 0x0402000A0000000300030023076A736E7375626A6563742E0005006C0027000200290002002B0002002D0002002F0002000C31000C3B000C4B000C51000F62006631663266336634663509E5A79AE8BF9CE6B48B0FE8819AE9809AE98791E6A1A5E5BA970537343530301031313634332F393634352F31313630300C080000000000EFBFBDEFBFBD192E), ('zzz', 0x0402000900000003000300740C6A736E766F6C756D652E000900EFBFBD004300020045000200470003004A0004004E00050053000500580005005D000500620005000C67000C6A000C6D000C7000052C00051B00052C000CEFBFBD0007EFBFBD006638663966313070696332626F785F63626F785F67626F785F6B626F785F7666355F696402343402343402333241687474703A2F2F6F73732E68646238382E636F6D2F302F70686F746F2F30373865653765376336343634616236386130343833373333323636613532612E67696608302E303532323732244F1E00030180C106); + +select c1,column_json(d1) as not_crashing from t1 order by c1; + +drop table t1; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/empty_server_name-8224.test mariadb-10.11.9/mysql-test/main/empty_server_name-8224.test --- mariadb-10.11.6/mysql-test/main/empty_server_name-8224.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/empty_server_name-8224.test 2024-08-03 07:29:57.000000000 +0000 @@ -3,10 +3,10 @@ # --source include/not_embedded.inc create server '' foreign data wrapper w2 options (host '127.0.0.1'); ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect -- enable_reconnect -- source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/main/empty_string_literal.result mariadb-10.11.9/mysql-test/main/empty_string_literal.result --- mariadb-10.11.6/mysql-test/main/empty_string_literal.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/empty_string_literal.result 2024-08-03 07:29:57.000000000 +0000 @@ -64,7 +64,7 @@ # Test litteral concat # SELECT 'a' 'b'; -a +ab ab SELECT 'a' ''; a @@ -76,13 +76,13 @@ NULL NULL SELECT '' 'b' 'c'; -b +bc bc SELECT '' '' 'c'; c c SELECT 'a' '' 'c'; -a +ac ac SELECT 'a' '' ''; a @@ -208,3 +208,23 @@ KEY `a` (`a`,`b`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; +set sql_mode= default; +# +# MDEV-33460 select '123' 'x'; unexpected result +# +SELECT ''; + + +SELECT '' 'b' 'c'; +bc +bc +SELECT '' '' 'c'; +c +c +SELECT 'a' '' 'c'; +ac +ac +SELECT 'a' '' ''; +a +a +# End of 10.5 test diff -Nru mariadb-10.11.6/mysql-test/main/empty_string_literal.test mariadb-10.11.9/mysql-test/main/empty_string_literal.test --- mariadb-10.11.6/mysql-test/main/empty_string_literal.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/empty_string_literal.test 2024-08-03 07:29:57.000000000 +0000 @@ -25,3 +25,18 @@ update t1 set a = 2; show create table t1; drop table t1; +set sql_mode= default; + +--echo # +--echo # MDEV-33460 select '123' 'x'; unexpected result +--echo # + +--disable_view_protocol +SELECT ''; +--enable_view_protocol +SELECT '' 'b' 'c'; +SELECT '' '' 'c'; +SELECT 'a' '' 'c'; +SELECT 'a' '' ''; + +--echo # End of 10.5 test diff -Nru mariadb-10.11.6/mysql-test/main/enforce_storage_engine.result mariadb-10.11.9/mysql-test/main/enforce_storage_engine.result --- mariadb-10.11.6/mysql-test/main/enforce_storage_engine.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/enforce_storage_engine.result 2024-08-03 07:29:57.000000000 +0000 @@ -158,5 +158,12 @@ PRIMARY KEY (`c1`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t3; +# +# MDEV-21618 CREATE UNIQUE INDEX fails with "ERROR 1286 (42000): Unknown storage engine 'partition'" +# +SET SESSION enforce_storage_engine=MyISAM; +CREATE TABLE t4 (a INT) ENGINE=MyISAM PARTITION BY HASH(a); +CREATE INDEX x on t4 (a); +DROP TABLE t4; SET SESSION enforce_storage_engine=NULL; SET GLOBAL enforce_storage_engine=NULL; diff -Nru mariadb-10.11.6/mysql-test/main/enforce_storage_engine.test mariadb-10.11.9/mysql-test/main/enforce_storage_engine.test --- mariadb-10.11.6/mysql-test/main/enforce_storage_engine.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/enforce_storage_engine.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,5 @@ --- source include/not_embedded.inc +--source include/not_embedded.inc +--source include/have_partition.inc set local sql_mode=""; set global sql_mode=""; @@ -107,5 +108,15 @@ SHOW CREATE TABLE t3; DROP TABLE t3; +--echo # +--echo # MDEV-21618 CREATE UNIQUE INDEX fails with "ERROR 1286 (42000): Unknown storage engine 'partition'" +--echo # +SET SESSION enforce_storage_engine=MyISAM; + +CREATE TABLE t4 (a INT) ENGINE=MyISAM PARTITION BY HASH(a); +CREATE INDEX x on t4 (a); + +DROP TABLE t4; + SET SESSION enforce_storage_engine=NULL; -SET GLOBAL enforce_storage_engine=NULL; \ No newline at end of file +SET GLOBAL enforce_storage_engine=NULL; diff -Nru mariadb-10.11.6/mysql-test/main/execution_constants.test mariadb-10.11.9/mysql-test/main/execution_constants.test --- mariadb-10.11.6/mysql-test/main/execution_constants.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/execution_constants.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,6 @@ # In embedded server we don't really have a control over stack usage -- source include/not_embedded.inc +-- source include/not_asan.inc # # Bug#21476: Lost Database Connection During Query diff -Nru mariadb-10.11.6/mysql-test/main/explain.result mariadb-10.11.9/mysql-test/main/explain.result --- mariadb-10.11.6/mysql-test/main/explain.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/explain.result 2024-08-03 07:29:57.000000000 +0000 @@ -458,3 +458,43 @@ NULL UNION RESULT ALL NULL NULL NULL NULL NULL Warnings: Note 1249 Select 4 was reduced during optimization +# +# End of 10.4 tests +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (3),(4); +EXPLAIN SELECT * FROM t1, t2 WHERE t2.b IN (SELECT 5 UNION SELECT 6); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join) +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +EXPLAIN DELETE t2 FROM t1, t2 WHERE t2.b IN (SELECT 5 UNION SELECT 6); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +prepare stmt from "EXPLAIN DELETE t2 FROM t1, t2 WHERE t2.b IN (SELECT 5 UNION SELECT 6)"; +execute stmt; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +execute stmt; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 Using where +2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used +3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +DROP TABLE t1, t2; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/explain.test mariadb-10.11.9/mysql-test/main/explain.test --- mariadb-10.11.6/mysql-test/main/explain.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/explain.test 2024-08-03 07:29:57.000000000 +0000 @@ -372,3 +372,26 @@ explain VALUES ( (VALUES (2))) UNION VALUES ( (SELECT 3)); --enable_ps_protocol + +--echo # +--echo # End of 10.4 tests +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +CREATE TABLE t2 (b INT); +INSERT INTO t2 VALUES (3),(4); + +EXPLAIN SELECT * FROM t1, t2 WHERE t2.b IN (SELECT 5 UNION SELECT 6); +EXPLAIN DELETE t2 FROM t1, t2 WHERE t2.b IN (SELECT 5 UNION SELECT 6); +prepare stmt from "EXPLAIN DELETE t2 FROM t1, t2 WHERE t2.b IN (SELECT 5 UNION SELECT 6)"; +execute stmt; +execute stmt; + +# Cleanup + +DROP TABLE t1, t2; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/explain_json.result mariadb-10.11.9/mysql-test/main/explain_json.result --- mariadb-10.11.6/mysql-test/main/explain_json.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/explain_json.result 2024-08-03 07:29:57.000000000 +0000 @@ -686,19 +686,21 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t1", - "access_type": "ALL", - "rows": 10, - "filtered": 100 + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 10, + "filtered": 100 + } } - } - ] + ] + } } } } @@ -1084,18 +1086,20 @@ ], "subqueries": [ { - "query_block": { - "select_id": 2, - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 2, - "filtered": 100 + "materialization": { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } } - } - ] + ] + } } } ] diff -Nru mariadb-10.11.6/mysql-test/main/fulltext_left_join.result mariadb-10.11.9/mysql-test/main/fulltext_left_join.result --- mariadb-10.11.6/mysql-test/main/fulltext_left_join.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/fulltext_left_join.result 2024-08-03 07:29:57.000000000 +0000 @@ -16,16 +16,16 @@ INSERT INTO t2 VALUES('123', 'moi'); INSERT INTO t2 VALUES('123', 'lui'); INSERT INTO t2 VALUES('456', 'lui'); -select round(match(t1.texte,t1.sujet,t1.motsclefs) against('droit'),5) +select round(match(t1.texte,t1.sujet,t1.motsclefs) against('droit'),5) as exp from t1 left join t2 on t2.id=t1.id; -round(match(t1.texte,t1.sujet,t1.motsclefs) against('droit'),5) +exp 0.00000 0.00000 0.67003 0.00000 -select match(t1.texte,t1.sujet,t1.motsclefs) against('droit' IN BOOLEAN MODE) +select match(t1.texte,t1.sujet,t1.motsclefs) against('droit' IN BOOLEAN MODE) as exp from t1 left join t2 on t2.id=t1.id; -match(t1.texte,t1.sujet,t1.motsclefs) against('droit' IN BOOLEAN MODE) +exp 0 0 1 diff -Nru mariadb-10.11.6/mysql-test/main/fulltext_left_join.test mariadb-10.11.9/mysql-test/main/fulltext_left_join.test --- mariadb-10.11.6/mysql-test/main/fulltext_left_join.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/fulltext_left_join.test 2024-08-03 07:29:57.000000000 +0000 @@ -24,13 +24,10 @@ INSERT INTO t2 VALUES('123', 'lui'); INSERT INTO t2 VALUES('456', 'lui'); -select round(match(t1.texte,t1.sujet,t1.motsclefs) against('droit'),5) +select round(match(t1.texte,t1.sujet,t1.motsclefs) against('droit'),5) as exp from t1 left join t2 on t2.id=t1.id; -#enable after fix MDEV-27871 ---disable_view_protocol -select match(t1.texte,t1.sujet,t1.motsclefs) against('droit' IN BOOLEAN MODE) +select match(t1.texte,t1.sujet,t1.motsclefs) against('droit' IN BOOLEAN MODE) as exp from t1 left join t2 on t2.id=t1.id; ---enable_view_protocol drop table t1, t2; diff -Nru mariadb-10.11.6/mysql-test/main/fulltext_order_by.result mariadb-10.11.9/mysql-test/main/fulltext_order_by.result --- mariadb-10.11.6/mysql-test/main/fulltext_order_by.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/fulltext_order_by.result 2024-08-03 07:29:57.000000000 +0000 @@ -126,7 +126,7 @@ a.text, b.id, b.betreff order by match(b.betreff) against ('+abc' in boolean mode) desc; -ERROR 42000: Table 'b' from one of the SELECTs cannot be used in ORDER clause +ERROR 42000: Table 'b' from one of the SELECTs cannot be used in order clause select a.text, b.id, b.betreff from t2 a inner join t3 b on a.id = b.forum inner join @@ -142,7 +142,7 @@ match(c.beitrag) against ('+abc' in boolean mode) order by match(b.betreff) against ('+abc' in boolean mode) desc; -ERROR 42000: Table 'b' from one of the SELECTs cannot be used in ORDER clause +ERROR 42000: Table 'b' from one of the SELECTs cannot be used in order clause select a.text, b.id, b.betreff from t2 a inner join t3 b on a.id = b.forum inner join diff -Nru mariadb-10.11.6/mysql-test/main/func_analyse.result mariadb-10.11.9/mysql-test/main/func_analyse.result --- mariadb-10.11.6/mysql-test/main/func_analyse.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_analyse.result 2024-08-03 07:29:57.000000000 +0000 @@ -222,3 +222,28 @@ # # End of 10.4 tests # +# +# Start of 10.5 tests +# +# +# MDEV-28345 ASAN: use-after-poison or unknown-crash in my_strtod_int from charset_info_st::strntod or test_if_number +# +SET sql_mode=''; +CREATE TABLE t1 (c CHAR(10) KEY); +INSERT INTO t1 VALUES (1.755555555); +Warnings: +Warning 1265 Data truncated for column 'c' at row 1 +SELECT * FROM t1 PROCEDURE ANALYSE(); +Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype +test.t1.c 1.75555555 1.75555555 10 10 0 0 10.0000 NULL ENUM('1.75555555') NOT NULL +DROP TABLE t1; +SET sql_mode=DEFAULT; +CREATE TABLE t1 (c BLOB) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1.3),(1.1); +SELECT * FROM t1 PROCEDURE ANALYSE(); +Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype +test.t1.c 1.1 1.3 3 3 0 0 3.0000 NULL ENUM('1.1','1.3') NOT NULL +DROP TABLE t1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_analyse.test mariadb-10.11.9/mysql-test/main/func_analyse.test --- mariadb-10.11.6/mysql-test/main/func_analyse.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_analyse.test 2024-08-03 07:29:57.000000000 +0000 @@ -230,3 +230,28 @@ --echo # --echo # End of 10.4 tests --echo # + + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-28345 ASAN: use-after-poison or unknown-crash in my_strtod_int from charset_info_st::strntod or test_if_number +--echo # + +SET sql_mode=''; +CREATE TABLE t1 (c CHAR(10) KEY); +INSERT INTO t1 VALUES (1.755555555); +SELECT * FROM t1 PROCEDURE ANALYSE(); +DROP TABLE t1; +SET sql_mode=DEFAULT; + +CREATE TABLE t1 (c BLOB) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1.3),(1.1); +SELECT * FROM t1 PROCEDURE ANALYSE(); +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_compress.test mariadb-10.11.9/mysql-test/main/func_compress.test --- mariadb-10.11.6/mysql-test/main/func_compress.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_compress.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,5 @@ -- source include/have_compress.inc --- source include/have_normal_bzip.inc +-- source include/have_normal_zlib.inc # # Test for compress and uncompress functions: # diff -Nru mariadb-10.11.6/mysql-test/main/func_date_add.result mariadb-10.11.9/mysql-test/main/func_date_add.result --- mariadb-10.11.6/mysql-test/main/func_date_add.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_date_add.result 2024-08-03 07:29:57.000000000 +0000 @@ -200,3 +200,34 @@ 20010133 20010133 drop view v1; End of 10.2 tests +# +# Start of 10.5 tests +# +# +# MDEV-30931 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in get_interval_value on SELECT +# +SELECT DATE_ADD('01-01-23',INTERVAL '9223372036854775808-02' WEEK); +DATE_ADD('01-01-23',INTERVAL '9223372036854775808-02' WEEK) +NULL +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '9223372036854775808-02' +Warning 1441 Datetime function: datetime field overflow +SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775807 WEEK); +DATE_ADD('01-01-23',INTERVAL -9223372036854775807 WEEK) +NULL +Warnings: +Warning 1441 Datetime function: datetime field overflow +SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775808 WEEK); +DATE_ADD('01-01-23',INTERVAL -9223372036854775808 WEEK) +NULL +Warnings: +Warning 1441 Datetime function: datetime field overflow +SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775809 WEEK); +DATE_ADD('01-01-23',INTERVAL -9223372036854775809 WEEK) +NULL +Warnings: +Warning 1916 Got overflow when converting '-9223372036854775809' to INT. Value truncated +Warning 1441 Datetime function: datetime field overflow +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_date_add.test mariadb-10.11.9/mysql-test/main/func_date_add.test --- mariadb-10.11.6/mysql-test/main/func_date_add.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_date_add.test 2024-08-03 07:29:57.000000000 +0000 @@ -169,3 +169,20 @@ drop view v1; --echo End of 10.2 tests + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-30931 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in get_interval_value on SELECT +--echo # + +SELECT DATE_ADD('01-01-23',INTERVAL '9223372036854775808-02' WEEK); +SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775807 WEEK); +SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775808 WEEK); +SELECT DATE_ADD('01-01-23',INTERVAL -9223372036854775809 WEEK); + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_encrypt_nossl.result mariadb-10.11.9/mysql-test/main/func_encrypt_nossl.result --- mariadb-10.11.6/mysql-test/main/func_encrypt_nossl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_encrypt_nossl.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,56 +3,56 @@ NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_encrypt("test", 1); des_encrypt("test", 1) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_encrypt("test", 9); des_encrypt("test", 9) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_encrypt("test", 100); des_encrypt("test", 100) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_encrypt("test", NULL); des_encrypt("test", NULL) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_encrypt(NULL, NULL); des_encrypt(NULL, NULL) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_decrypt("test", 'anotherkeystr'); des_decrypt("test", 'anotherkeystr') NULL Warnings: Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_decrypt(1, 1); des_decrypt(1, 1) NULL Warnings: Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_decrypt(des_encrypt("test", 'thekey')); des_decrypt(des_encrypt("test", 'thekey')) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select hex(des_encrypt("hello")),des_decrypt(des_encrypt("hello")); hex(des_encrypt("hello")) des_decrypt(des_encrypt("hello")) NULL NULL @@ -60,22 +60,22 @@ Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_decrypt(des_encrypt("hello",4)); des_decrypt(des_encrypt("hello",4)) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_decrypt(des_encrypt("hello",'test'),'test'); des_decrypt(des_encrypt("hello",'test'),'test') NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select hex(des_encrypt("hello")),hex(des_encrypt("hello",5)),hex(des_encrypt("hello",'default_password')); hex(des_encrypt("hello")) hex(des_encrypt("hello",5)) hex(des_encrypt("hello",'default_password')) NULL NULL NULL @@ -83,28 +83,28 @@ Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_encrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working -Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working +Warning 1289 The 'des_encrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_decrypt(des_encrypt("hello"),'default_password'); des_decrypt(des_encrypt("hello"),'default_password') NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select des_decrypt(des_encrypt("hello",4),'password4'); des_decrypt(des_encrypt("hello",4),'password4') NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working SET @a=des_decrypt(des_encrypt("hello")); Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working flush des_key_file; select @a = des_decrypt(des_encrypt("hello")); @a = des_decrypt(des_encrypt("hello")) @@ -121,11 +121,11 @@ Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working select hex(des_decrypt(des_encrypt("hello","hidden"))); hex(des_decrypt(des_encrypt("hello","hidden"))) NULL Warnings: Note 1287 'des_encrypt' is deprecated and will be removed in a future release Note 1287 'des_decrypt' is deprecated and will be removed in a future release -Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with '--with-ssl' to have it working +Warning 1289 The 'des_decrypt' feature is disabled; you need MariaDB built with 'openssl des cipher (HAVE_des)' to have it working diff -Nru mariadb-10.11.6/mysql-test/main/func_extract.result mariadb-10.11.9/mysql-test/main/func_extract.result --- mariadb-10.11.6/mysql-test/main/func_extract.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_extract.result 2024-08-03 07:29:57.000000000 +0000 @@ -590,3 +590,885 @@ Warning 1292 Truncated incorrect time value: '01:02:03/' Warning 1292 Truncated incorrect INTERVAL DAY TO SECOND value: '01:02:03/' DROP TABLE t1; +# +# Start of 10.5 tests +# +# +# MDEV-33496 Out of range error in AVG(YEAR(datetime)) due to a wrong data type +# +CREATE FUNCTION select01() RETURNS TEXT RETURN 'SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?'; +CREATE FUNCTION select02() RETURNS TEXT RETURN 'SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)'; +CREATE TABLE t1 (a DATETIME(6)); +INSERT INTO t1 VALUES ('2001-12-31 10:20:30.999999'); +CREATE FUNCTION params(expr TEXT, count INT) RETURNS TEXT +BEGIN +RETURN CONCAT(expr, REPEAT(CONCAT(', ', expr), count-1)); +END; +$$ +CREATE PROCEDURE show_drop() +BEGIN +SELECT TABLE_NAME, COLUMN_TYPE, COLUMN_NAME +FROM INFORMATION_SCHEMA.COLUMNS +WHERE TABLE_SCHEMA='test' + AND TABLE_NAME IN ('t1e_nm','t2e_nm','t1f_nm','t2f_nm', +'t1e_ps','t1f_ps','t2e_ps','t2f_ps') +ORDER BY LEFT(TABLE_NAME, 2), ORDINAL_POSITION, TABLE_NAME; +FOR rec IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES +WHERE TABLE_SCHEMA='test' + AND TABLE_NAME IN ('t1e_nm','t2e_nm','t1f_nm','t2f_nm', +'t1e_ps','t1f_ps','t2e_ps','t2f_ps')) +DO +EXECUTE IMMEDIATE CONCAT('DROP TABLE ', rec.TABLE_NAME); +END FOR; +END; +$$ +CREATE PROCEDURE p1(unit VARCHAR(32)) +BEGIN +DECLARE do_extract BOOL DEFAULT unit NOT IN('DAYOFYEAR'); +DECLARE query01 TEXT DEFAULT +CONCAT('CREATE TABLE t2 AS ', select01(), ' FROM t1'); +DECLARE query02 TEXT DEFAULT +CONCAT('CREATE TABLE t2 AS ', select02(), ' FROM t1'); +IF (do_extract) +THEN +EXECUTE IMMEDIATE REPLACE(REPLACE(query01,'t2','t1e_nm'),'?', CONCAT('EXTRACT(',unit,' FROM a)')); +EXECUTE IMMEDIATE REPLACE(REPLACE(query02,'t2','t2e_nm'),'?', CONCAT('EXTRACT(',unit,' FROM a)')); +END IF; +EXECUTE IMMEDIATE REPLACE(REPLACE(query01,'t2','t1f_nm'),'?', CONCAT(unit,'(a)')); +EXECUTE IMMEDIATE REPLACE(REPLACE(query02,'t2','t2f_nm'),'?', CONCAT(unit,'(a)')); +END; +$$ + + +# EXTRACT(YEAR FROM expr) and YEAR(expr) are equivalent +CALL p1('YEAR'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(YEAR FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), YEAR(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(5) EXTRACT(YEAR FROM a) +t1e_ps int(5) ? +t1f_nm int(5) YEAR(a) +t1f_ps int(5) ? +t1e_nm int(4) unsigned CAST(EXTRACT(YEAR FROM a) AS UNSIGNED) +t1e_ps int(4) unsigned CAST(? AS UNSIGNED) +t1f_nm int(4) unsigned CAST(YEAR(a) AS UNSIGNED) +t1f_ps int(4) unsigned CAST(? AS UNSIGNED) +t1e_nm int(5) CAST(EXTRACT(YEAR FROM a) AS SIGNED) +t1e_ps int(5) CAST(? AS SIGNED) +t1f_nm int(5) CAST(YEAR(a) AS SIGNED) +t1f_ps int(5) CAST(? AS SIGNED) +t1e_nm int(5) ABS(EXTRACT(YEAR FROM a)) +t1e_ps int(5) ABS(?) +t1f_nm int(5) ABS(YEAR(a)) +t1f_ps int(5) ABS(?) +t1e_nm int(5) ROUND(EXTRACT(YEAR FROM a)) +t1e_ps int(5) ROUND(?) +t1f_nm int(5) ROUND(YEAR(a)) +t1f_ps int(5) ROUND(?) +t1e_nm int(5) -EXTRACT(YEAR FROM a) +t1e_ps int(5) -? +t1f_nm int(5) -YEAR(a) +t1f_ps int(5) -? +t1e_nm int(6) ROUND(EXTRACT(YEAR FROM a),-1) +t1e_ps int(6) ROUND(?,-1) +t1f_nm int(6) ROUND(YEAR(a),-1) +t1f_ps int(6) ROUND(?,-1) +t1e_nm int(6) EXTRACT(YEAR FROM a)+0 +t1e_ps int(6) ?+0 +t1f_nm int(6) YEAR(a)+0 +t1f_ps int(6) ?+0 +t1e_nm decimal(6,1) EXTRACT(YEAR FROM a)+0.0 +t1e_ps decimal(6,1) ?+0.0 +t1f_nm decimal(6,1) YEAR(a)+0.0 +t1f_ps decimal(6,1) ?+0.0 +t1e_nm varchar(4) CONCAT(EXTRACT(YEAR FROM a)) +t1e_ps varchar(4) CONCAT(?) +t1f_nm varchar(4) CONCAT(YEAR(a)) +t1f_ps varchar(4) CONCAT(?) +t1e_nm int(5) LEAST(EXTRACT(YEAR FROM a),EXTRACT(YEAR FROM a)) +t1e_ps int(5) LEAST(?,?) +t1f_nm int(5) LEAST(YEAR(a),YEAR(a)) +t1f_ps int(5) LEAST(?,?) +t1e_nm int(5) COALESCE(EXTRACT(YEAR FROM a)) +t1e_ps int(5) COALESCE(?) +t1f_nm int(5) COALESCE(YEAR(a)) +t1f_ps int(5) COALESCE(?) +t1e_nm int(5) COALESCE(EXTRACT(YEAR FROM a),CAST(1 AS SIGNED)) +t1e_ps int(5) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(5) COALESCE(YEAR(a),CAST(1 AS SIGNED)) +t1f_ps int(5) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(4,0) COALESCE(EXTRACT(YEAR FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(4,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(4,0) COALESCE(YEAR(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(4,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(5) @a:=EXTRACT(YEAR FROM a) +t1e_ps int(5) @a:=? +t1f_nm int(5) @a:=YEAR(a) +t1f_ps int(5) @a:=? +t2e_nm decimal(8,4) AVG(EXTRACT(YEAR FROM a)) +t2e_ps decimal(8,4) AVG(?) +t2f_nm decimal(8,4) AVG(YEAR(a)) +t2f_ps decimal(8,4) AVG(?) +t2e_nm bigint(5) MIN(EXTRACT(YEAR FROM a)) +t2e_ps bigint(5) MIN(?) +t2f_nm bigint(5) MIN(YEAR(a)) +t2f_ps bigint(5) MIN(?) +t2e_nm bigint(5) MAX(EXTRACT(YEAR FROM a)) +t2e_ps bigint(5) MAX(?) +t2f_nm bigint(5) MAX(YEAR(a)) +t2f_ps bigint(5) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(YEAR FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(YEAR(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(QUARTER FROM expr) and QUARTER(expr) are equavalent +CALL p1('QUARTER'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(QUARTER FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'), QUARTER(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(2) EXTRACT(QUARTER FROM a) +t1e_ps int(2) ? +t1f_nm int(2) QUARTER(a) +t1f_ps int(2) ? +t1e_nm int(1) unsigned CAST(EXTRACT(QUARTER FROM a) AS UNSIGNED) +t1e_ps int(1) unsigned CAST(? AS UNSIGNED) +t1f_nm int(1) unsigned CAST(QUARTER(a) AS UNSIGNED) +t1f_ps int(1) unsigned CAST(? AS UNSIGNED) +t1e_nm int(2) CAST(EXTRACT(QUARTER FROM a) AS SIGNED) +t1e_ps int(2) CAST(? AS SIGNED) +t1f_nm int(2) CAST(QUARTER(a) AS SIGNED) +t1f_ps int(2) CAST(? AS SIGNED) +t1e_nm int(2) ABS(EXTRACT(QUARTER FROM a)) +t1e_ps int(2) ABS(?) +t1f_nm int(2) ABS(QUARTER(a)) +t1f_ps int(2) ABS(?) +t1e_nm int(2) ROUND(EXTRACT(QUARTER FROM a)) +t1e_ps int(2) ROUND(?) +t1f_nm int(2) ROUND(QUARTER(a)) +t1f_ps int(2) ROUND(?) +t1e_nm int(2) -EXTRACT(QUARTER FROM a) +t1e_ps int(2) -? +t1f_nm int(2) -QUARTER(a) +t1f_ps int(2) -? +t1e_nm int(3) ROUND(EXTRACT(QUARTER FROM a),-1) +t1e_ps int(3) ROUND(?,-1) +t1f_nm int(3) ROUND(QUARTER(a),-1) +t1f_ps int(3) ROUND(?,-1) +t1e_nm int(3) EXTRACT(QUARTER FROM a)+0 +t1e_ps int(3) ?+0 +t1f_nm int(3) QUARTER(a)+0 +t1f_ps int(3) ?+0 +t1e_nm decimal(3,1) EXTRACT(QUARTER FROM a)+0.0 +t1e_ps decimal(3,1) ?+0.0 +t1f_nm decimal(3,1) QUARTER(a)+0.0 +t1f_ps decimal(3,1) ?+0.0 +t1e_nm varchar(1) CONCAT(EXTRACT(QUARTER FROM a)) +t1e_ps varchar(1) CONCAT(?) +t1f_nm varchar(1) CONCAT(QUARTER(a)) +t1f_ps varchar(1) CONCAT(?) +t1e_nm int(2) LEAST(EXTRACT(QUARTER FROM a),EXTRACT(QUARTER FROM a)) +t1e_ps int(2) LEAST(?,?) +t1f_nm int(2) LEAST(QUARTER(a),QUARTER(a)) +t1f_ps int(2) LEAST(?,?) +t1e_nm int(2) COALESCE(EXTRACT(QUARTER FROM a)) +t1e_ps int(2) COALESCE(?) +t1f_nm int(2) COALESCE(QUARTER(a)) +t1f_ps int(2) COALESCE(?) +t1e_nm int(2) COALESCE(EXTRACT(QUARTER FROM a),CAST(1 AS SIGNED)) +t1e_ps int(2) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(2) COALESCE(QUARTER(a),CAST(1 AS SIGNED)) +t1f_ps int(2) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(1,0) COALESCE(EXTRACT(QUARTER FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(1,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(1,0) COALESCE(QUARTER(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(1,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(2) @a:=EXTRACT(QUARTER FROM a) +t1e_ps int(2) @a:=? +t1f_nm int(2) @a:=QUARTER(a) +t1f_ps int(2) @a:=? +t2e_nm decimal(5,4) AVG(EXTRACT(QUARTER FROM a)) +t2e_ps decimal(5,4) AVG(?) +t2f_nm decimal(5,4) AVG(QUARTER(a)) +t2f_ps decimal(5,4) AVG(?) +t2e_nm bigint(2) MIN(EXTRACT(QUARTER FROM a)) +t2e_ps bigint(2) MIN(?) +t2f_nm bigint(2) MIN(QUARTER(a)) +t2f_ps bigint(2) MIN(?) +t2e_nm bigint(2) MAX(EXTRACT(QUARTER FROM a)) +t2e_ps bigint(2) MAX(?) +t2f_nm bigint(2) MAX(QUARTER(a)) +t2f_ps bigint(2) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(QUARTER FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(QUARTER(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(MONTH FROM expr) and MONTH(expr) are equavalent +CALL p1('MONTH'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MONTH FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'), MONTH(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(3) EXTRACT(MONTH FROM a) +t1e_ps int(3) ? +t1f_nm int(3) MONTH(a) +t1f_ps int(3) ? +t1e_nm int(2) unsigned CAST(EXTRACT(MONTH FROM a) AS UNSIGNED) +t1e_ps int(2) unsigned CAST(? AS UNSIGNED) +t1f_nm int(2) unsigned CAST(MONTH(a) AS UNSIGNED) +t1f_ps int(2) unsigned CAST(? AS UNSIGNED) +t1e_nm int(3) CAST(EXTRACT(MONTH FROM a) AS SIGNED) +t1e_ps int(3) CAST(? AS SIGNED) +t1f_nm int(3) CAST(MONTH(a) AS SIGNED) +t1f_ps int(3) CAST(? AS SIGNED) +t1e_nm int(3) ABS(EXTRACT(MONTH FROM a)) +t1e_ps int(3) ABS(?) +t1f_nm int(3) ABS(MONTH(a)) +t1f_ps int(3) ABS(?) +t1e_nm int(3) ROUND(EXTRACT(MONTH FROM a)) +t1e_ps int(3) ROUND(?) +t1f_nm int(3) ROUND(MONTH(a)) +t1f_ps int(3) ROUND(?) +t1e_nm int(3) -EXTRACT(MONTH FROM a) +t1e_ps int(3) -? +t1f_nm int(3) -MONTH(a) +t1f_ps int(3) -? +t1e_nm int(4) ROUND(EXTRACT(MONTH FROM a),-1) +t1e_ps int(4) ROUND(?,-1) +t1f_nm int(4) ROUND(MONTH(a),-1) +t1f_ps int(4) ROUND(?,-1) +t1e_nm int(4) EXTRACT(MONTH FROM a)+0 +t1e_ps int(4) ?+0 +t1f_nm int(4) MONTH(a)+0 +t1f_ps int(4) ?+0 +t1e_nm decimal(4,1) EXTRACT(MONTH FROM a)+0.0 +t1e_ps decimal(4,1) ?+0.0 +t1f_nm decimal(4,1) MONTH(a)+0.0 +t1f_ps decimal(4,1) ?+0.0 +t1e_nm varchar(2) CONCAT(EXTRACT(MONTH FROM a)) +t1e_ps varchar(2) CONCAT(?) +t1f_nm varchar(2) CONCAT(MONTH(a)) +t1f_ps varchar(2) CONCAT(?) +t1e_nm int(3) LEAST(EXTRACT(MONTH FROM a),EXTRACT(MONTH FROM a)) +t1e_ps int(3) LEAST(?,?) +t1f_nm int(3) LEAST(MONTH(a),MONTH(a)) +t1f_ps int(3) LEAST(?,?) +t1e_nm int(3) COALESCE(EXTRACT(MONTH FROM a)) +t1e_ps int(3) COALESCE(?) +t1f_nm int(3) COALESCE(MONTH(a)) +t1f_ps int(3) COALESCE(?) +t1e_nm int(3) COALESCE(EXTRACT(MONTH FROM a),CAST(1 AS SIGNED)) +t1e_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(3) COALESCE(MONTH(a),CAST(1 AS SIGNED)) +t1f_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(2,0) COALESCE(EXTRACT(MONTH FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(2,0) COALESCE(MONTH(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(3) @a:=EXTRACT(MONTH FROM a) +t1e_ps int(3) @a:=? +t1f_nm int(3) @a:=MONTH(a) +t1f_ps int(3) @a:=? +t2e_nm decimal(6,4) AVG(EXTRACT(MONTH FROM a)) +t2e_ps decimal(6,4) AVG(?) +t2f_nm decimal(6,4) AVG(MONTH(a)) +t2f_ps decimal(6,4) AVG(?) +t2e_nm bigint(3) MIN(EXTRACT(MONTH FROM a)) +t2e_ps bigint(3) MIN(?) +t2f_nm bigint(3) MIN(MONTH(a)) +t2f_ps bigint(3) MIN(?) +t2e_nm bigint(3) MAX(EXTRACT(MONTH FROM a)) +t2e_ps bigint(3) MAX(?) +t2f_nm bigint(3) MAX(MONTH(a)) +t2f_ps bigint(3) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(MONTH FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(MONTH(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(WEEK FROM expr) and WEEK(expr) are equavalent +CALL p1('WEEK'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(WEEK FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'), WEEK(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(3) EXTRACT(WEEK FROM a) +t1e_ps int(3) ? +t1f_nm int(3) WEEK(a) +t1f_ps int(3) ? +t1e_nm int(2) unsigned CAST(EXTRACT(WEEK FROM a) AS UNSIGNED) +t1e_ps int(2) unsigned CAST(? AS UNSIGNED) +t1f_nm int(2) unsigned CAST(WEEK(a) AS UNSIGNED) +t1f_ps int(2) unsigned CAST(? AS UNSIGNED) +t1e_nm int(3) CAST(EXTRACT(WEEK FROM a) AS SIGNED) +t1e_ps int(3) CAST(? AS SIGNED) +t1f_nm int(3) CAST(WEEK(a) AS SIGNED) +t1f_ps int(3) CAST(? AS SIGNED) +t1e_nm int(3) ABS(EXTRACT(WEEK FROM a)) +t1e_ps int(3) ABS(?) +t1f_nm int(3) ABS(WEEK(a)) +t1f_ps int(3) ABS(?) +t1e_nm int(3) ROUND(EXTRACT(WEEK FROM a)) +t1e_ps int(3) ROUND(?) +t1f_nm int(3) ROUND(WEEK(a)) +t1f_ps int(3) ROUND(?) +t1e_nm int(3) -EXTRACT(WEEK FROM a) +t1e_ps int(3) -? +t1f_nm int(3) -WEEK(a) +t1f_ps int(3) -? +t1e_nm int(4) ROUND(EXTRACT(WEEK FROM a),-1) +t1e_ps int(4) ROUND(?,-1) +t1f_nm int(4) ROUND(WEEK(a),-1) +t1f_ps int(4) ROUND(?,-1) +t1e_nm int(4) EXTRACT(WEEK FROM a)+0 +t1e_ps int(4) ?+0 +t1f_nm int(4) WEEK(a)+0 +t1f_ps int(4) ?+0 +t1e_nm decimal(4,1) EXTRACT(WEEK FROM a)+0.0 +t1e_ps decimal(4,1) ?+0.0 +t1f_nm decimal(4,1) WEEK(a)+0.0 +t1f_ps decimal(4,1) ?+0.0 +t1e_nm varchar(2) CONCAT(EXTRACT(WEEK FROM a)) +t1e_ps varchar(2) CONCAT(?) +t1f_nm varchar(2) CONCAT(WEEK(a)) +t1f_ps varchar(2) CONCAT(?) +t1e_nm int(3) LEAST(EXTRACT(WEEK FROM a),EXTRACT(WEEK FROM a)) +t1e_ps int(3) LEAST(?,?) +t1f_nm int(3) LEAST(WEEK(a),WEEK(a)) +t1f_ps int(3) LEAST(?,?) +t1e_nm int(3) COALESCE(EXTRACT(WEEK FROM a)) +t1e_ps int(3) COALESCE(?) +t1f_nm int(3) COALESCE(WEEK(a)) +t1f_ps int(3) COALESCE(?) +t1e_nm int(3) COALESCE(EXTRACT(WEEK FROM a),CAST(1 AS SIGNED)) +t1e_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(3) COALESCE(WEEK(a),CAST(1 AS SIGNED)) +t1f_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(2,0) COALESCE(EXTRACT(WEEK FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(2,0) COALESCE(WEEK(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(3) @a:=EXTRACT(WEEK FROM a) +t1e_ps int(3) @a:=? +t1f_nm int(3) @a:=WEEK(a) +t1f_ps int(3) @a:=? +t2e_nm decimal(6,4) AVG(EXTRACT(WEEK FROM a)) +t2e_ps decimal(6,4) AVG(?) +t2f_nm decimal(6,4) AVG(WEEK(a)) +t2f_ps decimal(6,4) AVG(?) +t2e_nm bigint(3) MIN(EXTRACT(WEEK FROM a)) +t2e_ps bigint(3) MIN(?) +t2f_nm bigint(3) MIN(WEEK(a)) +t2f_ps bigint(3) MIN(?) +t2e_nm bigint(3) MAX(EXTRACT(WEEK FROM a)) +t2e_ps bigint(3) MAX(?) +t2f_nm bigint(3) MAX(WEEK(a)) +t2f_ps bigint(3) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(WEEK FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(WEEK(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(DAY FROM expr) returns hours/24 and includes the sign for TIME +# DAY(expr) returns the DD part of CAST(expr AS DATETIME) +CALL p1('DAY'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(DAY FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'), DAY(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(3) EXTRACT(DAY FROM a) +t1e_ps int(3) ? +t1f_nm int(3) DAY(a) +t1f_ps int(3) ? +t1e_nm bigint(20) unsigned CAST(EXTRACT(DAY FROM a) AS UNSIGNED) +t1e_ps bigint(20) unsigned CAST(? AS UNSIGNED) +t1f_nm int(2) unsigned CAST(DAY(a) AS UNSIGNED) +t1f_ps int(2) unsigned CAST(? AS UNSIGNED) +t1e_nm int(3) CAST(EXTRACT(DAY FROM a) AS SIGNED) +t1e_ps int(3) CAST(? AS SIGNED) +t1f_nm int(3) CAST(DAY(a) AS SIGNED) +t1f_ps int(3) CAST(? AS SIGNED) +t1e_nm int(3) ABS(EXTRACT(DAY FROM a)) +t1e_ps int(3) ABS(?) +t1f_nm int(3) ABS(DAY(a)) +t1f_ps int(3) ABS(?) +t1e_nm int(3) ROUND(EXTRACT(DAY FROM a)) +t1e_ps int(3) ROUND(?) +t1f_nm int(3) ROUND(DAY(a)) +t1f_ps int(3) ROUND(?) +t1e_nm int(4) -EXTRACT(DAY FROM a) +t1e_ps int(4) -? +t1f_nm int(3) -DAY(a) +t1f_ps int(3) -? +t1e_nm int(4) ROUND(EXTRACT(DAY FROM a),-1) +t1e_ps int(4) ROUND(?,-1) +t1f_nm int(4) ROUND(DAY(a),-1) +t1f_ps int(4) ROUND(?,-1) +t1e_nm int(4) EXTRACT(DAY FROM a)+0 +t1e_ps int(4) ?+0 +t1f_nm int(4) DAY(a)+0 +t1f_ps int(4) ?+0 +t1e_nm decimal(4,1) EXTRACT(DAY FROM a)+0.0 +t1e_ps decimal(4,1) ?+0.0 +t1f_nm decimal(4,1) DAY(a)+0.0 +t1f_ps decimal(4,1) ?+0.0 +t1e_nm varchar(3) CONCAT(EXTRACT(DAY FROM a)) +t1e_ps varchar(3) CONCAT(?) +t1f_nm varchar(2) CONCAT(DAY(a)) +t1f_ps varchar(2) CONCAT(?) +t1e_nm int(3) LEAST(EXTRACT(DAY FROM a),EXTRACT(DAY FROM a)) +t1e_ps int(3) LEAST(?,?) +t1f_nm int(3) LEAST(DAY(a),DAY(a)) +t1f_ps int(3) LEAST(?,?) +t1e_nm int(3) COALESCE(EXTRACT(DAY FROM a)) +t1e_ps int(3) COALESCE(?) +t1f_nm int(3) COALESCE(DAY(a)) +t1f_ps int(3) COALESCE(?) +t1e_nm int(3) COALESCE(EXTRACT(DAY FROM a),CAST(1 AS SIGNED)) +t1e_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(3) COALESCE(DAY(a),CAST(1 AS SIGNED)) +t1f_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(2,0) COALESCE(EXTRACT(DAY FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(2,0) COALESCE(DAY(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(3) @a:=EXTRACT(DAY FROM a) +t1e_ps int(3) @a:=? +t1f_nm int(3) @a:=DAY(a) +t1f_ps int(3) @a:=? +t2e_nm decimal(6,4) AVG(EXTRACT(DAY FROM a)) +t2e_ps decimal(6,4) AVG(?) +t2f_nm decimal(6,4) AVG(DAY(a)) +t2f_ps decimal(6,4) AVG(?) +t2e_nm bigint(3) MIN(EXTRACT(DAY FROM a)) +t2e_ps bigint(3) MIN(?) +t2f_nm bigint(3) MIN(DAY(a)) +t2f_ps bigint(3) MIN(?) +t2e_nm bigint(3) MAX(EXTRACT(DAY FROM a)) +t2e_ps bigint(3) MAX(?) +t2f_nm bigint(3) MAX(DAY(a)) +t2f_ps bigint(3) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(DAY FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(DAY(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(HOUR FROM expr) returns hours%24 and includes the sign for TIME +# HOUR(expr) returns the hh part of CAST(expr AS DATETIME) +CALL p1('HOUR'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(HOUR FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'), HOUR(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(3) EXTRACT(HOUR FROM a) +t1e_ps int(3) ? +t1f_nm int(3) HOUR(a) +t1f_ps int(3) ? +t1e_nm bigint(20) unsigned CAST(EXTRACT(HOUR FROM a) AS UNSIGNED) +t1e_ps bigint(20) unsigned CAST(? AS UNSIGNED) +t1f_nm int(2) unsigned CAST(HOUR(a) AS UNSIGNED) +t1f_ps int(2) unsigned CAST(? AS UNSIGNED) +t1e_nm int(3) CAST(EXTRACT(HOUR FROM a) AS SIGNED) +t1e_ps int(3) CAST(? AS SIGNED) +t1f_nm int(3) CAST(HOUR(a) AS SIGNED) +t1f_ps int(3) CAST(? AS SIGNED) +t1e_nm int(3) ABS(EXTRACT(HOUR FROM a)) +t1e_ps int(3) ABS(?) +t1f_nm int(3) ABS(HOUR(a)) +t1f_ps int(3) ABS(?) +t1e_nm int(3) ROUND(EXTRACT(HOUR FROM a)) +t1e_ps int(3) ROUND(?) +t1f_nm int(3) ROUND(HOUR(a)) +t1f_ps int(3) ROUND(?) +t1e_nm int(4) -EXTRACT(HOUR FROM a) +t1e_ps int(4) -? +t1f_nm int(3) -HOUR(a) +t1f_ps int(3) -? +t1e_nm int(4) ROUND(EXTRACT(HOUR FROM a),-1) +t1e_ps int(4) ROUND(?,-1) +t1f_nm int(4) ROUND(HOUR(a),-1) +t1f_ps int(4) ROUND(?,-1) +t1e_nm int(4) EXTRACT(HOUR FROM a)+0 +t1e_ps int(4) ?+0 +t1f_nm int(4) HOUR(a)+0 +t1f_ps int(4) ?+0 +t1e_nm decimal(4,1) EXTRACT(HOUR FROM a)+0.0 +t1e_ps decimal(4,1) ?+0.0 +t1f_nm decimal(4,1) HOUR(a)+0.0 +t1f_ps decimal(4,1) ?+0.0 +t1e_nm varchar(3) CONCAT(EXTRACT(HOUR FROM a)) +t1e_ps varchar(3) CONCAT(?) +t1f_nm varchar(2) CONCAT(HOUR(a)) +t1f_ps varchar(2) CONCAT(?) +t1e_nm int(3) LEAST(EXTRACT(HOUR FROM a),EXTRACT(HOUR FROM a)) +t1e_ps int(3) LEAST(?,?) +t1f_nm int(3) LEAST(HOUR(a),HOUR(a)) +t1f_ps int(3) LEAST(?,?) +t1e_nm int(3) COALESCE(EXTRACT(HOUR FROM a)) +t1e_ps int(3) COALESCE(?) +t1f_nm int(3) COALESCE(HOUR(a)) +t1f_ps int(3) COALESCE(?) +t1e_nm int(3) COALESCE(EXTRACT(HOUR FROM a),CAST(1 AS SIGNED)) +t1e_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(3) COALESCE(HOUR(a),CAST(1 AS SIGNED)) +t1f_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(2,0) COALESCE(EXTRACT(HOUR FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(2,0) COALESCE(HOUR(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(3) @a:=EXTRACT(HOUR FROM a) +t1e_ps int(3) @a:=? +t1f_nm int(3) @a:=HOUR(a) +t1f_ps int(3) @a:=? +t2e_nm decimal(6,4) AVG(EXTRACT(HOUR FROM a)) +t2e_ps decimal(6,4) AVG(?) +t2f_nm decimal(6,4) AVG(HOUR(a)) +t2f_ps decimal(6,4) AVG(?) +t2e_nm bigint(3) MIN(EXTRACT(HOUR FROM a)) +t2e_ps bigint(3) MIN(?) +t2f_nm bigint(3) MIN(HOUR(a)) +t2f_ps bigint(3) MIN(?) +t2e_nm bigint(3) MAX(EXTRACT(HOUR FROM a)) +t2e_ps bigint(3) MAX(?) +t2f_nm bigint(3) MAX(HOUR(a)) +t2f_ps bigint(3) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(HOUR FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(HOUR(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(MINUTE FROM expr) includes the sign for TIME +# MINUTE(expr) returns the absolute value +CALL p1('MINUTE'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MINUTE FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'), MINUTE(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(3) EXTRACT(MINUTE FROM a) +t1e_ps int(3) ? +t1f_nm int(3) MINUTE(a) +t1f_ps int(3) ? +t1e_nm bigint(20) unsigned CAST(EXTRACT(MINUTE FROM a) AS UNSIGNED) +t1e_ps bigint(20) unsigned CAST(? AS UNSIGNED) +t1f_nm int(2) unsigned CAST(MINUTE(a) AS UNSIGNED) +t1f_ps int(2) unsigned CAST(? AS UNSIGNED) +t1e_nm int(3) CAST(EXTRACT(MINUTE FROM a) AS SIGNED) +t1e_ps int(3) CAST(? AS SIGNED) +t1f_nm int(3) CAST(MINUTE(a) AS SIGNED) +t1f_ps int(3) CAST(? AS SIGNED) +t1e_nm int(3) ABS(EXTRACT(MINUTE FROM a)) +t1e_ps int(3) ABS(?) +t1f_nm int(3) ABS(MINUTE(a)) +t1f_ps int(3) ABS(?) +t1e_nm int(3) ROUND(EXTRACT(MINUTE FROM a)) +t1e_ps int(3) ROUND(?) +t1f_nm int(3) ROUND(MINUTE(a)) +t1f_ps int(3) ROUND(?) +t1e_nm int(4) -EXTRACT(MINUTE FROM a) +t1e_ps int(4) -? +t1f_nm int(3) -MINUTE(a) +t1f_ps int(3) -? +t1e_nm int(4) ROUND(EXTRACT(MINUTE FROM a),-1) +t1e_ps int(4) ROUND(?,-1) +t1f_nm int(4) ROUND(MINUTE(a),-1) +t1f_ps int(4) ROUND(?,-1) +t1e_nm int(4) EXTRACT(MINUTE FROM a)+0 +t1e_ps int(4) ?+0 +t1f_nm int(4) MINUTE(a)+0 +t1f_ps int(4) ?+0 +t1e_nm decimal(4,1) EXTRACT(MINUTE FROM a)+0.0 +t1e_ps decimal(4,1) ?+0.0 +t1f_nm decimal(4,1) MINUTE(a)+0.0 +t1f_ps decimal(4,1) ?+0.0 +t1e_nm varchar(3) CONCAT(EXTRACT(MINUTE FROM a)) +t1e_ps varchar(3) CONCAT(?) +t1f_nm varchar(2) CONCAT(MINUTE(a)) +t1f_ps varchar(2) CONCAT(?) +t1e_nm int(3) LEAST(EXTRACT(MINUTE FROM a),EXTRACT(MINUTE FROM a)) +t1e_ps int(3) LEAST(?,?) +t1f_nm int(3) LEAST(MINUTE(a),MINUTE(a)) +t1f_ps int(3) LEAST(?,?) +t1e_nm int(3) COALESCE(EXTRACT(MINUTE FROM a)) +t1e_ps int(3) COALESCE(?) +t1f_nm int(3) COALESCE(MINUTE(a)) +t1f_ps int(3) COALESCE(?) +t1e_nm int(3) COALESCE(EXTRACT(MINUTE FROM a),CAST(1 AS SIGNED)) +t1e_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(3) COALESCE(MINUTE(a),CAST(1 AS SIGNED)) +t1f_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(2,0) COALESCE(EXTRACT(MINUTE FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(2,0) COALESCE(MINUTE(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(3) @a:=EXTRACT(MINUTE FROM a) +t1e_ps int(3) @a:=? +t1f_nm int(3) @a:=MINUTE(a) +t1f_ps int(3) @a:=? +t2e_nm decimal(6,4) AVG(EXTRACT(MINUTE FROM a)) +t2e_ps decimal(6,4) AVG(?) +t2f_nm decimal(6,4) AVG(MINUTE(a)) +t2f_ps decimal(6,4) AVG(?) +t2e_nm bigint(3) MIN(EXTRACT(MINUTE FROM a)) +t2e_ps bigint(3) MIN(?) +t2f_nm bigint(3) MIN(MINUTE(a)) +t2f_ps bigint(3) MIN(?) +t2e_nm bigint(3) MAX(EXTRACT(MINUTE FROM a)) +t2e_ps bigint(3) MAX(?) +t2f_nm bigint(3) MAX(MINUTE(a)) +t2f_ps bigint(3) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(MINUTE FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(MINUTE(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(SECONDS FROM expr) includes the sign for TIME +# SECONDS(expr) returns the absolute value +CALL p1('SECOND'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(SECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), SECOND(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(3) EXTRACT(SECOND FROM a) +t1e_ps int(3) ? +t1f_nm int(3) SECOND(a) +t1f_ps int(3) ? +t1e_nm bigint(20) unsigned CAST(EXTRACT(SECOND FROM a) AS UNSIGNED) +t1e_ps bigint(20) unsigned CAST(? AS UNSIGNED) +t1f_nm int(2) unsigned CAST(SECOND(a) AS UNSIGNED) +t1f_ps int(2) unsigned CAST(? AS UNSIGNED) +t1e_nm int(3) CAST(EXTRACT(SECOND FROM a) AS SIGNED) +t1e_ps int(3) CAST(? AS SIGNED) +t1f_nm int(3) CAST(SECOND(a) AS SIGNED) +t1f_ps int(3) CAST(? AS SIGNED) +t1e_nm int(3) ABS(EXTRACT(SECOND FROM a)) +t1e_ps int(3) ABS(?) +t1f_nm int(3) ABS(SECOND(a)) +t1f_ps int(3) ABS(?) +t1e_nm int(3) ROUND(EXTRACT(SECOND FROM a)) +t1e_ps int(3) ROUND(?) +t1f_nm int(3) ROUND(SECOND(a)) +t1f_ps int(3) ROUND(?) +t1e_nm int(4) -EXTRACT(SECOND FROM a) +t1e_ps int(4) -? +t1f_nm int(3) -SECOND(a) +t1f_ps int(3) -? +t1e_nm int(4) ROUND(EXTRACT(SECOND FROM a),-1) +t1e_ps int(4) ROUND(?,-1) +t1f_nm int(4) ROUND(SECOND(a),-1) +t1f_ps int(4) ROUND(?,-1) +t1e_nm int(4) EXTRACT(SECOND FROM a)+0 +t1e_ps int(4) ?+0 +t1f_nm int(4) SECOND(a)+0 +t1f_ps int(4) ?+0 +t1e_nm decimal(4,1) EXTRACT(SECOND FROM a)+0.0 +t1e_ps decimal(4,1) ?+0.0 +t1f_nm decimal(4,1) SECOND(a)+0.0 +t1f_ps decimal(4,1) ?+0.0 +t1e_nm varchar(3) CONCAT(EXTRACT(SECOND FROM a)) +t1e_ps varchar(3) CONCAT(?) +t1f_nm varchar(2) CONCAT(SECOND(a)) +t1f_ps varchar(2) CONCAT(?) +t1e_nm int(3) LEAST(EXTRACT(SECOND FROM a),EXTRACT(SECOND FROM a)) +t1e_ps int(3) LEAST(?,?) +t1f_nm int(3) LEAST(SECOND(a),SECOND(a)) +t1f_ps int(3) LEAST(?,?) +t1e_nm int(3) COALESCE(EXTRACT(SECOND FROM a)) +t1e_ps int(3) COALESCE(?) +t1f_nm int(3) COALESCE(SECOND(a)) +t1f_ps int(3) COALESCE(?) +t1e_nm int(3) COALESCE(EXTRACT(SECOND FROM a),CAST(1 AS SIGNED)) +t1e_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(3) COALESCE(SECOND(a),CAST(1 AS SIGNED)) +t1f_ps int(3) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(2,0) COALESCE(EXTRACT(SECOND FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(2,0) COALESCE(SECOND(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(2,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(3) @a:=EXTRACT(SECOND FROM a) +t1e_ps int(3) @a:=? +t1f_nm int(3) @a:=SECOND(a) +t1f_ps int(3) @a:=? +t2e_nm decimal(6,4) AVG(EXTRACT(SECOND FROM a)) +t2e_ps decimal(6,4) AVG(?) +t2f_nm decimal(6,4) AVG(SECOND(a)) +t2f_ps decimal(6,4) AVG(?) +t2e_nm bigint(3) MIN(EXTRACT(SECOND FROM a)) +t2e_ps bigint(3) MIN(?) +t2f_nm bigint(3) MIN(SECOND(a)) +t2f_ps bigint(3) MIN(?) +t2e_nm bigint(3) MAX(EXTRACT(SECOND FROM a)) +t2e_ps bigint(3) MAX(?) +t2f_nm bigint(3) MAX(SECOND(a)) +t2f_ps bigint(3) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(SECOND FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(SECOND(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# EXTRACT(MICROSECONDS FROM expr) includes the sign for TIME +# MICROSECONDS(expr) returns the absolute value +CALL p1('MICROSECOND'); +EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'), EXTRACT(MICROSECOND FROM TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'), MICROSECOND(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1e_nm int(7) EXTRACT(MICROSECOND FROM a) +t1e_ps int(7) ? +t1f_nm int(7) MICROSECOND(a) +t1f_ps int(7) ? +t1e_nm bigint(20) unsigned CAST(EXTRACT(MICROSECOND FROM a) AS UNSIGNED) +t1e_ps bigint(20) unsigned CAST(? AS UNSIGNED) +t1f_nm int(6) unsigned CAST(MICROSECOND(a) AS UNSIGNED) +t1f_ps int(6) unsigned CAST(? AS UNSIGNED) +t1e_nm int(7) CAST(EXTRACT(MICROSECOND FROM a) AS SIGNED) +t1e_ps int(7) CAST(? AS SIGNED) +t1f_nm int(7) CAST(MICROSECOND(a) AS SIGNED) +t1f_ps int(7) CAST(? AS SIGNED) +t1e_nm int(7) ABS(EXTRACT(MICROSECOND FROM a)) +t1e_ps int(7) ABS(?) +t1f_nm int(7) ABS(MICROSECOND(a)) +t1f_ps int(7) ABS(?) +t1e_nm int(7) ROUND(EXTRACT(MICROSECOND FROM a)) +t1e_ps int(7) ROUND(?) +t1f_nm int(7) ROUND(MICROSECOND(a)) +t1f_ps int(7) ROUND(?) +t1e_nm int(8) -EXTRACT(MICROSECOND FROM a) +t1e_ps int(8) -? +t1f_nm int(7) -MICROSECOND(a) +t1f_ps int(7) -? +t1e_nm int(8) ROUND(EXTRACT(MICROSECOND FROM a),-1) +t1e_ps int(8) ROUND(?,-1) +t1f_nm int(8) ROUND(MICROSECOND(a),-1) +t1f_ps int(8) ROUND(?,-1) +t1e_nm int(8) EXTRACT(MICROSECOND FROM a)+0 +t1e_ps int(8) ?+0 +t1f_nm int(8) MICROSECOND(a)+0 +t1f_ps int(8) ?+0 +t1e_nm decimal(8,1) EXTRACT(MICROSECOND FROM a)+0.0 +t1e_ps decimal(8,1) ?+0.0 +t1f_nm decimal(8,1) MICROSECOND(a)+0.0 +t1f_ps decimal(8,1) ?+0.0 +t1e_nm varchar(7) CONCAT(EXTRACT(MICROSECOND FROM a)) +t1e_ps varchar(7) CONCAT(?) +t1f_nm varchar(6) CONCAT(MICROSECOND(a)) +t1f_ps varchar(6) CONCAT(?) +t1e_nm int(7) LEAST(EXTRACT(MICROSECOND FROM a),EXTRACT(MICROSECOND FROM a)) +t1e_ps int(7) LEAST(?,?) +t1f_nm int(7) LEAST(MICROSECOND(a),MICROSECOND(a)) +t1f_ps int(7) LEAST(?,?) +t1e_nm int(7) COALESCE(EXTRACT(MICROSECOND FROM a)) +t1e_ps int(7) COALESCE(?) +t1f_nm int(7) COALESCE(MICROSECOND(a)) +t1f_ps int(7) COALESCE(?) +t1e_nm int(7) COALESCE(EXTRACT(MICROSECOND FROM a),CAST(1 AS SIGNED)) +t1e_ps int(7) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm int(7) COALESCE(MICROSECOND(a),CAST(1 AS SIGNED)) +t1f_ps int(7) COALESCE(?,CAST(1 AS SIGNED)) +t1e_nm decimal(6,0) COALESCE(EXTRACT(MICROSECOND FROM a),CAST(1 AS UNSIGNED)) +t1e_ps decimal(6,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm decimal(6,0) COALESCE(MICROSECOND(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(6,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1e_nm int(7) @a:=EXTRACT(MICROSECOND FROM a) +t1e_ps int(7) @a:=? +t1f_nm int(7) @a:=MICROSECOND(a) +t1f_ps int(7) @a:=? +t2e_nm decimal(10,4) AVG(EXTRACT(MICROSECOND FROM a)) +t2e_ps decimal(10,4) AVG(?) +t2f_nm decimal(10,4) AVG(MICROSECOND(a)) +t2f_ps decimal(10,4) AVG(?) +t2e_nm bigint(7) MIN(EXTRACT(MICROSECOND FROM a)) +t2e_ps bigint(7) MIN(?) +t2f_nm bigint(7) MIN(MICROSECOND(a)) +t2f_ps bigint(7) MIN(?) +t2e_nm bigint(7) MAX(EXTRACT(MICROSECOND FROM a)) +t2e_ps bigint(7) MAX(?) +t2f_nm bigint(7) MAX(MICROSECOND(a)) +t2f_ps bigint(7) MAX(?) +t2e_nm mediumtext GROUP_CONCAT(EXTRACT(MICROSECOND FROM a)) +t2e_ps mediumtext GROUP_CONCAT(?) +t2f_nm mediumtext GROUP_CONCAT(MICROSECOND(a)) +t2f_ps mediumtext GROUP_CONCAT(?) + + +# DAYOFYEAR +CALL p1('DAYOFYEAR'); +EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?' USING DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'); +EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?)' USING DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'), DAYOFYEAR(TIMESTAMP'2001-12-13 10:20:30.999999'); +CALL show_drop; +TABLE_NAME COLUMN_TYPE COLUMN_NAME +t1f_nm int(4) DAYOFYEAR(a) +t1f_ps int(4) ? +t1f_nm int(3) unsigned CAST(DAYOFYEAR(a) AS UNSIGNED) +t1f_ps int(3) unsigned CAST(? AS UNSIGNED) +t1f_nm int(4) CAST(DAYOFYEAR(a) AS SIGNED) +t1f_ps int(4) CAST(? AS SIGNED) +t1f_nm int(4) ABS(DAYOFYEAR(a)) +t1f_ps int(4) ABS(?) +t1f_nm int(4) ROUND(DAYOFYEAR(a)) +t1f_ps int(4) ROUND(?) +t1f_nm int(4) -DAYOFYEAR(a) +t1f_ps int(4) -? +t1f_nm int(5) ROUND(DAYOFYEAR(a),-1) +t1f_ps int(5) ROUND(?,-1) +t1f_nm int(5) DAYOFYEAR(a)+0 +t1f_ps int(5) ?+0 +t1f_nm decimal(5,1) DAYOFYEAR(a)+0.0 +t1f_ps decimal(5,1) ?+0.0 +t1f_nm varchar(3) CONCAT(DAYOFYEAR(a)) +t1f_ps varchar(3) CONCAT(?) +t1f_nm int(4) LEAST(DAYOFYEAR(a),DAYOFYEAR(a)) +t1f_ps int(4) LEAST(?,?) +t1f_nm int(4) COALESCE(DAYOFYEAR(a)) +t1f_ps int(4) COALESCE(?) +t1f_nm int(4) COALESCE(DAYOFYEAR(a),CAST(1 AS SIGNED)) +t1f_ps int(4) COALESCE(?,CAST(1 AS SIGNED)) +t1f_nm decimal(3,0) COALESCE(DAYOFYEAR(a),CAST(1 AS UNSIGNED)) +t1f_ps decimal(3,0) COALESCE(?,CAST(1 AS UNSIGNED)) +t1f_nm int(4) @a:=DAYOFYEAR(a) +t1f_ps int(4) @a:=? +t2f_nm decimal(7,4) AVG(DAYOFYEAR(a)) +t2f_ps decimal(7,4) AVG(?) +t2f_nm bigint(4) MIN(DAYOFYEAR(a)) +t2f_ps bigint(4) MIN(?) +t2f_nm bigint(4) MAX(DAYOFYEAR(a)) +t2f_ps bigint(4) MAX(?) +t2f_nm mediumtext GROUP_CONCAT(DAYOFYEAR(a)) +t2f_ps mediumtext GROUP_CONCAT(?) +DROP TABLE t1; +DROP PROCEDURE p1; +DROP PROCEDURE show_drop; +DROP FUNCTION params; +DROP FUNCTION select01; +DROP FUNCTION select02; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_extract.test mariadb-10.11.9/mysql-test/main/func_extract.test --- mariadb-10.11.6/mysql-test/main/func_extract.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_extract.test 2024-08-03 07:29:57.000000000 +0000 @@ -263,3 +263,254 @@ FROM t1; DROP TABLE t1; --enable_view_protocol + + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-33496 Out of range error in AVG(YEAR(datetime)) due to a wrong data type +--echo # + +let select01=SELECT ?, CAST(? AS UNSIGNED), CAST(? AS SIGNED), ABS(?), ROUND(?), -?, ROUND(?,-1), ?+0, ?+0.0, CONCAT(?), LEAST(?,?), COALESCE(?), COALESCE(?,CAST(1 AS SIGNED)), COALESCE(?,CAST(1 AS UNSIGNED)), @a:=?; +let pcount01=16; +let select02=SELECT AVG(?), MIN(?), MAX(?), GROUP_CONCAT(?); +let pcount02=4; +let ts=TIMESTAMP'2001-12-13 10:20:30.999999'; + +eval CREATE FUNCTION select01() RETURNS TEXT RETURN '$select01'; +eval CREATE FUNCTION select02() RETURNS TEXT RETURN '$select02'; + +CREATE TABLE t1 (a DATETIME(6)); +INSERT INTO t1 VALUES ('2001-12-31 10:20:30.999999'); + +DELIMITER $$; +CREATE FUNCTION params(expr TEXT, count INT) RETURNS TEXT +BEGIN + RETURN CONCAT(expr, REPEAT(CONCAT(', ', expr), count-1)); +END; +$$ +CREATE PROCEDURE show_drop() +BEGIN + SELECT TABLE_NAME, COLUMN_TYPE, COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA='test' + AND TABLE_NAME IN ('t1e_nm','t2e_nm','t1f_nm','t2f_nm', + 't1e_ps','t1f_ps','t2e_ps','t2f_ps') + ORDER BY LEFT(TABLE_NAME, 2), ORDINAL_POSITION, TABLE_NAME; + + FOR rec IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_SCHEMA='test' + AND TABLE_NAME IN ('t1e_nm','t2e_nm','t1f_nm','t2f_nm', + 't1e_ps','t1f_ps','t2e_ps','t2f_ps')) + DO + EXECUTE IMMEDIATE CONCAT('DROP TABLE ', rec.TABLE_NAME); + END FOR; +END; +$$ +CREATE PROCEDURE p1(unit VARCHAR(32)) +BEGIN + DECLARE do_extract BOOL DEFAULT unit NOT IN('DAYOFYEAR'); + + DECLARE query01 TEXT DEFAULT + CONCAT('CREATE TABLE t2 AS ', select01(), ' FROM t1'); + + DECLARE query02 TEXT DEFAULT + CONCAT('CREATE TABLE t2 AS ', select02(), ' FROM t1'); + + IF (do_extract) + THEN + EXECUTE IMMEDIATE REPLACE(REPLACE(query01,'t2','t1e_nm'),'?', CONCAT('EXTRACT(',unit,' FROM a)')); + EXECUTE IMMEDIATE REPLACE(REPLACE(query02,'t2','t2e_nm'),'?', CONCAT('EXTRACT(',unit,' FROM a)')); + END IF; + EXECUTE IMMEDIATE REPLACE(REPLACE(query01,'t2','t1f_nm'),'?', CONCAT(unit,'(a)')); + EXECUTE IMMEDIATE REPLACE(REPLACE(query02,'t2','t2f_nm'),'?', CONCAT(unit,'(a)')); +END; +$$ +DELIMITER ;$$ + + +--echo +--echo +--echo # EXTRACT(YEAR FROM expr) and YEAR(expr) are equivalent + +CALL p1('YEAR'); +let extr=EXTRACT(YEAR FROM $ts); +let func=YEAR($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + + +--echo +--echo +--echo # EXTRACT(QUARTER FROM expr) and QUARTER(expr) are equavalent + +CALL p1('QUARTER'); +let extr=EXTRACT(QUARTER FROM $ts); +let func=QUARTER($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # EXTRACT(MONTH FROM expr) and MONTH(expr) are equavalent + +CALL p1('MONTH'); +let extr=EXTRACT(MONTH FROM $ts); +let func=MONTH($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # EXTRACT(WEEK FROM expr) and WEEK(expr) are equavalent + +CALL p1('WEEK'); +let extr=EXTRACT(WEEK FROM $ts); +let func=WEEK($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # EXTRACT(DAY FROM expr) returns hours/24 and includes the sign for TIME +--echo # DAY(expr) returns the DD part of CAST(expr AS DATETIME) + +CALL p1('DAY'); +let extr=EXTRACT(DAY FROM $ts); +let func=DAY($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # EXTRACT(HOUR FROM expr) returns hours%24 and includes the sign for TIME +--echo # HOUR(expr) returns the hh part of CAST(expr AS DATETIME) + +CALL p1('HOUR'); +let extr=EXTRACT(HOUR FROM $ts); +let func=HOUR($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # EXTRACT(MINUTE FROM expr) includes the sign for TIME +--echo # MINUTE(expr) returns the absolute value + +CALL p1('MINUTE'); +let extr=EXTRACT(MINUTE FROM $ts); +let func=MINUTE($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # EXTRACT(SECONDS FROM expr) includes the sign for TIME +--echo # SECONDS(expr) returns the absolute value + +CALL p1('SECOND'); +let extr=EXTRACT(SECOND FROM $ts); +let func=SECOND($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # EXTRACT(MICROSECONDS FROM expr) includes the sign for TIME +--echo # MICROSECONDS(expr) returns the absolute value + +CALL p1('MICROSECOND'); +let extr=EXTRACT(MICROSECOND FROM $ts); +let func=MICROSECOND($ts); +let extr01=`SELECT params("$extr", $pcount01) AS p`; +let func01=`SELECT params("$func", $pcount01) AS p`; +let extr02=`SELECT params("$extr", $pcount02) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1e_ps AS $select01' USING $extr01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2e_ps AS $select02' USING $extr02; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + +--echo +--echo +--echo # DAYOFYEAR + +CALL p1('DAYOFYEAR'); +let func=DAYOFYEAR($ts); +let func01=`SELECT params("$func", $pcount01) AS p`; +let func02=`SELECT params("$func", $pcount02) AS p`; +eval EXECUTE IMMEDIATE 'CREATE TABLE t1f_ps AS $select01' USING $func01; +eval EXECUTE IMMEDIATE 'CREATE TABLE t2f_ps AS $select02' USING $func02; +CALL show_drop; + + +DROP TABLE t1; +DROP PROCEDURE p1; +DROP PROCEDURE show_drop; +DROP FUNCTION params; + +DROP FUNCTION select01; +DROP FUNCTION select02; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_gconcat.result mariadb-10.11.9/mysql-test/main/func_gconcat.result --- mariadb-10.11.6/mysql-test/main/func_gconcat.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_gconcat.result 2024-08-03 07:29:57.000000000 +0000 @@ -1269,8 +1269,8 @@ a GROUP_CONCAT(a ORDER BY a) NULL 10,20,30 DROP VIEW v1; -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP HAVING GROUP_CONCAT(a ORDER BY a)='10,20,30'); -(SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP HAVING GROUP_CONCAT(a ORDER BY a)='10,20,30') +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP HAVING GROUP_CONCAT(a ORDER BY a)='10,20,30') as exp; +exp 10,20,30 CREATE VIEW v1 AS SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP HAVING GROUP_CONCAT(a ORDER BY a)='10,20,30'); @@ -1443,3 +1443,98 @@ # # End of 10.3 tests # +# +# MDEV-31276: Execution of PS from grouping query with join +# and GROUP_CONCAT set function +# +create table t1 (a int, b varchar(20)) engine=myisam; +create table t2 (a int, c varchar(20)) engine=myisam; +insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb"); +insert into t2 values (1,"cccccccccc"),(2,"dddddddddd"); +insert into t2 values (1,"eeeeeee"),(2,"fffffff"); +set group_concat_max_len=5; +select count(*), group_concat(t1.b,t2.c) +from t1 join t2 on t1.a=t2.a group by t1.a; +count(*) group_concat(t1.b,t2.c) +2 aaaaa +2 bbbbb +Warnings: +Warning 1260 Row 1 was cut by GROUP_CONCAT() +Warning 1260 Row 2 was cut by GROUP_CONCAT() +explain select count(*), group_concat(t1.b,t2.c) +from t1 join t2 on t1.a=t2.a group by t1.a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort +1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where; Using join buffer (flat, BNL join) +prepare stmt from "select count(*), group_concat(t1.b,t2.c) +from t1 join t2 on t1.a=t2.a group by t1.a"; +execute stmt; +count(*) group_concat(t1.b,t2.c) +2 aaaaa +2 bbbbb +Warnings: +Warning 1260 Row 1 was cut by GROUP_CONCAT() +Warning 1260 Row 2 was cut by GROUP_CONCAT() +execute stmt; +count(*) group_concat(t1.b,t2.c) +2 aaaaa +2 bbbbb +Warnings: +Warning 1260 Row 1 was cut by GROUP_CONCAT() +Warning 1260 Row 2 was cut by GROUP_CONCAT() +deallocate prepare stmt; +set join_cache_level=0; +select count(*), group_concat(t1.b,t2.c) +from t1 join t2 on t1.a=t2.a group by t1.a; +count(*) group_concat(t1.b,t2.c) +2 aaaaa +2 bbbbb +Warnings: +Warning 1260 Row 1 was cut by GROUP_CONCAT() +Warning 1260 Row 2 was cut by GROUP_CONCAT() +explain select count(*), group_concat(t1.b,t2.c) +from t1 join t2 on t1.a=t2.a group by t1.a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using filesort +1 SIMPLE t2 ALL NULL NULL NULL NULL 4 Using where +prepare stmt from "select count(*), group_concat(t1.b,t2.c) +from t1 join t2 on t1.a=t2.a group by t1.a"; +execute stmt; +count(*) group_concat(t1.b,t2.c) +2 aaaaa +2 bbbbb +Warnings: +Warning 1260 Row 1 was cut by GROUP_CONCAT() +Warning 1260 Row 2 was cut by GROUP_CONCAT() +execute stmt; +count(*) group_concat(t1.b,t2.c) +2 aaaaa +2 bbbbb +Warnings: +Warning 1260 Row 1 was cut by GROUP_CONCAT() +Warning 1260 Row 2 was cut by GROUP_CONCAT() +deallocate prepare stmt; +set join_cache_level=default; +set group_concat_max_len=default; +drop table t1,t2; +# +# MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion +# +SET NAMES utf8, @@collation_connection=latin1_swedish_ci; +CREATE TABLE t1 (c VARCHAR(10)) CHARACTER SET latin1; +INSERT INTO t1 VALUES ('a'),('A'); +CREATE OR REPLACE VIEW v1 AS +SELECT GROUP_CONCAT(c SEPARATOR 'ß') AS c1 FROM t1 GROUP BY c; +SELECT * FROM v1; +c1 +aßA +SELECT HEX(c1) FROM v1; +HEX(c1) +61DF41 +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select group_concat(`t1`.`c` separator 'ß') AS `c1` from `t1` group by `t1`.`c` utf8mb3 latin1_swedish_ci +DROP VIEW v1; +DROP TABLE t1; +SET NAMES latin1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/func_gconcat.test mariadb-10.11.9/mysql-test/main/func_gconcat.test --- mariadb-10.11.6/mysql-test/main/func_gconcat.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_gconcat.test 2024-08-03 07:29:57.000000000 +0000 @@ -950,10 +950,7 @@ SELECT * FROM v1; DROP VIEW v1; -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP HAVING GROUP_CONCAT(a ORDER BY a)='10,20,30'); ---enable_view_protocol +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP HAVING GROUP_CONCAT(a ORDER BY a)='10,20,30') as exp; CREATE VIEW v1 AS SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP HAVING GROUP_CONCAT(a ORDER BY a)='10,20,30'); SELECT * FROM v1; @@ -1066,3 +1063,59 @@ --echo # --echo # End of 10.3 tests --echo # + +--echo # +--echo # MDEV-31276: Execution of PS from grouping query with join +--echo # and GROUP_CONCAT set function +--echo # + +create table t1 (a int, b varchar(20)) engine=myisam; +create table t2 (a int, c varchar(20)) engine=myisam; +insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb"); +insert into t2 values (1,"cccccccccc"),(2,"dddddddddd"); +insert into t2 values (1,"eeeeeee"),(2,"fffffff"); + +let $q= +select count(*), group_concat(t1.b,t2.c) + from t1 join t2 on t1.a=t2.a group by t1.a; + +set group_concat_max_len=5; + +eval $q; +eval explain $q; +eval prepare stmt from "$q"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +set join_cache_level=0; + +eval $q; +eval explain $q; +eval prepare stmt from "$q"; +execute stmt; +execute stmt; +deallocate prepare stmt; + +set join_cache_level=default; +set group_concat_max_len=default; + +drop table t1,t2; + +--echo # +--echo # MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion +--echo # + +SET NAMES utf8, @@collation_connection=latin1_swedish_ci; +CREATE TABLE t1 (c VARCHAR(10)) CHARACTER SET latin1; +INSERT INTO t1 VALUES ('a'),('A'); +CREATE OR REPLACE VIEW v1 AS + SELECT GROUP_CONCAT(c SEPARATOR 'ß') AS c1 FROM t1 GROUP BY c; +SELECT * FROM v1; +SELECT HEX(c1) FROM v1; +SHOW CREATE VIEW v1; +DROP VIEW v1; +DROP TABLE t1; +SET NAMES latin1; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/func_group_innodb.result mariadb-10.11.9/mysql-test/main/func_group_innodb.result --- mariadb-10.11.6/mysql-test/main/func_group_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_group_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -5,8 +5,8 @@ set global innodb_stats_persistent_sample_pages=100; create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB; insert into t1 values (1, 3); -select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ; -count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ +select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ as exp from t1 group by MAX_REQ; +exp 1 select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ; Case When Count(*) < MAX_REQ Then 1 Else 0 End diff -Nru mariadb-10.11.6/mysql-test/main/func_group_innodb.test mariadb-10.11.9/mysql-test/main/func_group_innodb.test --- mariadb-10.11.6/mysql-test/main/func_group_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_group_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -15,10 +15,7 @@ create table t1 (USR_ID integer not null, MAX_REQ integer not null, constraint PK_SEA_USER primary key (USR_ID)) engine=InnoDB; --enable_warnings insert into t1 values (1, 3); -#enable after fix MDEV-27871 ---disable_view_protocol -select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ; ---enable_view_protocol +select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ as exp from t1 group by MAX_REQ; select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/func_hybrid_type.result mariadb-10.11.9/mysql-test/main/func_hybrid_type.result --- mariadb-10.11.6/mysql-test/main/func_hybrid_type.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_hybrid_type.result 2024-08-03 07:29:57.000000000 +0000 @@ -4313,5 +4313,30 @@ SELECT @@max_allowed_packet=ROW(1,1); ERROR HY000: Illegal parameter data types bigint unsigned and row for operation '=' # +# MDEV-21034 GREATEST() and LEAST() malfunction for NULL +# +SELECT 5 AS c1 FROM dual WHERE GREATEST(1, NULL); +c1 +SELECT 5 AS c1 FROM dual WHERE LEAST(1, NULL); +c1 +CREATE TABLE t0 (c0 INT); +INSERT INTO t0 VALUES (1); +SELECT * FROM t0 WHERE GREATEST(c0, NULL); +c0 +SELECT * FROM t0 WHERE LEAST(c0, NULL); +c0 +DROP TABLE t0; +SELECT 5 AS c1 FROM dual WHERE GREATEST(1e0, NULL); +c1 +SELECT 5 AS c1 FROM dual WHERE LEAST(1e0, NULL); +c1 +CREATE TABLE t0 (c0 DOUBLE); +INSERT INTO t0 VALUES (1); +SELECT * FROM t0 WHERE GREATEST(c0, NULL); +c0 +SELECT * FROM t0 WHERE LEAST(c0, NULL); +c0 +DROP TABLE t0; +# # End of 10.5 tests # diff -Nru mariadb-10.11.6/mysql-test/main/func_hybrid_type.test mariadb-10.11.9/mysql-test/main/func_hybrid_type.test --- mariadb-10.11.6/mysql-test/main/func_hybrid_type.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_hybrid_type.test 2024-08-03 07:29:57.000000000 +0000 @@ -1116,5 +1116,28 @@ SELECT @@max_allowed_packet=ROW(1,1); --echo # +--echo # MDEV-21034 GREATEST() and LEAST() malfunction for NULL +--echo # + +SELECT 5 AS c1 FROM dual WHERE GREATEST(1, NULL); +SELECT 5 AS c1 FROM dual WHERE LEAST(1, NULL); + +CREATE TABLE t0 (c0 INT); +INSERT INTO t0 VALUES (1); +SELECT * FROM t0 WHERE GREATEST(c0, NULL); +SELECT * FROM t0 WHERE LEAST(c0, NULL); +DROP TABLE t0; + +SELECT 5 AS c1 FROM dual WHERE GREATEST(1e0, NULL); +SELECT 5 AS c1 FROM dual WHERE LEAST(1e0, NULL); + +CREATE TABLE t0 (c0 DOUBLE); +INSERT INTO t0 VALUES (1); +SELECT * FROM t0 WHERE GREATEST(c0, NULL); +SELECT * FROM t0 WHERE LEAST(c0, NULL); +DROP TABLE t0; + + +--echo # --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_in.result mariadb-10.11.9/mysql-test/main/func_in.result --- mariadb-10.11.6/mysql-test/main/func_in.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_in.result 2024-08-03 07:29:57.000000000 +0000 @@ -531,6 +531,8 @@ explain select f1 from t1 where f1 in (2,1); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index t1f1_idx t1f1_idx 2 NULL 3 Using where; Using index +Warnings: +Note 1105 Cannot use key `t1f1_idx` part[0] for lookup: `test`.`t1`.`f1` of type `char` = "2" of type `int` create table t2(f2 int, index t2f2(f2)); insert into t2 values(0),(1),(2); select f2 from t2 where f2 in ('a',2); @@ -861,15 +863,15 @@ # # MDEV-11514 IN with a mixture of TIME and DATETIME returns a wrong result # -SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32'); -TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32') +SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32') as exp; +exp 1 -PREPARE stmt FROM "SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32')"; +PREPARE stmt FROM "SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32') as exp"; EXECUTE stmt; -TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32') +exp 1 EXECUTE stmt; -TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32') +exp 1 DEALLOCATE PREPARE stmt; # @@ -969,6 +971,84 @@ 9223372036854775808 drop table `a`; # +# MDEV-18319 BIGINT UNSIGNED Performance issue +# +CREATE OR REPLACE TABLE t1 ( +id bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY +); +FOR i IN 0..255 +DO +INSERT INTO t1 VALUES (); +END FOR +$$ +SELECT MIN(id), MAX(id), COUNT(*) FROM t1; +MIN(id) MAX(id) COUNT(*) +1 256 256 +EXPLAIN SELECT id FROM t1 WHERE id IN (1,2); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range PRIMARY PRIMARY 8 NULL 2 Using where; Using index +EXPLAIN SELECT id FROM t1 WHERE id IN (9223372036854775806, 9223372036854775807); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range PRIMARY PRIMARY 8 NULL 2 Using where; Using index +EXPLAIN SELECT id FROM t1 WHERE id IN (9223372036854775807, 9223372036854775808); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range PRIMARY PRIMARY 8 NULL 2 Using where; Using index +DROP TABLE t1; +# +# MDEV-18898 SELECT using wrong index when using operator IN with mixed types +# +CREATE TEMPORARY TABLE t1 ( +id int(10) unsigned NOT NULL AUTO_INCREMENT, +name varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, +PRIMARY KEY (`id`), +UNIQUE KEY `name` (`name`) +); +FOR i IN 1..255 +DO +INSERT INTO t1 VALUES (i, MD5(i)); +END FOR +$$ +# +# Constants alone +# +ANALYZE SELECT id, name FROM t1 WHERE id = 1; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 NULL 100.00 NULL +ANALYZE SELECT id, name FROM t1 WHERE id = '2'; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 NULL 100.00 NULL +# +# Two constants using IN +# +ANALYZE SELECT id, name FROM t1 WHERE id IN (1, 2); +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +ANALYZE SELECT id, name FROM t1 WHERE id IN ('1', 2) /* Used a wrong index */; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +ANALYZE SELECT id, name FROM t1 WHERE id IN (1, '2') /* Used a wrong index */; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +ANALYZE SELECT id, name FROM t1 WHERE id IN ('1', '2'); +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +# +# Two constants using OR +# +ANALYZE SELECT id, name FROM t1 WHERE id = 1 OR id = 2; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +ANALYZE SELECT id, name FROM t1 WHERE id = '1' OR id = '2'; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +ANALYZE SELECT id, name FROM t1 WHERE id = 1 OR id = '2'; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +ANALYZE SELECT id, name FROM t1 WHERE id = '1' OR id = 2; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 2 2.00 100.00 100.00 Using index condition +DROP TABLE t1; +# # End of 10.5 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/func_in.test mariadb-10.11.9/mysql-test/main/func_in.test --- mariadb-10.11.6/mysql-test/main/func_in.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_in.test 2024-08-03 07:29:57.000000000 +0000 @@ -652,14 +652,11 @@ --echo # --echo # MDEV-11514 IN with a mixture of TIME and DATETIME returns a wrong result --echo # -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32'); -PREPARE stmt FROM "SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32')"; +SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32') as exp; +PREPARE stmt FROM "SELECT TIME'10:20:30' IN (102030,TIME'10:20:31',TIMESTAMP'2001-01-01 10:20:32') as exp"; EXECUTE stmt; EXECUTE stmt; DEALLOCATE PREPARE stmt; ---enable_view_protocol --echo # --echo # MDEV-11497 Wrong result for (int_expr IN (mixture of signed and unsigned expressions)) @@ -743,6 +740,66 @@ drop table `a`; --echo # +--echo # MDEV-18319 BIGINT UNSIGNED Performance issue +--echo # + +CREATE OR REPLACE TABLE t1 ( + id bigint(20) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY +); +DELIMITER $$; +FOR i IN 0..255 +DO + INSERT INTO t1 VALUES (); +END FOR +$$ +DELIMITER ;$$ +SELECT MIN(id), MAX(id), COUNT(*) FROM t1; +EXPLAIN SELECT id FROM t1 WHERE id IN (1,2); +EXPLAIN SELECT id FROM t1 WHERE id IN (9223372036854775806, 9223372036854775807); +EXPLAIN SELECT id FROM t1 WHERE id IN (9223372036854775807, 9223372036854775808); +DROP TABLE t1; + + +--echo # +--echo # MDEV-18898 SELECT using wrong index when using operator IN with mixed types +--echo # + +CREATE TEMPORARY TABLE t1 ( + id int(10) unsigned NOT NULL AUTO_INCREMENT, + name varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`) +); +DELIMITER $$; +FOR i IN 1..255 +DO + INSERT INTO t1 VALUES (i, MD5(i)); +END FOR +$$ +DELIMITER ;$$ +--echo # +--echo # Constants alone +--echo # +ANALYZE SELECT id, name FROM t1 WHERE id = 1; +ANALYZE SELECT id, name FROM t1 WHERE id = '2'; +--echo # +--echo # Two constants using IN +--echo # +ANALYZE SELECT id, name FROM t1 WHERE id IN (1, 2); +ANALYZE SELECT id, name FROM t1 WHERE id IN ('1', 2) /* Used a wrong index */; +ANALYZE SELECT id, name FROM t1 WHERE id IN (1, '2') /* Used a wrong index */; +ANALYZE SELECT id, name FROM t1 WHERE id IN ('1', '2'); +--echo # +--echo # Two constants using OR +--echo # +ANALYZE SELECT id, name FROM t1 WHERE id = 1 OR id = 2; +ANALYZE SELECT id, name FROM t1 WHERE id = '1' OR id = '2'; +ANALYZE SELECT id, name FROM t1 WHERE id = 1 OR id = '2'; +ANALYZE SELECT id, name FROM t1 WHERE id = '1' OR id = 2; +DROP TABLE t1; + + +--echo # --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_json.result mariadb-10.11.9/mysql-test/main/func_json.result --- mariadb-10.11.6/mysql-test/main/func_json.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_json.result 2024-08-03 07:29:57.000000000 +0000 @@ -272,7 +272,7 @@ show create table t1; Table Create Table t1 CREATE TABLE `t1` ( - `f` varchar(32) DEFAULT NULL + `f` varchar(46) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci select * from t1; f @@ -1460,6 +1460,39 @@ foo SET @@COLLATION_CONNECTION= @old_collation_connection; # +# MDEV-32587 JSON_VALID fail to validate integer zero in scientific notation +# +select JSON_VALID(' {"number": 1E-4}'); +JSON_VALID(' {"number": 1E-4}') +1 +select JSON_VALID(' {"number": 0E-4}'); +JSON_VALID(' {"number": 0E-4}') +1 +select JSON_VALID(' {"number": 0.0}'); +JSON_VALID(' {"number": 0.0}') +1 +select JSON_VALID(' {"number": 0.1E-4}'); +JSON_VALID(' {"number": 0.1E-4}') +1 +select JSON_VALID(' {"number": 0e-4}'); +JSON_VALID(' {"number": 0e-4}') +1 +select JSON_VALID(' {"number": -0E-4}'); +JSON_VALID(' {"number": -0E-4}') +1 +select JSON_VALUE(' {"number": 0E-4}', '$.number'); +JSON_VALUE(' {"number": 0E-4}', '$.number') +0E-4 +select JSON_VALID(' {"number": 00E-4}'); +JSON_VALID(' {"number": 00E-4}') +0 +select JSON_VALID(' {"number": 01E-4}'); +JSON_VALID(' {"number": 01E-4}') +0 +select JSON_VALID(' {"number": 0E-4.0}'); +JSON_VALID(' {"number": 0E-4.0}') +0 +# # End of 10.4 tests # # @@ -1646,6 +1679,55 @@ JSON_OBJECTAGG('\\', 1) {"\\":1} # +# MDEV-24784 JSON_ARRAYAGG charset issue +# +set names utf8; +select json_arrayagg('ä'), json_objectagg(1, 'ä'); +json_arrayagg('ä') json_objectagg(1, 'ä') +["ä"] {"1":"ä"} +set names latin1; +select json_arrayagg('ä'), json_objectagg(1, 'ä'); +json_arrayagg('ä') json_objectagg(1, 'ä') +["ä"] {"1":"ä"} +# +# MDEV-32287: JSON_EXTRACT not returning multiple values for same path +# +select JSON_EXTRACT("[1, 2, [30, 40]]", '$[2][1]', '$[2][1]'); +JSON_EXTRACT("[1, 2, [30, 40]]", '$[2][1]', '$[2][1]') +[40, 40] +# +# MDEV-31402: SIGSEGV in json_get_path_next | Item_func_json_extract::read_json +# +CREATE TABLE t (id CHAR AS (JSON_COMPACT (JSON_EXTRACT(doc,"$._id"))) UNIQUE KEY,doc JSON,CONSTRAINT notnu CHECK (id IS NOT NULL)); +INSERT INTO t (doc) VALUES ('{ "_id" : { "$oid" : "0ca0b0f0" },"a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" :0} ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] }'); +ERROR 22001: Data too long for column 'id' at row 1 +DROP TABLE t; +# +# MDEV-19487: JSON_TYPE doesnt detect the type of String Values (returns NULL) and for Date/DateTime returns "INTEGER" +# +SELECT JSON_TYPE(json_value(JSON_OBJECT("id", 1, "name", 'Monty', "date", Cast('2019-01-01' as Date) ), '$.date')) as x; +x +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 5 +# +# MDEV-22141: JSON_REMOVE returns NULL on valid arguments +# +SELECT JSON_REMOVE('{"A": { "B": 1 }}', '$.A.B.C.D'); +JSON_REMOVE('{"A": { "B": 1 }}', '$.A.B.C.D') +{"A": {"B": 1}} +# +# MDEV-34143: Server crashes when executing JSON_EXTRACT after setting non-default collation_connection +# +SET @save_collation_connection= @@collation_connection; +SET collation_connection='utf16_bin'; +SELECT JSON_EXTRACT('{"a": 1,"b": 2}','$.a'); +JSON_EXTRACT('{"a": 1,"b": 2}','$.a') +NULL +Warnings: +Warning 4036 Character disallowed in JSON in argument 1 to function 'json_extract' at position 2 +SET @@collation_connection= @save_collation_connection; +# # End of 10.5 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/func_json.test mariadb-10.11.9/mysql-test/main/func_json.test --- mariadb-10.11.6/mysql-test/main/func_json.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_json.test 2024-08-03 07:29:57.000000000 +0000 @@ -87,15 +87,12 @@ select json_extract('[10, 20, [30, 40], 1, 10]', '$[1]', '$[25]') as exp; select json_extract( '[{"a": [3, 4]}, {"b": 2}]', '$[0].a', '$[1].a') as exp; -#enable after MDEV-32454 fix ---disable_view_protocol select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.k1', 'word') as exp; select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.d[3]', 3) as exp; select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.a[2]', 2) as exp; select json_insert('{"a":1, "b":{"c":1}, "d":[1, 2]}', '$.b.c', 'word') as exp; select json_set('{ "a": 1, "b": [2, 3]}', '$.a', 10, '$.c', '[true, false]') as exp; ---enable_view_protocol select json_replace('{ "a": 1, "b": [2, 3]}', '$.a', 10, '$.c', '[true, false]') as exp; select json_replace('{ "a": 1, "b": [2, 3]}', '$.a', 10, '$.b', '[true, false]') as exp; @@ -137,14 +134,11 @@ select json_merge('{"a":"b"}','{"c":"d"}'); SELECT JSON_MERGE('[1, 2]', '{"id": 47}'); -#enable after MDEV-32454 fix ---disable_view_protocol select json_type('{"k1":123, "k2":345}'); select json_type('[123, "k2", 345]'); select json_type("true"); select json_type('123'); select json_type('123.12'); ---enable_view_protocol select json_keys('{"a":{"c":1, "d":2}, "b":2}'); select json_keys('{"a":{"c":1, "d":2}, "b":2}', "$.a"); @@ -173,11 +167,8 @@ drop table t1; -#enable after MDEV-32454 fix ---disable_view_protocol select json_unquote('"abc"'); select json_unquote('abc'); ---enable_view_protocol # # MDEV-13703 Illegal mix of collations for operation 'json_object' on using JSON_UNQUOTE as an argument. # @@ -188,13 +179,9 @@ drop table t1; -#enable after MDEV-32454 fix ---disable_view_protocol select json_object("a", json_object("b", "abcd")); select json_object("a", '{"b": "abcd"}'); select json_object("a", json_compact('{"b": "abcd"}')); ---enable_view_protocol - select json_compact(NULL); select json_depth(json_compact(NULL)); @@ -270,11 +257,8 @@ select json_merge('{"a":{"u":12, "x":"b", "r":1}}', '{"a":{"x":"c", "r":2}}') as ex ; select json_compact('{"a":1, "b":[1,2,3], "c":{"aa":"v1", "bb": "v2"}}') as ex; -#enable after MDEV-32454 fix ---disable_view_protocol select json_loose('{"a":1, "b":[1,2,3], "c":{"aa":"v1", "bb": "v2"}}') as ex; select json_detailed('{"a":1, "b":[1,2,3], "c":{"aa":"v1", "bb": "v2"}}') as ex; ---enable_view_protocol # # MDEV-11856 json_search doesn't search for values with double quotes character (") @@ -469,12 +453,9 @@ --echo # MDEV-16750 JSON_SET mishandles unicode every second pair of arguments. --echo # -#enable after MDEV-32454 fix ---disable_view_protocol SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6) as exp; SELECT JSON_SET('{}', '$.a', _utf8 0xC3B6, '$.b', _utf8 0xC3B6) as exp; SELECT JSON_SET('{}', '$.a', _utf8 X'C3B6', '$.x', 1, '$.b', _utf8 X'C3B6') as exp; ---enable_view_protocol --echo # --echo # MDEV-17121 JSON_ARRAY_APPEND @@ -948,6 +929,22 @@ SET @@COLLATION_CONNECTION= @old_collation_connection; --echo # +--echo # MDEV-32587 JSON_VALID fail to validate integer zero in scientific notation +--echo # +# Passing +select JSON_VALID(' {"number": 1E-4}'); +select JSON_VALID(' {"number": 0E-4}'); +select JSON_VALID(' {"number": 0.0}'); +select JSON_VALID(' {"number": 0.1E-4}'); +select JSON_VALID(' {"number": 0e-4}'); +select JSON_VALID(' {"number": -0E-4}'); +select JSON_VALUE(' {"number": 0E-4}', '$.number'); +# Failing +select JSON_VALID(' {"number": 00E-4}'); +select JSON_VALID(' {"number": 01E-4}'); +select JSON_VALID(' {"number": 0E-4.0}'); + +--echo # --echo # End of 10.4 tests --echo # @@ -1112,6 +1109,62 @@ SELECT JSON_OBJECTAGG('\\', 1); --echo # +--echo # MDEV-24784 JSON_ARRAYAGG charset issue +--echo # +--disable_service_connection +set names utf8; +select json_arrayagg('ä'), json_objectagg(1, 'ä'); +set names latin1; +select json_arrayagg('ä'), json_objectagg(1, 'ä'); +--enable_service_connection + + +--echo # +--echo # MDEV-32287: JSON_EXTRACT not returning multiple values for same path +--echo # + +select JSON_EXTRACT("[1, 2, [30, 40]]", '$[2][1]', '$[2][1]'); + + +--echo # +--echo # MDEV-31402: SIGSEGV in json_get_path_next | Item_func_json_extract::read_json +--echo # + +CREATE TABLE t (id CHAR AS (JSON_COMPACT (JSON_EXTRACT(doc,"$._id"))) UNIQUE KEY,doc JSON,CONSTRAINT notnu CHECK (id IS NOT NULL)); +--error ER_DATA_TOO_LONG +INSERT INTO t (doc) VALUES ('{ "_id" : { "$oid" : "0ca0b0f0" },"a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" : [ { "a" :0} ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] }'); + +DROP TABLE t; + +--echo # +--echo # MDEV-19487: JSON_TYPE doesnt detect the type of String Values (returns NULL) and for Date/DateTime returns "INTEGER" +--echo # + +SELECT JSON_TYPE(json_value(JSON_OBJECT("id", 1, "name", 'Monty', "date", Cast('2019-01-01' as Date) ), '$.date')) as x; + + +--echo # +--echo # MDEV-22141: JSON_REMOVE returns NULL on valid arguments +--echo # + +SELECT JSON_REMOVE('{"A": { "B": 1 }}', '$.A.B.C.D'); + + + +--echo # +--echo # MDEV-34143: Server crashes when executing JSON_EXTRACT after setting non-default collation_connection +--echo # + +SET @save_collation_connection= @@collation_connection; + +SET collation_connection='utf16_bin'; +--disable_service_connection +SELECT JSON_EXTRACT('{"a": 1,"b": 2}','$.a'); +--enable_service_connection + +SET @@collation_connection= @save_collation_connection; + +--echo # --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_json_notembedded.result mariadb-10.11.9/mysql-test/main/func_json_notembedded.result --- mariadb-10.11.6/mysql-test/main/func_json_notembedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_json_notembedded.result 2024-08-03 07:29:57.000000000 +0000 @@ -10,6 +10,8 @@ length(@obj) length(@arr) 5000009 5000009 set max_statement_time=0.0001; +SET @old_debug= @@debug_dbug; +SET debug_dbug='+d,debug_max_statement_time exceeded'; select json_array_append(@arr, '$[0]', 1); ERROR 70100: Query execution was interrupted (max_statement_time exceeded) select json_array_insert(@arr, '$[0]', 1); @@ -34,6 +36,7 @@ ERROR 70100: Query execution was interrupted (max_statement_time exceeded) select json_set(@arr,'$[1000]',1); ERROR 70100: Query execution was interrupted (max_statement_time exceeded) +SET debug_dbug= @old_debug; disconnect u; connection default; set global max_allowed_packet=default; diff -Nru mariadb-10.11.6/mysql-test/main/func_json_notembedded.test mariadb-10.11.9/mysql-test/main/func_json_notembedded.test --- mariadb-10.11.6/mysql-test/main/func_json_notembedded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_json_notembedded.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,7 @@ source include/have_profiling.inc; source include/not_embedded.inc; source include/no_valgrind_without_big.inc; +source include/have_debug.inc; set global max_allowed_packet=1073741824; connect u,localhost,root; @@ -16,6 +17,8 @@ set max_statement_time=0.0001; disable_abort_on_error; +SET @old_debug= @@debug_dbug; +SET debug_dbug='+d,debug_max_statement_time exceeded'; select json_array_append(@arr, '$[0]', 1); select json_array_insert(@arr, '$[0]', 1); select json_insert(@obj, '$.meta', 1); @@ -29,6 +32,7 @@ select json_replace(@obj,'$.foo',1); select json_set(@arr,'$[1000]',1); enable_abort_on_error; +SET debug_dbug= @old_debug; disconnect u; connection default; set global max_allowed_packet=default; diff -Nru mariadb-10.11.6/mysql-test/main/func_math.result mariadb-10.11.9/mysql-test/main/func_math.result --- mariadb-10.11.6/mysql-test/main/func_math.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_math.result 2024-08-03 07:29:57.000000000 +0000 @@ -3711,5 +3711,20 @@ f 0 # +# MDEV-33534 UBSAN: Negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_double_round from sql/item_func.cc| +# +SELECT TRUNCATE(EXP(-1.e-2),-1.e+30) AS c1; +c1 +0 +SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) AS c1; +c1 +0 +SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1; +c1 +0 +SELECT(ASIN(-1)+ LN(-1)) % (ATAN(-1) MOD FLOOR(1)) * (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1; +c1 +NULL +# # End of 10.5 tests # diff -Nru mariadb-10.11.6/mysql-test/main/func_math.test mariadb-10.11.9/mysql-test/main/func_math.test --- mariadb-10.11.6/mysql-test/main/func_math.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_math.test 2024-08-03 07:29:57.000000000 +0000 @@ -1981,5 +1981,15 @@ --echo # +--echo # MDEV-33534 UBSAN: Negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_double_round from sql/item_func.cc| +--echo # + +SELECT TRUNCATE(EXP(-1.e-2),-1.e+30) AS c1; +SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) AS c1; +SELECT (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1; +SELECT(ASIN(-1)+ LN(-1)) % (ATAN(-1) MOD FLOOR(1)) * (TRUNCATE(EXP(-1.e-2),-1.e+30) % RADIANS(-1)) * (LAST_DAY('1-03-30 1:29:12') MOD 1 + COS(-1)) AS c1; + + +--echo # --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_misc.result mariadb-10.11.9/mysql-test/main/func_misc.result --- mariadb-10.11.6/mysql-test/main/func_misc.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_misc.result 2024-08-03 07:29:57.000000000 +0000 @@ -1746,3 +1746,16 @@ SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA FROM information_schema.metadata_lock_info WHERE thread_id>0 ORDER BY TABLE_SCHEMA; LOCK_MODE LOCK_TYPE TABLE_SCHEMA +# +# MDEV-32583 UUID() should be treated as stochastic for the purposes of +# forcing query materialization +# +create table t1 as WITH cte AS (SELECT UUID() as r FROM seq_1_to_10) +SELECT r as r1, r FROM cte; +select count(*) from t1 where r1!=r; +count(*) +0 +drop table t1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_misc.test mariadb-10.11.9/mysql-test/main/func_misc.test --- mariadb-10.11.6/mysql-test/main/func_misc.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_misc.test 2024-08-03 07:29:57.000000000 +0000 @@ -1367,3 +1367,18 @@ --enable_ps2_protocol --enable_view_protocol + +--echo # +--echo # MDEV-32583 UUID() should be treated as stochastic for the purposes of +--echo # forcing query materialization +--echo # + +--source include/have_sequence.inc +create table t1 as WITH cte AS (SELECT UUID() as r FROM seq_1_to_10) +SELECT r as r1, r FROM cte; +select count(*) from t1 where r1!=r; +drop table t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_regexp.result mariadb-10.11.9/mysql-test/main/func_regexp.result --- mariadb-10.11.6/mysql-test/main/func_regexp.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_regexp.result 2024-08-03 07:29:57.000000000 +0000 @@ -110,7 +110,7 @@ R3 deallocate prepare stmt1; drop table t1; -End of 4.1 tests +# End of 4.1 tests SELECT 1 REGEXP NULL; 1 REGEXP NULL NULL @@ -126,7 +126,7 @@ SELECT "ABC" REGEXP BINARY NULL; "ABC" REGEXP BINARY NULL NULL -End of 5.0 tests +# End of 5.0 tests CREATE TABLE t1(a INT, b CHAR(4)); INSERT INTO t1 VALUES (1, '6.1'), (1, '7.0'), (1, '8.0'); PREPARE stmt1 FROM "SELECT a FROM t1 WHERE a=1 AND '7.0' REGEXP b LIMIT 1"; @@ -144,7 +144,7 @@ 1 DEALLOCATE PREPARE stmt1; DROP TABLE t1; -End of 5.1 tests +# End of 5.1 tests SELECT ' ' REGEXP '[[:blank:]]'; ' ' REGEXP '[[:blank:]]' 1 @@ -163,3 +163,49 @@ SELECT REGEXP_INSTR('111222333',2); REGEXP_INSTR('111222333',2) 4 +# End of 10.3 tests +# +# MDEV-33344 REGEXP empty string inconsistent +# +create table t1 (x char(5)); +insert t1 values (''), ('x'); +select 'foo' regexp x from t1 order by x asc; +'foo' regexp x +1 +0 +select 'foo' regexp x from t1 order by x desc; +'foo' regexp x +0 +1 +drop table t1; +# +# MDEV-21076 NOT NULL and UNIQUE constraints cause SUM() to yield an incorrect result +# +CREATE TABLE t0(c0 INT NOT NULL, c1 CHAR UNIQUE); +INSERT INTO t0 VALUES (0, 1); +INSERT INTO t0 VALUES (0, ''); +SELECT (c1 RLIKE c1), (c0 IS NULL) FROM t0; +(c1 RLIKE c1) (c0 IS NULL) +1 0 +1 0 +SELECT SUM(a.t) FROM (SELECT (c1 RLIKE c1) = (c0 IS NULL) as t FROM t0) as a; +SUM(a.t) +0 +DROP TABLE t0; +# +# MDEV-21058 CREATE TABLE with generated column and RLIKE results in sigabrt +# +CREATE TABLE t1 (c0 INT); +INSERT INTO t1 VALUES (1),(2),(3); +SELECT ('' RLIKE '[') AS c1 FROM t1; +ERROR 42000: Regex error 'missing terminating ] for character class at offset 1' +SELECT REGEXP_INSTR('','[') AS c1 FROM t1; +ERROR 42000: Regex error 'missing terminating ] for character class at offset 1' +SELECT c0, '' RLIKE NULL AS c1, REGEXP_INSTR('', NULL) AS c2 +FROM t1 ORDER BY c0; +c0 c1 c2 +1 NULL NULL +2 NULL NULL +3 NULL NULL +DROP TABLE t1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/func_regexp.test mariadb-10.11.9/mysql-test/main/func_regexp.test --- mariadb-10.11.6/mysql-test/main/func_regexp.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_regexp.test 2024-08-03 07:29:57.000000000 +0000 @@ -55,7 +55,7 @@ deallocate prepare stmt1; drop table t1; ---echo End of 4.1 tests +--echo # End of 4.1 tests # @@ -74,7 +74,7 @@ SELECT 'A' REGEXP BINARY NULL; SELECT "ABC" REGEXP BINARY NULL; ---echo End of 5.0 tests +--echo # End of 5.0 tests # @@ -91,7 +91,7 @@ DROP TABLE t1; ---echo End of 5.1 tests +--echo # End of 5.1 tests # # MDEV-5820 MySQL Bug #54805 definitions in regex/my_regex.h conflict with /usr/include/regex.h @@ -110,3 +110,44 @@ --echo # SELECT REGEXP_INSTR('111222333',2); +--echo # End of 10.3 tests + +--echo # +--echo # MDEV-33344 REGEXP empty string inconsistent +--echo # +create table t1 (x char(5)); +insert t1 values (''), ('x'); +select 'foo' regexp x from t1 order by x asc; +select 'foo' regexp x from t1 order by x desc; +drop table t1; + +--echo # +--echo # MDEV-21076 NOT NULL and UNIQUE constraints cause SUM() to yield an incorrect result +--echo # + +CREATE TABLE t0(c0 INT NOT NULL, c1 CHAR UNIQUE); +INSERT INTO t0 VALUES (0, 1); +INSERT INTO t0 VALUES (0, ''); +SELECT (c1 RLIKE c1), (c0 IS NULL) FROM t0; +SELECT SUM(a.t) FROM (SELECT (c1 RLIKE c1) = (c0 IS NULL) as t FROM t0) as a; +DROP TABLE t0; + +--echo # +--echo # MDEV-21058 CREATE TABLE with generated column and RLIKE results in sigabrt +--echo # + +CREATE TABLE t1 (c0 INT); +INSERT INTO t1 VALUES (1),(2),(3); + +--error ER_REGEXP_ERROR +SELECT ('' RLIKE '[') AS c1 FROM t1; + +--error ER_REGEXP_ERROR +SELECT REGEXP_INSTR('','[') AS c1 FROM t1; + +SELECT c0, '' RLIKE NULL AS c1, REGEXP_INSTR('', NULL) AS c2 +FROM t1 ORDER BY c0; + +DROP TABLE t1; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/func_regexp_pcre.result mariadb-10.11.9/mysql-test/main/func_regexp_pcre.result --- mariadb-10.11.6/mysql-test/main/func_regexp_pcre.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_regexp_pcre.result 2024-08-03 07:29:57.000000000 +0000 @@ -720,17 +720,17 @@ SELECT REGEXP_INSTR('ваÑÑ','Ñ'); REGEXP_INSTR('ваÑÑ','Ñ') 4 -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('в' USING koi8r)); -REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('в' USING koi8r)) +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('в' USING koi8r)) as exp; +exp 1 -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('а' USING koi8r)); -REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('а' USING koi8r)) +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('а' USING koi8r)) as exp; +exp 2 -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)); -REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)) +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)) as exp; +exp 3 -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)); -REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)) +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)) as exp; +exp 4 # # Checking REGEXP_SUBSTR @@ -757,8 +757,8 @@ `REGEXP_SUBSTR('abc','b')+0` double NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; -SELECT REGEXP_SUBSTR('See https://mariadb.org/en/foundation/ for details', 'https?://[^/]*'); -REGEXP_SUBSTR('See https://mariadb.org/en/foundation/ for details', 'https?://[^/]*') +SELECT REGEXP_SUBSTR('See https://mariadb.org/en/foundation/ for details', 'https?://[^/]*') as exp; +exp https://mariadb.org # # MDEV-6027 RLIKE: "." no longer matching new line @@ -792,14 +792,14 @@ 'a\nb' RLIKE '(?-s)a.b' 0 SET default_regex_flags=DEFAULT; -SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$'); +SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') as exp; ERROR 42000: Regex error 'two named subpatterns have the same name (PCRE2_DUPNAMES not set) at offset 30' SET default_regex_flags='DUPNAMES'; -SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$'); -REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') +SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') as exp; +exp Monday Mon -SELECT REGEXP_SUBSTR('Tuesday Tue','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$'); -REGEXP_SUBSTR('Tuesday Tue','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') +SELECT REGEXP_SUBSTR('Tuesday Tue','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') as exp; +exp Tuesday Tue SET default_regex_flags=DEFAULT; SELECT 'AB' RLIKE 'A B'; @@ -850,8 +850,8 @@ # # MDEV-6965 non-captured group \2 in regexp_replace # -SELECT REGEXP_REPLACE('1 foo and bar', '(\\d+) foo and (\\d+ )?bar', '\\1 this and \\2that'); -REGEXP_REPLACE('1 foo and bar', '(\\d+) foo and (\\d+ )?bar', '\\1 this and \\2that') +SELECT REGEXP_REPLACE('1 foo and bar', '(\\d+) foo and (\\d+ )?bar', '\\1 this and \\2that') as exp; +exp 1 this and that # # MDEV-8102 REGEXP function fails to match hex values when expression is stored as a variable @@ -895,3 +895,12 @@ 4 SELECT a FROM (SELECT "aa" a) t WHERE a REGEXP '[0-9]'; a +# +# MDEV-11777 REGEXP_REPLACE converts utf8mb4 supplementary characters to '?' +# +select hex(regexp_replace(cast(x'F09F9881' as char character set 'utf8mb4'), _utf8mb4'a', _utf8mb4'b')) as Text; +Text +F09F9881 +# +# End of 10.6 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_regexp_pcre.test mariadb-10.11.9/mysql-test/main/func_regexp_pcre.test --- mariadb-10.11.6/mysql-test/main/func_regexp_pcre.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_regexp_pcre.test 2024-08-03 07:29:57.000000000 +0000 @@ -325,13 +325,10 @@ SELECT REGEXP_INSTR('ваÑÑ','а'); SELECT REGEXP_INSTR('ваÑÑ','Ñ'); SELECT REGEXP_INSTR('ваÑÑ','Ñ'); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('в' USING koi8r)); -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('а' USING koi8r)); -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)); -SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)); ---enable_view_protocol +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('в' USING koi8r)) as exp; +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('а' USING koi8r)) as exp; +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)) as exp; +SELECT REGEXP_INSTR(CONVERT('ваÑÑ' USING koi8r), CONVERT('Ñ' USING koi8r)) as exp; --echo # --echo # Checking REGEXP_SUBSTR @@ -351,10 +348,7 @@ SHOW CREATE TABLE t1; DROP TABLE t1; -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT REGEXP_SUBSTR('See https://mariadb.org/en/foundation/ for details', 'https?://[^/]*'); ---enable_view_protocol +SELECT REGEXP_SUBSTR('See https://mariadb.org/en/foundation/ for details', 'https?://[^/]*') as exp; --echo # --echo # MDEV-6027 RLIKE: "." no longer matching new line @@ -371,16 +365,13 @@ SELECT 'a\nb' RLIKE '(?-s)a.b'; SET default_regex_flags=DEFAULT; -#enable after fix MDEV-27871 ---disable_view_protocol # note that old pcre2 reports a different offset --replace_result 29 30 --error ER_REGEXP_ERROR -SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$'); +SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') as exp; SET default_regex_flags='DUPNAMES'; -SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$'); -SELECT REGEXP_SUBSTR('Tuesday Tue','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$'); ---enable_view_protocol +SELECT REGEXP_SUBSTR('Monday Mon','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') as exp; +SELECT REGEXP_SUBSTR('Tuesday Tue','^((?Mon|Fri|Sun)day|(?Tue)sday).*(?P=DN)$') as exp; SET default_regex_flags=DEFAULT; SELECT 'AB' RLIKE 'A B'; @@ -416,10 +407,7 @@ --echo # --echo # MDEV-6965 non-captured group \2 in regexp_replace --echo # -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT REGEXP_REPLACE('1 foo and bar', '(\\d+) foo and (\\d+ )?bar', '\\1 this and \\2that'); ---enable_view_protocol +SELECT REGEXP_REPLACE('1 foo and bar', '(\\d+) foo and (\\d+ )?bar', '\\1 this and \\2that') as exp; --echo # --echo # MDEV-8102 REGEXP function fails to match hex values when expression is stored as a variable @@ -454,9 +442,6 @@ SELECT 1 FROM dual WHERE ('Alpha,Bravo,Charlie,Delta,Echo,Foxtrot,StrataCentral,Golf,Hotel,India,Juliet,Kilo,Lima,Mike,StrataL3,November,Oscar,StrataL2,Sand,P3,P4SwitchTest,Arsys,Poppa,ExtensionMgr,Arp,Quebec,Romeo,StrataApiV2,PtReyes,Sierra,SandAcl,Arrow,Artools,BridgeTest,Tango,SandT,PAlaska,Namespace,Agent,Qos,PatchPanel,ProjectReport,Ark,Gimp,Agent,SliceAgent,Arnet,Bgp,Ale,Tommy,Central,AsicPktTestLib,Hsc,SandL3,Abuild,Pca9555,Standby,ControllerDut,CalSys,SandLib,Sb820,PointV2,BfnLib,Evpn,BfnSdk,Sflow,ManagementActive,AutoTest,GatedTest,Bgp,Sand,xinetd,BfnAgentLib,bf-utils,Hello,BfnState,Eos,Artest,Qos,Scd,ThermoMgr,Uniform,EosUtils,Eb,FanController,Central,BfnL3,BfnL2,tcp_wrappers,Victor,Environment,Route,Failover,Whiskey,Xray,Gimp,BfnFixed,Strata,SoCal,XApi,Msrp,XpProfile,tcpdump,PatchPanel,ArosTest,FhTest,Arbus,XpAcl,MacConc,XpApi,telnet,QosTest,Alpha2,BfnVlan,Stp,VxlanControllerTest,MplsAgent,Bravo2,Lanz,BfnMbb,Intf,XCtrl,Unicast,SandTunnel,L3Unicast,Ipsec,MplsTest,Rsvp,EthIntf,StageMgr,Sol,MplsUtils,Nat,Ira,P4NamespaceDut,Counters,Charlie2,Aqlc,Mlag,Power,OpenFlow,Lag,RestApi,BfdTest,strongs,Sfa,CEosUtils,Adt746,MaintenanceMode,MlagDut,EosImage,IpEth,MultiProtocol,Launcher,Max3179,Snmp,Acl,IpEthTest,PhyEee,bf-syslibs,tacc,XpL2,p4-ar-switch,p4-bf-switch,LdpTest,BfnPhy,Mirroring,Phy6,Ptp' REGEXP '^((?!\b(Strata|StrataApi|StrataApiV2)\b).)*$'); --enable_result_log --enable_warnings -#enable after fix MDEV-27871 ---disable_view_protocol ---enable_view_protocol # # MDEV-12942 REGEXP_INSTR returns 1 when using brackets @@ -470,3 +455,11 @@ # SELECT a FROM (SELECT "aa" a) t WHERE a REGEXP '[0-9]'; --enable_service_connection + +--echo # +--echo # MDEV-11777 REGEXP_REPLACE converts utf8mb4 supplementary characters to '?' +--echo # +select hex(regexp_replace(cast(x'F09F9881' as char character set 'utf8mb4'), _utf8mb4'a', _utf8mb4'b')) as Text; +--echo # +--echo # End of 10.6 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_replace.result mariadb-10.11.9/mysql-test/main/func_replace.result --- mariadb-10.11.6/mysql-test/main/func_replace.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_replace.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,124 @@ +# +# Start of 10.5 tests +# +# +# MDEV-17226 Column Data in Truncated on UNION to the length of the first value if using REPLACE +# +CREATE TABLE t1 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +col1 VARCHAR (2), +col2 VARCHAR (2), +PRIMARY KEY (id) +); +CREATE TABLE t2 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +col1 VARCHAR (1), +col2 VARCHAR (2), +PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ("a", "ba"); +INSERT INTO t2 (col1, col2) VALUES ("a", "ba"); +SELECT 'a' UNION ALL SELECT REPLACE('a', col1, col2) FROM t1; +a +a +ba +SELECT 'a' UNION ALL SELECT REPLACE('a', col1, col2) FROM t2; +a +a +ba +SELECT REPLACE('z', col1, col2) FROM t1 UNION ALL SELECT REPLACE('a', col1, col2) FROM t1; +REPLACE('z', col1, col2) +z +ba +SELECT REPLACE('z', col1, col2) FROM t2 UNION ALL SELECT REPLACE('a', col1, col2) FROM t2; +REPLACE('z', col1, col2) +z +ba +DROP TABLE t1, t2; +CREATE TABLE t1 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +col1 VARCHAR (2), +col2 VARCHAR (2), +PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', 'ba'); +SELECT REPLACE('a', col1, col2) FROM t1; +REPLACE('a', col1, col2) +ba +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('a', col1, col2) FROM t1; +SELECT * FROM t2; +a +a +ba +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` varchar(2) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1, t2; +CREATE TABLE t1 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +col1 VARCHAR (1), +col2 VARCHAR (10), +PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', '0123456789'); +SELECT REPLACE('aa', col1, col2) FROM t1; +REPLACE('aa', col1, col2) +01234567890123456789 +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('aa', col1, col2) FROM t1; +SELECT * FROM t2; +a +a +01234567890123456789 +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` varchar(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1, t2; +CREATE TABLE t1 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +col1 VARCHAR (1), +col2 VARCHAR (20), +PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', 'aaaaaaaaaabbbbbbbbbb'); +SELECT REPLACE('aa', col1, col2) FROM t1; +REPLACE('aa', col1, col2) +aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbb +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('aa', col1, col2) FROM t1; +SELECT * FROM t2; +a +a +aaaaaaaaaabbbbbbbbbbaaaaaaaaaabbbbbbbbbb +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` varchar(40) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1, t2; +CREATE TABLE t1 ( +id INT UNSIGNED NOT NULL AUTO_INCREMENT, +col1 VARCHAR (1), +col2 VARCHAR (30), +PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', 'aaaaaaaaaabbbbbbbbbbcccccccccc'); +SELECT REPLACE('aaa', col1, col2) FROM t1; +REPLACE('aaa', col1, col2) +aaaaaaaaaabbbbbbbbbbccccccccccaaaaaaaaaabbbbbbbbbbccccccccccaaaaaaaaaabbbbbbbbbbcccccccccc +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('aaa', col1, col2) FROM t1; +SELECT * FROM t2; +a +a +aaaaaaaaaabbbbbbbbbbccccccccccaaaaaaaaaabbbbbbbbbbccccccccccaaaaaaaaaabbbbbbbbbbcccccccccc +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` varchar(90) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1, t2; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_replace.test mariadb-10.11.9/mysql-test/main/func_replace.test --- mariadb-10.11.6/mysql-test/main/func_replace.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_replace.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,86 @@ +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-17226 Column Data in Truncated on UNION to the length of the first value if using REPLACE +--echo # + +CREATE TABLE t1 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + col1 VARCHAR (2), + col2 VARCHAR (2), + PRIMARY KEY (id) +); +CREATE TABLE t2 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + col1 VARCHAR (1), + col2 VARCHAR (2), + PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ("a", "ba"); +INSERT INTO t2 (col1, col2) VALUES ("a", "ba"); +SELECT 'a' UNION ALL SELECT REPLACE('a', col1, col2) FROM t1; +SELECT 'a' UNION ALL SELECT REPLACE('a', col1, col2) FROM t2; +SELECT REPLACE('z', col1, col2) FROM t1 UNION ALL SELECT REPLACE('a', col1, col2) FROM t1; +SELECT REPLACE('z', col1, col2) FROM t2 UNION ALL SELECT REPLACE('a', col1, col2) FROM t2; +DROP TABLE t1, t2; + + + +CREATE TABLE t1 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + col1 VARCHAR (2), + col2 VARCHAR (2), + PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', 'ba'); +SELECT REPLACE('a', col1, col2) FROM t1; +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('a', col1, col2) FROM t1; +SELECT * FROM t2; +SHOW CREATE TABLE t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + col1 VARCHAR (1), + col2 VARCHAR (10), + PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', '0123456789'); +SELECT REPLACE('aa', col1, col2) FROM t1; +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('aa', col1, col2) FROM t1; +SELECT * FROM t2; +SHOW CREATE TABLE t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + col1 VARCHAR (1), + col2 VARCHAR (20), + PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', 'aaaaaaaaaabbbbbbbbbb'); +SELECT REPLACE('aa', col1, col2) FROM t1; +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('aa', col1, col2) FROM t1; +SELECT * FROM t2; +SHOW CREATE TABLE t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + col1 VARCHAR (1), + col2 VARCHAR (30), + PRIMARY KEY (id) +); +INSERT INTO t1 (col1, col2) VALUES ('a', 'aaaaaaaaaabbbbbbbbbbcccccccccc'); +SELECT REPLACE('aaa', col1, col2) FROM t1; +CREATE TABLE t2 AS SELECT 'a' UNION ALL SELECT REPLACE('aaa', col1, col2) FROM t1; +SELECT * FROM t2; +SHOW CREATE TABLE t2; +DROP TABLE t1, t2; + + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_sformat.result mariadb-10.11.9/mysql-test/main/func_sformat.result --- mariadb-10.11.6/mysql-test/main/func_sformat.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_sformat.result 2024-08-03 07:29:57.000000000 +0000 @@ -23,10 +23,8 @@ 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, 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); -sformat('{} {}', 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, 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) as x; +x 0 0 select sformat('{{{}}}', 0); sformat('{{{}}}', 0) @@ -78,10 +76,8 @@ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, -106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120); -sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} - {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} - {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} +106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120) as x; +x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 @@ -97,10 +93,8 @@ '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', -'115', '116', '117', '118', '119', '120'); -sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} - {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} - {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} +'115', '116', '117', '118', '119', '120') as x; +x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 @@ -159,8 +153,8 @@ (0.0005, 5, 'B', DATE('2020-6-29')), (5.5555, -5, 'C', DATE('200629')), (-9, -9, 'D', DATE('20*06*29')); -select sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4) from t2; -sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4) +select sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4) x from t2; +x p1 0.0025 p2 25 p3 A p4 2020-06-29 p1 0.0005 p2 5 p3 B p4 2020-06-29 p1 5.5555 p2 -5 p3 C p4 2020-06-29 @@ -279,14 +273,14 @@ select sformat('{:-f}; {:-f}', 3.14, -3.14); sformat('{:-f}; {:-f}', 3.14, -3.14) 3.140000; -3.140000 -select sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7); -sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7) +select sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7) x; +x The temperature is between -3 and 7 degrees celsius. -select sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7); -sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7) +select sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7) x; +x The temperature is between -3 and 7 degrees celsius. -select sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7); -sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7) +select sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7) x; +x The temperature is between -3 and +7 degrees celsius. select sformat('We have {:<8} chickens.', 49); sformat('We have {:<8} chickens.', 49) @@ -427,8 +421,8 @@ select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442'); sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442') =теÑÑ‚= -select hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442')); -hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442')) +select hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442')) x; +x 003D0442043504410442003D create table t1 as select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442') as x; show create table t1; diff -Nru mariadb-10.11.6/mysql-test/main/func_sformat.test mariadb-10.11.9/mysql-test/main/func_sformat.test --- mariadb-10.11.6/mysql-test/main/func_sformat.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_sformat.test 2024-08-03 07:29:57.000000000 +0000 @@ -14,14 +14,11 @@ select sformat('C'); select sformat(-4.2); select sformat(5, 5, 5); -#enable after fix MDEV-27871 ---disable_view_protocol select sformat('{} {}', 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, 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, 0, 0, 0, 0, 0, 0); ---enable_view_protocol + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) as x; select sformat('{{{}}}', 0); select sformat('{{{}{{', 0); select sformat('{{{{{}{{', 'param1'); @@ -29,18 +26,13 @@ select sformat(' {{ {} {}', 'param1', 'param2'); select sformat('A{}C{}E{}', 'B', 'D', 'F'); select sformat('{} {}', FALSE, TRUE); -#enable after fix MDEV-29601 ---disable_service_connection select sformat('Add € != {} != {}?', '$', '£'); select sformat('Check {} != {} != {}?', '€', '$', '£'); ---enable_service_connection select sformat('{}{}{}', 1, 2, 3); select sformat('Float {} Boolean {} Number {}', 3.14159, True, -50); select sformat('SUM {} + {} = {}', 2, 3, 2+3); select sformat('Numbers {} {} {}', 1, 1.11, 1.111); select sformat('what {} is {}?', 'time', 'it'); -#enable after fix MDEV-27871 ---disable_view_protocol select sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} @@ -49,7 +41,7 @@ 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120); + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120) as x; select sformat('{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} @@ -61,8 +53,7 @@ '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', - '115', '116', '117', '118', '119', '120'); ---enable_view_protocol + '115', '116', '117', '118', '119', '120') as x; echo #; echo # Error Test Cases; @@ -92,10 +83,7 @@ (0.0005, 5, 'B', DATE('2020-6-29')), (5.5555, -5, 'C', DATE('200629')), (-9, -9, 'D', DATE('20*06*29')); -#enable after fix MDEV-27871 ---disable_view_protocol -select sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4) from t2; ---enable_view_protocol +select sformat('p1 {:.4f} p2 {} p3 {} p4 {}', param1, param2, param3, param4) x from t2; drop table t2; set names utf8; @@ -127,10 +115,7 @@ echo # Format Test Cases; echo #; select sformat('Num {:L}', 13800000000); -#enable after fix MDEV-29646 ---disable_view_protocol select sformat('Num [{:20}]', 42); ---enable_view_protocol select sformat('Number: {:*^{}}', 4, 5); select sformat('{:02} - {:02} - {:02}', 1, 2, 3); select sformat('Character {:c}', 104); @@ -141,10 +126,7 @@ select sformat('Float {:f}', 42.0); select sformat('Number {:d}', 42); select sformat('Number {:{}}', 5, 5); -#enable after fix MDEV-29646 ---disable_view_protocol select sformat('Number [{:10}]', 9999); ---enable_view_protocol select sformat('Number {:.3}', 3.1416); select sformat('int: {0:d}; hex: {0:x}; oct: {0:o}', 42); select sformat('int: {0:d}; hex: {0:#x}; oct: {0:#o}', 42); @@ -155,16 +137,10 @@ select sformat('{:+f}; {:+f}', 3.14, -3.14); select sformat('{: f}; {: f}', 3.14, -3.14); select sformat('{:-f}; {:-f}', 3.14, -3.14); -#enable after fix MDEV-27871 ---disable_view_protocol -select sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7); -select sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7); -select sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7); ---enable_view_protocol -#check after fix MDEV-29646 ---disable_view_protocol +select sformat('The temperature is between {: } and {: } degrees celsius.', -3, 7) x; +select sformat('The temperature is between {:-} and {:-} degrees celsius.', -3, 7) x; +select sformat('The temperature is between {:+} and {:+} degrees celsius.', -3, 7) x; select sformat('We have {:<8} chickens.', 49); ---enable_view_protocol select sformat('Center alimgn [{:*^10}]', 'data'); select sformat('Center aling [{:^10}].', 'data'); select sformat('Right aling [{:>10}].', 'data'); @@ -175,20 +151,31 @@ echo #; echo # Failed Format Test Cases; echo #; +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('Test {:c}', 'word'); select sformat('Test {one} {two} {three}', 1, 2, 3); select sformat('Number {:{<}', 8); select sformat('Number {:10000000000}', 5); select sformat('1={1} 2={2} 0={0}', 0, 1); +--replace_regex /invalid format specifier/precision not allowed for this argument type/ select sformat('Number {:.2d}', 42); +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('You scored {:.0%}', 0.25); +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('You scored {:%}', 0.25); +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('The price is {:f} dollars.', 45); +--replace_regex /invalid format specifier/precision not allowed for this argument type/ select sformat('The price is {:.2f} dollars.', 45); +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('We have {:E} chickens.', 5); +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('We have {:e} chickens.', 5); +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('The universe is {:,} years old.', 13800000000); +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('The universe is {:_} years old.', 13800000000); +--replace_regex /invalid format specifier/format specifier requires numeric argument/ select sformat('String {:-}', 'hello'); echo #; @@ -211,6 +198,7 @@ echo #; echo # Unsupported/disabled features; echo #; +--replace_regex /invalid format specifier/invalid type specifier/ select sformat('{:p}', '50'); echo #; @@ -219,10 +207,7 @@ select sformat('={}=', _ucs2 x'006100620063'); set names utf8; select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442'); -#enable after fix MDEV-27871 ---disable_view_protocol -select hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442')); ---enable_view_protocol +select hex(sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442')) x; create table t1 as select sformat(_ucs2 x'003D007B007D003D', _ucs2 x'0442043504410442') as x; show create table t1; drop table t1; @@ -233,6 +218,7 @@ echo #; prepare s from 'select sformat("={:d}=", ?)'; execute s using 100; +--replace_regex /invalid format specifier/invalid type specifier/ execute s using 'abc'; echo #; diff -Nru mariadb-10.11.6/mysql-test/main/func_str.result mariadb-10.11.9/mysql-test/main/func_str.result --- mariadb-10.11.6/mysql-test/main/func_str.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_str.result 2024-08-03 07:29:57.000000000 +0000 @@ -7,7 +7,7 @@ hello 'hello' ""hello"" 'h'e'l'l'o' hel"lo hel'lo hello 'hello' ""hello"" 'h'e'l'l'o' hel"lo hel'lo select 'hello' 'monty'; -hello +hellomonty hellomonty select length('\n\t\r\b\0\_\%\\'); length('\n\t\r\b\0\_\%\\') @@ -39,11 +39,11 @@ select left('hello',null), right('hello',null); left('hello',null) right('hello',null) NULL NULL -select left('hello',2),right('hello',2),substring('hello',2,2),mid('hello',1,5) ; +select left('hello',2),right('hello',2),substring('hello',2,2),mid('hello',1,5); left('hello',2) right('hello',2) substring('hello',2,2) mid('hello',1,5) he lo el hello -select concat('',left(right(concat('what ',concat('is ','happening')),9),4),'',substring('monty',5,1)) ; -concat('',left(right(concat('what ',concat('is ','happening')),9),4),'',substring('monty',5,1)) +select concat('',left(right(concat('what ',concat('is ','happening')),9),4),'',substring('monty',5,1)) as exp; +exp happy select substring_index('www.tcx.se','.',-2),substring_index('www.tcx.se','.',1); substring_index('www.tcx.se','.',-2) substring_index('www.tcx.se','.',1) @@ -171,23 +171,23 @@ select substring_index('the king of the the hill','the',3); substring_index('the king of the the hill','the',3) the king of the -select concat(':',ltrim(' left '),':',rtrim(' right '),':'); -concat(':',ltrim(' left '),':',rtrim(' right '),':') +select concat(':',ltrim(' left '),':',rtrim(' right '),':') as exp; +exp :left : right: -select concat(':',trim(leading from ' left '),':',trim(trailing from ' right '),':'); -concat(':',trim(leading from ' left '),':',trim(trailing from ' right '),':') +select concat(':',trim(leading from ' left '),':',trim(trailing from ' right '),':') as exp; +exp :left : right: -select concat(':',trim(LEADING FROM ' left'),':',trim(TRAILING FROM ' right '),':'); -concat(':',trim(LEADING FROM ' left'),':',trim(TRAILING FROM ' right '),':') +select concat(':',trim(LEADING FROM ' left'),':',trim(TRAILING FROM ' right '),':') as exp; +exp :left: right: -select concat(':',trim(' m '),':',trim(BOTH FROM ' y '),':',trim('*' FROM '*s*'),':'); -concat(':',trim(' m '),':',trim(BOTH FROM ' y '),':',trim('*' FROM '*s*'),':') +select concat(':',trim(' m '),':',trim(BOTH FROM ' y '),':',trim('*' FROM '*s*'),':') as exp; +exp :m:y:s: -select concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***sql'),':'); -concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***sql'),':') +select concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***sql'),':') as exp; +exp :my:sql: -select concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':'); -concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':') +select concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':') as exp; +exp :my:sql: select TRIM("foo" FROM "foo"), TRIM("foo" FROM "foook"), TRIM("foo" FROM "okfoo"); TRIM("foo" FROM "foo") TRIM("foo" FROM "foook") TRIM("foo" FROM "okfoo") @@ -201,8 +201,8 @@ select concat_ws(',','',NULL,'a'); concat_ws(',','',NULL,'a') ,a -SELECT CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"'); -CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"') +SELECT CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"') as exp; +exp "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc";"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es'); insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es') @@ -215,8 +215,8 @@ def replace('aaaa','a','bbbb') 253 16 16 Y 0 39 8 replace('aaaa','a','bbbb') bbbbbbbbbbbbbbbb -select replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') ; -replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') +select replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') as exp; +exp this is a REAL test select soundex(''),soundex('he'),soundex('hello all folks'),soundex('#3556 in bugdb'); soundex('') soundex('he') soundex('hello all folks') soundex('#3556 in bugdb') @@ -311,11 +311,11 @@ select least(1,2,3) | greatest(16,32,8), least(5,4)*1,greatest(-1.0,1.0)*1,least(3,2,1)*1.0,greatest(1,1.1,1.0),least("10",9),greatest("A","B","0"); least(1,2,3) | greatest(16,32,8) least(5,4)*1 greatest(-1.0,1.0)*1 least(3,2,1)*1.0 greatest(1,1.1,1.0) least("10",9) greatest("A","B","0") 33 4 1.0 1.0 1.1 9 B -select decode(encode(repeat("a",100000),"monty"),"monty")=repeat("a",100000); -decode(encode(repeat("a",100000),"monty"),"monty")=repeat("a",100000) +select decode(encode(repeat("a",100000),"monty"),"monty")=repeat("a",100000) as exp; +exp 1 -select decode(encode("abcdef","monty"),"monty")="abcdef"; -decode(encode("abcdef","monty"),"monty")="abcdef" +select decode(encode("abcdef","monty"),"monty")="abcdef" as exp; +exp 1 select quote('\'\"\\test'); quote('\'\"\\test') @@ -331,11 +331,11 @@ select length(quote(concat(char(0),"test"))); length(quote(concat(char(0),"test"))) 8 -select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235)))); -hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235)))) +select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235)))) as exp; +exp 27E0E3E6E7E8EAEB27 -select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678"), unhex(NULL); -unhex(hex("foobar")) hex(unhex("1234567890ABCDEF")) unhex("345678") unhex(NULL) +select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678"), unhex(NULL) as exp; +unhex(hex("foobar")) hex(unhex("1234567890ABCDEF")) unhex("345678") exp foobar 1234567890ABCDEF 4Vx NULL select hex(unhex("1")), hex(unhex("12")), hex(unhex("123")), hex(unhex("1234")), hex(unhex("12345")), hex(unhex("123456")); hex(unhex("1")) hex(unhex("12")) hex(unhex("123")) hex(unhex("1234")) hex(unhex("12345")) hex(unhex("123456")) @@ -408,17 +408,17 @@ submitter int(10) unsigned default NULL ) ENGINE=MyISAM; INSERT INTO t1 VALUES (1,'Link',1,1,1,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','2001-02-28 08:40:16',20010228084016,0,4); -SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"') FROM t1; -CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"') +SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"') as exp FROM t1; +exp "Link";"1";"1";"1";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"2001-02-28 08:40:16";"20010228084016";"0";"4" -SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') FROM t1; -CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') +SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') as exp FROM t1; +exp "Link";"1";"1";"1";"0";"4" -SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter) FROM t1; -CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter) +SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter) as exp FROM t1; +exp Link";"1";"1";"1";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";"2001-02-28 08:40:16";"20010228084016";"0";"4 -SELECT bugdesc, REPLACE(bugdesc, 'xxxxxxxxxxxxxxxxxxxx', 'bbbbbbbbbbbbbbbbbbbb') from t1 group by bugdesc; -bugdesc REPLACE(bugdesc, 'xxxxxxxxxxxxxxxxxxxx', 'bbbbbbbbbbbbbbbbbbbb') +SELECT bugdesc, REPLACE(bugdesc, 'xxxxxxxxxxxxxxxxxxxx', 'bbbbbbbbbbbbbbbbbbbb') as exp from t1 group by bugdesc; +bugdesc exp aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa drop table t1; CREATE TABLE t1 (id int(11) NOT NULL auto_increment, tmp text NOT NULL, KEY id (id)) ENGINE=MyISAM; @@ -747,7 +747,7 @@ `bin(130)` varchar(64) DEFAULT NULL, `oct(130)` varchar(64) DEFAULT NULL, `conv(130,16,10)` varchar(64) DEFAULT NULL, - `hex(130)` varchar(6) DEFAULT NULL, + `hex(130)` varchar(16) DEFAULT NULL, `char(130)` varbinary(4) DEFAULT NULL, `format(130,10)` varchar(25) DEFAULT NULL, `left(_latin2'a',1)` varchar(1) CHARACTER SET latin2 COLLATE latin2_general_ci DEFAULT NULL, @@ -2016,35 +2016,35 @@ select insert('hello', 4294967297, 4294967297, 'hi'); insert('hello', 4294967297, 4294967297, 'hi') hello -select insert('hello', -18446744073709551615, -18446744073709551615, 'hi'); -insert('hello', -18446744073709551615, -18446744073709551615, 'hi') +select insert('hello', -18446744073709551615, -18446744073709551615, 'hi') as exp; +exp hello Warnings: Warning 1916 Got overflow when converting '-18446744073709551615' to INT. Value truncated Warning 1916 Got overflow when converting '-18446744073709551615' to INT. Value truncated -select insert('hello', 18446744073709551615, 18446744073709551615, 'hi'); -insert('hello', 18446744073709551615, 18446744073709551615, 'hi') +select insert('hello', 18446744073709551615, 18446744073709551615, 'hi') as exp; +exp hello -select insert('hello', -18446744073709551616, -18446744073709551616, 'hi'); -insert('hello', -18446744073709551616, -18446744073709551616, 'hi') +select insert('hello', -18446744073709551616, -18446744073709551616, 'hi') as exp; +exp hello Warnings: Warning 1916 Got overflow when converting '-18446744073709551616' to INT. Value truncated Warning 1916 Got overflow when converting '-18446744073709551616' to INT. Value truncated -select insert('hello', 18446744073709551616, 18446744073709551616, 'hi'); -insert('hello', 18446744073709551616, 18446744073709551616, 'hi') +select insert('hello', 18446744073709551616, 18446744073709551616, 'hi') as exp; +exp hello Warnings: Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated -select insert('hello', -18446744073709551617, -18446744073709551617, 'hi'); -insert('hello', -18446744073709551617, -18446744073709551617, 'hi') +select insert('hello', -18446744073709551617, -18446744073709551617, 'hi') as exp; +exp hello Warnings: Warning 1916 Got overflow when converting '-18446744073709551617' to INT. Value truncated Warning 1916 Got overflow when converting '-18446744073709551617' to INT. Value truncated -select insert('hello', 18446744073709551617, 18446744073709551617, 'hi'); -insert('hello', 18446744073709551617, 18446744073709551617, 'hi') +select insert('hello', 18446744073709551617, 18446744073709551617, 'hi') as exp; +exp hello Warnings: Warning 1916 Got overflow when converting '18446744073709551617' to INT. Value truncated @@ -2766,25 +2766,25 @@ CREATE TABLE t2 (a VARCHAR(20), b INT); INSERT INTO t1 VALUES ('ABC', 1); INSERT INTO t2 VALUES ('ABC', 1); -SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) +SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) as exp FROM t1,t2 WHERE t1.b = t1.b > 0 GROUP BY t2.b; -DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) +exp secret -SELECT DECODE((SELECT ENCODE('secret', 'ABC') FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) +SELECT DECODE((SELECT ENCODE('secret', 'ABC') FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) as exp FROM t1,t2 WHERE t1.b = t1.b > 0 GROUP BY t2.b; -DECODE((SELECT ENCODE('secret', 'ABC') FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) +exp secret -SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), 'ABC') +SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), 'ABC') as exp FROM t1,t2 WHERE t1.b = t1.b > 0 GROUP BY t2.b; -DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), 'ABC') +exp secret TRUNCATE TABLE t1; TRUNCATE TABLE t2; INSERT INTO t1 VALUES ('EDF', 3), ('BCD', 2), ('ABC', 1); INSERT INTO t2 VALUES ('EDF', 3), ('BCD', 2), ('ABC', 1); -SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b LIMIT 1), t2.a) +SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b LIMIT 1), t2.a) as exp FROM t2 WHERE t2.b = 1 GROUP BY t2.b; -DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b LIMIT 1), t2.a) +exp secret DROP TABLE t1, t2; # @@ -3066,10 +3066,8 @@ 1 SELECT ((+0) IN ((0b111111111111111111111111111111111111111111111111111),(rpad(1.0,2048,1)), -(32767.1))); -((+0) IN -((0b111111111111111111111111111111111111111111111111111),(rpad(1.0,2048,1)), -(32767.1))) +(32767.1))) as exp; +exp 0 SELECT ((rpad(1.0,2048,1)) = ('4(') ^ (0.1)); ((rpad(1.0,2048,1)) = ('4(') ^ (0.1)) @@ -5023,8 +5021,8 @@ # # MDEV-24742 Server crashes in Charset::numchars / String::numchars # -SELECT NULL IN (RIGHT(AES_ENCRYPT('foo','bar'), LAST_INSERT_ID()), 'qux'); -NULL IN (RIGHT(AES_ENCRYPT('foo','bar'), LAST_INSERT_ID()), 'qux') +SELECT NULL IN (RIGHT(AES_ENCRYPT('foo','bar'), LAST_INSERT_ID()), 'qux') as exp; +exp NULL # # Bug#31374305 - FORMAT() NOT DISPLAYING WHOLE NUMBER SIDE CORRECTLY @@ -5286,6 +5284,41 @@ # End of 10.4 tests # # +# Start of 10.5 tests +# +# +# MDEV-28651 quote(NULL) returns incorrect result in view ('NU' instead of 'NULL') +# +CREATE VIEW v1 AS SELECT quote(NULL); +SELECT * FROM v1; +quote(NULL) +NULL +DESCRIBE v1; +Field Type Null Key Default Extra +quote(NULL) varbinary(4) YES NULL +CREATE TABLE t1 AS SELECT * FROM v1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `quote(NULL)` varbinary(4) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT * FROM t1; +quote(NULL) +NULL +DROP TABLE t1; +DROP VIEW v1; +# +# MDEV-28387 UBSAN: runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_strtoll10 on SELECT +# +SET @a='-9223372036854775808'; +CREATE TABLE t (c1 INT,c2 CHAR); +SELECT SUBSTR(0,@a) FROM t; +SUBSTR(0,@a) +DROP TABLE t; +# +# End of 10.5 tests +# +# # MDEV-25704 Function random_bytes # create table t1 as select random_bytes(100); @@ -5460,3 +5493,37 @@ # # End of 10.10 tests # +# +# Start of 10.11 tests +# +# +# MDEV-33392 Server crashes when using RANDOM_BYTES function and GROUP BY clause on a column with a negative value +# +SET sql_mode=''; +CREATE TABLE t1 (a VARCHAR(255)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (9494),(9495),(9496),(9497),(9498),(9499),(9500),(9501),(9502),(9503); +SELECT RANDOM_BYTES (-1) f1,a f2 FROM t1 GROUP BY f1,f2; +f1 f2 +NULL 9494 +NULL 9495 +NULL 9496 +NULL 9497 +NULL 9498 +NULL 9499 +NULL 9500 +NULL 9501 +NULL 9502 +NULL 9503 +CREATE TABLE t2 AS SELECT RANDOM_BYTES (-1) f1,a f2 FROM t1 GROUP BY f1,f2; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` binary(0) DEFAULT NULL, + `f2` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2; +DROP TABLE t1; +SET sql_mode=DEFAULT; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_str.test mariadb-10.11.9/mysql-test/main/func_str.test --- mariadb-10.11.6/mysql-test/main/func_str.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_str.test 2024-08-03 07:29:57.000000000 +0000 @@ -28,14 +28,11 @@ # strange undocumented behaviour, strict mode # select left('hello',null), right('hello',null); -select left('hello',2),right('hello',2),substring('hello',2,2),mid('hello',1,5) ; -#enable after fix MDEV-27871 ---disable_view_protocol -select concat('',left(right(concat('what ',concat('is ','happening')),9),4),'',substring('monty',5,1)) ; +select left('hello',2),right('hello',2),substring('hello',2,2),mid('hello',1,5); +select concat('',left(right(concat('what ',concat('is ','happening')),9),4),'',substring('monty',5,1)) as exp; select substring_index('www.tcx.se','.',-2),substring_index('www.tcx.se','.',1); select substring_index('www.tcx.se','tcx',1),substring_index('www.tcx.se','tcx',-1); select substring_index('.tcx.se','.',-2),substring_index('.tcx.se','.tcx',-1); ---enable_view_protocol select substring_index('aaaaaaaaa1','a',1); select substring_index('aaaaaaaaa1','aa',1); select substring_index('aaaaaaaaa1','aa',2); @@ -79,32 +76,28 @@ select substring_index('the king of the the hill','the',2); select substring_index('the king of the the hill','the',3); -select concat(':',ltrim(' left '),':',rtrim(' right '),':'); -#enable after fix MDEV-27871 ---disable_view_protocol -select concat(':',trim(leading from ' left '),':',trim(trailing from ' right '),':'); -select concat(':',trim(LEADING FROM ' left'),':',trim(TRAILING FROM ' right '),':'); -select concat(':',trim(' m '),':',trim(BOTH FROM ' y '),':',trim('*' FROM '*s*'),':'); -select concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***sql'),':'); -select concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':'); +select concat(':',ltrim(' left '),':',rtrim(' right '),':') as exp; +select concat(':',trim(leading from ' left '),':',trim(trailing from ' right '),':') as exp; +select concat(':',trim(LEADING FROM ' left'),':',trim(TRAILING FROM ' right '),':') as exp; +select concat(':',trim(' m '),':',trim(BOTH FROM ' y '),':',trim('*' FROM '*s*'),':') as exp; +select concat(':',trim(BOTH 'ab' FROM 'ababmyabab'),':',trim(BOTH '*' FROM '***sql'),':') as exp; +select concat(':',trim(LEADING '.*' FROM '.*my'),':',trim(TRAILING '.*' FROM 'sql.*.*'),':') as exp; select TRIM("foo" FROM "foo"), TRIM("foo" FROM "foook"), TRIM("foo" FROM "okfoo"); ---enable_view_protocol select concat_ws(', ','monty','was here','again'); select concat_ws(NULL,'a'),concat_ws(',',NULL,''); select concat_ws(',','',NULL,'a'); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"'); +SELECT CONCAT('"',CONCAT_WS('";"',repeat('a',60),repeat('b',60),repeat('c',60),repeat('d',100)), '"') as exp; select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es'); select replace('aaaa','a','b'),replace('aaaa','aa','b'),replace('aaaa','a','bb'),replace('aaaa','','b'),replace('bbbb','a','c'); +--disable_view_protocol --enable_metadata select replace('aaaa','a','bbbb'); --disable_metadata -select replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') ; -select soundex(''),soundex('he'),soundex('hello all folks'),soundex('#3556 in bugdb'); --enable_view_protocol +select replace(concat(lcase(concat('THIS',' ','IS',' ','A',' ')),ucase('false'),' ','test'),'FALSE','REAL') as exp; +select soundex(''),soundex('he'),soundex('hello all folks'),soundex('#3556 in bugdb'); select 'mood' sounds like 'mud'; select 'Glazgo' sounds like 'Liverpool'; select null sounds like 'null'; @@ -137,32 +130,22 @@ select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'); select least(1,2,3) | greatest(16,32,8), least(5,4)*1,greatest(-1.0,1.0)*1,least(3,2,1)*1.0,greatest(1,1.1,1.0),least("10",9),greatest("A","B","0"); -#enable after fix MDEV-27871 ---disable_view_protocol -select decode(encode(repeat("a",100000),"monty"),"monty")=repeat("a",100000); ---enable_view_protocol -select decode(encode("abcdef","monty"),"monty")="abcdef"; +select decode(encode(repeat("a",100000),"monty"),"monty")=repeat("a",100000) as exp; +select decode(encode("abcdef","monty"),"monty")="abcdef" as exp; select quote('\'\"\\test'); select quote(concat('abc\'', '\\cba')); select quote(1/0), quote('\0\Z'); select length(quote(concat(char(0),"test"))); -#enable after fix MDEV-27871 ---disable_view_protocol -select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235)))); -select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678"), unhex(NULL); ---enable_view_protocol +select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235)))) as exp; +select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678"), unhex(NULL) as exp; select hex(unhex("1")), hex(unhex("12")), hex(unhex("123")), hex(unhex("1234")), hex(unhex("12345")), hex(unhex("123456")); select length(unhex(md5("abrakadabra"))); # # Bug #6564: QUOTE(NULL # - -#enable after fix MDEV-28651 ---disable_view_protocol select concat('a', quote(NULL)); ---enable_view_protocol # # Wrong usage of functions @@ -211,14 +194,11 @@ submitter int(10) unsigned default NULL ) ENGINE=MyISAM; -#enable after fix MDEV-27871 ---disable_view_protocol INSERT INTO t1 VALUES (1,'Link',1,1,1,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa','2001-02-28 08:40:16',20010228084016,0,4); -SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"') FROM t1; -SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') FROM t1; -SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter) FROM t1; -SELECT bugdesc, REPLACE(bugdesc, 'xxxxxxxxxxxxxxxxxxxx', 'bbbbbbbbbbbbbbbbbbbb') from t1 group by bugdesc; ---enable_view_protocol +SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter), '"') as exp FROM t1; +SELECT CONCAT('"',CONCAT_WS('";"',title,prio,category,program,bugstatus,submitter), '"') as exp FROM t1; +SELECT CONCAT_WS('";"',title,prio,category,program,bugdesc,created,modified+0,bugstatus,submitter) as exp FROM t1; +SELECT bugdesc, REPLACE(bugdesc, 'xxxxxxxxxxxxxxxxxxxx', 'bbbbbbbbbbbbbbbbbbbb') as exp from t1 group by bugdesc; drop table t1; # @@ -1138,15 +1118,12 @@ select insert('hello', 4294967296, 4294967296, 'hi'); select insert('hello', -4294967297, -4294967297, 'hi'); select insert('hello', 4294967297, 4294967297, 'hi'); -#enable after fix MDEV-27871 ---disable_view_protocol -select insert('hello', -18446744073709551615, -18446744073709551615, 'hi'); -select insert('hello', 18446744073709551615, 18446744073709551615, 'hi'); -select insert('hello', -18446744073709551616, -18446744073709551616, 'hi'); -select insert('hello', 18446744073709551616, 18446744073709551616, 'hi'); -select insert('hello', -18446744073709551617, -18446744073709551617, 'hi'); -select insert('hello', 18446744073709551617, 18446744073709551617, 'hi'); ---enable_view_protocol +select insert('hello', -18446744073709551615, -18446744073709551615, 'hi') as exp; +select insert('hello', 18446744073709551615, 18446744073709551615, 'hi') as exp; +select insert('hello', -18446744073709551616, -18446744073709551616, 'hi') as exp; +select insert('hello', 18446744073709551616, 18446744073709551616, 'hi') as exp; +select insert('hello', -18446744073709551617, -18446744073709551617, 'hi') as exp; +select insert('hello', 18446744073709551617, 18446744073709551617, 'hi') as exp; select repeat('hello', -1); select repeat('hello', -4294967295); @@ -1491,17 +1468,14 @@ INSERT INTO t1 VALUES ('ABC', 1); INSERT INTO t2 VALUES ('ABC', 1); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) +SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) as exp FROM t1,t2 WHERE t1.b = t1.b > 0 GROUP BY t2.b; -SELECT DECODE((SELECT ENCODE('secret', 'ABC') FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) +SELECT DECODE((SELECT ENCODE('secret', 'ABC') FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), t2.a) as exp FROM t1,t2 WHERE t1.b = t1.b > 0 GROUP BY t2.b; -SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), 'ABC') +SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b), 'ABC') as exp FROM t1,t2 WHERE t1.b = t1.b > 0 GROUP BY t2.b; ---enable_view_protocol TRUNCATE TABLE t1; TRUNCATE TABLE t2; @@ -1509,11 +1483,8 @@ INSERT INTO t1 VALUES ('EDF', 3), ('BCD', 2), ('ABC', 1); INSERT INTO t2 VALUES ('EDF', 3), ('BCD', 2), ('ABC', 1); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b LIMIT 1), t2.a) +SELECT DECODE((SELECT ENCODE('secret', t1.a) FROM t1,t2 WHERE t1.a = t2.a GROUP BY t1.b LIMIT 1), t2.a) as exp FROM t2 WHERE t2.b = 1 GROUP BY t2.b; ---enable_view_protocol DROP TABLE t1, t2; @@ -1548,6 +1519,7 @@ SELECT insert( substring_index( 'a', 'a', 'b' ), 1, 0, 'x' ); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/bug58165.txt' INTO TABLE t1; +--remove_file $MYSQLTEST_VARDIR/tmp/bug58165.txt SELECT * FROM t1; DROP TABLE t1; @@ -1678,14 +1650,11 @@ --echo # Bug#12985030 SIMPLE QUERY WITH DECIMAL NUMBERS LEAKS MEMORY --echo # -#enable after fix MDEV-27871 ---disable_view_protocol SELECT (rpad(1.0,2048,1)) IS NOT FALSE; SELECT ((+0) IN ((0b111111111111111111111111111111111111111111111111111),(rpad(1.0,2048,1)), -(32767.1))); +(32767.1))) as exp; SELECT ((rpad(1.0,2048,1)) = ('4(') ^ (0.1)); ---enable_view_protocol --error 1690 SELECT @@ -2113,10 +2082,7 @@ --echo # MDEV-24742 Server crashes in Charset::numchars / String::numchars --echo # -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT NULL IN (RIGHT(AES_ENCRYPT('foo','bar'), LAST_INSERT_ID()), 'qux'); ---enable_view_protocol +SELECT NULL IN (RIGHT(AES_ENCRYPT('foo','bar'), LAST_INSERT_ID()), 'qux') as exp; --echo # --echo # Bug#31374305 - FORMAT() NOT DISPLAYING WHOLE NUMBER SIDE CORRECTLY @@ -2334,6 +2300,37 @@ --echo # --echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-28651 quote(NULL) returns incorrect result in view ('NU' instead of 'NULL') +--echo # + +CREATE VIEW v1 AS SELECT quote(NULL); +SELECT * FROM v1; +DESCRIBE v1; +CREATE TABLE t1 AS SELECT * FROM v1; +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; +DROP VIEW v1; + + +--echo # +--echo # MDEV-28387 UBSAN: runtime error: negation of -9223372036854775808 cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in my_strtoll10 on SELECT +--echo # + +SET @a='-9223372036854775808'; # Quite specific value; considerably varying it will not work +CREATE TABLE t (c1 INT,c2 CHAR); +SELECT SUBSTR(0,@a) FROM t; +DROP TABLE t; + +--echo # +--echo # End of 10.5 tests +--echo # + +--echo # --echo # MDEV-25704 Function random_bytes --echo # @@ -2435,3 +2432,25 @@ --echo # --echo # End of 10.10 tests --echo # + +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-33392 Server crashes when using RANDOM_BYTES function and GROUP BY clause on a column with a negative value +--echo # + +SET sql_mode=''; +CREATE TABLE t1 (a VARCHAR(255)) ENGINE=MyISAM; +INSERT INTO t1 VALUES (9494),(9495),(9496),(9497),(9498),(9499),(9500),(9501),(9502),(9503); +SELECT RANDOM_BYTES (-1) f1,a f2 FROM t1 GROUP BY f1,f2; +CREATE TABLE t2 AS SELECT RANDOM_BYTES (-1) f1,a f2 FROM t1 GROUP BY f1,f2; +SHOW CREATE TABLE t2; +DROP TABLE t2; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_time.result mariadb-10.11.9/mysql-test/main/func_time.result --- mariadb-10.11.6/mysql-test/main/func_time.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_time.result 2024-08-03 07:29:57.000000000 +0000 @@ -3142,7 +3142,7 @@ def test t1 t1 a a 12 26 26 Y 128 6 63 def EXTRACT(YEAR FROM a) 3 4 4 Y 32896 0 63 def EXTRACT(YEAR_MONTH FROM a) 3 6 6 Y 32896 0 63 -def EXTRACT(QUARTER FROM a) 3 2 1 Y 32896 0 63 +def EXTRACT(QUARTER FROM a) 3 1 1 Y 32896 0 63 def EXTRACT(MONTH FROM a) 3 2 2 Y 32896 0 63 def EXTRACT(WEEK FROM a) 3 2 2 Y 32896 0 63 def EXTRACT(DAY FROM a) 3 3 2 Y 32896 0 63 @@ -3230,11 +3230,11 @@ Table Create Table t2 CREATE TABLE `t2` ( `a` datetime(6) DEFAULT NULL, - `EXTRACT(YEAR FROM a)` int(4) DEFAULT NULL, - `EXTRACT(YEAR_MONTH FROM a)` int(6) DEFAULT NULL, + `EXTRACT(YEAR FROM a)` int(5) DEFAULT NULL, + `EXTRACT(YEAR_MONTH FROM a)` int(7) DEFAULT NULL, `EXTRACT(QUARTER FROM a)` int(2) DEFAULT NULL, - `EXTRACT(MONTH FROM a)` int(2) DEFAULT NULL, - `EXTRACT(WEEK FROM a)` int(2) DEFAULT NULL, + `EXTRACT(MONTH FROM a)` int(3) DEFAULT NULL, + `EXTRACT(WEEK FROM a)` int(3) DEFAULT NULL, `EXTRACT(DAY FROM a)` int(3) DEFAULT NULL, `EXTRACT(DAY_HOUR FROM a)` int(5) DEFAULT NULL, `EXTRACT(DAY_MINUTE FROM a)` int(7) DEFAULT NULL, @@ -3281,7 +3281,7 @@ def test t1 t1 a a 11 17 17 Y 128 6 63 def EXTRACT(YEAR FROM a) 3 4 1 Y 32896 0 63 def EXTRACT(YEAR_MONTH FROM a) 3 6 1 Y 32896 0 63 -def EXTRACT(QUARTER FROM a) 3 2 1 Y 32896 0 63 +def EXTRACT(QUARTER FROM a) 3 1 1 Y 32896 0 63 def EXTRACT(MONTH FROM a) 3 2 1 Y 32896 0 63 def EXTRACT(WEEK FROM a) 3 2 9 Y 32896 0 63 def EXTRACT(DAY FROM a) 3 3 3 Y 32896 0 63 @@ -3411,11 +3411,11 @@ Table Create Table t2 CREATE TABLE `t2` ( `a` time(6) DEFAULT NULL, - `EXTRACT(YEAR FROM a)` int(4) DEFAULT NULL, - `EXTRACT(YEAR_MONTH FROM a)` int(6) DEFAULT NULL, + `EXTRACT(YEAR FROM a)` int(5) DEFAULT NULL, + `EXTRACT(YEAR_MONTH FROM a)` int(7) DEFAULT NULL, `EXTRACT(QUARTER FROM a)` int(2) DEFAULT NULL, - `EXTRACT(MONTH FROM a)` int(2) DEFAULT NULL, - `EXTRACT(WEEK FROM a)` int(2) DEFAULT NULL, + `EXTRACT(MONTH FROM a)` int(3) DEFAULT NULL, + `EXTRACT(WEEK FROM a)` int(3) DEFAULT NULL, `EXTRACT(DAY FROM a)` int(3) DEFAULT NULL, `EXTRACT(DAY_HOUR FROM a)` int(5) DEFAULT NULL, `EXTRACT(DAY_MINUTE FROM a)` int(7) DEFAULT NULL, @@ -6373,3 +6373,57 @@ SELECT FROM_UNIXTIME(LEAST(3696610869, NULL)); FROM_UNIXTIME(LEAST(3696610869, NULL)) NULL +# +# Start of 10.5 tests +# +# +# MDEV-29149 Assertion `!is_valid_datetime() || fraction_remainder(((item->decimals) < (6) ? (item->decimals) : (6))) == 0' failed in Datetime_truncation_not_needed::Datetime_truncation_not_needed +# +SET @@timestamp= UNIX_TIMESTAMP('2022-07-21 23:00:00'); +SELECT DATE_SUB('2022-07-21 00:00:00', INTERVAL 800 HOUR) AS expected_result; +expected_result +2022-06-17 16:00:00 +SELECT +IF(1,TIMEDIFF('38:59:59','839:00:00'),CAST('2022-12-12' AS DATE)) AS c1, +IF(1,TIMEDIFF('-839:00:00','-38:59:59'),CAST('2022-12-12' AS DATE)) AS c2; +c1 c2 +2022-06-17 16:00:00 2022-06-17 16:00:00 +Warnings: +Warning 1292 Truncated incorrect time value: '839:00:00' +Warning 1292 Truncated incorrect time value: '-839:00:00' +SELECT +IF(1,TIMEDIFF(385959,8390000),CAST('2022-12-12' AS DATE)) AS c1, +IF(1,TIMEDIFF(-8390000,-385959),CAST('2022-12-12' AS DATE)) AS c2; +c1 c2 +2022-06-17 16:00:00 2022-06-17 16:00:00 +Warnings: +Warning 1292 Truncated incorrect time value: '8390000' +Warning 1292 Truncated incorrect time value: '-8390000' +SELECT +TIMEDIFF('38:59:59','839:00:00') AS c1, +CAST(TIMEDIFF('38:59:59','839:00:00') AS TIME(6)) AS c2, +TIMEDIFF('839:00:00','38:59:59') AS c3, +CAST(TIMEDIFF('839:00:00','38:59:59') AS TIME(6)) AS c4; +c1 c2 c3 c4 +-800:00:00 -800:00:00.000000 800:00:00 800:00:00.000000 +Warnings: +Warning 1292 Truncated incorrect time value: '839:00:00' +Warning 1292 Truncated incorrect time value: '839:00:00' +Warning 1292 Truncated incorrect time value: '839:00:00' +Warning 1292 Truncated incorrect time value: '839:00:00' +SELECT +TIMEDIFF(385959,8390000) AS c1, +CAST(TIMEDIFF(385959,8390000) AS TIME(6)) AS c2, +TIMEDIFF(8390000,385959) AS c3, +CAST(TIMEDIFF(8390000,385959) AS TIME(6)) AS c4; +c1 c2 c3 c4 +-800:00:00 -800:00:00.000000 800:00:00 800:00:00.000000 +Warnings: +Warning 1292 Truncated incorrect time value: '8390000' +Warning 1292 Truncated incorrect time value: '8390000' +Warning 1292 Truncated incorrect time value: '8390000' +Warning 1292 Truncated incorrect time value: '8390000' +SET @@timestamp= DEFAULT; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/func_time.test mariadb-10.11.9/mysql-test/main/func_time.test --- mariadb-10.11.6/mysql-test/main/func_time.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_time.test 2024-08-03 07:29:57.000000000 +0000 @@ -3218,3 +3218,42 @@ --echo # SELECT FROM_UNIXTIME(LEAST(3696610869, NULL)); + + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-29149 Assertion `!is_valid_datetime() || fraction_remainder(((item->decimals) < (6) ? (item->decimals) : (6))) == 0' failed in Datetime_truncation_not_needed::Datetime_truncation_not_needed +--echo # + +SET @@timestamp= UNIX_TIMESTAMP('2022-07-21 23:00:00'); + +SELECT DATE_SUB('2022-07-21 00:00:00', INTERVAL 800 HOUR) AS expected_result; + +SELECT + IF(1,TIMEDIFF('38:59:59','839:00:00'),CAST('2022-12-12' AS DATE)) AS c1, + IF(1,TIMEDIFF('-839:00:00','-38:59:59'),CAST('2022-12-12' AS DATE)) AS c2; + +SELECT + IF(1,TIMEDIFF(385959,8390000),CAST('2022-12-12' AS DATE)) AS c1, + IF(1,TIMEDIFF(-8390000,-385959),CAST('2022-12-12' AS DATE)) AS c2; + +SELECT + TIMEDIFF('38:59:59','839:00:00') AS c1, + CAST(TIMEDIFF('38:59:59','839:00:00') AS TIME(6)) AS c2, + TIMEDIFF('839:00:00','38:59:59') AS c3, + CAST(TIMEDIFF('839:00:00','38:59:59') AS TIME(6)) AS c4; + +SELECT + TIMEDIFF(385959,8390000) AS c1, + CAST(TIMEDIFF(385959,8390000) AS TIME(6)) AS c2, + TIMEDIFF(8390000,385959) AS c3, + CAST(TIMEDIFF(8390000,385959) AS TIME(6)) AS c4; + +SET @@timestamp= DEFAULT; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/func_time_hires.result mariadb-10.11.9/mysql-test/main/func_time_hires.result --- mariadb-10.11.6/mysql-test/main/func_time_hires.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_time_hires.result 2024-08-03 07:29:57.000000000 +0000 @@ -162,17 +162,17 @@ 12:13:14.120000 select CAST(@a AS DATETIME(7)); ERROR 42000: Too big precision specified for '@`a`'. Maximum is 6 -SELECT CONVERT_TZ('2011-01-02 12:00:00', '+00:00', '+03:00'); -CONVERT_TZ('2011-01-02 12:00:00', '+00:00', '+03:00') +SELECT CONVERT_TZ('2011-01-02 12:00:00', '+00:00', '+03:00') as exp; +exp 2011-01-02 15:00:00 -SELECT CONVERT_TZ('2011-01-02 12:00:00.123', '+00:00', '+03:00'); -CONVERT_TZ('2011-01-02 12:00:00.123', '+00:00', '+03:00') +SELECT CONVERT_TZ('2011-01-02 12:00:00.123', '+00:00', '+03:00') as exp; +exp 2011-01-02 15:00:00.123 -SELECT CONVERT_TZ('2011-01-02 12:00:00.123456', '+00:00', '+03:00'); -CONVERT_TZ('2011-01-02 12:00:00.123456', '+00:00', '+03:00') +SELECT CONVERT_TZ('2011-01-02 12:00:00.123456', '+00:00', '+03:00') as exp; +exp 2011-01-02 15:00:00.123456 -SELECT CONVERT_TZ(CAST('2010-10-10 10:10:10.123456' AS DATETIME(4)), '+00:00', '+03:00'); -CONVERT_TZ(CAST('2010-10-10 10:10:10.123456' AS DATETIME(4)), '+00:00', '+03:00') +SELECT CONVERT_TZ(CAST('2010-10-10 10:10:10.123456' AS DATETIME(4)), '+00:00', '+03:00') as exp; +exp 2010-10-10 13:10:10.1234 create table t1 (a varchar(200)); insert t1 values (now(6)); diff -Nru mariadb-10.11.6/mysql-test/main/func_time_hires.test mariadb-10.11.9/mysql-test/main/func_time_hires.test --- mariadb-10.11.6/mysql-test/main/func_time_hires.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/func_time_hires.test 2024-08-03 07:29:57.000000000 +0000 @@ -80,13 +80,10 @@ # # CONVERT_TZ # -SELECT CONVERT_TZ('2011-01-02 12:00:00', '+00:00', '+03:00'); -SELECT CONVERT_TZ('2011-01-02 12:00:00.123', '+00:00', '+03:00'); -SELECT CONVERT_TZ('2011-01-02 12:00:00.123456', '+00:00', '+03:00'); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT CONVERT_TZ(CAST('2010-10-10 10:10:10.123456' AS DATETIME(4)), '+00:00', '+03:00'); ---enable_view_protocol +SELECT CONVERT_TZ('2011-01-02 12:00:00', '+00:00', '+03:00') as exp; +SELECT CONVERT_TZ('2011-01-02 12:00:00.123', '+00:00', '+03:00') as exp; +SELECT CONVERT_TZ('2011-01-02 12:00:00.123456', '+00:00', '+03:00') as exp; +SELECT CONVERT_TZ(CAST('2010-10-10 10:10:10.123456' AS DATETIME(4)), '+00:00', '+03:00') as exp; # # Field::store_time() diff -Nru mariadb-10.11.6/mysql-test/main/function_defaults.result mariadb-10.11.9/mysql-test/main/function_defaults.result --- mariadb-10.11.6/mysql-test/main/function_defaults.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/function_defaults.result 2024-08-03 07:29:57.000000000 +0000 @@ -3145,3 +3145,28 @@ 2 2010-10-10 10:10:10 x drop table t1; set timestamp=default; +# +# MDEV-33790: Incorrect DEFAULT expression evaluated in UPDATE +# +create table t1 ( +a int, +b timestamp default '2010-10-10 10:10:10' on update now(), +c varchar(100) default 'x'); +create table t2 (a int primary key); +insert t1 (a) values (1),(2); +insert t2 (a) values (1),(2); +select * from t1; +a b c +1 2010-10-10 10:10:10 x +2 2010-10-10 10:10:10 x +set timestamp=unix_timestamp('2011-11-11 11-11-11'); +update t1,t2 set b=default, c=default(b) where t1.a=1 and t1.a= t2.a; +select * from t1; +a b c +1 2010-10-10 10:10:10 2010-10-10 10:10:10 +2 2010-10-10 10:10:10 x +drop table t1, t2; +set timestamp=default; +# +# End of 10.4 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/function_defaults.test mariadb-10.11.9/mysql-test/main/function_defaults.test --- mariadb-10.11.6/mysql-test/main/function_defaults.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/function_defaults.test 2024-08-03 07:29:57.000000000 +0000 @@ -67,3 +67,26 @@ select * from t1; drop table t1; set timestamp=default; + +--echo # +--echo # MDEV-33790: Incorrect DEFAULT expression evaluated in UPDATE +--echo # + +create table t1 ( + a int, + b timestamp default '2010-10-10 10:10:10' on update now(), + c varchar(100) default 'x'); +create table t2 (a int primary key); +insert t1 (a) values (1),(2); +insert t2 (a) values (1),(2); + +select * from t1; +set timestamp=unix_timestamp('2011-11-11 11-11-11'); +update t1,t2 set b=default, c=default(b) where t1.a=1 and t1.a= t2.a; +select * from t1; +drop table t1, t2; +set timestamp=default; + +--echo # +--echo # End of 10.4 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/gis-debug.result mariadb-10.11.9/mysql-test/main/gis-debug.result --- mariadb-10.11.6/mysql-test/main/gis-debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/gis-debug.result 2024-08-03 07:29:57.000000000 +0000 @@ -238,30 +238,26 @@ -1 POLYGON 16.00 SELECT ST_CONTAINS( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')); -ST_CONTAINS( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')) +GeomFromText('POINT(5 10)')) as geom; +geom 0 SELECT AsText(ST_UNION( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))); -AsText(ST_UNION( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))) +GeomFromText('POINT(5 10)'))) as geom; +geom GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)),POLYGON((6 6,6 11,11 11,11 6,6 6)),POINT(5 10)) DROP PROCEDURE p1; # # Bug #13833019 ASSERTION `T1->RESULT_RANGE' FAILED IN GCALC_OPERATION_REDUCER::END_COUPLE # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) as geom; +geom POLYGON # # Bug #13832749 HANDLE_FATAL_SIGNAL IN GCALC_FUNCTION::COUNT_INTERNAL # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) as geom; +geom POLYGON # # Bug#13358363 - ASSERTION: N > 0 && N < SINUSES_CALCULATED*2+1 | GET_N_SINCOS/ADD_EDGE_BUFFER @@ -272,27 +268,21 @@ SELECT ST_WITHIN( LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))); -ST_WITHIN( -LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), -ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) ') +ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))) as st; +st 0 SELECT ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))); -ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) +ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) as st; +st 2 SELECT ST_NUMINTERIORRINGS( ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))); -ST_NUMINTERIORRINGS( -ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) +SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) as st; +st 0 SELECT ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))); -ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) +SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) as st; +st POLYGON((9 9,5 2,4 5,9 9)) # # Start of 10.2 tests diff -Nru mariadb-10.11.6/mysql-test/main/gis-precise.result mariadb-10.11.9/mysql-test/main/gis-precise.result --- mariadb-10.11.6/mysql-test/main/gis-precise.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/gis-precise.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,21 +1,21 @@ DROP TABLE IF EXISTS t1; -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))')); -1 ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))')) +select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))')) as result; +1 result 1 1 -select 0, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))')); -0 ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))')) +select 0, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))')) as result; +0 result 0 0 -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)')); -1 ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)')) +select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)')) as result; +1 result 1 1 -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -1 ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) +select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; +1 result 1 1 -select 0, ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -0 ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) +select 0, ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; +0 result 0 0 -select 1, ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))')); -1 ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))')) +select 1, ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))')) as result; +1 result 1 1 create table t1 (g point); insert into t1 values @@ -66,89 +66,89 @@ POINT(6 6) POINT(8 4) DROP TABLE t1; -select 0, ST_Within(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -0 ST_Within(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) +select 0, ST_Within(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; +0 result 0 0 -select 1, ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -1 ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) +select 1, ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; +1 result 1 1 -select 1, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)')); -1 ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)')) +select 1, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)')) as result; +1 result 1 1 -select 0, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)')); -0 ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)')) +select 0, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)')) as result; +0 result 0 1 -select 1, ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')); -1 ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) +select 1, ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) as result; +1 result 1 1 -select astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))); -astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) +select astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) as result; +result POLYGON((0 0,1 2,2 0,0 0)) -select astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))); -astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) +select astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) as result; +result POINT(1 1) -select ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')); -ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) +select ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) as result; +result 1 -select ST_contains(GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), GeomFromText('POINT(5 10)')); -ST_contains(GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), GeomFromText('POINT(5 10)')) +select ST_contains(GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), GeomFromText('POINT(5 10)')) as result; +result 0 -select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))')); -ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))')) +select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))')) as result; +result 1 -select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')); -ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) +select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) as result; +result 0 -select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')); -ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) +select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) as result; +result 1 -select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))')); -ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))')) +select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))')) as result; +result 0 -select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) +select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) as result; +result 0.7071067811865475 -select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)')); -ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)')) +select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)')) as result; +result 0 -select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) +select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) as result; +result 0 -select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)')); -ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)')) +select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)')) as result; +result 0.4472135954999579 -select ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) +select ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) as result; +result 0.8944271909999159 -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))) +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))) as result; +result POLYGON((26.47058823529412 23.823529411764707,21.951219512195124 27.439024390243905,23.855421686746986 29.819277108433734,29.289940828402365 26.36094674556213,26.47058823529412 23.823529411764707)) -select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)'))); -astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)'))) +select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)'))) as result; +result MULTIPOINT(26.47058823529412 23.823529411764707,29.289940828402365 26.36094674556213,21.951219512195124 27.439024390243905,23.855421686746986 29.819277108433734) -select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)'))); -astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)'))) +select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)'))) as result; +result POINT(29.289940828402365 26.36094674556213) -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)'))) +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)'))) as result; +result POINT(20 20) -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)'))) +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)'))) as result; +result LINESTRING(0 0,46.666666666666664 46.666666666666664) -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); -astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) as result; +result MULTILINESTRING((0 0,46.666666666666664 46.666666666666664),(8 10,45.33333333333333 47.33333333333333)) -select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); -astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) +select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) as result; +result GEOMETRYCOLLECTION(LINESTRING(-10 -10,0 0),LINESTRING(-11 -9,8 10),POLYGON((0 0,40 50,50 45,0 0)),LINESTRING(46.666666666666664 46.666666666666664,200 200,199 201,45.33333333333333 47.33333333333333)) -select astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))); -astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) +select astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) as result; +result POLYGON((0 0,0 1,0.5 0.5,0 0)) -select astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))); -astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) +select astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) as result; +result MULTIPOLYGON(((0 0,0.5 0.5,1 0,0 0)),((0.5 0.5,0 1,0 2,1 1,0.5 0.5))) -select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); -astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) +select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) as result; +result GEOMETRYCOLLECTION(LINESTRING(-10 -10,0 0),LINESTRING(-11 -9,8 10),POLYGON((0 0,40 50,50 45,0 0)),LINESTRING(46.666666666666664 46.666666666666664,200 200,199 201,45.33333333333333 47.33333333333333)) select astext(ST_buffer(geometryfromtext('point(1 1)'), 1)); astext(ST_buffer(geometryfromtext('point(1 1)'), 1)) @@ -170,26 +170,26 @@ ST_NUMPOINTS(ST_EXTERIORRING(@buff)) 202 DROP TABLE t1; -select st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)')); -st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)')) +select st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)')) as result; +result 0 -select st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)')); -st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)')) +select st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)')) as result; +result 0 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)')) +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)')) as result; +result 1 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)')) +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)')) as result; +result 0 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)')) +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)')) as result; +result 0 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))')) +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))')) as result; +result 0 -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))')); -st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))')) +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))')) as result; +result 1 SELECT ST_Equals(PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),PolyFromText('POLYGON((67 13, 67 18, 59 19, 59 13, 59 13, 67 13) )')) as result; result @@ -226,16 +226,14 @@ ERROR HY000: Illegal parameter data type boolean for operation 'st_astext' SELECT astext(ST_UNION ( PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'), -ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))'))))); -astext(ST_UNION ( -PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'), -ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))'))))) +ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))'))))) as result; +result GEOMETRYCOLLECTION(POLYGON((0 0,1 9,8 2,0 0),(2 2,2 7,3 2,2 2)),LINESTRING(0.5555555555555556 5,0 5,0 0,5 0,5 1.25),LINESTRING(2 5,2.4 5)) SELECT astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0)); astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0)) LINESTRING(0 0,1 1) -SELECT Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5); -Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5) +SELECT Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5) as result; +result 78.68426 SELECT ST_INTERSECTION(NULL, NULL); ST_INTERSECTION(NULL, NULL) @@ -247,21 +245,14 @@ MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 4,2 5,3 5)), ((2 2,9 2,0 2,2 6,2 2)), ((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), - ((9 9,6 8,7 0,9 9)))'))); -ASTEXT(ST_INTERSECTION( -MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)), - ((0 5,3 5,3 0,0 0,0 1,2 1,2 2,0 2,0 5), (1 3,2 3,2 4,1 4,1 3)), - ((2 2,5 2,4 4,2 8,2 2)))'), -MULTIPOLY + ((9 9,6 8,7 0,9 9)))'))) as result; +result POLYGON((0 2,1 4,1 3,2 3,2 4,1 4,1.5 5,2 5,2 8,8 8,8 2,0 2),(4 4,4 6,6 6,6 4,4 4)) SELECT ROUND(ST_LENGTH(ST_UNION( MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), (8 2,1 3,9 0,4 4))'), -MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6))'))), 7); -ROUND(ST_LENGTH(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), - (8 2,1 3,9 0,4 4))'), -MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6) +MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6))'))), 7) as result; +result 90.2783626 SELECT ST_NUMGEOMETRIES((ST_UNION(ST_UNION( MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 0,4 2,0 2,1 5,0 3,7 0,8 5,5 8), @@ -274,18 +265,13 @@ MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((7 7,3 7,3 1,7 8,7 7)), ((3 5,2 4,2 5,3 5)), ((7 7,8 7,3 7,7 7,7 7)), - ((0 5,3 5,3 4,1 4,1 3,3 3,3 0,0 0,0 5), (1 1,2 1,2 2,1 2,1 1)))')))); -ST_NUMGEOMETRIES((ST_UNION(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 0,4 2,0 2,1 5,0 3,7 0,8 5,5 8), - (6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), - + ((0 5,3 5,3 4,1 4,1 3,3 3,3 0,0 0,0 5), (1 1,2 1,2 2,1 2,1 1)))')))) as result; +result 192 SELECT Round(ST_AREA(ST_BUFFER( ST_UNION( POLYGONFROMTEXT('POLYGON((7 7, 7 7, 7 4, 7 7, 7 7))'), -POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6); -Round(ST_AREA(ST_BUFFER( ST_UNION( -POLYGONFROMTEXT('POLYGON((7 7, 7 7, 7 4, 7 7, 7 7))'), -POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6) +POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6) as result; +result 21.901344 SELECT AsText(ST_UNION(MultiPolygonFromText(' MULTIPOLYGON(((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)), @@ -294,21 +280,14 @@ MultiPolygonFromText(' MULTIPOLYGON(((0 0, 1 9, 4 6, 0 0)), ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1)), ((7 7, 4 7, 6 3, 7 2, 7 7)), - ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1))) '))); -AsText(ST_UNION(MultiPolygonFromText(' - MULTIPOLYGON(((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)), - ((0 0, 8 3, 7 4, 0 0)), - ((2 2, 2 8, 8 8, 8 2, 2 2), (4 4, 4 6, 6 6, 6 4, 4 4)))'), -MultiPolygonFr + ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1))) '))) as result; +result POLYGON((0 0,0 5,0.5555555555555556 5,1 9,2 8,8 8,8 2,5.333333333333334 2,3 1.125,3 0,0 0),(1 1,1 1.5,1.3333333333333333 2,2 2,2 1.1428571428571428,1.75 1,1 1),(3 1.7142857142857142,3 2,3.5 2,3 1.7142857142857142),(4 4,4 6,4.5 6,5.5 4,4 4)) SELECT AsText(ST_SYMDIFFERENCE( MultiLineStringFromText('MULTILINESTRING((7 7, 1 7, 8 5, 7 8, 7 7), (6 3, 3 4, 1 1, 9 9, 9 0, 8 4, 9 9))'), -Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)')))); -AsText(ST_SYMDIFFERENCE( -MultiLineStringFromText('MULTILINESTRING((7 7, 1 7, 8 5, 7 8, 7 7), - (6 3, 3 4, 1 1, 9 9, 9 0, 8 4, 9 9))'), -Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)')))) +Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)')))) as result; +result GEOMETRYCOLLECTION(POLYGON((0 0,0 9,7 9,7 0,0 0)),LINESTRING(9 9,8 4,9 0,9 9),LINESTRING(7 5.285714285714286,8 5,7.25 7.25),LINESTRING(7 7,7.25 7.25),LINESTRING(7.25 7.25,7 8),LINESTRING(7.25 7.25,9 9)) SELECT AsText(ST_UNION( MultiPolygonFromText('MULTIPOLYGON(((9 9, 7 9, 1 1, 9 9)), @@ -316,50 +295,38 @@ ((0 0, 7 5, 9 6, 0 0)), ((7 7, 5 7, 1 5, 7 1, 7 7)))'), MultiPolygonFromText('MULTIPOLYGON(((2 2, 2 2, 1 5, 2 7, 2 2)), - ((0 5, 3 5, 3 0, 0 0, 0 5), (1 1, 2 1, 2 4, 1 4, 1 1)))'))); -AsText(ST_UNION( -MultiPolygonFromText('MULTIPOLYGON(((9 9, 7 9, 1 1, 9 9)), - ((2 2, 1 2, 3 3, 2 2, 2 2)), - ((0 0, 7 5, 9 6, 0 0)), - + ((0 5, 3 5, 3 0, 0 0, 0 5), (1 1, 2 1, 2 4, 1 4, 1 1)))'))) as result; +result POLYGON((0 0,0 5,1 5,2 7,2 5.5,5 7,5.5 7,7 9,9 9,7 7,7 5,9 6,7 4.666666666666667,7 1,4.25 2.833333333333333,3 2,3 0,0 0),(1 1,1 4,1.3333333333333333 4,1.8571428571428572 2.4285714285714284,1 2,1.75 2,1 1,2 2,2 1.4285714285714284,1.4 1,1 1),(1.5 1,2 1.3333333333333333,2 1,1.5 1),(3 2.142857142857143,3 3,3.4 3.4,4.1034482758620685 2.9310344827586206,3 2.142857142857143)) SELECT AsText( ST_INTERSECTION( LinestringFromText('LINESTRING( 3 5, 2 5, 2 4, 3 4, 3 5 ) ') , LinestringFromText('LINESTRING( 3 5, 2 4, 2 5, 3 5 ) ') -)); -AsText( ST_INTERSECTION( -LinestringFromText('LINESTRING( 3 5, 2 5, 2 4, 3 4, 3 5 ) ') , -LinestringFromText('LINESTRING( 3 5, 2 4, 2 5, 3 5 ) ') -)) +)) as result; +result LINESTRING(2 4,2 5,3 5) SELECT AsText( ST_UNION( PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') , -PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) ); -AsText( ST_UNION( -PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') , -PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) ) +PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) ) as result; +result POLYGON((2 0,2 5,3 3,3 2,7 5,2 0)) -SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))); -AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))) +SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))) as result; +result GEOMETRYCOLLECTION EMPTY -SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))'))); -AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))'))) +SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))'))) as result; +result GEOMETRYCOLLECTION(POINT(8 1),LINESTRING(2 4,2 5,3 5,3 4,2 4)) SELECT ST_DISTANCE(POINTFROMTEXT('POINT(7 1)'),MULTILINESTRINGFROMTEXT('MULTILINESTRING( - (4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))')); -ST_DISTANCE(POINTFROMTEXT('POINT(7 1)'),MULTILINESTRINGFROMTEXT('MULTILINESTRING( - (4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))')) + (4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))')) as result; +result 1 -SELECT AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))'))); -AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))'))) +SELECT AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))'))) as result; +result GEOMETRYCOLLECTION(POLYGON((2 0,2 2,3 2,3 6,12 9,3 0,3 1,2 0)),LINESTRING(5 2,7 2)) SELECT ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER(ST_UNION( MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 2 5, 7 6, 1 8),(0 0 ,1 6 ,0 1, 8 9, 2 4, 6 1, 3 5, 4 8), (9 3, 5 4, 1 8, 4 2, 5 8, 3 0))' ) , MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 3 1, 2 7, 4 2, 6 2, 1 5))') -), 16))); -ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER(ST_UNION( -MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 2 5, 7 6, 1 8),(0 0 ,1 6 ,0 1, 8 9, 2 4, 6 1, 3 5, 4 8), (9 3, 5 4, 1 8, 4 2, 5 8, 3 0))' ) , -MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 3 1, 2 7, 4 2, 6 2 +), 16))) as result; +result 278 SELECT ST_NUMGEOMETRIES(ST_DIFFERENCE ( ST_UNION ( @@ -372,10 +339,8 @@ ) ), MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 9 , 1 3 , 7 3 , 8 5 ) , ( 5 0 , 8 1 , 2 0 , 7 4 , 1 0 ) , ( 9 2 , 5 2 , 6 5 , 8 8 , 0 2 ) , ( 0 8 , 3 9 , 4 0 , 1 0 ) , ( 0 0 , 7 6 , 8 3 , 0 0 ) ) ' ) -)); -ST_NUMGEOMETRIES(ST_DIFFERENCE ( -ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 4 , 5 0 , 2 9 , 6 2 , 0 2 ) , ( 4 3 , 5 6 , 9 4 , 0 7 , 7 2 , 2 0 , 8 2 ) , ( 5 0 , 1 5 , 3 7 , 7 7 ) , ( 2 3 , 9 5 , 2 0 , 8 1 ) , ( 0 9 , 9 3 , 2 8 , 8 1 , 9 4 ) +)) as result; +result 125 SELECT ASTEXT(ST_DIFFERENCE ( POLYGONFROMTEXT( ' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ' ) , @@ -389,21 +354,14 @@ ) ) ) -)); -ASTEXT(ST_DIFFERENCE ( -POLYGONFROMTEXT( ' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ' ) , -ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ' ) , -ST_SYMDIFFERENCE ( -MULTILINESTRINGFROMTEX +)) as result; +result POLYGON((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)) SELECT ST_NUMGEOMETRIES(ST_UNION ( MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 0 8 , 1 9 , 5 7 , 2 8 , 5 8 , 6 7 ) , ( 4 5 , 8 4 , 0 3 , 5 1 ) , ( 6 8 , 2 7 , 1 6 , 9 9 , 7 2 ) , ( 9 5 , 2 8 , 1 2 , 9 6 , 2 0 ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 7 7 , 2 7, 6 8, 7 1 , 7 7 ) ) ) ' ) -)); -ST_NUMGEOMETRIES(ST_UNION ( -MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 0 8 , 1 9 , 5 7 , 2 8 , 5 8 , 6 7 ) , ( 4 5 , 8 4 , 0 3 , 5 1 ) , ( 6 8 , 2 7 , 1 6 , 9 9 , 7 2 ) , ( 9 5 , 2 8 , 1 2 , 9 6 , 2 0 ) ) ' ) , -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( +)) as result; +result 50 SELECT ST_BUFFER ( LINESTRINGFROMTEXT( ' LINESTRING( 5 4 , 3 8 , 2 6 , 5 5 , 7 9 ) ' ) , @@ -414,49 +372,50 @@ MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) ) ) -) ; -ST_BUFFER ( -LINESTRINGFROMTEXT( ' LINESTRING( 5 4 , 3 8 , 2 6 , 5 5 , 7 9 ) ' ) , -ST_DISTANCE ( -MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) , -ST_DIFFERENCE ( -MULTIPOL +) as result; +result NULL -SELECT ST_DISTANCE ( ST_DIFFERENCE ( MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) ), MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) ) ; -ST_DISTANCE ( ST_DIFFERENCE ( MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , +SELECT ST_DISTANCE ( +ST_DIFFERENCE ( +MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , +MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) +), +MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) +) as result; +result NULL -SELECT ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5)))'), geomETRYFROMTEXT(' MULTILINESTRING( ( 5 1 , 3 7 , 6 1 , 7 0 ) , ( 1 6 , 8 5 , 7 5 , 5 6 ) )') )); -ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5)) +SELECT ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5)))'), geomETRYFROMTEXT(' MULTILINESTRING( ( 5 1 , 3 7 , 6 1 , 7 0 ) , ( 1 6 , 8 5 , 7 5 , 5 6 ) )') )) as result; +result MULTIPOINT(7 5,7 5.142857142857142,5.899999999999998 5.300000000000001,5.799999999999997 5.600000000000001,3 7) -SELECT ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) ')); -ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) ')) +SELECT ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) ')) as result; +result 0 -SELECT ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') ); -ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') ) +SELECT ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') ) as result; +result 0 -SELECT ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) ')); -ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) ')) +SELECT ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) ')) as result; +result 1 -select ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY'))); -ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY'))) +select ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY'))) as result; +result GEOMETRYCOLLECTION EMPTY -SELECT ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') ); -ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') ) +SELECT ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') ) as result; +result 0 -SELECT ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') ); -ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') ) +SELECT ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') ) as result; +result 0 -SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') ); -ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') ) +SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') ) as result; +result 0 -SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') ); -ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') ) +SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') ) as result; +result 1 -SELECT ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ')); -ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ')) +SELECT ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ')) as result; +result 0 -SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') ); -ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19, +SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') ) as result; +result 1 SELECT ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER( POLYGONFROMTEXT( 'POLYGON( ( 0.0 -3.0, -2.910427500435995 0.727606875108998, @@ -464,26 +423,20 @@ 7.664100588675687 1.503849116986468, 1.664100588675687 -2.496150883013531, 0.0 -3.0 -))' ), 3 ))); -ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER( POLYGONFROMTEXT( 'POLYGON( ( 0.0 -3.0, - -2.910427500435995 0.727606875108998, - -0.910427500435995 8.727606875108998, - 7.664100588675687 1.503849116986468, - 1.664100588675687 -2.496150883013531, - 0.0 -3.0 -))' ), +))' ), 3 ))) as result; +result 136 -select astext(buffer(st_linestringfromwkb(linestring(point(-1,1), point(-1,-2))),-1)); -astext(buffer(st_linestringfromwkb(linestring(point(-1,1), point(-1,-2))),-1)) +select astext(buffer(st_linestringfromwkb(linestring(point(-1,1), point(-1,-2))),-1)) as result; +result GEOMETRYCOLLECTION EMPTY -select ST_Touches(ST_LineFromText('LINESTRING(0 0,5 5)'),ST_PointFromText('POINT(0 0)')); -ST_Touches(ST_LineFromText('LINESTRING(0 0,5 5)'),ST_PointFromText('POINT(0 0)')) +select ST_Touches(ST_LineFromText('LINESTRING(0 0,5 5)'),ST_PointFromText('POINT(0 0)')) as result; +result 1 -select ST_Touches(ST_PolygonFromText('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_PointFromText('POINT(0 0)')); -ST_Touches(ST_PolygonFromText('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_PointFromText('POINT(0 0)')) +select ST_Touches(ST_PolygonFromText('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_PointFromText('POINT(0 0)')) as result; +result 1 -select ST_Touches(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)')); -ST_Touches(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)')) +select ST_Touches(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)')) as result; +result 0 SELECT ST_RELATE( ST_DIFFERENCE( @@ -750,30 +703,26 @@ -1 POLYGON 16.00 SELECT ST_CONTAINS( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')); -ST_CONTAINS( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')) +GeomFromText('POINT(5 10)')) as geom; +geom 0 SELECT AsText(ST_UNION( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))); -AsText(ST_UNION( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))) +GeomFromText('POINT(5 10)'))) as geom; +geom GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)),POLYGON((6 6,6 11,11 11,11 6,6 6)),POINT(5 10)) DROP PROCEDURE p1; # # Bug #13833019 ASSERTION `T1->RESULT_RANGE' FAILED IN GCALC_OPERATION_REDUCER::END_COUPLE # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) as geom; +geom POLYGON # # Bug #13832749 HANDLE_FATAL_SIGNAL IN GCALC_FUNCTION::COUNT_INTERNAL # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) as geom; +geom POLYGON # # Bug#13358363 - ASSERTION: N > 0 && N < SINUSES_CALCULATED*2+1 | GET_N_SINCOS/ADD_EDGE_BUFFER @@ -784,27 +733,21 @@ SELECT ST_WITHIN( LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))); -ST_WITHIN( -LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), -ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) ') +ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))) as st; +st 0 SELECT ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))); -ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) +ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) as st; +st 2 SELECT ST_NUMINTERIORRINGS( ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))); -ST_NUMINTERIORRINGS( -ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) +SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) as st; +st 0 SELECT ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))); -ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) +SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) as st; +st POLYGON((9 9,5 2,4 5,9 9)) # # MDEV-13467 Feature request: Support for ST_Distance_Sphere() @@ -832,74 +775,74 @@ SELECT ST_DISTANCE_SPHERE(1, 1, NULL); ST_DISTANCE_SPHERE(1, 1, NULL) NULL -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('LINESTRING(0 0, 1 1)')); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('LINESTRING(0 0, 1 1)')) as result; ERROR HY000: Internal error: st_distance_sphere # Test Points and radius -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)')); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)')) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)')) as result; +result 157249.0357231545 -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(-1 -1)'), ST_GEOMFROMTEXT('POINT(-2 -2)')), 10); -TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(-1 -1)'), ST_GEOMFROMTEXT('POINT(-2 -2)')), 10) +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(-1 -1)'), ST_GEOMFROMTEXT('POINT(-2 -2)')), 10) as result; +result 157225.0865419108 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 1); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 1) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 1) as result; +result 0.024682056391766436 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 0); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 0) as result; ERROR HY000: Internal error: Radius must be greater than zero. -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), -1); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), -1) as result; ERROR HY000: Internal error: Radius must be greater than zero. # Test longitude/lattitude -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10); -TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10) +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10) as result; +result 157225.0865419108 -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(2 1)')), 10); -TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(2 1)')), 10) +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(2 1)')), 10) as result; +result 222355.4901806686 -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10); -TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10) +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10) as result; +result 222389.3645969269 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(2 1)')); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(2 1)')) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(2 1)')) as result; +result 157249.0357231545 # Test Points - Multipoints -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1)')); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1)')) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1)')) as result; +result 157249.0357231545 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 1)'), ST_GEOMFROMTEXT('POINT(0 0)')); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 1)'), ST_GEOMFROMTEXT('POINT(0 0)')) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 1)'), ST_GEOMFROMTEXT('POINT(0 0)')) as result; +result 157249.0357231545 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)')); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)')) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)')) as result; +result 157249.0357231545 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)')); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)')) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)')) as result; +result 157249.0357231545 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)'), 1); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)'), 1) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)'), 1) as result; +result 0.024682056391766436 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)'), 1); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)'), 1) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)'), 1) as result; +result 0.024682056391766436 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1, 3 4)'), 1); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1, 3 4)'), 1) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1, 3 4)'), 1) as result; +result 0.024682056391766436 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1,5 6)'), 1); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1,5 6)'), 1) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1,5 6)'), 1) as result; +result 0.024682056391766436 # Test Multipoints - Multipoints -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')); -ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')) +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')) as result; +result 0 -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')), 10); -TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')), 10) +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')), 10) as result; +result 314282.5644496733 -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )')), 10); -TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )')), 10) +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )')), 10) as result; +result 314282.5644496733 -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),1), 17); -TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),1), 17) +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),1), 17) as result; +result 0.04933028646581131 -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),0); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),0) as result; ERROR HY000: Internal error: Radius must be greater than zero. set @pt1 = ST_GeomFromText('POINT(190 -30)'); set @pt2 = ST_GeomFromText('POINT(-30 50)'); diff -Nru mariadb-10.11.6/mysql-test/main/gis-precise.test mariadb-10.11.9/mysql-test/main/gis-precise.test --- mariadb-10.11.6/mysql-test/main/gis-precise.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/gis-precise.test 2024-08-03 07:29:57.000000000 +0000 @@ -9,15 +9,12 @@ DROP TABLE IF EXISTS t1; --enable_warnings -#enable after fix MDEV-27871 ---disable_view_protocol -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))')); -select 0, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))')); -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)')); -select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -select 0, ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -select 1, ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))')); ---enable_view_protocol +select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 0,20 20,0 20,0 0))'), GeomFromText('POLYGON((10 10,30 10,30 30,10 30,10 10))')) as result; +select 0, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 40, 40 50, 20 70, 10 40))')) as result; +select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POINT(10 10)')) as result; +select 1, ST_Intersects(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; +select 0, ST_Within(GeomFromText('POLYGON((0 0,20 10,10 30, 0 0))'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; +select 1, ST_Within(GeomFromText('POLYGON((1 1,20 10,10 30, 1 1))'), GeomFromText('POLYGON((0 0,30 5,10 40, 0 0))')) as result; create table t1 (g point); insert into t1 values @@ -38,53 +35,49 @@ DROP TABLE t1; -#enable after fix MDEV-27871 ---disable_view_protocol -select 0, ST_Within(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); -select 1, ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')); - - -select 1, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)')); -select 0, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)')); - -select 1, ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')); - -select astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))); -select astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))); - -select ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')); -select ST_contains(GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), GeomFromText('POINT(5 10)')); -select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))')); -select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')); -select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')); -select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))')); +select 0, ST_Within(GeomFromText('LINESTRING(15 15, 50 50, 60 60)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; +select 1, ST_Within(GeomFromText('LINESTRING(15 15, 16 16)'), GeomFromText('POLYGON((10 10,30 20,20 40, 10 10))')) as result; + + +select 1, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(50 15, 15 50)')) as result; +select 0, ST_Intersects(GeomFromText('LINESTRING(15 15, 50 50)'), GeomFromText('LINESTRING(16 16, 51 51)')) as result; + +select 1, ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) as result; + +select astext(ST_Union(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) as result; +select astext(ST_Intersection(geometryfromtext('point(1 1)'), geometryfromtext('polygon((0 0, 2 0, 1 2, 0 0))'))) as result; + +select ST_Intersects(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))')) as result; +select ST_contains(GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))'), GeomFromText('POINT(5 10)')) as result; +select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 15, 15 15, 15 10, 10 10))')) as result; +select ST_Disjoint(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) as result; +select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((10 10, 10 4, 4 4, 4 10, 10 10))')) as result; +select ST_Overlaps(GeomFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'), GeomFromText('POLYGON((1 1, 1 4, 4 4, 4 1, 1 1))')) as result; # Distance tests -select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)')); -select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); -select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)')); -select ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')); +select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) as result; +select ST_DISTANCE(geomfromtext('polygon((0 0, 1 2, 2 1, 0 0))'), geomfromtext('linestring(0 1, 1 0)')) as result; +select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0))'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) as result; +select ST_DISTANCE(geomfromtext('polygon((0 0, 3 6, 6 3, 0 0),(2 2, 3 4, 4 3, 2 2))'), geomfromtext('point(3 3)')) as result; +select ST_DISTANCE(geomfromtext('linestring(0 0, 3 6, 6 3, 0 0)'), geomfromtext('polygon((2 2, 3 4, 4 3, 2 2))')) as result; # Operations tests -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))); -select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)'))); -select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)'))); -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)'))); -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)'))); +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POLYGON((50 5, 55 10, 0 45, 50 5))'))) as result; +select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50, 0 0)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45, 50 5)'))) as result; +select astext(ST_Intersection(GeomFromText('LINESTRING(0 0, 50 45, 40 50)'), GeomFromText('LINESTRING(50 5, 55 10, 0 45)'))) as result; +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('POINT(20 20)'))) as result; +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200)'))) as result; --replace_result 7.999999999999999 8 -select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); +select astext(ST_Intersection(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) as result; --replace_result 7.999999999999999 8 -select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); +select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) as result; -select astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))); +select astext(ST_intersection(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) as result; -select astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))); +select astext(ST_symdifference(geomfromtext('polygon((0 0, 1 0, 0 1, 0 0))'), geomfromtext('polygon((0 0, 1 1, 0 2, 0 0))'))) as result; --replace_result 7.999999999999999 8 -select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))); - ---enable_view_protocol +select astext(ST_UNION(GeomFromText('POLYGON((0 0, 50 45, 40 50, 0 0))'), GeomFromText('LINESTRING(-10 -10, 200 200, 199 201, -11 -9)'))) as result; # Buffer() tests --replace_result 0012045437948276 00120454379482759 @@ -103,25 +96,20 @@ # cleanup DROP TABLE t1; -#enable after fix MDEV-27871 ---disable_view_protocol - #Touches tests -select st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)')); -select st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)')); -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)')); -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)')); -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)')); -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))')); -select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))')); +select st_touches(geomfromtext('point(0 0)'), geomfromtext('point(1 1)')) as result; +select st_touches(geomfromtext('point(1 1)'), geomfromtext('point(1 1)')) as result; +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 1)')) as result; +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 0)')) as result; +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('point(1 2)')) as result; +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1.2, 1 0, 2 0, 1 1.2))')) as result; +select st_touches(geomfromtext('polygon((0 0, 2 2, 0 4, 0 0))'), geomfromtext('polygon((1 1, 1 0, 2 0, 1 1))')) as result; #Equals test SELECT ST_Equals(PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),PolyFromText('POLYGON((67 13, 67 18, 59 19, 59 13, 59 13, 67 13) )')) as result; SELECT ST_Equals(PolyFromText('POLYGON((67 13, 67 18, 67 18, 59 18, 59 13, 67 13) )'),PolyFromText('POLYGON((67 13, 67 18, 59 18, 59 13, 59 13, 67 13) )')) as result; SELECT ST_Equals(PointFromText('POINT (12 13)'),PointFromText('POINT (12 13)')) as result; ---enable_view_protocol - --echo # --echo # BUG#11755628/47429: INTERSECTION FUNCTION CRASHED MYSQLD --echo # BUG#11759650/51979: UNION/INTERSECTION OF POLYGONS CRASHES MYSQL @@ -150,30 +138,19 @@ # bug #801243 Assertion `(0)' failed in Gis_geometry_collection::init_from_opresult on ST_UNION -#enable after fix MDEV-27871 ---disable_view_protocol - SELECT astext(ST_UNION ( PolyFromText('POLYGON(( 2 2 ,3 2,2 7,2 2),( 0 0,8 2,1 9,0 0))'), - ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))'))))); - ---enable_view_protocol + ExteriorRing( Envelope( MultiLineStringFromText('MULTILINESTRING((3 4,5 3),(3 0,0 5))'))))) as result; #bug 801189 ST_BUFFER asserts if radius = 0 SELECT astext(ST_BUFFER(LineStringFromText('LINESTRING(0 0,1 1)'),0)); -#enable after fix MDEV-27871 ---disable_view_protocol #bug 801199 Infinite recursion in Gcalc_function::count_internal with ST_BUFFER over MULTIPOINT -SELECT Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5); ---enable_view_protocol +SELECT Round(ST_Area(ST_BUFFER(MultipointFromText('MULTIPOINT(7 7,3 7,7 2,7 4 ,7 7)'), 3)), 5) as result; #bug 801212 Assertion with ST_INTERSECTION on NULL values SELECT ST_INTERSECTION(NULL, NULL); -#enable after fix MDEV-27871 ---disable_view_protocol - #bug 804305 Crash in wkb_get_double with ST_INTERSECTION SELECT ASTEXT(ST_INTERSECTION( MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)), @@ -182,14 +159,14 @@ MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 4,2 5,3 5)), ((2 2,9 2,0 2,2 6,2 2)), ((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), - ((9 9,6 8,7 0,9 9)))'))); + ((9 9,6 8,7 0,9 9)))'))) as result; #bug 804324 Assertion 0 in Gcalc_scan_iterator::pop_suitable_intersection SELECT ROUND(ST_LENGTH(ST_UNION( MULTILINESTRINGFROMTEXT('MULTILINESTRING((6 2,4 0,3 5,3 6,4 3,6 4,3 9,0 7,3 7,8 4,2 9,5 0), (8 2,1 3,9 0,4 4))'), - MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6))'))), 7); + MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 5,6 7,9 7,5 2,1 6,3 6))'))), 7) as result; SELECT ST_NUMGEOMETRIES((ST_UNION(ST_UNION( MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 0,4 2,0 2,1 5,0 3,7 0,8 5,5 8), @@ -202,13 +179,13 @@ MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((7 7,3 7,3 1,7 8,7 7)), ((3 5,2 4,2 5,3 5)), ((7 7,8 7,3 7,7 7,7 7)), - ((0 5,3 5,3 4,1 4,1 3,3 3,3 0,0 0,0 5), (1 1,2 1,2 2,1 2,1 1)))')))); + ((0 5,3 5,3 4,1 4,1 3,3 3,3 0,0 0,0 5), (1 1,2 1,2 2,1 2,1 1)))')))) as result; #bug #805860 Second assertion Assertion `n > 0 && n < SINUSES_CALCULATED*2+1' in get_n_sinco SELECT Round(ST_AREA(ST_BUFFER( ST_UNION( POLYGONFROMTEXT('POLYGON((7 7, 7 7, 7 4, 7 7, 7 7))'), - POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6); + POLYGONFROMTEXT('POLYGON((7 7, 4 7, 2 9, 7 6, 7 7))')), 1)), 6) as result; #bug #804259 Second assertion in Gis_geometry_collection::init_from_opresult @@ -220,7 +197,7 @@ MultiPolygonFromText(' MULTIPOLYGON(((0 0, 1 9, 4 6, 0 0)), ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1)), ((7 7, 4 7, 6 3, 7 2, 7 7)), - ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1))) '))); + ((0 5, 3 5, 3 4, 1 4, 1 3, 3 3, 3 0, 0 0, 0 5), (1 1, 2 1, 2 2, 1 2, 1 1))) '))) as result; #bug 801217 Assertion `t1->result_range' in Gcalc_operation_reducer::end_couple @@ -228,7 +205,7 @@ SELECT AsText(ST_SYMDIFFERENCE( MultiLineStringFromText('MULTILINESTRING((7 7, 1 7, 8 5, 7 8, 7 7), (6 3, 3 4, 1 1, 9 9, 9 0, 8 4, 9 9))'), - Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)')))); + Envelope(GeometryFromText('MULTIPOINT(7 9, 0 0, 3 7, 1 6, 0 0)')))) as result; #bug 804266 Memory corruption/valgrind warning/crash in move_hole() with ST_UNION @@ -238,34 +215,34 @@ ((0 0, 7 5, 9 6, 0 0)), ((7 7, 5 7, 1 5, 7 1, 7 7)))'), MultiPolygonFromText('MULTIPOLYGON(((2 2, 2 2, 1 5, 2 7, 2 2)), - ((0 5, 3 5, 3 0, 0 0, 0 5), (1 1, 2 1, 2 4, 1 4, 1 1)))'))); + ((0 5, 3 5, 3 0, 0 0, 0 5), (1 1, 2 1, 2 4, 1 4, 1 1)))'))) as result; #bug 802376 ST_INTERSECTION returns wrong result on two overlapping linestrings in maria-5.3-gis SELECT AsText( ST_INTERSECTION( LinestringFromText('LINESTRING( 3 5, 2 5, 2 4, 3 4, 3 5 ) ') , LinestringFromText('LINESTRING( 3 5, 2 4, 2 5, 3 5 ) ') -)); +)) as result; #bug 801560 ST_UNION of adjacent polygons includes extra line in maria-5.3-gis SELECT AsText( ST_UNION( PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') , - PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) ); + PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) ) as result; #bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis -SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))); +SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)'))) as result; #bug 839341 100% CPU usage with ST_UNION in maria-5.3-gis -SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))'))); +SELECT AsText(ST_UNION(GEOMETRYFROMTEXT('POINT(8 1)') ,MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 5, 2 5, 2 4, 3 4, 3 5))'))) as result; #bug 839318 Crash in Gcalc_scan_iterator::point::get_shape with ST_DISTANCE and MULTILINESTRING in maria-5.3-gis SELECT ST_DISTANCE(POINTFROMTEXT('POINT(7 1)'),MULTILINESTRINGFROMTEXT('MULTILINESTRING( - (4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))')); + (4 7,9 7,6 1,3 4,1 1), (3 5, 2 5, 2 4, 3 4, 3 5))')) as result; #bug 839327 Crash in Gcalc_operation_reducer::end_couple with ST_UNION and MULTIPOLYGONs in 5.3-gis -SELECT AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))'))); +SELECT AsText(ST_UNION(POLYGONFROMTEXT('POLYGON((12 9, 3 6, 3 0, 12 9))'), POLYGONFROMTEXT('POLYGON((2 2, 7 2, 4 2, 2 0, 2 2))'))) as result; #bug 841622 Assertion `t->rp->type == Gcalc_function::shape_line' failed in Gcalc_operation_reducer::end_line in maria-5.3-gis @@ -273,7 +250,7 @@ SELECT ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER(ST_UNION( MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 2 5, 7 6, 1 8),(0 0 ,1 6 ,0 1, 8 9, 2 4, 6 1, 3 5, 4 8), (9 3, 5 4, 1 8, 4 2, 5 8, 3 0))' ) , MULTILINESTRINGFROMTEXT('MULTILINESTRING((3 4, 3 1, 2 7, 4 2, 6 2, 1 5))') - ), 16))); + ), 16))) as result; #bug 841625 Assertion `m_poly_borders->next' failed in Gcalc_operation_reducer::count_slice in maria-5.3-gis @@ -288,7 +265,7 @@ ) ), MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 2 9 , 1 3 , 7 3 , 8 5 ) , ( 5 0 , 8 1 , 2 0 , 7 4 , 1 0 ) , ( 9 2 , 5 2 , 6 5 , 8 8 , 0 2 ) , ( 0 8 , 3 9 , 4 0 , 1 0 ) , ( 0 0 , 7 6 , 8 3 , 0 0 ) ) ' ) -)); +)) as result; #bug 841745 ssertion `!sp0->is_bottom()' failed in Gcalc_scan_iterator::find_intersections in maria-5.3-gis @@ -304,13 +281,13 @@ ) ) ) -)); +)) as result; #bug 841773 Assertion `t0->rp->type == t1->rp->type' failed in Gcalc_operation_reducer::end_couple in maria-5.3-gis SELECT ST_NUMGEOMETRIES(ST_UNION ( MULTILINESTRINGFROMTEXT( ' MULTILINESTRING( ( 0 8 , 1 9 , 5 7 , 2 8 , 5 8 , 6 7 ) , ( 4 5 , 8 4 , 0 3 , 5 1 ) , ( 6 8 , 2 7 , 1 6 , 9 9 , 7 2 ) , ( 9 5 , 2 8 , 1 2 , 9 6 , 2 0 ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 7 7 , 2 7, 6 8, 7 1 , 7 7 ) ) ) ' ) -)); +)) as result; #bug 841662 Third assertion `n > 0 && n < SINUSES_CALCULATED*2+1' in get_n_sincos SELECT ST_BUFFER ( @@ -322,47 +299,53 @@ MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) ) ) - ) ; -SELECT ST_DISTANCE ( ST_DIFFERENCE ( MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) ), MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) ) ; + ) as result; +SELECT ST_DISTANCE ( + ST_DIFFERENCE ( + MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 5, 2 4, 3 4, 3 5) ) ) ' ) , + MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) , ( ( 0 0 , 3 8 , 9 4 , 0 0 ) ) ) ' ) + ), + MULTIPOLYGONFROMTEXT( ' MULTIPOLYGON( ( (3 5, 2 4, 2 5, 3 5) ) , ( (3 5, 2 5, 2 4, 3 4, 3 5) ) , ( ( 0 0 , 8 3 , 9 5 , 0 0 ) ) ) ' ) +) as result; #bug 848939 Wrong result with ST_INTERSECTION between linestrings and a polygon in 5.3-gis -SELECT ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5)))'), geomETRYFROMTEXT(' MULTILINESTRING( ( 5 1 , 3 7 , 6 1 , 7 0 ) , ( 1 6 , 8 5 , 7 5 , 5 6 ) )') )); +SELECT ASTEXT(ST_INTERSECTION( GEOMETRYFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(7 7,5.33333333333333 7),LINESTRING(5.33333333333333 7,0 7,5 8,5.33333333333333 7),LINESTRING(5.33333333333333 7,7 2,7 7),POLYGON((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5)))'), geomETRYFROMTEXT(' MULTILINESTRING( ( 5 1 , 3 7 , 6 1 , 7 0 ) , ( 1 6 , 8 5 , 7 5 , 5 6 ) )') )) as result; #bug 855485 ST_CROSSES returns different result than PostGIS for overlapping polygons -SELECT ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) ')); +SELECT ST_CROSSES( GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 4, 2 5, 3 5) ) ') , POLYGONFROMTEXT(' POLYGON((2 4,3 4,3 5,2 5,2 4)) ')) as result; #bug 855487 ST_WITHIN returns wrong result for partially overlapping polygons -SELECT ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') ); +SELECT ST_WITHIN( POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 2 0 , 1 0, 2 4 , 0 4, 0 5) ) ') , POLYGONFROMTEXT(' POLYGON( (0 5, 3 5, 3 4, 1 4 , 1 3 , 3 3 , 3 0 , 0 0 , 0 5), ( 1 1 , 2 1 , 2 2 , 1 2 , 1 1 ) ) ') ) as result; #bug 855492 ST_WITHIN returns TRUE on point on the edge of a polygon -SELECT ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) ')); +SELECT ST_WITHIN( POINTFROMTEXT(' POINT(1 2 ) ') , MULTIPOLYGONFROMTEXT(' MULTIPOLYGON( ( (0 5, 3 5, 3 0, 0 0, 0 5), ( 1 1 , 2 1 , 2 4, 1 4, 1 1 ) ) ) ')) as result; #bug 855497 ST_ENVELOPE of GEOMETRYCOLLECTION EMPTY returns NULL and not GEOMETRYCOLLECTION EMPTY -select ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY'))); +select ST_ASTEXT(envelope(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION EMPTY'))) as result; #bug 855503 ST_EQUALS reports TRUE between a POLYGON and a MULTILINESTRING -SELECT ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') ); +SELECT ST_EQUALS( GEOMETRYFROMTEXT(' MULTILINESTRING( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') , GEOMETRYFROMTEXT(' POLYGON( (3 5, 2 5, 2 4, 3 4, 3 5) ) ') ) as result; #bug 855505 ST_TOUCHES reports TRUE for intersecting polygon and linestring -SELECT ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') ); +SELECT ST_TOUCHES( GEOMETRYFROMTEXT(' LINESTRING( 1 1 , 1 4 , 5 0 , 8 3 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ') ) as result; #bug 857051 ST_EQUALS returns TRUE on two nonidentical MULTIPOINTs -SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') ); -SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') ); +SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT(' MULTIPOINT( 5 8 , 5 2 , 1 8 , 3 0 , 3 0 , 7 8 ) ') ) as result; +SELECT ST_EQUALS( MULTIPOINTFROMTEXT(' MULTIPOINT( 5 1 , 6 9 , 1 4 , 4 0 ) ') , MULTIPOINTFROMTEXT('MULTIPOINT( 4 0 , 6 9 , 5 1, 1 4 )') ) as result; #bug 857050 ST_WITHIN returns wrong result with MULTIPOINT and POLYGON -SELECT ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ')); +SELECT ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGONFROMTEXT(' POLYGON( ( 2 2 , 2 8 , 8 8 , 8 2 , 2 2 ) , ( 4 4 , 4 6 , 6 6 , 6 4 , 4 4 ) ) ')) as result; #bug 857087 Wrong result with ST_INTERSECTS and LINESTRINGs -SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') ); +SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') ) as result; #bug 977201 ST_BUFFER fails with the negative D. TODO - check the result deeper. # select ASTEXT(ST_BUFFER(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 31 10, 77 80), POLYGON((0 0,4 7,1 1,0 0)), POINT(20 20))'), -3)); @@ -374,15 +357,15 @@ 7.664100588675687 1.503849116986468, 1.664100588675687 -2.496150883013531, 0.0 -3.0 -))' ), 3 ))); +))' ), 3 ))) as result; # MDEV-5615 crash in Gcalc_function::add_operation -select astext(buffer(st_linestringfromwkb(linestring(point(-1,1), point(-1,-2))),-1)); +select astext(buffer(st_linestringfromwkb(linestring(point(-1,1), point(-1,-2))),-1)) as result; # MDEV-7925 Inconsistent behavior of ST_Touches with a POINT as one of arguments -select ST_Touches(ST_LineFromText('LINESTRING(0 0,5 5)'),ST_PointFromText('POINT(0 0)')); -select ST_Touches(ST_PolygonFromText('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_PointFromText('POINT(0 0)')); -select ST_Touches(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)')); +select ST_Touches(ST_LineFromText('LINESTRING(0 0,5 5)'),ST_PointFromText('POINT(0 0)')) as result; +select ST_Touches(ST_PolygonFromText('POLYGON((0 0,0 5,5 5,5 0,0 0))'),ST_PointFromText('POINT(0 0)')) as result; +select ST_Touches(ST_PointFromText('POINT(0 0)'),ST_PointFromText('POINT(0 0)')) as result; # MDEV-12705 10.1.18-MariaDB-1~jessie - mysqld got signal 11. SELECT ST_RELATE( @@ -403,8 +386,6 @@ 'F*FFFF**F' ) as relate_res; ---enable_view_protocol - # MDEV-18920 Prepared statements with st_convexhull hang and eat 100% cpu. prepare s from 'do st_convexhull(st_aswkb(multipoint(point(-11702,15179),point(-5031,27960),point(-30557,11158),point(-27804,30314))))'; execute s; @@ -442,45 +423,41 @@ SELECT ST_DISTANCE_SPHERE(1, 1, NULL); # Wrong geometry --error ER_INTERNAL_ERROR -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('LINESTRING(0 0, 1 1)')); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('LINESTRING(0 0, 1 1)')) as result; -#enable after fix MDEV-27871 ---disable_view_protocol --echo # Test Points and radius -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)')); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)')) as result; # make bb x86 happy -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(-1 -1)'), ST_GEOMFROMTEXT('POINT(-2 -2)')), 10); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 1); +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(-1 -1)'), ST_GEOMFROMTEXT('POINT(-2 -2)')), 10) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 1) as result; --error ER_INTERNAL_ERROR -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 0); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), 0) as result; --error ER_INTERNAL_ERROR -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), -1); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('POINT(1 1)'), -1) as result; --echo # Test longitude/lattitude # make bb x86 happy -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10); -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(2 1)')), 10); -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(2 1)')); +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10) as result; +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 1)'), ST_GEOMFROMTEXT('POINT(2 1)')), 10) as result; +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(1 2)')), 10) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(1 0)'), ST_GEOMFROMTEXT('POINT(2 1)')) as result; --echo # Test Points - Multipoints -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1)')); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 1)'), ST_GEOMFROMTEXT('POINT(0 0)')); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)')); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)')); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)'), 1); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)'), 1); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1, 3 4)'), 1); -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1,5 6)'), 1); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1)')) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 1)'), ST_GEOMFROMTEXT('POINT(0 0)')) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)')) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)')) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(1 1,2 2)'), 1) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2,1 1)'), 1) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1, 3 4)'), 1) as result; +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('POINT(0 0)'), ST_GEOMFROMTEXT('MULTIPOINT(2 2, 1 1,5 6)'), 1) as result; --echo # Test Multipoints - Multipoints -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')); +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')) as result; # make bb x86 happy -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')), 10); -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )')), 10); +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(3 4,8 9 )')), 10) as result; +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )')), 10) as result; # make bb x86 happy -SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),1), 17); +SELECT TRUNCATE(ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),1), 17) as result; --error ER_INTERNAL_ERROR -SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),0); - ---enable_view_protocol +SELECT ST_DISTANCE_SPHERE(ST_GEOMFROMTEXT('MULTIPOINT(1 2,1 1 )'), ST_GEOMFROMTEXT('MULTIPOINT(8 9,3 4 )'),0) as result; # Longitude out of range [-180,180] set @pt1 = ST_GeomFromText('POINT(190 -30)'); diff -Nru mariadb-10.11.6/mysql-test/main/gis.result mariadb-10.11.9/mysql-test/main/gis.result --- mariadb-10.11.6/mysql-test/main/gis.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/gis.result 2024-08-03 07:29:57.000000000 +0000 @@ -5072,37 +5072,37 @@ # MDEV-20009 Add CAST(expr AS pluggable_type) # SELECT CAST(1 AS GEOMETRY); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometry)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometry)' SELECT CAST(1 AS GEOMETRYCOLLECTION); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometrycollection)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometrycollection)' SELECT CAST(1 AS POINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS point)' +ERROR HY000: Operator does not exist: 'CAST(expr AS point)' SELECT CAST(1 AS LINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS linestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS linestring)' SELECT CAST(1 AS POLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS polygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS polygon)' SELECT CAST(1 AS MULTIPOINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipoint)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipoint)' SELECT CAST(1 AS MULTILINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS multilinestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multilinestring)' SELECT CAST(1 AS MULTIPOLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipolygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipolygon)' SELECT CONVERT(1, GEOMETRY); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometry)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometry)' SELECT CONVERT(1, GEOMETRYCOLLECTION); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometrycollection)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometrycollection)' SELECT CONVERT(1, POINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS point)' +ERROR HY000: Operator does not exist: 'CAST(expr AS point)' SELECT CONVERT(1, LINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS linestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS linestring)' SELECT CONVERT(1, POLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS polygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS polygon)' SELECT CONVERT(1, MULTIPOINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipoint)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipoint)' SELECT CONVERT(1, MULTILINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS multilinestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multilinestring)' SELECT CONVERT(1, MULTIPOLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipolygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipolygon)' # # MDEV-17832 Protocol: extensions for Pluggable types and JSON, GEOMETRY # @@ -5328,5 +5328,112 @@ ERROR HY000: Illegal parameter data type geometry for operation 'bit_xor(' DROP TABLE t1; # +# MDEV-27666 User variable not parsed as geometry variable in geometry function. +# +set @g= point(1, 1); +select ST_AsWKT(GeometryCollection(Point(44, 6), @g)); +ST_AsWKT(GeometryCollection(Point(44, 6), @g)) +GEOMETRYCOLLECTION(POINT(44 6),POINT(1 1)) +set @g= "just a string"; +select ST_AsWKT(GeometryCollection(Point(44, 6), @g)); +ERROR HY000: Illegal parameter data type longblob for operation 'geometrycollection' +SET @g= LineString(Point(0,0), Point(0,1)); +SELECT AsText(PointN(@g, 1)); +AsText(PointN(@g, 1)) +POINT(0 0) +SELECT AsText(PointN(@g, 2)); +AsText(PointN(@g, 2)) +POINT(0 1) +SET @g= Point(1, 1); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` point DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +POINT(1 1) +DROP TABLE t1; +SET @g= MultiPoint(Point(1, 1), Point(-1,-1)); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` multipoint DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +MULTIPOINT(1 1,-1 -1) +DROP TABLE t1; +SET @g= LineString(Point(1, 1), Point(2,2)); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` linestring DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +LINESTRING(1 1,2 2) +DROP TABLE t1; +SET @g= MultiLineString(LineString(Point(1, 1), Point(2,2)), +LineString(Point(-1, -1), Point(-2,-2))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` multilinestring DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +MULTILINESTRING((1 1,2 2),(-1 -1,-2 -2)) +DROP TABLE t1; +SET @g= Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` polygon DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +POLYGON((0 0,30 0,30 30,0 0)) +DROP TABLE t1; +SET @g= MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), +Point(3, 0), Point(0, 3)))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` multipolygon DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +MULTIPOLYGON(((0 3,3 3,3 0,0 3))) +DROP TABLE t1; +SET @g= GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` geometrycollection DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9)) +DROP TABLE t1; +SET @g= GeometryFromText('POINT(1 1)'); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `g` geometry DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT AsText(g) FROM t1; +AsText(g) +POINT(1 1) +DROP TABLE t1; +# # End of 10.5 tests # diff -Nru mariadb-10.11.6/mysql-test/main/gis.test mariadb-10.11.9/mysql-test/main/gis.test --- mariadb-10.11.6/mysql-test/main/gis.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/gis.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,5 @@ -- source include/have_geometry.inc - +-- source include/not_embedded.inc # # Spatial objects @@ -3374,6 +3374,69 @@ SELECT BIT_XOR(a) FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-27666 User variable not parsed as geometry variable in geometry function. +--echo # + +set @g= point(1, 1); +select ST_AsWKT(GeometryCollection(Point(44, 6), @g)); +set @g= "just a string"; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +select ST_AsWKT(GeometryCollection(Point(44, 6), @g)); + +SET @g= LineString(Point(0,0), Point(0,1)); +SELECT AsText(PointN(@g, 1)); +SELECT AsText(PointN(@g, 2)); + +SET @g= Point(1, 1); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; + +SET @g= MultiPoint(Point(1, 1), Point(-1,-1)); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; + +SET @g= LineString(Point(1, 1), Point(2,2)); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; + +SET @g= MultiLineString(LineString(Point(1, 1), Point(2,2)), + LineString(Point(-1, -1), Point(-2,-2))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; + +SET @g= Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; + +SET @g= MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), + Point(3, 0), Point(0, 3)))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; + +SET @g= GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; + +SET @g= GeometryFromText('POINT(1 1)'); +CREATE TABLE t1 AS SELECT @g AS g; +SHOW CREATE TABLE t1; +SELECT AsText(g) FROM t1; +DROP TABLE t1; --echo # --echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/grant.result mariadb-10.11.9/mysql-test/main/grant.result --- mariadb-10.11.6/mysql-test/main/grant.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/grant.result 2024-08-03 07:29:57.000000000 +0000 @@ -1991,6 +1991,11 @@ GRANT FILE ON *.* TO mysqltest_u1@localhost; GRANT CREATE USER ON *.* TO mysqltest_u1@localhost; GRANT PROCESS ON *.* TO mysqltest_u1@localhost; +GRANT RELOAD ON mysqltest_db1.* TO mysqltest_u1@localhost; +ERROR HY000: Incorrect usage of DB GRANT and GLOBAL PRIVILEGES +connect(localhost,mysqltest_u1,,db1,MASTER_PORT,MASTER_SOCKET); +connect con1, localhost, mysqltest_u1, ,db1; +ERROR 42000: Access denied for user 'mysqltest_u1'@'localhost' to database 'db1' GRANT RELOAD ON *.* TO mysqltest_u1@localhost; GRANT REPLICATION CLIENT ON *.* TO mysqltest_u1@localhost; GRANT REPLICATION SLAVE ON *.* TO mysqltest_u1@localhost; diff -Nru mariadb-10.11.6/mysql-test/main/grant.test mariadb-10.11.9/mysql-test/main/grant.test --- mariadb-10.11.6/mysql-test/main/grant.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/grant.test 2024-08-03 07:29:57.000000000 +0000 @@ -1824,6 +1824,13 @@ GRANT FILE ON *.* TO mysqltest_u1@localhost; GRANT CREATE USER ON *.* TO mysqltest_u1@localhost; GRANT PROCESS ON *.* TO mysqltest_u1@localhost; +# Global privileges should be granted to all schemas, not individual DB +--error ER_WRONG_USAGE +GRANT RELOAD ON mysqltest_db1.* TO mysqltest_u1@localhost; +# Select privilege is needed beside RELOAD privilege +--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT +--error ER_DBACCESS_DENIED_ERROR +--connect (con1, localhost, mysqltest_u1, ,db1) GRANT RELOAD ON *.* TO mysqltest_u1@localhost; GRANT REPLICATION CLIENT ON *.* TO mysqltest_u1@localhost; GRANT REPLICATION SLAVE ON *.* TO mysqltest_u1@localhost; diff -Nru mariadb-10.11.6/mysql-test/main/group_min_max.result mariadb-10.11.9/mysql-test/main/group_min_max.result --- mariadb-10.11.6/mysql-test/main/group_min_max.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/group_min_max.result 2024-08-03 07:29:57.000000000 +0000 @@ -3298,6 +3298,8 @@ SELECT b, min(a) FROM t1 WHERE a > ('0' = b) AND b = 'z' GROUP BY b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref b b 4 const 1 Using where; Using index +Warnings: +Note 1105 Cannot use key `b` part[1] for lookup: `test`.`t1`.`a` of type `varchar` > "'0' = 'z'" of type `boolean` SELECT b, min(a) FROM t1 WHERE a > ('0' = b) AND b = 'z' GROUP BY b; b min(a) explain @@ -3984,12 +3986,18 @@ EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN DATE'2001-01-04' AND DATE'2001-01-05' GROUP BY id; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index +Warnings: +Note 1105 Cannot use key `id` part[1] for lookup: `test`.`t1`.`a` of type `varchar` >= "DATE'2001-01-04'" of type `date` EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN DATE'2001-01-04' AND '2001-01-05' GROUP BY id; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index +Warnings: +Note 1105 Cannot use key `id` part[1] for lookup: `test`.`t1`.`a` of type `varchar` >= "DATE'2001-01-04'" of type `date` EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a BETWEEN '2001-01-04' AND DATE'2001-01-05' GROUP BY id; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index NULL id 27 NULL 64 Using where; Using index +Warnings: +Note 1105 Cannot use key `id` part[1] for lookup: `test`.`t1`.`a` of type `varchar` >= "('2001-01-04')" of type `date` DROP TABLE t1; # # MIN() optimization didn't work correctly with BETWEEN when using too diff -Nru mariadb-10.11.6/mysql-test/main/group_min_max_innodb.result mariadb-10.11.9/mysql-test/main/group_min_max_innodb.result --- mariadb-10.11.6/mysql-test/main/group_min_max_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/group_min_max_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -330,6 +330,113 @@ a Australia DROP TABLES t1, t2; +# +# MDEV-15656: Assertion `is_last_prefix <= 0' failed in +# QUICK_GROUP_MIN_MAX_SELECT::get_next +# +SET @lru_depth.save= @@innodb_lru_scan_depth; +SET GLOBAL innodb_lru_scan_depth= 1024; +CREATE TABLE t1 ( +pk_part1 INT AUTO_INCREMENT, +a VARCHAR(4), +row_start timestamp(6) default current_timestamp, +PRIMARY KEY (pk_part1, row_start) +) ENGINE=InnoDB; +INSERT INTO t1 (a) VALUES +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'); +connect con1,localhost,root,,test; +SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +SELECT DISTINCT pk_part1 FROM t1; +connection default; +INSERT INTO t1 (pk_part1) VALUES (NULL); +connection con1; +disconnect con1; +connection default; +DROP TABLE t1; +SET GLOBAL innodb_lru_scan_depth= @lru_depth.save; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; diff -Nru mariadb-10.11.6/mysql-test/main/group_min_max_innodb.test mariadb-10.11.9/mysql-test/main/group_min_max_innodb.test --- mariadb-10.11.6/mysql-test/main/group_min_max_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/group_min_max_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -273,6 +273,53 @@ DROP TABLES t1, t2; +--echo # +--echo # MDEV-15656: Assertion `is_last_prefix <= 0' failed in +--echo # QUICK_GROUP_MIN_MAX_SELECT::get_next +--echo # +SET @lru_depth.save= @@innodb_lru_scan_depth; +SET GLOBAL innodb_lru_scan_depth= 1024; + +CREATE TABLE t1 ( + pk_part1 INT AUTO_INCREMENT, + a VARCHAR(4), + row_start timestamp(6) default current_timestamp, + PRIMARY KEY (pk_part1, row_start) +) ENGINE=InnoDB; + +INSERT INTO t1 (a) VALUES +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'), +('foo'),('bar'),('foo'),('bar'),('foo'); + +--connect (con1,localhost,root,,test) + +SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; + +--let $run= 20 +--disable_result_log +while ($run) +{ + --send + SELECT DISTINCT pk_part1 FROM t1; + --connection default + INSERT INTO t1 (pk_part1) VALUES (NULL); + --connection con1 + --reap + --dec $run +} +--enable_result_log + +--disconnect con1 +--connection default +DROP TABLE t1; +SET GLOBAL innodb_lru_scan_depth= @lru_depth.save; + set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; diff -Nru mariadb-10.11.6/mysql-test/main/group_min_max_notembedded.test mariadb-10.11.9/mysql-test/main/group_min_max_notembedded.test --- mariadb-10.11.6/mysql-test/main/group_min_max_notembedded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/group_min_max_notembedded.test 2024-08-03 07:29:57.000000000 +0000 @@ -23,10 +23,13 @@ SELECT DISTINCT * FROM t1 WHERE a IN (1, 2); +#Enable after fix MDEV-32034 +--disable_view_protocol select CAST(json_value(json_extract(trace, '$**.chosen_access_method.cost'), '$[0]') as DOUBLE) < 1.0e100 as ACCESS_METHOD_COST_IS_FINITE from information_schema.optimizer_trace; +--enable_view_protocol set optimizer_use_condition_selectivity = @tmp, optimizer_trace=@tmp2; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/having.test mariadb-10.11.9/mysql-test/main/having.test --- mariadb-10.11.6/mysql-test/main/having.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/having.test 2024-08-03 07:29:57.000000000 +0000 @@ -258,6 +258,8 @@ # the having column is resolved in the FROM clause of the outer query - # works in ANSI +#Enable after fix MDEV-31937 +--disable_ps2_protocol select t1.col1 from t1 where t1.col2 in (select t2.col2 from t2 @@ -284,6 +286,7 @@ group by t2.col1, t2.col2 having col_t1 <= 10) group by col_t1 having col_t1 <= 20; +--enable_ps2_protocol # # nested HAVING clauses @@ -412,11 +415,14 @@ INSERT INTO PROJ VALUES ('P5','IRM','Test',10000,'Vienna'); INSERT INTO PROJ VALUES ('P6','PAYR','Design',50000,'Deale'); +#Enable after fix MDEV-31937 +--disable_ps2_protocol SELECT EMPNUM, GRADE*1000 FROM HU.STAFF WHERE GRADE * 1000 > ANY (SELECT SUM(BUDGET) FROM HU.PROJ GROUP BY CITY, PTYPE HAVING HU.PROJ.CITY = HU.STAFF.CITY); +--enable_ps2_protocol DROP SCHEMA HU; USE test; @@ -956,6 +962,8 @@ --echo # MDEV-29731 Crash when HAVING in a correlated subquery references --echo # columns in the outer query --echo # +#Enable after fix MDEV-29731 +--disable_view_protocol CREATE TABLE t (a INT, b INT); SELECT 1 FROM t WHERE b = (SELECT 1 FROM t GROUP BY a HAVING b = a+1); @@ -998,6 +1006,7 @@ WHERE (0, a) IN ((0,-1),(+1,0)) ORDER BY 1+AVG(a) OVER (ORDER BY a)) ORDER BY a; DROP TABLE t; +--enable_view_protocol --echo # --echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/having_cond_pushdown.result mariadb-10.11.9/mysql-test/main/having_cond_pushdown.result --- mariadb-10.11.6/mysql-test/main/having_cond_pushdown.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/having_cond_pushdown.result 2024-08-03 07:29:57.000000000 +0000 @@ -1282,20 +1282,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 4, - "filtered": 100, - "attached_condition": "t2.x < 5 and t2.x > 1" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 4, + "filtered": 100, + "attached_condition": "t2.x < 5 and t2.x > 1" + } } - } - ] + ] + } } } } @@ -1341,20 +1343,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 4, - "filtered": 100, - "attached_condition": "t2.x < 5 and t2.x > 1" + "materialization": { + "query_block": { + "select_id": 3, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 4, + "filtered": 100, + "attached_condition": "t2.x < 5 and t2.x > 1" + } } - } - ] + ] + } } } } @@ -1425,21 +1429,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.y)` < 14", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 4, - "filtered": 100, - "attached_condition": "t2.x < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.y)` < 14", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 4, + "filtered": 100, + "attached_condition": "t2.x < 5" + } } - } - ] + ] + } } } } @@ -1485,21 +1491,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "having_condition": "`MAX(t2.y)` < 14", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 4, - "filtered": 100, - "attached_condition": "t2.x < 5" + "materialization": { + "query_block": { + "select_id": 3, + "having_condition": "`MAX(t2.y)` < 14", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 4, + "filtered": 100, + "attached_condition": "t2.x < 5" + } } - } - ] + ] + } } } } @@ -5565,4 +5573,246 @@ a b 0 11 DROP TABLE t1; +# +# MDEV-19520 Extend condition normalization to include 'NOT a' +# having Item_func_not in item tree breaks assumptions during the +# optimization phase about transformation possibilities in fix_fields(). +# Remove Item_func_not by extending normalization during parsing. +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (0),(1); +SELECT a FROM t1 GROUP BY a HAVING NOT a; +a +0 +DROP TABLE t1; End of 10.4 tests +# +# MDEV-29363: Constant subquery causing a crash in pushdown optimization +# +CREATE TABLE t1 (a INT, b INT, c INT); +INSERT INTO t1 VALUES (3, 3, 4), (NULL, NULL, 2); +EXPLAIN FORMAT=JSON SELECT a,b,c FROM t1 GROUP BY a,b,c +HAVING a = (SELECT MIN(b) AS min_b FROM t1) and (a = b or a = c); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "filesort": { + "sort_key": "t1.b, t1.c", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t1.a = (subquery#2) and (t1.b = (subquery#2) or t1.c = (subquery#2))" + } + } + ], + "subqueries": [ + { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + ] + } + } + ] + } + } + } +} +SELECT a,b,c FROM t1 GROUP BY a,b,c +HAVING a = (SELECT MIN(b) AS min_b FROM t1) and (a = b or a = c); +a b c +3 3 4 +EXPLAIN FORMAT=JSON SELECT a FROM t1 GROUP BY a,b +HAVING a = (SELECT MIN(a) AS min_a FROM t1) AND (a = 3 or a > b); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "filesort": { + "sort_key": "t1.b", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t1.a = (subquery#2) and (1 or (subquery#2) > t1.b)" + } + } + ], + "subqueries": [ + { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + ] + } + } + ] + } + } + } +} +SELECT a FROM t1 GROUP BY a,b +HAVING a = (SELECT MIN(a) AS min_a FROM t1) AND (a = 3 or a > b); +a +3 +DROP TABLE t1; +# +# MDEV-32424: Pushdown: server crashes at JOIN::save_explain_data() +# (fixed by the patch for MDEV-29363) +# +CREATE TABLE t1 (a INT, b INT, c INT); +INSERT INTO t1 VALUES (1, 1, 3), (3, 2, 3); +SELECT a,b,c FROM t1 GROUP BY a,b,c +HAVING a = (SELECT MIN(b) AS min_b FROM t1) and a IN (b, c); +a b c +1 1 3 +DROP TABLE t1; +# +# MDEV-32293: Pushdown: server crashes at check_simple_equality() +# (fixed by the patch for MDEV-29363) +# +CREATE VIEW v1 AS SELECT 1 AS a; +SELECT * FROM v1 GROUP BY a HAVING a = 'b' AND a = (a IS NULL); +a +Warnings: +Warning 1292 Truncated incorrect DECIMAL value: 'b' +DROP VIEW v1; +# +# MDEV-32304: Pushdown: server crashes at Item_field::used_tables() +# (fixed by the patch for MDEV-29363) +# +CREATE VIEW v1 AS SELECT 1 AS a; +SELECT * FROM v1 +GROUP BY a HAVING a = (a IS NULL OR a IS NULL); +a +DROP VIEW v1; +# +# MDEV-32608: Expression with constant subquery causes a crash +# in pushdown from HAVING +# +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (2, 1), (3, 2); +EXPLAIN FORMAT=JSON SELECT * FROM t1 +GROUP BY b +HAVING (SELECT MAX(b) FROM t1) = a AND a + b = 3; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "having_condition": "t1.a = (subquery#2)", + "filesort": { + "sort_key": "t1.b", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "(subquery#2) + t1.b = 3" + } + } + ], + "subqueries": [ + { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + ] + } + } + ] + } + } + } +} +SELECT * FROM t1 +GROUP BY b +HAVING (SELECT MAX(b) FROM t1) = a AND a + b = 3; +a b +2 1 +EXPLAIN FORMAT=JSON SELECT * FROM t1 +GROUP BY b +HAVING (SELECT MAX(b) FROM t1) = a AND a > b; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "having_condition": "t1.a = (subquery#2)", + "filesort": { + "sort_key": "t1.b", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "(subquery#2) > t1.b" + } + } + ], + "subqueries": [ + { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + ] + } + } + ] + } + } + } +} +SELECT * FROM t1 +GROUP BY b +HAVING (SELECT MAX(b) FROM t1) = a AND a > b; +a b +2 1 +DROP TABLE t1; +End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/having_cond_pushdown.test mariadb-10.11.9/mysql-test/main/having_cond_pushdown.test --- mariadb-10.11.6/mysql-test/main/having_cond_pushdown.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/having_cond_pushdown.test 2024-08-03 07:29:57.000000000 +0000 @@ -1489,4 +1489,103 @@ DROP TABLE t1; +--echo # +--echo # MDEV-19520 Extend condition normalization to include 'NOT a' +--echo # having Item_func_not in item tree breaks assumptions during the +--echo # optimization phase about transformation possibilities in fix_fields(). +--echo # Remove Item_func_not by extending normalization during parsing. +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (0),(1); +SELECT a FROM t1 GROUP BY a HAVING NOT a; +DROP TABLE t1; + --echo End of 10.4 tests + +--echo # +--echo # MDEV-29363: Constant subquery causing a crash in pushdown optimization +--echo # + +CREATE TABLE t1 (a INT, b INT, c INT); +INSERT INTO t1 VALUES (3, 3, 4), (NULL, NULL, 2); + +let $q= +SELECT a,b,c FROM t1 GROUP BY a,b,c + HAVING a = (SELECT MIN(b) AS min_b FROM t1) and (a = b or a = c); + +eval EXPLAIN FORMAT=JSON $q; +eval $q; + +let $q= +SELECT a FROM t1 GROUP BY a,b + HAVING a = (SELECT MIN(a) AS min_a FROM t1) AND (a = 3 or a > b); + +eval EXPLAIN FORMAT=JSON $q; +eval $q; + +DROP TABLE t1; + +--echo # +--echo # MDEV-32424: Pushdown: server crashes at JOIN::save_explain_data() +--echo # (fixed by the patch for MDEV-29363) +--echo # + +CREATE TABLE t1 (a INT, b INT, c INT); +INSERT INTO t1 VALUES (1, 1, 3), (3, 2, 3); + +SELECT a,b,c FROM t1 GROUP BY a,b,c + HAVING a = (SELECT MIN(b) AS min_b FROM t1) and a IN (b, c); + +DROP TABLE t1; + +--echo # +--echo # MDEV-32293: Pushdown: server crashes at check_simple_equality() +--echo # (fixed by the patch for MDEV-29363) +--echo # + +CREATE VIEW v1 AS SELECT 1 AS a; + +SELECT * FROM v1 GROUP BY a HAVING a = 'b' AND a = (a IS NULL); + +DROP VIEW v1; + +--echo # +--echo # MDEV-32304: Pushdown: server crashes at Item_field::used_tables() +--echo # (fixed by the patch for MDEV-29363) +--echo # + +CREATE VIEW v1 AS SELECT 1 AS a; + +SELECT * FROM v1 + GROUP BY a HAVING a = (a IS NULL OR a IS NULL); + +DROP VIEW v1; + +--echo # +--echo # MDEV-32608: Expression with constant subquery causes a crash +--echo # in pushdown from HAVING +--echo # + +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (2, 1), (3, 2); + +let $q= +SELECT * FROM t1 +GROUP BY b +HAVING (SELECT MAX(b) FROM t1) = a AND a + b = 3; + +eval EXPLAIN FORMAT=JSON $q; +eval $q; + +let $q= +SELECT * FROM t1 +GROUP BY b +HAVING (SELECT MAX(b) FROM t1) = a AND a > b; + +eval EXPLAIN FORMAT=JSON $q; +eval $q; + +DROP TABLE t1; + +--echo End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/host_cache_size_functionality.test mariadb-10.11.9/mysql-test/main/host_cache_size_functionality.test --- mariadb-10.11.6/mysql-test/main/host_cache_size_functionality.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/host_cache_size_functionality.test 2024-08-03 07:29:57.000000000 +0000 @@ -43,10 +43,10 @@ --echo # Restart server with Host_Cache_Size 1 let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --shutdown_server --source include/wait_until_disconnected.inc --- exec echo "restart:--host_cache_size=1 " > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--host_cache_size=1 " $MYSQLTEST_VARDIR/tmp/mysqld.1.expect -- enable_reconnect -- source include/wait_until_connected_again.inc @@ -142,10 +142,10 @@ #--remove_file $MYSQL_TMP_DIR/bind_ip #let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect; -#--exec echo "wait" > $restart_file +#--write_line wait $restart_file #--shutdown_server #--source include/wait_until_disconnected.inc -#-- exec echo "restart:--bind-address=$bind_ip " > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +#-- write_line "restart:--bind-address=$bind_ip " $MYSQLTEST_VARDIR/tmp/mysqld.1.expect #-- enable_reconnect #-- source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/main/in_subq_cond_pushdown.result mariadb-10.11.9/mysql-test/main/in_subq_cond_pushdown.result --- mariadb-10.11.6/mysql-test/main/in_subq_cond_pushdown.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/in_subq_cond_pushdown.result 2024-08-03 07:29:57.000000000 +0000 @@ -74,21 +74,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` < 25", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` < 25", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -173,21 +175,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` > 55 and t2.f < 4", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` > 55 and t2.f < 4", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -274,21 +278,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -373,21 +379,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "(`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25) and t2.f > 2", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "(`MAX(t2.g)` > 60 or `MAX(t2.g)` < 25) and t2.f > 2", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -474,21 +482,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "t2.f > 1", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "t2.f > 1", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -573,21 +583,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(v1_y)` > 20", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t3", - "access_type": "ALL", - "rows": 8, - "filtered": 100, - "attached_condition": "t3.x > 1 and t3.x <= 3" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(v1_y)` > 20", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t3", + "access_type": "ALL", + "rows": 8, + "filtered": 100, + "attached_condition": "t3.x > 1 and t3.x <= 3" + } } - } - ] + ] + } } } } @@ -687,21 +699,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` > 20", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` > 20", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -788,20 +802,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e < 2" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e < 2" + } } - } - ] + ] + } } } } @@ -888,20 +904,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e > 2 and t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e > 2 and t2.e < 5" + } } - } - ] + ] + } } } } @@ -990,20 +1008,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e >= 4)" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e >= 4)" + } } - } - ] + ] + } } } } @@ -1088,20 +1108,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3" + } } - } - ] + ] + } } } } @@ -1186,20 +1208,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and (t2.e < 2 or t2.e = 5) and t2.f > 3" + } } - } - ] + ] + } } } } @@ -1284,20 +1308,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e < 2" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e < 2" + } } - } - ] + ] + } } } } @@ -1382,19 +1408,21 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e = 1" + "materialization": { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e = 1" + } } - } - ] + ] + } } } } @@ -1478,20 +1506,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e > 1" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e > 1" + } } - } - ] + ] + } } } } @@ -1574,20 +1604,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t3", - "access_type": "ALL", - "rows": 8, - "filtered": 100, - "attached_condition": "t3.x > 1 and t3.x <= 3 and t3.x < 3" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t3", + "access_type": "ALL", + "rows": 8, + "filtered": 100, + "attached_condition": "t3.x > 1 and t3.x <= 3 and t3.x < 3" + } } - } - ] + ] + } } } } @@ -1689,20 +1721,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e <= 3" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e <= 3" + } } - } - ] + ] + } } } } @@ -1788,21 +1822,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "t2.f < 3 or t2.f = 4", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e < 3" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "t2.f < 3 or t2.f = 4", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e < 3" + } } - } - ] + ] + } } } } @@ -1887,21 +1923,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "t2.e + `MAX(t2.g)` > 41", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "t2.e + `MAX(t2.g)` > 41", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -1988,21 +2026,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` - t2.e < 35", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` - t2.e < 35", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -2087,21 +2127,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` * t2.e > 100", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` * t2.e > 100", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -2190,21 +2232,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` / t2.e > 30", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` / t2.e > 30", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -2289,21 +2333,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "`MAX(t2.g)` between 50 and 100", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "`MAX(t2.g)` between 50 and 100", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } @@ -2388,20 +2434,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e + t2.f > 5" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e + t2.f > 5" + } } - } - ] + ] + } } } } @@ -2486,20 +2534,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e - t2.f > 0" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e - t2.f > 0" + } } - } - ] + ] + } } } } @@ -2584,20 +2634,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e * t2.f > 6" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e * t2.f > 6" + } } - } - ] + ] + } } } } @@ -2684,20 +2736,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.f / t2.e > 2" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.f / t2.e > 2" + } } - } - ] + ] + } } } } @@ -2788,20 +2842,22 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e between 1 and 3" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e between 1 and 3" + } } - } - ] + ] + } } } } @@ -2890,43 +2946,45 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "v2.max_g > 3", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "v2.e < 5", - "materialized": { - "query_block": { - "select_id": 3, - "having_condition": "max_g > 25", - "filesort": { - "sort_key": "t2.e", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "v2.max_g > 3", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "v2.e < 5", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "max_g > 25", + "filesort": { + "sort_key": "t2.e", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5" + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -3014,42 +3072,44 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "v2.e < 5 and v2.e > 1", - "materialized": { - "query_block": { - "select_id": 3, - "having_condition": "max_g > 25", - "filesort": { - "sort_key": "t2.e", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e > 1" + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "v2.e < 5 and v2.e > 1", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "max_g > 25", + "filesort": { + "sort_key": "t2.e", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e > 1" + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -3138,43 +3198,45 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "having_condition": "v2.max_g < 100", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "v2.e < 5 and v2.e > 1", - "materialized": { - "query_block": { - "select_id": 3, - "having_condition": "max_g > 25", - "filesort": { - "sort_key": "t2.e", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.e > 1" + "materialization": { + "query_block": { + "select_id": 2, + "having_condition": "v2.max_g < 100", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "v2.e < 5 and v2.e > 1", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "max_g > 25", + "filesort": { + "sort_key": "t2.e", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.e > 1" + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -3286,41 +3348,43 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "d_tab.e < 5 and d_tab.e > 1", - "materialized": { - "query_block": { - "select_id": 3, - "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1", - "filesort": { - "sort_key": "t2.f", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100 + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "d_tab.e < 5 and d_tab.e > 1", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1", + "filesort": { + "sort_key": "t2.f", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100 + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -3451,41 +3515,43 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "d_tab.e < 5 and d_tab.e > 1", - "materialized": { - "query_block": { - "select_id": 3, - "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1", - "filesort": { - "sort_key": "t2.f", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100 + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "d_tab.e < 5 and d_tab.e > 1", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1", + "filesort": { + "sort_key": "t2.f", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100 + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -3617,41 +3683,43 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "d_tab.e < 5 and d_tab.e > 1", - "materialized": { - "query_block": { - "select_id": 3, - "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1", - "filesort": { - "sort_key": "t2.f", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100 + "materialization": { + "query_block": { + "select_id": 2, + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "d_tab.e < 5 and d_tab.e > 1", + "materialized": { + "query_block": { + "select_id": 3, + "having_condition": "max_g > 25 and t2.e < 5 and t2.e > 1", + "filesort": { + "sort_key": "t2.f", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100 + } } - } - ] + ] + } } } } } } - } - ] + ] + } } } } @@ -3794,21 +3862,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "having_condition": "t2.f < 5", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e > 1 and t2.e < 5" + "materialization": { + "query_block": { + "select_id": 3, + "having_condition": "t2.f < 5", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e > 1 and t2.e < 5" + } } - } - ] + ] + } } } } @@ -3979,21 +4049,23 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 3, - "having_condition": "t2.f < 5", - "temporary_table": { - "nested_loop": [ - { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e > 1 and t2.e < 5" + "materialization": { + "query_block": { + "select_id": 3, + "having_condition": "t2.f < 5", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e > 1 and t2.e < 5" + } } - } - ] + ] + } } } } @@ -4088,28 +4160,30 @@ "filtered": 100, "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "window_functions_computation": { - "sorts": [ - { - "filesort": { - "sort_key": "t2.f" - } - } - ], - "temporary_table": { - "nested_loop": [ + "materialization": { + "query_block": { + "select_id": 2, + "window_functions_computation": { + "sorts": [ { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.f > 1" + "filesort": { + "sort_key": "t2.f" } } - ] + ], + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.f > 1" + } + } + ] + } } } } @@ -4196,28 +4270,30 @@ "attached_condition": "t1.c = ``.`CAST(SUM(t2.g) OVER (PARTITION BY t2.f) AS INT)`", "materialized": { "unique": 1, - "query_block": { - "select_id": 2, - "window_functions_computation": { - "sorts": [ - { - "filesort": { - "sort_key": "t2.f" - } - } - ], - "temporary_table": { - "nested_loop": [ + "materialization": { + "query_block": { + "select_id": 2, + "window_functions_computation": { + "sorts": [ { - "table": { - "table_name": "t2", - "access_type": "ALL", - "rows": 12, - "filtered": 100, - "attached_condition": "t2.e < 5 and t2.f > 1" + "filesort": { + "sort_key": "t2.f" } } - ] + ], + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 12, + "filtered": 100, + "attached_condition": "t2.e < 5 and t2.f > 1" + } + } + ] + } } } } diff -Nru mariadb-10.11.6/mysql-test/main/index_merge_myisam.result mariadb-10.11.9/mysql-test/main/index_merge_myisam.result --- mariadb-10.11.6/mysql-test/main/index_merge_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/index_merge_myisam.result 2024-08-03 07:29:57.000000000 +0000 @@ -371,47 +371,47 @@ insert into t4 values (1),(4),(3); set @save_join_buffer_size=@@join_buffer_size; set join_buffer_size= 4096; -explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 < 500000 or A.key2 < 3) and (B.key1 < 500000 or B.key2 < 3); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A index_merge i1,i2 i1,i2 4,4 NULL 1010 Using sort_union(i1,i2); Using where 1 SIMPLE B index_merge i1,i2 i1,i2 4,4 NULL 1010 Using sort_union(i1,i2); Using where; Using join buffer (flat, BNL join) -select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 < 500000 or A.key2 < 3) and (B.key1 < 500000 or B.key2 < 3); -max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +exp 10240 update t0 set key1=1; -explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 = 1 or A.key2 = 1) and (B.key1 = 1 or B.key2 = 1); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A index_merge i1,i2 i1,i2 4,4 NULL 1021 Using union(i1,i2); Using where 1 SIMPLE B index_merge i1,i2 i1,i2 4,4 NULL 1021 Using union(i1,i2); Using where; Using join buffer (flat, BNL join) -select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A force index(i1,i2), t0 as B force index (i1,i2) where (A.key1 = 1 or A.key2 = 1) and (B.key1 = 1 or B.key2 = 1); -max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +exp 8194 alter table t0 add filler1 char(200), add filler2 char(200), add filler3 char(200); update t0 set key2=1, key3=1, key4=1, key5=1,key6=1,key7=1 where key7 < 500; -explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +explain select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A straight_join t0 as B where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1) and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A index_merge i1,i2,i3,i4,i5,i6,i7?,i8 i2,i3,i4,i5,i6,i7?,i8 X NULL # Using union(intersect(i2,i3,i4,i5,i6,i7?),i8); Using where 1 SIMPLE B index_merge i1,i2,i3,i4,i5,i6,i7?,i8 i2,i3,i4,i5,i6,i7?,i8 X NULL # Using union(intersect(i2,i3,i4,i5,i6,i7?),i8); Using where; Using join buffer (flat, BNL join) -select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +select max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) as exp from t0 as A straight_join t0 as B where (A.key1 = 1 and A.key2 = 1 and A.key3 = 1 and A.key4=1 and A.key5=1 and A.key6=1 and A.key7 = 1 or A.key8=1) and (B.key1 = 1 and B.key2 = 1 and B.key3 = 1 and B.key4=1 and B.key5=1 and B.key6=1 and B.key7 = 1 or B.key8=1); -max(A.key1 + B.key1 + A.key2 + B.key2 + A.key3 + B.key3 + A.key4 + B.key4 + A.key5 + B.key5) +exp 8186 set join_buffer_size= @save_join_buffer_size; drop table t0, t1, t2, t3, t4; diff -Nru mariadb-10.11.6/mysql-test/main/information_schema2.result mariadb-10.11.9/mysql-test/main/information_schema2.result --- mariadb-10.11.6/mysql-test/main/information_schema2.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/information_schema2.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,3 +1,6 @@ +# +# MDEV-4029 SELECT on information_schema using a subquery locks up the information_schema table due to incorrect mutexes handling +# select variable_name from information_schema.session_status where variable_name = (select variable_name from information_schema.session_status where variable_name = 'uptime'); variable_name @@ -6,6 +9,9 @@ (select variable_name from information_schema.session_variables where variable_name = 'basedir'); variable_name BASEDIR +# +# MDEV-8796 Delete with sub query with information_schema.TABLES deletes too many rows +# create table t1 (x int); create table t2 (x int); create table t3 (x int); @@ -18,3 +24,15 @@ t3 t4 drop table t1, t2, t3, t4; +# End of 5.5 tests +# INFORMATION_SCHEMA.STATISTICS doesn't show if the index is disabled +create table t1 (a int, key(a)); +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +index_name comment +a +alter table t1 disable keys; +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +index_name comment +a disabled +drop table t1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/information_schema2.test mariadb-10.11.9/mysql-test/main/information_schema2.test --- mariadb-10.11.6/mysql-test/main/information_schema2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/information_schema2.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,15 +1,15 @@ -# -# MDEV-4029 SELECT on information_schema using a subquery locks up the information_schema table due to incorrect mutexes handling -# +--echo # +--echo # MDEV-4029 SELECT on information_schema using a subquery locks up the information_schema table due to incorrect mutexes handling +--echo # select variable_name from information_schema.session_status where variable_name = (select variable_name from information_schema.session_status where variable_name = 'uptime'); select variable_name from information_schema.session_variables where variable_name = (select variable_name from information_schema.session_variables where variable_name = 'basedir'); -# -# MDEV-8796 Delete with sub query with information_schema.TABLES deletes too many rows -# +--echo # +--echo # MDEV-8796 Delete with sub query with information_schema.TABLES deletes too many rows +--echo # create table t1 (x int); create table t2 (x int); create table t3 (x int); @@ -17,3 +17,14 @@ delete from t4 where table_name not in (select table_name from information_schema.TABLES where table_schema = database() and table_type = 'BASE TABLE'); select * from t4 order by table_name; drop table t1, t2, t3, t4; + +--echo # End of 5.5 tests + +--echo # INFORMATION_SCHEMA.STATISTICS doesn't show if the index is disabled +create table t1 (a int, key(a)); +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +alter table t1 disable keys; +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +drop table t1; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/init_file_set_password-7656.test mariadb-10.11.9/mysql-test/main/init_file_set_password-7656.test --- mariadb-10.11.6/mysql-test/main/init_file_set_password-7656.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/init_file_set_password-7656.test 2024-08-03 07:29:57.000000000 +0000 @@ -15,12 +15,12 @@ --enable_reconnect ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc ---exec echo "restart:--init-file=$MYSQLTEST_VARDIR/init.file " > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--init-file=$MYSQLTEST_VARDIR/init.file " $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/wait_until_connected_again.inc select user,host,password,plugin,authentication_string from mysql.user where user='foo'; diff -Nru mariadb-10.11.6/mysql-test/main/innodb_ext_key,covering,on.rdiff mariadb-10.11.9/mysql-test/main/innodb_ext_key,covering,on.rdiff --- mariadb-10.11.6/mysql-test/main/innodb_ext_key,covering,on.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/innodb_ext_key,covering,on.rdiff 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,20 @@ +--- ./main/innodb_ext_key.result ++++ ./main/innodb_ext_key.reject +@@ -244,7 +244,7 @@ + Variable_name Value + Handler_read_first 0 + Handler_read_key 21 +-Handler_read_last 1 ++Handler_read_last 0 + Handler_read_next 0 + Handler_read_prev 0 + Handler_read_retry 0 +@@ -266,7 +266,7 @@ + Variable_name Value + Handler_read_first 0 + Handler_read_key 6 +-Handler_read_last 1 ++Handler_read_last 0 + Handler_read_next 0 + Handler_read_prev 0 + Handler_read_retry 0 diff -Nru mariadb-10.11.6/mysql-test/main/innodb_ext_key,off.rdiff mariadb-10.11.9/mysql-test/main/innodb_ext_key,off.rdiff --- mariadb-10.11.6/mysql-test/main/innodb_ext_key,off.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/innodb_ext_key,off.rdiff 2024-08-03 07:29:57.000000000 +0000 @@ -163,7 +163,7 @@ where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000 @@ -220,12 +220,12 @@ 5959 3 - show status like 'handler_read_next'; + show /*a*/ status like 'handler_read_next'; Variable_name Value -Handler_read_next 3 +Handler_read_next 9 @@ -177,7 +177,7 @@ select max(l_orderkey) from lineitem where l_partkey between 1 and 10 group by l_partkey; @@ -243,9 +243,9 @@ - show status like 'handler_read%'; + show /*b*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 -Handler_read_key 21 @@ -199,7 +199,7 @@ select max(l_orderkey) from lineitem where l_suppkey in (1,4) group by l_suppkey; @@ -265,9 +265,9 @@ - show status like 'handler_read%'; + show /*c*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 -Handler_read_key 6 diff -Nru mariadb-10.11.6/mysql-test/main/innodb_ext_key,on,unoptimized.rdiff mariadb-10.11.9/mysql-test/main/innodb_ext_key,on,unoptimized.rdiff --- mariadb-10.11.6/mysql-test/main/innodb_ext_key,on,unoptimized.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/innodb_ext_key,on,unoptimized.rdiff 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,20 @@ +--- ./main/innodb_ext_key.result ++++ ./main/innodb_ext_key.reject +@@ -244,7 +244,7 @@ + Variable_name Value + Handler_read_first 0 + Handler_read_key 21 +-Handler_read_last 1 ++Handler_read_last 0 + Handler_read_next 0 + Handler_read_prev 0 + Handler_read_retry 0 +@@ -266,7 +266,7 @@ + Variable_name Value + Handler_read_first 0 + Handler_read_key 6 +-Handler_read_last 1 ++Handler_read_last 0 + Handler_read_next 0 + Handler_read_prev 0 + Handler_read_retry 0 diff -Nru mariadb-10.11.6/mysql-test/main/innodb_ext_key.result mariadb-10.11.9/mysql-test/main/innodb_ext_key.result --- mariadb-10.11.6/mysql-test/main/innodb_ext_key.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/innodb_ext_key.result 2024-08-03 07:29:57.000000000 +0000 @@ -14,7 +14,7 @@ select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01'; count(*) 1 -show status like 'handler_read%'; +show /*1*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 1 @@ -35,7 +35,7 @@ where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01'; count(*) 1 -show status like 'handler_read%'; +show /*2*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 1 @@ -56,7 +56,7 @@ where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000; count(*) 1 -show status like 'handler_read%'; +show /*3*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 1 @@ -79,7 +79,7 @@ 1088 3 1217 1 1221 3 -show status like 'handler_read%'; +show /*4*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 1 @@ -98,7 +98,7 @@ select min(l_orderkey) from lineitem where l_shipdate='1992-07-01'; min(l_orderkey) 130 -show status like 'handler_read%'; +show /*5*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 1 @@ -119,7 +119,7 @@ where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000; min(l_orderkey) 1088 -show status like 'handler_read%'; +show /*6*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 1 @@ -140,7 +140,7 @@ where l_shipdate='1992-07-01' and l_orderkey=130; max(l_linenumber) 2 -show status like 'handler_read%'; +show /*7*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 1 @@ -166,7 +166,7 @@ l_orderkey l_linenumber 130 2 5603 2 -show status like 'handler_read%'; +show /*8*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 2 @@ -193,7 +193,7 @@ 130 2 5603 2 5959 3 -show status like 'handler_read%'; +show /*9*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 2 @@ -218,7 +218,7 @@ 130 2 5603 2 5959 3 -show status like 'handler_read_next'; +show /*a*/ status like 'handler_read_next'; Variable_name Value Handler_read_next 3 explain @@ -240,7 +240,7 @@ 5894 5859 5632 -show status like 'handler_read%'; +show /*b*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 21 @@ -262,7 +262,7 @@ max(l_orderkey) 5988 5984 -show status like 'handler_read%'; +show /*c*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 6 @@ -292,7 +292,7 @@ and o_orderkey=l_orderkey and p_partkey=l_partkey; o_orderkey p_partkey 5895 200 -show status like 'handler_read%'; +show /*d*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 3 @@ -457,7 +457,7 @@ a pk a b 0 0 0 0 1 1 1 1 -show status like 'handler_read%'; +show /*e*/ status like 'handler_read%'; Variable_name Value Handler_read_first 0 Handler_read_key 10 diff -Nru mariadb-10.11.6/mysql-test/main/innodb_ext_key.test mariadb-10.11.9/mysql-test/main/innodb_ext_key.test --- mariadb-10.11.6/mysql-test/main/innodb_ext_key.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/innodb_ext_key.test 2024-08-03 07:29:57.000000000 +0000 @@ -5,6 +5,8 @@ --source include/innodb_prefix_index_cluster_optimization.inc --source include/no_valgrind_without_big.inc +--source include/innodb_stable_estimates.inc + SET SESSION DEFAULT_STORAGE_ENGINE='InnoDB'; set @innodb_stats_persistent_save= @@innodb_stats_persistent; @@ -32,7 +34,7 @@ select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01'; flush status; select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01'; -show status like 'handler_read%'; +show /*1*/ status like 'handler_read%'; explain select count(*) from lineitem use index(primary) @@ -40,7 +42,7 @@ flush status; select count(*) from lineitem use index(primary) where l_orderkey=130 and l_linenumber=2 and l_shipdate='1992-07-01'; -show status like 'handler_read%'; +show /*2*/ status like 'handler_read%'; explain select count(*) from lineitem @@ -48,7 +50,7 @@ flush status; select count(*) from lineitem where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000; -show status like 'handler_read%'; +show /*3*/ status like 'handler_read%'; explain select l_orderkey, l_linenumber from lineitem @@ -56,13 +58,13 @@ flush status; select l_orderkey, l_linenumber from lineitem where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000; -show status like 'handler_read%'; +show /*4*/ status like 'handler_read%'; explain select min(l_orderkey) from lineitem where l_shipdate='1992-07-01'; flush status; select min(l_orderkey) from lineitem where l_shipdate='1992-07-01'; -show status like 'handler_read%'; +show /*5*/ status like 'handler_read%'; explain select min(l_orderkey) from lineitem @@ -70,7 +72,7 @@ flush status; select min(l_orderkey) from lineitem where l_shipdate='1992-07-01' and l_orderkey between 1001 and 2000; -show status like 'handler_read%'; +show /*6*/ status like 'handler_read%'; explain select max(l_linenumber) from lineitem @@ -78,7 +80,7 @@ flush status; select max(l_linenumber) from lineitem where l_shipdate='1992-07-01' and l_orderkey=130; -show status like 'handler_read%'; +show /*7*/ status like 'handler_read%'; explain select l_orderkey, l_linenumber @@ -90,7 +92,7 @@ from lineitem use index (i_l_shipdate, i_l_receiptdate) where l_shipdate='1992-07-01' and l_orderkey=130 or l_receiptdate='1992-07-01' and l_orderkey=5603; -show status like 'handler_read%'; +show /*8*/ status like 'handler_read%'; --replace_column 7 # explain @@ -103,7 +105,7 @@ from lineitem use index (i_l_shipdate, i_l_receiptdate) where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000 or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000; -show status like 'handler_read%'; +show /*9*/ status like 'handler_read%'; --replace_column 7 # 9 # 10 Using explain @@ -114,7 +116,7 @@ select l_orderkey, l_linenumber from lineitem where l_shipdate='1992-07-01' and l_orderkey between 1 and 1000 or l_receiptdate='1992-07-01' and l_orderkey between 5001 and 6000; -show status like 'handler_read_next'; +show /*a*/ status like 'handler_read_next'; --replace_column 9 # explain @@ -123,7 +125,7 @@ flush status; select max(l_orderkey) from lineitem where l_partkey between 1 and 10 group by l_partkey; -show status like 'handler_read%'; +show /*b*/ status like 'handler_read%'; --replace_column 9 # explain @@ -132,7 +134,7 @@ flush status; select max(l_orderkey) from lineitem where l_suppkey in (1,4) group by l_suppkey; -show status like 'handler_read%'; +show /*c*/ status like 'handler_read%'; create index i_p_retailprice on part(p_retailprice); @@ -149,7 +151,7 @@ lineitem use index (i_l_partkey), orders where p_retailprice > 1100 and o_orderdate='1997-01-01' and o_orderkey=l_orderkey and p_partkey=l_partkey; -show status like 'handler_read%'; +show /*d*/ status like 'handler_read%'; --enable_ps2_protocol --echo # @@ -325,7 +327,7 @@ select * from t1, t2 where t2.a=t1.a and t2.b < 2; flush status; select * from t1, t2 where t2.a=t1.a and t2.b < 2; -show status like 'handler_read%'; +show /*e*/ status like 'handler_read%'; --enable_ps2_protocol drop table t1,t2; diff -Nru mariadb-10.11.6/mysql-test/main/insert_select.result mariadb-10.11.9/mysql-test/main/insert_select.result --- mariadb-10.11.6/mysql-test/main/insert_select.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/insert_select.result 2024-08-03 07:29:57.000000000 +0000 @@ -973,7 +973,6 @@ a 3 1 -2 delete from t1; insert into t1 values (3), (1); insert into t1 @@ -984,8 +983,6 @@ a 3 1 -3 -2 delete from t1; insert into t1 values (3), (1); insert into t1 @@ -996,6 +993,7 @@ a 3 1 +3 2 delete from t1; insert into t1 values (3), (1); @@ -1022,7 +1020,6 @@ a 3 1 -2 delete from t1; insert into t1 values (3), (1); execute stmt; @@ -1030,7 +1027,6 @@ a 3 1 -2 delete from t1; insert into t1 values (3), (1); delete from t1 @@ -1040,6 +1036,8 @@ where a = 1))); select * from t1; a +3 +1 deallocate prepare stmt; drop table t1,t2,t3; # diff -Nru mariadb-10.11.6/mysql-test/main/item_types.result mariadb-10.11.9/mysql-test/main/item_types.result --- mariadb-10.11.6/mysql-test/main/item_types.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/item_types.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,16 @@ +# +# MDEV-34634 Types mismatch when cloning items causes debug assertion +# +CREATE TABLE t1 (a DATETIME); +SET optimizer_switch='derived_merge=off'; +SELECT * FROM (SELECT * FROM t1) AS t1 WHERE a=''; +a +Warnings: +Warning 1292 Truncated incorrect datetime value: '' +DROP TABLE t1; +CREATE TABLE t1 (c YEAR); +CREATE TABLE t2 (c INT); +SELECT * FROM t1 JOIN t2 ON t1.c=t2.c WHERE t1.c<=>5; +c c +DROP TABLE t1, t2; +SET optimizer_switch=default; diff -Nru mariadb-10.11.6/mysql-test/main/item_types.test mariadb-10.11.9/mysql-test/main/item_types.test --- mariadb-10.11.6/mysql-test/main/item_types.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/item_types.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,15 @@ +--echo # +--echo # MDEV-34634 Types mismatch when cloning items causes debug assertion +--echo # + +CREATE TABLE t1 (a DATETIME); +SET optimizer_switch='derived_merge=off'; +SELECT * FROM (SELECT * FROM t1) AS t1 WHERE a=''; +DROP TABLE t1; + +CREATE TABLE t1 (c YEAR); +CREATE TABLE t2 (c INT); +SELECT * FROM t1 JOIN t2 ON t1.c=t2.c WHERE t1.c<=>5; +DROP TABLE t1, t2; + +SET optimizer_switch=default; diff -Nru mariadb-10.11.6/mysql-test/main/join.result mariadb-10.11.9/mysql-test/main/join.result --- mariadb-10.11.6/mysql-test/main/join.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/join.result 2024-08-03 07:29:57.000000000 +0000 @@ -894,7 +894,7 @@ Variable_name Value Last_query_cost 4.016090 select 'The cost of accessing t1 (dont care if it changes' '^'; -The cost of accessing t1 (dont care if it changes +The cost of accessing t1 (dont care if it changes^ The cost of accessing t1 (dont care if it changes^ select 'vv: Following query must use ALL(t1), eq_ref(A), eq_ref(B): vv' Z; Z @@ -3423,6 +3423,62 @@ COUNT(*) 2 DROP TABLE t1, t2, t3; +# +# MDEV-30975: Wrong result with cross Join given join order +# +CREATE TABLE `t1` ( +`t1_seq` INT NOT NULL, +`c1` VARCHAR(10) NOT NULL , +PRIMARY KEY (`t1_seq`) USING BTREE +); +CREATE TABLE `t2` ( +`t2_seq` INT NOT NULL, +`t1_seq` INT NOT NULL, +`c2` VARCHAR(10) NOT NULL , +PRIMARY KEY (`t2_seq`, `t1_seq`) USING BTREE +); +INSERT INTO t1 VALUES(1, 'A'); +INSERT INTO t2 VALUES(1, 1, 'T2-1-1'); +INSERT INTO t2 VALUES(2, 1, 'T2-1-2'); +INSERT INTO t2 VALUES(3, 1, 'T2-1-3'); +SELECT LPAD(@rownum := @rownum + 1, 8, 0) AS str_num +, t1.t1_seq +, t2.t2_seq +, t1.c1 +, t2.c2 +FROM t1 +INNER JOIN t2 ON (t1.t1_seq = t2.t1_seq) +CROSS JOIN ( SELECT @rownum := 0 ) X; +str_num t1_seq t2_seq c1 c2 +00000001 1 1 A T2-1-1 +00000002 1 2 A T2-1-2 +00000003 1 3 A T2-1-3 +SELECT STRAIGHT_JOIN LPAD(@rownum := @rownum + 1, 8, 0) AS str_num +, t1.t1_seq +, t2.t2_seq +, t1.c1 +, t2.c2 +FROM t1 +INNER JOIN t2 ON (t1.t1_seq = t2.t1_seq) +CROSS JOIN ( SELECT @rownum := 0 ) X; +str_num t1_seq t2_seq c1 c2 +00000001 1 1 A T2-1-1 +00000002 1 2 A T2-1-2 +00000003 1 3 A T2-1-3 +SELECT STRAIGHT_JOIN * FROM t1 JOIN t2 ON (t1.t1_seq = t2.t1_seq) JOIN (SELECT @a := 0) x; +t1_seq c1 t2_seq t1_seq c2 @a := 0 +1 A 1 1 T2-1-1 0 +1 A 2 1 T2-1-2 0 +1 A 3 1 T2-1-3 0 +SELECT * FROM t1 JOIN t2 ON (t1.t1_seq = t2.t1_seq) JOIN (SELECT @a := 0) x; +t1_seq c1 t2_seq t1_seq c2 @a := 0 +1 A 1 1 T2-1-1 0 +1 A 2 1 T2-1-2 0 +1 A 3 1 T2-1-3 0 +SELECT STRAIGHT_JOIN c1 FROM t1 JOIN (SELECT @a := 0) x; +c1 +A +DROP TABLE t1, t2; # End of 10.5 tests # # MDEV-31449: Assertion s->table->opt_range_condition_rows <= s->found_records diff -Nru mariadb-10.11.6/mysql-test/main/join.test mariadb-10.11.9/mysql-test/main/join.test --- mariadb-10.11.6/mysql-test/main/join.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/join.test 2024-08-03 07:29:57.000000000 +0000 @@ -1838,6 +1838,52 @@ SELECT COUNT(*) FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b = t3.c) ON t1.a = t2.b; DROP TABLE t1, t2, t3; +--echo # +--echo # MDEV-30975: Wrong result with cross Join given join order +--echo # + +CREATE TABLE `t1` ( + `t1_seq` INT NOT NULL, + `c1` VARCHAR(10) NOT NULL , + PRIMARY KEY (`t1_seq`) USING BTREE +); + +CREATE TABLE `t2` ( + `t2_seq` INT NOT NULL, + `t1_seq` INT NOT NULL, + `c2` VARCHAR(10) NOT NULL , + PRIMARY KEY (`t2_seq`, `t1_seq`) USING BTREE +); + +INSERT INTO t1 VALUES(1, 'A'); +INSERT INTO t2 VALUES(1, 1, 'T2-1-1'); +INSERT INTO t2 VALUES(2, 1, 'T2-1-2'); +INSERT INTO t2 VALUES(3, 1, 'T2-1-3'); + +SELECT LPAD(@rownum := @rownum + 1, 8, 0) AS str_num + , t1.t1_seq + , t2.t2_seq + , t1.c1 + , t2.c2 + FROM t1 + INNER JOIN t2 ON (t1.t1_seq = t2.t1_seq) + CROSS JOIN ( SELECT @rownum := 0 ) X; + +SELECT STRAIGHT_JOIN LPAD(@rownum := @rownum + 1, 8, 0) AS str_num + , t1.t1_seq + , t2.t2_seq + , t1.c1 + , t2.c2 + FROM t1 + INNER JOIN t2 ON (t1.t1_seq = t2.t1_seq) + CROSS JOIN ( SELECT @rownum := 0 ) X; + +SELECT STRAIGHT_JOIN * FROM t1 JOIN t2 ON (t1.t1_seq = t2.t1_seq) JOIN (SELECT @a := 0) x; +SELECT * FROM t1 JOIN t2 ON (t1.t1_seq = t2.t1_seq) JOIN (SELECT @a := 0) x; +SELECT STRAIGHT_JOIN c1 FROM t1 JOIN (SELECT @a := 0) x; + +DROP TABLE t1, t2; + --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/join_cache.result mariadb-10.11.9/mysql-test/main/join_cache.result --- mariadb-10.11.6/mysql-test/main/join_cache.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/join_cache.result 2024-08-03 07:29:57.000000000 +0000 @@ -917,7 +917,7 @@ ?iauliai Panevezys EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE @@ -925,12 +925,12 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Country ALL NULL NULL NULL NULL 239 Using where 1 SIMPLE CountryLanguage hash_ALL PRIMARY #hash#PRIMARY 33 world.Country.Code,const 984 Using where; Using join buffer (flat, BNLH join) -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -Name IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +Name epx Australia 81.2 United Kingdom 97.3 Canada 60.4 @@ -1117,7 +1117,7 @@ ?iauliai Panevezys EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE @@ -1125,12 +1125,12 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Country ALL NULL NULL NULL NULL 239 Using where 1 SIMPLE CountryLanguage hash_ALL PRIMARY #hash#PRIMARY 33 world.Country.Code,const 984 Using where; Using join buffer (flat, BNLH join) -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -Name IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +Name epx Australia 81.2 United Kingdom 97.3 Canada 60.4 @@ -1376,7 +1376,7 @@ ?iauliai Panevezys EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE @@ -1384,12 +1384,12 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Country ALL NULL NULL NULL NULL 239 Using where 1 SIMPLE CountryLanguage eq_ref PRIMARY PRIMARY 33 world.Country.Code,const 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -Name IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +Name epx Australia 81.2 United Kingdom 97.3 Canada 60.4 @@ -1573,7 +1573,7 @@ ?iauliai Panevezys EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE @@ -1581,12 +1581,12 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Country ALL NULL NULL NULL NULL 239 Using where 1 SIMPLE CountryLanguage eq_ref PRIMARY PRIMARY 33 world.Country.Code,const 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -Name IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +Name epx Australia 81.2 United Kingdom 97.3 Canada 60.4 @@ -1770,7 +1770,7 @@ ?iauliai Panevezys EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE @@ -1778,12 +1778,12 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Country ALL NULL NULL NULL NULL 239 Using where 1 SIMPLE CountryLanguage eq_ref PRIMARY PRIMARY 33 world.Country.Code,const 1 Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -Name IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +Name epx Australia 81.2 United Kingdom 97.3 Canada 60.4 @@ -1967,7 +1967,7 @@ ?iauliai Panevezys EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE @@ -1975,12 +1975,12 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE Country ALL NULL NULL NULL NULL 239 Using where 1 SIMPLE CountryLanguage eq_ref PRIMARY PRIMARY 33 world.Country.Code,const 1 Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -Name IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +Name epx Australia 81.2 United Kingdom 97.3 Canada 60.4 @@ -6401,5 +6401,47 @@ 10 NULL NULL NULL NULL DROP TABLE t1,t2,t3,t4; # +# MDEV-21102: Server crashes in JOIN_CACHE::write_record_data upon EXPLAIN with subqueries and constant tables +# +CREATE TABLE t1 (a int, b int) ENGINE=MyISAM; +CREATE TABLE t2 (c int, d int) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1,10); +CREATE TABLE t3 (e int, key (e)) ENGINE=MyISAM; +INSERT INTO t3 VALUES (2),(3); +# Must not crash, must use join buffer in subquery +EXPLAIN +SELECT * FROM t1 +WHERE a > b OR a IN ( +SELECT c FROM t2 WHERE EXISTS ( +SELECT * FROM t3 t3a JOIN t3 t3b WHERE t3a.e < d +) +); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +2 DEPENDENT SUBQUERY t2 system NULL NULL NULL NULL 1 +3 SUBQUERY t3a range e e 5 NULL 2 Using where; Using index +3 SUBQUERY t3b index NULL e 5 NULL 2 Using index; Using join buffer (flat, BNL join) +DROP TABLE t1,t2,t3; +# # End of 10.4 tests # +# +# MDEV-34580: Assertion `(key_part->key_part_flag & 4) == 0' failed key_hashnr +# +SET join_cache_level=3; +CREATE TABLE t1 ( a TIMESTAMP , b varchar(100), c varchar(10) ) ; +INSERT INTO t1 (b,c) VALUES ('GHOBS','EMLCG'),('t','p'); +CREATE TABLE t2 (a varchar(100), b varchar(100), c varchar(10) , KEY b (b(66))) ; +insert into t2 select seq, seq, seq from seq_1_to_20; +explain +SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where +1 SIMPLE t2 hash_ALL b #hash#b 69 test.t1.b 20 Using where; Using join buffer (flat, BNLH join) +SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ; +a +set join_cache_level=default; +DROP TABLE t1, t2; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/join_cache.test mariadb-10.11.9/mysql-test/main/join_cache.test --- mariadb-10.11.6/mysql-test/main/join_cache.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/join_cache.test 2024-08-03 07:29:57.000000000 +0000 @@ -411,24 +411,19 @@ WHERE City.Country IN (SELECT Code FROM Country WHERE Country.Name LIKE 'L%') AND City.Population > 100000; -#enable after fix MDEV-27871 ---disable_view_protocol - EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; ---enable_view_protocol - show variables like 'join_buffer_size'; set join_cache_level=4; show variables like 'join_cache_level'; @@ -470,24 +465,19 @@ WHERE City.Country IN (SELECT Code FROM Country WHERE Country.Name LIKE 'L%') AND City.Population > 100000; -#enable after fix MDEV-27871 ---disable_view_protocol - EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; ---enable_view_protocol - --replace_column 9 # EXPLAIN SELECT Country.Name, Country.Population, City.Name, City.Population @@ -558,24 +548,19 @@ WHERE City.Country IN (SELECT Code FROM Country WHERE Country.Name LIKE 'L%') AND City.Population > 100000; -#enable after fix MDEV-27871 ---disable_view_protocol - EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; ---enable_view_protocol - set join_cache_level=6; show variables like 'join_cache_level'; @@ -616,24 +601,19 @@ WHERE City.Country IN (SELECT Code FROM Country WHERE Country.Name LIKE 'L%') AND City.Population > 100000; -#enable after fix MDEV-27871 ---disable_view_protocol - EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; ---enable_view_protocol - set join_cache_level=7; show variables like 'join_cache_level'; @@ -674,24 +654,19 @@ WHERE City.Country IN (SELECT Code FROM Country WHERE Country.Name LIKE 'L%') AND City.Population > 100000; -#enable after fix MDEV-27871 ---disable_view_protocol - EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; ---enable_view_protocol - set join_cache_level=8; show variables like 'join_cache_level'; @@ -732,23 +707,19 @@ WHERE City.Country IN (SELECT Code FROM Country WHERE Country.Name LIKE 'L%') AND City.Population > 100000; -#enable after fix MDEV-27871 ---disable_view_protocol - EXPLAIN -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; -SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) +SELECT Country.Name, IF(ISNULL(CountryLanguage.Country), NULL, CountryLanguage.Percentage) as epx FROM Country LEFT JOIN CountryLanguage ON (CountryLanguage.Country=Country.Code AND Language='English') WHERE Country.Population > 10000000; ---enable_view_protocol set join_buffer_size=256; show variables like 'join_buffer_size'; @@ -4305,5 +4276,48 @@ DROP TABLE t1,t2,t3,t4; --echo # +--echo # MDEV-21102: Server crashes in JOIN_CACHE::write_record_data upon EXPLAIN with subqueries and constant tables +--echo # +CREATE TABLE t1 (a int, b int) ENGINE=MyISAM; + +CREATE TABLE t2 (c int, d int) ENGINE=MyISAM; +INSERT INTO t2 VALUES (1,10); + +CREATE TABLE t3 (e int, key (e)) ENGINE=MyISAM; +INSERT INTO t3 VALUES (2),(3); + +--echo # Must not crash, must use join buffer in subquery +EXPLAIN +SELECT * FROM t1 +WHERE a > b OR a IN ( + SELECT c FROM t2 WHERE EXISTS ( + SELECT * FROM t3 t3a JOIN t3 t3b WHERE t3a.e < d + ) +); +DROP TABLE t1,t2,t3; + +--echo # --echo # End of 10.4 tests --echo # + +--echo # +--echo # MDEV-34580: Assertion `(key_part->key_part_flag & 4) == 0' failed key_hashnr +--echo # +--source include/have_sequence.inc +SET join_cache_level=3; + +CREATE TABLE t1 ( a TIMESTAMP , b varchar(100), c varchar(10) ) ; +INSERT INTO t1 (b,c) VALUES ('GHOBS','EMLCG'),('t','p'); + +CREATE TABLE t2 (a varchar(100), b varchar(100), c varchar(10) , KEY b (b(66))) ; +insert into t2 select seq, seq, seq from seq_1_to_20; + +explain +SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ; +SELECT t1.a FROM t1 JOIN t2 ON t1.b = t2.b ; + +set join_cache_level=default; +DROP TABLE t1, t2; +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/join_outer.test mariadb-10.11.9/mysql-test/main/join_outer.test --- mariadb-10.11.6/mysql-test/main/join_outer.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/join_outer.test 2024-08-03 07:29:57.000000000 +0000 @@ -685,15 +685,9 @@ create table t2 (a int, c varchar(20)); insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb"); insert into t2 values (1,"cccccccccc"),(2,"dddddddddd"); -#Enable after fix MDEV-31276 ---disable_ps2_protocol select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by t1.a; ---enable_ps2_protocol select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by t1.a; -#Enable after fix MDEV-31276 ---disable_ps2_protocol select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by a; ---enable_ps2_protocol select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by a; drop table t1, t2; set group_concat_max_len=default; @@ -2372,11 +2366,8 @@ left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T on T.ElectionID = t1.Election limit 9; -#enable after fix MDEV-31277 ---disable_ps2_protocol # limit X causes merge algorithm select as opposed to temp table select * from v1; ---enable_ps2_protocol drop table t1, t2; drop view v1; @@ -2391,10 +2382,7 @@ create table t30 (c int); insert into t30 values (1),(3); create view v20 as select * from t30 left join (select 'X' as x, v10.u, v10.y, v10.b from v10) dt2 on t30.c=dt2.b limit 6; -#check after fix MDEV-31277 ---disable_ps2_protocol select * from v20 limit 9; ---enable_ps2_protocol drop view v10, v20; drop table t10, t20, t30; @@ -2408,8 +2396,6 @@ create table t1 (a int); insert into t1 values (1),(2),(7),(1); -#check after fix MDEV-31277 ---disable_ps2_protocol select * from ( select * from @@ -2422,7 +2408,6 @@ on dt1.a=dt2.b limit 9 ) dt; ---enable_ps2_protocol ## Same as dt3 above create view v3(x,c) as select * from (select 'X' as x, t3.c from t3) dt3; @@ -2436,10 +2421,7 @@ # Same as above select statement create view v1 as select 'Z' as z, t1.a, v0.* from t1 left join v0 on t1.a=v0.b limit 9; -#check after fix MDEV-31277 ---disable_ps2_protocol select * from v1; ---enable_ps2_protocol set statement join_cache_level=0 for select * from v1; diff -Nru mariadb-10.11.6/mysql-test/main/json_debug_nonembedded.result mariadb-10.11.9/mysql-test/main/json_debug_nonembedded.result --- mariadb-10.11.6/mysql-test/main/json_debug_nonembedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/json_debug_nonembedded.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -# -# MDEV-28762: recursive call of some json functions without stack control -# -SET @saved_dbug = @@debug_dbug; -SET debug_dbug='+d,json_check_min_stack_requirement'; -SET @json1= '{"key1":"val1"}'; -SET @json2= '{"key1":"val1"}'; -SELECT JSON_OVERLAPS(@json1, @json2); -ERROR HY000: Thread stack overrun: 'used bytes' used of a 'available' byte stack, and 'X' bytes needed. Consider increasing the thread_stack system variable. -SET @@debug_dbug= @saved_dbug; -# -# End of 10.9 test -# diff -Nru mariadb-10.11.6/mysql-test/main/json_debug_nonembedded.test mariadb-10.11.9/mysql-test/main/json_debug_nonembedded.test --- mariadb-10.11.6/mysql-test/main/json_debug_nonembedded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/json_debug_nonembedded.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ --- source include/not_embedded.inc ---source include/have_debug.inc - ---echo # ---echo # MDEV-28762: recursive call of some json functions without stack control ---echo # - -SET @saved_dbug = @@debug_dbug; -SET debug_dbug='+d,json_check_min_stack_requirement'; - -SET @json1= '{"key1":"val1"}'; -SET @json2= '{"key1":"val1"}'; - ---replace_regex /overrun: [0-9]* bytes used of a [0-9]* byte stack, and [0-9]* bytes needed/overrun: 'used bytes' used of a 'available' byte stack, and 'X' bytes needed/ ---error ER_STACK_OVERRUN_NEED_MORE -SELECT JSON_OVERLAPS(@json1, @json2); - -SET @@debug_dbug= @saved_dbug; - ---echo # ---echo # End of 10.9 test ---echo # diff -Nru mariadb-10.11.6/mysql-test/main/json_debug_nonembedded_noasan.result mariadb-10.11.9/mysql-test/main/json_debug_nonembedded_noasan.result --- mariadb-10.11.6/mysql-test/main/json_debug_nonembedded_noasan.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/json_debug_nonembedded_noasan.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,13 @@ +# +# MDEV-28762: recursive call of some json functions without stack control +# +SET @saved_dbug = @@debug_dbug; +SET debug_dbug='+d,json_check_min_stack_requirement'; +SET @json1= '{"key1":"val1"}'; +SET @json2= '{"key1":"val1"}'; +SELECT JSON_OVERLAPS(@json1, @json2); +ERROR HY000: Thread stack overrun: 'used bytes' used of a 'available' byte stack, and 'X' bytes needed. Consider increasing the thread_stack system variable. +SET @@debug_dbug= @saved_dbug; +# +# End of 10.9 test +# diff -Nru mariadb-10.11.6/mysql-test/main/json_debug_nonembedded_noasan.test mariadb-10.11.9/mysql-test/main/json_debug_nonembedded_noasan.test --- mariadb-10.11.6/mysql-test/main/json_debug_nonembedded_noasan.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/json_debug_nonembedded_noasan.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,23 @@ +-- source include/not_embedded.inc +--source include/have_debug.inc +--source include/not_asan.inc + +--echo # +--echo # MDEV-28762: recursive call of some json functions without stack control +--echo # + +SET @saved_dbug = @@debug_dbug; +SET debug_dbug='+d,json_check_min_stack_requirement'; + +SET @json1= '{"key1":"val1"}'; +SET @json2= '{"key1":"val1"}'; + +--replace_regex /overrun: [0-9]* bytes used of a [0-9]* byte stack, and [0-9]* bytes needed/overrun: 'used bytes' used of a 'available' byte stack, and 'X' bytes needed/ +--error ER_STACK_OVERRUN_NEED_MORE +SELECT JSON_OVERLAPS(@json1, @json2); + +SET @@debug_dbug= @saved_dbug; + +--echo # +--echo # End of 10.9 test +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/json_equals.result mariadb-10.11.9/mysql-test/main/json_equals.result --- mariadb-10.11.6/mysql-test/main/json_equals.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/json_equals.result 2024-08-03 07:29:57.000000000 +0000 @@ -23,14 +23,12 @@ json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3]}') 1 select json_equals('{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}', -'{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}'); -json_equals('{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}', -'{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}') +'{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}') as je; +je 1 select json_equals('{"a" : [0.123456789123456789], "b" : [1, 2, 3]}', -'{"b" : [1, 2, 3], "a" : [0.123456789123456789]}'); -json_equals('{"a" : [0.123456789123456789], "b" : [1, 2, 3]}', -'{"b" : [1, 2, 3], "a" : [0.123456789123456789]}') +'{"b" : [1, 2, 3], "a" : [0.123456789123456789]}') as je; +je 1 # # Test max json depth for json_equals. diff -Nru mariadb-10.11.6/mysql-test/main/json_equals.test mariadb-10.11.9/mysql-test/main/json_equals.test --- mariadb-10.11.6/mysql-test/main/json_equals.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/json_equals.test 2024-08-03 07:29:57.000000000 +0000 @@ -15,14 +15,11 @@ select json_equals('{"a":[1, 2, 3]}', '{"a":[1, 2, 3]}'); -#enable after fix MDEV-27871 ---disable_view_protocol select json_equals('{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}', - '{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}'); + '{"È›anÈ›oÈ™":[1, 2, "È›", {"some uâ߀":"uâßr"}]}') as je; select json_equals('{"a" : [0.123456789123456789], "b" : [1, 2, 3]}', - '{"b" : [1, 2, 3], "a" : [0.123456789123456789]}'); ---enable_view_protocol + '{"b" : [1, 2, 3], "a" : [0.123456789123456789]}') as je; --echo # --echo # Test max json depth for json_equals. diff -Nru mariadb-10.11.6/mysql-test/main/keywords.result mariadb-10.11.9/mysql-test/main/keywords.result --- mariadb-10.11.6/mysql-test/main/keywords.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/keywords.result 2024-08-03 07:29:57.000000000 +0000 @@ -500,21 +500,21 @@ -------- SELECT @@global.adddate(); -- Unknown system variable 'adddate' -------- -SELECT @@global.substr(); -- Unknown system variable 'substr' +SELECT @@global.substr(); -- ..syntax.. near 'substr()' at line 1 -------- -SELECT @@global.substring(); -- Unknown system variable 'substring' +SELECT @@global.substring(); -- ..syntax.. near 'substring()' at line 1 -------- SELECT @@global.trim_oracle(); -- Unknown system variable 'trim_oracle' -------- SELECT @@global.ascii(); -- Unknown system variable 'ascii' -------- -SELECT @@global.replace(); -- Unknown system variable 'replace' +SELECT @@global.replace(); -- ..syntax.. near 'replace()' at line 1 -------- SELECT @@global.weight_string(); -- Unknown system variable 'weight_string' -------- SELECT @@global.char(); -- Unknown system variable 'char' -------- -SELECT @@global.trim(); -- Unknown system variable 'trim' +SELECT @@global.trim(); -- ..syntax.. near 'trim()' at line 1 -------- SELECT @@global.year(); -- Unknown system variable 'year' -------- @@ -732,21 +732,21 @@ -------- CREATE FUNCTION test.adddate() RETURNS OOPS; -- Unknown data type: 'OOPS' -------- -CREATE FUNCTION test.substr() RETURNS OOPS; -- Unknown data type: 'OOPS' +CREATE FUNCTION test.substr() RETURNS OOPS; -- ..syntax.. near 'substr() RETURNS OOPS' -------- -CREATE FUNCTION test.substring() RETURNS OOPS; -- Unknown data type: 'OOPS' +CREATE FUNCTION test.substring() RETURNS OOPS; -- ..syntax.. near 'substring() RETURNS OOP -------- CREATE FUNCTION test.trim_oracle() RETURNS OOPS; -- Unknown data type: 'OOPS' -------- CREATE FUNCTION test.ascii() RETURNS OOPS; -- Unknown data type: 'OOPS' -------- -CREATE FUNCTION test.replace() RETURNS OOPS; -- Unknown data type: 'OOPS' +CREATE FUNCTION test.replace() RETURNS OOPS; -- ..syntax.. near 'replace() RETURNS OOPS' -------- CREATE FUNCTION test.weight_string() RETURNS OOPS; -- Unknown data type: 'OOPS' -------- CREATE FUNCTION test.char() RETURNS OOPS; -- Unknown data type: 'OOPS' -------- -CREATE FUNCTION test.trim() RETURNS OOPS; -- Unknown data type: 'OOPS' +CREATE FUNCTION test.trim() RETURNS OOPS; -- ..syntax.. near 'trim() RETURNS OOPS' at -------- CREATE FUNCTION test.year() RETURNS OOPS; -- Unknown data type: 'OOPS' -------- diff -Nru mariadb-10.11.6/mysql-test/main/kill_processlist-6619.test mariadb-10.11.9/mysql-test/main/kill_processlist-6619.test --- mariadb-10.11.6/mysql-test/main/kill_processlist-6619.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/kill_processlist-6619.test 2024-08-03 07:29:57.000000000 +0000 @@ -4,8 +4,18 @@ --source include/not_embedded.inc --source include/have_debug_sync.inc +--disable_ps_protocol +# Ensure no lingering connections from an earlier test run, which can very +# rarely still be visible in SHOW PROCESSLIST here. +--let $wait_condition= SELECT COUNT(*) = 1 from information_schema.processlist +--source include/wait_condition.inc + --connect (con1,localhost,root,,) --let $con_id = `SELECT CONNECTION_ID()` + +let $wait_condition=select command = 'sleep' from information_schema.processlist where id != $con_id; +source include/wait_condition.inc; + --replace_result Execute Query --replace_column 1 # 3 # 6 # 7 # SHOW PROCESSLIST; @@ -25,9 +35,7 @@ SET DEBUG_SYNC='reset'; # Wait until default connection has reset query string -let $wait_condition= - SELECT COUNT(*) = 1 from information_schema.processlist - WHERE info is NULL; +let $wait_condition=select command = 'sleep' from information_schema.processlist where id != $con_id; --source include/wait_condition.inc --replace_result Execute Query diff -Nru mariadb-10.11.6/mysql-test/main/load_timezones_with_alter_algorithm_inplace.result mariadb-10.11.9/mysql-test/main/load_timezones_with_alter_algorithm_inplace.result --- mariadb-10.11.6/mysql-test/main/load_timezones_with_alter_algorithm_inplace.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/load_timezones_with_alter_algorithm_inplace.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,18 @@ +set global alter_algorithm=INPLACE; +RENAME TABLE mysql.time_zone TO mysql.time_zone_BACKUP; +RENAME TABLE mysql.time_zone_name TO mysql.time_zone_name_BACKUP; +RENAME TABLE mysql.time_zone_transition TO mysql.time_zone_transition_BACKUP; +RENAME TABLE mysql.time_zone_transition_type TO mysql.time_zone_transition_type_BACKUP; +CREATE TABLE mysql.time_zone LIKE mysql.time_zone_BACKUP; +CREATE TABLE mysql.time_zone_name LIKE mysql.time_zone_name_BACKUP; +CREATE TABLE mysql.time_zone_transition LIKE mysql.time_zone_transition_BACKUP; +CREATE TABLE mysql.time_zone_transition_type LIKE mysql.time_zone_transition_type_BACKUP; +DROP TABLE mysql.time_zone; +DROP TABLE mysql.time_zone_name; +DROP TABLE mysql.time_zone_transition; +DROP TABLE mysql.time_zone_transition_type; +RENAME TABLE mysql.time_zone_BACKUP TO mysql.time_zone; +RENAME TABLE mysql.time_zone_name_BACKUP TO mysql.time_zone_name; +RENAME TABLE mysql.time_zone_transition_BACKUP TO mysql.time_zone_transition; +RENAME TABLE mysql.time_zone_transition_type_BACKUP TO mysql.time_zone_transition_type; +set global alter_algorithm=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/load_timezones_with_alter_algorithm_inplace.test mariadb-10.11.9/mysql-test/main/load_timezones_with_alter_algorithm_inplace.test --- mariadb-10.11.6/mysql-test/main/load_timezones_with_alter_algorithm_inplace.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/load_timezones_with_alter_algorithm_inplace.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,40 @@ +--source include/not_embedded.inc + +# MDEV-33044 Loading time zones does not work with alter_algorithm INPLACE + +set global alter_algorithm=INPLACE; + +# Because loading timezones alters the mysql tables, +# this test will leave mysql in a different state than when it started. +# Furthermore, checksums on the various mysql.timezone_x tables will fail. + +# Therefore we: +# 1. Make "backups" of the existing tables by renaming them +# 2. Make dummy clones of the tables we just backed up +# 3. Load timezones with alterations made to the dummy clone tables +# 4. Drop the newly made tables with changes made to them +# 5. Restore the backed up tables so the checksums will pass + +RENAME TABLE mysql.time_zone TO mysql.time_zone_BACKUP; +RENAME TABLE mysql.time_zone_name TO mysql.time_zone_name_BACKUP; +RENAME TABLE mysql.time_zone_transition TO mysql.time_zone_transition_BACKUP; +RENAME TABLE mysql.time_zone_transition_type TO mysql.time_zone_transition_type_BACKUP; + +CREATE TABLE mysql.time_zone LIKE mysql.time_zone_BACKUP; +CREATE TABLE mysql.time_zone_name LIKE mysql.time_zone_name_BACKUP; +CREATE TABLE mysql.time_zone_transition LIKE mysql.time_zone_transition_BACKUP; +CREATE TABLE mysql.time_zone_transition_type LIKE mysql.time_zone_transition_type_BACKUP; + +--exec $MYSQL_TZINFO_TO_SQL std_data/zoneinfo | $MYSQL mysql + +DROP TABLE mysql.time_zone; +DROP TABLE mysql.time_zone_name; +DROP TABLE mysql.time_zone_transition; +DROP TABLE mysql.time_zone_transition_type; + +RENAME TABLE mysql.time_zone_BACKUP TO mysql.time_zone; +RENAME TABLE mysql.time_zone_name_BACKUP TO mysql.time_zone_name; +RENAME TABLE mysql.time_zone_transition_BACKUP TO mysql.time_zone_transition; +RENAME TABLE mysql.time_zone_transition_type_BACKUP TO mysql.time_zone_transition_type; + +set global alter_algorithm=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/lock_sync.result mariadb-10.11.9/mysql-test/main/lock_sync.result --- mariadb-10.11.6/mysql-test/main/lock_sync.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lock_sync.result 2024-08-03 07:29:57.000000000 +0000 @@ -26,28 +26,6 @@ connect con1, localhost, root,,; connect con2, localhost, root,,; connection default; -drop table if exists t0, t1, t2, t3, t4, t5; -drop view if exists v1, v2; -drop procedure if exists p1; -drop procedure if exists p2; -drop procedure if exists p3; -drop function if exists f1; -drop function if exists f2; -drop function if exists f3; -drop function if exists f4; -drop function if exists f5; -drop function if exists f6; -drop function if exists f7; -drop function if exists f8; -drop function if exists f9; -drop function if exists f10; -drop function if exists f11; -drop function if exists f12; -drop function if exists f13; -drop function if exists f14; -drop function if exists f15; -drop function if exists f16; -drop function if exists f17; create table t1 (i int primary key); insert into t1 values (1), (2), (3), (4), (5); create table t2 (j int primary key); @@ -900,6 +878,6 @@ SELECT * FROM ( SELECT * FROM v1 ) sq; COMMIT; DROP VIEW v1; -DROP FUNCTION f; +DROP FUNCTION IF EXISTS f; DROP TABLE t1, t2; set debug_sync= 'reset'; diff -Nru mariadb-10.11.6/mysql-test/main/lock_sync.test mariadb-10.11.9/mysql-test/main/lock_sync.test --- mariadb-10.11.6/mysql-test/main/lock_sync.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lock_sync.test 2024-08-03 07:29:57.000000000 +0000 @@ -44,30 +44,6 @@ connect (con1, localhost, root,,); connect (con2, localhost, root,,); connection default; ---disable_warnings -drop table if exists t0, t1, t2, t3, t4, t5; -drop view if exists v1, v2; -drop procedure if exists p1; -drop procedure if exists p2; -drop procedure if exists p3; -drop function if exists f1; -drop function if exists f2; -drop function if exists f3; -drop function if exists f4; -drop function if exists f5; -drop function if exists f6; -drop function if exists f7; -drop function if exists f8; -drop function if exists f9; -drop function if exists f10; -drop function if exists f11; -drop function if exists f12; -drop function if exists f13; -drop function if exists f14; -drop function if exists f15; -drop function if exists f16; -drop function if exists f17; ---enable_warnings create table t1 (i int primary key); insert into t1 values (1), (2), (3), (4), (5); create table t2 (j int primary key); @@ -1218,7 +1194,8 @@ --disconnect con1 --disconnect con2 --connection default +--source include/wait_until_count_sessions.inc DROP VIEW v1; -DROP FUNCTION f; +DROP FUNCTION IF EXISTS f; DROP TABLE t1, t2; set debug_sync= 'reset'; diff -Nru mariadb-10.11.6/mysql-test/main/lock_view.result mariadb-10.11.9/mysql-test/main/lock_view.result --- mariadb-10.11.6/mysql-test/main/lock_view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lock_view.result 2024-08-03 07:29:57.000000000 +0000 @@ -16,6 +16,7 @@ create definer=definer@localhost view mysqltest3.v3ps as select user from performance_schema.users where current_connections>0 order by user; create definer=definer@localhost view mysqltest3.v3nt as select 1; create definer=definer@localhost sql security invoker view mysqltest3.v3i as select * from mysqltest1.t1; +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; @@ -234,6 +235,7 @@ lock table v1 read; disconnect con1; connection default; +/*M!999999\- enable the sandbox mode */ SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; /*!50001 CREATE VIEW `v1` AS SELECT diff -Nru mariadb-10.11.6/mysql-test/main/log_errchk.test mariadb-10.11.9/mysql-test/main/log_errchk.test --- mariadb-10.11.6/mysql-test/main/log_errchk.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_errchk.test 2024-08-03 07:29:57.000000000 +0000 @@ -30,12 +30,12 @@ --echo # Case 2: Starting server with fifo file as general log file --echo # and slow query log file. # Restart server with fifo file as general log file. ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc --enable_reconnect # Write file to make mysql-test-run.pl start up the server again ---exec echo "restart: --general-log-file=$gen_log_file --slow-query-log-file=$slow_query_log_file" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart: --general-log-file=$gen_log_file --slow-query-log-file=$slow_query_log_file" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/wait_until_connected_again.inc # Error 6 is reported, because the other end is closed diff -Nru mariadb-10.11.6/mysql-test/main/log_slow.result mariadb-10.11.9/mysql-test/main/log_slow.result --- mariadb-10.11.6/mysql-test/main/log_slow.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow.result 2024-08-03 07:29:57.000000000 +0000 @@ -186,6 +186,30 @@ SET SESSION slow_query_log=default; drop table tab_MDEV_30820, tab2; drop function get_zero; -# # End of 10.4 tests # +# MDEV-34539 Invalid "use" and "Schema" in slow query log file with multi-line schema +# +set global log_output='file'; +set @@log_slow_filter= 'not_using_index'; +set slow_query_log=1; +set timestamp=1234567890; +create database `a +b`; +use `a +b`; +select count(*) from mysql.global_priv where length(priv)>2; +count(*) +5 +drop database `a +b`; +use test; +set global log_output= @old_log_output; +set slow_query_log=default; +set log_slow_filter=default; +set timestamp=default; +use `a +b`; +SET timestamp=1234567890; +select count(*) from mysql.global_priv where length(priv)>2 +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/log_slow.test mariadb-10.11.9/mysql-test/main/log_slow.test --- mariadb-10.11.6/mysql-test/main/log_slow.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow.test 2024-08-03 07:29:57.000000000 +0000 @@ -187,6 +187,35 @@ --enable_ps2_protocol --enable_view_protocol ---echo # --echo # End of 10.4 tests + +--echo # +--echo # MDEV-34539 Invalid "use" and "Schema" in slow query log file with multi-line schema --echo # +set global log_output='file'; +set @@log_slow_filter= 'not_using_index'; +set slow_query_log=1; +set timestamp=1234567890; +create database `a +b`; +use `a +b`; +--disable_ps_protocol +--disable_view_protocol +select count(*) from mysql.global_priv where length(priv)>2; +--enable_view_protocol +--enable_ps_protocol +drop database `a +b`; +use test; +set global log_output= @old_log_output; +set slow_query_log=default; +set log_slow_filter=default; +set timestamp=default; + +let SEARCH_FILE=`select @@slow_query_log_file`; +let SEARCH_PATTERN=use.*2; +let SEARCH_OUTPUT=matches; +source include/search_pattern_in_file.inc; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/log_slow_debug.result mariadb-10.11.9/mysql-test/main/log_slow_debug.result --- mariadb-10.11.6/mysql-test/main/log_slow_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow_debug.result 2024-08-03 07:29:57.000000000 +0000 @@ -287,15 +287,18 @@ SET GLOBAL log_output= "TABLE"; SET GLOBAL slow_query_log= ON; SET SESSION long_query_time= 0; -SET GLOBAL debug_dbug="+d,debug_huge_number_of_examined_rows"; +SET debug_dbug="+d,debug_huge_number_of_examined_rows"; SELECT * FROM tab_MDEV_30820 ORDER BY 1; ID A 1 0 2 0 -SET GLOBAL debug_dbug=@old_dbug; +SET debug_dbug=@old_dbug; SET @@long_query_time= @old_long_query_time; SET @@global.log_output= @old_log_output; SET @@global.slow_query_log= @old_slow_query_log; +SELECT rows_examined, sql_text from mysql.slow_log where sql_text like "SELECT%FROM tab_MDEV_30820%"; +rows_examined sql_text +18446744073708551615 SELECT * FROM tab_MDEV_30820 ORDER BY 1 drop table tab_MDEV_30820; # # End of 10.4 test diff -Nru mariadb-10.11.6/mysql-test/main/log_slow_debug.test mariadb-10.11.9/mysql-test/main/log_slow_debug.test --- mariadb-10.11.6/mysql-test/main/log_slow_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow_debug.test 2024-08-03 07:29:57.000000000 +0000 @@ -170,16 +170,21 @@ SET GLOBAL slow_query_log= ON; SET SESSION long_query_time= 0; -SET GLOBAL debug_dbug="+d,debug_huge_number_of_examined_rows"; +SET debug_dbug="+d,debug_huge_number_of_examined_rows"; +--disable_ps_protocol +--disable_view_protocol SELECT * FROM tab_MDEV_30820 ORDER BY 1; -SET GLOBAL debug_dbug=@old_dbug; - +--enable_view_protocol +--enable_ps_protocol +SET debug_dbug=@old_dbug; ## Reset to initial values SET @@long_query_time= @old_long_query_time; SET @@global.log_output= @old_log_output; SET @@global.slow_query_log= @old_slow_query_log; +SELECT rows_examined, sql_text from mysql.slow_log where sql_text like "SELECT%FROM tab_MDEV_30820%"; + drop table tab_MDEV_30820; --echo # diff -Nru mariadb-10.11.6/mysql-test/main/log_slow_filter.opt mariadb-10.11.9/mysql-test/main/log_slow_filter.opt --- mariadb-10.11.6/mysql-test/main/log_slow_filter.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow_filter.opt 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,4 @@ +--log-slow-filter= --log_queries_not_using_indexes=0 + + + diff -Nru mariadb-10.11.6/mysql-test/main/log_slow_filter.result mariadb-10.11.9/mysql-test/main/log_slow_filter.result --- mariadb-10.11.6/mysql-test/main/log_slow_filter.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow_filter.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,8 @@ +call mtr.add_suppression("log_slow_filter=\"\" changed to log_slow_filter=ALL"); +show variables like "log_slow_filter"; +Variable_name Value +log_slow_filter admin,filesort,filesort_on_disk,filesort_priority_queue,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk +set @@log_slow_filter="all"; +show variables like "log_slow_filter"; +Variable_name Value +log_slow_filter admin,filesort,filesort_on_disk,filesort_priority_queue,full_join,full_scan,not_using_index,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk diff -Nru mariadb-10.11.6/mysql-test/main/log_slow_filter.test mariadb-10.11.9/mysql-test/main/log_slow_filter.test --- mariadb-10.11.6/mysql-test/main/log_slow_filter.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow_filter.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,7 @@ +# Test setting log_slow_filter to empty in config files + +call mtr.add_suppression("log_slow_filter=\"\" changed to log_slow_filter=ALL"); + +show variables like "log_slow_filter"; +set @@log_slow_filter="all"; +show variables like "log_slow_filter"; diff -Nru mariadb-10.11.6/mysql-test/main/log_slow_innodb.result mariadb-10.11.9/mysql-test/main/log_slow_innodb.result --- mariadb-10.11.6/mysql-test/main/log_slow_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -23,6 +23,10 @@ [log_grep.inc] lines: 0 [log_grep.inc] file: log_slow_innodb-verbosity_1 pattern: ^# Tmp_tables: \d+ Tmp_disk_tables: \d+$ [log_grep.inc] lines: 0 +[log_grep.inc] file: log_slow_innodb-verbosity_1 pattern: ^# Pages_accessed: \d+ Pages_read: \d+ Pages_prefetched: \d+ Pages_updated: \d+ Old_rows_read: \d+$ expected_matches: 2 +[log_grep.inc] found expected match count: 2 +[log_grep.inc] file: log_slow_innodb-verbosity_1 pattern: ^# Pages_read_time: \d+\.\d+ Engine_time: \d+\.\d+$ expected_matches: 2 +[log_grep.inc] found expected match count: 2 SET SESSION log_slow_verbosity='innodb,query_plan'; [slow_log_start.inc] log_slow_innodb-verbosity_2 SELECT 1; @@ -43,6 +47,10 @@ [log_grep.inc] lines: 0 [log_grep.inc] file: log_slow_innodb-verbosity_2 pattern: ^# Tmp_tables: \d+ Tmp_disk_tables: \d+$ [log_grep.inc] lines: 0 +[log_grep.inc] file: log_slow_innodb-verbosity_2 pattern: ^# Pages_accessed: \d+ Pages_read: \d+ Pages_prefetched: \d+ Pages_updated: \d+ Old_rows_read: \d+$ +[log_grep.inc] lines: 0 +[log_grep.inc] file: log_slow_innodb-verbosity_2 pattern: ^# Pages_read_time: \d+\.\d+ Engine_time: \d+\.\d+$ +[log_grep.inc] lines: 0 SET SESSION log_slow_verbosity='query_plan'; [log_slow_stop.inc] log_slow_innodb-verbosity_3 --source include/log_slow_start.inc @@ -75,4 +83,12 @@ --source include/log_slow_start.inc INSERT INTO t1 VALUE(1000) pattern: ^# Tmp_tables: \d+ Tmp_disk_tables: \d+$ [log_grep.inc] lines: 0 +[log_grep.inc] file: log_slow_innodb-verbosity_3 +--source include/log_slow_start.inc +INSERT INTO t1 VALUE(1000) pattern: ^# Pages_accessed: \d+ Pages_read: \d+ Pages_prefetched: \d+ Pages_updated: \d+ Old_rows_read: \d+$ +[log_grep.inc] lines: 0 +[log_grep.inc] file: log_slow_innodb-verbosity_3 +--source include/log_slow_start.inc +INSERT INTO t1 VALUE(1000) pattern: ^# Pages_read_time: \d+\.\d+ Engine_time: \d+\.\d+$ +[log_grep.inc] lines: 0 DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/main/log_slow_innodb.test mariadb-10.11.9/mysql-test/main/log_slow_innodb.test --- mariadb-10.11.6/mysql-test/main/log_slow_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_slow_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -72,7 +72,7 @@ INSERT INTO t1 VALUE(1000); --source include/log_slow_stop.inc ---let log_slow_verbosity_innodb_expected_matches= 1 +--let log_slow_verbosity_innodb_expected_matches= 0 --source include/log_slow_grep.inc DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/main/log_tables.result mariadb-10.11.9/mysql-test/main/log_tables.result --- mariadb-10.11.6/mysql-test/main/log_tables.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_tables.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,14 +1,9 @@ SET SQL_MODE=""; -SET @old_general_log_state = @@global.general_log; SET @old_log_output= @@global.log_output; SET @old_slow_query_log= @@global.slow_query_log; SET @old_general_log= @@global.general_log; SET @old_long_query_time= @@session.long_query_time; use mysql; -SET @saved_long_query_time = @@long_query_time; -SET @saved_log_output = @@log_output; -SET @saved_general_log = @@GLOBAL.general_log; -SET @saved_slow_query_log = @@GLOBAL.slow_query_log; truncate table general_log; select * from general_log; event_time user_host thread_id server_id command_type argument @@ -120,6 +115,9 @@ Database Table In_use Name_locked SET GLOBAL GENERAL_LOG=ON; SET GLOBAL SLOW_QUERY_LOG=ON; +# +# Bug#23924 general_log truncates queries with character set introducers. +# truncate table mysql.general_log; set names binary; select _koi8r'ÔÅÓÔ' as test; @@ -131,6 +129,9 @@ TIMESTAMP USER_HOST THREAD_ID 1 Query select _koi8r'\xD4\xC5\xD3\xD4' as test TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log set names utf8; +# +# Bug #16905 Log tables: unicode statements are logged incorrectly +# truncate table mysql.general_log; set names utf8; create table bug16905 (s char(15) character set utf8 default 'пуÑто'); @@ -142,6 +143,9 @@ TIMESTAMP USER_HOST THREAD_ID 1 Query insert into bug16905 values ('новое') TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.general_log drop table bug16905; +# +# Bug #17600: Invalid data logged into mysql.slow_log +# truncate table mysql.slow_log; set session long_query_time=1; select sleep(2); @@ -150,7 +154,11 @@ select * from mysql.slow_log; start_time user_host query_time lock_time rows_sent rows_examined db last_insert_id insert_id server_id sql_text thread_id rows_affected TIMESTAMP USER_HOST QUERY_TIME 00:00:00.000000 1 0 mysql 0 0 1 select sleep(2) THREAD_ID 0 -set @@session.long_query_time = @saved_long_query_time; +set @@session.long_query_time = @old_long_query_time; +# +# Bug #18559 log tables cannot change engine, and gets deadlocked when +# dropping w/ log on +# alter table mysql.general_log engine=myisam; ERROR HY000: You cannot 'ALTER' a log table if logging is enabled alter table mysql.slow_log engine=myisam; @@ -232,7 +240,7 @@ TIMESTAMP USER_HOST THREAD_ID 1 Query set session long_query_time=1 TIMESTAMP USER_HOST THREAD_ID 1 Query select sleep(2) TIMESTAMP USER_HOST THREAD_ID 1 Query select * from mysql.slow_log -TIMESTAMP USER_HOST THREAD_ID 1 Query set @@session.long_query_time = @saved_long_query_time +TIMESTAMP USER_HOST THREAD_ID 1 Query set @@session.long_query_time = @old_long_query_time TIMESTAMP USER_HOST THREAD_ID 1 Query alter table mysql.general_log engine=myisam TIMESTAMP USER_HOST THREAD_ID 1 Query alter table mysql.slow_log engine=myisam TIMESTAMP USER_HOST THREAD_ID 1 Query drop table mysql.general_log @@ -300,17 +308,20 @@ set global general_log='ON'; set global slow_query_log='ON'; use test; +# +# Bug #20139 Infinite loop after "FLUSH" and "LOCK tabX, general_log" +# flush tables with read lock; unlock tables; use mysql; lock tables general_log read local, help_category read local; ERROR HY000: You can't use locks with log tables unlock tables; +# +# Bug #17544 Cannot do atomic log rotate and +# Bug #21785 Server crashes after rename of the log table +# SET SESSION long_query_time = 1000; -drop table if exists mysql.renamed_general_log; -drop table if exists mysql.renamed_slow_log; -drop table if exists mysql.general_log_new; -drop table if exists mysql.slow_log_new; use mysql; RENAME TABLE general_log TO renamed_general_log; ERROR HY000: Cannot rename 'general_log'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to 'general_log' @@ -356,13 +367,16 @@ ERROR 42S02: Table 'mysql.slow_log' doesn't exist RENAME TABLE general_log2 TO general_log; RENAME TABLE slow_log2 TO slow_log; -SET SESSION long_query_time = @saved_long_query_time; +SET SESSION long_query_time = @old_long_query_time; set global general_log='ON'; set global slow_query_log='ON'; flush logs; flush logs; drop table renamed_general_log, renamed_slow_log; use test; +# +# Bug #21966 Strange warnings on repair of the log tables +# use mysql; repair table general_log; Table Op Msg_type Msg_text @@ -380,6 +394,10 @@ slow_log_new drop table slow_log_new, general_log_new; use test; +# +# Bug#69953 / MDEV-4851 +# Log tables should be modifable on LOG_OUTPUT != TABLE +# SET GLOBAL LOG_OUTPUT = 'FILE'; SET GLOBAL slow_query_log = 1; SET GLOBAL general_log = 1; @@ -388,6 +406,10 @@ SET GLOBAL LOG_OUTPUT = 'NONE'; ALTER TABLE mysql.slow_log DROP COLUMN comment_text; ALTER TABLE mysql.general_log DROP COLUMN comment_text; +# +# Bug#27857 (Log tables supplies the wrong value for generating +# AUTO_INCREMENT numbers) +# SET GLOBAL LOG_OUTPUT = 'TABLE'; SET GLOBAL general_log = 0; FLUSH LOGS; @@ -451,16 +473,15 @@ START_TIME USER_HOST QUERY_TIME 00:00:00.000000 1 0 test 0 0 1 SELECT "My own slow query", sleep(2) THREAD_ID 0 3 START_TIME USER_HOST QUERY_TIME 00:00:00.000000 1 0 test 0 0 1 SELECT "My own slow query", sleep(2) THREAD_ID 0 4 SET GLOBAL slow_query_log = 0; -SET SESSION long_query_time =@saved_long_query_time; +SET SESSION long_query_time =@old_long_query_time; FLUSH LOGS; ALTER TABLE mysql.slow_log DROP COLUMN seq; ALTER TABLE mysql.slow_log ENGINE = CSV; SET GLOBAL general_log = @old_general_log; SET GLOBAL slow_query_log = @old_slow_query_log; -drop procedure if exists proc25422_truncate_slow; -drop procedure if exists proc25422_truncate_general; -drop procedure if exists proc25422_alter_slow; -drop procedure if exists proc25422_alter_general; +# +# Bug#25422 (Hang with log tables) +# use test// create procedure proc25422_truncate_slow (loops int) begin @@ -485,26 +506,26 @@ create procedure proc25422_alter_slow (loops int) begin declare v1 int default 0; +declare old_log_state int default @@global.slow_query_log; declare ER_BAD_LOG_STATEMENT condition for 1575; declare continue handler for ER_BAD_LOG_STATEMENT begin end; while v1 < loops do -set @old_log_state = @@global.slow_query_log; set global slow_query_log = 'OFF'; alter table mysql.slow_log engine = CSV; -set global slow_query_log = @old_log_state; +set global slow_query_log = old_log_state; set v1 = v1 + 1; end while; end// create procedure proc25422_alter_general (loops int) begin declare v1 int default 0; +declare old_log_state int default @@global.general_log; declare ER_BAD_LOG_STATEMENT condition for 1575; declare continue handler for ER_BAD_LOG_STATEMENT begin end; while v1 < loops do -set @old_log_state = @@global.general_log; set global general_log = 'OFF'; alter table mysql.general_log engine = CSV; -set global general_log = @old_log_state; +set global general_log = old_log_state; set v1 = v1 + 1; end while; end// @@ -563,17 +584,19 @@ drop procedure proc25422_truncate_general; drop procedure proc25422_alter_slow; drop procedure proc25422_alter_general; +# +# Bug#23044 (Warnings on flush of a log table) +# FLUSH TABLE mysql.general_log; show warnings; Level Code Message FLUSH TABLE mysql.slow_log; show warnings; Level Code Message -DROP TABLE IF EXISTS `db_17876.slow_log_data`; -DROP TABLE IF EXISTS `db_17876.general_log_data`; -DROP PROCEDURE IF EXISTS `db_17876.archiveSlowLog`; -DROP PROCEDURE IF EXISTS `db_17876.archiveGeneralLog`; -DROP DATABASE IF EXISTS `db_17876`; +# +# Bug#17876 (Truncating mysql.slow_log in a SP after using cursor locks the +# thread) +# CREATE DATABASE db_17876; CREATE TABLE `db_17876.slow_log_data` ( `start_time` timestamp(6) default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, @@ -686,6 +709,9 @@ DROP DATABASE IF EXISTS `db_17876`; SET GLOBAL general_log = @old_general_log; SET GLOBAL slow_query_log = @old_slow_query_log; +# +# Bug#21557 entries in the general query log truncated at 1000 characters. +# select CONNECTION_ID() into @thread_id; truncate table mysql.general_log; set global general_log = on; @@ -902,9 +928,9 @@ set global general_log = off deallocate prepare long_query; set global general_log = @old_general_log; -DROP TABLE IF EXISTS log_count; -DROP TABLE IF EXISTS slow_log_copy; -DROP TABLE IF EXISTS general_log_copy; +# +# Bug#34306: Can't make copy of log tables when server binary log is enabled +# CREATE TABLE log_count (count BIGINT(21)); SET GLOBAL general_log = ON; SET GLOBAL slow_query_log = ON; @@ -926,9 +952,12 @@ INSERT INTO general_log_copy SELECT * FROM mysql.general_log; INSERT INTO log_count (count) VALUES ((SELECT count(*) FROM mysql.general_log)); DROP TABLE general_log_copy; -SET GLOBAL general_log = @saved_general_log; -SET GLOBAL slow_query_log = @saved_slow_query_log; +SET GLOBAL general_log = @old_general_log; +SET GLOBAL slow_query_log = @old_slow_query_log; DROP TABLE log_count; +# +# Bug #31700: thd->examined_row_count not incremented for 'const' type queries +# SET SESSION long_query_time = 0; SET GLOBAL slow_query_log = ON; FLUSH LOGS; @@ -954,9 +983,10 @@ TIMESTAMP 1 1 SELECT SQL_NO_CACHE 'Bug#31700 - PK', f1,f2,f3,SLEEP(1.1) FROM t1 WHERE f1=2 DROP TABLE t1; TRUNCATE TABLE mysql.slow_log; +# +# Bug #47924 main.log_tables times out sporadically +# use mysql; -drop table if exists renamed_general_log; -drop table if exists renamed_slow_log; RENAME TABLE general_log TO renamed_general_log; ERROR HY000: Cannot rename 'general_log'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to 'general_log' RENAME TABLE slow_log TO renamed_slow_log; @@ -964,7 +994,34 @@ use test; flush tables with read lock; unlock tables; -SET @@session.long_query_time= @old_long_query_time; +# +# MDEV-33267 User with minimal permissions can intentionally corrupt mysql.slow_log table +# +truncate mysql.slow_log; +set global log_output= 'TABLE'; +create user u@localhost; +set slow_query_log=on, long_query_time=0.1; +select 'before evil-doing', sleep(0.2); +before evil-doing sleep(0.2) +before evil-doing 0 +connect con1,localhost,u,,; +set @@timestamp= 2147483647; +set slow_query_log=on, long_query_time=0.1; +select 'evil-doing', sleep(1.1); +evil-doing sleep(1.1) +evil-doing 0 +disconnect con1; +connection default; +select 'after evil-doing', sleep(0.2); +after evil-doing sleep(0.2) +after evil-doing 0 +select distinct sql_text from mysql.slow_log where sql_text like '%evil%'; +sql_text +select 'before evil-doing', sleep(0.2) +select 'evil-doing', sleep(1.1) +select 'after evil-doing', sleep(0.2) +set global log_output=default; +drop user u@localhost; SET @@global.log_output= @old_log_output; SET @@global.slow_query_log= @old_slow_query_log; SET @@global.general_log= @old_general_log; diff -Nru mariadb-10.11.6/mysql-test/main/log_tables.test mariadb-10.11.9/mysql-test/main/log_tables.test --- mariadb-10.11.6/mysql-test/main/log_tables.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/log_tables.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,13 +1,9 @@ # this test needs multithreaded mysqltest -- source include/not_embedded.inc -# -# Basic log tables test -# -# check that CSV engine was compiled in + --source include/have_csv.inc SET SQL_MODE=""; -SET @old_general_log_state = @@global.general_log; SET @old_log_output= @@global.log_output; SET @old_slow_query_log= @@global.slow_query_log; SET @old_general_log= @@global.general_log; @@ -16,16 +12,9 @@ --disable_ps_protocol use mysql; -# Capture initial settings of system variables -# so that we can revert to old state after manipulation for testing -# NOTE: PLEASE USE THESE VALUES TO 'RESET' SYSTEM VARIABLES -# Capturing old values within the tests results in loss of values -# due to people not paying attention to previous tests' changes, captures -# or improper cleanup -SET @saved_long_query_time = @@long_query_time; -SET @saved_log_output = @@log_output; -SET @saved_general_log = @@GLOBAL.general_log; -SET @saved_slow_query_log = @@GLOBAL.slow_query_log; +# +# Basic log tables test +# # # Check that log tables work and we can do basic selects. This also @@ -147,9 +136,9 @@ SET GLOBAL GENERAL_LOG=ON; SET GLOBAL SLOW_QUERY_LOG=ON; -# -# Bug#23924 general_log truncates queries with character set introducers. -# +--echo # +--echo # Bug#23924 general_log truncates queries with character set introducers. +--echo # truncate table mysql.general_log; set names binary; select _koi8r'ÔÅÓÔ' as test; @@ -157,9 +146,9 @@ select * from mysql.general_log; set names utf8; -# -# Bug #16905 Log tables: unicode statements are logged incorrectly -# +--echo # +--echo # Bug #16905 Log tables: unicode statements are logged incorrectly +--echo # truncate table mysql.general_log; set names utf8; @@ -169,21 +158,21 @@ select * from mysql.general_log; drop table bug16905; -# -# Bug #17600: Invalid data logged into mysql.slow_log -# +--echo # +--echo # Bug #17600: Invalid data logged into mysql.slow_log +--echo # truncate table mysql.slow_log; set session long_query_time=1; select sleep(2); --replace_column 1 TIMESTAMP 2 USER_HOST 3 QUERY_TIME 12 THREAD_ID select * from mysql.slow_log; -set @@session.long_query_time = @saved_long_query_time; +set @@session.long_query_time = @old_long_query_time; -# -# Bug #18559 log tables cannot change engine, and gets deadlocked when -# dropping w/ log on -# +--echo # +--echo # Bug #18559 log tables cannot change engine, and gets deadlocked when +--echo # dropping w/ log on +--echo # # check that appropriate error messages are given when one attempts to alter # or drop a log tables, while corresponding logs are enabled @@ -322,9 +311,9 @@ set global slow_query_log='ON'; use test; -# -# Bug #20139 Infinite loop after "FLUSH" and "LOCK tabX, general_log" -# +--echo # +--echo # Bug #20139 Infinite loop after "FLUSH" and "LOCK tabX, general_log" +--echo # flush tables with read lock; unlock tables; @@ -333,18 +322,12 @@ lock tables general_log read local, help_category read local; unlock tables; -# -# Bug #17544 Cannot do atomic log rotate and -# Bug #21785 Server crashes after rename of the log table -# +--echo # +--echo # Bug #17544 Cannot do atomic log rotate and +--echo # Bug #21785 Server crashes after rename of the log table +--echo # SET SESSION long_query_time = 1000; ---disable_warnings -drop table if exists mysql.renamed_general_log; -drop table if exists mysql.renamed_slow_log; -drop table if exists mysql.general_log_new; -drop table if exists mysql.slow_log_new; ---enable_warnings use mysql; # Should result in error @@ -399,7 +382,7 @@ RENAME TABLE general_log2 TO general_log; RENAME TABLE slow_log2 TO slow_log; -SET SESSION long_query_time = @saved_long_query_time; +SET SESSION long_query_time = @old_long_query_time; # this should work set global general_log='ON'; @@ -427,13 +410,6 @@ # TODO: improve filtering of expected errors in master.err in # mysql-test-run.pl (based on the test name ?), and uncomment this test. -# --disable_warnings -# drop table if exists mysql.bad_general_log; -# drop table if exists mysql.bad_slow_log; -# drop table if exists mysql.general_log_hide; -# drop table if exists mysql.slow_log_hide; -# --enable_warnings -# # create table mysql.bad_general_log (a int) engine= CSV; # create table mysql.bad_slow_log (a int) engine= CSV; # @@ -459,9 +435,9 @@ # drop table mysql.bad_general_log; # drop table mysql.bad_slow_log; -# -# Bug #21966 Strange warnings on repair of the log tables -# +--echo # +--echo # Bug #21966 Strange warnings on repair of the log tables +--echo # use mysql; # check that no warning occurs on repair of the log tables @@ -474,11 +450,10 @@ drop table slow_log_new, general_log_new; use test; -# -# Bug#69953 / MDEV-4851 -# Log tables should be modifable on LOG_OUTPUT != TABLE -# -# +--echo # +--echo # Bug#69953 / MDEV-4851 +--echo # Log tables should be modifable on LOG_OUTPUT != TABLE +--echo # SET GLOBAL LOG_OUTPUT = 'FILE'; SET GLOBAL slow_query_log = 1; @@ -492,10 +467,10 @@ ALTER TABLE mysql.general_log DROP COLUMN comment_text; -# -# Bug#27857 (Log tables supplies the wrong value for generating -# AUTO_INCREMENT numbers) -# +--echo # +--echo # Bug#27857 (Log tables supplies the wrong value for generating +--echo # AUTO_INCREMENT numbers) +--echo # SET GLOBAL LOG_OUTPUT = 'TABLE'; @@ -554,7 +529,7 @@ SELECT * FROM mysql.slow_log WHERE seq >= 2 LIMIT 3; SET GLOBAL slow_query_log = 0; -SET SESSION long_query_time =@saved_long_query_time; +SET SESSION long_query_time =@old_long_query_time; FLUSH LOGS; ALTER TABLE mysql.slow_log DROP COLUMN seq; @@ -563,16 +538,9 @@ SET GLOBAL general_log = @old_general_log; SET GLOBAL slow_query_log = @old_slow_query_log; -# -# Bug#25422 (Hang with log tables) -# - ---disable_warnings -drop procedure if exists proc25422_truncate_slow; -drop procedure if exists proc25422_truncate_general; -drop procedure if exists proc25422_alter_slow; -drop procedure if exists proc25422_alter_general; ---enable_warnings +--echo # +--echo # Bug#25422 (Hang with log tables) +--echo # delimiter //; @@ -602,14 +570,14 @@ create procedure proc25422_alter_slow (loops int) begin declare v1 int default 0; + declare old_log_state int default @@global.slow_query_log; declare ER_BAD_LOG_STATEMENT condition for 1575; declare continue handler for ER_BAD_LOG_STATEMENT begin end; while v1 < loops do - set @old_log_state = @@global.slow_query_log; set global slow_query_log = 'OFF'; alter table mysql.slow_log engine = CSV; - set global slow_query_log = @old_log_state; + set global slow_query_log = old_log_state; set v1 = v1 + 1; end while; end// @@ -617,14 +585,14 @@ create procedure proc25422_alter_general (loops int) begin declare v1 int default 0; + declare old_log_state int default @@global.general_log; declare ER_BAD_LOG_STATEMENT condition for 1575; declare continue handler for ER_BAD_LOG_STATEMENT begin end; while v1 < loops do - set @old_log_state = @@global.general_log; set global general_log = 'OFF'; alter table mysql.general_log engine = CSV; - set global general_log = @old_log_state; + set global general_log = old_log_state; set v1 = v1 + 1; end while; end// @@ -713,9 +681,9 @@ --enable_ps_protocol -# -# Bug#23044 (Warnings on flush of a log table) -# +--echo # +--echo # Bug#23044 (Warnings on flush of a log table) +--echo # FLUSH TABLE mysql.general_log; show warnings; @@ -723,18 +691,10 @@ FLUSH TABLE mysql.slow_log; show warnings; -# -# Bug#17876 (Truncating mysql.slow_log in a SP after using cursor locks the -# thread) -# - ---disable_warnings -DROP TABLE IF EXISTS `db_17876.slow_log_data`; -DROP TABLE IF EXISTS `db_17876.general_log_data`; -DROP PROCEDURE IF EXISTS `db_17876.archiveSlowLog`; -DROP PROCEDURE IF EXISTS `db_17876.archiveGeneralLog`; -DROP DATABASE IF EXISTS `db_17876`; ---enable_warnings +--echo # +--echo # Bug#17876 (Truncating mysql.slow_log in a SP after using cursor locks the +--echo # thread) +--echo # CREATE DATABASE db_17876; @@ -872,9 +832,9 @@ SET GLOBAL general_log = @old_general_log; SET GLOBAL slow_query_log = @old_slow_query_log; -# -# Bug#21557 entries in the general query log truncated at 1000 characters. -# +--echo # +--echo # Bug#21557 entries in the general query log truncated at 1000 characters. +--echo # select CONNECTION_ID() into @thread_id; --disable_ps_protocol @@ -993,15 +953,9 @@ deallocate prepare long_query; set global general_log = @old_general_log; -# -# Bug#34306: Can't make copy of log tables when server binary log is enabled -# - ---disable_warnings -DROP TABLE IF EXISTS log_count; -DROP TABLE IF EXISTS slow_log_copy; -DROP TABLE IF EXISTS general_log_copy; ---enable_warnings +--echo # +--echo # Bug#34306: Can't make copy of log tables when server binary log is enabled +--echo # CREATE TABLE log_count (count BIGINT(21)); @@ -1031,14 +985,14 @@ INSERT INTO log_count (count) VALUES ((SELECT count(*) FROM mysql.general_log)); DROP TABLE general_log_copy; -SET GLOBAL general_log = @saved_general_log; -SET GLOBAL slow_query_log = @saved_slow_query_log; +SET GLOBAL general_log = @old_general_log; +SET GLOBAL slow_query_log = @old_slow_query_log; DROP TABLE log_count; -# -# Bug #31700: thd->examined_row_count not incremented for 'const' type queries -# +--echo # +--echo # Bug #31700: thd->examined_row_count not incremented for 'const' type queries +--echo # SET SESSION long_query_time = 0; SET GLOBAL slow_query_log = ON; @@ -1065,16 +1019,12 @@ TRUNCATE TABLE mysql.slow_log; -# -# Bug #47924 main.log_tables times out sporadically -# +--echo # +--echo # Bug #47924 main.log_tables times out sporadically +--echo # use mysql; # Should result in error ---disable_warnings -drop table if exists renamed_general_log; -drop table if exists renamed_slow_log; ---enable_warnings --error ER_CANT_RENAME_LOG_TABLE RENAME TABLE general_log TO renamed_general_log; --error ER_CANT_RENAME_LOG_TABLE @@ -1084,7 +1034,24 @@ flush tables with read lock; unlock tables; -SET @@session.long_query_time= @old_long_query_time; +--echo # +--echo # MDEV-33267 User with minimal permissions can intentionally corrupt mysql.slow_log table +--echo # +truncate mysql.slow_log; +set global log_output= 'TABLE'; +create user u@localhost; +set slow_query_log=on, long_query_time=0.1; +select 'before evil-doing', sleep(0.2); +--connect (con1,localhost,u,,) +set @@timestamp= 2147483647; +set slow_query_log=on, long_query_time=0.1; +select 'evil-doing', sleep(1.1); +--disconnect con1 +--connection default +select 'after evil-doing', sleep(0.2); +select distinct sql_text from mysql.slow_log where sql_text like '%evil%'; +set global log_output=default; +drop user u@localhost; SET @@global.log_output= @old_log_output; SET @@global.slow_query_log= @old_slow_query_log; diff -Nru mariadb-10.11.6/mysql-test/main/long_host.result mariadb-10.11.9/mysql-test/main/long_host.result --- mariadb-10.11.6/mysql-test/main/long_host.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/long_host.result 2024-08-03 07:29:57.000000000 +0000 @@ -19,9 +19,9 @@ create table mariadbtestdb.t3 (a int); SET @saved_dbug = @@GLOBAL.debug_dbug; set global debug_dbug= "+d,vio_peer_addr_fake_ipv4,getnameinfo_fake_long_host,getaddrinfo_fake_good_ipv4"; +flush hosts; # check connect connect con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,; -connection con1; select current_user(); current_user() user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345 @@ -34,7 +34,6 @@ grant SELECT ON *.* TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,test,$MASTER_MYPORT,; -connection con1; select * from mariadbtestdb.t1; a b select * from mariadbtestdb2.t2; @@ -44,7 +43,6 @@ REVOKE ALL PRIVILEGES, GRANT OPTION FROM user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,; -connection con1; select * from mariadbtestdb.t1; ERROR 42000: SELECT command denied to user 'user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678'@'host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345' for table `mariadbtestdb`.`t1` select * from mariadbtestdb2.t2; @@ -54,7 +52,6 @@ grant SELECT ON mariadbtestdb.* TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,; -connection con1; select * from mariadbtestdb.t1; a b select * from mariadbtestdb2.t2; @@ -67,7 +64,6 @@ grant SELECT ON mariadbtestdb.t1 TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,; -connection con1; select * from mariadbtestdb.t1; a b select * from mariadbtestdb2.t2; @@ -80,7 +76,6 @@ grant SELECT (a) ON mariadbtestdb.t1 TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,; -connection con1; select * from mariadbtestdb.t1; ERROR 42000: SELECT command denied to user 'user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678'@'host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345' for table `mariadbtestdb`.`t1` select * from mariadbtestdb2.t2; @@ -100,7 +95,6 @@ grant role5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678 to user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,test,$MASTER_MYPORT,; -connection con1; select * from mariadbtestdb.t1; ERROR 42000: SELECT command denied to user 'user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678'@'host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345' for table `mariadbtestdb`.`t1` select * from mariadbtestdb2.t2; diff -Nru mariadb-10.11.6/mysql-test/main/long_host.test mariadb-10.11.9/mysql-test/main/long_host.test --- mariadb-10.11.6/mysql-test/main/long_host.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/long_host.test 2024-08-03 07:29:57.000000000 +0000 @@ -33,11 +33,11 @@ SET @saved_dbug = @@GLOBAL.debug_dbug; set global debug_dbug= "+d,vio_peer_addr_fake_ipv4,getnameinfo_fake_long_host,getaddrinfo_fake_good_ipv4"; +flush hosts; --echo # check connect connect (con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,); -connection con1; select current_user(); --echo # check global privileges @@ -51,7 +51,6 @@ grant SELECT ON *.* TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect (con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,test,$MASTER_MYPORT,); -connection con1; select * from mariadbtestdb.t1; select * from mariadbtestdb2.t2; @@ -62,7 +61,6 @@ REVOKE ALL PRIVILEGES, GRANT OPTION FROM user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect (con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,); -connection con1; --error ER_TABLEACCESS_DENIED_ERROR select * from mariadbtestdb.t1; --error ER_TABLEACCESS_DENIED_ERROR @@ -75,7 +73,6 @@ grant SELECT ON mariadbtestdb.* TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect (con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,); -connection con1; select * from mariadbtestdb.t1; --error ER_TABLEACCESS_DENIED_ERROR select * from mariadbtestdb2.t2; @@ -88,7 +85,6 @@ grant SELECT ON mariadbtestdb.t1 TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect (con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,); -connection con1; select * from mariadbtestdb.t1; --error ER_TABLEACCESS_DENIED_ERROR select * from mariadbtestdb2.t2; @@ -102,7 +98,6 @@ grant SELECT (a) ON mariadbtestdb.t1 TO user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678@host5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678913_345678914_345678915_345678916_345678917_345678918_345678919_345678920_345678921_345678922_345678923_345678924_345678925_345; disconnect con1; connect (con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,"*NO-ONE*",$MASTER_MYPORT,); -connection con1; --error ER_TABLEACCESS_DENIED_ERROR select * from mariadbtestdb.t1; --error ER_TABLEACCESS_DENIED_ERROR @@ -132,7 +127,6 @@ disconnect con1; connect (con1,"127.0.0.1","user5678901_345678902_345678903_345678904_345678905_345678906_345678907_345678908_345678909_345678910_345678911_345678912_345678",,test,$MASTER_MYPORT,); -connection con1; --error ER_TABLEACCESS_DENIED_ERROR select * from mariadbtestdb.t1; diff -Nru mariadb-10.11.6/mysql-test/main/long_unique_bugs.result mariadb-10.11.9/mysql-test/main/long_unique_bugs.result --- mariadb-10.11.6/mysql-test/main/long_unique_bugs.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/long_unique_bugs.result 2024-08-03 07:29:57.000000000 +0000 @@ -574,5 +574,161 @@ update t1 set b = 30 limit 1; drop table t1; # -# End of 10.5 tests +# MDEV-32839 LONG UNIQUE gives error when used with REPLACE +# +create table t1 ( +f1 bigint(20) not null auto_increment primary key, +f2 varchar(30) default null, +f3 varchar(30) default null, +f4 varchar(255) default null, +f5 varchar(30) default null, +f6 varchar(255) default null, +f7 varchar(255) default null, +unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=myisam; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +f1 f2 f3 f4 f5 f6 f7 +2 00004 0001009089999 netstes psit d +4 00004 0001009089999 netstes psit e +drop table t1; +create table t1 ( +f1 bigint(20) not null auto_increment primary key, +f2 varchar(30) default null, +f3 varchar(30) default null, +f4 varchar(255) default null, +f5 varchar(30) default null, +f6 varchar(255) default null, +f7 varchar(255) default null, +unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=innodb; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +f1 f2 f3 f4 f5 f6 f7 +2 00004 0001009089999 netstes psit d +4 00004 0001009089999 netstes psit e +drop table t1; +create table t1 ( +f1 bigint(20) not null auto_increment primary key, +f2 varchar(30) default null, +f3 varchar(30) default null, +f4 varchar(255) default null, +f5 varchar(30) default null, +f6 varchar(255) default null, +f7 varchar(255) default null, +unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=myisam partition by key(f1) partitions 2; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +f1 f2 f3 f4 f5 f6 f7 +2 00004 0001009089999 netstes psit d +4 00004 0001009089999 netstes psit e +drop table t1; +create table t1 ( +f1 bigint(20) not null auto_increment primary key, +f2 varchar(30) default null, +f3 varchar(30) default null, +f4 varchar(255) default null, +f5 varchar(30) default null, +f6 varchar(255) default null, +f7 varchar(255) default null, +unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=innodb partition by key(f1) partitions 2; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +f1 f2 f3 f4 f5 f6 f7 +2 00004 0001009089999 netstes psit d +4 00004 0001009089999 netstes psit e +drop table t1; +# +# MDEV-29954 Unique hash key on column prefix is computed incorrectly +# +create table t1 (c char(10),unique key a using hash (c(1))); +insert into t1 values (0); +check table t1 extended; +Table Op Msg_type Msg_text +test.t1 check status OK +drop table t1; # +# MDEV-32837 long unique does not work like unique key when using replace +# +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +REPLACE INTO t1 VALUES (3,1,1); +SELECT * FROM t1 ORDER BY a; +a b c +2 2 2 +3 1 1 +REPLACE INTO t1 VALUES (3,2,2); +SELECT * FROM t1; +a b c +3 2 2 +DROP TABLE t1; +# MDEV-30046 wrong row targeted with "insert ... on duplicate" and +# "replace", leading to data corruption +create table t (s blob, n int, unique (s)) engine=innodb; +insert into t values ('Hrecvx_0004ln-00',1), ('Hrecvx_0004mm-00',1); +replace into t values ('Hrecvx_0004mm-00',2); +select * from t; +s n +Hrecvx_0004ln-00 1 +Hrecvx_0004mm-00 2 +drop table t; +create table t (s blob, n int, unique (s)) engine=innodb; +insert into t values ('Hrecvx_0004ln-00',1), ('Hrecvx_0004mm-00',1); +insert into t values ('Hrecvx_0004mm-00',2) +on duplicate key update n = values (n); +select * from t; +s n +Hrecvx_0004ln-00 1 +Hrecvx_0004mm-00 2 +drop table t; +# +# MDEV-29345 update case insensitive (large) unique key with insensitive change of value - duplicate key +# +create table t1 (a int, b text, unique (b)); +insert ignore t1 values (1, 'a'), (2, 'A'); +Warnings: +Warning 1062 Duplicate entry 'A' for key 'b' +select * from t1; +a b +1 a +update t1 set b='A' where a=1; +select * from t1; +a b +1 A +drop table t1; +create table t1 (a int, b blob, unique (b)); +insert t1 values (1, 'a'), (2, 'A'); +select * from t1; +a b +1 a +2 A +update t1 set b='A' where a=1; +ERROR 23000: Duplicate entry 'A' for key 'b' +drop table t1; +# +# MDEV-25102 UNIQUE USING HASH error after ALTER ... DISABLE KEYS +# +create table t1 (i int, unique key (i) using hash); +alter table t1 disable keys; +insert into t1 values (1),(2); +insert into t1 values (1); +ERROR 23000: Duplicate entry '1' for key 'i' +alter table t1 enable keys; +insert into t1 values (2); +ERROR 23000: Duplicate entry '2' for key 'i' +drop table t1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/long_unique_bugs.test mariadb-10.11.9/mysql-test/main/long_unique_bugs.test --- mariadb-10.11.6/mysql-test/main/long_unique_bugs.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/long_unique_bugs.test 2024-08-03 07:29:57.000000000 +0000 @@ -503,7 +503,6 @@ alter table tmp alter column a set default 8; unlock tables; drop table t2; ---source include/have_innodb.inc --echo # --echo # MDEV-22218 InnoDB: Failing assertion: node->pcur->rel_pos == BTR_PCUR_ON upon LOAD DATA with NO_BACKSLASH_ESCAPES in SQL_MODE and unique blob in table @@ -564,5 +563,139 @@ drop table t1; --echo # ---echo # End of 10.5 tests +--echo # MDEV-32839 LONG UNIQUE gives error when used with REPLACE +--echo # +create table t1 ( + f1 bigint(20) not null auto_increment primary key, + f2 varchar(30) default null, + f3 varchar(30) default null, + f4 varchar(255) default null, + f5 varchar(30) default null, + f6 varchar(255) default null, + f7 varchar(255) default null, + unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=myisam; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +drop table t1; + +create table t1 ( + f1 bigint(20) not null auto_increment primary key, + f2 varchar(30) default null, + f3 varchar(30) default null, + f4 varchar(255) default null, + f5 varchar(30) default null, + f6 varchar(255) default null, + f7 varchar(255) default null, + unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=innodb; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +drop table t1; + +create table t1 ( + f1 bigint(20) not null auto_increment primary key, + f2 varchar(30) default null, + f3 varchar(30) default null, + f4 varchar(255) default null, + f5 varchar(30) default null, + f6 varchar(255) default null, + f7 varchar(255) default null, + unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=myisam partition by key(f1) partitions 2; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +drop table t1; + +create table t1 ( + f1 bigint(20) not null auto_increment primary key, + f2 varchar(30) default null, + f3 varchar(30) default null, + f4 varchar(255) default null, + f5 varchar(30) default null, + f6 varchar(255) default null, + f7 varchar(255) default null, + unique problem_key (f3,f5,f6,f2,f4,f7) using hash +) engine=innodb partition by key(f1) partitions 2; +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'd'); +insert t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +replace t1 (f2, f3, f4, f5, f6, f7) values ('00004', '0001009089999', '', 'netstes', 'psit', 'e'); +select * from t1; +drop table t1; + +--echo # +--echo # MDEV-29954 Unique hash key on column prefix is computed incorrectly +--echo # +create table t1 (c char(10),unique key a using hash (c(1))); +insert into t1 values (0); +check table t1 extended; +drop table t1; + +--echo # +--echo # MDEV-32837 long unique does not work like unique key when using replace --echo # + +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +REPLACE INTO t1 VALUES (3,1,1); +SELECT * FROM t1 ORDER BY a; +REPLACE INTO t1 VALUES (3,2,2); +SELECT * FROM t1; +DROP TABLE t1; + +--echo # MDEV-30046 wrong row targeted with "insert ... on duplicate" and +--echo # "replace", leading to data corruption +--source include/have_innodb.inc +create table t (s blob, n int, unique (s)) engine=innodb; +insert into t values ('Hrecvx_0004ln-00',1), ('Hrecvx_0004mm-00',1); +replace into t values ('Hrecvx_0004mm-00',2); +select * from t; +drop table t; + +create table t (s blob, n int, unique (s)) engine=innodb; +insert into t values ('Hrecvx_0004ln-00',1), ('Hrecvx_0004mm-00',1); +insert into t values ('Hrecvx_0004mm-00',2) + on duplicate key update n = values (n); +select * from t; +drop table t; +--echo # +--echo # MDEV-29345 update case insensitive (large) unique key with insensitive change of value - duplicate key +--echo # +create table t1 (a int, b text, unique (b)); +insert ignore t1 values (1, 'a'), (2, 'A'); +select * from t1; +update t1 set b='A' where a=1; +select * from t1; +drop table t1; + +create table t1 (a int, b blob, unique (b)); +insert t1 values (1, 'a'), (2, 'A'); +select * from t1; +--error ER_DUP_ENTRY +update t1 set b='A' where a=1; +drop table t1; + +--echo # +--echo # MDEV-25102 UNIQUE USING HASH error after ALTER ... DISABLE KEYS +--echo # +create table t1 (i int, unique key (i) using hash); +alter table t1 disable keys; +insert into t1 values (1),(2); +--error ER_DUP_ENTRY +insert into t1 values (1); +alter table t1 enable keys; +--error ER_DUP_ENTRY +insert into t1 values (2); +drop table t1; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/long_unique_bugs_no_sp_protocol.result mariadb-10.11.9/mysql-test/main/long_unique_bugs_no_sp_protocol.result --- mariadb-10.11.6/mysql-test/main/long_unique_bugs_no_sp_protocol.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/long_unique_bugs_no_sp_protocol.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,95 @@ +# +# Start of 10.5 tests +# +# +# MDEV-32837 long unique does not work like unique key when using replace +# +# +# Normal unique key + long unique key +# +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,1,1); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +Variable_name Value +Handler_delete 1 +Handler_read_key 2 +Handler_read_rnd 1 +Handler_write 1 +SELECT * FROM t1 ORDER BY a; +a b c +2 2 2 +3 1 1 +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,2,2); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +Variable_name Value +Handler_delete 1 +Handler_read_key 3 +Handler_read_rnd 2 +Handler_update 1 +Handler_write 1 +SELECT * FROM t1; +a b c +3 2 2 +DROP TABLE t1; +# +# Two long unique keys +# +CREATE TABLE t1 (a INT, b INT, c INT, UNIQUE KEY a (a) USING HASH,UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,1,1); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +Variable_name Value +Handler_read_key 3 +Handler_read_rnd 1 +Handler_update 1 +SELECT * FROM t1 ORDER BY a; +a b c +2 2 2 +3 1 1 +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,2,2); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +Variable_name Value +Handler_delete 1 +Handler_read_key 4 +Handler_read_rnd 2 +Handler_update 1 +SELECT * FROM t1; +a b c +3 2 2 +DROP TABLE t1; +# +# One long unique key +# +CREATE TABLE t1 (a INT, b INT, c INT, UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,1,1); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +Variable_name Value +Handler_read_key 1 +Handler_read_rnd 1 +Handler_update 1 +SELECT * FROM t1 ORDER BY a; +a b c +2 2 2 +3 1 1 +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,2,2); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +Variable_name Value +Handler_read_key 1 +Handler_read_rnd 1 +Handler_update 1 +SELECT * FROM t1; +a b c +3 1 1 +3 2 2 +DROP TABLE t1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/long_unique_bugs_no_sp_protocol.test mariadb-10.11.9/mysql-test/main/long_unique_bugs_no_sp_protocol.test --- mariadb-10.11.6/mysql-test/main/long_unique_bugs_no_sp_protocol.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/long_unique_bugs_no_sp_protocol.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,68 @@ +if (`SELECT $SP_PROTOCOL > 0`) +{ + --skip Test requires: sp-protocol disabled +} + + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-32837 long unique does not work like unique key when using replace +--echo # + +# This test produces different Handler commands in the SHOW STATUS output +# with --sp-protocol. So it's here, in this *.test file with --sp-protocol disabled. + +--echo # +--echo # Normal unique key + long unique key +--echo # + +CREATE TABLE t1 (a INT PRIMARY KEY, b INT, c INT, UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,1,1); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +SELECT * FROM t1 ORDER BY a; +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,2,2); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # Two long unique keys +--echo # + +CREATE TABLE t1 (a INT, b INT, c INT, UNIQUE KEY a (a) USING HASH,UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,1,1); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +SELECT * FROM t1 ORDER BY a; +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,2,2); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # One long unique key +--echo # + +CREATE TABLE t1 (a INT, b INT, c INT, UNIQUE KEY `test` (b,c) USING HASH) ENGINE=MyISAM; +INSERT INTO t1 VALUES (1,1,1),(2,2,2); +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,1,1); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +SELECT * FROM t1 ORDER BY a; +FLUSH STATUS; +REPLACE INTO t1 VALUES (3,2,2); +SHOW STATUS WHERE Variable_name LIKE 'handler%' AND Value>0; +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/lotofstack.result mariadb-10.11.9/mysql-test/main/lotofstack.result --- mariadb-10.11.6/mysql-test/main/lotofstack.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lotofstack.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,101 @@ +create function bug10100f(prm int) returns int +begin +if prm > 1 then +return prm * bug10100f(prm - 1); +end if; +return 1; +end| +set statement sql_mode = '' for +create procedure bug10100p(prm int, inout res int) +begin +set res = res * prm; +if prm > 1 then +call bug10100p(prm - 1, res); +end if; +end| +set statement sql_mode = '' for +create procedure bug10100t(prm int) +begin +declare res int; +set res = 1; +call bug10100p(prm, res); +select res; +end| +create table t3 (a int)| +insert into t3 values (0)| +create view v1 as select a from t3| +create procedure bug10100pt(level int, lim int) +begin +if level < lim then +update t3 set a=level; +FLUSH TABLES; +call bug10100pt(level+1, lim); +else +select * from t3; +end if; +end| +create procedure bug10100pv(level int, lim int) +begin +if level < lim then +update v1 set a=level; +FLUSH TABLES; +call bug10100pv(level+1, lim); +else +select * from v1; +end if; +end| +prepare stmt2 from "select * from t3;"; +create procedure bug10100pd(level int, lim int) +begin +if level < lim then +select level; +prepare stmt1 from "update t3 set a=a+2"; +execute stmt1; +FLUSH TABLES; +execute stmt1; +FLUSH TABLES; +execute stmt1; +FLUSH TABLES; +deallocate prepare stmt1; +execute stmt2; +select * from t3; +call bug10100pd(level+1, lim); +else +execute stmt2; +end if; +end| +create procedure bug10100pc(level int, lim int) +begin +declare lv int; +declare c cursor for select a from t3; +open c; +if level < lim then +select level; +fetch c into lv; +select lv; +update t3 set a=level+lv; +FLUSH TABLES; +call bug10100pc(level+1, lim); +else +select * from t3; +end if; +close c; +end| +set @@max_sp_recursion_depth=255| +set @var=1| +call bug10100p(255, @var)| +call bug10100pt(1,255)| +call bug10100pv(1,255)| +call bug10100pd(1,255)| +call bug10100pc(1,255)| +set @@max_sp_recursion_depth=0| +deallocate prepare stmt2| +drop function bug10100f| +drop procedure bug10100p| +drop procedure bug10100t| +drop procedure bug10100pt| +drop procedure bug10100pv| +drop procedure bug10100pd| +drop procedure bug10100pc| +drop view v1| +drop table t3| diff -Nru mariadb-10.11.6/mysql-test/main/lotofstack.test mariadb-10.11.9/mysql-test/main/lotofstack.test --- mariadb-10.11.6/mysql-test/main/lotofstack.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lotofstack.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,133 @@ +# +# For tests that need a lot of stack - they likely won't work under ASAN +# +source include/not_asan.inc; +source include/not_embedded.inc; + +# +# Bug#10100 function (and stored procedure?) recursivity problem +# +# routines with simple recursion +delimiter |; +create function bug10100f(prm int) returns int +begin + if prm > 1 then + return prm * bug10100f(prm - 1); + end if; + return 1; +end| +set statement sql_mode = '' for +create procedure bug10100p(prm int, inout res int) +begin + set res = res * prm; + if prm > 1 then + call bug10100p(prm - 1, res); + end if; +end| +set statement sql_mode = '' for +create procedure bug10100t(prm int) +begin + declare res int; + set res = 1; + call bug10100p(prm, res); + select res; +end| + +# a procedure which use tables and recursion +create table t3 (a int)| +insert into t3 values (0)| +create view v1 as select a from t3| +create procedure bug10100pt(level int, lim int) +begin + if level < lim then + update t3 set a=level; + FLUSH TABLES; + call bug10100pt(level+1, lim); + else + select * from t3; + end if; +end| +# view & recursion +create procedure bug10100pv(level int, lim int) +begin + if level < lim then + update v1 set a=level; + FLUSH TABLES; + call bug10100pv(level+1, lim); + else + select * from v1; + end if; +end| +# dynamic sql & recursion +prepare stmt2 from "select * from t3;"; +create procedure bug10100pd(level int, lim int) +begin + if level < lim then + select level; + prepare stmt1 from "update t3 set a=a+2"; + execute stmt1; + FLUSH TABLES; + execute stmt1; + FLUSH TABLES; + execute stmt1; + FLUSH TABLES; + deallocate prepare stmt1; + execute stmt2; + select * from t3; + call bug10100pd(level+1, lim); + else + execute stmt2; + end if; +end| +# cursor & recursion +create procedure bug10100pc(level int, lim int) +begin + declare lv int; + declare c cursor for select a from t3; + open c; + if level < lim then + select level; + fetch c into lv; + select lv; + update t3 set a=level+lv; + FLUSH TABLES; + call bug10100pc(level+1, lim); + else + select * from t3; + end if; + close c; +end| + +# end of the stack checking +set @@max_sp_recursion_depth=255| +set @var=1| +# disable log because error about stack overrun contains numbers which +# depend on a system +-- disable_ps_protocol +-- disable_result_log +-- error ER_STACK_OVERRUN_NEED_MORE +call bug10100p(255, @var)| +-- error ER_STACK_OVERRUN_NEED_MORE +call bug10100pt(1,255)| +-- error ER_STACK_OVERRUN_NEED_MORE +call bug10100pv(1,255)| +-- error ER_STACK_OVERRUN_NEED_MORE +call bug10100pd(1,255)| +-- error ER_STACK_OVERRUN_NEED_MORE +call bug10100pc(1,255)| +-- enable_result_log +-- enable_ps_protocol +set @@max_sp_recursion_depth=0| + +deallocate prepare stmt2| + +drop function bug10100f| +drop procedure bug10100p| +drop procedure bug10100t| +drop procedure bug10100pt| +drop procedure bug10100pv| +drop procedure bug10100pd| +drop procedure bug10100pc| +drop view v1| +drop table t3| +delimiter ;| diff -Nru mariadb-10.11.6/mysql-test/main/lowercase_fs_on.test mariadb-10.11.9/mysql-test/main/lowercase_fs_on.test --- mariadb-10.11.6/mysql-test/main/lowercase_fs_on.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lowercase_fs_on.test 2024-08-03 07:29:57.000000000 +0000 @@ -16,7 +16,7 @@ --remove_file $SEARCH_FILE #Shutdown the server ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -30,7 +30,7 @@ --source include/search_pattern_in_file.inc #Restart the server ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/wait_until_connected_again.inc #Cleanup diff -Nru mariadb-10.11.6/mysql-test/main/lowercase_table5.result mariadb-10.11.9/mysql-test/main/lowercase_table5.result --- mariadb-10.11.6/mysql-test/main/lowercase_table5.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lowercase_table5.result 2024-08-03 07:29:57.000000000 +0000 @@ -11,3 +11,181 @@ mysql_TEST CREATE DATABASE `mysql_TEST` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */ DROP DATABASE mysql_test; DROP DATABASE mysql_TEST; +# +# Start of 10.4 tests +# +# +# MDEV-33019 The database part is not case sensitive in SP names +# +CREATE DATABASE DB1; +CREATE DATABASE db1; +CREATE PROCEDURE DB1.sp() SELECT 'This is DB1.sp' AS ret; +CREATE PROCEDURE db1.sp() SELECT 'This is db1.sp' AS ret; +CALL DB1.sp(); +ret +This is DB1.sp +CALL db1.sp(); +ret +This is db1.sp +DROP DATABASE DB1; +CALL DB1.sp(); +ERROR 42000: PROCEDURE DB1.sp does not exist +CALL db1.sp(); +ret +This is db1.sp +DROP DATABASE db1; +CREATE PROCEDURE SP() SELECT 'This is SP' AS ret; +CREATE PROCEDURE sp() SELECT 'This is sp' AS ret; +ERROR 42000: PROCEDURE sp already exists +CALL SP(); +ret +This is SP +CALL sp(); +ret +This is SP +DROP PROCEDURE SP; +# +# End of 10.4 tests +# +# +# Start of 10.5 tests +# +# +# MDEV-33084 LASTVAL(t1) and LASTVAL(T1) do not work well with lower-case-table-names=0 +# +CREATE SEQUENCE t1; +CREATE SEQUENCE T1; +SELECT nextval(t1), lastval(t1); +nextval(t1) lastval(t1) +1 1 +SELECT nextval(T1), lastval(T1); +nextval(T1) lastval(T1) +1 1 +SELECT lastval(t1), lastval(T1) l2; +lastval(t1) l2 +1 1 +DROP SEQUENCE t1, T1; +# +# MDEV-33086 SHOW OPEN TABLES IN DB1 -- is case insensitive with lower-case-table-names=0 +# +CREATE DATABASE db1; +CREATE TABLE db1.t1 (a INT); +SELECT * FROM db1.t1; +a +SHOW OPEN TABLES IN DB1; +Database Table In_use Name_locked +SHOW OPEN TABLES IN db1; +Database Table In_use Name_locked +db1 t1 0 0 +DROP DATABASE db1; +# +# MDEV-33088 Cannot create triggers in the database `MYSQL` +# +CREATE DATABASE MYSQL; +CREATE TABLE MYSQL.t1 (a INT); +CREATE TABLE MYSQL.t2 (a INT); +CREATE TRIGGER MYSQL.tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (new.a); +INSERT INTO MYSQL.t1 VALUES (10); +SELECT * FROM MYSQL.t1; +a +10 +SELECT * FROM MYSQL.t2; +a +10 +DROP DATABASE MYSQL; +# +# MDEV-33103 LOCK TABLE t1 AS t2 -- alias is not case sensitive with lower-case-table-names=0 +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1); +LOCK TABLE t1 AS t2 READ; +SELECT * FROM t1 AS t2; +a +1 +UNLOCK TABLES; +LOCK TABLE t1 AS t2 READ; +SELECT * FROM t1 AS T2; +ERROR HY000: Table 'T2' was not locked with LOCK TABLES +UNLOCK TABLES; +DROP TABLE t1; +# +# MDEV-33108 TABLE_STATISTICS and INDEX_STATISTICS are case insensitive with lower-case-table-names=0 +# +SET GLOBAL userstat=1; +CREATE TABLE t1 (a INT, KEY(a)); +INSERT INTO t1 VALUES (1),(2),(3),(4); +SELECT * FROM t1 ORDER BY a; +a +1 +2 +3 +4 +CREATE TABLE T1 (a INT, KEY(a)); +INSERT INTO T1 VALUES (1),(2),(3),(4); +SELECT * FROM T1 ORDER BY a; +a +1 +2 +3 +4 +SELECT * FROM INFORMATION_SCHEMA.TABLE_STATISTICS ORDER BY BINARY TABLE_NAME; +TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES +test T1 4 4 4 +test t1 4 4 4 +SELECT * FROM INFORMATION_SCHEMA.INDEX_STATISTICS ORDER BY BINARY TABLE_NAME; +TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ +test T1 a 4 +test t1 a 4 +DROP TABLE t1; +DROP TABLE T1; +SET GLOBAL userstat=DEFAULT; +# +# MDEV-33109 DROP DATABASE MYSQL -- does not drop SP with lower-case-table-names=0 +# +CREATE DATABASE MYSQL; +CREATE FUNCTION MYSQL.f1() RETURNS INT RETURN 1; +DROP DATABASE MYSQL; +SELECT db, name, body FROM mysql.proc WHERE db=BINARY 'MYSQL' AND name='f1'; +db name body +# +# MDEV-33110 HANDLER commands are case insensitive with lower-case-table-names=0 +# +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +HANDLER t1 OPEN; +HANDLER t1 READ FIRST; +a +1 +CREATE OR REPLACE TABLE T1 (a INT); +DROP TABLE T1; +HANDLER t1 READ NEXT; +a +2 +HANDLER t1 CLOSE; +DROP TABLE t1; +# +# MDEV-33120 System log table names are case insensitive with lower-cast-table-names=0 +# +CREATE TABLE mysql.GENERAL_log (a INT); +INSERT INTO mysql.GENERAL_log VALUES (1),(2); +DROP TABLE mysql.GENERAL_log; +CREATE TABLE mysql.SLOW_log (a INT); +INSERT INTO mysql.SLOW_log VALUES (1),(2); +DROP TABLE mysql.SLOW_log; +CREATE TABLE mysql.TRANSACTION_registry (a INT); +INSERT INTO mysql.TRANSACTION_registry VALUES (1),(2); +DROP TABLE mysql.TRANSACTION_registry; +CREATE DATABASE MYSQL; +CREATE TABLE MYSQL.general_log (a INT); +INSERT INTO MYSQL.general_log VALUES (1),(2); +DROP TABLE MYSQL.general_log; +CREATE TABLE MYSQL.slow_log (a INT); +INSERT INTO MYSQL.slow_log VALUES (1),(2); +DROP TABLE MYSQL.slow_log; +CREATE TABLE MYSQL.transaction_registry (a INT); +INSERT INTO MYSQL.transaction_registry VALUES (1),(2); +DROP TABLE MYSQL.transaction_registry; +DROP DATABASE MYSQL; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/lowercase_table5.test mariadb-10.11.9/mysql-test/main/lowercase_table5.test --- mariadb-10.11.6/mysql-test/main/lowercase_table5.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/lowercase_table5.test 2024-08-03 07:29:57.000000000 +0000 @@ -18,3 +18,172 @@ DROP DATABASE mysql_TEST; # End of 10.0 tests + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-33019 The database part is not case sensitive in SP names +--echo # + +CREATE DATABASE DB1; +CREATE DATABASE db1; +CREATE PROCEDURE DB1.sp() SELECT 'This is DB1.sp' AS ret; +CREATE PROCEDURE db1.sp() SELECT 'This is db1.sp' AS ret; +CALL DB1.sp(); +CALL db1.sp(); +DROP DATABASE DB1; +--error ER_SP_DOES_NOT_EXIST +CALL DB1.sp(); +CALL db1.sp(); +DROP DATABASE db1; + +CREATE PROCEDURE SP() SELECT 'This is SP' AS ret; +--error ER_SP_ALREADY_EXISTS +CREATE PROCEDURE sp() SELECT 'This is sp' AS ret; +CALL SP(); +CALL sp(); +DROP PROCEDURE SP; + +--echo # +--echo # End of 10.4 tests +--echo # + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-33084 LASTVAL(t1) and LASTVAL(T1) do not work well with lower-case-table-names=0 +--echo # + +CREATE SEQUENCE t1; +CREATE SEQUENCE T1; +--disable_ps2_protocol +SELECT nextval(t1), lastval(t1); +SELECT nextval(T1), lastval(T1); +SELECT lastval(t1), lastval(T1) l2; +--enable_ps2_protocol +DROP SEQUENCE t1, T1; + +--echo # +--echo # MDEV-33086 SHOW OPEN TABLES IN DB1 -- is case insensitive with lower-case-table-names=0 +--echo # + +CREATE DATABASE db1; +CREATE TABLE db1.t1 (a INT); +SELECT * FROM db1.t1; +SHOW OPEN TABLES IN DB1; +SHOW OPEN TABLES IN db1; +DROP DATABASE db1; + +--echo # +--echo # MDEV-33088 Cannot create triggers in the database `MYSQL` +--echo # + +CREATE DATABASE MYSQL; +CREATE TABLE MYSQL.t1 (a INT); +CREATE TABLE MYSQL.t2 (a INT); +CREATE TRIGGER MYSQL.tr1 AFTER INSERT ON t1 FOR EACH ROW INSERT INTO t2 VALUES (new.a); +INSERT INTO MYSQL.t1 VALUES (10); +SELECT * FROM MYSQL.t1; +SELECT * FROM MYSQL.t2; +DROP DATABASE MYSQL; + + +--echo # +--echo # MDEV-33103 LOCK TABLE t1 AS t2 -- alias is not case sensitive with lower-case-table-names=0 +--echo # + +--disable_view_protocol +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1); +LOCK TABLE t1 AS t2 READ; +SELECT * FROM t1 AS t2; +UNLOCK TABLES; +LOCK TABLE t1 AS t2 READ; +--error ER_TABLE_NOT_LOCKED +SELECT * FROM t1 AS T2; +UNLOCK TABLES; +DROP TABLE t1; +--enable_view_protocol + + +--echo # +--echo # MDEV-33108 TABLE_STATISTICS and INDEX_STATISTICS are case insensitive with lower-case-table-names=0 +--echo # + +SET GLOBAL userstat=1; +CREATE TABLE t1 (a INT, KEY(a)); +INSERT INTO t1 VALUES (1),(2),(3),(4); +--disable_ps2_protocol +SELECT * FROM t1 ORDER BY a; +CREATE TABLE T1 (a INT, KEY(a)); +INSERT INTO T1 VALUES (1),(2),(3),(4); +SELECT * FROM T1 ORDER BY a; +--enable_ps2_protocol +SELECT * FROM INFORMATION_SCHEMA.TABLE_STATISTICS ORDER BY BINARY TABLE_NAME; +SELECT * FROM INFORMATION_SCHEMA.INDEX_STATISTICS ORDER BY BINARY TABLE_NAME; +DROP TABLE t1; +DROP TABLE T1; +SET GLOBAL userstat=DEFAULT; + + +--echo # +--echo # MDEV-33109 DROP DATABASE MYSQL -- does not drop SP with lower-case-table-names=0 +--echo # + +CREATE DATABASE MYSQL; +CREATE FUNCTION MYSQL.f1() RETURNS INT RETURN 1; +DROP DATABASE MYSQL; +SELECT db, name, body FROM mysql.proc WHERE db=BINARY 'MYSQL' AND name='f1'; + + +--echo # +--echo # MDEV-33110 HANDLER commands are case insensitive with lower-case-table-names=0 +--echo # + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (1),(2); +HANDLER t1 OPEN; +HANDLER t1 READ FIRST; +CREATE OR REPLACE TABLE T1 (a INT); +DROP TABLE T1; +HANDLER t1 READ NEXT; +HANDLER t1 CLOSE; +DROP TABLE t1; + +--echo # +--echo # MDEV-33120 System log table names are case insensitive with lower-cast-table-names=0 +--echo # + +CREATE TABLE mysql.GENERAL_log (a INT); +INSERT INTO mysql.GENERAL_log VALUES (1),(2); +DROP TABLE mysql.GENERAL_log; + +CREATE TABLE mysql.SLOW_log (a INT); +INSERT INTO mysql.SLOW_log VALUES (1),(2); +DROP TABLE mysql.SLOW_log; + +CREATE TABLE mysql.TRANSACTION_registry (a INT); +INSERT INTO mysql.TRANSACTION_registry VALUES (1),(2); +DROP TABLE mysql.TRANSACTION_registry; + +CREATE DATABASE MYSQL; +CREATE TABLE MYSQL.general_log (a INT); +INSERT INTO MYSQL.general_log VALUES (1),(2); +DROP TABLE MYSQL.general_log; + +CREATE TABLE MYSQL.slow_log (a INT); +INSERT INTO MYSQL.slow_log VALUES (1),(2); +DROP TABLE MYSQL.slow_log; + +CREATE TABLE MYSQL.transaction_registry (a INT); +INSERT INTO MYSQL.transaction_registry VALUES (1),(2); +DROP TABLE MYSQL.transaction_registry; +DROP DATABASE MYSQL; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/max_password_errors.result mariadb-10.11.9/mysql-test/main/max_password_errors.result --- mariadb-10.11.6/mysql-test/main/max_password_errors.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/max_password_errors.result 2024-08-03 07:29:57.000000000 +0000 @@ -9,10 +9,10 @@ ERROR 28000: Access denied for user 'u'@'localhost' (using password: YES) connect(localhost,u,good_pass,test,MASTER_PORT,MASTER_SOCKET); connect con1, localhost, u, good_pass; -ERROR HY000: User is blocked because of too many credential errors; unblock with 'FLUSH PRIVILEGES' +ERROR HY000: User is blocked because of too many credential errors; unblock with 'ALTER USER / FLUSH PRIVILEGES' connect(localhost,u,bad_pass,test,MASTER_PORT,MASTER_SOCKET); connect con1, localhost, u, bad_pass; -ERROR HY000: User is blocked because of too many credential errors; unblock with 'FLUSH PRIVILEGES' +ERROR HY000: User is blocked because of too many credential errors; unblock with 'ALTER USER / FLUSH PRIVILEGES' FLUSH PRIVILEGES; connect con1, localhost, u, good_pass; disconnect con1; @@ -27,7 +27,7 @@ connect con1, localhost, u, good_pass; ERROR 28000: Access denied for user 'u'@'localhost' (using password: YES) ERROR 28000: Access denied for user 'u'@'localhost' (using password: YES) -ERROR HY000: User is blocked because of too many credential errors; unblock with 'FLUSH PRIVILEGES' +ERROR HY000: User is blocked because of too many credential errors; unblock with 'ALTER USER / FLUSH PRIVILEGES' disconnect con1; connection default; FLUSH PRIVILEGES; @@ -40,6 +40,21 @@ connect con1, localhost, u, good_pass; disconnect con1; connection default; +connect(localhost,u,bad_password,test,MASTER_PORT,MASTER_SOCKET); +connect con1, localhost, u, bad_password; +ERROR 28000: Access denied for user 'u'@'localhost' (using password: YES) +connect(localhost,u,bad_password,test,MASTER_PORT,MASTER_SOCKET); +connect con1, localhost, u, bad_password; +ERROR 28000: Access denied for user 'u'@'localhost' (using password: YES) +connect(localhost,u,good_pass,test,MASTER_PORT,MASTER_SOCKET); +connect con1, localhost, u, good_pass; +ERROR HY000: User is blocked because of too many credential errors; unblock with 'ALTER USER / FLUSH PRIVILEGES' +ALTER USER u ACCOUNT UNLOCK; +connect(localhost,u,bad_password,test,MASTER_PORT,MASTER_SOCKET); +connect con1, localhost, u, bad_password; +ERROR 28000: Access denied for user 'u'@'localhost' (using password: YES) +connect con1, localhost, u, good_pass; +disconnect con1; +connection default; DROP USER u; -FLUSH PRIVILEGES; set global max_password_errors=@old_max_password_errors; diff -Nru mariadb-10.11.6/mysql-test/main/max_password_errors.test mariadb-10.11.9/mysql-test/main/max_password_errors.test --- mariadb-10.11.6/mysql-test/main/max_password_errors.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/max_password_errors.test 2024-08-03 07:29:57.000000000 +0000 @@ -59,6 +59,28 @@ connect (con1, localhost, u, good_pass); disconnect con1; connection default; + +# Block u again +--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT +error ER_ACCESS_DENIED_ERROR; +connect(con1, localhost, u, bad_password); +--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT +error ER_ACCESS_DENIED_ERROR; +connect(con1, localhost, u, bad_password); +--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT +error ER_USER_IS_BLOCKED; +connect(con1, localhost, u, good_pass); + +# Unblock foo +ALTER USER u ACCOUNT UNLOCK; + +--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT +error ER_ACCESS_DENIED_ERROR; +connect(con1, localhost, u, bad_password); + +connect(con1, localhost, u, good_pass); +disconnect con1; +connection default; + DROP USER u; -FLUSH PRIVILEGES; -set global max_password_errors=@old_max_password_errors; \ No newline at end of file +set global max_password_errors=@old_max_password_errors; diff -Nru mariadb-10.11.6/mysql-test/main/mdl.result mariadb-10.11.9/mysql-test/main/mdl.result --- mariadb-10.11.6/mysql-test/main/mdl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mdl.result 2024-08-03 07:29:57.000000000 +0000 @@ -61,7 +61,7 @@ # # Check MDL locks taken for different kind of tables by open # -CREATE TABLE t1(a INT) ENGINE=InnoDB; +CREATE TABLE t1(a INT) stats_persistent=0, ENGINE=InnoDB; CREATE TABLE t3(a INT) ENGINE=myisam; connect purge_control,localhost,root,,; START TRANSACTION WITH CONSISTENT SNAPSHOT; diff -Nru mariadb-10.11.6/mysql-test/main/mdl.test mariadb-10.11.9/mysql-test/main/mdl.test --- mariadb-10.11.6/mysql-test/main/mdl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mdl.test 2024-08-03 07:29:57.000000000 +0000 @@ -43,7 +43,7 @@ --echo # Check MDL locks taken for different kind of tables by open --echo # -CREATE TABLE t1(a INT) ENGINE=InnoDB; +CREATE TABLE t1(a INT) stats_persistent=0, ENGINE=InnoDB; CREATE TABLE t3(a INT) ENGINE=myisam; connect(purge_control,localhost,root,,); START TRANSACTION WITH CONSISTENT SNAPSHOT; diff -Nru mariadb-10.11.6/mysql-test/main/mdl_sync.result mariadb-10.11.9/mysql-test/main/mdl_sync.result --- mariadb-10.11.6/mysql-test/main/mdl_sync.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mdl_sync.result 2024-08-03 07:29:57.000000000 +0000 @@ -2403,6 +2403,7 @@ SET DEBUG_SYNC= 'now WAIT_FOR table_opened'; # Check that FLUSH must wait to get the GRL # and let DROP PROCEDURE continue +InnoDB 0 transactions not purged SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME MDL_BACKUP_DDL Backup lock @@ -2427,9 +2428,12 @@ # UPDATE should wait for FTWRL with non transactional table second # create table t1 (a int) engine=myisam; -create table t2 (a int) engine=innodb; +create table t2 (a int) stats_persistent=0, engine=innodb; insert into t1 values (1); insert into t2 values (1); +connect con1, localhost, root; +start transaction with consistent snapshot; +connection default; SET DEBUG_SYNC= 'after_open_table_mdl_shared SIGNAL table_opened WAIT_FOR grlwait execute 2'; update t1,t2 set t1.a=2,t2.a=3; connection con2; @@ -2461,6 +2465,7 @@ SET DEBUG_SYNC= 'RESET'; drop table t1,t2; disconnect con2; +disconnect con1; # # Bug#50786 Assertion `thd->mdl_context.trans_sentinel() == __null' # failed in open_ltable() diff -Nru mariadb-10.11.6/mysql-test/main/mdl_sync.test mariadb-10.11.9/mysql-test/main/mdl_sync.test --- mariadb-10.11.6/mysql-test/main/mdl_sync.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mdl_sync.test 2024-08-03 07:29:57.000000000 +0000 @@ -3085,6 +3085,7 @@ SET DEBUG_SYNC= 'now WAIT_FOR table_opened'; --echo # Check that FLUSH must wait to get the GRL --echo # and let DROP PROCEDURE continue +--source ../suite/innodb/include/wait_all_purged.inc SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; SET DEBUG_SYNC= 'mdl_acquire_lock_wait SIGNAL grlwait'; --send FLUSH TABLES WITH READ LOCK @@ -3110,10 +3111,16 @@ --echo # create table t1 (a int) engine=myisam; -create table t2 (a int) engine=innodb; +create table t2 (a int) stats_persistent=0, engine=innodb; insert into t1 values (1); insert into t2 values (1); +connect (con1, localhost, root); +# disable innodb purge thread, otherwise it might start purging t2, +# and will take an mdl, affecting metadata_lock_info output. +start transaction with consistent snapshot; +connection default; + SET DEBUG_SYNC= 'after_open_table_mdl_shared SIGNAL table_opened WAIT_FOR grlwait execute 2'; --send update t1,t2 set t1.a=2,t2.a=3 @@ -3159,6 +3166,7 @@ SET DEBUG_SYNC= 'RESET'; drop table t1,t2; disconnect con2; +disconnect con1; --echo # --echo # Bug#50786 Assertion `thd->mdl_context.trans_sentinel() == __null' diff -Nru mariadb-10.11.6/mysql-test/main/mrr_icp_extra.result mariadb-10.11.9/mysql-test/main/mrr_icp_extra.result --- mariadb-10.11.6/mysql-test/main/mrr_icp_extra.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mrr_icp_extra.result 2024-08-03 07:29:57.000000000 +0000 @@ -38,18 +38,24 @@ EXPLAIN SELECT * FROM t1 WHERE s2 BETWEEN 'a' AND 'b' COLLATE latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where +Warnings: +Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` >= "'a'" of collation `latin1_german1_ci` EXPLAIN SELECT * FROM t1 WHERE s1 IN ('a','b' COLLATE latin1_german1_ci); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range s1 s1 11 NULL 2 Using index condition; Rowid-ordered scan EXPLAIN SELECT * FROM t1 WHERE s2 IN ('a','b' COLLATE latin1_german1_ci); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where +Warnings: +Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german1_ci` EXPLAIN SELECT * FROM t1 WHERE s1 LIKE 'a' COLLATE latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range s1 s1 11 NULL 1 Using index condition; Rowid-ordered scan EXPLAIN SELECT * FROM t1 WHERE s2 LIKE 'a' COLLATE latin1_german1_ci; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL s2 NULL NULL NULL 10 Using where +Warnings: +Note 1105 Cannot use key `s2` part[0] for lookup: `test`.`t1`.`s2` of collation `latin1_swedish_ci` like "'a' collate latin1_german1_ci" of collation `latin1_german1_ci` DROP TABLE t1; # # diff -Nru mariadb-10.11.6/mysql-test/main/myisam.result mariadb-10.11.9/mysql-test/main/myisam.result --- mariadb-10.11.6/mysql-test/main/myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/myisam.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,5 @@ call mtr.add_suppression("Can't find record in '.*'"); call mtr.add_suppression("Table 't1' is marked as crashed and should be repaired"); -SET SQL_WARNINGS=1; CREATE TABLE t1 ( STRING_DATA char(255) default NULL, KEY string_data (STRING_DATA) diff -Nru mariadb-10.11.6/mysql-test/main/myisam.test mariadb-10.11.9/mysql-test/main/myisam.test --- mariadb-10.11.6/mysql-test/main/myisam.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/myisam.test 2024-08-03 07:29:57.000000000 +0000 @@ -7,9 +7,6 @@ call mtr.add_suppression("Can't find record in '.*'"); call mtr.add_suppression("Table 't1' is marked as crashed and should be repaired"); -# Initialise -SET SQL_WARNINGS=1; - # # Test problem with CHECK TABLE; # diff -Nru mariadb-10.11.6/mysql-test/main/myisam_crash_before_flush_keys.test mariadb-10.11.9/mysql-test/main/myisam_crash_before_flush_keys.test --- mariadb-10.11.6/mysql-test/main/myisam_crash_before_flush_keys.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/myisam_crash_before_flush_keys.test 2024-08-03 07:29:57.000000000 +0000 @@ -26,14 +26,14 @@ SET SESSION debug_dbug="d,crash_before_flush_keys"; --echo # Write file to make mysql-test-run.pl expect crash ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --echo # Run the crashing query --error 2013 FLUSH TABLE t1; --echo # Write file to make mysql-test-run.pl start the server ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --echo # Turn on reconnect --enable_reconnect diff -Nru mariadb-10.11.6/mysql-test/main/myisam_explain_non_select_all.result mariadb-10.11.9/mysql-test/main/myisam_explain_non_select_all.result --- mariadb-10.11.6/mysql-test/main/myisam_explain_non_select_all.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/myisam_explain_non_select_all.result 2024-08-03 07:29:57.000000000 +0000 @@ -1506,7 +1506,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort Warnings: -Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "10" of type `int` Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` <= "18" of type `int` FLUSH STATUS; FLUSH TABLES; @@ -1514,7 +1514,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 26 100.00 Using where; Using filesort Warnings: -Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "10" of type `int` Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` <= "18" of type `int` Note 1003 delete from `test`.`t1` where `test`.`t1`.`i` > 10 and `test`.`t1`.`i` <= 18 order by `test`.`t1`.`i` limit 5 # Status of EXPLAIN EXTENDED query @@ -1526,7 +1526,9 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL i NULL NULL NULL 26 100.00 Using where; Using filesort Warnings: -Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` <= "18" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "10" of type `int` Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` <= "18" of type `int` Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`i` AS `i` from `test`.`t1` where `test`.`t1`.`i` > 10 and `test`.`t1`.`i` <= 18 order by `test`.`t1`.`i` limit 5 # Status of EXPLAIN EXTENDED "equivalent" SELECT query execution @@ -1551,6 +1553,71 @@ Sort_scan 1 DROP TABLE t1; +#30a +# +# MDEV-32957 Unusable key notes report wrong predicates for > and >= +# +CREATE TABLE t1(a INT, i CHAR(2), INDEX(i(1))); +INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19), +(20),(21),(22),(23),(24),(25),(26),(27),(28),(29), +(30),(31),(32),(33),(34),(35); +# +# query: DELETE FROM t1 WHERE i >= 10 AND i < 18 ORDER BY i LIMIT 5 +# select: SELECT * FROM t1 WHERE i >= 10 AND i < 18 ORDER BY i LIMIT 5 +# +Warnings: +Warning 1287 ' INTO FROM...' instead +EXPLAIN DELETE FROM t1 WHERE i >= 10 AND i < 18 ORDER BY i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "18" of type `int` +FLUSH STATUS; +FLUSH TABLES; +EXPLAIN EXTENDED DELETE FROM t1 WHERE i >= 10 AND i < 18 ORDER BY i LIMIT 5; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 100.00 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "18" of type `int` +Note 1003 delete from `test`.`t1` where `test`.`t1`.`i` >= 10 and `test`.`t1`.`i` < 18 order by `test`.`t1`.`i` limit 5 +# Status of EXPLAIN EXTENDED query +Variable_name Value +Handler_read_key 4 +FLUSH STATUS; +FLUSH TABLES; +EXPLAIN EXTENDED SELECT * FROM t1 WHERE i >= 10 AND i < 18 ORDER BY i LIMIT 5; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL i NULL NULL NULL 26 100.00 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "18" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "18" of type `int` +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`i` AS `i` from `test`.`t1` where `test`.`t1`.`i` >= 10 and `test`.`t1`.`i` < 18 order by `test`.`t1`.`i` limit 5 +# Status of EXPLAIN EXTENDED "equivalent" SELECT query execution +Variable_name Value +Handler_read_key 4 +Warnings: +Warning 1287 ' INTO FROM...' instead +# Status of "equivalent" SELECT query execution: +Variable_name Value +Handler_read_key 4 +Handler_read_rnd_next 27 +Sort_priority_queue_sorts 1 +Sort_rows 5 +Sort_scan 1 +# Status of testing query execution: +Variable_name Value +Handler_delete 5 +Handler_read_key 4 +Handler_read_rnd 5 +Handler_read_rnd_next 27 +Sort_rows 8 +Sort_scan 1 + +DROP TABLE t1; #31 CREATE TABLE t1 (i INT); INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19), @@ -2057,7 +2124,7 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 ALL NULL NULL NULL NULL 26 Using where; Using filesort Warnings: -Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` > "10" of type `int` Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` <= "18" of type `int` FLUSH STATUS; FLUSH TABLES; @@ -2065,7 +2132,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t2 ALL NULL NULL NULL NULL 26 100.00 Using where; Using filesort Warnings: -Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` > "10" of type `int` Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` <= "18" of type `int` Note 1003 update `test`.`t2` set `test`.`t2`.`a` = 10 where `test`.`t2`.`i` > 10 and `test`.`t2`.`i` <= 18 order by `test`.`t2`.`i` limit 5 # Status of EXPLAIN EXTENDED query @@ -2077,7 +2144,9 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t2 ALL i NULL NULL NULL 26 100.00 Using where; Using filesort Warnings: -Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` > "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` <= "18" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` > "10" of type `int` Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t2`.`i` of type `char` <= "18" of type `int` Note 1003 select `test`.`t2`.`a` AS `a`,`test`.`t2`.`i` AS `i` from `test`.`t2` where `test`.`t2`.`i` > 10 and `test`.`t2`.`i` <= 18 order by `test`.`t2`.`i` limit 5 # Status of EXPLAIN EXTENDED "equivalent" SELECT query execution diff -Nru mariadb-10.11.6/mysql-test/main/mysql-interactive.result mariadb-10.11.9/mysql-test/main/mysql-interactive.result --- mariadb-10.11.6/mysql-test/main/mysql-interactive.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql-interactive.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,24 @@ +# +# regression introduced by MDEV-14448 +# +delimiter $ +select 1; +$ +Welcome to the MariaDB monitor. Commands end with ; or \g. +Your MariaDB connection id is X +Server version: Y +Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. + +Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. + +MariaDB [(none)]> delimiter $ +MariaDB [(none)]> select 1; + -> $ ++---+ +| 1 | ++---+ +| 1 | ++---+ +1 row in set + +MariaDB [(none)]> \ No newline at end of file diff -Nru mariadb-10.11.6/mysql-test/main/mysql-interactive.test mariadb-10.11.9/mysql-test/main/mysql-interactive.test --- mariadb-10.11.6/mysql-test/main/mysql-interactive.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql-interactive.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,31 @@ +--echo # +--echo # regression introduced by MDEV-14448 +--echo # +source include/not_embedded.inc; +source include/not_windows.inc; +# this would need an instrumented ncurses library +source include/not_msan.inc; + +error 0,1; +exec $MYSQL -V|grep -q readline; +if ($sys_errno == 1) +{ + # strangely enough + skip does not work with libedit; +} + +write_file $MYSQL_TMP_DIR/mysql_in; +delimiter $ +select 1; +$ +EOF +let TERM=dumb; +replace_regex /id is \d+/id is X/ /Server version: .*/Server version: Y/ / \(\d+\.\d+ sec\)//; +error 0,127; +exec socat EXEC:"$MYSQL",pty STDIO < $MYSQL_TMP_DIR/mysql_in; +if ($sys_errno == 127) +{ + remove_file $MYSQL_TMP_DIR/mysql_in; + skip no socat; +} +remove_file $MYSQL_TMP_DIR/mysql_in; diff -Nru mariadb-10.11.6/mysql-test/main/mysql.result mariadb-10.11.9/mysql-test/main/mysql.result --- mariadb-10.11.6/mysql-test/main/mysql.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql.result 2024-08-03 07:29:57.000000000 +0000 @@ -137,6 +137,10 @@ drop table t1; 1 1 +-------------- + use +-------------- + ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 ERROR at line 1: USE must be followed by a database name 1 +1 @@ -166,6 +170,10 @@ drop table t17583; Test connect without db- or host-name => reconnect Test connect with dbname only => new dbname, old hostname +-------------- +connecttest +-------------- + ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'connecttest' at line 1 Test connect with _invalid_ dbname only => new invalid dbname, old hostname ERROR 1049 (42000) at line 1: Unknown database 'invalid' @@ -552,6 +560,7 @@ a1\`b1 CREATE TABLE `a1\``b1` ( `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `a1\``b1` ( @@ -583,6 +592,7 @@ a1\"b1 CREATE TABLE "a1\""b1" ( "a" int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE "a1\""b1" ( @@ -607,11 +617,11 @@ create table t1 (a text); select count(*) from t1; count(*) -43 +44 truncate table t1; select count(*) from t1; count(*) -43 +44 truncate table t1; select count(*) from t1; count(*) @@ -623,7 +633,7 @@ truncate table t1; select count(*) from t1; count(*) -43 +44 truncate table t1; select count(*) from t1; count(*) @@ -637,3 +647,38 @@ WARNING: option '--enable-cleartext-plugin' is obsolete. 1 1 +# End of 10.3 tests +# +# MDEV-21778 Disable system commands in mysql/mariadb client +# +ERROR at line 1: Not allowed in the sandbox mode +1 +ERROR at line 1: Not allowed in the sandbox mode +2 +ERROR at line 1: Not allowed in the sandbox mode +3 +1 +entering sandbox +system +tee +source +^^^ +2 +entering sandbox +system +tee +source +^^^ +3 +# +# MDEV-34203: Sandbox mode \- is not compatible with --binary-mode +# +create table t1 (a int); +drop table t1; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table t1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/mysql.test mariadb-10.11.9/mysql-test/main/mysql.test --- mariadb-10.11.6/mysql-test/main/mysql.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql.test 2024-08-03 07:29:57.000000000 +0000 @@ -610,6 +610,7 @@ create database `aa``bb````cc`; --exec $MYSQL < $MYSQLTEST_VARDIR/tmp/backticks.sql drop database `aa``bb````cc`; +--remove_file $MYSQLTEST_VARDIR/tmp/backticks.sql # # MySQL Bug#13639125 DELIMITER STRIPS THE NEXT NEW LINE IN A SQL STATEMENT @@ -620,6 +621,7 @@ <<" as a; EOF --exec $MYSQL < $MYSQLTEST_VARDIR/tmp/13639125.sql +--remove_file $MYSQLTEST_VARDIR/tmp/13639125.sql # # --skip-column-names and alignment @@ -702,7 +704,7 @@ --exec $MYSQL --disable-local-infile -e "/*q*/$ldli" select count(*) from t1; truncate table t1; drop table t1; - +--remove_file $MYSQLTEST_VARDIR/tmp/bug.sql --echo # --echo # MDEV-15538 '-N' Produce html output wrong @@ -716,3 +718,59 @@ # --echo --exec $MYSQL test --enable-cleartext-plugin -e "select 1" + +--echo # End of 10.3 tests + +--echo # +--echo # MDEV-21778 Disable system commands in mysql/mariadb client +--echo # + +--error 1 +--exec $MYSQL --sandbox -Ne "select 1; \! echo foo; select 0" 2>&1 +--error 1 +--exec $MYSQL --sandbox -Ne "select 2; \T echo foo; select 0" 2>&1 +--error 1 +--exec $MYSQL --sandbox -Ne "select 3; \. echo.foo; select 0" 2>&1 + +--write_file $MYSQL_TMP_DIR/mysql_in +select 'entering sandbox'; +\- +select 'system'; +\! echo foo +select 'tee'; +\T echo foo +select 'source'; +\. echo.foo +select '^^^'; +EOF + +write_line "select 1; +source $MYSQL_TMP_DIR/mysql_in; +select 2; +source $MYSQL_TMP_DIR/mysql_in; +sandbox; +select 3; +source $MYSQL_TMP_DIR/mysql_in;" $MYSQL_TMP_DIR/mysql_in2; + +--exec $MYSQL -fN <$MYSQL_TMP_DIR/mysql_in2 + +--remove_file $MYSQL_TMP_DIR/mysql_in +--remove_file $MYSQL_TMP_DIR/mysql_in2 + +--echo # +--echo # MDEV-34203: Sandbox mode \- is not compatible with --binary-mode +--echo # + +create table t1 (a int); + +--exec $MYSQL_DUMP test t1 > $MYSQLTEST_VARDIR/tmp/MDEV-34203.sql + +drop table t1; + +--exec $MYSQL --binary-mode test 2>&1 < $MYSQLTEST_VARDIR/tmp/MDEV-34203.sql + +show create table t1; +drop table t1; +--remove_file $MYSQLTEST_VARDIR/tmp/MDEV-34203.sql + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/mysql_client_test.result mariadb-10.11.9/mysql-test/main/mysql_client_test.result --- mariadb-10.11.6/mysql-test/main/mysql_client_test.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_client_test.result 2024-08-03 07:29:57.000000000 +0000 @@ -261,3 +261,4 @@ SET @@global.collation_server= @save_collation_server; SET @@global.character_set_client= @save_character_set_client; SET @@global.collation_connection= @save_collation_connection; +FOUND 1 /Aborted connection.*'u' host: '192.0.2.1' real ip: '(localhost|::1)'/ in mysqld.1.err diff -Nru mariadb-10.11.6/mysql-test/main/mysql_client_test.test mariadb-10.11.9/mysql-test/main/mysql_client_test.test --- mariadb-10.11.6/mysql-test/main/mysql_client_test.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_client_test.test 2024-08-03 07:29:57.000000000 +0000 @@ -23,7 +23,7 @@ # server or run mysql-test-run --debug mysql_client_test and check # var/log/mysql_client_test.trace ---exec echo "$MYSQL_CLIENT_TEST" > $MYSQLTEST_VARDIR/log/mysql_client_test.out.log 2>&1 +--write_line "$MYSQL_CLIENT_TEST" $MYSQLTEST_VARDIR/log/mysql_client_test.out.log --exec $MYSQL_CLIENT_TEST --getopt-ll-test=25600M >> $MYSQLTEST_VARDIR/log/mysql_client_test.out.log 2>&1 # End of 4.1 tests @@ -57,3 +57,9 @@ SET @@global.collation_server= @save_collation_server; SET @@global.character_set_client= @save_character_set_client; SET @@global.collation_connection= @save_collation_connection; + +# Search for "real ip" in Aborted message +# This is indicator for abort of the proxied connections. +let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err; +let SEARCH_PATTERN= Aborted connection.*'u' host: '192.0.2.1' real ip: '(localhost|::1)'; +source include/search_pattern_in_file.inc; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_client_test_comp.test mariadb-10.11.9/mysql-test/main/mysql_client_test_comp.test --- mariadb-10.11.6/mysql-test/main/mysql_client_test_comp.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_client_test_comp.test 2024-08-03 07:29:57.000000000 +0000 @@ -12,7 +12,7 @@ call mtr.add_suppression(" Error reading file './client_test_db/test_frm_bug.frm'"); call mtr.add_suppression(" IP address .* could not be resolved"); ---exec echo "$MYSQL_CLIENT_TEST" > $MYSQLTEST_VARDIR/log/mysql_client_test_comp.out.log 2>&1 +--write_line "$MYSQL_CLIENT_TEST" $MYSQLTEST_VARDIR/log/mysql_client_test_comp.out.log --exec $MYSQL_CLIENT_TEST --getopt-ll-test=25600M >> $MYSQLTEST_VARDIR/log/mysql_client_test_comp.out.log 2>&1 # End of test diff -Nru mariadb-10.11.6/mysql-test/main/mysql_client_test_nonblock.test mariadb-10.11.9/mysql-test/main/mysql_client_test_nonblock.test --- mariadb-10.11.6/mysql-test/main/mysql_client_test_nonblock.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_client_test_nonblock.test 2024-08-03 07:29:57.000000000 +0000 @@ -19,7 +19,7 @@ # server or run mysql-test-run --debug mysql_client_test and check # var/log/mysql_client_test.trace ---exec echo "$MYSQL_CLIENT_TEST --non-blocking-api" > $MYSQLTEST_VARDIR/log/mysql_client_test.out.log 2>&1 +--write_line "$MYSQL_CLIENT_TEST --non-blocking-api" $MYSQLTEST_VARDIR/log/mysql_client_test.out.log --exec $MYSQL_CLIENT_TEST --non-blocking-api --getopt-ll-test=25600M >> $MYSQLTEST_VARDIR/log/mysql_client_test.out.log 2>&1 # End of 4.1 tests diff -Nru mariadb-10.11.6/mysql-test/main/mysql_connector_net.ps1 mariadb-10.11.9/mysql-test/main/mysql_connector_net.ps1 --- mariadb-10.11.6/mysql-test/main/mysql_connector_net.ps1 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_connector_net.ps1 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,58 @@ +$assembly = [system.reflection.Assembly]::LoadWithPartialName("MySql.Data") +if ($assembly -eq $null) +{ + "Can't load assembly MySql.Data" + exit 100 +} + +try +{ + $connectionString =[string]::Format("server=127.0.0.1;uid=root;port={0};Connection Reset=true;",$Env:MASTER_MYPORT) + $connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString=$connectionString} + $connection.Open() + + # Test ExecuteReader() + $command = New-Object MySql.Data.MySqlClient.MySqlCommand + $command.Connection = $connection + $command.CommandText = "SELECT @@old_mode" + $reader = $command.ExecuteReader() + $reader.GetName(0) + while ($reader.Read()) + { + $reader.GetValue(0) + } + + # Test connection reset + $connection.Close() + $connection.Open() + # Test ExecuteNonQuery() + $command.CommandText="do 1"; + $affected_rows = $command.ExecuteNonQuery() + if ($affected_rows -ne 0) + { + "Expected affected rows 0, actual $affected_rows" + exit 1 + } + # Test Prepared Statement + $command.CommandText = "SELECT @var"; + [void]$command.Parameters.AddWithValue("@var", 1); + $command.Prepare(); + $out = $command.ExecuteScalar(); + if ($out -ne 1) + { + "Expected output 1, actual $out" + exit 1 + } + $connection.Close() +} +catch +{ + # Dump exception + $_ + $inner = $PSItem.Exception.InnerException + if ($inner -ne $null) + { + $PSItem.Exception.InnerException.Message + $PSItem.Exception.InnerException.StackTrace + } +} diff -Nru mariadb-10.11.6/mysql-test/main/mysql_connector_net.result mariadb-10.11.9/mysql-test/main/mysql_connector_net.result --- mariadb-10.11.6/mysql-test/main/mysql_connector_net.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_connector_net.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,2 @@ +@@old_mode +UTF8_IS_UTF8MB3,NO_NULL_COLLATION_IDS diff -Nru mariadb-10.11.6/mysql-test/main/mysql_connector_net.test mariadb-10.11.9/mysql-test/main/mysql_connector_net.test --- mariadb-10.11.6/mysql-test/main/mysql_connector_net.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_connector_net.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,11 @@ +--source include/windows.inc +let $sys_errno=0; + +# Error 100 is returned by the powershell script +# if MySql.Data is not installed +--error 0,100 +--exec powershell -ExecutionPolicy Bypass -NoLogo -NoProfile -File main\mysql_connector_net.ps1 +if ($sys_errno != 0) +{ + --skip Connector/NET is not installed +} diff -Nru mariadb-10.11.6/mysql-test/main/mysql_install_db_win.test mariadb-10.11.9/mysql-test/main/mysql_install_db_win.test --- mariadb-10.11.6/mysql-test/main/mysql_install_db_win.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_install_db_win.test 2024-08-03 07:29:57.000000000 +0000 @@ -24,7 +24,9 @@ # MDEV-23052 # 1. mysql_install_db works on existing, empty directory mkdir $ddir; -exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo -R > /dev/null; +disable_result_log; +exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo -R --verbose-bootstrap; +enable_result_log; rmdir $ddir; # 2. mysql_install_db rejects existing, non-empty directory, and does not diff -Nru mariadb-10.11.6/mysql-test/main/mysql_install_db_win_admin.result mariadb-10.11.9/mysql-test/main/mysql_install_db_win_admin.result --- mariadb-10.11.6/mysql-test/main/mysql_install_db_win_admin.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_install_db_win_admin.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,10 +1,4 @@ use mysql; -Running bootstrap -Creating my.ini file -Removing default user -Allowing remote access for user root -Setting root password -Creation of the database was successful # Kill the server # restart: --datadir=MYSQLTEST_VARDIR/tmp/ddir connect root,localhost,root,wrongpass,mysql; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_install_db_win_admin.test mariadb-10.11.9/mysql-test/main/mysql_install_db_win_admin.test --- mariadb-10.11.6/mysql-test/main/mysql_install_db_win_admin.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_install_db_win_admin.test 2024-08-03 07:29:57.000000000 +0000 @@ -6,12 +6,15 @@ # and start server from this directory. let $ddir= $MYSQLTEST_VARDIR/tmp/ddir; use mysql; -exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo -R; +--disable_result_log +exec $MYSQL_INSTALL_DB_EXE --datadir=$ddir --password=foo --verbose-bootstrap -R; +--enable_result_log --source include/kill_mysqld.inc let $restart_parameters=--datadir=$ddir; --source include/start_mysqld.inc # Check that connect with wrong password succeeds +# (because it can alternatively connect with GSSAPI as admin) connect (root,localhost,root,wrongpass,mysql); --source include/kill_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade.result mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade.result --- mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,301 +0,0 @@ -# -# MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so -# is needed and load it -# -SET NAMES utf8; -show create table mysql_json_test; -ERROR HY000: Unknown data type: 'MYSQL_JSON' -Phase 1/8: Checking and upgrading mysql database -Processing databases -mysql -mysql.column_stats OK -mysql.columns_priv OK -mysql.db OK -mysql.event OK -mysql.func OK -mysql.global_priv OK -mysql.gtid_slave_pos OK -mysql.help_category OK -mysql.help_keyword OK -mysql.help_relation OK -mysql.help_topic OK -mysql.index_stats OK -mysql.innodb_index_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.innodb_table_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.plugin OK -mysql.proc OK -mysql.procs_priv OK -mysql.proxies_priv OK -mysql.roles_mapping OK -mysql.servers OK -mysql.table_stats OK -mysql.tables_priv OK -mysql.time_zone OK -mysql.time_zone_leap_second OK -mysql.time_zone_name OK -mysql.time_zone_transition OK -mysql.time_zone_transition_type OK -mysql.transaction_registry -Error : Unknown storage engine 'InnoDB' -error : Corrupt - -Repairing tables -mysql.innodb_index_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.innodb_table_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.transaction_registry -Error : Unknown storage engine 'InnoDB' -error : Corrupt -Phase 2/8: Installing used storage engines... Skipped -installing plugin for MYSQL_JSON data type -Phase 3/8: Running 'mysql_fix_privilege_tables' -Phase 4/8: Fixing views -mysql.user OK -sys.host_summary OK -sys.host_summary_by_file_io OK -sys.host_summary_by_file_io_type OK -sys.host_summary_by_stages OK -sys.host_summary_by_statement_latency OK -sys.host_summary_by_statement_type OK -sys.innodb_buffer_stats_by_schema OK -sys.innodb_buffer_stats_by_table OK -sys.innodb_lock_waits OK -sys.io_by_thread_by_latency OK -sys.io_global_by_file_by_bytes OK -sys.io_global_by_file_by_latency OK -sys.io_global_by_wait_by_bytes OK -sys.io_global_by_wait_by_latency OK -sys.latest_file_io OK -sys.memory_by_host_by_current_bytes OK -sys.memory_by_thread_by_current_bytes OK -sys.memory_by_user_by_current_bytes OK -sys.memory_global_by_current_bytes OK -sys.memory_global_total OK -sys.metrics OK -sys.processlist OK -sys.ps_check_lost_instrumentation OK -sys.schema_auto_increment_columns OK -sys.schema_index_statistics OK -sys.schema_object_overview OK -sys.schema_redundant_indexes OK -sys.schema_table_lock_waits OK -sys.schema_table_statistics OK -sys.schema_table_statistics_with_buffer OK -sys.schema_tables_with_full_table_scans OK -sys.schema_unused_indexes OK -sys.session OK -sys.session_ssl_status OK -sys.statement_analysis OK -sys.statements_with_errors_or_warnings OK -sys.statements_with_full_table_scans OK -sys.statements_with_runtimes_in_95th_percentile OK -sys.statements_with_sorting OK -sys.statements_with_temp_tables OK -sys.user_summary OK -sys.user_summary_by_file_io OK -sys.user_summary_by_file_io_type OK -sys.user_summary_by_stages OK -sys.user_summary_by_statement_latency OK -sys.user_summary_by_statement_type OK -sys.version OK -sys.wait_classes_global_by_avg_latency OK -sys.wait_classes_global_by_latency OK -sys.waits_by_host_by_latency OK -sys.waits_by_user_by_latency OK -sys.waits_global_by_latency OK -sys.x$host_summary OK -sys.x$host_summary_by_file_io OK -sys.x$host_summary_by_file_io_type OK -sys.x$host_summary_by_stages OK -sys.x$host_summary_by_statement_latency OK -sys.x$host_summary_by_statement_type OK -sys.x$innodb_buffer_stats_by_schema OK -sys.x$innodb_buffer_stats_by_table OK -sys.x$innodb_lock_waits OK -sys.x$io_by_thread_by_latency OK -sys.x$io_global_by_file_by_bytes OK -sys.x$io_global_by_file_by_latency OK -sys.x$io_global_by_wait_by_bytes OK -sys.x$io_global_by_wait_by_latency OK -sys.x$latest_file_io OK -sys.x$memory_by_host_by_current_bytes OK -sys.x$memory_by_thread_by_current_bytes OK -sys.x$memory_by_user_by_current_bytes OK -sys.x$memory_global_by_current_bytes OK -sys.x$memory_global_total OK -sys.x$processlist OK -sys.x$ps_digest_95th_percentile_by_avg_us OK -sys.x$ps_digest_avg_latency_distribution OK -sys.x$ps_schema_table_statistics_io OK -sys.x$schema_flattened_keys OK -sys.x$schema_index_statistics OK -sys.x$schema_table_lock_waits OK -sys.x$schema_table_statistics OK -sys.x$schema_table_statistics_with_buffer OK -sys.x$schema_tables_with_full_table_scans OK -sys.x$session OK -sys.x$statement_analysis OK -sys.x$statements_with_errors_or_warnings OK -sys.x$statements_with_full_table_scans OK -sys.x$statements_with_runtimes_in_95th_percentile OK -sys.x$statements_with_sorting OK -sys.x$statements_with_temp_tables OK -sys.x$user_summary OK -sys.x$user_summary_by_file_io OK -sys.x$user_summary_by_file_io_type OK -sys.x$user_summary_by_stages OK -sys.x$user_summary_by_statement_latency OK -sys.x$user_summary_by_statement_type OK -sys.x$wait_classes_global_by_avg_latency OK -sys.x$wait_classes_global_by_latency OK -sys.x$waits_by_host_by_latency OK -sys.x$waits_by_user_by_latency OK -sys.x$waits_global_by_latency OK -Phase 5/8: Fixing table and database names -Phase 6/8: Checking and upgrading tables -Processing databases -information_schema -mtr -mtr.global_suppressions OK -mtr.test_suppressions OK -performance_schema -sys -sys.sys_config OK -test -test.mysql_json_test Needs upgrade -test.mysql_json_test_big Needs upgrade - -Repairing tables -test.mysql_json_test OK -test.mysql_json_test_big OK -Phase 7/8: uninstalling plugins -uninstalling plugin for 'type_mysql_json' data type -Phase 8/8: Running 'FLUSH PRIVILEGES' -OK -show create table mysql_json_test; -Table Create Table -mysql_json_test CREATE TABLE `mysql_json_test` ( - `description` varchar(100) DEFAULT NULL, - `expected` longtext DEFAULT NULL, - `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci -select * from mysql_json_test; -description expected actual -Raw integers as JSON 0 0 -Raw integers as JSON -127 -127 -Raw integers as JSON 128 128 -Raw integers as JSON 32767 32767 -Raw integers as JSON -32768 -32768 -Raw integers as JSON 65535 65535 -Raw integers as JSON 65536 65536 -Raw integers as JSON -2147483648 -2147483648 -Raw integers as JSON 2147483647 2147483647 -Raw integers as JSON 4294967295 4294967295 -Raw integers as JSON -9223372036854775807 -9223372036854775807 -Raw integers as JSON 9223372036854775807 9223372036854775807 -Raw integers as JSON 18446744073709551615 18446744073709551615 -Raw doubles as JSON 3.14 3.14 -Raw doubles as JSON -5678.987 -5678.987 -Raw doubles as JSON -2.2250738585072014e-308 -2.2250738585072014e-308 -Raw doubles as JSON 2.2250738585072014e-308 2.2250738585072014e-308 -Simple JSON test {"key1": "val1", "key2": "val2"} {"key1": "val1", "key2": "val2"} -Raw doubles as JSON 0.0 0.0 -Simple Array as Value {"a": [1, 2], "b": ["x", "y"]} {"a": [1, 2], "b": ["x", "y"]} -Simple Array as Base Key [1, 2, 3, 4, 5, [], "a", "b", "c"] [1, 2, 3, 4, 5, [], "a", "b", "c"] -GeoJSON {"type": "MultiPoint", "coordinates": [[1, 1], [2, 2], [3, 3]]} {"type": "MultiPoint", "coordinates": [[1, 1], [2, 2], [3, 3]]} -GeoJSON {"type": "LineString", "coordinates": [[0, 5], [5, 10], [10, 15]]} {"type": "LineString", "coordinates": [[0, 5], [5, 10], [10, 15]]} -GeoJSON {"type": "GeometryCollection", "geometries": []} {"type": "GeometryCollection", "geometries": []} -GeoJSON {"type": "Point", "coordinates": [11.1111, 12.22222]} {"type": "Point", "coordinates": [11.1111, 12.22222]} -Opaque Types: opaque_mysql_type_set "b,c" "b,c" -Opaque Types: opaque_mysql_type_enum "b" "b" -Opaque Types: opaque_mysql_type_date "2015-01-15" "2015-01-15" -Opaque Types: opaque_mysql_type_time "23:24:25.000000" "23:24:25.000000" -Opaque Types: opaque_mysql_type_datetime "2015-01-15 23:24:25.000000" "2015-01-15 23:24:25.000000" -Opaque Types: opaque_mysql_type_geom {"type": "Point", "coordinates": [1, 1]} {"type": "Point", "coordinates": [1, 1]} -Opaque Types: opaque_mysql_type_bit "base64:type16:yv4=" "base64:type16:yv4=" -Opaque Types: opaque_mysql_type_year "base64:type13:MjAxOQ==" "base64:type13:MjAxOQ==" -Opaque Types: opaque_mysql_type_blob "base64:type252:yv66vg==" "base64:type252:yv66vg==" -Opaque Types: opaque_mysql_type_longblob "base64:type251:yv66vg==" "base64:type251:yv66vg==" -Opaque Types: opaque_mysql_type_mediumblob "base64:type250:yv66vg==" "base64:type250:yv66vg==" -Opaque Types: opaque_mysql_type_tinyblob "base64:type249:yv66vg==" "base64:type249:yv66vg==" -Opaque Types: opaque_mysql_type_varchar "base64:type15:Zm9v" "base64:type15:Zm9v" -DateTime as Raw Value: "2015-01-15 23:24:25.000000" "2015-01-15 23:24:25.000000" -Opaque Types: opaque_mysql_type_varbinary "base64:type15:YWJj" "base64:type15:YWJj" -Opaque Types: opaque_mysql_type_binary "base64:type254:YWJjAAAAAAAAAA==" "base64:type254:YWJjAAAAAAAAAA==" -DateTime as Raw Value: "23:24:25.000000" "23:24:25.000000" -DateTime as Raw Value: "2015-01-15" "2015-01-15" -DateTime as Raw Value: "2015-01-15 23:24:25.000000" "2015-01-15 23:24:25.000000" -UTF8 Characters: {"Person": "EMP", "details": {"Name": "Anel Husaković - test: đžšćÄ"}} {"Person": "EMP", "details": {"Name": "Anel Husaković - test: đžšćÄ"}} -UTF8 Characters: "Anel Husaković - test: đžšćÄ" "Anel Husaković - test: đžšćÄ" -UTF8 Characters: {"Name": "Anel Husaković - test: đžšćÄ"} {"Name": "Anel Husaković - test: đžšćÄ"} -UTF8 Characters: {"details": {"Name": "Anel Husaković - test: đžšćÄ"}, "\"Anel Husaković - test: đžšćÄ\"": "EMP"} {"details": {"Name": "Anel Husaković - test: đžšćÄ"}, "\"Anel Husaković - test: đžšćÄ\"": "EMP"} -Special Characters: {"{": "}"} {"{": "}"} -Special Characters: "key1 - with \" val " "key1 - with \" val " -Special Characters: {"key1 and \n\"key2\"": "val1\t val2"} {"key1 and \n\"key2\"": "val1\t val2"} -Special Characters: "'" "'" -Special Characters: "q" "q" -Special Characters: {"[": "]"} {"[": "]"} -Special Characters: {"{": "}"} {"{": "}"} -Empty JSON Object/Array: [] [] -Special Characters: "some_string" "some_string" -Special Characters: "'" "'" -Special Characters: "\"" "\"" -Special Characters: "" "" -Special Characters: "'" "'" -Special Characters: "''" "''" -Empty JSON Object/Array: {} {} -Special Characters: "f" "f" -Special Characters: "\\" "\\" -Special Characters: "\n" "\n" -Special Characters: "\f" "\f" -Special Characters: "\t" "\t" -Special Characters: "\r" "\r" -Special Characters: "\b" "\b" -Special Characters: "\\b" "\\b" -Special Characters: {"key \n key": "val \n val"} {"key \n key": "val \n val"} -Special Characters: {"key \f key": "val \f val"} {"key \f key": "val \f val"} -Special Characters: {"key \t key": "val \t val"} {"key \t key": "val \t val"} -Special Characters: {"key \r key": "val \r val"} {"key \r key": "val \r val"} -Special Characters: {"key \b key": "val \b val"} {"key \b key": "val \b val"} -Special Characters: {"key \\0 key": "val \n val"} {"key \\0 key": "val \n val"} -Special Characters: {"key \\ key": "val \\ val"} {"key \\ key": "val \\ val"} -Special Characters: {"key \" key": "val \" val"} {"key \" key": "val \" val"} -Special Characters: {"key ' key": "val ' val"} {"key ' key": "val ' val"} -Special Characters: {"key \\Z key": "val ' val"} {"key \\Z key": "val ' val"} -Special Characters: ["a \f b", "c \f d"] ["a \f b", "c \f d"] -Special Characters: ["a \t b", "c \t d"] ["a \t b", "c \t d"] -Special Characters: ["a \r b", "c \r d"] ["a \r b", "c \r d"] -Special Characters: ["a \b b", "c \b d"] ["a \b b", "c \b d"] -Special Characters: ["a \\ b", "c \\ d"] ["a \\ b", "c \\ d"] -Special Characters: ["a \" b", "c \" d"] ["a \" b", "c \" d"] -Special Characters: ["a ' b", "c ' d"] ["a ' b", "c ' d"] -Special String Cases: {"": ""} {"": ""} -Special String Cases: [""] [""] -Raw LITERALS: true true -Raw LITERALS: false false -Raw LITERALS: null null -JSON LITERALS: {"val": true} {"val": true} -JSON LITERALS: {"val": false} {"val": false} -JSON LITERALS: {"val": null} {"val": null} -Timestamp as RawValue "2019-12-26 19:56:03.000000" "2019-12-26 19:56:03.000000" -Array LITERALS: ["prefix", null, "suffix", 1] ["prefix", null, "suffix", 1] -Array LITERALS: ["prefix", false, "suffix", 1] ["prefix", false, "suffix", 1] -Array LITERALS: ["prefix", true, "suffix", 1] ["prefix", true, "suffix", 1] -show create table mysql_json_test_big; -Table Create Table -mysql_json_test_big CREATE TABLE `mysql_json_test_big` ( - `description` varchar(100) DEFAULT NULL, - `expected` longtext DEFAULT NULL, - `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci -select * from mysql.plugin; -name dl -drop table mysql_json_test; -drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade.test mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade.test --- mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ ---echo # ---echo # MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so ---echo # is needed and load it ---echo # - --- source include/have_utf8.inc --- source include/mysql_upgrade_preparation.inc - -if (!$TYPE_MYSQL_JSON_SO) { - skip Need MYSQL_JSON plugin; -} - -SET NAMES utf8; - -let $MYSQLD_DATADIR= `select @@datadir`; - ---copy_file std_data/mysql_json/mysql_json_test.frm $MYSQLD_DATADIR/test/mysql_json_test.frm ---copy_file std_data/mysql_json/mysql_json_test.MYI $MYSQLD_DATADIR/test/mysql_json_test.MYI ---copy_file std_data/mysql_json/mysql_json_test.MYD $MYSQLD_DATADIR/test/mysql_json_test.MYD - ---copy_file std_data/mysql_json/mysql_json_test_big.frm $MYSQLD_DATADIR/test/mysql_json_test_big.frm ---copy_file std_data/mysql_json/mysql_json_test_big.MYI $MYSQLD_DATADIR/test/mysql_json_test_big.MYI ---copy_file std_data/mysql_json/mysql_json_test_big.MYD $MYSQLD_DATADIR/test/mysql_json_test_big.MYD - ---error ER_UNKNOWN_DATA_TYPE -show create table mysql_json_test; - ---exec $MYSQL_UPGRADE --force 2>&1 ---remove_file $MYSQLD_DATADIR/mysql_upgrade_info - -show create table mysql_json_test; -select * from mysql_json_test; -show create table mysql_json_test_big; -select * from mysql.plugin; -drop table mysql_json_test; -drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.result mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.result --- mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,198 +0,0 @@ -# -# MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so -# is needed and load it -# -SET NAMES utf8; -call mtr.add_suppression("Table rebuild required"); -show create table mysql_json_test; -ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! -Phase 1/8: Checking and upgrading mysql database -Processing databases -mysql -mysql.column_stats OK -mysql.columns_priv OK -mysql.db OK -mysql.event OK -mysql.func OK -mysql.global_priv OK -mysql.gtid_slave_pos OK -mysql.help_category OK -mysql.help_keyword OK -mysql.help_relation OK -mysql.help_topic OK -mysql.index_stats OK -mysql.innodb_index_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.innodb_table_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.plugin OK -mysql.proc OK -mysql.procs_priv OK -mysql.proxies_priv OK -mysql.roles_mapping OK -mysql.servers OK -mysql.table_stats OK -mysql.tables_priv OK -mysql.time_zone OK -mysql.time_zone_leap_second OK -mysql.time_zone_name OK -mysql.time_zone_transition OK -mysql.time_zone_transition_type OK -mysql.transaction_registry -Error : Unknown storage engine 'InnoDB' -error : Corrupt - -Repairing tables -mysql.innodb_index_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.innodb_table_stats -Error : Unknown storage engine 'InnoDB' -error : Corrupt -mysql.transaction_registry -Error : Unknown storage engine 'InnoDB' -error : Corrupt -Phase 2/8: Installing used storage engines... Skipped -Phase 3/8: Running 'mysql_fix_privilege_tables' -Phase 4/8: Fixing views -mysql.user OK -sys.host_summary OK -sys.host_summary_by_file_io OK -sys.host_summary_by_file_io_type OK -sys.host_summary_by_stages OK -sys.host_summary_by_statement_latency OK -sys.host_summary_by_statement_type OK -sys.innodb_buffer_stats_by_schema OK -sys.innodb_buffer_stats_by_table OK -sys.innodb_lock_waits OK -sys.io_by_thread_by_latency OK -sys.io_global_by_file_by_bytes OK -sys.io_global_by_file_by_latency OK -sys.io_global_by_wait_by_bytes OK -sys.io_global_by_wait_by_latency OK -sys.latest_file_io OK -sys.memory_by_host_by_current_bytes OK -sys.memory_by_thread_by_current_bytes OK -sys.memory_by_user_by_current_bytes OK -sys.memory_global_by_current_bytes OK -sys.memory_global_total OK -sys.metrics OK -sys.processlist OK -sys.ps_check_lost_instrumentation OK -sys.schema_auto_increment_columns OK -sys.schema_index_statistics OK -sys.schema_object_overview OK -sys.schema_redundant_indexes OK -sys.schema_table_lock_waits OK -sys.schema_table_statistics OK -sys.schema_table_statistics_with_buffer OK -sys.schema_tables_with_full_table_scans OK -sys.schema_unused_indexes OK -sys.session OK -sys.session_ssl_status OK -sys.statement_analysis OK -sys.statements_with_errors_or_warnings OK -sys.statements_with_full_table_scans OK -sys.statements_with_runtimes_in_95th_percentile OK -sys.statements_with_sorting OK -sys.statements_with_temp_tables OK -sys.user_summary OK -sys.user_summary_by_file_io OK -sys.user_summary_by_file_io_type OK -sys.user_summary_by_stages OK -sys.user_summary_by_statement_latency OK -sys.user_summary_by_statement_type OK -sys.version OK -sys.wait_classes_global_by_avg_latency OK -sys.wait_classes_global_by_latency OK -sys.waits_by_host_by_latency OK -sys.waits_by_user_by_latency OK -sys.waits_global_by_latency OK -sys.x$host_summary OK -sys.x$host_summary_by_file_io OK -sys.x$host_summary_by_file_io_type OK -sys.x$host_summary_by_stages OK -sys.x$host_summary_by_statement_latency OK -sys.x$host_summary_by_statement_type OK -sys.x$innodb_buffer_stats_by_schema OK -sys.x$innodb_buffer_stats_by_table OK -sys.x$innodb_lock_waits OK -sys.x$io_by_thread_by_latency OK -sys.x$io_global_by_file_by_bytes OK -sys.x$io_global_by_file_by_latency OK -sys.x$io_global_by_wait_by_bytes OK -sys.x$io_global_by_wait_by_latency OK -sys.x$latest_file_io OK -sys.x$memory_by_host_by_current_bytes OK -sys.x$memory_by_thread_by_current_bytes OK -sys.x$memory_by_user_by_current_bytes OK -sys.x$memory_global_by_current_bytes OK -sys.x$memory_global_total OK -sys.x$processlist OK -sys.x$ps_digest_95th_percentile_by_avg_us OK -sys.x$ps_digest_avg_latency_distribution OK -sys.x$ps_schema_table_statistics_io OK -sys.x$schema_flattened_keys OK -sys.x$schema_index_statistics OK -sys.x$schema_table_lock_waits OK -sys.x$schema_table_statistics OK -sys.x$schema_table_statistics_with_buffer OK -sys.x$schema_tables_with_full_table_scans OK -sys.x$session OK -sys.x$statement_analysis OK -sys.x$statements_with_errors_or_warnings OK -sys.x$statements_with_full_table_scans OK -sys.x$statements_with_runtimes_in_95th_percentile OK -sys.x$statements_with_sorting OK -sys.x$statements_with_temp_tables OK -sys.x$user_summary OK -sys.x$user_summary_by_file_io OK -sys.x$user_summary_by_file_io_type OK -sys.x$user_summary_by_stages OK -sys.x$user_summary_by_statement_latency OK -sys.x$user_summary_by_statement_type OK -sys.x$wait_classes_global_by_avg_latency OK -sys.x$wait_classes_global_by_latency OK -sys.x$waits_by_host_by_latency OK -sys.x$waits_by_user_by_latency OK -sys.x$waits_global_by_latency OK -Phase 5/8: Fixing table and database names -Phase 6/8: Checking and upgrading tables -Processing databases -information_schema -mtr -mtr.global_suppressions OK -mtr.test_suppressions OK -performance_schema -sys -sys.sys_config OK -test -test.mysql_json_test Needs upgrade -test.mysql_json_test_big Needs upgrade - -Repairing tables -test.mysql_json_test OK -test.mysql_json_test_big OK -Phase 7/8: uninstalling plugins -Phase 8/8: Running 'FLUSH PRIVILEGES' -OK -show create table mysql_json_test; -Table Create Table -mysql_json_test CREATE TABLE `mysql_json_test` ( - `description` varchar(100) DEFAULT NULL, - `expected` longtext DEFAULT NULL, - `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci -show create table mysql_json_test_big; -Table Create Table -mysql_json_test_big CREATE TABLE `mysql_json_test_big` ( - `description` varchar(100) DEFAULT NULL, - `expected` longtext DEFAULT NULL, - `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci -select * from mysql.plugin; -name dl -drop table mysql_json_test; -drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.test mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.test --- mariadb-10.11.6/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_json_mysql_upgrade_with_plugin_loaded.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ ---echo # ---echo # MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so ---echo # is needed and load it ---echo # -# Let's now load plugin first --- source include/have_utf8.inc --- source include/have_type_mysql_json.inc --- source include/mysql_upgrade_preparation.inc - -SET NAMES utf8; -call mtr.add_suppression("Table rebuild required"); - -let $MYSQLD_DATADIR= `select @@datadir`; - ---copy_file std_data/mysql_json/mysql_json_test.frm $MYSQLD_DATADIR/test/mysql_json_test.frm ---copy_file std_data/mysql_json/mysql_json_test.MYI $MYSQLD_DATADIR/test/mysql_json_test.MYI ---copy_file std_data/mysql_json/mysql_json_test.MYD $MYSQLD_DATADIR/test/mysql_json_test.MYD - ---copy_file std_data/mysql_json/mysql_json_test_big.frm $MYSQLD_DATADIR/test/mysql_json_test_big.frm ---copy_file std_data/mysql_json/mysql_json_test_big.MYI $MYSQLD_DATADIR/test/mysql_json_test_big.MYI ---copy_file std_data/mysql_json/mysql_json_test_big.MYD $MYSQLD_DATADIR/test/mysql_json_test_big.MYD - -# In the previous example (mysql_json_mysql_upgrade.test) -# instead of ER_TABLE_NEEDS_REBUILD we had ER_UNKNOWN_DATA_TYPE ---error ER_TABLE_NEEDS_REBUILD -show create table mysql_json_test; - ---exec $MYSQL_UPGRADE --force 2>&1 ---remove_file $MYSQLD_DATADIR/mysql_upgrade_info - -show create table mysql_json_test; -show create table mysql_json_test_big; -select * from mysql.plugin; -drop table mysql_json_test; -drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_json_table_recreate.result mariadb-10.11.9/mysql-test/main/mysql_json_table_recreate.result --- mariadb-10.11.6/mysql-test/main/mysql_json_table_recreate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_json_table_recreate.result 2024-08-03 07:29:57.000000000 +0000 @@ -30,6 +30,12 @@ ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! select * from mysql_json_test; ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! +CREATE TABLE t2 AS SELECT * FROM mysql_json_test; +ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! +CREATE TABLE t2 (a mysql_json /*new column*/) AS SELECT * FROM mysql_json_test; +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +CREATE TABLE t2 (actual mysql_json /*existing column*/) AS SELECT * FROM mysql_json_test; +ERROR HY000: 'MYSQL_JSON' is not allowed in this context LOCK TABLES mysql_json_test WRITE; ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! alter table mysql_json_test force; @@ -169,3 +175,67 @@ drop table tempty; drop table mysql_json_test; drop table mysql_json_test_big; +# +# MDEV-32790: Output result in show create table +# for mysql_json type should be longtext +# +create table t1(j json); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `j` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`j`)) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table t1; +create table t1(j mysql_json); +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +create table `testjson` ( +`t` json /* JSON from MySQL 5.7*/ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL +) ENGINE=InnoDB DEFAULT CH...' at line 2 +create table `testjson` ( +`t` json /* JSON from MySQL 5.7*/ COLLATE utf8mb4_bin NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +show create table testjson; +Table Create Table +testjson CREATE TABLE `testjson` ( + `t` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`t`)) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table testjson; +create table `testjson` ( +`t` longtext /* JSON from MySQL 5.7 */ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +show create table testjson; +Table Create Table +testjson CREATE TABLE `testjson` ( + `t` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table testjson; +# +# MDEV-32235: mysql_json cannot be used on newly created table +# +CREATE TABLE t(j mysql_json); +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +CREATE TABLE IF NOT EXISTS t(j mysql_json); +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +CREATE OR REPLACE TABLE t(j mysql_json); +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +CREATE TEMPORARY TABLE t(j mysql_json); +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +CREATE TABLE t1 (a TEXT); +ALTER TABLE t1 MODIFY a mysql_json; +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +DROP TABLE t1; +CREATE FUNCTION f1() RETURNS mysql_json RETURN NULL; +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +CREATE FUNCTION f1(a mysql_json) RETURNS INT RETURN 0; +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +CREATE PROCEDURE p1() +BEGIN +DECLARE a mysql_json; +END; +$$ +ERROR HY000: 'MYSQL_JSON' is not allowed in this context +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/mysql_json_table_recreate.test mariadb-10.11.9/mysql-test/main/mysql_json_table_recreate.test --- mariadb-10.11.6/mysql-test/main/mysql_json_table_recreate.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_json_table_recreate.test 2024-08-03 07:29:57.000000000 +0000 @@ -52,6 +52,13 @@ select * from mysql_json_test; --error ER_TABLE_NEEDS_REBUILD +CREATE TABLE t2 AS SELECT * FROM mysql_json_test; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE TABLE t2 (a mysql_json /*new column*/) AS SELECT * FROM mysql_json_test; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE TABLE t2 (actual mysql_json /*existing column*/) AS SELECT * FROM mysql_json_test; + +--error ER_TABLE_NEEDS_REBUILD LOCK TABLES mysql_json_test WRITE; alter table mysql_json_test force; @@ -88,3 +95,69 @@ drop table tempty; drop table mysql_json_test; drop table mysql_json_test_big; + +--echo # +--echo # MDEV-32790: Output result in show create table +--echo # for mysql_json type should be longtext +--echo # + +create table t1(j json); +show create table t1; +drop table t1; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +create table t1(j mysql_json); +# `json` type should not have character set and collation other than utf8mb4_bin +--error ER_PARSE_ERROR +create table `testjson` ( + `t` json /* JSON from MySQL 5.7*/ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; + +# By removing character set from `json` field query should work and +# expand to `longtext` with characterset +create table `testjson` ( + `t` json /* JSON from MySQL 5.7*/ COLLATE utf8mb4_bin NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +show create table testjson; +drop table testjson; + +# `longtext` that is alias can have character set +create table `testjson` ( + `t` longtext /* JSON from MySQL 5.7 */ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +show create table testjson; +drop table testjson; + +--echo # +--echo # MDEV-32235: mysql_json cannot be used on newly created table +--echo # + +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE TABLE t(j mysql_json); +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE TABLE IF NOT EXISTS t(j mysql_json); +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE OR REPLACE TABLE t(j mysql_json); +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE TEMPORARY TABLE t(j mysql_json); + +CREATE TABLE t1 (a TEXT); +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +ALTER TABLE t1 MODIFY a mysql_json; +DROP TABLE t1; + +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE FUNCTION f1() RETURNS mysql_json RETURN NULL; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE FUNCTION f1(a mysql_json) RETURNS INT RETURN 0; +DELIMITER $$; +--error ER_NOT_ALLOWED_IN_THIS_CONTEXT +CREATE PROCEDURE p1() +BEGIN + DECLARE a mysql_json; +END; +$$ +DELIMITER ;$$ + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/mysql_tzinfo_to_sql_symlink.result mariadb-10.11.9/mysql-test/main/mysql_tzinfo_to_sql_symlink.result --- mariadb-10.11.6/mysql-test/main/mysql_tzinfo_to_sql_symlink.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_tzinfo_to_sql_symlink.result 2024-08-03 07:29:57.000000000 +0000 @@ -8,7 +8,7 @@ # # Verbose run set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); @@ -18,6 +18,8 @@ execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); +SET @old_alter_alg=@@SESSION.alter_algorithm; +SET session alter_algorithm='COPY'; TRUNCATE TABLE time_zone; TRUNCATE TABLE time_zone_name; TRUNCATE TABLE time_zone_transition; @@ -52,12 +54,13 @@ execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_name ENGINE=', @time_zone_name_engine), 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition ENGINE=', @time_zone_transition_engine, ', ORDER BY Time_zone_id, Transition_time'), 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition_type ENGINE=', @time_zone_transition_type_engine, ', ORDER BY Time_zone_id, Transition_type_id'), 'do 0'); +SET session alter_algorithm=@old_alter_alg; # # MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases # # Run on zoneinfo directory set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); @@ -67,6 +70,8 @@ execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); +SET @old_alter_alg=@@SESSION.alter_algorithm; +SET session alter_algorithm='COPY'; TRUNCATE TABLE time_zone; TRUNCATE TABLE time_zone_name; TRUNCATE TABLE time_zone_transition; @@ -98,6 +103,7 @@ execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_name ENGINE=', @time_zone_name_engine), 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition ENGINE=', @time_zone_transition_engine, ', ORDER BY Time_zone_id, Transition_time'), 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition_type ENGINE=', @time_zone_transition_type_engine, ', ORDER BY Time_zone_id, Transition_type_id'), 'do 0'); +SET session alter_algorithm=@old_alter_alg; SELECT COUNT(*) FROM time_zone; COUNT(*) 2 @@ -117,12 +123,14 @@ # Run on zoneinfo directory --skip-write-binlog # set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; SET SESSION SQL_LOG_BIN=0; SET @wsrep_cannot_replicate_tz=0; +SET @old_alter_alg=@@SESSION.alter_algorithm; +SET session alter_algorithm='COPY'; TRUNCATE TABLE time_zone; TRUNCATE TABLE time_zone_name; TRUNCATE TABLE time_zone_transition; @@ -152,6 +160,7 @@ execute immediate if(@wsrep_cannot_replicate_tz, 'do 0','ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id'); SET SESSION SQL_LOG_BIN=@save_sql_log_bin; execute immediate if(@wsrep_is_on, 'SET SESSION WSREP_ON=@save_wsrep_on', 'do 0'); +SET session alter_algorithm=@old_alter_alg; SELECT COUNT(*) FROM time_zone; COUNT(*) 2 @@ -189,7 +198,7 @@ # Testing with explicit timezonefile # set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); @@ -253,7 +262,7 @@ # Testing with explicit timezonefile --skip-write-binlog # set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; @@ -311,7 +320,7 @@ # Testing --leap # set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); @@ -374,7 +383,7 @@ # Testing --skip-write-binlog --leap # set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; @@ -426,7 +435,7 @@ # Testing --skip-write-binlog # set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; @@ -448,7 +457,7 @@ SET SESSION SQL_LOG_BIN=@save_sql_log_bin; execute immediate if(@wsrep_is_on, 'SET SESSION WSREP_ON=@save_wsrep_on', 'do 0'); set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; @@ -495,7 +504,7 @@ # MDEV-6236 - [PATCH] mysql_tzinfo_to_sql may produce invalid SQL # set @wsrep_is_on=(select coalesce(sum(SESSION_VALUE='ON'), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); -SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; +SET STATEMENT SQL_MODE='' FOR SELECT concat('%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o; set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select coalesce(sum(GLOBAL_VALUE NOT LIKE @replicate_opt), 0) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); @@ -505,6 +514,8 @@ execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'select ENGINE into @time_zone_transition_type_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME=''time_zone_transition_type''', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone_transition_type ENGINE=InnoDB', 'do 0'); +SET @old_alter_alg=@@SESSION.alter_algorithm; +SET session alter_algorithm='COPY'; TRUNCATE TABLE time_zone; TRUNCATE TABLE time_zone_name; TRUNCATE TABLE time_zone_transition; @@ -522,6 +533,7 @@ execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_name ENGINE=', @time_zone_name_engine), 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition ENGINE=', @time_zone_transition_engine, ', ORDER BY Time_zone_id, Transition_time'), 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition_type ENGINE=', @time_zone_transition_type_engine, ', ORDER BY Time_zone_id, Transition_type_id'), 'do 0'); +SET session alter_algorithm=@old_alter_alg; DROP TABLE baseline; DROP TABLE time_zone; DROP TABLE time_zone_name; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade-34014.opt mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.opt --- mariadb-10.11.6/mysql-test/main/mysql_upgrade-34014.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.opt 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,2 @@ +--character-set-server=utf8mb3 +--collation-server=utf8mb3_unicode_ci diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade-34014.result mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.result --- mariadb-10.11.6/mysql-test/main/mysql_upgrade-34014.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,186 @@ +# +# Stat of 10.6 tests +# +# +# MDEV-34014 mysql_upgrade failed +# +SHOW CREATE DATABASE sys; +Database Create Database +sys CREATE DATABASE `sys` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */ +# Emulate db.opt file was removed in a mistake +FLUSH TABLES; +SHOW CREATE DATABASE sys; +Database Create Database +sys CREATE DATABASE `sys` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci */ +Phase 1/8: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/8: Installing used storage engines... Skipped +Phase 3/8: Running 'mysql_fix_privilege_tables' +Phase 4/8: Fixing views +mysql.user OK +sys.host_summary OK +sys.host_summary_by_file_io OK +sys.host_summary_by_file_io_type OK +sys.host_summary_by_stages OK +sys.host_summary_by_statement_latency OK +sys.host_summary_by_statement_type OK +sys.innodb_buffer_stats_by_schema OK +sys.innodb_buffer_stats_by_table OK +sys.innodb_lock_waits OK +sys.io_by_thread_by_latency OK +sys.io_global_by_file_by_bytes OK +sys.io_global_by_file_by_latency OK +sys.io_global_by_wait_by_bytes OK +sys.io_global_by_wait_by_latency OK +sys.latest_file_io OK +sys.memory_by_host_by_current_bytes OK +sys.memory_by_thread_by_current_bytes OK +sys.memory_by_user_by_current_bytes OK +sys.memory_global_by_current_bytes OK +sys.memory_global_total OK +sys.metrics OK +sys.processlist OK +sys.ps_check_lost_instrumentation OK +sys.schema_auto_increment_columns OK +sys.schema_index_statistics OK +sys.schema_object_overview OK +sys.schema_redundant_indexes OK +sys.schema_table_lock_waits OK +sys.schema_table_statistics OK +sys.schema_table_statistics_with_buffer OK +sys.schema_tables_with_full_table_scans OK +sys.schema_unused_indexes OK +sys.session OK +sys.session_ssl_status OK +sys.statement_analysis OK +sys.statements_with_errors_or_warnings OK +sys.statements_with_full_table_scans OK +sys.statements_with_runtimes_in_95th_percentile OK +sys.statements_with_sorting OK +sys.statements_with_temp_tables OK +sys.user_summary OK +sys.user_summary_by_file_io OK +sys.user_summary_by_file_io_type OK +sys.user_summary_by_stages OK +sys.user_summary_by_statement_latency OK +sys.user_summary_by_statement_type OK +sys.version OK +sys.wait_classes_global_by_avg_latency OK +sys.wait_classes_global_by_latency OK +sys.waits_by_host_by_latency OK +sys.waits_by_user_by_latency OK +sys.waits_global_by_latency OK +sys.x$host_summary OK +sys.x$host_summary_by_file_io OK +sys.x$host_summary_by_file_io_type OK +sys.x$host_summary_by_stages OK +sys.x$host_summary_by_statement_latency OK +sys.x$host_summary_by_statement_type OK +sys.x$innodb_buffer_stats_by_schema OK +sys.x$innodb_buffer_stats_by_table OK +sys.x$innodb_lock_waits OK +sys.x$io_by_thread_by_latency OK +sys.x$io_global_by_file_by_bytes OK +sys.x$io_global_by_file_by_latency OK +sys.x$io_global_by_wait_by_bytes OK +sys.x$io_global_by_wait_by_latency OK +sys.x$latest_file_io OK +sys.x$memory_by_host_by_current_bytes OK +sys.x$memory_by_thread_by_current_bytes OK +sys.x$memory_by_user_by_current_bytes OK +sys.x$memory_global_by_current_bytes OK +sys.x$memory_global_total OK +sys.x$processlist OK +sys.x$ps_digest_95th_percentile_by_avg_us OK +sys.x$ps_digest_avg_latency_distribution OK +sys.x$ps_schema_table_statistics_io OK +sys.x$schema_flattened_keys OK +sys.x$schema_index_statistics OK +sys.x$schema_table_lock_waits OK +sys.x$schema_table_statistics OK +sys.x$schema_table_statistics_with_buffer OK +sys.x$schema_tables_with_full_table_scans OK +sys.x$session OK +sys.x$statement_analysis OK +sys.x$statements_with_errors_or_warnings OK +sys.x$statements_with_full_table_scans OK +sys.x$statements_with_runtimes_in_95th_percentile OK +sys.x$statements_with_sorting OK +sys.x$statements_with_temp_tables OK +sys.x$user_summary OK +sys.x$user_summary_by_file_io OK +sys.x$user_summary_by_file_io_type OK +sys.x$user_summary_by_stages OK +sys.x$user_summary_by_statement_latency OK +sys.x$user_summary_by_statement_type OK +sys.x$wait_classes_global_by_avg_latency OK +sys.x$wait_classes_global_by_latency OK +sys.x$waits_by_host_by_latency OK +sys.x$waits_by_user_by_latency OK +sys.x$waits_global_by_latency OK +Phase 5/8: Fixing table and database names +Phase 6/8: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +performance_schema +sys +sys.sys_config OK +test +Phase 7/8: uninstalling plugins +Phase 8/8: Running 'FLUSH PRIVILEGES' +OK +SHOW CREATE DATABASE sys; +Database Create Database +sys CREATE DATABASE `sys` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */ +# +# End of 10.6 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade-34014.test mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.test --- mariadb-10.11.6/mysql-test/main/mysql_upgrade-34014.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade-34014.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,26 @@ +--source include/mysql_upgrade_preparation.inc + +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # +--echo # Stat of 10.6 tests +--echo # + +--echo # +--echo # MDEV-34014 mysql_upgrade failed +--echo # + +SHOW CREATE DATABASE sys; + +--echo # Emulate db.opt file was removed in a mistake +--remove_file $MYSQLD_DATADIR/sys/db.opt +FLUSH TABLES; +SHOW CREATE DATABASE sys; + +--exec $MYSQL_UPGRADE --force 2>&1 +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info +SHOW CREATE DATABASE sys; + +--echo # +--echo # End of 10.6 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade.result mariadb-10.11.9/mysql-test/main/mysql_upgrade.result --- mariadb-10.11.6/mysql-test/main/mysql_upgrade.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade.result 2024-08-03 07:29:57.000000000 +0000 @@ -2505,6 +2505,14 @@ Phase 8/8: Running 'FLUSH PRIVILEGES' OK set global sql_safe_updates=@orig_sql_safe_updates; +# +# MDEV-32043 Remove plugins previously external that are now built in (unix_socket) +# +INSERT INTO mysql.plugin SELECT 'unix_socket', 'auth_socket.so' + FROM dual WHERE convert(@@version_compile_os using latin1) not in ('Win32', 'Win64', 'Windows'); +# mariadb-upgrade --force --silent 2>&1 +SELECT * FROM mysql.plugin WHERE name='unix_socket'; +name dl # End of 10.4 tests # # Check that mysql_upgrade can be run on mysqldump diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade.test mariadb-10.11.9/mysql-test/main/mysql_upgrade.test --- mariadb-10.11.6/mysql-test/main/mysql_upgrade.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade.test 2024-08-03 07:29:57.000000000 +0000 @@ -496,6 +496,17 @@ --remove_file $MYSQLD_DATADIR/mysql_upgrade_info set global sql_safe_updates=@orig_sql_safe_updates; +--echo # +--echo # MDEV-32043 Remove plugins previously external that are now built in (unix_socket) +--echo # + +INSERT INTO mysql.plugin SELECT 'unix_socket', 'auth_socket.so' + FROM dual WHERE convert(@@version_compile_os using latin1) not in ('Win32', 'Win64', 'Windows'); +--echo # mariadb-upgrade --force --silent 2>&1 +--exec $MYSQL_UPGRADE --force --silent 2>&1 +SELECT * FROM mysql.plugin WHERE name='unix_socket'; +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + --echo # End of 10.4 tests # diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_file_leak.result mariadb-10.11.9/mysql-test/main/mysql_upgrade_file_leak.result --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_file_leak.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_file_leak.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,4 @@ +Running mysql_upgrade with --check-if-upgrade-is-needed +Checking for absence of temporary files by mysql_upgrade +No temporary files found +End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_file_leak.test mariadb-10.11.9/mysql-test/main/mysql_upgrade_file_leak.test --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_file_leak.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_file_leak.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,24 @@ +-- source include/mysql_upgrade_preparation.inc + +# +# MDEV-31925 mysqld_upgrade --check-if-upgrade-is-needed leaks files +# + +# Run mysql_upgrade with --check-if-upgrade-is-needed +--echo Running mysql_upgrade with --check-if-upgrade-is-needed +--exec $MYSQL_UPGRADE --check-if-upgrade-is-needed 2>&1 + +# Check if temporary files related to mysql_upgrade are cleared +--echo Checking for absence of temporary files by mysql_upgrade +--perl + +# Use the temporary directory path from the MySQL configuration +my $tmpdir = "$ENV{MYSQL_TMP_DIR}"; + +die "Test failed: Found temporary file left by mysql_upgrade\n" if (glob("$tmpdir/mysql_upgrade-*")); +print "No temporary files found\n"; +EOF + +let $MYSQLD_DATADIR= `select @@datadir`; +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info +--echo End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json.result mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json.result --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,301 @@ +# +# MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so +# is needed and load it +# +SET NAMES utf8; +show create table mysql_json_test; +ERROR HY000: Unknown data type: 'MYSQL_JSON' +Phase 1/8: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/8: Installing used storage engines... Skipped +installing plugin for MYSQL_JSON data type +Phase 3/8: Running 'mysql_fix_privilege_tables' +Phase 4/8: Fixing views +mysql.user OK +sys.host_summary OK +sys.host_summary_by_file_io OK +sys.host_summary_by_file_io_type OK +sys.host_summary_by_stages OK +sys.host_summary_by_statement_latency OK +sys.host_summary_by_statement_type OK +sys.innodb_buffer_stats_by_schema OK +sys.innodb_buffer_stats_by_table OK +sys.innodb_lock_waits OK +sys.io_by_thread_by_latency OK +sys.io_global_by_file_by_bytes OK +sys.io_global_by_file_by_latency OK +sys.io_global_by_wait_by_bytes OK +sys.io_global_by_wait_by_latency OK +sys.latest_file_io OK +sys.memory_by_host_by_current_bytes OK +sys.memory_by_thread_by_current_bytes OK +sys.memory_by_user_by_current_bytes OK +sys.memory_global_by_current_bytes OK +sys.memory_global_total OK +sys.metrics OK +sys.processlist OK +sys.ps_check_lost_instrumentation OK +sys.schema_auto_increment_columns OK +sys.schema_index_statistics OK +sys.schema_object_overview OK +sys.schema_redundant_indexes OK +sys.schema_table_lock_waits OK +sys.schema_table_statistics OK +sys.schema_table_statistics_with_buffer OK +sys.schema_tables_with_full_table_scans OK +sys.schema_unused_indexes OK +sys.session OK +sys.session_ssl_status OK +sys.statement_analysis OK +sys.statements_with_errors_or_warnings OK +sys.statements_with_full_table_scans OK +sys.statements_with_runtimes_in_95th_percentile OK +sys.statements_with_sorting OK +sys.statements_with_temp_tables OK +sys.user_summary OK +sys.user_summary_by_file_io OK +sys.user_summary_by_file_io_type OK +sys.user_summary_by_stages OK +sys.user_summary_by_statement_latency OK +sys.user_summary_by_statement_type OK +sys.version OK +sys.wait_classes_global_by_avg_latency OK +sys.wait_classes_global_by_latency OK +sys.waits_by_host_by_latency OK +sys.waits_by_user_by_latency OK +sys.waits_global_by_latency OK +sys.x$host_summary OK +sys.x$host_summary_by_file_io OK +sys.x$host_summary_by_file_io_type OK +sys.x$host_summary_by_stages OK +sys.x$host_summary_by_statement_latency OK +sys.x$host_summary_by_statement_type OK +sys.x$innodb_buffer_stats_by_schema OK +sys.x$innodb_buffer_stats_by_table OK +sys.x$innodb_lock_waits OK +sys.x$io_by_thread_by_latency OK +sys.x$io_global_by_file_by_bytes OK +sys.x$io_global_by_file_by_latency OK +sys.x$io_global_by_wait_by_bytes OK +sys.x$io_global_by_wait_by_latency OK +sys.x$latest_file_io OK +sys.x$memory_by_host_by_current_bytes OK +sys.x$memory_by_thread_by_current_bytes OK +sys.x$memory_by_user_by_current_bytes OK +sys.x$memory_global_by_current_bytes OK +sys.x$memory_global_total OK +sys.x$processlist OK +sys.x$ps_digest_95th_percentile_by_avg_us OK +sys.x$ps_digest_avg_latency_distribution OK +sys.x$ps_schema_table_statistics_io OK +sys.x$schema_flattened_keys OK +sys.x$schema_index_statistics OK +sys.x$schema_table_lock_waits OK +sys.x$schema_table_statistics OK +sys.x$schema_table_statistics_with_buffer OK +sys.x$schema_tables_with_full_table_scans OK +sys.x$session OK +sys.x$statement_analysis OK +sys.x$statements_with_errors_or_warnings OK +sys.x$statements_with_full_table_scans OK +sys.x$statements_with_runtimes_in_95th_percentile OK +sys.x$statements_with_sorting OK +sys.x$statements_with_temp_tables OK +sys.x$user_summary OK +sys.x$user_summary_by_file_io OK +sys.x$user_summary_by_file_io_type OK +sys.x$user_summary_by_stages OK +sys.x$user_summary_by_statement_latency OK +sys.x$user_summary_by_statement_type OK +sys.x$wait_classes_global_by_avg_latency OK +sys.x$wait_classes_global_by_latency OK +sys.x$waits_by_host_by_latency OK +sys.x$waits_by_user_by_latency OK +sys.x$waits_global_by_latency OK +Phase 5/8: Fixing table and database names +Phase 6/8: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +performance_schema +sys +sys.sys_config OK +test +test.mysql_json_test Needs upgrade +test.mysql_json_test_big Needs upgrade + +Repairing tables +test.mysql_json_test OK +test.mysql_json_test_big OK +Phase 7/8: uninstalling plugins +uninstalling plugin for 'type_mysql_json' data type +Phase 8/8: Running 'FLUSH PRIVILEGES' +OK +show create table mysql_json_test; +Table Create Table +mysql_json_test CREATE TABLE `mysql_json_test` ( + `description` varchar(100) DEFAULT NULL, + `expected` longtext DEFAULT NULL, + `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +select * from mysql_json_test; +description expected actual +Raw integers as JSON 0 0 +Raw integers as JSON -127 -127 +Raw integers as JSON 128 128 +Raw integers as JSON 32767 32767 +Raw integers as JSON -32768 -32768 +Raw integers as JSON 65535 65535 +Raw integers as JSON 65536 65536 +Raw integers as JSON -2147483648 -2147483648 +Raw integers as JSON 2147483647 2147483647 +Raw integers as JSON 4294967295 4294967295 +Raw integers as JSON -9223372036854775807 -9223372036854775807 +Raw integers as JSON 9223372036854775807 9223372036854775807 +Raw integers as JSON 18446744073709551615 18446744073709551615 +Raw doubles as JSON 3.14 3.14 +Raw doubles as JSON -5678.987 -5678.987 +Raw doubles as JSON -2.2250738585072014e-308 -2.2250738585072014e-308 +Raw doubles as JSON 2.2250738585072014e-308 2.2250738585072014e-308 +Simple JSON test {"key1": "val1", "key2": "val2"} {"key1": "val1", "key2": "val2"} +Raw doubles as JSON 0.0 0.0 +Simple Array as Value {"a": [1, 2], "b": ["x", "y"]} {"a": [1, 2], "b": ["x", "y"]} +Simple Array as Base Key [1, 2, 3, 4, 5, [], "a", "b", "c"] [1, 2, 3, 4, 5, [], "a", "b", "c"] +GeoJSON {"type": "MultiPoint", "coordinates": [[1, 1], [2, 2], [3, 3]]} {"type": "MultiPoint", "coordinates": [[1, 1], [2, 2], [3, 3]]} +GeoJSON {"type": "LineString", "coordinates": [[0, 5], [5, 10], [10, 15]]} {"type": "LineString", "coordinates": [[0, 5], [5, 10], [10, 15]]} +GeoJSON {"type": "GeometryCollection", "geometries": []} {"type": "GeometryCollection", "geometries": []} +GeoJSON {"type": "Point", "coordinates": [11.1111, 12.22222]} {"type": "Point", "coordinates": [11.1111, 12.22222]} +Opaque Types: opaque_mysql_type_set "b,c" "b,c" +Opaque Types: opaque_mysql_type_enum "b" "b" +Opaque Types: opaque_mysql_type_date "2015-01-15" "2015-01-15" +Opaque Types: opaque_mysql_type_time "23:24:25.000000" "23:24:25.000000" +Opaque Types: opaque_mysql_type_datetime "2015-01-15 23:24:25.000000" "2015-01-15 23:24:25.000000" +Opaque Types: opaque_mysql_type_geom {"type": "Point", "coordinates": [1, 1]} {"type": "Point", "coordinates": [1, 1]} +Opaque Types: opaque_mysql_type_bit "base64:type16:yv4=" "base64:type16:yv4=" +Opaque Types: opaque_mysql_type_year "base64:type13:MjAxOQ==" "base64:type13:MjAxOQ==" +Opaque Types: opaque_mysql_type_blob "base64:type252:yv66vg==" "base64:type252:yv66vg==" +Opaque Types: opaque_mysql_type_longblob "base64:type251:yv66vg==" "base64:type251:yv66vg==" +Opaque Types: opaque_mysql_type_mediumblob "base64:type250:yv66vg==" "base64:type250:yv66vg==" +Opaque Types: opaque_mysql_type_tinyblob "base64:type249:yv66vg==" "base64:type249:yv66vg==" +Opaque Types: opaque_mysql_type_varchar "base64:type15:Zm9v" "base64:type15:Zm9v" +DateTime as Raw Value: "2015-01-15 23:24:25.000000" "2015-01-15 23:24:25.000000" +Opaque Types: opaque_mysql_type_varbinary "base64:type15:YWJj" "base64:type15:YWJj" +Opaque Types: opaque_mysql_type_binary "base64:type254:YWJjAAAAAAAAAA==" "base64:type254:YWJjAAAAAAAAAA==" +DateTime as Raw Value: "23:24:25.000000" "23:24:25.000000" +DateTime as Raw Value: "2015-01-15" "2015-01-15" +DateTime as Raw Value: "2015-01-15 23:24:25.000000" "2015-01-15 23:24:25.000000" +UTF8 Characters: {"Person": "EMP", "details": {"Name": "Anel Husaković - test: đžšćÄ"}} {"Person": "EMP", "details": {"Name": "Anel Husaković - test: đžšćÄ"}} +UTF8 Characters: "Anel Husaković - test: đžšćÄ" "Anel Husaković - test: đžšćÄ" +UTF8 Characters: {"Name": "Anel Husaković - test: đžšćÄ"} {"Name": "Anel Husaković - test: đžšćÄ"} +UTF8 Characters: {"details": {"Name": "Anel Husaković - test: đžšćÄ"}, "\"Anel Husaković - test: đžšćÄ\"": "EMP"} {"details": {"Name": "Anel Husaković - test: đžšćÄ"}, "\"Anel Husaković - test: đžšćÄ\"": "EMP"} +Special Characters: {"{": "}"} {"{": "}"} +Special Characters: "key1 - with \" val " "key1 - with \" val " +Special Characters: {"key1 and \n\"key2\"": "val1\t val2"} {"key1 and \n\"key2\"": "val1\t val2"} +Special Characters: "'" "'" +Special Characters: "q" "q" +Special Characters: {"[": "]"} {"[": "]"} +Special Characters: {"{": "}"} {"{": "}"} +Empty JSON Object/Array: [] [] +Special Characters: "some_string" "some_string" +Special Characters: "'" "'" +Special Characters: "\"" "\"" +Special Characters: "" "" +Special Characters: "'" "'" +Special Characters: "''" "''" +Empty JSON Object/Array: {} {} +Special Characters: "f" "f" +Special Characters: "\\" "\\" +Special Characters: "\n" "\n" +Special Characters: "\f" "\f" +Special Characters: "\t" "\t" +Special Characters: "\r" "\r" +Special Characters: "\b" "\b" +Special Characters: "\\b" "\\b" +Special Characters: {"key \n key": "val \n val"} {"key \n key": "val \n val"} +Special Characters: {"key \f key": "val \f val"} {"key \f key": "val \f val"} +Special Characters: {"key \t key": "val \t val"} {"key \t key": "val \t val"} +Special Characters: {"key \r key": "val \r val"} {"key \r key": "val \r val"} +Special Characters: {"key \b key": "val \b val"} {"key \b key": "val \b val"} +Special Characters: {"key \\0 key": "val \n val"} {"key \\0 key": "val \n val"} +Special Characters: {"key \\ key": "val \\ val"} {"key \\ key": "val \\ val"} +Special Characters: {"key \" key": "val \" val"} {"key \" key": "val \" val"} +Special Characters: {"key ' key": "val ' val"} {"key ' key": "val ' val"} +Special Characters: {"key \\Z key": "val ' val"} {"key \\Z key": "val ' val"} +Special Characters: ["a \f b", "c \f d"] ["a \f b", "c \f d"] +Special Characters: ["a \t b", "c \t d"] ["a \t b", "c \t d"] +Special Characters: ["a \r b", "c \r d"] ["a \r b", "c \r d"] +Special Characters: ["a \b b", "c \b d"] ["a \b b", "c \b d"] +Special Characters: ["a \\ b", "c \\ d"] ["a \\ b", "c \\ d"] +Special Characters: ["a \" b", "c \" d"] ["a \" b", "c \" d"] +Special Characters: ["a ' b", "c ' d"] ["a ' b", "c ' d"] +Special String Cases: {"": ""} {"": ""} +Special String Cases: [""] [""] +Raw LITERALS: true true +Raw LITERALS: false false +Raw LITERALS: null null +JSON LITERALS: {"val": true} {"val": true} +JSON LITERALS: {"val": false} {"val": false} +JSON LITERALS: {"val": null} {"val": null} +Timestamp as RawValue "2019-12-26 19:56:03.000000" "2019-12-26 19:56:03.000000" +Array LITERALS: ["prefix", null, "suffix", 1] ["prefix", null, "suffix", 1] +Array LITERALS: ["prefix", false, "suffix", 1] ["prefix", false, "suffix", 1] +Array LITERALS: ["prefix", true, "suffix", 1] ["prefix", true, "suffix", 1] +show create table mysql_json_test_big; +Table Create Table +mysql_json_test_big CREATE TABLE `mysql_json_test_big` ( + `description` varchar(100) DEFAULT NULL, + `expected` longtext DEFAULT NULL, + `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +select * from mysql.plugin; +name dl +drop table mysql_json_test; +drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json.test mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json.test --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,36 @@ +--echo # +--echo # MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so +--echo # is needed and load it +--echo # + +-- source include/have_utf8.inc +-- source include/mysql_upgrade_preparation.inc + +if (!$TYPE_MYSQL_JSON_SO) { + skip Need MYSQL_JSON plugin; +} + +SET NAMES utf8; + +let $MYSQLD_DATADIR= `select @@datadir`; + +--copy_file std_data/mysql_json/mysql_json_test.frm $MYSQLD_DATADIR/test/mysql_json_test.frm +--copy_file std_data/mysql_json/mysql_json_test.MYI $MYSQLD_DATADIR/test/mysql_json_test.MYI +--copy_file std_data/mysql_json/mysql_json_test.MYD $MYSQLD_DATADIR/test/mysql_json_test.MYD + +--copy_file std_data/mysql_json/mysql_json_test_big.frm $MYSQLD_DATADIR/test/mysql_json_test_big.frm +--copy_file std_data/mysql_json/mysql_json_test_big.MYI $MYSQLD_DATADIR/test/mysql_json_test_big.MYI +--copy_file std_data/mysql_json/mysql_json_test_big.MYD $MYSQLD_DATADIR/test/mysql_json_test_big.MYD + +--error ER_UNKNOWN_DATA_TYPE +show create table mysql_json_test; + +--exec $MYSQL_UPGRADE --force 2>&1 +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +show create table mysql_json_test; +select * from mysql_json_test; +show create table mysql_json_test_big; +select * from mysql.plugin; +drop table mysql_json_test; +drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_system_tables.result mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_system_tables.result --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_system_tables.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_system_tables.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,94 @@ +# +# MDEV-32462: mysql_upgrade -s still checks for non system tables +# +call mtr.add_suppression("Table rebuild required"); +SET NAMES utf8; +# mariadb_upgrade on system and user table +show tables from mysql like '%json%'; +Tables_in_mysql (%json%) +mysql_json_test +use mysql; +show create table mysql.mysql_json_test; +ERROR HY000: Unknown data type: 'MYSQL_JSON' +show create table test.mysql_json_test; +ERROR HY000: Unknown data type: 'MYSQL_JSON' +SET @old_general_log= @@global.general_log; +SET @old_log_output= @@global.log_output; +SET @@global.general_log = ON; +SET @@global.log_output = "TABLE"; +The --upgrade-system-tables option was used, user tables won't be touched. +Phase 1/8: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.mysql_json_test +Error : Unknown data type: 'MYSQL_JSON' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.mysql_json_test +Error : Unknown data type: 'MYSQL_JSON' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/8: Installing used storage engines... Skipped +Phase 3/8: Running 'mysql_fix_privilege_tables' +Phase 4/8: Fixing views... Skipped +Phase 5/8: Fixing table and database names ... Skipped +Phase 6/8: Checking and upgrading tables... Skipped +Phase 7/8: uninstalling plugins +Phase 8/8: Running 'FLUSH PRIVILEGES' +OK +SET @@global.general_log = @old_general_log; +SET @@global.log_output = @old_log_output; +select command_type, argument from mysql.general_log where argument like "%SELECT table_comment FROM information_schema.tables%"; +command_type argument +show create table mysql.mysql_json_test; +ERROR HY000: Unknown data type: 'MYSQL_JSON' +show create table test.mysql_json_test; +ERROR HY000: Unknown data type: 'MYSQL_JSON' +drop table mysql.mysql_json_test; +drop table test.mysql_json_test; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_system_tables.test mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_system_tables.test --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_system_tables.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_system_tables.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,52 @@ +--echo # +--echo # MDEV-32462: mysql_upgrade -s still checks for non system tables +--echo # + +# Let's now load plugin first +--source include/have_utf8.inc +--source include/not_embedded.inc + +--source include/mysql_upgrade_preparation.inc +call mtr.add_suppression("Table rebuild required"); + +SET NAMES utf8; + +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # mariadb_upgrade on system and user table +--copy_file std_data/mysql_json/mysql_json_test.frm $MYSQLD_DATADIR/mysql/mysql_json_test.frm +--copy_file std_data/mysql_json/mysql_json_test.MYI $MYSQLD_DATADIR/mysql/mysql_json_test.MYI +--copy_file std_data/mysql_json/mysql_json_test.MYD $MYSQLD_DATADIR/mysql/mysql_json_test.MYD +--copy_file std_data/mysql_json/mysql_json_test.frm $MYSQLD_DATADIR/test/mysql_json_test.frm +--copy_file std_data/mysql_json/mysql_json_test.MYI $MYSQLD_DATADIR/test/mysql_json_test.MYI +--copy_file std_data/mysql_json/mysql_json_test.MYD $MYSQLD_DATADIR/test/mysql_json_test.MYD + +show tables from mysql like '%json%'; +use mysql; +--error ER_UNKNOWN_DATA_TYPE +show create table mysql.mysql_json_test; +--error ER_UNKNOWN_DATA_TYPE +show create table test.mysql_json_test; + +SET @old_general_log= @@global.general_log; +SET @old_log_output= @@global.log_output; +SET @@global.general_log = ON; +SET @@global.log_output = "TABLE"; +--exec $MYSQL_UPGRADE -s --force 2>&1 +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info +SET @@global.general_log = @old_general_log; +SET @@global.log_output = @old_log_output; + +select command_type, argument from mysql.general_log where argument like "%SELECT table_comment FROM information_schema.tables%"; + +# User table is not upgraded in `mysql\test` DB, so we cannot see it. +--error ER_UNKNOWN_DATA_TYPE +show create table mysql.mysql_json_test; +--error ER_UNKNOWN_DATA_TYPE +show create table test.mysql_json_test; +drop table mysql.mysql_json_test; +drop table test.mysql_json_test; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.result mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.result --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,198 @@ +# +# MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so +# is needed and load it +# +SET NAMES utf8; +call mtr.add_suppression("Table rebuild required"); +show create table mysql_json_test; +ERROR HY000: Table rebuild required. Please do "ALTER TABLE `test.mysql_json_test` FORCE" or dump/reload to fix it! +Phase 1/8: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/8: Installing used storage engines... Skipped +Phase 3/8: Running 'mysql_fix_privilege_tables' +Phase 4/8: Fixing views +mysql.user OK +sys.host_summary OK +sys.host_summary_by_file_io OK +sys.host_summary_by_file_io_type OK +sys.host_summary_by_stages OK +sys.host_summary_by_statement_latency OK +sys.host_summary_by_statement_type OK +sys.innodb_buffer_stats_by_schema OK +sys.innodb_buffer_stats_by_table OK +sys.innodb_lock_waits OK +sys.io_by_thread_by_latency OK +sys.io_global_by_file_by_bytes OK +sys.io_global_by_file_by_latency OK +sys.io_global_by_wait_by_bytes OK +sys.io_global_by_wait_by_latency OK +sys.latest_file_io OK +sys.memory_by_host_by_current_bytes OK +sys.memory_by_thread_by_current_bytes OK +sys.memory_by_user_by_current_bytes OK +sys.memory_global_by_current_bytes OK +sys.memory_global_total OK +sys.metrics OK +sys.processlist OK +sys.ps_check_lost_instrumentation OK +sys.schema_auto_increment_columns OK +sys.schema_index_statistics OK +sys.schema_object_overview OK +sys.schema_redundant_indexes OK +sys.schema_table_lock_waits OK +sys.schema_table_statistics OK +sys.schema_table_statistics_with_buffer OK +sys.schema_tables_with_full_table_scans OK +sys.schema_unused_indexes OK +sys.session OK +sys.session_ssl_status OK +sys.statement_analysis OK +sys.statements_with_errors_or_warnings OK +sys.statements_with_full_table_scans OK +sys.statements_with_runtimes_in_95th_percentile OK +sys.statements_with_sorting OK +sys.statements_with_temp_tables OK +sys.user_summary OK +sys.user_summary_by_file_io OK +sys.user_summary_by_file_io_type OK +sys.user_summary_by_stages OK +sys.user_summary_by_statement_latency OK +sys.user_summary_by_statement_type OK +sys.version OK +sys.wait_classes_global_by_avg_latency OK +sys.wait_classes_global_by_latency OK +sys.waits_by_host_by_latency OK +sys.waits_by_user_by_latency OK +sys.waits_global_by_latency OK +sys.x$host_summary OK +sys.x$host_summary_by_file_io OK +sys.x$host_summary_by_file_io_type OK +sys.x$host_summary_by_stages OK +sys.x$host_summary_by_statement_latency OK +sys.x$host_summary_by_statement_type OK +sys.x$innodb_buffer_stats_by_schema OK +sys.x$innodb_buffer_stats_by_table OK +sys.x$innodb_lock_waits OK +sys.x$io_by_thread_by_latency OK +sys.x$io_global_by_file_by_bytes OK +sys.x$io_global_by_file_by_latency OK +sys.x$io_global_by_wait_by_bytes OK +sys.x$io_global_by_wait_by_latency OK +sys.x$latest_file_io OK +sys.x$memory_by_host_by_current_bytes OK +sys.x$memory_by_thread_by_current_bytes OK +sys.x$memory_by_user_by_current_bytes OK +sys.x$memory_global_by_current_bytes OK +sys.x$memory_global_total OK +sys.x$processlist OK +sys.x$ps_digest_95th_percentile_by_avg_us OK +sys.x$ps_digest_avg_latency_distribution OK +sys.x$ps_schema_table_statistics_io OK +sys.x$schema_flattened_keys OK +sys.x$schema_index_statistics OK +sys.x$schema_table_lock_waits OK +sys.x$schema_table_statistics OK +sys.x$schema_table_statistics_with_buffer OK +sys.x$schema_tables_with_full_table_scans OK +sys.x$session OK +sys.x$statement_analysis OK +sys.x$statements_with_errors_or_warnings OK +sys.x$statements_with_full_table_scans OK +sys.x$statements_with_runtimes_in_95th_percentile OK +sys.x$statements_with_sorting OK +sys.x$statements_with_temp_tables OK +sys.x$user_summary OK +sys.x$user_summary_by_file_io OK +sys.x$user_summary_by_file_io_type OK +sys.x$user_summary_by_stages OK +sys.x$user_summary_by_statement_latency OK +sys.x$user_summary_by_statement_type OK +sys.x$wait_classes_global_by_avg_latency OK +sys.x$wait_classes_global_by_latency OK +sys.x$waits_by_host_by_latency OK +sys.x$waits_by_user_by_latency OK +sys.x$waits_global_by_latency OK +Phase 5/8: Fixing table and database names +Phase 6/8: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +performance_schema +sys +sys.sys_config OK +test +test.mysql_json_test Needs upgrade +test.mysql_json_test_big Needs upgrade + +Repairing tables +test.mysql_json_test OK +test.mysql_json_test_big OK +Phase 7/8: uninstalling plugins +Phase 8/8: Running 'FLUSH PRIVILEGES' +OK +show create table mysql_json_test; +Table Create Table +mysql_json_test CREATE TABLE `mysql_json_test` ( + `description` varchar(100) DEFAULT NULL, + `expected` longtext DEFAULT NULL, + `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +show create table mysql_json_test_big; +Table Create Table +mysql_json_test_big CREATE TABLE `mysql_json_test_big` ( + `description` varchar(100) DEFAULT NULL, + `expected` longtext DEFAULT NULL, + `actual` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci +select * from mysql.plugin; +name dl +drop table mysql_json_test; +drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.test mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.test --- mariadb-10.11.6/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysql_upgrade_mysql_json_with_plugin_loaded.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,35 @@ +--echo # +--echo # MDEV-24093: Detect during mysql_upgrade if type_mysql_json.so +--echo # is needed and load it +--echo # +# Let's now load plugin first +-- source include/have_utf8.inc +-- source include/have_type_mysql_json.inc +-- source include/mysql_upgrade_preparation.inc + +SET NAMES utf8; +call mtr.add_suppression("Table rebuild required"); + +let $MYSQLD_DATADIR= `select @@datadir`; + +--copy_file std_data/mysql_json/mysql_json_test.frm $MYSQLD_DATADIR/test/mysql_json_test.frm +--copy_file std_data/mysql_json/mysql_json_test.MYI $MYSQLD_DATADIR/test/mysql_json_test.MYI +--copy_file std_data/mysql_json/mysql_json_test.MYD $MYSQLD_DATADIR/test/mysql_json_test.MYD + +--copy_file std_data/mysql_json/mysql_json_test_big.frm $MYSQLD_DATADIR/test/mysql_json_test_big.frm +--copy_file std_data/mysql_json/mysql_json_test_big.MYI $MYSQLD_DATADIR/test/mysql_json_test_big.MYI +--copy_file std_data/mysql_json/mysql_json_test_big.MYD $MYSQLD_DATADIR/test/mysql_json_test_big.MYD + +# In the previous example (mysql_json_mysql_upgrade.test) +# instead of ER_TABLE_NEEDS_REBUILD we had ER_UNKNOWN_DATA_TYPE +--error ER_TABLE_NEEDS_REBUILD +show create table mysql_json_test; + +--exec $MYSQL_UPGRADE --force 2>&1 +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +show create table mysql_json_test; +show create table mysql_json_test_big; +select * from mysql.plugin; +drop table mysql_json_test; +drop table mysql_json_test_big; diff -Nru mariadb-10.11.6/mysql-test/main/mysqlbinlog_row_compressed.result mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_compressed.result --- mariadb-10.11.6/mysql-test/main/mysqlbinlog_row_compressed.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_compressed.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,3 +1,5 @@ +set pseudo_thread_id=5; +reset master; SET GLOBAL log_bin_compress=on; SET GLOBAL log_bin_compress_min_len=10; CREATE TABLE t1 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 TINYINT, f4 MEDIUMINT, f5 BIGINT, f6 INT, f7 INT, f8 char(1)); @@ -15,21 +17,21 @@ /*!40019 SET @@session.max_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -# at 4 -# server id 1 end_log_pos 256 CRC32 XXX Start: xxx +# at +# server id 1 end_log_pos CRC32 XXX Start: xxx ROLLBACK/*!*/; -# at 256 -# server id 1 end_log_pos 285 CRC32 XXX Gtid list [] -# at 285 -# server id 1 end_log_pos 329 CRC32 XXX Binlog checkpoint master-bin.000001 -# at 329 -# server id 1 end_log_pos 371 CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; -# at 371 -# server id 1 end_log_pos 542 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Gtid list [] +# at +# server id 1 end_log_pos CRC32 XXX Binlog checkpoint master-bin.000001 +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-1 ddl +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= use `test`/*!*/; SET TIMESTAMP=X/*!*/; SET @@session.pseudo_thread_id=5/*!*/; @@ -42,26 +44,26 @@ SET @@session.collation_database=DEFAULT/*!*/; CREATE TABLE t1 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 TINYINT, f4 MEDIUMINT, f5 BIGINT, f6 INT, f7 INT, f8 char(1)) /*!*/; -# at 542 -# server id 1 end_log_pos 584 CRC32 XXX GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; -# at 584 -# server id 1 end_log_pos 745 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-2 ddl +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; CREATE TABLE t2 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 INT, f4 INT, f5 MEDIUMINT, f6 INT, f7 INT, f8 char(1)) /*!*/; -# at 745 -# server id 1 end_log_pos 787 CRC32 XXX GTID 0-1-3 -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-3 +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; -# at 787 -# at 861 -# server id 1 end_log_pos 861 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> INSERT INTO t1 VALUES (10, 1, 2, 3, 4, 5, 6, 7, "") -# server id 1 end_log_pos 917 CRC32 XXX Table_map: `test`.`t1` mapped to number num -# at 917 -# server id 1 end_log_pos 985 CRC32 XXX Write_compressed_rows: table id 32 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t1` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Write_compressed_rows: table id flags: STMT_END_F ### INSERT INTO `test`.`t1` ### SET ### @1=10 /* INT meta=0 nullable=0 is_null=0 */ @@ -74,23 +76,23 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9='' /* STRING(1) meta=65025 nullable=1 is_null=0 */ # Number of rows: 1 -# at 985 -# server id 1 end_log_pos 1058 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 1058 -# server id 1 end_log_pos 1100 CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-4 +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; -# at 1100 -# at 1176 -# server id 1 end_log_pos 1176 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> INSERT INTO t1 VALUES (11, 1, 2, 3, 4, 5, 6, 7, NULL) -# server id 1 end_log_pos 1232 CRC32 XXX Table_map: `test`.`t1` mapped to number num -# at 1232 -# server id 1 end_log_pos 1299 CRC32 XXX Write_compressed_rows: table id 32 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t1` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Write_compressed_rows: table id flags: STMT_END_F ### INSERT INTO `test`.`t1` ### SET ### @1=11 /* INT meta=0 nullable=0 is_null=0 */ @@ -103,23 +105,23 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9=NULL /* STRING(1) meta=65025 nullable=1 is_null=1 */ # Number of rows: 1 -# at 1299 -# server id 1 end_log_pos 1372 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 1372 -# server id 1 end_log_pos 1414 CRC32 XXX GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-5 +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; -# at 1414 -# at 1492 -# server id 1 end_log_pos 1492 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> INSERT INTO t1 VALUES (12, 1, 2, 3, NULL, 5, 6, 7, "A") -# server id 1 end_log_pos 1548 CRC32 XXX Table_map: `test`.`t1` mapped to number num -# at 1548 -# server id 1 end_log_pos 1614 CRC32 XXX Write_compressed_rows: table id 32 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t1` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Write_compressed_rows: table id flags: STMT_END_F ### INSERT INTO `test`.`t1` ### SET ### @1=12 /* INT meta=0 nullable=0 is_null=0 */ @@ -132,23 +134,23 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9='A' /* STRING(1) meta=65025 nullable=1 is_null=0 */ # Number of rows: 1 -# at 1614 -# server id 1 end_log_pos 1687 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 1687 -# server id 1 end_log_pos 1729 CRC32 XXX GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-6 +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; -# at 1729 -# at 1804 -# server id 1 end_log_pos 1804 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> INSERT INTO t1 VALUES (13, 1, 2, 3, 0, 5, 6, 7, "A") -# server id 1 end_log_pos 1860 CRC32 XXX Table_map: `test`.`t1` mapped to number num -# at 1860 -# server id 1 end_log_pos 1927 CRC32 XXX Write_compressed_rows: table id 32 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t1` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Write_compressed_rows: table id flags: STMT_END_F ### INSERT INTO `test`.`t1` ### SET ### @1=13 /* INT meta=0 nullable=0 is_null=0 */ @@ -161,23 +163,23 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9='A' /* STRING(1) meta=65025 nullable=1 is_null=0 */ # Number of rows: 1 -# at 1927 -# server id 1 end_log_pos 2000 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 2000 -# server id 1 end_log_pos 2042 CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-7 +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; -# at 2042 -# at 2096 -# server id 1 end_log_pos 2096 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> INSERT INTO t2 SELECT * FROM t1 -# server id 1 end_log_pos 2152 CRC32 XXX Table_map: `test`.`t2` mapped to number num -# at 2152 -# server id 1 end_log_pos 2243 CRC32 XXX Write_compressed_rows: table id 33 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t2` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Write_compressed_rows: table id flags: STMT_END_F ### INSERT INTO `test`.`t2` ### SET ### @1=10 /* INT meta=0 nullable=0 is_null=0 */ @@ -223,23 +225,23 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9='A' /* STRING(1) meta=65025 nullable=1 is_null=0 */ # Number of rows: 4 -# at 2243 -# server id 1 end_log_pos 2316 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 2316 -# server id 1 end_log_pos 2358 CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-8 +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; -# at 2358 -# at 2424 -# server id 1 end_log_pos 2424 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> UPDATE t2 SET f4=5 WHERE f4>0 or f4 is NULL -# server id 1 end_log_pos 2480 CRC32 XXX Table_map: `test`.`t2` mapped to number num -# at 2480 -# server id 1 end_log_pos 2579 CRC32 XXX Update_compressed_rows: table id 33 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t2` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Update_compressed_rows: table id flags: STMT_END_F ### UPDATE `test`.`t2` ### WHERE ### @1=10 /* INT meta=0 nullable=0 is_null=0 */ @@ -304,23 +306,23 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9='A' /* STRING(1) meta=65025 nullable=1 is_null=0 */ # Number of rows: 3 -# at 2579 -# server id 1 end_log_pos 2652 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 2652 -# server id 1 end_log_pos 2694 CRC32 XXX GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-9 +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; -# at 2694 -# at 2731 -# server id 1 end_log_pos 2731 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> DELETE FROM t1 -# server id 1 end_log_pos 2787 CRC32 XXX Table_map: `test`.`t1` mapped to number num -# at 2787 -# server id 1 end_log_pos 2879 CRC32 XXX Delete_compressed_rows: table id 32 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t1` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Delete_compressed_rows: table id flags: STMT_END_F ### DELETE FROM `test`.`t1` ### WHERE ### @1=10 /* INT meta=0 nullable=0 is_null=0 */ @@ -366,23 +368,23 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9='A' /* STRING(1) meta=65025 nullable=1 is_null=0 */ # Number of rows: 4 -# at 2879 -# server id 1 end_log_pos 2952 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 2952 -# server id 1 end_log_pos 2994 CRC32 XXX GTID 0-1-10 -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-10 +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; -# at 2994 -# at 3031 -# server id 1 end_log_pos 3031 CRC32 XXX Annotate_rows: +# at +# at +# server id 1 end_log_pos CRC32 XXX Annotate_rows: #Q> DELETE FROM t2 -# server id 1 end_log_pos 3087 CRC32 XXX Table_map: `test`.`t2` mapped to number num -# at 3087 -# server id 1 end_log_pos 3172 CRC32 XXX Delete_compressed_rows: table id 33 flags: STMT_END_F +# server id 1 end_log_pos CRC32 XXX Table_map: `test`.`t2` mapped to number num +# at +# server id 1 end_log_pos CRC32 XXX Delete_compressed_rows: table id flags: STMT_END_F ### DELETE FROM `test`.`t2` ### WHERE ### @1=10 /* INT meta=0 nullable=0 is_null=0 */ @@ -428,13 +430,13 @@ ### @8=7 /* INT meta=0 nullable=1 is_null=0 */ ### @9='A' /* STRING(1) meta=65025 nullable=1 is_null=0 */ # Number of rows: 4 -# at 3172 -# server id 1 end_log_pos 3245 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 3245 -# server id 1 end_log_pos 3293 CRC32 XXX Rotate to master-bin.000002 pos: 4 +# at +# server id 1 end_log_pos CRC32 XXX Rotate to master-bin.000002 pos: 4 DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; diff -Nru mariadb-10.11.6/mysql-test/main/mysqlbinlog_row_compressed.test mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_compressed.test --- mariadb-10.11.6/mysql-test/main/mysqlbinlog_row_compressed.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_compressed.test 2024-08-03 07:29:57.000000000 +0000 @@ -4,13 +4,14 @@ --source include/have_log_bin.inc --source include/have_binlog_format_row.inc ---source include/have_normal_bzip.inc # # # mysqlbinlog: compressed row event # # +set pseudo_thread_id=5; +reset master; SET GLOBAL log_bin_compress=on; SET GLOBAL log_bin_compress_min_len=10; @@ -30,7 +31,7 @@ FLUSH BINARY LOGS; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR ---replace_regex /\d{6} *\d*:\d\d:\d\d// /Start:.*at startup/Start: xxx/ /SET TIMESTAMP=\d*/SET TIMESTAMP=X/ /exec_time=\d*/exec_time=x/ /mapped to number \d*/mapped to number num/ /CRC32 0x[0-9a-f]+/CRC32 XXX/ /@@session.sql_mode=\d+/@@session.sql_mode=#/ /collation_server=\d+/collation_server=#/ /xid=\d*/xid=/ +--replace_regex /\d{6} *\d*:\d\d:\d\d// /Start:.*at startup/Start: xxx/ /SET TIMESTAMP=\d*/SET TIMESTAMP=X/ /exec_time=\d*/exec_time=x/ /mapped to number \d*/mapped to number num/ /CRC32 0x[0-9a-f]+/CRC32 XXX/ /@@session.sql_mode=\d+/@@session.sql_mode=#/ /collation_server=\d+/collation_server=#/ /xid=\d*/xid=/ /table id \d+/table id / /end_log_pos \d+/end_log_pos / /# at \d+/# at / --exec $MYSQL_BINLOG --verbose --verbose --base64-output=DECODE-ROWS $datadir/$binlog --echo diff -Nru mariadb-10.11.6/mysql-test/main/mysqlbinlog_row_minimal.result mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_minimal.result --- mariadb-10.11.6/mysql-test/main/mysqlbinlog_row_minimal.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqlbinlog_row_minimal.result 2024-08-03 07:29:57.000000000 +0000 @@ -22,10 +22,10 @@ # server id 1 end_log_pos 329 CRC32 XXX Binlog checkpoint master-bin.000001 # at 329 # server id 1 end_log_pos 371 CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at 371 # server id 1 end_log_pos 564 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= use `test`/*!*/; @@ -42,7 +42,7 @@ /*!*/; # at 564 # server id 1 end_log_pos 606 CRC32 XXX GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at 606 # server id 1 end_log_pos 792 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; @@ -50,7 +50,7 @@ /*!*/; # at 792 # server id 1 end_log_pos 834 CRC32 XXX GTID 0-1-3 -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at 834 @@ -79,7 +79,7 @@ /*!*/; # at 1106 # server id 1 end_log_pos 1148 CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at 1148 @@ -108,7 +108,7 @@ /*!*/; # at 1421 # server id 1 end_log_pos 1463 CRC32 XXX GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at 1463 @@ -137,7 +137,7 @@ /*!*/; # at 1737 # server id 1 end_log_pos 1779 CRC32 XXX GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at 1779 @@ -166,7 +166,7 @@ /*!*/; # at 2053 # server id 1 end_log_pos 2095 CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at 2095 @@ -228,7 +228,7 @@ /*!*/; # at 2445 # server id 1 end_log_pos 2487 CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at 2487 @@ -261,7 +261,7 @@ /*!*/; # at 2748 # server id 1 end_log_pos 2790 CRC32 XXX GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at 2790 @@ -291,7 +291,7 @@ /*!*/; # at 3010 # server id 1 end_log_pos 3052 CRC32 XXX GTID 0-1-10 -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; # at 3052 @@ -371,10 +371,10 @@ DELIMITER /*!*/; # at POS # server id 1 end_log_pos END_LOG_POS CRC32 XXX GTID D-S-N -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=21*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=21*//*!*/; START TRANSACTION /*!*/; # at POS @@ -382,7 +382,7 @@ # server id 1 end_log_pos END_LOG_POS CRC32 XXX Annotate_rows: #Q> UPDATE t1 t1 INNER JOIN t2 t2 ON t1.ref_id = t2.id #Q> SET t1.is_deleted = TRUE -#Q> WHERE t1.id = +#Q> WHERE t1.id = 1 # server id 1 end_log_pos END_LOG_POS CRC32 XXX Table_map: `test`.`t1` mapped to number TID # at POS # server id 1 end_log_pos END_LOG_POS CRC32 XXX Update_rows: table id TID flags: STMT_END_F diff -Nru mariadb-10.11.6/mysql-test/main/mysqlbinlog_stmt_compressed.result mariadb-10.11.9/mysql-test/main/mysqlbinlog_stmt_compressed.result --- mariadb-10.11.6/mysql-test/main/mysqlbinlog_stmt_compressed.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqlbinlog_stmt_compressed.result 2024-08-03 07:29:57.000000000 +0000 @@ -15,21 +15,21 @@ /*!40019 SET @@session.max_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -# at 4 -# server id 1 end_log_pos 256 CRC32 XXX Start: xxx +# at +# server id 1 end_log_pos CRC32 XXX Start: xxx ROLLBACK/*!*/; -# at 256 -# server id 1 end_log_pos 285 CRC32 XXX Gtid list [] -# at 285 -# server id 1 end_log_pos 329 CRC32 XXX Binlog checkpoint master-bin.000001 -# at 329 -# server id 1 end_log_pos 371 CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; -# at 371 -# server id 1 end_log_pos 542 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Gtid list [] +# at +# server id 1 end_log_pos CRC32 XXX Binlog checkpoint master-bin.000001 +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-1 ddl +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= use `test`/*!*/; SET TIMESTAMP=X/*!*/; SET @@session.pseudo_thread_id=5/*!*/; @@ -42,136 +42,136 @@ SET @@session.collation_database=DEFAULT/*!*/; CREATE TABLE t1 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 TINYINT, f4 MEDIUMINT, f5 BIGINT, f6 INT, f7 INT, f8 char(1)) /*!*/; -# at 542 -# server id 1 end_log_pos 584 CRC32 XXX GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; -# at 584 -# server id 1 end_log_pos 745 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-2 ddl +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; CREATE TABLE t2 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 INT, f4 INT, f5 MEDIUMINT, f6 INT, f7 INT, f8 char(1)) /*!*/; -# at 745 -# server id 1 end_log_pos 787 CRC32 XXX GTID 0-1-3 -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-3 +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; -# at 787 -# server id 1 end_log_pos 915 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; INSERT INTO t1 VALUES (10, 1, 2, 3, 4, 5, 6, 7, "") /*!*/; -# at 915 -# server id 1 end_log_pos 988 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 988 -# server id 1 end_log_pos 1030 CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-4 +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; -# at 1030 -# server id 1 end_log_pos 1158 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; INSERT INTO t1 VALUES (11, 1, 2, 3, 4, 5, 6, 7, NULL) /*!*/; -# at 1158 -# server id 1 end_log_pos 1231 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 1231 -# server id 1 end_log_pos 1273 CRC32 XXX GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-5 +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; -# at 1273 -# server id 1 end_log_pos 1403 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; INSERT INTO t1 VALUES (12, 1, 2, 3, NULL, 5, 6, 7, "A") /*!*/; -# at 1403 -# server id 1 end_log_pos 1476 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 1476 -# server id 1 end_log_pos 1518 CRC32 XXX GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-6 +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; -# at 1518 -# server id 1 end_log_pos 1645 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; INSERT INTO t1 VALUES (13, 1, 2, 3, 0, 5, 6, 7, "A") /*!*/; -# at 1645 -# server id 1 end_log_pos 1718 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 1718 -# server id 1 end_log_pos 1760 CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-7 +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; -# at 1760 -# server id 1 end_log_pos 1868 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; INSERT INTO t2 SELECT * FROM t1 /*!*/; -# at 1868 -# server id 1 end_log_pos 1941 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 1941 -# server id 1 end_log_pos 1983 CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-8 +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; -# at 1983 -# server id 1 end_log_pos 2100 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; UPDATE t2 SET f4=5 WHERE f4>0 or f4 is NULL /*!*/; -# at 2100 -# server id 1 end_log_pos 2173 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 2173 -# server id 1 end_log_pos 2215 CRC32 XXX GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-9 +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; -# at 2215 -# server id 1 end_log_pos 2306 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; DELETE FROM t1 /*!*/; -# at 2306 -# server id 1 end_log_pos 2379 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 2379 -# server id 1 end_log_pos 2421 CRC32 XXX GTID 0-1-10 -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +# at +# server id 1 end_log_pos CRC32 XXX GTID 0-1-10 +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; -# at 2421 -# server id 1 end_log_pos 2512 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; DELETE FROM t2 /*!*/; -# at 2512 -# server id 1 end_log_pos 2585 CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= +# at +# server id 1 end_log_pos CRC32 XXX Query thread_id=5 exec_time=x error_code=0 xid= SET TIMESTAMP=X/*!*/; COMMIT /*!*/; -# at 2585 -# server id 1 end_log_pos 2633 CRC32 XXX Rotate to master-bin.000002 pos: 4 +# at +# server id 1 end_log_pos CRC32 XXX Rotate to master-bin.000002 pos: 4 DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; diff -Nru mariadb-10.11.6/mysql-test/main/mysqlbinlog_stmt_compressed.test mariadb-10.11.9/mysql-test/main/mysqlbinlog_stmt_compressed.test --- mariadb-10.11.6/mysql-test/main/mysqlbinlog_stmt_compressed.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqlbinlog_stmt_compressed.test 2024-08-03 07:29:57.000000000 +0000 @@ -4,7 +4,6 @@ --source include/have_log_bin.inc --source include/have_binlog_format_statement.inc ---source include/have_normal_bzip.inc # # # mysqlbinlog: compressed query event @@ -29,7 +28,7 @@ FLUSH BINARY LOGS; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR ---replace_regex /\d{6} *\d*:\d\d:\d\d// /Start:.*at startup/Start: xxx/ /SET TIMESTAMP=\d*/SET TIMESTAMP=X/ /exec_time=\d*/exec_time=x/ /mapped to number \d*/mapped to number num/ /CRC32 0x[0-9a-f]+/CRC32 XXX/ /@@session.sql_mode=\d+/@@session.sql_mode=#/ /collation_server=\d+/collation_server=#/ /xid=\d*/xid=/ +--replace_regex /\d{6} *\d*:\d\d:\d\d// /Start:.*at startup/Start: xxx/ /SET TIMESTAMP=\d*/SET TIMESTAMP=X/ /exec_time=\d*/exec_time=x/ /mapped to number \d*/mapped to number num/ /CRC32 0x[0-9a-f]+/CRC32 XXX/ /@@session.sql_mode=\d+/@@session.sql_mode=#/ /collation_server=\d+/collation_server=#/ /xid=\d*/xid=/ /table id \d+/table id / /end_log_pos \d+/end_log_pos / /# at \d+/# at / --exec $MYSQL_BINLOG --verbose --verbose --base64-output=DECODE-ROWS $datadir/$binlog --echo diff -Nru mariadb-10.11.6/mysql-test/main/mysqld--help,win.rdiff mariadb-10.11.9/mysql-test/main/mysqld--help,win.rdiff --- mariadb-10.11.6/mysql-test/main/mysqld--help,win.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqld--help,win.rdiff 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,6 @@ -@@ -180,6 +180,7 @@ +--- main/mysqld--help.result 2023-11-30 02:21:51.951132200 +0100 ++++ main/mysqld--help,win.reject 2023-11-30 02:35:44.404612300 +0100 +@@ -191,6 +191,7 @@ --console Write error output on screen; don't remove the console window on windows. --core-file Write core on crashes @@ -6,7 +8,7 @@ -h, --datadir=name Path to the database root directory --date-format=name The DATE format (ignored) --datetime-format=name -@@ -650,6 +651,7 @@ +@@ -696,6 +697,7 @@ Use MySQL-5.6 (instead of MariaDB-5.3) format for TIME, DATETIME, TIMESTAMP columns. (Defaults to on; use --skip-mysql56-temporal-format to disable.) @@ -14,7 +16,7 @@ --net-buffer-length=# Buffer length for TCP/IP and socket communication --net-read-timeout=# -@@ -1327,6 +1328,10 @@ +@@ -1351,6 +1353,10 @@ Alias for log_slow_query_file. Log slow queries to given log file. Defaults logging to 'hostname'-slow.log. Must be enabled to activate other slow log options @@ -25,7 +27,7 @@ --socket=name Socket file to use for connection --sort-buffer-size=# Each thread that needs to do a sort allocates a buffer of -@@ -1351,6 +1356,7 @@ +@@ -1376,6 +1382,7 @@ deleting or updating every row in a table. --stack-trace Print a symbolic stack trace on failure (Defaults to on; use --skip-stack-trace to disable.) @@ -33,7 +35,7 @@ --standard-compliant-cte Allow only CTEs compliant to SQL standard (Defaults to on; use --skip-standard-compliant-cte to disable.) -@@ -1426,6 +1432,11 @@ +@@ -1454,6 +1461,11 @@ --thread-pool-max-threads=# Maximum allowed number of worker threads in the thread pool @@ -45,7 +47,7 @@ --thread-pool-oversubscribe=# How many additional active worker threads in a group are allowed. -@@ -1464,8 +1475,8 @@ +@@ -1493,8 +1505,8 @@ automatically convert it to an on-disk MyISAM or Aria table. -t, --tmpdir=name Path for temporary files. Several paths may be specified, @@ -56,7 +58,7 @@ --transaction-alloc-block-size=# Allocation block size for transactions to be stored in binary log -@@ -1685,6 +1696,7 @@ +@@ -1716,6 +1728,7 @@ myisam-stats-method NULLS_UNEQUAL myisam-use-mmap FALSE mysql56-temporal-format TRUE @@ -64,7 +66,7 @@ net-buffer-length 16384 net-read-timeout 30 net-retry-count 10 -@@ -1841,6 +1853,7 @@ +@@ -1874,6 +1887,7 @@ slave-type-conversions slow-launch-time 2 slow-query-log FALSE @@ -72,7 +74,7 @@ sort-buffer-size 2097152 sql-mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION sql-safe-updates FALSE -@@ -1867,6 +1880,8 @@ +@@ -1901,6 +1915,8 @@ thread-pool-exact-stats FALSE thread-pool-idle-timeout 60 thread-pool-max-threads 65536 diff -Nru mariadb-10.11.6/mysql-test/main/mysqld--help.result mariadb-10.11.9/mysql-test/main/mysqld--help.result --- mariadb-10.11.6/mysql-test/main/mysqld--help.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqld--help.result 2024-08-03 07:29:57.000000000 +0000 @@ -565,9 +565,8 @@ when binary log is disabled). --log-tc-size=# Size of transaction coordinator log. -W, --log-warnings[=#] - Log some not critical warnings to the general log - file.Value can be between 0 and 11. Higher values mean - more verbosity + Log some non critical warnings to the error log.Value can + be between 0 and 11. Higher values mean more verbosity --long-query-time=# Alias for log_slow_query_time. Log all queries that have taken more than long_query_time seconds to execute to the slow query log file. The argument will be treated as a @@ -721,7 +720,8 @@ MySQL versions. Any combination of: NO_DUP_KEY_WARNINGS_WITH_IGNORE, NO_PROGRESS_INFO, ZERO_DATE_TIME_CAST, UTF8_IS_UTF8MB3, - IGNORE_INDEX_ONLY_FOR_JOIN, COMPAT_5_1_CHECKSUM + IGNORE_INDEX_ONLY_FOR_JOIN, COMPAT_5_1_CHECKSUM, + NO_NULL_COLLATION_IDS Use 'ALL' to set all combinations. --old-passwords Use old password encryption method (needed for 4.0 and older clients) @@ -736,6 +736,18 @@ max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors (Automatically configured unless set explicitly) + --optimizer-adjust-secondary-key-costs=name + A bit field with the following values: + adjust_secondary_key_cost = Update secondary key costs + for ranges to be at least 5x of clustered primary key + costs. disable_max_seek = Disable 'max_seek optimization' + for secondary keys and slight adjustment of filter cost. + disable_forced_index_in_group_by = Disable automatic + forced index in GROUP BY. fix_innodb_cardinality = + Disable doubling of the Cardinality for InnoDB secondary + keys. This variable will be deleted in MariaDB 11.0 as it + is not needed with the new 11.0 optimizer. + Use 'ALL' to set all combinations. --optimizer-extra-pruning-depth=# If the optimizer needs to enumerate join prefix of this size or larger, then it will try aggressively prune away @@ -1167,7 +1179,7 @@ The tracing level for semi-sync replication. --rpl-semi-sync-master-wait-no-slave Wait until timeout when no semi-synchronous replication - slave available (enabled by default). + slave is available. (Defaults to on; use --skip-rpl-semi-sync-master-wait-no-slave to disable.) --rpl-semi-sync-master-wait-point=name Should transaction wait for semi-sync ack after having @@ -1725,6 +1737,7 @@ old-mode UTF8_IS_UTF8MB3 old-passwords FALSE old-style-user-limits FALSE +optimizer-adjust-secondary-key-costs optimizer-extra-pruning-depth 8 optimizer-max-sel-arg-weight 32000 optimizer-max-sel-args 16000 @@ -1868,7 +1881,7 @@ slave-skip-errors OFF slave-sql-verify-checksum TRUE slave-transaction-retries 10 -slave-transaction-retry-errors 1158,1159,1160,1161,1205,1213,1429,2013,12701 +slave-transaction-retry-errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701 slave-transaction-retry-interval 0 slave-type-conversions slow-launch-time 2 diff -Nru mariadb-10.11.6/mysql-test/main/mysqld--help.test mariadb-10.11.9/mysql-test/main/mysqld--help.test --- mariadb-10.11.6/mysql-test/main/mysqld--help.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqld--help.test 2024-08-03 07:29:57.000000000 +0000 @@ -28,7 +28,7 @@ large-files-support lower-case-file-system system-time-zone collation-server character-set-server log-tc-size table-cache table-open-cache table-open-cache-instances max-connections - tls-version version.* password-reuse-check + server-uid tls-version version.* password-reuse-check provider-bzip2 provider-lzma provider-lzo password-reuse-check-interval/; diff -Nru mariadb-10.11.6/mysql-test/main/mysqld_option_err.result mariadb-10.11.9/mysql-test/main/mysqld_option_err.result --- mariadb-10.11.6/mysql-test/main/mysqld_option_err.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqld_option_err.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,6 +3,17 @@ Test bad default storage engine. Test non-numeric value passed to number option. Test that bad value for plugin enum option is rejected correctly. +Test to see if multiple unknown options will be displayed in the error output +FOUND 1 /unknown option '--nonexistentoption2'/ in mysqltest.log +FOUND 1 /unknown option '--alsononexistent'/ in mysqltest.log +FOUND 1 /unknown variable 'nonexistentvariable=1'/ in mysqltest.log +Test to see if multiple ambiguous options and invalid arguments will be displayed in the error output +FOUND 1 /Error while setting value 'invalid_value' to 'sql_mode'/ in mysqltest.log +FOUND 1 /ambiguous option '--character'/ in mysqltest.log +FOUND 1 /option '--bootstrap' cannot take an argument/ in mysqltest.log +FOUND 1 /Integer value out of range for uint64: '18446744073709551616' for binlog_cache_size/ in mysqltest.log +FOUND 1 /Unknown suffix 'y' used for variable 'bulk_insert_buffer_size' \(value '123y'\). Legal suffix characters are: K, M, G, T, P, E/ in mysqltest.log +FOUND 1 /Error while setting value '123y' to 'bulk_insert_buffer_size'/ in mysqltest.log Test that --help --verbose works Test that --not-known-option --help --verbose gives error Done. diff -Nru mariadb-10.11.6/mysql-test/main/mysqld_option_err.test mariadb-10.11.9/mysql-test/main/mysqld_option_err.test --- mariadb-10.11.6/mysql-test/main/mysqld_option_err.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqld_option_err.test 2024-08-03 07:29:57.000000000 +0000 @@ -25,7 +25,7 @@ --echo Test bad binlog format. ---error 1 +--error 13 --exec $MYSQLD_BOOTSTRAP_CMD --skip-networking --datadir=$MYSQLTEST_VARDIR/tmp/mysqld_option_err --skip-grant-tables --log-bin --binlog-format=badformat >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1 @@ -35,7 +35,7 @@ --echo Test non-numeric value passed to number option. ---error 1 +--error 9 --exec $MYSQLD_BOOTSTRAP_CMD --skip-networking --datadir=$MYSQLTEST_VARDIR/tmp/mysqld_option_err --skip-grant-tables --min-examined-row-limit=notanumber >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1 @@ -46,6 +46,36 @@ --error 7 --exec $MYSQLD_BOOTSTRAP_CMD --skip-networking --datadir=$MYSQLTEST_VARDIR/tmp/mysqld_option_err --skip-grant-tables --plugin-dir=$MYSQLTEST_VARDIR/plugins --plugin-load=example=ha_example.so --plugin-example-enum-var=noexist >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1 +--let SEARCH_FILE = $MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log + +--echo Test to see if multiple unknown options will be displayed in the error output +--error 7 +--exec $MYSQLD_BOOTSTRAP_CMD --skip-networking --datadir=$MYSQLTEST_VARDIR/tmp/mysqld_option_err --skip-grant-tables --nonexistentoption2 --alsononexistent --nonexistentvariable=1 >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1 + +--let SEARCH_PATTERN=unknown option '--nonexistentoption2' +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=unknown option '--alsononexistent' +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=unknown variable 'nonexistentvariable=1' +--source include/search_pattern_in_file.inc + +--echo Test to see if multiple ambiguous options and invalid arguments will be displayed in the error output +--error 9 +--exec $MYSQLD_BOOTSTRAP_CMD --skip-networking --datadir=$MYSQLTEST_VARDIR/tmp/mysqld_option_err --skip-grant-tables --getopt-prefix-matching --sql-mode=invalid_value --character --bootstrap=partstoob --binlog_cache_size=18446744073709551616 --bulk_insert_buffer_size=123y >>$MYSQLTEST_VARDIR/tmp/mysqld_option_err/mysqltest.log 2>&1 + +--let SEARCH_PATTERN=Error while setting value 'invalid_value' to 'sql_mode' +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=ambiguous option '--character' +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=option '--bootstrap' cannot take an argument +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=Integer value out of range for uint64: '18446744073709551616' for binlog_cache_size +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=Unknown suffix 'y' used for variable 'bulk_insert_buffer_size' \(value '123y'\). Legal suffix characters are: K, M, G, T, P, E +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN=Error while setting value '123y' to 'bulk_insert_buffer_size' +--source include/search_pattern_in_file.inc + # # Test that an wrong option with --help --verbose gives an error # diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-compat-102.result mariadb-10.11.9/mysql-test/main/mysqldump-compat-102.result --- mariadb-10.11.6/mysql-test/main/mysqldump-compat-102.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-compat-102.result 2024-08-03 07:29:57.000000000 +0000 @@ -58,6 +58,7 @@ log(0, 'Session ' || connection_id() || ' ' || current_user || ' started'); END; $$ +/*M!999999\- enable the sandbox mode */ -- MariaDB dump DUMPVERSION Distrib DISTVERSION, for OS -- -- Host: localhost Database: db1_mdev17429 diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-max.result mariadb-10.11.9/mysql-test/main/mysqldump-max.result --- mariadb-10.11.6/mysql-test/main/mysqldump-max.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-max.result 2024-08-03 07:29:57.000000000 +0000 @@ -77,6 +77,7 @@ 3 first value 4 first value 5 first value +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -102,7 +103,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t1` DISABLE KEYS */; -INSERT DELAYED IGNORE INTO `t1` VALUES +INSERT DELAYED IGNORE INTO `t1` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -119,7 +120,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t2` DISABLE KEYS */; -INSERT DELAYED IGNORE INTO `t2` VALUES +INSERT DELAYED IGNORE INTO `t2` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -136,7 +137,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t3` DISABLE KEYS */; -INSERT DELAYED IGNORE INTO `t3` VALUES +INSERT DELAYED IGNORE INTO `t3` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -153,7 +154,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t4` DISABLE KEYS */; -INSERT DELAYED IGNORE INTO `t4` VALUES +INSERT DELAYED IGNORE INTO `t4` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -170,7 +171,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t5` DISABLE KEYS */; -INSERT DELAYED IGNORE INTO `t5` VALUES +INSERT DELAYED IGNORE INTO `t5` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -187,7 +188,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t6` DISABLE KEYS */; -INSERT IGNORE INTO `t6` VALUES +INSERT IGNORE INTO `t6` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -204,6 +205,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -229,7 +231,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t1` DISABLE KEYS */; -INSERT DELAYED INTO `t1` VALUES +INSERT DELAYED INTO `t1` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -246,7 +248,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t2` DISABLE KEYS */; -INSERT DELAYED INTO `t2` VALUES +INSERT DELAYED INTO `t2` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -263,7 +265,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t3` DISABLE KEYS */; -INSERT DELAYED INTO `t3` VALUES +INSERT DELAYED INTO `t3` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -280,7 +282,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t4` DISABLE KEYS */; -INSERT DELAYED INTO `t4` VALUES +INSERT DELAYED INTO `t4` VALUES (1,'first value'), (2,'first value'), (3,'first value'), @@ -297,7 +299,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t5` DISABLE KEYS */; -INSERT DELAYED INTO `t5` VALUES +INSERT DELAYED INTO `t5` VALUES (1,'first value'), (2,'first value'), (3,'first value'), diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-nl.result mariadb-10.11.9/mysql-test/main/mysqldump-nl.result --- mariadb-10.11.6/mysql-test/main/mysqldump-nl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-nl.result 2024-08-03 07:29:57.000000000 +0000 @@ -12,6 +12,7 @@ 1v`; flush tables; use test; +/*M!999999\- enable the sandbox mode */ -- -- Current Database: `mysqltest1 @@ -134,6 +135,7 @@ \! ls # test` +/*M!999999\- enable the sandbox mode */ -- -- Current Database: `test``` diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-no-binlog.result mariadb-10.11.9/mysql-test/main/mysqldump-no-binlog.result --- mariadb-10.11.6/mysql-test/main/mysqldump-no-binlog.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-no-binlog.result 2024-08-03 07:29:57.000000000 +0000 @@ -1 +1,2 @@ mariadb-dump: Error: Binlogging on server not active +/*M!999999\- enable the sandbox mode */ diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-order-by-size.result mariadb-10.11.9/mysql-test/main/mysqldump-order-by-size.result --- mariadb-10.11.6/mysql-test/main/mysqldump-order-by-size.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-order-by-size.result 2024-08-03 07:29:57.000000000 +0000 @@ -21,6 +21,7 @@ test.t4 analyze status Engine-independent statistics collected test.t4 analyze Warning Engine-independent statistics are not collected for column 'a' test.t4 analyze status OK +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t4` ( diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-system.result mariadb-10.11.9/mysql-test/main/mysqldump-system.result --- mariadb-10.11.6/mysql-test/main/mysqldump-system.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-system.result 2024-08-03 07:29:57.000000000 +0000 @@ -41,6 +41,7 @@ # # mysqldump of system tables with --system=all # +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -632,6 +633,7 @@ # # mysqldump of system tables with --system=all --replace # +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1246,6 +1248,7 @@ # # mysqldump of system tables with --system=all --insert-ignore # +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1300,28 +1303,28 @@ LOCK TABLES `column_stats` WRITE; /*!40000 ALTER TABLE `column_stats` DISABLE KEYS */; -INSERT IGNORE INTO `column_stats` VALUES +INSERT IGNORE INTO `column_stats` VALUES ('mysql','tz','Time_zone_id','1','5',0.0000,4.0000,98.2500,4,'JSON_HB','{\"target_histogram_size\": 254, \"collected_at\": \"2022-01-07 07:07:00\", \"collected_by\": \"version\", \"histogram_hb\": [{\"start\": \"1\", \"size\": 0.340966921, \"ndv\": 1}, {\"start\": \"3\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"4\", \"size\": 0.328244275, \"ndv\": 1}, {\"start\": \"5\", \"end\": \"5\", \"size\": 0.002544529, \"ndv\": 1}]}'); /*!40000 ALTER TABLE `column_stats` ENABLE KEYS */; UNLOCK TABLES; LOCK TABLES `index_stats` WRITE; /*!40000 ALTER TABLE `index_stats` DISABLE KEYS */; -INSERT IGNORE INTO `index_stats` VALUES +INSERT IGNORE INTO `index_stats` VALUES ('mysql','tz','PRIMARY',1,98.2500); /*!40000 ALTER TABLE `index_stats` ENABLE KEYS */; UNLOCK TABLES; LOCK TABLES `table_stats` WRITE; /*!40000 ALTER TABLE `table_stats` DISABLE KEYS */; -INSERT IGNORE INTO `table_stats` VALUES +INSERT IGNORE INTO `table_stats` VALUES ('mysql','tz',393); /*!40000 ALTER TABLE `table_stats` ENABLE KEYS */; UNLOCK TABLES; LOCK TABLES `innodb_index_stats` WRITE; /*!40000 ALTER TABLE `innodb_index_stats` DISABLE KEYS */; -INSERT IGNORE INTO `innodb_index_stats` VALUES +INSERT IGNORE INTO `innodb_index_stats` VALUES ('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx01',4,1,'Time_zone_id'), ('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_diff_pfx02',393,1,'Time_zone_id,Transition_time'), ('mysql','tz','PRIMARY','2019-12-31 21:00:00','n_leaf_pages',1,NULL,'Number of leaf pages in the index'), @@ -1331,7 +1334,7 @@ LOCK TABLES `innodb_table_stats` WRITE; /*!40000 ALTER TABLE `innodb_table_stats` DISABLE KEYS */; -INSERT IGNORE INTO `innodb_table_stats` VALUES +INSERT IGNORE INTO `innodb_table_stats` VALUES ('mysql','tz','2019-12-31 21:00:00',393,1,0); /*!40000 ALTER TABLE `innodb_table_stats` ENABLE KEYS */; UNLOCK TABLES; @@ -1340,7 +1343,7 @@ LOCK TABLES `time_zone` WRITE; /*!40000 ALTER TABLE `time_zone` DISABLE KEYS */; -INSERT IGNORE INTO `time_zone` VALUES +INSERT IGNORE INTO `time_zone` VALUES (1,'N'), (2,'N'), (3,'N'), @@ -1351,7 +1354,7 @@ LOCK TABLES `time_zone_name` WRITE; /*!40000 ALTER TABLE `time_zone_name` DISABLE KEYS */; -INSERT IGNORE INTO `time_zone_name` VALUES +INSERT IGNORE INTO `time_zone_name` VALUES ('Europe/Moscow',3), ('Japan',5), ('leap/Europe/Moscow',4), @@ -1363,7 +1366,7 @@ LOCK TABLES `time_zone_leap_second` WRITE; /*!40000 ALTER TABLE `time_zone_leap_second` DISABLE KEYS */; -INSERT IGNORE INTO `time_zone_leap_second` VALUES +INSERT IGNORE INTO `time_zone_leap_second` VALUES (78796800,1), (94694401,2), (126230402,3), @@ -1391,7 +1394,7 @@ LOCK TABLES `time_zone_transition` WRITE; /*!40000 ALTER TABLE `time_zone_transition` DISABLE KEYS */; -INSERT IGNORE INTO `time_zone_transition` VALUES +INSERT IGNORE INTO `time_zone_transition` VALUES (1,-1693706400,0), (1,-1680483600,1), (1,-1663455600,2), @@ -1790,7 +1793,7 @@ LOCK TABLES `time_zone_transition_type` WRITE; /*!40000 ALTER TABLE `time_zone_transition_type` DISABLE KEYS */; -INSERT IGNORE INTO `time_zone_transition_type` VALUES +INSERT IGNORE INTO `time_zone_transition_type` VALUES (1,0,7200,1,'MEST'), (1,1,3600,0,'MET'), (1,2,7200,1,'MEST'), diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-timing.result mariadb-10.11.9/mysql-test/main/mysqldump-timing.result --- mariadb-10.11.6/mysql-test/main/mysqldump-timing.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-timing.result 2024-08-03 07:29:57.000000000 +0000 @@ -7,6 +7,7 @@ INSERT INTO t1 VALUES (0); LOCK TABLE t1 WRITE; timeout without t1 contents expected +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -30,6 +31,7 @@ SET GLOBAL max_statement_time=0.1; UNLOCK TABLES;; This would be a race condition otherwise, but default max_statement_time=0 makes it succeed +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump-utf8mb4.result mariadb-10.11.9/mysql-test/main/mysqldump-utf8mb4.result --- mariadb-10.11.6/mysql-test/main/mysqldump-utf8mb4.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump-utf8mb4.result 2024-08-03 07:29:57.000000000 +0000 @@ -32,6 +32,7 @@ ---- Testing text format output ---- +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump.result mariadb-10.11.9/mysql-test/main/mysqldump.result --- mariadb-10.11.6/mysql-test/main/mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump.result 2024-08-03 07:29:57.000000000 +0000 @@ -31,6 +31,7 @@ CREATE TABLE t1 (a decimal(64, 20)); INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890"), ("0987654321098765432109876543210987654321"); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -48,6 +49,7 @@ INSERT IGNORE INTO t1 VALUES ('-9e999999'); Warnings: Warning 1264 Out of range value for column 'a' at row 1 +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -70,6 +72,7 @@ INSERT INTO t1 VALUES ("1.2345", 2.3456); ERROR 42S22: Unknown column '1.2345' in 'field list' SET SQL_MODE=@OLD_SQL_MODE; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -83,6 +86,7 @@ (1.23450,2.3456), (1.23450,2.3456), (1.23450,2.3456); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -96,6 +100,7 @@ (1.23450,2.3456), (1.23450,2.3456), (1.23450,2.3456); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -136,6 +141,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -217,6 +223,7 @@ # CREATE TABLE t1 (a VARCHAR(255)) DEFAULT CHARSET koi8r; INSERT INTO t1 VALUES (_koi8r x'C1C2C3C4C5'), (NULL); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -258,6 +265,7 @@ # CREATE TABLE t1 (a int) ENGINE=MYISAM; INSERT INTO t1 VALUES (1), (2); +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -283,6 +291,7 @@ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -313,6 +322,7 @@ # Bug#2592 mysqldump doesn't quote "tricky" names correctly # create table ```a` (i int); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE ```a` ( @@ -324,6 +334,7 @@ # Bug#2591 mysqldump quotes names inconsistently # create table t1(a int); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -357,6 +368,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -383,6 +395,7 @@ /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; set global sql_mode='ANSI_QUOTES'; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -416,6 +429,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -448,6 +462,7 @@ # create table t1(a int); insert into t1 values (1),(2),(3); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -480,6 +495,7 @@ # # Bug#6101 create database problem # +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -506,6 +522,7 @@ /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; create database mysqldump_test_db character set latin2 collate latin2_bin; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -540,6 +557,7 @@ # if it is explicitly set. CREATE TABLE t1 (a CHAR(10)); INSERT INTO t1 VALUES (_latin1 'ÄÖÜß'); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -582,6 +600,7 @@ # If the future we can move this command into a separate test with # checking that "mysqldump" is compiled with "latin1" # +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -606,6 +625,7 @@ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -630,6 +650,7 @@ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -662,6 +683,7 @@ CREATE TABLE t2 (a int); INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t2 VALUES (4),(5),(6); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -706,6 +728,7 @@ # CREATE TABLE t1 (`b` blob); INSERT INTO `t1` VALUES (0x602010000280100005E71A); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -747,6 +770,7 @@ CREATE TABLE t1 (a INT) ENGINE=MyISAM; INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t1 VALUES (4),(5),(6); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -768,7 +792,7 @@ LOCK TABLES `t1` WRITE; /*!40000 ALTER TABLE `t1` DISABLE KEYS */; -INSERT IGNORE INTO `t1` VALUES +INSERT IGNORE INTO `t1` VALUES (1), (2), (3), @@ -787,6 +811,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -807,7 +832,7 @@ /*!40101 SET character_set_client = @saved_cs_client */; /*!40000 ALTER TABLE `t1` DISABLE KEYS */; -INSERT DELAYED IGNORE INTO `t1` VALUES +INSERT DELAYED IGNORE INTO `t1` VALUES (1), (2), (3), @@ -1162,6 +1187,7 @@ F_6faa8040da20ef399b63a72d0e4ab575 int, F_fe73f687e5bc5280214e0486b273a5f9 int); insert into t1 (F_8d3bba7425e7c98c50f52ca1b52d3735) values (1); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1531,6 +1557,7 @@ # CREATE TABLE t1 (a int); INSERT INTO t1 VALUES (1),(2),(3); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1584,6 +1611,7 @@ CREATE TABLE t2 ( a INT ); INSERT INTO t1 VALUES (1), (2); INSERT INTO t2 VALUES (1), (2); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1619,6 +1647,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1691,21 +1720,35 @@ test_sequence ------ Testing with illegal table names ------ mariadb-dump: Couldn't find table: "\d-2-1.sql" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "\t1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "\t1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "\\t1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "t\1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "t\1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "t/1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "T_1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "T%1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "T'1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "T_1" +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't find table: "T_" +/*M!999999\- enable the sandbox mode */ test_sequence ------ Testing with illegal database names ------ mariadb-dump: Got error: 1049: "Unknown database 'mysqldump_test_d'" when selecting the database +/*M!999999\- enable the sandbox mode */ mariadb-dump: Got error: 1049: "Unknown database 'mysqld\ump_test_db'" when selecting the database +/*M!999999\- enable the sandbox mode */ drop table t1, t2, t3; drop database mysqldump_test_db; use test; @@ -1767,6 +1810,7 @@ +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1805,6 +1849,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1930,6 +1975,7 @@ create table t2(a int); create table t3(a int); mariadb-dump: Couldn't find table: "non_existing" +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -1979,6 +2025,7 @@ create table t1 (a int); mariadb-dump: Couldn't execute 'SELECT /*!40001 SQL_NO_CACHE */ `a` FROM `t1` WHERE xx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx': You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' at line 1 (1064) mariadb-dump: Got error: 1064: "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' at line 1" when retrieving data from server +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2020,6 +2067,7 @@ PRIMARY KEY (`a b`, `c"d`, `e``f`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; insert into t1 values (0815, 4711, 2006); +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -2050,6 +2098,7 @@ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2105,6 +2154,7 @@ INSERT INTO t2 VALUES ('waffle'); INSERT INTO t2 VALUES ('lemon'); create view v2 as select * from t2 where a like 'a%' with check option; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2204,6 +2254,7 @@ use test; create table t1(a int); create view v1 as select * from t1; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2274,6 +2325,7 @@ INSERT INTO t2 VALUES ('waffle'); INSERT INTO t2 VALUES ('lemon'); create view v2 as select * from t2 where a like 'a%' with check option; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2344,6 +2396,7 @@ # CREATE TABLE t1 (a char(10)); INSERT INTO t1 VALUES ('\''); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2391,6 +2444,7 @@ select * from v3 where b in (1, 2, 3, 4, 5, 6, 7); create view v2 as select v3.a from v3, v1 where v1.a=v3.a and v3.b=3 limit 1; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2543,6 +2597,7 @@ end AFTER 0000-00-00 00:00:00 STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION root@localhost latin1 latin1_swedish_ci latin1_swedish_ci INSERT INTO t1 (a) VALUES (1),(2),(3),(22); update t1 set a = 4 where a=3; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2676,6 +2731,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2827,6 +2883,7 @@ set sql_mode='ansi'; create procedure `a'b` () select 1; set sql_mode=''; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -2983,6 +3040,7 @@ 2003-10-26 02:00:00 2003-10-26 02:00:00 set global time_zone='Europe/Moscow'; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3024,6 +3082,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3086,6 +3145,7 @@ 1 2 3 +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -3166,6 +3226,7 @@ 1 first value xxxx 2 second value tttt 3 third value vvv vvv +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3294,6 +3355,7 @@ SET new.a = 0; END| SET SQL_MODE = @old_sql_mode; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3357,6 +3419,7 @@ # create table t1 (a binary(1), b blob); insert into t1 values ('',''); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3392,6 +3455,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3492,6 +3556,7 @@ create view v1 as select qty, price, qty*price as value from t; create view v2 as select qty from v1; mysqldump { +/*M!999999\- enable the sandbox mode */ /*!50001 DROP VIEW IF EXISTS `v1`*/; /*!50001 SET @saved_cs_client = @@character_set_client */; /*!50001 SET @saved_cs_results = @@character_set_results */; @@ -3507,6 +3572,7 @@ /*!50001 SET collation_connection = @saved_col_connection */; } mysqldump { +/*M!999999\- enable the sandbox mode */ /*!50001 DROP VIEW IF EXISTS `v2`*/; /*!50001 SET @saved_cs_client = @@character_set_client */; /*!50001 SET @saved_cs_results = @@character_set_results */; @@ -3552,6 +3618,7 @@ mysqldump { mariadb-dump: Got error: 1356: "View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them" when using LOCK TABLES mariadb-dump: Couldn't execute 'SHOW FIELDS FROM `v1`': View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them (1356) +/*M!999999\- enable the sandbox mode */ -- failed on view `v1`: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `test`.`t1`.`id` AS `id` from `t1` @@ -3568,6 +3635,7 @@ insert into t1 values (4711); insert into t1 values (3231); insert into t1 values (0815); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3646,6 +3714,7 @@ create database mysqldump_views; use mysqldump_views; create view nasishnasifu as select mysqldump_tables.basetable.id from mysqldump_tables.basetable; +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; @@ -3731,10 +3800,14 @@ create table t1(a int, b varchar(34)); reset master; mariadb-dump: Couldn't execute 'FLUSH /*!40101 LOCAL */ TABLES': Access denied; you need (at least one of) the RELOAD privilege(s) for this operation (1227) +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't execute 'FLUSH /*!40101 LOCAL */ TABLES': Access denied; you need (at least one of) the RELOAD privilege(s) for this operation (1227) +/*M!999999\- enable the sandbox mode */ grant RELOAD on *.* to mysqltest_1@localhost; mariadb-dump: Couldn't execute 'SHOW MASTER STATUS': Access denied; you need (at least one of) the SUPER, BINLOG MONITOR privilege(s) for this operation (1227) +/*M!999999\- enable the sandbox mode */ mariadb-dump: Couldn't execute 'SHOW MASTER STATUS': Access denied; you need (at least one of) the SUPER, BINLOG MONITOR privilege(s) for this operation (1227) +/*M!999999\- enable the sandbox mode */ grant REPLICATION CLIENT on *.* to mysqltest_1@localhost; drop table t1; drop user mysqltest_1@localhost; @@ -3793,6 +3866,7 @@ # # Bug #33762: mysqldump can not dump INFORMATION_SCHEMA # +/*M!999999\- enable the sandbox mode */ DROP TABLE IF EXISTS `TABLES`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -3857,6 +3931,7 @@ CREATE TABLE t2 (a INT) ENGINE=MyISAM; CREATE TABLE t3 (a INT) ENGINE=MyISAM; CREATE TABLE t1 (a INT) ENGINE=merge UNION=(t2, t3); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -3947,10 +4022,12 @@ connection user27293; create procedure mysqldump_test_db.sp1() select 'hello'; mariadb-dump: user2 has insufficient privileges to SHOW CREATE PROCEDURE `sp1`! +/*M!999999\- enable the sandbox mode */ -- insufficient privileges to SHOW CREATE PROCEDURE `sp1` -- does user2 have permissions on mysql.proc? +/*M!999999\- enable the sandbox mode */ /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ; /*!50003 SET @saved_cs_client = @@character_set_client */ ; @@ -3978,6 +4055,7 @@ # CREATE TABLE t1 (c1 INT, c2 LONGBLOB); INSERT INTO t1 SET c1=11, c2=REPEAT('q',509); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -4025,18 +4103,21 @@ # "Dump completed on" # # --skip-dump-date: +/*M!999999\- enable the sandbox mode */ -- -- Dump completed # --dump-date: +/*M!999999\- enable the sandbox mode */ -- -- Dump completed on DATE # --dump-date (default): +/*M!999999\- enable the sandbox mode */ -- @@ -4051,6 +4132,7 @@ create table t1 (id int); create view db42635.v1 (c) as select * from db42635.t1; create view db42635.v2 (c) as select * from db42635.t1; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -4111,6 +4193,7 @@ # SET NAMES utf8; CREATE TABLE `straße` ( f1 INT ); +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -4133,6 +4216,7 @@ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -4157,6 +4241,7 @@ DROP TABLE `straße`; CREATE TABLE `כדשגכחךלדגכחשךדגחכךלדגכ` ( f1 INT ); +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -4180,6 +4265,7 @@ /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; mariadb-dump: Got error: 1146: "Table 'test.???????????????????????' doesn't exist" when using LOCK TABLES +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -4196,6 +4282,7 @@ INSERT INTO t1 VALUES (1,1); INSERT INTO t1 VALUES (2,3); INSERT INTO t1 VALUES (3,4), (4,5); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -4470,6 +4557,7 @@ insert into t1 values (4711); insert into t1 values (3231); insert into t1 values (0815); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -4602,6 +4690,7 @@ create database `test-database`; use `test-database`; create table test (a int); +/*M!999999\- enable the sandbox mode */ DROP TABLE IF EXISTS `test`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; @@ -4824,6 +4913,7 @@ END | ALTER DATABASE `test-database` CHARACTER SET latin1 COLLATE latin1_swedish_ci; ALTER DATABASE `test-database` CHARACTER SET utf8 COLLATE utf8_unicode_ci ; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( @@ -5307,6 +5397,7 @@ # Also verify that a prefix of the mode's name is enough. # CREATE TABLE t1 (a INT); +/*M!999999\- enable the sandbox mode */ /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -5539,6 +5630,7 @@ USE `a\"'``b`; CREATE PROCEDURE p1() BEGIN END; ALTER DATABASE `a\"'``b` COLLATE utf8_general_ci; +/*M!999999\- enable the sandbox mode */ /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = '' */ ; ALTER DATABASE `a\"'``b` CHARACTER SET latin1 COLLATE latin1_swedish_ci ; @@ -5587,6 +5679,7 @@ ################################################## # --compact --databases db1 db2 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */; @@ -5655,6 +5748,7 @@ ################################################## # --compact db2 +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `nonunique_table_name` ( @@ -5677,6 +5771,7 @@ ################################################## # --compact --delayed-insert --no-data-med=0 --databases db2 db1 +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2` /*!40100 DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci */; @@ -5688,7 +5783,7 @@ UNIQUE KEY `i1` (`i1`) ) ENGINE=MEMORY AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -INSERT DELAYED INTO `nonunique_table_name` VALUES +INSERT DELAYED INTO `nonunique_table_name` VALUES (1), (2); /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -5710,7 +5805,7 @@ `id` smallint(6) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; -INSERT DELAYED INTO `basetable` VALUES +INSERT DELAYED INTO `basetable` VALUES (5), (6); /*!40101 SET @saved_cs_client = @@character_set_client */; @@ -5811,6 +5906,7 @@ CREATE TRIGGER tt1_t1 BEFORE INSERT ON t1 FOR EACH ROW SET NEW.b=NEW.a + 10; INSERT INTO t1 (a) VALUES (1),(2),(3); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -5859,6 +5955,7 @@ # # Without --replace and --insert-ignore # +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -5954,6 +6051,7 @@ # # With --replace # +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -6059,6 +6157,7 @@ # # With --insert-ignore # +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -6183,6 +6282,7 @@ insert into t3(`invisible`, `a b c & $!@#$%^&*( )`, `ds=~!@ \# $% ^ & * ( ) _ - = +` ) values(1,2,3); CREATE TABLE t4(ËÃÃŒÃÎËÃ1 INT); insert into t4 values(1); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -6223,6 +6323,7 @@ INSERT INTO `t4` VALUES (1); #Check side effect on --complete insert +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -6381,14 +6482,6 @@ s4 CREATE SEQUENCE `s4` start with 400 minvalue 400 maxvalue 1400 increment by 40 cache 1000 cycle ENGINE=MyISAM # Dump sequence without `--no-data` # Restore from mysqldump -SETVAL(`s1`, 1101, 0) -1101 -SETVAL(`s2`, 1201, 0) -1201 -SETVAL(`s3`, 1301, 0) -1301 -SETVAL(`s4`, 1401, 0) -1401 # Show create after restore show create sequence d.s1; Table Create Table @@ -6407,14 +6500,6 @@ 100 200 300 400 # Dump sequence with `--no-data` # Restore from mysqldump -SETVAL(`s1`, 1101, 0) -1101 -SETVAL(`s2`, 1201, 0) -1201 -SETVAL(`s3`, 1301, 0) -1301 -SETVAL(`s4`, 1401, 0) -1401 # Show create after restore `--no-data` show create sequence d.s1; Table Create Table @@ -6433,14 +6518,6 @@ 100 200 300 400 # Restore to different database than original create database d2; -SETVAL(`s1`, 1101, 0) -1101 -SETVAL(`s2`, 1201, 0) -1201 -SETVAL(`s3`, 1301, 0) -1301 -SETVAL(`s4`, 1401, 0) -1401 show create sequence d2.s1; Table Create Table s1 CREATE SEQUENCE `s1` start with 100 minvalue 100 maxvalue 1100 increment by 10 cache 1000 cycle ENGINE=MyISAM @@ -6468,9 +6545,15 @@ INSERT INTO t VALUES (1,1),(2,2),(3,3),(4,4); # Dump database 1 # Restore from database 1 to database 2 -ERROR 1100 (HY000) at line 45: Table 'seq_t_i' was not locked with LOCK TABLES -SETVAL(`seq_t_i`, 1, 0) -1 +-------------- +INSERT INTO `t` VALUES +(1,1), +(2,2), +(3,3), +(4,4) +-------------- + +ERROR 1100 (HY000) at line 46: Table 'seq_t_i' was not locked with LOCK TABLES DROP DATABASE IF EXISTS test1; DROP DATABASE IF EXISTS test2; # @@ -6589,10 +6672,8 @@ SET GLOBAL LOG_OUTPUT=DEFAULT, GLOBAL GENERAL_LOG=@save_general_log; TRUNCATE TABLE mysql.general_log; DROP DATABASE test1; -# # End of 10.3 tests # -# # MDEV-31092 mysqldump --force doesn't ignore error as it should # create function f1() returns int return 1; @@ -6603,6 +6684,7 @@ Warning 1105 Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it. update mysql.event set body ='select not_a_value' where db='test' and name='e1'; create table t1 (i int); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -6650,7 +6732,24 @@ drop function f2; drop event e1; drop table t1; -# # End of 10.4 tests # +# MDEV-33727 mariadb-dump trusts the server and does not validate the data +# +create table t1 (a int); +/*M!999999\- enable the sandbox mode */ +DROP TABLE IF EXISTS `t1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `t1` ( +`a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +ERROR at line 9: Not allowed in the sandbox mode +drop table t1; +# End of 10.5 tests +# +# MDEV-16733 mysqldump --tab and --xml options are conflicting +# mariadb-dump: --xml can't be used with --tab. +# End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/main/mysqldump.test mariadb-10.11.9/mysql-test/main/mysqldump.test --- mariadb-10.11.6/mysql-test/main/mysqldump.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/mysqldump.test 2024-08-03 07:29:57.000000000 +0000 @@ -2989,9 +2989,7 @@ DROP DATABASE test1; --remove_file $MYSQLTEST_VARDIR/tmp/dumptest1.sql ---echo # --echo # End of 10.3 tests ---echo # --echo # --echo # MDEV-31092 mysqldump --force doesn't ignore error as it should @@ -3010,13 +3008,34 @@ drop event e1; drop table t1; ---echo # --echo # End of 10.4 tests + --echo # +--echo # MDEV-33727 mariadb-dump trusts the server and does not validate the data +--echo # + +create table t1 (a int); +--exec $MYSQL_DUMP --compact --add-drop-table test > $MYSQLTEST_VARDIR/tmp/mdev33727.sql + +# first let's verify it can be loaded not only by mariadb client +--source $MYSQLTEST_VARDIR/tmp/mdev33727.sql -# -# MDEV-16733 mysqldump --tab and --xml options are conflicting -# +# and now test the mariadb client sandbox protection +--append_file $MYSQLTEST_VARDIR/tmp/mdev33727.sql +\! echo foo +EOF +--error 1 +--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/mdev33727.sql 2>&1 +--remove_file $MYSQLTEST_VARDIR/tmp/mdev33727.sql +drop table t1; + +--echo # End of 10.5 tests + +--echo # +--echo # MDEV-16733 mysqldump --tab and --xml options are conflicting +--echo # --replace_result mariadb-dump.exe mariadb-dump --error 1 --exec $MYSQL_DUMP --xml --tab=$MYSQLTEST_VARDIR/tmp 2>&1 + +--echo # End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/main/name_const_replacement.result mariadb-10.11.9/mysql-test/main/name_const_replacement.result --- mariadb-10.11.6/mysql-test/main/name_const_replacement.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/name_const_replacement.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,97 @@ +create table t1 (a int, b int); +insert into t1 values (1,1),(2,2); +explain format=json +select * from t1 where a=name_const('varname',1); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t1.a = 1" + } + } + ] + } +} +explain format=json +select * from t1 left join t1 as t2 on t1.a=name_const('varname',1) and t1.b=t2.b; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "const_condition": "1", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + }, + { + "block-nl-join": { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + }, + "buffer_type": "flat", + "buffer_size": "141", + "join_type": "BNL", + "attached_condition": "trigcond(t2.b = t1.b and trigcond(t1.a = 1))" + } + } + ] + } +} +create table t2 ( +a varchar(100) collate utf8_unicode_ci, +b int +); +insert into t2 values ('foo', 1),('bar', 1); +create procedure p1(var1 varchar(10)) +update t2 set b=b+1 where a=var1; +call p1('foo'); +call p1('foo'); +call p1('foo'); +select * from t2; +a b +foo 4 +bar 1 +create table t3 ( +a varchar(100) collate utf8_unicode_ci, +b int +); +insert into t3 values ('foo', 1),('bar', 1); +select * from t3; +a b +foo 1 +bar 1 +explain format=json +update t3 set b=b+1 where a= NAME_CONST('var1',_latin1'foo' COLLATE 'latin1_swedish_ci'); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "table": { + "update": 1, + "table_name": "t3", + "access_type": "ALL", + "rows": 2, + "attached_condition": "t3.a = convert(_latin1'foo' collate latin1_swedish_ci using utf8mb3)" + } + } +} +select * from t3 where a= NAME_CONST('var1',_latin1'foo' COLLATE 'latin1_swedish_ci'); +a b +foo 1 +drop procedure p1; +drop table t1, t2, t3; diff -Nru mariadb-10.11.6/mysql-test/main/name_const_replacement.test mariadb-10.11.9/mysql-test/main/name_const_replacement.test --- mariadb-10.11.6/mysql-test/main/name_const_replacement.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/name_const_replacement.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,42 @@ +# +# MDEV-33971 Using NAME_CONST() changes the plan +# + +create table t1 (a int, b int); +insert into t1 values (1,1),(2,2); +explain format=json +select * from t1 where a=name_const('varname',1); +explain format=json +select * from t1 left join t1 as t2 on t1.a=name_const('varname',1) and t1.b=t2.b; + + +create table t2 ( + a varchar(100) collate utf8_unicode_ci, + b int +); +insert into t2 values ('foo', 1),('bar', 1); +create procedure p1(var1 varchar(10)) + update t2 set b=b+1 where a=var1; +call p1('foo'); +call p1('foo'); +call p1('foo'); +select * from t2; + + +create table t3 ( + a varchar(100) collate utf8_unicode_ci, + b int +); +insert into t3 values ('foo', 1),('bar', 1); +select * from t3; +explain format=json +update t3 set b=b+1 where a= NAME_CONST('var1',_latin1'foo' COLLATE 'latin1_swedish_ci'); +# +# enable after fixing MDEV-27904 +# +--disable_view_protocol +select * from t3 where a= NAME_CONST('var1',_latin1'foo' COLLATE 'latin1_swedish_ci'); +--enable_view_protocol + +drop procedure p1; +drop table t1, t2, t3; diff -Nru mariadb-10.11.6/mysql-test/main/olap.result mariadb-10.11.9/mysql-test/main/olap.result --- mariadb-10.11.6/mysql-test/main/olap.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/olap.result 2024-08-03 07:29:57.000000000 +0000 @@ -787,18 +787,12 @@ # # MDEV-17830 Server crashes in Item_null_result::field_type upon SELECT with CHARSET(date) and ROLLUP # -# Note, different MariaDB versions can return different results -# in the two rows (such as "latin1" vs "binary"). This is wrong. -# Both lines should return equal values. -# The point in this test is to make sure it does not crash. -# As this is a minor issue, bad result will be fixed -# in a later version, presumably in 10.4. CREATE TABLE t (d DATE) ENGINE=MyISAM; INSERT INTO t VALUES ('2018-12-12'); SELECT CHARSET(d) AS f FROM t GROUP BY d WITH ROLLUP; f binary -latin1 +binary DROP TABLE t; # # MDEV-14041 Server crashes in String::length on queries with functions and ROLLUP diff -Nru mariadb-10.11.6/mysql-test/main/olap.test mariadb-10.11.9/mysql-test/main/olap.test --- mariadb-10.11.6/mysql-test/main/olap.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/olap.test 2024-08-03 07:29:57.000000000 +0000 @@ -436,13 +436,6 @@ --echo # MDEV-17830 Server crashes in Item_null_result::field_type upon SELECT with CHARSET(date) and ROLLUP --echo # ---echo # Note, different MariaDB versions can return different results ---echo # in the two rows (such as "latin1" vs "binary"). This is wrong. ---echo # Both lines should return equal values. ---echo # The point in this test is to make sure it does not crash. ---echo # As this is a minor issue, bad result will be fixed ---echo # in a later version, presumably in 10.4. - CREATE TABLE t (d DATE) ENGINE=MyISAM; INSERT INTO t VALUES ('2018-12-12'); SELECT CHARSET(d) AS f FROM t GROUP BY d WITH ROLLUP; diff -Nru mariadb-10.11.6/mysql-test/main/old-mode.result mariadb-10.11.9/mysql-test/main/old-mode.result --- mariadb-10.11.6/mysql-test/main/old-mode.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/old-mode.result 2024-08-03 07:29:57.000000000 +0000 @@ -257,3 +257,13 @@ DROP TABLE t1; SET @@time_zone=DEFAULT; SET TIMESTAMP=DEFAULT; +# +# MDEV-31608 - Connector/NET fails to connect since 10.10 +# +select count(*) > 0 from information_schema.collations where id IS NULL; +count(*) > 0 +1 +SET old_mode=no_null_collation_ids; +select count(*) > 0 from information_schema.collations where id IS NULL; +count(*) > 0 +0 diff -Nru mariadb-10.11.6/mysql-test/main/old-mode.test mariadb-10.11.9/mysql-test/main/old-mode.test --- mariadb-10.11.6/mysql-test/main/old-mode.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/old-mode.test 2024-08-03 07:29:57.000000000 +0000 @@ -169,3 +169,11 @@ SET @@time_zone=DEFAULT; SET TIMESTAMP=DEFAULT; + +--echo # +--echo # MDEV-31608 - Connector/NET fails to connect since 10.10 +--echo # +select count(*) > 0 from information_schema.collations where id IS NULL; +SET old_mode=no_null_collation_ids; +select count(*) > 0 from information_schema.collations where id IS NULL; + diff -Nru mariadb-10.11.6/mysql-test/main/openssl_1.result mariadb-10.11.9/mysql-test/main/openssl_1.result --- mariadb-10.11.6/mysql-test/main/openssl_1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/openssl_1.result 2024-08-03 07:29:57.000000000 +0000 @@ -77,6 +77,7 @@ SET GLOBAL event_scheduler=0; CREATE TABLE t1(a int); INSERT INTO t1 VALUES (1), (2); +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -113,6 +114,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -149,6 +151,7 @@ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; diff -Nru mariadb-10.11.6/mysql-test/main/openssl_1.test mariadb-10.11.9/mysql-test/main/openssl_1.test --- mariadb-10.11.6/mysql-test/main/openssl_1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/openssl_1.test 2024-08-03 07:29:57.000000000 +0000 @@ -68,7 +68,7 @@ # Test that we can't open connection to server if we are using # a different cacert # ---exec echo "this query should not execute;" > $MYSQLTEST_VARDIR/tmp/test.sql +--write_line "this query should not execute;" $MYSQLTEST_VARDIR/tmp/test.sql # Handle that openssl gives different error messages from YaSSL. --replace_regex /2026 TLS\/SSL error.*/2026 TLS\/SSL error: xxxx/ --error 1 diff -Nru mariadb-10.11.6/mysql-test/main/opt_trace.result mariadb-10.11.9/mysql-test/main/opt_trace.result --- mariadb-10.11.6/mysql-test/main/opt_trace.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/opt_trace.result 2024-08-03 07:29:57.000000000 +0000 @@ -1609,6 +1609,12 @@ }, { "test_if_skip_sort_order": [] + }, + { + "prepare_sum_aggregators": { + "function": "min(t1.d)", + "aggregator_type": "simple" + } } ] } @@ -1818,6 +1824,18 @@ }, { "test_if_skip_sort_order": [] + }, + { + "prepare_sum_aggregators": { + "function": "min(t1.a)", + "aggregator_type": "simple" + } + }, + { + "prepare_sum_aggregators": { + "function": "max(t1.a)", + "aggregator_type": "simple" + } } ] } @@ -10528,6 +10546,25 @@ drop table t1,t2,t3,t10,t11; set optimizer_trace=DEFAULT; # +# MDEV-29179 Condition pushdown from HAVING into WHERE is not shown in optimizer trace +# +CREATE TABLE t1 (a INT, b VARCHAR(1), KEY (a), KEY(b,a)) ENGINE=MEMORY; +INSERT INTO t1 VALUES (4,'n'),(1,'h'),(NULL,'w'); +SET optimizer_trace= 'enabled=on'; +SELECT b, a FROM t1 WHERE b <> 'p' OR a = 4 GROUP BY b, a HAVING a <= 7; +b a +h 1 +n 4 +SELECT json_detailed(json_extract(trace, '$**.steps[*].join_optimization.steps[*].condition_pushdown_from_having') ) exp1, JSON_VALID(trace) exp2 FROM information_schema.optimizer_trace; +exp1 exp2 +[ + { + "conds": "(t1.b <> 'p' or multiple equal(4, t1.a)) and t1.a <= 7", + "having": null + } +] 1 +DROP TABLE t1; +# # End of 10.4 tests # set optimizer_trace='enabled=on'; @@ -10652,9 +10689,9 @@ 1 SIMPLE t3 const PRIMARY NULL NULL NULL 1 Impossible ON condition 1 SIMPLE t2 const PRIMARY NULL NULL NULL 1 Impossible ON condition 1 SIMPLE t1 ALL NULL NULL NULL NULL 10 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.mark_join_nest_as_const')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.mark_join_nest_as_const')) as jd from information_schema.optimizer_trace; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.mark_join_nest_as_const')) +jd [ { "members": @@ -10677,9 +10714,9 @@ 1 PRIMARY t0 ALL NULL NULL NULL NULL 10 Using where 1 PRIMARY ref key0 key0 4 test.t0.a 2 FirstMatch(t0) 3 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used -select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +jd [ { "item": "t0.a in (1,2,3,4,5,6)", @@ -10720,9 +10757,9 @@ explain select * from t0 where a in (1,2,3,4,5,a+1); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 ALL NULL NULL NULL NULL 10 Using where -select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +jd [ { "item": "t0.a in (1,2,3,4,5,t0.a + 1)", @@ -10733,9 +10770,9 @@ explain select * from t0 where a in ('1','2','3','4','5','6'); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 ALL NULL NULL NULL NULL 10 Using where -select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) as jd from information_schema.optimizer_trace; -json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +jd [ { "item": "t0.a in ('1','2','3','4','5','6')", @@ -10746,6 +10783,46 @@ set in_predicate_conversion_threshold=@tmp; drop table t0; # +# MDEV-29298: INSERT ... SELECT Does not produce an optimizer trace +# +create table t1 (a int, b int); +create table t2 (a int, b int); +insert into t1 values (1,1), (2,2), (3,3), (4,4), (5,5); +set optimizer_trace=1; +insert into t2 select * from t1 where a<= b and a>4; +select QUERY, LENGTH(trace)>1 from information_schema.optimizer_trace; +QUERY LENGTH(trace)>1 +insert into t2 select * from t1 where a<= b and a>4 1 +drop table t1, t2; +# +# MDEV-34305 Redundant truncation errors/warnings with optimizer_trace enabled +# +SET @@optimizer_trace='enabled=on'; +CREATE TABLE t1 ( +a CHAR(2) NOT NULL PRIMARY KEY, +b VARCHAR(20) NOT NULL, +KEY (b) +) CHARSET=utf8mb4; +CREATE TABLE t2 ( +a CHAR(2) NOT NULL PRIMARY KEY, +b VARCHAR(20) NOT NULL, +KEY (b) +) CHARSET=utf8mb4; +INSERT INTO t1 VALUES +('AB','MySQLAB'), +('JA','Sun Microsystems'), +('MS','Microsoft'), +('IB','IBM- Inc.'), +('GO','Google Inc.'); +INSERT IGNORE INTO t2 VALUES +('AB','Sweden'), +('JA','USA'), +('MS','United States'), +('IB','North America'), +('GO','South America'); +UPDATE t1,t2 SET t1.b=UPPER(t1.b) WHERE t1.b LIKE 'Unknown%'; +DROP TABLE t1, t2; +# # End of 10.5 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/opt_trace.test mariadb-10.11.9/mysql-test/main/opt_trace.test --- mariadb-10.11.6/mysql-test/main/opt_trace.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/opt_trace.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,5 @@ --source include/not_embedded.inc --source include/have_sequence.inc -# View protocol changes some plans ---source include/no_view_protocol.inc SELECT table_name, column_name FROM information_schema.columns where table_name="OPTIMIZER_TRACE"; set optimizer_trace="enabled=on"; @@ -83,7 +81,9 @@ analyze table t2; explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b; +--disable_view_protocol select * from information_schema.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1,t2,t0; --echo # @@ -110,7 +110,9 @@ analyze table t1; EXPLAIN SELECT DISTINCT a FROM t1; +--disable_view_protocol select * from information_schema.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; --echo # @@ -120,7 +122,9 @@ INSERT INTO t1 VALUES (1,1,1,1), (2,2,2,2), (3,3,3,3), (4,4,4,4), (1,0,1,1), (3,2,3,3), (4,5,4,4); ANALYZE TABLE t1; EXPLAIN SELECT MIN(d) FROM t1 where b=2 and c=3 group by a; +--disable_view_protocol select * from information_schema.OPTIMIZER_TRACE; +--enable_view_protocol DROP TABLE t1; CREATE TABLE t1 (id INT NOT NULL, a DATE, KEY(id,a)); @@ -134,9 +138,13 @@ (4,'2001-01-03'),(4,'2001-01-04'); set optimizer_trace='enabled=on'; EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a>=20010104e0 GROUP BY id; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol EXPLAIN SELECT * FROM t1 WHERE a = 20010104e0 GROUP BY id; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; --echo # @@ -165,7 +173,9 @@ analyze table t1; set optimizer_trace='enabled=on'; explain select * from t1 where a=1 and b=2 order by c limit 1; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1,ten,one_k; --echo # @@ -191,15 +201,21 @@ --echo # table t2 should be eliminated explain select t1.a from t1 left join t2 on t1.a=t2.a; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol --echo # no tables should be eliminated explain select * from t1 left join t2 on t2.a=t1.a; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol --echo # multiple tables are eliminated explain select t1.a from t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and t3.a=t1.a; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t0, t1, t2, t3; --echo # @@ -224,7 +240,9 @@ set optimizer_trace='enabled=on'; explain extended select * from t1 where a in (select pk from t10); +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t0,t1,t11,t10,t12,t2; --echo # @@ -250,7 +268,9 @@ set @@use_stat_tables= PREFERABLY; set optimizer_trace='enabled=on'; explain select * from t1 where pk = 2 and a=5 and b=1; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol set @@optimizer_use_condition_selectivity=@save_optimizer_use_condition_selectivity; set @@use_stat_tables= @save_use_stat_tables; drop table t0,t1; @@ -329,7 +349,9 @@ set optimizer_trace=1; explain delete from t0 where t0.a<3; +--disable_view_protocol select * from information_schema.optimizer_trace; +--enable_view_protocol drop table ten,t0; set optimizer_trace='enabled=off'; @@ -346,7 +368,9 @@ create table t1 like t0; insert into t1 select * from t0; explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3; +--disable_view_protocol select * from information_schema.optimizer_trace; +--enable_view_protocol drop table ten,t0,t1; set optimizer_trace='enabled=off'; @@ -358,7 +382,9 @@ create table t1 (a int); insert into t1 values (1),(2),(3); explain select * from (select rand() from t1)q; +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; set optimizer_trace='enabled=off'; @@ -373,6 +399,7 @@ insert into t2 values (1),(2),(3),(1),(2),(3),(1),(2),(3); set @save_optimizer_switch= @@optimizer_switch; explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_inner_2); +--disable_view_protocol select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; --echo # with Firstmatch, mostly for tracing fix_semijoin_strategies_for_picked_join_order @@ -385,6 +412,7 @@ explain select * from t1 t_outer_1,t2 t_outer_2 where t_outer_1.a in (select t_inner_1.a from t2 t_inner_2, t1 t_inner_1) and t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4); select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol set @@optimizer_switch= @save_optimizer_switch; drop table t1,t2; @@ -413,11 +441,14 @@ insert into t1 select a,a from one_k; set optimizer_trace='enabled=on'; +#Enable after fix MDEV-32034 +--disable_view_protocol explain select * from t1 force index (a_b) where a=2 and b=4; select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; explain select * from t1 where a >= 900 and b between 10 and 20; select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t0,t1; @@ -426,7 +457,10 @@ insert into t1 select date_add(now(), interval a day), date_add(now(), interval (a+7) day), 'data' from one_k; --enable_warnings explain select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1,one_k; create table ten(a int); @@ -441,7 +475,10 @@ insert into t1 select a,a, a,a from ten; explain select * from t1 force index(a_b_c) where a between 1 and 4 and b < 50; +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table ten,t1; --echo # Ported test from MYSQL for ranges involving Binary column @@ -450,11 +487,14 @@ INSERT INTO t1 VALUES (1, x'D95B94336A9946A39CF5B58CFE772D8C'); INSERT INTO t1 VALUES (2, NULL); +#Enable after fix MDEV-32034 +--disable_view_protocol EXPLAIN SELECT * FROM t1 WHERE b IN (0xD95B94336A9946A39CF5B58CFE772D8C); select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN SELECT * FROM t1 WHERE b IS NULL; select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; @@ -467,6 +507,8 @@ INSERT INTO t1 VALUES (2, NULL); set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ALTER TABLE t1 modify column b BINARY(10) AFTER i; @@ -510,6 +552,7 @@ --enable_warnings explain format=json select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1, t0, one_k; --echo # @@ -541,13 +584,19 @@ --echo # but for joins using condition selectivity it is not as trivial. So, --echo # now we are printing it) explain select * from t0 A, one_k B where A.a<5 and B.a<800; +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol set join_cache_level=@tmp_jcl; --echo # This shows post-join selectivity explain select * from t0 A, one_k B where A.a=B.b and B.a<800; +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t0, one_k; --echo # @@ -559,7 +608,10 @@ EXPLAIN SELECT * FROM t1 WHERE a= REPEAT('a', 0); SELECT * FROM t1 WHERE a= REPEAT('a', 0); +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol DROP TABLE t1; --echo # @@ -577,7 +629,10 @@ explain select * from t3 where (a,a) in (select t1.a, t2.a from t1, t2 where t1.b=t2.b); +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.semijoin_table_pullout')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1,t2,t3; @@ -589,7 +644,10 @@ insert into t1 values (1,1),(1,5),(5,1),(5,5); set optimizer_trace=1; select * from t1 force index(kp1) where (kp1=2 and kp2 >=4); +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; --echo # @@ -603,7 +661,10 @@ SET OPTIMIZER_TRACE=1; EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a ORDER BY t2.b; +#Enable after fix MDEV-32034 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol DROP TABLE t1,t2; --echo # @@ -615,12 +676,15 @@ INSERT INTO t1 SELECT seq, seq from seq_1_to_100; SET optimizer_trace=1; ANALYZE TABLE t1 PERSISTENT FOR ALL; +#Enable after fix MDEV-32034 +--disable_view_protocol EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5; select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN EXTENDED SELECT * from t1 WHERE a != 5; select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN EXTENDED SELECT * from t1 WHERE b >= 10 and b < 25; select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; --echo # @@ -631,7 +695,10 @@ CREATE TABLE t1( a INT, b INT, PRIMARY KEY( a ) ); SELECT sum(b), row_number() OVER (order by b) FROM t1 WHERE a = 101; UPDATE t1 SET b=10 WHERE a=1; +#Enable after fix MDEV-32034 +--disable_view_protocol SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol DROP TABLE t1; set optimizer_trace='enabled=off'; @@ -692,10 +759,13 @@ c5 in (1,2,3,4,5,6,7,8,9,10) and c6 in (1,2,3,4); +#Enable after fix MDEV-32034 +--disable_view_protocol select json_detailed(json_extract(trace, '$**.setup_range_conditions')) from information_schema.optimizer_trace; +--enable_view_protocol drop table t1; @@ -709,7 +779,9 @@ CREATE VIEW v AS SELECT 1 AS c UNION SELECT 2 AS c; INSERT INTO t VALUES (0,4),(5,6); UPDATE t, v SET t.b = t.a, t.a = v.c WHERE v.c < t.a; +--disable_view_protocol SELECT * FROM information_schema.optimizer_trace; +--enable_view_protocol SELECT * FROM t; @@ -773,11 +845,6 @@ from t10 left join t11 on t11.col1=t10.col1 group by grp_id) T on T.grp_id=t1.b; -# Not sure how MDEV-27871 is related but this test uses this reason -# all over the place: -#enable after fix MDEV-27871 ---disable_view_protocol - # Enable after fix MDEV-31408 # On the first creation of the view from information_schema.optimizer_trace # everything is fine, but on the second creation of the view is @@ -804,6 +871,19 @@ set optimizer_trace=DEFAULT; --echo # +--echo # MDEV-29179 Condition pushdown from HAVING into WHERE is not shown in optimizer trace +--echo # + +#Enable after fix MDEV-32034 +--disable_view_protocol +CREATE TABLE t1 (a INT, b VARCHAR(1), KEY (a), KEY(b,a)) ENGINE=MEMORY; +INSERT INTO t1 VALUES (4,'n'),(1,'h'),(NULL,'w'); +SET optimizer_trace= 'enabled=on'; +SELECT b, a FROM t1 WHERE b <> 'p' OR a = 4 GROUP BY b, a HAVING a <= 7; SELECT json_detailed(json_extract(trace, '$**.steps[*].join_optimization.steps[*].condition_pushdown_from_having') ) exp1, JSON_VALID(trace) exp2 FROM information_schema.optimizer_trace; +DROP TABLE t1; +--enable_view_protocol + +--echo # --echo # End of 10.4 tests --echo # @@ -836,11 +916,11 @@ explain select * from t1 left join (t2 join t3 on t3.pk=1000) on t2.a=t1.a and t2.pk is null; -#enable after fix MDEV-27871 +#Enable after fix MDEV-32034 --disable_view_protocol -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.mark_join_nest_as_const')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.mark_join_nest_as_const')) as jd from information_schema.optimizer_trace; ---enable_view_protocol +--disable_view_protocol drop table t0, t1, t2, t3; @@ -848,8 +928,6 @@ --echo # MDEV-23767: IN-to-subquery conversion is not visible in optimizer trace --echo # -#enable after fix MDEV-27871 ---disable_view_protocol create table t0 (a int); INSERT INTO t0 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); @@ -858,22 +936,82 @@ explain select * from t0 where a in (1,2,3,4,5,6); -select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) as jd from information_schema.optimizer_trace; +--enable_view_protocol explain select * from t0 where a in (1,2,3,4,5,a+1); -select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) as jd from information_schema.optimizer_trace; +--enable_view_protocol explain select * from t0 where a in ('1','2','3','4','5','6'); -select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) + +#Enable after fix MDEV-32034 +--disable_view_protocol +select json_detailed(json_extract(trace, '$**.in_to_subquery_conversion')) as jd from information_schema.optimizer_trace; +--enable_view_protocol set in_predicate_conversion_threshold=@tmp; drop table t0; + +--echo # +--echo # MDEV-29298: INSERT ... SELECT Does not produce an optimizer trace +--echo # +create table t1 (a int, b int); +create table t2 (a int, b int); +insert into t1 values (1,1), (2,2), (3,3), (4,4), (5,5); +set optimizer_trace=1; + +insert into t2 select * from t1 where a<= b and a>4; + +--disable_view_protocol +select QUERY, LENGTH(trace)>1 from information_schema.optimizer_trace; --enable_view_protocol +drop table t1, t2; + +--echo # +--echo # MDEV-34305 Redundant truncation errors/warnings with optimizer_trace enabled +--echo # + +SET @@optimizer_trace='enabled=on'; + +CREATE TABLE t1 ( + a CHAR(2) NOT NULL PRIMARY KEY, + b VARCHAR(20) NOT NULL, + KEY (b) +) CHARSET=utf8mb4; + +CREATE TABLE t2 ( + a CHAR(2) NOT NULL PRIMARY KEY, + b VARCHAR(20) NOT NULL, + KEY (b) +) CHARSET=utf8mb4; + +INSERT INTO t1 VALUES +('AB','MySQLAB'), +('JA','Sun Microsystems'), +('MS','Microsoft'), +('IB','IBM- Inc.'), +('GO','Google Inc.'); + +INSERT IGNORE INTO t2 VALUES +('AB','Sweden'), +('JA','USA'), +('MS','United States'), +('IB','North America'), +('GO','South America'); + +UPDATE t1,t2 SET t1.b=UPPER(t1.b) WHERE t1.b LIKE 'Unknown%'; +DROP TABLE t1, t2; + --echo # --echo # End of 10.5 tests --echo # @@ -926,10 +1064,13 @@ group by b,b having a+b < 10; +#Enable after fix MDEV-32034 +--disable_view_protocol select json_detailed(json_extract(trace, '$**.substitute_best_equal')) from information_schema.optimizer_trace; +--enable_view_protocol --echo # Check ON expression explain @@ -939,10 +1080,13 @@ where t1.b > 5555; +#Enable after fix MDEV-32034 +--disable_view_protocol select json_detailed(json_extract(trace, '$**.substitute_best_equal')) from information_schema.optimizer_trace; +--enable_view_protocol --echo # Check nested ON expression explain @@ -952,6 +1096,7 @@ where t1.b > 5555; +#Check after fix MDEV-32034 --disable_view_protocol select json_detailed(json_extract(trace, '$**.substitute_best_equal')) @@ -961,10 +1106,13 @@ --echo # The next query is test for: --echo # MDEV-23646: Optimizer trace: optimize_cond() should show ON expression processing +#Enable after fix MDEV-32034 +--disable_view_protocol select json_detailed(json_extract(trace, '$**.condition_processing')) from information_schema.optimizer_trace; +--enable_view_protocol drop table t1,t2,t3; @@ -1004,6 +1152,7 @@ # Just show that choose_best_splitting function has coverage in the # optimizer trace and re-optmization of child select inside it is distinct # from the rest of join optimization. +#Check after fix MDEV-32034 --disable_view_protocol select json_detailed(json_extract(trace, '$**.choose_best_splitting')) @@ -1027,8 +1176,12 @@ JSON_TABLE(f1, "$" COLUMNS (jf FOR ORDINALITY)) AS tbl); --enable_view_protocol +#Enable after fix MDEV-32034 +--disable_view_protocol select json_detailed(json_extract(trace, '$**.best_join_order')) from information_schema.OPTIMIZER_TRACE; +--enable_view_protocol + DROP TABLE t1; --echo # diff -Nru mariadb-10.11.6/mysql-test/main/opt_trace_index_merge.test mariadb-10.11.9/mysql-test/main/opt_trace_index_merge.test --- mariadb-10.11.6/mysql-test/main/opt_trace_index_merge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/opt_trace_index_merge.test 2024-08-03 07:29:57.000000000 +0000 @@ -15,7 +15,9 @@ --echo This should use union: explain select * from t1 where a=1 or b=1; +--disable_view_protocol select * from information_schema.OPTIMIZER_TRACE; +--enable_view_protocol drop table t0,t1; set optimizer_trace="enabled=off"; set @@optimizer_switch= @tmp_opt_switch; diff -Nru mariadb-10.11.6/mysql-test/main/opt_trace_index_merge_innodb.test mariadb-10.11.9/mysql-test/main/opt_trace_index_merge_innodb.test --- mariadb-10.11.6/mysql-test/main/opt_trace_index_merge_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/opt_trace_index_merge_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -33,7 +33,9 @@ set @tmp_index_merge_ror_cpk=@@optimizer_switch; set optimizer_switch='extended_keys=off'; explain select * from t1 where pk1 != 0 and key1 = 1; +--disable_view_protocol select * from information_schema.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; set @@optimizer_switch= @tmp_index_merge_ror_cpk; diff -Nru mariadb-10.11.6/mysql-test/main/opt_trace_ucs2.test mariadb-10.11.9/mysql-test/main/opt_trace_ucs2.test --- mariadb-10.11.6/mysql-test/main/opt_trace_ucs2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/opt_trace_ucs2.test 2024-08-03 07:29:57.000000000 +0000 @@ -6,5 +6,8 @@ insert into t1 values ('a', 'a'); set optimizer_trace=1; explain format=json select * from t1 force index(col1) where col1 >='a'; +# Enable after fix MDEV-31408 +--disable_view_protocol select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +--enable_view_protocol drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/order_by.result mariadb-10.11.9/mysql-test/main/order_by.result --- mariadb-10.11.6/mysql-test/main/order_by.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/order_by.result 2024-08-03 07:29:57.000000000 +0000 @@ -1531,9 +1531,9 @@ INSERT INTO t2 (a,b) VALUES (1,2), (2,3); INSERT INTO t3 (c) VALUES (1), (2); SELECT -(SELECT t1.a FROM t1, t2 WHERE t1.a = t2.b AND t2.a = t3.c ORDER BY t1.a) +(SELECT t1.a FROM t1, t2 WHERE t1.a = t2.b AND t2.a = t3.c ORDER BY t1.a) as exp FROM t3; -(SELECT t1.a FROM t1, t2 WHERE t1.a = t2.b AND t2.a = t3.c ORDER BY t1.a) +exp 2 NULL DROP TABLE t1, t2, t3; @@ -3638,7 +3638,7 @@ t2.key1 = t1.a and t2.key1 IS NOT NULL ORDER BY t2.key2 ASC -LIMIT 1) +LIMIT 1) as exp from t1; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 10 @@ -3650,15 +3650,9 @@ t2.key1 = t1.a and t2.key1 IS NOT NULL ORDER BY t2.key2 ASC -LIMIT 1) +LIMIT 1) as exp from t1; -(SELECT concat(id, '-', key1, '-', col1) -FROM t2 -WHERE -t2.key1 = t1.a and t2.key1 IS NOT NULL -ORDER BY -t2.key2 ASC -LIMIT 1) +exp 900-0-123456 901-1-123456 902-2-123456 @@ -3733,6 +3727,126 @@ 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 2 DEPENDENT SUBQUERY t1 eq_ref PRIMARY PRIMARY 4 test.t2.b 1 Using where DROP TABLE t1,t2; +# +# MDEV-29681 Server crashes when optimizing SQL with ORDER BY +# +CREATE TABLE t1 (b INT); +CREATE TABLE t2 (a INT, c INT); +# First test empty tables +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a+1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY system NULL NULL NULL NULL 0 0.00 Const row not found +2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL no matching row in const table +Warnings: +Note 1003 /* select#1 */ select NULL AS `b`,NULL AS `a`,NULL AS `c` from ((/* select#2 */ select NULL AS `b`,NULL AS `a`,NULL AS `c` from `test`.`t1` join `test`.`t2` where 0 limit 3)) `__2` order by NULL + 1 +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a=2; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY system NULL NULL NULL NULL 0 0.00 Const row not found +2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL no matching row in const table +Warnings: +Note 1003 /* select#1 */ select NULL AS `b`,NULL AS `a`,NULL AS `c` from ((/* select#2 */ select NULL AS `b`,NULL AS `a`,NULL AS `c` from `test`.`t1` join `test`.`t2` where 0 limit 3)) `__2` order by NULL = 2 +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) +ORDER BY a+1, a-b DESC, c<>a; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY system NULL NULL NULL NULL 0 0.00 Const row not found +2 DERIVED NULL NULL NULL NULL NULL NULL NULL NULL no matching row in const table +Warnings: +Note 1003 /* select#1 */ select NULL AS `b`,NULL AS `a`,NULL AS `c` from ((/* select#2 */ select NULL AS `b`,NULL AS `a`,NULL AS `c` from `test`.`t1` join `test`.`t2` where 0 limit 3)) `__2` order by NULL + 1,NULL - NULL desc,NULL <> NULL +# Insert some data +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t2 VALUES (1,1),(2,2),(3,3),(4,4); +(SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a=b, a-10 DESC, b+a, c+a+a+b; +b a c +1 1 1 +2 2 2 +3 3 3 +(SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a=2; +b a c +1 1 1 +2 2 2 +3 3 3 +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) +ORDER BY a=b, a-10, b+a, c+a+a+b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 Using filesort +2 DERIVED t1 ALL NULL NULL NULL NULL 4 100.00 +2 DERIVED t2 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 /* select#1 */ select `__2`.`b` AS `b`,`__2`.`a` AS `a`,`__2`.`c` AS `c` from ((/* select#2 */ select `test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`b` limit 3)) `__2` order by `__2`.`a` = `__2`.`b`,`__2`.`a` - 10,`__2`.`b` + `__2`.`a`,`__2`.`c` + `__2`.`a` + `__2`.`a` + `__2`.`b` +# When there is no LIMIT clause the derived table must be merged +(SELECT * FROM t1 JOIN t2 ON a=b) ORDER BY a+16, b+a, c<>b; +b a c +1 1 1 +2 2 2 +3 3 3 +4 4 4 +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b) ORDER BY a+16 DESC, b+a, c<>b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 4 100.00 Using temporary; Using filesort +1 SIMPLE t2 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join) +Warnings: +Note 1003 (select `test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`b` order by `test`.`t2`.`a` + 16 desc,`test`.`t1`.`b` + `test`.`t2`.`a`,`test`.`t2`.`c` <> `test`.`t1`.`b`) +# Test UNIONs: +(SELECT * FROM t1 JOIN t2 ON a=b UNION +SELECT * FROM t1 JOIN t2 ON a!=b +LIMIT 3) +ORDER BY a+16, b+a, c<>b; +b a c +1 1 1 +2 2 2 +3 3 3 +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b UNION +SELECT * FROM t1 JOIN t2 ON a!=b +LIMIT 3) +ORDER BY a+16, b+a, c<>b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 32 100.00 Using filesort +2 DERIVED t1 ALL NULL NULL NULL NULL 4 100.00 +2 DERIVED t2 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join) +3 UNION t1 ALL NULL NULL NULL NULL 4 100.00 +3 UNION t2 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join) +NULL UNION RESULT ALL NULL NULL NULL NULL NULL NULL +Warnings: +Note 1003 /* select#1 */ select `__3`.`b` AS `b`,`__3`.`a` AS `a`,`__3`.`c` AS `c` from (/* select#2 */ select `test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`b` union /* select#3 */ select `test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` <> `test`.`t1`.`b` limit 3) `__3` order by `__3`.`a` + 16,`__3`.`b` + `__3`.`a`,`__3`.`c` <> `__3`.`b` +(SELECT * FROM t1 JOIN t2 ON a=b UNION +SELECT NULL, NULL, NULL +LIMIT 3) +ORDER BY b-a-c; +b a c +1 1 1 +2 2 2 +3 3 3 +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b UNION +SELECT NULL, NULL, NULL +LIMIT 3) +ORDER BY b-a-c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 16 100.00 Using filesort +2 DERIVED t1 ALL NULL NULL NULL NULL 4 100.00 +2 DERIVED t2 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join) +3 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL NULL +Warnings: +Note 1003 /* select#1 */ select `__3`.`b` AS `b`,`__3`.`a` AS `a`,`__3`.`c` AS `c` from (/* select#2 */ select `test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`b` union /* select#3 */ select NULL AS `NULL`,NULL AS `NULL`,NULL AS `NULL` limit 3) `__3` order by `__3`.`b` - `__3`.`a` - `__3`.`c` +(SELECT * FROM t1 JOIN t2 ON a=b UNION +SELECT NULL, NULL, NULL +ORDER BY a LIMIT 3) +ORDER BY b-a-c LIMIT 1; +b a c +NULL NULL NULL +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b UNION +SELECT NULL, NULL, NULL +ORDER BY a LIMIT 3) +ORDER BY b-a-c LIMIT 1; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 16 100.00 Using filesort +2 DERIVED t1 ALL NULL NULL NULL NULL 4 100.00 +2 DERIVED t2 ALL NULL NULL NULL NULL 4 100.00 Using where; Using join buffer (flat, BNL join) +3 UNION NULL NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNION RESULT ALL NULL NULL NULL NULL NULL NULL Using filesort +Warnings: +Note 1003 /* select#1 */ select `__3`.`b` AS `b`,`__3`.`a` AS `a`,`__3`.`c` AS `c` from (/* select#2 */ select `test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`c` AS `c` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`b` union /* select#3 */ select NULL AS `NULL`,NULL AS `NULL`,NULL AS `NULL` order by `a` limit 3) `__3` order by `__3`.`b` - `__3`.`a` - `__3`.`c` limit 1 +DROP TABLE t1, t2; # End of 10.4 tests # # MDEV-21655: Server crashes in my_qsort2 / Filesort_buffer::sort_buffer diff -Nru mariadb-10.11.6/mysql-test/main/order_by.test mariadb-10.11.9/mysql-test/main/order_by.test --- mariadb-10.11.6/mysql-test/main/order_by.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/order_by.test 2024-08-03 07:29:57.000000000 +0000 @@ -3,11 +3,6 @@ # Testing ORDER BY # -# Tests will be skipped for the view protocol because the view protocol creates -# an additional util connection and other statistics data -# Check after fix MDEV-27871, possible this include can be removed ---source include/no_view_protocol.inc - call mtr.add_suppression("Sort aborted.*"); call mtr.add_suppression("Out of sort memory; increase server sort buffer size"); --source include/have_sequence.inc @@ -823,6 +818,7 @@ EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR GROUP BY (a, ab) GROUP BY a; +--disable_view_protocol --disable_query_log --let $q = `show status like 'Created_tmp_tables';` eval set @tmp_tables_before = @@ -841,6 +837,7 @@ --enable_query_log SELECT @tmp_tables_after = @tmp_tables_before ; +--enable_view_protocol EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR ORDER BY (a, ab) ORDER BY a; @@ -887,7 +884,7 @@ INSERT INTO t3 (c) VALUES (1), (2); SELECT - (SELECT t1.a FROM t1, t2 WHERE t1.a = t2.b AND t2.a = t3.c ORDER BY t1.a) + (SELECT t1.a FROM t1, t2 WHERE t1.a = t2.b AND t2.a = t3.c ORDER BY t1.a) as exp FROM t3; DROP TABLE t1, t2, t3; @@ -1457,6 +1454,7 @@ SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 10 OFFSET 10; SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 0 OFFSET 10; +--disable_view_protocol --disable_ps2_protocol ################ ## Test with SQL_CALC_FOUND_ROWS @@ -1505,6 +1503,7 @@ ORDER BY tmp.f1, f0 LIMIT 30 OFFSET 30; SELECT FOUND_ROWS(); --enable_ps2_protocol +--enable_view_protocol ################ ## Test views @@ -1878,6 +1877,7 @@ analyze table t1; --enable_result_log +--disable_view_protocol --disable_ps2_protocol explain select b, count(*) num_cnt from t1 @@ -1899,6 +1899,7 @@ --enable_result_log show status like '%Handler_read%'; --enable_ps2_protocol +--enable_view_protocol drop table t0, t1; @@ -1997,9 +1998,11 @@ WHERE t3a.f3 < f1 OR t3b.f3 != f1 ) ORDER BY field; +--disable_view_protocol eval $q1; eval $q2; eval EXPLAIN EXTENDED $q2; +--enable_view_protocol DROP TABLE t1,t2,t3; @@ -2394,7 +2397,7 @@ t2.key1 = t1.a and t2.key1 IS NOT NULL ORDER BY t2.key2 ASC - LIMIT 1) + LIMIT 1) as exp from t1; --echo # here type should show ref not index @@ -2462,6 +2465,65 @@ DROP TABLE t1,t2; +--echo # +--echo # MDEV-29681 Server crashes when optimizing SQL with ORDER BY +--echo # +CREATE TABLE t1 (b INT); +CREATE TABLE t2 (a INT, c INT); + +--echo # First test empty tables +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a+1; +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a=2; +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) + ORDER BY a+1, a-b DESC, c<>a; + +--echo # Insert some data +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t2 VALUES (1,1),(2,2),(3,3),(4,4); + +--sorted_result +(SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a=b, a-10 DESC, b+a, c+a+a+b; +--sorted_result +(SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) ORDER BY a=2; + +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b LIMIT 3) + ORDER BY a=b, a-10, b+a, c+a+a+b; + +--echo # When there is no LIMIT clause the derived table must be merged +--sorted_result +(SELECT * FROM t1 JOIN t2 ON a=b) ORDER BY a+16, b+a, c<>b; +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b) ORDER BY a+16 DESC, b+a, c<>b; + +--echo # Test UNIONs: +--sorted_result +(SELECT * FROM t1 JOIN t2 ON a=b UNION + SELECT * FROM t1 JOIN t2 ON a!=b + LIMIT 3) + ORDER BY a+16, b+a, c<>b; +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b UNION + SELECT * FROM t1 JOIN t2 ON a!=b + LIMIT 3) + ORDER BY a+16, b+a, c<>b; +--sorted_result +(SELECT * FROM t1 JOIN t2 ON a=b UNION + SELECT NULL, NULL, NULL + LIMIT 3) + ORDER BY b-a-c; +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b UNION + SELECT NULL, NULL, NULL + LIMIT 3) + ORDER BY b-a-c; +--sorted_result +(SELECT * FROM t1 JOIN t2 ON a=b UNION + SELECT NULL, NULL, NULL + ORDER BY a LIMIT 3) + ORDER BY b-a-c LIMIT 1; +EXPLAIN EXTENDED (SELECT * FROM t1 JOIN t2 ON a=b UNION + SELECT NULL, NULL, NULL + ORDER BY a LIMIT 3) + ORDER BY b-a-c LIMIT 1; +DROP TABLE t1, t2; + --echo # End of 10.4 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/order_by_pack_big.result mariadb-10.11.9/mysql-test/main/order_by_pack_big.result --- mariadb-10.11.6/mysql-test/main/order_by_pack_big.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/order_by_pack_big.result 2024-08-03 07:29:57.000000000 +0000 @@ -84,7 +84,7 @@ set sort_buffer_size=262144*10; analyze format=json select id DIV 100 as x, MD5(group_concat(substring(names,1,3), substring(address,1,3) -order by id)) +order by id)) as md5 FROM t3 GROUP BY x; ANALYZE @@ -129,11 +129,10 @@ flush status; select id DIV 100 as x, MD5(group_concat(substring(names,1,3), substring(address,1,3) -order by id)) +order by id)) as md5 FROM t3 GROUP BY x; -x MD5(group_concat(substring(names,1,3), substring(address,1,3) -order by id)) +x md5 0 3d24cb0237caf81aa74a2dddf367ac23 1 618f9b8b6cefaa268dcb5477eece5e90 2 fbfe93cc7713f852852f66e578d999aa @@ -249,7 +248,7 @@ set sort_buffer_size=32768; analyze format=json select id DIV 100 as x, MD5(group_concat(substring(names,1,3), substring(address,1,3) -order by id)) +order by id)) as md5 FROM t3 GROUP BY x; ANALYZE @@ -295,11 +294,10 @@ flush status; select id DIV 100 as x, MD5(group_concat(substring(names,1,3), substring(address,1,3) -order by id)) +order by id)) as md5 FROM t3 GROUP BY x; -x MD5(group_concat(substring(names,1,3), substring(address,1,3) -order by id)) +x md5 0 3d24cb0237caf81aa74a2dddf367ac23 1 618f9b8b6cefaa268dcb5477eece5e90 2 fbfe93cc7713f852852f66e578d999aa diff -Nru mariadb-10.11.6/mysql-test/main/order_by_pack_big.test mariadb-10.11.9/mysql-test/main/order_by_pack_big.test --- mariadb-10.11.6/mysql-test/main/order_by_pack_big.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/order_by_pack_big.test 2024-08-03 07:29:57.000000000 +0000 @@ -100,7 +100,7 @@ let $query= select id DIV 100 as x, MD5(group_concat(substring(names,1,3), substring(address,1,3) - order by id)) + order by id)) as md5 FROM t3 GROUP BY x; @@ -112,12 +112,9 @@ --source include/analyze-format.inc eval analyze format=json $query; flush status; -# Enable view-protocol after fix MDEV-27871 ---disable_view_protocol --disable_ps2_protocol eval $query; --enable_ps2_protocol ---enable_view_protocol show status like '%sort%'; set sort_buffer_size=default; @@ -129,12 +126,9 @@ --source include/analyze-format.inc eval analyze format=json $query; flush status; -# Enable view-protocol after fix MDEV-27871 ---disable_view_protocol --disable_ps2_protocol eval $query; --enable_ps2_protocol ---enable_view_protocol show status like '%sort%'; set sort_buffer_size=default; diff -Nru mariadb-10.11.6/mysql-test/main/parser.result mariadb-10.11.9/mysql-test/main/parser.result --- mariadb-10.11.6/mysql-test/main/parser.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/parser.result 2024-08-03 07:29:57.000000000 +0000 @@ -556,8 +556,8 @@ SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE; STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE 22:10:00 -SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL (INTERVAL(1,2,3) + 1) MINUTE; -STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL (INTERVAL(1,2,3) + 1) MINUTE +SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL (INTERVAL(1,2,3) + 1) MINUTE as time; +time 22:01:00 SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; "1997-12-31 23:59:59" + INTERVAL 1 SECOND @@ -1087,35 +1087,35 @@ # Subquery, one row, ROLLUP CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10); -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL); -(SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) as exp; +exp NULL -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL); -(SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) as exp; +exp 10 -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -(SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +exp 10 -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -(SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +exp 10 -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -(SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +exp 10 -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) FROM t1; -(SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) as exp FROM t1; +exp NULL -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) FROM t1; -(SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) as exp FROM t1; +exp 10 -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -(SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +exp 10 -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -(SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +exp 10 -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -(SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +exp 10 SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP); ERROR 21000: Subquery returns more than 1 row @@ -1145,27 +1145,27 @@ # Subquery, multiple rows, ROLLUP CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -(SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +exp 10 -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -(SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +exp 10 -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -(SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +exp 10 -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -(SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +exp 10 10 10 -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -(SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +exp 10 10 10 -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -(SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +exp 10 10 10 @@ -1507,7 +1507,7 @@ SELECT history FROM t1 SELECT history 'alias' FROM t1 SELECT history() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.history does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT history.history() Error 1630 FUNCTION history.history does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT history DATE FROM t1 @@ -1530,7 +1530,7 @@ SELECT next FROM t1 SELECT next 'alias' FROM t1 SELECT next() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.next does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT next.next() Error 1630 FUNCTION next.next does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT next DATE FROM t1 @@ -1577,7 +1577,7 @@ SELECT previous FROM t1 SELECT previous 'alias' FROM t1 SELECT previous() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.previous does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT previous.previous() Error 1630 FUNCTION previous.previous does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT previous DATE FROM t1 @@ -1601,7 +1601,7 @@ SELECT system FROM t1 SELECT system 'alias' FROM t1 SELECT system() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.system does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system.system() Error 1630 FUNCTION system.system does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system DATE FROM t1 @@ -1624,7 +1624,7 @@ SELECT system_time FROM t1 SELECT system_time 'alias' FROM t1 SELECT system_time() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.system_time does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system_time.system_time() Error 1630 FUNCTION system_time.system_time does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system_time DATE FROM t1 @@ -1695,7 +1695,7 @@ SELECT transaction FROM t1 SELECT transaction 'alias' FROM t1 SELECT transaction() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.transaction does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT transaction.transaction() Error 1630 FUNCTION transaction.transaction does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT transaction DATE FROM t1 @@ -1741,7 +1741,7 @@ SELECT versioning FROM t1 SELECT versioning 'alias' FROM t1 SELECT versioning() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.versioning does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT versioning.versioning() Error 1630 FUNCTION versioning.versioning does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT versioning DATE FROM t1 @@ -1764,7 +1764,7 @@ SELECT without FROM t1 SELECT without 'alias' FROM t1 SELECT without() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.without does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT without.without() Error 1630 FUNCTION without.without does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT without DATE FROM t1 @@ -1819,12 +1819,8 @@ (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT 1 -))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))); -(SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT -(SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT -(SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT -(SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT -(SELECT +))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) as exp; +exp 1 # # MDEV-17693 Shift/reduce conflicts for NAMES,ROLE,PASSWORD in the option_value_no_option_type grammar diff -Nru mariadb-10.11.6/mysql-test/main/parser.test mariadb-10.11.9/mysql-test/main/parser.test --- mariadb-10.11.6/mysql-test/main/parser.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/parser.test 2024-08-03 07:29:57.000000000 +0000 @@ -694,10 +694,7 @@ SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL 10 MINUTE; -#enable view protocol after fix MDEV-27871 ---disable_view_protocol -SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL (INTERVAL(1,2,3) + 1) MINUTE; ---enable_view_protocol +SELECT STR_TO_DATE('10:00 PM', '%h:%i %p') + INTERVAL (INTERVAL(1,2,3) + 1) MINUTE as time; SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; SELECT 1 + INTERVAL(1,0,1,2) + 1; @@ -1191,22 +1188,16 @@ CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10); -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL); -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL); -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -#enable view protocol after fix MDEV-27871 ---disable_view_protocol -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); ---enable_view_protocol -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) FROM t1; -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) FROM t1; -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -#enable view protocol after fix MDEV-27871 ---disable_view_protocol -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; ---enable_view_protocol +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) as exp; +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) as exp; +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NULL) as exp FROM t1; +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP HAVING a IS NOT NULL) as exp FROM t1; +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; --error ER_SUBQUERY_NO_1_ROW SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP); @@ -1240,18 +1231,12 @@ CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); -#enable view protocol after fix MDEV-27871 ---disable_view_protocol -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1); ---enable_view_protocol -SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; -#enable view protocol after fix MDEV-27871 ---disable_view_protocol -SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) FROM t1; ---enable_view_protocol +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp; +SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +SELECT (SELECT GROUP_CONCAT(a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; +SELECT (SELECT GROUP_CONCAT(a ORDER BY a) FROM t1 GROUP BY a WITH ROLLUP LIMIT 1) as exp FROM t1; --error ER_SUBQUERY_NO_1_ROW SELECT (SELECT * FROM t1 GROUP BY a WITH ROLLUP); @@ -1573,8 +1558,6 @@ --echo # MDEV-16697: Fix difference between 32bit/windows and 64bit --echo # systems in allowed select nest level --echo # -#enable view protocol after fix MDEV-27871 ---disable_view_protocol SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT @@ -1584,8 +1567,7 @@ (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT (SELECT 1 -))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))); ---enable_view_protocol +))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) as exp; --echo # --echo # MDEV-17693 Shift/reduce conflicts for NAMES,ROLE,PASSWORD in the option_value_no_option_type grammar diff -Nru mariadb-10.11.6/mysql-test/main/partition.result mariadb-10.11.9/mysql-test/main/partition.result --- mariadb-10.11.6/mysql-test/main/partition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition.result 2024-08-03 07:29:57.000000000 +0000 @@ -2063,7 +2063,6 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'EXTENDED' at line 1 ALTER TABLE t1 ANALYZE PARTITION p1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK ALTER TABLE t1 CHECK PARTITION p1; Table Op Msg_type Msg_text diff -Nru mariadb-10.11.6/mysql-test/main/partition_binlog.result mariadb-10.11.9/mysql-test/main/partition_binlog.result --- mariadb-10.11.6/mysql-test/main/partition_binlog.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition_binlog.result 2024-08-03 07:29:57.000000000 +0000 @@ -27,7 +27,6 @@ test.t1 repair error Wrong partition name or partition list ALTER TABLE t1 ANALYZE PARTITION p0; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK ALTER TABLE t1 CHECK PARTITION p0; Table Op Msg_type Msg_text diff -Nru mariadb-10.11.6/mysql-test/main/partition_innodb.result mariadb-10.11.9/mysql-test/main/partition_innodb.result --- mariadb-10.11.6/mysql-test/main/partition_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -198,6 +198,10 @@ ERROR HY000: Table has no partition for value 100 insert INTO t1 VALUES (110); ERROR HY000: Table has no partition for value 110 +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a > 90; id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables @@ -401,7 +405,7 @@ insert into t1 values (0), (1), (2), (3); show table status; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary -t1 InnoDB 10 Dynamic 4 4096 16384 0 0 0 NULL Create_time Update_time NULL latin1_swedish_ci NULL partitioned 0 N +t1 InnoDB 10 Dynamic Rows Avg_row_length 16384 0 0 0 NULL Create_time Update_time NULL latin1_swedish_ci NULL partitioned 0 N drop table t1; create table t1 (a int auto_increment primary key) engine = innodb @@ -412,11 +416,11 @@ insert into t1 values (NULL), (NULL), (NULL), (NULL); show table status; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary -t1 InnoDB 10 Dynamic 4 4096 16384 0 0 0 5 Create_time Update_time NULL latin1_swedish_ci NULL partitioned 0 N +t1 InnoDB 10 Dynamic Rows Avg_row_length 16384 0 0 0 5 Create_time Update_time NULL latin1_swedish_ci NULL partitioned 0 N insert into t1 values (NULL), (NULL), (NULL), (NULL); show table status; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary -t1 InnoDB 10 Dynamic 8 2048 16384 0 0 0 9 Create_time Update_time NULL latin1_swedish_ci NULL partitioned 0 N +t1 InnoDB 10 Dynamic Rows Avg_row_length 16384 0 0 0 9 Create_time Update_time NULL latin1_swedish_ci NULL partitioned 0 N drop table t1; create table t1 (a int) partition by key (a) @@ -567,7 +571,7 @@ test.t1 optimize error Invalid default value for 'b' test.t1 optimize status Operation failed Warnings: -Warning 1265 Data truncated for column 'b' at row 1 +Warning 1265 Data truncated for column 'b' at row 0 Error 1067 Invalid default value for 'b' SET SESSION sql_mode = @old_mode; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/main/partition_innodb.test mariadb-10.11.9/mysql-test/main/partition_innodb.test --- mariadb-10.11.6/mysql-test/main/partition_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -208,6 +208,7 @@ INSERT INTO t1 VALUES (100); --error ER_NO_PARTITION_FOR_GIVEN_VALUE insert INTO t1 VALUES (110); +ANALYZE TABLE t1; EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a > 90; EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a >= 90; EXPLAIN PARTITIONS SELECT * FROM t1 WHERE a = 90; @@ -420,7 +421,9 @@ --replace_column 12 Create_time show table status; insert into t1 values (0), (1), (2), (3); ---replace_column 12 Create_time 13 Update_time +# Mask `Rows`, as it can fluctuate slightly if background statistics are +# running simultaneously with insert (MDEV-20169). +--replace_column 5 Rows 6 Avg_row_length 12 Create_time 13 Update_time show table status; drop table t1; @@ -430,10 +433,10 @@ --replace_column 12 Create_time show table status; insert into t1 values (NULL), (NULL), (NULL), (NULL); ---replace_column 12 Create_time 13 Update_time +--replace_column 5 Rows 6 Avg_row_length 12 Create_time 13 Update_time show table status; insert into t1 values (NULL), (NULL), (NULL), (NULL); ---replace_column 12 Create_time 13 Update_time +--replace_column 5 Rows 6 Avg_row_length 12 Create_time 13 Update_time show table status; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/partition_key_cache.result mariadb-10.11.9/mysql-test/main/partition_key_cache.result --- mariadb-10.11.6/mysql-test/main/partition_key_cache.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition_key_cache.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,3 @@ -DROP TABLE IF EXISTS t1, t2, v, x; # Actual test of key caches # Verifing that reads/writes use the key cache correctly SET @org_key_cache_buffer_size= @@global.default.key_buffer_size; diff -Nru mariadb-10.11.6/mysql-test/main/partition_key_cache.test mariadb-10.11.9/mysql-test/main/partition_key_cache.test --- mariadb-10.11.6/mysql-test/main/partition_key_cache.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition_key_cache.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,10 +1,6 @@ # Test of key cache with partitions --source include/have_partition.inc ---disable_warnings -DROP TABLE IF EXISTS t1, t2, v, x; ---enable_warnings - --echo # Actual test of key caches --echo # Verifing that reads/writes use the key cache correctly SET @org_key_cache_buffer_size= @@global.default.key_buffer_size; diff -Nru mariadb-10.11.6/mysql-test/main/partition_mgm_err.result mariadb-10.11.9/mysql-test/main/partition_mgm_err.result --- mariadb-10.11.6/mysql-test/main/partition_mgm_err.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition_mgm_err.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,3 @@ -drop table if exists t1; CREATE TABLE t1 (a int, b int) PARTITION BY RANGE (a) (PARTITION x0 VALUES LESS THAN (2), @@ -158,3 +157,15 @@ PARTITION p2 VALUES IN (2) (SUBPARTITION p1b) ); ERROR HY000: Duplicate partition name p1b +# End of 5.5 tests +# +# MDEV-32155 MariaDB Server crashes with ill-formed partitions +# +create table t1 (c1 set ( 'abc' ) binary unicode) partition by linear hash (c1 mod c1) partitions 10; +alter table t1 check partition all for upgrade; +Table Op Msg_type Msg_text +test.t1 check status OK +alter table t1 order by nonexistent; +ERROR 42S22: Unknown column 'nonexistent' in 'order clause' +drop table t1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/partition_mgm_err.test mariadb-10.11.9/mysql-test/main/partition_mgm_err.test --- mariadb-10.11.6/mysql-test/main/partition_mgm_err.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/partition_mgm_err.test 2024-08-03 07:29:57.000000000 +0000 @@ -4,10 +4,6 @@ # -- source include/have_partition.inc ---disable_warnings -drop table if exists t1; ---enable_warnings - # # Try faulty DROP PARTITION and COALESCE PARTITION # @@ -223,3 +219,16 @@ PARTITION p1 VALUES IN (0) (SUBPARTITION p1b), PARTITION p2 VALUES IN (2) (SUBPARTITION p1b) ); + +--echo # End of 5.5 tests + +--echo # +--echo # MDEV-32155 MariaDB Server crashes with ill-formed partitions +--echo # +create table t1 (c1 set ( 'abc' ) binary unicode) partition by linear hash (c1 mod c1) partitions 10; +alter table t1 check partition all for upgrade; +--error ER_BAD_FIELD_ERROR +alter table t1 order by nonexistent; +drop table t1; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/perror-win.result mariadb-10.11.9/mysql-test/main/perror-win.result --- mariadb-10.11.6/mysql-test/main/perror-win.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/perror-win.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,5 +3,6 @@ OS error code 23: Too many open files in system Win32 error code 23: Data error (cyclic redundancy check). MariaDB error code 1062 (ER_DUP_ENTRY): Duplicate entry '%-.192T' for key %d +Learn more: https://mariadb.com/kb/en/e1062/ Win32 error code 1062: The service has not been started. Illegal error code: 30000 diff -Nru mariadb-10.11.6/mysql-test/main/perror.result mariadb-10.11.9/mysql-test/main/perror.result --- mariadb-10.11.6/mysql-test/main/perror.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/perror.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,10 @@ Illegal error code: 10000 MariaDB error code 1062 (ER_DUP_ENTRY): Duplicate entry '%-.192T' for key %d +Learn more: https://mariadb.com/kb/en/e1062/ MariaDB error code 1408 (ER_STARTUP): %s: ready for connections. Version: '%s' socket: '%s' port: %d %s +Learn more: https://mariadb.com/kb/en/e1408/ MariaDB error code 1459 (ER_TABLE_NEEDS_UPGRADE): Upgrade required. Please do "REPAIR %s %`s" or dump/reload to fix it! +Learn more: https://mariadb.com/kb/en/e1459/ MariaDB error code 1461 (ER_MAX_PREPARED_STMT_COUNT_REACHED): Can't create more than max_prepared_stmt_count statements (current value: %u) +Learn more: https://mariadb.com/kb/en/e1461/ diff -Nru mariadb-10.11.6/mysql-test/main/plugin_auth.result mariadb-10.11.9/mysql-test/main/plugin_auth.result --- mariadb-10.11.6/mysql-test/main/plugin_auth.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/plugin_auth.result 2024-08-03 07:29:57.000000000 +0000 @@ -338,6 +338,7 @@ # Executing 'mysqladmin' mysqld is alive # Executing 'mysqldump' +/*M!999999\- enable the sandbox mode */ # Executing 'mysql_upgrade' # # Bug #59657: Move the client authentication_pam plugin into the diff -Nru mariadb-10.11.6/mysql-test/main/plugin_loaderr.test mariadb-10.11.9/mysql-test/main/plugin_loaderr.test --- mariadb-10.11.6/mysql-test/main/plugin_loaderr.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/plugin_loaderr.test 2024-08-03 07:29:57.000000000 +0000 @@ -13,14 +13,14 @@ --echo # --echo # MDEV-6351 --plugin=force has no effect for built-in plugins --echo # ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc --error 1 --exec $MYSQLD_CMD --innodb=force --innodb-page-size=6000 --disable-log-error ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --disable_reconnect diff -Nru mariadb-10.11.6/mysql-test/main/ps.result mariadb-10.11.9/mysql-test/main/ps.result --- mariadb-10.11.6/mysql-test/main/ps.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps.result 2024-08-03 07:29:57.000000000 +0000 @@ -5802,5 +5802,196 @@ $ ERROR 42000: EXECUTE..USING does not support subqueries or stored functions # +# MDEV-32965: Assertion `thd->active_stmt_arena_to_use()-> is_stmt_prepare_or_first_sp_execute() || thd->active_stmt_arena_to_use()-> is_conventional() || thd->active_stmt_arena_to_use()->state == Query_arena::STMT_SP_QUERY_ARGUMENTS' failed +# +CREATE TABLE t (f VARCHAR(8)) CHARACTER SET utf8; +INSERT INTO t VALUES ('foo'),('bar'); +EXECUTE IMMEDIATE 'SELECT GROUP_CONCAT(@x) FROM t GROUP BY @x := f'; +GROUP_CONCAT(@x) +0 +0 +DROP TABLE t; +# +# MDEV-15703: Crash in EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT +# +PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)'; +EXECUTE stmt USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +DEALLOCATE PREPARE stmt; +PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)'; +EXECUTE stmt USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +DEALLOCATE PREPARE stmt; +EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +CREATE PROCEDURE p1(a INT) SELECT 1; +EXECUTE IMMEDIATE 'CALL p1(?)' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +DROP PROCEDURE p1; +EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING DEFAULT; +ERROR HY000: Default/ignore value is not supported for such parameter usage +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING IGNORE; +ERROR HY000: Default/ignore value is not supported for such parameter usage +# multi-update and DEFAULT +CREATE TABLE t1 (a INT, b INT DEFAULT a); +INSERT into t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT DEFAULT a); +INSERT INTO t2 VALUES (1,10),(2,30); +UPDATE t1,t2 SET t1.b = DEFAULT, t2.b = DEFAULT WHERE t1.a=t2.a; +SELECT * FROM t1; +a b +1 1 +2 2 +SELECT * FROM t2; +a b +1 1 +2 2 +# re-check the case for Prepared Statement with parameters +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +INSERT INTO t1 VALUES (1,2),(2,3); +INSERT INTO t2 VALUES (1,10),(2,30); +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT; +SELECT * FROM t1; +a b +1 1 +2 2 +SELECT * FROM t2; +a b +1 1 +2 2 +DROP TABLE t1, t2; +# multi-update and IGNORE +CREATE TABLE t1 (a INT, b INT default a); +INSERT INTO t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT default a); +INSERT INTO t2 VALUES (1,10),(2,30); +UPDATE t1,t2 SET t1.b = IGNORE, t2.b = IGNORE WHERE t1.a=t2.a; +SELECT * FROM t1; +a b +1 2 +2 3 +SELECT * FROM t2; +a b +1 NULL +2 NULL +# re-check the case for Prepared Statement with parameters +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +INSERT INTO t1 VALUES (1,2),(2,3); +INSERT INTO t2 VALUES (1,10),(2,30); +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE; +SELECT * FROM t1; +a b +1 2 +2 3 +SELECT * FROM t2; +a b +1 10 +2 30 +DROP TABLE t1, t2; +# multi-update and DEFAULT parameter (no default) +CREATE TABLE t1 (a INT, b INT NOT NULL); +INSERT INTO t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT NOT NULL); +INSERT INTO t2 VALUES (1,10),(2,30); +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT; +ERROR HY000: Field 'b' doesn't have a default value +DROP TABLE t1, t2; +# multi-update and IGNORE parameter (no default) +CREATE TABLE t1 (a INT, b INT NOT NULL); +INSERT INTO t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT NOT NULL); +INSERT INTO t2 VALUES (1,10),(2,30); +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE; +SELECT * FROM t1; +a b +1 2 +2 3 +SELECT * FROM t2; +a b +1 10 +2 30 +DROP TABLE t1, t2; +# +# MDEV-33549: Incorrect handling of UPDATE in PS mode in case a table's colum declared as NOT NULL +# +CREATE TABLE t1 (a INT, b INT DEFAULT NULL); +INSERT INTO t1 VALUES (20, 30); +EXECUTE IMMEDIATE 'UPDATE t1 SET b=?' USING DEFAULT; +SELECT * FROM t1; +a b +20 NULL +# Run twice the same update in PS mode to check +# that no memory relating issues taken place. +PREPARE stmt FROM 'UPDATE t1 SET b=?'; +EXECUTE stmt USING DEFAULT; +EXECUTE stmt USING DEFAULT; +# Clean up +DEALLOCATE PREPARE stmt; +DROP TABLE t1; +# The same test for multi-table update +CREATE TABLE t1 (a INT, b INT DEFAULT NULL); +CREATE TABLE t2 (a INT, c INT DEFAULT NULL); +INSERT INTO t1 VALUES (20, 30); +INSERT INTO t2 VALUES (20, 30); +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET b=? WHERE t1.a=t2.a' USING DEFAULT; +SELECT * FROM t1; +a b +20 NULL +# Run twice the same multi-table update in PS mode to check +# that no memory relating issues taken place. +PREPARE stmt FROM 'UPDATE t1,t2 SET b=? WHERE t1.a=t2.a'; +EXECUTE stmt USING DEFAULT; +EXECUTE stmt USING DEFAULT; +DEALLOCATE PREPARE stmt; +# Clean up +DROP TABLE t1; +# This time checks that a default value for table's column +# represented by a function call is handled correctly on UPDATE in PS mode +CREATE TABLE t1 (a INT, b INT DEFAULT MOD(a, 3)); +INSERT INTO t1 VALUES (20, 30); +EXECUTE IMMEDIATE 'UPDATE t1, t2 SET b=? WHERE t1.a=t2.a' USING DEFAULT; +SELECT * FROM t1; +a b +20 2 +# Run twice the same multi-table update in PS mode to check +# that no memory relating issues taken place. +PREPARE stmt FROM 'UPDATE t1, t2 SET b=? WHERE t1.a=t2.a'; +EXECUTE stmt USING DEFAULT; +EXECUTE stmt USING DEFAULT; +# Clean up +DEALLOCATE PREPARE stmt; +DROP TABLE t1, t2; +# MDEV-33218: Assertion `active_arena->is_stmt_prepare_or_first_stmt_execute() || active_arena->state == Query_arena::STMT_SP_QUERY_ARGUMENTS' failed. in st_select_lex::fix_prepare_information +CREATE TABLE t1 AS SELECT 1 f; +PREPARE stmt FROM 'SHOW CREATE TABLE t1'; +DROP TABLE t1; +EXECUTE stmt; +ERROR 42S02: Table 'test.t1' doesn't exist +CREATE VIEW t1 AS SELECT 1; +EXECUTE stmt; +View Create View character_set_client collation_connection +t1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `t1` AS select 1 AS `1` latin1 latin1_swedish_ci +# Clean up +DEALLOCATE PREPARE stmt; +DROP VIEW t1; +# # End of 10.4 tests # diff -Nru mariadb-10.11.6/mysql-test/main/ps.test mariadb-10.11.9/mysql-test/main/ps.test --- mariadb-10.11.6/mysql-test/main/ps.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps.test 2024-08-03 07:29:57.000000000 +0000 @@ -5237,5 +5237,202 @@ delimiter ;$ --echo # +--echo # MDEV-32965: Assertion `thd->active_stmt_arena_to_use()-> is_stmt_prepare_or_first_sp_execute() || thd->active_stmt_arena_to_use()-> is_conventional() || thd->active_stmt_arena_to_use()->state == Query_arena::STMT_SP_QUERY_ARGUMENTS' failed +--echo # +CREATE TABLE t (f VARCHAR(8)) CHARACTER SET utf8; + +INSERT INTO t VALUES ('foo'),('bar'); +EXECUTE IMMEDIATE 'SELECT GROUP_CONCAT(@x) FROM t GROUP BY @x := f'; + +# Cleanup + +DROP TABLE t; + +--echo # +--echo # MDEV-15703: Crash in EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT +--echo # + +PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)'; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE stmt USING DEFAULT; +DEALLOCATE PREPARE stmt; + +PREPARE stmt FROM 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)'; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE stmt USING IGNORE; +DEALLOCATE PREPARE stmt; + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING DEFAULT; + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 (a INT DEFAULT ?)' USING IGNORE; + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING DEFAULT; + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'BEGIN NOT ATOMIC DECLARE a INT DEFAULT ?; END' USING IGNORE; + +CREATE PROCEDURE p1(a INT) SELECT 1; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'CALL p1(?)' USING DEFAULT; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'CALL p1(?)' USING IGNORE; +DROP PROCEDURE p1; + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING DEFAULT; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT ? UNION SELECT 1' USING IGNORE; + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING DEFAULT; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION ALL SELECT 1) AS derived' USING IGNORE; + +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING DEFAULT; +--error ER_INVALID_DEFAULT_PARAM +EXECUTE IMMEDIATE 'SELECT * FROM (SELECT ? UNION DISTINCT SELECT 1) AS derived' USING IGNORE; + +--echo # multi-update and DEFAULT +CREATE TABLE t1 (a INT, b INT DEFAULT a); +INSERT into t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT DEFAULT a); +INSERT INTO t2 VALUES (1,10),(2,30); + +UPDATE t1,t2 SET t1.b = DEFAULT, t2.b = DEFAULT WHERE t1.a=t2.a; +SELECT * FROM t1; +SELECT * FROM t2; + +--echo # re-check the case for Prepared Statement with parameters +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +INSERT INTO t1 VALUES (1,2),(2,3); +INSERT INTO t2 VALUES (1,10),(2,30); + +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT; +SELECT * FROM t1; +SELECT * FROM t2; + +# Cleanup +DROP TABLE t1, t2; + +--echo # multi-update and IGNORE +CREATE TABLE t1 (a INT, b INT default a); +INSERT INTO t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT default a); +INSERT INTO t2 VALUES (1,10),(2,30); + +UPDATE t1,t2 SET t1.b = IGNORE, t2.b = IGNORE WHERE t1.a=t2.a; +SELECT * FROM t1; +SELECT * FROM t2; + +--echo # re-check the case for Prepared Statement with parameters +TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +INSERT INTO t1 VALUES (1,2),(2,3); +INSERT INTO t2 VALUES (1,10),(2,30); + +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE; +SELECT * FROM t1; +SELECT * FROM t2; + +# Cleanup +DROP TABLE t1, t2; + +--echo # multi-update and DEFAULT parameter (no default) +CREATE TABLE t1 (a INT, b INT NOT NULL); +INSERT INTO t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT NOT NULL); +INSERT INTO t2 VALUES (1,10),(2,30); + +--error ER_NO_DEFAULT_FOR_FIELD +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING DEFAULT, DEFAULT; + +# Cleanup +DROP TABLE t1, t2; + +--echo # multi-update and IGNORE parameter (no default) +CREATE TABLE t1 (a INT, b INT NOT NULL); +INSERT INTO t1 VALUES (1,2),(2,3); +CREATE TABLE t2 (a INT, b INT NOT NULL); +INSERT INTO t2 VALUES (1,10),(2,30); + +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET t1.b = ?, t2.b = ? WHERE t1.a=t2.a' USING IGNORE, IGNORE; +SELECT * FROM t1; +SELECT * FROM t2; + +# Cleanup +DROP TABLE t1, t2; + +--echo # +--echo # MDEV-33549: Incorrect handling of UPDATE in PS mode in case a table's colum declared as NOT NULL +--echo # + +CREATE TABLE t1 (a INT, b INT DEFAULT NULL); +INSERT INTO t1 VALUES (20, 30); +EXECUTE IMMEDIATE 'UPDATE t1 SET b=?' USING DEFAULT; +SELECT * FROM t1; + +--echo # Run twice the same update in PS mode to check +--echo # that no memory relating issues taken place. +PREPARE stmt FROM 'UPDATE t1 SET b=?'; +EXECUTE stmt USING DEFAULT; +EXECUTE stmt USING DEFAULT; + +--echo # Clean up +DEALLOCATE PREPARE stmt; +DROP TABLE t1; + +--echo # The same test for multi-table update +CREATE TABLE t1 (a INT, b INT DEFAULT NULL); +CREATE TABLE t2 (a INT, c INT DEFAULT NULL); + +INSERT INTO t1 VALUES (20, 30); +INSERT INTO t2 VALUES (20, 30); + +EXECUTE IMMEDIATE 'UPDATE t1,t2 SET b=? WHERE t1.a=t2.a' USING DEFAULT; +SELECT * FROM t1; +--echo # Run twice the same multi-table update in PS mode to check +--echo # that no memory relating issues taken place. +PREPARE stmt FROM 'UPDATE t1,t2 SET b=? WHERE t1.a=t2.a'; +EXECUTE stmt USING DEFAULT; +EXECUTE stmt USING DEFAULT; +DEALLOCATE PREPARE stmt; +--echo # Clean up +DROP TABLE t1; + +--echo # This time checks that a default value for table's column +--echo # represented by a function call is handled correctly on UPDATE in PS mode +CREATE TABLE t1 (a INT, b INT DEFAULT MOD(a, 3)); +INSERT INTO t1 VALUES (20, 30); +EXECUTE IMMEDIATE 'UPDATE t1, t2 SET b=? WHERE t1.a=t2.a' USING DEFAULT; +SELECT * FROM t1; + +--echo # Run twice the same multi-table update in PS mode to check +--echo # that no memory relating issues taken place. +PREPARE stmt FROM 'UPDATE t1, t2 SET b=? WHERE t1.a=t2.a'; +EXECUTE stmt USING DEFAULT; +EXECUTE stmt USING DEFAULT; + +--echo # Clean up +DEALLOCATE PREPARE stmt; +DROP TABLE t1, t2; + +--echo # MDEV-33218: Assertion `active_arena->is_stmt_prepare_or_first_stmt_execute() || active_arena->state == Query_arena::STMT_SP_QUERY_ARGUMENTS' failed. in st_select_lex::fix_prepare_information +CREATE TABLE t1 AS SELECT 1 f; +PREPARE stmt FROM 'SHOW CREATE TABLE t1'; +DROP TABLE t1; +--error ER_NO_SUCH_TABLE +EXECUTE stmt; +CREATE VIEW t1 AS SELECT 1; +EXECUTE stmt; +--echo # Clean up +DEALLOCATE PREPARE stmt; +DROP VIEW t1; + +--echo # --echo # End of 10.4 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/ps_2myisam.result mariadb-10.11.9/mysql-test/main/ps_2myisam.result --- mariadb-10.11.6/mysql-test/main/ps_2myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps_2myisam.result 2024-08-03 07:29:57.000000000 +0000 @@ -1798,7 +1798,7 @@ `param09` longtext DEFAULT NULL, `const10` bigint(17) DEFAULT NULL, `param10` bigint(20) DEFAULT NULL, - `const11` int(4) DEFAULT NULL, + `const11` int(5) DEFAULT NULL, `param11` bigint(20) DEFAULT NULL, `const12` binary(0) DEFAULT NULL, `param12` bigint(20) DEFAULT NULL, @@ -1828,7 +1828,7 @@ def test t5 t5 param09 param09 252 4294967295 19 Y 16 0 8 def test t5 t5 const10 const10 8 17 9 Y 32768 0 63 def test t5 t5 param10 param10 8 20 9 Y 32768 0 63 -def test t5 t5 const11 const11 3 4 4 Y 32768 0 63 +def test t5 t5 const11 const11 3 5 4 Y 32768 0 63 def test t5 t5 param11 param11 8 20 4 Y 32768 0 63 def test t5 t5 const12 const12 254 0 0 Y 128 0 63 def test t5 t5 param12 param12 8 20 0 Y 32768 0 63 diff -Nru mariadb-10.11.6/mysql-test/main/ps_3innodb.result mariadb-10.11.9/mysql-test/main/ps_3innodb.result --- mariadb-10.11.6/mysql-test/main/ps_3innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps_3innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -1781,7 +1781,7 @@ `param09` longtext DEFAULT NULL, `const10` bigint(17) DEFAULT NULL, `param10` bigint(20) DEFAULT NULL, - `const11` int(4) DEFAULT NULL, + `const11` int(5) DEFAULT NULL, `param11` bigint(20) DEFAULT NULL, `const12` binary(0) DEFAULT NULL, `param12` bigint(20) DEFAULT NULL, @@ -1811,7 +1811,7 @@ def test t5 t5 param09 param09 252 4294967295 19 Y 16 0 8 def test t5 t5 const10 const10 8 17 9 Y 32768 0 63 def test t5 t5 param10 param10 8 20 9 Y 32768 0 63 -def test t5 t5 const11 const11 3 4 4 Y 32768 0 63 +def test t5 t5 const11 const11 3 5 4 Y 32768 0 63 def test t5 t5 param11 param11 8 20 4 Y 32768 0 63 def test t5 t5 const12 const12 254 0 0 Y 128 0 63 def test t5 t5 param12 param12 8 20 0 Y 32768 0 63 diff -Nru mariadb-10.11.6/mysql-test/main/ps_4heap.result mariadb-10.11.9/mysql-test/main/ps_4heap.result --- mariadb-10.11.6/mysql-test/main/ps_4heap.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps_4heap.result 2024-08-03 07:29:57.000000000 +0000 @@ -1782,7 +1782,7 @@ `param09` longtext DEFAULT NULL, `const10` bigint(17) DEFAULT NULL, `param10` bigint(20) DEFAULT NULL, - `const11` int(4) DEFAULT NULL, + `const11` int(5) DEFAULT NULL, `param11` bigint(20) DEFAULT NULL, `const12` binary(0) DEFAULT NULL, `param12` bigint(20) DEFAULT NULL, @@ -1812,7 +1812,7 @@ def test t5 t5 param09 param09 252 4294967295 19 Y 16 0 8 def test t5 t5 const10 const10 8 17 9 Y 32768 0 63 def test t5 t5 param10 param10 8 20 9 Y 32768 0 63 -def test t5 t5 const11 const11 3 4 4 Y 32768 0 63 +def test t5 t5 const11 const11 3 5 4 Y 32768 0 63 def test t5 t5 param11 param11 8 20 4 Y 32768 0 63 def test t5 t5 const12 const12 254 0 0 Y 128 0 63 def test t5 t5 param12 param12 8 20 0 Y 32768 0 63 diff -Nru mariadb-10.11.6/mysql-test/main/ps_5merge.result mariadb-10.11.9/mysql-test/main/ps_5merge.result --- mariadb-10.11.6/mysql-test/main/ps_5merge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps_5merge.result 2024-08-03 07:29:57.000000000 +0000 @@ -1719,7 +1719,7 @@ `param09` longtext DEFAULT NULL, `const10` bigint(17) DEFAULT NULL, `param10` bigint(20) DEFAULT NULL, - `const11` int(4) DEFAULT NULL, + `const11` int(5) DEFAULT NULL, `param11` bigint(20) DEFAULT NULL, `const12` binary(0) DEFAULT NULL, `param12` bigint(20) DEFAULT NULL, @@ -1749,7 +1749,7 @@ def test t5 t5 param09 param09 252 4294967295 19 Y 16 0 8 def test t5 t5 const10 const10 8 17 9 Y 32768 0 63 def test t5 t5 param10 param10 8 20 9 Y 32768 0 63 -def test t5 t5 const11 const11 3 4 4 Y 32768 0 63 +def test t5 t5 const11 const11 3 5 4 Y 32768 0 63 def test t5 t5 param11 param11 8 20 4 Y 32768 0 63 def test t5 t5 const12 const12 254 0 0 Y 128 0 63 def test t5 t5 param12 param12 8 20 0 Y 32768 0 63 @@ -5087,7 +5087,7 @@ `param09` longtext DEFAULT NULL, `const10` bigint(17) DEFAULT NULL, `param10` bigint(20) DEFAULT NULL, - `const11` int(4) DEFAULT NULL, + `const11` int(5) DEFAULT NULL, `param11` bigint(20) DEFAULT NULL, `const12` binary(0) DEFAULT NULL, `param12` bigint(20) DEFAULT NULL, @@ -5117,7 +5117,7 @@ def test t5 t5 param09 param09 252 4294967295 19 Y 16 0 8 def test t5 t5 const10 const10 8 17 9 Y 32768 0 63 def test t5 t5 param10 param10 8 20 9 Y 32768 0 63 -def test t5 t5 const11 const11 3 4 4 Y 32768 0 63 +def test t5 t5 const11 const11 3 5 4 Y 32768 0 63 def test t5 t5 param11 param11 8 20 4 Y 32768 0 63 def test t5 t5 const12 const12 254 0 0 Y 128 0 63 def test t5 t5 param12 param12 8 20 0 Y 32768 0 63 diff -Nru mariadb-10.11.6/mysql-test/main/ps_mem_leaks.result mariadb-10.11.9/mysql-test/main/ps_mem_leaks.result --- mariadb-10.11.6/mysql-test/main/ps_mem_leaks.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps_mem_leaks.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,6 +3,20 @@ # CREATE TABLE t1 (a VARCHAR(10)) ENGINE=MYISAM; CREATE TABLE t2 (b VARCHAR(10) CHARACTER SET utf8) ENGINE=MYISAM; +INSERT INTO t1 VALUES ('b'), ('a'), ('c'); +INSERT INTO t2 VALUES ('c'), ('d'), ('b'); +PREPARE stmt FROM "SELECT t1.a FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2)"; +EXECUTE stmt; +a +c +b +EXECUTE stmt; +a +c +b +DEALLOCATE PREPARE stmt; +DELETE FROM t1; +DELETE FROM t2; INSERT INTO t1 VALUES ('b'); INSERT INTO t2 VALUES ('b'); PREPARE stmt FROM "SELECT t1.a FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2)"; @@ -14,3 +28,93 @@ b DEALLOCATE PREPARE stmt; DROP TABLE t1, t2; +# +# MDEV-32569: Failure when executing PS for query using IN subquery +# +CREATE TABLE t1 (a varchar(10)) ENGINE=MYISAM; +CREATE TABLE t2 (b varchar(10) CHARACTER SET utf8) ENGINE=MYISAM; +INSERT INTO t1 VALUES ('b'); +INSERT INTO t2 VALUES ('b'); +PREPARE stmt FROM +"SELECT STRAIGHT_JOIN t1.a FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2)"; +EXECUTE stmt; +a +b +EXECUTE stmt; +a +b +DEALLOCATE PREPARE stmt; +DROP TABLE t1,t2; +# +# MDEV-32733: Two JSON related tests running in PS mode fail on server +# built with -DWITH_PROTECT_STATEMENT_MEMROOT=YES +# +PREPARE stmt FROM "select json_contains_path('{\"key1\":1}', 'oNE', '$.key2[1]') as exp"; +EXECUTE stmt; +exp +0 +EXECUTE stmt; +exp +0 +DEALLOCATE PREPARE stmt; +# +# MDEV-32466: Potential memory leak on execuing of create view statement +# +CREATE FUNCTION f1 () RETURNS VARCHAR(1) +BEGIN +DECLARE rec1 ROW TYPE OF v1; +SELECT z INTO rec1 FROM v1; +RETURN 1; +END| +CREATE FUNCTION f2 () RETURNS VARCHAR(1) RETURN '!'; +CREATE VIEW v1 AS SELECT f2() z; +PREPARE stmt FROM "SELECT f1()"; +EXECUTE stmt; +f1() +1 +EXECUTE stmt; +f1() +1 +DEALLOCATE PREPARE stmt; +DROP FUNCTION f1; +DROP VIEW v1; +DROP FUNCTION f2; +# +# MDEV-32867: ASAN errors in Item_func_json_contains_path::val_int upon PS execution +# +CREATE TABLE t1 (f BLOB) ENGINE=MyISAM; +PREPARE stmt FROM "SELECT * FROM t1 WHERE JSON_EXISTS(JSON_ARRAY('[true,1234567890]'), '$**.*') != JSON_CONTAINS_PATH(JSON_INSERT('{}', '$[1]', NULL), 'all', '$[1]')"; +EXECUTE stmt; +f +DEALLOCATE PREPARE stmt; +DROP TABLE t1; +# End of 10.4 tests +# +# MDEV-33769: Memory leak found in the test main.rownum run with --ps-protocol against a server built with the option -DWITH_PROTECT_STATEMENT_MEMROOT +# +CREATE OR REPLACE TABLE t1(a INT); +PREPARE stmt FROM 'SELECT 1 FROM t1 WHERE ROWNUM() < 2'; +EXECUTE stmt; +1 +EXECUTE stmt; +1 +INSERT INTO t1 VALUES (1), (2), (3), (4), (5); +PREPARE stmt FROM 'SELECT * FROM t1 WHERE ROWNUM() < ?'; +# Expected output is two rows (1), (2) +EXECUTE stmt USING 3; +a +1 +2 +# Expected output is one row (1) +EXECUTE stmt USING 2; +a +1 +# Expected output is three rows (1), (2), (3) +EXECUTE stmt USING 4; +a +1 +2 +# Clean up +DEALLOCATE PREPARE stmt; +DROP TABLE t1; +# End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/ps_mem_leaks.test mariadb-10.11.9/mysql-test/main/ps_mem_leaks.test --- mariadb-10.11.6/mysql-test/main/ps_mem_leaks.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps_mem_leaks.test 2024-08-03 07:29:57.000000000 +0000 @@ -13,6 +13,19 @@ CREATE TABLE t1 (a VARCHAR(10)) ENGINE=MYISAM; CREATE TABLE t2 (b VARCHAR(10) CHARACTER SET utf8) ENGINE=MYISAM; +INSERT INTO t1 VALUES ('b'), ('a'), ('c'); +INSERT INTO t2 VALUES ('c'), ('d'), ('b'); + +PREPARE stmt FROM "SELECT t1.a FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2)"; + +EXECUTE stmt; +EXECUTE stmt; + +DEALLOCATE PREPARE stmt; + +DELETE FROM t1; +DELETE FROM t2; + INSERT INTO t1 VALUES ('b'); INSERT INTO t2 VALUES ('b'); @@ -25,3 +38,99 @@ DROP TABLE t1, t2; +--echo # +--echo # MDEV-32569: Failure when executing PS for query using IN subquery +--echo # + +CREATE TABLE t1 (a varchar(10)) ENGINE=MYISAM; +CREATE TABLE t2 (b varchar(10) CHARACTER SET utf8) ENGINE=MYISAM; + +INSERT INTO t1 VALUES ('b'); +INSERT INTO t2 VALUES ('b'); + +PREPARE stmt FROM +"SELECT STRAIGHT_JOIN t1.a FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2)"; + +EXECUTE stmt; +EXECUTE stmt; + +DEALLOCATE PREPARE stmt; + +DROP TABLE t1,t2; + +--echo # +--echo # MDEV-32733: Two JSON related tests running in PS mode fail on server +--echo # built with -DWITH_PROTECT_STATEMENT_MEMROOT=YES +--echo # +PREPARE stmt FROM "select json_contains_path('{\"key1\":1}', 'oNE', '$.key2[1]') as exp"; + +EXECUTE stmt; +EXECUTE stmt; + +DEALLOCATE PREPARE stmt; + +--echo # +--echo # MDEV-32466: Potential memory leak on execuing of create view statement +--echo # + +--delimiter | + +CREATE FUNCTION f1 () RETURNS VARCHAR(1) +BEGIN + DECLARE rec1 ROW TYPE OF v1; + SELECT z INTO rec1 FROM v1; + RETURN 1; +END| +--delimiter ; + +CREATE FUNCTION f2 () RETURNS VARCHAR(1) RETURN '!'; +CREATE VIEW v1 AS SELECT f2() z; + +PREPARE stmt FROM "SELECT f1()"; +EXECUTE stmt; +EXECUTE stmt; + +DEALLOCATE PREPARE stmt; + +# Clean up +DROP FUNCTION f1; +DROP VIEW v1; +DROP FUNCTION f2; + +--echo # +--echo # MDEV-32867: ASAN errors in Item_func_json_contains_path::val_int upon PS execution +--echo # +CREATE TABLE t1 (f BLOB) ENGINE=MyISAM; + +PREPARE stmt FROM "SELECT * FROM t1 WHERE JSON_EXISTS(JSON_ARRAY('[true,1234567890]'), '$**.*') != JSON_CONTAINS_PATH(JSON_INSERT('{}', '$[1]', NULL), 'all', '$[1]')"; +EXECUTE stmt; + +# Clean up +DEALLOCATE PREPARE stmt; +DROP TABLE t1; + +--echo # End of 10.4 tests + +--echo # +--echo # MDEV-33769: Memory leak found in the test main.rownum run with --ps-protocol against a server built with the option -DWITH_PROTECT_STATEMENT_MEMROOT +--echo # +CREATE OR REPLACE TABLE t1(a INT); +PREPARE stmt FROM 'SELECT 1 FROM t1 WHERE ROWNUM() < 2'; +EXECUTE stmt; +EXECUTE stmt; + +INSERT INTO t1 VALUES (1), (2), (3), (4), (5); + +PREPARE stmt FROM 'SELECT * FROM t1 WHERE ROWNUM() < ?'; +--echo # Expected output is two rows (1), (2) +EXECUTE stmt USING 3; +--echo # Expected output is one row (1) +EXECUTE stmt USING 2; +--echo # Expected output is three rows (1), (2), (3) +EXECUTE stmt USING 4; + +--echo # Clean up +DEALLOCATE PREPARE stmt; +DROP TABLE t1; + +--echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/ps_missed_cmds_bin_prot.test mariadb-10.11.9/mysql-test/main/ps_missed_cmds_bin_prot.test --- mariadb-10.11.6/mysql-test/main/ps_missed_cmds_bin_prot.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ps_missed_cmds_bin_prot.test 2024-08-03 07:29:57.000000000 +0000 @@ -49,7 +49,9 @@ USE mdev_16708_db; --echo # Check that the current database has been changed +--disable_service_connection SELECT DATABASE(); +--enable_service_connection --echo # Clean up USE test; @@ -84,6 +86,7 @@ --echo # Set up environmentr for the test case CREATE TABLE t1 (a INT); +--disable_view_protocol BEGIN; INSERT INTO t1 VALUES (1); @@ -101,6 +104,7 @@ SELECT * FROM t1; RELEASE SAVEPOINT s1; +--enable_view_protocol --echo # Clean up DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/main/query_cache.result mariadb-10.11.9/mysql-test/main/query_cache.result --- mariadb-10.11.6/mysql-test/main/query_cache.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/query_cache.result 2024-08-03 07:29:57.000000000 +0000 @@ -2208,12 +2208,42 @@ DROP FUNCTION foo; drop table t1; # +# MDEV-33861: main.query_cache fails with embedded after +# enabling WITH_PROTECT_STATEMENT_MEMROOT +# +create table t1 (s1 int); +create procedure f3 () begin +select * from t1; +end; +// +create procedure f4 () begin +select * from t1; +end; +// +Call f4(); +s1 +cAll f3(); +s1 +insert into t1 values (2); +caLl f3(); +s1 +2 +drop procedure f3; +drop procedure f4; +drop table t1; +# +# End of 10.4 tests +# +# # MDEV-24858 SIGABRT in DbugExit from my_malloc in Query_cache::init_cache Regression # SET @qc= @@query_cache_size; set global Query_cache_size=18446744073709547520; SET GLOBAL query_cache_size= @qc; # +# End of 10.5 tests +# +# # MDEV-22301 JSON_TABLE: Queries are not inserted into query cache. # create table t1 (a text); @@ -2239,6 +2269,7 @@ restore defaults SET GLOBAL query_cache_type= default; SET GLOBAL query_cache_size=@save_query_cache_size; +# End of 10.6 tests # # MDEV-29028: Queries using RANDOM_BYTES get stored in query cache # @@ -2261,6 +2292,4 @@ 0 drop table t1; set global query_cache_type= @qcache; -# # End of 10.10 tests -# diff -Nru mariadb-10.11.6/mysql-test/main/query_cache.test mariadb-10.11.9/mysql-test/main/query_cache.test --- mariadb-10.11.6/mysql-test/main/query_cache.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/query_cache.test 2024-08-03 07:29:57.000000000 +0000 @@ -1808,6 +1808,40 @@ drop table t1; --echo # +--echo # MDEV-33861: main.query_cache fails with embedded after +--echo # enabling WITH_PROTECT_STATEMENT_MEMROOT +--echo # + +create table t1 (s1 int); +--delimiter // +create procedure f3 () begin +select * from t1; +end; +// +create procedure f4 () begin +select * from t1; +end; +// +--delimiter ; + +Call f4(); + +cAll f3(); + +insert into t1 values (2); + +caLl f3(); + +drop procedure f3; +drop procedure f4; +drop table t1; + + +--echo # +--echo # End of 10.4 tests +--echo # + +--echo # --echo # MDEV-24858 SIGABRT in DbugExit from my_malloc in Query_cache::init_cache Regression --echo # --disable_warnings @@ -1817,6 +1851,10 @@ --enable_warnings --echo # +--echo # End of 10.5 tests +--echo # + +--echo # --echo # MDEV-22301 JSON_TABLE: Queries are not inserted into query cache. --echo # create table t1 (a text); @@ -1838,6 +1876,8 @@ SET GLOBAL query_cache_type= default; SET GLOBAL query_cache_size=@save_query_cache_size; +--echo # End of 10.6 tests + --echo # --echo # MDEV-29028: Queries using RANDOM_BYTES get stored in query cache --echo # @@ -1866,7 +1906,6 @@ drop table t1; set global query_cache_type= @qcache; ---echo # --echo # End of 10.10 tests ---echo # + --enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/main/range.result mariadb-10.11.9/mysql-test/main/range.result --- mariadb-10.11.6/mysql-test/main/range.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/range.result 2024-08-03 07:29:57.000000000 +0000 @@ -1627,13 +1627,13 @@ Warnings: Warning 1411 Incorrect datetime value: '2007-20-00' for function str_to_date Warning 1411 Incorrect datetime value: '2007-20-00' for function str_to_date -SELECT str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20'; -str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20' +SELECT str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20' as exp; +exp 1 Warnings: Warning 1292 Truncated incorrect datetime value: '' -SELECT str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND ''; -str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND '' +SELECT str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND '' as exp; +exp NULL Warnings: Warning 1411 Incorrect datetime value: '2007-20-00' for function str_to_date diff -Nru mariadb-10.11.6/mysql-test/main/range.test mariadb-10.11.9/mysql-test/main/range.test --- mariadb-10.11.6/mysql-test/main/range.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/range.test 2024-08-03 07:29:57.000000000 +0000 @@ -1265,11 +1265,8 @@ str_to_date('2007-20-00', '%Y-%m-%d') <= ''; --enable_view_protocol -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20'; -SELECT str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND ''; ---enable_view_protocol +SELECT str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20' as exp; +SELECT str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND '' as exp; SELECT str_to_date('', '%Y-%m-%d'); diff -Nru mariadb-10.11.6/mysql-test/main/range_mrr_icp.result mariadb-10.11.9/mysql-test/main/range_mrr_icp.result --- mariadb-10.11.6/mysql-test/main/range_mrr_icp.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/range_mrr_icp.result 2024-08-03 07:29:57.000000000 +0000 @@ -1630,13 +1630,13 @@ Warnings: Warning 1411 Incorrect datetime value: '2007-20-00' for function str_to_date Warning 1411 Incorrect datetime value: '2007-20-00' for function str_to_date -SELECT str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20'; -str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20' +SELECT str_to_date('2007-10-00', '%Y-%m-%d') BETWEEN '' AND '2007/10/20' as exp; +exp 1 Warnings: Warning 1292 Truncated incorrect datetime value: '' -SELECT str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND ''; -str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND '' +SELECT str_to_date('2007-20-00', '%Y-%m-%d') BETWEEN '2007/10/20' AND '' as exp; +exp NULL Warnings: Warning 1411 Incorrect datetime value: '2007-20-00' for function str_to_date diff -Nru mariadb-10.11.6/mysql-test/main/range_notembedded.test mariadb-10.11.9/mysql-test/main/range_notembedded.test --- mariadb-10.11.6/mysql-test/main/range_notembedded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/range_notembedded.test 2024-08-03 07:29:57.000000000 +0000 @@ -26,8 +26,11 @@ --echo # This should show only ranges in form "(1) <= (key1) <= (1)" --echo # ranges over "pk" should not be constructed. +# Enable after fix MDEV-31408 +--disable_view_protocol select json_detailed(JSON_EXTRACT(trace, '$**.ranges')) from information_schema.optimizer_trace; +--enable_view_protocol set optimizer_trace=@tmp_21958; drop table t2; diff -Nru mariadb-10.11.6/mysql-test/main/read_only_innodb.result mariadb-10.11.9/mysql-test/main/read_only_innodb.result --- mariadb-10.11.6/mysql-test/main/read_only_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/read_only_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -70,7 +70,7 @@ DROP TABLE t1; DROP USER test@localhost; disconnect con1; -echo End of 5.1 tests +# End of 5.1 tests # # Bug#33669: Transactional temporary tables do not work under --read-only # @@ -244,3 +244,26 @@ SET GLOBAL READ_ONLY = OFF; DROP USER bug33669@localhost; DROP DATABASE db1; +# End of 5.5 tests +# +# MDEV-33889 Read only server throws error when running a create temporary table as select statement +# +create table t1(a int) engine=innodb; +create user u1@localhost; +grant insert, select, update, delete, create temporary tables on test.* to u1@localhost; +insert into t1 values (1); +set global read_only=1; +connect u1,localhost,u1; +set default_tmp_storage_engine=innodb; +create temporary table tt1 (a int); +create temporary table tt2 like t1; +create temporary table tt3 as select * from t1; +select * from tt3; +a +1 +disconnect u1; +connection default; +drop table t1; +drop user u1@localhost; +set global read_only=0; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/read_only_innodb.test mariadb-10.11.9/mysql-test/main/read_only_innodb.test --- mariadb-10.11.6/mysql-test/main/read_only_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/read_only_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -103,7 +103,7 @@ disconnect con1; ---echo echo End of 5.1 tests +--echo # End of 5.1 tests --echo # --echo # Bug#33669: Transactional temporary tables do not work under --read-only @@ -250,3 +250,29 @@ DROP USER bug33669@localhost; DROP DATABASE db1; +--echo # End of 5.5 tests + +--echo # +--echo # MDEV-33889 Read only server throws error when running a create temporary table as select statement +--echo # +create table t1(a int) engine=innodb; +create user u1@localhost; +grant insert, select, update, delete, create temporary tables on test.* to u1@localhost; +insert into t1 values (1); +set global read_only=1; + +connect u1,localhost,u1; +set default_tmp_storage_engine=innodb; + +create temporary table tt1 (a int); +create temporary table tt2 like t1; +create temporary table tt3 as select * from t1; +select * from tt3; +disconnect u1; + +connection default; +drop table t1; +drop user u1@localhost; +set global read_only=0; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/main/rowid_filter.result mariadb-10.11.9/mysql-test/main/rowid_filter.result --- mariadb-10.11.6/mysql-test/main/rowid_filter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rowid_filter.result 2024-08-03 07:29:57.000000000 +0000 @@ -2264,21 +2264,24 @@ CREATE TABLE t1 (pk int) engine=myisam ; INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 ( -pk int auto_increment PRIMARY KEY, -i1 int, i2 int, c2 varchar(1), -KEY (i1), KEY (i2) +pk int PRIMARY KEY, +i1 int, i2 int, +c2 varchar(100), +KEY (i1), +KEY (i2) ) engine=myisam; -INSERT INTO t2 VALUES -(1,8,6,'t'),(2,5,7,'i'),(3,4,4,'h'),(4,207,38,'d'),(5,183,206,'b'), -(6,7,null,'o'),(7,1,2,'j'),(8,17,36,'s'),(9,4,5,'q'),(10,0,6,'l'), -(11,1,9,'j'),(12,5,6,'y'),(13,null,0,'i'),(14,7,7,'x'),(15,5,2,'u'); +insert into t2 +select +seq, floor(seq/100), floor(seq/100), 'abcd' +from +seq_1_to_10000; SELECT * FROM t1 HAVING (7, 9) IN (SELECT t2.i1, t2.i2 FROM t2 WHERE t2.i1 = 3); pk EXPLAIN EXTENDED SELECT * FROM t1 HAVING (7, 9) IN (SELECT t2.i1, t2.i2 FROM t2 WHERE t2.i1 = 3); id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL Impossible HAVING -2 SUBQUERY t2 ref i1,i2 i1 5 const 1 100.00 Using index condition; Using where +2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL no matching row in const table Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`pk` AS `pk` from `test`.`t1` having 0 DROP TABLE t1,t2; diff -Nru mariadb-10.11.6/mysql-test/main/rowid_filter.test mariadb-10.11.9/mysql-test/main/rowid_filter.test --- mariadb-10.11.6/mysql-test/main/rowid_filter.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rowid_filter.test 2024-08-03 07:29:57.000000000 +0000 @@ -298,15 +298,18 @@ INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 ( - pk int auto_increment PRIMARY KEY, - i1 int, i2 int, c2 varchar(1), - KEY (i1), KEY (i2) + pk int PRIMARY KEY, + i1 int, i2 int, + c2 varchar(100), + KEY (i1), + KEY (i2) ) engine=myisam; -INSERT INTO t2 VALUES - (1,8,6,'t'),(2,5,7,'i'),(3,4,4,'h'),(4,207,38,'d'),(5,183,206,'b'), - (6,7,null,'o'),(7,1,2,'j'),(8,17,36,'s'),(9,4,5,'q'),(10,0,6,'l'), - (11,1,9,'j'),(12,5,6,'y'),(13,null,0,'i'),(14,7,7,'x'),(15,5,2,'u'); +insert into t2 +select + seq, floor(seq/100), floor(seq/100), 'abcd' +from + seq_1_to_10000; SELECT * FROM t1 HAVING (7, 9) IN (SELECT t2.i1, t2.i2 FROM t2 WHERE t2.i1 = 3); EXPLAIN EXTENDED diff -Nru mariadb-10.11.6/mysql-test/main/rowid_filter_innodb.result mariadb-10.11.9/mysql-test/main/rowid_filter_innodb.result --- mariadb-10.11.6/mysql-test/main/rowid_filter_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rowid_filter_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -1986,7 +1986,7 @@ "r_table_time_ms": "REPLACED", "r_other_time_ms": "REPLACED", "r_engine_stats": { - "pages_accessed": 3 + "pages_accessed": 2 }, "filtered": "REPLACED", "r_filtered": 66.66666667, @@ -2140,7 +2140,7 @@ "r_table_time_ms": "REPLACED", "r_other_time_ms": "REPLACED", "r_engine_stats": { - "pages_accessed": 3 + "pages_accessed": 2 }, "filtered": "REPLACED", "r_filtered": 66.66666667, @@ -2220,21 +2220,24 @@ CREATE TABLE t1 (pk int) engine=myisam ; INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 ( -pk int auto_increment PRIMARY KEY, -i1 int, i2 int, c2 varchar(1), -KEY (i1), KEY (i2) +pk int PRIMARY KEY, +i1 int, i2 int, +c2 varchar(100), +KEY (i1), +KEY (i2) ) engine=myisam; -INSERT INTO t2 VALUES -(1,8,6,'t'),(2,5,7,'i'),(3,4,4,'h'),(4,207,38,'d'),(5,183,206,'b'), -(6,7,null,'o'),(7,1,2,'j'),(8,17,36,'s'),(9,4,5,'q'),(10,0,6,'l'), -(11,1,9,'j'),(12,5,6,'y'),(13,null,0,'i'),(14,7,7,'x'),(15,5,2,'u'); +insert into t2 +select +seq, floor(seq/100), floor(seq/100), 'abcd' +from +seq_1_to_10000; SELECT * FROM t1 HAVING (7, 9) IN (SELECT t2.i1, t2.i2 FROM t2 WHERE t2.i1 = 3); pk EXPLAIN EXTENDED SELECT * FROM t1 HAVING (7, 9) IN (SELECT t2.i1, t2.i2 FROM t2 WHERE t2.i1 = 3); id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY NULL NULL NULL NULL NULL NULL NULL NULL Impossible HAVING -2 SUBQUERY t2 ref i1,i2 i1 5 const 1 100.00 Using index condition; Using where +2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL no matching row in const table Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`pk` AS `pk` from `test`.`t1` having 0 DROP TABLE t1,t2; @@ -4170,5 +4173,178 @@ Note 1276 Field or reference 'test.t1.pk' of SELECT #2 was resolved in SELECT #1 Note 1003 /* select#1 */ select `test`.`t1`.`pk` AS `pk`,`test`.`t1`.`c1` AS `c1` from `test`.`t1` where !<`test`.`t1`.`c1`,`test`.`t1`.`pk`>((`test`.`t1`.`c1`,(/* select#2 */ select `test`.`t2`.`c1` from `test`.`t2` join `test`.`t1` `a1` where `test`.`t2`.`i1` = `test`.`t1`.`pk` and `test`.`t2`.`i1` between 3 and 5 and trigcond((`test`.`t1`.`c1`) = `test`.`t2`.`c1`)))) DROP TABLE t1,t2; -set global innodb_stats_persistent= @stats.save; +# +# MDEV-31154: Fatal InnoDB error or assertion `!is_v' failure upon multi-update with indexed virtual column +# +# Test with auto generated Primary Key +# +SET @save_optimizer_switch= @@optimizer_switch; +SET optimizer_switch='rowid_filter=on'; +CREATE TABLE t0(a int); +INSERT INTO t0 SELECT seq FROM seq_1_to_20; +ANALYZE TABLE t0 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t0 analyze status Engine-independent statistics collected +test.t0 analyze status OK +CREATE TABLE t1 ( +a int, +b int as (a * 2) VIRTUAL, +f char(200), /* Filler */ +key (b), +key (a) +) engine=innodb; +INSERT INTO t1 (a, f) SELECT seq, seq FROM seq_1_to_1000; +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +# Test for type 'ref|filter' +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t0 ALL NULL NULL NULL NULL 20 Using where +1 SIMPLE t1 ref|filter b,a b|a 5|5 test.t0.a 1 (2%) Using where; Using rowid filter +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; +count(*) +10 +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t0 ALL NULL NULL NULL NULL 20 Using where +1 SIMPLE t1 ref|filter b,a b|a 5|5 test.t0.a 1 (2%) Using where; Using rowid filter +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; +count(*) +10 +# Test for type 'range|filter' +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range|filter b,a b|a 5|5 NULL 49 (10%) Using where; Using rowid filter +SELECT count(*) FROM t1 WHERE a<100 and b <100; +count(*) +49 +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range|filter b,a b|a 5|5 NULL 49 (10%) Using where; Using rowid filter +SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; +count(*) +49 +# Test with Primary Key +# +DROP TABLE t1; +CREATE TABLE t1 ( +p int PRIMARY KEY AUTO_INCREMENT, +a int, +b int as (a * 2) VIRTUAL, +f char(200), /* Filler */ +key (b), +key (a) +) engine=innodb; +INSERT INTO t1 (a, f) SELECT seq, seq FROM seq_1_to_1000; +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +# Test for type 'ref|filter' +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t0 ALL NULL NULL NULL NULL 20 Using where +1 SIMPLE t1 ref|filter b,a b|a 5|5 test.t0.a 1 (2%) Using where; Using rowid filter +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; +count(*) +10 +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t0 ALL NULL NULL NULL NULL 20 Using where +1 SIMPLE t1 ref|filter b,a b|a 5|5 test.t0.a 1 (2%) Using where; Using rowid filter +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; +count(*) +10 +# Test for type 'range|filter' +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range|filter b,a b|a 5|5 NULL 49 (10%) Using where; Using rowid filter +SELECT count(*) FROM t1 WHERE a<100 and b <100; +count(*) +49 +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range|filter b,a b|a 5|5 NULL 49 (10%) Using where; Using rowid filter +SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; +count(*) +49 +SET optimizer_switch=@save_optimizer_switch; +DROP TABLE t0, t1; # End of 10.4 tests +# +# MDEV-33875: ORDER BY DESC causes ROWID Filter slowdown +# +create table t1 ( +pk int primary key auto_increment, +a int, +b int, +f1 varchar(200), +f2 varchar(200), +f3 varchar(200), +f4 varchar(200), +f5 varchar(200), +key(a, pk), +key(b) +) engine=innodb; +insert into t1 (a,b,f1, f2, f3, f4) select +seq, seq, +repeat('1-', 100), +repeat('2-', 100), +repeat('3-', 100), +repeat('4-', 100) +from +seq_1_to_5000; +insert into t1 (a,b,f1, f2, f3, f4)select +30100, 30100, +'abcd','abcd','abcd','abcd' +from +seq_1_to_250; +insert into t1 (a,b,f1) values ( 110, 100, 12345); +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +# The following must NOT use Rowid Filter: +analyze format=json select * from t1 +where +a =30100 and b in (30100,30101,30102) +order by +pk desc; +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ref", + "possible_keys": ["a", "b"], + "key": "a", + "key_length": "5", + "used_key_parts": ["a"], + "ref": ["const"], + "r_loops": 1, + "rows": 250, + "r_rows": 250, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 4.799086094, + "r_filtered": 100, + "attached_condition": "t1.a <=> 30100 and t1.b in (30100,30101,30102)" + } + } + ] + } +} +drop table t1; +# End of 10.6 tests +set global innodb_stats_persistent= @stats.save; diff -Nru mariadb-10.11.6/mysql-test/main/rowid_filter_innodb.test mariadb-10.11.9/mysql-test/main/rowid_filter_innodb.test --- mariadb-10.11.6/mysql-test/main/rowid_filter_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rowid_filter_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,8 @@ --source include/no_valgrind_without_big.inc --source include/have_innodb.inc --source include/have_debug.inc +--source include/have_sequence.inc +--source include/innodb_stable_estimates.inc SET SESSION DEFAULT_STORAGE_ENGINE='InnoDB'; @@ -683,6 +685,124 @@ DROP TABLE t1,t2; -set global innodb_stats_persistent= @stats.save; +--echo # +--echo # MDEV-31154: Fatal InnoDB error or assertion `!is_v' failure upon multi-update with indexed virtual column +--echo # + +--echo # Test with auto generated Primary Key +--echo # + +SET @save_optimizer_switch= @@optimizer_switch; +SET optimizer_switch='rowid_filter=on'; + +CREATE TABLE t0(a int); +INSERT INTO t0 SELECT seq FROM seq_1_to_20; +ANALYZE TABLE t0 PERSISTENT FOR ALL; + +CREATE TABLE t1 ( + a int, + b int as (a * 2) VIRTUAL, + f char(200), /* Filler */ + key (b), + key (a) +) engine=innodb; + +INSERT INTO t1 (a, f) SELECT seq, seq FROM seq_1_to_1000; +ANALYZE TABLE t1 PERSISTENT FOR ALL; + +--echo # Test for type 'ref|filter' +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; + +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; + +--echo # Test for type 'range|filter' +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100; +SELECT count(*) FROM t1 WHERE a<100 and b <100; + +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; +SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; + +--echo # Test with Primary Key +--echo # + +DROP TABLE t1; +CREATE TABLE t1 ( + p int PRIMARY KEY AUTO_INCREMENT, + a int, + b int as (a * 2) VIRTUAL, + f char(200), /* Filler */ + key (b), + key (a) +) engine=innodb; + +INSERT INTO t1 (a, f) SELECT seq, seq FROM seq_1_to_1000; +ANALYZE TABLE t1 PERSISTENT FOR ALL; + +--echo # Test for type 'ref|filter' +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20; + +EXPLAIN SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; +SELECT count(*) from t0,t1 WHERE t0.a=t1.b AND t1.a<20 FOR UPDATE; + +--echo # Test for type 'range|filter' +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100; +SELECT count(*) FROM t1 WHERE a<100 and b <100; + +EXPLAIN SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; +SELECT count(*) FROM t1 WHERE a<100 and b <100 FOR UPDATE; + +SET optimizer_switch=@save_optimizer_switch; + +DROP TABLE t0, t1; --echo # End of 10.4 tests + +--echo # +--echo # MDEV-33875: ORDER BY DESC causes ROWID Filter slowdown +--echo # +create table t1 ( + pk int primary key auto_increment, + a int, + b int, + f1 varchar(200), + f2 varchar(200), + f3 varchar(200), + f4 varchar(200), + f5 varchar(200), + key(a, pk), + key(b) +) engine=innodb; + +insert into t1 (a,b,f1, f2, f3, f4) select + seq, seq, + repeat('1-', 100), + repeat('2-', 100), + repeat('3-', 100), + repeat('4-', 100) +from + seq_1_to_5000; + +insert into t1 (a,b,f1, f2, f3, f4)select + 30100, 30100, + 'abcd','abcd','abcd','abcd' +from + seq_1_to_250; +insert into t1 (a,b,f1) values ( 110, 100, 12345); +analyze table t1; + +--echo # The following must NOT use Rowid Filter: +--source include/analyze-format.inc +analyze format=json select * from t1 +where + a =30100 and b in (30100,30101,30102) +order by + pk desc; + +drop table t1; + +--echo # End of 10.6 tests + +set global innodb_stats_persistent= @stats.save; diff -Nru mariadb-10.11.6/mysql-test/main/rowid_filter_innodb_debug.result mariadb-10.11.9/mysql-test/main/rowid_filter_innodb_debug.result --- mariadb-10.11.6/mysql-test/main/rowid_filter_innodb_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rowid_filter_innodb_debug.result 2024-08-03 07:29:57.000000000 +0000 @@ -46,5 +46,23 @@ disconnect con1; ERROR 70100: Query execution was interrupted set debug_sync='RESET'; +# +# MDEV-30651: SIGSEGV in st_join_table::save_explain_data and +# Assertion `sel->quick' failed in make_range_rowid_filters +# +# Reusing table t2 and t3 from previous test +set debug_sync='in_forced_range_optimize SIGNAL ready1 WAIT_FOR go1'; +explain +select * from t2, t3 +where +t3.key1=t2.a and t3.key2 in (2,3); +connect con1, localhost, root,,; +set debug_sync='now WAIT_FOR ready1'; +kill query $target_id; +set debug_sync='now SIGNAL go1'; +connection default; +disconnect con1; +ERROR 70100: Query execution was interrupted +set debug_sync='RESET'; drop table t2,t3; set default_storage_engine=default; diff -Nru mariadb-10.11.6/mysql-test/main/rowid_filter_myisam_debug.result mariadb-10.11.9/mysql-test/main/rowid_filter_myisam_debug.result --- mariadb-10.11.6/mysql-test/main/rowid_filter_myisam_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rowid_filter_myisam_debug.result 2024-08-03 07:29:57.000000000 +0000 @@ -45,4 +45,22 @@ disconnect con1; ERROR 70100: Query execution was interrupted set debug_sync='RESET'; +# +# MDEV-30651: SIGSEGV in st_join_table::save_explain_data and +# Assertion `sel->quick' failed in make_range_rowid_filters +# +# Reusing table t2 and t3 from previous test +set debug_sync='in_forced_range_optimize SIGNAL ready1 WAIT_FOR go1'; +explain +select * from t2, t3 +where +t3.key1=t2.a and t3.key2 in (2,3); +connect con1, localhost, root,,; +set debug_sync='now WAIT_FOR ready1'; +kill query $target_id; +set debug_sync='now SIGNAL go1'; +connection default; +disconnect con1; +ERROR 70100: Query execution was interrupted +set debug_sync='RESET'; drop table t2,t3; diff -Nru mariadb-10.11.6/mysql-test/main/rpl_mysqldump_slave.result mariadb-10.11.9/mysql-test/main/rpl_mysqldump_slave.result --- mariadb-10.11.6/mysql-test/main/rpl_mysqldump_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rpl_mysqldump_slave.result 2024-08-03 07:29:57.000000000 +0000 @@ -7,25 +7,32 @@ connection master; use test; connection slave; --- SET GLOBAL gtid_slave_pos=''; +/*M!999999\- enable the sandbox mode */ CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; -STOP ALL SLAVES; + -- SET GLOBAL gtid_slave_pos=''; +/*M!999999\- enable the sandbox mode */ +STOP ALL SLAVES; CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; + +-- SET GLOBAL gtid_slave_pos=''; START ALL SLAVES; +/*M!999999\- enable the sandbox mode */ STOP ALL SLAVES; --- SET GLOBAL gtid_slave_pos=''; CHANGE MASTER '' TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_MYPORT, MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; + +-- SET GLOBAL gtid_slave_pos=''; START ALL SLAVES; start slave; Warnings: Note 1254 Slave is already running --- SET GLOBAL gtid_slave_pos=''; +/*M!999999\- enable the sandbox mode */ CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; + start slave; Warnings: Note 1254 Slave is already running -*** Test mysqldump --dump-slave GTID functionality. +*** Test mysqldump --dump-slave GTID/non-gtid functionality. connection master; SET gtid_seq_no = 1000; CREATE TABLE t1 (a INT PRIMARY KEY); @@ -35,34 +42,217 @@ CREATE TABLE t2 (a INT PRIMARY KEY); DROP TABLE t2; -1. --dump-slave=1 +1. --dump-slave=1 --gtid -SET GLOBAL gtid_slave_pos='0-1-1001'; +/*M!999999\- enable the sandbox mode */ CHANGE MASTER '' TO MASTER_USE_GTID=slave_pos; -- CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; -2. --dump-slave=2 +SET GLOBAL gtid_slave_pos='0-1-1001'; + +1a. --dump-slave=1 + +/*M!999999\- enable the sandbox mode */ +CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; -- SET GLOBAL gtid_slave_pos='0-1-1001'; + +2. --dump-slave=2 --gtid + +/*M!999999\- enable the sandbox mode */ -- CHANGE MASTER '' TO MASTER_USE_GTID=slave_pos; -- CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; -*** Test mysqldump --master-data GTID functionality. -1. --master-data=1 +-- SET GLOBAL gtid_slave_pos='0-1-1001'; --- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; +2. --dump-slave=2 + +/*M!999999\- enable the sandbox mode */ +-- CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; + +-- SET GLOBAL gtid_slave_pos='0-1-1001'; +*** Test mysqldump --master-data GTID/non-gtid functionality. + +1. --master-data=1 --gtid + +/*M!999999\- enable the sandbox mode */ CHANGE MASTER TO MASTER_USE_GTID=slave_pos; +-- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; SET GLOBAL gtid_slave_pos='0-2-1003'; -2. --master-data=2 +1a. --master-data=1 --- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; +/*M!999999\- enable the sandbox mode */ +CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; +-- SET GLOBAL gtid_slave_pos='0-2-1003'; + +2. --master-data=2 --gtid + +/*M!999999\- enable the sandbox mode */ -- CHANGE MASTER TO MASTER_USE_GTID=slave_pos; +-- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; -- SET GLOBAL gtid_slave_pos='0-2-1003'; -3. --master-data --single-transaction +2a. --master-data=2 +/*M!999999\- enable the sandbox mode */ -- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; +-- SET GLOBAL gtid_slave_pos='0-2-1003'; + +3. --master-data --single-transaction --gtid + +/*M!999999\- enable the sandbox mode */ CHANGE MASTER TO MASTER_USE_GTID=slave_pos; +-- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; SET GLOBAL gtid_slave_pos='0-2-1003'; + +3a. --master-data --single-transaction + +/*M!999999\- enable the sandbox mode */ +CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; +-- SET GLOBAL gtid_slave_pos='0-2-1003'; + +4. --master-data=2 --dump-slave=2 --single-transaction --gtid (MDEV-4827) + +/*M!999999\- enable the sandbox mode */ +-- MariaDB dump-- +-- Host: localhost Database: test +-- ------------------------------------------------------ +-- Server version +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +-- CHANGE MASTER TO MASTER_USE_GTID=slave_pos; + +-- A corresponding to the above master-data CHANGE-MASTER settings to the slave gtid state is printed later in the file. + +-- +-- Alternately, following is the position of the binary logging from SHOW MASTER STATUS at point of backup. +-- Use this when creating a replica of the primary server where the backup was made. +-- The new server will be connecting to the primary server where the backup was taken. +-- + +-- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; + +-- +-- The following is the SQL position of the replication taken from SHOW SLAVE STATUS at the time of backup. +-- Use this position when creating a clone of, or replacement server, from where the backup was taken. +-- This new server will connects to the same primary server(s). +-- + +-- A corresponding to the below dump-slave CHANGE-MASTER settings to the slave gtid state is printed later in the file. + +-- Use only the MASTER_USE_GTID=slave_pos or MASTER_LOG_FILE/MASTER_LOG_POS in the statements below. + +-- CHANGE MASTER '' TO MASTER_USE_GTID=slave_pos; +-- CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; + + +-- The deferred gtid setting for slave corresponding to the master-data CHANGE-MASTER follows + +-- Preferably use GTID to start replication from GTID position: + +-- SET GLOBAL gtid_slave_pos='0-2-1003'; + +-- The deferred gtid setting for slave corresponding to the dump-slave CHANGE-MASTER follows +-- GTID position to start replication: +-- SET GLOBAL gtid_slave_pos='0-1-1001'; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed + +4a. --master-data=2 --dump-slave=2 --single-transaction (MDEV-4827) + +/*M!999999\- enable the sandbox mode */ +-- MariaDB dump-- +-- Host: localhost Database: test +-- ------------------------------------------------------ +-- Server version +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Alternately, following is the position of the binary logging from SHOW MASTER STATUS at point of backup. +-- Use this when creating a replica of the primary server where the backup was made. +-- The new server will be connecting to the primary server where the backup was taken. +-- + +-- CHANGE MASTER TO MASTER_LOG_FILE='slave-bin.000001', MASTER_LOG_POS=BINLOG_START; + +-- A corresponding to the above master-data CHANGE-MASTER settings to the slave gtid state is printed as comments later in the file. + +-- +-- The following is the SQL position of the replication taken from SHOW SLAVE STATUS at the time of backup. +-- Use this position when creating a clone of, or replacement server, from where the backup was taken. +-- This new server will connects to the same primary server(s). +-- + +-- A corresponding to the below dump-slave CHANGE-MASTER settings to the slave gtid state is printed later in the file. +-- CHANGE MASTER '' TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=BINLOG_START; + + +-- The deferred gtid setting for slave corresponding to the master-data CHANGE-MASTER follows + +-- Preferably use GTID to start replication from GTID position: + +-- SET GLOBAL gtid_slave_pos='0-2-1003'; + +-- The deferred gtid setting for slave corresponding to the dump-slave CHANGE-MASTER follows +-- GTID position to start replication: +-- SET GLOBAL gtid_slave_pos='0-1-1001'; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed +connection master; +CREATE TABLE t ( +id int +); +insert into t values (1); +insert into t values (2); +drop table t; +connection slave; +include/stop_slave.inc +change master to master_use_gtid=slave_pos; +connection master; +# Ensuring the binlog dump thread is killed on primary... +/*M!999999\- enable the sandbox mode */ +-- CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000002', MASTER_LOG_POS=BINLOG_START; +-- SET GLOBAL gtid_slave_pos='0-1-1005'; +connection slave; +include/start_slave.inc +connection master; +connection slave; +connection master; +FOUND 1 matches in MDEV-33212.sql include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/main/rpl_mysqldump_slave.test mariadb-10.11.9/mysql-test/main/rpl_mysqldump_slave.test --- mariadb-10.11.6/mysql-test/main/rpl_mysqldump_slave.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/rpl_mysqldump_slave.test 2024-08-03 07:29:57.000000000 +0000 @@ -37,7 +37,7 @@ start slave; ---echo *** Test mysqldump --dump-slave GTID functionality. +--echo *** Test mysqldump --dump-slave GTID/non-gtid functionality. --connection master SET gtid_seq_no = 1000; @@ -52,37 +52,166 @@ DROP TABLE t2; --echo ---echo 1. --dump-slave=1 +--echo 1. --dump-slave=1 --gtid --echo --replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ --exec $MYSQL_DUMP_SLAVE --compact --dump-slave=1 --gtid test --echo ---echo 2. --dump-slave=2 +--echo 1a. --dump-slave=1 +--echo +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ +--exec $MYSQL_DUMP_SLAVE --compact --dump-slave=1 test + +--echo +--echo 2. --dump-slave=2 --gtid --echo --replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ --exec $MYSQL_DUMP_SLAVE --compact --dump-slave=2 --gtid test +--echo +--echo 2. --dump-slave=2 +--echo +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ +--exec $MYSQL_DUMP_SLAVE --compact --dump-slave=2 test + ---echo *** Test mysqldump --master-data GTID functionality. +--echo *** Test mysqldump --master-data GTID/non-gtid functionality. --echo ---echo 1. --master-data=1 +--echo 1. --master-data=1 --gtid --echo --replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ --exec $MYSQL_DUMP_SLAVE --compact --master-data=1 --gtid test --echo ---echo 2. --master-data=2 +--echo 1a. --master-data=1 +--echo +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ +--exec $MYSQL_DUMP_SLAVE --compact --master-data=1 test + +--echo +--echo 2. --master-data=2 --gtid --echo --replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ --exec $MYSQL_DUMP_SLAVE --compact --master-data=2 --gtid test --echo ---echo 3. --master-data --single-transaction +--echo 2a. --master-data=2 +--echo +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ +--exec $MYSQL_DUMP_SLAVE --compact --master-data=2 test + +--echo +--echo 3. --master-data --single-transaction --gtid --echo --replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ --exec $MYSQL_DUMP_SLAVE --compact --master-data --single-transaction --gtid test +--echo +--echo 3a. --master-data --single-transaction +--echo +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ +--exec $MYSQL_DUMP_SLAVE --compact --master-data --single-transaction test + +--echo +--echo 4. --master-data=2 --dump-slave=2 --single-transaction --gtid (MDEV-4827) +--echo +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ /MariaDB dump.*/MariaDB dump/ /Dump completed.*/Dump completed/ /Server version.*/Server version/ +--exec $MYSQL_DUMP_SLAVE --master-data=2 --dump-slave=2 --single-transaction --gtid test +--echo + +--echo +--echo 4a. --master-data=2 --dump-slave=2 --single-transaction (MDEV-4827) +--echo +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ /MariaDB dump.*/MariaDB dump/ /Dump completed.*/Dump completed/ /Server version.*/Server version/ +--exec $MYSQL_DUMP_SLAVE --master-data=2 --dump-slave=2 --single-transaction test +--echo +# +# MDEV-32611 Added test for mysqldump --delete-master-logs option. +# This options is alias of +# get binlogs: show master status -> flush logs -> purge binary logs to +# sequence and this test is derived using the same pattern. +# + +connection master; + +CREATE TABLE t ( + id int +); + +insert into t values (1); +insert into t values (2); + +drop table t; + +--sync_slave_with_master + +# MDEV-32953: Because --delete-master-logs immediately purges logs after +# flushing, it is possible the binlog dump threads will still be using the old +# log when the purge executes, disallowing the file from being deleted. +# Therefore, we temporarily stop the slave so there is no chance the old binlog +# is still being referenced. master_use_gtid=Slave_pos is necessary to still +# appear up-to-date to the master on restart after the master has flushed the +# logs (while the slave is offline). Otherwise (i.e. if using binlog file/pos), +# the slave would point to a purged log file, and receive an error immediately +# upon connecting to the master. +--source include/stop_slave.inc +change master to master_use_gtid=slave_pos; + +connection master; + +--echo # Ensuring the binlog dump thread is killed on primary... +--disable_query_log +--let $binlog_dump_thd_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND LIKE 'Binlog Dump'` +if ($binlog_dump_thd_tid) +{ + --eval kill $binlog_dump_thd_tid +} +--let $wait_condition= SELECT COUNT(*)=0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND LIKE 'Binlog Dump' +--source include/wait_condition.inc +--enable_query_log + +--let $predump_binlog_filename= query_get_value(SHOW MASTER STATUS, File, 1) + +# Execute mysqldump with delete-master-logs option +--replace_regex /MASTER_LOG_POS=[0-9]+/MASTER_LOG_POS=BINLOG_START/ +--exec $MYSQL_DUMP --compact --no-create-info --no-data --delete-master-logs test + +--let $postdump_binlog_filename= query_get_value(SHOW MASTER STATUS, File, 1) + +--let $postdump_first_binary_log_filename= query_get_value(SHOW BINARY LOGS, Log_name, 1) + +if ($predump_binlog_filename == $postdump_binlog_filename) +{ + --echo # predump_binlog_filename: $predump_binlog_filename + --echo # postdump_binlog_filename: $postdump_binlog_filename + --die Master state didn't change after mariadb-dump with --delete-master-logs. +} + +if ($postdump_first_binary_log_filename != $postdump_binlog_filename) +{ + --echo # postdump_first_binary_log_filename: $postdump_first_binary_log_filename + --echo # postdump_binlog_filename: $postdump_binlog_filename + --die Master binlog wasn't deleted after mariadb-dump with --delete-master-logs. +} + +connection slave; +--source include/start_slave.inc + +# MDEV-33212: mysqldump uses MASTER_LOG_POS with dump-slave +# The bug was that the MASTER_LOG_POS was wrong. So check that it is correct. +--connection master +--let $pos= query_get_value(SHOW MASTER STATUS, Position, 1) +--sync_slave_with_master +--connection master +--exec $MYSQL_DUMP_SLAVE --compact --dump-slave test >$MYSQLTEST_VARDIR/tmp/MDEV-33212.sql +--let SEARCH_RANGE=500000000 +--let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/MDEV-33212.sql +--let SEARCH_PATTERN= MASTER_LOG_POS=$pos +--let SEARCH_OUTPUT=count +--source include/search_pattern_in_file.inc + +--remove_file $MYSQLTEST_VARDIR/tmp/MDEV-33212.sql --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/main/secondary_key_costs.result mariadb-10.11.9/mysql-test/main/secondary_key_costs.result --- mariadb-10.11.6/mysql-test/main/secondary_key_costs.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/secondary_key_costs.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,180 @@ +create table t1 ( +pk int primary key auto_increment, +nm varchar(32), +fl1 tinyint default 0, +fl2 tinyint default 0, +index idx1(nm, fl1), +index idx2(fl2) +) engine=myisam; +create table name ( +pk int primary key auto_increment, +nm bigint +) engine=myisam; +create table flag2 ( +pk int primary key auto_increment, +fl2 tinyint +) engine=myisam; +insert into name(nm) select seq from seq_1_to_1000 order by rand(17); +insert into flag2(fl2) select seq mod 2 from seq_1_to_1000 order by rand(19); +insert into t1(nm,fl2) +select nm, fl2 from name, flag2 where name.pk = flag2.pk; +analyze table t1 persistent for all; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status Table is already up to date +set optimizer_trace="enabled=on"; +set optimizer_switch='rowid_filter=on'; +set statement optimizer_adjust_secondary_key_costs=0 for +explain select * from t1 where nm like '500%' AND fl2 = 0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range idx1,idx2 idx1 35 NULL 1 Using index condition; Using where +set @trace=(select trace from information_schema.optimizer_trace); +select json_detailed(json_extract(@trace, '$**.considered_access_paths')); +json_detailed(json_extract(@trace, '$**.considered_access_paths')) +[ + [ + { + "access_type": "ref", + "index": "idx2", + "used_range_estimates": true, + "rowid_filter_skipped": "worst/max seeks clipping", + "rows": 492, + "cost": 492.3171406, + "chosen": true + }, + { + "access_type": "range", + "resulting_rows": 0.492, + "cost": 1.448699097, + "chosen": true + } + ] +] + +The following trace should have a different rowid_filter_key cost + +set statement optimizer_adjust_secondary_key_costs=2 for +explain select * from t1 where nm like '500%' AND fl2 = 0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range idx1,idx2 idx1 35 NULL 1 Using index condition; Using where +set @trace=(select trace from information_schema.optimizer_trace); +select json_detailed(json_extract(@trace, '$**.considered_access_paths')); +json_detailed(json_extract(@trace, '$**.considered_access_paths')) +[ + [ + { + "access_type": "ref", + "index": "idx2", + "used_range_estimates": true, + "rowid_filter_key": "idx1", + "rows": 492, + "cost": 3.814364688, + "chosen": true + }, + { + "access_type": "range", + "resulting_rows": 0.492, + "cost": 1.448699097, + "chosen": true + } + ] +] +drop table t1, name, flag2; +select @@optimizer_adjust_secondary_key_costs; +@@optimizer_adjust_secondary_key_costs + +set @@optimizer_adjust_secondary_key_costs=7; +select @@optimizer_adjust_secondary_key_costs; +@@optimizer_adjust_secondary_key_costs +adjust_secondary_key_cost,disable_max_seek,disable_forced_index_in_group_by +set @@optimizer_adjust_secondary_key_costs=default; +# +# MDEV-33306 Optimizer choosing incorrect index in 10.6, 10.5 but not in 10.4 +# +create table t1 (a int primary key, b int, c int, d int, key(b),key(c)) engine=innodb; +insert into t1 select seq, mod(seq,10), mod(seq,2), seq from seq_1_to_50000; +explain select b, sum(d) from t1 where c=0 group by b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c b 5 NULL # Using where +select b, sum(d) from t1 where c=0 group by b; +b sum(d) +0 125025000 +2 124985000 +4 124995000 +6 125005000 +8 125015000 +set @@optimizer_adjust_secondary_key_costs="disable_forced_index_in_group_by"; +explain select b, sum(d) from t1 where c=0 group by b; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL c NULL NULL NULL # Using where; Using temporary; Using filesort +select b, sum(d) from t1 where c=0 group by b; +b sum(d) +0 125025000 +2 124985000 +4 124995000 +6 125005000 +8 125015000 +drop table t1; +# +# MDEV-34664: fix_innodb_cardinality +# +set @save_userstat=@@global.userstat; +set @save_ispsp=@@global.innodb_stats_persistent_sample_pages; +set @@global.innodb_stats_persistent_sample_pages=20; +set @@global.userstat=on; +set use_stat_tables=PREFERABLY_FOR_QUERIES; +create or replace table t1 (a int primary key, b int, c int, d int, key(b,c,d)) engine=innodb; +insert into t1 select seq,seq/100,seq/60,seq/10 from seq_1_to_1000; +create or replace table t2 (a int); +insert into t2 values (1),(2),(3); +analyze table t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +select count(distinct b),count(distinct b,c), count(distinct b,c,d) from t1; +count(distinct b) count(distinct b,c) count(distinct b,c,d) +11 25 125 +show index from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 0 PRIMARY 1 a A 1000 NULL NULL BTREE NO +t1 1 b 1 b A 22 NULL NULL YES BTREE NO +t1 1 b 2 c A 50 NULL NULL YES BTREE NO +t1 1 b 3 d A 250 NULL NULL YES BTREE NO +explain select * from t1,t2 where t1.b=t2.a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 Using where +1 SIMPLE t1 ref b b 5 test.t2.a 45 Using index +set @@optimizer_adjust_secondary_key_costs=8; +explain select * from t1,t2 where t1.b=t2.a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 Using where +1 SIMPLE t1 ref b b 5 test.t2.a 45 Using index +show index from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 0 PRIMARY 1 a A 1000 NULL NULL BTREE NO +t1 1 b 1 b A 11 NULL NULL YES BTREE NO +t1 1 b 2 c A 25 NULL NULL YES BTREE NO +t1 1 b 3 d A 125 NULL NULL YES BTREE NO +flush tables; +explain select * from t1,t2 where t1.b=t2.a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 3 Using where +1 SIMPLE t1 ref b b 5 test.t2.a 90 Using index +show index from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 0 PRIMARY 1 a A 1000 NULL NULL BTREE NO +t1 1 b 1 b A 11 NULL NULL YES BTREE NO +t1 1 b 2 c A 25 NULL NULL YES BTREE NO +t1 1 b 3 d A 125 NULL NULL YES BTREE NO +connect user2, localhost, root,,; +show index from t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 0 PRIMARY 1 a A 1000 NULL NULL BTREE NO +t1 1 b 1 b A 22 NULL NULL YES BTREE NO +t1 1 b 2 c A 50 NULL NULL YES BTREE NO +t1 1 b 3 d A 250 NULL NULL YES BTREE NO +connection default; +disconnect user2; +drop table t1,t2; +set global userstat=@save_userstat; +set global innodb_stats_persistent_sample_pages=@save_ispsp; +set @@optimizer_adjust_secondary_key_costs=default; diff -Nru mariadb-10.11.6/mysql-test/main/secondary_key_costs.test mariadb-10.11.9/mysql-test/main/secondary_key_costs.test --- mariadb-10.11.6/mysql-test/main/secondary_key_costs.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/secondary_key_costs.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,112 @@ +--source include/have_sequence.inc +--source include/not_embedded.inc +--source include/have_innodb.inc +# Testcase for MDEV-33306 takes ~6 minutes with valgrind: +--source include/not_valgrind.inc + +# +# Show the costs for rowid filter +# + +create table t1 ( + pk int primary key auto_increment, + nm varchar(32), + fl1 tinyint default 0, + fl2 tinyint default 0, + index idx1(nm, fl1), + index idx2(fl2) +) engine=myisam; + +create table name ( + pk int primary key auto_increment, + nm bigint +) engine=myisam; + +create table flag2 ( + pk int primary key auto_increment, + fl2 tinyint +) engine=myisam; + +insert into name(nm) select seq from seq_1_to_1000 order by rand(17); +insert into flag2(fl2) select seq mod 2 from seq_1_to_1000 order by rand(19); + +insert into t1(nm,fl2) + select nm, fl2 from name, flag2 where name.pk = flag2.pk; + +analyze table t1 persistent for all; + +--disable_ps_protocol +set optimizer_trace="enabled=on"; +set optimizer_switch='rowid_filter=on'; +set statement optimizer_adjust_secondary_key_costs=0 for +explain select * from t1 where nm like '500%' AND fl2 = 0; +set @trace=(select trace from information_schema.optimizer_trace); +select json_detailed(json_extract(@trace, '$**.considered_access_paths')); + +--echo +--echo The following trace should have a different rowid_filter_key cost +--echo +set statement optimizer_adjust_secondary_key_costs=2 for +explain select * from t1 where nm like '500%' AND fl2 = 0; +set @trace=(select trace from information_schema.optimizer_trace); +select json_detailed(json_extract(@trace, '$**.considered_access_paths')); + +--enable_ps_protocol + +drop table t1, name, flag2; + +select @@optimizer_adjust_secondary_key_costs; +set @@optimizer_adjust_secondary_key_costs=7; +select @@optimizer_adjust_secondary_key_costs; +set @@optimizer_adjust_secondary_key_costs=default; + +--echo # +--echo # MDEV-33306 Optimizer choosing incorrect index in 10.6, 10.5 but not in 10.4 +--echo # + +create table t1 (a int primary key, b int, c int, d int, key(b),key(c)) engine=innodb; +insert into t1 select seq, mod(seq,10), mod(seq,2), seq from seq_1_to_50000; +--replace_column 9 # +explain select b, sum(d) from t1 where c=0 group by b; +select b, sum(d) from t1 where c=0 group by b; +set @@optimizer_adjust_secondary_key_costs="disable_forced_index_in_group_by"; +--replace_column 9 # +explain select b, sum(d) from t1 where c=0 group by b; +select b, sum(d) from t1 where c=0 group by b; +drop table t1; + +--echo # +--echo # MDEV-34664: fix_innodb_cardinality +--echo # + +set @save_userstat=@@global.userstat; +set @save_ispsp=@@global.innodb_stats_persistent_sample_pages; +set @@global.innodb_stats_persistent_sample_pages=20; +set @@global.userstat=on; +set use_stat_tables=PREFERABLY_FOR_QUERIES; + +create or replace table t1 (a int primary key, b int, c int, d int, key(b,c,d)) engine=innodb; +insert into t1 select seq,seq/100,seq/60,seq/10 from seq_1_to_1000; +create or replace table t2 (a int); +insert into t2 values (1),(2),(3); +analyze table t1; +select count(distinct b),count(distinct b,c), count(distinct b,c,d) from t1; +show index from t1; +explain select * from t1,t2 where t1.b=t2.a; +set @@optimizer_adjust_secondary_key_costs=8; +explain select * from t1,t2 where t1.b=t2.a; +show index from t1; +# Flush tables or show index is needed to refresh the data in table share +flush tables; +explain select * from t1,t2 where t1.b=t2.a; +show index from t1; +# Check that the option does not affect other usage +connect (user2, localhost, root,,); +show index from t1; +connection default; +disconnect user2; +drop table t1,t2; +set global userstat=@save_userstat; +set global innodb_stats_persistent_sample_pages=@save_ispsp; + +set @@optimizer_adjust_secondary_key_costs=default; diff -Nru mariadb-10.11.6/mysql-test/main/selectivity_innodb_notembedded.result mariadb-10.11.9/mysql-test/main/selectivity_innodb_notembedded.result --- mariadb-10.11.6/mysql-test/main/selectivity_innodb_notembedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/selectivity_innodb_notembedded.result 2024-08-03 07:29:57.000000000 +0000 @@ -88,15 +88,142 @@ ] set optimizer_trace=@tmp; drop table t0,t1,t10; -set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; set histogram_size=@save_histogram_size; -set use_stat_tables= @save_use_stat_tables; # # End of 10.4 tests # # +# MDEV-33314: Crash inside calculate_cond_selectivity_for_table() with many columns +# +set optimizer_use_condition_selectivity= 4; +set use_stat_tables= preferably; +# +# create table t1 (col0 int, col1 int, col2 int, ...); +# +$create_tbl; +# +# insert into t1 select seq, ... seq from seq_1_to_10; +# +$insert_cmd; +analyze table t1 persistent for all; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +set @trace_tmp=@@optimizer_trace; +set optimizer_trace=1; +# +# Basic testcase: don't crash for many-column selectivity +# explain extended select * from t1 where col0>1 and col1>1 and col2>1 and ... +# +$query_tbl; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 100, + "filtered": 53.32928848, + "attached_condition": "t1.col0 > 1 and t1.col1 > 1 and t1.col2 > 1 and t1.col3 > 1 and t1.col4 > 1 and t1.col5 > 1 and t1.col6 > 1 and t1.col7 > 1 and t1.col8 > 1 and t1.col9 > 1 and t1.col10 > 1 and t1.col11 > 1 and t1.col12 > 1 and t1.col13 > 1 and t1.col14 > 1 and t1.col15 > 1 and t1.col16 > 1 and t1.col17 > 1 and t1.col18 > 1 and t1.col19 > 1 and t1.col20 > 1 and t1.col21 > 1 and t1.col22 > 1 and t1.col23 > 1 and t1.col24 > 1 and t1.col25 > 1 and t1.col26 > 1 and t1.col27 > 1 and t1.col28 > 1 and t1.col29 > 1 and t1.col30 > 1 and t1.col31 > 1 and t1.col32 > 1 and t1.col33 > 1 and t1.col34 > 1 and t1.col35 > 1 and t1.col36 > 1 and t1.col37 > 1 and t1.col38 > 1 and t1.col39 > 1 and t1.col40 > 1 and t1.col41 > 1 and t1.col42 > 1 and t1.col43 > 1 and t1.col44 > 1 and t1.col45 > 1 and t1.col46 > 1 and t1.col47 > 1 and t1.col48 > 1 and t1.col49 > 1 and t1.col50 > 1 and t1.col51 > 1 and t1.col52 > 1 and t1.col53 > 1 and t1.col54 > 1 and t1.col55 > 1 and t1.col56 > 1 and t1.col57 > 1 and t1.col58 > 1 and t1.col59 > 1 and t1.col60 > 1 and t1.col61 > 1 and t1.col62 > 1 and t1.col63 > 1 and t1.col64 > 1 and t1.col65 > 1 and t1.col66 > 1 and t1.col67 > 1 and t1.col68 > 1 and t1.col69 > 1 and t1.col70 > 1 and t1.col71 > 1 and t1.col72 > 1 and t1.col73 > 1 and t1.col74 > 1 and t1.col75 > 1 and t1.col76 > 1 and t1.col77 > 1 and t1.col78 > 1 and t1.col79 > 1 and t1.col80 > 1 and t1.col81 > 1 and t1.col82 > 1 and t1.col83 > 1 and t1.col84 > 1 and t1.col85 > 1 and t1.col86 > 1 and t1.col87 > 1 and t1.col88 > 1 and t1.col89 > 1 and t1.col90 > 1 and t1.col91 > 1 and t1.col92 > 1 and t1.col93 > 1 and t1.col94 > 1 and t1.col95 > 1 and t1.col96 > 1 and t1.col97 > 1 and t1.col98 > 1 and t1.col99 > 1 and t1.col100 > 1 and t1.col101 > 1 and t1.col102 > 1 and t1.col103 > 1 and t1.col104 > 1 and t1.col105 > 1 and t1.col106 > 1 and t1.col107 > 1 and t1.col108 > 1 and t1.col109 > 1 and t1.col110 > 1 and t1.col111 > 1 and t1.col112 > 1 and t1.col113 > 1 and t1.col114 > 1 and t1.col115 > 1 and t1.col116 > 1 and t1.col117 > 1 and t1.col118 > 1 and t1.col119 > 1 and t1.col120 > 1 and t1.col121 > 1 and t1.col122 > 1 and t1.col123 > 1 and t1.col124 > 1 and t1.col125 > 1 and t1.col126 > 1 and t1.col127 > 1 and t1.col128 > 1 and t1.col129 > 1 and t1.col130 > 1 and t1.col131 > 1 and t1.col132 > 1 and t1.col133 > 1 and t1.col134 > 1 and t1.col135 > 1 and t1.col136 > 1 and t1.col137 > 1 and t1.col138 > 1 and t1.col139 > 1 and t1.col140 > 1 and t1.col141 > 1 and t1.col142 > 1 and t1.col143 > 1 and t1.col144 > 1 and t1.col145 > 1 and t1.col146 > 1 and t1.col147 > 1 and t1.col148 > 1 and t1.col149 > 1 and t1.col150 > 1 and t1.col151 > 1 and t1.col152 > 1 and t1.col153 > 1 and t1.col154 > 1 and t1.col155 > 1 and t1.col156 > 1 and t1.col157 > 1 and t1.col158 > 1 and t1.col159 > 1" + } + } + ] + } +} +select +json_detailed(json_extract(trace,'$**.selectivity_for_columns[0]')) as JS +from +information_schema.optimizer_trace; +JS +[ + { + "column_name": "col0", + "ranges": + ["1 < col0"], + "selectivity_from_histogram": 0.996078431 + } +] +$query_tbl; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 100, + "filtered": 53.32928848, + "attached_condition": "t1.col0 > 1 and t1.col1 > 1 and t1.col2 > 1 and t1.col3 > 1 and t1.col4 > 1 and t1.col5 > 1 and t1.col6 > 1 and t1.col7 > 1 and t1.col8 > 1 and t1.col9 > 1 and t1.col10 > 1 and t1.col11 > 1 and t1.col12 > 1 and t1.col13 > 1 and t1.col14 > 1 and t1.col15 > 1 and t1.col16 > 1 and t1.col17 > 1 and t1.col18 > 1 and t1.col19 > 1 and t1.col20 > 1 and t1.col21 > 1 and t1.col22 > 1 and t1.col23 > 1 and t1.col24 > 1 and t1.col25 > 1 and t1.col26 > 1 and t1.col27 > 1 and t1.col28 > 1 and t1.col29 > 1 and t1.col30 > 1 and t1.col31 > 1 and t1.col32 > 1 and t1.col33 > 1 and t1.col34 > 1 and t1.col35 > 1 and t1.col36 > 1 and t1.col37 > 1 and t1.col38 > 1 and t1.col39 > 1 and t1.col40 > 1 and t1.col41 > 1 and t1.col42 > 1 and t1.col43 > 1 and t1.col44 > 1 and t1.col45 > 1 and t1.col46 > 1 and t1.col47 > 1 and t1.col48 > 1 and t1.col49 > 1 and t1.col50 > 1 and t1.col51 > 1 and t1.col52 > 1 and t1.col53 > 1 and t1.col54 > 1 and t1.col55 > 1 and t1.col56 > 1 and t1.col57 > 1 and t1.col58 > 1 and t1.col59 > 1 and t1.col60 > 1 and t1.col61 > 1 and t1.col62 > 1 and t1.col63 > 1 and t1.col64 > 1 and t1.col65 > 1 and t1.col66 > 1 and t1.col67 > 1 and t1.col68 > 1 and t1.col69 > 1 and t1.col70 > 1 and t1.col71 > 1 and t1.col72 > 1 and t1.col73 > 1 and t1.col74 > 1 and t1.col75 > 1 and t1.col76 > 1 and t1.col77 > 1 and t1.col78 > 1 and t1.col79 > 1 and t1.col80 > 1 and t1.col81 > 1 and t1.col82 > 1 and t1.col83 > 1 and t1.col84 > 1 and t1.col85 > 1 and t1.col86 > 1 and t1.col87 > 1 and t1.col88 > 1 and t1.col89 > 1 and t1.col90 > 1 and t1.col91 > 1 and t1.col92 > 1 and t1.col93 > 1 and t1.col94 > 1 and t1.col95 > 1 and t1.col96 > 1 and t1.col97 > 1 and t1.col98 > 1 and t1.col99 > 1 and t1.col100 > 1 and t1.col101 > 1 and t1.col102 > 1 and t1.col103 > 1 and t1.col104 > 1 and t1.col105 > 1 and t1.col106 > 1 and t1.col107 > 1 and t1.col108 > 1 and t1.col109 > 1 and t1.col110 > 1 and t1.col111 > 1 and t1.col112 > 1 and t1.col113 > 1 and t1.col114 > 1 and t1.col115 > 1 and t1.col116 > 1 and t1.col117 > 1 and t1.col118 > 1 and t1.col119 > 1 and t1.col120 > 1 and t1.col121 > 1 and t1.col122 > 1 and t1.col123 > 1 and t1.col124 > 1 and t1.col125 > 1 and t1.col126 > 1 and t1.col127 > 1 and t1.col128 > 1 and t1.col129 > 1 and t1.col130 > 1 and t1.col131 > 1 and t1.col132 > 1 and t1.col133 > 1 and t1.col134 > 1 and t1.col135 > 1 and t1.col136 > 1 and t1.col137 > 1 and t1.col138 > 1 and t1.col139 > 1 and t1.col140 > 1 and t1.col141 > 1 and t1.col142 > 1 and t1.col143 > 1 and t1.col144 > 1 and t1.col145 > 1 and t1.col146 > 1 and t1.col147 > 1 and t1.col148 > 1 and t1.col149 > 1 and t1.col150 > 1 and t1.col151 > 1 and t1.col152 > 1 and t1.col153 > 1 and t1.col154 > 1 and t1.col155 > 1 and t1.col156 > 1 and t1.col157 > 1 and t1.col158 > 1 and t1.col159 > 1" + } + } + ] + } +} +select +json_detailed(json_extract(trace,'$**.selectivity_for_columns[159]')) as JS +from +information_schema.optimizer_trace; +JS +[ + { + "column_name": "col159", + "ranges": + ["1 < col159"], + "selectivity_from_histogram": 0.996078431 + } +] +# +# Check if not being able to infer anything for the first MAX_KEY +# columns doesn't prevent further inferences. +# +# explain extended select * from t1 +# where (1>2 or col0>1 or col1>1 or ...) and col99>1 +# +$query_tbl; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 100, + "filtered": 99.60784149, + "attached_condition": "(t1.col1 > 1 or t1.col2 > 1 or t1.col3 > 1 or t1.col4 > 1 or t1.col5 > 1 or t1.col6 > 1 or t1.col7 > 1 or t1.col8 > 1 or t1.col9 > 1 or t1.col10 > 1 or t1.col11 > 1 or t1.col12 > 1 or t1.col13 > 1 or t1.col14 > 1 or t1.col15 > 1 or t1.col16 > 1 or t1.col17 > 1 or t1.col18 > 1 or t1.col19 > 1 or t1.col20 > 1 or t1.col21 > 1 or t1.col22 > 1 or t1.col23 > 1 or t1.col24 > 1 or t1.col25 > 1 or t1.col26 > 1 or t1.col27 > 1 or t1.col28 > 1 or t1.col29 > 1 or t1.col30 > 1 or t1.col31 > 1 or t1.col32 > 1 or t1.col33 > 1 or t1.col34 > 1 or t1.col35 > 1 or t1.col36 > 1 or t1.col37 > 1 or t1.col38 > 1 or t1.col39 > 1 or t1.col40 > 1 or t1.col41 > 1 or t1.col42 > 1 or t1.col43 > 1 or t1.col44 > 1 or t1.col45 > 1 or t1.col46 > 1 or t1.col47 > 1 or t1.col48 > 1 or t1.col49 > 1 or t1.col50 > 1 or t1.col51 > 1 or t1.col52 > 1 or t1.col53 > 1 or t1.col54 > 1 or t1.col55 > 1 or t1.col56 > 1 or t1.col57 > 1 or t1.col58 > 1 or t1.col59 > 1 or t1.col60 > 1 or t1.col61 > 1 or t1.col62 > 1 or t1.col63 > 1 or t1.col64 > 1 or t1.col65 > 1 or t1.col66 > 1 or t1.col67 > 1 or t1.col68 > 1 or t1.col69 > 1 or t1.col70 > 1 or t1.col71 > 1 or t1.col72 > 1 or t1.col73 > 1 or t1.col74 > 1 or t1.col75 > 1 or t1.col76 > 1 or t1.col77 > 1 or t1.col78 > 1 or t1.col79 > 1 or t1.col80 > 1 or t1.col81 > 1 or t1.col82 > 1 or t1.col83 > 1 or t1.col84 > 1 or t1.col85 > 1 or t1.col86 > 1 or t1.col87 > 1 or t1.col88 > 1 or t1.col89 > 1 or t1.col90 > 1 or t1.col91 > 1 or t1.col92 > 1 or t1.col93 > 1 or t1.col94 > 1 or t1.col95 > 1 or t1.col96 > 1 or t1.col97 > 1 or t1.col98 > 1 or t1.col99 > 1 or t1.col100 > 1 or t1.col101 > 1 or t1.col102 > 1 or t1.col103 > 1 or t1.col104 > 1 or t1.col105 > 1 or t1.col106 > 1 or t1.col107 > 1 or t1.col108 > 1 or t1.col109 > 1 or t1.col110 > 1 or t1.col111 > 1 or t1.col112 > 1 or t1.col113 > 1 or t1.col114 > 1 or t1.col115 > 1 or t1.col116 > 1 or t1.col117 > 1 or t1.col118 > 1 or t1.col119 > 1 or t1.col120 > 1 or t1.col121 > 1 or t1.col122 > 1 or t1.col123 > 1 or t1.col124 > 1 or t1.col125 > 1 or t1.col126 > 1 or t1.col127 > 1 or t1.col128 > 1 or t1.col129 > 1 or t1.col130 > 1 or t1.col131 > 1 or t1.col132 > 1 or t1.col133 > 1 or t1.col134 > 1 or t1.col135 > 1 or t1.col136 > 1 or t1.col137 > 1 or t1.col138 > 1 or t1.col139 > 1 or t1.col140 > 1 or t1.col141 > 1 or t1.col142 > 1 or t1.col143 > 1 or t1.col144 > 1 or t1.col145 > 1 or t1.col146 > 1 or t1.col147 > 1 or t1.col148 > 1 or t1.col149 > 1 or t1.col150 > 1 or t1.col151 > 1 or t1.col152 > 1 or t1.col153 > 1 or t1.col154 > 1 or t1.col155 > 1 or t1.col156 > 1 or t1.col157 > 1 or t1.col158 > 1) and t1.col159 > 1" + } + } + ] + } +} +select +json_detailed(json_extract(trace,'$**.selectivity_for_columns')) as JS +from +information_schema.optimizer_trace; +JS +[ + [ + { + "column_name": "col159", + "ranges": + ["1 < col159"], + "selectivity_from_histogram": 0.996078431 + } + ] +] +set optimizer_trace=@trace_tmp; +drop table t1; +# # Clean up # +set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; +set use_stat_tables= @save_use_stat_tables; set @@global.histogram_size=@save_histogram_size; set optimizer_switch=@save_optimizer_switch_for_selectivity_test; SET SESSION STORAGE_ENGINE=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/selectivity_notembedded.result mariadb-10.11.9/mysql-test/main/selectivity_notembedded.result --- mariadb-10.11.6/mysql-test/main/selectivity_notembedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/selectivity_notembedded.result 2024-08-03 07:29:57.000000000 +0000 @@ -83,13 +83,140 @@ ] set optimizer_trace=@tmp; drop table t0,t1,t10; -set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; set histogram_size=@save_histogram_size; -set use_stat_tables= @save_use_stat_tables; # # End of 10.4 tests # # +# MDEV-33314: Crash inside calculate_cond_selectivity_for_table() with many columns +# +set optimizer_use_condition_selectivity= 4; +set use_stat_tables= preferably; +# +# create table t1 (col0 int, col1 int, col2 int, ...); +# +$create_tbl; +# +# insert into t1 select seq, ... seq from seq_1_to_10; +# +$insert_cmd; +analyze table t1 persistent for all; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +set @trace_tmp=@@optimizer_trace; +set optimizer_trace=1; +# +# Basic testcase: don't crash for many-column selectivity +# explain extended select * from t1 where col0>1 and col1>1 and col2>1 and ... +# +$query_tbl; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 100, + "filtered": 53.32928848, + "attached_condition": "t1.col0 > 1 and t1.col1 > 1 and t1.col2 > 1 and t1.col3 > 1 and t1.col4 > 1 and t1.col5 > 1 and t1.col6 > 1 and t1.col7 > 1 and t1.col8 > 1 and t1.col9 > 1 and t1.col10 > 1 and t1.col11 > 1 and t1.col12 > 1 and t1.col13 > 1 and t1.col14 > 1 and t1.col15 > 1 and t1.col16 > 1 and t1.col17 > 1 and t1.col18 > 1 and t1.col19 > 1 and t1.col20 > 1 and t1.col21 > 1 and t1.col22 > 1 and t1.col23 > 1 and t1.col24 > 1 and t1.col25 > 1 and t1.col26 > 1 and t1.col27 > 1 and t1.col28 > 1 and t1.col29 > 1 and t1.col30 > 1 and t1.col31 > 1 and t1.col32 > 1 and t1.col33 > 1 and t1.col34 > 1 and t1.col35 > 1 and t1.col36 > 1 and t1.col37 > 1 and t1.col38 > 1 and t1.col39 > 1 and t1.col40 > 1 and t1.col41 > 1 and t1.col42 > 1 and t1.col43 > 1 and t1.col44 > 1 and t1.col45 > 1 and t1.col46 > 1 and t1.col47 > 1 and t1.col48 > 1 and t1.col49 > 1 and t1.col50 > 1 and t1.col51 > 1 and t1.col52 > 1 and t1.col53 > 1 and t1.col54 > 1 and t1.col55 > 1 and t1.col56 > 1 and t1.col57 > 1 and t1.col58 > 1 and t1.col59 > 1 and t1.col60 > 1 and t1.col61 > 1 and t1.col62 > 1 and t1.col63 > 1 and t1.col64 > 1 and t1.col65 > 1 and t1.col66 > 1 and t1.col67 > 1 and t1.col68 > 1 and t1.col69 > 1 and t1.col70 > 1 and t1.col71 > 1 and t1.col72 > 1 and t1.col73 > 1 and t1.col74 > 1 and t1.col75 > 1 and t1.col76 > 1 and t1.col77 > 1 and t1.col78 > 1 and t1.col79 > 1 and t1.col80 > 1 and t1.col81 > 1 and t1.col82 > 1 and t1.col83 > 1 and t1.col84 > 1 and t1.col85 > 1 and t1.col86 > 1 and t1.col87 > 1 and t1.col88 > 1 and t1.col89 > 1 and t1.col90 > 1 and t1.col91 > 1 and t1.col92 > 1 and t1.col93 > 1 and t1.col94 > 1 and t1.col95 > 1 and t1.col96 > 1 and t1.col97 > 1 and t1.col98 > 1 and t1.col99 > 1 and t1.col100 > 1 and t1.col101 > 1 and t1.col102 > 1 and t1.col103 > 1 and t1.col104 > 1 and t1.col105 > 1 and t1.col106 > 1 and t1.col107 > 1 and t1.col108 > 1 and t1.col109 > 1 and t1.col110 > 1 and t1.col111 > 1 and t1.col112 > 1 and t1.col113 > 1 and t1.col114 > 1 and t1.col115 > 1 and t1.col116 > 1 and t1.col117 > 1 and t1.col118 > 1 and t1.col119 > 1 and t1.col120 > 1 and t1.col121 > 1 and t1.col122 > 1 and t1.col123 > 1 and t1.col124 > 1 and t1.col125 > 1 and t1.col126 > 1 and t1.col127 > 1 and t1.col128 > 1 and t1.col129 > 1 and t1.col130 > 1 and t1.col131 > 1 and t1.col132 > 1 and t1.col133 > 1 and t1.col134 > 1 and t1.col135 > 1 and t1.col136 > 1 and t1.col137 > 1 and t1.col138 > 1 and t1.col139 > 1 and t1.col140 > 1 and t1.col141 > 1 and t1.col142 > 1 and t1.col143 > 1 and t1.col144 > 1 and t1.col145 > 1 and t1.col146 > 1 and t1.col147 > 1 and t1.col148 > 1 and t1.col149 > 1 and t1.col150 > 1 and t1.col151 > 1 and t1.col152 > 1 and t1.col153 > 1 and t1.col154 > 1 and t1.col155 > 1 and t1.col156 > 1 and t1.col157 > 1 and t1.col158 > 1 and t1.col159 > 1" + } + } + ] + } +} +select +json_detailed(json_extract(trace,'$**.selectivity_for_columns[0]')) as JS +from +information_schema.optimizer_trace; +JS +[ + { + "column_name": "col0", + "ranges": + ["1 < col0"], + "selectivity_from_histogram": 0.996078431 + } +] +$query_tbl; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 100, + "filtered": 53.32928848, + "attached_condition": "t1.col0 > 1 and t1.col1 > 1 and t1.col2 > 1 and t1.col3 > 1 and t1.col4 > 1 and t1.col5 > 1 and t1.col6 > 1 and t1.col7 > 1 and t1.col8 > 1 and t1.col9 > 1 and t1.col10 > 1 and t1.col11 > 1 and t1.col12 > 1 and t1.col13 > 1 and t1.col14 > 1 and t1.col15 > 1 and t1.col16 > 1 and t1.col17 > 1 and t1.col18 > 1 and t1.col19 > 1 and t1.col20 > 1 and t1.col21 > 1 and t1.col22 > 1 and t1.col23 > 1 and t1.col24 > 1 and t1.col25 > 1 and t1.col26 > 1 and t1.col27 > 1 and t1.col28 > 1 and t1.col29 > 1 and t1.col30 > 1 and t1.col31 > 1 and t1.col32 > 1 and t1.col33 > 1 and t1.col34 > 1 and t1.col35 > 1 and t1.col36 > 1 and t1.col37 > 1 and t1.col38 > 1 and t1.col39 > 1 and t1.col40 > 1 and t1.col41 > 1 and t1.col42 > 1 and t1.col43 > 1 and t1.col44 > 1 and t1.col45 > 1 and t1.col46 > 1 and t1.col47 > 1 and t1.col48 > 1 and t1.col49 > 1 and t1.col50 > 1 and t1.col51 > 1 and t1.col52 > 1 and t1.col53 > 1 and t1.col54 > 1 and t1.col55 > 1 and t1.col56 > 1 and t1.col57 > 1 and t1.col58 > 1 and t1.col59 > 1 and t1.col60 > 1 and t1.col61 > 1 and t1.col62 > 1 and t1.col63 > 1 and t1.col64 > 1 and t1.col65 > 1 and t1.col66 > 1 and t1.col67 > 1 and t1.col68 > 1 and t1.col69 > 1 and t1.col70 > 1 and t1.col71 > 1 and t1.col72 > 1 and t1.col73 > 1 and t1.col74 > 1 and t1.col75 > 1 and t1.col76 > 1 and t1.col77 > 1 and t1.col78 > 1 and t1.col79 > 1 and t1.col80 > 1 and t1.col81 > 1 and t1.col82 > 1 and t1.col83 > 1 and t1.col84 > 1 and t1.col85 > 1 and t1.col86 > 1 and t1.col87 > 1 and t1.col88 > 1 and t1.col89 > 1 and t1.col90 > 1 and t1.col91 > 1 and t1.col92 > 1 and t1.col93 > 1 and t1.col94 > 1 and t1.col95 > 1 and t1.col96 > 1 and t1.col97 > 1 and t1.col98 > 1 and t1.col99 > 1 and t1.col100 > 1 and t1.col101 > 1 and t1.col102 > 1 and t1.col103 > 1 and t1.col104 > 1 and t1.col105 > 1 and t1.col106 > 1 and t1.col107 > 1 and t1.col108 > 1 and t1.col109 > 1 and t1.col110 > 1 and t1.col111 > 1 and t1.col112 > 1 and t1.col113 > 1 and t1.col114 > 1 and t1.col115 > 1 and t1.col116 > 1 and t1.col117 > 1 and t1.col118 > 1 and t1.col119 > 1 and t1.col120 > 1 and t1.col121 > 1 and t1.col122 > 1 and t1.col123 > 1 and t1.col124 > 1 and t1.col125 > 1 and t1.col126 > 1 and t1.col127 > 1 and t1.col128 > 1 and t1.col129 > 1 and t1.col130 > 1 and t1.col131 > 1 and t1.col132 > 1 and t1.col133 > 1 and t1.col134 > 1 and t1.col135 > 1 and t1.col136 > 1 and t1.col137 > 1 and t1.col138 > 1 and t1.col139 > 1 and t1.col140 > 1 and t1.col141 > 1 and t1.col142 > 1 and t1.col143 > 1 and t1.col144 > 1 and t1.col145 > 1 and t1.col146 > 1 and t1.col147 > 1 and t1.col148 > 1 and t1.col149 > 1 and t1.col150 > 1 and t1.col151 > 1 and t1.col152 > 1 and t1.col153 > 1 and t1.col154 > 1 and t1.col155 > 1 and t1.col156 > 1 and t1.col157 > 1 and t1.col158 > 1 and t1.col159 > 1" + } + } + ] + } +} +select +json_detailed(json_extract(trace,'$**.selectivity_for_columns[159]')) as JS +from +information_schema.optimizer_trace; +JS +[ + { + "column_name": "col159", + "ranges": + ["1 < col159"], + "selectivity_from_histogram": 0.996078431 + } +] +# +# Check if not being able to infer anything for the first MAX_KEY +# columns doesn't prevent further inferences. +# +# explain extended select * from t1 +# where (1>2 or col0>1 or col1>1 or ...) and col99>1 +# +$query_tbl; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 100, + "filtered": 99.60784149, + "attached_condition": "(t1.col1 > 1 or t1.col2 > 1 or t1.col3 > 1 or t1.col4 > 1 or t1.col5 > 1 or t1.col6 > 1 or t1.col7 > 1 or t1.col8 > 1 or t1.col9 > 1 or t1.col10 > 1 or t1.col11 > 1 or t1.col12 > 1 or t1.col13 > 1 or t1.col14 > 1 or t1.col15 > 1 or t1.col16 > 1 or t1.col17 > 1 or t1.col18 > 1 or t1.col19 > 1 or t1.col20 > 1 or t1.col21 > 1 or t1.col22 > 1 or t1.col23 > 1 or t1.col24 > 1 or t1.col25 > 1 or t1.col26 > 1 or t1.col27 > 1 or t1.col28 > 1 or t1.col29 > 1 or t1.col30 > 1 or t1.col31 > 1 or t1.col32 > 1 or t1.col33 > 1 or t1.col34 > 1 or t1.col35 > 1 or t1.col36 > 1 or t1.col37 > 1 or t1.col38 > 1 or t1.col39 > 1 or t1.col40 > 1 or t1.col41 > 1 or t1.col42 > 1 or t1.col43 > 1 or t1.col44 > 1 or t1.col45 > 1 or t1.col46 > 1 or t1.col47 > 1 or t1.col48 > 1 or t1.col49 > 1 or t1.col50 > 1 or t1.col51 > 1 or t1.col52 > 1 or t1.col53 > 1 or t1.col54 > 1 or t1.col55 > 1 or t1.col56 > 1 or t1.col57 > 1 or t1.col58 > 1 or t1.col59 > 1 or t1.col60 > 1 or t1.col61 > 1 or t1.col62 > 1 or t1.col63 > 1 or t1.col64 > 1 or t1.col65 > 1 or t1.col66 > 1 or t1.col67 > 1 or t1.col68 > 1 or t1.col69 > 1 or t1.col70 > 1 or t1.col71 > 1 or t1.col72 > 1 or t1.col73 > 1 or t1.col74 > 1 or t1.col75 > 1 or t1.col76 > 1 or t1.col77 > 1 or t1.col78 > 1 or t1.col79 > 1 or t1.col80 > 1 or t1.col81 > 1 or t1.col82 > 1 or t1.col83 > 1 or t1.col84 > 1 or t1.col85 > 1 or t1.col86 > 1 or t1.col87 > 1 or t1.col88 > 1 or t1.col89 > 1 or t1.col90 > 1 or t1.col91 > 1 or t1.col92 > 1 or t1.col93 > 1 or t1.col94 > 1 or t1.col95 > 1 or t1.col96 > 1 or t1.col97 > 1 or t1.col98 > 1 or t1.col99 > 1 or t1.col100 > 1 or t1.col101 > 1 or t1.col102 > 1 or t1.col103 > 1 or t1.col104 > 1 or t1.col105 > 1 or t1.col106 > 1 or t1.col107 > 1 or t1.col108 > 1 or t1.col109 > 1 or t1.col110 > 1 or t1.col111 > 1 or t1.col112 > 1 or t1.col113 > 1 or t1.col114 > 1 or t1.col115 > 1 or t1.col116 > 1 or t1.col117 > 1 or t1.col118 > 1 or t1.col119 > 1 or t1.col120 > 1 or t1.col121 > 1 or t1.col122 > 1 or t1.col123 > 1 or t1.col124 > 1 or t1.col125 > 1 or t1.col126 > 1 or t1.col127 > 1 or t1.col128 > 1 or t1.col129 > 1 or t1.col130 > 1 or t1.col131 > 1 or t1.col132 > 1 or t1.col133 > 1 or t1.col134 > 1 or t1.col135 > 1 or t1.col136 > 1 or t1.col137 > 1 or t1.col138 > 1 or t1.col139 > 1 or t1.col140 > 1 or t1.col141 > 1 or t1.col142 > 1 or t1.col143 > 1 or t1.col144 > 1 or t1.col145 > 1 or t1.col146 > 1 or t1.col147 > 1 or t1.col148 > 1 or t1.col149 > 1 or t1.col150 > 1 or t1.col151 > 1 or t1.col152 > 1 or t1.col153 > 1 or t1.col154 > 1 or t1.col155 > 1 or t1.col156 > 1 or t1.col157 > 1 or t1.col158 > 1) and t1.col159 > 1" + } + } + ] + } +} +select +json_detailed(json_extract(trace,'$**.selectivity_for_columns')) as JS +from +information_schema.optimizer_trace; +JS +[ + [ + { + "column_name": "col159", + "ranges": + ["1 < col159"], + "selectivity_from_histogram": 0.996078431 + } + ] +] +set optimizer_trace=@trace_tmp; +drop table t1; +# # Clean up # +set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; +set use_stat_tables= @save_use_stat_tables; set @@global.histogram_size=@save_histogram_size; diff -Nru mariadb-10.11.6/mysql-test/main/selectivity_notembedded.test mariadb-10.11.9/mysql-test/main/selectivity_notembedded.test --- mariadb-10.11.6/mysql-test/main/selectivity_notembedded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/selectivity_notembedded.test 2024-08-03 07:29:57.000000000 +0000 @@ -98,24 +98,132 @@ set optimizer_trace=1; explain select * from t10 where a in (91303); +#Enable after fix MDEV-32034 +--disable_view_protocol --echo # Must have selectivity_from_histogram <= 1.0: select json_detailed(json_extract(trace, '$**.selectivity_for_columns')) as sel from information_schema.optimizer_trace; +--enable_view_protocol set optimizer_trace=@tmp; drop table t0,t1,t10; -set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; set histogram_size=@save_histogram_size; -set use_stat_tables= @save_use_stat_tables; - --echo # --echo # End of 10.4 tests --echo # --echo # +--echo # MDEV-33314: Crash inside calculate_cond_selectivity_for_table() with many columns +--echo # +set optimizer_use_condition_selectivity= 4; +set use_stat_tables= preferably; + +let $N_CONDS=160; +let $N_LAST_COND=159; +--echo # +--echo # create table t1 (col0 int, col1 int, col2 int, ...); +--echo # +let $create_tbl= create table t1 ( col0 int; +let $i=1; + +while ($i < $N_CONDS) { + let $create_tbl= $create_tbl, col$i int; + let $i=`select $i + 1`; +} + +let $create_tbl= $create_tbl ); +#echo $create_tbl; +evalp $create_tbl; + + +--echo # +--echo # insert into t1 select seq, ... seq from seq_1_to_10; +--echo # +let $insert_cmd= insert into t1 select seq; +let $i=1; + +while ($i < $N_CONDS) { + let $insert_cmd = $insert_cmd ,seq; + let $i=`select $i + 1`; +} +let $insert_cmd= $insert_cmd from seq_1_to_100; + +# echo $insert_cmd; +evalp $insert_cmd; + +analyze table t1 persistent for all; +set @trace_tmp=@@optimizer_trace; +set optimizer_trace=1; + +--echo # +--echo # Basic testcase: don't crash for many-column selectivity +--echo # explain extended select * from t1 where col0>1 and col1>1 and col2>1 and ... +--echo # +let $query_tbl= explain format=json select * from t1 where col0>1; + +let $i=1; +while ($i < $N_CONDS) { + let $query_tbl= $query_tbl and col$i>1; + let $i=`select $i + 1`; +} + +#echo $query_tbl; +evalp $query_tbl; + +#Enable after fix MDEV-32034 +--disable_view_protocol +select + json_detailed(json_extract(trace,'$**.selectivity_for_columns[0]')) as JS +from + information_schema.optimizer_trace; + +--enable_view_protocol + +evalp $query_tbl; +#Enable after fix MDEV-32034 +--disable_view_protocol +eval select + json_detailed(json_extract(trace,'\$**.selectivity_for_columns[$N_LAST_COND]')) as JS +from + information_schema.optimizer_trace; +--enable_view_protocol + +--echo # +--echo # Check if not being able to infer anything for the first MAX_KEY +--echo # columns doesn't prevent further inferences. +--echo # +--echo # explain extended select * from t1 +--echo # where (1>2 or col0>1 or col1>1 or ...) and col99>1 +--echo # +let $query_tbl= explain format=json select * from t1 where (1>2 ; + +let $i=1; +while ($i < $N_LAST_COND) { + let $query_tbl= $query_tbl or col$i>1; + let $i=`select $i + 1`; +} +let $query_tbl= $query_tbl) and col$N_LAST_COND>1; + +#echo $query_tbl; +evalp $query_tbl; + +#Enable after fix MDEV-32034 +--disable_view_protocol +select + json_detailed(json_extract(trace,'$**.selectivity_for_columns')) as JS +from + information_schema.optimizer_trace; +--enable_view_protocol + +set optimizer_trace=@trace_tmp; +drop table t1; + +--echo # --echo # Clean up --echo # --source include/restore_charset.inc +set optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; +set use_stat_tables= @save_use_stat_tables; set @@global.histogram_size=@save_histogram_size; diff -Nru mariadb-10.11.6/mysql-test/main/set_password.result mariadb-10.11.9/mysql-test/main/set_password.result --- mariadb-10.11.6/mysql-test/main/set_password.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/set_password.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,6 @@ set global secure_auth=0; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release create user natauth@localhost identified via 'mysql_native_password' using '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'; create user invalidauth@localhost identified via 'mysql_native_password' using 'invalid'; create user newpass@localhost identified by password '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'; @@ -186,6 +188,8 @@ drop user invalidauth@localhost, invalidpass@localhost, invalidpassnat@localhost,invalidmysql57auth@localhost; drop user oldauth@localhost, oldpass@localhost, oldpassold@localhost; set global secure_auth=default; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release # switching from mysql.global_priv to mysql.user create user foo@localhost identified with mysql_native_password; update mysql.user set authentication_string=password('foo'), plugin='mysql_native_password' where user='foo' and host='localhost'; diff -Nru mariadb-10.11.6/mysql-test/main/show_analyze.result mariadb-10.11.9/mysql-test/main/show_analyze.result --- mariadb-10.11.6/mysql-test/main/show_analyze.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/show_analyze.result 2024-08-03 07:29:57.000000000 +0000 @@ -207,9 +207,12 @@ SET debug_dbug=@old_debug; # Try to do SHOW ANALYZE for a query that runs a SET command: # -set @show_explain_probe_select_id=2; +create table t2 (a int); +insert into t2 values (1),(2); +set @show_explain_probe_select_id=3; SET debug_dbug='+d,show_explain_probe_join_exec_start'; -set @foo= (select max(a) from t0 where sin(a) >0); +set @foo= (select max(a) from t2 +where a + (select max(a) from t0 where t0.a>t2.a) < 10000); connection default; show analyze for $thr2; ERROR HY000: Target is not executing an operation with a query plan @@ -217,6 +220,7 @@ connection con1; ERROR 70100: Query execution was interrupted SET debug_dbug=@old_debug; +drop table t2; # # Attempt SHOW ANALYZE for an UPDATE # diff -Nru mariadb-10.11.6/mysql-test/main/show_analyze.test mariadb-10.11.9/mysql-test/main/show_analyze.test --- mariadb-10.11.6/mysql-test/main/show_analyze.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/show_analyze.test 2024-08-03 07:29:57.000000000 +0000 @@ -213,9 +213,15 @@ --echo # Try to do SHOW ANALYZE for a query that runs a SET command: --echo # -set @show_explain_probe_select_id=2; # <--- +create table t2 (a int); +insert into t2 values (1),(2); +set @show_explain_probe_select_id=3; # Stop in the subquery. SET debug_dbug='+d,show_explain_probe_join_exec_start'; -send set @foo= (select max(a) from t0 where sin(a) >0); +# t2 has 2 rows so we will stop in the subquery twice: +# - first one to serve the SHOW ANALYZE request +# - second one when waiting to be KILLed. +send set @foo= (select max(a) from t2 + where a + (select max(a) from t0 where t0.a>t2.a) < 10000); connection default; --source include/wait_condition.inc --error ER_TARGET_NOT_EXPLAINABLE @@ -225,7 +231,7 @@ --error ER_QUERY_INTERRUPTED reap; SET debug_dbug=@old_debug; - +drop table t2; --echo # --echo # Attempt SHOW ANALYZE for an UPDATE diff -Nru mariadb-10.11.6/mysql-test/main/show_check.result mariadb-10.11.9/mysql-test/main/show_check.result --- mariadb-10.11.6/mysql-test/main/show_check.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/show_check.result 2024-08-03 07:29:57.000000000 +0000 @@ -104,19 +104,19 @@ show variables like "wait_timeout%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_NAME Variable_name 253 64 12 N 4097 0 8 -def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_VALUE Value 253 2048 5 N 4097 0 8 +def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_VALUE Value 253 4096 5 N 4097 0 8 Variable_name Value wait_timeout 28800 show variables like "WAIT_timeout%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_NAME Variable_name 253 64 12 N 4097 0 8 -def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_VALUE Value 253 2048 5 N 4097 0 8 +def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_VALUE Value 253 4096 5 N 4097 0 8 Variable_name Value wait_timeout 28800 show variables like "this_doesn't_exists%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_NAME Variable_name 253 64 0 N 4097 0 8 -def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_VALUE Value 253 2048 0 N 4097 0 8 +def information_schema SESSION_VARIABLES SESSION_VARIABLES VARIABLE_VALUE Value 253 4096 0 N 4097 0 8 Variable_name Value show table status from test like "this_doesn't_exists%"; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr diff -Nru mariadb-10.11.6/mysql-test/main/show_explain.result mariadb-10.11.9/mysql-test/main/show_explain.result --- mariadb-10.11.6/mysql-test/main/show_explain.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/show_explain.result 2024-08-03 07:29:57.000000000 +0000 @@ -244,9 +244,7 @@ connection default; show explain for $thr2; ERROR HY000: Target is not executing an operation with a query plan -kill query $thr2; connection con1; -ERROR 70100: Query execution was interrupted SET debug_dbug=@old_debug; # # Attempt SHOW EXPLAIN for an UPDATE @@ -568,9 +566,14 @@ connection default; show explain for $thr2; ERROR HY000: Target is not executing an operation with a query plan -kill query $thr2; connection con1; -ERROR 70100: Query execution was interrupted +a b +8 4 +8 5 +8 6 +8 7 +8 8 +8 9 SET debug_dbug=@old_debug; DROP VIEW v1; DROP TABLE t2, t3; diff -Nru mariadb-10.11.6/mysql-test/main/show_explain.test mariadb-10.11.9/mysql-test/main/show_explain.test --- mariadb-10.11.6/mysql-test/main/show_explain.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/show_explain.test 2024-08-03 07:29:57.000000000 +0000 @@ -273,9 +273,7 @@ --source include/wait_condition.inc --error ER_TARGET_NOT_EXPLAINABLE evalp show explain for $thr2; -evalp kill query $thr2; connection con1; ---error ER_QUERY_INTERRUPTED reap; SET debug_dbug=@old_debug; @@ -504,9 +502,7 @@ --source include/wait_condition.inc --error ER_TARGET_NOT_EXPLAINABLE evalp show explain for $thr2; -evalp kill query $thr2; connection con1; ---error ER_QUERY_INTERRUPTED reap; SET debug_dbug=@old_debug; DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/main/show_explain_json.result mariadb-10.11.9/mysql-test/main/show_explain_json.result --- mariadb-10.11.6/mysql-test/main/show_explain_json.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/show_explain_json.result 2024-08-03 07:29:57.000000000 +0000 @@ -518,9 +518,12 @@ # Try to do SHOW EXPLAIN for a query that runs a SET command: # I've found experimentally that select_id==2 here... # -set @show_explain_probe_select_id=2; +create table t2 (a int); +insert into t2 values (1),(2); +set @show_explain_probe_select_id=3; SET debug_dbug='+d,show_explain_probe_join_exec_start'; -set @foo= (select max(a) from t0 where sin(a) >0); +set @foo= (select max(a) from t2 +where a + (select max(a) from t0 where t0.a>t2.a) < 10000); connection default; show explain format=JSON for $thr2; ERROR HY000: Target is not executing an operation with a query plan @@ -528,6 +531,7 @@ connection con1; ERROR 70100: Query execution was interrupted SET debug_dbug=@old_debug; +drop table t2; # # Attempt SHOW EXPLAIN for an UPDATE # diff -Nru mariadb-10.11.6/mysql-test/main/show_explain_json.test mariadb-10.11.9/mysql-test/main/show_explain_json.test --- mariadb-10.11.6/mysql-test/main/show_explain_json.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/show_explain_json.test 2024-08-03 07:29:57.000000000 +0000 @@ -271,9 +271,16 @@ --echo # Try to do SHOW EXPLAIN for a query that runs a SET command: --echo # I've found experimentally that select_id==2 here... --echo # -set @show_explain_probe_select_id=2; + +create table t2 (a int); +insert into t2 values (1),(2); +set @show_explain_probe_select_id=3; # Stop in the subquery. SET debug_dbug='+d,show_explain_probe_join_exec_start'; -send set @foo= (select max(a) from t0 where sin(a) >0); +# t2 has 2 rows so we will stop in the subquery twice: +# - first one to serve the SHOW ANALYZE request +# - second one when waiting to be KILLed. +send set @foo= (select max(a) from t2 + where a + (select max(a) from t0 where t0.a>t2.a) < 10000); connection default; --source include/wait_condition.inc --error ER_TARGET_NOT_EXPLAINABLE @@ -283,6 +290,7 @@ --error ER_QUERY_INTERRUPTED reap; SET debug_dbug=@old_debug; +drop table t2; --echo # --echo # Attempt SHOW EXPLAIN for an UPDATE diff -Nru mariadb-10.11.6/mysql-test/main/shutdown.test mariadb-10.11.9/mysql-test/main/shutdown.test --- mariadb-10.11.6/mysql-test/main/shutdown.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/shutdown.test 2024-08-03 07:29:57.000000000 +0000 @@ -20,13 +20,13 @@ --let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name --send shutdown --connection default --source include/wait_until_disconnected.inc ---exec echo "restart" > $_expect_file_name +--write_line restart $_expect_file_name --enable_reconnect --source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/main/skip_grants.test mariadb-10.11.9/mysql-test/main/skip_grants.test --- mariadb-10.11.6/mysql-test/main/skip_grants.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/skip_grants.test 2024-08-03 07:29:57.000000000 +0000 @@ -176,12 +176,12 @@ SELECT @@skip_grant_tables AS EXPECT_1; # Also check when the server starts without "--skip-grant-table" option ---let $restart_parameters = "--skip-skip-grant-tables" +--let $restart_parameters = --skip-skip-grant-tables --source include/restart_mysqld.inc SELECT @@skip_grant_tables AS EXPECT_0; # Need to restart the server to restore the "--skip-grant-tables" state ---let $restart_parameters = "--skip-grant-tables" +--let $restart_parameters = --skip-grant-tables --source include/restart_mysqld.inc --echo # diff -Nru mariadb-10.11.6/mysql-test/main/sp-no-valgrind.test mariadb-10.11.9/mysql-test/main/sp-no-valgrind.test --- mariadb-10.11.6/mysql-test/main/sp-no-valgrind.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/sp-no-valgrind.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,5 @@ --source include/not_msan.inc ---source include/not_valgrind_build.inc +--source include/not_valgrind.inc --echo # MDEV-20699 do not cache SP in SHOW CREATE --echo # Warmup round, this might allocate some memory for session variable diff -Nru mariadb-10.11.6/mysql-test/main/sp-vars.result mariadb-10.11.9/mysql-test/main/sp-vars.result --- mariadb-10.11.6/mysql-test/main/sp-vars.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/sp-vars.result 2024-08-03 07:29:57.000000000 +0000 @@ -1171,7 +1171,7 @@ END| CALL ctest(); Warnings: -Warning 1292 Truncated incorrect DOUBLE value: 'string ' +Warning 1292 Truncated incorrect DOUBLE value: 'string' DROP PROCEDURE ctest; CREATE PROCEDURE vctest() BEGIN diff -Nru mariadb-10.11.6/mysql-test/main/sp.result mariadb-10.11.9/mysql-test/main/sp.result --- mariadb-10.11.6/mysql-test/main/sp.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/sp.result 2024-08-03 07:29:57.000000000 +0000 @@ -7179,15 +7179,14 @@ CALL p1(1); ERROR HY000: The target table t1 of the INSERT is not insertable-into CREATE TEMPORARY TABLE t1 (f1 INT); -# t1 still refers to the view since it was inlined CALL p1(2); -ERROR HY000: The target table t1 of the INSERT is not insertable-into DROP VIEW t1; # t1 now refers to the temporary table CALL p1(3); # Check which values were inserted into the temp table. SELECT * FROM t1; f1 +2 3 DROP TEMPORARY TABLE t1; DROP PROCEDURE p1; @@ -8955,6 +8954,21 @@ DROP FUNCTION f2; DROP FUNCTION f3; DROP VIEW v1; +# +# MDEV-33270: Call of SP invoking another SP with a parameter +# requiring type conversion +# +SET NAMES latin1; +CREATE PROCEDURE p1 (a text) BEGIN SELECT a; END | +CREATE PROCEDURE p2 () CALL p1(concat('x',_utf8'x')) | +CALL p2(); +a +xx +CALL p2(); +a +xx +DROP PROCEDURE p1; +DROP PROCEDURE p2; # End of 10.4 tests # # @@ -9008,6 +9022,79 @@ r.a 1 SET SESSION log_slow_verbosity= @tmp; +# +# MDEV-31616 Problems with a stored function EMPTY() on upgrade to 10.6. +# +CREATE OR REPLACE FUNCTION empty(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +Warnings: +Note 1585 This function 'empty' has the same name as a native function +SELECT empty('1'); +empty('1') +0 +Warnings: +Note 1585 This function 'empty' has the same name as a native function +DROP FUNCTION empty; +CREATE OR REPLACE FUNCTION json_table(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +Warnings: +Note 1585 This function 'json_table' has the same name as a native function +SELECT json_table('1'); +json_table('1') +0 +Warnings: +Note 1585 This function 'json_table' has the same name as a native function +DROP FUNCTION json_table; +CREATE OR REPLACE FUNCTION nested(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +Warnings: +Note 1585 This function 'nested' has the same name as a native function +SELECT nested('1'); +nested('1') +0 +Warnings: +Note 1585 This function 'nested' has the same name as a native function +DROP FUNCTION nested; +CREATE OR REPLACE FUNCTION ordinality(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +Warnings: +Note 1585 This function 'ordinality' has the same name as a native function +SELECT ordinality('1'); +ordinality('1') +0 +Warnings: +Note 1585 This function 'ordinality' has the same name as a native function +DROP FUNCTION ordinality; +CREATE OR REPLACE FUNCTION path(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +Warnings: +Note 1585 This function 'path' has the same name as a native function +SELECT path('1'); +path('1') +0 +Warnings: +Note 1585 This function 'path' has the same name as a native function +DROP FUNCTION path; +CREATE OR REPLACE FUNCTION fast(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +Warnings: +Note 1585 This function 'fast' has the same name as a native function +SELECT fast('1'); +fast('1') +0 +Warnings: +Note 1585 This function 'fast' has the same name as a native function +DROP FUNCTION fast; +CREATE OR REPLACE FUNCTION relay(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +Warnings: +Note 1585 This function 'relay' has the same name as a native function +SELECT relay('1'); +relay('1') +0 +Warnings: +Note 1585 This function 'relay' has the same name as a native function +DROP FUNCTION relay; +CREATE OR REPLACE FUNCTION database() RETURNS int RETURN 333; +Warnings: +Note 1585 This function 'database' has the same name as a native function +SELECT database(); +database() +test +DROP FUNCTION database; DROP TABLE t1; # # MDEV-28129: MariaDB UAF issue at lex_end_nops(LEX*) diff -Nru mariadb-10.11.6/mysql-test/main/sp.test mariadb-10.11.9/mysql-test/main/sp.test --- mariadb-10.11.6/mysql-test/main/sp.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/sp.test 2024-08-03 07:29:57.000000000 +0000 @@ -8632,8 +8632,6 @@ CREATE TEMPORARY TABLE t1 (f1 INT); ---echo # t1 still refers to the view since it was inlined ---error ER_NON_INSERTABLE_TABLE CALL p1(2); DROP VIEW t1; @@ -10566,6 +10564,26 @@ DROP FUNCTION f3; DROP VIEW v1; +--echo # +--echo # MDEV-33270: Call of SP invoking another SP with a parameter +--echo # requiring type conversion +--echo # + +SET NAMES latin1; + +--delimiter | + +CREATE PROCEDURE p1 (a text) BEGIN SELECT a; END | +CREATE PROCEDURE p2 () CALL p1(concat('x',_utf8'x')) | + +--delimiter ; + +CALL p2(); +CALL p2(); + +DROP PROCEDURE p1; +DROP PROCEDURE p2; + --echo # End of 10.4 tests --echo # @@ -10618,6 +10636,44 @@ --delimiter ; SET SESSION log_slow_verbosity= @tmp; + +--echo # +--echo # MDEV-31616 Problems with a stored function EMPTY() on upgrade to 10.6. +--echo # +CREATE OR REPLACE FUNCTION empty(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +SELECT empty('1'); +DROP FUNCTION empty; + +CREATE OR REPLACE FUNCTION json_table(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +SELECT json_table('1'); +DROP FUNCTION json_table; + +CREATE OR REPLACE FUNCTION nested(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +SELECT nested('1'); +DROP FUNCTION nested; + +CREATE OR REPLACE FUNCTION ordinality(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +SELECT ordinality('1'); +DROP FUNCTION ordinality; + +CREATE OR REPLACE FUNCTION path(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +SELECT path('1'); +DROP FUNCTION path; + + +CREATE OR REPLACE FUNCTION fast(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +SELECT fast('1'); +DROP FUNCTION fast; + +CREATE OR REPLACE FUNCTION relay(a VARCHAR(128)) RETURNS int RETURN LENGTH(a)=0; +SELECT relay('1'); +DROP FUNCTION relay; + +CREATE OR REPLACE FUNCTION database() RETURNS int RETURN 333; +SELECT database(); +DROP FUNCTION database; + + # Cleanup DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/main/sp_notembedded.result mariadb-10.11.9/mysql-test/main/sp_notembedded.result --- mariadb-10.11.6/mysql-test/main/sp_notembedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/sp_notembedded.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,5 @@ set @old_concurrent_insert= @@global.concurrent_insert; set @@global.concurrent_insert= 0; -drop table if exists t1,t3; -drop procedure if exists bug4902| create procedure bug4902() begin show grants for 'root'@'localhost'; @@ -15,7 +13,6 @@ GRANT ALL PRIVILEGES ON *.* TO `root`@`localhost` WITH GRANT OPTION GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION drop procedure bug4902| -drop procedure if exists bug4902_2| create procedure bug4902_2() begin show processlist; @@ -23,13 +20,10 @@ call bug4902_2()| show warnings| Level Code Message -Note 1305 PROCEDURE test.bug4902_2 does not exist call bug4902_2()| show warnings| Level Code Message -Note 1305 PROCEDURE test.bug4902_2 does not exist drop procedure bug4902_2| -drop procedure if exists bug6807| create procedure bug6807() begin declare a int; @@ -42,116 +36,6 @@ call bug6807()| ERROR 70100: Query execution was interrupted drop procedure bug6807| -drop function if exists bug10100f| -drop procedure if exists bug10100p| -drop procedure if exists bug10100t| -drop procedure if exists bug10100pt| -drop procedure if exists bug10100pv| -drop procedure if exists bug10100pd| -drop procedure if exists bug10100pc| -create function bug10100f(prm int) returns int -begin -if prm > 1 then -return prm * bug10100f(prm - 1); -end if; -return 1; -end| -set statement sql_mode = '' for -create procedure bug10100p(prm int, inout res int) -begin -set res = res * prm; -if prm > 1 then -call bug10100p(prm - 1, res); -end if; -end| -set statement sql_mode = '' for -create procedure bug10100t(prm int) -begin -declare res int; -set res = 1; -call bug10100p(prm, res); -select res; -end| -create table t3 (a int)| -insert into t3 values (0)| -create view v1 as select a from t3| -create procedure bug10100pt(level int, lim int) -begin -if level < lim then -update t3 set a=level; -FLUSH TABLES; -call bug10100pt(level+1, lim); -else -select * from t3; -end if; -end| -create procedure bug10100pv(level int, lim int) -begin -if level < lim then -update v1 set a=level; -FLUSH TABLES; -call bug10100pv(level+1, lim); -else -select * from v1; -end if; -end| -prepare stmt2 from "select * from t3;"; -create procedure bug10100pd(level int, lim int) -begin -if level < lim then -select level; -prepare stmt1 from "update t3 set a=a+2"; -execute stmt1; -FLUSH TABLES; -execute stmt1; -FLUSH TABLES; -execute stmt1; -FLUSH TABLES; -deallocate prepare stmt1; -execute stmt2; -select * from t3; -call bug10100pd(level+1, lim); -else -execute stmt2; -end if; -end| -create procedure bug10100pc(level int, lim int) -begin -declare lv int; -declare c cursor for select a from t3; -open c; -if level < lim then -select level; -fetch c into lv; -select lv; -update t3 set a=level+lv; -FLUSH TABLES; -call bug10100pc(level+1, lim); -else -select * from t3; -end if; -close c; -end| -set @@max_sp_recursion_depth=255| -set @var=1| -call bug10100p(255, @var)| -call bug10100pt(1,255)| -call bug10100pv(1,255)| -call bug10100pd(1,255)| -call bug10100pc(1,255)| -set @@max_sp_recursion_depth=0| -deallocate prepare stmt2| -drop function bug10100f| -drop procedure bug10100p| -drop procedure bug10100t| -drop procedure bug10100pt| -drop procedure bug10100pv| -drop procedure bug10100pd| -drop procedure bug10100pc| -drop view v1| -drop table t3| -drop procedure if exists bug15298_1; -drop procedure if exists bug15298_2; create user 'mysqltest_1'@'localhost'; grant all privileges on test.* to 'mysqltest_1'@'localhost'; create procedure 15298_1 () sql security definer show grants for current_user; @@ -170,8 +54,6 @@ drop user mysqltest_1@localhost; drop procedure 15298_1; drop procedure 15298_2; -drop table if exists t1; -drop procedure if exists p1; create table t1 (value varchar(15)); create procedure p1() update t1 set value='updated' where value='old'; call p1(); @@ -283,7 +165,6 @@ # functions in databases which names contained dot. # connection default; -DROP DATABASE IF EXISTS `my.db`; create database `my.db`; use `my.db`; CREATE FUNCTION f1(a int) RETURNS INT RETURN a; diff -Nru mariadb-10.11.6/mysql-test/main/sp_notembedded.test mariadb-10.11.9/mysql-test/main/sp_notembedded.test --- mariadb-10.11.6/mysql-test/main/sp_notembedded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/sp_notembedded.test 2024-08-03 07:29:57.000000000 +0000 @@ -7,19 +7,12 @@ # Save the initial number of concurrent sessions --source include/count_sessions.inc ---disable_warnings -drop table if exists t1,t3; ---enable_warnings delimiter |; - # # Bug#4902 Stored procedure with SHOW WARNINGS leads to packet error # # Added tests for show grants command ---disable_warnings -drop procedure if exists bug4902| ---enable_warnings create procedure bug4902() begin show grants for 'root'@'localhost'; @@ -38,9 +31,6 @@ drop procedure bug4902| # We need separate SP for SHOW PROCESSLIST since we want use replace_column ---disable_warnings -drop procedure if exists bug4902_2| ---enable_warnings create procedure bug4902_2() begin show processlist; @@ -58,9 +48,6 @@ # # Bug#6807 Stored procedure crash if CREATE PROCEDURE ... KILL QUERY # ---disable_warnings -drop procedure if exists bug6807| ---enable_warnings create procedure bug6807() begin declare a int; @@ -77,152 +64,11 @@ drop procedure bug6807| - -# -# Bug#10100 function (and stored procedure?) recursivity problem -# ---disable_warnings -drop function if exists bug10100f| -drop procedure if exists bug10100p| -drop procedure if exists bug10100t| -drop procedure if exists bug10100pt| -drop procedure if exists bug10100pv| -drop procedure if exists bug10100pd| -drop procedure if exists bug10100pc| ---enable_warnings -# routines with simple recursion -create function bug10100f(prm int) returns int -begin - if prm > 1 then - return prm * bug10100f(prm - 1); - end if; - return 1; -end| -set statement sql_mode = '' for -create procedure bug10100p(prm int, inout res int) -begin - set res = res * prm; - if prm > 1 then - call bug10100p(prm - 1, res); - end if; -end| -set statement sql_mode = '' for -create procedure bug10100t(prm int) -begin - declare res int; - set res = 1; - call bug10100p(prm, res); - select res; -end| - -# a procedure which use tables and recursion -create table t3 (a int)| -insert into t3 values (0)| -create view v1 as select a from t3| -create procedure bug10100pt(level int, lim int) -begin - if level < lim then - update t3 set a=level; - FLUSH TABLES; - call bug10100pt(level+1, lim); - else - select * from t3; - end if; -end| -# view & recursion -create procedure bug10100pv(level int, lim int) -begin - if level < lim then - update v1 set a=level; - FLUSH TABLES; - call bug10100pv(level+1, lim); - else - select * from v1; - end if; -end| -# dynamic sql & recursion -prepare stmt2 from "select * from t3;"; -create procedure bug10100pd(level int, lim int) -begin - if level < lim then - select level; - prepare stmt1 from "update t3 set a=a+2"; - execute stmt1; - FLUSH TABLES; - execute stmt1; - FLUSH TABLES; - execute stmt1; - FLUSH TABLES; - deallocate prepare stmt1; - execute stmt2; - select * from t3; - call bug10100pd(level+1, lim); - else - execute stmt2; - end if; -end| -# cursor & recursion -create procedure bug10100pc(level int, lim int) -begin - declare lv int; - declare c cursor for select a from t3; - open c; - if level < lim then - select level; - fetch c into lv; - select lv; - update t3 set a=level+lv; - FLUSH TABLES; - call bug10100pc(level+1, lim); - else - select * from t3; - end if; - close c; -end| - -# end of the stack checking -set @@max_sp_recursion_depth=255| -set @var=1| -# disable log because error about stack overrun contains numbers which -# depend on a system --- disable_ps_protocol --- disable_result_log --- error ER_STACK_OVERRUN_NEED_MORE -call bug10100p(255, @var)| --- error ER_STACK_OVERRUN_NEED_MORE -call bug10100pt(1,255)| --- error ER_STACK_OVERRUN_NEED_MORE -call bug10100pv(1,255)| --- error ER_STACK_OVERRUN_NEED_MORE -call bug10100pd(1,255)| --- error ER_STACK_OVERRUN_NEED_MORE -call bug10100pc(1,255)| --- enable_result_log --- enable_ps_protocol -set @@max_sp_recursion_depth=0| - -deallocate prepare stmt2| - -drop function bug10100f| -drop procedure bug10100p| -drop procedure bug10100t| -drop procedure bug10100pt| -drop procedure bug10100pv| -drop procedure bug10100pd| -drop procedure bug10100pc| -drop view v1| -drop table t3| - delimiter ;| - # # Bug#15298 SHOW GRANTS FOR CURRENT_USER: Incorrect output in DEFINER context # ---disable_warnings -drop procedure if exists bug15298_1; -drop procedure if exists bug15298_2; ---enable_warnings create user 'mysqltest_1'@'localhost'; grant all privileges on test.* to 'mysqltest_1'@'localhost'; create procedure 15298_1 () sql security definer show grants for current_user; @@ -242,11 +88,6 @@ # Bug#29936 Stored Procedure DML ignores low_priority_updates setting # ---disable_warnings -drop table if exists t1; -drop procedure if exists p1; ---enable_warnings - create table t1 (value varchar(15)); create procedure p1() update t1 set value='updated' where value='old'; @@ -411,10 +252,6 @@ connection default; ---disable_warnings -DROP DATABASE IF EXISTS `my.db`; ---enable_warnings - create database `my.db`; use `my.db`; diff -Nru mariadb-10.11.6/mysql-test/main/ssl.result mariadb-10.11.9/mysql-test/main/ssl.result --- mariadb-10.11.6/mysql-test/main/ssl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ssl.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,22 @@ connect ssl_con,localhost,root,,,,,SSL; +select variable_name from performance_schema.status_by_thread where VARIABLE_NAME LIKE 'Ssl%'; +variable_name +Ssl_cipher +Ssl_cipher_list +Ssl_default_timeout +Ssl_server_not_after +Ssl_server_not_before +Ssl_verify_depth +Ssl_verify_mode +Ssl_version +Ssl_cipher +Ssl_cipher_list +Ssl_default_timeout +Ssl_server_not_after +Ssl_server_not_before +Ssl_verify_depth +Ssl_verify_mode +Ssl_version SELECT (VARIABLE_VALUE <> '') AS have_ssl FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='Ssl_cipher'; have_ssl 1 diff -Nru mariadb-10.11.6/mysql-test/main/ssl.test mariadb-10.11.9/mysql-test/main/ssl.test --- mariadb-10.11.6/mysql-test/main/ssl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ssl.test 2024-08-03 07:29:57.000000000 +0000 @@ -10,9 +10,12 @@ --source include/count_sessions.inc --source include/default_charset.inc +--source include/have_perfschema.inc connect (ssl_con,localhost,root,,,,,SSL); +select variable_name from performance_schema.status_by_thread where VARIABLE_NAME LIKE 'Ssl%'; + # Check ssl turned on SELECT (VARIABLE_VALUE <> '') AS have_ssl FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='Ssl_cipher'; diff -Nru mariadb-10.11.6/mysql-test/main/ssl_and_innodb.test mariadb-10.11.9/mysql-test/main/ssl_and_innodb.test --- mariadb-10.11.6/mysql-test/main/ssl_and_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ssl_and_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,5 @@ -- source include/have_innodb.inc --- source include/have_ssl_crypto_functs.inc +-- source include/have_des.inc CREATE TABLE t1(a int) engine=innodb; INSERT INTO t1 VALUES (1); diff -Nru mariadb-10.11.6/mysql-test/main/ssl_crl.result mariadb-10.11.9/mysql-test/main/ssl_crl.result --- mariadb-10.11.6/mysql-test/main/ssl_crl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ssl_crl.result 2024-08-03 07:29:57.000000000 +0000 @@ -2,4 +2,4 @@ Variable_name Value Ssl_version TLS_VERSION # try logging in with a certificate in the server's --ssl-crl : should fail -ERROR 2026 (HY000): TLS/SSL error: sslv3 alert certificate revoked +ERROR 2026 (HY000): TLS/SSL error: ssl/tls alert certificate revoked diff -Nru mariadb-10.11.6/mysql-test/main/ssl_crl.test mariadb-10.11.9/mysql-test/main/ssl_crl.test --- mariadb-10.11.6/mysql-test/main/ssl_crl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ssl_crl.test 2024-08-03 07:29:57.000000000 +0000 @@ -7,7 +7,7 @@ --exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/server-new-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/server-new-cert.pem test -e "SHOW STATUS LIKE 'Ssl_version'" --echo # try logging in with a certificate in the server's --ssl-crl : should fail -# OpenSSL 1.1.1a correctly rejects the certificate, but the error message is different ---replace_regex /ERROR 2013 \(HY000\): Lost connection to server at '.*', system error: [0-9]+/ERROR 2026 (HY000): TLS\/SSL error: sslv3 alert certificate revoked/ +# OpenSSL 1.1.1a and later releases correctly rejects the certificate, but the error message is different +--replace_regex /(ERROR 2013 \(HY000\): Lost connection to server at '.*', system error: [0-9]+|ERROR 2026 \(HY000\): TLS\/SSL error: sslv3 alert certificate revoked)/ERROR 2026 (HY000): TLS\/SSL error: ssl\/tls alert certificate revoked/ --error 1 --exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_version'" 2>&1 diff -Nru mariadb-10.11.6/mysql-test/main/ssl_timeout.result mariadb-10.11.9/mysql-test/main/ssl_timeout.result --- mariadb-10.11.6/mysql-test/main/ssl_timeout.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ssl_timeout.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,5 @@ # connect with read timeout so SLEEP() should timeout -connect ssl_con,localhost,root,,,,,SSL read_timeout=5; +connect ssl_con,localhost,root,,,,,SSL read_timeout=5$_timeout_adjustment; # Check ssl turned on SELECT (VARIABLE_VALUE <> '') AS have_ssl FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='Ssl_cipher'; have_ssl diff -Nru mariadb-10.11.6/mysql-test/main/ssl_timeout.test mariadb-10.11.9/mysql-test/main/ssl_timeout.test --- mariadb-10.11.6/mysql-test/main/ssl_timeout.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/ssl_timeout.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,10 +1,11 @@ --source include/have_ssl_communication.inc +--source include/slow_environ.inc # Save the initial number of concurrent sessions --source include/count_sessions.inc --echo # connect with read timeout so SLEEP() should timeout -connect (ssl_con,localhost,root,,,,,SSL read_timeout=5); +connect (ssl_con,localhost,root,,,,,SSL read_timeout=5$_timeout_adjustment); --echo # Check ssl turned on SELECT (VARIABLE_VALUE <> '') AS have_ssl FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='Ssl_cipher'; diff -Nru mariadb-10.11.6/mysql-test/main/stat_tables_partition.result mariadb-10.11.9/mysql-test/main/stat_tables_partition.result --- mariadb-10.11.6/mysql-test/main/stat_tables_partition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/stat_tables_partition.result 2024-08-03 07:29:57.000000000 +0000 @@ -34,13 +34,12 @@ # Must NOT show "Engine-independent statistics collected": alter table t1 analyze partition p0; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK # Should not have Handler_read_rnd_next=34 show session status like 'Handler_read_rnd%'; Variable_name Value Handler_read_rnd 0 Handler_read_rnd_deleted 0 -Handler_read_rnd_next 34 +Handler_read_rnd_next 0 drop table t1; SET use_stat_tables = DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/stat_tables_rbr.result mariadb-10.11.9/mysql-test/main/stat_tables_rbr.result --- mariadb-10.11.6/mysql-test/main/stat_tables_rbr.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/stat_tables_rbr.result 2024-08-03 07:29:57.000000000 +0000 @@ -17,7 +17,6 @@ CREATE TABLE t1 ( a INT ) ENGINE=MyISAM PARTITION BY HASH(a) PARTITIONS 2; ALTER TABLE t1 ANALYZE PARTITION p1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info diff -Nru mariadb-10.11.6/mysql-test/main/strict.result mariadb-10.11.9/mysql-test/main/strict.result --- mariadb-10.11.6/mysql-test/main/strict.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/strict.result 2024-08-03 07:29:57.000000000 +0000 @@ -897,7 +897,7 @@ INSERT INTO t1 (col2) VALUES ('-1.2E-3'); ERROR 22003: Out of range value for column 'col2' at row 1 UPDATE t1 SET col1 =col1 * 5000 WHERE col1 > 0; -ERROR 22003: DOUBLE value is out of range in '"test"."t1"."col1" * 5000' +Got one of the listed errors UPDATE t1 SET col2 =col2 / 0 WHERE col2 > 0; ERROR 22012: Division by 0 UPDATE t1 SET col2= MOD(col2,0) WHERE col2 > 0; diff -Nru mariadb-10.11.6/mysql-test/main/strict.test mariadb-10.11.9/mysql-test/main/strict.test --- mariadb-10.11.6/mysql-test/main/strict.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/strict.test 2024-08-03 07:29:57.000000000 +0000 @@ -824,7 +824,7 @@ INSERT INTO t1 (col1) VALUES ('+1.8E+309'); --error 1264 INSERT INTO t1 (col2) VALUES ('-1.2E-3'); ---error ER_DATA_OUT_OF_RANGE +--error ER_DATA_OUT_OF_RANGE, ER_WARN_DATA_OUT_OF_RANGE UPDATE t1 SET col1 =col1 * 5000 WHERE col1 > 0; --error 1365 UPDATE t1 SET col2 =col2 / 0 WHERE col2 > 0; diff -Nru mariadb-10.11.6/mysql-test/main/subselect.result mariadb-10.11.9/mysql-test/main/subselect.result --- mariadb-10.11.6/mysql-test/main/subselect.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect.result 2024-08-03 07:29:57.000000000 +0000 @@ -1318,7 +1318,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(3) DEFAULT NULL + `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; create table t1 (a int); @@ -7161,23 +7161,26 @@ # # MDEV-7565: Server crash with Signal 6 (part 2) # +create table t1 (id int not null primary key); Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` Group By TestCase.Revenue, TestCase.TemplateID; ControlRev NULL +drop table t1; # # MDEV-7445:Server crash with Signal 6 # +create table t1 (id int not null primary key); CREATE PROCEDURE procedure2() BEGIN Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` @@ -7190,6 +7193,7 @@ ControlRev NULL drop procedure procedure2; +drop table t1; # # MDEV-7846:Server crashes in Item_subselect::fix #_fields or fails with Thread stack overrun @@ -7495,6 +7499,45 @@ SELECT ROW(1,2) = (1 = ANY (SELECT 1 UNION SELECT 2)); ERROR HY000: Illegal parameter data types row and boolean for operation '=' # +# MDEV-29070 SIGSEGV in my_decimal::operator= and Assertion `0' failed +# in Item_type_holder::val_decimal on SELECT +# +CREATE TABLE t1(a INT UNIQUE); +INSERT INTO t1(a) VALUES (1); +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT 1, 1); +a +1 +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT a, a); +a +1 +UPDATE t1 SET a = 0 +WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT +1 / +1, a FROM t1 WHERE a > -0+1) IN (SELECT a, a); +SELECT a FROM t1 WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT + 1 / + 1, a FROM t1 +WHERE a > -0 + 1) IN (SELECT a, a); +a +CREATE TABLE x (x INT); +INSERT INTO x (x) VALUES (1); +UPDATE x SET x = 1 WHERE x = 1; +INSERT INTO x (x) VALUES (1), (1); +WITH RECURSIVE x (x) AS ( +SELECT 1 INTERSECT +SELECT -(SELECT 1.000000 AS x +UNION +SELECT 1.000000 ORDER BY NOT x < 'x', +-(SELECT 1 + x/1.000000 IN (1, 1) FROM x +WHERE x ORDER BY 1 - x) DESC LIMIT 1 OFFSET 1 +) + 1 FROM x +) +SELECT DISTINCT x, 1, NULL, 1.000000 +FROM x +WHERE (SELECT (SELECT x WHERE x IN (SELECT x FROM x))) > +(SELECT (SELECT x ORDER BY x = x OR (x = 1 AND x = 1) DESC)) +ORDER BY x ASC, x DESC, x; +ERROR HY000: Restrictions imposed on recursive definitions are violated for table 'x' +DROP TABLE t1, x; +# # End of 10.4 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/subselect.test mariadb-10.11.9/mysql-test/main/subselect.test --- mariadb-10.11.6/mysql-test/main/subselect.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect.test 2024-08-03 07:29:57.000000000 +0000 @@ -342,7 +342,10 @@ SELECT (SELECT numeropost FROM t1 HAVING numreponse=a),numreponse FROM (SELECT * FROM t1) as a; -- error ER_BAD_FIELD_ERROR SELECT numreponse, (SELECT numeropost FROM t1 HAVING numreponse=a) FROM (SELECT * FROM t1) as a; +#Enable after fix MDEV-31937 +--disable_ps2_protocol SELECT numreponse, (SELECT numeropost FROM t1 HAVING numreponse=1) FROM (SELECT * FROM t1) as a; +--enable_ps2_protocol INSERT INTO t1 (numeropost,numreponse,pseudo) VALUES (1,1,'joce'),(1,2,'joce'),(1,3,'test'); -- error ER_SUBQUERY_NO_1_ROW EXPLAIN EXTENDED SELECT numreponse FROM t1 WHERE numeropost='1' AND numreponse=(SELECT 1 FROM t1 WHERE numeropost='1'); @@ -1180,8 +1183,10 @@ insert into t1 values (1, 0.123); let $outfile_abs= $MYSQLTEST_VARDIR/tmp/subselect.out.file.1; let $outfile_rel= ../../tmp/subselect.out.file.1; +--disable_warnings --error 0,1 --remove_file $outfile_abs +--enable_warnings eval select a, (select max(b) from t1) into outfile "$outfile_rel" from t1; delete from t1; eval load data infile "$outfile_rel" into table t1; @@ -3006,10 +3011,13 @@ (SELECT t.c FROM t1 AS t WHERE t1.a=t.a AND t.b=AVG(t1.b)) AS test FROM t1 WHERE t1.d=0 GROUP BY a; +# Enable after fix MDEV-32038 +--disable_ps2_protocol SELECT tt.a, (SELECT (SELECT c FROM t1 as t WHERE t1.a=t.a AND t.d=MAX(t1.b + tt.a) LIMIT 1) FROM t1 WHERE t1.a=tt.a GROUP BY a LIMIT 1) as test FROM t1 as tt; +--enable_ps2_protocol SELECT tt.a, (SELECT (SELECT t.c FROM t1 AS t WHERE t1.a=t.a AND t.d=MAX(t1.b + tt.a) @@ -6000,24 +6008,28 @@ --echo # --echo # MDEV-7565: Server crash with Signal 6 (part 2) --echo # + +create table t1 (id int not null primary key); Select - (Select Sum(`TestCase`.Revenue) From mysql.slow_log E - Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) + (Select Sum(`TestCase`.Revenue) From t1 E + Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` Group By TestCase.Revenue, TestCase.TemplateID; +drop table t1; --echo # --echo # MDEV-7445:Server crash with Signal 6 --echo # +create table t1 (id int not null primary key); --delimiter | CREATE PROCEDURE procedure2() BEGIN Select - (Select Sum(`TestCase`.Revenue) From mysql.slow_log E - Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) + (Select Sum(`TestCase`.Revenue) From t1 E + Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` @@ -6029,6 +6041,7 @@ call procedure2(); drop procedure procedure2; +drop table t1; --echo # @@ -6351,6 +6364,50 @@ SELECT ROW(1,2) = (1 = ANY (SELECT 1 UNION SELECT 2)); --echo # +--echo # MDEV-29070 SIGSEGV in my_decimal::operator= and Assertion `0' failed +--echo # in Item_type_holder::val_decimal on SELECT +--echo # + +CREATE TABLE t1(a INT UNIQUE); +INSERT INTO t1(a) VALUES (1); + +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT 1, 1); + +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT a, a); + +UPDATE t1 SET a = 0 + WHERE (SELECT a, a WHERE a < 0 INTERSECT + SELECT +1 / +1, a FROM t1 WHERE a > -0+1) IN (SELECT a, a); + +SELECT a FROM t1 WHERE (SELECT a, a WHERE a < 0 INTERSECT + SELECT + 1 / + 1, a FROM t1 + WHERE a > -0 + 1) IN (SELECT a, a); + +CREATE TABLE x (x INT); +INSERT INTO x (x) VALUES (1); +UPDATE x SET x = 1 WHERE x = 1; +INSERT INTO x (x) VALUES (1), (1); +let $q= WITH RECURSIVE x (x) AS ( + SELECT 1 INTERSECT + SELECT -(SELECT 1.000000 AS x + UNION + SELECT 1.000000 ORDER BY NOT x < 'x', + -(SELECT 1 + x/1.000000 IN (1, 1) FROM x + WHERE x ORDER BY 1 - x) DESC LIMIT 1 OFFSET 1 + ) + 1 FROM x + ) + SELECT DISTINCT x, 1, NULL, 1.000000 + FROM x + WHERE (SELECT (SELECT x WHERE x IN (SELECT x FROM x))) > + (SELECT (SELECT x ORDER BY x = x OR (x = 1 AND x = 1) DESC)) + ORDER BY x ASC, x DESC, x; + +--error ER_NOT_STANDARD_COMPLIANT_RECURSIVE +eval $q; + +DROP TABLE t1, x; + +--echo # --echo # End of 10.4 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/subselect4.result mariadb-10.11.9/mysql-test/main/subselect4.result --- mariadb-10.11.6/mysql-test/main/subselect4.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect4.result 2024-08-03 07:29:57.000000000 +0000 @@ -1892,6 +1892,8 @@ 2 SUBQUERY SUBQUERY2_t1 index NULL col_int_key 5 NULL 2 Using index 2 SUBQUERY SUBQUERY2_t2 ALL col_varchar_key NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join) 3 MATERIALIZED t1 ALL NULL NULL NULL NULL 2 +Warnings: +Note 1105 Cannot use key `col_varchar_key` part[0] for lookup: `test`.`t1`.`col_varchar_key` of type `varchar` < "0" of type `bigint` SELECT col_int_key FROM t2 WHERE (SELECT SUBQUERY2_t1.col_int_key @@ -1917,6 +1919,8 @@ 2 SUBQUERY SUBQUERY2_t1 index NULL col_int_key 5 NULL 2 Using index 2 SUBQUERY SUBQUERY2_t2 ALL col_varchar_key NULL NULL NULL 2 Using where; Using join buffer (flat, BNL join) 3 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where +Warnings: +Note 1105 Cannot use key `col_varchar_key` part[0] for lookup: `test`.`t1`.`col_varchar_key` of type `varchar` < "0" of type `bigint` SELECT col_int_key FROM t2 WHERE (SELECT SUBQUERY2_t1.col_int_key @@ -2997,34 +3001,31 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where 2 SUBQUERY t2 ALL NULL NULL NULL NULL 2 100.00 +3 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a`,(/* select#2 */ select min(`test`.`t2`.`b`) from `test`.`t2`) <= (`test`.`t1`.`a`))) +Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a`,(/* select#2 */ select `test`.`t2`.`b` from `test`.`t2` group by (/* select#3 */ select `test`.`t3`.`c` from `test`.`t3` where `test`.`t3`.`c` = 1)) <= (`test`.`t1`.`a`))) select a from t1 where a >= any (select b from t2 group by (select c from t3 where c = 1)); a -3 -2 prepare stmt from "select a from t1 where a >= any (select b from t2 group by (select c from t3 where c = 1))"; execute stmt; a -3 -2 execute stmt; a -3 -2 deallocate prepare stmt; explain extended select a from t1 where a <= all (select b from t2 group by (select c from t3 where c = 1)); id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where 2 SUBQUERY t2 ALL NULL NULL NULL NULL 2 100.00 +3 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a`,(/* select#2 */ select min(`test`.`t2`.`b`) from `test`.`t2`) < (`test`.`t1`.`a`))) +Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a`,(/* select#2 */ select `test`.`t2`.`b` from `test`.`t2` group by (/* select#3 */ select `test`.`t3`.`c` from `test`.`t3` where `test`.`t3`.`c` = 1)) < (`test`.`t1`.`a`))) select a from t1 where a <= all (select b from t2 group by (select c from t3 where c = 1)); a +3 1 2 explain extended select a from t1 @@ -3032,13 +3033,12 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 3 100.00 Using where 2 SUBQUERY t2 ALL NULL NULL NULL NULL 2 100.00 +3 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a`,(/* select#2 */ select min(`test`.`t2`.`b`) from `test`.`t2`) <= (`test`.`t1`.`a`))) +Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where ((`test`.`t1`.`a`,(/* select#2 */ select `test`.`t2`.`b` from `test`.`t2` group by 1 + (/* select#3 */ select `test`.`t3`.`c` from `test`.`t3` where `test`.`t3`.`c` = 1)) <= (`test`.`t1`.`a`))) select a from t1 where a >= any (select b from t2 group by 1 + (select c from t3 where c = 1)); a -3 -2 drop table t1,t2,t3; # # MDEV-29139: Redundant IN/ALL/ANY predicand in GROUP BY clause of @@ -3058,8 +3058,10 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 2 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 +4 SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where +3 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where 1 +Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where (1,exists(/* select#2 */ select `test`.`t3`.`c` from `test`.`t3` group by ((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1),(/* select#4 */ select `test`.`t4`.`d` from `test`.`t4` where trigcond(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)) = `test`.`t4`.`d` or `test`.`t4`.`d` is null) having trigcond(`test`.`t4`.`d` is null))) limit 1)) select b from t2 where exists (select c from t3 group by (select a from t1 where a = 1) in (select d from t4)); @@ -3085,8 +3087,10 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 2 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 +4 SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where +3 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where 1 +Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where (1,exists(/* select#2 */ select `test`.`t3`.`c` from `test`.`t3` group by (<(/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)>(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1),(/* select#4 */ select `test`.`t4`.`d` from `test`.`t4` where trigcond(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)) >= `test`.`t4`.`d` or `test`.`t4`.`d` is null) having trigcond(`test`.`t4`.`d` is null))))) limit 1)) select b from t2 where exists (select c from t3 group by (select a from t1 where a = 1) >= @@ -3101,8 +3105,10 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 2 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 +4 SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where +3 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where 1 +Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where (1,exists(/* select#2 */ select `test`.`t3`.`c` from `test`.`t3` group by (<(/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)>(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1),(/* select#4 */ select `test`.`t4`.`d` from `test`.`t4` where trigcond(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)) >= `test`.`t4`.`d` or `test`.`t4`.`d` is null) having trigcond(`test`.`t4`.`d` is null))))) limit 1)) select b from t2 where exists (select c from t3 group by (select a from t1 where a = 1) < @@ -3114,16 +3120,17 @@ where b in (select c from t3 group by (select a from t1 where a = 1) in (select d from t4)); id select_type table type possible_keys key key_len ref rows filtered Extra -1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 -1 PRIMARY eq_ref distinct_key distinct_key 4 func 1 100.00 +1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 Using where +1 PRIMARY eq_ref distinct_key distinct_key 4 test.t2.b 1 100.00 2 MATERIALIZED t3 ALL NULL NULL NULL NULL 2 100.00 +4 SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where +3 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 select `test`.`t2`.`b` AS `b` from `test`.`t2` semi join (`test`.`t3`) where 1 +Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from (/* select#2 */ select `test`.`t3`.`c` from `test`.`t3` group by ((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1),(/* select#4 */ select `test`.`t4`.`d` from `test`.`t4` where trigcond(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)) = `test`.`t4`.`d` or `test`.`t4`.`d` is null) having trigcond(`test`.`t4`.`d` is null)))) join `test`.`t2` where ``.`c` = `test`.`t2`.`b` select b from t2 where b in (select c from t3 group by (select a from t1 where a = 1) in (select d from t4)); b -2 explain extended select b from t2 where b >= any (select c from t3 group by (select a from t1 where a = 1) in @@ -3131,15 +3138,15 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 Using where 2 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 +4 SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where +3 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where ((`test`.`t2`.`b`,(/* select#2 */ select min(`test`.`t3`.`c`) from `test`.`t3`) <= (`test`.`t2`.`b`))) +Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where ((`test`.`t2`.`b`,(/* select#2 */ select `test`.`t3`.`c` from `test`.`t3` group by ((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1),(/* select#4 */ select `test`.`t4`.`d` from `test`.`t4` where trigcond(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)) = `test`.`t4`.`d` or `test`.`t4`.`d` is null) having trigcond(`test`.`t4`.`d` is null)))) <= (`test`.`t2`.`b`))) select b from t2 where b >= any (select c from t3 group by (select a from t1 where a = 1) in (select d from t4)); b -3 -2 explain extended select b from t2 where b <= all (select c from t3 group by (select a from t1 where a = 1) in @@ -3147,13 +3154,16 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t2 ALL NULL NULL NULL NULL 2 100.00 Using where 2 SUBQUERY t3 ALL NULL NULL NULL NULL 2 100.00 +4 SUBQUERY t4 ALL NULL NULL NULL NULL 2 100.00 Using where +3 SUBQUERY t1 ALL NULL NULL NULL NULL 2 100.00 Using where Warnings: -Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where ((`test`.`t2`.`b`,(/* select#2 */ select `test`.`t3`.`c` from `test`.`t3`) < (`test`.`t2`.`b`))) +Note 1003 /* select#1 */ select `test`.`t2`.`b` AS `b` from `test`.`t2` where ((`test`.`t2`.`b`,(/* select#2 */ select `test`.`t3`.`c` from `test`.`t3` group by ((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1),(/* select#4 */ select `test`.`t4`.`d` from `test`.`t4` where trigcond(((/* select#3 */ select `test`.`t1`.`a` from `test`.`t1` where `test`.`t1`.`a` = 1)) = `test`.`t4`.`d` or `test`.`t4`.`d` is null) having trigcond(`test`.`t4`.`d` is null)))) < (`test`.`t2`.`b`))) select b from t2 where b <= all (select c from t3 group by (select a from t1 where a = 1) in (select d from t4)); b +3 2 drop table t1,t2,t3,t4; # End of 10.3 tests @@ -3235,4 +3245,124 @@ ) ); ERROR 21000: Operand should contain 2 column(s) +# +# MDEV-29362: Constant subquery used as left part of IN subquery +# +CREATE TABLE t1 (a int) ENGINE=MyISAM; +INSERT INTO t1 VALUES (15), (1), (2); +CREATE TABLE t2 (b int) ENGINE=MyISAM; +INSERT INTO t2 VALUES (15), (1); +CREATE TABLE t3 (c int) ENGINE=MyISAM; +INSERT INTO t3 VALUES (15), (1); +SET optimizer_switch='condition_pushdown_from_having=off'; +SELECT a FROM t1 GROUP BY a +HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1; +a +2 +SELECT a FROM t1 GROUP BY a +HAVING a IN ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ); +a +1 +SET optimizer_switch='condition_pushdown_from_having=on'; +SELECT a FROM t1 GROUP BY a +HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1; +a +2 +SELECT a FROM t1 GROUP BY a +HAVING a IN ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ); +a +1 +EXPLAIN FORMAT=JSON SELECT a FROM t1 GROUP BY a +HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 3, + "filtered": 100, + "attached_condition": "t1.a = ((((subquery#2),(subquery#3))) + 1)" + } + } + ], + "subqueries": [ + { + "query_block": { + "select_id": 3, + "having_condition": "trigcond(t3.c is null)", + "nested_loop": [ + { + "table": { + "table_name": "t3", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "trigcond(1 = t3.c or t3.c is null)" + } + } + ] + } + }, + { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100, + "attached_condition": "t2.b = 1" + } + } + ] + } + } + ] + } +} +PREPARE stmt FROM "SELECT a FROM t1 GROUP BY a +HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1"; +EXECUTE stmt; +a +2 +EXECUTE stmt; +a +2 +DEALLOCATE PREPARE stmt; +DROP TABLE t1,t2,t3; +# +# MDEV-33747: Optimization of (SELECT) IN (SELECT ...) executes subquery at prepare stage +# +create table t1 (a int, b int); +insert into t1 select seq, seq from seq_1_to_200; +create table t2 as select * from t1; +create table t3 as select * from t1; +analyze table t1,t2,t3; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status OK +test.t3 analyze status Engine-independent statistics collected +test.t3 analyze status OK +select @@expensive_subquery_limit < 200 as DEFAULTS_ARE_SUITABLE; +DEFAULTS_ARE_SUITABLE +1 +flush status; +explain select * from t1 where a<3 or (select max(a) from t2) in (select b from t3); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 200 Using where +3 SUBQUERY t3 ALL NULL NULL NULL NULL 200 Using where +2 SUBQUERY t2 ALL NULL NULL NULL NULL 200 +# Must show 0. If this shows 200, this means subquery was executed and you have a bug: +show status like 'Handler_read_rnd_next%'; +Variable_name Value +Handler_read_rnd_next 0 +drop table t1,t2,t3; # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/subselect4.test mariadb-10.11.9/mysql-test/main/subselect4.test --- mariadb-10.11.6/mysql-test/main/subselect4.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect4.test 2024-08-03 07:29:57.000000000 +0000 @@ -2633,6 +2633,57 @@ ) ); +--echo # +--echo # MDEV-29362: Constant subquery used as left part of IN subquery +--echo # + +CREATE TABLE t1 (a int) ENGINE=MyISAM; +INSERT INTO t1 VALUES (15), (1), (2); +CREATE TABLE t2 (b int) ENGINE=MyISAM; +INSERT INTO t2 VALUES (15), (1); +CREATE TABLE t3 (c int) ENGINE=MyISAM; +INSERT INTO t3 VALUES (15), (1); + +let $q1= +SELECT a FROM t1 GROUP BY a + HAVING a = ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ) + 1; +let $q2= +SELECT a FROM t1 GROUP BY a + HAVING a IN ( (SELECT b FROM t2 where b=1) IN (SELECT c FROM t3) ); + +SET optimizer_switch='condition_pushdown_from_having=off'; + +eval $q1; +eval $q2; + +SET optimizer_switch='condition_pushdown_from_having=on'; + +eval $q1; +eval $q2; + +eval EXPLAIN FORMAT=JSON $q1; + +eval PREPARE stmt FROM "$q1"; +EXECUTE stmt; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +DROP TABLE t1,t2,t3; + +--echo # +--echo # MDEV-33747: Optimization of (SELECT) IN (SELECT ...) executes subquery at prepare stage +--echo # +create table t1 (a int, b int); +insert into t1 select seq, seq from seq_1_to_200; +create table t2 as select * from t1; +create table t3 as select * from t1; +analyze table t1,t2,t3; +select @@expensive_subquery_limit < 200 as DEFAULTS_ARE_SUITABLE; +flush status; +explain select * from t1 where a<3 or (select max(a) from t2) in (select b from t3); +--echo # Must show 0. If this shows 200, this means subquery was executed and you have a bug: +show status like 'Handler_read_rnd_next%'; +drop table t1,t2,t3; --echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/subselect_elimination.result mariadb-10.11.9/mysql-test/main/subselect_elimination.result --- mariadb-10.11.6/mysql-test/main/subselect_elimination.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_elimination.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,268 @@ +# +# MDEV-28621 group by optimization incorrectly removing subquery where +# subject buried in a function +# +CREATE TABLE t1 (i int) ; +INSERT INTO t1 VALUES (1),(2),(3); +SELECT 1 FROM t1 +WHERE i in +( SELECT a+1 +FROM +(SELECT (SELECT i FROM (SELECT 1 FROM t1) dt) AS a FROM t1) dt2 +GROUP BY a +); +ERROR 21000: Subquery returns more than 1 row +DROP TABLE t1; +create table t1 (a int, b int, c int); +insert into t1 select seq, seq, seq from seq_1_to_10; +create table t2 as select * from t1; +create table t20 as select * from t1; +create table t21 as select * from t1; +create table t3 as select * from t1; +select a, a in +( +select +( +select max(c) from t20 where t20.a<=t2.a +) as SUBQ1 from t2 group by SUBQ1+1 +) as COL +from t1; +a COL +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +9 1 +10 1 +create view v2 as +select +a, b, +(select max(c) from t20 where t20.a<=t2.a) as SUBQ1, +(select max(c) from t21 where t21.a<=t2.a) as SUBQ2 +from t2; +# test partial elimination +explain +select +a, +a in (select a from v2 where a>3 and v2.SUBQ2>=0 group by v2.SUBQ1, v2.SUBQ2) +from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +5 DEPENDENT SUBQUERY t21 ALL NULL NULL NULL NULL 10 Using where +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +# test buried subselects in group by clause +select a, a in +( +select +( +select max(c) from t20 where t20.a<=t2.a +)*2 as SUBQ1 from t2 group by SUBQ1+1 +) as COL +from t1; +a COL +1 0 +2 1 +3 0 +4 1 +5 0 +6 1 +7 0 +8 1 +9 0 +10 1 +drop view v2; +drop table t1, t2, t20, t21, t3; +# Testcase from MDEV-32311 +SELECT ( +( WITH x ( x ) AS +(SELECT ( SELECT 'x' UNION SELECT 'x' ) FROM ( SELECT ( 'x' ) ) x) +SELECT x FROM x +WHERE x IN ( ( SELECT 'x' AND x GROUP BY x ) ) +) +) AS SUBQ; +SUBQ +x +# MDEV-32390: +CREATE TABLE t0 ( c43 DECIMAL ( 31 ) DEFAULT ( 45 ) ) ; +INSERT INTO t0 VALUES ( 13 ) , ( 29 ) ; +ALTER TABLE t0 ADD COLUMN c24 INT AFTER c43 ; +INSERT INTO t0 VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT , DEFAULT ) ; +SELECT t1 . c22 AS c9 FROM ( SELECT ( SELECT + EXISTS ( SELECT -128 AS c29 ) << +LOCATE ( t0 . c43 , t0 . c24 <= t0 . c24 NOT BETWEEN 4642475734208631537 AND +-108 , NULLIF ( 57 , -8 ) SOUNDS LIKE TRIM( TRAILING FROM 6107036197732405580 ) +) - t0 . c43 AS c57 FROM t0 LIMIT 1 ) AS c22 FROM t0 ) AS t1 HAVING TRIM( CASE +t1 . c22 WHEN -16 THEN RAND ( ) % HEX ( t1 . c22 ) - SUBSTRING_INDEX ( t1 . c22, +':A9SEZxtjN,fKN*zR' , 'V*vhJb}&c%Op,[T[S,j`F9NDsK;\'8 4;m" +P,ce}1r"3ID1DN' ) >> NULLIF ( t1 . c22 , -95 ) ELSE -2 END IS TRUE +FROM t1 . c22 >= EXISTS ( SELECT t2 . c57 AS c59 FROM ( SELECT CASE c24 WHEN +-103 THEN 85 ELSE 22 END IS TRUE AS c57 FROM t0 ) AS t2 WHERE MOD ( 64 , 46 ) = +CONVERT ( 73 , BINARY ) % RAND ( ) IS NOT NULL = -65 GROUP BY c57 , c22 , c22 +WINDOW w0 AS ( PARTITION BY t2 . c57 ) ) & PI ( ) ) ; +c9 +DROP TABLE t0; +# MDEV-32309 +SELECT +( WITH x ( x ) AS +( +WITH x ( x ) AS ( SELECT 1 ) SELECT ( SELECT x ) FROM x +) +SELECT x FROM x WHERE x IN ( SELECT NULL GROUP BY x ) +) as col1 ; +col1 +NULL +# MDEV-32391 +CREATE TABLE t0 ( c15 INT , c33 INT ) engine=innodb; +INSERT INTO t0 ( c15 ) WITH t1 AS ( SELECT SQRT ( 123 ) NOT +REGEXP MOD ( 91 , -121 ) = ALL ( SELECT c15 AS c33 FROM t0 ) AS c49 FROM t0 ) +SELECT t1 . c49 IS UNKNOWN AS c59 FROM t1 CROSS JOIN t0 AS t2 +WHERE t1 . c49 = + EXISTS ( SELECT -5839312620871436105 AS c17 GROUP BY c49 ) +BETWEEN -109 AND CHAR_LENGTH ( 2694839150676403988 ) - - LOWER ( -13 ) ; +DROP TABLE t0; +# MDEV-28620 +CREATE TABLE t1 ( a int); +INSERT INTO t1 VALUES (1),(2); +SELECT EXISTS +( SELECT 1 FROM t1 GROUP BY 1 IN (SELECT a FROM t1) +ORDER BY a + (SELECT 1 FROM t1 WHERE (1,2) NOT IN (SELECT 1,0)) +) as SUBQ; +ERROR 21000: Subquery returns more than 1 row +DROP TABLE t1; +# MDEV-30842 Item_subselect::get_cache_parameters and UBSAN member +# access within null pointer +CREATE TABLE x (x INT) ENGINE=InnoDB; +INSERT INTO x (x) VALUES (0); +INSERT INTO x (x) VALUES (x IN (SELECT (SELECT x FROM (SELECT x FROM +(SELECT 0 IN (SELECT x=0 FROM (SELECT x FROM (SELECT (SELECT (SELECT (SELECT +(SELECT 0 AS x) FROM x AS x) IN (SELECT 0 AS x) AS x) FROM x AS x) IN +(SELECT x WHERE x=0) AS x FROM x AS x) AS x) AS x GROUP BY x) AS x FROM x) AS x) +AS x) IN (SELECT 0 AS x) AS x FROM x)); +ERROR HY000: Table 'x' is specified twice, both as a target for 'INSERT' and as a separate source for data +DROP TABLE x; +# MDEV-28622: Item_subselect eliminated flag set but Item still +# evaluated/used. +CREATE TABLE t1 ( a int) ; +CREATE VIEW v1 (i) AS SELECT EXISTS(SELECT 1) FROM t1; +SELECT 1 FROM v1 WHERE i NOT IN (SELECT i = 0 FROM v1 WHERE i = -1 GROUP BY i); +1 +DROP TABLE t1; +DROP VIEW v1; +CREATE TABLE t(c1 INT); +SELECT 0 +WHERE 0 IN +( +SELECT 0 FROM +( +SELECT 0 IN +( +SELECT +( +SELECT c1 FROM t +) +) AS c +FROM t +) AS dt +WHERE c GROUP BY c +); +0 +DROP TABLE t; +create table t1 (a int, b int, c int); +insert into t1 select seq, seq, seq from seq_1_to_10; +create table t2 as select * from t1; +create table t20 as select * from t1; +create table t3 as select * from t1; +create view v2 as +select +a, b, (select max(c) from t20 where t20.a<=t2.a) as SUBQ1 +from t2; +explain +select +a, a in (select a from v2 where a>3 group by v2.SUBQ1) +from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +prepare s from ' +explain +select + a, a in (select a from v2 where a>3 group by v2.SUBQ1) +from t1'; +execute s; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +execute s; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +execute s; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +prepare s from ' +explain +select + a, a in (select a from v2 where a>3 and SUBQ1+1 group by v2.SUBQ1) +from t1'; +execute s; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +execute s; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +execute s; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +create procedure p1() +begin +explain +select +a, a in (select a from v2 where a>3 group by v2.SUBQ1) +from t1; +end// +create procedure p2() +begin +explain +select +a, a in (select a from v2 where a>3 and SUBQ1+1 group by v2.SUBQ1) +from t1; +end// +call p1(); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +call p1(); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +call p2(); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +call p2(); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 +2 MATERIALIZED t2 ALL NULL NULL NULL NULL 10 Using where; Using temporary +4 DEPENDENT SUBQUERY t20 ALL NULL NULL NULL NULL 10 Using where +drop procedure p1; +drop procedure p2; +drop view v2; +drop table t1,t2,t3,t20; +# end of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/subselect_elimination.test mariadb-10.11.9/mysql-test/main/subselect_elimination.test --- mariadb-10.11.6/mysql-test/main/subselect_elimination.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_elimination.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,242 @@ +--source include/have_innodb.inc +--source include/have_sequence.inc + +--echo # +--echo # MDEV-28621 group by optimization incorrectly removing subquery where +--echo # subject buried in a function +--echo # + +CREATE TABLE t1 (i int) ; +INSERT INTO t1 VALUES (1),(2),(3); + +--error ER_SUBQUERY_NO_1_ROW +SELECT 1 FROM t1 +WHERE i in +( SELECT a+1 + FROM + (SELECT (SELECT i FROM (SELECT 1 FROM t1) dt) AS a FROM t1) dt2 + GROUP BY a +); + +DROP TABLE t1; + +create table t1 (a int, b int, c int); +insert into t1 select seq, seq, seq from seq_1_to_10; +create table t2 as select * from t1; +create table t20 as select * from t1; +create table t21 as select * from t1; +create table t3 as select * from t1; +select a, a in +( + select + ( + select max(c) from t20 where t20.a<=t2.a + ) as SUBQ1 from t2 group by SUBQ1+1 +) as COL +from t1; + +create view v2 as +select + a, b, + (select max(c) from t20 where t20.a<=t2.a) as SUBQ1, + (select max(c) from t21 where t21.a<=t2.a) as SUBQ2 +from t2; + +--echo # test partial elimination + +explain +select + a, + a in (select a from v2 where a>3 and v2.SUBQ2>=0 group by v2.SUBQ1, v2.SUBQ2) +from t1; + +--echo # test buried subselects in group by clause + +select a, a in +( + select + ( + select max(c) from t20 where t20.a<=t2.a + )*2 as SUBQ1 from t2 group by SUBQ1+1 +) as COL +from t1; + +drop view v2; +drop table t1, t2, t20, t21, t3; + +--echo # Testcase from MDEV-32311 + +# some warning duplicated using ps-protocol +--disable_warnings +SELECT ( + ( WITH x ( x ) AS + (SELECT ( SELECT 'x' UNION SELECT 'x' ) FROM ( SELECT ( 'x' ) ) x) + SELECT x FROM x + WHERE x IN ( ( SELECT 'x' AND x GROUP BY x ) ) + ) +) AS SUBQ; +--enable_warnings + +--echo # MDEV-32390: + +CREATE TABLE t0 ( c43 DECIMAL ( 31 ) DEFAULT ( 45 ) ) ; +INSERT INTO t0 VALUES ( 13 ) , ( 29 ) ; +ALTER TABLE t0 ADD COLUMN c24 INT AFTER c43 ; +INSERT INTO t0 VALUES ( DEFAULT , DEFAULT ) , ( DEFAULT , DEFAULT ) ; +SELECT t1 . c22 AS c9 FROM ( SELECT ( SELECT + EXISTS ( SELECT -128 AS c29 ) << +LOCATE ( t0 . c43 , t0 . c24 <= t0 . c24 NOT BETWEEN 4642475734208631537 AND +-108 , NULLIF ( 57 , -8 ) SOUNDS LIKE TRIM( TRAILING FROM 6107036197732405580 ) +) - t0 . c43 AS c57 FROM t0 LIMIT 1 ) AS c22 FROM t0 ) AS t1 HAVING TRIM( CASE +t1 . c22 WHEN -16 THEN RAND ( ) % HEX ( t1 . c22 ) - SUBSTRING_INDEX ( t1 . c22, +':A9SEZxtjN,fKN*zR' , 'V*vhJb}&c%Op,[T[S,j`F9NDsK;\'8 4;m" +P,ce}1r"3ID1DN' ) >> NULLIF ( t1 . c22 , -95 ) ELSE -2 END IS TRUE +FROM t1 . c22 >= EXISTS ( SELECT t2 . c57 AS c59 FROM ( SELECT CASE c24 WHEN +-103 THEN 85 ELSE 22 END IS TRUE AS c57 FROM t0 ) AS t2 WHERE MOD ( 64 , 46 ) = +CONVERT ( 73 , BINARY ) % RAND ( ) IS NOT NULL = -65 GROUP BY c57 , c22 , c22 +WINDOW w0 AS ( PARTITION BY t2 . c57 ) ) & PI ( ) ) ; + +DROP TABLE t0; + +--echo # MDEV-32309 + +SELECT + ( WITH x ( x ) AS + ( + WITH x ( x ) AS ( SELECT 1 ) SELECT ( SELECT x ) FROM x + ) + SELECT x FROM x WHERE x IN ( SELECT NULL GROUP BY x ) +) as col1 ; + +--echo # MDEV-32391 + +CREATE TABLE t0 ( c15 INT , c33 INT ) engine=innodb; +INSERT INTO t0 ( c15 ) WITH t1 AS ( SELECT SQRT ( 123 ) NOT +REGEXP MOD ( 91 , -121 ) = ALL ( SELECT c15 AS c33 FROM t0 ) AS c49 FROM t0 ) +SELECT t1 . c49 IS UNKNOWN AS c59 FROM t1 CROSS JOIN t0 AS t2 +WHERE t1 . c49 = + EXISTS ( SELECT -5839312620871436105 AS c17 GROUP BY c49 ) +BETWEEN -109 AND CHAR_LENGTH ( 2694839150676403988 ) - - LOWER ( -13 ) ; +DROP TABLE t0; + +--echo # MDEV-28620 +CREATE TABLE t1 ( a int); +INSERT INTO t1 VALUES (1),(2); + +--error ER_SUBQUERY_NO_1_ROW +SELECT EXISTS +( SELECT 1 FROM t1 GROUP BY 1 IN (SELECT a FROM t1) + ORDER BY a + (SELECT 1 FROM t1 WHERE (1,2) NOT IN (SELECT 1,0)) +) as SUBQ; +DROP TABLE t1; + +--echo # MDEV-30842 Item_subselect::get_cache_parameters and UBSAN member +--echo # access within null pointer + +CREATE TABLE x (x INT) ENGINE=InnoDB; +INSERT INTO x (x) VALUES (0); +--error ER_UPDATE_TABLE_USED +INSERT INTO x (x) VALUES (x IN (SELECT (SELECT x FROM (SELECT x FROM +(SELECT 0 IN (SELECT x=0 FROM (SELECT x FROM (SELECT (SELECT (SELECT (SELECT +(SELECT 0 AS x) FROM x AS x) IN (SELECT 0 AS x) AS x) FROM x AS x) IN +(SELECT x WHERE x=0) AS x FROM x AS x) AS x) AS x GROUP BY x) AS x FROM x) AS x) +AS x) IN (SELECT 0 AS x) AS x FROM x)); +DROP TABLE x; + +--echo # MDEV-28622: Item_subselect eliminated flag set but Item still +--echo # evaluated/used. + +CREATE TABLE t1 ( a int) ; +CREATE VIEW v1 (i) AS SELECT EXISTS(SELECT 1) FROM t1; + +SELECT 1 FROM v1 WHERE i NOT IN (SELECT i = 0 FROM v1 WHERE i = -1 GROUP BY i); +DROP TABLE t1; +DROP VIEW v1; + +CREATE TABLE t(c1 INT); + +SELECT 0 +WHERE 0 IN +( + SELECT 0 FROM + ( + SELECT 0 IN + ( + SELECT + ( + SELECT c1 FROM t + ) + ) AS c + FROM t + ) AS dt + WHERE c GROUP BY c +); + +DROP TABLE t; + +create table t1 (a int, b int, c int); +insert into t1 select seq, seq, seq from seq_1_to_10; +create table t2 as select * from t1; +create table t20 as select * from t1; +create table t3 as select * from t1; + +create view v2 as +select + a, b, (select max(c) from t20 where t20.a<=t2.a) as SUBQ1 +from t2; + +explain +select + a, a in (select a from v2 where a>3 group by v2.SUBQ1) +from t1; + +prepare s from ' +explain +select + a, a in (select a from v2 where a>3 group by v2.SUBQ1) +from t1'; + +execute s; +execute s; +execute s; + +prepare s from ' +explain +select + a, a in (select a from v2 where a>3 and SUBQ1+1 group by v2.SUBQ1) +from t1'; + +execute s; +execute s; +execute s; + +delimiter //; + +create procedure p1() +begin +explain +select + a, a in (select a from v2 where a>3 group by v2.SUBQ1) +from t1; +end// + +create procedure p2() +begin +explain +select + a, a in (select a from v2 where a>3 and SUBQ1+1 group by v2.SUBQ1) +from t1; +end// + +delimiter ;// + +call p1(); +call p1(); +call p2(); +call p2(); +drop procedure p1; +drop procedure p2; + + +drop view v2; +drop table t1,t2,t3,t20; + +--echo # end of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/subselect_innodb.result mariadb-10.11.9/mysql-test/main/subselect_innodb.result --- mariadb-10.11.6/mysql-test/main/subselect_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -23,8 +23,8 @@ INSERT INTO t1 VALUES("0c9aab05b15048c59bc35c8461507deb", "System", "System", "2003-06-05 16:30:00", "The system content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "9c9aab05b15048c59bc35c8461507deb", "1"); INSERT INTO t1 VALUES("2f6161e879db43c1a5b82c21ddc49089", "Default", "System", "2003-06-09 10:52:02", "The default content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "03eea05112b845949f3fd03278b5fe43", "1"); INSERT INTO t1 VALUES("c373e9f5ad0791724315444553544200", "AddDocumentTest", "admin", "2003-06-09 10:51:25", "Movie Reviews", "0", "2003-06-09 10:51:25", "admin", "0", "2f6161e879db43c1a5b82c21ddc49089", "03eea05112b845949f3fd03278b5fe43", NULL); -SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1'); -'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1') +SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1') as exp; +exp 0 drop table t1; create table t1 (a int) engine=innodb; @@ -60,8 +60,8 @@ INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t3 VALUES (1,1),(2,2),(3,3); INSERT INTO t2 VALUES (1,1),(2,2),(3,3); -SELECT distinct p1.processor_id, (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id) FROM t1 p1; -processor_id (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id) +SELECT distinct p1.processor_id, (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id) as result FROM t1 p1; +processor_id result 1 1 2 2 3 3 @@ -201,15 +201,9 @@ (SELECT lt.t1_id FROM t1 lt WHERE lt.t3_id=a.t3_id) -ORDER BY b DESC LIMIT 1) +ORDER BY b DESC LIMIT 1) as exp from t3 AS a; -(SELECT rs.t2_id -FROM t2 rs -WHERE rs.t1_id= -(SELECT lt.t1_id -FROM t1 lt -WHERE lt.t3_id=a.t3_id) -ORDER BY b DESC LIMIT 1) +exp NULL DROP PROCEDURE IF EXISTS p1; create procedure p1() @@ -645,15 +639,8 @@ a IS NOT NULL GROUP BY (SELECT NULL from dual WHERE a = 1) -); -1 IN ( -SELECT NULL -FROM t1 -WHERE -a IS NOT NULL -GROUP BY -(SELECT NULL from dual WHERE a = 1) -) +) as exp; +exp 0 drop table t1; # Testcase from MDEV-26164 @@ -673,8 +660,8 @@ INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 (b INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (3),(4); -SELECT 1 IN (SELECT a FROM t1 LEFT JOIN t2 ON (a = b AND EXISTS (SELECT * FROM t1))); -1 IN (SELECT a FROM t1 LEFT JOIN t2 ON (a = b AND EXISTS (SELECT * FROM t1))) +SELECT 1 IN (SELECT a FROM t1 LEFT JOIN t2 ON (a = b AND EXISTS (SELECT * FROM t1))) as exp; +exp 1 drop table t1,t2; # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_innodb.test mariadb-10.11.9/mysql-test/main/subselect_innodb.test --- mariadb-10.11.6/mysql-test/main/subselect_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -33,10 +33,7 @@ INSERT INTO t1 VALUES("0c9aab05b15048c59bc35c8461507deb", "System", "System", "2003-06-05 16:30:00", "The system content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "9c9aab05b15048c59bc35c8461507deb", "1"); INSERT INTO t1 VALUES("2f6161e879db43c1a5b82c21ddc49089", "Default", "System", "2003-06-09 10:52:02", "The default content repository folder.", "3", "2003-06-05 16:30:00", "System", "0", NULL, "03eea05112b845949f3fd03278b5fe43", "1"); INSERT INTO t1 VALUES("c373e9f5ad0791724315444553544200", "AddDocumentTest", "admin", "2003-06-09 10:51:25", "Movie Reviews", "0", "2003-06-09 10:51:25", "admin", "0", "2f6161e879db43c1a5b82c21ddc49089", "03eea05112b845949f3fd03278b5fe43", NULL); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1'); ---enable_view_protocol +SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1') as exp; drop table t1; # @@ -73,10 +70,7 @@ INSERT INTO t1 VALUES (1),(2),(3); INSERT INTO t3 VALUES (1,1),(2,2),(3,3); INSERT INTO t2 VALUES (1,1),(2,2),(3,3); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT distinct p1.processor_id, (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id) FROM t1 p1; ---enable_view_protocol +SELECT distinct p1.processor_id, (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id) as result FROM t1 p1; drop table t2,t1,t3; # @@ -214,8 +208,6 @@ `t3_id` int NOT NULL ); INSERT INTO `t3` VALUES (3); -#enable after fix MDEV-27871 ---disable_view_protocol select (SELECT rs.t2_id FROM t2 rs @@ -223,9 +215,8 @@ (SELECT lt.t1_id FROM t1 lt WHERE lt.t3_id=a.t3_id) - ORDER BY b DESC LIMIT 1) + ORDER BY b DESC LIMIT 1) as exp from t3 AS a; ---enable_view_protocol # repeat above query in SP --disable_warnings DROP PROCEDURE IF EXISTS p1; @@ -641,8 +632,6 @@ --echo # MDEV-26047: MariaDB server crash at Item_subselect::init_expr_cache_tracker --echo # CREATE TABLE t1 (a int) engine=innodb; -#enable abter fix MDEV-27871 ---disable_view_protocol SELECT 1 IN ( SELECT NULL FROM t1 @@ -650,8 +639,7 @@ a IS NOT NULL GROUP BY (SELECT NULL from dual WHERE a = 1) -); ---enable_view_protocol +) as exp; drop table t1; --echo # Testcase from MDEV-26164 @@ -673,10 +661,7 @@ INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 (b INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (3),(4); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT 1 IN (SELECT a FROM t1 LEFT JOIN t2 ON (a = b AND EXISTS (SELECT * FROM t1))); ---enable_view_protocol +SELECT 1 IN (SELECT a FROM t1 LEFT JOIN t2 ON (a = b AND EXISTS (SELECT * FROM t1))) as exp; drop table t1,t2; --echo # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_mat.result mariadb-10.11.9/mysql-test/main/subselect_mat.result --- mariadb-10.11.6/mysql-test/main/subselect_mat.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_mat.result 2024-08-03 07:29:57.000000000 +0000 @@ -2951,16 +2951,15 @@ set @@optimizer_switch='materialization=on,partial_match_rowid_merge=on,partial_match_table_scan=off,in_to_exists=off'; EXPLAIN SELECT (f1, f2, f3) NOT IN -(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) as exp FROM t2; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t2 system NULL NULL NULL NULL 1 2 MATERIALIZED t1 ALL NULL NULL NULL NULL 2 Using filesort SELECT (f1, f2, f3) NOT IN -(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) as exp FROM t2; -(f1, f2, f3) NOT IN -(SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) +exp 1 drop table t1, t2; # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_mat.test mariadb-10.11.9/mysql-test/main/subselect_mat.test --- mariadb-10.11.6/mysql-test/main/subselect_mat.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_mat.test 2024-08-03 07:29:57.000000000 +0000 @@ -192,19 +192,15 @@ set @@optimizer_switch='materialization=on,partial_match_rowid_merge=on,partial_match_table_scan=off,in_to_exists=off'; -#enable after fix MDEV-27871 ---disable_view_protocol EXPLAIN SELECT (f1, f2, f3) NOT IN - (SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) + (SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) as exp FROM t2; SELECT (f1, f2, f3) NOT IN - (SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) + (SELECT COUNT(DISTINCT f2), f1, f3 FROM t1 GROUP BY f1, f3) as exp FROM t2; ---enable_view_protocol - drop table t1, t2; --echo # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_mat_analyze_json.result mariadb-10.11.9/mysql-test/main/subselect_mat_analyze_json.result --- mariadb-10.11.6/mysql-test/main/subselect_mat_analyze_json.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_mat_analyze_json.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,1188 @@ +set @save_optimizer_switch=@@optimizer_switch; +create table t1 (a int); +create table t2 (b int); +insert into t1 values (null), (1), (2), (3); +insert into t2 values (3), (4); +set @@optimizer_switch = "materialization=on,in_to_exists=off,semijoin=off"; +explain format=json select * from t1 where a in (select b from t2); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "rows": 4, + "filtered": 100, + "attached_condition": "(t1.a,t1.a in (subquery#2))" + } + } + ], + "subqueries": [ + { + "materialization": { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 2, + "filtered": 100 + } + } + ] + } + } + } + ] + } +} +# "Complete match" execution strategy +analyze format=json select * from t1 where a in (select b from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 25, + "attached_condition": "(t1.a,t1.a in (subquery#2))" + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup", + "r_loops": 3, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +# "Partial match" is used due to NOT IN +# Force rowid-merge partial partial matching +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +analyze format=json select * from t1 where a not in (select b from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 50, + "attached_condition": "!(t1.a,t1.a in (subquery#2))" + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;array merge for partial match", + "r_loops": 4, + "r_index_lookups": 3, + "r_partial_matches": 1, + "r_partial_match_buffer_size": "REPLACED", + "r_partial_match_array_sizes": ["2"], + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +# Force table scan partial matching +set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on"; +analyze format=json select * from t1 where a not in (select b from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 50, + "attached_condition": "!(t1.a,t1.a in (subquery#2))" + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 4, + "r_index_lookups": 3, + "r_partial_matches": 1, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +# Subselect in GROUP BY +analyze format=json select a from t1 group by a in (select b from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "filesort": { + "sort_key": "(t1.a,t1.a in (subquery#2))", + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "r_used_priority_queue": false, + "r_output_rows": 3, + "r_buffer_size": "REPLACED", + "r_sort_mode": "sort_key,rowid", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 4, + "r_index_lookups": 3, + "r_partial_matches": 1, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } + } + } +} +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +analyze format=json select a from t1 group by a not in (select b from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "filesort": { + "sort_key": "!(t1.a,t1.a in (subquery#2))", + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "r_used_priority_queue": false, + "r_output_rows": 3, + "r_buffer_size": "REPLACED", + "r_sort_mode": "sort_key,rowid", + "temporary_table": { + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;array merge for partial match", + "r_loops": 4, + "r_index_lookups": 3, + "r_partial_matches": 1, + "r_partial_match_buffer_size": "REPLACED", + "r_partial_match_array_sizes": ["2"], + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } + } + } +} +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=on"; +# Subselect in ORDER BY +analyze format=json select a from t1 order by a in (select b from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "read_sorted_file": { + "r_rows": 4, + "filesort": { + "sort_key": "(t1.a,t1.a in (subquery#2))", + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "r_used_priority_queue": false, + "r_output_rows": 4, + "r_buffer_size": "REPLACED", + "r_sort_mode": "sort_key,addon_fields", + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 4, + "r_index_lookups": 3, + "r_partial_matches": 1, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +# Subselect in HAVING +analyze format=json select a from t1 having a not in (select b from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "having_condition": "!(t1.a,t1.a in (subquery#2))", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 4, + "r_index_lookups": 3, + "r_partial_matches": 1, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +# Nested IN +analyze format=json select a from t1 where a in (select a from t1 where a in (select b from t2)); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 25, + "attached_condition": "(t1.a,t1.a in (subquery#2))" + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup", + "r_loops": 3, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 25, + "attached_condition": "(t1.a,t1.a in (subquery#3))" + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup", + "r_loops": 3, + "query_block": { + "select_id": 3, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } + } + } + ] + } +} +create table t3 (c int); +insert into t3 (c) values (3), (null), (4); +# Subquery in ON-clause of outer join +analyze format=json select a from t1 left join t2 on a not in (select c from t3); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "const_condition": "1", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + }, + { + "block-nl-join": { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + }, + "buffer_type": "flat", + "buffer_size": "87", + "join_type": "BNL", + "attached_condition": "trigcond(trigcond(!(t1.a,t1.a in (subquery#2))))", + "r_loops": 4, + "r_filtered": 50, + "r_unpack_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_effective_rows": 2 + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 4, + "r_index_lookups": 3, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t3", + "access_type": "ALL", + "r_loops": 1, + "rows": 3, + "r_rows": 3, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +analyze format=json +select (b, b + 1, b + 2) not in +(select count(distinct a), a + 1, a + 2 from t1 group by a + 1, a + 2) +from t2; +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 2, + "r_rows": 2, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 2, + "r_index_lookups": 2, + "r_partial_matches": 2, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "read_sorted_file": { + "r_rows": 4, + "filesort": { + "sort_key": "t1.a + 1, t1.a + 2", + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "r_used_priority_queue": false, + "r_output_rows": 4, + "r_buffer_size": "REPLACED", + "r_sort_mode": "sort_key,addon_fields", + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + } + } + ] + } + } + } + ] + } +} +drop table t1, t2, t3; +# +# Tables with more than one column +# +create table t1 (a1 char(1), a2 char(1)); +insert into t1 values (null, 'b'); +create table t2 (b1 char(1), b2 char(2)); +insert into t2 values ('a','b'), ('c', 'd'), (null, 'e'), ('f', 'g'); +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +explain format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "const_condition": "!((NULL,'b'),(NULL,'b') in (subquery#2))", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "rows": 1, + "filtered": 100 + } + } + ], + "subqueries": [ + { + "materialization": { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 4, + "filtered": 100 + } + } + ] + } + } + } + ] + } +} +analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "const_condition": "!((NULL,'b'),(NULL,'b') in (subquery#2))", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "r_loops": 0, + "rows": 1, + "r_rows": null, + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": null + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;array merge for partial match", + "r_loops": 1, + "r_partial_matches": 1, + "r_partial_match_buffer_size": "REPLACED", + "r_partial_match_array_sizes": ["4", "3"], + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on"; +analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2); +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "const_condition": "!((NULL,'b'),(NULL,'b') in (subquery#2))", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "r_loops": 0, + "rows": 1, + "r_rows": null, + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": null + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 1, + "r_partial_matches": 1, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +# Subquery in SELECT list +explain format=json select t1.*, (a1, a2) in (select * from t2) as in_res from t1; +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "rows": 1, + "filtered": 100 + } + } + ], + "subqueries": [ + { + "materialization": { + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "rows": 4, + "filtered": 100 + } + } + ] + } + } + } + ] + } +} +analyze format=json select t1.*, (a1, a2) in (select * from t2) as in_res from t1; +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "r_loops": 0, + "rows": 1, + "r_rows": null, + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": null + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 1, + "r_partial_matches": 1, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +analyze format=json select t1.*, (a1, a2) not in (select * from t2) as in_res from t1; +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "r_loops": 0, + "rows": 1, + "r_rows": null, + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": null + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;full scan for partial match", + "r_loops": 1, + "r_partial_matches": 1, + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +analyze format=json select t1.*, (a1, a2) in (select * from t2) as in_res from t1; +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "r_loops": 0, + "rows": 1, + "r_rows": null, + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": null + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;array merge for partial match", + "r_loops": 1, + "r_partial_matches": 1, + "r_partial_match_buffer_size": "REPLACED", + "r_partial_match_array_sizes": ["4", "3"], + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +analyze format=json select t1.*, (a1, a2) not in (select * from t2) as in_res from t1; +ANALYZE +{ + "query_optimization": { + "r_total_time_ms": "REPLACED" + }, + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "system", + "r_loops": 0, + "rows": 1, + "r_rows": null, + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": null + } + } + ], + "subqueries": [ + { + "materialization": { + "r_strategy": "index_lookup;array merge for partial match", + "r_loops": 1, + "r_partial_matches": 1, + "r_partial_match_buffer_size": "REPLACED", + "r_partial_match_array_sizes": ["4", "3"], + "query_block": { + "select_id": 2, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 4, + "r_rows": 4, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + ] + } +} +drop table t1,t2; +set @@optimizer_switch=@save_optimizer_switch; diff -Nru mariadb-10.11.6/mysql-test/main/subselect_mat_analyze_json.test mariadb-10.11.9/mysql-test/main/subselect_mat_analyze_json.test --- mariadb-10.11.6/mysql-test/main/subselect_mat_analyze_json.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_mat_analyze_json.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,99 @@ +set @save_optimizer_switch=@@optimizer_switch; + +create table t1 (a int); +create table t2 (b int); +insert into t1 values (null), (1), (2), (3); +insert into t2 values (3), (4); + +set @@optimizer_switch = "materialization=on,in_to_exists=off,semijoin=off"; + +explain format=json select * from t1 where a in (select b from t2); +--echo # "Complete match" execution strategy +--source include/analyze-format.inc +analyze format=json select * from t1 where a in (select b from t2); + +--echo # "Partial match" is used due to NOT IN +--echo # Force rowid-merge partial partial matching +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +--source include/analyze-format.inc +analyze format=json select * from t1 where a not in (select b from t2); + +--echo # Force table scan partial matching +set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on"; +--source include/analyze-format.inc +analyze format=json select * from t1 where a not in (select b from t2); + +--echo # Subselect in GROUP BY +--source include/analyze-format.inc +analyze format=json select a from t1 group by a in (select b from t2); + +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +--source include/analyze-format.inc +analyze format=json select a from t1 group by a not in (select b from t2); + +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=on"; +--echo # Subselect in ORDER BY +--source include/analyze-format.inc +analyze format=json select a from t1 order by a in (select b from t2); + +--echo # Subselect in HAVING +--source include/analyze-format.inc +analyze format=json select a from t1 having a not in (select b from t2); + +--echo # Nested IN +--source include/analyze-format.inc +analyze format=json select a from t1 where a in (select a from t1 where a in (select b from t2)); + +create table t3 (c int); +insert into t3 (c) values (3), (null), (4); + +--echo # Subquery in ON-clause of outer join +--source include/analyze-format.inc +analyze format=json select a from t1 left join t2 on a not in (select c from t3); + +--source include/analyze-format.inc +analyze format=json +select (b, b + 1, b + 2) not in + (select count(distinct a), a + 1, a + 2 from t1 group by a + 1, a + 2) +from t2; + +drop table t1, t2, t3; + + +--echo # +--echo # Tables with more than one column +--echo # +create table t1 (a1 char(1), a2 char(1)); +insert into t1 values (null, 'b'); +create table t2 (b1 char(1), b2 char(2)); +insert into t2 values ('a','b'), ('c', 'd'), (null, 'e'), ('f', 'g'); + +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +explain format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2); +--source include/analyze-format.inc +analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2); + +set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on"; +--source include/analyze-format.inc +analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2); + +--echo # Subquery in SELECT list +explain format=json select t1.*, (a1, a2) in (select * from t2) as in_res from t1; + +--source include/analyze-format.inc +analyze format=json select t1.*, (a1, a2) in (select * from t2) as in_res from t1; + +--source include/analyze-format.inc +analyze format=json select t1.*, (a1, a2) not in (select * from t2) as in_res from t1; + +set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off"; +--source include/analyze-format.inc +analyze format=json select t1.*, (a1, a2) in (select * from t2) as in_res from t1; + +--source include/analyze-format.inc +analyze format=json select t1.*, (a1, a2) not in (select * from t2) as in_res from t1; + +drop table t1,t2; + + +set @@optimizer_switch=@save_optimizer_switch; diff -Nru mariadb-10.11.6/mysql-test/main/subselect_no_exists_to_in.result mariadb-10.11.9/mysql-test/main/subselect_no_exists_to_in.result --- mariadb-10.11.6/mysql-test/main/subselect_no_exists_to_in.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_no_exists_to_in.result 2024-08-03 07:29:57.000000000 +0000 @@ -1322,7 +1322,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(3) DEFAULT NULL + `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; create table t1 (a int); @@ -7161,23 +7161,26 @@ # # MDEV-7565: Server crash with Signal 6 (part 2) # +create table t1 (id int not null primary key); Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` Group By TestCase.Revenue, TestCase.TemplateID; ControlRev NULL +drop table t1; # # MDEV-7445:Server crash with Signal 6 # +create table t1 (id int not null primary key); CREATE PROCEDURE procedure2() BEGIN Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` @@ -7190,6 +7193,7 @@ ControlRev NULL drop procedure procedure2; +drop table t1; # # MDEV-7846:Server crashes in Item_subselect::fix #_fields or fails with Thread stack overrun @@ -7495,6 +7499,45 @@ SELECT ROW(1,2) = (1 = ANY (SELECT 1 UNION SELECT 2)); ERROR HY000: Illegal parameter data types row and boolean for operation '=' # +# MDEV-29070 SIGSEGV in my_decimal::operator= and Assertion `0' failed +# in Item_type_holder::val_decimal on SELECT +# +CREATE TABLE t1(a INT UNIQUE); +INSERT INTO t1(a) VALUES (1); +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT 1, 1); +a +1 +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT a, a); +a +1 +UPDATE t1 SET a = 0 +WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT +1 / +1, a FROM t1 WHERE a > -0+1) IN (SELECT a, a); +SELECT a FROM t1 WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT + 1 / + 1, a FROM t1 +WHERE a > -0 + 1) IN (SELECT a, a); +a +CREATE TABLE x (x INT); +INSERT INTO x (x) VALUES (1); +UPDATE x SET x = 1 WHERE x = 1; +INSERT INTO x (x) VALUES (1), (1); +WITH RECURSIVE x (x) AS ( +SELECT 1 INTERSECT +SELECT -(SELECT 1.000000 AS x +UNION +SELECT 1.000000 ORDER BY NOT x < 'x', +-(SELECT 1 + x/1.000000 IN (1, 1) FROM x +WHERE x ORDER BY 1 - x) DESC LIMIT 1 OFFSET 1 +) + 1 FROM x +) +SELECT DISTINCT x, 1, NULL, 1.000000 +FROM x +WHERE (SELECT (SELECT x WHERE x IN (SELECT x FROM x))) > +(SELECT (SELECT x ORDER BY x = x OR (x = 1 AND x = 1) DESC)) +ORDER BY x ASC, x DESC, x; +ERROR HY000: Restrictions imposed on recursive definitions are violated for table 'x' +DROP TABLE t1, x; +# # End of 10.4 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_no_mat.result mariadb-10.11.9/mysql-test/main/subselect_no_mat.result --- mariadb-10.11.6/mysql-test/main/subselect_no_mat.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_no_mat.result 2024-08-03 07:29:57.000000000 +0000 @@ -1325,7 +1325,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(3) DEFAULT NULL + `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; create table t1 (a int); @@ -7154,23 +7154,26 @@ # # MDEV-7565: Server crash with Signal 6 (part 2) # +create table t1 (id int not null primary key); Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` Group By TestCase.Revenue, TestCase.TemplateID; ControlRev NULL +drop table t1; # # MDEV-7445:Server crash with Signal 6 # +create table t1 (id int not null primary key); CREATE PROCEDURE procedure2() BEGIN Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` @@ -7183,6 +7186,7 @@ ControlRev NULL drop procedure procedure2; +drop table t1; # # MDEV-7846:Server crashes in Item_subselect::fix #_fields or fails with Thread stack overrun @@ -7488,6 +7492,45 @@ SELECT ROW(1,2) = (1 = ANY (SELECT 1 UNION SELECT 2)); ERROR HY000: Illegal parameter data types row and boolean for operation '=' # +# MDEV-29070 SIGSEGV in my_decimal::operator= and Assertion `0' failed +# in Item_type_holder::val_decimal on SELECT +# +CREATE TABLE t1(a INT UNIQUE); +INSERT INTO t1(a) VALUES (1); +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT 1, 1); +a +1 +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT a, a); +a +1 +UPDATE t1 SET a = 0 +WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT +1 / +1, a FROM t1 WHERE a > -0+1) IN (SELECT a, a); +SELECT a FROM t1 WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT + 1 / + 1, a FROM t1 +WHERE a > -0 + 1) IN (SELECT a, a); +a +CREATE TABLE x (x INT); +INSERT INTO x (x) VALUES (1); +UPDATE x SET x = 1 WHERE x = 1; +INSERT INTO x (x) VALUES (1), (1); +WITH RECURSIVE x (x) AS ( +SELECT 1 INTERSECT +SELECT -(SELECT 1.000000 AS x +UNION +SELECT 1.000000 ORDER BY NOT x < 'x', +-(SELECT 1 + x/1.000000 IN (1, 1) FROM x +WHERE x ORDER BY 1 - x) DESC LIMIT 1 OFFSET 1 +) + 1 FROM x +) +SELECT DISTINCT x, 1, NULL, 1.000000 +FROM x +WHERE (SELECT (SELECT x WHERE x IN (SELECT x FROM x))) > +(SELECT (SELECT x ORDER BY x = x OR (x = 1 AND x = 1) DESC)) +ORDER BY x ASC, x DESC, x; +ERROR HY000: Restrictions imposed on recursive definitions are violated for table 'x' +DROP TABLE t1, x; +# # End of 10.4 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_no_opts.result mariadb-10.11.9/mysql-test/main/subselect_no_opts.result --- mariadb-10.11.6/mysql-test/main/subselect_no_opts.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_no_opts.result 2024-08-03 07:29:57.000000000 +0000 @@ -1321,7 +1321,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(3) DEFAULT NULL + `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; create table t1 (a int); @@ -7152,23 +7152,26 @@ # # MDEV-7565: Server crash with Signal 6 (part 2) # +create table t1 (id int not null primary key); Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` Group By TestCase.Revenue, TestCase.TemplateID; ControlRev NULL +drop table t1; # # MDEV-7445:Server crash with Signal 6 # +create table t1 (id int not null primary key); CREATE PROCEDURE procedure2() BEGIN Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` @@ -7181,6 +7184,7 @@ ControlRev NULL drop procedure procedure2; +drop table t1; # # MDEV-7846:Server crashes in Item_subselect::fix #_fields or fails with Thread stack overrun @@ -7486,6 +7490,45 @@ SELECT ROW(1,2) = (1 = ANY (SELECT 1 UNION SELECT 2)); ERROR HY000: Illegal parameter data types row and boolean for operation '=' # +# MDEV-29070 SIGSEGV in my_decimal::operator= and Assertion `0' failed +# in Item_type_holder::val_decimal on SELECT +# +CREATE TABLE t1(a INT UNIQUE); +INSERT INTO t1(a) VALUES (1); +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT 1, 1); +a +1 +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT a, a); +a +1 +UPDATE t1 SET a = 0 +WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT +1 / +1, a FROM t1 WHERE a > -0+1) IN (SELECT a, a); +SELECT a FROM t1 WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT + 1 / + 1, a FROM t1 +WHERE a > -0 + 1) IN (SELECT a, a); +a +CREATE TABLE x (x INT); +INSERT INTO x (x) VALUES (1); +UPDATE x SET x = 1 WHERE x = 1; +INSERT INTO x (x) VALUES (1), (1); +WITH RECURSIVE x (x) AS ( +SELECT 1 INTERSECT +SELECT -(SELECT 1.000000 AS x +UNION +SELECT 1.000000 ORDER BY NOT x < 'x', +-(SELECT 1 + x/1.000000 IN (1, 1) FROM x +WHERE x ORDER BY 1 - x) DESC LIMIT 1 OFFSET 1 +) + 1 FROM x +) +SELECT DISTINCT x, 1, NULL, 1.000000 +FROM x +WHERE (SELECT (SELECT x WHERE x IN (SELECT x FROM x))) > +(SELECT (SELECT x ORDER BY x = x OR (x = 1 AND x = 1) DESC)) +ORDER BY x ASC, x DESC, x; +ERROR HY000: Restrictions imposed on recursive definitions are violated for table 'x' +DROP TABLE t1, x; +# # End of 10.4 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_no_scache.result mariadb-10.11.9/mysql-test/main/subselect_no_scache.result --- mariadb-10.11.6/mysql-test/main/subselect_no_scache.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_no_scache.result 2024-08-03 07:29:57.000000000 +0000 @@ -1324,7 +1324,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(3) DEFAULT NULL + `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; create table t1 (a int); @@ -7167,23 +7167,26 @@ # # MDEV-7565: Server crash with Signal 6 (part 2) # +create table t1 (id int not null primary key); Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` Group By TestCase.Revenue, TestCase.TemplateID; ControlRev NULL +drop table t1; # # MDEV-7445:Server crash with Signal 6 # +create table t1 (id int not null primary key); CREATE PROCEDURE procedure2() BEGIN Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` @@ -7196,6 +7199,7 @@ ControlRev NULL drop procedure procedure2; +drop table t1; # # MDEV-7846:Server crashes in Item_subselect::fix #_fields or fails with Thread stack overrun @@ -7501,6 +7505,45 @@ SELECT ROW(1,2) = (1 = ANY (SELECT 1 UNION SELECT 2)); ERROR HY000: Illegal parameter data types row and boolean for operation '=' # +# MDEV-29070 SIGSEGV in my_decimal::operator= and Assertion `0' failed +# in Item_type_holder::val_decimal on SELECT +# +CREATE TABLE t1(a INT UNIQUE); +INSERT INTO t1(a) VALUES (1); +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT 1, 1); +a +1 +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT a, a); +a +1 +UPDATE t1 SET a = 0 +WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT +1 / +1, a FROM t1 WHERE a > -0+1) IN (SELECT a, a); +SELECT a FROM t1 WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT + 1 / + 1, a FROM t1 +WHERE a > -0 + 1) IN (SELECT a, a); +a +CREATE TABLE x (x INT); +INSERT INTO x (x) VALUES (1); +UPDATE x SET x = 1 WHERE x = 1; +INSERT INTO x (x) VALUES (1), (1); +WITH RECURSIVE x (x) AS ( +SELECT 1 INTERSECT +SELECT -(SELECT 1.000000 AS x +UNION +SELECT 1.000000 ORDER BY NOT x < 'x', +-(SELECT 1 + x/1.000000 IN (1, 1) FROM x +WHERE x ORDER BY 1 - x) DESC LIMIT 1 OFFSET 1 +) + 1 FROM x +) +SELECT DISTINCT x, 1, NULL, 1.000000 +FROM x +WHERE (SELECT (SELECT x WHERE x IN (SELECT x FROM x))) > +(SELECT (SELECT x ORDER BY x = x OR (x = 1 AND x = 1) DESC)) +ORDER BY x ASC, x DESC, x; +ERROR HY000: Restrictions imposed on recursive definitions are violated for table 'x' +DROP TABLE t1, x; +# # End of 10.4 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_no_semijoin.result mariadb-10.11.9/mysql-test/main/subselect_no_semijoin.result --- mariadb-10.11.6/mysql-test/main/subselect_no_semijoin.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_no_semijoin.result 2024-08-03 07:29:57.000000000 +0000 @@ -1321,7 +1321,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( - `a` int(3) DEFAULT NULL + `a` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; create table t1 (a int); @@ -7152,23 +7152,26 @@ # # MDEV-7565: Server crash with Signal 6 (part 2) # +create table t1 (id int not null primary key); Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` Group By TestCase.Revenue, TestCase.TemplateID; ControlRev NULL +drop table t1; # # MDEV-7445:Server crash with Signal 6 # +create table t1 (id int not null primary key); CREATE PROCEDURE procedure2() BEGIN Select -(Select Sum(`TestCase`.Revenue) From mysql.slow_log E -Where TestCase.TemplateID not in (Select 1 from mysql.slow_log where 2=2) +(Select Sum(`TestCase`.Revenue) From t1 E +Where TestCase.TemplateID not in (Select 1 from t1 where 2=2) ) As `ControlRev` From (Select 3 as Revenue, 4 as TemplateID) As `TestCase` @@ -7181,6 +7184,7 @@ ControlRev NULL drop procedure procedure2; +drop table t1; # # MDEV-7846:Server crashes in Item_subselect::fix #_fields or fails with Thread stack overrun @@ -7486,6 +7490,45 @@ SELECT ROW(1,2) = (1 = ANY (SELECT 1 UNION SELECT 2)); ERROR HY000: Illegal parameter data types row and boolean for operation '=' # +# MDEV-29070 SIGSEGV in my_decimal::operator= and Assertion `0' failed +# in Item_type_holder::val_decimal on SELECT +# +CREATE TABLE t1(a INT UNIQUE); +INSERT INTO t1(a) VALUES (1); +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT 1, 1); +a +1 +SELECT a FROM t1 WHERE (SELECT a, a UNION SELECT 1, a FROM t1) IN (SELECT a, a); +a +1 +UPDATE t1 SET a = 0 +WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT +1 / +1, a FROM t1 WHERE a > -0+1) IN (SELECT a, a); +SELECT a FROM t1 WHERE (SELECT a, a WHERE a < 0 INTERSECT +SELECT + 1 / + 1, a FROM t1 +WHERE a > -0 + 1) IN (SELECT a, a); +a +CREATE TABLE x (x INT); +INSERT INTO x (x) VALUES (1); +UPDATE x SET x = 1 WHERE x = 1; +INSERT INTO x (x) VALUES (1), (1); +WITH RECURSIVE x (x) AS ( +SELECT 1 INTERSECT +SELECT -(SELECT 1.000000 AS x +UNION +SELECT 1.000000 ORDER BY NOT x < 'x', +-(SELECT 1 + x/1.000000 IN (1, 1) FROM x +WHERE x ORDER BY 1 - x) DESC LIMIT 1 OFFSET 1 +) + 1 FROM x +) +SELECT DISTINCT x, 1, NULL, 1.000000 +FROM x +WHERE (SELECT (SELECT x WHERE x IN (SELECT x FROM x))) > +(SELECT (SELECT x ORDER BY x = x OR (x = 1 AND x = 1) DESC)) +ORDER BY x ASC, x DESC, x; +ERROR HY000: Restrictions imposed on recursive definitions are violated for table 'x' +DROP TABLE t1, x; +# # End of 10.4 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_nulls_innodb.result mariadb-10.11.9/mysql-test/main/subselect_nulls_innodb.result --- mariadb-10.11.6/mysql-test/main/subselect_nulls_innodb.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_nulls_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,27 @@ +# +# MDEV-32090 Index does not handle null-safe equals operator correctly in join +# +CREATE TEMPORARY TABLE t1 ( +`id` int(10) unsigned NOT NULL, +`number` int(10) unsigned DEFAULT 0, +`name` varchar(47) DEFAULT NULL, +`street` mediumint(8) unsigned DEFAULT NULL, +PRIMARY KEY (`id`), +KEY `streetNumber` (`street`,`number`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; +INSERT INTO t1 (id, number, name, street) VALUES (100733476, 14, NULL, 1115569); +SELECT +b1.id +FROM +t1 b1 +INNER JOIN t1 b2 ON ( +b1.street = b2.street +AND b1.number <=> b2.number +AND b1.name <=> b2.name +); +id +100733476 +DROP TABLE t1; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/subselect_nulls_innodb.test mariadb-10.11.9/mysql-test/main/subselect_nulls_innodb.test --- mariadb-10.11.6/mysql-test/main/subselect_nulls_innodb.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_nulls_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,32 @@ +--source include/have_innodb.inc + +--echo # +--echo # MDEV-32090 Index does not handle null-safe equals operator correctly in join +--echo # + +CREATE TEMPORARY TABLE t1 ( + `id` int(10) unsigned NOT NULL, + `number` int(10) unsigned DEFAULT 0, + `name` varchar(47) DEFAULT NULL, + `street` mediumint(8) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `streetNumber` (`street`,`number`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + +INSERT INTO t1 (id, number, name, street) VALUES (100733476, 14, NULL, 1115569); + +SELECT + b1.id +FROM + t1 b1 + INNER JOIN t1 b2 ON ( + b1.street = b2.street + AND b1.number <=> b2.number + AND b1.name <=> b2.name + ); + +DROP TABLE t1; + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/subselect_sj_mat.test mariadb-10.11.9/mysql-test/main/subselect_sj_mat.test --- mariadb-10.11.6/mysql-test/main/subselect_sj_mat.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/subselect_sj_mat.test 2024-08-03 07:29:57.000000000 +0000 @@ -523,8 +523,6 @@ # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB -#Check after fix MDEV-31276 ---disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_512 where a1 in (select group_concat(b1) from t2_512 group by b2); @@ -542,7 +540,6 @@ select left(a1,7), left(a2,7) from t1_512 where a1 in (select group_concat(b1) from t2_512 group by b2); ---enable_ps2_protocol drop table t1_512, t2_512, t3_512; @@ -608,8 +605,6 @@ # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB -#Check after fix MDEV-31276 ---disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_1024 where a1 in (select group_concat(b1) from t2_1024 group by b2); @@ -627,7 +622,6 @@ select left(a1,7), left(a2,7) from t1_1024 where a1 in (select group_concat(b1) from t2_1024 group by b2); ---enable_ps2_protocol drop table t1_1024, t2_1024, t3_1024; @@ -693,8 +687,6 @@ # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB -#Check after fix MDEV-31276 ---disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_1025 where a1 in (select group_concat(b1) from t2_1025 group by b2); @@ -712,7 +704,6 @@ select left(a1,7), left(a2,7) from t1_1025 where a1 in (select group_concat(b1) from t2_1025 group by b2); ---enable_ps2_protocol drop table t1_1025, t2_1025, t3_1025; diff -Nru mariadb-10.11.6/mysql-test/main/system_mysql_db_fix50030.result mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50030.result --- mariadb-10.11.6/mysql-test/main/system_mysql_db_fix50030.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50030.result 2024-08-03 07:29:57.000000000 +0000 @@ -151,7 +151,7 @@ show create table procs_priv; Table Create Table procs_priv CREATE TABLE `procs_priv` ( - `Host` char(60) NOT NULL DEFAULT '', + `Host` char(255) NOT NULL DEFAULT '', `Db` char(64) NOT NULL DEFAULT '', `User` char(128) NOT NULL DEFAULT '', `Routine_name` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '', diff -Nru mariadb-10.11.6/mysql-test/main/system_mysql_db_fix50117.result mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50117.result --- mariadb-10.11.6/mysql-test/main/system_mysql_db_fix50117.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50117.result 2024-08-03 07:29:57.000000000 +0000 @@ -131,7 +131,7 @@ show create table procs_priv; Table Create Table procs_priv CREATE TABLE `procs_priv` ( - `Host` char(60) NOT NULL DEFAULT '', + `Host` char(255) NOT NULL DEFAULT '', `Db` char(64) NOT NULL DEFAULT '', `User` char(128) NOT NULL DEFAULT '', `Routine_name` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '', diff -Nru mariadb-10.11.6/mysql-test/main/system_mysql_db_fix50568.result mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50568.result --- mariadb-10.11.6/mysql-test/main/system_mysql_db_fix50568.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/system_mysql_db_fix50568.result 2024-08-03 07:29:57.000000000 +0000 @@ -152,7 +152,7 @@ show create table procs_priv; Table Create Table procs_priv CREATE TABLE `procs_priv` ( - `Host` char(60) NOT NULL DEFAULT '', + `Host` char(255) NOT NULL DEFAULT '', `Db` char(64) NOT NULL DEFAULT '', `User` char(128) NOT NULL DEFAULT '', `Routine_name` char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT '', diff -Nru mariadb-10.11.6/mysql-test/main/table_value_constr.result mariadb-10.11.9/mysql-test/main/table_value_constr.result --- mariadb-10.11.6/mysql-test/main/table_value_constr.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/table_value_constr.result 2024-08-03 07:29:57.000000000 +0000 @@ -2621,9 +2621,9 @@ VALUES (DEFAULT); ERROR HY000: 'default' is not allowed in this context EXECUTE IMMEDIATE 'VALUES (?)' USING IGNORE; -ERROR HY000: 'ignore' is not allowed in this context +ERROR HY000: Default/ignore value is not supported for such parameter usage EXECUTE IMMEDIATE 'VALUES (?)' USING DEFAULT; -ERROR HY000: 'default' is not allowed in this context +ERROR HY000: Default/ignore value is not supported for such parameter usage # # MDEV-24675: TVC using subqueries # diff -Nru mariadb-10.11.6/mysql-test/main/table_value_constr.test mariadb-10.11.9/mysql-test/main/table_value_constr.test --- mariadb-10.11.6/mysql-test/main/table_value_constr.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/table_value_constr.test 2024-08-03 07:29:57.000000000 +0000 @@ -1358,9 +1358,9 @@ VALUES (IGNORE); --error ER_NOT_ALLOWED_IN_THIS_CONTEXT VALUES (DEFAULT); ---error ER_NOT_ALLOWED_IN_THIS_CONTEXT +--error ER_INVALID_DEFAULT_PARAM EXECUTE IMMEDIATE 'VALUES (?)' USING IGNORE; ---error ER_NOT_ALLOWED_IN_THIS_CONTEXT +--error ER_INVALID_DEFAULT_PARAM EXECUTE IMMEDIATE 'VALUES (?)' USING DEFAULT; --echo # diff -Nru mariadb-10.11.6/mysql-test/main/temp_table.result mariadb-10.11.9/mysql-test/main/temp_table.result --- mariadb-10.11.6/mysql-test/main/temp_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/temp_table.result 2024-08-03 07:29:57.000000000 +0000 @@ -600,6 +600,71 @@ # # End of 10.2 tests # +# +# MDEV-31523: Using two temporary tables in OPTIMIZE TABLE lead to crash +# +CREATE TEMPORARY TABLE t1 (c INT) ENGINE=MyISAM; +CREATE TEMPORARY TABLE t2 (c INT) ENGINE=MyISAM; +optimize TABLE t1,t2; +Table Op Msg_type Msg_text +test.t1 optimize status Table is already up to date +test.t2 optimize status Table is already up to date +SHOW TABLES; +Tables_in_test +# in 11.2 and above here should be listed above used temporary tables +DROP TEMPORARY TABLE t1, t2; +# +# MDEV-33218: Assertion `active_arena->is_stmt_prepare_or_first_stmt_execute() || active_arena->state == Query_arena::STMT_SP_QUERY_ARGUMENTS' failed. in st_select_lex::fix_prepare_information +# +CREATE VIEW v1 AS SELECT 5; +CREATE PROCEDURE sp() SELECT * FROM v1; +CREATE TEMPORARY TABLE v1 as SELECT 7; +# sp() accesses the temporary table v1 that hides the view with the same name +# Therefore expected output is the row (7) +CALL sp(); +7 +7 +DROP TEMPORARY TABLE v1; +# After the temporary table v1 has been dropped the next invocation of sp() +# accesses the view v1. So, expected output is the row (5) +CALL sp(); +5 +5 +# Clean up +DROP VIEW v1; +DROP PROCEDURE sp; +# Another use case is when a temporary table hides a view is dropped +# inside a stored routine being called. +CREATE VIEW t1 AS SELECT 1; +CREATE PROCEDURE p1() +BEGIN +DROP TEMPORARY TABLE t1; +END +| +CREATE FUNCTION f1() RETURNS INT +BEGIN +CALL p1(); +RETURN 1; +END +| +CREATE TEMPORARY TABLE t1 AS SELECT 1 AS a; +PREPARE stmt FROM 'SELECT f1()'; +EXECUTE stmt; +f1() +1 +# The temporary table t1 has been dropped on first +# execution of the prepared statement 'stmt', +# next time this statement is run it results in issuing +# the error ER_BAD_TABLE_ERROR +EXECUTE stmt; +ERROR 42S02: Unknown table 'test.t1' +# Clean up +DROP VIEW t1; +DROP FUNCTION f1; +DROP PROCEDURE p1; +# +# End of 10.4 tests +# create function f1() returns int begin drop temporary table t1, t2; diff -Nru mariadb-10.11.6/mysql-test/main/temp_table.test mariadb-10.11.9/mysql-test/main/temp_table.test --- mariadb-10.11.6/mysql-test/main/temp_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/temp_table.test 2024-08-03 07:29:57.000000000 +0000 @@ -657,6 +657,76 @@ --echo # End of 10.2 tests --echo # +--echo # +--echo # MDEV-31523: Using two temporary tables in OPTIMIZE TABLE lead to crash +--echo # + +CREATE TEMPORARY TABLE t1 (c INT) ENGINE=MyISAM; +CREATE TEMPORARY TABLE t2 (c INT) ENGINE=MyISAM; +optimize TABLE t1,t2; +SHOW TABLES; +--echo # in 11.2 and above here should be listed above used temporary tables + +DROP TEMPORARY TABLE t1, t2; + +--echo # +--echo # MDEV-33218: Assertion `active_arena->is_stmt_prepare_or_first_stmt_execute() || active_arena->state == Query_arena::STMT_SP_QUERY_ARGUMENTS' failed. in st_select_lex::fix_prepare_information +--echo # +CREATE VIEW v1 AS SELECT 5; +CREATE PROCEDURE sp() SELECT * FROM v1; +CREATE TEMPORARY TABLE v1 as SELECT 7; +--echo # sp() accesses the temporary table v1 that hides the view with the same name +--echo # Therefore expected output is the row (7) +CALL sp(); +DROP TEMPORARY TABLE v1; +--echo # After the temporary table v1 has been dropped the next invocation of sp() +--echo # accesses the view v1. So, expected output is the row (5) +CALL sp(); + +--echo # Clean up +DROP VIEW v1; +DROP PROCEDURE sp; + +--echo # Another use case is when a temporary table hides a view is dropped +--echo # inside a stored routine being called. + +CREATE VIEW t1 AS SELECT 1; + +--delimiter | +CREATE PROCEDURE p1() +BEGIN + DROP TEMPORARY TABLE t1; +END +| + +CREATE FUNCTION f1() RETURNS INT +BEGIN + CALL p1(); + RETURN 1; +END +| + +--delimiter ; + +CREATE TEMPORARY TABLE t1 AS SELECT 1 AS a; +PREPARE stmt FROM 'SELECT f1()'; +EXECUTE stmt; +--echo # The temporary table t1 has been dropped on first +--echo # execution of the prepared statement 'stmt', +--echo # next time this statement is run it results in issuing +--echo # the error ER_BAD_TABLE_ERROR +--error ER_BAD_TABLE_ERROR +EXECUTE stmt; + +--echo # Clean up +DROP VIEW t1; +DROP FUNCTION f1; +DROP PROCEDURE p1; + +--echo # +--echo # End of 10.4 tests +--echo # + # # DROP TEMPORARY TABLE fails in the middle # diff -Nru mariadb-10.11.6/mysql-test/main/temp_table_symlink.test mariadb-10.11.9/mysql-test/main/temp_table_symlink.test --- mariadb-10.11.6/mysql-test/main/temp_table_symlink.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/temp_table_symlink.test 2024-08-03 07:29:57.000000000 +0000 @@ -23,8 +23,10 @@ create temporary table t2 (a int); error 1,1030; create temporary table t3 (a int) engine=Aria; +--disable_view_protocol error 1,1030; select * from information_schema.columns where table_schema='test'; +--enable_view_protocol flush tables; select * from d1; diff -Nru mariadb-10.11.6/mysql-test/main/timezone2.result mariadb-10.11.9/mysql-test/main/timezone2.result --- mariadb-10.11.6/mysql-test/main/timezone2.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/timezone2.result 2024-08-03 07:29:57.000000000 +0000 @@ -2,18 +2,18 @@ drop function if exists f1; create table t1 (ts timestamp); set time_zone='+00:00'; -select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()); -unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) +select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) as exp; +exp 0 insert into t1 (ts) values ('2003-03-30 02:30:00'); set time_zone='+10:30'; -select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()); -unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) +select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) as exp; +exp -37800 insert into t1 (ts) values ('2003-03-30 02:30:00'); set time_zone='-10:00'; -select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()); -unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) +select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) as exp; +exp 36000 insert into t1 (ts) values ('2003-03-30 02:30:00'); select * from t1; @@ -239,20 +239,20 @@ MET 2003-12-30 23:00:00 2003-12-31 01:00:00 UTC 2003-12-31 00:00:00 2003-12-31 00:00:00 drop table t1; -select convert_tz('2003-12-31 04:00:00', NULL, 'UTC'); -convert_tz('2003-12-31 04:00:00', NULL, 'UTC') +select convert_tz('2003-12-31 04:00:00', NULL, 'UTC') as exp; +exp NULL -select convert_tz('2003-12-31 04:00:00', 'SomeNotExistingTimeZone', 'UTC'); -convert_tz('2003-12-31 04:00:00', 'SomeNotExistingTimeZone', 'UTC') +select convert_tz('2003-12-31 04:00:00', 'SomeNotExistingTimeZone', 'UTC') as exp; +exp NULL -select convert_tz('2003-12-31 04:00:00', 'MET', 'SomeNotExistingTimeZone'); -convert_tz('2003-12-31 04:00:00', 'MET', 'SomeNotExistingTimeZone') +select convert_tz('2003-12-31 04:00:00', 'MET', 'SomeNotExistingTimeZone') as exp; +exp NULL -select convert_tz('2003-12-31 04:00:00', 'MET', NULL); -convert_tz('2003-12-31 04:00:00', 'MET', NULL) +select convert_tz('2003-12-31 04:00:00', 'MET', NULL) as exp; +exp NULL -select convert_tz( NULL, 'MET', 'UTC'); -convert_tz( NULL, 'MET', 'UTC') +select convert_tz( NULL, 'MET', 'UTC') as exp; +exp NULL create table t1 (ts timestamp); set timestamp=1000000000; @@ -326,8 +326,8 @@ # # MDEV-5506 safe_mutex: Trying to lock unitialized mutex at safemalloc.c on server shutdown after SELECT with CONVERT_TZ # -SELECT CONVERT_TZ('2001-10-08 00:00:00', MAKE_SET(0,'+01:00'), '+00:00' ); -CONVERT_TZ('2001-10-08 00:00:00', MAKE_SET(0,'+01:00'), '+00:00' ) +SELECT CONVERT_TZ('2001-10-08 00:00:00', MAKE_SET(0,'+01:00'), '+00:00' ) as exp; +exp NULL # # End of 5.3 tests diff -Nru mariadb-10.11.6/mysql-test/main/timezone2.test mariadb-10.11.9/mysql-test/main/timezone2.test --- mariadb-10.11.6/mysql-test/main/timezone2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/timezone2.test 2024-08-03 07:29:57.000000000 +0000 @@ -12,26 +12,21 @@ # create table t1 (ts timestamp); -#enable after fix MDEV-27871 ---disable_view_protocol - set time_zone='+00:00'; -select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()); +select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) as exp; insert into t1 (ts) values ('2003-03-30 02:30:00'); set time_zone='+10:30'; -select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()); +select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) as exp; insert into t1 (ts) values ('2003-03-30 02:30:00'); set time_zone='-10:00'; -select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()); +select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp()) as exp; insert into t1 (ts) values ('2003-03-30 02:30:00'); # Here we will get different results select * from t1; ---enable_view_protocol - drop table t1; @@ -192,17 +187,12 @@ select tz, convert_tz('2003-12-31 00:00:00',tz,'UTC'), convert_tz('2003-12-31 00:00:00','UTC',tz) from t1 order by tz; drop table t1; -#enable after fix MDEV-27871 ---disable_view_protocol - # Parameters to CONVERT_TZ() what should give NULL -select convert_tz('2003-12-31 04:00:00', NULL, 'UTC'); -select convert_tz('2003-12-31 04:00:00', 'SomeNotExistingTimeZone', 'UTC'); -select convert_tz('2003-12-31 04:00:00', 'MET', 'SomeNotExistingTimeZone'); -select convert_tz('2003-12-31 04:00:00', 'MET', NULL); -select convert_tz( NULL, 'MET', 'UTC'); - ---enable_view_protocol +select convert_tz('2003-12-31 04:00:00', NULL, 'UTC') as exp; +select convert_tz('2003-12-31 04:00:00', 'SomeNotExistingTimeZone', 'UTC') as exp; +select convert_tz('2003-12-31 04:00:00', 'MET', 'SomeNotExistingTimeZone') as exp; +select convert_tz('2003-12-31 04:00:00', 'MET', NULL) as exp; +select convert_tz( NULL, 'MET', 'UTC') as exp; # # Test for bug #4508 "CONVERT_TZ() function with new time zone as param @@ -315,12 +305,7 @@ --echo # MDEV-5506 safe_mutex: Trying to lock unitialized mutex at safemalloc.c on server shutdown after SELECT with CONVERT_TZ --echo # -#enable after fix MDEV-27871 ---disable_view_protocol - -SELECT CONVERT_TZ('2001-10-08 00:00:00', MAKE_SET(0,'+01:00'), '+00:00' ); - ---enable_view_protocol +SELECT CONVERT_TZ('2001-10-08 00:00:00', MAKE_SET(0,'+01:00'), '+00:00' ) as exp; --echo # --echo # End of 5.3 tests diff -Nru mariadb-10.11.6/mysql-test/main/trigger.result mariadb-10.11.9/mysql-test/main/trigger.result --- mariadb-10.11.6/mysql-test/main/trigger.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/trigger.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,9 +1,3 @@ -drop table if exists t1, t2, t3, t4; -drop view if exists v1; -drop database if exists mysqltest; -drop function if exists f1; -drop function if exists f2; -drop procedure if exists p1; connect addconroot1, localhost, root,,; connect addconroot2, localhost, root,,; connect addconwithoutdb, localhost, root,,*NO-ONE*; diff -Nru mariadb-10.11.6/mysql-test/main/trigger.test mariadb-10.11.9/mysql-test/main/trigger.test --- mariadb-10.11.6/mysql-test/main/trigger.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/trigger.test 2024-08-03 07:29:57.000000000 +0000 @@ -7,15 +7,6 @@ # Basic triggers test # ---disable_warnings -drop table if exists t1, t2, t3, t4; -drop view if exists v1; -drop database if exists mysqltest; -drop function if exists f1; -drop function if exists f2; -drop procedure if exists p1; ---enable_warnings - # Create additional connections used through test connect (addconroot1, localhost, root,,); connect (addconroot2, localhost, root,,); diff -Nru mariadb-10.11.6/mysql-test/main/trigger_wl3253.result mariadb-10.11.9/mysql-test/main/trigger_wl3253.result --- mariadb-10.11.6/mysql-test/main/trigger_wl3253.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/trigger_wl3253.result 2024-08-03 07:29:57.000000000 +0000 @@ -310,6 +310,7 @@ CREATE TRIGGER tr1_bi BEFORE INSERT ON t1 FOR EACH ROW SET @a:=1; CREATE TRIGGER tr2_bi BEFORE INSERT ON t1 FOR EACH ROW SET @a:=2; CREATE TRIGGER tr1_bu BEFORE UPDATE ON t1 FOR EACH ROW SET @a:=3; +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -372,6 +373,7 @@ CREATE TRIGGER tr0_bi BEFORE INSERT ON t1 FOR EACH ROW PRECEDES tr1_bi SET @a:=0; CREATE TRIGGER tr1_1_bi BEFORE INSERT ON t1 FOR EACH ROW FOLLOWS tr1_bi SET @a:=0; # Expected order of triggers in the dump is: tr0_bi, tr1_bi, tr1_1_bi, tr2_i. +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( diff -Nru mariadb-10.11.6/mysql-test/main/type_char.result mariadb-10.11.9/mysql-test/main/type_char.result --- mariadb-10.11.6/mysql-test/main/type_char.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_char.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,40 @@ +# +# Start of 10.5 tests +# +# +# MDEV-34295 CAST(char_col AS DOUBLE) prints redundant spaces in a warning +# +CREATE TABLE t1 (a CHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci); +INSERT INTO t1 VALUES ('1x'), ('x'); +SELECT a, CAST(a AS DOUBLE) FROM t1 ORDER BY a; +a CAST(a AS DOUBLE) +1x 1 +x 0 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: '1x' +Warning 1292 Truncated incorrect DOUBLE value: 'x' +SELECT a, CAST(a AS DECIMAL(20,2)) FROM t1 ORDER BY a; +a CAST(a AS DECIMAL(20,2)) +1x 1.00 +x 0.00 +Warnings: +Warning 1292 Truncated incorrect DECIMAL value: '1x' +Warning 1292 Truncated incorrect DECIMAL value: 'x' +SELECT a, CAST(a AS SIGNED) FROM t1 ORDER BY a; +a CAST(a AS SIGNED) +1x 1 +x 0 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '1x' +Warning 1292 Truncated incorrect INTEGER value: 'x' +SELECT a, CAST(a AS UNSIGNED) FROM t1 ORDER BY a; +a CAST(a AS UNSIGNED) +1x 1 +x 0 +Warnings: +Warning 1292 Truncated incorrect INTEGER value: '1x' +Warning 1292 Truncated incorrect INTEGER value: 'x' +DROP TABLE t1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/type_char.test mariadb-10.11.9/mysql-test/main/type_char.test --- mariadb-10.11.6/mysql-test/main/type_char.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_char.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,19 @@ +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-34295 CAST(char_col AS DOUBLE) prints redundant spaces in a warning +--echo # + +CREATE TABLE t1 (a CHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci); +INSERT INTO t1 VALUES ('1x'), ('x'); +SELECT a, CAST(a AS DOUBLE) FROM t1 ORDER BY a; +SELECT a, CAST(a AS DECIMAL(20,2)) FROM t1 ORDER BY a; +SELECT a, CAST(a AS SIGNED) FROM t1 ORDER BY a; +SELECT a, CAST(a AS UNSIGNED) FROM t1 ORDER BY a; +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/type_datetime.result mariadb-10.11.9/mysql-test/main/type_datetime.result --- mariadb-10.11.6/mysql-test/main/type_datetime.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_datetime.result 2024-08-03 07:29:57.000000000 +0000 @@ -184,17 +184,17 @@ 2006-06-06 15:55:55 DROP PREPARE s; DROP TABLE t1; -SELECT CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6)); -CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6)) +SELECT CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6)) as exp; +exp 20060810.000000 -SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) AS DECIMAL(20,6)); -CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) AS DECIMAL(20,6)) +SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) AS DECIMAL(20,6)) as exp; +exp 20060810101112.000000 -SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6)); -CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6)) +SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6)) as exp; +exp 20060810101112.000014 -SELECT CAST(CAST('10:11:12.098700' AS TIME(6)) AS DECIMAL(20,6)); -CAST(CAST('10:11:12.098700' AS TIME(6)) AS DECIMAL(20,6)) +SELECT CAST(CAST('10:11:12.098700' AS TIME(6)) AS DECIMAL(20,6)) as exp; +exp 101112.098700 set @org_mode=@@sql_mode; create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03'); @@ -351,26 +351,26 @@ f1 2001-01-01 drop table t1,t2,t3; -select least(cast('01-01-01' as date), '01-01-02'); -least(cast('01-01-01' as date), '01-01-02') +select least(cast('01-01-01' as date), '01-01-02') as exp; +exp 2001-01-01 -select greatest(cast('01-01-01' as date), '01-01-02'); -greatest(cast('01-01-01' as date), '01-01-02') +select greatest(cast('01-01-01' as date), '01-01-02') as exp; +exp 2001-01-02 -select least(cast('01-01-01' as date), '01-01-02') + 0; -least(cast('01-01-01' as date), '01-01-02') + 0 +select least(cast('01-01-01' as date), '01-01-02') + 0 as exp; +exp 20010101 -select greatest(cast('01-01-01' as date), '01-01-02') + 0; -greatest(cast('01-01-01' as date), '01-01-02') + 0 +select greatest(cast('01-01-01' as date), '01-01-02') + 0 as exp; +exp 20010102 -select least(cast('01-01-01' as datetime), '01-01-02') + 0; -least(cast('01-01-01' as datetime), '01-01-02') + 0 +select least(cast('01-01-01' as datetime), '01-01-02') + 0 as exp; +exp 20010101000000 -select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed); -cast(least(cast('01-01-01' as datetime), '01-01-02') as signed) +select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed) as exp; +exp 20010101000000 -select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2)); -cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2)) +select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2)) as exp; +exp 20010101000000.00 DROP PROCEDURE IF EXISTS test27759 ; CREATE PROCEDURE test27759() @@ -627,21 +627,21 @@ create table t1 (t time default '916:00:00 a'); ERROR 42000: Invalid default value for 't' set @@sql_mode= @org_mode; -SELECT CAST(CAST('2006-08-10 10:11:12.0123450' AS DATETIME(6)) AS DECIMAL(30,7)); -CAST(CAST('2006-08-10 10:11:12.0123450' AS DATETIME(6)) AS DECIMAL(30,7)) +SELECT CAST(CAST('2006-08-10 10:11:12.0123450' AS DATETIME(6)) AS DECIMAL(30,7)) as exp; +exp 20060810101112.0123450 Warnings: Note 1292 Truncated incorrect datetime value: '2006-08-10 10:11:12.0123450' -SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.0123450' AS DATETIME(6)) AS DECIMAL(30,7)); -CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.0123450' AS DATETIME(6)) AS DECIMAL(30,7)) +SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.0123450' AS DATETIME(6)) AS DECIMAL(30,7)) as exp; +exp 20060810101112.0123450 Warnings: Note 1292 Truncated incorrect datetime value: '00000002006-000008-0000010 000010:0000011:00000012.0123450' -SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.012345' AS DATETIME(6)) AS DECIMAL(30,7)); -CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.012345' AS DATETIME(6)) AS DECIMAL(30,7)) +SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.012345' AS DATETIME(6)) AS DECIMAL(30,7)) as exp; +exp 20060810101112.0123450 -SELECT CAST(CAST('2008-07-29T10:42:51.1234567' AS DateTime(6)) AS DECIMAL(30,7)); -CAST(CAST('2008-07-29T10:42:51.1234567' AS DateTime(6)) AS DECIMAL(30,7)) +SELECT CAST(CAST('2008-07-29T10:42:51.1234567' AS DateTime(6)) AS DECIMAL(30,7)) as exp; +exp 20080729104251.1234560 Warnings: Note 1292 Truncated incorrect datetime value: '2008-07-29T10:42:51.1234567' @@ -685,8 +685,8 @@ # # MDEV-4634 Crash in CONVERT_TZ # -SELECT CONVERT_TZ(GREATEST(TIMESTAMP('2021-00-00'),TIMESTAMP('2022-00-00')),'+00:00','+7:5'); -CONVERT_TZ(GREATEST(TIMESTAMP('2021-00-00'),TIMESTAMP('2022-00-00')),'+00:00','+7:5') +SELECT CONVERT_TZ(GREATEST(TIMESTAMP('2021-00-00'),TIMESTAMP('2022-00-00')),'+00:00','+7:5') as exp; +exp NULL Warnings: Warning 1292 Incorrect datetime value: '2022-00-00 00:00:00' @@ -951,8 +951,8 @@ SELECT CAST(CAST(TIMESTAMP'0000-00-00 10:20:30' AS TIME) AS DATETIME); CAST(CAST(TIMESTAMP'0000-00-00 10:20:30' AS TIME) AS DATETIME) 0000-00-00 10:20:30 -SELECT CAST(CAST(TIMESTAMP'0000-00-00 00:00:00.000001' AS TIME(6)) AS DATETIME(6)); -CAST(CAST(TIMESTAMP'0000-00-00 00:00:00.000001' AS TIME(6)) AS DATETIME(6)) +SELECT CAST(CAST(TIMESTAMP'0000-00-00 00:00:00.000001' AS TIME(6)) AS DATETIME(6)) as exp; +exp 0000-00-00 00:00:00.000001 SET old_mode=DEFAULT; SET sql_mode=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/type_datetime.test mariadb-10.11.9/mysql-test/main/type_datetime.test --- mariadb-10.11.6/mysql-test/main/type_datetime.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_datetime.test 2024-08-03 07:29:57.000000000 +0000 @@ -138,13 +138,10 @@ # # Bug 19491 (CAST DATE AS DECIMAL returns incorrect result # -SELECT CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6)); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) AS DECIMAL(20,6)); -SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6)); -SELECT CAST(CAST('10:11:12.098700' AS TIME(6)) AS DECIMAL(20,6)); ---disable_view_protocol +SELECT CAST(CAST('2006-08-10' AS DATE) AS DECIMAL(20,6)) as exp; +SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) AS DECIMAL(20,6)) as exp; +SELECT CAST(CAST('2006-08-10 10:11:12' AS DATETIME(6)) + INTERVAL 14 MICROSECOND AS DECIMAL(20,6)) as exp; +SELECT CAST(CAST('10:11:12.098700' AS TIME(6)) AS DECIMAL(20,6)) as exp; # # Test of storing datetime into date fields @@ -246,16 +243,13 @@ # # Bug#27759: Wrong DATE/DATETIME comparison in LEAST()/GREATEST() functions. # -select least(cast('01-01-01' as date), '01-01-02'); -select greatest(cast('01-01-01' as date), '01-01-02'); -select least(cast('01-01-01' as date), '01-01-02') + 0; -select greatest(cast('01-01-01' as date), '01-01-02') + 0; -select least(cast('01-01-01' as datetime), '01-01-02') + 0; -select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed); -#enable after fix MDEV-27871 ---disable_view_protocol -select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2)); ---enable_view_protocol +select least(cast('01-01-01' as date), '01-01-02') as exp; +select greatest(cast('01-01-01' as date), '01-01-02') as exp; +select least(cast('01-01-01' as date), '01-01-02') + 0 as exp; +select greatest(cast('01-01-01' as date), '01-01-02') + 0 as exp; +select least(cast('01-01-01' as datetime), '01-01-02') + 0 as exp; +select cast(least(cast('01-01-01' as datetime), '01-01-02') as signed) as exp; +select cast(least(cast('01-01-01' as datetime), '01-01-02') as decimal(16,2)) as exp; --disable_warnings DROP PROCEDURE IF EXISTS test27759 ; --enable_warnings @@ -447,27 +441,23 @@ create table t1 (t time default '916:00:00 a'); set @@sql_mode= @org_mode; -#enable after fix MDEV-27871 ---disable_view_protocol - # # Bug #42146 - DATETIME fractional seconds parse error # # show we trucate microseconds from the right -- special case: leftmost is 0 -SELECT CAST(CAST('2006-08-10 10:11:12.0123450' AS DATETIME(6)) AS DECIMAL(30,7)); +SELECT CAST(CAST('2006-08-10 10:11:12.0123450' AS DATETIME(6)) AS DECIMAL(30,7)) as exp; # show that we ignore leading zeroes for all other fields -SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.0123450' AS DATETIME(6)) AS DECIMAL(30,7)); +SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.0123450' AS DATETIME(6)) AS DECIMAL(30,7)) as exp; # once more with feeling (but no warnings) -SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.012345' AS DATETIME(6)) AS DECIMAL(30,7)); +SELECT CAST(CAST('00000002006-000008-0000010 000010:0000011:00000012.012345' AS DATETIME(6)) AS DECIMAL(30,7)) as exp; # # Bug #38435 - LONG Microseconds cause MySQL to fail a CAST to DATETIME or DATE # # show we truncate microseconds from the right -SELECT CAST(CAST('2008-07-29T10:42:51.1234567' AS DateTime(6)) AS DECIMAL(30,7)); ---enable_view_protocol +SELECT CAST(CAST('2008-07-29T10:42:51.1234567' AS DateTime(6)) AS DECIMAL(30,7)) as exp; --echo # --echo # Bug#59173: Failure to handle DATE(TIME) values where Year, Month or @@ -510,10 +500,7 @@ --echo # --echo # MDEV-4634 Crash in CONVERT_TZ --echo # -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT CONVERT_TZ(GREATEST(TIMESTAMP('2021-00-00'),TIMESTAMP('2022-00-00')),'+00:00','+7:5'); ---enable_view_protocol +SELECT CONVERT_TZ(GREATEST(TIMESTAMP('2021-00-00'),TIMESTAMP('2022-00-00')),'+00:00','+7:5') as exp; --echo # --echo # MDEV-5041 Inserting a TIME with hour>24 into a DATETIME column produces a wrong value @@ -674,10 +661,7 @@ SELECT CAST(CAST('10:20:30' AS TIME) AS DATETIME); SELECT CAST(CAST('00:00:00.000001' AS TIME(6)) AS DATETIME(6)); SELECT CAST(CAST(TIMESTAMP'0000-00-00 10:20:30' AS TIME) AS DATETIME); -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT CAST(CAST(TIMESTAMP'0000-00-00 00:00:00.000001' AS TIME(6)) AS DATETIME(6)); ---enable_view_protocol +SELECT CAST(CAST(TIMESTAMP'0000-00-00 00:00:00.000001' AS TIME(6)) AS DATETIME(6)) as exp; SET old_mode=DEFAULT; SET sql_mode=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/type_decimal.result mariadb-10.11.9/mysql-test/main/type_decimal.result --- mariadb-10.11.6/mysql-test/main/type_decimal.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_decimal.result 2024-08-03 07:29:57.000000000 +0000 @@ -1323,3 +1323,176 @@ # # End of 10.4 tests # +# +# Start of 10.11 tests +# +# +# MDEV-33442 REPAIR TABLE corrupts UUIDs +# +CREATE PROCEDURE show_table() +BEGIN +SHOW CREATE TABLE t1; +SELECT VERSION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; +SELECT * FROM t1 ORDER BY a; +END; +$$ +# Upgrade using REPAIR +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a +123.45 +123.46 +123.47 +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check error Upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it! +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a +123.45 +123.46 +123.47 +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check error Upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it! +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a +123.45 +123.46 +123.47 +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +# Expect old decimal, as it does not implicitly upgrade to new decimal +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a +123.45 +123.46 +123.47 +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a +123.45 +123.46 +123.47 +DROP TABLE t1; +# Upgrade using ALTER, adding a table COMMENT +# Upgrade a 10.11.4 table using ALTER, adding a table COMMENT +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a +123.45 +123.46 +123.47 +# ALTER..INPLACE should fail - the FRM file is too old and needs upgrade +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test10'; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER IGNORE TABLE t1 COMMENT 'test11'; +# Expect old decimal, as it does not implicitly upgrade to new decimal +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='test11' +VERSION +10 +a +123.45 +123.46 +123.47 +# Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test12'; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='test12' +VERSION +10 +a +123.45 +123.46 +123.47 +DROP TABLE t1; +# Upgrade using ALTER, adding a column DEFAULT +# Upgrade a 10.11.4 table using ALTER, adding a table COMMENT +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a +123.45 +123.46 +123.47 +# ALTER..INPLACE should fail - the FRM file is too old and needs upgrade +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a DECIMAL(10,2) DEFAULT 10; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER IGNORE TABLE t1 MODIFY a DECIMAL(10,2) DEFAULT 11; +# Expect new decimal, as we explicitly redefined the data type +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2) DEFAULT 11.00 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a +123.45 +123.46 +123.47 +# Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a DECIMAL(10,2) DEFAULT 12; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` decimal(10,2) DEFAULT 12.00 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a +123.45 +123.46 +123.47 +DROP TABLE t1; +DROP PROCEDURE show_table; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/type_decimal.test mariadb-10.11.9/mysql-test/main/type_decimal.test --- mariadb-10.11.6/mysql-test/main/type_decimal.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_decimal.test 2024-08-03 07:29:57.000000000 +0000 @@ -826,3 +826,93 @@ --echo # --echo # End of 10.4 tests --echo # + +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-33442 REPAIR TABLE corrupts UUIDs +--echo # + +DELIMITER $$; +CREATE PROCEDURE show_table() +BEGIN + SHOW CREATE TABLE t1; + SELECT VERSION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; + SELECT * FROM t1 ORDER BY a; +END; +$$ +DELIMITER ;$$ + +--echo # Upgrade using REPAIR + +--copy_file std_data/old_decimal/t1dec102.frm $MYSQLD_DATADIR/test/t1.frm +--copy_file std_data/old_decimal/t1dec102.MYD $MYSQLD_DATADIR/test/t1.MYD +--copy_file std_data/old_decimal/t1dec102.MYI $MYSQLD_DATADIR/test/t1.MYI +CALL show_table; + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table; + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table; + +REPAIR TABLE t1; +--echo # Expect old decimal, as it does not implicitly upgrade to new decimal +CALL show_table; + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table; +DROP TABLE t1; + + +--echo # Upgrade using ALTER, adding a table COMMENT + +--echo # Upgrade a 10.11.4 table using ALTER, adding a table COMMENT +--copy_file std_data/old_decimal/t1dec102.frm $MYSQLD_DATADIR/test/t1.frm +--copy_file std_data/old_decimal/t1dec102.MYD $MYSQLD_DATADIR/test/t1.MYD +--copy_file std_data/old_decimal/t1dec102.MYI $MYSQLD_DATADIR/test/t1.MYI +CALL show_table; + +--echo # ALTER..INPLACE should fail - the FRM file is too old and needs upgrade +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test10'; +ALTER IGNORE TABLE t1 COMMENT 'test11'; +-- echo # Expect old decimal, as it does not implicitly upgrade to new decimal +CALL show_table; + +--echo # Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test12'; +CALL show_table; + +DROP TABLE t1; + + +--echo # Upgrade using ALTER, adding a column DEFAULT + +--echo # Upgrade a 10.11.4 table using ALTER, adding a table COMMENT +--copy_file std_data/old_decimal/t1dec102.frm $MYSQLD_DATADIR/test/t1.frm +--copy_file std_data/old_decimal/t1dec102.MYD $MYSQLD_DATADIR/test/t1.MYD +--copy_file std_data/old_decimal/t1dec102.MYI $MYSQLD_DATADIR/test/t1.MYI +CALL show_table; + +--echo # ALTER..INPLACE should fail - the FRM file is too old and needs upgrade +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a DECIMAL(10,2) DEFAULT 10; +ALTER IGNORE TABLE t1 MODIFY a DECIMAL(10,2) DEFAULT 11; +--echo # Expect new decimal, as we explicitly redefined the data type +CALL show_table; + +--echo # Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a DECIMAL(10,2) DEFAULT 12; +CALL show_table; + +DROP TABLE t1; + +DROP PROCEDURE show_table; + + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/type_float.result mariadb-10.11.9/mysql-test/main/type_float.result --- mariadb-10.11.6/mysql-test/main/type_float.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_float.result 2024-08-03 07:29:57.000000000 +0000 @@ -1173,9 +1173,125 @@ fdbl 123.456.789,12345678000000000000000000000000000000 fdec 123.456.789,12345678900000000000000000000000000000 # +# MDEV-32645 CAST(AS UNSIGNED) fails with --view-protocol +# +SELECT +CAST(-1e0 AS UNSIGNED), +CAST(--2e0 AS UNSIGNED), +CAST(---3e0 AS UNSIGNED), +CAST(----4e0 AS UNSIGNED); +CAST(-1e0 AS UNSIGNED) CAST(--2e0 AS UNSIGNED) CAST(---3e0 AS UNSIGNED) CAST(----4e0 AS UNSIGNED) +0 2 0 4 +Warnings: +Note 1916 Got overflow when converting '-1' to UNSIGNED BIGINT. Value truncated +Note 1916 Got overflow when converting '-3' to UNSIGNED BIGINT. Value truncated +EXPLAIN EXTENDED SELECT +CAST(-1e0 AS UNSIGNED), +CAST(--2e0 AS UNSIGNED), +CAST(---3e0 AS UNSIGNED), +CAST(----4e0 AS UNSIGNED); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select cast(-1e0 as unsigned) AS `CAST(-1e0 AS UNSIGNED)`,cast(2e0 as unsigned) AS `CAST(--2e0 AS UNSIGNED)`,cast(-3e0 as unsigned) AS `CAST(---3e0 AS UNSIGNED)`,cast(4e0 as unsigned) AS `CAST(----4e0 AS UNSIGNED)` +CREATE VIEW v1 AS SELECT +CAST(-1e0 AS UNSIGNED), +CAST(--2e0 AS UNSIGNED), +CAST(---3e0 AS UNSIGNED), +CAST(----4e0 AS UNSIGNED); +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(-1e0 as unsigned) AS `CAST(-1e0 AS UNSIGNED)`,cast(2e0 as unsigned) AS `CAST(--2e0 AS UNSIGNED)`,cast(-3e0 as unsigned) AS `CAST(---3e0 AS UNSIGNED)`,cast(4e0 as unsigned) AS `CAST(----4e0 AS UNSIGNED)` latin1 latin1_swedish_ci +SELECT * FROM v1; +CAST(-1e0 AS UNSIGNED) CAST(--2e0 AS UNSIGNED) CAST(---3e0 AS UNSIGNED) CAST(----4e0 AS UNSIGNED) +0 2 0 4 +Warnings: +Note 1916 Got overflow when converting '-1' to UNSIGNED BIGINT. Value truncated +Note 1916 Got overflow when converting '-3' to UNSIGNED BIGINT. Value truncated +DROP VIEW v1; +# # End of 10.4 tests # # +# Start of 10.5 tests +# +# +# MDEV-20548 Unexpected error on CREATE..SELECT HEX(num) +# +SET sql_mode=STRICT_ALL_TABLES; +CREATE TABLE t1 AS SELECT HEX(-2e0) AS h; +SELECT * FROM t1; +h +FFFFFFFFFFFFFFFE +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(-1e0) AS h; +SELECT * FROM t1; +h +FFFFFFFFFFFFFFFF +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(1e0) AS h; +SELECT * FROM t1; +h +1 +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(2e0) AS h; +SELECT * FROM t1; +h +2 +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 (a FLOAT); +INSERT INTO t1 VALUES (-1e38),(-255),(-2),(-1),(+1),(+2),(255),(1e38); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2 ORDER BY a; +a h +-1e38 FFFFFFFFFFFFFFFF +-255 FFFFFFFFFFFFFF01 +-2 FFFFFFFFFFFFFFFE +-1 FFFFFFFFFFFFFFFF +1 1 +2 2 +255 FF +1e38 FFFFFFFFFFFFFFFF +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a float YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +CREATE TABLE t1 (a DOUBLE); +INSERT INTO t1 VALUES (-1e308),(-255),(-2),(-1),(+1),(+2),(255),(1e308); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2 ORDER BY a; +a h +-1e308 FFFFFFFFFFFFFFFF +-255 FFFFFFFFFFFFFF01 +-2 FFFFFFFFFFFFFFFE +-1 FFFFFFFFFFFFFFFF +1 1 +2 2 +255 FF +1e308 FFFFFFFFFFFFFFFF +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a double YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +SET sql_mode=DEFAULT; +# +# End of 10.5 tests +# +# # MDEV-32203 Raise notes when an index cannot be used on data type mismatch # SET note_verbosity=unusable_keys; diff -Nru mariadb-10.11.6/mysql-test/main/type_float.test mariadb-10.11.9/mysql-test/main/type_float.test --- mariadb-10.11.6/mysql-test/main/type_float.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_float.test 2024-08-03 07:29:57.000000000 +0000 @@ -717,10 +717,88 @@ --horizontal_results --echo # +--echo # MDEV-32645 CAST(AS UNSIGNED) fails with --view-protocol +--echo # + +SELECT + CAST(-1e0 AS UNSIGNED), + CAST(--2e0 AS UNSIGNED), + CAST(---3e0 AS UNSIGNED), + CAST(----4e0 AS UNSIGNED); + +EXPLAIN EXTENDED SELECT + CAST(-1e0 AS UNSIGNED), + CAST(--2e0 AS UNSIGNED), + CAST(---3e0 AS UNSIGNED), + CAST(----4e0 AS UNSIGNED); + +CREATE VIEW v1 AS SELECT + CAST(-1e0 AS UNSIGNED), + CAST(--2e0 AS UNSIGNED), + CAST(---3e0 AS UNSIGNED), + CAST(----4e0 AS UNSIGNED); + +SHOW CREATE VIEW v1; +SELECT * FROM v1; +DROP VIEW v1; + +--echo # --echo # End of 10.4 tests --echo # --echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-20548 Unexpected error on CREATE..SELECT HEX(num) +--echo # + +SET sql_mode=STRICT_ALL_TABLES; + +CREATE TABLE t1 AS SELECT HEX(-2e0) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(-1e0) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(1e0) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(2e0) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + + +CREATE TABLE t1 (a FLOAT); +INSERT INTO t1 VALUES (-1e38),(-255),(-2),(-1),(+1),(+2),(255),(1e38); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2 ORDER BY a; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 (a DOUBLE); +INSERT INTO t1 VALUES (-1e308),(-255),(-2),(-1),(+1),(+2),(255),(1e308); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2 ORDER BY a; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +SET sql_mode=DEFAULT; + +--echo # +--echo # End of 10.5 tests +--echo # + + +--echo # --echo # MDEV-32203 Raise notes when an index cannot be used on data type mismatch --echo # diff -Nru mariadb-10.11.6/mysql-test/main/type_int.result mariadb-10.11.9/mysql-test/main/type_int.result --- mariadb-10.11.6/mysql-test/main/type_int.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_int.result 2024-08-03 07:29:57.000000000 +0000 @@ -1686,6 +1686,167 @@ 127 drop table t1; # +# MDEV-20548 Unexpected error on CREATE..SELECT HEX(num) +# +SET sql_mode=STRICT_ALL_TABLES; +CREATE TABLE t1 AS SELECT HEX(-2) AS h; +SELECT * FROM t1; +h +FFFFFFFFFFFFFFFE +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(-1) AS h; +SELECT * FROM t1; +h +FFFFFFFFFFFFFFFF +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(1) AS h; +SELECT * FROM t1; +h +1 +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(2) AS h; +SELECT * FROM t1; +h +2 +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 (a TINYINT); +INSERT INTO t1 VALUES (-0x80),(-2),(-1),(1),(2),(0x7f); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +a h +-128 FFFFFFFFFFFFFF80 +-2 FFFFFFFFFFFFFFFE +-1 FFFFFFFFFFFFFFFF +1 1 +2 2 +127 7F +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a tinyint(4) YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +CREATE TABLE t1 (a SMALLINT); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +a h +-32768 FFFFFFFFFFFF8000 +-128 FFFFFFFFFFFFFF80 +-2 FFFFFFFFFFFFFFFE +-1 FFFFFFFFFFFFFFFF +1 1 +2 2 +127 7F +32767 7FFF +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a smallint(6) YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +CREATE TABLE t1 (a MEDIUMINT); +INSERT INTO t1 VALUES (-0x800000); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +INSERT INTO t1 VALUES (0x7fffff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +a h +-8388608 FFFFFFFFFF800000 +-32768 FFFFFFFFFFFF8000 +-128 FFFFFFFFFFFFFF80 +-2 FFFFFFFFFFFFFFFE +-1 FFFFFFFFFFFFFFFF +1 1 +2 2 +127 7F +32767 7FFF +8388607 7FFFFF +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a mediumint(9) YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (-0x80000000); +INSERT INTO t1 VALUES (-0x800000); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +INSERT INTO t1 VALUES (0x7fffff); +INSERT INTO t1 VALUES (0x7fffffff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +a h +-2147483648 FFFFFFFF80000000 +-8388608 FFFFFFFFFF800000 +-32768 FFFFFFFFFFFF8000 +-128 FFFFFFFFFFFFFF80 +-2 FFFFFFFFFFFFFFFE +-1 FFFFFFFFFFFFFFFF +1 1 +2 2 +127 7F +32767 7FFF +8388607 7FFFFF +2147483647 7FFFFFFF +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a int(11) YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +CREATE TABLE t1 (a BIGINT); +INSERT INTO t1 VALUES (-0x8000000000000000); +INSERT INTO t1 VALUES (-0x80000000000000); +INSERT INTO t1 VALUES (-0x800000000000); +INSERT INTO t1 VALUES (-0x8000000000); +INSERT INTO t1 VALUES (-0x80000000); +INSERT INTO t1 VALUES (-0x800000); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +INSERT INTO t1 VALUES (0x7fffff); +INSERT INTO t1 VALUES (0x7fffffff); +INSERT INTO t1 VALUES (0x7fffffffff); +INSERT INTO t1 VALUES (0x7fffffffffff); +INSERT INTO t1 VALUES (0x7fffffffffffff); +INSERT INTO t1 VALUES (0x7fffffffffffffff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +a h +-9223372036854775808 8000000000000000 +-36028797018963968 FF80000000000000 +-140737488355328 FFFF800000000000 +-549755813888 FFFFFF8000000000 +-2147483648 FFFFFFFF80000000 +-8388608 FFFFFFFFFF800000 +-32768 FFFFFFFFFFFF8000 +-128 FFFFFFFFFFFFFF80 +-2 FFFFFFFFFFFFFFFE +-1 FFFFFFFFFFFFFFFF +1 1 +2 2 +127 7F +32767 7FFF +8388607 7FFFFF +2147483647 7FFFFFFF +549755813887 7FFFFFFFFF +140737488355327 7FFFFFFFFFFF +36028797018963967 7FFFFFFFFFFFFF +9223372036854775807 7FFFFFFFFFFFFFFF +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a bigint(20) YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +SET sql_mode=DEFAULT; +# # End of 10.5 tests # # diff -Nru mariadb-10.11.6/mysql-test/main/type_int.test mariadb-10.11.9/mysql-test/main/type_int.test --- mariadb-10.11.6/mysql-test/main/type_int.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_int.test 2024-08-03 07:29:57.000000000 +0000 @@ -565,6 +565,88 @@ drop table t1; --echo # +--echo # MDEV-20548 Unexpected error on CREATE..SELECT HEX(num) +--echo # + +SET sql_mode=STRICT_ALL_TABLES; + +CREATE TABLE t1 AS SELECT HEX(-2) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(-1) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(1) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(2) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 (a TINYINT); +INSERT INTO t1 VALUES (-0x80),(-2),(-1),(1),(2),(0x7f); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 (a SMALLINT); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 (a MEDIUMINT); +INSERT INTO t1 VALUES (-0x800000); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +INSERT INTO t1 VALUES (0x7fffff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (-0x80000000); +INSERT INTO t1 VALUES (-0x800000); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +INSERT INTO t1 VALUES (0x7fffff); +INSERT INTO t1 VALUES (0x7fffffff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +CREATE TABLE t1 (a BIGINT); +INSERT INTO t1 VALUES (-0x8000000000000000); +INSERT INTO t1 VALUES (-0x80000000000000); +INSERT INTO t1 VALUES (-0x800000000000); +INSERT INTO t1 VALUES (-0x8000000000); +INSERT INTO t1 VALUES (-0x80000000); +INSERT INTO t1 VALUES (-0x800000); +INSERT INTO t1 VALUES (-0x8000),(-0x80),(-2),(-1),(1),(2),(0x7f),(0x7fff); +INSERT INTO t1 VALUES (0x7fffff); +INSERT INTO t1 VALUES (0x7fffffff); +INSERT INTO t1 VALUES (0x7fffffffff); +INSERT INTO t1 VALUES (0x7fffffffffff); +INSERT INTO t1 VALUES (0x7fffffffffffff); +INSERT INTO t1 VALUES (0x7fffffffffffffff); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +SET sql_mode=DEFAULT; + + +--echo # --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/type_json.result mariadb-10.11.9/mysql-test/main/type_json.result --- mariadb-10.11.6/mysql-test/main/type_json.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_json.result 2024-08-03 07:29:57.000000000 +0000 @@ -155,7 +155,7 @@ # SELECT json_object('a', (SELECT json_objectagg(b, c) FROM (SELECT 'b','c') d)) AS j FROM DUAL; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def j 250 (format=json) 9437283 16 Y 0 39 33 +def j 250 (format=json) 9437310 16 Y 0 39 33 j {"a": {"b":"c"}} # diff -Nru mariadb-10.11.6/mysql-test/main/type_newdecimal.result mariadb-10.11.9/mysql-test/main/type_newdecimal.result --- mariadb-10.11.6/mysql-test/main/type_newdecimal.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_newdecimal.result 2024-08-03 07:29:57.000000000 +0000 @@ -912,8 +912,8 @@ col1 -9223372036854775808 drop table t1; -select cast('1.00000001335143196001808973960578441619873046875E-10' as decimal(30,15)); -cast('1.00000001335143196001808973960578441619873046875E-10' as decimal(30,15)) +select cast('1.00000001335143196001808973960578441619873046875E-10' as decimal(30,15)) as exp; +exp 0.000000000100000 select ln(14000) c1, convert(ln(14000),decimal(5,3)) c2, cast(ln(14000) as decimal(5,3)) c3; c1 c2 c3 @@ -1527,9 +1527,8 @@ 99999999999999999999999999999.999999999999999999999999999999999999 DROP TABLE t1; select (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 * -1.01500000 * 1.01500000 * 0.99500000); -(1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 * -1.01500000 * 1.01500000 * 0.99500000) +1.01500000 * 1.01500000 * 0.99500000) as exp; +exp 0.81298807395367312459230693948000000000 create table t1 as select 5.05 / 0.014; Warnings: @@ -2466,8 +2465,8 @@ # decimal_bin_size And Assertion `scale >= 0 && precision > 0 && scale <= precision' # failed in decimal_bin_size_inline/decimal_bin_size. # -SELECT AVG(DISTINCT 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); -AVG(DISTINCT 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +SELECT AVG(DISTINCT 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001) as exp; +exp 0.00000000000000000000000000000000000000 CREATE TABLE t1 AS SELECT NULL AS v1; SELECT 1 FROM t1 GROUP BY v1 ORDER BY AVG ( from_unixtime ( '' ) ) ; @@ -2809,6 +2808,80 @@ # End of 10.4 tests # # +# Start of 10.5 tests +# +# +# MDEV-20548 Unexpected error on CREATE..SELECT HEX(num) +# +SET sql_mode=STRICT_ALL_TABLES; +CREATE TABLE t1 AS SELECT HEX(-2) AS h; +SELECT * FROM t1; +h +FFFFFFFFFFFFFFFE +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(-1) AS h; +SELECT * FROM t1; +h +FFFFFFFFFFFFFFFF +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(+1) AS h; +SELECT * FROM t1; +h +1 +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 AS SELECT HEX(+2) AS h; +SELECT * FROM t1; +h +2 +SHOW COLUMNS IN t1; +Field Type Null Key Default Extra +h varchar(16) YES NULL +DROP TABLE t1; +CREATE TABLE t1 (a DECIMAL(41,1)); +INSERT INTO t1 VALUES (-1000000000000000000000000000000000000000); +INSERT INTO t1 VALUES (-0x8000000000); +INSERT INTO t1 VALUES (-0x80000000),(-0x800000),(-0x8000),(-0x80),(-2),(-1); +INSERT INTO t1 VALUES (1),(2),(128),(0x7fff),(0x7fffff),(0x7fffffff); +INSERT INTO t1 VALUES (+0x7fffffffff); +INSERT INTO t1 VALUES (+1000000000000000000000000000000000000000); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2 ORDER BY a; +a h +-1000000000000000000000000000000000000000.0 FFFFFFFFFFFFFFFF +-549755813888.0 FFFFFF8000000000 +-2147483648.0 FFFFFFFF80000000 +-8388608.0 FFFFFFFFFF800000 +-32768.0 FFFFFFFFFFFF8000 +-128.0 FFFFFFFFFFFFFF80 +-2.0 FFFFFFFFFFFFFFFE +-1.0 FFFFFFFFFFFFFFFF +1.0 1 +2.0 2 +128.0 80 +32767.0 7FFF +8388607.0 7FFFFF +2147483647.0 7FFFFFFF +549755813887.0 7FFFFFFFFF +1000000000000000000000000000000000000000.0 FFFFFFFFFFFFFFFF +SHOW COLUMNS IN t2; +Field Type Null Key Default Extra +a decimal(41,1) YES NULL +h varchar(16) YES NULL +DROP TABLE t1, t2; +SET sql_mode=DEFAULT; +# +# End of 10.5 tests +# +# # MDEV-32203 Raise notes when an index cannot be used on data type mismatch # SET note_verbosity=unusable_keys; diff -Nru mariadb-10.11.6/mysql-test/main/type_newdecimal.test mariadb-10.11.9/mysql-test/main/type_newdecimal.test --- mariadb-10.11.6/mysql-test/main/type_newdecimal.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_newdecimal.test 2024-08-03 07:29:57.000000000 +0000 @@ -952,10 +952,7 @@ # # Bug #10891 (converting to decimal crashes server) # -#enable after fix MDEV-27871 ---disable_view_protocol -select cast('1.00000001335143196001808973960578441619873046875E-10' as decimal(30,15)); ---enable_view_protocol +select cast('1.00000001335143196001808973960578441619873046875E-10' as decimal(30,15)) as exp; # # Bug #11708 (conversion to decimal fails in decimal part) @@ -1245,15 +1242,11 @@ # # Bug #36270: incorrect calculation result - works in 4.1 but not in 5.0 or 5.1 # -#enable after fix MDEV-27871 ---disable_view_protocol # show that if we need to truncate the scale of an operand, we pick the # right one (that is, we discard the least significant decimal places) select (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 * - 1.01500000 * 1.01500000 * 0.99500000); - ---enable_view_protocol + 1.01500000 * 1.01500000 * 0.99500000) as exp; # # Bug #31616 div_precision_increment description looks wrong @@ -1926,10 +1919,8 @@ --echo # decimal_bin_size And Assertion `scale >= 0 && precision > 0 && scale <= precision' --echo # failed in decimal_bin_size_inline/decimal_bin_size. --echo # -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT AVG(DISTINCT 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001); ---enable_view_protocol +SELECT AVG(DISTINCT 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001) as exp; + CREATE TABLE t1 AS SELECT NULL AS v1; SELECT 1 FROM t1 GROUP BY v1 ORDER BY AVG ( from_unixtime ( '' ) ) ; DROP TABLE t1; @@ -2013,6 +2004,54 @@ --echo # --echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-20548 Unexpected error on CREATE..SELECT HEX(num) +--echo # + +SET sql_mode=STRICT_ALL_TABLES; + +CREATE TABLE t1 AS SELECT HEX(-2) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(-1) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(+1) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 AS SELECT HEX(+2) AS h; +SELECT * FROM t1; +SHOW COLUMNS IN t1; +DROP TABLE t1; + +CREATE TABLE t1 (a DECIMAL(41,1)); +INSERT INTO t1 VALUES (-1000000000000000000000000000000000000000); +INSERT INTO t1 VALUES (-0x8000000000); +INSERT INTO t1 VALUES (-0x80000000),(-0x800000),(-0x8000),(-0x80),(-2),(-1); +INSERT INTO t1 VALUES (1),(2),(128),(0x7fff),(0x7fffff),(0x7fffffff); +INSERT INTO t1 VALUES (+0x7fffffffff); +INSERT INTO t1 VALUES (+1000000000000000000000000000000000000000); +CREATE TABLE t2 AS SELECT a, HEX(a) AS h FROM t1; +SELECT * FROM t2 ORDER BY a; +SHOW COLUMNS IN t2; +DROP TABLE t1, t2; + +SET sql_mode=DEFAULT; + +--echo # +--echo # End of 10.5 tests +--echo # + +--echo # --echo # MDEV-32203 Raise notes when an index cannot be used on data type mismatch --echo # diff -Nru mariadb-10.11.6/mysql-test/main/type_num_innodb.result mariadb-10.11.9/mysql-test/main/type_num_innodb.result --- mariadb-10.11.6/mysql-test/main/type_num_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_num_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -88,3 +88,51 @@ # # End of 10.2 tests # +# +# Start of 10.5 tests +# +# +# MDEV-28345 ASAN: use-after-poison or unknown-crash in my_strtod_int from charset_info_st::strntod or test_if_number +# +CREATE TABLE t1 (c BLOB) ENGINE=InnoDB; +INSERT INTO t1 VALUES ('0.0e'),('0.0e+0'); +SELECT * FROM t1 WHERE COALESCE(c)=0.0; +c +0.0e +0.0e+0 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: '0.0e' +SELECT * FROM t1 WHERE COALESCE(c)=0.0e0; +c +0.0e +0.0e+0 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: '0.0e' +DROP TABLE t1; +CREATE TABLE t1 (c BLOB) ENGINE=InnoDB; +INSERT INTO t1 VALUES ('0.0e'),('0.0e+0'); +SELECT * FROM t1 WHERE c=0.0; +c +0.0e +0.0e+0 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: '0.0e' +SELECT * FROM t1 WHERE c=0.0e0; +c +0.0e +0.0e+0 +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: '0.0e' +DROP TABLE t1; +CREATE TABLE t1 (c1 MEDIUMBLOB NOT NULL); +INSERT INTO t1 VALUES ('1e+'); +SELECT AVG(c1) AS VALUE FROM t1 WHERE c1 <> 0; +VALUE +1 +Warnings: +Warning 1292 Truncated incorrect DECIMAL value: '1e+' +Warning 1292 Truncated incorrect DOUBLE value: '1e+' +DROP TABLE t1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/type_num_innodb.test mariadb-10.11.9/mysql-test/main/type_num_innodb.test --- mariadb-10.11.6/mysql-test/main/type_num_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_num_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -39,3 +39,33 @@ --echo # --echo # End of 10.2 tests --echo # + + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-28345 ASAN: use-after-poison or unknown-crash in my_strtod_int from charset_info_st::strntod or test_if_number +--echo # + +CREATE TABLE t1 (c BLOB) ENGINE=InnoDB; +INSERT INTO t1 VALUES ('0.0e'),('0.0e+0'); +SELECT * FROM t1 WHERE COALESCE(c)=0.0; +SELECT * FROM t1 WHERE COALESCE(c)=0.0e0; +DROP TABLE t1; + +CREATE TABLE t1 (c BLOB) ENGINE=InnoDB; +INSERT INTO t1 VALUES ('0.0e'),('0.0e+0'); +SELECT * FROM t1 WHERE c=0.0; +SELECT * FROM t1 WHERE c=0.0e0; +DROP TABLE t1; + +CREATE TABLE t1 (c1 MEDIUMBLOB NOT NULL); +INSERT INTO t1 VALUES ('1e+'); +SELECT AVG(c1) AS VALUE FROM t1 WHERE c1 <> 0; +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/type_ranges.result mariadb-10.11.9/mysql-test/main/type_ranges.result --- mariadb-10.11.6/mysql-test/main/type_ranges.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_ranges.result 2024-08-03 07:29:57.000000000 +0000 @@ -144,8 +144,10 @@ DROP INDEX utiny, DROP INDEX ushort, DROP PRIMARY KEY, -DROP FOREIGN KEY any_name, +DROP FOREIGN KEY IF EXISTS any_name, ADD INDEX (auto); +Warnings: +Note 1091 Can't DROP FOREIGN KEY `any_name`; check that it exists LOCK TABLES t1 WRITE; ALTER TABLE t1 RENAME as t2, diff -Nru mariadb-10.11.6/mysql-test/main/type_ranges.test mariadb-10.11.9/mysql-test/main/type_ranges.test --- mariadb-10.11.6/mysql-test/main/type_ranges.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_ranges.test 2024-08-03 07:29:57.000000000 +0000 @@ -76,7 +76,7 @@ DROP INDEX utiny, DROP INDEX ushort, DROP PRIMARY KEY, -DROP FOREIGN KEY any_name, +DROP FOREIGN KEY IF EXISTS any_name, ADD INDEX (auto); LOCK TABLES t1 WRITE; diff -Nru mariadb-10.11.6/mysql-test/main/type_timestamp.result mariadb-10.11.9/mysql-test/main/type_timestamp.result --- mariadb-10.11.6/mysql-test/main/type_timestamp.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_timestamp.result 2024-08-03 07:29:57.000000000 +0000 @@ -1368,7 +1368,123 @@ ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t1; # -# End of 10.10 tests +# MDEV-34069 Zero datetime reinterprets as '1970-01-01 00:00:00' on field_datetime=field_timestamp +# +SET sql_mode=''; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('0000-00-00 00:00:00'); +SELECT * FROM t1; +a +0000-00-00 00:00:00 +CREATE TABLE t2 (a DATETIME); +INSERT INTO t2 SELECT a FROM t1; +SELECT * FROM t2; +a +0000-00-00 00:00:00 +SET sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE'; +INSERT INTO t2 VALUES ('0000-00-00 00:00:00'); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +INSERT INTO t2 SELECT a FROM t1; +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +SELECT * FROM t2; +a +0000-00-00 00:00:00 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +DROP TABLE t2, t1; +SET time_zone=DEFAULT; +SET sql_mode=DEFAULT; +# +# MDEV-34061 unix_timestamp(coalesce(timestamp_column)) returns NULL on '1970-01-01 00:00:00.000001' +# +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP(6) NULL); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.000001'); +SELECT unix_timestamp(a) AS c1, unix_timestamp(coalesce(a)) AS c2 FROM t1; +c1 c2 +0.000001 0.000001 +DROP TABLE t1; +SET time_zone=DEFAULT; +# +# MDEV-34088 The TIMESTAMP value of '1970-01-01 00:00:00' can be indirectly inserted in strict mode +# +SET sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES'; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +ERROR 22007: Incorrect datetime value: '1970-01-01 00:00:00' for column `test`.`t1`.`a` at row 1 +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +ERROR 22007: Incorrect datetime value: '1970-01-01 00:00:00.1' for column `test`.`t1`.`a` at row 1 +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +INSERT INTO t1 SELECT a FROM t2; +ERROR 22007: Incorrect datetime value: '1970-01-01 00:00:00 +00:00' for column `test`.`t1`.`a` at row 1 +DROP TABLE t2; +DROP TABLE t1; +SET sql_mode=DEFAULT; +SET sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE'; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +ERROR 22007: Incorrect datetime value: '1970-01-01 00:00:00' for column `test`.`t1`.`a` at row 1 +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +ERROR 22007: Incorrect datetime value: '1970-01-01 00:00:00.1' for column `test`.`t1`.`a` at row 1 +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +INSERT INTO t1 SELECT a FROM t2; +ERROR 22007: Incorrect datetime value: '1970-01-01 00:00:00 +00:00' for column `test`.`t1`.`a` at row 1 +DROP TABLE t2; +DROP TABLE t1; +SET sql_mode=DEFAULT; +SET sql_mode=''; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +INSERT INTO t1 SELECT a FROM t2; +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +DROP TABLE t2; +SELECT * FROM t1; +a +0000-00-00 00:00:00 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +DROP TABLE t1; +SET sql_mode=DEFAULT; +SET sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE'; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +INSERT INTO t1 SELECT a FROM t2; +Warnings: +Warning 1264 Out of range value for column 'a' at row 1 +DROP TABLE t2; +SELECT * FROM t1; +a +0000-00-00 00:00:00 +0000-00-00 00:00:00 +0000-00-00 00:00:00 +DROP TABLE t1; +SET sql_mode=DEFAULT; +# +# End of 10.5 tests # # # MDEV-32203 Raise notes when an index cannot be used on data type mismatch @@ -1489,3 +1605,4 @@ DROP TABLE t2; DROP TABLE t1; SET note_verbosity=DEFAULT; +# End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/type_timestamp.test mariadb-10.11.9/mysql-test/main/type_timestamp.test --- mariadb-10.11.6/mysql-test/main/type_timestamp.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_timestamp.test 2024-08-03 07:29:57.000000000 +0000 @@ -921,7 +921,99 @@ drop table t1; --echo # ---echo # End of 10.10 tests +--echo # MDEV-34069 Zero datetime reinterprets as '1970-01-01 00:00:00' on field_datetime=field_timestamp +--echo # + +SET sql_mode=''; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('0000-00-00 00:00:00'); +SELECT * FROM t1; +CREATE TABLE t2 (a DATETIME); +INSERT INTO t2 SELECT a FROM t1; +SELECT * FROM t2; +SET sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE'; +INSERT INTO t2 VALUES ('0000-00-00 00:00:00'); +INSERT INTO t2 SELECT a FROM t1; +SELECT * FROM t2; +DROP TABLE t2, t1; +SET time_zone=DEFAULT; +SET sql_mode=DEFAULT; + +--echo # +--echo # MDEV-34061 unix_timestamp(coalesce(timestamp_column)) returns NULL on '1970-01-01 00:00:00.000001' +--echo # + +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP(6) NULL); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.000001'); +SELECT unix_timestamp(a) AS c1, unix_timestamp(coalesce(a)) AS c2 FROM t1; +DROP TABLE t1; +SET time_zone=DEFAULT; + +--echo # +--echo # MDEV-34088 The TIMESTAMP value of '1970-01-01 00:00:00' can be indirectly inserted in strict mode +--echo # + +SET sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES'; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 SELECT a FROM t2; +DROP TABLE t2; +DROP TABLE t1; +SET sql_mode=DEFAULT; + + +SET sql_mode='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE'; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +--error ER_TRUNCATED_WRONG_VALUE +INSERT INTO t1 SELECT a FROM t2; +DROP TABLE t2; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +SET sql_mode=''; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +INSERT INTO t1 SELECT a FROM t2; +DROP TABLE t2; +SELECT * FROM t1; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +SET sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE'; +SET time_zone='+00:00'; +CREATE TABLE t1 (a TIMESTAMP); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00'); +INSERT INTO t1 VALUES ('1970-01-01 00:00:00.1'); +CREATE TABLE t2 (a TIMESTAMP(1)) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('1970-01-01 00:00:00.1'); +INSERT INTO t1 SELECT a FROM t2; +DROP TABLE t2; +SELECT * FROM t1; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +--echo # +--echo # End of 10.5 tests --echo # --echo # @@ -941,3 +1033,5 @@ --source unusable_keys_joins.inc DROP TABLE t1; SET note_verbosity=DEFAULT; + +--echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/type_varchar.result mariadb-10.11.9/mysql-test/main/type_varchar.result --- mariadb-10.11.6/mysql-test/main/type_varchar.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_varchar.result 2024-08-03 07:29:57.000000000 +0000 @@ -465,7 +465,7 @@ t 0 Warnings: Warning 1292 Truncated incorrect DOUBLE value: '1a' -Warning 1292 Truncated incorrect DOUBLE value: 't ' +Warning 1292 Truncated incorrect DOUBLE value: 't' SELECT a,(a DIV 2) FROM t1 ORDER BY a; a (a DIV 2) 10 5 @@ -476,7 +476,7 @@ t 0 Warnings: Warning 1292 Truncated incorrect DECIMAL value: '1a' -Warning 1292 Truncated incorrect DECIMAL value: 't ' +Warning 1292 Truncated incorrect DECIMAL value: 't' SELECT a,CAST(a AS SIGNED) FROM t1 ORDER BY a; a CAST(a AS SIGNED) 10 10 @@ -508,8 +508,8 @@ 0 0 Warnings: -Warning 1292 Truncated incorrect DECIMAL value: 's ' -Warning 1292 Truncated incorrect DECIMAL value: ' ' +Warning 1292 Truncated incorrect DECIMAL value: 's' +Warning 1292 Truncated incorrect DECIMAL value: '' DROP TABLE t1; # # MDEV-13530 VARBINARY doesn't convert to to BLOB for sizes 65533, 65534 and 65535 @@ -952,3 +952,232 @@ DROP TABLE t2; DROP TABLE t1; SET note_verbosity=DEFAULT; +# +# MDEV-32957 Unusable key notes report wrong predicates for > and >= +# +SET note_verbosity=unusable_keys; +CREATE TABLE t1 (a INT, i CHAR(32), KEY(i)); +FOR i IN 1..31 +DO +INSERT INTO t1 VALUES (i, 10+i); +END FOR; +$$ +EXPLAIN SELECT * FROM t1 WHERE i>30 ORDER BY i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL i NULL NULL NULL 31 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "30" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` > "30" of type `int` +EXPLAIN SELECT * FROM t1 WHERE i>=30 ORDER BY i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL i NULL NULL NULL 31 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "30" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "30" of type `int` +DROP TABLE t1; +SET note_verbosity=DEFAULT; +# +# MDEV-32958 Unusable key notes do not get reported for some operations +# +SET note_verbosity=unusable_keys; +CREATE TABLE t1 (c1 varchar(10), KEY(c1)) CHARACTER SET latin1; +INSERT INTO t1 VALUES ('a'); +INSERT INTO t1 VALUES ('b'); +INSERT INTO t1 VALUES ('c'); +INSERT INTO t1 VALUES ('d'); +INSERT INTO t1 VALUES ('e'); +INSERT INTO t1 VALUES ('f'); +INSERT INTO t1 VALUES ('g'); +INSERT INTO t1 VALUES ('h'); +INSERT INTO t1 VALUES ('i'); +INSERT INTO t1 VALUES ('j'); +EXPLAIN SELECT * FROM t1 WHERE c1=10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int` +SELECT * FROM t1 WHERE c1=10; +c1 +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int` +Warning 1292 Truncated incorrect DECIMAL value: 'a' +Warning 1292 Truncated incorrect DECIMAL value: 'b' +Warning 1292 Truncated incorrect DECIMAL value: 'c' +Warning 1292 Truncated incorrect DECIMAL value: 'd' +Warning 1292 Truncated incorrect DECIMAL value: 'e' +Warning 1292 Truncated incorrect DECIMAL value: 'f' +Warning 1292 Truncated incorrect DECIMAL value: 'g' +Warning 1292 Truncated incorrect DECIMAL value: 'h' +Warning 1292 Truncated incorrect DECIMAL value: 'i' +Warning 1292 Truncated incorrect DECIMAL value: 'j' +EXPLAIN SELECT * FROM t1 WHERE c1<10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` < "10" of type `int` +SELECT * FROM t1 WHERE c1<10; +c1 +a +b +c +d +e +f +g +h +i +j +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` < "10" of type `int` +Warning 1292 Truncated incorrect DECIMAL value: 'a' +Warning 1292 Truncated incorrect DECIMAL value: 'b' +Warning 1292 Truncated incorrect DECIMAL value: 'c' +Warning 1292 Truncated incorrect DECIMAL value: 'd' +Warning 1292 Truncated incorrect DECIMAL value: 'e' +Warning 1292 Truncated incorrect DECIMAL value: 'f' +Warning 1292 Truncated incorrect DECIMAL value: 'g' +Warning 1292 Truncated incorrect DECIMAL value: 'h' +Warning 1292 Truncated incorrect DECIMAL value: 'i' +Warning 1292 Truncated incorrect DECIMAL value: 'j' +EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int` +SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11; +c1 +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int` +Warning 1292 Truncated incorrect DECIMAL value: 'a' +Warning 1292 Truncated incorrect DECIMAL value: 'b' +Warning 1292 Truncated incorrect DECIMAL value: 'c' +Warning 1292 Truncated incorrect DECIMAL value: 'd' +Warning 1292 Truncated incorrect DECIMAL value: 'e' +Warning 1292 Truncated incorrect DECIMAL value: 'f' +Warning 1292 Truncated incorrect DECIMAL value: 'g' +Warning 1292 Truncated incorrect DECIMAL value: 'h' +Warning 1292 Truncated incorrect DECIMAL value: 'i' +Warning 1292 Truncated incorrect DECIMAL value: 'j' +EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11'; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int` +SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11'; +c1 +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` >= "10" of type `int` +Warning 1292 Truncated incorrect DOUBLE value: 'a' +Warning 1292 Truncated incorrect DOUBLE value: 'b' +Warning 1292 Truncated incorrect DOUBLE value: 'c' +Warning 1292 Truncated incorrect DOUBLE value: 'd' +Warning 1292 Truncated incorrect DOUBLE value: 'e' +Warning 1292 Truncated incorrect DOUBLE value: 'f' +Warning 1292 Truncated incorrect DOUBLE value: 'g' +Warning 1292 Truncated incorrect DOUBLE value: 'h' +Warning 1292 Truncated incorrect DOUBLE value: 'i' +Warning 1292 Truncated incorrect DOUBLE value: 'j' +EXPLAIN SELECT * FROM t1 WHERE c1 IN (10,20); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int` +SELECT * FROM t1 WHERE c1 IN (10,20); +c1 +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of type `varchar` = "10" of type `int` +Warning 1292 Truncated incorrect DECIMAL value: 'a' +Warning 1292 Truncated incorrect DECIMAL value: 'b' +Warning 1292 Truncated incorrect DECIMAL value: 'c' +Warning 1292 Truncated incorrect DECIMAL value: 'd' +Warning 1292 Truncated incorrect DECIMAL value: 'e' +Warning 1292 Truncated incorrect DECIMAL value: 'f' +Warning 1292 Truncated incorrect DECIMAL value: 'g' +Warning 1292 Truncated incorrect DECIMAL value: 'h' +Warning 1292 Truncated incorrect DECIMAL value: 'i' +Warning 1292 Truncated incorrect DECIMAL value: 'j' +EXPLAIN SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "_latin1'a' collate latin1_german2_ci" of collation `latin1_german2_ci` +SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b'); +c1 +a +b +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "_latin1'a' collate latin1_german2_ci" of collation `latin1_german2_ci` +EXPLAIN SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 13 NULL 10 Using where; Using index +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german2_ci` +SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci); +c1 +a +b +Warnings: +Note 1105 Cannot use key `c1` part[0] for lookup: `test`.`t1`.`c1` of collation `latin1_swedish_ci` = "'a'" of collation `latin1_german2_ci` +DROP TABLE t1; +CREATE TABLE t1(a INT, i CHAR(2), INDEX(i(1))); +INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19), +(20),(21),(22),(23),(24),(25),(26),(27),(28),(29), +(30),(31),(32),(33),(34),(35); +EXPLAIN SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL i NULL NULL NULL 26 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5; +a i +NULL 10 +NULL 11 +NULL 12 +NULL 13 +NULL 14 +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` >= "10" of type `int` +EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10 ORDER BY a, i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int` +EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10 ORDER BY a, i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int` +EXPLAIN DELETE FROM t1 WHERE i = 10 ORDER BY a, i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int` +EXPLAIN DELETE FROM t1 WHERE i < 10 ORDER BY a, i LIMIT 5; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where; Using filesort +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int` +EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int` +EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int` +EXPLAIN DELETE FROM t1 WHERE i = 10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` = "10" of type `int` +EXPLAIN DELETE FROM t1 WHERE i < 10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 26 Using where +Warnings: +Note 1105 Cannot use key `i` part[0] for lookup: `test`.`t1`.`i` of type `char` < "10" of type `int` +DROP TABLE t1; +SET note_verbosity=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/type_varchar.test mariadb-10.11.9/mysql-test/main/type_varchar.test --- mariadb-10.11.6/mysql-test/main/type_varchar.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_varchar.test 2024-08-03 07:29:57.000000000 +0000 @@ -415,3 +415,86 @@ --source unusable_keys_joins.inc DROP TABLE t1; SET note_verbosity=DEFAULT; + + +--echo # +--echo # MDEV-32957 Unusable key notes report wrong predicates for > and >= +--echo # + +SET note_verbosity=unusable_keys; +CREATE TABLE t1 (a INT, i CHAR(32), KEY(i)); +DELIMITER $$; +FOR i IN 1..31 +DO + INSERT INTO t1 VALUES (i, 10+i); +END FOR; +$$ +DELIMITER ;$$ +EXPLAIN SELECT * FROM t1 WHERE i>30 ORDER BY i LIMIT 5; +EXPLAIN SELECT * FROM t1 WHERE i>=30 ORDER BY i LIMIT 5; +DROP TABLE t1; +SET note_verbosity=DEFAULT; + + +--echo # +--echo # MDEV-32958 Unusable key notes do not get reported for some operations +--echo # + +SET note_verbosity=unusable_keys; +CREATE TABLE t1 (c1 varchar(10), KEY(c1)) CHARACTER SET latin1; +INSERT INTO t1 VALUES ('a'); +INSERT INTO t1 VALUES ('b'); +INSERT INTO t1 VALUES ('c'); +INSERT INTO t1 VALUES ('d'); +INSERT INTO t1 VALUES ('e'); +INSERT INTO t1 VALUES ('f'); +INSERT INTO t1 VALUES ('g'); +INSERT INTO t1 VALUES ('h'); +INSERT INTO t1 VALUES ('i'); +INSERT INTO t1 VALUES ('j'); + +EXPLAIN SELECT * FROM t1 WHERE c1=10; +SELECT * FROM t1 WHERE c1=10; + +EXPLAIN SELECT * FROM t1 WHERE c1<10; +SELECT * FROM t1 WHERE c1<10; + +EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11; +SELECT * FROM t1 WHERE c1 BETWEEN 10 AND 11; + +EXPLAIN SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11'; +SELECT * FROM t1 WHERE c1 BETWEEN 10 AND '11'; + +EXPLAIN SELECT * FROM t1 WHERE c1 IN (10,20); +SELECT * FROM t1 WHERE c1 IN (10,20); + +EXPLAIN SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b'); +SELECT * FROM t1 WHERE c1 IN (_latin1'a' COLLATE latin1_german2_ci,'b'); + +EXPLAIN SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci); +SELECT * FROM t1 WHERE c1 IN ('a',_latin1'b' COLLATE latin1_german2_ci); + +DROP TABLE t1; + + +CREATE TABLE t1(a INT, i CHAR(2), INDEX(i(1))); +INSERT INTO t1 (i) VALUES (10),(11),(12),(13),(14),(15),(16),(17),(18),(19), + (20),(21),(22),(23),(24),(25),(26),(27),(28),(29), + (30),(31),(32),(33),(34),(35); + +EXPLAIN SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5; +SELECT * FROM t1 WHERE i >= 10 ORDER BY i LIMIT 5; + +EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10 ORDER BY a, i LIMIT 5; +EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10 ORDER BY a, i LIMIT 5; +EXPLAIN DELETE FROM t1 WHERE i = 10 ORDER BY a, i LIMIT 5; +EXPLAIN DELETE FROM t1 WHERE i < 10 ORDER BY a, i LIMIT 5; + +EXPLAIN UPDATE t1 SET a = 1 WHERE i = 10; +EXPLAIN UPDATE t1 SET a = 1 WHERE i < 10; +EXPLAIN DELETE FROM t1 WHERE i = 10; +EXPLAIN DELETE FROM t1 WHERE i < 10; + +DROP TABLE t1; + +SET note_verbosity=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/main/type_varchar_mysql41.result mariadb-10.11.9/mysql-test/main/type_varchar_mysql41.result --- mariadb-10.11.6/mysql-test/main/type_varchar_mysql41.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_varchar_mysql41.result 2024-08-03 07:29:57.000000000 +0000 @@ -111,3 +111,152 @@ ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1old; DROP PROCEDURE p1; +# +# Start of 10.11 tests +# +# +# MDEV-33442 REPAIR TABLE corrupts UUIDs +# +CREATE PROCEDURE show_table() +BEGIN +SHOW CREATE TABLE t1; +SELECT VERSION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; +SELECT * FROM t1 ORDER BY a,b; +END; +$$ +# Upgrade using REPAIR +TRUNCATE TABLE t1; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255)/*old*/ DEFAULT NULL, + `b` varchar(255)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a b +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check error Upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it! +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255)/*old*/ DEFAULT NULL, + `b` varchar(255)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a b +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check error Upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it! +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255)/*old*/ DEFAULT NULL, + `b` varchar(255)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a b +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255) DEFAULT NULL, + `b` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255) DEFAULT NULL, + `b` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +DROP TABLE t1; +# Upgrade using ALTER, adding a table COMMENT +TRUNCATE TABLE t1; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255)/*old*/ DEFAULT NULL, + `b` varchar(255)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a b +# ALTER..INPLACE should fail - the old columns need upgrade +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test10'; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER IGNORE TABLE t1 COMMENT 'test11'; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255) DEFAULT NULL, + `b` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='test11' +VERSION +10 +a b +# Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test12'; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255) DEFAULT NULL, + `b` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='test12' +VERSION +10 +a b +DROP TABLE t1; +# Upgrade using ALTER, adding a column DEFAULT +TRUNCATE TABLE t1; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255)/*old*/ DEFAULT NULL, + `b` varchar(255)/*old*/ DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +9 +a b +# ALTER..INPLACE should fail - the old columns need upgrade +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a VARBINARY(255) DEFAULT 'a10'; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER IGNORE TABLE t1 MODIFY a VARBINARY(255) DEFAULT 'a11'; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255) DEFAULT 'a11', + `b` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +# Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 MODIFY a VARBINARY(255) DEFAULT 'a12'; +CALL show_table; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varbinary(255) DEFAULT 'a12', + `b` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +DROP TABLE t1; +DROP PROCEDURE show_table; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/mysql-test/main/type_varchar_mysql41.test mariadb-10.11.9/mysql-test/main/type_varchar_mysql41.test --- mariadb-10.11.6/mysql-test/main/type_varchar_mysql41.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/type_varchar_mysql41.test 2024-08-03 07:29:57.000000000 +0000 @@ -57,3 +57,88 @@ DROP TABLE t1old; DROP PROCEDURE p1; + +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-33442 REPAIR TABLE corrupts UUIDs +--echo # + +DELIMITER $$; +CREATE PROCEDURE show_table() +BEGIN + SHOW CREATE TABLE t1; + SELECT VERSION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; + SELECT * FROM t1 ORDER BY a,b; +END; +$$ +DELIMITER ;$$ + + +--echo # Upgrade using REPAIR + +--copy_file $MYSQL_TEST_DIR/std_data/bug19371.frm $MYSQLD_DATADIR/test/t1.frm +TRUNCATE TABLE t1; +CALL show_table; + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table; + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table; + +REPAIR TABLE t1; +CALL show_table; + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table; + +DROP TABLE t1; + + +--echo # Upgrade using ALTER, adding a table COMMENT + +--copy_file $MYSQL_TEST_DIR/std_data/bug19371.frm $MYSQLD_DATADIR/test/t1.frm +TRUNCATE TABLE t1; +CALL show_table; + +--echo # ALTER..INPLACE should fail - the old columns need upgrade +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test10'; +ALTER IGNORE TABLE t1 COMMENT 'test11'; +CALL show_table; + +--echo # Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test12'; +CALL show_table; + +DROP TABLE t1; + + +--echo # Upgrade using ALTER, adding a column DEFAULT + +--copy_file $MYSQL_TEST_DIR/std_data/bug19371.frm $MYSQLD_DATADIR/test/t1.frm +TRUNCATE TABLE t1; +CALL show_table; + +--echo # ALTER..INPLACE should fail - the old columns need upgrade +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a VARBINARY(255) DEFAULT 'a10'; +ALTER IGNORE TABLE t1 MODIFY a VARBINARY(255) DEFAULT 'a11'; +CALL show_table; + +--echo # Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 MODIFY a VARBINARY(255) DEFAULT 'a12'; +CALL show_table; + +DROP TABLE t1; + + +DROP PROCEDURE show_table; + + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/udf.result mariadb-10.11.9/mysql-test/main/udf.result --- mariadb-10.11.6/mysql-test/main/udf.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/udf.result 2024-08-03 07:29:57.000000000 +0000 @@ -607,4 +607,68 @@ DROP FUNCTION avgcost; DROP FUNCTION avg2; DROP FUNCTION myfunc_double; +# +# MDEV-24507: Server Crash using UDF in WHERE clause of VIEW +# +CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "UDF_EXAMPLE_LIB"; +create table t1(pk int primary key, a varchar(20)); +create table t2(pk int primary key, a varchar(20)); +create view v1 as select pk, a from t1 union select pk, a from t2; +insert into t1 values (1, "One"), (3, "Three"), (5, "Five"); +insert into t2 values (2, "Dos"), (4, "Quatro"), (6, "Seis"); +select pk, myfunc_int(a) from t1; +pk myfunc_int(a) +1 3 +3 5 +5 4 +select pk, myfunc_int(a) from t2; +pk myfunc_int(a) +2 3 +4 6 +6 4 +select pk, myfunc_int(a) from v1; +pk myfunc_int(a) +1 3 +3 5 +5 4 +2 3 +4 6 +6 4 +select pk from t1 where myfunc_int(a) > 4; +pk +3 +select pk from (select pk, a from t1) A where myfunc_int(A.a) > 4; +pk +3 +set @save_optimizer_switch = @@optimizer_switch; +set optimizer_switch = 'derived_merge=OFF'; +select pk, myfunc_int(a) from t1; +pk myfunc_int(a) +1 3 +3 5 +5 4 +select pk, myfunc_int(a) from t2; +pk myfunc_int(a) +2 3 +4 6 +6 4 +select pk, myfunc_int(a) from v1; +pk myfunc_int(a) +1 3 +3 5 +5 4 +2 3 +4 6 +6 4 +select pk from t1 where myfunc_int(a) > 4; +pk +3 +select pk from (select pk, a from t1) A where myfunc_int(A.a) > 4; +pk +3 +set optimizer_switch = @save_optimizer_switch; +drop view v1; +drop table t2; +drop table t1; +drop function myfunc_int; # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/udf.test mariadb-10.11.9/mysql-test/main/udf.test --- mariadb-10.11.6/mysql-test/main/udf.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/udf.test 2024-08-03 07:29:57.000000000 +0000 @@ -647,4 +647,38 @@ DROP FUNCTION avg2; DROP FUNCTION myfunc_double; +--echo # +--echo # MDEV-24507: Server Crash using UDF in WHERE clause of VIEW +--echo # + +--replace_result $UDF_EXAMPLE_SO UDF_EXAMPLE_LIB +eval CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME "$UDF_EXAMPLE_SO"; + +create table t1(pk int primary key, a varchar(20)); +create table t2(pk int primary key, a varchar(20)); +create view v1 as select pk, a from t1 union select pk, a from t2; + +insert into t1 values (1, "One"), (3, "Three"), (5, "Five"); +insert into t2 values (2, "Dos"), (4, "Quatro"), (6, "Seis"); + +select pk, myfunc_int(a) from t1; +select pk, myfunc_int(a) from t2; +select pk, myfunc_int(a) from v1; +select pk from t1 where myfunc_int(a) > 4; +select pk from (select pk, a from t1) A where myfunc_int(A.a) > 4; + +set @save_optimizer_switch = @@optimizer_switch; +set optimizer_switch = 'derived_merge=OFF'; +select pk, myfunc_int(a) from t1; +select pk, myfunc_int(a) from t2; +select pk, myfunc_int(a) from v1; +select pk from t1 where myfunc_int(a) > 4; +select pk from (select pk, a from t1) A where myfunc_int(A.a) > 4; + +set optimizer_switch = @save_optimizer_switch; +drop view v1; +drop table t2; +drop table t1; +drop function myfunc_int; + --echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/main/union.result mariadb-10.11.9/mysql-test/main/union.result --- mariadb-10.11.6/mysql-test/main/union.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/union.result 2024-08-03 07:29:57.000000000 +0000 @@ -80,7 +80,7 @@ 2 b 1 a (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by t1.b; -ERROR 42000: Table 't1' from one of the SELECTs cannot be used in ORDER clause +ERROR 42000: Table 't1' from one of the SELECTs cannot be used in order clause explain extended (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; id select_type table type possible_keys key key_len ref rows filtered Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 4 100.00 @@ -493,7 +493,7 @@ create table t1 select a from t1 union select a from t2; ERROR 42S01: Table 't1' already exists select a from t1 union select a from t2 order by t2.a; -ERROR 42000: Table 't2' from one of the SELECTs cannot be used in ORDER clause +ERROR 42000: Table 't2' from one of the SELECTs cannot be used in order clause drop table t1,t2; select length(version()) > 1 as `*` UNION select 2; * diff -Nru mariadb-10.11.6/mysql-test/main/view.result mariadb-10.11.9/mysql-test/main/view.result --- mariadb-10.11.6/mysql-test/main/view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/view.result 2024-08-03 07:29:57.000000000 +0000 @@ -4422,12 +4422,14 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index Warnings: +Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int` Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0 EXPLAIN EXTENDED SELECT * FROM t1 WHERE a > 'JJ' OR a <> 0 AND a = 'VV'; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index Warnings: +Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int` Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0 # t1 and v1 should return the same result set SELECT * FROM v1 WHERE a > 'JJ' OR a AND a = 'VV'; @@ -4448,12 +4450,14 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index Warnings: +Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int` Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0 EXPLAIN EXTENDED SELECT * FROM t1 WHERE a > 'JJ' OR a AND a = 'VV'; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 range a a 13 NULL 4 100.00 Using where; Using index Warnings: +Note 1105 Cannot use key `a` part[0] for lookup: `test`.`t1`.`a` of type `varchar` < "0" of type `int` Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 'JJ' or `test`.`t1`.`a` = 'VV' and `test`.`t1`.`a` <> 0 DROP VIEW v1; DROP TABLE t1; @@ -7025,3 +7029,49 @@ # # End of 10.6 tests # +# +# MDEV-29587: Allowing insert into a view with columns that +# are not part the table +# +# view with 2 the same fields +CREATE TABLE table1 (x INT); +CREATE VIEW view1 AS SELECT x, x as x1 FROM table1; +INSERT INTO view1(x) VALUES (1); +INSERT INTO view1(x1) VALUES (1); +INSERT INTO view1(x1,x) VALUES (1,1); +ERROR HY000: The target table view1 of the INSERT is not insertable-into +DROP VIEW view1; +DROP TABLE table1; +# view with a field and expression over the field +CREATE TABLE table1 (x INT); +CREATE VIEW view1 AS SELECT x, x + 1 as x1 FROM table1; +INSERT INTO view1(x) VALUES (1); +INSERT INTO view1(x1) VALUES (1); +ERROR HY000: The target table view1 of the INSERT is not insertable-into +INSERT INTO view1(x1,x) VALUES (1,1); +ERROR HY000: The target table view1 of the INSERT is not insertable-into +DROP VIEW view1; +DROP TABLE table1; +# view with a field and collation expression over the field +CREATE TABLE table1 (x char(20)); +CREATE VIEW view1 AS SELECT x, x collate latin1_german1_ci as x1 FROM table1; +INSERT INTO view1(x) VALUES ("ua"); +# we can insert in the field with collation +INSERT INTO view1(x1) VALUES ("ua"); +INSERT INTO view1(x1,x) VALUES ("ua","ua"); +ERROR HY000: The target table view1 of the INSERT is not insertable-into +DROP VIEW view1; +DROP TABLE table1; +# view with a field and expression over other field +CREATE TABLE table1 (x INT, y INT); +CREATE VIEW view1 AS SELECT x, y + 1 as x1 FROM table1; +INSERT INTO view1(x) VALUES (1); +INSERT INTO view1(x1) VALUES (1); +ERROR HY000: The target table view1 of the INSERT is not insertable-into +INSERT INTO view1(x1,x) VALUES (1,1); +ERROR HY000: The target table view1 of the INSERT is not insertable-into +DROP VIEW view1; +DROP TABLE table1; +# +# End of 10.11 test +# diff -Nru mariadb-10.11.6/mysql-test/main/view.test mariadb-10.11.9/mysql-test/main/view.test --- mariadb-10.11.6/mysql-test/main/view.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/view.test 2024-08-03 07:29:57.000000000 +0000 @@ -6792,3 +6792,56 @@ --echo # --echo # End of 10.6 tests --echo # + + +--echo # +--echo # MDEV-29587: Allowing insert into a view with columns that +--echo # are not part the table +--echo # + +--echo # view with 2 the same fields +CREATE TABLE table1 (x INT); +CREATE VIEW view1 AS SELECT x, x as x1 FROM table1; +INSERT INTO view1(x) VALUES (1); +INSERT INTO view1(x1) VALUES (1); +--error ER_NON_INSERTABLE_TABLE +INSERT INTO view1(x1,x) VALUES (1,1); +DROP VIEW view1; +DROP TABLE table1; + +--echo # view with a field and expression over the field +CREATE TABLE table1 (x INT); +CREATE VIEW view1 AS SELECT x, x + 1 as x1 FROM table1; +INSERT INTO view1(x) VALUES (1); +--error ER_NON_INSERTABLE_TABLE +INSERT INTO view1(x1) VALUES (1); +--error ER_NON_INSERTABLE_TABLE +INSERT INTO view1(x1,x) VALUES (1,1); +DROP VIEW view1; +DROP TABLE table1; + +--echo # view with a field and collation expression over the field +CREATE TABLE table1 (x char(20)); +CREATE VIEW view1 AS SELECT x, x collate latin1_german1_ci as x1 FROM table1; +INSERT INTO view1(x) VALUES ("ua"); +--echo # we can insert in the field with collation +INSERT INTO view1(x1) VALUES ("ua"); +--error ER_NON_INSERTABLE_TABLE +INSERT INTO view1(x1,x) VALUES ("ua","ua"); +DROP VIEW view1; +DROP TABLE table1; + +--echo # view with a field and expression over other field +CREATE TABLE table1 (x INT, y INT); +CREATE VIEW view1 AS SELECT x, y + 1 as x1 FROM table1; +INSERT INTO view1(x) VALUES (1); +--error ER_NON_INSERTABLE_TABLE +INSERT INTO view1(x1) VALUES (1); +--error ER_NON_INSERTABLE_TABLE +INSERT INTO view1(x1,x) VALUES (1,1); +DROP VIEW view1; +DROP TABLE table1; + +--echo # +--echo # End of 10.11 test +--echo # diff -Nru mariadb-10.11.6/mysql-test/main/view_grant.result mariadb-10.11.9/mysql-test/main/view_grant.result --- mariadb-10.11.6/mysql-test/main/view_grant.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/view_grant.result 2024-08-03 07:29:57.000000000 +0000 @@ -1951,6 +1951,38 @@ drop user user_11766767; drop database mysqltest1; drop database mysqltest2; +# +# MDEV-33119 User is case insensitive in INFORMATION_SCHEMA.VIEWS +# +USE test; +CREATE USER foo; +CREATE USER FOO; +GRANT SELECT ON test.* TO foo; +GRANT SELECT ON test.* TO FOO; +CREATE DEFINER=foo SQL SECURITY INVOKER VIEW v1 AS SELECT 1 AS c1; +connect FOO, localhost, FOO, , test; +connection FOO; +SELECT CURRENT_USER; +CURRENT_USER +FOO@% +SELECT * FROM INFORMATION_SCHEMA.VIEWS; +TABLE_CATALOG def +TABLE_SCHEMA test +TABLE_NAME v1 +VIEW_DEFINITION +CHECK_OPTION NONE +IS_UPDATABLE NO +DEFINER foo@% +SECURITY_TYPE INVOKER +CHARACTER_SET_CLIENT latin1 +COLLATION_CONNECTION latin1_swedish_ci +ALGORITHM UNDEFINED +disconnect FOO; +connection default; +DROP VIEW v1; +DROP USER foo; +DROP USER FOO; +# End of 10.5 tests # Check that a user without access to the schema 'foo' cannot query # a JSON_TABLE view in that schema. CREATE SCHEMA foo; @@ -1967,3 +1999,4 @@ disconnect con1; drop user foo@localhost; drop schema foo; +# End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/main/view_grant.test mariadb-10.11.9/mysql-test/main/view_grant.test --- mariadb-10.11.6/mysql-test/main/view_grant.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/view_grant.test 2024-08-03 07:29:57.000000000 +0000 @@ -2206,6 +2206,35 @@ drop database mysqltest1; drop database mysqltest2; +--echo # +--echo # MDEV-33119 User is case insensitive in INFORMATION_SCHEMA.VIEWS +--echo # + +USE test; +CREATE USER foo; +CREATE USER FOO; +GRANT SELECT ON test.* TO foo; +GRANT SELECT ON test.* TO FOO; + +CREATE DEFINER=foo SQL SECURITY INVOKER VIEW v1 AS SELECT 1 AS c1; + +--connect (FOO, localhost, FOO, , test) +--connection FOO + +SELECT CURRENT_USER; +--vertical_results +--query_vertical SELECT * FROM INFORMATION_SCHEMA.VIEWS +--horizontal_results + +--disconnect FOO +--connection default + +DROP VIEW v1; +DROP USER foo; +DROP USER FOO; + +--echo # End of 10.5 tests + --echo # Check that a user without access to the schema 'foo' cannot query --echo # a JSON_TABLE view in that schema. CREATE SCHEMA foo; @@ -2224,7 +2253,7 @@ disconnect con1; drop user foo@localhost; drop schema foo; +--echo # End of 10.6 tests # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc - diff -Nru mariadb-10.11.6/mysql-test/main/win.result mariadb-10.11.9/mysql-test/main/win.result --- mariadb-10.11.6/mysql-test/main/win.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win.result 2024-08-03 07:29:57.000000000 +0000 @@ -1099,11 +1099,9 @@ a, count(col1) over (order by a range between 0.1 preceding -and 0.1 following) +and 0.1 following) as count from t1; -a count(col1) over (order by a -range between 0.1 preceding -and 0.1 following) +a count 0.450 3 0.500 3 0.550 3 @@ -1249,64 +1247,107 @@ insert into t1 values (2,2,'bar'); select count(*) over (order by a,b -range between unbounded preceding and current row) +range between 1 preceding and current row) as count from t1; ERROR HY000: RANGE-type frame requires ORDER BY clause with single sort key select -count(*) over (order by c -range between unbounded preceding and current row) -from t1; -ERROR HY000: Numeric datatype is required for RANGE-type frame -select count(*) over (order by a -range between 'abcd' preceding and current row) +range between 'abcd' preceding and current row) as count from t1; ERROR HY000: Numeric datatype is required for RANGE-type frame select count(*) over (order by a -range between current row and 'foo' following) +range between current row and 'foo' following) as count from t1; ERROR HY000: Numeric datatype is required for RANGE-type frame # Try range frame with invalid bounds select count(*) over (order by a -rows between 0.5 preceding and current row) +rows between 0.5 preceding and current row) as count from t1; ERROR HY000: Integer is required for ROWS-type frame select count(*) over (order by a -rows between current row and 3.14 following) +rows between current row and 3.14 following) as count from t1; ERROR HY000: Integer is required for ROWS-type frame # +# MDEV-19052 Range-type window frame supports only numeric datatype +# +select +count(*) over (order by c +range between unbounded preceding and current row) as r +from t1; +r +1 +2 +select +count(*) over (order by c +range between current row and unbounded following) as r +from t1; +r +2 +1 +select +count(*) over (order by c +range between unbounded preceding and unbounded following) as r +from t1; +r +2 +2 +create table t2 (a int, b varchar(5)); +insert into t2 values (1,'a'), (2, 'b'), (3, 'c'); +select sum(a) over (order by b range between unbounded preceding and current row) as r from t2; +r +1 +3 +6 +insert into t1 values (3,3,'goo'); +insert into t1 values (3,1,'har'); +insert into t1 values (1,4,'har'); +select a, b, sum(b) over (order by a, b desc range between unbounded preceding and current row) as r from t1; +a b r +1 4 4 +1 1 5 +2 2 7 +3 3 10 +3 1 11 +select a, b, sum(b) over (order by a desc, b range between unbounded preceding and current row) as r from t1; +a b r +3 1 1 +3 3 4 +2 2 6 +1 1 7 +1 4 11 +drop table t2; +delete from t1 where a >= 3 or b = 4; +# # EXCLUDE clause is parsed but not supported # select count(*) over (order by a rows between 1 preceding and 1 following -exclude current row) +exclude current row) as count from t1; ERROR HY000: Frame exclusion is not supported yet select count(*) over (order by a range between 1 preceding and 1 following -exclude ties) +exclude ties) as count from t1; ERROR HY000: Frame exclusion is not supported yet select count(*) over (order by a range between 1 preceding and 1 following -exclude group) +exclude group) as count from t1; ERROR HY000: Frame exclusion is not supported yet select count(*) over (order by a rows between 1 preceding and 1 following -exclude no others) +exclude no others) as count from t1; -count(*) over (order by a -rows between 1 preceding and 1 following -exclude no others) +count 2 2 drop table t1; @@ -1626,10 +1667,10 @@ # Check using counters flush status; select -rank() over (partition by c order by a), -rank() over (partition by c order by b) +rank() over (partition by c order by a) as rank_a, +rank() over (partition by c order by b) as rank_b from t1; -rank() over (partition by c order by a) rank() over (partition by c order by b) +rank_a rank_b 1 3 2 2 3 1 @@ -1642,10 +1683,10 @@ Sort_scan 2 flush status; select -rank() over (partition by c order by a), -rank() over (partition by c order by a) +rank() over (partition by c order by a) as rank_a, +rank() over (partition by c order by a) as rank_b from t1; -rank() over (partition by c order by a) rank() over (partition by c order by a) +rank_a rank_b 1 1 2 2 3 3 @@ -1658,8 +1699,8 @@ Sort_scan 1 explain format=json select -rank() over (partition by c order by a), -rank() over (partition by c order by a) +rank() over (partition by c order by a) as rank_a, +rank() over (partition by c order by a) as rank_b from t1; EXPLAIN { @@ -1722,8 +1763,8 @@ } explain format=json select -rank() over (partition by c order by a), -count(*) over (partition by c) +rank() over (partition by c order by a) as rank_a, +count(*) over (partition by c) as count_c from t1; EXPLAIN { @@ -1754,8 +1795,8 @@ } explain format=json select -count(*) over (partition by c), -rank() over (partition by c order by a) +count(*) over (partition by c) as count_c, +rank() over (partition by c order by a) as rank_a from t1; EXPLAIN { @@ -1896,18 +1937,18 @@ insert into t1 values (1, 4, 8); select pk, a, -sum(a) over (order by pk rows between 0 preceding and current row) +sum(a) over (order by pk rows between 0 preceding and current row) as sum from t1; -pk a sum(a) over (order by pk rows between 0 preceding and current row) +pk a sum 1 1 1 2 2 2 3 4 4 4 8 8 select pk, a, -sum(a) over (order by pk rows between 1 preceding and 0 preceding) +sum(a) over (order by pk rows between 1 preceding and 0 preceding) as sum from t1; -pk a sum(a) over (order by pk rows between 1 preceding and 0 preceding) +pk a sum 1 1 1 2 2 3 3 4 6 @@ -1918,9 +1959,9 @@ insert into t1 values (200, 4, 8); select part_id, pk, a, -sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) +sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) as sum from t1; -part_id pk a sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) +part_id pk a sum 1 1 1 1 1 2 2 2 1 3 4 4 @@ -1931,9 +1972,9 @@ 200 4 8 8 select part_id, pk, a, -sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) +sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) as sum from t1; -part_id pk a sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) +part_id pk a sum 1 1 1 1 1 2 2 3 1 3 4 6 @@ -1958,8 +1999,8 @@ (2000, 3), (2000, 3), (2000, 3); -select rank() over (partition by part_id order by a) from t1; -rank() over (partition by part_id order by a) +select rank() over (partition by part_id order by a) as rank from t1; +rank 1 2 2 @@ -1969,14 +2010,14 @@ 3 3 3 -select distinct rank() over (partition by part_id order by a) from t1; -rank() over (partition by part_id order by a) +select distinct rank() over (partition by part_id order by a) as rank from t1; +rank 1 2 4 3 explain format=json -select distinct rank() over (partition by part_id order by a) from t1; +select distinct rank() over (partition by part_id order by a) as rank from t1; EXPLAIN { "query_block": { @@ -2062,11 +2103,8 @@ SELECT o_custkey, avg(o_custkey) OVER (PARTITION BY abs(o_custkey) ORDER BY o_custkey RANGE BETWEEN 15 FOLLOWING -AND 15 FOLLOWING) from orders; -o_custkey avg(o_custkey) OVER (PARTITION BY abs(o_custkey) -ORDER BY o_custkey -RANGE BETWEEN 15 FOLLOWING -AND 15 FOLLOWING) +AND 15 FOLLOWING) as avg from orders; +o_custkey avg 238 NULL 242 NULL DROP table orders; @@ -2290,15 +2328,15 @@ NULL NULL NULL -SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) from t; -ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) +SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) as result from t; +result 0.00000000000000 0.00000000000000 0.00000000000000 SELECT sum(t.a) over (partition by t.b order by a), -sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) +sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) as sum from t; -sum(t.a) over (partition by t.b order by a) sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) +sum(t.a) over (partition by t.b order by a) sum 0.0000000000 0 1.0000000000 1 3.0000000000 1.7320508075688772 @@ -2473,9 +2511,9 @@ (1,1000), (2,1100), (3,1800), (4,1500), (5,1700), (6,1200), (7,2000), (8,2100), (9,1600); SELECT id, sum(a) OVER (PARTITION BY id -ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as sum FROM t1; -id sum(a) OVER (PARTITION BY id +id sum 1 1000 2 1100 3 1800 @@ -2485,10 +2523,9 @@ 7 2000 8 2100 9 1600 -ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) -SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as sum FROM t1; -id sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +id sum 1 14000 2 13000 3 5900 @@ -3223,8 +3260,8 @@ # CREATE TABLE t1 (c CHAR(8)) ENGINE=MyISAM; INSERT IGNORE INTO t1 VALUES ('foo'); -SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1); -('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1) +SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1) as result; +result 0 DROP TABLE t1; # @@ -3257,8 +3294,8 @@ # CREATE TABLE t1 (dt DATETIME); INSERT INTO t1 VALUES ('2017-05-17'); -SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) FROM t1; -MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) +SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) as result FROM t1; +result NULL DROP TABLE t1; # @@ -4475,6 +4512,180 @@ 3 drop table t1; # +# MDEV-29307: join of 2 derived tables over the same grouping view such +# that the first of the joined tables contains a window +# function and the view's specification contains a subquery +# with a set function aggregated on the top level +# +CREATE TABLE t1 ( +tst int NOT NULL, +flat tinyint unsigned NOT NULL, +type tinyint unsigned NOT NULL, +val int NOT NULL, +PRIMARY KEY (tst,flat,type) +) ENGINE=ARIA; +INSERT INTO t1 VALUES +(5, 20, 2, 100), +(7, 20, 2, 150), +(9, 20, 1, 200); +CREATE VIEW v1 AS ( +SELECT +flat, +type, +( SELECT val FROM t1 sw +WHERE sw.tst = MAX(w.tst) AND sw.flat = w.flat AND sw.type = w.type) +AS total +FROM t1 w +GROUP BY flat, type +); +EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 Using where +1 PRIMARY ref key0 key0 1 v1.flat 2 100.00 Using where +6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +Warnings: +Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4 +Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4 +Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6 +Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6 +Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6 +Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6 +Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`v1`.`total` AS `w1_total` from `test`.`v1` join `test`.`v1` where `v1`.`flat` = `v1`.`flat` and `v1`.`type` = 2 and `v1`.`type` = 1 +SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +w2_total w1_total +150 200 +EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 Using where +1 PRIMARY ref key0 key0 1 w1.flat 2 100.00 Using where +6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +2 DERIVED ALL NULL NULL NULL NULL 3 100.00 Using where; Using temporary +4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +Warnings: +Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4 +Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4 +Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6 +Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6 +Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6 +Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6 +Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`type` order by `v1`.`type`) AS `u` from `test`.`v1` where `v1`.`type` = 1) `w1` join `test`.`v1` where `v1`.`flat` = `w1`.`flat` and `v1`.`type` = 2 +SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +w2_total w1_total +150 200 +EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total, u +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u +FROM v1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +) AS w2; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 Using join buffer (flat, BNL join) +6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort +7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +2 DERIVED ALL NULL NULL NULL NULL 3 100.00 Using temporary +4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort +5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +Warnings: +Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4 +Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4 +Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6 +Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6 +Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6 +Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6 +Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total`,`w1`.`u` AS `u` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`flat` order by `v1`.`flat`) AS `u` from `test`.`v1`) `w1` join `test`.`v1` +SELECT w2.total AS w2_total, w1.total AS w1_total, u +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u +FROM v1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +) AS w2; +w2_total w1_total u +150 150 2 +150 200 2 +200 150 2 +200 200 2 +DROP VIEW v1; +DROP TABLE t1; +# End of 10.5 tests +# # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER # CREATE TABLE t(c1 INT); @@ -4496,5 +4707,18 @@ DROP FUNCTION f; DROP TABLE t; # +# MDEV-31296: Crash in Item_func::fix_fields when prepared statement +# with subqueries and window function is executed with +# sql_mode = ONLY_FULL_GROUP_BY +# +CREATE TABLE t1 ( a INT, i INT) ; +CREATE TABLE t2 ( a INT); +INSERT INTO t2 VALUES (4000); +SET SESSION sql_mode = "ONLY_FULL_GROUP_BY"; +EXECUTE IMMEDIATE "SELECT SUM(i) OVER (ORDER BY i) FROM t1 NATURAL JOIN t2"; +SUM(i) OVER (ORDER BY i) +# Clean up +DROP TABLE t1, t2; +# # End of 10.6 tests # diff -Nru mariadb-10.11.6/mysql-test/main/win.test mariadb-10.11.9/mysql-test/main/win.test --- mariadb-10.11.6/mysql-test/main/win.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win.test 2024-08-03 07:29:57.000000000 +0000 @@ -2,9 +2,6 @@ # Window Functions Tests # --source include/no_valgrind_without_big.inc -#remove this include after fix MDEV-27871, MDEV-27938 ---source include/no_view_protocol.inc - --source include/have_sequence.inc --disable_warnings @@ -694,7 +691,7 @@ a, count(col1) over (order by a range between 0.1 preceding - and 0.1 following) + and 0.1 following) as count from t1; drop table t1; @@ -787,41 +784,70 @@ --error ER_RANGE_FRAME_NEEDS_SIMPLE_ORDERBY select count(*) over (order by a,b - range between unbounded preceding and current row) -from t1; - ---error ER_WRONG_TYPE_FOR_RANGE_FRAME -select - count(*) over (order by c - range between unbounded preceding and current row) + range between 1 preceding and current row) as count from t1; --error ER_WRONG_TYPE_FOR_RANGE_FRAME select count(*) over (order by a - range between 'abcd' preceding and current row) + range between 'abcd' preceding and current row) as count from t1; --error ER_WRONG_TYPE_FOR_RANGE_FRAME select count(*) over (order by a - range between current row and 'foo' following) + range between current row and 'foo' following) as count from t1; --echo # Try range frame with invalid bounds --error ER_WRONG_TYPE_FOR_ROWS_FRAME select count(*) over (order by a - rows between 0.5 preceding and current row) + rows between 0.5 preceding and current row) as count from t1; --error ER_WRONG_TYPE_FOR_ROWS_FRAME select count(*) over (order by a - rows between current row and 3.14 following) + rows between current row and 3.14 following) as count from t1; --echo # +--echo # MDEV-19052 Range-type window frame supports only numeric datatype +--echo # + +select + count(*) over (order by c + range between unbounded preceding and current row) as r +from t1; + +select + count(*) over (order by c + range between current row and unbounded following) as r +from t1; + +select + count(*) over (order by c + range between unbounded preceding and unbounded following) as r +from t1; + +create table t2 (a int, b varchar(5)); +insert into t2 values (1,'a'), (2, 'b'), (3, 'c'); + +select sum(a) over (order by b range between unbounded preceding and current row) as r from t2; + +insert into t1 values (3,3,'goo'); +insert into t1 values (3,1,'har'); +insert into t1 values (1,4,'har'); + +select a, b, sum(b) over (order by a, b desc range between unbounded preceding and current row) as r from t1; + +select a, b, sum(b) over (order by a desc, b range between unbounded preceding and current row) as r from t1; + +drop table t2; +delete from t1 where a >= 3 or b = 4; + +--echo # --echo # EXCLUDE clause is parsed but not supported --echo # @@ -829,28 +855,31 @@ select count(*) over (order by a rows between 1 preceding and 1 following - exclude current row) + exclude current row) as count from t1; --error ER_FRAME_EXCLUSION_NOT_SUPPORTED select count(*) over (order by a range between 1 preceding and 1 following - exclude ties) + exclude ties) as count from t1; --error ER_FRAME_EXCLUSION_NOT_SUPPORTED select count(*) over (order by a range between 1 preceding and 1 following - exclude group) + exclude group) as count from t1; + + + # EXCLUDE NO OTHERS means 'don't exclude anything' select count(*) over (order by a rows between 1 preceding and 1 following - exclude no others) + exclude no others) as count from t1; drop table t1; @@ -1027,24 +1056,24 @@ flush status; --sorted_result select - rank() over (partition by c order by a), - rank() over (partition by c order by b) + rank() over (partition by c order by a) as rank_a, + rank() over (partition by c order by b) as rank_b from t1; show status like '%sort%'; flush status; --sorted_result select - rank() over (partition by c order by a), - rank() over (partition by c order by a) + rank() over (partition by c order by a) as rank_a, + rank() over (partition by c order by a) as rank_b from t1; show status like '%sort%'; # Check using EXPLAIN FORMAT=JSON explain format=json select - rank() over (partition by c order by a), - rank() over (partition by c order by a) + rank() over (partition by c order by a) as rank_a, + rank() over (partition by c order by a) as rank_b from t1; explain format=json @@ -1055,14 +1084,14 @@ explain format=json select - rank() over (partition by c order by a), - count(*) over (partition by c) + rank() over (partition by c order by a) as rank_a, + count(*) over (partition by c) as count_c from t1; explain format=json select - count(*) over (partition by c), - rank() over (partition by c order by a) + count(*) over (partition by c) as count_c, + rank() over (partition by c order by a) as rank_a from t1; drop table t1; @@ -1137,12 +1166,12 @@ select pk, a, - sum(a) over (order by pk rows between 0 preceding and current row) + sum(a) over (order by pk rows between 0 preceding and current row) as sum from t1; select pk, a, - sum(a) over (order by pk rows between 1 preceding and 0 preceding) + sum(a) over (order by pk rows between 1 preceding and 0 preceding) as sum from t1; insert into t1 values (200, 1, 1); @@ -1151,12 +1180,12 @@ insert into t1 values (200, 4, 8); select part_id, pk, a, - sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) + sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) as sum from t1; select part_id, pk, a, - sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) + sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) as sum from t1; drop table t1; @@ -1177,10 +1206,10 @@ (2000, 3), (2000, 3); -select rank() over (partition by part_id order by a) from t1; -select distinct rank() over (partition by part_id order by a) from t1; +select rank() over (partition by part_id order by a) as rank from t1; +select distinct rank() over (partition by part_id order by a) as rank from t1; explain format=json -select distinct rank() over (partition by part_id order by a) from t1; +select distinct rank() over (partition by part_id order by a) as rank from t1; drop table t1; @@ -1237,7 +1266,7 @@ SELECT o_custkey, avg(o_custkey) OVER (PARTITION BY abs(o_custkey) ORDER BY o_custkey RANGE BETWEEN 15 FOLLOWING - AND 15 FOLLOWING) from orders; + AND 15 FOLLOWING) as avg from orders; DROP table orders; --echo # @@ -1374,9 +1403,9 @@ insert into t(a,b) values(2,1); insert into t(a,b) values(0,1); SELECT (CASE WHEN sum(t.a) over (partition by t.b)=0 THEN null ELSE null END) AS a FROM t; -SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) from t; +SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) as result from t; SELECT sum(t.a) over (partition by t.b order by a), - sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) + sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) as sum from t; drop table t; @@ -1460,11 +1489,11 @@ --sorted_result SELECT id, sum(a) OVER (PARTITION BY id - ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as sum FROM t1; --sorted_result -SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as sum FROM t1; DROP TABLE t1; @@ -1613,9 +1642,11 @@ from (select i+10 as i, b from t1) as tt order by i; +--disable_view_protocol select max(i), max(i), sum(i), count(i) from t1 as tt group by b; +--enable_view_protocol select max(i), min(sum(i)) over (partition by count(i)) f from t1 as tt @@ -1629,9 +1660,11 @@ from t1 as tt group by b; +--disable_view_protocol select max(i), max(i), sum(i), count(i) from (select i+10 as i, b from t1) as tt group by b; +--enable_view_protocol select max(i), min(sum(i)) over (partition by count(i)) f from (select i+10 as i, b from t1) as tt @@ -1946,7 +1979,7 @@ --echo # CREATE TABLE t1 (c CHAR(8)) ENGINE=MyISAM; INSERT IGNORE INTO t1 VALUES ('foo'); -SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1); +SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1) as result; DROP TABLE t1; --echo # @@ -1977,7 +2010,7 @@ CREATE TABLE t1 (dt DATETIME); INSERT INTO t1 VALUES ('2017-05-17'); -SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) FROM t1; +SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) as result FROM t1; DROP TABLE t1; --echo # @@ -2767,6 +2800,8 @@ GROUP BY nullif(id, 15532); drop table t1; +#Dublicate warnings +--disable_view_protocol CREATE TABLE t1 ( a char(25), b text); INSERT INTO t1 VALUES ('foo','bar'); @@ -2778,6 +2813,7 @@ LEFT((SYSDATE()), 'foo') WITH ROLLUP; drop table t1; +--enable_view_protocol --echo # --echo # @@ -2875,6 +2911,99 @@ drop table t1; --echo # +--echo # MDEV-29307: join of 2 derived tables over the same grouping view such +--echo # that the first of the joined tables contains a window +--echo # function and the view's specification contains a subquery +--echo # with a set function aggregated on the top level +--echo # + +CREATE TABLE t1 ( + tst int NOT NULL, + flat tinyint unsigned NOT NULL, + type tinyint unsigned NOT NULL, + val int NOT NULL, + PRIMARY KEY (tst,flat,type) +) ENGINE=ARIA; + +INSERT INTO t1 VALUES +(5, 20, 2, 100), +(7, 20, 2, 150), +(9, 20, 1, 200); + +CREATE VIEW v1 AS ( + SELECT + flat, + type, + ( SELECT val FROM t1 sw + WHERE sw.tst = MAX(w.tst) AND sw.flat = w.flat AND sw.type = w.type) + AS total + FROM t1 w + GROUP BY flat, type +); + +let $q1= +SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( + SELECT flat, type, total + FROM v1 + WHERE type = 1 +) AS w1 +JOIN +( + SELECT flat, type, total + FROM v1 + WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; + +eval EXPLAIN EXTENDED $q1; +eval $q1; + +let $q2= +SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( + SELECT flat, type, total, + COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u + FROM v1 + WHERE type = 1 +) AS w1 +JOIN +( + SELECT flat, type, total + FROM v1 + WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; + +eval EXPLAIN EXTENDED $q2; +eval $q2; + +let $q3= +SELECT w2.total AS w2_total, w1.total AS w1_total, u +FROM +( + SELECT flat, type, total, + COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u + FROM v1 +) AS w1 +JOIN +( + SELECT flat, type, total + FROM v1 +) AS w2; + +eval EXPLAIN EXTENDED $q3; +--sorted_result +eval $q3; + +DROP VIEW v1; +DROP TABLE t1; + +--echo # End of 10.5 tests + +--echo # --echo # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER --echo # @@ -2888,7 +3017,9 @@ END// DELIMITER ;// +--disable_view_protocol SELECT f(),f(); +--enable_view_protocol EXECUTE IMMEDIATE "SELECT LEAD(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; EXECUTE IMMEDIATE "SELECT SUM(c1) OVER (ORDER BY c1) FROM t NATURAL JOIN t AS a;"; @@ -2899,5 +3030,19 @@ DROP TABLE t; --echo # +--echo # MDEV-31296: Crash in Item_func::fix_fields when prepared statement +--echo # with subqueries and window function is executed with +--echo # sql_mode = ONLY_FULL_GROUP_BY +--echo # +CREATE TABLE t1 ( a INT, i INT) ; +CREATE TABLE t2 ( a INT); +INSERT INTO t2 VALUES (4000); +SET SESSION sql_mode = "ONLY_FULL_GROUP_BY"; +EXECUTE IMMEDIATE "SELECT SUM(i) OVER (ORDER BY i) FROM t1 NATURAL JOIN t2"; + +--echo # Clean up +DROP TABLE t1, t2; + +--echo # --echo # End of 10.6 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/main/win_avg.result mariadb-10.11.9/mysql-test/main/win_avg.result --- mariadb-10.11.6/mysql-test/main/win_avg.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_avg.result 2024-08-03 07:29:57.000000000 +0000 @@ -32,9 +32,9 @@ (125 , 6, 1, NULL), (126 , 6, 1, NULL), (127 , 6, 1, NULL); -select pk, a, b, avg(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, b, avg(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as avg from t1; -pk a b avg(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +pk a b avg 101 0 10 10.0000 102 0 10 10.0000 103 1 10 10.0000 @@ -62,9 +62,9 @@ 125 6 1 1.0000 126 6 1 1.0000 127 6 1 1.0000 -select pk, a, c, avg(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, c, avg(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as avg from t1; -pk a c avg(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +pk a c avg 101 0 1.1 1.6 102 0 2.1 1.6 103 1 3.1 3.5999999999999996 diff -Nru mariadb-10.11.6/mysql-test/main/win_avg.test mariadb-10.11.9/mysql-test/main/win_avg.test --- mariadb-10.11.6/mysql-test/main/win_avg.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_avg.test 2024-08-03 07:29:57.000000000 +0000 @@ -35,14 +35,11 @@ (126 , 6, 1, NULL), (127 , 6, 1, NULL); -#enable after fix MDEV-27871 ---disable_view_protocol --sorted_result -select pk, a, b, avg(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, b, avg(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as avg from t1; --sorted_result -select pk, a, c, avg(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, c, avg(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as avg from t1; ---enable_view_protocol drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/win_big.result mariadb-10.11.9/mysql-test/main/win_big.result --- mariadb-10.11.6/mysql-test/main/win_big.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_big.result 2024-08-03 07:29:57.000000000 +0000 @@ -19,10 +19,10 @@ from t10; select variable_name, -case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; -variable_name case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +variable_name result SORT_MERGE_PASSES NO PASSES set sort_buffer_size=1024; flush status; @@ -32,10 +32,10 @@ from t10; select variable_name, -case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; -variable_name case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +variable_name result SORT_MERGE_PASSES WITH PASSES include/diff_tables.inc [t21, t22] drop table t21, t22; @@ -51,10 +51,10 @@ from t10; select variable_name, -case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; -variable_name case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +variable_name result SORT_MERGE_PASSES NO PASSES set sort_buffer_size=1024; flush status; @@ -66,10 +66,10 @@ from t10; select variable_name, -case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; -variable_name case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +variable_name result SORT_MERGE_PASSES WITH PASSES include/diff_tables.inc [t21, t22] drop table t21, t22; @@ -85,10 +85,10 @@ from t10; select variable_name, -case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; -variable_name case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +variable_name result SORT_MERGE_PASSES NO PASSES set sort_buffer_size=1024; flush status; @@ -99,10 +99,10 @@ from t10; select variable_name, -case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; -variable_name case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end +variable_name result SORT_MERGE_PASSES WITH PASSES include/diff_tables.inc [t21, t22] drop table t21, t22; diff -Nru mariadb-10.11.6/mysql-test/main/win_big.test mariadb-10.11.9/mysql-test/main/win_big.test --- mariadb-10.11.6/mysql-test/main/win_big.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_big.test 2024-08-03 07:29:57.000000000 +0000 @@ -28,13 +28,10 @@ sum(b) over (order by a rows between 2 preceding and 2 following) as SUM_B from t10; -#enable after fix MDEV-27871 ---disable_view_protocol select variable_name, - case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end + case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; ---enable_view_protocol set sort_buffer_size=1024; flush status; @@ -43,13 +40,10 @@ sum(b) over (order by a rows between 2 preceding and 2 following) as SUM_B from t10; -#enable after fix MDEV-27871 ---disable_view_protocol select variable_name, - case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end + case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; ---enable_view_protocol let $diff_tables= t21, t22; source include/diff_tables.inc; @@ -66,13 +60,10 @@ sum(b) over (order by a rows between 20 preceding and 20 following) as SUM_B3 from t10; -#enable after fix MDEV-27871 ---disable_view_protocol select variable_name, - case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end + case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; ---enable_view_protocol set sort_buffer_size=1024; flush status; @@ -83,13 +74,10 @@ sum(b) over (order by a rows between 20 preceding and 20 following) as SUM_B3 from t10; -#enable after fix MDEV-27871 ---disable_view_protocol select variable_name, - case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end + case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; ---enable_view_protocol let $diff_tables= t21, t22; source include/diff_tables.inc; @@ -106,13 +94,10 @@ sum(b) over (order by a range between 5000 preceding and 5000 following) as SUM_B1 from t10; -#enable after fix MDEV-27871 ---disable_view_protocol select variable_name, - case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end + case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; ---enable_view_protocol set sort_buffer_size=1024; flush status; @@ -122,13 +107,10 @@ sum(b) over (order by a range between 5000 preceding and 5000 following) as SUM_B1 from t10; -#enable after fix MDEV-27871 ---disable_view_protocol select variable_name, - case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end + case when variable_value > 0 then 'WITH PASSES' else 'NO PASSES' end as result from information_schema.session_status where variable_name like 'Sort_merge_passes'; ---enable_view_protocol let $diff_tables= t21, t22; source include/diff_tables.inc; diff -Nru mariadb-10.11.6/mysql-test/main/win_nth_value.result mariadb-10.11.9/mysql-test/main/win_nth_value.result --- mariadb-10.11.6/mysql-test/main/win_nth_value.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_nth_value.result 2024-08-03 07:29:57.000000000 +0000 @@ -75,9 +75,9 @@ 11 2 NULL 9 select pk, a, -nth_value(pk, 1) over (partition by a order by pk ROWS between 1 preceding and 1 following) +nth_value(pk, 1) over (partition by a order by pk ROWS between 1 preceding and 1 following) as nth from t1; -pk a nth_value(pk, 1) over (partition by a order by pk ROWS between 1 preceding and 1 following) +pk a nth 1 0 1 2 0 1 3 0 2 @@ -91,21 +91,21 @@ 11 2 10 select pk, a, -nth_value(a, 1) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 2) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 3) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 4) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 5) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 6) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 7) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 8) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 9) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 10) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 11) over (order by a RANGE BETWEEN 1 preceding and 1 following), -nth_value(a, 12) over (order by a RANGE BETWEEN 1 preceding and 1 following) +nth_value(a, 1) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth1, +nth_value(a, 2) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth2, +nth_value(a, 3) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth3, +nth_value(a, 4) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth4, +nth_value(a, 5) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth5, +nth_value(a, 6) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth6, +nth_value(a, 7) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth7, +nth_value(a, 8) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth8, +nth_value(a, 9) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth9, +nth_value(a, 10) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth10, +nth_value(a, 11) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth11, +nth_value(a, 12) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth12 from t1 order by pk asc; -pk a nth_value(a, 1) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 2) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 3) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 4) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 5) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 6) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 7) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 8) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 9) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 10) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 11) over (order by a RANGE BETWEEN 1 preceding and 1 following) nth_value(a, 12) over (order by a RANGE BETWEEN 1 preceding and 1 following) +pk a nth1 nth2 nth3 nth4 nth5 nth6 nth7 nth8 nth9 nth10 nth11 nth12 1 0 0 0 0 1 1 1 NULL NULL NULL NULL NULL NULL 2 0 0 0 0 1 1 1 NULL NULL NULL NULL NULL NULL 3 0 0 0 0 1 1 1 NULL NULL NULL NULL NULL NULL diff -Nru mariadb-10.11.6/mysql-test/main/win_nth_value.test mariadb-10.11.9/mysql-test/main/win_nth_value.test --- mariadb-10.11.6/mysql-test/main/win_nth_value.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_nth_value.test 2024-08-03 07:29:57.000000000 +0000 @@ -42,32 +42,26 @@ from t1 order by pk asc; -#enable after fix MDEV-27871 ---disable_view_protocol select pk, a, - nth_value(pk, 1) over (partition by a order by pk ROWS between 1 preceding and 1 following) + nth_value(pk, 1) over (partition by a order by pk ROWS between 1 preceding and 1 following) as nth from t1; ---enable_view_protocol -#enable after fix MDEV-28535 ---disable_view_protocol select pk, a, - nth_value(a, 1) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 2) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 3) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 4) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 5) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 6) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 7) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 8) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 9) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 10) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 11) over (order by a RANGE BETWEEN 1 preceding and 1 following), - nth_value(a, 12) over (order by a RANGE BETWEEN 1 preceding and 1 following) + nth_value(a, 1) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth1, + nth_value(a, 2) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth2, + nth_value(a, 3) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth3, + nth_value(a, 4) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth4, + nth_value(a, 5) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth5, + nth_value(a, 6) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth6, + nth_value(a, 7) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth7, + nth_value(a, 8) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth8, + nth_value(a, 9) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth9, + nth_value(a, 10) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth10, + nth_value(a, 11) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth11, + nth_value(a, 12) over (order by a RANGE BETWEEN 1 preceding and 1 following) as nth12 from t1 order by pk asc; ---enable_view_protocol drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/win_ntile.result mariadb-10.11.9/mysql-test/main/win_ntile.result --- mariadb-10.11.6/mysql-test/main/win_ntile.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_ntile.result 2024-08-03 07:29:57.000000000 +0000 @@ -396,9 +396,9 @@ a 1 select pk, a, b, -ntile((select a from t1 where pk=13)) over (partition by b order by pk) +ntile((select a from t1 where pk=13)) over (partition by b order by pk) as ntile from t1; -pk a b ntile((select a from t1 where pk=13)) over (partition by b order by pk) +pk a b ntile 11 0 10 1 12 0 10 1 13 1 10 1 @@ -411,7 +411,7 @@ 20 4 20 1 explain select pk, a, b, -ntile((select a from t1 where pk=13)) over (partition by b order by pk) +ntile((select a from t1 where pk=13)) over (partition by b order by pk) as ntile from t1; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using temporary diff -Nru mariadb-10.11.6/mysql-test/main/win_ntile.test mariadb-10.11.9/mysql-test/main/win_ntile.test --- mariadb-10.11.6/mysql-test/main/win_ntile.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_ntile.test 2024-08-03 07:29:57.000000000 +0000 @@ -152,17 +152,14 @@ from t1; select t1.a from t1 where pk = 13; -#enable after fix MDEV-27871 ---disable_view_protocol select pk, a, b, - ntile((select a from t1 where pk=13)) over (partition by b order by pk) + ntile((select a from t1 where pk=13)) over (partition by b order by pk) as ntile from t1; explain select pk, a, b, - ntile((select a from t1 where pk=13)) over (partition by b order by pk) + ntile((select a from t1 where pk=13)) over (partition by b order by pk) as ntile from t1; ---enable_view_protocol select a from t1; --error ER_SUBQUERY_NO_1_ROW diff -Nru mariadb-10.11.6/mysql-test/main/win_percentile.result mariadb-10.11.9/mysql-test/main/win_percentile.result --- mariadb-10.11.6/mysql-test/main/win_percentile.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_percentile.result 2024-08-03 07:29:57.000000000 +0000 @@ -96,10 +96,10 @@ Tata Tatiana #disallowed fields in order by -select score, percentile_cont(0.5) within group(order by name) over (partition by score) from t1; +select score, percentile_cont(0.5) within group(order by name) over (partition by score) as result from t1; ERROR HY000: Numeric datatype is required for percentile_cont function -select score, percentile_disc(0.5) within group(order by name) over (partition by score) from t1; -score percentile_disc(0.5) within group(order by name) over (partition by score) +select score, percentile_disc(0.5) within group(order by name) over (partition by score) as result from t1; +score result 3.0000 Chun 3.0000 Chun 4.0000 Tata diff -Nru mariadb-10.11.6/mysql-test/main/win_percentile.test mariadb-10.11.9/mysql-test/main/win_percentile.test --- mariadb-10.11.6/mysql-test/main/win_percentile.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_percentile.test 2024-08-03 07:29:57.000000000 +0000 @@ -62,12 +62,9 @@ --echo #disallowed fields in order by --error ER_WRONG_TYPE_FOR_PERCENTILE_FUNC -select score, percentile_cont(0.5) within group(order by name) over (partition by score) from t1; +select score, percentile_cont(0.5) within group(order by name) over (partition by score) as result from t1; -#enable after fix MDEV-27871 ---disable_view_protocol -select score, percentile_disc(0.5) within group(order by name) over (partition by score) from t1; ---enable_view_protocol +select score, percentile_disc(0.5) within group(order by name) over (partition by score) as result from t1; --echo #parameter value should be in the range of [0,1] --error ER_ARGUMENT_OUT_OF_RANGE diff -Nru mariadb-10.11.6/mysql-test/main/win_sum.result mariadb-10.11.9/mysql-test/main/win_sum.result --- mariadb-10.11.6/mysql-test/main/win_sum.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_sum.result 2024-08-03 07:29:57.000000000 +0000 @@ -32,9 +32,9 @@ (125 , 6, 1, NULL), (126 , 6, 1, NULL), (127 , 6, 1, NULL); -select pk, a, b, sum(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, b, sum(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as sum from t1; -pk a b sum(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +pk a b sum 101 0 10 20 102 0 10 20 103 1 10 20 @@ -62,9 +62,9 @@ 125 6 1 3 126 6 1 3 127 6 1 2 -select pk, a, c, sum(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, c, sum(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as sum from t1; -pk a c sum(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +pk a c sum 101 0 1.1 3.2 102 0 2.1 3.2 103 1 3.1 7.199999999999999 diff -Nru mariadb-10.11.6/mysql-test/main/win_sum.test mariadb-10.11.9/mysql-test/main/win_sum.test --- mariadb-10.11.6/mysql-test/main/win_sum.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/win_sum.test 2024-08-03 07:29:57.000000000 +0000 @@ -35,17 +35,13 @@ (126 , 6, 1, NULL), (127 , 6, 1, NULL); -#enable after fix MDEV-27871 ---disable_view_protocol - --sorted_result -select pk, a, b, sum(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, b, sum(b) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as sum from t1; --sorted_result -select pk, a, c, sum(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) +select pk, a, c, sum(c) over (partition by a order by pk ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) as sum from t1; ---enable_view_protocol drop table t1; diff -Nru mariadb-10.11.6/mysql-test/main/xml.result mariadb-10.11.9/mysql-test/main/xml.result --- mariadb-10.11.6/mysql-test/main/xml.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/xml.result 2024-08-03 07:29:57.000000000 +0000 @@ -410,17 +410,17 @@ select extractValue('','/a/@b[2<=position()]'); extractValue('','/a/@b[2<=position()]') b2 b3 -select extractValue('','/a/@b[position()=3 or position()=2]'); -extractValue('','/a/@b[position()=3 or position()=2]') +select extractValue('','/a/@b[position()=3 or position()=2]') as xml; +xml b2 b3 -SELECT extractValue('aa1c1a2','/a/b[count(c)=0]'); -extractValue('aa1c1a2','/a/b[count(c)=0]') +SELECT extractValue('aa1c1a2','/a/b[count(c)=0]') as xml; +xml a2 -SELECT extractValue('aa1c1a2','/a/b[count(c)=1]'); -extractValue('aa1c1a2','/a/b[count(c)=1]') +SELECT extractValue('aa1c1a2','/a/b[count(c)=1]') as xml; +xml a1 -select extractValue('a1b1b24','/a/b[sum(@ba)=3]'); -extractValue('a1b1b24','/a/b[sum(@ba)=3]') +select extractValue('a1b1b24','/a/b[sum(@ba)=3]') as xml; +xml b1 select extractValue('b1b2','/a/b[1]'); extractValue('b1b2','/a/b[1]') @@ -506,14 +506,14 @@ extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]') b21 SET @xml='a1b1c1b2a2'; -select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++'); -UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++') +select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++') as xml; +xml a1b1+++++++++b2a2 -select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++'); -UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++') +select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++') as xml; +xml a1b1+++++++++b2a2 -select UpdateXML('a1b1c1b2a2','/a/b/c',''); -UpdateXML('a1b1c1b2a2','/a/b/c','') +select UpdateXML('a1b1c1b2a2','/a/b/c','') as xml; +xml a1b1b2a2 SET @xml='bb'; select UpdateXML(@xml, '/a/b', 'ccc'); @@ -586,59 +586,59 @@ select extractvalue('ABC','/a/self::*'); extractvalue('ABC','/a/self::*') A -select extractvalue('ABC','/a/descendant-or-self::*'); -extractvalue('ABC','/a/descendant-or-self::*') +select extractvalue('ABC','/a/descendant-or-self::*') as xml; +xml A B C select extractvalue('A','/A_B'); extractvalue('A','/A_B') A -select extractvalue('AB1B2','/a/b[position()]'); -extractvalue('AB1B2','/a/b[position()]') +select extractvalue('AB1B2','/a/b[position()]') as xml; +xml B1 B2 -select extractvalue('AB1B2','/a/b[count(.)=last()]'); -extractvalue('AB1B2','/a/b[count(.)=last()]') +select extractvalue('AB1B2','/a/b[count(.)=last()]') as xml; +xml B1 B2 -select extractvalue('AB1B2','/a/b[last()]'); -extractvalue('AB1B2','/a/b[last()]') +select extractvalue('AB1B2','/a/b[last()]') as xml; +xml B2 -select extractvalue('AB1B2','/a/b[last()-1]'); -extractvalue('AB1B2','/a/b[last()-1]') +select extractvalue('AB1B2','/a/b[last()-1]') as xml; +xml B1 -select extractvalue('AB1B2','/a/b[last()=1]'); -extractvalue('AB1B2','/a/b[last()=1]') +select extractvalue('AB1B2','/a/b[last()=1]') as xml; +xml -select extractvalue('AB1B2','/a/b[last()=2]'); -extractvalue('AB1B2','/a/b[last()=2]') +select extractvalue('AB1B2','/a/b[last()=2]') as xml; +xml B1 B2 -select extractvalue('AB1B2','/a/b[last()=position()]'); -extractvalue('AB1B2','/a/b[last()=position()]') +select extractvalue('AB1B2','/a/b[last()=position()]') as xml; +xml B2 -select extractvalue('AB1B2','/a/b[count(.)]'); -extractvalue('AB1B2','/a/b[count(.)]') +select extractvalue('AB1B2','/a/b[count(.)]') as xml; +xml B2 -select extractvalue('AB1B2','/a/b[count(.)-1]'); -extractvalue('AB1B2','/a/b[count(.)-1]') +select extractvalue('AB1B2','/a/b[count(.)-1]') as xml; +xml B1 -select extractvalue('AB1B2','/a/b[count(.)=1]'); -extractvalue('AB1B2','/a/b[count(.)=1]') +select extractvalue('AB1B2','/a/b[count(.)=1]') as xml; +xml -select extractvalue('AB1B2','/a/b[count(.)=2]'); -extractvalue('AB1B2','/a/b[count(.)=2]') +select extractvalue('AB1B2','/a/b[count(.)=2]') as xml; +xml B1 B2 -select extractvalue('AB1B2','/a/b[count(.)=position()]'); -extractvalue('AB1B2','/a/b[count(.)=position()]') +select extractvalue('AB1B2','/a/b[count(.)=position()]') as xml; +xml B2 -select extractvalue('Jack','/a[contains(../a,"J")]'); -extractvalue('Jack','/a[contains(../a,"J")]') +select extractvalue('Jack','/a[contains(../a,"J")]') as xml; +xml Jack -select extractvalue('Jack','/a[contains(../a,"j")]'); -extractvalue('Jack','/a[contains(../a,"j")]') +select extractvalue('Jack','/a[contains(../a,"j")]') as xml; +xml Jack -select extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin); -extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin) +select extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin) as xml; +xml -select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]'); -extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]') +select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]') as xml; +xml select ExtractValue('','/tag1'); ExtractValue('','/tag1') @@ -702,25 +702,25 @@ EXTRACTVALUE(p,'/Ñ/r') A DROP PROCEDURE p2; -select extractValue('','count(ns:element)'); -extractValue('','count(ns:element)') +select extractValue('','count(ns:element)') as xml; +xml 1 -select extractValue('a','/ns:element'); -extractValue('a','/ns:element') +select extractValue('a','/ns:element') as xml; +xml a -select extractValue('a','/ns:element/@xmlns:ns'); -extractValue('a','/ns:element/@xmlns:ns') +select extractValue('a','/ns:element/@xmlns:ns') as xml; +xml myns -select extractValue('DataOtherdata','/foo/foo.bar'); -extractValue('DataOtherdata','/foo/foo.bar') +select extractValue('DataOtherdata','/foo/foo.bar') as xml; +xml Data -select extractValue('DataOtherdata','/foo/something'); -extractValue('DataOtherdata','/foo/something') +select extractValue('DataOtherdata','/foo/something') as xml; +xml Otherdata -select extractValue('<01>10:39:15<02>140','/zot/tim0/02'); +select extractValue('<01>10:39:15<02>140','/zot/tim0/02') as xml; ERROR HY000: XPATH syntax error: '02' -select extractValue('<01>10:39:15<02>140','//*'); -extractValue('<01>10:39:15<02>140','//*') +select extractValue('<01>10:39:15<02>140','//*') as xml; +xml NULL Warnings: Warning 1525 Incorrect XML value: 'parse error at line 1 pos 13: unknown token unexpected (ident or '/' wanted)' @@ -816,17 +816,17 @@ select ExtractValue(@xml, "/entry[(50<=pt)]/id"); ExtractValue(@xml, "/entry[(50<=pt)]/id") pt50 -select ExtractValue('test','/a/b/Text'); -ExtractValue('test','/a/b/Text') +select ExtractValue('test','/a/b/Text') as xml; +xml test -select ExtractValue('test','/a/b/comment'); -ExtractValue('test','/a/b/comment') +select ExtractValue('test','/a/b/comment') as xml; +xml test -select ExtractValue('test','/a/b/node'); -ExtractValue('test','/a/b/node') +select ExtractValue('test','/a/b/node') as xml; +xml test -select ExtractValue('test','/a/b/processing-instruction'); -ExtractValue('test','/a/b/processing-instruction') +select ExtractValue('test','/a/b/processing-instruction') as xml; +xml test select ExtractValue('test', '/a/and'); ExtractValue('test', '/a/and') @@ -852,44 +852,44 @@ select ExtractValue('test', '/a/div:div'); ExtractValue('test', '/a/div:div') test -select ExtractValue('test', '/a/ancestor'); -ExtractValue('test', '/a/ancestor') +select ExtractValue('test', '/a/ancestor') as xml; +xml test -select ExtractValue('test', '/a/ancestor-or-self'); -ExtractValue('test', '/a/ancestor-or-self') +select ExtractValue('test', '/a/ancestor-or-self') as xml; +xml test -select ExtractValue('test', '/a/attribute'); -ExtractValue('test', '/a/attribute') +select ExtractValue('test', '/a/attribute') as xml; +xml test -select ExtractValue('test', '/a/child'); -ExtractValue('test', '/a/child') +select ExtractValue('test', '/a/child') as xml; +xml test -select ExtractValue('test', '/a/descendant'); -ExtractValue('test', '/a/descendant') +select ExtractValue('test', '/a/descendant') as xml; +xml test -select ExtractValue('test', '/a/descendant-or-self'); -ExtractValue('test', '/a/descendant-or-self') +select ExtractValue('test', '/a/descendant-or-self') as xml; +xml test -select ExtractValue('test', '/a/following'); -ExtractValue('test', '/a/following') +select ExtractValue('test', '/a/following') as xml; +xml test -select ExtractValue('test', '/a/following-sibling'); -ExtractValue('test', '/a/following-sibling') +select ExtractValue('test', '/a/following-sibling') as xml; +xml test -select ExtractValue('test', '/a/namespace'); -ExtractValue('test', '/a/namespace') +select ExtractValue('test', '/a/namespace') as xml; +xml test -select ExtractValue('test', '/a/parent'); -ExtractValue('test', '/a/parent') +select ExtractValue('test', '/a/parent') as xml; +xml test -select ExtractValue('test', '/a/preceding'); -ExtractValue('test', '/a/preceding') +select ExtractValue('test', '/a/preceding') as xml; +xml test -select ExtractValue('test', '/a/preceding-sibling'); -ExtractValue('test', '/a/preceding-sibling') +select ExtractValue('test', '/a/preceding-sibling') as xml; +xml test -select ExtractValue('test', '/a/self'); -ExtractValue('test', '/a/self') +select ExtractValue('test', '/a/self') as xml; +xml test set @i=1; select ExtractValue('b1b2','/a/b[$@i]'); @@ -991,20 +991,20 @@ ExtractValue(xml,'/a/b[$i]') b1 Warnings: -Warning 1292 Truncated incorrect INTEGER value: '1 and string ' -Warning 1292 Truncated incorrect INTEGER value: '1 and string ' +Warning 1292 Truncated incorrect INTEGER value: '1 and string' +Warning 1292 Truncated incorrect INTEGER value: '1 and string' CALL spxml('b1b2', 'string and 1'); ExtractValue(xml,'/a/b[$i]') Warnings: -Warning 1292 Truncated incorrect INTEGER value: 'string and 1 ' -Warning 1292 Truncated incorrect INTEGER value: 'string and 1 ' +Warning 1292 Truncated incorrect INTEGER value: 'string and 1' +Warning 1292 Truncated incorrect INTEGER value: 'string and 1' CALL spxml('b1b2', 'string'); ExtractValue(xml,'/a/b[$i]') Warnings: -Warning 1292 Truncated incorrect INTEGER value: 'string ' -Warning 1292 Truncated incorrect INTEGER value: 'string ' +Warning 1292 Truncated incorrect INTEGER value: 'string' +Warning 1292 Truncated incorrect INTEGER value: 'string' DROP PROCEDURE spxml; select UpdateXML('a',repeat('a b ',1000),''); ERROR HY000: XPATH syntax error: 'b a b a b a b a b a b a b a b...' @@ -1181,8 +1181,8 @@ SELECT ExtractValue('aabb','(a)/a|(a)/b'); ExtractValue('aabb','(a)/a|(a)/b') aa bb -SELECT ExtractValue('abc21','substring(/a/b,..)'); -ExtractValue('abc21','substring(/a/b,..)') +SELECT ExtractValue('abc21','substring(/a/b,..)') as xml; +xml Warnings: Warning 1292 Truncated incorrect INTEGER value: '' diff -Nru mariadb-10.11.6/mysql-test/main/xml.test mariadb-10.11.9/mysql-test/main/xml.test --- mariadb-10.11.6/mysql-test/main/xml.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/main/xml.test 2024-08-03 07:29:57.000000000 +0000 @@ -166,14 +166,11 @@ select extractValue('','/a/@b[3=position()]'); select extractValue('','/a/@b[2>=position()]'); select extractValue('','/a/@b[2<=position()]'); -#enable after fix MDEV-27871 ---disable_view_protocol -select extractValue('','/a/@b[position()=3 or position()=2]'); +select extractValue('','/a/@b[position()=3 or position()=2]') as xml; -SELECT extractValue('aa1c1a2','/a/b[count(c)=0]'); -SELECT extractValue('aa1c1a2','/a/b[count(c)=1]'); -select extractValue('a1b1b24','/a/b[sum(@ba)=3]'); ---enable_view_protocol +SELECT extractValue('aa1c1a2','/a/b[count(c)=0]') as xml; +SELECT extractValue('aa1c1a2','/a/b[count(c)=1]') as xml; +select extractValue('a1b1b24','/a/b[sum(@ba)=3]') as xml; select extractValue('b1b2','/a/b[1]'); select extractValue('b1b2','/a/b[boolean(1)]'); @@ -216,12 +213,9 @@ select extractValue(@xml,'/a/@b[contains(.,"1")][contains(.,"2")][2]'); SET @xml='a1b1c1b2a2'; -#enable after fix MDEV-27871 ---disable_view_protocol -select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++'); -select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++'); ---enable_view_protocol -select UpdateXML('a1b1c1b2a2','/a/b/c',''); +select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++') as xml; +select UpdateXML('a1b1c1b2a2','/a/b/c','+++++++++') as xml; +select UpdateXML('a1b1c1b2a2','/a/b/c','') as xml; SET @xml='bb'; select UpdateXML(@xml, '/a/b', 'ccc'); @@ -277,10 +271,7 @@ # select extractvalue('ABC','/a/descendant::*'); select extractvalue('ABC','/a/self::*'); -#enable after fix MDEV-27871 ---disable_view_protocol -select extractvalue('ABC','/a/descendant-or-self::*'); ---enable_view_protocol +select extractvalue('ABC','/a/descendant-or-self::*') as xml; # Bug #16320 XML: extractvalue() won't accept names containing underscores # select extractvalue('A','/A_B'); @@ -288,37 +279,26 @@ # # Bug#16318: XML: extractvalue() incorrectly returns last() = 1 # -select extractvalue('AB1B2','/a/b[position()]'); -#enable after fix MDEV-27871 ---disable_view_protocol -select extractvalue('AB1B2','/a/b[count(.)=last()]'); ---enable_view_protocol -select extractvalue('AB1B2','/a/b[last()]'); -select extractvalue('AB1B2','/a/b[last()-1]'); -select extractvalue('AB1B2','/a/b[last()=1]'); -select extractvalue('AB1B2','/a/b[last()=2]'); -#enable after fix MDEV-27871 ---disable_view_protocol -select extractvalue('AB1B2','/a/b[last()=position()]'); ---enable_view_protocol -select extractvalue('AB1B2','/a/b[count(.)]'); -select extractvalue('AB1B2','/a/b[count(.)-1]'); -select extractvalue('AB1B2','/a/b[count(.)=1]'); -select extractvalue('AB1B2','/a/b[count(.)=2]'); -#enable after fix MDEV-27871 ---disable_view_protocol -select extractvalue('AB1B2','/a/b[count(.)=position()]'); ---enable_view_protocol +select extractvalue('AB1B2','/a/b[position()]') as xml; +select extractvalue('AB1B2','/a/b[count(.)=last()]') as xml; +select extractvalue('AB1B2','/a/b[last()]') as xml; +select extractvalue('AB1B2','/a/b[last()-1]') as xml; +select extractvalue('AB1B2','/a/b[last()=1]') as xml; +select extractvalue('AB1B2','/a/b[last()=2]') as xml; +select extractvalue('AB1B2','/a/b[last()=position()]') as xml; +select extractvalue('AB1B2','/a/b[count(.)]') as xml; +select extractvalue('AB1B2','/a/b[count(.)-1]') as xml; +select extractvalue('AB1B2','/a/b[count(.)=1]') as xml; +select extractvalue('AB1B2','/a/b[count(.)=2]') as xml; +select extractvalue('AB1B2','/a/b[count(.)=position()]') as xml; + # # Bug#16316: XML: extractvalue() is case-sensitive with contains() # -select extractvalue('Jack','/a[contains(../a,"J")]'); -select extractvalue('Jack','/a[contains(../a,"j")]'); -#enable after fix MDEV-27871 ---disable_view_protocol -select extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin); -select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]'); ---enable_view_protocol +select extractvalue('Jack','/a[contains(../a,"J")]') as xml; +select extractvalue('Jack','/a[contains(../a,"j")]') as xml; +select extractvalue('Jack','/a[contains(../a,"j")]' collate latin1_bin) as xml; +select extractvalue('Jack' collate latin1_bin,'/a[contains(../a,"j")]') as xml; # # Bug#18285: ExtractValue not returning character @@ -383,33 +363,25 @@ # Bug#18170: XML: ExtractValue(): # XPath expression can't use QNames (colon in names) # -#enable after fix MDEV-27871 ---disable_view_protocol -select extractValue('','count(ns:element)'); -select extractValue('a','/ns:element'); -select extractValue('a','/ns:element/@xmlns:ns'); ---enable_view_protocol +select extractValue('','count(ns:element)') as xml; +select extractValue('a','/ns:element') as xml; +select extractValue('a','/ns:element/@xmlns:ns') as xml; + # # Bug#20795 extractvalue() won't accept names containing a dot (.) # -#enable after fix MDEV-27871 ---disable_view_protocol -select extractValue('DataOtherdata','/foo/foo.bar'); -select extractValue('DataOtherdata','/foo/something'); ---enable_view_protocol +select extractValue('DataOtherdata','/foo/foo.bar') as xml; +select extractValue('DataOtherdata','/foo/something') as xml; # # Bug#20854 XML functions: wrong result in ExtractValue # -#enable after fix MDEV-27871 +#view protocol generates additional warning --disable_view_protocol --error 1105 -select extractValue('<01>10:39:15<02>140','/zot/tim0/02'); -select extractValue('<01>10:39:15<02>140','//*'); ---enable_view_protocol +select extractValue('<01>10:39:15<02>140','/zot/tim0/02') as xml; +select extractValue('<01>10:39:15<02>140','//*') as xml; -#view protocol generates additional warning ---disable_view_protocol # dot and dash are bad identtifier start character select extractValue('<.>test','//*'); select extractValue('<->test','//*'); @@ -457,13 +429,10 @@ # # Test nodetypes in node name context # -select ExtractValue('test','/a/b/Text'); -#enable after fix MDEV-27871 ---disable_view_protocol -select ExtractValue('test','/a/b/comment'); -select ExtractValue('test','/a/b/node'); -select ExtractValue('test','/a/b/processing-instruction'); ---enable_view_protocol +select ExtractValue('test','/a/b/Text') as xml; +select ExtractValue('test','/a/b/comment') as xml; +select ExtractValue('test','/a/b/node') as xml; +select ExtractValue('test','/a/b/processing-instruction') as xml; # # Test keywords in node name contexts @@ -479,22 +448,19 @@ # # Test axis names in node name context # -select ExtractValue('test', '/a/ancestor'); -#enable after fix MDEV-27871 ---disable_view_protocol -select ExtractValue('test', '/a/ancestor-or-self'); -select ExtractValue('test', '/a/attribute'); -select ExtractValue('test', '/a/child'); -select ExtractValue('test', '/a/descendant'); -select ExtractValue('test', '/a/descendant-or-self'); -select ExtractValue('test', '/a/following'); -select ExtractValue('test', '/a/following-sibling'); -select ExtractValue('test', '/a/namespace'); -select ExtractValue('test', '/a/parent'); -select ExtractValue('test', '/a/preceding'); -select ExtractValue('test', '/a/preceding-sibling'); ---enable_view_protocol -select ExtractValue('test', '/a/self'); +select ExtractValue('test', '/a/ancestor') as xml; +select ExtractValue('test', '/a/ancestor-or-self') as xml; +select ExtractValue('test', '/a/attribute') as xml; +select ExtractValue('test', '/a/child') as xml; +select ExtractValue('test', '/a/descendant') as xml; +select ExtractValue('test', '/a/descendant-or-self') as xml; +select ExtractValue('test', '/a/following') as xml; +select ExtractValue('test', '/a/following-sibling') as xml; +select ExtractValue('test', '/a/namespace') as xml; +select ExtractValue('test', '/a/parent') as xml; +select ExtractValue('test', '/a/preceding') as xml; +select ExtractValue('test', '/a/preceding-sibling') as xml; +select ExtractValue('test', '/a/self') as xml; # # Bug#26518 XPath and variables problem @@ -751,10 +717,7 @@ # MDEV-5689 ExtractValue(xml, 'substring(/x,/y)') crashes # MySQL bug#12428404 MYSQLD.EXE CRASHES WHEN EXTRACTVALUE() IS CALLED WITH MALFORMED XPATH EXP # -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT ExtractValue('abc21','substring(/a/b,..)'); ---enable_view_protocol +SELECT ExtractValue('abc21','substring(/a/b,..)') as xml; --echo # --echo # Bug#62429 XML: ExtractValue, UpdateXML max arg length 127 chars diff -Nru mariadb-10.11.6/mysql-test/mariadb-test-run.pl mariadb-10.11.9/mysql-test/mariadb-test-run.pl --- mariadb-10.11.6/mysql-test/mariadb-test-run.pl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/mariadb-test-run.pl 2024-08-03 07:29:57.000000000 +0000 @@ -337,7 +337,11 @@ my $opt_core_on_failure= 0; my $opt_parallel= $ENV{MTR_PARALLEL} || 1; -my $opt_port_group_size = $ENV{MTR_PORT_GROUP_SIZE} || 20; +# Some galera tests starts 6 galera nodes. Each galera node requires +# three ports: 6*3 = 18. Plus 6 ports are needed for 6 mariadbd servers. +# Since the number of ports is rounded up to 10 everywhere, we will +# take 30 as the default value: +my $opt_port_group_size = $ENV{MTR_PORT_GROUP_SIZE} || 30; # lock file to stop tests my $opt_stop_file= $ENV{MTR_STOP_FILE}; @@ -434,6 +438,10 @@ { $opt_parallel= $ENV{NUMBER_OF_PROCESSORS} || 1; } + elsif (IS_MAC || IS_FREEBSD) + { + $opt_parallel= `sysctl -n hw.ncpu`; + } else { my $sys_info= My::SysInfo->new(); @@ -3101,6 +3109,7 @@ mtr_add_arg($args, "--core-file"); mtr_add_arg($args, "--console"); mtr_add_arg($args, "--character-set-server=latin1"); + mtr_add_arg($args, "--loose-disable-performance-schema"); if ( $opt_debug ) { @@ -4454,6 +4463,7 @@ qr/InnoDB: Warning: a long semaphore wait:/, qr/InnoDB: Dumping buffer pool.*/, qr/InnoDB: Buffer pool.*/, + qr/InnoDB: Could not free any blocks in the buffer pool!/, qr/InnoDB: Warning: Writer thread is waiting this semaphore:/, qr/InnoDB: innodb_open_files .* should not be greater than/, qr/Slave: Unknown table 't1' .* 1051/, @@ -4484,6 +4494,14 @@ qr/Slave I\/0: Master command COM_BINLOG_DUMP failed/, qr/Error reading packet/, qr/Lost connection to MariaDB server at 'reading initial communication packet'/, + qr/Could not read packet:.* state: [2-3] /, + qr/Could not read packet:.* errno: 104 /, + qr/Could not read packet:.* errno: 0 .* length: 0/, + qr/Could not write packet:.* errno: 32 /, + qr/Could not write packet:.* errno: 104 /, + qr/Semisync ack receiver got error 1158/, + qr/Semisync ack receiver got hangup/, + qr/Connection was killed/, qr/Failed on request_dump/, qr/Slave: Can't drop database.* database doesn't exist/, qr/Slave: Operation DROP USER failed for 'create_rout_db'/, @@ -4506,7 +4524,7 @@ qr|InnoDB: io_setup\(\) failed with EAGAIN|, qr|io_uring_queue_init\(\) failed with|, qr|InnoDB: liburing disabled|, - qr/InnoDB: Failed to set (O_DIRECT|DIRECTIO_ON) on file/, + qr/InnoDB: Failed to set O_DIRECT on file/, qr|setrlimit could not change the size of core files to 'infinity';|, qr|feedback plugin: failed to retrieve the MAC address|, qr|Plugin 'FEEDBACK' init function returned error|, @@ -4539,8 +4557,7 @@ qr/WSREP: Failed to guess base node address/, qr/WSREP: Guessing address for incoming client/, - # for UBSAN - qr/decimal\.c.*: runtime error: signed integer overflow/, + qr/InnoDB: Difficult to find free blocks in the buffer pool*/, # Disable test for UBSAN on dynamically loaded objects qr/runtime error: member call.*object.*'Handler_share'/, qr/sql_type\.cc.* runtime error: member call.*object.* 'Type_collection'/, @@ -5562,6 +5579,8 @@ mtr_add_arg($args, "--record"); } my $errfile= "$opt_vardir/tmp/$name.err"; + + My::Debugger::setup_client_args(\$args, \$exe_mysqltest); my $proc= My::SafeProcess->new ( name => $name, @@ -5700,6 +5719,8 @@ mtr_add_arg($args, "--result-file=%s", $tinfo->{'result_file'}); } + mtr_add_arg($args, "--wait-for-pos-timeout=%d", $opt_debug_sync_timeout); + client_debug_arg($args, "mysqltest"); if ( $opt_record ) Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/mysql-test/std_data/autoinc_import_101.frm and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/autoinc_import_101.frm differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/mysql-test/std_data/autoinc_import_57.frm and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/autoinc_import_57.frm differ diff -Nru mariadb-10.11.6/mysql-test/std_data/mdev-25731.dat mariadb-10.11.9/mysql-test/std_data/mdev-25731.dat --- mariadb-10.11.6/mysql-test/std_data/mdev-25731.dat 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/std_data/mdev-25731.dat 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,6 @@ +1 +2 +3 +1 +5 +6 Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/mysql-test/std_data/mysql80/t2.cfg and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/mysql80/t2.cfg differ Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/mysql-test/std_data/mysql80/t2.ibd and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/std_data/mysql80/t2.ibd differ diff -Nru mariadb-10.11.6/mysql-test/suite/archive/archive.test mariadb-10.11.9/mysql-test/suite/archive/archive.test --- mariadb-10.11.6/mysql-test/suite/archive/archive.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/archive/archive.test 2024-08-03 07:29:57.000000000 +0000 @@ -1609,7 +1609,7 @@ INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; INSERT INTO t1 VALUES(1, 'sampleblob1'),(2, 'sampleblob2'); # Compression length depends on zip library ---replace_result 583 584 291 292 +--replace_result 583 584 585 584 291 292 SELECT DATA_LENGTH, AVG_ROW_LENGTH FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/archive/archive_bitfield.result mariadb-10.11.9/mysql-test/suite/archive/archive_bitfield.result --- mariadb-10.11.6/mysql-test/suite/archive/archive_bitfield.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/archive/archive_bitfield.result 2024-08-03 07:29:57.000000000 +0000 @@ -180,6 +180,7 @@ (NULL,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'100000',b'010010',b'011111',4,5,5,5,5,5,5,5,5,5,3,2,1), (NULL,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'000000',b'001100',b'111111',4,5,5,5,5,5,5,5,5,5,3,2,1), (NULL,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,b'111111',b'000000',b'000000',4,5,5,5,5,5,5,5,5,5,3,2,1); +/*M!999999\- enable the sandbox mode */ INSERT INTO `t1` VALUES (1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x01,0x3F,0x3E,4,5,5,5,5,5,5,5,5,5,3,2,1); INSERT INTO `t1` VALUES (2,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x02,0x00,0x3D,4,5,5,5,5,5,5,5,5,5,3,2,1); INSERT INTO `t1` VALUES (3,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x04,0x0F,0x3B,4,5,5,5,5,5,5,5,5,5,3,2,1); diff -Nru mariadb-10.11.6/mysql-test/suite/atomic/alter_table.test mariadb-10.11.9/mysql-test/suite/atomic/alter_table.test --- mariadb-10.11.6/mysql-test/suite/atomic/alter_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/atomic/alter_table.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,12 @@ --source include/have_debug.inc --source include/have_innodb.inc --source include/have_log_bin.inc ---source include/not_valgrind.inc + +if (!$BIG_TEST) +{ + --source include/not_valgrind.inc + --source include/not_msan.inc +} # # Testing of atomic create table with crashes in a lot of different places diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/include/binlog_index.inc mariadb-10.11.9/mysql-test/suite/binlog/include/binlog_index.inc --- mariadb-10.11.6/mysql-test/suite/binlog/include/binlog_index.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/include/binlog_index.inc 2024-08-03 07:29:57.000000000 +0000 @@ -98,7 +98,7 @@ --echo # crash_purge_before_update_index flush logs; ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET SESSION debug_dbug="+d,crash_purge_before_update_index"; --source include/wait_for_binlog_checkpoint.inc --error 2013 @@ -119,7 +119,7 @@ --echo # crash_purge_non_critical_after_update_index flush logs; ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET SESSION debug_dbug="+d,crash_purge_non_critical_after_update_index"; --source include/wait_for_binlog_checkpoint.inc --error 2013 @@ -143,7 +143,7 @@ --echo # crash_purge_critical_after_update_index flush logs; ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET SESSION debug_dbug="+d,crash_purge_critical_after_update_index"; --source include/wait_for_binlog_checkpoint.inc --error 2013 @@ -167,7 +167,7 @@ SELECT @index; --echo # crash_create_non_critical_before_update_index ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET SESSION debug_dbug="+d,crash_create_non_critical_before_update_index"; --error 2013 flush logs; @@ -185,7 +185,7 @@ SELECT @index; --echo # crash_create_critical_before_update_index ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET SESSION debug_dbug="+d,crash_create_critical_before_update_index"; --error 2013 flush logs; @@ -205,7 +205,7 @@ SELECT @index; --echo # crash_create_after_update_index ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET SESSION debug_dbug="+d,crash_create_after_update_index"; --error 2013 flush logs; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/include/print_optional_metadata.inc mariadb-10.11.9/mysql-test/suite/binlog/include/print_optional_metadata.inc --- mariadb-10.11.6/mysql-test/suite/binlog/include/print_optional_metadata.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/include/print_optional_metadata.inc 2024-08-03 07:29:57.000000000 +0000 @@ -16,10 +16,9 @@ --exec $MYSQL_BINLOG -F --print-table-metadata $_stop_position_opt $binlog_file > $output_file ---let SEARCH_PATTERN= # (?:Columns\(| {8}).* +--let SEARCH_PATTERN= (?m-s:# (?:Columns\(| {8}).*) --let SEARCH_FILE= $output_file --let SEARCH_OUTPUT=matches ---let SEARCH_TYPE="_gm_" --source include/search_pattern_in_file.inc if ($print_primary_key) diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_gis_user_var_stm.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_gis_user_var_stm.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_gis_user_var_stm.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_gis_user_var_stm.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,12 @@ +SET @g0= POINT(1,1); +SET @g1= Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))); +CREATE TABLE t1 AS SELECT @g0 AS g0, @g1 AS g1; +DROP TABLE t1; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # User var # # @`g0`=/*point*/_binary X'000000000101000000000000000000F03F000000000000F03F' COLLATE binary +master-bin.000001 # User var # # @`g1`=/*polygon*/_binary X'0000000001030000000100000004000000000000000000000000000000000000000000000000003E4000000000000000000000000000003E400000000000003E4000000000000000000000000000000000' COLLATE binary +master-bin.000001 # Query # # use `test`; CREATE TABLE t1 AS SELECT @g0 AS g0, @g1 AS g1 +master-bin.000001 # Gtid # # GTID #-#-# +master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server */ diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_raw_flush.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_raw_flush.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_raw_flush.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_raw_flush.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,3 +1,4 @@ +RESET MASTER; # # MDEV-30698 Cover missing test cases for mariadb-binlog options # --raw [and] --flashback diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result 2024-08-03 07:29:57.000000000 +0000 @@ -367,10 +367,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -387,7 +387,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -408,7 +408,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -429,7 +429,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 ddl -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -437,7 +437,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 ddl -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -445,7 +445,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -466,7 +466,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -487,7 +487,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -508,7 +508,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -529,7 +529,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-10 -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; # at # @@ -550,7 +550,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-11 -/*!100001 SET @@session.gtid_seq_no=11*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=11*//*!*/; START TRANSACTION /*!*/; # at # @@ -571,7 +571,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 -/*!100001 SET @@session.gtid_seq_no=12*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=12*//*!*/; START TRANSACTION /*!*/; # at # @@ -592,7 +592,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-13 -/*!100001 SET @@session.gtid_seq_no=13*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=13*//*!*/; START TRANSACTION /*!*/; # at # @@ -613,7 +613,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-14 -/*!100001 SET @@session.gtid_seq_no=14*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=14*//*!*/; START TRANSACTION /*!*/; # at # @@ -634,7 +634,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-15 -/*!100001 SET @@session.gtid_seq_no=15*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=15*//*!*/; START TRANSACTION /*!*/; # at # @@ -657,7 +657,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-16 ddl -/*!100001 SET @@session.gtid_seq_no=16*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=16*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -665,7 +665,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-17 ddl -/*!100001 SET @@session.gtid_seq_no=17*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=17*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -673,7 +673,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-18 -/*!100001 SET @@session.gtid_seq_no=18*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=18*//*!*/; START TRANSACTION /*!*/; # at # @@ -695,7 +695,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-19 ddl -/*!100001 SET @@session.gtid_seq_no=19*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=19*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -703,7 +703,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-20 ddl -/*!100001 SET @@session.gtid_seq_no=20*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=20*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -711,7 +711,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-21 -/*!100001 SET @@session.gtid_seq_no=21*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=21*//*!*/; START TRANSACTION /*!*/; # at # @@ -732,7 +732,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-22 -/*!100001 SET @@session.gtid_seq_no=22*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=22*//*!*/; START TRANSACTION /*!*/; # at # @@ -753,7 +753,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-23 -/*!100001 SET @@session.gtid_seq_no=23*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=23*//*!*/; START TRANSACTION /*!*/; # at # @@ -774,7 +774,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-24 -/*!100001 SET @@session.gtid_seq_no=24*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=24*//*!*/; START TRANSACTION /*!*/; # at # @@ -795,7 +795,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-25 ddl -/*!100001 SET @@session.gtid_seq_no=25*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=25*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -803,7 +803,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-26 ddl -/*!100001 SET @@session.gtid_seq_no=26*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=26*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -811,7 +811,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-27 -/*!100001 SET @@session.gtid_seq_no=27*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=27*//*!*/; START TRANSACTION /*!*/; # at # @@ -838,7 +838,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-28 -/*!100001 SET @@session.gtid_seq_no=28*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=28*//*!*/; START TRANSACTION /*!*/; # at # @@ -859,7 +859,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-29 -/*!100001 SET @@session.gtid_seq_no=29*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=29*//*!*/; START TRANSACTION /*!*/; # at # @@ -882,7 +882,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-30 -/*!100001 SET @@session.gtid_seq_no=30*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=30*//*!*/; START TRANSACTION /*!*/; # at # @@ -903,7 +903,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-31 ddl -/*!100001 SET @@session.gtid_seq_no=31*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=31*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -911,7 +911,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-32 ddl -/*!100001 SET @@session.gtid_seq_no=32*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=32*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -919,7 +919,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-33 -/*!100001 SET @@session.gtid_seq_no=33*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=33*//*!*/; START TRANSACTION /*!*/; # at # @@ -943,7 +943,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-34 -/*!100001 SET @@session.gtid_seq_no=34*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=34*//*!*/; START TRANSACTION /*!*/; # at # @@ -964,7 +964,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-35 ddl -/*!100001 SET @@session.gtid_seq_no=35*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=35*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -972,7 +972,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-36 ddl -/*!100001 SET @@session.gtid_seq_no=36*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=36*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -980,7 +980,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-37 -/*!100001 SET @@session.gtid_seq_no=37*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=37*//*!*/; START TRANSACTION /*!*/; # at # @@ -1001,7 +1001,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-38 -/*!100001 SET @@session.gtid_seq_no=38*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=38*//*!*/; START TRANSACTION /*!*/; # at # @@ -1022,7 +1022,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-39 ddl -/*!100001 SET @@session.gtid_seq_no=39*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=39*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1030,7 +1030,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-40 ddl -/*!100001 SET @@session.gtid_seq_no=40*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=40*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1038,7 +1038,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-41 -/*!100001 SET @@session.gtid_seq_no=41*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=41*//*!*/; START TRANSACTION /*!*/; # at # @@ -1059,7 +1059,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-42 -/*!100001 SET @@session.gtid_seq_no=42*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=42*//*!*/; START TRANSACTION /*!*/; # at # @@ -1080,7 +1080,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-43 ddl -/*!100001 SET @@session.gtid_seq_no=43*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=43*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1088,7 +1088,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-44 ddl -/*!100001 SET @@session.gtid_seq_no=44*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=44*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1096,7 +1096,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-45 -/*!100001 SET @@session.gtid_seq_no=45*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=45*//*!*/; START TRANSACTION /*!*/; # at # @@ -1120,7 +1120,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-46 -/*!100001 SET @@session.gtid_seq_no=46*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=46*//*!*/; START TRANSACTION /*!*/; # at # @@ -1143,7 +1143,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-47 -/*!100001 SET @@session.gtid_seq_no=47*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=47*//*!*/; START TRANSACTION /*!*/; # at # @@ -1164,7 +1164,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-48 ddl -/*!100001 SET @@session.gtid_seq_no=48*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=48*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1172,7 +1172,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-49 ddl -/*!100001 SET @@session.gtid_seq_no=49*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=49*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1180,7 +1180,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-50 -/*!100001 SET @@session.gtid_seq_no=50*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=50*//*!*/; START TRANSACTION /*!*/; # at # @@ -1201,7 +1201,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-51 -/*!100001 SET @@session.gtid_seq_no=51*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=51*//*!*/; START TRANSACTION /*!*/; # at # @@ -1222,7 +1222,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-52 ddl -/*!100001 SET @@session.gtid_seq_no=52*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=52*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1230,7 +1230,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-53 ddl -/*!100001 SET @@session.gtid_seq_no=53*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=53*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1238,7 +1238,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-54 -/*!100001 SET @@session.gtid_seq_no=54*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=54*//*!*/; START TRANSACTION /*!*/; # at # @@ -1262,7 +1262,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-55 -/*!100001 SET @@session.gtid_seq_no=55*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=55*//*!*/; START TRANSACTION /*!*/; # at # @@ -1285,7 +1285,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-56 -/*!100001 SET @@session.gtid_seq_no=56*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=56*//*!*/; START TRANSACTION /*!*/; # at # @@ -1306,7 +1306,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-57 ddl -/*!100001 SET @@session.gtid_seq_no=57*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=57*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1314,7 +1314,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-58 ddl -/*!100001 SET @@session.gtid_seq_no=58*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=58*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1322,7 +1322,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-59 -/*!100001 SET @@session.gtid_seq_no=59*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=59*//*!*/; START TRANSACTION /*!*/; # at # @@ -1343,7 +1343,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-60 -/*!100001 SET @@session.gtid_seq_no=60*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=60*//*!*/; START TRANSACTION /*!*/; # at # @@ -1364,7 +1364,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-61 ddl -/*!100001 SET @@session.gtid_seq_no=61*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=61*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1372,7 +1372,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-62 ddl -/*!100001 SET @@session.gtid_seq_no=62*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=62*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1380,7 +1380,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-63 -/*!100001 SET @@session.gtid_seq_no=63*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=63*//*!*/; START TRANSACTION /*!*/; # at # @@ -1404,7 +1404,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-64 -/*!100001 SET @@session.gtid_seq_no=64*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=64*//*!*/; START TRANSACTION /*!*/; # at # @@ -1427,7 +1427,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-65 -/*!100001 SET @@session.gtid_seq_no=65*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=65*//*!*/; START TRANSACTION /*!*/; # at # @@ -1448,7 +1448,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-66 ddl -/*!100001 SET @@session.gtid_seq_no=66*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=66*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1456,7 +1456,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-67 ddl -/*!100001 SET @@session.gtid_seq_no=67*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=67*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1464,7 +1464,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-68 -/*!100001 SET @@session.gtid_seq_no=68*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=68*//*!*/; START TRANSACTION /*!*/; # at # @@ -1485,7 +1485,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-69 -/*!100001 SET @@session.gtid_seq_no=69*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=69*//*!*/; START TRANSACTION /*!*/; # at # @@ -1506,7 +1506,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-70 ddl -/*!100001 SET @@session.gtid_seq_no=70*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=70*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1514,7 +1514,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-71 ddl -/*!100001 SET @@session.gtid_seq_no=71*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=71*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1522,7 +1522,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-72 -/*!100001 SET @@session.gtid_seq_no=72*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=72*//*!*/; START TRANSACTION /*!*/; # at # @@ -1546,7 +1546,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-73 -/*!100001 SET @@session.gtid_seq_no=73*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=73*//*!*/; START TRANSACTION /*!*/; # at # @@ -1569,7 +1569,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-74 -/*!100001 SET @@session.gtid_seq_no=74*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=74*//*!*/; START TRANSACTION /*!*/; # at # @@ -1590,7 +1590,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-75 ddl -/*!100001 SET @@session.gtid_seq_no=75*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=75*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1598,7 +1598,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-76 ddl -/*!100001 SET @@session.gtid_seq_no=76*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=76*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1606,7 +1606,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-77 -/*!100001 SET @@session.gtid_seq_no=77*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=77*//*!*/; START TRANSACTION /*!*/; # at # @@ -1627,7 +1627,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-78 -/*!100001 SET @@session.gtid_seq_no=78*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=78*//*!*/; START TRANSACTION /*!*/; # at # @@ -1648,7 +1648,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-79 ddl -/*!100001 SET @@session.gtid_seq_no=79*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=79*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1656,7 +1656,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-80 ddl -/*!100001 SET @@session.gtid_seq_no=80*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=80*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1664,7 +1664,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-81 -/*!100001 SET @@session.gtid_seq_no=81*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=81*//*!*/; START TRANSACTION /*!*/; # at # @@ -1685,7 +1685,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-82 -/*!100001 SET @@session.gtid_seq_no=82*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=82*//*!*/; START TRANSACTION /*!*/; # at # @@ -1706,7 +1706,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-83 ddl -/*!100001 SET @@session.gtid_seq_no=83*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=83*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1714,7 +1714,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-84 ddl -/*!100001 SET @@session.gtid_seq_no=84*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=84*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1722,7 +1722,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-85 -/*!100001 SET @@session.gtid_seq_no=85*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=85*//*!*/; START TRANSACTION /*!*/; # at # @@ -1743,7 +1743,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-86 -/*!100001 SET @@session.gtid_seq_no=86*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=86*//*!*/; START TRANSACTION /*!*/; # at # @@ -1764,7 +1764,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-87 -/*!100001 SET @@session.gtid_seq_no=87*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=87*//*!*/; START TRANSACTION /*!*/; # at # @@ -1785,7 +1785,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-88 ddl -/*!100001 SET @@session.gtid_seq_no=88*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=88*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1793,7 +1793,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-89 ddl -/*!100001 SET @@session.gtid_seq_no=89*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=89*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1801,7 +1801,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-90 -/*!100001 SET @@session.gtid_seq_no=90*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=90*//*!*/; START TRANSACTION /*!*/; # at # @@ -1822,7 +1822,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-91 -/*!100001 SET @@session.gtid_seq_no=91*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=91*//*!*/; START TRANSACTION /*!*/; # at # @@ -1843,7 +1843,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-92 ddl -/*!100001 SET @@session.gtid_seq_no=92*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=92*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1851,7 +1851,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-93 ddl -/*!100001 SET @@session.gtid_seq_no=93*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=93*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1859,7 +1859,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-94 -/*!100001 SET @@session.gtid_seq_no=94*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=94*//*!*/; START TRANSACTION /*!*/; # at # @@ -1880,7 +1880,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-95 -/*!100001 SET @@session.gtid_seq_no=95*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=95*//*!*/; START TRANSACTION /*!*/; # at # @@ -1901,7 +1901,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-96 ddl -/*!100001 SET @@session.gtid_seq_no=96*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=96*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1909,7 +1909,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-97 ddl -/*!100001 SET @@session.gtid_seq_no=97*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=97*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1917,7 +1917,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-98 -/*!100001 SET @@session.gtid_seq_no=98*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=98*//*!*/; START TRANSACTION /*!*/; # at # @@ -1939,7 +1939,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-99 -/*!100001 SET @@session.gtid_seq_no=99*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=99*//*!*/; START TRANSACTION /*!*/; # at # @@ -1960,7 +1960,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-100 ddl -/*!100001 SET @@session.gtid_seq_no=100*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=100*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1968,7 +1968,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-101 ddl -/*!100001 SET @@session.gtid_seq_no=101*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=101*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1976,7 +1976,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-102 -/*!100001 SET @@session.gtid_seq_no=102*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=102*//*!*/; START TRANSACTION /*!*/; # at # @@ -1997,7 +1997,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-103 -/*!100001 SET @@session.gtid_seq_no=103*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=103*//*!*/; START TRANSACTION /*!*/; # at # @@ -2018,7 +2018,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-104 ddl -/*!100001 SET @@session.gtid_seq_no=104*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=104*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2026,7 +2026,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-105 ddl -/*!100001 SET @@session.gtid_seq_no=105*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=105*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2034,7 +2034,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-106 -/*!100001 SET @@session.gtid_seq_no=106*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=106*//*!*/; START TRANSACTION /*!*/; # at # @@ -2055,7 +2055,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-107 -/*!100001 SET @@session.gtid_seq_no=107*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=107*//*!*/; START TRANSACTION /*!*/; # at # @@ -2076,7 +2076,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-108 ddl -/*!100001 SET @@session.gtid_seq_no=108*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=108*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2084,7 +2084,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-109 ddl -/*!100001 SET @@session.gtid_seq_no=109*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=109*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2092,7 +2092,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-110 -/*!100001 SET @@session.gtid_seq_no=110*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=110*//*!*/; START TRANSACTION /*!*/; # at # @@ -2113,7 +2113,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-111 -/*!100001 SET @@session.gtid_seq_no=111*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=111*//*!*/; START TRANSACTION /*!*/; # at # @@ -2134,7 +2134,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-112 ddl -/*!100001 SET @@session.gtid_seq_no=112*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=112*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2142,7 +2142,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-113 ddl -/*!100001 SET @@session.gtid_seq_no=113*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=113*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2150,7 +2150,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-114 -/*!100001 SET @@session.gtid_seq_no=114*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=114*//*!*/; START TRANSACTION /*!*/; # at # @@ -2171,7 +2171,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-115 -/*!100001 SET @@session.gtid_seq_no=115*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=115*//*!*/; START TRANSACTION /*!*/; # at # @@ -2192,7 +2192,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-116 ddl -/*!100001 SET @@session.gtid_seq_no=116*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=116*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2200,7 +2200,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-117 ddl -/*!100001 SET @@session.gtid_seq_no=117*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=117*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2208,7 +2208,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-118 -/*!100001 SET @@session.gtid_seq_no=118*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=118*//*!*/; START TRANSACTION /*!*/; # at # @@ -2229,7 +2229,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-119 -/*!100001 SET @@session.gtid_seq_no=119*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=119*//*!*/; START TRANSACTION /*!*/; # at # @@ -2250,7 +2250,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-120 ddl -/*!100001 SET @@session.gtid_seq_no=120*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=120*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2258,7 +2258,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-121 ddl -/*!100001 SET @@session.gtid_seq_no=121*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=121*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2266,7 +2266,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-122 -/*!100001 SET @@session.gtid_seq_no=122*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=122*//*!*/; START TRANSACTION /*!*/; # at # @@ -2287,7 +2287,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-123 -/*!100001 SET @@session.gtid_seq_no=123*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=123*//*!*/; START TRANSACTION /*!*/; # at # @@ -2308,7 +2308,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-124 ddl -/*!100001 SET @@session.gtid_seq_no=124*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=124*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2316,7 +2316,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-125 ddl -/*!100001 SET @@session.gtid_seq_no=125*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=125*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2324,7 +2324,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-126 -/*!100001 SET @@session.gtid_seq_no=126*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=126*//*!*/; START TRANSACTION /*!*/; # at # @@ -2345,7 +2345,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-127 -/*!100001 SET @@session.gtid_seq_no=127*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=127*//*!*/; START TRANSACTION /*!*/; # at # @@ -2366,7 +2366,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-128 ddl -/*!100001 SET @@session.gtid_seq_no=128*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=128*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2374,7 +2374,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-129 ddl -/*!100001 SET @@session.gtid_seq_no=129*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=129*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2382,7 +2382,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-130 -/*!100001 SET @@session.gtid_seq_no=130*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=130*//*!*/; START TRANSACTION /*!*/; # at # @@ -2403,7 +2403,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-131 -/*!100001 SET @@session.gtid_seq_no=131*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=131*//*!*/; START TRANSACTION /*!*/; # at # @@ -2424,7 +2424,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-132 ddl -/*!100001 SET @@session.gtid_seq_no=132*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=132*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2432,7 +2432,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-133 ddl -/*!100001 SET @@session.gtid_seq_no=133*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=133*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2440,7 +2440,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-134 -/*!100001 SET @@session.gtid_seq_no=134*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=134*//*!*/; START TRANSACTION /*!*/; # at # @@ -2461,7 +2461,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-135 -/*!100001 SET @@session.gtid_seq_no=135*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=135*//*!*/; START TRANSACTION /*!*/; # at # @@ -2482,7 +2482,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-136 ddl -/*!100001 SET @@session.gtid_seq_no=136*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=136*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2490,7 +2490,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-137 ddl -/*!100001 SET @@session.gtid_seq_no=137*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=137*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2498,7 +2498,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-138 -/*!100001 SET @@session.gtid_seq_no=138*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=138*//*!*/; START TRANSACTION /*!*/; # at # @@ -2519,7 +2519,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-139 -/*!100001 SET @@session.gtid_seq_no=139*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=139*//*!*/; START TRANSACTION /*!*/; # at # @@ -2540,7 +2540,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-140 -/*!100001 SET @@session.gtid_seq_no=140*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=140*//*!*/; START TRANSACTION /*!*/; # at # @@ -2564,7 +2564,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-141 ddl -/*!100001 SET @@session.gtid_seq_no=141*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=141*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2572,7 +2572,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-142 ddl -/*!100001 SET @@session.gtid_seq_no=142*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=142*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2580,7 +2580,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-143 -/*!100001 SET @@session.gtid_seq_no=143*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=143*//*!*/; START TRANSACTION /*!*/; # at # @@ -2601,7 +2601,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-144 -/*!100001 SET @@session.gtid_seq_no=144*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=144*//*!*/; START TRANSACTION /*!*/; # at # @@ -2622,7 +2622,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-145 ddl -/*!100001 SET @@session.gtid_seq_no=145*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=145*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2630,7 +2630,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-146 ddl -/*!100001 SET @@session.gtid_seq_no=146*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=146*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2638,7 +2638,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-147 -/*!100001 SET @@session.gtid_seq_no=147*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=147*//*!*/; START TRANSACTION /*!*/; # at # @@ -2659,7 +2659,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-148 -/*!100001 SET @@session.gtid_seq_no=148*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=148*//*!*/; START TRANSACTION /*!*/; # at # @@ -2680,7 +2680,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-149 ddl -/*!100001 SET @@session.gtid_seq_no=149*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=149*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2688,7 +2688,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-150 ddl -/*!100001 SET @@session.gtid_seq_no=150*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=150*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2696,7 +2696,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-151 -/*!100001 SET @@session.gtid_seq_no=151*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=151*//*!*/; START TRANSACTION /*!*/; # at # @@ -2717,7 +2717,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-152 -/*!100001 SET @@session.gtid_seq_no=152*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=152*//*!*/; START TRANSACTION /*!*/; # at # @@ -2738,7 +2738,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-153 ddl -/*!100001 SET @@session.gtid_seq_no=153*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=153*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2746,7 +2746,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-154 ddl -/*!100001 SET @@session.gtid_seq_no=154*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=154*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2754,7 +2754,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-155 -/*!100001 SET @@session.gtid_seq_no=155*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=155*//*!*/; START TRANSACTION /*!*/; # at # @@ -2775,7 +2775,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-156 -/*!100001 SET @@session.gtid_seq_no=156*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=156*//*!*/; START TRANSACTION /*!*/; # at # @@ -2796,7 +2796,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-157 -/*!100001 SET @@session.gtid_seq_no=157*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=157*//*!*/; START TRANSACTION /*!*/; # at # @@ -2820,7 +2820,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-158 ddl -/*!100001 SET @@session.gtid_seq_no=158*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=158*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2828,7 +2828,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-159 ddl -/*!100001 SET @@session.gtid_seq_no=159*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=159*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2836,7 +2836,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-160 -/*!100001 SET @@session.gtid_seq_no=160*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=160*//*!*/; START TRANSACTION /*!*/; # at # @@ -2857,7 +2857,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-161 -/*!100001 SET @@session.gtid_seq_no=161*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=161*//*!*/; START TRANSACTION /*!*/; # at # @@ -2878,7 +2878,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-162 ddl -/*!100001 SET @@session.gtid_seq_no=162*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=162*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2886,7 +2886,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-163 ddl -/*!100001 SET @@session.gtid_seq_no=163*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=163*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2894,7 +2894,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-164 -/*!100001 SET @@session.gtid_seq_no=164*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=164*//*!*/; START TRANSACTION /*!*/; # at # @@ -2915,7 +2915,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-165 -/*!100001 SET @@session.gtid_seq_no=165*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=165*//*!*/; START TRANSACTION /*!*/; # at # @@ -2936,7 +2936,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-166 ddl -/*!100001 SET @@session.gtid_seq_no=166*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=166*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2944,7 +2944,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-167 ddl -/*!100001 SET @@session.gtid_seq_no=167*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=167*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -2952,7 +2952,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-168 -/*!100001 SET @@session.gtid_seq_no=168*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=168*//*!*/; START TRANSACTION /*!*/; # at # @@ -2973,7 +2973,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-169 -/*!100001 SET @@session.gtid_seq_no=169*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=169*//*!*/; START TRANSACTION /*!*/; # at # @@ -2994,7 +2994,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-170 ddl -/*!100001 SET @@session.gtid_seq_no=170*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=170*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3002,7 +3002,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-171 ddl -/*!100001 SET @@session.gtid_seq_no=171*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=171*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3010,7 +3010,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-172 -/*!100001 SET @@session.gtid_seq_no=172*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=172*//*!*/; START TRANSACTION /*!*/; # at # @@ -3031,7 +3031,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-173 -/*!100001 SET @@session.gtid_seq_no=173*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=173*//*!*/; START TRANSACTION /*!*/; # at # @@ -3052,7 +3052,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-174 ddl -/*!100001 SET @@session.gtid_seq_no=174*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=174*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3060,7 +3060,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-175 ddl -/*!100001 SET @@session.gtid_seq_no=175*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=175*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3068,7 +3068,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-176 -/*!100001 SET @@session.gtid_seq_no=176*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=176*//*!*/; START TRANSACTION /*!*/; # at # @@ -3089,7 +3089,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-177 -/*!100001 SET @@session.gtid_seq_no=177*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=177*//*!*/; START TRANSACTION /*!*/; # at # @@ -3110,7 +3110,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-178 ddl -/*!100001 SET @@session.gtid_seq_no=178*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=178*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3118,7 +3118,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-179 ddl -/*!100001 SET @@session.gtid_seq_no=179*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=179*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3126,7 +3126,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-180 -/*!100001 SET @@session.gtid_seq_no=180*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=180*//*!*/; START TRANSACTION /*!*/; # at # @@ -3147,7 +3147,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-181 -/*!100001 SET @@session.gtid_seq_no=181*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=181*//*!*/; START TRANSACTION /*!*/; # at # @@ -3168,7 +3168,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-182 ddl -/*!100001 SET @@session.gtid_seq_no=182*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=182*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3176,7 +3176,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-183 ddl -/*!100001 SET @@session.gtid_seq_no=183*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=183*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3184,7 +3184,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-184 -/*!100001 SET @@session.gtid_seq_no=184*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=184*//*!*/; START TRANSACTION /*!*/; # at # @@ -3205,7 +3205,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-185 -/*!100001 SET @@session.gtid_seq_no=185*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=185*//*!*/; START TRANSACTION /*!*/; # at # @@ -3226,7 +3226,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-186 -/*!100001 SET @@session.gtid_seq_no=186*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=186*//*!*/; START TRANSACTION /*!*/; # at # @@ -3250,7 +3250,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-187 ddl -/*!100001 SET @@session.gtid_seq_no=187*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=187*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3258,7 +3258,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-188 ddl -/*!100001 SET @@session.gtid_seq_no=188*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=188*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3266,7 +3266,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-189 -/*!100001 SET @@session.gtid_seq_no=189*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=189*//*!*/; START TRANSACTION /*!*/; # at # @@ -3287,7 +3287,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-190 -/*!100001 SET @@session.gtid_seq_no=190*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=190*//*!*/; START TRANSACTION /*!*/; # at # @@ -3308,7 +3308,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-191 -/*!100001 SET @@session.gtid_seq_no=191*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=191*//*!*/; START TRANSACTION /*!*/; # at # @@ -3332,7 +3332,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-192 ddl -/*!100001 SET @@session.gtid_seq_no=192*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=192*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3340,7 +3340,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-193 ddl -/*!100001 SET @@session.gtid_seq_no=193*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=193*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3348,7 +3348,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-194 -/*!100001 SET @@session.gtid_seq_no=194*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=194*//*!*/; START TRANSACTION /*!*/; # at # @@ -3369,7 +3369,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-195 -/*!100001 SET @@session.gtid_seq_no=195*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=195*//*!*/; START TRANSACTION /*!*/; # at # @@ -3390,7 +3390,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-196 ddl -/*!100001 SET @@session.gtid_seq_no=196*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=196*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3398,7 +3398,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-197 ddl -/*!100001 SET @@session.gtid_seq_no=197*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=197*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3406,7 +3406,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-198 -/*!100001 SET @@session.gtid_seq_no=198*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=198*//*!*/; START TRANSACTION /*!*/; # at # @@ -3427,7 +3427,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-199 -/*!100001 SET @@session.gtid_seq_no=199*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=199*//*!*/; START TRANSACTION /*!*/; # at # @@ -3448,7 +3448,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-200 ddl -/*!100001 SET @@session.gtid_seq_no=200*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=200*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3456,7 +3456,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-201 ddl -/*!100001 SET @@session.gtid_seq_no=201*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=201*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3464,7 +3464,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-202 -/*!100001 SET @@session.gtid_seq_no=202*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=202*//*!*/; START TRANSACTION /*!*/; # at # @@ -3485,7 +3485,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-203 -/*!100001 SET @@session.gtid_seq_no=203*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=203*//*!*/; START TRANSACTION /*!*/; # at # @@ -3506,7 +3506,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-204 ddl -/*!100001 SET @@session.gtid_seq_no=204*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=204*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3514,7 +3514,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-205 ddl -/*!100001 SET @@session.gtid_seq_no=205*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=205*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3522,7 +3522,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-206 -/*!100001 SET @@session.gtid_seq_no=206*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=206*//*!*/; START TRANSACTION /*!*/; # at # @@ -3543,7 +3543,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-207 -/*!100001 SET @@session.gtid_seq_no=207*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=207*//*!*/; START TRANSACTION /*!*/; # at # @@ -3564,7 +3564,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-208 ddl -/*!100001 SET @@session.gtid_seq_no=208*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=208*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3572,7 +3572,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-209 ddl -/*!100001 SET @@session.gtid_seq_no=209*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=209*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3580,7 +3580,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-210 -/*!100001 SET @@session.gtid_seq_no=210*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=210*//*!*/; START TRANSACTION /*!*/; # at # @@ -3601,7 +3601,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-211 -/*!100001 SET @@session.gtid_seq_no=211*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=211*//*!*/; START TRANSACTION /*!*/; # at # @@ -3622,7 +3622,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-212 -/*!100001 SET @@session.gtid_seq_no=212*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=212*//*!*/; START TRANSACTION /*!*/; # at # @@ -3643,7 +3643,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-213 -/*!100001 SET @@session.gtid_seq_no=213*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=213*//*!*/; START TRANSACTION /*!*/; # at # @@ -3664,7 +3664,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-214 ddl -/*!100001 SET @@session.gtid_seq_no=214*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=214*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3672,7 +3672,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-215 ddl -/*!100001 SET @@session.gtid_seq_no=215*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=215*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3680,7 +3680,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-216 -/*!100001 SET @@session.gtid_seq_no=216*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=216*//*!*/; START TRANSACTION /*!*/; # at # @@ -3701,7 +3701,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-217 -/*!100001 SET @@session.gtid_seq_no=217*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=217*//*!*/; START TRANSACTION /*!*/; # at # @@ -3722,7 +3722,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-218 ddl -/*!100001 SET @@session.gtid_seq_no=218*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=218*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3730,7 +3730,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-219 ddl -/*!100001 SET @@session.gtid_seq_no=219*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=219*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3738,7 +3738,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-220 -/*!100001 SET @@session.gtid_seq_no=220*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=220*//*!*/; START TRANSACTION /*!*/; # at # @@ -3759,7 +3759,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-221 -/*!100001 SET @@session.gtid_seq_no=221*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=221*//*!*/; START TRANSACTION /*!*/; # at # @@ -3780,7 +3780,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-222 -/*!100001 SET @@session.gtid_seq_no=222*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=222*//*!*/; START TRANSACTION /*!*/; # at # @@ -3801,7 +3801,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-223 -/*!100001 SET @@session.gtid_seq_no=223*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=223*//*!*/; START TRANSACTION /*!*/; # at # @@ -3822,7 +3822,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-224 ddl -/*!100001 SET @@session.gtid_seq_no=224*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=224*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3830,7 +3830,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-225 ddl -/*!100001 SET @@session.gtid_seq_no=225*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=225*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3838,7 +3838,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-226 -/*!100001 SET @@session.gtid_seq_no=226*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=226*//*!*/; START TRANSACTION /*!*/; # at # @@ -3859,7 +3859,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-227 -/*!100001 SET @@session.gtid_seq_no=227*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=227*//*!*/; START TRANSACTION /*!*/; # at # @@ -3880,7 +3880,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-228 -/*!100001 SET @@session.gtid_seq_no=228*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=228*//*!*/; START TRANSACTION /*!*/; # at # @@ -3901,7 +3901,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-229 -/*!100001 SET @@session.gtid_seq_no=229*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=229*//*!*/; START TRANSACTION /*!*/; # at # @@ -3922,7 +3922,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-230 ddl -/*!100001 SET @@session.gtid_seq_no=230*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=230*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3930,7 +3930,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-231 ddl -/*!100001 SET @@session.gtid_seq_no=231*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=231*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3938,7 +3938,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-232 -/*!100001 SET @@session.gtid_seq_no=232*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=232*//*!*/; START TRANSACTION /*!*/; # at # @@ -3959,7 +3959,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-233 -/*!100001 SET @@session.gtid_seq_no=233*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=233*//*!*/; START TRANSACTION /*!*/; # at # @@ -3980,7 +3980,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-234 ddl -/*!100001 SET @@session.gtid_seq_no=234*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=234*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3988,7 +3988,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-235 ddl -/*!100001 SET @@session.gtid_seq_no=235*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=235*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -3996,7 +3996,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-236 -/*!100001 SET @@session.gtid_seq_no=236*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=236*//*!*/; START TRANSACTION /*!*/; # at # @@ -4017,7 +4017,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-237 -/*!100001 SET @@session.gtid_seq_no=237*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=237*//*!*/; START TRANSACTION /*!*/; # at # @@ -4038,7 +4038,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-238 -/*!100001 SET @@session.gtid_seq_no=238*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=238*//*!*/; START TRANSACTION /*!*/; # at # @@ -4059,7 +4059,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-239 -/*!100001 SET @@session.gtid_seq_no=239*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=239*//*!*/; START TRANSACTION /*!*/; # at # @@ -4080,7 +4080,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-240 ddl -/*!100001 SET @@session.gtid_seq_no=240*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=240*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4088,7 +4088,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-241 ddl -/*!100001 SET @@session.gtid_seq_no=241*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=241*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4096,7 +4096,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-242 -/*!100001 SET @@session.gtid_seq_no=242*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=242*//*!*/; START TRANSACTION /*!*/; # at # @@ -4117,7 +4117,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-243 -/*!100001 SET @@session.gtid_seq_no=243*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=243*//*!*/; START TRANSACTION /*!*/; # at # @@ -4138,7 +4138,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-244 -/*!100001 SET @@session.gtid_seq_no=244*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=244*//*!*/; START TRANSACTION /*!*/; # at # @@ -4159,7 +4159,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-245 -/*!100001 SET @@session.gtid_seq_no=245*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=245*//*!*/; START TRANSACTION /*!*/; # at # @@ -4180,7 +4180,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-246 ddl -/*!100001 SET @@session.gtid_seq_no=246*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=246*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4188,7 +4188,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-247 ddl -/*!100001 SET @@session.gtid_seq_no=247*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=247*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4196,7 +4196,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-248 -/*!100001 SET @@session.gtid_seq_no=248*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=248*//*!*/; START TRANSACTION /*!*/; # at # @@ -4217,7 +4217,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-249 -/*!100001 SET @@session.gtid_seq_no=249*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=249*//*!*/; START TRANSACTION /*!*/; # at # @@ -4238,7 +4238,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-250 ddl -/*!100001 SET @@session.gtid_seq_no=250*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=250*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4246,7 +4246,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-251 ddl -/*!100001 SET @@session.gtid_seq_no=251*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=251*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4254,7 +4254,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-252 -/*!100001 SET @@session.gtid_seq_no=252*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=252*//*!*/; START TRANSACTION /*!*/; # at # @@ -4275,7 +4275,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-253 -/*!100001 SET @@session.gtid_seq_no=253*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=253*//*!*/; START TRANSACTION /*!*/; # at # @@ -4296,7 +4296,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-254 ddl -/*!100001 SET @@session.gtid_seq_no=254*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=254*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4304,7 +4304,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-255 ddl -/*!100001 SET @@session.gtid_seq_no=255*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=255*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4312,7 +4312,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-256 -/*!100001 SET @@session.gtid_seq_no=256*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=256*//*!*/; START TRANSACTION /*!*/; # at # @@ -4333,7 +4333,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-257 -/*!100001 SET @@session.gtid_seq_no=257*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=257*//*!*/; START TRANSACTION /*!*/; # at # @@ -4354,7 +4354,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-258 ddl -/*!100001 SET @@session.gtid_seq_no=258*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=258*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4362,7 +4362,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-259 ddl -/*!100001 SET @@session.gtid_seq_no=259*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=259*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4370,7 +4370,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-260 -/*!100001 SET @@session.gtid_seq_no=260*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=260*//*!*/; START TRANSACTION /*!*/; # at # @@ -4391,7 +4391,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-261 -/*!100001 SET @@session.gtid_seq_no=261*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=261*//*!*/; START TRANSACTION /*!*/; # at # @@ -4412,7 +4412,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-262 ddl -/*!100001 SET @@session.gtid_seq_no=262*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=262*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4420,7 +4420,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-263 ddl -/*!100001 SET @@session.gtid_seq_no=263*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=263*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4428,7 +4428,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-264 -/*!100001 SET @@session.gtid_seq_no=264*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=264*//*!*/; START TRANSACTION /*!*/; # at # @@ -4449,7 +4449,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-265 -/*!100001 SET @@session.gtid_seq_no=265*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=265*//*!*/; START TRANSACTION /*!*/; # at # @@ -4470,7 +4470,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-266 ddl -/*!100001 SET @@session.gtid_seq_no=266*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=266*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4478,7 +4478,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-267 ddl -/*!100001 SET @@session.gtid_seq_no=267*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=267*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4486,7 +4486,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-268 -/*!100001 SET @@session.gtid_seq_no=268*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=268*//*!*/; START TRANSACTION /*!*/; # at # @@ -4507,7 +4507,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-269 -/*!100001 SET @@session.gtid_seq_no=269*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=269*//*!*/; START TRANSACTION /*!*/; # at # @@ -4528,7 +4528,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-270 ddl -/*!100001 SET @@session.gtid_seq_no=270*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=270*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4536,7 +4536,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-271 ddl -/*!100001 SET @@session.gtid_seq_no=271*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=271*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4544,7 +4544,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-272 -/*!100001 SET @@session.gtid_seq_no=272*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=272*//*!*/; START TRANSACTION /*!*/; # at # @@ -4565,7 +4565,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-273 -/*!100001 SET @@session.gtid_seq_no=273*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=273*//*!*/; START TRANSACTION /*!*/; # at # @@ -4586,7 +4586,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-274 ddl -/*!100001 SET @@session.gtid_seq_no=274*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=274*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4594,7 +4594,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-275 ddl -/*!100001 SET @@session.gtid_seq_no=275*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=275*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4602,7 +4602,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-276 -/*!100001 SET @@session.gtid_seq_no=276*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=276*//*!*/; START TRANSACTION /*!*/; # at # @@ -4623,7 +4623,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-277 -/*!100001 SET @@session.gtid_seq_no=277*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=277*//*!*/; START TRANSACTION /*!*/; # at # @@ -4644,7 +4644,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-278 ddl -/*!100001 SET @@session.gtid_seq_no=278*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=278*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4652,7 +4652,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-279 ddl -/*!100001 SET @@session.gtid_seq_no=279*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=279*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4660,7 +4660,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-280 -/*!100001 SET @@session.gtid_seq_no=280*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=280*//*!*/; START TRANSACTION /*!*/; # at # @@ -4681,7 +4681,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-281 -/*!100001 SET @@session.gtid_seq_no=281*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=281*//*!*/; START TRANSACTION /*!*/; # at # @@ -4702,7 +4702,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-282 ddl -/*!100001 SET @@session.gtid_seq_no=282*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=282*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4710,7 +4710,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-283 ddl -/*!100001 SET @@session.gtid_seq_no=283*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=283*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4718,7 +4718,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-284 -/*!100001 SET @@session.gtid_seq_no=284*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=284*//*!*/; START TRANSACTION /*!*/; # at # @@ -4739,7 +4739,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-285 -/*!100001 SET @@session.gtid_seq_no=285*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=285*//*!*/; START TRANSACTION /*!*/; # at # @@ -4760,7 +4760,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-286 ddl -/*!100001 SET @@session.gtid_seq_no=286*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=286*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4768,7 +4768,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-287 ddl -/*!100001 SET @@session.gtid_seq_no=287*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=287*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4776,7 +4776,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-288 -/*!100001 SET @@session.gtid_seq_no=288*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=288*//*!*/; START TRANSACTION /*!*/; # at # @@ -4797,7 +4797,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-289 -/*!100001 SET @@session.gtid_seq_no=289*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=289*//*!*/; START TRANSACTION /*!*/; # at # @@ -4818,7 +4818,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-290 ddl -/*!100001 SET @@session.gtid_seq_no=290*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=290*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4826,7 +4826,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-291 ddl -/*!100001 SET @@session.gtid_seq_no=291*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=291*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4834,7 +4834,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-292 -/*!100001 SET @@session.gtid_seq_no=292*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=292*//*!*/; START TRANSACTION /*!*/; # at # @@ -4855,7 +4855,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-293 -/*!100001 SET @@session.gtid_seq_no=293*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=293*//*!*/; START TRANSACTION /*!*/; # at # @@ -4876,7 +4876,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-294 ddl -/*!100001 SET @@session.gtid_seq_no=294*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=294*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4884,7 +4884,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-295 ddl -/*!100001 SET @@session.gtid_seq_no=295*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=295*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4892,7 +4892,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-296 -/*!100001 SET @@session.gtid_seq_no=296*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=296*//*!*/; START TRANSACTION /*!*/; # at # @@ -4913,7 +4913,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-297 -/*!100001 SET @@session.gtid_seq_no=297*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=297*//*!*/; START TRANSACTION /*!*/; # at # @@ -4934,7 +4934,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-298 ddl -/*!100001 SET @@session.gtid_seq_no=298*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=298*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4942,7 +4942,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-299 ddl -/*!100001 SET @@session.gtid_seq_no=299*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=299*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -4950,7 +4950,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-300 -/*!100001 SET @@session.gtid_seq_no=300*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=300*//*!*/; START TRANSACTION /*!*/; # at # @@ -4971,7 +4971,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-301 -/*!100001 SET @@session.gtid_seq_no=301*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=301*//*!*/; START TRANSACTION /*!*/; # at # @@ -4992,7 +4992,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-302 -/*!100001 SET @@session.gtid_seq_no=302*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=302*//*!*/; START TRANSACTION /*!*/; # at # @@ -5013,7 +5013,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-303 -/*!100001 SET @@session.gtid_seq_no=303*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=303*//*!*/; START TRANSACTION /*!*/; # at # @@ -5034,7 +5034,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-304 -/*!100001 SET @@session.gtid_seq_no=304*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=304*//*!*/; START TRANSACTION /*!*/; # at # @@ -5055,7 +5055,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-305 -/*!100001 SET @@session.gtid_seq_no=305*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=305*//*!*/; START TRANSACTION /*!*/; # at # @@ -5076,7 +5076,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-306 -/*!100001 SET @@session.gtid_seq_no=306*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=306*//*!*/; START TRANSACTION /*!*/; # at # @@ -5097,7 +5097,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-307 -/*!100001 SET @@session.gtid_seq_no=307*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=307*//*!*/; START TRANSACTION /*!*/; # at # @@ -5118,7 +5118,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-308 ddl -/*!100001 SET @@session.gtid_seq_no=308*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=308*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5126,7 +5126,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-309 ddl -/*!100001 SET @@session.gtid_seq_no=309*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=309*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5134,7 +5134,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-310 ddl -/*!100001 SET @@session.gtid_seq_no=310*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=310*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5142,7 +5142,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-311 -/*!100001 SET @@session.gtid_seq_no=311*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=311*//*!*/; START TRANSACTION /*!*/; # at # @@ -5164,7 +5164,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-312 -/*!100001 SET @@session.gtid_seq_no=312*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=312*//*!*/; START TRANSACTION /*!*/; # at # @@ -5186,7 +5186,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-313 -/*!100001 SET @@session.gtid_seq_no=313*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=313*//*!*/; START TRANSACTION /*!*/; # at # @@ -5208,7 +5208,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-314 -/*!100001 SET @@session.gtid_seq_no=314*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=314*//*!*/; START TRANSACTION /*!*/; # at # @@ -5230,7 +5230,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-315 -/*!100001 SET @@session.gtid_seq_no=315*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=315*//*!*/; START TRANSACTION /*!*/; # at # @@ -5280,7 +5280,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-316 ddl -/*!100001 SET @@session.gtid_seq_no=316*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=316*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5288,7 +5288,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-317 ddl -/*!100001 SET @@session.gtid_seq_no=317*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=317*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5298,7 +5298,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-318 -/*!100001 SET @@session.gtid_seq_no=318*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=318*//*!*/; START TRANSACTION /*!*/; # at # @@ -5321,7 +5321,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-319 ddl -/*!100001 SET @@session.gtid_seq_no=319*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=319*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5348,10 +5348,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000002 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-320 -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=320*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=320*//*!*/; START TRANSACTION /*!*/; # at # @@ -5377,10 +5377,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000003 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-324 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=324*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=324*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -5397,7 +5397,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-325 -/*!100001 SET @@session.gtid_seq_no=325*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=325*//*!*/; START TRANSACTION /*!*/; # at # @@ -5418,7 +5418,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-326 -/*!100001 SET @@session.gtid_seq_no=326*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=326*//*!*/; START TRANSACTION /*!*/; # at # @@ -5439,7 +5439,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-327 ddl -/*!100001 SET @@session.gtid_seq_no=327*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=327*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -2261,10 +2261,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -2369,7 +2369,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -2460,7 +2460,10 @@ #Q> '', -- c76 #Q> # #Q> 'a', -- c77 -#Q> '', +#Q> '', -- c78 +#Q> # +#Q> 1 -- crn -- row number +#Q> ) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -2551,7 +2554,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -2642,7 +2645,10 @@ #Q> 'longtext-ucs2', -- c76 not using maximum value here #Q> # #Q> 'c', -- c77 -#Q> 'a,b,c +#Q> 'a,b,c', -- c78 +#Q> # +#Q> 2 -- crn -- row number +#Q> ) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -2733,7 +2739,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -2909,7 +2915,13 @@ #Q> 'mediumtext-ucs2', -- c73 #Q> 'longblob', -- c74 #Q> 'longtext', -- c75 -#Q> 'longtext +#Q> 'longtext-ucs2', -- c76 +#Q> # +#Q> 'b', -- c77 +#Q> 'b,c', -- c78 +#Q> # +#Q> 4 -- crn -- row number +#Q> ) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -3081,7 +3093,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 trans -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -3250,7 +3262,21 @@ #Q> # #Q> c65 = '' AND #Q> c66 = '' AND -#Q> c67 = +#Q> c67 = '' AND +#Q> c68 = '' AND +#Q> c69 = '' AND +#Q> c70 = '' AND +#Q> c71 = '' AND +#Q> c72 = '' AND +#Q> c73 = '' AND +#Q> c74 = '' AND +#Q> c75 = '' AND +#Q> c76 = '' AND +#Q> # +#Q> c77 = 'a' AND +#Q> c78 = '' AND +#Q> # +#Q> crn = 1 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -3421,7 +3447,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 trans -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -3595,7 +3621,17 @@ #Q> c68 = 'blob' AND #Q> c69 = 'text' AND #Q> c70 = 'text-ucs2' AND -#Q> c71 = 'mediumblob +#Q> c71 = 'mediumblob' AND +#Q> c72 = 'mediumtext' AND +#Q> c73 = 'mediumtext-ucs2' AND +#Q> c74 = 'longblob' AND +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'c' AND +#Q> c78 = 'a,b,c' AND +#Q> # +#Q> crn = 2 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -3766,7 +3802,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 trans -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -3938,7 +3974,18 @@ #Q> c67 IS NULL AND #Q> c68 IS NULL AND #Q> c69 IS NULL AND -#Q> c70 IS NULL +#Q> c70 IS NULL AND +#Q> c71 IS NULL AND +#Q> c72 IS NULL AND +#Q> c73 IS NULL AND +#Q> c74 IS NULL AND +#Q> c75 IS NULL AND +#Q> c76 IS NULL AND +#Q> # +#Q> c77 IS NULL AND +#Q> c78 IS NULL AND +#Q> # +#Q> crn = 3 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -4109,7 +4156,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 trans -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -4284,7 +4331,16 @@ #Q> c69 = 'text' AND #Q> c70 = 'text-ucs2' AND #Q> c71 = 'mediumblob' AND -#Q> c72 = 'me +#Q> c72 = 'mediumtext' AND +#Q> c73 = 'mediumtext-ucs2' AND +#Q> c74 = 'longblob' AND +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'b' AND +#Q> c78 = 'b,c' AND +#Q> # +#Q> crn = 4 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -4455,7 +4511,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 trans -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -4544,7 +4600,13 @@ #Q> c72 = 'mediumtext' AND #Q> c73 = 'mediumtext-ucs2' AND #Q> c74 = 'longblob' AND -#Q> c75 = ' +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'c' AND +#Q> c78 = 'a,b,c' AND +#Q> # +#Q> crn = 1 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -4635,7 +4697,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-10 trans -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; # at # @@ -4721,7 +4783,15 @@ #Q> c70 = '' AND #Q> c71 = '' AND #Q> c72 = '' AND -#Q> c73 = '' A +#Q> c73 = '' AND +#Q> c74 = '' AND +#Q> c75 = '' AND +#Q> c76 = '' AND +#Q> # +#Q> c77 = 'a' AND +#Q> c78 = '' AND +#Q> # +#Q> crn = 2 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -4812,7 +4882,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-11 trans -/*!100001 SET @@session.gtid_seq_no=11*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=11*//*!*/; START TRANSACTION /*!*/; # at # @@ -4901,7 +4971,13 @@ #Q> c72 = 'mediumtext' AND #Q> c73 = 'mediumtext-ucs2' AND #Q> c74 = 'longblob' AND -#Q> c75 = 'longtext' +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'b' AND +#Q> c78 = 'b,c' AND +#Q> # +#Q> crn = 3 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -4992,7 +5068,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 trans -/*!100001 SET @@session.gtid_seq_no=12*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=12*//*!*/; START TRANSACTION /*!*/; # at # @@ -5079,7 +5155,14 @@ #Q> c71 IS NULL AND #Q> c72 IS NULL AND #Q> c73 IS NULL AND -#Q> c74 IS NUL +#Q> c74 IS NULL AND +#Q> c75 IS NULL AND +#Q> c76 IS NULL AND +#Q> # +#Q> c77 IS NULL AND +#Q> c78 IS NULL AND +#Q> # +#Q> crn = 4 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -5270,10 +5353,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -5294,7 +5377,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -5309,7 +5392,7 @@ #Q> ('2008-08-06','VARCHAR-06',6), #Q> ('2008-08-07','VARCHAR-07',7), #Q> ('2008-08-08','VARCHAR-08',8), -#Q> ('2008-08-09','VARCH +#Q> ('2008-08-09','VARCHAR-09',9) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5364,7 +5447,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -5443,7 +5526,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -5670,10 +5753,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -5694,7 +5777,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5706,7 +5789,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5718,7 +5801,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -5733,7 +5816,7 @@ #Q> ('2008-01-06','VARCHAR-01-06',6), #Q> ('2008-01-07','VARCHAR-01-07',7), #Q> ('2008-01-08','VARCHAR-01-08',18), -#Q> ('2008-01-09','VARCHAR-0 +#Q> ('2008-01-09','VARCHAR-01-09',19) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5788,7 +5871,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 trans -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -5803,7 +5886,7 @@ #Q> ('2008-02-06','VARCHAR-02-06',6), #Q> ('2008-02-07','VARCHAR-02-07',7), #Q> ('2008-02-08','VARCHAR-02-08',28), -#Q> ('2008-02-09','VARCHAR-0 +#Q> ('2008-02-09','VARCHAR-02-09',29) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t2` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5858,7 +5941,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 trans -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -5873,7 +5956,7 @@ #Q> ('2008-03-06','VARCHAR-03-06',6), #Q> ('2008-03-07','VARCHAR-03-07',7), #Q> ('2008-03-08','VARCHAR-03-08',38), -#Q> ('2008-03-09','VARCHAR-0 +#Q> ('2008-03-09','VARCHAR-03-09',39) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t3` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5928,7 +6011,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 trans -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -5938,7 +6021,7 @@ #Q> c_1_1 = ADDDATE(c_1_1,INTERVAL 10 YEAR), #Q> c_2_1 = ADDDATE(c_2_1,INTERVAL 20 YEAR), #Q> c_3_1 = ADDDATE(c_3_1,INTERVAL 30 YEAR) -#Q> WHERE c_1_n = c_2_n AND c_2_n = c +#Q> WHERE c_1_n = c_2_n AND c_2_n = c_3_n #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t2` mapped to number # @@ -6118,14 +6201,14 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 trans -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Annotate_rows: #Q> DELETE FROM t1,t2,t3 USING t1 INNER JOIN t2 INNER JOIN t3 -#Q> WHERE c_1_n = c_2_n AND c_2_n = c_3_ +#Q> WHERE c_1_n = c_2_n AND c_2_n = c_3_n #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t2` mapped to number # @@ -6308,10 +6391,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -6332,7 +6415,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -6340,7 +6423,7 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Annotate_rows: #Q> LOAD DATA INFILE '../../std_data/loaddata5.dat' #Q> INTO TABLE t1 FIELDS TERMINATED BY '' ENCLOSED BY '' (c1,c2) -#Q> SET c3 = 'Wo +#Q> SET c3 = 'Wow' #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result 2024-08-03 07:29:57.000000000 +0000 @@ -2259,10 +2259,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -2367,7 +2367,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -2458,7 +2458,10 @@ #Q> '', -- c76 #Q> # #Q> 'a', -- c77 -#Q> '', +#Q> '', -- c78 +#Q> # +#Q> 1 -- crn -- row number +#Q> ) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -2552,7 +2555,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -2643,7 +2646,10 @@ #Q> 'longtext-ucs2', -- c76 not using maximum value here #Q> # #Q> 'c', -- c77 -#Q> 'a,b,c +#Q> 'a,b,c', -- c78 +#Q> # +#Q> 2 -- crn -- row number +#Q> ) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -2736,7 +2742,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -2912,7 +2918,13 @@ #Q> 'mediumtext-ucs2', -- c73 #Q> 'longblob', -- c74 #Q> 'longtext', -- c75 -#Q> 'longtext +#Q> 'longtext-ucs2', -- c76 +#Q> # +#Q> 'b', -- c77 +#Q> 'b,c', -- c78 +#Q> # +#Q> 4 -- crn -- row number +#Q> ) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -3086,7 +3098,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -3255,7 +3267,21 @@ #Q> # #Q> c65 = '' AND #Q> c66 = '' AND -#Q> c67 = +#Q> c67 = '' AND +#Q> c68 = '' AND +#Q> c69 = '' AND +#Q> c70 = '' AND +#Q> c71 = '' AND +#Q> c72 = '' AND +#Q> c73 = '' AND +#Q> c74 = '' AND +#Q> c75 = '' AND +#Q> c76 = '' AND +#Q> # +#Q> c77 = 'a' AND +#Q> c78 = '' AND +#Q> # +#Q> crn = 1 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -3428,7 +3454,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -3602,7 +3628,17 @@ #Q> c68 = 'blob' AND #Q> c69 = 'text' AND #Q> c70 = 'text-ucs2' AND -#Q> c71 = 'mediumblob +#Q> c71 = 'mediumblob' AND +#Q> c72 = 'mediumtext' AND +#Q> c73 = 'mediumtext-ucs2' AND +#Q> c74 = 'longblob' AND +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'c' AND +#Q> c78 = 'a,b,c' AND +#Q> # +#Q> crn = 2 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -3775,7 +3811,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -3947,7 +3983,18 @@ #Q> c67 IS NULL AND #Q> c68 IS NULL AND #Q> c69 IS NULL AND -#Q> c70 IS NULL +#Q> c70 IS NULL AND +#Q> c71 IS NULL AND +#Q> c72 IS NULL AND +#Q> c73 IS NULL AND +#Q> c74 IS NULL AND +#Q> c75 IS NULL AND +#Q> c76 IS NULL AND +#Q> # +#Q> c77 IS NULL AND +#Q> c78 IS NULL AND +#Q> # +#Q> crn = 3 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -4120,7 +4167,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -4295,7 +4342,16 @@ #Q> c69 = 'text' AND #Q> c70 = 'text-ucs2' AND #Q> c71 = 'mediumblob' AND -#Q> c72 = 'me +#Q> c72 = 'mediumtext' AND +#Q> c73 = 'mediumtext-ucs2' AND +#Q> c74 = 'longblob' AND +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'b' AND +#Q> c78 = 'b,c' AND +#Q> # +#Q> crn = 4 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F @@ -4468,7 +4524,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -4557,7 +4613,13 @@ #Q> c72 = 'mediumtext' AND #Q> c73 = 'mediumtext-ucs2' AND #Q> c74 = 'longblob' AND -#Q> c75 = ' +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'c' AND +#Q> c78 = 'a,b,c' AND +#Q> # +#Q> crn = 1 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -4650,7 +4712,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-10 -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; # at # @@ -4736,7 +4798,15 @@ #Q> c70 = '' AND #Q> c71 = '' AND #Q> c72 = '' AND -#Q> c73 = '' A +#Q> c73 = '' AND +#Q> c74 = '' AND +#Q> c75 = '' AND +#Q> c76 = '' AND +#Q> # +#Q> c77 = 'a' AND +#Q> c78 = '' AND +#Q> # +#Q> crn = 2 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -4829,7 +4899,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-11 -/*!100001 SET @@session.gtid_seq_no=11*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=11*//*!*/; START TRANSACTION /*!*/; # at # @@ -4918,7 +4988,13 @@ #Q> c72 = 'mediumtext' AND #Q> c73 = 'mediumtext-ucs2' AND #Q> c74 = 'longblob' AND -#Q> c75 = 'longtext' +#Q> c75 = 'longtext' AND +#Q> c76 = 'longtext-ucs2' AND +#Q> # +#Q> c77 = 'b' AND +#Q> c78 = 'b,c' AND +#Q> # +#Q> crn = 3 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -5011,7 +5087,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 -/*!100001 SET @@session.gtid_seq_no=12*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=12*//*!*/; START TRANSACTION /*!*/; # at # @@ -5098,7 +5174,14 @@ #Q> c71 IS NULL AND #Q> c72 IS NULL AND #Q> c73 IS NULL AND -#Q> c74 IS NUL +#Q> c74 IS NULL AND +#Q> c75 IS NULL AND +#Q> c76 IS NULL AND +#Q> # +#Q> c77 IS NULL AND +#Q> c78 IS NULL AND +#Q> # +#Q> crn = 4 #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F @@ -5291,10 +5374,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -5315,7 +5398,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -5330,7 +5413,7 @@ #Q> ('2008-08-06','VARCHAR-06',6), #Q> ('2008-08-07','VARCHAR-07',7), #Q> ('2008-08-08','VARCHAR-08',8), -#Q> ('2008-08-09','VARCH +#Q> ('2008-08-09','VARCHAR-09',9) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5387,7 +5470,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -5468,7 +5551,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -5697,10 +5780,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -5721,7 +5804,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5733,7 +5816,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -5745,7 +5828,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -5760,7 +5843,7 @@ #Q> ('2008-01-06','VARCHAR-01-06',6), #Q> ('2008-01-07','VARCHAR-01-07',7), #Q> ('2008-01-08','VARCHAR-01-08',18), -#Q> ('2008-01-09','VARCHAR-0 +#Q> ('2008-01-09','VARCHAR-01-09',19) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5817,7 +5900,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -5832,7 +5915,7 @@ #Q> ('2008-02-06','VARCHAR-02-06',6), #Q> ('2008-02-07','VARCHAR-02-07',7), #Q> ('2008-02-08','VARCHAR-02-08',28), -#Q> ('2008-02-09','VARCHAR-0 +#Q> ('2008-02-09','VARCHAR-02-09',29) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t2` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5889,7 +5972,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -5904,7 +5987,7 @@ #Q> ('2008-03-06','VARCHAR-03-06',6), #Q> ('2008-03-07','VARCHAR-03-07',7), #Q> ('2008-03-08','VARCHAR-03-08',38), -#Q> ('2008-03-09','VARCHAR-0 +#Q> ('2008-03-09','VARCHAR-03-09',39) #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t3` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -5961,7 +6044,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -5971,7 +6054,7 @@ #Q> c_1_1 = ADDDATE(c_1_1,INTERVAL 10 YEAR), #Q> c_2_1 = ADDDATE(c_2_1,INTERVAL 20 YEAR), #Q> c_3_1 = ADDDATE(c_3_1,INTERVAL 30 YEAR) -#Q> WHERE c_1_n = c_2_n AND c_2_n = c +#Q> WHERE c_1_n = c_2_n AND c_2_n = c_3_n #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t2` mapped to number # @@ -6153,14 +6236,14 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Annotate_rows: #Q> DELETE FROM t1,t2,t3 USING t1 INNER JOIN t2 INNER JOIN t3 -#Q> WHERE c_1_n = c_2_n AND c_2_n = c_3_ +#Q> WHERE c_1_n = c_2_n AND c_2_n = c_3_n #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t2` mapped to number # @@ -6345,10 +6428,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -6369,7 +6452,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -6377,7 +6460,7 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Annotate_rows: #Q> LOAD DATA INFILE '../../std_data/loaddata5.dat' #Q> INTO TABLE t1 FIELDS TERMINATED BY '' ENCLOSED BY '' (c1,c2) -#Q> SET c3 = 'Wo +#Q> SET c3 = 'Wow' #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Table_map: `test`.`t1` mapped to number # # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result 2024-08-03 07:29:57.000000000 +0000 @@ -137,10 +137,10 @@ #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -160,7 +160,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -171,7 +171,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -240,7 +240,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 ddl -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -248,7 +248,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 ddl -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -256,7 +256,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -286,7 +286,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -325,7 +325,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -347,7 +347,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 trans -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -416,7 +416,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-10 ddl -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -424,7 +424,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-11 ddl -/*!100001 SET @@session.gtid_seq_no=11*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=11*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -432,7 +432,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 -/*!100001 SET @@session.gtid_seq_no=12*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=12*//*!*/; START TRANSACTION /*!*/; # at # @@ -462,7 +462,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-13 -/*!100001 SET @@session.gtid_seq_no=13*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=13*//*!*/; START TRANSACTION /*!*/; # at # @@ -501,7 +501,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-14 -/*!100001 SET @@session.gtid_seq_no=14*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=14*//*!*/; START TRANSACTION /*!*/; # at # @@ -523,7 +523,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-15 ddl -/*!100001 SET @@session.gtid_seq_no=15*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=15*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -531,7 +531,7 @@ /*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-16 ddl -/*!100001 SET @@session.gtid_seq_no=16*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=16*//*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_row_annotate.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_annotate.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_row_annotate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_annotate.result 2024-08-03 07:29:57.000000000 +0000 @@ -108,10 +108,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -127,7 +127,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -135,7 +135,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -143,7 +143,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -170,7 +170,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -197,7 +197,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -224,7 +224,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -232,7 +232,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE test1.t1, test2.t2 #Q> FROM test1.t1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # @@ -266,7 +266,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -293,7 +293,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -301,7 +301,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE xtest1.xt1, test2.t2 #Q> FROM xtest1.xt1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE xtest1.xt1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE xtest1.xt1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # Delete_rows: table id # flags: STMT_END_F @@ -346,10 +346,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -365,15 +365,15 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -400,7 +400,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -413,7 +413,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -426,7 +426,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -434,7 +434,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE test1.t1, test2.t2 #Q> FROM test1.t1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # # at # # at # @@ -456,7 +456,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -469,7 +469,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -505,10 +505,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -524,7 +524,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -532,7 +532,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -540,7 +540,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -565,7 +565,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -590,7 +590,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -615,7 +615,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -653,7 +653,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -678,7 +678,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -731,10 +731,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -750,7 +750,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -758,7 +758,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -766,7 +766,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -793,7 +793,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -820,7 +820,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -847,7 +847,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -855,7 +855,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE test1.t1, test2.t2 #Q> FROM test1.t1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # @@ -889,7 +889,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -916,7 +916,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -924,7 +924,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE xtest1.xt1, test2.t2 #Q> FROM xtest1.xt1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE xtest1.xt1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE xtest1.xt1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # Delete_rows: table id # flags: STMT_END_F @@ -969,10 +969,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -988,15 +988,15 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -1023,7 +1023,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -1036,7 +1036,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -1049,7 +1049,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -1057,7 +1057,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE test1.t1, test2.t2 #Q> FROM test1.t1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # # at # # at # @@ -1079,7 +1079,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -1092,7 +1092,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -1128,10 +1128,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1147,7 +1147,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1155,7 +1155,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -1163,7 +1163,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -1187,7 +1187,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -1211,7 +1211,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -1235,7 +1235,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -1272,7 +1272,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -1296,7 +1296,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result 2024-08-03 07:29:57.000000000 +0000 @@ -83,10 +83,10 @@ #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000003 # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=#*//*!*/; -/*!100001 SET @@session.server_id=#*//*!*/; -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=#*//*!*/; +/*M!100001 SET @@session.server_id=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -103,7 +103,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -124,7 +124,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -145,7 +145,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -166,7 +166,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -187,7 +187,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -208,7 +208,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -229,7 +229,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# ddl -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=XXX/*!*/; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result 2024-08-03 07:29:57.000000000 +0000 @@ -41,10 +41,10 @@ #010909 4:46:40 server id # end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # use `new_test1`/*!*/; #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= @@ -61,7 +61,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -87,7 +87,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test2`/*!*/; @@ -96,7 +96,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -120,7 +120,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -142,7 +142,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-6 ddl -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; # at # use `new_test3`/*!*/; #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= @@ -151,7 +151,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -175,7 +175,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -197,14 +197,14 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows: #Q> LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE t1 -#Q> FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n +#Q> FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' #010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `new_test1`.`t1` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -236,7 +236,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; # at # @@ -282,10 +282,10 @@ #010909 4:46:40 server id # end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # use `new_test1`/*!*/; #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= @@ -302,7 +302,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -328,7 +328,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test2`/*!*/; @@ -337,7 +337,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -361,7 +361,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -383,7 +383,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-6 ddl -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; # at # use `new_test3`/*!*/; #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= @@ -392,7 +392,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -416,7 +416,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -438,14 +438,14 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Annotate_rows: #Q> LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE t1 -#Q> FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n +#Q> FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' #010909 4:46:40 server id # end_log_pos # CRC32 XXX Table_map: `new_test1`.`t1` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F @@ -477,7 +477,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; # at # diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_show_binlog_events_invalid_offset_silent.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_show_binlog_events_invalid_offset_silent.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_show_binlog_events_invalid_offset_silent.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_show_binlog_events_invalid_offset_silent.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,21 @@ +# +# Initialize test data +set @save_master_verify_checksum = @@global.master_verify_checksum; +set @@global.master_verify_checksum = 1; +create table t1 (a int); +insert into t1 values (1); +insert into t1 values (2); +SHOW BINLOG EVENTS FROM invalid_pos; +ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Wrong offset or I/O error +include/assert_grep.inc [Ensure the client error is not in the server log] +SHOW BINLOG EVENTS FROM 500; +ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Wrong offset or I/O error +include/assert_grep.inc [Ensure the client error is not in the server log] +SHOW BINLOG EVENTS FROM 498; +ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Wrong offset or I/O error +include/assert_grep.inc [Ensure the client error is not in the server log] +include/assert_grep.inc [Ensure there is not a specific checksum failure error] +# +# Cleanup +set @@global.master_verify_checksum = @save_master_verify_checksum; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result 2024-08-03 07:29:57.000000000 +0000 @@ -85,10 +85,10 @@ #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000003 # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=#*//*!*/; -/*!100001 SET @@session.server_id=#*//*!*/; -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=#*//*!*/; +/*M!100001 SET @@session.server_id=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -105,7 +105,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -120,7 +120,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -135,7 +135,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -150,7 +150,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -165,7 +165,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -180,7 +180,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; START TRANSACTION /*!*/; # at # @@ -195,7 +195,7 @@ /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# ddl -/*!100001 SET @@session.gtid_seq_no=#*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=#*//*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=XXX/*!*/; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_truncate_active_log.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_active_log.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_truncate_active_log.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_active_log.result 2024-08-03 07:29:57.000000000 +0000 @@ -40,7 +40,7 @@ disconnect master2; disconnect master3; disconnect master4; -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3 FOUND 1 /Successfully truncated.*to remove transactions starting from GTID 0-1-7/ in mysqld.1.err Pre-crash binlog file content: include/show_binlog_events.inc @@ -104,7 +104,7 @@ disconnect master2; disconnect master3; disconnect master4; -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3 FOUND 1 /Successfully truncated.*to remove transactions starting from GTID 0-1-11/ in mysqld.1.err Pre-crash binlog file content: include/show_binlog_events.inc @@ -173,7 +173,7 @@ disconnect master2; disconnect master3; disconnect master4; -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3 FOUND 1 /Successfully truncated.*to remove transactions starting from GTID 0-1-15/ in mysqld.1.err Pre-crash binlog file content: include/show_binlog_events.inc @@ -248,7 +248,7 @@ disconnect master2; disconnect master3; disconnect master4; -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3 FOUND 1 /Successfully truncated.*to remove transactions starting from GTID 0-1-21/ in mysqld.1.err Pre-crash binlog file content: include/show_binlog_events.inc diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_truncate_multi_engine.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_multi_engine.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_truncate_multi_engine.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_multi_engine.result 2024-08-03 07:29:57.000000000 +0000 @@ -31,9 +31,9 @@ master-bin.000001 # master-bin.000002 # master-bin.000003 # -# restart the server with --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +# restart the server with --init-rpl-role=SLAVE --sync-binlog=1 # the server is restarted -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 connection default; # # *** Summary: 1 row should be present in both tables; binlog is truncated; number of binlogs at reconnect - 3: @@ -98,7 +98,7 @@ INSERT INTO t1 VALUES (2, REPEAT("x", 4100)); COMMIT; connection default; -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 connection default; # # *** Summary: 2 rows should be present in both tables; no binlog truncation; one extra binlog file compare with A; number of binlogs at reconnect - 4: @@ -155,9 +155,9 @@ master-bin.000001 # master-bin.000002 # master-bin.000003 # -# restart the server with --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +# restart the server with --init-rpl-role=SLAVE --sync-binlog=1 # the server is restarted -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 connection default; # # *** Summary: 2 rows should be present in both tables; no binlog truncation; the same # of binlog files as in B; number of binlogs at reconnect - 4: diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_truncate_multi_log.result mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_multi_log.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/binlog_truncate_multi_log.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/binlog_truncate_multi_log.result 2024-08-03 07:29:57.000000000 +0000 @@ -42,7 +42,7 @@ disconnect master1; disconnect master2; disconnect master3; -# restart: --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3 +# restart: --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3 FOUND 1 /truncated binlog file:.*master.*000002/ in mysqld.1.err "One record should be present in table" SELECT * FROM ti; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/r/flashback.result mariadb-10.11.9/mysql-test/suite/binlog/r/flashback.result --- mariadb-10.11.6/mysql-test/suite/binlog/r/flashback.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/r/flashback.result 2024-08-03 07:29:57.000000000 +0000 @@ -51,10 +51,10 @@ #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -80,7 +80,7 @@ /*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; START TRANSACTION /*!*/; # at # @@ -106,7 +106,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -132,7 +132,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -158,7 +158,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 trans -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -212,7 +212,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 trans -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_autocommit_off_no_hang.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_autocommit_off_no_hang.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_autocommit_off_no_hang.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_autocommit_off_no_hang.test 2024-08-03 07:29:57.000000000 +0000 @@ -26,10 +26,10 @@ ALTER TABLE mysql.gtid_slave_pos ENGINE=innodb; --echo # Restart the server so mysqld reads the gtid_slave_pos using innodb ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_gis_user_var_stm.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_gis_user_var_stm.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_gis_user_var_stm.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_gis_user_var_stm.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,15 @@ +--source include/not_embedded.inc +--source include/have_binlog_format_statement.inc +--source include/have_geometry.inc + +--disable_query_log +reset master; # get rid of previous tests binlog +--enable_query_log + +SET @g0= POINT(1,1); +SET @g1= Polygon(LineString(Point(0, 0), Point(30, 0), Point(30, 30), Point(0, 0))); +CREATE TABLE t1 AS SELECT @g0 AS g0, @g1 AS g1; +DROP TABLE t1; + +--let $binlog_file = LAST +source include/show_binlog_events.inc; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_mysqlbinlog_raw_flush.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_mysqlbinlog_raw_flush.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_mysqlbinlog_raw_flush.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_mysqlbinlog_raw_flush.test 2024-08-03 07:29:57.000000000 +0000 @@ -20,6 +20,8 @@ --source include/linux.inc --source include/have_log_bin.inc +# Test needs to reset the binlog as it is checking specific GTID. +RESET MASTER; --echo # --echo # MDEV-30698 Cover missing test cases for mariadb-binlog options @@ -35,7 +37,7 @@ INSERT INTO t1 VALUES (1); # Read binlog data from master to intermediary result file ---let TIMEOUT=1 +--let TIMEOUT=5 --echo # timeout TIMEOUT MYSQL_BINLOG --raw --read-from-remote-server --user=root --host=127.0.0.1 --port=MASTER_MYPORT --stop-never --result-file=MYSQLTEST_VARDIR/tmp/ master-bin.000001 --error 124 # Error 124 means timeout was reached --exec timeout $TIMEOUT $MYSQL_BINLOG --raw --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --stop-never --result-file=$MYSQLTEST_VARDIR/tmp/ master-bin.000001 diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_recover_checksum_error.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_recover_checksum_error.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_recover_checksum_error.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_recover_checksum_error.test 2024-08-03 07:29:57.000000000 +0000 @@ -16,7 +16,7 @@ # Proof of no crash follows. # There's no need for actual bin-loggable queries to the server ---let $restart_parameters= --master_verify_checksum=ON --debug_dbug="+d,corrupt_read_log_event_char" +--let $restart_parameters= --master_verify_checksum=ON --debug_dbug=+d,corrupt_read_log_event_char --let $shutdown_timeout=0 --source include/restart_mysqld.inc --let $restart_parameters= diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_rotate_perf.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_rotate_perf.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_rotate_perf.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_rotate_perf.test 2024-08-03 07:29:57.000000000 +0000 @@ -68,10 +68,10 @@ # try to change the log-bin configs and restart --echo # ======= now try to change the log-bin config for mysqld ======= ---let $restart_parameters="--log-bin=new_log_bin" +--let $restart_parameters=--log-bin=new_log_bin --echo #begin to restart mysqld --source include/restart_mysqld.inc ---let $restart_parameters= "" +--let $restart_parameters= --source include/show_binary_logs.inc let $loop_times= 10; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_show_binlog_events_invalid_offset_silent.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_show_binlog_events_invalid_offset_silent.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_show_binlog_events_invalid_offset_silent.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_show_binlog_events_invalid_offset_silent.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,53 @@ +# +# Ensure that calling SHOW BINLOG EVENTS FROM with an invalid offset +# will not result in error messages in the server log. That is, this call is a +# read operation for a user, and if it fails due to invalid usage, that is not +# a server error, but only one to report to the user. +# +# References: +# MDEV-32628: Cryptic ERROR message & inconsistent behavior on incorrect +# SHOW BINLOG EVENTS FROM ... +# +--source include/have_binlog_format_row.inc + +--echo # +--echo # Initialize test data +set @save_master_verify_checksum = @@global.master_verify_checksum; +set @@global.master_verify_checksum = 1; +create table t1 (a int); +insert into t1 values (1); +--let $middle_binlog_pos= query_get_value(SHOW BINARY LOGS, File_size, 1) +insert into t1 values (2); + +--let $assert_text= Ensure the client error is not in the server log +--let $assert_select= Error in Log_event +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_count= 0 +--let $assert_only_after = CURRENT_TEST: + + +# Pre MDEV-32628, this would write an event truncated error in the logs +--let $invalid_pos= `SELECT $middle_binlog_pos - 1` +--replace_result $invalid_pos invalid_pos +--error 1220 +--eval SHOW BINLOG EVENTS FROM $invalid_pos +--source include/assert_grep.inc + +# Pre MDEV-32628, this would write an event too big error in the logs +--error 1220 +SHOW BINLOG EVENTS FROM 500; +--source include/assert_grep.inc + + +# Pre MDEV-32628, this would write a checksum verification failed error in the logs +--error 1220 +SHOW BINLOG EVENTS FROM 498; +--source include/assert_grep.inc +--let $assert_text= Ensure there is not a specific checksum failure error +--let $assert_select= Replication event checksum verification failed while reading from a log file +--source include/assert_grep.inc + +--echo # +--echo # Cleanup +set @@global.master_verify_checksum = @save_master_verify_checksum; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_active_log.inc mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_active_log.inc --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_active_log.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_active_log.inc 2024-08-03 07:29:57.000000000 +0000 @@ -42,7 +42,7 @@ # # Server restart # ---let $restart_parameters= --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3 +--let $restart_parameters= --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3 --source include/start_mysqld.inc # Check error log for a successful truncate message. diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_active_log.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_active_log.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_active_log.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_active_log.test 2024-08-03 07:29:57.000000000 +0000 @@ -36,7 +36,7 @@ # Using 'debug_sync' hold 'query1' execution after 'query1' is flushed and # synced to binary log but not yet committed. In an another connection hold # 'query2' execution after 'query2' is flushed and synced to binlog. -# Crash and restart server with --rpl-semi-sync-slave-enabled=1 +# Crash and restart server with --init-rpl-role=SLAVE # # During recovery of binary log 'query1' status is checked with InnoDB engine, # it will be in prepared but not yet commited. All transactions starting from diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_engine.test 2024-08-03 07:29:57.000000000 +0000 @@ -28,7 +28,7 @@ # The transaction is killed along with the server after that. --let $shutdown_timeout=0 --let $debug_sync_action = "commit_after_release_LOCK_log SIGNAL con1_ready WAIT_FOR signal_no_signal" ---let $restart_parameters = --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +--let $restart_parameters = --init-rpl-role=SLAVE --sync-binlog=1 --let $test_outcome= 1 row should be present in both tables; binlog is truncated; number of binlogs at reconnect - 3 --source binlog_truncate_multi_engine.inc --echo Proof of the truncated binlog file is readable (two transactions must be seen): @@ -41,7 +41,7 @@ --let $debug_sync_action = "" # Both debug_sync and debug-dbug are required to make sure Engines remember the commit state # debug_sync alone will not help. ---let $restart_parameters = --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +--let $restart_parameters = --init-rpl-role=SLAVE --sync-binlog=1 --let $test_outcome= 2 rows should be present in both tables; no binlog truncation; one extra binlog file compare with A; number of binlogs at reconnect - 4 --source binlog_truncate_multi_engine.inc @@ -50,7 +50,7 @@ --let $debug_sync_action = "commit_after_run_commit_ordered SIGNAL con1_ready" # Hold off after both engines have committed. The server is shut down. --let $shutdown_timeout= ---let $restart_parameters = --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 +--let $restart_parameters = --init-rpl-role=SLAVE --sync-binlog=1 --let $test_outcome= 2 rows should be present in both tables; no binlog truncation; the same # of binlog files as in B; number of binlogs at reconnect - 4 --source binlog_truncate_multi_engine.inc diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_multi_log.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_log.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_multi_log.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_log.test 2024-08-03 07:29:57.000000000 +0000 @@ -63,7 +63,7 @@ # # Server restart # ---let $restart_parameters= --rpl-semi-sync-slave-enabled=1 --sync-binlog=1 --log-warnings=3 +--let $restart_parameters= --init-rpl-role=SLAVE --sync-binlog=1 --log-warnings=3 --source include/start_mysqld.inc # Check error log for a successful truncate message. diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_multi_log_unsafe.test mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_log_unsafe.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/binlog_truncate_multi_log_unsafe.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/binlog_truncate_multi_log_unsafe.test 2024-08-03 07:29:57.000000000 +0000 @@ -92,7 +92,7 @@ # --echo # Failed restart as the semisync slave --error 1 ---exec $MYSQLD_LAST_CMD --rpl-semi-sync-slave-enabled=1 >> $MYSQLTEST_VARDIR/log/mysqld.1.err 2>&1 +--exec $MYSQLD_LAST_CMD --init-rpl-role=SLAVE >> $MYSQLTEST_VARDIR/log/mysqld.1.err 2>&1 --echo # Normal restart --source include/start_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/binlog/t/flashback.test mariadb-10.11.9/mysql-test/suite/binlog/t/flashback.test --- mariadb-10.11.6/mysql-test/suite/binlog/t/flashback.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog/t/flashback.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,4 @@ ---source include/have_log_bin.inc +--source include/have_binlog_format_row.inc --source include/have_innodb.inc --echo # @@ -101,7 +101,7 @@ --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_1.sql --exec $MYSQL_BINLOG -B -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_1.sql ---exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_1.sql;" +--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_1.sql;" SELECT * FROM t1; @@ -126,7 +126,7 @@ --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_2.sql --exec $MYSQL_BINLOG -B -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_2.sql ---exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_2.sql;" +--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_2.sql;" SELECT * FROM t1; @@ -160,7 +160,7 @@ --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_3.sql --exec $MYSQL_BINLOG -B -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_3.sql ---exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_3.sql;" +--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_3.sql;" SELECT * FROM t1; @@ -202,7 +202,7 @@ --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_4.sql --exec $MYSQL_BINLOG -B $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_4.sql ---exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_4.sql;" +--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_4.sql;" SELECT * FROM t1; SELECT * FROM t2; @@ -247,7 +247,7 @@ --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --exec $MYSQL_BINLOG -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_5.sql --exec $MYSQL_BINLOG -B $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_5.sql ---exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_5.sql;" +--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_5.sql;" SELECT * FROM t1; @@ -323,7 +323,7 @@ --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --exec $MYSQL_BINLOG --database=world --table=city -vv $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_original_6.sql --exec $MYSQL_BINLOG --database=world --table=city -B $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_6.sql ---exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_6.sql;" +--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_6.sql;" SELECT * FROM world.city; @@ -355,7 +355,7 @@ --source include/assert.inc --exec $MYSQL_BINLOG -vv -B --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002> $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_7.sql ---exec $MYSQL -e "SET binlog_format= ROW; source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_7.sql;" +--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/mysqlbinlog_row_flashback_7.sql;" --echo # 6- Rows must be present upon restoring from flashback --let $assert_cond= COUNT(*) = 6 FROM t1 diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/binlog_row_annotate.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/binlog_row_annotate.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/binlog_row_annotate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/binlog_row_annotate.result 2024-08-03 07:29:57.000000000 +0000 @@ -112,10 +112,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -131,7 +131,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -139,7 +139,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -147,7 +147,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -174,7 +174,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -201,7 +201,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -228,7 +228,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -236,7 +236,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE test1.t1, test2.t2 #Q> FROM test1.t1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # @@ -270,7 +270,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -297,7 +297,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -305,7 +305,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE xtest1.xt1, test2.t2 #Q> FROM xtest1.xt1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE xtest1.xt1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE xtest1.xt1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # # at # #010909 4:46:40 server id # end_log_pos # Delete_rows: table id # flags: STMT_END_F @@ -353,10 +353,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -372,15 +372,15 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -407,7 +407,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -420,7 +420,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -433,7 +433,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -441,7 +441,7 @@ #010909 4:46:40 server id # end_log_pos # Annotate_rows: #Q> DELETE test1.t1, test2.t2 #Q> FROM test1.t1 INNER JOIN test2.t2 INNER JOIN test3.t3 -#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3 +#Q> WHERE test1.t1.a=test2.t2.a AND test2.t2.a=test3.t3.a #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # # at # # at # @@ -463,7 +463,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -476,7 +476,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -515,10 +515,10 @@ #010909 4:46:40 server id # end_log_pos # Binlog checkpoint master-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -534,7 +534,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -542,7 +542,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-3 ddl -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -550,7 +550,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -574,7 +574,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -598,7 +598,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -622,7 +622,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -659,7 +659,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; START TRANSACTION /*!*/; # at # @@ -683,7 +683,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.result 2024-08-03 07:29:57.000000000 +0000 @@ -68,7 +68,7 @@ SHOW TABLES; Tables_in_test table1_no_encryption -include/stop_slave.inc +include/stop_slave_sql.inc include/reset_slave.inc Warnings: Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'No' to 'Slave_Pos' diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.test mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.test --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_coords.test 2024-08-03 07:29:57.000000000 +0000 @@ -143,7 +143,8 @@ SHOW TABLES; --disable_connect_log ---source include/stop_slave.inc +# IO thread is stopped, stop SQL thread only +--source include/stop_slave_sql.inc --enable_connect_log --let $master_use_gtid_option= No --source include/reset_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.result 2024-08-03 07:29:57.000000000 +0000 @@ -62,7 +62,7 @@ # ..success SHOW TABLES; Tables_in_test -include/stop_slave.inc +include/stop_slave_sql.inc reset slave; ########## # Cleanup diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.test mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.test --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/encrypted_master_switch_to_unencrypted_gtid.test 2024-08-03 07:29:57.000000000 +0000 @@ -132,7 +132,8 @@ SHOW TABLES; --disable_connect_log ---source include/stop_slave.inc +# IO thread is stopped, wait for SQL thread to be stopped +--source include/stop_slave_sql.inc --enable_connect_log reset slave; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/restart_server.inc mariadb-10.11.9/mysql-test/suite/binlog_encryption/restart_server.inc --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/restart_server.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/restart_server.inc 2024-08-03 07:29:57.000000000 +0000 @@ -20,7 +20,7 @@ --connection $_cur_con --enable_reconnect ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect shutdown_server; @@ -31,5 +31,5 @@ { --let $_rpl_start_server_command= restart:$rpl_server_parameters } ---exec echo "$_rpl_start_server_command" > $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect +--write_line "$_rpl_start_server_command" $MYSQLTEST_VARDIR/tmp/mysqld.$rpl_server_number.expect --source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result 2024-08-03 07:29:57.000000000 +0000 @@ -69,8 +69,6 @@ connection server_4; CHANGE MASTER TO master_host = '127.0.0.1', master_port = MASTER_PORT, MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/start_slave.inc SELECT * FROM t1 ORDER BY a; a b @@ -91,8 +89,6 @@ include/stop_slave.inc CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_4, MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/start_slave.inc connection server_4; UPDATE t2 SET b="j1a" WHERE a=5; @@ -121,8 +117,6 @@ connection server_3; CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_4, MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t2 ORDER BY a; @@ -188,6 +182,13 @@ NULL Warnings: Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated +SET sql_log_bin= 0; +CREATE TABLE t1 AS SELECT MASTER_POS_WAIT(@binlog_file, 4, 0); +SELECT BINLOG_GTID_POS(@binlog_file, 4); +BINLOG_GTID_POS(@binlog_file, 4) +NULL +DROP TABLE t1; +SET sql_log_bin= 1; *** Some tests of @@GLOBAL.gtid_binlog_state *** connection server_2; include/sync_with_master_gtid.inc diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_mixed_binlog_max_cache_size.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_mixed_binlog_max_cache_size.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_mixed_binlog_max_cache_size.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_mixed_binlog_max_cache_size.result 2024-08-03 07:29:57.000000000 +0000 @@ -197,7 +197,7 @@ SET GLOBAL binlog_cache_size= ORIGINAL_VALUE; SET GLOBAL max_binlog_stmt_cache_size= ORIGINAL_VALUE; SET GLOBAL binlog_stmt_cache_size= ORIGINAL_VALUE; -include/stop_slave.inc +include/stop_slave_io.inc include/start_slave.inc connection master; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_packet.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_packet.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_packet.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_packet.result 2024-08-03 07:29:57.000000000 +0000 @@ -2,6 +2,8 @@ [connection master] call mtr.add_suppression("Slave I/O: Got a packet bigger than 'slave_max_allowed_packet' bytes, .*error.* 1153"); call mtr.add_suppression("Log entry on master is longer than slave_max_allowed_packet"); +call mtr.add_suppression("Could not write packet:"); +call mtr.add_suppression("Got a packet bigger than 'max_allowed_packet' bytes"); drop database if exists DB_NAME_OF_MAX_LENGTH_AKA_NAME_LEN_64_BYTES_____________________; create database DB_NAME_OF_MAX_LENGTH_AKA_NAME_LEN_64_BYTES_____________________; connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_ignored_errors.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_ignored_errors.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_ignored_errors.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_ignored_errors.result 2024-08-03 07:29:57.000000000 +0000 @@ -36,7 +36,8 @@ connection con_temp2; COMMIT; connection server_2; -include/stop_slave.inc +include/wait_for_slave_sql_error.inc [errno=1062] +include/stop_slave_io.inc include/assert.inc [table t1 should have zero rows where a>32] SELECT * FROM t1 WHERE a>32; a diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_missed_error_handling.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_missed_error_handling.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_missed_error_handling.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_missed_error_handling.result 2024-08-03 07:29:57.000000000 +0000 @@ -38,7 +38,6 @@ SET debug_sync='RESET'; connection server_2; include/wait_for_slave_sql_error.inc [errno=1062] -include/wait_for_slave_sql_to_stop.inc SELECT * FROM t3 WHERE a >= 110 ORDER BY a; a b 110 1 diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_slave_bgc_kill.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_slave_bgc_kill.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_slave_bgc_kill.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_slave_bgc_kill.result 2024-08-03 07:29:57.000000000 +0000 @@ -206,10 +206,12 @@ END || SET sql_log_bin=1; +include/stop_slave_io.inc connection server_1; INSERT INTO t3 VALUES (49,0); connection server_2; -START SLAVE SQL_THREAD; +CHANGE MASTER TO master_use_gtid=no; +include/start_slave.inc SELECT * FROM t3 WHERE a >= 40 ORDER BY a; a b 41 41 @@ -239,10 +241,6 @@ SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** 3. Same as (2), but not using gtid mode *** -connection server_2; -include/stop_slave.inc -CHANGE MASTER TO master_use_gtid=no; -include/start_slave.inc connection server_1; connection con_temp3; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_stop_slave.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_stop_slave.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_parallel_stop_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_parallel_stop_slave.result 2024-08-03 07:29:57.000000000 +0000 @@ -37,7 +37,9 @@ BEGIN; INSERT INTO t2 VALUES (21); connection server_2; -START SLAVE; +START SLAVE IO_THREAD; +include/wait_for_slave_param.inc [Read_Master_Log_Pos] +START SLAVE SQL_THREAD; connection con_temp2; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,rpl_parallel_wait_for_done_trigger"; diff -Nru mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_semi_sync.result mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_semi_sync.result --- mariadb-10.11.6/mysql-test/suite/binlog_encryption/rpl_semi_sync.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/binlog_encryption/rpl_semi_sync.result 2024-08-03 07:29:57.000000000 +0000 @@ -7,7 +7,6 @@ call mtr.add_suppression("mysqld: Got an error reading communication packets"); connection slave; set sql_log_bin=0; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); set sql_log_bin=1; @@ -28,7 +27,7 @@ # Main test of semi-sync replication start here # connection master; -set global rpl_semi_sync_master_timeout= 60000; +set global rpl_semi_sync_master_timeout= 2000; [ default state of semi-sync on master should be OFF ] show variables like 'rpl_semi_sync_master_enabled'; Variable_name Value @@ -163,11 +162,15 @@ # Test semi-sync master will switch OFF after one transaction # timeout waiting for slave reply. # +connection master; +show status like "Rpl_semi_sync_master_status"; +Variable_name Value +Rpl_semi_sync_master_status ON connection slave; include/stop_slave.inc connection master; include/kill_binlog_dump_threads.inc -set global rpl_semi_sync_master_timeout= 5000; +set global rpl_semi_sync_master_timeout= 2000; [ master status should be ON ] show status like 'Rpl_semi_sync_master_no_tx'; Variable_name Value @@ -317,6 +320,8 @@ connection slave; include/start_slave.inc connection master; +connection slave; +connection master; create table t1 (a int) engine = ENGINE_TYPE; insert into t1 values (1); insert into t1 values (2), (3); @@ -359,6 +364,8 @@ Variable_name Value Rpl_semi_sync_slave_status ON connection master; +connection slave; +connection master; [ master semi-sync should be ON ] show status like 'Rpl_semi_sync_master_clients'; Variable_name Value diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/column_compression.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/column_compression.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/column_compression.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/column_compression.result 2024-08-03 07:29:57.000000000 +0000 @@ -24,10 +24,10 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid("a")), - "b" varchar(1000) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, - "c" varchar(1000) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL, - "d" tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid("a")), + "b" varchar(1000) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL, + "c" varchar(1000) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL, + "d" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; # @@ -41,49 +41,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varbinary(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) DROP TABLE t1; # @@ -94,35 +94,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varbinary(10) /*!100301 COMPRESSED*/ DEFAULT '' + "a" varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) DROP TABLE t1; # @@ -134,7 +134,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) ASCII COMPRESSED); @@ -143,7 +143,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) BYTE COMPRESSED); @@ -152,7 +152,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varbinary(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -192,49 +192,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varbinary(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) DROP TABLE t1; # @@ -245,35 +245,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varbinary(10) /*!100301 COMPRESSED*/ DEFAULT '' + "a" varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) DROP TABLE t1; # @@ -285,7 +285,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) ASCII COMPRESSED); @@ -294,7 +294,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR2(10) BYTE COMPRESSED); @@ -303,7 +303,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varbinary(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varbinary(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -343,49 +343,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) DROP TABLE t1; # @@ -396,35 +396,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ DEFAULT '' + "a" tinytext /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) DROP TABLE t1; # @@ -436,7 +436,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT ASCII COMPRESSED); @@ -445,7 +445,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinytext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinytext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYTEXT BYTE COMPRESSED); @@ -454,7 +454,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -494,49 +494,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" blob(65535) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" blob(65535) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) DROP TABLE t1; # @@ -547,35 +547,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" blob(65535) /*!100301 COMPRESSED*/ DEFAULT '' + "a" blob(65535) /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ DEFAULT '' + "a" text /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) DROP TABLE t1; # @@ -587,7 +587,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT ASCII COMPRESSED); @@ -596,7 +596,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" text /*!100301 COMPRESSED*/ DEFAULT NULL + "a" text /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TEXT BYTE COMPRESSED); @@ -605,7 +605,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" blob(65535) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" blob(65535) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -645,49 +645,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) DROP TABLE t1; # @@ -698,35 +698,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ DEFAULT '' + "a" mediumtext /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) DROP TABLE t1; # @@ -738,7 +738,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT ASCII COMPRESSED); @@ -747,7 +747,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumtext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMTEXT BYTE COMPRESSED); @@ -756,7 +756,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -796,49 +796,49 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BINARY); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BINARY ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BYTE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED ASCII); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED UNICODE); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET ucs2 COLLATE ucs2_general_ci DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET utf8); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) DROP TABLE t1; # @@ -849,35 +849,35 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED BINARY DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED ASCII DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ DEFAULT '' + "a" longtext /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET utf8 DEFAULT ''); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci GENERATED ALWAYS AS (repeat('a',100)) VIRTUAL ) DROP TABLE t1; # @@ -889,7 +889,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT ASCII COMPRESSED); @@ -898,7 +898,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longtext /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longtext /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGTEXT BYTE COMPRESSED); @@ -907,7 +907,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -949,7 +949,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -960,21 +960,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + "a" varchar(10) /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) DROP TABLE t1; # @@ -986,7 +986,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT '' + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a VARCHAR(10) NULL COMPRESSED); @@ -995,7 +995,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1024,7 +1024,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1035,21 +1035,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TINYBLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a TINYBLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + "a" tinyblob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) DROP TABLE t1; # @@ -1061,7 +1061,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a TINYBLOB NULL COMPRESSED); @@ -1070,7 +1070,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" tinyblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" tinyblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1099,7 +1099,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1110,21 +1110,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a BLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a BLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + "a" longblob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) DROP TABLE t1; # @@ -1136,7 +1136,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a BLOB NULL COMPRESSED); @@ -1145,7 +1145,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1174,7 +1174,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1185,21 +1185,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMBLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMBLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + "a" mediumblob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) DROP TABLE t1; # @@ -1211,7 +1211,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a MEDIUMBLOB NULL COMPRESSED); @@ -1220,7 +1220,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" mediumblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" mediumblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1249,7 +1249,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1260,21 +1260,21 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a LONGBLOB COMPRESSED NULL); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a LONGBLOB COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10))); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL + "a" longblob /*M!100301 COMPRESSED*/ GENERATED ALWAYS AS (repeat('a',10)) VIRTUAL ) DROP TABLE t1; # @@ -1286,7 +1286,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT '' + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT '' ) DROP TABLE t1; CREATE TABLE t1 (a LONGBLOB NULL COMPRESSED); @@ -1295,7 +1295,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" longblob /*!100301 COMPRESSED*/ DEFAULT NULL + "a" longblob /*M!100301 COMPRESSED*/ DEFAULT NULL ) DROP TABLE t1; # @@ -1324,7 +1324,7 @@ SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE "t1" ( - "a" varchar(10) /*!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL + "a" varchar(10) /*M!100301 COMPRESSED*/ CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL ) DROP TABLE t1; CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED BINARY COMPRESSED); diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/empty_string_literal.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/empty_string_literal.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/empty_string_literal.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/empty_string_literal.result 2024-08-03 07:29:57.000000000 +0000 @@ -64,7 +64,7 @@ # Test litteral concat # SELECT 'a' 'b'; -a +ab ab SELECT 'a' ''; a @@ -76,13 +76,13 @@ NULL NULL SELECT '' 'b' 'c'; -b +bc bc SELECT '' '' 'c'; c c SELECT 'a' '' 'c'; -a +ac ac SELECT 'a' '' ''; a diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_concat.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_concat.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_concat.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_concat.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,12 +3,12 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(concat_operator_oracle('a','b'),'c') AS "'a'||'b'||'c'" +Note 1003 select concat(concat('a','b'),'c') AS "'a'||'b'||'c'" EXPLAIN EXTENDED SELECT CONCAT('a'||'b'||'c'); id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(concat_operator_oracle(concat_operator_oracle('a','b'),'c')) AS "CONCAT('a'||'b'||'c')" +Note 1003 select concat(concat(concat('a','b'),'c')) AS "CONCAT('a'||'b'||'c')" SELECT '' || ''; '' || '' @@ -211,14 +211,14 @@ CREATE VIEW v1 AS SELECT 'foo'||NULL||'bar' AS test; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select concat_operator_oracle(concat_operator_oracle('foo',NULL),'bar') AS "test" latin1 latin1_swedish_ci +v1 CREATE VIEW "v1" AS select concat(concat('foo',NULL),'bar') AS "test" latin1 latin1_swedish_ci SELECT * FROM v1; test foobar SET sql_mode=DEFAULT; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select concat_operator_oracle(concat_operator_oracle('foo',NULL),'bar') AS `test` latin1 latin1_swedish_ci +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select oracle_schema.concat(oracle_schema.concat('foo',NULL),'bar') AS `test` latin1 latin1_swedish_ci SELECT * FROM v1; test foobar @@ -234,7 +234,7 @@ SET sql_mode=ORACLE; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select concat('foo',NULL,'bar') AS "test" latin1 latin1_swedish_ci +v1 CREATE VIEW "v1" AS select mariadb_schema.concat('foo',NULL,'bar') AS "test" latin1 latin1_swedish_ci SELECT * FROM v1; test NULL @@ -268,12 +268,12 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select -1 << concat_operator_oracle(1,1) AS "a" +Note 1003 select -1 << concat(1,1) AS "a" EXPLAIN EXTENDED SELECT -1||0<<1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(-1,0) << 1 AS "a" +Note 1003 select concat(-1,0) << 1 AS "a" SELECT -1+1||1 AS a FROM DUAL; a 01 @@ -284,12 +284,12 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(-1 + 1,1) AS "a" +Note 1003 select concat(-1 + 1,1) AS "a" EXPLAIN EXTENDED SELECT -1||0+1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(-1,0) + 1 AS "a" +Note 1003 select concat(-1,0) + 1 AS "a" SELECT 1*1||-1 AS a FROM DUAL; a 1-1 @@ -300,12 +300,12 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(1 * 1,-1) AS "a" +Note 1003 select concat(1 * 1,-1) AS "a" EXPLAIN EXTENDED SELECT 1||1*-1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(1,1 * -1) AS "a" +Note 1003 select concat(1,1 * -1) AS "a" SELECT -1^1||1 AS a FROM DUAL; a 184467440737095516141 @@ -316,12 +316,12 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(-1 ^ 1,1) AS "a" +Note 1003 select concat(-1 ^ 1,1) AS "a" EXPLAIN EXTENDED SELECT -1||0^1 AS a FROM DUAL; id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select concat_operator_oracle(-1,0 ^ 1) AS "a" +Note 1003 select concat(-1,0 ^ 1) AS "a" # # MDEV-17359 Concatenation operator || in like expression failed in sql_mode=ORACLE # @@ -332,7 +332,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select 'abc' like concat_operator_oracle('a','%') AS "'abc' LIKE 'a'||'%'" +Note 1003 select 'abc' like concat('a','%') AS "'abc' LIKE 'a'||'%'" SELECT 'x' FROM DUAL WHERE 11 LIKE 1||1; x x @@ -353,7 +353,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where; Using filesort Warnings: -Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like (concat_operator_oracle('%','b')) order by "test"."t1"."ord" +Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like (concat('%','b')) order by "test"."t1"."ord" SELECT c1 FROM t1 WHERE c1 LIKE c2||'%'||'c' ORDER BY ord; c1 abc @@ -361,7 +361,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where; Using filesort Warnings: -Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like concat_operator_oracle(concat_operator_oracle("test"."t1"."c2",'%'),'c') order by "test"."t1"."ord" +Note 1003 select "test"."t1"."c1" AS "c1" from "test"."t1" where "test"."t1"."c1" like concat(concat("test"."t1"."c2",'%'),'c') order by "test"."t1"."ord" SELECT 'x' FROM t1 WHERE c1||c2 LIKE 'aa%'; x x @@ -369,7 +369,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where Warnings: -Note 1003 select 'x' AS "x" from "test"."t1" where concat_operator_oracle("test"."t1"."c1","test"."t1"."c2") like 'aa%' +Note 1003 select 'x' AS "x" from "test"."t1" where concat("test"."t1"."c1","test"."t1"."c2") like 'aa%' SELECT 'x' FROM t1 WHERE c1||c2 LIKE c2||c1; x x @@ -377,7 +377,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where Warnings: -Note 1003 select 'x' AS "x" from "test"."t1" where concat_operator_oracle("test"."t1"."c1","test"."t1"."c2") like concat_operator_oracle("test"."t1"."c2","test"."t1"."c1") +Note 1003 select 'x' AS "x" from "test"."t1" where concat("test"."t1"."c1","test"."t1"."c2") like concat("test"."t1"."c2","test"."t1"."c1") CREATE VIEW v1 AS SELECT c1, c2, c1 LIKE c2||'_' FROM t1 ORDER BY ord; SELECT * FROM v1; c1 c2 c1 LIKE c2||'_' @@ -388,6 +388,6 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using filesort Warnings: -Note 1003 select "test"."t1"."c1" AS "c1","test"."t1"."c2" AS "c2","test"."t1"."c1" like concat_operator_oracle("test"."t1"."c2",'_') AS "c1 LIKE c2||'_'" from "test"."t1" order by "test"."t1"."ord" +Note 1003 select "test"."t1"."c1" AS "c1","test"."t1"."c2" AS "c2","test"."t1"."c1" like concat("test"."t1"."c2",'_') AS "c1 LIKE c2||'_'" from "test"."t1" order by "test"."t1"."ord" DROP VIEW v1; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_decode.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_decode.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_decode.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_decode.result 2024-08-03 07:29:57.000000000 +0000 @@ -28,7 +28,7 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select decode_oracle(12,10,'x10',11,'x11','def') AS "DECODE(12,10,'x10',11,'x11','def')" +Note 1003 select decode(12,10,'x10',11,'x11','def') AS "DECODE(12,10,'x10',11,'x11','def')" CREATE TABLE decode (decode int); DROP TABLE decode; # @@ -46,22 +46,22 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select decode_oracle(12,10,'x10',11,'x11') AS "DECODE(12,10,'x10',11,'x11')" +Note 1003 select decode(12,10,'x10',11,'x11') AS "DECODE(12,10,'x10',11,'x11')" EXPLAIN EXTENDED SELECT DECODE(12,10,'x10',11,'x11','def'); id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select decode_oracle(12,10,'x10',11,'x11','def') AS "DECODE(12,10,'x10',11,'x11','def')" +Note 1003 select decode(12,10,'x10',11,'x11','def') AS "DECODE(12,10,'x10',11,'x11','def')" EXPLAIN EXTENDED SELECT DECODE_ORACLE(12,10,'x10',11,'x11'); id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select decode_oracle(12,10,'x10',11,'x11') AS "DECODE_ORACLE(12,10,'x10',11,'x11')" +Note 1003 select decode(12,10,'x10',11,'x11') AS "DECODE_ORACLE(12,10,'x10',11,'x11')" EXPLAIN EXTENDED SELECT DECODE_ORACLE(12,10,'x10',11,'x11','def'); id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select decode_oracle(12,10,'x10',11,'x11','def') AS "DECODE_ORACLE(12,10,'x10',11,'x11','def')" +Note 1003 select decode(12,10,'x10',11,'x11','def') AS "DECODE_ORACLE(12,10,'x10',11,'x11','def')" CREATE TABLE t1 (a INT); CREATE VIEW v1 AS SELECT @@ -72,7 +72,7 @@ FROM t1; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select decode_oracle("t1"."a",1,'x1',NULL,'xNULL') AS "d1",decode_oracle("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d2",decode_oracle("t1"."a",1,'x1',NULL,'xNULL') AS "d3",decode_oracle("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d4" from "t1" latin1 latin1_swedish_ci +v1 CREATE VIEW "v1" AS select decode("t1"."a",1,'x1',NULL,'xNULL') AS "d1",decode("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d2",decode("t1"."a",1,'x1',NULL,'xNULL') AS "d3",decode("t1"."a",1,'x1',NULL,'xNULL','xELSE') AS "d4" from "t1" latin1 latin1_swedish_ci DROP VIEW v1; DROP TABLE t1; SELECT DECODE(TIME'10:20:31','10:20:31','then1','10:20:32','then2','def'); diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_pad.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_pad.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_pad.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_pad.result 2024-08-03 07:29:57.000000000 +0000 @@ -44,11 +44,11 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 7 100.00 Using filesort Warnings: -Note 1003 select rpad_oracle('a',0,'.') AS "RPAD('a',0,'.')",lpad_oracle('a',0,'.') AS "LPAD('a',0,'.')",lpad_oracle("test"."t1"."c1","test"."t1"."c2","test"."t1"."c3") AS "LPAD(c1,c2,c3)",lpad_oracle("test"."t1"."c1","test"."t1"."c2") AS "LPAD(c1,c2)",rpad_oracle("test"."t1"."c1","test"."t1"."c2","test"."t1"."c3") AS "RPAD(c1,c2,c3)",rpad_oracle("test"."t1"."c1","test"."t1"."c2") AS "RPAD(c1,c2)" from "test"."t1" order by "test"."t1"."ord" +Note 1003 select rpad('a',0,'.') AS "RPAD('a',0,'.')",lpad('a',0,'.') AS "LPAD('a',0,'.')",lpad("test"."t1"."c1","test"."t1"."c2","test"."t1"."c3") AS "LPAD(c1,c2,c3)",lpad("test"."t1"."c1","test"."t1"."c2") AS "LPAD(c1,c2)",rpad("test"."t1"."c1","test"."t1"."c2","test"."t1"."c3") AS "RPAD(c1,c2,c3)",rpad("test"."t1"."c1","test"."t1"."c2") AS "RPAD(c1,c2)" from "test"."t1" order by "test"."t1"."ord" CREATE VIEW v1 AS SELECT RPAD('a',0,'.') AS "C1", LPAD('a',0,'.') AS "C2", LPAD(c1,c2,c3) AS "C3", LPAD(c1,c2) AS "C4", RPAD(c1,c2,c3) AS "C5", RPAD(c1,c2) AS "C6" FROM t1 ORDER BY ord; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select rpad_oracle('a',0,'.') AS "C1",lpad_oracle('a',0,'.') AS "C2",lpad_oracle("t1"."c1","t1"."c2","t1"."c3") AS "C3",lpad_oracle("t1"."c1","t1"."c2") AS "C4",rpad_oracle("t1"."c1","t1"."c2","t1"."c3") AS "C5",rpad_oracle("t1"."c1","t1"."c2") AS "C6" from "t1" order by "t1"."ord" latin1 latin1_swedish_ci +v1 CREATE VIEW "v1" AS select rpad('a',0,'.') AS "C1",lpad('a',0,'.') AS "C2",lpad("t1"."c1","t1"."c2","t1"."c3") AS "C3",lpad("t1"."c1","t1"."c2") AS "C4",rpad("t1"."c1","t1"."c2","t1"."c3") AS "C5",rpad("t1"."c1","t1"."c2") AS "C6" from "t1" order by "t1"."ord" latin1 latin1_swedish_ci SELECT * FROM v1; C1 C2 C3 C4 C5 C6 NULL NULL NULL a NULL a diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_qualified.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_qualified.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_qualified.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_qualified.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,2547 @@ +# +# MDEV-27744 LPAD in vcol created in ORACLE mode makes table corrupted in non-ORACLE +# +SET sql_mode=DEFAULT; +SELECT decode_oracle(1); +ERROR 42000: Incorrect parameter count in the call to native function 'decode_oracle' +SELECT DECODE_ORACLE(1); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE_ORACLE' +SET sql_mode=ORACLE; +SELECT decode_oracle(1); +ERROR 42000: Incorrect parameter count in the call to native function 'decode_oracle' +SELECT DECODE_ORACLE(1); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE_ORACLE' +SET sql_mode=DEFAULT; +SELECT decode(1); +ERROR 42000: Incorrect parameter count in the call to native function 'decode' +SELECT DECODE(1); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE' +SET sql_mode=ORACLE; +SELECT decode(1); +ERROR 42000: Incorrect parameter count in the call to native function 'decode' +SELECT DECODE(1); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE' +SELECT mariadb_schema.decode(1); +ERROR 42000: Incorrect parameter count in the call to native function 'decode' +SELECT mariadb_schema.DECODE(1); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE' +SELECT mariadb_schema.decode_oracle(1); +ERROR 42000: Incorrect parameter count in the call to native function 'decode_oracle' +SELECT mariadb_schema.DECODE_ORACLE(1); +ERROR 42000: Incorrect parameter count in the call to native function 'DECODE_ORACLE' +SET sql_mode=DEFAULT; +SELECT unknown.TRIM(1); +ERROR 42000: FUNCTION unknown.TRIM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT unknown.trim(1); +ERROR 42000: FUNCTION unknown.trim does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT oracle_schema.TRIM(); +ERROR HY000: Function 'TRIM' is not defined +SELECT oracle_schema.TRIM('a','b'); +ERROR HY000: Function 'TRIM' is not defined +SELECT oracle_schema.TRIM('a','b','c','d'); +ERROR HY000: Function 'TRIM' is not defined +SELECT unknown.SUBSTR('a',1,2); +ERROR 42000: FUNCTION unknown.SUBSTR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT unknown.substr('a',1,2); +ERROR 42000: FUNCTION unknown.substr does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT unknown.SUBSTRING('a',1,2); +ERROR 42000: FUNCTION unknown.SUBSTRING does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT unknown.substring('a',1,2); +ERROR 42000: FUNCTION unknown.substring does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT unknown.REPLACE('a','b','c'); +ERROR 42000: FUNCTION unknown.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT unknown.replace('a','b','c'); +ERROR 42000: FUNCTION unknown.replace does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +SELECT oracle_schema.REPLACE(); +ERROR HY000: Function 'REPLACE' is not defined +SELECT oracle_schema.REPLACE('a'); +ERROR HY000: Function 'REPLACE' is not defined +SELECT oracle_schema.REPLACE('a','b'); +ERROR HY000: Function 'REPLACE' is not defined +SELECT oracle_schema.REPLACE('a','b','c','d'); +ERROR HY000: Function 'REPLACE' is not defined +SET sql_mode=DEFAULT; +CREATE PROCEDURE p1(sqlmode TEXT, qualifier TEXT, expr TEXT) +BEGIN +DECLARE query TEXT DEFAULT 'SELECT $(QUALIFIER)$(EXPR)'; +DECLARE errmsg TEXT DEFAULT NULL; +DECLARE CONTINUE HANDLER FOR 1064, 1128, 1305, 1582, 1630 +BEGIN +GET DIAGNOSTICS CONDITION 1 errmsg = MESSAGE_TEXT; +END; +SET sql_mode=sqlmode; +SET query=REPLACE(query, '$(QUALIFIER)', qualifier); +SET query=REPLACE(query, '$(EXPR)', expr); +SET query= CONCAT('EXPLAIN EXTENDED ', query); +SELECT CONCAT('sql_mode=''',sqlmode,'''', ' ', +'qualifier=''',qualifier,'''') AS `----------`; +SELECT query; +EXECUTE IMMEDIATE query; +IF errmsg IS NOT NULL THEN +SELECT CONCAT('ERROR: ', errmsg) AS errmsg; +ELSE +SHOW WARNINGS; +END IF; +END; +$$ +CREATE PROCEDURE p2(sqlmode TEXT, expr TEXT) +BEGIN +CALL p1(sqlmode, '', expr); +CALL p1(sqlmode, 'unknown_schema.', expr); +CALL p1(sqlmode, 'mariadb_schema.', expr); +CALL p1(sqlmode, 'maxdb_schema.', expr); +CALL p1(sqlmode, 'oracle_schema.', expr); +END; +$$ +CREATE PROCEDURE p3(expr TEXT) +BEGIN +CALL p2('', expr); +CALL p2('ORACLE', expr); +END; +$$ +CALL p3('CONCAT(''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS `CONCAT('a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.CONCAT('a') +errmsg +ERROR: FUNCTION unknown_schema.CONCAT does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS `mariadb_schema.CONCAT('a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS `maxdb_schema.CONCAT('a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.concat('a') AS `oracle_schema.CONCAT('a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS "CONCAT('a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.CONCAT('a') +errmsg +ERROR: FUNCTION unknown_schema.CONCAT does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.concat('a') AS "mariadb_schema.CONCAT('a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.concat('a') AS "maxdb_schema.CONCAT('a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.CONCAT('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS "oracle_schema.CONCAT('a')" +Warnings: +Note 1003 select concat('a') AS "oracle_schema.CONCAT('a')" +CALL p3('DECODE(''1'',''2'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT DECODE('1','2') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode('1','2') AS `DECODE('1','2')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.DECODE('1','2') +errmsg +ERROR: FUNCTION unknown_schema.DECODE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.DECODE('1','2') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode('1','2') AS `mariadb_schema.DECODE('1','2')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.DECODE('1','2') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode('1','2') AS `maxdb_schema.DECODE('1','2')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.DECODE('1','2') +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT DECODE('1','2') +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.DECODE('1','2') +errmsg +ERROR: FUNCTION unknown_schema.DECODE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.DECODE('1','2') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.decode('1','2') AS "mariadb_schema.DECODE('1','2')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.DECODE('1','2') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.decode('1','2') AS "maxdb_schema.DECODE('1','2')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.DECODE('1','2') +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +CALL p3('DECODE(1,1,10)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT DECODE(1,1,10) +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.DECODE(1,1,10) +errmsg +ERROR: FUNCTION unknown_schema.DECODE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.DECODE(1,1,10) +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.DECODE(1,1,10) +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.DECODE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.decode(1,1,10) AS `oracle_schema.DECODE(1,1,10)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT DECODE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode(1,1,10) AS "DECODE(1,1,10)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.DECODE(1,1,10) +errmsg +ERROR: FUNCTION unknown_schema.DECODE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.DECODE(1,1,10) +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.DECODE(1,1,10) +errmsg +ERROR: Incorrect parameter count in the call to native function 'DECODE' +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.DECODE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode(1,1,10) AS "oracle_schema.DECODE(1,1,10)" +Warnings: +Note 1003 select decode(1,1,10) AS "oracle_schema.DECODE(1,1,10)" +CALL p3('LTRIM(''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS `LTRIM('a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LTRIM('a') +errmsg +ERROR: FUNCTION unknown_schema.LTRIM does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS `mariadb_schema.LTRIM('a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS `maxdb_schema.LTRIM('a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.ltrim('a') AS `oracle_schema.LTRIM('a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS "LTRIM('a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LTRIM('a') +errmsg +ERROR: FUNCTION unknown_schema.LTRIM does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.ltrim('a') AS "mariadb_schema.LTRIM('a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.ltrim('a') AS "maxdb_schema.LTRIM('a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS "oracle_schema.LTRIM('a')" +Warnings: +Note 1003 select ltrim('a') AS "oracle_schema.LTRIM('a')" +CALL p3('RTRIM(''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS `RTRIM('a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RTRIM('a') +errmsg +ERROR: FUNCTION unknown_schema.RTRIM does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS `mariadb_schema.RTRIM('a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS `maxdb_schema.RTRIM('a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rtrim('a') AS `oracle_schema.RTRIM('a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS "RTRIM('a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RTRIM('a') +errmsg +ERROR: FUNCTION unknown_schema.RTRIM does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.rtrim('a') AS "mariadb_schema.RTRIM('a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.rtrim('a') AS "maxdb_schema.RTRIM('a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RTRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS "oracle_schema.RTRIM('a')" +Warnings: +Note 1003 select rtrim('a') AS "oracle_schema.RTRIM('a')" +CALL p3('LPAD(''a'',3)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS `LPAD('a',3)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LPAD('a',3) +errmsg +ERROR: FUNCTION unknown_schema.LPAD does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS `mariadb_schema.LPAD('a',3)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS `maxdb_schema.LPAD('a',3)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.lpad('a',3) AS `oracle_schema.LPAD('a',3)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS "LPAD('a',3)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LPAD('a',3) +errmsg +ERROR: FUNCTION unknown_schema.LPAD does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.lpad('a',3) AS "mariadb_schema.LPAD('a',3)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.lpad('a',3) AS "maxdb_schema.LPAD('a',3)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS "oracle_schema.LPAD('a',3)" +Warnings: +Note 1003 select lpad('a',3) AS "oracle_schema.LPAD('a',3)" +CALL p3('LPAD(''a'',3, '' '')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3,' ') AS `LPAD('a',3, ' ')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LPAD('a',3, ' ') +errmsg +ERROR: FUNCTION unknown_schema.LPAD does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3,' ') AS `mariadb_schema.LPAD('a',3, ' ')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3,' ') AS `maxdb_schema.LPAD('a',3, ' ')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.lpad('a',3,' ') AS `oracle_schema.LPAD('a',3, ' ')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3,' ') AS "LPAD('a',3, ' ')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LPAD('a',3, ' ') +errmsg +ERROR: FUNCTION unknown_schema.LPAD does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.lpad('a',3,' ') AS "mariadb_schema.LPAD('a',3, ' ')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.lpad('a',3,' ') AS "maxdb_schema.LPAD('a',3, ' ')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3,' ') AS "oracle_schema.LPAD('a',3, ' ')" +Warnings: +Note 1003 select lpad('a',3,' ') AS "oracle_schema.LPAD('a',3, ' ')" +CALL p3('RPAD(''a'',3)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS `RPAD('a',3)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RPAD('a',3) +errmsg +ERROR: FUNCTION unknown_schema.RPAD does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS `mariadb_schema.RPAD('a',3)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS `maxdb_schema.RPAD('a',3)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rpad('a',3) AS `oracle_schema.RPAD('a',3)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS "RPAD('a',3)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RPAD('a',3) +errmsg +ERROR: FUNCTION unknown_schema.RPAD does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.rpad('a',3) AS "mariadb_schema.RPAD('a',3)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.rpad('a',3) AS "maxdb_schema.RPAD('a',3)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RPAD('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS "oracle_schema.RPAD('a',3)" +Warnings: +Note 1003 select rpad('a',3) AS "oracle_schema.RPAD('a',3)" +CALL p3('RPAD(''a'',3, '' '')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3,' ') AS `RPAD('a',3, ' ')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RPAD('a',3, ' ') +errmsg +ERROR: FUNCTION unknown_schema.RPAD does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3,' ') AS `mariadb_schema.RPAD('a',3, ' ')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3,' ') AS `maxdb_schema.RPAD('a',3, ' ')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rpad('a',3,' ') AS `oracle_schema.RPAD('a',3, ' ')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3,' ') AS "RPAD('a',3, ' ')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RPAD('a',3, ' ') +errmsg +ERROR: FUNCTION unknown_schema.RPAD does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.rpad('a',3,' ') AS "mariadb_schema.RPAD('a',3, ' ')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.rpad('a',3,' ') AS "maxdb_schema.RPAD('a',3, ' ')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RPAD('a',3, ' ') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3,' ') AS "oracle_schema.RPAD('a',3, ' ')" +Warnings: +Note 1003 select rpad('a',3,' ') AS "oracle_schema.RPAD('a',3, ' ')" +CALL p3('REPLACE()'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE() +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE() +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE() +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE() +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE() +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE() +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE() +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE() +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE() +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE() +errmsg +ERROR: Function 'REPLACE' is not defined +CALL p3('REPLACE(''a'',''b'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE('a','b') +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE('a','b') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE('a','b') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE('a','b') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE('a','b') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE('a','b') +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE('a','b') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE('a','b') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE('a','b') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE('a','b') +errmsg +ERROR: Function 'REPLACE' is not defined +CALL p3('REPLACE(''a'',''b'',''c'',''d'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE('a','b','c','d') +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''d')' at line 1 +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE('a','b','c','d') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE('a','b','c','d') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE('a','b','c','d') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE('a','b','c','d') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE('a','b','c','d') +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''d')' at line 1 +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE('a','b','c','d') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE('a','b','c','d') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE('a','b','c','d') +errmsg +ERROR: Function 'REPLACE' is not defined +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE('a','b','c','d') +errmsg +ERROR: Function 'REPLACE' is not defined +CALL p3('REPLACE(''a'',''b'',''c'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS `REPLACE('a','b','c')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE('a','b','c') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS `mariadb_schema.REPLACE('a','b','c')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS `maxdb_schema.REPLACE('a','b','c')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.replace('a','b','c') AS `oracle_schema.REPLACE('a','b','c')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS "REPLACE('a','b','c')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE('a','b','c') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.replace('a','b','c') AS "mariadb_schema.REPLACE('a','b','c')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.replace('a','b','c') AS "maxdb_schema.REPLACE('a','b','c')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS "oracle_schema.REPLACE('a','b','c')" +Warnings: +Note 1003 select replace('a','b','c') AS "oracle_schema.REPLACE('a','b','c')" +CALL p3('SUBSTR()'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR() +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR() +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR() +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR() +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR() +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR() +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR() +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR() +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR() +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR() +errmsg +ERROR: Function 'SUBSTR' is not defined +CALL p3('SUBSTR(''a'',1,2,3)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR('a',1,2,3) +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '3)' at line 1 +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR('a',1,2,3) +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '3)' at line 1 +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: Function 'SUBSTR' is not defined +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR('a',1,2,3) +errmsg +ERROR: Function 'SUBSTR' is not defined +CALL p3('SUBSTR(''a'',1,2)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS `SUBSTR('a',1,2)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR('a',1,2) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS `mariadb_schema.SUBSTR('a',1,2)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS `maxdb_schema.SUBSTR('a',1,2)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1,2) AS `oracle_schema.SUBSTR('a',1,2)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "SUBSTR('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR('a',1,2) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1,2) AS "mariadb_schema.SUBSTR('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1,2) AS "maxdb_schema.SUBSTR('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "oracle_schema.SUBSTR('a',1,2)" +Warnings: +Note 1003 select substr('a',1,2) AS "oracle_schema.SUBSTR('a',1,2)" +CALL p3('SUBSTR(''a'' FROM 1)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS `SUBSTR('a' FROM 1)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR('a' FROM 1) +errmsg +ERROR: Function 'unknown_schema.SUBSTR' is not defined +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS `mariadb_schema.SUBSTR('a' FROM 1)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS `maxdb_schema.SUBSTR('a' FROM 1)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1) AS `oracle_schema.SUBSTR('a' FROM 1)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS "SUBSTR('a' FROM 1)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR('a' FROM 1) +errmsg +ERROR: Function 'unknown_schema.SUBSTR' is not defined +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1) AS "mariadb_schema.SUBSTR('a' FROM 1)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1) AS "maxdb_schema.SUBSTR('a' FROM 1)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS "oracle_schema.SUBSTR('a' FROM 1)" +Warnings: +Note 1003 select substr('a',1) AS "oracle_schema.SUBSTR('a' FROM 1)" +CALL p3('SUBSTRING(''a'',1,2)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS `SUBSTRING('a',1,2)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTRING('a',1,2) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTRING does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS `mariadb_schema.SUBSTRING('a',1,2)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS `maxdb_schema.SUBSTRING('a',1,2)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1,2) AS `oracle_schema.SUBSTRING('a',1,2)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "SUBSTRING('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTRING('a',1,2) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTRING does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1,2) AS "mariadb_schema.SUBSTRING('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1,2) AS "maxdb_schema.SUBSTRING('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTRING('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "oracle_schema.SUBSTRING('a',1,2)" +Warnings: +Note 1003 select substr('a',1,2) AS "oracle_schema.SUBSTRING('a',1,2)" +CALL p3('SUBSTRING(''a'' FROM 1)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS `SUBSTRING('a' FROM 1)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTRING('a' FROM 1) +errmsg +ERROR: Function 'unknown_schema.SUBSTRING' is not defined +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS `mariadb_schema.SUBSTRING('a' FROM 1)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS `maxdb_schema.SUBSTRING('a' FROM 1)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1) AS `oracle_schema.SUBSTRING('a' FROM 1)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS "SUBSTRING('a' FROM 1)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTRING('a' FROM 1) +errmsg +ERROR: Function 'unknown_schema.SUBSTRING' is not defined +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1) AS "mariadb_schema.SUBSTRING('a' FROM 1)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.substr('a',1) AS "maxdb_schema.SUBSTRING('a' FROM 1)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTRING('a' FROM 1) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1) AS "oracle_schema.SUBSTRING('a' FROM 1)" +Warnings: +Note 1003 select substr('a',1) AS "oracle_schema.SUBSTRING('a' FROM 1)" +CALL p3('TRIM()'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM() +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM() +errmsg +ERROR: FUNCTION unknown_schema.TRIM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM() +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM() +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM() +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM() +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1 +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM() +errmsg +ERROR: FUNCTION unknown_schema.TRIM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM() +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM() +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM() +errmsg +ERROR: Function 'TRIM' is not defined +CALL p3('TRIM(1,2)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM(1,2) +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '2)' at line 1 +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM(1,2) +errmsg +ERROR: FUNCTION unknown_schema.TRIM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM(1,2) +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM(1,2) +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM(1,2) +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM(1,2) +errmsg +ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '2)' at line 1 +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM(1,2) +errmsg +ERROR: FUNCTION unknown_schema.TRIM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM(1,2) +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM(1,2) +errmsg +ERROR: Function 'TRIM' is not defined +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM(1,2) +errmsg +ERROR: Function 'TRIM' is not defined +CALL p3('TRIM(''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim('a') AS `TRIM('a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM('a') +errmsg +ERROR: FUNCTION unknown_schema.TRIM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim('a') AS `mariadb_schema.TRIM('a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim('a') AS `maxdb_schema.TRIM('a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.trim('a') AS `oracle_schema.TRIM('a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim('a') AS "TRIM('a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM('a') +errmsg +ERROR: FUNCTION unknown_schema.TRIM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.trim('a') AS "mariadb_schema.TRIM('a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.trim('a') AS "maxdb_schema.TRIM('a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim('a') AS "oracle_schema.TRIM('a')" +Warnings: +Note 1003 select trim('a') AS "oracle_schema.TRIM('a')" +CALL p3('TRIM(BOTH '' '' FROM ''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim(both ' ' from 'a') AS `TRIM(BOTH ' ' FROM 'a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM(BOTH ' ' FROM 'a') +errmsg +ERROR: Function 'unknown_schema.TRIM' is not defined +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim(both ' ' from 'a') AS `mariadb_schema.TRIM(BOTH ' ' FROM 'a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim(both ' ' from 'a') AS `maxdb_schema.TRIM(BOTH ' ' FROM 'a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.trim(both ' ' from 'a') AS `oracle_schema.TRIM(BOTH ' ' FROM 'a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim(both ' ' from 'a') AS "TRIM(BOTH ' ' FROM 'a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.TRIM(BOTH ' ' FROM 'a') +errmsg +ERROR: Function 'unknown_schema.TRIM' is not defined +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.trim(both ' ' from 'a') AS "mariadb_schema.TRIM(BOTH ' ' FROM 'a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.trim(both ' ' from 'a') AS "maxdb_schema.TRIM(BOTH ' ' FROM 'a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.TRIM(BOTH ' ' FROM 'a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select trim(both ' ' from 'a') AS "oracle_schema.TRIM(BOTH ' ' FROM 'a')" +Warnings: +Note 1003 select trim(both ' ' from 'a') AS "oracle_schema.TRIM(BOTH ' ' FROM 'a')" +CALL p3('REGEXP_REPLACE(''test'',''t'','''')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select regexp_replace('test','t','') AS `REGEXP_REPLACE('test','t','')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REGEXP_REPLACE('test','t','') +errmsg +ERROR: FUNCTION unknown_schema.REGEXP_REPLACE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select regexp_replace('test','t','') AS `mariadb_schema.REGEXP_REPLACE('test','t','')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select regexp_replace('test','t','') AS `maxdb_schema.REGEXP_REPLACE('test','t','')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.regexp_replace('test','t','') AS `oracle_schema.REGEXP_REPLACE('test','t','')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select regexp_replace('test','t','') AS "REGEXP_REPLACE('test','t','')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REGEXP_REPLACE('test','t','') +errmsg +ERROR: FUNCTION unknown_schema.REGEXP_REPLACE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.regexp_replace('test','t','') AS "mariadb_schema.REGEXP_REPLACE('test','t','')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select mariadb_schema.regexp_replace('test','t','') AS "maxdb_schema.REGEXP_REPLACE('test','t','')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REGEXP_REPLACE('test','t','') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select regexp_replace('test','t','') AS "oracle_schema.REGEXP_REPLACE('test','t','')" +Warnings: +Note 1003 select regexp_replace('test','t','') AS "oracle_schema.REGEXP_REPLACE('test','t','')" +CALL p3('CONCAT_OPERATOR_ORACLE(''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.concat('a') AS `CONCAT_OPERATOR_ORACLE('a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.CONCAT_OPERATOR_ORACLE('a') +errmsg +ERROR: FUNCTION unknown_schema.CONCAT_OPERATOR_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.concat('a') AS `mariadb_schema.CONCAT_OPERATOR_ORACLE('a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.concat('a') AS `maxdb_schema.CONCAT_OPERATOR_ORACLE('a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.concat('a') AS `oracle_schema.CONCAT_OPERATOR_ORACLE('a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS "CONCAT_OPERATOR_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.CONCAT_OPERATOR_ORACLE('a') +errmsg +ERROR: FUNCTION unknown_schema.CONCAT_OPERATOR_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS "mariadb_schema.CONCAT_OPERATOR_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS "maxdb_schema.CONCAT_OPERATOR_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.CONCAT_OPERATOR_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select concat('a') AS "oracle_schema.CONCAT_OPERATOR_ORACLE('a')" +Warnings: +Note 1003 select concat('a') AS "oracle_schema.CONCAT_OPERATOR_ORACLE('a')" +CALL p3('DECODE_ORACLE(1,1,10)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.decode(1,1,10) AS `DECODE_ORACLE(1,1,10)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.DECODE_ORACLE(1,1,10) +errmsg +ERROR: FUNCTION unknown_schema.DECODE_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.decode(1,1,10) AS `mariadb_schema.DECODE_ORACLE(1,1,10)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.decode(1,1,10) AS `maxdb_schema.DECODE_ORACLE(1,1,10)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.decode(1,1,10) AS `oracle_schema.DECODE_ORACLE(1,1,10)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode(1,1,10) AS "DECODE_ORACLE(1,1,10)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.DECODE_ORACLE(1,1,10) +errmsg +ERROR: FUNCTION unknown_schema.DECODE_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode(1,1,10) AS "mariadb_schema.DECODE_ORACLE(1,1,10)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode(1,1,10) AS "maxdb_schema.DECODE_ORACLE(1,1,10)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.DECODE_ORACLE(1,1,10) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select decode(1,1,10) AS "oracle_schema.DECODE_ORACLE(1,1,10)" +Warnings: +Note 1003 select decode(1,1,10) AS "oracle_schema.DECODE_ORACLE(1,1,10)" +CALL p3('LTRIM_ORACLE(''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.ltrim('a') AS `LTRIM_ORACLE('a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LTRIM_ORACLE('a') +errmsg +ERROR: FUNCTION unknown_schema.LTRIM_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.ltrim('a') AS `mariadb_schema.LTRIM_ORACLE('a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.ltrim('a') AS `maxdb_schema.LTRIM_ORACLE('a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.ltrim('a') AS `oracle_schema.LTRIM_ORACLE('a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS "LTRIM_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LTRIM_ORACLE('a') +errmsg +ERROR: FUNCTION unknown_schema.LTRIM_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS "mariadb_schema.LTRIM_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS "maxdb_schema.LTRIM_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select ltrim('a') AS "oracle_schema.LTRIM_ORACLE('a')" +Warnings: +Note 1003 select ltrim('a') AS "oracle_schema.LTRIM_ORACLE('a')" +CALL p3('RTRIM_ORACLE(''a'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rtrim('a') AS `RTRIM_ORACLE('a')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RTRIM_ORACLE('a') +errmsg +ERROR: FUNCTION unknown_schema.RTRIM_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rtrim('a') AS `mariadb_schema.RTRIM_ORACLE('a')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rtrim('a') AS `maxdb_schema.RTRIM_ORACLE('a')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rtrim('a') AS `oracle_schema.RTRIM_ORACLE('a')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS "RTRIM_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RTRIM_ORACLE('a') +errmsg +ERROR: FUNCTION unknown_schema.RTRIM_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS "mariadb_schema.RTRIM_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS "maxdb_schema.RTRIM_ORACLE('a')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RTRIM_ORACLE('a') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rtrim('a') AS "oracle_schema.RTRIM_ORACLE('a')" +Warnings: +Note 1003 select rtrim('a') AS "oracle_schema.RTRIM_ORACLE('a')" +CALL p3('LPAD_ORACLE(''a'',3)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.lpad('a',3) AS `LPAD_ORACLE('a',3)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LPAD_ORACLE('a',3) +errmsg +ERROR: FUNCTION unknown_schema.LPAD_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.lpad('a',3) AS `mariadb_schema.LPAD_ORACLE('a',3)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.lpad('a',3) AS `maxdb_schema.LPAD_ORACLE('a',3)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.lpad('a',3) AS `oracle_schema.LPAD_ORACLE('a',3)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS "LPAD_ORACLE('a',3)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.LPAD_ORACLE('a',3) +errmsg +ERROR: FUNCTION unknown_schema.LPAD_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS "mariadb_schema.LPAD_ORACLE('a',3)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS "maxdb_schema.LPAD_ORACLE('a',3)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.LPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select lpad('a',3) AS "oracle_schema.LPAD_ORACLE('a',3)" +Warnings: +Note 1003 select lpad('a',3) AS "oracle_schema.LPAD_ORACLE('a',3)" +CALL p3('RPAD_ORACLE(''a'',3)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rpad('a',3) AS `RPAD_ORACLE('a',3)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RPAD_ORACLE('a',3) +errmsg +ERROR: FUNCTION unknown_schema.RPAD_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rpad('a',3) AS `mariadb_schema.RPAD_ORACLE('a',3)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rpad('a',3) AS `maxdb_schema.RPAD_ORACLE('a',3)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.rpad('a',3) AS `oracle_schema.RPAD_ORACLE('a',3)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS "RPAD_ORACLE('a',3)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.RPAD_ORACLE('a',3) +errmsg +ERROR: FUNCTION unknown_schema.RPAD_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS "mariadb_schema.RPAD_ORACLE('a',3)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS "maxdb_schema.RPAD_ORACLE('a',3)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.RPAD_ORACLE('a',3) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select rpad('a',3) AS "oracle_schema.RPAD_ORACLE('a',3)" +Warnings: +Note 1003 select rpad('a',3) AS "oracle_schema.RPAD_ORACLE('a',3)" +CALL p3('REPLACE_ORACLE(''a'',''b'',''c'')'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.replace('a','b','c') AS `REPLACE_ORACLE('a','b','c')` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE_ORACLE('a','b','c') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.replace('a','b','c') AS `mariadb_schema.REPLACE_ORACLE('a','b','c')` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.replace('a','b','c') AS `maxdb_schema.REPLACE_ORACLE('a','b','c')` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.replace('a','b','c') AS `oracle_schema.REPLACE_ORACLE('a','b','c')` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS "REPLACE_ORACLE('a','b','c')" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.REPLACE_ORACLE('a','b','c') +errmsg +ERROR: FUNCTION unknown_schema.REPLACE_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS "mariadb_schema.REPLACE_ORACLE('a','b','c')" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS "maxdb_schema.REPLACE_ORACLE('a','b','c')" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.REPLACE_ORACLE('a','b','c') +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select replace('a','b','c') AS "oracle_schema.REPLACE_ORACLE('a','b','c')" +Warnings: +Note 1003 select replace('a','b','c') AS "oracle_schema.REPLACE_ORACLE('a','b','c')" +CALL p3('SUBSTR_ORACLE(''a'',1,2)'); +---------- +sql_mode='' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1,2) AS `SUBSTR_ORACLE('a',1,2)` +---------- +sql_mode='' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR_ORACLE('a',1,2) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR_ORACLE does not exist +---------- +sql_mode='' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1,2) AS `mariadb_schema.SUBSTR_ORACLE('a',1,2)` +---------- +sql_mode='' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1,2) AS `maxdb_schema.SUBSTR_ORACLE('a',1,2)` +---------- +sql_mode='' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select oracle_schema.substr('a',1,2) AS `oracle_schema.SUBSTR_ORACLE('a',1,2)` +---------- +sql_mode='ORACLE' qualifier='' +query +EXPLAIN EXTENDED SELECT SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "SUBSTR_ORACLE('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='unknown_schema.' +query +EXPLAIN EXTENDED SELECT unknown_schema.SUBSTR_ORACLE('a',1,2) +errmsg +ERROR: FUNCTION unknown_schema.SUBSTR_ORACLE does not exist +---------- +sql_mode='ORACLE' qualifier='mariadb_schema.' +query +EXPLAIN EXTENDED SELECT mariadb_schema.SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "mariadb_schema.SUBSTR_ORACLE('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='maxdb_schema.' +query +EXPLAIN EXTENDED SELECT maxdb_schema.SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "maxdb_schema.SUBSTR_ORACLE('a',1,2)" +---------- +sql_mode='ORACLE' qualifier='oracle_schema.' +query +EXPLAIN EXTENDED SELECT oracle_schema.SUBSTR_ORACLE('a',1,2) +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Level Code Message +Note 1003 select substr('a',1,2) AS "oracle_schema.SUBSTR_ORACLE('a',1,2)" +Warnings: +Note 1003 select substr('a',1,2) AS "oracle_schema.SUBSTR_ORACLE('a',1,2)" +SELECT oracle_schema.SUBSTR_ORACLE('a' FROM 1 FOR 2); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FROM 1 FOR 2)' at line 1 +SELECT oracle_schema.SUBSTR('a' FROM 1 FOR 2); +oracle_schema.SUBSTR('a' FROM 1 FOR 2) +a +SELECT oracle_schema.TRIM_ORACLE(LEADING ' ' FROM 'a'); +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LEADING ' ' FROM 'a')' at line 1 +SELECT oracle_schema.TRIM(LEADING ' ' FROM 'a'); +oracle_schema.TRIM(LEADING ' ' FROM 'a') +a +SELECT oracle_schema.TRIM_ORACLE('a'); +ERROR HY000: Function 'TRIM_ORACLE' is not defined +SELECT oracle_schema.TRIM('a'); +oracle_schema.TRIM('a') +a +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE p3; +SET sql_mode=''; +CREATE VIEW v1 AS SELECT +concat('a','b'), +decode('1','2'), +ltrim('1'), +rtrim('1'), +lpad('1','2', 3), +rpad('1','2', 3), +replace('1','2','3'), +substr('a',1,2), +trim(both 'a' FROM 'b'); +CREATE TABLE kv (v BLOB); +LOAD DATA INFILE 'MYSQLD_DATADIR/test/v1.frm' REPLACE INTO TABLE kv; +SELECT v FROM kv WHERE v RLIKE '^(query|view_body_utf8)=' ORDER BY v; +v +query=select concat('a','b') AS `concat('a','b')`,decode('1','2') AS `decode('1','2')`,ltrim('1') AS `ltrim('1')`,rtrim('1') AS `rtrim('1')`,lpad('1','2',3) AS `lpad('1','2', 3)`,rpad('1','2',3) AS `rpad('1','2', 3)`,replace('1','2','3') AS `replace('1','2','3')`,substr('a',1,2) AS `substr('a',1,2)`,trim(both 'a' from 'b') AS `trim(both 'a' FROM 'b')` +view_body_utf8=select concat('a','b') AS `concat('a','b')`,decode('1','2') AS `decode('1','2')`,ltrim('1') AS `ltrim('1')`,rtrim('1') AS `rtrim('1')`,lpad('1','2',3) AS `lpad('1','2', 3)`,rpad('1','2',3) AS `rpad('1','2', 3)`,replace('1','2','3') AS `replace('1','2','3')`,substr('a',1,2) AS `substr('a',1,2)`,trim(both 'a' from 'b') AS `trim(both 'a' FROM 'b')` +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='v1' AND TABLE_SCHEMA='test'; +VIEW_DEFINITION +select concat('a','b') AS `concat('a','b')`,decode('1','2') AS `decode('1','2')`,ltrim('1') AS `ltrim('1')`,rtrim('1') AS `rtrim('1')`,lpad('1','2',3) AS `lpad('1','2', 3)`,rpad('1','2',3) AS `rpad('1','2', 3)`,replace('1','2','3') AS `replace('1','2','3')`,substr('a',1,2) AS `substr('a',1,2)`,trim(both 'a' from 'b') AS `trim(both 'a' FROM 'b')` +DROP TABLE kv; +DROP VIEW v1; +SET sql_mode='ORACLE'; +CREATE VIEW v1 AS SELECT +concat('a','b'), +decode('1',2,3), +ltrim('1'), +rtrim('1'), +lpad('1','2', 3), +rpad('1','2', 3), +replace('1','2','3'), +substr('a',1,2), +trim(both 'a' FROM 'b'); +CREATE TABLE kv (v BLOB); +LOAD DATA INFILE 'MYSQLD_DATADIR/test/v1.frm' REPLACE INTO TABLE kv; +SELECT v FROM kv WHERE v RLIKE '^(query|view_body_utf8)=' ORDER BY v; +v +query=select concat_operator_oracle('a','b') AS `concat('a','b')`,decode_oracle('1',2,3) AS `decode('1',2,3)`,ltrim_oracle('1') AS `ltrim('1')`,rtrim_oracle('1') AS `rtrim('1')`,lpad_oracle('1','2',3) AS `lpad('1','2', 3)`,rpad_oracle('1','2',3) AS `rpad('1','2', 3)`,replace_oracle('1','2','3') AS `replace('1','2','3')`,substr_oracle('a',1,2) AS `substr('a',1,2)`,trim_oracle(both 'a' from 'b') AS `trim(both 'a' FROM 'b')` +view_body_utf8=select oracle_schema.concat('a','b') AS `concat('a','b')`,oracle_schema.decode('1',2,3) AS `decode('1',2,3)`,oracle_schema.ltrim('1') AS `ltrim('1')`,oracle_schema.rtrim('1') AS `rtrim('1')`,oracle_schema.lpad('1','2',3) AS `lpad('1','2', 3)`,oracle_schema.rpad('1','2',3) AS `rpad('1','2', 3)`,oracle_schema.replace('1','2','3') AS `replace('1','2','3')`,oracle_schema.substr('a',1,2) AS `substr('a',1,2)`,oracle_schema.trim(both 'a' from 'b') AS `trim(both 'a' FROM 'b')` +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='v1' AND TABLE_SCHEMA='test'; +VIEW_DEFINITION +select oracle_schema.concat('a','b') AS `concat('a','b')`,oracle_schema.decode('1',2,3) AS `decode('1',2,3)`,oracle_schema.ltrim('1') AS `ltrim('1')`,oracle_schema.rtrim('1') AS `rtrim('1')`,oracle_schema.lpad('1','2',3) AS `lpad('1','2', 3)`,oracle_schema.rpad('1','2',3) AS `rpad('1','2', 3)`,oracle_schema.replace('1','2','3') AS `replace('1','2','3')`,oracle_schema.substr('a',1,2) AS `substr('a',1,2)`,oracle_schema.trim(both 'a' from 'b') AS `trim(both 'a' FROM 'b')` +DROP TABLE kv; +DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_regexp_replace.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_regexp_replace.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_regexp_replace.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_regexp_replace.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,34 @@ +SET sql_mode=ORACLE; +# +# MDEV-29095 REGEXP_REPLACE treats empty strings different than REPLACE in ORACLE mode +# +CREATE TABLE t1 (replacement VARCHAR(10)); +INSERT INTO t1 VALUES (NULL), (''); +SELECT replacement, REGEXP_REPLACE('abba','a',replacement) FROM t1 ORDER BY replacement; +replacement REGEXP_REPLACE('abba','a',replacement) +NULL bb + bb +DROP TABLE t1; +SELECT REGEXP_REPLACE('abba','a',null); +REGEXP_REPLACE('abba','a',null) +bb +EXPLAIN EXTENDED SELECT REPLACE('abba','a',null) ; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used +Warnings: +Note 1003 select replace('abba','a',NULL) AS "REPLACE('abba','a',null)" +CREATE VIEW v1 AS SELECT REPLACE('abba','a',null) ; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE VIEW "v1" AS select replace('abba','a',NULL) AS "REPLACE('abba','a',null)" latin1 latin1_swedish_ci +SELECT * FROM v1; +REPLACE('abba','a',null) +bb +SET sql_mode=DEFAULT; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select oracle_schema.replace('abba','a',NULL) AS `REPLACE('abba','a',null)` latin1 latin1_swedish_ci +SELECT * FROM v1; +REPLACE('abba','a',null) +bb +DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_replace.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_replace.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_replace.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_replace.result 2024-08-03 07:29:57.000000000 +0000 @@ -21,11 +21,11 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select replace_oracle('ab','a',NULL) AS "REPLACE('ab','a',null)" +Note 1003 select replace('ab','a',NULL) AS "REPLACE('ab','a',null)" CREATE VIEW v1 AS SELECT REPLACE('ab','a',null) ; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select replace_oracle('ab','a',NULL) AS "REPLACE('ab','a',null)" latin1 latin1_swedish_ci +v1 CREATE VIEW "v1" AS select replace('ab','a',NULL) AS "REPLACE('ab','a',null)" latin1 latin1_swedish_ci SELECT * FROM v1; REPLACE('ab','a',null) b diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_substr.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_substr.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_substr.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_substr.result 2024-08-03 07:29:57.000000000 +0000 @@ -76,11 +76,11 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select substr_oracle('abc',2,1) AS "SUBSTR('abc',2,1)" +Note 1003 select substr('abc',2,1) AS "SUBSTR('abc',2,1)" CREATE VIEW v1 AS SELECT SUBSTR('abc',2,1) ; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select substr_oracle('abc',2,1) AS "SUBSTR('abc',2,1)" latin1 latin1_swedish_ci +v1 CREATE VIEW "v1" AS select substr('abc',2,1) AS "SUBSTR('abc',2,1)" latin1 latin1_swedish_ci SELECT * FROM v1; SUBSTR('abc',2,1) b diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_trim.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_trim.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/func_trim.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/func_trim.result 2024-08-03 07:29:57.000000000 +0000 @@ -116,13 +116,13 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select trim_oracle('abc') AS "TRIM('abc')",trim_oracle(both 'a' from 'abc') AS "TRIM(BOTH 'a' FROM 'abc')",trim_oracle(leading 'a' from 'abc') AS "TRIM(LEADING 'a' FROM 'abc')",trim_oracle(trailing 'a' from 'abc') AS "TRIM(TRAILING 'a' FROM 'abc')" +Note 1003 select trim('abc') AS "TRIM('abc')",trim(both 'a' from 'abc') AS "TRIM(BOTH 'a' FROM 'abc')",trim(leading 'a' from 'abc') AS "TRIM(LEADING 'a' FROM 'abc')",trim(trailing 'a' from 'abc') AS "TRIM(TRAILING 'a' FROM 'abc')" EXPLAIN EXTENDED SELECT RTRIM('abc'), LTRIM('abc'); id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: -Note 1003 select rtrim_oracle('abc') AS "RTRIM('abc')",ltrim_oracle('abc') AS "LTRIM('abc')" +Note 1003 select rtrim('abc') AS "RTRIM('abc')",ltrim('abc') AS "LTRIM('abc')" CREATE VIEW v1 AS SELECT ord,TRIM('abc'),RTRIM('abc'),LTRIM('abc'), '['||c1||']', TRIM(LEADING 'a' FROM c1), @@ -133,7 +133,7 @@ FROM t1 ORDER BY ord ; SHOW CREATE VIEW v1; View Create View character_set_client collation_connection -v1 CREATE VIEW "v1" AS select "t1"."ord" AS "ord",trim_oracle('abc') AS "TRIM('abc')",rtrim_oracle('abc') AS "RTRIM('abc')",ltrim_oracle('abc') AS "LTRIM('abc')",concat_operator_oracle(concat_operator_oracle('[',"t1"."c1"),']') AS "'['||c1||']'",trim_oracle(leading 'a' from "t1"."c1") AS "TRIM(LEADING 'a' FROM c1)",trim_oracle(trailing 'a' from "t1"."c1") AS "TRIM(TRAILING 'a' FROM c1)",trim_oracle(both 'a' from "t1"."c1") AS "TRIM(BOTH 'a' FROM c1)",ltrim_oracle("t1"."c1") AS "LTRIM(c1)",rtrim_oracle("t1"."c1") AS "RTRIM(c1)" from "t1" order by "t1"."ord" latin1 latin1_swedish_ci +v1 CREATE VIEW "v1" AS select "t1"."ord" AS "ord",trim('abc') AS "TRIM('abc')",rtrim('abc') AS "RTRIM('abc')",ltrim('abc') AS "LTRIM('abc')",concat(concat('[',"t1"."c1"),']') AS "'['||c1||']'",trim(leading 'a' from "t1"."c1") AS "TRIM(LEADING 'a' FROM c1)",trim(trailing 'a' from "t1"."c1") AS "TRIM(TRAILING 'a' FROM c1)",trim(both 'a' from "t1"."c1") AS "TRIM(BOTH 'a' FROM c1)",ltrim("t1"."c1") AS "LTRIM(c1)",rtrim("t1"."c1") AS "RTRIM(c1)" from "t1" order by "t1"."ord" latin1 latin1_swedish_ci SELECT * FROM v1; ord TRIM('abc') RTRIM('abc') LTRIM('abc') '['||c1||']' TRIM(LEADING 'a' FROM c1) TRIM(TRAILING 'a' FROM c1) TRIM(BOTH 'a' FROM c1) LTRIM(c1) RTRIM(c1) 1 abc abc abc [abc] bc abc bc abc abc diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/gis.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/gis.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/gis.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/gis.result 2024-08-03 07:29:57.000000000 +0000 @@ -33,37 +33,37 @@ # MDEV-20009 Add CAST(expr AS pluggable_type) # SELECT CAST(1 AS GEOMETRY); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometry)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometry)' SELECT CAST(1 AS GEOMETRYCOLLECTION); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometrycollection)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometrycollection)' SELECT CAST(1 AS POINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS point)' +ERROR HY000: Operator does not exist: 'CAST(expr AS point)' SELECT CAST(1 AS LINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS linestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS linestring)' SELECT CAST(1 AS POLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS polygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS polygon)' SELECT CAST(1 AS MULTIPOINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipoint)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipoint)' SELECT CAST(1 AS MULTILINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS multilinestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multilinestring)' SELECT CAST(1 AS MULTIPOLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipolygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipolygon)' SELECT CONVERT(1, GEOMETRY); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometry)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometry)' SELECT CONVERT(1, GEOMETRYCOLLECTION); -ERROR HY000: Operator does not exists: 'CAST(expr AS geometrycollection)' +ERROR HY000: Operator does not exist: 'CAST(expr AS geometrycollection)' SELECT CONVERT(1, POINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS point)' +ERROR HY000: Operator does not exist: 'CAST(expr AS point)' SELECT CONVERT(1, LINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS linestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS linestring)' SELECT CONVERT(1, POLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS polygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS polygon)' SELECT CONVERT(1, MULTIPOINT); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipoint)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipoint)' SELECT CONVERT(1, MULTILINESTRING); -ERROR HY000: Operator does not exists: 'CAST(expr AS multilinestring)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multilinestring)' SELECT CONVERT(1, MULTIPOLYGON); -ERROR HY000: Operator does not exists: 'CAST(expr AS multipolygon)' +ERROR HY000: Operator does not exist: 'CAST(expr AS multipolygon)' # # End of 10.5 tests # diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/mysqldump_restore_func_qualified.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,113 @@ +# +# Start of 10.4 tests +# +# +# MDEV-27744 LPAD in vcol created in ORACLE mode makes table corrupted in non-ORACLE +# +SET sql_mode=DEFAULT; +CREATE TABLE t1 ( +a0 VARCHAR(64) NOT NULL DEFAULT LTRIM(now()), +a1 VARCHAR(64) AS (LTRIM(a0)) PERSISTENT, +b0 VARCHAR(64) NOT NULL DEFAULT LPAD(now(),10), +b1 VARCHAR(64) AS (LPAD(b0,10)) PERSISTENT +); +CREATE VIEW v1 AS SELECT +LTRIM(now()) AS a0, +LPAD(now(),10) AS b0; +SET sql_mode=ORACLE; +CREATE TABLE t2 ( +a0 VARCHAR(64) NOT NULL DEFAULT LTRIM(now()), +a1 VARCHAR(64) AS (LTRIM(a0)) PERSISTENT, +b0 VARCHAR(64) NOT NULL DEFAULT LPAD(now(),10), +b1 VARCHAR(64) AS (LPAD(b0,10)) PERSISTENT +); +CREATE VIEW v2 AS SELECT +LTRIM(now()) AS a0, +LPAD(now(),10) AS b0; +/*M!999999\- enable the sandbox mode */ +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `t1` ( + `a0` varchar(64) NOT NULL DEFAULT ltrim(current_timestamp()), + `a1` varchar(64) GENERATED ALWAYS AS (ltrim(`a0`)) STORED, + `b0` varchar(64) NOT NULL DEFAULT lpad(current_timestamp(),10), + `b1` varchar(64) GENERATED ALWAYS AS (lpad(`b0`,10)) STORED +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `t2` ( + `a0` varchar(64) NOT NULL DEFAULT ltrim_oracle(current_timestamp()), + `a1` varchar(64) GENERATED ALWAYS AS (ltrim_oracle(`a0`)) STORED, + `b0` varchar(64) NOT NULL DEFAULT lpad_oracle(current_timestamp(),10), + `b1` varchar(64) GENERATED ALWAYS AS (lpad_oracle(`b0`,10)) STORED +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `v1` AS SELECT + 1 AS `a0`, + 1 AS `b0` */; +SET character_set_client = @saved_cs_client; +SET @saved_cs_client = @@character_set_client; +SET character_set_client = utf8; +/*!50001 CREATE VIEW `v2` AS SELECT + 1 AS `a0`, + 1 AS `b0` */; +SET character_set_client = @saved_cs_client; +/*!50001 DROP VIEW IF EXISTS `v1`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = latin1 */; +/*!50001 SET character_set_results = latin1 */; +/*!50001 SET collation_connection = latin1_swedish_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `v1` AS select ltrim(current_timestamp()) AS `a0`,lpad(current_timestamp(),10) AS `b0` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +/*!50001 DROP VIEW IF EXISTS `v2`*/; +/*!50001 SET @saved_cs_client = @@character_set_client */; +/*!50001 SET @saved_cs_results = @@character_set_results */; +/*!50001 SET @saved_col_connection = @@collation_connection */; +/*!50001 SET character_set_client = latin1 */; +/*!50001 SET character_set_results = latin1 */; +/*!50001 SET collation_connection = latin1_swedish_ci */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `v2` AS select oracle_schema.ltrim(current_timestamp()) AS `a0`,oracle_schema.lpad(current_timestamp(),10) AS `b0` */; +/*!50001 SET character_set_client = @saved_cs_client */; +/*!50001 SET character_set_results = @saved_cs_results */; +/*!50001 SET collation_connection = @saved_col_connection */; +DROP TABLE t1,t2; +DROP VIEW v1,v2; +SET sql_mode=DEFAULT; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a0` varchar(64) NOT NULL DEFAULT ltrim(current_timestamp()), + `a1` varchar(64) GENERATED ALWAYS AS (ltrim(`a0`)) STORED, + `b0` varchar(64) NOT NULL DEFAULT lpad(current_timestamp(),10), + `b1` varchar(64) GENERATED ALWAYS AS (lpad(`b0`,10)) STORED +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a0` varchar(64) NOT NULL DEFAULT ltrim_oracle(current_timestamp()), + `a1` varchar(64) GENERATED ALWAYS AS (ltrim_oracle(`a0`)) STORED, + `b0` varchar(64) NOT NULL DEFAULT lpad_oracle(current_timestamp(),10), + `b1` varchar(64) GENERATED ALWAYS AS (lpad_oracle(`b0`,10)) STORED +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select ltrim(current_timestamp()) AS `a0`,lpad(current_timestamp(),10) AS `b0` latin1 latin1_swedish_ci +SHOW CREATE VIEW v2; +View Create View character_set_client collation_connection +v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select oracle_schema.ltrim(current_timestamp()) AS `a0`,oracle_schema.lpad(current_timestamp(),10) AS `b0` latin1 latin1_swedish_ci +DROP TABLE t1,t2; +DROP VIEW v1, v2; +# +# End of 10.4 tests +# diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/parser.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/parser.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/parser.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/parser.result 2024-08-03 07:29:57.000000000 +0000 @@ -84,7 +84,7 @@ SELECT history FROM t1 SELECT history 'alias' FROM t1 SELECT history() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.history does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT history.history() Error 1630 FUNCTION history.history does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT history DATE FROM t1 @@ -106,7 +106,7 @@ SELECT next FROM t1 SELECT next 'alias' FROM t1 SELECT next() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.next does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT next.next() Error 1630 FUNCTION next.next does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT next DATE FROM t1 @@ -151,7 +151,7 @@ SELECT previous FROM t1 SELECT previous 'alias' FROM t1 SELECT previous() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.previous does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT previous.previous() Error 1630 FUNCTION previous.previous does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT previous DATE FROM t1 @@ -174,7 +174,7 @@ SELECT system FROM t1 SELECT system 'alias' FROM t1 SELECT system() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.system does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system.system() Error 1630 FUNCTION system.system does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system DATE FROM t1 @@ -196,7 +196,7 @@ SELECT system_time FROM t1 SELECT system_time 'alias' FROM t1 SELECT system_time() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.system_time does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system_time.system_time() Error 1630 FUNCTION system_time.system_time does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT system_time DATE FROM t1 @@ -264,7 +264,7 @@ SELECT transaction FROM t1 SELECT transaction 'alias' FROM t1 SELECT transaction() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.transaction does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT transaction.transaction() Error 1630 FUNCTION transaction.transaction does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT transaction DATE FROM t1 @@ -308,7 +308,7 @@ SELECT versioning FROM t1 SELECT versioning 'alias' FROM t1 SELECT versioning() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.versioning does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT versioning.versioning() Error 1630 FUNCTION versioning.versioning does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT versioning DATE FROM t1 @@ -330,7 +330,7 @@ SELECT without FROM t1 SELECT without 'alias' FROM t1 SELECT without() -Error 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '()' at line 1 +Error 1630 FUNCTION test.without does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT without.without() Error 1630 FUNCTION without.without does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual SELECT without DATE FROM t1 diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/ps.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/ps.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/ps.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/ps.result 2024-08-03 07:29:57.000000000 +0000 @@ -178,9 +178,9 @@ # Testing erroneous and diallowed prepare source # EXECUTE IMMEDIATE _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL'; -ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat_operator_oracle' +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat' PREPARE stmt FROM _latin1'SELECT 1 AS c FROM ' || _latin2 'DUAL'; -ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat_operator_oracle' +ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin2_general_ci,COERCIBLE) for operation 'concat' EXECUTE IMMEDIATE (SELECT 'SELECT 1'); ERROR 42000: EXECUTE IMMEDIATE does not support subqueries or stored functions PREPARE stmt FROM (SELECT 'SELECT 1'); diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result 2024-08-03 07:29:57.000000000 +0000 @@ -758,7 +758,7 @@ END; $$ CALL p1(); -ERROR HY000: Illegal mix of collations (latin1_bin,EXPLICIT) and (latin1_swedish_ci,EXPLICIT) for operation 'concat_operator_oracle' +ERROR HY000: Illegal mix of collations (latin1_bin,EXPLICIT) and (latin1_swedish_ci,EXPLICIT) for operation 'concat' DROP PROCEDURE p1; # # Non-existing field diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result 2024-08-03 07:29:57.000000000 +0000 @@ -34,6 +34,7 @@ FUNCTION f1 RETURN INT; END; $$ +/*M!999999\- enable the sandbox mode */ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/r/vcol_innodb.result mariadb-10.11.9/mysql-test/suite/compat/oracle/r/vcol_innodb.result --- mariadb-10.11.6/mysql-test/suite/compat/oracle/r/vcol_innodb.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/r/vcol_innodb.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,54 @@ +# +# MDEV-27744 LPAD in vcol created in ORACLE mode makes table corrupted in non-ORACLE +# +FLUSH TABLES; +SET sql_mode=''; +CREATE TABLE t (d INT,b VARCHAR(1),c CHAR(1),g CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b),KEY g(g)) ENGINE=InnoDB; +INSERT INTO t VALUES (0); +ERROR 21S01: Column count doesn't match value count at row 1 +SET sql_mode='ORACLE'; +INSERT INTO t SET c=REPEAT (1,0); +Warnings: +Warning 1364 Field 'b' doesn't have a default value +ALTER TABLE t CHANGE COLUMN a b INT; +ERROR 42S22: Unknown column 'a' in 't' +DELETE FROM t; +SET sql_mode=''; +FLUSH TABLES; +INSERT INTO t SET c='0'; +Warnings: +Warning 1364 Field 'b' doesn't have a default value +DROP TABLE t; +FLUSH TABLES; +SET sql_mode=''; +CREATE TABLE t (a INT(1),d INT(1),b VARCHAR(1),c CHAR(1),vadc INT(1) GENERATED ALWAYS AS ( (a + length (d))) STORED,vbc CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,vbidxc CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b (1),a,d),KEY d (d),KEY a (a),KEY c_renamed (c (1),b (1)),KEY b (b (1),c (1),a),KEY vbidxc (vbidxc),KEY a_2 (a,vbidxc),KEY vbidxc_2 (vbidxc,d)) DEFAULT CHARSET=latin1 ENGINE=InnoDB; +INSERT INTO t VALUES (0,0,1,0,1,0,1,0,0); +ERROR 21S01: Column count doesn't match value count at row 1 +SET SESSION sql_mode='ORACLE'; +INSERT INTO t SET c=REPEAT (1,0); +Warnings: +Warning 1364 Field 'a' doesn't have a default value +Warning 1364 Field 'd' doesn't have a default value +Warning 1364 Field 'b' doesn't have a default value +ALTER TABLE t CHANGE COLUMN a b CHAR(1); +ERROR 42S21: Duplicate column name 'b' +DELETE FROM t; +SET SESSION sql_mode=DEFAULT; +DROP TABLE t; +SET sql_mode=''; +CREATE TABLE t1 (d INT,b VARCHAR(1),c CHAR(1),g CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b),KEY g(g)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (0); +ERROR 21S01: Column count doesn't match value count at row 1 +SET sql_mode='ORACLE'; +INSERT INTO t1 SET c=REPEAT (1,0); +Warnings: +Warning 1364 Field 'b' doesn't have a default value +ALTER TABLE t1 CHANGE COLUMN a b INT; +ERROR 42S22: Unknown column 'a' in 't1' +DELETE FROM t1; +SET sql_mode=''; +FLUSH TABLES; +INSERT INTO t1 SET c='0'; +Warnings: +Warning 1364 Field 'b' doesn't have a default value +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/t/column_compression.test mariadb-10.11.9/mysql-test/suite/compat/oracle/t/column_compression.test --- mariadb-10.11.6/mysql-test/suite/compat/oracle/t/column_compression.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/t/column_compression.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ --source include/have_innodb.inc --source include/have_csv.inc ---source include/have_normal_bzip.inc +--source include/have_normal_zlib.inc SET sql_mode=ORACLE; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/t/func_qualified.test mariadb-10.11.9/mysql-test/suite/compat/oracle/t/func_qualified.test --- mariadb-10.11.6/mysql-test/suite/compat/oracle/t/func_qualified.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/t/func_qualified.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,248 @@ +--let $MYSQLD_DATADIR= `select @@datadir` + +--echo # +--echo # MDEV-27744 LPAD in vcol created in ORACLE mode makes table corrupted in non-ORACLE +--echo # + +# +# Testing that the error message for DECODE preserves +# the exact letter case as typed by the user +# + +SET sql_mode=DEFAULT; +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT decode_oracle(1); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE_ORACLE(1); + +SET sql_mode=ORACLE; +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT decode_oracle(1); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE_ORACLE(1); + +SET sql_mode=DEFAULT; +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT decode(1); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE(1); + +SET sql_mode=ORACLE; +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT decode(1); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT DECODE(1); + +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT mariadb_schema.decode(1); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT mariadb_schema.DECODE(1); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT mariadb_schema.decode_oracle(1); +--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT +SELECT mariadb_schema.DECODE_ORACLE(1); + +# +# Testing that REPLACE, SUBSTR, TRIM print the exact name +# as typed by the user in "Function .. is not defined" +# + +SET sql_mode=DEFAULT; + +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.TRIM(1); +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.trim(1); + +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.TRIM(); +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.TRIM('a','b'); +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.TRIM('a','b','c','d'); + +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.SUBSTR('a',1,2); +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.substr('a',1,2); +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.SUBSTRING('a',1,2); +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.substring('a',1,2); + +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.REPLACE('a','b','c'); +--error ER_FUNC_INEXISTENT_NAME_COLLISION +SELECT unknown.replace('a','b','c'); + +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.REPLACE(); +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.REPLACE('a'); +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.REPLACE('a','b'); +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.REPLACE('a','b','c','d'); + +# +# Testing EXPLAIN EXTENDED SELECT +# + +SET sql_mode=DEFAULT; +DELIMITER $$; +CREATE PROCEDURE p1(sqlmode TEXT, qualifier TEXT, expr TEXT) +BEGIN + DECLARE query TEXT DEFAULT 'SELECT $(QUALIFIER)$(EXPR)'; + DECLARE errmsg TEXT DEFAULT NULL; + DECLARE CONTINUE HANDLER FOR 1064, 1128, 1305, 1582, 1630 + BEGIN + GET DIAGNOSTICS CONDITION 1 errmsg = MESSAGE_TEXT; + END; + + SET sql_mode=sqlmode; + SET query=REPLACE(query, '$(QUALIFIER)', qualifier); + SET query=REPLACE(query, '$(EXPR)', expr); + SET query= CONCAT('EXPLAIN EXTENDED ', query); + SELECT CONCAT('sql_mode=''',sqlmode,'''', ' ', + 'qualifier=''',qualifier,'''') AS `----------`; + SELECT query; + EXECUTE IMMEDIATE query; + IF errmsg IS NOT NULL THEN + SELECT CONCAT('ERROR: ', errmsg) AS errmsg; + ELSE + SHOW WARNINGS; + END IF; +END; +$$ +CREATE PROCEDURE p2(sqlmode TEXT, expr TEXT) +BEGIN + CALL p1(sqlmode, '', expr); + CALL p1(sqlmode, 'unknown_schema.', expr); + CALL p1(sqlmode, 'mariadb_schema.', expr); + CALL p1(sqlmode, 'maxdb_schema.', expr); + CALL p1(sqlmode, 'oracle_schema.', expr); +END; +$$ +CREATE PROCEDURE p3(expr TEXT) +BEGIN + CALL p2('', expr); + CALL p2('ORACLE', expr); +END; +$$ +DELIMITER ;$$ + +CALL p3('CONCAT(''a'')'); + +# MariaDB style +CALL p3('DECODE(''1'',''2'')'); +# Oracle style +CALL p3('DECODE(1,1,10)'); + +CALL p3('LTRIM(''a'')'); +CALL p3('RTRIM(''a'')'); + +CALL p3('LPAD(''a'',3)'); +CALL p3('LPAD(''a'',3, '' '')'); + +CALL p3('RPAD(''a'',3)'); +CALL p3('RPAD(''a'',3, '' '')'); + +CALL p3('REPLACE()'); +CALL p3('REPLACE(''a'',''b'')'); +CALL p3('REPLACE(''a'',''b'',''c'',''d'')'); +CALL p3('REPLACE(''a'',''b'',''c'')'); + +CALL p3('SUBSTR()'); +CALL p3('SUBSTR(''a'',1,2,3)'); +CALL p3('SUBSTR(''a'',1,2)'); +CALL p3('SUBSTR(''a'' FROM 1)'); + +CALL p3('SUBSTRING(''a'',1,2)'); +CALL p3('SUBSTRING(''a'' FROM 1)'); + +CALL p3('TRIM()'); +CALL p3('TRIM(1,2)'); +CALL p3('TRIM(''a'')'); +CALL p3('TRIM(BOTH '' '' FROM ''a'')'); + +CALL p3('REGEXP_REPLACE(''test'',''t'','''')'); + +# Deprecated compatibility XXX_ORACLE functions. +# These functions are implemented as simple native functions +# and have no special grammar rules in sql_yacc.yy. +# So they support the qualified syntax automatically, +# which is not absolutely required, but is not harmful. + +CALL p3('CONCAT_OPERATOR_ORACLE(''a'')'); +CALL p3('DECODE_ORACLE(1,1,10)'); +CALL p3('LTRIM_ORACLE(''a'')'); +CALL p3('RTRIM_ORACLE(''a'')'); +CALL p3('LPAD_ORACLE(''a'',3)'); +CALL p3('RPAD_ORACLE(''a'',3)'); +CALL p3('REPLACE_ORACLE(''a'',''b'',''c'')'); +CALL p3('SUBSTR_ORACLE(''a'',1,2)'); + + +# Deprecated compatibility XXX_ORACLE variants for functions +# with a special syntax in sql_yacc.yy. +# These compatibility functions do not support qualified syntax. +# One should use a qualified variant without the _ORACLE suffix instead. + +--error ER_PARSE_ERROR +SELECT oracle_schema.SUBSTR_ORACLE('a' FROM 1 FOR 2); +# Use this instead: +SELECT oracle_schema.SUBSTR('a' FROM 1 FOR 2); + +--error ER_PARSE_ERROR +SELECT oracle_schema.TRIM_ORACLE(LEADING ' ' FROM 'a'); +# Use this instead: +SELECT oracle_schema.TRIM(LEADING ' ' FROM 'a'); + +--error ER_FUNCTION_NOT_DEFINED +SELECT oracle_schema.TRIM_ORACLE('a'); +# Use this instead: +SELECT oracle_schema.TRIM('a'); + + +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE p3; + + +SET sql_mode=''; +CREATE VIEW v1 AS SELECT + concat('a','b'), + decode('1','2'), + ltrim('1'), + rtrim('1'), + lpad('1','2', 3), + rpad('1','2', 3), + replace('1','2','3'), + substr('a',1,2), + trim(both 'a' FROM 'b'); +CREATE TABLE kv (v BLOB); +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +eval LOAD DATA INFILE '$MYSQLD_DATADIR/test/v1.frm' REPLACE INTO TABLE kv; +SELECT v FROM kv WHERE v RLIKE '^(query|view_body_utf8)=' ORDER BY v; +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='v1' AND TABLE_SCHEMA='test'; +DROP TABLE kv; +DROP VIEW v1; + +SET sql_mode='ORACLE'; +CREATE VIEW v1 AS SELECT + concat('a','b'), + decode('1',2,3), + ltrim('1'), + rtrim('1'), + lpad('1','2', 3), + rpad('1','2', 3), + replace('1','2','3'), + substr('a',1,2), + trim(both 'a' FROM 'b'); +CREATE TABLE kv (v BLOB); +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +eval LOAD DATA INFILE '$MYSQLD_DATADIR/test/v1.frm' REPLACE INTO TABLE kv; +SELECT v FROM kv WHERE v RLIKE '^(query|view_body_utf8)=' ORDER BY v; +SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='v1' AND TABLE_SCHEMA='test'; +DROP TABLE kv; +DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/t/func_regexp_replace.test mariadb-10.11.9/mysql-test/suite/compat/oracle/t/func_regexp_replace.test --- mariadb-10.11.6/mysql-test/suite/compat/oracle/t/func_regexp_replace.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/t/func_regexp_replace.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,26 @@ +SET sql_mode=ORACLE; + +--echo # +--echo # MDEV-29095 REGEXP_REPLACE treats empty strings different than REPLACE in ORACLE mode +--echo # + +#SELECT REGEXP_REPLACE(null,'a','b') ; +#SELECT REGEXP_REPLACE('ab',null,'b') ; +#SELECT REGEXP_REPLACE('ab','a',null) ; +#SELECT REGEXP_REPLACE('ab',null,null) ; + +CREATE TABLE t1 (replacement VARCHAR(10)); +INSERT INTO t1 VALUES (NULL), (''); +SELECT replacement, REGEXP_REPLACE('abba','a',replacement) FROM t1 ORDER BY replacement; +DROP TABLE t1; + +SELECT REGEXP_REPLACE('abba','a',null); +EXPLAIN EXTENDED SELECT REPLACE('abba','a',null) ; + +CREATE VIEW v1 AS SELECT REPLACE('abba','a',null) ; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +SET sql_mode=DEFAULT; +SHOW CREATE VIEW v1; +SELECT * FROM v1; +DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/t/mysqldump_restore_func_qualified.test mariadb-10.11.9/mysql-test/suite/compat/oracle/t/mysqldump_restore_func_qualified.test --- mariadb-10.11.6/mysql-test/suite/compat/oracle/t/mysqldump_restore_func_qualified.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/t/mysqldump_restore_func_qualified.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,50 @@ +# See comments in mysql-test/main/mysqldump_restore.test +--source include/not_embedded.inc + +let $mysqldumpfile = $MYSQLTEST_VARDIR/tmp/mysqldump_func_qualified.sql; + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-27744 LPAD in vcol created in ORACLE mode makes table corrupted in non-ORACLE +--echo # + +SET sql_mode=DEFAULT; +CREATE TABLE t1 ( + a0 VARCHAR(64) NOT NULL DEFAULT LTRIM(now()), + a1 VARCHAR(64) AS (LTRIM(a0)) PERSISTENT, + b0 VARCHAR(64) NOT NULL DEFAULT LPAD(now(),10), + b1 VARCHAR(64) AS (LPAD(b0,10)) PERSISTENT +); +CREATE VIEW v1 AS SELECT + LTRIM(now()) AS a0, + LPAD(now(),10) AS b0; +SET sql_mode=ORACLE; +CREATE TABLE t2 ( + a0 VARCHAR(64) NOT NULL DEFAULT LTRIM(now()), + a1 VARCHAR(64) AS (LTRIM(a0)) PERSISTENT, + b0 VARCHAR(64) NOT NULL DEFAULT LPAD(now(),10), + b1 VARCHAR(64) AS (LPAD(b0,10)) PERSISTENT +); +CREATE VIEW v2 AS SELECT + LTRIM(now()) AS a0, + LPAD(now(),10) AS b0; +--exec $MYSQL_DUMP --skip-extended-insert test --skip-comments --compact t1 t2 v1 v2 +--exec $MYSQL_DUMP --skip-extended-insert test --skip-comments t1 t2 v1 v2 > $mysqldumpfile +DROP TABLE t1,t2; +DROP VIEW v1,v2; +--exec $MYSQL test < $mysqldumpfile +SET sql_mode=DEFAULT; +SHOW CREATE TABLE t1; +SHOW CREATE TABLE t2; +SHOW CREATE VIEW v1; +SHOW CREATE VIEW v2; +--remove_file $mysqldumpfile +DROP TABLE t1,t2; +DROP VIEW v1, v2; + +--echo # +--echo # End of 10.4 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/suite/compat/oracle/t/vcol_innodb.test mariadb-10.11.9/mysql-test/suite/compat/oracle/t/vcol_innodb.test --- mariadb-10.11.6/mysql-test/suite/compat/oracle/t/vcol_innodb.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/compat/oracle/t/vcol_innodb.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,47 @@ +--source include/have_innodb.inc + +--echo # +--echo # MDEV-27744 LPAD in vcol created in ORACLE mode makes table corrupted in non-ORACLE +--echo # + +FLUSH TABLES; +SET sql_mode=''; +CREATE TABLE t (d INT,b VARCHAR(1),c CHAR(1),g CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b),KEY g(g)) ENGINE=InnoDB; +--error ER_WRONG_VALUE_COUNT_ON_ROW +INSERT INTO t VALUES (0); +SET sql_mode='ORACLE'; +INSERT INTO t SET c=REPEAT (1,0); +--error ER_BAD_FIELD_ERROR +ALTER TABLE t CHANGE COLUMN a b INT; +DELETE FROM t; +SET sql_mode=''; +FLUSH TABLES; +INSERT INTO t SET c='0'; +DROP TABLE t; +FLUSH TABLES; + +SET sql_mode=''; +CREATE TABLE t (a INT(1),d INT(1),b VARCHAR(1),c CHAR(1),vadc INT(1) GENERATED ALWAYS AS ( (a + length (d))) STORED,vbc CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,vbidxc CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b (1),a,d),KEY d (d),KEY a (a),KEY c_renamed (c (1),b (1)),KEY b (b (1),c (1),a),KEY vbidxc (vbidxc),KEY a_2 (a,vbidxc),KEY vbidxc_2 (vbidxc,d)) DEFAULT CHARSET=latin1 ENGINE=InnoDB; +--error ER_WRONG_VALUE_COUNT_ON_ROW +INSERT INTO t VALUES (0,0,1,0,1,0,1,0,0); +SET SESSION sql_mode='ORACLE'; +INSERT INTO t SET c=REPEAT (1,0); +--error ER_DUP_FIELDNAME +ALTER TABLE t CHANGE COLUMN a b CHAR(1); +DELETE FROM t; +SET SESSION sql_mode=DEFAULT; +DROP TABLE t; + +SET sql_mode=''; +CREATE TABLE t1 (d INT,b VARCHAR(1),c CHAR(1),g CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b),KEY g(g)) ENGINE=InnoDB; +--error ER_WRONG_VALUE_COUNT_ON_ROW +INSERT INTO t1 VALUES (0); +SET sql_mode='ORACLE'; +INSERT INTO t1 SET c=REPEAT (1,0); +--error ER_BAD_FIELD_ERROR +ALTER TABLE t1 CHANGE COLUMN a b INT; +DELETE FROM t1; +SET sql_mode=''; +FLUSH TABLES; +INSERT INTO t1 SET c='0'; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/csv/lowercase_table0.result mariadb-10.11.9/mysql-test/suite/csv/lowercase_table0.result --- mariadb-10.11.6/mysql-test/suite/csv/lowercase_table0.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/csv/lowercase_table0.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,15 @@ +# +# MDEV-33085 Tables T1 and t1 do not work well with ENGINE=CSV and lower-case-table-names=0 +# +CREATE OR REPLACE TABLE t1 (a INT NOT NULL) ENGINE=CSV; +CREATE OR REPLACE TABLE T1 (a INT NOT NULL) ENGINE=CSV; +INSERT INTO t1 VALUES (10); +INSERT INTO T1 VALUES (20); +SELECT * FROM t1; +a +10 +SELECT * FROM T1; +a +20 +DROP TABLE t1; +DROP TABLE T1; diff -Nru mariadb-10.11.6/mysql-test/suite/csv/lowercase_table0.test mariadb-10.11.9/mysql-test/suite/csv/lowercase_table0.test --- mariadb-10.11.6/mysql-test/suite/csv/lowercase_table0.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/csv/lowercase_table0.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,16 @@ +--source include/have_csv.inc +--source include/have_lowercase0.inc +--source include/have_case_sensitive_file_system.inc + +--echo # +--echo # MDEV-33085 Tables T1 and t1 do not work well with ENGINE=CSV and lower-case-table-names=0 +--echo # + +CREATE OR REPLACE TABLE t1 (a INT NOT NULL) ENGINE=CSV; +CREATE OR REPLACE TABLE T1 (a INT NOT NULL) ENGINE=CSV; +INSERT INTO t1 VALUES (10); +INSERT INTO T1 VALUES (20); +SELECT * FROM t1; +SELECT * FROM T1; +DROP TABLE t1; +DROP TABLE T1; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/corrupted_during_recovery.result mariadb-10.11.9/mysql-test/suite/encryption/r/corrupted_during_recovery.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/corrupted_during_recovery.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/corrupted_during_recovery.result 2024-08-03 07:29:57.000000000 +0000 @@ -9,7 +9,7 @@ SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' SELECT * FROM t1; -ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. SELECT * FROM t2; a 2 diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-bad-key-change.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-bad-key-change.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change.result 2024-08-03 07:29:57.000000000 +0000 @@ -32,7 +32,7 @@ # Restart server with keysbad3.txt # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keysbad3.txt SELECT * FROM t1; -ERROR 42S02: Table 'test.t1' doesn't exist in engine +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keysbad3.txt DROP TABLE t1; # Start server with keys3.txt @@ -44,31 +44,31 @@ # Restart server with keys2.txt # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt SELECT * FROM t2; -ERROR 42S02: Table 'test.t2' doesn't exist in engine +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. SELECT * FROM t2 where id = 1; -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. SELECT * FROM t2 where b = 1; -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. INSERT INTO t2 VALUES ('tmp',3,3); -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. DELETE FROM t2 where b = 3; -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. DELETE FROM t2 where id = 3; -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. UPDATE t2 set b = b +1; -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. OPTIMIZE TABLE t2; Table Op Msg_type Msg_text -test.t2 optimize Error Table test/t2 is corrupted. Please drop the table and recreate. +test.t2 optimize Error Table `test`.`t2` is corrupted. Please drop the table and recreate. test.t2 optimize error Corrupt ALTER TABLE t2 ADD COLUMN d INT; -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. ANALYZE TABLE t2; Table Op Msg_type Msg_text -test.t2 analyze Error Table test/t2 is corrupted. Please drop the table and recreate. +test.t2 analyze Error Table `test`.`t2` is corrupted. Please drop the table and recreate. test.t2 analyze error Corrupt TRUNCATE TABLE t2; -ERROR HY000: Table test/t2 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. DROP TABLE t2; # Start server with keys2.txt diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-bad-key-change2.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change2.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-bad-key-change2.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change2.result 2024-08-03 07:29:57.000000000 +0000 @@ -14,24 +14,24 @@ INSERT INTO t1 VALUES (1,'foo'),(2,'bar'); # restart: --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys3.txt SELECT * FROM t1; -ERROR 42S02: Table 'test.t1' doesn't exist in engine +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. SHOW WARNINGS; Level Code Message -Error 1932 Table 'test.t1' doesn't exist in engine +Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. ALTER TABLE t1 ENGINE=InnoDB; -ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. SHOW WARNINGS; Level Code Message -Error 1877 Table test/t1 is corrupted. Please drop the table and recreate. +Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. OPTIMIZE TABLE t1; Table Op Msg_type Msg_text -test.t1 optimize Error Table test/t1 is corrupted. Please drop the table and recreate. +test.t1 optimize Error Table `test`.`t1` is corrupted. Please drop the table and recreate. test.t1 optimize error Corrupt SHOW WARNINGS; Level Code Message CHECK TABLE t1; Table Op Msg_type Msg_text -test.t1 check Error Table test/t1 is corrupted. Please drop the table and recreate. +test.t1 check Error Table `test`.`t1` is corrupted. Please drop the table and recreate. test.t1 check error Corrupt SHOW WARNINGS; Level Code Message @@ -41,7 +41,7 @@ UNLOCK TABLES; # restart: --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys3.txt ALTER TABLE t1 DISCARD TABLESPACE; -ERROR 42S02: Table 'test.t1' doesn't exist in engine +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. DROP TABLE t1; CREATE TABLE t1 (pk INT PRIMARY KEY, f VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=4; @@ -62,7 +62,7 @@ ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `ENCRYPTED`=YES `ENCRYPTION_KEY_ID`=4 # restart: --innodb-encrypt-tables --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys3.txt RENAME TABLE t1 TO t1new; -ERROR HY000: Error on rename of './test/t1' to './test/t1new' (errno: 155 "The table does not exist in the storage engine") +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. ALTER TABLE t1 RENAME TO t1new; -ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-bad-key-change4.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change4.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-bad-key-change4.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-bad-key-change4.result 2024-08-03 07:29:57.000000000 +0000 @@ -12,13 +12,13 @@ # restart: --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys3.txt OPTIMIZE TABLE t1; Table Op Msg_type Msg_text -test.t1 optimize Error Table 'test.t1' doesn't exist in engine -test.t1 optimize status Operation failed +test.t1 optimize Error Table `test`.`t1` is corrupted. Please drop the table and recreate. +test.t1 optimize error Corrupt SHOW WARNINGS; Level Code Message CHECK TABLE t1; Table Op Msg_type Msg_text -test.t1 check Error Table test/t1 is corrupted. Please drop the table and recreate. +test.t1 check Error Table `test`.`t1` is corrupted. Please drop the table and recreate. test.t1 check error Corrupt SHOW WARNINGS; Level Code Message diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-compressed-blob.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-compressed-blob.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-compressed-blob.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-compressed-blob.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,7 @@ call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted; key_version=1"); call mtr.add_suppression("InnoDB: Recovery failed to read page"); call mtr.add_suppression("InnoDB: Unable to decompress ..test.t[1-3]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]"); -call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` is corrupted"); +call mtr.add_suppression("Table `test`\\.`t[12]` is corrupted"); # Restart mysqld --file-key-management-filename=keys2.txt # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt SET GLOBAL innodb_file_per_table = ON; @@ -17,9 +17,9 @@ # Restart mysqld --file-key-management-filename=keys3.txt # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys3.txt select count(*) from t1 FORCE INDEX (b) where b like 'secret%'; -ERROR 42S02: Table 'test.t1' doesn't exist in engine +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. select count(*) from t2 FORCE INDEX (b) where b like 'secret%'; -ERROR 42S02: Table 'test.t2' doesn't exist in engine +ERROR HY000: Table `test`.`t2` is corrupted. Please drop the table and recreate. select count(*) from t3 FORCE INDEX (b) where b like 'secret%'; count(*) 1 diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-encryption-disable.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-encryption-disable.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-encryption-disable.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-encryption-disable.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,8 +1,7 @@ -call mtr.add_suppression("InnoDB: Table `test`\\.`t[15]` (has an unreadable root page|is corrupted)"); +call mtr.add_suppression("Table `test`\\.`t[15]` (has an unreadable root page|is corrupted)"); call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[15]\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("InnoDB: Recovery failed to read page"); call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t[15].ibd looks corrupted; key_version=1"); -call mtr.add_suppression("InnoDB: Table `test`\\.`t[15]` is corrupted"); call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); # restart: --innodb-encrypt-tables=ON --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt create table t5 ( @@ -24,9 +23,9 @@ alter table t1 encrypted='yes' `encryption_key_id`=1; # restart: --innodb-encrypt-tables=OFF select * from t1; -ERROR 42S02: Table 'test.t1' doesn't exist in engine +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. select * from t5; -ERROR 42S02: Table 'test.t5' doesn't exist in engine +ERROR HY000: Table `test`.`t5` is corrupted. Please drop the table and recreate. # restart: --innodb-encrypt-tables=ON --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt drop table t1; drop table t5; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-force-corrupt.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-force-corrupt.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-force-corrupt.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-force-corrupt.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,4 +1,4 @@ -call mtr.add_suppression("InnoDB: Table `test`\\.`t[13]` (has an unreadable root page|is corrupted)"); +call mtr.add_suppression("Table `test`\\.`t[13]` (has an unreadable root page|is corrupted)"); call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=\\d+, page number=[36]\\] in file .*test.t[123]\\.ibd looks corrupted; key_version="); call mtr.add_suppression("\\[ERROR\\] InnoDB: We detected index corruption in an InnoDB type table"); call mtr.add_suppression("\\[ERROR\\] (mysqld|mariadbd).*: Index for table 't2' is corrupt; try to repair it"); @@ -18,11 +18,11 @@ # Corrupt tables # restart SELECT * FROM t1; -ERROR 42S02: Table 'test.t1' doesn't exist in engine +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. SELECT * FROM t2; Got one of the listed errors SELECT * FROM t3; -ERROR 42S02: Table 'test.t3' doesn't exist in engine +ERROR HY000: Table `test`.`t3` is corrupted. Please drop the table and recreate. # Restore the original tables # restart DROP TABLE t1,t2,t3; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-missing-key.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-missing-key.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-missing-key.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-missing-key.result 2024-08-03 07:29:57.000000000 +0000 @@ -38,11 +38,11 @@ COUNT(1) 2048 SELECT COUNT(1) FROM t2,t1 where t2.a = t1.a; -ERROR 42S02: Table 'test.t1' doesn't exist in engine +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. SELECT COUNT(1) FROM t1 where b = 'ab'; -ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. SELECT COUNT(1) FROM t1; -ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. # Start server with keys2.txt # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-redo-nokeys.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-redo-nokeys.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb-redo-nokeys.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb-redo-nokeys.result 2024-08-03 07:29:57.000000000 +0000 @@ -23,6 +23,15 @@ insert into t3 select * from t1; insert into t4 select * from t1; commit; + +# Flush all dirty pages from buffer pool +SET @no_checkpoint_save_pct= @@GLOBAL.innodb_max_dirty_pages_pct; +SET @no_checkpoint_save_pct_lwm= @@GLOBAL.innodb_max_dirty_pages_pct_lwm; +SET GLOBAL innodb_max_dirty_pages_pct_lwm=0.0; +SET GLOBAL innodb_max_dirty_pages_pct=0.0; +SET GLOBAL innodb_max_dirty_pages_pct= @no_checkpoint_save_pct; +SET GLOBAL innodb_max_dirty_pages_pct_lwm= @no_checkpoint_save_pct_lwm; + CREATE TABLE t5 (a VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES; SET GLOBAL innodb_flush_log_at_trx_commit=1; begin; @@ -42,6 +51,6 @@ WHERE engine = 'innodb' AND support IN ('YES', 'DEFAULT', 'ENABLED'); ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS -FOUND 1 /\[ERROR\] InnoDB: Encryption key is not found for .*test.t1.ibd/ in mysqld.1.err +FOUND 1 /\[ERROR\] InnoDB: Encryption key is not found for .*test.t[1-5].ibd/ in mysqld.1.err # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt drop table t1,t2,t3,t4,t5; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,8 @@ -SELECT variable_value into @old_encrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) INTO @old_encrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_encrypted'; -SELECT variable_value into @old_decrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) INTO @old_decrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_decrypted'; CREATE TEMPORARY TABLE t1(f1 CHAR(200), f2 CHAR(200)) ENGINE=InnoDB; INSERT INTO t1 (f1,f2) SELECT '', '' FROM seq_1_to_8192; @@ -12,11 +14,13 @@ SELECT COUNT(*) FROM t2; COUNT(*) 8192 -SELECT variable_value > @old_encrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) > @old_encrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_encrypted'; -variable_value > @old_encrypted +CAST(variable_value AS INT) > @old_encrypted 1 -SELECT variable_value > @old_decrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) > @old_decrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_decrypted'; -variable_value > @old_decrypted +CAST(variable_value AS INT) > @old_decrypted 1 diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result mariadb-10.11.9/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/innodb_encryption_discard_import.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,3 +1,5 @@ +SET @start_encr_threads = @@global.innodb_encryption_threads; +SET @start_encrypt_tables = @@global.innodb_encrypt_tables; CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, a VARCHAR(255)) ENGINE=InnoDB encrypted=yes; CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY, a VARCHAR(255)) ENGINE=InnoDB; CREATE TABLE t3 (id INT NOT NULL PRIMARY KEY, a VARCHAR(255)) ENGINE=InnoDB row_format=compressed encrypted=yes; @@ -13,11 +15,13 @@ end while; end// commit; -set autocommit=0; -call innodb_insert_proc(10000); +begin; +set statement unique_checks=0, foreign_key_checks=0 for +call innodb_insert_proc(100); commit; -set autocommit=1; +DROP PROCEDURE innodb_insert_proc; # Wait max 10 min for key encryption threads to encrypt all spaces +FLUSH TABLES t1, t2, t3 FOR EXPORT; # tablespaces should be now encrypted # t1 yes on expecting NOT FOUND NOT FOUND /foobar/ in t1.ibd @@ -25,15 +29,16 @@ NOT FOUND /temp/ in t2.ibd # t3 ... on expecting NOT FOUND NOT FOUND /barfoo/ in t3.ibd -# restart db.opt +t1.cfg t1.frm t1.ibd +t2.cfg t2.frm t2.ibd +t3.cfg t3.frm t3.ibd -FLUSH TABLES t1, t2, t3 FOR EXPORT; backup: t1 backup: t2 backup: t3 @@ -55,17 +60,18 @@ restore: t2 .ibd and .cfg files restore: t3 .ibd and .cfg files ALTER TABLE t1 IMPORT TABLESPACE; -SELECT COUNT(1) FROM t1; -COUNT(1) -10000 +SELECT COUNT(*) FROM t1; +COUNT(*) +100 ALTER TABLE t2 IMPORT TABLESPACE; -SELECT COUNT(1) FROM t2; -COUNT(1) -10000 +SELECT COUNT(*) FROM t2; +COUNT(*) +100 ALTER TABLE t3 IMPORT TABLESPACE; -SELECT COUNT(1) FROM t3; -COUNT(1) -10000 +SELECT COUNT(*) FROM t3; +COUNT(*) +100 +FLUSH TABLES t1, t2, t3 FOR EXPORT; # tablespaces should remain encrypted after import # t1 yes on expecting NOT FOUND NOT FOUND /foobar/ in t1.ibd @@ -73,8 +79,8 @@ NOT FOUND /temp/ in t2.ibd # t3 ... on expecting NOT FOUND NOT FOUND /barfoo/ in t3.ibd -# restart -ALTER TABLE t1 ENGINE InnoDB; +UNLOCK TABLES; +ALTER TABLE t1 FORCE; SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( @@ -82,7 +88,7 @@ `a` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `encrypted`=yes -ALTER TABLE t2 ENGINE InnoDB; +ALTER TABLE t2 FORCE; SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( @@ -90,7 +96,7 @@ `a` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci -ALTER TABLE t3 ENGINE InnoDB; +ALTER TABLE t3 FORCE; SHOW CREATE TABLE t3; Table Create Table t3 CREATE TABLE `t3` ( @@ -98,30 +104,56 @@ `a` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPRESSED `encrypted`=yes -# Restarting server -# restart -# Done restarting server # Verify that tables are still usable -SELECT COUNT(1) FROM t1; -COUNT(1) -10000 -SELECT COUNT(1) FROM t2; -COUNT(1) -10000 -SELECT COUNT(1) FROM t3; -COUNT(1) -10000 -# Tablespaces should be encrypted after restart +CHECK TABLE t1, t2, t3 EXTENDED; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t2 check status OK +test.t3 check status OK +FLUSH TABLES t1, t2, t3 FOR EXPORT; # t1 yes on expecting NOT FOUND NOT FOUND /foobar/ in t1.ibd # t2 ... on expecting NOT FOUND NOT FOUND /temp/ in t2.ibd # t3 ... on expecting NOT FOUND -NOT FOUND /barfoo/ in t3.ibd -# restart -# Wait max 10 min for key encryption threads to encrypt all spaces -# Success! -# Restart mysqld --innodb_encrypt_tables=0 --innodb_encryption_threads=0 -# restart: --innodb_encrypt_tables=0 --innodb_encryption_threads=0 -DROP PROCEDURE innodb_insert_proc; +UNLOCK TABLES; DROP TABLE t1, t2, t3; +# +# MDEV-34670 IMPORT TABLESPACE unnecessary traverses +# tablespace list +# +SET GLOBAL innodb_encrypt_tables= OFF; +SET GLOBAL innodb_encryption_threads= 0; +CREATE TABLE t1(f1 int,f2 text)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, "InnoDB"); +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 DISCARD TABLESPACE; +FLUSH TABLES t1 FOR EXPORT; +UNLOCK TABLES; +ALTER TABLE t2 IMPORT TABLESPACE; +SET GLOBAL innodb_encryption_threads=2; +SET GLOBAL innodb_encrypt_tables = ON; +# Wait max 10 min for key encryption threads to encrypt all spaces +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; +NAME +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; +NAME +innodb_system +test/t1 +test/t2 +SET GLOBAL innodb_encrypt_tables = OFF; +# Wait max 10 min for key encryption threads to decrypt all spaces +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; +NAME +innodb_system +test/t1 +test/t2 +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; +NAME +DROP TABLE t1, t2; +SET GLOBAL innodb_encryption_threads=@start_encr_threads; +SET GLOBAL innodb_encrypt_tables=@start_encrypt_tables; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/r/tempfiles_encrypted.result mariadb-10.11.9/mysql-test/suite/encryption/r/tempfiles_encrypted.result --- mariadb-10.11.6/mysql-test/suite/encryption/r/tempfiles_encrypted.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/r/tempfiles_encrypted.result 2024-08-03 07:29:57.000000000 +0000 @@ -1105,11 +1105,9 @@ a, count(col1) over (order by a range between 0.1 preceding -and 0.1 following) +and 0.1 following) as count from t1; -a count(col1) over (order by a -range between 0.1 preceding -and 0.1 following) +a count 0.450 3 0.500 3 0.550 3 @@ -1255,64 +1253,107 @@ insert into t1 values (2,2,'bar'); select count(*) over (order by a,b -range between unbounded preceding and current row) +range between 1 preceding and current row) as count from t1; ERROR HY000: RANGE-type frame requires ORDER BY clause with single sort key select -count(*) over (order by c -range between unbounded preceding and current row) -from t1; -ERROR HY000: Numeric datatype is required for RANGE-type frame -select count(*) over (order by a -range between 'abcd' preceding and current row) +range between 'abcd' preceding and current row) as count from t1; ERROR HY000: Numeric datatype is required for RANGE-type frame select count(*) over (order by a -range between current row and 'foo' following) +range between current row and 'foo' following) as count from t1; ERROR HY000: Numeric datatype is required for RANGE-type frame # Try range frame with invalid bounds select count(*) over (order by a -rows between 0.5 preceding and current row) +rows between 0.5 preceding and current row) as count from t1; ERROR HY000: Integer is required for ROWS-type frame select count(*) over (order by a -rows between current row and 3.14 following) +rows between current row and 3.14 following) as count from t1; ERROR HY000: Integer is required for ROWS-type frame # +# MDEV-19052 Range-type window frame supports only numeric datatype +# +select +count(*) over (order by c +range between unbounded preceding and current row) as r +from t1; +r +1 +2 +select +count(*) over (order by c +range between current row and unbounded following) as r +from t1; +r +2 +1 +select +count(*) over (order by c +range between unbounded preceding and unbounded following) as r +from t1; +r +2 +2 +create table t2 (a int, b varchar(5)); +insert into t2 values (1,'a'), (2, 'b'), (3, 'c'); +select sum(a) over (order by b range between unbounded preceding and current row) as r from t2; +r +1 +3 +6 +insert into t1 values (3,3,'goo'); +insert into t1 values (3,1,'har'); +insert into t1 values (1,4,'har'); +select a, b, sum(b) over (order by a, b desc range between unbounded preceding and current row) as r from t1; +a b r +1 4 4 +1 1 5 +2 2 7 +3 3 10 +3 1 11 +select a, b, sum(b) over (order by a desc, b range between unbounded preceding and current row) as r from t1; +a b r +3 1 1 +3 3 4 +2 2 6 +1 1 7 +1 4 11 +drop table t2; +delete from t1 where a >= 3 or b = 4; +# # EXCLUDE clause is parsed but not supported # select count(*) over (order by a rows between 1 preceding and 1 following -exclude current row) +exclude current row) as count from t1; ERROR HY000: Frame exclusion is not supported yet select count(*) over (order by a range between 1 preceding and 1 following -exclude ties) +exclude ties) as count from t1; ERROR HY000: Frame exclusion is not supported yet select count(*) over (order by a range between 1 preceding and 1 following -exclude group) +exclude group) as count from t1; ERROR HY000: Frame exclusion is not supported yet select count(*) over (order by a rows between 1 preceding and 1 following -exclude no others) +exclude no others) as count from t1; -count(*) over (order by a -rows between 1 preceding and 1 following -exclude no others) +count 2 2 drop table t1; @@ -1632,10 +1673,10 @@ # Check using counters flush status; select -rank() over (partition by c order by a), -rank() over (partition by c order by b) +rank() over (partition by c order by a) as rank_a, +rank() over (partition by c order by b) as rank_b from t1; -rank() over (partition by c order by a) rank() over (partition by c order by b) +rank_a rank_b 1 3 2 2 3 1 @@ -1648,10 +1689,10 @@ Sort_scan 2 flush status; select -rank() over (partition by c order by a), -rank() over (partition by c order by a) +rank() over (partition by c order by a) as rank_a, +rank() over (partition by c order by a) as rank_b from t1; -rank() over (partition by c order by a) rank() over (partition by c order by a) +rank_a rank_b 1 1 2 2 3 3 @@ -1664,8 +1705,8 @@ Sort_scan 1 explain format=json select -rank() over (partition by c order by a), -rank() over (partition by c order by a) +rank() over (partition by c order by a) as rank_a, +rank() over (partition by c order by a) as rank_b from t1; EXPLAIN { @@ -1728,8 +1769,8 @@ } explain format=json select -rank() over (partition by c order by a), -count(*) over (partition by c) +rank() over (partition by c order by a) as rank_a, +count(*) over (partition by c) as count_c from t1; EXPLAIN { @@ -1760,8 +1801,8 @@ } explain format=json select -count(*) over (partition by c), -rank() over (partition by c order by a) +count(*) over (partition by c) as count_c, +rank() over (partition by c order by a) as rank_a from t1; EXPLAIN { @@ -1902,18 +1943,18 @@ insert into t1 values (1, 4, 8); select pk, a, -sum(a) over (order by pk rows between 0 preceding and current row) +sum(a) over (order by pk rows between 0 preceding and current row) as sum from t1; -pk a sum(a) over (order by pk rows between 0 preceding and current row) +pk a sum 1 1 1 2 2 2 3 4 4 4 8 8 select pk, a, -sum(a) over (order by pk rows between 1 preceding and 0 preceding) +sum(a) over (order by pk rows between 1 preceding and 0 preceding) as sum from t1; -pk a sum(a) over (order by pk rows between 1 preceding and 0 preceding) +pk a sum 1 1 1 2 2 3 3 4 6 @@ -1924,9 +1965,9 @@ insert into t1 values (200, 4, 8); select part_id, pk, a, -sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) +sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) as sum from t1; -part_id pk a sum(a) over (partition by part_id order by pk rows between 0 preceding and current row) +part_id pk a sum 1 1 1 1 1 2 2 2 1 3 4 4 @@ -1937,9 +1978,9 @@ 200 4 8 8 select part_id, pk, a, -sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) +sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) as sum from t1; -part_id pk a sum(a) over (partition by part_id order by pk rows between 1 preceding and 0 preceding) +part_id pk a sum 1 1 1 1 1 2 2 3 1 3 4 6 @@ -1964,8 +2005,8 @@ (2000, 3), (2000, 3), (2000, 3); -select rank() over (partition by part_id order by a) from t1; -rank() over (partition by part_id order by a) +select rank() over (partition by part_id order by a) as rank from t1; +rank 1 2 2 @@ -1975,14 +2016,14 @@ 3 3 3 -select distinct rank() over (partition by part_id order by a) from t1; -rank() over (partition by part_id order by a) +select distinct rank() over (partition by part_id order by a) as rank from t1; +rank 1 2 4 3 explain format=json -select distinct rank() over (partition by part_id order by a) from t1; +select distinct rank() over (partition by part_id order by a) as rank from t1; EXPLAIN { "query_block": { @@ -2068,11 +2109,8 @@ SELECT o_custkey, avg(o_custkey) OVER (PARTITION BY abs(o_custkey) ORDER BY o_custkey RANGE BETWEEN 15 FOLLOWING -AND 15 FOLLOWING) from orders; -o_custkey avg(o_custkey) OVER (PARTITION BY abs(o_custkey) -ORDER BY o_custkey -RANGE BETWEEN 15 FOLLOWING -AND 15 FOLLOWING) +AND 15 FOLLOWING) as avg from orders; +o_custkey avg 238 NULL 242 NULL DROP table orders; @@ -2296,15 +2334,15 @@ NULL NULL NULL -SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) from t; -ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) +SELECT ifnull(((t.a) / CASE WHEN sum(t.a) over(partition by t.b) =0 then null else null end) ,0) as result from t; +result 0.00000000000000 0.00000000000000 0.00000000000000 SELECT sum(t.a) over (partition by t.b order by a), -sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) +sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) as sum from t; -sum(t.a) over (partition by t.b order by a) sqrt(ifnull((sum(t.a) over (partition by t.b order by a)), 0)) +sum(t.a) over (partition by t.b order by a) sum 0.0000000000 0 1.0000000000 1 3.0000000000 1.7320508075688772 @@ -2479,9 +2517,9 @@ (1,1000), (2,1100), (3,1800), (4,1500), (5,1700), (6,1200), (7,2000), (8,2100), (9,1600); SELECT id, sum(a) OVER (PARTITION BY id -ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as sum FROM t1; -id sum(a) OVER (PARTITION BY id +id sum 1 1000 2 1100 3 1800 @@ -2491,10 +2529,9 @@ 7 2000 8 2100 9 1600 -ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) -SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +SELECT id, sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) as sum FROM t1; -id sum(a) OVER (ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +id sum 1 14000 2 13000 3 5900 @@ -3229,8 +3266,8 @@ # CREATE TABLE t1 (c CHAR(8)) ENGINE=MyISAM; INSERT IGNORE INTO t1 VALUES ('foo'); -SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1); -('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1) +SELECT ('bar',1) IN ( SELECT c, ROW_NUMBER() OVER (PARTITION BY c) FROM t1) as result; +result 0 DROP TABLE t1; # @@ -3263,8 +3300,8 @@ # CREATE TABLE t1 (dt DATETIME); INSERT INTO t1 VALUES ('2017-05-17'); -SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) FROM t1; -MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) +SELECT MAX(dt) OVER (ORDER BY dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) as result FROM t1; +result NULL DROP TABLE t1; # @@ -4481,6 +4518,180 @@ 3 drop table t1; # +# MDEV-29307: join of 2 derived tables over the same grouping view such +# that the first of the joined tables contains a window +# function and the view's specification contains a subquery +# with a set function aggregated on the top level +# +CREATE TABLE t1 ( +tst int NOT NULL, +flat tinyint unsigned NOT NULL, +type tinyint unsigned NOT NULL, +val int NOT NULL, +PRIMARY KEY (tst,flat,type) +) ENGINE=ARIA; +INSERT INTO t1 VALUES +(5, 20, 2, 100), +(7, 20, 2, 150), +(9, 20, 1, 200); +CREATE VIEW v1 AS ( +SELECT +flat, +type, +( SELECT val FROM t1 sw +WHERE sw.tst = MAX(w.tst) AND sw.flat = w.flat AND sw.type = w.type) +AS total +FROM t1 w +GROUP BY flat, type +); +EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 Using where +1 PRIMARY ref key0 key0 1 v1.flat 2 100.00 Using where +6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +Warnings: +Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4 +Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4 +Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6 +Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6 +Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6 +Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6 +Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`v1`.`total` AS `w1_total` from `test`.`v1` join `test`.`v1` where `v1`.`flat` = `v1`.`flat` and `v1`.`type` = 2 and `v1`.`type` = 1 +SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +w2_total w1_total +150 200 +EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 Using where +1 PRIMARY ref key0 key0 1 w1.flat 2 100.00 Using where +6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +2 DERIVED ALL NULL NULL NULL NULL 3 100.00 Using where; Using temporary +4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using where; Using index; Using temporary; Using filesort +5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +Warnings: +Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4 +Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4 +Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6 +Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6 +Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6 +Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6 +Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`type` order by `v1`.`type`) AS `u` from `test`.`v1` where `v1`.`type` = 1) `w1` join `test`.`v1` where `v1`.`flat` = `w1`.`flat` and `v1`.`type` = 2 +SELECT w2.total AS w2_total, w1.total AS w1_total +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY type ORDER BY type) AS u +FROM v1 +WHERE type = 1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +WHERE type = 2 +) AS w2 +ON w1.flat = w2.flat; +w2_total w1_total +150 200 +EXPLAIN EXTENDED SELECT w2.total AS w2_total, w1.total AS w1_total, u +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u +FROM v1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +) AS w2; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 +1 PRIMARY ALL NULL NULL NULL NULL 3 100.00 Using join buffer (flat, BNL join) +6 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort +7 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +2 DERIVED ALL NULL NULL NULL NULL 3 100.00 Using temporary +4 DERIVED w index NULL PRIMARY 6 NULL 3 100.00 Using index; Using temporary; Using filesort +5 DEPENDENT SUBQUERY sw eq_ref PRIMARY PRIMARY 6 func,func,func 1 100.00 Using index condition +Warnings: +Note 1276 Field or reference 'test.w.tst' of SELECT #5 was resolved in SELECT #4 +Note 1981 Aggregate function 'max()' of SELECT #5 belongs to SELECT #4 +Note 1276 Field or reference 'test.w.flat' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.type' of SELECT #5 was resolved in SELECT #4 +Note 1276 Field or reference 'test.w.tst' of SELECT #7 was resolved in SELECT #6 +Note 1981 Aggregate function 'max()' of SELECT #7 belongs to SELECT #6 +Note 1276 Field or reference 'test.w.flat' of SELECT #7 was resolved in SELECT #6 +Note 1276 Field or reference 'test.w.type' of SELECT #7 was resolved in SELECT #6 +Note 1003 /* select#1 */ select `v1`.`total` AS `w2_total`,`w1`.`total` AS `w1_total`,`w1`.`u` AS `u` from (/* select#2 */ select `v1`.`flat` AS `flat`,`v1`.`type` AS `type`,`v1`.`total` AS `total`,count(`v1`.`total`) over ( partition by `v1`.`flat` order by `v1`.`flat`) AS `u` from `test`.`v1`) `w1` join `test`.`v1` +SELECT w2.total AS w2_total, w1.total AS w1_total, u +FROM +( +SELECT flat, type, total, +COUNT(total) OVER (PARTITION BY flat ORDER BY flat) AS u +FROM v1 +) AS w1 +JOIN +( +SELECT flat, type, total +FROM v1 +) AS w2; +w2_total w1_total u +150 150 2 +150 200 2 +200 150 2 +200 200 2 +DROP VIEW v1; +DROP TABLE t1; +# End of 10.5 tests +# # MDEV-28206 SIGSEGV in Item_field::fix_fields when using LEAD...OVER # CREATE TABLE t(c1 INT); @@ -4502,6 +4713,19 @@ DROP FUNCTION f; DROP TABLE t; # +# MDEV-31296: Crash in Item_func::fix_fields when prepared statement +# with subqueries and window function is executed with +# sql_mode = ONLY_FULL_GROUP_BY +# +CREATE TABLE t1 ( a INT, i INT) ; +CREATE TABLE t2 ( a INT); +INSERT INTO t2 VALUES (4000); +SET SESSION sql_mode = "ONLY_FULL_GROUP_BY"; +EXECUTE IMMEDIATE "SELECT SUM(i) OVER (ORDER BY i) FROM t1 NATURAL JOIN t2"; +SUM(i) OVER (ORDER BY i) +# Clean up +DROP TABLE t1, t2; +# # End of 10.6 tests # # diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/encrypt_and_grep.test mariadb-10.11.9/mysql-test/suite/encryption/t/encrypt_and_grep.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/encrypt_and_grep.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/encrypt_and_grep.test 2024-08-03 07:29:57.000000000 +0000 @@ -24,8 +24,9 @@ insert t3 values (repeat('dummysecret', 12)); --echo # Wait max 10 min for key encryption threads to encrypt all spaces +--let $tables_count= `select count(*) + @@global.innodb_undo_tablespaces from information_schema.tables where engine = 'InnoDB'` --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +--let $wait_condition=SELECT COUNT(*) = $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 --source include/wait_condition.inc --sorted_result @@ -95,8 +96,9 @@ SET GLOBAL innodb_encrypt_tables = on; --echo # Wait max 10 min for key encryption threads to encrypt all spaces +--let $tables_count= `select count(*) + @@global.innodb_undo_tablespaces from information_schema.tables where engine = 'InnoDB'` --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0; +--let $wait_condition=SELECT COUNT(*) = $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 --source include/wait_condition.inc --sorted_result diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-bad-key-change.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-bad-key-change.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change.test 2024-08-03 07:29:57.000000000 +0000 @@ -43,7 +43,7 @@ -- source include/restart_mysqld.inc --disable_warnings ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT SELECT * FROM t1; --enable_warnings @@ -72,7 +72,7 @@ -- source include/restart_mysqld.inc --disable_warnings ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT SELECT * FROM t2; --error ER_TABLE_CORRUPT diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-bad-key-change2.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change2.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-bad-key-change2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change2.test 2024-08-03 07:29:57.000000000 +0000 @@ -32,7 +32,7 @@ --let $restart_parameters=--plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt --source include/restart_mysqld.inc ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT SELECT * FROM t1; --replace_regex /key_id [1-9][0-9]*/\1 / SHOW WARNINGS; @@ -63,7 +63,7 @@ --let $restart_parameters=--plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt --source include/restart_mysqld.inc ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT ALTER TABLE t1 DISCARD TABLESPACE; # Drop table will succeed. DROP TABLE t1; @@ -95,7 +95,7 @@ --let $restart_parameters= --innodb-encrypt-tables --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt --source include/restart_mysqld.inc ---error ER_ERROR_ON_RENAME +--error ER_TABLE_CORRUPT RENAME TABLE t1 TO t1new; --error ER_TABLE_CORRUPT ALTER TABLE t1 RENAME TO t1new; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-bad-key-change3.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change3.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-bad-key-change3.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-bad-key-change3.test 2024-08-03 07:29:57.000000000 +0000 @@ -16,7 +16,7 @@ --let $MYSQLD_DATADIR = `SELECT @@datadir` --let SEARCH_RANGE = 10000000 --let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -25,7 +25,7 @@ 4;770A8A65DA156D24EE2A093277530143 EOF ---exec echo "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc @@ -47,7 +47,7 @@ ALTER TABLE t1 DISCARD TABLESPACE; ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -62,7 +62,7 @@ ib_restore_tablespaces("test", "t1"); EOF ---exec echo "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --source include/restart_mysqld.inc @@ -80,7 +80,7 @@ -- let SEARCH_FILE=$t1_IBD -- source include/search_pattern_in_file.inc ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc --remove_file $MYSQLTEST_VARDIR/keys1.txt @@ -89,7 +89,7 @@ 4;770A8A65DA156D24EE2A093277530143 EOF ---exec echo "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--innodb-encrypt-tables --innodb-stats-persistent --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-compressed-blob.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-compressed-blob.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-compressed-blob.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-compressed-blob.test 2024-08-03 07:29:57.000000000 +0000 @@ -7,7 +7,7 @@ call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[123]\\.ibd' cannot be decrypted; key_version=1"); call mtr.add_suppression("InnoDB: Recovery failed to read page"); call mtr.add_suppression("InnoDB: Unable to decompress ..test.t[1-3]\\.ibd\\[page id: space=[1-9][0-9]*, page number=[0-9]+\\]"); -call mtr.add_suppression("InnoDB: Table `test`\\.`t[12]` is corrupted"); +call mtr.add_suppression("Table `test`\\.`t[12]` is corrupted"); --echo # Restart mysqld --file-key-management-filename=keys2.txt -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt @@ -28,9 +28,9 @@ -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys3.txt -- source include/restart_mysqld.inc ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT select count(*) from t1 FORCE INDEX (b) where b like 'secret%'; ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT select count(*) from t2 FORCE INDEX (b) where b like 'secret%'; select count(*) from t3 FORCE INDEX (b) where b like 'secret%'; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-encryption-disable.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-encryption-disable.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-encryption-disable.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-encryption-disable.test 2024-08-03 07:29:57.000000000 +0000 @@ -7,11 +7,10 @@ # MDEV-9559: Server without encryption configs crashes if selecting from an implicitly encrypted table # -call mtr.add_suppression("InnoDB: Table `test`\\.`t[15]` (has an unreadable root page|is corrupted)"); +call mtr.add_suppression("Table `test`\\.`t[15]` (has an unreadable root page|is corrupted)"); call mtr.add_suppression("InnoDB: The page \\[page id: space=[1-9][0-9]*, page number=[1-9][0-9]*\\] in file '.*test.t[15]\\.ibd' cannot be decrypted\\."); call mtr.add_suppression("InnoDB: Recovery failed to read page"); call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=[1-9][0-9]*, page number=3\\] in file .*test.t[15].ibd looks corrupted; key_version=1"); -call mtr.add_suppression("InnoDB: Table `test`\\.`t[15]` is corrupted"); # Suppression for builds where file_key_management plugin is linked statically call mtr.add_suppression("Couldn't load plugins from 'file_key_management"); @@ -43,9 +42,9 @@ --let $restart_parameters=--innodb-encrypt-tables=OFF --source include/restart_mysqld.inc ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT select * from t1; ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT select * from t5; --let $restart_parameters=--innodb-encrypt-tables=ON --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-force-corrupt.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-force-corrupt.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-force-corrupt.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-force-corrupt.test 2024-08-03 07:29:57.000000000 +0000 @@ -7,7 +7,7 @@ # Don't test under embedded -- source include/not_embedded.inc -call mtr.add_suppression("InnoDB: Table `test`\\.`t[13]` (has an unreadable root page|is corrupted)"); +call mtr.add_suppression("Table `test`\\.`t[13]` (has an unreadable root page|is corrupted)"); call mtr.add_suppression("InnoDB: Encrypted page \\[page id: space=\\d+, page number=[36]\\] in file .*test.t[123]\\.ibd looks corrupted; key_version="); call mtr.add_suppression("\\[ERROR\\] InnoDB: We detected index corruption in an InnoDB type table"); call mtr.add_suppression("\\[ERROR\\] (mysqld|mariadbd).*: Index for table 't2' is corrupt; try to repair it"); @@ -68,11 +68,11 @@ --source include/start_mysqld.inc ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT SELECT * FROM t1; --error ER_GET_ERRMSG,ER_NOT_KEYFILE SELECT * FROM t2; ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT SELECT * FROM t3; --source include/shutdown_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-missing-key.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-missing-key.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-missing-key.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-missing-key.test 2024-08-03 07:29:57.000000000 +0000 @@ -46,7 +46,7 @@ SELECT SLEEP(5); SELECT COUNT(1) FROM t3; SELECT COUNT(1) FROM t2; ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT SELECT COUNT(1) FROM t2,t1 where t2.a = t1.a; --error ER_TABLE_CORRUPT SELECT COUNT(1) FROM t1 where b = 'ab'; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-redo-nokeys.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-redo-nokeys.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb-redo-nokeys.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb-redo-nokeys.test 2024-08-03 07:29:57.000000000 +0000 @@ -44,7 +44,9 @@ insert into t4 select * from t1; commit; +let $no_checkpoint_flush= 1; --source ../../suite/innodb/include/no_checkpoint_start.inc + # # We test redo log page read at recv_read_page using # keys that are not in std_data/keys.txt. If checkpoint @@ -77,7 +79,7 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED'); let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err; -let SEARCH_PATTERN = \[ERROR\] InnoDB: Encryption key is not found for .*test.t1.ibd; +let SEARCH_PATTERN = \[ERROR\] InnoDB: Encryption key is not found for .*test.t[1-5].ibd; --source include/search_pattern_in_file.inc # diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb_encrypt_freed.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encrypt_freed.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb_encrypt_freed.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encrypt_freed.test 2024-08-03 07:29:57.000000000 +0000 @@ -21,7 +21,7 @@ SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; CREATE TABLE t2 (f1 int not null)engine=innodb; -let $restart_parameters="--debug=d,ib_log_checkpoint_avoid"; +let $restart_parameters=--debug=d,ib_log_checkpoint_avoid; --source include/restart_mysqld.inc # Stop the purge diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test 2024-08-03 07:29:57.000000000 +0000 @@ -2,10 +2,12 @@ --source include/have_innodb.inc --source include/have_file_key_management_plugin.inc -SELECT variable_value into @old_encrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) INTO @old_encrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_encrypted'; -SELECT variable_value into @old_decrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) INTO @old_decrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_decrypted'; CREATE TEMPORARY TABLE t1(f1 CHAR(200), f2 CHAR(200)) ENGINE=InnoDB; @@ -17,8 +19,10 @@ SELECT COUNT(*) FROM t1; SELECT COUNT(*) FROM t2; -SELECT variable_value > @old_encrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) > @old_encrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_encrypted'; -SELECT variable_value > @old_decrypted FROM information_schema.global_status +SELECT CAST(variable_value AS INT) > @old_decrypted +FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_decrypted'; diff -Nru mariadb-10.11.6/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test --- mariadb-10.11.6/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/encryption/t/innodb_encryption_discard_import.test 2024-08-03 07:29:57.000000000 +0000 @@ -2,11 +2,11 @@ -- source include/have_example_key_management_plugin.inc -- source include/not_valgrind.inc -- source include/not_embedded.inc - +SET @start_encr_threads = @@global.innodb_encryption_threads; +SET @start_encrypt_tables = @@global.innodb_encrypt_tables; let MYSQLD_DATADIR = `SELECT @@datadir`; --let SEARCH_RANGE = 10000000 ---let $id = `SELECT RAND()` --let t1_IBD = $MYSQLD_DATADIR/test/t1.ibd --let t2_IBD = $MYSQLD_DATADIR/test/t2.ibd --let t3_IBD = $MYSQLD_DATADIR/test/t3.ibd @@ -30,19 +30,18 @@ delimiter ;// commit; -set autocommit=0; -call innodb_insert_proc(10000); +begin; +set statement unique_checks=0, foreign_key_checks=0 for +call innodb_insert_proc(100); commit; -set autocommit=1; +DROP PROCEDURE innodb_insert_proc; --echo # Wait max 10 min for key encryption threads to encrypt all spaces --let $wait_timeout= 600 --let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND ROTATING_OR_FLUSHING <> 0 --source include/wait_condition.inc -# shutdown so that grep is safe ---source include/shutdown_mysqld.inc - +FLUSH TABLES t1, t2, t3 FOR EXPORT; --echo # tablespaces should be now encrypted --let SEARCH_PATTERN=foobar --echo # t1 yes on expecting NOT FOUND @@ -57,11 +56,8 @@ -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc ---source include/start_mysqld.inc let MYSQLD_DATADIR =`SELECT @@datadir`; - --list_files $MYSQLD_DATADIR/test -FLUSH TABLES t1, t2, t3 FOR EXPORT; perl; do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; ib_backup_tablespaces("test", "t1","t2","t3"); @@ -80,14 +76,13 @@ EOF ALTER TABLE t1 IMPORT TABLESPACE; -SELECT COUNT(1) FROM t1; +SELECT COUNT(*) FROM t1; ALTER TABLE t2 IMPORT TABLESPACE; -SELECT COUNT(1) FROM t2; +SELECT COUNT(*) FROM t2; ALTER TABLE t3 IMPORT TABLESPACE; -SELECT COUNT(1) FROM t3; +SELECT COUNT(*) FROM t3; -# shutdown so that grep is safe ---source include/shutdown_mysqld.inc +FLUSH TABLES t1, t2, t3 FOR EXPORT; --echo # tablespaces should remain encrypted after import --let SEARCH_PATTERN=foobar @@ -103,28 +98,18 @@ -- let SEARCH_FILE=$t3_IBD -- source include/search_pattern_in_file.inc ---source include/start_mysqld.inc - -ALTER TABLE t1 ENGINE InnoDB; +UNLOCK TABLES; +ALTER TABLE t1 FORCE; SHOW CREATE TABLE t1; -ALTER TABLE t2 ENGINE InnoDB; +ALTER TABLE t2 FORCE; SHOW CREATE TABLE t2; -ALTER TABLE t3 ENGINE InnoDB; +ALTER TABLE t3 FORCE; SHOW CREATE TABLE t3; ---echo # Restarting server --- source include/restart_mysqld.inc ---echo # Done restarting server - --echo # Verify that tables are still usable -SELECT COUNT(1) FROM t1; -SELECT COUNT(1) FROM t2; -SELECT COUNT(1) FROM t3; - -# shutdown so that grep is safe ---source include/shutdown_mysqld.inc +CHECK TABLE t1, t2, t3 EXTENDED; +FLUSH TABLES t1, t2, t3 FOR EXPORT; ---echo # Tablespaces should be encrypted after restart --let SEARCH_PATTERN=foobar --echo # t1 yes on expecting NOT FOUND -- let SEARCH_FILE=$t1_IBD @@ -136,19 +121,60 @@ --echo # t3 ... on expecting NOT FOUND --let SEARCH_PATTERN=barfoo -- let SEARCH_FILE=$t3_IBD --- source include/search_pattern_in_file.inc ---source include/start_mysqld.inc +UNLOCK TABLES; + +DROP TABLE t1, t2, t3; + +--echo # +--echo # MDEV-34670 IMPORT TABLESPACE unnecessary traverses +--echo # tablespace list +--echo # +SET GLOBAL innodb_encrypt_tables= OFF; +SET GLOBAL innodb_encryption_threads= 0; + +CREATE TABLE t1(f1 int,f2 text)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, "InnoDB"); +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 DISCARD TABLESPACE; +FLUSH TABLES t1 FOR EXPORT; +--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg +--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd +UNLOCK TABLES; +ALTER TABLE t2 IMPORT TABLESPACE; + +SET GLOBAL innodb_encryption_threads=2; +SET GLOBAL innodb_encrypt_tables = ON; + +--let $tables_count= `select count(*) + @@global.innodb_undo_tablespaces + 1 from information_schema.tables where engine = 'InnoDB'` --echo # Wait max 10 min for key encryption threads to encrypt all spaces --let $wait_timeout= 600 ---let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 AND ROTATING_OR_FLUSHING <> 0 +--let $wait_condition=SELECT COUNT(*) >= $tables_count FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; --source include/wait_condition.inc ---echo # Success! ---echo # Restart mysqld --innodb_encrypt_tables=0 --innodb_encryption_threads=0 --- let $restart_parameters=--innodb_encrypt_tables=0 --innodb_encryption_threads=0 --- source include/restart_mysqld.inc +--sorted_result +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; +--sorted_result +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; -DROP PROCEDURE innodb_insert_proc; -DROP TABLE t1, t2, t3; +SET GLOBAL innodb_encrypt_tables = OFF; + +--echo # Wait max 10 min for key encryption threads to decrypt all spaces +--let $wait_timeout= 600 +--let $wait_condition=SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0; +--source include/wait_condition.inc + +--sorted_result +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION = 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; + +--sorted_result +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION WHERE MIN_KEY_VERSION <> 0 +AND NAME NOT LIKE 'innodb_undo%' AND NAME NOT LIKE 'mysql/innodb_%_stats' AND NAME NOT LIKE 'mysql/transaction_registry'; + +DROP TABLE t1, t2; +SET GLOBAL innodb_encryption_threads=@start_encr_threads; +SET GLOBAL innodb_encrypt_tables=@start_encrypt_tables; diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/db_use_error.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/db_use_error.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/db_use_error.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/db_use_error.result 2024-08-03 07:29:57.000000000 +0000 @@ -10,7 +10,7 @@ sys test USE DATABASE nond6; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DATABASE nond6' at line 1 +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'nond6' at line 1 DROP DATABASE d6; SHOW DATABASES; Database diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_change_master.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_change_master.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_change_master.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_change_master.result 2024-08-03 07:29:57.000000000 +0000 @@ -26,9 +26,4 @@ CHANGE MASTER TO MASTER_USER='root', MASTER_SSL=0, MASTER_SSL_CA='', MASTER_SSL_CERT='', MASTER_SSL_KEY='', MASTER_SSL_CRL='', MASTER_SSL_CRLPATH=''; CHANGE MASTER TO MASTER_USER='root', MASTER_PASSWORD='', MASTER_SSL=0; -"Usage of CURRENT_POS in CHANGE MASTER MASTER_USE_GTID is dreprecated. -CHANGE MASTER TO MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead -CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_get_lock.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_get_lock.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_get_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_get_lock.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ include/master-slave.inc [connection master] -CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL LOG_WARNINGS=4; create table t1(n int); insert into t1 values(get_lock("lock",2)); disconnect master; @@ -35,4 +35,5 @@ connection master1; drop table t1; connection slave; +connection default; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_row_until.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_row_until.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_row_until.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_row_until.result 2024-08-03 07:29:57.000000000 +0000 @@ -51,7 +51,9 @@ START SLAVE UNTIL RELAY_LOG_FILE='slave-relay-bin.000002', MASTER_LOG_POS=MASTER_LOG_POS; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL START SLAVE UNTIL MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=MASTER_LOG_POS; -include/stop_slave.inc +include/wait_for_slave_io_to_start.inc +include/wait_for_slave_sql_to_stop.inc +include/stop_slave_io.inc include/reset_slave.inc include/start_slave.inc include/rpl_reset.inc diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_server_id1.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_server_id1.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_server_id1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_server_id1.result 2024-08-03 07:29:57.000000000 +0000 @@ -15,7 +15,7 @@ include/wait_for_slave_param.inc [Last_IO_Errno] Last_IO_Errno = '1593' Last_IO_Error = 'Fatal error: The slave I/O thread stops because master and slave have equal MariaDB server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).' -include/stop_slave.inc +include/stop_slave_sql.inc reset slave; reset master; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_session_var.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_session_var.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_session_var.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_session_var.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,16 @@ include/master-slave.inc [connection master] +select @@rpl_semi_sync_master_enabled; +@@rpl_semi_sync_master_enabled +0 +connection slave; +select @@rpl_semi_sync_slave_enabled; +@@rpl_semi_sync_slave_enabled +0 +show status like "rpl_semi_sync_slave_status"; +Variable_name Value +Rpl_semi_sync_slave_status OFF +connection master; drop table if exists t1; Warnings: Note 1051 Unknown table 'test.t1' diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_slave_status.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_slave_status.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/rpl_slave_status.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/rpl_slave_status.result 2024-08-03 07:29:57.000000000 +0000 @@ -36,7 +36,6 @@ include/stop_slave.inc START SLAVE; include/wait_for_slave_sql_to_start.inc -include/wait_for_slave_io_to_stop.inc ==== Verify that Slave IO thread stopped with error ==== include/wait_for_slave_io_error.inc [errno=1045] ==== Cleanup (Note that slave IO thread is not running) ==== diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result mariadb-10.11.9/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result --- mariadb-10.11.6/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/r/tc_partition_analyze.result 2024-08-03 07:29:57.000000000 +0000 @@ -33,7 +33,6 @@ PARTITION `p5` VALUES LESS THAN MAXVALUE ENGINE = ENGINE) ALTER TABLE t1 ANALYZE PARTITION p1,p2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK SELECT * FROM t1 ORDER BY c1; c1 c2 diff -Nru mariadb-10.11.6/mysql-test/suite/engines/funcs/t/rpl_server_id1.test mariadb-10.11.9/mysql-test/suite/engines/funcs/t/rpl_server_id1.test --- mariadb-10.11.6/mysql-test/suite/engines/funcs/t/rpl_server_id1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/engines/funcs/t/rpl_server_id1.test 2024-08-03 07:29:57.000000000 +0000 @@ -25,7 +25,7 @@ --let $status_items= Last_IO_Errno, Last_IO_Error --source include/show_slave_status.inc ---source include/stop_slave.inc +--source include/stop_slave_sql.inc reset slave; reset master; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/federated/federatedx.result mariadb-10.11.9/mysql-test/suite/federated/federatedx.result --- mariadb-10.11.6/mysql-test/suite/federated/federatedx.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/federated/federatedx.result 2024-08-03 07:29:57.000000000 +0000 @@ -2243,6 +2243,7 @@ CREATE TABLE t1(id VARCHAR(20) NOT NULL, PRIMARY KEY(id)) ENGINE=FEDERATED CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/test/t1'; # Dump table t1 using mysqldump tool +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( diff -Nru mariadb-10.11.6/mysql-test/suite/federated/federatedx_create_handlers.result mariadb-10.11.9/mysql-test/suite/federated/federatedx_create_handlers.result --- mariadb-10.11.6/mysql-test/suite/federated/federatedx_create_handlers.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/federated/federatedx_create_handlers.result 2024-08-03 07:29:57.000000000 +0000 @@ -521,6 +521,23 @@ SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3 WHERE id=2) dt2) dt; id name +PREPARE stmt FROM " +SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3 + WHERE id=3) dt2) dt; +"; +EXECUTE stmt; +id name +3 xxx +EXECUTE stmt; +id name +3 xxx +DEALLOCATE PREPARE stmt; +EXPLAIN +SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3 +WHERE id=3) dt2) dt; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY ALL NULL NULL NULL NULL 5 Using where +4 PUSHED DERIVED NULL NULL NULL NULL NULL NULL NULL NULL connection slave; CREATE TABLE federated.t10 (a INT,b INT); CREATE TABLE federated.t11 (a INT, b INT); @@ -541,6 +558,54 @@ a b a b id name 1 1 NULL NULL NULL NULL 2 2 NULL NULL NULL NULL +# +# MDEV-31361: Second execution of PS for query with derived table +# +connection slave; +DROP TABLE IF EXISTS federated.t1; +CREATE TABLE federated.t1 ( +id int(20) NOT NULL, +name varchar(16) NOT NULL default '' +) +DEFAULT CHARSET=latin1; +INSERT INTO federated.t1 VALUES +(3,'xxx'), (7,'yyy'), (4,'xxx'), (1,'zzz'), (5,'yyy'); +connection master; +DROP TABLE IF EXISTS federated.t1; +CREATE TABLE federated.t1 ( +id int(20) NOT NULL, +name varchar(16) NOT NULL default '' +) +ENGINE="FEDERATED" DEFAULT CHARSET=latin1 +CONNECTION='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1'; +use federated; +SELECT * FROM +(SELECT * FROM +(SELECT * FROM +(SELECT * FROM t1 where id>3) dt3 +WHERE id>3) dt2 +) dt; +id name +7 yyy +4 xxx +5 yyy +PREPARE stmt FROM "SELECT * FROM +(SELECT * FROM +(SELECT * FROM +(SELECT * FROM t1 where id>3) dt3 +WHERE id>3) dt2 +) dt"; +EXECUTE stmt; +id name +7 yyy +4 xxx +5 yyy +EXECUTE stmt; +id name +7 yyy +4 xxx +5 yyy +DEALLOCATE PREPARE stmt; set global federated_pushdown=0; connection master; DROP TABLE IF EXISTS federated.t1; diff -Nru mariadb-10.11.6/mysql-test/suite/federated/federatedx_create_handlers.test mariadb-10.11.9/mysql-test/suite/federated/federatedx_create_handlers.test --- mariadb-10.11.6/mysql-test/suite/federated/federatedx_create_handlers.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/federated/federatedx_create_handlers.test 2024-08-03 07:29:57.000000000 +0000 @@ -94,12 +94,9 @@ INSERT INTO federated.t3 VALUES ('yyy'), ('www'), ('yyy'), ('xxx'), ('www'), ('yyy'), ('www'); -#Enable after fix MDEV-31361 ---disable_ps2_protocol SELECT * FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t WHERE federated.t3.name=t.name; ---enable_ps2_protocol EXPLAIN SELECT * @@ -354,6 +351,18 @@ SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3 WHERE id=2) dt2) dt; +PREPARE stmt FROM " +SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3 + WHERE id=3) dt2) dt; +"; +EXECUTE stmt; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + +EXPLAIN +SELECT * FROM (SELECT * FROM (SELECT * FROM (SELECT * FROM t1 where id=3) dt3 + WHERE id=3) dt2) dt; + connection slave; CREATE TABLE federated.t10 (a INT,b INT); CREATE TABLE federated.t11 (a INT, b INT); @@ -379,6 +388,52 @@ WHERE id=2) dt2) dt ) ON t10.a=t11.a; +--echo # +--echo # MDEV-31361: Second execution of PS for query with derived table +--echo # + +connection slave; +DROP TABLE IF EXISTS federated.t1; + +CREATE TABLE federated.t1 ( + id int(20) NOT NULL, + name varchar(16) NOT NULL default '' +) +DEFAULT CHARSET=latin1; + +INSERT INTO federated.t1 VALUES + (3,'xxx'), (7,'yyy'), (4,'xxx'), (1,'zzz'), (5,'yyy'); + +connection master; +DROP TABLE IF EXISTS federated.t1; + +--replace_result $SLAVE_MYPORT SLAVE_PORT +eval +CREATE TABLE federated.t1 ( + id int(20) NOT NULL, + name varchar(16) NOT NULL default '' +) +ENGINE="FEDERATED" DEFAULT CHARSET=latin1 +CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'; + +use federated; + +let $q= +SELECT * FROM + (SELECT * FROM + (SELECT * FROM + (SELECT * FROM t1 where id>3) dt3 + WHERE id>3) dt2 + ) dt; + +eval $q; + +eval PREPARE stmt FROM "$q"; +EXECUTE stmt; +EXECUTE stmt; +DEALLOCATE PREPARE stmt; + + set global federated_pushdown=0; source include/federated_cleanup.inc; diff -Nru mariadb-10.11.6/mysql-test/suite/federated/update.result mariadb-10.11.9/mysql-test/suite/federated/update.result --- mariadb-10.11.6/mysql-test/suite/federated/update.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/federated/update.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,36 @@ +connect master,127.0.0.1,root,,test,$MASTER_MYPORT,; +connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +connection master; +CREATE DATABASE federated; +connection slave; +CREATE DATABASE federated; +# +# MDEV-32984 Update federated table and column privileges +# +connection slave; +create database db1; +create user my@localhost identified by '1qaz2wsx'; +create table db1.t1 ( +f1 int auto_increment primary key, +f2 varchar(50), +f3 varchar(50), +unique (f2) +); +grant insert, select (f1, f2, f3), update (f3) on db1.t1 to my@localhost; +connection master; +create table tt1 engine=federated connection='mysql://my:1qaz2wsx@localhost:$SLAVE_MYPORT/db1/t1'; +insert into tt1 (f2,f3) values ('test','123'); +select * from tt1; +f1 f2 f3 +1 test 123 +update tt1 set f3='123456' where f2='test'; +drop table tt1; +connection slave; +drop database db1; +drop user my@localhost; +connection master; +DROP TABLE IF EXISTS federated.t1; +DROP DATABASE IF EXISTS federated; +connection slave; +DROP TABLE IF EXISTS federated.t1; +DROP DATABASE IF EXISTS federated; diff -Nru mariadb-10.11.6/mysql-test/suite/federated/update.test mariadb-10.11.9/mysql-test/suite/federated/update.test --- mariadb-10.11.6/mysql-test/suite/federated/update.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/federated/update.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,32 @@ +source include/federated.inc; +source have_federatedx.inc; + +--echo # +--echo # MDEV-32984 Update federated table and column privileges +--echo # +connection slave; +create database db1; +create user my@localhost identified by '1qaz2wsx'; +create table db1.t1 ( + f1 int auto_increment primary key, + f2 varchar(50), + f3 varchar(50), + unique (f2) +); +grant insert, select (f1, f2, f3), update (f3) on db1.t1 to my@localhost; + +connection master; +evalp create table tt1 engine=federated connection='mysql://my:1qaz2wsx@localhost:$SLAVE_MYPORT/db1/t1'; +insert into tt1 (f2,f3) values ('test','123'); +select * from tt1; +update tt1 set f3='123456' where f2='test'; + +drop table tt1; + +connection slave; +drop database db1; +drop user my@localhost; + +source include/federated_cleanup.inc; + + diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/innodb_func_view.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/innodb_func_view.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/innodb_func_view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/innodb_func_view.result 2024-08-03 07:29:57.000000000 +0000 @@ -2202,9 +2202,9 @@ IS NOT TRUE ---äÖüß@µ*$-- 4 IS TRUE -1 5 Warnings: -Warning 1292 Truncated incorrect DOUBLE value: ' ' +Warning 1292 Truncated incorrect DOUBLE value: '' Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--' SHOW CREATE VIEW v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select if(`t1_values`.`my_char_30`,'IS TRUE','IS NOT TRUE') AS `IF(my_char_30, 'IS TRUE', 'IS NOT TRUE')`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci @@ -2218,9 +2218,9 @@ IS NOT TRUE ---äÖüß@µ*$-- 4 IS TRUE -1 5 Warnings: -Warning 1292 Truncated incorrect DOUBLE value: ' ' +Warning 1292 Truncated incorrect DOUBLE value: '' Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--' DROP VIEW v1; @@ -3523,9 +3523,9 @@ -1.00 -1 5 -3333.33 -3333.3333 26 Warnings: -Warning 1292 Truncated incorrect DECIMAL value: ' ' +Warning 1292 Truncated incorrect DECIMAL value: '' Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--' SHOW CREATE VIEW v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(`t1_values`.`my_char_30` as decimal(37,2)) AS `CAST(my_char_30 AS DECIMAL(37,2))`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci @@ -3540,9 +3540,9 @@ -1.00 -1 5 -3333.33 -3333.3333 26 Warnings: -Warning 1292 Truncated incorrect DECIMAL value: ' ' +Warning 1292 Truncated incorrect DECIMAL value: '' Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--' DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/innodb_views.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/innodb_views.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/innodb_views.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/innodb_views.result 2024-08-03 07:29:57.000000000 +0000 @@ -22145,9 +22145,9 @@ DROP VIEW v1; CREATE VIEW v1 AS SELECT f1, f2, f3, 'HELLO' AS my_greeting FROM t1; INSERT INTO v1 SET f1 = 1; -ERROR HY000: The target table v1 of the INSERT is not insertable-into SELECT * from t1; f1 f2 f3 f4 +1 NULL NULL NULL DELETE FROM t1; INSERT INTO v1 SET f1 = 1, my_greeting = 'HELLO'; ERROR HY000: The target table v1 of the INSERT is not insertable-into diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/is_columns_is.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/is_columns_is.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/is_columns_is.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/is_columns_is.result 2024-08-03 07:29:57.000000000 +0000 @@ -178,9 +178,9 @@ def information_schema GEOMETRY_COLUMNS SRID 13 NULL NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) select NEVER NULL def information_schema GEOMETRY_COLUMNS STORAGE_TYPE 9 NULL NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) select NEVER NULL def information_schema GLOBAL_STATUS VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL -def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) select NEVER NULL +def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) select NEVER NULL def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL -def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) select NEVER NULL +def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) select NEVER NULL def information_schema INDEX_STATISTICS INDEX_NAME 3 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) select NEVER NULL def information_schema INDEX_STATISTICS ROWS_READ 4 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) select NEVER NULL def information_schema INDEX_STATISTICS TABLE_NAME 2 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) select NEVER NULL @@ -340,9 +340,9 @@ def information_schema SCHEMA_PRIVILEGES TABLE_CATALOG 2 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) select NEVER NULL def information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA 3 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL def information_schema SESSION_STATUS VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL -def information_schema SESSION_STATUS VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) select NEVER NULL +def information_schema SESSION_STATUS VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) select NEVER NULL def information_schema SESSION_VARIABLES VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) select NEVER NULL -def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) select NEVER NULL +def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) select NEVER NULL def information_schema SPATIAL_REF_SYS AUTH_NAME 2 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) select NEVER NULL def information_schema SPATIAL_REF_SYS AUTH_SRID 3 NULL NO int NULL NULL 10 0 NULL NULL NULL int(5) select NEVER NULL def information_schema SPATIAL_REF_SYS SRID 1 NULL NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) select NEVER NULL @@ -729,9 +729,9 @@ NULL information_schema GEOMETRY_COLUMNS MAX_PPR tinyint NULL NULL NULL NULL tinyint(2) NULL information_schema GEOMETRY_COLUMNS SRID smallint NULL NULL NULL NULL smallint(5) 3.0000 information_schema GLOBAL_STATUS VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema GLOBAL_STATUS VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema GLOBAL_STATUS VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) 3.0000 information_schema GLOBAL_VARIABLES VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema GLOBAL_VARIABLES VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema GLOBAL_VARIABLES VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) 3.0000 information_schema INDEX_STATISTICS TABLE_SCHEMA varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192) 3.0000 information_schema INDEX_STATISTICS TABLE_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192) 3.0000 information_schema INDEX_STATISTICS INDEX_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192) @@ -891,9 +891,9 @@ 3.0000 information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) 3.0000 information_schema SCHEMA_PRIVILEGES IS_GRANTABLE varchar 3 9 utf8mb3 utf8mb3_general_ci varchar(3) 3.0000 information_schema SESSION_STATUS VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema SESSION_STATUS VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema SESSION_STATUS VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) 3.0000 information_schema SESSION_VARIABLES VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema SESSION_VARIABLES VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema SESSION_VARIABLES VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) NULL information_schema SPATIAL_REF_SYS SRID smallint NULL NULL NULL NULL smallint(5) 3.0000 information_schema SPATIAL_REF_SYS AUTH_NAME varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512) NULL information_schema SPATIAL_REF_SYS AUTH_SRID int NULL NULL NULL NULL int(5) diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/is_columns_is_embedded.result 2024-08-03 07:29:57.000000000 +0000 @@ -178,9 +178,9 @@ def information_schema GEOMETRY_COLUMNS SRID 13 NULL NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) NEVER NULL def information_schema GEOMETRY_COLUMNS STORAGE_TYPE 9 NULL NO tinyint NULL NULL 3 0 NULL NULL NULL tinyint(2) NEVER NULL def information_schema GLOBAL_STATUS VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL -def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) NEVER NULL +def information_schema GLOBAL_STATUS VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) NEVER NULL def information_schema GLOBAL_VARIABLES VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL -def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) NEVER NULL +def information_schema GLOBAL_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) NEVER NULL def information_schema INDEX_STATISTICS INDEX_NAME 3 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) NEVER NULL def information_schema INDEX_STATISTICS ROWS_READ 4 NULL NO bigint NULL NULL 19 0 NULL NULL NULL bigint(21) NEVER NULL def information_schema INDEX_STATISTICS TABLE_NAME 2 NULL NO varchar 192 576 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(192) NEVER NULL @@ -340,9 +340,9 @@ def information_schema SCHEMA_PRIVILEGES TABLE_CATALOG 2 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) NEVER NULL def information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA 3 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL def information_schema SESSION_STATUS VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL -def information_schema SESSION_STATUS VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) NEVER NULL +def information_schema SESSION_STATUS VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) NEVER NULL def information_schema SESSION_VARIABLES VARIABLE_NAME 1 NULL NO varchar 64 192 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(64) NEVER NULL -def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 2048 6144 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(2048) NEVER NULL +def information_schema SESSION_VARIABLES VARIABLE_VALUE 2 NULL NO varchar 4096 12288 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(4096) NEVER NULL def information_schema SPATIAL_REF_SYS AUTH_NAME 2 NULL NO varchar 512 1536 NULL NULL NULL utf8mb3 utf8mb3_general_ci varchar(512) NEVER NULL def information_schema SPATIAL_REF_SYS AUTH_SRID 3 NULL NO int NULL NULL 10 0 NULL NULL NULL int(5) NEVER NULL def information_schema SPATIAL_REF_SYS SRID 1 NULL NO smallint NULL NULL 5 0 NULL NULL NULL smallint(5) NEVER NULL @@ -729,9 +729,9 @@ NULL information_schema GEOMETRY_COLUMNS MAX_PPR tinyint NULL NULL NULL NULL tinyint(2) NULL information_schema GEOMETRY_COLUMNS SRID smallint NULL NULL NULL NULL smallint(5) 3.0000 information_schema GLOBAL_STATUS VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema GLOBAL_STATUS VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema GLOBAL_STATUS VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) 3.0000 information_schema GLOBAL_VARIABLES VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema GLOBAL_VARIABLES VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema GLOBAL_VARIABLES VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) 3.0000 information_schema INDEX_STATISTICS TABLE_SCHEMA varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192) 3.0000 information_schema INDEX_STATISTICS TABLE_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192) 3.0000 information_schema INDEX_STATISTICS INDEX_NAME varchar 192 576 utf8mb3 utf8mb3_general_ci varchar(192) @@ -891,9 +891,9 @@ 3.0000 information_schema SCHEMA_PRIVILEGES PRIVILEGE_TYPE varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) 3.0000 information_schema SCHEMA_PRIVILEGES IS_GRANTABLE varchar 3 9 utf8mb3 utf8mb3_general_ci varchar(3) 3.0000 information_schema SESSION_STATUS VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema SESSION_STATUS VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema SESSION_STATUS VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) 3.0000 information_schema SESSION_VARIABLES VARIABLE_NAME varchar 64 192 utf8mb3 utf8mb3_general_ci varchar(64) -3.0000 information_schema SESSION_VARIABLES VARIABLE_VALUE varchar 2048 6144 utf8mb3 utf8mb3_general_ci varchar(2048) +3.0000 information_schema SESSION_VARIABLES VARIABLE_VALUE varchar 4096 12288 utf8mb3 utf8mb3_general_ci varchar(4096) NULL information_schema SPATIAL_REF_SYS SRID smallint NULL NULL NULL NULL smallint(5) 3.0000 information_schema SPATIAL_REF_SYS AUTH_NAME varchar 512 1536 utf8mb3 utf8mb3_general_ci varchar(512) NULL information_schema SPATIAL_REF_SYS AUTH_SRID int NULL NULL NULL NULL int(5) diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/memory_func_view.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/memory_func_view.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/memory_func_view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/memory_func_view.result 2024-08-03 07:29:57.000000000 +0000 @@ -2203,9 +2203,9 @@ IS NOT TRUE ---äÖüß@µ*$-- 4 IS TRUE -1 5 Warnings: -Warning 1292 Truncated incorrect DOUBLE value: ' ' +Warning 1292 Truncated incorrect DOUBLE value: '' Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--' SHOW CREATE VIEW v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select if(`t1_values`.`my_char_30`,'IS TRUE','IS NOT TRUE') AS `IF(my_char_30, 'IS TRUE', 'IS NOT TRUE')`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci @@ -2219,9 +2219,9 @@ IS NOT TRUE ---äÖüß@µ*$-- 4 IS TRUE -1 5 Warnings: -Warning 1292 Truncated incorrect DOUBLE value: ' ' +Warning 1292 Truncated incorrect DOUBLE value: '' Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--' DROP VIEW v1; @@ -3524,9 +3524,9 @@ -1.00 -1 5 -3333.33 -3333.3333 26 Warnings: -Warning 1292 Truncated incorrect DECIMAL value: ' ' +Warning 1292 Truncated incorrect DECIMAL value: '' Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--' SHOW CREATE VIEW v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(`t1_values`.`my_char_30` as decimal(37,2)) AS `CAST(my_char_30 AS DECIMAL(37,2))`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci @@ -3541,9 +3541,9 @@ -1.00 -1 5 -3333.33 -3333.3333 26 Warnings: -Warning 1292 Truncated incorrect DECIMAL value: ' ' +Warning 1292 Truncated incorrect DECIMAL value: '' Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--' DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/memory_views.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/memory_views.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/memory_views.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/memory_views.result 2024-08-03 07:29:57.000000000 +0000 @@ -22147,9 +22147,9 @@ DROP VIEW v1; CREATE VIEW v1 AS SELECT f1, f2, f3, 'HELLO' AS my_greeting FROM t1; INSERT INTO v1 SET f1 = 1; -ERROR HY000: The target table v1 of the INSERT is not insertable-into SELECT * from t1; f1 f2 f3 f4 +1 NULL NULL NULL DELETE FROM t1; INSERT INTO v1 SET f1 = 1, my_greeting = 'HELLO'; ERROR HY000: The target table v1 of the INSERT is not insertable-into diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/myisam_func_view.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/myisam_func_view.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/myisam_func_view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/myisam_func_view.result 2024-08-03 07:29:57.000000000 +0000 @@ -2203,9 +2203,9 @@ IS NOT TRUE ---äÖüß@µ*$-- 4 IS TRUE -1 5 Warnings: -Warning 1292 Truncated incorrect DOUBLE value: ' ' +Warning 1292 Truncated incorrect DOUBLE value: '' Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--' SHOW CREATE VIEW v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select if(`t1_values`.`my_char_30`,'IS TRUE','IS NOT TRUE') AS `IF(my_char_30, 'IS TRUE', 'IS NOT TRUE')`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci @@ -2219,9 +2219,9 @@ IS NOT TRUE ---äÖüß@µ*$-- 4 IS TRUE -1 5 Warnings: -Warning 1292 Truncated incorrect DOUBLE value: ' ' +Warning 1292 Truncated incorrect DOUBLE value: '' Warning 1292 Truncated incorrect DOUBLE value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DOUBLE value: ' ---äÖüß@µ*$--' DROP VIEW v1; @@ -3524,9 +3524,9 @@ -1.00 -1 5 -3333.33 -3333.3333 26 Warnings: -Warning 1292 Truncated incorrect DECIMAL value: ' ' +Warning 1292 Truncated incorrect DECIMAL value: '' Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--' SHOW CREATE VIEW v1; View Create View character_set_client collation_connection v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select cast(`t1_values`.`my_char_30` as decimal(37,2)) AS `CAST(my_char_30 AS DECIMAL(37,2))`,`t1_values`.`my_char_30` AS `my_char_30`,`t1_values`.`id` AS `id` from `t1_values` latin1 latin1_swedish_ci @@ -3541,9 +3541,9 @@ -1.00 -1 5 -3333.33 -3333.3333 26 Warnings: -Warning 1292 Truncated incorrect DECIMAL value: ' ' +Warning 1292 Truncated incorrect DECIMAL value: '' Warning 1292 Truncated incorrect DECIMAL value: '<--------30 characters------->' -Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$-- ' +Warning 1292 Truncated incorrect DECIMAL value: ' ---äÖüß@µ*$--' DROP VIEW v1; diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/myisam_views-big.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/myisam_views-big.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/myisam_views-big.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/myisam_views-big.result 2024-08-03 07:29:57.000000000 +0000 @@ -23849,9 +23849,9 @@ DROP VIEW v1; CREATE VIEW v1 AS SELECT f1, f2, f3, 'HELLO' AS my_greeting FROM t1; INSERT INTO v1 SET f1 = 1; -ERROR HY000: The target table v1 of the INSERT is not insertable-into SELECT * from t1; f1 f2 f3 f4 +1 NULL NULL NULL DELETE FROM t1; INSERT INTO v1 SET f1 = 1, my_greeting = 'HELLO'; ERROR HY000: The target table v1 of the INSERT is not insertable-into diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/r/storedproc.result mariadb-10.11.9/mysql-test/suite/funcs_1/r/storedproc.result --- mariadb-10.11.6/mysql-test/suite/funcs_1/r/storedproc.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/r/storedproc.result 2024-08-03 07:29:57.000000000 +0000 @@ -2088,9 +2088,11 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'cursor() SELECT * from t1 where f2=f1' at line 1 CREATE PROCEDURE database() -SELECT * from t1 where f2=f1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database() -SELECT * from t1 where f2=f1' at line 1 +SELECT 1; +CALL database(); +1 +1 +DROP PROCEDURE database; CREATE PROCEDURE databases() SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'databases() @@ -2350,6 +2352,12 @@ SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'join() SELECT * from t1 where f2=f1' at line 1 +CREATE PROCEDURE json_table() +SELECT 1; +CALL json_table(); +1 +1 +DROP PROCEDURE json_table; CREATE PROCEDURE key() SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key() @@ -2470,6 +2478,12 @@ SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'natural() SELECT * from t1 where f2=f1' at line 1 +CREATE PROCEDURE nested() +SELECT 1; +CALL nested(); +1 +1 +DROP PROCEDURE nested; CREATE PROCEDURE not() SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'not() @@ -2509,6 +2523,12 @@ SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'order() SELECT * from t1 where f2=f1' at line 1 +CREATE PROCEDURE ordinality() +SELECT 1; +CALL ordinality; +1 +1 +DROP PROCEDURE ordinality; CREATE PROCEDURE out() SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'out() @@ -2521,6 +2541,12 @@ SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'outfile() SELECT * from t1 where f2=f1' at line 1 +CREATE PROCEDURE path() +SELECT 1; +CALL path(); +1 +1 +DROP PROCEDURE path; CREATE PROCEDURE precision() SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'precision() @@ -2602,9 +2628,11 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'rlike() SELECT * from t1 where f2=f1' at line 1 CREATE PROCEDURE schema() -SELECT * from t1 where f2=f1; -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'schema() -SELECT * from t1 where f2=f1' at line 1 +SELECT 1; +CALL schema(); +1 +1 +DROP PROCEDURE schema; CREATE PROCEDURE schemas() SELECT * from t1 where f2=f1; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'schemas() @@ -4204,9 +4232,6 @@ database:BEGIN SELECT @x; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database:BEGIN -SELECT @x; -END' at line 2 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() databases:BEGIN @@ -4737,6 +4762,11 @@ END' at line 2 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() +json_table:BEGIN +SELECT @x; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() key:BEGIN SELECT @x; END// @@ -4977,6 +5007,11 @@ END' at line 2 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() +nested:BEGIN +SELECT @x; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() not:BEGIN SELECT @x; END// @@ -5057,6 +5092,11 @@ END' at line 2 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() +ordinality:BEGIN +SELECT @x; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() out:BEGIN SELECT @x; END// @@ -5081,6 +5121,11 @@ END' at line 2 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() +path:BEGIN +SELECT @x; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() precision:BEGIN SELECT @x; END// @@ -5253,9 +5298,6 @@ schema:BEGIN SELECT @x; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'schema:BEGIN -SELECT @x; -END' at line 2 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() schemas:BEGIN @@ -7811,8 +7853,6 @@ BEGIN declare database char; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database char; -END' at line 3 DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() BEGIN @@ -8278,6 +8318,11 @@ DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() BEGIN +declare json_table char; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() +BEGIN declare key char; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key char; @@ -8488,6 +8533,11 @@ DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() BEGIN +declare nested char; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() +BEGIN declare not char; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'not char; @@ -8556,6 +8606,11 @@ DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() BEGIN +declare ordinality char; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() +BEGIN declare out char; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'out char; @@ -8577,6 +8632,11 @@ DROP PROCEDURE IF EXISTS sp1; CREATE PROCEDURE sp1() BEGIN +declare path char; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1() +BEGIN declare precision char; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'precision char; @@ -8745,11 +8805,7 @@ BEGIN declare schema char; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'schema char; -END' at line 3 DROP PROCEDURE IF EXISTS sp1; -Warnings: -Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1() BEGIN declare schemas char; @@ -9704,11 +9760,7 @@ declare database condition for sqlstate '02000'; declare exit handler for database set @var2 = 1; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database condition for sqlstate '02000'; -declare exit handler for database se...' at line 3 DROP PROCEDURE IF EXISTS sp1; -Warnings: -Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN declare databases condition for sqlstate '02000'; @@ -10372,6 +10424,12 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare json_table condition for sqlstate '02000'; +declare exit handler for json_table set @var2 = 1; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1( ) +BEGIN declare key condition for sqlstate '02000'; declare exit handler for key set @var2 = 1; END// @@ -10672,6 +10730,12 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare nested condition for sqlstate '02000'; +declare exit handler for nested set @var2 = 1; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1( ) +BEGIN declare not condition for sqlstate '02000'; declare exit handler for not set @var2 = 1; END// @@ -10768,6 +10832,12 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare ordinality condition for sqlstate '02000'; +declare exit handler for ordinality set @var2 = 1; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1( ) +BEGIN declare out condition for sqlstate '02000'; declare exit handler for out set @var2 = 1; END// @@ -10798,6 +10868,12 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare path condition for sqlstate '02000'; +declare exit handler for path set @var2 = 1; +END// +DROP PROCEDURE sp1; +CREATE PROCEDURE sp1( ) +BEGIN declare precision condition for sqlstate '02000'; declare exit handler for precision set @var2 = 1; END// @@ -11021,11 +11097,7 @@ declare schema condition for sqlstate '02000'; declare exit handler for schema set @var2 = 1; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'schema condition for sqlstate '02000'; -declare exit handler for schema set @v...' at line 3 DROP PROCEDURE IF EXISTS sp1; -Warnings: -Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN declare schemas condition for sqlstate '02000'; @@ -11974,8 +12046,7 @@ BEGIN declare database handler for sqlstate '02000' set @var2 = 1; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database handler for sqlstate '02000' set @var2 = 1; -END' at line 3 +ERROR HY000: Unknown data type: 'handler' DROP PROCEDURE IF EXISTS sp1; Warnings: Note 1305 PROCEDURE db_storedproc.sp1 does not exist @@ -12571,6 +12642,11 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare json_table handler for sqlstate '02000' set @var2 = 1; +END// +ERROR HY000: Unknown data type: 'handler' +CREATE PROCEDURE sp1( ) +BEGIN declare key handler for sqlstate '02000' set @var2 = 1; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key handler for sqlstate '02000' set @var2 = 1; @@ -12841,6 +12917,11 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare nested handler for sqlstate '02000' set @var2 = 1; +END// +ERROR HY000: Unknown data type: 'handler' +CREATE PROCEDURE sp1( ) +BEGIN declare not handler for sqlstate '02000' set @var2 = 1; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'not handler for sqlstate '02000' set @var2 = 1; @@ -12930,6 +13011,11 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare ordinality handler for sqlstate '02000' set @var2 = 1; +END// +ERROR HY000: Unknown data type: 'handler' +CREATE PROCEDURE sp1( ) +BEGIN declare out handler for sqlstate '02000' set @var2 = 1; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'out handler for sqlstate '02000' set @var2 = 1; @@ -12957,6 +13043,11 @@ Note 1305 PROCEDURE db_storedproc.sp1 does not exist CREATE PROCEDURE sp1( ) BEGIN +declare path handler for sqlstate '02000' set @var2 = 1; +END// +ERROR HY000: Unknown data type: 'handler' +CREATE PROCEDURE sp1( ) +BEGIN declare precision handler for sqlstate '02000' set @var2 = 1; END// ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'precision handler for sqlstate '02000' set @var2 = 1; @@ -13164,8 +13255,7 @@ BEGIN declare schema handler for sqlstate '02000' set @var2 = 1; END// -ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'schema handler for sqlstate '02000' set @var2 = 1; -END' at line 3 +ERROR HY000: Unknown data type: 'handler' DROP PROCEDURE IF EXISTS sp1; Warnings: Note 1305 PROCEDURE db_storedproc.sp1 does not exist diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/t/storedproc.test mariadb-10.11.9/mysql-test/suite/funcs_1/t/storedproc.test --- mariadb-10.11.6/mysql-test/suite/funcs_1/t/storedproc.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/t/storedproc.test 2024-08-03 07:29:57.000000000 +0000 @@ -1102,9 +1102,11 @@ CREATE PROCEDURE cursor() SELECT * from t1 where f2=f1; ---error ER_PARSE_ERROR CREATE PROCEDURE database() - SELECT * from t1 where f2=f1; + SELECT 1; + +CALL database(); +DROP PROCEDURE database; --error ER_PARSE_ERROR CREATE PROCEDURE databases() @@ -1367,6 +1369,12 @@ CREATE PROCEDURE join() SELECT * from t1 where f2=f1; +CREATE PROCEDURE json_table() + SELECT 1; + +CALL json_table(); +DROP PROCEDURE json_table; + --error ER_PARSE_ERROR CREATE PROCEDURE key() SELECT * from t1 where f2=f1; @@ -1487,6 +1495,13 @@ CREATE PROCEDURE natural() SELECT * from t1 where f2=f1; +CREATE PROCEDURE nested() + SELECT 1; + +CALL nested(); + +DROP PROCEDURE nested; + --error ER_PARSE_ERROR CREATE PROCEDURE not() SELECT * from t1 where f2=f1; @@ -1527,6 +1542,13 @@ CREATE PROCEDURE order() SELECT * from t1 where f2=f1; +CREATE PROCEDURE ordinality() + SELECT 1; + +CALL ordinality; + +DROP PROCEDURE ordinality; + --error ER_PARSE_ERROR CREATE PROCEDURE out() SELECT * from t1 where f2=f1; @@ -1539,6 +1561,13 @@ CREATE PROCEDURE outfile() SELECT * from t1 where f2=f1; +CREATE PROCEDURE path() + SELECT 1; + +CALL path(); + +DROP PROCEDURE path; + --error ER_PARSE_ERROR CREATE PROCEDURE precision() SELECT * from t1 where f2=f1; @@ -1619,9 +1648,11 @@ CREATE PROCEDURE rlike() SELECT * from t1 where f2=f1; ---error ER_PARSE_ERROR CREATE PROCEDURE schema() - SELECT * from t1 where f2=f1; + SELECT 1; + +CALL schema(); +DROP PROCEDURE schema; --error ER_PARSE_ERROR CREATE PROCEDURE schemas() @@ -3481,7 +3512,7 @@ --enable_warnings delimiter //; ---error ER_PARSE_ERROR + CREATE PROCEDURE sp1() database:BEGIN SELECT @x; @@ -4285,6 +4316,15 @@ --enable_warnings delimiter //; +CREATE PROCEDURE sp1() + json_table:BEGIN + SELECT @x; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() key:BEGIN @@ -4645,6 +4685,16 @@ --enable_warnings delimiter //; + +CREATE PROCEDURE sp1() + nested:BEGIN + SELECT @x; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() not:BEGIN @@ -4766,6 +4816,16 @@ --enable_warnings delimiter //; + +CREATE PROCEDURE sp1() + ordinality:BEGIN + SELECT @x; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() out:BEGIN @@ -4802,6 +4862,16 @@ --enable_warnings delimiter //; + +CREATE PROCEDURE sp1() + path:BEGIN + SELECT @x; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() precision:BEGIN @@ -5066,7 +5136,7 @@ --enable_warnings delimiter //; ---error ER_PARSE_ERROR + CREATE PROCEDURE sp1() schema:BEGIN SELECT @x; @@ -8938,7 +9008,7 @@ --enable_warnings delimiter //; ---error ER_PARSE_ERROR + CREATE PROCEDURE sp1() BEGIN declare database char; @@ -9736,12 +9806,21 @@ declare join char; END// delimiter ;// - --disable_warnings DROP PROCEDURE IF EXISTS sp1; --enable_warnings delimiter //; + +CREATE PROCEDURE sp1() +BEGIN + declare json_table char; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() BEGIN @@ -10102,6 +10181,16 @@ --enable_warnings delimiter //; + +CREATE PROCEDURE sp1() +BEGIN + declare nested char; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() BEGIN @@ -10221,6 +10310,16 @@ --enable_warnings delimiter //; + +CREATE PROCEDURE sp1() +BEGIN + declare ordinality char; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() BEGIN @@ -10257,6 +10356,16 @@ --enable_warnings delimiter //; + +CREATE PROCEDURE sp1() +BEGIN + declare path char; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1() BEGIN @@ -10506,7 +10615,7 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; ---error ER_PARSE_ERROR + CREATE PROCEDURE sp1() BEGIN declare schema char; @@ -11624,7 +11733,7 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; ---error ER_PARSE_ERROR + CREATE PROCEDURE sp1( ) BEGIN declare database condition for sqlstate '02000'; @@ -12361,6 +12470,17 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; + +CREATE PROCEDURE sp1( ) +BEGIN + declare json_table condition for sqlstate '02000'; + declare exit handler for json_table set @var2 = 1; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -12691,6 +12811,17 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; + +CREATE PROCEDURE sp1( ) +BEGIN + declare nested condition for sqlstate '02000'; + declare exit handler for nested set @var2 = 1; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -12800,6 +12931,17 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; + +CREATE PROCEDURE sp1( ) +BEGIN + declare ordinality condition for sqlstate '02000'; + declare exit handler for ordinality set @var2 = 1; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -12833,6 +12975,17 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; + +CREATE PROCEDURE sp1( ) +BEGIN + declare path condition for sqlstate '02000'; + declare exit handler for path set @var2 = 1; +END// +delimiter ;// + +DROP PROCEDURE sp1; + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -13075,7 +13228,7 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; ---error ER_PARSE_ERROR + CREATE PROCEDURE sp1( ) BEGIN declare schema condition for sqlstate '02000'; @@ -14181,7 +14334,7 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; ---error ER_PARSE_ERROR + CREATE PROCEDURE sp1( ) BEGIN declare database handler for sqlstate '02000' set @var2 = 1; @@ -14851,6 +15004,14 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; +--error ER_UNKNOWN_DATA_TYPE +CREATE PROCEDURE sp1( ) +BEGIN + declare json_table handler for sqlstate '02000' set @var2 = 1; +END// +delimiter ;// + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -15151,6 +15312,14 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; +--error ER_UNKNOWN_DATA_TYPE +CREATE PROCEDURE sp1( ) +BEGIN + declare nested handler for sqlstate '02000' set @var2 = 1; +END// +delimiter ;// + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -15251,6 +15420,14 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; +--error ER_UNKNOWN_DATA_TYPE +CREATE PROCEDURE sp1( ) +BEGIN + declare ordinality handler for sqlstate '02000' set @var2 = 1; +END// +delimiter ;// + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -15281,6 +15458,14 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; +--error ER_UNKNOWN_DATA_TYPE +CREATE PROCEDURE sp1( ) +BEGIN + declare path handler for sqlstate '02000' set @var2 = 1; +END// +delimiter ;// + +delimiter //; --error ER_PARSE_ERROR CREATE PROCEDURE sp1( ) BEGIN @@ -15511,7 +15696,7 @@ DROP PROCEDURE IF EXISTS sp1; delimiter //; ---error ER_PARSE_ERROR +--error ER_UNKNOWN_DATA_TYPE CREATE PROCEDURE sp1( ) BEGIN declare schema handler for sqlstate '02000' set @var2 = 1; diff -Nru mariadb-10.11.6/mysql-test/suite/funcs_1/views/views_master.inc mariadb-10.11.9/mysql-test/suite/funcs_1/views/views_master.inc --- mariadb-10.11.6/mysql-test/suite/funcs_1/views/views_master.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/funcs_1/views/views_master.inc 2024-08-03 07:29:57.000000000 +0000 @@ -3085,8 +3085,10 @@ # the following line as written as '--eror ER_TOO_MANY_TABLES' and the command # is successful so assuming no expected error was intended # --error ER_TOO_MANY_TABLES +--disable_ps2_protocol eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$level; +--enable_ps2_protocol let $message= The output of following EXPLAIN is deactivated, because the result differs on some platforms FIXME Is this a bug ? ; @@ -3116,16 +3118,20 @@ CREATE OR REPLACE VIEW test2.v0 AS SELECT CAST('0001-01-01' AS DATE) as f1, f2 FROM test3.t1; eval SHOW CREATE VIEW test1.v$toplevel; +--disable_ps2_protocol eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; +--enable_ps2_protocol eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; # 2.3.3 UCS2 string instead of common string CREATE OR REPLACE VIEW test3.v0 AS SELECT f1 , CONVERT('ßÄäÖöÜü§' USING UCS2) as f2 FROM test1.t1; eval SHOW CREATE VIEW test1.v$toplevel; +--disable_ps2_protocol eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; +--enable_ps2_protocol eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; @@ -3133,8 +3139,10 @@ CREATE OR REPLACE VIEW test3.v0 AS SELECT CONVERT('ßÄäÖöÜü§' USING UCS2) as f1, f2 FROM test1.t1; eval SHOW CREATE VIEW test1.v$toplevel; +--disable_ps2_protocol eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; +--enable_ps2_protocol eval EXPLAIN SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; --enable_result_log @@ -3479,7 +3487,6 @@ # Maybe the SQL standard allows the following INSERT. # But it would be a very sophisticated DBMS. ---error ER_NON_INSERTABLE_TABLE INSERT INTO v1 SET f1 = 1; SELECT * from t1; DELETE FROM t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/disabled.def mariadb-10.11.9/mysql-test/suite/galera/disabled.def --- mariadb-10.11.6/mysql-test/suite/galera/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/disabled.def 2024-08-03 07:29:57.000000000 +0000 @@ -12,12 +12,13 @@ galera_as_slave_ctas : MDEV-28378 timeout galera_pc_recovery : MDEV-25199 cluster fails to start up -galera_sst_encrypted : MDEV-29876 Galera test failure on galera_sst_encrypted -galera_var_node_address : MDEV-20485 Galera test failure galera_bf_kill_debug : timeout after 900 seconds galera_ssl_upgrade : [Warning] Failed to load slave replication state from table mysql.gtid_slave_pos: 130: Incorrect file format 'gtid_slave_pos' galera_parallel_simple : timeout related to wsrep_sync_wait galera_insert_bulk : MDEV-30536 no expected deadlock in galera_insert_bulk test -versioning_trx_id : MDEV-18590: galera.versioning_trx_id: Test failure: mysqltest: Result content mismatch -galera_sequences : MDEV-32024 -mdev-31285 : MDEV-25089 Assertion `error.len > 0' failed in galera::ReplicatorSMM::handle_apply_error() +galera_sequences : MDEV-32561 WSREP FSM failure: no such a transition REPLICATING -> COMMITTED +galera_concurrent_ctas : MDEV-32779 galera_concurrent_ctas: assertion in the galera::ReplicatorSMM::finish_cert() +galera_as_slave_replay : MDEV-32780 galera_as_slave_replay: assertion in the wsrep::transaction::before_rollback() +galera_slave_replay : MDEV-32780 galera_as_slave_replay: assertion in the wsrep::transaction::before_rollback() +galera_sst_mysqldump_with_key : MDEV-32782 galera_sst_mysqldump_with_key test failed +galera_var_ignore_apply_errors : MENT-1997 galera_var_ignore_apply_errors test freezes diff -Nru mariadb-10.11.6/mysql-test/suite/galera/galera_2nodes.cnf mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes.cnf --- mariadb-10.11.6/mysql-test/suite/galera/galera_2nodes.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -33,6 +33,9 @@ wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port' +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + [ENV] NODE_MYPORT_1= @mysqld.1.port NODE_MYSOCK_1= @mysqld.1.socket diff -Nru mariadb-10.11.6/mysql-test/suite/galera/galera_2nodes_as_master.cnf mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes_as_master.cnf --- mariadb-10.11.6/mysql-test/suite/galera/galera_2nodes_as_master.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes_as_master.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -47,6 +47,9 @@ wsrep-on=OFF server-id=3 +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + [ENV] NODE_MYPORT_1= @mysqld.1.port NODE_MYSOCK_1= @mysqld.1.socket diff -Nru mariadb-10.11.6/mysql-test/suite/galera/galera_2nodes_as_slave.cnf mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes_as_slave.cnf --- mariadb-10.11.6/mysql-test/suite/galera/galera_2nodes_as_slave.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/galera_2nodes_as_slave.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -46,6 +46,9 @@ wsrep-on=OFF server-id=3 +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + [ENV] NODE_MYPORT_1= @mysqld.1.port NODE_MYSOCK_1= @mysqld.1.socket diff -Nru mariadb-10.11.6/mysql-test/suite/galera/galera_2x2nodes.cnf mariadb-10.11.9/mysql-test/suite/galera/galera_2x2nodes.cnf --- mariadb-10.11.6/mysql-test/suite/galera/galera_2x2nodes.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/galera_2x2nodes.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -11,7 +11,6 @@ wsrep_gtid_mode=1 gtid_ignore_duplicates auto_increment_increment=3 - wsrep-provider=@ENV.WSREP_PROVIDER # enforce read-committed characteristics across the cluster # wsrep-causal-reads=ON @@ -61,6 +60,9 @@ wsrep_node_incoming_address=127.0.0.1:@mysqld.4.port wsrep_sst_receive_address='127.0.0.1:@mysqld.4.#sst_port' +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + [ENV] NODE_MYPORT_1= @mysqld.1.port NODE_MYSOCK_1= @mysqld.1.socket @@ -73,5 +75,3 @@ NODE_MYPORT_4= @mysqld.4.port NODE_MYSOCK_4= @mysqld.4.socket - - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/galera_3nodes_as_slave.cnf mariadb-10.11.9/mysql-test/suite/galera/galera_3nodes_as_slave.cnf --- mariadb-10.11.6/mysql-test/suite/galera/galera_3nodes_as_slave.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/galera_3nodes_as_slave.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -59,6 +59,9 @@ wsrep-on=OFF server-id=4 +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + [ENV] NODE_MYPORT_1= @mysqld.1.port NODE_MYSOCK_1= @mysqld.1.socket diff -Nru mariadb-10.11.6/mysql-test/suite/galera/galera_4nodes.cnf mariadb-10.11.9/mysql-test/suite/galera/galera_4nodes.cnf --- mariadb-10.11.6/mysql-test/suite/galera/galera_4nodes.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/galera_4nodes.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -21,6 +21,7 @@ wsrep_node_address='127.0.0.1:@mysqld.1.#galera_port' wsrep_node_incoming_address=127.0.0.1:@mysqld.1.port wsrep_sst_receive_address='127.0.0.1:@mysqld.1.#sst_port' +auto-increment-offset=1 [mysqld.2] wsrep-on=1 @@ -32,6 +33,7 @@ wsrep_node_address='127.0.0.1:@mysqld.2.#galera_port' wsrep_node_incoming_address=127.0.0.1:@mysqld.2.port wsrep_sst_receive_address='127.0.0.1:@mysqld.2.#sst_port' +auto-increment-offset=2 [mysqld.3] wsrep-on=1 @@ -43,6 +45,7 @@ wsrep_node_address='127.0.0.1:@mysqld.3.#galera_port' wsrep_node_incoming_address=127.0.0.1:@mysqld.3.port wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port' +auto-increment-offset=3 [mysqld.4] wsrep-on=1 @@ -54,6 +57,10 @@ wsrep_node_address='127.0.0.1:@mysqld.4.#galera_port' wsrep_node_incoming_address=127.0.0.1:@mysqld.4.port wsrep_sst_receive_address='127.0.0.1:@mysqld.4.#sst_port' +auto-increment-offset=4 + +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log [ENV] NODE_MYPORT_1= @mysqld.1.port diff -Nru mariadb-10.11.6/mysql-test/suite/galera/include/galera_sst_restore.inc mariadb-10.11.9/mysql-test/suite/galera/include/galera_sst_restore.inc --- mariadb-10.11.6/mysql-test/suite/galera/include/galera_sst_restore.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/include/galera_sst_restore.inc 2024-08-03 07:29:57.000000000 +0000 @@ -20,7 +20,7 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); --disable_query_log --eval SET GLOBAL wsrep_sst_method = '$wsrep_sst_method_orig'; --eval SET GLOBAL wsrep_sst_receive_address = '$wsrep_sst_receive_address_orig'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc mariadb-10.11.9/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc --- mariadb-10.11.6/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/include/galera_sst_set_mysqldump.inc 2024-08-03 07:29:57.000000000 +0000 @@ -4,8 +4,8 @@ --echo Setting SST method to mysqldump ... -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); --connection node_1 # We need a user with a password to perform SST, otherwise we hit LP #1378253 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/include/kill_galera.inc mariadb-10.11.9/mysql-test/suite/galera/include/kill_galera.inc --- mariadb-10.11.6/mysql-test/suite/galera/include/kill_galera.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/include/kill_galera.inc 2024-08-03 07:29:57.000000000 +0000 @@ -8,7 +8,7 @@ # Write file to make mysql-test-run.pl expect the crash, but don't start it --let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name # Kill the connected server --disable_reconnect diff -Nru mariadb-10.11.6/mysql-test/suite/galera/include/shutdown_mysqld.inc mariadb-10.11.9/mysql-test/suite/galera/include/shutdown_mysqld.inc --- mariadb-10.11.6/mysql-test/suite/galera/include/shutdown_mysqld.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/include/shutdown_mysqld.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -# This is the first half of include/restart_mysqld.inc. -if ($rpl_inited) -{ - if (!$allow_rpl_inited) - { - --die ERROR IN TEST: When using the replication test framework (master-slave.inc, rpl_init.inc etc), use rpl_restart_server.inc instead of restart_mysqld.inc. If you know what you are doing and you really have to use restart_mysqld.inc, set allow_rpl_inited=1 before you source restart_mysqld.inc - } -} - -# Write file to make mysql-test-run.pl expect the "crash", but don't start it ---let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` ---let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo "wait" > $_expect_file_name - -# Send shutdown to the connected server ---shutdown_server ---source include/wait_until_disconnected.inc - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/include/start_mysqld.inc mariadb-10.11.9/mysql-test/suite/galera/include/start_mysqld.inc --- mariadb-10.11.6/mysql-test/suite/galera/include/start_mysqld.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/include/start_mysqld.inc 2024-08-03 07:29:57.000000000 +0000 @@ -4,12 +4,12 @@ if ($galera_wsrep_start_position != '') { --echo Using --wsrep-start-position when starting mysqld ... - --exec echo "restart:$start_mysqld_params --wsrep-start-position=$galera_wsrep_start_position" > $_expect_file_name + --write_line "restart:$start_mysqld_params --wsrep-start-position=$galera_wsrep_start_position" $_expect_file_name --let $galera_wsrep_start_position = 0 } if ($galera_wsrep_start_position == '') { - --exec echo "restart:$start_mysqld_params" > $_expect_file_name + --write_line "restart:$start_mysqld_params" $_expect_file_name } --source include/galera_wait_ready.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/GAL-401.result mariadb-10.11.9/mysql-test/suite/galera/r/GAL-401.result --- mariadb-10.11.6/mysql-test/suite/galera/r/GAL-401.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/GAL-401.result 2024-08-03 07:29:57.000000000 +0000 @@ -24,6 +24,6 @@ PRIMARY KEY (`f1`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; -CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender (.*) is not in state transfer \\(SYNCED\\)\\. Message ignored\\."); connection node_1; SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=false'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/GAL-419.result mariadb-10.11.9/mysql-test/suite/galera/r/GAL-419.result --- mariadb-10.11.6/mysql-test/suite/galera/r/GAL-419.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/GAL-419.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,10 +1,11 @@ connection node_2; connection node_1; -call mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node.*"); +call mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node"); call mtr.add_suppression("Aborting"); -call mtr.add_suppression("Plugin \'wsrep\' init function returned error."); -call mtr.add_suppression("Plugin \'wsrep\' registration as a STORAGE ENGINE failed."); -call mtr.add_suppression("Failed to initialize plugins."); +call mtr.add_suppression("Plugin 'wsrep' init function returned error"); +call mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed"); +call mtr.add_suppression("Plugin 'wsrep' registration as a FUNCTION failed"); +call mtr.add_suppression("Failed to initialize plugins"); connection node_2; SET SESSION wsrep_sync_wait = 0; Killing server ... diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/GCF-939.result mariadb-10.11.9/mysql-test/suite/galera/r/GCF-939.result --- mariadb-10.11.6/mysql-test/suite/galera/r/GCF-939.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/GCF-939.result 2024-08-03 07:29:57.000000000 +0000 @@ -8,6 +8,6 @@ GRA_.log GRA_.log DROP TABLE t1; -CALL mtr.add_suppression("Ignoring error 'Unknown table 'test.t1'' on query"); +CALL mtr.add_suppression("Ignoring error 'Unknown table 'test\\.t1'' on query"); connection node_2; -CALL mtr.add_suppression("Error 'Unknown table 'test.t1'' on query"); +CALL mtr.add_suppression("Error 'Unknown table 'test\\.t1'' on query"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-21479.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-21479.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-21479.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-21479.result 2024-08-03 07:29:57.000000000 +0000 @@ -66,7 +66,7 @@ Variable_name Value wsrep_desync_count 0 SET @@global.wsrep_desync = 0; -CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender (.*) is not in state transfer \\(SYNCED\\)\\. Message ignored\\."); connection node_1; # Wait until both nodes are back to cluster SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=false'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-22232.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-22232.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-22232.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-22232.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,27 @@ +connection node_2; +connection node_1; +connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1; +--- CTAS with empty result set --- +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort'; +CREATE TABLE t2 SELECT * FROM t1; +connection node_1; +SET DEBUG_SYNC = 'now WAIT_FOR may_run'; +TRUNCATE TABLE t1; +connection con1; +ERROR 70100: Query execution was interrupted +SET DEBUG_SYNC = 'RESET'; +--- CTAS with non-empty result set --- +INSERT INTO t1 VALUES (10), (20), (30); +SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort'; +CREATE TABLE t2 SELECT * FROM t1; +connection node_1; +SET DEBUG_SYNC = 'now WAIT_FOR may_run'; +TRUNCATE TABLE t1; +connection con1; +ERROR 70100: Query execution was interrupted +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +disconnect con1; +disconnect node_2; +disconnect node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-24143.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-24143.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-24143.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-24143.result 2024-08-03 07:29:57.000000000 +0000 @@ -14,7 +14,7 @@ INSERT INTO t1 VALUES (4),(3),(1),(2); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE; -ERROR 42S01: Table 't1' already exists +ERROR 42000: This version of MariaDB doesn't yet support 'non-InnoDB sequences in Galera cluster' ALTER TABLE t1 DROP COLUMN c2; ERROR 42000: Can't DROP COLUMN `c2`; check that it exists SELECT get_lock ('test', 1.5); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-25731.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-25731.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-25731.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-25731.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,47 @@ +connection node_2; +connection node_1; +connection node_1; +SET GLOBAL wsrep_load_data_splitting=ON; +Warnings: +Warning 1287 '@@wsrep_load_data_splitting' is deprecated and will be removed in a future release +SET GLOBAL wsrep_mode=REPLICATE_MYISAM; +CREATE TABLE t1 (c1 int) ENGINE=MYISAM; +LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n'; +Warnings: +Warning 1235 wsrep_load_data_splitting for other than InnoDB tables +SELECT COUNT(*) AS EXPECT_6 FROM t1; +EXPECT_6 +6 +connection node_2; +SELECT COUNT(*) AS EXPECT_6 FROM t1; +EXPECT_6 +6 +connection node_1; +ALTER TABLE t1 ENGINE=Aria; +SET GLOBAL wsrep_mode=REPLICATE_ARIA; +LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n'; +Warnings: +Warning 1235 wsrep_load_data_splitting for other than InnoDB tables +SELECT COUNT(*) AS EXPECT_12 FROM t1; +EXPECT_12 +12 +connection node_2; +SELECT COUNT(*) AS EXPECT_12 FROM t1; +EXPECT_12 +12 +connection node_1; +ALTER TABLE t1 ENGINE=InnoDB; +LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n'; +SELECT COUNT(*) AS EXPECT_18 FROM t1; +EXPECT_18 +18 +connection node_2; +SELECT COUNT(*) AS EXPECT_18 FROM t1; +EXPECT_18 +18 +connection node_1; +DROP TABLE t1; +SET GLOBAL wsrep_load_data_splitting=OFF; +Warnings: +Warning 1287 '@@wsrep_load_data_splitting' is deprecated and will be removed in a future release +SET GLOBAL wsrep_mode=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-26499.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-26499.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-26499.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-26499.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,6 @@ +connection node_2; +connection node_1; +connection node_1; +connection node_2; +connection node_2; +SET GLOBAL debug_dbug="+d,simulate_slow_client_at_shutdown"; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-26575.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-26575.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-26575.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-26575.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,7 @@ connection node_2; connection node_1; connection node_2; -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); connection node_1; connection node_1; connection node_2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-27276.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-27276.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-27276.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-27276.result 2024-08-03 07:29:57.000000000 +0000 @@ -16,17 +16,15 @@ SET SESSION wsrep_on = 0; SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; connection node_1; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; SET GLOBAL wsrep_provider_options = 'dbug='; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1a; +SET SESSION DEBUG_SYNC = "RESET"; connection node_2; SELECT * FROM p; id f2 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-27806.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-27806.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-27806.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-27806.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,52 @@ +connection node_2; +connection node_1; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +INSERT INTO t1 VALUES (1),(2),(3); +CREATE TABLE ts1 AS SELECT * FROM t1; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-bin.000002 # Gtid # # BEGIN GTID #-#-# +mysqld-bin.000002 # Query # # use `test`; CREATE TABLE `ts1` ( + `f1` int(11) NOT NULL +) +mysqld-bin.000002 # Annotate_rows # # CREATE TABLE ts1 AS SELECT * FROM t1 +mysqld-bin.000002 # Table_map # # table_id: # (test.ts1) +mysqld-bin.000002 # Write_rows_v1 # # table_id: # flags: STMT_END_F +mysqld-bin.000002 # Xid # # COMMIT /* XID */ +connection node_2; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-bin.000003 # Gtid # # BEGIN GTID #-#-# +mysqld-bin.000003 # Query # # use `test`; CREATE TABLE `ts1` ( + `f1` int(11) NOT NULL +) +mysqld-bin.000003 # Annotate_rows # # CREATE TABLE ts1 AS SELECT * FROM t1 +mysqld-bin.000003 # Table_map # # table_id: # (test.ts1) +mysqld-bin.000003 # Write_rows_v1 # # table_id: # flags: STMT_END_F +mysqld-bin.000003 # Xid # # COMMIT /* XID */ +BINLOG_POSITIONS_MATCH +1 +DROP TABLE t1,ts1; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE ts1 AS SELECT * FROM t1; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-bin.000002 # Gtid # # BEGIN GTID #-#-# +mysqld-bin.000002 # Query # # use `test`; CREATE TABLE `ts1` ( + `f1` int(11) NOT NULL +) +mysqld-bin.000002 # Query # # COMMIT +connection node_2; +include/show_binlog_events.inc +Log_name Pos Event_type Server_id End_log_pos Info +mysqld-bin.000003 # Gtid # # BEGIN GTID #-#-# +mysqld-bin.000003 # Query # # use `test`; CREATE TABLE `ts1` ( + `f1` int(11) NOT NULL +) +mysqld-bin.000003 # Query # # COMMIT +BINLOG_POSITIONS_MATCH +1 +DROP TABLE t1,ts1; +CALL mtr.add_suppression("Ignoring server id for non bootstrap node"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-29142.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-29142.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-29142.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-29142.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,14 +3,14 @@ connection node_1; connection node_2; connection node_1; -call mtr.add_suppression("WSREP: Event .* Write_rows_v1 apply failed:.*"); -call mtr.add_suppression("WSREP: Failed to apply write set:.*"); -call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on.*"); +call mtr.add_suppression("WSREP: Event .* Write_rows_v1 apply failed: "); +call mtr.add_suppression("WSREP: Failed to apply write set: "); +call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); connection node_2; -call mtr.add_suppression("WSREP: Failed to open table mysql.wsrep_streaming_log for writing"); +call mtr.add_suppression("WSREP: Failed to open table mysql\\.wsrep_streaming_log for writing"); call mtr.add_suppression("WSREP: Failed to open SR table for write"); call mtr.add_suppression("WSREP: Failed to recover SR transactions from schema: wsrep_on : 0"); -call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on.*"); +call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); SET @@global.tx_read_only = ON; SET default_storage_engine = SEQUENCE; create table t1 (c1 int); @@ -39,7 +39,7 @@ SET SESSION wsrep_sync_wait = 0; Killing server ... connection node_2; -call mtr.add_suppression("WSREP: Failed to open table mysql.wsrep_streaming_log for writing"); +call mtr.add_suppression("WSREP: Failed to open table mysql\\.wsrep_streaming_log for writing"); call mtr.add_suppression("WSREP: Failed to open SR table for write"); call mtr.add_suppression("WSREP: Failed to recover SR transactions from schema: wsrep_on : 0"); DROP TABLE IF EXISTS t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-31272.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-31272.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-31272.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-31272.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,36 @@ +connection node_2; +connection node_1; +connection node_1; +CREATE TABLE t1 (f1 int primary key, f2 int); +INSERT INTO t1 VALUES (1,0); +BEGIN; +INSERT INTO t1 VALUES (2,4),(1,1); +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +COMMIT; +Writesets replicated (expect 0) +0 +connection node_1; +SELECT * FROM t1; +f1 f2 +1 0 +connection node_2; +SELECT * FROM t1; +f1 f2 +1 0 +DROP TABLE t1; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,4), (1,1); +ERROR 23000: Duplicate entry '1' for key 'PRIMARY' +Writesets replicated (expect 0) +0 +connection node_1; +SELECT * FROM t1; +f1 f2 +1 0 +connection node_2; +SELECT * FROM t1; +f1 f2 +1 0 +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-32549.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-32549.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-32549.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-32549.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,24 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) engine=innodb; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) engine=aria; +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SELECT * FROM t2; +f1 +SAVEPOINT s1; +ERROR 42000: The storage engine for the table doesn't support SAVEPOINT +INSERT INTO t1 VALUES (2); +COMMIT; +connection node_1; +SELECT * FROM t1; +f1 +1 +2 +connection node_2; +SELECT * FROM t1; +f1 +1 +2 +connection node_1; +DROP TABLE t1,t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-32938.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-32938.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-32938.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-32938.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,21 @@ +connection node_2; +connection node_1; +connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1; +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); +CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB; +SET DEBUG_SYNC = 'wsrep_append_fk_toi_keys_before_close_tables SIGNAL may_alter WAIT_FOR bf_abort'; +ALTER TABLE t1 DROP COLUMN c2; +connection node_1; +SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; +ALTER TABLE t1 ADD COLUMN c3 INT; +connection con1; +ERROR 70100: Query execution was interrupted +INSERT INTO t1 (c1, c2, c3) VALUES (1, 0, 0); +connection node_2; +INSERT INTO t1 (c1, c2, c3) VALUES (2, 0, 0); +connection node_1; +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +disconnect con1; +disconnect node_2; +disconnect node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33064.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33064.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33064.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33064.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,26 @@ +connection node_2; +connection node_1; +connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1; +CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t1_fk(c1 INT PRIMARY KEY, c2 INT, INDEX (c2), FOREIGN KEY (c2) REFERENCES t1(c1)) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1); +connection con1; +SET SESSION wsrep_retry_autocommit = 0; +SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL may_alter WAIT_FOR bf_abort'; +INSERT INTO t1_fk VALUES (1, 1); +connection node_1; +SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; +SET DEBUG_SYNC = 'lock_wait_end WAIT_FOR alter_continue'; +ALTER TABLE t1 ADD COLUMN c2 INT, ALGORITHM=INPLACE; +connection con1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SET DEBUG_SYNC = 'now SIGNAL alter_continue'; +connection node_1; +connection node_2; +INSERT INTO t1 (c1, c2) VALUES (2, 2); +connection node_1; +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1_fk, t1; +disconnect con1; +disconnect node_2; +disconnect node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33136.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33136.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33136.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33136.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,21 @@ +connection node_2; +connection node_1; +connect node_1a,127.0.0.1,root,,test,$NODE_MYPORT_1; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; +connection node_1a; +TRUNCATE TABLE t1; +SET SESSION wsrep_retry_autocommit = 0; +SET DEBUG_SYNC = 'dict_stats_mdl_acquired SIGNAL may_toi WAIT_FOR bf_abort'; +INSERT INTO t1 VALUES (1); +connection node_1; +SET DEBUG_SYNC = 'now WAIT_FOR may_toi'; +TRUNCATE TABLE t1; +connection node_1a; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1; +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +disconnect node_1a; +disconnect node_2; +disconnect node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33523.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33523.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33523.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33523.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,6 @@ +connection node_2; +connection node_1; +SET SESSION wsrep_on=OFF; +BEGIN; +ROLLBACK; +SET SESSION wsrep_on=OFF; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33828.result mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33828.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MDEV-33828.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MDEV-33828.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,41 @@ +connection node_2; +connection node_1; +SET AUTOCOMMIT=ON; +SELECT @@autocommit; +@@autocommit +1 +SET LOCAL enforce_storage_engine=InnoDB; +CREATE TABLE t1(id int not null primary key auto_increment, name varchar(64)) ENGINE=InnoDB; +INSERT INTO t1(name) VALUES ('name1'),('name3'),('name6'),('name2'); +CREATE PROCEDURE sel_proc() +BEGIN +DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; +SELECT * FROM t1; +END| +CREATE PROCEDURE ins_proc() +BEGIN +DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; +INSERT INTO t1 VALUES ('name_proc'); +END| +SET AUTOCOMMIT=OFF; +SELECT @@autocommit; +@@autocommit +0 +START TRANSACTION; +insert into t1(name) values('name10'); +select param_list, returns, db, type from mysql.proc where name='sel_proc'; +param_list returns db type + test PROCEDURE +call ins_proc(); +COMMIT; +SET AUTOCOMMIT=ON; +SELECT * FROM t1; +id name +1 name1 +3 name3 +5 name6 +7 name2 +9 name10 +DROP TABLE t1; +DROP PROCEDURE sel_proc; +DROP PROCEDURE ins_proc; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-284.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-284.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-284.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-284.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,7 @@ connection node_2; connection node_1; connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; -call mtr.add_suppression("\\[ERROR\\] Error reading packet from server: WSREP has not yet prepared node for application use .*"); +call mtr.add_suppression("\\[ERROR\\] Error reading packet from server: WSREP has not yet prepared node for application use "); call mtr.add_suppression("WSREP has not yet prepared node for application use"); connection node_1; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-329.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-329.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-329.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-329.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,5 @@ connection node_2; connection node_1; -CALL mtr.add_suppression("WSREP: .*conflict state . after post commit .*"); CREATE TABLE t1 (f1 INTEGER, f2 CHAR(20) DEFAULT 'abc') ENGINE=InnoDB; INSERT INTO t1 (f1) VALUES (1),(65535); CREATE PROCEDURE proc_insert () @@ -19,5 +18,5 @@ connection node_1; DROP PROCEDURE proc_insert; DROP TABLE t1; -CALL mtr.add_suppression("conflict state 3 after post commit"); +CALL mtr.add_suppression("WSREP: .* conflict state after post commit "); set global innodb_status_output=Default; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-336.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-336.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-336.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-336.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,8 @@ connection node_2; connection node_1; connection node_1; -CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +SET @wsrep_slave_threads_orig = @@wsrep_slave_threads; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) Engine=InnoDB; SET GLOBAL wsrep_slave_threads = 10; # Set slave threads to 10 step 1 SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; @@ -9,7 +10,7 @@ 10 SET GLOBAL wsrep_slave_threads = 1; connection node_2; -INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (NULL); connection node_1; # Wait until one of the appliers has exited SELECT VARIABLE_VALUE AS EXPECT_9 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; @@ -27,33 +28,14 @@ 20 SET GLOBAL wsrep_slave_threads = 1; connection node_2; -INSERT INTO t1 VALUES (1); -INSERT INTO t1 VALUES (2); -INSERT INTO t1 VALUES (3); -INSERT INTO t1 VALUES (4); -INSERT INTO t1 VALUES (5); -INSERT INTO t1 VALUES (6); -INSERT INTO t1 VALUES (7); -INSERT INTO t1 VALUES (8); -INSERT INTO t1 VALUES (9); -INSERT INTO t1 VALUES (10); -INSERT INTO t1 VALUES (11); -INSERT INTO t1 VALUES (12); -INSERT INTO t1 VALUES (13); -INSERT INTO t1 VALUES (14); -INSERT INTO t1 VALUES (16); -INSERT INTO t1 VALUES (17); -INSERT INTO t1 VALUES (18); -INSERT INTO t1 VALUES (19); -INSERT INTO t1 VALUES (20); connection node_1; # Wait until 19 of the appliers has exited SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; EXPECT_1 1 -SELECT COUNT(*) FROM t1; -COUNT(*) -20 +SELECT COUNT(*) AS EXPECT_51 FROM t1; +EXPECT_51 +51 SET GLOBAL wsrep_slave_threads = 10; # Set slave threads to 10 step 3 SELECT VARIABLE_VALUE AS EXPECT_10 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; @@ -62,22 +44,12 @@ connection node_1; SET GLOBAL wsrep_slave_threads = 1; connection node_2; -INSERT INTO t1 VALUES (21); -INSERT INTO t1 VALUES (22); -INSERT INTO t1 VALUES (23); -INSERT INTO t1 VALUES (24); -INSERT INTO t1 VALUES (25); -INSERT INTO t1 VALUES (26); -INSERT INTO t1 VALUES (27); -INSERT INTO t1 VALUES (28); -INSERT INTO t1 VALUES (29); -INSERT INTO t1 VALUES (30); connection node_1; # Wait until slave threads back to 1 SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; EXPECT_1 1 -SELECT COUNT(*) FROM t1; -COUNT(*) -30 +SELECT COUNT(*) AS EXPECT_101 FROM t1; +EXPECT_101 +101 DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-369.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-369.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-369.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-369.result 2024-08-03 07:29:57.000000000 +0000 @@ -12,22 +12,20 @@ DELETE FROM p WHERE f1 = 1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; INSERT INTO c VALUES (1, 1); connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; @@ -54,22 +52,20 @@ UPDATE p SET f2 = 1 WHERE f1 = 1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; UPDATE c SET f2 = 1 WHERE f1 = 1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; connection node_2; SELECT * FROM p; @@ -94,22 +90,20 @@ UPDATE p SET f2 = 1 WHERE f1 = 1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; DELETE FROM c WHERE f1 = 1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; connection node_2; SELECT * FROM p; @@ -130,22 +124,20 @@ UPDATE p SET f2 = 1 WHERE f1 = 1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; INSERT INTO c VALUES (1, 0);; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; @@ -170,22 +162,20 @@ DELETE FROM p WHERE f1 = 1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; UPDATE c SET f2 = 1 WHERE f1 = 1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; @@ -215,22 +205,20 @@ INSERT INTO cf (f1, p_id) VALUES (10, 1); connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; INSERT INTO cf (f1, p_id) VALUES (20, 1); connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; connection node_2; SELECT * FROM pf; @@ -255,22 +243,20 @@ UPDATE pg SET f2 = 1 WHERE f1 = 1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; INSERT INTO cg VALUES (1, 1, 0); connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; connection node_2; SELECT * FROM pg; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-388.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-388.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-388.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-388.result 2024-08-03 07:29:57.000000000 +0000 @@ -47,4 +47,4 @@ SET debug_sync='RESET'; SELECT @@debug_sync; @@debug_sync -ON - current signal: '' +ON - current signals: '' diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-402.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-402.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-402.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-402.result 2024-08-03 07:29:57.000000000 +0000 @@ -15,22 +15,20 @@ UPDATE c SET f2=1 where f1=1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; DELETE FROM p WHERE f1 = 1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; @@ -55,22 +53,20 @@ UPDATE c SET f2=2 where f1=1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; UPDATE p set f1=11 WHERE f1 = 1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; @@ -97,22 +93,20 @@ UPDATE c SET p_id=2 where f1=1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; UPDATE p set f1=11 WHERE f1 = 1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; @@ -130,22 +124,20 @@ UPDATE p set f1=21 WHERE f1 = 11; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; UPDATE c SET p_id=2 where f1=1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; @@ -176,22 +168,20 @@ UPDATE p2 SET f2=2 where f1=1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; DELETE FROM p1 WHERE f1 = 1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; connection node_2; SELECT * FROM p1; @@ -223,22 +213,20 @@ DELETE FROM p2 WHERE f1=1; connection node_1a; SET SESSION wsrep_sync_wait = 0; -SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; connection node_2; DELETE FROM p1 WHERE f1=1; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; connection node_1; +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; -SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; -SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction connection node_2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-86-wait1.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-86-wait1.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-86-wait1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-86-wait1.result 2024-08-03 07:29:57.000000000 +0000 @@ -4,7 +4,7 @@ connection node_2; SELECT @@debug_sync; @@debug_sync -ON - current signal: '' +ON - current signals: '' set debug_sync='RESET'; SET SESSION wsrep_sync_wait = 1; SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; @@ -45,4 +45,4 @@ DROP TABLE t_wait1; SELECT @@debug_sync; @@debug_sync -ON - current signal: '' +ON - current signals: '' diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/MW-86-wait8.result mariadb-10.11.9/mysql-test/suite/galera/r/MW-86-wait8.result --- mariadb-10.11.6/mysql-test/suite/galera/r/MW-86-wait8.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/MW-86-wait8.result 2024-08-03 07:29:57.000000000 +0000 @@ -4,7 +4,7 @@ connection node_2; SELECT @@debug_sync; @@debug_sync -ON - current signal: '' +ON - current signals: '' SET SESSION wsrep_sync_wait = 8; SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; connection node_1; @@ -46,4 +46,4 @@ DROP TABLE t_wait8; SELECT @@debug_sync; @@debug_sync -ON - current signal: '' +ON - current signals: '' diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera#500.result mariadb-10.11.9/mysql-test/suite/galera/r/galera#500.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera#500.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera#500.result 2024-08-03 07:29:57.000000000 +0000 @@ -15,4 +15,4 @@ connection node_2; SET SESSION wsrep_on=0; connection node_2; -CALL mtr.add_suppression("WSREP: exception from gcomm, backend must be restarted: Gcomm backend termination was requested by setting gmcast.isolate=2."); +CALL mtr.add_suppression("WSREP: exception from gcomm, backend must be restarted: Gcomm backend termination was requested by setting gmcast\\.isolate=2\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera-features#117.result mariadb-10.11.9/mysql-test/suite/galera/r/galera-features#117.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera-features#117.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera-features#117.result 2024-08-03 07:29:57.000000000 +0000 @@ -34,7 +34,7 @@ Tables_in_test t1 Killing server ... -CALL mtr.add_suppression("Inconsistent by consensus."); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("WSREP: Failed to execute TOI action"); CALL mtr.add_suppression("WSREP: TO isolation end failed"); connection node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_as_master.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_as_master.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_as_master.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_as_master.result 2024-08-03 07:29:57.000000000 +0000 @@ -52,6 +52,8 @@ SET SQL_LOG_BIN=OFF; DROP TABLE t2, t3; connection node_3; +BINLOG_POSITIONS_MATCH +1 STOP SLAVE; RESET SLAVE ALL; CALL mtr.add_suppression('You need to use --log-bin to make --binlog-format work'); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_as_slave_gtid_myisam.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_as_slave_gtid_myisam.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_as_slave_gtid_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_as_slave_gtid_myisam.result 2024-08-03 07:29:57.000000000 +0000 @@ -22,12 +22,6 @@ 1 gtid_binlog_state_equal 0 -connection node_2; -SELECT COUNT(*) AS EXPECT_1 FROM t1; -EXPECT_1 -1 -gtid_binlog_state_equal -0 #cleanup connection node_3; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_abort_mariabackup.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_abort_mariabackup.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_abort_mariabackup.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_abort_mariabackup.result 2024-08-03 07:29:57.000000000 +0000 @@ -12,9 +12,9 @@ connection node_2; Starting server ... connection node_1; -# Both should return FOUND 2 as we have bootstrap and SST -FOUND 2 /Desyncing and pausing the provider/ in mysqld.1.err -FOUND 2 /Resuming and resyncing the provider/ in mysqld.1.err +# Both should return NOT FOUND as we have mariabackup with backup locks +NOT FOUND /Desyncing and pausing the provider/ in mysqld.1.err +NOT FOUND /Resuming and resyncing the provider/ in mysqld.1.err connection node_1; SET GLOBAL wsrep_mode = "BF_ABORT_MARIABACKUP"; # Restart node_2, force SST. @@ -25,9 +25,9 @@ Starting server ... connection node_2; connection node_1; -# Both should return FOUND 3 as we have 1 new SST -FOUND 3 /Desyncing and pausing the provider/ in mysqld.1.err -FOUND 3 /Resuming and resyncing the provider/ in mysqld.1.err +# Both should return NOT FOUND as we have mariabackup with backup locks +NOT FOUND /Desyncing and pausing the provider/ in mysqld.1.err +NOT FOUND /Resuming and resyncing the provider/ in mysqld.1.err SET GLOBAL wsrep_mode = ""; DROP TABLE t; # Case 2: MariaBackup backup from node_2 @@ -46,11 +46,13 @@ SELECT @@wsrep_mode; @@wsrep_mode BF_ABORT_MARIABACKUP -# Both should return FOUND 1 as node should not desync -FOUND 1 /Desyncing and pausing the provider/ in mysqld.2.err -FOUND 1 /Resuming and resyncing the provider/ in mysqld.2.err -# Should return FOUND 1 because only last backup does not desync -FOUND 1 /Server not desynched from group because WSREP_MODE_BF_MARIABACKUP used./ in mysqld.2.err +# Both should return FOUND 2 because both backups do desync but on different points +FOUND 2 /Desyncing and pausing the provider/ in mysqld.2.err +FOUND 2 /Resuming and resyncing the provider/ in mysqld.2.err +# Should return FOUND 1 as server did not desync at BLOCK_DDL +FOUND 1 /Server not desynched from group at BLOCK_DDL because WSREP_MODE_BF_MARIABACKUP is used./ in mysqld.2.err +# Should return FOUND 1 as server did desync and pause at BLOCK_COMMIT +FOUND 1 /Server desynched from group during BACKUP STAGE BLOCK_COMMIT./ in mysqld.2.err SET GLOBAL wsrep_mode = ""; connection node_1; DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_abort_shutdown.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_abort_shutdown.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_abort_shutdown.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_abort_shutdown.result 2024-08-03 07:29:57.000000000 +0000 @@ -5,7 +5,7 @@ connection node_1; CREATE TABLE t1 (f1 INT PRIMARY KEY); connection node_2; -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); SET DEBUG_SYNC = 'wsrep_before_certification WAIT_FOR continue'; INSERT INTO t1 VALUES (1); connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_kill.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_kill.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_kill.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_kill.result 2024-08-03 07:29:57.000000000 +0000 @@ -49,16 +49,23 @@ disconnect node_2a; disconnect node_2b; connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2; connection node_2a; SET SESSION wsrep_on=OFF; begin; update t1 set a =5, b=2; connection node_2; ALTER TABLE t1 ADD UNIQUE KEY b3(b); +connection node_2b; +SET SESSION wsrep_sync_wait=0; +connection node_2a; select * from t1; a b -2 1 +5 2 +commit; +connection node_2; disconnect node_2a; +disconnect node_2b; connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; connection node_2a; SET SESSION wsrep_on=OFF; @@ -67,7 +74,7 @@ connection node_2; select * from t1; a b -2 1 +5 2 disconnect node_2a; connection node_1; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_lock_wait.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_lock_wait.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_bf_lock_wait.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_bf_lock_wait.result 2024-08-03 07:29:57.000000000 +0000 @@ -33,6 +33,26 @@ call p1(1000); connection node_1; checking error log for 'BF lock wait long' message for 10 times every 10 seconds ... +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] +include/assert_grep.inc [BF lock wait long] connection node_1_p1; connection node_1_p2; connection node_2_p1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_create_table_as_select.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_create_table_as_select.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_create_table_as_select.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_create_table_as_select.result 2024-08-03 07:29:57.000000000 +0000 @@ -76,22 +76,21 @@ DEALLOCATE PREPARE stmt; DROP TABLE t1, t2; connection node_1; +SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_apply_cb'; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1),(2),(3),(4),(5); -connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; -LOCK TABLE t2 WRITE; -connection node_1; +SET DEBUG_SYNC = 'create_table_select_before_create WAIT_FOR sync.wsrep_apply_cb_reached'; +SET DEBUG_SYNC = 'create_table_select_before_lock SIGNAL signal.wsrep_apply_cb WAIT_FOR bf_abort'; CREATE TABLE t1 AS SELECT * FROM t2;; -connection node_1a; connection node_2; SELECT COUNT(*) = 5 FROM t2; COUNT(*) = 5 1 CREATE TABLE t1 AS SELECT * FROM t2; -connection node_1a; -UNLOCK TABLES; connection node_1; -Got one of the listed errors +ERROR 70100: Query execution was interrupted +SET GLOBAL DEBUG_DBUG = ''; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1, t2; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1),(2),(3),(4),(5); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_desync_overlapped.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_desync_overlapped.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_desync_overlapped.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_desync_overlapped.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,7 @@ connection node_2; connection node_1; connection node_1; -CREATE TABLE ten (f1 INTEGER); +CREATE TABLE ten (f1 INTEGER PRIMARY KEY) Engine=InnoDB; INSERT INTO ten VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); CREATE TABLE t1 (f1 INTEGER, PRIMARY KEY (f1)) Engine=InnoDB; CREATE TABLE t2 (f1 INTEGER, PRIMARY KEY (f1)) Engine=InnoDB; @@ -12,6 +12,7 @@ SET DEBUG_SYNC='before_execute_sql_command SIGNAL alter1 WAIT_FOR alter2'; INSERT INTO t1 (f1) SELECT 0000 + (100 * a1.f1) + (10 * a2.f1) + a3.f1 FROM ten AS a1, ten AS a2, ten AS a3; connection node_1a; +FLUSH STATUS; SET GLOBAL wsrep_desync = 1; Warnings: Warning 1231 'wsrep_desync' is already ON. @@ -35,6 +36,7 @@ show status like 'wsrep_desync_count'; Variable_name Value wsrep_desync_count 0 +call mtr.add_suppression("Trying to make wsrep_desync = OFF on the node that is already synchronized\\."); show status like 'wsrep_desync_count'; Variable_name Value wsrep_desync_count 0 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_drop_database.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_drop_database.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_drop_database.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_drop_database.result 2024-08-03 07:29:57.000000000 +0000 @@ -48,6 +48,6 @@ Tables_in_fts DROP DATABASE fts; connection node_2; -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); Warnings: Note 1049 Unknown database 'fts' diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_drop_multi.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_drop_multi.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_drop_multi.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_drop_multi.result 2024-08-03 07:29:57.000000000 +0000 @@ -19,6 +19,6 @@ ERROR 42S02: Table 'test.t3' doesn't exist SHOW CREATE TABLE t4; ERROR 42S02: Table 'test.t4' doesn't exist -CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t2,test.t4'' on query\. Default database: 'test'\. Query: 'DROP TABLE t1, t2, t3, t4', Error_code: 1051"); +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test\\.t2,test\\.t4'' on query\\. Default database: 'test'\\. Query: 'DROP TABLE t1, t2, t3, t4', Error_code: 1051"); connection node_1; DROP TABLE t5; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_events2.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_events2.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_events2.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_events2.result 2024-08-03 07:29:57.000000000 +0000 @@ -111,7 +111,7 @@ SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; EVENT_CATALOG EVENT_SCHEMA EVENT_NAME DEFINER EVENT_BODY EVENT_DEFINITION EVENT_TYPE EXECUTE_AT INTERVAL_VALUE INTERVAL_FIELD STATUS ON_COMPLETION EVENT_COMMENT def test one_event root@localhost SQL SELECT 123 RECURRING NULL 10 SECOND SLAVESIDE_DISABLED NOT PRESERVE -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); connection node_1; SELECT * FROM t1; f1 f2 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_forced_binlog_format_ctas.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_forced_binlog_format_ctas.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_forced_binlog_format_ctas.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_forced_binlog_format_ctas.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ connection node_2; connection node_1; -call mtr.add_suppression("Unsafe statement written to the binary log using statement format since.*"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since "); SET GLOBAL wsrep_forced_binlog_format=ROW; connection node_1; CREATE TABLE t1(a int not null primary key auto_increment, b int) ENGINE=InnoDB; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result 2024-08-03 07:29:57.000000000 +0000 @@ -94,25 +94,24 @@ connection node_1_insert_10m; CALL insert_10m ();; connection node_2; -call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); SET SESSION wsrep_sync_wait = 0; Killing server ... connection node_1; Killing server ... connection node_1_insert_simple; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_1_insert_multi; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_1_insert_transaction; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_1_update_simple; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_1_insert_1k; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_1_insert_1m; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_1_insert_10m; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_1; Performing --wsrep-recover ... Using --wsrep-start-position when starting mysqld ... @@ -131,9 +130,9 @@ DROP PROCEDURE insert_1k; DROP PROCEDURE insert_1m; connection node_1; -call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\\(\\)"); CALL mtr.add_suppression("conflict state 7 after post commit"); CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); connection node_2; -call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\\(\\)"); CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_gra_log.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_gra_log.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_gra_log.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_gra_log.result 2024-08-03 07:29:57.000000000 +0000 @@ -35,4 +35,4 @@ Killing server ... SET GLOBAL wsrep_ignore_apply_errors = 7; DROP TABLE t1; -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_gtid_server_id.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_gtid_server_id.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_gtid_server_id.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_gtid_server_id.result 2024-08-03 07:29:57.000000000 +0000 @@ -5,7 +5,7 @@ @@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode 0 11 1 1 connection node_2; -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode; @@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode 0 12 1 1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_ist_mariabackup_verify_ca.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_mariabackup_verify_ca.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_ist_mariabackup_verify_ca.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_mariabackup_verify_ca.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,21 @@ +connection node_2; +connection node_1; +connection node_1; +connection node_2; +CREATE TABLE t1 (f1 INT PRIMARY KEY); +connection node_2; +# Verify that graceful shutdown succeeds... +connection node_1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +connection node_2; +# Start node_2 again... +SELECT * FROM t1; +f1 +1 +2 +3 +connection node_1; +include/assert_grep.inc [mariabackup IST completed on joiner] +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_ist_mysqldump.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_mysqldump.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_ist_mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_mysqldump.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,15 +1,15 @@ connection node_2; connection node_1; Setting SST method to mysqldump ... -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); connection node_1; CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; SET GLOBAL wsrep_sst_auth = 'sst:'; connection node_2; SET GLOBAL wsrep_sst_method = 'mysqldump'; -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to "); connection node_1; connection node_2; Performing State Transfer on a server that has been shut down cleanly and restarted @@ -364,4 +364,4 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_ist_rsync_verify_ca.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_rsync_verify_ca.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_ist_rsync_verify_ca.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_ist_rsync_verify_ca.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,21 @@ +connection node_2; +connection node_1; +connection node_1; +connection node_2; +CREATE TABLE t1 (f1 INT PRIMARY KEY); +connection node_2; +# Verify that graceful shutdown succeeds... +connection node_1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +connection node_2; +# Start node_2 again... +SELECT * FROM t1; +f1 +1 +2 +3 +connection node_1; +include/assert_grep.inc [rsync IST completed on joiner] +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_kill_applier.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_applier.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_kill_applier.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_applier.result 2024-08-03 07:29:57.000000000 +0000 @@ -6,13 +6,13 @@ 1 SET GLOBAL wsrep_slave_threads=2; KILL ID; -Got one of the listed errors +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster KILL QUERY ID; -Got one of the listed errors +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster KILL ID; -Got one of the listed errors +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster KILL QUERY ID; -Got one of the listed errors +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster SET GLOBAL wsrep_slave_threads=DEFAULT; connection node_1; create table t1(a int not null primary key) engine=innodb; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_kill_bf.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_bf.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_kill_bf.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_bf.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,25 @@ +connection node_2; +connection node_1; +connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1; +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); +CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB; +INSERT into t1 values (1,1); +SET DEBUG_SYNC = 'alter_table_after_open_tables SIGNAL bf_started WAIT_FOR bf_continue'; +ALTER TABLE t1 DROP COLUMN c2;; +connection node_1; +SET SESSION wsrep_sync_wait = 0; +SET DEBUG_SYNC = 'now WAIT_FOR bf_started'; +KILL ID; +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster +KILL QUERY ID; +ERROR HY000: This is a high priority thread/query and cannot be killed without compromising the consistency of the cluster +connection node_1; +SET DEBUG_SYNC = 'now SIGNAL bf_continue'; +connection con1; +SET DEBUG_SYNC = 'RESET'; +SELECT * FROM t1; +c1 +1 +connection node_1; +DROP TABLE t1; +disconnect con1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_kill_ddl.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_ddl.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_kill_ddl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_kill_ddl.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,7 +3,7 @@ connection node_1; connection node_2; connection node_1; -call mtr.add_suppression("WSREP: Last Applied Action message in non-primary configuration from member .*"); +call mtr.add_suppression("WSREP: Last Applied Action message in non-primary configuration from member "); SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=InnoDB; connection node_2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_load_data.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_load_data.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_load_data.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_load_data.result 2024-08-03 07:29:57.000000000 +0000 @@ -26,9 +26,308 @@ ) ENGINE=InnoDB AUTO_INCREMENT=1324 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED; LOCK TABLES cardtest_tbl WRITE; ALTER TABLE cardtest_tbl DISABLE KEYS; -Warnings: -Note 1031 Storage engine InnoDB of the table `cardtest02`.`cardtest_tbl` doesn't have this option -INSERT INTO cardtest_tbl VALUES (1,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(2,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(3,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(4,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(5,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(6,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(7,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(8,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(9,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(10,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(11,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(12,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(13,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(14,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(15,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(16,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(17,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(18,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(19,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(20,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(21,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(22,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(23,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(24,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(25,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(26,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(27,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(28,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(29,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(30,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(31,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(32,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(33,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(34,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(35,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(36,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(37,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(38,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(39,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(40,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(41,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(42,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(43,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(44,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(45,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(46,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(47,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(48,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(49,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(50,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(51,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(52,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(53,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(54,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(55,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(56,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(57,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(58,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(59,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(60,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(61,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(62,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(63,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(64,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(65,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(66,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(67,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(68,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(69,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(70,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(71,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(72,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(73,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(74,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(75,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(76,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(77,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(78,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(79,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(80,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(81,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(82,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(83,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(84,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(85,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(86,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(87,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(88,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(89,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(90,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(91,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(92,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(93,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(94,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(95,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(96,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(97,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(98,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(99,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(100,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(101,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(102,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(103,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(104,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(105,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(106,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(107,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(108,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(109,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(110,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(111,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(112,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(113,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(114,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(115,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(116,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(117,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(118,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(119,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(120,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(121,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(122,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(123,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(124,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(125,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(126,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(127,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(128,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(129,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(130,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(131,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(132,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(133,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(134,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(135,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(136,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(137,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(138,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(139,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(140,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(141,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(142,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(143,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(144,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(145,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(146,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(147,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(148,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(149,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(150,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(151,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(152,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(153,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(154,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(155,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(156,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(157,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(158,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(159,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(160,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(161,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(162,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(163,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(164,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(165,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(166,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(167,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(168,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(169,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(170,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(171,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(172,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(173,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(174,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(175,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(176,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(177,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(178,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(179,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(180,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(181,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(182,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(183,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(184,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(185,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(186,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(187,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(188,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(189,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(190,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(191,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(192,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(193,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(194,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(195,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(196,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(197,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(198,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(199,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(200,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(201,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(202,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(203,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(204,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(205,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(206,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(207,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(208,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(209,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(210,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(211,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(212,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(213,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(214,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(215,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(216,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(217,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(218,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(219,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(220,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(221,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(222,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(223,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(224,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(225,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(226,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(227,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(228,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(229,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(230,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(231,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(232,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(233,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(234,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(235,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(236,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(237,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(238,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(239,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(240,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(241,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(242,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(243,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(244,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(245,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(246,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(247,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(248,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(249,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(250,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(251,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(252,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(253,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(254,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(255,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(256,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(257,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(258,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(259,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(260,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(261,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(262,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(263,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(264,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(265,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(266,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(267,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(268,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(269,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(270,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(271,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(272,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(273,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(274,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(275,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(276,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(277,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(278,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(279,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(280,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(281,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(282,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(283,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(284,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(285,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(286,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(287,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(288,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(289,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(290,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(291,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(292,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(293,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(294,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(295,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(296,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(297,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(298,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(299,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(300,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(301,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL); +INSERT INTO cardtest_tbl VALUES +(1,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(2,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(3,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(4,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(5,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(6,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(7,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(8,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(9,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(10,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(11,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(12,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(13,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(14,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(15,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(16,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(17,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(18,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(19,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(20,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(21,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(22,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(23,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(24,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(25,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(26,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(27,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(28,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(29,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(30,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(31,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(32,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(33,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(34,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(35,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(36,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(37,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(38,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(39,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(40,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(41,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(42,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(43,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(44,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(45,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(46,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(47,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(48,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(49,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(50,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(51,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(52,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(53,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(54,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(55,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(56,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(57,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(58,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(59,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(60,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(61,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(62,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(63,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(64,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(65,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(66,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(67,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(68,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(69,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(70,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(71,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(72,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(73,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(74,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(75,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(76,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(77,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(78,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(79,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(80,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(81,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(82,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(83,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(84,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(85,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(86,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(87,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(88,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(89,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(90,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(91,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(92,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(93,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(94,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(95,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(96,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(97,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(98,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(99,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(100,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(101,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(102,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(103,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(104,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(105,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(106,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(107,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(108,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(109,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(110,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(111,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(112,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(113,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(114,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(115,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(116,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(117,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(118,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(119,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(120,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(121,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(122,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(123,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(124,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(125,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(126,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(127,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(128,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(129,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(130,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(131,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(132,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(133,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(134,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(135,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(136,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(137,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(138,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(139,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(140,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(141,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(142,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(143,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(144,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(145,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(146,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(147,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(148,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(149,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(150,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(151,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(152,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(153,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(154,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(155,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(156,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(157,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(158,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(159,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(160,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(161,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(162,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(163,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(164,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(165,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(166,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(167,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(168,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(169,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(170,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(171,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(172,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(173,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(174,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(175,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(176,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(177,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(178,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(179,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(180,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(181,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(182,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(183,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(184,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(185,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(186,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(187,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(188,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(189,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(190,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(191,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(192,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(193,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(194,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(195,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(196,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(197,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(198,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(199,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(200,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(201,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(202,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(203,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(204,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(205,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(206,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(207,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(208,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(209,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(210,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(211,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(212,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(213,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(214,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(215,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(216,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(217,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(218,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(219,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(220,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(221,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(222,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(223,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(224,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(225,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(226,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(227,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(228,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(229,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(230,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(231,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(232,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(233,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(234,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(235,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(236,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(237,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(238,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(239,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(240,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(241,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(242,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(243,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(244,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(245,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(246,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(247,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(248,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(249,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(250,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(251,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(252,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(253,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(254,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(255,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(256,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(257,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(258,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(259,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(260,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(261,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(262,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(263,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(264,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(265,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(266,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(267,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(268,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(269,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(270,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(271,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(272,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(273,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(274,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(275,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(276,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(277,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(278,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(279,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(280,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(281,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(282,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(283,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(284,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(285,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(286,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(287,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(288,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(289,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(290,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(291,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(292,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(293,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(294,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(295,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(296,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(297,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(298,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(299,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(300,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), +(301,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL); ALTER TABLE cardtest_tbl ENABLE KEYS; Warnings: Note 1031 Storage engine InnoDB of the table `cardtest02`.`cardtest_tbl` doesn't have this option diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_mdl_race.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_mdl_race.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_mdl_race.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_mdl_race.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,44 +1,68 @@ connection node_2; connection node_1; +connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; INSERT INTO t1 VALUES (1, 'a'); INSERT INTO t1 VALUES (2, 'a'); -connection node_1; SET AUTOCOMMIT=ON; START TRANSACTION; UPDATE t1 SET f2 = 'b' WHERE f1 = 1; connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; connection node_1a; +SET SESSION wsrep_sync_wait=0; LOCK TABLE t2 WRITE; connection node_1; -SET @@debug_dbug = "d,sync.wsrep_before_mdl_wait"; +SET DEBUG_SYNC= 'wsrep_before_mdl_wait SIGNAL before_mdl_wait WAIT_FOR mdl_wait_continue'; SELECT * FROM t2;; connection node_1a; +# Wait until select is blocked before MDL lock wait +SET DEBUG_SYNC= 'now WAIT_FOR before_mdl_wait'; +connection node_1a; SET @@debug_dbug = "d,sync.wsrep_after_BF_victim_lock"; connection node_2; UPDATE t1 SET f2 = 'c' WHERE f1 = 1; -connection node_1a; -SET @@debug_dbug = ""; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_before_mdl_wait"; +connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1b; +SET SESSION wsrep_sync_wait=0; +# Wait for conflicting update to block SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock"; +connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1c; +connection node_1a; +SET DEBUG_SYNC = "now SIGNAL BF_victim_continue"; UNLOCK TABLES; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; -COUNT(*) = 1 +connection node_1; +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a'; +EXPECT_1 1 -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; -COUNT(*) = 1 +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c'; +EXPECT_1 1 +SELECT * FROM t1; +f1 f2 +1 c +2 a connection node_2; -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; -COUNT(*) = 1 +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a'; +EXPECT_1 1 -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; -COUNT(*) = 1 +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c'; +EXPECT_1 1 +SELECT * FROM t1; +f1 f2 +1 c +2 a DROP TABLE t1; DROP TABLE t2; connection node_1a; SET DEBUG_SYNC = "RESET"; +connection node_1b; +SET DEBUG_SYNC = "RESET"; +connection node_1; +disconnect node_1a; +disconnect node_1b; +disconnect node_1c; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_myisam_autocommit.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_myisam_autocommit.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_myisam_autocommit.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_myisam_autocommit.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,6 @@ connection node_2; connection node_1; +SET GLOBAL wsrep_mode=REPLICATE_MYISAM; CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2), (3); @@ -14,14 +15,37 @@ UPDATE t2 SET f1 = 9 WHERE f1 = 1; DELETE FROM t1 WHERE f1 = 9; DELETE FROM t2 WHERE f1 = 9; +SELECT * FROM t1 ORDER BY f1; +f1 +SELECT * FROM t2 ORDER BY f1; +f1 +2 +3 +4 +5 +6 +connection node_2; +SELECT * FROM t1 ORDER BY f1; +f1 +SELECT * FROM t2 ORDER BY f1; +f1 +2 +3 +4 +5 +6 TRUNCATE TABLE t1; -TRUNCATE TABLE t1; +TRUNCATE TABLE t2; +SELECT * FROM t1 ORDER BY f1; +f1 +SELECT * FROM t2 ORDER BY f1; +f1 connection node_2; -SELECT COUNT(*) = 0 FROM t1; -COUNT(*) = 0 -1 -SELECT COUNT(*) = 0 FROM t2; -COUNT(*) = 0 -1 +SELECT * FROM t1 ORDER BY f1; +f1 +SELECT * FROM t2 ORDER BY f1; +f1 +connection node_1; +SET GLOBAL wsrep_mode=DEFAULT; DROP TABLE t1; DROP TABLE t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_parallel_apply_lock_table.result 2024-08-03 07:29:57.000000000 +0000 @@ -10,7 +10,7 @@ INSERT INTO t2 VALUES (1); connection node_2a; SET SESSION wsrep_sync_wait=0; -SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committing%' or STATE = 'Waiting for certification'); +SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE 'Commit' or STATE = 'Waiting for certification'); EXPECT_1 1 SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_partition.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_partition.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_partition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_partition.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,7 @@ connection node_2; connection node_1; connection node_1; -call mtr.add_suppression("WSREP: RSU failed due to pending transactions, schema: test, query ALTER.*"); +call mtr.add_suppression("WSREP: RSU failed due to pending transactions, schema: test, query ALTER"); call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); connection node_1; CREATE TABLE t1( diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_partition_key.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_partition_key.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_partition_key.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_partition_key.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,46 @@ +connection node_2; +connection node_1; +connection node_1; +CREATE TABLE `t1` ( +`id` int(10) unsigned NOT NULL, +`other_id` int(10) unsigned NOT NULL, +PRIMARY KEY (`id`,`other_id`) +) ENGINE=InnoDB +PARTITION BY LIST (`id` MOD 2) +(PARTITION `p0` VALUES IN (0) ENGINE = InnoDB, +PARTITION `p1` VALUES IN (1) ENGINE = InnoDB); +INSERT INTO t1 VALUES (1, 0); +CREATE TABLE t2 LIKE t1; +START TRANSACTION; +INSERT INTO t2(SELECT * FROM t1 WHERE id = 1); +DELETE FROM t1 WHERE id = 1; +COMMIT; +connection node_2; +SELECT * from t1; +id other_id +SELECT * from t2; +id other_id +1 0 +DROP TABLE t1, t2; +connection node_1; +CREATE TABLE `t1` ( +`id` int(10) unsigned NOT NULL, +`other_id` int(10) unsigned NOT NULL, +PRIMARY KEY (`id`) +) ENGINE=InnoDB +PARTITION BY LIST (`id` MOD 2) +(PARTITION `p0` VALUES IN (0) ENGINE = InnoDB, +PARTITION `p1` VALUES IN (1) ENGINE = InnoDB); +INSERT INTO t1 VALUES (1, 0); +CREATE TABLE t2 LIKE t1; +START TRANSACTION; +INSERT INTO t2(SELECT * FROM t1 WHERE id = 1); +DELETE FROM t1 WHERE id = 1; +COMMIT; +connection node_2; +SELECT * from t1; +id other_id +SELECT * from t2; +id other_id +1 0 +DROP TABLE t1, t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_query_cache_invalidate.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_query_cache_invalidate.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_query_cache_invalidate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_query_cache_invalidate.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,13 +3,11 @@ connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4; connection node_2; -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); connection node_4; -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); connection node_3; CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_1, master_use_gtid=current_pos;; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead START SLAVE; include/wait_for_slave_to_start.inc connection node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_replica_no_gtid.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_replica_no_gtid.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_replica_no_gtid.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_replica_no_gtid.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,71 @@ +connection node_2; +connection node_1; +connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +create user repl@'%' identified by 'repl'; +grant all on *.* to repl@'%'; +flush privileges; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +connection node_1; +connection node_2; +connection node_2; +START SLAVE; +connection node_3; +CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 +connection node_2; +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 +connection node_1; +SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 +connection node_2; +# Verify that graceful shutdown succeeds. +# Force SST +connection node_1; +# Waiting until node_2 is not part of cluster anymore +connection node_2; +# Start node_2 again +¤ Wait until node_2 is back on cluster +connection node_2; +call mtr.add_suppression("Slave: Operation CREATE USER failed for "); +SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 +connection node_1; +SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 +connection node_3; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 +connection node_2; +STOP SLAVE; +RESET SLAVE ALL; +connection node_3; +RESET MASTER; +drop table t1; +connection node_2; +DROP TABLE t1; +connection node_1; +connection node_1; +disconnect node_3; +disconnect node_2; +disconnect node_1; +# End of test diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_restart_on_unknown_option.result 2024-08-03 07:29:57.000000000 +0000 @@ -41,7 +41,7 @@ connection node_2; Starting server ... Starting server ... -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); SELECT * FROM t1; f1 f2 1 a diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_sequence_engine.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_sequence_engine.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_sequence_engine.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_sequence_engine.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,12 @@ +connection node_2; +connection node_1; +SET GLOBAL wsrep_ignore_apply_errors=0; +SET SESSION AUTOCOMMIT=0; +SET SESSION max_error_count=0; +CREATE TABLE t0 (id GEOMETRY,parent_id GEOMETRY)ENGINE=SEQUENCE; +ERROR 42000: This version of MariaDB doesn't yet support 'non-InnoDB sequences in Galera cluster' +connection node_2; +SHOW CREATE TABLE t0; +ERROR 42S02: Table 'test.t0' doesn't exist +connection node_1; +SET GLOBAL wsrep_ignore_apply_errors=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_shutdown_nonprim.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_shutdown_nonprim.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_shutdown_nonprim.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_shutdown_nonprim.result 2024-08-03 07:29:57.000000000 +0000 @@ -5,7 +5,12 @@ connection node_1; SET GLOBAL wsrep_provider_options = 'pc.weight=2'; connection node_2; -SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; +connection node_1; +connection node_2; +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status non-Primary connection node_1; SET GLOBAL wsrep_provider_options = 'pc.weight = 1'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_ssl_compression.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_ssl_compression.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_ssl_compression.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_ssl_compression.result 2024-08-03 07:29:57.000000000 +0000 @@ -24,5 +24,5 @@ 1 connection node_1; DROP TABLE t1; -CALL mtr.add_suppression("Unknown parameter 'socket\.ssl_compression'"); +CALL mtr.add_suppression("Unknown parameter 'socket\\.ssl_compression'"); CALL mtr.add_suppression("Set options returned 7"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_ssl_upgrade.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_ssl_upgrade.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_ssl_upgrade.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_ssl_upgrade.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,10 +1,6 @@ connection node_2; connection node_1; connection node_1; -call mtr.add_suppression("WSREP: write_handler().*"); -connection node_2; -call mtr.add_suppression("WSREP: write_handler():.*"); -connection node_1; connection node_2; connection node_1; connection node_2; @@ -28,6 +24,6 @@ 1 connection node_2; connection node_1; -call mtr.add_suppression("WSREP: write_handler().*"); +call mtr.add_suppression("WSREP: write_handler\\(\\)"); connection node_2; -call mtr.add_suppression("WSREP: write_handler():.*"); +call mtr.add_suppression("WSREP: write_handler\\(\\)"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mariabackup,debug.rdiff 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ ---- r/galera_sst_mariabackup.result -+++ r/galera_sst_mariabackup.reject -@@ -516,5 +516,189 @@ +--- galera/r/galera_sst_mariabackup.result 2024-04-11 09:53:12.950512316 +0300 ++++ galera/r/galera_sst_mariabackup,debug.reject 2024-04-11 10:00:36.771144955 +0300 +@@ -524,6 +524,190 @@ 1 DROP TABLE t1; COMMIT; @@ -188,5 +188,6 @@ +DROP TABLE t1; +COMMIT; +SET GLOBAL debug_dbug = $debug_orig; - disconnect node_2; - disconnect node_1; + connection node_2; + Shutting down server ... + connection node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mariabackup.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mariabackup.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mariabackup.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mariabackup.result 2024-08-03 07:29:57.000000000 +0000 @@ -2,6 +2,14 @@ connection node_1; connection node_1; connection node_2; +connection node_1; +select @@innodb_undo_tablespaces; +@@innodb_undo_tablespaces +0 +connection node_2; +select @@innodb_undo_tablespaces; +@@innodb_undo_tablespaces +3 Performing State Transfer on a server that has been shut down cleanly and restarted connection node_1; CREATE TABLE t1 (id int not null primary key,f1 CHAR(255)) ENGINE=InnoDB; @@ -516,5 +524,17 @@ 1 DROP TABLE t1; COMMIT; +connection node_2; +Shutting down server ... +connection node_1; +connection node_2; +Starting server ... +Using --wsrep-start-position when starting mysqld ... +connection node_1; +connection node_2; +select @@innodb_undo_tablespaces; +@@innodb_undo_tablespaces +3 +call mtr.add_suppression("InnoDB: Cannot change innodb_undo_tablespaces=3 because previous shutdown was not with innodb_fast_shutdown=0"); disconnect node_2; disconnect node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mysqldump.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mysqldump.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mysqldump.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,8 +1,8 @@ connection node_2; connection node_1; Setting SST method to mysqldump ... -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); connection node_1; CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; @@ -708,4 +708,4 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_sst_mysqldump_with_key.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,8 +1,8 @@ connection node_2; connection node_1; Setting SST method to mysqldump ... -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); connection node_1; CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; @@ -368,5 +368,5 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); DROP USER sslsst; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_table_with_hyphen.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_table_with_hyphen.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_table_with_hyphen.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_table_with_hyphen.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,52 @@ +connection node_2; +connection node_1; +connection node_1; +set wsrep_sync_wait=0; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE `par-ent` ( id INT AUTO_INCREMENT PRIMARY KEY, j INT) ENGINE=InnoDB; +CREATE TABLE `child` (id INT AUTO_INCREMENT PRIMARY KEY, parent_id INT, j INT, FOREIGN KEY (parent_id) REFERENCES `par-ent`(id)) ENGINE=InnoDB; +INSERT INTO `par-ent` VALUES (23,0); +connection node_2; +connection node_1a; +SET GLOBAL DEBUG_DBUG='+d,wsrep_ha_write_row'; +connection node_2; +INSERT INTO `child` VALUES (21,23,0),(22,23,0),(23,23,0); +connection node_1a; +SET DEBUG_SYNC='now WAIT_FOR wsrep_ha_write_row_reached'; +connection node_2; +UPDATE `par-ent` SET j=2 WHERE id=23; +connection node_1a; +SET GLOBAL DEBUG_DBUG='-d,wsrep_ha_write_row'; +SET DEBUG_SYNC='now SIGNAL wsrep_ha_write_row_continue'; +SET GLOBAL DEBUG_DBUG="RESET"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_2; +drop table `child`; +drop table `par-ent`; +connection node_1; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE `p-arent-` ( id INT AUTO_INCREMENT PRIMARY KEY, j INT) ENGINE=InnoDB; +CREATE TABLE `c-hild` (id INT AUTO_INCREMENT PRIMARY KEY, parent_id INT, j INT, FOREIGN KEY (parent_id) REFERENCES `p-arent-`(id)) ENGINE=InnoDB; +INSERT INTO `p-arent-` VALUES (23,0); +connection node_2; +connection node_1a; +SET GLOBAL DEBUG_DBUG='+d,wsrep_ha_write_row'; +connection node_2; +INSERT INTO `c-hild` VALUES (21,23,0),(22,23,0),(23,23,0); +connection node_1a; +SET DEBUG_SYNC='now WAIT_FOR wsrep_ha_write_row_reached'; +connection node_2; +UPDATE `p-arent-` SET j=2 WHERE id=23; +connection node_1a; +SET GLOBAL DEBUG_DBUG='-d,wsrep_ha_write_row'; +SET DEBUG_SYNC='now SIGNAL wsrep_ha_write_row_continue'; +SET GLOBAL DEBUG_DBUG="RESET"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_2; +drop table `c-hild`; +drop table `p-arent-`; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_toi_ddl_error.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_toi_ddl_error.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_toi_ddl_error.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_toi_ddl_error.result 2024-08-03 07:29:57.000000000 +0000 @@ -21,6 +21,6 @@ ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; DROP TABLE ten; -CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query."); +CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query\\."); connection node_2; -CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query."); +CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_ignore_apply_errors.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_ignore_apply_errors.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_ignore_apply_errors.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_ignore_apply_errors.result 2024-08-03 07:29:57.000000000 +0000 @@ -178,9 +178,9 @@ SET GLOBAL wsrep_ignore_apply_errors = 7; CALL mtr.add_suppression("Can't find record in 't.*'"); CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows event"); -CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t1'' on query. Default database: 'test'. Query: 'DROP TABLE t1', Error_code: 1051"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't drop database 's1'; database doesn't exist' on query. Default database: 'test'. Query: 'DROP SCHEMA s1', Error_code: 1008"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query. Default database: 'test'. Query: 'DROP INDEX idx1 ON t1', Error_code: 1091"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t1 DROP INDEX idx1', Error_code: 1091"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'f2'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t1 DROP COLUMN f2', Error_code: 1091"); -CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query."); +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test\\.t1'' on query\\. Default database: 'test'\\. Query: 'DROP TABLE t1', Error_code: 1051"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't drop database 's1'; database doesn't exist' on query\\. Default database: 'test'\\. Query: 'DROP SCHEMA s1', Error_code: 1008"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query\\. Default database: 'test'\\. Query: 'DROP INDEX idx1 ON t1', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query\\. Default database: 'test'\\. Query: 'ALTER TABLE t1 DROP INDEX idx1', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'f2'; check that column/key exists' on query\\. Default database: 'test'\\. Query: 'ALTER TABLE t1 DROP COLUMN f2', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_node_address.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_node_address.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_node_address.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_node_address.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -connection node_2; -connection node_1; -call mtr.add_suppression("WSREP: Stray state UUID msg: .*"); -call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .*"); -call mtr.add_suppression("WSREP: Sending JOIN failed: .*"); -flush tables; -SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; -VARIABLE_VALUE -4 -connection node_1; -CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB; -connection node_2; -set global wsrep_sync_wait=15; -INSERT INTO t1 VALUES (1); -connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; -connection node_3; -set global wsrep_sync_wait=15; -SELECT COUNT(*) FROM t1; -COUNT(*) -1 -connection node_1; -DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_retry_autocommit.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_retry_autocommit.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_retry_autocommit.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_retry_autocommit.result 2024-08-03 07:29:57.000000000 +0000 @@ -36,10 +36,7 @@ connection node_1; SELECT COUNT(*) FROM t1; COUNT(*) -connection node_1; -SELECT COUNT(*) FROM t1; -COUNT(*) -0 +1 SET DEBUG_SYNC = 'RESET'; SET GLOBAL debug_dbug = NULL; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_slave_threads.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_slave_threads.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_slave_threads.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_slave_threads.result 2024-08-03 07:29:57.000000000 +0000 @@ -6,7 +6,7 @@ CREATE TABLE t1 (f1 INT PRIMARY KEY) Engine=InnoDB; CREATE TABLE t2 (f1 INT AUTO_INCREMENT PRIMARY KEY) Engine=InnoDB; connection node_2; -CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread."); +CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread\\."); SET GLOBAL wsrep_slave_threads = 0; Warnings: Warning 1292 Truncated incorrect wsrep_slave_threads value: '0' diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_wsrep_start_position.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_wsrep_start_position.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_var_wsrep_start_position.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_var_wsrep_start_position.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,7 +3,7 @@ # # wsrep_start_position # -CALL mtr.add_suppression("WSREP: SST failed for position .*"); +CALL mtr.add_suppression("WSREP: SST failed for position "); SET @wsrep_start_position_global_saved = @@global.wsrep_start_position; # default SELECT @@global.wsrep_start_position; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,5 @@ connection node_2; connection node_1; -connection node_1; -connection node_2; connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4; connection node_1; @@ -55,6 +53,7 @@ SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; expect_1 1 +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group\\. Leaving cluster\\."); connection node_4; SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; expect_0 @@ -62,5 +61,7 @@ SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; expect_1 1 -CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group. Leaving cluster."); +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group\\. Leaving cluster\\."); DROP TABLE t2; +disconnect node_3; +disconnect node_4; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_wan.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_wan.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_wan.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_wan.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,9 +1,9 @@ connection node_2; connection node_1; -CALL mtr.add_suppression("WSREP: Stray state UUID msg:.*"); -CALL mtr.add_suppression("WSREP: Sending JOIN failed:.*"); +CALL mtr.add_suppression("WSREP: Stray state UUID msg:"); +CALL mtr.add_suppression("Sending JOIN failed: "); +CALL mtr.add_suppression("WSREP: .* sending install message failed: Socket is not connected"); CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); -call mtr.add_suppression("WSREP: Sending JOIN failed:.*"); SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; VARIABLE_VALUE = 4 1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_wan_restart_sst.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_wan_restart_sst.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_wan_restart_sst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_wan_restart_sst.result 2024-08-03 07:29:57.000000000 +0000 @@ -10,7 +10,7 @@ EXPECT_4 4 connection node_1; -CREATE TABLE t1 (f1 INTEGER); +CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=INNODB; INSERT INTO t1 VALUES (1); connection node_2; INSERT INTO t1 VALUES (2); @@ -20,6 +20,8 @@ INSERT INTO t1 VALUES (4); connection node_3; INSERT INTO t1 VALUES (13); +connection node_1; +connection node_3; Killing server ... connection node_1; INSERT INTO t1 VALUES (11); @@ -29,8 +31,11 @@ INSERT INTO t1 VALUES (14); connection node_3; INSERT INTO t1 VALUES (131); +connection node_1; connection node_2; INSERT INTO t1 VALUES (22); +connection node_1; +connection node_2; Killing server ... connection node_1; INSERT INTO t1 VALUES (21); @@ -42,6 +47,8 @@ INSERT INTO t1 VALUES (221); connection node_4; INSERT INTO t1 VALUES (34); +connection node_1; +connection node_4; Killing server ... connection node_1; INSERT INTO t1 VALUES (31); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/galera_wsrep_provider_options_syntax.result mariadb-10.11.9/mysql-test/suite/galera/r/galera_wsrep_provider_options_syntax.result --- mariadb-10.11.6/mysql-test/suite/galera/r/galera_wsrep_provider_options_syntax.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/galera_wsrep_provider_options_syntax.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ connection node_2; connection node_1; -call mtr.add_suppression("WSREP\: Unknown parameter 'gmcasts\.segment'"); +call mtr.add_suppression("WSREP\: Unknown parameter 'gmcasts\\.segment'"); call mtr.add_suppression("WSREP\: Set options returned 7"); SET GLOBAL wsrep_provider_options="gmcasts.segment=1"; ERROR HY000: Incorrect arguments to SET diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/mdev-22063.result mariadb-10.11.9/mysql-test/suite/galera/r/mdev-22063.result --- mariadb-10.11.6/mysql-test/suite/galera/r/mdev-22063.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/mdev-22063.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,241 @@ +connection node_2; +connection node_1; +# Case 1 CREATE SEQUENCE with no NOCACHE +CREATE SEQUENCE s ENGINE=InnoDB; +ERROR 42000: This version of MariaDB doesn't yet support 'CACHE without INCREMENT BY 0 in Galera cluster' +CREATE SEQUENCE s NOCACHE ENGINE=InnoDB; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +START TRANSACTION; +REPLACE INTO s VALUES (1,1,9223372036854775806,1,1,1000,0,0); +OPTIMIZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 optimize note Table does not support optimize, doing recreate + analyze instead +test.t1 optimize status OK +SELECT * FROM t1; +a +SELECT * FROM s; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +1 1 9223372036854775806 1 1 1000 0 0 +connection node_2; +SELECT * FROM t1; +a +SELECT * FROM s; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +1 1 9223372036854775806 1 1 1000 0 0 +connection node_1; +DROP TABLE t1; +DROP SEQUENCE s; +# Case 2 REPLACE INTO ... SELECT with error +CREATE TABLE t (id INT KEY,a YEAR,INDEX (id,a)) engine=innodb; +REPLACE INTO t (id,a)SELECT /*!99997 */ 1; +ERROR 21S01: Column count doesn't match value count at row 1 +REPLACE INTO t (id,a)SELECT /*!99997 */ 1,2; +SELECT * FROM t; +id a +1 2002 +CREATE TABLE t2 (id INT KEY,a YEAR,INDEX (id,a)) engine=myisam; +REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1; +ERROR 21S01: Column count doesn't match value count at row 1 +REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1,2; +Warnings: +Warning 138 Galera cluster does support consistency check only for InnoDB tables. +SELECT * FROM t2; +id a +1 2002 +CREATE TABLE t3 (id INT KEY,a YEAR,INDEX (id,a)) engine=aria; +REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1; +ERROR 21S01: Column count doesn't match value count at row 1 +REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1,2; +Warnings: +Warning 138 Galera cluster does support consistency check only for InnoDB tables. +SELECT * FROM t3; +id a +1 2002 +connection node_2; +SELECT * FROM t; +id a +1 2002 +SELECT * FROM t2; +id a +1 2002 +SELECT * FROM t3; +id a +1 2002 +connection node_1; +DROP TABLE t,t2,t3; +# Bigger REPLACE ... AS SELECT test +CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria; +CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria; +INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000; +REPLACE INTO t4 SELECT * FROM t1; +REPLACE INTO t5 SELECT * FROM t2; +REPLACE INTO t6 SELECT * FROM t3; +REPLACE INTO t7 SELECT * FROM t2; +REPLACE INTO t8 SELECT * FROM t3; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t8; +EXPECT_1000 +1000 +connection node_2; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t8; +EXPECT_1000 +1000 +connection node_1; +DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8; +# Bigger INSERT INTO ... SELECT test +CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria; +CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria; +INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t4 SELECT * FROM t1; +INSERT INTO t5 SELECT * FROM t2; +INSERT INTO t6 SELECT * FROM t3; +INSERT INTO t7 SELECT * FROM t2; +INSERT INTO t8 SELECT * FROM t3; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t8; +EXPECT_1000 +1000 +connection node_2; +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +EXPECT_1000 +1000 +SELECT COUNT(*) AS EXPECT_1000 FROM t8; +EXPECT_1000 +1000 +connection node_1; +DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8; +CREATE TABLE t1(pk int not null primary key) engine=innodb; +INSERT INTO t1 values (1),(2),(3),(4); +CREATE VIEW view_t1 AS SELECT * FROM t1; +INSERT INTO view_t1 VALUES (5); +SELECT * FROM t1; +pk +1 +2 +3 +4 +5 +DROP TABLE t1; +DROP VIEW view_t1; +CREATE TABLE t1(pk int not null primary key) engine=myisam; +INSERT INTO t1 values (1),(2),(3),(4); +CREATE VIEW view_t1 AS SELECT * FROM t1; +INSERT INTO view_t1 VALUES (5); +SELECT * FROM t1; +pk +1 +2 +3 +4 +5 +DROP TABLE t1; +DROP VIEW view_t1; +CREATE TABLE t1(pk int not null primary key) engine=aria; +INSERT INTO t1 values (1),(2),(3),(4); +CREATE VIEW view_t1 AS SELECT * FROM t1; +INSERT INTO view_t1 VALUES (5); +SELECT * FROM t1; +pk +1 +2 +3 +4 +5 +DROP TABLE t1; +DROP VIEW view_t1; +SET GLOBAL wsrep_mode=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/mdev-28433.result mariadb-10.11.9/mysql-test/suite/galera/r/mdev-28433.result --- mariadb-10.11.6/mysql-test/suite/galera/r/mdev-28433.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/mdev-28433.result 2024-08-03 07:29:57.000000000 +0000 @@ -19,7 +19,7 @@ SHOW STATUS LIKE 'wsrep_cluster_status'; Variable_name Value wsrep_cluster_status Disconnected -call mtr.add_suppression("WSREP: .*Invalid backend URI.*"); +call mtr.add_suppression("WSREP: .*Invalid backend URI"); call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument"); disconnect node_2; disconnect node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/mdev-31285.result mariadb-10.11.9/mysql-test/suite/galera/r/mdev-31285.result --- mariadb-10.11.6/mysql-test/suite/galera/r/mdev-31285.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/mdev-31285.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,23 +1,8 @@ connection node_2; connection node_1; connection node_1; -connection node_2; -connection node_1; CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i; -SHOW CREATE TABLE t; -Table Create Table -t CREATE TABLE `t` ( - `i` int(1) NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING -SELECT * from t; -i -1 -DROP TABLE IF EXISTS t; -COMMIT; +ERROR 42000: This version of MariaDB doesn't yet support 'SYSTEM VERSIONING AS SELECT in Galera cluster' connection node_2; -SET SESSION wsrep_sync_wait=0; -Killing server ... -Starting server ... -connection node_2; -call mtr.add_suppression("WSREP: Event .*Write_rows_v1 apply failed:.*"); -call mtr.add_suppression("SREP: Failed to apply write set: gtid:.*"); +SHOW CREATE TABLE t; +ERROR 42S02: Table 'test.t' doesn't exist diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/mdev-31651.result mariadb-10.11.9/mysql-test/suite/galera/r/mdev-31651.result --- mariadb-10.11.6/mysql-test/suite/galera/r/mdev-31651.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/mdev-31651.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,7 +1,7 @@ connection node_2; connection node_1; -call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not read field.*"); -call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not execute Write_rows_v1 event on table.*"); +call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not read field"); +call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not execute Write_rows_v1 event on table"); CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, KEY(b)) engine=innodb; BINLOG 'AMqaOw8BAAAAdAAAAHgAAAAAAAQANS42LjM0LTc5LjEtZGVidWctbG9nAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAYVx w2w='; BINLOG 'wlZOTxMBAAAAKgAAADwCAAAAACkAAAAAAAEABHRlc3QAAnQxAAIDAwAC wlZOTxcBAAAAJgAAAGICAAAAACkAAAAAAAEAAv/8AgAAAAgAAAA='; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/mysql-wsrep#33.result mariadb-10.11.9/mysql-test/suite/galera/r/mysql-wsrep#33.result --- mariadb-10.11.6/mysql-test/suite/galera/r/mysql-wsrep#33.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/mysql-wsrep#33.result 2024-08-03 07:29:57.000000000 +0000 @@ -3,8 +3,8 @@ connection node_1; connection node_2; Setting SST method to mysqldump ... -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); connection node_1; CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; @@ -709,6 +709,6 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); SET GLOBAL general_log = ON; SET GLOBAL slow_query_log = ON; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/mysql-wsrep#332.result mariadb-10.11.9/mysql-test/suite/galera/r/mysql-wsrep#332.result --- mariadb-10.11.6/mysql-test/suite/galera/r/mysql-wsrep#332.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/mysql-wsrep#332.result 2024-08-03 07:29:57.000000000 +0000 @@ -21,14 +21,10 @@ SET SESSION wsrep_on = 0; SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; connection node_1; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; SET GLOBAL wsrep_provider_options = 'dbug='; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction @@ -64,14 +60,10 @@ SET SESSION wsrep_on = 0; SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; connection node_1; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; SET GLOBAL wsrep_provider_options = 'dbug='; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction @@ -112,14 +104,10 @@ SET SESSION wsrep_on = 0; SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'dbug='; -SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_master_enter_sync'; connection node_1; COMMIT; connection node_1a; -SET SESSION wsrep_on = 0; -SET SESSION wsrep_on = 1; SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; -SET GLOBAL wsrep_provider_options = 'signal=local_monitor_master_enter_sync'; SET GLOBAL wsrep_provider_options = 'dbug='; connection node_1; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.result mariadb-10.11.9/mysql-test/suite/galera/r/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.result --- mariadb-10.11.6/mysql-test/suite/galera/r/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.result 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,211 @@ +connection node_2; +connection node_1; +# +# MDEV-33355 Add a Galera-2-node-to-MariaDB replication MTR test cloning the slave with mariadb-backup +# +connect master, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect slave, 127.0.0.1, root, , test, $NODE_MYPORT_3; +START SLAVE; +include/wait_for_slave_to_start.inc +connection master; +connection slave; +############################################################## +### Initial block with some transactions +### Slave: Make sure replication is not using GTID +connection slave; +# Using_Gtid=No +### Master: Create and populate t1 +connection master; +CREATE TABLE t1(a TEXT) ENGINE=InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#00:stmt#00 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#00:stmt#01 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#00:stmt#02 - slave run#0, before backup'); +COMMIT; +connection slave; +############################################################## +### Run the last transaction before mariadb-backup --backup +### Remember SHOW MASTER STATUS and @@gtid_binlog_pos +### before and after the transaction. +### Master: Rember MASTER STATUS and @@gtid_binlog_pos before tr#01 +connection master; +### Slave: Remember MASTER STATUS and @@gtid_binlog_pos before tr#01 +connection slave; +### Master: Run the actual last transaction before the backup +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#01:stmt#00 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#01:stmt#01 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#01:stmt#02 - slave run#0, before backup'); +COMMIT; +connection slave; +### Master: Remember MASTER STATUS and @@gtid_binlog_pos after tr#01 +connection master; +### Slave: Remember MASTER STATUS and @@gtid_binlog_pos after tr#01 +connection slave; +############################################################## +### Running `mariadb-backup --backup,--prepare` and checking +### that xtrabackup_slave_info and xtrabackup_binlog_info are OK +### Slave: Create a backup +### Slave: Prepare the backup +### Slave: xtrabackup files: +############################ xtrabackup_slave_info +CHANGE MASTER TO MASTER_LOG_FILE='master_after_tr01_show_master_status_file', MASTER_LOG_POS=master_after_tr01_show_master_status_position; +############################ xtrabackup_binlog_info +slave_after_tr01_show_master_status_file slave_after_tr01_show_master_status_position slave_after_tr01_gtid_binlog_pos +############################ +############################################################## +### Run more transactions after the backup: +### - while the slave is still running, then +### - while the slave is shut down +### Master: Run another transaction while the slave is still running +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#02:stmt#00 - slave run#0, after backup'); +INSERT INTO t1 VALUES ('tr#02:stmt#01 - slave run#0, after backup'); +INSERT INTO t1 VALUES ('tr#02:stmt@02 - slave run#0, after backup'); +COMMIT; +connection slave; +### Master: Remember MASTER STATUS and @@gtid_binlog_pos after tr#02 +connection master; +### Slave: Remember MASTER STATUS and @@gtid_binlog_pos after tr#02 +connection slave; +### Master: Checking SHOW BINLOG EVENTS +connection master; +SHOW BINLOG EVENTS IN 'master_after_tr01_show_master_status_file' FROM master_after_tr01_show_master_status_position LIMIT 0,1; +Log_name master_after_tr01_show_master_status_file +Pos master_after_tr01_show_master_status_position +Event_type Gtid +Server_id # +End_log_pos # +Info BEGIN GTID master_after_tr02_gtid_binlog_pos +SHOW BINLOG EVENTS IN 'master_after_tr01_show_master_status_file' FROM master_after_tr01_show_master_status_position LIMIT 1,1; +Log_name master_after_tr01_show_master_status_file +Pos # +Event_type Query_or_Annotate_rows +Server_id # +End_log_pos # +Info INSERT INTO t1 VALUES ('tr#02:stmt#00 - slave run#0, after backup') +### Slave: Checking SHOW BINLOG EVENTS +connection slave; +SHOW BINLOG EVENTS IN 'slave_after_tr01_show_master_status_file' FROM slave_after_tr01_show_master_status_position LIMIT 0,1; +Log_name slave_after_tr01_show_master_status_file +Pos # +Event_type Gtid +Server_id 1 +End_log_pos # +Info BEGIN GTID slave_after_tr02_gtid_binlog_pos +SHOW BINLOG EVENTS IN 'slave_after_tr01_show_master_status_file' FROM slave_after_tr01_show_master_status_position LIMIT 1,1; +Log_name slave_after_tr01_show_master_status_file +Pos # +Event_type Query_or_Annotate_rows +Server_id # +End_log_pos # +Info INSERT INTO t1 VALUES ('tr#02:stmt#00 - slave run#0, after backup') +### Slave: Stop replication +connection slave; +STOP SLAVE; +include/wait_for_slave_to_stop.inc +RESET SLAVE; +Warnings: +Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'No' to 'Slave_Pos' +### Slave: Shutdown the server +connection slave; +### Master: Run a transaction while the slave is shut down +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#03:stmt#00 - after slave run#0, slave is shut down, after backup'); +INSERT INTO t1 VALUES ('tr#03:stmt#01 - after slave run#0, slave is shut down, after backup'); +INSERT INTO t1 VALUES ('tr#03:stmt#02 - after slave run#0, slave is shut down, after backup'); +COMMIT; +############################################################## +### Emulate starting a new virgin slave +### Slave: Remove the data directory +### Slave: Copy back the backup +### Slave: Restart the server +connection slave; +# restart +### Slave: Display the restored data before START SLAVE +connection slave; +SELECT * FROM t1 ORDER BY a; +a +tr#00:stmt#00 - slave run#0, before backup +tr#00:stmt#01 - slave run#0, before backup +tr#00:stmt#02 - slave run#0, before backup +tr#01:stmt#00 - slave run#0, before backup +tr#01:stmt#01 - slave run#0, before backup +tr#01:stmt#02 - slave run#0, before backup +### Slave: Execute the CHANGE MASTER statement to set up the host and port +CHANGE MASTER '' TO MASTER_USER='root', MASTER_HOST='127.0.0.1', MASTER_PORT=###, MASTER_CONNECT_RETRY=1; +### Slave: Execute the CHANGE MASTER statement from xtrabackup_slave_info +CHANGE MASTER TO MASTER_LOG_FILE='master_after_tr01_show_master_status_file', MASTER_LOG_POS=master_after_tr01_show_master_status_position; +Warnings: +Note 4190 CHANGE MASTER TO is implicitly changing the value of 'Using_Gtid' from 'Slave_Pos' to 'No' +### Slave: Execute START SLAVE +include/start_slave.inc +### Master: Wait for the slave to apply all master events +connection master; +connection slave; +### Slave: Make sure replication is not using GTID after the slave restart +connection slave; +# Using_Gtid=No +### Slave: Display the restored data after START SLAVE +connection slave; +SELECT * FROM t1 ORDER BY a; +a +tr#00:stmt#00 - slave run#0, before backup +tr#00:stmt#01 - slave run#0, before backup +tr#00:stmt#02 - slave run#0, before backup +tr#01:stmt#00 - slave run#0, before backup +tr#01:stmt#01 - slave run#0, before backup +tr#01:stmt#02 - slave run#0, before backup +tr#02:stmt#00 - slave run#0, after backup +tr#02:stmt#01 - slave run#0, after backup +tr#02:stmt@02 - slave run#0, after backup +tr#03:stmt#00 - after slave run#0, slave is shut down, after backup +tr#03:stmt#01 - after slave run#0, slave is shut down, after backup +tr#03:stmt#02 - after slave run#0, slave is shut down, after backup +############################################################## +### Continue master transactions, check the new slave replicates well. +### Master: Run a transaction after restarting replication +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#04:stmt#00 - slave run#1'); +INSERT INTO t1 VALUES ('tr#04:stmt#01 - slave run#1'); +INSERT INTO t1 VALUES ('tr#04:stmt#02 - slave run#1'); +COMMIT; +connection slave; +### Slave: Display the restored data + new transactions +connection slave; +SELECT * FROM t1 ORDER BY a; +a +tr#00:stmt#00 - slave run#0, before backup +tr#00:stmt#01 - slave run#0, before backup +tr#00:stmt#02 - slave run#0, before backup +tr#01:stmt#00 - slave run#0, before backup +tr#01:stmt#01 - slave run#0, before backup +tr#01:stmt#02 - slave run#0, before backup +tr#02:stmt#00 - slave run#0, after backup +tr#02:stmt#01 - slave run#0, after backup +tr#02:stmt@02 - slave run#0, after backup +tr#03:stmt#00 - after slave run#0, slave is shut down, after backup +tr#03:stmt#01 - after slave run#0, slave is shut down, after backup +tr#03:stmt#02 - after slave run#0, slave is shut down, after backup +tr#04:stmt#00 - slave run#1 +tr#04:stmt#01 - slave run#1 +tr#04:stmt#02 - slave run#1 +############################################################## +### Cleanup +### Removing the backup directory +connection master; +DROP TABLE t1; +connection slave; +STOP SLAVE; +include/wait_for_slave_to_stop.inc +RESET SLAVE ALL; +Warnings: +Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'No' to 'Slave_Pos' +connection master; +set global wsrep_on=OFF; +RESET MASTER; +set global wsrep_on=ON; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/r/versioning_trx_id.result mariadb-10.11.9/mysql-test/suite/galera/r/versioning_trx_id.result --- mariadb-10.11.6/mysql-test/suite/galera/r/versioning_trx_id.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/r/versioning_trx_id.result 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,6 @@ connection node_2; connection node_1; -call mtr.add_suppression("Sending JOIN failed:.*"); +call mtr.add_suppression("Sending JOIN failed: "); connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; connection node_1; create table t1 (a int, s bigint unsigned as row start, e bigint unsigned as row end, period for system_time(s,e)) engine=InnoDB with system versioning; @@ -17,7 +17,7 @@ select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; count(*) 0 -select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +select count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp; count(*) 0 connection node_3; @@ -34,7 +34,7 @@ select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; count(*) 0 -select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +select count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp; count(*) 0 connection node_1; @@ -50,7 +50,7 @@ select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; count(*) 0 -select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +select count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp; count(*) 0 drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/suite.pm mariadb-10.11.9/mysql-test/suite/galera/suite.pm --- mariadb-10.11.6/mysql-test/suite/galera/suite.pm 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/suite.pm 2024-08-03 07:29:57.000000000 +0000 @@ -1,5 +1,6 @@ package My::Suite::Galera; +use warnings; use lib 'suite'; use wsrep::common; @@ -63,6 +64,7 @@ qr(WSREP: Failed to remove page file .*), qr(WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*), qr|WSREP: Sending JOIN failed: -107 \(Transport endpoint is not connected\). Will retry in new primary component.|, + qr|WSREP: Send action \{.* STATE_REQUEST} returned -107 \(Transport endpoint is not connected\)|, qr|WSREP: Trying to continue unpaused monitor|, qr|WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position|, qr|WSREP: Failed to report last committed|, @@ -71,13 +73,17 @@ sub which($) { return `sh -c "command -v $_[0]"` } sub skip_combinations { - my %skip = (); + my @combinations; + $skip{'include/have_mariabackup.inc'} = 'Need socket statistics utility' unless which("lsof") || which("sockstat") || which("ss"); $skip{'include/have_stunnel.inc'} = "Need 'stunnel' utility" unless which("stunnel"); $skip{'include/have_qpress.inc'} = "Need 'qpress' utility" unless which("qpress"); + $skip{'../encryption/include/have_file_key_management_plugin.combinations'} = [ 'ctr' ] + unless $::mysqld_variables{'version-ssl-library'} =~ /OpenSSL (\S+)/ + and $1 ge "1.0.1"; %skip; } diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/GAL-401.test mariadb-10.11.9/mysql-test/suite/galera/t/GAL-401.test --- mariadb-10.11.6/mysql-test/suite/galera/t/GAL-401.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/GAL-401.test 2024-08-03 07:29:57.000000000 +0000 @@ -48,7 +48,7 @@ SET SESSION wsrep_sync_wait=15; SHOW CREATE TABLE t1; DROP TABLE t1; -CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender (.*) is not in state transfer \\(SYNCED\\)\\. Message ignored\\."); --connection node_1 --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/GAL-419.test mariadb-10.11.9/mysql-test/suite/galera/t/GAL-419.test --- mariadb-10.11.6/mysql-test/suite/galera/t/GAL-419.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/GAL-419.test 2024-08-03 07:29:57.000000000 +0000 @@ -5,11 +5,12 @@ --source include/galera_cluster.inc --source include/big_test.inc -call mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node.*"); +call mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node"); call mtr.add_suppression("Aborting"); -call mtr.add_suppression("Plugin \'wsrep\' init function returned error."); -call mtr.add_suppression("Plugin \'wsrep\' registration as a STORAGE ENGINE failed."); -call mtr.add_suppression("Failed to initialize plugins."); +call mtr.add_suppression("Plugin 'wsrep' init function returned error"); +call mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed"); +call mtr.add_suppression("Plugin 'wsrep' registration as a FUNCTION failed"); +call mtr.add_suppression("Failed to initialize plugins"); --connection node_2 SET SESSION wsrep_sync_wait = 0; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/GCF-939.test mariadb-10.11.9/mysql-test/suite/galera/t/GCF-939.test --- mariadb-10.11.6/mysql-test/suite/galera/t/GCF-939.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/GCF-939.test 2024-08-03 07:29:57.000000000 +0000 @@ -25,7 +25,6 @@ --list_files $MYSQLTEST_VARDIR/mysqld.2/data GRA_*.log DROP TABLE t1; -CALL mtr.add_suppression("Ignoring error 'Unknown table 'test.t1'' on query"); +CALL mtr.add_suppression("Ignoring error 'Unknown table 'test\\.t1'' on query"); --connection node_2 -CALL mtr.add_suppression("Error 'Unknown table 'test.t1'' on query"); - +CALL mtr.add_suppression("Error 'Unknown table 'test\\.t1'' on query"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-21479.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-21479.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-21479.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-21479.test 2024-08-03 07:29:57.000000000 +0000 @@ -77,7 +77,7 @@ --let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; --source include/wait_condition.inc -CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender (.*) is not in state transfer \\(SYNCED\\)\\. Message ignored\\."); --connection node_1 --echo # Wait until both nodes are back to cluster diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-22232.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-22232.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-22232.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-22232.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,66 @@ +# +# MDEV-22232: CTAS execution crashes during replay. +# +# There were multiple problems and two failing scenarios with empty result set +# and with non-empty result set: +# - CTAS didn't add shared keys for selected tables +# - Security context wasn't set on the replayer thread +# - CTAS was retried after failure - now retry disabled + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/have_debug.inc + +--connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1 + +# Scenario 1 +--echo --- CTAS with empty result set --- +CREATE TABLE t1 (a INT) ENGINE=InnoDB; + +# Run CTAS until the resulting table gets created, +# then it gets BF aborted by other DDL. +SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort'; +--send + CREATE TABLE t2 SELECT * FROM t1; + +# Wait for CTAS to reach the table create point, +# start executing other DDL and BF abort CTAS. +--connection node_1 +SET DEBUG_SYNC = 'now WAIT_FOR may_run'; +TRUNCATE TABLE t1; + +--connection con1 +# CTAS gets BF aborted. +--error ER_QUERY_INTERRUPTED +--reap + +# Cleanup +SET DEBUG_SYNC = 'RESET'; + + +# Scenario 2 +--echo --- CTAS with non-empty result set --- +INSERT INTO t1 VALUES (10), (20), (30); + +# Run CTAS until the resulting table gets created, +# then it gets BF aborted by other DDL. +SET DEBUG_SYNC = 'create_table_select_before_create SIGNAL may_run WAIT_FOR bf_abort'; +--send + CREATE TABLE t2 SELECT * FROM t1; + +# Wait for CTAS to reach the table create point, +# start executing other DDL and BF abort CTAS. +--connection node_1 +SET DEBUG_SYNC = 'now WAIT_FOR may_run'; +TRUNCATE TABLE t1; + +--connection con1 +# CTAS gets BF aborted. +--error ER_QUERY_INTERRUPTED +--reap + +# Cleanup +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +--disconnect con1 +--source include/galera_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-24143.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-24143.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-24143.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-24143.test 2024-08-03 07:29:57.000000000 +0000 @@ -11,7 +11,11 @@ SELECT * FROM t1 WHERE c1 <=0 ORDER BY c1 DESC; --error ER_LOCK_DEADLOCK INSERT INTO t1 VALUES (4),(3),(1),(2); ---error ER_TABLE_EXISTS_ERROR +# +# This is because support for CREATE TABLE ENGINE=SEQUENCE +# is done before we check does table exists already. +# +--error ER_NOT_SUPPORTED_YET CREATE TABLE t1 (pk INT PRIMARY KEY, b INT) ENGINE=SEQUENCE; --error ER_CANT_DROP_FIELD_OR_KEY ALTER TABLE t1 DROP COLUMN c2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-25731.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-25731.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-25731.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-25731.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,34 @@ +--source include/galera_cluster.inc +--source include/have_aria.inc + +--connection node_1 +SET GLOBAL wsrep_load_data_splitting=ON; +SET GLOBAL wsrep_mode=REPLICATE_MYISAM; +CREATE TABLE t1 (c1 int) ENGINE=MYISAM; +LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n'; +SELECT COUNT(*) AS EXPECT_6 FROM t1; + +--connection node_2 +SELECT COUNT(*) AS EXPECT_6 FROM t1; + +--connection node_1 +ALTER TABLE t1 ENGINE=Aria; +SET GLOBAL wsrep_mode=REPLICATE_ARIA; +LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n'; +SELECT COUNT(*) AS EXPECT_12 FROM t1; + +--connection node_2 +SELECT COUNT(*) AS EXPECT_12 FROM t1; + +--connection node_1 +ALTER TABLE t1 ENGINE=InnoDB; +LOAD DATA INFILE '../../std_data/mdev-25731.dat' IGNORE INTO TABLE t1 LINES TERMINATED BY '\n'; +SELECT COUNT(*) AS EXPECT_18 FROM t1; + +--connection node_2 +SELECT COUNT(*) AS EXPECT_18 FROM t1; + +--connection node_1 +DROP TABLE t1; +SET GLOBAL wsrep_load_data_splitting=OFF; +SET GLOBAL wsrep_mode=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-26499.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26499.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-26499.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26499.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,20 @@ +# +# MDEV-26499 +# +# This test reproduces some failure on mysql_shutdown() call +# which manifests sporadically in some galera MTR tests during +# restart of a node. +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +SET GLOBAL debug_dbug="+d,simulate_slow_client_at_shutdown"; +--source include/restart_mysqld.inc + +--source include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-26575.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26575.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-26575.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26575.test 2024-08-03 07:29:57.000000000 +0000 @@ -6,7 +6,7 @@ --source include/galera_cluster.inc --connection node_2 -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); --connection node_1 # Save original auto_increment_offset values. diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-26597.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26597.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-26597.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-26597.test 2024-08-03 07:29:57.000000000 +0000 @@ -18,7 +18,7 @@ SET SESSION wsrep_sync_wait = 0; --source include/kill_galera.inc ---let $start_mysqld_params = "" +--let $start_mysqld_params = --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --source include/start_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27276.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27276.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27276.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27276.test 2024-08-03 07:29:57.000000000 +0000 @@ -17,7 +17,7 @@ # We use concurrency facility of test MW-369 to setup the conflict between DDL and DML # -# Open connection node_1a here, MW-369.inc will use it later +# Open connection node_1a here, we will use it later --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 # create FK parent table @@ -28,14 +28,51 @@ --let $mw_369_parent_query = INSERT INTO p VALUES(1,0) --let $mw_369_child_query = CREATE TABLE c(id INT NOT NULL PRIMARY KEY, p_id INT, FOREIGN KEY (p_id) REFERENCES p(id) ON DELETE CASCADE) ENGINE=InnoDB -# execute above queries through separate nodes ---source MW-369.inc +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; +--eval $mw_369_parent_query + +# +# Block the $mw_369_child_query from node_2 +# +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the +# delete on parent +# +--connection node_2 +--eval $mw_369_child_query + +# +# Wait until $mw_369_child_query from node_2 reaches the sync point and +# block the 'COMMIT' from node_1 before it certifies. +# +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc # Expect certification failure --connection node_1 --error ER_LOCK_DEADLOCK --reap +--connection node_1a +SET SESSION DEBUG_SYNC = "RESET"; + --connection node_2 SELECT * FROM p; SELECT * FROM c; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27806.opt mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27806.opt --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27806.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27806.opt 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1 @@ +--log-bin --log-slave-updates --gtid-strict-mode --wsrep_gtid_mode=on diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27806.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27806.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27806.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27806.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,51 @@ +# +# MDEV-27806 GTIDs diverge after CTAS +# +--source include/galera_cluster.inc + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +INSERT INTO t1 VALUES (1),(2),(3); +CREATE TABLE ts1 AS SELECT * FROM t1; +--let binlog_pos= `SELECT @@gtid_binlog_pos` + +--let $MASTER_MYPORT=$NODE_MYPORT_1 +--let $binlog_file=LAST +--let $binlog_limit=8,20 +--source include/show_binlog_events.inc + +--connection node_2 +--let $binlog_limit=7,20 +--source include/show_binlog_events.inc + +--disable_query_log +--eval SELECT STRCMP(@@gtid_binlog_pos, "$binlog_pos") = 0 AS BINLOG_POSITIONS_MATCH; +--enable_query_log + +DROP TABLE t1,ts1; + + +# +# Same as above, with empty CREATE TABLE AS SELECT +# +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +CREATE TABLE ts1 AS SELECT * FROM t1; +--let binlog_pos= `SELECT @@gtid_binlog_pos` + +--let $MASTER_MYPORT=$NODE_MYPORT_1 +--let $binlog_file=LAST +--let $binlog_limit=18,20 +--source include/show_binlog_events.inc + +--connection node_2 +--let $binlog_limit=17,20 +--source include/show_binlog_events.inc + +--disable_query_log +--eval SELECT STRCMP(@@gtid_binlog_pos, "$binlog_pos") = 0 AS BINLOG_POSITIONS_MATCH; +--enable_query_log + +DROP TABLE t1,ts1; + +CALL mtr.add_suppression("Ignoring server id for non bootstrap node"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27862.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27862.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-27862.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-27862.test 2024-08-03 07:29:57.000000000 +0000 @@ -1,6 +1,8 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--disable_ps2_protocol + # NEXTVAL --connection node_1 @@ -54,3 +56,4 @@ DROP SEQUENCE seq_transaction; DROP TABLE t1; +--enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-29142.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-29142.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-29142.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-29142.test 2024-08-03 07:29:57.000000000 +0000 @@ -8,15 +8,15 @@ --source include/auto_increment_offset_save.inc --connection node_1 -call mtr.add_suppression("WSREP: Event .* Write_rows_v1 apply failed:.*"); -call mtr.add_suppression("WSREP: Failed to apply write set:.*"); -call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on.*"); +call mtr.add_suppression("WSREP: Event .* Write_rows_v1 apply failed: "); +call mtr.add_suppression("WSREP: Failed to apply write set: "); +call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); --connection node_2 -call mtr.add_suppression("WSREP: Failed to open table mysql.wsrep_streaming_log for writing"); +call mtr.add_suppression("WSREP: Failed to open table mysql\\.wsrep_streaming_log for writing"); call mtr.add_suppression("WSREP: Failed to open SR table for write"); call mtr.add_suppression("WSREP: Failed to recover SR transactions from schema: wsrep_on : 0"); -call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on.*"); +call mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); SET @@global.tx_read_only = ON; --error 0,1286 @@ -50,16 +50,16 @@ --source include/kill_galera.inc --remove_file $MYSQLTEST_VARDIR/mysqld.1/data/grastate.dat ---let $start_mysqld_params = "--wsrep-new-cluster" +--let $start_mysqld_params =--wsrep-new-cluster --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/start_mysqld.inc --connection node_2 ---let $start_mysqld_params = "" +--let $start_mysqld_params = --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --source include/start_mysqld.inc -call mtr.add_suppression("WSREP: Failed to open table mysql.wsrep_streaming_log for writing"); +call mtr.add_suppression("WSREP: Failed to open table mysql\\.wsrep_streaming_log for writing"); call mtr.add_suppression("WSREP: Failed to open SR table for write"); call mtr.add_suppression("WSREP: Failed to recover SR transactions from schema: wsrep_on : 0"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-31272.combinations mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-31272.combinations --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-31272.combinations 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-31272.combinations 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,5 @@ +[binlogon] +log-bin +log-slave-updates=ON + +[binlogoff] diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-31272.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-31272.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-31272.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-31272.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,58 @@ +# +# MDEV-31272: Statement rollback causes empty writeset replication +# + +--source include/galera_cluster.inc + +# +# Case 1: Multi statement transaction +# +--connection node_1 +CREATE TABLE t1 (f1 int primary key, f2 int); +INSERT INTO t1 VALUES (1,0); + +--let $replicated_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_replicated'` + +BEGIN; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (2,4),(1,1); +COMMIT; + +--let $replicated_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_replicated'` + +--disable_query_log +--eval SELECT $replicated_new - $replicated_old AS 'Writesets replicated (expect 0)'; +--enable_query_log + +--connection node_1 +SELECT * FROM t1; +--connection node_2 +SELECT * FROM t1; + +DROP TABLE t1; + + +# +# Case 2: autocommit statement +# +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER); +INSERT INTO t1 VALUES (1,0); + +--let $replicated_old = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_replicated'` + +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES (2,4), (1,1); + +--let $replicated_new = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_replicated'` + +--disable_query_log +--eval SELECT $replicated_new - $replicated_old AS 'Writesets replicated (expect 0)'; +--enable_query_log + +--connection node_1 +SELECT * FROM t1; +--connection node_2 +SELECT * FROM t1; + +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-32549.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-32549.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-32549.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-32549.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,28 @@ +# +# MDEV-32549: Cluster is inconsitent after savepoint +# statement is rolled back +# +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) engine=innodb; +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) engine=aria; + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SELECT * FROM t2; +--error ER_CHECK_NOT_IMPLEMENTED +SAVEPOINT s1; +INSERT INTO t1 VALUES (2); +COMMIT; + +--connection node_1 +SELECT * FROM t1; + +# If bug is present: only the second INSERT +# is replicated, causing an inconsistent +# cluster. +--connection node_2 +SELECT * FROM t1; + +--connection node_1 +DROP TABLE t1,t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-32938.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-32938.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-32938.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-32938.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,57 @@ +# +# MDEV-32938: ALTER command is replicated and successfully applied while being BF-aborted locally. +# +# Why it happend: +# - ALTER went to prepare FK-referenced tables as TOI keys +# - to do this, it would open the main table with SHARED_HIGH_PRIO MDL lock which disregarded any +# other locks (including X-lock) waiting in the queue in case someone was already holding a +# compatible lock type (like any DML operation) +# - if there was other TOI operation on the same table, it would go through BF-abort cycle to grab +# the lock for itself +# - since the initial ALTER had not reached TOI yet, it would loose to real TOI operation and got +# BF-aborted with its THD marked as killed +# - then, ALTER would enter TOI and get replicated with no checks that it has already been aborted +# - after entering TOI mode, it would later find it'd been killed, and complete with an error +# - at the same time, the command would successfully apply on every other node except the initiator. +# +# Fixed by checking killed state on THD before entering TOI. +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/have_debug.inc + +--connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1 + +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); + +CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB; + +# Run ALTER DROP COLUMN and hang before closing tables on adding FK keys and before entering TOI. +# Wait until it gets BF-aborted. +SET DEBUG_SYNC = 'wsrep_append_fk_toi_keys_before_close_tables SIGNAL may_alter WAIT_FOR bf_abort'; +--send + ALTER TABLE t1 DROP COLUMN c2; + +--connection node_1 +# Run ALTER ADD COLUMN and BF-abort the previous ALTER DROP COLUMN. +SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; +ALTER TABLE t1 ADD COLUMN c3 INT; + +--connection con1 +# ALTER DROP COLUMN gets BF aborted. +--error ER_QUERY_INTERRUPTED +--reap + +INSERT INTO t1 (c1, c2, c3) VALUES (1, 0, 0); + +--connection node_2 +# ALTER DROP COLUMN must not be replicated. +INSERT INTO t1 (c1, c2, c3) VALUES (2, 0, 0); + +# Cleanup. +--connection node_1 +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +--disconnect con1 +--source include/galera_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33064.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33064.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33064.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33064.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,57 @@ +# +# MDEV-33064: ALTER INPLACE running TOI should abort a conflicting DML operation +# +# DDL operations may commit InnoDB transactions more than once during the execution. +# In this case wsrep flag on trx object is cleared, which may cause wrong logic of +# such operations afterwards (wsrep-related hooks are not run). +# One of the consequences was that DDL operation couldn't abort a DML operation +# holding conflicting locks. +# +# The fix: re-enable wsrep flag on trx restart if it's a part of a DDL operation. +# + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/have_debug.inc + +--connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1 + +CREATE TABLE t1(c1 INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t1_fk(c1 INT PRIMARY KEY, c2 INT, INDEX (c2), FOREIGN KEY (c2) REFERENCES t1(c1)) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1); + +--connection con1 +SET SESSION wsrep_retry_autocommit = 0; +SET DEBUG_SYNC = 'ib_after_row_insert SIGNAL may_alter WAIT_FOR bf_abort'; +# INSERT also grabs FK-referenced table lock. +--send + INSERT INTO t1_fk VALUES (1, 1); + +--connection node_1 +SET DEBUG_SYNC = 'now WAIT_FOR may_alter'; +SET DEBUG_SYNC = 'lock_wait_end WAIT_FOR alter_continue'; +# ALTER BF-aborts INSERT. +--send + ALTER TABLE t1 ADD COLUMN c2 INT, ALGORITHM=INPLACE; + +--connection con1 +# INSERT gets BF-aborted. +--error ER_LOCK_DEADLOCK +--reap +SET DEBUG_SYNC = 'now SIGNAL alter_continue'; + +--connection node_1 +# ALTER succeeds. +--reap + +--connection node_2 +# Sanity check that ALTER has been replicated. +INSERT INTO t1 (c1, c2) VALUES (2, 2); + +# Cleanup. +--connection node_1 +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1_fk, t1; +--disconnect con1 +--source include/galera_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33136.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33136.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33136.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33136.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,44 @@ +# +# MDEV-33136: Properly BF-abort user transactions with explicit locks +# +# User transactions may acquire explicit MDL locks from InnoDB level +# when persistent statistics is re-read for a table. +# If such a transaction would be subject to BF-abort, it was improperly +# detected as a system transaction and wouldn't get aborted. +# +# The fix: Check if a transaction holding explicit MDL locks is a user +# transaction in the MDL conflict handling code. + +--source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/have_debug.inc + +--connect node_1a,127.0.0.1,root,,test,$NODE_MYPORT_1 + +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; + +--connection node_1a +TRUNCATE TABLE t1; +# TRUNCATE forces the next statement to re-read statistics from persistent storage, +# which will acquire MDL locks on the statistics tables in InnoDB. +SET SESSION wsrep_retry_autocommit = 0; +SET DEBUG_SYNC = 'dict_stats_mdl_acquired SIGNAL may_toi WAIT_FOR bf_abort'; +--send + INSERT INTO t1 VALUES (1); + +--connection node_1 +SET DEBUG_SYNC = 'now WAIT_FOR may_toi'; +TRUNCATE TABLE t1; + +--connection node_1a +# Local INSERT gets aborted. +--error ER_LOCK_DEADLOCK +--reap + +# Cleanup +--connection node_1 +SET DEBUG_SYNC = 'RESET'; +DROP TABLE t1; +--disconnect node_1a +--source include/galera_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33523.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33523.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33523.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33523.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,11 @@ +# +# MDEV-33523: Spurious deadlock error when wsrep_on=OFF +# +--source include/galera_cluster.inc + +SET SESSION wsrep_on=OFF; +BEGIN; +# If bug is present, the following rollback +# results in ER_LOCK_DEADLOCK error. +ROLLBACK; +SET SESSION wsrep_on=OFF; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33828.cnf mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33828.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33828.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33828.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,4 @@ +!include ../galera_2nodes.cnf + +[mysqld] +log-bin diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33828.test mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33828.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MDEV-33828.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MDEV-33828.test 2024-08-03 07:29:57.000000000 +0000 @@ -0,0 +1,45 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_aria.inc + +SET AUTOCOMMIT=ON; +SELECT @@autocommit; + +SET LOCAL enforce_storage_engine=InnoDB; + +CREATE TABLE t1(id int not null primary key auto_increment, name varchar(64)) ENGINE=InnoDB; +INSERT INTO t1(name) VALUES ('name1'),('name3'),('name6'),('name2'); + +DELIMITER |; +CREATE PROCEDURE sel_proc() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + SELECT * FROM t1; +END| + +CREATE PROCEDURE ins_proc() +BEGIN + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; + INSERT INTO t1 VALUES ('name_proc'); +END| +DELIMITER ;| + +SET AUTOCOMMIT=OFF; +SELECT @@autocommit; + +START TRANSACTION; + +insert into t1(name) values('name10'); + +select param_list, returns, db, type from mysql.proc where name='sel_proc'; + +call ins_proc(); + +COMMIT; + +SET AUTOCOMMIT=ON; + +SELECT * FROM t1; +DROP TABLE t1; +DROP PROCEDURE sel_proc; +DROP PROCEDURE ins_proc; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MW-284.test mariadb-10.11.9/mysql-test/suite/galera/t/MW-284.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MW-284.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MW-284.test 2024-08-03 07:29:57.000000000 +0000 @@ -6,7 +6,7 @@ --source include/galera_cluster.inc --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 -call mtr.add_suppression("\\[ERROR\\] Error reading packet from server: WSREP has not yet prepared node for application use .*"); +call mtr.add_suppression("\\[ERROR\\] Error reading packet from server: WSREP has not yet prepared node for application use "); call mtr.add_suppression("WSREP has not yet prepared node for application use"); --disable_query_log diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MW-329.test mariadb-10.11.9/mysql-test/suite/galera/t/MW-329.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MW-329.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MW-329.test 2024-08-03 07:29:57.000000000 +0000 @@ -5,7 +5,6 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -CALL mtr.add_suppression("WSREP: .*conflict state . after post commit .*"); CREATE TABLE t1 (f1 INTEGER, f2 CHAR(20) DEFAULT 'abc') ENGINE=InnoDB; # We start with a populated table @@ -78,7 +77,6 @@ --eval SELECT $wsrep_local_replays_new - $wsrep_local_replays_old > 0 AS wsrep_local_replays; --enable_query_log - # # Terminate the stored procedure # @@ -99,6 +97,6 @@ DROP TABLE t1; # Due to MW-330, Multiple "conflict state 3 after post commit" warnings if table is dropped while SP is running -CALL mtr.add_suppression("conflict state 3 after post commit"); +CALL mtr.add_suppression("WSREP: .* conflict state after post commit "); -set global innodb_status_output=Default; \ No newline at end of file +set global innodb_status_output=Default; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MW-336.cnf mariadb-10.11.9/mysql-test/suite/galera/t/MW-336.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/MW-336.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MW-336.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -2,6 +2,8 @@ [mysqld.1] wsrep-debug=SERVER +loose-wsrep-mw-336=1 [mysqld.2] wsrep-debug=SERVER +loose-wsrep-mw-336=2 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MW-336.test mariadb-10.11.9/mysql-test/suite/galera/t/MW-336.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MW-336.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MW-336.test 2024-08-03 07:29:57.000000000 +0000 @@ -3,11 +3,12 @@ # --source include/galera_cluster.inc ---source include/have_innodb.inc --source include/force_restart.inc +--source include/have_sequence.inc --connection node_1 -CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +SET @wsrep_slave_threads_orig = @@wsrep_slave_threads; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY AUTO_INCREMENT) Engine=InnoDB; SET GLOBAL wsrep_slave_threads = 10; @@ -22,7 +23,7 @@ SET GLOBAL wsrep_slave_threads = 1; --connection node_2 -INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (NULL); --connection node_1 --echo # Wait until one of the appliers has exited @@ -54,27 +55,19 @@ SET GLOBAL wsrep_slave_threads = 1; --connection node_2 -INSERT INTO t1 VALUES (1); -INSERT INTO t1 VALUES (2); -INSERT INTO t1 VALUES (3); -INSERT INTO t1 VALUES (4); -INSERT INTO t1 VALUES (5); -INSERT INTO t1 VALUES (6); -INSERT INTO t1 VALUES (7); -INSERT INTO t1 VALUES (8); -INSERT INTO t1 VALUES (9); -INSERT INTO t1 VALUES (10); -INSERT INTO t1 VALUES (11); -INSERT INTO t1 VALUES (12); -INSERT INTO t1 VALUES (13); -INSERT INTO t1 VALUES (14); -INSERT INTO t1 VALUES (16); -INSERT INTO t1 VALUES (17); -INSERT INTO t1 VALUES (18); -INSERT INTO t1 VALUES (19); -INSERT INTO t1 VALUES (20); +--disable_query_log +let $c = 50; +while ($c) { +INSERT INTO t1 VALUES(NULL); COMMIT; +dec $c; +} +--enable_query_log --connection node_1 +--let $wait_condition = SELECT COUNT(*) = 51 FROM t1; +--let $wait_condition_on_error_output = SELECT COUNT(*) FROM t1; +--source include/wait_condition_with_debug.inc + --echo # Wait until 19 of the appliers has exited --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; --let $wait_condition_on_error_output = SELECT COUNT(*), 1 as EXPECTED_VALUE FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle'; show processlist @@ -82,7 +75,7 @@ SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; -SELECT COUNT(*) FROM t1; +SELECT COUNT(*) AS EXPECT_51 FROM t1; SET GLOBAL wsrep_slave_threads = 10; --echo # Set slave threads to 10 step 3 @@ -96,16 +89,13 @@ SET GLOBAL wsrep_slave_threads = 1; --connection node_2 -INSERT INTO t1 VALUES (21); -INSERT INTO t1 VALUES (22); -INSERT INTO t1 VALUES (23); -INSERT INTO t1 VALUES (24); -INSERT INTO t1 VALUES (25); -INSERT INTO t1 VALUES (26); -INSERT INTO t1 VALUES (27); -INSERT INTO t1 VALUES (28); -INSERT INTO t1 VALUES (29); -INSERT INTO t1 VALUES (30); +--disable_query_log +let $c = 50; +while ($c) { +INSERT INTO t1 VALUES(NULL); COMMIT; +dec $c; +} +--enable_query_log --connection node_1 --echo # Wait until slave threads back to 1 @@ -115,6 +105,10 @@ SELECT VARIABLE_VALUE AS EXPECT_1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_applier_thread_count'; -SELECT COUNT(*) FROM t1; +SELECT COUNT(*) AS EXPECT_101 FROM t1; DROP TABLE t1; + +--disable_query_log +SET GLOBAL wsrep_slave_threads = @wsrep_slave_threads_orig; +--enable_query_log diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MW-369.inc mariadb-10.11.9/mysql-test/suite/galera/t/MW-369.inc --- mariadb-10.11.6/mysql-test/suite/galera/t/MW-369.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MW-369.inc 2024-08-03 07:29:57.000000000 +0000 @@ -12,9 +12,9 @@ # START TRANSACTION; # $mw_369_parent_query # node_2 -# $mw_369_child_query - will be blocked on node_1 in apply monitor +# $mw_369_child_query - will be blocked on node_1 in wsrep_apply_cb # node_1: -# COMMIT; - will be blocked on node_1 in local monitor +# COMMIT; - will be blocked on node_1 in wsrep_after_certification # # The $mw_369_child_query is always expected to succeed. The caller is # responsible for checking if the final COMMIT on connection node_1 @@ -32,8 +32,7 @@ # --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connection node_1a SET SESSION wsrep_sync_wait = 0; ---let $galera_sync_point = apply_monitor_slave_enter_sync ---source include/galera_set_sync_point.inc +SET GLOBAL DEBUG_DBUG = "d,sync.wsrep_apply_cb"; # # insert client row, which will make it impossible to replay the @@ -47,28 +46,37 @@ # block the 'COMMIT' from node_1 before it certifies. # --connection node_1a ---source include/galera_wait_sync_point.inc ---source include/galera_clear_sync_point.inc - ---let $galera_sync_point = local_monitor_master_enter_sync ---source include/galera_set_sync_point.inc +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; --connection node_1 +SET DEBUG_SYNC = "wsrep_after_certification SIGNAL after_certification_reached WAIT_FOR continue_after_certification"; --send COMMIT # # Wait until both sync points have been reached # --connection node_1a ---let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_master_enter_sync ---source include/galera_wait_sync_point.inc +SET SESSION DEBUG_SYNC = "now WAIT_FOR after_certification_reached"; # # both threads are now parked in sync points, signal them to continue # ---let $galera_sync_point = apply_monitor_slave_enter_sync ---source include/galera_signal_sync_point.inc ---let $galera_sync_point = local_monitor_master_enter_sync ---source include/galera_signal_sync_point.inc ---source include/galera_clear_sync_point.inc +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point:%' +--let $wait_condition_on_error_output = SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST +--source include/wait_condition_with_debug.inc + +SET DEBUG_SYNC = 'now SIGNAL continue_after_certification'; + +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point:%' +--let $wait_condition_on_error_output = SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST +--source include/wait_condition_with_debug.inc + +SET DEBUG_SYNC = 'now SIGNAL signal.wsrep_apply_cb'; + +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point:%' +--let $wait_condition_on_error_output = SELECT STATE FROM INFORMATION_SCHEMA.PROCESSLIST +--source include/wait_condition_with_debug.inc + +SET GLOBAL DEBUG_DBUG = ""; +SET DEBUG_SYNC = 'RESET'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/MW-369.test mariadb-10.11.9/mysql-test/suite/galera/t/MW-369.test --- mariadb-10.11.6/mysql-test/suite/galera/t/MW-369.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/MW-369.test 2024-08-03 07:29:57.000000000 +0000 @@ -24,7 +24,6 @@ --source include/galera_cluster.inc --source include/have_innodb.inc --source include/have_debug_sync.inc ---source include/galera_have_debug_sync.inc CREATE TABLE p (f1 INTEGER PRIMARY KEY, f2 INTEGER) ENGINE=INNODB; CREATE TABLE c (f1 INTEGER PRIMARY KEY, p_id INTEGER, @@ -341,4 +340,3 @@ DROP TABLE cg; DROP TABLE pg; - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/enforce_storage_engine2.cnf mariadb-10.11.9/mysql-test/suite/galera/t/enforce_storage_engine2.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/enforce_storage_engine2.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/enforce_storage_engine2.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -7,7 +7,3 @@ [mysqld.2] enforce_storage_engine=innodb sql_mode='' - - - - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera#414.cnf mariadb-10.11.9/mysql-test/suite/galera/t/galera#414.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/galera#414.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera#414.cnf 2024-08-03 07:29:57.000000000 +0000 @@ -5,4 +5,3 @@ [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcs.max_packet_size=2' - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera#500.test mariadb-10.11.9/mysql-test/suite/galera/t/galera#500.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera#500.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera#500.test 2024-08-03 07:29:57.000000000 +0000 @@ -40,6 +40,6 @@ --source include/restart_mysqld.inc --connection node_2 -CALL mtr.add_suppression("WSREP: exception from gcomm, backend must be restarted: Gcomm backend termination was requested by setting gmcast.isolate=2."); +CALL mtr.add_suppression("WSREP: exception from gcomm, backend must be restarted: Gcomm backend termination was requested by setting gmcast\\.isolate=2\\."); --source include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera-features#117.test mariadb-10.11.9/mysql-test/suite/galera/t/galera-features#117.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera-features#117.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera-features#117.test 2024-08-03 07:29:57.000000000 +0000 @@ -38,7 +38,7 @@ --source include/wait_until_disconnected.inc --source include/start_mysqld.inc -CALL mtr.add_suppression("Inconsistent by consensus."); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("WSREP: Failed to execute TOI action"); CALL mtr.add_suppression("WSREP: TO isolation end failed"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_as_master.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_as_master.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_as_master.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_as_master.test 2024-08-03 07:29:58.000000000 +0000 @@ -52,12 +52,18 @@ SET SQL_LOG_BIN=OFF; DROP TABLE t2, t3; +--let binlog_pos=`SELECT @@gtid_binlog_pos;` + --connection node_3 --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't4'; --source include/wait_condition.inc +--disable_query_log +--eval SELECT STRCMP(@@gtid_binlog_pos, "$binlog_pos") = 0 AS BINLOG_POSITIONS_MATCH; +--enable_query_log + STOP SLAVE; RESET SLAVE ALL; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_as_slave_gtid_myisam.test 2024-08-03 07:29:58.000000000 +0000 @@ -46,18 +46,8 @@ SELECT COUNT(*) AS EXPECT_1 FROM t1; ---disable_query_log ---eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal; ---enable_query_log - ---connection node_2 ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; ---source include/wait_condition.inc - ---let $wait_condition = SELECT COUNT(*) = 1 FROM t1; ---source include/wait_condition.inc - -SELECT COUNT(*) AS EXPECT_1 FROM t1; +# Note that MyISAM tables are not replicated by Galera so we do not here +# check node_2 --disable_query_log --eval SELECT '$gtid_binlog_state_node1' = @@global.gtid_binlog_state AS gtid_binlog_state_equal; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_abort_mariabackup.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_abort_mariabackup.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_abort_mariabackup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_abort_mariabackup.test 2024-08-03 07:29:58.000000000 +0000 @@ -13,7 +13,7 @@ CREATE TABLE t(i INT NOT NULL PRIMARY KEY) ENGINE INNODB; INSERT INTO t VALUES(1); # -# In default settings donor should desync +# In default settings donor should not desync # --echo # Restart node_2, force SST. --connection node_2 @@ -37,7 +37,7 @@ --connection node_1 let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err; ---echo # Both should return FOUND 2 as we have bootstrap and SST +--echo # Both should return NOT FOUND as we have mariabackup with backup locks let SEARCH_PATTERN = Desyncing and pausing the provider; --source include/search_pattern_in_file.inc let SEARCH_PATTERN = Resuming and resyncing the provider; @@ -76,7 +76,7 @@ --connection node_1 let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err; ---echo # Both should return FOUND 3 as we have 1 new SST +--echo # Both should return NOT FOUND as we have mariabackup with backup locks let SEARCH_PATTERN = Desyncing and pausing the provider; --source include/search_pattern_in_file.inc let SEARCH_PATTERN = Resuming and resyncing the provider; @@ -117,13 +117,16 @@ --enable_result_log let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.2.err; ---echo # Both should return FOUND 1 as node should not desync +--echo # Both should return FOUND 2 because both backups do desync but on different points let SEARCH_PATTERN = Desyncing and pausing the provider; --source include/search_pattern_in_file.inc let SEARCH_PATTERN = Resuming and resyncing the provider; --source include/search_pattern_in_file.inc ---echo # Should return FOUND 1 because only last backup does not desync -let SEARCH_PATTERN = Server not desynched from group because WSREP_MODE_BF_MARIABACKUP used.; +--echo # Should return FOUND 1 as server did not desync at BLOCK_DDL +let SEARCH_PATTERN = Server not desynched from group at BLOCK_DDL because WSREP_MODE_BF_MARIABACKUP is used.; +--source include/search_pattern_in_file.inc +--echo # Should return FOUND 1 as server did desync and pause at BLOCK_COMMIT +let SEARCH_PATTERN = Server desynched from group during BACKUP STAGE BLOCK_COMMIT.; --source include/search_pattern_in_file.inc SET GLOBAL wsrep_mode = ""; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_abort_shutdown.test 2024-08-03 07:29:58.000000000 +0000 @@ -18,7 +18,7 @@ CREATE TABLE t1 (f1 INT PRIMARY KEY); --connection node_2 -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); SET DEBUG_SYNC = 'wsrep_before_certification WAIT_FOR continue'; --send INSERT INTO t1 VALUES (1) diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_kill.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_kill.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_kill.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_kill.test 2024-08-03 07:29:58.000000000 +0000 @@ -94,27 +94,43 @@ --disconnect node_2b # -# Test case 5: Start a transaction on node_2a with wsrep disabled -# and start a DDL on other transaction that will then abort node_2a -# transactions +# Test case 5: Start a transaction on node_2a with wsrep disabled. +# A conflicting DDL on other transaction can't BF abort +# transaction from node_2a (wsrep disabled). # --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 --connection node_2a SET SESSION wsrep_on=OFF; begin; update t1 set a =5, b=2; --connection node_2 -ALTER TABLE t1 ADD UNIQUE KEY b3(b); +--send ALTER TABLE t1 ADD UNIQUE KEY b3(b) +--connection node_2b +SET SESSION wsrep_sync_wait=0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'Waiting for table metadata lock'; +--source include/wait_condition.inc + +--connection node_2a select * from t1; +# We expect that ALTER should not be able to BF abort +# this transaction, it must wait for it to finish. +# Expect commit to succeed. +commit; + +--connection node_2 +--reap + --disconnect node_2a +--disconnect node_2b # -# Test case 6: Start a transaction on node_2a with wsrep disabled -# and kill it from other connection on same node +# Test case 6: Start a transaction on node_2a with wsrep disabled +# and kill it from other connection on same node. # --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_lock_wait.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_lock_wait.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_bf_lock_wait.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_bf_lock_wait.test 2024-08-03 07:29:58.000000000 +0000 @@ -52,6 +52,12 @@ let $sleep_period=10; echo checking error log for 'BF lock wait long' message for $counter times every $sleep_period seconds ...; + +--let assert_text= BF lock wait long +--let assert_select= BF lock wait long +--let assert_count= 0 +--let assert_only_after= CURRENT_TEST: galera.galera_bf_lock_wait + while($counter > 0) { --disable_query_log @@ -60,9 +66,11 @@ --enable_query_log --enable_result_log -# use error 0,1 instead if want test to continue - --error 1 - exec grep 'BF lock wait long' $MYSQLTEST_VARDIR/log/mysqld.*.err; +--let assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--source include/assert_grep.inc + +--let assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err +--source include/assert_grep.inc dec $counter; } diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_create_table_as_select.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_create_table_as_select.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_create_table_as_select.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_create_table_as_select.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,6 +3,8 @@ # --source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/have_debug.inc --connection node_1 SET SESSION default_storage_engine=InnoDB; @@ -103,31 +105,27 @@ # --connection node_1 +# Pause applying CTAS command from the other node +SET GLOBAL DEBUG_DBUG = 'd,sync.wsrep_apply_cb'; CREATE TABLE t2 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t2 VALUES (1),(2),(3),(4),(5); ---connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 -LOCK TABLE t2 WRITE; - ---connection node_1 +# Wait until local CTAS grabs MDL lock and let applied CTAS BF-abort it +SET DEBUG_SYNC = 'create_table_select_before_create WAIT_FOR sync.wsrep_apply_cb_reached'; +SET DEBUG_SYNC = 'create_table_select_before_lock SIGNAL signal.wsrep_apply_cb WAIT_FOR bf_abort'; --send CREATE TABLE t1 AS SELECT * FROM t2; ---connection node_1a ---let $wait_condition = SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE STATE LIKE 'Waiting for table metadata lock%' ---source include/wait_condition.inc - --connection node_2 SELECT COUNT(*) = 5 FROM t2; CREATE TABLE t1 AS SELECT * FROM t2; ---connection node_1a -UNLOCK TABLES; - --connection node_1 ---error ER_TABLE_EXISTS_ERROR,ER_QUERY_INTERRUPTED +--error ER_QUERY_INTERRUPTED --reap +SET GLOBAL DEBUG_DBUG = ''; +SET DEBUG_SYNC = 'RESET'; DROP TABLE t1, t2; # diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_desync_overlapped.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_desync_overlapped.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_desync_overlapped.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_desync_overlapped.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,7 +11,7 @@ --connection node_1 -CREATE TABLE ten (f1 INTEGER); +CREATE TABLE ten (f1 INTEGER PRIMARY KEY) Engine=InnoDB; INSERT INTO ten VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); CREATE TABLE t1 (f1 INTEGER, PRIMARY KEY (f1)) Engine=InnoDB; @@ -24,6 +24,7 @@ --connection node_1a +FLUSH STATUS; SET GLOBAL wsrep_desync = 1; show status like 'wsrep_desync_count'; SET DEBUG_SYNC='now WAIT_FOR alter1'; @@ -45,9 +46,7 @@ SET GLOBAL wsrep_desync = 0; show status like 'wsrep_desync_count'; ---disable_query_log -call mtr.add_suppression("Trying to make wsrep_desync = OFF on the node that is already synchronized."); ---enable_query_log +call mtr.add_suppression("Trying to make wsrep_desync = OFF on the node that is already synchronized\\."); show status like 'wsrep_desync_count'; SET GLOBAL wsrep_desync = 0; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_drop_database.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_drop_database.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_drop_database.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_drop_database.test 2024-08-03 07:29:58.000000000 +0000 @@ -56,7 +56,7 @@ DROP DATABASE fts; --connection node_2 -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'fts_t1'; --source include/wait_condition.inc --let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'fts_t2'; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_drop_multi.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_drop_multi.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_drop_multi.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_drop_multi.test 2024-08-03 07:29:58.000000000 +0000 @@ -35,7 +35,7 @@ --error ER_NO_SUCH_TABLE SHOW CREATE TABLE t4; -CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t2,test.t4'' on query\. Default database: 'test'\. Query: 'DROP TABLE t1, t2, t3, t4', Error_code: 1051"); +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test\\.t2,test\\.t4'' on query\\. Default database: 'test'\\. Query: 'DROP TABLE t1, t2, t3, t4', Error_code: 1051"); --connection node_1 DROP TABLE t5; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_events2.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_events2.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_events2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_events2.test 2024-08-03 07:29:58.000000000 +0000 @@ -137,7 +137,7 @@ --echo # node_2 Event should be SERVERSIDE_DISABLED SELECT EVENT_CATALOG, EVENT_SCHEMA, EVENT_NAME, DEFINER, EVENT_BODY, EVENT_DEFINITION, EVENT_TYPE, EXECUTE_AT, INTERVAL_VALUE, INTERVAL_FIELD, STATUS,ON_COMPLETION, EVENT_COMMENT FROM INFORMATION_SCHEMA.EVENTS WHERE EVENT_NAME='one_event'; -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); --connection node_1 SELECT * FROM t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_fk_truncate.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_fk_truncate.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_fk_truncate.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_fk_truncate.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,5 @@ --source include/galera_cluster.inc +--source include/have_innodb.inc CREATE TABLE author ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_forced_binlog_format_ctas.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_forced_binlog_format_ctas.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_forced_binlog_format_ctas.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_forced_binlog_format_ctas.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ --source include/galera_cluster.inc -call mtr.add_suppression("Unsafe statement written to the binary log using statement format since.*"); +call mtr.add_suppression("Unsafe statement written to the binary log using statement format since "); SET GLOBAL wsrep_forced_binlog_format=ROW; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test 2024-08-03 07:29:58.000000000 +0000 @@ -126,7 +126,6 @@ --send CALL insert_10m (); --connection node_2 -call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); SET SESSION wsrep_sync_wait = 0; # Make sure that node_2 is not killed while TOIs are applied. @@ -142,31 +141,31 @@ --source include/kill_galera.inc --connection node_1_insert_simple ---error 2013 +--error 2013, 2026 --reap --connection node_1_insert_multi ---error 2013 +--error 2013, 2026 --reap --connection node_1_insert_transaction ---error 2013 +--error 2013, 2026 --reap --connection node_1_update_simple ---error 2013 +--error 2013, 2026 --reap --connection node_1_insert_1k ---error 2013 +--error 2013, 2026 --reap --connection node_1_insert_1m ---error 2013 +--error 2013, 2026 --reap --connection node_1_insert_10m ---error 2013 +--error 2013, 2026 --reap --connection node_1 @@ -200,12 +199,12 @@ DROP PROCEDURE insert_1m; --connection node_1 -call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\\(\\)"); CALL mtr.add_suppression("conflict state 7 after post commit"); # Warning happens when the cluster is started for the first time CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); --connection node_2 -call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\\(\\)"); CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_gra_log.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_gra_log.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_gra_log.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_gra_log.test 2024-08-03 07:29:58.000000000 +0000 @@ -43,7 +43,7 @@ --eval SET GLOBAL wsrep_ignore_apply_errors = $restore_wsrep_ignore_apply_errors DROP TABLE t1; -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); # Restore original auto_increment_offset values. --source include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_gtid_server_id.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_gtid_server_id.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_gtid_server_id.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_gtid_server_id.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ --connection node_1 select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode; --connection node_2 -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode; --connection node_1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.cnf mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,22 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=mariabackup +wsrep_sst_auth=root: + +ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem +ssl-key=@ENV.MYSQL_TEST_DIR/std_data/server-key.pem +ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' +innodb-log-file-buffering + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' +innodb-log-file-buffering + +[sst] +ssl-mode=VERIFY_CA +transferfmt=@ENV.MTR_GALERA_TFMT +streamfmt=mbstream diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mariabackup_verify_ca.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,61 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_mariabackup.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--let $LOG_FILE=$MYSQL_TMP_DIR/galera_node2.log +--error 0,1 +--remove_file $LOG_FILE + +CREATE TABLE t1 (f1 INT PRIMARY KEY); + +--connection node_2 + +--echo # Verify that graceful shutdown succeeds... +--source include/shutdown_mysqld.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); + +--connection node_2 +--echo # Start node_2 again... +--let $restart_noprint=2 +--let $start_mysqld_params=--log-error=$LOG_FILE +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +SELECT * FROM t1; + +--let $start_mysqld_params= +--source include/restart_mysqld.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Confirm that IST took place +--let $assert_text = mariabackup IST completed on joiner +--let $assert_select = mariabackup IST completed on joiner +--let $assert_count = 1 +--let $assert_file = $LOG_FILE +--let $assert_only_after = Prepared IST receiver for +--source include/assert_grep.inc + +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc + +--remove_file $LOG_FILE diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_mysqldump.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mysqldump.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_mysqldump.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_mysqldump.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ --source suite/galera/include/galera_sst_set_mysqldump.inc -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to "); --let $node_1=node_1 --let $node_2=node_2 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_restart_joiner.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_restart_joiner.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_restart_joiner.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_restart_joiner.test 2024-08-03 07:29:58.000000000 +0000 @@ -37,7 +37,7 @@ # Write file to make mysql-test-run.pl expect the crash, but don't start it --let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name --let KILL_NODE_PIDFILE = `SELECT @@pid_file` @@ -96,4 +96,3 @@ --source include/auto_increment_offset_restore.inc --source include/galera_end.inc - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.cnf mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,17 @@ +!include ../galera_2nodes.cnf + +[mysqld] +wsrep_sst_method=rsync + +ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem +ssl-key=@ENV.MYSQL_TEST_DIR/std_data/server-key.pem +ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem + +[mysqld.1] +wsrep_provider_options='base_port=@mysqld.1.#galera_port;pc.ignore_sb=true' + +[mysqld.2] +wsrep_provider_options='base_port=@mysqld.2.#galera_port;pc.ignore_sb=true' + +[sst] +ssl-mode=VERIFY_CA diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ist_rsync_verify_ca.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,60 @@ +--source include/big_test.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--let $LOG_FILE=$MYSQL_TMP_DIR/galera_node2.log +--error 0,1 +--remove_file $LOG_FILE + +CREATE TABLE t1 (f1 INT PRIMARY KEY); + +--connection node_2 + +--echo # Verify that graceful shutdown succeeds... +--source include/shutdown_mysqld.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); + +--connection node_2 +--echo # Start node_2 again... +--let $restart_noprint=2 +--let $start_mysqld_params=--log-error=$LOG_FILE +--source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +SELECT * FROM t1; + +--let $start_mysqld_params= +--source include/restart_mysqld.inc + +--connection node_1 + +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +# Confirm that IST took place +--let $assert_text = rsync IST completed on joiner +--let $assert_select = rsync IST completed on joiner +--let $assert_count = 1 +--let $assert_file = $LOG_FILE +--let $assert_only_after = Prepared IST receiver for +--source include/assert_grep.inc + +DROP TABLE t1; + +--source include/auto_increment_offset_restore.inc + +--remove_file $LOG_FILE diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_kill_applier.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_applier.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_kill_applier.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_applier.test 2024-08-03 07:29:58.000000000 +0000 @@ -17,21 +17,21 @@ --let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep applier idle' LIMIT 1` --replace_result $applier_thread ID ---error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--error ER_KILL_DENIED_ERROR --eval KILL $applier_thread --replace_result $applier_thread ID ---error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--error ER_KILL_DENIED_ERROR --eval KILL QUERY $applier_thread --let $aborter_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE = 'wsrep aborter idle' LIMIT 1` --replace_result $aborter_thread ID ---error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--error ER_KILL_DENIED_ERROR --eval KILL $aborter_thread --replace_result $aborter_thread ID ---error ER_KILL_DENIED_ERROR,ER_KILL_DENIED_ERROR +--error ER_KILL_DENIED_ERROR --eval KILL QUERY $aborter_thread SET GLOBAL wsrep_slave_threads=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_kill_bf.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_bf.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_kill_bf.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_bf.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,41 @@ +--source include/galera_cluster.inc +--source include/have_debug_sync.inc +--source include/have_debug.inc + +--connect con1,127.0.0.1,root,,test,$NODE_MYPORT_1 + +call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); + +CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB; +INSERT into t1 values (1,1); + +SET DEBUG_SYNC = 'alter_table_after_open_tables SIGNAL bf_started WAIT_FOR bf_continue'; +--send ALTER TABLE t1 DROP COLUMN c2; + +--connection node_1 +SET SESSION wsrep_sync_wait = 0; +SET DEBUG_SYNC = 'now WAIT_FOR bf_started'; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: alter_table_after_open_tables' +--source include/wait_condition.inc + +--let $applier_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'debug sync point:%' LIMIT 1` + +--replace_result $applier_thread ID +--error ER_KILL_DENIED_ERROR +--eval KILL $applier_thread + +--replace_result $applier_thread ID +--error ER_KILL_DENIED_ERROR +--eval KILL QUERY $applier_thread + +--connection node_1 +SET DEBUG_SYNC = 'now SIGNAL bf_continue'; + +--connection con1 +--reap +SET DEBUG_SYNC = 'RESET'; +SELECT * FROM t1; + +--connection node_1 +DROP TABLE t1; +--disconnect con1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_kill_ddl.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_ddl.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_kill_ddl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_kill_ddl.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,7 +11,7 @@ --source include/auto_increment_offset_save.inc --connection node_1 -call mtr.add_suppression("WSREP: Last Applied Action message in non-primary configuration from member .*"); +call mtr.add_suppression("WSREP: Last Applied Action message in non-primary configuration from member "); # Enable the master to continue running during the split-brain situation that # occurs when the slave is killed diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_load_data.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_load_data.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_load_data.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_load_data.test 2024-08-03 07:29:58.000000000 +0000 @@ -30,8 +30,308 @@ LOCK TABLES cardtest_tbl WRITE; ALTER TABLE cardtest_tbl DISABLE KEYS; -INSERT INTO cardtest_tbl VALUES (1,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(2,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(3,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(4,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(5,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(6,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(7,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(8,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(9,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(10,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(11,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(12,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(13,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(14,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(15,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(16,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(17,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(18,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(19,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(20,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(21,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(22,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(23,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(24,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(25,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(26,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(27,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(28,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(29,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(30,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(31,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(32,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(33,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(34,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(35,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(36,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(37,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(38,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(39,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(40,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(41,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(42,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(43,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(44,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(45,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(46,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(47,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(48,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(49,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(50,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(51,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(52,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(53,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(54,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(55,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(56,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(57,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(58,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(59,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(60,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(61,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(62,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(63,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(64,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(65,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(66,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(67,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(68,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(69,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(70,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(71,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(72,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(73,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(74,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(75,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(76,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(77,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(78,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(79,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(80,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(81,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(82,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(83,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(84,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(85,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(86,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(87,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(88,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(89,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(90,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(91,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(92,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(93,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(94,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(95,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(96,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(97,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(98,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(99,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(100,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(101,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(102,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(103,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(104,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(105,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(106,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(107,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(108,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(109,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(110,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(111,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(112,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(113,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(114,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(115,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(116,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(117,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(118,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(119,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(120,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(121,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(122,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(123,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(124,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(125,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(126,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(127,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(128,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(129,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(130,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(131,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(132,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(133,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(134,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(135,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(136,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(137,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(138,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(139,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(140,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(141,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(142,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(143,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(144,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(145,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(146,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(147,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(148,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(149,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(150,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(151,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(152,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(153,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(154,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(155,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(156,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(157,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(158,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(159,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(160,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(161,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(162,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(163,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(164,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(165,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(166,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(167,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(168,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(169,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(170,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(171,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(172,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(173,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(174,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(175,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(176,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(177,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(178,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(179,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(180,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(181,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(182,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(183,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(184,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(185,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(186,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(187,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(188,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(189,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(190,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(191,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(192,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(193,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(194,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(195,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(196,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(197,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(198,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(199,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(200,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(201,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(202,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(203,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(204,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(205,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(206,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(207,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(208,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(209,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(210,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(211,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(212,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(213,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(214,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(215,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(216,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(217,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(218,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(219,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(220,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(221,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(222,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(223,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(224,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(225,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(226,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(227,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(228,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(229,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(230,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(231,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(232,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(233,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(234,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(235,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(236,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(237,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(238,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(239,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(240,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(241,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(242,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(243,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(244,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(245,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(246,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(247,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(248,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(249,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(250,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(251,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(252,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(253,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(254,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(255,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(256,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(257,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(258,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(259,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(260,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(261,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(262,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(263,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(264,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(265,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(266,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(267,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(268,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(269,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(270,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(271,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(272,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(273,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(274,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(275,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(276,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(277,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(278,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(279,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(280,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(281,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(282,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(283,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(284,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(285,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(286,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(287,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(288,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(289,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(290,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(291,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(292,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(293,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(294,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(295,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(296,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(297,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(298,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(299,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(300,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL),(301,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL); - +INSERT INTO cardtest_tbl VALUES + (1,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (2,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (3,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (4,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (5,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (6,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (7,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (8,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (9,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (10,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (11,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (12,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (13,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (14,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (15,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (16,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (17,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (18,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (19,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (20,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (21,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (22,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (23,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (24,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (25,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (26,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (27,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (28,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (29,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (30,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (31,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (32,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (33,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (34,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (35,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (36,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (37,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (38,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (39,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (40,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (41,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (42,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (43,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (44,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (45,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (46,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (47,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (48,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (49,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (50,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (51,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (52,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (53,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (54,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (55,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (56,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (57,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (58,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (59,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (60,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (61,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (62,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (63,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (64,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (65,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (66,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (67,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (68,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (69,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (70,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (71,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (72,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (73,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (74,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (75,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (76,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (77,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (78,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (79,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (80,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (81,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (82,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (83,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (84,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (85,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (86,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (87,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (88,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (89,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (90,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (91,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (92,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (93,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (94,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (95,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (96,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (97,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (98,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (99,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (100,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (101,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (102,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (103,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (104,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (105,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (106,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (107,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (108,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (109,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (110,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (111,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (112,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (113,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (114,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (115,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (116,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (117,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (118,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (119,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (120,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (121,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (122,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (123,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (124,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (125,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (126,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (127,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (128,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (129,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (130,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (131,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (132,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (133,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (134,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (135,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (136,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (137,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (138,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (139,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (140,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (141,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (142,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (143,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (144,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (145,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (146,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (147,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (148,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (149,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (150,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (151,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (152,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (153,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (154,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (155,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (156,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (157,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (158,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (159,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (160,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (161,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (162,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (163,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (164,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (165,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (166,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (167,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (168,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (169,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (170,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (171,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (172,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (173,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (174,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (175,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (176,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (177,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (178,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (179,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (180,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (181,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (182,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (183,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (184,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (185,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (186,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (187,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (188,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (189,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (190,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (191,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (192,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (193,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (194,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (195,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (196,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (197,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (198,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (199,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (200,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (201,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (202,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (203,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (204,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (205,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (206,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (207,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (208,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (209,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (210,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (211,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (212,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (213,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (214,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (215,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (216,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (217,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (218,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (219,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (220,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (221,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (222,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (223,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (224,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (225,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (226,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (227,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (228,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (229,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (230,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (231,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (232,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (233,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (234,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (235,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (236,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (237,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (238,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (239,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (240,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (241,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (242,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (243,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (244,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (245,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (246,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (247,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (248,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (249,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (250,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (251,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (252,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (253,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (254,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (255,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (256,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (257,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (258,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (259,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (260,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (261,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (262,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (263,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (264,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (265,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (266,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (267,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (268,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (269,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (270,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (271,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (272,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (273,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (274,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (275,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (276,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (277,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (278,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (279,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (280,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (281,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (282,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (283,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (284,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (285,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (286,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (287,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (288,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (289,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (290,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (291,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (292,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (293,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (294,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (295,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (296,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (297,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (298,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (299,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (300,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL), + (301,1,'','',1,1466430455,1471454450,NULL,10.00000,1,NULL,'','',NULL,NULL,1,NULL,NULL); ALTER TABLE cardtest_tbl ENABLE KEYS; UNLOCK TABLES; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_log_output_csv.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_log_output_csv.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_log_output_csv.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_log_output_csv.test 2024-08-03 07:29:58.000000000 +0000 @@ -12,13 +12,17 @@ SELECT COUNT(*) > 0 FROM mysql.general_log; +--disable_ps2_protocol SELECT 1 = 1 FROM t1; SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 1 = 1 FROM t1'; +--enable_ps2_protocol --connection node_2 +--disable_ps2_protocol SELECT 2 = 2 FROM t1; SELECT COUNT(*) = 1 FROM mysql.slow_log WHERE sql_text = 'SELECT 2 = 2 FROM t1'; +--enable_ps2_protocol --connection node_1 DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_mdl_race.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_mdl_race.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_mdl_race.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_mdl_race.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,70 +3,92 @@ # --source include/galera_cluster.inc +--source include/have_debug.inc --source include/have_debug_sync.inc +--connection node_1 CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) engine=innodb; INSERT INTO t1 VALUES (1, 'a'); INSERT INTO t1 VALUES (2, 'a'); ---connection node_1 SET AUTOCOMMIT=ON; START TRANSACTION; - UPDATE t1 SET f2 = 'b' WHERE f1 = 1; # block access to t2 --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connection node_1a +SET SESSION wsrep_sync_wait=0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2' +--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.TABLES +--source include/wait_condition_with_debug.inc LOCK TABLE t2 WRITE; -# Block before MLD lock wait +# Block before MDL lock wait --connection node_1 - SET @@debug_dbug = "d,sync.wsrep_before_mdl_wait"; +SET DEBUG_SYNC= 'wsrep_before_mdl_wait SIGNAL before_mdl_wait WAIT_FOR mdl_wait_continue'; --send SELECT * FROM t2; -# Wait for SELECT to be blocked --connection node_1a -#--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIS WHERE STATE = 'System lock'; -#--source include/wait_condition.inc -#--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'init' AND INFO = 'COMMIT'; -#--source include/wait_condition.inc +--echo # Wait until select is blocked before MDL lock wait +SET DEBUG_SYNC= 'now WAIT_FOR before_mdl_wait'; # block applier to wait after BF victim is locked +--connection node_1a SET @@debug_dbug = "d,sync.wsrep_after_BF_victim_lock"; # Issue a conflicting update on node #2 --connection node_2 UPDATE t1 SET f2 = 'c' WHERE f1 = 1; +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1b +SET SESSION wsrep_sync_wait=0; +--echo # Wait for conflicting update to block +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Update_rows_log_event:%'; +--source include/wait_condition.inc + # Unblock the SELECT, to enter wsrep_thd_is_BF ---connection node_1a -SET @@debug_dbug = ""; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_before_mdl_wait"; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock"; + +--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1c +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Update_rows_log_event:%'; +--source include/wait_condition.inc +--connection node_1a # unblock applier to try to BF the SELECT -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_after_BF_victim_lock"; +SET DEBUG_SYNC = "now SIGNAL BF_victim_continue"; # table lock is not needed anymore UNLOCK TABLES; -# SELECT succeeds +# SELECT returns deadlock --connection node_1 - --error ER_LOCK_DEADLOCK --reap -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; +--connection node_1 +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a'; +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c'; +SELECT * FROM t1; --connection node_2 -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'a'; -SELECT COUNT(*) = 1 FROM t1 WHERE f2 = 'c'; +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'a'; +SELECT COUNT(*) AS EXPECT_1 FROM t1 WHERE f2 = 'c'; +SELECT * FROM t1; DROP TABLE t1; DROP TABLE t2; --connection node_1a SET DEBUG_SYNC = "RESET"; +--connection node_1b +SET DEBUG_SYNC = "RESET"; + +--connection node_1 +--disconnect node_1a +--disconnect node_1b +--disconnect node_1c diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_myisam_autocommit.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_myisam_autocommit.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_myisam_autocommit.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_myisam_autocommit.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,21 +1,26 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/log_bin.inc # -# This tests simple autocommit replication of MyISAM tables. No updates arrive on the slave. +# This tests simple autocommit replication of MyISAM tables. # +SET GLOBAL wsrep_mode=REPLICATE_MYISAM; + # Without a PK CREATE TABLE t1 (f1 INTEGER) ENGINE=MyISAM; INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2), (3); +# This is TOI INSERT INTO t1 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL; CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=MyISAM; INSERT INTO t2 VALUES (1); INSERT INTO t2 VALUES (2), (3); +# This is TOI INSERT INTO t2 SELECT 4 FROM DUAL UNION ALL SELECT 5 FROM DUAL; # Error @@ -32,14 +37,26 @@ DELETE FROM t1 WHERE f1 = 9; DELETE FROM t2 WHERE f1 = 9; +SELECT * FROM t1 ORDER BY f1; +SELECT * FROM t2 ORDER BY f1; + +--connection node_2 +SELECT * FROM t1 ORDER BY f1; +SELECT * FROM t2 ORDER BY f1; + # TRUNCATE TRUNCATE TABLE t1; -TRUNCATE TABLE t1; +TRUNCATE TABLE t2; + +SELECT * FROM t1 ORDER BY f1; +SELECT * FROM t2 ORDER BY f1; --connection node_2 -SELECT COUNT(*) = 0 FROM t1; -SELECT COUNT(*) = 0 FROM t2; +SELECT * FROM t1 ORDER BY f1; +SELECT * FROM t2 ORDER BY f1; +--connection node_1 +SET GLOBAL wsrep_mode=DEFAULT; DROP TABLE t1; DROP TABLE t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_parallel_apply_lock_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -32,7 +32,7 @@ --connection node_2a --sleep 1 SET SESSION wsrep_sync_wait=0; -SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE '%committing%' or STATE = 'Waiting for certification'); +SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE (STATE LIKE 'Commit' or STATE = 'Waiting for certification'); SELECT COUNT(*) AS EXPECT_1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Waiting for table metadata lock%'; SELECT COUNT(*) AS EXPECT_0 FROM t1; SELECT COUNT(*) AS EXPECT_0 FROM t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_parallel_simple.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_parallel_simple.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_parallel_simple.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_parallel_simple.test 2024-08-03 07:29:58.000000000 +0000 @@ -51,7 +51,7 @@ --let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for table metadata lock%'; --source include/wait_condition.inc ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'committing%'; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Commit'; --source include/wait_condition.inc UNLOCK TABLES; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_partition.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_partition.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_partition.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_partition.test 2024-08-03 07:29:58.000000000 +0000 @@ -2,10 +2,11 @@ --source include/have_partition.inc --source include/big_test.inc --source include/force_restart.inc +--source include/log_bin.inc --connection node_1 -call mtr.add_suppression("WSREP: RSU failed due to pending transactions, schema: test, query ALTER.*"); +call mtr.add_suppression("WSREP: RSU failed due to pending transactions, schema: test, query ALTER"); call mtr.add_suppression("WSREP: ALTER TABLE isolation failure"); --connection node_1 @@ -437,6 +438,3 @@ --connection node_1 DROP TABLE t1; DROP PROCEDURE p1; - - - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_partition_key.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_partition_key.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_partition_key.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_partition_key.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,55 @@ +--source include/galera_cluster.inc +--source include/have_partition.inc +--source include/log_bin.inc + +--connection node_1 +CREATE TABLE `t1` ( + `id` int(10) unsigned NOT NULL, + `other_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`,`other_id`) +) ENGINE=InnoDB + PARTITION BY LIST (`id` MOD 2) +(PARTITION `p0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (1) ENGINE = InnoDB); + +INSERT INTO t1 VALUES (1, 0); + +CREATE TABLE t2 LIKE t1; + +START TRANSACTION; + +INSERT INTO t2(SELECT * FROM t1 WHERE id = 1); +DELETE FROM t1 WHERE id = 1; + +COMMIT; + +--connection node_2 +SELECT * from t1; +SELECT * from t2; +DROP TABLE t1, t2; + +--connection node_1 +CREATE TABLE `t1` ( + `id` int(10) unsigned NOT NULL, + `other_id` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB + PARTITION BY LIST (`id` MOD 2) +(PARTITION `p0` VALUES IN (0) ENGINE = InnoDB, + PARTITION `p1` VALUES IN (1) ENGINE = InnoDB); + +INSERT INTO t1 VALUES (1, 0); + +CREATE TABLE t2 LIKE t1; + +START TRANSACTION; + +INSERT INTO t2(SELECT * FROM t1 WHERE id = 1); +DELETE FROM t1 WHERE id = 1; + +COMMIT; + +--connection node_2 +SELECT * from t1; +SELECT * from t2; +DROP TABLE t1, t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_pc_recovery.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_pc_recovery.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_pc_recovery.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_pc_recovery.test 2024-08-03 07:29:58.000000000 +0000 @@ -27,8 +27,8 @@ SELECT COUNT(*) = 1 FROM t1; --let $NODE_2_PIDFILE = `SELECT @@pid_file` ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --exec kill -9 `cat $NODE_1_PIDFILE` `cat $NODE_2_PIDFILE` # Perform --wsrep-recover and preserve the positions into variables by placing them in $MYSQL_TMP_DIR/galera_wsrep_start_position.inc and then --source'ing it @@ -66,8 +66,8 @@ # Instruct MTR to perform the actual restart using --wsrep-start-position . Proper --wsrep_cluster_address is used as my.cnf only contains 'gcomm://' for node #1 ---exec echo "restart: --wsrep-start-position=$galera_wsrep_start_position1 --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1,127.0.0.1:$NODE_GALERAPORT_2" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect ---exec echo "restart: --wsrep-start-position=$galera_wsrep_start_position2 --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1,127.0.0.1:$NODE_GALERAPORT_2" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--write_line "restart: --wsrep-start-position=$galera_wsrep_start_position1 --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1,127.0.0.1:$NODE_GALERAPORT_2" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart: --wsrep-start-position=$galera_wsrep_start_position2 --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1,127.0.0.1:$NODE_GALERAPORT_2" $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --sleep 5 --connection node_1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_query_cache.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_query_cache.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache.test 2024-08-03 07:29:58.000000000 +0000 @@ -2,6 +2,8 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--disable_ps2_protocol + # # Ensure that the query cache behaves properly with respect to Galera # @@ -65,3 +67,4 @@ DROP TABLE t1; +--enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_query_cache_invalidate.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache_invalidate.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_query_cache_invalidate.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache_invalidate.test 2024-08-03 07:29:58.000000000 +0000 @@ -22,9 +22,9 @@ --connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 --connection node_2 -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); --connection node_4 -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); --connection node_3 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_query_cache_sync_wait.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,8 @@ --source include/have_query_cache.inc --source include/galera_have_debug_sync.inc +--disable_ps2_protocol + CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); @@ -88,3 +90,5 @@ --connection node_2a SET DEBUG_SYNC = "RESET"; + +--enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_replica_no_gtid.cnf mariadb-10.11.9/mysql-test/suite/galera/t/galera_replica_no_gtid.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_replica_no_gtid.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_replica_no_gtid.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,9 @@ +!include ../galera_2nodes_as_slave.cnf + +[mysqld] +wsrep-debug=1 +server_id=15 +wsrep_gtid_mode=OFF +wsrep_gtid_domain_id=16 +gtid_domain_id=11 +gtid_strict_mode=OFF diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_replica_no_gtid.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_replica_no_gtid.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_replica_no_gtid.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_replica_no_gtid.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,124 @@ +# +# Test Galera as a replica to a MySQL async replication +# +# The galera/galera_2node_slave.cnf describes the setup of the nodes +# +--source include/force_restart.inc +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_sequence.inc + +# As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it +# we open the node_3 connection here +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +create user repl@'%' identified by 'repl'; +grant all on *.* to repl@'%'; +flush privileges; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; + +--let $node_1 = node_1 +--let $node_2 = node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +--disable_query_log +--eval CHANGE MASTER TO master_host='127.0.0.1', master_user='repl', master_password='repl', master_port=$NODE_MYPORT_3, master_use_gtid=slave_pos; +--enable_query_log +START SLAVE; + +--connection node_3 + +CREATE TABLE t1 (id bigint primary key, msg varchar(100)) engine=innodb; +--disable_query_log +INSERT INTO t1 SELECT seq, 'test' from seq_1_to_10000; +--enable_query_log +SELECT COUNT(*) AS EXPECT_10000 FROM t1; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 10000 FROM t1; +--source include/wait_condition.inc + +# +# Node_2 is slave so mysql.gtid_slave_pos table is also replicated +# +SELECT COUNT(*) > 0 AS EXPECT_1 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--let $wait_condition = SELECT COUNT(*) = 10000 FROM t1; +--source include/wait_condition.inc + +# +# mysql-gtid_slave_pos table should not be replicated by Galera +# +SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; + +--connection node_2 +--echo # Verify that graceful shutdown succeeds. +--source include/shutdown_mysqld.inc +--echo # Force SST +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--connection node_1 +--echo # Waiting until node_2 is not part of cluster anymore +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +--connection node_2 +--echo # Start node_2 again +--source include/start_mysqld.inc + +--echo ¤ Wait until node_2 is back on cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +--connection node_2 +call mtr.add_suppression("Slave: Operation CREATE USER failed for "); +SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; + +--connection node_1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.gtid_slave_pos; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; + +--connection node_3 +SELECT COUNT(*) AS EXPECT_10000 FROM t1; + +# +# Cleanup +# +--connection node_2 +STOP SLAVE; +RESET SLAVE ALL; + +--connection node_3 +RESET MASTER; +drop table t1; + +--connection node_2 +DROP TABLE t1; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +--connection node_1 +--disconnect node_3 + +--source include/auto_increment_offset_restore.inc +--source include/galera_end.inc +--echo # End of test diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_restart_on_unknown_option.test 2024-08-03 07:29:58.000000000 +0000 @@ -62,7 +62,7 @@ --let $start_mysqld_params=--galera-unknown-option --echo Starting server ... ---exec echo "try:$start_mysqld_params" > $_expect_file_name +--write_line "try:$start_mysqld_params" $_expect_file_name # Sleep to ensure that server exited... @@ -107,7 +107,7 @@ --let $start_mysqld_params=--galera-unknown-option --echo Starting server ... ---exec echo "try:$start_mysqld_params" > $_expect_file_name +--write_line "try:$start_mysqld_params" $_expect_file_name # Sleep to ensure that server exited... @@ -125,7 +125,7 @@ # Sanity check (node 2 is running now and can perform SQL operators): -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); SELECT * FROM t1; --connection node_1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_restart_replica.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_restart_replica.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_restart_replica.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_restart_replica.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,9 +3,9 @@ # # The galera/galera_2node_slave.cnf describes the setup of the nodes # ---source include/big_test.inc --source include/force_restart.inc --source include/galera_cluster.inc +--source include/have_innodb.inc --source include/have_sequence.inc # As node #3 is not a Galera node, and galera_cluster.inc does not open connetion to it diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_sequence_engine.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_sequence_engine.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_sequence_engine.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_sequence_engine.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +--source include/galera_cluster.inc +--source include/have_sequence.inc + +SET GLOBAL wsrep_ignore_apply_errors=0; +SET SESSION AUTOCOMMIT=0; +SET SESSION max_error_count=0; +--error ER_NOT_SUPPORTED_YET +CREATE TABLE t0 (id GEOMETRY,parent_id GEOMETRY)ENGINE=SEQUENCE; + +--connection node_2 +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t0; + +--connection node_1 +SET GLOBAL wsrep_ignore_apply_errors=DEFAULT; + diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_shutdown_nonprim.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_shutdown_nonprim.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_shutdown_nonprim.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_shutdown_nonprim.test 2024-08-03 07:29:58.000000000 +0000 @@ -16,21 +16,27 @@ --connection node_2 # Isolate node_2 from the group and wait until wsrep_ready becomes OFF. -SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; SET SESSION wsrep_sync_wait = 0; ---let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 'OFF' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' +--source include/wait_condition.inc +SHOW STATUS LIKE 'wsrep_cluster_status'; # Verify that graceful shutdown succeeds. --source include/shutdown_mysqld.inc ---source include/start_mysqld.inc ---let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; ---source include/wait_condition.inc +--source include/start_mysqld.inc --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc # Restore original settings. SET GLOBAL wsrep_provider_options = 'pc.weight = 1'; + --source include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ssl_compression.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_ssl_compression.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ssl_compression.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ssl_compression.test 2024-08-03 07:29:58.000000000 +0000 @@ -31,5 +31,5 @@ --connection node_1 DROP TABLE t1; -CALL mtr.add_suppression("Unknown parameter 'socket\.ssl_compression'"); +CALL mtr.add_suppression("Unknown parameter 'socket\\.ssl_compression'"); CALL mtr.add_suppression("Set options returned 7"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_ssl_upgrade.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_ssl_upgrade.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_ssl_upgrade.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_ssl_upgrade.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,11 +8,6 @@ --source include/have_innodb.inc --source include/have_ssl_communication.inc ---connection node_1 -call mtr.add_suppression("WSREP: write_handler().*"); ---connection node_2 -call mtr.add_suppression("WSREP: write_handler():.*"); - # Save original auto_increment_offset values. --let $node_1=node_1 --let $node_2=node_2 @@ -77,7 +72,6 @@ --source include/auto_increment_offset_restore.inc --connection node_1 -call mtr.add_suppression("WSREP: write_handler().*"); +call mtr.add_suppression("WSREP: write_handler\\(\\)"); --connection node_2 -call mtr.add_suppression("WSREP: write_handler():.*"); - +call mtr.add_suppression("WSREP: write_handler\\(\\)"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf mariadb-10.11.9/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_sst_mariabackup.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -7,9 +7,14 @@ [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' +innodb_fast_shutdown=0 +innodb_undo_tablespaces=0 [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' +innodb_fast_shutdown=0 +innodb_undo_tablespaces=3 +innodb_log_file_buffering [sst] transferfmt=@ENV.MTR_GALERA_TFMT diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_sst_mariabackup.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_sst_mariabackup.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_sst_mariabackup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_sst_mariabackup.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,12 +8,39 @@ --let $node_2=node_2 --source include/auto_increment_offset_save.inc +--connection node_1 +select @@innodb_undo_tablespaces; + +--connection node_2 +select @@innodb_undo_tablespaces; + --source suite/galera/include/galera_st_shutdown_slave.inc --source suite/galera/include/galera_st_clean_slave.inc --source suite/galera/include/galera_st_kill_slave.inc --source suite/galera/include/galera_st_kill_slave_ddl.inc +--connection node_2 +--echo Shutting down server ... +--source include/shutdown_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--connection node_2 +--echo Starting server ... +--source include/start_mysqld.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--connection node_2 +select @@innodb_undo_tablespaces; + +call mtr.add_suppression("InnoDB: Cannot change innodb_undo_tablespaces=3 because previous shutdown was not with innodb_fast_shutdown=0"); + # Restore original auto_increment_offset values. --source include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_table_with_hyphen.inc mariadb-10.11.9/mysql-test/suite/galera/t/galera_table_with_hyphen.inc --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_table_with_hyphen.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_table_with_hyphen.inc 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,48 @@ +# +# parameters: +# $fk_child - child table name +# $fk_parent - parent table name +# +--connection node_1 +SET GLOBAL wsrep_slave_threads=2; + +--eval CREATE TABLE `$fk_parent` ( id INT AUTO_INCREMENT PRIMARY KEY, j INT) ENGINE=InnoDB + +--eval CREATE TABLE `$fk_child` (id INT AUTO_INCREMENT PRIMARY KEY, parent_id INT, j INT, FOREIGN KEY (parent_id) REFERENCES `$fk_parent`(id)) ENGINE=InnoDB + +--eval INSERT INTO `$fk_parent` VALUES (23,0) + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM `$fk_parent`; +--source include/wait_condition.inc + +--connection node_1a +SET GLOBAL DEBUG_DBUG='+d,wsrep_ha_write_row'; + +--connection node_2 +--eval INSERT INTO `$fk_child` VALUES (21,23,0),(22,23,0),(23,23,0) + +--connection node_1a +SET DEBUG_SYNC='now WAIT_FOR wsrep_ha_write_row_reached'; + +--let $wsrep_received_before = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_received'` + +--connection node_2 +--eval UPDATE `$fk_parent` SET j=2 WHERE id=23 + +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $wsrep_received_before + 1 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME = 'wsrep_received' +--source include/wait_condition.inc + +SET GLOBAL DEBUG_DBUG='-d,wsrep_ha_write_row'; +SET DEBUG_SYNC='now SIGNAL wsrep_ha_write_row_continue'; + +SET GLOBAL DEBUG_DBUG="RESET"; +SET DEBUG_SYNC = 'RESET'; + +SET GLOBAL wsrep_slave_threads=DEFAULT; + +--connection node_2 +--eval drop table `$fk_child` +--eval drop table `$fk_parent` + diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_table_with_hyphen.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_table_with_hyphen.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_table_with_hyphen.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_table_with_hyphen.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,34 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +# +# Testing how tables and databases with special characters +# are treated in certification +# +# The test creates two tables having foreign key constraint +# reference and executes two transactions which modify +# same rows. The same test is executed with different names +# containin special characters to see if the certification +# can detect the conflicts +# +# Actual test is in include file galera_table_with_hyphen.inc +# It create the test tables from parameters $fk_child and +# $fk_parent +# +--connection node_1 +set wsrep_sync_wait=0; + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +SET SESSION wsrep_sync_wait = 0; + +--let $fk_child = child +--let $fk_parent = par-ent + +--source galera_table_with_hyphen.inc + +--let $fk_child = c-hild +--let $fk_parent = p-arent- + +--source galera_table_with_hyphen.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_toi_ddl_error.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_toi_ddl_error.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_toi_ddl_error.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_toi_ddl_error.test 2024-08-03 07:29:58.000000000 +0000 @@ -28,7 +28,7 @@ DROP TABLE t1; DROP TABLE ten; -CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query."); +CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query\\."); --connection node_2 -CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query."); \ No newline at end of file +CALL mtr.add_suppression("Ignoring error 'Duplicate entry '111110' for key 'PRIMARY'' on query\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_ignore_apply_errors.test 2024-08-03 07:29:58.000000000 +0000 @@ -277,15 +277,14 @@ CREATE TABLE t1 (f1 INTEGER, f2 INTEGER); DROP TABLE t1; - --connection node_2 SET GLOBAL wsrep_ignore_apply_errors = 7; CALL mtr.add_suppression("Can't find record in 't.*'"); CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows event"); -CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test.t1'' on query. Default database: 'test'. Query: 'DROP TABLE t1', Error_code: 1051"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't drop database 's1'; database doesn't exist' on query. Default database: 'test'. Query: 'DROP SCHEMA s1', Error_code: 1008"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query. Default database: 'test'. Query: 'DROP INDEX idx1 ON t1', Error_code: 1091"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t1 DROP INDEX idx1', Error_code: 1091"); -CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'f2'; check that column/key exists' on query. Default database: 'test'. Query: 'ALTER TABLE t1 DROP COLUMN f2', Error_code: 1091"); -CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query."); +CALL mtr.add_suppression("Slave SQL: Error 'Unknown table 'test\\.t1'' on query\\. Default database: 'test'\\. Query: 'DROP TABLE t1', Error_code: 1051"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't drop database 's1'; database doesn't exist' on query\\. Default database: 'test'\\. Query: 'DROP SCHEMA s1', Error_code: 1008"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query\\. Default database: 'test'\\. Query: 'DROP INDEX idx1 ON t1', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'idx1'; check that column/key exists' on query\\. Default database: 'test'\\. Query: 'ALTER TABLE t1 DROP INDEX idx1', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'f2'; check that column/key exists' on query\\. Default database: 'test'\\. Query: 'ALTER TABLE t1 DROP COLUMN f2', Error_code: 1091"); +CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_node_address.cnf mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_node_address.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_node_address.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_node_address.cnf 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -!include ../galera_4nodes.cnf - -[mysqld.2] -wsrep_node_address=127.0.0.1 - -[mysqld.3] -wsrep_node_address=localhost - -[mysqld.4] -wsrep_node_address=lo diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_node_address.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_node_address.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_node_address.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_node_address.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -# -# Test wsrep_node_address . The galera_var_node_address.cnf contains various settings for -# wsrep_node_address, so in this test we simply confirm that the cluster has started up correctly. -# - ---source include/galera_cluster.inc ---source include/have_innodb.inc - -call mtr.add_suppression("WSREP: Stray state UUID msg: .*"); -call mtr.add_suppression("WSREP: Protocol violation. JOIN message sender .*"); -call mtr.add_suppression("WSREP: Sending JOIN failed: .*"); -flush tables; - ---let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; ---source include/wait_condition.inc - -SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; - ---connection node_1 -CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB; - ---connection node_2 -set global wsrep_sync_wait=15; -INSERT INTO t1 VALUES (1); - ---connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 ---connection node_3 -set global wsrep_sync_wait=15; -SELECT COUNT(*) FROM t1; - ---connection node_1 -DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_slave_threads.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_slave_threads.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_slave_threads.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_slave_threads.test 2024-08-03 07:29:58.000000000 +0000 @@ -19,7 +19,7 @@ CREATE TABLE t2 (f1 INT AUTO_INCREMENT PRIMARY KEY) Engine=InnoDB; --connection node_2 -CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread."); +CALL mtr.add_suppression("WSREP: Refusing exit for the last slave thread\\."); # Setting wsrep_slave_threads to zero triggers a warning SET GLOBAL wsrep_slave_threads = 0; SHOW WARNINGS; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_var_wsrep_start_position.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ --echo # wsrep_start_position --echo # -CALL mtr.add_suppression("WSREP: SST failed for position .*"); +CALL mtr.add_suppression("WSREP: SST failed for position "); SET @wsrep_start_position_global_saved = @@global.wsrep_start_position; --echo # default diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf mariadb-10.11.9/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -2,9 +2,3 @@ [mysqld] wsrep-ignore-apply-errors=0 - -[mysqld.3] -auto_increment_offset=3 - -[mysqld.4] -auto_increment_offset=4 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,25 +6,15 @@ --source include/galera_cluster.inc --source include/big_test.inc -# Save original auto_increment_offset values. ---let $node_1=node_1 ---let $node_2=node_2 ---source include/auto_increment_offset_save.inc -# The following has to be set hard as these connection doesn't yet exists and -# the auto_increment_offset value changes during the lifetime of the servers. ---let $node_3=node_3 ---let $auto_increment_offset_node_3 = 3; ---let $node_4=node_4 ---let $auto_increment_offset_node_4 = 4; - --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 +# Save original auto_increment_offset values. --let $node_1=node_1 --let $node_2=node_2 --let $node_3=node_3 --let $node_4=node_4 ---source suite/galera/include/auto_increment_offset_save.inc +--source include/auto_increment_offset_save.inc --connection node_3 # Isolate node #3 @@ -92,11 +82,12 @@ --connection node_3 SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group\\. Leaving cluster\\."); --connection node_4 SELECT COUNT(*) AS expect_0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; SELECT COUNT(*) AS expect_1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; -CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group. Leaving cluster."); +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on .* is inconsistent with group\\. Leaving cluster\\."); DROP TABLE t2; @@ -105,3 +96,6 @@ --let $node_4=node_4 --let $auto_increment_offset_node_4 = 4; --source suite/galera/include/auto_increment_offset_restore.inc + +--disconnect node_3 +--disconnect node_4 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_wan.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_wan.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_wan.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_wan.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,11 +9,10 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -CALL mtr.add_suppression("WSREP: Stray state UUID msg:.*"); -CALL mtr.add_suppression("WSREP: Sending JOIN failed:.*"); +CALL mtr.add_suppression("WSREP: Stray state UUID msg:"); +CALL mtr.add_suppression("Sending JOIN failed: "); +CALL mtr.add_suppression("WSREP: .* sending install message failed: Socket is not connected"); CALL mtr.add_suppression("There are no nodes in the same segment that will ever be able to become donors, yet there is a suitable donor outside"); -call mtr.add_suppression("WSREP: Sending JOIN failed:.*"); - SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; @@ -37,4 +36,3 @@ SELECT COUNT(*) = 1 FROM t1; DROP TABLE t1; - diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_wan_restart_sst.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_wan_restart_sst.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_wan_restart_sst.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_wan_restart_sst.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,6 +11,7 @@ --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/force_restart.inc --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 @@ -27,7 +28,7 @@ SELECT VARIABLE_VALUE AS EXPECT_4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --connection node_1 -CREATE TABLE t1 (f1 INTEGER); +CREATE TABLE t1 (f1 INTEGER NOT NULL PRIMARY KEY) ENGINE=INNODB; INSERT INTO t1 VALUES (1); --connection node_2 @@ -45,10 +46,20 @@ --connection node_3 INSERT INTO t1 VALUES (13); +--let $wait_condition = SELECT COUNT(*) = 5 FROM t1; +--source include/wait_condition.inc + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 5 FROM t1; +--source include/wait_condition.inc +--connection node_3 --source include/kill_galera.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.3/data/grastate.dat --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc INSERT INTO t1 VALUES (11); --connection node_2 @@ -62,6 +73,10 @@ INSERT INTO t1 VALUES (131); +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + # # Restart node #2 # @@ -69,9 +84,17 @@ --connection node_2 INSERT INTO t1 VALUES (22); +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 10 FROM t1; +--source include/wait_condition.inc + +--connection node_2 --source include/kill_galera.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc INSERT INTO t1 VALUES (21); --connection node_3 @@ -90,11 +113,21 @@ # --connection node_4 +--let $wait_condition = SELECT VARIABLE_VALUE = 4 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc INSERT INTO t1 VALUES (34); +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 15 FROM t1; +--source include/wait_condition.inc + +--connection node_4 --source include/kill_galera.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.4/data/grastate.dat --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc INSERT INTO t1 VALUES (31); --connection node_2 @@ -105,6 +138,7 @@ --connection node_4 --source include/start_mysqld.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.4/data/grastate.dat INSERT INTO t1 VALUES (341); diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_wsrep_new_cluster.test 2024-08-03 07:29:58.000000000 +0000 @@ -30,7 +30,7 @@ --echo Starting server ... --let $restart_noprint=2 ---let $start_mysqld_params="--wsrep-new-cluster" +--let $start_mysqld_params=--wsrep-new-cluster --source include/start_mysqld.inc --source include/wait_until_ready.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test mariadb-10.11.9/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test --- mariadb-10.11.6/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/galera_wsrep_provider_options_syntax.test 2024-08-03 07:29:58.000000000 +0000 @@ -5,7 +5,7 @@ --source include/have_innodb.inc --let LOGF=$MYSQLTEST_VARDIR/log/mysqld.1.err --disable_info -call mtr.add_suppression("WSREP\: Unknown parameter 'gmcasts\.segment'"); +call mtr.add_suppression("WSREP\: Unknown parameter 'gmcasts\\.segment'"); call mtr.add_suppression("WSREP\: Set options returned 7"); --error ER_WRONG_ARGUMENTS SET GLOBAL wsrep_provider_options="gmcasts.segment=1"; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/mdev-22063.test mariadb-10.11.9/mysql-test/suite/galera/t/mdev-22063.test --- mariadb-10.11.6/mysql-test/suite/galera/t/mdev-22063.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/mdev-22063.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,184 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/log_bin.inc +--source include/have_sequence.inc +--source include/have_aria.inc + +--echo # Case 1 CREATE SEQUENCE with no NOCACHE +--error ER_NOT_SUPPORTED_YET +CREATE SEQUENCE s ENGINE=InnoDB; +CREATE SEQUENCE s NOCACHE ENGINE=InnoDB; +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +START TRANSACTION; +REPLACE INTO s VALUES (1,1,9223372036854775806,1,1,1000,0,0); +OPTIMIZE TABLE t1; +SELECT * FROM t1; +SELECT * FROM s; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 's' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM test.s; +--source include/wait_condition.inc + +SELECT * FROM t1; +SELECT * FROM s; + +--connection node_1 +DROP TABLE t1; +DROP SEQUENCE s; + +--echo # Case 2 REPLACE INTO ... SELECT with error +CREATE TABLE t (id INT KEY,a YEAR,INDEX (id,a)) engine=innodb; +--error ER_WRONG_VALUE_COUNT_ON_ROW +REPLACE INTO t (id,a)SELECT /*!99997 */ 1; +REPLACE INTO t (id,a)SELECT /*!99997 */ 1,2; +SELECT * FROM t; + +CREATE TABLE t2 (id INT KEY,a YEAR,INDEX (id,a)) engine=myisam; +--error ER_WRONG_VALUE_COUNT_ON_ROW +REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1; +REPLACE INTO t2 (id,a)SELECT /*!99997 */ 1,2; +SELECT * FROM t2; + +CREATE TABLE t3 (id INT KEY,a YEAR,INDEX (id,a)) engine=aria; +--error ER_WRONG_VALUE_COUNT_ON_ROW +REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1; +REPLACE INTO t3 (id,a)SELECT /*!99997 */ 1,2; +SELECT * FROM t3; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't3' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t3; +--source include/wait_condition.inc + +SELECT * FROM t; +SELECT * FROM t2; +SELECT * FROM t3; + +--connection node_1 +DROP TABLE t,t2,t3; + +--echo # Bigger REPLACE ... AS SELECT test + +CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria; +CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria; + +INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000; + +REPLACE INTO t4 SELECT * FROM t1; +REPLACE INTO t5 SELECT * FROM t2; +REPLACE INTO t6 SELECT * FROM t3; +REPLACE INTO t7 SELECT * FROM t2; +REPLACE INTO t8 SELECT * FROM t3; + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +SELECT COUNT(*) AS EXPECT_1000 FROM t8; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 8 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME LIKE 't_' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1000 FROM test.t8; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +SELECT COUNT(*) AS EXPECT_1000 FROM t8; + +--connection node_1 +DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8; + +--echo # Bigger INSERT INTO ... SELECT test + +CREATE TABLE t1(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t2(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t3(id int not null primary key ,b int) ENGINE=Aria; +CREATE TABLE t4(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t5(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t6(id int not null primary key ,b int) ENGINE=InnoDB; +CREATE TABLE t7(id int not null primary key ,b int) ENGINE=MyISAM; +CREATE TABLE t8(id int not null primary key ,b int) ENGINE=Aria; + +INSERT INTO t1(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t2(id) SELECT seq FROM seq_1_to_1000; +INSERT INTO t3(id) SELECT seq FROM seq_1_to_1000; + +INSERT INTO t4 SELECT * FROM t1; +INSERT INTO t5 SELECT * FROM t2; +INSERT INTO t6 SELECT * FROM t3; +INSERT INTO t7 SELECT * FROM t2; +INSERT INTO t8 SELECT * FROM t3; + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +SELECT COUNT(*) AS EXPECT_1000 FROM t8; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 8 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME LIKE 't_' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1000 FROM test.t8; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_1000 FROM t1; +SELECT COUNT(*) AS EXPECT_1000 FROM t2; +SELECT COUNT(*) AS EXPECT_1000 FROM t3; +SELECT COUNT(*) AS EXPECT_1000 FROM t4; +SELECT COUNT(*) AS EXPECT_1000 FROM t5; +SELECT COUNT(*) AS EXPECT_1000 FROM t6; +SELECT COUNT(*) AS EXPECT_1000 FROM t7; +SELECT COUNT(*) AS EXPECT_1000 FROM t8; + +--connection node_1 +DROP TABLE t1,t2,t3,t4,t5,t6,t7,t8; +# +# View +# +CREATE TABLE t1(pk int not null primary key) engine=innodb; +INSERT INTO t1 values (1),(2),(3),(4); +CREATE VIEW view_t1 AS SELECT * FROM t1; +INSERT INTO view_t1 VALUES (5); +SELECT * FROM t1; +DROP TABLE t1; +DROP VIEW view_t1; +CREATE TABLE t1(pk int not null primary key) engine=myisam; +INSERT INTO t1 values (1),(2),(3),(4); +CREATE VIEW view_t1 AS SELECT * FROM t1; +INSERT INTO view_t1 VALUES (5); +SELECT * FROM t1; +DROP TABLE t1; +DROP VIEW view_t1; +CREATE TABLE t1(pk int not null primary key) engine=aria; +INSERT INTO t1 values (1),(2),(3),(4); +CREATE VIEW view_t1 AS SELECT * FROM t1; +INSERT INTO view_t1 VALUES (5); +SELECT * FROM t1; +DROP TABLE t1; +DROP VIEW view_t1; +SET GLOBAL wsrep_mode=DEFAULT; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/mdev-22543.test mariadb-10.11.9/mysql-test/suite/galera/t/mdev-22543.test --- mariadb-10.11.6/mysql-test/suite/galera/t/mdev-22543.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/mdev-22543.test 2024-08-03 07:29:58.000000000 +0000 @@ -36,7 +36,7 @@ # Restart without waiting. The UPDATE should block FTWRL on node_1, # so the SST cannot be completed and node_2 cannot join before # UPDATE connection is signalled to continue. ---exec echo "restart:$start_mysqld_params" > $_expect_file_name +--write_line "restart:$start_mysqld_params" $_expect_file_name # If the bug is present, FTWRL times out on node_1 in couple of # seconds and node_2 fails to join. --sleep 10 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/mdev-28433.test mariadb-10.11.9/mysql-test/suite/galera/t/mdev-28433.test --- mariadb-10.11.6/mysql-test/suite/galera/t/mdev-28433.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/mdev-28433.test 2024-08-03 07:29:58.000000000 +0000 @@ -26,7 +26,7 @@ --enable_query_log --source include/wait_until_connected_again.inc --source include/galera_wait_ready.inc -call mtr.add_suppression("WSREP: .*Invalid backend URI.*"); +call mtr.add_suppression("WSREP: .*Invalid backend URI"); call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument"); # Restore original auto_increment_offset values. diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/mdev-30013.test mariadb-10.11.9/mysql-test/suite/galera/t/mdev-30013.test --- mariadb-10.11.6/mysql-test/suite/galera/t/mdev-30013.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/mdev-30013.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,5 @@ --source include/galera_cluster.inc +--source include/force_restart.inc # ARCHIVE plugin must be uninstalled if (!$HA_ARCHIVE_SO) { skip Needs Archive loadable plugin; diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/mdev-31285.test mariadb-10.11.9/mysql-test/suite/galera/t/mdev-31285.test --- mariadb-10.11.6/mysql-test/suite/galera/t/mdev-31285.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/mdev-31285.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,34 +1,15 @@ --source include/galera_cluster.inc ---let $node_1 = node_1 ---let $node_2 = node_2 ---source include/auto_increment_offset_save.inc - --connection node_1 -CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i; -SHOW CREATE TABLE t; -SELECT * from t; -DROP TABLE IF EXISTS t; -COMMIT; - # -# Restart node_2, force SST because database is inconsistent compared to node_1 +# Below should not cause nodes to be inconsistent (they could if we +# allow TOI as some error are ignored on applier # ---connection node_2 -SET SESSION wsrep_sync_wait=0; ---source include/kill_galera.inc ---remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat ---echo Starting server ... -let $restart_noprint=2; ---source include/start_mysqld.inc ---let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; ---source include/wait_condition.inc - ---let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; ---source include/wait_condition.inc +--error ER_NOT_SUPPORTED_YET +CREATE TABLE t ENGINE=InnoDB WITH SYSTEM VERSIONING AS SELECT 1 AS i; --connection node_2 -call mtr.add_suppression("WSREP: Event .*Write_rows_v1 apply failed:.*"); -call mtr.add_suppression("SREP: Failed to apply write set: gtid:.*"); +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE t; + ---source include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/mdev-31651.test mariadb-10.11.9/mysql-test/suite/galera/t/mdev-31651.test --- mariadb-10.11.6/mysql-test/suite/galera/t/mdev-31651.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/mdev-31651.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,8 +1,7 @@ --source include/galera_cluster.inc - -call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not read field.*"); -call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not execute Write_rows_v1 event on table.*"); +call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not read field"); +call mtr.add_suppression("BINLOG_BASE64_EVENT: Could not execute Write_rows_v1 event on table"); CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b INT, KEY(b)) engine=innodb; BINLOG 'AMqaOw8BAAAAdAAAAHgAAAAAAAQANS42LjM0LTc5LjEtZGVidWctbG9nAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAYVx w2w='; --error ER_GET_ERRNO diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/mysql-wsrep#332.test mariadb-10.11.9/mysql-test/suite/galera/t/mysql-wsrep#332.test --- mariadb-10.11.6/mysql-test/suite/galera/t/mysql-wsrep#332.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/mysql-wsrep#332.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ --source include/have_debug_sync.inc --source include/galera_have_debug_sync.inc -# Open connection node_1a here, MW-369.inc will use it later +# Open connection node_1a here, will use it later --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 # @@ -27,7 +27,42 @@ --let $mw_369_parent_query = UPDATE p SET f1 = f1 + 100 --let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id) REFERENCES p(f1) ---source MW-369.inc +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; +--eval $mw_369_parent_query + +# +# Block the $mw_369_child_query from node_2 +# +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the +# delete on parent +# +--connection node_2 +--eval $mw_369_child_query + +# +# Wait until $mw_369_child_query from node_2 reaches the sync point and +# block the 'COMMIT' from node_1 before it certifies. +# +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc # Expect certification failure --connection node_1 @@ -62,7 +97,42 @@ --let $mw_369_parent_query = UPDATE p1 SET f1 = f1 + 100 --let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1) ---source MW-369.inc +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; +--eval $mw_369_parent_query + +# +# Block the $mw_369_child_query from node_2 +# +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the +# delete on parent +# +--connection node_2 +--eval $mw_369_child_query + +# +# Wait until $mw_369_child_query from node_2 reaches the sync point and +# block the 'COMMIT' from node_1 before it certifies. +# +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc # Expect certification failure --connection node_1 @@ -96,7 +166,42 @@ --let $mw_369_parent_query = UPDATE p2 SET f1 = f1 + 100 --let $mw_369_child_query = ALTER TABLE c ADD FOREIGN KEY (p_id1) REFERENCES p1(f1), ADD FOREIGN KEY (p_id2) REFERENCES p2(f1) ---source MW-369.inc +--connection node_1 +SET AUTOCOMMIT=ON; +START TRANSACTION; +--eval $mw_369_parent_query + +# +# Block the $mw_369_child_query from node_2 +# +# --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connection node_1a +SET SESSION wsrep_sync_wait = 0; +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# +# insert client row, which will make it impossible to replay the +# delete on parent +# +--connection node_2 +--eval $mw_369_child_query + +# +# Wait until $mw_369_child_query from node_2 reaches the sync point and +# block the 'COMMIT' from node_1 before it certifies. +# +--connection node_1a +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1a +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc # Expect certification failure --connection node_1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.cnf mariadb-10.11.9/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.cnf --- mariadb-10.11.6/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,10 @@ +!include ../galera_2nodes_as_master.cnf + +[mysqld.1] +innodb-log-file-buffering + +[mysqld.2] +innodb-log-file-buffering + +[mysqld.3] +innodb-log-file-buffering diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.test mariadb-10.11.9/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.test --- mariadb-10.11.6/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/rpl_galera_to_mariadb_clone_slave_using_mariadb-backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,9 @@ +--source include/have_innodb.inc +--source include/galera_cluster.inc + +--echo # +--echo # MDEV-33355 Add a Galera-2-node-to-MariaDB replication MTR test cloning the slave with mariadb-backup +--echo # + +--let cnf=galera2_to_mariadb +--source include/rpl_clone_slave_using_mariadb-backup.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera/t/versioning_trx_id.test mariadb-10.11.9/mysql-test/suite/galera/t/versioning_trx_id.test --- mariadb-10.11.6/mysql-test/suite/galera/t/versioning_trx_id.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera/t/versioning_trx_id.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ --source include/galera_cluster.inc -call mtr.add_suppression("Sending JOIN failed:.*"); +call mtr.add_suppression("Sending JOIN failed: "); --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 @@ -13,29 +13,29 @@ insert into t1 (a) values (3),(4); select a from t1; select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; -if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp`) { +if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp`) { select * from mysql.transaction_registry; } -select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +select count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp; --connection node_3 set session wsrep_sync_wait=15; insert into t1 (a) values (5),(6); select a from t1; select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; -if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp`) { +if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp`) { select * from mysql.transaction_registry; } -select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +select count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp; --connection node_1 set session wsrep_sync_wait=15; select a from t1; select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; -if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp`) { +if (`SELECT count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp`) { select * from mysql.transaction_registry; } -select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +select count(*) from mysql.transaction_registry where begin_timestamp>commit_timestamp; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/disabled.def mariadb-10.11.9/mysql-test/suite/galera_3nodes/disabled.def --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/disabled.def 2024-08-03 07:29:58.000000000 +0000 @@ -10,12 +10,12 @@ # ############################################################################## -galera_2_cluster : MDEV-29877 Galera test failure on galera_2_cluster -galera_gtid_2_cluster : MDEV-29877 Galera test failure on galera_2_cluster -galera_ipv6_mariabackup : MDEV-24097 -galera_ipv6_mariabackup_section : MDEV-24097, MDEV-22195 -galera_vote_rejoin_mysqldump : MDEV-24481: galera_3nodes.galera_vote_rejoin_mysqldump MTR failed: mysql_shutdown failed -galera_ssl_reload : MDEV-30172 At line 50: mysql_shutdown failed +galera_2_cluster : MDEV-32631 galera_2_cluster: before_rollback(): Assertion `0' failed +galera_gtid_2_cluster : MDEV-32633 galera_gtid_2_cluster: Assertion `thd->wsrep_next_trx_id() != (0x7fffffffffffffffLL * 2ULL + 1)' +galera_ssl_reload : MDEV-32778 galera_ssl_reload failed with warning message +galera_pc_bootstrap : temporarily disabled at the request of Codership +galera_ipv6_mariabackup_section : temporarily disabled at the request of Codership # Opensuse/suse/rocky9/rocky84/rhel9/rhel8-ppc64le .. - all same IPv6 isn't configured right or skipping or galera galera_ipv6_rsync : Can't connect to server on '::1' (115) galera_ipv6_rsync_section : Can't connect to server on '::1' (115) +GCF-354 : MDEV-25614 Galera test failure on GCF-354 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf mariadb-10.11.9/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/galera_2x3nodes.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -83,6 +83,9 @@ wsrep_node_incoming_address=127.0.0.1:@mysqld.6.port wsrep_sst_receive_address='127.0.0.1:@mysqld.6.#sst_port' +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + [ENV] NODE_MYPORT_1= @mysqld.1.port NODE_MYSOCK_1= @mysqld.1.socket diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/galera_3nodes.cnf mariadb-10.11.9/mysql-test/suite/galera_3nodes/galera_3nodes.cnf --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/galera_3nodes.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/galera_3nodes.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -46,6 +46,9 @@ wsrep_node_incoming_address=127.0.0.1:@mysqld.3.port wsrep_sst_receive_address='127.0.0.1:@mysqld.3.#sst_port' +[sst] +sst-log-archive-dir=@ENV.MYSQLTEST_VARDIR/log + [ENV] NODE_MYPORT_1= @mysqld.1.port NODE_MYSOCK_1= @mysqld.1.socket diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/include/galera_resume.inc mariadb-10.11.9/mysql-test/suite/galera_3nodes/include/galera_resume.inc --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/include/galera_resume.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/include/galera_resume.inc 2024-08-03 07:29:58.000000000 +0000 @@ -6,4 +6,3 @@ system("kill -SIGCONT $mysqld_pid"); exit(0); EOF - diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/GCF-354.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-354.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/GCF-354.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-354.result 2024-08-03 07:29:58.000000000 +0000 @@ -43,13 +43,13 @@ connection node_2; USE test; Node 2 synced -CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1049"); +CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query\\. Default database: 'test'\\. Query: 'CREATE TABLE test\\.t1 \\(f1 INTEGER\\)', Error_code: 1049"); CALL mtr.add_suppression("Query apply failed"); -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); connection node_3; Node 3 synced -CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1050"); +CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query\\. Default database: 'test'\\. Query: 'CREATE TABLE test\\.t1 \\(f1 INTEGER\\)', Error_code: 1050"); CALL mtr.add_suppression("Query apply failed"); -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/GCF-363.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-363.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/GCF-363.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-363.result 2024-08-03 07:29:58.000000000 +0000 @@ -37,13 +37,13 @@ 1 a DROP TABLE t1; connection node_1; -CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); +CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test\\.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno "); connection node_2; -CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); +CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test\\.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno "); connection node_3; -CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster."); +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on (.*) is inconsistent with group\\. Leaving cluster\\."); CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); connection node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/GCF-376.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-376.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/GCF-376.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/GCF-376.result 2024-08-03 07:29:58.000000000 +0000 @@ -86,6 +86,6 @@ connection node_2; CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos (.*), Error_code: 1062"); CALL mtr.add_suppression("WSREP: Event (.*) Write_rows_v1 apply failed: 121, seqno "); -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on (.*)"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); CALL mtr.add_suppression("WSREP: Failed to apply write set: "); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/MDEV-29171.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/MDEV-29171.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/MDEV-29171.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/MDEV-29171.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,28 +14,49 @@ @@wsrep_gtid_domain_id @@wsrep_node_name 100 node3 connection node_3; +connection node_1; connection node_2; connection node_1; connection node_1; # restart: --wsrep_new_cluster --wsrep_gtid_domain_id=200 +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +VARIABLE_VALUE +Primary +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE +Synced show variables like 'wsrep_gtid_domain_id'; Variable_name Value wsrep_gtid_domain_id 200 connection node_2; # restart +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +VARIABLE_VALUE +Primary +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE +Synced show variables like 'wsrep_gtid_domain_id'; Variable_name Value wsrep_gtid_domain_id 200 +connection node_1; connection node_3; # restart: --wsrep_sst_donor=node2 +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +VARIABLE_VALUE +Primary +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +VARIABLE_VALUE +Synced show variables like 'wsrep_gtid_domain_id'; Variable_name Value wsrep_gtid_domain_id 200 connection node_1; +connection node_1; set global wsrep_gtid_domain_id=100; connection node_2; set global wsrep_gtid_domain_id=100; -CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); connection node_3; set global wsrep_gtid_domain_id=100; -CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera-features#119.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera-features#119.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera-features#119.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera-features#119.result 2024-08-03 07:29:58.000000000 +0000 @@ -25,8 +25,8 @@ Killing server ... # restart connection node_2; -CALL mtr.add_suppression("Inconsistent by consensus."); -CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); +CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test\\.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST"); CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno"); -CALL mtr.add_suppression("WSREP: Node consistency compromized, leaving cluster..."); +CALL mtr.add_suppression("WSREP: Node consistency compromized, leaving cluster\\.\\.\\."); CALL mtr.add_suppression("WSREP: Failed to apply write set: "); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_allowlist.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_allowlist.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_allowlist.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_allowlist.result 2024-08-03 07:29:58.000000000 +0000 @@ -7,6 +7,9 @@ SELECT COUNT(*) = 3 FROM mysql.wsrep_allowlist; COUNT(*) = 3 1 +connection node_1; +connection node_2; +connection node_3; connection node_3; SET @@global.wsrep_desync = 1; SET SESSION wsrep_sync_wait = 0; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_duplicate_primary_value.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_duplicate_primary_value.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_duplicate_primary_value.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_duplicate_primary_value.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,68 @@ +connection node_2; +connection node_1; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1d, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connect node_1e, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1; +CREATE TABLE t1(a int not null primary key auto_increment, b int) engine=innodb; +INSERT INTO t1(b) VALUES (1); +connection node_1c; +begin; +insert into t1 values (2,2); +connection node_1d; +begin; +insert into t1 values (3,3); +connection node_1a; +SET GLOBAL DEBUG_DBUG='+d,wsrep_after_kill'; +connection node_2; +insert into t1 values (2,6); +connection node_1a; +SET SESSION wsrep_sync_wait=0; +SET DEBUG_SYNC='now WAIT_FOR wsrep_after_kill_reached'; +SET GLOBAL DEBUG_DBUG=''; +SET GLOBAL DEBUG_DBUG='+d,wsrep_after_kill_2'; +connection node_3; +insert into t1 values (3,9); +connection node_1a; +SET DEBUG_SYNC='now WAIT_FOR wsrep_after_kill_reached_2'; +SET GLOBAL DEBUG_DBUG=''; +SET DEBUG_SYNC='now SIGNAL wsrep_after_kill_continue'; +connection node_1c; +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_1a; +SET GLOBAL DEBUG_DBUG=''; +SET DEBUG_SYNC='now SIGNAL wsrep_after_kill_continue_2'; +connection node_1d; +COMMIT; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_2; +SELECT * from t1; +a b +1 1 +2 6 +3 9 +connection node_3; +SELECT * from t1; +a b +1 1 +2 6 +3 9 +connection node_1a; +SET DEBUG_SYNC = reset; +connection node_1e; +set debug_sync = reset; +connection node_1; +SELECT * from t1; +a b +1 1 +2 6 +3 9 +disconnect node_1a; +disconnect node_1b; +disconnect node_1c; +disconnect node_1d; +disconnect node_1e; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result 2024-08-03 07:29:58.000000000 +0000 @@ -29,7 +29,7 @@ connection node_3; Resuming node ... CALL mtr.add_suppression("WSREP: gcs_caused"); -CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg"); +CALL mtr.add_suppression("WSREP: gcs/src/gcs_core\\.cpp:core_handle_uuid_msg"); SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) FROM t1; COUNT(*) diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_garbd.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_garbd.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_garbd.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_garbd.result 2024-08-03 07:29:58.000000000 +0000 @@ -26,8 +26,8 @@ Restarting node #3 to satisfy MTR's end-of-test checks connection node_3; connection node_1; -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); connection node_2; -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); connection node_3; -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_garbd_backup.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_garbd_backup.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_garbd_backup.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_garbd_backup.result 2024-08-03 07:29:58.000000000 +0000 @@ -34,8 +34,8 @@ connection node_3; connection node_1; connection node_1; -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); connection node_2; -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); connection node_3; -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_gtid_2_cluster.result 2024-08-03 07:29:58.000000000 +0000 @@ -75,15 +75,15 @@ select @@gtid_binlog_state; @@gtid_binlog_state 1-11-2,2-21-1 -select * from t1; -cluster_domain_id node_server_id seq_no -1 11 2 -2 21 1 #wait for sync cluster 1 and 2 connection node_1; include/save_master_gtid.inc connection node_4; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +2 21 1 cluster 1 node 2 connection node_2; select @@gtid_binlog_state; @@ -98,6 +98,11 @@ include/save_master_gtid.inc connection node_4; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +2 21 1 cluster 1 node 3 connection node_3; select @@gtid_binlog_state; @@ -112,6 +117,12 @@ include/save_master_gtid.inc connection node_4; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 cluster 2 node 2 connection node_5; select @@gtid_binlog_state; @@ -126,6 +137,13 @@ include/save_master_gtid.inc connection node_1; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 cluster 2 node 3 connection node_6; select @@gtid_binlog_state; @@ -140,6 +158,63 @@ include/save_master_gtid.inc connection node_1; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +# check other nodes are consistent +connection node_2; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-4,2-21-3 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +connection node_3; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-4,2-21-3 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +connection node_5; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-4,2-21-3 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +connection node_6; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-4,2-21-3 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 cluster 1 node 1 connection node_1; select @@gtid_binlog_state; @@ -220,15 +295,15 @@ select @@gtid_binlog_state; @@gtid_binlog_state 1-11-7,2-21-4 -select * from t1; -cluster_domain_id node_server_id seq_no -1 11 2 -2 21 1 #wait for sync cluster 1 and 2 connection node_1; include/save_master_gtid.inc connection node_4; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +2 21 1 cluster 1 node 2 connection node_2; select @@gtid_binlog_state; @@ -243,6 +318,11 @@ include/save_master_gtid.inc connection node_4; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +2 21 1 cluster 1 node 3 connection node_3; select @@gtid_binlog_state; @@ -257,6 +337,12 @@ include/save_master_gtid.inc connection node_4; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 cluster 2 node 2 connection node_5; select @@gtid_binlog_state; @@ -271,6 +357,13 @@ include/save_master_gtid.inc connection node_1; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 cluster 2 node 3 connection node_6; select @@gtid_binlog_state; @@ -285,6 +378,63 @@ include/save_master_gtid.inc connection node_1; include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +# check other nodes are consistent +connection node_2; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-9,2-21-6 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +connection node_3; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-9,2-21-6 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +connection node_5; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-9,2-21-6 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 +connection node_6; +select @@gtid_binlog_state; +@@gtid_binlog_state +1-11-9,2-21-6 +select * from t1 order by 1, 2, 3; +cluster_domain_id node_server_id seq_no +1 11 2 +1 12 3 +1 13 4 +2 21 1 +2 22 2 +2 23 3 cluster 1 node 1 connection node_1; select @@gtid_binlog_state; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_gtid_consistency.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_gtid_consistency.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_gtid_consistency.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_gtid_consistency.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,220 @@ +connection node_2; +connection node_1; +connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2; +set wsrep_sync_wait=0; +connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1; +set wsrep_sync_wait=0; +connection node_1; +CREATE PROCEDURE insert_row (IN node varchar(10), IN repeat_count int) +BEGIN +DECLARE current_num int; +SET current_num = 0; +WHILE current_num < repeat_count do +INSERT INTO t1(node, name) VALUES (node, UUID()); +SET current_num = current_num + 1; +END WHILE; +END| +CREATE TABLE t1 (id bigint not null primary key auto_increment, node VARCHAR(10), name VARCHAR(64)) ENGINE=innodb; +# node_1 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2 +connection node_2; +# node_2 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2 +connection node_3; +# node_3 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2 +connection node_1; +CALL insert_row('node1', 500);; +connection node_2; +CALL insert_row('node2', 500);; +connection node_3; +CALL insert_row('node3', 500);; +connection node_2; +# Shutdown node_2, force SST +connection node_2b; +# Wait until node_2 leaves cluster +connection node_1b; +connection node_1; +connection node_3; +connection node_1; +CALL insert_row('node1', 500); +connection node_3; +CALL insert_row('node3', 500); +CREATE TABLE t2(i int primary key) engine=innodb; +connection node_2; +# Restart node_2 +# restart +connection node_1b; +# Wait until node_2 is back in cluster +# node2 has joined +# GTID in node1 +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2503 +connection node_2; +# GTID in node2 +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2503 +connection node_3; +# GTID in node3 +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2503 +# Shutdown node_3 +connection node_3; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; +# Wait until node_3 leaves cluster +connection node_1b; +connection node_1; +CALL insert_row('node1', 50); +CREATE TABLE t3(i int primary key) engine=innodb; +connection node_3; +# Rejoin node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; +connection node_1b; +# Wait until node_3 is back in cluster +# node3 has joined +connection node_1; +# GTID in node1 +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2554 +connection node_2; +# GTID in node2 +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2554 +connection node_3; +# GTID in node3 +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2554 +# One by one shutdown all nodes +connection node_3; +# shutdown node_3 +connection node_2; +# wait until node_3 is out of cluster +# shutdown node_2 +connection node_1; +# wait until node_2 is out of cluster +# shutdown node_1 +# Bootstrap from node_1 +connection node_1; +# restart: --wsrep_new_cluster +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2554 +ANALYZE TABLE t2; +Table Op Msg_type Msg_text +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status OK +CALL insert_row('node1', 100);; +# Restart node_2 +connection node_2; +# restart +connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1; +set wsrep_sync_wait=0; +connection node_1c; +# wait until node_1 and node_2 are in cluster +connection node_2; +ALTER TABLE t2 ADD COLUMN (k int); +CALL insert_row('node2', 100);; +# Restart node_3 +connection node_3; +# restart +connection node_1c; +# wait until all nodes are back in cluster +after cluster restart +connection node_2; +connection node_1; +connection node_1; +node1 GTID +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2756 +connection node_2; +node2 GTID +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2756 +connection node_3; +node3 GTID +show variables like 'wsrep_gtid_domain_id'; +Variable_name Value +wsrep_gtid_domain_id 1111 +show variables like '%gtid_binlog_pos%'; +Variable_name Value +gtid_binlog_pos 1111-1-2756 +connection node_1; +table size in node1 +SELECT COUNT(*) FROM t1; +COUNT(*) +2750 +connection node_2; +table size in node2 +SELECT COUNT(*) FROM t1; +COUNT(*) +2750 +connection node_3; +table size in node3 +SELECT COUNT(*) FROM t1; +COUNT(*) +2750 +connection node_2; +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node"); +call mtr.add_suppression("Sending JOIN failed: "); +call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST"); +call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration"); +connection node_3; +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node"); +call mtr.add_suppression("Sending JOIN failed: "); +call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST"); +call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration"); +# cleanup +connection node_1; +call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration"); +DROP PROCEDURE insert_row; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +connection node_3; +connection node_2; +disconnect node_3; +disconnect node_2b; +disconnect node_1b; +disconnect node_1c; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_ipv6_mysqldump.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,7 +1,7 @@ connection node_2; connection node_1; -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); connection node_1; connection node_2; connection node_3; @@ -35,6 +35,6 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); connection node_2; -CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled. Expect abort"); +CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled\\. Expect abort"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_ist_gcache_rollover.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_ist_gcache_rollover.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_ist_gcache_rollover.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_ist_gcache_rollover.result 2024-08-03 07:29:58.000000000 +0000 @@ -9,6 +9,7 @@ connection node_2; Unloading wsrep provider ... SET GLOBAL wsrep_cluster_address = ''; +connection node_1; connection node_3; Unloading wsrep provider ... SET GLOBAL wsrep_cluster_address = ''; @@ -33,14 +34,16 @@ SET GLOBAL wsrep_provider_options = 'signal=ist_sender_send_after_get_buffers'; INSERT INTO t1 VALUES (51), (52), (53), (54), (55); connection node_2; +connection node_1; connection node_3; +connection node_1; connection node_2; -SELECT COUNT(*) = 30 FROM t1; -COUNT(*) = 30 -1 -SELECT COUNT(*) = 3 FROM t2; -COUNT(*) = 3 -1 +SELECT COUNT(*) AS EXPECT_30 FROM t1; +EXPECT_30 +30 +SELECT COUNT(*) AS EXPECT_3 FROM t2; +EXPECT_3 +3 SELECT LENGTH(f1) = 512 * 1024 FROM t2; LENGTH(f1) = 512 * 1024 1 @@ -48,12 +51,12 @@ 1 CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); connection node_3; -SELECT COUNT(*) = 30 FROM t1; -COUNT(*) = 30 -1 -SELECT COUNT(*) = 3 FROM t2; -COUNT(*) = 3 -1 +SELECT COUNT(*) AS EXPECT_30 FROM t1; +EXPECT_30 +30 +SELECT COUNT(*) AS EXPECT_3 FROM t2; +EXPECT_3 +3 SELECT LENGTH(f1) = 512 * 1024 FROM t2; LENGTH(f1) = 512 * 1024 1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_A.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_A.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_A.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_A.result 2024-08-03 07:29:58.000000000 +0000 @@ -77,8 +77,8 @@ SET GLOBAL wsrep_provider_options = 'dbug='; connection node_1; DROP TABLE t1; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); connection node_2; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); connection node_3; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result 2024-08-03 07:29:58.000000000 +0000 @@ -87,8 +87,12 @@ SET GLOBAL wsrep_provider_options = 'dbug='; connection node_1; DROP TABLE t1; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); connection node_2; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); connection node_3; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); +disconnect node_1a; +disconnect node_3; +disconnect node_2; +disconnect node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result 2024-08-03 07:29:58.000000000 +0000 @@ -94,9 +94,9 @@ SET GLOBAL wsrep_provider_options = 'signal=after_shift_to_joining'; connection node_1; DROP TABLE t1; -call mtr.add_suppression("WSREP: Send action {\(.*\), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)"); -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Send action {(.*), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)"); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); connection node_2; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); connection node_3; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ connection node_2; connection node_1; -call mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\).*"); +call mtr.add_suppression("WSREP: gcs/src/gcs_core\\.cpp:core_handle_uuid_msg\\(\\)"); connection node_1; connection node_2; connection node_3; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_safe_to_bootstrap.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_safe_to_bootstrap.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_safe_to_bootstrap.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_safe_to_bootstrap.result 2024-08-03 07:29:58.000000000 +0000 @@ -43,10 +43,10 @@ CALL mtr.add_suppression("Failed to prepare for incremental state transfer"); CALL mtr.add_suppression("It may not be safe to bootstrap the cluster from this node"); CALL mtr.add_suppression("Aborting"); -CALL mtr.add_suppression("Plugin 'wsrep' init function returned error."); -CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed."); -CALL mtr.add_suppression("Failed to initialize plugins."); -CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg()"); +CALL mtr.add_suppression("Plugin 'wsrep' init function returned error\\."); +CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed\\."); +CALL mtr.add_suppression("Failed to initialize plugins\\."); +CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\)"); connection node_3; CALL mtr.add_suppression("WSREP: no nodes coming from prim view, prim not possible"); CALL mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node"); @@ -56,10 +56,10 @@ CALL mtr.add_suppression("Failed to prepare for incremental state transfer"); CALL mtr.add_suppression("It may not be safe to bootstrap the cluster from this node"); CALL mtr.add_suppression("Aborting"); -CALL mtr.add_suppression("Plugin 'wsrep' init function returned error."); -CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed."); -CALL mtr.add_suppression("Failed to initialize plugins."); -CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg()"); +CALL mtr.add_suppression("Plugin 'wsrep' init function returned error\\."); +CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed\\."); +CALL mtr.add_suppression("Failed to initialize plugins\\."); +CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\)"); SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_toi_vote.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_toi_vote.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_toi_vote.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_toi_vote.result 2024-08-03 07:29:58.000000000 +0000 @@ -19,4 +19,4 @@ connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; Killing server ... # restart -CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster."); +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on (.*) is inconsistent with group\\. Leaving cluster\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_var_node_address.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_var_node_address.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_var_node_address.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_var_node_address.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,22 @@ +connection node_2; +connection node_1; +connection node_1; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +VARIABLE_VALUE +3 +CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB; +connection node_2; +INSERT INTO t1 VALUES (1); +SELECT COUNT(*) AS EXPECT_1 FROM t1; +EXPECT_1 +1 +connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connection node_3; +SELECT COUNT(*) AS EXPECT_1 FROM t1; +EXPECT_1 +1 +connection node_1; +SELECT COUNT(*) AS EXPECT_1 FROM t1; +EXPECT_1 +1 +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_vote_rejoin_mysqldump.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_vote_rejoin_mysqldump.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/galera_vote_rejoin_mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/galera_vote_rejoin_mysqldump.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,8 +1,8 @@ connection node_2; connection node_1; Setting SST method to mysqldump ... -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); connection node_1; CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; @@ -39,6 +39,9 @@ expect_Disconnected Disconnected SET SESSION wsrep_on=ON; +SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +expect_3 +3 SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; expect_Primary Primary @@ -49,17 +52,11 @@ `f1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci connection node_2; -SET SESSION wsrep_on=OFF; -SET SESSION wsrep_on=ON; -# restart SHOW CREATE TABLE t1; Table Create Table t1 CREATE TABLE `t1` ( `f1` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci -SELECT COUNT(*) AS expect_0 FROM t1; -expect_0 -0 CALL mtr.add_suppression("is inconsistent with group"); connection node_3; SHOW CREATE TABLE t1; @@ -71,13 +68,16 @@ CALL mtr.add_suppression("Slave SQL: Error 'Can't DROP 'PRIMARY'; check that column/key exists'"); connection node_1; connection node_1; -CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); +CALL mtr.add_suppression("Slave SQL: Error 'The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); DROP USER sst; connection node_2; -CALL mtr.add_suppression("Slave SQL: Error 'The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); +CALL mtr.add_suppression("Slave SQL: Error 'The MariaDB server is running with the --skip-grant-tables option so it cannot execute this statement' on query"); CALL mtr.add_suppression("InnoDB: Error: Table \"mysql\"\\.\"innodb_index_stats\" not found"); CALL mtr.add_suppression("Can't open and lock time zone table"); CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); +connection node_2; +# restart +connection node_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/inconsistency_shutdown.result mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/inconsistency_shutdown.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/r/inconsistency_shutdown.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/r/inconsistency_shutdown.result 2024-08-03 07:29:58.000000000 +0000 @@ -135,8 +135,8 @@ SET GLOBAL wsrep_on=OFF; # restart DROP TABLE t1; -CALL mtr.add_suppression('Can\'t find record in \'t1\''); -CALL mtr.add_suppression('Update_rows_v1 apply failed'); -CALL mtr.add_suppression('Inconsistency detected: Inconsistent by consensus on'); -CALL mtr.add_suppression('last left .* greater than drain seqno'); -CALL mtr.add_suppression('WSREP: Failed to apply write set:'); +CALL mtr.add_suppression("Can't find record in 't1'"); +CALL mtr.add_suppression("Update_rows_v1 apply failed"); +CALL mtr.add_suppression("Inconsistency detected: Inconsistent by consensus on"); +CALL mtr.add_suppression("last left .* greater than drain seqno"); +CALL mtr.add_suppression("WSREP: Failed to apply write set: "); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/GCF-354.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-354.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/GCF-354.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-354.test 2024-08-03 07:29:58.000000000 +0000 @@ -88,18 +88,18 @@ --let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' --source include/wait_condition.inc --echo Node 2 synced -CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1049"); +CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query\\. Default database: 'test'\\. Query: 'CREATE TABLE test\\.t1 \\(f1 INTEGER\\)', Error_code: 1049"); CALL mtr.add_suppression("Query apply failed"); -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); --connection node_3 --let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' --source include/wait_condition.inc --echo Node 3 synced -CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query. Default database: 'test'. Query: 'CREATE TABLE test.t1 \\\(f1 INTEGER\\\)', Error_code: 1050"); +CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query\\. Default database: 'test'\\. Query: 'CREATE TABLE test\\.t1 \\(f1 INTEGER\\)', Error_code: 1050"); CALL mtr.add_suppression("Query apply failed"); -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); --source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/GCF-363.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-363.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/GCF-363.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-363.test 2024-08-03 07:29:58.000000000 +0000 @@ -60,15 +60,15 @@ DROP TABLE t1; --connection node_1 -CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); +CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test\\.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno "); --connection node_2 -CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); +CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test\\.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 155, Error_code: 1062"); CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno "); --connection node_3 -CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster."); +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on (.*) is inconsistent with group\\. Leaving cluster\\."); CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/GCF-376.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-376.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/GCF-376.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/GCF-376.test 2024-08-03 07:29:58.000000000 +0000 @@ -113,6 +113,6 @@ --connection node_2 CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos (.*), Error_code: 1062"); CALL mtr.add_suppression("WSREP: Event (.*) Write_rows_v1 apply failed: 121, seqno "); -CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on (.*)"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); CALL mtr.add_suppression("WSREP: Failed to apply write set: "); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/MDEV-29171.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/MDEV-29171.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/MDEV-29171.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/MDEV-29171.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,11 +4,13 @@ # --source include/galera_cluster.inc ---source include/have_innodb.inc +--source include/galera_sst_method.inc +--source include/force_restart.inc # # Initially wsrep gtid domain id is 100 # + --connection node_1 select @@wsrep_gtid_domain_id,@@wsrep_node_name; @@ -26,6 +28,10 @@ --connection node_3 --source include/shutdown_mysqld.inc +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + --connection node_2 --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc @@ -36,6 +42,7 @@ --source include/wait_condition.inc --source include/shutdown_mysqld.inc +--sleep 5 # # Bootstrap from node_1 and change wsrep_gtid_domain_id to 200 @@ -43,30 +50,66 @@ --connection node_1 --let $restart_parameters = --wsrep_new_cluster --wsrep_gtid_domain_id=200 --source include/start_mysqld.inc -show variables like 'wsrep_gtid_domain_id'; +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment' +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +show variables like 'wsrep_gtid_domain_id'; # # Restart node_2, expect that wsrep_gtid_domain_id has changed to 200 # --connection node_2 ---let $restart_parameters = +--let $restart_parameters = --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment' +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; show variables like 'wsrep_gtid_domain_id'; +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc # # Restart node_3, select node_2 as donor # If bug is present, node_3 remains on domain id 100 # --connection node_3 ---let $restart_parameters = --wsrep_sst_donor="node2" +--let $restart_parameters = --wsrep_sst_donor=node2 --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.3.expect --source include/start_mysqld.inc + +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment' +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; + # Expect domain id 200 show variables like 'wsrep_gtid_domain_id'; +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc # # Cleanup @@ -76,8 +119,8 @@ --connection node_2 set global wsrep_gtid_domain_id=100; -CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); --connection node_3 set global wsrep_gtid_domain_id=100; -CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +CALL mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera-features#119.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera-features#119.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera-features#119.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera-features#119.test 2024-08-03 07:29:58.000000000 +0000 @@ -60,13 +60,12 @@ --source include/start_mysqld.inc --connection node_2 -CALL mtr.add_suppression("Inconsistent by consensus."); -CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST"); +CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); +CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table test\\.t1; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST"); CALL mtr.add_suppression("WSREP: Event 3 Write_rows_v1 apply failed: 121, seqno"); -CALL mtr.add_suppression("WSREP: Node consistency compromized, leaving cluster..."); +CALL mtr.add_suppression("WSREP: Node consistency compromized, leaving cluster\\.\\.\\."); CALL mtr.add_suppression("WSREP: Failed to apply write set: "); # Restore original auto_increment_offset values. --source ../galera/include/auto_increment_offset_restore.inc - diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_allowlist.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_allowlist.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_allowlist.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_allowlist.test 2024-08-03 07:29:58.000000000 +0000 @@ -12,6 +12,12 @@ --let $galera_server_number = 3 --source include/galera_connect.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--let $node_3=node_3 +--source ../galera/include/auto_increment_offset_save.inc + --connection node_3 # Desync and disconnect node 3 from the PC: SET @@global.wsrep_desync = 1; @@ -64,3 +70,6 @@ --connection node_3 CALL mtr.add_suppression('WSREP: Ignoring lack of quorum'); + +# Restore original auto_increment_offset values. +--source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.cnf mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.cnf --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,19 @@ +!include ../galera_3nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER +loose-wsrep-duplicate-primary-value=1 +wsrep-auto-increment-control=OFF +auto-increment-offset=1 + +[mysqld.2] +wsrep-debug=SERVER +loose-wsrep-duplicate-primary-value=1 +wsrep-auto-increment-control=OFF +auto-increment-offset=1 + +[mysqld.3] +wsrep-debug=SERVER +loose-wsrep-duplicate-primary-value=1 +wsrep-auto-increment-control=OFF +auto-increment-offset=1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_duplicate_primary_value.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,81 @@ +--source include/galera_cluster.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/big_test.inc + +--let $galera_connection_name = node_3 +--let $galera_server_number = 3 +--source include/galera_connect.inc + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1d, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--connect node_1e, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +--connection node_1 +CREATE TABLE t1(a int not null primary key auto_increment, b int) engine=innodb; +INSERT INTO t1(b) VALUES (1); + +--connection node_1c +begin; +insert into t1 values (2,2); + +--connection node_1d +begin; +insert into t1 values (3,3); + +--connection node_1a +SET GLOBAL DEBUG_DBUG='+d,wsrep_after_kill'; + +--connection node_2 +insert into t1 values (2,6); + +--connection node_1a +SET SESSION wsrep_sync_wait=0; +SET DEBUG_SYNC='now WAIT_FOR wsrep_after_kill_reached'; +SET GLOBAL DEBUG_DBUG=''; +SET GLOBAL DEBUG_DBUG='+d,wsrep_after_kill_2'; + +--connection node_3 +insert into t1 values (3,9); + +--connection node_1a +SET DEBUG_SYNC='now WAIT_FOR wsrep_after_kill_reached_2'; +SET GLOBAL DEBUG_DBUG=''; +SET DEBUG_SYNC='now SIGNAL wsrep_after_kill_continue'; + +--connection node_1c +--error 1213 +COMMIT; + +--connection node_1a +SET GLOBAL DEBUG_DBUG=''; +SET DEBUG_SYNC='now SIGNAL wsrep_after_kill_continue_2'; + +--connection node_1d +--error 1213 +COMMIT; + +--connection node_2 +SELECT * from t1; + +--connection node_3 +SELECT * from t1; + +--connection node_1a +SET DEBUG_SYNC = reset; + +--connection node_1e +set debug_sync = reset; + +--connection node_1 +SELECT * from t1; + +--disconnect node_1a +--disconnect node_1b +--disconnect node_1c +--disconnect node_1d +--disconnect node_1e + +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test 2024-08-03 07:29:58.000000000 +0000 @@ -72,7 +72,7 @@ --source include/galera_wait_ready.inc CALL mtr.add_suppression("WSREP: gcs_caused"); -CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg"); +CALL mtr.add_suppression("WSREP: gcs/src/gcs_core\\.cpp:core_handle_uuid_msg"); SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) FROM t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_garbd.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_garbd.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_garbd.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_garbd.test 2024-08-03 07:29:58.000000000 +0000 @@ -81,10 +81,10 @@ # Workaround for galera#101 --connection node_1 -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); --connection node_2 -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); --connection node_3 -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_garbd_backup.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_garbd_backup.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_garbd_backup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_garbd_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -127,10 +127,10 @@ --source ../galera/include/auto_increment_offset_restore.inc --connection node_1 -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); --connection node_2 -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); --connection node_3 -CALL mtr.add_suppression("WSREP: Protocol violation\. JOIN message sender 1\.0 \(.*\) is not in state transfer \(SYNCED\)"); +CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender 1\\.0 (.*) is not in state transfer \\(SYNCED\\)"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -9,11 +9,11 @@ [mysqld.2] wsrep_gtid_domain_id=1 -server-id=12 +server-id=11 [mysqld.3] wsrep_gtid_domain_id=1 -server-id=13 +server-id=11 [mysqld.4] wsrep_gtid_domain_id=2 @@ -21,8 +21,8 @@ [mysqld.5] wsrep_gtid_domain_id=2 -server-id=22 +server-id=21 [mysqld.6] wsrep_gtid_domain_id=2 -server-id=23 +server-id=21 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_2_cluster.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,6 +11,7 @@ --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/force_restart.inc --connection node_1 --echo cluster 1 node 1 @@ -75,12 +76,12 @@ select @@gtid_binlog_state; insert into t1 values (2, 21, 1); select @@gtid_binlog_state; -select * from t1; --echo #wait for sync cluster 1 and 2 --connection node_1 --source include/save_master_gtid.inc --connection node_4 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 1 node 2 @@ -94,6 +95,7 @@ --source include/save_master_gtid.inc --connection node_4 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 1 node 3 --connection node_3 @@ -106,6 +108,7 @@ --source include/save_master_gtid.inc --connection node_4 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 2 node 2 --connection node_5 @@ -118,6 +121,7 @@ --source include/save_master_gtid.inc --connection node_1 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 2 node 3 --connection node_6 @@ -130,7 +134,21 @@ --source include/save_master_gtid.inc --connection node_1 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +--echo # check other nodes are consistent +--connection node_2 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; +--connection node_3 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; +--connection node_5 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; +--connection node_6 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; --echo cluster 1 node 1 --connection node_1 @@ -226,13 +244,13 @@ --connection node_4 insert into t1 values (2, 21, 1); select @@gtid_binlog_state; -select * from t1; --echo #wait for sync cluster 1 and 2 --connection node_1 --source include/save_master_gtid.inc --connection node_4 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 1 node 2 @@ -246,6 +264,7 @@ --source include/save_master_gtid.inc --connection node_4 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 1 node 3 --connection node_3 @@ -258,6 +277,7 @@ --source include/save_master_gtid.inc --connection node_4 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 2 node 2 --connection node_5 @@ -270,6 +290,7 @@ --source include/save_master_gtid.inc --connection node_1 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; --echo cluster 2 node 3 --connection node_6 @@ -282,7 +303,21 @@ --source include/save_master_gtid.inc --connection node_1 --source include/sync_with_master_gtid.inc +select * from t1 order by 1, 2, 3; +--echo # check other nodes are consistent +--connection node_2 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; +--connection node_3 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; +--connection node_5 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; +--connection node_6 +select @@gtid_binlog_state; +select * from t1 order by 1, 2, 3; --echo cluster 1 node 1 --connection node_1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,38 @@ +!include ../galera_3nodes.cnf + +[mysqld.1] +wsrep-node-name="node1" +wsrep_gtid_domain_id=1111 +gtid_domain_id=2 +server_id=10999 +wsrep_sst_auth="root:" +wsrep_sst_method=mariabackup +log_slave_updates=ON +log_bin=mariadb-bin-log +binlog-format=row +wsrep-gtid-mode=ON + +[mysqld.2] +wsrep-node-name="node2" +wsrep_gtid_domain_id=1112 +gtid_domain_id=3 +wsrep_sst_auth="root:" +wsrep_sst_method=mariabackup +log_slave_updates=ON +log_bin=mariadb-bin-log +binlog-format=row +wsrep-gtid-mode=ON + +[mysqld.3] +wsrep-node-name="node3" +wsrep_gtid_domain_id=1113 +gtid_domain_id=4 +wsrep_sst_auth="root:" +wsrep_sst_method=mariabackup +log_slave_updates=ON +log_bin=mariadb-bin-log +binlog-format=row +wsrep-gtid-mode=ON + +[sst] +transferfmt=@ENV.MTR_GALERA_TFMT diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_gtid_consistency.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,347 @@ +--source include/galera_cluster.inc +--source include/big_test.inc +--source include/force_restart.inc + + +# +# Testing gtid consistency in 3 node cluster when nodes drop +# and join back to cluster. +# The tests verify that wsrep_gtid_domain_id and gtid_binlog_pos +# remains same across the cluster +# In the configuration, nodes have different wsrep_gtid_domain_id +# but all nodes are supposed to receive effective domain id +# from the bootstrap node (node_1), and use it +# +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +set wsrep_sync_wait=0; +--connect node_1b, 127.0.0.1, root, , test, $NODE_MYPORT_1 +set wsrep_sync_wait=0; + +--connection node_1 +DELIMITER |; +CREATE PROCEDURE insert_row (IN node varchar(10), IN repeat_count int) +BEGIN + DECLARE current_num int; + SET current_num = 0; + WHILE current_num < repeat_count do + INSERT INTO t1(node, name) VALUES (node, UUID()); + SET current_num = current_num + 1; + END WHILE; +END| +DELIMITER ;| + +CREATE TABLE t1 (id bigint not null primary key auto_increment, node VARCHAR(10), name VARCHAR(64)) ENGINE=innodb; + +# +# report initial gtid positions after table t1 is created +# +--echo # node_1 +show variables like '%gtid_binlog_pos%'; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +--echo # node_2 +show variables like '%gtid_binlog_pos%'; + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +--echo # node_3 +show variables like '%gtid_binlog_pos%'; + +########################################### +# scenario: join node 2 by SST +########################################## + +# +# start concurrent insert load and stop node2 while the load is on +# +--connection node_1 +--send CALL insert_row('node1', 500); + +--connection node_2 +--send CALL insert_row('node2', 500); + +--connection node_3 +--send CALL insert_row('node3', 500); + +# +# stop load to node 2 and shutdown the node, force SST +# +--connection node_2 +--reap + +--echo # Shutdown node_2, force SST +--connection node_2b +--source include/shutdown_mysqld.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--echo # Wait until node_2 leaves cluster +--connection node_1b +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# +# stop the remaining load to node 1 and 3 +# +--connection node_1 +--reap +--connection node_3 +--reap + +# +# some more inserts and DDL to nodes 1 and 3 +# while node 2 is absent +# +--connection node_1 +CALL insert_row('node1', 500); + +--connection node_3 +CALL insert_row('node3', 500); + +CREATE TABLE t2(i int primary key) engine=innodb; + +# +# restart node 2, should join by SST +# +--connection node_2 +--echo # Restart node_2 +--source include/start_mysqld.inc + +--connection node_1b +--echo # Wait until node_2 is back in cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--echo # node2 has joined + +# +# check gtid positions in all nodes +# +--echo # GTID in node1 +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +--connection node_2 +--echo # GTID in node2 +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +--connection node_3 +--echo # GTID in node3 +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + + +########################################### +# scenario: join node 3 by IST +########################################## + +--echo # Shutdown node_3 +--connection node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; + +--echo # Wait until node_3 leaves cluster +--connection node_1b +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +# +# do some inserts and DDL to node 1 +# while node 3 is absent +# +--connection node_1 +CALL insert_row('node1', 50); + +CREATE TABLE t3(i int primary key) engine=innodb; + +# +# remove isolation in node 3, should join by IST +# +--connection node_3 +--echo # Rejoin node_3 +SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; + +--connection node_1b +--echo # Wait until node_3 is back in cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--echo # node3 has joined + +# +# check gtid positions in all nodes +# +--connection node_1 +--echo # GTID in node1 +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +--connection node_2 +--echo # GTID in node2 +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +--connection node_3 +--echo # GTID in node3 +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + + +########################################### +# scenario: restart full custer +########################################## + + +# +# stop all nodes, one by one +# +--echo # One by one shutdown all nodes +--connection node_3 +--echo # shutdown node_3 +--source include/shutdown_mysqld.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.3/data/grastate.dat + +--connection node_2 +--echo # wait until node_3 is out of cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--echo # shutdown node_2 +--source include/shutdown_mysqld.inc +--remove_file $MYSQLTEST_VARDIR/mysqld.2/data/grastate.dat + +--connection node_1 +--echo # wait until node_2 is out of cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--echo # shutdown node_1 +--source include/shutdown_mysqld.inc + +# +# bootstap cluster in order node1 - node2 - node3 +# send some inserts and DDL after each node started +# +--sleep 5 +--echo # Bootstrap from node_1 +--connection node_1 +--let $restart_parameters = --wsrep_new_cluster +--source include/start_mysqld.inc + +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +ANALYZE TABLE t2; +--send CALL insert_row('node1', 100); + +--echo # Restart node_2 +--connection node_2 +--let $restart_parameters = +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--source include/start_mysqld.inc + +# +# connection node_1b may not be functional anymore, after node was +# shutdown, open node_1c for controlling node 1 state +# +--connect node_1c, 127.0.0.1, root, , test, $NODE_MYPORT_1 +set wsrep_sync_wait=0; +--connection node_1c +--echo # wait until node_1 and node_2 are in cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 +ALTER TABLE t2 ADD COLUMN (k int); +--send CALL insert_row('node2', 100); + + +--echo # Restart node_3 +--connection node_3 +--let $restart_parameters = +--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.3.expect +--source include/start_mysqld.inc + +--connection node_1c +--echo # wait until all nodes are back in cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--echo after cluster restart + +# stop load for nodes 1 and 2 +--connection node_2 +--reap + +--connection node_1 +--reap + +# +# check gtid positions in all nodes +# +--connection node_1 +--echo node1 GTID +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +--connection node_2 +--echo node2 GTID +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +--connection node_3 +--echo node3 GTID +show variables like 'wsrep_gtid_domain_id'; +show variables like '%gtid_binlog_pos%'; + +# +# check table size in all nodes +# +--connection node_1 +--echo table size in node1 +SELECT COUNT(*) FROM t1; + +--connection node_2 +--echo table size in node2 +SELECT COUNT(*) FROM t1; + +--connection node_3 +--echo table size in node3 +SELECT COUNT(*) FROM t1; + +# +# cleanups +# +--connection node_2 +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node"); +call mtr.add_suppression("Sending JOIN failed: "); +call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST"); +call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration"); +--connection node_3 +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node"); +call mtr.add_suppression("Sending JOIN failed: "); +call mtr.add_suppression("WSREP: Failed to JOIN the cluster after SST"); +call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration"); + +--echo # cleanup +--connection node_1 +call mtr.add_suppression("WSREP: FLOW message from member .* in non-primary configuration"); + +DROP PROCEDURE insert_row; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; + +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2' +--source include/wait_condition.inc +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 0 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2' +--source include/wait_condition.inc + +--disconnect node_3 +--disconnect node_2b +--disconnect node_1b +--disconnect node_1c diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,8 +3,8 @@ --source include/check_ipv6.inc --source include/force_restart.inc -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); --let $galera_connection_name = node_3 --let $galera_server_number = 3 @@ -86,8 +86,9 @@ --source ../galera/include/auto_increment_offset_restore.inc --source suite/galera/include/galera_sst_restore.inc + --connection node_2 -CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled. Expect abort"); +CALL mtr.add_suppression("Unsupported protocol downgrade: incremental data collection disabled\\. Expect abort"); # Restore original auto_increment_offset values. --source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.cnf mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.cnf --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -2,10 +2,22 @@ [mysqld.1] wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M' +auto_increment_increment=1 +auto_increment_offset=1 +# this will force server restarts before this test +loose-galera-ist-gcache-rollover=1 +wsrep-debug=1 [mysqld.2] wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M' +auto_increment_increment=2 +auto_increment_offset=2 +loose-galera-ist-gcache-rollover=2 +wsrep-debug=1 [mysqld.3] wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.3.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.ignore_sb=true;gcache.size=1M' - +auto_increment_increment=3 +auto_increment_offset=3 +loose-galera-ist-gcache-rollover=3 +wsrep-debug=1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_ist_gcache_rollover.test 2024-08-03 07:29:58.000000000 +0000 @@ -12,6 +12,7 @@ --source include/have_innodb.inc --source include/have_debug_sync.inc --source include/galera_have_debug_sync.inc +--source include/force_restart.inc --let $galera_connection_name = node_3 --let $galera_server_number = 3 @@ -24,6 +25,9 @@ --source ../galera/include/auto_increment_offset_save.inc --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--let $wait_condition_on_error_output = SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME LIKE 'wsrep%'; show processlist +--source include/wait_condition_with_debug.inc CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); INSERT INTO t1 VALUES (01), (02), (03), (04), (05); @@ -32,12 +36,15 @@ --let $wsrep_cluster_address_orig2 = `select @@wsrep_cluster_address` --source suite/galera/include/galera_stop_replication.inc +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + --connection node_3 --let $wsrep_cluster_address_orig3 = `select @@wsrep_cluster_address` --source suite/galera/include/galera_stop_replication.inc --connection node_1 ---source include/wait_until_connected_again.inc INSERT INTO t1 VALUES (11), (12), (13), (14), (15); # Wait until nodes #2 and #3 have left @@ -88,29 +95,39 @@ --connection node_2 --source include/wait_until_connected_again.inc +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 OR VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + --connection node_3 --source include/wait_until_connected_again.inc -sleep 5; +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc # Final checks --connection node_2 -SELECT COUNT(*) = 30 FROM t1; -SELECT COUNT(*) = 3 FROM t2; +--let $wait_condition = SELECT COUNT(*) = 30 FROM t1 +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_30 FROM t1; +SELECT COUNT(*) AS EXPECT_3 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2; CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); # Final checks --connection node_3 -SELECT COUNT(*) = 30 FROM t1; -SELECT COUNT(*) = 3 FROM t2; +--let $wait_condition = SELECT COUNT(*) = 30 FROM t1 +--source include/wait_condition.inc +SELECT COUNT(*) AS EXPECT_30 FROM t1; +SELECT COUNT(*) AS EXPECT_3 FROM t2; SELECT LENGTH(f1) = 512 * 1024 FROM t2; CALL mtr.add_suppression("WSREP: Unsupported protocol downgrade: incremental data collection disabled"); DROP TABLE t1, t2; # Restore original auto_increment_offset values. ---source ../galera/include/auto_increment_offset_restore.inc - --let $galera_cluster_size=3 +--source ../galera/include/auto_increment_offset_restore.inc --source include/galera_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_A.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_A.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_A.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_A.test 2024-08-03 07:29:58.000000000 +0000 @@ -259,12 +259,12 @@ DROP TABLE t1; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --connection node_2 -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --connection node_3 -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test 2024-08-03 07:29:58.000000000 +0000 @@ -270,12 +270,17 @@ DROP TABLE t1; -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --connection node_2 -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --connection node_3 -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); +--disconnect node_1a + +# Restore original auto_increment_offset values. +--let $galera_cluster_size=3 --source ../galera/include/auto_increment_offset_restore.inc +--source include/galera_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test 2024-08-03 07:29:58.000000000 +0000 @@ -295,13 +295,13 @@ DROP TABLE t1; -call mtr.add_suppression("WSREP: Send action {\(.*\), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)"); -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Send action {(.*), STATE_REQUEST} returned -107 \\(Transport endpoint is not connected\\)"); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --connection node_2 -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --connection node_3 -call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); +call mtr.add_suppression("WSREP: Rejecting JOIN message from (.*): new State Transfer required\\."); --source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test 2024-08-03 07:29:58.000000000 +0000 @@ -5,7 +5,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -call mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\).*"); +call mtr.add_suppression("WSREP: gcs/src/gcs_core\\.cpp:core_handle_uuid_msg\\(\\)"); # # Create connection node_3 and save auto increment variables. diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_safe_to_bootstrap.test 2024-08-03 07:29:58.000000000 +0000 @@ -191,10 +191,10 @@ CALL mtr.add_suppression("Failed to prepare for incremental state transfer"); CALL mtr.add_suppression("It may not be safe to bootstrap the cluster from this node"); CALL mtr.add_suppression("Aborting"); -CALL mtr.add_suppression("Plugin 'wsrep' init function returned error."); -CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed."); -CALL mtr.add_suppression("Failed to initialize plugins."); -CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg()"); +CALL mtr.add_suppression("Plugin 'wsrep' init function returned error\\."); +CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed\\."); +CALL mtr.add_suppression("Failed to initialize plugins\\."); +CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\)"); --connection node_3 CALL mtr.add_suppression("WSREP: no nodes coming from prim view, prim not possible"); @@ -205,10 +205,10 @@ CALL mtr.add_suppression("Failed to prepare for incremental state transfer"); CALL mtr.add_suppression("It may not be safe to bootstrap the cluster from this node"); CALL mtr.add_suppression("Aborting"); -CALL mtr.add_suppression("Plugin 'wsrep' init function returned error."); -CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed."); -CALL mtr.add_suppression("Failed to initialize plugins."); -CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg()"); +CALL mtr.add_suppression("Plugin 'wsrep' init function returned error\\."); +CALL mtr.add_suppression("Plugin 'wsrep' registration as a STORAGE ENGINE failed\\."); +CALL mtr.add_suppression("Failed to initialize plugins\\."); +CALL mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\)"); SHOW CREATE TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_toi_vote.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_toi_vote.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_toi_vote.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_toi_vote.test 2024-08-03 07:29:58.000000000 +0000 @@ -61,7 +61,7 @@ --let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' --source include/wait_condition.inc -CALL mtr.add_suppression("WSREP: Vote 0 \\\(success\\\) on (.*) is inconsistent with group. Leaving cluster."); +CALL mtr.add_suppression("WSREP: Vote 0 \\(success\\) on (.*) is inconsistent with group\\. Leaving cluster\\."); # Restore original auto_increment_offset values. --source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_var_node_address.cnf mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_var_node_address.cnf --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_var_node_address.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_var_node_address.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,7 @@ +!include ../galera_3nodes.cnf + +[mysqld.2] +wsrep_node_address=127.0.0.1 + +[mysqld.3] +wsrep_node_address=localhost diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_var_node_address.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_var_node_address.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_var_node_address.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_var_node_address.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,32 @@ +# +# Test wsrep_node_address . The galera_var_node_address.cnf contains various settings for +# wsrep_node_address, so in this test we simply confirm that the cluster has started up correctly. +# + +--source include/galera_cluster.inc +--source include/have_innodb.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; + +CREATE TABLE t1 (f1 INTEGER) ENGINE=INNODB; + +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + +INSERT INTO t1 VALUES (1); +SELECT COUNT(*) AS EXPECT_1 FROM t1; + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +SELECT COUNT(*) AS EXPECT_1 FROM t1; + +--connection node_1 +SELECT COUNT(*) AS EXPECT_1 FROM t1; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_vote_rejoin_mysqldump.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_vote_rejoin_mysqldump.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/galera_vote_rejoin_mysqldump.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/galera_vote_rejoin_mysqldump.test 2024-08-03 07:29:58.000000000 +0000 @@ -59,6 +59,7 @@ --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc +SELECT VARIABLE_VALUE AS expect_3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; SELECT VARIABLE_VALUE AS expect_Primary FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; # Confirm that the table is now identical throughout @@ -67,18 +68,7 @@ SHOW CREATE TABLE t1; --connection node_2 -SET SESSION wsrep_on=OFF; ---let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; ---source include/wait_condition.inc ---source include/galera_wait_ready.inc -SET SESSION wsrep_on=ON; - -# restart node so we don't fail on WSREP_START_POSITION internal check ---source include/restart_mysqld.inc ---source include/wait_until_connected_again.inc - SHOW CREATE TABLE t1; -SELECT COUNT(*) AS expect_0 FROM t1; CALL mtr.add_suppression("is inconsistent with group"); --connection node_3 @@ -89,5 +79,14 @@ --connection node_1 --source suite/galera/include/galera_sst_restore.inc +--connection node_2 +# restart node so we don't fail on WSREP_START_POSITION internal check +--source include/restart_mysqld.inc +--source include/wait_until_connected_again.inc + +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + # Restore original auto_increment_offset values. --source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test 2024-08-03 07:29:58.000000000 +0000 @@ -180,11 +180,11 @@ DROP TABLE t1; -CALL mtr.add_suppression('Can\'t find record in \'t1\''); -CALL mtr.add_suppression('Update_rows_v1 apply failed'); -CALL mtr.add_suppression('Inconsistency detected: Inconsistent by consensus on'); -CALL mtr.add_suppression('last left .* greater than drain seqno'); -CALL mtr.add_suppression('WSREP: Failed to apply write set:'); +CALL mtr.add_suppression("Can't find record in 't1'"); +CALL mtr.add_suppression("Update_rows_v1 apply failed"); +CALL mtr.add_suppression("Inconsistency detected: Inconsistent by consensus on"); +CALL mtr.add_suppression("last left .* greater than drain seqno"); +CALL mtr.add_suppression("WSREP: Failed to apply write set: "); # Restore original auto_increment_offset values. --source ../galera/include/auto_increment_offset_restore.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/disabled.def mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/disabled.def --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/disabled.def 2024-08-03 07:29:58.000000000 +0000 @@ -9,5 +9,3 @@ # Do not use any TAB characters for whitespace. # ############################################################################## - -galera_sr_kill_slave_after_apply_rollback2 : MDEV-29892 Galera test failure on galera_sr_kill_slave_after_apply_rollback2 \ No newline at end of file diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/GCF-336.result 2024-08-03 07:29:58.000000000 +0000 @@ -25,6 +25,8 @@ connection node_2; INSERT INTO t1 VALUES (2); ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +connection node_2a; +connection node_2; COMMIT; ERROR 08S01: WSREP has not yet prepared node for application use connection node_2a; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/r/GCF-832.result mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/GCF-832.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/r/GCF-832.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/GCF-832.result 2024-08-03 07:29:58.000000000 +0000 @@ -6,20 +6,26 @@ connection node_3; connection node_2; SET GLOBAL debug_dbug="d,crash_last_fragment_commit_after_fragment_removal"; -CREATE TABLE t1 (f1 VARCHAR(30)) ENGINE=InnoDB; +CREATE TABLE t1 (f1 VARCHAR(30) not null primary key) ENGINE=InnoDB; SET AUTOCOMMIT=OFF; SET SESSION wsrep_trx_fragment_size=1; START TRANSACTION; -INSERT INTO t1 VALUES ('primary'),('primary'),('primary'),('primary'),('primary'); +INSERT INTO t1 VALUES ('primary1'),('primary2'),('primary3'),('primary4'),('primary5'); COMMIT; -ERROR HY000: Lost connection to server during query +Got one of the listed errors +connection node_1; +connection node_2; # restart connection node_1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; COUNT(*) = 0 1 +SELECT * FROM t1; +f1 connection node_2; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; COUNT(*) = 0 1 +SELECT * FROM t1; +f1 DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/r/galera_sr_kill_slave_before_apply.result mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/galera_sr_kill_slave_before_apply.result --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/r/galera_sr_kill_slave_before_apply.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/r/galera_sr_kill_slave_before_apply.result 2024-08-03 07:29:58.000000000 +0000 @@ -7,11 +7,11 @@ connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; connection node_2; -SELECT COUNT(*) = 0 FROM t1; -COUNT(*) = 0 -1 +SELECT COUNT(*) AS EXPECT_0 FROM t1; +EXPECT_0 +0 connection node_1; -CREATE TABLE t2 (f1 INTEGER); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; LOCK TABLE t2 WRITE; connection node_1; @@ -37,13 +37,14 @@ count_match 1 connection node_1; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 0 connection node_2; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 0 +call mtr.add_suppression("WSREP: node uuid:.*"); connection node_1; DROP TABLE t1; DROP TABLE t2; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/GCF-336.test mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/GCF-336.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/GCF-336.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/GCF-336.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,7 @@ --source include/galera_cluster.inc +--disable_ps2_protocol + --connection node_2 CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; @@ -25,6 +27,12 @@ --connection node_2 --error ER_LOCK_DEADLOCK INSERT INTO t1 VALUES (2); + +--connection node_2a +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +--connection node_2 --error ER_UNKNOWN_COM_ERROR COMMIT; @@ -45,3 +53,5 @@ --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --connection node_3 --source include/galera_wait_ready.inc + +--enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/GCF-832.test mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/GCF-832.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/GCF-832.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/GCF-832.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,7 @@ # --source include/galera_cluster.inc --source include/have_debug_sync.inc +--source include/force_restart.inc --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 # Save original auto_increment_offset values. @@ -13,30 +14,42 @@ --source ../galera/include/auto_increment_offset_save.inc --connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + SET GLOBAL debug_dbug="d,crash_last_fragment_commit_after_fragment_removal"; --let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo "wait" > $_expect_file_name +--write_line wait $_expect_file_name -CREATE TABLE t1 (f1 VARCHAR(30)) ENGINE=InnoDB; +CREATE TABLE t1 (f1 VARCHAR(30) not null primary key) ENGINE=InnoDB; SET AUTOCOMMIT=OFF; SET SESSION wsrep_trx_fragment_size=1; START TRANSACTION; -INSERT INTO t1 VALUES ('primary'),('primary'),('primary'),('primary'),('primary'); ---error 2013 +INSERT INTO t1 VALUES ('primary1'),('primary2'),('primary3'),('primary4'),('primary5'); +--error 2013,2026 COMMIT; +--connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + +--connection node_2 --source include/start_mysqld.inc --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; +SELECT * FROM t1; --connection node_2 --enable_reconnect SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; +SELECT * FROM t1; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/galera_sr_isolate_master.test mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/galera_sr_isolate_master.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/galera_sr_isolate_master.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/galera_sr_isolate_master.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--disable_ps2_protocol # # Test the effect of gmcast.isolate on master during an SR transaction # @@ -133,3 +134,4 @@ DROP TABLE t1; --source ../galera/include/auto_increment_offset_restore.inc +--enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/galera_sr_kill_slave_before_apply.test mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/galera_sr_kill_slave_before_apply.test --- mariadb-10.11.6/mysql-test/suite/galera_3nodes_sr/t/galera_sr_kill_slave_before_apply.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_3nodes_sr/t/galera_sr_kill_slave_before_apply.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,6 +6,7 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/force_restart.inc --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 # Save original auto_increment_offset values. @@ -15,18 +16,23 @@ --source ../galera/include/auto_increment_offset_save.inc --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc + CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; # Block node #2's applier before table t1's inserts have come into play --connection node_2 -SELECT COUNT(*) = 0 FROM t1; +SELECT COUNT(*) AS EXPECT_0 FROM t1; --connection node_1 -CREATE TABLE t2 (f1 INTEGER); +CREATE TABLE t2 (f1 INTEGER PRIMARY KEY) ENGINE=InnoDB; --connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2' +--source include/wait_condition.inc LOCK TABLE t2 WRITE; --connection node_1 @@ -77,10 +83,12 @@ --enable_query_log --connection node_1 -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; --connection node_2 -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +# As noted above sometimes node delivers the same view twice +call mtr.add_suppression("WSREP: node uuid:.*"); --connection node_1 DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/disabled.def mariadb-10.11.9/mysql-test/suite/galera_sr/disabled.def --- mariadb-10.11.6/mysql-test/suite/galera_sr/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/disabled.def 2024-08-03 07:29:58.000000000 +0000 @@ -10,8 +10,6 @@ # ############################################################################## -GCF-1060 : MDEV-26528 wrong usage of mutex LOCK_thd_kill and LOCK_thd_kill -galera_sr_cc_master : MDEV-29882 Galera test failure on galera_sr_cc_master -mysql-wsrep-features#138 : At line 25: query 'DROP TABLE t1' failed: 2013: Lost connection to MySQL server during query +GCF-1060 : MDEV-32160 GCF-1060 test failure due to wsrep MDL conflict # Links to below failures in MDEV-30172 MDEV-25718 : timeout related to wsrep_sync_wait and DEBUG_SYNC diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/MDEV-27615.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-27615.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/MDEV-27615.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-27615.result 2024-08-03 07:29:58.000000000 +0000 @@ -15,7 +15,7 @@ SET GLOBAL wsrep_cluster_address = ''; SET DEBUG_SYNC = 'now SIGNAL continue'; connection node_2; -ERROR HY000: Lost connection to server during query +Got one of the listed errors connection node_2a; SELECT * FROM mysql.wsrep_streaming_log; node_uuid trx_id seqno flags frag diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/MDEV-28971.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-28971.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/MDEV-28971.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-28971.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,17 @@ +connection node_2; +connection node_1; +CREATE SEQUENCE SEQ NOCACHE ENGINE=InnoDB; +SET SESSION wsrep_trx_fragment_size=1; +SET collation_connection=utf16_thai_520_w2; +SET autocommit=0; +CREATE TABLE t1 (a BLOB UNIQUE); +INSERT INTO t1 VALUES ('AAF'); +SELECT SETVAL (SEQ, 100); +ERROR 42000: This version of MariaDB doesn't yet support 'SEQUENCEs with streaming replication in Galera cluster' +ALTER TABLE t1 ADD CONSTRAINT constraint_1 UNIQUE (a); +Warnings: +Note 1831 Duplicate index `constraint_1`. This is deprecated and will be disallowed in a future release +INSERT INTO t1 VALUES(); +ALTER TABLE t1 ADD KEY(b (50)); +ERROR 42000: Key column 'b' doesn't exist in table +DROP TABLE t1,SEQ; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/MDEV-30838.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-30838.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/MDEV-30838.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/MDEV-30838.result 2024-08-03 07:29:58.000000000 +0000 @@ -12,4 +12,4 @@ f1 SET debug_dbug='-d,ib_create_table_fail_too_many_trx'; DROP TABLE t1; -CALL mtr.add_suppression("Error writing into mysql.wsrep_streaming_log: 177"); +CALL mtr.add_suppression("Error writing into mysql\\.wsrep_streaming_log: 177"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_bf_abort_idle.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_bf_abort_idle.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_bf_abort_idle.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_bf_abort_idle.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,33 @@ +connection node_2; +connection node_1; +connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER); +INSERT INTO t1 VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1); +SET SESSION wsrep_trx_fragment_size=10; +SET SESSION wsrep_trx_fragment_unit='rows'; +START TRANSACTION; +UPDATE t1 SET f2 = f2 + 10; +connection node_2; +INSERT INTO t1 VALUES (10,2); +connection node_1a; +connection node_1; +INSERT INTO t1 VALUES (9,1); +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +ROLLBACK; +DROP TABLE t1; +connection node_1; +CREATE TABLE t1(f1 INTEGER PRIMARY KEY, f2 INTEGER); +INSERT INTO t1 VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1); +SET SESSION wsrep_trx_fragment_size=5; +SET SESSION wsrep_trx_fragment_unit='rows'; +START TRANSACTION; +UPDATE t1 SET f2 = f2 + 10; +connection node_2; +INSERT INTO t1 VALUES (10,2); +connection node_1a; +connection node_1; +INSERT INTO t1 VALUES (9,1); +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +ROLLBACK; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_cc_master.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_cc_master.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_cc_master.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_cc_master.result 2024-08-03 07:29:58.000000000 +0000 @@ -13,12 +13,12 @@ INSERT INTO t1 VALUES (3); INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (5); -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log; +EXPECT_5 5 connection node_1; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log; +EXPECT_5 5 connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; connection node_2a; @@ -29,8 +29,8 @@ INSERT INTO t1 VALUES (6); ERROR HY000: Lost connection to server during query connection node_1; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 0 connection node_2a; connection node_1; @@ -38,8 +38,8 @@ connection node_2b; SELECT * FROM mysql.wsrep_streaming_log; node_uuid trx_id seqno flags frag -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 0 SET AUTOCOMMIT=OFF; START TRANSACTION; @@ -49,18 +49,20 @@ INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (5); COMMIT; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 0 connection node_1; -SELECT COUNT(*) FROM t1; -COUNT(*) +SELECT COUNT(*) AS EXPECT_5 FROM t1; +EXPECT_5 5 -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; -COUNT(*) +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 0 DROP TABLE t1; connection node_2b; -CALL mtr.add_suppression("WSREP: Failed to replicate rollback fragment for"); +CALL mtr.add_suppression("WSREP: Failed to replicate rollback fragment for "); disconnect node_2; connect node_2, 127.0.0.1, root, , test, $NODE_MYPORT_2; +disconnect node_2a; +disconnect node_2b; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_mysqldump_sst.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_mysqldump_sst.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_mysqldump_sst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_mysqldump_sst.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,8 +1,8 @@ connection node_2; connection node_1; Setting SST method to mysqldump ... -call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127.0.0.1'"); -call mtr.add_suppression("Failed to load slave replication state from table mysql.gtid_slave_pos"); +call mtr.add_suppression("WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to '127\\.0\\.0\\.1'"); +call mtr.add_suppression("Failed to load slave replication state from table mysql\\.gtid_slave_pos"); connection node_1; CREATE USER 'sst'; GRANT ALL PRIVILEGES ON *.* TO 'sst'; @@ -57,4 +57,4 @@ CALL mtr.add_suppression("Can't open and lock privilege tables"); CALL mtr.add_suppression("Info table is not ready to be used"); CALL mtr.add_suppression("Native table .* has the wrong structure"); -CALL mtr.add_suppression("Table \'mysql.gtid_slave_pos\' doesn\'t exist"); +CALL mtr.add_suppression("Table 'mysql\\.gtid_slave_pos' doesn't exist"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_shutdown_slave.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_shutdown_slave.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_shutdown_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_shutdown_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ connection node_1; connection node_2; connection node_2; -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); connection node_1; CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE = InnoDB; connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_ws_size.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_ws_size.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_ws_size.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_ws_size.result 2024-08-03 07:29:58.000000000 +0000 @@ -30,7 +30,7 @@ DROP TABLE t1; DROP TABLE ten; connection node_1; -call mtr.add_suppression('WSREP: transaction size limit.*'); -call mtr.add_suppression('WSREP: rbr write fail.*'); -call mtr.add_suppression('WSREP: Maximum writeset size exceeded by.*'); -call mtr.add_suppression('WSREP: transaction size exceeded.*'); +call mtr.add_suppression('WSREP: transaction size limit'); +call mtr.add_suppression('WSREP: rbr write fail'); +call mtr.add_suppression('WSREP: Maximum writeset size exceeded by '); +call mtr.add_suppression('WSREP: transaction size exceeded'); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_ws_size2.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_ws_size2.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/galera_sr_ws_size2.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/galera_sr_ws_size2.result 2024-08-03 07:29:58.000000000 +0000 @@ -23,12 +23,12 @@ connection node_1; DROP TABLE t1; DROP TABLE ten; -call mtr.add_suppression('WSREP: SR rollback replication failure.*'); -call mtr.add_suppression('WSREP: transaction size limit.*'); -call mtr.add_suppression('WSREP: SR rbr write fail.*'); -call mtr.add_suppression('WSREP: Maximum writeset size exceeded by.*'); -call mtr.add_suppression('WSREP: transaction size exceeded.*'); -call mtr.add_suppression('WSREP: fragment replication failed:'); +call mtr.add_suppression('WSREP: SR rollback replication failure'); +call mtr.add_suppression('WSREP: transaction size limit'); +call mtr.add_suppression('WSREP: SR rbr write fail'); +call mtr.add_suppression('WSREP: Maximum writeset size exceeded by '); +call mtr.add_suppression('WSREP: transaction size exceeded'); +call mtr.add_suppression('WSREP: fragment replication failed: '); call mtr.add_suppression('WSREP: post commit failed for SR rollback'); -call mtr.add_suppression('WSREP: pre_commit for SR rollback returned 2, thd:*'); -call mtr.add_suppression('WSREP: wsrep_rollback failed to send SR ROLLBACK for *'); +call mtr.add_suppression('WSREP: pre_commit for SR rollback returned 2, thd: '); +call mtr.add_suppression('WSREP: wsrep_rollback failed to send SR ROLLBACK for '); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/mdev_18631.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/mdev_18631.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/mdev_18631.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/mdev_18631.result 2024-08-03 07:29:58.000000000 +0000 @@ -5,7 +5,7 @@ CREATE TABLE t1(f1 INT PRIMARY KEY) ENGINE=INNODB; INSERT INTO t1 VALUES (1), (2), (3); connection node_2; -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); SELECT * FROM t1; f1 1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result mariadb-10.11.9/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result --- mariadb-10.11.6/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/r/mysql-wsrep-features#165.result 2024-08-03 07:29:58.000000000 +0000 @@ -26,6 +26,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -91,6 +92,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -156,6 +158,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -221,6 +224,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -286,6 +290,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -351,6 +356,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -416,6 +422,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -481,6 +488,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -546,6 +554,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -611,6 +620,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -676,6 +686,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -741,6 +752,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -806,6 +818,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -871,6 +884,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -936,6 +950,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 @@ -1001,6 +1016,7 @@ connection node_1c; SET AUTOCOMMIT=ON; INSERT INTO t1 VALUES (3, 'c'); +connection node_1; connection node_2; SELECT * FROM t1; f1 f2 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-1008.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-1008.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-1008.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-1008.test 2024-08-03 07:29:58.000000000 +0000 @@ -15,4 +15,3 @@ --let $galera_sync_point = before_certify_apply_monitor_enter --source GCF-1008.inc - diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-1051.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-1051.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-1051.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-1051.test 2024-08-03 07:29:58.000000000 +0000 @@ -47,5 +47,4 @@ SELECT COUNT(*) = 0 FROM t1; SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log; - DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-845.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-845.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-845.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-845.test 2024-08-03 07:29:58.000000000 +0000 @@ -27,4 +27,3 @@ --let $assert_text = No BF-BF log line found --let $assert_only_after = CURRENT_TEST --source include/assert_grep.inc - diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-851.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-851.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-851.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-851.test 2024-08-03 07:29:58.000000000 +0000 @@ -21,4 +21,3 @@ --connection node_1 SELECT COUNT(*) > 0 FROM t1; DROP TABLE t1; - diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-889.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-889.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/GCF-889.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/GCF-889.test 2024-08-03 07:29:58.000000000 +0000 @@ -26,4 +26,3 @@ --connection node_1 DROP TABLE t1; - diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-21613.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-21613.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-21613.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-21613.test 2024-08-03 07:29:58.000000000 +0000 @@ -21,12 +21,10 @@ --connection node_ctrl SET DEBUG_SYNC = "now WAIT_FOR fragment_removal_reached"; - --connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 --connection node_1a TRUNCATE TABLE t1; - --connection node_1 --error ER_LOCK_DEADLOCK --reap diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-25718.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-25718.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-25718.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-25718.test 2024-08-03 07:29:58.000000000 +0000 @@ -43,8 +43,9 @@ SET debug_sync = "now SIGNAL write_row_continue"; # Let's give the INSERT some time, to make sure it does rollback ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = "INSERT INTO t1 VALUES (1)" AND STATE = "Freeing items"; ---source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = "INSERT INTO t1 VALUES (1)" AND (STATE = "Freeing items" OR STATE = 'Rollback'); +--let $wait_condition_on_error_output = SELECT INFO, STATE FROM INFORMATION_SCHEMA.PROCESSLIST +--source include/wait_condition_with_debug.inc # Resume the DDL in streaming_rollback SET SESSION debug_sync = "now SIGNAL wsrep_streaming_rollback_continue"; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-27615.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-27615.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-27615.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-27615.test 2024-08-03 07:29:58.000000000 +0000 @@ -43,7 +43,8 @@ # Disconnect causes connection to node_2 to be closed # --connection node_2 ---error 2013 # CR_SERVER_LOST +# CR_SERVER_LOST, CR_SSL_CONNECTION_ERROR +--error 2013,2026 --reap diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-28971.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-28971.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-28971.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-28971.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,20 @@ +# +# MDEV-28971 - Assertion `total_length + thd->wsrep_sr().log_position() == saved_pos' +# failed in int wsrep_write_cache_inc(THD*, IO_CACHE*, size_t*) +# + +--source include/galera_cluster.inc + +CREATE SEQUENCE SEQ NOCACHE ENGINE=InnoDB; +SET SESSION wsrep_trx_fragment_size=1; +SET collation_connection=utf16_thai_520_w2; +SET autocommit=0; +CREATE TABLE t1 (a BLOB UNIQUE); +INSERT INTO t1 VALUES ('AAF'); +--error ER_NOT_SUPPORTED_YET +SELECT SETVAL (SEQ, 100); +ALTER TABLE t1 ADD CONSTRAINT constraint_1 UNIQUE (a); +INSERT INTO t1 VALUES(); +--error ER_KEY_COLUMN_DOES_NOT_EXIST +ALTER TABLE t1 ADD KEY(b (50)); +DROP TABLE t1,SEQ; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-30838.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-30838.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/MDEV-30838.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/MDEV-30838.test 2024-08-03 07:29:58.000000000 +0000 @@ -15,4 +15,4 @@ SELECT * FROM t1; SET debug_dbug='-d,ib_create_table_fail_too_many_trx'; DROP TABLE t1; -CALL mtr.add_suppression("Error writing into mysql.wsrep_streaming_log: 177"); +CALL mtr.add_suppression("Error writing into mysql\\.wsrep_streaming_log: 177"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_bf_abort_idle.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_bf_abort_idle.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_bf_abort_idle.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_bf_abort_idle.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,68 @@ +# +# Test BF abort for idle SR transactions +# + +--source include/galera_cluster.inc + +--connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 + +# +# Case 1: BF abort idle SR transaction that has not yet replicated any fragments +# +--connection node_1 +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY, f2 INTEGER); +INSERT INTO t1 VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1); + +--let $bf_count = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.global_status WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + +SET SESSION wsrep_trx_fragment_size=10; +SET SESSION wsrep_trx_fragment_unit='rows'; +START TRANSACTION; +UPDATE t1 SET f2 = f2 + 10; + +--connection node_2 +INSERT INTO t1 VALUES (10,2); + +# Wait for SR transaction to be BF aborted +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $bf_count + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts' +--source include/wait_condition.inc + + +--connection node_1 +--error ER_LOCK_DEADLOCK +INSERT INTO t1 VALUES (9,1); +ROLLBACK; + +DROP TABLE t1; + + +# +# Case 2: BF abort idle SR transaction that has already replicated a fragment +# +--connection node_1 +CREATE TABLE t1(f1 INTEGER PRIMARY KEY, f2 INTEGER); +INSERT INTO t1 VALUES (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1); + +--let $bf_count = `SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.global_status WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts'` + + +SET SESSION wsrep_trx_fragment_size=5; +SET SESSION wsrep_trx_fragment_unit='rows'; +START TRANSACTION; +UPDATE t1 SET f2 = f2 + 10; + +--connection node_2 +INSERT INTO t1 VALUES (10,2); + +# Wait for SR transaction to be BF aborted +--connection node_1a +--let $wait_condition = SELECT VARIABLE_VALUE = $bf_count + 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_bf_aborts' +--source include/wait_condition.inc + +--connection node_1 +--error ER_LOCK_DEADLOCK +INSERT INTO t1 VALUES (9,1); +ROLLBACK; + +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_cc_master.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_cc_master.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_cc_master.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_cc_master.test 2024-08-03 07:29:58.000000000 +0000 @@ -32,10 +32,13 @@ INSERT INTO t1 VALUES (4); INSERT INTO t1 VALUES (5); -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log; --connection node_1 -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +--let $wait_condition = SELECT COUNT(*) = 5 FROM mysql.wsrep_streaming_log +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_5 FROM mysql.wsrep_streaming_log; # # Trigger CC . The transaction is aborted and we expect the SR tables to be cleaned up @@ -56,7 +59,9 @@ INSERT INTO t1 VALUES (6); --connection node_1 -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log +--source include/wait_condition.inc +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; # Restore cluster @@ -73,8 +78,10 @@ --connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 --connection node_2b --source include/galera_wait_ready.inc +--let $wait_condition = SELECT COUNT(*) = 0 FROM mysql.wsrep_streaming_log +--source include/wait_condition.inc SELECT * FROM mysql.wsrep_streaming_log; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; # Repeat transaction to confirm no locks are left from previous transaction @@ -87,18 +94,23 @@ INSERT INTO t1 VALUES (5); COMMIT; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; --connection node_1 -SELECT COUNT(*) FROM t1; -SELECT COUNT(*) FROM mysql.wsrep_streaming_log; +--let $wait_condition = SELECT COUNT(*) = 5 FROM t1 +--source include/wait_condition.inc +SELECT COUNT(*) AS EXPECT_5 FROM t1; +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; DROP TABLE t1; --connection node_2b -CALL mtr.add_suppression("WSREP: Failed to replicate rollback fragment for"); +CALL mtr.add_suppression("WSREP: Failed to replicate rollback fragment for "); --disconnect node_2 --connect node_2, 127.0.0.1, root, , test, $NODE_MYPORT_2 # Restore original auto_increment_offset values. --source ../galera/include/auto_increment_offset_restore.inc + +--disconnect node_2a +--disconnect node_2b diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_kill_all_norecovery.test 2024-08-03 07:29:58.000000000 +0000 @@ -38,12 +38,12 @@ --source include/kill_galera.inc --remove_file $MYSQLTEST_VARDIR/mysqld.1/data/grastate.dat ---let $start_mysqld_params = "--wsrep-new-cluster" +--let $start_mysqld_params =--wsrep-new-cluster --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/start_mysqld.inc --connection node_2 ---let $start_mysqld_params = "" +--let $start_mysqld_params = --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --source include/start_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_large_fragment.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_large_fragment.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_large_fragment.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_large_fragment.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,6 +6,8 @@ --source include/have_innodb.inc --source include/big_test.inc +--disable_ps2_protocol + CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); @@ -56,3 +58,4 @@ CALL mtr.add_suppression('InnoDB: Starting to delete and rewrite log files'); CALL mtr.add_suppression('InnoDB: New log files created, LSN='); +--enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_many_fragments.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_many_fragments.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_many_fragments.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_many_fragments.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,6 +6,8 @@ --source include/have_innodb.inc --source include/big_test.inc +--disable_ps2_protocol + CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; INSERT INTO ten VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); @@ -51,3 +53,5 @@ DROP TABLE ten; DROP TABLE t1; + +--enable_ps2_protocol diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_shutdown_slave.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_shutdown_slave.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_shutdown_slave.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_shutdown_slave.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,7 +9,7 @@ --let $node_2=node_2 --source ../galera/include/auto_increment_offset_save.inc --connection node_2 -call mtr.add_suppression("WSREP: Failed to scan the last segment to the end. Last events may be missing. Last recovered event:.*"); +call mtr.add_suppression("WSREP: Failed to scan the last segment to the end\\. Last events may be missing\\. Last recovered event: "); --connection node_1 CREATE TABLE t1 (f1 INTEGER PRIMARY KEY) ENGINE = InnoDB; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_ws_size.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_ws_size.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_ws_size.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_ws_size.test 2024-08-03 07:29:58.000000000 +0000 @@ -64,7 +64,7 @@ --eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_orig'; --enable_query_log -call mtr.add_suppression('WSREP: transaction size limit.*'); -call mtr.add_suppression('WSREP: rbr write fail.*'); -call mtr.add_suppression('WSREP: Maximum writeset size exceeded by.*'); -call mtr.add_suppression('WSREP: transaction size exceeded.*'); +call mtr.add_suppression('WSREP: transaction size limit'); +call mtr.add_suppression('WSREP: rbr write fail'); +call mtr.add_suppression('WSREP: Maximum writeset size exceeded by '); +call mtr.add_suppression('WSREP: transaction size exceeded'); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_ws_size2.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_ws_size2.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_sr_ws_size2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_sr_ws_size2.test 2024-08-03 07:29:58.000000000 +0000 @@ -51,12 +51,12 @@ DROP TABLE t1; DROP TABLE ten; -call mtr.add_suppression('WSREP: SR rollback replication failure.*'); -call mtr.add_suppression('WSREP: transaction size limit.*'); -call mtr.add_suppression('WSREP: SR rbr write fail.*'); -call mtr.add_suppression('WSREP: Maximum writeset size exceeded by.*'); -call mtr.add_suppression('WSREP: transaction size exceeded.*'); -call mtr.add_suppression('WSREP: fragment replication failed:'); +call mtr.add_suppression('WSREP: SR rollback replication failure'); +call mtr.add_suppression('WSREP: transaction size limit'); +call mtr.add_suppression('WSREP: SR rbr write fail'); +call mtr.add_suppression('WSREP: Maximum writeset size exceeded by '); +call mtr.add_suppression('WSREP: transaction size exceeded'); +call mtr.add_suppression('WSREP: fragment replication failed: '); call mtr.add_suppression('WSREP: post commit failed for SR rollback'); -call mtr.add_suppression('WSREP: pre_commit for SR rollback returned 2, thd:*'); -call mtr.add_suppression('WSREP: wsrep_rollback failed to send SR ROLLBACK for *'); +call mtr.add_suppression('WSREP: pre_commit for SR rollback returned 2, thd: '); +call mtr.add_suppression('WSREP: wsrep_rollback failed to send SR ROLLBACK for '); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_var_ignore_apply_errors_sr.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_var_ignore_apply_errors_sr.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/galera_var_ignore_apply_errors_sr.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/galera_var_ignore_apply_errors_sr.test 2024-08-03 07:29:58.000000000 +0000 @@ -35,4 +35,4 @@ SET GLOBAL wsrep_ignore_apply_errors = 7; CALL mtr.add_suppression("Slave SQL: Could not execute Delete_rows event"); -CALL mtr.add_suppression("Can't find record in 't1'"); \ No newline at end of file +CALL mtr.add_suppression("Can't find record in 't1'"); diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/mdev_18631.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/mdev_18631.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/mdev_18631.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/mdev_18631.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,6 @@ # The configuration is provided in mdev_18631.cnf. # - --source include/galera_cluster.inc --source include/have_innodb.inc @@ -14,7 +13,7 @@ INSERT INTO t1 VALUES (1), (2), (3); --connection node_2 -call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node."); +call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\."); SELECT * FROM t1; --connection node_1 diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/mysql-wsrep-bugs-900.test mariadb-10.11.9/mysql-test/suite/galera_sr/t/mysql-wsrep-bugs-900.test --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/mysql-wsrep-bugs-900.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/mysql-wsrep-bugs-900.test 2024-08-03 07:29:58.000000000 +0000 @@ -19,4 +19,4 @@ COMMIT; SELECT f1 AS expect_1_and_2 FROM t1; -DROP TABLE t1; \ No newline at end of file +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc mariadb-10.11.9/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc --- mariadb-10.11.6/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/galera_sr/t/mysql-wsrep-features#165.inc 2024-08-03 07:29:58.000000000 +0000 @@ -46,6 +46,10 @@ SET AUTOCOMMIT=ON; --send INSERT INTO t1 VALUES (3, 'c') +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; +--source include/wait_condition.inc + --connection node_2 SELECT * FROM t1; @@ -54,7 +58,7 @@ --send UPDATE t1 SET f2 = 'a' WHERE f1 = 2 --connection node_1 ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER != 'system user' AND STATE = 'Updating'; +--let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; --source include/wait_condition.inc # Will deadlock diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/inc/innodb_v_large_col.inc mariadb-10.11.9/mysql-test/suite/gcol/inc/innodb_v_large_col.inc --- mariadb-10.11.6/mysql-test/suite/gcol/inc/innodb_v_large_col.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/inc/innodb_v_large_col.inc 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,3 @@ ---source include/have_innodb.inc - eval CREATE TABLE `t` ( `a` VARCHAR(10000), `b` VARCHAR(3000), `c` VARCHAR(14000) GENERATED ALWAYS AS (CONCAT(a,b)) VIRTUAL, diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_bugfixes.result mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_bugfixes.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_bugfixes.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_bugfixes.result 2024-08-03 07:29:58.000000000 +0000 @@ -744,3 +744,41 @@ LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id, ts, vc); INSERT IGNORE INTO t1 (id) VALUES (2); DROP TABLE t1; +# +# MDEV-28566 Assertion `!expr->is_fixed()' failed in bool +# Virtual_column_info::fix_session_expr(THD*) +# +CREATE TABLE t1 (c1 CHAR(1)); +FLUSH TABLES WITH READ LOCK; +UPDATE t1 SET c1=1; +ERROR HY000: Can't execute the query because you have a conflicting read lock +unlock tables; +SELECT * FROM t1; +c1 +DROP TABLE t1; +CREATE TABLE t1 (c1 CHAR AS (CONCAT (0,DAYNAME (0)))); +FLUSH TABLES WITH READ LOCK; +UPDATE t1 SET c1=1; +ERROR HY000: Can't execute the query because you have a conflicting read lock +unlock tables; +UPDATE t1 SET c1=1; +SELECT * FROM t1; +c1 +DROP TABLE t1; +CREATE TABLE t1 (a int primary key, c1 CHAR AS (CONCAT (0,DAYNAME (0)))); +insert into t1 (a) values (1); +FLUSH TABLES WITH READ LOCK; +UPDATE t1 SET c1=1; +ERROR HY000: Can't execute the query because you have a conflicting read lock +UPDATE t1 SET a=2; +ERROR HY000: Can't execute the query because you have a conflicting read lock +unlock tables; +UPDATE t1 SET a=2; +UPDATE t1 SET c1=1; +ERROR HY000: The value specified for generated column 'c1' in table 't1' has been ignored +SELECT * FROM t1; +a c1 +2 NULL +Warnings: +Warning 1292 Incorrect datetime value: '0' +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_partition_innodb.result mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_partition_innodb.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_partition_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_partition_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,6 @@ -SET @@session.default_storage_engine = 'InnoDB'; +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; +SET default_storage_engine = 'InnoDB'; drop table if exists t1; # Case 1. Partitioning by RANGE based on a non-stored generated column. CREATE TABLE t1 ( @@ -126,6 +128,7 @@ Warning 1906 The value specified for generated column 'vd' in table 't1' has been ignored DROP TABLE t1; InnoDB 0 transactions not purged +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; DROP VIEW IF EXISTS v1,v2; DROP TABLE IF EXISTS t1,t2,t3; DROP PROCEDURE IF EXISTS p1; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_purge.result mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_purge.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,7 +1,7 @@ SET @save_dbug=@@GLOBAL.debug_dbug; CREATE TABLE t1(f1 INT NOT NULL, f2 int not null, f3 int generated always as (f2 * 2) VIRTUAL, -primary key(f1), INDEX (f3))ENGINE=InnoDB; +primary key(f1), INDEX (f3))ENGINE=InnoDB STATS_PERSISTENT=0; connect con1,localhost,root,,,; InnoDB 0 transactions not purged START TRANSACTION WITH CONSISTENT SNAPSHOT; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_update.result mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_update.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/gcol_update.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/gcol_update.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; connect purge_control,localhost,root; START TRANSACTION WITH CONSISTENT SNAPSHOT; connection default; @@ -37,3 +39,4 @@ disconnect purge_control; connection default; drop table t1; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_prefix_index_check.result mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_prefix_index_check.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_prefix_index_check.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_prefix_index_check.result 2024-08-03 07:29:58.000000000 +0000 @@ -13,3 +13,32 @@ )ENGINE=INNODB; REPLACE INTO t1(f3) VALUES (1),(1); DROP TABLE t1; +#Create and alter table examples for full column index followed by prefix index. +CREATE TABLE t1( +f1 VARCHAR(100), +f2 char(2), +KEY(f1,f2), +KEY(f1(5)))ENGINE=INNODB; +REPLACE INTO t1(f2) VALUES (1),(1); +ALTER TABLE t1 ADD INDEX(f2,f1); +DROP TABLE t1; +#Create and alter table examples for small prefix index followed by large +#prefix index. +CREATE TABLE t1( +f1 VARCHAR(100), +f2 char(2), +KEY(f1(5),f2), +KEY(f1(10)))ENGINE=INNODB; +REPLACE INTO t1(f2) VALUES (1),(1); +ALTER TABLE t1 ADD INDEX(f2,f1); +DROP TABLE t1; +#Create and alter table examples for prefix index followed by full column +#index. +CREATE TABLE t1( +f1 VARCHAR(100), +f2 char(2), +KEY(f1(5),f2), +KEY(f1))ENGINE=INNODB; +REPLACE INTO t1(f2) VALUES (1),(1); +ALTER TABLE t1 ADD INDEX(f2,f1); +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_virtual_debug.result mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_debug.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_virtual_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,6 @@ set default_storage_engine=innodb; +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; CREATE TABLE `t` ( `a` VARCHAR(100), `b` VARCHAR(100), @@ -145,3 +147,4 @@ disconnect con1; connection default; SET DEBUG_SYNC=RESET; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_debug_purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -96,11 +96,8 @@ DROP TABLE t1; CREATE TABLE t1 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b)); INSERT INTO t1(a, b) VALUES (1, 1), (2, 2), (3, 3), (4, 4); -connection con1; -# disable purge -BEGIN; -SELECT * FROM t0; -a +connect stop_purge,localhost,root,,; +START TRANSACTION WITH CONSISTENT SNAPSHOT; connection default; DELETE FROM t1 WHERE a = 1; UPDATE t1 SET a = 2, b = 2 WHERE a = 5; @@ -109,10 +106,11 @@ ALTER TABLE t1 ADD INDEX idx (c), ALGORITHM=INPLACE, LOCK=NONE; connection con1; SET DEBUG_SYNC= 'now WAIT_FOR uncommitted'; +BEGIN; DELETE FROM t1 WHERE a = 3; UPDATE t1 SET a = 7, b = 7 WHERE a = 4; INSERT INTO t1(a, b) VALUES (8, 8); -# enable purge +disconnect stop_purge; COMMIT; # wait for purge to process the deleted/updated records. InnoDB 2 transactions not purged diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_virtual_purge.result mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_purge.result --- mariadb-10.11.6/mysql-test/suite/gcol/r/innodb_virtual_purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/r/innodb_virtual_purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; # # Bug#21869656 UNDO LOG DOES NOT CONTAIN ENOUGH INFORMATION # ON INDEXED VIRTUAL COLUMNS @@ -171,3 +173,4 @@ Table Op Msg_type Msg_text test.t check status OK DROP TABLE t; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_bugfixes.test mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_bugfixes.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_bugfixes.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_bugfixes.test 2024-08-03 07:29:58.000000000 +0000 @@ -724,3 +724,38 @@ --remove_file $datadir/test/load_t1 +--echo # +--echo # MDEV-28566 Assertion `!expr->is_fixed()' failed in bool +--echo # Virtual_column_info::fix_session_expr(THD*) +--echo # + +CREATE TABLE t1 (c1 CHAR(1)); +FLUSH TABLES WITH READ LOCK; +--error ER_CANT_UPDATE_WITH_READLOCK +UPDATE t1 SET c1=1; +unlock tables; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (c1 CHAR AS (CONCAT (0,DAYNAME (0)))); +FLUSH TABLES WITH READ LOCK; +--error ER_CANT_UPDATE_WITH_READLOCK +UPDATE t1 SET c1=1; +unlock tables; +UPDATE t1 SET c1=1; +SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1 (a int primary key, c1 CHAR AS (CONCAT (0,DAYNAME (0)))); +insert into t1 (a) values (1); +FLUSH TABLES WITH READ LOCK; +--error ER_CANT_UPDATE_WITH_READLOCK +UPDATE t1 SET c1=1; +--error ER_CANT_UPDATE_WITH_READLOCK +UPDATE t1 SET a=2; +unlock tables; +UPDATE t1 SET a=2; +--error ER_WARNING_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN +UPDATE t1 SET c1=1; +SELECT * FROM t1; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_partition_innodb.test mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_partition_innodb.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_partition_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_partition_innodb.test 2024-08-03 07:29:58.000000000 +0000 @@ -29,7 +29,9 @@ ##### Storage engine to be tested # Set the session storage engine --source include/have_innodb.inc -eval SET @@session.default_storage_engine = 'InnoDB'; +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; +SET default_storage_engine = 'InnoDB'; ##### Workarounds for known open engine specific bugs # none @@ -58,6 +60,9 @@ DROP TABLE t1; --source suite/innodb/include/wait_all_purged.inc + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + #------------------------------------------------------------------------------# # Cleanup --source suite/gcol/inc/gcol_cleanup.inc diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_purge.test mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_purge.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ SET @save_dbug=@@GLOBAL.debug_dbug; CREATE TABLE t1(f1 INT NOT NULL, f2 int not null, f3 int generated always as (f2 * 2) VIRTUAL, - primary key(f1), INDEX (f3))ENGINE=InnoDB; + primary key(f1), INDEX (f3))ENGINE=InnoDB STATS_PERSISTENT=0; connect(con1,localhost,root,,,); --source ../innodb/include/wait_all_purged.inc START TRANSACTION WITH CONSISTENT SNAPSHOT; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_update.test mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_update.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/gcol_update.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/gcol_update.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,8 @@ --source include/have_innodb.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + connect (purge_control,localhost,root); START TRANSACTION WITH CONSISTENT SNAPSHOT; @@ -60,3 +63,5 @@ connection default; drop table t1; + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_prefix_index_check.test mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_prefix_index_check.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_prefix_index_check.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_prefix_index_check.test 2024-08-03 07:29:58.000000000 +0000 @@ -20,3 +20,46 @@ DROP TABLE t1; +--echo #Create and alter table examples for full column index followed by prefix index. + +CREATE TABLE t1( +f1 VARCHAR(100), +f2 char(2), +KEY(f1,f2), +KEY(f1(5)))ENGINE=INNODB; + +REPLACE INTO t1(f2) VALUES (1),(1); + +ALTER TABLE t1 ADD INDEX(f2,f1); + +DROP TABLE t1; + +--echo #Create and alter table examples for small prefix index followed by large +--echo #prefix index. + +CREATE TABLE t1( +f1 VARCHAR(100), +f2 char(2), +KEY(f1(5),f2), +KEY(f1(10)))ENGINE=INNODB; + +REPLACE INTO t1(f2) VALUES (1),(1); + +ALTER TABLE t1 ADD INDEX(f2,f1); + +DROP TABLE t1; + +--echo #Create and alter table examples for prefix index followed by full column +--echo #index. + +CREATE TABLE t1( +f1 VARCHAR(100), +f2 char(2), +KEY(f1(5),f2), +KEY(f1))ENGINE=INNODB; + +REPLACE INTO t1(f2) VALUES (1),(1); + +ALTER TABLE t1 ADD INDEX(f2,f1); + +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_virtual_debug.test mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_debug.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_virtual_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,10 @@ --source include/count_sessions.inc set default_storage_engine=innodb; +# Ensure that the history list length will actually be decremented by purge. +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + CREATE TABLE `t` ( `a` VARCHAR(100), `b` VARCHAR(100), @@ -338,4 +342,6 @@ connection default; SET DEBUG_SYNC=RESET; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + --source include/wait_until_count_sessions.inc diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -131,9 +131,8 @@ INSERT INTO t1(a, b) VALUES (1, 1), (2, 2), (3, 3), (4, 4); -connection con1; ---echo # disable purge -BEGIN; SELECT * FROM t0; +connect (stop_purge,localhost,root,,); +START TRANSACTION WITH CONSISTENT SNAPSHOT; connection default; DELETE FROM t1 WHERE a = 1; @@ -148,13 +147,14 @@ connection con1; SET DEBUG_SYNC= 'now WAIT_FOR uncommitted'; +BEGIN; DELETE FROM t1 WHERE a = 3; UPDATE t1 SET a = 7, b = 7 WHERE a = 4; INSERT INTO t1(a, b) VALUES (8, 8); ---echo # enable purge +disconnect stop_purge; COMMIT; --echo # wait for purge to process the deleted/updated records. diff -Nru mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_virtual_purge.test mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_purge.test --- mariadb-10.11.6/mysql-test/suite/gcol/t/innodb_virtual_purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/gcol/t/innodb_virtual_purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,9 @@ --source include/have_innodb.inc --source include/count_sessions.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + --echo # --echo # Bug#21869656 UNDO LOG DOES NOT CONTAIN ENOUGH INFORMATION --echo # ON INDEXED VIRTUAL COLUMNS @@ -182,4 +185,6 @@ CHECK TABLE t EXTENDED; DROP TABLE t; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + --source include/wait_until_count_sessions.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/include/crc32.pl mariadb-10.11.9/mysql-test/suite/innodb/include/crc32.pl --- mariadb-10.11.6/mysql-test/suite/innodb/include/crc32.pl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/include/crc32.pl 2024-08-03 07:29:58.000000000 +0000 @@ -31,3 +31,26 @@ return $crc; } + + +# Fix the checksum of an InnoDB tablespace page. +# Inputs: +# $page A bytestring with the page data. +# $full_crc32 Checksum type, see get_full_crc32() in innodb-util.pl +# Returns: the modified page as a bytestring. +sub fix_page_crc { + my ($page, $full_crc32)= @_; + my $ps= length($page); + my $polynomial = 0x82f63b78; # CRC-32C + if ($full_crc32) { + my $ck = mycrc32(substr($page, 0, $ps - 4), 0, $polynomial); + substr($page, $ps - 4, 4) = pack("N", $ck); + } else { + my $ck= pack("N", + mycrc32(substr($page, 4, 22), 0, $polynomial) ^ + mycrc32(substr($page, 38, $ps - 38 - 8), 0, $polynomial)); + substr($page, 0, 4)= $ck; + substr($page, $ps-8, 4)= $ck; + } + return $page; +} diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/include/innodb-util.pl mariadb-10.11.9/mysql-test/suite/innodb/include/innodb-util.pl --- mariadb-10.11.6/mysql-test/suite/innodb/include/innodb-util.pl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/include/innodb-util.pl 2024-08-03 07:29:58.000000000 +0000 @@ -124,3 +124,22 @@ ib_restore_ibd_file($tmpd, $datadir, $db, $table); } } + +# Read the flag whether a tablespace is using full_crc32. +# Input: filehandle opened on the tablespace. +sub get_full_crc32 { + my ($TBLSPC)= @_; + my $old_pos= sysseek($TBLSPC, 0, 1); + die "tell() failed on tablespace filehandle: $!\n" + unless defined($old_pos); + sysseek($TBLSPC, 0, 0) + or die "sysseek() failed on tablespace filehandle: $!\n"; + my $tblspc_hdr; + sysread($TBLSPC, $tblspc_hdr, 58) + or die "Cannot read tablespace header: $!\n"; + sysseek($TBLSPC, $old_pos, 0) + or die "sysseek() failed on tablespace filehandle: $!\n"; + my $full_crc32= + unpack("N", substr($tblspc_hdr, 54, 4)) & 0x10; # FIL_SPACE_FLAGS + return $full_crc32; +} diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc --- mariadb-10.11.6/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_delete.inc 2024-08-03 07:29:58.000000000 +0000 @@ -5,9 +5,6 @@ # "create table tab1 (a bigint primary key, b varchar(2048)) engine=InnoDB;" # ---source include/have_innodb.inc ---source include/have_innodb_16k.inc - # turn on flags --disable_query_log SET GLOBAL innodb_monitor_enable=index_page_merge_attempts; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc --- mariadb-10.11.6/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_secondary.inc 2024-08-03 07:29:58.000000000 +0000 @@ -6,9 +6,6 @@ # "create index index1 on tab1(b(750));" # ---source include/have_innodb.inc ---source include/have_innodb_16k.inc - # turn on flags --disable_query_log SET GLOBAL innodb_monitor_enable=index_page_merge_attempts; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc --- mariadb-10.11.6/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/include/innodb_merge_threshold_update.inc 2024-08-03 07:29:58.000000000 +0000 @@ -5,9 +5,6 @@ # "create table tab1 (a bigint primary key, b varchar(2048)) engine=InnoDB;" # ---source include/have_innodb.inc ---source include/have_innodb_16k.inc - # turn on flags --disable_query_log SET GLOBAL innodb_monitor_enable=index_page_merge_attempts; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/include/no_checkpoint_start.inc mariadb-10.11.9/mysql-test/suite/innodb/include/no_checkpoint_start.inc --- mariadb-10.11.6/mysql-test/suite/innodb/include/no_checkpoint_start.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/include/no_checkpoint_start.inc 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,28 @@ # Preparation for using no_checkpoint_end.inc +# no_checkpoint_flush: Set to trigger flushing the dirty pages from buffer pool +# and checkpoint before the "no checkpoint" block. + +if ($no_checkpoint_flush) { + --echo + --echo # Flush all dirty pages from buffer pool + SET @no_checkpoint_save_pct= @@GLOBAL.innodb_max_dirty_pages_pct; + SET @no_checkpoint_save_pct_lwm= @@GLOBAL.innodb_max_dirty_pages_pct_lwm; + + SET GLOBAL innodb_max_dirty_pages_pct_lwm=0.0; + SET GLOBAL innodb_max_dirty_pages_pct=0.0; + + let $wait_condition = + SELECT variable_value = 0 + FROM information_schema.global_status + WHERE variable_name = 'INNODB_BUFFER_POOL_PAGES_DIRTY'; + --source include/wait_condition.inc + + SET GLOBAL innodb_max_dirty_pages_pct= @no_checkpoint_save_pct; + SET GLOBAL innodb_max_dirty_pages_pct_lwm= @no_checkpoint_save_pct_lwm; + --echo +} + let MYSQLD_DATADIR= `select @@datadir`; --replace_regex /.*Last checkpoint at[ ]*([0-9]+).*/\1/ let CHECKPOINT_LSN=`SHOW ENGINE INNODB STATUS`; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/add_foreign_key.result mariadb-10.11.9/mysql-test/suite/innodb/r/add_foreign_key.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/add_foreign_key.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/add_foreign_key.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,31 @@ +# +# Bug #19471516 SERVER CRASHES WHEN EXECUTING ALTER TABLE ADD +# FOREIGN KEY +# +CREATE TABLE `parent` (`parent_id` INT, PRIMARY KEY (`parent_id`)); +CREATE TABLE `child1` (`id` INT ,`child1_fk1` INT, `child1_fk2` INT, +PRIMARY KEY (`id`)); +CREATE TABLE `child2` (`id` INT, `child2_fk1` INT, `child2_fk2` INT, +PRIMARY KEY (`id`)); +CREATE TABLE `child3` (`id` INT , `child3_fk1` INT, PRIMARY KEY (`id`)); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk1`) REFERENCES `parent` +(`parent_id`); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk1`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk2`) REFERENCES `parent` +(`parent_id`); +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk1`) REFERENCES `parent` +(`parent_id`); +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk2`) REFERENCES `parent` +(`parent_id`); +ALTER TABLE `child3` ADD FOREIGN KEY (`child3_fk1`) REFERENCES `parent` +(`parent_id`); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk2`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk1`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk2`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child3` ADD FOREIGN KEY (`child3_fk1`) REFERENCES +`parent` (`parent_id`); +drop table child3, child2, child1, parent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_copy.result mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_copy.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy.result 2024-08-03 07:29:58.000000000 +0000 @@ -51,7 +51,7 @@ ALGORITHM=COPY; connection default; SET DEBUG_SYNC='now WAIT_FOR hung'; -# restart: --innodb-force-recovery=3 --debug_dbug=+d,recv_ran_out_of_buffer +# restart: --innodb-force-recovery=3 disconnect hang; FTS_INDEX_1.ibd FTS_INDEX_2.ibd diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_copy_bulk,OFF.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy_bulk,OFF.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_copy_bulk,OFF.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy_bulk,OFF.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,11 @@ +--- bulk_copy_alter.result ++++ bulk_copy_alter,non_bulk_alter_copy.result +@@ -5,7 +5,7 @@ + INSERT INTO t1 SELECT repeat('b', 200), seq FROM seq_3_to_65536; + ALTER TABLE t1 ADD INDEX(f2); + ALTER TABLE t1 ADD PRIMARY KEY(f1(2)); +-ERROR 23000: Duplicate entry 'bb' for key 'PRIMARY' ++ERROR 23000: Duplicate entry 'aa' for key 'PRIMARY' + INSERT INTO t1 VALUES(repeat('a', 200), 1); + ALTER TABLE t1 ADD UNIQUE KEY(f2); + ERROR 23000: Duplicate entry '1' for key 'f2_2' diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_copy_bulk.result mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy_bulk.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_copy_bulk.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_copy_bulk.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,24 @@ +SET @@alter_algorithm=COPY; +CREATE TABLE t1(f1 CHAR(200), f2 INT NOT NULL)engine=InnoDB; +INSERT INTO t1 SELECT repeat('a', 200), seq FROM seq_1_to_2; +ALTER TABLE t1 FORCE; +INSERT INTO t1 SELECT repeat('b', 200), seq FROM seq_3_to_65536; +ALTER TABLE t1 ADD INDEX(f2); +ALTER TABLE t1 ADD PRIMARY KEY(f1(2)); +ERROR 23000: Duplicate entry 'bb' for key 'PRIMARY' +INSERT INTO t1 VALUES(repeat('a', 200), 1); +ALTER TABLE t1 ADD UNIQUE KEY(f2); +ERROR 23000: Duplicate entry '1' for key 'f2_2' +ALTER IGNORE TABLE t1 MODIFY f1 CHAR(200) NOT NULL; +CREATE TABLE t2(f1 INT NOT NULL, +FOREIGN KEY(f1) REFERENCES t1(f2))ENGINE=InnoDB; +INSERT INTO t2 VALUES(1); +ALTER TABLE t2 FORCE; +DROP TABLE t2, t1; +CREATE TABLE t1 (f1 INT, f2 INT) ENGINE=InnoDB PARTITION BY HASH(f1) PARTITIONS 2; +INSERT INTO t1 VALUES(1, 1); +INSERT INTO t1 SELECT seq, seq * 2 FROM seq_1_to_2; +ALTER TABLE t1 FORCE; +INSERT INTO t1 SELECT seq, seq * 2 FROM seq_3_to_65536; +ALTER TABLE t1 ADD INDEX(f2); +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_kill.result mariadb-10.11.9/mysql-test/suite/innodb/r/alter_kill.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_kill.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_kill.result 2024-08-03 07:29:58.000000000 +0000 @@ -2,6 +2,7 @@ # Bug#16720368 INNODB CRASHES ON BROKEN #SQL*.IBD FILE AT STARTUP # SET GLOBAL innodb_file_per_table=1; +SET GLOBAL innodb_stats_persistent=0; CREATE TABLE bug16720368_1 (a INT PRIMARY KEY) ENGINE=InnoDB; connect con1,localhost,root; CREATE TABLE bug16720368 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; @@ -14,9 +15,9 @@ # and recompute innodb_checksum_algorithm=crc32 # restart SELECT COUNT(*) FROM bug16720368; -ERROR 42S02: Table 'test.bug16720368' doesn't exist in engine +ERROR HY000: Table `test`.`bug16720368` is corrupted. Please drop the table and recreate. INSERT INTO bug16720368 VALUES(1); -ERROR HY000: Table test/bug16720368 is corrupted. Please drop the table and recreate. +ERROR HY000: Table `test`.`bug16720368` is corrupted. Please drop the table and recreate. INSERT INTO bug16720368_1 VALUES(1); # Shut down the server to uncorrupt the data. # restart diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_not_null,COPY,NON-STRICT.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,COPY,NON-STRICT.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_not_null,COPY,NON-STRICT.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,COPY,NON-STRICT.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,42 +1,79 @@ -7,8c7,8 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 -21,22c21,22 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 -35,36c35,36 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 -49,50c49,50 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 -63,64c63,64 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 -77,78c77,78 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 -98,99c98,99 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 +--- alter_not_null.result ++++ alter_not_null,COPY,NON-STRICT.result~ +@@ -4,8 +4,8 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 INT NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'f1' at row 1 + SELECT * FROM t1; +@@ -18,8 +18,8 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 CHAR(10) NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'f1' at row 1 + SELECT * FROM t1; +@@ -32,8 +32,8 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 VARCHAR(20) NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'f1' at row 1 + SELECT * FROM t1; +@@ -46,8 +46,8 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 TEXT NOT NULL DEFAULT 'abc'; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'f1' at row 1 + SELECT * FROM t1; +@@ -60,8 +60,8 @@ + f1 f2 f3 + 2 2 NULL + ALTER TABLE t1 CHANGE f3 f3 INT NOT NULL DEFAULT (f1 + f2); +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'f3' at row 1 + SELECT * FROM t1; +@@ -74,8 +74,8 @@ + f1 b + 10 NULL + ALTER TABLE t1 CHANGE b b TINYINT NOT NULL DEFAULT if(unix_timestamp()>1,1000,0); +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'b' at row 1 + SELECT * FROM t1; +@@ -95,8 +95,8 @@ + CREATE TABLE t1(c1 INT NOT NULL, c2 INT, PRIMARY KEY(c1))ENGINE=INNODB; + INSERT INTO t1 VALUES(1, NULL); + ALTER IGNORE TABLE t1 CHANGE c2 c2 INT NOT NULL DEFAULT 2; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'c2' at row 1 + SELECT * FROM t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_not_null,COPY,STRICT.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,COPY,STRICT.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_not_null,COPY,STRICT.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,COPY,STRICT.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,72 +1,109 @@ -7,10c7 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -13c10 -< 0 ---- -> NULL -21,24c18 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -27c21 -< ---- -> NULL -35,38c29 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -41c32 -< ---- -> NULL -49,52c40 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -55c43 -< ---- -> NULL -63,66c51 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f3' at row 1 ---- -> ERROR 01000: Data truncated for column 'f3' at row 1 -69c54 -< 2 2 0 ---- -> 2 2 NULL -77,80c62 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'b' at row 1 ---- -> ERROR 01000: Data truncated for column 'b' at row 1 -83c65 -< 10 0 ---- -> 10 NULL -98,99c80,81 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 ---- -> affected rows: 1 -> info: Records: 1 Duplicates: 0 Warnings: 1 +--- alter_not_null.result ++++ alter_not_null,COPY,STRICT.result~ +@@ -4,13 +4,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 INT NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +-0 ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 CHAR(10))ENGINE=INNODB; + INSERT INTO t1 VALUES(NULL); +@@ -18,13 +15,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 CHAR(10) NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +- ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 VARCHAR(10))ENGINE=INNODB; + INSERT INTO t1 VALUES(NULL); +@@ -32,13 +26,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 VARCHAR(20) NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +- ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 TEXT)ENGINE=INNODB; + INSERT INTO t1 VALUES(NULL); +@@ -46,13 +37,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 TEXT NOT NULL DEFAULT 'abc'; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +- ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL, f3 INT)ENGINE=INNODB; + INSERT INTO t1 VALUES(2, 2, NULL); +@@ -60,13 +48,10 @@ + f1 f2 f3 + 2 2 NULL + ALTER TABLE t1 CHANGE f3 f3 INT NOT NULL DEFAULT (f1 + f2); +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f3' at row 1 ++ERROR 01000: Data truncated for column 'f3' at row 1 + SELECT * FROM t1; + f1 f2 f3 +-2 2 0 ++2 2 NULL + DROP TABLE t1; + CREATE TABLE t1(f1 INT NOT NULL DEFAULT 0, b TINYINT)ENGINE=InnoDB; + INSERT INTO t1 VALUES(10, NULL); +@@ -74,13 +59,10 @@ + f1 b + 10 NULL + ALTER TABLE t1 CHANGE b b TINYINT NOT NULL DEFAULT if(unix_timestamp()>1,1000,0); +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'b' at row 1 ++ERROR 01000: Data truncated for column 'b' at row 1 + SELECT * FROM t1; + f1 b +-10 0 ++10 NULL + DROP TABLE t1; + CREATE TABLE t1(a INT, v INT AS (a), c INT, d INT NOT NULL, e INT) ENGINE=InnoDB; + ALTER TABLE t1 DROP COLUMN c, CHANGE COLUMN e e INT NOT NULL; +@@ -95,8 +77,8 @@ + CREATE TABLE t1(c1 INT NOT NULL, c2 INT, PRIMARY KEY(c1))ENGINE=INNODB; + INSERT INTO t1 VALUES(1, NULL); + ALTER IGNORE TABLE t1 CHANGE c2 c2 INT NOT NULL DEFAULT 2; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 ++affected rows: 1 ++info: Records: 1 Duplicates: 0 Warnings: 1 + Warnings: + Warning 1265 Data truncated for column 'c2' at row 1 + SELECT * FROM t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_not_null,INPLACE,STRICT.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,INPLACE,STRICT.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_not_null,INPLACE,STRICT.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_not_null,INPLACE,STRICT.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,66 +1,98 @@ -7,10c7 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -13c10 -< 0 ---- -> NULL -21,24c18 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -27c21 -< ---- -> NULL -35,38c29 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -41c32 -< ---- -> NULL -49,52c40 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f1' at row 1 ---- -> ERROR 01000: Data truncated for column 'f1' at row 1 -55c43 -< ---- -> NULL -63,66c51 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'f3' at row 1 ---- -> ERROR 01000: Data truncated for column 'f3' at row 1 -69c54 -< 2 2 0 ---- -> 2 2 NULL -77,80c62 -< affected rows: 0 -< info: Records: 0 Duplicates: 0 Warnings: 1 -< Warnings: -< Warning 1265 Data truncated for column 'b' at row 1 ---- -> ERROR 01000: Data truncated for column 'b' at row 1 -83c65 -< 10 0 ---- -> 10 NULL +--- alter_not_null.result ++++ alter_not_null,INPLACE,STRICT.result~ +@@ -4,13 +4,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 INT NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +-0 ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 CHAR(10))ENGINE=INNODB; + INSERT INTO t1 VALUES(NULL); +@@ -18,13 +15,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 CHAR(10) NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +- ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 VARCHAR(10))ENGINE=INNODB; + INSERT INTO t1 VALUES(NULL); +@@ -32,13 +26,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 VARCHAR(20) NOT NULL; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +- ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 TEXT)ENGINE=INNODB; + INSERT INTO t1 VALUES(NULL); +@@ -46,13 +37,10 @@ + f1 + NULL + ALTER TABLE t1 CHANGE f1 f1 TEXT NOT NULL DEFAULT 'abc'; +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f1' at row 1 ++ERROR 01000: Data truncated for column 'f1' at row 1 + SELECT * FROM t1; + f1 +- ++NULL + DROP TABLE t1; + CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL, f3 INT)ENGINE=INNODB; + INSERT INTO t1 VALUES(2, 2, NULL); +@@ -60,13 +48,10 @@ + f1 f2 f3 + 2 2 NULL + ALTER TABLE t1 CHANGE f3 f3 INT NOT NULL DEFAULT (f1 + f2); +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'f3' at row 1 ++ERROR 01000: Data truncated for column 'f3' at row 1 + SELECT * FROM t1; + f1 f2 f3 +-2 2 0 ++2 2 NULL + DROP TABLE t1; + CREATE TABLE t1(f1 INT NOT NULL DEFAULT 0, b TINYINT)ENGINE=InnoDB; + INSERT INTO t1 VALUES(10, NULL); +@@ -74,13 +59,10 @@ + f1 b + 10 NULL + ALTER TABLE t1 CHANGE b b TINYINT NOT NULL DEFAULT if(unix_timestamp()>1,1000,0); +-affected rows: 0 +-info: Records: 0 Duplicates: 0 Warnings: 1 +-Warnings: +-Warning 1265 Data truncated for column 'b' at row 1 ++ERROR 01000: Data truncated for column 'b' at row 1 + SELECT * FROM t1; + f1 b +-10 0 ++10 NULL + DROP TABLE t1; + CREATE TABLE t1(a INT, v INT AS (a), c INT, d INT NOT NULL, e INT) ENGINE=InnoDB; + ALTER TABLE t1 DROP COLUMN c, CHANGE COLUMN e e INT NOT NULL; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/alter_table.result mariadb-10.11.9/mysql-test/suite/innodb/r/alter_table.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/alter_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/alter_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,8 +117,19 @@ CREATE TABLE t1 (c DATETIME AUTO_INCREMENT UNIQUE) ENGINE=InnoDB; ERROR 42000: Incorrect column specifier for column 'c' # -# End of 10.4 tests +# MDEV-31000 Assertion failed on ALTER TABLE...page_compressed=1 # +SET @save_file_per_table=@@GLOBAL.innodb_file_per_table; +SET GLOBAL innodb_file_per_table=0; +CREATE TABLE t (c INT PRIMARY KEY) ENGINE=INNODB; +SET GLOBAL innodb_file_per_table=1; +ALTER TABLE t page_compressed=1; +SET GLOBAL innodb_file_per_table=@save_file_per_table; +SELECT space>0 FROM information_schema.innodb_sys_tables WHERE name='test/t'; +space>0 +1 +DROP TABLE t; +# End of 10.4 tests # # MDEV-21748 ASAN use-after-poison in PageBulk::insertPage() # @@ -136,3 +147,4 @@ INSERT INTO t1 VALUES (1,NULL),(2,NULL); UPDATE t1 SET a=0; DROP TABLE t1; +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/autoinc_debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/autoinc_debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/autoinc_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/autoinc_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -105,3 +105,60 @@ ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; SET DEBUG_SYNC='RESET'; +# +# MDEV-33593: Auto increment deadlock error causes ASSERT in subsequent save point +# +CREATE TABLE t1(col1 INT PRIMARY KEY AUTO_INCREMENT, col2 INT) ENGINE=InnoDB; +CREATE TABLE t2(col1 INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1(col2) values(100); +connect con1, localhost, root,,; +START TRANSACTION; +# T1: Acquiring Row X lock on table t2 +INSERT INTO t2 values(100); +connect con2, localhost, root,,; +START TRANSACTION; +# T2: Wait for (T1) row lock on t2 after acquiring GAP Lock on t1 +UPDATE t1 SET col2 = 20 where col1 = 10; +SET DEBUG_SYNC='lock_wait_before_suspend SIGNAL t2_waiting'; +INSERT INTO t2 values(100); +connection default; +SET DEBUG_SYNC='now WAIT_FOR t2_waiting'; +# T3: Wait for (T2) II row Lock on t1 after acquiring Auto Increment Lock on t1 +SET DEBUG_SYNC='lock_wait_before_suspend SIGNAL t3_waiting'; +INSERT INTO t1(col2) SELECT col2 from t1; +connection con1; +SAVEPOINT s1; +SET DEBUG_SYNC='now WAIT_FOR t3_waiting'; +# T1: Wait for (T3) auto increment lock on t1 causing T1 -> T3 -> T2 -> T1 deadlock +SET debug_dbug = '+d,innodb_deadlock_victim_self'; +INSERT INTO t1(col2) VALUES(200); +ERROR HY000: Failed to read auto-increment value from storage engine +# The transaction should have been rolled back +SELECT * FROM t1; +col1 col2 +1 100 +SELECT * FROM t2; +col1 +# Release the previous savepoint using the same name +SAVEPOINT s1; +COMMIT; +connection con2; +COMMIT; +connection default; +COMMIT; +disconnect con1; +disconnect con2; +# Cleanup +SELECT * FROM t1; +col1 col2 +1 100 +2 100 +DROP TABLE t1; +SELECT * FROM t2; +col1 +100 +DROP TABLE t2; +SET DEBUG_SYNC='RESET'; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/autoinc_import.result mariadb-10.11.9/mysql-test/suite/innodb/r/autoinc_import.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/autoinc_import.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/autoinc_import.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,232 @@ +CREATE TABLE t1 (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(42); +CREATE TABLE t1b LIKE t1; +INSERT INTO t1b VALUES(3); +CREATE TABLE t1z LIKE t1; +CREATE TABLE t1t (id TINYINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t0t LIKE t1t; +INSERT INTO t1t VALUES(123); +FLUSH TABLES t1,t1b,t1t FOR EXPORT; +UNLOCK TABLES; +CREATE TABLE t5_7 LIKE t1; +CREATE TABLE t5_7b LIKE t1b; +CREATE TABLE t10_1 LIKE t1; +CREATE TABLE t10_1b LIKE t1b; +ALTER TABLE t1 DISCARD TABLESPACE; +ALTER TABLE t1b DISCARD TABLESPACE; +ALTER TABLE t1z DISCARD TABLESPACE; +ALTER TABLE t1t DISCARD TABLESPACE; +ALTER TABLE t0t DISCARD TABLESPACE; +ALTER TABLE t5_7 DISCARD TABLESPACE; +ALTER TABLE t5_7b DISCARD TABLESPACE; +ALTER TABLE t10_1 DISCARD TABLESPACE; +ALTER TABLE t10_1b DISCARD TABLESPACE; +FLUSH TABLES; +ALTER TABLE t0t IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t0t.cfg', will attempt to import without schema verification +INSERT INTO t0t VALUES(NULL); +SELECT * FROM t0t; +id +123 +124 +DROP TABLE t0t; +ALTER TABLE t1 IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1.cfg', will attempt to import without schema verification +ALTER TABLE t1b IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1b.cfg', will attempt to import without schema verification +ALTER TABLE t1z IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1z.cfg', will attempt to import without schema verification +ALTER TABLE t1t IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t1t.cfg', will attempt to import without schema verification +ALTER TABLE t5_7 IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t5_7.cfg', will attempt to import without schema verification +ALTER TABLE t5_7b IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t5_7b.cfg', will attempt to import without schema verification +ALTER TABLE t10_1 IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t10_1.cfg', will attempt to import without schema verification +ALTER TABLE t10_1b IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t10_1b.cfg', will attempt to import without schema verification +FOUND 1 /InnoDB: Resetting PAGE_ROOT_AUTO_INC from 128 to 123 on table `test`\.`t0t`/ in mysqld.1.err +FOUND 1 /InnoDB: Resetting PAGE_ROOT_AUTO_INC from 0 to 42 on table `test`\.`t1z`/ in mysqld.1.err +FOUND 1 /InnoDB: Resetting PAGE_ROOT_AUTO_INC from 128 to 123 on table `test`\.`t1t`/ in mysqld.1.err +FOUND 1 /InnoDB: Resetting PAGE_ROOT_AUTO_INC from 3 to 42 on table `test`\.`t5_7` \(created with version 50744\)/ in mysqld.1.err +FOUND 1 /InnoDB: Resetting PAGE_ROOT_AUTO_INC from 3 to 42 on table `test`\.`t10_1` \(created with version 100149\)/ in mysqld.1.err +FOUND 5 /InnoDB: Resetting PAGE_ROOT_AUTO_INC/ in mysqld.1.err +# restart: --read-only +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7 check status OK +test.t5_7b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7b check status OK +test.t10_1 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1 check status OK +test.t10_1b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1b check status OK +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7 check status OK +test.t5_7b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7b check status OK +test.t10_1 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1 check status OK +test.t10_1b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1b check status OK +# restart: --innodb-read-only --read-only +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7 check status OK +test.t5_7b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7b check status OK +test.t10_1 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1 check status OK +test.t10_1b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1b check status OK +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7 check status OK +test.t5_7b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t5_7b check status OK +test.t10_1 check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1 check status OK +test.t10_1b check note Auto_increment will be checked on each open until CHECK TABLE FOR UPGRADE is executed +test.t10_1b check status OK +# restart: --innodb-read-only +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check status Operation failed +test.t5_7b check status Operation failed +test.t10_1 check status Operation failed +test.t10_1b check status Operation failed +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check status Operation failed +test.t5_7b check status Operation failed +test.t10_1 check status Operation failed +test.t10_1b check status Operation failed +SELECT COUNT(*) FROM t1; +COUNT(*) +1 +SELECT COUNT(*) FROM t1b; +COUNT(*) +1 +SELECT COUNT(*) FROM t1t; +COUNT(*) +1 +SELECT COUNT(*) FROM t1z; +COUNT(*) +1 +SELECT COUNT(*) FROM t5_7; +COUNT(*) +1 +SELECT COUNT(*) FROM t5_7b; +COUNT(*) +1 +SELECT COUNT(*) FROM t10_1; +COUNT(*) +1 +SELECT COUNT(*) FROM t10_1b; +COUNT(*) +1 +# restart +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check note Auto_increment checked and .frm file version updated +test.t5_7 check status OK +test.t5_7b check note Auto_increment checked and .frm file version updated +test.t5_7b check status OK +test.t10_1 check note Auto_increment checked and .frm file version updated +test.t10_1 check status OK +test.t10_1b check note Auto_increment checked and .frm file version updated +test.t10_1b check status OK +INSERT INTO t1 VALUES(NULL); +INSERT INTO t1b VALUES(NULL); +INSERT INTO t1t VALUES(NULL); +INSERT INTO t1z VALUES(NULL); +INSERT INTO t5_7 VALUES(NULL); +INSERT INTO t5_7b VALUES(NULL); +INSERT INTO t10_1 VALUES(NULL); +INSERT INTO t10_1b VALUES(NULL); +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +test.t1b check status OK +test.t1t check status OK +test.t1z check status OK +test.t5_7 check status OK +test.t5_7b check status OK +test.t10_1 check status OK +test.t10_1b check status OK +SELECT * FROM t1; +id +4 +42 +SELECT * FROM t1b; +id +3 +347 +SELECT * FROM t1t; +id +123 +124 +SELECT * FROM t1z; +id +42 +43 +SELECT * FROM t5_7; +id +42 +43 +SELECT * FROM t5_7b; +id +3 +347 +SELECT * FROM t10_1; +id +42 +43 +SELECT * FROM t10_1b; +id +3 +347 +DROP TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/cascade_lock_wait.result mariadb-10.11.9/mysql-test/suite/innodb/r/cascade_lock_wait.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/cascade_lock_wait.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/cascade_lock_wait.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,76 @@ +create table t1 (f1 int primary key) engine=innodb; +create table t2 (f1 int primary key, +constraint c1 foreign key (f1) references t1(f1) +on update cascade +on delete cascade) engine=innodb; +create table t3 (f1 int primary key, +constraint c2 foreign key (f1) references t1(f1) +on update cascade +on delete cascade) engine=innodb; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) NOT NULL, + PRIMARY KEY (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) NOT NULL, + PRIMARY KEY (`f1`), + CONSTRAINT `c1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +show create table t3; +Table Create Table +t3 CREATE TABLE `t3` ( + `f1` int(11) NOT NULL, + PRIMARY KEY (`f1`), + CONSTRAINT `c2` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +insert into t1 values (1); +insert into t1 values (2); +insert into t1 values (3); +insert into t2 values (1); +insert into t2 values (2); +insert into t2 values (3); +insert into t3 values (1); +insert into t3 values (2); +insert into t3 values (3); +select f1 from t1; +f1 +1 +2 +3 +select f1 from t2; +f1 +1 +2 +3 +select f1 from t3; +f1 +1 +2 +3 +set @save_dbug = @@debug_dbug; +set debug_dbug = '+d,dml_cascade_only_once'; +set debug_dbug = '+d,row_upd_cascade_lock_wait_err'; +update t1 set f1 = 100 where f1 = 2; +select f1 from t1; +f1 +1 +3 +100 +select f1 from t2; +f1 +1 +3 +100 +select f1 from t3; +f1 +1 +3 +100 +set debug_dbug = @save_dbug; +drop table t2; +drop table t3; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,32k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,32k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,32k.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,32k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ ---- mysql-test/suite/innodb/r/check_ibd_filesize.result 2022-08-16 17:28:06.462350465 +0530 -+++ mysql-test/suite/innodb/r/check_ibd_filesize.reject 2022-08-16 17:29:25.129637040 +0530 +--- mysql-test/suite/innodb/r/check_ibd_filesize.result ++++ mysql-test/suite/innodb/r/check_ibd_filesize.reject @@ -3,18 +3,12 @@ # SPACE IN 5.7 THAN IN 5.6 # @@ -14,7 +14,7 @@ -# bytes: 65536 +# bytes: 131072 INSERT INTO t1 SELECT seq,REPEAT('a',30000) FROM seq_1_to_20; --# bytes: 4194304 +-# bytes: 2097152 -DROP TABLE t1; -CREATE TABLE t1 (a INT PRIMARY KEY, b BLOB) -ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,4k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,4k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,4k.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,4k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ ---- mysql-test/suite/innodb/r/check_ibd_filesize.result 2022-08-16 17:28:06.462350465 +0530 -+++ mysql-test/suite/innodb/r/check_ibd_filesize.reject 2022-08-16 17:31:39.288769153 +0530 +--- mysql-test/suite/innodb/r/check_ibd_filesize.result ++++ mysql-test/suite/innodb/r/check_ibd_filesize.reject @@ -3,18 +3,18 @@ # SPACE IN 5.7 THAN IN 5.6 # @@ -13,7 +13,7 @@ -# bytes: 65536 +# bytes: 16384 INSERT INTO t1 SELECT seq,REPEAT('a',30000) FROM seq_1_to_20; - # bytes: 4194304 + # bytes: 2097152 DROP TABLE t1; CREATE TABLE t1 (a INT PRIMARY KEY, b BLOB) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,64k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,64k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,64k.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,64k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ ---- mysql-test/suite/innodb/r/check_ibd_filesize.result 2022-08-16 17:28:06.462350465 +0530 -+++ mysql-test/suite/innodb/r/check_ibd_filesize.reject 2022-08-16 17:30:28.957174270 +0530 +--- mysql-test/suite/innodb/r/check_ibd_filesize.result ++++ mysql-test/suite/innodb/r/check_ibd_filesize.reject @@ -3,18 +3,12 @@ # SPACE IN 5.7 THAN IN 5.6 # @@ -14,7 +14,7 @@ -# bytes: 65536 +# bytes: 262144 INSERT INTO t1 SELECT seq,REPEAT('a',30000) FROM seq_1_to_20; --# bytes: 4194304 +-# bytes: 2097152 -DROP TABLE t1; -CREATE TABLE t1 (a INT PRIMARY KEY, b BLOB) -ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,8k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,8k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize,8k.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize,8k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ ---- mysql-test/suite/innodb/r/check_ibd_filesize.result 2022-08-16 17:28:06.462350465 +0530 -+++ mysql-test/suite/innodb/r/check_ibd_filesize.reject 2022-08-16 17:31:03.516962339 +0530 +--- mysql-test/suite/innodb/r/check_ibd_filesize.result ++++ mysql-test/suite/innodb/r/check_ibd_filesize.reject @@ -3,18 +3,18 @@ # SPACE IN 5.7 THAN IN 5.6 # @@ -13,7 +13,7 @@ -# bytes: 65536 +# bytes: 32768 INSERT INTO t1 SELECT seq,REPEAT('a',30000) FROM seq_1_to_20; - # bytes: 4194304 + # bytes: 2097152 DROP TABLE t1; CREATE TABLE t1 (a INT PRIMARY KEY, b BLOB) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize.result mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/check_ibd_filesize.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/check_ibd_filesize.result 2024-08-03 07:29:58.000000000 +0000 @@ -10,7 +10,7 @@ CREATE TABLE t1 (a INT PRIMARY KEY, b BLOB) ENGINE=InnoDB; # bytes: 65536 INSERT INTO t1 SELECT seq,REPEAT('a',30000) FROM seq_1_to_20; -# bytes: 4194304 +# bytes: 2097152 DROP TABLE t1; CREATE TABLE t1 (a INT PRIMARY KEY, b BLOB) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/corrupted_during_recovery.result mariadb-10.11.9/mysql-test/suite/innodb/r/corrupted_during_recovery.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/corrupted_during_recovery.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/corrupted_during_recovery.result 2024-08-03 07:29:58.000000000 +0000 @@ -9,7 +9,7 @@ SELECT * FROM t1; ERROR 42000: Unknown storage engine 'InnoDB' SELECT * FROM t1; -ERROR HY000: Table test/t1 is corrupted. Please drop the table and recreate. +Got one of the listed errors SELECT * FROM t2; a 1 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/cursor-restore-unique-null.result mariadb-10.11.9/mysql-test/suite/innodb/r/cursor-restore-unique-null.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/cursor-restore-unique-null.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/cursor-restore-unique-null.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,24 @@ +CREATE TABLE t(a INT PRIMARY KEY, b INT, c INT, UNIQUE KEY `b_c` (`b`,`c`)) +ENGINE=InnoDB, STATS_PERSISTENT=0; +INSERT INTO t SET a = 1, c = 2; +connect con1,localhost,root; +BEGIN; +INSERT INTO t SET a=2, c=2; +connection default; +BEGIN; +SET DEBUG_SYNC="lock_wait_start SIGNAL select_locked"; +SELECT * FROM t FORCE INDEX(b) FOR UPDATE; +connection con1; +SET DEBUG_SYNC="now WAIT_FOR select_locked"; +ROLLBACK; +connection default; +# If the bug is not fixed, and the both unique index key fields are +# NULL, there will be two (1, NULL, 2) rows in the result, +# because cursor will be restored to (NULL, 2, 1) position for +# secondary key instead of "supremum". +a b c +1 NULL 2 +COMMIT; +SET DEBUG_SYNC="RESET"; +disconnect con1; +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/deadlock_detect.result mariadb-10.11.9/mysql-test/suite/innodb/r/deadlock_detect.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/deadlock_detect.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/deadlock_detect.result 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,12 @@ id INT, PRIMARY KEY(id) ) ENGINE=InnoDB; +CREATE TABLE dl( +id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, +cnt INT UNSIGNED +) ENGINE=InnoDB; INSERT INTO t1 VALUES(1), (2), (3); +INSERT INTO dl(cnt) SELECT variable_value FROM information_schema.global_status WHERE variable_name LIKE 'Innodb_deadlocks'; BEGIN; SELECT * FROM t1 WHERE id = 1 LOCK IN SHARE MODE; connect con1,localhost,root,,; @@ -20,5 +25,8 @@ ROLLBACK; disconnect con2; connection default; +'Deadlock counter is valid'; +1 ROLLBACK; DROP TABLE t1; +DROP TABLE dl; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/dml_purge.result mariadb-10.11.9/mysql-test/suite/innodb/r/dml_purge.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/dml_purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/dml_purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; # # MDEV-12288 Reset DB_TRX_ID when the history is removed, # to speed up MVCC @@ -46,3 +48,4 @@ 1 2 NULL 3 -3 NULL DROP TABLE t1; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/doublewrite.result mariadb-10.11.9/mysql-test/suite/innodb/r/doublewrite.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/doublewrite.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/doublewrite.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,23 +1,7 @@ # -# Bug #17335427 INNODB CAN NOT USE THE DOUBLEWRITE BUFFER PROPERLY -# Bug #18144349 INNODB CANNOT USE THE DOUBLEWRITE BUFFER FOR THE FIRST -# PAGE OF SYSTEM TABLESPACE +# MDEV-32242 innodb.doublewrite test case always is skipped # -SET GLOBAL innodb_fast_shutdown = 0; -# restart -show variables like 'innodb_doublewrite'; -Variable_name Value -innodb_doublewrite ON -show variables like 'innodb_fil_make_page_dirty_debug'; -Variable_name Value -innodb_fil_make_page_dirty_debug 0 -show variables like 'innodb_saved_page_number_debug'; -Variable_name Value -innodb_saved_page_number_debug 0 -connect stop_purge,localhost,root,,; -START TRANSACTION WITH CONSISTENT SNAPSHOT; -connection default; -create table t1 (f1 int primary key, f2 blob) engine=innodb stats_persistent=0; +create table t1 (f1 int primary key, f2 blob) stats_persistent=0, engine=innodb; start transaction; insert into t1 values(1, repeat('#',12)); insert into t1 values(2, repeat('+',12)); @@ -25,195 +9,21 @@ insert into t1 values(4, repeat('-',12)); insert into t1 values(5, repeat('.',12)); commit work; -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if first page of user -# tablespace is full of zeroes. -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; -begin; -insert into t1 values (6, repeat('%', 12)); -# Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; -# Make the first page dirty for table t1 -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = @space_id; -# Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; -# Kill the server -disconnect stop_purge; -# Make the first page (page_no=0) of the user tablespace -# full of zeroes. -# -# MDEV-11623: Use old FSP_SPACE_FLAGS in the doublewrite buffer. -# restart -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -select f1, f2 from t1; -f1 f2 -1 ############ -2 ++++++++++++ -3 //////////// -4 ------------ -5 ............ -# Test End -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if first page of user -# tablespace is corrupted. -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; -# Ensure that dirty pages of table t1 is flushed. -flush tables t1 for export; -unlock tables; -set global innodb_log_checkpoint_now=1; -begin; -insert into t1 values (6, repeat('%', 12)); -# Make the first page dirty for table t1 -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = @space_id; -# Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; -# Kill the server -# Corrupt the first page (page_no=0) of the user tablespace. -# restart -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -select f1, f2 from t1; -f1 f2 -1 ############ -2 ++++++++++++ -3 //////////// -4 ------------ -5 ............ -# Test End -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if 2nd page of user -# tablespace is full of zeroes. -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; -# Ensure that dirty pages of table t1 is flushed. -flush tables t1 for export; -unlock tables; -begin; -insert into t1 values (6, repeat('%', 400)); -# Make the 2nd page dirty for table t1 -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = @space_id; -# Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; -# Kill the server -# Make the 2nd page (page_no=1) of the tablespace all zeroes. -# restart -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -select f1, f2 from t1; -f1 f2 -1 ############ -2 ++++++++++++ -3 //////////// -4 ------------ -5 ............ -# Test End -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if 2nd page of user -# tablespace is corrupted. -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; -# Ensure that dirty pages of table t1 is flushed. -flush tables t1 for export; -unlock tables; -begin; -insert into t1 values (6, repeat('%', 400)); -# Make the 2nd page dirty for table t1 -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = @space_id; -# Ensure that the dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; -# Kill the server -# Corrupt the 2nd page (page_no=1) of the user tablespace. -# restart -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -select f1, f2 from t1; -f1 f2 -1 ############ -2 ++++++++++++ -3 //////////// -4 ------------ -5 ............ -# Test End -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if first page of -# system tablespace is full of zeroes. -begin; -insert into t1 values (6, repeat('%', 400)); -# Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; -# Make the first page dirty for system tablespace -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = 0; -# Ensure that the dirty page of system tablespace is also flushed. -set global innodb_buf_flush_list_now = 1; -# Kill the server -# Make the first page (page_no=0) of the system tablespace -# all zeroes. -# restart -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -select f1, f2 from t1; -f1 f2 -1 ############ -2 ++++++++++++ -3 //////////// -4 ------------ -5 ............ -# Test End -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if first page of -# system tablespace is corrupted. -begin; -insert into t1 values (6, repeat('%', 400)); -# Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; -# Make the first page dirty for system tablespace -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = 0; -# Ensure that the dirty page of system tablespace is also flushed. -set global innodb_buf_flush_list_now = 1; -# Kill the server -# Corrupt the first page (page_no=0) of the system tablespace. +SET GLOBAL innodb_fast_shutdown = 0; # restart -check table t1; -Table Op Msg_type Msg_text -test.t1 check status OK -select f1, f2 from t1; -f1 f2 -1 ############ -2 ++++++++++++ -3 //////////// -4 ------------ -5 ............ -# Test End -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if 2nd page of -# system tablespace is full of zeroes. -begin; -insert into t1 values (6, repeat('%', 400)); -# Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; -# Make the second page dirty for system tablespace -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = 0; -# Ensure that the dirty page of system tablespace is also flushed. -set global innodb_buf_flush_list_now = 1; +connect dml,localhost,root,,; +XA START 'x'; +insert into t1 values (6, repeat('%', @@innodb_page_size/2)); +XA END 'x'; +XA PREPARE 'x'; +disconnect dml; +connection default; +flush table t1 for export; # Kill the server -# Make the 2nd page (page_no=1) of the system tablespace -# all zeroes. # restart +FOUND 1 /InnoDB: Restoring page \[page id: space=[1-9][0-9]*, page number=0\] of datafile/ in mysqld.1.err +FOUND 1 /InnoDB: Recovered page \[page id: space=[1-9][0-9]*, page number=3\]/ in mysqld.1.err +XA ROLLBACK 'x'; check table t1; Table Op Msg_type Msg_text test.t1 check status OK @@ -224,27 +34,21 @@ 3 //////////// 4 ------------ 5 ............ -# Test End -# --------------------------------------------------------------- -# Test Begin: Test if recovery works if 2nd page of -# system tablespace is corrupted. -begin; -insert into t1 values (6, repeat('%', 400)); -# Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; -# Make the second page dirty for system tablespace -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = 0; -# Ensure that the dirty page of system tablespace is also flushed. -set global innodb_buf_flush_list_now = 1; +connect dml,localhost,root,,; +XA START 'x'; +insert into t1 values (6, repeat('%', @@innodb_page_size/2)); +XA END 'x'; +XA PREPARE 'x'; +disconnect dml; +connection default; +flush table t1 for export; # Kill the server -# Make the 2nd page (page_no=1) of the system tablespace -# all zeroes. # restart +FOUND 1 /InnoDB: Restoring page \[page id: space=[1-9][0-9]*, page number=0\] of datafile/ in mysqld.1.err +XA ROLLBACK 'x'; check table t1; Table Op Msg_type Msg_text test.t1 check status OK -FOUND 1 /InnoDB: .*test.t1\.ibd/ in mysqld.1.err select f1, f2 from t1; f1 f2 1 ############ @@ -253,14 +57,4 @@ 4 ------------ 5 ............ drop table t1; -# -# MDEV-12600 crash during install_db with innodb_page_size=32K -# and ibdata1=3M -# -# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend -SELECT * FROM INFORMATION_SCHEMA.ENGINES -WHERE engine = 'innodb' -AND support IN ('YES', 'DEFAULT', 'ENABLED'); -ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS -FOUND 1 /\[ERROR\] InnoDB: Cannot create doublewrite buffer/ in mysqld.1.err -# restart +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/doublewrite_debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/doublewrite_debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/doublewrite_debug.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/doublewrite_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,94 @@ +# +# Bug #17335427 INNODB CAN NOT USE THE DOUBLEWRITE BUFFER PROPERLY +# Bug #18144349 INNODB CANNOT USE THE DOUBLEWRITE BUFFER FOR THE FIRST +# PAGE OF SYSTEM TABLESPACE +# +show variables like 'innodb_doublewrite'; +Variable_name Value +innodb_doublewrite ON +show variables like 'innodb_fil_make_page_dirty_debug'; +Variable_name Value +innodb_fil_make_page_dirty_debug 0 +show variables like 'innodb_saved_page_number_debug'; +Variable_name Value +innodb_saved_page_number_debug 0 +create table t1 (f1 int primary key, f2 blob) engine=innodb stats_persistent=0; +start transaction; +insert into t1 values(1, repeat('#',12)); +insert into t1 values(2, repeat('+',12)); +insert into t1 values(3, repeat('/',12)); +insert into t1 values(4, repeat('-',12)); +insert into t1 values(5, repeat('.',12)); +commit work; +# Test Begin: Test if recovery works if 1st page and 2nd page +# of system tablespace is full of zeroes. +SET GLOBAL innodb_fast_shutdown = 0; +# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0 +begin; +insert into t1 values (6, repeat('%', 400)); +# Make the first page dirty for system tablespace +set global innodb_saved_page_number_debug = 0; +set global innodb_fil_make_page_dirty_debug = 0; +# Make the second page dirty for system tablespace +set global innodb_saved_page_number_debug = 1; +set global innodb_fil_make_page_dirty_debug = 0; +set global innodb_buf_flush_list_now = 1; +# Kill the server +# Make the 1st page (page_no=0) and 2nd page (page_no=1) +# of the system tablespace all zeroes. +# restart +FOUND 1 /InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile/ in mysqld.1.err +FOUND 1 /InnoDB: Recovered page \[page id: space=0, page number=1\]/ in mysqld.1.err +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +select f1, f2 from t1; +f1 f2 +1 ############ +2 ++++++++++++ +3 //////////// +4 ------------ +5 ............ +# Test End +# --------------------------------------------------------------- +# Test Begin: Test if recovery works if 1st page of +# system tablespace is corrupted and 2nd page as corrupted. +# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0 +begin; +insert into t1 values (6, repeat('%', 400)); +# Make the first page dirty for system tablespace +set global innodb_saved_page_number_debug = 0; +set global innodb_fil_make_page_dirty_debug = 0; +# Make the second page dirty for system tablespace +set global innodb_saved_page_number_debug = 1; +set global innodb_fil_make_page_dirty_debug = 0; +set global innodb_buf_flush_list_now = 1; +# Kill the server +# Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace. +# restart +FOUND 2 /InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile/ in mysqld.1.err +FOUND 2 /InnoDB: Recovered page \[page id: space=0, page number=1\]/ in mysqld.1.err +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +select f1, f2 from t1; +f1 f2 +1 ############ +2 ++++++++++++ +3 //////////// +4 ------------ +5 ............ +drop table t1; +# Test End +# --------------------------------------------------------------- +# +# MDEV-12600 crash during install_db with innodb_page_size=32K +# and ibdata1=3M +# +# restart: --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/doublewrite --innodb-undo-tablespaces=0 --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend +SELECT * FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); +ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS +FOUND 1 /\[ERROR\] InnoDB: Cannot create doublewrite buffer/ in mysqld.1.err +# restart diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/fk_col_alter.result mariadb-10.11.9/mysql-test/suite/innodb/r/fk_col_alter.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/fk_col_alter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/fk_col_alter.result 2024-08-03 07:29:58.000000000 +0000 @@ -115,4 +115,17 @@ ALTER TABLE t2 MODIFY f2 VARCHAR(1023); SET SESSION FOREIGN_KEY_CHECKS = ON; DROP TABLE t2, t1; +# +# MDEV-32638 MariaDB crashes with foreign_key_checks=0 +# when changing a column and adding a foreign +# key at the same time +# +CREATE TABLE t1(f1 VARCHAR(2) NOT NULL, PRIMARY KEY(f1))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY, +f2 VARCHAR(10) NOT NULL DEFAULT '')ENGINE=InnoDB; +SET SESSION FOREIGN_KEY_CHECKS = OFF; +ALTER TABLE t2 CHANGE COLUMN f2 f3 VARCHAR(20) NOT NULL, +ADD CONSTRAINT t2_fk FOREIGN KEY(f3) REFERENCES t1(f1); +DROP TABLE t2, t1; +SET SESSION FOREIGN_KEY_CHECKS = ON; # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/fk_drop_alter.result mariadb-10.11.9/mysql-test/suite/innodb/r/fk_drop_alter.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/fk_drop_alter.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/fk_drop_alter.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,44 @@ +# +# MDEV-22230 : Unexpected ER_ERROR_ON_RENAME upon DROP +# non-existing FOREIGN KEY +# +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +ALTER TABLE t1 DROP FOREIGN KEY x, ALGORITHM=COPY; +ERROR 42000: Can't DROP FOREIGN KEY `x`; check that it exists +ALTER TABLE t1 DROP FOREIGN KEY x, ALGORITHM=INPLACE; +ERROR 42000: Can't DROP FOREIGN KEY `x`; check that it exists +DROP TABLE t1; +CREATE TABLE t1 (a INT, KEY(a)) ENGINE=InnoDB; +CREATE TABLE t2 (a INT, FOREIGN KEY fk_id (a) REFERENCES t1(a))ENGINE=InnoDB; +CREATE TABLE t3 (a INT, FOREIGN KEY fk_1 (a) REFERENCES t1(a))ENGINE=InnoDB; +ALTER TABLE t3 DROP FOREIGN KEY IF EXISTS fk_id; +Warnings: +Note 1091 Can't DROP FOREIGN KEY `fk_id`; check that it exists +DROP TABLE t3, t2; +ALTER TABLE t1 MODIFY COLUMN a VARCHAR(2), DROP FOREIGN KEY IF EXISTS x; +Warnings: +Note 1091 Can't DROP FOREIGN KEY `x`; check that it exists +DROP TABLE t1; +CREATE DATABASE best; +CREATE TABLE best.t1(f1 INT, KEY(f1))ENGINE=InnoDB; +CREATE TABLE best.t2(f1 INT, FOREIGN KEY foo(f1) REFERENCES t1(f1))ENGINE=InnoDB; +CREATE TABLE t1(f1 INT, KEY(f1))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, FOREIGN KEY foo(f1) REFERENCES t1(f1))ENGINE=InnoDB; +ALTER TABLE t2 DROP FOREIGN KEY foo; +ALTER TABLE t2 DROP FOREIGN KEY foo; +ERROR 42000: Can't DROP FOREIGN KEY `foo`; check that it exists +ALTER TABLE t2 DROP FOREIGN KEY IF EXISTS foo; +Warnings: +Note 1091 Can't DROP FOREIGN KEY `foo`; check that it exists +SHOW CREATE TABLE best.t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f1` int(11) DEFAULT NULL, + KEY `foo` (`f1`), + CONSTRAINT `foo` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +ID FOR_NAME REF_NAME N_COLS TYPE +best/foo best/t2 best/t1 1 0 +DROP TABLE best.t2, best.t1, t2, t1; +DROP DATABASE best; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/foreign-keys.result mariadb-10.11.9/mysql-test/suite/innodb/r/foreign-keys.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/foreign-keys.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/foreign-keys.result 2024-08-03 07:29:58.000000000 +0000 @@ -236,3 +236,10 @@ ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f2`) REFERENCES `t1` (`f1`)) DROP TABLE t2, t1; SET FOREIGN_KEY_CHECKS=DEFAULT; +CREATE TABLE t1(a SERIAL) ENGINE=InnoDB ROW_FORMAT=COMPRESSED PAGE_COMPRESSED=1; +ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") +SHOW WARNINGS; +Level Code Message +Warning 140 InnoDB: PAGE_COMPRESSED table can't have ROW_TYPE=COMPRESSED +Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options") +Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/foreign_key.result mariadb-10.11.9/mysql-test/suite/innodb/r/foreign_key.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/foreign_key.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/foreign_key.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,4 @@ +SET GLOBAL innodb_stats_persistent = 0; # # Bug #19027905 ASSERT RET.SECOND DICT_CREATE_FOREIGN_CONSTRAINTS_LOW # DICT_CREATE_FOREIGN_CONSTR @@ -154,6 +155,8 @@ FLUSH TABLES; # restart disconnect incomplete; +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; INSERT INTO child SET a=0; INSERT INTO child SET a=1; ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `parent` (`a`) ON DELETE CASCADE) @@ -722,7 +725,9 @@ 13 0 1 14 0 1 15 1 0 -disconnect con1; +connection con1; +COMMIT; +connection default; InnoDB 0 transactions not purged CHECK TABLE t1; Table Op Msg_type Msg_text @@ -900,8 +905,29 @@ ALTER TABLE t1 MODIFY id INT unsigned AUTO_INCREMENT; DROP TABLE t1,t2; # -# End of 10.4 tests +# MDEV-31441 BLOB corruption on UPDATE of PRIMARY KEY with FOREIGN KEY # +CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT) ENGINE=InnoDB; +CREATE TABLE t2 (pk INT PRIMARY KEY, FOREIGN KEY (pk) REFERENCES t1(pk)) +ENGINE=InnoDB; +SET @blob = REPEAT('A', @@innodb_page_size / 2); +INSERT INTO t1 SET pk=1, t=@blob; +INSERT INTO t2 SET pk=1; +connection con1; +BEGIN; +DELETE FROM t2; +connection default; +UPDATE t1 SET pk=12; +connection con1; +COMMIT; +disconnect con1; +connection default; +UPDATE t1 SET pk=1; +SELECT pk,t=@blob FROM t1; +pk t=@blob +1 1 +DROP TABLE t2, t1; +# End of 10.4 tests # # MDEV-20729 Fix REFERENCES constraint in column definition # @@ -1009,9 +1035,22 @@ INSERT INTO child SET a=1; ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `parent` (`a`)) connection default; +TRUNCATE TABLE parent; +ERROR 42000: Cannot truncate a table referenced in a foreign key constraint (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `test`.`parent` (`a`)) +DROP TABLE parent; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails +SET innodb_lock_wait_timeout=0; +RENAME TABLE parent TO transparent; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +ALTER TABLE parent FORCE, ALGORITHM=COPY; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +ALTER TABLE parent FORCE, ALGORITHM=INPLACE; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction SET innodb_lock_wait_timeout=0, foreign_key_checks=0; TRUNCATE TABLE parent; ERROR HY000: Lock wait timeout exceeded; try restarting transaction +DROP TABLE parent; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction ALTER TABLE parent FORCE, ALGORITHM=COPY; ERROR HY000: Lock wait timeout exceeded; try restarting transaction ALTER TABLE parent FORCE, ALGORITHM=INPLACE; @@ -1026,7 +1065,13 @@ ALTER TABLE parent FORCE, ALGORITHM=COPY; ALTER TABLE parent FORCE, ALGORITHM=INPLACE; ALTER TABLE parent ADD COLUMN b INT, ALGORITHM=INSTANT; -DROP TABLE child, parent; +SET foreign_key_checks=ON; +TRUNCATE TABLE parent; +ERROR 42000: Cannot truncate a table referenced in a foreign key constraint (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`a`) REFERENCES `test`.`parent` (`a`)) +ALTER TABLE parent FORCE, ALGORITHM=COPY; +ALTER TABLE parent FORCE, ALGORITHM=INPLACE; +RENAME TABLE parent TO transparent; +DROP TABLE child, transparent; # # MDEV-26217 Failing assertion: list.count > 0 in ut_list_remove # or Assertion `lock->trx == this' failed in dberr_t trx_t::drop_table @@ -1074,3 +1119,26 @@ disconnect con1; DROP TABLE binaries, collections; # End of 10.6 tests +CREATE TABLE t1 +( +f1 VARCHAR(32)BINARY NOT NULL, +f2 VARCHAR(32)BINARY NOT NULL, +PRIMARY KEY (f1), +INDEX(f2) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES('MySQL', 'InnoDB'), ('MariaDB', 'NDB'); +CREATE TABLE t2 +( +f1 VARCHAR(32)BINARY NOT NULL, +f2 VARCHAR(255)BINARY NOT NULL, +f3 int, PRIMARY KEY (f1), INDEX(f1), INDEX(f2) +) ENGINE=InnoDB; +INSERT INTO t2 VALUES('MySQL', 'MySQL', 1), +('MariaDB', 'MariaDB', 1); +ALTER TABLE t1 ADD FOREIGN KEY (f1) REFERENCES t2 (f2); +ALTER TABLE t2 ADD FOREIGN KEY (f2) REFERENCES t2 (f2), +ADD UNIQUE INDEX(f3); +ERROR HY000: Cannot delete rows from table which is parent in a foreign key constraint 't1_ibfk_1' of table 't1' +drop table t1, t2; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; +# End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/full_crc32_import.result mariadb-10.11.9/mysql-test/suite/innodb/r/full_crc32_import.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/full_crc32_import.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/full_crc32_import.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; FLUSH TABLES; # Treating compact format as dynamic format after import stmt CREATE TABLE t1 @@ -48,7 +50,15 @@ `b` blob DEFAULT NULL, `c` blob DEFAULT NULL, PRIMARY KEY (`a`) -) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC +) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC +# Auto increment value must be more than maximum column value +SELECT MAX(a) FROM t1; +MAX(a) +45 +SELECT auto_increment FROM information_schema.tables +WHERE table_name like 't1'; +auto_increment +46 UPDATE t1 set b = repeat("de", 100) where b = repeat("cd", 200); explain SELECT a FROM t1 where b = repeat("de", 100); id select_type table type possible_keys key key_len ref rows Extra @@ -130,7 +140,15 @@ `c2` point NOT NULL, `c3` linestring NOT NULL, PRIMARY KEY (`c1`) -) ENGINE=InnoDB AUTO_INCREMENT=16372 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC +) ENGINE=InnoDB AUTO_INCREMENT=14325 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC +# Auto increment value must be more than maximum column value +SELECT MAX(c1) FROM t1; +MAX(c1) +14324 +SELECT auto_increment FROM information_schema.tables +WHERE table_name like 't1'; +auto_increment +14325 UPDATE t1 SET C2 = ST_GeomFromText('POINT(0 0)'); SELECT COUNT(*) FROM t1; COUNT(*) @@ -200,3 +218,4 @@ 3 DROP TABLE t1; SET GLOBAL innodb_compression_algorithm=@save_algo; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/ibuf_not_empty.result mariadb-10.11.9/mysql-test/suite/innodb/r/ibuf_not_empty.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/ibuf_not_empty.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/ibuf_not_empty.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,6 +14,7 @@ Table Op Msg_type Msg_text test.t1 check Warning InnoDB: Index 'b' contains 990 entries, should be 1024. test.t1 check error Corrupt +SET GLOBAL innodb_buf_flush_list_now=ON; # restart: --innodb-force_recovery=0 SET GLOBAL innodb_fast_shutdown=0; # restart: --innodb-force_recovery=0 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/import_bugs.result mariadb-10.11.9/mysql-test/suite/innodb/r/import_bugs.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/import_bugs.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/import_bugs.result 2024-08-03 07:29:58.000000000 +0000 @@ -15,6 +15,84 @@ DROP TABLE imp_t1, t1; SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm; # +# MDEV-33400 Adaptive hash index corruption after DISCARD TABLESPACE +# +SET @save_adaptive=@@GLOBAL.innodb_adaptive_hash_index; +SET GLOBAL innodb_adaptive_hash_index=ON; +CREATE TABLE t (a INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t SELECT * FROM seq_1_to_131; +ALTER TABLE t ADD hid INT DEFAULT 2; +INSERT INTO t VALUES (251,1); +ALTER TABLE t DISCARD TABLESPACE; +CHECK TABLE mysql.innodb_table_stats; +Table Op Msg_type Msg_text +mysql.innodb_table_stats check status OK +DROP TABLE t; +SET GLOBAL innodb_adaptive_hash_index=@save_adaptive; +# End of 10.4 tests +# +# MDEV-18288: Transportable Tablespaces leave AUTO_INCREMENT in mismatched +# state, causing INSERT errors in newly imported tables when .cfg is not used. +# +CREATE TABLE t1( +id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, +PRIMARY KEY (id) +) ENGINE=INNODB; +CREATE TABLE t2 LIKE t1; +ALTER TABLE t2 DISCARD TABLESPACE; +INSERT INTO t1() VALUES(); +INSERT INTO t1() VALUES(); +FLUSH TABLES test.t1 FOR EXPORT; +# Copy data file +# Skip CFG file copy +UNLOCK TABLES; +DROP TABLE t1; +ALTER TABLE t2 IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t2.cfg', will attempt to import without schema verification +SELECT * FROM t2 ORDER BY id; +id +1 +2 +INSERT INTO t2() VALUES(); +INSERT INTO t2() VALUES(); +INSERT INTO t2() VALUES(); +SELECT * FROM t2 ORDER BY id; +id +1 +2 +3 +4 +5 +DROP TABLE t2; +# +# MDEV-34181 Instant table aborts after discard tablespace +# +CREATE TABLE t1(c3 INT, c2 INT, c1 INT KEY)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 1, 1), (2, 2, 2); +CREATE TABLE t2 (c1 INT KEY) ENGINE=InnoDB; +INSERT INTO t2 VALUES(1); +ALTER TABLE t2 ADD c2 INT; +FLUSH TABLES t1 FOR EXPORT; +UNLOCK TABLES; +ALTER TABLE t2 DISCARD TABLESPACE; +ALTER TABLE t2 ADD c3 INT FIRST; +Warnings: +Warning 1814 Tablespace has been discarded for table `t2` +ALTER TABLE t2 IMPORT TABLESPACE; +Warnings: +Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t2.cfg', will attempt to import without schema verification +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `c3` int(11) DEFAULT NULL, + `c1` int(11) NOT NULL, + `c2` int(11) DEFAULT NULL, + PRIMARY KEY (`c1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t2, t1; +# End of 10.5 tests +# # MDEV-27006 Assertion `!lock_trx_has_sys_table_locks(trx)' # failed in dberr_t row_discard_tablespace_for_mysql # (dict_table_t*, trx_t*) diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/import_hidden_fts.result mariadb-10.11.9/mysql-test/suite/innodb/r/import_hidden_fts.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/import_hidden_fts.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/import_hidden_fts.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,45 @@ +call mtr.add_suppression("InnoDB: Added system generated FTS_DOC_ID and FTS_DOC_ID_INDEX while importing the tablespace"); +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, +f2 CHAR(2) not null, fulltext f_idx(f2), +f3 INT as (f1) VIRTUAL, INDEX(f3), +f4 INT as (f1) STORED, INDEX(f4), +f5 INT as (f1) VIRTUAL)ENGINE=InnoDB; +INSERT INTO t1(f1, f2) VALUES(1, "on"); +INSERT INTO t1(f1, f2) SELECT seq, "si" FROM seq_2_to_256; +ALTER TABLE t1 ADD COLUMN f6 INT NOT NULL; +ALTER TABLE t1 DROP COLUMN f6; +ALTER TABLE t1 DROP INDEX f_idx; +connect con1,localhost,root,,; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; +DELETE FROM t1 WHERE f1 > 1; +FLUSH TABLE t1 FOR EXPORT; +Warnings: +Warning 1235 This version of MariaDB doesn't yet support 'FLUSH TABLES on a table that had an FTS index, created on a hidden column, the auxiliary tables haven't been dropped as yet. FTS auxiliary tables will not be flushed.' +Warning 1235 This version of MariaDB doesn't yet support 'FLUSH TABLES on a table that had an FTS index, created on a hidden column, the auxiliary tables haven't been dropped as yet. FTS auxiliary tables will not be flushed.' +backup: t1 +UNLOCK TABLES; +Warnings: +Warning 1235 This version of MariaDB doesn't yet support 'FLUSH TABLES on a table that had an FTS index, created on a hidden column, the auxiliary tables haven't been dropped as yet. FTS auxiliary tables will not be flushed.' +DROP TABLE t1; +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, +f2 CHAR(2) not null, +f3 INT as (f1) VIRTUAL, INDEX(f3), +f4 INT as (f1) STORED, INDEX(f4), +f5 INT as (f1) VIRTUAL)ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +restore: t1 .ibd and .cfg files +ALTER TABLE t1 IMPORT TABLESPACE; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) NOT NULL, + `f2` char(2) NOT NULL, + `f3` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL, + `f4` int(11) GENERATED ALWAYS AS (`f1`) STORED, + `f5` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL, + PRIMARY KEY (`f1`), + KEY `f3` (`f3`), + KEY `f4` (`f4`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/import_hidden_fts_debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/import_hidden_fts_debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/import_hidden_fts_debug.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/import_hidden_fts_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,76 @@ +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, +f2 CHAR(2) NOT NULL, FULLTEXT f_idx(f2), +f3 INT as (f1) VIRTUAL, INDEX(f3))ENGINE=InnoDB; +INSERT INTO t1(f1, f2) VALUES(1, "on"); +ALTER TABLE t1 DROP INDEX f_idx; +FLUSH TABLE t1 FOR EXPORT; +Warnings: +Warning 1235 This version of MariaDB doesn't yet support 'FLUSH TABLES on a table that had an FTS index, created on a hidden column, the auxiliary tables haven't been dropped as yet. FTS auxiliary tables will not be flushed.' +Warning 1235 This version of MariaDB doesn't yet support 'FLUSH TABLES on a table that had an FTS index, created on a hidden column, the auxiliary tables haven't been dropped as yet. FTS auxiliary tables will not be flushed.' +backup: t1 +UNLOCK TABLES; +Warnings: +Warning 1235 This version of MariaDB doesn't yet support 'FLUSH TABLES on a table that had an FTS index, created on a hidden column, the auxiliary tables haven't been dropped as yet. FTS auxiliary tables will not be flushed.' +DROP TABLE t1; +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, +f2 CHAR(2) NOT NULL, +f3 CHAR(2) NOT NULL, +f4 INT AS (f1) VIRTUAL, INDEX(f4))ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +restore: t1 .ibd and .cfg files +ALTER TABLE t1 IMPORT TABLESPACE; +ERROR HY000: Schema mismatch (Number of indexes don't match, table has 2 indexes but the tablespace meta-data file has 3 indexes) +DROP TABLE t1; +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, +f2 CHAR(2) NOT NULL, +f3 INT as (f1) VIRTUAL, INDEX(f3))ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +restore: t1 .ibd and .cfg files +SET DEBUG_DBUG="+d,ib_import_set_index_root_failure"; +ALTER TABLE t1 IMPORT TABLESPACE; +ERROR HY000: Too many active concurrent transactions +SET DEBUG_DBUG="-d,ib_import_set_index_root_failure"; +SET DEBUG_DBUG="+d,ib_import_vcol_update_fail"; +ALTER TABLE t1 IMPORT TABLESPACE; +ERROR 23000: Can't write; duplicate key in table 't1' +SET DEBUG_DBUG="-d,ib_import_vcol_update_fail"; +restore: t1 .ibd and .cfg files +SET DEBUG_DBUG="+d,ib_import_fts_error"; +ALTER TABLE t1 IMPORT TABLESPACE; +ERROR 23000: Can't write; duplicate key in table 't1' +SET DEBUG_DBUG="-d,ib_import_fts_error"; +unlink: t1.ibd +unlink: t1.cfg +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS +WHERE table_id IN (SELECT table_id FROM information_schema.innodb_sys_tables where name="test/t1"); +NAME +f1 +f2 +f3 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) NOT NULL, + `f2` char(2) NOT NULL, + `f3` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL, + PRIMARY KEY (`f1`), + KEY `f3` (`f3`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, +FTS_DOC_ID BIGINT SIGNED NOT NULL, +f2 CHAR(2) NOT NULL, +FULLTEXT f_idx(f2))ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 1, "on"); +ALTER TABLE t1 DROP INDEX f_idx; +FLUSH TABLE t1 FOR EXPORT; +backup: t1 +UNLOCK TABLES; +DROP TABLE t1; +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, +f2 CHAR(2) NOT NULL)ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +restore: t1 .ibd and .cfg files +ALTER TABLE t1 IMPORT TABLESPACE; +ERROR HY000: Schema mismatch (Column f2 ordinal value mismatch, it's at 1 in the table and 2 in the tablespace meta-data file) +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/import_update_stats.result mariadb-10.11.9/mysql-test/suite/innodb/r/import_update_stats.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/import_update_stats.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/import_update_stats.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,72 @@ +SET @old_innodb_file_per_table = @@innodb_file_per_table; +SET GLOBAL innodb_file_per_table = 1; +SELECT @@innodb_file_per_table; +@@innodb_file_per_table +1 +CREATE TABLE t1 ( +col_1 CHAR (255), +col_2 VARCHAR (255) +) ENGINE = InnoDB; +CREATE INDEX idx1 ON t1(col_1); +CREATE INDEX idx2 ON t1(col_2); +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 0 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 0 NULL NULL YES BTREE NO +INSERT INTO t1 VALUES ("col1_00001", "col2_00001"), ("col1_00002", "col2_00002"); +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 2 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 2 NULL NULL YES BTREE NO +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 2 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 2 NULL NULL YES BTREE NO +FLUSH TABLES t1 FOR EXPORT; +backup: t1 +UNLOCK TABLES; +DROP TABLE t1; +CREATE TABLE t1 ( +col_1 CHAR (255), +col_2 VARCHAR (255) +) ENGINE = InnoDB STATS_PERSISTENT=1; +CREATE INDEX idx1 ON t1(col_1); +CREATE INDEX idx2 ON t1(col_2); +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 0 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 0 NULL NULL YES BTREE NO +INSERT INTO t1 VALUES ("col1_00001", "col2_00001"); +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 1 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 1 NULL NULL YES BTREE NO +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 1 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 1 NULL NULL YES BTREE NO +ALTER TABLE t1 DISCARD TABLESPACE; +restore: t1 .ibd and .cfg files +ALTER TABLE t1 IMPORT TABLESPACE; +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 2 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 2 NULL NULL YES BTREE NO +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +SHOW INDEXES FROM t1; +Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored +t1 1 idx1 1 col_1 A 2 NULL NULL YES BTREE NO +t1 1 idx2 1 col_2 A 2 NULL NULL YES BTREE NO +DROP TABLE t1; +SET GLOBAL innodb_file_per_table = @old_innodb_file_per_table; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/index_length.result mariadb-10.11.9/mysql-test/suite/innodb/r/index_length.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/index_length.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/index_length.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,31 @@ +connect stop_purge,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; +CREATE TABLE t1(a INT PRIMARY KEY, b VARCHAR(1024)) +ENGINE=InnoDB STATS_PERSISTENT=1; +INSERT INTO t1 VALUES (1,REPEAT('b',1024)); +SELECT index_length FROM information_schema.tables +WHERE table_schema = 'test' AND table_name = 't1'; +index_length +0 +ALTER TABLE t1 ADD INDEX b (b(800)); +SELECT FLOOR(index_length/@@innodb_page_size) FROM information_schema.tables +WHERE table_schema = 'test' AND table_name = 't1'; +FLOOR(index_length/@@innodb_page_size) +1 +ALTER TABLE t1 ADD INDEX ba (b(800),a); +SELECT FLOOR(index_length/@@innodb_page_size) FROM information_schema.tables +WHERE table_schema = 'test' AND table_name = 't1'; +FLOOR(index_length/@@innodb_page_size) +2 +disconnect stop_purge; +DROP TABLE t1; +# +# MDEV-22855 Assertion (!field->prefix_len || +# field->fixed_len == field->prefix_len) +# failed in btr_node_ptr_max_size +# +CREATE TABLE t1(c CHAR(194) CHARACTER SET UTF32, KEY k1(c(193)))ENGINE=InnoDB; +INSERT INTO t1 SET c=''; +DROP TABLE t1; +# End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/index_merge_threshold.result mariadb-10.11.9/mysql-test/suite/innodb/r/index_merge_threshold.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/index_merge_threshold.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/index_merge_threshold.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; CREATE TABLE tab(a BIGINT PRIMARY KEY,c1 TINYTEXT,c2 TEXT,c3 MEDIUMTEXT, c4 TINYBLOB,c5 BLOB,c6 MEDIUMBLOB,c7 LONGBLOB) ENGINE=InnoDB; CREATE INDEX index1 ON tab(c1(255)) COMMENT 'Check index level merge MERGE_THRESHOLD=51'; @@ -1307,3 +1309,4 @@ index_page_merge_attempts 2 index_page_merge_successful 2 DROP TABLE tab1; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-16k.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-16k.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-16k.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-16k.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; call mtr.add_suppression("InnoDB: Cannot add field .* in table"); # Test 1) Show the page size from Information Schema SELECT variable_value FROM information_schema.global_status @@ -505,6 +507,7 @@ DROP TABLE t1; InnoDB 0 transactions not purged SET GLOBAL innodb_compression_level=@save_level; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; DROP TABLE t1_purge, t2_purge, t3_purge, t4_purge; DROP TABLE tlong; DROP TABLE tlong2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-32k.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-32k.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-32k.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-32k.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,25 @@ +SET GLOBAL innodb_stats_persistent = 0; call mtr.add_suppression("Innodb: Cannot add field.*row size is"); +SET SESSION innodb_strict_mode=ON; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") +SET SESSION innodb_strict_mode=OFF; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +DROP TABLE t1; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +Warnings: +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +DROP TABLE t1; # Test 1) Show the page size from Information Schema SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-64k.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-64k.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-64k.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-64k.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,24 @@ call mtr.add_suppression('InnoDB: Cannot add field.*because after adding it, the row size is'); +SET SESSION innodb_strict_mode=ON; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") +SET SESSION innodb_strict_mode=OFF; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +Warnings: +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +DROP TABLE t1; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +Warnings: +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +SHOW WARNINGS; +Level Code Message +Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. Assuming ROW_FORMAT=DYNAMIC. +DROP TABLE t1; # Test 1) Show the page size from Information Schema SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-ac-non-locking-select.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-ac-non-locking-select.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-ac-non-locking-select.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-ac-non-locking-select.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,62 @@ +CREATE TABLE t1 (c1 INT , c2 CHAR(10), PRIMARY KEY (c1)) ENGINE = InnoDB; +INSERT INTO t1 VALUES(0, "0"); +INSERT INTO t1 VALUES(1, "1"); +INSERT INTO t1 VALUES(2, "2"); +INSERT INTO t1 VALUES(3, "3"); +connect con1,localhost,root,,; +connect con2,localhost,root,,; +connect con3,localhost,root,,; +connect con4,localhost,root,,; +connect con5,localhost,root,,; +connect con6,localhost,root,,; +connection default; +SET AUTOCOMMIT=0; +BEGIN; +SELECT * FROM t1 FOR UPDATE; +c1 c2 +0 0 +1 1 +2 2 +3 3 +SELECT * FROM t1 WHERE c1 <= 3; +c1 c2 +0 0 +1 1 +2 2 +3 3 +connection default; +SET DEBUG_SYNC='now WAIT_FOR waiting4'; +SET DEBUG_SYNC= 'RESET'; +SELECT trx_state, trx_query, trx_autocommit_non_locking +FROM INFORMATION_SCHEMA.INNODB_TRX +WHERE trx_state = 'LOCK WAIT' +ORDER BY trx_query; +trx_state trx_query trx_autocommit_non_locking +LOCK WAIT SELECT COUNT(*) FROM t1 LOCK IN SHARE MODE 0 +LOCK WAIT SELECT COUNT(*) FROM t1 WHERE c1 >= 0 0 +INSERT INTO t1 VALUES(4, '4'); +COMMIT; +connection con6; +SELECT * FROM t1 WHERE c1 <= 4; +c1 c2 +0 0 +1 1 +2 2 +3 3 +XA END '1'; +XA PREPARE '1'; +XA ROLLBACK '1'; +disconnect con6; +disconnect con2; +disconnect con3; +disconnect con5; +connection con1; +COUNT(*) +5 +disconnect con1; +connection con4; +COUNT(*) +5 +disconnect con4; +connection default; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-alter-debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter-debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-alter-debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter-debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -108,11 +108,11 @@ # MDEV-26772 InnoDB DDL fails with DUPLICATE KEY error # create table t1(f1 int not null primary key, -f2 int not null, index idx(f2))engine=innodb; +f2 int not null, index idx(f2), index i(f2,f1))engine=innodb; insert into t1 values(1, 1); connect con1,localhost,root,,,; SET DEBUG_SYNC='before_delete_table_stats SIGNAL blocked WAIT_FOR go'; -SET innodb_lock_wait_timeout=0; +SET STATEMENT innodb_lock_wait_timeout=0 FOR ALTER TABLE t1 FORCE, ALGORITHM=COPY; connection default; SET DEBUG_SYNC='now WAIT_FOR blocked'; @@ -124,6 +124,17 @@ connection default; COMMIT; SET DEBUG_SYNC=RESET; +RENAME TABLE mysql.innodb_table_stats TO mysql.innodb_table_stats_hidden; +connection con1; +SET DEBUG_SYNC='innodb_commit_inplace_before_lock SIGNAL blocked WAIT_FOR go'; +ALTER TABLE t1 DROP INDEX i; +connection default; +SET DEBUG_SYNC='now WAIT_FOR blocked'; +RENAME TABLE mysql.innodb_table_stats_hidden TO mysql.innodb_table_stats; +SET DEBUG_SYNC='now SIGNAL go'; +connection con1; +connection default; +SET DEBUG_SYNC=RESET; connection con1; ALTER TABLE t1 RENAME KEY idx TO idx1, ALGORITHM=COPY; disconnect con1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-alter-tempfile.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter-tempfile.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-alter-tempfile.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter-tempfile.result 2024-08-03 07:29:58.000000000 +0000 @@ -44,8 +44,6 @@ # restart disconnect con1; SHOW KEYS FROM t1; -Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored -t1 1 f1 1 f1 A # NULL NULL BTREE NO DROP TABLE t1; # # MDEV-25503 InnoDB hangs on startup during recovery diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-alter.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-alter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-alter.result 2024-08-03 07:29:58.000000000 +0000 @@ -1090,3 +1090,59 @@ # Cleanup SET @@SQL_MODE= @OLD_SQL_MODE; DROP TABLE t1; +# +# Bug#20977779 CANNOT IMPORT TABLES CONTAINING PREFIX INDEXES +# +CREATE TABLE t1 (c1 VARCHAR(32), c2 VARCHAR(32), c3 VARCHAR(32), +PRIMARY KEY (c1, c2, c3)) +ENGINE=InnoDB; +ALTER TABLE t1 ADD INDEX ind1(c1(5), c2, c3); +ALTER TABLE t1 ADD INDEX ind2(c3, c1(10), c2); +ALTER TABLE t1 ADD INDEX ind3(c2, c3, c1(20)); +INSERT INTO t1 VALUES ('Test Data -1', 'Test Data -2', 'Test Data -3'); +# Test with 2ndary index having prefix +FLUSH TABLES test.t1 FOR EXPORT; +UNLOCK TABLES; +ALTER TABLE test.t1 DISCARD TABLESPACE; +ALTER TABLE test.t1 IMPORT TABLESPACE; +CHECK TABLE test.t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SHOW CREATE TABLE test.t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(32) NOT NULL, + `c2` varchar(32) NOT NULL, + `c3` varchar(32) NOT NULL, + PRIMARY KEY (`c1`,`c2`,`c3`), + KEY `ind1` (`c1`(5),`c2`,`c3`), + KEY `ind2` (`c3`,`c1`(10),`c2`), + KEY `ind3` (`c2`,`c3`,`c1`(20)) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT * FROM test.t1; +c1 c2 c3 +Test Data -1 Test Data -2 Test Data -3 +# Test with PK & 2ndary index with prefix +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c1(5), c2(10), c3(20)); +FLUSH TABLES test.t1 FOR EXPORT; +UNLOCK TABLES; +ALTER TABLE test.t1 DISCARD TABLESPACE; +ALTER TABLE test.t1 IMPORT TABLESPACE; +CHECK TABLE test.t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SHOW CREATE TABLE test.t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c1` varchar(32) NOT NULL, + `c2` varchar(32) NOT NULL, + `c3` varchar(32) NOT NULL, + PRIMARY KEY (`c1`(5),`c2`(10),`c3`(20)), + KEY `ind1` (`c1`(5),`c2`,`c3`), + KEY `ind2` (`c3`,`c1`(10),`c2`), + KEY `ind3` (`c2`,`c3`,`c1`(20)) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT * FROM test.t1; +c1 c2 c3 +Test Data -1 Test Data -2 Test Data -3 +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-blob.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-blob.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-blob.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-blob.result 2024-08-03 07:29:58.000000000 +0000 @@ -20,8 +20,6 @@ 2 bbbbbbbbbbbbbbbbbbbb connection default; SET DEBUG='+d,row_ins_extern_checkpoint'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET DEBUG_SYNC='before_row_ins_extern_latch SIGNAL rec_not_blob WAIT_FOR crash'; ROLLBACK; BEGIN; @@ -88,8 +86,6 @@ INSERT INTO t2 VALUES (347); connection default; SET DEBUG='+d,row_upd_extern_checkpoint'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET DEBUG_SYNC='before_row_upd_extern SIGNAL have_latch WAIT_FOR crash'; UPDATE t3 SET c=REPEAT('i',3000) WHERE a=2; connection con2; @@ -126,8 +122,6 @@ INSERT INTO t2 VALUES (33101); connection default; SET DEBUG='+d,row_upd_extern_checkpoint'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET DEBUG_SYNC='after_row_upd_extern SIGNAL have_latch WAIT_FOR crash'; UPDATE t3 SET c=REPEAT('j',3000) WHERE a=2; connection con2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-index-debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-index-debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -92,8 +92,6 @@ connection default; SET DEBUG_SYNC= 'now WAIT_FOR opened'; SET debug = '+d,row_log_tmpfile_fail'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead INSERT INTO t1 select NULL,'aaa','bbb' from t480; INSERT INTO t1 select NULL,'aaaa','bbbb' from t480; SET DEBUG_SYNC= 'now SIGNAL flushed'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-index-online-fk.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-online-fk.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-index-online-fk.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-online-fk.result 2024-08-03 07:29:58.000000000 +0000 @@ -608,3 +608,70 @@ test/fw c a 0 DROP TABLE t2; DROP TABLE t3; +# Bug #17449901 TABLE DISAPPEARS WHEN ALTERING +# WITH FOREIGN KEY CHECKS OFF +create table t1(f1 int,primary key(f1))engine=innodb; +create table t2(f2 int,f3 int,key t(f2,f3),foreign key(f2) references t1(f1))engine=innodb; +SET foreign_key_checks=0; +drop index t on t2; +drop table t2; +drop table t1; +create table t1(f1 int ,primary key(f1))engine=innodb; +create table t2(f2 int,f3 int, key t(f2),foreign key(f2) references t1(f1))engine=innodb; +SET foreign_key_checks = 0; +alter table t2 drop key t,algorithm=inplace; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f2` int(11) DEFAULT NULL, + `f3` int(11) DEFAULT NULL, + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f2`) REFERENCES `t1` (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table t2; +drop table t1; +create table t1(f1 int ,primary key(f1))engine=innodb; +create table t2(f2 int,f3 int, key t(f2),key t1(f2,f3), +foreign key(f2) references t1(f1))engine=innodb; +SET foreign_key_checks = 0; +alter table t2 drop key t,algorithm=inplace; +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `f2` int(11) DEFAULT NULL, + `f3` int(11) DEFAULT NULL, + KEY `t1` (`f2`,`f3`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f2`) REFERENCES `t1` (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table t2; +drop table t1; +# +# MDEV-29092 FOREIGN_KEY_CHECKS does not prevent non-copy +# alter from creating invalid FK structures +# +CREATE TABLE t1(f1 INT, KEY(f1), +FOREIGN KEY(f1) references t1(f1))ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL, + KEY `f1` (`f1`), + CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; +CREATE TABLE t1(f1 INT, KEY(f1), +FOREIGN KEY(f1) REFERENCES t1(f1))ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL, + KEY `f1` (`f1`), + CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +ALTER TABLE t1 DROP KEY f1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `f1` int(11) DEFAULT NULL, + CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-index-online.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-online.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-index-online.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-index-online.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET GLOBAL innodb_monitor_reset_all=all; +SET GLOBAL innodb_monitor_reset_all=default; call mtr.add_suppression("InnoDB: Warning: Small buffer pool size"); SET @global_innodb_file_per_table_orig = @@global.innodb_file_per_table; SET GLOBAL innodb_file_per_table = on; @@ -155,6 +157,7 @@ connection con1; KILL QUERY @id; ERROR 70100: Query execution was interrupted +SET GLOBAL innodb_max_purge_lag_wait=0; SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2d_created WAIT_FOR kill_done'; CREATE INDEX c2d ON t1(c2); connection default; @@ -221,13 +224,13 @@ ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=1 connection default; SET @merge_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); connection con1; SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2e_created WAIT_FOR dml2_done'; @@ -274,13 +277,13 @@ c2 0 c3 1 SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SELECT (@merge_encrypt_1-@merge_encrypt_0)- @@ -320,16 +323,16 @@ ddl_sort_file_alter_table 0 ddl_log_file_alter_table 1 SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); connection con1; SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2f_created WAIT_FOR dml3_done'; @@ -405,16 +408,16 @@ ddl_log_file_alter_table 2 connection default; SET @merge_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SELECT (@merge_encrypt_2-@merge_encrypt_1)- diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-lock-inherit-read_commited.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-lock-inherit-read_commited.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-lock-inherit-read_commited.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-lock-inherit-read_commited.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,121 @@ +# +# Bug #21025880 DUPLICATE UK VALUES IN READ-COMMITTED(AGAIN) +# +CREATE TABLE t1 ( +a INT NOT NULL, +b INT NOT NULL, +PRIMARY KEY(b), +UNIQUE KEY(a)) +ENGINE=INNODB; +SET @old_innodb_stats_auto_recalc = @@innodb_stats_auto_recalc; +SET GLOBAL innodb_stats_auto_recalc = OFF; +connect purge_control,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; +SET @old_tx_isolation = @@tx_isolation; +SET GLOBAL tx_isolation = 'READ-COMMITTED'; +SET @old_innodb_lock_wait_timeout = @@innodb_lock_wait_timeout; +SET GLOBAL innodb_lock_wait_timeout = 1; +connect con1,localhost,root,,; +INSERT INTO t1 VALUES (1,1),(2,2); +DELETE FROM t1; +SET debug_sync = 'row_ins_sec_index_entry_dup_locks_created SIGNAL +con1_locks_done WAIT_FOR con1_go'; +SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL +con1_insert_done WAIT_FOR con1_finish'; +REPLACE INTO t1 VALUES (1,2); +connect con2,localhost,root,,; +SET debug_sync = 'now WAIT_FOR con1_locks_done'; +SET debug_sync = 'lock_wait_start SIGNAL con2_blocked +WAIT_FOR con2_go'; +SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock +WAIT_FOR con2_finish'; +SET debug_sync = 'ib_after_row_insert SIGNAL con2_insert_done'; +REPLACE INTO t1 VALUES (1,3); +connection default; +SET debug_sync = 'now WAIT_FOR con2_blocked'; +connection purge_control; +COMMIT; +disconnect purge_control; +connection default; +InnoDB 0 transactions not purged +SET debug_sync = 'now SIGNAL con2_go WAIT_FOR con2_insert_done'; +SET debug_sync = 'now SIGNAL con1_go WAIT_FOR con1_insert_done'; +SET debug_sync = 'now SIGNAL con1_finish'; +connection con1; +disconnect con1; +connection default; +SET debug_sync = 'now SIGNAL con2_finish'; +connection con2; +disconnect con2; +connection default; +SET DEBUG_SYNC= 'RESET'; +SELECT * FROM t1; +a b +1 2 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +SET GLOBAL innodb_stats_auto_recalc = @old_innodb_stats_auto_recalc; +SET GLOBAL tx_isolation = @old_tx_isolation; +SET GLOBAL innodb_lock_wait_timeout = @old_innodb_lock_wait_timeout; +CREATE TABLE t1 ( +a INT NOT NULL, +b INT NOT NULL, +PRIMARY KEY(b), +UNIQUE KEY(a)) +ENGINE=INNODB; +SET @old_innodb_stats_auto_recalc = @@innodb_stats_auto_recalc; +SET GLOBAL innodb_stats_auto_recalc = OFF; +connect purge_control,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; +SET @old_tx_isolation = @@tx_isolation; +SET GLOBAL tx_isolation = 'READ-COMMITTED'; +SET @old_innodb_lock_wait_timeout = @@innodb_lock_wait_timeout; +SET GLOBAL innodb_lock_wait_timeout = 1; +connect con1,localhost,root,,; +INSERT INTO t1 VALUES (1,1),(2,2); +DELETE FROM t1; +SET debug_sync = 'row_ins_sec_index_entry_dup_locks_created SIGNAL +con1_locks_done WAIT_FOR con1_go'; +SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL +con1_insert_done WAIT_FOR con1_finish'; +INSERT INTO t1 values (1,2) ON DUPLICATE KEY UPDATE a=2; +connect con2,localhost,root,,; +SET debug_sync = 'now WAIT_FOR con1_locks_done'; +SET debug_sync = 'lock_wait_start SIGNAL con2_blocked +WAIT_FOR con2_go'; +SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock +WAIT_FOR con2_finish'; +SET debug_sync = 'ib_after_row_insert SIGNAL con2_insert_done'; +REPLACE INTO t1 VALUES (1,3); +connection default; +SET debug_sync = 'now WAIT_FOR con2_blocked'; +connection purge_control; +COMMIT; +disconnect purge_control; +connection default; +InnoDB 0 transactions not purged +SET debug_sync = 'now SIGNAL con2_go WAIT_FOR con2_insert_done'; +SET debug_sync = 'now SIGNAL con1_go WAIT_FOR con1_insert_done'; +SET debug_sync = 'now SIGNAL con1_finish'; +connection con1; +disconnect con1; +connection default; +SET debug_sync = 'now SIGNAL con2_finish'; +connection con2; +disconnect con2; +connection default; +SET DEBUG_SYNC= 'RESET'; +SELECT * FROM t1; +a b +1 2 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +SET GLOBAL innodb_stats_auto_recalc = @old_innodb_stats_auto_recalc; +SET GLOBAL tx_isolation = @old_tx_isolation; +SET GLOBAL innodb_lock_wait_timeout = @old_innodb_lock_wait_timeout; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-lru-force-no-free-page.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -call mtr.add_suppression("InnoDB: Difficult to find free blocks in the buffer pool"); -SET @saved_debug = @@SESSION.debug_dbug; -SET SESSION debug_dbug="+d,ib_lru_force_no_free_page"; -CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB; -BEGIN; -INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200)); -COMMIT; -SET debug_dbug = @saved_debug; -DROP TABLE t1; -FOUND 1 /InnoDB: Difficult to find free blocks / in mysqld.1.err diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-read-view.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-read-view.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-read-view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-read-view.result 2024-08-03 07:29:58.000000000 +0000 @@ -9,9 +9,6 @@ INSERT INTO t2 VALUES(2, "c"); INSERT INTO t2 VALUES(3, "d"); connect con1,localhost,root,,; -connect con2,localhost,root,,; -connection con1; -'T1' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t2; @@ -21,7 +18,6 @@ 2 c 3 d connection default; -'T2' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t1; @@ -30,8 +26,7 @@ 1 1 2 2 3 3 -connection con2; -'T3' +connect con2,localhost,root,,; SET AUTOCOMMIT=0; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; @@ -48,7 +43,6 @@ 2 c 3 d connection con1; -'T1' UPDATE t2 SET c1 = c1 + 100; SELECT * FROM t2; c1 c2 @@ -58,7 +52,6 @@ 103 d COMMIT; connection default; -'T2' UPDATE t1 SET c1 = c1 + 100; SELECT * FROM t1; c1 c2 @@ -68,42 +61,29 @@ 103 3 COMMIT; connection con2; -'T3' SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1'; SELECT * FROM t1;; connection default; -'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; -'Signalled T3' connection con2; -'T3' c1 c2 0 0 1 1 2 2 3 3 connection con2; -'T3' SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1'; SELECT * FROM t2;; connection default; -'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; -'Signalled T3' connection con2; -'T3' c1 c2 0 a 1 b 2 c 3 d connection default; -disconnect con1; -disconnect con2; -connect con1,localhost,root,,; -connect con2,localhost,root,,; connection con1; -'T1' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t1; @@ -113,7 +93,6 @@ 102 2 103 3 connection default; -'T2' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t2; @@ -131,7 +110,6 @@ 203 d COMMIT; connection con2; -'T3' SET AUTOCOMMIT=0; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; @@ -148,7 +126,6 @@ 202 c 203 d connection con1; -'T1' UPDATE t1 SET c1 = c1 + 100; SELECT * FROM t1; c1 c2 @@ -158,44 +135,34 @@ 203 3 COMMIT; connection con2; -'T3' SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1'; SELECT * FROM t1;; connection con1; -'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; -'Signalled T3' connection con2; -'T3' c1 c2 100 0 101 1 102 2 103 3 -connection con2; -'T3' SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1'; SELECT * FROM t2;; connection default; -'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; -'Signalled T3' connection con2; -'T3' c1 c2 200 a 201 b 202 c 203 d -connection default; -disconnect con1; disconnect con2; +connection default; DROP TABLE t1; DROP TABLE t2; # # Bug 21433768: NON-REPEATABLE READ WITH REPEATABLE READ ISOLATION # -connect con1,localhost,root,,; +connection con1; CREATE TABLE t1(col1 INT PRIMARY KEY, col2 INT) ENGINE = InnoDB; INSERT INTO t1 values (1, 0), (2, 0); SELECT * FROM t1 ORDER BY col1; @@ -218,5 +185,5 @@ connection con1; disconnect con1; connection default; -DROP TABLE t1; SET DEBUG_SYNC= 'RESET'; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-system-table-view.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-system-table-view.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-system-table-view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-system-table-view.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; SELECT table_id INTO @table_stats_id FROM information_schema.innodb_sys_tables WHERE name = 'mysql/innodb_table_stats'; SELECT table_id INTO @index_stats_id FROM information_schema.innodb_sys_tables @@ -173,3 +175,4 @@ SELECT SPACE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE name like 'innodb_temporary'; SPACE 4294967294 +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-table-online.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-table-online.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-table-online.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-table-online.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET GLOBAL innodb_monitor_reset_all=all; +SET GLOBAL innodb_monitor_reset_all=default; call mtr.add_suppression("InnoDB: Warning: Small buffer pool size"); call mtr.add_suppression("InnoDB: Error: table 'test/t1'"); call mtr.add_suppression("MariaDB is trying to open a table handle but the .ibd file for"); @@ -38,16 +40,10 @@ ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; ERROR HY000: Out of memory. SET SESSION DEBUG = @saved_debug_dbug; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET SESSION DEBUG = '+d,innodb_OOM_inplace_alter'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; ERROR HY000: Out of memory. SET SESSION DEBUG = @saved_debug_dbug; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ALGORITHM=INPLACE, LOCK=NONE; connection default; SHOW CREATE TABLE t1; @@ -179,13 +175,13 @@ test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK SET @merge_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); connection con1; SHOW CREATE TABLE t1; @@ -237,13 +233,13 @@ ddl_sort_file_alter_table 0 ddl_log_file_alter_table 1 SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SELECT (@merge_encrypt_1-@merge_encrypt_0)- @@ -263,16 +259,16 @@ ddl_sort_file_alter_table 0 ddl_log_file_alter_table 1 SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SET GLOBAL innodb_max_purge_lag_wait=0; SET DEBUG_SYNC = 'row_log_table_apply1_before SIGNAL rebuilt3 WAIT_FOR dml3_done'; @@ -320,16 +316,16 @@ Table Op Msg_type Msg_text test.t1 check status OK SET @merge_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SELECT (@merge_encrypt_2-@merge_encrypt_1)- diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-truncate.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-truncate.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-truncate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-truncate.result 2024-08-03 07:29:58.000000000 +0000 @@ -86,11 +86,10 @@ CREATE TABLE t3 (a INT) ENGINE=InnoDB; ERROR HY000: Can't create table `test`.`t3` (errno: 150 "Foreign key constraint is incorrectly formed") ALTER TABLE t1 RENAME TO t3; -ERROR HY000: Error on rename of './test/t1' to './test/t3' (errno: 150 "Foreign key constraint is incorrectly formed") -ALTER TABLE t1 FORCE; -TRUNCATE TABLE t1; -ERROR 42000: Cannot truncate a table referenced in a foreign key constraint (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f2`) REFERENCES `test`.`t1` (`f2`)) -DROP TABLE t2, t1; +ALTER TABLE t3 FORCE; +TRUNCATE TABLE t3; +ERROR 42000: Cannot truncate a table referenced in a foreign key constraint (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f2`) REFERENCES `test`.`t3` (`f2`)) +DROP TABLE t2, t3; # # MDEV-24861 Assertion `trx->rsegs.m_redo.rseg' failed # in innodb_prepare_commit_versioned diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-wl5522,crc32.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522,crc32.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-wl5522,crc32.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522,crc32.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -120,121c120 -< Warnings: -< Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t2.cfg', will attempt to import without schema verification ---- -> ERROR HY000: Schema mismatch (Expected FSP_SPACE_FLAGS=0x*, .ibd file contains 0x*.) diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-wl5522,strict_crc32.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522,strict_crc32.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-wl5522,strict_crc32.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522,strict_crc32.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,12 @@ -120,121c120 -< Warnings: -< Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t2.cfg', will attempt to import without schema verification ---- -> ERROR HY000: Schema mismatch (Expected FSP_SPACE_FLAGS=0x*, .ibd file contains 0x*.) +--- innodb-wl5522.result ++++ innodb-wl5522,strict_crc32.result~ +@@ -131,8 +131,7 @@ + ALTER TABLE t2 IMPORT TABLESPACE; + ERROR HY000: Schema mismatch (Table flags don't match, server table has 0x21 and the meta-data file has 0x1; .cfg file uses ROW_FORMAT=COMPACT) + ALTER TABLE t2 IMPORT TABLESPACE; +-Warnings: +-Warning 1810 IO Read error: (2, No such file or directory) Error opening './test/t2.cfg', will attempt to import without schema verification ++ERROR HY000: Schema mismatch (Expected FSP_SPACE_FLAGS=0x*, .ibd file contains 0x*.) + DROP TABLE t2; + SET GLOBAL innodb_file_per_table = 1; + SELECT @@innodb_file_per_table; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-wl5522-1.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522-1.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb-wl5522-1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb-wl5522-1.result 2024-08-03 07:29:58.000000000 +0000 @@ -808,6 +808,18 @@ ALTER TABLE t1 IMPORT TABLESPACE; ERROR 42000: Table 't1' uses an extension that doesn't exist in this MariaDB version DROP TABLE t1; -# # End of 10.3 tests # +# MDEV-29972 crash after "Unsupported meta-data version number" +# +call mtr.add_suppression("Index for table 't2' is corrupt"); +CREATE TABLE t2 (i INT PRIMARY KEY) ENGINE=InnoDB; +ALTER TABLE t2 DISCARD TABLESPACE; +ALTER TABLE t2 IMPORT TABLESPACE; +ERROR 42000: This version of MariaDB doesn't yet support 'meta-data version' +ALTER TABLE t2 IMPORT TABLESPACE; +ERROR HY000: Index for table 't2' is corrupt; try to repair it +SELECT * FROM t2; +ERROR HY000: Tablespace has been discarded for table `t2` +DROP TABLE t2; +# End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -2472,7 +2472,7 @@ DELETE FROM t1 WHERE id = 1; ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `c1` FOREIGN KEY (`v`) REFERENCES `t1` (`id`)) DROP TABLE t1; -ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `c1` FOREIGN KEY (`v`) REFERENCES `t1` (`id`)) +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails SET FOREIGN_KEY_CHECKS=0; DROP TABLE t1; SET FOREIGN_KEY_CHECKS=1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_buffer_pool_dump_pct.result 2024-08-03 07:29:58.000000000 +0000 @@ -3,17 +3,8 @@ CREATE INDEX idx1 ON tab5(col2(10)); CREATE INDEX idx2 ON tab5(col3(10)); SET GLOBAL innodb_buffer_pool_dump_pct=100; -SELECT variable_value INTO @IBPDS -FROM information_schema.global_status -WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS'; SET GLOBAL innodb_buffer_pool_dump_now=ON; SET GLOBAL innodb_buffer_pool_dump_pct=1; -SELECT @@global.innodb_buffer_pool_dump_pct; -@@global.innodb_buffer_pool_dump_pct -1 -SELECT variable_value INTO @IBPDS -FROM information_schema.global_status -WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS'; SET GLOBAL innodb_buffer_pool_dump_now=ON; SET GLOBAL innodb_buffer_pool_dump_pct=DEFAULT; DROP TABLE tab5; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_buffer_pool_fail.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_buffer_pool_fail.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_buffer_pool_fail.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_buffer_pool_fail.result 2024-08-03 07:29:58.000000000 +0000 @@ -6,3 +6,4 @@ # MDEV-25019 memory allocation failures during startup cause server failure in different, confusing ways # # restart: --debug_dbug=+d,ib_buf_chunk_init_fails +FOUND 1 /\[ERROR\] InnoDB: Cannot allocate memory for the buffer pool/ in mysqld.1.err diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_bug12902967.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_bug12902967.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_bug12902967.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_bug12902967.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -call mtr.add_suppression("In ALTER TABLE .* has or is referenced in foreign key constraints which are not compatible with the new table definition."); -# restart -create table t1 (f1 integer primary key) engine innodb; -alter table t1 add constraint c1 foreign key (f1) references t1(f1); -ERROR HY000: Error on rename of '#sql-alter' to './test/t1' (errno: 150 "Foreign key constraint is incorrectly formed") -drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_bug30113362.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_bug30113362.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_bug30113362.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_bug30113362.result 2024-08-03 07:29:58.000000000 +0000 @@ -37,7 +37,7 @@ test.t1 analyze status OK SELECT CLUST_INDEX_SIZE FROM information_schema.INNODB_SYS_TABLESTATS WHERE NAME = 'test/t1'; CLUST_INDEX_SIZE -1856 +1792 connection con2; DELETE FROM t1 WHERE a00 = 'cnm'; COMMIT; @@ -80,7 +80,7 @@ test.t1 analyze status OK SELECT CLUST_INDEX_SIZE FROM information_schema.INNODB_SYS_TABLESTATS WHERE NAME = 'test/t1'; CLUST_INDEX_SIZE -1856 +1792 DELETE FROM t1 WHERE a00 = 'dpn'; COMMIT; INSERT INTO t1 SET a00 = 'dpn'; @@ -117,6 +117,6 @@ test.t1 analyze status OK SELECT CLUST_INDEX_SIZE FROM information_schema.INNODB_SYS_TABLESTATS WHERE NAME = 'test/t1'; CLUST_INDEX_SIZE -1856 +1792 SET DEBUG_SYNC = 'RESET'; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_ctype_big5.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_big5.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_ctype_big5.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_big5.result 2024-08-03 07:29:58.000000000 +0000 @@ -100,20 +100,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'big5_chinese_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'big5_chinese_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'big5_chinese_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -237,20 +237,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'big5_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'big5_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'big5_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'big5_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_ctype_latin1.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_latin1.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_ctype_latin1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_latin1.result 2024-08-03 07:29:58.000000000 +0000 @@ -100,20 +100,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin1_swedish_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin1_swedish_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin1_swedish_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -237,20 +237,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'latin1_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'latin1_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'latin1_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'latin1_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_ctype_utf8.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_utf8.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_ctype_utf8.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_ctype_utf8.result 2024-08-03 07:29:58.000000000 +0000 @@ -100,20 +100,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_general_nopad_ci' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_general_nopad_ci' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_general_nopad_ci' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_general_nopad_ci', 'abc ')) as exp; +exp 6162632020 # # Collation mix @@ -237,20 +237,20 @@ # # IF, CASE, LEAST # -SELECT IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad'); -IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad') +SELECT IF('abc' COLLATE 'utf8_nopad_bin' = 'abc ', 'pad', 'nopad') as exp; +exp nopad -SELECT CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE 'abc' COLLATE 'utf8_nopad_bin' WHEN 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END; -CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END +SELECT CASE WHEN 'abc' COLLATE 'utf8_nopad_bin' = 'abc ' THEN 'pad' ELSE 'nopad' END as exp; +exp nopad -SELECT HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')); -HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) +SELECT HEX(LEAST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) as exp; +exp 61626320 -SELECT HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')); -HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) +SELECT HEX(GREATEST('abc ' COLLATE 'utf8_nopad_bin', 'abc ')) as exp; +exp 6162632020 # # Collation mix diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_force_recovery.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_force_recovery.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_force_recovery.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_force_recovery.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,9 +4,18 @@ insert into t2 values(1, 2); SET GLOBAL innodb_fast_shutdown = 0; # restart: --innodb-force-recovery=4 +SELECT CAST(variable_value AS INTEGER) INTO @read1 +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='innodb_buffer_pool_read_requests'; select * from t1; f1 f2 1 2 +SELECT CAST(variable_value AS INTEGER) INTO @read2 +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='innodb_buffer_pool_read_requests'; +SELECT @read1>0, @read2>@read1; +@read1>0 @read2>@read1 +1 1 begin; insert into t1 values(2, 3); rollback; Binary files /srv/release.debian.org/tmp/oi8ibDEZiW/mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_i_s_innodb_locks.result and /srv/release.debian.org/tmp/RlE8mtPuE4/mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_i_s_innodb_locks.result differ diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_i_s_innodb_trx.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_i_s_innodb_trx.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_i_s_innodb_trx.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_i_s_innodb_trx.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,90 @@ +SET @save_timeout=@@GLOBAL.innodb_lock_wait_timeout; +SET GLOBAL innodb_lock_wait_timeout=100000000; +DESCRIBE INFORMATION_SCHEMA.INNODB_TRX; +Field Type Null Key Default Extra +trx_id bigint(21) unsigned NO NULL +trx_state varchar(13) NO NULL +trx_started datetime NO NULL +trx_requested_lock_id varchar(81) YES NULL +trx_wait_started datetime YES NULL +trx_weight bigint(21) unsigned NO NULL +trx_mysql_thread_id bigint(21) unsigned NO NULL +trx_query varchar(1024) YES NULL +trx_operation_state varchar(64) YES NULL +trx_tables_in_use bigint(21) unsigned NO NULL +trx_tables_locked bigint(21) unsigned NO NULL +trx_lock_structs bigint(21) unsigned NO NULL +trx_lock_memory_bytes bigint(21) unsigned NO NULL +trx_rows_locked bigint(21) unsigned NO NULL +trx_rows_modified bigint(21) unsigned NO NULL +trx_concurrency_tickets bigint(21) unsigned NO NULL +trx_isolation_level enum('READ UNCOMMITTED','READ COMMITTED','REPEATABLE READ','SERIALIZABLE') NO NULL +trx_unique_checks int(1) NO NULL +trx_foreign_key_checks int(1) NO NULL +trx_last_foreign_key_error varchar(256) YES NULL +trx_is_read_only int(1) NO NULL +trx_autocommit_non_locking int(1) NO NULL +CREATE TABLE t1 ( +c01 INT, +c02 INT, +PRIMARY KEY (c01) +) ENGINE=INNODB STATS_AUTO_RECALC=0; +INSERT INTO t1 VALUES +(1,2),(2,4),(3,6),(4,8); +CREATE TABLE t2 ( +c01 INT, +c02 INT, +PRIMARY KEY (c01), +FOREIGN KEY fk1 (c02) REFERENCES t1 (c01) +) ENGINE=INNODB STATS_AUTO_RECALC=0; +INSERT INTO t2 VALUES +(1,1),(2,2),(3,3); +connect con_trx,localhost,root,,; +connect con_verify_innodb_trx,localhost,root,,; +connection con_trx; +SET autocommit=0; +INSERT INTO t1 VALUES (5,10); +SELECT * FROM t1 FOR UPDATE; +c01 c02 +1 2 +2 4 +3 6 +4 8 +5 10 +connection con_verify_innodb_trx; +SELECT trx_state, trx_weight, trx_tables_in_use, trx_tables_locked, +trx_rows_locked, trx_rows_modified, trx_concurrency_tickets, +trx_isolation_level, trx_unique_checks, trx_foreign_key_checks +FROM INFORMATION_SCHEMA.INNODB_TRX; +trx_state trx_weight trx_tables_in_use trx_tables_locked trx_rows_locked trx_rows_modified trx_concurrency_tickets trx_isolation_level trx_unique_checks trx_foreign_key_checks +RUNNING 3 0 1 6 1 0 REPEATABLE READ 1 1 +connection con_trx; +ROLLBACK; +SET FOREIGN_KEY_CHECKS = 0; +SET UNIQUE_CHECKS = 0; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN; +INSERT INTO t1 VALUES (6,12); +connection con_verify_innodb_trx; +SELECT trx_isolation_level, trx_unique_checks, trx_foreign_key_checks +FROM INFORMATION_SCHEMA.INNODB_TRX; +trx_isolation_level trx_unique_checks trx_foreign_key_checks +SERIALIZABLE 0 0 +connection con_trx; +ROLLBACK; +SET FOREIGN_KEY_CHECKS = 1; +SET UNIQUE_CHECKS = 1; +BEGIN; +INSERT INTO t2 VALUES (4,10); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk1` FOREIGN KEY (`c02`) REFERENCES `t1` (`c01`)) +disconnect con_trx; +connection con_verify_innodb_trx; +SELECT trx_state, trx_isolation_level, trx_last_foreign_key_error +FROM INFORMATION_SCHEMA.INNODB_TRX; +trx_state trx_isolation_level trx_last_foreign_key_error +RUNNING REPEATABLE READ `test`.`t2`, CONSTRAINT `fk1` FOREIGN KEY (`c02`) REFERENCES `t1` (`c01`) +disconnect con_verify_innodb_trx; +connection default; +DROP TABLE t2; +DROP TABLE t1; +SET GLOBAL innodb_lock_wait_timeout=@save_timeout; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_information_schema_tables.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_information_schema_tables.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_information_schema_tables.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_information_schema_tables.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,2 +1,3 @@ +FOUND 1 /\[Warning\] InnoDB: innodb_open_files 1000000 should not be greater than the open_files_limit [0-9]+/ in mysqld.1.err CREATE TABLE t1 ENGINE=InnoDB AS SELECT * FROM mysql.help_topic; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_mysql.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_mysql.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_mysql.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_mysql.result 2024-08-03 07:29:58.000000000 +0000 @@ -431,10 +431,6 @@ connection con1; begin work; insert into t1 values (5); -select * from t1; -a -1 -5 insert into t1 values (2); ERROR HY000: Lock wait timeout exceeded; try restarting transaction select * from t1; @@ -509,10 +505,6 @@ connection con1; begin work; insert into t1 values (5); -select * from t1; -a -1 -5 insert into t1 values (2); ERROR HY000: Lock wait timeout exceeded; try restarting transaction select * from t1; @@ -1217,10 +1209,6 @@ connection con1; begin work; insert into t1 values (5); -select * from t1; -a -1 -5 insert into t1 values (2); ERROR HY000: Lock wait timeout exceeded; try restarting transaction select * from t1; @@ -2382,6 +2370,10 @@ ref NULL rows 6 Extra Using where +Warnings: +Level Note +Code 1105 +Message Cannot use key `PRIMARY` part[0] for lookup: `test`.`bar`.`c` of type `char` > "2" of type `int` EXPLAIN SELECT c FROM foo WHERE c>2;; id 1 select_type SIMPLE @@ -2393,6 +2385,10 @@ ref NULL rows 6 Extra Using where +Warnings: +Level Note +Code 1105 +Message Cannot use key `PRIMARY` part[0] for lookup: `test`.`foo`.`c` of type `char` > "2" of type `int` EXPLAIN SELECT c FROM foo2 WHERE c>2;; id 1 select_type SIMPLE @@ -2404,6 +2400,10 @@ ref NULL rows 6 Extra Using where; Using index +Warnings: +Level Note +Code 1105 +Message Cannot use key `PRIMARY` part[0] for lookup: `test`.`foo2`.`c` of type `char` > "2" of type `int` DROP TABLE foo, bar, foo2; # # Bug#41348: INSERT INTO tbl SELECT * FROM temp_tbl overwrites locking type of temp table diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_prefix_index_restart_server.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_prefix_index_restart_server.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_prefix_index_restart_server.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_prefix_index_restart_server.result 2024-08-03 07:29:58.000000000 +0000 @@ -90,3 +90,19 @@ col_1_text = REPEAT("a", 3500) col_2_text = REPEAT("o", 3500) 1 1 DROP TABLE worklog5743; +# +# MDEV-21245 InnoDB: Using a partial-field key prefix in search +# +CREATE TABLE t1 (a VARCHAR(255), KEY k(a)) DEFAULT CHARSET=utf8mb3 +ENGINE=InnoDB; +INSERT INTO t1 set a=''; +alter table t1 change a a varchar(3000); +affected rows: 0 +info: Records: 0 Duplicates: 0 Warnings: 1 +Warnings: +Note 1071 Specified key was too long; max key length is 3072 bytes +SELECT * FROM t1 WHERE a IN (''); +a + +DROP TABLE t1; +# End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_scrub.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_scrub.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_scrub.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_scrub.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ CREATE TABLE t1(f1 int auto_increment primary key, f2 varchar(256), -f3 text) engine = innodb; +f3 text) engine = innodb stats_persistent=0; FLUSH TABLE t1 FOR EXPORT; UNLOCK TABLES; FOUND 500500 /unicycle|repairman/ in t1.ibd diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_skip_innodb_is_tables.result 2024-08-03 07:29:58.000000000 +0000 @@ -86,7 +86,6 @@ buffer_flush_adaptive_avg_time buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Avg time (ms) spent for adaptive flushing recently. buffer_flush_adaptive_avg_pass buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of adaptive flushes passed during the recent Avg period. buffer_LRU_get_free_loops buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Total loops in LRU get free. -buffer_LRU_get_free_waits buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Total sleep waits in LRU get free. buffer_flush_avg_page_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Average number of pages at which flushing is happening buffer_flush_lsn_avg_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Average redo generation rate buffer_flush_pct_for_dirty buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Percent of IO capacity used to avoid max dirty page limit @@ -106,7 +105,6 @@ buffer_LRU_batch_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_member Pages scanned per LRU batch call buffer_LRU_batch_flush_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Total pages flushed as part of LRU batches buffer_LRU_batch_evict_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Total pages evicted as part of LRU batches -buffer_LRU_single_flush_failure_count Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of times attempt to flush a single page from LRU failed buffer_LRU_get_free_search Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of searches performed for a clean page buffer_LRU_search_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_owner Total pages scanned as part of LRU search buffer_LRU_search_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_member Number of times LRU search is performed diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,44 @@ +CREATE TABLE autorecalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB; +SELECT n_rows, clustered_index_size FROM mysql.innodb_table_stats WHERE table_name = 'autorecalc'; +n_rows 0 +clustered_index_size 1 +SELECT index_name, stat_name, stat_value FROM mysql.innodb_index_stats WHERE table_name = 'autorecalc'; +index_name PRIMARY +stat_name n_diff_pfx01 +stat_value 0 +index_name PRIMARY +stat_name n_leaf_pages +stat_value 1 +index_name PRIMARY +stat_name size +stat_value 1 +INSERT INTO autorecalc VALUES (1); +INSERT INTO autorecalc VALUES (2); +SELECT n_rows, clustered_index_size FROM mysql.innodb_table_stats WHERE table_name = 'autorecalc'; +n_rows 2 +clustered_index_size 1 +SELECT index_name, stat_name, stat_value FROM mysql.innodb_index_stats WHERE table_name = 'autorecalc'; +index_name PRIMARY +stat_name n_diff_pfx01 +stat_value 2 +index_name PRIMARY +stat_name n_leaf_pages +stat_value 1 +index_name PRIMARY +stat_name size +stat_value 1 +DELETE FROM autorecalc; +SELECT n_rows, clustered_index_size FROM mysql.innodb_table_stats WHERE table_name = 'autorecalc'; +n_rows 0 +clustered_index_size 1 +SELECT index_name, stat_name, stat_value FROM mysql.innodb_index_stats WHERE table_name = 'autorecalc'; +index_name PRIMARY +stat_name n_diff_pfx01 +stat_value 0 +index_name PRIMARY +stat_name n_leaf_pages +stat_value 1 +index_name PRIMARY +stat_name size +stat_value 1 +DROP TABLE autorecalc; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_ddl.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_ddl.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_ddl.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_ddl.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,34 @@ +CREATE TABLE arddl (a INT, b INT, PRIMARY KEY (a)) ENGINE=INNODB; +INSERT INTO arddl VALUES (1, 10); +INSERT INTO arddl VALUES (2, 10); +ALTER TABLE arddl ADD INDEX (b); +SELECT n_rows FROM mysql.innodb_table_stats WHERE table_name = 'arddl' ORDER BY 1; +n_rows 2 +SELECT index_name, stat_name, stat_value FROM mysql.innodb_index_stats WHERE table_name = 'arddl' AND index_name = 'PRIMARY' ORDER BY 1, 2, 3; +index_name PRIMARY +stat_name n_diff_pfx01 +stat_value 2 +index_name PRIMARY +stat_name n_leaf_pages +stat_value 1 +index_name PRIMARY +stat_name size +stat_value 1 +DROP TABLE arddl; +CREATE TABLE arddl (a INT, b INT, PRIMARY KEY (a), KEY (b)) ENGINE=INNODB; +INSERT INTO arddl VALUES (3, 10); +INSERT INTO arddl VALUES (4, 10); +ALTER TABLE arddl DROP INDEX b; +SELECT n_rows FROM mysql.innodb_table_stats WHERE table_name = 'arddl' ORDER BY 1; +n_rows 2 +SELECT index_name, stat_name, stat_value FROM mysql.innodb_index_stats WHERE table_name = 'arddl' AND index_name = 'PRIMARY' ORDER BY 1, 2, 3; +index_name PRIMARY +stat_name n_diff_pfx01 +stat_value 2 +index_name PRIMARY +stat_name n_leaf_pages +stat_value 1 +index_name PRIMARY +stat_name size +stat_value 1 +DROP TABLE arddl; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_lots.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_lots.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_lots.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_lots.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,202 @@ +SELECT table_name, n_rows FROM mysql.innodb_table_stats WHERE table_name LIKE 'ar_%' ORDER BY table_name; +table_name n_rows +ar_1001 0 +ar_1002 0 +ar_1003 0 +ar_1004 0 +ar_1005 0 +ar_1006 0 +ar_1007 0 +ar_1008 0 +ar_1009 0 +ar_1010 0 +ar_1011 0 +ar_1012 0 +ar_1013 0 +ar_1014 0 +ar_1015 0 +ar_1016 0 +ar_1017 0 +ar_1018 0 +ar_1019 0 +ar_1020 0 +ar_1021 0 +ar_1022 0 +ar_1023 0 +ar_1024 0 +ar_1025 0 +ar_1026 0 +ar_1027 0 +ar_1028 0 +ar_1029 0 +ar_1030 0 +ar_1031 0 +ar_1032 0 +ar_1033 0 +ar_1034 0 +ar_1035 0 +ar_1036 0 +ar_1037 0 +ar_1038 0 +ar_1039 0 +ar_1040 0 +ar_1041 0 +ar_1042 0 +ar_1043 0 +ar_1044 0 +ar_1045 0 +ar_1046 0 +ar_1047 0 +ar_1048 0 +ar_1049 0 +ar_1050 0 +ar_1051 0 +ar_1052 0 +ar_1053 0 +ar_1054 0 +ar_1055 0 +ar_1056 0 +ar_1057 0 +ar_1058 0 +ar_1059 0 +ar_1060 0 +ar_1061 0 +ar_1062 0 +ar_1063 0 +ar_1064 0 +ar_1065 0 +ar_1066 0 +ar_1067 0 +ar_1068 0 +ar_1069 0 +ar_1070 0 +ar_1071 0 +ar_1072 0 +ar_1073 0 +ar_1074 0 +ar_1075 0 +ar_1076 0 +ar_1077 0 +ar_1078 0 +ar_1079 0 +ar_1080 0 +ar_1081 0 +ar_1082 0 +ar_1083 0 +ar_1084 0 +ar_1085 0 +ar_1086 0 +ar_1087 0 +ar_1088 0 +ar_1089 0 +ar_1090 0 +ar_1091 0 +ar_1092 0 +ar_1093 0 +ar_1094 0 +ar_1095 0 +ar_1096 0 +ar_1097 0 +ar_1098 0 +ar_1099 0 +ar_1100 0 +ar_1101 0 +ar_1102 0 +ar_1103 0 +ar_1104 0 +ar_1105 0 +ar_1106 0 +ar_1107 0 +ar_1108 0 +ar_1109 0 +ar_1110 0 +ar_1111 0 +ar_1112 0 +ar_1113 0 +ar_1114 0 +ar_1115 0 +ar_1116 0 +ar_1117 0 +ar_1118 0 +ar_1119 0 +ar_1120 0 +ar_1121 0 +ar_1122 0 +ar_1123 0 +ar_1124 0 +ar_1125 0 +ar_1126 0 +ar_1127 0 +ar_1128 0 +ar_1129 0 +ar_1130 0 +ar_1131 0 +ar_1132 0 +ar_1133 0 +ar_1134 0 +ar_1135 0 +ar_1136 0 +ar_1137 0 +ar_1138 0 +ar_1139 0 +ar_1140 0 +ar_1141 0 +ar_1142 0 +ar_1143 0 +ar_1144 0 +ar_1145 0 +ar_1146 0 +ar_1147 0 +ar_1148 0 +ar_1149 0 +ar_1150 0 +ar_1151 0 +ar_1152 0 +ar_1153 0 +ar_1154 0 +ar_1155 0 +ar_1156 0 +ar_1157 0 +ar_1158 0 +ar_1159 0 +ar_1160 0 +ar_1161 0 +ar_1162 0 +ar_1163 0 +ar_1164 0 +ar_1165 0 +ar_1166 0 +ar_1167 0 +ar_1168 0 +ar_1169 0 +ar_1170 0 +ar_1171 0 +ar_1172 0 +ar_1173 0 +ar_1174 0 +ar_1175 0 +ar_1176 0 +ar_1177 0 +ar_1178 0 +ar_1179 0 +ar_1180 0 +ar_1181 0 +ar_1182 0 +ar_1183 0 +ar_1184 0 +ar_1185 0 +ar_1186 0 +ar_1187 0 +ar_1188 0 +ar_1189 0 +ar_1190 0 +ar_1191 0 +ar_1192 0 +ar_1193 0 +ar_1194 0 +ar_1195 0 +ar_1196 0 +ar_1197 0 +ar_1198 0 +ar_1199 0 +ar_1200 0 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_on_nonexistent.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_on_nonexistent.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_on_nonexistent.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_auto_recalc_on_nonexistent.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,60 @@ +Test with default setting +CREATE TABLE t (a INT, PRIMARY KEY (a)) ENGINE=INNODB; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 1 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 3 +SELECT * FROM t; +FLUSH TABLE t; +DELETE FROM mysql.innodb_index_stats WHERE table_name = 't'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 't'; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 0 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 0 +SELECT * FROM t; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 1 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 3 +DROP TABLE t; +Test with explicit enable +CREATE TABLE t (a INT, PRIMARY KEY (a)) ENGINE=INNODB STATS_AUTO_RECALC=1; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 1 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 3 +SELECT * FROM t; +FLUSH TABLE t; +DELETE FROM mysql.innodb_index_stats WHERE table_name = 't'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 't'; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 0 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 0 +SELECT * FROM t; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 1 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 3 +DROP TABLE t; +Test with explicit disable +CREATE TABLE t (a INT, PRIMARY KEY (a)) ENGINE=INNODB STATS_AUTO_RECALC=0; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 1 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 3 +SELECT * FROM t; +FLUSH TABLE t; +DELETE FROM mysql.innodb_index_stats WHERE table_name = 't'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 't'; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 0 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 0 +SELECT * FROM t; +SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't'; +COUNT(*) 0 +SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't'; +COUNT(*) 0 +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_external_pages.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_external_pages.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_external_pages.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_external_pages.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,10 @@ +CREATE TABLE bug18384390 ( +id INT AUTO_INCREMENT PRIMARY KEY, +txt VARCHAR(10000) +) ENGINE=INNODB STATS_PERSISTENT=1 STATS_AUTO_RECALC=0; +INSERT INTO bug18384390 (txt) SELECT REPEAT('0', 10000) FROM seq_1_to_1024; +set use_stat_tables=never; +ANALYZE TABLE bug18384390; +Table Op Msg_type Msg_text +test.bug18384390 analyze status OK +DROP TABLE bug18384390; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_fetch.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_fetch.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_fetch.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_fetch.result 2024-08-03 07:29:58.000000000 +0000 @@ -150,3 +150,44 @@ index_length 16384 DROP TABLE test_ps_fetch; set @@use_stat_tables = @save_use_stat_tables; +# +# MDEV-28613 LeakSanitizer caused by I_S query using LIMIT ROWS EXAMINED +# +CREATE TABLE t1(f1 VARCHAR(255), FULLTEXT(f1))ENGINE=InnoDB; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES LIMIT ROWS EXAMINED 5; +Warnings: +Level Warning +Code 1931 +Message Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES LIMIT ROWS EXAMINED 5; +Warnings: +Level Warning +Code 1931 +Message Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS LIMIT ROWS EXAMINED 5; +Warnings: +Level Warning +Code 1931 +Message Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete +SELECT SPACE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES LIMIT ROWS EXAMINED 5; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_VIRTUAL LIMIT ROWS EXAMINED 5; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN LIMIT ROWS EXAMINED 5; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS LIMIT ROWS EXAMINED 5; +DROP TABLE t1; +# +# MDEV-33462 Disallow LOCK=NONE operation on statistics table +# +ALTER TABLE mysql.innodb_table_stats FORCE, LOCK=NONE; +ERROR 0A000: LOCK=NONE is not supported. Reason: innodb_table_stats. Try LOCK=SHARED +ALTER TABLE mysql.innodb_index_stats FORCE, LOCK=NONE; +ERROR 0A000: LOCK=NONE is not supported. Reason: innodb_index_stats. Try LOCK=SHARED +# +# MDEV-34474 InnoDB: Failing assertion: stat_n_leaf_pages > 0 +# in ha_innobase::estimate_rows_upper_bound +# +CREATE TABLE t (c1 INT,c2 INT, +INDEX(c1))STATS_PERSISTENT=1 ENGINE=INNODB; +UPDATE mysql.innodb_index_stats SET stat_value=0 WHERE database_name like "test" and table_name like 't'; +UPDATE mysql.innodb_table_stats SET clustered_index_size= 0, sum_of_other_index_sizes=0 WHERE database_name like "test" and table_name like 't'; +UPDATE t SET c1=+1 ORDER BY c2; +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_flag_global,off.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_flag_global,off.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_flag_global,off.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_flag_global,off.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,34 @@ +@@ -18,7 +18,7 @@ + test.test_ps_flag analyze status OK + SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; + cnt_after +-1 ++0 + DROP TABLE test_ps_flag; + CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=default; + SHOW CREATE TABLE test_ps_flag; +@@ -37,7 +37,7 @@ + test.test_ps_flag analyze status OK + SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; + cnt_after +-1 ++0 + DROP TABLE test_ps_flag; + ===== + === Test ANALYZE behavior after creation with explicit PS=OFF +@@ -142,7 +142,7 @@ + test.test_ps_flag analyze status OK + SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; + cnt_after +-1 ++0 + DROP TABLE test_ps_flag; + ===== + === Test ANALYZE behavior after creation with explicit PS=ON, +@@ -203,5 +203,5 @@ + test.test_ps_flag analyze status OK + SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; + cnt_after +-1 ++0 + DROP TABLE test_ps_flag; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_flag_global.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_flag_global.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_flag_global.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_flag_global.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,207 @@ +===== +=== Test ANALYZE behavior after default creation +===== +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +1 +DROP TABLE test_ps_flag; +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=default; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +1 +DROP TABLE test_ps_flag; +===== +=== Test ANALYZE behavior after creation with explicit PS=OFF +===== +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=0; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=0 +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +0 +DROP TABLE test_ps_flag; +===== +=== Test ANALYZE behavior after creation with explicit PS=ON +===== +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=1; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=1 +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +1 +DROP TABLE test_ps_flag; +===== +=== Test ANALYZE behavior after creation with explicit PS=OFF, +=== then ALTER to ON, then ALTER to OFF, then ALTER to default +===== +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=0; +ALTER TABLE test_ps_flag STATS_PERSISTENT=1; +# restart +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=1 +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +1 +ALTER TABLE test_ps_flag STATS_PERSISTENT=0; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=0 +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +0 +ALTER TABLE test_ps_flag STATS_PERSISTENT=default; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +1 +DROP TABLE test_ps_flag; +===== +=== Test ANALYZE behavior after creation with explicit PS=ON, +=== then ALTER to OFF, then ALTER to ON, then ALTER to default +===== +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=1; +ALTER TABLE test_ps_flag STATS_PERSISTENT=0; +# restart +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=0 +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +0 +ALTER TABLE test_ps_flag STATS_PERSISTENT=1; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=1 +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +1 +ALTER TABLE test_ps_flag STATS_PERSISTENT=default; +SHOW CREATE TABLE test_ps_flag; +Table Create Table +test_ps_flag CREATE TABLE `test_ps_flag` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_before +0 +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; +Table Op Msg_type Msg_text +test.test_ps_flag analyze status OK +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; +cnt_after +1 +DROP TABLE test_ps_flag; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_persistent.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_persistent.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_persistent.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_persistent.result 2024-08-03 07:29:58.000000000 +0000 @@ -8,9 +8,9 @@ ENGINE=INNODB STATS_PERSISTENT=1,STATS_AUTO_RECALC=1; CREATE TABLE t2 LIKE t1; INSERT INTO t1 (val) SELECT 4 FROM seq_1_to_16; +SET STATEMENT use_stat_tables=never FOR ANALYZE TABLE t1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK connect con1, localhost, root,,; START TRANSACTION; @@ -57,7 +57,7 @@ EXPLAIN SELECT * FROM t2 WHERE val=4; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 ref val val 4 const 1 Using index -InnoDB 0 transactions not purged +SET GLOBAL innodb_max_purge_lag_wait=0; # After COMMIT and purge, the DELETE must show up. EXPLAIN SELECT * FROM t1 WHERE val=4; id select_type table type possible_keys key key_len ref rows Extra @@ -89,7 +89,7 @@ # ha_innobase::records_in_range() would count the delete-marked records. EXPLAIN SELECT * FROM t1; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE t1 index NULL val 4 NULL 16 Using index +1 SIMPLE t1 index NULL val 4 NULL 1 Using index ROLLBACK; EXPLAIN SELECT * FROM t1; id select_type table type possible_keys key key_len ref rows Extra @@ -103,3 +103,25 @@ SET GLOBAL innodb_stats_include_delete_marked = @saved_include_delete_marked; SET GLOBAL innodb_stats_traditional = @saved_traditional; SET GLOBAL innodb_stats_modified_counter = @saved_modified_counter; +CREATE TABLE bug12429573 (i INTEGER PRIMARY KEY, j INTEGER, KEY(j)) +ENGINE=INNODB STATS_PERSISTENT=1; +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE bug12429573; +Table Op Msg_type Msg_text +test.bug12429573 analyze status OK +SELECT last_update INTO @last FROM mysql.innodb_table_stats +WHERE table_name = 'bug12429573'; +SELECT * FROM mysql.innodb_index_stats +WHERE table_name = 'bug12429573' AND last_update!=@last; +database_name table_name index_name last_update stat_name stat_value sample_size stat_description +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE bug12429573; +Table Op Msg_type Msg_text +test.bug12429573 analyze status OK +SELECT * FROM mysql.innodb_table_stats +WHERE table_name = 'bug12429573' AND last_update=@last; +database_name table_name last_update n_rows clustered_index_size sum_of_other_index_sizes +SELECT * FROM mysql.innodb_index_stats +WHERE table_name = 'bug12429573' AND last_update=@last; +database_name table_name index_name last_update stat_name stat_value sample_size stat_description +DROP TABLE bug12429573; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_sample_pages.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_sample_pages.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_sample_pages.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_sample_pages.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,29 @@ +SET GLOBAL innodb_stats_persistent_sample_pages=17; +CREATE TABLE test_ps_sample_pages_used ( +a VARCHAR(512), PRIMARY KEY (a) +) ENGINE=INNODB STATS_SAMPLE_PAGES=default; +BEGIN; +COMMIT; +ANALYZE TABLE test_ps_sample_pages_used; +Table Op Msg_type Msg_text +test.test_ps_sample_pages_used analyze status Engine-independent statistics collected +test.test_ps_sample_pages_used analyze status OK +SELECT stat_name, stat_value FROM mysql.innodb_index_stats +WHERE table_name='test_ps_sample_pages_used' AND stat_name='n_leaf_pages'; +stat_name stat_value +n_leaf_pages 37 +SELECT sample_size FROM mysql.innodb_index_stats +WHERE table_name='test_ps_sample_pages_used' AND stat_name='n_diff_pfx01'; +sample_size +17 +ALTER TABLE test_ps_sample_pages_used STATS_SAMPLE_PAGES=14; +ANALYZE TABLE test_ps_sample_pages_used; +Table Op Msg_type Msg_text +test.test_ps_sample_pages_used analyze status Engine-independent statistics collected +test.test_ps_sample_pages_used analyze status OK +SELECT sample_size FROM mysql.innodb_index_stats +WHERE table_name='test_ps_sample_pages_used' AND stat_name='n_diff_pfx01'; +sample_size +14 +DROP TABLE test_ps_sample_pages_used; +SET GLOBAL innodb_stats_persistent_sample_pages=default; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_table_flag_auto_recalc.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_table_flag_auto_recalc.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_table_flag_auto_recalc.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_table_flag_auto_recalc.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,82 @@ +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB; +SHOW CREATE TABLE test_ps_auto_recalc; +Table test_ps_auto_recalc +Create Table CREATE TABLE `test_ps_auto_recalc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; +create_options +ALTER TABLE test_ps_auto_recalc STATS_AUTO_RECALC=1; +# restart +SHOW CREATE TABLE test_ps_auto_recalc; +Table test_ps_auto_recalc +Create Table CREATE TABLE `test_ps_auto_recalc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_AUTO_RECALC=1 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; +create_options stats_auto_recalc=1 +DROP TABLE test_ps_auto_recalc; +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_AUTO_RECALC=default; +SHOW CREATE TABLE test_ps_auto_recalc; +Table test_ps_auto_recalc +Create Table CREATE TABLE `test_ps_auto_recalc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; +create_options +DROP TABLE test_ps_auto_recalc; +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_AUTO_RECALC=0; +# restart +SHOW CREATE TABLE test_ps_auto_recalc; +Table test_ps_auto_recalc +Create Table CREATE TABLE `test_ps_auto_recalc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_AUTO_RECALC=0 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; +create_options stats_auto_recalc=0 +ALTER TABLE test_ps_auto_recalc STATS_AUTO_RECALC=1; +# restart +SHOW CREATE TABLE test_ps_auto_recalc; +Table test_ps_auto_recalc +Create Table CREATE TABLE `test_ps_auto_recalc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_AUTO_RECALC=1 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; +create_options stats_auto_recalc=1 +DROP TABLE test_ps_auto_recalc; +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_AUTO_RECALC=1; +# restart +SHOW CREATE TABLE test_ps_auto_recalc; +Table test_ps_auto_recalc +Create Table CREATE TABLE `test_ps_auto_recalc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_AUTO_RECALC=1 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; +create_options stats_auto_recalc=1 +ALTER TABLE test_ps_auto_recalc STATS_AUTO_RECALC=0; +# restart +SHOW CREATE TABLE test_ps_auto_recalc; +Table test_ps_auto_recalc +Create Table CREATE TABLE `test_ps_auto_recalc` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_AUTO_RECALC=0 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; +create_options stats_auto_recalc=0 +DROP TABLE test_ps_auto_recalc; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_table_flag_sample_pages.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_table_flag_sample_pages.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_stats_table_flag_sample_pages.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_stats_table_flag_sample_pages.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,95 @@ +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB; +SHOW CREATE TABLE test_ps_sample_pages; +Table test_ps_sample_pages +Create Table CREATE TABLE `test_ps_sample_pages` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; +create_options +ALTER TABLE test_ps_sample_pages STATS_SAMPLE_PAGES=12345; +# restart +SHOW CREATE TABLE test_ps_sample_pages; +Table test_ps_sample_pages +Create Table CREATE TABLE `test_ps_sample_pages` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_SAMPLE_PAGES=12345 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; +create_options stats_sample_pages=12345 +DROP TABLE test_ps_sample_pages; +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=default; +SHOW CREATE TABLE test_ps_sample_pages; +Table test_ps_sample_pages +Create Table CREATE TABLE `test_ps_sample_pages` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; +create_options +DROP TABLE test_ps_sample_pages; +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=-5; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-5' at line 2 +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=0; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '0' at line 2 +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=67000; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '67000' at line 2 +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=670000; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '670000' at line 2 +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=65536; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '65536' at line 2 +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=65535; +SHOW CREATE TABLE test_ps_sample_pages; +Table test_ps_sample_pages +Create Table CREATE TABLE `test_ps_sample_pages` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_SAMPLE_PAGES=65535 +DROP TABLE test_ps_sample_pages; +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=1; +# restart +SHOW CREATE TABLE test_ps_sample_pages; +Table test_ps_sample_pages +Create Table CREATE TABLE `test_ps_sample_pages` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_SAMPLE_PAGES=1 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; +create_options stats_sample_pages=1 +DROP TABLE test_ps_sample_pages; +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=5678; +# restart +SHOW CREATE TABLE test_ps_sample_pages; +Table test_ps_sample_pages +Create Table CREATE TABLE `test_ps_sample_pages` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_SAMPLE_PAGES=5678 +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; +create_options stats_sample_pages=5678 +ALTER TABLE test_ps_sample_pages STATS_SAMPLE_PAGES=default; +# restart +SHOW CREATE TABLE test_ps_sample_pages; +Table test_ps_sample_pages +Create Table CREATE TABLE `test_ps_sample_pages` ( + `a` int(11) NOT NULL, + PRIMARY KEY (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; +create_options +DROP TABLE test_ps_sample_pages; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_status_variables.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_status_variables.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_status_variables.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_status_variables.result 2024-08-03 07:29:58.000000000 +0000 @@ -111,3 +111,4 @@ INNODB_ENCRYPTION_N_TEMP_BLOCKS_ENCRYPTED INNODB_ENCRYPTION_N_TEMP_BLOCKS_DECRYPTED INNODB_ENCRYPTION_NUM_KEY_REQUESTS +INNODB_BULK_OPERATIONS diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_timeout_rollback.result mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_timeout_rollback.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/innodb_timeout_rollback.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/innodb_timeout_rollback.result 2024-08-03 07:29:58.000000000 +0000 @@ -17,10 +17,6 @@ connection con1; begin work; insert into t1 values (5); -select * from t1; -a -1 -5 insert into t1 values (2); ERROR HY000: Lock wait timeout exceeded; try restarting transaction select * from t1; @@ -41,4 +37,4 @@ drop table t1; disconnect con1; disconnect con2; -End of 5.0 tests +# End of 5.0 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/insert_into_empty,4k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/insert_into_empty,4k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/insert_into_empty,4k.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/insert_into_empty,4k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,2 +1,10 @@ -423a424 -> ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +--- a/mysql-test/suite/innodb/r/insert_into_empty.result ++++ b/mysql-test/suite/innodb/r/insert_into_empty.result +@@ -430,6 +430,7 @@ + INSERT IGNORE INTO t1 VALUES + (1, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107)), + (2, REPEAT('x',4805), REPEAT('t',2211), REPEAT('u',974), REPEAT('e',871), REPEAT('z',224), REPEAT('j',978), REPEAT('n',190), REPEAT('t',888), REPEAT('x',32768), REPEAT('e',968), REPEAT('b',913), REPEAT('x',12107)); ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CHECK TABLE t1; + Table Op Msg_type Msg_text + test.t1 check status OK diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/insert_into_empty.result mariadb-10.11.9/mysql-test/suite/innodb/r/insert_into_empty.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/insert_into_empty.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/insert_into_empty.result 2024-08-03 07:29:58.000000000 +0000 @@ -20,9 +20,17 @@ SET @save_ahi = @@global.innodb_adaptive_hash_index; SET GLOBAL innodb_adaptive_hash_index = 1; CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +SET @old_bulk_op= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_bulk_operations'); BEGIN; INSERT INTO t1 SELECT * FROM seq_1_to_65536; ROLLBACK; +SELECT variable_value-@old_bulk_op bulk_operations +FROM information_schema.global_status +WHERE variable_name = 'innodb_bulk_operations'; +bulk_operations +1 CHECK TABLE t1; Table Op Msg_type Msg_text test.t1 check status OK @@ -251,6 +259,28 @@ 1984 3331 DROP TABLE t1; +# +# MDEV-33979 Disallow bulk insert operation during +# partition update statement +# +CREATE TABLE t1(a INT KEY)ENGINE=InnoDB +PARTITION BY KEY(a) PARTITIONS 16; +INSERT INTO t1 VALUES(1); +UPDATE t1 SET a = 2 WHERE a = 1; +DROP TABLE t1; +# +# MDEV-34265 Possible hang during IO burst with innodb_flush_sync enabled +# +CREATE TABLE t1(f1 MEDIUMTEXT)ENGINE=InnoDB; +SET @save_dbug=@@GLOBAL.debug_dbug; +SET @@GLOBAL.debug_dbug='+d,ib_page_cleaner_sleep'; +SET STATEMENT debug_dbug='+d,ib_free_page_sleep' FOR +INSERT INTO t1 VALUES(REPEAT(1, 8459264)); +SET @@GLOBAL.debug_dbug=@save_dbug; +SELECT length(f1) FROM t1; +length(f1) +8459264 +DROP TABLE t1; # End of 10.6 tests # # MDEV-26947 UNIQUE column checks fail in InnoDB resulting @@ -467,3 +497,47 @@ CREATE TABLE t (a CHAR CHARACTER SET utf8) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; INSERT t SELECT left(seq,1) FROM seq_1_to_43691; DROP TABLE t; +# +# MDEV-32453 Bulk insert fails to apply when trigger +# does insert operation +# +CREATE TABLE t(c INT)ENGINE=InnoDB; +CREATE TRIGGER t2_ai AFTER INSERT ON t FOR EACH ROW SET @a:=(SELECT * FROM t); +BEGIN; +INSERT INTO t VALUES (1),(1); +ERROR 21000: Subquery returns more than 1 row +COMMIT; +DROP TABLE t; +# +# MDEV-33868 Assertion `trx->bulk_insert' failed in +# innodb_prepare_commit_versioned +# +CREATE TABLE t (id INT) ENGINE=InnoDB; +select 1 into outfile "VARDIR/tmp/t.outfile"; +BEGIN; +LOAD DATA INFILE 'VARDIR/tmp/t.outfile' INTO TABLE t; +COMMIT; +DROP TABLE t; +# +# MDEV-33934 Assertion `!check_foreigns' failed in +# trx_t::bulk_insert_apply_for_table(dict_table_t*) +# +CREATE TABLE t1(f1 INT,f2 INT,KEY(f1))engine=innodb; +BEGIN; +INSERT INTO t1 VALUES(); +SET STATEMENT FOREIGN_KEY_CHECKS=1 FOR SELECT * FROM t1; +f1 f2 +NULL NULL +COMMIT; +DROP TABLE t1; +# +# MDEV-33970 Assertion `!m.first->second.is_bulk_insert()' +# failed in trx_undo_report_row_operation() +# +CREATE TABLE t1(c1 INT,c2 CHAR) ENGINE=INNODB PARTITION BY KEY(c1) PARTITIONS 2; +begin; +INSERT INTO t1 VALUES(2,0); +DELETE FROM t1; +commit; +DROP TABLE t1; +# End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; # # MDEV-11369: Instant ADD COLUMN for InnoDB # @@ -2937,3 +2939,4 @@ FLUSH TABLES; ALTER TABLE mdev28822_100427_innodb ADD i1 INTEGER, ALGORITHM=INSTANT; DROP TABLE mdev28822_100427_innodb; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_bugs.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_bugs.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_bugs.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_bugs.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; # # MDEV-17821 Assertion `!page_rec_is_supremum(rec)' failed # in btr_pcur_store_position @@ -491,4 +493,30 @@ CREATE TABLE t1 (i int AS (0) STORED, j INT) ENGINE=InnoDB; ALTER TABLE t1 ADD COLUMN i INT GENERATED ALWAYS AS (1), DROP COLUMN i; DROP TABLE t1; +# +# MDEV-18322 Assertion "wrong_page_type" on instant ALTER +# +BEGIN NOT ATOMIC +DECLARE c TEXT +DEFAULT(SELECT CONCAT('CREATE TABLE t1 (c', +GROUP_CONCAT(seq SEPARATOR ' CHAR(200), c'), +' CHAR(211)) ENGINE=InnoDB ROW_FORMAT=REDUNDANT') +FROM seq_1_to_40); +EXECUTE IMMEDIATE c; +END; +$$ +INSERT INTO t1 SET c1=NULL; +ALTER TABLE t1 ADD c41 INT FIRST; +ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8123. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs +ALTER TABLE t1 ADD c41 INT FIRST; +ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8123. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SELECT COUNT(*) FROM t1; +COUNT(*) +1 +DROP TABLE t1; # End of 10.4 tests +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; +# End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_crash.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_crash.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_crash.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_crash.result 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ # MDEV-11369: Instant ADD COLUMN for InnoDB # CREATE TABLE t1(id INT PRIMARY KEY, c2 INT UNIQUE) -ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +ENGINE=InnoDB STATS_PERSISTENT=0 ROW_FORMAT=REDUNDANT; CREATE TABLE t2 LIKE t1; INSERT INTO t1 VALUES(0,2); INSERT INTO t2 VALUES(2,1); @@ -160,7 +160,7 @@ `c2` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c2` (`c2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=0 ROW_FORMAT=REDUNDANT SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( @@ -168,7 +168,7 @@ `c2` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `c2` (`c2`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci STATS_PERSISTENT=0 ROW_FORMAT=REDUNDANT SHOW CREATE TABLE t3; Table Create Table t3 CREATE TABLE `t3` ( @@ -202,27 +202,3 @@ test.t2 check status OK DROP TABLE t1,t2; db.opt -# -# MDEV-26198 Assertion `0' failed in row_log_table_apply_op during -# ADD PRIMARY KEY or OPTIMIZE TABLE -# -CREATE TABLE t1(f1 year default null, f2 year default null, -f3 text, f4 year default null, f5 year default null, -f6 year default null, f7 year default null, -f8 year default null)ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -INSERT INTO t1 VALUES(1, 1, 1, 1, 1, 1, 1, 1); -ALTER TABLE t1 ADD COLUMN f9 year default null, ALGORITHM=INPLACE; -set DEBUG_SYNC="row_log_table_apply1_before SIGNAL con1_insert WAIT_FOR con1_finish"; -ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ADD COLUMN f10 YEAR DEFAULT NULL, ALGORITHM=INPLACE; -connect con1,localhost,root,,,; -SET DEBUG_SYNC="now WAIT_FOR con1_insert"; -INSERT IGNORE INTO t1 (f3) VALUES ( 'b' ); -INSERT IGNORE INTO t1 (f3) VALUES ( 'l' ); -SET DEBUG_SYNC="now SIGNAL con1_finish"; -connection default; -disconnect con1; -SET DEBUG_SYNC=RESET; -CHECK TABLE t1; -Table Op Msg_type Msg_text -test.t1 check status OK -DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,8 @@ -@@ -527,4 +527,4 @@ +@@ -527,6 +527,6 @@ FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; instants --35 -+36 +-37 ++38 + SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; SET @old_instant= (SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'); @@ -475,10 +477,59 @@ INSERT INTO t1 VALUES(1, 2); ERROR HY000: Lock wait timeout exceeded; try restarting transaction SET DEBUG_SYNC="now SIGNAL alter_progress"; -disconnect con1; connection default; DROP TABLE t1; +# +# MDEV-26198 Assertion `0' failed in row_log_table_apply_op during +# ADD PRIMARY KEY or OPTIMIZE TABLE +# +CREATE TABLE t1(f1 year default null, f2 year default null, +f3 text, f4 year default null, f5 year default null, +f6 year default null, f7 year default null, +f8 year default null)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 1, 1, 1, 1, 1, 1, 1); +ALTER TABLE t1 ADD COLUMN f9 year default null, ALGORITHM=INPLACE; +set DEBUG_SYNC="row_log_table_apply1_before SIGNAL con1_insert WAIT_FOR con1_finish"; +ALTER TABLE t1 ADD COLUMN f10 YEAR DEFAULT NULL, FORCE, ALGORITHM=INPLACE; +connection con1; +SET DEBUG_SYNC="now WAIT_FOR con1_insert"; +INSERT IGNORE INTO t1 (f3) VALUES ( 'b' ); +INSERT IGNORE INTO t1 (f3) VALUES ( 'l' ); +SET DEBUG_SYNC="now SIGNAL con1_finish"; +connection default; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +# +# MDEV-19044 Alter table corrupts while applying the +# modification log +# +CREATE TABLE t1 ( +f1 INT, +f2 INT, +f3 char(19) CHARACTER SET utf8mb3, +f4 VARCHAR(500), +f5 TEXT)ENGINE=InnoDB; +INSERT INTO t1 VALUES(3, 1, REPEAT('a', 2), REPEAT("b", 20),'a'); +ALTER TABLE t1 ADD COLUMN f6 INT NOT NULL, ALGORITHM=INSTANT; +INSERT INTO t1 VALUES(1, 2, REPEAT('InnoDB', 2), +REPEAT("MariaDB", 20), REPEAT('a', 8000), 12); +INSERT INTO t1 VALUES(1, 2, REPEAT('MYSQL', 2), +REPEAT("MariaDB", 20), REPEAT('a', 8000), 12); +SET DEBUG_SYNC='innodb_inplace_alter_table_enter SIGNAL con1_begin WAIT_FOR con1_update'; +ALTER TABLE t1 MODIFY COLUMN f2 INT NOT NULL, FORCE, ALGORITHM=INPLACE; +connection con1; +SET DEBUG_SYNC='now WAIT_FOR con1_begin'; +UPDATE t1 SET f2=204 order by f1 limit 2; +SET DEBUG_SYNC='now SIGNAL con1_update'; +connection default; +disconnect con1; SET DEBUG_SYNC=reset; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; # End of 10.4 tests # # MDEV-22867 Assertion instant.n_core_fields == n_core_fields @@ -523,4 +574,6 @@ FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; instants -35 +37 +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; +# End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_extend.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_extend.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_extend.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_extend.result 2024-08-03 07:29:58.000000000 +0000 @@ -318,3 +318,14 @@ Table Op Msg_type Msg_text best.t1 check status OK drop database best; +# +# MDEV-33214 Table is getting rebuild with +# ALTER TABLE ADD COLUMN +# +use test; +CREATE TABLE t1(f1 INT, f2 VARCHAR(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +INSERT INTO t1 VALUES(1,'abc'),(2,'def'); +ALTER TABLE t1 ADD (f3 VARCHAR(5000), f4 VARCHAR(20)), ALGORITHM=instant; +ALTER TABLE t1 ADD f5 TEXT, ALGORITHM=INSTANT; +DROP TABLE t1; +# End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_import.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_import.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_import.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_import.result 2024-08-03 07:29:58.000000000 +0000 @@ -64,6 +64,7 @@ flush tables t2 for export; unlock tables; alter table t1 import tablespace; +# restart select * from t1; z 42 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_purge.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_purge.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -5,7 +5,7 @@ connect prevent_purge,localhost,root; START TRANSACTION WITH CONSISTENT SNAPSHOT; connection default; -CREATE TABLE t1 (f1 INT, f2 INT) ENGINE=InnoDB; +CREATE TABLE t1 (f1 INT, f2 INT) ENGINE=InnoDB STATS_PERSISTENT=0; INSERT INTO t1 () VALUES (); ALTER TABLE t1 DROP f2, ADD COLUMN f2 INT; ALTER TABLE t1 DROP f1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_rollback.result mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_rollback.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/instant_alter_rollback.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/instant_alter_rollback.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,4 @@ +SET GLOBAL innodb_stats_persistent = 0; FLUSH TABLES; # # MDEV-11369: Instant ADD COLUMN for InnoDB diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/lock_insert_into_empty.result mariadb-10.11.9/mysql-test/suite/innodb/r/lock_insert_into_empty.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/lock_insert_into_empty.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/lock_insert_into_empty.result 2024-08-03 07:29:58.000000000 +0000 @@ -47,6 +47,9 @@ INSERT INTO t1 SET k=1; START TRANSACTION; INSERT INTO t1 SET k=2; +SELECT count(*) > 0 FROM mysql.innodb_index_stats lock in share mode; +count(*) > 0 +1 connect con1,localhost,root,,test; SET innodb_lock_wait_timeout=0; CREATE TABLE t2 (pk INT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB @@ -54,4 +57,6 @@ ERROR HY000: Lock wait timeout exceeded; try restarting transaction disconnect con1; connection default; +SET innodb_lock_wait_timeout=default; DROP TABLE t1; +DROP TABLE IF EXISTS t2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/lock_isolation.result mariadb-10.11.9/mysql-test/suite/innodb/r/lock_isolation.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/lock_isolation.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/lock_isolation.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,157 @@ +# +# MDEV-26642 Weird SELECT view when a record is +# modified to the same value by two transactions +# MDEV-32898 Phantom rows caused by updates of PRIMARY KEY +# +CREATE TABLE t(a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t VALUES (1,1),(2,2); +BEGIN; +SELECT * FROM t LOCK IN SHARE MODE; +a b +1 1 +2 2 +connect con_weird,localhost,root; +BEGIN; +SELECT * FROM t; +a b +1 1 +2 2 +connect consistent,localhost,root; +SET innodb_snapshot_isolation=ON; +BEGIN; +SELECT * FROM t; +a b +1 1 +2 2 +connection default; +UPDATE t SET a=3 WHERE b=2; +COMMIT; +connection consistent; +UPDATE t SET b=3; +ERROR HY000: Record has changed since last read in table 't' +SELECT * FROM t; +a b +1 1 +3 2 +COMMIT; +connection con_weird; +UPDATE t SET b=3; +SELECT * FROM t; +a b +1 3 +2 2 +3 3 +COMMIT; +connection default; +SELECT * FROM t; +a b +1 3 +3 3 +DROP TABLE t; +# +# MDEV-26643 Inconsistent behaviors of UPDATE under +# READ UNCOMMITTED and READ COMMITTED isolation level +# +CREATE TABLE t(a INT, b INT) ENGINE=InnoDB; +INSERT INTO t VALUES(NULL, 1), (2, 2); +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +BEGIN; +UPDATE t SET a = 10; +connection consistent; +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +UPDATE t SET b = 20 WHERE a; +connection default; +COMMIT; +connection consistent; +SELECT * FROM t; +a b +10 20 +10 20 +connection default; +TRUNCATE TABLE t; +INSERT INTO t VALUES(NULL, 1), (2, 2); +BEGIN; +UPDATE t SET a = 10; +connection consistent; +SET TRANSACTION ISOLATION LEVEL READ COMMITTED; +UPDATE t SET b = 20 WHERE a; +connection default; +COMMIT; +connection consistent; +SELECT * FROM t; +a b +10 20 +10 20 +connection default; +TRUNCATE TABLE t; +INSERT INTO t VALUES(NULL, 1), (2, 2); +BEGIN; +UPDATE t SET a = 10; +connection con_weird; +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +UPDATE t SET b = 20 WHERE a; +connection default; +SELECT * FROM t; +a b +10 1 +10 2 +COMMIT; +connection con_weird; +COMMIT; +connection default; +SELECT * FROM t; +a b +10 1 +10 20 +TRUNCATE TABLE t; +# +# MDEV-34108 Inappropriate semi-consistent read in snapshot isolation +# +INSERT INTO t VALUES(NULL, 1), (1, 1); +BEGIN; +UPDATE t SET b = 3; +connection consistent; +SET TRANSACTION ISOLATION LEVEL READ COMMITTED; +BEGIN; +UPDATE t SET b = 2 WHERE a; +connection default; +UPDATE t SET a = 1; +COMMIT; +connection consistent; +COMMIT; +connection default; +SELECT * FROM t; +a b +1 2 +1 2 +DROP TABLE t; +# +# MDEV-33802 Weird read view after ROLLBACK of other transactions +# +CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB; +INSERT INTO t SET a=1; +BEGIN; +INSERT INTO t SET a=2; +connection consistent; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; +ERROR HY000: Record has changed since last read in table 't' +connection con_weird; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; +connection default; +ROLLBACK; +connection con_weird; +a b +1 NULL +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; +a b +1 NULL +disconnect con_weird; +connection consistent; +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; +a b +1 NULL +disconnect consistent; +connection default; +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/lock_memory.result mariadb-10.11.9/mysql-test/suite/innodb/r/lock_memory.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/lock_memory.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/lock_memory.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,20 @@ +# +# MDEV-28800 SIGABRT due to running out of memory for InnoDB locks +# +CREATE TABLE t1 (col1 INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +START TRANSACTION; +INSERT INTO t1 SELECT a.* FROM t1 a, t1 b, t1 c, t1 d; +SELECT CASE WHEN (POOL_SIZE - (FREE_BUFFERS + DATABASE_PAGES)) <= 10 THEN "PASSED" + ELSE (POOL_SIZE - (FREE_BUFFERS + DATABASE_PAGES)) END +FROM information_schema.innodb_buffer_pool_stats; +CASE WHEN (POOL_SIZE - (FREE_BUFFERS + DATABASE_PAGES)) <= 10 THEN "PASSED" + ELSE (POOL_SIZE - (FREE_BUFFERS + DATABASE_PAGES)) END +PASSED +COMMIT; +SELECT COUNT(*) FROM t1; +COUNT(*) +65552 +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/lock_memory_debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/lock_memory_debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/lock_memory_debug.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/lock_memory_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,13 @@ +# +# MDEV-34166 Server could hang with BP < 80M under stress +# +call mtr.add_suppression("\\[Warning\\] InnoDB: Over 67 percent of the buffer pool"); +CREATE TABLE t1 (col1 INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2),(3),(4),(5); +SET STATEMENT debug_dbug='+d,innodb_skip_lock_bitmap' FOR +INSERT INTO t1 SELECT a.* FROM t1 a, t1 b, t1 c, t1 d, t1 e, t1 f, t1 g LIMIT 45000; +ERROR HY000: The total number of locks exceeds the lock table size +SELECT COUNT(*) FROM t1; +COUNT(*) +5 +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/lock_move_wait_lock_race.result mariadb-10.11.9/mysql-test/suite/innodb/r/lock_move_wait_lock_race.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/lock_move_wait_lock_race.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/lock_move_wait_lock_race.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,5 @@ -CREATE TABLE t (pk int PRIMARY KEY, c varchar(10)) ENGINE=InnoDB; +CREATE TABLE t (pk int PRIMARY KEY, c varchar(10)) +STATS_PERSISTENT=0 ENGINE=InnoDB; INSERT INTO t VALUES (10, "0123456789"); connection default; BEGIN; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/lock_release.result mariadb-10.11.9/mysql-test/suite/innodb/r/lock_release.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/lock_release.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/lock_release.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,23 @@ +# +# MDEV-34542 Assertion `lock_trx_has_sys_table_locks(trx) == __null' +# failed in void row_mysql_unfreeze_data_dictionary(trx_t*) +# +# +CREATE TABLE t1 (c1 CHAR(1) ,c2 INT) ENGINE=INNODB +PARTITION BY LINEAR HASH ((c2)) PARTITIONS 512; +CREATE TABLE t2 (a INT) ENGINE=INNODB; +set @old_table_open_cache= @@table_open_cache; +XA START 'a'; +INSERT INTO mysql.innodb_index_stats SELECT * FROM mysql.innodb_index_stats WHERE table_name=''; +SET GLOBAL table_open_cache=10; +INSERT into t2 (a) VALUES (1); +SELECT * FROM t1; +c1 c2 +XA END 'a'; +XA PREPARE 'a'; +SELECT sleep(3); +sleep(3) +0 +XA ROLLBACK 'a'; +DROP TABLE t1, t2; +SET GLOBAL table_open_cache=@old_table_open_cache; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/log_file.result mariadb-10.11.9/mysql-test/suite/innodb/r/log_file.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/log_file.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/log_file.result 2024-08-03 07:29:58.000000000 +0000 @@ -287,7 +287,20 @@ AND support IN ('YES', 'DEFAULT', 'ENABLED'); 1 1 -# restart +# restart: --innodb-log-write-ahead-size=513 +SELECT * FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); +ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS +# restart: --innodb-log-write-ahead-size=4095 +SELECT * FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); +ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS +# restart: --innodb-log-write-ahead-size=10000 +SELECT @@innodb_log_write_ahead_size; +@@innodb_log_write_ahead_size +4096 # Cleanup bak_ib_logfile0 bak_ibdata1 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/log_file_name.result mariadb-10.11.9/mysql-test/suite/innodb/r/log_file_name.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/log_file_name.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/log_file_name.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,4 @@ +call mtr.add_suppression("InnoDB: Header page consists of zero bytes in datafile:"); SET GLOBAL innodb_file_per_table=ON; FLUSH TABLES; CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/log_file_overwrite.result mariadb-10.11.9/mysql-test/suite/innodb/r/log_file_overwrite.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/log_file_overwrite.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/log_file_overwrite.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,21 @@ +call mtr.add_suppression("InnoDB: Plugin initialization aborted"); +call mtr.add_suppression("plugin 'InnoDB' registration as a STORAGE ENGINE failed."); +CREATE TABLE t1(f1 INT NOT NULL, f2 TEXT)ENGINE=InnoDB; +# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0 +INSERT INTO t1 SELECT seq, repeat('a', 4000) FROM seq_1_to_1800; +# restart: --debug_dbug=+d,before_final_redo_apply --innodb_log_file_size=8M +# restart: --innodb_log_file_size=10M +# +# MDEV-34519 innodb_log_checkpoint_now crashes when +# innodb_read_only is enabled +# +# restart: --innodb-force-recovery=6 +SET GLOBAL innodb_log_checkpoint_now=1; +Warnings: +Warning 138 InnoDB doesn't force checkpoint when innodb-force-recovery=6. +# restart: --innodb-read-only=1 +SET GLOBAL innodb_log_checkpoint_now=1; +Warnings: +Warning 138 InnoDB doesn't force checkpoint when innodb-read-only=1. +# restart +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/log_upgrade_101_flags.result mariadb-10.11.9/mysql-test/suite/innodb/r/log_upgrade_101_flags.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/log_upgrade_101_flags.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/log_upgrade_101_flags.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,12 @@ +call mtr.add_suppression("InnoDB: The change buffer is corrupted"); +call mtr.add_suppression("InnoDB: Tablespace size stored in header is 768 pages, but the sum of data file sizes is 384 pages"); +call mtr.add_suppression("InnoDB: adjusting FSP_SPACE_FLAGS of file"); +# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/log_upgrade --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/log_upgrade --innodb-force-recovery=5 --innodb-log-file-size=4m --innodb_page_size=32k --innodb_buffer_pool_size=10M +SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); +COUNT(*) +1 +FOUND 1 /InnoDB: Upgrading redo log:/ in mysqld.1.err +# restart +# End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,compact,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,compact,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,compact,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,compact,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:51:26.070418078 +0300 -@@ -3,45 +3,65 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,compact.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,compact.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,compact.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,compact.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,80 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:51:26.070418078 +0300 +@@ -3,45 +3,65 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,dynamic,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,dynamic,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,dynamic,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,dynamic,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,224 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:52:54.580956978 +0300 -@@ -3,45 +3,207 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) --) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. --CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) -+) ENGINE=INNODB; -+ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -+CREATE TABLE t1 ( -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, -+c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, -+c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, -+c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, -+c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, -+c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, -+c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, -+c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, -+c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, -+c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, -+c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, -+c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, -+c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, -+c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, -+c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, -+c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, -+c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, -+c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, -+c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, -+c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, -+c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, -+c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, -+c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, -+c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, -+c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, -+c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, -+c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, -+c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, -+c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, -+c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, -+c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, -+c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, -+c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, -+c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, -+c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, -+c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, -+c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, -+c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, -+c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, -+c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, -+c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, -+c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, -+c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, -+c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, -+c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, -+c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, -+c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, -+c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, -+c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, -+c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, -+c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, -+c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, -+c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, -+c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, -+c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, -+c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, -+c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,dynamic.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,dynamic.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,dynamic.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,dynamic.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,224 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:52:54.580956978 +0300 +@@ -3,45 +3,207 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) +-) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +-CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) ++) ENGINE=INNODB; ++ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs ++CREATE TABLE t1 ( ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, ++c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, ++c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, ++c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, ++c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, ++c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, ++c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, ++c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, ++c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, ++c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, ++c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, ++c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, ++c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, ++c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, ++c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, ++c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, ++c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, ++c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, ++c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, ++c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, ++c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, ++c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, ++c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, ++c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, ++c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, ++c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, ++c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, ++c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, ++c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, ++c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, ++c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, ++c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, ++c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, ++c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, ++c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, ++c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, ++c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, ++c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, ++c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, ++c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, ++c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, ++c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, ++c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, ++c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, ++c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, ++c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, ++c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, ++c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, ++c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, ++c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, ++c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, ++c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, ++c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, ++c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, ++c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, ++c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, ++c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,innodb,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,innodb,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,innodb,redundant.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,innodb,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:55:05.258762945 +0300 -@@ -3,45 +3,65 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,16k,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,16k,redundant.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,80 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:55:05.258762945 +0300 +@@ -3,45 +3,65 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 8123). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,compact,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,compact,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,compact,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,compact,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:27:08.004932026 +0300 -@@ -3,45 +3,104 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) --) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. --CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788) -+) ENGINE=INNODB; -+ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+CREATE TABLE t1 ( -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,compact.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,compact.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,compact.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,compact.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,121 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:27:08.004932026 +0300 +@@ -3,45 +3,104 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) +-) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +-CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788) ++) ENGINE=INNODB; ++ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++CREATE TABLE t1 ( ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,dynamic,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,dynamic,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,dynamic,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,dynamic,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,366 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:38:41.609328820 +0300 -@@ -3,45 +3,351 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, -+c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, -+c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, -+c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, -+c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, -+c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, -+c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, -+c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, -+c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, -+c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, -+c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, -+c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, -+c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, -+c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, -+c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, -+c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, -+c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, -+c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, -+c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, -+c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, -+c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, -+c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, -+c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, -+c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, -+c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, -+c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, -+c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, -+c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, -+c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, -+c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, -+c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, -+c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, -+c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, -+c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, -+c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, -+c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, -+c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, -+c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, -+c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, -+c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, -+c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, -+c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, -+c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, -+c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, -+c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, -+c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, -+c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, -+c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, -+c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, -+c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, -+c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, -+c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, -+c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, -+c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, -+c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, -+c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, -+c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, -+c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, -+c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, -+c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, -+c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, -+c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, -+c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, -+c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, -+c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, -+c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, -+c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, -+c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, -+c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, -+c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, -+c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, -+c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, -+c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, -+c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, -+c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, -+c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, -+c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, -+c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, -+c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, -+c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, -+c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, -+c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, -+c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, -+c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, -+c771 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, -+c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, -+c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, -+c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, -+c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, -+c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, -+c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, -+c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, -+c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, -+c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, -+c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, -+c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, -+c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, -+c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, -+c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, -+c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, -+c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, -+c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, -+c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, -+c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, -+c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, -+c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, -+c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, -+c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, -+c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, -+c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, -+c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, -+c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, -+c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, -+c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, -+c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, -+c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, -+c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, -+c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, -+c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, -+c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, -+c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, -+c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, -+c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, -+c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, -+c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, -+c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, -+c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, -+c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, -+c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, -+c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, -+c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, -+c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, -+c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, -+c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, -+c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, -+c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, -+c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, -+c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, -+c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, -+c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, -+c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, -+c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, -+c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, -+c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, -+c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, -+c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, -+c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, -+c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, -+c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, -+c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, -+c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, -+c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, -+c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, -+c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, -+c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, -+c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, -+c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, -+c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, -+c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, -+c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, -+c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, -+c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, -+c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, -+c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, -+c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, -+c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, -+c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, -+c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, -+c771 TEXT, c772 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,dynamic.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,dynamic.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,dynamic.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,dynamic.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,366 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:38:41.609328820 +0300 +@@ -3,45 +3,351 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, ++c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, ++c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, ++c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, ++c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, ++c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, ++c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, ++c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, ++c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, ++c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, ++c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, ++c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, ++c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, ++c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, ++c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, ++c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, ++c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, ++c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, ++c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, ++c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, ++c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, ++c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, ++c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, ++c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, ++c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, ++c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, ++c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, ++c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, ++c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, ++c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, ++c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, ++c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, ++c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, ++c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, ++c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, ++c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, ++c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, ++c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, ++c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, ++c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, ++c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, ++c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, ++c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, ++c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, ++c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, ++c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, ++c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, ++c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, ++c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, ++c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, ++c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, ++c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, ++c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, ++c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, ++c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, ++c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, ++c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, ++c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, ++c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, ++c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, ++c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, ++c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, ++c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, ++c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, ++c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, ++c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, ++c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, ++c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, ++c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, ++c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, ++c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, ++c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, ++c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, ++c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, ++c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, ++c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, ++c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, ++c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, ++c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, ++c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, ++c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, ++c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, ++c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, ++c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, ++c771 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, ++c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, ++c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, ++c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, ++c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, ++c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, ++c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, ++c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, ++c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, ++c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, ++c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, ++c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, ++c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, ++c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, ++c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, ++c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, ++c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, ++c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, ++c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, ++c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, ++c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, ++c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, ++c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, ++c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, ++c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, ++c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, ++c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, ++c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, ++c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, ++c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, ++c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, ++c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, ++c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, ++c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, ++c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, ++c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, ++c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, ++c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, ++c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, ++c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, ++c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, ++c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, ++c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, ++c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, ++c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, ++c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, ++c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, ++c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, ++c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, ++c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, ++c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, ++c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, ++c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, ++c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, ++c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, ++c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, ++c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, ++c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, ++c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, ++c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, ++c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, ++c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, ++c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, ++c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, ++c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, ++c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, ++c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, ++c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, ++c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, ++c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, ++c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, ++c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, ++c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, ++c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, ++c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, ++c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, ++c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, ++c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, ++c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, ++c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, ++c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, ++c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, ++c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, ++c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, ++c771 TEXT, c772 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,innodb,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,innodb,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,innodb,redundant.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,innodb,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:41:03.319664978 +0300 -@@ -3,45 +3,104 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) --) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. --CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788) -+) ENGINE=INNODB; -+ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+CREATE TABLE t1 ( -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,32k,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,32k,redundant.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,121 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:41:03.319664978 +0300 +@@ -3,45 +3,104 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) +-) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +-CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788) ++) ENGINE=INNODB; ++ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++CREATE TABLE t1 ( ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,compact,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,compact,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,compact,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,compact,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:56:23.489432164 +0300 -@@ -1,47 +1,37 @@ - call mtr.add_suppression("Cannot add field `.*` in table `test`.`t1` because after adding it, the row size is"); - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), --c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), --c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c5 CHAR(255), c6 CHAR(255), c7 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), --c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), --c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), --c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), --c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), --c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), --c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( --c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c1 VARCHAR(788), c2 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) -+c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c1 TEXT, c2 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,compact.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,compact.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,compact.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,compact.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,62 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:56:23.489432164 +0300 +@@ -1,47 +1,37 @@ + call mtr.add_suppression("Cannot add field `.*` in table `test`.`t1` because after adding it, the row size is"); + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), +-c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), +-c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c5 CHAR(255), c6 CHAR(255), c7 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), +-c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), +-c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), +-c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +-c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), +-c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +-c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( +-c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c1 VARCHAR(788), c2 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) ++c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c1 TEXT, c2 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,dynamic,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,dynamic,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,dynamic,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,dynamic,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:57:38.636143710 +0300 -@@ -1,47 +1,103 @@ - call mtr.add_suppression("Cannot add field `.*` in table `test`.`t1` because after adding it, the row size is"); - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), --c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), --c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c5 CHAR(255), c6 CHAR(255), c7 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), --c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), --c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), --c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), --c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), --c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), --c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) --) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. --CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) -+) ENGINE=INNODB; -+ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -+CREATE TABLE t1 ( -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,dynamic.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,dynamic.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,dynamic.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,dynamic.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,128 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:57:38.636143710 +0300 +@@ -1,47 +1,103 @@ + call mtr.add_suppression("Cannot add field `.*` in table `test`.`t1` because after adding it, the row size is"); + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), +-c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), +-c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c5 CHAR(255), c6 CHAR(255), c7 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), +-c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), +-c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), +-c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +-c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), +-c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +-c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) +-) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +-CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) ++) ENGINE=INNODB; ++ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs ++CREATE TABLE t1 ( ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,innodb,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,innodb,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,innodb,redundant.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,innodb,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:58:58.318768169 +0300 -@@ -1,47 +1,37 @@ - call mtr.add_suppression("Cannot add field `.*` in table `test`.`t1` because after adding it, the row size is"); - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), --c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), --c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c5 CHAR(255), c6 CHAR(255), c7 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), --c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), --c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), --c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), --c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), --c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), --c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( --c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c1 VARCHAR(788), c2 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) -+c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c1 TEXT, c2 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,4k,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,4k,redundant.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,62 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:58:58.318768169 +0300 +@@ -1,47 +1,37 @@ + call mtr.add_suppression("Cannot add field `.*` in table `test`.`t1` because after adding it, the row size is"); + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), +-c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), +-c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c5 CHAR(255), c6 CHAR(255), c7 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), +-c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), +-c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), +-c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +-c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), +-c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +-c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( +-c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c1 VARCHAR(788), c2 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) ++c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c1 TEXT, c2 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 1979). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,compact,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,compact,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,compact,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,compact,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,203 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:45:21.760116841 +0300 -@@ -3,45 +3,186 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), -+c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), -+c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), -+c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), -+c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), -+c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), -+c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), -+c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), -+c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), -+c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), -+c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), -+c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), -+c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), -+c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), -+c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), -+c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), -+c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), -+c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), -+c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), -+c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), -+c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), -+c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), -+c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), -+c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), -+c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), -+c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), -+c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), -+c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), -+c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), -+c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), -+c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), -+c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), -+c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255), -+c129 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), -+c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), -+c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), -+c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), -+c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), -+c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), -+c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), -+c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), -+c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), -+c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), -+c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), -+c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), -+c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), -+c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), -+c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), -+c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), -+c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), -+c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), -+c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), -+c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), -+c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), -+c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), -+c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), -+c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), -+c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), -+c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), -+c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), -+c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), -+c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), -+c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), -+c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), -+c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), -+c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255), c128 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) --) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. --CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788) -+) ENGINE=INNODB; -+ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+CREATE TABLE t1 ( -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,compact.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,compact.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,compact.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,compact.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,203 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:45:21.760116841 +0300 +@@ -3,45 +3,186 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), ++c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), ++c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), ++c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), ++c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), ++c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), ++c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), ++c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), ++c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), ++c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), ++c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), ++c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), ++c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), ++c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), ++c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), ++c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), ++c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), ++c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), ++c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), ++c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), ++c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), ++c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), ++c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), ++c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), ++c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), ++c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), ++c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), ++c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), ++c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), ++c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), ++c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), ++c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), ++c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255), ++c129 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), ++c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), ++c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), ++c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), ++c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), ++c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), ++c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), ++c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), ++c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), ++c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), ++c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), ++c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), ++c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), ++c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), ++c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), ++c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), ++c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), ++c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), ++c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), ++c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), ++c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), ++c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), ++c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), ++c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), ++c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), ++c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), ++c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), ++c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), ++c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), ++c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), ++c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), ++c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), ++c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255), c128 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) +-) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +-CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788) ++) ENGINE=INNODB; ++ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++CREATE TABLE t1 ( ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,dynamic,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,dynamic,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,dynamic,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,dynamic,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,501 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:48:32.453208310 +0300 -@@ -3,45 +3,486 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), -+c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), -+c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), -+c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), -+c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), -+c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), -+c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), -+c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), -+c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), -+c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), -+c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), -+c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), -+c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), -+c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), -+c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), -+c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), -+c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), -+c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), -+c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), -+c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), -+c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), -+c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), -+c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), -+c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), -+c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), -+c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), -+c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), -+c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), -+c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), -+c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), -+c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), -+c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), -+c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255), -+c129 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), -+c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), -+c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), -+c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), -+c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), -+c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), -+c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), -+c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), -+c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), -+c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), -+c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), -+c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), -+c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), -+c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), -+c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), -+c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), -+c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), -+c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), -+c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), -+c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), -+c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), -+c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), -+c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), -+c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), -+c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), -+c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), -+c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), -+c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), -+c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), -+c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), -+c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), -+c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), -+c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255), c128 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, -+c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, -+c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, -+c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, -+c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, -+c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, -+c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, -+c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, -+c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, -+c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, -+c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, -+c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, -+c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, -+c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, -+c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, -+c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, -+c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, -+c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, -+c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, -+c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, -+c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, -+c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, -+c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, -+c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, -+c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, -+c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, -+c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, -+c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, -+c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, -+c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, -+c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, -+c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, -+c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, -+c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, -+c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, -+c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, -+c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, -+c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, -+c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, -+c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, -+c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, -+c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, -+c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, -+c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, -+c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, -+c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, -+c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, -+c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, -+c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, -+c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, -+c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, -+c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, -+c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, -+c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, -+c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, -+c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, -+c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, -+c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, -+c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, -+c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, -+c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, -+c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, -+c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, -+c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, -+c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, -+c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, -+c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, -+c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, -+c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, -+c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, -+c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, -+c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, -+c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, -+c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, -+c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, -+c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, -+c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, -+c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, -+c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, -+c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, -+c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, -+c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, -+c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, -+c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, -+c771 TEXT, c772 TEXT, c773 TEXT, c774 TEXT, c775 TEXT, c776 TEXT, c777 TEXT, -+c778 TEXT, c779 TEXT, c780 TEXT, c781 TEXT, c782 TEXT, c783 TEXT, c784 TEXT, -+c785 TEXT, c786 TEXT, c787 TEXT, c788 TEXT, c789 TEXT, c790 TEXT, c791 TEXT, -+c792 TEXT, c793 TEXT, c794 TEXT, c795 TEXT, c796 TEXT, c797 TEXT, c798 TEXT, -+c799 TEXT, c800 TEXT, c801 TEXT, c802 TEXT, c803 TEXT, c804 TEXT, c805 TEXT, -+c806 TEXT, c807 TEXT, c808 TEXT, c809 TEXT, c810 TEXT, c811 TEXT, c812 TEXT, -+c813 TEXT, c814 TEXT, c815 TEXT, c816 TEXT, c817 TEXT, c818 TEXT, c819 TEXT, -+c820 TEXT, c821 TEXT, c822 TEXT, c823 TEXT, c824 TEXT, c825 TEXT, c826 TEXT, -+c827 TEXT, c828 TEXT, c829 TEXT, c830 TEXT, c831 TEXT, c832 TEXT, c833 TEXT, -+c834 TEXT, c835 TEXT, c836 TEXT, c837 TEXT, c838 TEXT, c839 TEXT, c840 TEXT, -+c841 TEXT, c842 TEXT, c843 TEXT, c844 TEXT, c845 TEXT, c846 TEXT, c847 TEXT, -+c848 TEXT, c849 TEXT, c850 TEXT, c851 TEXT, c852 TEXT, c853 TEXT, c854 TEXT, -+c855 TEXT, c856 TEXT, c857 TEXT, c858 TEXT, c859 TEXT, c860 TEXT, c861 TEXT, -+c862 TEXT, c863 TEXT, c864 TEXT, c865 TEXT, c866 TEXT, c867 TEXT, c868 TEXT, -+c869 TEXT, c870 TEXT, c871 TEXT, c872 TEXT, c873 TEXT, c874 TEXT, c875 TEXT, -+c876 TEXT, c877 TEXT, c878 TEXT, c879 TEXT, c880 TEXT, c881 TEXT, c882 TEXT, -+c883 TEXT, c884 TEXT, c885 TEXT, c886 TEXT, c887 TEXT, c888 TEXT, c889 TEXT, -+c890 TEXT, c891 TEXT, c892 TEXT, c893 TEXT, c894 TEXT, c895 TEXT, c896 TEXT, -+c897 TEXT, c898 TEXT, c899 TEXT, c900 TEXT, c901 TEXT, c902 TEXT, c903 TEXT, -+c904 TEXT, c905 TEXT, c906 TEXT, c907 TEXT, c908 TEXT, c909 TEXT, c910 TEXT, -+c911 TEXT, c912 TEXT, c913 TEXT, c914 TEXT, c915 TEXT, c916 TEXT, c917 TEXT, -+c918 TEXT, c919 TEXT, c920 TEXT, c921 TEXT, c922 TEXT, c923 TEXT, c924 TEXT, -+c925 TEXT, c926 TEXT, c927 TEXT, c928 TEXT, c929 TEXT, c930 TEXT, c931 TEXT, -+c932 TEXT, c933 TEXT, c934 TEXT, c935 TEXT, c936 TEXT, c937 TEXT, c938 TEXT, -+c939 TEXT, c940 TEXT, c941 TEXT, c942 TEXT, c943 TEXT, c944 TEXT, c945 TEXT, -+c946 TEXT, c947 TEXT, c948 TEXT, c949 TEXT, c950 TEXT, c951 TEXT, c952 TEXT, -+c953 TEXT, c954 TEXT, c955 TEXT, c956 TEXT, c957 TEXT, c958 TEXT, c959 TEXT, -+c960 TEXT, c961 TEXT, c962 TEXT, c963 TEXT, c964 TEXT, c965 TEXT, c966 TEXT, -+c967 TEXT, c968 TEXT, c969 TEXT, c970 TEXT, c971 TEXT, c972 TEXT, c973 TEXT, -+c974 TEXT, c975 TEXT, c976 TEXT, c977 TEXT, c978 TEXT, c979 TEXT, c980 TEXT, -+c981 TEXT, c982 TEXT, c983 TEXT, c984 TEXT, c985 TEXT, c986 TEXT, c987 TEXT, -+c988 TEXT, c989 TEXT, c990 TEXT, c991 TEXT, c992 TEXT, c993 TEXT, c994 TEXT, -+c995 TEXT, c996 TEXT, c997 TEXT, c998 TEXT, c999 TEXT, c1000 TEXT, c1001 TEXT, -+c1002 TEXT, c1003 TEXT, c1004 TEXT, c1005 TEXT, c1006 TEXT, c1007 TEXT, c1008 TEXT, -+c1009 TEXT, c1010 TEXT, c1011 TEXT, c1012 TEXT, c1013 TEXT, c1014 TEXT, c1015 TEXT, -+c1016 TEXT, c1017 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, -+c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, -+c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, -+c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, -+c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, -+c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, -+c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, -+c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, -+c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, -+c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, -+c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, -+c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, -+c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, -+c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, -+c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, -+c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, -+c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, -+c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, -+c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, -+c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, -+c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, -+c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, -+c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, -+c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, -+c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, -+c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, -+c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, -+c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, -+c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, -+c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, -+c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, -+c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, -+c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, -+c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, -+c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, -+c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, -+c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, -+c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, -+c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, -+c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, -+c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, -+c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, -+c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, -+c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, -+c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, -+c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, -+c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, -+c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, -+c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, -+c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, -+c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, -+c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, -+c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, -+c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, -+c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, -+c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, -+c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, -+c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, -+c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, -+c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, -+c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, -+c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, -+c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, -+c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, -+c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, -+c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, -+c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, -+c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, -+c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, -+c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, -+c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, -+c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, -+c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, -+c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, -+c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, -+c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, -+c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, -+c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, -+c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, -+c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, -+c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, -+c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, -+c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, -+c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, -+c771 TEXT, c772 TEXT, c773 TEXT, c774 TEXT, c775 TEXT, c776 TEXT, c777 TEXT, -+c778 TEXT, c779 TEXT, c780 TEXT, c781 TEXT, c782 TEXT, c783 TEXT, c784 TEXT, -+c785 TEXT, c786 TEXT, c787 TEXT, c788 TEXT, c789 TEXT, c790 TEXT, c791 TEXT, -+c792 TEXT, c793 TEXT, c794 TEXT, c795 TEXT, c796 TEXT, c797 TEXT, c798 TEXT, -+c799 TEXT, c800 TEXT, c801 TEXT, c802 TEXT, c803 TEXT, c804 TEXT, c805 TEXT, -+c806 TEXT, c807 TEXT, c808 TEXT, c809 TEXT, c810 TEXT, c811 TEXT, c812 TEXT, -+c813 TEXT, c814 TEXT, c815 TEXT, c816 TEXT, c817 TEXT, c818 TEXT, c819 TEXT, -+c820 TEXT, c821 TEXT, c822 TEXT, c823 TEXT, c824 TEXT, c825 TEXT, c826 TEXT, -+c827 TEXT, c828 TEXT, c829 TEXT, c830 TEXT, c831 TEXT, c832 TEXT, c833 TEXT, -+c834 TEXT, c835 TEXT, c836 TEXT, c837 TEXT, c838 TEXT, c839 TEXT, c840 TEXT, -+c841 TEXT, c842 TEXT, c843 TEXT, c844 TEXT, c845 TEXT, c846 TEXT, c847 TEXT, -+c848 TEXT, c849 TEXT, c850 TEXT, c851 TEXT, c852 TEXT, c853 TEXT, c854 TEXT, -+c855 TEXT, c856 TEXT, c857 TEXT, c858 TEXT, c859 TEXT, c860 TEXT, c861 TEXT, -+c862 TEXT, c863 TEXT, c864 TEXT, c865 TEXT, c866 TEXT, c867 TEXT, c868 TEXT, -+c869 TEXT, c870 TEXT, c871 TEXT, c872 TEXT, c873 TEXT, c874 TEXT, c875 TEXT, -+c876 TEXT, c877 TEXT, c878 TEXT, c879 TEXT, c880 TEXT, c881 TEXT, c882 TEXT, -+c883 TEXT, c884 TEXT, c885 TEXT, c886 TEXT, c887 TEXT, c888 TEXT, c889 TEXT, -+c890 TEXT, c891 TEXT, c892 TEXT, c893 TEXT, c894 TEXT, c895 TEXT, c896 TEXT, -+c897 TEXT, c898 TEXT, c899 TEXT, c900 TEXT, c901 TEXT, c902 TEXT, c903 TEXT, -+c904 TEXT, c905 TEXT, c906 TEXT, c907 TEXT, c908 TEXT, c909 TEXT, c910 TEXT, -+c911 TEXT, c912 TEXT, c913 TEXT, c914 TEXT, c915 TEXT, c916 TEXT, c917 TEXT, -+c918 TEXT, c919 TEXT, c920 TEXT, c921 TEXT, c922 TEXT, c923 TEXT, c924 TEXT, -+c925 TEXT, c926 TEXT, c927 TEXT, c928 TEXT, c929 TEXT, c930 TEXT, c931 TEXT, -+c932 TEXT, c933 TEXT, c934 TEXT, c935 TEXT, c936 TEXT, c937 TEXT, c938 TEXT, -+c939 TEXT, c940 TEXT, c941 TEXT, c942 TEXT, c943 TEXT, c944 TEXT, c945 TEXT, -+c946 TEXT, c947 TEXT, c948 TEXT, c949 TEXT, c950 TEXT, c951 TEXT, c952 TEXT, -+c953 TEXT, c954 TEXT, c955 TEXT, c956 TEXT, c957 TEXT, c958 TEXT, c959 TEXT, -+c960 TEXT, c961 TEXT, c962 TEXT, c963 TEXT, c964 TEXT, c965 TEXT, c966 TEXT, -+c967 TEXT, c968 TEXT, c969 TEXT, c970 TEXT, c971 TEXT, c972 TEXT, c973 TEXT, -+c974 TEXT, c975 TEXT, c976 TEXT, c977 TEXT, c978 TEXT, c979 TEXT, c980 TEXT, -+c981 TEXT, c982 TEXT, c983 TEXT, c984 TEXT, c985 TEXT, c986 TEXT, c987 TEXT, -+c988 TEXT, c989 TEXT, c990 TEXT, c991 TEXT, c992 TEXT, c993 TEXT, c994 TEXT, -+c995 TEXT, c996 TEXT, c997 TEXT, c998 TEXT, c999 TEXT, c1000 TEXT, c1001 TEXT, -+c1002 TEXT, c1003 TEXT, c1004 TEXT, c1005 TEXT, c1006 TEXT, c1007 TEXT, c1008 TEXT, -+c1009 TEXT, c1010 TEXT, c1011 TEXT, c1012 TEXT, c1013 TEXT, c1014 TEXT, c1015 TEXT, -+c1016 TEXT, c1017 TEXT, c1018 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR HY000: Can't create table `test`.`t1` (errno: 185 "Too many columns") diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,dynamic.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,dynamic.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,dynamic.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,dynamic.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,501 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:48:32.453208310 +0300 +@@ -3,45 +3,486 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), ++c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), ++c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), ++c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), ++c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), ++c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), ++c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), ++c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), ++c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), ++c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), ++c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), ++c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), ++c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), ++c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), ++c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), ++c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), ++c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255), ++c65 CHAR(255), c66 CHAR(255), c67 CHAR(255), c68 CHAR(255), ++c69 CHAR(255), c70 CHAR(255), c71 CHAR(255), c72 CHAR(255), ++c73 CHAR(255), c74 CHAR(255), c75 CHAR(255), c76 CHAR(255), ++c77 CHAR(255), c78 CHAR(255), c79 CHAR(255), c80 CHAR(255), ++c81 CHAR(255), c82 CHAR(255), c83 CHAR(255), c84 CHAR(255), ++c85 CHAR(255), c86 CHAR(255), c87 CHAR(255), c88 CHAR(255), ++c89 CHAR(255), c90 CHAR(255), c91 CHAR(255), c92 CHAR(255), ++c93 CHAR(255), c94 CHAR(255), c95 CHAR(255), c96 CHAR(255), ++c97 CHAR(255), c98 CHAR(255), c99 CHAR(255), c100 CHAR(255), ++c101 CHAR(255), c102 CHAR(255), c103 CHAR(255), c104 CHAR(255), ++c105 CHAR(255), c106 CHAR(255), c107 CHAR(255), c108 CHAR(255), ++c109 CHAR(255), c110 CHAR(255), c111 CHAR(255), c112 CHAR(255), ++c113 CHAR(255), c114 CHAR(255), c115 CHAR(255), c116 CHAR(255), ++c117 CHAR(255), c118 CHAR(255), c119 CHAR(255), c120 CHAR(255), ++c121 CHAR(255), c122 CHAR(255), c123 CHAR(255), c124 CHAR(255), ++c125 CHAR(255), c126 CHAR(255), c127 CHAR(255), c128 CHAR(255), ++c129 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), ++c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), ++c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), ++c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), ++c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), ++c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), ++c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), ++c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), ++c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), ++c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), ++c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), ++c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), ++c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), ++c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), ++c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), ++c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), ++c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255), ++c65 VARCHAR(255), c66 VARCHAR(255), c67 VARCHAR(255), c68 VARCHAR(255), ++c69 VARCHAR(255), c70 VARCHAR(255), c71 VARCHAR(255), c72 VARCHAR(255), ++c73 VARCHAR(255), c74 VARCHAR(255), c75 VARCHAR(255), c76 VARCHAR(255), ++c77 VARCHAR(255), c78 VARCHAR(255), c79 VARCHAR(255), c80 VARCHAR(255), ++c81 VARCHAR(255), c82 VARCHAR(255), c83 VARCHAR(255), c84 VARCHAR(255), ++c85 VARCHAR(255), c86 VARCHAR(255), c87 VARCHAR(255), c88 VARCHAR(255), ++c89 VARCHAR(255), c90 VARCHAR(255), c91 VARCHAR(255), c92 VARCHAR(255), ++c93 VARCHAR(255), c94 VARCHAR(255), c95 VARCHAR(255), c96 VARCHAR(255), ++c97 VARCHAR(255), c98 VARCHAR(255), c99 VARCHAR(255), c100 VARCHAR(255), ++c101 VARCHAR(255), c102 VARCHAR(255), c103 VARCHAR(255), c104 VARCHAR(255), ++c105 VARCHAR(255), c106 VARCHAR(255), c107 VARCHAR(255), c108 VARCHAR(255), ++c109 VARCHAR(255), c110 VARCHAR(255), c111 VARCHAR(255), c112 VARCHAR(255), ++c113 VARCHAR(255), c114 VARCHAR(255), c115 VARCHAR(255), c116 VARCHAR(255), ++c117 VARCHAR(255), c118 VARCHAR(255), c119 VARCHAR(255), c120 VARCHAR(255), ++c121 VARCHAR(255), c122 VARCHAR(255), c123 VARCHAR(255), c124 VARCHAR(255), ++c125 VARCHAR(255), c126 VARCHAR(255), c127 VARCHAR(255), c128 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, ++c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, ++c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, ++c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, ++c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, ++c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, ++c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, ++c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, ++c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, ++c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, ++c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, ++c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, ++c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, ++c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, ++c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, ++c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, ++c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, ++c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, ++c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, ++c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, ++c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, ++c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, ++c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, ++c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, ++c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, ++c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, ++c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, ++c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, ++c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, ++c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, ++c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, ++c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, ++c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, ++c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, ++c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, ++c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, ++c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, ++c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, ++c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, ++c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, ++c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, ++c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, ++c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, ++c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, ++c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, ++c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, ++c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, ++c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, ++c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, ++c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, ++c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, ++c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, ++c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, ++c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, ++c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, ++c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, ++c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, ++c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, ++c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, ++c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, ++c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, ++c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, ++c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, ++c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, ++c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, ++c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, ++c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, ++c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, ++c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, ++c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, ++c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, ++c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, ++c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, ++c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, ++c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, ++c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, ++c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, ++c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, ++c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, ++c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, ++c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, ++c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, ++c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, ++c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, ++c771 TEXT, c772 TEXT, c773 TEXT, c774 TEXT, c775 TEXT, c776 TEXT, c777 TEXT, ++c778 TEXT, c779 TEXT, c780 TEXT, c781 TEXT, c782 TEXT, c783 TEXT, c784 TEXT, ++c785 TEXT, c786 TEXT, c787 TEXT, c788 TEXT, c789 TEXT, c790 TEXT, c791 TEXT, ++c792 TEXT, c793 TEXT, c794 TEXT, c795 TEXT, c796 TEXT, c797 TEXT, c798 TEXT, ++c799 TEXT, c800 TEXT, c801 TEXT, c802 TEXT, c803 TEXT, c804 TEXT, c805 TEXT, ++c806 TEXT, c807 TEXT, c808 TEXT, c809 TEXT, c810 TEXT, c811 TEXT, c812 TEXT, ++c813 TEXT, c814 TEXT, c815 TEXT, c816 TEXT, c817 TEXT, c818 TEXT, c819 TEXT, ++c820 TEXT, c821 TEXT, c822 TEXT, c823 TEXT, c824 TEXT, c825 TEXT, c826 TEXT, ++c827 TEXT, c828 TEXT, c829 TEXT, c830 TEXT, c831 TEXT, c832 TEXT, c833 TEXT, ++c834 TEXT, c835 TEXT, c836 TEXT, c837 TEXT, c838 TEXT, c839 TEXT, c840 TEXT, ++c841 TEXT, c842 TEXT, c843 TEXT, c844 TEXT, c845 TEXT, c846 TEXT, c847 TEXT, ++c848 TEXT, c849 TEXT, c850 TEXT, c851 TEXT, c852 TEXT, c853 TEXT, c854 TEXT, ++c855 TEXT, c856 TEXT, c857 TEXT, c858 TEXT, c859 TEXT, c860 TEXT, c861 TEXT, ++c862 TEXT, c863 TEXT, c864 TEXT, c865 TEXT, c866 TEXT, c867 TEXT, c868 TEXT, ++c869 TEXT, c870 TEXT, c871 TEXT, c872 TEXT, c873 TEXT, c874 TEXT, c875 TEXT, ++c876 TEXT, c877 TEXT, c878 TEXT, c879 TEXT, c880 TEXT, c881 TEXT, c882 TEXT, ++c883 TEXT, c884 TEXT, c885 TEXT, c886 TEXT, c887 TEXT, c888 TEXT, c889 TEXT, ++c890 TEXT, c891 TEXT, c892 TEXT, c893 TEXT, c894 TEXT, c895 TEXT, c896 TEXT, ++c897 TEXT, c898 TEXT, c899 TEXT, c900 TEXT, c901 TEXT, c902 TEXT, c903 TEXT, ++c904 TEXT, c905 TEXT, c906 TEXT, c907 TEXT, c908 TEXT, c909 TEXT, c910 TEXT, ++c911 TEXT, c912 TEXT, c913 TEXT, c914 TEXT, c915 TEXT, c916 TEXT, c917 TEXT, ++c918 TEXT, c919 TEXT, c920 TEXT, c921 TEXT, c922 TEXT, c923 TEXT, c924 TEXT, ++c925 TEXT, c926 TEXT, c927 TEXT, c928 TEXT, c929 TEXT, c930 TEXT, c931 TEXT, ++c932 TEXT, c933 TEXT, c934 TEXT, c935 TEXT, c936 TEXT, c937 TEXT, c938 TEXT, ++c939 TEXT, c940 TEXT, c941 TEXT, c942 TEXT, c943 TEXT, c944 TEXT, c945 TEXT, ++c946 TEXT, c947 TEXT, c948 TEXT, c949 TEXT, c950 TEXT, c951 TEXT, c952 TEXT, ++c953 TEXT, c954 TEXT, c955 TEXT, c956 TEXT, c957 TEXT, c958 TEXT, c959 TEXT, ++c960 TEXT, c961 TEXT, c962 TEXT, c963 TEXT, c964 TEXT, c965 TEXT, c966 TEXT, ++c967 TEXT, c968 TEXT, c969 TEXT, c970 TEXT, c971 TEXT, c972 TEXT, c973 TEXT, ++c974 TEXT, c975 TEXT, c976 TEXT, c977 TEXT, c978 TEXT, c979 TEXT, c980 TEXT, ++c981 TEXT, c982 TEXT, c983 TEXT, c984 TEXT, c985 TEXT, c986 TEXT, c987 TEXT, ++c988 TEXT, c989 TEXT, c990 TEXT, c991 TEXT, c992 TEXT, c993 TEXT, c994 TEXT, ++c995 TEXT, c996 TEXT, c997 TEXT, c998 TEXT, c999 TEXT, c1000 TEXT, c1001 TEXT, ++c1002 TEXT, c1003 TEXT, c1004 TEXT, c1005 TEXT, c1006 TEXT, c1007 TEXT, c1008 TEXT, ++c1009 TEXT, c1010 TEXT, c1011 TEXT, c1012 TEXT, c1013 TEXT, c1014 TEXT, c1015 TEXT, ++c1016 TEXT, c1017 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, ++c190 TEXT, c191 TEXT, c192 TEXT, c193 TEXT, c194 TEXT, c195 TEXT, c196 TEXT, ++c197 TEXT, c198 TEXT, c199 TEXT, c200 TEXT, c201 TEXT, c202 TEXT, c203 TEXT, ++c204 TEXT, c205 TEXT, c206 TEXT, c207 TEXT, c208 TEXT, c209 TEXT, c210 TEXT, ++c211 TEXT, c212 TEXT, c213 TEXT, c214 TEXT, c215 TEXT, c216 TEXT, c217 TEXT, ++c218 TEXT, c219 TEXT, c220 TEXT, c221 TEXT, c222 TEXT, c223 TEXT, c224 TEXT, ++c225 TEXT, c226 TEXT, c227 TEXT, c228 TEXT, c229 TEXT, c230 TEXT, c231 TEXT, ++c232 TEXT, c233 TEXT, c234 TEXT, c235 TEXT, c236 TEXT, c237 TEXT, c238 TEXT, ++c239 TEXT, c240 TEXT, c241 TEXT, c242 TEXT, c243 TEXT, c244 TEXT, c245 TEXT, ++c246 TEXT, c247 TEXT, c248 TEXT, c249 TEXT, c250 TEXT, c251 TEXT, c252 TEXT, ++c253 TEXT, c254 TEXT, c255 TEXT, c256 TEXT, c257 TEXT, c258 TEXT, c259 TEXT, ++c260 TEXT, c261 TEXT, c262 TEXT, c263 TEXT, c264 TEXT, c265 TEXT, c266 TEXT, ++c267 TEXT, c268 TEXT, c269 TEXT, c270 TEXT, c271 TEXT, c272 TEXT, c273 TEXT, ++c274 TEXT, c275 TEXT, c276 TEXT, c277 TEXT, c278 TEXT, c279 TEXT, c280 TEXT, ++c281 TEXT, c282 TEXT, c283 TEXT, c284 TEXT, c285 TEXT, c286 TEXT, c287 TEXT, ++c288 TEXT, c289 TEXT, c290 TEXT, c291 TEXT, c292 TEXT, c293 TEXT, c294 TEXT, ++c295 TEXT, c296 TEXT, c297 TEXT, c298 TEXT, c299 TEXT, c300 TEXT, c301 TEXT, ++c302 TEXT, c303 TEXT, c304 TEXT, c305 TEXT, c306 TEXT, c307 TEXT, c308 TEXT, ++c309 TEXT, c310 TEXT, c311 TEXT, c312 TEXT, c313 TEXT, c314 TEXT, c315 TEXT, ++c316 TEXT, c317 TEXT, c318 TEXT, c319 TEXT, c320 TEXT, c321 TEXT, c322 TEXT, ++c323 TEXT, c324 TEXT, c325 TEXT, c326 TEXT, c327 TEXT, c328 TEXT, c329 TEXT, ++c330 TEXT, c331 TEXT, c332 TEXT, c333 TEXT, c334 TEXT, c335 TEXT, c336 TEXT, ++c337 TEXT, c338 TEXT, c339 TEXT, c340 TEXT, c341 TEXT, c342 TEXT, c343 TEXT, ++c344 TEXT, c345 TEXT, c346 TEXT, c347 TEXT, c348 TEXT, c349 TEXT, c350 TEXT, ++c351 TEXT, c352 TEXT, c353 TEXT, c354 TEXT, c355 TEXT, c356 TEXT, c357 TEXT, ++c358 TEXT, c359 TEXT, c360 TEXT, c361 TEXT, c362 TEXT, c363 TEXT, c364 TEXT, ++c365 TEXT, c366 TEXT, c367 TEXT, c368 TEXT, c369 TEXT, c370 TEXT, c371 TEXT, ++c372 TEXT, c373 TEXT, c374 TEXT, c375 TEXT, c376 TEXT, c377 TEXT, c378 TEXT, ++c379 TEXT, c380 TEXT, c381 TEXT, c382 TEXT, c383 TEXT, c384 TEXT, c385 TEXT, ++c386 TEXT, c387 TEXT, c388 TEXT, c389 TEXT, c390 TEXT, c391 TEXT, c392 TEXT, ++c393 TEXT, c394 TEXT, c395 TEXT, c396 TEXT, c397 TEXT, c398 TEXT, c399 TEXT, ++c400 TEXT, c401 TEXT, c402 TEXT, c403 TEXT, c404 TEXT, c405 TEXT, c406 TEXT, ++c407 TEXT, c408 TEXT, c409 TEXT, c410 TEXT, c411 TEXT, c412 TEXT, c413 TEXT, ++c414 TEXT, c415 TEXT, c416 TEXT, c417 TEXT, c418 TEXT, c419 TEXT, c420 TEXT, ++c421 TEXT, c422 TEXT, c423 TEXT, c424 TEXT, c425 TEXT, c426 TEXT, c427 TEXT, ++c428 TEXT, c429 TEXT, c430 TEXT, c431 TEXT, c432 TEXT, c433 TEXT, c434 TEXT, ++c435 TEXT, c436 TEXT, c437 TEXT, c438 TEXT, c439 TEXT, c440 TEXT, c441 TEXT, ++c442 TEXT, c443 TEXT, c444 TEXT, c445 TEXT, c446 TEXT, c447 TEXT, c448 TEXT, ++c449 TEXT, c450 TEXT, c451 TEXT, c452 TEXT, c453 TEXT, c454 TEXT, c455 TEXT, ++c456 TEXT, c457 TEXT, c458 TEXT, c459 TEXT, c460 TEXT, c461 TEXT, c462 TEXT, ++c463 TEXT, c464 TEXT, c465 TEXT, c466 TEXT, c467 TEXT, c468 TEXT, c469 TEXT, ++c470 TEXT, c471 TEXT, c472 TEXT, c473 TEXT, c474 TEXT, c475 TEXT, c476 TEXT, ++c477 TEXT, c478 TEXT, c479 TEXT, c480 TEXT, c481 TEXT, c482 TEXT, c483 TEXT, ++c484 TEXT, c485 TEXT, c486 TEXT, c487 TEXT, c488 TEXT, c489 TEXT, c490 TEXT, ++c491 TEXT, c492 TEXT, c493 TEXT, c494 TEXT, c495 TEXT, c496 TEXT, c497 TEXT, ++c498 TEXT, c499 TEXT, c500 TEXT, c501 TEXT, c502 TEXT, c503 TEXT, c504 TEXT, ++c505 TEXT, c506 TEXT, c507 TEXT, c508 TEXT, c509 TEXT, c510 TEXT, c511 TEXT, ++c512 TEXT, c513 TEXT, c514 TEXT, c515 TEXT, c516 TEXT, c517 TEXT, c518 TEXT, ++c519 TEXT, c520 TEXT, c521 TEXT, c522 TEXT, c523 TEXT, c524 TEXT, c525 TEXT, ++c526 TEXT, c527 TEXT, c528 TEXT, c529 TEXT, c530 TEXT, c531 TEXT, c532 TEXT, ++c533 TEXT, c534 TEXT, c535 TEXT, c536 TEXT, c537 TEXT, c538 TEXT, c539 TEXT, ++c540 TEXT, c541 TEXT, c542 TEXT, c543 TEXT, c544 TEXT, c545 TEXT, c546 TEXT, ++c547 TEXT, c548 TEXT, c549 TEXT, c550 TEXT, c551 TEXT, c552 TEXT, c553 TEXT, ++c554 TEXT, c555 TEXT, c556 TEXT, c557 TEXT, c558 TEXT, c559 TEXT, c560 TEXT, ++c561 TEXT, c562 TEXT, c563 TEXT, c564 TEXT, c565 TEXT, c566 TEXT, c567 TEXT, ++c568 TEXT, c569 TEXT, c570 TEXT, c571 TEXT, c572 TEXT, c573 TEXT, c574 TEXT, ++c575 TEXT, c576 TEXT, c577 TEXT, c578 TEXT, c579 TEXT, c580 TEXT, c581 TEXT, ++c582 TEXT, c583 TEXT, c584 TEXT, c585 TEXT, c586 TEXT, c587 TEXT, c588 TEXT, ++c589 TEXT, c590 TEXT, c591 TEXT, c592 TEXT, c593 TEXT, c594 TEXT, c595 TEXT, ++c596 TEXT, c597 TEXT, c598 TEXT, c599 TEXT, c600 TEXT, c601 TEXT, c602 TEXT, ++c603 TEXT, c604 TEXT, c605 TEXT, c606 TEXT, c607 TEXT, c608 TEXT, c609 TEXT, ++c610 TEXT, c611 TEXT, c612 TEXT, c613 TEXT, c614 TEXT, c615 TEXT, c616 TEXT, ++c617 TEXT, c618 TEXT, c619 TEXT, c620 TEXT, c621 TEXT, c622 TEXT, c623 TEXT, ++c624 TEXT, c625 TEXT, c626 TEXT, c627 TEXT, c628 TEXT, c629 TEXT, c630 TEXT, ++c631 TEXT, c632 TEXT, c633 TEXT, c634 TEXT, c635 TEXT, c636 TEXT, c637 TEXT, ++c638 TEXT, c639 TEXT, c640 TEXT, c641 TEXT, c642 TEXT, c643 TEXT, c644 TEXT, ++c645 TEXT, c646 TEXT, c647 TEXT, c648 TEXT, c649 TEXT, c650 TEXT, c651 TEXT, ++c652 TEXT, c653 TEXT, c654 TEXT, c655 TEXT, c656 TEXT, c657 TEXT, c658 TEXT, ++c659 TEXT, c660 TEXT, c661 TEXT, c662 TEXT, c663 TEXT, c664 TEXT, c665 TEXT, ++c666 TEXT, c667 TEXT, c668 TEXT, c669 TEXT, c670 TEXT, c671 TEXT, c672 TEXT, ++c673 TEXT, c674 TEXT, c675 TEXT, c676 TEXT, c677 TEXT, c678 TEXT, c679 TEXT, ++c680 TEXT, c681 TEXT, c682 TEXT, c683 TEXT, c684 TEXT, c685 TEXT, c686 TEXT, ++c687 TEXT, c688 TEXT, c689 TEXT, c690 TEXT, c691 TEXT, c692 TEXT, c693 TEXT, ++c694 TEXT, c695 TEXT, c696 TEXT, c697 TEXT, c698 TEXT, c699 TEXT, c700 TEXT, ++c701 TEXT, c702 TEXT, c703 TEXT, c704 TEXT, c705 TEXT, c706 TEXT, c707 TEXT, ++c708 TEXT, c709 TEXT, c710 TEXT, c711 TEXT, c712 TEXT, c713 TEXT, c714 TEXT, ++c715 TEXT, c716 TEXT, c717 TEXT, c718 TEXT, c719 TEXT, c720 TEXT, c721 TEXT, ++c722 TEXT, c723 TEXT, c724 TEXT, c725 TEXT, c726 TEXT, c727 TEXT, c728 TEXT, ++c729 TEXT, c730 TEXT, c731 TEXT, c732 TEXT, c733 TEXT, c734 TEXT, c735 TEXT, ++c736 TEXT, c737 TEXT, c738 TEXT, c739 TEXT, c740 TEXT, c741 TEXT, c742 TEXT, ++c743 TEXT, c744 TEXT, c745 TEXT, c746 TEXT, c747 TEXT, c748 TEXT, c749 TEXT, ++c750 TEXT, c751 TEXT, c752 TEXT, c753 TEXT, c754 TEXT, c755 TEXT, c756 TEXT, ++c757 TEXT, c758 TEXT, c759 TEXT, c760 TEXT, c761 TEXT, c762 TEXT, c763 TEXT, ++c764 TEXT, c765 TEXT, c766 TEXT, c767 TEXT, c768 TEXT, c769 TEXT, c770 TEXT, ++c771 TEXT, c772 TEXT, c773 TEXT, c774 TEXT, c775 TEXT, c776 TEXT, c777 TEXT, ++c778 TEXT, c779 TEXT, c780 TEXT, c781 TEXT, c782 TEXT, c783 TEXT, c784 TEXT, ++c785 TEXT, c786 TEXT, c787 TEXT, c788 TEXT, c789 TEXT, c790 TEXT, c791 TEXT, ++c792 TEXT, c793 TEXT, c794 TEXT, c795 TEXT, c796 TEXT, c797 TEXT, c798 TEXT, ++c799 TEXT, c800 TEXT, c801 TEXT, c802 TEXT, c803 TEXT, c804 TEXT, c805 TEXT, ++c806 TEXT, c807 TEXT, c808 TEXT, c809 TEXT, c810 TEXT, c811 TEXT, c812 TEXT, ++c813 TEXT, c814 TEXT, c815 TEXT, c816 TEXT, c817 TEXT, c818 TEXT, c819 TEXT, ++c820 TEXT, c821 TEXT, c822 TEXT, c823 TEXT, c824 TEXT, c825 TEXT, c826 TEXT, ++c827 TEXT, c828 TEXT, c829 TEXT, c830 TEXT, c831 TEXT, c832 TEXT, c833 TEXT, ++c834 TEXT, c835 TEXT, c836 TEXT, c837 TEXT, c838 TEXT, c839 TEXT, c840 TEXT, ++c841 TEXT, c842 TEXT, c843 TEXT, c844 TEXT, c845 TEXT, c846 TEXT, c847 TEXT, ++c848 TEXT, c849 TEXT, c850 TEXT, c851 TEXT, c852 TEXT, c853 TEXT, c854 TEXT, ++c855 TEXT, c856 TEXT, c857 TEXT, c858 TEXT, c859 TEXT, c860 TEXT, c861 TEXT, ++c862 TEXT, c863 TEXT, c864 TEXT, c865 TEXT, c866 TEXT, c867 TEXT, c868 TEXT, ++c869 TEXT, c870 TEXT, c871 TEXT, c872 TEXT, c873 TEXT, c874 TEXT, c875 TEXT, ++c876 TEXT, c877 TEXT, c878 TEXT, c879 TEXT, c880 TEXT, c881 TEXT, c882 TEXT, ++c883 TEXT, c884 TEXT, c885 TEXT, c886 TEXT, c887 TEXT, c888 TEXT, c889 TEXT, ++c890 TEXT, c891 TEXT, c892 TEXT, c893 TEXT, c894 TEXT, c895 TEXT, c896 TEXT, ++c897 TEXT, c898 TEXT, c899 TEXT, c900 TEXT, c901 TEXT, c902 TEXT, c903 TEXT, ++c904 TEXT, c905 TEXT, c906 TEXT, c907 TEXT, c908 TEXT, c909 TEXT, c910 TEXT, ++c911 TEXT, c912 TEXT, c913 TEXT, c914 TEXT, c915 TEXT, c916 TEXT, c917 TEXT, ++c918 TEXT, c919 TEXT, c920 TEXT, c921 TEXT, c922 TEXT, c923 TEXT, c924 TEXT, ++c925 TEXT, c926 TEXT, c927 TEXT, c928 TEXT, c929 TEXT, c930 TEXT, c931 TEXT, ++c932 TEXT, c933 TEXT, c934 TEXT, c935 TEXT, c936 TEXT, c937 TEXT, c938 TEXT, ++c939 TEXT, c940 TEXT, c941 TEXT, c942 TEXT, c943 TEXT, c944 TEXT, c945 TEXT, ++c946 TEXT, c947 TEXT, c948 TEXT, c949 TEXT, c950 TEXT, c951 TEXT, c952 TEXT, ++c953 TEXT, c954 TEXT, c955 TEXT, c956 TEXT, c957 TEXT, c958 TEXT, c959 TEXT, ++c960 TEXT, c961 TEXT, c962 TEXT, c963 TEXT, c964 TEXT, c965 TEXT, c966 TEXT, ++c967 TEXT, c968 TEXT, c969 TEXT, c970 TEXT, c971 TEXT, c972 TEXT, c973 TEXT, ++c974 TEXT, c975 TEXT, c976 TEXT, c977 TEXT, c978 TEXT, c979 TEXT, c980 TEXT, ++c981 TEXT, c982 TEXT, c983 TEXT, c984 TEXT, c985 TEXT, c986 TEXT, c987 TEXT, ++c988 TEXT, c989 TEXT, c990 TEXT, c991 TEXT, c992 TEXT, c993 TEXT, c994 TEXT, ++c995 TEXT, c996 TEXT, c997 TEXT, c998 TEXT, c999 TEXT, c1000 TEXT, c1001 TEXT, ++c1002 TEXT, c1003 TEXT, c1004 TEXT, c1005 TEXT, c1006 TEXT, c1007 TEXT, c1008 TEXT, ++c1009 TEXT, c1010 TEXT, c1011 TEXT, c1012 TEXT, c1013 TEXT, c1014 TEXT, c1015 TEXT, ++c1016 TEXT, c1017 TEXT, c1018 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR HY000: Can't create table `test`.`t1` (errno: 185 "Too many columns") diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,innodb,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,innodb,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,innodb,redundant.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,innodb,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,121 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 12:50:05.663724193 +0300 -@@ -3,45 +3,104 @@ - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), - c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), --c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) -+c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), -+c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), -+c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), -+c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), -+c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), -+c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), -+c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), -+c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), -+c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), -+c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), -+c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), -+c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), -+c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), --c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) -+c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), -+c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), -+c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), -+c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), -+c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), -+c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), -+c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), -+c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), -+c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), -+c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), -+c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), -+c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), -+c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) --) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. --CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788) -+) ENGINE=INNODB; -+ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+CREATE TABLE t1 ( -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,redundant.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,redundant.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,64k,redundant.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,64k,redundant.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,121 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 12:50:05.663724193 +0300 +@@ -3,45 +3,104 @@ + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 CHAR(255), c2 CHAR(255), c3 CHAR(255), c4 CHAR(255), + c5 CHAR(255), c6 CHAR(255), c7 CHAR(255), c8 CHAR(255), + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), +-c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) ++c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255), ++c17 CHAR(255), c18 CHAR(255), c19 CHAR(255), c20 CHAR(255), ++c21 CHAR(255), c22 CHAR(255), c23 CHAR(255), c24 CHAR(255), ++c25 CHAR(255), c26 CHAR(255), c27 CHAR(255), c28 CHAR(255), ++c29 CHAR(255), c30 CHAR(255), c31 CHAR(255), c32 CHAR(255), ++c33 CHAR(255), c34 CHAR(255), c35 CHAR(255), c36 CHAR(255), ++c37 CHAR(255), c38 CHAR(255), c39 CHAR(255), c40 CHAR(255), ++c41 CHAR(255), c42 CHAR(255), c43 CHAR(255), c44 CHAR(255), ++c45 CHAR(255), c46 CHAR(255), c47 CHAR(255), c48 CHAR(255), ++c49 CHAR(255), c50 CHAR(255), c51 CHAR(255), c52 CHAR(255), ++c53 CHAR(255), c54 CHAR(255), c55 CHAR(255), c56 CHAR(255), ++c57 CHAR(255), c58 CHAR(255), c59 CHAR(255), c60 CHAR(255), ++c61 CHAR(255), c62 CHAR(255), c63 CHAR(255), c64 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), +-c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) ++c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255), ++c17 VARCHAR(255), c18 VARCHAR(255), c19 VARCHAR(255), c20 VARCHAR(255), ++c21 VARCHAR(255), c22 VARCHAR(255), c23 VARCHAR(255), c24 VARCHAR(255), ++c25 VARCHAR(255), c26 VARCHAR(255), c27 VARCHAR(255), c28 VARCHAR(255), ++c29 VARCHAR(255), c30 VARCHAR(255), c31 VARCHAR(255), c32 VARCHAR(255), ++c33 VARCHAR(255), c34 VARCHAR(255), c35 VARCHAR(255), c36 VARCHAR(255), ++c37 VARCHAR(255), c38 VARCHAR(255), c39 VARCHAR(255), c40 VARCHAR(255), ++c41 VARCHAR(255), c42 VARCHAR(255), c43 VARCHAR(255), c44 VARCHAR(255), ++c45 VARCHAR(255), c46 VARCHAR(255), c47 VARCHAR(255), c48 VARCHAR(255), ++c49 VARCHAR(255), c50 VARCHAR(255), c51 VARCHAR(255), c52 VARCHAR(255), ++c53 VARCHAR(255), c54 VARCHAR(255), c55 VARCHAR(255), c56 VARCHAR(255), ++c57 VARCHAR(255), c58 VARCHAR(255), c59 VARCHAR(255), c60 VARCHAR(255), ++c61 VARCHAR(255), c62 VARCHAR(255), c63 VARCHAR(255), c64 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) +-) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +-CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788) ++) ENGINE=INNODB; ++ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++CREATE TABLE t1 ( ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,compact,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,compact,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,compact,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,compact,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 13:00:25.037261867 +0300 -@@ -12,7 +12,7 @@ - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), - c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), -@@ -26,7 +26,7 @@ - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), - c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), - c5 VARCHAR(788) -@@ -36,7 +36,7 @@ - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), - c5 VARCHAR(788), c6 VARCHAR(788) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. - CREATE TABLE t1 ( - c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT - ) ENGINE=INNODB; -@@ -44,4 +44,4 @@ - CREATE TABLE t1 ( - c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,compact.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,compact.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,compact.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,compact.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,35 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 13:00:25.037261867 +0300 +@@ -12,7 +12,7 @@ + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), + c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +@@ -26,7 +26,7 @@ + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), + c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), + c5 VARCHAR(788) +@@ -36,7 +36,7 @@ + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), + c5 VARCHAR(788), c6 VARCHAR(788) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. + CREATE TABLE t1 ( + c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT + ) ENGINE=INNODB; +@@ -44,4 +44,4 @@ + CREATE TABLE t1 ( + c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,dynamic,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,dynamic,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,dynamic,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,dynamic,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,134 +0,0 @@ ---- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 -+++ max_record_size.reject 2019-07-03 13:01:51.215756779 +0300 -@@ -12,7 +12,7 @@ - c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), - c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), - c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), -@@ -26,22 +26,113 @@ - c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), - c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788) -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788) - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( - c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), --c5 VARCHAR(788), c6 VARCHAR(788) --) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. --CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT -+c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), -+c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), -+c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), -+c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), -+c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), -+c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), -+c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), -+c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), -+c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), -+c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), -+c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), -+c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), -+c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), -+c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), -+c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), -+c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), -+c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), -+c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), -+c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), -+c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) -+) ENGINE=INNODB; -+ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs -+CREATE TABLE t1 ( -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT - ) ENGINE=INNODB; - DROP TABLE t1; - CREATE TABLE t1 ( --c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT -+c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, -+c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, -+c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, -+c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, -+c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, -+c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, -+c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, -+c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, -+c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, -+c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, -+c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, -+c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, -+c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, -+c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, -+c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, -+c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, -+c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, -+c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, -+c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, -+c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, -+c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, -+c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, -+c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, -+c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, -+c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, -+c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, -+c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, -+c190 TEXT - ) ENGINE=INNODB; --ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -+ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,dynamic.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,dynamic.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/max_record_size,8k,dynamic.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/max_record_size,8k,dynamic.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,134 @@ +--- max_record_size.result 2019-07-03 11:54:44.591421526 +0300 ++++ max_record_size.reject 2019-07-03 13:01:51.215756779 +0300 +@@ -12,7 +12,7 @@ + c9 CHAR(255), c10 CHAR(255), c11 CHAR(255), c12 CHAR(255), + c13 CHAR(255), c14 CHAR(255), c15 CHAR(255), c16 CHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(255), c2 VARCHAR(255), c3 VARCHAR(255), c4 VARCHAR(255), + c5 VARCHAR(255), c6 VARCHAR(255), c7 VARCHAR(255), c8 VARCHAR(255), +@@ -26,22 +26,113 @@ + c9 VARCHAR(255), c10 VARCHAR(255), c11 VARCHAR(255), c12 VARCHAR(255), + c13 VARCHAR(255), c14 VARCHAR(255), c15 VARCHAR(255), c16 VARCHAR(255) + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788) ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788) + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( + c1 VARCHAR(788), c2 VARCHAR(788), c3 VARCHAR(788), c4 VARCHAR(788), +-c5 VARCHAR(788), c6 VARCHAR(788) +-) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +-CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT ++c5 VARCHAR(788), c6 VARCHAR(788), c7 VARCHAR(788), c8 VARCHAR(788), ++c9 VARCHAR(788), c10 VARCHAR(788), c11 VARCHAR(788), c12 VARCHAR(788), ++c13 VARCHAR(788), c14 VARCHAR(788), c15 VARCHAR(788), c16 VARCHAR(788), ++c17 VARCHAR(788), c18 VARCHAR(788), c19 VARCHAR(788), c20 VARCHAR(788), ++c21 VARCHAR(788), c22 VARCHAR(788), c23 VARCHAR(788), c24 VARCHAR(788), ++c25 VARCHAR(788), c26 VARCHAR(788), c27 VARCHAR(788), c28 VARCHAR(788), ++c29 VARCHAR(788), c30 VARCHAR(788), c31 VARCHAR(788), c32 VARCHAR(788), ++c33 VARCHAR(788), c34 VARCHAR(788), c35 VARCHAR(788), c36 VARCHAR(788), ++c37 VARCHAR(788), c38 VARCHAR(788), c39 VARCHAR(788), c40 VARCHAR(788), ++c41 VARCHAR(788), c42 VARCHAR(788), c43 VARCHAR(788), c44 VARCHAR(788), ++c45 VARCHAR(788), c46 VARCHAR(788), c47 VARCHAR(788), c48 VARCHAR(788), ++c49 VARCHAR(788), c50 VARCHAR(788), c51 VARCHAR(788), c52 VARCHAR(788), ++c53 VARCHAR(788), c54 VARCHAR(788), c55 VARCHAR(788), c56 VARCHAR(788), ++c57 VARCHAR(788), c58 VARCHAR(788), c59 VARCHAR(788), c60 VARCHAR(788), ++c61 VARCHAR(788), c62 VARCHAR(788), c63 VARCHAR(788), c64 VARCHAR(788), ++c65 VARCHAR(788), c66 VARCHAR(788), c67 VARCHAR(788), c68 VARCHAR(788), ++c69 VARCHAR(788), c70 VARCHAR(788), c71 VARCHAR(788), c72 VARCHAR(788), ++c73 VARCHAR(788), c74 VARCHAR(788), c75 VARCHAR(788), c76 VARCHAR(788), ++c77 VARCHAR(788), c78 VARCHAR(788), c79 VARCHAR(788), c80 VARCHAR(788), ++c81 VARCHAR(788), c82 VARCHAR(788), c83 VARCHAR(788) ++) ENGINE=INNODB; ++ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs ++CREATE TABLE t1 ( ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT + ) ENGINE=INNODB; + DROP TABLE t1; + CREATE TABLE t1 ( +-c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT ++c1 TEXT, c2 TEXT, c3 TEXT, c4 TEXT, c5 TEXT, c6 TEXT, c7 TEXT, ++c8 TEXT, c9 TEXT, c10 TEXT, c11 TEXT, c12 TEXT, c13 TEXT, c14 TEXT, ++c15 TEXT, c16 TEXT, c17 TEXT, c18 TEXT, c19 TEXT, c20 TEXT, c21 TEXT, ++c22 TEXT, c23 TEXT, c24 TEXT, c25 TEXT, c26 TEXT, c27 TEXT, c28 TEXT, ++c29 TEXT, c30 TEXT, c31 TEXT, c32 TEXT, c33 TEXT, c34 TEXT, c35 TEXT, ++c36 TEXT, c37 TEXT, c38 TEXT, c39 TEXT, c40 TEXT, c41 TEXT, c42 TEXT, ++c43 TEXT, c44 TEXT, c45 TEXT, c46 TEXT, c47 TEXT, c48 TEXT, c49 TEXT, ++c50 TEXT, c51 TEXT, c52 TEXT, c53 TEXT, c54 TEXT, c55 TEXT, c56 TEXT, ++c57 TEXT, c58 TEXT, c59 TEXT, c60 TEXT, c61 TEXT, c62 TEXT, c63 TEXT, ++c64 TEXT, c65 TEXT, c66 TEXT, c67 TEXT, c68 TEXT, c69 TEXT, c70 TEXT, ++c71 TEXT, c72 TEXT, c73 TEXT, c74 TEXT, c75 TEXT, c76 TEXT, c77 TEXT, ++c78 TEXT, c79 TEXT, c80 TEXT, c81 TEXT, c82 TEXT, c83 TEXT, c84 TEXT, ++c85 TEXT, c86 TEXT, c87 TEXT, c88 TEXT, c89 TEXT, c90 TEXT, c91 TEXT, ++c92 TEXT, c93 TEXT, c94 TEXT, c95 TEXT, c96 TEXT, c97 TEXT, c98 TEXT, ++c99 TEXT, c100 TEXT, c101 TEXT, c102 TEXT, c103 TEXT, c104 TEXT, c105 TEXT, ++c106 TEXT, c107 TEXT, c108 TEXT, c109 TEXT, c110 TEXT, c111 TEXT, c112 TEXT, ++c113 TEXT, c114 TEXT, c115 TEXT, c116 TEXT, c117 TEXT, c118 TEXT, c119 TEXT, ++c120 TEXT, c121 TEXT, c122 TEXT, c123 TEXT, c124 TEXT, c125 TEXT, c126 TEXT, ++c127 TEXT, c128 TEXT, c129 TEXT, c130 TEXT, c131 TEXT, c132 TEXT, c133 TEXT, ++c134 TEXT, c135 TEXT, c136 TEXT, c137 TEXT, c138 TEXT, c139 TEXT, c140 TEXT, ++c141 TEXT, c142 TEXT, c143 TEXT, c144 TEXT, c145 TEXT, c146 TEXT, c147 TEXT, ++c148 TEXT, c149 TEXT, c150 TEXT, c151 TEXT, c152 TEXT, c153 TEXT, c154 TEXT, ++c155 TEXT, c156 TEXT, c157 TEXT, c158 TEXT, c159 TEXT, c160 TEXT, c161 TEXT, ++c162 TEXT, c163 TEXT, c164 TEXT, c165 TEXT, c166 TEXT, c167 TEXT, c168 TEXT, ++c169 TEXT, c170 TEXT, c171 TEXT, c172 TEXT, c173 TEXT, c174 TEXT, c175 TEXT, ++c176 TEXT, c177 TEXT, c178 TEXT, c179 TEXT, c180 TEXT, c181 TEXT, c182 TEXT, ++c183 TEXT, c184 TEXT, c185 TEXT, c186 TEXT, c187 TEXT, c188 TEXT, c189 TEXT, ++c190 TEXT + ) ENGINE=INNODB; +-ERROR 42000: Row size too large (> 4027). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ++ERROR 42000: Row size too large (> 4030). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/mem_pressure.result mariadb-10.11.9/mysql-test/suite/innodb/r/mem_pressure.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/mem_pressure.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/mem_pressure.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,25 @@ +# +# MDEV-24670 avoid OOM by linux kernel co-operative memory management +# +set @save_dbug=@@debug_dbug; +set @save_limit=@@GLOBAL.innodb_limit_optimistic_insert_debug; +set GLOBAL innodb_max_purge_lag_wait=0; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +SET GLOBAL innodb_limit_optimistic_insert_debug=2; +SET STATEMENT unique_checks=0, foreign_key_checks=0 FOR +INSERT INTO t1 SELECT * FROM seq_1_to_1000; +SET GLOBAL innodb_limit_optimistic_insert_debug=@save_limit; +DROP TABLE t1; +SELECT CAST(VARIABLE_VALUE AS INTEGER) INTO @dirty_prev +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty'; +set debug_dbug="d,trigger_garbage_collection"; +SET GLOBAL innodb_buffer_pool_size=@@innodb_buffer_pool_size; +SELECT CAST(VARIABLE_VALUE AS INTEGER) < @dirty_prev AS LESS_DIRTY_IS_GOOD +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty'; +LESS_DIRTY_IS_GOOD +1 +FOUND 1 /InnoDB: Memory pressure event freed.*/ in mysqld.1.err +set debug_dbug=@save_dbug; +# End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/monitor.result mariadb-10.11.9/mysql-test/suite/innodb/r/monitor.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/monitor.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/monitor.result 2024-08-03 07:29:58.000000000 +0000 @@ -51,7 +51,6 @@ buffer_flush_adaptive_avg_time disabled buffer_flush_adaptive_avg_pass disabled buffer_LRU_get_free_loops disabled -buffer_LRU_get_free_waits disabled buffer_flush_avg_page_rate disabled buffer_flush_lsn_avg_rate disabled buffer_flush_pct_for_dirty disabled @@ -71,7 +70,6 @@ buffer_LRU_batch_scanned_per_call disabled buffer_LRU_batch_flush_total_pages enabled buffer_LRU_batch_evict_total_pages enabled -buffer_LRU_single_flush_failure_count disabled buffer_LRU_get_free_search disabled buffer_LRU_search_scanned disabled buffer_LRU_search_num_scan disabled @@ -198,6 +196,7 @@ icp_no_match disabled icp_out_of_range disabled icp_match disabled +create temporary table orig_innodb_metrics as select name, enabled from information_schema.innodb_metrics; set global innodb_monitor_disable = All; select name from information_schema.innodb_metrics where enabled; name @@ -431,7 +430,7 @@ # MONITORS # CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*1*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; NAME COUNT > 0 buffer_page_written_index_leaf 0 @@ -439,13 +438,13 @@ INSERT INTO t1 VALUES (1), (2), (3), (4); FLUSH TABLES t1 FOR EXPORT; UNLOCK TABLES; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*2*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; NAME COUNT > 0 buffer_page_written_index_leaf 1 SET GLOBAL innodb_monitor_disable='module_buffer_page'; SET GLOBAL innodb_monitor_reset_all='module_buffer_page'; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*3*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; NAME COUNT > 0 buffer_page_written_index_leaf 0 @@ -455,13 +454,13 @@ INSERT INTO t1 VALUES (5), (6), (7), (8); FLUSH TABLES t1 FOR EXPORT; UNLOCK TABLES; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*4*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; NAME COUNT > 0 buffer_page_written_index_leaf 1 SET GLOBAL innodb_monitor_disable='%'; SET GLOBAL innodb_monitor_reset_all='%'; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*5*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; NAME COUNT > 0 buffer_page_written_index_leaf 0 @@ -469,7 +468,7 @@ INSERT INTO t1 VALUES (9), (10), (11), (12); FLUSH TABLES t1 FOR EXPORT; UNLOCK TABLES; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*6*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; NAME COUNT > 0 buffer_page_written_index_leaf 1 @@ -599,6 +598,41 @@ DROP TABLE fl2; DROP TABLE fl1; DROP TABLE fl0; -SET GLOBAL innodb_monitor_enable=default; -SET GLOBAL innodb_monitor_disable=default; -SET GLOBAL innodb_monitor_reset_all=default; +set global innodb_monitor_disable = 'adaptive\\_hash\\_p%'; +set global innodb_monitor_disable = 'adaptive\\_hash\\_r%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_batch\\_n%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_batch\\_s%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_g%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_s%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_u%'; +set global innodb_monitor_disable = 'buffer\\_f%'; +set global innodb_monitor_disable = 'buffer\\_page\\_%'; +set global innodb_monitor_disable = 'c%'; +set global innodb_monitor_disable = 'ddl%'; +set global innodb_monitor_disable = 'icp%'; +set global innodb_monitor_disable = 'index\\_p%'; +set global innodb_monitor_disable = 'innodb\\_di%'; +set global innodb_monitor_disable = 'innodb\\_l%'; +set global innodb_monitor_disable = 'innodb\\_m%'; +set global innodb_monitor_disable = 'lock\\_re%'; +set global innodb_monitor_disable = 'lock\\_ta%'; +set global innodb_monitor_disable = 'log%'; +set global innodb_monitor_disable = 'm%'; +set global innodb_monitor_disable = 'p%'; +set global innodb_monitor_disable = 't%'; +set global innodb_monitor_enable = 'log\\_w%'; +set global innodb_monitor_enable = 'trx_rseg_history_len'; +set global innodb_monitor_enable = 'trx_undo_slots_cached'; +set global innodb_monitor_enable=default; +Warnings: +Warning 1230 Default value is not defined for this set option. Please specify correct counter or module name. +set global innodb_monitor_disable=default; +Warnings: +Warning 1230 Default value is not defined for this set option. Please specify correct counter or module name. +set global innodb_monitor_reset_all=default; +Warnings: +Warning 1230 Default value is not defined for this set option. Please specify correct counter or module name. +select name, orig.enabled, new.enabled from +orig_innodb_metrics orig join information_schema.innodb_metrics new using(name) +where orig.enabled != new.enabled; +name enabled enabled diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/no_pad.result mariadb-10.11.9/mysql-test/suite/innodb/r/no_pad.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/no_pad.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/no_pad.result 2024-08-03 07:29:58.000000000 +0000 @@ -5,3 +5,49 @@ INSERT INTO t1 VALUES ('',2); ALTER TABLE t1 ROW_FORMAT=REDUNDANT; DROP TABLE t1; +# +# MDEV-26743 InnoDB: CHAR+nopad does not work well +# +# +# Basic Latin letter vs equal accented letter +# +SET NAMES utf8mb3; +CREATE TABLE t1 (a CHAR(2), PRIMARY KEY(a)) COLLATE utf8_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 VALUES ('a'),('ä'); +ERROR 23000: Duplicate entry 'ä' for key 'PRIMARY' +DROP TABLE t1; +# +# Two letters vs equal (but space padded) expansion +# +CREATE TABLE t1 (a CHAR(2), PRIMARY KEY(a)) COLLATE utf8_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 VALUES ('ss'),('ß'); +SET sql_mode=PAD_CHAR_TO_FULL_LENGTH; +SELECT HEX(a) FROM t1; +HEX(a) +7373 +C39F20 +SET sql_mode=DEFAULT; +DROP TABLE t1; +# +# Basic Latin letter (but followed by an ignorable character) vs equal accented letter +# +SET NAMES utf8mb3; +CREATE TABLE t1 (a CHAR(3), PRIMARY KEY(a)) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 VALUES (CONCAT('a',_utf8mb3 0x01)),('ä'); +SET sql_mode=PAD_CHAR_TO_FULL_LENGTH; +SELECT HEX(a) FROM t1 ORDER BY HEX(a); +HEX(a) +610120 +C3A42020 +SET sql_mode=DEFAULT; +DROP TABLE t1; +SET NAMES utf8mb3; +CREATE TABLE t1 (a CHAR(2), PRIMARY KEY(a)) COLLATE utf8_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 VALUES (CONCAT('a',_utf8mb3 0x01)),('ä'); +SET sql_mode=PAD_CHAR_TO_FULL_LENGTH; +SELECT HEX(a) FROM t1 ORDER BY HEX(a); +HEX(a) +6101 +C3A420 +SET sql_mode=DEFAULT; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/open_files_limit.result mariadb-10.11.9/mysql-test/suite/innodb/r/open_files_limit.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/open_files_limit.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/open_files_limit.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,6 @@ +call mtr.add_suppression("\\[Warning\\] InnoDB: innodb_open_files=.* is not greater than the number of system tablespace files, temporary tablespace files, innodb_undo_tablespaces=.*"); +call mtr.add_suppression("\\[Warning\\] InnoDB: innodb_open_files=.* is exceeded \\(.* files stay open\\)"); +FOUND 1 /\[Warning\] InnoDB: innodb_open_files=.* is not greater than the number of system tablespace files, temporary tablespace files, innodb_undo_tablespaces=.*/ in mysqld.1.err +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +DROP TABLE t1; +# restart: --innodb_open_files=0 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/page_id_innochecksum.result mariadb-10.11.9/mysql-test/suite/innodb/r/page_id_innochecksum.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/page_id_innochecksum.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/page_id_innochecksum.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ # Set the environmental variables -create table t1(f1 int not null)engine=innodb; +create table t1(f1 int not null)engine=innodb stats_persistent=0; insert into t1 values(1), (2), (3); # Change the page offset FOUND 1 /page id mismatch/ in result.log diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/page_reorganize.result mariadb-10.11.9/mysql-test/suite/innodb/r/page_reorganize.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/page_reorganize.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/page_reorganize.result 2024-08-03 07:29:58.000000000 +0000 @@ -16,8 +16,6 @@ SET DEBUG_DBUG = '+d,do_page_reorganize,do_lock_reverse_page_reorganize'; insert into t1(f2) values (repeat('+', 100)); SET DEBUG = @save_dbug; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead commit; connection con1; f1 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/purge.result mariadb-10.11.9/mysql-test/suite/innodb/r/purge.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; # Bug #12429576 - Test an assertion failure on purge. CREATE TABLE t1_purge ( A int, @@ -115,4 +117,5 @@ KEY `ndx_p` (`p`(500)) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC InnoDB 0 transactions not purged +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; DROP TABLE t1_purge, t2_purge, t3_purge, t4_purge, t12637786, t12963823; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/purge_secondary.result mariadb-10.11.9/mysql-test/suite/innodb/r/purge_secondary.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/purge_secondary.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/purge_secondary.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; CREATE TABLE t1 ( a SERIAL, b CHAR(255) NOT NULL DEFAULT '', c BOOLEAN DEFAULT false, l LINESTRING NOT NULL DEFAULT ST_linefromtext('linestring(448 -689, @@ -167,3 +169,5 @@ UNLOCK TABLES; DROP TABLE t1; # End of 10.3 tests +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; +# End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/purge_thread_shutdown.result mariadb-10.11.9/mysql-test/suite/innodb/r/purge_thread_shutdown.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/purge_thread_shutdown.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/purge_thread_shutdown.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -connect con1, localhost, root; -create table t1 (a int) engine=innodb; -insert t1 values (1),(2),(3),(4); -delete from t1 where a=1; -select user,state from information_schema.processlist order by 2; -user state -root -root Filling schema table -set global debug_dbug='+d,only_kill_system_threads'; -set global innodb_fast_shutdown=0; -shutdown; -connection default; -disconnect con1; -select user,state from information_schema.processlist order by 2; -user state -root Filling schema table -set global innodb_fast_shutdown=1; -select user,state from information_schema.processlist order by 2; -user state -root Filling schema table -delete from t1 where a=3; -set global innodb_fast_shutdown=0; -ERROR 42000: Variable 'innodb_fast_shutdown' can't be set to the value of '0' -kill ID; -Got one of the listed errors -# restart -drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/read_only_recovery.result mariadb-10.11.9/mysql-test/suite/innodb/r/read_only_recovery.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/read_only_recovery.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/read_only_recovery.result 2024-08-03 07:29:58.000000000 +0000 @@ -37,6 +37,8 @@ a 3 SET GLOBAL innodb_max_purge_lag_wait=0; +INSERT INTO mysql.innodb_index_stats +SELECT * FROM mysql.innodb_index_stats LIMIT 0; # restart SELECT * FROM t; a diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/records_in_range,4k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range,4k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/records_in_range,4k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range,4k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,8 @@ +@@ -39,7 +39,7 @@ + WHERE + table_name='records_in_range_test' AND stat_name = 'size'; + index_name stat_name stat_value +-PRIMARY size 1 ++PRIMARY size 5 + SET @save_dbug = @@debug_dbug; + SET DEBUG_DBUG='+d,print_btr_estimate_n_rows_in_range_return_value'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/records_in_range,8k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range,8k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/records_in_range,8k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range,8k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,8 @@ +@@ -39,7 +39,7 @@ + WHERE + table_name='records_in_range_test' AND stat_name = 'size'; + index_name stat_name stat_value +-PRIMARY size 1 ++PRIMARY size 3 + SET @save_dbug = @@debug_dbug; + SET DEBUG_DBUG='+d,print_btr_estimate_n_rows_in_range_return_value'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/records_in_range.result mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/records_in_range.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/records_in_range.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,1275 @@ +CREATE TABLE records_in_range_test ( +c1 VARCHAR(16), +c2 VARCHAR(512), +PRIMARY KEY (c1) +) ENGINE=INNODB STATS_PERSISTENT=1; +INSERT INTO records_in_range_test VALUES +('ccc', REPEAT('v', 512)), +('kkk01', REPEAT('v', 512)), +('kkk02', REPEAT('v', 512)), +('kkk03', REPEAT('v', 512)), +('kkk04', REPEAT('v', 512)), +('kkk05', REPEAT('v', 512)), +('kkk06', REPEAT('v', 512)), +('kkk07', REPEAT('v', 512)), +('kkk08', REPEAT('v', 512)), +('mmm', REPEAT('v', 512)), +('nnn', REPEAT('v', 512)), +('uuu01', REPEAT('v', 512)), +('uuu02', REPEAT('v', 512)), +('uuu03', REPEAT('v', 512)), +('uuu04', REPEAT('v', 512)), +('uuu05', REPEAT('v', 512)), +('uuu06', REPEAT('v', 512)), +('uuu07', REPEAT('v', 512)), +('uuu08', REPEAT('v', 512)), +('xxx', REPEAT('v', 512)); +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE records_in_range_test; +Table Op Msg_type Msg_text +test.records_in_range_test analyze status OK +SELECT index_name, stat_name, stat_value +FROM mysql.innodb_index_stats +WHERE +table_name='records_in_range_test' AND stat_name = 'n_leaf_pages'; +index_name stat_name stat_value +PRIMARY n_leaf_pages 1 +SELECT index_name, stat_name, stat_value +FROM mysql.innodb_index_stats +WHERE +table_name='records_in_range_test' AND stat_name = 'size'; +index_name stat_name stat_value +PRIMARY size 1 +SET @save_dbug = @@debug_dbug; +SET DEBUG_DBUG='+d,print_btr_estimate_n_rows_in_range_return_value'; + +In all SELECTs below the number of the records in the range returned +by COUNT(*) must be the same as the number returned by +btr_estimate_n_rows_in_range() which can be seen inside the artificial +warning + +Test left-unbounded, right-open intervals + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'aaa'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'ccc'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'mmm'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'xxx'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +Test left-unbounded, right-closed intervals + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'aaa'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'ccc'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'mmm'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'nnn'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'xxx'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +Test left-open, right-unbounded intervals + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 + +Test left-closed, right-unbounded intervals + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 + +Test left-open, right-open intervals +In some cases here the optimizer is smart enough not to call +ha_innobase::records_in_range() at all, so we get no warning containing +the value returned from btr_estimate_n_rows_in_range() + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'bbb'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'ccc'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'mmm'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'xxx'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'eee'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'mmm'; +COUNT(*) +8 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 8 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'nnn'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'qqq'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'xxx'; +COUNT(*) +18 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 18 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'zzz'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'mmm'; +COUNT(*) +8 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 8 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'nnn'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'qqq'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'xxx'; +COUNT(*) +18 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 18 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'zzz'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'nnn'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'qqq'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'xxx'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'zzz'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'qqq'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'xxx'; +COUNT(*) +8 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 8 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'zzz'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'xxx'; +COUNT(*) +8 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 8 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'zzz'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'xxx'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'zzz'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'xxx'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'zzz'; +COUNT(*) +0 + +Test left-closed, right-open intervals +In some cases here the optimizer is smart enough not to call +ha_innobase::records_in_range() at all, so we get no warning containing +the value returned from btr_estimate_n_rows_in_range() + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'bbb'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'ccc'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'mmm'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'xxx'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'mmm'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'xxx'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'mmm'; +COUNT(*) +8 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 8 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'nnn'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'qqq'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'xxx'; +COUNT(*) +18 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 18 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'zzz'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'nnn'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'qqq'; +COUNT(*) +2 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 2 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'xxx'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'zzz'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'qqq'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'xxx'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'zzz'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'xxx'; +COUNT(*) +8 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 8 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'zzz'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'xxx'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'zzz'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'xxx'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'zzz'; +COUNT(*) +0 + +Test left-open, right-closed intervals +In some cases here the optimizer is smart enough not to call +ha_innobase::records_in_range() at all, so we get no warning containing +the value returned from btr_estimate_n_rows_in_range() + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'bbb'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'ccc'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'mmm'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'nnn'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'xxx'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'eee'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'mmm'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'qqq'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'xxx'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'zzz'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'mmm'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'qqq'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'xxx'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'zzz'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'nnn'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'qqq'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'xxx'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'zzz'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'qqq'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'xxx'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'zzz'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'xxx'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'zzz'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'xxx'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'zzz'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'xxx'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'zzz'; +COUNT(*) +0 + +Test left-closed, right-closed intervals +In some cases here the optimizer is smart enough not to call +ha_innobase::records_in_range() at all, so we get no warning containing +the value returned from btr_estimate_n_rows_in_range() + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'bbb'; +COUNT(*) +0 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'ccc'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'mmm'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'nnn'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'xxx'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'ccc'; +COUNT(*) +1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'eee'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'mmm'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'nnn'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'qqq'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'xxx'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'zzz'; +COUNT(*) +20 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 20 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'mmm'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'nnn'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'qqq'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'xxx'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'zzz'; +COUNT(*) +19 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 19 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'mmm'; +COUNT(*) +1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'nnn'; +COUNT(*) +2 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 2 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'qqq'; +COUNT(*) +2 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 2 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'xxx'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'zzz'; +COUNT(*) +11 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 11 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'nnn'; +COUNT(*) +1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'qqq'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'xxx'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'zzz'; +COUNT(*) +10 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 10 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'xxx'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'zzz'; +COUNT(*) +9 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 9 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'xxx'; +COUNT(*) +1 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'zzz'; +COUNT(*) +1 +Warnings: +Warning 1230 btr_estimate_n_rows_in_range(): 1 + +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'bbb'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'ccc'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'eee'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'mmm'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'nnn'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'qqq'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'xxx'; +COUNT(*) +0 +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'zzz'; +COUNT(*) +0 +SET DEBUG_DBUG = @save_dbug; +DROP TABLE records_in_range_test; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/recovery_memory,debug.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/recovery_memory,debug.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/recovery_memory,debug.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/recovery_memory,debug.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,10 @@ +--- recovery_memory.result 2024-06-21 12:54:38.026355524 +0530 ++++ recovery_memory.reject 2024-06-21 17:22:49.394535026 +0530 +@@ -23,6 +23,7 @@ + CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; + INSERT INTO t1 SELECT * FROM seq_1_to_65536; + # restart: with restart_parameters ++FOUND 1 /\[ERROR\] InnoDB: The change buffer is corrupted or has been removed on upgrade to MariaDB 11.0 or later/ in mysqld.1.err + # restart + SHOW CREATE TABLE t1; + Table Create Table diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/rename_table.result mariadb-10.11.9/mysql-test/suite/innodb/r/rename_table.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/rename_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/rename_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -21,11 +21,17 @@ DROP DATABASE abc_def; # restart DROP DATABASE abc_def2; -call mtr.add_suppression("InnoDB: (Operating system error|Error number \\d+ means|Cannot rename file)"); +call mtr.add_suppression("InnoDB: Cannot rename '.*t1.ibd' to '.*non_existing_db.*' because the target schema directory doesn't exist"); CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES(100); RENAME TABLE t1 TO non_existing_db.t1; ERROR HY000: Error on rename of './test/t1' to './non_existing_db/t1' (errno: 168 "Unknown (generic) error from engine") -FOUND 1 /\[ERROR\] InnoDB: Cannot rename file '.*t1\.ibd' to '.*non_existing_db/ in mysqld.1.err +FOUND 1 /\[ERROR\] InnoDB: Cannot rename '.*t1\.ibd' to '.*non_existing_db/ in mysqld.1.err +SET GLOBAL innodb_fast_shutdown=2; +# restart +SELECT * FROM t1; +a +100 DROP TABLE t1; # # MDEV-25509 Atomic DDL: Assertion `err != DB_DUPLICATE_KEY' diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,16k,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,16k,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,16k,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,16k,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ ---- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 -+++ suite/innodb/r/restart.reject 2022-01-19 08:12:28.602794678 +1100 -@@ -32,10 +32,10 @@ - SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; - SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); --ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '5242879' - SHOW WARNINGS; - Level Code Message --Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE --Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+Warning 1210 innodb_buffer_pool_size must be at least 5242880 for innodb_page_size=16384 -+Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '5242879' - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); - SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,16k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,16k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,16k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,16k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +--- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 ++++ suite/innodb/r/restart.reject 2022-01-19 08:12:28.602794678 +1100 +@@ -32,10 +32,10 @@ + SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; + SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); +-ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '5242879' + SHOW WARNINGS; + Level Code Message +-Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE +-Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++Warning 1210 innodb_buffer_pool_size must be at least 5242880 for innodb_page_size=16384 ++Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '5242879' + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); + SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,32k,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,32k,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,32k,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,32k,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ ---- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 -+++ suite/innodb/r/restart.reject 2022-01-19 08:07:57.402230887 +1100 -@@ -32,10 +32,10 @@ - SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; - SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); --ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '10485759' - SHOW WARNINGS; - Level Code Message --Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE --Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+Warning 1210 innodb_buffer_pool_size must be at least 10485760 for innodb_page_size=32768 -+Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '10485759' - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); - SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,32k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,32k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,32k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,32k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +--- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 ++++ suite/innodb/r/restart.reject 2022-01-19 08:07:57.402230887 +1100 +@@ -32,10 +32,10 @@ + SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; + SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); +-ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '10485759' + SHOW WARNINGS; + Level Code Message +-Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE +-Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++Warning 1210 innodb_buffer_pool_size must be at least 10485760 for innodb_page_size=32768 ++Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '10485759' + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); + SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,4k,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,4k,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,4k,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,4k,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ ---- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 -+++ suite/innodb/r/restart.reject 2022-01-19 08:13:56.397475513 +1100 -@@ -32,10 +32,10 @@ - SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; - SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); --ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '2097151' - SHOW WARNINGS; - Level Code Message --Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE --Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+Warning 1210 innodb_buffer_pool_size must be at least 2097152 for innodb_page_size=4096 -+Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '2097151' - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); - SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,4k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,4k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,4k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,4k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +--- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 ++++ suite/innodb/r/restart.reject 2022-01-19 08:13:56.397475513 +1100 +@@ -32,10 +32,10 @@ + SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; + SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); +-ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '2097151' + SHOW WARNINGS; + Level Code Message +-Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE +-Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++Warning 1210 innodb_buffer_pool_size must be at least 2097152 for innodb_page_size=4096 ++Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '2097151' + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); + SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,64k,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,64k,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,64k,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,64k,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ ---- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 -+++ suite/innodb/r/restart.reject 2022-01-19 08:11:32.418759095 +1100 -@@ -32,10 +32,10 @@ - SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; - SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); --ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '20971519' - SHOW WARNINGS; - Level Code Message --Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE --Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+Warning 1210 innodb_buffer_pool_size must be at least 20971520 for innodb_page_size=65536 -+Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '20971519' - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); - SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,64k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,64k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,64k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,64k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +--- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 ++++ suite/innodb/r/restart.reject 2022-01-19 08:11:32.418759095 +1100 +@@ -32,10 +32,10 @@ + SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; + SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); +-ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '20971519' + SHOW WARNINGS; + Level Code Message +-Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE +-Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++Warning 1210 innodb_buffer_pool_size must be at least 20971520 for innodb_page_size=65536 ++Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '20971519' + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); + SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,8k,innodb.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,8k,innodb.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,8k,innodb.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,8k,innodb.rdiff 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ ---- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 -+++ suite/innodb/r/restart.reject 2022-01-19 08:13:11.027788852 +1100 -@@ -32,10 +32,10 @@ - SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; - SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); --ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '3145727' - SHOW WARNINGS; - Level Code Message --Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE --Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' -+Warning 1210 innodb_buffer_pool_size must be at least 3145728 for innodb_page_size=8192 -+Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '3145727' - EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); - SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/restart,8k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/restart,8k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/restart,8k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/restart,8k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,16 @@ +--- ./suite/innodb/r/restart.result 2022-01-18 20:36:56.054653376 +1100 ++++ suite/innodb/r/restart.reject 2022-01-19 08:13:11.027788852 +1100 +@@ -32,10 +32,10 @@ + SELECT @@innodb_buffer_pool_size INTO @innodb_buffer_pool_size_orig; + SELECT CEILING((256 + 64) * @@innodb_page_size / 1048576) * 1048576 INTO @min_pool_size; + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size -1); +-ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++ERROR 42000: Variable 'innodb_buffer_pool_size' can't be set to the value of '3145727' + SHOW WARNINGS; + Level Code Message +-Warning 1210 innodb_buffer_pool_size must be at least MIN_VAL for innodb_page_size=PAGE_SIZE +-Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of 'WRONG_VALUE' ++Warning 1210 innodb_buffer_pool_size must be at least 3145728 for innodb_page_size=8192 ++Error 1231 Variable 'innodb_buffer_pool_size' can't be set to the value of '3145727' + EXECUTE IMMEDIATE 'SET GLOBAL innodb_buffer_pool_size = ?' USING (@min_pool_size); + SET GLOBAL innodb_buffer_pool_size = @innodb_buffer_pool_size_orig; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/row_format_redundant.result mariadb-10.11.9/mysql-test/suite/innodb/r/row_format_redundant.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/row_format_redundant.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/row_format_redundant.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ SET GLOBAL innodb_fast_shutdown=0; -# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 +# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb_undo_directory=MYSQLTEST_VARDIR/tmp/undo_dir --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 SET GLOBAL innodb_file_per_table=1; # # Bug#21644827 - FTS, ASSERT !SRV_READ_ONLY_MODE || M_IMPL.M_LOG_MODE == @@ -26,7 +26,7 @@ insert into t3 values(444, 'dddd', 'bbbbb', 'aaaaa'); insert into t3 values(555, 'eeee', 'ccccc', 'aaaaa'); SET GLOBAL innodb_fast_shutdown=0; -# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 --innodb-read-only +# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb_undo_directory=MYSQLTEST_VARDIR/tmp/undo_dir --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 --innodb-read-only SELECT COUNT(*) FROM t1; COUNT(*) 4096 @@ -42,14 +42,14 @@ ERROR HY000: Table 't2' is read only TRUNCATE TABLE t3; ERROR HY000: Table 't3' is read only -# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 --skip-innodb-fast-shutdown +# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb_undo_directory=MYSQLTEST_VARDIR/tmp/undo_dir --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 --skip-innodb-fast-shutdown TRUNCATE TABLE t1; TRUNCATE TABLE t2; TRUNCATE TABLE t3; corrupted SYS_TABLES.MIX_LEN for test/t1 corrupted SYS_TABLES.MIX_LEN for test/t2 corrupted SYS_TABLES.MIX_LEN for test/t3 -# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 --skip-innodb-fast-shutdown +# restart: --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/row_format_redundant --innodb-data-file-path=ibdata1:1M:autoextend --innodb_undo_directory=MYSQLTEST_VARDIR/tmp/undo_dir --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 --skip-innodb-fast-shutdown TRUNCATE TABLE t1; ERROR 42S02: Table 'test.t1' doesn't exist in engine TRUNCATE TABLE t2; @@ -68,9 +68,8 @@ Warnings: Warning 1932 Table 'test.t1' doesn't exist in engine DROP TABLE t2,t3; -FOUND 6 /\[ERROR\] InnoDB: Table test/t1 in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=1 SYS_TABLES\.MIX_LEN=511\b/ in mysqld.1.err +FOUND 5 /\[ERROR\] InnoDB: Table test/t1 in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=1 SYS_TABLES\.MIX_LEN=511\b/ in mysqld.1.err # restart -ib_buffer_pool ib_logfile0 ibdata1 db.opt diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff mariadb-10.11.9/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/row_size_error_log_warnings_3,4k.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,2 @@ +91a92 +> ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result mariadb-10.11.9/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result 2024-08-03 07:29:58.000000000 +0000 @@ -82,3 +82,11 @@ f33(10))) ENGINE=InnoDB; ERROR 42000: Too many key parts specified; max 32 parts allowed +# +# MDEV-31161 Assertion failures upon adding a too long key +# to table with COMPRESSED row format +# +CREATE TABLE t1(pk INT PRIMARY KEY, f1 INT, f2 TEXT)ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +INSERT INTO t1 (pk) VALUES (1); +ALTER TABLE t1 ADD KEY (f1), ADD KEY (f2(1000)); +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/scrub_debug.result mariadb-10.11.9/mysql-test/suite/innodb/r/scrub_debug.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/scrub_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/scrub_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ SET GLOBAL INNODB_LIMIT_OPTIMISTIC_INSERT_DEBUG=2; CREATE TABLE t1(f1 INT AUTO_INCREMENT PRIMARY KEY, f2 VARCHAR(256) GENERATED ALWAYS as('repairman'), -INDEX idx(f2))ENGINE= InnoDB; +INDEX idx(f2))ENGINE= InnoDB STATS_PERSISTENT=0; INSERT INTO t1(f1) SELECT seq FROM seq_1_to_50; FLUSH TABLE t1 FOR EXPORT; FOUND 108 /repairman/ in t1.ibd diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/table_flags.result mariadb-10.11.9/mysql-test/suite/innodb/r/table_flags.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/table_flags.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/table_flags.result 2024-08-03 07:29:58.000000000 +0000 @@ -101,13 +101,9 @@ SELECT * FROM tc; ERROR 42S02: Table 'test.tc' doesn't exist in engine SHOW CREATE TABLE td; -Table Create Table -td CREATE TABLE `td` ( - `a` int(11) NOT NULL, - PRIMARY KEY (`a`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC +ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB SELECT * FROM td; -a +ERROR HY000: Got error 194 "Tablespace is missing for a table" from storage engine InnoDB SHOW CREATE TABLE tz; Table Create Table tz CREATE TABLE `tz` ( @@ -122,8 +118,8 @@ 42 SHOW CREATE TABLE tp; ERROR 42S02: Table 'test.tp' doesn't exist in engine -FOUND 5 /InnoDB: Table test/t[cp] in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=(129|289|3873|1232[13]) SYS_TABLES\.N_COLS=2147483649/ in mysqld.1.err -FOUND 2 /InnoDB: Table test/tr in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=65 SYS_TABLES\.MIX_LEN=4294967295\b/ in mysqld.1.err +FOUND 3 /InnoDB: Table test/t[cp] in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=(129|289|3873|1232[13]) SYS_TABLES\.N_COLS=2147483649/ in mysqld.1.err +FOUND 1 /InnoDB: Table test/tr in InnoDB data dictionary contains invalid flags\. SYS_TABLES\.TYPE=65 SYS_TABLES\.MIX_LEN=4294967295\b/ in mysqld.1.err Restoring SYS_TABLES clustered index root page (8) # restart: with restart_parameters SHOW CREATE TABLE tr; @@ -190,3 +186,14 @@ INSERT INTO t1 VALUES(2); # restart DROP TABLE t1; +# +# MDEV-34222 Alter operation on redundant table aborts the server +# +SET @df_row = @@global.INNODB_DEFAULT_ROW_FORMAT; +SET GLOBAL INNODB_DEFAULT_ROW_FORMAT=REDUNDANT; +CREATE TABLE t1 (c CHAR(1)) ENGINE=InnoDB; +SET GLOBAL INNODB_DEFAULT_ROW_FORMAT=compact; +ALTER TABLE t1 PAGE_COMPRESSED=1; +ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'PAGE_COMPRESSED=1 ROW_FORMAT=REDUNDANT' +DROP TABLE t1; +SET @@global.INNODB_DEFAULT_ROW_FORMAT = @df_row; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/tablespace_per_table_not_windows.result mariadb-10.11.9/mysql-test/suite/innodb/r/tablespace_per_table_not_windows.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/tablespace_per_table_not_windows.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/tablespace_per_table_not_windows.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,128 @@ +# +# Test the limits of a file-per-table tablespace name. MySQL combines +# the database name with the table name to make a unique table name. +# +SET default_storage_engine=InnoDB; +# +# MySQL limits each database and tablename identifier to 64 characters +# of up to 3 bytes per character, corresponding to 192 bytes. +# +CREATE DATABASE `this_sixty_five_byte_name_is_too_long____________________________`; +ERROR 42000: Incorrect database name 'this_sixty_five_byte_name_is_too_long____________________________' +CREATE DATABASE `this_sixty_four_byte_name_is_not_too_long_______________________`; +USE `this_sixty_four_byte_name_is_not_too_long_______________________`; +# +# A 64 character tablename can be created in a 64 character database name +# +CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_four_byte_name_is_not_too_long_______________________` (a SERIAL); +# +# A 65 character tablename is too long. +# +CREATE TABLE `test`.`this_sixty_five_byte_name_is_too_long____________________________` (a SERIAL); +ERROR 42000: Incorrect table name 'this_sixty_five_byte_name_is_too_long____________________________' +CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_five_byte_name_is_too_long____________________________` (a SERIAL); +ERROR 42000: Incorrect table name 'this_sixty_five_byte_name_is_too_long____________________________' +# +# Non-non-filename-safe characters like '#' are expanded to '@0023'. +# On many file systems, such as Linux extfs, you can create a database name +# that expands to up to 255 bytes long. +# `##################################################_long` is expanded to +# (50 * 5) + 5 = 255. +# +CREATE DATABASE `##################################################_long`;; +USE `##################################################_long`; +# +# This 256-byte name is only one byte longer but fails with an error code +# from the stat operation. +# `##################################################_long_` is expanded to +# (50 * 5) + 6 = 256. +# +CREATE DATABASE `##################################################_long_`; +ERROR HY000: Can't get stat of './##################################################_long_' (Errcode: ## "File name too long") +# +# This 300-byte name which is the longest name that gets an error code +# from the stat operation. +# `###########################################################_long` is expanded to +# (59 * 5) + 5 = 300. +# +CREATE DATABASE `###########################################################_long`; +ERROR HY000: Can't get stat of './###########################################################_long' (Errcode: ## "File name too long") +# +# This 301-byte name which is only one byte longer but fails with ER_TOO_LONG_IDENT. +# `###########################################################_long_` is expanded to +# (59 * 5) + 6 = 301. +# +CREATE DATABASE `###########################################################_long_`; +ERROR 42000: Incorrect database name '###########################################################_long_' +USE test; +# +# An expanded table name is limited to 251 bytes +# +CREATE TABLE `test`.`#################################################_long_` (a SERIAL); +# +# A 252-byte tablename is too long +# +CREATE TABLE `test`.`#################################################_long___` (a SERIAL); +ERROR HY000: Can't create table `test`.`#################################################_long___` (errno: ## "File name too long") +CREATE DATABASE twenty_byte_db_name_; +USE `twenty_byte_db_name_`; +# +# A 251 byte expanded table name will fit with a longer database name +# +CREATE TABLE `twenty_byte_db_name_`.`#################################################_long_` (a SERIAL); +# +# A 252 byte expanded table name is also too long in a longer database name +# +CREATE TABLE `twenty_byte_db_name_`.`#################################################_long___` (a SERIAL); +ERROR HY000: Can't create table `twenty_byte_db_name_`.`#################################################_long___` (errno: ## "File name too long") +# +# Another limitation is a 512 byte length to an expanded path that includes +# the datadir which is './' in this test, the expanded database name, +# the directory separator '/', the expanded table name, and the file extension. +# './long_db_name.long_250_byte_table_name.frm' +# 2+ 255 +1+ 250 +1+3 = 512 +# +CREATE TABLE `##################################################_long`.`#################################################_long` (a SERIAL); +CREATE TABLE `##################################################_long`.`#################################################_long_` (a SERIAL); +ERROR HY000: Long database name and identifier for object resulted in path length exceeding 512 characters. Path: './@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023_long/@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@ +SHOW WARNINGS; +Level Code Message +Error 1860 Long database name and identifier for object resulted in path length exceeding 512 characters. Path: './@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023_long/@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@ +# +# Show the successfully created databases and tables +# +---- list_files MYSQLD_DATADIR/test +#################################################_long_.frm +#################################################_long_.ibd +db.opt +---- list_files MYSQLD_DATADIR/this_sixty_four_byte_name_is_not_too_long_______________________ +db.opt +this_sixty_four_byte_name_is_not_too_long_______________________.frm +this_sixty_four_byte_name_is_not_too_long_______________________.ibd +---- list_files MYSQLD_DATADIR/##################################################_long +#################################################_long.frm +#################################################_long.ibd +db.opt +SELECT name FROM information_schema.innodb_sys_tables WHERE name LIKE '%long%'; +name +##################################################_long/#################################################_long +test/#################################################_long_ +this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________ +twenty_byte_db_name_/#################################################_long_ +SELECT name FROM information_schema.innodb_sys_tablespaces WHERE name LIKE '%long%'; +name +this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________ +test/#################################################_long_ +twenty_byte_db_name_/#################################################_long_ +##################################################_long/#################################################_long +SELECT file_name, tablespace_name FROM information_schema.files WHERE file_name LIKE '%long%'; +# +# Cleanup +# +DROP TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_four_byte_name_is_not_too_long_______________________`; +DROP TABLE `test`.`#################################################_long_`; +DROP TABLE `twenty_byte_db_name_`.`#################################################_long_`; +DROP TABLE `##################################################_long`.`#################################################_long`; +DROP DATABASE `this_sixty_four_byte_name_is_not_too_long_______________________`; +DROP DATABASE `##################################################_long`; +DROP DATABASE `twenty_byte_db_name_`; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/tablespace_per_table_windows.result mariadb-10.11.9/mysql-test/suite/innodb/r/tablespace_per_table_windows.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/tablespace_per_table_windows.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/tablespace_per_table_windows.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,48 @@ +# +# Test the limits of a file-per-table tablespace name. MySQL combines +# the database name with the table name to make a unique table name. +# +SET default_storage_engine=InnoDB; +# +# MySQL limits each database and tablename identifier to 64 characters +# of up to 3 bytes per character, corresponding to 192 bytes. +# +CREATE DATABASE `this_sixty_five_byte_name_is_too_long____________________________`; +ERROR 42000: Incorrect database name 'this_sixty_five_byte_name_is_too_long____________________________' +CREATE DATABASE `this_sixty_four_byte_name_is_not_too_long_______________________`; +USE `this_sixty_four_byte_name_is_not_too_long_______________________`; +# +# A 64 character tablename can be created in a 64 character database name +# +CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_four_byte_name_is_not_too_long_______________________` (a SERIAL); +# +# A 65 character tablename is too long. +# +CREATE TABLE `test`.`this_sixty_five_byte_name_is_too_long____________________________` (a SERIAL); +ERROR 42000: Incorrect table name 'this_sixty_five_byte_name_is_too_long____________________________' +CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_five_byte_name_is_too_long____________________________` (a SERIAL); +ERROR 42000: Incorrect table name 'this_sixty_five_byte_name_is_too_long____________________________' +# +# Show the successfully created database and table +# +SHOW CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_four_byte_name_is_not_too_long_______________________`; +Table Create Table +this_sixty_four_byte_name_is_not_too_long_______________________ CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________` ( + `a` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + UNIQUE KEY `a` (`a`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +---- list_files MYSQLD_DATADIR/this_sixty_four_byte_name_is_not_too_long_______________________ +db.opt +this_sixty_four_byte_name_is_not_too_long_______________________.frm +this_sixty_four_byte_name_is_not_too_long_______________________.ibd +SELECT name FROM information_schema.innodb_sys_tables WHERE name LIKE '%long%'; +name +this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________ +SELECT name FROM information_schema.innodb_sys_tablespaces WHERE name LIKE '%long%'; +name +this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________ +SELECT file_name, tablespace_name FROM information_schema.files WHERE file_name LIKE '%long%'; +# +# Cleanup +# +DROP DATABASE `this_sixty_four_byte_name_is_not_too_long_______________________`; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/temporary_table.result mariadb-10.11.9/mysql-test/suite/innodb/r/temporary_table.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/temporary_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/temporary_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -801,4 +801,14 @@ Table Op Msg_type Msg_text test.t check status OK DROP TEMPORARY TABLE t; +# +# MDEV-34118 fsp_alloc_free_extent() fails to flag DB_OUT_OF_FILE_SPACE +# +SET @save_increment = @@GLOBAL.innodb_autoextend_increment; +SET GLOBAL innodb_autoextend_increment=1; +CREATE TEMPORARY TABLE t (c LONGTEXT) ENGINE=INNODB; +INSERT INTO t VALUES (REPEAT ('1',16777216)); +ERROR HY000: The table 't' is full +DROP TEMPORARY TABLE t; +SET GLOBAL innodb_autoextend_increment=@save_increment; # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/truncate_crash.result mariadb-10.11.9/mysql-test/suite/innodb/r/truncate_crash.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/truncate_crash.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/truncate_crash.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ FLUSH TABLES; -CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; INSERT INTO t1 VALUES (1),(2); connect wait,localhost,root,,test; SET DEBUG_SYNC='before_trx_state_committed_in_memory SIGNAL c WAIT_FOR ever'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/truncate_foreign.result mariadb-10.11.9/mysql-test/suite/innodb/r/truncate_foreign.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/truncate_foreign.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/truncate_foreign.result 2024-08-03 07:29:58.000000000 +0000 @@ -77,25 +77,26 @@ call mtr.add_suppression("InnoDB: In ALTER TABLE `test`\\.`t1` has or is"); CREATE TABLE t1 (pk INT, a INT, PRIMARY KEY (pk), KEY (a)) ENGINE=InnoDB; SET FOREIGN_KEY_CHECKS=0; -ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a), ALGORITHM=COPY; +ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t2 (a), ALGORITHM=COPY; INSERT INTO t1 VALUES (1,1); +CREATE TABLE t2(f1 INT PRIMARY KEY)ENGINE=InnoDB; LOCK TABLES t1 WRITE; SET FOREIGN_KEY_CHECKS=1; TRUNCATE t1; ERROR HY000: Cannot add foreign key constraint for `t1` INSERT INTO t1 VALUES (2,2); -ERROR HY000: Table 't1' was not locked with LOCK TABLES +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t2` (`a`)) SELECT * FROM t1; pk a 1 1 UNLOCK TABLES; INSERT INTO t1 VALUES (2,2); -ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`)) +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t1`, CONSTRAINT `t1_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t2` (`a`)) SET FOREIGN_KEY_CHECKS=0; INSERT INTO t1 VALUES (2,2); SELECT * FROM t1; pk a 1 1 2 2 -DROP TABLE t1; +DROP TABLE t2, t1; # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/trx_id_future.result mariadb-10.11.9/mysql-test/suite/innodb/r/trx_id_future.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/trx_id_future.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/trx_id_future.result 2024-08-03 07:29:58.000000000 +0000 @@ -2,7 +2,7 @@ # Bug #20445525 ADD A CONSISTENCY CHECK AGAINST DB_TRX_ID BEING # IN THE FUTURE # -CREATE TABLE t1(a INT) row_format=redundant engine=innoDB; +CREATE TABLE t1(a INT) row_format=redundant engine=innoDB stats_persistent=0; INSERT INTO t1 VALUES(1); InnoDB 0 transactions not purged call mtr.add_suppression("\\[Warning\\] InnoDB: A transaction id in a record of table `test`\\.`t1` is newer than the system-wide maximum"); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/undo_log.result mariadb-10.11.9/mysql-test/suite/innodb/r/undo_log.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/undo_log.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/undo_log.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; SET innodb_strict_mode=OFF; CREATE TABLE test_tab ( a_str_18 mediumtext, @@ -154,3 +156,4 @@ InnoDB 0 transactions not purged DROP TABLE t1; DROP TABLE t2; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/undo_space_dblwr.result mariadb-10.11.9/mysql-test/suite/innodb/r/undo_space_dblwr.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/undo_space_dblwr.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/undo_space_dblwr.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,16 +4,15 @@ innodb_doublewrite ON create table t1(f1 int not null, f2 int not null)engine=innodb; insert into t1 values (1, 1); -InnoDB 0 transactions not purged -set GLOBAL innodb_log_checkpoint_now=1; +SET GLOBAL innodb_fast_shutdown = 0; +# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0 # Make the first page dirty for undo tablespace set global innodb_saved_page_number_debug = 0; set global innodb_fil_make_page_dirty_debug = 1; -SET GLOBAL innodb_max_dirty_pages_pct_lwm=0.0; -SET GLOBAL innodb_max_dirty_pages_pct=0.0; +SET GLOBAL innodb_buf_flush_list_now = 1; # Kill the server -# restart -FOUND 1 /Checksum mismatch in the first page of file/ in mysqld.1.err +# restart: --debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0 +FOUND 1 /Restoring page \[page id: space=1, page number=0\] of datafile '.*undo001' from the doublewrite buffer./ in mysqld.1.err check table t1; Table Op Msg_type Msg_text test.t1 check status OK diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/undo_truncate.result mariadb-10.11.9/mysql-test/suite/innodb/r/undo_truncate.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/undo_truncate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/undo_truncate.result 2024-08-03 07:29:58.000000000 +0000 @@ -27,6 +27,7 @@ connection con2; delete from t2; connection con1; +SET GLOBAL innodb_max_undo_log_size = @@GLOBAL.innodb_page_size * 4294967296; SET GLOBAL innodb_undo_log_truncate = 1; commit; disconnect con1; @@ -35,6 +36,8 @@ disconnect con2; connection default; SET GLOBAL innodb_max_purge_lag_wait=0; +SET GLOBAL innodb_max_undo_log_size=DEFAULT; +SET GLOBAL innodb_max_purge_lag_wait=0; set global innodb_fast_shutdown=0; # restart drop table t1, t2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/undo_upgrade.result mariadb-10.11.9/mysql-test/suite/innodb/r/undo_upgrade.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/undo_upgrade.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/undo_upgrade.result 2024-08-03 07:29:58.000000000 +0000 @@ -62,3 +62,27 @@ # Should list 2 undo log tablespaces, not 4 undo001 undo002 +# +# MDEV-34200 InnoDB tries to write to read-only +# system tablespace in buf_dblwr_t::init_or_load_pages() +# +SET GLOBAL innodb_fast_shutdown=0; +# restart: --innodb_undo_tablespaces=4 +# Should list 4 undo log tablespaces +undo001 +undo002 +undo003 +undo004 +set global innodb_fast_shutdown=0; +# restart: --innodb_read_only=1 +set global innodb_fast_shutdown=0; +# restart: --innodb-data-file-path=ibdata1:1M:autoextend --innodb_undo_directory=MYSQLTEST_VARDIR/tmp/undo_dir --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/bugdir --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/bugdir --innodb_undo_tablespaces=3 +# Should list 3 undo log tablespaces +undo001 +undo002 +undo003 +set global innodb_fast_shutdown=0; +# restart: --innodb-data-file-path=ibdata1:1M:autoextend --innodb_undo_directory=MYSQLTEST_VARDIR/tmp/undo_dir --innodb-data-home-dir=MYSQLTEST_VARDIR/tmp/bugdir_1 --innodb-log-group-home-dir=MYSQLTEST_VARDIR/tmp/bugdir_1 --innodb_undo_tablespaces=0 +# Shouldn't list 0 undo log tablespaces +set global innodb_fast_shutdown=0; +# restart diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/r/xa_recovery.result mariadb-10.11.9/mysql-test/suite/innodb/r/xa_recovery.result --- mariadb-10.11.6/mysql-test/suite/innodb/r/xa_recovery.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/r/xa_recovery.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,4 @@ -CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); connect con1,localhost,root; XA START 'x'; @@ -6,7 +6,7 @@ XA END 'x'; XA PREPARE 'x'; connect con2,localhost,root; -CREATE TABLE t2 (a INT) ENGINE=InnoDB; +CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=InnoDB; XA START 'y'; INSERT INTO t2 VALUES (1); XA END 'y'; @@ -30,10 +30,21 @@ SELECT * FROM t1; a 1 -DROP TABLE t1; DROP TABLE t2; ERROR HY000: Lock wait timeout exceeded; try restarting transaction XA ROLLBACK 'y'; DROP TABLE t2; +CREATE TABLE t3(a INT PRIMARY KEY REFERENCES t1(a)) ENGINE=InnoDB; +XA START 'a'; +INSERT INTO t3 SET a=1; +INSERT INTO t3 SET a=42; +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t3`, CONSTRAINT `t3_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`)) +XA END 'a'; +XA PREPARE 'a'; SET GLOBAL innodb_fast_shutdown=0; # restart +XA COMMIT 'a'; +SELECT * FROM t3; +a +1 +DROP TABLE t3,t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/add_foreign_key.test mariadb-10.11.9/mysql-test/suite/innodb/t/add_foreign_key.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/add_foreign_key.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/add_foreign_key.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,38 @@ +--source include/have_innodb.inc + +--echo # +--echo # Bug #19471516 SERVER CRASHES WHEN EXECUTING ALTER TABLE ADD +--echo # FOREIGN KEY +--echo # + +CREATE TABLE `parent` (`parent_id` INT, PRIMARY KEY (`parent_id`)); +CREATE TABLE `child1` (`id` INT ,`child1_fk1` INT, `child1_fk2` INT, +PRIMARY KEY (`id`)); +CREATE TABLE `child2` (`id` INT, `child2_fk1` INT, `child2_fk2` INT, +PRIMARY KEY (`id`)); +CREATE TABLE `child3` (`id` INT , `child3_fk1` INT, PRIMARY KEY (`id`)); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk1`) REFERENCES `parent` +(`parent_id`); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk1`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk2`) REFERENCES `parent` +(`parent_id`); + +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk1`) REFERENCES `parent` +(`parent_id`); + +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk2`) REFERENCES `parent` +(`parent_id`); + +ALTER TABLE `child3` ADD FOREIGN KEY (`child3_fk1`) REFERENCES `parent` +(`parent_id`); +ALTER TABLE `child1` ADD FOREIGN KEY (`child1_fk2`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk1`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child2` ADD FOREIGN KEY (`child2_fk2`) REFERENCES +`parent` (`parent_id`); +ALTER TABLE `child3` ADD FOREIGN KEY (`child3_fk1`) REFERENCES +`parent` (`parent_id`); + +drop table child3, child2, child1, parent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/alter_copy.test mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/alter_copy.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy.test 2024-08-03 07:29:58.000000000 +0000 @@ -57,7 +57,7 @@ connection default; SET DEBUG_SYNC='now WAIT_FOR hung'; let $shutdown_timeout=0; ---let $restart_parameters= --innodb-force-recovery=3 --debug_dbug="+d,recv_ran_out_of_buffer" +--let $restart_parameters= --innodb-force-recovery=3 --source include/restart_mysqld.inc disconnect hang; let $shutdown_timeout=; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/alter_copy_bulk.combinations mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy_bulk.combinations --- mariadb-10.11.6/mysql-test/suite/innodb/t/alter_copy_bulk.combinations 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy_bulk.combinations 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,5 @@ +[ON] +--innodb_alter_copy_bulk=ON + +[OFF] +--innodb_alter_copy_bulk=OFF diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/alter_copy_bulk.test mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy_bulk.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/alter_copy_bulk.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/alter_copy_bulk.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,44 @@ +--source include/have_innodb.inc +--source include/have_partition.inc +--source include/have_sequence.inc +SET @@alter_algorithm=COPY; + +CREATE TABLE t1(f1 CHAR(200), f2 INT NOT NULL)engine=InnoDB; +INSERT INTO t1 SELECT repeat('a', 200), seq FROM seq_1_to_2; +# Buffer fits in the memory +ALTER TABLE t1 FORCE; + +# Insert more entries +INSERT INTO t1 SELECT repeat('b', 200), seq FROM seq_3_to_65536; +# Alter should use temporary file for sorting +ALTER TABLE t1 ADD INDEX(f2); + +# Error while buffering the insert operation +--error ER_DUP_ENTRY +ALTER TABLE t1 ADD PRIMARY KEY(f1(2)); + +INSERT INTO t1 VALUES(repeat('a', 200), 1); +# Error while applying the bulk insert operation +--error ER_DUP_ENTRY +ALTER TABLE t1 ADD UNIQUE KEY(f2); + +# Ignore shouldn't go through bulk operation +ALTER IGNORE TABLE t1 MODIFY f1 CHAR(200) NOT NULL; + +CREATE TABLE t2(f1 INT NOT NULL, + FOREIGN KEY(f1) REFERENCES t1(f2))ENGINE=InnoDB; +INSERT INTO t2 VALUES(1); +# Bulk operation shouldn't happen because of foreign key constraints +ALTER TABLE t2 FORCE; +DROP TABLE t2, t1; + +CREATE TABLE t1 (f1 INT, f2 INT) ENGINE=InnoDB PARTITION BY HASH(f1) PARTITIONS 2; +INSERT INTO t1 VALUES(1, 1); +INSERT INTO t1 SELECT seq, seq * 2 FROM seq_1_to_2; +# Buffer fits in the memory +ALTER TABLE t1 FORCE; +# Insert more entries +INSERT INTO t1 SELECT seq, seq * 2 FROM seq_3_to_65536; +# Alter should use temporary file for sorting +ALTER TABLE t1 ADD INDEX(f2); +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/alter_crash.test mariadb-10.11.9/mysql-test/suite/innodb/t/alter_crash.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/alter_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/alter_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -70,7 +70,7 @@ WHERE name = 'test/t1'`; # Write file to make mysql-test-run.pl expect crash ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --error 2013 ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); @@ -110,7 +110,7 @@ WHERE name = 'test/t2'`; # Write file to make mysql-test-run.pl expect crash ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --error 2013 ALTER TABLE t2 ADD PRIMARY KEY (f2, f1); @@ -150,7 +150,7 @@ information_schema.innodb_sys_tables where name = 'test/t1'`; # Write file to make mysql-test-run.pl expect crash ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # --error 2013 ALTER TABLE t1 ADD INDEX (b), CHANGE c d int, ALGORITHM=INPLACE; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/alter_kill.test mariadb-10.11.9/mysql-test/suite/innodb/t/alter_kill.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/alter_kill.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/alter_kill.test 2024-08-03 07:29:58.000000000 +0000 @@ -26,6 +26,7 @@ -- echo # SET GLOBAL innodb_file_per_table=1; +SET GLOBAL innodb_stats_persistent=0; CREATE TABLE bug16720368_1 (a INT PRIMARY KEY) ENGINE=InnoDB; @@ -75,7 +76,7 @@ -- source include/start_mysqld.inc ---error ER_NO_SUCH_TABLE_IN_ENGINE +--error ER_TABLE_CORRUPT SELECT COUNT(*) FROM bug16720368; --error ER_TABLE_CORRUPT INSERT INTO bug16720368 VALUES(1); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/alter_rename_existing.test mariadb-10.11.9/mysql-test/suite/innodb/t/alter_rename_existing.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/alter_rename_existing.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/alter_rename_existing.test 2024-08-03 07:29:58.000000000 +0000 @@ -18,7 +18,7 @@ --echo # --echo # Create a file called MYSQLD_DATADIR/test/t1.ibd ---exec echo "This is not t1.ibd" > $MYSQLD_DATADIR/test/t1.ibd +--write_line "This is not t1.ibd" $MYSQLD_DATADIR/test/t1.ibd --echo # Directory listing of test/*.ibd --echo # diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/alter_table.test mariadb-10.11.9/mysql-test/suite/innodb/t/alter_table.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/alter_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/alter_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -121,9 +121,20 @@ CREATE TABLE t1 (c DATETIME AUTO_INCREMENT UNIQUE) ENGINE=InnoDB; --echo # ---echo # End of 10.4 tests +--echo # MDEV-31000 Assertion failed on ALTER TABLE...page_compressed=1 --echo # +SET @save_file_per_table=@@GLOBAL.innodb_file_per_table; +SET GLOBAL innodb_file_per_table=0; +CREATE TABLE t (c INT PRIMARY KEY) ENGINE=INNODB; +SET GLOBAL innodb_file_per_table=1; +ALTER TABLE t page_compressed=1; +SET GLOBAL innodb_file_per_table=@save_file_per_table; +SELECT space>0 FROM information_schema.innodb_sys_tables WHERE name='test/t'; +DROP TABLE t; + +--echo # End of 10.4 tests + --echo # --echo # MDEV-21748 ASAN use-after-poison in PageBulk::insertPage() --echo # @@ -141,3 +152,5 @@ INSERT INTO t1 VALUES (1,NULL),(2,NULL); UPDATE t1 SET a=0; DROP TABLE t1; + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/autoinc_debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/autoinc_debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/autoinc_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/autoinc_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -92,3 +92,69 @@ SHOW CREATE TABLE t1; DROP TABLE t1; SET DEBUG_SYNC='RESET'; + +--echo # +--echo # MDEV-33593: Auto increment deadlock error causes ASSERT in subsequent save point +--echo # + +CREATE TABLE t1(col1 INT PRIMARY KEY AUTO_INCREMENT, col2 INT) ENGINE=InnoDB; +CREATE TABLE t2(col1 INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1(col2) values(100); + +--connect(con1, localhost, root,,) +START TRANSACTION; +--echo # T1: Acquiring Row X lock on table t2 +INSERT INTO t2 values(100); + +--connect(con2, localhost, root,,) +START TRANSACTION; +--echo # T2: Wait for (T1) row lock on t2 after acquiring GAP Lock on t1 +UPDATE t1 SET col2 = 20 where col1 = 10; +SET DEBUG_SYNC='lock_wait_before_suspend SIGNAL t2_waiting'; +--send INSERT INTO t2 values(100) + +--connection default +SET DEBUG_SYNC='now WAIT_FOR t2_waiting'; +--echo # T3: Wait for (T2) II row Lock on t1 after acquiring Auto Increment Lock on t1 +SET DEBUG_SYNC='lock_wait_before_suspend SIGNAL t3_waiting'; +--send INSERT INTO t1(col2) SELECT col2 from t1 + +--connection con1 +SAVEPOINT s1; +SET DEBUG_SYNC='now WAIT_FOR t3_waiting'; +--echo # T1: Wait for (T3) auto increment lock on t1 causing T1 -> T3 -> T2 -> T1 deadlock +SET debug_dbug = '+d,innodb_deadlock_victim_self'; +--error ER_AUTOINC_READ_FAILED +INSERT INTO t1(col2) VALUES(200); + +--echo # The transaction should have been rolled back +SELECT * FROM t1; +SELECT * FROM t2; + +--echo # Release the previous savepoint using the same name +SAVEPOINT s1; +COMMIT; + +--connection con2 +--reap +COMMIT; + +--connection default +--reap +COMMIT; + +--disconnect con1 +--disconnect con2 + +--echo # Cleanup +SELECT * FROM t1; +DROP TABLE t1; + +SELECT * FROM t2; +DROP TABLE t2; + +SET DEBUG_SYNC='RESET'; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/autoinc_import.test mariadb-10.11.9/mysql-test/suite/innodb/t/autoinc_import.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/autoinc_import.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/autoinc_import.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,168 @@ +--source include/have_innodb.inc + +CREATE TABLE t1 (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t1 VALUES(42); +CREATE TABLE t1b LIKE t1; +INSERT INTO t1b VALUES(3); +CREATE TABLE t1z LIKE t1; +CREATE TABLE t1t (id TINYINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t0t LIKE t1t; +INSERT INTO t1t VALUES(123); +--let DATADIR=`select @@datadir` +--let PAGE_SIZE=`select @@innodb_page_size` +FLUSH TABLES t1,t1b,t1t FOR EXPORT; +--copy_file $DATADIR/test/t1.ibd $DATADIR/test/t.ibd +--copy_file $DATADIR/test/t1.ibd $DATADIR/test/tz.ibd +--copy_file $DATADIR/test/t1b.ibd $DATADIR/test/tb.ibd +--copy_file $DATADIR/test/t1t.ibd $DATADIR/test/tt.ibd +UNLOCK TABLES; +CREATE TABLE t5_7 LIKE t1; +CREATE TABLE t5_7b LIKE t1b; +CREATE TABLE t10_1 LIKE t1; +CREATE TABLE t10_1b LIKE t1b; +ALTER TABLE t1 DISCARD TABLESPACE; +ALTER TABLE t1b DISCARD TABLESPACE; +ALTER TABLE t1z DISCARD TABLESPACE; +ALTER TABLE t1t DISCARD TABLESPACE; +ALTER TABLE t0t DISCARD TABLESPACE; +ALTER TABLE t5_7 DISCARD TABLESPACE; +ALTER TABLE t5_7b DISCARD TABLESPACE; +ALTER TABLE t10_1 DISCARD TABLESPACE; +ALTER TABLE t10_1b DISCARD TABLESPACE; +FLUSH TABLES; + +# Update the PAGE_ROOT_AUTO_INC field of a few files. +perl; +do "$ENV{MTR_SUITE_DIR}/include/crc32.pl"; +sub update_autoinc +{ + my ($file, $value) = @_; + open(FILE, "+<$file") || die "Unable to open $file"; + binmode FILE; + my $ps= $ENV{PAGE_SIZE}; + my $page; + die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps; + my $full_crc32 = unpack("N",substr($page,54,4)) & 0x10; # FIL_SPACE_FLAGS + sysseek(FILE, 3*$ps, 0) || die "Unable to seek $file\n"; + die "Unable to read $file" unless sysread(FILE, $page, $ps) == $ps; + substr($page,56,8)=pack("NN",0,$value); + my $polynomial = 0x82f63b78; # CRC-32C + if ($full_crc32) { + my $ck = mycrc32(substr($page, 0, $ps-4), 0, $polynomial); + substr($page, $ps-4, 4) = pack("N", $ck); + } + else + { + my $ck= pack("N",mycrc32(substr($page, 4, 22), 0, $polynomial) ^ + mycrc32(substr($page, 38, $ps - 38 - 8), 0, $polynomial)); + substr($page,0,4)=$ck; + substr($page,$ps-8,4)=$ck; + } + sysseek(FILE, 3*$ps, 0) || die "Unable to rewind $file\n"; + syswrite(FILE, $page, $ps)==$ps || die "Unable to write $file\n"; + close(FILE) || die "Unable to close $file"; +} +update_autoinc("$ENV{DATADIR}/test/tz.ibd", 0); +update_autoinc("$ENV{DATADIR}/test/t.ibd", 3); +update_autoinc("$ENV{DATADIR}/test/tb.ibd", 346); +update_autoinc("$ENV{DATADIR}/test/tt.ibd", 128); +EOF + +--remove_file $DATADIR/test/t5_7.frm +--remove_file $DATADIR/test/t5_7b.frm +--copy_file $MYSQL_TEST_DIR/std_data/autoinc_import_57.frm $DATADIR/test/t5_7.frm +--copy_file $MYSQL_TEST_DIR/std_data/autoinc_import_57.frm $DATADIR/test/t5_7b.frm +--remove_file $DATADIR/test/t10_1.frm +--remove_file $DATADIR/test/t10_1b.frm +--copy_file $MYSQL_TEST_DIR/std_data/autoinc_import_101.frm $DATADIR/test/t10_1.frm +--copy_file $MYSQL_TEST_DIR/std_data/autoinc_import_101.frm $DATADIR/test/t10_1b.frm +--copy_file $DATADIR/test/t.ibd $DATADIR/test/t5_7.ibd +--copy_file $DATADIR/test/tb.ibd $DATADIR/test/t5_7b.ibd +--copy_file $DATADIR/test/t.ibd $DATADIR/test/t10_1.ibd +--copy_file $DATADIR/test/tb.ibd $DATADIR/test/t10_1b.ibd +--move_file $DATADIR/test/t.ibd $DATADIR/test/t1.ibd +--move_file $DATADIR/test/tb.ibd $DATADIR/test/t1b.ibd +--copy_file $DATADIR/test/tt.ibd $DATADIR/test/t0t.ibd +--move_file $DATADIR/test/tt.ibd $DATADIR/test/t1t.ibd +--move_file $DATADIR/test/tz.ibd $DATADIR/test/t1z.ibd + +ALTER TABLE t0t IMPORT TABLESPACE; +INSERT INTO t0t VALUES(NULL); +SELECT * FROM t0t; +DROP TABLE t0t; +ALTER TABLE t1 IMPORT TABLESPACE; +ALTER TABLE t1b IMPORT TABLESPACE; +ALTER TABLE t1z IMPORT TABLESPACE; +ALTER TABLE t1t IMPORT TABLESPACE; +ALTER TABLE t5_7 IMPORT TABLESPACE; +ALTER TABLE t5_7b IMPORT TABLESPACE; +ALTER TABLE t10_1 IMPORT TABLESPACE; +ALTER TABLE t10_1b IMPORT TABLESPACE; + +--let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let SEARCH_PATTERN= InnoDB: Resetting PAGE_ROOT_AUTO_INC from 128 to 123 on table `test`\.`t0t` +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= InnoDB: Resetting PAGE_ROOT_AUTO_INC from 0 to 42 on table `test`\.`t1z` +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= InnoDB: Resetting PAGE_ROOT_AUTO_INC from 128 to 123 on table `test`\.`t1t` +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= InnoDB: Resetting PAGE_ROOT_AUTO_INC from 3 to 42 on table `test`\.`t5_7` \(created with version 50744\) +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= InnoDB: Resetting PAGE_ROOT_AUTO_INC from 3 to 42 on table `test`\.`t10_1` \(created with version 100149\) +--source include/search_pattern_in_file.inc +--let SEARCH_PATTERN= InnoDB: Resetting PAGE_ROOT_AUTO_INC +--source include/search_pattern_in_file.inc + +# Restart, so that the InnoDB tables will be loaded into the data dictionary. +--let $restart_parameters=--read-only +--source include/restart_mysqld.inc + +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; + +--let $restart_parameters=--innodb-read-only --read-only +--source include/restart_mysqld.inc + +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; + +--let $restart_parameters=--innodb-read-only +--source include/restart_mysqld.inc + +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; + +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t1b; +SELECT COUNT(*) FROM t1t; +SELECT COUNT(*) FROM t1z; +SELECT COUNT(*) FROM t5_7; +SELECT COUNT(*) FROM t5_7b; +SELECT COUNT(*) FROM t10_1; +SELECT COUNT(*) FROM t10_1b; + +--let $restart_parameters= +--source include/restart_mysqld.inc + +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; + +INSERT INTO t1 VALUES(NULL); +INSERT INTO t1b VALUES(NULL); +INSERT INTO t1t VALUES(NULL); +INSERT INTO t1z VALUES(NULL); +INSERT INTO t5_7 VALUES(NULL); +INSERT INTO t5_7b VALUES(NULL); +INSERT INTO t10_1 VALUES(NULL); +INSERT INTO t10_1b VALUES(NULL); + +CHECK TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b FOR UPGRADE; + +SELECT * FROM t1; +SELECT * FROM t1b; +SELECT * FROM t1t; +SELECT * FROM t1z; +SELECT * FROM t5_7; +SELECT * FROM t5_7b; +SELECT * FROM t10_1; +SELECT * FROM t10_1b; +DROP TABLE t1, t1b, t1t, t1z, t5_7, t5_7b, t10_1, t10_1b; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/cascade_lock_wait.test mariadb-10.11.9/mysql-test/suite/innodb/t/cascade_lock_wait.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/cascade_lock_wait.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/cascade_lock_wait.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,45 @@ +--source include/have_innodb.inc +--source include/have_debug.inc + +create table t1 (f1 int primary key) engine=innodb; +create table t2 (f1 int primary key, + constraint c1 foreign key (f1) references t1(f1) + on update cascade + on delete cascade) engine=innodb; +create table t3 (f1 int primary key, + constraint c2 foreign key (f1) references t1(f1) + on update cascade + on delete cascade) engine=innodb; +show create table t1; +show create table t2; +show create table t3; + +insert into t1 values (1); +insert into t1 values (2); +insert into t1 values (3); + +insert into t2 values (1); +insert into t2 values (2); +insert into t2 values (3); + +insert into t3 values (1); +insert into t3 values (2); +insert into t3 values (3); + +select f1 from t1; +select f1 from t2; +select f1 from t3; + +set @save_dbug = @@debug_dbug; +set debug_dbug = '+d,dml_cascade_only_once'; +set debug_dbug = '+d,row_upd_cascade_lock_wait_err'; +update t1 set f1 = 100 where f1 = 2; + +select f1 from t1; +select f1 from t2; +select f1 from t3; + +set debug_dbug = @save_dbug; +drop table t2; +drop table t3; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/corrupted_during_recovery.test mariadb-10.11.9/mysql-test/suite/innodb/t/corrupted_during_recovery.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/corrupted_during_recovery.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/corrupted_during_recovery.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,7 @@ call mtr.add_suppression("InnoDB: Database page corruption on disk or a failed read of file '.*test.t1\\.ibd' page"); call mtr.add_suppression("InnoDB: Failed to read page 3 from file '.*test.t1\\.ibd': Page read from tablespace is corrupted."); call mtr.add_suppression("InnoDB: (Unable to apply log to|Discarding log for) corrupted page .*, page number=3\\]"); -call mtr.add_suppression("Table test/t1 is corrupted. Please drop the table and recreate\\."); +call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate."); call mtr.add_suppression("InnoDB: File '.*test/t1\\.ibd' is corrupted"); call mtr.add_suppression("InnoDB: A long wait .* was observed for dict_sys"); --enable_query_log @@ -59,7 +59,7 @@ let $restart_parameters=--innodb_force_recovery=1; --source include/restart_mysqld.inc ---error ER_TABLE_CORRUPT +--error ER_NO_SUCH_TABLE_IN_ENGINE,ER_TABLE_CORRUPT SELECT * FROM t1; SELECT * FROM t2; CHECK TABLE t2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/cursor-restore-unique-null.test mariadb-10.11.9/mysql-test/suite/innodb/t/cursor-restore-unique-null.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/cursor-restore-unique-null.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/cursor-restore-unique-null.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,36 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/count_sessions.inc + + +CREATE TABLE t(a INT PRIMARY KEY, b INT, c INT, UNIQUE KEY `b_c` (`b`,`c`)) + ENGINE=InnoDB, STATS_PERSISTENT=0; +INSERT INTO t SET a = 1, c = 2; + +--connect con1,localhost,root +BEGIN; + INSERT INTO t SET a=2, c=2; + +--connection default +BEGIN; +SET DEBUG_SYNC="lock_wait_start SIGNAL select_locked"; +--send SELECT * FROM t FORCE INDEX(b) FOR UPDATE + +--connection con1 +SET DEBUG_SYNC="now WAIT_FOR select_locked"; +ROLLBACK; + +--connection default +--echo # If the bug is not fixed, and the both unique index key fields are +--echo # NULL, there will be two (1, NULL, 2) rows in the result, +--echo # because cursor will be restored to (NULL, 2, 1) position for +--echo # secondary key instead of "supremum". +--reap +COMMIT; + +SET DEBUG_SYNC="RESET"; + +--disconnect con1 +DROP TABLE t; +--source include/wait_until_count_sessions.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/deadlock_detect.test mariadb-10.11.9/mysql-test/suite/innodb/t/deadlock_detect.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/deadlock_detect.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/deadlock_detect.test 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,14 @@ PRIMARY KEY(id) ) ENGINE=InnoDB; +CREATE TABLE dl( + id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + cnt INT UNSIGNED +) ENGINE=InnoDB; + INSERT INTO t1 VALUES(1), (2), (3); +# Preserve the initial value of the deadlock counter +INSERT INTO dl(cnt) SELECT variable_value FROM information_schema.global_status WHERE variable_name LIKE 'Innodb_deadlocks'; # We are not interested query results, only errors --disable_result_log @@ -61,6 +68,7 @@ # and does the update. # connection default; +--let $valid_deadlock_cnt= 1 if (!$have_deadlock) { --error 0,ER_LOCK_WAIT_TIMEOUT reap; @@ -68,12 +76,21 @@ if ($have_deadlock) { --error 0,ER_LOCK_DEADLOCK reap; +--disable_query_log +INSERT INTO dl(cnt) SELECT variable_value FROM information_schema.global_status WHERE variable_name LIKE 'Innodb_deadlocks'; +set @init_deadlock_cnt = (SELECT min(k.cnt) FROM dl k); +--let $valid_deadlock_cnt= `SELECT (max(t.cnt-@init_deadlock_cnt) = 1) FROM dl t` +--enable_query_log } +# Indicates that the deadlock counter works well. +# Use the default =1 where is no deadlock detection, +# to enable unconditional check. +--echo 'Deadlock counter is valid'; +--echo $valid_deadlock_cnt ROLLBACK; --enable_result_log - DROP TABLE t1; - +DROP TABLE dl; --source include/wait_until_count_sessions.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/dml_purge.test mariadb-10.11.9/mysql-test/suite/innodb/t/dml_purge.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/dml_purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/dml_purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,8 @@ --source include/innodb_page_size.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + let INNODB_PAGE_SIZE=`select @@innodb_page_size`; let MYSQLD_DATADIR=`select @@datadir`; @@ -76,3 +79,5 @@ UNLOCK TABLES; SELECT * FROM t1; DROP TABLE t1; + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/doublewrite.test mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/doublewrite.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,17 +1,11 @@ + --echo # ---echo # Bug #17335427 INNODB CAN NOT USE THE DOUBLEWRITE BUFFER PROPERLY ---echo # Bug #18144349 INNODB CANNOT USE THE DOUBLEWRITE BUFFER FOR THE FIRST ---echo # PAGE OF SYSTEM TABLESPACE +--echo # MDEV-32242 innodb.doublewrite test case always is skipped --echo # --source include/innodb_page_size.inc ---source include/have_debug.inc --source include/not_embedded.inc -# This test is slow on buildbot. ---source include/big_test.inc -# Slow shutdown and restart to make sure ibuf merge is finished -SET GLOBAL innodb_fast_shutdown = 0; --disable_query_log call mtr.add_suppression("InnoDB: Data file .* uses page size .* but the innodb_page_size start-up parameter is"); call mtr.add_suppression("InnoDB: adjusting FSP_SPACE_FLAGS"); @@ -22,23 +16,16 @@ call mtr.add_suppression("InnoDB: A bad Space ID was found in datafile"); call mtr.add_suppression("InnoDB: Checksum mismatch in datafile: "); call mtr.add_suppression("InnoDB: Inconsistent tablespace ID in .*t1\\.ibd"); +call mtr.add_suppression("\\[Warning\\] Found 1 prepared XA transactions"); +call mtr.add_suppression("InnoDB: Header page consists of zero bytes in datafile:"); --enable_query_log ---source include/restart_mysqld.inc let INNODB_PAGE_SIZE=`select @@innodb_page_size`; let MYSQLD_DATADIR=`select @@datadir`; let ALGO=`select @@innodb_checksum_algorithm`; let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; -show variables like 'innodb_doublewrite'; -show variables like 'innodb_fil_make_page_dirty_debug'; -show variables like 'innodb_saved_page_number_debug'; - -connect (stop_purge,localhost,root,,); -START TRANSACTION WITH CONSISTENT SNAPSHOT; -connection default; - -create table t1 (f1 int primary key, f2 blob) engine=innodb stats_persistent=0; +create table t1 (f1 int primary key, f2 blob) stats_persistent=0, engine=innodb; start transaction; insert into t1 values(1, repeat('#',12)); @@ -48,35 +35,24 @@ insert into t1 values(5, repeat('.',12)); commit work; ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if first page of user ---echo # tablespace is full of zeroes. - -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; - -begin; -insert into t1 values (6, repeat('%', 12)); ---echo # Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; - +# Slow shutdown and restart to make sure ibuf merge is finished +SET GLOBAL innodb_fast_shutdown = 0; +let $shutdown_timeout=; +--source include/restart_mysqld.inc --source ../include/no_checkpoint_start.inc +connect (dml,localhost,root,,); +XA START 'x'; +insert into t1 values (6, repeat('%', @@innodb_page_size/2)); +XA END 'x'; +XA PREPARE 'x'; +disconnect dml; +connection default; ---echo # Make the first page dirty for table t1 -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = @space_id; - ---echo # Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; +flush table t1 for export; ---let CLEANUP_IF_CHECKPOINT=drop table t1; +let $restart_parameters=; +--let CLEANUP_IF_CHECKPOINT=XA COMMIT 'x';drop table t1; --source ../include/no_checkpoint_end.inc -disconnect stop_purge; - ---echo # Make the first page (page_no=0) of the user tablespace ---echo # full of zeroes. ---echo # ---echo # MDEV-11623: Use old FSP_SPACE_FLAGS in the doublewrite buffer. perl; use IO::Handle; @@ -90,16 +66,15 @@ my $page; do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl"; open(FILE, "+<", $fname) or die; +sysseek(FILE, ($page_size/2), 0); +syswrite(FILE, chr(0) x ($page_size/2)); +sysseek(FILE, 3*$page_size, 0); sysread(FILE, $page, $page_size)==$page_size||die "Unable to read $name\n"; -my $page1 = $page; -substr($page1, 34, 4) = pack("N", 0); -my $polynomial0 = 0x82f63b78; # CRC-32C -my $ck0 = mycrc32(substr($page1, 0, ($page_size-4)), 0, $polynomial0); -substr($page1, ($page_size - 4), 4) = pack("N", $ck0); -sysseek(FILE, 0, 0)||die "Unable to seek $fname\n"; -die unless syswrite(FILE, $page1, $page_size) == $page_size; +sysseek(FILE, 3*$page_size, 0)||die "Unable to seek $fname\n"; +syswrite(FILE, chr(0) x ($page_size/2)); close FILE; +# Change the flag offset of page 0 in doublewrite buffer open(FILE, "+<", "$ENV{MYSQLD_DATADIR}ibdata1")||die "cannot open ibdata1\n"; sysseek(FILE, 6 * $page_size - 190, 0)||die "Unable to seek ibdata1\n"; sysread(FILE, $_, 12) == 12||die "Unable to read TRX_SYS\n"; @@ -112,28 +87,23 @@ sysread(FILE, $_, $page_size)==$page_size||die "Cannot read doublewrite\n"; next unless $_ eq $page; sysseek(FILE, $d * $page_size, 0)||die "Unable to seek ibdata1\n"; - # Write buggy MariaDB 10.1.x FSP_SPACE_FLAGS to the doublewrite buffer - my($flags) = unpack "x[54]N", $_; - my $badflags = ($flags & 0x3f); - my $compression_level=6; - $badflags |= 1<<6|$compression_level<<7 if ($flags & 1 << 16); - $badflags |= ($flags & 15 << 6) << 7; # PAGE_SSIZE - + # Write buggy FSP_SPACE_FLAGS to the doublewrite buffer for page + my $badflags = 0x0006FFFF; substr ($_, 54, 4) = pack("N", $badflags); if ($algo =~ /full_crc32/) { - my $ck = mycrc32(substr($_, 0, $page_size - 4), 0, $polynomial); - substr($_, $page_size - 4, 4) = pack("N", $ck); + my $ck = mycrc32(substr($_, 0, $page_size - 4), 0, $polynomial); + substr($_, $page_size - 4, 4) = pack("N", $ck); } else { - # Replace the innodb_checksum_algorithm=crc32 checksum - my $ck= pack("N", - mycrc32(substr($_, 4, 22), 0, $polynomial) ^ - mycrc32(substr($_, 38, $page_size - 38 - 8), 0, - $polynomial)); - substr ($_, 0, 4) = $ck; - substr ($_, $page_size - 8, 4) = $ck; + # Replace the innodb_checksum_algorithm=crc32 checksum + my $ck= pack("N", + mycrc32(substr($_, 4, 22), 0, $polynomial) ^ + mycrc32(substr($_, 38, $page_size - 38 - 8), 0, + $polynomial)); + substr ($_, 0, 4) = $ck; + substr ($_, $page_size - 8, 4) = $ck; } syswrite(FILE, $_, $page_size)==$page_size||die; close(FILE); @@ -143,325 +113,42 @@ EOF --source include/start_mysqld.inc - -check table t1; -select f1, f2 from t1; - ---echo # Test End ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if first page of user ---echo # tablespace is corrupted. - -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; - ---echo # Ensure that dirty pages of table t1 is flushed. -flush tables t1 for export; -unlock tables; - -set global innodb_log_checkpoint_now=1; - -begin; -insert into t1 values (6, repeat('%', 12)); - ---source ../include/no_checkpoint_start.inc - ---echo # Make the first page dirty for table t1 -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = @space_id; - ---echo # Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; - ---source include/no_checkpoint_end.inc - ---echo # Corrupt the first page (page_no=0) of the user tablespace. -perl; -use IO::Handle; -my $fname= "$ENV{'MYSQLD_DATADIR'}test/t1.ibd"; -my $page_size = $ENV{INNODB_PAGE_SIZE}; -open(FILE, "+<", $fname) or die; -sysread(FILE, $page, $page_size)==$page_size||die "Unable to read $name\n"; -substr($page, 28, 4) = pack("N", 1000); -sysseek(FILE, 0, 0)||die "Unable to seek $fname\n"; -die unless syswrite(FILE, $page, $page_size) == $page_size; -close FILE; -EOF - ---source include/start_mysqld.inc - -check table t1; -select f1, f2 from t1; - ---echo # Test End ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if 2nd page of user ---echo # tablespace is full of zeroes. - -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; - ---echo # Ensure that dirty pages of table t1 is flushed. -flush tables t1 for export; -unlock tables; - -begin; -insert into t1 values (6, repeat('%', 400)); - ---source ../include/no_checkpoint_start.inc - ---echo # Make the 2nd page dirty for table t1 -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = @space_id; - ---echo # Ensure that dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; - ---source include/no_checkpoint_end.inc - ---echo # Make the 2nd page (page_no=1) of the tablespace all zeroes. -perl; -use IO::Handle; -my $fname= "$ENV{'MYSQLD_DATADIR'}test/t1.ibd"; -open(FILE, "+<", $fname) or die; -FILE->autoflush(1); -binmode FILE; -seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); -print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}); -close FILE; -EOF - ---source include/start_mysqld.inc - +let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=[1-9][0-9]*, page number=0\] of datafile; +--source include/search_pattern_in_file.inc +let SEARCH_PATTERN=InnoDB: Recovered page \[page id: space=[1-9][0-9]*, page number=3\]; +--source include/search_pattern_in_file.inc +XA ROLLBACK 'x'; check table t1; select f1, f2 from t1; ---echo # Test End ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if 2nd page of user ---echo # tablespace is corrupted. - -select space into @space_id from information_schema.innodb_sys_tables -where name = 'test/t1'; - ---echo # Ensure that dirty pages of table t1 is flushed. -flush tables t1 for export; -unlock tables; - -begin; -insert into t1 values (6, repeat('%', 400)); - --source ../include/no_checkpoint_start.inc +connect (dml,localhost,root,,); +XA START 'x'; +insert into t1 values (6, repeat('%', @@innodb_page_size/2)); +XA END 'x'; +XA PREPARE 'x'; +disconnect dml; +connection default; ---echo # Make the 2nd page dirty for table t1 -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = @space_id; - ---echo # Ensure that the dirty pages of table t1 are flushed. -set global innodb_buf_flush_list_now = 1; - ---source include/no_checkpoint_end.inc - ---echo # Corrupt the 2nd page (page_no=1) of the user tablespace. -perl; -use IO::Handle; -my $fname= "$ENV{'MYSQLD_DATADIR'}test/t1.ibd"; -open(FILE, "+<", $fname) or die; -FILE->autoflush(1); -binmode FILE; -seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); -print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2); -close FILE; -EOF - ---source include/start_mysqld.inc - -check table t1; -select f1, f2 from t1; - ---echo # Test End ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if first page of ---echo # system tablespace is full of zeroes. - -begin; -insert into t1 values (6, repeat('%', 400)); - ---echo # Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; - ---echo # Make the first page dirty for system tablespace -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = 0; - ---echo # Ensure that the dirty page of system tablespace is also flushed. -# We do this after the transaction starts and all dirty pages have been flushed -# already. So flushing of this specified dirty page will surely keep the -# copy in doublewrite buffer, and no more writes to doublewrite buffer would -# overwrite the copy. Thus, we can safely modify the original page when server -# is down. So do the following testings. -set global innodb_buf_flush_list_now = 1; - ---source include/kill_mysqld.inc - ---echo # Make the first page (page_no=0) of the system tablespace ---echo # all zeroes. -perl; -use IO::Handle; -my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; -open(FILE, "+<", $fname) or die; -FILE->autoflush(1); -binmode FILE; -print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}); -close FILE; -EOF - ---source include/start_mysqld.inc - -check table t1; -select f1, f2 from t1; - ---echo # Test End ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if first page of ---echo # system tablespace is corrupted. - -begin; -insert into t1 values (6, repeat('%', 400)); - ---echo # Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; - ---echo # Make the first page dirty for system tablespace -set global innodb_saved_page_number_debug = 0; -set global innodb_fil_make_page_dirty_debug = 0; - ---echo # Ensure that the dirty page of system tablespace is also flushed. -set global innodb_buf_flush_list_now = 1; - ---source include/kill_mysqld.inc - ---echo # Corrupt the first page (page_no=0) of the system tablespace. -perl; -use IO::Handle; -my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; -open(FILE, "+<", $fname) or die; -FILE->autoflush(1); -binmode FILE; -print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2); -close FILE; -EOF - ---source include/start_mysqld.inc - -check table t1; -select f1, f2 from t1; - ---echo # Test End ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if 2nd page of ---echo # system tablespace is full of zeroes. - -begin; -insert into t1 values (6, repeat('%', 400)); - ---echo # Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; - ---echo # Make the second page dirty for system tablespace -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = 0; - ---echo # Ensure that the dirty page of system tablespace is also flushed. -set global innodb_buf_flush_list_now = 1; - ---source include/kill_mysqld.inc - ---echo # Make the 2nd page (page_no=1) of the system tablespace ---echo # all zeroes. -perl; -use IO::Handle; -my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; -open(FILE, "+<", $fname) or die; -FILE->autoflush(1); -binmode FILE; -seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); -print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}); -close FILE; -EOF - ---source include/start_mysqld.inc - -check table t1; -select f1, f2 from t1; - ---echo # Test End ---echo # --------------------------------------------------------------- ---echo # Test Begin: Test if recovery works if 2nd page of ---echo # system tablespace is corrupted. - -begin; -insert into t1 values (6, repeat('%', 400)); - ---echo # Ensure that all dirty pages in the system are flushed. -set global innodb_buf_flush_list_now = 1; - ---echo # Make the second page dirty for system tablespace -set global innodb_saved_page_number_debug = 1; -set global innodb_fil_make_page_dirty_debug = 0; - ---echo # Ensure that the dirty page of system tablespace is also flushed. -set global innodb_buf_flush_list_now = 1; +flush table t1 for export; ---source include/kill_mysqld.inc +let $restart_parameters=; +--source ../include/no_checkpoint_end.inc ---echo # Make the 2nd page (page_no=1) of the system tablespace ---echo # all zeroes. +# Zero out the first page in file and try to recover from dblwr perl; use IO::Handle; -my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; -open(FILE, "+<", $fname) or die; -FILE->autoflush(1); -binmode FILE; -seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); -print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2); +open(FILE, "+<", "$ENV{'MYSQLD_DATADIR'}test/t1.ibd") or die; +syswrite(FILE, chr(0) x $ENV{INNODB_PAGE_SIZE}); close FILE; EOF --source include/start_mysqld.inc - -check table t1; ---let SEARCH_PATTERN= InnoDB: .*test.t1\\.ibd +let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=[1-9][0-9]*, page number=0\] of datafile; --source include/search_pattern_in_file.inc - +XA ROLLBACK 'x'; +check table t1; select f1, f2 from t1; - drop table t1; ---echo # ---echo # MDEV-12600 crash during install_db with innodb_page_size=32K ---echo # and ibdata1=3M ---echo # -let bugdir= $MYSQLTEST_VARDIR/tmp/doublewrite; ---mkdir $bugdir - -let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES -WHERE engine = 'innodb' -AND support IN ('YES', 'DEFAULT', 'ENABLED'); - ---let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir ---let $ibd=$ibp --innodb-undo-tablespaces=0 ---let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend - ---let $restart_parameters= $ibp ---source include/restart_mysqld.inc -eval $check_no_innodb; ---let SEARCH_PATTERN= \[ERROR\] InnoDB: Cannot create doublewrite buffer ---source include/search_pattern_in_file.inc ---let $restart_parameters= ---source include/restart_mysqld.inc - ---remove_file $bugdir/ibdata1 ---remove_file $bugdir/ibdata2 ---remove_file $bugdir/ib_logfile0 ---rmdir $bugdir +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/doublewrite_debug.combinations mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite_debug.combinations --- mariadb-10.11.6/mysql-test/suite/innodb/t/doublewrite_debug.combinations 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite_debug.combinations 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,7 @@ +[strict_crc32] +--innodb-checksum-algorithm=strict_crc32 +--innodb-use-atomic-writes=0 + +[strict_full_crc32] +--innodb-checksum-algorithm=strict_full_crc32 +--innodb-use-atomic-writes=0 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/doublewrite_debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite_debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/doublewrite_debug.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/doublewrite_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,170 @@ +--echo # +--echo # Bug #17335427 INNODB CAN NOT USE THE DOUBLEWRITE BUFFER PROPERLY +--echo # Bug #18144349 INNODB CANNOT USE THE DOUBLEWRITE BUFFER FOR THE FIRST +--echo # PAGE OF SYSTEM TABLESPACE +--echo # + +--source include/innodb_page_size.inc +--source include/have_debug.inc +--source include/not_embedded.inc +--disable_query_log +call mtr.add_suppression("InnoDB: Data file .* uses page size .* but the innodb_page_size start-up parameter is"); +call mtr.add_suppression("InnoDB: adjusting FSP_SPACE_FLAGS"); +call mtr.add_suppression("InnoDB: New log files created"); +call mtr.add_suppression("InnoDB: Cannot create doublewrite buffer: the first file in innodb_data_file_path must be at least (3|6|12)M\\."); +call mtr.add_suppression("InnoDB: Database creation was aborted"); +call mtr.add_suppression("Plugin 'InnoDB' (init function returned error|registration as a STORAGE ENGINE failed)"); +call mtr.add_suppression("InnoDB: A bad Space ID was found in datafile"); +call mtr.add_suppression("InnoDB: Checksum mismatch in datafile: "); +call mtr.add_suppression("InnoDB: Inconsistent tablespace ID in .*t1\\.ibd"); +call mtr.add_suppression("InnoDB: Header page consists of zero bytes in datafile:"); +--enable_query_log + +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; +let MYSQLD_DATADIR=`select @@datadir`; +let ALGO=`select @@innodb_checksum_algorithm`; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; + +show variables like 'innodb_doublewrite'; +show variables like 'innodb_fil_make_page_dirty_debug'; +show variables like 'innodb_saved_page_number_debug'; + +create table t1 (f1 int primary key, f2 blob) engine=innodb stats_persistent=0; + +start transaction; +insert into t1 values(1, repeat('#',12)); +insert into t1 values(2, repeat('+',12)); +insert into t1 values(3, repeat('/',12)); +insert into t1 values(4, repeat('-',12)); +insert into t1 values(5, repeat('.',12)); +commit work; + +--echo # Test Begin: Test if recovery works if 1st page and 2nd page +--echo # of system tablespace is full of zeroes. + +# Slow shutdown and restart to make sure ibuf merge is finished +SET GLOBAL innodb_fast_shutdown = 0; +let $shutdown_timeout=; +let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0; +--source include/restart_mysqld.inc +--source ../include/no_checkpoint_start.inc +begin; +insert into t1 values (6, repeat('%', 400)); + +--echo # Make the first page dirty for system tablespace +set global innodb_saved_page_number_debug = 0; +set global innodb_fil_make_page_dirty_debug = 0; + +--echo # Make the second page dirty for system tablespace +set global innodb_saved_page_number_debug = 1; +set global innodb_fil_make_page_dirty_debug = 0; + +set global innodb_buf_flush_list_now = 1; + +--let CLEANUP_IF_CHECKPOINT=drop table t1, unexpected_checkpoint; +--source ../include/no_checkpoint_end.inc + +--echo # Make the 1st page (page_no=0) and 2nd page (page_no=1) +--echo # of the system tablespace all zeroes. +perl; +use IO::Handle; +my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; +open(FILE, "+<", $fname) or die; +FILE->autoflush(1); +binmode FILE; +print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}); +seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); +print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}); +close FILE; +EOF + +let $restart_parameters=; +--source include/start_mysqld.inc + +let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile; +--source include/search_pattern_in_file.inc + +let SEARCH_PATTERN=InnoDB: Recovered page \[page id: space=0, page number=1\]; +--source include/search_pattern_in_file.inc + +check table t1; +select f1, f2 from t1; + +--echo # Test End +--echo # --------------------------------------------------------------- +--echo # Test Begin: Test if recovery works if 1st page of +--echo # system tablespace is corrupted and 2nd page as corrupted. + +let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0; +--source include/restart_mysqld.inc +--source ../include/no_checkpoint_start.inc +begin; +insert into t1 values (6, repeat('%', 400)); + +--echo # Make the first page dirty for system tablespace +set global innodb_saved_page_number_debug = 0; +set global innodb_fil_make_page_dirty_debug = 0; + +--echo # Make the second page dirty for system tablespace +set global innodb_saved_page_number_debug = 1; +set global innodb_fil_make_page_dirty_debug = 0; + +set global innodb_buf_flush_list_now = 1; + +--source ../include/no_checkpoint_end.inc + +--echo # Corrupt the 1st page (page_no=0) and 2nd page of the system tablespace. +perl; +use IO::Handle; +my $fname= "$ENV{'MYSQLD_DATADIR'}ibdata1"; +open(FILE, "+<", $fname) or die; +FILE->autoflush(1); +binmode FILE; +print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2); +seek(FILE, $ENV{'INNODB_PAGE_SIZE'}, SEEK_SET); +print FILE chr(0) x ($ENV{'INNODB_PAGE_SIZE'}/2); +close FILE; +EOF + +let $restart_parameters=; +--source include/start_mysqld.inc + +let SEARCH_PATTERN=InnoDB: Restoring page \[page id: space=0, page number=0\] of datafile; +--source include/search_pattern_in_file.inc + +let SEARCH_PATTERN=InnoDB: Recovered page \[page id: space=0, page number=1\]; +--source include/search_pattern_in_file.inc + +check table t1; +select f1, f2 from t1; +drop table t1; +let $shutdown_timeout=; +--echo # Test End +--echo # --------------------------------------------------------------- +--echo # +--echo # MDEV-12600 crash during install_db with innodb_page_size=32K +--echo # and ibdata1=3M +--echo # +let bugdir= $MYSQLTEST_VARDIR/tmp/doublewrite; +--mkdir $bugdir + +let $check_no_innodb=SELECT * FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); + +--let $ibp=--innodb-log-group-home-dir=$bugdir --innodb-data-home-dir=$bugdir +--let $ibp=$ibp --innodb-undo-tablespaces=0 +--let $ibp=$ibp --innodb-data-file-path=ibdata1:1M;ibdata2:1M:autoextend + +--let $restart_parameters= $ibp +--source include/restart_mysqld.inc +eval $check_no_innodb; +--let SEARCH_PATTERN= \[ERROR\] InnoDB: Cannot create doublewrite buffer +--source include/search_pattern_in_file.inc +--let $restart_parameters= +--source include/restart_mysqld.inc + +--remove_file $bugdir/ibdata1 +--remove_file $bugdir/ibdata2 +--remove_file $bugdir/ib_logfile0 +--rmdir $bugdir diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/fk_col_alter.test mariadb-10.11.9/mysql-test/suite/innodb/t/fk_col_alter.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/fk_col_alter.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/fk_col_alter.test 2024-08-03 07:29:58.000000000 +0000 @@ -149,4 +149,18 @@ ALTER TABLE t2 MODIFY f2 VARCHAR(1023); SET SESSION FOREIGN_KEY_CHECKS = ON; DROP TABLE t2, t1; + +--echo # +--echo # MDEV-32638 MariaDB crashes with foreign_key_checks=0 +--echo # when changing a column and adding a foreign +--echo # key at the same time +--echo # +CREATE TABLE t1(f1 VARCHAR(2) NOT NULL, PRIMARY KEY(f1))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT NOT NULL PRIMARY KEY, + f2 VARCHAR(10) NOT NULL DEFAULT '')ENGINE=InnoDB; +SET SESSION FOREIGN_KEY_CHECKS = OFF; +ALTER TABLE t2 CHANGE COLUMN f2 f3 VARCHAR(20) NOT NULL, + ADD CONSTRAINT t2_fk FOREIGN KEY(f3) REFERENCES t1(f1); +DROP TABLE t2, t1; +SET SESSION FOREIGN_KEY_CHECKS = ON; --echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/fk_drop_alter.test mariadb-10.11.9/mysql-test/suite/innodb/t/fk_drop_alter.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/fk_drop_alter.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/fk_drop_alter.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,35 @@ +--source include/have_innodb.inc +--echo # +--echo # MDEV-22230 : Unexpected ER_ERROR_ON_RENAME upon DROP +--echo # non-existing FOREIGN KEY +--echo # +CREATE TABLE t1 (a INT) ENGINE=InnoDB; +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP FOREIGN KEY x, ALGORITHM=COPY; +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t1 DROP FOREIGN KEY x, ALGORITHM=INPLACE; +# Cleanup +DROP TABLE t1; + +CREATE TABLE t1 (a INT, KEY(a)) ENGINE=InnoDB; +CREATE TABLE t2 (a INT, FOREIGN KEY fk_id (a) REFERENCES t1(a))ENGINE=InnoDB; +CREATE TABLE t3 (a INT, FOREIGN KEY fk_1 (a) REFERENCES t1(a))ENGINE=InnoDB; +ALTER TABLE t3 DROP FOREIGN KEY IF EXISTS fk_id; +DROP TABLE t3, t2; +ALTER TABLE t1 MODIFY COLUMN a VARCHAR(2), DROP FOREIGN KEY IF EXISTS x; +DROP TABLE t1; + +CREATE DATABASE best; +CREATE TABLE best.t1(f1 INT, KEY(f1))ENGINE=InnoDB; +CREATE TABLE best.t2(f1 INT, FOREIGN KEY foo(f1) REFERENCES t1(f1))ENGINE=InnoDB; + +CREATE TABLE t1(f1 INT, KEY(f1))ENGINE=InnoDB; +CREATE TABLE t2(f1 INT, FOREIGN KEY foo(f1) REFERENCES t1(f1))ENGINE=InnoDB; +ALTER TABLE t2 DROP FOREIGN KEY foo; +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t2 DROP FOREIGN KEY foo; +ALTER TABLE t2 DROP FOREIGN KEY IF EXISTS foo; +SHOW CREATE TABLE best.t2; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN; +DROP TABLE best.t2, best.t1, t2, t1; +DROP DATABASE best; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/foreign-keys.test mariadb-10.11.9/mysql-test/suite/innodb/t/foreign-keys.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/foreign-keys.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/foreign-keys.test 2024-08-03 07:29:58.000000000 +0000 @@ -268,3 +268,7 @@ INSERT INTO t2 VALUES('G', 3); DROP TABLE t2, t1; SET FOREIGN_KEY_CHECKS=DEFAULT; + +--error ER_CANT_CREATE_TABLE +CREATE TABLE t1(a SERIAL) ENGINE=InnoDB ROW_FORMAT=COMPRESSED PAGE_COMPRESSED=1; +SHOW WARNINGS; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/foreign_key.test mariadb-10.11.9/mysql-test/suite/innodb/t/foreign_key.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/foreign_key.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/foreign_key.test 2024-08-03 07:29:58.000000000 +0000 @@ -2,6 +2,8 @@ --source include/count_sessions.inc --source include/default_charset.inc +SET GLOBAL innodb_stats_persistent = 0; + --echo # --echo # Bug #19027905 ASSERT RET.SECOND DICT_CREATE_FOREIGN_CONSTRAINTS_LOW --echo # DICT_CREATE_FOREIGN_CONSTR @@ -126,6 +128,9 @@ --let $shutdown_timeout= disconnect incomplete; +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + INSERT INTO child SET a=0; --error ER_NO_REFERENCED_ROW_2 INSERT INTO child SET a=1; @@ -728,7 +733,9 @@ # the "goto rollback_to_savept" in row_mysql_handle_errors() is reverted. SELECT * FROM t1; # Allow purge to continue by closing the read view. -disconnect con1; +connection con1; +COMMIT; +connection default; # Wait for purge. With the fix reverted, the server would crash here. --source include/wait_all_purged.inc @@ -949,9 +956,37 @@ DROP TABLE t1,t2; --echo # ---echo # End of 10.4 tests +--echo # MDEV-31441 BLOB corruption on UPDATE of PRIMARY KEY with FOREIGN KEY --echo # +CREATE TABLE t1 (pk INT PRIMARY KEY, t TEXT) ENGINE=InnoDB; +CREATE TABLE t2 (pk INT PRIMARY KEY, FOREIGN KEY (pk) REFERENCES t1(pk)) +ENGINE=InnoDB; + +SET @blob = REPEAT('A', @@innodb_page_size / 2); +INSERT INTO t1 SET pk=1, t=@blob; +INSERT INTO t2 SET pk=1; +--connection con1 +BEGIN; +DELETE FROM t2; +--connection default +# The following will be blocked by a FOREIGN KEY check on pk=1 in t2. +--send +UPDATE t1 SET pk=12; +--connection con1 +let $wait_condition= +SELECT count(*) > 0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE state='Updating'; +--source include/wait_condition.inc +COMMIT; +--disconnect con1 +--connection default +--reap +UPDATE t1 SET pk=1; +SELECT pk,t=@blob FROM t1; +DROP TABLE t2, t1; + +--echo # End of 10.4 tests + --echo # --echo # MDEV-20729 Fix REFERENCES constraint in column definition --echo # @@ -1042,10 +1077,23 @@ --error ER_NO_REFERENCED_ROW_2 INSERT INTO child SET a=1; connection default; +--error ER_TRUNCATE_ILLEGAL_FK +TRUNCATE TABLE parent; +--error ER_ROW_IS_REFERENCED_2 +DROP TABLE parent; +SET innodb_lock_wait_timeout=0; +--error ER_LOCK_WAIT_TIMEOUT +RENAME TABLE parent TO transparent; +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE parent FORCE, ALGORITHM=COPY; +--error ER_LOCK_WAIT_TIMEOUT +ALTER TABLE parent FORCE, ALGORITHM=INPLACE; SET innodb_lock_wait_timeout=0, foreign_key_checks=0; --error ER_LOCK_WAIT_TIMEOUT TRUNCATE TABLE parent; --error ER_LOCK_WAIT_TIMEOUT +DROP TABLE parent; +--error ER_LOCK_WAIT_TIMEOUT ALTER TABLE parent FORCE, ALGORITHM=COPY; --error ER_LOCK_WAIT_TIMEOUT ALTER TABLE parent FORCE, ALGORITHM=INPLACE; @@ -1060,7 +1108,13 @@ ALTER TABLE parent FORCE, ALGORITHM=COPY; ALTER TABLE parent FORCE, ALGORITHM=INPLACE; ALTER TABLE parent ADD COLUMN b INT, ALGORITHM=INSTANT; -DROP TABLE child, parent; +SET foreign_key_checks=ON; +--error ER_TRUNCATE_ILLEGAL_FK +TRUNCATE TABLE parent; +ALTER TABLE parent FORCE, ALGORITHM=COPY; +ALTER TABLE parent FORCE, ALGORITHM=INPLACE; +RENAME TABLE parent TO transparent; +DROP TABLE child, transparent; --echo # --echo # MDEV-26217 Failing assertion: list.count > 0 in ut_list_remove @@ -1132,4 +1186,30 @@ --echo # End of 10.6 tests +CREATE TABLE t1 +( +f1 VARCHAR(32)BINARY NOT NULL, +f2 VARCHAR(32)BINARY NOT NULL, +PRIMARY KEY (f1), +INDEX(f2) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES('MySQL', 'InnoDB'), ('MariaDB', 'NDB'); + +CREATE TABLE t2 +( +f1 VARCHAR(32)BINARY NOT NULL, +f2 VARCHAR(255)BINARY NOT NULL, +f3 int, PRIMARY KEY (f1), INDEX(f1), INDEX(f2) +) ENGINE=InnoDB; +INSERT INTO t2 VALUES('MySQL', 'MySQL', 1), + ('MariaDB', 'MariaDB', 1); +ALTER TABLE t1 ADD FOREIGN KEY (f1) REFERENCES t2 (f2); +# MDEV-33927 TODO: change the warning message +--error ER_FK_CANNOT_DELETE_PARENT +ALTER TABLE t2 ADD FOREIGN KEY (f2) REFERENCES t2 (f2), +ADD UNIQUE INDEX(f3); +drop table t1, t2; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + +--echo # End of 10.11 tests --source include/wait_until_count_sessions.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/full_crc32_import.test mariadb-10.11.9/mysql-test/suite/innodb/t/full_crc32_import.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/full_crc32_import.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/full_crc32_import.test 2024-08-03 07:29:58.000000000 +0000 @@ -2,6 +2,9 @@ # This test is slow on buildbot. --source include/big_test.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + FLUSH TABLES; let $MYSQLD_TMPDIR = `SELECT @@tmpdir`; @@ -60,6 +63,12 @@ ALTER TABLE t1 IMPORT TABLESPACE; --enable_warnings SHOW CREATE TABLE t1; + +--echo # Auto increment value must be more than maximum column value +SELECT MAX(a) FROM t1; +SELECT auto_increment FROM information_schema.tables +WHERE table_name like 't1'; + UPDATE t1 set b = repeat("de", 100) where b = repeat("cd", 200); --replace_column 9 # explain SELECT a FROM t1 where b = repeat("de", 100); @@ -142,6 +151,12 @@ ALTER TABLE t1 IMPORT TABLESPACE; --disable_warnings SHOW CREATE TABLE t1; + +--echo # Auto increment value must be more than maximum column value +SELECT MAX(c1) FROM t1; +SELECT auto_increment FROM information_schema.tables +WHERE table_name like 't1'; + UPDATE t1 SET C2 = ST_GeomFromText('POINT(0 0)'); SELECT COUNT(*) FROM t1; DELETE FROM t1; @@ -222,3 +237,4 @@ DROP TABLE t1; SET GLOBAL innodb_compression_algorithm=@save_algo; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/group_commit_crash.test mariadb-10.11.9/mysql-test/suite/innodb/t/group_commit_crash.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/group_commit_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/group_commit_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -51,7 +51,7 @@ START TRANSACTION; insert into t1 select * from t2; # Write file to make mysql-test-run.pl expect crash - --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + --write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect eval call setcrash($numtests); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/group_commit_crash_no_optimize_thread.test mariadb-10.11.9/mysql-test/suite/innodb/t/group_commit_crash_no_optimize_thread.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/group_commit_crash_no_optimize_thread.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/group_commit_crash_no_optimize_thread.test 2024-08-03 07:29:58.000000000 +0000 @@ -51,7 +51,7 @@ START TRANSACTION; insert into t1 select * from t2; # Write file to make mysql-test-run.pl expect crash - --exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect + --write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect eval call setcrash($numtests); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/ibuf_not_empty.test mariadb-10.11.9/mysql-test/suite/innodb/t/ibuf_not_empty.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/ibuf_not_empty.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/ibuf_not_empty.test 2024-08-03 07:29:58.000000000 +0000 @@ -74,6 +74,7 @@ --replace_regex /contains \d+ entries/contains 990 entries/ check table t1; +SET GLOBAL innodb_buf_flush_list_now=ON; --source include/shutdown_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/import_bugs.test mariadb-10.11.9/mysql-test/suite/innodb/t/import_bugs.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/import_bugs.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/import_bugs.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/have_sequence.inc call mtr.add_suppression("Index for table 'imp_t1' is corrupt; try to repair it"); @@ -23,6 +24,87 @@ SET GLOBAL innodb_checksum_algorithm=@save_innodb_checksum_algorithm; --echo # +--echo # MDEV-33400 Adaptive hash index corruption after DISCARD TABLESPACE +--echo # + +SET @save_adaptive=@@GLOBAL.innodb_adaptive_hash_index; +SET GLOBAL innodb_adaptive_hash_index=ON; + +CREATE TABLE t (a INT PRIMARY KEY) ENGINE=INNODB; +INSERT INTO t SELECT * FROM seq_1_to_131; +ALTER TABLE t ADD hid INT DEFAULT 2; +INSERT INTO t VALUES (251,1); +ALTER TABLE t DISCARD TABLESPACE; +CHECK TABLE mysql.innodb_table_stats; +DROP TABLE t; +SET GLOBAL innodb_adaptive_hash_index=@save_adaptive; + +--echo # End of 10.4 tests + +--echo # +--echo # MDEV-18288: Transportable Tablespaces leave AUTO_INCREMENT in mismatched +--echo # state, causing INSERT errors in newly imported tables when .cfg is not used. +--echo # + +CREATE TABLE t1( + id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + PRIMARY KEY (id) +) ENGINE=INNODB; + +CREATE TABLE t2 LIKE t1; + +ALTER TABLE t2 DISCARD TABLESPACE; + +INSERT INTO t1() VALUES(); +INSERT INTO t1() VALUES(); + +FLUSH TABLES test.t1 FOR EXPORT; + +--echo # Copy data file +--copy_file $datadir/test/t1.ibd $datadir/test/t2.ibd + +--echo # Skip CFG file copy +#--copy_file $datadir/test/t1.cfg $datadir/test/t2.cfg +--remove_file $datadir/test/t1.cfg + +UNLOCK TABLES; +DROP TABLE t1; + +--replace_regex /opening '.*\/test\//opening '.\/test\// +ALTER TABLE t2 IMPORT TABLESPACE; + +SELECT * FROM t2 ORDER BY id; + +INSERT INTO t2() VALUES(); +INSERT INTO t2() VALUES(); +INSERT INTO t2() VALUES(); + +SELECT * FROM t2 ORDER BY id; +DROP TABLE t2; + +--echo # +--echo # MDEV-34181 Instant table aborts after discard tablespace +--echo # +CREATE TABLE t1(c3 INT, c2 INT, c1 INT KEY)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 1, 1), (2, 2, 2); +CREATE TABLE t2 (c1 INT KEY) ENGINE=InnoDB; +INSERT INTO t2 VALUES(1); +ALTER TABLE t2 ADD c2 INT; +FLUSH TABLES t1 FOR EXPORT; +let $datadir=`select @@datadir`; +--copy_file $datadir/test/t1.ibd $datadir/test/imp_t1.ibd +UNLOCK TABLES; +ALTER TABLE t2 DISCARD TABLESPACE; +ALTER TABLE t2 ADD c3 INT FIRST; +--copy_file $datadir/test/imp_t1.ibd $datadir/test/t2.ibd + +--replace_regex /opening '.*\/test\//opening '.\/test\// +ALTER TABLE t2 IMPORT TABLESPACE; +SHOW CREATE TABLE t2; +DROP TABLE t2, t1; +--echo # End of 10.5 tests + +--echo # --echo # MDEV-27006 Assertion `!lock_trx_has_sys_table_locks(trx)' --echo # failed in dberr_t row_discard_tablespace_for_mysql --echo # (dict_table_t*, trx_t*) diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/import_hidden_fts.test mariadb-10.11.9/mysql-test/suite/innodb/t/import_hidden_fts.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/import_hidden_fts.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/import_hidden_fts.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,46 @@ +--source include/have_innodb.inc +--source include/have_sequence.inc +# Table with virtual, fulltext, instant add, instant drop column +# and purgeable rows +call mtr.add_suppression("InnoDB: Added system generated FTS_DOC_ID and FTS_DOC_ID_INDEX while importing the tablespace"); +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, + f2 CHAR(2) not null, fulltext f_idx(f2), + f3 INT as (f1) VIRTUAL, INDEX(f3), + f4 INT as (f1) STORED, INDEX(f4), + f5 INT as (f1) VIRTUAL)ENGINE=InnoDB; +INSERT INTO t1(f1, f2) VALUES(1, "on"); +INSERT INTO t1(f1, f2) SELECT seq, "si" FROM seq_2_to_256; +ALTER TABLE t1 ADD COLUMN f6 INT NOT NULL; +ALTER TABLE t1 DROP COLUMN f6; +ALTER TABLE t1 DROP INDEX f_idx; +connect(con1,localhost,root,,); +START TRANSACTION WITH CONSISTENT SNAPSHOT; + +connection default; +DELETE FROM t1 WHERE f1 > 1; +FLUSH TABLE t1 FOR EXPORT; +let MYSQLD_DATADIR =`SELECT @@datadir`; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_backup_tablespaces("test", "t1"); +EOF +UNLOCK TABLES; +DROP TABLE t1; + +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, + f2 CHAR(2) not null, + f3 INT as (f1) VIRTUAL, INDEX(f3), + f4 INT as (f1) STORED, INDEX(f4), + f5 INT as (f1) VIRTUAL)ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_discard_tablespaces("test", "t1"); +ib_restore_tablespaces("test", "t1"); +EOF + +--disable_warnings +ALTER TABLE t1 IMPORT TABLESPACE; +--enable_warnings +SHOW CREATE TABLE t1; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/import_hidden_fts_debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/import_hidden_fts_debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/import_hidden_fts_debug.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/import_hidden_fts_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,101 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, + f2 CHAR(2) NOT NULL, FULLTEXT f_idx(f2), + f3 INT as (f1) VIRTUAL, INDEX(f3))ENGINE=InnoDB; +INSERT INTO t1(f1, f2) VALUES(1, "on"); +ALTER TABLE t1 DROP INDEX f_idx; +FLUSH TABLE t1 FOR EXPORT; +let MYSQLD_DATADIR =`SELECT @@datadir`; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_backup_tablespaces("test", "t1"); +EOF +UNLOCK TABLES; +DROP TABLE t1; + +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, + f2 CHAR(2) NOT NULL, + f3 CHAR(2) NOT NULL, + f4 INT AS (f1) VIRTUAL, INDEX(f4))ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_discard_tablespaces("test", "t1"); +ib_restore_tablespaces("test", "t1"); +EOF +--error ER_TABLE_SCHEMA_MISMATCH +ALTER TABLE t1 IMPORT TABLESPACE; +DROP TABLE t1; + +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, + f2 CHAR(2) NOT NULL, + f3 INT as (f1) VIRTUAL, INDEX(f3))ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_discard_tablespaces("test", "t1"); +ib_restore_tablespaces("test", "t1"); +EOF + +--disable_warnings +SET DEBUG_DBUG="+d,ib_import_set_index_root_failure"; +--error ER_TOO_MANY_CONCURRENT_TRXS +ALTER TABLE t1 IMPORT TABLESPACE; +SET DEBUG_DBUG="-d,ib_import_set_index_root_failure"; + +SET DEBUG_DBUG="+d,ib_import_vcol_update_fail"; +--error ER_DUP_KEY +ALTER TABLE t1 IMPORT TABLESPACE; +SET DEBUG_DBUG="-d,ib_import_vcol_update_fail"; + +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_discard_tablespaces("test", "t1"); +ib_restore_tablespaces("test", "t1"); +EOF + +SET DEBUG_DBUG="+d,ib_import_fts_error"; +--error ER_DUP_KEY +ALTER TABLE t1 IMPORT TABLESPACE; +SET DEBUG_DBUG="-d,ib_import_fts_error"; +--enable_warnings + +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_unlink_tablespace("test", "t1"); +EOF + +SELECT NAME FROM INFORMATION_SCHEMA.INNODB_SYS_COLUMNS +WHERE table_id IN (SELECT table_id FROM information_schema.innodb_sys_tables where name="test/t1"); + +SHOW CREATE TABLE t1; +DROP TABLE t1; + +# Manually add the FTS_DOC_ID Column with mismatched data type +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, + FTS_DOC_ID BIGINT SIGNED NOT NULL, + f2 CHAR(2) NOT NULL, + FULLTEXT f_idx(f2))ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 1, "on"); +ALTER TABLE t1 DROP INDEX f_idx; +FLUSH TABLE t1 FOR EXPORT; +let MYSQLD_DATADIR =`SELECT @@datadir`; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_backup_tablespaces("test", "t1"); +EOF +UNLOCK TABLES; +DROP TABLE t1; + +CREATE TABLE t1(f1 INT NOT NULL PRIMARY KEY, + f2 CHAR(2) NOT NULL)ENGINE=InnoDB; +ALTER TABLE t1 DISCARD TABLESPACE; +perl; +do "$ENV{MTR_SUITE_DIR}/include/innodb-util.pl"; +ib_discard_tablespaces("test", "t1"); +ib_restore_tablespaces("test", "t1"); +EOF +--error ER_TABLE_SCHEMA_MISMATCH +ALTER TABLE t1 IMPORT TABLESPACE; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/import_update_stats.test mariadb-10.11.9/mysql-test/suite/innodb/t/import_update_stats.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/import_update_stats.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/import_update_stats.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,80 @@ +# +# BUG#20125349 - PERSISTANT STATS IS NOT UPDATED WHEN TTS IS IMPORTED. +# + +--source include/not_embedded.inc +--source include/have_innodb.inc + +let MYSQLD_DATADIR =`SELECT @@datadir`; +SET @old_innodb_file_per_table = @@innodb_file_per_table; + +SET GLOBAL innodb_file_per_table = 1; +SELECT @@innodb_file_per_table; + +CREATE TABLE t1 ( + col_1 CHAR (255), + col_2 VARCHAR (255) +) ENGINE = InnoDB; + +CREATE INDEX idx1 ON t1(col_1); +CREATE INDEX idx2 ON t1(col_2); + +SHOW INDEXES FROM t1; + +INSERT INTO t1 VALUES ("col1_00001", "col2_00001"), ("col1_00002", "col2_00002"); + +SHOW INDEXES FROM t1; + +ANALYZE TABLE t1; +SHOW INDEXES FROM t1; + +FLUSH TABLES t1 FOR EXPORT; +perl; +do "$ENV{MTR_SUITE_DIR}/../innodb/include/innodb-util.pl"; +ib_backup_tablespaces("test", "t1"); +EOF + +UNLOCK TABLES; + +DROP TABLE t1; + +CREATE TABLE t1 ( + col_1 CHAR (255), + col_2 VARCHAR (255) +) ENGINE = InnoDB STATS_PERSISTENT=1; + +CREATE INDEX idx1 ON t1(col_1); +CREATE INDEX idx2 ON t1(col_2); + +SHOW INDEXES FROM t1; + +INSERT INTO t1 VALUES ("col1_00001", "col2_00001"); + +SHOW INDEXES FROM t1; + +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE t1; +SHOW INDEXES FROM t1; + +ALTER TABLE t1 DISCARD TABLESPACE; + +perl; +do "$ENV{MTR_SUITE_DIR}/../innodb/include/innodb-util.pl"; +ib_discard_tablespaces("test", "t1"); +ib_restore_tablespaces("test", "t1"); +EOF + +ALTER TABLE t1 IMPORT TABLESPACE; + +SHOW INDEXES FROM t1; + +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE t1; +SHOW INDEXES FROM t1; + +DROP TABLE t1; + +SET GLOBAL innodb_file_per_table = @old_innodb_file_per_table; + +--remove_files_wildcard $MYSQLTEST_VARDIR/tmp t1*.ibd +--remove_files_wildcard $MYSQLTEST_VARDIR/tmp t1*.cfg diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/index_length.test mariadb-10.11.9/mysql-test/suite/innodb/t/index_length.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/index_length.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/index_length.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,31 @@ +--source include/have_innodb.inc + +--connect (stop_purge,localhost,root) +# Prevent the purge of history from acquiring a table handle. +START TRANSACTION WITH CONSISTENT SNAPSHOT; +--connection default + +CREATE TABLE t1(a INT PRIMARY KEY, b VARCHAR(1024)) +ENGINE=InnoDB STATS_PERSISTENT=1; +INSERT INTO t1 VALUES (1,REPEAT('b',1024)); + +SELECT index_length FROM information_schema.tables +WHERE table_schema = 'test' AND table_name = 't1'; +ALTER TABLE t1 ADD INDEX b (b(800)); +SELECT FLOOR(index_length/@@innodb_page_size) FROM information_schema.tables +WHERE table_schema = 'test' AND table_name = 't1'; +ALTER TABLE t1 ADD INDEX ba (b(800),a); +SELECT FLOOR(index_length/@@innodb_page_size) FROM information_schema.tables +WHERE table_schema = 'test' AND table_name = 't1'; +disconnect stop_purge; +DROP TABLE t1; + +--echo # +--echo # MDEV-22855 Assertion (!field->prefix_len || +--echo # field->fixed_len == field->prefix_len) +--echo # failed in btr_node_ptr_max_size +--echo # +CREATE TABLE t1(c CHAR(194) CHARACTER SET UTF32, KEY k1(c(193)))ENGINE=InnoDB; +INSERT INTO t1 SET c=''; +DROP TABLE t1; +--echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/index_merge_threshold.test mariadb-10.11.9/mysql-test/suite/innodb/t/index_merge_threshold.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/index_merge_threshold.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/index_merge_threshold.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,9 +10,13 @@ # # Check actual behavior for table, partitioned table and temporary table # ############################################################# +--source include/have_innodb.inc --source include/have_innodb_16k.inc --source include/have_partition.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + # Check index merge threshold by create index on all datatypes CREATE TABLE tab(a BIGINT PRIMARY KEY,c1 TINYTEXT,c2 TEXT,c3 MEDIUMTEXT, @@ -186,3 +190,5 @@ --source suite/innodb/include/innodb_merge_threshold_secondary.inc DROP TABLE tab1; + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-16k.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-16k.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-16k.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-16k.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,6 +3,9 @@ --source include/have_innodb.inc --source include/have_innodb_16k.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + call mtr.add_suppression("InnoDB: Cannot add field .* in table"); let $MYSQLD_DATADIR= `select @@datadir`; @@ -457,6 +460,7 @@ --source include/wait_all_purged.inc SET GLOBAL innodb_compression_level=@save_level; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; DROP TABLE t1_purge, t2_purge, t3_purge, t4_purge; DROP TABLE tlong; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-32k.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-32k.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-32k.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-32k.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,10 +3,24 @@ --source include/have_innodb.inc --source include/have_innodb_32k.inc +SET GLOBAL innodb_stats_persistent = 0; call mtr.add_suppression("Innodb: Cannot add field.*row size is"); let $MYSQLD_DATADIR= `select @@datadir`; +SET SESSION innodb_strict_mode=ON; +--error ER_CANT_CREATE_TABLE +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +--error ER_CANT_CREATE_TABLE +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +SET SESSION innodb_strict_mode=OFF; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +SHOW WARNINGS; +DROP TABLE t1; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +SHOW WARNINGS; +DROP TABLE t1; + --echo # Test 1) Show the page size from Information Schema SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-64k.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-64k.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-64k.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-64k.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,6 +8,19 @@ let $MYSQLD_DATADIR= `select @@datadir`; +SET SESSION innodb_strict_mode=ON; +--error ER_CANT_CREATE_TABLE +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +--error ER_CANT_CREATE_TABLE +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +SET SESSION innodb_strict_mode=OFF; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +SHOW WARNINGS; +DROP TABLE t1; +CREATE TABLE t1(a int PRIMARY KEY) ENGINE=InnoDB KEY_BLOCK_SIZE=4; +SHOW WARNINGS; +DROP TABLE t1; + --echo # Test 1) Show the page size from Information Schema SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_page_size'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-ac-non-locking-select.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-ac-non-locking-select.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-ac-non-locking-select.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-ac-non-locking-select.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,117 @@ +# DEBUG_SYNC must be compiled in. +--source include/have_debug_sync.inc +--source include/have_debug.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (c1 INT , c2 CHAR(10), PRIMARY KEY (c1)) ENGINE = InnoDB; +INSERT INTO t1 VALUES(0, "0"); +INSERT INTO t1 VALUES(1, "1"); +INSERT INTO t1 VALUES(2, "2"); +INSERT INTO t1 VALUES(3, "3"); + +--connect (con1,localhost,root,,) +--connect (con2,localhost,root,,) +--connect (con3,localhost,root,,) +--connect (con4,localhost,root,,) +--connect (con5,localhost,root,,) +--connect (con6,localhost,root,,) + +connection default; +# Disable query log to avoid non-deterministic output conflicts +SET AUTOCOMMIT=0; +BEGIN; +# Lock all the records +SELECT * FROM t1 FOR UPDATE; +--disable_query_log + +connection con1; +SET AUTOCOMMIT=1; +# Test if locking autocommit selects end up in the trx_sys_t::trx_list. +# We check this via the INFORMATION_SCHEMA.INNODB_TRX. +# This should block and show up in the I_S. +SET DEBUG_SYNC='lock_wait_start SIGNAL waiting1'; +--send +SELECT COUNT(*) FROM t1 LOCK IN SHARE MODE; + +connection con2; +SET AUTOCOMMIT=1; +# Test if non-locking autocommit selects end up in the trx_sys_t::trx_list. +# We check this via the INFORMATION_SCHEMA.INNODB_TRX. +# This should not block and should not show up in the I_S. +--send +SELECT COUNT(*) FROM t1; + +connection con3; +SET AUTOCOMMIT=1; +# Note: autocommit non-locking selects are not converted to locking selects +# Therefore this should not block; +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; +--send +SELECT COUNT(*) FROM t1; + +connection con4; +SET AUTOCOMMIT=0; +# Note: Non-locking selects are converted to locking selects +# therefore this should block; +SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; +SET DEBUG_SYNC='now WAIT_FOR waiting1'; +SET DEBUG_SYNC='lock_wait_start SIGNAL waiting4'; +--send +SELECT COUNT(*) FROM t1 WHERE c1 >= 0; + +connection con5; +SET AUTOCOMMIT=1; +# This should not block +BEGIN; +--send +SELECT COUNT(*) FROM t1; + +connection con6; +SET AUTOCOMMIT=1; +# This will ignore the auto-commit setting but wont block because it is +# a non-locking select. +XA START '1'; +--enable_query_log +SELECT * FROM t1 WHERE c1 <= 3; + +connection default; +# Wait for SELECTs to get into the lock wait queue +SET DEBUG_SYNC='now WAIT_FOR waiting4'; +SET DEBUG_SYNC= 'RESET'; + +# Check the number of non-locking transactions +let $wait_condition = + SELECT COUNT(*) = 5 + FROM INFORMATION_SCHEMA.INNODB_TRX + WHERE trx_autocommit_non_locking = 0; +--source include/wait_condition.inc + +# Check the waiting transactions +SELECT trx_state, trx_query, trx_autocommit_non_locking +FROM INFORMATION_SCHEMA.INNODB_TRX +WHERE trx_state = 'LOCK WAIT' +ORDER BY trx_query; + +INSERT INTO t1 VALUES(4, '4'); +COMMIT; + +connection con6; +SELECT * FROM t1 WHERE c1 <= 4; +XA END '1'; +XA PREPARE '1'; +XA ROLLBACK '1'; +disconnect con6; +disconnect con2; +disconnect con3; +disconnect con5; + +connection con1; +reap; +disconnect con1; + +connection con4; +reap; +disconnect con4; + +connection default; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-alter-debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter-debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-alter-debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter-debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -144,15 +144,14 @@ --echo # create table t1(f1 int not null primary key, - - f2 int not null, index idx(f2))engine=innodb; + f2 int not null, index idx(f2), index i(f2,f1))engine=innodb; insert into t1 values(1, 1); connect(con1,localhost,root,,,); SET DEBUG_SYNC='before_delete_table_stats SIGNAL blocked WAIT_FOR go'; -SET innodb_lock_wait_timeout=0; -send ALTER TABLE t1 FORCE, ALGORITHM=COPY; +send SET STATEMENT innodb_lock_wait_timeout=0 FOR +ALTER TABLE t1 FORCE, ALGORITHM=COPY; connection default; SET DEBUG_SYNC='now WAIT_FOR blocked'; @@ -167,6 +166,21 @@ COMMIT; SET DEBUG_SYNC=RESET; +RENAME TABLE mysql.innodb_table_stats TO mysql.innodb_table_stats_hidden; +connection con1; +SET DEBUG_SYNC='innodb_commit_inplace_before_lock SIGNAL blocked WAIT_FOR go'; +send ALTER TABLE t1 DROP INDEX i; + +connection default; +SET DEBUG_SYNC='now WAIT_FOR blocked'; +RENAME TABLE mysql.innodb_table_stats_hidden TO mysql.innodb_table_stats; +SET DEBUG_SYNC='now SIGNAL go'; + +connection con1; +reap; +connection default; +SET DEBUG_SYNC=RESET; + connection con1; ALTER TABLE t1 RENAME KEY idx TO idx1, ALGORITHM=COPY; disconnect con1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-alter-tempfile.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter-tempfile.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-alter-tempfile.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter-tempfile.test 2024-08-03 07:29:58.000000000 +0000 @@ -35,7 +35,7 @@ CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL) ENGINE=innodb; SET debug_dbug='+d,innodb_alter_commit_crash_before_commit'; ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --error 2013 ALTER TABLE t1 ADD PRIMARY KEY (f2, f1); @@ -65,8 +65,11 @@ --let $shutdown_timeout=0 --source include/restart_mysqld.inc disconnect con1; ---replace_column 7 # +# This may occasionally display records for a corrupted index(f2). +# The original bug was about a crash during the execution of SHOW KEYS. +--disable_result_log SHOW KEYS FROM t1; +--enable_result_log DROP TABLE t1; remove_files_wildcard $datadir/test #sql-*.frm; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-alter.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-alter.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-alter.test 2024-08-03 07:29:58.000000000 +0000 @@ -701,6 +701,32 @@ SET @@SQL_MODE= @OLD_SQL_MODE; DROP TABLE t1; +--echo # +--echo # Bug#20977779 CANNOT IMPORT TABLES CONTAINING PREFIX INDEXES +--echo # + +CREATE TABLE t1 (c1 VARCHAR(32), c2 VARCHAR(32), c3 VARCHAR(32), +PRIMARY KEY (c1, c2, c3)) +ENGINE=InnoDB; + +ALTER TABLE t1 ADD INDEX ind1(c1(5), c2, c3); +ALTER TABLE t1 ADD INDEX ind2(c3, c1(10), c2); +ALTER TABLE t1 ADD INDEX ind3(c2, c3, c1(20)); + +INSERT INTO t1 VALUES ('Test Data -1', 'Test Data -2', 'Test Data -3'); + +let $source_db = test; +let $dest_db = test; + +--echo # Test with 2ndary index having prefix +--source suite/innodb/include/import.inc + +--echo # Test with PK & 2ndary index with prefix +ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY(c1(5), c2(10), c3(20)); +--source suite/innodb/include/import.inc + +DROP TABLE t1; + # # End of 10.2 tests # diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-corrupted-table.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-corrupted-table.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-corrupted-table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-corrupted-table.test 2024-08-03 07:29:58.000000000 +0000 @@ -23,14 +23,14 @@ --echo # Stop the server, replace the frm with the old one and restart the server ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc --remove_file $datadir/test/t1.frm --copy_file $MYSQLTEST_VARDIR/tmp/t1.frm $datadir/test/t1.frm ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-index-online-fk.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-index-online-fk.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-index-online-fk.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-index-online-fk.test 2024-08-03 07:29:58.000000000 +0000 @@ -482,3 +482,48 @@ DROP TABLE t2; DROP TABLE t3; + +--echo # Bug #17449901 TABLE DISAPPEARS WHEN ALTERING +--echo # WITH FOREIGN KEY CHECKS OFF + +# Drop index via inplace algorithm +create table t1(f1 int,primary key(f1))engine=innodb; +create table t2(f2 int,f3 int,key t(f2,f3),foreign key(f2) references t1(f1))engine=innodb; +SET foreign_key_checks=0; +drop index t on t2; +drop table t2; +drop table t1; + +# Drop index using alter statement via inplace +create table t1(f1 int ,primary key(f1))engine=innodb; +create table t2(f2 int,f3 int, key t(f2),foreign key(f2) references t1(f1))engine=innodb; +SET foreign_key_checks = 0; +alter table t2 drop key t,algorithm=inplace; +show create table t2; +drop table t2; +drop table t1; + +create table t1(f1 int ,primary key(f1))engine=innodb; +create table t2(f2 int,f3 int, key t(f2),key t1(f2,f3), +foreign key(f2) references t1(f1))engine=innodb; +SET foreign_key_checks = 0; +alter table t2 drop key t,algorithm=inplace; +show create table t2; +drop table t2; +drop table t1; + +--echo # +--echo # MDEV-29092 FOREIGN_KEY_CHECKS does not prevent non-copy +--echo # alter from creating invalid FK structures +--echo # +CREATE TABLE t1(f1 INT, KEY(f1), + FOREIGN KEY(f1) references t1(f1))ENGINE=InnoDB; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1(f1 INT, KEY(f1), + FOREIGN KEY(f1) REFERENCES t1(f1))ENGINE=InnoDB; +SHOW CREATE TABLE t1; +ALTER TABLE t1 DROP KEY f1; +SHOW CREATE TABLE t1; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-index-online.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-index-online.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-index-online.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-index-online.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,10 @@ --source include/have_debug_sync.inc --source include/no_valgrind_without_big.inc +SET GLOBAL innodb_monitor_reset_all=all; +--disable_warnings +SET GLOBAL innodb_monitor_reset_all=default; +--enable_warnings let $innodb_metrics_select= SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; @@ -158,6 +162,7 @@ --error ER_QUERY_INTERRUPTED KILL QUERY @id; +SET GLOBAL innodb_max_purge_lag_wait=0; SET DEBUG_SYNC = 'row_log_apply_before SIGNAL c2d_created WAIT_FOR kill_done'; --send CREATE INDEX c2d ON t1(c2); @@ -209,13 +214,13 @@ connection default; SET @merge_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); connection con1; @@ -254,13 +259,13 @@ ON si.index_id = sf.index_id WHERE si.name = '?c2e'; SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SELECT @@ -297,16 +302,16 @@ eval $innodb_metrics_select; SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); connection con1; @@ -343,16 +348,16 @@ connection default; SET @merge_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SELECT diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-lock-inherit-read_commited.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-lock-inherit-read_commited.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-lock-inherit-read_commited.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-lock-inherit-read_commited.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,110 @@ +--echo # +--echo # Bug #21025880 DUPLICATE UK VALUES IN READ-COMMITTED(AGAIN) +--echo # + +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +let $i=0; + +while ($i <=1 ) +{ + +CREATE TABLE t1 ( + a INT NOT NULL, + b INT NOT NULL, + PRIMARY KEY(b), + UNIQUE KEY(a)) +ENGINE=INNODB; + +SET @old_innodb_stats_auto_recalc = @@innodb_stats_auto_recalc; +SET GLOBAL innodb_stats_auto_recalc = OFF; + +# Block purge +connect purge_control,localhost,root; +START TRANSACTION WITH CONSISTENT SNAPSHOT; +connection default; + +SET @old_tx_isolation = @@tx_isolation; +SET GLOBAL tx_isolation = 'READ-COMMITTED'; + +SET @old_innodb_lock_wait_timeout = @@innodb_lock_wait_timeout; +SET GLOBAL innodb_lock_wait_timeout = 1; + +--connect(con1,localhost,root,,) + +# Create and delete-mark an index record + +INSERT INTO t1 VALUES (1,1),(2,2); +DELETE FROM t1; + +SET debug_sync = 'row_ins_sec_index_entry_dup_locks_created SIGNAL +con1_locks_done WAIT_FOR con1_go'; +SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock SIGNAL +con1_insert_done WAIT_FOR con1_finish'; +--send + +if ($i == 0) +{ +REPLACE INTO t1 VALUES (1,2); +} + +if ( $i == 1) +{ +INSERT INTO t1 values (1,2) ON DUPLICATE KEY UPDATE a=2; +} +--connect(con2,localhost,root,,) + +SET debug_sync = 'now WAIT_FOR con1_locks_done'; + +SET debug_sync = 'lock_wait_start SIGNAL con2_blocked +WAIT_FOR con2_go'; +SET debug_sync = 'ha_commit_trans_after_acquire_commit_lock +WAIT_FOR con2_finish'; +SET debug_sync = 'ib_after_row_insert SIGNAL con2_insert_done'; + +--send +REPLACE INTO t1 VALUES (1,3); + +--connection default +SET debug_sync = 'now WAIT_FOR con2_blocked'; + +connection purge_control; +COMMIT; +disconnect purge_control; +connection default; + +# Wait for purge to delete the delete-marked record +--source ../../innodb/include/wait_all_purged.inc + +SET debug_sync = 'now SIGNAL con2_go WAIT_FOR con2_insert_done'; +SET debug_sync = 'now SIGNAL con1_go WAIT_FOR con1_insert_done'; + +SET debug_sync = 'now SIGNAL con1_finish'; + +--connection con1 +--reap +--disconnect con1 +--connection default +SET debug_sync = 'now SIGNAL con2_finish'; + +--connection con2 +--error 0,ER_LOCK_WAIT_TIMEOUT +--reap +--disconnect con2 + +--connection default +SET DEBUG_SYNC= 'RESET'; + +SELECT * FROM t1; +CHECK TABLE t1; + +DROP TABLE t1; + +SET GLOBAL innodb_stats_auto_recalc = @old_innodb_stats_auto_recalc; +SET GLOBAL tx_isolation = @old_tx_isolation; +SET GLOBAL innodb_lock_wait_timeout = @old_innodb_lock_wait_timeout; + +--inc $i +} diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-lru-force-no-free-page.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ ---source include/have_innodb.inc ---source include/have_debug.inc ---source include/not_embedded.inc - -call mtr.add_suppression("InnoDB: Difficult to find free blocks in the buffer pool"); - -SET @saved_debug = @@SESSION.debug_dbug; -SET SESSION debug_dbug="+d,ib_lru_force_no_free_page"; - -CREATE TABLE t1 (j LONGBLOB) ENGINE = InnoDB; -BEGIN; -INSERT INTO t1 VALUES (repeat('abcdefghijklmnopqrstuvwxyz',200)); -COMMIT; - -SET debug_dbug = @saved_debug; - -DROP TABLE t1; - -# -# There should be only one message -# -let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; ---let SEARCH_PATTERN=InnoDB: Difficult to find free blocks ---source include/search_pattern_in_file.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-read-view.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-read-view.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-read-view.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-read-view.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,7 +1,6 @@ # DEBUG_SYNC must be compiled in. --source include/have_debug_sync.inc --source include/have_debug.inc - # We need to test the use case: # a. Create a transaction T1 that will be promoted to RW. # b. Create a transaction T2 that will be promoted to RW. @@ -27,22 +26,16 @@ INSERT INTO t2 VALUES(3, "d"); --connect (con1,localhost,root,,) ---connect (con2,localhost,root,,) - -connection con1; ---echo 'T1' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t2; connection default; ---echo 'T2' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t1; -connection con2; ---echo 'T3' +--connect (con2,localhost,root,,) SET AUTOCOMMIT=0; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; @@ -50,48 +43,36 @@ SELECT * FROM t2; connection con1; ---echo 'T1' UPDATE t2 SET c1 = c1 + 100; SELECT * FROM t2; COMMIT; connection default; ---echo 'T2' UPDATE t1 SET c1 = c1 + 100; SELECT * FROM t1; COMMIT; connection con2; ---echo 'T3' SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1'; --send SELECT * FROM t1; connection default; ---echo 'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; ---echo 'Signalled T3' connection con2; ---echo 'T3' reap; connection con2; ---echo 'T3' SET DEBUG_SYNC='row_search_for_mysql_before_return WAIT_FOR waiting1'; --send SELECT * FROM t2; connection default; ---echo 'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; ---echo 'Signalled T3' connection con2; ---echo 'T3' reap; connection default; -disconnect con1; -disconnect con2; # We need to test the use case: # a. Create a transaction T1 that will be promoted to RW. @@ -105,17 +86,12 @@ # i. T3 Does a select - it should not see the changes made by T1 but should # see the changes by T2 ---connect (con1,localhost,root,,) ---connect (con2,localhost,root,,) - connection con1; ---echo 'T1' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t1; connection default; ---echo 'T2' SET AUTOCOMMIT=0; BEGIN; SELECT * FROM t2; @@ -124,7 +100,6 @@ COMMIT; connection con2; ---echo 'T3' SET AUTOCOMMIT=0; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; BEGIN; @@ -132,42 +107,30 @@ SELECT * FROM t2; connection con1; ---echo 'T1' UPDATE t1 SET c1 = c1 + 100; SELECT * FROM t1; COMMIT; connection con2; ---echo 'T3' SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1'; --send SELECT * FROM t1; connection con1; ---echo 'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; ---echo 'Signalled T3' connection con2; ---echo 'T3' reap; - -connection con2; ---echo 'T3' SET DEBUG_SYNC='row_select_wait WAIT_FOR waiting1'; --send SELECT * FROM t2; connection default; ---echo 'T2' SET DEBUG_SYNC='now SIGNAL waiting1'; ---echo 'Signalled T3' connection con2; ---echo 'T3' reap; +disconnect con2; connection default; -disconnect con1; -disconnect con2; DROP TABLE t1; DROP TABLE t2; @@ -176,8 +139,7 @@ --echo # Bug 21433768: NON-REPEATABLE READ WITH REPEATABLE READ ISOLATION --echo # ---connect (con1,localhost,root,,) - +connection con1; CREATE TABLE t1(col1 INT PRIMARY KEY, col2 INT) ENGINE = InnoDB; INSERT INTO t1 values (1, 0), (2, 0); SELECT * FROM t1 ORDER BY col1; @@ -200,9 +162,7 @@ disconnect con1; connection default; - +SET DEBUG_SYNC= 'RESET'; DROP TABLE t1; -# Clean up resources used in this test case. -SET DEBUG_SYNC= 'RESET'; --source include/wait_until_count_sessions.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-system-table-view.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-system-table-view.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-system-table-view.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-system-table-view.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,9 @@ --source include/innodb_page_size_small.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + LET $MYSQLD_DATADIR = `select @@datadir`; LET $INNODB_PAGE_SIZE = `select @@innodb_page_size`; @@ -144,3 +147,5 @@ --echo # temporary tablespace information --echo # SELECT SPACE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE name like 'innodb_temporary'; + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-table-online.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-table-online.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-table-online.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-table-online.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,10 @@ --source include/have_debug_sync.inc --source include/have_sequence.inc +SET GLOBAL innodb_monitor_reset_all=all; +--disable_warnings +SET GLOBAL innodb_monitor_reset_all=default; +--enable_warnings let $innodb_metrics_select= SELECT name, count FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE subsystem = 'ddl'; @@ -171,13 +175,13 @@ ANALYZE TABLE t1; SET @merge_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_0= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); connection con1; @@ -215,13 +219,13 @@ eval $innodb_metrics_select; SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SELECT @@ -243,16 +247,16 @@ eval $innodb_metrics_select; SET @merge_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_1= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SET GLOBAL innodb_max_purge_lag_wait=0; @@ -287,16 +291,16 @@ CHECK TABLE t1; SET @merge_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_encrypted'); SET @merge_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_merge_blocks_decrypted'); SET @rowlog_encrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_encrypted'); SET @rowlog_decrypt_2= -(SELECT variable_value FROM information_schema.global_status +(SELECT CAST(variable_value AS INTEGER) FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_rowlog_blocks_decrypted'); SELECT diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-truncate.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-truncate.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-truncate.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-truncate.test 2024-08-03 07:29:58.000000000 +0000 @@ -85,13 +85,11 @@ CREATE TABLE t2 (f2 INT, FOREIGN KEY(f2) REFERENCES t1 (f2)) ENGINE=InnoDB; --error ER_CANT_CREATE_TABLE CREATE TABLE t3 (a INT) ENGINE=InnoDB; ---replace_result $datadir ./ ---error ER_ERROR_ON_RENAME ALTER TABLE t1 RENAME TO t3; -ALTER TABLE t1 FORCE; +ALTER TABLE t3 FORCE; --error ER_TRUNCATE_ILLEGAL_FK -TRUNCATE TABLE t1; -DROP TABLE t2, t1; +TRUNCATE TABLE t3; +DROP TABLE t2, t3; --echo # --echo # MDEV-24861 Assertion `trx->rsegs.m_redo.rseg' failed diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-wl5522-1.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-wl5522-1.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-wl5522-1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-wl5522-1.test 2024-08-03 07:29:58.000000000 +0000 @@ -960,6 +960,25 @@ DROP TABLE t1; --remove_file $MYSQLTEST_VARDIR/tmp/t1.ibd ---echo # --echo # End of 10.3 tests + +--echo # +--echo # MDEV-29972 crash after "Unsupported meta-data version number" --echo # + +call mtr.add_suppression("Index for table 't2' is corrupt"); + +CREATE TABLE t2 (i INT PRIMARY KEY) ENGINE=InnoDB; +ALTER TABLE t2 DISCARD TABLESPACE; +--copy_file std_data/mysql80/t2.cfg $MYSQLD_DATADIR/test/t2.cfg +--copy_file std_data/mysql80/t2.ibd $MYSQLD_DATADIR/test/t2.ibd +--error ER_NOT_SUPPORTED_YET +ALTER TABLE t2 IMPORT TABLESPACE; +--remove_file $MYSQLD_DATADIR/test/t2.cfg +--error ER_NOT_KEYFILE +ALTER TABLE t2 IMPORT TABLESPACE; +--error ER_TABLESPACE_DISCARDED +SELECT * FROM t2; +DROP TABLE t2; + +--echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-wl5522-debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-wl5522-debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb-wl5522-debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb-wl5522-debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -43,7 +43,7 @@ --let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect ---exec echo wait > $_expect_file_name +--write_line wait $_expect_file_name SET SESSION debug_dbug="+d,ib_discard_before_commit_crash"; --error 2013 ALTER TABLE t1 DISCARD TABLESPACE; @@ -57,7 +57,7 @@ CREATE TABLE t1 (c1 INT) ENGINE = InnoDB; INSERT INTO t1 VALUES(1),(2),(3); ---exec echo wait > $_expect_file_name +--write_line wait $_expect_file_name SET SESSION debug_dbug="+d,ib_discard_after_commit_crash"; --error 2013 ALTER TABLE t1 DISCARD TABLESPACE; @@ -101,7 +101,7 @@ --error ER_TABLESPACE_DISCARDED SELECT * FROM t1; ---exec echo wait > $_expect_file_name +--write_line wait $_expect_file_name SET SESSION debug_dbug="+d,ib_import_before_commit_crash"; --error 2013 ALTER TABLE t1 IMPORT TABLESPACE; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_buffer_pool_dump_pct.test 2024-08-03 07:29:58.000000000 +0000 @@ -35,49 +35,44 @@ # - The granularity of the timestamp is one second. # - There could have been some dump caused by some previous test # just a few milliseconds before. -# In order to avoid conflict with previous tests, read the current value -# of INNODB_BUFFER_POOL_DUMP_STATUS -# and confirm that the timestamp is different after the dump #*********************************************************** -# Read the current value to compare with the new value. -SELECT variable_value INTO @IBPDS -FROM information_schema.global_status -WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS'; -SET GLOBAL innodb_buffer_pool_dump_now=ON; - -# Sleep one second in order to ensure that the time stamp is -# different at next dump ---sleep 1 +--error 0,1 +--remove_file $MYSQLD_DATADIR/ib_buffer_pool +SET GLOBAL innodb_buffer_pool_dump_now=ON; +perl; +my $f="$ENV{MYSQLD_DATADIR}/ib_buffer_pool"; +my $count=300; +until (-e $f) +{ + select(undef, undef, undef, .1); + die "File $f was not created\n" if (0 > --$count); +} +EOF let $wait_condition = SELECT count(*) = 1 FROM information_schema.global_status WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS' -AND variable_value != @IBPDS AND variable_value like 'Buffer pool(s) dump completed at%'; --source include/wait_condition.inc --move_file $MYSQLD_DATADIR/ib_buffer_pool $MYSQLD_DATADIR/ib_buffer_pool100 SET GLOBAL innodb_buffer_pool_dump_pct=1; -SELECT @@global.innodb_buffer_pool_dump_pct; - -# Read the current value to compare with the new value. ---disable_warnings -SELECT variable_value INTO @IBPDS -FROM information_schema.global_status -WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS'; ---enable_warnings - SET GLOBAL innodb_buffer_pool_dump_now=ON; -# Sleep one second in order to ensure that the time stamp is -# different at next dump ---sleep 1 +perl; +my $f="$ENV{MYSQLD_DATADIR}/ib_buffer_pool"; +my $count=300; +until (-e $f) +{ + select(undef, undef, undef, .1); + die "File $f was not created\n" if (0 > --$count); +} +EOF let $wait_condition = SELECT count(*) = 1 FROM information_schema.global_status WHERE variable_name = 'INNODB_BUFFER_POOL_DUMP_STATUS' -AND variable_value != @IBPDS AND variable_value like 'Buffer pool(s) dump completed at%'; --source include/wait_condition.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_buffer_pool_fail.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_buffer_pool_fail.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_buffer_pool_fail.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_buffer_pool_fail.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,5 +7,8 @@ --echo # --echo # MDEV-25019 memory allocation failures during startup cause server failure in different, confusing ways --echo # -let restart_parameters=--debug_dbug="+d,ib_buf_chunk_init_fails"; +let restart_parameters=--debug_dbug=+d,ib_buf_chunk_init_fails; --source include/restart_mysqld.inc +let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err; +let SEARCH_PATTERN=\[ERROR\] InnoDB: Cannot allocate memory for the buffer pool; +--source include/search_pattern_in_file.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_bug12902967.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_bug12902967.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_bug12902967.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_bug12902967.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -# Bug 12902967: Creating self referencing fk on same index unhandled, -# confusing error -# -# Creating a self referencing foreign key on the same -# column/index is an unhandled exception, it should throw a sensible -# error but instead implies that your data dictionary may now be out -# of sync: - ---source include/have_innodb.inc ---source include/not_embedded.inc - -call mtr.add_suppression("In ALTER TABLE .* has or is referenced in foreign key constraints which are not compatible with the new table definition."); - -let error_log= $MYSQLTEST_VARDIR/log/mysqld.1.err; ---source include/restart_mysqld.inc - -create table t1 (f1 integer primary key) engine innodb; - -# The below statement should produce error message in error log. -# This error message should mention problem with foreign keys -# rather than with data dictionary. ---replace_regex /'\.\/test\/#sql-alter-[0-9a-f_\-]*'/'#sql-alter'/ ---error ER_ERROR_ON_RENAME -alter table t1 add constraint c1 foreign key (f1) references t1(f1); -drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_bug60196.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_bug60196.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_bug60196.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_bug60196.test 2024-08-03 07:29:58.000000000 +0000 @@ -58,7 +58,7 @@ --echo # Restart server. # Write file to make mysql-test-run.pl start up the server again ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Turn on reconnect --enable_reconnect @@ -132,7 +132,7 @@ --echo # Restart server. # Write file to make mysql-test-run.pl start up the server again ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Turn on reconnect --enable_reconnect diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_defrag_stats.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_defrag_stats.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_defrag_stats.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_defrag_stats.test 2024-08-03 07:29:58.000000000 +0000 @@ -35,7 +35,7 @@ # Wait for defrag_pool to be processed. let $wait_timeout=30; -let $wait_condition = SELECT COUNT(*)>0 FROM mysql.innodb_index_stats; +let $wait_condition = SELECT COUNT(*)>5 FROM mysql.innodb_index_stats; --source include/wait_condition.inc --sorted_result diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_force_recovery.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_force_recovery.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_force_recovery.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_force_recovery.test 2024-08-03 07:29:58.000000000 +0000 @@ -21,8 +21,18 @@ --source include/restart_mysqld.inc let $status=`SHOW ENGINE INNODB STATUS`; +SELECT CAST(variable_value AS INTEGER) INTO @read1 +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='innodb_buffer_pool_read_requests'; + select * from t1; +SELECT CAST(variable_value AS INTEGER) INTO @read2 +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='innodb_buffer_pool_read_requests'; + +SELECT @read1>0, @read2>@read1; + begin; insert into t1 values(2, 3); rollback; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_i_s_innodb_locks.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_i_s_innodb_locks.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_i_s_innodb_locks.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_i_s_innodb_locks.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,169 @@ +# +# Test that user data is correctly "visualized" in +# INFORMATION_SCHEMA.innodb_locks.lock_data +# + +-- source include/have_innodb.inc + +SET @save_timeout=@@GLOBAL.innodb_lock_wait_timeout; +SET GLOBAL innodb_lock_wait_timeout=100000000; + +let $table_def = +( + c01 TINYINT, + c02 TINYINT UNSIGNED, + c03 SMALLINT, + c04 SMALLINT UNSIGNED, + c05 MEDIUMINT, + c06 MEDIUMINT UNSIGNED, + c07 INT, + c08 INT UNSIGNED, + c09 BIGINT, + c10 BIGINT UNSIGNED, + PRIMARY KEY(c01, c02, c03, c04, c05, c06, c07, c08, c09, c10) +) ENGINE=INNODB; + +-- eval CREATE TABLE t_min $table_def; +INSERT INTO t_min VALUES +(-128, 0, + -32768, 0, + -8388608, 0, + -2147483648, 0, + -9223372036854775808, 0); + +-- eval CREATE TABLE t_max $table_def; +INSERT INTO t_max VALUES +(127, 255, + 32767, 65535, + 8388607, 16777215, + 2147483647, 4294967295, + 9223372036854775807, 18446744073709551615); + +CREATE TABLE ```t'\"_str` ( + c1 VARCHAR(32), + c2 VARCHAR(32), + c3 VARCHAR(32), + c4 VARCHAR(32), + c5 VARCHAR(32), + c6 VARCHAR(32), + c7 VARCHAR(32), + PRIMARY KEY(c1, c2, c3, c4, c5, c6, c7) +) ENGINE=INNODB; +INSERT INTO ```t'\"_str` VALUES +('1', 'abc', '''abc', 'abc''', 'a''bc', 'a''bc''', '''abc'''''); +INSERT INTO ```t'\"_str` VALUES +('2', 'abc', '"abc', 'abc"', 'a"bc', 'a"bc"', '"abc""'); +INSERT INTO ```t'\"_str` VALUES +('3', 'abc', '\\abc', 'abc\\', 'a\\bc', 'a\\bc\\', '\\abc\\\\'); +INSERT INTO ```t'\"_str` VALUES +('4', 'abc', 0x00616263, 0x61626300, 0x61006263, 0x6100626300, 0x610062630000); + +-- source include/count_sessions.inc + +-- connect (con_lock,localhost,root,,) +-- connect (con_min_trylock,localhost,root,,) +-- connect (con_max_trylock,localhost,root,,) +-- connect (con_str_insert_supremum,localhost,root,,) +-- connect (con_str_lock_row1,localhost,root,,) +-- connect (con_str_lock_row2,localhost,root,,) +-- connect (con_str_lock_row3,localhost,root,,) +-- connect (con_str_lock_row4,localhost,root,,) +-- connect (con_verify_innodb_locks,localhost,root,,) + +-- connection con_lock +SET autocommit=0; +SELECT * FROM t_min FOR UPDATE; +SELECT * FROM t_max FOR UPDATE; +SELECT * FROM ```t'\"_str` FOR UPDATE; + +-- connection con_min_trylock +-- send +SELECT * FROM t_min FOR UPDATE; + +-- connection con_max_trylock +-- send +SELECT * FROM t_max FOR UPDATE; + +-- connection con_str_insert_supremum +-- send +INSERT INTO ```t'\"_str` VALUES +('z', 'z', 'z', 'z', 'z', 'z', 'z'); + +-- connection con_str_lock_row1 +-- send +SELECT * FROM ```t'\"_str` WHERE c1 = '1' FOR UPDATE; + +-- connection con_str_lock_row2 +-- send +SELECT * FROM ```t'\"_str` WHERE c1 = '2' FOR UPDATE; + +-- connection con_str_lock_row3 +-- send +SELECT * FROM ```t'\"_str` WHERE c1 = '3' FOR UPDATE; + +-- connection con_str_lock_row4 +-- send +SELECT * FROM ```t'\"_str` WHERE c1 = '4' FOR UPDATE; + +-- connection con_verify_innodb_locks +# Wait for the above queries to execute before continuing. +# Without this, it sometimes happens that the SELECT from innodb_locks +# executes before some of them, resulting in less than expected number +# of rows being selected from innodb_locks. If there is a bug and there +# are no 14 rows in innodb_locks then this test will fail with timeout. +# Notice that if we query INNODB_LOCKS more often than once per 0.1 sec +# then its contents will never change because the cache from which it is +# filled is updated only if it has not been read for 0.1 seconds. See +# CACHE_MIN_IDLE_TIME_US in trx/trx0i_s.c. +let $cnt=10; +while ($cnt) +{ + let $success=`SELECT COUNT(*) = 14 FROM INFORMATION_SCHEMA.INNODB_LOCKS`; + if ($success) + { + let $cnt=0; + } + if (!$success) + { + real_sleep 0.2; + dec $cnt; + } +} +if (!$success) +{ + -- echo Timeout waiting for rows in INNODB_LOCKS to appear +} + +SELECT lock_mode, lock_type, lock_table, lock_index, lock_rec, lock_data +FROM INFORMATION_SCHEMA.INNODB_LOCKS ORDER BY lock_data; + +SELECT lock_table, COUNT(*) FROM INFORMATION_SCHEMA.INNODB_LOCKS +GROUP BY lock_table; + +set @save_sql_mode = @@sql_mode; +SET SQL_MODE='ANSI_QUOTES'; +SELECT lock_table, COUNT(*) FROM INFORMATION_SCHEMA.INNODB_LOCKS +GROUP BY lock_table; +SET @@sql_mode=@save_sql_mode; + +# Release all the locks; +-- connection con_lock +COMMIT; + +-- connection default + +-- disconnect con_lock +-- disconnect con_min_trylock +-- disconnect con_max_trylock +-- disconnect con_str_insert_supremum +-- disconnect con_str_lock_row1 +-- disconnect con_str_lock_row2 +-- disconnect con_str_lock_row3 +-- disconnect con_str_lock_row4 +-- disconnect con_verify_innodb_locks + +DROP TABLE t_min, t_max, ```t'\"_str`; + +-- source include/wait_until_count_sessions.inc + +SET GLOBAL innodb_lock_wait_timeout=@save_timeout; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_i_s_innodb_trx.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_i_s_innodb_trx.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_i_s_innodb_trx.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_i_s_innodb_trx.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,95 @@ +--source include/have_innodb.inc + +# +# Test that transaction data is correctly "visualized" in +# INFORMATION_SCHEMA.INNODB_TRX +# + +SET @save_timeout=@@GLOBAL.innodb_lock_wait_timeout; +SET GLOBAL innodb_lock_wait_timeout=100000000; + +DESCRIBE INFORMATION_SCHEMA.INNODB_TRX; + +CREATE TABLE t1 ( + c01 INT, + c02 INT, + PRIMARY KEY (c01) +) ENGINE=INNODB STATS_AUTO_RECALC=0; + +INSERT INTO t1 VALUES +(1,2),(2,4),(3,6),(4,8); + +CREATE TABLE t2 ( + c01 INT, + c02 INT, + PRIMARY KEY (c01), + FOREIGN KEY fk1 (c02) REFERENCES t1 (c01) +) ENGINE=INNODB STATS_AUTO_RECALC=0; + +INSERT INTO t2 VALUES +(1,1),(2,2),(3,3); + +-- source include/count_sessions.inc + +-- connect (con_trx,localhost,root,,) +-- connect (con_verify_innodb_trx,localhost,root,,) + +-- connection con_trx +SET autocommit=0; +INSERT INTO t1 VALUES (5,10); +SELECT * FROM t1 FOR UPDATE; + +let $wait_timeout= 300; +let $wait_condition= + SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_TRX; +-- source include/wait_condition.inc + +-- connection con_verify_innodb_trx +SELECT trx_state, trx_weight, trx_tables_in_use, trx_tables_locked, +trx_rows_locked, trx_rows_modified, trx_concurrency_tickets, +trx_isolation_level, trx_unique_checks, trx_foreign_key_checks +FROM INFORMATION_SCHEMA.INNODB_TRX; + +-- connection con_trx +ROLLBACK; +SET FOREIGN_KEY_CHECKS = 0; +SET UNIQUE_CHECKS = 0; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +BEGIN; +INSERT INTO t1 VALUES (6,12); + +let $wait_timeout= 300; +let $wait_condition= + SELECT trx_unique_checks = 0 FROM INFORMATION_SCHEMA.INNODB_TRX; +-- source include/wait_condition.inc + +-- connection con_verify_innodb_trx +SELECT trx_isolation_level, trx_unique_checks, trx_foreign_key_checks +FROM INFORMATION_SCHEMA.INNODB_TRX; + +-- connection con_trx +ROLLBACK; +SET FOREIGN_KEY_CHECKS = 1; +SET UNIQUE_CHECKS = 1; +BEGIN; +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO t2 VALUES (4,10); + +let $wait_timeout= 300; +let $wait_condition= + SELECT trx_unique_checks = 1 FROM INFORMATION_SCHEMA.INNODB_TRX; +-- source include/wait_condition.inc +-- disconnect con_trx + +-- connection con_verify_innodb_trx +SELECT trx_state, trx_isolation_level, trx_last_foreign_key_error +FROM INFORMATION_SCHEMA.INNODB_TRX; +-- disconnect con_verify_innodb_trx + +-- connection default +DROP TABLE t2; +DROP TABLE t1; + +-- source include/wait_until_count_sessions.inc + +SET GLOBAL innodb_lock_wait_timeout=@save_timeout; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_information_schema_tables.opt mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_information_schema_tables.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_information_schema_tables.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_information_schema_tables.opt 2024-08-03 07:29:58.000000000 +0000 @@ -26,3 +26,4 @@ --loose-innodb_buffer_pool_pages --loose-innodb_buffer_pool_pages_index --loose-innodb_buffer_pool_pages_blob +--innodb-open-files=1000000 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_information_schema_tables.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_information_schema_tables.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_information_schema_tables.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_information_schema_tables.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,10 @@ -- source include/have_innodb.inc -- source include/not_embedded.inc +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +let SEARCH_PATTERN= \[Warning\] InnoDB: innodb_open_files 1000000 should not be greater than the open_files_limit [0-9]+; +--source include/search_pattern_in_file.inc + # # MDEV-7762 InnoDB: Failing assertion: block->page.buf_fix_count > 0 in buf0buf.ic line 730 # diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_prefix_index_restart_server.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_prefix_index_restart_server.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_prefix_index_restart_server.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_prefix_index_restart_server.test 2024-08-03 07:29:58.000000000 +0000 @@ -93,3 +93,17 @@ worklog5743; DROP TABLE worklog5743; + +--echo # +--echo # MDEV-21245 InnoDB: Using a partial-field key prefix in search +--echo # +CREATE TABLE t1 (a VARCHAR(255), KEY k(a)) DEFAULT CHARSET=utf8mb3 +ENGINE=InnoDB; +INSERT INTO t1 set a=''; +--enable_info +alter table t1 change a a varchar(3000); +--disable_info +SELECT * FROM t1 WHERE a IN (''); +DROP TABLE t1; + +--echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_scrub.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_scrub.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_scrub.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_scrub.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ let $MYSQLD_DATADIR=`select @@datadir`; CREATE TABLE t1(f1 int auto_increment primary key, f2 varchar(256), - f3 text) engine = innodb; + f3 text) engine = innodb stats_persistent=0; let $numinserts = 500; --disable_query_log begin; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.opt mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb-stats-persistent diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,48 @@ +# +# Test the persistent stats auto recalc +# + +-- source include/have_innodb.inc +# Page numbers printed by this test depend on the page size +-- source include/have_innodb_16k.inc + +-- vertical_results + +-- let $check_stats1 = SELECT n_rows, clustered_index_size FROM mysql.innodb_table_stats WHERE table_name = 'autorecalc' +-- let $check_stats2 = SELECT index_name, stat_name, stat_value FROM mysql.innodb_index_stats WHERE table_name = 'autorecalc' + +CREATE TABLE autorecalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB; + +# the CREATE should have inserted zeroed stats +-- eval $check_stats1 +-- eval $check_stats2 + +INSERT INTO autorecalc VALUES (1); +INSERT INTO autorecalc VALUES (2); + +# wait for the bg stats thread to update the stats, notice we wait on +# innodb_index_stats because innodb_table_stats gets updated first and +# it is possible that (if we wait on innodb_table_stats) the wait cond +# gets satisfied before innodb_index_stats is updated +let $wait_condition = SELECT stat_value = 2 FROM mysql.innodb_index_stats WHERE table_name = 'autorecalc' AND index_name = 'PRIMARY' AND stat_name = 'n_diff_pfx01'; +-- source include/wait_condition.inc + +# the second INSERT from above should have triggered an auto-recalc +-- eval $check_stats1 +-- eval $check_stats2 + +# now DELETE the rows and trigger a second auto-recalc, InnoDB may wait a +# few seconds before triggering an auto-recalc again (it tries not to be too +# aggressive) + +DELETE FROM autorecalc; + +let $wait_timeout = 25; +let $wait_condition = SELECT stat_value = 0 FROM mysql.innodb_index_stats WHERE table_name = 'autorecalc' AND index_name = 'PRIMARY' AND stat_name = 'n_diff_pfx01'; +-- source include/wait_condition.inc + +# the DELETE from above should have triggered an auto-recalc +-- eval $check_stats1 +-- eval $check_stats2 + +DROP TABLE autorecalc; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.opt mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb-stats-persistent diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_ddl.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,49 @@ +# +# Test the persistent stats auto recalc during DDL +# + +-- source include/have_innodb.inc + +-- vertical_results + +-- let $check_stats1 = SELECT n_rows FROM mysql.innodb_table_stats WHERE table_name = 'arddl' ORDER BY 1 +-- let $check_stats2 = SELECT index_name, stat_name, stat_value FROM mysql.innodb_index_stats WHERE table_name = 'arddl' AND index_name = 'PRIMARY' ORDER BY 1, 2, 3 + +# Test ADD INDEX during background stats gathering + +CREATE TABLE arddl (a INT, b INT, PRIMARY KEY (a)) ENGINE=INNODB; + +INSERT INTO arddl VALUES (1, 10); +INSERT INTO arddl VALUES (2, 10); + +ALTER TABLE arddl ADD INDEX (b); + +# wait for the bg stats thread to update the stats, notice we wait on +# innodb_index_stats because innodb_table_stats gets updated first and +# it is possible that (if we wait on innodb_table_stats) the wait cond +# gets satisfied before innodb_index_stats is updated +let $wait_condition = SELECT stat_value = 2 FROM mysql.innodb_index_stats WHERE table_name = 'arddl' AND index_name = 'PRIMARY' AND stat_name = 'n_diff_pfx01'; +-- source include/wait_condition.inc + +# the second INSERT from above should have triggered an auto-recalc +-- eval $check_stats1 +-- eval $check_stats2 + +DROP TABLE arddl; + +# Test DROP INDEX during background stats gathering + +CREATE TABLE arddl (a INT, b INT, PRIMARY KEY (a), KEY (b)) ENGINE=INNODB; + +INSERT INTO arddl VALUES (3, 10); +INSERT INTO arddl VALUES (4, 10); + +ALTER TABLE arddl DROP INDEX b; + +let $wait_condition = SELECT stat_value = 2 FROM mysql.innodb_index_stats WHERE table_name = 'arddl' AND index_name = 'PRIMARY' AND stat_name = 'n_diff_pfx01'; +-- source include/wait_condition.inc + +-- eval $check_stats1 +-- eval $check_stats2 + +DROP TABLE arddl; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.opt mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb-stats-persistent diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_lots.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,45 @@ +# +# Test the persistent stats auto recalc on lots of tables +# + +--source include/no_valgrind_without_big.inc +-- source include/have_innodb.inc + +let $check_stats = SELECT table_name, n_rows FROM mysql.innodb_table_stats WHERE table_name LIKE 'ar_%' ORDER BY table_name; + +-- disable_query_log +let $i = 1200; +while ($i > 1000) { + eval CREATE TABLE ar_$i (a INT, PRIMARY KEY (a)) ENGINE=INNODB; + dec $i; +} +-- enable_query_log + +# the CREATEs above should have inserted zeroed stats +-- eval $check_stats + +-- disable_query_log +let $i = 1200; +while ($i > 1000) { + eval INSERT INTO ar_$i VALUES (1), (2); + dec $i; +} +-- enable_query_log + +-- disable_query_log +let $i = 1200; +while ($i > 1000) { + eval INSERT INTO ar_$i VALUES (3), (4); + dec $i; +} +-- enable_query_log + +# would be too long to wait for stats to become up to date here + +-- disable_query_log +let $i = 1200; +while ($i > 1000) { + eval DROP TABLE ar_$i; + dec $i; +} +-- enable_query_log diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.opt mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb-stats-persistent diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_auto_recalc_on_nonexistent.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,88 @@ +# +# Test the persistent stats auto recalc when persistent stats do not exist +# + +-- source include/have_innodb.inc + +-- vertical_results + +-- let $check_stats1 = SELECT COUNT(*) FROM mysql.innodb_table_stats WHERE table_name = 't' +-- let $check_stats2 = SELECT COUNT(*) FROM mysql.innodb_index_stats WHERE table_name = 't' + +-- echo Test with default setting + +CREATE TABLE t (a INT, PRIMARY KEY (a)) ENGINE=INNODB; + +# the CREATE should have inserted zeroed stats +-- eval $check_stats1 +-- eval $check_stats2 + +# open and close the table +SELECT * FROM t; +FLUSH TABLE t; + +DELETE FROM mysql.innodb_index_stats WHERE table_name = 't'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 't'; + +-- eval $check_stats1 +-- eval $check_stats2 + +# open the table, causing stats recalc/save +SELECT * FROM t; + +-- eval $check_stats1 +-- eval $check_stats2 + +DROP TABLE t; + +-- echo Test with explicit enable + +CREATE TABLE t (a INT, PRIMARY KEY (a)) ENGINE=INNODB STATS_AUTO_RECALC=1; + +# the CREATE should have inserted zeroed stats +-- eval $check_stats1 +-- eval $check_stats2 + +# open and close the table +SELECT * FROM t; +FLUSH TABLE t; + +DELETE FROM mysql.innodb_index_stats WHERE table_name = 't'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 't'; + +-- eval $check_stats1 +-- eval $check_stats2 + +# open the table, causing stats recalc/save +SELECT * FROM t; + +-- eval $check_stats1 +-- eval $check_stats2 + +DROP TABLE t; + +-- echo Test with explicit disable + +CREATE TABLE t (a INT, PRIMARY KEY (a)) ENGINE=INNODB STATS_AUTO_RECALC=0; + +# the CREATE should have inserted zeroed stats +-- eval $check_stats1 +-- eval $check_stats2 + +# open and close the table +SELECT * FROM t; +FLUSH TABLE t; + +DELETE FROM mysql.innodb_index_stats WHERE table_name = 't'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 't'; + +-- eval $check_stats1 +-- eval $check_stats2 + +# open the table, stats should not be present, since autorecalc is disabled +SELECT * FROM t; + +-- eval $check_stats1 +-- eval $check_stats2 + +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_external_pages.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_external_pages.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_external_pages.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_external_pages.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,79 @@ +# +# Bug#18384390 WRONG STATISTICS WITH BIG ROW LENGTH AND PERSISTENT STATS +# + +--source include/have_innodb.inc +--source include/have_innodb_max_16k.inc +--source include/have_sequence.inc + +CREATE TABLE bug18384390 ( + id INT AUTO_INCREMENT PRIMARY KEY, + txt VARCHAR(10000) +) ENGINE=INNODB STATS_PERSISTENT=1 STATS_AUTO_RECALC=0; + +let $count=1024; +eval +INSERT INTO bug18384390 (txt) SELECT REPEAT('0', 10000) FROM seq_1_to_$count; + +set use_stat_tables=never; +ANALYZE TABLE bug18384390; + +-- let $n_rows = `SELECT n_rows FROM mysql.innodb_table_stats WHERE table_name = 'bug18384390'` + +-- let $table_rows = `SELECT table_rows FROM information_schema.tables WHERE table_name = 'bug18384390'` + +-- let $n_diff = `SELECT stat_value FROM mysql.innodb_index_stats WHERE table_name = 'bug18384390' AND stat_name = 'n_diff_pfx01'` + +-- let $cardinality = `SELECT cardinality FROM information_schema.statistics WHERE table_name = 'bug18384390'` + +-- let $margin_of_err_pct = 30 +-- let $margin_of_err_rows = `SELECT ROUND($count * $margin_of_err_pct / 100)` + +-- let $min_allowed = `SELECT $count - $margin_of_err_rows` +-- let $max_allowed = `SELECT $count + $margin_of_err_rows` + +-- let $dump_sql = SELECT COUNT(*) FROM bug18384390; SELECT * FROM mysql.innodb_table_stats; SELECT * FROM mysql.innodb_index_stats; SELECT * FROM information_schema.tables WHERE table_name = 'bug18384390'; SELECT * FROM information_schema.statistics WHERE table_name = 'bug18384390'; + +-- vertical_results + +if ($n_rows < $min_allowed) { + -- echo mysql.innodb_table_stats.n_rows is too small ($n_rows < $min_allowed) + -- eval $dump_sql +} + +if ($n_rows > $max_allowed) { + -- echo mysql.innodb_table_stats.n_rows is too big ($n_rows > $max_allowed) + -- eval $dump_sql +} + +if ($table_rows < $min_allowed) { + -- echo information_schema.tables.table_rows is too small ($table_rows < $min_allowed) + -- eval $dump_sql +} + +if ($table_rows > $max_allowed) { + -- echo information_schema.tables.table_rows is too big ($table_rows > $max_allowed) + -- eval $dump_sql +} + +if ($n_diff < $min_allowed) { + -- echo mysql.innodb_index_stats.stat_value is too small ($n_diff < $min_allowed) + -- eval $dump_sql +} + +if ($n_diff > $max_allowed) { + -- echo mysql.innodb_index_stats.stat_value is too big ($n_diff > $max_allowed) + -- eval $dump_sql +} + +if ($cardinality < $min_allowed) { + -- echo information_schema.statistics.cardinality is too small ($cardinality < $min_allowed) + -- eval $dump_sql +} + +if ($cardinality > $max_allowed) { + -- echo information_schema.statistics.cardinality is too big ($cardinality > $max_allowed) + -- eval $dump_sql +} + +DROP TABLE bug18384390; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_fetch.opt mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_fetch.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_fetch.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_fetch.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,7 @@ +--innodb_sys_tables +--innodb_sys_indexes +--innodb_sys_virtual +--innodb_sys_foreign +--innodb_sys_foreign_cols +--innodb_sys_tablestats +--innodb_sys_tablespaces diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_fetch.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_fetch.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_fetch.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_fetch.test 2024-08-03 07:29:58.000000000 +0000 @@ -81,3 +81,38 @@ DROP TABLE test_ps_fetch; set @@use_stat_tables = @save_use_stat_tables; + +--echo # +--echo # MDEV-28613 LeakSanitizer caused by I_S query using LIMIT ROWS EXAMINED +--echo # +CREATE TABLE t1(f1 VARCHAR(255), FULLTEXT(f1))ENGINE=InnoDB; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES LIMIT ROWS EXAMINED 5; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES LIMIT ROWS EXAMINED 5; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS LIMIT ROWS EXAMINED 5; +--disable_result_log +SELECT SPACE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES LIMIT ROWS EXAMINED 5; +--enable_result_log +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_VIRTUAL LIMIT ROWS EXAMINED 5; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN LIMIT ROWS EXAMINED 5; +SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS LIMIT ROWS EXAMINED 5; +DROP TABLE t1; + +--echo # +--echo # MDEV-33462 Disallow LOCK=NONE operation on statistics table +--echo # +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE mysql.innodb_table_stats FORCE, LOCK=NONE; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE mysql.innodb_index_stats FORCE, LOCK=NONE; + +--echo # +--echo # MDEV-34474 InnoDB: Failing assertion: stat_n_leaf_pages > 0 +--echo # in ha_innobase::estimate_rows_upper_bound +--echo # + +CREATE TABLE t (c1 INT,c2 INT, + INDEX(c1))STATS_PERSISTENT=1 ENGINE=INNODB; +UPDATE mysql.innodb_index_stats SET stat_value=0 WHERE database_name like "test" and table_name like 't'; +UPDATE mysql.innodb_table_stats SET clustered_index_size= 0, sum_of_other_index_sizes=0 WHERE database_name like "test" and table_name like 't'; +UPDATE t SET c1=+1 ORDER BY c2; +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_flag_global.combinations mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global.combinations --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_flag_global.combinations 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global.combinations 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,4 @@ +[on] +--innodb-stats-persistent=1 +[off] +--innodb-stats-persistent=0 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_flag_global.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_flag_global.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,91 @@ +-- source include/have_innodb.inc +-- source include/not_embedded.inc + +# +-- echo ===== +-- echo === Test ANALYZE behavior after default creation +-- echo ===== + +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB; + +-- source innodb_stats_flag_global_analyze.inc + +DROP TABLE test_ps_flag; + +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=default; + +-- source innodb_stats_flag_global_analyze.inc + +DROP TABLE test_ps_flag; + +# +-- echo ===== +-- echo === Test ANALYZE behavior after creation with explicit PS=OFF +-- echo ===== + +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=0; + +-- source innodb_stats_flag_global_analyze.inc + +DROP TABLE test_ps_flag; + +# +-- echo ===== +-- echo === Test ANALYZE behavior after creation with explicit PS=ON +-- echo ===== + +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=1; + +-- source innodb_stats_flag_global_analyze.inc + +DROP TABLE test_ps_flag; + +# +-- echo ===== +-- echo === Test ANALYZE behavior after creation with explicit PS=OFF, +-- echo === then ALTER to ON, then ALTER to OFF, then ALTER to default +-- echo ===== + +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=0; + +ALTER TABLE test_ps_flag STATS_PERSISTENT=1; + +# also check that the change from the ALTER TABLE survives server restart +-- source include/restart_mysqld.inc + +-- source innodb_stats_flag_global_analyze.inc + +ALTER TABLE test_ps_flag STATS_PERSISTENT=0; + +-- source innodb_stats_flag_global_analyze.inc + +ALTER TABLE test_ps_flag STATS_PERSISTENT=default; + +-- source innodb_stats_flag_global_analyze.inc + +DROP TABLE test_ps_flag; + +# +-- echo ===== +-- echo === Test ANALYZE behavior after creation with explicit PS=ON, +-- echo === then ALTER to OFF, then ALTER to ON, then ALTER to default +-- echo ===== + +CREATE TABLE test_ps_flag (a INT) ENGINE=INNODB STATS_PERSISTENT=1; + +ALTER TABLE test_ps_flag STATS_PERSISTENT=0; + +# also check that the change from the ALTER TABLE survives server restart +-- source include/restart_mysqld.inc + +-- source innodb_stats_flag_global_analyze.inc + +ALTER TABLE test_ps_flag STATS_PERSISTENT=1; + +-- source innodb_stats_flag_global_analyze.inc + +ALTER TABLE test_ps_flag STATS_PERSISTENT=default; + +-- source innodb_stats_flag_global_analyze.inc + +DROP TABLE test_ps_flag; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_flag_global_analyze.inc mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global_analyze.inc --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_flag_global_analyze.inc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_flag_global_analyze.inc 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,13 @@ +SHOW CREATE TABLE test_ps_flag; + +DELETE FROM mysql.innodb_index_stats WHERE table_name = 'test_ps_flag'; +DELETE FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; + +# must be 0, we have just deleted the rows +SELECT COUNT(*) AS cnt_before FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; + +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE test_ps_flag; + +# if the table is PS enabled, then this should be 1 and 0 otherwise +SELECT COUNT(*) AS cnt_after FROM mysql.innodb_table_stats WHERE table_name = 'test_ps_flag'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_persistent.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_persistent.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_persistent.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_persistent.test 2024-08-03 07:29:58.000000000 +0000 @@ -13,6 +13,7 @@ CREATE TABLE t2 LIKE t1; INSERT INTO t1 (val) SELECT 4 FROM seq_1_to_16; +SET STATEMENT use_stat_tables=never FOR ANALYZE TABLE t1; connect(con1, localhost, root,,); @@ -49,7 +50,7 @@ connection con1; EXPLAIN SELECT * FROM t2 WHERE val=4; ---source include/wait_all_purged.inc +SET GLOBAL innodb_max_purge_lag_wait=0; --echo # After COMMIT and purge, the DELETE must show up. EXPLAIN SELECT * FROM t1 WHERE val=4; @@ -82,3 +83,41 @@ SET GLOBAL innodb_stats_include_delete_marked = @saved_include_delete_marked; SET GLOBAL innodb_stats_traditional = @saved_traditional; SET GLOBAL innodb_stats_modified_counter = @saved_modified_counter; + +# +# Bug#12429573 TIMESTAMP COLUMN OF INNODB.INDEX_STATS ARE NOT UPDATED +# WHEN RE-RUNNING ANALYZE +# +CREATE TABLE bug12429573 (i INTEGER PRIMARY KEY, j INTEGER, KEY(j)) +ENGINE=INNODB STATS_PERSISTENT=1; + +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE bug12429573; + +# Cannot check the exact timestamp here because it is always different +# but at least check that both timestamps in innodb_table_stats and in +# innodb_index_stats have been updated to the same value. If the bug is +# present this check will fail. + +SELECT last_update INTO @last FROM mysql.innodb_table_stats +WHERE table_name = 'bug12429573'; +SELECT * FROM mysql.innodb_index_stats +WHERE table_name = 'bug12429573' AND last_update!=@last; + +# The first ANALYZE would insert timestamp e.g. 17:23:39 in both +# innodb_table_stats and innodb_index_stats. The bug is that the second +# ANALYZE only updates the timestamp in innodb_table_stats. In order to +# check if the timestamp in innodb_index_stats has really been updated we +# need it to be different from the previous one (17:23:39) with at least +# one second. +-- sleep 1 + +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE bug12429573; + +SELECT * FROM mysql.innodb_table_stats +WHERE table_name = 'bug12429573' AND last_update=@last; +SELECT * FROM mysql.innodb_index_stats +WHERE table_name = 'bug12429573' AND last_update=@last; + +DROP TABLE bug12429573; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_sample_pages.opt mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_sample_pages.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_sample_pages.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_sample_pages.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb-stats-persistent diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_sample_pages.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_sample_pages.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_sample_pages.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_sample_pages.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,53 @@ +# +# Test that the table option STATS_SAMPLE_PAGES=N|default is indeed +# used by InnoDB +# + +-- source include/have_innodb.inc +# Page numbers printed by this test depend on the page size +-- source include/have_innodb_16k.inc + +SET GLOBAL innodb_stats_persistent_sample_pages=17; + +CREATE TABLE test_ps_sample_pages_used ( + a VARCHAR(512), PRIMARY KEY (a) +) ENGINE=INNODB STATS_SAMPLE_PAGES=default; + +# Insert enough records into the table so that it has more than 2*17+1 pages +# If we ask to scan more than the half of the leaf pages, then the sampling +# will do full scan and we cannot check whether the sample_pages variable was +# honored. +BEGIN; +-- disable_query_log +let $i=999; +while ($i) { + eval INSERT INTO test_ps_sample_pages_used VALUES (REPEAT(1000+$i, 128)); + dec $i; +} +-- enable_query_log +COMMIT; + +ANALYZE TABLE test_ps_sample_pages_used; + +# confirm the big number of leaf pages in the index +SELECT stat_name, stat_value FROM mysql.innodb_index_stats +WHERE table_name='test_ps_sample_pages_used' AND stat_name='n_leaf_pages'; + +# confirm that 17 pages were sampled, that is - the global +# innodb_stats_persistent_sample_pages is used when the table option +# STATS_SAMPLE_PAGES is set to 'default'. +SELECT sample_size FROM mysql.innodb_index_stats +WHERE table_name='test_ps_sample_pages_used' AND stat_name='n_diff_pfx01'; + +ALTER TABLE test_ps_sample_pages_used STATS_SAMPLE_PAGES=14; + +ANALYZE TABLE test_ps_sample_pages_used; + +# confirm that 14 pages were sampled, that is - the table option +# STATS_SAMPLE_PAGES is used when it is set. +SELECT sample_size FROM mysql.innodb_index_stats +WHERE table_name='test_ps_sample_pages_used' AND stat_name='n_diff_pfx01'; + +DROP TABLE test_ps_sample_pages_used; + +SET GLOBAL innodb_stats_persistent_sample_pages=default; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_table_flag_auto_recalc.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_table_flag_auto_recalc.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_table_flag_auto_recalc.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_table_flag_auto_recalc.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,83 @@ +# +# Test CREATE TABLE ... STATS_AUTO_RECALC=0|1|default +# + +-- source include/no_valgrind_without_big.inc +-- source include/have_innodb.inc +-- source include/not_embedded.inc + +-- vertical_results + +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB; + +SHOW CREATE TABLE test_ps_auto_recalc; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; + +ALTER TABLE test_ps_auto_recalc STATS_AUTO_RECALC=1; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_auto_recalc; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; + +DROP TABLE test_ps_auto_recalc; + +## + +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_AUTO_RECALC=default; + +SHOW CREATE TABLE test_ps_auto_recalc; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; + +DROP TABLE test_ps_auto_recalc; + +## + +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_AUTO_RECALC=0; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_auto_recalc; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; + +ALTER TABLE test_ps_auto_recalc STATS_AUTO_RECALC=1; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_auto_recalc; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; + +DROP TABLE test_ps_auto_recalc; + +## + +CREATE TABLE test_ps_auto_recalc (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_AUTO_RECALC=1; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_auto_recalc; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; + +ALTER TABLE test_ps_auto_recalc STATS_AUTO_RECALC=0; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_auto_recalc; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_auto_recalc'; + +DROP TABLE test_ps_auto_recalc; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_table_flag_sample_pages.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_table_flag_sample_pages.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_stats_table_flag_sample_pages.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_stats_table_flag_sample_pages.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,103 @@ +# +# Test CREATE TABLE ... STATS_SAMPLE_PAGES=N|default +# + +-- source include/have_innodb.inc +# include/restart_mysqld.inc does not work in embedded mode +-- source include/not_embedded.inc + +-- vertical_results + +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB; + +SHOW CREATE TABLE test_ps_sample_pages; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; + +ALTER TABLE test_ps_sample_pages STATS_SAMPLE_PAGES=12345; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_sample_pages; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; + +DROP TABLE test_ps_sample_pages; + +## + +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=default; + +SHOW CREATE TABLE test_ps_sample_pages; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; + +DROP TABLE test_ps_sample_pages; + +## + +-- error ER_PARSE_ERROR +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=-5; + +-- error ER_PARSE_ERROR +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=0; + +-- error ER_PARSE_ERROR +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=67000; + +-- error ER_PARSE_ERROR +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=670000; + +-- error ER_PARSE_ERROR +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=65536; + +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=65535; + +SHOW CREATE TABLE test_ps_sample_pages; + +DROP TABLE test_ps_sample_pages; + +## + +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=1; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_sample_pages; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; + +DROP TABLE test_ps_sample_pages; + +## + +CREATE TABLE test_ps_sample_pages (a INT, PRIMARY KEY (a)) ENGINE=INNODB +STATS_SAMPLE_PAGES=5678; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_sample_pages; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; + +ALTER TABLE test_ps_sample_pages STATS_SAMPLE_PAGES=default; + +# confirm that the flag survives server restart +-- source include/restart_mysqld.inc + +SHOW CREATE TABLE test_ps_sample_pages; +SELECT create_options FROM information_schema.tables +WHERE table_name='test_ps_sample_pages'; + +DROP TABLE test_ps_sample_pages; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_timeout_rollback.test mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_timeout_rollback.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/innodb_timeout_rollback.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/innodb_timeout_rollback.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,5 @@ +--source include/have_innodb.inc --source include/innodb_rollback_on_timeout.inc ---echo End of 5.0 tests +--echo # End of 5.0 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/insert_into_empty.test mariadb-10.11.9/mysql-test/suite/innodb/t/insert_into_empty.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/insert_into_empty.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/insert_into_empty.test 2024-08-03 07:29:58.000000000 +0000 @@ -26,9 +26,19 @@ SET @save_ahi = @@global.innodb_adaptive_hash_index; SET GLOBAL innodb_adaptive_hash_index = 1; CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; + +SET @old_bulk_op= +(SELECT variable_value FROM information_schema.global_status +WHERE variable_name = 'innodb_bulk_operations'); + BEGIN; INSERT INTO t1 SELECT * FROM seq_1_to_65536; ROLLBACK; + +SELECT variable_value-@old_bulk_op bulk_operations +FROM information_schema.global_status +WHERE variable_name = 'innodb_bulk_operations'; + CHECK TABLE t1; --echo # --echo # MDEV-24832 Root page AHI Removal fails fails during @@ -153,9 +163,9 @@ CREATE TABLE t1 (a INT KEY) ENGINE=InnoDB; ---error 0,1193 +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE SET @save_limit = @@GLOBAL.innodb_limit_optimistic_insert_debug; ---error 0,1193 +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE SET GLOBAL innodb_limit_optimistic_insert_debug = 2; BEGIN; @@ -271,6 +281,42 @@ disconnect con1; SELECT * FROM t1; DROP TABLE t1; + +--echo # +--echo # MDEV-33979 Disallow bulk insert operation during +--echo # partition update statement +--echo # +CREATE TABLE t1(a INT KEY)ENGINE=InnoDB + PARTITION BY KEY(a) PARTITIONS 16; +INSERT INTO t1 VALUES(1); +UPDATE t1 SET a = 2 WHERE a = 1; +DROP TABLE t1; + +--echo # +--echo # MDEV-34265 Possible hang during IO burst with innodb_flush_sync enabled +--echo # +CREATE TABLE t1(f1 MEDIUMTEXT)ENGINE=InnoDB; + +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE +SET @save_dbug=@@GLOBAL.debug_dbug; +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE +SET @@GLOBAL.debug_dbug='+d,ib_page_cleaner_sleep'; + +if ($have_debug) { + SET STATEMENT debug_dbug='+d,ib_free_page_sleep' FOR + INSERT INTO t1 VALUES(REPEAT(1, 8459264)); +} +if (!$have_debug) { + --echo SET STATEMENT debug_dbug='+d,ib_free_page_sleep' FOR + INSERT INTO t1 VALUES(REPEAT(1, 8459264)); +} + +--error 0,ER_UNKNOWN_SYSTEM_VARIABLE +SET @@GLOBAL.debug_dbug=@save_dbug; + +SELECT length(f1) FROM t1; +DROP TABLE t1; + --echo # End of 10.6 tests --echo # @@ -495,3 +541,54 @@ CREATE TABLE t (a CHAR CHARACTER SET utf8) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; INSERT t SELECT left(seq,1) FROM seq_1_to_43691; DROP TABLE t; + +--echo # +--echo # MDEV-32453 Bulk insert fails to apply when trigger +--echo # does insert operation +--echo # +CREATE TABLE t(c INT)ENGINE=InnoDB; +CREATE TRIGGER t2_ai AFTER INSERT ON t FOR EACH ROW SET @a:=(SELECT * FROM t); +BEGIN; +--error ER_SUBQUERY_NO_1_ROW +INSERT INTO t VALUES (1),(1); +COMMIT; +DROP TABLE t; + +--echo # +--echo # MDEV-33868 Assertion `trx->bulk_insert' failed in +--echo # innodb_prepare_commit_versioned +--echo # +CREATE TABLE t (id INT) ENGINE=InnoDB; +--replace_result $MYSQLTEST_VARDIR VARDIR +--disable_ps2_protocol +eval select 1 into outfile "$MYSQLTEST_VARDIR/tmp/t.outfile"; +--enable_ps2_protocol +BEGIN; +--replace_result $MYSQLTEST_VARDIR VARDIR +eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/t.outfile' INTO TABLE t; +COMMIT; +DROP TABLE t; +--remove_file $MYSQLTEST_VARDIR/tmp/t.outfile + +--echo # +--echo # MDEV-33934 Assertion `!check_foreigns' failed in +--echo # trx_t::bulk_insert_apply_for_table(dict_table_t*) +--echo # +CREATE TABLE t1(f1 INT,f2 INT,KEY(f1))engine=innodb; +BEGIN; +INSERT INTO t1 VALUES(); +SET STATEMENT FOREIGN_KEY_CHECKS=1 FOR SELECT * FROM t1; +COMMIT; +DROP TABLE t1; + +--echo # +--echo # MDEV-33970 Assertion `!m.first->second.is_bulk_insert()' +--echo # failed in trx_undo_report_row_operation() +--echo # +CREATE TABLE t1(c1 INT,c2 CHAR) ENGINE=INNODB PARTITION BY KEY(c1) PARTITIONS 2; +begin; +INSERT INTO t1 VALUES(2,0); +DELETE FROM t1; +commit; +DROP TABLE t1; +--echo # End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,6 +3,9 @@ let $datadir=`select @@datadir`; +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + --echo # --echo # MDEV-11369: Instant ADD COLUMN for InnoDB --echo # @@ -964,3 +967,4 @@ copy_file std_data/mysql_upgrade/mdev28822_100427_innodb.frm $datadir/test/mdev28822_100427_innodb.frm; ALTER TABLE mdev28822_100427_innodb ADD i1 INTEGER, ALGORITHM=INSTANT; DROP TABLE mdev28822_100427_innodb; +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_bugs.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_bugs.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_bugs.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_bugs.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,8 @@ --source include/have_innodb.inc +--source include/have_sequence.inc + +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; --echo # --echo # MDEV-17821 Assertion `!page_rec_is_supremum(rec)' failed @@ -526,4 +530,32 @@ ALTER TABLE t1 ADD COLUMN i INT GENERATED ALWAYS AS (1), DROP COLUMN i; DROP TABLE t1; +--echo # +--echo # MDEV-18322 Assertion "wrong_page_type" on instant ALTER +--echo # + +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE c TEXT + DEFAULT(SELECT CONCAT('CREATE TABLE t1 (c', + GROUP_CONCAT(seq SEPARATOR ' CHAR(200), c'), + ' CHAR(211)) ENGINE=InnoDB ROW_FORMAT=REDUNDANT') + FROM seq_1_to_40); + EXECUTE IMMEDIATE c; +END; +$$ +DELIMITER ;$$ +INSERT INTO t1 SET c1=NULL; +--error ER_TOO_BIG_ROWSIZE +ALTER TABLE t1 ADD c41 INT FIRST; +--error ER_TOO_BIG_ROWSIZE +ALTER TABLE t1 ADD c41 INT FIRST; +CHECK TABLE t1; +SELECT COUNT(*) FROM t1; +DROP TABLE t1; + --echo # End of 10.4 tests + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + +--echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_crash.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_crash.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ --echo # CREATE TABLE t1(id INT PRIMARY KEY, c2 INT UNIQUE) -ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +ENGINE=InnoDB STATS_PERSISTENT=0 ROW_FORMAT=REDUNDANT; CREATE TABLE t2 LIKE t1; INSERT INTO t1 VALUES(0,2); INSERT INTO t2 VALUES(2,1); @@ -230,29 +230,3 @@ DROP TABLE t1,t2; --list_files $MYSQLD_DATADIR/test - ---echo # ---echo # MDEV-26198 Assertion `0' failed in row_log_table_apply_op during ---echo # ADD PRIMARY KEY or OPTIMIZE TABLE ---echo # -CREATE TABLE t1(f1 year default null, f2 year default null, - f3 text, f4 year default null, f5 year default null, - f6 year default null, f7 year default null, - f8 year default null)ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -INSERT INTO t1 VALUES(1, 1, 1, 1, 1, 1, 1, 1); -ALTER TABLE t1 ADD COLUMN f9 year default null, ALGORITHM=INPLACE; -set DEBUG_SYNC="row_log_table_apply1_before SIGNAL con1_insert WAIT_FOR con1_finish"; -send ALTER TABLE t1 ROW_FORMAT=REDUNDANT, ADD COLUMN f10 YEAR DEFAULT NULL, ALGORITHM=INPLACE; - -connect(con1,localhost,root,,,); -SET DEBUG_SYNC="now WAIT_FOR con1_insert"; -INSERT IGNORE INTO t1 (f3) VALUES ( 'b' ); -INSERT IGNORE INTO t1 (f3) VALUES ( 'l' ); -SET DEBUG_SYNC="now SIGNAL con1_finish"; - -connection default; -reap; -disconnect con1; -SET DEBUG_SYNC=RESET; -CHECK TABLE t1; -DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,6 +3,9 @@ --source include/have_debug_sync.inc --source include/have_sequence.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + SET @old_instant= (SELECT variable_value FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'); @@ -548,11 +551,62 @@ --error ER_LOCK_WAIT_TIMEOUT INSERT INTO t1 VALUES(1, 2); SET DEBUG_SYNC="now SIGNAL alter_progress"; -disconnect con1; connection default; reap; DROP TABLE t1; + +--echo # +--echo # MDEV-26198 Assertion `0' failed in row_log_table_apply_op during +--echo # ADD PRIMARY KEY or OPTIMIZE TABLE +--echo # +CREATE TABLE t1(f1 year default null, f2 year default null, + f3 text, f4 year default null, f5 year default null, + f6 year default null, f7 year default null, + f8 year default null)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 1, 1, 1, 1, 1, 1, 1); +ALTER TABLE t1 ADD COLUMN f9 year default null, ALGORITHM=INPLACE; +set DEBUG_SYNC="row_log_table_apply1_before SIGNAL con1_insert WAIT_FOR con1_finish"; +send ALTER TABLE t1 ADD COLUMN f10 YEAR DEFAULT NULL, FORCE, ALGORITHM=INPLACE; + +connection con1; +SET DEBUG_SYNC="now WAIT_FOR con1_insert"; +INSERT IGNORE INTO t1 (f3) VALUES ( 'b' ); +INSERT IGNORE INTO t1 (f3) VALUES ( 'l' ); +SET DEBUG_SYNC="now SIGNAL con1_finish"; + +connection default; +reap; +CHECK TABLE t1; +DROP TABLE t1; + +--echo # +--echo # MDEV-19044 Alter table corrupts while applying the +--echo # modification log +--echo # +CREATE TABLE t1 ( + f1 INT, + f2 INT, + f3 char(19) CHARACTER SET utf8mb3, + f4 VARCHAR(500), + f5 TEXT)ENGINE=InnoDB; +INSERT INTO t1 VALUES(3, 1, REPEAT('a', 2), REPEAT("b", 20),'a'); +ALTER TABLE t1 ADD COLUMN f6 INT NOT NULL, ALGORITHM=INSTANT; +INSERT INTO t1 VALUES(1, 2, REPEAT('InnoDB', 2), + REPEAT("MariaDB", 20), REPEAT('a', 8000), 12); +INSERT INTO t1 VALUES(1, 2, REPEAT('MYSQL', 2), + REPEAT("MariaDB", 20), REPEAT('a', 8000), 12); +SET DEBUG_SYNC='innodb_inplace_alter_table_enter SIGNAL con1_begin WAIT_FOR con1_update'; +send ALTER TABLE t1 MODIFY COLUMN f2 INT NOT NULL, FORCE, ALGORITHM=INPLACE; +connection con1; +SET DEBUG_SYNC='now WAIT_FOR con1_begin'; +UPDATE t1 SET f2=204 order by f1 limit 2; +SET DEBUG_SYNC='now SIGNAL con1_update'; +connection default; +reap; +disconnect con1; SET DEBUG_SYNC=reset; +CHECK TABLE t1; +DROP TABLE t1; --echo # End of 10.4 tests @@ -607,3 +661,7 @@ SELECT variable_value-@old_instant instants FROM information_schema.global_status WHERE variable_name = 'innodb_instant_alter_column'; + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + +--echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_extend.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_extend.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_extend.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_extend.test 2024-08-03 07:29:58.000000000 +0000 @@ -256,3 +256,16 @@ check table t1; drop database best; + +--echo # +--echo # MDEV-33214 Table is getting rebuild with +--echo # ALTER TABLE ADD COLUMN +--echo # +use test; +CREATE TABLE t1(f1 INT, f2 VARCHAR(10)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; +INSERT INTO t1 VALUES(1,'abc'),(2,'def'); +ALTER TABLE t1 ADD (f3 VARCHAR(5000), f4 VARCHAR(20)), ALGORITHM=instant; +ALTER TABLE t1 ADD f5 TEXT, ALGORITHM=INSTANT; +DROP TABLE t1; + +--echo # End of 10.4 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_import.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_import.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_import.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_import.test 2024-08-03 07:29:58.000000000 +0000 @@ -83,6 +83,7 @@ unlock tables; alter table t1 import tablespace; +--source include/restart_mysqld.inc select * from t1; --remove_file $MYSQLD_DATADIR/test/t1.ibd diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_purge.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_purge.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ START TRANSACTION WITH CONSISTENT SNAPSHOT; connection default; -CREATE TABLE t1 (f1 INT, f2 INT) ENGINE=InnoDB; +CREATE TABLE t1 (f1 INT, f2 INT) ENGINE=InnoDB STATS_PERSISTENT=0; INSERT INTO t1 () VALUES (); ALTER TABLE t1 DROP f2, ADD COLUMN f2 INT; ALTER TABLE t1 DROP f1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_rollback.test mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_rollback.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/instant_alter_rollback.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/instant_alter_rollback.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,6 +3,8 @@ # The embedded server tests do not support restarting. --source include/not_embedded.inc +SET GLOBAL innodb_stats_persistent = 0; + # Flush any open myisam tables from previous tests FLUSH TABLES; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/lock_insert_into_empty.test mariadb-10.11.9/mysql-test/suite/innodb/t/lock_insert_into_empty.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/lock_insert_into_empty.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/lock_insert_into_empty.test 2024-08-03 07:29:58.000000000 +0000 @@ -51,6 +51,7 @@ INSERT INTO t1 SET k=1; START TRANSACTION; INSERT INTO t1 SET k=2; +SELECT count(*) > 0 FROM mysql.innodb_index_stats lock in share mode; --connect (con1,localhost,root,,test) SET innodb_lock_wait_timeout=0; @@ -59,5 +60,6 @@ AS SELECT k FROM t1; --disconnect con1 --connection default - +SET innodb_lock_wait_timeout=default; DROP TABLE t1; +DROP TABLE IF EXISTS t2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/lock_isolation.test mariadb-10.11.9/mysql-test/suite/innodb/t/lock_isolation.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/lock_isolation.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/lock_isolation.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,183 @@ +--source include/have_innodb.inc + +--echo # +--echo # MDEV-26642 Weird SELECT view when a record is +--echo # modified to the same value by two transactions +--echo # MDEV-32898 Phantom rows caused by updates of PRIMARY KEY +--echo # + +CREATE TABLE t(a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t VALUES (1,1),(2,2); +BEGIN; SELECT * FROM t LOCK IN SHARE MODE; +--connect con_weird,localhost,root +BEGIN; +SELECT * FROM t; +--connect consistent,localhost,root +SET innodb_snapshot_isolation=ON; +BEGIN; +SELECT * FROM t; +--connection default +UPDATE t SET a=3 WHERE b=2; +COMMIT; +--connection consistent +--error ER_CHECKREAD +UPDATE t SET b=3; +SELECT * FROM t; +COMMIT; +--connection con_weird +UPDATE t SET b=3; +SELECT * FROM t; +COMMIT; +--connection default +SELECT * FROM t; +DROP TABLE t; + +--echo # +--echo # MDEV-26643 Inconsistent behaviors of UPDATE under +--echo # READ UNCOMMITTED and READ COMMITTED isolation level +--echo # + +CREATE TABLE t(a INT, b INT) ENGINE=InnoDB; +INSERT INTO t VALUES(NULL, 1), (2, 2); +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +BEGIN; UPDATE t SET a = 10; + +--connection consistent +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--send UPDATE t SET b = 20 WHERE a + +--connection default +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = 'Updating' + and info = 'UPDATE t SET b = 20 WHERE a'; +--source include/wait_condition.inc + +COMMIT; + +--connection consistent +--reap +SELECT * FROM t; + +--connection default +TRUNCATE TABLE t; +INSERT INTO t VALUES(NULL, 1), (2, 2); +BEGIN; UPDATE t SET a = 10; + +--connection consistent +SET TRANSACTION ISOLATION LEVEL READ COMMITTED; +--send UPDATE t SET b = 20 WHERE a + +--connection default +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where info = 'UPDATE t SET b = 20 WHERE a'; +--source include/wait_condition.inc + +COMMIT; + +--connection consistent +--reap +SELECT * FROM t; + +--connection default +TRUNCATE TABLE t; +INSERT INTO t VALUES(NULL, 1), (2, 2); +BEGIN; UPDATE t SET a = 10; + +--connection con_weird +SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +send UPDATE t SET b = 20 WHERE a; + +--connection default +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = 'Updating' + and info = 'UPDATE t SET b = 20 WHERE a'; +--source include/wait_condition.inc + +SELECT * FROM t; +COMMIT; + +--connection con_weird +--reap +COMMIT; + +--connection default +SELECT * FROM t; +TRUNCATE TABLE t; + +--echo # +--echo # MDEV-34108 Inappropriate semi-consistent read in snapshot isolation +--echo # +INSERT INTO t VALUES(NULL, 1), (1, 1); +BEGIN; +UPDATE t SET b = 3; + +--connection consistent +SET TRANSACTION ISOLATION LEVEL READ COMMITTED; +BEGIN; +# As semi-consistent read is disabled for innodb_snapshot_isolation=ON, the +# following UPDATE must be blocked on the first record. +--send UPDATE t SET b = 2 WHERE a + +--connection default +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = 'Updating' and info = 'UPDATE t SET b = 2 WHERE a'; +--source include/wait_condition.inc + +UPDATE t SET a = 1; +COMMIT; +--connection consistent +# If the bug wouldn't be fixed, the result would be (1,3),(1,2), because +# "UPDATE t SET b = 2 WHERE a" would be blocked on the second (1,3) record, +# as semi-consistent read would filter out the first (null,3) record without +# blocking. +--reap +COMMIT; + +--connection default +SELECT * FROM t; +DROP TABLE t; + +--echo # +--echo # MDEV-33802 Weird read view after ROLLBACK of other transactions +--echo # + +CREATE TABLE t(a INT PRIMARY KEY, b INT UNIQUE) ENGINE=InnoDB; +INSERT INTO t SET a=1; + +BEGIN; INSERT INTO t SET a=2; + +--connection consistent +START TRANSACTION WITH CONSISTENT SNAPSHOT; +--disable_ps2_protocol +--error ER_CHECKREAD +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; +--enable_ps2_protocol + +--connection con_weird +START TRANSACTION WITH CONSISTENT SNAPSHOT; +send +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; + +--connection default +let $wait_condition= + select count(*) = 1 from information_schema.processlist + where state = 'Sending data' + and info LIKE 'SELECT * FROM t %'; +--source include/wait_condition.inc +ROLLBACK; + +--connection con_weird +--reap +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; +--disconnect con_weird + +--connection consistent +SELECT * FROM t FORCE INDEX (b) FOR UPDATE; +--disconnect consistent + +--connection default +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/lock_memory.test mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/lock_memory.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,29 @@ +--source include/have_innodb.inc +--source include/have_innodb_16k.inc + +--echo # +--echo # MDEV-28800 SIGABRT due to running out of memory for InnoDB locks +--echo # + +CREATE TABLE t1 (col1 INT) ENGINE=InnoDB; + +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; + +START TRANSACTION; + +# Insert 64K records +INSERT INTO t1 SELECT a.* FROM t1 a, t1 b, t1 c, t1 d; + +# The check needs to be adjusted if we start using more memory for locks. It +# needs 9 pages for 16k page size and we put the limit as 10. +SELECT CASE WHEN (POOL_SIZE - (FREE_BUFFERS + DATABASE_PAGES)) <= 10 THEN "PASSED" + ELSE (POOL_SIZE - (FREE_BUFFERS + DATABASE_PAGES)) END +FROM information_schema.innodb_buffer_pool_stats; + +COMMIT; + +SELECT COUNT(*) FROM t1; + +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/lock_memory_debug.opt mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory_debug.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/lock_memory_debug.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory_debug.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb_buffer_pool_size=5M diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/lock_memory_debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory_debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/lock_memory_debug.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/lock_memory_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,19 @@ +--source include/have_innodb.inc +--source include/have_debug.inc + +--echo # +--echo # MDEV-34166 Server could hang with BP < 80M under stress +--echo # + +call mtr.add_suppression("\\[Warning\\] InnoDB: Over 67 percent of the buffer pool"); + +CREATE TABLE t1 (col1 INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1),(2),(3),(4),(5); + +--error ER_LOCK_TABLE_FULL +SET STATEMENT debug_dbug='+d,innodb_skip_lock_bitmap' FOR +INSERT INTO t1 SELECT a.* FROM t1 a, t1 b, t1 c, t1 d, t1 e, t1 f, t1 g LIMIT 45000; + +SELECT COUNT(*) FROM t1; + +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/lock_move_wait_lock_race.test mariadb-10.11.9/mysql-test/suite/innodb/t/lock_move_wait_lock_race.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/lock_move_wait_lock_race.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/lock_move_wait_lock_race.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,8 @@ --source include/have_debug.inc --source include/have_debug_sync.inc -CREATE TABLE t (pk int PRIMARY KEY, c varchar(10)) ENGINE=InnoDB; +CREATE TABLE t (pk int PRIMARY KEY, c varchar(10)) +STATS_PERSISTENT=0 ENGINE=InnoDB; INSERT INTO t VALUES (10, "0123456789"); --connection default diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/lock_release.test mariadb-10.11.9/mysql-test/suite/innodb/t/lock_release.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/lock_release.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/lock_release.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,26 @@ +--source include/have_innodb.inc +--source include/have_partition.inc + +--echo # +--echo # MDEV-34542 Assertion `lock_trx_has_sys_table_locks(trx) == __null' +--echo # failed in void row_mysql_unfreeze_data_dictionary(trx_t*) +--echo # +--echo # +CREATE TABLE t1 (c1 CHAR(1) ,c2 INT) ENGINE=INNODB + PARTITION BY LINEAR HASH ((c2)) PARTITIONS 512; +CREATE TABLE t2 (a INT) ENGINE=INNODB; + +set @old_table_open_cache= @@table_open_cache; +XA START 'a'; +INSERT INTO mysql.innodb_index_stats SELECT * FROM mysql.innodb_index_stats WHERE table_name=''; +SET GLOBAL table_open_cache=10; +INSERT into t2 (a) VALUES (1); +SELECT * FROM t1; +XA END 'a'; +XA PREPARE 'a'; +# Added sleep to make sure that InnoDB main thread is to remove +# the innodb_index_stats from table cache +SELECT sleep(3); +XA ROLLBACK 'a'; +DROP TABLE t1, t2; +SET GLOBAL table_open_cache=@old_table_open_cache; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/log_file.test mariadb-10.11.9/mysql-test/suite/innodb/t/log_file.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/log_file.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/log_file.test 2024-08-03 07:29:58.000000000 +0000 @@ -210,8 +210,20 @@ eval $check_yes_innodb; --source include/shutdown_mysqld.inc ---let $restart_parameters= +--let $restart_parameters=--innodb-log-write-ahead-size=513 --source include/start_mysqld.inc +eval $check_no_innodb; +--source include/shutdown_mysqld.inc + +--let $restart_parameters=--innodb-log-write-ahead-size=4095 +--source include/start_mysqld.inc +eval $check_no_innodb; +--source include/shutdown_mysqld.inc + +# this will be silently truncated to the maximum +--let $restart_parameters=--innodb-log-write-ahead-size=10000 +--source include/start_mysqld.inc +SELECT @@innodb_log_write_ahead_size; --echo # Cleanup --list_files $bugdir diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/log_file_name.test mariadb-10.11.9/mysql-test/suite/innodb/t/log_file_name.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/log_file_name.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/log_file_name.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,6 +7,8 @@ # Embedded server does not support crashing --source include/not_embedded.inc +call mtr.add_suppression("InnoDB: Header page consists of zero bytes in datafile:"); + SET GLOBAL innodb_file_per_table=ON; FLUSH TABLES; @@ -171,6 +173,9 @@ call mtr.add_suppression("Plugin 'InnoDB' \(init function returned error\|registration as a STORAGE ENGINE failed\)"); call mtr.add_suppression("InnoDB: Table test/u[123] in the InnoDB data dictionary has tablespace id [1-9][0-9]*, but tablespace with that id or name does not exist\\. Have you deleted or moved \\.ibd files\\?"); call mtr.add_suppression("InnoDB: Cannot replay rename of tablespace.*"); +call mtr.add_suppression("InnoDB: Attempted to open a previously opened tablespace"); +call mtr.add_suppression("InnoDB: Recovery cannot access file"); +call mtr.add_suppression("InnoDB: Cannot read first page in datafile:"); FLUSH TABLES; --enable_query_log @@ -201,7 +206,7 @@ close(FILE); EOF ---exec echo "" > $MYSQLD_DATADIR/test/u2.ibd +--write_line "" $MYSQLD_DATADIR/test/u2.ibd --copy_file $MYSQLD_DATADIR/test/u6.ibd $MYSQLD_DATADIR/test/u4.ibd diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/log_file_overwrite.test mariadb-10.11.9/mysql-test/suite/innodb/t/log_file_overwrite.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/log_file_overwrite.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/log_file_overwrite.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,31 @@ +--source include/have_innodb.inc +--source include/have_sequence.inc +--source include/have_debug.inc + +call mtr.add_suppression("InnoDB: Plugin initialization aborted"); +call mtr.add_suppression("plugin 'InnoDB' registration as a STORAGE ENGINE failed."); +CREATE TABLE t1(f1 INT NOT NULL, f2 TEXT)ENGINE=InnoDB; +let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0; +--source include/restart_mysqld.inc +INSERT INTO t1 SELECT seq, repeat('a', 4000) FROM seq_1_to_1800; +let $restart_parameters=--debug_dbug=+d,before_final_redo_apply --innodb_log_file_size=8M; +let $shutdown_timeout=0; +--source include/restart_mysqld.inc +let $restart_parameters=--innodb_log_file_size=10M; +let $shutdown_timeout=; +--source include/restart_mysqld.inc + +--echo # +--echo # MDEV-34519 innodb_log_checkpoint_now crashes when +--echo # innodb_read_only is enabled +--echo # +--let $restart_parameters=--innodb-force-recovery=6 +--source include/restart_mysqld.inc +SET GLOBAL innodb_log_checkpoint_now=1; +--let $restart_parameters=--innodb-read-only=1 +--source include/restart_mysqld.inc +SET GLOBAL innodb_log_checkpoint_now=1; +let $restart_parameters=; +--source include/restart_mysqld.inc + +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/log_upgrade_101_flags.test mariadb-10.11.9/mysql-test/suite/innodb/t/log_upgrade_101_flags.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/log_upgrade_101_flags.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/log_upgrade_101_flags.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,91 @@ +--source include/have_innodb.inc +--source include/big_test.inc +--source include/not_embedded.inc +call mtr.add_suppression("InnoDB: The change buffer is corrupted"); +call mtr.add_suppression("InnoDB: Tablespace size stored in header is 768 pages, but the sum of data file sizes is 384 pages"); +call mtr.add_suppression("InnoDB: adjusting FSP_SPACE_FLAGS of file"); +--source include/shutdown_mysqld.inc +let bugdir= $MYSQLTEST_VARDIR/tmp/log_upgrade; +--mkdir $bugdir +--let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $dirs= --innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir + +# Test case similar to log_upgrade.test +perl; +do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl"; +my $polynomial = 0x82f63b78; # CRC-32C + +die unless open OUT, ">", "$ENV{bugdir}/ibdata1"; +binmode OUT; + +my $head = pack("Nx[18]", 0); +# Add FSP_SPACE_FLAGS as 49152 (10.1.0...10.1.20), page_size = 32k +my $body = pack("x[8]Nx[4]Nx[2]Nx[32696]", 768, 49152, 97937874); +my $ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); +# Dummy pages 1..6. +print OUT chr(0) x (6 * 32768); +# Dictionary header page (page 7). +$head = pack("Nx[18]", 7); +$body = pack("x[32]Nx[8]Nx[32674]", 8, 9); +$ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); + +# Empty SYS_TABLES page (page 8). +$head = pack("NNNx[8]n", 8, ~0, ~0, 17855); +$body = pack("nnx[31]Cx[20]", 2, 124, 1); +$body .= pack("nxnn", 0x801, 3, 116) . "infimum"; +$body .= pack("xnxnxx", 0x901, 0x803) . "supremum"; +$body .= pack("x[32632]nn", 116, 101); +$ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); + +# Empty SYS_INDEXES page (page 9). +$head = pack("NNNx[8]n", 9, ~0, ~0, 17855); +$body = pack("nnx[31]Cx[20]", 2, 124, 3); +$body .= pack("nxnn", 0x801, 3, 116) . "infimum"; +$body .= pack("xnxnxx", 0x901, 0x803) . "supremum"; +$body .= pack("x[32632]nn", 116, 101); +$ck = mycrc32($head, 0, $polynomial) ^ mycrc32($body, 0, $polynomial); +print OUT pack("N",$ck).$head.pack("x[12]").$body.pack("Nx[4]",$ck); + +die unless seek(OUT, 768 * 16384 - 1, 0); +print OUT chr(0); +close OUT or die; + +die unless open OUT, ">", "$ENV{bugdir}/ib_logfile0"; +binmode OUT; +$_= pack("Nx[5]nx[5]", 1, 0x1286) . "BogoDB 4.3.2.1" . chr(0) x 478; +print OUT $_, pack("N", mycrc32($_, 0, $polynomial)); +# checkpoint page 1 and all-zero checkpoint 2 +$_= pack("x[13]nCNNx[484]", 0x1286, 12, 2, 0x80c); +print OUT $_, pack("N", mycrc32($_, 0, $polynomial)); +die unless seek(OUT, 0x1FFFFFFFF, 0); +print OUT chr(0); +close OUT or die; +die unless open OUT, ">", "$ENV{bugdir}/ib_logfile1"; +binmode OUT; +die unless seek(OUT, 0x800, 0); # the first 2048 bytes are unused! +$_= pack("Nnnx[500]", 0x80000944, 12, 12); +print OUT $_, pack("N", mycrc32($_, 0, $polynomial)); +die unless seek(OUT, 0x1FFFFFFFF, 0); +print OUT chr(0); +close OUT or die; +EOF + +--let $restart_parameters= $dirs --innodb-force-recovery=5 --innodb-log-file-size=4m --innodb_page_size=32k --innodb_buffer_pool_size=10M +--source include/start_mysqld.inc +SELECT COUNT(*) FROM INFORMATION_SCHEMA.ENGINES +WHERE engine = 'innodb' +AND support IN ('YES', 'DEFAULT', 'ENABLED'); +--source include/shutdown_mysqld.inc +--let SEARCH_PATTERN= InnoDB: Upgrading redo log: +--source include/search_pattern_in_file.inc +--let $restart_parameters= $dirs + +--remove_files_wildcard $bugdir +--rmdir $bugdir +--let $restart_parameters= +--source include/start_mysqld.inc + +--echo # End of 10.5 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/mdev-14846.test mariadb-10.11.9/mysql-test/suite/innodb/t/mdev-14846.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/mdev-14846.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/mdev-14846.test 2024-08-03 07:29:58.000000000 +0000 @@ -2,6 +2,8 @@ --source include/count_sessions.inc --source include/have_debug_sync.inc +--source include/innodb_stable_estimates.inc + CREATE TABLE t1 ( pk INT, f1 VARCHAR(10) NOT NULL, diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/mem_pressure.test mariadb-10.11.9/mysql-test/suite/innodb/t/mem_pressure.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/mem_pressure.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/mem_pressure.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,44 @@ +--source include/have_debug.inc +--source include/linux.inc +--source include/not_embedded.inc +--source include/have_innodb.inc +--source include/have_sequence.inc + +--echo # +--echo # MDEV-24670 avoid OOM by linux kernel co-operative memory management +--echo # + +set @save_dbug=@@debug_dbug; + +set @save_limit=@@GLOBAL.innodb_limit_optimistic_insert_debug; +# Wait for the undo logs to be empty from previous tests. +# This is not an actual parameter, so there is no need to restore it. +set GLOBAL innodb_max_purge_lag_wait=0; + +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +SET GLOBAL innodb_limit_optimistic_insert_debug=2; +SET STATEMENT unique_checks=0, foreign_key_checks=0 FOR +INSERT INTO t1 SELECT * FROM seq_1_to_1000; + +SET GLOBAL innodb_limit_optimistic_insert_debug=@save_limit; + +DROP TABLE t1; + +SELECT CAST(VARIABLE_VALUE AS INTEGER) INTO @dirty_prev +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty'; + +set debug_dbug="d,trigger_garbage_collection"; +SET GLOBAL innodb_buffer_pool_size=@@innodb_buffer_pool_size; + +SELECT CAST(VARIABLE_VALUE AS INTEGER) < @dirty_prev AS LESS_DIRTY_IS_GOOD +FROM INFORMATION_SCHEMA.GLOBAL_STATUS +WHERE VARIABLE_NAME='Innodb_buffer_pool_pages_dirty'; + +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +let SEARCH_PATTERN= InnoDB: Memory pressure event freed.*; +--source include/search_pattern_in_file.inc + +set debug_dbug=@save_dbug; + +--echo # End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/monitor.test mariadb-10.11.9/mysql-test/suite/innodb/t/monitor.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/monitor.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/monitor.test 2024-08-03 07:29:58.000000000 +0000 @@ -5,11 +5,11 @@ # sys_vars.innodb_monitor_enable_basic --source include/have_innodb.inc -# Test turn on/off the monitor counter with "all" option -# By default, they will be off. select name, if(enabled,'enabled','disabled') status from information_schema.innodb_metrics; +create temporary table orig_innodb_metrics as select name, enabled from information_schema.innodb_metrics; + set global innodb_monitor_disable = All; select name from information_schema.innodb_metrics where enabled; @@ -315,18 +315,22 @@ let $innodb_monitor_enable = `SELECT @@innodb_monitor_enable`; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*1*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; SET GLOBAL innodb_monitor_enable='module_buffer_page'; INSERT INTO t1 VALUES (1), (2), (3), (4); FLUSH TABLES t1 FOR EXPORT; UNLOCK TABLES; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME + +let $wait_condition= select count > 0 from information_schema.innodb_metrics where name like 'buffer_page_written_index_leaf'; +source include/wait_condition.inc; + +SELECT /*2*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; SET GLOBAL innodb_monitor_disable='module_buffer_page'; SET GLOBAL innodb_monitor_reset_all='module_buffer_page'; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*3*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; SET GLOBAL innodb_monitor_enable='%'; @@ -334,18 +338,22 @@ SET GLOBAL innodb_monitor_reset_all= '%', innodb_compression_algorithm= foo; INSERT INTO t1 VALUES (5), (6), (7), (8); FLUSH TABLES t1 FOR EXPORT; UNLOCK TABLES; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME + +let $wait_condition= select count > 0 from information_schema.innodb_metrics where name like 'buffer_page_written_index_leaf'; +source include/wait_condition.inc; + +SELECT /*4*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; SET GLOBAL innodb_monitor_disable='%'; SET GLOBAL innodb_monitor_reset_all='%'; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*5*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; SET GLOBAL innodb_monitor_enable='ALL'; INSERT INTO t1 VALUES (9), (10), (11), (12); FLUSH TABLES t1 FOR EXPORT; UNLOCK TABLES; -SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME +SELECT /*6*/ NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE 'buffer_page_written_index_leaf'; DROP TABLE t1; @@ -462,8 +470,36 @@ DROP TABLE fl1; DROP TABLE fl0; ---disable_warnings -SET GLOBAL innodb_monitor_enable=default; -SET GLOBAL innodb_monitor_disable=default; -SET GLOBAL innodb_monitor_reset_all=default; ---enable_warnings +set global innodb_monitor_disable = 'adaptive\\_hash\\_p%'; +set global innodb_monitor_disable = 'adaptive\\_hash\\_r%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_batch\\_n%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_batch\\_s%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_g%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_s%'; +set global innodb_monitor_disable = 'buffer\\_LRU\\_u%'; +set global innodb_monitor_disable = 'buffer\\_f%'; +set global innodb_monitor_disable = 'buffer\\_page\\_%'; +set global innodb_monitor_disable = 'c%'; +set global innodb_monitor_disable = 'ddl%'; +set global innodb_monitor_disable = 'icp%'; +set global innodb_monitor_disable = 'index\\_p%'; +set global innodb_monitor_disable = 'innodb\\_di%'; +set global innodb_monitor_disable = 'innodb\\_l%'; +set global innodb_monitor_disable = 'innodb\\_m%'; +set global innodb_monitor_disable = 'lock\\_re%'; +set global innodb_monitor_disable = 'lock\\_ta%'; +set global innodb_monitor_disable = 'log%'; +set global innodb_monitor_disable = 'm%'; +set global innodb_monitor_disable = 'p%'; +set global innodb_monitor_disable = 't%'; +set global innodb_monitor_enable = 'log\\_w%'; +set global innodb_monitor_enable = 'trx_rseg_history_len'; +set global innodb_monitor_enable = 'trx_undo_slots_cached'; + +set global innodb_monitor_enable=default; +set global innodb_monitor_disable=default; +set global innodb_monitor_reset_all=default; + +select name, orig.enabled, new.enabled from + orig_innodb_metrics orig join information_schema.innodb_metrics new using(name) + where orig.enabled != new.enabled; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/no_pad.test mariadb-10.11.9/mysql-test/suite/innodb/t/no_pad.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/no_pad.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/no_pad.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,3 +8,49 @@ INSERT INTO t1 VALUES ('',2); ALTER TABLE t1 ROW_FORMAT=REDUNDANT; DROP TABLE t1; + + +--echo # +--echo # MDEV-26743 InnoDB: CHAR+nopad does not work well +--echo # + +--echo # +--echo # Basic Latin letter vs equal accented letter +--echo # + +SET NAMES utf8mb3; +CREATE TABLE t1 (a CHAR(2), PRIMARY KEY(a)) COLLATE utf8_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +--error ER_DUP_ENTRY +INSERT INTO t1 VALUES ('a'),('ä'); +DROP TABLE t1; + +--echo # +--echo # Two letters vs equal (but space padded) expansion +--echo # + +CREATE TABLE t1 (a CHAR(2), PRIMARY KEY(a)) COLLATE utf8_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 VALUES ('ss'),('ß'); +SET sql_mode=PAD_CHAR_TO_FULL_LENGTH; +SELECT HEX(a) FROM t1; +SET sql_mode=DEFAULT; +DROP TABLE t1; + +--echo # +--echo # Basic Latin letter (but followed by an ignorable character) vs equal accented letter +--echo # + +SET NAMES utf8mb3; +CREATE TABLE t1 (a CHAR(3), PRIMARY KEY(a)) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 VALUES (CONCAT('a',_utf8mb3 0x01)),('ä'); +SET sql_mode=PAD_CHAR_TO_FULL_LENGTH; +SELECT HEX(a) FROM t1 ORDER BY HEX(a); +SET sql_mode=DEFAULT; +DROP TABLE t1; + +SET NAMES utf8mb3; +CREATE TABLE t1 (a CHAR(2), PRIMARY KEY(a)) COLLATE utf8_unicode_nopad_ci ENGINE=InnoDB ROW_FORMAT=COMPACT; +INSERT INTO t1 VALUES (CONCAT('a',_utf8mb3 0x01)),('ä'); +SET sql_mode=PAD_CHAR_TO_FULL_LENGTH; +SELECT HEX(a) FROM t1 ORDER BY HEX(a); +SET sql_mode=DEFAULT; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/open_files_limit.opt mariadb-10.11.9/mysql-test/suite/innodb/t/open_files_limit.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/open_files_limit.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/open_files_limit.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,3 @@ +--innodb_undo_tablespaces=8 +--innodb_open_files=10 +--innodb_temp_data_file_path=ibtmp1:32M;ibtmp2:32M:autoextend diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/open_files_limit.test mariadb-10.11.9/mysql-test/suite/innodb/t/open_files_limit.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/open_files_limit.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/open_files_limit.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,12 @@ +--source include/have_innodb.inc +--source include/not_embedded.inc +call mtr.add_suppression("\\[Warning\\] InnoDB: innodb_open_files=.* is not greater than the number of system tablespace files, temporary tablespace files, innodb_undo_tablespaces=.*"); +call mtr.add_suppression("\\[Warning\\] InnoDB: innodb_open_files=.* is exceeded \\(.* files stay open\\)"); +let SEARCH_PATTERN= \[Warning\] InnoDB: innodb_open_files=.* is not greater than the number of system tablespace files, temporary tablespace files, innodb_undo_tablespaces=.*; +let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; +--source include/search_pattern_in_file.inc + +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +DROP TABLE t1; +let $restart_parameters=--innodb_open_files=0; +--source include/restart_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/page_id_innochecksum.test mariadb-10.11.9/mysql-test/suite/innodb/t/page_id_innochecksum.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/page_id_innochecksum.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/page_id_innochecksum.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,7 +6,7 @@ let MYSQLD_DATADIR= `SELECT @@datadir`; let INNODB_PAGE_SIZE=`select @@innodb_page_size`; -create table t1(f1 int not null)engine=innodb; +create table t1(f1 int not null)engine=innodb stats_persistent=0; insert into t1 values(1), (2), (3); let $resultlog=$MYSQLTEST_VARDIR/tmp/result.log; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/purge.test mariadb-10.11.9/mysql-test/suite/innodb/t/purge.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,9 @@ --source include/have_innodb.inc --source include/have_innodb_16k.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + --echo # Bug #12429576 - Test an assertion failure on purge. CREATE TABLE t1_purge ( A int, @@ -110,4 +113,6 @@ # We need to activate the purge thread before DROP TABLE. -- source include/wait_all_purged.inc + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; DROP TABLE t1_purge, t2_purge, t3_purge, t4_purge, t12637786, t12963823; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/purge_secondary.test mariadb-10.11.9/mysql-test/suite/innodb/t/purge_secondary.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/purge_secondary.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/purge_secondary.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,9 +1,8 @@ --source include/have_innodb.inc --source include/have_sequence.inc ---disable_query_log -call mtr.add_suppression("InnoDB: Difficult to find free blocks in the buffer pool"); ---enable_query_log +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; CREATE TABLE t1 ( a SERIAL, b CHAR(255) NOT NULL DEFAULT '', c BOOLEAN DEFAULT false, @@ -170,3 +169,7 @@ DROP TABLE t1; --echo # End of 10.3 tests + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; + +--echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/purge_thread_shutdown.test mariadb-10.11.9/mysql-test/suite/innodb/t/purge_thread_shutdown.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/purge_thread_shutdown.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/purge_thread_shutdown.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ -source include/have_innodb.inc; -source include/not_embedded.inc; -source include/have_debug.inc; - -connect con1, localhost, root; -create table t1 (a int) engine=innodb; -insert t1 values (1),(2),(3),(4); -delete from t1 where a=1; - -select user,state from information_schema.processlist order by 2; - -set global debug_dbug='+d,only_kill_system_threads'; -set global innodb_fast_shutdown=0; - ---let $_expect_file_name= `select regexp_replace(@@tmpdir, '^.*/','')` ---let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/$_expect_file_name.expect -exec echo "wait" > $_expect_file_name; -send shutdown; - -connection default; -disconnect con1; - -sleep 5; -select user,state from information_schema.processlist order by 2; -set global innodb_fast_shutdown=1; - -let $wait_condition=select count(*) = 0 from information_schema.processlist where user='system user'; -source include/wait_condition.inc; -select user,state from information_schema.processlist order by 2; - -delete from t1 where a=3; -error ER_WRONG_VALUE_FOR_VAR; -set global innodb_fast_shutdown=0; - -# Get id with space prefix to ensure that replace_result doesn't replace -# the error code -let $me=`select concat(' ', connection_id())`; -replace_result $me ID; -error ER_CONNECTION_KILLED, 2026; -eval kill $me; - -source include/start_mysqld.inc; -drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/read_only_recovery.test mariadb-10.11.9/mysql-test/suite/innodb/t/read_only_recovery.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/read_only_recovery.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/read_only_recovery.test 2024-08-03 07:29:58.000000000 +0000 @@ -39,6 +39,8 @@ SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t; SET GLOBAL innodb_max_purge_lag_wait=0; +INSERT INTO mysql.innodb_index_stats +SELECT * FROM mysql.innodb_index_stats LIMIT 0; --let $restart_parameters= --source include/restart_mysqld.inc SELECT * FROM t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/records_in_range.test mariadb-10.11.9/mysql-test/suite/innodb/t/records_in_range.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/records_in_range.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/records_in_range.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,432 @@ +# +# Test btr_estimate_n_rows_in_range() which is used by +# ha_innobase::records_in_range() +# + +-- source include/have_debug.inc +-- source include/have_innodb.inc +-- source include/innodb_page_size_small.inc + +CREATE TABLE records_in_range_test ( + c1 VARCHAR(16), + c2 VARCHAR(512), + PRIMARY KEY (c1) +) ENGINE=INNODB STATS_PERSISTENT=1; + +# Insert some records so that they cannot fit in one page for some page sizes +# in order to exercise records_in_range() where 1, 2 or more pages are sampled +INSERT INTO records_in_range_test VALUES +('ccc', REPEAT('v', 512)), +('kkk01', REPEAT('v', 512)), +('kkk02', REPEAT('v', 512)), +('kkk03', REPEAT('v', 512)), +('kkk04', REPEAT('v', 512)), +('kkk05', REPEAT('v', 512)), +('kkk06', REPEAT('v', 512)), +('kkk07', REPEAT('v', 512)), +('kkk08', REPEAT('v', 512)), +('mmm', REPEAT('v', 512)), +('nnn', REPEAT('v', 512)), +('uuu01', REPEAT('v', 512)), +('uuu02', REPEAT('v', 512)), +('uuu03', REPEAT('v', 512)), +('uuu04', REPEAT('v', 512)), +('uuu05', REPEAT('v', 512)), +('uuu06', REPEAT('v', 512)), +('uuu07', REPEAT('v', 512)), +('uuu08', REPEAT('v', 512)), +('xxx', REPEAT('v', 512)); + +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE records_in_range_test; + +# 16k or bigger page size: 1 leaf page +# 8k page size: 2 leaf pages +# 4k page size: 4 leaf pages +SELECT index_name, stat_name, stat_value +FROM mysql.innodb_index_stats +WHERE +table_name='records_in_range_test' AND stat_name = 'n_leaf_pages'; + +# 16k or bigger page size: 1 page in total (leaf + nonleaf) +# 8k page size: 3 pages in total (leaf + nonleaf) +# 4k page size: 5 pages in total (leaf + nonleaf) +SELECT index_name, stat_name, stat_value +FROM mysql.innodb_index_stats +WHERE +table_name='records_in_range_test' AND stat_name = 'size'; + +# We exploit the warning mechanism here to display the return value from +# btr_estimate_n_rows_in_range() +SET @save_dbug = @@debug_dbug; +SET DEBUG_DBUG='+d,print_btr_estimate_n_rows_in_range_return_value'; + +-- echo +-- echo In all SELECTs below the number of the records in the range returned +-- echo by COUNT(*) must be the same as the number returned by +-- echo btr_estimate_n_rows_in_range() which can be seen inside the artificial +-- echo warning + +-- echo +-- echo Test left-unbounded, right-open intervals +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'aaa'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 < 'zzz'; + +-- echo +-- echo Test left-unbounded, right-closed intervals +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'aaa'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 <= 'zzz'; + +-- echo +-- echo Test left-open, right-unbounded intervals +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz'; + +-- echo +-- echo Test left-closed, right-unbounded intervals +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz'; + +-- echo +-- echo Test left-open, right-open intervals +-- echo In some cases here the optimizer is smart enough not to call +-- echo ha_innobase::records_in_range() at all, so we get no warning containing +-- echo the value returned from btr_estimate_n_rows_in_range() +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 < 'zzz'; + +-- echo +-- echo Test left-closed, right-open intervals +-- echo In some cases here the optimizer is smart enough not to call +-- echo ha_innobase::records_in_range() at all, so we get no warning containing +-- echo the value returned from btr_estimate_n_rows_in_range() +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 < 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 < 'zzz'; + +-- echo +-- echo Test left-open, right-closed intervals +-- echo In some cases here the optimizer is smart enough not to call +-- echo ha_innobase::records_in_range() at all, so we get no warning containing +-- echo the value returned from btr_estimate_n_rows_in_range() +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'aaa' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'ccc' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'eee' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'mmm' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'nnn' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'qqq' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'xxx' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 > 'zzz' AND c1 <= 'zzz'; + +-- echo +-- echo Test left-closed, right-closed intervals +-- echo In some cases here the optimizer is smart enough not to call +-- echo ha_innobase::records_in_range() at all, so we get no warning containing +-- echo the value returned from btr_estimate_n_rows_in_range() +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'aaa' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'ccc' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'eee' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'mmm' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'nnn' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'qqq' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'xxx' AND c1 <= 'zzz'; +-- echo +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'bbb'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'ccc'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'eee'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'mmm'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'nnn'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'qqq'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'xxx'; +SELECT COUNT(*) FROM records_in_range_test WHERE c1 >= 'zzz' AND c1 <= 'zzz'; + +SET DEBUG_DBUG = @save_dbug; + +DROP TABLE records_in_range_test; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/recovery_memory.test mariadb-10.11.9/mysql-test/suite/innodb/t/recovery_memory.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/recovery_memory.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/recovery_memory.test 2024-08-03 07:29:58.000000000 +0000 @@ -33,7 +33,7 @@ --echo # if ($have_debug) { SET DEBUG_DBUG="+d,ib_log_checkpoint_avoid_hard"; -let $restart_parameters=--innodb_buffer_pool_size=5242880 --debug_dbug="+d,ibuf_init_corrupt"; +let $restart_parameters=--innodb_buffer_pool_size=5242880 --debug_dbug=+d,ibuf_init_corrupt; } if (!$have_debug) { --echo SET DEBUG_DBUG="+d,ib_log_checkpoint_avoid_hard"; @@ -44,6 +44,11 @@ let $restart_noprint=1; let $shutdown_timeout=0; --source include/restart_mysqld.inc +if ($have_debug) { +let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err; +let SEARCH_PATTERN=\[ERROR\] InnoDB: The change buffer is corrupted or has been removed on upgrade to MariaDB 11.0 or later; +--source include/search_pattern_in_file.inc +} let $restart_noprint=0; let $restart_parameters=; --source include/restart_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/rename_table.test mariadb-10.11.9/mysql-test/suite/innodb/t/rename_table.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/rename_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/rename_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -32,17 +32,22 @@ DROP DATABASE abc_def2; -call mtr.add_suppression("InnoDB: (Operating system error|Error number \\d+ means|Cannot rename file)"); +call mtr.add_suppression("InnoDB: Cannot rename '.*t1.ibd' to '.*non_existing_db.*' because the target schema directory doesn't exist"); CREATE TABLE t1 (a INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES(100); --replace_result "\\" "/" --error ER_ERROR_ON_RENAME RENAME TABLE t1 TO non_existing_db.t1; ---let SEARCH_PATTERN= \[ERROR\] InnoDB: Cannot rename file '.*t1\.ibd' to '.*non_existing_db +--let SEARCH_PATTERN= \[ERROR\] InnoDB: Cannot rename '.*t1\.ibd' to '.*non_existing_db let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; --source include/search_pattern_in_file.inc +SET GLOBAL innodb_fast_shutdown=2; +--source include/restart_mysqld.inc + +SELECT * FROM t1; # Cleanup DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/row_format_redundant.opt mariadb-10.11.9/mysql-test/suite/innodb/t/row_format_redundant.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/row_format_redundant.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/row_format_redundant.opt 2024-08-03 07:29:58.000000000 +0000 @@ -1 +1,3 @@ --innodb-checksum-algorithm=crc32 +--skip-innodb-fast-shutdown +--skip-innodb-buffer-pool-dump-at-shutdown diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/row_format_redundant.test mariadb-10.11.9/mysql-test/suite/innodb/t/row_format_redundant.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/row_format_redundant.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/row_format_redundant.test 2024-08-03 07:29:58.000000000 +0000 @@ -16,11 +16,14 @@ let bugdir= $MYSQLTEST_VARDIR/tmp/row_format_redundant; --mkdir $bugdir +let undodir= $MYSQLTEST_VARDIR/tmp/undo_dir; +--mkdir $undodir + --let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err --let $d=--innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir --let $d=$d --innodb-data-file-path=ibdata1:1M:autoextend ---let $d=$d --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 +--let $d=$d --innodb_undo_directory=$undodir --innodb-undo-tablespaces=0 --innodb-stats-persistent=0 --let $restart_parameters= $d # Ensure that any DDL records from previous tests have been purged. SET GLOBAL innodb_fast_shutdown=0; @@ -159,6 +162,7 @@ --list_files $bugdir --remove_files_wildcard $bugdir --rmdir $bugdir +--rmdir $undodir # Remove the data file, because DROP TABLE skipped it for the "corrupted" table --let MYSQLD_DATADIR=`select @@datadir` diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test mariadb-10.11.9/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,7 +1,7 @@ --source include/have_innodb.inc --source include/have_sequence.inc --source include/innodb_page_size_small.inc ---source include/have_normal_bzip.inc +--source include/have_normal_zlib.inc call mtr.add_suppression("InnoDB: Cannot add field .* in table .* because after adding it, the row size is .* which is greater than maximum allowed size (.*) for a record on index leaf page."); @@ -85,3 +85,19 @@ f29(10), f30(10), f31(10), f32(10), f33(10))) ENGINE=InnoDB; + +--echo # +--echo # MDEV-31161 Assertion failures upon adding a too long key +--echo # to table with COMPRESSED row format +--echo # +--let $page_size= `SELECT @@GLOBAL.innodb_page_size` +CREATE TABLE t1(pk INT PRIMARY KEY, f1 INT, f2 TEXT)ENGINE=InnoDB ROW_FORMAT=COMPRESSED; +INSERT INTO t1 (pk) VALUES (1); +let $error_code = 0; +if ($page_size == 4096) { +let $error_code = ER_TOO_BIG_ROWSIZE; +} + +--error $error_code +ALTER TABLE t1 ADD KEY (f1), ADD KEY (f2(1000)); +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/scrub_debug.test mariadb-10.11.9/mysql-test/suite/innodb/t/scrub_debug.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/scrub_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/scrub_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,7 +10,7 @@ let $MYSQLD_DATADIR=`select @@datadir`; CREATE TABLE t1(f1 INT AUTO_INCREMENT PRIMARY KEY, f2 VARCHAR(256) GENERATED ALWAYS as('repairman'), - INDEX idx(f2))ENGINE= InnoDB; + INDEX idx(f2))ENGINE= InnoDB STATS_PERSISTENT=0; INSERT INTO t1(f1) SELECT seq FROM seq_1_to_50; FLUSH TABLE t1 FOR EXPORT; let SEARCH_PATTERN= repairman; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/table_flags.opt mariadb-10.11.9/mysql-test/suite/innodb/t/table_flags.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/table_flags.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/table_flags.opt 2024-08-03 07:29:58.000000000 +0000 @@ -1,2 +1,3 @@ --innodb-checksum-algorithm=crc32 --skip-innodb-read-only-compressed +--skip-innodb-buffer-pool-dump-at-shutdown diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/table_flags.test mariadb-10.11.9/mysql-test/suite/innodb/t/table_flags.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/table_flags.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/table_flags.test 2024-08-03 07:29:58.000000000 +0000 @@ -29,12 +29,15 @@ let bugdir= $MYSQLTEST_VARDIR/tmp/table_flags; --mkdir $bugdir +let undodir= $MYSQLTEST_VARDIR/tmp/undo_dir; +--mkdir $undodir + --let SEARCH_FILE = $MYSQLTEST_VARDIR/log/mysqld.1.err --let $d=--innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir --let $d=$d --innodb-data-file-path=ibdata1:1M:autoextend --let $d=$d --innodb-undo-tablespaces=0 ---let $d=$d --skip-innodb-fast-shutdown +--let $d=$d --skip-innodb-fast-shutdown --innodb_undo_directory=$undodir --let $restart_noprint=1 --let $restart_parameters=$d --innodb-stats-persistent=0 --source include/restart_mysqld.inc @@ -157,7 +160,9 @@ SHOW CREATE TABLE tc; --error ER_NO_SUCH_TABLE_IN_ENGINE SELECT * FROM tc; +--error ER_GET_ERRNO SHOW CREATE TABLE td; +--error ER_GET_ERRNO SELECT * FROM td; # This table was converted to NO_ROLLBACK due to the SYS_TABLES.TYPE change. SHOW CREATE TABLE tz; @@ -232,6 +237,7 @@ --list_files $bugdir --remove_files_wildcard $bugdir --rmdir $bugdir +--rmdir $undodir call mtr.add_suppression("ERROR HY000: Can't create table `test`.`t1`"); --error ER_CANT_CREATE_TABLE @@ -251,3 +257,15 @@ let $shutdown_timeout = 0; --source include/restart_mysqld.inc DROP TABLE t1; + +--echo # +--echo # MDEV-34222 Alter operation on redundant table aborts the server +--echo # +SET @df_row = @@global.INNODB_DEFAULT_ROW_FORMAT; +SET GLOBAL INNODB_DEFAULT_ROW_FORMAT=REDUNDANT; +CREATE TABLE t1 (c CHAR(1)) ENGINE=InnoDB; +SET GLOBAL INNODB_DEFAULT_ROW_FORMAT=compact; +--error ER_ILLEGAL_HA_CREATE_OPTION +ALTER TABLE t1 PAGE_COMPRESSED=1; +DROP TABLE t1; +SET @@global.INNODB_DEFAULT_ROW_FORMAT = @df_row; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.opt mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb-sys-tablespaces diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.test mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_not_windows.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,162 @@ +--echo # +--echo # Test the limits of a file-per-table tablespace name. MySQL combines +--echo # the database name with the table name to make a unique table name. +--echo # + +--source include/have_innodb.inc +--source include/not_windows.inc +# This will test the limit of a filename in MySQL at 512 bytes. +# We control that by making it a relative path starting with "./". +# The embedded server uses an absolute path as the datadir +# which has a non-deterministic length. +--source include/not_embedded.inc + +SET default_storage_engine=InnoDB; +LET $MYSQLD_DATADIR = `select @@datadir`; + +--echo # +--echo # MySQL limits each database and tablename identifier to 64 characters +--echo # of up to 3 bytes per character, corresponding to 192 bytes. +--echo # +LET $too_long_name = this_sixty_five_byte_name_is_too_long____________________________; +--error ER_WRONG_DB_NAME +--eval CREATE DATABASE `$too_long_name` + +LET $long_name = this_sixty_four_byte_name_is_not_too_long_______________________; +--eval CREATE DATABASE `$long_name` +--eval USE `$long_name` + +--echo # +--echo # A 64 character tablename can be created in a 64 character database name +--echo # +--eval CREATE TABLE `$long_name`.`$long_name` (a SERIAL) + +--echo # +--echo # A 65 character tablename is too long. +--echo # +--error ER_WRONG_TABLE_NAME +--eval CREATE TABLE `test`.`$too_long_name` (a SERIAL) +--error ER_WRONG_TABLE_NAME +--eval CREATE TABLE `$long_name`.`$too_long_name` (a SERIAL) + +--echo # +--echo # Non-non-filename-safe characters like '#' are expanded to '@0023'. +--echo # On many file systems, such as Linux extfs, you can create a database name +--echo # that expands to up to 255 bytes long. +--echo # `##################################################_long` is expanded to +--echo # (50 * 5) + 5 = 255. +--echo # +LET $long_db_name = ##################################################_long; +--eval CREATE DATABASE `$long_db_name`; +--eval USE `$long_db_name` + +--echo # +--echo # This 256-byte name is only one byte longer but fails with an error code +--echo # from the stat operation. +--echo # `##################################################_long_` is expanded to +--echo # (50 * 5) + 6 = 256. +--echo # +--replace_regex /Errcode: [0-9]+/Errcode: ##/ /@0023/#/ +--error 13 +CREATE DATABASE `##################################################_long_`; + +--echo # +--echo # This 300-byte name which is the longest name that gets an error code +--echo # from the stat operation. +--echo # `###########################################################_long` is expanded to +--echo # (59 * 5) + 5 = 300. +--echo # +--replace_regex /Errcode: [0-9]+/Errcode: ##/ /@0023/#/ +--error 13 +CREATE DATABASE `###########################################################_long`; + +--echo # +--echo # This 301-byte name which is only one byte longer but fails with ER_TOO_LONG_IDENT. +--echo # `###########################################################_long_` is expanded to +--echo # (59 * 5) + 6 = 301. +--echo # +--replace_result @0023 # +--error ER_WRONG_DB_NAME +CREATE DATABASE `###########################################################_long_`; + +USE test; + +LET $long_249_byte_table_name = #################################################long; +LET $long_250_byte_table_name = #################################################_long; +LET $long_251_byte_table_name = #################################################_long_; +LET $long_252_byte_table_name = #################################################_long___; + +--echo # +--echo # An expanded table name is limited to 251 bytes +--echo # +--eval CREATE TABLE `test`.`$long_251_byte_table_name` (a SERIAL) + +--echo # +--echo # A 252-byte tablename is too long +--echo # +--replace_regex /errno: [0-9]+/errno: ##/ /@0023/#/ +--error ER_CANT_CREATE_TABLE +--eval CREATE TABLE `test`.`$long_252_byte_table_name` (a SERIAL) + +CREATE DATABASE twenty_byte_db_name_; +USE `twenty_byte_db_name_`; + +--echo # +--echo # A 251 byte expanded table name will fit with a longer database name +--echo # +--eval CREATE TABLE `twenty_byte_db_name_`.`$long_251_byte_table_name` (a SERIAL) + +--echo # +--echo # A 252 byte expanded table name is also too long in a longer database name +--echo # +--replace_regex /errno: [0-9]+/errno: ##/ /@0023/#/ +--error ER_CANT_CREATE_TABLE +--eval CREATE TABLE `twenty_byte_db_name_`.`$long_252_byte_table_name` (a SERIAL) + +--echo # +--echo # Another limitation is a 512 byte length to an expanded path that includes +--echo # the datadir which is './' in this test, the expanded database name, +--echo # the directory separator '/', the expanded table name, and the file extension. +--echo # './long_db_name.long_250_byte_table_name.frm' +--echo # 2+ 255 +1+ 250 +1+3 = 512 +--echo # +--eval CREATE TABLE `$long_db_name`.`$long_250_byte_table_name` (a SERIAL) + +--error ER_IDENT_CAUSES_TOO_LONG_PATH +--eval CREATE TABLE `$long_db_name`.`$long_251_byte_table_name` (a SERIAL) +SHOW WARNINGS; + +--echo # +--echo # Show the successfully created databases and tables +--echo # +--echo ---- list_files MYSQLD_DATADIR/test +--replace_result @0023 # +--list_files $MYSQLD_DATADIR/test +--echo ---- list_files MYSQLD_DATADIR/$long_name +--replace_result @0023 # +--list_files $MYSQLD_DATADIR/$long_name +--echo ---- list_files MYSQLD_DATADIR/$long_db_name +--replace_result @0023 # +--list_files $MYSQLD_DATADIR/@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023_long + +--replace_result @0023 # +SELECT name FROM information_schema.innodb_sys_tables WHERE name LIKE '%long%'; +--replace_result @0023 # +SELECT name FROM information_schema.innodb_sys_tablespaces WHERE name LIKE '%long%'; +--vertical_results +--replace_regex /innodb_file_per_table_[0-9]*/innodb_file_per_table_##/ +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @0023 # +SELECT file_name, tablespace_name FROM information_schema.files WHERE file_name LIKE '%long%'; +--horizontal_results + +--echo # +--echo # Cleanup +--echo # + +--eval DROP TABLE `$long_name`.`$long_name` +--eval DROP TABLE `test`.`$long_251_byte_table_name` +--eval DROP TABLE `twenty_byte_db_name_`.`$long_251_byte_table_name` +--eval DROP TABLE `$long_db_name`.`$long_250_byte_table_name` +--eval DROP DATABASE `$long_name` +--eval DROP DATABASE `$long_db_name` +DROP DATABASE `twenty_byte_db_name_`; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_windows.opt mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_windows.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_windows.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_windows.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb-sys-tablespaces diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_windows.test mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_windows.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/tablespace_per_table_windows.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/tablespace_per_table_windows.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,77 @@ +--echo # +--echo # Test the limits of a file-per-table tablespace name. MySQL combines +--echo # the database name with the table name to make a unique table name. +--echo # + +# There is no use in testing the maximum expanded filename using "#" or +# some other character that is expanded by MySQL to "@0023" because +# Windows imposes a maximum absolute path length of 260 bytes. So the +# results will depend upon what local directory this test is run in. +# See https://msdn.microsoft.com/en-us/library/aa365247.aspx +# "Maximum Path Length Limitation +# In the Windows API, the maximum length for a path is MAX_PATH, which is +# defined as 260 characters. A local path is structured in the following +# order: drive letter, colon, backslash, name components separated by +# backslashes, and a terminating null character. For example, the maximum +# path on drive D is "D:\some 256-character path string" where +# "" represents the invisible terminating null character for the +# current system codepage. (The characters < > are used here for visual +# clarity and cannot be part of a valid path string.)" + +--source include/have_innodb.inc +--source include/windows.inc +# This will test the limit of a filename in MySQL at 512 bytes. +# We control that by making it a relative path starting with "./". +# The embedded server uses an absolute path as the datadir +# which has a non-deterministic length. +--source include/not_embedded.inc + +SET default_storage_engine=InnoDB; +LET $MYSQLD_DATADIR = `select @@datadir`; + +--echo # +--echo # MySQL limits each database and tablename identifier to 64 characters +--echo # of up to 3 bytes per character, corresponding to 192 bytes. +--echo # +LET $too_long_name = this_sixty_five_byte_name_is_too_long____________________________; +--error ER_WRONG_DB_NAME +--eval CREATE DATABASE `$too_long_name` + +LET $long_name = this_sixty_four_byte_name_is_not_too_long_______________________; +--eval CREATE DATABASE `$long_name` +--eval USE `$long_name` + +--echo # +--echo # A 64 character tablename can be created in a 64 character database name +--echo # +--eval CREATE TABLE `$long_name`.`$long_name` (a SERIAL) + +--echo # +--echo # A 65 character tablename is too long. +--echo # +--error ER_WRONG_TABLE_NAME +--eval CREATE TABLE `test`.`$too_long_name` (a SERIAL) +--error ER_WRONG_TABLE_NAME +--eval CREATE TABLE `$long_name`.`$too_long_name` (a SERIAL) + +--echo # +--echo # Show the successfully created database and table +--echo # +--eval SHOW CREATE TABLE `$long_name`.`$long_name` + +--echo ---- list_files MYSQLD_DATADIR/$long_name +--list_files $MYSQLD_DATADIR/$long_name + +SELECT name FROM information_schema.innodb_sys_tables WHERE name LIKE '%long%'; +SELECT name FROM information_schema.innodb_sys_tablespaces WHERE name LIKE '%long%'; +--vertical_results +--replace_regex /innodb_file_per_table_[0-9]*/innodb_file_per_table_##/ +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +SELECT file_name, tablespace_name FROM information_schema.files WHERE file_name LIKE '%long%'; +--horizontal_results + +--echo # +--echo # Cleanup +--echo # + +--eval DROP DATABASE `$long_name` diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/temporary_table.test mariadb-10.11.9/mysql-test/suite/innodb/t/temporary_table.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/temporary_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/temporary_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -135,7 +135,7 @@ # We cannot use include/restart_mysqld.inc in this particular test, # because SHOW STATUS would fail due to unwritable (nonexistent) tmpdir. --source include/shutdown_mysqld.inc ---exec echo "restart: --tmpdir=/dev/null/$MYSQL_TMP_DIR --skip-innodb-fast-shutdown" > $_expect_file_name +--write_line "restart: --tmpdir=/dev/null/$MYSQL_TMP_DIR --skip-innodb-fast-shutdown" $_expect_file_name --enable_reconnect --disable_result_log --disable_query_log @@ -635,4 +635,23 @@ CHECK TABLE t EXTENDED; DROP TEMPORARY TABLE t; +--echo # +--echo # MDEV-34118 fsp_alloc_free_extent() fails to flag DB_OUT_OF_FILE_SPACE +--echo # +SET @save_increment = @@GLOBAL.innodb_autoextend_increment; +SET GLOBAL innodb_autoextend_increment=1; +CREATE TEMPORARY TABLE t (c LONGTEXT) ENGINE=INNODB; +if ($MTR_COMBINATION_4K) +{ +--error ER_RECORD_FILE_FULL +INSERT INTO t VALUES (REPEAT ('1',16777216)); +} +if (!$MTR_COMBINATION_4K) +{ +INSERT INTO t VALUES (REPEAT ('1',16777216)); +--echo ERROR HY000: The table 't' is full +} +DROP TEMPORARY TABLE t; +SET GLOBAL innodb_autoextend_increment=@save_increment; + --echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/truncate_crash.test mariadb-10.11.9/mysql-test/suite/innodb/t/truncate_crash.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/truncate_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/truncate_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ --source include/not_embedded.inc FLUSH TABLES; -CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB STATS_PERSISTENT=0; INSERT INTO t1 VALUES (1),(2); connect (wait,localhost,root,,test); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/truncate_foreign.test mariadb-10.11.9/mysql-test/suite/innodb/t/truncate_foreign.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/truncate_foreign.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/truncate_foreign.test 2024-08-03 07:29:58.000000000 +0000 @@ -89,16 +89,14 @@ CREATE TABLE t1 (pk INT, a INT, PRIMARY KEY (pk), KEY (a)) ENGINE=InnoDB; SET FOREIGN_KEY_CHECKS=0; -ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a), ALGORITHM=COPY; +ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t2 (a), ALGORITHM=COPY; INSERT INTO t1 VALUES (1,1); +CREATE TABLE t2(f1 INT PRIMARY KEY)ENGINE=InnoDB; LOCK TABLES t1 WRITE; SET FOREIGN_KEY_CHECKS=1; --error ER_CANNOT_ADD_FOREIGN TRUNCATE t1; -# Whether TRUNCATE succeeds or fails, it will reload FOREIGN KEY constraints. -# As a result, ha_innobase::referenced_by_foreign_key() will retun TRUE -# (for the self-referential key), and the statement will fail. ---error ER_TABLE_NOT_LOCKED +--error ER_NO_REFERENCED_ROW_2 INSERT INTO t1 VALUES (2,2); SELECT * FROM t1; UNLOCK TABLES; @@ -107,6 +105,6 @@ SET FOREIGN_KEY_CHECKS=0; INSERT INTO t1 VALUES (2,2); SELECT * FROM t1; -DROP TABLE t1; +DROP TABLE t2, t1; --echo # End of 10.6 tests diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/trx_id_future.test mariadb-10.11.9/mysql-test/suite/innodb/t/trx_id_future.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/trx_id_future.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/trx_id_future.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,7 @@ let PAGE_SIZE=`select @@innodb_page_size`; -CREATE TABLE t1(a INT) row_format=redundant engine=innoDB; +CREATE TABLE t1(a INT) row_format=redundant engine=innoDB stats_persistent=0; INSERT INTO t1 VALUES(1); let MYSQLD_DATADIR=`select @@datadir`; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/undo_log.test mariadb-10.11.9/mysql-test/suite/innodb/t/undo_log.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/undo_log.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/undo_log.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,8 @@ --source include/have_innodb.inc +SET @save_stats_persistent = @@GLOBAL.innodb_stats_persistent; +SET GLOBAL innodb_stats_persistent = 0; + SET innodb_strict_mode=OFF; CREATE TABLE test_tab ( a_str_18 mediumtext, @@ -151,3 +154,5 @@ --source include/wait_all_purged.inc DROP TABLE t1; DROP TABLE t2; + +SET GLOBAL innodb_stats_persistent = @save_stats_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/undo_space_dblwr.opt mariadb-10.11.9/mysql-test/suite/innodb/t/undo_space_dblwr.opt --- mariadb-10.11.6/mysql-test/suite/innodb/t/undo_space_dblwr.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/undo_space_dblwr.opt 2024-08-03 07:29:58.000000000 +0000 @@ -1,2 +1,3 @@ --innodb_undo_tablespaces=3 --innodb_sys_tablespaces +--innodb-stats-persistent=0 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/undo_space_dblwr.test mariadb-10.11.9/mysql-test/suite/innodb/t/undo_space_dblwr.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/undo_space_dblwr.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/undo_space_dblwr.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,19 +9,19 @@ create table t1(f1 int not null, f2 int not null)engine=innodb; insert into t1 values (1, 1); ---source include/wait_all_purged.inc +# Slow shutdown and restart to make sure ibuf merge is finished +SET GLOBAL innodb_fast_shutdown = 0; +let $shutdown_timeout=; +let $restart_parameters=--debug_dbug=+d,ib_log_checkpoint_avoid_hard --innodb_flush_sync=0; +--source include/restart_mysqld.inc -set GLOBAL innodb_log_checkpoint_now=1; --source ../include/no_checkpoint_start.inc - --echo # Make the first page dirty for undo tablespace set global innodb_saved_page_number_debug = 0; set global innodb_fil_make_page_dirty_debug = 1; -SET GLOBAL innodb_max_dirty_pages_pct_lwm=0.0; -SET GLOBAL innodb_max_dirty_pages_pct=0.0; +SET GLOBAL innodb_buf_flush_list_now = 1; -sleep 1; --let CLEANUP_IF_CHECKPOINT=drop table t1; --source ../include/no_checkpoint_end.inc @@ -39,7 +39,7 @@ --source include/start_mysqld.inc let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err; -let SEARCH_PATTERN= Checksum mismatch in the first page of file; +let SEARCH_PATTERN= Restoring page \[page id: space=1, page number=0\] of datafile '.*undo001' from the doublewrite buffer.; --source include/search_pattern_in_file.inc check table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/undo_truncate.test mariadb-10.11.9/mysql-test/suite/innodb/t/undo_truncate.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/undo_truncate.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/undo_truncate.test 2024-08-03 07:29:58.000000000 +0000 @@ -13,7 +13,7 @@ # Re-create the undo log tablespaces after slow shutdown SET GLOBAL innodb_fast_shutdown=0; -let $restart_parameters="--innodb_undo_tablespaces=2"; +let $restart_parameters=--innodb_undo_tablespaces=2; --source include/restart_mysqld.inc SET GLOBAL innodb_undo_log_truncate = 0; @@ -46,6 +46,7 @@ connection con2; reap; delete from t2; connection con1; reap; +SET GLOBAL innodb_max_undo_log_size = @@GLOBAL.innodb_page_size * 4294967296; SET GLOBAL innodb_undo_log_truncate = 1; commit; disconnect con1; connection con2; commit; disconnect con2; @@ -57,6 +58,8 @@ let $trx_before= `select substr('$trx_before',9)+2`; SET GLOBAL innodb_max_purge_lag_wait=0; +SET GLOBAL innodb_max_undo_log_size=DEFAULT; +SET GLOBAL innodb_max_purge_lag_wait=0; set global innodb_fast_shutdown=0; let $restart_parameters=; --source include/restart_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/undo_truncate_recover.test mariadb-10.11.9/mysql-test/suite/innodb/t/undo_truncate_recover.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/undo_truncate_recover.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/undo_truncate_recover.test 2024-08-03 07:29:58.000000000 +0000 @@ -13,7 +13,7 @@ # Re-create the undo log tablespaces after slow shutdown SET GLOBAL innodb_fast_shutdown=0; -let $restart_parameters="--innodb_undo_tablespaces=2"; +let $restart_parameters=--innodb_undo_tablespaces=2; --source include/restart_mysqld.inc SET GLOBAL innodb_undo_log_truncate = 1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/undo_upgrade.test mariadb-10.11.9/mysql-test/suite/innodb/t/undo_upgrade.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/undo_upgrade.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/undo_upgrade.test 2024-08-03 07:29:58.000000000 +0000 @@ -76,3 +76,46 @@ --echo # Should list 2 undo log tablespaces, not 4 list_files $MYSQLD_DATADIR undo*; + +--echo # +--echo # MDEV-34200 InnoDB tries to write to read-only +--echo # system tablespace in buf_dblwr_t::init_or_load_pages() +--echo # + +SET GLOBAL innodb_fast_shutdown=0; +let $restart_parameters=--innodb_undo_tablespaces=4; +--source include/restart_mysqld.inc +--echo # Should list 4 undo log tablespaces +list_files $MYSQLD_DATADIR undo*; + +set global innodb_fast_shutdown=0; +let $restart_parameters=--innodb_read_only=1; +--source include/restart_mysqld.inc + +set global innodb_fast_shutdown=0; +let bugdir= $MYSQLTEST_VARDIR/tmp/bugdir; +mkdir $bugdir; +let undodir= $MYSQLTEST_VARDIR/tmp/undo_dir; +mkdir $undodir; +let $d= --innodb-data-file-path=ibdata1:1M:autoextend; +let $d=$d --innodb_undo_directory=$undodir; +let $restart_parameters= $d --innodb-data-home-dir=$bugdir --innodb-log-group-home-dir=$bugdir --innodb_undo_tablespaces=3; +--source include/restart_mysqld.inc +--echo # Should list 3 undo log tablespaces +list_files $undodir undo*; + +let bugdir_1= $MYSQLTEST_VARDIR/tmp/bugdir_1; +mkdir $bugdir_1; + +set global innodb_fast_shutdown=0; +let $restart_parameters= $d --innodb-data-home-dir=$bugdir_1 --innodb-log-group-home-dir=$bugdir_1 --innodb_undo_tablespaces=0; +--source include/restart_mysqld.inc +--echo # Shouldn't list 0 undo log tablespaces +list_files $undodir undo*; + +set global innodb_fast_shutdown=0; +let $restart_parameters=; +--source include/restart_mysqld.inc +rmdir $bugdir; +rmdir $bugdir_1; +rmdir $undodir; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb/t/xa_recovery.test mariadb-10.11.9/mysql-test/suite/innodb/t/xa_recovery.test --- mariadb-10.11.6/mysql-test/suite/innodb/t/xa_recovery.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb/t/xa_recovery.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,12 +10,12 @@ FLUSH TABLES; --enable_query_log -CREATE TABLE t1 (a INT) ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); connect (con1,localhost,root); XA START 'x'; UPDATE t1 set a=2; XA END 'x'; XA PREPARE 'x'; connect (con2,localhost,root); -CREATE TABLE t2 (a INT) ENGINE=InnoDB; +CREATE TABLE t2 (a INT PRIMARY KEY) ENGINE=InnoDB; XA START 'y'; INSERT INTO t2 VALUES (1); XA END 'y'; XA PREPARE 'y'; connection default; @@ -53,11 +53,21 @@ XA ROLLBACK 'x'; SELECT * FROM t1; -DROP TABLE t1; --error ER_LOCK_WAIT_TIMEOUT DROP TABLE t2; XA ROLLBACK 'y'; DROP TABLE t2; +CREATE TABLE t3(a INT PRIMARY KEY REFERENCES t1(a)) ENGINE=InnoDB; +XA START 'a'; +INSERT INTO t3 SET a=1; +--error ER_NO_REFERENCED_ROW_2 +INSERT INTO t3 SET a=42; +XA END 'a'; +XA PREPARE 'a'; SET GLOBAL innodb_fast_shutdown=0; --source include/restart_mysqld.inc + +XA COMMIT 'a'; +SELECT * FROM t3; +DROP TABLE t3,t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/crash_recovery.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/crash_recovery.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/crash_recovery.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/crash_recovery.result 2024-08-03 07:29:58.000000000 +0000 @@ -33,7 +33,7 @@ disconnect ddl1; disconnect ddl2; disconnect ddl3; -InnoDB 0 transactions not purged +SET GLOBAL innodb_max_purge_lag_wait=0; CHECK TABLE t1,t2,t3; Table Op Msg_type Msg_text test.t1 check status OK diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/create,orig.rdiff mariadb-10.11.9/mysql-test/suite/innodb_fts/r/create,orig.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/create,orig.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/create,orig.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,11 @@ +--- create.result ++++ create.reject +@@ -207,7 +207,7 @@ + UNIQUE KEY `FTS_DOC_ID_INDEX` (`FTS_DOC_ID` DESC) + ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE; +-ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY ++ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index + ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY; + ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index + DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/create.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/create.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/create.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/create.result 2024-08-03 07:29:58.000000000 +0000 @@ -207,7 +207,7 @@ UNIQUE KEY `FTS_DOC_ID_INDEX` (`FTS_DOC_ID` DESC) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE; -ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY; ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/foreign_key_check.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/foreign_key_check.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/foreign_key_check.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/foreign_key_check.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,27 @@ +CREATE TABLE t1 ( +id INT NOT NULL, +title TEXT, +PRIMARY KEY (id), +FULLTEXT KEY (title), +FOREIGN KEY (id) REFERENCES t2 (id) +) ENGINE=InnoDB; +ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed") +CREATE TABLE t1 ( +id INT NOT NULL, +title TEXT, +PRIMARY KEY (id) +) ENGINE=InnoDB; +ALTER TABLE t1 ADD FULLTEXT KEY (title), ADD FOREIGN KEY (id) REFERENCES t2 (id); +ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed") +SET FOREIGN_KEY_CHECKS = 0; +ALTER TABLE t1 ADD FULLTEXT KEY (title), ADD FOREIGN KEY (id) REFERENCES t2 (id); +DROP TABLE t1; +CREATE TABLE t1 ( +id INT NOT NULL, +title TEXT, +PRIMARY KEY (id), +FULLTEXT KEY (title), +FOREIGN KEY (id) REFERENCES t2 (id) +) ENGINE=InnoDB; +DROP TABLE t1; +SET FOREIGN_KEY_CHECKS = 1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/foreign_key_update.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/foreign_key_update.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/foreign_key_update.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/foreign_key_update.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,46 @@ +CREATE TABLE t1 ( +a varchar(40), +KEY a(a) +) ENGINE=InnoDB; +CREATE TABLE t1_fk ( +a varchar(40), +KEY a(a), +FULLTEXT KEY (a), +CONSTRAINT fk FOREIGN KEY (a) REFERENCES t1 (a) ON UPDATE CASCADE +) ENGINE=InnoDB; +INSERT INTO t1 VALUES('mysql'); +INSERT INTO t1_fk VALUES('mysql'); +INSERT INTO t1_fk VALUES('mysql'); +SELECT * FROM t1_fk; +a +mysql +mysql +SELECT * FROM t1_fk WHERE MATCH(a) AGAINST('mysql'); +a +mysql +mysql +UPDATE t1 SET a = 'database' WHERE a = 'mysql'; +SELECT * FROM t1_fk; +a +database +database +SELECT * FROM t1_fk WHERE MATCH(a) AGAINST('mysql'); +a +SELECT * FROM t1_fk WHERE MATCH(a) AGAINST('database'); +a +database +database +DROP TABLE t1_fk; +DROP TABLE t1; +# +# MDEV-32346 Assertion failure sym_node->table != NULL +# in pars_retrieve_table_def on UPDATE +# +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (a INT, b TEXT, FOREIGN KEY(a) REFERENCES t1(a), +FULLTEXT (b))ENGINE=InnoDB; +INSERT INTO t1 SET a=1; +ALTER TABLE t2 DISCARD TABLESPACE; +UPDATE t1 SET a=2; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a`) REFERENCES `t1` (`a`)) +DROP TABLE t2,t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/ft_result_cache_limit.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/ft_result_cache_limit.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/ft_result_cache_limit.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/ft_result_cache_limit.result 2024-08-03 07:29:58.000000000 +0000 @@ -20,8 +20,6 @@ CALL populate_t1; SET autocommit=1; SET SESSION debug="+d,fts_instrument_result_cache_limit"; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead ALTER TABLE t1 ADD FULLTEXT INDEX `text_content_idx` (`text_content`); SELECT FTS_DOC_ID, text_content FROM t1 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/fts_sync_commit_resiliency.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/fts_sync_commit_resiliency.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/fts_sync_commit_resiliency.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/fts_sync_commit_resiliency.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,63 @@ +CREATE TABLE opening_lines ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +opening_line TEXT(500), +author VARCHAR(200), +title VARCHAR(200) +) ENGINE=InnoDB; +CREATE FULLTEXT INDEX idx ON opening_lines(opening_line); +CREATE FULLTEXT INDEX ft_idx1 ON opening_lines(title); +INSERT INTO opening_lines(opening_line,author,title) VALUES +('Call me Ishmael.','Herman Melville','Moby Dick'), +('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'), + ('I am an invisible man.','Ralph Ellison','Invisible Man'), + ('Where now? Who now? When now?','Samuel Beckett','The Unnamable'), + ('It was love at first sight.','Joseph Heller','Catch-22'), + ('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'), + ('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'), + ('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451'); +SET GLOBAL innodb_ft_aux_table='test/opening_lines'; +SELECT * FROM information_schema.innodb_ft_config; +KEY VALUE +optimize_checkpoint_limit 180 +synced_doc_id 0 +stopword_table_name +use_stopword 1 +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael'); +id opening_line author title +1 Call me Ishmael. Herman Melville Moby Dick +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible'); +id opening_line author title +3 I am an invisible man. Ralph Ellison Invisible Man +SELECT * FROM opening_lines; +id opening_line author title +1 Call me Ishmael. Herman Melville Moby Dick +2 A screaming comes across the sky. Thomas Pynchon Gravity's Rainbow +3 I am an invisible man. Ralph Ellison Invisible Man +4 Where now? Who now? When now? Samuel Beckett The Unnamable +5 It was love at first sight. Joseph Heller Catch-22 +6 All this happened, more or less. Kurt Vonnegut Slaughterhouse-Five +7 Mrs. Dalloway said she would buy the flowers herself. Virginia Woolf Mrs. Dalloway +8 It was a pleasure to burn. Ray Bradbury Fahrenheit 451 +SET GLOBAL innodb_optimize_fulltext_only=ON; +SET DEBUG_SYNC='fts_crash_before_commit_sync SIGNAL hung WAIT_FOR ever'; +OPTIMIZE TABLE opening_lines; +connect con1,localhost,root,,; +SET DEBUG_SYNC='now WAIT_FOR hung'; +# restart +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael'); +id opening_line author title +1 Call me Ishmael. Herman Melville Moby Dick +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible'); +id opening_line author title +3 I am an invisible man. Ralph Ellison Invisible Man +SELECT * FROM opening_lines; +id opening_line author title +1 Call me Ishmael. Herman Melville Moby Dick +2 A screaming comes across the sky. Thomas Pynchon Gravity's Rainbow +3 I am an invisible man. Ralph Ellison Invisible Man +4 Where now? Who now? When now? Samuel Beckett The Unnamable +5 It was love at first sight. Joseph Heller Catch-22 +6 All this happened, more or less. Kurt Vonnegut Slaughterhouse-Five +7 Mrs. Dalloway said she would buy the flowers herself. Virginia Woolf Mrs. Dalloway +8 It was a pleasure to burn. Ray Bradbury Fahrenheit 451 +DROP TABLE opening_lines; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/fulltext_order_by.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/fulltext_order_by.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/fulltext_order_by.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/fulltext_order_by.result 2024-08-03 07:29:58.000000000 +0000 @@ -129,7 +129,7 @@ a.text, b.id, b.betreff order by match(b.betreff) against ('+abc' in boolean mode) desc; -ERROR 42000: Table 'b' from one of the SELECTs cannot be used in ORDER clause +ERROR 42000: Table 'b' from one of the SELECTs cannot be used in order clause select a.text, b.id, b.betreff from t2 a inner join t3 b on a.id = b.forum inner join @@ -145,7 +145,7 @@ match(c.beitrag) against ('+abc' in boolean mode) order by match(b.betreff) against ('+abc' in boolean mode) desc; -ERROR 42000: Table 'b' from one of the SELECTs cannot be used in ORDER clause +ERROR 42000: Table 'b' from one of the SELECTs cannot be used in order clause select a.text, b.id, b.betreff from t2 a inner join t3 b on a.id = b.forum inner join diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/index_table.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/index_table.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/index_table.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/index_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,265 @@ +SET @optimize=@@GLOBAL.INNODB_OPTIMIZE_FULLTEXT_ONLY; +SET GLOBAL INNODB_OPTIMIZE_FULLTEXT_ONLY=1; +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +content TEXT +) ENGINE= InnoDB; +CREATE FULLTEXT INDEX idx ON articles (title, content); +INSERT INTO articles (title, content) VALUES +('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','How to use full-text search engine'), +('Go MySQL Tricks','How to use full text search engine'); +SET @aux=@@GLOBAL.innodb_ft_aux_table; +SET GLOBAL innodb_ft_aux_table='test/articles'; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +1001 4 4 1 4 0 +after 2 2 1 2 22 +database 1 1 1 1 37 +dbms 1 1 1 1 15 +engine 4 5 2 4 46 +engine 4 5 2 5 44 +full 4 5 2 4 29 +full 4 5 2 5 27 +mysql 1 5 5 1 0 +mysql 1 5 5 1 31 +mysql 1 5 5 2 11 +mysql 1 5 5 3 11 +mysql 1 5 5 4 5 +mysql 1 5 5 5 3 +optimizing 3 3 1 3 0 +search 4 5 2 4 39 +search 4 5 2 5 37 +show 3 3 1 3 42 +stands 1 1 1 1 20 +text 4 5 2 4 34 +text 4 5 2 5 32 +through 2 2 1 2 37 +tricks 4 5 2 4 11 +tricks 4 5 2 5 9 +tutorial 1 3 2 1 6 +tutorial 1 3 2 3 25 +use 2 5 3 2 7 +use 2 5 3 4 25 +use 2 5 3 5 23 +well 2 2 1 2 17 +went 2 2 1 2 32 +you 2 2 1 2 28 +OPTIMIZE TABLE articles; +Table Op Msg_type Msg_text +test.articles optimize status OK +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +1001 4 4 1 4 0 +after 2 2 1 2 22 +database 1 1 1 1 37 +dbms 1 1 1 1 15 +engine 4 5 2 4 46 +engine 4 5 2 5 44 +full 4 5 2 4 29 +full 4 5 2 5 27 +mysql 1 5 5 1 0 +mysql 1 5 5 1 31 +mysql 1 5 5 2 11 +mysql 1 5 5 3 11 +mysql 1 5 5 4 5 +mysql 1 5 5 5 3 +optimizing 3 3 1 3 0 +search 4 5 2 4 39 +search 4 5 2 5 37 +show 3 3 1 3 42 +stands 1 1 1 1 20 +text 4 5 2 4 34 +text 4 5 2 5 32 +through 2 2 1 2 37 +tricks 4 5 2 4 11 +tricks 4 5 2 5 9 +tutorial 1 3 2 1 6 +tutorial 1 3 2 3 25 +use 2 5 3 2 7 +use 2 5 3 4 25 +use 2 5 3 5 23 +well 2 2 1 2 17 +went 2 2 1 2 32 +you 2 2 1 2 28 +SET @save_dbug=@@debug_dbug; +SET debug_dbug='+d,fts_instrument_result_cache_limit'; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +1001 4 4 1 4 0 +after 2 2 1 2 22 +database 1 1 1 1 37 +dbms 1 1 1 1 15 +engine 4 5 2 4 46 +engine 4 5 2 5 44 +full 4 5 2 4 29 +full 4 5 2 5 27 +mysql 1 5 5 1 0 +mysql 1 5 5 1 31 +mysql 1 5 5 2 11 +mysql 1 5 5 3 11 +mysql 1 5 5 4 5 +mysql 1 5 5 5 3 +optimizing 3 3 1 3 0 +search 4 5 2 4 39 +search 4 5 2 5 37 +show 3 3 1 3 42 +stands 1 1 1 1 20 +text 4 5 2 4 34 +text 4 5 2 5 32 +through 2 2 1 2 37 +tricks 4 5 2 4 11 +tricks 4 5 2 5 9 +tutorial 1 3 2 1 6 +tutorial 1 3 2 3 25 +use 2 5 3 2 7 +use 2 5 3 4 25 +use 2 5 3 5 23 +well 2 2 1 2 17 +went 2 2 1 2 32 +you 2 2 1 2 28 +SET debug_dbug=@save_dbug; +DROP TABLE articles; +SET GLOBAL innodb_ft_result_cache_limit=default; +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +content TEXT +) ENGINE= InnoDB; +CREATE FULLTEXT INDEX idx_t ON articles (title); +CREATE FULLTEXT INDEX idx_c ON articles (content); +INSERT INTO articles (title, content) VALUES +('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','How to use full-text search engine'), +('Go MySQL Tricks','How to use full text search engine'); +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +SET GLOBAL innodb_ft_aux_table='test/articles'; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +1001 4 4 1 4 0 +mysql 1 5 5 1 0 +mysql 1 5 5 2 11 +mysql 1 5 5 3 11 +mysql 1 5 5 4 5 +mysql 1 5 5 5 3 +optimizing 3 3 1 3 0 +tricks 4 5 2 4 11 +tricks 4 5 2 5 9 +tutorial 1 1 1 1 6 +use 2 2 1 2 7 +well 2 2 1 2 17 +after 2 2 1 2 0 +database 1 1 1 1 22 +dbms 1 1 1 1 0 +engine 4 5 2 4 28 +engine 4 5 2 5 28 +full 4 5 2 4 11 +full 4 5 2 5 11 +mysql 1 1 1 1 16 +search 4 5 2 4 21 +search 4 5 2 5 21 +show 3 3 1 3 25 +stands 1 1 1 1 5 +text 4 5 2 4 16 +text 4 5 2 5 16 +through 2 2 1 2 15 +tutorial 3 3 1 3 8 +use 4 5 2 4 7 +use 4 5 2 5 7 +went 2 2 1 2 10 +you 2 2 1 2 6 +OPTIMIZE TABLE articles; +Table Op Msg_type Msg_text +test.articles optimize status OK +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +1001 4 4 1 4 0 +mysql 1 5 5 1 0 +mysql 1 5 5 2 11 +mysql 1 5 5 3 11 +mysql 1 5 5 4 5 +mysql 1 5 5 5 3 +optimizing 3 3 1 3 0 +tricks 4 5 2 4 11 +tricks 4 5 2 5 9 +tutorial 1 1 1 1 6 +use 2 2 1 2 7 +well 2 2 1 2 17 +after 2 2 1 2 0 +database 1 1 1 1 22 +dbms 1 1 1 1 0 +engine 4 5 2 4 28 +engine 4 5 2 5 28 +full 4 5 2 4 11 +full 4 5 2 5 11 +mysql 1 1 1 1 16 +search 4 5 2 4 21 +search 4 5 2 5 21 +show 3 3 1 3 25 +stands 1 1 1 1 5 +text 4 5 2 4 16 +text 4 5 2 5 16 +through 2 2 1 2 15 +tutorial 3 3 1 3 8 +use 4 5 2 4 7 +use 4 5 2 5 7 +went 2 2 1 2 10 +you 2 2 1 2 6 +DROP TABLE articles; +SET NAMES utf8; +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200) +) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; +CREATE FULLTEXT INDEX idx ON articles (title); +INSERT INTO articles (title) VALUES +('相亲相爱'),('怜香惜爱'),('充满å¯çˆ±'),('爱æ¨äº¤ç»‡'); +SET GLOBAL innodb_ft_aux_table="test/articles"; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +充满å¯çˆ± 3 3 1 3 0 +怜香惜爱 2 2 1 2 0 +爱æ¨äº¤ç»‡ 4 4 1 4 0 +相亲相爱 1 1 1 1 0 +OPTIMIZE TABLE articles; +Table Op Msg_type Msg_text +test.articles optimize status OK +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +充满å¯çˆ± 3 3 1 3 0 +怜香惜爱 2 2 1 2 0 +爱æ¨äº¤ç»‡ 4 4 1 4 0 +相亲相爱 1 1 1 1 0 +DROP TABLE articles; +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200) +) ENGINE=InnoDB DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci; +CREATE FULLTEXT INDEX idx ON articles (title); +INSERT INTO articles (title) VALUES +('相亲相爱'),('怜香惜爱'),('充满å¯çˆ±'),('爱æ¨äº¤ç»‡'); +SET GLOBAL innodb_ft_aux_table="test/articles"; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +爱æ¨äº¤ç»‡ 4 4 1 4 0 +充满å¯çˆ± 3 3 1 3 0 +怜香惜爱 2 2 1 2 0 +相亲相爱 1 1 1 1 0 +OPTIMIZE TABLE articles; +Table Op Msg_type Msg_text +test.articles optimize status OK +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +怜香惜爱 2 2 1 2 0 +充满å¯çˆ± 3 3 1 3 0 +相亲相爱 1 1 1 1 0 +爱æ¨äº¤ç»‡ 4 4 1 4 0 +DROP TABLE articles; +SET GLOBAL innodb_ft_aux_table=@aux; +SET GLOBAL INNODB_OPTIMIZE_FULLTEXT_ONLY=@optimize; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers.rdiff mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,57 @@ +--- innodb-fts-ddl.result ++++ innodb-fts-ddl.reject +@@ -11,8 +11,10 @@ + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; +-ERROR 0A000: ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE +-ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=INPLACE; ++ERROR 0A000: ALGORITHM=NOCOPY is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY ++ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); ++affected rows: 6 ++info: Records: 6 Duplicates: 0 Warnings: 0 + SELECT * FROM fts_test WHERE MATCH (title, body) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + id title body +@@ -26,7 +28,9 @@ + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); +-ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; ++ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); ++affected rows: 12 ++info: Records: 12 Duplicates: 0 Warnings: 0 + SELECT * FROM fts_test WHERE MATCH (title, body) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + id title body +@@ -76,8 +80,10 @@ + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + CREATE FULLTEXT INDEX idx on fts_test (title, body) LOCK=NONE; +-ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED +-ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; ++ERROR 0A000: LOCK=NONE is not supported. Reason: Not implemented for system-versioned operations. Try LOCK=SHARED ++ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); ++affected rows: 6 ++info: Records: 6 Duplicates: 0 Warnings: 0 + ALTER TABLE fts_test ROW_FORMAT=REDUNDANT, LOCK=NONE; + ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED + ALTER TABLE fts_test ROW_FORMAT=REDUNDANT; +@@ -162,7 +168,7 @@ + (20, 'MySQL Security','When configured properly, MySQL ...'); + ALTER TABLE articles ADD FULLTEXT INDEX idx (title), + ADD FULLTEXT INDEX idx3 (title), ALGORITHM=INPLACE; +-ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY ++ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY + ALTER TABLE articles ADD FULLTEXT INDEX idx (title), + ADD FULLTEXT INDEX idx3 (title); + affected rows: 6 +@@ -274,7 +280,7 @@ + call mtr.add_suppression("InnoDB: Failed to create"); + CREATE TABLE t1(a TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL UNIQUE) ENGINE=InnoDB; + ALTER TABLE t1 ADD FULLTEXT(a), ALGORITHM=INPLACE; +-ERROR HY000: Got error 11 "Resource temporarily unavailable" from storage engine InnoDB ++ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY + DROP TABLE t1; + CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB; + ALTER TABLE t1 ADD FULLTEXT KEY(a), ADD COLUMN b VARCHAR(3), ADD FULLTEXT KEY(b); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers_trx.rdiff mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers_trx.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers_trx.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-ddl,vers_trx.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,57 @@ +--- innodb-fts-ddl.result ++++ innodb-fts-ddl.reject +@@ -11,8 +11,10 @@ + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; +-ERROR 0A000: ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE +-ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=INPLACE; ++ERROR 0A000: ALGORITHM=NOCOPY is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY ++ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); ++affected rows: 6 ++info: Records: 6 Duplicates: 0 Warnings: 0 + SELECT * FROM fts_test WHERE MATCH (title, body) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + id title body +@@ -26,7 +28,9 @@ + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); +-ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; ++ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); ++affected rows: 12 ++info: Records: 12 Duplicates: 0 Warnings: 0 + SELECT * FROM fts_test WHERE MATCH (title, body) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + id title body +@@ -76,8 +80,10 @@ + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + CREATE FULLTEXT INDEX idx on fts_test (title, body) LOCK=NONE; +-ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED +-ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; ++ERROR 0A000: LOCK=NONE is not supported. Reason: Not implemented for system-versioned operations. Try LOCK=SHARED ++ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); ++affected rows: 6 ++info: Records: 6 Duplicates: 0 Warnings: 0 + ALTER TABLE fts_test ROW_FORMAT=REDUNDANT, LOCK=NONE; + ERROR 0A000: LOCK=NONE is not supported. Reason: Fulltext index creation requires a lock. Try LOCK=SHARED + ALTER TABLE fts_test ROW_FORMAT=REDUNDANT; +@@ -162,7 +168,7 @@ + (20, 'MySQL Security','When configured properly, MySQL ...'); + ALTER TABLE articles ADD FULLTEXT INDEX idx (title), + ADD FULLTEXT INDEX idx3 (title), ALGORITHM=INPLACE; +-ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY ++ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY + ALTER TABLE articles ADD FULLTEXT INDEX idx (title), + ADD FULLTEXT INDEX idx3 (title); + affected rows: 6 +@@ -274,7 +280,7 @@ + call mtr.add_suppression("InnoDB: Failed to create"); + CREATE TABLE t1(a TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL UNIQUE) ENGINE=InnoDB; + ALTER TABLE t1 ADD FULLTEXT(a), ALGORITHM=INPLACE; +-ERROR HY000: Got error 11 "Resource temporarily unavailable" from storage engine InnoDB ++ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY + DROP TABLE t1; + CREATE TABLE t1 (a VARCHAR(3)) ENGINE=InnoDB; + ALTER TABLE t1 ADD FULLTEXT KEY(a), ADD COLUMN b VARCHAR(3), ADD FULLTEXT KEY(b); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers.rdiff mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,10 @@ +--- innodb-fts-fic.result ++++ innodb-fts-fic.reject +@@ -172,7 +172,6 @@ + (1, 'MySQL Tutorial','DBMS stands for DataBase ...'), + (2, 'How To Use MySQL Well','After you went through a ...'); + CREATE FULLTEXT INDEX idx ON wp(title, text); +-ERROR HY000: Column 'FTS_DOC_ID' is of wrong type for an InnoDB FULLTEXT index + DROP TABLE wp; + CREATE TABLE wp( + FTS_DOC_ID bigint unsigned PRIMARY KEY, diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers_trx.rdiff mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers_trx.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers_trx.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb-fts-fic,vers_trx.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,10 @@ +--- innodb-fts-fic.result ++++ innodb-fts-fic.reject +@@ -172,7 +172,6 @@ + (1, 'MySQL Tutorial','DBMS stands for DataBase ...'), + (2, 'How To Use MySQL Well','After you went through a ...'); + CREATE FULLTEXT INDEX idx ON wp(title, text); +-ERROR HY000: Column 'FTS_DOC_ID' is of wrong type for an InnoDB FULLTEXT index + DROP TABLE wp; + CREATE TABLE wp( + FTS_DOC_ID bigint unsigned PRIMARY KEY, diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb_fts_proximity.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb_fts_proximity.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/innodb_fts_proximity.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/innodb_fts_proximity.result 2024-08-03 07:29:58.000000000 +0000 @@ -134,6 +134,7 @@ 2 DROP TABLE t1; set global innodb_file_per_table=1; +set names utf8; CREATE TABLE t1 ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, a TEXT, @@ -160,7 +161,7 @@ WHERE MATCH (a,b,c) AGAINST ('"very blob"@4' IN BOOLEAN MODE); count(*) -4 +5 SELECT count(*) FROM t1 WHERE MATCH (a,b,c) AGAINST ('"interesting blob"@9' IN BOOLEAN MODE); @@ -175,7 +176,7 @@ WHERE MATCH (a,b,c) AGAINST ('"very blob"@4 - "interesting blob"@9' IN BOOLEAN MODE); COUNT(*) -3 +4 DROP TABLE t1; CREATE TABLE t1 ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/limit_union.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/limit_union.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/limit_union.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/limit_union.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,157 @@ +# Bug #22709692 FTS QUERY EXCEEDS RESULT CACHE LIMIT +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body), +FULLTEXT (body))ENGINE=InnoDB; +INSERT INTO articles (title,body) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...'), +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +SET @default_cache_size = @@GLOBAL.query_cache_size; +SET GLOBAL query_cache_size=0; +# Query involves Ranking +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL' IN NATURAL LANGUAGE MODE) LIMIT 1; +id title body +6 MySQL Security When configured properly, MySQL ... +# Without optimization +SET @save_dbug = @@debug_dbug; +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL' IN NATURAL LANGUAGE MODE) LIMIT 1; +id title body +6 MySQL Security When configured properly, MySQL ... +SET debug_dbug = @save_dbug; +# Query involves No Ranking and fts_union operations +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL' IN BOOLEAN MODE) limit 1; +id title body +6 MySQL Security When configured properly, MySQL ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL' IN BOOLEAN MODE) limit 1; +id title body +6 MySQL Security When configured properly, MySQL ... +SET debug_dbug = @save_dbug; +# Query involves No ranking and fts_union, fts_ignore +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL -YourSQL' IN BOOLEAN MODE) limit 1; +id title body +6 MySQL Security When configured properly, MySQL ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL -YourSQL' IN BOOLEAN MODE) limit 1; +id title body +6 MySQL Security When configured properly, MySQL ... +SET debug_dbug = @save_dbug; +# Query with fts_intersect +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL +YourSQL' IN BOOLEAN MODE) limit 1; +id title body +5 MySQL vs. YourSQL In the following database comparison ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL +YourSQL' IN BOOLEAN MODE) limit 1; +id title body +5 MySQL vs. YourSQL In the following database comparison ... +SET debug_dbug = @save_dbug; +INSERT INTO articles (title,body) VALUES +('MySQL Tutorial','request doc@oraclehelp.com ...'), +('MySQL Tutorial','request support@oraclehelp.com ...'), +('Trial version','query performace @1255 minute on 2.1Hz + Memory 2GB...'), +('when To Use MySQL Well','for free faq mail@xyz.com ...'); +# Query with @distance +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('"MySQL request"@3' IN BOOLEAN MODE) limit 1; +id title body +7 MySQL Tutorial request doc@oraclehelp.com ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('"MySQL request"@3' IN BOOLEAN MODE) limit 1; +id title body +7 MySQL Tutorial request doc@oraclehelp.com ... +SET debug_dbug = @save_dbug; +# Query with subexpression +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('+MySQL +(-support +doc)' IN BOOLEAN MODE) limit 1; +id title body +7 MySQL Tutorial request doc@oraclehelp.com ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('+MySQL +(-support +doc)' IN BOOLEAN MODE) limit 1; +id title body +7 MySQL Tutorial request doc@oraclehelp.com ... +SET debug_dbug = @save_dbug; +# limit num1 OFFSET num2 +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL' in boolean mode) limit 4 offset 2; +id title body +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +5 MySQL vs. YourSQL In the following database comparison ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('MySQL' in boolean mode) limit 4 offset 2; +id title body +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +5 MySQL vs. YourSQL In the following database comparison ... +SET debug_dbug = @save_dbug; +# wild card search +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('ru*' IN BOOLEAN MODE) limit 1; +id title body +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('ru*' IN BOOLEAN MODE) limit 1; +id title body +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +SET debug_dbug = @save_dbug; +# phrase search +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('"request support"' IN BOOLEAN MODE) limit 1; +id title body +8 MySQL Tutorial request support@oraclehelp.com ... +# Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('"request support"' IN BOOLEAN MODE) limit 1; +id title body +8 MySQL Tutorial request support@oraclehelp.com ... +SET debug_dbug = @save_dbug; +DROP TABLE articles; +SET GLOBAL query_cache_size = @default_cache_size; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,1878 @@ +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 (a,b) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `a` varchar(200) DEFAULT NULL, + `b` text DEFAULT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `idx` (`a`,`b`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id +1 +3 +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +id +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +id x +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +select id, MATCH(a,b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; +id x +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +select id from t1 where MATCH a,b AGAINST ("+call* +coll*" IN BOOLEAN MODE); +id +select id from t1 where MATCH a,b AGAINST ('"support now"' IN BOOLEAN MODE); +id +select id from t1 where MATCH a,b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST ("collections" WITH QUERY EXPANSION); +id +select id from t1 where MATCH(a,b) AGAINST ("indexes" WITH QUERY EXPANSION); +id +select id from t1 where MATCH(a,b) AGAINST ("indexes collections" WITH QUERY EXPANSION); +id +ALTER TABLE t1 DROP INDEX idx; +CREATE FULLTEXT INDEX idx on t1 (a,b); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id +1 +3 +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +id +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +id x +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +select id, MATCH(a,b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; +id x +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +select id from t1 where MATCH a,b AGAINST ("+call* +coll*" IN BOOLEAN MODE); +id +select id from t1 where MATCH a,b AGAINST ('"support now"' IN BOOLEAN MODE); +id +select id from t1 where MATCH a,b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST ("collections" WITH QUERY EXPANSION); +id +select id from t1 where MATCH(a,b) AGAINST ("indexes" WITH QUERY EXPANSION); +id +select id from t1 where MATCH(a,b) AGAINST ("indexes collections" WITH QUERY EXPANSION); +id +INSERT INTO t1 (a,b) VALUES ('test query expansion','for database ...'); +INSERT INTO t1 (a,b) VALUES +('test proximity search, test, proximity and phrase', +'search, with proximity innodb'); +INSERT INTO t1 (a,b) VALUES +('test proximity fts search, test, proximity and phrase', +'search, with proximity innodb'); +INSERT INTO t1 (a,b) VALUES +('test more proximity fts search, test, more proximity and phrase', +'search, with proximity innodb'); +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"proximity search"@2' IN BOOLEAN MODE); +id +8 +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"proximity search"@1' IN BOOLEAN MODE); +id +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"proximity search"@3' IN BOOLEAN MODE); +id +8 +9 +10 +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"test proximity"@3' IN BOOLEAN MODE); +id +8 +9 +10 +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"more test proximity"@3' IN BOOLEAN MODE); +id +10 +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"more test proximity"@2' IN BOOLEAN MODE); +id +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"more fts proximity"@02' IN BOOLEAN MODE); +id +DROP TABLE t1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +CREATE FULLTEXT INDEX idx on t1 (a,b); +INSERT INTO t1 (a,b) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'); +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id +1 +3 +SELECT id FROM t1 WHERE id = (SELECT MAX(id) FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)); +id +3 +SELECT id FROM t1 WHERE id = (SELECT MIN(id) FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)); +id +1 +SELECT id FROM t1 WHERE id = (SELECT MIN(id) FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)) OR id = 3 ; +id +1 +3 +SELECT id FROM t1 WHERE CONCAT(t1.a,t1.b) IN ( +SELECT CONCAT(a,b) FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +) OR t1.id = 3 ; +id +1 +3 +SELECT id FROM t1 WHERE CONCAT(t1.a,t1.b) IN ( +SELECT CONCAT(a,b) FROM t1 AS t2 +WHERE MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +AND t2.id != 3) ; +id +1 +SELECT id FROM t1 WHERE id IN (SELECT MIN(id) FROM t1 WHERE +MATCH (a,b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)) OR id = 3 ; +id +1 +3 +SELECT id FROM t1 WHERE id NOT IN (SELECT MIN(id) FROM t1 +WHERE MATCH (a,b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)) ; +id +2 +3 +4 +5 +6 +SELECT id FROM t1 WHERE EXISTS (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +AND t1.id = t2.id) ; +id +1 +3 +SELECT id FROM t1 WHERE NOT EXISTS (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +AND t1.id = t2.id) ; +id +2 +4 +5 +6 +DROP TABLE t1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT , +FULLTEXT (a,b) +) ENGINE = InnoDB; +INSERT INTO t1(a,b) VALUES('MySQL has now support', 'for full-text search'), +('Full-text indexes', 'are called collections'), +('Only MyISAM tables','support collections'), +('Function MATCH ... AGAINST()','is used to do a search'), +('Full-text search in MySQL', 'implements vector space model'); +SELECT id FROM t1 WHERE t1.id = (SELECT MAX(t2.id) FROM t1 AS t2 WHERE +MATCH(t2.a,t2.b) AGAINST("+support +collections" IN BOOLEAN MODE)); +id +3 +SELECT id FROM t1 WHERE t1.id != (SELECT MIN(t2.id) FROM t1 AS t2 WHERE +MATCH(t2.a,t2.b) AGAINST("+search" IN BOOLEAN MODE)); +id +2 +3 +4 +5 +SELECT id FROM t1 WHERE t1.id IN (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ("+call* +coll*" IN BOOLEAN MODE)); +id +2 +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE) AND t2.id=t1.id); +id +1 +INSERT INTO t1 (a,b) VALUES ('test query expansion','for database ...'); +INSERT INTO t1 (a,b) VALUES +('test proximity search, test, proximity and phrase', +'search, with proximity innodb'); +INSERT INTO t1 (a,b) VALUES +('test proximity fts search, test, proximity and phrase', +'search, with proximity innodb'); +INSERT INTO t1 (a,b) VALUES +('test more proximity fts search, test, more proximity and phrase', +'search, with proximity innodb'); +SELECT id FROM t1 WHERE t1.id = (SELECT MAX(t2.id) FROM t1 AS t2 WHERE +MATCH(t2.a,t2.b) AGAINST ('"proximity search"@2' IN BOOLEAN MODE)); +id +7 +SELECT id FROM t1 WHERE t1.id > (SELECT MIN(t2.id) FROM t1 AS t2 WHERE +MATCH(t2.a,t2.b) AGAINST ('"proximity search"@2' IN BOOLEAN MODE)); +id +8 +9 +SELECT id FROM t1 WHERE t1.id IN (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('"proximity search"@2' IN BOOLEAN MODE)); +id +7 +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"proximity search"@2' IN BOOLEAN MODE) +AND t2.id=t1.id); +id +7 +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"more test proximity"@3' IN BOOLEAN MODE) +AND t2.id=t1.id); +id +9 +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"more test proximity"@2' IN BOOLEAN MODE) +AND t2.id=t1.id); +id +CREATE TABLE t2 ENGINE = InnoDB AS SELECT id FROM t1 WHERE +MATCH a,b AGAINST ('support') ; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(10) unsigned NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT id FROM t2; +id +1 +3 +DROP TABLE t2; +CREATE TABLE t2 ENGINE = InnoDB AS SELECT id FROM t1 WHERE +MATCH a,b AGAINST("+support +collections" IN BOOLEAN MODE); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(10) unsigned NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT id FROM t2; +id +3 +DROP TABLE t2; +CREATE TABLE t2 ENGINE = InnoDB AS SELECT id FROM t1 WHERE +MATCH a,b AGAINST ('"proximity search"@10' IN BOOLEAN MODE); +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `id` int(10) unsigned NOT NULL DEFAULT 0 +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT id FROM t2; +id +7 +8 +9 +DROP TABLE t2; +DROP TABLE t1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +CREATE FULLTEXT INDEX idx on t1 (a,b); +INSERT INTO t1 (a,b) VALUES +('MySQL from Tutorial','DBMS stands for DataBase ...'); +INSERT INTO t1 (a,b) VALUES +('when To Use MySQL Well','After that you went through a ...'); +INSERT INTO t1 (a,b) VALUES +('where will Optimizing MySQL','what In this tutorial we will show ...'); +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL null...'); +SELECT COUNT(*) FROM t1; +COUNT(*) +106 +SELECT COUNT(*) FROM t1 WHERE a IS NULL; +COUNT(*) +100 +SELECT COUNT(*) FROM t1 WHERE b IS NOT NULL; +COUNT(*) +6 +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id +1 +103 +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST (NULL IN NATURAL LANGUAGE MODE); +id +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST (NULL WITH QUERY EXPANSION); +id +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('null' IN NATURAL LANGUAGE MODE); +id +106 +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); +id +106 +1 +52 +103 +104 +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE) AND (a IS NOT NULL OR b IS NOT NULL); +id +106 +1 +52 +103 +104 +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE) AND (a IS NULL AND b IS NOT NULL); +id +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('DBMS Security' IN BOOLEAN MODE); +id +1 +106 +SELECT COUNT(*) FROM t1 +WHERE MATCH (a,b) +AGAINST ('database' WITH QUERY EXPANSION); +COUNT(*) +6 +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"following database"@10' IN BOOLEAN MODE); +id +105 +DROP TABLE t1; +drop table if exists t50; +set names utf8; +"----------Test1---------" +create table t50 (s1 varchar(60) character set utf8 collate utf8_bin) engine = innodb; +create fulltext index i on t50 (s1); +insert into t50 values ('ABCDE'),('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'); +select * from t50 where match(s1) against ('VÃÆ·WÄ°'); +s1 +VÃÆ·WÄ° +drop table t50; +"----------Test2---------" +create table t50 (s1 int unsigned primary key auto_increment, s2 +varchar(60) character set utf8) engine = innodb; +create fulltext index i on t50 (s2); +insert into t50 (s2) values ('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'),('ABCDE'); +select * from t50 order by s2; +s1 s2 +4 ABCDE +1 FGHIJ +2 KLMNO +3 VÃÆ·WÄ° +drop table t50; +"----------Test3---------" +create table t50 (id int unsigned primary key auto_increment, s2 +varchar(60) character set utf8) engine = innodb; +create fulltext index i on t50 (s2); +insert into t50 (s2) values ('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'),('ABCDE'); +set @@autocommit=0; +update t50 set s2 = lower(s2); +update t50 set s2 = upper(s2); +commit; +select * from t50 where match(s2) against ('VÃÆ·WÄ° FGHIJ KLMNO ABCDE' in boolean mode); +id s2 +1 FGHIJ +2 KLMNO +3 VÃÆ·WI +4 ABCDE +select * from t50; +id s2 +1 FGHIJ +2 KLMNO +3 VÃÆ·WI +4 ABCDE +drop table t50; +set @@autocommit=1; +"----------Test4---------" +create table t50 (id int unsigned primary key auto_increment, s2 +varchar(60) character set utf8) engine = innodb; +create fulltext index i on t50 (s2); +insert into t50 (s2) values ('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'),('ABCD*'); +select * from t50 where match(s2) against ('abcd*' in natural language +mode); +id s2 +4 ABCD* +select * from t50 where match(s2) against ('abcd*' in boolean mode); +id s2 +4 ABCD* +drop table t50; +"----------Test5---------" +create table t50 (s1 int, s2 varchar(200), fulltext key(s2)) engine = innodb; +set @@autocommit=0; +insert into t50 values (1,'Sunshine'),(2,'Lollipops'); +select * from t50 where match(s2) against('Rainbows'); +s1 s2 +rollback; +select * from t50; +s1 s2 +drop table t50; +set @@autocommit=1; +"----------Test6---------" +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 (a,b) VALUES +('aab` MySQL Tutorial','DBMS stands for DataBase ...') , +('aas How To Use MySQL Well','After you went through a ...'), +('aac Optimizing MySQL','In this tutorial we will show ...'); +INSERT INTO t1 (a,b) VALUES +('aac 1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('aab MySQL vs. YourSQL','In the following database comparison ...'), +('aaa MySQL Security','When configured properly, MySQL ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +SELECT * FROM t1 ORDER BY MATCH(a,b) AGAINST ('aac') DESC; +id a b +3 aac Optimizing MySQL In this tutorial we will show ... +4 aac 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +1 aab` MySQL Tutorial DBMS stands for DataBase ... +2 aas How To Use MySQL Well After you went through a ... +5 aab MySQL vs. YourSQL In the following database comparison ... +6 aaa MySQL Security When configured properly, MySQL ... +SELECT * FROM t1 ORDER BY MATCH(a,b) AGAINST ('aab') DESC; +id a b +1 aab` MySQL Tutorial DBMS stands for DataBase ... +5 aab MySQL vs. YourSQL In the following database comparison ... +2 aas How To Use MySQL Well After you went through a ... +3 aac Optimizing MySQL In this tutorial we will show ... +4 aac 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +6 aaa MySQL Security When configured properly, MySQL ... +"----------Test7---------" +select * from t1 where match(a,b) against ('aaa') +union select * from t1 where match(a,b) against ('aab') +union select * from t1 where match(a,b) against ('aac'); +id a b +6 aaa MySQL Security When configured properly, MySQL ... +1 aab` MySQL Tutorial DBMS stands for DataBase ... +5 aab MySQL vs. YourSQL In the following database comparison ... +3 aac Optimizing MySQL In this tutorial we will show ... +4 aac 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +select * from t1 where match(a,b) against ('aaa') +or match(a,b) against ('aab') +or match(a,b) against ('aac'); +id a b +1 aab` MySQL Tutorial DBMS stands for DataBase ... +3 aac Optimizing MySQL In this tutorial we will show ... +4 aac 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +5 aab MySQL vs. YourSQL In the following database comparison ... +6 aaa MySQL Security When configured properly, MySQL ... +DROP TABLE t1; +"----------Test8---------" +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 (a,b) VALUES +('MySQL Tutorial','DBMS stands for DataBase ... abcd') , +('How To Use MySQL Well','After you went through a q ...abdd'), +('Optimizing MySQL','In this tutorial we will show ...abed'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `a` varchar(200) DEFAULT NULL, + `b` text DEFAULT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `idx` (`a`,`b`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. q ...'), +('MySQL vs. YourSQL use','In the following database comparison ...'), +('MySQL Security','When run configured properly, MySQL ...'); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('run'); +id a b +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. q ... +6 MySQL Security When run configured properly, MySQL ... +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('use'); +id a b +2 How To Use MySQL Well After you went through a q ...abdd +5 MySQL vs. YourSQL use In the following database comparison ... +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('went'); +id a b +2 How To Use MySQL Well After you went through a q ...abdd +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('run') AND NOT MATCH(a,b) AGAINST ('q'); +id a b +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. q ... +6 MySQL Security When run configured properly, MySQL ... +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('use') AND NOT MATCH(a,b) AGAINST ('q'); +id a b +2 How To Use MySQL Well After you went through a q ...abdd +5 MySQL vs. YourSQL use In the following database comparison ... +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('went') AND NOT MATCH(a,b) AGAINST ('q'); +id a b +2 How To Use MySQL Well After you went through a q ...abdd +"----------Test9---------" +CREATE TABLE t2 AS SELECT * FROM t1; +ALTER TABLE t2 ENGINE=MYISAM; +CREATE FULLTEXT INDEX i ON t2 (a,b); +SET @x = (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('run')); +SET @x = @x + (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('use')); +SET @x = @x + (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('went')); +SET @x = @x + (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('run')); +SET @x2 = (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('run')); +SET @x2 = @x2 + (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('use')); +SET @x2 = @x2 + (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('went')); +SET @x2 = @x2 + (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('run')); +SELECT @x, @x2; +@x @x2 +7 0 +DROP TABLE t2; +"----------Test10---------" +CREATE TABLE t2 AS SELECT * FROM t1; +ALTER TABLE t2 ENGINE=MYISAM; +CREATE FULLTEXT INDEX i ON t2 (a,b); +SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('abc*' IN BOOLEAN MODE); +COUNT(*) +1 +SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('abc*' IN BOOLEAN MODE); +COUNT(*) +1 +DROP TABLE t2; +"----------Test11---------" +CREATE TABLE t2 AS SELECT * FROM t1; +ALTER TABLE t2 ENGINE = MYISAM; +CREATE FULLTEXT INDEX i ON t2 (a,b); +ALTER TABLE t2 ENGINE=InnoDB; +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('run'); +id a b +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. q ... +6 MySQL Security When run configured properly, MySQL ... +SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('abc*' IN BOOLEAN MODE); +COUNT(*) +1 +DROP TABLE t2,t1; +"----------Test13---------" +set names utf8; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200) CHARACTER SET UTF8 COLLATE UTF8_SPANISH_CI) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t1 (s2); +INSERT INTO t1 VALUES (1,'aaCen'),(2,'aaCha'),(3,'aaCio'),(4,'aaçen'),(5,'aaçha'),(6,'aaçio'); +SELECT * FROM t1 WHERE MATCH(s2) AGAINST ('aach*' IN BOOLEAN MODE); +s1 s2 +2 aaCha +5 aaçha +SELECT * FROM t1 WHERE MATCH(s2) AGAINST ('aaC*' IN BOOLEAN MODE); +s1 s2 +1 aaCen +2 aaCha +3 aaCio +4 aaçen +5 aaçha +6 aaçio +DROP TABLE t1; +"----------Test14---------" +CREATE TABLE t1(s1 INT , s2 VARCHAR(100) CHARACTER SET sjis) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t1 (s2); +INSERT INTO t1 VALUES (1,'ペペペ'),(2,'テテテ'),(3,'ルルル'),(4,'ã‚°ã‚°ã‚°'); +DROP TABLE t1; +"----------Test15---------" +CREATE TABLE t1 (s1 VARCHAR (60) CHARACTER SET UTF8 COLLATE UTF8_UNICODE_520_CI) ENGINE = MyISAM; +CREATE FULLTEXT INDEX i ON t1 (s1); +INSERT INTO t1 VALUES +('a'),('b'),('c'),('d'),('ÅÅÅÅ'),('LLLL'),(NULL),('ÅÅÅÅ ÅÅÅÅ'),('LLLLLLLL'); +SELECT * FROM t1 WHERE MATCH(s1) AGAINST ('LLLL' COLLATE UTF8_UNICODE_520_CI); +s1 +ÅÅÅÅ +LLLL +ÅÅÅÅ ÅÅÅÅ +DROP TABLE if EXISTS t2; +Warnings: +Note 1051 Unknown table 'test.t2' +CREATE TABLE t2 (s1 VARCHAR(60) CHARACTER SET UTF8 COLLATE UTF8_POLISH_CI) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t2 ( s1); +INSERT INTO t2 VALUES +('a'),('b'),('c'),('d'),('ÅÅÅÅ'),('LLLL'),(NULL),('ÅÅÅÅ ÅÅÅÅ'),('LLLLLLLL'); +SELECT * FROM t2 WHERE MATCH(s1) AGAINST ('LLLL' COLLATE UTF8_UNICODE_520_CI); +s1 +LLLL +DROP TABLE t1,t2; +"----------Test16---------" +CREATE TABLE t1 (s1 INT, s2 VARCHAR(50) CHARACTER SET UTF8) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t1(s2); +INSERT INTO t1 VALUES (2, 'ÄŸÄ— DaÅ›i p '); +SELECT * FROM t1 WHERE MATCH(s2) AGAINST ('+p +"ÄŸÄ— DaÅ›i*"' IN BOOLEAN MODE); +s1 s2 +DROP TABLE t1; +"----------Test19---------" +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF8) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1,'İóëɠ'); +CREATE FULLTEXT INDEX i ON t1 (char_column); +SELECT * FROM t1 WHERE MATCH(char_column) AGAINST ('"İóëɠ"' IN BOOLEAN MODE); +id char_column +1 İóëɠ +DROP TABLE t1; +"----------Test20---------" +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF32, char_column2 VARCHAR(60) character set utf8) ENGINE = InnoDB; +INSERT INTO t1 (char_column) VALUES ('abcde'),('fghij'),('klmno'),('qrstu'); +UPDATE t1 SET char_column2 = char_column; +CREATE FULLTEXT INDEX i ON t1 (char_column2); +SELECT * FROM t1 WHERE MATCH(char_column) AGAINST ('abc*' IN BOOLEAN MODE); +ERROR HY000: Can't find FULLTEXT index matching the column list +DROP TABLE t1; +"----------Test22---------" +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF8) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1,'aaa'),(2,'bbb'),(3,'ccc'); +CREATE FULLTEXT INDEX i ON t1 (char_column); +HANDLER t1 OPEN; +HANDLER t1 READ i = ('aaa'); +ERROR HY000: FULLTEXT index `i` does not support this operation +DROP TABLE t1; +"----------Test25---------" +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF8 COLLATE UTF8_CROATIAN_CI) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'LJin'),(2,'ljin'),(3,'lmin'),(4,'LJLJLJLJLJ'); +CREATE FULLTEXT INDEX i ON t1 (char_column); +SELECT count(*) FROM t1 WHERE MATCH (char_column) AGAINST ('lj*' IN BOOLEAN MODE); +count(*) +3 +DROP TABLE t1; +"----------Test27---------" +CREATE TABLE t1 (id INT,char_column VARCHAR(60)) ENGINE=InnoDB; +SET @@autocommit=0; +CREATE FULLTEXT INDEX i ON t1 (char_column); +INSERT INTO t1 values (1,'aaa'); +"restart server..." +# Restart the server +--source include/restart_mysqld.inc +DELETE FROM t1 WHERE MATCH(char_column) AGAINST ('bbb') +SET @@autocommit=1; +DROP TABLE t1; +"----------Test28---------" +drop table if exists `fts_test`; +Warnings: +Note 1051 Unknown table 'test.fts_test' +create table `fts_test`(`a` text,fulltext key(`a`))engine=innodb; +set session autocommit=0; +insert into `fts_test` values (''); +savepoint `b`; +savepoint `b`; +set session autocommit=1; +DROP TABLE fts_test; +"----------Test29---------" +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body) +) ENGINE=InnoDB; +INSERT INTO articles (title,body) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...'); +start transaction; +INSERT INTO articles (title,body) VALUES +('How To Use MySQL Well','After you went through a ...'); +savepoint `a1`; +INSERT INTO articles (title,body) VALUES +('Optimizing MySQL','In this tutorial we will show ...'); +savepoint `a2`; +INSERT INTO articles (title,body) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'); +savepoint `a3`; +INSERT INTO articles (title,body) VALUES +('MySQL vs. YourSQL','In the following database comparison ...'); +savepoint `a4`; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('Database' IN NATURAL LANGUAGE MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +rollback to savepoint a3; +select title, body from articles; +title body +MySQL Tutorial DBMS stands for DataBase ... +How To Use MySQL Well After you went through a ... +Optimizing MySQL In this tutorial we will show ... +1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +INSERT INTO articles (title,body) VALUES +('MySQL Security','When configured properly, MySQL ...'); +savepoint `a5`; +select title, body from articles; +title body +MySQL Tutorial DBMS stands for DataBase ... +How To Use MySQL Well After you went through a ... +Optimizing MySQL In this tutorial we will show ... +1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +MySQL Security When configured properly, MySQL ... +rollback to savepoint a2; +select title, body from articles; +title body +MySQL Tutorial DBMS stands for DataBase ... +How To Use MySQL Well After you went through a ... +Optimizing MySQL In this tutorial we will show ... +commit; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('Database' IN NATURAL LANGUAGE MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +3 Optimizing MySQL In this tutorial we will show ... +DROP TABLE articles; +"----------Test30---------" +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body) +) ENGINE=InnoDB; +INSERT INTO articles (title,body) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...'); +start transaction; +INSERT INTO articles (title,body) VALUES +('How To Use MySQL Well','After you went through a ...'); +savepoint `a1`; +INSERT INTO articles (title,body) VALUES +('Optimizing MySQL','In this tutorial we will show ...'); +savepoint `a2`; +INSERT INTO articles (title,body) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'); +savepoint `a3`; +INSERT INTO articles (title,body) VALUES +('MySQL vs. YourSQL','In the following database comparison ...'); +savepoint `a4`; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('Database' IN NATURAL LANGUAGE MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +rollback to savepoint a3; +select title, body from articles; +title body +MySQL Tutorial DBMS stands for DataBase ... +How To Use MySQL Well After you went through a ... +Optimizing MySQL In this tutorial we will show ... +1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +INSERT INTO articles (title,body) VALUES +('MySQL Security','When configured properly, MySQL ...'); +savepoint `a5`; +select title, body from articles; +title body +MySQL Tutorial DBMS stands for DataBase ... +How To Use MySQL Well After you went through a ... +Optimizing MySQL In this tutorial we will show ... +1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +MySQL Security When configured properly, MySQL ... +rollback to savepoint a2; +select title, body from articles; +title body +MySQL Tutorial DBMS stands for DataBase ... +How To Use MySQL Well After you went through a ... +Optimizing MySQL In this tutorial we will show ... +rollback; +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('Database' IN NATURAL LANGUAGE MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +SELECT * FROM articles +WHERE MATCH (title,body) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +DROP TABLE articles; +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body) +) ENGINE=InnoDB; +INSERT INTO articles (title,body) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +ANALYZE TABLE articles; +SELECT *, MATCH(title, body) AGAINST ('-database +MySQL' IN BOOLEAN MODE) AS score from articles; +id title body score +1 MySQL Tutorial DBMS stands for DataBase ... 0 +2 How To Use MySQL Well After you went through a ... 0.000000001885928302414186 +3 Optimizing MySQL In this tutorial we will show ... 0.000000001885928302414186 +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... 0.000000001885928302414186 +5 MySQL vs. YourSQL In the following database comparison ... 0 +6 MySQL Security When configured properly, MySQL ... 0.000000003771856604828372 +SELECT *, MATCH(title, body) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score FROM articles; +id title body score +1 MySQL Tutorial DBMS stands for DataBase ... 0 +2 How To Use MySQL Well After you went through a ... 0.000000001885928302414186 +3 Optimizing MySQL In this tutorial we will show ... 0.000000001885928302414186 +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... 0.000000001885928302414186 +5 MySQL vs. YourSQL In the following database comparison ... 0 +6 MySQL Security When configured properly, MySQL ... 0.000000003771856604828372 +SELECT * FROM articles where MATCH(title, body) AGAINST ('MySQL - (database - tutorial)' IN BOOLEAN MODE); +id title body +6 MySQL Security When configured properly, MySQL ... +1 MySQL Tutorial DBMS stands for DataBase ... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +SELECT * FROM articles where MATCH(title, body) AGAINST ('MySQL - (- tutorial database)' IN BOOLEAN MODE); +id title body +6 MySQL Security When configured properly, MySQL ... +1 MySQL Tutorial DBMS stands for DataBase ... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +SELECT * FROM articles where MATCH(title, body) AGAINST ('MySQL - (- tutorial database) -Tricks' IN BOOLEAN MODE); +id title body +6 MySQL Security When configured properly, MySQL ... +1 MySQL Tutorial DBMS stands for DataBase ... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM articles where MATCH(title, body) AGAINST ('-Tricks MySQL - (- tutorial database)' IN BOOLEAN MODE); +id title body +6 MySQL Security When configured properly, MySQL ... +1 MySQL Tutorial DBMS stands for DataBase ... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +DROP TABLE articles; +drop table if exists t1; +Warnings: +Note 1051 Unknown table 'test.t1' +create table t1 (FTS_DOC_ID bigint unsigned auto_increment not null primary key, +title varchar(200),body text,fulltext(title,body)) engine=innodb; +insert into t1 set body='test'; +select * from t1 where match(title,body) against('%test'); +FTS_DOC_ID title body +1 NULL test +select * from t1 where match(title,body) against('%'); +FTS_DOC_ID title body +select * from t1 where match(title,body) against('%%%%'); +FTS_DOC_ID title body +drop table t1; +CREATE DATABASE `benu database`; +USE `benu database`; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 (a,b) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `a` varchar(200) DEFAULT NULL, + `b` text DEFAULT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `idx` (`a`,`b`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id +1 +3 +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +id +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +id x +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +select id, MATCH(a,b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; +id x +1 0 +2 0 +3 0 +4 0 +5 0 +6 0 +select id from t1 where MATCH a,b AGAINST ("+call* +coll*" IN BOOLEAN MODE); +id +select id from t1 where MATCH a,b AGAINST ('"support now"' IN BOOLEAN MODE); +id +select id from t1 where MATCH a,b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE); +id +DROP DATABASE `benu database`; +USE test; +CREATE TABLE `t21` (`a` text, `b` int not null, +fulltext key (`a`), fulltext key (`a`) +) ENGINE=INNODB DEFAULT CHARSET=LATIN1; +Warnings: +Note 1831 Duplicate index `a_2`. This is deprecated and will be disallowed in a future release +ALTER TABLE `t21` ADD UNIQUE INDEX (`b`), ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: InnoDB presently supports one FULLTEXT index creation at a time. Try ALGORITHM=COPY +ALTER TABLE `t21` ADD UNIQUE INDEX (`b`); +DROP TABLE t21; +CREATE TABLE `t21` (`a` text, `b` int not null, +fulltext key (`a`)) ENGINE=INNODB DEFAULT CHARSET=LATIN1; +ALTER TABLE `t21` ADD UNIQUE INDEX (`b`); +DROP TABLE t21; +CREATE TABLE t1 ( +id INT NOT NULL, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 VALUES +(1, 'MySQL Tutorial','DBMS stands for DataBase ...') , +(2, 'How To Use MySQL Well','After you went through a ...'), +(3, 'Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +ALTER TABLE t1 ADD UNIQUE INDEX (`id`); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id +1 +3 +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +id +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +id x +1 0 +2 0 +3 0 +DROP TABLE t1; +CREATE TABLE t1 ( +id INT NOT NULL, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 VALUES +(1, 'MySQL Tutorial','DBMS stands for DataBase ...') , +(2, 'How To Use MySQL Well','After you went through a ...'), +(3, 'Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD UNIQUE INDEX (`id`), ADD FULLTEXT INDEX idx (a,b); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id +1 +3 +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +id +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +id +DROP TABLE t1; +CREATE TABLE t1 ( +FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 VALUES +(1, 'MySQL Tutorial','DBMS stands for DataBase ...') , +(2, 'How To Use MySQL Well','After you went through a ...'), +(3, 'Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +ALTER TABLE t1 ADD UNIQUE INDEX (`FTS_DOC_ID`); +SELECT FTS_DOC_ID FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +FTS_DOC_ID +1 +3 +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +FTS_DOC_ID x +1 0 +2 0 +3 0 +DROP TABLE t1; +CREATE TABLE t1 ( +FTS_DOC_ID BIGINT UNSIGNED NOT NULL, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 VALUES +(1, 'MySQL Tutorial','DBMS stands for DataBase ...') , +(2, 'How To Use MySQL Well','After you went through a ...'), +(3, 'Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b), ADD UNIQUE INDEX FTS_DOC_ID_INDEX (FTS_DOC_ID); +SELECT FTS_DOC_ID FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +FTS_DOC_ID +1 +3 +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +FTS_DOC_ID +select FTS_DOC_ID, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +FTS_DOC_ID x +1 0 +2 0 +3 0 +DROP TABLE t1; +CREATE TABLE t2 (`b` char(2),fulltext(`b`)) ENGINE=INNODB +DEFAULT CHARSET=LATIN1; +CREATE TABLE t3 LIKE t2; +INSERT INTO `t2` VALUES(); +COMMIT WORK AND CHAIN; +INSERT INTO `t3` VALUES (); +UPDATE `t2` SET `b` = 'a'; +SAVEPOINT BATCH1; +DROP TABLE t2; +DROP TABLE t3; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE = InnoDB; +INSERT INTO t1 (a,b) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +COMMIT WORK AND CHAIN; +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +SAVEPOINT BATCH1; +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('MySQL' IN NATURAL LANGUAGE MODE); +id +1 +2 +3 +INSERT INTO t1 (a,b) VALUES +('1002 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +ROLLBACK TO SAVEPOINT BATCH1; +COMMIT; +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('MySQL' IN NATURAL LANGUAGE MODE); +id +6 +1 +2 +3 +4 +5 +DROP TABLE t1; +CREATE TABLE `t` (`a` char(20) character set utf8 default null, +fulltext key (`a`)) ENGINE=INNODB; +INSERT INTO `t` VALUES ('a'); +INSERT INTO `t` VALUES ('aaa'); +SELECT MATCH(`a`) AGAINST (0x22dd22) FROM `t`; +MATCH(`a`) AGAINST (0x22dd22) +0 +0 +SELECT MATCH(`a`) AGAINST (0x2222) FROM `t`; +MATCH(`a`) AGAINST (0x2222) +0 +0 +SELECT MATCH(`a`) AGAINST (0x22) FROM `t`; +MATCH(`a`) AGAINST (0x22) +0 +0 +SELECT MATCH(`a`) AGAINST (0x2261616122) FROM `t`; +MATCH(`a`) AGAINST (0x2261616122) +0 +0.0906190574169159 +SELECT MATCH(`a`) AGAINST (0x2261dd6122) FROM `t`; +MATCH(`a`) AGAINST (0x2261dd6122) +0 +0 +SELECT MATCH(`a`) AGAINST (0x2261dd612222226122) FROM `t`; +MATCH(`a`) AGAINST (0x2261dd612222226122) +0 +0 +DROP TABLE t; +CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB; +HANDLER t OPEN; +HANDLER t READ a NEXT; +a +HANDLER t READ a PREV; +a +DROP TABLE t; +CREATE TABLE `%`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; +CREATE TABLE `A B`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; +DROP TABLE `%`; +DROP TABLE `A B`; +CREATE TABLE `t-26`(a VARCHAR(10),FULLTEXT KEY(a)) ENGINE=INNODB; +INSERT INTO `t-26` VALUES('117'); +DROP TABLE `t-26`; +CREATE TABLE `t1` ( +`id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, +`content` TEXT NOT NULL, +PRIMARY KEY (`id`), +FULLTEXT INDEX `IDX_CONTEXT_FULLTEXT`(`content`) +) +ENGINE = InnoDB; +insert into t1 (content) +values +('This is a story which has has a complicated phrase structure here in the +middle'), +('This is a story which doesn''t have that text'), +('This is a story that has complicated the phrase structure'); +select * from t1 +where match(content) against('"complicated phrase structure"' in boolean +mode); +id content +1 This is a story which has has a complicated phrase structure here in the +middle +select * from t1 +where match(content) against('+"complicated phrase structure"' in boolean +mode); +id content +1 This is a story which has has a complicated phrase structure here in the +middle +select * from t1 +where match(content) against('"complicated the phrase structure"' in boolean +mode); +id content +3 This is a story that has complicated the phrase structure +select * from t1 where match(content) against('+"this is a story which" +"complicated the phrase structure"' in boolean mode); +id content +select * from t1 where match(content) against('"the complicated the phrase structure"' in boolean mode); +id content +3 This is a story that has complicated the phrase structure +select * from t1 where match(content) against('"complicated a phrase structure"' in boolean mode); +id content +DROP TABLE t1; +CREATE TABLE my (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, +c VARCHAR(32), FULLTEXT(c)) ENGINE = INNODB; +INSERT INTO my (c) VALUES ('green-iguana'); +SELECT * FROM my WHERE MATCH(c) AGAINST ('green-iguana'); +id c +1 green-iguana +DROP TABLE my; +CREATE TABLE ift ( +`a` int(11) NOT NULL, +`b` text, +PRIMARY KEY (`a`), +FULLTEXT KEY `b` (`b`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +INSERT INTO ift values (1, "skip"); +INSERT INTO ift values (2, "skip and networking"); +INSERT INTO ift values (3, "--skip-networking"); +INSERT INTO ift values (4, "-donot--skip-networking"); +SELECT * FROM ift WHERE MATCH (b) AGAINST ('--skip-networking'); +a b +2 skip and networking +3 --skip-networking +4 -donot--skip-networking +1 skip +SELECT * FROM ift WHERE MATCH (b) AGAINST ('skip-networking'); +a b +2 skip and networking +3 --skip-networking +4 -donot--skip-networking +1 skip +SELECT * FROM ift WHERE MATCH (b) AGAINST ('----'); +a b +SELECT * FROM ift WHERE MATCH (b) AGAINST ('-donot--skip-networking'); +a b +4 -donot--skip-networking +2 skip and networking +3 --skip-networking +1 skip +DROP TABLE ift; +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body) +) ENGINE=InnoDB; +INSERT INTO articles (title,body) VALUES +('MySQL Tutorial','DBMS stands for DataBase ...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('( that''s me )','When configured properly, MySQL ...'); +SELECT * FROM articles WHERE MATCH (title,body) +AGAINST ('( yours''s* )' IN BOOLEAN MODE); +id title body +5 MySQL vs. YourSQL In the following database comparison ... +SELECT * FROM articles WHERE MATCH (title,body) +AGAINST ('s*' IN BOOLEAN MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM articles WHERE MATCH (title,body) +AGAINST ('stands\'] | * | show[@database' IN NATURAL LANGUAGE MODE); +id title body +1 MySQL Tutorial DBMS stands for DataBase ... +3 Optimizing MySQL In this tutorial we will show ... +5 MySQL vs. YourSQL In the following database comparison ... +DROP TABLE articles; +CREATE TABLE t1(a TEXT CHARACTER SET LATIN1, FULLTEXT INDEX(a)) ENGINE=INNODB; +SELECT * FROM t1 WHERE MATCH(a) AGAINST("*"); +ERROR 42000: syntax error, unexpected $end, expecting FTS_TERM or FTS_NUMB or '*' +DROP TABLE t1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +FULLTEXT (a) +) ENGINE= InnoDB; +INSERT INTO t1 (a) VALUES +('Do you know MySQL is a good database'), +('How to build a good database'), +('Do you know'), +('Do you know MySQL'), +('How to use MySQL'), +('Do you feel good'), +('MySQL is good'), +('MySQL is good to know'), +('What is database'); +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know mysql"' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +4 Do you know MySQL +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+("know mysql")' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +4 Do you know MySQL +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('("know mysql" good)' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +4 Do you know MySQL +2 How to build a good database +6 Do you feel good +7 MySQL is good +8 MySQL is good to know +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+("know mysql" good)' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +4 Do you know MySQL +2 How to build a good database +6 Do you feel good +7 MySQL is good +8 MySQL is good to know +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('(good "know mysql")' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +4 Do you know MySQL +2 How to build a good database +6 Do you feel good +7 MySQL is good +8 MySQL is good to know +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+(good "know mysql")' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +4 Do you know MySQL +2 How to build a good database +6 Do you feel good +7 MySQL is good +8 MySQL is good to know +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+("know mysql" "good database")' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +2 How to build a good database +4 Do you know MySQL +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know mysql" +"good database"' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know database"@4' IN BOOLEAN MODE); +id a +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know database"@8' IN BOOLEAN MODE); +id a +1 Do you know MySQL is a good database +DROP TABLE t1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +FULLTEXT (a) +) ENGINE= InnoDB; +INSERT INTO t1 (a) VALUES +('know mysql good database'); +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"good database"' IN BOOLEAN MODE); +id a +1 know mysql good database +DROP TABLE t1; +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body) +) ENGINE=InnoDB; +INSERT INTO articles (title,body) VALUES ('Test Article','blah blah +blah'),("Matt's Noise",'this is noisy'),('February Weather','It was terrible +this year.'),('Peter Pan','Tis a kids story.'),('Test1','nada'),('Database +database database','foo database database database'),('Database article +title','body with lots of words.'),('myfulltext database', 'my test fulltext +database'); +SELECT id, title, body FROM articles ORDER BY MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) DESC; +id title body +6 Database +database database foo database database database +8 myfulltext database my test fulltext +database +7 Database article +title body with lots of words. +1 Test Article blah blah +blah +2 Matt's Noise this is noisy +3 February Weather It was terrible +this year. +4 Peter Pan Tis a kids story. +5 Test1 nada +DELETE from articles WHERE title like "myfulltext database"; +INSERT INTO articles (title,body) VALUES ('myfulltext database', 'my test fulltext database'); +SELECT id, title, body FROM articles ORDER BY MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) DESC; +id title body +6 Database +database database foo database database database +9 myfulltext database my test fulltext database +7 Database article +title body with lots of words. +1 Test Article blah blah +blah +2 Matt's Noise this is noisy +3 February Weather It was terrible +this year. +4 Peter Pan Tis a kids story. +5 Test1 nada +DELETE from articles WHERE title like "myfulltext database"; +INSERT INTO articles (title,body) VALUES ('myfulltext database', 'my test fulltext database'); +SELECT id, title, body FROM articles ORDER BY MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) DESC; +id title body +6 Database +database database foo database database database +10 myfulltext database my test fulltext database +7 Database article +title body with lots of words. +1 Test Article blah blah +blah +2 Matt's Noise this is noisy +3 February Weather It was terrible +this year. +4 Peter Pan Tis a kids story. +5 Test1 nada +DROP TABLE articles; +CREATE TABLE t1( +a TEXT CHARSET ujis COLLATE ujis_japanese_ci, +b TEXT CHARSET utf8mb4 COLLATE utf8mb4_turkish_ci, +c TEXT CHARSET eucjpms COLLATE eucjpms_bin, +d TEXT CHARSET utf8mb4, +FULLTEXT INDEX(a), +FULLTEXT INDEX(b), +FULLTEXT INDEX(c), +FULLTEXT INDEX(d) +) ENGINE = InnoDB; +INSERT INTO t1 VALUES +('myisam', 'myisam', 'myisam', 'myisam'), +('innodb', 'innodb', 'innodb', 'innodb'), +('innodb myisam', 'innodb myisam', 'innodb myisam', 'innodb myisam'), +('memory', 'memory', 'memory', 'memory'), +('archive', 'archive', 'archive', 'archive'), +('federated', 'federated', 'federated', 'federated'), +('storage engine innodb', 'storage engine innodb', 'storage engine innodb', 'storage engine innodb'), +('storage engine myisam', 'storage engine myisam', 'storage engine myisam', 'storage engine myisam'), +('innobase', 'innobase', 'innobase', 'innobase'), +('myisam innodb', 'myisam innodb', 'myisam innodb', 'myisam innodb'), +('innodb myisam engines', 'innodb myisam engines', 'innodb myisam engines', 'innodb myisam engines'); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00)); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', ' ', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '&', 0x00, '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '&', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '%', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +a +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +a +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +a +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"')); +a +innodb myisam +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', '(', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', ')')); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm')); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm', '"')); +a +innodb myisam +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +a +innodb myisam +myisam innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +a +innodb myisam +myisam innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); +ERROR 42000: syntax error, unexpected FTS_TERM, expecting FTS_NUMB +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"')); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00)); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', '"')); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', ' ', '"')); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 0x00, '"')); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', '&', 0x00, '"')); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 0x00, '&', '"')); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', '%', '"')); +b +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +b +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +b +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +b +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +b +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +b +innodb myisam +myisam innodb +innodb myisam engines +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +b +innodb myisam +myisam innodb +innodb myisam engines +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); +ERROR 42000: syntax error, unexpected FTS_TERM, expecting FTS_NUMB +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"')); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00)); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', '"')); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', ' ', '"')); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, '"')); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', '&', 0x00, '"')); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, '&', '"')); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', '%', '"')); +c +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +c +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +c +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +c +innodb +innodb myisam +storage engine innodb +myisam innodb +innodb myisam engines +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +c +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +c +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"')); +c +innodb myisam +innodb myisam engines +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', '(', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', ')')); +c +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm')); +c +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm', '"')); +c +innodb myisam +innodb myisam engines +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +c +innodb myisam +myisam innodb +innodb myisam engines +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +c +innodb myisam +myisam innodb +innodb myisam engines +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); +ERROR 42000: syntax error, unexpected FTS_TERM, expecting FTS_NUMB +ALTER TABLE t1 ENGINE = MyISAM; +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00)); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', ' ', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '&', 0x00, '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '&', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '%', '"')); +a +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +a +innodb +innodb myisam +myisam innodb +storage engine innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +a +innodb +innodb myisam +myisam innodb +storage engine innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +a +innodb +innodb myisam +myisam innodb +storage engine innodb +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"')); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', '(', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', ')')); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm')); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm', '"')); +a +innodb myisam +myisam innodb +innodb myisam engines +myisam +innodb +storage engine innodb +storage engine myisam +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +a +innodb myisam +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +a +innodb myisam +innodb myisam engines +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); +a +DROP TABLE t1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +FULLTEXT (a) +) ENGINE= InnoDB; +INSERT INTO t1 (a) VALUES +('know database'),('good database'), ('gmail email'), ('ghome windows'); +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g *' IN NATURAL LANGUAGE MODE); +id a +2 good database +3 gmail email +4 ghome windows +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +3 gmail email +4 ghome windows +2 good database +1 know database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * k *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +1 know database +3 gmail email +4 ghome windows +2 good database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * k * d *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +1 know database +3 gmail email +4 ghome windows +2 good database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * go *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +2 good database +3 gmail email +4 ghome windows +1 know database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * good' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +2 good database +3 gmail email +4 ghome windows +1 know database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('gm * go *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +3 gmail email +2 good database +1 know database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('good *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +2 good database +1 know database +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g* database' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); +id a +1 know database +2 good database +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc_1.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_1.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc_1.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_1.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,922 @@ +set names utf8; +call mtr.add_suppression("\\[Warning\\] InnoDB: A new Doc ID must be supplied while updating FTS indexed columns."); +call mtr.add_suppression("\\[Warning\\] InnoDB: FTS Doc ID must be larger than [0-9]+ for table `test`.`t1`"); +CREATE TABLE t1 ( +id1 INT , +a1 VARCHAR(200) , +b1 TEXT , +FULLTEXT KEY (a1,b1), PRIMARY KEY (a1, id1) +) CHARACTER SET = utf8 , ENGINE = InnoDB; +CREATE TABLE t2 ( +id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a2 VARCHAR(200), +b2 TEXT , +FOREIGN KEY (a2) REFERENCES t1(a1) ON UPDATE CASCADE, +FULLTEXT KEY (b2,a2) +) CHARACTER SET = utf8 ,ENGINE = InnoDB; +INSERT INTO t1 (id1,a1,b1) VALUES +(1,'MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , +(2,'How To Use MySQL Well','After you went through a ...'), +(3,'Optimizing MySQL','In this tutorial we will show ...'); +INSERT INTO t1 (id1,a1,b1) VALUES +(4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +(5,'MySQL vs. YourSQL','In the following database comparison ...'), +(6,'MySQL Security','When configured properly, MySQL ...'); +INSERT INTO t2 (a2,b2) VALUES +('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'); +INSERT INTO t2 (a2,b2) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +INSERT INTO t2 (a2,b2) VALUES +('MySQL Tricks','1. Never run mysqld as root. 2. ...'); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a2`) REFERENCES `t1` (`a1`) ON UPDATE CASCADE) +DELETE FROM t1; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a2`) REFERENCES `t1` (`a1`) ON UPDATE CASCADE) +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze Warning Engine-independent statistics are not collected for column 'b1' +test.t1 analyze status OK +ANALYZE TABLE t2; +Table Op Msg_type Msg_text +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze Warning Engine-independent statistics are not collected for column 'b2' +test.t2 analyze status OK +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial') ORDER BY id1; +id1 +1 +3 +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial') ORDER BY id2; +id2 +1 +3 +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id1; +id1 +1 +2 +3 +4 +5 +6 +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id2; +id2 +1 +2 +3 +4 +5 +6 +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id1; +id1 +1 +2 +3 +4 +5 +6 +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id2; +id2 +1 +2 +3 +4 +5 +6 +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; +id1 +1 +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; +id2 +1 +set global innodb_optimize_fulltext_only=1; +optimize table t1; +Table Op Msg_type Msg_text +test.t1 optimize status OK +set global innodb_optimize_fulltext_only=0; +UPDATE t1 SET a1 = "changing column - on update cascade" , b1 = "to check foreign constraint" WHERE +MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +id1 +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +id2 +3 +6 +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('+update +cascade' IN BOOLEAN MODE) ORDER BY id1; +id1 +1 +2 +3 +4 +5 +6 +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('+update +cascade' IN BOOLEAN MODE) ORDER BY id2; +id2 +1 +2 +3 +4 +5 +6 +SELECT id2 FROM t2 WHERE a2 LIKE '%UPDATE CASCADE%' ORDER BY id2; +id2 +1 +2 +3 +4 +5 +6 +DROP TABLE t2 , t1; +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), +fulltext key(s2), +foreign key (s1,s2) references t1 (s1,s2) on update cascade) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +update t1 set s2 = 'Rainbows' where s2 <> 'Sunshine'; +commit; +select * from t2 where match(s2) against ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), +fulltext key(s2), +foreign key (s1,s2) references t1 (s1,s2) on delete cascade) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +delete from t1 where s2 <> 'Sunshine'; +select * from t2 where match(s2) against ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), +fulltext key(s2), +foreign key (s1,s2) references t1 (s1,s2) on delete set null) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +delete from t1 where s2 <> 'Sunshine'; +select * from t2 where match(s2) against ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), +fulltext key(s2), +foreign key (s1,s2) references t1 (s1,s2) on update set null) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +update t1 set s2 = 'Rainbows' where s2 <> 'Sunshine'; +commit; +select * from t2 where match(s2) against ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +create table t1 (s1 bigint unsigned not null, s2 varchar(200), +primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (FTS_DOC_ID BIGINT UNSIGNED NOT NULL, s2 varchar(200), +foreign key (FTS_DOC_ID) references t1 (s1) +on update cascade) ENGINE = InnoDB; +create fulltext index idx on t2(s2); +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `FTS_DOC_ID` bigint(20) unsigned NOT NULL, + `s2` varchar(200) DEFAULT NULL, + KEY `FTS_DOC_ID` (`FTS_DOC_ID`), + FULLTEXT KEY `idx` (`s2`), + CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`FTS_DOC_ID`) REFERENCES `t1` (`s1`) ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +update t1 set s1 = 3 where s1=1; +select * from t2 where match(s2) against ('sunshine'); +FTS_DOC_ID s2 +3 Sunshine +update t1 set s1 = 1 where s1=3; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`FTS_DOC_ID`) REFERENCES `t1` (`s1`) ON UPDATE CASCADE) +DROP TABLE t2 , t1; +CREATE TABLE t1 ( +id1 INT , +a1 VARCHAR(200) PRIMARY KEY, +b1 TEXT character set utf8 , +FULLTEXT KEY (a1,b1) +) CHARACTER SET = utf8 ,ENGINE = InnoDB; +CREATE TABLE t2 ( +id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a2 VARCHAR(200), +b2 TEXT character set utf8 , +FOREIGN KEY (a2) REFERENCES t1(a1) ON DELETE CASCADE, +FULLTEXT KEY (b2,a2) +) CHARACTER SET = utf8 ,ENGINE = InnoDB; +INSERT INTO t1 (id1,a1,b1) VALUES +(1,'MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , +(2,'How To Use MySQL Well','After you went through a ...'), +(3,'Optimizing MySQL','In this tutorial we will show ...'), +(4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +(5,'MySQL vs. YourSQL','In the following database comparison ...'), +(6,'MySQL Security','When configured properly, MySQL ...'); +INSERT INTO t2 (a2,b2) VALUES +('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +DELETE FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +id1 a1 b1 +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +id2 a2 b2 +SELECT * FROM t1 WHERE a1 LIKE '%tutorial%'; +id1 a1 b1 +SELECT * FROM t2 WHERE a2 LIKE '%tutorial%'; +id2 a2 b2 +DROP TABLE t2 , t1; +call mtr.add_suppression("\\[ERROR\\] InnoDB: FTS Doc ID must be larger than 3 for table `test`.`t2`"); +CREATE TABLE t1 ( +id1 INT , +a1 VARCHAR(200) , +b1 TEXT , +FULLTEXT KEY (a1,b1), PRIMARY KEY(a1, id1) +) CHARACTER SET = utf8 , ENGINE = InnoDB; +CREATE TABLE t2 ( +id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a2 VARCHAR(200), +b2 TEXT , +FOREIGN KEY (a2) REFERENCES t1(a1) ON UPDATE CASCADE, +FULLTEXT KEY (b2,a2) +) CHARACTER SET = utf8 ,ENGINE = InnoDB; +INSERT INTO t1 (id1,a1,b1) VALUES +(1,'MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , +(2,'How To Use MySQL Well','After you went through a ...'), +(3,'Optimizing MySQL','In this tutorial we will show ...'); +INSERT INTO t2 (a2,b2) VALUES +('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'); +START TRANSACTION; +INSERT INTO t1 (id1,a1,b1) VALUES +(4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +(5,'MySQL vs. YourSQL','In the following database comparison ...'), +(6,'MySQL Security','When configured properly, MySQL ...'); +INSERT INTO t2 (a2,b2) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +INSERT INTO t2 (a2,b2) VALUES +('MySQL Tricks','1. Never run mysqld as root. 2. ...'); +ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a2`) REFERENCES `t1` (`a1`) ON UPDATE CASCADE) +DELETE FROM t1; +ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`a2`) REFERENCES `t1` (`a1`) ON UPDATE CASCADE) +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial') ORDER BY id1; +id1 a1 b1 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial') ORDER BY id2; +id2 a2 b2 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id1; +id1 a1 b1 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id2; +id2 a2 b2 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id1; +id1 a1 b1 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id2; +id2 a2 b2 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; +id1 a1 b1 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; +id2 a2 b2 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('root') ; +id1 a1 b1 +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('root') ; +id2 a2 b2 +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('mysqld (+root)' IN BOOLEAN MODE) ; +id1 a1 b1 +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('mysqld (-root)' IN BOOLEAN MODE) ; +id2 a2 b2 +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('root' WITH QUERY EXPANSION) ; +id1 a1 b1 +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('root' WITH QUERY EXPANSION) ; +id2 a2 b2 +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('"database comparison"@02' IN BOOLEAN MODE) ; +id1 a1 b1 +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('"database comparison"@02' IN BOOLEAN MODE) ; +id2 a2 b2 +SELECT * FROM t1 ORDER BY id1; +id1 a1 b1 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +5 MySQL vs. YourSQL In the following database comparison ... +6 MySQL Security When configured properly, MySQL ... +SELECT * FROM t2 ORDER BY id2; +id2 a2 b2 +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +5 MySQL vs. YourSQL In the following database comparison ... +6 MySQL Security When configured properly, MySQL ... +COMMIT; +START TRANSACTION; +UPDATE t1 SET a1 = "changing column - on UPDATE cascade" , b1 = "to check foreign constraint" WHERE +MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +COMMIT; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +id1 a1 b1 +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +id2 a2 b2 +3 changing column - on UPDATE cascade In this tutorial we will show ... +6 changing column - on UPDATE cascade When configured properly, MySQL ... +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('+UPDATE +cascade' IN BOOLEAN MODE) ORDER BY id1; +id1 a1 b1 +1 changing column - on UPDATE cascade to check foreign constraint +2 changing column - on UPDATE cascade to check foreign constraint +3 changing column - on UPDATE cascade to check foreign constraint +4 changing column - on UPDATE cascade to check foreign constraint +5 changing column - on UPDATE cascade to check foreign constraint +6 changing column - on UPDATE cascade to check foreign constraint +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('+UPDATE +cascade' IN BOOLEAN MODE) ORDER BY id2; +id2 a2 b2 +1 changing column - on UPDATE cascade DBMS stands for DataBase VÃÆ·WÄ°... +2 changing column - on UPDATE cascade After you went through a ... +3 changing column - on UPDATE cascade In this tutorial we will show ... +4 changing column - on UPDATE cascade 1. Never run mysqld as root. 2. ... +5 changing column - on UPDATE cascade In the following database comparison ... +6 changing column - on UPDATE cascade When configured properly, MySQL ... +SELECT * FROM t2 WHERE a2 LIKE '%UPDATE CASCADE%' ORDER BY id2; +id2 a2 b2 +1 changing column - on UPDATE cascade DBMS stands for DataBase VÃÆ·WÄ°... +2 changing column - on UPDATE cascade After you went through a ... +3 changing column - on UPDATE cascade In this tutorial we will show ... +4 changing column - on UPDATE cascade 1. Never run mysqld as root. 2. ... +5 changing column - on UPDATE cascade In the following database comparison ... +6 changing column - on UPDATE cascade When configured properly, MySQL ... +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), +FULLTEXT KEY(s2), +FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +s1 s2 +DROP TABLE t2 , t1; +set global innodb_file_per_table=1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) CHARACTER SET = utf8, ROW_FORMAT=COMPRESSED, ENGINE = InnoDB; +INSERT INTO t1 (a,b) VALUES +('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'); +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `a` varchar(200) DEFAULT NULL, + `b` text DEFAULT NULL, + PRIMARY KEY (`id`), + FULLTEXT KEY `idx` (`a`,`b`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=COMPRESSED +SELECT count(*) FROM information_schema.innodb_sys_tables WHERE name LIKE "%FTS_%" AND space !=0; +count(*) +11 +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +ANALYZE TABLE t1; +SELECT * FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id; +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +3 Optimizing MySQL In this tutorial we will show ... +select * from t1 where MATCH(a,b) AGAINST("+tutorial +VÃÆ·WÄ°" IN BOOLEAN MODE); +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +select * from t1 where MATCH(a,b) AGAINST("+-VÃÆ·WÄ°" IN BOOLEAN MODE); +ERROR 42000: syntax error, unexpected '-' +select * from t1 where MATCH(a,b) AGAINST("+Mysql +(tricks never)" IN BOOLEAN MODE); +id a b +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +select * from t1 where MATCH(a,b) AGAINST("+mysql -(tricks never)" IN BOOLEAN MODE) ORDER BY id; +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +5 MySQL vs. YourSQL In the following database comparison ... +6 MySQL Security When configured properly, MySQL ... +select *, MATCH(a,b) AGAINST("mysql stands" IN BOOLEAN MODE) as x from t1 ORDER BY id; +id a b x +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... 0.6055193543434143 +2 How To Use MySQL Well After you went through a ... 0.000000001885928302414186 +3 Optimizing MySQL In this tutorial we will show ... 0.000000001885928302414186 +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... 0.000000001885928302414186 +5 MySQL vs. YourSQL In the following database comparison ... 0.000000001885928302414186 +6 MySQL Security When configured properly, MySQL ... 0.000000003771856604828372 +select * from t1 where MATCH a,b AGAINST ("+database* +VÃÆ·W*" IN BOOLEAN MODE); +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +select * from t1 where MATCH a,b AGAINST ('"security mysql"' IN BOOLEAN MODE); +id a b +select * from t1 where MATCH(a,b) AGAINST ("VÃÆ·WÄ°" WITH QUERY EXPANSION) ORDER BY id; +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +5 MySQL vs. YourSQL In the following database comparison ... +6 MySQL Security When configured properly, MySQL ... +ALTER TABLE t1 DROP INDEX idx; +CREATE FULLTEXT INDEX idx on t1 (a,b); +SELECT * FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id; +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +3 Optimizing MySQL In this tutorial we will show ... +select * from t1 where MATCH(a,b) AGAINST("+tutorial +VÃÆ·WÄ°" IN BOOLEAN MODE); +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +select * from t1 where MATCH(a,b) AGAINST("+dbms" IN BOOLEAN MODE); +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +select * from t1 where MATCH(a,b) AGAINST("+Mysql +(tricks never)" IN BOOLEAN MODE); +id a b +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +select * from t1 where MATCH(a,b) AGAINST("+mysql -(tricks never)" IN BOOLEAN MODE) ORDER BY id; +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +5 MySQL vs. YourSQL In the following database comparison ... +6 MySQL Security When configured properly, MySQL ... +select *, MATCH(a,b) AGAINST("mysql VÃÆ·WÄ°" IN BOOLEAN MODE) as x from t1 ORDER BY id; +id a b x +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... 0.6055193543434143 +2 How To Use MySQL Well After you went through a ... 0.000000001885928302414186 +3 Optimizing MySQL In this tutorial we will show ... 0.000000001885928302414186 +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... 0.000000001885928302414186 +5 MySQL vs. YourSQL In the following database comparison ... 0.000000001885928302414186 +6 MySQL Security When configured properly, MySQL ... 0.000000003771856604828372 +select * from t1 where MATCH a,b AGAINST ('"security mysql"' IN BOOLEAN MODE); +id a b +select * from t1 where MATCH(a,b) AGAINST ("VÃÆ·WÄ°" WITH QUERY EXPANSION) ORDER BY id; +id a b +1 MySQL Tutorial DBMS stands for DataBase VÃÆ·WÄ°... +2 How To Use MySQL Well After you went through a ... +3 Optimizing MySQL In this tutorial we will show ... +4 1001 MySQL Tricks 1. Never run mysqld as root. 2. ... +5 MySQL vs. YourSQL In the following database comparison ... +6 MySQL Security When configured properly, MySQL ... +INSERT INTO t1 (a,b) VALUES ('test query expansion','for database ...'); +INSERT INTO t1 (a,b) VALUES +('test proximity search, test, proximity and phrase', +'search, with proximity innodb'); +INSERT INTO t1 (a,b) VALUES +('test proximity fts search, test, proximity and phrase', +'search, with proximity innodb'); +INSERT INTO t1 (a,b) VALUES +('test more proximity fts search, test, more proximity and phrase', +'search, with proximity innodb'); +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"proximity search"@2' IN BOOLEAN MODE); +id a b +8 test proximity search, test, proximity and phrase search, with proximity innodb +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"proximity search"@1' IN BOOLEAN MODE); +id a b +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"proximity search"@3' IN BOOLEAN MODE) ORDER BY id; +id a b +8 test proximity search, test, proximity and phrase search, with proximity innodb +9 test proximity fts search, test, proximity and phrase search, with proximity innodb +10 test more proximity fts search, test, more proximity and phrase search, with proximity innodb +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"test proximity"@5' IN BOOLEAN MODE) ORDER BY id; +id a b +8 test proximity search, test, proximity and phrase search, with proximity innodb +9 test proximity fts search, test, proximity and phrase search, with proximity innodb +10 test more proximity fts search, test, more proximity and phrase search, with proximity innodb +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"more test proximity"@2' IN BOOLEAN MODE); +id a b +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"more test proximity"@3' IN BOOLEAN MODE); +id a b +10 test more proximity fts search, test, more proximity and phrase search, with proximity innodb +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"more fts proximity"@03' IN BOOLEAN MODE); +id a b +10 test more proximity fts search, test, more proximity and phrase search, with proximity innodb +UPDATE t1 SET a = UPPER(a) , b = UPPER(b) ; +UPDATE t1 SET a = UPPER(a) , b = LOWER(b) ; +select * from t1 where MATCH(a,b) AGAINST("+tutorial +dbms" IN BOOLEAN MODE); +id a b +1 MYSQL TUTORIAL dbms stands for database vðʒwi... +select * from t1 where MATCH(a,b) AGAINST("+VÃÆ·WÄ°" IN BOOLEAN MODE); +id a b +1 MYSQL TUTORIAL dbms stands for database vðʒwi... +SELECT * FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id; +id a b +1 MYSQL TUTORIAL dbms stands for database vðʒwi... +3 OPTIMIZING MYSQL in this tutorial we will show ... +DELETE FROM t1 WHERE MATCH (a,b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +DELETE FROM t1 WHERE MATCH (a,b) AGAINST ('"proximity search"@14' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +id a b +SELECT * FROM t1 ORDER BY id; +id a b +2 HOW TO USE MYSQL WELL after you went through a ... +4 1001 MYSQL TRICKS 1. never run mysqld as root. 2. ... +5 MYSQL VS. YOURSQL in the following database comparison ... +6 MYSQL SECURITY when configured properly, mysql ... +7 TEST QUERY EXPANSION for database ... +DROP TABLE t1; +SET GLOBAL innodb_file_per_table=1; +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) CHARACTER SET = utf8, ENGINE=InnoDB; +INSERT INTO t1 (a,b) VALUES +('Я могу еÑÑ‚ÑŒ Ñтекло', 'оно мне не вредит'), +('Мога да Ñм Ñтъкло', 'то не ми вреди'), +('ΜποÏῶ νὰ φάω σπασμένα' ,'γυαλιὰ χωÏὶς νὰ πάθω τίποτα'), +('PříliÅ¡ žluÅ¥ouÄký kůň', 'úpÄ›l Äábelské kódy'), +('Sævör grét', 'áðan því úlpan var ónýt'), +('ã†ã‚ã®ãŠãã‚„ã¾','ã‘ãµã“ãˆã¦'), +('ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹','ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš'); +INSERT INTO t1 (a,b) VALUES +('MySQL Tutorial','request docteam@oraclehelp.com ...') , +('Trial version','query performace @1255 minute on 2.1Hz Memory 2GB...') , +('when To Use MySQL Well','for free faq mail@xyz.com ...'); +CREATE FULLTEXT INDEX idx on t1 (a,b); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("вредит χωÏὶς") ORDER BY id; +id a b +1 Я могу еÑÑ‚ÑŒ Ñтекло оно мне не вредит +3 ΜποÏῶ νὰ φάω σπασμένα γυαλιὰ χωÏὶς νὰ πάθω τίποτα +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("оно" WITH QUERY EXPANSION); +id a b +1 Я могу еÑÑ‚ÑŒ Ñтекло оно мне не вредит +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("вред*" IN BOOLEAN MODE) ORDER BY id; +id a b +1 Я могу еÑÑ‚ÑŒ Ñтекло оно мне не вредит +2 Мога да Ñм Ñтъкло то не ми вреди +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+γυαλιὰ +tutorial" IN BOOLEAN MODE); +id a b +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+tutorial +(Мога τίποτα)" IN BOOLEAN MODE); +id a b +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš"); +id a b +7 ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹ ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã¡ã‚Šã¬ã‚‹" WITH QUERY EXPANSION); +id a b +7 ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹ ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("+ã‚ã•ãゆã‚ã¿ã˜ã€€+ã‚‘ã²ã‚‚ã›ãš" IN BOOLEAN MODE); +id a b +7 ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹ ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("ã†ã‚ã®ãŠã*" IN BOOLEAN MODE); +id a b +6 ã†ã‚ã®ãŠãã‚„ã¾ ã‘ãµã“ãˆã¦ +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE); +id a b +5 Sævör grét áðan því úlpan var ónýt +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"γυαλιὰ χωÏὶς"@2' IN BOOLEAN MODE); +id a b +3 ΜποÏῶ νὰ φάω σπασμένα γυαλιὰ χωÏὶς νὰ πάθω τίποτα +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"query performace"@02' IN BOOLEAN MODE); +id a b +9 Trial version query performace @1255 minute on 2.1Hz Memory 2GB... +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"πάθω τίποτα"@2' IN BOOLEAN MODE); +id a b +3 ΜποÏῶ νὰ φάω σπασμένα γυαλιὰ χωÏὶς νὰ πάθω τίποτα +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"@1' IN BOOLEAN MODE); +id a b +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"@2' IN BOOLEAN MODE); +id a b +7 ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹ ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš +ALTER TABLE t1 DROP INDEX idx; +CREATE FULLTEXT INDEX idx on t1 (a,b); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"); +id a b +7 ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹ ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš +UPDATE t1 SET a = "Pchnąć w tÄ™ łódź jeża" , b = "lub osiem skrzyÅ„ fig" WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"); +UPDATE t1 SET a = "Ð’ чащах юга жил-был цитруÑ? Да", b = "но фальшивый ÑкземплÑÑ€! Ñ‘ÑŠ" WHERE MATCH(a,b) AGAINST ("вред*" IN BOOLEAN MODE); +DELETE FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš"); +id a b +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("łódź osiem"); +id a b +7 Pchnąć w tÄ™ łódź jeża lub osiem skrzyÅ„ fig +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("вред*" IN BOOLEAN MODE); +id a b +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("фальшив*" IN BOOLEAN MODE) ORDER BY id; +id a b +1 Ð’ чащах юга жил-был цитруÑ? Да но фальшивый ÑкземплÑÑ€! Ñ‘ÑŠ +2 Ð’ чащах юга жил-был цитруÑ? Да но фальшивый ÑкземплÑÑ€! Ñ‘ÑŠ +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE); +id a b +SELECT * FROM t1 +WHERE MATCH (a,b) +AGAINST ('"łódź jeża"@2' IN BOOLEAN MODE); +id a b +7 Pchnąć w tÄ™ łódź jeża lub osiem skrzyÅ„ fig +SELECT * FROM t1 ORDER BY id; +id a b +1 Ð’ чащах юга жил-был цитруÑ? Да но фальшивый ÑкземплÑÑ€! Ñ‘ÑŠ +2 Ð’ чащах юга жил-был цитруÑ? Да но фальшивый ÑкземплÑÑ€! Ñ‘ÑŠ +3 ΜποÏῶ νὰ φάω σπασμένα γυαλιὰ χωÏὶς νὰ πάθω τίποτα +4 PříliÅ¡ žluÅ¥ouÄký kůň úpÄ›l Äábelské kódy +6 ã†ã‚ã®ãŠãã‚„ã¾ ã‘ãµã“ãˆã¦ +7 Pchnąć w tÄ™ łódź jeża lub osiem skrzyÅ„ fig +8 MySQL Tutorial request docteam@oraclehelp.com ... +9 Trial version query performace @1255 minute on 2.1Hz Memory 2GB... +10 when To Use MySQL Well for free faq mail@xyz.com ... +DROP TABLE t1; +CREATE TABLE t1(ID INT PRIMARY KEY, +no_fts_field VARCHAR(10), +fts_field VARCHAR(10), +FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 'AAA', 'BBB'); +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); +ID no_fts_field fts_field +1 AAA BBB +UPDATE t1 SET fts_field='anychange' where id = 1; +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); +ID no_fts_field fts_field +1 AAA anychange +UPDATE t1 SET no_fts_field='anychange' where id = 1; +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); +ID no_fts_field fts_field +1 anychange anychange +UPDATE t1 SET no_fts_field='anychange', fts_field='other' where id = 1; +SELECT * FROM t1 WHERE MATCH(fts_field) against("other"); +ID no_fts_field fts_field +1 anychange other +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); +ID no_fts_field fts_field +DROP INDEX f on t1; +UPDATE t1 SET fts_field='anychange' where id = 1; +UPDATE t1 SET no_fts_field='anychange' where id = 1; +UPDATE t1 SET no_fts_field='anychange', fts_field='other' where id = 1; +CREATE FULLTEXT INDEX f ON t1(FTS_FIELD); +SELECT * FROM t1 WHERE MATCH(fts_field) against("other"); +ID no_fts_field fts_field +1 anychange other +DROP TABLE t1; +CREATE TABLE t1(`FTS_DOC_ID` serial, +no_fts_field VARCHAR(10), +fts_field VARCHAR(10), +FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 'AAA', 'BBB'); +UPDATE t1 SET fts_field='anychange' where FTS_DOC_ID = 1; +ERROR HY000: Invalid InnoDB FTS Doc ID +UPDATE t1 SET fts_field='anychange', FTS_DOC_ID = 2 where FTS_DOC_ID = 1; +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); +FTS_DOC_ID no_fts_field fts_field +2 AAA anychange +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); +FTS_DOC_ID no_fts_field fts_field +UPDATE t1 SET no_fts_field='anychange' where FTS_DOC_ID = 2; +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); +FTS_DOC_ID no_fts_field fts_field +2 anychange anychange +UPDATE t1 SET no_fts_field='anychange', fts_field='other' where FTS_DOC_ID = 2; +ERROR HY000: Invalid InnoDB FTS Doc ID +SELECT * FROM t1 WHERE MATCH(fts_field) against("other"); +FTS_DOC_ID no_fts_field fts_field +UPDATE t1 SET FTS_DOC_ID = 1 where FTS_DOC_ID = 2; +ERROR HY000: Invalid InnoDB FTS Doc ID +DROP INDEX f ON t1; +UPDATE t1 SET fts_field='newchange' where FTS_DOC_ID = 2; +UPDATE t1 SET no_fts_field='anychange' where FTS_DOC_ID = 2; +SELECT * FROM t1; +FTS_DOC_ID no_fts_field fts_field +2 anychange newchange +DROP TABLE t1; +CREATE TABLE t1(ID INT PRIMARY KEY, +no_fts_field VARCHAR(10), +fts_field VARCHAR(10), +FULLTEXT INDEX f(fts_field), index k(fts_field)) ENGINE=INNODB; +CREATE TABLE t2(ID INT PRIMARY KEY, +no_fts_field VARCHAR(10), +fts_field VARCHAR(10), +FULLTEXT INDEX f(fts_field), +INDEX k2(fts_field), +FOREIGN KEY(fts_field) REFERENCES +t1(fts_field) ON UPDATE CASCADE) ENGINE=INNODB; +INSERT INTO t1 VALUES (1, 'AAA', 'BBB'); +INSERT INTO t2 VALUES (1, 'AAA', 'BBB'); +update t1 set fts_field='newchange' where id =1; +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); +ID no_fts_field fts_field +SELECT * FROM t2 WHERE MATCH(fts_field) against("BBB"); +ID no_fts_field fts_field +SELECT * FROM t1 WHERE MATCH(fts_field) against("newchange"); +ID no_fts_field fts_field +1 AAA newchange +SELECT * FROM t2 WHERE MATCH(fts_field) against("newchange"); +ID no_fts_field fts_field +1 AAA newchange +DROP TABLE t2; +DROP TABLE t1; +CREATE TABLE t1(id INT PRIMARY KEY, +fts_field VARCHAR(10), +FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; +CREATE TABLE t2(id INT PRIMARY KEY, +fts_field VARCHAR(10), +FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; +INSERT INTO t1 values (1,'100'),(2,'200'),(3,'300'),(4,'400'),(5,'500'),(6,'600'), (7,'700'),(8,'800'),(9,'900'),(10,'1000'),(11,'1100'),(12,'1200'); +INSERT INTO t2 values (1,'100'),(2,'200'),(3,'300'),(4,'400'),(5,'500'),(6,'600'), (7,'700'),(8,'800'); +UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'foo'); +UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'foo') WHERE t1.fts_field = "100foo"; +UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'xoo'), t2.fts_field = CONCAT(t1.fts_field, 'xoo') where t1.fts_field=CONCAT(t2.fts_field, 'foo'); +SELECT * FROM t1 WHERE MATCH(fts_field) against("100foofoo"); +id fts_field +1 100foofoo +SELECT * FROM t1 WHERE MATCH(fts_field) against("100foo"); +id fts_field +SELECT * FROM t1 WHERE MATCH(fts_field) against("100"); +id fts_field +SELECT * FROM t2 WHERE MATCH(fts_field) against("400fooxoo"); +id fts_field +4 400fooxoo +SELECT * FROM t2 WHERE MATCH(fts_field) against("100"); +id fts_field +1 100 +SELECT * FROM t2 WHERE MATCH(fts_field) against("200"); +id fts_field +SELECT * FROM t2 WHERE MATCH(fts_field) against("400"); +id fts_field +DROP TABLE t1; +DROP TABLE t2; + +BUG#13701973/64274: MYSQL THREAD WAS SUSPENDED WHEN EXECUTE UPDATE QUERY + +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +CREATE TABLE t1 ( +t1_id INT(10) UNSIGNED NOT NULL, +t2_id INT(10) UNSIGNED DEFAULT NULL, +PRIMARY KEY (t1_id), +FOREIGN KEY (t2_id) REFERENCES t2 (t2_id) +ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB; +CREATE TABLE t2 ( +t1_id INT(10) UNSIGNED NOT NULL, +t2_id INT(10) UNSIGNED NOT NULL, +t3_id INT(10) UNSIGNED NOT NULL, +t4_id INT(10) UNSIGNED NOT NULL, +PRIMARY KEY (t2_id), +FOREIGN KEY (t1_id) REFERENCES t1 (t1_id), +FOREIGN KEY (t3_id) REFERENCES t3 (t3_id) +ON DELETE CASCADE ON UPDATE CASCADE, +FOREIGN KEY (t4_id) REFERENCES t4 (t4_id) +) ENGINE=InnoDB; +CREATE TABLE t3 ( +t3_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, +payload char(3), +PRIMARY KEY (t3_id) +) ENGINE=InnoDB; +INSERT INTO t3 VALUES (1, '100'); +CREATE TABLE t4 ( +t2_id INT(10) UNSIGNED DEFAULT NULL, +t4_id INT(10) UNSIGNED NOT NULL, +PRIMARY KEY (t4_id), +FOREIGN KEY (t2_id) REFERENCES t2 (t2_id) +ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=1; +UPDATE t3 SET payload='101' WHERE t3_id=1; +SET FOREIGN_KEY_CHECKS=0; +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc_debug,vers.rdiff mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_debug,vers.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc_debug,vers.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_debug,vers.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,66 @@ +--- misc_debug.result ++++ misc_debug.reject +@@ -7,14 +7,14 @@ + SET @saved_debug_dbug = @@SESSION.debug_dbug; + SET SESSION debug_dbug="+d,ib_dict_create_index_tree_fail"; + CREATE FULLTEXT INDEX idx ON articles(body); +-ERROR HY000: Out of memory. ++ERROR HY000: Can't create table `test`.`articles` (errno: 128 "Out of memory in engine") + SET SESSION debug_dbug=@saved_debug_dbug; + ALTER TABLE articles STATS_PERSISTENT=DEFAULT; + DROP TABLE articles; + CREATE TABLE t (a INT, b TEXT) engine=innodb; + SET debug_dbug='+d,alter_table_rollback_new_index'; +-ALTER TABLE t ADD FULLTEXT INDEX (b(64)); +-ERROR HY000: Unknown error ++ALTER TABLE t ADD FULLTEXT INDEX (b(64)), ALGORITHM=INPLACE; ++ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY + SET SESSION debug_dbug=@saved_debug_dbug; + DROP TABLE t; + CREATE TABLE t1 (pk INT, a VARCHAR(8), PRIMARY KEY(pk), +@@ -28,32 +28,6 @@ + DROP TABLE t2, t1; + SET SESSION debug_dbug=@saved_debug_dbug; + # +-# MDEV-25200 Index count mismatch due to aborted FULLTEXT INDEX +-# +-CREATE TABLE t1(a INT, b TEXT, c TEXT, FULLTEXT INDEX(b)) ENGINE=InnoDB; +-INSERT INTO t1 VALUES(1, "test", "test_1"); +-connect con1,localhost,root,,test; +-SET DEBUG_DBUG="+d,innodb_OOM_inplace_alter"; +-SET DEBUG_SYNC='innodb_commit_inplace_alter_table_enter SIGNAL s2 WAIT_FOR g2'; +-ALTER TABLE t1 ADD FULLTEXT(c); +-connection default; +-SET DEBUG_SYNC='now WAIT_FOR s2'; +-START TRANSACTION; +-SELECT * FROM t1; +-a b c +-1 test test_1 +-SET DEBUG_SYNC='now SIGNAL g2'; +-connection con1; +-ERROR HY000: Out of memory. +-disconnect con1; +-connection default; +-SET DEBUG_SYNC=RESET; +-ALTER TABLE t1 ADD bl INT AS (LENGTH(b)) VIRTUAL; +-CHECK TABLE t1; +-Table Op Msg_type Msg_text +-test.t1 check status OK +-DROP TABLE t1; +-# + # MDEV-25663 Double free of transaction during TRUNCATE + # + call mtr.add_suppression("InnoDB: \\(Too many concurrent transactions\\)"); +@@ -65,12 +39,3 @@ + SET debug_dbug=@saved_debug_dbug; + DROP TABLE t1; + # End of 10.3 tests +-CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100))ENGINE=InnoDB; +-SET DEBUG_DBUG="+d,stats_lock_fail"; +-ALTER TABLE t1 ADD FULLTEXT(f2); +-ERROR HY000: Lock wait timeout exceeded; try restarting transaction +-SET debug_dbug=@saved_debug_dbug; +-ALTER TABLE t1 DISCARD TABLESPACE; +-ALTER TABLE t1 ADD FULLTEXT(f2); +-ERROR HY000: Tablespace has been discarded for table `t1` +-DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc_debug,vers_trx.rdiff mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_debug,vers_trx.rdiff --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/misc_debug,vers_trx.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/misc_debug,vers_trx.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,66 @@ +--- misc_debug.result ++++ misc_debug.reject +@@ -7,14 +7,14 @@ + SET @saved_debug_dbug = @@SESSION.debug_dbug; + SET SESSION debug_dbug="+d,ib_dict_create_index_tree_fail"; + CREATE FULLTEXT INDEX idx ON articles(body); +-ERROR HY000: Out of memory. ++ERROR HY000: Can't create table `test`.`articles` (errno: 128 "Out of memory in engine") + SET SESSION debug_dbug=@saved_debug_dbug; + ALTER TABLE articles STATS_PERSISTENT=DEFAULT; + DROP TABLE articles; + CREATE TABLE t (a INT, b TEXT) engine=innodb; + SET debug_dbug='+d,alter_table_rollback_new_index'; +-ALTER TABLE t ADD FULLTEXT INDEX (b(64)); +-ERROR HY000: Unknown error ++ALTER TABLE t ADD FULLTEXT INDEX (b(64)), ALGORITHM=INPLACE; ++ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Not implemented for system-versioned operations. Try ALGORITHM=COPY + SET SESSION debug_dbug=@saved_debug_dbug; + DROP TABLE t; + CREATE TABLE t1 (pk INT, a VARCHAR(8), PRIMARY KEY(pk), +@@ -28,32 +28,6 @@ + DROP TABLE t2, t1; + SET SESSION debug_dbug=@saved_debug_dbug; + # +-# MDEV-25200 Index count mismatch due to aborted FULLTEXT INDEX +-# +-CREATE TABLE t1(a INT, b TEXT, c TEXT, FULLTEXT INDEX(b)) ENGINE=InnoDB; +-INSERT INTO t1 VALUES(1, "test", "test_1"); +-connect con1,localhost,root,,test; +-SET DEBUG_DBUG="+d,innodb_OOM_inplace_alter"; +-SET DEBUG_SYNC='innodb_commit_inplace_alter_table_enter SIGNAL s2 WAIT_FOR g2'; +-ALTER TABLE t1 ADD FULLTEXT(c); +-connection default; +-SET DEBUG_SYNC='now WAIT_FOR s2'; +-START TRANSACTION; +-SELECT * FROM t1; +-a b c +-1 test test_1 +-SET DEBUG_SYNC='now SIGNAL g2'; +-connection con1; +-ERROR HY000: Out of memory. +-disconnect con1; +-connection default; +-SET DEBUG_SYNC=RESET; +-ALTER TABLE t1 ADD bl INT AS (LENGTH(b)) VIRTUAL; +-CHECK TABLE t1; +-Table Op Msg_type Msg_text +-test.t1 check status OK +-DROP TABLE t1; +-# + # MDEV-25663 Double free of transaction during TRUNCATE + # + call mtr.add_suppression("InnoDB: \\(Too many concurrent transactions\\)"); +@@ -65,12 +39,3 @@ + SET debug_dbug=@saved_debug_dbug; + DROP TABLE t1; + # End of 10.3 tests +-CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100))ENGINE=InnoDB; +-SET DEBUG_DBUG="+d,stats_lock_fail"; +-ALTER TABLE t1 ADD FULLTEXT(f2); +-ERROR HY000: Lock wait timeout exceeded; try restarting transaction +-SET debug_dbug=@saved_debug_dbug; +-ALTER TABLE t1 DISCARD TABLESPACE; +-ALTER TABLE t1 ADD FULLTEXT(f2); +-ERROR HY000: Tablespace has been discarded for table `t1` +-DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/opt.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/opt.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/opt.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/opt.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,1654 @@ +CREATE TABLE wp( +FTS_DOC_ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, +title VARCHAR(255) NOT NULL DEFAULT '', +text MEDIUMTEXT NOT NULL, +dummy INTEGER, +PRIMARY KEY (FTS_DOC_ID), +UNIQUE KEY FTS_DOC_ID_INDEX (FTS_DOC_ID), +FULLTEXT KEY idx (title,text) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +INSERT INTO wp (title, text) VALUES +('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database to database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'); +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 SELECT FTS_DOC_ID FROM wp; +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE t1; +Table Op Msg_type Msg_text +test.t1 analyze status OK +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE wp; +Table Op Msg_type Msg_text +test.wp analyze status OK +SELECT FTS_DOC_ID, title, MATCH(title, text) AGAINST ('database') AS score1, +MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp; +FTS_DOC_ID title score1 score2 +1 MySQL Tutorial 0.22764469683170319 0.000000003771856604828372 +2 How To Use MySQL Well 0 0.000000001885928302414186 +3 Optimizing MySQL 0 0.000000001885928302414186 +4 1001 MySQL Tricks 0 0.000000001885928302414186 +5 MySQL vs. YourSQL 0.45528939366340637 0.000000001885928302414186 +6 MySQL Security 0 0.000000003771856604828372 +No sorting for this query +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +No sorting for this query even if MATCH is part of an expression +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') > 0.1 +ORDER BY score DESC; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +No sorting even if there are several MATCH expressions as long as the +right one is used in ORDER BY +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score1, +MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score1 DESC; +title score1 score2 +MySQL vs. YourSQL 0.45528939366340637 0.000000001885928302414186 +MySQL Tutorial 0.22764469683170319 0.000000003771856604828372 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +No Sorting since FT table is first table in query +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp, t1 +WHERE MATCH(title, text) AGAINST ('database') AND FTS_DOC_ID = t1.i +ORDER BY score DESC; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 2 +Sorting since there is no WHERE clause +FLUSH STATUS; +SELECT MATCH(title, text) AGAINST ('database'), title AS score +FROM wp +ORDER BY score DESC; +MATCH(title, text) AGAINST ('database') score +0 1001 MySQL Tricks +0 How To Use MySQL Well +0 MySQL Security +0 Optimizing MySQL +0.22764469683170319 MySQL Tutorial +0.45528939366340637 MySQL vs. YourSQL +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 6 +Sorting since ordering on multiple columns +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC, FTS_DOC_ID; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 2 +Sorting since ordering is not descending +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score ASC; +title score +MySQL Tutorial 0.22764469683170319 +MySQL vs. YourSQL 0.45528939366340637 +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 2 +Sorting because one is ordering on a different MATCH expression +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('mysql') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC; +title score +MySQL Tutorial 0.000000003771856604828372 +MySQL vs. YourSQL 0.000000001885928302414186 +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 2 +No sorting for this query +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +Revert to table scan and sorting for this query since not +enough matching rows to satisfy LIMIT clause +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 14 +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 2 +Sorting since no LIMIT clause +FLUSH STATUS; +SELECT MATCH(title, text) AGAINST ('database') AS score, title +FROM wp +ORDER BY score DESC; +score title +0 1001 MySQL Tricks +0 How To Use MySQL Well +0 MySQL Security +0 Optimizing MySQL +0.22764469683170319 MySQL Tutorial +0.45528939366340637 MySQL vs. YourSQL +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 6 +Sorting since there is a WHERE clause +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE dummy IS NULL +ORDER BY score DESC LIMIT 2; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 2 +Sorting since ordering is not on a simple MATCH expressions +FLUSH STATUS; +SELECT title, (MATCH(title, text) AGAINST ('database')) * 100 AS score +FROM wp +ORDER BY score DESC LIMIT 2; +title score +MySQL vs. YourSQL 45.52893936634064 +MySQL Tutorial 22.76446968317032 +SHOW SESSION STATUS LIKE 'Sort_rows%'; +Variable_name Value +Sort_rows 2 +No ordinary handler accesses when only accessing FTS_DOC_ID and MATCH +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); +docid score +5 0.45528939366340637 +1 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +Still no handler accesses when adding FTS_DOC_ID to WHERE clause +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') AND FTS_DOC_ID > 2; +docid score +5 0.45528939366340637 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +Still no handler accesses when ordering by MATCH expression +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score; +docid score +1 0.22764469683170319 +5 0.45528939366340637 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 3 +Optimization is disabled when ordering on FTS_DOC_ID +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY 1 DESC; +docid score +5 0.45528939366340637 +1 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +Optimization also work with several MATCH expressions +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score1, +MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); +docid score1 score2 +5 0.45528939366340637 0.000000001885928302414186 +1 0.22764469683170319 0.000000003771856604828372 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +Optimization does not apply if sorting on a different MATCH expressions +from the one used to access the +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score1, +MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score2 DESC; +docid score1 score2 +1 0.22764469683170319 0.000000003771856604828372 +5 0.45528939366340637 0.000000001885928302414186 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 3 +FLUSH STATUS; +Optimization does not apply for GROUP BY +SET @save_mode = @@sql_mode; +SET sql_mode = (select replace(@@sql_mode,'ONLY_FULL_GROUP_BY','')); +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +GROUP BY score; +FTS_DOC_ID score +1 0.22764469683170319 +5 0.45528939366340637 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 3 +SET sql_mode = @save_mode; +No sorting and no table access with LIMIT clause and only information +from FTS result +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; +docid score +5 0.45528939366340637 +1 0.22764469683170319 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 14 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +If count optimization applies, EXPLAIN shows +"Select tables optimized away." +EXPLAIN SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +FLUSH STATUS; +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +COUNT(*) +2 +Verify that there was no table access +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +Optimization applies also to COUNT(expr) as long as expr is not nullable +EXPLAIN SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +COUNT(title) +2 +Optimization does not apply if not a single table query. +EXPLAIN SELECT count(*) +FROM wp, t1 +WHERE MATCH(title, text) AGAINST ('database'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +1 SIMPLE t1 ALL NULL NULL NULL NULL 6 +SELECT count(*) +FROM wp, t1 +WHERE MATCH(title, text) AGAINST ('database'); +count(*) +12 +Optimization does not apply if MATCH is part of an expression +EXPLAIN SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE) > 0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE) > 0; +COUNT(title) +2 +Optimization does not apply if MATCH is part of an expression +EXPLAIN SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE) > 0; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE) > 0; +COUNT(title) +2 +Optimization does not apply if COUNT expression is nullable +EXPLAIN SELECT COUNT(dummy) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +SELECT COUNT(dummy) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +COUNT(dummy) +0 +FLUSH STATUS; +SELECT MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score, +title +FROM wp +WHERE MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) +ORDER BY score DESC; +score title +0.000000001885928302414186 1001 MySQL Tricks +0.000000001885928302414186 How To Use MySQL Well +0.000000003771856604828372 MySQL Security +0.22764469683170319 Optimizing MySQL +1.6663280725479126 MySQL Tutorial +2.2718474864959717 MySQL vs. YourSQL +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 6 +Sort_scan 1 +FLUSH STATUS; +SELECT title, +MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score +FROM wp +ORDER BY score DESC LIMIT 2; +title score +MySQL vs. YourSQL 2.2718474864959717 +MySQL Tutorial 1.6663280725479126 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, +MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); +docid score +5 2.2718474864959717 +1 1.6663280725479126 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, +MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score +FROM wp +ORDER BY score DESC LIMIT 2; +docid score +5 2.2718474864959717 +1 1.6663280725479126 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 14 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +EXPLAIN SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' WITH QUERY EXPANSION); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +FLUSH STATUS; +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' WITH QUERY EXPANSION); +COUNT(*) +6 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +FLUSH STATUS; +SELECT MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) score, +title +FROM wp +WHERE MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) +ORDER BY score DESC; +score title +0.000000001885928302414186 1001 MySQL Tricks +0.000000001885928302414186 How To Use MySQL Well +0.000000001885928302414186 Optimizing MySQL +0.000000003771856604828372 MySQL Security +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 4 +Sort_scan 1 +FLUSH STATUS; +SELECT MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) score, +title +FROM wp +ORDER BY score DESC; +score title +0 MySQL Tutorial +0 MySQL vs. YourSQL +0.000000001885928302414186 1001 MySQL Tricks +0.000000001885928302414186 How To Use MySQL Well +0.000000001885928302414186 Optimizing MySQL +0.000000003771856604828372 MySQL Security +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 6 +Sort_scan 1 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, +MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('+MySQL -database'); +docid score +5 0 +1 0 +6 0.000000003771856604828372 +2 0.000000001885928302414186 +3 0.000000001885928302414186 +4 0.000000001885928302414186 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, +MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +ORDER BY score DESC LIMIT 1; +docid score +6 0.000000003771856604828372 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 1 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 14 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 1 +Sort_scan 1 +EXPLAIN SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('+MySQL -database' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +FLUSH STATUS; +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('+MySQL -database' IN BOOLEAN MODE); +COUNT(*) +4 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +FLUSH STATUS; +SELECT title, +MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) +ORDER BY score DESC; +title score +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 1 +Sort_scan 1 +FLUSH STATUS; +SELECT title, +MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +ORDER BY score DESC LIMIT 1; +title score +MySQL Tutorial 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 1 +Sort_scan 1 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, +MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('"MySQL database"@5'); +docid score +1 0.22764469683170319 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, +MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +ORDER BY score DESC LIMIT 1; +docid score +1 0.22764469683170319 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 1 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 14 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 1 +Sort_scan 1 +EXPLAIN SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +FLUSH STATUS; +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE); +COUNT(*) +1 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +SELECT title, +MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) +ORDER BY score DESC, title ASC; +title score +MySQL vs. YourSQL 0.45528939366340637 +MySQL Tutorial 0.22764469683170319 +1001 MySQL Tricks 0 +How To Use MySQL Well 0 +MySQL Security 0 +Optimizing MySQL 0 +SELECT title, +MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('MySQL database' WITH QUERY EXPANSION) +ORDER BY score DESC, title ASC; +title score +MySQL Security 0.000000003771856604828372 +1001 MySQL Tricks 0.000000001885928302414186 +How To Use MySQL Well 0.000000001885928302414186 +Optimizing MySQL 0.000000001885928302414186 +MySQL Tutorial 0 +MySQL vs. YourSQL 0 +SELECT title, +MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) +ORDER BY score DESC, title ASC; +title score +MySQL Tutorial 0 +ALTER TABLE wp ENGINE=myisam; +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC; +title score +MySQL vs. YourSQL 0.9562782645225525 +MySQL Tutorial 0.5756555199623108 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 0 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; +title score +MySQL vs. YourSQL 0.9562782645225525 +MySQL Tutorial 0.5756555199623108 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); +docid score +5 0.9562782645225525 +1 0.5756555199623108 +SHOW SESSION STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 3 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; +docid score +5 0.9562782645225525 +1 0.5756555199623108 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 0 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 2 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 14 +SHOW SESSION STATUS LIKE 'Sort%'; +Variable_name Value +Sort_merge_passes 0 +Sort_priority_queue_sorts 1 +Sort_range 0 +Sort_rows 2 +Sort_scan 1 +EXPLAIN SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE wp fulltext idx idx 0 1 Using where +FLUSH STATUS; +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +COUNT(*) +2 +SHOW STATUS LIKE 'Handler_read%'; +Variable_name Value +Handler_read_first 0 +Handler_read_key 0 +Handler_read_last 0 +Handler_read_next 3 +Handler_read_prev 0 +Handler_read_retry 0 +Handler_read_rnd 0 +Handler_read_rnd_deleted 0 +Handler_read_rnd_next 0 +DROP TABLE wp, t1; +CREATE TABLE t1 +( +FTS_DOC_ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, +title VARCHAR(255) DEFAULT '', +text MEDIUMTEXT , +PRIMARY KEY (FTS_DOC_ID), +UNIQUE KEY FTS_DOC_ID_INDEX (FTS_DOC_ID), +FULLTEXT KEY ft_idx (title,text) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +INSERT INTO t1 (title, text) VALUES +('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), +('How To Use MySQL Well','After you went through a ...'), +('Optimizing MySQL','In this tutorial we will show ...'), +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL database','In the following database to database comparison ...'), +('MySQL Security','When configured properly, MySQL ...'), +('InnoDB', 'InnoDB is a transaction-safe (ACID compliant) storage engine'), +('MySQL is a database management system', 'A database is a structured collection of data...'), +('MySQL databases are relational', 'A relational database stores data in separate tables rather than putting all the data in one big storeroom...'), +('MySQL software is Open Source', 'Open Source means that it is possible for anyone to use and modify the software...'), +('The MySQL Database Server is very fast, reliable, scalable, and easy to use', 'MySQL Server can run comfortably on a desktop or laptop...'), +('MySQL Server works in client/server or embedded systems', 'The MySQL Database Software is a client/server system...'), +('MyISAM', 'MyISAM is based on the older (and no longer available) ISAM storage engine but has many useful extensions'), +('A large amount of contributed MySQL software is available', 'MySQL Server has a practical set of features developed in close cooperation with our users'), +(NULL,NULL); +ANALYZE TABLE t1; +# No ranking +EXPLAIN +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE); +count(*) +6 +EXPLAIN +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('data*' IN BOOLEAN MODE) ORDER BY title LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('data*' IN BOOLEAN MODE) ORDER BY title LIMIT 3; +count(*) +6 +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); +FTS_DOC_ID title +11 The MySQL Database Server is very fast, reliable, scalable, and easy to use +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION); +FTS_DOC_ID title +11 The MySQL Database Server is very fast, reliable, scalable, and easy to use +12 MySQL Server works in client/server or embedded systems +10 MySQL software is Open Source +4 1001 MySQL Tricks +14 A large amount of contributed MySQL software is available +2 How To Use MySQL Well +13 MyISAM +5 MySQL vs. YourSQL database +8 MySQL is a database management system +1 MySQL Tutorial +9 MySQL databases are relational +6 MySQL Security +3 Optimizing MySQL +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE); +FTS_DOC_ID title +11 The MySQL Database Server is very fast, reliable, scalable, and easy to use +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+for' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+for' IN BOOLEAN MODE); +FTS_DOC_ID +# No sorting by rank +EXPLAIN SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY title; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using filesort +SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY title; +FTS_DOC_ID TITLE +9 MySQL databases are relational +8 MySQL is a database management system +12 MySQL Server works in client/server or embedded systems +1 MySQL Tutorial +5 MySQL vs. YourSQL database +11 The MySQL Database Server is very fast, reliable, scalable, and easy to use +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); +FTS_DOC_ID +11 +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using filesort +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title; +FTS_DOC_ID title +4 1001 MySQL Tricks +14 A large amount of contributed MySQL software is available +2 How To Use MySQL Well +13 MyISAM +9 MySQL databases are relational +8 MySQL is a database management system +6 MySQL Security +12 MySQL Server works in client/server or embedded systems +10 MySQL software is Open Source +1 MySQL Tutorial +5 MySQL vs. YourSQL database +3 Optimizing MySQL +11 The MySQL Database Server is very fast, reliable, scalable, and easy to use +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using filesort +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title; +FTS_DOC_ID title +11 The MySQL Database Server is very fast, reliable, scalable, and easy to use +# LIMIT optimization +EXPLAIN SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +LIMIT 3; +FTS_DOC_ID TITLE +11 The MySQL Database Server is very fast, reliable, scalable, and easy to use +5 MySQL vs. YourSQL database +8 MySQL is a database management system +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +LIMIT 3; +FTS_DOC_ID +11 +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +ORDER BY title +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using filesort +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +ORDER BY title +LIMIT 3; +FTS_DOC_ID +11 +EXPLAIN +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title LIMIT 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using filesort +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title LIMIT 1; +FTS_DOC_ID +4 +EXPLAIN +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title LIMIT 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using filesort +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title LIMIT 1; +FTS_DOC_ID +11 +EXPLAIN +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank, FTS_DOC_ID +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank, FTS_DOC_ID +LIMIT 3; +FTS_DOC_ID rank +1 0.15835624933242798 +9 0.15835624933242798 +12 0.15835624933242798 +EXPLAIN +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank DESC, FTS_DOC_ID ASC +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank DESC, FTS_DOC_ID ASC +LIMIT 3; +FTS_DOC_ID rank +11 1.5415468215942383 +5 0.47506874799728394 +8 0.31671249866485596 +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using temporary; Using filesort +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; +FTS_DOC_ID rank +5 0.47506874799728394 +8 0.31671249866485596 +EXPLAIN SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using temporary; Using filesort +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 3; +FTS_DOC_ID rank +11 1.5415468215942383 +5 0.47506874799728394 +8 0.31671249866485596 +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC, +FTS_DOC_ID ASC; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC, +FTS_DOC_ID ASC; +FTS_DOC_ID rank +5 0.47506874799728394 +8 0.31671249866485596 +1 0.15835624933242798 +9 0.15835624933242798 +11 0.15835624933242798 +12 0.15835624933242798 +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) and FTS_DOC_ID > 1 +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC +LIMIT 2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext PRIMARY,FTS_DOC_ID_INDEX,ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) and FTS_DOC_ID > 1 +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC +LIMIT 2; +FTS_DOC_ID rank +5 0.47506874799728394 +8 0.31671249866485596 +EXPLAIN +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank +LIMIT 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank +LIMIT 1; +FTS_DOC_ID rank +3 0.009391550906002522 +EXPLAIN +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank DESC +LIMIT 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank DESC +LIMIT 1; +FTS_DOC_ID rank +11 15.345823287963867 +EXPLAIN +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +LIMIT 1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) DESC +LIMIT 1; +FTS_DOC_ID rank +11 15.345823287963867 +# WHERE optimization on MATCH > 'some_rank' +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) > 0.1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) > 0.1; +FTS_DOC_ID +11 +5 +8 +1 +9 +12 +# additional test for correct behaviour +EXPLAIN SELECT * FROM t1 ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC LIMIT 10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using temporary; Using filesort +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) AND +MATCH (title, text) AGAINST ('mysql' IN NATURAL LANGUAGE MODE) +LIMIT 6; +FTS_DOC_ID +11 +5 +8 +1 +9 +12 +# test OR condition +SELECT FTS_DOC_ID +FROM t1 +WHERE MATCH(title, text) AGAINST ('database') +OR MATCH(title, text) AGAINST ('mysql') +ORDER BY MATCH(title, text) AGAINST ('database') DESC, FTS_DOC_ID ASC; +FTS_DOC_ID +5 +8 +1 +9 +11 +12 +2 +3 +4 +6 +10 +14 +EXPLAIN SELECT FTS_DOC_ID +FROM t1 +WHERE MATCH(title, text) AGAINST ('database') +OR MATCH(title, text) AGAINST ('mysql') +ORDER BY MATCH(title, text) AGAINST ('database') DESC, FTS_DOC_ID ASC; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using where; Using temporary; Using filesort +# MATCH and GROUP BY, DISTINCT +SET sql_mode = (select replace(@@sql_mode,'ONLY_FULL_GROUP_BY','')); +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY FTS_DOC_ID +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY FTS_DOC_ID +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +FTS_DOC_ID +11 +5 +8 +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY title +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY title +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +FTS_DOC_ID +11 +5 +8 +EXPLAIN SELECT MAX(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where +SELECT MAX(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +MAX(FTS_DOC_ID) +12 +EXPLAIN SELECT DISTINCT(title) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT DISTINCT(title) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +title +The MySQL Database Server is very fast, reliable, scalable, and easy to use +MySQL vs. YourSQL database +MySQL is a database management system +EXPLAIN SELECT DISTINCT(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext ft_idx ft_idx 0 1 Using where; Using temporary; Using filesort +SELECT DISTINCT(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +FTS_DOC_ID +11 +5 +8 +SET sql_mode = @save_mode; +# FTS index access +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; +FTS_DOC_ID rank +5 0.47506874799728394 +8 0.31671249866485596 +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using temporary; Using filesort +SELECT a.FTS_DOC_ID, b.FTS_DOC_ID +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and +MATCH(b.title, b.text) AGAINST ('+mysql' IN BOOLEAN MODE) and +a.FTS_DOC_ID = b.FTS_DOC_ID; +FTS_DOC_ID FTS_DOC_ID +5 5 +8 8 +1 1 +9 9 +11 11 +12 12 +EXPLAIN SELECT a.FTS_DOC_ID, b.FTS_DOC_ID +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and +MATCH(b.title, b.text) AGAINST ('+mysql' IN BOOLEAN MODE) and +a.FTS_DOC_ID = b.FTS_DOC_ID; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE a fulltext PRIMARY,FTS_DOC_ID_INDEX,ft_idx ft_idx 0 1 Using where +1 SIMPLE b eq_ref PRIMARY,FTS_DOC_ID_INDEX,ft_idx PRIMARY 8 test.a.FTS_DOC_ID 1 Using where +SELECT a.FTS_DOC_ID, MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE), +b.FTS_DOC_ID, MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE) +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and +MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE); +FTS_DOC_ID MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) FTS_DOC_ID MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE) +5 0.47506874799728394 5 0.47506874799728394 +5 0.47506874799728394 8 0.31671249866485596 +5 0.47506874799728394 1 0.15835624933242798 +5 0.47506874799728394 9 0.15835624933242798 +5 0.47506874799728394 11 0.15835624933242798 +5 0.47506874799728394 12 0.15835624933242798 +8 0.31671249866485596 5 0.47506874799728394 +8 0.31671249866485596 8 0.31671249866485596 +8 0.31671249866485596 1 0.15835624933242798 +8 0.31671249866485596 9 0.15835624933242798 +8 0.31671249866485596 11 0.15835624933242798 +8 0.31671249866485596 12 0.15835624933242798 +1 0.15835624933242798 5 0.47506874799728394 +1 0.15835624933242798 8 0.31671249866485596 +1 0.15835624933242798 1 0.15835624933242798 +1 0.15835624933242798 9 0.15835624933242798 +1 0.15835624933242798 11 0.15835624933242798 +1 0.15835624933242798 12 0.15835624933242798 +9 0.15835624933242798 5 0.47506874799728394 +9 0.15835624933242798 8 0.31671249866485596 +9 0.15835624933242798 1 0.15835624933242798 +9 0.15835624933242798 9 0.15835624933242798 +9 0.15835624933242798 11 0.15835624933242798 +9 0.15835624933242798 12 0.15835624933242798 +11 0.15835624933242798 5 0.47506874799728394 +11 0.15835624933242798 8 0.31671249866485596 +11 0.15835624933242798 1 0.15835624933242798 +11 0.15835624933242798 9 0.15835624933242798 +11 0.15835624933242798 11 0.15835624933242798 +11 0.15835624933242798 12 0.15835624933242798 +12 0.15835624933242798 5 0.47506874799728394 +12 0.15835624933242798 8 0.31671249866485596 +12 0.15835624933242798 1 0.15835624933242798 +12 0.15835624933242798 9 0.15835624933242798 +12 0.15835624933242798 11 0.15835624933242798 +12 0.15835624933242798 12 0.15835624933242798 +EXPLAIN SELECT a.FTS_DOC_ID, MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE), +b.FTS_DOC_ID, MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE) +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and +MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE a fulltext ft_idx ft_idx 0 1 Using where +1 SIMPLE b fulltext ft_idx ft_idx 0 1 Using where +EXPLAIN SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ("data*" IN BOOLEAN MODE) * 100; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using where +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ("data*" IN BOOLEAN MODE) * 100 +FROM t1 WHERE MATCH(title, text) AGAINST ("data*" IN BOOLEAN MODE) * 100; +FTS_DOC_ID MATCH(title, text) AGAINST ("data*" IN BOOLEAN MODE) * 100 +1 4.92168664932251 +5 14.76505994796753 +8 9.84337329864502 +9 4.92168664932251 +11 4.92168664932251 +12 4.92168664932251 +SELECT * FROM t1 WHERE title IS NULL AND text IS NULL; +FTS_DOC_ID title text +15 NULL NULL +CREATE TABLE t2 SELECT FTS_DOC_ID as doc_id, title, text FROM t1; +ALTER TABLE t2 ADD PRIMARY KEY (doc_id); +ALTER TABLE t2 ADD FULLTEXT KEY ft_idx (title,text); +ANALYZE TABLE t2; +EXPLAIN SELECT DOC_ID FROM t2 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t2 ALL NULL NULL NULL NULL 15 Using where +SELECT DOC_ID FROM t2 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; +DOC_ID +1 +5 +8 +9 +11 +12 +EXPLAIN SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 15 Using where +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; +FTS_DOC_ID +1 +5 +8 +9 +11 +12 +DROP TABLE t1, t2; +"Check hints with uft8 charset for 2 cases" +set names utf8; +CREATE TABLE t1 ( +FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +text TEXT +) CHARACTER SET = utf8, ENGINE=InnoDB; +INSERT INTO t1 (title, text) VALUES +('Я могу еÑÑ‚ÑŒ Ñтекло', 'оно мне не вредит'), +('Мога да Ñм Ñтъкло', 'то не ми вреди'), +('ΜποÏῶ νὰ φάω σπασμένα' ,'γυαλιὰ χωÏὶς νὰ πάθω τίποτα'), +('PříliÅ¡ žluÅ¥ouÄký kůň', 'úpÄ›l Äábelské kódy'), +('Sævör grét', 'áðan því úlpan var ónýt'), +('ã†ã‚ã®ãŠãã‚„ã¾','ã‘ãµã“ãˆã¦'), +('ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹','ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš'); +CREATE FULLTEXT INDEX idx on t1 (title, text); +# No ranking +EXPLAIN +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('вредит' IN NATURAL LANGUAGE MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext idx idx 0 1 Using where +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('вредит' IN NATURAL LANGUAGE MODE); +count(*) +1 +EXPLAIN +SELECT * FROM t1 WHERE MATCH(title, text) AGAINST ("оно" WITH QUERY EXPANSION); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext idx idx 0 1 Using where +SELECT * FROM t1 WHERE MATCH(title, text) AGAINST ("оно" WITH QUERY EXPANSION); +FTS_DOC_ID title text +1 Я могу еÑÑ‚ÑŒ Ñтекло оно мне не вредит +# No sorting by rank +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+(Мога τίποτα)' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext idx idx 0 1 Using where +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+(Мога τίποτα)' IN BOOLEAN MODE); +FTS_DOC_ID +2 +3 +DROP TABLE t1; +# +# Bug #18924341 CRASH IN TEST_IF_SKIP_SORT_ORDER, GROUP BY MATCH AGAINST DESC +# +CREATE TABLE t1 (f1 CHAR(1), FULLTEXT KEY (f1)); +SELECT 1 FROM t1 NATURAL JOIN t1 a GROUP BY MATCH(t1.f1) AGAINST ("1") DESC; +1 +DROP TABLE t1; +# +# Bug#20261601 ASSERTION FAILED: !FIRST_QEP_TAB->TABLE()->NO_KEYREAD +# +CREATE TABLE t1(a INT PRIMARY KEY); +INSERT INTO t1 VALUES(1),(2); +SELECT (SELECT MATCH(`a`)AGAINST('1') FROM t1) FROM t1; +ERROR HY000: Can't find FULLTEXT index matching the column list +SELECT 1, a IN (SELECT a FROM t1) FROM t1; +1 a IN (SELECT a FROM t1) +1 1 +1 1 +DROP TABLE t1; +# +# Bug#20442572 ASSERTION `!FIRST_QEP_TAB->TABLE()->NO_KEYREAD' FAILED. +# Bug#75688 Assertion `!first_qep_tab->table()->no_keyread' failed. +# +CREATE TABLE t1(a INT,b POINT NOT NULL,KEY(a)); +HANDLER t1 OPEN; +select * from t1 where MATCH a,b AGAINST('"Now sUPPort"' IN BOOLEAN MODE); +a b +prepare stmt1 from "truncate t1"; +SELECT a IN(SELECT a FROM t1)FROM t1; +a IN(SELECT a FROM t1) +deallocate prepare stmt1; +DROP TABLE t1; +# +# Bug #20685427 INVALID WRITE OF FREED MEMORY IN ITEM_FUNC_MATCH::CLEANUP +# +CREATE TABLE t1(a TEXT CHARSET LATIN1, FULLTEXT KEY(a)) ENGINE=INNODB; +SELECT MATCH(a) AGAINST ('') FROM (SELECT a FROM t1 LIMIT 1) q; +ERROR HY000: Can't find FULLTEXT index matching the column list +DROP TABLE t1; +# +# Bug#21140067 EXPLAIN .. MATCH AGAINST: ASSERTION FAILED: TO <= END +# +CREATE TABLE t1(f1 CHAR(1) CHARSET latin1, FULLTEXT(f1)) ENGINE=INNODB; +EXPLAIN SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEAN MODE); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 fulltext f1 f1 0 1 Using where +EXPLAIN FORMAT = JSON SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEAN MODE); +EXPLAIN +{ + "query_block": { + "select_id": 1, + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "fulltext", + "possible_keys": ["f1"], + "key": "f1", + "key_length": "0", + "used_key_parts": ["f1"], + "rows": 1, + "filtered": 100, + "attached_condition": "1.238585e+308 <= (match t1.f1 against ('1' in boolean mode))" + } + } + ] + } +} +DROP TABLE t1; +# +# Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ_SET || BITMAP_IS_SET +# +SET sql_mode=''; +CREATE TABLE t1(a INT) ENGINE=INNODB; +CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=INNODB; +INSERT INTO t2 VALUES ('a'),('b'); +SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1') FROM t1) FROM t2 GROUP BY "a"; +ERROR HY000: Incorrect arguments to MATCH +DROP TABLE t1, t2; +CREATE TABLE t1(a INT) ENGINE=MyISAM; +CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('a'),('b'); +SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1' in BOOLEAN MODE) FROM t1) FROM t2 GROUP BY "a"; +NOT EXISTS (SELECT MATCH(b) AGAINST ('1' in BOOLEAN MODE) FROM t1) +1 +DROP TABLE t1, t2; +SET sql_mode=default; +# +# Bug#21140039 ASSERTION FAILED: !FIRST_QEP_TAB->TABLE()->NO_KEYREAD MATCH AGAINST..... +# +CREATE TABLE t1 +( +a INT, +b INT, +c CHAR(1) CHARSET latin1, +PRIMARY KEY (b,a), +FULLTEXT KEY (c) +) ENGINE=INNODB; +SELECT "a" NOT IN(SELECT b FROM t1 WHERE MATCH(c) AGAINST ('a' IN BOOLEAN MODE)); +"a" NOT IN(SELECT b FROM t1 WHERE MATCH(c) AGAINST ('a' IN BOOLEAN MODE)) +1 +DROP TABLE t1; +# +# Bug#21300774 ASSERT `!INIT_FTFUNCS(THD, SELECT_LEX)` IN JOIN::RESET AT SQL/SQL_SELECT.CC:874 +# +CREATE TABLE t1 (f1 INT); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (ft TEXT, FULLTEXT KEY ft(ft)); +INSERT INTO t2 VALUES ('abc'); +INSERT INTO t2 VALUES ('def'); +UPDATE t1 SET f1 = +(SELECT t1.f1 FROM t2 WHERE NOT TRUE AND +MATCH (ft) AGAINST ((SELECT 'xyz' FROM t2))); +ERROR 21000: Subquery returns more than 1 row +DROP TABLE t1, t2; +# +# Bug#22679209: FULL-TEXT QUERIES WITH ADDITIONAL SECONDARY INDEX +# GIVES NULL OR ZERO ROWS +# +CREATE TABLE t1 ( +f1 INTEGER, +title varchar(255), +body mediumtext, +KEY f1 (f1), +FULLTEXT KEY title (title), +FULLTEXT KEY body (body) +) ENGINE=InnoDB; +INSERT INTO t1 VALUES +(1, 'Insert into table', 'insert into table select from'), +(1, 'Delete from table', 'insert into table select from'), +(1, 'Update', 'perform update'), +(2, 'Insert into table', 'insert into table select from'), +( 2, 'Delete from table', 'some body text here'), +( 2, 'Update', 'perform update'), +( 3, 'Insert into table', 'insert into table select from'), +( 3, 'Delete from table', 'some body text here'); +SELECT f1 FROM t1 WHERE f1=1 AND +(MATCH (title) AGAINST ('table' IN BOOLEAN MODE) OR +MATCH (body) AGAINST ('table' IN BOOLEAN MODE)); +f1 +1 +1 +DROP TABLE t1; +# End of test for Bug#22679209 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/phrase.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/phrase.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/phrase.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/phrase.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,84 @@ +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body) +) ENGINE=InnoDB; +INSERT INTO articles (title,body) VALUES +(NULL, 'mysql good database'), +(NULL, ' mysql good database'), +('', 'mysql good database'), +('', ' mysql good database'), +(' ', 'mysql good database'), +('mysql', 'good database'), +('mysql ', 'good database'), +('mysql', ' good database'), +('mysql good database', ''), +('mysql good database', NULL); +SET GLOBAL innodb_ft_aux_table="test/articles"; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION +database 1 10 10 1 11 +database 1 10 10 2 12 +database 1 10 10 3 11 +database 1 10 10 4 12 +database 1 10 10 5 13 +database 1 10 10 6 11 +database 1 10 10 7 12 +database 1 10 10 8 12 +database 1 10 10 9 11 +database 1 10 10 10 11 +good 1 10 10 1 6 +good 1 10 10 2 7 +good 1 10 10 3 6 +good 1 10 10 4 7 +good 1 10 10 5 8 +good 1 10 10 6 6 +good 1 10 10 7 7 +good 1 10 10 8 7 +good 1 10 10 9 6 +good 1 10 10 10 6 +mysql 1 10 10 1 0 +mysql 1 10 10 2 1 +mysql 1 10 10 3 0 +mysql 1 10 10 4 1 +mysql 1 10 10 5 2 +mysql 1 10 10 6 0 +mysql 1 10 10 7 0 +mysql 1 10 10 8 0 +mysql 1 10 10 9 0 +mysql 1 10 10 10 0 +SET GLOBAL innodb_ft_aux_table=default; +SELECT * FROM articles; +id title body +1 NULL mysql good database +2 NULL mysql good database +3 mysql good database +4 mysql good database +5 mysql good database +6 mysql good database +7 mysql good database +8 mysql good database +9 mysql good database +10 mysql good database NULL +SELECT * FROM articles WHERE MATCH(title, body) +AGAINST('"mysql good database"' IN BOOLEAN MODE); +id title body +1 NULL mysql good database +2 NULL mysql good database +3 mysql good database +4 mysql good database +5 mysql good database +9 mysql good database +10 mysql good database NULL +SELECT * FROM articles WHERE MATCH(title, body) +AGAINST('("mysql good database")' IN BOOLEAN MODE); +id title body +1 NULL mysql good database +2 NULL mysql good database +3 mysql good database +4 mysql good database +5 mysql good database +9 mysql good database +10 mysql good database NULL +DROP TABLE articles; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/result_cache_limit.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/result_cache_limit.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/result_cache_limit.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/result_cache_limit.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,31 @@ +CREATE TABLE t1 ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +a VARCHAR(200), +b TEXT +) ENGINE= InnoDB; +CREATE FULLTEXT INDEX idx on t1 (a,b); +INSERT INTO t1 (a,b) VALUES +('MySQL from Tutorial','DBMS stands for DataBase ...') , +('when To Use MySQL Well','After that you went through a ...'), +('where will Optimizing MySQL','what In this tutorial we will show ...'), +('MySQL from Tutorial','DBMS stands for DataBase ...') , +('when To Use MySQL Well','After that you went through a ...'), +('where will Optimizing MySQL','what In this tutorial we will show ...'), +('MySQL from Tutorial','DBMS stands for DataBase ...') , +('when To Use MySQL Well','After that you went through a ...'), +('where will Optimizing MySQL','what In this tutorial we will show ...'); +SET @save_limit=@@GLOBAL.innodb_ft_result_cache_limit; +SET @save_dbug=@@debug_dbug; +SET debug_dbug="+d,fts_instrument_result_cache_limit"; +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('mysql' IN BOOLEAN MODE); +COUNT(*) +9 +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('mysql' WITH QUERY EXPANSION); +ERROR HY000: Table handler out of memory +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database"' IN BOOLEAN MODE); +ERROR HY000: Table handler out of memory +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database" @ 5' IN BOOLEAN MODE); +ERROR HY000: Table handler out of memory +SET debug_dbug=@save_dbug; +DROP TABLE t1; +SET GLOBAL innodb_ft_result_cache_limit=@save_limit; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/savepoint.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/savepoint.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/savepoint.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/savepoint.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,318 @@ +CREATE TABLE articles ( +id INT UNSIGNED NOT NULL PRIMARY KEY, +title VARCHAR(200), +FULLTEXT (title) +) ENGINE= InnoDB; +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +4 mysql +5 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +4 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +5 mysql +6 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +3 mysql +4 mysql +5 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +RELEASE SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +3 mysql +4 mysql +5 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +3 mysql +4 mysql +5 mysql +6 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +RELEASE SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +3 mysql +4 mysql +5 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +RELEASE SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +4 mysql +5 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +3 mysql +4 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +RELEASE SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +COMMIT; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +2 mysql +3 mysql +5 mysql +6 mysql +7 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +ROLLBACK; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +3 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +ROLLBACK; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +4 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +ROLLBACK; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +5 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +ROLLBACK; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +5 mysql +TRUNCATE TABLE articles; +INSERT INTO articles(id, title) VALUES(1, 'mysql'); +BEGIN; +INSERT INTO articles(id, title) VALUES(2, 'mysql'); +SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(3, 'mysql'); +SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(4, 'mysql'); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO articles(id, title) VALUES(5, 'mysql'); +RELEASE SAVEPOINT sp1; +INSERT INTO articles(id, title) VALUES(6, 'mysql'); +ROLLBACK; +INSERT INTO articles(id, title) VALUES(7, 'mysql'); +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); +id title +1 mysql +7 mysql +DROP TABLE articles; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/r/subexpr.result mariadb-10.11.9/mysql-test/suite/innodb_fts/r/subexpr.result --- mariadb-10.11.6/mysql-test/suite/innodb_fts/r/subexpr.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/r/subexpr.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,105 @@ +# +# Bug #20028323 INNODB FULLTEXT BOOLEAN SEARCH INCORRECTLY HANDLES +# PARENTHESES +# +CREATE TABLE t1 ( +f1 INT NOT NULL AUTO_INCREMENT, +f2 TEXT NOT NULL, +PRIMARY KEY (f1), +FULLTEXT (f2) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO t1 (f2) VALUES +('Pumpkin soup with cheese bread'), +('Yellow chicken curry'), +('Fresh green vegetables with garlic'); +SELECT * FROM t1 WHERE MATCH(f2) AGAINST('+pumpkin' IN BOOLEAN MODE); +f1 f2 +1 Pumpkin soup with cheese bread +SELECT * FROM t1 WHERE MATCH(f2) AGAINST('+cheese' IN BOOLEAN MODE); +f1 f2 +1 Pumpkin soup with cheese bread +SELECT * FROM t1 WHERE MATCH(f2) AGAINST('+(pumpkin cheese)' IN BOOLEAN MODE); +f1 f2 +1 Pumpkin soup with cheese bread +SELECT * FROM t1 WHERE MATCH(f2) +AGAINST('+pumpkin +(souffle)' IN BOOLEAN MODE); +f1 f2 +SELECT * FROM t1 WHERE MATCH(f2) +AGAINST('+pumpkin +(souffle tart)' IN BOOLEAN MODE); +f1 f2 +SELECT * FROM t1 WHERE MATCH(f2) +AGAINST('+pumpkin +(>souffle souffle table != NULL +--echo # in pars_retrieve_table_def on UPDATE +--echo # +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t2 (a INT, b TEXT, FOREIGN KEY(a) REFERENCES t1(a), + FULLTEXT (b))ENGINE=InnoDB; +INSERT INTO t1 SET a=1; +ALTER TABLE t2 DISCARD TABLESPACE; +--error ER_ROW_IS_REFERENCED_2 +UPDATE t1 SET a=2; +DROP TABLE t2,t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.opt mariadb-10.11.9/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.opt --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb_ft_config diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/fts_sync_commit_resiliency.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,47 @@ +# Test database resiliency against scenario where the server crashes +# right before fts_sync_commit commits its transaction +source include/have_innodb.inc; +source include/have_debug.inc; +source include/not_embedded.inc; +source include/have_debug_sync.inc; + +CREATE TABLE opening_lines ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + opening_line TEXT(500), + author VARCHAR(200), + title VARCHAR(200) + ) ENGINE=InnoDB; + +CREATE FULLTEXT INDEX idx ON opening_lines(opening_line); +CREATE FULLTEXT INDEX ft_idx1 ON opening_lines(title); + +INSERT INTO opening_lines(opening_line,author,title) VALUES + ('Call me Ishmael.','Herman Melville','Moby Dick'), + ('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'), + ('I am an invisible man.','Ralph Ellison','Invisible Man'), + ('Where now? Who now? When now?','Samuel Beckett','The Unnamable'), + ('It was love at first sight.','Joseph Heller','Catch-22'), + ('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'), + ('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'), + ('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451'); + +SET GLOBAL innodb_ft_aux_table='test/opening_lines'; +SELECT * FROM information_schema.innodb_ft_config; + +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael'); +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible'); +SELECT * FROM opening_lines; + +SET GLOBAL innodb_optimize_fulltext_only=ON; +SET DEBUG_SYNC='fts_crash_before_commit_sync SIGNAL hung WAIT_FOR ever'; +send OPTIMIZE TABLE opening_lines; + +connect(con1,localhost,root,,); +SET DEBUG_SYNC='now WAIT_FOR hung'; +let $shutdown_timeout=0; +--source include/restart_mysqld.inc + +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('Ishmael'); +SELECT * FROM opening_lines WHERE MATCH(opening_line) AGAINST('invisible'); +SELECT * FROM opening_lines; +DROP TABLE opening_lines; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/index_table.opt mariadb-10.11.9/mysql-test/suite/innodb_fts/t/index_table.opt --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/index_table.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/index_table.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,2 @@ +--innodb-ft-index-cache +--innodb-ft-index-table diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/index_table.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/index_table.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/index_table.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/index_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,121 @@ +# This is the basic function tests for INNODB_FT_INDEX_TABLE +# and INNODB_FT_INDEX_TABLE in INFORMATION_SCHEMA. + +-- source include/have_innodb.inc +-- source include/have_debug.inc + +SET @optimize=@@GLOBAL.INNODB_OPTIMIZE_FULLTEXT_ONLY; +SET GLOBAL INNODB_OPTIMIZE_FULLTEXT_ONLY=1; + +# Test Case 1: Test Result Cache Limit +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + content TEXT + ) ENGINE= InnoDB; + +CREATE FULLTEXT INDEX idx ON articles (title, content); + +INSERT INTO articles (title, content) VALUES + ('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','How to use full-text search engine'), + ('Go MySQL Tricks','How to use full text search engine'); + +SET @aux=@@GLOBAL.innodb_ft_aux_table; +SET GLOBAL innodb_ft_aux_table='test/articles'; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; + +OPTIMIZE TABLE articles; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; + +SET @save_dbug=@@debug_dbug; +SET debug_dbug='+d,fts_instrument_result_cache_limit'; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; + +SET debug_dbug=@save_dbug; + +DROP TABLE articles; + +SET GLOBAL innodb_ft_result_cache_limit=default; + +# Test Case 2: Test Multiple Indexes +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + content TEXT + ) ENGINE= InnoDB; + +CREATE FULLTEXT INDEX idx_t ON articles (title); + +CREATE FULLTEXT INDEX idx_c ON articles (content); + +INSERT INTO articles (title, content) VALUES + ('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','How to use full-text search engine'), + ('Go MySQL Tricks','How to use full text search engine'); + +# test.articles had been dropped, so this result will be empty +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +SET GLOBAL innodb_ft_aux_table='test/articles'; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; + +OPTIMIZE TABLE articles; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; + +DROP TABLE articles; + +SET NAMES utf8; + +# Test Case 3: Test UFT8 Charset +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200) + ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; + +CREATE FULLTEXT INDEX idx ON articles (title); + +INSERT INTO articles (title) VALUES + ('相亲相爱'),('怜香惜爱'),('充满å¯çˆ±'),('爱æ¨äº¤ç»‡'); + +SET GLOBAL innodb_ft_aux_table="test/articles"; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; + +OPTIMIZE TABLE articles; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; + +DROP TABLE articles; + +# Test Case 4: Test GB2312 Charset +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200) + ) ENGINE=InnoDB DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci; + +CREATE FULLTEXT INDEX idx ON articles (title); + +INSERT INTO articles (title) VALUES + ('相亲相爱'),('怜香惜爱'),('充满å¯çˆ±'),('爱æ¨äº¤ç»‡'); + +SET GLOBAL innodb_ft_aux_table="test/articles"; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; + +OPTIMIZE TABLE articles; + +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE; + +DROP TABLE articles; + +# Restore global variables +SET GLOBAL innodb_ft_aux_table=@aux; +SET GLOBAL INNODB_OPTIMIZE_FULLTEXT_ONLY=@optimize; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb-fts-ddl.test 2024-08-03 07:29:58.000000000 +0000 @@ -20,11 +20,20 @@ ('MySQL Security','When configured properly, MySQL ...'); # Table does rebuild when fts index builds for the first time +# Create the FTS index + +if ($MTR_COMBINATION_ORIG) { --error ER_ALTER_OPERATION_NOT_SUPPORTED ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; - -# Create the FTS index ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=INPLACE; +} +if (!$MTR_COMBINATION_ORIG) { +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; +--enable_info +ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); +--disable_info +} # Select word "tutorial" in the table SELECT * FROM fts_test WHERE MATCH (title, body) @@ -43,7 +52,14 @@ ('MySQL Security','When configured properly, MySQL ...'); # FTS_DOC_ID hidden column and FTS_DOC_ID index exist +if ($MTR_COMBINATION_ORIG) { ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; +} +if (!$MTR_COMBINATION_ORIG) { +--enable_info +ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); +--disable_info +} # Select word "tutorial" in the table SELECT * FROM fts_test WHERE MATCH (title, body) @@ -112,7 +128,14 @@ # column already exists. This has not been implemented yet. --error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON CREATE FULLTEXT INDEX idx on fts_test (title, body) LOCK=NONE; +if ($MTR_COMBINATION_ORIG) { ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body), ALGORITHM=NOCOPY; +} +if (!$MTR_COMBINATION_ORIG) { +--enable_info +ALTER TABLE fts_test ADD FULLTEXT `idx` (title, body); +--disable_info +} --error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON ALTER TABLE fts_test ROW_FORMAT=REDUNDANT, LOCK=NONE; @@ -349,8 +372,14 @@ write_file $MYSQLD_DATADIR/test/$fts_aux_file; EOF --replace_regex /".*" from/"Resource temporarily unavailable" from/ +if ($MTR_COMBINATION_ORIG) { --error ER_GET_ERRNO ALTER TABLE t1 ADD FULLTEXT(a), ALGORITHM=INPLACE; +} +if (!$MTR_COMBINATION_ORIG) { +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t1 ADD FULLTEXT(a), ALGORITHM=INPLACE; +} DROP TABLE t1; remove_file $MYSQLD_DATADIR/test/$fts_aux_file; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb-fts-fic.test 2024-08-03 07:29:58.000000000 +0000 @@ -211,8 +211,13 @@ (1, 'MySQL Tutorial','DBMS stands for DataBase ...'), (2, 'How To Use MySQL Well','After you went through a ...'); +if ($MTR_COMBINATION_ORIG) { --error ER_INNODB_FT_WRONG_DOCID_COLUMN CREATE FULLTEXT INDEX idx ON wp(title, text); +} +if (!$MTR_COMBINATION_ORIG) { +CREATE FULLTEXT INDEX idx ON wp(title, text); +} DROP TABLE wp; CREATE TABLE wp( diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/innodb_fts_proximity.test 2024-08-03 07:29:58.000000000 +0000 @@ -163,6 +163,8 @@ set global innodb_file_per_table=1; +set names utf8; +--character_set utf8 # Test fts with externally stored long column CREATE TABLE t1 ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/limit_union.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/limit_union.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/limit_union.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/limit_union.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,143 @@ +--source include/have_debug.inc +--source include/have_innodb.inc + +--echo # Bug #22709692 FTS QUERY EXCEEDS RESULT CACHE LIMIT + +CREATE TABLE articles ( +id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, +title VARCHAR(200), +body TEXT, +FULLTEXT (title,body), +FULLTEXT (body))ENGINE=InnoDB; + +INSERT INTO articles (title,body) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...'), + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +SET @default_cache_size = @@GLOBAL.query_cache_size; +SET GLOBAL query_cache_size=0; + +--echo # Query involves Ranking +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL' IN NATURAL LANGUAGE MODE) LIMIT 1; + +--echo # Without optimization +SET @save_dbug = @@debug_dbug; +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL' IN NATURAL LANGUAGE MODE) LIMIT 1; +SET debug_dbug = @save_dbug; + +--echo # Query involves No Ranking and fts_union operations +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL' IN BOOLEAN MODE) limit 1; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL' IN BOOLEAN MODE) limit 1; + +SET debug_dbug = @save_dbug; + +--echo # Query involves No ranking and fts_union, fts_ignore +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL -YourSQL' IN BOOLEAN MODE) limit 1; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL -YourSQL' IN BOOLEAN MODE) limit 1; +SET debug_dbug = @save_dbug; + +--echo # Query with fts_intersect +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL +YourSQL' IN BOOLEAN MODE) limit 1; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL +YourSQL' IN BOOLEAN MODE) limit 1; +SET debug_dbug = @save_dbug; + +# insert record with @ character which is used in proximity search +INSERT INTO articles (title,body) VALUES + ('MySQL Tutorial','request doc@oraclehelp.com ...'), + ('MySQL Tutorial','request support@oraclehelp.com ...'), + ('Trial version','query performace @1255 minute on 2.1Hz + Memory 2GB...'), + ('when To Use MySQL Well','for free faq mail@xyz.com ...'); + +--echo # Query with @distance +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('"MySQL request"@3' IN BOOLEAN MODE) limit 1; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('"MySQL request"@3' IN BOOLEAN MODE) limit 1; +SET debug_dbug = @save_dbug; + +--echo # Query with subexpression +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('+MySQL +(-support +doc)' IN BOOLEAN MODE) limit 1; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('+MySQL +(-support +doc)' IN BOOLEAN MODE) limit 1; +SET debug_dbug = @save_dbug; + +--echo # limit num1 OFFSET num2 +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL' in boolean mode) limit 4 offset 2; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('MySQL' in boolean mode) limit 4 offset 2; +SET debug_dbug = @save_dbug; + +--echo # wild card search +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('ru*' IN BOOLEAN MODE) limit 1; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('ru*' IN BOOLEAN MODE) limit 1; +SET debug_dbug = @save_dbug; + +--echo # phrase search +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('"request support"' IN BOOLEAN MODE) limit 1; + +--echo # Without optimization +SET debug_dbug = '+d,fts_union_limit_off'; +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('"request support"' IN BOOLEAN MODE) limit 1; +SET debug_dbug = @save_dbug; + +DROP TABLE articles; +SET GLOBAL query_cache_size = @default_cache_size; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/misc.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/misc.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,1511 @@ +--source include/have_innodb.inc +--source include/no_valgrind_without_big.inc + +#------------------------------------------------------------------------------ +# Test With alter/create/drop index +#------------------------------------------------------------------------------ + +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'); + +# Create the FTS index Using Alter Table +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +EVAL SHOW CREATE TABLE t1; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# boolean mode +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +select id, MATCH(a,b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; +select id from t1 where MATCH a,b AGAINST ("+call* +coll*" IN BOOLEAN MODE); +select id from t1 where MATCH a,b AGAINST ('"support now"' IN BOOLEAN MODE); +select id from t1 where MATCH a,b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE); + +# query expansion +select id from t1 where MATCH(a,b) AGAINST ("collections" WITH QUERY EXPANSION); +select id from t1 where MATCH(a,b) AGAINST ("indexes" WITH QUERY EXPANSION); +select id from t1 where MATCH(a,b) AGAINST ("indexes collections" WITH QUERY EXPANSION); + +# Drop index +ALTER TABLE t1 DROP INDEX idx; + +# Create the FTS index again +CREATE FULLTEXT INDEX idx on t1 (a,b); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# boolean mode +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +select id, MATCH(a,b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; +select id from t1 where MATCH a,b AGAINST ("+call* +coll*" IN BOOLEAN MODE); +select id from t1 where MATCH a,b AGAINST ('"support now"' IN BOOLEAN MODE); +select id from t1 where MATCH a,b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE); + +# query expansion +select id from t1 where MATCH(a,b) AGAINST ("collections" WITH QUERY EXPANSION); +select id from t1 where MATCH(a,b) AGAINST ("indexes" WITH QUERY EXPANSION); +select id from t1 where MATCH(a,b) AGAINST ("indexes collections" WITH QUERY EXPANSION); + +# insert for proximity search +INSERT INTO t1 (a,b) VALUES ('test query expansion','for database ...'); +# Insert into table with similar word of different distances +INSERT INTO t1 (a,b) VALUES + ('test proximity search, test, proximity and phrase', + 'search, with proximity innodb'); + +INSERT INTO t1 (a,b) VALUES + ('test proximity fts search, test, proximity and phrase', + 'search, with proximity innodb'); + +INSERT INTO t1 (a,b) VALUES + ('test more proximity fts search, test, more proximity and phrase', + 'search, with proximity innodb'); + +# This should only return the first document +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('"proximity search"@2' IN BOOLEAN MODE); + +# This would return no document +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('"proximity search"@1' IN BOOLEAN MODE); + +# This give you all three documents +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('"proximity search"@3' IN BOOLEAN MODE); + +# Similar boundary testing for the words +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('"test proximity"@3' IN BOOLEAN MODE); + +# Test with more word The last document will return, please notice there +# is no ordering requirement for proximity search. +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('"more test proximity"@3' IN BOOLEAN MODE); + +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('"more test proximity"@2' IN BOOLEAN MODE); + +# The phrase search will not require exact word ordering +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('"more fts proximity"@02' IN BOOLEAN MODE); + +DROP TABLE t1; + + + +#------------------------------------------------------------------------------ +# Test with FTS condition in subquery +#------------------------------------------------------------------------------ + +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Create the FTS index again +CREATE FULLTEXT INDEX idx on t1 (a,b); + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'); + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE id = (SELECT MAX(id) FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE id = (SELECT MIN(id) FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE id = (SELECT MIN(id) FROM t1 WHERE MATCH (a,b) +AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)) OR id = 3 ; + + +# Select word "tutorial" in the table - innodb crash +SELECT id FROM t1 WHERE CONCAT(t1.a,t1.b) IN ( +SELECT CONCAT(a,b) FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +) OR t1.id = 3 ; + + +# Select word "tutorial" in the table - innodb crash +SELECT id FROM t1 WHERE CONCAT(t1.a,t1.b) IN ( +SELECT CONCAT(a,b) FROM t1 AS t2 +WHERE MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +AND t2.id != 3) ; + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE id IN (SELECT MIN(id) FROM t1 WHERE +MATCH (a,b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)) OR id = 3 ; + +# Select word except "tutorial" in the table +SELECT id FROM t1 WHERE id NOT IN (SELECT MIN(id) FROM t1 +WHERE MATCH (a,b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE)) ; + + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE EXISTS (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +AND t1.id = t2.id) ; + + +# Select not word like "tutorial" using subquery +SELECT id FROM t1 WHERE NOT EXISTS (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) +AND t1.id = t2.id) ; + +DROP TABLE t1; + +# boolean search +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT , + FULLTEXT (a,b) + ) ENGINE = InnoDB; + +INSERT INTO t1(a,b) VALUES('MySQL has now support', 'for full-text search'), +('Full-text indexes', 'are called collections'), +('Only MyISAM tables','support collections'), +('Function MATCH ... AGAINST()','is used to do a search'), +('Full-text search in MySQL', 'implements vector space model'); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE t1.id = (SELECT MAX(t2.id) FROM t1 AS t2 WHERE + MATCH(t2.a,t2.b) AGAINST("+support +collections" IN BOOLEAN MODE)); +SELECT id FROM t1 WHERE t1.id != (SELECT MIN(t2.id) FROM t1 AS t2 WHERE + MATCH(t2.a,t2.b) AGAINST("+search" IN BOOLEAN MODE)); + +SELECT id FROM t1 WHERE t1.id IN (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ("+call* +coll*" IN BOOLEAN MODE)); + +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE) AND t2.id=t1.id); + + +#query expansion search +# result differ for query expansion search even wo subquery +#SELECT id FROM t1 WHERE t1.id = ( SELECT MAX(t2.id) FROM t1 AS t2 WHERE +#MATCH(a,b) AGAINST ("collections" WITH QUERY EXPANSION)); +#SELECT id FROM t1 WHERE t1.id IN ( SELECT t2.id FROM t1 AS t2 WHERE +#MATCH(a,b) AGAINST ("indexes" WITH QUERY EXPANSION)); +#SELECT id FROM t1 WHERE ( SELECT COUNT(*) FROM t1 AS t2 WHERE +#MATCH(t2.a,t2.b) AGAINST ("indexes collections" WITH QUERY EXPANSION)) >= 1 +#AND t1.id <=3 ; + +# proximity search +# insert for proximity search +INSERT INTO t1 (a,b) VALUES ('test query expansion','for database ...'); +# Insert into table with similar word of different distances +INSERT INTO t1 (a,b) VALUES + ('test proximity search, test, proximity and phrase', + 'search, with proximity innodb'); + +INSERT INTO t1 (a,b) VALUES + ('test proximity fts search, test, proximity and phrase', + 'search, with proximity innodb'); + +INSERT INTO t1 (a,b) VALUES + ('test more proximity fts search, test, more proximity and phrase', + 'search, with proximity innodb'); + + +SELECT id FROM t1 WHERE t1.id = (SELECT MAX(t2.id) FROM t1 AS t2 WHERE +MATCH(t2.a,t2.b) AGAINST ('"proximity search"@2' IN BOOLEAN MODE)); +SELECT id FROM t1 WHERE t1.id > (SELECT MIN(t2.id) FROM t1 AS t2 WHERE +MATCH(t2.a,t2.b) AGAINST ('"proximity search"@2' IN BOOLEAN MODE)); + +SELECT id FROM t1 WHERE t1.id IN (SELECT t2.id FROM t1 AS t2 WHERE +MATCH (t2.a,t2.b) AGAINST ('"proximity search"@2' IN BOOLEAN MODE)); + +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"proximity search"@2' IN BOOLEAN MODE) +AND t2.id=t1.id); + +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"more test proximity"@3' IN BOOLEAN MODE) +AND t2.id=t1.id); + +SELECT id FROM t1 WHERE EXISTS (SELECT id FROM t1 AS t2 WHERE +MATCH t2.a,t2.b AGAINST ('"more test proximity"@2' IN BOOLEAN MODE) +AND t2.id=t1.id); + + +#------------------------------------------------------------------------------ +# create table AS SELECT from fts indexed table +#------------------------------------------------------------------------------ +CREATE TABLE t2 ENGINE = InnoDB AS SELECT id FROM t1 WHERE +MATCH a,b AGAINST ('support') ; +SHOW CREATE TABLE t2; +SELECT id FROM t2; +DROP TABLE t2; + +CREATE TABLE t2 ENGINE = InnoDB AS SELECT id FROM t1 WHERE +MATCH a,b AGAINST("+support +collections" IN BOOLEAN MODE); +SHOW CREATE TABLE t2; +SELECT id FROM t2; +DROP TABLE t2; + +CREATE TABLE t2 ENGINE = InnoDB AS SELECT id FROM t1 WHERE +MATCH a,b AGAINST ('"proximity search"@10' IN BOOLEAN MODE); +SHOW CREATE TABLE t2; +SELECT id FROM t2; +DROP TABLE t2; + +DROP TABLE t1; + + +#------------------------------------------------------------------------------ +# Verift FTS with NULL records +#------------------------------------------------------------------------------ +# Create FTS table +EVAL CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Create the FTS index again +CREATE FULLTEXT INDEX idx on t1 (a,b); + + +# Insert rows +INSERT INTO t1 (a,b) VALUES +('MySQL from Tutorial','DBMS stands for DataBase ...'); + +let $counter = 50; +--disable_query_log +WHILE ($counter > 0) { + INSERT INTO t1 (a,b) VALUES (NULL,NULL); + dec $counter; +} +--enable_query_log +INSERT INTO t1 (a,b) VALUES +('when To Use MySQL Well','After that you went through a ...'); + +let $counter = 50; +--disable_query_log +WHILE ($counter > 0) { + INSERT INTO t1 (a,b) VALUES (NULL,NULL); + dec $counter; +} +--enable_query_log +INSERT INTO t1 (a,b) VALUES +('where will Optimizing MySQL','what In this tutorial we will show ...'); + +INSERT INTO t1 (a,b) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), +('MySQL vs. YourSQL','In the following database comparison ...'), +('MySQL Security','When configured properly, MySQL null...'); + +SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t1 WHERE a IS NULL; +SELECT COUNT(*) FROM t1 WHERE b IS NOT NULL; + +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST (NULL IN NATURAL LANGUAGE MODE); +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST (NULL WITH QUERY EXPANSION); +SELECT id FROM t1 + WHERE MATCH (a,b) + AGAINST ('null' IN NATURAL LANGUAGE MODE); +# Boolean search +# Select rows contain "MySQL" but not "YourSQL" +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE) AND (a IS NOT NULL OR b IS NOT NULL); +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE) AND (a IS NULL AND b IS NOT NULL); + +# Select rows contain at least one of the two words +SELECT id FROM t1 WHERE MATCH (a,b) +AGAINST ('DBMS Security' IN BOOLEAN MODE); + +# Test query expansion +SELECT COUNT(*) FROM t1 +WHERE MATCH (a,b) +AGAINST ('database' WITH QUERY EXPANSION); + +# proximity +SELECT id FROM t1 +WHERE MATCH (a,b) +AGAINST ('"following database"@10' IN BOOLEAN MODE); + + +DROP TABLE t1; + + + +#------------------------------------------------------------------------------ +# More FTS test from peter's testing +#------------------------------------------------------------------------------ +--disable_warnings +drop table if exists t50; +--enable_warnings + +set names utf8; + + +--echo "----------Test1---------" +# Create FTS table +create table t50 (s1 varchar(60) character set utf8 collate utf8_bin) engine = innodb; +create fulltext index i on t50 (s1); +# INNODB_FTS: Assert - fixed +# Assert : InnoDB: Failing assertion: rbt_validate(result_doc->tokens) +insert into t50 values ('ABCDE'),('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'); +# it was giving empty result set instead of one record +select * from t50 where match(s1) against ('VÃÆ·WÄ°'); +drop table t50; + + +--echo "----------Test2---------" +create table t50 (s1 int unsigned primary key auto_increment, s2 +varchar(60) character set utf8) engine = innodb; +create fulltext index i on t50 (s2); +insert into t50 (s2) values ('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'),('ABCDE'); +# INNODB_FTS: RESULT DIFF +# Order by does not sort result. +# Optimizer's Evgeny is investigate a similar issue. InnoDB FTS is used only +# for FT search, and should not be used as regular index for such order by query. +# Correct the result file when fixed. +select * from t50 order by s2; +drop table t50; + + +--echo "----------Test3---------" +create table t50 (id int unsigned primary key auto_increment, s2 +varchar(60) character set utf8) engine = innodb; +create fulltext index i on t50 (s2); +insert into t50 (s2) values ('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'),('ABCDE'); +set @@autocommit=0; +update t50 set s2 = lower(s2); +update t50 set s2 = upper(s2); +commit; +select * from t50 where match(s2) against ('VÃÆ·WÄ° FGHIJ KLMNO ABCDE' in boolean mode); +select * from t50; +drop table t50; +set @@autocommit=1; + +--echo "----------Test4---------" +create table t50 (id int unsigned primary key auto_increment, s2 +varchar(60) character set utf8) engine = innodb; +create fulltext index i on t50 (s2); +insert into t50 (s2) values ('FGHIJ'),('KLMNO'),('VÃÆ·WÄ°'),('ABCD*'); +select * from t50 where match(s2) against ('abcd*' in natural language +mode); +# INNODB_FTS: RESULT DIFF(Expected). InnoDB do not index "*", so +# word "ABCD" indexed, instead of "ABCD*" +select * from t50 where match(s2) against ('abcd*' in boolean mode); +drop table t50; + + +--echo "----------Test5---------" +create table t50 (s1 int, s2 varchar(200), fulltext key(s2)) engine = innodb; +set @@autocommit=0; +insert into t50 values (1,'Sunshine'),(2,'Lollipops'); +select * from t50 where match(s2) against('Rainbows'); +rollback; +select * from t50; +drop table t50; +set @@autocommit=1; + +--echo "----------Test6---------" +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('aab` MySQL Tutorial','DBMS stands for DataBase ...') , + ('aas How To Use MySQL Well','After you went through a ...'), + ('aac Optimizing MySQL','In this tutorial we will show ...'); +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('aac 1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('aab MySQL vs. YourSQL','In the following database comparison ...'), + ('aaa MySQL Security','When configured properly, MySQL ...'); +# Create the FTS index Using Alter Table +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); + +-- disable_query_log +-- disable_result_log +ANALYZE TABLE t1; +-- enable_result_log +-- enable_query_log + +SELECT * FROM t1 ORDER BY MATCH(a,b) AGAINST ('aac') DESC; +SELECT * FROM t1 ORDER BY MATCH(a,b) AGAINST ('aab') DESC; + +--echo "----------Test7---------" +select * from t1 where match(a,b) against ('aaa') +union select * from t1 where match(a,b) against ('aab') +union select * from t1 where match(a,b) against ('aac'); + +select * from t1 where match(a,b) against ('aaa') + or match(a,b) against ('aab') + or match(a,b) against ('aac'); + +DROP TABLE t1; + +--echo "----------Test8---------" +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ... abcd') , + ('How To Use MySQL Well','After you went through a q ...abdd'), + ('Optimizing MySQL','In this tutorial we will show ...abed'); + +# Create the FTS index Using Alter Table +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +EVAL SHOW CREATE TABLE t1; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. q ...'), + ('MySQL vs. YourSQL use','In the following database comparison ...'), + ('MySQL Security','When run configured properly, MySQL ...'); + +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('run'); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('use'); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('went'); +# rows should be matched as 'q' is single char its not indexed +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('run') AND NOT MATCH(a,b) AGAINST ('q'); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('use') AND NOT MATCH(a,b) AGAINST ('q'); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('went') AND NOT MATCH(a,b) AGAINST ('q'); + +--echo "----------Test9---------" +CREATE TABLE t2 AS SELECT * FROM t1; +ALTER TABLE t2 ENGINE=MYISAM; +CREATE FULLTEXT INDEX i ON t2 (a,b); +SET @x = (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('run')); +SET @x = @x + (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('use')); +SET @x = @x + (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('went')); +SET @x = @x + (SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('run')); +SET @x2 = (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('run')); +SET @x2 = @x2 + (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('use')); +SET @x2 = @x2 + (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('went')); +SET @x2 = @x2 + (SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('run')); +# Innodb returns value for x which is correct +SELECT @x, @x2; + + +DROP TABLE t2; + +--echo "----------Test10---------" +CREATE TABLE t2 AS SELECT * FROM t1; +ALTER TABLE t2 ENGINE=MYISAM; +CREATE FULLTEXT INDEX i ON t2 (a,b); +SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('abc*' IN BOOLEAN MODE); +SELECT COUNT(*) FROM t1 WHERE MATCH(a,b) AGAINST ('abc*' IN BOOLEAN MODE); + +DROP TABLE t2; + + +--echo "----------Test11---------" +CREATE TABLE t2 AS SELECT * FROM t1; +ALTER TABLE t2 ENGINE = MYISAM; +CREATE FULLTEXT INDEX i ON t2 (a,b); +ALTER TABLE t2 ENGINE=InnoDB; +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ('run'); +SELECT COUNT(*) FROM t2 WHERE MATCH(a,b) AGAINST ('abc*' IN BOOLEAN MODE); +DROP TABLE t2,t1; + + +--echo "----------Test13---------" +set names utf8; + +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200) CHARACTER SET UTF8 COLLATE UTF8_SPANISH_CI) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t1 (s2); +INSERT INTO t1 VALUES (1,'aaCen'),(2,'aaCha'),(3,'aaCio'),(4,'aaçen'),(5,'aaçha'),(6,'aaçio'); +SELECT * FROM t1 WHERE MATCH(s2) AGAINST ('aach*' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(s2) AGAINST ('aaC*' IN BOOLEAN MODE); +DROP TABLE t1; + +--echo "----------Test14---------" +CREATE TABLE t1(s1 INT , s2 VARCHAR(100) CHARACTER SET sjis) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t1 (s2); +INSERT INTO t1 VALUES (1,'ペペペ'),(2,'テテテ'),(3,'ルルル'),(4,'ã‚°ã‚°ã‚°'); +# Innodb Asset : file ha_innodb.cc line 4557 +#SELECT * FROM t1 WHERE MATCH(s2) AGAINST ('テテ*' IN BOOLEAN MODE); +DROP TABLE t1; + + +--echo "----------Test15---------" +CREATE TABLE t1 (s1 VARCHAR (60) CHARACTER SET UTF8 COLLATE UTF8_UNICODE_520_CI) ENGINE = MyISAM; +CREATE FULLTEXT INDEX i ON t1 (s1); +INSERT INTO t1 VALUES +('a'),('b'),('c'),('d'),('ÅÅÅÅ'),('LLLL'),(NULL),('ÅÅÅÅ ÅÅÅÅ'),('LLLLLLLL'); +SELECT * FROM t1 WHERE MATCH(s1) AGAINST ('LLLL' COLLATE UTF8_UNICODE_520_CI); +DROP TABLE if EXISTS t2; +CREATE TABLE t2 (s1 VARCHAR(60) CHARACTER SET UTF8 COLLATE UTF8_POLISH_CI) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t2 ( s1); +INSERT INTO t2 VALUES +('a'),('b'),('c'),('d'),('ÅÅÅÅ'),('LLLL'),(NULL),('ÅÅÅÅ ÅÅÅÅ'),('LLLLLLLL'); +SELECT * FROM t2 WHERE MATCH(s1) AGAINST ('LLLL' COLLATE UTF8_UNICODE_520_CI); +--disable_warnings +DROP TABLE t1,t2; +--enable_warnings + +--echo "----------Test16---------" +CREATE TABLE t1 (s1 INT, s2 VARCHAR(50) CHARACTER SET UTF8) ENGINE = InnoDB; +CREATE FULLTEXT INDEX i ON t1(s2); +INSERT INTO t1 VALUES (2, 'ÄŸÄ— DaÅ›i p '); +SELECT * FROM t1 WHERE MATCH(s2) AGAINST ('+p +"ÄŸÄ— DaÅ›i*"' IN BOOLEAN MODE); +DROP TABLE t1; + + +--echo "----------Test19---------" +#19 Failure with Boolean quoted search +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF8) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1,'İóëɠ'); +CREATE FULLTEXT INDEX i ON t1 (char_column); +SELECT * FROM t1 WHERE MATCH(char_column) AGAINST ('"İóëɠ"' IN BOOLEAN MODE); +DROP TABLE t1; + +--echo "----------Test20---------" +#20 Crash with utf32 and boolean mode. +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF32, char_column2 VARCHAR(60) character set utf8) ENGINE = InnoDB; +INSERT INTO t1 (char_column) VALUES ('abcde'),('fghij'),('klmno'),('qrstu'); +UPDATE t1 SET char_column2 = char_column; +CREATE FULLTEXT INDEX i ON t1 (char_column2); +--error ER_FT_MATCHING_KEY_NOT_FOUND +SELECT * FROM t1 WHERE MATCH(char_column) AGAINST ('abc*' IN BOOLEAN MODE); +DROP TABLE t1; + +--echo "----------Test22---------" +# case 22 +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF8) ENGINE = InnoDB; +INSERT INTO t1 VALUES (1,'aaa'),(2,'bbb'),(3,'ccc'); +CREATE FULLTEXT INDEX i ON t1 (char_column); +HANDLER t1 OPEN; +--error ER_KEY_DOESNT_SUPPORT +HANDLER t1 READ i = ('aaa'); +DROP TABLE t1; +#23. Duplicate key error when there are no unique indexes (procedure test) +#24 Failure after cascading update - already have tests + +--echo "----------Test25---------" +#25 Failure with Croatian boolean truncated search. +CREATE TABLE t1 ( id INT , char_column VARCHAR(60) CHARACTER SET UTF8 COLLATE UTF8_CROATIAN_CI) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,'LJin'),(2,'ljin'),(3,'lmin'),(4,'LJLJLJLJLJ'); +CREATE FULLTEXT INDEX i ON t1 (char_column); +#inndob:error incorrect result correct it after fix +SELECT count(*) FROM t1 WHERE MATCH (char_column) AGAINST ('lj*' IN BOOLEAN MODE); +DROP TABLE t1; + +#26. Index error when run procedure call from multiple clients + +--echo "----------Test27---------" +#27 Crash after server restart +CREATE TABLE t1 (id INT,char_column VARCHAR(60)) ENGINE=InnoDB; +SET @@autocommit=0; +CREATE FULLTEXT INDEX i ON t1 (char_column); +INSERT INTO t1 values (1,'aaa'); +echo "restart server..." +# Restart the server +--source include/restart_mysqld.inc +DELETE FROM t1 WHERE MATCH(char_column) AGAINST ('bbb'); +SET @@autocommit=1; +DROP TABLE t1; + +--echo "----------Test28---------" +drop table if exists `fts_test`; +create table `fts_test`(`a` text,fulltext key(`a`))engine=innodb; +set session autocommit=0; +insert into `fts_test` values (''); +savepoint `b`; +savepoint `b`; +set session autocommit=1; +DROP TABLE fts_test; + +# Continue test savepoint related operations. With a commit after +# multiple rollback to savepoints +--echo "----------Test29---------" +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT, + FULLTEXT (title,body) + ) ENGINE=InnoDB; + +INSERT INTO articles (title,body) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...'); + + +start transaction; + +INSERT INTO articles (title,body) VALUES +('How To Use MySQL Well','After you went through a ...'); + +savepoint `a1`; + +INSERT INTO articles (title,body) VALUES +('Optimizing MySQL','In this tutorial we will show ...'); + +savepoint `a2`; + +INSERT INTO articles (title,body) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'); + +savepoint `a3`; + +INSERT INTO articles (title,body) VALUES +('MySQL vs. YourSQL','In the following database comparison ...'); + +savepoint `a4`; + +# FTS do not parse those uncommitted rows, only one row should show up +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('Database' IN NATURAL LANGUAGE MODE); + +rollback to savepoint a3; + +# The last inserted row should not be there +select title, body from articles; + +INSERT INTO articles (title,body) VALUES +('MySQL Security','When configured properly, MySQL ...'); + +savepoint `a5`; + +select title, body from articles; + +rollback to savepoint a2; + +select title, body from articles; + +commit; + +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('Database' IN NATURAL LANGUAGE MODE); + +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +DROP TABLE articles; + +# Continue test savepoint related operations. With a rollback after +# multiple rollback to savepoints +--echo "----------Test30---------" +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT, + FULLTEXT (title,body) + ) ENGINE=InnoDB; + +INSERT INTO articles (title,body) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...'); + +start transaction; + +INSERT INTO articles (title,body) VALUES +('How To Use MySQL Well','After you went through a ...'); + +savepoint `a1`; + +INSERT INTO articles (title,body) VALUES +('Optimizing MySQL','In this tutorial we will show ...'); + +savepoint `a2`; + +INSERT INTO articles (title,body) VALUES +('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'); + +savepoint `a3`; + +INSERT INTO articles (title,body) VALUES +('MySQL vs. YourSQL','In the following database comparison ...'); + +savepoint `a4`; + +# FTS do not parse those uncommitted rows, only one row should show up +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('Database' IN NATURAL LANGUAGE MODE); + +rollback to savepoint a3; + +# The last inserted row should not be there +select title, body from articles; + +INSERT INTO articles (title,body) VALUES +('MySQL Security','When configured properly, MySQL ...'); + +savepoint `a5`; + +select title, body from articles; + +rollback to savepoint a2; + +select title, body from articles; + +rollback; + +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('Database' IN NATURAL LANGUAGE MODE); + +SELECT * FROM articles + WHERE MATCH (title,body) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +DROP TABLE articles; + +# Test for Bug #13907075 - DIFFERENT RESULTS FOR DIFFERENT TERM ORDER +# WITH INNODB BOOLEAN FULLTEXT SEARCH. The FTS_IGNORE ("-") operation +# is orderless +# Create FTS table +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT, + FULLTEXT (title,body) + ) ENGINE=InnoDB; + +# Insert six rows +INSERT INTO articles (title,body) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +-- disable_result_log +ANALYZE TABLE articles; +-- enable_result_log + +SELECT *, MATCH(title, body) AGAINST ('-database +MySQL' IN BOOLEAN MODE) AS score from articles; + +SELECT *, MATCH(title, body) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score FROM articles; + +# With subquery +SELECT * FROM articles where MATCH(title, body) AGAINST ('MySQL - (database - tutorial)' IN BOOLEAN MODE); + +SELECT * FROM articles where MATCH(title, body) AGAINST ('MySQL - (- tutorial database)' IN BOOLEAN MODE); + +# More complex query +SELECT * FROM articles where MATCH(title, body) AGAINST ('MySQL - (- tutorial database) -Tricks' IN BOOLEAN MODE); + +SELECT * FROM articles where MATCH(title, body) AGAINST ('-Tricks MySQL - (- tutorial database)' IN BOOLEAN MODE); + +DROP TABLE articles; + +# Test for Bug 13940669 - 64901: INNODB: ASSERTION FAILURE IN +# THREAD 34387022112 IN FILE REM0CMP.CC LINE 5 + +drop table if exists t1; + +create table t1 (FTS_DOC_ID bigint unsigned auto_increment not null primary key, +title varchar(200),body text,fulltext(title,body)) engine=innodb; + +insert into t1 set body='test'; + +select * from t1 where match(title,body) against('%test'); + +select * from t1 where match(title,body) against('%'); + +select * from t1 where match(title,body) against('%%%%'); + +drop table t1; + +# Test for Bug 13881758 - 64745: CREATE FULLTEXT INDEX CAUSES CRASH +# Create a database with empty space in its name +CREATE DATABASE `benu database`; + +USE `benu database`; + +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'); + +# Create the FTS index Using Alter Table +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +EVAL SHOW CREATE TABLE t1; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# boolean mode +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; +select id, MATCH(a,b) AGAINST("collections support" IN BOOLEAN MODE) as x from t1; +select id from t1 where MATCH a,b AGAINST ("+call* +coll*" IN BOOLEAN MODE); +select id from t1 where MATCH a,b AGAINST ('"support now"' IN BOOLEAN MODE); +select id from t1 where MATCH a,b AGAINST ('"Now sUPPort"' IN BOOLEAN MODE); + +DROP DATABASE `benu database`; + +USE test; + +# Test for Bug #14101706 - CRASH WITH DDL IN ROW_MERGE_BUILD_INDEXES +# WHEN FULLTEXT INDEXES EXIST + +CREATE TABLE `t21` (`a` text, `b` int not null, +fulltext key (`a`), fulltext key (`a`) +) ENGINE=INNODB DEFAULT CHARSET=LATIN1; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE `t21` ADD UNIQUE INDEX (`b`), ALGORITHM=INPLACE; +ALTER TABLE `t21` ADD UNIQUE INDEX (`b`); + +DROP TABLE t21; + +CREATE TABLE `t21` (`a` text, `b` int not null, +fulltext key (`a`)) ENGINE=INNODB DEFAULT CHARSET=LATIN1; + +ALTER TABLE `t21` ADD UNIQUE INDEX (`b`); + +DROP TABLE t21; + +# Test primary index rebuild +CREATE TABLE t1 ( + id INT NOT NULL, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 VALUES + (1, 'MySQL Tutorial','DBMS stands for DataBase ...') , + (2, 'How To Use MySQL Well','After you went through a ...'), + (3, 'Optimizing MySQL','In this tutorial we will show ...'); + +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); + +ALTER TABLE t1 ADD UNIQUE INDEX (`id`); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# boolean mode +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +select id, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; + +DROP TABLE t1; + +# Test create the FTS and primary index in the same clause +CREATE TABLE t1 ( + id INT NOT NULL, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 VALUES + (1, 'MySQL Tutorial','DBMS stands for DataBase ...') , + (2, 'How To Use MySQL Well','After you went through a ...'), + (3, 'Optimizing MySQL','In this tutorial we will show ...'); + +ALTER TABLE t1 ADD UNIQUE INDEX (`id`), ADD FULLTEXT INDEX idx (a,b); + +# Select word "tutorial" in the table +SELECT id FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# boolean mode +select id from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +select id from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); + +DROP TABLE t1; + +# Create FTS table with FTS_DOC_ID already existed +CREATE TABLE t1 ( + FTS_DOC_ID BIGINT UNSIGNED NOT NULL, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 VALUES + (1, 'MySQL Tutorial','DBMS stands for DataBase ...') , + (2, 'How To Use MySQL Well','After you went through a ...'), + (3, 'Optimizing MySQL','In this tutorial we will show ...'); + +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); + +ALTER TABLE t1 ADD UNIQUE INDEX (`FTS_DOC_ID`); + +# Select word "tutorial" in the table +SELECT FTS_DOC_ID FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# boolean mode +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +select FTS_DOC_ID, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; + +DROP TABLE t1; + +# Create FTS table with FTS_DOC_ID and FTS_DOC_ID_INDEX +CREATE TABLE t1 ( + FTS_DOC_ID BIGINT UNSIGNED NOT NULL, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 VALUES + (1, 'MySQL Tutorial','DBMS stands for DataBase ...') , + (2, 'How To Use MySQL Well','After you went through a ...'), + (3, 'Optimizing MySQL','In this tutorial we will show ...'); + +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b), ADD UNIQUE INDEX FTS_DOC_ID_INDEX (FTS_DOC_ID); + +# Select word "tutorial" in the table +SELECT FTS_DOC_ID FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +# boolean mode +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+support +collections" IN BOOLEAN MODE); +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search" IN BOOLEAN MODE); +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search +(support vector)" IN BOOLEAN MODE); +select FTS_DOC_ID from t1 where MATCH(a,b) AGAINST("+search -(support vector)" IN BOOLEAN MODE); +select FTS_DOC_ID, MATCH(a,b) AGAINST("support collections" IN BOOLEAN MODE) as x from t1; + +DROP TABLE t1; + +# Test for bug #14079609 - FTS: CRASH IN FTS_TRX_TABLE_CMP WITH SAVEPOINTS, XA + +CREATE TABLE t2 (`b` char(2),fulltext(`b`)) ENGINE=INNODB +DEFAULT CHARSET=LATIN1; + +CREATE TABLE t3 LIKE t2; + +INSERT INTO `t2` VALUES(); + +COMMIT WORK AND CHAIN; + +INSERT INTO `t3` VALUES (); +UPDATE `t2` SET `b` = 'a'; + +SAVEPOINT BATCH1; + +DROP TABLE t2; +DROP TABLE t3; + +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'); + +# Create the FTS index Using Alter Table +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); + +COMMIT WORK AND CHAIN; + +INSERT INTO t1 (a,b) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +SAVEPOINT BATCH1; + +SELECT id FROM t1 WHERE MATCH (a,b) + AGAINST ('MySQL' IN NATURAL LANGUAGE MODE); + +INSERT INTO t1 (a,b) VALUES + ('1002 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + + +ROLLBACK TO SAVEPOINT BATCH1; + +COMMIT; + +SELECT id FROM t1 WHERE MATCH (a,b) + AGAINST ('MySQL' IN NATURAL LANGUAGE MODE); + +DROP TABLE t1; + +# Test for Bug 14588091 - FTS: BUFFER OVERFLOW IN FTS_AST_CREATE_NODE_TEXT +CREATE TABLE `t` (`a` char(20) character set utf8 default null, +fulltext key (`a`)) ENGINE=INNODB; +INSERT INTO `t` VALUES ('a'); +INSERT INTO `t` VALUES ('aaa'); + +# 0x22 is the '"', 0xdd is not encoded in utf8 +SELECT MATCH(`a`) AGAINST (0x22dd22) FROM `t`; +SELECT MATCH(`a`) AGAINST (0x2222) FROM `t`; +SELECT MATCH(`a`) AGAINST (0x22) FROM `t`; + +# this should show one match +SELECT MATCH(`a`) AGAINST (0x2261616122) FROM `t`; + +# again 0xdd should be ignored +SELECT MATCH(`a`) AGAINST (0x2261dd6122) FROM `t`; + +SELECT MATCH(`a`) AGAINST (0x2261dd612222226122) FROM `t`; + +DROP TABLE t; + +# InnoDB FTS does not support index scan from handler +CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB; +HANDLER t OPEN; +HANDLER t READ a NEXT; +HANDLER t READ a PREV; +DROP TABLE t; + +CREATE TABLE `%`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; +CREATE TABLE `A B`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; +DROP TABLE `%`; +DROP TABLE `A B`; + +CREATE TABLE `t-26`(a VARCHAR(10),FULLTEXT KEY(a)) ENGINE=INNODB; +INSERT INTO `t-26` VALUES('117'); +DROP TABLE `t-26`; + +# Test on phrase search with stopwords contained in the search string +CREATE TABLE `t1` ( + `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + `content` TEXT NOT NULL, + PRIMARY KEY (`id`), + FULLTEXT INDEX `IDX_CONTEXT_FULLTEXT`(`content`) +) +ENGINE = InnoDB; + +insert into t1 (content) +values +('This is a story which has has a complicated phrase structure here in the +middle'), +('This is a story which doesn''t have that text'), +('This is a story that has complicated the phrase structure'); + +select * from t1 +where match(content) against('"complicated phrase structure"' in boolean +mode); + +# Test single phrase search with "+" symbol, one row should be returned +select * from t1 +where match(content) against('+"complicated phrase structure"' in boolean +mode); + +# Test phrase search with stopwords in between, one row should be returned +select * from t1 +where match(content) against('"complicated the phrase structure"' in boolean +mode); + +# Test phrase search with multiple "+" symbols +select * from t1 where match(content) against('+"this is a story which" +"complicated the phrase structure"' in boolean mode); + +# Test phrase search with leading word is a stopword, such stopword would be +# ignored +select * from t1 where match(content) against('"the complicated the phrase structure"' in boolean mode); + +# Test phrase search with non-matching stopword in between, no row should be +# returned +select * from t1 where match(content) against('"complicated a phrase structure"' in boolean mode); + +DROP TABLE t1; + +CREATE TABLE my (id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, +c VARCHAR(32), FULLTEXT(c)) ENGINE = INNODB; + +INSERT INTO my (c) VALUES ('green-iguana'); + +SELECT * FROM my WHERE MATCH(c) AGAINST ('green-iguana'); + +DROP TABLE my; + +CREATE TABLE ift ( + `a` int(11) NOT NULL, + `b` text, + PRIMARY KEY (`a`), + FULLTEXT KEY `b` (`b`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO ift values (1, "skip"); +INSERT INTO ift values (2, "skip and networking"); +INSERT INTO ift values (3, "--skip-networking"); +INSERT INTO ift values (4, "-donot--skip-networking"); + +SELECT * FROM ift WHERE MATCH (b) AGAINST ('--skip-networking'); +SELECT * FROM ift WHERE MATCH (b) AGAINST ('skip-networking'); +SELECT * FROM ift WHERE MATCH (b) AGAINST ('----'); +SELECT * FROM ift WHERE MATCH (b) AGAINST ('-donot--skip-networking'); + +DROP TABLE ift; + +# Test special cases of wildword. +# Create FTS table +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT, + FULLTEXT (title,body) + ) ENGINE=InnoDB; + +# Insert six rows +INSERT INTO articles (title,body) VALUES + ('MySQL Tutorial','DBMS stands for DataBase ...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('( that''s me )','When configured properly, MySQL ...'); + +SELECT * FROM articles WHERE MATCH (title,body) + AGAINST ('( yours''s* )' IN BOOLEAN MODE); + +SELECT * FROM articles WHERE MATCH (title,body) + AGAINST ('s*' IN BOOLEAN MODE); + +SELECT * FROM articles WHERE MATCH (title,body) + AGAINST ('stands\'] | * | show[@database' IN NATURAL LANGUAGE MODE); + +DROP TABLE articles; + +# Test for BUG#16429688 - FTS: SYNTAX ERROR, UNEXPECTED '*', EXPECTING $END +CREATE TABLE t1(a TEXT CHARACTER SET LATIN1, FULLTEXT INDEX(a)) ENGINE=INNODB; + +--error ER_PARSE_ERROR +SELECT * FROM t1 WHERE MATCH(a) AGAINST("*"); + +DROP TABLE t1; + +# Test for BUG#16516193 - LITERAL PHRASES CANNOT BE COMBINED WITH + OR - OPERATOR +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + FULLTEXT (a) + ) ENGINE= InnoDB; + +# Insert rows +INSERT INTO t1 (a) VALUES + ('Do you know MySQL is a good database'), + ('How to build a good database'), + ('Do you know'), + ('Do you know MySQL'), + ('How to use MySQL'), + ('Do you feel good'), + ('MySQL is good'), + ('MySQL is good to know'), + ('What is database'); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know mysql"' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+("know mysql")' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('("know mysql" good)' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+("know mysql" good)' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('(good "know mysql")' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+(good "know mysql")' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+("know mysql" "good database")' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know mysql" +"good database"' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know database"@4' IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"know database"@8' IN BOOLEAN MODE); + +# Drop table +DROP TABLE t1; + +# Test for BUG#16885178 - INNODB FULLTEXT PHRASE SEARCH VALGRIND ERROR +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + FULLTEXT (a) + ) ENGINE= InnoDB; + +# Insert a special row +INSERT INTO t1 (a) VALUES + ('know mysql good database'); + +# This phrase search fails in valgrind test before the fix. +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('+"good database"' IN BOOLEAN MODE); + +DROP TABLE t1; + +# Test single term ranking +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT, + FULLTEXT (title,body) + ) ENGINE=InnoDB; + +# Repeatedly insert/delete records, the ranking should be the same for +# each of them +INSERT INTO articles (title,body) VALUES ('Test Article','blah blah +blah'),("Matt's Noise",'this is noisy'),('February Weather','It was terrible +this year.'),('Peter Pan','Tis a kids story.'),('Test1','nada'),('Database +database database','foo database database database'),('Database article +title','body with lots of words.'),('myfulltext database', 'my test fulltext +database'); + +SELECT id, title, body FROM articles ORDER BY MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) DESC; +DELETE from articles WHERE title like "myfulltext database"; + +INSERT INTO articles (title,body) VALUES ('myfulltext database', 'my test fulltext database'); + +SELECT id, title, body FROM articles ORDER BY MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) DESC; +DELETE from articles WHERE title like "myfulltext database"; + +INSERT INTO articles (title,body) VALUES ('myfulltext database', 'my test fulltext database'); + +SELECT id, title, body FROM articles ORDER BY MATCH (title,body) AGAINST ('database' IN BOOLEAN MODE) DESC; + +DROP TABLE articles; + +# Test for BUG 18277305 - FTS: FAILING ASSERTION: PTR[1] == '\"' +# IN FTS_AST_CREATE_NODE_TEXT +CREATE TABLE t1( + a TEXT CHARSET ujis COLLATE ujis_japanese_ci, + b TEXT CHARSET utf8mb4 COLLATE utf8mb4_turkish_ci, + c TEXT CHARSET eucjpms COLLATE eucjpms_bin, + d TEXT CHARSET utf8mb4, + FULLTEXT INDEX(a), + FULLTEXT INDEX(b), + FULLTEXT INDEX(c), + FULLTEXT INDEX(d) +) ENGINE = InnoDB; + +INSERT INTO t1 VALUES + ('myisam', 'myisam', 'myisam', 'myisam'), + ('innodb', 'innodb', 'innodb', 'innodb'), + ('innodb myisam', 'innodb myisam', 'innodb myisam', 'innodb myisam'), + ('memory', 'memory', 'memory', 'memory'), + ('archive', 'archive', 'archive', 'archive'), + ('federated', 'federated', 'federated', 'federated'), + ('storage engine innodb', 'storage engine innodb', 'storage engine innodb', 'storage engine innodb'), + ('storage engine myisam', 'storage engine myisam', 'storage engine myisam', 'storage engine myisam'), + ('innobase', 'innobase', 'innobase', 'innobase'), + ('myisam innodb', 'myisam innodb', 'myisam innodb', 'myisam innodb'), + ('innodb myisam engines', 'innodb myisam engines', 'innodb myisam engines', 'innodb myisam engines'); + +# Test the ujis_japanese_ci +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', ' ', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '&', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '&', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '%', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', '(', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', ')')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +--error ER_PARSE_ERROR +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); + + +# Test the utf8mb4_turkish_ci +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00)); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', ' ', '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 0x00, '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', '&', 0x00, '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 0x00, '&', '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', '%', '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +--error ER_PARSE_ERROR +SELECT b FROM t1 WHERE MATCH (b) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); + +# Test the eucjpms_bin +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00)); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', ' ', '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', '&', 0x00, '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, '&', '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', '%', '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', '(', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', ')')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm', '"')); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +--error ER_PARSE_ERROR +SELECT c FROM t1 WHERE MATCH (c) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); + +ALTER TABLE t1 ENGINE = MyISAM; + +# Test the query against myisam to verify +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', ' ', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, '"', 0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '&', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, '&', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', '%', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, 0x00, 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', 0x00, '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00)); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', '(', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', ')')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', 'm', 'y', 'i', 's', 'a', 'm', '"')); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 0x00, 'i', 'n', 'n', 'o', 'd', 'b', '@', '$', 'm', 'y', 'i', 's', 'a', 'm', '%', 0x00, 0x00, '"','@', '2') IN BOOLEAN MODE); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT('"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 'm', 'y', 'i', 's', 'a', 'm', '"','@', '4') IN BOOLEAN MODE); +SELECT a FROM t1 WHERE MATCH (a) AGAINST (CONCAT(0x00, '"', 'i', 'n', 'n', 'o', 'd', 'b', ' ', '$', 's', 't', 'o', 'r', 'a', 'g', 'e', '"','@', '4', 0x00) IN BOOLEAN MODE); + +DROP TABLE t1; + +# Test for BUG#18229097 - FTS: DID NOT FIND WORD 0 IN DOC 39161 FOR QUERY EXPANSION SEARCH. +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + FULLTEXT (a) +) ENGINE= InnoDB; + +INSERT INTO t1 (a) VALUES + ('know database'),('good database'), ('gmail email'), ('ghome windows'); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g *' IN NATURAL LANGUAGE MODE); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * k *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * k * d *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * go *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g * good' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('gm * go *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('good *' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH (a) AGAINST ('g* database' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION); + +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/misc_1.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc_1.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/misc_1.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc_1.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,894 @@ +--source include/have_innodb.inc +--source include/innodb_page_size_small.inc +--source include/no_valgrind_without_big.inc + +#------------------------------------------------------------------------------ +# FTS with FK and update cascade +#------------------------------------------------------------------------------- +set names utf8; + +call mtr.add_suppression("\\[Warning\\] InnoDB: A new Doc ID must be supplied while updating FTS indexed columns."); +call mtr.add_suppression("\\[Warning\\] InnoDB: FTS Doc ID must be larger than [0-9]+ for table `test`.`t1`"); + +# Create FTS table +CREATE TABLE t1 ( + id1 INT , + a1 VARCHAR(200) , + b1 TEXT , + FULLTEXT KEY (a1,b1), PRIMARY KEY (a1, id1) + ) CHARACTER SET = utf8 , ENGINE = InnoDB; + +CREATE TABLE t2 ( + id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a2 VARCHAR(200), + b2 TEXT , + FOREIGN KEY (a2) REFERENCES t1(a1) ON UPDATE CASCADE, + FULLTEXT KEY (b2,a2) + ) CHARACTER SET = utf8 ,ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (id1,a1,b1) VALUES + (1,'MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , + (2,'How To Use MySQL Well','After you went through a ...'), + (3,'Optimizing MySQL','In this tutorial we will show ...'); + +# Insert rows +INSERT INTO t1 (id1,a1,b1) VALUES + (4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + (5,'MySQL vs. YourSQL','In the following database comparison ...'), + (6,'MySQL Security','When configured properly, MySQL ...'); + +# Insert rows in t2 fk table +INSERT INTO t2 (a2,b2) VALUES + ('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'); + +# Insert rows t2 fk table +INSERT INTO t2 (a2,b2) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +# error on violating fk constraint +--error 1452 +INSERT INTO t2 (a2,b2) VALUES + ('MySQL Tricks','1. Never run mysqld as root. 2. ...'); + +# error on delete from parent table +--error 1451 +DELETE FROM t1; + +ANALYZE TABLE t1; +ANALYZE TABLE t2; + +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial') ORDER BY id1; +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial') ORDER BY id2; + +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id1; +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id2; + +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id1; +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id2; + + +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; + +set global innodb_optimize_fulltext_only=1; +optimize table t1; +set global innodb_optimize_fulltext_only=0; +# Updating parent table hence child table should get updated due to 'update cascade' clause +UPDATE t1 SET a1 = "changing column - on update cascade" , b1 = "to check foreign constraint" WHERE +MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; + +# no records expected +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +# InnoDB:Error child table shows records which is incorrect - UPADTE on Fix +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; + +# it shows updated record +SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('+update +cascade' IN BOOLEAN MODE) ORDER BY id1; +# InnoDB:Error child table does not show the expected record +SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('+update +cascade' IN BOOLEAN MODE) ORDER BY id2; +SELECT id2 FROM t2 WHERE a2 LIKE '%UPDATE CASCADE%' ORDER BY id2; + +DROP TABLE t2 , t1; + +# on update cascade +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), + fulltext key(s2), + foreign key (s1,s2) references t1 (s1,s2) on update cascade) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +update t1 set s2 = 'Rainbows' where s2 <> 'Sunshine'; +commit; +select * from t2 where match(s2) against ('Lollipops'); +DROP TABLE t2 , t1; + +# on delete cascade +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), + fulltext key(s2), + foreign key (s1,s2) references t1 (s1,s2) on delete cascade) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +delete from t1 where s2 <> 'Sunshine'; +select * from t2 where match(s2) against ('Lollipops'); +DROP TABLE t2 , t1; + +# on delete set NULL +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), + fulltext key(s2), + foreign key (s1,s2) references t1 (s1,s2) on delete set null) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +delete from t1 where s2 <> 'Sunshine'; +select * from t2 where match(s2) against ('Lollipops'); +DROP TABLE t2 , t1; + + +# on update set NULL +create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (s1 int, s2 varchar(200), + fulltext key(s2), + foreign key (s1,s2) references t1 (s1,s2) on update set null) ENGINE = InnoDB; +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); +update t1 set s2 = 'Rainbows' where s2 <> 'Sunshine'; +commit; +select * from t2 where match(s2) against ('Lollipops'); +DROP TABLE t2 , t1; + +# When Doc ID is involved +create table t1 (s1 bigint unsigned not null, s2 varchar(200), + primary key (s1,s2)) ENGINE = InnoDB; +create table t2 (FTS_DOC_ID BIGINT UNSIGNED NOT NULL, s2 varchar(200), + foreign key (FTS_DOC_ID) references t1 (s1) + on update cascade) ENGINE = InnoDB; + +create fulltext index idx on t2(s2); + +show create table t2; + +insert into t1 values (1,'Sunshine'),(2,'Lollipops'); +insert into t2 values (1,'Sunshine'),(2,'Lollipops'); + +update t1 set s1 = 3 where s1=1; + +select * from t2 where match(s2) against ('sunshine'); + +# FTS Doc ID cannot be reused +--error 1451 +update t1 set s1 = 1 where s1=3; + +DROP TABLE t2 , t1; + +#------------------------------------------------------------------------------ +# FTS with FK and delete casecade +#------------------------------------------------------------------------------ + +# Create FTS table +CREATE TABLE t1 ( + id1 INT , + a1 VARCHAR(200) PRIMARY KEY, + b1 TEXT character set utf8 , + FULLTEXT KEY (a1,b1) + ) CHARACTER SET = utf8 ,ENGINE = InnoDB; + +CREATE TABLE t2 ( + id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a2 VARCHAR(200), + b2 TEXT character set utf8 , + FOREIGN KEY (a2) REFERENCES t1(a1) ON DELETE CASCADE, + FULLTEXT KEY (b2,a2) + ) CHARACTER SET = utf8 ,ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (id1,a1,b1) VALUES + (1,'MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , + (2,'How To Use MySQL Well','After you went through a ...'), + (3,'Optimizing MySQL','In this tutorial we will show ...'), + (4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + (5,'MySQL vs. YourSQL','In the following database comparison ...'), + (6,'MySQL Security','When configured properly, MySQL ...'); + +# Insert rows in t2 +INSERT INTO t2 (a2,b2) VALUES + ('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +# delete records from parent +DELETE FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; + +# no records expected +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; + +SELECT * FROM t1 WHERE a1 LIKE '%tutorial%'; +SELECT * FROM t2 WHERE a2 LIKE '%tutorial%'; + +DROP TABLE t2 , t1; + +#------------------------------------------------------------------------------ +# FTS with FK+transactions and UPDATE casecade with transaction +#------------------------------------------------------------------------------- + +call mtr.add_suppression("\\[ERROR\\] InnoDB: FTS Doc ID must be larger than 3 for table `test`.`t2`"); + +# Create FTS table +CREATE TABLE t1 ( + id1 INT , + a1 VARCHAR(200) , + b1 TEXT , + FULLTEXT KEY (a1,b1), PRIMARY KEY(a1, id1) + ) CHARACTER SET = utf8 , ENGINE = InnoDB; + +CREATE TABLE t2 ( + id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a2 VARCHAR(200), + b2 TEXT , + FOREIGN KEY (a2) REFERENCES t1(a1) ON UPDATE CASCADE, + FULLTEXT KEY (b2,a2) + ) CHARACTER SET = utf8 ,ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (id1,a1,b1) VALUES + (1,'MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , + (2,'How To Use MySQL Well','After you went through a ...'), + (3,'Optimizing MySQL','In this tutorial we will show ...'); + +# Insert rows in t2 fk table +INSERT INTO t2 (a2,b2) VALUES + ('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'); + +START TRANSACTION; +# Insert rows +INSERT INTO t1 (id1,a1,b1) VALUES + (4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + (5,'MySQL vs. YourSQL','In the following database comparison ...'), + (6,'MySQL Security','When configured properly, MySQL ...'); + +# Insert rows t2 fk table +INSERT INTO t2 (a2,b2) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +# error on violating fk constraint +--error 1452 +INSERT INTO t2 (a2,b2) VALUES + ('MySQL Tricks','1. Never run mysqld as root. 2. ...'); + +# error on DELETE FROM parent table +--error 1451 +DELETE FROM t1; + +# records expected +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial') ORDER BY id1; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial') ORDER BY id2; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id1; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ORDER BY id2; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id1; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id2; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ; + +# no records as data not COMMITted. +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('root') ; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('root') ; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('mysqld (+root)' IN BOOLEAN MODE) ; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('mysqld (-root)' IN BOOLEAN MODE) ; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('root' WITH QUERY EXPANSION) ; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('root' WITH QUERY EXPANSION) ; +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('"database comparison"@02' IN BOOLEAN MODE) ; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('"database comparison"@02' IN BOOLEAN MODE) ; + +SELECT * FROM t1 ORDER BY id1; +SELECT * FROM t2 ORDER BY id2; + +COMMIT; + +START TRANSACTION; +# Updating parent table hence child table should get updated due to 'UPDATE cascade' clause +UPDATE t1 SET a1 = "changing column - on UPDATE cascade" , b1 = "to check foreign constraint" WHERE +MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +COMMIT; + +# no records expected +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÃÆ·WÄ°)' IN BOOLEAN MODE) ; + +# it shows updated record +SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('+UPDATE +cascade' IN BOOLEAN MODE) ORDER BY id1; +SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('+UPDATE +cascade' IN BOOLEAN MODE) ORDER BY id2; +SELECT * FROM t2 WHERE a2 LIKE '%UPDATE CASCADE%' ORDER BY id2; + +DROP TABLE t2 , t1; + + +# FTS with FK+transactions - UPDATE cascade +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + +# FTS with FK+transactions - on DELETE cascade +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + +# FTS with FK+transactions - DELETE SET NULL +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + + +# FTS with FK+transactions - UPDATE SET NULL +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +COMMIT; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + + +#----------------------------------------------------------------------------- + +# FTS with FK+transactions - UPDATE cascade +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + +# FTS with FK+transactions - DELETE cascade +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE cascade) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + +# FTS with FK+transactions - DELETE SET NULL +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +DELETE FROM t1 WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + + +# FTS with FK+transactions - UPDATE SET NULL +CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB; +CREATE TABLE t2 (s1 INT, s2 VARCHAR(200), + FULLTEXT KEY(s2), + FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE SET NULL) ENGINE = InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops'); +INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops'); +UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine'; +ROLLBACK; +SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops'); +DROP TABLE t2 , t1; + + +#------------------------------------------------------------------------------ +# FTS index with compressed row format +#------------------------------------------------------------------------------ + +# Save innodb variables +let $innodb_file_per_table_orig=`select @@innodb_file_per_table`; + +set global innodb_file_per_table=1; + +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) CHARACTER SET = utf8, ROW_FORMAT=COMPRESSED, ENGINE = InnoDB; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('MySQL Tutorial','DBMS stands for DataBase VÃÆ·WÄ°...') , + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'); + +# Create the FTS index Using Alter Table +ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b); +EVAL SHOW CREATE TABLE t1; + +# Check whether individual space id created for AUX tables +SELECT count(*) FROM information_schema.innodb_sys_tables WHERE name LIKE "%FTS_%" AND space !=0; + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +-- disable_result_log +ANALYZE TABLE t1; +-- enable_result_log + +# Select word "tutorial" in the table +SELECT * FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id; + +# boolean mode +select * from t1 where MATCH(a,b) AGAINST("+tutorial +VÃÆ·WÄ°" IN BOOLEAN MODE); +--error ER_PARSE_ERROR +select * from t1 where MATCH(a,b) AGAINST("+-VÃÆ·WÄ°" IN BOOLEAN MODE); +select * from t1 where MATCH(a,b) AGAINST("+Mysql +(tricks never)" IN BOOLEAN MODE); +select * from t1 where MATCH(a,b) AGAINST("+mysql -(tricks never)" IN BOOLEAN MODE) ORDER BY id; +select *, MATCH(a,b) AGAINST("mysql stands" IN BOOLEAN MODE) as x from t1 ORDER BY id; +select * from t1 where MATCH a,b AGAINST ("+database* +VÃÆ·W*" IN BOOLEAN MODE); +select * from t1 where MATCH a,b AGAINST ('"security mysql"' IN BOOLEAN MODE); + +# query expansion +select * from t1 where MATCH(a,b) AGAINST ("VÃÆ·WÄ°" WITH QUERY EXPANSION) ORDER BY id; + +# Drop index +ALTER TABLE t1 DROP INDEX idx; + +# Create the FTS index again +CREATE FULLTEXT INDEX idx on t1 (a,b); + +-- disable_query_log +-- disable_result_log +ANALYZE TABLE t1; +-- enable_result_log +-- enable_query_log + +# Select word "tutorial" in the table +SELECT * FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id; + +# boolean mode +select * from t1 where MATCH(a,b) AGAINST("+tutorial +VÃÆ·WÄ°" IN BOOLEAN MODE); +select * from t1 where MATCH(a,b) AGAINST("+dbms" IN BOOLEAN MODE); +select * from t1 where MATCH(a,b) AGAINST("+Mysql +(tricks never)" IN BOOLEAN MODE); +select * from t1 where MATCH(a,b) AGAINST("+mysql -(tricks never)" IN BOOLEAN MODE) ORDER BY id; +select *, MATCH(a,b) AGAINST("mysql VÃÆ·WÄ°" IN BOOLEAN MODE) as x from t1 ORDER BY id; +# Innodb:Assert eval0eval.c line 148 +#select * from t1 where MATCH a,b AGAINST ("+database* +VÃÆ·WÄ°*" IN BOOLEAN MODE); +select * from t1 where MATCH a,b AGAINST ('"security mysql"' IN BOOLEAN MODE); + +# query expansion +select * from t1 where MATCH(a,b) AGAINST ("VÃÆ·WÄ°" WITH QUERY EXPANSION) ORDER BY id; + + +# insert for proximity search +INSERT INTO t1 (a,b) VALUES ('test query expansion','for database ...'); +# Insert into table with similar word of different distances +INSERT INTO t1 (a,b) VALUES + ('test proximity search, test, proximity and phrase', + 'search, with proximity innodb'); + +INSERT INTO t1 (a,b) VALUES + ('test proximity fts search, test, proximity and phrase', + 'search, with proximity innodb'); + +INSERT INTO t1 (a,b) VALUES + ('test more proximity fts search, test, more proximity and phrase', + 'search, with proximity innodb'); + +# This should only return the first document +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"proximity search"@2' IN BOOLEAN MODE); + +# This would return no document +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"proximity search"@1' IN BOOLEAN MODE); + +# This give you all three documents +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"proximity search"@3' IN BOOLEAN MODE) ORDER BY id; + +# Similar boundary testing for the words +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"test proximity"@5' IN BOOLEAN MODE) ORDER BY id; + +# Test with more word The last document will return, please notice there +# is no ordering requirement for proximity search. +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"more test proximity"@2' IN BOOLEAN MODE); + +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"more test proximity"@3' IN BOOLEAN MODE); + +# The phrase search will not require exact word ordering +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"more fts proximity"@03' IN BOOLEAN MODE); + + +UPDATE t1 SET a = UPPER(a) , b = UPPER(b) ; +UPDATE t1 SET a = UPPER(a) , b = LOWER(b) ; + +select * from t1 where MATCH(a,b) AGAINST("+tutorial +dbms" IN BOOLEAN MODE); +select * from t1 where MATCH(a,b) AGAINST("+VÃÆ·WÄ°" IN BOOLEAN MODE); + +SELECT * FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id; + +DELETE FROM t1 WHERE MATCH (a,b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); +DELETE FROM t1 WHERE MATCH (a,b) AGAINST ('"proximity search"@14' IN BOOLEAN MODE); + + +SELECT * FROM t1 WHERE MATCH (a,b) + AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE); + +SELECT * FROM t1 ORDER BY id; + +DROP TABLE t1; +eval SET GLOBAL innodb_file_per_table=$innodb_file_per_table_orig; + +#------------------------------------------------------------------------------ +# FTS index with utf8 character testcase +#------------------------------------------------------------------------------ + +# Create FTS table +EVAL CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) CHARACTER SET = utf8, ENGINE=InnoDB; + + +# Insert rows from different languages +INSERT INTO t1 (a,b) VALUES +('Я могу еÑÑ‚ÑŒ Ñтекло', 'оно мне не вредит'), +('Мога да Ñм Ñтъкло', 'то не ми вреди'), +('ΜποÏῶ νὰ φάω σπασμένα' ,'γυαλιὰ χωÏὶς νὰ πάθω τίποτα'), +('PříliÅ¡ žluÅ¥ouÄký kůň', 'úpÄ›l Äábelské kódy'), +('Sævör grét', 'áðan því úlpan var ónýt'), +('ã†ã‚ã®ãŠãã‚„ã¾','ã‘ãµã“ãˆã¦'), +('ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹','ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš'); + +# insert english text +INSERT INTO t1 (a,b) VALUES + ('MySQL Tutorial','request docteam@oraclehelp.com ...') , + ('Trial version','query performace @1255 minute on 2.1Hz Memory 2GB...') , + ('when To Use MySQL Well','for free faq mail@xyz.com ...'); + +# Create the FTS index again +CREATE FULLTEXT INDEX idx on t1 (a,b); + +# FTS Queries +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("вредит χωÏὶς") ORDER BY id; +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("оно" WITH QUERY EXPANSION); + +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("вред*" IN BOOLEAN MODE) ORDER BY id; +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+γυαλιὰ +tutorial" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+tutorial +(Мога τίποτα)" IN BOOLEAN MODE); + +# Innodb:error - no result returned (update result of query once fixed) (innodb limit , does not understand character boundry for japanses like charcter set) +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš"); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã¡ã‚Šã¬ã‚‹" WITH QUERY EXPANSION); + +# Innodb:error - no result returned (update result of query once fixed) (innodb limit , does not understand character boundry for japanses like charcter set) +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("+ã‚ã•ãゆã‚ã¿ã˜ã€€+ã‚‘ã²ã‚‚ã›ãš" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("ã†ã‚ã®ãŠã*" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE); + +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"γυαλιὰ χωÏὶς"@2' IN BOOLEAN MODE); + +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"query performace"@02' IN BOOLEAN MODE); + +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"πάθω τίποτα"@2' IN BOOLEAN MODE); + +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"@1' IN BOOLEAN MODE); + +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"@2' IN BOOLEAN MODE); + +ALTER TABLE t1 DROP INDEX idx; +# Create the FTS index again +CREATE FULLTEXT INDEX idx on t1 (a,b); + +# Innodb:error - no result returned (update result of query once fixed) (innodb limit , does not understand character boundry for japanses like charcter set) +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"); +# Update fails because where condition do not succeed which is incorrect (update result of query once fixed) +UPDATE t1 SET a = "Pchnąć w tÄ™ łódź jeża" , b = "lub osiem skrzyÅ„ fig" WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ ã‚‘ã²ã‚‚ã›ãš"); +UPDATE t1 SET a = "Ð’ чащах юга жил-был цитруÑ? Да", b = "но фальшивый ÑкземплÑÑ€! Ñ‘ÑŠ" WHERE MATCH(a,b) AGAINST ("вред*" IN BOOLEAN MODE); +DELETE FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE); + +# Innodb error - no result returned +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš"); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("łódź osiem"); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("вред*" IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("фальшив*" IN BOOLEAN MODE) ORDER BY id; +SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE); + +SELECT * FROM t1 + WHERE MATCH (a,b) + AGAINST ('"łódź jeża"@2' IN BOOLEAN MODE); + +SELECT * FROM t1 ORDER BY id; +DROP TABLE t1; + +# This is to test the update operation on FTS indexed and non-indexed +# column +CREATE TABLE t1(ID INT PRIMARY KEY, + no_fts_field VARCHAR(10), + fts_field VARCHAR(10), + FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; + +INSERT INTO t1 VALUES (1, 'AAA', 'BBB'); + +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); + +# Update FULLTEXT indexed column, Doc ID will be updated +UPDATE t1 SET fts_field='anychange' where id = 1; + +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); + +# Update non-FULLTEXT indexed column, Doc ID stay to be the same +UPDATE t1 SET no_fts_field='anychange' where id = 1; + +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); + +# Update both FULLTEXT indexed and non-indexed column, Doc ID will be updated +UPDATE t1 SET no_fts_field='anychange', fts_field='other' where id = 1; + +SELECT * FROM t1 WHERE MATCH(fts_field) against("other"); + +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); + +# FTS index dropped, the DOC_ID column is kept, however, the ID will not +# change +DROP INDEX f on t1; + +UPDATE t1 SET fts_field='anychange' where id = 1; + +UPDATE t1 SET no_fts_field='anychange' where id = 1; + +UPDATE t1 SET no_fts_field='anychange', fts_field='other' where id = 1; + +CREATE FULLTEXT INDEX f ON t1(FTS_FIELD); + +SELECT * FROM t1 WHERE MATCH(fts_field) against("other"); + +DROP TABLE t1; + +# Test on user supplied 'FTS_DOC_ID' +CREATE TABLE t1(`FTS_DOC_ID` serial, + no_fts_field VARCHAR(10), + fts_field VARCHAR(10), + FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; + +INSERT INTO t1 VALUES (1, 'AAA', 'BBB'); + +# Doc ID must be updated as well (HA_FTS_INVALID_DOCID). +--error 182 +UPDATE t1 SET fts_field='anychange' where FTS_DOC_ID = 1; + +UPDATE t1 SET fts_field='anychange', FTS_DOC_ID = 2 where FTS_DOC_ID = 1; + +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); + +# "BBB" should be marked as deleted. +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); + +UPDATE t1 SET no_fts_field='anychange' where FTS_DOC_ID = 2; + +SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange"); + +# "HA_FTS_INVALID_DOCID" +--error 182 +UPDATE t1 SET no_fts_field='anychange', fts_field='other' where FTS_DOC_ID = 2; + +SELECT * FROM t1 WHERE MATCH(fts_field) against("other"); + +# Doc ID must be monotonically increase (HA_FTS_INVALID_DOCID) +--error 182 +UPDATE t1 SET FTS_DOC_ID = 1 where FTS_DOC_ID = 2; + +DROP INDEX f ON t1; + +# After FULLTEXT index dropped, we can update the fields freely +UPDATE t1 SET fts_field='newchange' where FTS_DOC_ID = 2; + +UPDATE t1 SET no_fts_field='anychange' where FTS_DOC_ID = 2; + +SELECT * FROM t1; + +DROP TABLE t1; + +CREATE TABLE t1(ID INT PRIMARY KEY, + no_fts_field VARCHAR(10), + fts_field VARCHAR(10), + FULLTEXT INDEX f(fts_field), index k(fts_field)) ENGINE=INNODB; + +CREATE TABLE t2(ID INT PRIMARY KEY, + no_fts_field VARCHAR(10), + fts_field VARCHAR(10), + FULLTEXT INDEX f(fts_field), + INDEX k2(fts_field), + FOREIGN KEY(fts_field) REFERENCES + t1(fts_field) ON UPDATE CASCADE) ENGINE=INNODB; + +INSERT INTO t1 VALUES (1, 'AAA', 'BBB'); + +INSERT INTO t2 VALUES (1, 'AAA', 'BBB'); + +update t1 set fts_field='newchange' where id =1; + +SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB"); +SELECT * FROM t2 WHERE MATCH(fts_field) against("BBB"); +SELECT * FROM t1 WHERE MATCH(fts_field) against("newchange"); +SELECT * FROM t2 WHERE MATCH(fts_field) against("newchange"); + +DROP TABLE t2; + +DROP TABLE t1; + +# Testcases adopted from innodb_multi_update.test + +CREATE TABLE t1(id INT PRIMARY KEY, + fts_field VARCHAR(10), + FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; + + +CREATE TABLE t2(id INT PRIMARY KEY, + fts_field VARCHAR(10), + FULLTEXT INDEX f(fts_field)) ENGINE=INNODB; + +INSERT INTO t1 values (1,'100'),(2,'200'),(3,'300'),(4,'400'),(5,'500'),(6,'600'), (7,'700'),(8,'800'),(9,'900'),(10,'1000'),(11,'1100'),(12,'1200'); +INSERT INTO t2 values (1,'100'),(2,'200'),(3,'300'),(4,'400'),(5,'500'),(6,'600'), (7,'700'),(8,'800'); + +UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'foo'); + +UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'foo') WHERE t1.fts_field = "100foo"; + +# Update two tables in the same statement +UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'xoo'), t2.fts_field = CONCAT(t1.fts_field, 'xoo') where t1.fts_field=CONCAT(t2.fts_field, 'foo'); + +# Following selects shows whether the correct Doc ID are updated + +# This row should present in table t1 +SELECT * FROM t1 WHERE MATCH(fts_field) against("100foofoo"); + +# Following rows should be dropped +SELECT * FROM t1 WHERE MATCH(fts_field) against("100foo"); +SELECT * FROM t1 WHERE MATCH(fts_field) against("100"); + +# This row should present in table t2 +SELECT * FROM t2 WHERE MATCH(fts_field) against("400fooxoo"); +SELECT * FROM t2 WHERE MATCH(fts_field) against("100"); + +# Follow rows should be marked as dropped +SELECT * FROM t2 WHERE MATCH(fts_field) against("200"); +SELECT * FROM t2 WHERE MATCH(fts_field) against("400"); + + +DROP TABLE t1; + +DROP TABLE t2; + + +--echo +--echo BUG#13701973/64274: MYSQL THREAD WAS SUSPENDED WHEN EXECUTE UPDATE QUERY +--echo +# FTS setup did not track which tables it had already looked at to see whether +# they need initialization. Hilarity ensued when hitting circular dependencies. + +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; + +CREATE TABLE t1 ( + t1_id INT(10) UNSIGNED NOT NULL, + t2_id INT(10) UNSIGNED DEFAULT NULL, + PRIMARY KEY (t1_id), + FOREIGN KEY (t2_id) REFERENCES t2 (t2_id) + ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB; + +CREATE TABLE t2 ( + t1_id INT(10) UNSIGNED NOT NULL, + t2_id INT(10) UNSIGNED NOT NULL, + t3_id INT(10) UNSIGNED NOT NULL, + t4_id INT(10) UNSIGNED NOT NULL, + PRIMARY KEY (t2_id), + FOREIGN KEY (t1_id) REFERENCES t1 (t1_id), + FOREIGN KEY (t3_id) REFERENCES t3 (t3_id) + ON DELETE CASCADE ON UPDATE CASCADE, + FOREIGN KEY (t4_id) REFERENCES t4 (t4_id) +) ENGINE=InnoDB; + +CREATE TABLE t3 ( + t3_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + payload char(3), + PRIMARY KEY (t3_id) +) ENGINE=InnoDB; + +INSERT INTO t3 VALUES (1, '100'); + +CREATE TABLE t4 ( + t2_id INT(10) UNSIGNED DEFAULT NULL, + t4_id INT(10) UNSIGNED NOT NULL, + PRIMARY KEY (t4_id), + FOREIGN KEY (t2_id) REFERENCES t2 (t2_id) + ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB; + +SET FOREIGN_KEY_CHECKS=1; + +UPDATE t3 SET payload='101' WHERE t3_id=1; + +SET FOREIGN_KEY_CHECKS=0; + +DROP TABLE t1; +DROP TABLE t2; +DROP TABLE t3; +DROP TABLE t4; + +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/misc_debug.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc_debug.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/misc_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/misc_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -23,8 +23,14 @@ # The newly create dict_index_t should be removed from fts cache SET @saved_debug_dbug = @@SESSION.debug_dbug; SET SESSION debug_dbug="+d,ib_dict_create_index_tree_fail"; +if ($MTR_COMBINATION_ORIG) { --error ER_OUT_OF_RESOURCES CREATE FULLTEXT INDEX idx ON articles(body); +} +if (!$MTR_COMBINATION_ORIG) { +--error ER_CANT_CREATE_TABLE +CREATE FULLTEXT INDEX idx ON articles(body); +} SET SESSION debug_dbug=@saved_debug_dbug; # This simply go through ha_innobase::commit_inplace_alter_table @@ -37,8 +43,14 @@ CREATE TABLE t (a INT, b TEXT) engine=innodb; SET debug_dbug='+d,alter_table_rollback_new_index'; +if ($MTR_COMBINATION_ORIG) { -- error ER_UNKNOWN_ERROR ALTER TABLE t ADD FULLTEXT INDEX (b(64)); +} +if (!$MTR_COMBINATION_ORIG) { +-- error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t ADD FULLTEXT INDEX (b(64)), ALGORITHM=INPLACE; +} SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t; @@ -57,6 +69,7 @@ DROP TABLE t2, t1; SET SESSION debug_dbug=@saved_debug_dbug; +if ($MTR_COMBINATION_ORIG) { --echo # --echo # MDEV-25200 Index count mismatch due to aborted FULLTEXT INDEX --echo # @@ -82,6 +95,7 @@ CHECK TABLE t1; DROP TABLE t1; --source include/wait_until_count_sessions.inc +} --echo # --echo # MDEV-25663 Double free of transaction during TRUNCATE @@ -104,6 +118,7 @@ DROP TABLE t1; --echo # End of 10.3 tests +if ($MTR_COMBINATION_ORIG) { # Fulltext fails in commit phase CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100))ENGINE=InnoDB; @@ -115,3 +130,4 @@ --error ER_TABLESPACE_DISCARDED ALTER TABLE t1 ADD FULLTEXT(f2); DROP TABLE t1; +} diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/opt.opt mariadb-10.11.9/mysql-test/suite/innodb_fts/t/opt.opt --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/opt.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/opt.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--query_cache_type=0 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/opt.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/opt.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/opt.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/opt.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,1086 @@ +--source include/have_innodb.inc + +# +# Tests for optimizations for InnoDB fulltext search (WL#6043) +# + +CREATE TABLE wp( + FTS_DOC_ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + title VARCHAR(255) NOT NULL DEFAULT '', + text MEDIUMTEXT NOT NULL, + dummy INTEGER, + PRIMARY KEY (FTS_DOC_ID), + UNIQUE KEY FTS_DOC_ID_INDEX (FTS_DOC_ID), + FULLTEXT KEY idx (title,text) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +INSERT INTO wp (title, text) VALUES + ('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL','In the following database to database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'); + +CREATE TABLE t1 (i INTEGER); +INSERT INTO t1 SELECT FTS_DOC_ID FROM wp; + +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE t1; +SET STATEMENT use_stat_tables=never FOR +ANALYZE TABLE wp; + +--disable_ps2_protocol + +# +# Show results of MATCH expressions for reference +# +SELECT FTS_DOC_ID, title, MATCH(title, text) AGAINST ('database') AS score1, + MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp; + +# +# Test that filesort is not used if ordering on same match expression +# as where clause +# +--echo No sorting for this query +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC; + +SHOW SESSION STATUS LIKE 'Sort%'; + +--echo No sorting for this query even if MATCH is part of an expression +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') > 0.1 +ORDER BY score DESC; + +SHOW SESSION STATUS LIKE 'Sort%'; + +--echo No sorting even if there are several MATCH expressions as long as the +--echo right one is used in ORDER BY +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score1, + MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score1 DESC; + +SHOW SESSION STATUS LIKE 'Sort%'; + +--echo No Sorting since FT table is first table in query +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp, t1 +WHERE MATCH(title, text) AGAINST ('database') AND FTS_DOC_ID = t1.i +ORDER BY score DESC; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +--echo Sorting since there is no WHERE clause +FLUSH STATUS; + +--sorted_result +SELECT MATCH(title, text) AGAINST ('database'), title AS score +FROM wp +ORDER BY score DESC; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +--echo Sorting since ordering on multiple columns +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC, FTS_DOC_ID; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +--echo Sorting since ordering is not descending +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score ASC; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +--echo Sorting because one is ordering on a different MATCH expression +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('mysql') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +# +# Tests for ORDER BY/LIMIT optimzation +# +--echo No sorting for this query +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; + +SHOW SESSION STATUS LIKE 'Sort%'; + +--echo Revert to table scan and sorting for this query since not +--echo enough matching rows to satisfy LIMIT clause +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; + +SHOW SESSION STATUS LIKE 'Handler_read%'; +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +--echo Sorting since no LIMIT clause +FLUSH STATUS; + +--sorted_result +SELECT MATCH(title, text) AGAINST ('database') AS score, title +FROM wp +ORDER BY score DESC; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +--echo Sorting since there is a WHERE clause +FLUSH STATUS; + +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE dummy IS NULL +ORDER BY score DESC LIMIT 2; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +--echo Sorting since ordering is not on a simple MATCH expressions +FLUSH STATUS; + +SELECT title, (MATCH(title, text) AGAINST ('database')) * 100 AS score +FROM wp +ORDER BY score DESC LIMIT 2; + +SHOW SESSION STATUS LIKE 'Sort_rows%'; + +# +# Test that there is no row accesses if all necessary information is +# available in FTS result +# +--echo No ordinary handler accesses when only accessing FTS_DOC_ID and MATCH +FLUSH STATUS; + +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); + +SHOW SESSION STATUS LIKE 'Handler_read%'; + +--echo Still no handler accesses when adding FTS_DOC_ID to WHERE clause +FLUSH STATUS; + +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') AND FTS_DOC_ID > 2; + +SHOW SESSION STATUS LIKE 'Handler_read%'; + +--echo Still no handler accesses when ordering by MATCH expression +FLUSH STATUS; + +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score; + +SHOW SESSION STATUS LIKE 'Handler_read%'; + +--echo Optimization is disabled when ordering on FTS_DOC_ID +FLUSH STATUS; + +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY 1 DESC; + +SHOW SESSION STATUS LIKE 'Handler_read%'; + +--echo Optimization also work with several MATCH expressions +FLUSH STATUS; + +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score1, + MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); + +SHOW SESSION STATUS LIKE 'Handler_read%'; + +--echo Optimization does not apply if sorting on a different MATCH expressions +--echo from the one used to access the +FLUSH STATUS; + +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score1, + MATCH(title, text) AGAINST ('mysql') AS score2 +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score2 DESC; + +SHOW SESSION STATUS LIKE 'Handler_read%'; + +FLUSH STATUS; + +--echo Optimization does not apply for GROUP BY +SET @save_mode = @@sql_mode; +SET sql_mode = (select replace(@@sql_mode,'ONLY_FULL_GROUP_BY','')); +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +GROUP BY score; + +SHOW SESSION STATUS LIKE 'Handler_read%'; +SET sql_mode = @save_mode; + +# +# Putting all three optimizations together +# +--echo No sorting and no table access with LIMIT clause and only information +--echo from FTS result +FLUSH STATUS; + +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; + +SHOW STATUS LIKE 'Handler_read%'; +SHOW SESSION STATUS LIKE 'Sort%'; + +# +# Count optimization +# +let $query = +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); + +--echo If count optimization applies, EXPLAIN shows +--echo "Select tables optimized away." +eval EXPLAIN $query; +FLUSH STATUS; +eval $query; +--echo Verify that there was no table access +SHOW STATUS LIKE 'Handler_read%'; + +let $query = +SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); + +--echo Optimization applies also to COUNT(expr) as long as expr is not nullable +eval EXPLAIN $query; +eval $query; + +let $query = +SELECT count(*) +FROM wp, t1 +WHERE MATCH(title, text) AGAINST ('database'); + +--echo Optimization does not apply if not a single table query. +eval EXPLAIN $query; +eval $query; + +let $query = +SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE) > 0; + +--echo Optimization does not apply if MATCH is part of an expression +eval EXPLAIN $query; +eval $query; + +let $query = +SELECT COUNT(title) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE) > 0; + +--echo Optimization does not apply if MATCH is part of an expression +eval EXPLAIN $query; +eval $query; + +let $query = +SELECT COUNT(dummy) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); + +--echo Optimization does not apply if COUNT expression is nullable +eval EXPLAIN $query; +eval $query; + +# +# Verify that the queries optimized for InnoDB works with QUERY EXPANSION +# + +# Query will also avoid sorting when query expansion is used +FLUSH STATUS; +--sorted_result +SELECT MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score, +title +FROM wp +WHERE MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) +ORDER BY score DESC; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check ORDER BY/LIMIT query with no WHERE clause +FLUSH STATUS; +SELECT title, + MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score +FROM wp +ORDER BY score DESC LIMIT 2; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check query where FTS result is "covering" +FLUSH STATUS; +SELECT FTS_DOC_ID docid, + MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); +SHOW SESSION STATUS LIKE 'Handler_read%'; + +# Check the combination of all three +FLUSH STATUS; +SELECT FTS_DOC_ID docid, + MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) AS score +FROM wp +ORDER BY score DESC LIMIT 2; +SHOW STATUS LIKE 'Handler_read%'; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check the count optimization +let $query = +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' WITH QUERY EXPANSION); +eval EXPLAIN $query; +FLUSH STATUS; +eval $query; +SHOW STATUS LIKE 'Handler_read%'; + +# +# Verify that the queries optimized for InnoDB works with BOOLEAN MODE +# + +# Query will also avoid sorting when Boolean mode is used +FLUSH STATUS; +--sorted_result +SELECT MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) score, +title +FROM wp +WHERE MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) +ORDER BY score DESC; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check ORDER BY/LIMIT query with no WHERE clause +FLUSH STATUS; +--sorted_result +SELECT MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) score, +title +FROM wp +ORDER BY score DESC; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check query where FTS result is "covering" +FLUSH STATUS; +SELECT FTS_DOC_ID docid, + MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('+MySQL -database'); +SHOW SESSION STATUS LIKE 'Handler_read%'; + +# Check the combination of all three +FLUSH STATUS; +SELECT FTS_DOC_ID docid, + MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +ORDER BY score DESC LIMIT 1; +SHOW STATUS LIKE 'Handler_read%'; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check the count optimization +let $query = +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('+MySQL -database' IN BOOLEAN MODE); +eval EXPLAIN $query; +FLUSH STATUS; +eval $query; +SHOW STATUS LIKE 'Handler_read%'; + + +# +# Verify that the queries optimized for InnoDB works with +# BOOLEAN proximity search +# + +# Query will also avoid sorting when Boolean mode is used +FLUSH STATUS; +SELECT title, + MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) +ORDER BY score DESC; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check ORDER BY/LIMIT query with no WHERE clause +FLUSH STATUS; +SELECT title, + MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +ORDER BY score DESC LIMIT 1; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check query where FTS result is "covering" +FLUSH STATUS; +SELECT FTS_DOC_ID docid, + MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('"MySQL database"@5'); +SHOW SESSION STATUS LIKE 'Handler_read%'; + +# Check the combination of all three +FLUSH STATUS; +SELECT FTS_DOC_ID docid, + MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) AS score +FROM wp +ORDER BY score DESC LIMIT 1; +SHOW STATUS LIKE 'Handler_read%'; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check the count optimization +let $query = +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE); +eval EXPLAIN $query; +FLUSH STATUS; +eval $query; +SHOW STATUS LIKE 'Handler_read%'; + +# +# Check that nothing goes wrong when combining different modes +# +SELECT title, + MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database' WITH QUERY EXPANSION) +ORDER BY score DESC, title ASC; + +SELECT title, + MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('MySQL database' WITH QUERY EXPANSION) +ORDER BY score DESC, title ASC; + +SELECT title, + MATCH(title, text) AGAINST ('+MySQL -database' IN BOOLEAN MODE) AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('"MySQL database"@5' IN BOOLEAN MODE) +ORDER BY score DESC, title ASC; + + +# +# Verify that the queries optimized for InnoDB still works with MyISAM +# +ALTER TABLE wp ENGINE=myisam; + +# Check avoid sorting query +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database') +ORDER BY score DESC; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check ORDER BY/LIMIT query with no WHERE clause +FLUSH STATUS; +SELECT title, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check query where FTS result is "covering" +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +WHERE MATCH(title, text) AGAINST ('database'); +SHOW SESSION STATUS LIKE 'Handler_read%'; + +# Check the combination of all three +FLUSH STATUS; +SELECT FTS_DOC_ID docid, MATCH(title, text) AGAINST ('database') AS score +FROM wp +ORDER BY score DESC LIMIT 2; +SHOW STATUS LIKE 'Handler_read%'; +SHOW SESSION STATUS LIKE 'Sort%'; + +# Check the count optimization +let $query = +SELECT COUNT(*) +FROM wp +WHERE MATCH(title,text) AGAINST ('database' IN NATURAL LANGUAGE MODE); +eval EXPLAIN $query; +FLUSH STATUS; +eval $query; +SHOW STATUS LIKE 'Handler_read%'; + + +DROP TABLE wp, t1; + +--enable_ps2_protocol + +# Tests for FT hints. + +CREATE TABLE t1 +( + FTS_DOC_ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + title VARCHAR(255) DEFAULT '', + text MEDIUMTEXT , + PRIMARY KEY (FTS_DOC_ID), + UNIQUE KEY FTS_DOC_ID_INDEX (FTS_DOC_ID), + FULLTEXT KEY ft_idx (title,text) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; + + +INSERT INTO t1 (title, text) VALUES + ('MySQL Tutorial','DBMS stands for MySQL DataBase ...'), + ('How To Use MySQL Well','After you went through a ...'), + ('Optimizing MySQL','In this tutorial we will show ...'), + ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), + ('MySQL vs. YourSQL database','In the following database to database comparison ...'), + ('MySQL Security','When configured properly, MySQL ...'), + ('InnoDB', 'InnoDB is a transaction-safe (ACID compliant) storage engine'), + ('MySQL is a database management system', 'A database is a structured collection of data...'), + ('MySQL databases are relational', 'A relational database stores data in separate tables rather than putting all the data in one big storeroom...'), + ('MySQL software is Open Source', 'Open Source means that it is possible for anyone to use and modify the software...'), + ('The MySQL Database Server is very fast, reliable, scalable, and easy to use', 'MySQL Server can run comfortably on a desktop or laptop...'), + ('MySQL Server works in client/server or embedded systems', 'The MySQL Database Software is a client/server system...'), + ('MyISAM', 'MyISAM is based on the older (and no longer available) ISAM storage engine but has many useful extensions'), + ('A large amount of contributed MySQL software is available', 'MySQL Server has a practical set of features developed in close cooperation with our users'), + (NULL,NULL); + +-- disable_result_log +ANALYZE TABLE t1; +-- enable_result_log + +--echo # No ranking + +EXPLAIN +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE); +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE); + +# Atm opt_sum_query does not support COUNT optimization if +# ORDER BY is present. TODO: fix it. +EXPLAIN +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('data*' IN BOOLEAN MODE) ORDER BY title LIMIT 3; +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('data*' IN BOOLEAN MODE) ORDER BY title LIMIT 3; + +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); + +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION); +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION); + +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE); +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE); + +# check case with 'for' stopword +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+for' IN BOOLEAN MODE); +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+for' IN BOOLEAN MODE); + + +--echo # No sorting by rank + +EXPLAIN SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY title; +SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY title; + +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE); + +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title; +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title; + +EXPLAIN +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title; +SELECT FTS_DOC_ID, title FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title; + +--echo # LIMIT optimization + +EXPLAIN SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +LIMIT 3; +SELECT FTS_DOC_ID, TITLE FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +LIMIT 3; + +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +LIMIT 3; +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +LIMIT 3; + +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +ORDER BY title +LIMIT 3; +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+fast +database' IN BOOLEAN MODE) +ORDER BY title +LIMIT 3; + + +EXPLAIN +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title LIMIT 1; +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) ORDER BY title LIMIT 1; + +EXPLAIN +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title LIMIT 1; +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('"very fast"@3' IN BOOLEAN MODE) ORDER BY title LIMIT 1; + +EXPLAIN +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank, FTS_DOC_ID +LIMIT 3; +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank, FTS_DOC_ID +LIMIT 3; + +EXPLAIN +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank DESC, FTS_DOC_ID ASC +LIMIT 3; +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY rank DESC, FTS_DOC_ID ASC +LIMIT 3; + +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; + +EXPLAIN SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 3; +SELECT FTS_DOC_ID, MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 3; + +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC, +FTS_DOC_ID ASC; +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC, +FTS_DOC_ID ASC; + +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) and FTS_DOC_ID > 1 +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC +LIMIT 2; +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) and FTS_DOC_ID > 1 +ORDER BY MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) DESC +LIMIT 2; + + +EXPLAIN +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank +LIMIT 1; +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank +LIMIT 1; + +EXPLAIN +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank DESC +LIMIT 1; +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY rank DESC +LIMIT 1; + + +EXPLAIN +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +LIMIT 1; +SELECT FTS_DOC_ID,MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) as rank +FROM t1 WHERE MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) +ORDER BY MATCH(title, text) AGAINST ('+very +fast' WITH QUERY EXPANSION) DESC +LIMIT 1; + +--echo # WHERE optimization on MATCH > 'some_rank' + +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) > 0.1; + +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) > 0.1; + + +--echo # additional test for correct behaviour + +EXPLAIN SELECT * FROM t1 ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC LIMIT 10; + +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) AND +MATCH (title, text) AGAINST ('mysql' IN NATURAL LANGUAGE MODE) +LIMIT 6; + +--echo # test OR condition + +SELECT FTS_DOC_ID +FROM t1 +WHERE MATCH(title, text) AGAINST ('database') + OR MATCH(title, text) AGAINST ('mysql') +ORDER BY MATCH(title, text) AGAINST ('database') DESC, FTS_DOC_ID ASC; + +EXPLAIN SELECT FTS_DOC_ID +FROM t1 +WHERE MATCH(title, text) AGAINST ('database') + OR MATCH(title, text) AGAINST ('mysql') +ORDER BY MATCH(title, text) AGAINST ('database') DESC, FTS_DOC_ID ASC; + +--echo # MATCH and GROUP BY, DISTINCT + +SET sql_mode = (select replace(@@sql_mode,'ONLY_FULL_GROUP_BY','')); + +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY FTS_DOC_ID +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY FTS_DOC_ID +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; + +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY title +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; + +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +GROUP BY title +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; + +EXPLAIN SELECT MAX(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +SELECT MAX(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; + +EXPLAIN SELECT DISTINCT(title) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +SELECT DISTINCT(title) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; + +EXPLAIN SELECT DISTINCT(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; +SELECT DISTINCT(FTS_DOC_ID) FROM t1 +WHERE MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) +ORDER BY MATCH (title, text) AGAINST ('fast database' IN NATURAL LANGUAGE MODE) DESC +LIMIT 3; + +SET sql_mode = @save_mode; + +--echo # FTS index access + +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; +EXPLAIN SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) as rank +FROM t1 +ORDER BY rank DESC +LIMIT 2; + +SELECT a.FTS_DOC_ID, b.FTS_DOC_ID +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and + MATCH(b.title, b.text) AGAINST ('+mysql' IN BOOLEAN MODE) and + a.FTS_DOC_ID = b.FTS_DOC_ID; +EXPLAIN SELECT a.FTS_DOC_ID, b.FTS_DOC_ID +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and + MATCH(b.title, b.text) AGAINST ('+mysql' IN BOOLEAN MODE) and + a.FTS_DOC_ID = b.FTS_DOC_ID; + +SELECT a.FTS_DOC_ID, MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE), + b.FTS_DOC_ID, MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE) +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and + MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE); + +EXPLAIN SELECT a.FTS_DOC_ID, MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE), + b.FTS_DOC_ID, MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE) +FROM t1 a, t1 b +WHERE MATCH(a.title, a.text) AGAINST ('+database' IN BOOLEAN MODE) and + MATCH(b.title, b.text) AGAINST ('+database' IN BOOLEAN MODE); + +# Index only access by non-FTS index + +EXPLAIN SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ("data*" IN BOOLEAN MODE) * 100; +SELECT FTS_DOC_ID, MATCH(title, text) AGAINST ("data*" IN BOOLEAN MODE) * 100 +FROM t1 WHERE MATCH(title, text) AGAINST ("data*" IN BOOLEAN MODE) * 100; +# Run query returning null record +SELECT * FROM t1 WHERE title IS NULL AND text IS NULL; + +# More testing of index only access by non-FTS index + +CREATE TABLE t2 SELECT FTS_DOC_ID as doc_id, title, text FROM t1; +ALTER TABLE t2 ADD PRIMARY KEY (doc_id); +ALTER TABLE t2 ADD FULLTEXT KEY ft_idx (title,text); + +-- disable_result_log +ANALYZE TABLE t2; +-- enable_result_log + +# No index access +EXPLAIN SELECT DOC_ID FROM t2 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; +SELECT DOC_ID FROM t2 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; +# Index access +EXPLAIN SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; +SELECT FTS_DOC_ID FROM t1 WHERE MATCH(title, text) AGAINST ('+database' IN BOOLEAN MODE) * 100; + +DROP TABLE t1, t2; + +--echo "Check hints with uft8 charset for 2 cases" +set names utf8; +EVAL CREATE TABLE t1 ( + FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + text TEXT + ) CHARACTER SET = utf8, ENGINE=InnoDB; + +INSERT INTO t1 (title, text) VALUES +('Я могу еÑÑ‚ÑŒ Ñтекло', 'оно мне не вредит'), +('Мога да Ñм Ñтъкло', 'то не ми вреди'), +('ΜποÏῶ νὰ φάω σπασμένα' ,'γυαλιὰ χωÏὶς νὰ πάθω τίποτα'), +('PříliÅ¡ žluÅ¥ouÄký kůň', 'úpÄ›l Äábelské kódy'), +('Sævör grét', 'áðan því úlpan var ónýt'), +('ã†ã‚ã®ãŠãã‚„ã¾','ã‘ãµã“ãˆã¦'), +('ã„ã‚ã¯ã«ã»ã¸ã©ã€€ã¡ã‚Šã¬ã‚‹','ã‚ã•ãゆã‚ã¿ã˜ã€€ã‚‘ã²ã‚‚ã›ãš'); +CREATE FULLTEXT INDEX idx on t1 (title, text); + +--echo # No ranking + +EXPLAIN +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('вредит' IN NATURAL LANGUAGE MODE); +SELECT count(*) FROM t1 WHERE MATCH (title, text) AGAINST ('вредит' IN NATURAL LANGUAGE MODE); + +EXPLAIN +SELECT * FROM t1 WHERE MATCH(title, text) AGAINST ("оно" WITH QUERY EXPANSION); +SELECT * FROM t1 WHERE MATCH(title, text) AGAINST ("оно" WITH QUERY EXPANSION); +--echo # No sorting by rank +EXPLAIN SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+(Мога τίποτα)' IN BOOLEAN MODE); +SELECT FTS_DOC_ID FROM t1 +WHERE MATCH(title, text) AGAINST ('+(Мога τίποτα)' IN BOOLEAN MODE); +DROP TABLE t1; + + +--echo # +--echo # Bug #18924341 CRASH IN TEST_IF_SKIP_SORT_ORDER, GROUP BY MATCH AGAINST DESC +--echo # + +CREATE TABLE t1 (f1 CHAR(1), FULLTEXT KEY (f1)); +SELECT 1 FROM t1 NATURAL JOIN t1 a GROUP BY MATCH(t1.f1) AGAINST ("1") DESC; +DROP TABLE t1; + + +--echo # +--echo # Bug#20261601 ASSERTION FAILED: !FIRST_QEP_TAB->TABLE()->NO_KEYREAD +--echo # + +CREATE TABLE t1(a INT PRIMARY KEY); +INSERT INTO t1 VALUES(1),(2); +--error ER_FT_MATCHING_KEY_NOT_FOUND +SELECT (SELECT MATCH(`a`)AGAINST('1') FROM t1) FROM t1; +SELECT 1, a IN (SELECT a FROM t1) FROM t1; +DROP TABLE t1; + +--echo # +--echo # Bug#20442572 ASSERTION `!FIRST_QEP_TAB->TABLE()->NO_KEYREAD' FAILED. +--echo # Bug#75688 Assertion `!first_qep_tab->table()->no_keyread' failed. +--echo # + +CREATE TABLE t1(a INT,b POINT NOT NULL,KEY(a)); + +HANDLER t1 OPEN; +#--error ER_FT_MATCHING_KEY_NOT_FOUND +select * from t1 where MATCH a,b AGAINST('"Now sUPPort"' IN BOOLEAN MODE); +prepare stmt1 from "truncate t1"; +SELECT a IN(SELECT a FROM t1)FROM t1; + +deallocate prepare stmt1; +DROP TABLE t1; + +--echo # +--echo # Bug #20685427 INVALID WRITE OF FREED MEMORY IN ITEM_FUNC_MATCH::CLEANUP +--echo # + +CREATE TABLE t1(a TEXT CHARSET LATIN1, FULLTEXT KEY(a)) ENGINE=INNODB; +--error ER_FT_MATCHING_KEY_NOT_FOUND +SELECT MATCH(a) AGAINST ('') FROM (SELECT a FROM t1 LIMIT 1) q; +DROP TABLE t1; + +--echo # +--echo # Bug#21140067 EXPLAIN .. MATCH AGAINST: ASSERTION FAILED: TO <= END +--echo # + +CREATE TABLE t1(f1 CHAR(1) CHARSET latin1, FULLTEXT(f1)) ENGINE=INNODB; +EXPLAIN SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEAN MODE); + +EXPLAIN FORMAT = JSON SELECT 1 FROM t1 WHERE 1.238585e+308 <= MATCH(f1) AGAINST ('1' IN BOOLEAN MODE); + +DROP TABLE t1; + +--echo # +--echo # Bug#21140088 MATCH AGAINST: ASSERTION FAILED: !TABLE || (!TABLE->READ_SET || BITMAP_IS_SET +--echo # + +SET sql_mode=''; +CREATE TABLE t1(a INT) ENGINE=INNODB; +CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=INNODB; +INSERT INTO t2 VALUES ('a'),('b'); +--error ER_WRONG_ARGUMENTS +SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1') FROM t1) FROM t2 GROUP BY "a"; +DROP TABLE t1, t2; + +CREATE TABLE t1(a INT) ENGINE=MyISAM; +CREATE TABLE t2(b TEXT CHARSET LATIN1, FULLTEXT(b), PRIMARY KEY(b(10))) ENGINE=MyISAM; +INSERT INTO t2 VALUES ('a'),('b'); +#--error ER_WRONG_ARGUMENTS +SELECT NOT EXISTS (SELECT MATCH(b) AGAINST ('1' in BOOLEAN MODE) FROM t1) FROM t2 GROUP BY "a"; +DROP TABLE t1, t2; + +SET sql_mode=default; + +--echo # +--echo # Bug#21140039 ASSERTION FAILED: !FIRST_QEP_TAB->TABLE()->NO_KEYREAD MATCH AGAINST..... +--echo # + +CREATE TABLE t1 +( + a INT, + b INT, + c CHAR(1) CHARSET latin1, + PRIMARY KEY (b,a), + FULLTEXT KEY (c) +) ENGINE=INNODB; +SELECT "a" NOT IN(SELECT b FROM t1 WHERE MATCH(c) AGAINST ('a' IN BOOLEAN MODE)); +DROP TABLE t1; + +--echo # +--echo # Bug#21300774 ASSERT `!INIT_FTFUNCS(THD, SELECT_LEX)` IN JOIN::RESET AT SQL/SQL_SELECT.CC:874 +--echo # + +CREATE TABLE t1 (f1 INT); +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +CREATE TABLE t2 (ft TEXT, FULLTEXT KEY ft(ft)); +INSERT INTO t2 VALUES ('abc'); +INSERT INTO t2 VALUES ('def'); + +--error ER_SUBQUERY_NO_1_ROW +UPDATE t1 SET f1 = +(SELECT t1.f1 FROM t2 WHERE NOT TRUE AND + MATCH (ft) AGAINST ((SELECT 'xyz' FROM t2))); + +DROP TABLE t1, t2; + +--echo # +--echo # Bug#22679209: FULL-TEXT QUERIES WITH ADDITIONAL SECONDARY INDEX +--echo # GIVES NULL OR ZERO ROWS +--echo # + +CREATE TABLE t1 ( +f1 INTEGER, +title varchar(255), +body mediumtext, +KEY f1 (f1), +FULLTEXT KEY title (title), +FULLTEXT KEY body (body) +) ENGINE=InnoDB; + +INSERT INTO t1 VALUES +(1, 'Insert into table', 'insert into table select from'), +(1, 'Delete from table', 'insert into table select from'), +(1, 'Update', 'perform update'), +(2, 'Insert into table', 'insert into table select from'), +( 2, 'Delete from table', 'some body text here'), +( 2, 'Update', 'perform update'), +( 3, 'Insert into table', 'insert into table select from'), +( 3, 'Delete from table', 'some body text here'); + +SELECT f1 FROM t1 WHERE f1=1 AND +(MATCH (title) AGAINST ('table' IN BOOLEAN MODE) OR +MATCH (body) AGAINST ('table' IN BOOLEAN MODE)); + +DROP TABLE t1; + +--echo # End of test for Bug#22679209 diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/phrase.opt mariadb-10.11.9/mysql-test/suite/innodb_fts/t/phrase.opt --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/phrase.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/phrase.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,2 @@ +--innodb-ft-index-cache +--innodb-ft-index-table diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/phrase.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/phrase.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/phrase.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/phrase.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,39 @@ +-- source include/have_innodb.inc + +# +# BUG#20465273 - FULLTEXT SEARCH BEHAVIOUR WITH MYISAM VS. INNODB (WRONG RESULT WITH INNODB) +# + +CREATE TABLE articles ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + title VARCHAR(200), + body TEXT, + FULLTEXT (title,body) +) ENGINE=InnoDB; + +INSERT INTO articles (title,body) VALUES + (NULL, 'mysql good database'), + (NULL, ' mysql good database'), + ('', 'mysql good database'), + ('', ' mysql good database'), + (' ', 'mysql good database'), + ('mysql', 'good database'), + ('mysql ', 'good database'), + ('mysql', ' good database'), + ('mysql good database', ''), + ('mysql good database', NULL); + + +SET GLOBAL innodb_ft_aux_table="test/articles"; +SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE; +SET GLOBAL innodb_ft_aux_table=default; + +SELECT * FROM articles; + +SELECT * FROM articles WHERE MATCH(title, body) + AGAINST('"mysql good database"' IN BOOLEAN MODE); + +SELECT * FROM articles WHERE MATCH(title, body) + AGAINST('("mysql good database")' IN BOOLEAN MODE); + +DROP TABLE articles; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/result_cache_limit.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/result_cache_limit.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/result_cache_limit.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/result_cache_limit.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,52 @@ +# This is a basic test for innodb fts result cache limit. + +-- source include/have_innodb.inc + +# Must have debug code to use SET SESSION debug +--source include/have_debug.inc + +# Create FTS table +CREATE TABLE t1 ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, + a VARCHAR(200), + b TEXT + ) ENGINE= InnoDB; + +# Create the FTS index again +CREATE FULLTEXT INDEX idx on t1 (a,b); + +# Insert rows +INSERT INTO t1 (a,b) VALUES + ('MySQL from Tutorial','DBMS stands for DataBase ...') , + ('when To Use MySQL Well','After that you went through a ...'), + ('where will Optimizing MySQL','what In this tutorial we will show ...'), + ('MySQL from Tutorial','DBMS stands for DataBase ...') , + ('when To Use MySQL Well','After that you went through a ...'), + ('where will Optimizing MySQL','what In this tutorial we will show ...'), + ('MySQL from Tutorial','DBMS stands for DataBase ...') , + ('when To Use MySQL Well','After that you went through a ...'), + ('where will Optimizing MySQL','what In this tutorial we will show ...'); + +SET @save_limit=@@GLOBAL.innodb_ft_result_cache_limit; +SET @save_dbug=@@debug_dbug; +SET debug_dbug="+d,fts_instrument_result_cache_limit"; + +# Simple term search +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('mysql' IN BOOLEAN MODE); + +# Query expansion +--error 128 +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('mysql' WITH QUERY EXPANSION); + +# Simple phrase search +--error 128 +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database"' IN BOOLEAN MODE); + +# Simple proximity search +--error 128 +SELECT COUNT(*) FROM t1 WHERE MATCH (a,b) AGAINST ('"mysql database" @ 5' IN BOOLEAN MODE); + +SET debug_dbug=@save_dbug; + +DROP TABLE t1; +SET GLOBAL innodb_ft_result_cache_limit=@save_limit; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/savepoint.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/savepoint.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/savepoint.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/savepoint.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,475 @@ +# This is the basic function tests for innodb FTS savepoint + +-- source include/have_innodb.inc + + +CREATE TABLE articles ( + id INT UNSIGNED NOT NULL PRIMARY KEY, + title VARCHAR(200), + FULLTEXT (title) + ) ENGINE= InnoDB; + +# Test Part 1: ROLLBACK TO SAVEPOINT +# Test rollback to savepoint 1(S1,RB1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +ROLLBACK TO SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test rollback to savepoint 2(S1,RB1,S2,RB2) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +ROLLBACK TO SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +ROLLBACK TO SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test rollback to savepoint 3(S1,S2,RB1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +ROLLBACK TO SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test rollback to savepoint 4(S1,S2,RB2,RB1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +ROLLBACK TO SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +ROLLBACK TO SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test Part 2: RELEASE SAVEPOINT +# Test release savepoint 1(S1,RL1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test release savepoint 2(S1,RL1,S2,RL2) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +RELEASE SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test release savepoint 3(S1,S2,RL1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test release savepoint 4(S1,S2,RL2,RL1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +RELEASE SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test Part 3: RELEASE & ROLLBACK TO SAVEPOINT +# Test release & rollback to savepoint 1(S1,RB1,S2,RL2) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +ROLLBACK TO SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +RELEASE SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test release & rollback to savepoint 2(S1,RL1,S2,RB2) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +ROLLBACK TO SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test release & rollback to savepoint 3(S1,S2,RL2,RB1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +RELEASE SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +ROLLBACK TO SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test release & rollback to savepoint 4(S1,S2,RB2,RL1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +ROLLBACK TO SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +COMMIT; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test Part 4: ROLLBACK & SAVEPOINT +# Test rollback 1 +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +ROLLBACK; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test rollback 2(S1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +ROLLBACK; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test rollback 3(S1,RL1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +ROLLBACK; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test rollback 4(S1,RB1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +ROLLBACK TO SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +ROLLBACK; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +# Test rollback 5(S1,S2,RB2,RL1) +TRUNCATE TABLE articles; + +INSERT INTO articles(id, title) VALUES(1, 'mysql'); + +BEGIN; + +INSERT INTO articles(id, title) VALUES(2, 'mysql'); + +SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(3, 'mysql'); + +SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(4, 'mysql'); + +ROLLBACK TO SAVEPOINT sp2; + +INSERT INTO articles(id, title) VALUES(5, 'mysql'); + +RELEASE SAVEPOINT sp1; + +INSERT INTO articles(id, title) VALUES(6, 'mysql'); + +ROLLBACK; + +INSERT INTO articles(id, title) VALUES(7, 'mysql'); + +SELECT * FROM articles WHERE MATCH(title) AGAINST('mysql'); + +DROP TABLE articles; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/subexpr.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/subexpr.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/subexpr.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/subexpr.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,58 @@ +--source include/have_innodb.inc + +--echo # +--echo # Bug #20028323 INNODB FULLTEXT BOOLEAN SEARCH INCORRECTLY HANDLES +--echo # PARENTHESES +--echo # + +CREATE TABLE t1 ( + f1 INT NOT NULL AUTO_INCREMENT, + f2 TEXT NOT NULL, + PRIMARY KEY (f1), + FULLTEXT (f2) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO t1 (f2) VALUES +('Pumpkin soup with cheese bread'), +('Yellow chicken curry'), +('Fresh green vegetables with garlic'); + +SELECT * FROM t1 WHERE MATCH(f2) AGAINST('+pumpkin' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(f2) AGAINST('+cheese' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(f2) AGAINST('+(pumpkin cheese)' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(f2) + AGAINST('+pumpkin +(souffle)' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(f2) + AGAINST('+pumpkin +(souffle tart)' IN BOOLEAN MODE); +SELECT * FROM t1 WHERE MATCH(f2) + AGAINST('+pumpkin +(>souffle souffle $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET debug_dbug = '+d,fts_instrument_sync_debug,fts_write_node_crash'; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_fts/t/sync_ddl.test mariadb-10.11.9/mysql-test/suite/innodb_fts/t/sync_ddl.test --- mariadb-10.11.6/mysql-test/suite/innodb_fts/t/sync_ddl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_fts/t/sync_ddl.test 2024-08-03 07:29:58.000000000 +0000 @@ -182,12 +182,13 @@ ('collation of latin1_bin to make it case sensitive') ; +--enable_info ALTER TABLE t1 DROP COLUMN id1, ADD COLUMN id2 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, DROP INDEX idx1, - ADD FULLTEXT INDEX idx2(value), - ALGORITHM=INPLACE; + ADD FULLTEXT INDEX idx2(value); +--disable_info DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/1.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/1.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/1.result 2024-08-03 07:29:58.000000000 +0000 @@ -433,8 +433,8 @@ gm geometry YES NULL fid int(11) NO NULL DROP TABLE t1; -SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); -ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))) +SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))) AS val; +val POINT(1 4) explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); id select_type table type possible_keys key key_len ref rows filtered Extra @@ -668,11 +668,11 @@ insert into t1 values (ST_pointfromtext('point(1,1)')); ERROR 23000: Column 'fl' cannot be null drop table t1; -select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))); -(ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))) +select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))) AS val; +val POINT(10 10) -select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))); -(ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))) +select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))) AS val; +val POINT(10 10) create table t1 (g GEOMETRY); select * from t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/check_rtree.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/check_rtree.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/check_rtree.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/check_rtree.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,7 +1,5 @@ create table t1 (i int, g geometry not null, spatial index (g))engine=innodb; SET SESSION debug="+d,rtree_test_check_count"; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead insert into t1 values (1, POINT(1,1)); insert into t1 values (1, POINT(1.5,1.5)); insert into t1 values (1, POINT(3,3)); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/gis.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/gis.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/gis.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/gis.result 2024-08-03 07:29:58.000000000 +0000 @@ -434,8 +434,8 @@ gm geometry YES NULL fid int(11) NO NULL DROP TABLE t1; -SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); -ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))) +SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))) AS val; +val POINT(1 4) explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); id select_type table type possible_keys key key_len ref rows filtered Extra @@ -669,11 +669,11 @@ insert into t1 values (ST_pointfromtext('point(1,1)')); ERROR 23000: Column 'fl' cannot be null drop table t1; -select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))); -(ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))) +select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))) AS val; +val POINT(10 10) -select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))); -(ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))) +select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))) AS val; +val POINT(10 10) create table t1 (g GEOMETRY); select * from t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/precise.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/precise.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/precise.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/precise.result 2024-08-03 07:29:58.000000000 +0000 @@ -456,30 +456,26 @@ -1 POLYGON 16.00 SELECT ST_CONTAINS( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')); -ST_CONTAINS( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)')) +GeomFromText('POINT(5 10)')) as geom; +geom 0 SELECT AsText(ST_UNION( GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))); -AsText(ST_UNION( -GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)),((6 6, 6 11, 11 11, 11 6, 6 6)))'), -GeomFromText('POINT(5 10)'))) +GeomFromText('POINT(5 10)'))) as geom; +geom GEOMETRYCOLLECTION(POLYGON((0 0,0 5,5 5,5 0,0 0)),POLYGON((6 6,6 11,11 11,11 6,6 6)),POINT(5 10)) DROP PROCEDURE p1; # # Bug #13833019 ASSERTION `T1->RESULT_RANGE' FAILED IN GCALC_OPERATION_REDUCER::END_COUPLE # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((0 0,9 4,3 3,0 0)),((2 2,2 2,8 8,2 3,2 2)))'), 3)) as geom; +geom POLYGON # # Bug #13832749 HANDLE_FATAL_SIGNAL IN GCALC_FUNCTION::COUNT_INTERNAL # -SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)); -GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) +SELECT GeometryType(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2), (4 4,4 6,6 6,6 4,4 4)), ((9 9,8 1,1 5,9 9)))'),1)) as geom; +geom POLYGON # # Bug#13358363 - ASSERTION: N > 0 && N < SINUSES_CALCULATED*2+1 | GET_N_SINCOS/ADD_EDGE_BUFFER @@ -490,25 +486,19 @@ SELECT ST_WITHIN( LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))); -ST_WITHIN( -LINESTRINGFROMTEXT(' LINESTRING(3 8,9 2,3 8,3 3,7 6,4 7,4 7,8 1) '), -ST_BUFFER(MULTIPOLYGONFROMTEXT(' MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5)),((2 2,2 8,8 8,8 2,2 2),(4 4,4 6,6 6,6 4,4 4)),((0 5,3 5,3 2,1 2,1 1,3 1,3 0,0 0,0 3,2 3,2 4,0 4,0 5))) ') +ST_NUMINTERIORRINGS(POLYGONFROMTEXT('POLYGON((3 5,2 4,2 5,3 5)) ')))) as st; +st 0 SELECT ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))); -ST_DIMENSION(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((3 5,2 5,2 4,3 4,3 5)) '), -ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) +ST_NUMINTERIORRINGS(POLYGONFROMTEXT(' POLYGON((0 0,9 3,4 2,0 0))')))) as st; +st 2 SELECT ST_NUMINTERIORRINGS( ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))); -ST_NUMINTERIORRINGS( -ST_ENVELOPE(ST_BUFFER(MULTIPOLYGONFROMTEXT('MULTIPOLYGON(((3 5,2 5,2 4,3 4,3 5))) '), -SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) +SRID(MULTILINESTRINGFROMTEXT('MULTILINESTRING((2 2,4 2,1 2,2 4,2 2)) '))))) as st; +st 0 SELECT ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))); -ASTEXT(ST_BUFFER(POLYGONFROMTEXT(' POLYGON((9 9,5 2,4 5,9 9))'), -SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) +SRID(GEOMETRYFROMTEXT(' MULTIPOINT(8 4,5 0,7 8,6 9,3 4,7 3,5 5) ')))) as st; +st POLYGON((9 9,5 2,4 5,9 9)) diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rollback.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rollback.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rollback.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rollback.result 2024-08-03 07:29:58.000000000 +0000 @@ -408,8 +408,6 @@ ERROR 23000: Duplicate entry '5' for key 'c' rollback; set session debug="+d,row_mysql_crash_if_error"; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead update t1 set a=point(5,5), b=point(5,5), c=5 where i < 3; ERROR HY000: Lost connection to server during query insert into t1 values(5, point(5,5), point(5,5), 5); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_add_index.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_add_index.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_add_index.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_add_index.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,4 @@ -CREATE TABLE t1 (g MULTIPOINT NOT NULL) ENGINE=InnoDB; +CREATE TABLE t1 (g MULTIPOINT NOT NULL) ENGINE=InnoDB STATS_PERSISTENT=0; INSERT INTO t1 VALUES (''); connect purge_control,localhost,root; START TRANSACTION WITH CONSISTENT SNAPSHOT; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_compress.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_compress.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_compress.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_compress.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,6 @@ -create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb ROW_FORMAT=COMPRESSED; +create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb ROW_FORMAT=COMPRESSED STATS_PERSISTENT=0; +lock tables t1 write; +start transaction; insert into t1 values(1, Point(1,1)); insert into t1 values(2, Point(2,2)); insert into t1 values(3, Point(3,3)); @@ -18,6 +20,8 @@ insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; +commit; +unlock tables; start transaction; insert into t1 select * from t1; select count(*) from t1; @@ -40,8 +44,6 @@ 0 SET @saved_dbug = @@SESSION.debug_dbug; SET DEBUG='+d,page_copy_rec_list_start_compress_fail'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead delete from t1; select count(*) from t1 where MBRWithin(t1.c2, @g1); count(*) diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_create_inplace.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_create_inplace.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_create_inplace.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_create_inplace.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,22 +1,17 @@ CREATE TABLE t1 (c1 INT, c2 GEOMETRY NOT NULL, c3 GEOMETRY NOT NULL) ENGINE=INNODB; -INSERT INTO t1 VALUES(1, Point(1,1), ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))')); -INSERT INTO t1 VALUES(2, Point(2,2), ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))')); -INSERT INTO t1 VALUES(3, Point(3,3), ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))')); -INSERT INTO t1 VALUES(4, Point(4,4), ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))')); -INSERT INTO t1 VALUES(5, Point(5,5), ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))')); -INSERT INTO t1 VALUES(6, Point(6,6), ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))')); -INSERT INTO t1 VALUES(7, Point(7,7), ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))')); -INSERT INTO t1 VALUES(8, Point(8,8), ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))')); -INSERT INTO t1 VALUES(9, Point(9,9), ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))')); -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; +CREATE TEMPORARY TABLE t LIKE t1; +INSERT INTO t VALUES +(1, Point(1,1), ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))')), +(2, Point(2,2), ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))')), +(3, Point(3,3), ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))')), +(4, Point(4,4), ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))')), +(5, Point(5,5), ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))')), +(6, Point(6,6), ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))')), +(7, Point(7,7), ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))')), +(8, Point(8,8), ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))')), +(9, Point(9,9), ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))')); +INSERT INTO t1 SELECT t.* FROM t, seq_1_to_512; +DROP TEMPORARY TABLE t; CREATE SPATIAL INDEX idx ON t1(c2); SELECT COUNT(*) FROM t1; COUNT(*) @@ -30,8 +25,7 @@ COUNT(*) 0 ALTER TABLE t1 DROP INDEX idx, ADD SPATIAL INDEX idx3(c2); -SET SESSION debug="+d,row_merge_instrument_log_check_flush"; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead +SET debug_dbug='+d,row_merge_instrument_log_check_flush'; ALTER TABLE t1 DROP INDEX idx3, ADD SPATIAL INDEX idx4(c2), ADD SPATIAL INDEX idx5(c3); +ALTER TABLE t1 FORCE; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_purge.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_purge.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ create table t ( b point not null,d point not null, spatial key (d),spatial key (b) -) engine=innodb; +) engine=innodb stats_persistent=0; InnoDB 0 transactions not purged drop table t; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_undo.result mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_undo.result --- mariadb-10.11.6/mysql-test/suite/innodb_gis/r/rtree_undo.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/r/rtree_undo.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ p INT NOT NULL AUTO_INCREMENT, g LINESTRING NOT NULL, PRIMARY KEY(p) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; ALTER TABLE t1 ADD INDEX prefix_idx (g(767)); INSERT INTO t1(g) VALUES(ST_linefromtext('linestring(-5 -576,0 -576,0 -571,0 -571,5 -568,6 -564,6 -565,6 -563)')); INSERT INTO t1(g) VALUES(ST_linefromtext(concat('linestring','(18 106,19 106,24 111,27 108,32 104,37 107,42 107,44 112,44 116,40 118,43 114,46 114,42 118,44 123,45 123,49 123,53 119,50 123,50 124,54 126,58 125,59 126,64 127,65 127,69 131,74 132,75 135,78 139,2078 141,2075 143,2077 143,2079 143,2084 143,2085 147,2090 -1853,2086 -1852,2086 -1856,2089 -1852,2093 -1850,2090 -1851,2090 -1852,2091 -1851,2092 -1850,2097 -1847,2102 -1848,2100 -1852,2100 -1852,7100 -1851,7103 -1850,7104 -1847,7109 -1842,65 127,67 131,66 131,61 132,61 133,62 137,65 1137,2065 1135,2061 1135,2064 1135,5064 1135,5066 1135,5070 1136,5070 1141,5071 1138,5074 1141,5075 1141,5074 1137,5076 1137,5071 1139,5066 1142,5065 2142,5068 2147,5073 2151,5069 2156,5071 2157,5072 2162,5074 2165,5069 2169,5072 2169,5076 2173,5074 2169,5078 2169,5076 2170,76 2175,74 2179,75 2184,80 2188,83 2190,87 2189,84 2193,87 2189,86 2190,87 2195,87 2200,87 1200,85 1202,86 1199,87 1200,87 1201,91 1206,92 1204,94 1204,98 1206,102 1208,105 1211,102 1216,105 1220,109 1224,110 1224,114 1225,117 1224,118 1229,117 1232,122 1237,123 1236,120 1235,124 1237,121 1236,122 1240,126 1244,127 1246,126 1249,125 5249,123 5251,127 5251,131 5251,135 5256,138 5257,135 5257,139 5257,138 5258,141 5260,146 5260,146 5260,143 10260,147 10265,151 10270,156 10266,157 10269,162 10273,166 12273,168 12274,163 12270,168 12275,170 12277,170 12277,-3830 12277,-3825 12277,-3824 12278,-3825 12276,-3825 12278,-3822 12277,-3825 12275,-3829 12278,-3828 12275,-3824 12280,-3827 12280,-3826 12282,-3822 12283,-3822 12286,-3820 12288,-3818 12289,-3816 12294,-3817 12297,-3819 12300,-3816 12297,-3813 12295,-3811 12299,-3811 12297,-3806 12298,-3806 12298,-3804 12301,-3801 12306,-3803 17306,-3803 17306,-3798 17306,-3803 17310,-3801 17314,-3798 17317,-3797 17317,-797 17321,-797 17323,-796 17325,-793 17326,-792 17322,-789 17327,-784 17331,-780 17335,-776 17339,-774 17339,-771 17342,-770 17345,-765 17348,-765 17349,-763 17353,-760 17350,-760 22350,-756 22346,-752 22349,-748 22352,-752 22348,-748 22347,-746 22345,-745 27345,-743 27346,257 27350,260 27349,261 27352,266 27348,266 22348,269 22347,271 22347,272 22347,273 22348,273 22352,278 22348,279 22344,282 22345,282 22342,283 22347,283 22347,288 22349,292 22347,292 22348,293 22348,298 22348,303 22351,306 22352,309 22352,308 22354,310 22356,311 22361,311 22358,311 22360,311 22360,315 22356,320 22358,325 22363,326 22366,321 22371,318 22373,318 22375,314 22375,316 22375,321 22376,321 22376,322 22372,32 104,36 109,40 114,40 113,40 117,44 119,49 123,49 126,49 129,53 133,50 137,50 139,49 137,48 138,43 138,42 139,46 142,46 138,41 139,45 141,4045 5141,4045 5146,4042 5147,4043 10147,4041 10150,4042 10152,4045 10152,4041 10156,4041 10152,4041 10152,4046 10153,4049 10156,4046 10155,4051 10157,4055 10159,4055 10160,4056 10161,4055 10166,4054 10169,4054 10172,4054 15172,4051 15176,4047 15177,4049 15174,4047 15176,4047 15176,4046 15177,4046 15180,4043 15184,4043 15187,4038 15190,4040 15194,4040 15199,4045 15196,4047 15197,4050 15200,4050 15204,4050 15208,4047 15212,4047 15215,4049 15216,4046 15218,4042 15223,4042 15228,4042 15232,4047 15235,4050 15236,4050 15239,4051 15243,4053 15243,4050 17243,4052 17243,4052 18243,4057 18247,4061 18249,4064 18249,4067 20249,4067 20250,4067 20255,4066 20259,4066 20259,4067 20255,4069 20256,4071 20258,4072 20254,4067 20257,4067 20260,4069 20265,4065 20267,4069 20266,4070 20267,4071 20264,4074 20259,4070 20264,4073 20260,4074 20263,4077 20268,4082 20271,4084 20273,4084 20277,4081 18277,4085 18279,4086 18276,4087 18273,4087 18275,4092 18277,4093 18279,4093 18280,4095 18280,4091 18283,4092 18281,4094 18283,4090 18287,4094 18287,138 5257,138 5255,138 5258,-1862 5254,-1860 5256,-1856 5258,-1851 5255,-1850 5260,-1847 5260,-1847 5263,-1847 5258,-1850 5257,-1850 5259,-1851 5257,-1855 5258,-1853 5261,-1849 5261,-1849 5258,-1849 5259,-1845 5264,-1847 5264,-1850 5268,-1852 5266,-1853 5270,-1856 5265,-1852 5262,-1847 5263,-1842 5263,-1842 5260,-1842 5265,-1841 5265,-1844 5265,-1842 5270,-1837 5274,-1838 5279,-1843 5275,-1842 5280,-1838 5281,-1838 5285,-1833 5285,-1828 5288,-1824 5289,-1828 5291,-1831 5291,-1826 5291,-1830 5293,-1826 5296,-1822 5301,-1826 5302,-1826 5302,-1826 5302,-1825 5297,-1820 5299,-1816 5303,-1816 5299,-3811 12299,-3809 12302,-3806 12302,-3806 12302,-3803 12304,-3798 12304,-3797 12304,-3793 12306,-3788 12306,-3783 12309,-3816 12294,-3811 12299,-3809 12297,7100 -1851,7098 -1854,7102 -1854,7107 -1856,7107 -1858,7110 -1854,7110 -1851,7113 -1851,7115 -1851,7120 -1851,7123 -1847,7124 -1852,7125 -1852,7127 -1852,7131 -1852,7129 1148,7129 1145,7133 1150,7137 1148,7138 1147,7143 1149,7147 1154,8147 1155,8152 3155,8147 3157,8143 3158,8144 3160,8144 3164,11144 3167,11146 3167,11148 3163,11152 3161,11148 3159,11149 3163,11150 3161,11151 3166,11154 3171,11154 3170,8144 3160,8144 3163,8144 3166,8145 3166,8146 3171,8146 3174,8144 3174,8144 3174,8145 3176,8141 3180,3141 3182,7141 3183,7141 7183,7136 7185,7136 7185,7133 7187,7136 7187,7131 7190,7136 7194,7137 7197,7141 7196,7139 7199,12139 7200,12143 7200,12143 7199,12144 7203,12145 7200,12141 7200,12136 7195,12136 7191,12137 7191,12137 7196,12139 7197,12140 7197,12137 7201,12140 7204,12140 7209,12143 7209,12145 7210,12147 7214,12148 9214,12152 9218,12149 9218,12149 9221,12149 9220,12150 9222,12153 10222,12153 10226,12156 10227,12159 10223,12160 10220,12161 10225,12161 10227,12163 10224,12163 10223,12158 10224,12158 10227,12158 10231,12155 12231,12157 12226,7136 7185,7139 7189,7139 7189,7139 7188,7137 7191,7139 7191,7140 7189,7143 7191,7144 7189,7144 7190,7149 7193,7152 7194,7154 7198,7153 7203,7148 7207,12148 7209,12146 7209,12145 7213,12140 7217,12139 7219,12141 7219,12138 7218,12143 7218,13143 7220,13140 7224,13142 7228,13137 7231,13142 7235,13146 7239,13149 7243,13148 7247,13150 7248,13155 7249,13155 7253,13155 7253,13155 7258,13157 7260,13162 7255,13159 7255,13163 7258,13164 7258,13164 7263,13167 7264,13167 8264,13165 8265,13169 8265,13171 13265,13175 13261,13176 13259,13176 13259,13180 13262,13181 13262,13183 13262,13188 13265,13191 13267,13191 13265,13194 13267,13191 13269,13192 13264,13196 13269,13198 13272,13200 13272,13202 13270,13207 11270,13211 11270,13211 11273,13213 11274,13217 11275,13222 11276,13222 11272,13226 11274,13231 11277,13233 11282,13236 11284,13238 11284,13236 11286,13236 11288,13236 11283,13236 11284,13238 11289,13241 11292,13244 11292,13245 11289,13241 11294,13244 11298,13249 11301,320 22358,324 24358,328 24358,327 24363,326 24359,327 24361,329 24365,334 24367,-666 24367,-670 24368,49 123,46 127,46 129,49 131,49 136,47 135,45 138,3045 135,3042 138,3044 139,3044 144,3049 144,3053 142,3055 137,3058 136,3053 139,3048 142,7048 138,7048 3138,7048 3139,7048 3140,7050 3145,7053 1145,7050 1146,7053 5146,7048 5150,7047 5146,10047 5147,10043 5147,10047 5147,10050 5152,10052 5155,10054 5156,10056 5157,10056 5159,10058 5162,10062 5164,10062 5169,10066 9169,10068 9168,10063 9164,10063 9169,10061 9171,14061 9172,14061 9174,282 22342,287 22347,288 22347,288 22343,285 22339,280 22338,278 22341,279 25341,284 25343,13241 11294,13246 11296,13243 11296,13244 11291,13245 11291,13244 11291,13246 11295,13251 11300,13253 11305,13253 11306,13258 11305,13255 11306,13256 11309,13256 11311,13261 11307,13265 11303,13267 11305,13270 11301,13275 11298,13271 11300,15271 11302,15276 11306,15279 11303,15284 11305,15286 11305,15289 11307,15290 11302,15292 11305,15296 11309,15297 11313,15298 11316,15300 11317,15304 11320,15306 11324,15306 11320,15307 11320,15312 11320,15313 11319,15317 11317,15315 11321,15317 11323,15317 11328,15319 11333,15322 11336,15322 11337,15322 11337,15324 11341,15324 11345,15325 14345,15328 13345,17328 13346,17333 13349,17337 13354,17338 13358,17342 13358,17346 13353,17348 13353,17345 13353,17348 13354,17347 13354,17347 13354,17347 13355,22347 13358,22349 13355,22351 13355,22356 13354,22358 13354,22361 13355,22362 13355,22358 13355,22359 13359,22364 13364,22369 13369,22372 13373,22376 13371,22377 13371,22377 13369,22381 13374,22386 13379,22387 13376,22387 13380,22392 13378,22390 13374,22392 13378,22391 13378,22391 13375,22392 13378,22390 13380,22393 13382,22398 13387,22398 10387,22402 10391,22399 10392,22400 10392,22400 10394,22404 10391,22403 15391,22405 15392,22407 15392,22412 15387,22412 15390,22412 15394,22408 15396,26408 15398,26407 20398,26411 20402,26415 20406,26417 20411,26420 20407,26422 20407,31422 16407,31421 16405,31421 16410,31423 16410,31426 16414,31426 16410,31430 16415,31430 16418,31435 16419,31437 16420,31438 16422,31438 16425,31438 16425,31441 16427,31439 16431,31441 16436,36441 16436,36443 18436,36442 18437,36440 18440,36440 18436,36440 18440,36442 18445,36443 18446,36447 18451,37447 23451,37452 23456,37456 23455,37458 23459,37456 23461,37458 23463,37460 23466,37464 23469,37460 23474,37462 23476,37461 26476,37466 26479,37470 26483,37471 26488,37474 26489,37474 26485,37474 26483,37474 26488,37470 26492,37474 26497,37474 26499,37478 26495,37483 26499,37483 26501,37488 26496,37491 26499,37495 26495,37500 26496,37500 26497,37500 26501,37497 26499,37497 26499,37495 26504,37498 26504,37494 26509,37497 26514,37495 26515,37498 26514,37503 26514,37508 26512,37510 26516,37511 26519,37509 26523,37506 26528,37507 26532,37512 26536,37513 26538,37510 26542,37512 26544,37517 26543,37522 26546,37527 26551,37525 26555,37529 26558,37524 26563,37524 26562,37527 26562,37522 26562,37522 26559,37526 26561,37522 26559,37523 26561,37523 26556,37524 26558,40524 26560,40524 26563,40521 26567,40525 26566,40527 26568,40532 26572,40534 26569,40533 26565,40531 26565,40535 26569,40535 26570,40539 26572,40544 26575,40543 26575,40544 26579,40548 26584,40549 26581,40553 26585,40556 26590,40552 22590,40557 22594,40556 22595,40561 22592,40561 22593,40565 22593,40568 22593,40573 22588,40570 22590,40570 22591,40570 22588,40573 22590,40573 22593,40568 22593,40567 22597,40567 22599,40571 22599,40574 22600,40574 22604,42574 22607,42577 22607,42577 22612,42579 22616,38579 22619,38580 22617,38580 22614,38575 22619,38579 22619,38579 18619,38582 18614,38582 18617,38586 18622,38590 18625,38590 18622,38594 18621,38596 18616,38597 18614,38597 18618,38600 21618,38601 21618,38605 21620,38607 25620,38611 25620,38608 25617,38608 25621,38608 25625,38611 25623,38615 25623,38615 25620,38616 25622,38619 25624,38620 25625,38620 26625,38623 26627,38623 26627,311 22358,311 22359,-1689 22360,2311 27360,2312 27360,2312 27360,2317 27362,2317 27362,2319 27359,2319 27364,2318 27359,2321 27364,2326 27367,2325 27371,2326 27373,2326 27373,2325 27377,2329 27377,2327 27377,2330 27379,2333 27379,2331 27379,2331 27381,2336 27381,6336 27382,6336 27383,40527 26568,40531 26572,40533 26574,40538 26576,40533 26580,40538 26585,40539 26588,40536 26583,40540 26587,40539 26588,40535 26593,40540 26594,40544 26597,40548 26602,40548 26601,40549 26602,40547 26602,40548 26603,40553 26606,40548 26606,40548 26603,40551 26608,40556 26612,40559 26616,40554 26619,40556 26619,40556 26623,42556 26623,42556 26624,42560 26624,42562 26626,42563 26630,42564 26630,42564 26634,42559 26635,42562 26635,42565 26637,42562 26638,42564 26642,42564 26641,42568 26641,42572 26641,42572 29641,42574 29642,39574 29641,39574 34641,39576 34643,39581 34638,39578 34638,39574 34642,39574 34645,39572 35645,34572 35648,34577 35651,39577 35655,43577 35659,43580 35655,43575 35658,43578 35658,43581 35662,43577 39662,43572 39658,43572 39661,43572 39664,43572 39666,43576 39670,43577 39667,43580 39671,43576 39673,43573 39673,43574 39677,43569 39679,43567 39679,43568 39683,43563 39686,43566 39690,43566 39692,43568 39694,43568 39695,41568 39691,41570 39692,41571 39692,41571 39693,41571 39698,41571 39698,41574 39698,41569 39698,41570 39699,41570 39704,41572 39709,41573 39712,41578 39713,41579 39717,41584 39719,41585 39720,-1850 5268,-1845 5268,-1847 5266,-1842 5268,-1840 5263,-1845 5264,-1843 5264,-1839 8264,-1839 8267,-1839 8272,-1838 8276,-1834 8273,-1834 8273,-1833 8274,-1837 8279,-1836 8283,-1834 8286,-1836 8282,-1834 8279,-1835 8279,-1834 8280,-1836 8283,-1841 8288,-1846 8289,-1843 8286,-1838 8286,-1841 8285,-1838 8285,-1834 8288,-1829 8291,-1825 8286,-1825 8289,-1825 8287,-1824 8291,-1822 8294,-1821 8298,-1818 8300,-1818 8296,-1814 8296,-1811 8295,-1808 8292,1192 8296,1192 8297,1195 11297,1192 11301,1195 11305,1197 11300,1193 11300,1193 11296,1193 11293,1194 11294,1199 11292,1204 11292,1205 11294,1210 11292,1208 11288,1204 11290,1205 11289,1207 8289,1202 8284,1204 8282,1204 8281,1206 8281,1208 8281,1212 8283,1212 13283,1213 13287,1213 13290,1216 13293,1214 13289,1217 13286,1212 13291,1208 13288,1208 13292,1209 13297,1208 13296,1204 13298,1205 13303,1209 13308,1204 13308,1209 13304,1210 13304,1214 13309,1214 13314,1215 13314,1219 13314,1219 13319,1224 13320,1229 13321,1232 13325,1233 13329,1231 13329,1234 13334,-2766 13336,-2769 13337,-2765 13340,-2762 13345,-2760 13342,2240 13342,2238 13342,2242 13342,2246 13345,2246 13346,2244 13348,2239 13348,2240 13351,2240 13352,2245 13357,2248 13357,2243 13362,2247 13362,2248 13362,2252 13363,2256 13363,2256 13363,2260 13367,2255 13372,2251 13369,2251 13369,2252 13372,2249 13376,2254 13378,2255 13382,2259 13379,2262 13379,2267 13381,2262 13381,2262 13383,2265 13383,2269 13385,2270 13386,2271 13389,2267 13391,2271 13386,2275 13391,2273 13392,2275 13387,2277 13390,2274 13390,2275 13394,2280 13395,2280 11395,2281 14395,2279 14400,2277 14403,2273 14406,2274 16406,2274 16410,2279 16410,2284 16411,2280 16409,2280 16409,2282 16409,2282 16411,2282 16412,2280 16413,3280 16418,3284 16418,3285 16423,3289 16423,3292 16427,3294 16429,3296 16431,3297 16436,3298 16435,3303 16435,3305 16434,3305 16436,3305 16436,3309 16437,3309 16438,3308 16439,3308 16439,3306 16444,3302 16441,-1698 16437,-1703 16438,-1699 16438,-1697 16438,-1698 16439,-1695 16436,-1690 16441,-1687 16446,-1683 16450,-1682 16451,-1684 16453,-1682 16457,-1682 16457,-1686 16460,-1681 16459,-1680 16456,-1677 16460,-1681 16461,-1679 16464,-1674 16465,-1673 16469,-1669 16471,-1669 16476,-1665 16474,-1665 16478,-1664 16478,-1664 16479,-1661 16474,-1656 16471,-1655 11471,-1660 11473,-1663 11475,-1666 11480,3334 15480,3338 15476,3342 15471,3345 15471,3345 15470,3350 15469,3347 15474,3351 15476,3352 15473,3353 15476,3350 15477,3350 15479,3351 15482,3352 15484,3351 15487,3353 15487,3358 15487,3353 15486,1217 13286,1222 13291,1222 13291,1225 13286,1229 13286,1231 13281,1235 13280,1236 13281,1241 13282,1245 13285,1247 13285,1247 13287,1250 13287,1247 13290,1247 13295,1247 13298,1252 13301,1249 13304,1252 13304,3252 13304,3247 13304,3249 13308,3254 13308,3257 13308,3261 17308,3261 17309,3261 17306,3259 17305,3262 17310,3263 17308,3262 17311,3259 17314,3259 17314,3257 17309,3254 17309,3253 17309,3255 17310,3253 17312,3255 17312,3255 17312,3256 17307,3257 17307,3256 17311,3256 17313,3255 17317,3251 17317,3248 17321,3253 17325,3256 17326,3258 17324,3258 17327,3263 17322,7263 17325,7265 17328,7263 17330,7265 17333,7270 17333,7273 17333,7278 17336,4278 21336,4278 21340,4279 21340,4281 21340,4286 24340,4290 24343,9290 24347,9294 24349,9296 24347,9298 25347,9301 25348,9301 25348,9304 25353,9303 25357,9303 25352,11303 25355,11304 25358,11307 25358,11312 25358,11312 25361,11310 25365,11313 25365,11314 25369,11319 25371,11321 25371,11325 25366,11329 25365,11330 25366,11329 25370,11330 25365,11334 25367,11338 25366,11343 25363,11348 25359,11345 25356,11348 25357,11349 25358,11349 25358,11352 25360,11356 30360,11360 30365,11360 30365,11362 30365,11367 30367,11368 30369,15368 30370,15373 30371,15376 30373,14376 30378,14377 30383,14381 30378,14386 30380,14388 30382,14391 30385,14393 31385,16393 31389,16396 31394,16396 31397,16392 31400,16395 31405,16398 31409,16398 31413,16397 31415,16396 31417,16401 31418,16401 31422,16402 31419,16407 31420,16411 31419,16406 31423,18406 31427,18411 31432,18415 28432,18417 28437,18418 28441,18414 28438,18417 28435,18416 28439,18420 28442,18423 28447,18427 28444,21427 28445,21428 28450,22428 28455,22432 28457,22436 28458,22441 28458,22445 28463,22448 28468,22451 28465,22456 28468,22453 28468,22458 28471,22463 28473,22460 28475,22459 28472,22463 28476,22464 28472,22468 28468,22468 28471,25468 28466,25471 28468,25473 28464,25473 28464,25475 29464,25476 29466,25479 29461,25476 29462,25476 29464,25478 29464,25483 29461,25484 29460,25486 29458,25486 29462,25490 29460,25495 26460,25498 26463,25495 26468,25495 26472,25495 26472,25499 26474,25504 26476,25504 26478,25509 26476,25513 26479,25514 26481,25519 26477,25519 26480,25518 26481,25519 26484,25524 26483,25527 26484,25522 26484,25526 26487,25528 26492,25533 26496,25535 26498,25535 26498,25539 26503,25542 26504,25543 26505,25547 26510,25552 26510,25551 26508,25550 26512,25553 26510,25557 26510,25554 26511,25552 26508,25556 26505,25556 26506,25560 26506,25560 26507,25560 26506,25565 26501,25567 26504,25569 26504,25568 26508,25571 26508,25571 26511,25576 26511,25581 26516,25581 26519,25582 26521,25585 26522,25588 26527,25588 26526,25584 26530,25587 26534,25589 26529,25593 26533,25598 26538,25599 26540,25599 26540,25599 26540,25604 26543,25603 26543,25603 26538,25606 26538,25609 26540,25611 26542,25612 26547,25612 26547,25612 26548,25617 25548,25612 25548,25613 25547,25616 25545,25616 25549,25618 25551,25620 25555,25620 25551,25622 25550,25625 25551,25622 25555,25619 25557,25617 25556,25622 28556,25625 28551,25630 28546,25634 28548,25639 28553,25643 28553,25638 25553,25634 25553,25634 25557,25639 25557,25643 25558,25644 25553,25646 25556,25647 25560,25650 25562,25650 30562,25650 30562,25650 30564,25650 30566,25652 30570,25656 30571,25661 31571,25662 31575,25663 31579,25662 31579,25665 31581,25666 31584,25671 31582,25674 31581,25674 31584,25676 31584,25673 31587,25678 31586,25679 31581,30679 31584,30675 31589,30680 31590,35680 31590,35675 31589,35677 31591,35680 31590,35681 31587,35684 31588,35685 31589,35689 31592,35689 31593,35692 31597,35696 31597,35700 34597,35699 34599,35703 34604,35703 34606,35702 34601,35705 34603,35705 34606,35708 34603,35713 34604,35717 34603,35719 34608,35715 34608,35711 34608,35713 34609,35714 34605,35714 34610,35714 34614,35718 34616,35719 34617,35722 34618,35722 34621,35725 34625,35725 34626,35725 34629,35725 34631,35725 34635,35730 34636,35727 34638,35731 34640,35735 34642,35739 34645,35741 34645,35742 34649,35738 34649,35738 34645,35741 34647,38741 34650,38741 37650,38742 37646,38746 37651,38749 37652,38753 37653,38753 37657,38757 37656,38756 37660,38761 37660,38765 37660,38760 37660,38759 37660,38760 41660,38760 41660,38762 41665,38757 41667,43757 41669,43752 41674,43752 41677,43757 41672,43758 41677,45758 41680,45758 41679,45762 41683,45765 41683,45769 41683,45770 41684,45768 46684,45773 46688,45776 46692,45774 46694,45775 46697,45778 46695,45776 46698,45774 46702,45779 46702,45784 46704,45787 46706,45791 46711,45786 46707,45790 46711,45793 46715,45796 46719,45799 46724,45797 46728,45802 46726,45797 46729,45801 46733,45802 46733,45803 46732,45804 46732,45805 46732,45808 46735,45810 46740,45810 46744,2326 27373,2322 27377,2323 27379,2325 27383,2325 27382,2322 27382,2323 27382,5323 23382,5325 23385,5329 23386,5330 23390,5335 23392,5330 23392,5330 23395,5329 23395,5333 23399,5333 23402,5338 23405,5339 23405,5334 23406,5329 23401,5332 23403,5330 23407,5333 23409,5328 20409,5324 20411,5324 20414,5329 20416,5328 20421,5325 20421,5329 20424,5330 20424,5335 21424,5331 21427,5333 21431,5334 21433,5329 21434,5330 21437,5333 21440,5338 21437,5338 21440,5334 21441,5333 21438,5329 26438,5332 26435,5335 26439,5337 26440,5338 26444,5342 26439,5342 26442,5345 26440,5349 26438,5352 26442,5349 26445,5348 30445,5350 30447,5350 30444,5354 30444,5359 30443,5363 30445,5367 30446,5367 30448,5367 30453,5371 30455,5371 30453,5373 30458,5375 30461,5380 30463,5384 30463,5383 30459,5384 30459,5383 30459,5385 30460,5390 30459,5392 30464,5394 30464,5389 30465,5393 30469,5391 30469,5391 30469,5395 30474,5396 30470,5399 30470,5401 30467,5401 30468,5404 30470,5400 30465,5401 30462,5403 30467,5404 30467,5409 30469,5412 30473,5412 30477,5407 30481,8407 30486,8408 30489,8410 30490,8410 30489,8413 30490,8414 30493,8414 30496,8419 30501,8420 30502,8415 30507,13415 30509,13411 30506,13414 30507,13412 30511,13412 30515,13417 30518,13419 30523,13418 30527,13422 30529,13418 30531,13413 35531,13409 35531,13413 35532,13417 35537,13419 35533,13423 35529,13424 35529,13423 35524,13428 35525,13433 35526,13438 35530,13443 35531,13448 35531,13452 35532,13455 35536,13457 35536,13452 35536,13455 35539,13452 35535,13457 35540,13457 35544,18457 35546,18460 35547,22460 35546,22465 35550,22466 35554,22468 35552,22473 35555,22471 35559,22470 35564,22472 35564,22470 35569,22474 35569,22474 35571,22477 35573,22482 35576,22487 35580,22488 35583,22489 35585,22493 35585,22496 35585,25496 35586,25493 35582,25494 35585,25498 35585,25496 35585,25498 35587,25503 35591,25503 35593,25499 35590,25499 35591,25495 35591,26495 35595,29495 35591,29495 35593,29498 35597,29498 35601,29500 35606,29501 30606,29502 30603,29505 30603,29510 30606,29511 30606,29514 30607,29516 30610,29518 30608,3259 17305,3263 17304,3267 17303,3271 17308,3269 17312,3269 17313,3274 17315,3277 17315,3282 17311,3285 17313,3283 17309,3278 17310,3275 17315,3275 17317,3276 17322,3280 17324,3280 17324,3276 17325,3277 17325,3276 17328,3278 17324,3273 17329,3277 17331,3280 17326,3281 17328,3276 17324,3277 17324,3277 17322,3277 17321,3277 17321,3281 17323,3282 17327,3282 17332,3287 17335,3288 17335,3288 17338,3290 17337,3294 17340,3294 17341,3299 17341,3299 12341,3299 12342,3304 12339,3301 14339,3305 14340,3307 14341,3311 14343,3313 14343,3314 16343,3310 16341,3310 16346,3312 16348,3311 16349,4311 16346,4316 16348,4321 16344,4324 16348,4322 16349,4323 16346,4323 16346,4326 16350,4322 16354,4323 16356,4325 16361,4325 16358,4322 16362,4325 20362,4325 20366,4322 20367,4326 20372,4326 20374,4331 20373,4333 20373,4338 20376,4339 20379,4341 20382,4338 20384,4339 20386,4340 20383,4340 20383,4335 20388,4336 20390,4341 20390,4346 20391,4348 20391,4349 20393,37497 26499,37494 26496,37496 26500,37496 26501,37499 26506,37497 26502,37498 26502,37500 29502,37500 29507,37505 29508,37506 33508,37508 33513,37513 33518,37517 33522,37516 33520,37521 33521,37521 33525,37516 33530,37519 33528,37520 33528,37524 33530,37527 33530,37525 33527,37528 33530,37533 33533,37534 38533,37536 38536,22358 13355,25358 13360,25361 13358,25362 13362,25362 13362,25365 13365,25363 13367,25359 13369,25357 13374,25360 13374,2247 13362,2252 13366,2254 13363,2257 13363,2261 13358,2264 13354,2264 13356,2269 13361,2272 13363,2274 13363,2275 13363,2273 13362,2274 13365,2278 13365,2280 13370,2284 13366,2284 13365,2289 13368,2290 13366,2293 13368,2298 13373,2298 13372,2295 13375,271 22347,273 22350,4273 22347,4269 22348,4270 22350,4271 22355,4272 22360,4276 22363,4281 22365,4284 24365,4279 24365,4282 24365,4285 24365,4287 24364,4289 24362,4294 24360,4295 24362,4298 24365,4301 24369,1301 24370,1301 24371,1305 24375,1305 24376,1307 24377,1312 24380,1314 24382,1318 24380,1316 24382,1316 24387,1318 24387,1318 29387,1321 29387,1316 29383,1320 29386,1321 29389,1326 29389,1327 29389,2327 29394,2327 29394,2332 29393,-666 24367,-663 24368,-661 24368,-656 24371,-653 24372,-649 24372,-647 24374,-643 24370,-638 24375,-635 24380,-638 24382,-638 24384,-638 24384,-636 24388,-637 24390,-632 24386,-630 24386,-629 24386,371 24389,376 24394,374 24392,377 24397,3377 24400,6377 24405,6378 24408,6373 24406,6370 24406,6375 24403,6370 24403,6375 24403,6379 24406,6374 24409,6378 24411,6380 24412,6378 24415,6378 24419,6383 24423,6385 24425,6387 24428,6390 24433,6386 24430,6386 24435,6387 24436,6388 24440,6387 24444,6383 29444,6383 29447,6386 29451,6382 29446,6387 29447,6390 29452,6393 29452,6397 29455,6400 29459,6400 29463,6397 29467,6393 29467,6395 29470,6397 29473,6399 29468,6394 29467,6397 29470,6396 29473,6396 29470,6393 29465,6389 29469,6390 29470,6389 29465,6389 29468,6392 29470,6388 33470,6390 33466,6391 33466,6392 33467,6394 33467,322 22372,322 22374,323 22377,327 22378,331 22382,330 22383,332 22386,333 22383,331 22383,330 22387,332 22391,332 22396,337 22397,339 22394,340 22399,340 22398,340 22396,343 22396,343 22396,341 22400,342 22404,343 22402,348 22403,345 22407,347 22411,342 22411,345 22413,340 22417,345 22417,348 22422,348 22426,351 22427,352 22432,352 22436,4352 22438,4353 22442,4354 22444,4354 22447,4357 22449,4360 22450,4364 22450,4367 22451,4369 22453,4366 22455,4369 22453,4373 22458,4377 22459,4380 22459,4380 22464,4385 22467,4385 22467,4390 22469,4385 22469,4385 22472,25571 26508,25574 26507,25578 26512,25581 26512,25581 26512,25583 26508,25583 26513,25587 26516,25589 26515,25590 26515,25591 26517,25589 26520,25587 26522,23587 26526,23585 26531,23589 26534,23592 26538,24592 26543,24588 26545,24593 26547,24598 26543,24598 26548,24602 26545,24598 26540,24600 26545,24600 26548,24600 31548,24605 31549,24608 31551,24613 31552,24615 36552,24616 36557,24619 36557,24622 36560,24622 36564,24627 35564,24627 35569,24632 35569,25632 35570,25635 35569,25636 35573,25636 35573,25638 35576,25641 35580,25641 35583,25641 35588,25642 40588,20642 40593,20645 40593,20650 40595,20651 40591,20651 40594,20648 40591,20648 40591,20652 40596,20652 40596,20656 40597,20656 40600,20656 40601,20659 40598,20662 40597,20662 40597,20663 40600,20668 40601,20665 40606,1215 13314,1214 13319,1212 13317,1209 13312,1210 13312,1211 13317,6211 13320,6214 13320,6216 13320,6211 13323,6214 13318,6214 13323,6214 13324,6216 13319,6219 13323,6218 13321,6219 13321,6218 13326,6221 13329,6225 13331,6230 13335,6231 13339,6231 13343,6235 13338,6234 13342,6234 13344,6236 13345,25524 26483,25521 26484,25524 26489,25527 26487,25529 26484,25530 26482,25534 27482,25539 27486,25537 27488,25541 27483,25544 27486,25547 27490,25550 27491,25550 27491,25554 27486,25559 27486,25563 27489,25561 27489,25563 27493,25561 27491,25563 27493,25563 27495,25564 27497,25563 27497,25563 27497,25558 27498,25563 27499,25565 27503,25567 27503,25569 27503,25567 27504,25565 27505,25565 27505,25565 27505,25566 27505,25570 27501,25570 27497,25574 27498,25570 32498,25570 32501,25573 32501,25576 32497,25576 32498,25577 32501,25579 32503,25583 32504,25588 32507,25592 32512,25596 32507,25599 32507,25594 32503,25597 32506,25597 32510,25594 32509,25594 32510,25596 32513,25592 32513,25594 32515,25594 32520,25598 32520,25602 32517,25603 32518,27603 32520,27607 32523,27608 31523,27613 31527,27615 31527,30615 31530,30617 31530,30618 31532,30619 31536,30623 31537,30623 31538,30625 31538,30626 31541,30627 31541,30624 31540,30623 31540,30624 31545,34624 31546,34619 31543,34623 31545,34624 31549,34624 31548,34626 31550,34626 31555,34626 31551,34628 31555,34633 31555,34636 31559,34634 31564,34636 31564,34639 31562,34639 31560,36639 31555,36636 27555,41636 27557,41640 27554,41644 27558,41647 27559,41648 27555,41653 27555,41658 27555,41658 27552,41658 27552,41660 27550,41656 27554,41661 27558,41664 27561,41667 27566,41662 27562,41663 27563,41663 27565,41662 27569,41661 27569,41664 27571,41664 27567,41659 30567,41660 30565,41660 30561,41665 30566,41664 30561,41664 30561,41664 30562,41664 30563,41660 30558,1312 24380,4312 25380,4315 25384,4315 25385,4319 25383,4322 25388,6322 25387,6322 25387,6326 25392,6321 25397,6324 25397,6324 25401,6319 25404,9319 25405,9314 25400,9312 25402,9310 25403,9313 25403,9313 25403,9316 25400,9319 25401,4319 25396,8319 25398,8315 25400,8315 25396,8315 25397,8311 25398,8307 25394,8309 25394,8311 25397,8315 25402,8310 25403,11310 25365,11311 25365,11316 25370,11320 25375,11325 25375,11325 25380,11325 25382,11326 25378,14326 25380,14328 25382,14331 25383,14334 25385,14336 25386,19336 25386,19336 25389,19332 25390,19332 25391,19335 25388,19338 25391,19342 25393,19340 25393,19345 25396,19345 25394,19347 25394,19349 25393,19351 25397,19350 25398,19348 25399,19349 25403,19352 25399,19350 25402,19354 25400,19353 25405,23353 25402,23354 25402,23356 25405,23358 25409,23360 25413,23363 25414,23367 25412,23365 25411,23367 25414,23363 25413,23367 25416,23367 25416,23370 25418,24370 25414,24370 25419,24373 27419,24378 27419,24380 27416,24380 27412,24380 27410,24380 27406,24376 27406,24374 27410,24370 27414,24370 27415,24371 27420,24375 27415,24378 27411,24375 27415,24378 27418,24382 27421,24383 27426,24383 27425,24385 27430,24390 27431,24394 27432,24395 27436,24399 30436,24400 30439,24404 30443,24403 30439,24406 30438,24410 30442,24406 30446,24408 30445,24403 30445,24408 30442,24412 30446,24416 30446,24416 30449,19416 30449,19416 30447,19418 30452,19420 30453,19423 30458,15423 30462,15423 30464,15425 30466,16425 30467,16424 30471,16421 30474,16426 30474,16428 30476,16428 30476,16424 30474,16424 33474,16425 33474,16427 33477,16425 33479,16426 33477,16422 33480,16425 33482,16430 33479,16430 33478,16429 33482,16424 33482,16427 33484,16430 33488,16431 33488,16434 33488,16435 33491,16432 33487,16436 37487,16434 37490,16438 37485,16443 37482,16446 37480,16447 37480,16447 37482,16451 37478,16454 37479,16458 37479,16454 37479,16454 37482,16459 37486,16460 37491,16463 37495,16464 37492,16465 37493,16466 37494,16468 37497,16468 37501,16468 37501,16473 37503,16473 37503,16473 37498,16476 37494,21476 33494,21473 33493,21476 33489,21478 33491,21478 33496,21478 33492,21480 33496,21483 33501,21484 33504,21483 33500,21484 33505,21484 33505,21488 35505,21491 35505,21494 35506,21496 35510,21492 35506,21492 35509,21489 35514,21490 35517,21487 35519,23487 35523,23485 35528,23487 35533,23483 35534,23487 35535,23488 35537,23493 35539,23495 35542,23495 35546,23495 35550,23491 35549,23488 35552,23492 35555,23495 35560,23500 35559,23496 35557,4322 16354,4317 16358,4318 16358,4320 16363,4315 16363,4315 16362,4316 20362,4320 20365,4323 20363,4326 20366,4329 20367,4332 20370,4337 20374,4338 20375,4333 20375,4338 20375,4341 20377,4342 20377,4342 20378,4343 20381,4346 20386,4346 20386,4346 20386,4346 20386,4349 20390,4352 20395,4354 20396,4355 20400,4358 20400,4360 20401,4360 20404,4363 20405,4368 20406,4372 20411,4371 20416,4367 20417,4364 20422,4367 20420,4372 20425,4373 20422,4374 20418,4377 20418,4381 20422,4382 20423,4384 20418,4389 20421,4385 20423,4390 20423,4390 20425,4392 20429,4396 20434,41574 39698,41578 39702,41576 39704,45576 39704,45575 39709,45577 39713,45581 39715,45581 39718,45583 39721,45578 39726,47578 39722,47581 39719,47586 39722,47586 39726,47589 39730,47592 39733,47597 39733,47593 39733,47596 39735,47597 39735,47595 39735,47591 39739,47593 39744,47593 39747,4074 20263,4077 20268,4079 20268,4078 20271,4078 22271,4083 22276,4087 22272,4088 22275,4086 22279,4082 22280,4084 22282,4086 22277,4082 22277,4087 22281,4090 22281,4092 22281,4092 22286,4094 22287,4097 22290,4097 22291,4095 22286,4095 22288,4095 22293,4095 22288,4092 22285,4089 22286,4090 22286,4095 22281,4100 22286,4103 22285,4104 22288,4104 22289,4107 22294,4112 22292,4117 22290,4120 22295,120 22300,121 22303,122 22300,122 22300,121 26300,125 26303,129 26303,127 26305,127 26306,132 26306,132 26307,136 26307,141 26309,140 26311,143 26313,140 26314,145 26318,149 26318,153 26321,153 29321,158 29326,158 29329,162 29324,162 34324,165 34329,168 34328,167 34332,169 34333,173 34334,173 34336,177 34338,178 34340,178 34344,182 34348,177 34348,182 34348,184 34353,184 34358,181 34360,183 34365,187 34365,192 34365,197 34367,199 34366,203 34368,205 34368,202 34363,204 34360,1204 34360,1205 34364,1205 30364,1205 30359,1206 30361,1207 30364,1210 30366,1210 30366,1214 30367,1218 30372,1219 30375,1214 30379,1214 30384,1217 30382,1222 30383,1223 30382,1225 30380,1228 30379,1231 30383,1232 30383,1235 30384,1237 30388,1242 30386,1244 30389,2244 30392,2241 30395,2245 30397,2245 30399,2244 30394,2242 30395,2246 32395,2246 32395,2249 32398,2251 32393,5251 32390,5251 32395,5255 32399,5255 32397,5257 32397,5257 32401,5261 32406,5261 32411,5266 32412,5271 32416,5273 32419,5276 32420,5281 32422,5279 32425,6279 33425,6284 33429,6284 33430,6282 33431,6282 33428,6286 33425,6288 32425,6288 32421,6286 32424,6288 32424,11288 32427,11292 32425,11292 32429,11290 32434,11286 32437,11286 32437,11283 32442,11278 32442,11279 32443,11283 32445,11284 32445,11283 32448,13283 32447,13287 32442,16287 32446,16282 32445,16283 32445,16284 32448,16285 32448,16284 32446,16286 32443,16290 32446,16291 32446,16292 32450,16291 32450,16291 32450,16291 32445,16287 32447,16288 32452,16287 32457,16291 36457,16289 36462,16293 36462,16294 36462,16297 36462,16301 36464,16306 36469,16310 36467,16310 36463,16313 36459,16312 36460,16313 36465,16313 36469,16308 36470,16309 36468,16314 36470,16319 41470,16322 41471,16325 44471,16330 44471,16330 44471,16330 44473,16330 44474,16335 44479,16332 44477,8414 30496,8415 30497,8419 30497,8414 30501,8416 30500,8418 30495,8421 35495,8423 35494,8427 35497,8429 35499,8432 35499,8436 35503,8438 35503,8443 35505,8440 35508,8443 35509,8440 35509,8440 35511,8441 35515,8445 35511,8448 35512,8443 35517,8443 35519,8442 35524,8444 35526,8441 35527,8436 35527,8433 35523,8429 35527,8430 35530,8431 35532,8429 35533,8433 35535,8437 32535,8435 32536,8439 32536,8436 32539,9436 32542,9434 32537,9429 32534,9429 32534,9433 32537,9433 32542,9429 32543,9434 32538,9436 32538,9436 34538,7436 34538,7438 34543,7439 34543,7439 34543,7439 34548,7438 34549,7438 34552,7438 34553,7438 34556,11438 34561,11434 34559,11436 34555,7436 34553,7436 34549,120 1235,124 1239,125 1236,125 1238,129 1235,128 1235,125 1236,123 1239,128 2239,132 2242,131 2242,135 2242,140 2242,145 2247,146 2252,144 2253,146 2248,144 2245,146 2244,150 2249,155 2245,159 2242,160 2243,160 2245,155 2244,156 2245,3156 2246,3159 2248,3159 2250,3164 2254,3165 2257,3166 2255,3169 2257,3171 2262,3169 2263,3174 2268,3177 2273,3174 2276,3178 2275,3173 2279,3177 2276,3180 2279,3182 2284,3185 2289,5185 2286,5185 2288,5181 2286,5185 2288,5184 2293,5187 2293,5187 2297,5190 2299,5187 2299,5185 2300,5181 6300,5182 6297,5187 6300,5189 6298,5191 6296,5193 6296,5193 6296,5195 6297,5195 6300,5197 6297,5195 6300,5190 6302,5191 6306,5192 6308,5195 6312,24395 27436,24391 27437,24393 27433,24398 27436,24398 27437,16286 32443,21286 32443,21286 32444,21282 32448,21283 32446,21283 32448,21285 32451,21281 32456,21282 32458,21282 32463,21282 32468,21284 32470,21289 32471,21287 32471,21287 32469,21287 32474,21284 32477,21288 32482,21291 32482,21291 32486,21296 32485,21299 32486,21301 32487,21303 32484,21301 32482,21305 32487,21310 32491,21312 32495,21313 32491,21315 32495,21312 32495,21314 32498,21316 32501,21311 32506,21311 32508,21312 32513,21317 32516,21319 32516,21324 32516,21327 32521,21328 32526,21332 32527,21328 36527,21331 41527,21336 41527,21334 41531,21337 41533,21335 41535,21339 41540,21340 41540,21343 41536,25343 41539,25340 41542,25337 41542,25337 41545,25335 41542,25335 41543,25335 46543,25339 46548,30339 46551,30340 46556,30343 46557,30342 46553,30337 46556,30341 46561,30337 46565,30336 46563,30338 46564,24373 27419,24373 27421,24375 27424,24377 27425,24377 27430,24374 27435,24379 27437,24384 27432,24385 27434,24382 27437,24381 27442,24381 31442,24381 33442,20381 33439,20383 34439,20382 34440,20378 34444,20381 34446,20381 34442,20384 34443,20388 34446,20392 34447,20393 34442,20393 34447,20396 29447,20395 29443,20399 29443,20400 29439,20399 29436,20404 29439,20409 29440,20410 29440,20410 29444,20408 29445,20413 29448,20413 29451,20412 29455,20413 29458,20418 29461,20413 29463,20415 29464,20416 29464,20416 29463,20416 29463,20418 29464,20414 29465,20418 29463,20413 29460,20413 26460,20418 26458,20421 26459,20421 26461,20421 26460,43578 35658,43578 35654,43578 35658,43578 35660,43583 35661,43583 35659,43583 35662,43579 35663,43583 35661,43587 35666,25625 25551,25629 25551,25630 25554,25630 25559,25632 25560,25627 25561,25623 25557,25623 25559,25624 25561,26624 25566,26627 25566,29627 25571,29626 25574,29625 25575,29622 25579,29625 25583,29630 25588,29632 25589,29635 25591,29635 25594,29637 25598,29642 25596,29643 25597,29644 25597,29649 25598,29654 25602,29656 25602,29661 25603,29661 25601,29664 26601,29666 26604,29665 26604,29668 26607,29672 26607,29669 26611,29671 26616,29674 26613,29679 26616,29680 26616,29681 26615,29682 26619,29679 26617,29684 26622,29686 26624,29689 26624,29690 26628,29691 26630,29693 26625,29694 26620,29698 26617,29703 29617,29707 29616,29706 29620,29709 29623,34709 29626,34710 29628,34710 29627,2282 16411,2283 16412,2283 16412,2287 16417,2292 16421,2297 16421,2298 16426,2303 16426,2304 16429,2309 11429,2313 11432,2308 14432,2308 14431,2311 14433,2310 14437,2308 14438,2309 14440,2311 14440,2309 14443,2312 14443,2314 14447,2314 14452,2314 14450,2309 14451,2309 14451,2309 14456,2313 14461,2313 14461,2309 19461,2309 19461,2311 19462,2315 19465,2318 19465,2321 19462,2317 19464,2321 19467,2322 19467,2322 19469,2322 19469,2320 19464,2321 19462,2322 19461,2327 19466,2327 19461,2322 19461,2322 19463,2317 19467,2318 19471,2102 -1848,2107 -1848,2111 -1846,2114 1154,2114 1156,2115 1157,2114 6157,2116 6162,2121 6165,2124 6170,2121 6175,2124 6179,2124 6183,2128 6178,2126 6179,2125 6178,2126 6181,2122 10181,2127 10186,2128 10189,2130 10188,2130 10191,2127 11191,2127 11195,2131 11196,2132 11192,2131 11197,2135 11201,2135 11203,2139 11199,2142 11203,2143 11204,2147 11208,2142 11210,2142 11211,2147 11212,2150 11217,2150 11219,2151 11219,2152 11222,2152 11222,2148 11224,2150 11220,2150 11223,2146 11218,2143 11219,2140 11221,2143 11218,2140 11219,2140 11223,2145 11225,2147 11226,2152 11226,2155 11224,2157 11229,2157 11229,2153 11233,2153 11238,2149 11239,7149 10239,7154 10241,7157 10241,7162 10243,7164 10248,7164 10251,7169 10253,7171 10253,7172 10257,7177 10260,7182 10256,7187 10260,7191 8260,7195 8256,7200 8258,7204 8258,7203 8261,7203 8262,7205 8266,7209 8270,7209 8273,7214 8273,7214 8276,7210 8276,7211 8276,7213 8279,7218 8278,7222 8283,7223 8279,7220 10279,7221 10283,7223 10284,7228 10286,7230 10290,7231 10290,7231 10293,7232 10294,7232 10297,7234 10299,7229 10295,7226 10294,7221 10293,7223 10295,7228 10299,7229 10303,7232 10307,7232 10311,7233 10316,7234 9316,7239 9318,7244 9321,7241 9326,7241 9328,7238 9331,7235 9330,7237 9335,7236 9335,7236 9337,7236 9338,7231 14338,7230 14333,7232 14338,7237 18338,4082 22280,4081 22280,6081 22283,6076 22285,6076 22289,6078 22286,6080 22287,6084 22292,6084 22293,6085 22293,6086 22291,6091 22294,6092 22293,9092 22290,9095 22294,9096 22295,9096 22297,9091 22292,9096 22295,9098 22290,9094 18290,9097 18290,9096 18294,9099 18292,9098 18297,9103 18299,9103 18302,9103 18305,9100 18301,9102 18302,9106 18305,9102 18310,9101 18306,9103 18308,9103 18312,9107 18310,9107 18315,9107 18320,9111 18322,9111 18326,9113 18329,9111 18329,9116 18329,9121 18329,9121 18332,9123 18331,9124 18332,9125 18328,9127 18325,9125 18328,9128 18329,9133 18329,9136 18333,9141 18337,9142 18342,9143 18340,9148 18344,9152 18341,9150 18346,9149 18341,9149 18341,9154 18343,9158 18345,9161 18346,9161 18347,9163 18352,9164 18352,9162 18349,9165 18352,9165 18351,9165 18352,9165 18356,9163 18352,9167 18353,9167 18349,9168 18351,9168 18347,9173 18347,9175 18347,9179 18348,9182 18349,9187 18352,9186 18357,9189 18360,9192 18360,9196 18362,13196 18367,13196 18369,13196 18371,13199 18374,13194 18374,13197 18375,13200 18377,13205 18380,13210 18384,13209 18379,13209 18374,13213 18375,13216 20375,13212 20375,13215 20375,13211 20375,13211 20372,13208 20373,13204 20373,13204 20369,13205 20369,13207 20366,13212 20367,13216 20367,13221 20372,13222 20377,13225 20381,13226 20386,13230 20383,9230 20388,9228 20384,9228 20386,9223 20389,9223 20392,4223 20397,4223 20396,4225 20399,4222 20404,4220 20408,4220 20411,4223 20416,4227 20421,4230 20418,4234 20421,4232 20422,4236 20423,4238 20423,4239 20423,4235 20427,4231 20427,4230 20426,4228 20428,4232 20427,4232 20431,4236 20433,4241 20431,4241 22431,4236 22436,4239 22437,4239 22439,4236 22443,4232 22439,4236 22444,4236 22446,4239 22447,4239 22452,4241 22454,4245 22457,4245 22460,4250 22462,4251 22465,4253 22465,4249 22465,4251 22460,4251 22464,4255 22469,4257 22473,4256 22478,4259 22479,4260 22480,4257 22485,6257 22489,6260 22490,6260 22493,6262 22496,6262 22500,6267 22495,6271 22495,6276 22491,6276 22489,6281 22487,6286 22490,6289 22490,6294 22490,6294 22489,6292 22485,6292 22489,6288 22489,6288 22494,6288 22496,6286 22497,6288 22501,6292 22500,5292 22503,5292 22503,5296 22508,5295 22510,5300 22510,5305 22513,5302 22514,5306 22510,5309 22513,5313 27513,5313 27513,5317 27513,5322 22513,5326 22517,6326 22516,6323 22518,6323 22523,6320 22523,6321 22526,6323 22531,6323 22531,6324 22532,6324 22532,6325 22529,6321 22531,6323 22534,6328 22534,6329 22530,6324 22527,10324 22522,10319 22524,10315 22520,10314 22525,10311 22525,10307 22526,10304 22531,10306 22527,10306 22528,10309 22530,10312 27530,10312 27534,10312 27534,10307 27536,10307 27532,11307 27531,11307 27533,11308 27535,11303 27531,11298 27532,11294 27534,11294 27534,11299 27538,11297 27542,11302 27547,11306 27547,11311 27549,11313 30549,11317 30551,11313 30546,11316 30541,11316 30540,11319 30545,11318 30546,11323 30550,11326 30554,11326 34554,11330 34558,11331 34558,11333 34558,11332 34561,11328 34561,11331 34562,11336 34562,11336 34567,11340 34570,11342 34569,11345 34568,11344 34569,11345 34571,11349 34574,15349 34574,15354 34569,15359 34566,15362 34571,15363 34576,15367 34577,15368 34577,15371 34581,15374 34576,15379 34574,15383 34579,15384 34584,15387 34583,17387 34578,17392 34578,17391 34578,17396 34573,17397 34578,17397 34580,17397 39580,17402 39584,17397 39587,17402 39587,17406 39582,17403 39587,17407 39589,17409 39592,17406 39592,17409 39595,17409 39599,17412 39603,17416 39608,17417 39608,17417 39608,17421 39607,17422 39609,17424 39608,17427 39604,17425 39605,17426 39609,17423 39611,17422 39610,17425 39613,17428 39618,17428 39619,17429 39616,17432 39616,13432 39615,13432 39617,13432 39617,13432 44617,13434 44621,13434 44623,13439 44627,13442 44632,13442 44635,13440 44631,13442 44631,13445 44635,13447 44639,13445 44637,13445 44638,13450 44639,13454 44644,13457 44644,13459 44642,15459 44639,15457 44644,15461 44644,15462 44642,15459 44645,15459 44647,15463 44650,15458 44651,15459 44653,15461 44657,15463 44661,15463 44661,15463 44663,15467 44666,15472 44668,15474 44664,15470 44668,15471 44670,15473 44674,15475 44675,-3806 12298,-3804 12301,-3805 13301,-3804 13296,-3808 13292,-3809 13295,-3806 13300,-3804 13297,-3801 13301,-3801 13302,-3796 18302,-3801 18306,-3799 18311,-3802 18311,-3799 18312,-3801 18314,-3796 18319,-3795 18322,-3791 18321,-3786 18320,-3786 18321,-3784 18321,-3782 18321,-3781 18324,-3782 18325,-3783 18320,-3788 18324,-1788 18324,-1788 18329,-1784 18333,-1784 18334,-1781 18329,-1777 18334,-6777 18337,-6774 18339,-6776 18341,-6781 18341,-6779 18341,-6779 18343,-6779 18339,-6777 18343,-6782 18338,-6779 18341,-6778 18341,-6776 18336,-6776 18333,-6776 18333,-6780 18338,-6784 18338,-6787 18335,-6786 18336,-6781 22336,-6781 22335,-6778 22331,-6777 22326,-6777 22331,-6777 22335,-6772 22335,-6774 22340,-6769 22341,-6767 22337,-6767 22335,-6767 22335,-6767 22333,-6767 22336,-6762 22331,-6759 22331,-6764 22332,-6765 22334,-6767 22339,-6762 22334,-6760 22334,-6760 22334,-6758 22337,-6754 22341,-6754 22342,-6750 22339,-4750 22343,-4747 22343,-4752 22343,-4751 22344,-4749 22345,-4745 22348,-4740 22353,-4736 22358,-4738 22363,-4740 22358,21336 41527,21334 41527,21330 41526,21330 41526,21333 41529,21328 41529,21329 41530,21326 41532,21328 41532,21324 41537,21328 41532,21330 41535,21334 41532,21336 40532,21334 40536,21339 40534,21341 40534,21344 40534,21346 40532,21350 40532,21353 40535,21357 40539,21359 40542,21360 40546,21355 40546,21360 40547,21359 40550,21356 40551,21356 40550,21357 40550,21361 40554,21358 45554,21362 45556,21366 45553,21370 45557,21374 45556,21377 45553,22377 45549,22382 45549,22382 45552,22386 45557,22387 45557,22388 45553,22392 45557,24392 45561,22392 45558,22397 45561,22399 45558,22398 45561,22400 45564,22400 45569,22404 45573,22406 45577,22406 45581,22404 45581,22407 45582,22409 45579,22409 45575,22409 45579,22407 45579,22402 45582,22402 45582,22404 45587,22406 45587,22406 45589,22411 45589,22413 45590,22417 45591,22417 45592,22422 45587,22425 45583,22428 50583,22428 50585,22428 50585,22430 50588,22435 50590,22435 50585,22435 50590,22439 50595,22440 50590,22445 50587,22442 50584,22442 50586,22443 54586,22443 54590,22446 54595,22448 54597,22448 59597,22444 59593,22449 59596,22449 59599,22452 59600,22457 59600,22458 59605,22457 59602,22462 59603,22463 59604,22461 59605,22458 59602,22457 59601,22457 59601,22455 59605,25455 59606,25457 59611,25462 59613,25464 59614,25467 59617,25472 59612,25476 59613,25478 59610,25482 59615,25482 59616,25486 59612,25483 59614,25487 59619,25492 59623,25497 59625,146 2252,150 2249,150 2249,152 2254,157 2249,158 2253,157 2252,161 2255,159 3255,161 3258,161 3255,163 3255,168 3259,168 3259,172 3263,167 3267,172 3271,172 3272,172 3274,175 3278,179 3282,181 3283,184 3280,185 3282,187 3282,191 3284,192 3286,191 6286,193 6289,198 6285,195 6290,194 6289,195 6289,199 6293,200 6288,198 6290,202 6291,207 6296,212 6301,215 6301,216 6301,211 6304,212 6304,216 6309,216 6304,214 6308,213 6308,211 6305,212 6309,217 6314,220 6317,224 6322,222 6327,220 6323,41573 39712,41572 39709,41576 40709,41580 40714,41576 40717,36576 40717,36577 40719,36582 40716,36585 40721,36590 43721,36585 43721,36582 43724,36585 43729,36590 43731,36590 43730,15289 11307,15285 11312,15286 11315,15289 11315,15294 11315,15295 11316,15296 13316,38742 37646,38743 37650,38745 37655,38744 37658,38739 37659,38737 37662,38742 37662,38745 37657,38748 37662,38748 37662,38752 37667,38753 37667,38748 37669,38748 37668,38752 37673,38754 37674,38756 37676,38758 37674,38760 37679,38760 37675,38758 37675,38763 37675,38767 37674,38772 40674,38767 40679,38772 40683,38774 44683,38778 44686,38780 44690,38780 44690,38779 44695,38782 44700,38780 44695,38775 44696,38775 44696,38775 44696,38779 44699,38783 44696,38784 44696,38786 44692,38786 44692,38786 44696,38791 44698,38793 44699,38795 44703,38800 44708,38803 44708,38807 44709,38802 44706,38806 44708,38809 44709,36809 44709,36814 44704,36813 44705,36814 44705,36816 44709,36811 44712,36812 48712,36811 48717,36815 48721,36816 51721,36818 51717,36822 51720,40822 51715,40827 51712,40830 51716,40829 51719,40832 51723,40835 51724,40840 51721,40841 51721,40836 51725,40841 51730,40846 51734,40848 51738,40849 51740,40851 51743,40854 51745,40855 51746,40857 51750,40857 51746,40861 51748,40866 51751,40862 51750,40866 51750,40869 51752,40865 51752,40863 51755,40858 51757,40855 51753,40855 51758,40852 51758,40853 51760,40857 51761,40855 51757,40852 51760,40853 51761,40855 51762,40858 51757,40859 51756,40863 51757,40863 51759,40860 51764,40859 51764,40854 51768,40850 51765,40852 51767,40852 51767,40848 51772,40852 51776,40854 51778,40852 51778,43852 51778,43854 52778,43856 52781,43859 52781,43859 52776,37512 26536,37517 26531,37520 26535,37520 26540,37522 26544,37527 26544,37532 26549,37537 26544,37540 26549,37545 26544,37549 26547,37549 26550,37548 26551,37549 26553,37546 26553,37546 26553,37549 26556,37549 26559,37552 26559,37556 26564,37560 26559,37561 26561,37565 26565,41565 26565,41569 26568,41571 26573,41571 26573,41576 29573,41571 29573,41573 29576,41573 29578,46573 29578,46569 29582,45569 29583,45572 29583,45568 29583,45573 29581,45575 29578,45571 29581,45572 29584,45572 29585,45576 29585,45578 29588,45581 29591,45582 29593,45582 29598,45584 29597,45589 29600,45585 29605,45589 33605,45593 36605,45594 36607,45599 36609,45600 36604,45604 36604,45604 36608,45604 36607,45608 36610,50608 36613,50611 36609,50614 36609,50619 36605,50624 36605,50625 36606,50625 36605,50629 36606,50624 36608,50625 36610,50626 36610,50629 36608,50627 36610,50628 36614,50632 36618,46632 34618,46632 35618,46636 35622,46636 35617,46637 35620,46639 35619,46643 35620,46645 35625,46643 35630,46648 35635,46648 35640,46649 35643,46651 35647,46655 35650,46652 35655,46657 35656,46658 35657,46662 35660,46659 35663,46662 35664,46665 35663,46667 35667,46667 35663,46670 35666,46672 35671,46674 35671,47674 35668,47676 35672,47677 35673,47677 35678,47677 35677,47677 35677,47677 35682,47672 35683,47671 35683,49671 35685,49674 35689,49677 35692,49675 35692,54675 35697,54678 35699,54674 35699,54670 35701,54670 35700,54675 35703,54676 34703,54676 34703,54679 34706,54683 34708,54688 34706,54688 34707,54685 34702,54687 34702,54692 34707,54687 36707,54687 36706,54682 36707,54685 38707,54680 38710,54680 38714,54677 38714,54679 38719,54682 38720,54687 38716,54688 38717,54692 38722,54697 38726,54699 38727,54700 38724,54702 38720,52702 38719,52702 38719,52702 38721,52702 38725,52704 38726,52706 38728,52707 38729,52711 38728,52711 35728,52713 35733,52712 35737,52712 35739,52713 35742,52713 35745,52708 35745,52710 39745,52713 39749,52716 39748,52721 39749,52720 39753,52716 39756,52716 40756,47716 40757,47717 40761,47722 40761,47722 40761,47722 40766,47726 40769,47728 40772,47733 40777,47731 40773,50731 40777,51731 40779,51733 40782,51734 40786,51737 40784,51741 41784,51739 41783,51739 41785,51739 41785,51736 41789,51731 41789,52731 41790,52735 41791,52738 41790,52742 41789,52746 41785,52747 41785,52745 41785,52750 41782,52753 41786,52753 41787,52758 41792,52754 42792,52749 42793,52752 42794,52756 42791,52757 42790,52762 42793,52766 42797,52766 42797,52769 42802,52774 42806,52774 42805,52771 42807,52774 42807,52770 42808,52771 42811,52767 42811,52766 42812,52767 42817,52771 42817,52771 42817,52775 42815,52779 42811,52779 42812,52780 42815,52776 42818,52774 42818,52777 42822,52780 42823,52781 42827,52776 42829,52780 42832,54780 42835,54780 42840,2135 11201,2140 11203,2137 11204,2140 11209,2142 11213,2147 11211,2145 11213,2145 11213,2150 11218,2150 11221,2153 11225,2157 13225,2162 13228,2167 13231,2171 13232,2167 13229,2168 13233,2171 13237,2173 13239,2168 13234,2168 13235,2173 13235,2175 13234,2177 13235,2177 13234,2179 13229,2179 13226,2180 13226,2177 13226,2177 13231,2180 13231,2181 10231,2176 10233,2177 10232,2180 10235,2185 10237,2182 10240,6182 10240,6184 10244,6182 10242,6183 10243,6185 10246,6190 10244,6194 10244,6194 10247,6192 10247,6192 10252,6195 10256,6194 10260,6195 9260,6195 9260,6195 9264,6199 9269,6204 9272,6199 9268,6201 9268,6203 9265,6208 9268,6204 9270,6204 9275,6201 9279,6201 9281,6201 9286,6206 9281,6206 9277,6202 9281,6200 9285,6202 9288,6198 9290,7198 9293,7200 9297,7201 9297,7205 9298,7209 9298,7209 9299,8209 9302,8214 10302,8218 10306,8222 10308,8226 10313,8231 10313,8235 10318,8237 10318,8237 10323,8233 10326,8233 10327,8237 10325,8238 10328,8238 10330,8234 10330,11234 10332,11236 10333,11241 10337,14241 10338,14240 10338,14237 10339,14238 10337,14237 10339,14242 10339,14246 10339,14250 10339,14250 10339,14251 10337,14254 10337,14256 10334,14256 10332,14252 10336,14255 10340,14259 10342,14262 10347,11148 3159,11153 3163,11154 3162,11154 3165,11158 3167,11161 3172,11162 3175,11162 3176,11166 3179,11166 3181,11171 3185,11176 3180,11178 3179,11176 3181,11179 3183,11174 3182,52776 42818,52778 42822,52777 42822,52782 42817,52783 42822,52784 42823,52789 42826,52789 42823,56789 42828,56786 42829,56786 42832,56789 42836,56789 42835,56785 42838,56786 42843,51786 42844,51788 42846,51790 42847,51794 42842,51796 42842,51801 42846,53801 42849,53806 42849,53809 42852,53812 42850,53817 42846,53817 42848,53818 42853,53822 42856,53823 42854,53826 42858,53825 42860,53826 42860,53826 42864,53830 42868,53835 42873,53839 42873,53841 42872,53841 42876,53841 42879,53841 42884,53836 42888,53836 42889,53836 44889,53833 44889,53835 44893,53838 44897,53842 44897,53844 44900,53844 44904,53845 44905,53850 44903,53853 44904,53858 44906,53856 44907,53861 44909,53856 44913,53858 44916,53863 44916,53868 44918,53867 43918,53869 43921,53869 43919,53867 43919,53862 43918,53860 43923,53864 43928,53869 43930,53874 43933,53874 43932,53874 43932,53875 43930,53877 43928,53878 43924,53883 43927,55883 43929,55883 43925,55879 43929,55881 43929,55884 43928,55881 43928,55882 43929,55883 45929,55883 45933,55883 45936,55884 45941,55884 45941,55886 45946,55882 45948,55883 45952,55888 45956,55890 45957,55894 45953,55892 45954,55897 45950,55893 45954,55896 45956,55892 45955,55897 45959,55899 45961,55899 45961,55894 45962,55898 45957,55893 49957,55896 47957,55894 47956,55898 47960,55901 47964,55901 47967,55901 47970,55896 47973,55898 47969,55894 47974,55895 47975,55891 47976,55896 47979,55899 47984,55902 47983,55897 47987,55899 47989,55904 47992,55904 47993,55905 47997,55902 48001,55902 48003,55907 48000,55910 47998,55915 47999,55911 47994,55906 47998,55910 48003,55914 48000,55918 48000,55914 48000,55919 48000,55921 48003,55921 48007,55924 48007,55919 48010,55922 48005,55927 48009,55928 48008,55928 48008,55930 48012,55925 48012,55925 48016,54925 48014,54922 48018,54922 44018,54926 44013,54929 44012,54932 44016,55932 44017,55935 44017,55936 44020,55937 44022,55936 44020,55939 44015,55944 44018,55945 44022,55947 44023,55950 44024,55953 44020,55956 44023,53867 43919,53871 43921,52871 43921,53871 43923,53876 43923,53881 43923,53880 43927,53882 43931,53886 43936,53884 43937,53879 43934,53879 43937,53877 43939,53878 43938,53879 43942,53880 43947,53881 43948,53884 45948,53884 45949,53882 45953,53883 45954,53878 45956,53880 45953,53885 45958,53885 45958,53886 45957,53886 48957,53886 48962,53891 48962,53892 48964,53897 48965,49897 48962,49902 48965,49906 48967,49902 48967,49904 48971,49901 48967,49904 48970,54904 48971,54904 48971,54904 48975,54909 48979,54907 48975,54910 48975,54906 48971,54909 48973,54911 48975,54915 48978,54920 48978,54923 48981,54918 48984,54921 48984,56921 48984,56926 48986,56924 48981,56929 48980,56932 48979,56932 48977,56936 48979,56937 48981,56937 48982,61937 48984,61937 48980,61934 51980,61935 51981,61935 51984,61935 51984,61931 51986,5329 23395,5331 23395,5333 23390,5337 23392,5340 23395,5345 27395,5345 27397,5350 27398,5355 27399,5356 27402,6356 27405,6360 27407,6361 27406,6364 27402,6366 26402,6371 26402,6371 26402,6372 26405,6370 26405,6375 26406,6380 26411,6385 26413,6387 26414,6388 26419,6390 26419,6391 26424,6393 30424,6390 30429,6390 30432,6390 30430,6394 30434,6394 30437,6394 30441,6396 30442,6398 30439,6399 30436,6404 30435,6405 30435,6400 30435,6405 30440,6404 30443,6405 30447,6409 30447,6411 30447,6412 30448,6417 30446,6421 30450,6418 30448,6417 30444,6418 30449,6420 30451,6425 30456,6426 30456,6425 30458,6426 30458,6426 34458,6427 34459,6432 39459,6434 39462,6434 39467,6439 39470,6443 39467,6444 39468,6449 39473,6451 39476,6452 39481,6452 39479,6452 39476,8452 39476,8456 39478,8460 39480,10460 39482,10455 39482,10456 39484,10460 39484,10463 39484,10468 39486,10473 39482,10475 39484,10475 39486,10476 39488,10477 39492,10475 39494,10480 39499,10476 39501,10479 39506,10480 39510,10475 39508,10480 39513,10481 39516,10481 39516,10485 39521,10487 39522,10490 39523,10490 39520,10493 39520,10496 44520,10491 44519,10491 44524,10492 44520,10497 44525,10499 44525,10502 44527,10500 44531,10502 44535,10506 44535,10511 44532,13511 44536,13513 44533,13510 44535,13507 44540,13511 44543,13515 44548,13517 44549,13522 44550,13525 42550,13520 42551,13522 42553,13525 42552,13529 42557,13529 42558,13524 42559,13525 42559,13525 42562,13520 42564,13523 42567,15523 42569,15523 42572,15524 42577,15529 42577,15530 42582,15532 42584,15532 42588,15531 42587,15531 42592,15530 42587,15530 42583,15533 42583,15536 47583,15532 47583,15535 47587,15534 47590,15536 47594,11536 47590,11533 47590,11529 47590,11533 47592,11533 47592,11533 47593,11537 47598,11538 47603,11538 47603,11538 47605,11541 47609,11544 47613,14544 47614,14539 47610,14537 47610,14537 47614,14535 50614,14537 50619,14539 50619,14540 50623,14538 50623,14537 50619,25599 26540,25599 26541,25599 26544,25594 26542,25599 26543,25596 26544,25597 26543,25598 26543,25593 26544,25588 26542,25593 26545,25595 26544,25596 26544,25599 26541,25594 26544,25592 26549,25593 26548,25597 26549,25596 26550,25594 26551,25590 26550,25594 26554,25597 26550,25598 26552,25593 26555,25598 22555,25599 22557,25604 22559,25605 22558,25606 22562,25605 22559,25605 22564,30605 22569,30610 22571,30610 22575,30609 22575,30609 22576,30609 22581,30605 22581,30610 22583,30610 22584,30613 22579,30613 22581,30616 22577,30619 22577,30621 22580,30621 22585,30626 22590,30628 22593,30629 22598,30626 22603,30628 22606,30629 22607,30629 22604,30627 22606,30632 22608,30633 22608,30636 22612,30641 17612,30642 17614,30647 17614,30651 17615,30654 17610,30655 17607,30658 17611,30653 17610,30654 17606,30654 17607,30659 17606,30660 17611,30658 17616,30659 17616,30664 17619,30665 17621,30665 17620,30667 17621,30671 17624,30673 17624,30673 17624,30678 17627,30675 17632,30675 17635,30678 17640,30681 17643,30686 17639,30691 17641,30696 19641,30699 19640,30700 19640,30696 19645,30698 19643,30699 19645,30702 19646,30703 19649,30699 19651,30704 19648,30706 19652,30709 19653,30709 19655,30709 19655,30712 19657,30708 19658,30705 19660,30700 19662,30701 19663,30706 19664,30711 19663,30707 19667,30704 19670,30708 19672,30709 19673,30711 19673,30711 19674,30713 19678,30718 19682,30723 20682,30721 20686,30725 20691,30726 20693,30729 20695,30728 20690,30730 20692,30733 20694,30736 20692,30736 20691,30740 20694,30741 20695,30741 20697,30746 20700,30747 20702,30750 20701,30751 20698,30753 24698,30749 24701,30748 24703,30746 24704,30747 29704,30747 29705,30749 29707,30752 29712,30757 29712,30760 34712,30760 34716,30763 34716,30759 34713,30759 34717,30763 34717,30758 34717,30757 34721,30760 34726,30758 34726,30763 34727,30763 34727,30764 34727,30759 34729,30759 34732,30762 34734,30757 34735,30761 34736,30759 34736,30762 34738,30757 34733,30760 34735,30762 34737,30760 34736,30765 34733,32765 34737,32768 34737,32765 34740,32765 34742,32768 34747,32772 34751,32772 34752,32777 34749,32782 34751,32783 33751,32783 33746,36783 33749,36783 33754,36786 33756,36787 33755,36787 33758,36791 33754,36796 33754,36801 33756,36801 33758,36801 33762,36802 33765,36802 33765,36806 33770,33806 33772,33806 33777,33809 33777,33814 33780,33814 33785,33818 33782,33821 33784,33826 33781,33822 33781,33824 33783,33822 33784,33826 33787,33823 33792,33827 33795,33828 33798,33829 33799,33833 33801,33833 33801,33836 33805,33839 33809,33842 33805,33847 33810,33845 32810,33847 32808,33849 32812,33851 32815,33849 32818,33849 32822,33847 32822,33847 32826,33850 32831,33854 32836,33857 32833,33856 32828,33859 32829,33860 32832,33857 32834,33857 32830,33855 32830,33857 32830,33855 32834,33859 32829,33859 32833,33862 32836,33864 32837,33864 32839,33866 32837,33869 32835,33872 32840,33874 37840,33879 37845,33881 37850,33881 37855,33886 37856,33891 37860,33896 37860,33893 37863,33894 38863,33896 38859,28896 38864,28899 39864,33899 39869,33896 39871,33898 39875,33902 39873,33902 39875,33907 39879,33912 39884,33908 39887,33908 39888,33905 39890,33909 39895,33911 39896,33908 39900,33912 39901,33915 39902,33915 39902,33915 39902,33910 39907,33910 39904,33914 39903,33912 39906,33916 39909,33920 39909,33922 39912,33923 39916,33928 39916,33931 39918,33932 39919,33935 39915,33936 39912,33934 39909,35934 39914,35931 39915,35935 39917,35939 39920,35939 39915,35940 39911,35944 39916,35944 39911,35944 39908,35945 39904,35945 39908,35945 39912,35950 39915,35955 39917,38955 39916,38960 39921,38962 39920,38962 39920,38967 39922,38967 39924,38970 39928,38975 39928,38973 39928,38977 39931,38980 39934,38984 39936,38982 39939,38983 39942,38985 39943,38987 39945,38992 41945,38988 41950,38989 41954,38992 41958,38992 41962,38992 41965,38993 41970,38997 41970,38997 41970,38994 41974,38994 41979,38997 41979,38999 41982,38994 41980,38998 41985,38998 41984,5334 23406,5330 23406,5325 23403,9325 23404,12325 23408,12325 23408,12322 23406,13322 23411,13325 23416,13326 23412,13322 23414,13327 23419,13328 23422,13329 23425,13333 23422,13337 23424,23491 35549,23490 35544,23494 35546,23499 35548,23495 35549,21495 35553,21490 35556,21492 35558,21492 35556,21494 35559,21494 35564,21494 35566,21499 35566,21502 35562,21502 35567,17502 35568,17506 35573,17507 35574,17511 35578,17512 35583,17513 35588,18513 35591,18514 35592,18515 35594,18513 35596,16513 35601,16513 37601,16513 37602,16511 37604,16513 37609,16514 37611,16518 37616,16522 34616,16524 34613,16528 34615,16528 34620,16533 34624,16535 34627,16538 34628,16539 34630,16539 34631,16542 34628,16542 34633,16544 34638,16547 38638,16547 38640,16543 38645,16543 38640,16540 38640,16543 38640,16542 38641,16546 38646,16541 38649,16541 38645,18541 38648,18544 38648,18544 38653,18544 38656,18549 38651,18547 38651,18550 38656,18547 38658,23547 38663,23544 38664,23548 38668,23548 38670,28548 38672,28549 38669,28549 38673,28545 38669,28549 38670,28554 38670,28557 38674,28560 38669,28562 38674,28562 38669,28561 38669,28564 38671,28569 38671,38779 44699,38780 44695,38778 44698,38783 44700,38785 44700,38781 44701,38782 44696,38786 44691,38789 44692,38794 44692,38799 44688,38799 44693,38803 44697,38808 44697,38806 44697,38806 44700,38803 44702,38803 44706,38802 44707,38807 48707,38808 48707,38806 48707,38810 48712,38810 48709,38810 48711,38810 48711,38806 48707,38802 48710,38803 48706,38805 48711,38810 48711,38805 48709,38809 48710,38809 48710,38814 48707,38815 48703,38816 48703,38816 48704,38820 48704,38822 48709,38820 48710,38818 48714,38822 48716,38822 48719,38827 48722,38828 48727,38832 48725,38830 48730,38831 48726,38832 48724,38829 48728,8431 35532,8431 35537,4431 35532,4434 35537,4438 35537,4439 35533,4443 35535,4442 35530,4445 35527,4449 35527,4453 35530,4458 35530,4459 39530,4460 39531,4461 39531,4464 39531,4468 39531,4470 39534,4465 39534,4465 39532,4469 39532,4471 39537,4466 39538,4470 39539,4473 39540,4476 39540,4480 39543,4485 39548,4483 39546,4484 39547,4484 39549,4484 39551,4486 39553,4486 39554,4487 39551,4483 39553,4486 39554,4490 39556,4493 39557,4498 39561,4494 39562,-4749 22345,-4752 22345,-4748 22348,-4744 22351,-4740 22356,-4741 22358,-4739 22361,-4734 22359,-4730 25359,-4730 25360,-4725 25360,-4727 25360,-4727 25361,-6727 25360,-6729 25365,-6730 25365,-6727 25365,-6731 25364,-6730 27364,-6727 27366,-6723 27367,-3723 27363,-3719 27368,-3720 27371,-3718 27366,-3717 27369,-3716 27369,-3714 27372,-3711 27370,-3712 27371,-3712 27370,-3710 27375,-3708 27377,-3707 27382,-3706 27385,-3706 27389,-3705 32389,-3704 32392,-3704 32392,-3699 32391,-3699 32395,-3694 32399,-3694 32400,-3695 32404,-3695 32408,-3693 32410,-3693 32410,-3697 32410,-3692 32413,-3691 32418,-3686 32420,-3683 32425,-3681 32420,-3678 32424,-3673 32424,-3676 32427,-3673 32426,-3671 32426,-3676 33426,-3678 33428,-3676 33428,-3679 33428,-3679 33433,-3677 33434,-3676 33438,-3681 33440,1319 33444,1321 33441,1325 33444,1329 33439,1326 33444,1326 33439,1327 33439,1327 33440,1332 33444,1333 33449,1338 33453,1338 33450,1343 33450,1347 33454,1346 33457,1346 33455,1342 33459,1341 33462,1346 33462,1347 33463,1343 33463,1344 33462,1348 33457,1347 33460,1352 33464,1356 33468,1361 33469,1363 33468,1365 33469,1368 33472,1369 33475,-2631 33478,-2633 33483,-2629 33486,-2632 34486,-2628 36486,-2625 36488,-2621 36488,-2624 36488,-2622 36492,-2624 36491,-2629 36491,-2627 36496,-2623 36499,-2628 36502,-2631 36506,-2626 36506,-2622 36506,-2622 36509,-2619 36514,-2624 36512,-2621 36510,-2619 36510,-2619 36508,-2617 36512,-2615 36512,-2615 36513,-2615 36511,-2615 36506,-2612 36507,-2609 36511,-2606 37511,-2606 37508,-2610 37505,-2607 37508,-2602 37512,-2599 37512,-2595 37510,-2597 37511,-2592 37515,-2597 37514,-2592 37519,-2592 37524,-2592 37526,-2594 37521,-2594 37516,-2591 36516,-2588 36517,-2589 36513,-2586 36514,-2584 36514,-2583 36516,-2579 36514,-2578 36518,-2578 35518,-2575 35519,-2577 35519,-2578 35524,-2578 35529,-2578 35532,-2578 35534,-2580 35537,-2584 35541,-2586 35542,-2587 35544,-2585 35540,-2585 35544,-2584 35543,-2580 35548,-2576 35550,-2571 35553,-2567 35555,-2565 35560,-2560 35560,-2557 35564,-2553 35564,-5553 36564,-5548 36564,-5544 36565,-5547 36565,-5545 36570,-5542 36565,-5543 36566,-5543 36568,-5543 36570,-5540 36575,-5537 36577,-5535 36581,-5532 36580,-5528 36575,-5526 38575,-5526 38576,-5526 38571,-5522 38571,-5518 38576,-5514 42576,-5510 42581,-5512 42583,-5512 42582,-5507 42582,-5510 42585,-2510 42589,-2511 42592,-2508 42594,-2506 42597,-2503 42598,-2503 42603,-2498 42608,-2501 42611,-2500 42616,-2502 42613,-2502 42616,-4502 42616,-4502 42620,-4502 42622,-4506 42619,-4509 42621,-4511 42624,-4515 42625,-4510 42625,-4507 42628,-4502 42624,-4501 42629,-4505 45629,-4503 45630,-4499 45631,-4496 45630,-4497 45628,-4495 45630,-4494 46630,-4491 46634,-4487 46629,-4483 46631,21336 40532,21341 40533,21346 40534,21346 40536,21345 40536,21346 40536,21345 40536,21344 40538,21347 40543,21348 40543,21351 40540,21351 40542,21348 40545,21351 40546,21352 40546,21353 40546,21358 40546,21359 40545,21359 40550,21357 40555,21362 40560,21364 40555,21363 40555,21364 40560,25364 40564,25365 40566,25368 40566,25371 45566,25372 45567,25372 45562,25376 45564,25381 42564,25385 42560,25389 42564,25389 42568,25393 42572,25390 42572,28390 42569,28389 42570,28385 42574,28386 42576,28389 42577,31389 42578,31385 42582,31387 42582,31390 42578,31391 42579,31392 42576,29392 42580,29396 42582,29398 43582,29402 43584,29406 43585,29407 43587,29411 43592,29413 43594,29414 43595,25414 43600,25412 43595,25415 43599,25420 43602,25418 43604,25423 43599,25426 43599,25429 43602,25434 42602,25429 42604,25432 42600,25435 42605,25436 47605,25440 50605,25441 50610,25439 50614,25444 50617,25447 50621,25444 50624,25444 50626,25445 50627,25450 50632,25450 50628,25451 50630,25451 50632,25454 50633,25458 50637,25462 50641,25463 50640,25463 51640,25467 51644,25469 51649,25473 51650,25474 51653,25475 51654,26475 51658,26475 51662,26474 51665,26476 51665,26481 51661,26483 55661,26485 55664,30485 55667,30485 55670,30489 55671,30489 55668,30491 55670,30492 55670,30493 55675,30497 55675,30501 55671,30503 55676,30500 55677,30498 55672,30494 55675,30499 55676,30500 55676,30505 55681,30501 55684,30496 55685,30500 55685,30502 55687,30506 55692,30507 55693,30506 55692,30511 55693,30516 55694,30514 55699,30514 55701,30512 55701,34512 55705,34516 55708,34520 55704,34518 56704,34519 56704,34520 56706,34517 56706,34515 56701,34519 59701,34522 59706,34522 59708,34522 59713,34526 59715,34528 59717,34533 59712,34538 59715,34538 59717,34541 59717,34546 59720,34548 59721,34552 63721,34547 63726,34549 63728,34554 63726,34556 63726,34557 63721,34556 63725,34561 63730,34558 63730,37558 63725,37561 63729,37565 63724,37569 63720,37573 63718,37578 63722,37577 63718,37579 63720,37579 63722,37580 63719,37580 63720,37579 63724,37574 63725,37574 63727,37576 63725,37581 63729,37583 63732,37586 63732,37590 63737,37592 63734,37597 63731,37600 63730,37596 63731,37596 63733,37600 63733,37601 63735,37596 63735,37591 63732,37596 63733,37601 63738,37602 63733,37599 63738,37594 63740,37598 63744,37603 63745,37605 63747,37607 63752,37607 63756,37603 63757,37603 63761,37604 63761,37608 63758,37609 63762,37604 63764,37604 63764,41604 63765,41600 63761,41599 63761,41600 63766,41596 63766,41599 63766,41601 63770,41604 63768,41608 63768,41611 63772,41614 63767,41609 63763,41612 63765,41615 63760,38615 63764,38615 63768,38618 63768,35618 63769,35618 63774,35617 63775,35618 63776,35613 63775,35615 63780,35612 63782,35613 63779,35614 63775,35618 63774,35619 63776,35624 63778,35624 63780,35629 63785,35629 63780,35626 63781,35624 63782,35629 63784,35634 63787,35638 63782,35634 63783,35634 63778,35633 63777,35638 63782,35641 63786,35644 63791,35648 63793,35647 63793,35649 63797,35653 63801,35654 63804,35654 63804,35656 63804,35655 63806,35658 63810,35658 63805,35662 63805,35657 67805,35658 67808,35660 67811,35664 67808,35660 67803,35658 67803,35661 67803,35663 67808,35666 67810,35670 67814,35669 67813,35669 67816,37669 67820,37664 67820,2275 13363,2278 16363,2274 16363,2275 16362,2279 16362,2282 16362,2287 16366,2284 16366,4284 16366,4286 16371,4290 16375,4294 18375,4295 18377,9295 18381,9296 18381,9299 18382,9303 18379,9305 19379,9308 19375,8308 19380,8312 19380,38746 37651,38749 37652,38754 37653,38757 37656,38753 37661,38753 37661,38758 37663,38763 37664,38763 42664,38768 42666,38765 42668,38770 42664,38767 42659,38768 42659,38773 42654,38771 42659,38775 42661,41775 42663,41778 42665,41781 42669,41782 42667,41779 42669,41784 42672,41781 42672,41783 42672,41780 42672,41783 42675,41784 42675,41788 42676,41792 42677,41792 42675,41793 42680,41793 42676,41796 42681,41801 42685,41804 42684,41806 42685,41804 42690,41802 42692,41805 42696,41800 42697,41802 42698,41804 42700,41809 42704,41813 42705,36813 42708,36813 42704,36810 42703,36811 42705,40811 42706,40815 46706,40816 46708,40820 46708,40818 46712,40822 46717,40825 46720,40829 46724,40827 46727,40831 46727,40833 46731,40829 46733,40830 46733,36830 46738,36830 46741,36834 46744,36831 46749,36826 46748,36822 46748,36824 46751,36819 46755,36823 46758,36823 46762,36824 46766,36822 46769,36826 46772,36831 46774,36828 42774,36833 42776,36833 42777,36838 42782)'))); @@ -42,13 +42,13 @@ SPATIAL KEY (g4), SPATIAL KEY (g5), SPATIAL KEY (g6) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; DROP TABLE t1,t2; CREATE TABLE t1 ( p INT NOT NULL AUTO_INCREMENT, g LINESTRING NOT NULL, PRIMARY KEY(p) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; ALTER TABLE t1 ADD SPATIAL INDEX spatial_idx (g); INSERT INTO t1(g) VALUES(ST_linefromtext('linestring(-5 -576,0 -576,0 -571,0 -571,5 -568,6 -564,6 -565,6 -563)')); INSERT INTO t1(g) VALUES(ST_linefromtext(concat('linestring','(18 106,19 106,24 111,27 108,32 104,37 107,42 107,44 112,44 116,40 118,43 114,46 114,42 118,44 123,45 123,49 123,53 119,50 123,50 124,54 126,58 125,59 126,64 127,65 127,69 131,74 132,75 135,78 139,2078 141,2075 143,2077 143,2079 143,2084 143,2085 147,2090 -1853,2086 -1852,2086 -1856,2089 -1852,2093 -1850,2090 -1851,2090 -1852,2091 -1851,2092 -1850,2097 -1847,2102 -1848,2100 -1852,2100 -1852,7100 -1851,7103 -1850,7104 -1847,7109 -1842,65 127,67 131,66 131,61 132,61 133,62 137,65 1137,2065 1135,2061 1135,2064 1135,5064 1135,5066 1135,5070 1136,5070 1141,5071 1138,5074 1141,5075 1141,5074 1137,5076 1137,5071 1139,5066 1142,5065 2142,5068 2147,5073 2151,5069 2156,5071 2157,5072 2162,5074 2165,5069 2169,5072 2169,5076 2173,5074 2169,5078 2169,5076 2170,76 2175,74 2179,75 2184,80 2188,83 2190,87 2189,84 2193,87 2189,86 2190,87 2195,87 2200,87 1200,85 1202,86 1199,87 1200,87 1201,91 1206,92 1204,94 1204,98 1206,102 1208,105 1211,102 1216,105 1220,109 1224,110 1224,114 1225,117 1224,118 1229,117 1232,122 1237,123 1236,120 1235,124 1237,121 1236,122 1240,126 1244,127 1246,126 1249,125 5249,123 5251,127 5251,131 5251,135 5256,138 5257,135 5257,139 5257,138 5258,141 5260,146 5260,146 5260,143 10260,147 10265,151 10270,156 10266,157 10269,162 10273,166 12273,168 12274,163 12270,168 12275,170 12277,170 12277,-3830 12277,-3825 12277,-3824 12278,-3825 12276,-3825 12278,-3822 12277,-3825 12275,-3829 12278,-3828 12275,-3824 12280,-3827 12280,-3826 12282,-3822 12283,-3822 12286,-3820 12288,-3818 12289,-3816 12294,-3817 12297,-3819 12300,-3816 12297,-3813 12295,-3811 12299,-3811 12297,-3806 12298,-3806 12298,-3804 12301,-3801 12306,-3803 17306,-3803 17306,-3798 17306,-3803 17310,-3801 17314,-3798 17317,-3797 17317,-797 17321,-797 17323,-796 17325,-793 17326,-792 17322,-789 17327,-784 17331,-780 17335,-776 17339,-774 17339,-771 17342,-770 17345,-765 17348,-765 17349,-763 17353,-760 17350,-760 22350,-756 22346,-752 22349,-748 22352,-752 22348,-748 22347,-746 22345,-745 27345,-743 27346,257 27350,260 27349,261 27352,266 27348,266 22348,269 22347,271 22347,272 22347,273 22348,273 22352,278 22348,279 22344,282 22345,282 22342,283 22347,283 22347,288 22349,292 22347,292 22348,293 22348,298 22348,303 22351,306 22352,309 22352,308 22354,310 22356,311 22361,311 22358,311 22360,311 22360,315 22356,320 22358,325 22363,326 22366,321 22371,318 22373,318 22375,314 22375,316 22375,321 22376,321 22376,322 22372,32 104,36 109,40 114,40 113,40 117,44 119,49 123,49 126,49 129,53 133,50 137,50 139,49 137,48 138,43 138,42 139,46 142,46 138,41 139,45 141,4045 5141,4045 5146,4042 5147,4043 10147,4041 10150,4042 10152,4045 10152,4041 10156,4041 10152,4041 10152,4046 10153,4049 10156,4046 10155,4051 10157,4055 10159,4055 10160,4056 10161,4055 10166,4054 10169,4054 10172,4054 15172,4051 15176,4047 15177,4049 15174,4047 15176,4047 15176,4046 15177,4046 15180,4043 15184,4043 15187,4038 15190,4040 15194,4040 15199,4045 15196,4047 15197,4050 15200,4050 15204,4050 15208,4047 15212,4047 15215,4049 15216,4046 15218,4042 15223,4042 15228,4042 15232,4047 15235,4050 15236,4050 15239,4051 15243,4053 15243,4050 17243,4052 17243,4052 18243,4057 18247,4061 18249,4064 18249,4067 20249,4067 20250,4067 20255,4066 20259,4066 20259,4067 20255,4069 20256,4071 20258,4072 20254,4067 20257,4067 20260,4069 20265,4065 20267,4069 20266,4070 20267,4071 20264,4074 20259,4070 20264,4073 20260,4074 20263,4077 20268,4082 20271,4084 20273,4084 20277,4081 18277,4085 18279,4086 18276,4087 18273,4087 18275,4092 18277,4093 18279,4093 18280,4095 18280,4091 18283,4092 18281,4094 18283,4090 18287,4094 18287,138 5257,138 5255,138 5258,-1862 5254,-1860 5256,-1856 5258,-1851 5255,-1850 5260,-1847 5260,-1847 5263,-1847 5258,-1850 5257,-1850 5259,-1851 5257,-1855 5258,-1853 5261,-1849 5261,-1849 5258,-1849 5259,-1845 5264,-1847 5264,-1850 5268,-1852 5266,-1853 5270,-1856 5265,-1852 5262,-1847 5263,-1842 5263,-1842 5260,-1842 5265,-1841 5265,-1844 5265,-1842 5270,-1837 5274,-1838 5279,-1843 5275,-1842 5280,-1838 5281,-1838 5285,-1833 5285,-1828 5288,-1824 5289,-1828 5291,-1831 5291,-1826 5291,-1830 5293,-1826 5296,-1822 5301,-1826 5302,-1826 5302,-1826 5302,-1825 5297,-1820 5299,-1816 5303,-1816 5299,-3811 12299,-3809 12302,-3806 12302,-3806 12302,-3803 12304,-3798 12304,-3797 12304,-3793 12306,-3788 12306,-3783 12309,-3816 12294,-3811 12299,-3809 12297,7100 -1851,7098 -1854,7102 -1854,7107 -1856,7107 -1858,7110 -1854,7110 -1851,7113 -1851,7115 -1851,7120 -1851,7123 -1847,7124 -1852,7125 -1852,7127 -1852,7131 -1852,7129 1148,7129 1145,7133 1150,7137 1148,7138 1147,7143 1149,7147 1154,8147 1155,8152 3155,8147 3157,8143 3158,8144 3160,8144 3164,11144 3167,11146 3167,11148 3163,11152 3161,11148 3159,11149 3163,11150 3161,11151 3166,11154 3171,11154 3170,8144 3160,8144 3163,8144 3166,8145 3166,8146 3171,8146 3174,8144 3174,8144 3174,8145 3176,8141 3180,3141 3182,7141 3183,7141 7183,7136 7185,7136 7185,7133 7187,7136 7187,7131 7190,7136 7194,7137 7197,7141 7196,7139 7199,12139 7200,12143 7200,12143 7199,12144 7203,12145 7200,12141 7200,12136 7195,12136 7191,12137 7191,12137 7196,12139 7197,12140 7197,12137 7201,12140 7204,12140 7209,12143 7209,12145 7210,12147 7214,12148 9214,12152 9218,12149 9218,12149 9221,12149 9220,12150 9222,12153 10222,12153 10226,12156 10227,12159 10223,12160 10220,12161 10225,12161 10227,12163 10224,12163 10223,12158 10224,12158 10227,12158 10231,12155 12231,12157 12226,7136 7185,7139 7189,7139 7189,7139 7188,7137 7191,7139 7191,7140 7189,7143 7191,7144 7189,7144 7190,7149 7193,7152 7194,7154 7198,7153 7203,7148 7207,12148 7209,12146 7209,12145 7213,12140 7217,12139 7219,12141 7219,12138 7218,12143 7218,13143 7220,13140 7224,13142 7228,13137 7231,13142 7235,13146 7239,13149 7243,13148 7247,13150 7248,13155 7249,13155 7253,13155 7253,13155 7258,13157 7260,13162 7255,13159 7255,13163 7258,13164 7258,13164 7263,13167 7264,13167 8264,13165 8265,13169 8265,13171 13265,13175 13261,13176 13259,13176 13259,13180 13262,13181 13262,13183 13262,13188 13265,13191 13267,13191 13265,13194 13267,13191 13269,13192 13264,13196 13269,13198 13272,13200 13272,13202 13270,13207 11270,13211 11270,13211 11273,13213 11274,13217 11275,13222 11276,13222 11272,13226 11274,13231 11277,13233 11282,13236 11284,13238 11284,13236 11286,13236 11288,13236 11283,13236 11284,13238 11289,13241 11292,13244 11292,13245 11289,13241 11294,13244 11298,13249 11301,320 22358,324 24358,328 24358,327 24363,326 24359,327 24361,329 24365,334 24367,-666 24367,-670 24368,49 123,46 127,46 129,49 131,49 136,47 135,45 138,3045 135,3042 138,3044 139,3044 144,3049 144,3053 142,3055 137,3058 136,3053 139,3048 142,7048 138,7048 3138,7048 3139,7048 3140,7050 3145,7053 1145,7050 1146,7053 5146,7048 5150,7047 5146,10047 5147,10043 5147,10047 5147,10050 5152,10052 5155,10054 5156,10056 5157,10056 5159,10058 5162,10062 5164,10062 5169,10066 9169,10068 9168,10063 9164,10063 9169,10061 9171,14061 9172,14061 9174,282 22342,287 22347,288 22347,288 22343,285 22339,280 22338,278 22341,279 25341,284 25343,13241 11294,13246 11296,13243 11296,13244 11291,13245 11291,13244 11291,13246 11295,13251 11300,13253 11305,13253 11306,13258 11305,13255 11306,13256 11309,13256 11311,13261 11307,13265 11303,13267 11305,13270 11301,13275 11298,13271 11300,15271 11302,15276 11306,15279 11303,15284 11305,15286 11305,15289 11307,15290 11302,15292 11305,15296 11309,15297 11313,15298 11316,15300 11317,15304 11320,15306 11324,15306 11320,15307 11320,15312 11320,15313 11319,15317 11317,15315 11321,15317 11323,15317 11328,15319 11333,15322 11336,15322 11337,15322 11337,15324 11341,15324 11345,15325 14345,15328 13345,17328 13346,17333 13349,17337 13354,17338 13358,17342 13358,17346 13353,17348 13353,17345 13353,17348 13354,17347 13354,17347 13354,17347 13355,22347 13358,22349 13355,22351 13355,22356 13354,22358 13354,22361 13355,22362 13355,22358 13355,22359 13359,22364 13364,22369 13369,22372 13373,22376 13371,22377 13371,22377 13369,22381 13374,22386 13379,22387 13376,22387 13380,22392 13378,22390 13374,22392 13378,22391 13378,22391 13375,22392 13378,22390 13380,22393 13382,22398 13387,22398 10387,22402 10391,22399 10392,22400 10392,22400 10394,22404 10391,22403 15391,22405 15392,22407 15392,22412 15387,22412 15390,22412 15394,22408 15396,26408 15398,26407 20398,26411 20402,26415 20406,26417 20411,26420 20407,26422 20407,31422 16407,31421 16405,31421 16410,31423 16410,31426 16414,31426 16410,31430 16415,31430 16418,31435 16419,31437 16420,31438 16422,31438 16425,31438 16425,31441 16427,31439 16431,31441 16436,36441 16436,36443 18436,36442 18437,36440 18440,36440 18436,36440 18440,36442 18445,36443 18446,36447 18451,37447 23451,37452 23456,37456 23455,37458 23459,37456 23461,37458 23463,37460 23466,37464 23469,37460 23474,37462 23476,37461 26476,37466 26479,37470 26483,37471 26488,37474 26489,37474 26485,37474 26483,37474 26488,37470 26492,37474 26497,37474 26499,37478 26495,37483 26499,37483 26501,37488 26496,37491 26499,37495 26495,37500 26496,37500 26497,37500 26501,37497 26499,37497 26499,37495 26504,37498 26504,37494 26509,37497 26514,37495 26515,37498 26514,37503 26514,37508 26512,37510 26516,37511 26519,37509 26523,37506 26528,37507 26532,37512 26536,37513 26538,37510 26542,37512 26544,37517 26543,37522 26546,37527 26551,37525 26555,37529 26558,37524 26563,37524 26562,37527 26562,37522 26562,37522 26559,37526 26561,37522 26559,37523 26561,37523 26556,37524 26558,40524 26560,40524 26563,40521 26567,40525 26566,40527 26568,40532 26572,40534 26569,40533 26565,40531 26565,40535 26569,40535 26570,40539 26572,40544 26575,40543 26575,40544 26579,40548 26584,40549 26581,40553 26585,40556 26590,40552 22590,40557 22594,40556 22595,40561 22592,40561 22593,40565 22593,40568 22593,40573 22588,40570 22590,40570 22591,40570 22588,40573 22590,40573 22593,40568 22593,40567 22597,40567 22599,40571 22599,40574 22600,40574 22604,42574 22607,42577 22607,42577 22612,42579 22616,38579 22619,38580 22617,38580 22614,38575 22619,38579 22619,38579 18619,38582 18614,38582 18617,38586 18622,38590 18625,38590 18622,38594 18621,38596 18616,38597 18614,38597 18618,38600 21618,38601 21618,38605 21620,38607 25620,38611 25620,38608 25617,38608 25621,38608 25625,38611 25623,38615 25623,38615 25620,38616 25622,38619 25624,38620 25625,38620 26625,38623 26627,38623 26627,311 22358,311 22359,-1689 22360,2311 27360,2312 27360,2312 27360,2317 27362,2317 27362,2319 27359,2319 27364,2318 27359,2321 27364,2326 27367,2325 27371,2326 27373,2326 27373,2325 27377,2329 27377,2327 27377,2330 27379,2333 27379,2331 27379,2331 27381,2336 27381,6336 27382,6336 27383,40527 26568,40531 26572,40533 26574,40538 26576,40533 26580,40538 26585,40539 26588,40536 26583,40540 26587,40539 26588,40535 26593,40540 26594,40544 26597,40548 26602,40548 26601,40549 26602,40547 26602,40548 26603,40553 26606,40548 26606,40548 26603,40551 26608,40556 26612,40559 26616,40554 26619,40556 26619,40556 26623,42556 26623,42556 26624,42560 26624,42562 26626,42563 26630,42564 26630,42564 26634,42559 26635,42562 26635,42565 26637,42562 26638,42564 26642,42564 26641,42568 26641,42572 26641,42572 29641,42574 29642,39574 29641,39574 34641,39576 34643,39581 34638,39578 34638,39574 34642,39574 34645,39572 35645,34572 35648,34577 35651,39577 35655,43577 35659,43580 35655,43575 35658,43578 35658,43581 35662,43577 39662,43572 39658,43572 39661,43572 39664,43572 39666,43576 39670,43577 39667,43580 39671,43576 39673,43573 39673,43574 39677,43569 39679,43567 39679,43568 39683,43563 39686,43566 39690,43566 39692,43568 39694,43568 39695,41568 39691,41570 39692,41571 39692,41571 39693,41571 39698,41571 39698,41574 39698,41569 39698,41570 39699,41570 39704,41572 39709,41573 39712,41578 39713,41579 39717,41584 39719,41585 39720,-1850 5268,-1845 5268,-1847 5266,-1842 5268,-1840 5263,-1845 5264,-1843 5264,-1839 8264,-1839 8267,-1839 8272,-1838 8276,-1834 8273,-1834 8273,-1833 8274,-1837 8279,-1836 8283,-1834 8286,-1836 8282,-1834 8279,-1835 8279,-1834 8280,-1836 8283,-1841 8288,-1846 8289,-1843 8286,-1838 8286,-1841 8285,-1838 8285,-1834 8288,-1829 8291,-1825 8286,-1825 8289,-1825 8287,-1824 8291,-1822 8294,-1821 8298,-1818 8300,-1818 8296,-1814 8296,-1811 8295,-1808 8292,1192 8296,1192 8297,1195 11297,1192 11301,1195 11305,1197 11300,1193 11300,1193 11296,1193 11293,1194 11294,1199 11292,1204 11292,1205 11294,1210 11292,1208 11288,1204 11290,1205 11289,1207 8289,1202 8284,1204 8282,1204 8281,1206 8281,1208 8281,1212 8283,1212 13283,1213 13287,1213 13290,1216 13293,1214 13289,1217 13286,1212 13291,1208 13288,1208 13292,1209 13297,1208 13296,1204 13298,1205 13303,1209 13308,1204 13308,1209 13304,1210 13304,1214 13309,1214 13314,1215 13314,1219 13314,1219 13319,1224 13320,1229 13321,1232 13325,1233 13329,1231 13329,1234 13334,-2766 13336,-2769 13337,-2765 13340,-2762 13345,-2760 13342,2240 13342,2238 13342,2242 13342,2246 13345,2246 13346,2244 13348,2239 13348,2240 13351,2240 13352,2245 13357,2248 13357,2243 13362,2247 13362,2248 13362,2252 13363,2256 13363,2256 13363,2260 13367,2255 13372,2251 13369,2251 13369,2252 13372,2249 13376,2254 13378,2255 13382,2259 13379,2262 13379,2267 13381,2262 13381,2262 13383,2265 13383,2269 13385,2270 13386,2271 13389,2267 13391,2271 13386,2275 13391,2273 13392,2275 13387,2277 13390,2274 13390,2275 13394,2280 13395,2280 11395,2281 14395,2279 14400,2277 14403,2273 14406,2274 16406,2274 16410,2279 16410,2284 16411,2280 16409,2280 16409,2282 16409,2282 16411,2282 16412,2280 16413,3280 16418,3284 16418,3285 16423,3289 16423,3292 16427,3294 16429,3296 16431,3297 16436,3298 16435,3303 16435,3305 16434,3305 16436,3305 16436,3309 16437,3309 16438,3308 16439,3308 16439,3306 16444,3302 16441,-1698 16437,-1703 16438,-1699 16438,-1697 16438,-1698 16439,-1695 16436,-1690 16441,-1687 16446,-1683 16450,-1682 16451,-1684 16453,-1682 16457,-1682 16457,-1686 16460,-1681 16459,-1680 16456,-1677 16460,-1681 16461,-1679 16464,-1674 16465,-1673 16469,-1669 16471,-1669 16476,-1665 16474,-1665 16478,-1664 16478,-1664 16479,-1661 16474,-1656 16471,-1655 11471,-1660 11473,-1663 11475,-1666 11480,3334 15480,3338 15476,3342 15471,3345 15471,3345 15470,3350 15469,3347 15474,3351 15476,3352 15473,3353 15476,3350 15477,3350 15479,3351 15482,3352 15484,3351 15487,3353 15487,3358 15487,3353 15486,1217 13286,1222 13291,1222 13291,1225 13286,1229 13286,1231 13281,1235 13280,1236 13281,1241 13282,1245 13285,1247 13285,1247 13287,1250 13287,1247 13290,1247 13295,1247 13298,1252 13301,1249 13304,1252 13304,3252 13304,3247 13304,3249 13308,3254 13308,3257 13308,3261 17308,3261 17309,3261 17306,3259 17305,3262 17310,3263 17308,3262 17311,3259 17314,3259 17314,3257 17309,3254 17309,3253 17309,3255 17310,3253 17312,3255 17312,3255 17312,3256 17307,3257 17307,3256 17311,3256 17313,3255 17317,3251 17317,3248 17321,3253 17325,3256 17326,3258 17324,3258 17327,3263 17322,7263 17325,7265 17328,7263 17330,7265 17333,7270 17333,7273 17333,7278 17336,4278 21336,4278 21340,4279 21340,4281 21340,4286 24340,4290 24343,9290 24347,9294 24349,9296 24347,9298 25347,9301 25348,9301 25348,9304 25353,9303 25357,9303 25352,11303 25355,11304 25358,11307 25358,11312 25358,11312 25361,11310 25365,11313 25365,11314 25369,11319 25371,11321 25371,11325 25366,11329 25365,11330 25366,11329 25370,11330 25365,11334 25367,11338 25366,11343 25363,11348 25359,11345 25356,11348 25357,11349 25358,11349 25358,11352 25360,11356 30360,11360 30365,11360 30365,11362 30365,11367 30367,11368 30369,15368 30370,15373 30371,15376 30373,14376 30378,14377 30383,14381 30378,14386 30380,14388 30382,14391 30385,14393 31385,16393 31389,16396 31394,16396 31397,16392 31400,16395 31405,16398 31409,16398 31413,16397 31415,16396 31417,16401 31418,16401 31422,16402 31419,16407 31420,16411 31419,16406 31423,18406 31427,18411 31432,18415 28432,18417 28437,18418 28441,18414 28438,18417 28435,18416 28439,18420 28442,18423 28447,18427 28444,21427 28445,21428 28450,22428 28455,22432 28457,22436 28458,22441 28458,22445 28463,22448 28468,22451 28465,22456 28468,22453 28468,22458 28471,22463 28473,22460 28475,22459 28472,22463 28476,22464 28472,22468 28468,22468 28471,25468 28466,25471 28468,25473 28464,25473 28464,25475 29464,25476 29466,25479 29461,25476 29462,25476 29464,25478 29464,25483 29461,25484 29460,25486 29458,25486 29462,25490 29460,25495 26460,25498 26463,25495 26468,25495 26472,25495 26472,25499 26474,25504 26476,25504 26478,25509 26476,25513 26479,25514 26481,25519 26477,25519 26480,25518 26481,25519 26484,25524 26483,25527 26484,25522 26484,25526 26487,25528 26492,25533 26496,25535 26498,25535 26498,25539 26503,25542 26504,25543 26505,25547 26510,25552 26510,25551 26508,25550 26512,25553 26510,25557 26510,25554 26511,25552 26508,25556 26505,25556 26506,25560 26506,25560 26507,25560 26506,25565 26501,25567 26504,25569 26504,25568 26508,25571 26508,25571 26511,25576 26511,25581 26516,25581 26519,25582 26521,25585 26522,25588 26527,25588 26526,25584 26530,25587 26534,25589 26529,25593 26533,25598 26538,25599 26540,25599 26540,25599 26540,25604 26543,25603 26543,25603 26538,25606 26538,25609 26540,25611 26542,25612 26547,25612 26547,25612 26548,25617 25548,25612 25548,25613 25547,25616 25545,25616 25549,25618 25551,25620 25555,25620 25551,25622 25550,25625 25551,25622 25555,25619 25557,25617 25556,25622 28556,25625 28551,25630 28546,25634 28548,25639 28553,25643 28553,25638 25553,25634 25553,25634 25557,25639 25557,25643 25558,25644 25553,25646 25556,25647 25560,25650 25562,25650 30562,25650 30562,25650 30564,25650 30566,25652 30570,25656 30571,25661 31571,25662 31575,25663 31579,25662 31579,25665 31581,25666 31584,25671 31582,25674 31581,25674 31584,25676 31584,25673 31587,25678 31586,25679 31581,30679 31584,30675 31589,30680 31590,35680 31590,35675 31589,35677 31591,35680 31590,35681 31587,35684 31588,35685 31589,35689 31592,35689 31593,35692 31597,35696 31597,35700 34597,35699 34599,35703 34604,35703 34606,35702 34601,35705 34603,35705 34606,35708 34603,35713 34604,35717 34603,35719 34608,35715 34608,35711 34608,35713 34609,35714 34605,35714 34610,35714 34614,35718 34616,35719 34617,35722 34618,35722 34621,35725 34625,35725 34626,35725 34629,35725 34631,35725 34635,35730 34636,35727 34638,35731 34640,35735 34642,35739 34645,35741 34645,35742 34649,35738 34649,35738 34645,35741 34647,38741 34650,38741 37650,38742 37646,38746 37651,38749 37652,38753 37653,38753 37657,38757 37656,38756 37660,38761 37660,38765 37660,38760 37660,38759 37660,38760 41660,38760 41660,38762 41665,38757 41667,43757 41669,43752 41674,43752 41677,43757 41672,43758 41677,45758 41680,45758 41679,45762 41683,45765 41683,45769 41683,45770 41684,45768 46684,45773 46688,45776 46692,45774 46694,45775 46697,45778 46695,45776 46698,45774 46702,45779 46702,45784 46704,45787 46706,45791 46711,45786 46707,45790 46711,45793 46715,45796 46719,45799 46724,45797 46728,45802 46726,45797 46729,45801 46733,45802 46733,45803 46732,45804 46732,45805 46732,45808 46735,45810 46740,45810 46744,2326 27373,2322 27377,2323 27379,2325 27383,2325 27382,2322 27382,2323 27382,5323 23382,5325 23385,5329 23386,5330 23390,5335 23392,5330 23392,5330 23395,5329 23395,5333 23399,5333 23402,5338 23405,5339 23405,5334 23406,5329 23401,5332 23403,5330 23407,5333 23409,5328 20409,5324 20411,5324 20414,5329 20416,5328 20421,5325 20421,5329 20424,5330 20424,5335 21424,5331 21427,5333 21431,5334 21433,5329 21434,5330 21437,5333 21440,5338 21437,5338 21440,5334 21441,5333 21438,5329 26438,5332 26435,5335 26439,5337 26440,5338 26444,5342 26439,5342 26442,5345 26440,5349 26438,5352 26442,5349 26445,5348 30445,5350 30447,5350 30444,5354 30444,5359 30443,5363 30445,5367 30446,5367 30448,5367 30453,5371 30455,5371 30453,5373 30458,5375 30461,5380 30463,5384 30463,5383 30459,5384 30459,5383 30459,5385 30460,5390 30459,5392 30464,5394 30464,5389 30465,5393 30469,5391 30469,5391 30469,5395 30474,5396 30470,5399 30470,5401 30467,5401 30468,5404 30470,5400 30465,5401 30462,5403 30467,5404 30467,5409 30469,5412 30473,5412 30477,5407 30481,8407 30486,8408 30489,8410 30490,8410 30489,8413 30490,8414 30493,8414 30496,8419 30501,8420 30502,8415 30507,13415 30509,13411 30506,13414 30507,13412 30511,13412 30515,13417 30518,13419 30523,13418 30527,13422 30529,13418 30531,13413 35531,13409 35531,13413 35532,13417 35537,13419 35533,13423 35529,13424 35529,13423 35524,13428 35525,13433 35526,13438 35530,13443 35531,13448 35531,13452 35532,13455 35536,13457 35536,13452 35536,13455 35539,13452 35535,13457 35540,13457 35544,18457 35546,18460 35547,22460 35546,22465 35550,22466 35554,22468 35552,22473 35555,22471 35559,22470 35564,22472 35564,22470 35569,22474 35569,22474 35571,22477 35573,22482 35576,22487 35580,22488 35583,22489 35585,22493 35585,22496 35585,25496 35586,25493 35582,25494 35585,25498 35585,25496 35585,25498 35587,25503 35591,25503 35593,25499 35590,25499 35591,25495 35591,26495 35595,29495 35591,29495 35593,29498 35597,29498 35601,29500 35606,29501 30606,29502 30603,29505 30603,29510 30606,29511 30606,29514 30607,29516 30610,29518 30608,3259 17305,3263 17304,3267 17303,3271 17308,3269 17312,3269 17313,3274 17315,3277 17315,3282 17311,3285 17313,3283 17309,3278 17310,3275 17315,3275 17317,3276 17322,3280 17324,3280 17324,3276 17325,3277 17325,3276 17328,3278 17324,3273 17329,3277 17331,3280 17326,3281 17328,3276 17324,3277 17324,3277 17322,3277 17321,3277 17321,3281 17323,3282 17327,3282 17332,3287 17335,3288 17335,3288 17338,3290 17337,3294 17340,3294 17341,3299 17341,3299 12341,3299 12342,3304 12339,3301 14339,3305 14340,3307 14341,3311 14343,3313 14343,3314 16343,3310 16341,3310 16346,3312 16348,3311 16349,4311 16346,4316 16348,4321 16344,4324 16348,4322 16349,4323 16346,4323 16346,4326 16350,4322 16354,4323 16356,4325 16361,4325 16358,4322 16362,4325 20362,4325 20366,4322 20367,4326 20372,4326 20374,4331 20373,4333 20373,4338 20376,4339 20379,4341 20382,4338 20384,4339 20386,4340 20383,4340 20383,4335 20388,4336 20390,4341 20390,4346 20391,4348 20391,4349 20393,37497 26499,37494 26496,37496 26500,37496 26501,37499 26506,37497 26502,37498 26502,37500 29502,37500 29507,37505 29508,37506 33508,37508 33513,37513 33518,37517 33522,37516 33520,37521 33521,37521 33525,37516 33530,37519 33528,37520 33528,37524 33530,37527 33530,37525 33527,37528 33530,37533 33533,37534 38533,37536 38536,22358 13355,25358 13360,25361 13358,25362 13362,25362 13362,25365 13365,25363 13367,25359 13369,25357 13374,25360 13374,2247 13362,2252 13366,2254 13363,2257 13363,2261 13358,2264 13354,2264 13356,2269 13361,2272 13363,2274 13363,2275 13363,2273 13362,2274 13365,2278 13365,2280 13370,2284 13366,2284 13365,2289 13368,2290 13366,2293 13368,2298 13373,2298 13372,2295 13375,271 22347,273 22350,4273 22347,4269 22348,4270 22350,4271 22355,4272 22360,4276 22363,4281 22365,4284 24365,4279 24365,4282 24365,4285 24365,4287 24364,4289 24362,4294 24360,4295 24362,4298 24365,4301 24369,1301 24370,1301 24371,1305 24375,1305 24376,1307 24377,1312 24380,1314 24382,1318 24380,1316 24382,1316 24387,1318 24387,1318 29387,1321 29387,1316 29383,1320 29386,1321 29389,1326 29389,1327 29389,2327 29394,2327 29394,2332 29393,-666 24367,-663 24368,-661 24368,-656 24371,-653 24372,-649 24372,-647 24374,-643 24370,-638 24375,-635 24380,-638 24382,-638 24384,-638 24384,-636 24388,-637 24390,-632 24386,-630 24386,-629 24386,371 24389,376 24394,374 24392,377 24397,3377 24400,6377 24405,6378 24408,6373 24406,6370 24406,6375 24403,6370 24403,6375 24403,6379 24406,6374 24409,6378 24411,6380 24412,6378 24415,6378 24419,6383 24423,6385 24425,6387 24428,6390 24433,6386 24430,6386 24435,6387 24436,6388 24440,6387 24444,6383 29444,6383 29447,6386 29451,6382 29446,6387 29447,6390 29452,6393 29452,6397 29455,6400 29459,6400 29463,6397 29467,6393 29467,6395 29470,6397 29473,6399 29468,6394 29467,6397 29470,6396 29473,6396 29470,6393 29465,6389 29469,6390 29470,6389 29465,6389 29468,6392 29470,6388 33470,6390 33466,6391 33466,6392 33467,6394 33467,322 22372,322 22374,323 22377,327 22378,331 22382,330 22383,332 22386,333 22383,331 22383,330 22387,332 22391,332 22396,337 22397,339 22394,340 22399,340 22398,340 22396,343 22396,343 22396,341 22400,342 22404,343 22402,348 22403,345 22407,347 22411,342 22411,345 22413,340 22417,345 22417,348 22422,348 22426,351 22427,352 22432,352 22436,4352 22438,4353 22442,4354 22444,4354 22447,4357 22449,4360 22450,4364 22450,4367 22451,4369 22453,4366 22455,4369 22453,4373 22458,4377 22459,4380 22459,4380 22464,4385 22467,4385 22467,4390 22469,4385 22469,4385 22472,25571 26508,25574 26507,25578 26512,25581 26512,25581 26512,25583 26508,25583 26513,25587 26516,25589 26515,25590 26515,25591 26517,25589 26520,25587 26522,23587 26526,23585 26531,23589 26534,23592 26538,24592 26543,24588 26545,24593 26547,24598 26543,24598 26548,24602 26545,24598 26540,24600 26545,24600 26548,24600 31548,24605 31549,24608 31551,24613 31552,24615 36552,24616 36557,24619 36557,24622 36560,24622 36564,24627 35564,24627 35569,24632 35569,25632 35570,25635 35569,25636 35573,25636 35573,25638 35576,25641 35580,25641 35583,25641 35588,25642 40588,20642 40593,20645 40593,20650 40595,20651 40591,20651 40594,20648 40591,20648 40591,20652 40596,20652 40596,20656 40597,20656 40600,20656 40601,20659 40598,20662 40597,20662 40597,20663 40600,20668 40601,20665 40606,1215 13314,1214 13319,1212 13317,1209 13312,1210 13312,1211 13317,6211 13320,6214 13320,6216 13320,6211 13323,6214 13318,6214 13323,6214 13324,6216 13319,6219 13323,6218 13321,6219 13321,6218 13326,6221 13329,6225 13331,6230 13335,6231 13339,6231 13343,6235 13338,6234 13342,6234 13344,6236 13345,25524 26483,25521 26484,25524 26489,25527 26487,25529 26484,25530 26482,25534 27482,25539 27486,25537 27488,25541 27483,25544 27486,25547 27490,25550 27491,25550 27491,25554 27486,25559 27486,25563 27489,25561 27489,25563 27493,25561 27491,25563 27493,25563 27495,25564 27497,25563 27497,25563 27497,25558 27498,25563 27499,25565 27503,25567 27503,25569 27503,25567 27504,25565 27505,25565 27505,25565 27505,25566 27505,25570 27501,25570 27497,25574 27498,25570 32498,25570 32501,25573 32501,25576 32497,25576 32498,25577 32501,25579 32503,25583 32504,25588 32507,25592 32512,25596 32507,25599 32507,25594 32503,25597 32506,25597 32510,25594 32509,25594 32510,25596 32513,25592 32513,25594 32515,25594 32520,25598 32520,25602 32517,25603 32518,27603 32520,27607 32523,27608 31523,27613 31527,27615 31527,30615 31530,30617 31530,30618 31532,30619 31536,30623 31537,30623 31538,30625 31538,30626 31541,30627 31541,30624 31540,30623 31540,30624 31545,34624 31546,34619 31543,34623 31545,34624 31549,34624 31548,34626 31550,34626 31555,34626 31551,34628 31555,34633 31555,34636 31559,34634 31564,34636 31564,34639 31562,34639 31560,36639 31555,36636 27555,41636 27557,41640 27554,41644 27558,41647 27559,41648 27555,41653 27555,41658 27555,41658 27552,41658 27552,41660 27550,41656 27554,41661 27558,41664 27561,41667 27566,41662 27562,41663 27563,41663 27565,41662 27569,41661 27569,41664 27571,41664 27567,41659 30567,41660 30565,41660 30561,41665 30566,41664 30561,41664 30561,41664 30562,41664 30563,41660 30558,1312 24380,4312 25380,4315 25384,4315 25385,4319 25383,4322 25388,6322 25387,6322 25387,6326 25392,6321 25397,6324 25397,6324 25401,6319 25404,9319 25405,9314 25400,9312 25402,9310 25403,9313 25403,9313 25403,9316 25400,9319 25401,4319 25396,8319 25398,8315 25400,8315 25396,8315 25397,8311 25398,8307 25394,8309 25394,8311 25397,8315 25402,8310 25403,11310 25365,11311 25365,11316 25370,11320 25375,11325 25375,11325 25380,11325 25382,11326 25378,14326 25380,14328 25382,14331 25383,14334 25385,14336 25386,19336 25386,19336 25389,19332 25390,19332 25391,19335 25388,19338 25391,19342 25393,19340 25393,19345 25396,19345 25394,19347 25394,19349 25393,19351 25397,19350 25398,19348 25399,19349 25403,19352 25399,19350 25402,19354 25400,19353 25405,23353 25402,23354 25402,23356 25405,23358 25409,23360 25413,23363 25414,23367 25412,23365 25411,23367 25414,23363 25413,23367 25416,23367 25416,23370 25418,24370 25414,24370 25419,24373 27419,24378 27419,24380 27416,24380 27412,24380 27410,24380 27406,24376 27406,24374 27410,24370 27414,24370 27415,24371 27420,24375 27415,24378 27411,24375 27415,24378 27418,24382 27421,24383 27426,24383 27425,24385 27430,24390 27431,24394 27432,24395 27436,24399 30436,24400 30439,24404 30443,24403 30439,24406 30438,24410 30442,24406 30446,24408 30445,24403 30445,24408 30442,24412 30446,24416 30446,24416 30449,19416 30449,19416 30447,19418 30452,19420 30453,19423 30458,15423 30462,15423 30464,15425 30466,16425 30467,16424 30471,16421 30474,16426 30474,16428 30476,16428 30476,16424 30474,16424 33474,16425 33474,16427 33477,16425 33479,16426 33477,16422 33480,16425 33482,16430 33479,16430 33478,16429 33482,16424 33482,16427 33484,16430 33488,16431 33488,16434 33488,16435 33491,16432 33487,16436 37487,16434 37490,16438 37485,16443 37482,16446 37480,16447 37480,16447 37482,16451 37478,16454 37479,16458 37479,16454 37479,16454 37482,16459 37486,16460 37491,16463 37495,16464 37492,16465 37493,16466 37494,16468 37497,16468 37501,16468 37501,16473 37503,16473 37503,16473 37498,16476 37494,21476 33494,21473 33493,21476 33489,21478 33491,21478 33496,21478 33492,21480 33496,21483 33501,21484 33504,21483 33500,21484 33505,21484 33505,21488 35505,21491 35505,21494 35506,21496 35510,21492 35506,21492 35509,21489 35514,21490 35517,21487 35519,23487 35523,23485 35528,23487 35533,23483 35534,23487 35535,23488 35537,23493 35539,23495 35542,23495 35546,23495 35550,23491 35549,23488 35552,23492 35555,23495 35560,23500 35559,23496 35557,4322 16354,4317 16358,4318 16358,4320 16363,4315 16363,4315 16362,4316 20362,4320 20365,4323 20363,4326 20366,4329 20367,4332 20370,4337 20374,4338 20375,4333 20375,4338 20375,4341 20377,4342 20377,4342 20378,4343 20381,4346 20386,4346 20386,4346 20386,4346 20386,4349 20390,4352 20395,4354 20396,4355 20400,4358 20400,4360 20401,4360 20404,4363 20405,4368 20406,4372 20411,4371 20416,4367 20417,4364 20422,4367 20420,4372 20425,4373 20422,4374 20418,4377 20418,4381 20422,4382 20423,4384 20418,4389 20421,4385 20423,4390 20423,4390 20425,4392 20429,4396 20434,41574 39698,41578 39702,41576 39704,45576 39704,45575 39709,45577 39713,45581 39715,45581 39718,45583 39721,45578 39726,47578 39722,47581 39719,47586 39722,47586 39726,47589 39730,47592 39733,47597 39733,47593 39733,47596 39735,47597 39735,47595 39735,47591 39739,47593 39744,47593 39747,4074 20263,4077 20268,4079 20268,4078 20271,4078 22271,4083 22276,4087 22272,4088 22275,4086 22279,4082 22280,4084 22282,4086 22277,4082 22277,4087 22281,4090 22281,4092 22281,4092 22286,4094 22287,4097 22290,4097 22291,4095 22286,4095 22288,4095 22293,4095 22288,4092 22285,4089 22286,4090 22286,4095 22281,4100 22286,4103 22285,4104 22288,4104 22289,4107 22294,4112 22292,4117 22290,4120 22295,120 22300,121 22303,122 22300,122 22300,121 26300,125 26303,129 26303,127 26305,127 26306,132 26306,132 26307,136 26307,141 26309,140 26311,143 26313,140 26314,145 26318,149 26318,153 26321,153 29321,158 29326,158 29329,162 29324,162 34324,165 34329,168 34328,167 34332,169 34333,173 34334,173 34336,177 34338,178 34340,178 34344,182 34348,177 34348,182 34348,184 34353,184 34358,181 34360,183 34365,187 34365,192 34365,197 34367,199 34366,203 34368,205 34368,202 34363,204 34360,1204 34360,1205 34364,1205 30364,1205 30359,1206 30361,1207 30364,1210 30366,1210 30366,1214 30367,1218 30372,1219 30375,1214 30379,1214 30384,1217 30382,1222 30383,1223 30382,1225 30380,1228 30379,1231 30383,1232 30383,1235 30384,1237 30388,1242 30386,1244 30389,2244 30392,2241 30395,2245 30397,2245 30399,2244 30394,2242 30395,2246 32395,2246 32395,2249 32398,2251 32393,5251 32390,5251 32395,5255 32399,5255 32397,5257 32397,5257 32401,5261 32406,5261 32411,5266 32412,5271 32416,5273 32419,5276 32420,5281 32422,5279 32425,6279 33425,6284 33429,6284 33430,6282 33431,6282 33428,6286 33425,6288 32425,6288 32421,6286 32424,6288 32424,11288 32427,11292 32425,11292 32429,11290 32434,11286 32437,11286 32437,11283 32442,11278 32442,11279 32443,11283 32445,11284 32445,11283 32448,13283 32447,13287 32442,16287 32446,16282 32445,16283 32445,16284 32448,16285 32448,16284 32446,16286 32443,16290 32446,16291 32446,16292 32450,16291 32450,16291 32450,16291 32445,16287 32447,16288 32452,16287 32457,16291 36457,16289 36462,16293 36462,16294 36462,16297 36462,16301 36464,16306 36469,16310 36467,16310 36463,16313 36459,16312 36460,16313 36465,16313 36469,16308 36470,16309 36468,16314 36470,16319 41470,16322 41471,16325 44471,16330 44471,16330 44471,16330 44473,16330 44474,16335 44479,16332 44477,8414 30496,8415 30497,8419 30497,8414 30501,8416 30500,8418 30495,8421 35495,8423 35494,8427 35497,8429 35499,8432 35499,8436 35503,8438 35503,8443 35505,8440 35508,8443 35509,8440 35509,8440 35511,8441 35515,8445 35511,8448 35512,8443 35517,8443 35519,8442 35524,8444 35526,8441 35527,8436 35527,8433 35523,8429 35527,8430 35530,8431 35532,8429 35533,8433 35535,8437 32535,8435 32536,8439 32536,8436 32539,9436 32542,9434 32537,9429 32534,9429 32534,9433 32537,9433 32542,9429 32543,9434 32538,9436 32538,9436 34538,7436 34538,7438 34543,7439 34543,7439 34543,7439 34548,7438 34549,7438 34552,7438 34553,7438 34556,11438 34561,11434 34559,11436 34555,7436 34553,7436 34549,120 1235,124 1239,125 1236,125 1238,129 1235,128 1235,125 1236,123 1239,128 2239,132 2242,131 2242,135 2242,140 2242,145 2247,146 2252,144 2253,146 2248,144 2245,146 2244,150 2249,155 2245,159 2242,160 2243,160 2245,155 2244,156 2245,3156 2246,3159 2248,3159 2250,3164 2254,3165 2257,3166 2255,3169 2257,3171 2262,3169 2263,3174 2268,3177 2273,3174 2276,3178 2275,3173 2279,3177 2276,3180 2279,3182 2284,3185 2289,5185 2286,5185 2288,5181 2286,5185 2288,5184 2293,5187 2293,5187 2297,5190 2299,5187 2299,5185 2300,5181 6300,5182 6297,5187 6300,5189 6298,5191 6296,5193 6296,5193 6296,5195 6297,5195 6300,5197 6297,5195 6300,5190 6302,5191 6306,5192 6308,5195 6312,24395 27436,24391 27437,24393 27433,24398 27436,24398 27437,16286 32443,21286 32443,21286 32444,21282 32448,21283 32446,21283 32448,21285 32451,21281 32456,21282 32458,21282 32463,21282 32468,21284 32470,21289 32471,21287 32471,21287 32469,21287 32474,21284 32477,21288 32482,21291 32482,21291 32486,21296 32485,21299 32486,21301 32487,21303 32484,21301 32482,21305 32487,21310 32491,21312 32495,21313 32491,21315 32495,21312 32495,21314 32498,21316 32501,21311 32506,21311 32508,21312 32513,21317 32516,21319 32516,21324 32516,21327 32521,21328 32526,21332 32527,21328 36527,21331 41527,21336 41527,21334 41531,21337 41533,21335 41535,21339 41540,21340 41540,21343 41536,25343 41539,25340 41542,25337 41542,25337 41545,25335 41542,25335 41543,25335 46543,25339 46548,30339 46551,30340 46556,30343 46557,30342 46553,30337 46556,30341 46561,30337 46565,30336 46563,30338 46564,24373 27419,24373 27421,24375 27424,24377 27425,24377 27430,24374 27435,24379 27437,24384 27432,24385 27434,24382 27437,24381 27442,24381 31442,24381 33442,20381 33439,20383 34439,20382 34440,20378 34444,20381 34446,20381 34442,20384 34443,20388 34446,20392 34447,20393 34442,20393 34447,20396 29447,20395 29443,20399 29443,20400 29439,20399 29436,20404 29439,20409 29440,20410 29440,20410 29444,20408 29445,20413 29448,20413 29451,20412 29455,20413 29458,20418 29461,20413 29463,20415 29464,20416 29464,20416 29463,20416 29463,20418 29464,20414 29465,20418 29463,20413 29460,20413 26460,20418 26458,20421 26459,20421 26461,20421 26460,43578 35658,43578 35654,43578 35658,43578 35660,43583 35661,43583 35659,43583 35662,43579 35663,43583 35661,43587 35666,25625 25551,25629 25551,25630 25554,25630 25559,25632 25560,25627 25561,25623 25557,25623 25559,25624 25561,26624 25566,26627 25566,29627 25571,29626 25574,29625 25575,29622 25579,29625 25583,29630 25588,29632 25589,29635 25591,29635 25594,29637 25598,29642 25596,29643 25597,29644 25597,29649 25598,29654 25602,29656 25602,29661 25603,29661 25601,29664 26601,29666 26604,29665 26604,29668 26607,29672 26607,29669 26611,29671 26616,29674 26613,29679 26616,29680 26616,29681 26615,29682 26619,29679 26617,29684 26622,29686 26624,29689 26624,29690 26628,29691 26630,29693 26625,29694 26620,29698 26617,29703 29617,29707 29616,29706 29620,29709 29623,34709 29626,34710 29628,34710 29627,2282 16411,2283 16412,2283 16412,2287 16417,2292 16421,2297 16421,2298 16426,2303 16426,2304 16429,2309 11429,2313 11432,2308 14432,2308 14431,2311 14433,2310 14437,2308 14438,2309 14440,2311 14440,2309 14443,2312 14443,2314 14447,2314 14452,2314 14450,2309 14451,2309 14451,2309 14456,2313 14461,2313 14461,2309 19461,2309 19461,2311 19462,2315 19465,2318 19465,2321 19462,2317 19464,2321 19467,2322 19467,2322 19469,2322 19469,2320 19464,2321 19462,2322 19461,2327 19466,2327 19461,2322 19461,2322 19463,2317 19467,2318 19471,2102 -1848,2107 -1848,2111 -1846,2114 1154,2114 1156,2115 1157,2114 6157,2116 6162,2121 6165,2124 6170,2121 6175,2124 6179,2124 6183,2128 6178,2126 6179,2125 6178,2126 6181,2122 10181,2127 10186,2128 10189,2130 10188,2130 10191,2127 11191,2127 11195,2131 11196,2132 11192,2131 11197,2135 11201,2135 11203,2139 11199,2142 11203,2143 11204,2147 11208,2142 11210,2142 11211,2147 11212,2150 11217,2150 11219,2151 11219,2152 11222,2152 11222,2148 11224,2150 11220,2150 11223,2146 11218,2143 11219,2140 11221,2143 11218,2140 11219,2140 11223,2145 11225,2147 11226,2152 11226,2155 11224,2157 11229,2157 11229,2153 11233,2153 11238,2149 11239,7149 10239,7154 10241,7157 10241,7162 10243,7164 10248,7164 10251,7169 10253,7171 10253,7172 10257,7177 10260,7182 10256,7187 10260,7191 8260,7195 8256,7200 8258,7204 8258,7203 8261,7203 8262,7205 8266,7209 8270,7209 8273,7214 8273,7214 8276,7210 8276,7211 8276,7213 8279,7218 8278,7222 8283,7223 8279,7220 10279,7221 10283,7223 10284,7228 10286,7230 10290,7231 10290,7231 10293,7232 10294,7232 10297,7234 10299,7229 10295,7226 10294,7221 10293,7223 10295,7228 10299,7229 10303,7232 10307,7232 10311,7233 10316,7234 9316,7239 9318,7244 9321,7241 9326,7241 9328,7238 9331,7235 9330,7237 9335,7236 9335,7236 9337,7236 9338,7231 14338,7230 14333,7232 14338,7237 18338,4082 22280,4081 22280,6081 22283,6076 22285,6076 22289,6078 22286,6080 22287,6084 22292,6084 22293,6085 22293,6086 22291,6091 22294,6092 22293,9092 22290,9095 22294,9096 22295,9096 22297,9091 22292,9096 22295,9098 22290,9094 18290,9097 18290,9096 18294,9099 18292,9098 18297,9103 18299,9103 18302,9103 18305,9100 18301,9102 18302,9106 18305,9102 18310,9101 18306,9103 18308,9103 18312,9107 18310,9107 18315,9107 18320,9111 18322,9111 18326,9113 18329,9111 18329,9116 18329,9121 18329,9121 18332,9123 18331,9124 18332,9125 18328,9127 18325,9125 18328,9128 18329,9133 18329,9136 18333,9141 18337,9142 18342,9143 18340,9148 18344,9152 18341,9150 18346,9149 18341,9149 18341,9154 18343,9158 18345,9161 18346,9161 18347,9163 18352,9164 18352,9162 18349,9165 18352,9165 18351,9165 18352,9165 18356,9163 18352,9167 18353,9167 18349,9168 18351,9168 18347,9173 18347,9175 18347,9179 18348,9182 18349,9187 18352,9186 18357,9189 18360,9192 18360,9196 18362,13196 18367,13196 18369,13196 18371,13199 18374,13194 18374,13197 18375,13200 18377,13205 18380,13210 18384,13209 18379,13209 18374,13213 18375,13216 20375,13212 20375,13215 20375,13211 20375,13211 20372,13208 20373,13204 20373,13204 20369,13205 20369,13207 20366,13212 20367,13216 20367,13221 20372,13222 20377,13225 20381,13226 20386,13230 20383,9230 20388,9228 20384,9228 20386,9223 20389,9223 20392,4223 20397,4223 20396,4225 20399,4222 20404,4220 20408,4220 20411,4223 20416,4227 20421,4230 20418,4234 20421,4232 20422,4236 20423,4238 20423,4239 20423,4235 20427,4231 20427,4230 20426,4228 20428,4232 20427,4232 20431,4236 20433,4241 20431,4241 22431,4236 22436,4239 22437,4239 22439,4236 22443,4232 22439,4236 22444,4236 22446,4239 22447,4239 22452,4241 22454,4245 22457,4245 22460,4250 22462,4251 22465,4253 22465,4249 22465,4251 22460,4251 22464,4255 22469,4257 22473,4256 22478,4259 22479,4260 22480,4257 22485,6257 22489,6260 22490,6260 22493,6262 22496,6262 22500,6267 22495,6271 22495,6276 22491,6276 22489,6281 22487,6286 22490,6289 22490,6294 22490,6294 22489,6292 22485,6292 22489,6288 22489,6288 22494,6288 22496,6286 22497,6288 22501,6292 22500,5292 22503,5292 22503,5296 22508,5295 22510,5300 22510,5305 22513,5302 22514,5306 22510,5309 22513,5313 27513,5313 27513,5317 27513,5322 22513,5326 22517,6326 22516,6323 22518,6323 22523,6320 22523,6321 22526,6323 22531,6323 22531,6324 22532,6324 22532,6325 22529,6321 22531,6323 22534,6328 22534,6329 22530,6324 22527,10324 22522,10319 22524,10315 22520,10314 22525,10311 22525,10307 22526,10304 22531,10306 22527,10306 22528,10309 22530,10312 27530,10312 27534,10312 27534,10307 27536,10307 27532,11307 27531,11307 27533,11308 27535,11303 27531,11298 27532,11294 27534,11294 27534,11299 27538,11297 27542,11302 27547,11306 27547,11311 27549,11313 30549,11317 30551,11313 30546,11316 30541,11316 30540,11319 30545,11318 30546,11323 30550,11326 30554,11326 34554,11330 34558,11331 34558,11333 34558,11332 34561,11328 34561,11331 34562,11336 34562,11336 34567,11340 34570,11342 34569,11345 34568,11344 34569,11345 34571,11349 34574,15349 34574,15354 34569,15359 34566,15362 34571,15363 34576,15367 34577,15368 34577,15371 34581,15374 34576,15379 34574,15383 34579,15384 34584,15387 34583,17387 34578,17392 34578,17391 34578,17396 34573,17397 34578,17397 34580,17397 39580,17402 39584,17397 39587,17402 39587,17406 39582,17403 39587,17407 39589,17409 39592,17406 39592,17409 39595,17409 39599,17412 39603,17416 39608,17417 39608,17417 39608,17421 39607,17422 39609,17424 39608,17427 39604,17425 39605,17426 39609,17423 39611,17422 39610,17425 39613,17428 39618,17428 39619,17429 39616,17432 39616,13432 39615,13432 39617,13432 39617,13432 44617,13434 44621,13434 44623,13439 44627,13442 44632,13442 44635,13440 44631,13442 44631,13445 44635,13447 44639,13445 44637,13445 44638,13450 44639,13454 44644,13457 44644,13459 44642,15459 44639,15457 44644,15461 44644,15462 44642,15459 44645,15459 44647,15463 44650,15458 44651,15459 44653,15461 44657,15463 44661,15463 44661,15463 44663,15467 44666,15472 44668,15474 44664,15470 44668,15471 44670,15473 44674,15475 44675,-3806 12298,-3804 12301,-3805 13301,-3804 13296,-3808 13292,-3809 13295,-3806 13300,-3804 13297,-3801 13301,-3801 13302,-3796 18302,-3801 18306,-3799 18311,-3802 18311,-3799 18312,-3801 18314,-3796 18319,-3795 18322,-3791 18321,-3786 18320,-3786 18321,-3784 18321,-3782 18321,-3781 18324,-3782 18325,-3783 18320,-3788 18324,-1788 18324,-1788 18329,-1784 18333,-1784 18334,-1781 18329,-1777 18334,-6777 18337,-6774 18339,-6776 18341,-6781 18341,-6779 18341,-6779 18343,-6779 18339,-6777 18343,-6782 18338,-6779 18341,-6778 18341,-6776 18336,-6776 18333,-6776 18333,-6780 18338,-6784 18338,-6787 18335,-6786 18336,-6781 22336,-6781 22335,-6778 22331,-6777 22326,-6777 22331,-6777 22335,-6772 22335,-6774 22340,-6769 22341,-6767 22337,-6767 22335,-6767 22335,-6767 22333,-6767 22336,-6762 22331,-6759 22331,-6764 22332,-6765 22334,-6767 22339,-6762 22334,-6760 22334,-6760 22334,-6758 22337,-6754 22341,-6754 22342,-6750 22339,-4750 22343,-4747 22343,-4752 22343,-4751 22344,-4749 22345,-4745 22348,-4740 22353,-4736 22358,-4738 22363,-4740 22358,21336 41527,21334 41527,21330 41526,21330 41526,21333 41529,21328 41529,21329 41530,21326 41532,21328 41532,21324 41537,21328 41532,21330 41535,21334 41532,21336 40532,21334 40536,21339 40534,21341 40534,21344 40534,21346 40532,21350 40532,21353 40535,21357 40539,21359 40542,21360 40546,21355 40546,21360 40547,21359 40550,21356 40551,21356 40550,21357 40550,21361 40554,21358 45554,21362 45556,21366 45553,21370 45557,21374 45556,21377 45553,22377 45549,22382 45549,22382 45552,22386 45557,22387 45557,22388 45553,22392 45557,24392 45561,22392 45558,22397 45561,22399 45558,22398 45561,22400 45564,22400 45569,22404 45573,22406 45577,22406 45581,22404 45581,22407 45582,22409 45579,22409 45575,22409 45579,22407 45579,22402 45582,22402 45582,22404 45587,22406 45587,22406 45589,22411 45589,22413 45590,22417 45591,22417 45592,22422 45587,22425 45583,22428 50583,22428 50585,22428 50585,22430 50588,22435 50590,22435 50585,22435 50590,22439 50595,22440 50590,22445 50587,22442 50584,22442 50586,22443 54586,22443 54590,22446 54595,22448 54597,22448 59597,22444 59593,22449 59596,22449 59599,22452 59600,22457 59600,22458 59605,22457 59602,22462 59603,22463 59604,22461 59605,22458 59602,22457 59601,22457 59601,22455 59605,25455 59606,25457 59611,25462 59613,25464 59614,25467 59617,25472 59612,25476 59613,25478 59610,25482 59615,25482 59616,25486 59612,25483 59614,25487 59619,25492 59623,25497 59625,146 2252,150 2249,150 2249,152 2254,157 2249,158 2253,157 2252,161 2255,159 3255,161 3258,161 3255,163 3255,168 3259,168 3259,172 3263,167 3267,172 3271,172 3272,172 3274,175 3278,179 3282,181 3283,184 3280,185 3282,187 3282,191 3284,192 3286,191 6286,193 6289,198 6285,195 6290,194 6289,195 6289,199 6293,200 6288,198 6290,202 6291,207 6296,212 6301,215 6301,216 6301,211 6304,212 6304,216 6309,216 6304,214 6308,213 6308,211 6305,212 6309,217 6314,220 6317,224 6322,222 6327,220 6323,41573 39712,41572 39709,41576 40709,41580 40714,41576 40717,36576 40717,36577 40719,36582 40716,36585 40721,36590 43721,36585 43721,36582 43724,36585 43729,36590 43731,36590 43730,15289 11307,15285 11312,15286 11315,15289 11315,15294 11315,15295 11316,15296 13316,38742 37646,38743 37650,38745 37655,38744 37658,38739 37659,38737 37662,38742 37662,38745 37657,38748 37662,38748 37662,38752 37667,38753 37667,38748 37669,38748 37668,38752 37673,38754 37674,38756 37676,38758 37674,38760 37679,38760 37675,38758 37675,38763 37675,38767 37674,38772 40674,38767 40679,38772 40683,38774 44683,38778 44686,38780 44690,38780 44690,38779 44695,38782 44700,38780 44695,38775 44696,38775 44696,38775 44696,38779 44699,38783 44696,38784 44696,38786 44692,38786 44692,38786 44696,38791 44698,38793 44699,38795 44703,38800 44708,38803 44708,38807 44709,38802 44706,38806 44708,38809 44709,36809 44709,36814 44704,36813 44705,36814 44705,36816 44709,36811 44712,36812 48712,36811 48717,36815 48721,36816 51721,36818 51717,36822 51720,40822 51715,40827 51712,40830 51716,40829 51719,40832 51723,40835 51724,40840 51721,40841 51721,40836 51725,40841 51730,40846 51734,40848 51738,40849 51740,40851 51743,40854 51745,40855 51746,40857 51750,40857 51746,40861 51748,40866 51751,40862 51750,40866 51750,40869 51752,40865 51752,40863 51755,40858 51757,40855 51753,40855 51758,40852 51758,40853 51760,40857 51761,40855 51757,40852 51760,40853 51761,40855 51762,40858 51757,40859 51756,40863 51757,40863 51759,40860 51764,40859 51764,40854 51768,40850 51765,40852 51767,40852 51767,40848 51772,40852 51776,40854 51778,40852 51778,43852 51778,43854 52778,43856 52781,43859 52781,43859 52776,37512 26536,37517 26531,37520 26535,37520 26540,37522 26544,37527 26544,37532 26549,37537 26544,37540 26549,37545 26544,37549 26547,37549 26550,37548 26551,37549 26553,37546 26553,37546 26553,37549 26556,37549 26559,37552 26559,37556 26564,37560 26559,37561 26561,37565 26565,41565 26565,41569 26568,41571 26573,41571 26573,41576 29573,41571 29573,41573 29576,41573 29578,46573 29578,46569 29582,45569 29583,45572 29583,45568 29583,45573 29581,45575 29578,45571 29581,45572 29584,45572 29585,45576 29585,45578 29588,45581 29591,45582 29593,45582 29598,45584 29597,45589 29600,45585 29605,45589 33605,45593 36605,45594 36607,45599 36609,45600 36604,45604 36604,45604 36608,45604 36607,45608 36610,50608 36613,50611 36609,50614 36609,50619 36605,50624 36605,50625 36606,50625 36605,50629 36606,50624 36608,50625 36610,50626 36610,50629 36608,50627 36610,50628 36614,50632 36618,46632 34618,46632 35618,46636 35622,46636 35617,46637 35620,46639 35619,46643 35620,46645 35625,46643 35630,46648 35635,46648 35640,46649 35643,46651 35647,46655 35650,46652 35655,46657 35656,46658 35657,46662 35660,46659 35663,46662 35664,46665 35663,46667 35667,46667 35663,46670 35666,46672 35671,46674 35671,47674 35668,47676 35672,47677 35673,47677 35678,47677 35677,47677 35677,47677 35682,47672 35683,47671 35683,49671 35685,49674 35689,49677 35692,49675 35692,54675 35697,54678 35699,54674 35699,54670 35701,54670 35700,54675 35703,54676 34703,54676 34703,54679 34706,54683 34708,54688 34706,54688 34707,54685 34702,54687 34702,54692 34707,54687 36707,54687 36706,54682 36707,54685 38707,54680 38710,54680 38714,54677 38714,54679 38719,54682 38720,54687 38716,54688 38717,54692 38722,54697 38726,54699 38727,54700 38724,54702 38720,52702 38719,52702 38719,52702 38721,52702 38725,52704 38726,52706 38728,52707 38729,52711 38728,52711 35728,52713 35733,52712 35737,52712 35739,52713 35742,52713 35745,52708 35745,52710 39745,52713 39749,52716 39748,52721 39749,52720 39753,52716 39756,52716 40756,47716 40757,47717 40761,47722 40761,47722 40761,47722 40766,47726 40769,47728 40772,47733 40777,47731 40773,50731 40777,51731 40779,51733 40782,51734 40786,51737 40784,51741 41784,51739 41783,51739 41785,51739 41785,51736 41789,51731 41789,52731 41790,52735 41791,52738 41790,52742 41789,52746 41785,52747 41785,52745 41785,52750 41782,52753 41786,52753 41787,52758 41792,52754 42792,52749 42793,52752 42794,52756 42791,52757 42790,52762 42793,52766 42797,52766 42797,52769 42802,52774 42806,52774 42805,52771 42807,52774 42807,52770 42808,52771 42811,52767 42811,52766 42812,52767 42817,52771 42817,52771 42817,52775 42815,52779 42811,52779 42812,52780 42815,52776 42818,52774 42818,52777 42822,52780 42823,52781 42827,52776 42829,52780 42832,54780 42835,54780 42840,2135 11201,2140 11203,2137 11204,2140 11209,2142 11213,2147 11211,2145 11213,2145 11213,2150 11218,2150 11221,2153 11225,2157 13225,2162 13228,2167 13231,2171 13232,2167 13229,2168 13233,2171 13237,2173 13239,2168 13234,2168 13235,2173 13235,2175 13234,2177 13235,2177 13234,2179 13229,2179 13226,2180 13226,2177 13226,2177 13231,2180 13231,2181 10231,2176 10233,2177 10232,2180 10235,2185 10237,2182 10240,6182 10240,6184 10244,6182 10242,6183 10243,6185 10246,6190 10244,6194 10244,6194 10247,6192 10247,6192 10252,6195 10256,6194 10260,6195 9260,6195 9260,6195 9264,6199 9269,6204 9272,6199 9268,6201 9268,6203 9265,6208 9268,6204 9270,6204 9275,6201 9279,6201 9281,6201 9286,6206 9281,6206 9277,6202 9281,6200 9285,6202 9288,6198 9290,7198 9293,7200 9297,7201 9297,7205 9298,7209 9298,7209 9299,8209 9302,8214 10302,8218 10306,8222 10308,8226 10313,8231 10313,8235 10318,8237 10318,8237 10323,8233 10326,8233 10327,8237 10325,8238 10328,8238 10330,8234 10330,11234 10332,11236 10333,11241 10337,14241 10338,14240 10338,14237 10339,14238 10337,14237 10339,14242 10339,14246 10339,14250 10339,14250 10339,14251 10337,14254 10337,14256 10334,14256 10332,14252 10336,14255 10340,14259 10342,14262 10347,11148 3159,11153 3163,11154 3162,11154 3165,11158 3167,11161 3172,11162 3175,11162 3176,11166 3179,11166 3181,11171 3185,11176 3180,11178 3179,11176 3181,11179 3183,11174 3182,52776 42818,52778 42822,52777 42822,52782 42817,52783 42822,52784 42823,52789 42826,52789 42823,56789 42828,56786 42829,56786 42832,56789 42836,56789 42835,56785 42838,56786 42843,51786 42844,51788 42846,51790 42847,51794 42842,51796 42842,51801 42846,53801 42849,53806 42849,53809 42852,53812 42850,53817 42846,53817 42848,53818 42853,53822 42856,53823 42854,53826 42858,53825 42860,53826 42860,53826 42864,53830 42868,53835 42873,53839 42873,53841 42872,53841 42876,53841 42879,53841 42884,53836 42888,53836 42889,53836 44889,53833 44889,53835 44893,53838 44897,53842 44897,53844 44900,53844 44904,53845 44905,53850 44903,53853 44904,53858 44906,53856 44907,53861 44909,53856 44913,53858 44916,53863 44916,53868 44918,53867 43918,53869 43921,53869 43919,53867 43919,53862 43918,53860 43923,53864 43928,53869 43930,53874 43933,53874 43932,53874 43932,53875 43930,53877 43928,53878 43924,53883 43927,55883 43929,55883 43925,55879 43929,55881 43929,55884 43928,55881 43928,55882 43929,55883 45929,55883 45933,55883 45936,55884 45941,55884 45941,55886 45946,55882 45948,55883 45952,55888 45956,55890 45957,55894 45953,55892 45954,55897 45950,55893 45954,55896 45956,55892 45955,55897 45959,55899 45961,55899 45961,55894 45962,55898 45957,55893 49957,55896 47957,55894 47956,55898 47960,55901 47964,55901 47967,55901 47970,55896 47973,55898 47969,55894 47974,55895 47975,55891 47976,55896 47979,55899 47984,55902 47983,55897 47987,55899 47989,55904 47992,55904 47993,55905 47997,55902 48001,55902 48003,55907 48000,55910 47998,55915 47999,55911 47994,55906 47998,55910 48003,55914 48000,55918 48000,55914 48000,55919 48000,55921 48003,55921 48007,55924 48007,55919 48010,55922 48005,55927 48009,55928 48008,55928 48008,55930 48012,55925 48012,55925 48016,54925 48014,54922 48018,54922 44018,54926 44013,54929 44012,54932 44016,55932 44017,55935 44017,55936 44020,55937 44022,55936 44020,55939 44015,55944 44018,55945 44022,55947 44023,55950 44024,55953 44020,55956 44023,53867 43919,53871 43921,52871 43921,53871 43923,53876 43923,53881 43923,53880 43927,53882 43931,53886 43936,53884 43937,53879 43934,53879 43937,53877 43939,53878 43938,53879 43942,53880 43947,53881 43948,53884 45948,53884 45949,53882 45953,53883 45954,53878 45956,53880 45953,53885 45958,53885 45958,53886 45957,53886 48957,53886 48962,53891 48962,53892 48964,53897 48965,49897 48962,49902 48965,49906 48967,49902 48967,49904 48971,49901 48967,49904 48970,54904 48971,54904 48971,54904 48975,54909 48979,54907 48975,54910 48975,54906 48971,54909 48973,54911 48975,54915 48978,54920 48978,54923 48981,54918 48984,54921 48984,56921 48984,56926 48986,56924 48981,56929 48980,56932 48979,56932 48977,56936 48979,56937 48981,56937 48982,61937 48984,61937 48980,61934 51980,61935 51981,61935 51984,61935 51984,61931 51986,5329 23395,5331 23395,5333 23390,5337 23392,5340 23395,5345 27395,5345 27397,5350 27398,5355 27399,5356 27402,6356 27405,6360 27407,6361 27406,6364 27402,6366 26402,6371 26402,6371 26402,6372 26405,6370 26405,6375 26406,6380 26411,6385 26413,6387 26414,6388 26419,6390 26419,6391 26424,6393 30424,6390 30429,6390 30432,6390 30430,6394 30434,6394 30437,6394 30441,6396 30442,6398 30439,6399 30436,6404 30435,6405 30435,6400 30435,6405 30440,6404 30443,6405 30447,6409 30447,6411 30447,6412 30448,6417 30446,6421 30450,6418 30448,6417 30444,6418 30449,6420 30451,6425 30456,6426 30456,6425 30458,6426 30458,6426 34458,6427 34459,6432 39459,6434 39462,6434 39467,6439 39470,6443 39467,6444 39468,6449 39473,6451 39476,6452 39481,6452 39479,6452 39476,8452 39476,8456 39478,8460 39480,10460 39482,10455 39482,10456 39484,10460 39484,10463 39484,10468 39486,10473 39482,10475 39484,10475 39486,10476 39488,10477 39492,10475 39494,10480 39499,10476 39501,10479 39506,10480 39510,10475 39508,10480 39513,10481 39516,10481 39516,10485 39521,10487 39522,10490 39523,10490 39520,10493 39520,10496 44520,10491 44519,10491 44524,10492 44520,10497 44525,10499 44525,10502 44527,10500 44531,10502 44535,10506 44535,10511 44532,13511 44536,13513 44533,13510 44535,13507 44540,13511 44543,13515 44548,13517 44549,13522 44550,13525 42550,13520 42551,13522 42553,13525 42552,13529 42557,13529 42558,13524 42559,13525 42559,13525 42562,13520 42564,13523 42567,15523 42569,15523 42572,15524 42577,15529 42577,15530 42582,15532 42584,15532 42588,15531 42587,15531 42592,15530 42587,15530 42583,15533 42583,15536 47583,15532 47583,15535 47587,15534 47590,15536 47594,11536 47590,11533 47590,11529 47590,11533 47592,11533 47592,11533 47593,11537 47598,11538 47603,11538 47603,11538 47605,11541 47609,11544 47613,14544 47614,14539 47610,14537 47610,14537 47614,14535 50614,14537 50619,14539 50619,14540 50623,14538 50623,14537 50619,25599 26540,25599 26541,25599 26544,25594 26542,25599 26543,25596 26544,25597 26543,25598 26543,25593 26544,25588 26542,25593 26545,25595 26544,25596 26544,25599 26541,25594 26544,25592 26549,25593 26548,25597 26549,25596 26550,25594 26551,25590 26550,25594 26554,25597 26550,25598 26552,25593 26555,25598 22555,25599 22557,25604 22559,25605 22558,25606 22562,25605 22559,25605 22564,30605 22569,30610 22571,30610 22575,30609 22575,30609 22576,30609 22581,30605 22581,30610 22583,30610 22584,30613 22579,30613 22581,30616 22577,30619 22577,30621 22580,30621 22585,30626 22590,30628 22593,30629 22598,30626 22603,30628 22606,30629 22607,30629 22604,30627 22606,30632 22608,30633 22608,30636 22612,30641 17612,30642 17614,30647 17614,30651 17615,30654 17610,30655 17607,30658 17611,30653 17610,30654 17606,30654 17607,30659 17606,30660 17611,30658 17616,30659 17616,30664 17619,30665 17621,30665 17620,30667 17621,30671 17624,30673 17624,30673 17624,30678 17627,30675 17632,30675 17635,30678 17640,30681 17643,30686 17639,30691 17641,30696 19641,30699 19640,30700 19640,30696 19645,30698 19643,30699 19645,30702 19646,30703 19649,30699 19651,30704 19648,30706 19652,30709 19653,30709 19655,30709 19655,30712 19657,30708 19658,30705 19660,30700 19662,30701 19663,30706 19664,30711 19663,30707 19667,30704 19670,30708 19672,30709 19673,30711 19673,30711 19674,30713 19678,30718 19682,30723 20682,30721 20686,30725 20691,30726 20693,30729 20695,30728 20690,30730 20692,30733 20694,30736 20692,30736 20691,30740 20694,30741 20695,30741 20697,30746 20700,30747 20702,30750 20701,30751 20698,30753 24698,30749 24701,30748 24703,30746 24704,30747 29704,30747 29705,30749 29707,30752 29712,30757 29712,30760 34712,30760 34716,30763 34716,30759 34713,30759 34717,30763 34717,30758 34717,30757 34721,30760 34726,30758 34726,30763 34727,30763 34727,30764 34727,30759 34729,30759 34732,30762 34734,30757 34735,30761 34736,30759 34736,30762 34738,30757 34733,30760 34735,30762 34737,30760 34736,30765 34733,32765 34737,32768 34737,32765 34740,32765 34742,32768 34747,32772 34751,32772 34752,32777 34749,32782 34751,32783 33751,32783 33746,36783 33749,36783 33754,36786 33756,36787 33755,36787 33758,36791 33754,36796 33754,36801 33756,36801 33758,36801 33762,36802 33765,36802 33765,36806 33770,33806 33772,33806 33777,33809 33777,33814 33780,33814 33785,33818 33782,33821 33784,33826 33781,33822 33781,33824 33783,33822 33784,33826 33787,33823 33792,33827 33795,33828 33798,33829 33799,33833 33801,33833 33801,33836 33805,33839 33809,33842 33805,33847 33810,33845 32810,33847 32808,33849 32812,33851 32815,33849 32818,33849 32822,33847 32822,33847 32826,33850 32831,33854 32836,33857 32833,33856 32828,33859 32829,33860 32832,33857 32834,33857 32830,33855 32830,33857 32830,33855 32834,33859 32829,33859 32833,33862 32836,33864 32837,33864 32839,33866 32837,33869 32835,33872 32840,33874 37840,33879 37845,33881 37850,33881 37855,33886 37856,33891 37860,33896 37860,33893 37863,33894 38863,33896 38859,28896 38864,28899 39864,33899 39869,33896 39871,33898 39875,33902 39873,33902 39875,33907 39879,33912 39884,33908 39887,33908 39888,33905 39890,33909 39895,33911 39896,33908 39900,33912 39901,33915 39902,33915 39902,33915 39902,33910 39907,33910 39904,33914 39903,33912 39906,33916 39909,33920 39909,33922 39912,33923 39916,33928 39916,33931 39918,33932 39919,33935 39915,33936 39912,33934 39909,35934 39914,35931 39915,35935 39917,35939 39920,35939 39915,35940 39911,35944 39916,35944 39911,35944 39908,35945 39904,35945 39908,35945 39912,35950 39915,35955 39917,38955 39916,38960 39921,38962 39920,38962 39920,38967 39922,38967 39924,38970 39928,38975 39928,38973 39928,38977 39931,38980 39934,38984 39936,38982 39939,38983 39942,38985 39943,38987 39945,38992 41945,38988 41950,38989 41954,38992 41958,38992 41962,38992 41965,38993 41970,38997 41970,38997 41970,38994 41974,38994 41979,38997 41979,38999 41982,38994 41980,38998 41985,38998 41984,5334 23406,5330 23406,5325 23403,9325 23404,12325 23408,12325 23408,12322 23406,13322 23411,13325 23416,13326 23412,13322 23414,13327 23419,13328 23422,13329 23425,13333 23422,13337 23424,23491 35549,23490 35544,23494 35546,23499 35548,23495 35549,21495 35553,21490 35556,21492 35558,21492 35556,21494 35559,21494 35564,21494 35566,21499 35566,21502 35562,21502 35567,17502 35568,17506 35573,17507 35574,17511 35578,17512 35583,17513 35588,18513 35591,18514 35592,18515 35594,18513 35596,16513 35601,16513 37601,16513 37602,16511 37604,16513 37609,16514 37611,16518 37616,16522 34616,16524 34613,16528 34615,16528 34620,16533 34624,16535 34627,16538 34628,16539 34630,16539 34631,16542 34628,16542 34633,16544 34638,16547 38638,16547 38640,16543 38645,16543 38640,16540 38640,16543 38640,16542 38641,16546 38646,16541 38649,16541 38645,18541 38648,18544 38648,18544 38653,18544 38656,18549 38651,18547 38651,18550 38656,18547 38658,23547 38663,23544 38664,23548 38668,23548 38670,28548 38672,28549 38669,28549 38673,28545 38669,28549 38670,28554 38670,28557 38674,28560 38669,28562 38674,28562 38669,28561 38669,28564 38671,28569 38671,38779 44699,38780 44695,38778 44698,38783 44700,38785 44700,38781 44701,38782 44696,38786 44691,38789 44692,38794 44692,38799 44688,38799 44693,38803 44697,38808 44697,38806 44697,38806 44700,38803 44702,38803 44706,38802 44707,38807 48707,38808 48707,38806 48707,38810 48712,38810 48709,38810 48711,38810 48711,38806 48707,38802 48710,38803 48706,38805 48711,38810 48711,38805 48709,38809 48710,38809 48710,38814 48707,38815 48703,38816 48703,38816 48704,38820 48704,38822 48709,38820 48710,38818 48714,38822 48716,38822 48719,38827 48722,38828 48727,38832 48725,38830 48730,38831 48726,38832 48724,38829 48728,8431 35532,8431 35537,4431 35532,4434 35537,4438 35537,4439 35533,4443 35535,4442 35530,4445 35527,4449 35527,4453 35530,4458 35530,4459 39530,4460 39531,4461 39531,4464 39531,4468 39531,4470 39534,4465 39534,4465 39532,4469 39532,4471 39537,4466 39538,4470 39539,4473 39540,4476 39540,4480 39543,4485 39548,4483 39546,4484 39547,4484 39549,4484 39551,4486 39553,4486 39554,4487 39551,4483 39553,4486 39554,4490 39556,4493 39557,4498 39561,4494 39562,-4749 22345,-4752 22345,-4748 22348,-4744 22351,-4740 22356,-4741 22358,-4739 22361,-4734 22359,-4730 25359,-4730 25360,-4725 25360,-4727 25360,-4727 25361,-6727 25360,-6729 25365,-6730 25365,-6727 25365,-6731 25364,-6730 27364,-6727 27366,-6723 27367,-3723 27363,-3719 27368,-3720 27371,-3718 27366,-3717 27369,-3716 27369,-3714 27372,-3711 27370,-3712 27371,-3712 27370,-3710 27375,-3708 27377,-3707 27382,-3706 27385,-3706 27389,-3705 32389,-3704 32392,-3704 32392,-3699 32391,-3699 32395,-3694 32399,-3694 32400,-3695 32404,-3695 32408,-3693 32410,-3693 32410,-3697 32410,-3692 32413,-3691 32418,-3686 32420,-3683 32425,-3681 32420,-3678 32424,-3673 32424,-3676 32427,-3673 32426,-3671 32426,-3676 33426,-3678 33428,-3676 33428,-3679 33428,-3679 33433,-3677 33434,-3676 33438,-3681 33440,1319 33444,1321 33441,1325 33444,1329 33439,1326 33444,1326 33439,1327 33439,1327 33440,1332 33444,1333 33449,1338 33453,1338 33450,1343 33450,1347 33454,1346 33457,1346 33455,1342 33459,1341 33462,1346 33462,1347 33463,1343 33463,1344 33462,1348 33457,1347 33460,1352 33464,1356 33468,1361 33469,1363 33468,1365 33469,1368 33472,1369 33475,-2631 33478,-2633 33483,-2629 33486,-2632 34486,-2628 36486,-2625 36488,-2621 36488,-2624 36488,-2622 36492,-2624 36491,-2629 36491,-2627 36496,-2623 36499,-2628 36502,-2631 36506,-2626 36506,-2622 36506,-2622 36509,-2619 36514,-2624 36512,-2621 36510,-2619 36510,-2619 36508,-2617 36512,-2615 36512,-2615 36513,-2615 36511,-2615 36506,-2612 36507,-2609 36511,-2606 37511,-2606 37508,-2610 37505,-2607 37508,-2602 37512,-2599 37512,-2595 37510,-2597 37511,-2592 37515,-2597 37514,-2592 37519,-2592 37524,-2592 37526,-2594 37521,-2594 37516,-2591 36516,-2588 36517,-2589 36513,-2586 36514,-2584 36514,-2583 36516,-2579 36514,-2578 36518,-2578 35518,-2575 35519,-2577 35519,-2578 35524,-2578 35529,-2578 35532,-2578 35534,-2580 35537,-2584 35541,-2586 35542,-2587 35544,-2585 35540,-2585 35544,-2584 35543,-2580 35548,-2576 35550,-2571 35553,-2567 35555,-2565 35560,-2560 35560,-2557 35564,-2553 35564,-5553 36564,-5548 36564,-5544 36565,-5547 36565,-5545 36570,-5542 36565,-5543 36566,-5543 36568,-5543 36570,-5540 36575,-5537 36577,-5535 36581,-5532 36580,-5528 36575,-5526 38575,-5526 38576,-5526 38571,-5522 38571,-5518 38576,-5514 42576,-5510 42581,-5512 42583,-5512 42582,-5507 42582,-5510 42585,-2510 42589,-2511 42592,-2508 42594,-2506 42597,-2503 42598,-2503 42603,-2498 42608,-2501 42611,-2500 42616,-2502 42613,-2502 42616,-4502 42616,-4502 42620,-4502 42622,-4506 42619,-4509 42621,-4511 42624,-4515 42625,-4510 42625,-4507 42628,-4502 42624,-4501 42629,-4505 45629,-4503 45630,-4499 45631,-4496 45630,-4497 45628,-4495 45630,-4494 46630,-4491 46634,-4487 46629,-4483 46631,21336 40532,21341 40533,21346 40534,21346 40536,21345 40536,21346 40536,21345 40536,21344 40538,21347 40543,21348 40543,21351 40540,21351 40542,21348 40545,21351 40546,21352 40546,21353 40546,21358 40546,21359 40545,21359 40550,21357 40555,21362 40560,21364 40555,21363 40555,21364 40560,25364 40564,25365 40566,25368 40566,25371 45566,25372 45567,25372 45562,25376 45564,25381 42564,25385 42560,25389 42564,25389 42568,25393 42572,25390 42572,28390 42569,28389 42570,28385 42574,28386 42576,28389 42577,31389 42578,31385 42582,31387 42582,31390 42578,31391 42579,31392 42576,29392 42580,29396 42582,29398 43582,29402 43584,29406 43585,29407 43587,29411 43592,29413 43594,29414 43595,25414 43600,25412 43595,25415 43599,25420 43602,25418 43604,25423 43599,25426 43599,25429 43602,25434 42602,25429 42604,25432 42600,25435 42605,25436 47605,25440 50605,25441 50610,25439 50614,25444 50617,25447 50621,25444 50624,25444 50626,25445 50627,25450 50632,25450 50628,25451 50630,25451 50632,25454 50633,25458 50637,25462 50641,25463 50640,25463 51640,25467 51644,25469 51649,25473 51650,25474 51653,25475 51654,26475 51658,26475 51662,26474 51665,26476 51665,26481 51661,26483 55661,26485 55664,30485 55667,30485 55670,30489 55671,30489 55668,30491 55670,30492 55670,30493 55675,30497 55675,30501 55671,30503 55676,30500 55677,30498 55672,30494 55675,30499 55676,30500 55676,30505 55681,30501 55684,30496 55685,30500 55685,30502 55687,30506 55692,30507 55693,30506 55692,30511 55693,30516 55694,30514 55699,30514 55701,30512 55701,34512 55705,34516 55708,34520 55704,34518 56704,34519 56704,34520 56706,34517 56706,34515 56701,34519 59701,34522 59706,34522 59708,34522 59713,34526 59715,34528 59717,34533 59712,34538 59715,34538 59717,34541 59717,34546 59720,34548 59721,34552 63721,34547 63726,34549 63728,34554 63726,34556 63726,34557 63721,34556 63725,34561 63730,34558 63730,37558 63725,37561 63729,37565 63724,37569 63720,37573 63718,37578 63722,37577 63718,37579 63720,37579 63722,37580 63719,37580 63720,37579 63724,37574 63725,37574 63727,37576 63725,37581 63729,37583 63732,37586 63732,37590 63737,37592 63734,37597 63731,37600 63730,37596 63731,37596 63733,37600 63733,37601 63735,37596 63735,37591 63732,37596 63733,37601 63738,37602 63733,37599 63738,37594 63740,37598 63744,37603 63745,37605 63747,37607 63752,37607 63756,37603 63757,37603 63761,37604 63761,37608 63758,37609 63762,37604 63764,37604 63764,41604 63765,41600 63761,41599 63761,41600 63766,41596 63766,41599 63766,41601 63770,41604 63768,41608 63768,41611 63772,41614 63767,41609 63763,41612 63765,41615 63760,38615 63764,38615 63768,38618 63768,35618 63769,35618 63774,35617 63775,35618 63776,35613 63775,35615 63780,35612 63782,35613 63779,35614 63775,35618 63774,35619 63776,35624 63778,35624 63780,35629 63785,35629 63780,35626 63781,35624 63782,35629 63784,35634 63787,35638 63782,35634 63783,35634 63778,35633 63777,35638 63782,35641 63786,35644 63791,35648 63793,35647 63793,35649 63797,35653 63801,35654 63804,35654 63804,35656 63804,35655 63806,35658 63810,35658 63805,35662 63805,35657 67805,35658 67808,35660 67811,35664 67808,35660 67803,35658 67803,35661 67803,35663 67808,35666 67810,35670 67814,35669 67813,35669 67816,37669 67820,37664 67820,2275 13363,2278 16363,2274 16363,2275 16362,2279 16362,2282 16362,2287 16366,2284 16366,4284 16366,4286 16371,4290 16375,4294 18375,4295 18377,9295 18381,9296 18381,9299 18382,9303 18379,9305 19379,9308 19375,8308 19380,8312 19380,38746 37651,38749 37652,38754 37653,38757 37656,38753 37661,38753 37661,38758 37663,38763 37664,38763 42664,38768 42666,38765 42668,38770 42664,38767 42659,38768 42659,38773 42654,38771 42659,38775 42661,41775 42663,41778 42665,41781 42669,41782 42667,41779 42669,41784 42672,41781 42672,41783 42672,41780 42672,41783 42675,41784 42675,41788 42676,41792 42677,41792 42675,41793 42680,41793 42676,41796 42681,41801 42685,41804 42684,41806 42685,41804 42690,41802 42692,41805 42696,41800 42697,41802 42698,41804 42700,41809 42704,41813 42705,36813 42708,36813 42704,36810 42703,36811 42705,40811 42706,40815 46706,40816 46708,40820 46708,40818 46712,40822 46717,40825 46720,40829 46724,40827 46727,40831 46727,40833 46731,40829 46733,40830 46733,36830 46738,36830 46741,36834 46744,36831 46749,36826 46748,36822 46748,36824 46751,36819 46755,36823 46758,36823 46762,36824 46766,36822 46769,36826 46772,36831 46774,36828 42774,36833 42776,36833 42777,36838 42782)'))); @@ -86,13 +86,13 @@ SPATIAL KEY (g4), SPATIAL KEY (g5), SPATIAL KEY (g6) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; DROP TABLE t1,t2; CREATE TABLE t1 ( p INT NOT NULL AUTO_INCREMENT, g LINESTRING NOT NULL, PRIMARY KEY(p) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; ALTER TABLE t1 ADD SPATIAL INDEX spatial_idx (g); ALTER TABLE t1 ADD INDEX prefix_idx (g(767)); INSERT INTO t1(g) VALUES(ST_linefromtext('linestring(-5 -576,0 -576,0 -571,0 -571,5 -568,6 -564,6 -565,6 -563)')); @@ -131,6 +131,6 @@ SPATIAL KEY (g4), SPATIAL KEY (g5), SPATIAL KEY (g6) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; DROP TABLE t1,t2; disconnect control_purge; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/1.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/1.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/1.test 2024-08-03 07:29:58.000000000 +0000 @@ -136,17 +136,20 @@ --replace_column 9 # 10 # explain extended SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point; +--disable_view_protocol SELECT g1.fid as first, g2.fid as second, MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o, MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t, MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; + --replace_column 9 # 10 # explain extended SELECT g1.fid as first, g2.fid as second, MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o, MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t, MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; +--enable_view_protocol DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry; @@ -169,7 +172,7 @@ SHOW FIELDS FROM t1; DROP TABLE t1; -SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); +SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))) AS val; explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)')))); SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101)); @@ -398,14 +401,16 @@ drop table t1; -select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))); -select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))); +select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))) AS val; +select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))) AS val; +--disable_view_protocol --enable_metadata create table t1 (g GEOMETRY); select * from t1; select ST_asbinary(g) from t1; --disable_metadata +--enable_view_protocol drop table t1; create table t1 (a TEXT, b GEOMETRY NOT NULL, INDEX(b(5))); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/geometry.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/geometry.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/geometry.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/geometry.test 2024-08-03 07:29:58.000000000 +0000 @@ -625,17 +625,20 @@ --replace_column 9 # explain extended SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point; +--disable_view_protocol SELECT g1.fid as first, g2.fid as second, MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o, MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t, MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; + --replace_column 9 # explain extended SELECT g1.fid as first, g2.fid as second, MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o, MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t, MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; +--enable_view_protocol --echo # check support of Foreign Key constraint CREATE TABLE parent (id GEOMETRY NOT NULL,PRIMARY KEY (id(10))) ENGINE=INNODB; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/gis.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/gis.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/gis.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/gis.test 2024-08-03 07:29:58.000000000 +0000 @@ -133,17 +133,20 @@ --replace_column 9 # explain extended SELECT fid, ST_AsText(ST_GeometryN(g, 2)) from gis_multi_point; +--disable_view_protocol SELECT g1.fid as first, g2.fid as second, MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o, MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t, MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; + --replace_column 9 # explain extended SELECT g1.fid as first, g2.fid as second, MBRWithin(g1.g, g2.g) as w, MBRContains(g1.g, g2.g) as c, MBROverlaps(g1.g, g2.g) as o, MBREquals(g1.g, g2.g) as e, MBRDisjoint(g1.g, g2.g) as d, ST_Touches(g1.g, g2.g) as t, MBRIntersects(g1.g, g2.g) as i, ST_Crosses(g1.g, g2.g) as r FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second; +--enable_view_protocol DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry; @@ -166,7 +169,7 @@ SHOW FIELDS FROM t1; DROP TABLE t1; -SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); +SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))) AS val; explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_GeometryFromText('POINT(1 4)')))); explain extended SELECT ST_AsText(ST_GeometryFromWKB(ST_AsWKB(ST_PointFromText('POINT(1 4)')))); SELECT ST_SRID(ST_GeomFromText('LineString(1 1,2 2)',101)); @@ -391,14 +394,16 @@ drop table t1; -select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))); -select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))); +select (ST_asWKT(ST_geomfromwkb((0x000000000140240000000000004024000000000000)))) AS val; +select (ST_asWKT(ST_geomfromwkb((0x010100000000000000000024400000000000002440)))) AS val; +--disable_view_protocol --enable_metadata create table t1 (g GEOMETRY); select * from t1; select ST_asbinary(g) from t1; --disable_metadata +--enable_view_protocol drop table t1; create table t1 (a TEXT, b GEOMETRY NOT NULL, SPATIAL KEY(b)); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rollback.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rollback.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rollback.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rollback.test 2024-08-03 07:29:58.000000000 +0000 @@ -463,7 +463,7 @@ # Test partial update rollback after recovered. # Crash the server in partial update. ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect set session debug="+d,row_mysql_crash_if_error"; --error 2013 update t1 set a=point(5,5), b=point(5,5), c=5 where i < 3; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_add_index.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_add_index.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_add_index.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_add_index.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ --source include/have_innodb.inc -CREATE TABLE t1 (g MULTIPOINT NOT NULL) ENGINE=InnoDB; +CREATE TABLE t1 (g MULTIPOINT NOT NULL) ENGINE=InnoDB STATS_PERSISTENT=0; INSERT INTO t1 VALUES (''); connect purge_control,localhost,root; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_compress.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_compress.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_compress.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_compress.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,9 +10,11 @@ # Valgrind takes too much time on PB2 even in the --big-test runs. --source include/not_valgrind.inc -create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb ROW_FORMAT=COMPRESSED; +create table t1 (c1 int, c2 geometry not null, spatial index (c2))engine=innodb ROW_FORMAT=COMPRESSED STATS_PERSISTENT=0; # Insert enough values to let R-tree split. +lock tables t1 write; +start transaction; insert into t1 values(1, Point(1,1)); insert into t1 values(2, Point(2,2)); insert into t1 values(3, Point(3,3)); @@ -33,6 +35,8 @@ insert into t1 select * from t1; insert into t1 select * from t1; insert into t1 select * from t1; +commit; +unlock tables; start transaction; insert into t1 select * from t1; select count(*) from t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_create_inplace.opt mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_create_inplace.opt --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_create_inplace.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_create_inplace.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb_sort_buffer_size=64k diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_create_inplace.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_create_inplace.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_create_inplace.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_create_inplace.test 2024-08-03 07:29:58.000000000 +0000 @@ -2,32 +2,27 @@ --source include/have_innodb.inc --source include/have_debug.inc +--source include/have_sequence.inc --source include/no_valgrind_without_big.inc # Create table with geometry column CREATE TABLE t1 (c1 INT, c2 GEOMETRY NOT NULL, c3 GEOMETRY NOT NULL) ENGINE=INNODB; +CREATE TEMPORARY TABLE t LIKE t1; # Insert enough values -INSERT INTO t1 VALUES(1, Point(1,1), ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))')); -INSERT INTO t1 VALUES(2, Point(2,2), ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))')); -INSERT INTO t1 VALUES(3, Point(3,3), ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))')); -INSERT INTO t1 VALUES(4, Point(4,4), ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))')); -INSERT INTO t1 VALUES(5, Point(5,5), ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))')); -INSERT INTO t1 VALUES(6, Point(6,6), ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))')); -INSERT INTO t1 VALUES(7, Point(7,7), ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))')); -INSERT INTO t1 VALUES(8, Point(8,8), ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))')); -INSERT INTO t1 VALUES(9, Point(9,9), ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))')); - -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; - -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t VALUES +(1, Point(1,1), ST_GeomFromText('POLYGON (( 0 -1, 0 1, 2 1, 2 -1, 0 -1))')), +(2, Point(2,2), ST_GeomFromText('POLYGON (( 0 -3, 0 -1, 2 -1, 2 -3, 0 -3))')), +(3, Point(3,3), ST_GeomFromText('POLYGON (( 1 0, 1 2, 3 2, 3 0, 1 0))')), +(4, Point(4,4), ST_GeomFromText('POLYGON (( -3 0, -3 2, -1 2, -1 0, -3 0))')), +(5, Point(5,5), ST_GeomFromText('POLYGON (( 0 0, 0 1, 1 1, 1 0, 0 0))')), +(6, Point(6,6), ST_GeomFromText('POLYGON (( 2 0, 2 2, 4 2, 4 0, 2 0))')), +(7, Point(7,7), ST_GeomFromText('POLYGON (( 0 3, 0 5, 2 5, 2 3, 0 3))')), +(8, Point(8,8), ST_GeomFromText('POLYGON (( 0 1, 0 3, 2 3, 2 1, 0 1))')), +(9, Point(9,9), ST_GeomFromText('POLYGON (( 0 0, 0 3, 3 3, 3 0, 0 0))')); + +INSERT INTO t1 SELECT t.* FROM t, seq_1_to_512; +DROP TEMPORARY TABLE t; # create spatial index CREATE SPATIAL INDEX idx ON t1(c2); @@ -42,8 +37,9 @@ ALTER TABLE t1 DROP INDEX idx, ADD SPATIAL INDEX idx3(c2); -SET SESSION debug="+d,row_merge_instrument_log_check_flush"; +SET debug_dbug='+d,row_merge_instrument_log_check_flush'; ALTER TABLE t1 DROP INDEX idx3, ADD SPATIAL INDEX idx4(c2), ADD SPATIAL INDEX idx5(c3); +ALTER TABLE t1 FORCE; # Clean up. DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_purge.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_purge.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,7 @@ create table t ( b point not null,d point not null, spatial key (d),spatial key (b) -) engine=innodb; +) engine=innodb stats_persistent=0; --disable_query_log set @p=point(1,1); diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_undo.test mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_undo.test --- mariadb-10.11.6/mysql-test/suite/innodb_gis/t/rtree_undo.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_gis/t/rtree_undo.test 2024-08-03 07:29:58.000000000 +0000 @@ -17,7 +17,7 @@ p INT NOT NULL AUTO_INCREMENT, g LINESTRING NOT NULL, PRIMARY KEY(p) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; if ($index == 3) { eval ALTER TABLE t1 ADD INDEX prefix_idx (g($prefix_size)); @@ -88,7 +88,7 @@ SPATIAL KEY (g4), SPATIAL KEY (g5), SPATIAL KEY (g6) -) ENGINE=InnoDB; +) ENGINE=InnoDB STATS_PERSISTENT=0; DROP TABLE t1,t2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/include/innodb_dml_ops.inc mariadb-10.11.9/mysql-test/suite/innodb_zip/include/innodb_dml_ops.inc --- mariadb-10.11.6/mysql-test/suite/innodb_zip/include/innodb_dml_ops.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/include/innodb_dml_ops.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -delimiter |; -create procedure populate_t1() -begin - declare i int default 1; - while (i <= 200) do - insert into t1 values (i, 'a', 'b'); - set i = i + 1; - end while; -end| -create procedure populate_t1_small() -begin - declare i int default 1; - while (i <= 20) do - insert into t1 values (i, 'c', 'd'); - set i = i + 1; - end while; -end| -create procedure populate_t1_small2() -begin - declare i int default 30; - while (i <= 50) do - insert into t1 values (i, 'e', 'f'); - set i = i + 1; - end while; -end| -delimiter ;| -# -begin; -select count(*) from t1; -call populate_t1(); -select count(*) from t1; -select * from t1 limit 10; -rollback; -select count(*) from t1; -# -begin; -call populate_t1(); -select count(*) from t1; -commit; -select count(*) from t1; -# -truncate table t1; -select count(*) from t1; -# -call populate_t1_small(); -select count(*) from t1; -rollback; -select count(*) from t1; -truncate table t1; -# -call populate_t1(); -select count(*) from t1; -delete from t1 where keyc <= 60; -select count(*) from t1; -call populate_t1_small(); -select count(*) from t1; -select * from t1 limit 10; -begin; -call populate_t1_small2(); -select count(*) from t1; -select * from t1 where keyc > 30 limit 10; -rollback; -select count(*) from t1; -select * from t1 where keyc > 30 limit 10; -# -update t1 set keyc = keyc + 2000; -select * from t1 limit 10; -rollback; -begin; -update t1 set keyc = keyc + 2000; -select * from t1 limit 10; -rollback; -select * from t1 limit 10; -commit; -select * from t1 limit 10; -# -insert into t2 select * from t1 where keyc < 2101; -select count(*) from t2; -# -drop procedure populate_t1; -drop procedure populate_t1_small; -drop procedure populate_t1_small2; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/r/blob.result mariadb-10.11.9/mysql-test/suite/innodb_zip/r/blob.result --- mariadb-10.11.6/mysql-test/suite/innodb_zip/r/blob.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/r/blob.result 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ # failed in mtr_t::write(), btr_free_externally_stored_field() # CREATE TABLE t1 (c TEXT, f2 INT PRIMARY KEY, f3 INT UNIQUE) -ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; +ENGINE=InnoDB STATS_PERSISTENT=0 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; SET @level= @@GLOBAL.innodb_compression_level; SET GLOBAL innodb_compression_level=0; connect prevent_purge,localhost,root; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/r/innochecksum_3.result mariadb-10.11.9/mysql-test/suite/innodb_zip/r/innochecksum_3.result --- mariadb-10.11.6/mysql-test/suite/innodb_zip/r/innochecksum_3.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/r/innochecksum_3.result 2024-08-03 07:29:58.000000000 +0000 @@ -120,7 +120,6 @@ #::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - #::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - #::# | Freshly allocated page | - -#::# | Freshly allocated page | - # Variables used by page type dump for ibdata1 Variables (--variable-name=value) @@ -154,7 +153,6 @@ #::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - #::# | Index page | index id=#, page level=#, No. of records=#, garbage=#, - #::# | Freshly allocated page | - -#::# | Freshly allocated page | - [6]: check the valid lower bound values for option # allow-mismatches,page,start-page,end-page [9]: check the both short and long options "page" and "start-page" when diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/r/restart.result mariadb-10.11.9/mysql-test/suite/innodb_zip/r/restart.result --- mariadb-10.11.6/mysql-test/suite/innodb_zip/r/restart.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/r/restart.result 2024-08-03 07:29:58.000000000 +0000 @@ -527,15 +527,6 @@ innodb_file_per_table ON === information_schema.innodb_sys_tablespaces and innodb_sys_datafiles === Space_Name Page_Size Zip_Size Path -test/t4_restart DEFAULT DEFAULT MYSQLD_DATADIR/test/t4_restart.ibd -test/t6_restart#p#p0 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p0.ibd -test/t6_restart#p#p1 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p1.ibd -test/t7_restart#p#p0#sp#s0 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p0#sp#s0.ibd -test/t7_restart#p#p0#sp#s1 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p0#sp#s1.ibd -test/t5_restart DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t5_restart.ibd -test/t6_restart#p#p2 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t6_restart#p#p2.ibd -test/t7_restart#p#p1#sp#s2 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p1#sp#s2.ibd -test/t7_restart#p#p1#sp#s3 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t7_restart#p#p1#sp#s3.ibd innodb_temporary DEFAULT DEFAULT MYSQLD_DATADIR/ibtmp1 SELECT count(*) FROM t5_restart; count(*) @@ -629,7 +620,6 @@ RENAME TABLE t7_restart TO t77_restart; === information_schema.innodb_sys_tablespaces and innodb_sys_datafiles === Space_Name Page_Size Zip_Size Path -test/t4_restart DEFAULT DEFAULT MYSQLD_DATADIR/test/t4_restart.ibd test/t66_restart#p#p0 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p0.ibd test/t66_restart#p#p1 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p1.ibd test/t77_restart#p#p0#sp#s0 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p0#sp#s0.ibd @@ -728,15 +718,6 @@ innodb_file_per_table ON === information_schema.innodb_sys_tablespaces and innodb_sys_datafiles === Space_Name Page_Size Zip_Size Path -test/t4_restart DEFAULT DEFAULT MYSQLD_DATADIR/test/t4_restart.ibd -test/t66_restart#p#p0 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p0.ibd -test/t66_restart#p#p1 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p1.ibd -test/t77_restart#p#p0#sp#s0 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p0#sp#s0.ibd -test/t77_restart#p#p0#sp#s1 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p0#sp#s1.ibd -test/t55_restart DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t55_restart.ibd -test/t66_restart#p#p2 DEFAULT 2048 MYSQL_TMP_DIR/alt_dir/test/t66_restart#p#p2.ibd -test/t77_restart#p#p1#sp#s2 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p1#sp#s2.ibd -test/t77_restart#p#p1#sp#s3 DEFAULT DEFAULT MYSQL_TMP_DIR/alt_dir/test/t77_restart#p#p1#sp#s3.ibd innodb_temporary DEFAULT DEFAULT MYSQLD_DATADIR/ibtmp1 INSERT INTO t55_restart (SELECT 0, c2, c3, c4, c5 FROM t55_restart); SELECT count(*) FROM t55_restart; @@ -863,15 +844,6 @@ # restart === information_schema.innodb_sys_tablespaces and innodb_sys_datafiles === Space_Name Page_Size Zip_Size Path -test/t4_restart DEFAULT DEFAULT MYSQL_TMP_DIR/new_dir/test/t4_restart.ibd -test/t66_restart#p#p0 DEFAULT 2048 MYSQL_TMP_DIR/new_dir/test/t66_restart#p#p0.ibd -test/t66_restart#p#p1 DEFAULT 2048 MYSQL_TMP_DIR/new_dir/test/t66_restart#p#p1.ibd -test/t77_restart#p#p0#sp#s0 DEFAULT DEFAULT MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p0#sp#s0.ibd -test/t77_restart#p#p0#sp#s1 DEFAULT DEFAULT MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p0#sp#s1.ibd -test/t55_restart DEFAULT DEFAULT MYSQL_TMP_DIR/new_dir/test/t55_restart.ibd -test/t66_restart#p#p2 DEFAULT 2048 MYSQL_TMP_DIR/new_dir/test/t66_restart#p#p2.ibd -test/t77_restart#p#p1#sp#s2 DEFAULT DEFAULT MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p1#sp#s2.ibd -test/t77_restart#p#p1#sp#s3 DEFAULT DEFAULT MYSQL_TMP_DIR/new_dir/test/t77_restart#p#p1#sp#s3.ibd innodb_temporary DEFAULT DEFAULT MYSQLD_DATADIR/ibtmp1 INSERT INTO t4_restart (SELECT 0, c2, c3, c4, c5 FROM t4_restart); SELECT count(*) FROM t4_restart; @@ -1002,15 +974,6 @@ # restart === information_schema.innodb_sys_tablespaces and innodb_sys_datafiles === Space_Name Page_Size Zip_Size Path -test/t4_restart DEFAULT DEFAULT MYSQLD_DATADIR/test/t4_restart.ibd -test/t66_restart#p#p0 DEFAULT 2048 MYSQLD_DATADIR/test/t66_restart#p#p0.ibd -test/t66_restart#p#p1 DEFAULT 2048 MYSQLD_DATADIR/test/t66_restart#p#p1.ibd -test/t77_restart#p#p0#sp#s0 DEFAULT DEFAULT MYSQLD_DATADIR/test/t77_restart#p#p0#sp#s0.ibd -test/t77_restart#p#p0#sp#s1 DEFAULT DEFAULT MYSQLD_DATADIR/test/t77_restart#p#p0#sp#s1.ibd -test/t55_restart DEFAULT DEFAULT MYSQLD_DATADIR/test/t55_restart.ibd -test/t66_restart#p#p2 DEFAULT 2048 MYSQLD_DATADIR/test/t66_restart#p#p2.ibd -test/t77_restart#p#p1#sp#s2 DEFAULT DEFAULT MYSQLD_DATADIR/test/t77_restart#p#p1#sp#s2.ibd -test/t77_restart#p#p1#sp#s3 DEFAULT DEFAULT MYSQLD_DATADIR/test/t77_restart#p#p1#sp#s3.ibd innodb_temporary DEFAULT DEFAULT MYSQLD_DATADIR/ibtmp1 INSERT INTO t4_restart (SELECT 0, c2, c3, c4, c5 FROM t4_restart); SELECT count(*) FROM t4_restart; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/t/blob.test mariadb-10.11.9/mysql-test/suite/innodb_zip/t/blob.test --- mariadb-10.11.6/mysql-test/suite/innodb_zip/t/blob.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/t/blob.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,7 +6,7 @@ --echo # CREATE TABLE t1 (c TEXT, f2 INT PRIMARY KEY, f3 INT UNIQUE) -ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; +ENGINE=InnoDB STATS_PERSISTENT=0 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=4; SET @level= @@GLOBAL.innodb_compression_level; SET GLOBAL innodb_compression_level=0; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/t/innochecksum_2.test mariadb-10.11.9/mysql-test/suite/innodb_zip/t/innochecksum_2.test --- mariadb-10.11.6/mysql-test/suite/innodb_zip/t/innochecksum_2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/t/innochecksum_2.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,11 +9,6 @@ --source include/not_embedded.inc -- source include/big_test.inc ---disable_query_log -# This warning occurs due to small buffer pool size(i.e. 8MB). It doesn't occur -# with --mysqld=--innodb_buffer_pool_size=10MB -call mtr.add_suppression("\\[Warning\\] InnoDB: Difficult to find free blocks in the buffer pool.*"); ---enable_query_log let MYSQLD_BASEDIR= `SELECT @@basedir`; let MYSQLD_DATADIR= `SELECT @@datadir`; let SEARCH_FILE= $MYSQLTEST_VARDIR/log/my_restart.err; diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/t/restart.opt mariadb-10.11.9/mysql-test/suite/innodb_zip/t/restart.opt --- mariadb-10.11.6/mysql-test/suite/innodb_zip/t/restart.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/t/restart.opt 2024-08-03 07:29:58.000000000 +0000 @@ -1,2 +1,5 @@ ---loose-innodb-sys-tables ---loose-innodb-sys-tablespaces +--innodb-sys-tables +--innodb-sys-tablespaces +--skip-innodb-stats-persistent +--skip-innodb-buffer-pool-dump-at-shutdown +--skip-innodb-fast-shutdown diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/t/restart.test mariadb-10.11.9/mysql-test/suite/innodb_zip/t/restart.test --- mariadb-10.11.6/mysql-test/suite/innodb_zip/t/restart.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/t/restart.test 2024-08-03 07:29:58.000000000 +0000 @@ -412,13 +412,13 @@ --echo # Moving tablespace 't4_restart' from MYSQL_DATA_DIR to MYSQL_TMP_DIR/new_dir --copy_file $MYSQL_DATA_DIR/test/t4_restart.ibd $MYSQL_TMP_DIR/new_dir/test/t4_restart.ibd --remove_file $MYSQL_DATA_DIR/test/t4_restart.ibd ---exec echo $MYSQL_TMP_DIR/new_dir/test/t4_restart.ibd > $MYSQL_DATA_DIR/test/t4_restart.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t4_restart.ibd $MYSQL_DATA_DIR/test/t4_restart.isl --echo # Moving tablespace 't55_restart' from MYSQL_TMP_DIR/alt_dir to MYSQL_TMP_DIR/new_dir --copy_file $MYSQL_TMP_DIR/alt_dir/test/t55_restart.ibd $MYSQL_TMP_DIR/new_dir/test/t55_restart.ibd --remove_file $MYSQL_TMP_DIR/alt_dir/test/t55_restart.ibd --remove_file $MYSQL_DATA_DIR/test/t55_restart.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t55_restart.ibd > $MYSQL_DATA_DIR/test/t55_restart.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t55_restart.ibd $MYSQL_DATA_DIR/test/t55_restart.isl --echo # Moving tablespace 't66_restart' from MYSQL_TMP_DIR/alt_dir to MYSQL_TMP_DIR/new_dir --copy_file $MYSQL_TMP_DIR/alt_dir/test/t66_restart#P#p0.ibd $MYSQL_TMP_DIR/new_dir/test/t66_restart#P#p0.ibd @@ -430,9 +430,9 @@ --remove_file $MYSQL_DATA_DIR/test/t66_restart#P#p0.isl --remove_file $MYSQL_DATA_DIR/test/t66_restart#P#p1.isl --remove_file $MYSQL_DATA_DIR/test/t66_restart#P#p2.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t66_restart#P#p0.ibd > $MYSQL_DATA_DIR/test/t66_restart#P#p0.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t66_restart#P#p1.ibd > $MYSQL_DATA_DIR/test/t66_restart#P#p1.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t66_restart#P#p2.ibd > $MYSQL_DATA_DIR/test/t66_restart#P#p2.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t66_restart#P#p0.ibd $MYSQL_DATA_DIR/test/t66_restart#P#p0.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t66_restart#P#p1.ibd $MYSQL_DATA_DIR/test/t66_restart#P#p1.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t66_restart#P#p2.ibd $MYSQL_DATA_DIR/test/t66_restart#P#p2.isl --echo # Moving tablespace 't77_restart' from MYSQL_TMP_DIR/alt_dir to MYSQL_TMP_DIR/new_dir --copy_file $MYSQL_TMP_DIR/alt_dir/test/t77_restart#P#p0#SP#s0.ibd $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p0#SP#s0.ibd @@ -447,10 +447,10 @@ --remove_file $MYSQL_DATA_DIR/test/t77_restart#P#p0#SP#s1.isl --remove_file $MYSQL_DATA_DIR/test/t77_restart#P#p1#SP#s2.isl --remove_file $MYSQL_DATA_DIR/test/t77_restart#P#p1#SP#s3.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p0#SP#s0.ibd > $MYSQL_DATA_DIR/test/t77_restart#P#p0#SP#s0.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p0#SP#s1.ibd > $MYSQL_DATA_DIR/test/t77_restart#P#p0#SP#s1.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p1#SP#s2.ibd > $MYSQL_DATA_DIR/test/t77_restart#P#p1#SP#s2.isl ---exec echo $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p1#SP#s3.ibd > $MYSQL_DATA_DIR/test/t77_restart#P#p1#SP#s3.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p0#SP#s0.ibd $MYSQL_DATA_DIR/test/t77_restart#P#p0#SP#s0.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p0#SP#s1.ibd $MYSQL_DATA_DIR/test/t77_restart#P#p0#SP#s1.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p1#SP#s2.ibd $MYSQL_DATA_DIR/test/t77_restart#P#p1#SP#s2.isl +--write_line $MYSQL_TMP_DIR/new_dir/test/t77_restart#P#p1#SP#s3.ibd $MYSQL_DATA_DIR/test/t77_restart#P#p1#SP#s3.isl --echo ---- MYSQL_DATA_DIR/test --list_files_write_file $MYSQLD_DATADIR.files.txt $MYSQL_DATA_DIR/test diff -Nru mariadb-10.11.6/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test mariadb-10.11.9/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test --- mariadb-10.11.6/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/innodb_zip/t/wl5522_debug_zip.test 2024-08-03 07:29:58.000000000 +0000 @@ -75,7 +75,7 @@ SELECT * FROM t1; # Write file to make mysql-test-run.pl start up the server again ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Execute the statement that causes the crash --error 2013 @@ -96,7 +96,7 @@ SELECT COUNT(*) FROM t1; # Don't start up the server right away. ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Execute the statement that causes the crash --error 2013 @@ -113,7 +113,7 @@ --echo # Restart and reconnect to the server --enable_reconnect ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/wait_until_connected_again.inc --disable_reconnect diff -Nru mariadb-10.11.6/mysql-test/suite/json/r/json_no_table.result mariadb-10.11.9/mysql-test/suite/json/r/json_no_table.result --- mariadb-10.11.6/mysql-test/suite/json/r/json_no_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/json/r/json_no_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -1002,19 +1002,27 @@ error ER_INVALID_JSON_TEXT_IN_PARAM select json_type(CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8')); json_type(CAST(CAST('2015-01-15' AS DATE) as CHAR CHARACTER SET 'utf8')) -INTEGER +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 5 # ---------------------------------------------------------------------- # Test of json_compact(literal) # ---------------------------------------------------------------------- select json_type(json_compact(cast('2014-11-25 18:00' as datetime))); json_type(json_compact(cast('2014-11-25 18:00' as datetime))) -INTEGER +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 5 select json_type(json_compact(cast('2014-11-25' as date))); json_type(json_compact(cast('2014-11-25' as date))) -INTEGER +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 5 select json_type(json_compact(cast('18:00:59' as time))); json_type(json_compact(cast('18:00:59' as time))) -INTEGER +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 3 select json_type(json_compact(127)); json_type(json_compact(127)) INTEGER @@ -1064,7 +1072,9 @@ DOUBLE select json_type(json_compact(cast('10101abcde' as binary))); json_type(json_compact(cast('10101abcde' as binary))) -INTEGER +NULL +Warnings: +Warning 4038 Syntax error in JSON text in argument 1 to function 'json_type' at position 6 select json_type(json_compact(ST_GeomFromText('POINT(1 1)'))); json_type(json_compact(ST_GeomFromText('POINT(1 1)'))) NULL diff -Nru mariadb-10.11.6/mysql-test/suite/json/r/json_table.result mariadb-10.11.9/mysql-test/suite/json/r/json_table.result --- mariadb-10.11.6/mysql-test/suite/json/r/json_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/json/r/json_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -1015,6 +1015,31 @@ SELECT 1 FROM JSON_TABLE (row(1,2), '$' COLUMNS (o FOR ORDINALITY)) AS j; ERROR 21000: Operand should contain 1 column(s) # +# MDEV-30623 JSON_TABLE in subquery not correctly marked as correlated +# update_correlated_cache() fails to take JSON_TABLE functions in +# subqueries into account. +# +create table t1(c json); +insert into t1 values ('[{"x":"1"},{"x":"2"}]'), +('[{"x":"10"},{"x":"20"}]'), +('[{"x":"100"},{"x":"200"}]'); +select c, +(SELECT sum(x) FROM json_table(c, "$[*]" columns( x int path "$.x")) +AS jt) as SUBQ +from t1; +c SUBQ +[{"x":"1"},{"x":"2"}] 3 +[{"x":"10"},{"x":"20"}] 30 +[{"x":"100"},{"x":"200"}] 300 +explain select c, +(SELECT sum(x) FROM json_table(c, "$[*]" columns( x int path "$.x")) +AS jt) as SUBQ +from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 3 +2 DEPENDENT SUBQUERY jt ALL NULL NULL NULL NULL 40 Table function: json_table +drop table t1; +# # End of 10.6 tests # # diff -Nru mariadb-10.11.6/mysql-test/suite/json/r/type_json.result mariadb-10.11.9/mysql-test/suite/json/r/type_json.result --- mariadb-10.11.6/mysql-test/suite/json/r/type_json.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/json/r/type_json.result 2024-08-03 07:29:58.000000000 +0000 @@ -2880,5 +2880,13 @@ DROP PROCEDURE p2; DROP TABLE t1, t1c, t2; # +# MDEV-30646 View created via JSON_ARRAYAGG returns incorrect json object +# +CREATE VIEW v1 AS SELECT JSON_OBJECT('plugin','unix_socket') as v1_json; +SELECT JSON_ARRAYAGG(v1_json) FROM v1; +JSON_ARRAYAGG(v1_json) +[{"plugin": "unix_socket"}] +DROP VIEW v1; +# # End of 10.5 tests # diff -Nru mariadb-10.11.6/mysql-test/suite/json/t/json_table.test mariadb-10.11.9/mysql-test/suite/json/t/json_table.test --- mariadb-10.11.6/mysql-test/suite/json/t/json_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/json/t/json_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -872,6 +872,28 @@ SELECT 1 FROM JSON_TABLE (row(1,2), '$' COLUMNS (o FOR ORDINALITY)) AS j; --echo # +--echo # MDEV-30623 JSON_TABLE in subquery not correctly marked as correlated +--echo # update_correlated_cache() fails to take JSON_TABLE functions in +--echo # subqueries into account. +--echo # + +create table t1(c json); +insert into t1 values ('[{"x":"1"},{"x":"2"}]'), + ('[{"x":"10"},{"x":"20"}]'), + ('[{"x":"100"},{"x":"200"}]'); +select c, + (SELECT sum(x) FROM json_table(c, "$[*]" columns( x int path "$.x")) + AS jt) as SUBQ + from t1; + +explain select c, + (SELECT sum(x) FROM json_table(c, "$[*]" columns( x int path "$.x")) + AS jt) as SUBQ + from t1; + +drop table t1; + +--echo # --echo # End of 10.6 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/suite/json/t/type_json.test mariadb-10.11.9/mysql-test/suite/json/t/type_json.test --- mariadb-10.11.6/mysql-test/suite/json/t/type_json.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/json/t/type_json.test 2024-08-03 07:29:58.000000000 +0000 @@ -139,5 +139,14 @@ DROP TABLE t1, t1c, t2; --echo # +--echo # MDEV-30646 View created via JSON_ARRAYAGG returns incorrect json object +--echo # + +CREATE VIEW v1 AS SELECT JSON_OBJECT('plugin','unix_socket') as v1_json; +SELECT JSON_ARRAYAGG(v1_json) FROM v1; +DROP VIEW v1; + + +--echo # --echo # End of 10.5 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/suite/large_tests/r/maria_recover_encrypted.result mariadb-10.11.9/mysql-test/suite/large_tests/r/maria_recover_encrypted.result --- mariadb-10.11.6/mysql-test/suite/large_tests/r/maria_recover_encrypted.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/large_tests/r/maria_recover_encrypted.result 2024-08-03 07:29:58.000000000 +0000 @@ -36,7 +36,7 @@ UNLOCK TABLES; SET debug_dbug="d,crash_shutdown"; shutdown; -ERROR HY000: Lost connection to MySQL server during query +ERROR HY000: Lost connection to server during query SELECT * FROM t1 ORDER BY 1 DESC LIMIT 10; field1 field2 field3 1069999 2069999 3069999 diff -Nru mariadb-10.11.6/mysql-test/suite/large_tests/t/maria_recover_encrypted.test mariadb-10.11.9/mysql-test/suite/large_tests/t/maria_recover_encrypted.test --- mariadb-10.11.6/mysql-test/suite/large_tests/t/maria_recover_encrypted.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/large_tests/t/maria_recover_encrypted.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,6 +3,8 @@ --source include/have_maria.inc --source include/default_charset.inc +--source include/not_embedded.inc +--source include/have_debug.inc # Cleanup --disable_warnings @@ -13,7 +15,7 @@ # -------- # Configure encryption ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -21,7 +23,7 @@ 1;76025E3ADC78D74819927DB02AAA4C35 EOF ---exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/key.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/key.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc @@ -73,7 +75,7 @@ UNLOCK TABLES; # Crash and restart the server while it's still flushing index ---exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/key.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/key.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect SET debug_dbug="d,crash_shutdown"; --error 2013 shutdown; diff -Nru mariadb-10.11.6/mysql-test/suite/maria/alter.result mariadb-10.11.9/mysql-test/suite/maria/alter.result --- mariadb-10.11.6/mysql-test/suite/maria/alter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/alter.result 2024-08-03 07:29:58.000000000 +0000 @@ -193,3 +193,29 @@ INSERT INTO t1 VALUES (1, 'Nine chars or more'); ALTER TABLE t1 ENABLE KEYS; DROP TABLE t1; +# +# MDEV-25923 Memory not freed or Assertion `old_flags == ((my_flags & +# 0x10000U) ? 1 : 0)' failed in my_realloc upon ALTER on Aria table +# with GIS column +# +CREATE TABLE t1 (pk INT PRIMARY KEY, a POINT DEFAULT ST_GEOMFROMTEXT('Point(1 1)')) ENGINE=Aria; +INSERT INTO t1 (pk) SELECT seq FROM seq_1_to_100; +SET @old_threads= @@SESSION.aria_repair_threads; +SET SESSION aria_repair_threads= 2; +ALTER TABLE t1 ROW_FORMAT=DYNAMIC; +DROP TABLE t1; +# +# MDEV-33562: Assertion `(old_flags & 1) == ((my_flags & 0x10000U) ? +# 1 : 0)' failed in my_realloc from sort_get_next_record on INSERT +# +SET @old_mode= @@SESSION.sql_mode; +SET sql_mode=''; +CREATE TEMPORARY TABLE t (b TEXT, INDEX s(b(300))) ROW_FORMAT=DYNAMIC ENGINE=Aria; +INSERT INTO t VALUES (REPEAT ('a',10000000)); +Warnings: +Warning 1265 Data truncated for column 'b' at row 1 +CREATE TABLE ti LIKE t; +INSERT INTO ti SELECT * FROM t; +DROP TABLE t, ti; +SET SESSION aria_repair_threads= @old_threads; +SET SESSION sql_mode= @old_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/maria/alter.test mariadb-10.11.9/mysql-test/suite/maria/alter.test --- mariadb-10.11.6/mysql-test/suite/maria/alter.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/alter.test 2024-08-03 07:29:58.000000000 +0000 @@ -203,3 +203,31 @@ INSERT INTO t1 VALUES (1, 'Nine chars or more'); ALTER TABLE t1 ENABLE KEYS; DROP TABLE t1; + +--echo # +--echo # MDEV-25923 Memory not freed or Assertion `old_flags == ((my_flags & +--echo # 0x10000U) ? 1 : 0)' failed in my_realloc upon ALTER on Aria table +--echo # with GIS column +--echo # + +CREATE TABLE t1 (pk INT PRIMARY KEY, a POINT DEFAULT ST_GEOMFROMTEXT('Point(1 1)')) ENGINE=Aria; +INSERT INTO t1 (pk) SELECT seq FROM seq_1_to_100; +SET @old_threads= @@SESSION.aria_repair_threads; +SET SESSION aria_repair_threads= 2; +ALTER TABLE t1 ROW_FORMAT=DYNAMIC; +DROP TABLE t1; + +--echo # +--echo # MDEV-33562: Assertion `(old_flags & 1) == ((my_flags & 0x10000U) ? +--echo # 1 : 0)' failed in my_realloc from sort_get_next_record on INSERT +--echo # + +SET @old_mode= @@SESSION.sql_mode; +SET sql_mode=''; +CREATE TEMPORARY TABLE t (b TEXT, INDEX s(b(300))) ROW_FORMAT=DYNAMIC ENGINE=Aria; +INSERT INTO t VALUES (REPEAT ('a',10000000)); +CREATE TABLE ti LIKE t; +INSERT INTO ti SELECT * FROM t; +DROP TABLE t, ti; +SET SESSION aria_repair_threads= @old_threads; +SET SESSION sql_mode= @old_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/maria/bulk_insert_crash.test mariadb-10.11.9/mysql-test/suite/maria/bulk_insert_crash.test --- mariadb-10.11.6/mysql-test/suite/maria/bulk_insert_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/bulk_insert_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -12,7 +12,7 @@ # # Write file to make mysql-test-run.pl expect crash and restart ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect create table t1 (a int primary key, b int, c int, unique key(b), key(c)) engine=aria transactional=1; insert into t1 values (1000,1000,1000); diff -Nru mariadb-10.11.6/mysql-test/suite/maria/encrypt-no-key.test mariadb-10.11.9/mysql-test/suite/maria/encrypt-no-key.test --- mariadb-10.11.6/mysql-test/suite/maria/encrypt-no-key.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/encrypt-no-key.test 2024-08-03 07:29:58.000000000 +0000 @@ -29,10 +29,10 @@ --echo # Restart with encryption enabled ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc ---exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc @@ -43,10 +43,10 @@ # Restart without encryption. Above table should be unreadable ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc ---exec echo "restart:--aria-encrypt-tables=0" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--aria-encrypt-tables=0" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/suite/maria/encrypt-wrong-key.test mariadb-10.11.9/mysql-test/suite/maria/encrypt-wrong-key.test --- mariadb-10.11.6/mysql-test/suite/maria/encrypt-wrong-key.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/encrypt-wrong-key.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,7 +9,7 @@ call mtr.add_suppression("Unknown key id 1"); call mtr.add_suppression("Initialization of encryption failed.*"); ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -17,14 +17,14 @@ 1;770A8A65DA156D24EE2A093277530142 EOF ---exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc CREATE TABLE t1 (i INT, KEY(i)) ENGINE=Aria; INSERT INTO t1 VALUES (1); ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -32,7 +32,7 @@ 2;770A8A65DA156D24EE2A093277530143 EOF ---exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys2.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc @@ -43,11 +43,11 @@ --error HA_ERR_NO_ENCRYPTION INSERT INTO t1 VALUES (2); ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server --source include/wait_until_disconnected.inc ---exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/suite/maria/ps_maria.result mariadb-10.11.9/mysql-test/suite/maria/ps_maria.result --- mariadb-10.11.6/mysql-test/suite/maria/ps_maria.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/ps_maria.result 2024-08-03 07:29:58.000000000 +0000 @@ -1798,7 +1798,7 @@ `param09` longtext DEFAULT NULL, `const10` bigint(17) DEFAULT NULL, `param10` bigint(20) DEFAULT NULL, - `const11` int(4) DEFAULT NULL, + `const11` int(5) DEFAULT NULL, `param11` bigint(20) DEFAULT NULL, `const12` binary(0) DEFAULT NULL, `param12` bigint(20) DEFAULT NULL, @@ -1828,7 +1828,7 @@ def test t5 t5 param09 param09 252 4294967295 19 Y 16 0 8 def test t5 t5 const10 const10 8 17 9 Y 32768 0 63 def test t5 t5 param10 param10 8 20 9 Y 32768 0 63 -def test t5 t5 const11 const11 3 4 4 Y 32768 0 63 +def test t5 t5 const11 const11 3 5 4 Y 32768 0 63 def test t5 t5 param11 param11 8 20 4 Y 32768 0 63 def test t5 t5 const12 const12 254 0 0 Y 128 0 63 def test t5 t5 param12 param12 8 20 0 Y 32768 0 63 diff -Nru mariadb-10.11.6/mysql-test/suite/maria/range.result mariadb-10.11.9/mysql-test/suite/maria/range.result --- mariadb-10.11.6/mysql-test/suite/maria/range.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/range.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,6 @@ +# +# MDEV-22935 Erroneous Aria Index / Optimizer behaviour +# +create table t1 (a char(255), b datetime, primary key(a,b)) engine=aria transactional=0 pack_keys=0; +insert into t1 select concat("hello world hello world", truncate(seq/100,0)),from_unixtime(seq+1) from seq_1_to_20000; +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/maria/range.test mariadb-10.11.9/mysql-test/suite/maria/range.test --- mariadb-10.11.6/mysql-test/suite/maria/range.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/range.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,22 @@ +--source include/have_sequence.inc + +--echo # +--echo # MDEV-22935 Erroneous Aria Index / Optimizer behaviour +--echo # + +create table t1 (a char(255), b datetime, primary key(a,b)) engine=aria transactional=0 pack_keys=0; +insert into t1 select concat("hello world hello world", truncate(seq/100,0)),from_unixtime(seq+1) from seq_1_to_20000; + +let $i= 200; +--disable_query_log +while ($i) +{ + let $tmp= `select count(*) from t1 where a="hello world hello world$i" and b <= from_unixtime($i*100+1)`; + if (`SELECT $tmp != 1`) + { + --echo "Found $tmp rows, expected 1, for value $i" + } + dec $i; +} +--enable_query_log +drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/maria/repair.result mariadb-10.11.9/mysql-test/suite/maria/repair.result --- mariadb-10.11.6/mysql-test/suite/maria/repair.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/repair.result 2024-08-03 07:29:58.000000000 +0000 @@ -62,3 +62,26 @@ # # End of 10.3 tests # +# +# MDEV-34055 Assertion `readbytes != (size_t)-1 || +# (*__errno_location ()) != 9' failure or corruption errors upon +# REPAIR on Aria tables +# +CREATE OR REPLACE TABLE t1 (a INT, b INT, UNIQUE(b), UNIQUE(a)) ENGINE=Aria; +INSERT INTO t1 VALUES (1,2); +REPAIR TABLE t1 EXTENDED QUICK USE_FRM; +Table Op Msg_type Msg_text +test.t1 repair warning Number of rows changed from 0 to 1 +test.t1 repair status OK +CREATE TABLE t2 (c INT) ENGINE=Aria; +SELECT * FROM t2; +c +REPLACE INTO t1 VALUES (1,3); +REPAIR TABLE t2, t1 QUICK; +Table Op Msg_type Msg_text +test.t2 repair status OK +test.t1 repair status OK +DROP TABLE t1, t2; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/suite/maria/repair.test mariadb-10.11.9/mysql-test/suite/maria/repair.test --- mariadb-10.11.6/mysql-test/suite/maria/repair.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/maria/repair.test 2024-08-03 07:29:58.000000000 +0000 @@ -74,3 +74,22 @@ --echo # --echo # End of 10.3 tests --echo # + +--echo # +--echo # MDEV-34055 Assertion `readbytes != (size_t)-1 || +--echo # (*__errno_location ()) != 9' failure or corruption errors upon +--echo # REPAIR on Aria tables +--echo # + +CREATE OR REPLACE TABLE t1 (a INT, b INT, UNIQUE(b), UNIQUE(a)) ENGINE=Aria; +INSERT INTO t1 VALUES (1,2); +REPAIR TABLE t1 EXTENDED QUICK USE_FRM; +CREATE TABLE t2 (c INT) ENGINE=Aria; +SELECT * FROM t2; +REPLACE INTO t1 VALUES (1,3); +REPAIR TABLE t2, t1 QUICK; +DROP TABLE t1, t2; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/absolute_ibdata_paths.test mariadb-10.11.9/mysql-test/suite/mariabackup/absolute_ibdata_paths.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/absolute_ibdata_paths.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/absolute_ibdata_paths.test 2024-08-03 07:29:58.000000000 +0000 @@ -30,7 +30,7 @@ let $_innodb_data_home_dir=`select @@innodb_data_home_dir`; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log exec $XTRABACKUP --prepare --target-dir=$targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/alter_copy_race.result mariadb-10.11.9/mysql-test/suite/mariabackup/alter_copy_race.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/alter_copy_race.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/alter_copy_race.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ connect con2, localhost, root,,; connection con2; set lock_wait_timeout=1; -SET debug_sync='copy_data_between_tables_before_reset_backup_lock SIGNAL go WAIT_FOR after_backup_stage_block_commit'; +SET debug_sync='copy_data_between_tables_before_reset_backup_lock SIGNAL go WAIT_FOR after_backup_stage_block_ddl'; SET debug_sync='alter_table_after_temp_table_drop SIGNAL temp_table_dropped'; SET debug_sync='now WAIT_FOR after_backup_stage_start';ALTER TABLE test.t1 FORCE, algorithm=COPY;| connection default; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/alter_copy_race.test mariadb-10.11.9/mysql-test/suite/mariabackup/alter_copy_race.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/alter_copy_race.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/alter_copy_race.test 2024-08-03 07:29:58.000000000 +0000 @@ -18,7 +18,7 @@ connect con2, localhost, root,,; connection con2; set lock_wait_timeout=1; -SET debug_sync='copy_data_between_tables_before_reset_backup_lock SIGNAL go WAIT_FOR after_backup_stage_block_commit'; +SET debug_sync='copy_data_between_tables_before_reset_backup_lock SIGNAL go WAIT_FOR after_backup_stage_block_ddl'; SET debug_sync='alter_table_after_temp_table_drop SIGNAL temp_table_dropped'; DELIMITER |; send SET debug_sync='now WAIT_FOR after_backup_stage_start';ALTER TABLE test.t1 FORCE, algorithm=COPY;| @@ -27,7 +27,7 @@ # setup mariabackup events let after_backup_stage_start=SET debug_sync='now SIGNAL after_backup_stage_start WAIT_FOR go'; -let after_backup_stage_block_commit=SET debug_sync='now SIGNAL after_backup_stage_block_commit'; +let after_backup_stage_block_ddl=SET debug_sync='now SIGNAL after_backup_stage_block_ddl'; let backup_fix_ddl=SET debug_sync='now WAIT_FOR temp_table_dropped'; --disable_result_log exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,mariabackup_events; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/apply-log-only-incr.test mariadb-10.11.9/mysql-test/suite/mariabackup/apply-log-only-incr.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/apply-log-only-incr.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/apply-log-only-incr.test 2024-08-03 07:29:58.000000000 +0000 @@ -19,7 +19,7 @@ } --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log let $n=100; while ($n) { @@ -36,7 +36,7 @@ connection default; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --ftwrl-wait-timeout=5 --ftwrl-wait-threshold=300 --ftwrl-wait-query-type=all --target-dir=$incremental_dir --incremental-basedir=$basedir ; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --ftwrl-wait-timeout=5 --ftwrl-wait-threshold=300 --ftwrl-wait-query-type=all --target-dir=$incremental_dir --incremental-basedir=$basedir ; exec $XTRABACKUP --prepare --verbose --target-dir=$basedir ; --enable_result_log diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/apply-log-only.test mariadb-10.11.9/mysql-test/suite/mariabackup/apply-log-only.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/apply-log-only.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/apply-log-only.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,7 @@ INSERT INTO t VALUES(1); --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log exec $XTRABACKUP --prepare --target-dir=$basedir ; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_backup.opt mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.opt --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_backup.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--loose-partition --loose-aria-log-file-size=8388608 diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_backup.result mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_backup.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,780 @@ +### +# Test for backup to stream +##### +### +# Test for mix of online/offline backup tables +##### +CREATE TABLE t_default(i INT PRIMARY KEY) +ENGINE ARIA; +INSERT INTO t_default VALUES (1); +CREATE TABLE t_tr_p_ch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_tr_p_ch VALUES (1); +CREATE TABLE t_tr_p_nch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=0; +INSERT INTO t_tr_p_nch VALUES (1); +CREATE TABLE t_p_ch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_p_ch VALUES (1); +CREATE TABLE t_p_nch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=PAGE PAGE_CHECKSUM=0; +INSERT INTO t_p_nch VALUES (1); +CREATE TABLE t_fixed(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=FIXED PAGE_CHECKSUM=1; +INSERT INTO t_fixed VALUES (1); +CREATE TABLE t_dyn(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=DYNAMIC PAGE_CHECKSUM=1; +INSERT INTO t_dyn VALUES (1); +# Test for partitioned table +CREATE TABLE t_part_online(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL = 1 PAGE_CHECKSUM = 1 +PARTITION BY RANGE( i ) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (20), +PARTITION p2 VALUES LESS THAN (30) +); +INSERT INTO t_part_online VALUES(5); +INSERT INTO t_part_online VALUES(15); +INSERT INTO t_part_online VALUES(25); +SELECT * FROM t_part_online; +i +5 +15 +25 +CREATE TABLE t_part_offline(i INT) +ENGINE ARIA TRANSACTIONAL = 0 PAGE_CHECKSUM = 0 +PARTITION BY RANGE( i ) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (20), +PARTITION p2 VALUES LESS THAN (30) +); +INSERT INTO t_part_offline VALUES(5); +INSERT INTO t_part_offline VALUES(15); +INSERT INTO t_part_offline VALUES(25); +# Test for filename to tablename mapping +CREATE TABLE `t 1 t-1`(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO `t 1 t-1` VALUES (1); +CREATE TABLE `t-part online`(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL = 1 PAGE_CHECKSUM = 1 +PARTITION BY RANGE( i ) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (20), +PARTITION p2 VALUES LESS THAN (30) +); +INSERT INTO `t-part online` VALUES(5); +INSERT INTO `t-part online` VALUES(15); +INSERT INTO `t-part online` VALUES(25); +### +# Test for redo log files backup; +##### +CREATE TABLE t_logs_1(i INT) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +CREATE TABLE t_logs_2 LIKE t_logs_1; +CREATE TABLE t_bulk_ins LIKE t_logs_1; +INSERT INTO t_logs_1 VALUES +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9); +# Generate several log files +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +### +# Test for DML during backup for online backup +##### +CREATE TABLE t_dml_ins(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_ins VALUES(1); +CREATE TABLE t_dml_upd(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_upd VALUES(1); +CREATE TABLE t_dml_del(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_del VALUES(1); +### +# Test for DDL during backup for online backup +##### +CREATE DATABASE test_for_db_drop; +CREATE TABLE test_for_db_drop.t(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_db_create(i INT PRIMARY KEY) ENGINE ARIA; +SHOW DATABASES; +Database +information_schema +mtr +mysql +performance_schema +sys +test +test_for_db_drop +CREATE TABLE t_alter(i INT PRIMARY KEY) ENGINE ARIA; +INSERT INTO t_alter VALUES (1); +CREATE TABLE t_trunc(i INT PRIMARY KEY) ENGINE ARIA; +INSERT INTO t_trunc VALUES (1); +CREATE TABLE t_ch_i (i int(10), index(i) ) ENGINE=Aria; +INSERT INTO t_ch_i VALUES(1); +CREATE TABLE t_change_engine(i INT PRIMARY KEY) ENGINE InnoDB; +INSERT INTO t_change_engine VALUES (1); +CREATE TABLE t_rename(i INT PRIMARY KEY) ENGINE ARIA; +CREATE DATABASE test_for_rename; +CREATE TABLE t_rename_2(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_3(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_4(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_delete(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_delete_2(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_alter(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_create(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_part_create(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_part_add_part(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_part_change_eng(i INT PRIMARY KEY) ENGINE ARIA PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_change_eng_2(i INT PRIMARY KEY) ENGINE InnoDB PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_change_eng_3(i INT PRIMARY KEY) ENGINE Aria; +CREATE TABLE t_part_alter(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_alter_2(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 3; +CREATE TABLE t_part_drop(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_rename(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_rename_3(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_rm_part(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +SET SESSION debug_dbug="+d,maria_flush_whole_log"; +SET GLOBAL aria_checkpoint_interval=10000; +### Backup to stream +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart +### Result for DDL test +SHOW CREATE TABLE t_alter; +Table Create Table +t_alter CREATE TABLE `t_alter` ( + `i` int(11) NOT NULL, + `c` int(11) DEFAULT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_alter; +i c +1 NULL +SHOW CREATE TABLE t_change_engine; +Table Create Table +t_change_engine CREATE TABLE `t_change_engine` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_change_engine; +i +1 +SELECT * FROM t_trunc; +i +1 +SELECT * FROM t_ch_i; +i +1 +SELECT * FROM t_rename_new; +i +SELECT * FROM test_for_rename.t_rename_new_2; +i +SELECT * FROM t_rename_new_new_3; +i +SELECT * FROM t_rename_new_4; +i +SELECT * FROM t_delete; +ERROR 42S02: Table 'test.t_delete' doesn't exist +SHOW CREATE TABLE t_delete_2; +Table Create Table +t_delete_2 CREATE TABLE `t_delete_2` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_rename_alter_2; +i c +SELECT * FROM t_rename_create; +d +SELECT * FROM t_rename_create_new; +i +SHOW CREATE TABLE t_part_create_2; +Table Create Table +t_part_create_2 CREATE TABLE `t_part_create_2` ( + `i` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_create_2; +i +SHOW CREATE TABLE t_part_add_part; +Table Create Table +t_part_add_part CREATE TABLE `t_part_add_part` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_add_part; +i +SHOW CREATE TABLE t_part_change_eng; +Table Create Table +t_part_change_eng CREATE TABLE `t_part_change_eng` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_change_eng; +i +SHOW CREATE TABLE t_part_change_eng_2; +Table Create Table +t_part_change_eng_2 CREATE TABLE `t_part_change_eng_2` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_change_eng_2; +i +SELECT * FROM t_part_alter; +i c +SHOW CREATE TABLE t_part_alter_2; +Table Create Table +t_part_alter_2 CREATE TABLE `t_part_alter_2` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_alter_2; +i +SELECT * FROM t_part_drop; +ERROR 42S02: Table 'test.t_part_drop' doesn't exist +SELECT * FROM t_part_rename; +ERROR 42S02: Table 'test.t_part_rename' doesn't exist +SELECT * FROM t_part_rename_2; +i +SELECT * FROM t_part_rename_3; +ERROR 42S02: Table 'test.t_part_rename_3' doesn't exist +SELECT * FROM test_for_rename.t_part_rename_4; +i +SHOW CREATE TABLE t_part_rm_part; +Table Create Table +t_part_rm_part CREATE TABLE `t_part_rm_part` ( + `i` int(11) NOT NULL, + `c` int(11) DEFAULT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_part_rm_part; +i c +SHOW DATABASES; +Database +information_schema +mtr +mysql +performance_schema +sys +test +test_for_db_create +test_for_rename +### Clean up for DDL test +DROP DATABASE test_for_db_create; +DROP TABLE t_db_create; +DROP TABLE t_change_engine; +DROP TABLE t_alter; +DROP TABLE t_trunc; +DROP TABLE t_ch_i; +DROP TABLE t_rename_new; +DROP TABLE t_rename_new_new_3; +DROP TABLE t_rename_new_4; +DROP TABLE t_delete_2; +DROP TABLE t_rename_alter_2; +DROP TABLE t_rename_create; +DROP TABLE t_rename_create_new; +DROP TABLE t_part_create; +DROP TABLE t_part_create_2; +DROP TABLE t_part_add_part; +DROP TABLE t_part_change_eng; +DROP TABLE t_part_change_eng_2; +DROP TABLE t_part_change_eng_3; +DROP TABLE t_part_alter; +DROP TABLE t_part_alter_2; +DROP TABLE t_part_rename_2; +DROP TABLE t_part_rm_part; +DROP DATABASE test_for_rename; +### Result for DML test +SELECT * FROM t_dml_ins; +i +1 +2 +SELECT * FROM t_dml_upd; +i +2 +SELECT * FROM t_dml_del; +i +### Clean up for DML test +DROP TABLE t_dml_ins; +DROP TABLE t_dml_upd; +DROP TABLE t_dml_del; +### Result for redo log files backup +# ok +# ok +# ok +### Cleanup for redo log files backup +DROP TABLE t_logs_1; +DROP TABLE t_logs_2; +DROP TABLE t_bulk_ins; +### Result for online/offline tables test +SELECT * FROM t_default; +i +1 +SELECT * FROM t_tr_p_ch; +i +1 +SELECT * FROM t_tr_p_nch; +i +1 +SELECT * FROM t_p_ch; +i +1 +SELECT * FROM t_p_nch; +i +1 +SELECT * FROM t_fixed; +i +1 +SELECT * FROM t_dyn; +i +1 +SELECT * FROM t_part_online; +i +5 +15 +25 +SELECT * FROM t_part_offline; +i +5 +15 +25 +SELECT * FROM `t 1 t-1`; +i +1 +SELECT * FROM `t-part online`; +i +5 +15 +25 +### Cleanup for online/offline tables test +DROP TABLE t_default; +DROP TABLE t_tr_p_ch; +DROP TABLE t_tr_p_nch; +DROP TABLE t_p_ch; +DROP TABLE t_p_nch; +DROP TABLE t_fixed; +DROP TABLE t_dyn; +DROP TABLE t_part_online; +DROP TABLE t_part_offline; +DROP TABLE `t 1 t-1`; +DROP TABLE `t-part online`; +### +# Test for backup to directory +##### +### +# Test for mix of online/offline backup tables +##### +CREATE TABLE t_default(i INT PRIMARY KEY) +ENGINE ARIA; +INSERT INTO t_default VALUES (1); +CREATE TABLE t_tr_p_ch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_tr_p_ch VALUES (1); +CREATE TABLE t_tr_p_nch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=0; +INSERT INTO t_tr_p_nch VALUES (1); +CREATE TABLE t_p_ch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_p_ch VALUES (1); +CREATE TABLE t_p_nch(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=PAGE PAGE_CHECKSUM=0; +INSERT INTO t_p_nch VALUES (1); +CREATE TABLE t_fixed(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=FIXED PAGE_CHECKSUM=1; +INSERT INTO t_fixed VALUES (1); +CREATE TABLE t_dyn(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=DYNAMIC PAGE_CHECKSUM=1; +INSERT INTO t_dyn VALUES (1); +# Test for partitioned table +CREATE TABLE t_part_online(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL = 1 PAGE_CHECKSUM = 1 +PARTITION BY RANGE( i ) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (20), +PARTITION p2 VALUES LESS THAN (30) +); +INSERT INTO t_part_online VALUES(5); +INSERT INTO t_part_online VALUES(15); +INSERT INTO t_part_online VALUES(25); +SELECT * FROM t_part_online; +i +5 +15 +25 +CREATE TABLE t_part_offline(i INT) +ENGINE ARIA TRANSACTIONAL = 0 PAGE_CHECKSUM = 0 +PARTITION BY RANGE( i ) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (20), +PARTITION p2 VALUES LESS THAN (30) +); +INSERT INTO t_part_offline VALUES(5); +INSERT INTO t_part_offline VALUES(15); +INSERT INTO t_part_offline VALUES(25); +# Test for filename to tablename mapping +CREATE TABLE `t 1 t-1`(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO `t 1 t-1` VALUES (1); +CREATE TABLE `t-part online`(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL = 1 PAGE_CHECKSUM = 1 +PARTITION BY RANGE( i ) ( +PARTITION p0 VALUES LESS THAN (10), +PARTITION p1 VALUES LESS THAN (20), +PARTITION p2 VALUES LESS THAN (30) +); +INSERT INTO `t-part online` VALUES(5); +INSERT INTO `t-part online` VALUES(15); +INSERT INTO `t-part online` VALUES(25); +### +# Test for redo log files backup; +##### +CREATE TABLE t_logs_1(i INT) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +CREATE TABLE t_logs_2 LIKE t_logs_1; +CREATE TABLE t_bulk_ins LIKE t_logs_1; +INSERT INTO t_logs_1 VALUES +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9), +(0), (1), (2), (3), (4), (5), (6), (7), (8), (9); +# Generate several log files +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +### +# Test for DML during backup for online backup +##### +CREATE TABLE t_dml_ins(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_ins VALUES(1); +CREATE TABLE t_dml_upd(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_upd VALUES(1); +CREATE TABLE t_dml_del(i INT PRIMARY KEY) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_del VALUES(1); +### +# Test for DDL during backup for online backup +##### +CREATE DATABASE test_for_db_drop; +CREATE TABLE test_for_db_drop.t(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_db_create(i INT PRIMARY KEY) ENGINE ARIA; +SHOW DATABASES; +Database +information_schema +mtr +mysql +performance_schema +sys +test +test_for_db_drop +CREATE TABLE t_alter(i INT PRIMARY KEY) ENGINE ARIA; +INSERT INTO t_alter VALUES (1); +CREATE TABLE t_trunc(i INT PRIMARY KEY) ENGINE ARIA; +INSERT INTO t_trunc VALUES (1); +CREATE TABLE t_ch_i (i int(10), index(i) ) ENGINE=Aria; +INSERT INTO t_ch_i VALUES(1); +CREATE TABLE t_change_engine(i INT PRIMARY KEY) ENGINE InnoDB; +INSERT INTO t_change_engine VALUES (1); +CREATE TABLE t_rename(i INT PRIMARY KEY) ENGINE ARIA; +CREATE DATABASE test_for_rename; +CREATE TABLE t_rename_2(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_3(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_4(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_delete(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_delete_2(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_alter(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_rename_create(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_part_create(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_part_add_part(i INT PRIMARY KEY) ENGINE ARIA; +CREATE TABLE t_part_change_eng(i INT PRIMARY KEY) ENGINE ARIA PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_change_eng_2(i INT PRIMARY KEY) ENGINE InnoDB PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_change_eng_3(i INT PRIMARY KEY) ENGINE Aria; +CREATE TABLE t_part_alter(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_alter_2(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 3; +CREATE TABLE t_part_drop(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_rename(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_rename_3(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_rm_part(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +SET SESSION debug_dbug="+d,maria_flush_whole_log"; +SET GLOBAL aria_checkpoint_interval=10000; +### Backup to dir +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart +### Result for DDL test +SHOW CREATE TABLE t_alter; +Table Create Table +t_alter CREATE TABLE `t_alter` ( + `i` int(11) NOT NULL, + `c` int(11) DEFAULT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_alter; +i c +1 NULL +SHOW CREATE TABLE t_change_engine; +Table Create Table +t_change_engine CREATE TABLE `t_change_engine` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_change_engine; +i +1 +SELECT * FROM t_trunc; +i +1 +SELECT * FROM t_ch_i; +i +1 +SELECT * FROM t_rename_new; +i +SELECT * FROM test_for_rename.t_rename_new_2; +i +SELECT * FROM t_rename_new_new_3; +i +SELECT * FROM t_rename_new_4; +i +SELECT * FROM t_delete; +ERROR 42S02: Table 'test.t_delete' doesn't exist +SHOW CREATE TABLE t_delete_2; +Table Create Table +t_delete_2 CREATE TABLE `t_delete_2` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_rename_alter_2; +i c +SELECT * FROM t_rename_create; +d +SELECT * FROM t_rename_create_new; +i +SHOW CREATE TABLE t_part_create_2; +Table Create Table +t_part_create_2 CREATE TABLE `t_part_create_2` ( + `i` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_create_2; +i +SHOW CREATE TABLE t_part_add_part; +Table Create Table +t_part_add_part CREATE TABLE `t_part_add_part` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_add_part; +i +SHOW CREATE TABLE t_part_change_eng; +Table Create Table +t_part_change_eng CREATE TABLE `t_part_change_eng` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_change_eng; +i +SHOW CREATE TABLE t_part_change_eng_2; +Table Create Table +t_part_change_eng_2 CREATE TABLE `t_part_change_eng_2` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_change_eng_2; +i +SELECT * FROM t_part_alter; +i c +SHOW CREATE TABLE t_part_alter_2; +Table Create Table +t_part_alter_2 CREATE TABLE `t_part_alter_2` ( + `i` int(11) NOT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci + PARTITION BY HASH (`i`) +PARTITIONS 2 +SELECT * FROM t_part_alter_2; +i +SELECT * FROM t_part_drop; +ERROR 42S02: Table 'test.t_part_drop' doesn't exist +SELECT * FROM t_part_rename; +ERROR 42S02: Table 'test.t_part_rename' doesn't exist +SELECT * FROM t_part_rename_2; +i +SELECT * FROM t_part_rename_3; +ERROR 42S02: Table 'test.t_part_rename_3' doesn't exist +SELECT * FROM test_for_rename.t_part_rename_4; +i +SHOW CREATE TABLE t_part_rm_part; +Table Create Table +t_part_rm_part CREATE TABLE `t_part_rm_part` ( + `i` int(11) NOT NULL, + `c` int(11) DEFAULT NULL, + PRIMARY KEY (`i`) +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +SELECT * FROM t_part_rm_part; +i c +SHOW DATABASES; +Database +information_schema +mtr +mysql +performance_schema +sys +test +test_for_db_create +test_for_rename +### Clean up for DDL test +DROP DATABASE test_for_db_create; +DROP TABLE t_db_create; +DROP TABLE t_change_engine; +DROP TABLE t_alter; +DROP TABLE t_trunc; +DROP TABLE t_ch_i; +DROP TABLE t_rename_new; +DROP TABLE t_rename_new_new_3; +DROP TABLE t_rename_new_4; +DROP TABLE t_delete_2; +DROP TABLE t_rename_alter_2; +DROP TABLE t_rename_create; +DROP TABLE t_rename_create_new; +DROP TABLE t_part_create; +DROP TABLE t_part_create_2; +DROP TABLE t_part_add_part; +DROP TABLE t_part_change_eng; +DROP TABLE t_part_change_eng_2; +DROP TABLE t_part_change_eng_3; +DROP TABLE t_part_alter; +DROP TABLE t_part_alter_2; +DROP TABLE t_part_rename_2; +DROP TABLE t_part_rm_part; +DROP DATABASE test_for_rename; +### Result for DML test +SELECT * FROM t_dml_ins; +i +1 +2 +SELECT * FROM t_dml_upd; +i +2 +SELECT * FROM t_dml_del; +i +### Clean up for DML test +DROP TABLE t_dml_ins; +DROP TABLE t_dml_upd; +DROP TABLE t_dml_del; +### Result for redo log files backup +# ok +# ok +# ok +### Cleanup for redo log files backup +DROP TABLE t_logs_1; +DROP TABLE t_logs_2; +DROP TABLE t_bulk_ins; +### Result for online/offline tables test +SELECT * FROM t_default; +i +1 +SELECT * FROM t_tr_p_ch; +i +1 +SELECT * FROM t_tr_p_nch; +i +1 +SELECT * FROM t_p_ch; +i +1 +SELECT * FROM t_p_nch; +i +1 +SELECT * FROM t_fixed; +i +1 +SELECT * FROM t_dyn; +i +1 +SELECT * FROM t_part_online; +i +5 +15 +25 +SELECT * FROM t_part_offline; +i +5 +15 +25 +SELECT * FROM `t 1 t-1`; +i +1 +SELECT * FROM `t-part online`; +i +5 +15 +25 +### Cleanup for online/offline tables test +DROP TABLE t_default; +DROP TABLE t_tr_p_ch; +DROP TABLE t_tr_p_nch; +DROP TABLE t_p_ch; +DROP TABLE t_p_nch; +DROP TABLE t_fixed; +DROP TABLE t_dyn; +DROP TABLE t_part_online; +DROP TABLE t_part_offline; +DROP TABLE `t 1 t-1`; +DROP TABLE `t-part online`; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_backup.test mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_backup.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,425 @@ +--source include/have_aria.inc +--source include/have_partition.inc +--source include/have_debug.inc +--source include/big_test.inc +# This test timeouts with msan +--source include/not_msan.inc + +--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup +--let $backup_stream=2 +--let $backup_dir=1 +--let $backup_variant=$backup_stream + +while ($backup_variant) { +if ($backup_variant == $backup_stream) { +--echo ### +--echo # Test for backup to stream +--echo ##### +} +if ($backup_variant == $backup_dir) { +--echo ### +--echo # Test for backup to directory +--echo ##### +} + +--echo ### +--echo # Test for mix of online/offline backup tables +--echo ##### + +CREATE TABLE t_default(i INT PRIMARY KEY) + ENGINE ARIA; +INSERT INTO t_default VALUES (1); + +CREATE TABLE t_tr_p_ch(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_tr_p_ch VALUES (1); + +CREATE TABLE t_tr_p_nch(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=0; +INSERT INTO t_tr_p_nch VALUES (1); + +CREATE TABLE t_p_ch(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_p_ch VALUES (1); + +CREATE TABLE t_p_nch(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=PAGE PAGE_CHECKSUM=0; +INSERT INTO t_p_nch VALUES (1); + +CREATE TABLE t_fixed(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=FIXED PAGE_CHECKSUM=1; +INSERT INTO t_fixed VALUES (1); + +CREATE TABLE t_dyn(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=0 ROW_FORMAT=DYNAMIC PAGE_CHECKSUM=1; +INSERT INTO t_dyn VALUES (1); + +--echo # Test for partitioned table +CREATE TABLE t_part_online(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL = 1 PAGE_CHECKSUM = 1 + PARTITION BY RANGE( i ) ( + PARTITION p0 VALUES LESS THAN (10), + PARTITION p1 VALUES LESS THAN (20), + PARTITION p2 VALUES LESS THAN (30) + ); + +INSERT INTO t_part_online VALUES(5); +INSERT INTO t_part_online VALUES(15); +INSERT INTO t_part_online VALUES(25); +SELECT * FROM t_part_online; + +CREATE TABLE t_part_offline(i INT) + ENGINE ARIA TRANSACTIONAL = 0 PAGE_CHECKSUM = 0 + PARTITION BY RANGE( i ) ( + PARTITION p0 VALUES LESS THAN (10), + PARTITION p1 VALUES LESS THAN (20), + PARTITION p2 VALUES LESS THAN (30) + ); + +INSERT INTO t_part_offline VALUES(5); +INSERT INTO t_part_offline VALUES(15); +INSERT INTO t_part_offline VALUES(25); + +--echo # Test for filename to tablename mapping +CREATE TABLE `t 1 t-1`(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO `t 1 t-1` VALUES (1); + +CREATE TABLE `t-part online`(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL = 1 PAGE_CHECKSUM = 1 + PARTITION BY RANGE( i ) ( + PARTITION p0 VALUES LESS THAN (10), + PARTITION p1 VALUES LESS THAN (20), + PARTITION p2 VALUES LESS THAN (30) + ); + +INSERT INTO `t-part online` VALUES(5); +INSERT INTO `t-part online` VALUES(15); +INSERT INTO `t-part online` VALUES(25); + + +--echo ### +--echo # Test for redo log files backup; +--echo ##### +CREATE TABLE t_logs_1(i INT) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +CREATE TABLE t_logs_2 LIKE t_logs_1; +CREATE TABLE t_bulk_ins LIKE t_logs_1; +INSERT INTO t_logs_1 VALUES + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), + (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); +--echo # Generate several log files +--let $i = 0 +while ($i < 14) { +INSERT INTO t_logs_1 SELECT * FROM t_logs_1; +--inc $i +} + +--echo ### +--echo # Test for DML during backup for online backup +--echo ##### +CREATE TABLE t_dml_ins(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_ins VALUES(1); +--let after_aria_table_copy_test_t_dml_ins=INSERT INTO test.t_dml_ins VALUES(2) +CREATE TABLE t_dml_upd(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_upd VALUES(1); +--let after_aria_table_copy_test_t_dml_upd=UPDATE test.t_dml_upd SET i = 2 +CREATE TABLE t_dml_del(i INT PRIMARY KEY) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +INSERT INTO t_dml_del VALUES(1); +--let after_aria_table_copy_test_t_dml_del=DELETE FROM test.t_dml_del + +--echo ### +--echo # Test for DDL during backup for online backup +--echo ##### +CREATE DATABASE test_for_db_drop; +CREATE TABLE test_for_db_drop.t(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_for_db_drop_t=DROP DATABASE test_for_db_drop +CREATE TABLE t_db_create(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_db_create=CREATE DATABASE test_for_db_create +--sorted_result +SHOW DATABASES; + +CREATE TABLE t_alter(i INT PRIMARY KEY) ENGINE ARIA; +INSERT INTO t_alter VALUES (1); +--let after_aria_table_copy_test_t_alter=ALTER TABLE test.t_alter ADD COLUMN c INT + +CREATE TABLE t_trunc(i INT PRIMARY KEY) ENGINE ARIA; +INSERT INTO t_trunc VALUES (1); +--let after_aria_table_copy_test_t_trunc=TRUNCATE TABLE test.t_trunc + +CREATE TABLE t_ch_i (i int(10), index(i) ) ENGINE=Aria; +INSERT INTO t_ch_i VALUES(1); +--let after_aria_table_copy_test_t_ch_i=ALTER TABLE test.t_ch_i DISABLE KEYS + +CREATE TABLE t_change_engine(i INT PRIMARY KEY) ENGINE InnoDB; +INSERT INTO t_change_engine VALUES (1); +--let after_aria_background=begin not atomic ALTER TABLE test.t_change_engine ENGINE = ARIA; INSERT INTO test.t_logs_1 SELECT * FROM test.t_logs_1; INSERT INTO test.t_bulk_ins SELECT * FROM test.t_logs_1; INSERT INTO test.t_logs_2 SET i = 1; end + +CREATE TABLE t_rename(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_rename=RENAME TABLE test.t_rename TO test.t_rename_new +CREATE DATABASE test_for_rename; +CREATE TABLE t_rename_2(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_rename_2=RENAME TABLE test.t_rename_2 TO test_for_rename.t_rename_new_2 + +CREATE TABLE t_rename_3(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_rename_3=begin not atomic RENAME TABLE test.t_rename_3 TO test.t_rename_new_3; RENAME TABLE test.t_rename_new_3 TO test.t_rename_new_new_3; end + +CREATE TABLE t_rename_4(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_rename_4=begin not atomic RENAME TABLE test.t_rename_4 TO test.t_rename_new_4; RENAME TABLE test.t_rename_new_4 TO test.t_rename_new_new_4; RENAME TABLE test.t_rename_new_new_4 TO test.t_rename_new_4; end + +CREATE TABLE t_delete(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_delete=DROP TABLE test.t_delete + +CREATE TABLE t_delete_2(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_delete_2=ALTER TABLE test.t_delete_2 ENGINE=Innodb + +CREATE TABLE t_rename_alter(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_rename_alter=begin not atomic RENAME TABLE test.t_rename_alter TO test.t_rename_alter_2; ALTER TABLE test.t_rename_alter_2 ADD COLUMN c INT; end + +CREATE TABLE t_rename_create(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_rename_create=begin not atomic RENAME TABLE test.t_rename_create TO test.t_rename_create_new; CREATE TABLE test.t_rename_create(d INT PRIMARY KEY) ENGINE ARIA; end + +CREATE TABLE t_part_create(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_part_create=create table test.t_part_create_2 (i int) engine=Aria PARTITION BY HASH(i) PARTITIONS 2 + +CREATE TABLE t_part_add_part(i INT PRIMARY KEY) ENGINE ARIA; +--let after_aria_table_copy_test_t_part_add_part=alter table test.t_part_add_part PARTITION BY HASH(i) PARTITIONS 2 + +CREATE TABLE t_part_change_eng(i INT PRIMARY KEY) ENGINE ARIA PARTITION BY HASH(i) PARTITIONS 2; +--let after_aria_table_copy_test_t_part_change_eng=alter table test.t_part_change_eng ENGINE=InnoDB + +CREATE TABLE t_part_change_eng_2(i INT PRIMARY KEY) ENGINE InnoDB PARTITION BY HASH(i) PARTITIONS 2; +CREATE TABLE t_part_change_eng_3(i INT PRIMARY KEY) ENGINE Aria; +--let after_aria_table_copy_test_t_part_change_eng_3=alter table test.t_part_change_eng_2 ENGINE=Aria + +CREATE TABLE t_part_alter(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +--let after_aria_table_copy_test_t_part_alter=alter table test.t_part_alter ADD COLUMN c INT + +CREATE TABLE t_part_alter_2(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 3; +--let after_aria_table_copy_test_t_part_alter_2=alter table test.t_part_alter_2 COALESCE PARTITION 1 + +CREATE TABLE t_part_drop(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +--let after_aria_table_copy_test_t_part_drop=DROP table test.t_part_drop + +CREATE TABLE t_part_rename(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +--let after_aria_table_copy_test_t_part_rename=RENAME TABLE test.t_part_rename TO test.t_part_rename_2 + +CREATE TABLE t_part_rename_3(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +--let after_aria_table_copy_test_t_part_rename_3=RENAME TABLE test.t_part_rename_3 TO test_for_rename.t_part_rename_4 + +CREATE TABLE t_part_rm_part(i INT PRIMARY KEY) ENGINE Aria PARTITION BY HASH(i) PARTITIONS 2; +--let after_aria_table_copy_test_t_part_rm_part=begin not atomic ALTER TABLE test.t_part_rm_part REMOVE PARTITIONING; ALTER TABLE test.t_part_rm_part ADD COLUMN c INT; end + +SET SESSION debug_dbug="+d,maria_flush_whole_log"; +SET GLOBAL aria_checkpoint_interval=10000; + +--mkdir $targetdir + +if ($backup_variant == $backup_stream) { +--echo ### Backup to stream +--let $streamfile=$MYSQLTEST_VARDIR/tmp/backup.xb +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events --stream=xbstream > $streamfile 2>$targetdir/backup_stream.log; +--disable_result_log +exec $XBSTREAM -x -C $targetdir < $streamfile; +--enable_result_log +} + +if ($backup_variant == $backup_dir) { +--echo ### Backup to dir +--disable_result_log +--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events +--enable_result_log +} + +--let $t_logs_1_records_count_before_backup=`SELECT COUNT(*) FROM t_logs_1` +--let $t_logs_2_records_count_before_backup=`SELECT COUNT(*) FROM t_logs_2` +--let $t_bulk_ins_records_count_before_backup=`SELECT COUNT(*) FROM t_bulk_ins` + +--echo # xtrabackup prepare +--disable_result_log +--exec $XTRABACKUP --prepare --target-dir=$targetdir +--source include/restart_and_restore.inc +--enable_result_log + +--echo ### Result for DDL test +SHOW CREATE TABLE t_alter; +SELECT * FROM t_alter; +SHOW CREATE TABLE t_change_engine; +SELECT * FROM t_change_engine; +SELECT * FROM t_trunc; +SELECT * FROM t_ch_i; +SELECT * FROM t_rename_new; +SELECT * FROM test_for_rename.t_rename_new_2; +SELECT * FROM t_rename_new_new_3; +SELECT * FROM t_rename_new_4; +--error ER_NO_SUCH_TABLE +SELECT * FROM t_delete; +SHOW CREATE TABLE t_delete_2; +SELECT * FROM t_rename_alter_2; +SELECT * FROM t_rename_create; +SELECT * FROM t_rename_create_new; +SHOW CREATE TABLE t_part_create_2; +SELECT * FROM t_part_create_2; +SHOW CREATE TABLE t_part_add_part; +SELECT * FROM t_part_add_part; +SHOW CREATE TABLE t_part_change_eng; +SELECT * FROM t_part_change_eng; +SHOW CREATE TABLE t_part_change_eng_2; +SELECT * FROM t_part_change_eng_2; +SELECT * FROM t_part_alter; +SHOW CREATE TABLE t_part_alter_2; +SELECT * FROM t_part_alter_2; +--error ER_NO_SUCH_TABLE +SELECT * FROM t_part_drop; +--error ER_NO_SUCH_TABLE +SELECT * FROM t_part_rename; +SELECT * FROM t_part_rename_2; +--error ER_NO_SUCH_TABLE +SELECT * FROM t_part_rename_3; +SELECT * FROM test_for_rename.t_part_rename_4; +SHOW CREATE TABLE t_part_rm_part; +SELECT * FROM t_part_rm_part; +--sorted_result +SHOW DATABASES; + +--echo ### Clean up for DDL test +DROP DATABASE test_for_db_create; +DROP TABLE t_db_create; +DROP TABLE t_change_engine; +DROP TABLE t_alter; +DROP TABLE t_trunc; +DROP TABLE t_ch_i; +DROP TABLE t_rename_new; +DROP TABLE t_rename_new_new_3; +DROP TABLE t_rename_new_4; +DROP TABLE t_delete_2; +DROP TABLE t_rename_alter_2; +DROP TABLE t_rename_create; +DROP TABLE t_rename_create_new; +DROP TABLE t_part_create; +DROP TABLE t_part_create_2; +DROP TABLE t_part_add_part; +DROP TABLE t_part_change_eng; +DROP TABLE t_part_change_eng_2; +DROP TABLE t_part_change_eng_3; +DROP TABLE t_part_alter; +DROP TABLE t_part_alter_2; +DROP TABLE t_part_rename_2; +DROP TABLE t_part_rm_part; +DROP DATABASE test_for_rename; +--let after_aria_table_copy_test_for_db_drop_t= +--let after_aria_table_copy_test_t_db_create= +--let after_aria_table_copy_test_t_alter= +--let after_aria_background= +--let after_aria_table_copy_test_t_trunc= +--let after_aria_table_copy_test_t_ch_i= +--let after_aria_table_copy_test_t_rename= +--let after_aria_table_copy_test_t_rename_2= +--let after_aria_table_copy_test_t_rename_3= +--let after_aria_table_copy_test_t_rename_4= +--let after_aria_table_copy_test_t_delete= +--let after_aria_table_copy_test_t_delete_2= +--let after_aria_table_copy_test_t_rename_alter= +--let after_aria_table_copy_test_t_rename_create= +--let after_aria_table_copy_test_t_part_create= +--let after_aria_table_copy_test_t_part_add_part= +--let after_aria_table_copy_test_t_part_change_eng= +--let after_aria_table_copy_test_t_part_change_eng_3= +--let after_aria_table_copy_test_t_part_alter= +--let after_aria_table_copy_test_t_part_alter_2= +--let after_aria_table_copy_test_t_part_drop= +--let after_aria_table_copy_test_t_part_rename= +--let after_aria_table_copy_test_t_part_rename_3= +--let after_aria_table_copy_test_t_part_rm_part= + +--echo ### Result for DML test +SELECT * FROM t_dml_ins; +SELECT * FROM t_dml_upd; +SELECT * FROM t_dml_del; + +--echo ### Clean up for DML test +DROP TABLE t_dml_ins; +DROP TABLE t_dml_upd; +DROP TABLE t_dml_del; +--let after_aria_table_copy_test_t_dml_ins= +--let after_aria_table_copy_test_t_dml_upd= +--let after_aria_table_copy_test_t_dml_del= + +--echo ### Result for redo log files backup +--let $t_logs_1_records_count_after_backup=`SELECT COUNT(*) FROM t_logs_1` +--let $t_logs_2_records_count_after_backup=`SELECT COUNT(*) FROM t_logs_2` +--let $t_bulk_ins_records_count_after_backup=`SELECT COUNT(*) FROM t_bulk_ins` +if ($t_logs_1_records_count_after_backup == $t_logs_1_records_count_before_backup) { +--echo # ok +} +if ($t_logs_1_records_count_after_backup != $t_logs_1_records_count_before_backup) { +--echo # failed +} +if ($t_logs_2_records_count_after_backup == $t_logs_2_records_count_before_backup) { +--echo # ok +} +if ($t_logs_2_records_count_after_backup != $t_logs_2_records_count_before_backup) { +--echo # failed +} +if ($t_bulk_ins_records_count_after_backup == $t_bulk_ins_records_count_before_backup) { +--echo # ok +} +if ($t_bulk_ins_records_count_after_backup != $t_bulk_ins_records_count_before_backup) { +--echo # failed +} + +--echo ### Cleanup for redo log files backup +DROP TABLE t_logs_1; +DROP TABLE t_logs_2; +DROP TABLE t_bulk_ins; +--let $t_logs_1_records_count_before_backup= +--let $t_logs_1_records_count_after_backup= +--let $t_logs_2_records_count_before_backup= +--let $t_logs_2_records_count_after_backup= +--let $t_bulk_ins_records_count_before_backup= +--let $t_bulk_ins_records_count_after_backup= + +--echo ### Result for online/offline tables test +SELECT * FROM t_default; +SELECT * FROM t_tr_p_ch; +SELECT * FROM t_tr_p_nch; +SELECT * FROM t_p_ch; +SELECT * FROM t_p_nch; +SELECT * FROM t_fixed; +SELECT * FROM t_dyn; +SELECT * FROM t_part_online; +SELECT * FROM t_part_offline; +SELECT * FROM `t 1 t-1`; +SELECT * FROM `t-part online`; + +--echo ### Cleanup for online/offline tables test +DROP TABLE t_default; +DROP TABLE t_tr_p_ch; +DROP TABLE t_tr_p_nch; +DROP TABLE t_p_ch; +DROP TABLE t_p_nch; +DROP TABLE t_fixed; +DROP TABLE t_dyn; +DROP TABLE t_part_online; +DROP TABLE t_part_offline; +DROP TABLE `t 1 t-1`; +DROP TABLE `t-part online`; + +if ($backup_variant == $backup_stream) { +--remove_file $streamfile +} +--rmdir $targetdir +--dec $backup_variant +} + diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log.opt mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log.opt --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--loose-aria-log-file-size=8388608 diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_dir_path.result mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_dir_path.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path.result 2024-08-03 07:29:58.000000000 +0000 @@ -35,7 +35,6 @@ SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; SHOW ENGINE aria logs; Type Name Status -Aria aria_log.00000001 free Aria aria_log.00000002 in use # Restarting mariadbd with default parameters # restart diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_dir_path.test mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_dir_path.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path.test 2024-08-03 07:29:58.000000000 +0000 @@ -48,7 +48,6 @@ --replace_regex /Size +[0-9]+ ; .+aria_log/aria_log/ SHOW ENGINE aria logs; - --echo # mariadb-backup --backup --disable_result_log --mkdir $targetdir @@ -61,7 +60,6 @@ --exec $XTRABACKUP --prepare --target-dir=$targetdir --enable_result_log - --echo # shutdown server --disable_result_log --source include/shutdown_mysqld.inc @@ -70,12 +68,14 @@ --echo # remove aria-log-dir-path --rmdir $ARIA_LOGDIR_FS + --echo # mariadb-backup --copy-back --let $mariadb_backup_parameters=--defaults-file=$MYSQLTEST_VARDIR/my.cnf --copy-back --datadir=$datadir --target-dir=$targetdir --parallel=2 --throttle=1 --aria-log-dir-path=$ARIA_LOGDIR_MARIADB --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --exec echo "# with parameters: $mariadb_backup_parameters" --exec $XTRABACKUP $mariadb_backup_parameters + --echo # starting server --let $restart_parameters=$server_parameters --source include/start_mysqld.inc @@ -91,7 +91,7 @@ --echo # Testing aria log files after --copy-back SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; --file_exists $ARIA_LOGDIR_FS/aria_log_control ---file_exists $ARIA_LOGDIR_FS/aria_log.00000001 +#--file_exists $ARIA_LOGDIR_FS/aria_log.00000001 --file_exists $ARIA_LOGDIR_FS/aria_log.00000002 --error 1 --file_exists $ARIA_LOGDIR_FS/aria_log.00000003 diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_dir_path_rel.result 2024-08-03 07:29:58.000000000 +0000 @@ -35,7 +35,6 @@ SET @@global.aria_checkpoint_interval=DEFAULT /*Force checkpoint*/; SHOW ENGINE aria logs; Type Name Status -Aria aria_log.00000001 free Aria aria_log.00000002 in use # Restarting mariadbd with default parameters # restart diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.opt mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.opt --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,2 @@ +--loose-aria-log-file-size=8388608 +--loose-restart-for-aria_log_rotate_during_backup="This is needed to recreate datadir, to have Aria start logs from aria_log.00000001" diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.result mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,58 @@ +SHOW VARIABLES LIKE 'aria_log_file_size'; +Variable_name Value +aria_log_file_size 8388608 +CREATE PROCEDURE display_aria_log_control(ctrl BLOB) +BEGIN +SELECT HEX(REVERSE(SUBSTRING(ctrl, 42, 4))) AS last_logno; +END; +$$ +CREATE PROCEDURE populate_t1() +BEGIN +FOR id IN 0..9 DO +INSERT INTO test.t1 (id, txt) VALUES (id, REPEAT(id,1024*1024)); +END FOR; +END; +$$ +CREATE TABLE test.t1(id INT, txt LONGTEXT) ENGINE=Aria; +# MYSQLD_DATADIR/aria_log_control before --backup +CALL display_aria_log_control(@aria_log_control); +last_logno +00000001 +# Running --backup +# MYSQLD_DATADIR/aria_log_control after --backup +CALL display_aria_log_control(@aria_log_control); +last_logno +00000002 +# targetdir/aria_log_control after --backup +CALL display_aria_log_control(@aria_log_control); +last_logno +00000001 +# Running --prepare +# targetdir/aria_log_control after --prepare +CALL display_aria_log_control(@aria_log_control); +last_logno +00000002 +# shutdown server +# remove datadir +# xtrabackup move back +# restart +# MYSQLD_DATADIR/aria_log_control after --copy-back +CALL display_aria_log_control(@aria_log_control); +last_logno +00000002 +# Checking that after --restore all t1 data is there +SELECT id, LENGTH(txt) FROM t1 ORDER BY id; +id LENGTH(txt) +0 1048576 +1 1048576 +2 1048576 +3 1048576 +4 1048576 +5 1048576 +6 1048576 +7 1048576 +8 1048576 +9 1048576 +DROP TABLE t1; +DROP PROCEDURE populate_t1; +DROP PROCEDURE display_aria_log_control; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/aria_log_rotate_during_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,82 @@ +--source include/have_debug.inc +--source include/have_aria.inc + +SHOW VARIABLES LIKE 'aria_log_file_size'; + +--let $MYSQLD_DATADIR= `select @@datadir` +--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup +mkdir $targetdir; + + +DELIMITER $$; +CREATE PROCEDURE display_aria_log_control(ctrl BLOB) +BEGIN + SELECT HEX(REVERSE(SUBSTRING(ctrl, 42, 4))) AS last_logno; +END; +$$ +DELIMITER ;$$ + +DELIMITER $$; +CREATE PROCEDURE populate_t1() +BEGIN + FOR id IN 0..9 DO + INSERT INTO test.t1 (id, txt) VALUES (id, REPEAT(id,1024*1024)); + END FOR; +END; +$$ +DELIMITER ;$$ + + +CREATE TABLE test.t1(id INT, txt LONGTEXT) ENGINE=Aria; + +--echo # MYSQLD_DATADIR/aria_log_control before --backup +--let ARIA_DATADIR=$MYSQLD_DATADIR +--source include/aria_log_control_load.inc +CALL display_aria_log_control(@aria_log_control); + + +--echo # Running --backup +--let after_scanning_log_files=CALL test.populate_t1 +--disable_result_log +--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events 2>&1 +--let after_scanning_log_files= +--enable_result_log + +--echo # MYSQLD_DATADIR/aria_log_control after --backup +--let ARIA_DATADIR=$MYSQLD_DATADIR +--source include/aria_log_control_load.inc +CALL display_aria_log_control(@aria_log_control); + +--echo # targetdir/aria_log_control after --backup +--let ARIA_DATADIR=$targetdir +--source include/aria_log_control_load.inc +CALL display_aria_log_control(@aria_log_control); + + +--echo # Running --prepare +--disable_result_log +--exec $XTRABACKUP --prepare --target-dir=$targetdir +--enable_result_log + +--echo # targetdir/aria_log_control after --prepare +--let ARIA_DATADIR=$targetdir +--source include/aria_log_control_load.inc +CALL display_aria_log_control(@aria_log_control); + + +--disable_result_log +--source include/restart_and_restore.inc +--enable_result_log + +--echo # MYSQLD_DATADIR/aria_log_control after --copy-back +--let ARIA_DATADIR=$MYSQLD_DATADIR +--source include/aria_log_control_load.inc +CALL display_aria_log_control(@aria_log_control); + +--echo # Checking that after --restore all t1 data is there +SELECT id, LENGTH(txt) FROM t1 ORDER BY id; +DROP TABLE t1; +rmdir $targetdir; + +DROP PROCEDURE populate_t1; +DROP PROCEDURE display_aria_log_control; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/auth_plugin_win.test mariadb-10.11.9/mysql-test/suite/mariabackup/auth_plugin_win.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/auth_plugin_win.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/auth_plugin_win.test 2024-08-03 07:29:58.000000000 +0000 @@ -22,7 +22,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf -u $USERNAME --backup --protocol=pipe --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf -u $USERNAME --backup --parallel=10 --protocol=pipe --target-dir=$targetdir; --enable_result_log --replace_result $USERNAME USERNAME eval DROP USER '$USERNAME'; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/backup_grants.result mariadb-10.11.9/mysql-test/suite/mariabackup/backup_grants.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/backup_grants.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/backup_grants.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,14 +1,21 @@ -CREATE user backup@localhost; +CREATE user backup@localhost IDENTIFIED BY 'xyz'; +NOT FOUND /missing required privilege/ in backup.log +NOT FOUND /xyz/ in xtrabackup_info FOUND 1 /missing required privilege RELOAD/ in backup.log FOUND 1 /missing required privilege PROCESS/ in backup.log FOUND 1 /GRANT USAGE ON/ in backup.log GRANT RELOAD, PROCESS on *.* to backup@localhost; -NOT FOUND /missing required privilege REPLICA MONITOR/ in backup.log +NOT FOUND /missing required privilege/ in backup.log +NOT FOUND /xyz/ in xtrabackup_info +FOUND 1 /missing required privilege SLAVE MONITOR/ in backup.log GRANT REPLICA MONITOR ON *.* TO backup@localhost; +NOT FOUND /missing required privilege/ in backup.log +NOT FOUND /xyz/ in xtrabackup_info REVOKE REPLICA MONITOR ON *.* FROM backup@localhost; -GRANT CONNECTION ADMIN ON *.* TO backup@localhost; FOUND 1 /missing required privilege REPLICATION SLAVE ADMIN/ in backup.log -NOT FOUND /missing required privilege REPLICA MONITOR/ in backup.log +FOUND 1 /missing required privilege SLAVE MONITOR/ in backup.log GRANT REPLICATION SLAVE ADMIN ON *.* TO backup@localhost; GRANT REPLICA MONITOR ON *.* TO backup@localhost; +NOT FOUND /missing required privilege/ in backup.log +NOT FOUND /xyz/ in xtrabackup_info DROP USER backup@localhost; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/backup_grants.test mariadb-10.11.9/mysql-test/suite/mariabackup/backup_grants.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/backup_grants.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/backup_grants.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,19 +1,28 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; -CREATE user backup@localhost; +let $info=$MYSQLTEST_VARDIR/tmp/backup/xtrabackup_info; +let $log=$MYSQLTEST_VARDIR/tmp/backup.log; +CREATE user backup@localhost IDENTIFIED BY 'xyz'; # backup possible for unprivileges user, with --no-lock --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --no-lock --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 -ubackup -pxyz --no-lock --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log 2>&1; --enable_result_log + +--let SEARCH_FILE=$log +--let SEARCH_PATTERN= missing required privilege +--source include/search_pattern_in_file.inc +--let SEARCH_FILE=$info +--let SEARCH_PATTERN=xyz +--source include/search_pattern_in_file.inc rmdir $targetdir; # backup fails without --no-lock, because of FTWRL --disable_result_log error 1; -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 -ubackup -pxyz --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log 2>&1; --enable_result_log -let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/backup.log; +--let SEARCH_FILE=$log --let SEARCH_PATTERN= missing required privilege RELOAD --source include/search_pattern_in_file.inc --let SEARCH_PATTERN= missing required privilege PROCESS @@ -23,64 +32,62 @@ # backup succeeds with RELOAD privilege GRANT RELOAD, PROCESS on *.* to backup@localhost; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --user=backup --password=xyz --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log 2>&1; --enable_result_log +--let SEARCH_PATTERN= missing required privilege +--source include/search_pattern_in_file.inc +--let SEARCH_FILE=$info +--let SEARCH_PATTERN=xyz +--source include/search_pattern_in_file.inc rmdir $targetdir; # MDEV-23607 Warning: missing required privilege REPLICATION CLIENT -# --slave-info and galera info require REPLICA MONITOR +# --slave-info and --galera-info require REPLICA MONITOR --disable_result_log error 1; -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --slave-info --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --user=backup --password=xyz --slave-info --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log 2>&1; --enable_result_log rmdir $targetdir; ---let SEARCH_PATTERN= missing required privilege REPLICA MONITOR +--let SEARCH_FILE=$log +--let SEARCH_PATTERN= missing required privilege SLAVE MONITOR --source include/search_pattern_in_file.inc GRANT REPLICA MONITOR ON *.* TO backup@localhost; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --slave-info --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --user backup --password xyz --slave-info --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log 2>&1; --enable_result_log +--let SEARCH_PATTERN= missing required privilege +--source include/search_pattern_in_file.inc +--let SEARCH_FILE=$info +--let SEARCH_PATTERN=xyz +--source include/search_pattern_in_file.inc rmdir $targetdir; REVOKE REPLICA MONITOR ON *.* FROM backup@localhost; -# TODO need a query that would delay a BACKUP STAGE START/ BACKUP STAGE BLOCK_COMMIT longer than the kill-long-queries-timeout -#--send SELECT SLEEP(9) kill_me -## kill-long-query-type=(not empty) requires CONNECTION ADMIN -#--disable_result_log -#error 1; -#--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --kill-long-query-type=all --kill-long-queries-timeout=4 --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log; -#--reap -#--enable_result_log -#rmdir $targetdir; -# -#--let SEARCH_PATTERN= missing required privilege CONNECTION ADMIN -#--source include/search_pattern_in_file.inc - -GRANT CONNECTION ADMIN ON *.* TO backup@localhost; ---disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --kill-long-query-type=all --kill-long-queries-timeout=1 --target-dir=$targetdir; ---enable_result_log -rmdir $targetdir; - # --safe-slave-backup requires REPLICATION SLAVE ADMIN, and REPLICA MONITOR --disable_result_log error 1; -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --safe-slave-backup --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --user backup --password xyz --safe-slave-backup --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log; --enable_result_log rmdir $targetdir; +--let SEARCH_FILE=$log --let SEARCH_PATTERN= missing required privilege REPLICATION SLAVE ADMIN --source include/search_pattern_in_file.inc ---let SEARCH_PATTERN= missing required privilege REPLICA MONITOR +--let SEARCH_PATTERN= missing required privilege SLAVE MONITOR --source include/search_pattern_in_file.inc GRANT REPLICATION SLAVE ADMIN ON *.* TO backup@localhost; GRANT REPLICA MONITOR ON *.* TO backup@localhost; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup --safe-slave-backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup -ubackup -pxyz --safe-slave-backup --target-dir=$targetdir > $MYSQLTEST_VARDIR/tmp/backup.log 2>&1; --enable_result_log +--let SEARCH_PATTERN= missing required privilege +--source include/search_pattern_in_file.inc +--let SEARCH_FILE=$info +--let SEARCH_PATTERN=xyz +--source include/search_pattern_in_file.inc rmdir $targetdir; DROP USER backup@localhost; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/backup_ssl.test mariadb-10.11.9/mysql-test/suite/mariabackup/backup_ssl.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/backup_ssl.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/backup_ssl.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --user=backup_user --password=x --ssl --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --user=backup_user --password=x --ssl --backup --parallel=10 --target-dir=$targetdir; --enable_result_log echo # xtrabackup prepare; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/binlog.test mariadb-10.11.9/mysql-test/suite/mariabackup/binlog.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/binlog.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/binlog.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,7 +9,7 @@ SHOW VARIABLES like 'log_bin'; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log exec $XTRABACKUP --prepare --binlog-info=1 --target-dir=$basedir ; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/compress_qpress.test mariadb-10.11.9/mysql-test/suite/mariabackup/compress_qpress.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/compress_qpress.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/compress_qpress.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --compress --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --compress --target-dir=$targetdir; --enable_result_log INSERT INTO t VALUES(2); diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/create_during_backup.test mariadb-10.11.9/mysql-test/suite/mariabackup/create_during_backup.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/create_during_backup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/create_during_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,7 @@ echo # xtrabackup backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,mariabackup_events; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events; --enable_result_log --let after_load_tables= diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/create_with_data_directory_during_backup.test mariadb-10.11.9/mysql-test/suite/mariabackup/create_with_data_directory_during_backup.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/create_with_data_directory_during_backup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/create_with_data_directory_during_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,mariabackup_events; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events; --enable_result_log --source include/shutdown_mysqld.inc echo # xtrabackup prepare; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/data_directory.test mariadb-10.11.9/mysql-test/suite/mariabackup/data_directory.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/data_directory.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/data_directory.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log --source include/shutdown_mysqld.inc echo # xtrabackup prepare; @@ -21,6 +21,7 @@ SELECT * FROM t; DROP TABLE t; rmdir $targetdir; +rmdir $table_data_dir; --echo # --echo # MDEV-18200 MariaBackup full backup failed with InnoDB: Failing assertion: success @@ -32,8 +33,8 @@ exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; --enable_result_log chmod 0755 $DATADIR/ibdata1; -rmdir $table_data_dir; rmdir $targetdir; + --echo # --echo # End of 10.4 tests --echo # diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/ddl_for_common_engine.result mariadb-10.11.9/mysql-test/suite/mariabackup/ddl_for_common_engine.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/ddl_for_common_engine.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/ddl_for_common_engine.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,67 @@ +CREATE TABLE t1 (a INT NOT NULL) ENGINE=CSV; +CREATE TABLE t2 (a INT NOT NULL) ENGINE=CSV; +CREATE TABLE t3 (a INT NOT NULL) ENGINE=CSV; +### Backup to dir +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart +SELECT * FROM t4; +a +SELECT * FROM t2; +ERROR 42S02: Table 'test.t2' doesn't exist +SELECT * FROM t3; +ERROR 42S02: Table 'test.t3' doesn't exist +SELECT * FROM t5; +a +SELECT * FROM t1; +a +DROP TABLE t4, t5, t1; +CREATE TABLE t1_m1 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t1_m2 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=MERGE UNION=(t1_m1, t1_m2) INSERT_METHOD=LAST; +CREATE TABLE t2_m1 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t2_m2 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t2 (a INT NOT NULL) ENGINE=MERGE UNION=(t2_m1, t2_m2) INSERT_METHOD=LAST; +CREATE TABLE t3_m1 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t3_m2 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t3 (a INT NOT NULL) ENGINE=MERGE UNION=(t3_m1, t3_m2) INSERT_METHOD=LAST; +### Backup to dir +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart +SELECT * FROM t4; +a +SELECT * FROM t2; +ERROR 42S02: Table 'test.t2' doesn't exist +SELECT * FROM t3; +ERROR 42S02: Table 'test.t3' doesn't exist +SELECT * FROM t5; +a +SELECT * FROM t1; +a +DROP TABLE t4, t5, t1; +DROP TABLE t1_m1, t1_m2, t2_m1, t2_m2, t3_m1, t3_m2; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t2 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t3 (a INT NOT NULL) ENGINE=MyISAM; +### Backup to dir +# xtrabackup prepare +# shutdown server +# remove datadir +# xtrabackup move back +# restart +SELECT * FROM t4; +a +SELECT * FROM t2; +ERROR 42S02: Table 'test.t2' doesn't exist +SELECT * FROM t3; +ERROR 42S02: Table 'test.t3' doesn't exist +SELECT * FROM t5; +a +SELECT * FROM t1; +a +DROP TABLE t4, t5, t1; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/ddl_for_common_engine.test mariadb-10.11.9/mysql-test/suite/mariabackup/ddl_for_common_engine.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/ddl_for_common_engine.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/ddl_for_common_engine.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,79 @@ +# This test is just to ensure the DDL processing works for common engines like +# MyISAM, ARCHIVE, CSV etc. The more complex test for different cases is +# implemented in aria_backup.test. +--source include/have_archive.inc +--source include/have_csv.inc +--source include/have_debug.inc + +--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup + +--let $e_myisam = 1 +--let $e_merge = 2 +--let $e_csv = 3 +--let $e_archive = 4 +# 'rename' is not logged in $e_archive, return when fix +--let $e_var = $e_csv + +while ($e_var) { +if ($e_var == $e_csv) { +--let $engine = CSV +} +if ($e_var == $e_archive) { +--let $engine = ARCHIVE +} +if ($e_var == $e_merge) { +--let $engine = MERGE +} +if ($e_var == $e_myisam) { +--let $engine = MyISAM +} + +if ($e_var == $e_merge) { +CREATE TABLE t1_m1 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t1_m2 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t1 (a INT NOT NULL) ENGINE=MERGE UNION=(t1_m1, t1_m2) INSERT_METHOD=LAST; +CREATE TABLE t2_m1 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t2_m2 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t2 (a INT NOT NULL) ENGINE=MERGE UNION=(t2_m1, t2_m2) INSERT_METHOD=LAST; +CREATE TABLE t3_m1 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t3_m2 (a INT NOT NULL) ENGINE=MyISAM; +CREATE TABLE t3 (a INT NOT NULL) ENGINE=MERGE UNION=(t3_m1, t3_m2) INSERT_METHOD=LAST; +} +if ($e_var != $e_merge) { +eval CREATE TABLE t1 (a INT NOT NULL) ENGINE=$engine; +eval CREATE TABLE t2 (a INT NOT NULL) ENGINE=$engine; +eval CREATE TABLE t3 (a INT NOT NULL) ENGINE=$engine; +} + +--let after_ce_table_copy_test_t1=begin not atomic CREATE TABLE test.t4 LIKE test.t1; DROP TABLE test.t2; RENAME TABLE test.t3 TO test.t5; end + +--mkdir $targetdir +--echo ### Backup to dir +--disable_result_log +--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events +--enable_result_log + +--echo # xtrabackup prepare +--disable_result_log +--exec $XTRABACKUP --prepare --target-dir=$targetdir +--source include/restart_and_restore.inc +--enable_result_log +--rmdir $targetdir + +SELECT * FROM t4; +--error ER_NO_SUCH_TABLE +SELECT * FROM t2; +--error ER_NO_SUCH_TABLE +SELECT * FROM t3; +SELECT * FROM t5; +SELECT * FROM t1; + +DROP TABLE t4, t5, t1; + +if ($e_var == $e_merge) { +DROP TABLE t1_m1, t1_m2, t2_m1, t2_m2, t3_m1, t3_m2; +} +--let after_ce_table_copy_test_t1= +--dec $e_var +} + diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/disabled.def mariadb-10.11.9/mysql-test/suite/mariabackup/disabled.def --- mariadb-10.11.6/mysql-test/suite/mariabackup/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/disabled.def 2024-08-03 07:29:58.000000000 +0000 @@ -1 +1,3 @@ log_page_corruption : MDEV-26210 +mariabackup.xb_compressed_encrypted : MDEV-26154 (error 194 "Tablespace is missing for a table") +innodb_ddl_on_intermediate_table : MENT-1213 diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_export.opt mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.opt --- mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_export.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,6 @@ +--innodb_encrypt_tables=1 +--plugin-load-add=$FILE_KEY_MANAGEMENT_SO +--loose-file-key-management +--loose-file-key-management-filekey=FILE:$MTR_SUITE_DIR/filekeys-data.key +--loose-file-key-management-filename=$MTR_SUITE_DIR/filekeys-data.enc +--loose-file-key-management-encryption-algorithm=aes_cbc diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_export.result mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_export.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,14 @@ +CREATE TABLE t1(c VARCHAR(128)) ENGINE INNODB; +insert into t1 values(repeat('a',100)); +select @@innodb_encrypt_tables; +@@innodb_encrypt_tables +ON +# xtrabackup backup +# xtrabackup prepare export +# restart +ALTER TABLE t1 DISCARD TABLESPACE; +ALTER TABLE t1 IMPORT TABLESPACE; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_export.test mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_export.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_export.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,29 @@ +--source include/have_file_key_management.inc +--source include/have_innodb.inc + +CREATE TABLE t1(c VARCHAR(128)) ENGINE INNODB; +insert into t1 values(repeat('a',100)); + +select @@innodb_encrypt_tables; +echo # xtrabackup backup; +let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; +--enable_result_log +--source include/shutdown_mysqld.inc + +echo # xtrabackup prepare export; +--disable_result_log +exec $XTRABACKUP --prepare --export --target-dir=$targetdir; +--enable_result_log + +--source include/start_mysqld.inc +let MYSQLD_DATADIR=`select @@datadir`; +ALTER TABLE t1 DISCARD TABLESPACE; +copy_file $targetdir/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd; +copy_file $targetdir/test/t1.cfg $MYSQLD_DATADIR/test/t1.cfg; +ALTER TABLE t1 IMPORT TABLESPACE; +CHECK TABLE t1; +DROP TABLE t1; +rmdir $targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_page_compressed.test mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_page_compressed.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_page_compressed.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_page_compressed.test 2024-08-03 07:29:58.000000000 +0000 @@ -37,7 +37,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; let $backuplog=$MYSQLTEST_VARDIR/tmp/backup.log; --error 1 -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --core-file > $backuplog; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --core-file > $backuplog; --enable_result_log --let SEARCH_PATTERN=Database page corruption detected.* diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_page_corruption.test mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_page_corruption.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/encrypted_page_corruption.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/encrypted_page_corruption.test 2024-08-03 07:29:58.000000000 +0000 @@ -65,7 +65,7 @@ } --disable_result_log --error $expect_error -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --extended-validation --target-dir=$targetdir --core-file > $backuplog; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --extended-validation --target-dir=$targetdir --core-file > $backuplog; --enable_result_log @@ -77,7 +77,7 @@ # Due to very constructed nature of the "corruption" (faking checksums), the "corruption" won't be found without --extended-validation --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/extra_lsndir.test mariadb-10.11.9/mysql-test/suite/mariabackup/extra_lsndir.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/extra_lsndir.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/extra_lsndir.test 2024-08-03 07:29:58.000000000 +0000 @@ -2,7 +2,7 @@ let $extra_lsndir=$MYSQLTEST_VARDIR/tmp/extra_lsndir; mkdir $extra_lsndir; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --extra-lsndir=$extra_lsndir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --extra-lsndir=$extra_lsndir; --enable_result_log list_files $extra_lsndir; rmdir $extra_lsndir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/full_backup.result mariadb-10.11.9/mysql-test/suite/mariabackup/full_backup.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/full_backup.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/full_backup.result 2024-08-03 07:29:58.000000000 +0000 @@ -18,6 +18,12 @@ # call mtr.add_suppression("InnoDB: innodb_undo_tablespaces=0 disables dedicated undo log tablespaces"); call mtr.add_suppression("InnoDB: Cannot change innodb_undo_tablespaces=0 because previous shutdown was not with innodb_fast_shutdown=0"); +call mtr.add_suppression("Found 1 prepared XA transactions"); +CREATE TABLE t(f1 INT NOT NULL)ENGINE=InnoDB; +XA START 'zombie'; +INSERT INTO t VALUES(1); +XA END 'zombie'; +XA PREPARE 'zombie'; # restart: --innodb_undo_tablespaces=0 # xtrabackup backup # xtrabackup prepare @@ -28,3 +34,5 @@ # Display undo log files from target directory undo001 undo002 +XA COMMIT 'zombie'; +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/full_backup.test mariadb-10.11.9/mysql-test/suite/mariabackup/full_backup.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/full_backup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/full_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,9 @@ --let $backup_log=$MYSQLTEST_VARDIR/tmp/backup.log --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir > $backup_log 2>&1; +--error 1 +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --parallel=10 --innodb-log-write-ahead-size=4095 > $backup_log 2>&1; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --parallel=10 --innodb-log-write-ahead-size=10000 > $backup_log 2>&1; --enable_result_log # The following warning must not appear after MDEV-27343 fix @@ -35,6 +37,13 @@ --echo # call mtr.add_suppression("InnoDB: innodb_undo_tablespaces=0 disables dedicated undo log tablespaces"); call mtr.add_suppression("InnoDB: Cannot change innodb_undo_tablespaces=0 because previous shutdown was not with innodb_fast_shutdown=0"); +call mtr.add_suppression("Found 1 prepared XA transactions"); + +CREATE TABLE t(f1 INT NOT NULL)ENGINE=InnoDB; +XA START 'zombie'; +INSERT INTO t VALUES(1); +XA END 'zombie'; +XA PREPARE 'zombie'; let $restart_parameters=--innodb_undo_tablespaces=0; --source include/restart_mysqld.inc @@ -53,4 +62,6 @@ --echo # Display undo log files from target directory list_files $targetdir undo*; +XA COMMIT 'zombie'; +DROP TABLE t; rmdir $targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff mariadb-10.11.9/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff --- mariadb-10.11.6/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/huge_lsn,strict_crc32.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +--- suite/mariabackup/huge_lsn.result ++++ suite/mariabackup/huge_lsn.reject @@ -1,8 +1,8 @@ # # MDEV-13416 mariabackup fails with EFAULT "Bad Address" diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/huge_lsn.test mariadb-10.11.9/mysql-test/suite/mariabackup/huge_lsn.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/huge_lsn.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/huge_lsn.test 2024-08-03 07:29:58.000000000 +0000 @@ -79,7 +79,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log SET GLOBAL innodb_flush_log_at_trx_commit=1; INSERT INTO t VALUES(2); diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/incremental_encrypted.test mariadb-10.11.9/mysql-test/suite/mariabackup/incremental_encrypted.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/incremental_encrypted.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/incremental_encrypted.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,6 +7,12 @@ } call mtr.add_suppression("InnoDB: New log files created"); +if (`select @@innodb_page_size=65536`) +{ + # this needs too much memory for 32bit + source include/have_64bit.inc; +} + let $basedir=$MYSQLTEST_VARDIR/tmp/backup; let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1; @@ -18,7 +24,7 @@ echo # Create full backup , modify table, then create incremental/differential backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log SET GLOBAL innodb_flush_log_at_trx_commit = 1; @@ -26,7 +32,7 @@ SELECT * FROM t; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$incremental_dir --incremental-basedir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$incremental_dir --incremental-basedir=$basedir; echo # Prepare full backup, apply incremental one; exec $XTRABACKUP --prepare --target-dir=$basedir; exec $XTRABACKUP --prepare --target-dir=$basedir --incremental-dir=$incremental_dir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.result mariadb-10.11.9/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,5 @@ +CREATE TABLE IF NOT EXISTS t1 ( col1 INT, col_text TEXT ) ENGINE = InnoDB; +ALTER TABLE t1 ADD FULLTEXT KEY `ftidx1` ( col_text ); +# xtrabackup backup +SET debug_sync='RESET'; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test mariadb-10.11.9/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/innodb_ddl_on_intermediate_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,18 @@ +--source include/have_debug.inc +--source include/have_innodb.inc +--source include/have_debug_sync.inc + +--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup +--mkdir $targetdir + +CREATE TABLE IF NOT EXISTS t1 ( col1 INT, col_text TEXT ) ENGINE = InnoDB; +ALTER TABLE t1 ADD FULLTEXT KEY `ftidx1` ( col_text ); + +echo # xtrabackup backup; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events,emulate_ddl_on_intermediate_table; +--enable_result_log + +SET debug_sync='RESET'; +rmdir $targetdir; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/lock_ddl_per_table.test mariadb-10.11.9/mysql-test/suite/mariabackup/lock_ddl_per_table.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/lock_ddl_per_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/lock_ddl_per_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -16,7 +16,7 @@ set global innodb_log_checkpoint_now = 1; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --lock-ddl-per-table=1 --dbug=+d,check_mdl_lock_works; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --lock-ddl-per-table=1 --dbug=+d,check_mdl_lock_works; --enable_result_log DROP TABLE t; DROP TABLE `bobby``tables`; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/log_checksum_mismatch.test mariadb-10.11.9/mysql-test/suite/mariabackup/log_checksum_mismatch.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/log_checksum_mismatch.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/log_checksum_mismatch.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,7 @@ let $backuplog=$MYSQLTEST_VARDIR/tmp/backup.log; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,log_intermittent_checksum_mismatch --core-file > $backuplog; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,log_intermittent_checksum_mismatch --core-file > $backuplog; --enable_result_log --let SEARCH_RANGE = 10000000 diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.result mariadb-10.11.9/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,20 @@ +# +# Start of 10.5 tests +# +# +# MENT-1587 mariabackup failing due to aria log file copy +# +CREATE TABLE t1(i INT PRIMARY KEY) ENGINE=ARIA; +INSERT INTO t1 VALUES (10); +# Prepare full backup +# shutdown server +# remove datadir +# xtrabackup move back +# restart +SELECT * FROM t1; +i +10 +DROP TABLE t1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.test mariadb-10.11.9/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/log_file_unexpected_large_number_in_name.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,47 @@ +--let $MYSQLD_DATADIR=`select @@datadir` + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MENT-1587 mariabackup failing due to aria log file copy +--echo # + + +--let $basedir=$MYSQLTEST_VARDIR/tmp/backup +--let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1 + +CREATE TABLE t1(i INT PRIMARY KEY) ENGINE=ARIA; +INSERT INTO t1 VALUES (10); + +# +# Add a log file with a number outside of last_log_number +# specified in aria_log_control. +# The actual file number written in the header is 4. +# Let's rename it to 100 for test purposes. +# Hopefully 100 should be enough. +# +--copy_file suite/mariabackup/std_data/ment1587_aria_log.00000004 $MYSQLD_DATADIR/aria_log.00000100 + +--disable_result_log +--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir +--enable_result_log + +--disable_result_log +--echo # Prepare full backup +--exec $XTRABACKUP --prepare --target-dir=$basedir +--enable_result_log + +--let $targetdir=$basedir +--source include/restart_and_restore.inc +--enable_result_log +--rmdir $basedir + +SELECT * FROM t1; +DROP TABLE t1; + + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/log_tables.result mariadb-10.11.9/mysql-test/suite/mariabackup/log_tables.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/log_tables.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/log_tables.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,24 @@ +CREATE TABLE t(i INT) +ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; +SET GLOBAL general_log = 1; +SET GLOBAL log_output = 'TABLE'; +INSERT INTO t VALUES (1); +SELECT * FROM mysql.general_log +WHERE argument LIKE "INSERT INTO %" AND +(command_type = "Query" OR command_type = "Execute") ; +event_time user_host thread_id server_id command_type argument +TIMESTAMP USER_HOST THREAD_ID 1 Query INSERT INTO t VALUES (1) +# Insert new row into general_log table after it has been copied on BLOCK_DDL. +# Backup to dir. +# Xtrabackup prepare. +# shutdown server +# remove datadir +# xtrabackup move back +# restart +SELECT * FROM mysql.general_log +WHERE argument LIKE "INSERT INTO %" AND +(command_type = "Query" OR command_type = "Execute") ; +event_time user_host thread_id server_id command_type argument +TIMESTAMP USER_HOST THREAD_ID 1 Query INSERT INTO t VALUES (1) +TIMESTAMP USER_HOST THREAD_ID 1 Query INSERT INTO test.t VALUES (2) +DROP TABLE t; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/log_tables.test mariadb-10.11.9/mysql-test/suite/mariabackup/log_tables.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/log_tables.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/log_tables.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,49 @@ +# Test for copying log tables tail +--source include/have_aria.inc +--source include/have_debug.inc + +--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup + +CREATE TABLE t(i INT) + ENGINE ARIA TRANSACTIONAL=1 ROW_FORMAT=PAGE PAGE_CHECKSUM=1; + +--let $general_log_old = `SELECT @@global.general_log` +--let $log_output_old = `SELECT @@global.log_output` + +SET GLOBAL general_log = 1; +SET GLOBAL log_output = 'TABLE'; + +INSERT INTO t VALUES (1); + +--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID 5 Query +--sorted_result +SELECT * FROM mysql.general_log + WHERE argument LIKE "INSERT INTO %" AND + (command_type = "Query" OR command_type = "Execute") ; + +--echo # Insert new row into general_log table after it has been copied on BLOCK_DDL. +--let after_stage_block_ddl=INSERT INTO test.t VALUES (2) + +--echo # Backup to dir. +--disable_result_log +--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events +--enable_result_log + +--echo # Xtrabackup prepare. +--disable_result_log +--exec $XTRABACKUP --prepare --target-dir=$targetdir +--source include/restart_and_restore.inc +--enable_result_log + +--replace_column 1 TIMESTAMP 2 USER_HOST 3 THREAD_ID 5 Query +--sorted_result +SELECT * FROM mysql.general_log + WHERE argument LIKE "INSERT INTO %" AND + (command_type = "Query" OR command_type = "Execute") ; + +--rmdir $targetdir +DROP TABLE t; +--disable_query_log +--eval SET GLOBAL general_log = $general_log_old +--eval SET GLOBAL log_output = $log_output_old +--enable_query_log diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/mdev-14447.test mariadb-10.11.9/mysql-test/suite/mariabackup/mdev-14447.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/mdev-14447.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/mdev-14447.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,7 +11,7 @@ echo # Create full backup , modify table, then create incremental/differential backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log SET debug_dbug='+d,skip_page_checksum',foreign_key_checks=0,unique_checks=0; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/missing_ibd.test mariadb-10.11.9/mysql-test/suite/mariabackup/missing_ibd.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/missing_ibd.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/missing_ibd.test 2024-08-03 07:29:58.000000000 +0000 @@ -24,7 +24,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log rmdir $targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/nolock_ddl_during_backup_end.test mariadb-10.11.9/mysql-test/suite/mariabackup/nolock_ddl_during_backup_end.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/nolock_ddl_during_backup_end.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/nolock_ddl_during_backup_end.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,6 +9,6 @@ echo # xtrabackup backup; --disable_result_log error 1; -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --no-lock --dbug=+d,mariabackup_events; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --no-lock --dbug=+d,mariabackup_events; --enable_result_log rmdir $targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/partial.result mariadb-10.11.9/mysql-test/suite/mariabackup/partial.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/partial.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/partial.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,6 +14,14 @@ SELECT * FROM t1; i 1 +# MDEV-33023 Crash in mariadb-backup --prepare --export after --prepare +t1.cfg +t21.cfg +ALTER TABLE t1 DISCARD TABLESPACE; +ALTER TABLE t1 IMPORT TABLESPACE; +SELECT * FROM t1; +i +1 DROP TABLE t1; DROP TABLE t2; DROP TABLE t21; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/partial.test mariadb-10.11.9/mysql-test/suite/mariabackup/partial.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/partial.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/partial.test 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ let targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables=test.*1" --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables=test.*1" --target-dir=$targetdir; --enable_result_log list_files $targetdir/test *.ibd; list_files $targetdir/test *.new; @@ -55,6 +55,25 @@ ALTER TABLE t1 IMPORT TABLESPACE; SELECT * FROM t1; + +--echo # MDEV-33023 Crash in mariadb-backup --prepare --export after --prepare +--disable_result_log +exec $XTRABACKUP --defaults-file=$server_cnf --defaults-group-suffix=.1 --prepare --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$server_cnf --defaults-group-suffix=.1 --prepare --export --target-dir=$targetdir; +--enable_result_log + +list_files $targetdir/test *.cfg; +# There must not be binary logs created on --prepare step +list_files $targetdir/ mysqld-bin.*; + +let $MYSQLD_DATADIR= `select @@datadir`; +ALTER TABLE t1 DISCARD TABLESPACE; +copy_file $targetdir/test/t1.ibd $MYSQLD_DATADIR/test/t1.ibd; +copy_file $targetdir/test/t1.cfg $MYSQLD_DATADIR/test/t1.cfg; +ALTER TABLE t1 IMPORT TABLESPACE; + +SELECT * FROM t1; + DROP TABLE t1; DROP TABLE t2; DROP TABLE t21; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/partial_exclude.test mariadb-10.11.9/mysql-test/suite/mariabackup/partial_exclude.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/partial_exclude.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/partial_exclude.test 2024-08-03 07:29:58.000000000 +0000 @@ -28,7 +28,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables-exclude=test.*2" "--databases-exclude=db2" --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables-exclude=test.*2" "--databases-exclude=db2" --target-dir=$targetdir; --enable_result_log COMMIT; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/partition_datadir.test mariadb-10.11.9/mysql-test/suite/mariabackup/partition_datadir.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/partition_datadir.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/partition_datadir.test 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ PARTITION p3 VALUES LESS THAN (400) DATA DIRECTORY = '$MYSQLTEST_VARDIR/partitdata', PARTITION p4 VALUES LESS THAN MAXVALUE); INSERT INTO t VALUES (1), (101), (201), (301), (401); -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; exec $XTRABACKUP --prepare --target-dir=$targetdir; DROP TABLE t; rmdir $MYSQLTEST_VARDIR/partitdata; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/partition_partial.test mariadb-10.11.9/mysql-test/suite/mariabackup/partition_partial.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/partition_partial.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/partition_partial.test 2024-08-03 07:29:58.000000000 +0000 @@ -16,7 +16,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables=test.t1" --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables=test.t1" --target-dir=$targetdir; --enable_result_log INSERT INTO t1 VALUES (1), (101), (201), (301); diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/rename_during_backup.result mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_backup.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/rename_during_backup.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_backup.result 2024-08-03 07:29:58.000000000 +0000 @@ -61,3 +61,15 @@ i 5 DROP TABLE t6; +# +# MDEV-33011 mariabackup --backup: FATAL ERROR: ... Can't open datafile cool_down/t3 +# +# Simulate zero initialized page to defer tablespace load after rename log is found +SET @save_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG="+d,checkpoint_after_file_create"; +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); +# RENAME that fails after redo log entry is written and flushed +RENAME TABLE t1 TO non_existing_db.t1; +ERROR HY000: Error on rename of './test/t1' to './non_existing_db/t1' (errno: 168 "Unknown (generic) error from engine") +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/rename_during_backup.test mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_backup.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/rename_during_backup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -92,4 +92,31 @@ DROP TABLE t6; rmdir $targetdir; +--echo # +--echo # MDEV-33011 mariabackup --backup: FATAL ERROR: ... Can't open datafile cool_down/t3 +--echo # +--disable_query_log +call mtr.add_suppression("InnoDB: Cannot rename '.*t1.ibd' to '.*non_existing_db.*' because the target schema directory doesn't exist"); +--enable_query_log + +mkdir $targetdir; + +--echo # Simulate zero initialized page to defer tablespace load after rename log is found +SET @save_dbug = @@SESSION.debug_dbug; +SET DEBUG_DBUG="+d,checkpoint_after_file_create"; +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +INSERT INTO t1 VALUES(1); + +--echo # RENAME that fails after redo log entry is written and flushed +--replace_result "\\" "/" +--error ER_ERROR_ON_RENAME +RENAME TABLE t1 TO non_existing_db.t1; + +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --prepare --target-dir=$targetdir; +--enable_result_log + +DROP TABLE t1; +rmdir $targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/rename_during_mdl_lock.test mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_mdl_lock.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/rename_during_mdl_lock.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/rename_during_mdl_lock.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ mkdir $targetdir; CREATE TABLE t1(i int) ENGINE INNODB; set global innodb_log_checkpoint_now = 1; -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --lock-ddl-per-table --dbug=+d,rename_during_mdl_lock_table; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --lock-ddl-per-table --dbug=+d,rename_during_mdl_lock_table; echo # xtrabackup prepare; --disable_result_log diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/rpl_clone_slave.result mariadb-10.11.9/mysql-test/suite/mariabackup/rpl_clone_slave.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/rpl_clone_slave.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/rpl_clone_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,202 @@ +include/master-slave.inc +[connection master] +# +# MDEV-33342 Add a replication MTR test cloning the slave with mariadb-backup +# +connection slave; +stop slave; +change master to master_use_gtid=no; +start slave; +connection master; +connection slave; +############################################################## +### Initial block with some transactions +### Slave: Make sure replication is not using GTID +connection slave; +# Using_Gtid=No +### Master: Create and populate t1 +connection master; +CREATE TABLE t1(a TEXT) ENGINE=InnoDB; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#00:stmt#00 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#00:stmt#01 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#00:stmt#02 - slave run#0, before backup'); +COMMIT; +connection slave; +############################################################## +### Run the last transaction before mariadb-backup --backup +### Remember SHOW MASTER STATUS and @@gtid_binlog_pos +### before and after the transaction. +### Master: Rember MASTER STATUS and @@gtid_binlog_pos before tr#01 +connection master; +### Slave: Remember MASTER STATUS and @@gtid_binlog_pos before tr#01 +connection slave; +### Master: Run the actual last transaction before the backup +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#01:stmt#00 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#01:stmt#01 - slave run#0, before backup'); +INSERT INTO t1 VALUES ('tr#01:stmt#02 - slave run#0, before backup'); +COMMIT; +connection slave; +### Master: Remember MASTER STATUS and @@gtid_binlog_pos after tr#01 +connection master; +### Slave: Remember MASTER STATUS and @@gtid_binlog_pos after tr#01 +connection slave; +############################################################## +### Running `mariadb-backup --backup,--prepare` and checking +### that xtrabackup_slave_info and xtrabackup_binlog_info are OK +### Slave: Create a backup +### Slave: Prepare the backup +### Slave: xtrabackup files: +############################ xtrabackup_slave_info +CHANGE MASTER TO MASTER_LOG_FILE='master_after_tr01_show_master_status_file', MASTER_LOG_POS=master_after_tr01_show_master_status_position; +############################ xtrabackup_binlog_info +slave_after_tr01_show_master_status_file slave_after_tr01_show_master_status_position slave_after_tr01_gtid_binlog_pos +############################ +############################################################## +### Run more transactions after the backup: +### - while the slave is still running, then +### - while the slave is shut down +### Master: Run another transaction while the slave is still running +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#02:stmt#00 - slave run#0, after backup'); +INSERT INTO t1 VALUES ('tr#02:stmt#01 - slave run#0, after backup'); +INSERT INTO t1 VALUES ('tr#02:stmt@02 - slave run#0, after backup'); +COMMIT; +connection slave; +### Master: Remember MASTER STATUS and @@gtid_binlog_pos after tr#02 +connection master; +### Slave: Remember MASTER STATUS and @@gtid_binlog_pos after tr#02 +connection slave; +### Master: Checking SHOW BINLOG EVENTS +connection master; +SHOW BINLOG EVENTS IN 'master_after_tr01_show_master_status_file' FROM master_after_tr01_show_master_status_position LIMIT 0,1; +Log_name master_after_tr01_show_master_status_file +Pos master_after_tr01_show_master_status_position +Event_type Gtid +Server_id # +End_log_pos # +Info BEGIN GTID master_after_tr02_gtid_binlog_pos +SHOW BINLOG EVENTS IN 'master_after_tr01_show_master_status_file' FROM master_after_tr01_show_master_status_position LIMIT 1,1; +Log_name master_after_tr01_show_master_status_file +Pos # +Event_type Query_or_Annotate_rows +Server_id # +End_log_pos # +Info INSERT INTO t1 VALUES ('tr#02:stmt#00 - slave run#0, after backup') +### Slave: Checking SHOW BINLOG EVENTS +connection slave; +SHOW BINLOG EVENTS IN 'slave_after_tr01_show_master_status_file' FROM slave_after_tr01_show_master_status_position LIMIT 0,1; +Log_name slave_after_tr01_show_master_status_file +Pos # +Event_type Gtid +Server_id 1 +End_log_pos # +Info BEGIN GTID slave_after_tr02_gtid_binlog_pos +SHOW BINLOG EVENTS IN 'slave_after_tr01_show_master_status_file' FROM slave_after_tr01_show_master_status_position LIMIT 1,1; +Log_name slave_after_tr01_show_master_status_file +Pos # +Event_type Query_or_Annotate_rows +Server_id # +End_log_pos # +Info INSERT INTO t1 VALUES ('tr#02:stmt#00 - slave run#0, after backup') +### Slave: Stop replication +connection slave; +STOP SLAVE; +include/wait_for_slave_to_stop.inc +RESET SLAVE; +Warnings: +Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'No' to 'Slave_Pos' +### Slave: Shutdown the server +include/rpl_stop_server.inc [server_number=2] +### Master: Run a transaction while the slave is shut down +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#03:stmt#00 - after slave run#0, slave is shut down, after backup'); +INSERT INTO t1 VALUES ('tr#03:stmt#01 - after slave run#0, slave is shut down, after backup'); +INSERT INTO t1 VALUES ('tr#03:stmt#02 - after slave run#0, slave is shut down, after backup'); +COMMIT; +############################################################## +### Emulate starting a new virgin slave +### Slave: Remove the data directory +### Slave: Copy back the backup +### Slave: Restart the server +include/rpl_start_server.inc [server_number=2] +### Slave: Display the restored data before START SLAVE +connection slave; +SELECT * FROM t1 ORDER BY a; +a +tr#00:stmt#00 - slave run#0, before backup +tr#00:stmt#01 - slave run#0, before backup +tr#00:stmt#02 - slave run#0, before backup +tr#01:stmt#00 - slave run#0, before backup +tr#01:stmt#01 - slave run#0, before backup +tr#01:stmt#02 - slave run#0, before backup +### Slave: Execute the CHANGE MASTER statement to set up the host and port +CHANGE MASTER '' TO MASTER_USER='root', MASTER_HOST='127.0.0.1', MASTER_PORT=###, MASTER_CONNECT_RETRY=1; +### Slave: Execute the CHANGE MASTER statement from xtrabackup_slave_info +CHANGE MASTER TO MASTER_LOG_FILE='master_after_tr01_show_master_status_file', MASTER_LOG_POS=master_after_tr01_show_master_status_position; +Warnings: +Note 4190 CHANGE MASTER TO is implicitly changing the value of 'Using_Gtid' from 'Slave_Pos' to 'No' +### Slave: Execute START SLAVE +include/start_slave.inc +### Master: Wait for the slave to apply all master events +connection master; +connection slave; +### Slave: Make sure replication is not using GTID after the slave restart +connection slave; +# Using_Gtid=No +### Slave: Display the restored data after START SLAVE +connection slave; +SELECT * FROM t1 ORDER BY a; +a +tr#00:stmt#00 - slave run#0, before backup +tr#00:stmt#01 - slave run#0, before backup +tr#00:stmt#02 - slave run#0, before backup +tr#01:stmt#00 - slave run#0, before backup +tr#01:stmt#01 - slave run#0, before backup +tr#01:stmt#02 - slave run#0, before backup +tr#02:stmt#00 - slave run#0, after backup +tr#02:stmt#01 - slave run#0, after backup +tr#02:stmt@02 - slave run#0, after backup +tr#03:stmt#00 - after slave run#0, slave is shut down, after backup +tr#03:stmt#01 - after slave run#0, slave is shut down, after backup +tr#03:stmt#02 - after slave run#0, slave is shut down, after backup +############################################################## +### Continue master transactions, check the new slave replicates well. +### Master: Run a transaction after restarting replication +connection master; +START TRANSACTION; +INSERT INTO t1 VALUES ('tr#04:stmt#00 - slave run#1'); +INSERT INTO t1 VALUES ('tr#04:stmt#01 - slave run#1'); +INSERT INTO t1 VALUES ('tr#04:stmt#02 - slave run#1'); +COMMIT; +connection slave; +### Slave: Display the restored data + new transactions +connection slave; +SELECT * FROM t1 ORDER BY a; +a +tr#00:stmt#00 - slave run#0, before backup +tr#00:stmt#01 - slave run#0, before backup +tr#00:stmt#02 - slave run#0, before backup +tr#01:stmt#00 - slave run#0, before backup +tr#01:stmt#01 - slave run#0, before backup +tr#01:stmt#02 - slave run#0, before backup +tr#02:stmt#00 - slave run#0, after backup +tr#02:stmt#01 - slave run#0, after backup +tr#02:stmt@02 - slave run#0, after backup +tr#03:stmt#00 - after slave run#0, slave is shut down, after backup +tr#03:stmt#01 - after slave run#0, slave is shut down, after backup +tr#03:stmt#02 - after slave run#0, slave is shut down, after backup +tr#04:stmt#00 - slave run#1 +tr#04:stmt#01 - slave run#1 +tr#04:stmt#02 - slave run#1 +############################################################## +### Cleanup +### Removing the backup directory +connection master; +DROP TABLE t1; +connection slave; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/rpl_clone_slave.test mariadb-10.11.9/mysql-test/suite/mariabackup/rpl_clone_slave.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/rpl_clone_slave.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/rpl_clone_slave.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,17 @@ +# +# Cloning a slave using mariadb-backup +# +--source include/have_innodb.inc +--source include/master-slave.inc + +--echo # +--echo # MDEV-33342 Add a replication MTR test cloning the slave with mariadb-backup +--echo # + +connection slave; +stop slave; +change master to master_use_gtid=no; +start slave; + +--let cnf=mariadb_to_mariadb +--source include/rpl_clone_slave_using_mariadb-backup.inc diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/slave_provision_nolock.cnf mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.cnf --- mariadb-10.11.6/mysql-test/suite/mariabackup/slave_provision_nolock.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,13 @@ +[mysqld.1] +log-slave-updates +loose-innodb + +[mysqld.2] +log-slave-updates +loose-innodb + +[ENV] +SERVER_MYPORT_1= @mysqld.1.port +SERVER_MYSOCK_1= @mysqld.1.socket +SERVER_MYPORT_2= @mysqld.2.port +SERVER_MYSOCK_2= @mysqld.2.socket diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/slave_provision_nolock.result mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/slave_provision_nolock.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,48 @@ +call mtr.add_suppression("Can't init tc log"); +call mtr.add_suppression("Aborting"); +# restart +RESET MASTER; +CREATE TABLE t1(a varchar(60) PRIMARY KEY, b VARCHAR(60)) ENGINE INNODB; +INSERT INTO t1 VALUES(1, NULL); +CREATE TABLE t2 (val INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (0); +connect con1,localhost,root,,; +*** Start a background load... +CALL gen_load(); +connection default; +*** Doing backup... +*** Doing prepare... +*** Stop the background load... +UPDATE t2 SET val=1; +connection con1; +connection default; +disconnect con1; +*** Provision a new slave from the backup +connect server2,127.0.0.1,root,,,$SERVER_MYPORT_2; +*** Stopping provisioned server +*** Removing old datadir for provisioned server +*** Provision new server from backup +# restart +*** Configure slave position from xtrabackup_binlog_pos_innodb +CREATE TABLE t3 (file VARCHAR(255), pos INT) ENGINE=InnoDB; +LOAD DATA LOCAL INFILE "BASEDIR/xtrabackup_binlog_pos_innodb" + INTO TABLE t3 FIELDS ESCAPED BY '' (file, pos); +CHANGE MASTER TO +master_port=PORT, master_host='127.0.0.1', master_user='root', +master_log_file= "MASTER_FILE", +master_log_pos= MASTER_POS; +Warnings: +Note 4190 CHANGE MASTER TO is implicitly changing the value of 'Using_Gtid' from 'Slave_Pos' to 'No' +START SLAVE; +connection default; +connection server2; +connection server2; +STOP SLAVE; +RESET SLAVE ALL; +Warnings: +Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'No' to 'Slave_Pos' +DROP PROCEDURE gen_load; +DROP TABLE t1, t2, t3; +connection default; +DROP PROCEDURE gen_load; +DROP TABLE t1, t2; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/slave_provision_nolock.test mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/slave_provision_nolock.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/slave_provision_nolock.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,170 @@ +--source include/have_innodb.inc +--source include/have_log_bin.inc + +call mtr.add_suppression("Can't init tc log"); +call mtr.add_suppression("Aborting"); + +# Test provisioning a slave from an existing server, using mariabackup --no-lock +# and the binlog position recovered from InnoDB redo log. + +# Update the InnoDB system tablespace to simulate a pre-10.3.5 +# position in TRX_SYS. There was a bug that the wrong position could +# be recovered if the old filename in TRX_SYS compares newer than the +# newer filenames stored in rseg headers. +let MYSQLD_DATADIR=`select @@datadir`; +let INNODB_PAGE_SIZE=`select @@innodb_page_size`; + +--source include/shutdown_mysqld.inc + +--perl +use strict; +use warnings; +use Fcntl qw(:DEFAULT :seek); +do "$ENV{MTR_SUITE_DIR}/../innodb/include/crc32.pl"; +do "$ENV{MTR_SUITE_DIR}/../innodb/include/innodb-util.pl"; + +my $ps = $ENV{INNODB_PAGE_SIZE}; + +sysopen IBD_FILE, "$ENV{MYSQLD_DATADIR}/ibdata1", O_RDWR + or die "Cannot open ibdata1: $!\n"; + +# Read the TRX_SYS page. +my $page; +sysseek(IBD_FILE, $ps * 5, SEEK_SET) + or die "Cannot seek ibdata1: $!\n"; +sysread(IBD_FILE, $page, $ps) + or die "Cannot read ibdata1: $!\n"; + +# Put in an old binlog position that will compare larger than master-bin.000001 +my $old_name= '~~~-bin.999999' . chr(0); +my $old_off= 0xffff0000; +my $old_magic= 873422344; +my $binlog_offset= $ps - 1000 + 38; +substr($page, $binlog_offset, 4)= pack('N', $old_magic); +substr($page, $binlog_offset + 4, 4)= pack('N', ($old_off >> 32)); +substr($page, $binlog_offset + 8, 4)= pack('N', ($old_off & 0xffffffff)); +substr($page, $binlog_offset + 12, length($old_name))= $old_name; + +# Write back the modified page. +my $full_crc32= get_full_crc32(\*IBD_FILE); +$page= fix_page_crc($page, $full_crc32); +sysseek(IBD_FILE, $ps * 5, SEEK_SET) + or die "Cannot seek ibdata1: $!\n"; +syswrite(IBD_FILE, $page, $ps) == $ps + or die "Cannot write ibdata1: $!\n"; +close IBD_FILE; +EOF + +--source include/start_mysqld.inc + + +let $basedir=$MYSQLTEST_VARDIR/tmp/backup; + +RESET MASTER; +CREATE TABLE t1(a varchar(60) PRIMARY KEY, b VARCHAR(60)) ENGINE INNODB; +INSERT INTO t1 VALUES(1, NULL); +CREATE TABLE t2 (val INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (0); + +--disable_query_log +--delimiter // +CREATE PROCEDURE gen_load() + MODIFIES SQL DATA + BEGIN + DECLARE i INT; + DECLARE flag TYPE OF t2.val; + SET i = 0; + load_loop: LOOP + SELECT val INTO flag FROM t2; + IF NOT (flag=0) THEN + LEAVE load_loop; + END IF; + START TRANSACTION; + INSERT INTO t1 VALUES (CONCAT("AbAdCaFe", LPAD(i, 6, "0")), @@SESSION.last_gtid); + COMMIT; + SET i = i + 1; + END LOOP; + END +// +--delimiter ; +--enable_query_log + +connect (con1,localhost,root,,); +--echo *** Start a background load... +send CALL gen_load(); + +--connection default +--echo *** Doing backup... +--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir --no-lock +--echo *** Doing prepare... +--exec $XTRABACKUP --prepare --binlog-info=1 --target-dir=$basedir + +--echo *** Stop the background load... +UPDATE t2 SET val=1; +--connection con1 +reap; +--connection default +disconnect con1; +--let $count_master= `SELECT COUNT(*) FROM t1` + +--echo *** Provision a new slave from the backup +--connect (server2,127.0.0.1,root,,,$SERVER_MYPORT_2) +--let $datadir_2= `SELECT @@datadir` + +--echo *** Stopping provisioned server +--source include/shutdown_mysqld.inc + +--echo *** Removing old datadir for provisioned server +--rmdir $datadir_2 + +--echo *** Provision new server from backup +--exec $XTRABACKUP --copy-back --datadir=$datadir_2 --target-dir=$basedir + +# --no-lock backup might leave prepared xa transactions. rollback them. +--error 1 +--exec $MYSQLD_LAST_CMD --tc-heuristic-recover=ROLLBACK +--source include/start_mysqld.inc + +--echo *** Configure slave position from xtrabackup_binlog_pos_innodb +CREATE TABLE t3 (file VARCHAR(255), pos INT) ENGINE=InnoDB; +--replace_result $basedir BASEDIR +--disable_warnings +eval LOAD DATA LOCAL INFILE "$basedir/xtrabackup_binlog_pos_innodb" + INTO TABLE t3 FIELDS ESCAPED BY '' (file, pos); +--enable_warnings + +# Remove leading ./ from filename (leading .\ on windows). +--let provision_master_file= `SELECT REGEXP_REPLACE(file, "^[.].", "") FROM t3` +--let provision_master_pos= `SELECT pos FROM t3` + +--replace_result $SERVER_MYPORT_1 PORT $provision_master_file MASTER_FILE $provision_master_pos MASTER_POS +eval CHANGE MASTER TO + master_port=$SERVER_MYPORT_1, master_host='127.0.0.1', master_user='root', + master_log_file= "$provision_master_file", + master_log_pos= $provision_master_pos; +START SLAVE; + +--connection default +--save_master_pos + +--connection server2 +--sync_with_master +--let $count_slave= `SELECT COUNT(*) FROM t1` +if ($count_master != $count_slave) { + --echo *** ERROR: Table on master has $count_master rows, but table on provisioned slave has $count_slave rows + --die Row difference on provisioned slave. +} + +# Cleanup + +--connection server2 +STOP SLAVE; +RESET SLAVE ALL; +DROP PROCEDURE gen_load; +DROP TABLE t1, t2, t3; + +--connection default +DROP PROCEDURE gen_load; +DROP TABLE t1, t2; + +rmdir $basedir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/small_ibd.test mariadb-10.11.9/mysql-test/suite/mariabackup/small_ibd.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/small_ibd.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/small_ibd.test 2024-08-03 07:29:58.000000000 +0000 @@ -13,7 +13,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log remove_file $_datadir/test/small.ibd; rmdir $targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/suite.opt mariadb-10.11.9/mysql-test/suite/mariabackup/suite.opt --- mariadb-10.11.6/mysql-test/suite/mariabackup/suite.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/suite.opt 2024-08-03 07:29:58.000000000 +0000 @@ -1 +1 @@ ---innodb --loose-changed_page_bitmaps --innodb-sys-tables --innodb-flush-log-at-trx-commit=2 --sequence +--innodb --innodb-sys-tables --innodb-flush-log-at-trx-commit=2 --sequence diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/system_versioning.test mariadb-10.11.9/mysql-test/suite/mariabackup/system_versioning.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/system_versioning.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/system_versioning.test 2024-08-03 07:29:58.000000000 +0000 @@ -5,7 +5,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log insert into t values (3); @@ -32,7 +32,7 @@ update t set a=2; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log insert into t values (3); diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/truncate_during_backup.test mariadb-10.11.9/mysql-test/suite/mariabackup/truncate_during_backup.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/truncate_during_backup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/truncate_during_backup.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,7 @@ --let after_load_tablespaces=TRUNCATE test.t1 --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --dbug=+d,mariabackup_events; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --dbug=+d,mariabackup_events; --enable_result_log --let after_load_tablespaces= diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/undo_space_id.result mariadb-10.11.9/mysql-test/suite/mariabackup/undo_space_id.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/undo_space_id.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/undo_space_id.result 2024-08-03 07:29:58.000000000 +0000 @@ -11,3 +11,10 @@ undo001 undo002 DROP TABLE t1; +# +# MDEV-33980 mariadb-backup --backup is missing +# retry logic for undo tablespaces +# +# xtrabackup backup +# Display undo log files from target directory +FOUND 5 /Retrying to read undo tablespace*/ in backup.log diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/undo_space_id.test mariadb-10.11.9/mysql-test/suite/mariabackup/undo_space_id.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/undo_space_id.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/undo_space_id.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,7 +11,7 @@ --echo # xtrabackup backup --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log --echo # Display undo log files from target directory list_files $basedir undo*; @@ -23,3 +23,22 @@ DROP TABLE t1; rmdir $basedir; + +--echo # +--echo # MDEV-33980 mariadb-backup --backup is missing +--echo # retry logic for undo tablespaces +--echo # +let $backuplog= $MYSQLTEST_VARDIR/tmp/backup.log; +--echo # xtrabackup backup +--disable_result_log +--error 1 +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir --dbug=+d,undo_space_read_fail > $backuplog; +--enable_result_log +--echo # Display undo log files from target directory +list_files $basedir undo*; + +--let SEARCH_PATTERN=Retrying to read undo tablespace* +--let SEARCH_FILE=$backuplog +--source include/search_pattern_in_file.inc +rmdir $basedir; +remove_file $backuplog; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/unencrypted_page_compressed.result mariadb-10.11.9/mysql-test/suite/mariabackup/unencrypted_page_compressed.result --- mariadb-10.11.6/mysql-test/suite/mariabackup/unencrypted_page_compressed.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/unencrypted_page_compressed.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,6 @@ call mtr.add_suppression("InnoDB: Table `test`.`t1` has an unreadable root page"); -CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, c char(200)) ENGINE=InnoDB page_compressed=yes; +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, c char(200)) +ENGINE=InnoDB PAGE_COMPRESSED=YES STATS_PERSISTENT=0; insert into t1(b, c) values("mariadb", "mariabackup"); InnoDB 0 transactions not purged # Corrupt the table diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/unencrypted_page_compressed.test mariadb-10.11.9/mysql-test/suite/mariabackup/unencrypted_page_compressed.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/unencrypted_page_compressed.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/unencrypted_page_compressed.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,6 @@ call mtr.add_suppression("InnoDB: Table `test`.`t1` has an unreadable root page"); -CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, c char(200)) ENGINE=InnoDB page_compressed=yes; +CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, b TEXT, c char(200)) +ENGINE=InnoDB PAGE_COMPRESSED=YES STATS_PERSISTENT=0; insert into t1(b, c) values("mariadb", "mariabackup"); --source ../innodb/include/wait_all_purged.inc @@ -37,7 +38,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; let $backuplog=$MYSQLTEST_VARDIR/tmp/backup.log; --error 1 -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir --core-file > $backuplog; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir --core-file > $backuplog; --enable_result_log --let SEARCH_PATTERN=Database page corruption detected.* diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/unsupported_redo.test mariadb-10.11.9/mysql-test/suite/mariabackup/unsupported_redo.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/unsupported_redo.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/unsupported_redo.test 2024-08-03 07:29:58.000000000 +0000 @@ -15,7 +15,7 @@ echo # No longer fails during full backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log DROP TABLE t1; @@ -29,13 +29,13 @@ --echo # Create full backup , modify table, then fails during creation of --echo # incremental/differential backup --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$basedir; --enable_result_log ALTER TABLE t1 FORCE, ALGORITHM=INPLACE; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$incremental_dir --incremental-basedir=$basedir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$incremental_dir --incremental-basedir=$basedir; --enable_result_log DROP TABLE t1; @@ -58,7 +58,7 @@ --echo # unsupported redo log for the table t21. --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables-exclude=test.t21" --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables-exclude=test.t21" --target-dir=$targetdir; --enable_result_log --list_files $targetdir/test *.ibd --list_files $targetdir/test *.new diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xb_aws_key_management.test mariadb-10.11.9/mysql-test/suite/mariabackup/xb_aws_key_management.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xb_aws_key_management.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xb_aws_key_management.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,7 +10,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; exec $XTRABACKUP --prepare --target-dir=$targetdir; -- source include/restart_and_restore.inc --enable_result_log diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xb_file_key_management.test mariadb-10.11.9/mysql-test/suite/mariabackup/xb_file_key_management.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xb_file_key_management.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xb_file_key_management.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log --let SEARCH_RANGE = 10000000 diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xb_history.test mariadb-10.11.9/mysql-test/suite/mariabackup/xb_history.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xb_history.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xb_history.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,7 +6,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --history=foo --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --history=foo --backup --parallel=10 --target-dir=$targetdir; --enable_result_log rmdir $targetdir; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xb_page_compress.test mariadb-10.11.9/mysql-test/suite/mariabackup/xb_page_compress.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xb_page_compress.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xb_page_compress.test 2024-08-03 07:29:58.000000000 +0000 @@ -27,7 +27,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup "--tables=test.*1" --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 "--tables=test.*1" --target-dir=$targetdir; echo # xtrabackup prepare; exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffix=.1 --prepare --export --target-dir=$targetdir; --enable_result_log diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xb_partition.test mariadb-10.11.9/mysql-test/suite/mariabackup/xb_partition.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xb_partition.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xb_partition.test 2024-08-03 07:29:58.000000000 +0000 @@ -39,7 +39,7 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir/full; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir/full; --enable_result_log DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xb_rocksdb.test mariadb-10.11.9/mysql-test/suite/mariabackup/xb_rocksdb.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xb_rocksdb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xb_rocksdb.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,9 +8,9 @@ let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; let $stream=$MYSQLTEST_VARDIR/tmp/backup.xb; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir $backup_extra_param; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir $backup_extra_param; --enable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --stream=xbstream > $stream 2>$MYSQLTEST_VARDIR/tmp/backup_stream.log; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --stream=xbstream > $stream 2>$MYSQLTEST_VARDIR/tmp/backup_stream.log; INSERT INTO t VALUES(2); diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xb_rocksdb_datadir.test mariadb-10.11.9/mysql-test/suite/mariabackup/xb_rocksdb_datadir.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xb_rocksdb_datadir.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xb_rocksdb_datadir.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,7 +9,7 @@ echo # xtrabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; --disable_result_log -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --target-dir=$targetdir; --enable_result_log INSERT INTO t VALUES(2); diff -Nru mariadb-10.11.6/mysql-test/suite/mariabackup/xbstream.test mariadb-10.11.9/mysql-test/suite/mariabackup/xbstream.test --- mariadb-10.11.6/mysql-test/suite/mariabackup/xbstream.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/mariabackup/xbstream.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,7 @@ let $streamfile=$MYSQLTEST_VARDIR/tmp/backup.xb; echo # xtrabackup backup to stream; -exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --databases-exclude=foobar --stream=xbstream > $streamfile 2>$targetdir/backup_stream.log; +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --parallel=10 --databases-exclude=foobar --stream=xbstream > $streamfile 2>$targetdir/backup_stream.log; echo # xbstream extract; --disable_result_log exec $XBSTREAM -x -C $targetdir < $streamfile; diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/gtid_ignore_duplicates.result mariadb-10.11.9/mysql-test/suite/multi_source/gtid_ignore_duplicates.result --- mariadb-10.11.6/mysql-test/suite/multi_source/gtid_ignore_duplicates.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/gtid_ignore_duplicates.result 2024-08-03 07:29:58.000000000 +0000 @@ -174,6 +174,105 @@ 10 11 12 +*** MDEV-33475: --gtid-ignore-duplicate can double-apply event in case of parallel replication retry +connection server_2; +STOP SLAVE "c2b"; +SET default_master_connection = "c2b"; +include/wait_for_slave_to_stop.inc +STOP SLAVE "a2b"; +SET default_master_connection = "a2b"; +include/wait_for_slave_to_stop.inc +connection server_1; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +BEGIN; +INSERT INTO t2 VALUES (0, 0); +INSERT INTO t2 VALUES (1, 0); +INSERT INTO t2 VALUES (2, 0); +INSERT INTO t2 VALUES (3, 0); +INSERT INTO t2 VALUES (4, 0); +INSERT INTO t2 VALUES (5, 0); +INSERT INTO t2 VALUES (6, 0); +INSERT INTO t2 VALUES (7, 0); +INSERT INTO t2 VALUES (8, 0); +INSERT INTO t2 VALUES (9, 0); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (0+10, 100); +UPDATE t2 SET b=0 WHERE a<10; +INSERT INTO t2 VALUES (0+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (1+10, 100); +UPDATE t2 SET b=1 WHERE a<10; +INSERT INTO t2 VALUES (1+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (2+10, 100); +UPDATE t2 SET b=2 WHERE a<10; +INSERT INTO t2 VALUES (2+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (3+10, 100); +UPDATE t2 SET b=3 WHERE a<10; +INSERT INTO t2 VALUES (3+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (4+10, 100); +UPDATE t2 SET b=4 WHERE a<10; +INSERT INTO t2 VALUES (4+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (5+10, 100); +UPDATE t2 SET b=5 WHERE a<10; +INSERT INTO t2 VALUES (5+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (6+10, 100); +UPDATE t2 SET b=6 WHERE a<10; +INSERT INTO t2 VALUES (6+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (7+10, 100); +UPDATE t2 SET b=7 WHERE a<10; +INSERT INTO t2 VALUES (7+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (8+10, 100); +UPDATE t2 SET b=8 WHERE a<10; +INSERT INTO t2 VALUES (8+20, 200); +COMMIT; +BEGIN; +INSERT INTO t2 VALUES (9+10, 100); +UPDATE t2 SET b=9 WHERE a<10; +INSERT INTO t2 VALUES (9+20, 200); +COMMIT; +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; +COUNT(*) SUM(a) SUM(b) +30 435 3090 +include/save_master_gtid.inc +connection server_2; +SET @old_mode= @@GLOBAL.slave_parallel_mode; +SET GLOBAL slave_parallel_mode=aggressive; +SET default_master_connection = "a2b"; +START SLAVE; +include/wait_for_slave_to_start.inc +SET default_master_connection = "c2b"; +START SLAVE; +include/wait_for_slave_to_start.inc +include/sync_with_master_gtid.inc +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; +COUNT(*) SUM(a) SUM(b) +30 435 3090 +connection server_3; +include/sync_with_master_gtid.inc +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; +COUNT(*) SUM(a) SUM(b) +30 435 3090 +connection server_4; +include/sync_with_master_gtid.inc +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; +COUNT(*) SUM(a) SUM(b) +30 435 3090 *** Test also with not using parallel replication. connection server_1; SET default_master_connection = "b2a"; @@ -474,6 +573,7 @@ Note 1938 SLAVE 'a2b' stopped Note 1938 SLAVE 'c2b' stopped SET GLOBAL slave_parallel_threads= @old_parallel; +SET GLOBAL slave_parallel_mode= @old_mode; SET GLOBAL gtid_ignore_duplicates= @old_ignore_duplicates; connection server_3; SET GLOBAL gtid_domain_id=0; @@ -491,22 +591,22 @@ SET GLOBAL slave_parallel_threads= @old_parallel; SET GLOBAL gtid_ignore_duplicates= @old_ignore_duplicates; connection server_1; -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; include/reset_master_slave.inc disconnect server_1; connection server_2; -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; include/reset_master_slave.inc disconnect server_2; connection server_3; -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; include/reset_master_slave.inc disconnect server_3; connection server_4; -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; include/reset_master_slave.inc disconnect server_4; diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/gtid_ignore_duplicates.test mariadb-10.11.9/mysql-test/suite/multi_source/gtid_ignore_duplicates.test --- mariadb-10.11.6/mysql-test/suite/multi_source/gtid_ignore_duplicates.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/gtid_ignore_duplicates.test 2024-08-03 07:29:58.000000000 +0000 @@ -173,6 +173,65 @@ SELECT * FROM t1 WHERE a >= 10 ORDER BY a; +--echo *** MDEV-33475: --gtid-ignore-duplicate can double-apply event in case of parallel replication retry + +# Create a bunch of transactions that will cause conflicts and retries. +# The bug was that the retry code was not handling the --gtid-ignore-duplicates +# option, so events could be doubly-applied. + +--connection server_2 +STOP SLAVE "c2b"; +SET default_master_connection = "c2b"; +--source include/wait_for_slave_to_stop.inc +STOP SLAVE "a2b"; +SET default_master_connection = "a2b"; +--source include/wait_for_slave_to_stop.inc + +--connection server_1 +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +BEGIN; +--let $i= 0 +while ($i < 10) { + eval INSERT INTO t2 VALUES ($i, 0); + inc $i; +} +COMMIT; + +--let $i= 0 +while ($i < 10) { + BEGIN; + eval INSERT INTO t2 VALUES ($i+10, 100); + eval UPDATE t2 SET b=$i WHERE a<10; + eval INSERT INTO t2 VALUES ($i+20, 200); + COMMIT; + inc $i; +} + +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; +--source include/save_master_gtid.inc + +--connection server_2 +SET @old_mode= @@GLOBAL.slave_parallel_mode; +SET GLOBAL slave_parallel_mode=aggressive; +SET default_master_connection = "a2b"; +START SLAVE; +--source include/wait_for_slave_to_start.inc +SET default_master_connection = "c2b"; +START SLAVE; +--source include/wait_for_slave_to_start.inc + +--source include/sync_with_master_gtid.inc +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; + +--connection server_3 +--source include/sync_with_master_gtid.inc +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; + +--connection server_4 +--source include/sync_with_master_gtid.inc +SELECT COUNT(*), SUM(a), SUM(b) FROM t2; + + --echo *** Test also with not using parallel replication. --connection server_1 @@ -414,6 +473,7 @@ --sorted_result STOP ALL SLAVES; SET GLOBAL slave_parallel_threads= @old_parallel; +SET GLOBAL slave_parallel_mode= @old_mode; SET GLOBAL gtid_ignore_duplicates= @old_ignore_duplicates; --connection server_3 @@ -431,25 +491,25 @@ SET GLOBAL gtid_ignore_duplicates= @old_ignore_duplicates; --connection server_1 -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; --source include/reset_master_slave.inc --disconnect server_1 --connection server_2 -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; --source include/reset_master_slave.inc --disconnect server_2 --connection server_3 -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; --source include/reset_master_slave.inc --disconnect server_3 --connection server_4 -DROP TABLE t1; +DROP TABLE t1, t2; ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; --source include/reset_master_slave.inc --disconnect server_4 diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/gtid_slave_pos.result mariadb-10.11.9/mysql-test/suite/multi_source/gtid_slave_pos.result --- mariadb-10.11.6/mysql-test/suite/multi_source/gtid_slave_pos.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/gtid_slave_pos.result 2024-08-03 07:29:58.000000000 +0000 @@ -97,8 +97,9 @@ STOP SLAVE; include/wait_for_slave_to_stop.inc set default_master_connection = 'slave2'; +include/wait_for_slave_sql_error.inc [errno=1942] STOP SLAVE; -include/wait_for_slave_to_stop.inc +include/wait_for_slave_io_to_stop.inc set default_master_connection = 'slave1'; START SLAVE; include/wait_for_slave_to_start.inc diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/gtid_slave_pos.test mariadb-10.11.9/mysql-test/suite/multi_source/gtid_slave_pos.test --- mariadb-10.11.6/mysql-test/suite/multi_source/gtid_slave_pos.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/gtid_slave_pos.test 2024-08-03 07:29:58.000000000 +0000 @@ -118,8 +118,10 @@ STOP SLAVE; --source include/wait_for_slave_to_stop.inc set default_master_connection = 'slave2'; +--let $slave_sql_errno= 1942 +--source include/wait_for_slave_sql_error.inc STOP SLAVE; ---source include/wait_for_slave_to_stop.inc +--source include/wait_for_slave_io_to_stop.inc set default_master_connection = 'slave1'; START SLAVE; --source include/wait_for_slave_to_start.inc diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/info_logs.result mariadb-10.11.9/mysql-test/suite/multi_source/info_logs.result --- mariadb-10.11.6/mysql-test/suite/multi_source/info_logs.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/info_logs.result 2024-08-03 07:29:58.000000000 +0000 @@ -94,17 +94,17 @@ # EOF # show all slaves status; -Connection_name Slave_SQL_State Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Retried_transactions Max_relay_log_size Executed_log_entries Slave_received_heartbeats Slave_heartbeat_period Gtid_Slave_Pos - Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_1 60 master-bin.000001 relay.000002 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 1 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 7 0 60.000 -MASTER 2.2 Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_2 60 master-bin.000001 relay-master@00202@002e2.000002 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 2 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 7 0 60.000 +Connection_name Slave_SQL_State Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Replicate_Rewrite_DB Retried_transactions Max_relay_log_size Executed_log_entries Slave_received_heartbeats Slave_heartbeat_period Gtid_Slave_Pos + Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_1 60 master-bin.000001 relay.000002 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 1 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 7 0 60.000 +MASTER 2.2 Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_2 60 master-bin.000001 relay-master@00202@002e2.000002 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 2 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 7 0 60.000 include/wait_for_slave_to_start.inc set default_master_connection = 'MASTER 2.2'; include/wait_for_slave_to_start.inc set default_master_connection = ''; show all slaves status; -Connection_name Slave_SQL_State Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Retried_transactions Max_relay_log_size Executed_log_entries Slave_received_heartbeats Slave_heartbeat_period Gtid_Slave_Pos - Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_1 60 master-bin.000001 relay.000004 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 1 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 6 0 60.000 -MASTER 2.2 Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_2 60 master-bin.000001 relay-master@00202@002e2.000004 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 2 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 6 0 60.000 +Connection_name Slave_SQL_State Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Replicate_Rewrite_DB Retried_transactions Max_relay_log_size Executed_log_entries Slave_received_heartbeats Slave_heartbeat_period Gtid_Slave_Pos + Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_1 60 master-bin.000001 relay.000004 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 1 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 6 0 60.000 +MASTER 2.2 Slave has read all relay log; waiting for more updates Waiting for master to send event 127.0.0.1 root MYPORT_2 60 master-bin.000001 relay-master@00202@002e2.000004 master-bin.000001 Yes Yes 0 0 None 0 No 0 No 0 0 2 No optimistic 0 NULL Slave has read all relay log; waiting for more updates 0 0 0 0 1073741824 6 0 60.000 # # List of files matching '*info*' pattern # after slave server restart diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/mdev-9544.test mariadb-10.11.9/mysql-test/suite/multi_source/mdev-9544.test --- mariadb-10.11.6/mysql-test/suite/multi_source/mdev-9544.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/mdev-9544.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ --source include/not_embedded.inc --source include/have_innodb.inc --source include/have_debug.inc +--source include/not_windows.inc --connect (server_1,127.0.0.1,root,,,$SERVER_MYPORT_1) --connect (server_2,127.0.0.1,root,,,$SERVER_MYPORT_2) diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/multi_source_slave_alias_replica.result mariadb-10.11.9/mysql-test/suite/multi_source/multi_source_slave_alias_replica.result --- mariadb-10.11.6/mysql-test/suite/multi_source/multi_source_slave_alias_replica.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/multi_source_slave_alias_replica.result 2024-08-03 07:29:58.000000000 +0000 @@ -34,7 +34,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -76,6 +75,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 @@ -96,7 +96,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -138,6 +137,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/reset_slave.result mariadb-10.11.9/mysql-test/suite/multi_source/reset_slave.result --- mariadb-10.11.6/mysql-test/suite/multi_source/reset_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/reset_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -13,15 +13,15 @@ connection slave; stop slave 'master1'; show slave 'master1' status; -Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups - 127.0.0.1 root MYPORT_1 60 master-bin.000001 mysqld-relay-bin-master1.000002 master-bin.000001 No No 0 0 None 0 No NULL No 0 0 1 Slave_Pos 0-1-3 optimistic 0 NULL 2 1 0 +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Replicate_Rewrite_DB + 127.0.0.1 root MYPORT_1 60 master-bin.000001 mysqld-relay-bin-master1.000002 master-bin.000001 No No 0 0 None 0 No NULL No 0 0 1 Slave_Pos 0-1-3 optimistic 0 NULL 2 1 0 mysqld-relay-bin-master1.000001 mysqld-relay-bin-master1.000002 mysqld-relay-bin-master1.index reset slave 'master1'; show slave 'master1' status; -Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups - 127.0.0.1 root MYPORT_1 60 4 No No 0 0 0 None 0 No NULL No 0 0 1 Slave_Pos optimistic 0 NULL 2 1 0 +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Replicate_Rewrite_DB + 127.0.0.1 root MYPORT_1 60 4 No No 0 0 0 None 0 No NULL No 0 0 1 Slave_Pos optimistic 0 NULL 2 1 0 reset slave 'master1' all; show slave 'master1' status; ERROR HY000: There is no master connection 'master1' diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/simple.result mariadb-10.11.9/mysql-test/suite/multi_source/simple.result --- mariadb-10.11.6/mysql-test/suite/multi_source/simple.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/simple.result 2024-08-03 07:29:58.000000000 +0000 @@ -32,7 +32,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -74,6 +73,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 @@ -94,7 +94,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -136,6 +135,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 @@ -221,7 +221,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running No Slave_SQL_Running No -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -263,6 +262,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB reset slave 'slave1'; show all slaves status; Connection_name slave1 @@ -279,7 +279,6 @@ Relay_Master_Log_File Slave_IO_Running No Slave_SQL_Running No -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -321,6 +320,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 @@ -341,7 +341,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -383,6 +382,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 @@ -405,7 +405,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running Yes Slave_SQL_Running Yes -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -447,6 +446,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 @@ -471,7 +471,6 @@ Relay_Master_Log_File master-bin.000001 Slave_IO_Running No Slave_SQL_Running No -Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table @@ -513,6 +512,7 @@ Slave_DDL_Groups 0 Slave_Non_Transactional_Groups 0 Slave_Transactional_Groups 0 +Replicate_Rewrite_DB Retried_transactions 0 Max_relay_log_size 1073741824 Executed_log_entries 7 diff -Nru mariadb-10.11.6/mysql-test/suite/multi_source/syntax.result mariadb-10.11.9/mysql-test/suite/multi_source/syntax.result --- mariadb-10.11.6/mysql-test/suite/multi_source/syntax.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/multi_source/syntax.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,11 +1,11 @@ include/master-slave.inc [connection master] show slave status; -Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Replicate_Rewrite_DB show slave '' status; -Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups +Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Replicate_Rewrite_DB show all slaves status; -Connection_name Slave_SQL_State Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Rewrite_DB Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Retried_transactions Max_relay_log_size Executed_log_entries Slave_received_heartbeats Slave_heartbeat_period Gtid_Slave_Pos +Connection_name Slave_SQL_State Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Master_SSL_Verify_Server_Cert Last_IO_Errno Last_IO_Error Last_SQL_Errno Last_SQL_Error Replicate_Ignore_Server_Ids Master_Server_Id Master_SSL_Crl Master_SSL_Crlpath Using_Gtid Gtid_IO_Pos Replicate_Do_Domain_Ids Replicate_Ignore_Domain_Ids Parallel_Mode SQL_Delay SQL_Remaining_Delay Slave_SQL_Running_State Slave_DDL_Groups Slave_Non_Transactional_Groups Slave_Transactional_Groups Replicate_Rewrite_DB Retried_transactions Max_relay_log_size Executed_log_entries Slave_received_heartbeats Slave_heartbeat_period Gtid_Slave_Pos # # Check error handling # diff -Nru mariadb-10.11.6/mysql-test/suite/parts/inc/partition_crash.inc mariadb-10.11.9/mysql-test/suite/parts/inc/partition_crash.inc --- mariadb-10.11.6/mysql-test/suite/parts/inc/partition_crash.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/inc/partition_crash.inc 2024-08-03 07:29:58.000000000 +0000 @@ -11,7 +11,7 @@ SHOW CREATE TABLE t1; --sorted_result SELECT * FROM t1; ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --disable_reconnect # CR_SERVER_LOST --error 2013 @@ -22,7 +22,7 @@ --replace_regex /sql-exchange.*\./sql-exchange./ /sql-shadow-[0-9a-f]*-/sql-shadow-/ --cat_file $DATADIR.files.txt --remove_file $DATADIR.files.txt ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --enable_reconnect --source include/wait_until_connected_again.inc --echo # State after crash recovery diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/alter_table.result mariadb-10.11.9/mysql-test/suite/parts/r/alter_table.result --- mariadb-10.11.6/mysql-test/suite/parts/r/alter_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/alter_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,6 @@ +# +# MDEV-22649 SIGSEGV in ha_partition::create_partitioning_metadata on ALTER +# set @save_alter_algorithm= @@session.alter_algorithm; SET SESSION alter_algorithm=4; CREATE TABLE t1(a INT) engine=myisam PARTITION BY RANGE(a) SUBPARTITION BY KEY(a) (PARTITION p0 VALUES LESS THAN (10) (SUBPARTITION s0,SUBPARTITION s1), PARTITION p1 VALUES LESS THAN (20) (SUBPARTITION s2,SUBPARTITION s3)); @@ -18,9 +21,16 @@ ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY DROP table if exists t1; set @@session.alter_algorithm= @save_alter_algorithm; +# +# MDEV-22804 SIGSEGV in ha_partition::create_partitioning_metadata | +# ERROR 1507 (HY000): Error in list of partitions to DROP +# CREATE TABLE t1 (a INT) PARTITION BY RANGE(a) SUBPARTITION BY HASH(a) (PARTITION p VALUES LESS THAN (5) (SUBPARTITION sp, SUBPARTITION sp1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION sp2, SUBPARTITION sp3)); ALTER TABLE t1 DROP PARTITION p; DROP TABLE if exists t1; +# +# MDEV-23357 Server crashes in Sql_cmd_alter_table_exchange_partition::exchange_partition +# CREATE TABLE t1 (i INT); CREATE VIEW v1 as SELECT * FROM t1; CREATE TABLE t2 (i INT); @@ -28,6 +38,7 @@ ERROR 42000: Can't open table DROP VIEW v1; DROP TABLE t1, t2; +# End of 10.5 tests # # MDEV-22165 CONVERT PARTITION: move in partition from existing table # @@ -358,3 +369,4 @@ connection default; drop user u@localhost; drop database db; +# End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/mdev_21007.result mariadb-10.11.9/mysql-test/suite/parts/r/mdev_21007.result --- mariadb-10.11.6/mysql-test/suite/parts/r/mdev_21007.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/mdev_21007.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,5 @@ +CREATE TABLE t1 (a INT) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (1), PARTITION p1 VALUES LESS THAN (MAXVALUE)); +INSERT INTO t1 VALUES (1),(2); +ALTER TABLE t1 MODIFY a INT AUTO_INCREMENT PRIMARY KEY; +UPDATE t1 PARTITION (p1) SET a=9 ORDER BY a LIMIT 1; +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/mdev_24610.result mariadb-10.11.9/mysql-test/suite/parts/r/mdev_24610.result --- mariadb-10.11.6/mysql-test/suite/parts/r/mdev_24610.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/mdev_24610.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,24 @@ +CREATE TABLE t (c BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=MEMORY PARTITION BY KEY(); +INSERT INTO t VALUES (18446744073709551615); +select * from t; +c +18446744073709551615 +drop table t; +CREATE TABLE t (c BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=MEMORY; +INSERT INTO t VALUES (18446744073709551615); +ALTER TABLE t PARTITION BY KEY(); +INSERT INTO t VALUES (1); +select * from t; +c +18446744073709551615 +1 +drop table t; +CREATE TABLE t (c BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=MEMORY; +INSERT INTO t VALUES (18446744073709551615); +ALTER TABLE t PARTITION BY KEY(); +INSERT INTO t VALUES (NULL); +ERROR HY000: Failed to read auto-increment value from storage engine +select * from t; +c +18446744073709551615 +drop table t; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter4_innodb.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter4_innodb.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter4_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter4_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -60,7 +60,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -521,7 +520,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -993,7 +991,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -1466,7 +1463,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -1933,7 +1929,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -2406,7 +2401,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -2884,7 +2878,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -3360,7 +3353,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -3826,7 +3818,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -4287,7 +4278,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -4759,7 +4749,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -5232,7 +5221,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -5699,7 +5687,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -6172,7 +6159,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -6650,7 +6636,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -7126,7 +7111,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -15108,7 +15092,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -15569,7 +15552,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -16041,7 +16023,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -16514,7 +16495,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -16981,7 +16961,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -17454,7 +17433,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -17932,7 +17910,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -18408,7 +18385,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter4_myisam.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter4_myisam.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter4_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter4_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -60,7 +60,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -530,7 +529,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -1017,7 +1015,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -1511,7 +1508,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -1995,7 +1991,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -2489,7 +2484,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -2988,7 +2982,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -3485,7 +3478,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -3974,7 +3966,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -4444,7 +4435,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -4931,7 +4921,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -5425,7 +5414,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -5909,7 +5897,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -6403,7 +6390,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -6902,7 +6888,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -7399,7 +7384,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION part_1,part_2; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -15700,7 +15684,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -16170,7 +16153,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -16657,7 +16639,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -17151,7 +17132,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -17635,7 +17615,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -18129,7 +18108,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -18628,7 +18606,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template @@ -19125,7 +19102,6 @@ WHERE f_int1 BETWEEN 1 AND @max_row_div2 - 1; ALTER TABLE t1 ANALYZE PARTITION ALL; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK INSERT INTO t1(f_int1,f_int2,f_char1,f_char2,f_charbig) SELECT f_int1,f_int2,f_char1,f_char2,f_charbig FROM t0_template diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter_innodb.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter_innodb.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -71,7 +71,8 @@ # # MDEV-28079 Shutdown hangs after altering innodb partition fts table # -CREATE TABLE t1(f1 INT, f2 CHAR(100))ENGINE=InnoDB PARTITION BY HASH(f1) PARTITIONS 2; +CREATE TABLE t1(f1 INT, f2 CHAR(100))ENGINE=InnoDB STATS_PERSISTENT=0 +PARTITION BY HASH(f1) PARTITIONS 2; ALTER TABLE t1 ADD FULLTEXT(f2); InnoDB 0 transactions not purged DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter_myisam.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter_myisam.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_alter_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_alter_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -88,3 +88,25 @@ alter online table t1 delay_key_write=0; alter online table t1 delay_key_write=1; drop table t1; +# +# MDEV-25102 UNIQUE USING HASH error after ALTER ... DISABLE KEYS +# +create table t1 (i1 int primary key, i2 int, d1 date, key(i2)) +partition by hash(i1) partitions 3; +insert into t1 values(0, 1, '2010-10-10'); +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +index_name comment +PRIMARY +i2 +alter table t1 disable keys; +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +index_name comment +PRIMARY +i2 disabled +alter table t1 add partition (partition p4); +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +index_name comment +PRIMARY +i2 disabled +drop table t1; +# End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -1020,7 +1020,6 @@ 2001 Second in MAX ALTER TABLE t1 ANALYZE PARTITION MAX; Table Op Msg_type Msg_text -MySQL_Test_DB.t1 analyze status Engine-independent statistics collected MySQL_Test_DB.t1 analyze status OK # Truncate without FLUSH ALTER TABLE t1 TRUNCATE PARTITION MAX; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_memory.result 2024-08-03 07:29:58.000000000 +0000 @@ -1020,7 +1020,6 @@ 2001 Second in MAX ALTER TABLE t1 ANALYZE PARTITION MAX; Table Op Msg_type Msg_text -MySQL_Test_DB.t1 analyze status Engine-independent statistics collected MySQL_Test_DB.t1 analyze note The storage engine for the table doesn't support analyze # Truncate without FLUSH ALTER TABLE t1 TRUNCATE PARTITION MAX; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc0_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -1020,7 +1020,6 @@ 2001 Second in MAX ALTER TABLE t1 ANALYZE PARTITION MAX; Table Op Msg_type Msg_text -MySQL_Test_DB.t1 analyze status Engine-independent statistics collected MySQL_Test_DB.t1 analyze status OK # Truncate without FLUSH ALTER TABLE t1 TRUNCATE PARTITION MAX; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -987,7 +987,6 @@ 2001 Second in MAX ALTER TABLE t1 ANALYZE PARTITION MAX; Table Op Msg_type Msg_text -mysql_test_db.t1 analyze status Engine-independent statistics collected mysql_test_db.t1 analyze status OK # Truncate without FLUSH ALTER TABLE t1 TRUNCATE PARTITION MAX; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_memory.result 2024-08-03 07:29:58.000000000 +0000 @@ -987,7 +987,6 @@ 2001 Second in MAX ALTER TABLE t1 ANALYZE PARTITION MAX; Table Op Msg_type Msg_text -mysql_test_db.t1 analyze status Engine-independent statistics collected mysql_test_db.t1 analyze note The storage engine for the table doesn't support analyze # Truncate without FLUSH ALTER TABLE t1 TRUNCATE PARTITION MAX; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_mgm_lc1_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -987,7 +987,6 @@ 2001 Second in MAX ALTER TABLE t1 ANALYZE PARTITION MAX; Table Op Msg_type Msg_text -mysql_test_db.t1 analyze status Engine-independent statistics collected mysql_test_db.t1 analyze status OK # Truncate without FLUSH ALTER TABLE t1 TRUNCATE PARTITION MAX; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_purge.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_purge.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_purge.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_purge.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,4 @@ -CREATE TABLE t1(f1 INT, f2 INT, INDEX(f1))ENGINE=InnoDB +CREATE TABLE t1(f1 INT, f2 INT, INDEX(f1))ENGINE=InnoDB STATS_PERSISTENT=0 PARTITION BY LIST(f1) ( PARTITION p1 VALUES in (1, 2, 3), PARTITION p2 VALUES in (4, 5, 6)); diff -Nru mariadb-10.11.6/mysql-test/suite/parts/r/partition_recover_myisam.result mariadb-10.11.9/mysql-test/suite/parts/r/partition_recover_myisam.result --- mariadb-10.11.6/mysql-test/suite/parts/r/partition_recover_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/r/partition_recover_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,6 @@ +call mtr.add_suppression("..test.t1_will_crash"); +call mtr.add_suppression("Got an error from unknown thread"); +call mtr.add_suppression("Table 't1_will_crash' is marked as crashed and should be repaired"); CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); FLUSH TABLES; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/alter_table.test mariadb-10.11.9/mysql-test/suite/parts/t/alter_table.test --- mariadb-10.11.6/mysql-test/suite/parts/t/alter_table.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/alter_table.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,12 +1,18 @@ # Permissions don't work with embedded --source include/not_embedded.inc + +# +# General bugs with ALTER TABLE and partitions that doesn't have to be run +# on all engines +# + --source include/have_partition.inc --source include/lcase_names.inc --source suite/parts/inc/engines.inc -# -# MDEV-22649 SIGSEGV in ha_partition::create_partitioning_metadata on ALTER -# +--echo # +--echo # MDEV-22649 SIGSEGV in ha_partition::create_partitioning_metadata on ALTER +--echo # set @save_alter_algorithm= @@session.alter_algorithm; SET SESSION alter_algorithm=4; @@ -18,18 +24,18 @@ set @@session.alter_algorithm= @save_alter_algorithm; -# -# MDEV-22804 SIGSEGV in ha_partition::create_partitioning_metadata | -# ERROR 1507 (HY000): Error in list of partitions to DROP -# +--echo # +--echo # MDEV-22804 SIGSEGV in ha_partition::create_partitioning_metadata | +--echo # ERROR 1507 (HY000): Error in list of partitions to DROP +--echo # CREATE TABLE t1 (a INT) PARTITION BY RANGE(a) SUBPARTITION BY HASH(a) (PARTITION p VALUES LESS THAN (5) (SUBPARTITION sp, SUBPARTITION sp1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION sp2, SUBPARTITION sp3)); ALTER TABLE t1 DROP PARTITION p; DROP TABLE if exists t1; -# -# MDEV-23357 Server crashes in Sql_cmd_alter_table_exchange_partition::exchange_partition -# +--echo # +--echo # MDEV-23357 Server crashes in Sql_cmd_alter_table_exchange_partition::exchange_partition +--echo # CREATE TABLE t1 (i INT); CREATE VIEW v1 as SELECT * FROM t1; CREATE TABLE t2 (i INT); @@ -38,6 +44,8 @@ DROP VIEW v1; DROP TABLE t1, t2; +--echo # End of 10.5 tests + --echo # --echo # MDEV-22165 CONVERT PARTITION: move in partition from existing table --echo # @@ -319,3 +327,5 @@ --connection default drop user u@localhost; drop database db; + +--echo # End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/mdev_21007.test mariadb-10.11.9/mysql-test/suite/parts/t/mdev_21007.test --- mariadb-10.11.6/mysql-test/suite/parts/t/mdev_21007.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/mdev_21007.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,9 @@ +--source include/have_partition.inc + +CREATE TABLE t1 (a INT) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (1), PARTITION p1 VALUES LESS THAN (MAXVALUE)); +INSERT INTO t1 VALUES (1),(2); +ALTER TABLE t1 MODIFY a INT AUTO_INCREMENT PRIMARY KEY; +UPDATE t1 PARTITION (p1) SET a=9 ORDER BY a LIMIT 1; + +# Cleanup +DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/mdev_24610.test mariadb-10.11.9/mysql-test/suite/parts/t/mdev_24610.test --- mariadb-10.11.6/mysql-test/suite/parts/t/mdev_24610.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/mdev_24610.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,22 @@ +--source include/have_innodb.inc +--source include/have_partition.inc + +CREATE TABLE t (c BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=MEMORY PARTITION BY KEY(); +INSERT INTO t VALUES (18446744073709551615); +select * from t; +drop table t; + +CREATE TABLE t (c BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=MEMORY; +INSERT INTO t VALUES (18446744073709551615); +ALTER TABLE t PARTITION BY KEY(); +INSERT INTO t VALUES (1); +select * from t; +drop table t; + +CREATE TABLE t (c BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY) ENGINE=MEMORY; +INSERT INTO t VALUES (18446744073709551615); +ALTER TABLE t PARTITION BY KEY(); +--error ER_AUTOINC_READ_FAILED +INSERT INTO t VALUES (NULL); +select * from t; +drop table t; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/partition_alter_innodb.test mariadb-10.11.9/mysql-test/suite/parts/t/partition_alter_innodb.test --- mariadb-10.11.6/mysql-test/suite/parts/t/partition_alter_innodb.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/partition_alter_innodb.test 2024-08-03 07:29:58.000000000 +0000 @@ -12,7 +12,8 @@ --echo # --echo # MDEV-28079 Shutdown hangs after altering innodb partition fts table --echo # -CREATE TABLE t1(f1 INT, f2 CHAR(100))ENGINE=InnoDB PARTITION BY HASH(f1) PARTITIONS 2; +CREATE TABLE t1(f1 INT, f2 CHAR(100))ENGINE=InnoDB STATS_PERSISTENT=0 +PARTITION BY HASH(f1) PARTITIONS 2; ALTER TABLE t1 ADD FULLTEXT(f2); --source ../innodb/include/wait_all_purged.inc DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/partition_alter_myisam.test mariadb-10.11.9/mysql-test/suite/parts/t/partition_alter_myisam.test --- mariadb-10.11.6/mysql-test/suite/parts/t/partition_alter_myisam.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/partition_alter_myisam.test 2024-08-03 07:29:58.000000000 +0000 @@ -22,3 +22,18 @@ alter online table t1 delay_key_write=0; alter online table t1 delay_key_write=1; drop table t1; + +--echo # +--echo # MDEV-25102 UNIQUE USING HASH error after ALTER ... DISABLE KEYS +--echo # +create table t1 (i1 int primary key, i2 int, d1 date, key(i2)) +partition by hash(i1) partitions 3; +insert into t1 values(0, 1, '2010-10-10'); +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +alter table t1 disable keys; +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +alter table t1 add partition (partition p4); +select index_name, comment from information_schema.statistics where table_schema='test' and table_name='t1'; +drop table t1; + +--echo # End of 10.11 tests diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/partition_purge.test mariadb-10.11.9/mysql-test/suite/parts/t/partition_purge.test --- mariadb-10.11.6/mysql-test/suite/parts/t/partition_purge.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/partition_purge.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ --source include/have_debug.inc --source include/have_debug_sync.inc -CREATE TABLE t1(f1 INT, f2 INT, INDEX(f1))ENGINE=InnoDB +CREATE TABLE t1(f1 INT, f2 INT, INDEX(f1))ENGINE=InnoDB STATS_PERSISTENT=0 PARTITION BY LIST(f1) ( PARTITION p1 VALUES in (1, 2, 3), PARTITION p2 VALUES in (4, 5, 6)); diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/partition_recover_myisam-master.opt mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam-master.opt --- mariadb-10.11.6/mysql-test/suite/parts/t/partition_recover_myisam-master.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam-master.opt 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ ---myisam-recover-options diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/partition_recover_myisam.opt mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam.opt --- mariadb-10.11.6/mysql-test/suite/parts/t/partition_recover_myisam.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--safe-mode diff -Nru mariadb-10.11.6/mysql-test/suite/parts/t/partition_recover_myisam.test mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam.test --- mariadb-10.11.6/mysql-test/suite/parts/t/partition_recover_myisam.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/parts/t/partition_recover_myisam.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,18 +1,10 @@ # test the auto-recover (--myisam-recover) of partitioned myisam tables ---disable_query_log call mtr.add_suppression("..test.t1_will_crash"); call mtr.add_suppression("Got an error from unknown thread"); call mtr.add_suppression("Table 't1_will_crash' is marked as crashed and should be repaired"); ---enable_query_log --source include/have_partition.inc ---disable_warnings ---disable_query_log -drop table if exists t1_will_crash; ---enable_query_log ---enable_warnings - CREATE TABLE t1_will_crash (a INT, KEY (a)) ENGINE=MyISAM; INSERT INTO t1_will_crash VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/include/memory_aggregate_load.inc mariadb-10.11.9/mysql-test/suite/perfschema/include/memory_aggregate_load.inc --- mariadb-10.11.6/mysql-test/suite/perfschema/include/memory_aggregate_load.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/include/memory_aggregate_load.inc 2024-08-03 07:29:58.000000000 +0000 @@ -274,7 +274,6 @@ execute dump_hosts; --disconnect con1 ---disconnect con5 --connection default @@ -283,6 +282,8 @@ select count(*) = 0 from performance_schema.threads where `TYPE`='FOREGROUND' and PROCESSLIST_USER= 'user1'; --source include/wait_condition.inc + +--disconnect con5 let $wait_condition= select count(*) = 1 from performance_schema.threads where `TYPE`='FOREGROUND' and PROCESSLIST_USER= 'user4'; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/include/pfs_running_event_scheduler.inc mariadb-10.11.9/mysql-test/suite/perfschema/include/pfs_running_event_scheduler.inc --- mariadb-10.11.6/mysql-test/suite/perfschema/include/pfs_running_event_scheduler.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/include/pfs_running_event_scheduler.inc 2024-08-03 07:29:58.000000000 +0000 @@ -1,10 +1,10 @@ -# threads are removed from: +# threads are added to: # - information_schema.processlist # - performance_schema.threads # at different times, so we may have to wait a little more -# for the event_scheduler to shutdown +# for the event_scheduler to start # let $wait_condition= SELECT COUNT(*) = 1 FROM performance_schema.threads - WHERE name like 'thread/sql/event%'; + WHERE name LIKE 'thread/sql/event%' AND processlist_command IS NOT NULL; --source include/wait_condition.inc diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/include/program_execution.inc mariadb-10.11.9/mysql-test/suite/perfschema/include/program_execution.inc --- mariadb-10.11.6/mysql-test/suite/perfschema/include/program_execution.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/include/program_execution.inc 2024-08-03 07:29:58.000000000 +0000 @@ -32,7 +32,7 @@ CREATE TABLE table_t(a INT); DELIMITER |; -CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND DO +CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND ON COMPLETION NOT PRESERVE DO BEGIN INSERT INTO table_t VALUES(1); END| diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/include/stage_setup.inc mariadb-10.11.9/mysql-test/suite/perfschema/include/stage_setup.inc --- mariadb-10.11.6/mysql-test/suite/perfschema/include/stage_setup.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/include/stage_setup.inc 2024-08-03 07:29:58.000000000 +0000 @@ -121,12 +121,23 @@ where thread_id = my_thread_id and nesting_event_id = my_statement_id order by event_id asc; - # Ignore query cache as it may not be enabled - select username, event_name, nesting_event_type - from performance_schema.events_stages_history - where thread_id = my_thread_id - and nesting_event_id = my_statement_id and - event_name not like "%query cache%" + # 1. Ignore query cache as it may not be enabled + # 2. MDL wait consists of short 1 second waits (this is not configurable) + # repeated until lock_wait_timeout is reached. The stage is changed + # to Waiting and back every second. To have predictable result here + # the query filters all sequences of X, "Waiting for MDL", X, + # leaving just X. + with h as ( + select event_id, username, event_name, nesting_event_type, + lag(event_name) over (order by event_id) = lead(event_name) over (order by event_id) + and event_name = "stage/sql/Waiting for stored function metadata lock" as v1, + lag(event_name, 2) over (order by event_id) = event_name + and lag(event_name, 1) over (order by event_id) = "stage/sql/Waiting for stored function metadata lock" as v2 + from performance_schema.events_stages_history + where thread_id = my_thread_id + and nesting_event_id = my_statement_id and + event_name not like "%query cache%" + ) select username, event_name, nesting_event_type from h where v1 is not true and v2 is not true order by event_id asc; end; else diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/alter_table_progress.result mariadb-10.11.9/mysql-test/suite/perfschema/r/alter_table_progress.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/alter_table_progress.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/alter_table_progress.result 2024-08-03 07:29:58.000000000 +0000 @@ -82,11 +82,10 @@ stage/sql/Rename result table NULL NULL stage/sql/End of update loop NULL NULL stage/sql/Query end NULL NULL -stage/sql/Commit NULL NULL stage/sql/closing tables NULL NULL stage/sql/Unlocking tables NULL NULL stage/sql/closing tables NULL NULL -stage/sql/Commit implicit NULL NULL +stage/sql/Query end NULL NULL stage/sql/Starting cleanup NULL NULL stage/sql/Freeing items NULL NULL stage/sql/Reset for next command NULL NULL diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/digest_view.result mariadb-10.11.9/mysql-test/suite/perfschema/r/digest_view.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/digest_view.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/digest_view.result 2024-08-03 07:29:58.000000000 +0000 @@ -191,17 +191,17 @@ FROM performance_schema.events_statements_summary_by_digest ORDER BY DIGEST_TEXT; SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR -test 8b1406618d34996cd11d1796438c78b5 EXPLAIN SELECT * FROM `test` . `v1` 1 -test 2c9e5d5b30d1690ba1a625afb4c42005 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1 -test 2265269dbe1b17d1f309a63b8e56933f EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1 -test 2df0babfc3c8ad27b4e3f99ad59bc938 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1 -test 8607297e7ffe77aa19a9d60812c5a8fd EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1 -test 9c94fee7865aa050201f6e67887fd0c8 SELECT * FROM `test` . `v1` 1 -test 7c856ddf7b57d65f8124f39e8b81882e SELECT * FROM `test` . `v1` WHERE `a` = ? 1 -test 994b14d068c24edd8fd61b2f03663be2 SELECT * FROM `test` . `v1` WHERE `b` > ? 1 -test b3102e1f51878e35936d7d3fe2901839 SELECT `a` , `b` FROM `test` . `v1` 1 -test cb300dd6358987c5afe1a2b0022fdea0 SELECT `b` , `a` FROM `test` . `v1` 1 -test 1b40b63f6a9dbffd146f0916fe4f5ed2 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 +test b69a5ddd08657692e23aa72d37dc15e0 EXPLAIN SELECT * FROM `test` . `v1` 1 +test 8c76fc18fe1711607640be2906e38f58 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1 +test 9bedc57de65e2ac25d67fcb6ccadb427 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1 +test 0539bbfdb016341a22d32fecb12c9882 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1 +test 3368b44e9d8b8cfb13b58f97a255d77f EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1 +test 2f619aeadc8bd993980ef9b4d12e4222 SELECT * FROM `test` . `v1` 1 +test b9a44c024c9d79de76f2ebcd2f208c4c SELECT * FROM `test` . `v1` WHERE `a` = ? 1 +test a3ccc4c3c79e853eaa17e3ceb7a24b30 SELECT * FROM `test` . `v1` WHERE `b` > ? 1 +test 9556566adc0953fccd8e2e35019287ed SELECT `a` , `b` FROM `test` . `v1` 1 +test fc937c99007b0976d19fb685b3bf9acc SELECT `b` , `a` FROM `test` . `v1` 1 +test a73dca7a09f45de04f1f4588f0a4e19f TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 DROP TABLE test.v1; CREATE VIEW test.v1 AS SELECT * FROM test.t1; EXPLAIN SELECT * from test.v1; @@ -248,19 +248,19 @@ FROM performance_schema.events_statements_summary_by_digest ORDER BY DIGEST_TEXT; SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR -test a68fd555281a14d2809c3105e9cb2c90 CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1 -test 4baff8f96e4b6ec6cdbfef5b9c7a8b12 DROP TABLE `test` . `v1` 1 -test 8b1406618d34996cd11d1796438c78b5 EXPLAIN SELECT * FROM `test` . `v1` 2 -test 2c9e5d5b30d1690ba1a625afb4c42005 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2 -test 2265269dbe1b17d1f309a63b8e56933f EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2 -test 2df0babfc3c8ad27b4e3f99ad59bc938 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2 -test 8607297e7ffe77aa19a9d60812c5a8fd EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2 -test 9c94fee7865aa050201f6e67887fd0c8 SELECT * FROM `test` . `v1` 2 -test 7c856ddf7b57d65f8124f39e8b81882e SELECT * FROM `test` . `v1` WHERE `a` = ? 2 -test 994b14d068c24edd8fd61b2f03663be2 SELECT * FROM `test` . `v1` WHERE `b` > ? 2 -test df38ce7f6e35972efe5a4ec57e48bf4d SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1 -test b3102e1f51878e35936d7d3fe2901839 SELECT `a` , `b` FROM `test` . `v1` 2 -test cb300dd6358987c5afe1a2b0022fdea0 SELECT `b` , `a` FROM `test` . `v1` 2 -test 1b40b63f6a9dbffd146f0916fe4f5ed2 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 +test 7f6c48fe072a231bc75d6d449978b9f5 CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1 +test c24db45ea4beed6ba2537ca6ea2d0484 DROP TABLE `test` . `v1` 1 +test b69a5ddd08657692e23aa72d37dc15e0 EXPLAIN SELECT * FROM `test` . `v1` 2 +test 8c76fc18fe1711607640be2906e38f58 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2 +test 9bedc57de65e2ac25d67fcb6ccadb427 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2 +test 0539bbfdb016341a22d32fecb12c9882 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2 +test 3368b44e9d8b8cfb13b58f97a255d77f EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2 +test 2f619aeadc8bd993980ef9b4d12e4222 SELECT * FROM `test` . `v1` 2 +test b9a44c024c9d79de76f2ebcd2f208c4c SELECT * FROM `test` . `v1` WHERE `a` = ? 2 +test a3ccc4c3c79e853eaa17e3ceb7a24b30 SELECT * FROM `test` . `v1` WHERE `b` > ? 2 +test 7b82ea9a7c1859f76abed712d2d4b14d SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1 +test 9556566adc0953fccd8e2e35019287ed SELECT `a` , `b` FROM `test` . `v1` 2 +test fc937c99007b0976d19fb685b3bf9acc SELECT `b` , `a` FROM `test` . `v1` 2 +test a73dca7a09f45de04f1f4588f0a4e19f TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1 DROP VIEW test.v1; DROP TABLE test.t1; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate.result 2024-08-03 07:29:58.000000000 +0000 @@ -251,35 +251,35 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 4 localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -383,7 +383,7 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 0 user2 localhost stage/sql/closing tables 0 user2 localhost stage/sql/init 0 @@ -395,7 +395,7 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 0 user2 stage/sql/closing tables 0 user2 stage/sql/init 0 @@ -407,21 +407,21 @@ localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -551,45 +551,45 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 8 localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -712,12 +712,12 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 0 user3 localhost stage/sql/closing tables 0 user3 localhost stage/sql/init 0 @@ -729,12 +729,12 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 0 user3 stage/sql/closing tables 0 user3 stage/sql/init 0 @@ -746,21 +746,21 @@ localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -909,55 +909,55 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 12 localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1099,17 +1099,17 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 0 user4 localhost stage/sql/closing tables 0 user4 localhost stage/sql/init 0 @@ -1121,17 +1121,17 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 0 user4 stage/sql/closing tables 0 user4 stage/sql/init 0 @@ -1143,21 +1143,21 @@ localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1325,65 +1325,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 24 +localhost stage/sql/starting 28 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1538,65 +1538,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 25 +localhost stage/sql/starting 29 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1751,65 +1751,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 26 +localhost stage/sql/starting 30 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1963,65 +1963,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 27 +localhost stage/sql/starting 31 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2174,65 +2174,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2386,65 +2386,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2597,65 +2597,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2808,65 +2808,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3019,65 +3019,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3230,65 +3230,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3441,65 +3441,65 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3674,43 +3674,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3907,21 +3907,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4125,14 +4125,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4343,7 +4343,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4554,7 +4554,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4765,7 +4765,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4976,7 +4976,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5187,7 +5187,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5398,7 +5398,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5609,7 +5609,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5820,7 +5820,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -6031,7 +6031,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -6242,7 +6242,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -6453,7 +6453,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -6636,7 +6636,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -6763,7 +6763,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -6862,7 +6862,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a.result 2024-08-03 07:29:58.000000000 +0000 @@ -235,28 +235,28 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 4 localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -350,7 +350,7 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 0 user2 stage/sql/closing tables 0 user2 stage/sql/init 0 @@ -362,21 +362,21 @@ localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -489,33 +489,33 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 8 localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -619,12 +619,12 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 0 user3 stage/sql/closing tables 0 user3 stage/sql/init 0 @@ -636,21 +636,21 @@ localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -773,38 +773,38 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 12 localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -918,17 +918,17 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 0 user4 stage/sql/closing tables 0 user4 stage/sql/init 0 @@ -940,21 +940,21 @@ localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1087,43 +1087,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 24 +localhost stage/sql/starting 28 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1243,43 +1243,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 25 +localhost stage/sql/starting 29 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1399,43 +1399,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 26 +localhost stage/sql/starting 30 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1554,43 +1554,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 27 +localhost stage/sql/starting 31 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1708,43 +1708,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1863,43 +1863,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2017,43 +2017,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2171,43 +2171,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2325,43 +2325,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2479,43 +2479,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2633,43 +2633,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2787,43 +2787,43 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star localhost stage/sql/checking permissions 16 localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2963,21 +2963,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3124,14 +3124,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3285,7 +3285,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3439,7 +3439,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3593,7 +3593,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3747,7 +3747,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3901,7 +3901,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4055,7 +4055,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4209,7 +4209,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4363,7 +4363,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4517,7 +4517,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4671,7 +4671,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4825,7 +4825,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4979,7 +4979,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -5105,7 +5105,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -5203,7 +5203,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -205,7 +205,7 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -214,14 +214,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -306,7 +306,7 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 0 user2 stage/sql/closing tables 0 user2 stage/sql/init 0 @@ -320,14 +320,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -431,12 +431,12 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -445,14 +445,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -547,12 +547,12 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 0 user3 stage/sql/closing tables 0 user3 stage/sql/init 0 @@ -566,14 +566,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -687,17 +687,17 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -706,14 +706,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -818,17 +818,17 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 0 user4 stage/sql/closing tables 0 user4 stage/sql/init 0 @@ -842,14 +842,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -973,22 +973,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -997,14 +997,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1115,22 +1115,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1139,14 +1139,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1257,22 +1257,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1281,14 +1281,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1398,22 +1398,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1422,14 +1422,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1538,22 +1538,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1562,14 +1562,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1679,22 +1679,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1703,14 +1703,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1819,22 +1819,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1843,14 +1843,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1959,22 +1959,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1983,14 +1983,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2099,22 +2099,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2123,14 +2123,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2239,22 +2239,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2263,14 +2263,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2379,22 +2379,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2403,14 +2403,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2519,22 +2519,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2543,14 +2543,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2683,14 +2683,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2823,14 +2823,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2970,7 +2970,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3110,7 +3110,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3250,7 +3250,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3390,7 +3390,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3530,7 +3530,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3670,7 +3670,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3810,7 +3810,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3950,7 +3950,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4090,7 +4090,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4230,7 +4230,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4370,7 +4370,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4510,7 +4510,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4622,7 +4622,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4706,7 +4706,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u.result 2024-08-03 07:29:58.000000000 +0000 @@ -219,21 +219,21 @@ localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -317,21 +317,21 @@ localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -427,21 +427,21 @@ localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -526,21 +526,21 @@ localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -637,21 +637,21 @@ localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -737,21 +737,21 @@ localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -849,21 +849,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 24 +localhost stage/sql/starting 28 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -948,21 +948,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 25 +localhost stage/sql/starting 29 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1047,21 +1047,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 26 +localhost stage/sql/starting 30 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1145,21 +1145,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 27 +localhost stage/sql/starting 31 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1242,21 +1242,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1340,21 +1340,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1437,21 +1437,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1534,21 +1534,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1631,21 +1631,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1728,21 +1728,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1825,21 +1825,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1922,21 +1922,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2019,21 +2019,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2123,14 +2123,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2227,7 +2227,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2324,7 +2324,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2421,7 +2421,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2518,7 +2518,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2615,7 +2615,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2712,7 +2712,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2809,7 +2809,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2906,7 +2906,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3003,7 +3003,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3100,7 +3100,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3197,7 +3197,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3294,7 +3294,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3391,7 +3391,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -3488,7 +3488,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_a_no_u_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -191,14 +191,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -275,14 +275,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -371,14 +371,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -456,14 +456,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -553,14 +553,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -639,14 +639,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -737,14 +737,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -822,14 +822,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -907,14 +907,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -991,14 +991,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1074,14 +1074,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1158,14 +1158,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1241,14 +1241,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1324,14 +1324,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1407,14 +1407,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1490,14 +1490,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1573,14 +1573,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1656,14 +1656,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1739,14 +1739,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1822,14 +1822,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1912,7 +1912,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -1995,7 +1995,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2078,7 +2078,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2161,7 +2161,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2244,7 +2244,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2327,7 +2327,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2410,7 +2410,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2493,7 +2493,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2576,7 +2576,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2659,7 +2659,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2742,7 +2742,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2825,7 +2825,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2908,7 +2908,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -2991,7 +2991,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -221,14 +221,14 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -237,14 +237,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -339,7 +339,7 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 0 user2 localhost stage/sql/closing tables 0 user2 localhost stage/sql/init 0 @@ -351,7 +351,7 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 0 user2 stage/sql/closing tables 0 user2 stage/sql/init 0 @@ -365,14 +365,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -493,24 +493,24 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -519,14 +519,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -640,12 +640,12 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 0 user3 localhost stage/sql/closing tables 0 user3 localhost stage/sql/init 0 @@ -657,12 +657,12 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 0 user3 stage/sql/closing tables 0 user3 stage/sql/init 0 @@ -676,14 +676,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -823,34 +823,34 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -859,14 +859,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -999,17 +999,17 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 0 user4 localhost stage/sql/closing tables 0 user4 localhost stage/sql/init 0 @@ -1021,17 +1021,17 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 0 user4 stage/sql/closing tables 0 user4 stage/sql/init 0 @@ -1045,14 +1045,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1211,44 +1211,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 6 +user1 stage/sql/starting 7 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1257,14 +1257,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1410,44 +1410,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 6 +user2 stage/sql/starting 7 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1456,14 +1456,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1609,44 +1609,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 6 +user3 stage/sql/starting 7 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1655,14 +1655,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1807,44 +1807,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 6 +user4 stage/sql/starting 7 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -1853,14 +1853,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2004,44 +2004,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2050,14 +2050,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2202,44 +2202,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2248,14 +2248,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2399,44 +2399,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2445,14 +2445,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2596,44 +2596,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2642,14 +2642,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2793,44 +2793,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -2839,14 +2839,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2990,44 +2990,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -3036,14 +3036,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3187,44 +3187,44 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star user1 stage/sql/checking permissions 4 user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -3233,14 +3233,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3406,22 +3406,22 @@ user1 stage/sql/closing tables 11 user1 stage/sql/init 3 user1 stage/sql/Opening tables 7 -user1 stage/sql/starting 7 +user1 stage/sql/starting 8 user2 stage/sql/checking permissions 4 user2 stage/sql/closing tables 10 user2 stage/sql/init 3 user2 stage/sql/Opening tables 6 -user2 stage/sql/starting 7 +user2 stage/sql/starting 8 user3 stage/sql/checking permissions 4 user3 stage/sql/closing tables 10 user3 stage/sql/init 3 user3 stage/sql/Opening tables 6 -user3 stage/sql/starting 7 +user3 stage/sql/starting 8 user4 stage/sql/checking permissions 4 user4 stage/sql/closing tables 10 user4 stage/sql/init 3 user4 stage/sql/Opening tables 6 -user4 stage/sql/starting 7 +user4 stage/sql/starting 8 execute dump_stages_host; host event_name count_star execute dump_stages_global; @@ -3430,14 +3430,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3627,14 +3627,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3824,14 +3824,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4028,7 +4028,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4225,7 +4225,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4422,7 +4422,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4619,7 +4619,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4816,7 +4816,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5013,7 +5013,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5210,7 +5210,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5407,7 +5407,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5604,7 +5604,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5801,7 +5801,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -5998,7 +5998,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -6167,7 +6167,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -6280,7 +6280,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -6365,7 +6365,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_u.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_u.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_u.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_u.result 2024-08-03 07:29:58.000000000 +0000 @@ -233,7 +233,7 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -242,21 +242,21 @@ localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -348,7 +348,7 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 0 user2 localhost stage/sql/closing tables 0 user2 localhost stage/sql/init 0 @@ -362,21 +362,21 @@ localhost stage/sql/closing tables 11 localhost stage/sql/init 3 localhost stage/sql/Opening tables 7 -localhost stage/sql/starting 6 +localhost stage/sql/starting 7 execute dump_stages_global; event_name count_star stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -487,12 +487,12 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -501,21 +501,21 @@ localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -617,12 +617,12 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 0 user3 localhost stage/sql/closing tables 0 user3 localhost stage/sql/init 0 @@ -636,21 +636,21 @@ localhost stage/sql/closing tables 21 localhost stage/sql/init 6 localhost stage/sql/Opening tables 13 -localhost stage/sql/starting 12 +localhost stage/sql/starting 14 execute dump_stages_global; event_name count_star stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -771,17 +771,17 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -790,21 +790,21 @@ localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -916,17 +916,17 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 0 user4 localhost stage/sql/closing tables 0 user4 localhost stage/sql/init 0 @@ -940,21 +940,21 @@ localhost stage/sql/closing tables 31 localhost stage/sql/init 9 localhost stage/sql/Opening tables 19 -localhost stage/sql/starting 18 +localhost stage/sql/starting 21 execute dump_stages_global; event_name count_star stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1085,22 +1085,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1109,21 +1109,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 24 +localhost stage/sql/starting 28 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1241,22 +1241,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1265,21 +1265,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 25 +localhost stage/sql/starting 29 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1397,22 +1397,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1421,21 +1421,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 26 +localhost stage/sql/starting 30 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1552,22 +1552,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1576,21 +1576,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 27 +localhost stage/sql/starting 31 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1706,22 +1706,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1730,21 +1730,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1861,22 +1861,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1885,21 +1885,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2015,22 +2015,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2039,21 +2039,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2169,22 +2169,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2193,21 +2193,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2323,22 +2323,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2347,21 +2347,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2477,22 +2477,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2501,21 +2501,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2631,22 +2631,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2655,21 +2655,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2809,21 +2809,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2963,21 +2963,21 @@ localhost stage/sql/closing tables 41 localhost stage/sql/init 12 localhost stage/sql/Opening tables 25 -localhost stage/sql/starting 28 +localhost stage/sql/starting 32 execute dump_stages_global; event_name count_star stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3124,14 +3124,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3285,7 +3285,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3439,7 +3439,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3593,7 +3593,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3747,7 +3747,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3901,7 +3901,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4055,7 +4055,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4209,7 +4209,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4363,7 +4363,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4517,7 +4517,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4671,7 +4671,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4825,7 +4825,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4951,7 +4951,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -5049,7 +5049,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -5147,7 +5147,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_u_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_u_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/event_aggregate_no_u_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/event_aggregate_no_u_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -203,7 +203,7 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -214,14 +214,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -304,7 +304,7 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 0 user2 localhost stage/sql/closing tables 0 user2 localhost stage/sql/init 0 @@ -320,14 +320,14 @@ stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 4 stage/sql/closing tables 11 stage/sql/init 3 stage/sql/Opening tables 7 -stage/sql/starting 6 +stage/sql/starting 7 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -429,12 +429,12 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -445,14 +445,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -545,12 +545,12 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 0 user3 localhost stage/sql/closing tables 0 user3 localhost stage/sql/init 0 @@ -566,14 +566,14 @@ stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 8 stage/sql/closing tables 21 stage/sql/init 6 stage/sql/Opening tables 13 -stage/sql/starting 12 +stage/sql/starting 14 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -685,17 +685,17 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -706,14 +706,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -816,17 +816,17 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 0 user4 localhost stage/sql/closing tables 0 user4 localhost stage/sql/init 0 @@ -842,14 +842,14 @@ stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 12 stage/sql/closing tables 31 stage/sql/init 9 stage/sql/Opening tables 19 -stage/sql/starting 18 +stage/sql/starting 21 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -971,22 +971,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 6 +user1 localhost stage/sql/starting 7 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -997,14 +997,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 24 +stage/sql/starting 28 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1113,22 +1113,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 6 +user2 localhost stage/sql/starting 7 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1139,14 +1139,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 25 +stage/sql/starting 29 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1255,22 +1255,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 6 +user3 localhost stage/sql/starting 7 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1281,14 +1281,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 26 +stage/sql/starting 30 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1396,22 +1396,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 6 +user4 localhost stage/sql/starting 7 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1422,14 +1422,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 27 +stage/sql/starting 31 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1536,22 +1536,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1562,14 +1562,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1677,22 +1677,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1703,14 +1703,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1817,22 +1817,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1843,14 +1843,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -1957,22 +1957,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -1983,14 +1983,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2097,22 +2097,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2123,14 +2123,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2237,22 +2237,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2263,14 +2263,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2377,22 +2377,22 @@ user1 localhost stage/sql/closing tables 11 user1 localhost stage/sql/init 3 user1 localhost stage/sql/Opening tables 7 -user1 localhost stage/sql/starting 7 +user1 localhost stage/sql/starting 8 user2 localhost stage/sql/checking permissions 4 user2 localhost stage/sql/closing tables 10 user2 localhost stage/sql/init 3 user2 localhost stage/sql/Opening tables 6 -user2 localhost stage/sql/starting 7 +user2 localhost stage/sql/starting 8 user3 localhost stage/sql/checking permissions 4 user3 localhost stage/sql/closing tables 10 user3 localhost stage/sql/init 3 user3 localhost stage/sql/Opening tables 6 -user3 localhost stage/sql/starting 7 +user3 localhost stage/sql/starting 8 user4 localhost stage/sql/checking permissions 4 user4 localhost stage/sql/closing tables 10 user4 localhost stage/sql/init 3 user4 localhost stage/sql/Opening tables 6 -user4 localhost stage/sql/starting 7 +user4 localhost stage/sql/starting 8 execute dump_stages_user; user event_name count_star execute dump_stages_host; @@ -2403,14 +2403,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2543,14 +2543,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2683,14 +2683,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2823,14 +2823,14 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_stages_history; event_name count(event_name) stage/sql/checking permissions 16 stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -2970,7 +2970,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3110,7 +3110,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3250,7 +3250,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3390,7 +3390,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3530,7 +3530,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3670,7 +3670,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3810,7 +3810,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -3950,7 +3950,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4090,7 +4090,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4230,7 +4230,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4370,7 +4370,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star user1 localhost statement/com/Error 0 @@ -4482,7 +4482,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4566,7 +4566,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; @@ -4650,7 +4650,7 @@ stage/sql/closing tables 41 stage/sql/init 12 stage/sql/Opening tables 25 -stage/sql/starting 28 +stage/sql/starting 32 execute dump_statements_account; user host event_name count_star execute dump_statements_user; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/max_program_zero.result mariadb-10.11.9/mysql-test/suite/perfschema/r/max_program_zero.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/max_program_zero.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/max_program_zero.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/mdl_func.result mariadb-10.11.9/mysql-test/suite/perfschema/r/mdl_func.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/mdl_func.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/mdl_func.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,4 @@ +# restart UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES'; UPDATE performance_schema.setup_instruments SET enabled = 'YES' WHERE name in ('wait/io/table/sql/handler', diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate.result 2024-08-03 07:29:58.000000000 +0000 @@ -2507,8 +2507,8 @@ HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS localhost 6 6 disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_32bit.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_32bit.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_32bit.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_32bit.result 2024-08-03 07:29:58.000000000 +0000 @@ -2507,8 +2507,8 @@ HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS localhost 6 6 disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a.result 2024-08-03 07:29:58.000000000 +0000 @@ -1903,8 +1903,8 @@ HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS localhost 6 6 disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -1653,8 +1653,8 @@ execute dump_hosts; HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u.result 2024-08-03 07:29:58.000000000 +0000 @@ -1343,8 +1343,8 @@ HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS localhost 6 6 disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_a_no_u_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -1093,8 +1093,8 @@ execute dump_hosts; HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -2257,8 +2257,8 @@ execute dump_hosts; HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_u.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_u.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_u.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_u.result 2024-08-03 07:29:58.000000000 +0000 @@ -1947,8 +1947,8 @@ HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS localhost 6 6 disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_u_no_h.result mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_u_no_h.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/memory_aggregate_no_u_no_h.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/memory_aggregate_no_u_no_h.result 2024-08-03 07:29:58.000000000 +0000 @@ -1697,8 +1697,8 @@ execute dump_hosts; HOST CURRENT_CONNECTIONS TOTAL_CONNECTIONS disconnect con1; -disconnect con5; connection default; +disconnect con5; "================== con1/con5 disconnected ==================" "================== Step 10 ==================" call dump_thread(); diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/misc.result mariadb-10.11.9/mysql-test/suite/perfschema/r/misc.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/misc.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/misc.result 2024-08-03 07:29:58.000000000 +0000 @@ -94,7 +94,7 @@ DROP TABLE t_60905; show global variables like "performance_schema_max_thread_instances"; Variable_name Value -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 explain select * from performance_schema.threads; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE threads ALL NULL NULL NULL NULL 256 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/misc_session_status.result mariadb-10.11.9/mysql-test/suite/perfschema/r/misc_session_status.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/misc_session_status.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/misc_session_status.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,20 @@ +# +# MDEV-33150 double-locking of LOCK_thd_kill in performance_schema.session_status +# +set @old_innodb_io_capacity=@@global.innodb_io_capacity; +set @old_innodb_io_capacity_max=@@global.innodb_io_capacity_max; +select * from performance_schema.session_status limit 0; +VARIABLE_NAME VARIABLE_VALUE +set max_session_mem_used=32768; +select * from performance_schema.session_status; +ERROR HY000: The MariaDB server is running with the --max-session-mem-used=32768 option so it cannot execute this statement +set global innodb_io_capacity_max=100; +Warnings: +Warning 1210 Setting innodb_io_capacity_max 100 lower than innodb_io_capacity 200. +Warning 1210 Setting innodb_io_capacity to 100 +set max_session_mem_used=default; +set global innodb_io_capacity=@old_innodb_io_capacity; +Warnings: +Warning 1210 Setting innodb_io_capacity to 200 higher than innodb_io_capacity_max 100 +Warning 1210 Setting innodb_max_io_capacity to 400 +set global innodb_io_capacity_max=@old_innodb_io_capacity_max; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/nesting.result mariadb-10.11.9/mysql-test/suite/perfschema/r/nesting.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/nesting.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/nesting.result 2024-08-03 07:29:58.000000000 +0000 @@ -127,10 +127,10 @@ 10 10 stage/sql/Optimizing (stage) STATEMENT 0 11 11 stage/sql/Executing (stage) STATEMENT 0 12 12 stage/sql/End of update loop (stage) STATEMENT 0 -13 13 stage/sql/Query end (stage) STATEMENT 0 -14 15 stage/sql/Commit (stage) STATEMENT 0 -15 15 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 14 -16 16 stage/sql/closing tables (stage) STATEMENT 0 +13 14 stage/sql/Query end (stage) STATEMENT 0 +14 14 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 13 +15 15 stage/sql/closing tables (stage) STATEMENT 0 +16 16 stage/sql/Query end (stage) STATEMENT 0 17 17 stage/sql/Starting cleanup (stage) STATEMENT 0 18 18 stage/sql/Freeing items (stage) STATEMENT 0 19 19 wait/io/socket/sql/client_connection send STATEMENT 0 @@ -151,10 +151,10 @@ 34 34 stage/sql/Optimizing (stage) STATEMENT 24 35 35 stage/sql/Executing (stage) STATEMENT 24 36 36 stage/sql/End of update loop (stage) STATEMENT 24 -37 37 stage/sql/Query end (stage) STATEMENT 24 -38 39 stage/sql/Commit (stage) STATEMENT 24 -39 39 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 38 -40 40 stage/sql/closing tables (stage) STATEMENT 24 +37 38 stage/sql/Query end (stage) STATEMENT 24 +38 38 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 37 +39 39 stage/sql/closing tables (stage) STATEMENT 24 +40 40 stage/sql/Query end (stage) STATEMENT 24 41 41 stage/sql/Starting cleanup (stage) STATEMENT 24 42 42 stage/sql/Freeing items (stage) STATEMENT 24 43 43 wait/io/socket/sql/client_connection send STATEMENT 24 @@ -175,10 +175,10 @@ 58 58 stage/sql/Optimizing (stage) STATEMENT 48 59 59 stage/sql/Executing (stage) STATEMENT 48 60 60 stage/sql/End of update loop (stage) STATEMENT 48 -61 61 stage/sql/Query end (stage) STATEMENT 48 -62 63 stage/sql/Commit (stage) STATEMENT 48 -63 63 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 62 -64 64 stage/sql/closing tables (stage) STATEMENT 48 +61 62 stage/sql/Query end (stage) STATEMENT 48 +62 62 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 61 +63 63 stage/sql/closing tables (stage) STATEMENT 48 +64 64 stage/sql/Query end (stage) STATEMENT 48 65 65 stage/sql/Starting cleanup (stage) STATEMENT 48 66 66 stage/sql/Freeing items (stage) STATEMENT 48 67 67 wait/io/socket/sql/client_connection send STATEMENT 48 @@ -202,10 +202,10 @@ 83 83 stage/sql/Optimizing (stage) STATEMENT 72 84 84 stage/sql/Executing (stage) STATEMENT 72 85 85 stage/sql/End of update loop (stage) STATEMENT 72 -86 86 stage/sql/Query end (stage) STATEMENT 72 -87 88 stage/sql/Commit (stage) STATEMENT 72 -88 88 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 87 -89 89 stage/sql/closing tables (stage) STATEMENT 72 +86 87 stage/sql/Query end (stage) STATEMENT 72 +87 87 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 86 +88 88 stage/sql/closing tables (stage) STATEMENT 72 +89 89 stage/sql/Query end (stage) STATEMENT 72 90 90 stage/sql/Starting cleanup (stage) STATEMENT 72 91 92 stage/sql/Freeing items (stage) STATEMENT 72 92 92 wait/io/socket/sql/client_connection send STAGE 91 @@ -221,10 +221,10 @@ 101 101 stage/sql/Optimizing (stage) STATEMENT 93 102 102 stage/sql/Executing (stage) STATEMENT 93 103 103 stage/sql/End of update loop (stage) STATEMENT 93 -104 104 stage/sql/Query end (stage) STATEMENT 93 -105 106 stage/sql/Commit (stage) STATEMENT 93 -106 106 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 105 -107 107 stage/sql/closing tables (stage) STATEMENT 93 +104 105 stage/sql/Query end (stage) STATEMENT 93 +105 105 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 104 +106 106 stage/sql/closing tables (stage) STATEMENT 93 +107 107 stage/sql/Query end (stage) STATEMENT 93 108 108 stage/sql/Starting cleanup (stage) STATEMENT 93 109 110 stage/sql/Freeing items (stage) STATEMENT 93 110 110 wait/io/socket/sql/client_connection send STAGE 109 @@ -238,10 +238,10 @@ 118 118 stage/sql/Optimizing (stage) STATEMENT 111 119 119 stage/sql/Executing (stage) STATEMENT 111 120 120 stage/sql/End of update loop (stage) STATEMENT 111 -121 121 stage/sql/Query end (stage) STATEMENT 111 -122 123 stage/sql/Commit (stage) STATEMENT 111 -123 123 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 122 -124 124 stage/sql/closing tables (stage) STATEMENT 111 +121 122 stage/sql/Query end (stage) STATEMENT 111 +122 122 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 121 +123 123 stage/sql/closing tables (stage) STATEMENT 111 +124 124 stage/sql/Query end (stage) STATEMENT 111 125 125 stage/sql/Starting cleanup (stage) STATEMENT 111 126 126 stage/sql/Freeing items (stage) STATEMENT 111 127 127 wait/io/socket/sql/client_connection send STATEMENT 111 @@ -262,10 +262,10 @@ 142 142 stage/sql/Optimizing (stage) STATEMENT 132 143 143 stage/sql/Executing (stage) STATEMENT 132 144 144 stage/sql/End of update loop (stage) STATEMENT 132 -145 145 stage/sql/Query end (stage) STATEMENT 132 -146 147 stage/sql/Commit (stage) STATEMENT 132 -147 147 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 146 -148 148 stage/sql/closing tables (stage) STATEMENT 132 +145 146 stage/sql/Query end (stage) STATEMENT 132 +146 146 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 145 +147 147 stage/sql/closing tables (stage) STATEMENT 132 +148 148 stage/sql/Query end (stage) STATEMENT 132 149 149 stage/sql/Starting cleanup (stage) STATEMENT 132 150 150 stage/sql/Freeing items (stage) STATEMENT 132 151 151 wait/io/socket/sql/client_connection send STATEMENT 132 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/ortho_iter.result mariadb-10.11.9/mysql-test/suite/perfschema/r/ortho_iter.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/ortho_iter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/ortho_iter.result 2024-08-03 07:29:58.000000000 +0000 @@ -237,7 +237,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -261,7 +261,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/privilege_table_io.result mariadb-10.11.9/mysql-test/suite/perfschema/r/privilege_table_io.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/privilege_table_io.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/privilege_table_io.result 2024-08-03 07:29:58.000000000 +0000 @@ -39,7 +39,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -63,7 +63,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/rpl_threads.result mariadb-10.11.9/mysql-test/suite/perfschema/r/rpl_threads.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/rpl_threads.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/rpl_threads.result 2024-08-03 07:29:58.000000000 +0000 @@ -58,4 +58,10 @@ from performance_schema.threads where PROCESSLIST_ID = @slave_sql_pid; NAME TYPE PROCESSLIST_COMMAND PROCESSLIST_STATE +# +# MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled +# +select variable_name, variable_value from performance_schema.status_by_thread +where variable_name like '%impossible%'; +variable_name variable_value include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/stage_mdl_global.result mariadb-10.11.9/mysql-test/suite/perfschema/r/stage_mdl_global.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/stage_mdl_global.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/stage_mdl_global.result 2024-08-03 07:29:58.000000000 +0000 @@ -10,10 +10,10 @@ username event_name nesting_event_type user1 stage/sql/starting STATEMENT user1 stage/sql/starting STATEMENT +user1 stage/sql/starting STATEMENT user1 stage/sql/Query end STATEMENT -user1 stage/sql/Commit STATEMENT user1 stage/sql/closing tables STATEMENT -user1 stage/sql/Commit implicit STATEMENT +user1 stage/sql/Query end STATEMENT user1 stage/sql/Starting cleanup STATEMENT user1 stage/sql/Freeing items STATEMENT user1 stage/sql/Reset for next command STATEMENT diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/stage_mdl_table.result mariadb-10.11.9/mysql-test/suite/perfschema/r/stage_mdl_table.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/stage_mdl_table.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/stage_mdl_table.result 2024-08-03 07:29:58.000000000 +0000 @@ -19,10 +19,10 @@ user1 stage/sql/Sending data STATEMENT user1 stage/sql/End of update loop STATEMENT user1 stage/sql/Query end STATEMENT -user1 stage/sql/Commit STATEMENT user1 stage/sql/closing tables STATEMENT user1 stage/sql/Unlocking tables STATEMENT user1 stage/sql/closing tables STATEMENT +user1 stage/sql/Query end STATEMENT user1 stage/sql/Starting cleanup STATEMENT user1 stage/sql/Freeing items STATEMENT user1 stage/sql/Reset for next command STATEMENT diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_idle.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_idle.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_idle.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_idle.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_stages.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_stages.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_stages.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_stages.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_statements.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_statements.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_statements.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_statements.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_transactions.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_transactions.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_transactions.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_transactions.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_waits.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_waits.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_disable_waits.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_disable_waits.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_innodb.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_innodb.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result 2024-08-03 07:29:58.000000000 +0000 @@ -8,5 +8,5 @@ #################################### SELECT event_name, digest, digest_text, sql_text FROM events_statements_history_long; event_name digest digest_text sql_text -statement/sql/select ca9181d6d668396d467dd974f58a9402 SELECT ? + ? + SELECT ... -statement/sql/truncate 4d2423d405bbcea8fa7bf9519c08dd8e TRUNCATE TABLE truncat... +statement/sql/select 142569e3e23dff2a0170a603ed79020a SELECT ? + ? + SELECT ... +statement/sql/truncate 5947880b8ba439f0ed3ff0bfbb04eebf TRUNCATE TABLE truncat... diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_low_index.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_index.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_low_index.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_index.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_low_table_lock.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_table_lock.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_low_table_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_low_table_lock.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 1 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_account.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_account.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_account.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_account.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_cond_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_cond_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_cond_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_cond_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 0 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_cond_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_file_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_file_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_file_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_file_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 0 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_file_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_file_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_file_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_file_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_host.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_host.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_host.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_host.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 0 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_index.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_index.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_index.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_index.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_mdl.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mdl.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_mdl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mdl.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_memory_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_memory_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_memory_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_memory_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mutex_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_mutex_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_prepared_stmts_instances.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_rwlock_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_rwlock_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_setup_actors.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 0 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_setup_objects.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 0 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_socket_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_socket_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_socket_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_socket_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_socket_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_stage_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stage_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_stage_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stage_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_stages_history.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stages_history.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_stages_history.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stages_history.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_stages_history_long.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_statement_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statement_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_statement_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statement_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_statements_history.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statements_history.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_statements_history.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statements_history.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_statements_history_long.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_hdl.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_table_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_table_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 0 performance_schema_max_table_lock_stat 0 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_table_lock.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_lock.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_table_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_table_lock.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 0 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_thread_class.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_thread_class.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_thread_class.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_thread_class.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 0 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_thread_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_transactions_history.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_transactions_history_long.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_user.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_user.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_user.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_user.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_waits_history.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_waits_history.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_waits_history.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_waits_history.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 0 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_no_waits_history_long.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_off.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_off.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_off.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_off.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_on.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_on.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_on.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_on.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_variables.result mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_variables.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/start_server_variables.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/start_server_variables.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 @@ -165,7 +165,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -188,7 +188,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/statement_program_lost_inst.result mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_lost_inst.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/statement_program_lost_inst.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_lost_inst.result 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ performance_schema_events_waits_history_size 10 performance_schema_hosts_size 100 performance_schema_max_cond_classes 90 -performance_schema_max_cond_instances 1000 +performance_schema_max_cond_instances 1500 performance_schema_max_digest_length 1024 performance_schema_max_file_classes 80 performance_schema_max_file_handles 32768 @@ -141,7 +141,7 @@ performance_schema_max_table_instances 500 performance_schema_max_table_lock_stat 500 performance_schema_max_thread_classes 50 -performance_schema_max_thread_instances 200 +performance_schema_max_thread_instances 400 performance_schema_session_connect_attrs_size 2048 performance_schema_setup_actors_size 100 performance_schema_setup_objects_size 100 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/statement_program_nesting_event_check.result mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_nesting_event_check.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/statement_program_nesting_event_check.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_nesting_event_check.result 2024-08-03 07:29:58.000000000 +0000 @@ -145,7 +145,7 @@ # Event SET GLOBAL event_scheduler=ON; CREATE TABLE table_t(a INT); -CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND DO +CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND ON COMPLETION NOT PRESERVE DO BEGIN INSERT INTO table_t VALUES(1); END| @@ -165,7 +165,7 @@ statement/sql/call_procedure CALL SampleProc2("Jwalamukhi",34) NULL NULL 0 statement/sql/call_procedure CALL SampleProc3() NULL NULL 0 statement/sql/call_procedure CALL SampleProc4() NULL NULL 0 -statement/sql/create_event CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND DO +statement/sql/create_event CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND ON COMPLETION NOT PRESERVE DO BEGIN INSERT INTO table_t VALUES(1); END NULL NULL 0 diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/statement_program_non_nested.result mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_non_nested.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/statement_program_non_nested.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/statement_program_non_nested.result 2024-08-03 07:29:58.000000000 +0000 @@ -145,7 +145,7 @@ # Event SET GLOBAL event_scheduler=ON; CREATE TABLE table_t(a INT); -CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND DO +CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND ON COMPLETION NOT PRESERVE DO BEGIN INSERT INTO table_t VALUES(1); END| @@ -182,7 +182,7 @@ statement/sql/call_procedure CALL SampleProc2("Jwalamukhi",34) stored_programs NULL NULL NULL NULL 0 statement/sql/call_procedure CALL SampleProc3() stored_programs NULL NULL NULL NULL 0 statement/sql/call_procedure CALL SampleProc4() stored_programs NULL NULL NULL NULL 0 -statement/sql/create_event CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND DO +statement/sql/create_event CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND ON COMPLETION NOT PRESERVE DO BEGIN INSERT INTO table_t VALUES(1); END stored_programs NULL NULL NULL NULL 0 @@ -553,7 +553,7 @@ # Event SET GLOBAL event_scheduler=ON; CREATE TABLE table_t(a INT); -CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND DO +CREATE EVENT e1 ON SCHEDULE EVERY 2 SECOND ON COMPLETION NOT PRESERVE DO BEGIN INSERT INTO table_t VALUES(1); END| diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/r/threads_history.result mariadb-10.11.9/mysql-test/suite/perfschema/r/threads_history.result --- mariadb-10.11.6/mysql-test/suite/perfschema/r/threads_history.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/r/threads_history.result 2024-08-03 07:29:58.000000000 +0000 @@ -24,27 +24,22 @@ global_instrumentation YES thread_instrumentation YES statements_digest YES -# Switch to (con1, localhost, user1, , ) connect con1, localhost, user1, , ; update performance_schema.threads set INSTRUMENTED='YES', HISTORY='YES' where PROCESSLIST_ID = connection_id(); -# Switch to (con2, localhost, user2, , ) connect con2, localhost, user2, , ; update performance_schema.threads set INSTRUMENTED='YES', HISTORY='NO' where PROCESSLIST_ID = connection_id(); -# Switch to (con3, localhost, user3, , ) connect con3, localhost, user3, , ; update performance_schema.threads set INSTRUMENTED='NO', HISTORY='YES' where PROCESSLIST_ID = connection_id(); -# Switch to (con4, localhost, user4, , ) connect con4, localhost, user4, , ; update performance_schema.threads set INSTRUMENTED='NO', HISTORY='NO' where PROCESSLIST_ID = connection_id(); -# Switch to connection default connection default; truncate table performance_schema.events_transactions_current; truncate table performance_schema.events_transactions_history; @@ -58,7 +53,6 @@ truncate table performance_schema.events_waits_current; truncate table performance_schema.events_waits_history; truncate table performance_schema.events_waits_history_long; -# Switch to connection con1 connection con1; XA START 'XA_CON1', 'XA_BQUAL', 12; select "Hi from con1"; @@ -67,7 +61,6 @@ XA END 'XA_CON1', 'XA_BQUAL', 12; XA PREPARE 'XA_CON1', 'XA_BQUAL', 12; XA COMMIT 'XA_CON1', 'XA_BQUAL', 12; -# Switch to connection con2 connection con2; XA START 'XA_CON2', 'XA_BQUAL', 12; select "Hi from con2"; @@ -76,7 +69,6 @@ XA END 'XA_CON2', 'XA_BQUAL', 12; XA PREPARE 'XA_CON2', 'XA_BQUAL', 12; XA COMMIT 'XA_CON2', 'XA_BQUAL', 12; -# Switch to connection con3 connection con3; XA START 'XA_CON3', 'XA_BQUAL', 12; select "Hi from con3"; @@ -85,7 +77,6 @@ XA END 'XA_CON3', 'XA_BQUAL', 12; XA PREPARE 'XA_CON3', 'XA_BQUAL', 12; XA COMMIT 'XA_CON3', 'XA_BQUAL', 12; -# Switch to connection con4 connection con4; XA START 'XA_CON4', 'XA_BQUAL', 12; select "Hi from con4"; @@ -95,88 +86,142 @@ XA PREPARE 'XA_CON4', 'XA_BQUAL', 12; XA COMMIT 'XA_CON4', 'XA_BQUAL', 12; connection default; -"=========================== Transactions user 1" +########################### Transactions user 1 - 1 +select /*1-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +where THREAD_ID = $con1_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON1 XA_BQUAL +select /*1-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history +where THREAD_ID = $con1_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON1 XA_BQUAL +select /*1-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history_long +where THREAD_ID = $con1_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON1 XA_BQUAL -"=========================== Transactions user 2" +########################### Transactions user 2 - 1 +select /*2-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +where THREAD_ID = $con2_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON2 XA_BQUAL +select /*2-1*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-1*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Transactions user 3" +########################### Transactions user 3 - 1 +select /*3-1*/ count(*) from performance_schema.events_transactions_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Transactions user 4" +########################### Transactions user 4 - 1 +select /*4-1*/ count(*) from performance_schema.events_transactions_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Statements user 1" +########################### Statements user 1 - 1 +select /*1-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_commit XA COMMIT 'XA_CON1', 'XA_BQUAL', 12 +select /*1-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_start XA START 'XA_CON1', 'XA_BQUAL', 12 statement/sql/select select "Hi from con1" statement/sql/xa_end XA END 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_prepare XA PREPARE 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_commit XA COMMIT 'XA_CON1', 'XA_BQUAL', 12 +select /*1-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history_long +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_start XA START 'XA_CON1', 'XA_BQUAL', 12 statement/sql/select select "Hi from con1" statement/sql/xa_end XA END 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_prepare XA PREPARE 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_commit XA COMMIT 'XA_CON1', 'XA_BQUAL', 12 -"=========================== Statements user 2" +########################### Statements user 2 - 1 +select /*2-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_commit XA COMMIT 'XA_CON2', 'XA_BQUAL', 12 +select /*2-1*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-1*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Statements user 3" +########################### Statements user 3 - 1 +select /*3-1*/ count(*) from performance_schema.events_statements_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Statements user 4" +########################### Statements user 4 - 1 +select /*4-1*/ count(*) from performance_schema.events_statements_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Stages user 1" +########################### Stages user 1 - 1 +select /*1-1*/ EVENT_NAME from performance_schema.events_stages_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME +select /*1-1*/ EVENT_NAME from performance_schema.events_stages_history +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command +select /*1-1*/ EVENT_NAME from performance_schema.events_stages_history_long +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command @@ -189,81 +234,122 @@ stage/sql/Executing stage/sql/End of update loop stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command -"=========================== Stages user 2" +########################### Stages user 2 - 1 +select /*2-1*/ EVENT_NAME from performance_schema.events_stages_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME +select /*2-1*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-1*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Stages user 3" +########################### Stages user 3 - 1 +select /*3-1*/ count(*) from performance_schema.events_stages_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Stages user 4" +########################### Stages user 4 - 1 +select /*4-1*/ count(*) from performance_schema.events_stages_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Waits user 1" +########################### Waits user 1 - 1 +select /*1-1*/ EVENT_NAME from performance_schema.events_waits_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME idle +select /*1-1*/ (count(*) > 5) as has_waits from performance_schema.events_waits_history +where THREAD_ID = $con1_thread_id; has_waits 1 +select /*1-1*/ (count(*) > 15) as has_waits from performance_schema.events_waits_history_long +where THREAD_ID = $con1_thread_id; has_waits 1 -"=========================== Waits user 2" +########################### Waits user 2 - 1 +select /*2-1*/ EVENT_NAME from performance_schema.events_waits_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME idle +select /*2-1*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-1*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Waits user 3" +########################### Waits user 3 - 1 +select /*3-1*/ count(*) from performance_schema.events_waits_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-1*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Waits user 4" +########################### Waits user 4 - 1 +select /*4-1*/ count(*) from performance_schema.events_waits_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-1*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -# Switch to connection default, disable consumers connection default; update performance_schema.setup_consumers set enabled='NO' where name like "%history%"; @@ -296,7 +382,6 @@ truncate table performance_schema.events_waits_current; truncate table performance_schema.events_waits_history; truncate table performance_schema.events_waits_history_long; -# Switch to connection con1 connection con1; XA START 'XA_CON1', 'XA_BQUAL', 12; select "Hi from con1"; @@ -305,7 +390,6 @@ XA END 'XA_CON1', 'XA_BQUAL', 12; XA PREPARE 'XA_CON1', 'XA_BQUAL', 12; XA COMMIT 'XA_CON1', 'XA_BQUAL', 12; -# Switch to connection con2 connection con2; XA START 'XA_CON2', 'XA_BQUAL', 12; select "Hi from con2"; @@ -314,7 +398,6 @@ XA END 'XA_CON2', 'XA_BQUAL', 12; XA PREPARE 'XA_CON2', 'XA_BQUAL', 12; XA COMMIT 'XA_CON2', 'XA_BQUAL', 12; -# Switch to connection con3 connection con3; XA START 'XA_CON3', 'XA_BQUAL', 12; select "Hi from con3"; @@ -323,7 +406,6 @@ XA END 'XA_CON3', 'XA_BQUAL', 12; XA PREPARE 'XA_CON3', 'XA_BQUAL', 12; XA COMMIT 'XA_CON3', 'XA_BQUAL', 12; -# Switch to connection con4 connection con4; XA START 'XA_CON4', 'XA_BQUAL', 12; select "Hi from con4"; @@ -333,117 +415,212 @@ XA PREPARE 'XA_CON4', 'XA_BQUAL', 12; XA COMMIT 'XA_CON4', 'XA_BQUAL', 12; connection default; -"=========================== Transactions user 1" +########################### Transactions user 1 - 2 +select /*1-2*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +where THREAD_ID = $con1_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON1 XA_BQUAL +select /*1-2*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con1_thread_id; count(*) 0 +select /*1-2*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con1_thread_id; count(*) 0 -"=========================== Transactions user 2" +########################### Transactions user 2 - 2 +select /*2-2*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +where THREAD_ID = $con2_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON2 XA_BQUAL +select /*2-2*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-2*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Transactions user 3" +########################### Transactions user 3 - 2 +select /*3-2*/ count(*) from performance_schema.events_transactions_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Transactions user 4" +########################### Transactions user 4 - 2 +select /*4-2*/ count(*) from performance_schema.events_transactions_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Statements user 1" +########################### Statements user 1 - 2 +select /*1-2*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_commit XA COMMIT 'XA_CON1', 'XA_BQUAL', 12 +select /*1-2*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con1_thread_id; count(*) 0 +select /*1-2*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con1_thread_id; count(*) 0 -"=========================== Statements user 2" +########################### Statements user 2 - 2 +select /*2-2*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_commit XA COMMIT 'XA_CON2', 'XA_BQUAL', 12 +select /*2-2*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-2*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Statements user 3" +########################### Statements user 3 - 2 +select /*3-2*/ count(*) from performance_schema.events_statements_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Statements user 4" +########################### Statements user 4 - 2 +select /*4-2*/ count(*) from performance_schema.events_statements_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Stages user 1" +########################### Stages user 1 - 2 +select /*1-2*/ EVENT_NAME from performance_schema.events_stages_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME +select /*1-2*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con1_thread_id; count(*) 0 +select /*1-2*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con1_thread_id; count(*) 0 -"=========================== Stages user 2" +########################### Stages user 2 - 2 +select /*2-2*/ EVENT_NAME from performance_schema.events_stages_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME +select /*2-2*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-2*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Stages user 3" +########################### Stages user 3 - 2 +select /*3-2*/ count(*) from performance_schema.events_stages_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Stages user 4" +########################### Stages user 4 - 2 +select /*4-2*/ count(*) from performance_schema.events_stages_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Waits user 1" +########################### Waits user 1 - 2 +select /*1-2*/ EVENT_NAME from performance_schema.events_waits_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME idle +select /*1-2*/ count(*) as has_waits from performance_schema.events_waits_history +where THREAD_ID = $con1_thread_id; has_waits 0 +select /*1-2*/ count(*) as has_waits from performance_schema.events_waits_history_long +where THREAD_ID = $con1_thread_id; has_waits 0 -"=========================== Waits user 2" +########################### Waits user 2 - 2 +select /*2-2*/ EVENT_NAME from performance_schema.events_waits_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME idle +select /*2-2*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-2*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Waits user 3" +########################### Waits user 3 - 2 +select /*3-2*/ count(*) from performance_schema.events_waits_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-2*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Waits user 4" +########################### Waits user 4 - 2 +select /*4-2*/ count(*) from performance_schema.events_waits_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-2*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -# Switch to connection default, enable consumers connection default; update performance_schema.setup_consumers set enabled='YES' where name like "%history%"; @@ -476,7 +653,6 @@ truncate table performance_schema.events_waits_current; truncate table performance_schema.events_waits_history; truncate table performance_schema.events_waits_history_long; -# Switch to connection con1 connection con1; XA START 'XA_CON1', 'XA_BQUAL', 12; select "Hi from con1"; @@ -485,7 +661,6 @@ XA END 'XA_CON1', 'XA_BQUAL', 12; XA PREPARE 'XA_CON1', 'XA_BQUAL', 12; XA COMMIT 'XA_CON1', 'XA_BQUAL', 12; -# Switch to connection con2 connection con2; XA START 'XA_CON2', 'XA_BQUAL', 12; select "Hi from con2"; @@ -494,7 +669,6 @@ XA END 'XA_CON2', 'XA_BQUAL', 12; XA PREPARE 'XA_CON2', 'XA_BQUAL', 12; XA COMMIT 'XA_CON2', 'XA_BQUAL', 12; -# Switch to connection con3 connection con3; XA START 'XA_CON3', 'XA_BQUAL', 12; select "Hi from con3"; @@ -503,7 +677,6 @@ XA END 'XA_CON3', 'XA_BQUAL', 12; XA PREPARE 'XA_CON3', 'XA_BQUAL', 12; XA COMMIT 'XA_CON3', 'XA_BQUAL', 12; -# Switch to connection con4 connection con4; XA START 'XA_CON4', 'XA_BQUAL', 12; select "Hi from con4"; @@ -513,88 +686,142 @@ XA PREPARE 'XA_CON4', 'XA_BQUAL', 12; XA COMMIT 'XA_CON4', 'XA_BQUAL', 12; connection default; -"=========================== Transactions user 1" +########################### Transactions user 1 - 3 +select /*1-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +where THREAD_ID = $con1_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON1 XA_BQUAL +select /*1-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history +where THREAD_ID = $con1_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON1 XA_BQUAL +select /*1-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history_long +where THREAD_ID = $con1_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON1 XA_BQUAL -"=========================== Transactions user 2" +########################### Transactions user 2 - 3 +select /*2-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +where THREAD_ID = $con2_thread_id; XID_FORMAT_ID XID_GTRID XID_BQUAL 12 XA_CON2 XA_BQUAL +select /*2-3*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-3*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Transactions user 3" +########################### Transactions user 3 - 3 +select /*3-3*/ count(*) from performance_schema.events_transactions_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Transactions user 4" +########################### Transactions user 4 - 3 +select /*4-3*/ count(*) from performance_schema.events_transactions_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_transactions_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_transactions_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Statements user 1" +########################### Statements user 1 - 3 +select /*1-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_commit XA COMMIT 'XA_CON1', 'XA_BQUAL', 12 +select /*1-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_start XA START 'XA_CON1', 'XA_BQUAL', 12 statement/sql/select select "Hi from con1" statement/sql/xa_end XA END 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_prepare XA PREPARE 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_commit XA COMMIT 'XA_CON1', 'XA_BQUAL', 12 +select /*1-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history_long +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_start XA START 'XA_CON1', 'XA_BQUAL', 12 statement/sql/select select "Hi from con1" statement/sql/xa_end XA END 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_prepare XA PREPARE 'XA_CON1', 'XA_BQUAL', 12 statement/sql/xa_commit XA COMMIT 'XA_CON1', 'XA_BQUAL', 12 -"=========================== Statements user 2" +########################### Statements user 2 - 3 +select /*2-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME SQL_TEXT statement/sql/xa_commit XA COMMIT 'XA_CON2', 'XA_BQUAL', 12 +select /*2-3*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-3*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Statements user 3" +########################### Statements user 3 - 3 +select /*3-3*/ count(*) from performance_schema.events_statements_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Statements user 4" +########################### Statements user 4 - 3 +select /*4-3*/ count(*) from performance_schema.events_statements_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_statements_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_statements_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Stages user 1" +########################### Stages user 1 - 3 +select /*1-3*/ EVENT_NAME from performance_schema.events_stages_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME +select /*1-3*/ EVENT_NAME from performance_schema.events_stages_history +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command +select /*1-3*/ EVENT_NAME from performance_schema.events_stages_history_long +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command @@ -607,81 +834,122 @@ stage/sql/Executing stage/sql/End of update loop stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command stage/sql/starting stage/sql/Query end -stage/sql/Commit stage/sql/closing tables +stage/sql/Query end stage/sql/Starting cleanup stage/sql/Freeing items stage/sql/Reset for next command -"=========================== Stages user 2" +########################### Stages user 2 - 3 +select /*2-3*/ EVENT_NAME from performance_schema.events_stages_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME +select /*2-3*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-3*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Stages user 3" +########################### Stages user 3 - 3 +select /*3-3*/ count(*) from performance_schema.events_stages_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Stages user 4" +########################### Stages user 4 - 3 +select /*4-3*/ count(*) from performance_schema.events_stages_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_stages_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_stages_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -"=========================== Waits user 1" +########################### Waits user 1 - 3 +select /*1-3*/ EVENT_NAME from performance_schema.events_waits_current +where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME idle +select /*1-3*/ (count(*) > 5) as has_waits from performance_schema.events_waits_history +where THREAD_ID = $con1_thread_id; has_waits 1 +select /*1-3*/ (count(*) > 15) as has_waits from performance_schema.events_waits_history_long +where THREAD_ID = $con1_thread_id; has_waits 1 -"=========================== Waits user 2" +########################### Waits user 2 - 3 +select /*2-3*/ EVENT_NAME from performance_schema.events_waits_current +where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; EVENT_NAME idle +select /*2-3*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con2_thread_id; count(*) 0 +select /*2-3*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con2_thread_id; count(*) 0 -"=========================== Waits user 3" +########################### Waits user 3 - 3 +select /*3-3*/ count(*) from performance_schema.events_waits_current +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con3_thread_id; count(*) 0 +select /*3-3*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con3_thread_id; count(*) 0 -"=========================== Waits user 4" +########################### Waits user 4 - 3 +select /*4-3*/ count(*) from performance_schema.events_waits_current +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_waits_history +where THREAD_ID = $con4_thread_id; count(*) 0 +select /*4-3*/ count(*) from performance_schema.events_waits_history_long +where THREAD_ID = $con4_thread_id; count(*) 0 -# Switch to connection default connection default; revoke all privileges, grant option from user1@localhost; revoke all privileges, grant option from user2@localhost; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/bad_option.test mariadb-10.11.9/mysql-test/suite/perfschema/t/bad_option.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/bad_option.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/bad_option.test 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ let SEARCH_FILE= $error_log; # Stop the server let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --shutdown_server --source include/wait_until_disconnected.inc --error 7 @@ -62,7 +62,7 @@ --remove_file $error_log # Write file to make mysql-test-run.pl start up the server again ---exec echo "restart" > $restart_file +--write_line restart $restart_file # Turn on reconnect --enable_reconnect diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/mdl_func.test mariadb-10.11.9/mysql-test/suite/perfschema/t/mdl_func.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/mdl_func.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/mdl_func.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,7 +1,11 @@ --source include/not_embedded.inc --source include/have_perfschema.inc -# This test fails very frequently on a Windows builder. ---source include/not_windows.inc +# This test needs a fresh restart. The table performance_schema.table_handles +# can otherwise contain extra rows left from previous testcases. +# For example the test case main.long_unique_delayed, which uses +# INSERT DELAYED, will leave extra rows in this table if run just before this +# test, causing .result diff failure. +--source include/restart_mysqld.inc UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'YES'; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/misc.test mariadb-10.11.9/mysql-test/suite/perfschema/t/misc.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/misc.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/misc.test 2024-08-03 07:29:58.000000000 +0000 @@ -175,6 +175,7 @@ # show global variables like "performance_schema_max_thread_instances"; +replace_result 512 256; explain select * from performance_schema.threads; # diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/misc_session_status.test mariadb-10.11.9/mysql-test/suite/perfschema/t/misc_session_status.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/misc_session_status.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/misc_session_status.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,20 @@ +--source include/not_embedded.inc +--source include/have_perfschema.inc +# This does not crash on 32 bit because of less memory used +--source include/have_64bit.inc +--echo # +--echo # MDEV-33150 double-locking of LOCK_thd_kill in performance_schema.session_status +--echo # +source include/have_innodb.inc; +set @old_innodb_io_capacity=@@global.innodb_io_capacity; +set @old_innodb_io_capacity_max=@@global.innodb_io_capacity_max; +select * from performance_schema.session_status limit 0; # discover the table +set max_session_mem_used=32768; +--error ER_OPTION_PREVENTS_STATEMENT +# this used to crash, when OOM happened under LOCK_thd_kill +select * from performance_schema.session_status; +# this used to cause mutex lock order violation when OOM happened under LOCK_global_system_variables +set global innodb_io_capacity_max=100; +set max_session_mem_used=default; +set global innodb_io_capacity=@old_innodb_io_capacity; +set global innodb_io_capacity_max=@old_innodb_io_capacity_max; diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/processlist_57.test mariadb-10.11.9/mysql-test/suite/perfschema/t/processlist_57.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/processlist_57.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/processlist_57.test 2024-08-03 07:29:58.000000000 +0000 @@ -23,7 +23,7 @@ SHOW CREATE TABLE performance_schema.processlist; let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --echo ## --echo ## Server shutdown --echo ## @@ -93,7 +93,7 @@ --error ER_BAD_FIELD_ERROR SHOW PROCESSLIST; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --echo ## --echo ## Server shutdown --echo ## @@ -166,7 +166,7 @@ # Works and returns no data, innodb table is empty. SHOW PROCESSLIST; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --echo ## --echo ## Server shutdown --echo ## @@ -231,7 +231,7 @@ # Works and returns no data, innodb table is empty. SHOW PROCESSLIST; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --echo ## --echo ## Server shutdown --echo ## @@ -306,7 +306,7 @@ --replace_column 3 [HOST:PORT] 6 [TIME] SHOW PROCESSLIST; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --echo ## --echo ## Server shutdown --echo ## diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/rpl_threads.test mariadb-10.11.9/mysql-test/suite/perfschema/t/rpl_threads.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/rpl_threads.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/rpl_threads.test 2024-08-03 07:29:58.000000000 +0000 @@ -81,5 +81,11 @@ from performance_schema.threads where PROCESSLIST_ID = @slave_sql_pid; +--echo # +--echo # MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled +--echo # +select variable_name, variable_value from performance_schema.status_by_thread +where variable_name like '%impossible%'; # should not crash + --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/setup_instruments_defaults.test mariadb-10.11.9/mysql-test/suite/perfschema/t/setup_instruments_defaults.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/setup_instruments_defaults.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/setup_instruments_defaults.test 2024-08-03 07:29:58.000000000 +0000 @@ -69,7 +69,7 @@ WHERE name like "%wait/io/table/sql/handler%"; # Write file to make mysql-test-run.pl wait for the server to stop ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Restart the server --echo # @@ -79,7 +79,7 @@ --echo # Restart server with wait/io/table/sql/handler disabled ---exec echo "restart:--loose-performance-schema-instrument=%wait/io/table/sql/%=off" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line "restart:--loose-performance-schema-instrument=%wait/io/table/sql/%=off" $MYSQLTEST_VARDIR/tmp/mysqld.1.expect # Turn on reconnect --echo # Enable reconnect diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/statement_program_lost_inst.test mariadb-10.11.9/mysql-test/suite/perfschema/t/statement_program_lost_inst.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/statement_program_lost_inst.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/statement_program_lost_inst.test 2024-08-03 07:29:58.000000000 +0000 @@ -19,10 +19,10 @@ --source include/have_perfschema.inc let $restart_file= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect; ---exec echo "wait" > $restart_file +--write_line wait $restart_file --shutdown_server --source include/wait_until_disconnected.inc ---exec echo "restart:--performance_schema_max_program_instances=7 --performance_schema_max_statement_stack=2 --thread_stack=655360">$restart_file +--write_line "restart:--performance_schema_max_program_instances=7 --performance_schema_max_statement_stack=2 --thread_stack=655360" $restart_file --enable_reconnect --source include/wait_until_connected_again.inc diff -Nru mariadb-10.11.6/mysql-test/suite/perfschema/t/threads_history.test mariadb-10.11.9/mysql-test/suite/perfschema/t/threads_history.test --- mariadb-10.11.6/mysql-test/suite/perfschema/t/threads_history.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/perfschema/t/threads_history.test 2024-08-03 07:29:58.000000000 +0000 @@ -23,7 +23,6 @@ select * from performance_schema.setup_consumers; ---echo # Switch to (con1, localhost, user1, , ) connect (con1, localhost, user1, , ); update performance_schema.threads @@ -33,7 +32,6 @@ let $con1_thread_id= `select THREAD_ID from performance_schema.threads where PROCESSLIST_ID = connection_id()`; ---echo # Switch to (con2, localhost, user2, , ) connect (con2, localhost, user2, , ); update performance_schema.threads @@ -43,7 +41,6 @@ let $con2_thread_id= `select THREAD_ID from performance_schema.threads where PROCESSLIST_ID = connection_id()`; ---echo # Switch to (con3, localhost, user3, , ) connect (con3, localhost, user3, , ); update performance_schema.threads @@ -53,7 +50,6 @@ let $con3_thread_id= `select THREAD_ID from performance_schema.threads where PROCESSLIST_ID = connection_id()`; ---echo # Switch to (con4, localhost, user4, , ) connect (con4, localhost, user4, , ); update performance_schema.threads @@ -63,7 +59,6 @@ let $con4_thread_id= `select THREAD_ID from performance_schema.threads where PROCESSLIST_ID = connection_id()`; ---echo # Switch to connection default --connection default truncate table performance_schema.events_transactions_current; @@ -79,7 +74,6 @@ truncate table performance_schema.events_waits_history; truncate table performance_schema.events_waits_history_long; ---echo # Switch to connection con1 --connection con1 XA START 'XA_CON1', 'XA_BQUAL', 12; @@ -88,7 +82,6 @@ XA PREPARE 'XA_CON1', 'XA_BQUAL', 12; XA COMMIT 'XA_CON1', 'XA_BQUAL', 12; ---echo # Switch to connection con2 --connection con2 XA START 'XA_CON2', 'XA_BQUAL', 12; @@ -97,7 +90,6 @@ XA PREPARE 'XA_CON2', 'XA_BQUAL', 12; XA COMMIT 'XA_CON2', 'XA_BQUAL', 12; ---echo # Switch to connection con3 --connection con3 XA START 'XA_CON3', 'XA_BQUAL', 12; @@ -106,7 +98,6 @@ XA PREPARE 'XA_CON3', 'XA_BQUAL', 12; XA COMMIT 'XA_CON3', 'XA_BQUAL', 12; ---echo # Switch to connection con4 --connection con4 XA START 'XA_CON4', 'XA_BQUAL', 12; @@ -117,165 +108,150 @@ --connection default ---disable_query_log +echo ########################### Transactions user 1 - 1; -echo "=========================== Transactions user 1"; - -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +evalp select /*1-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current where THREAD_ID = $con1_thread_id; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history +evalp select /*1-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history where THREAD_ID = $con1_thread_id; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history_long +evalp select /*1-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Transactions user 2"; +echo ########################### Transactions user 2 - 1; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +evalp select /*2-1*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*2-1*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*2-1*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Transactions user 3"; +echo ########################### Transactions user 3 - 1; -eval select count(*) from performance_schema.events_transactions_current +evalp select /*3-1*/ count(*) from performance_schema.events_transactions_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*3-1*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*3-1*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Transactions user 4"; +echo ########################### Transactions user 4 - 1; -eval select count(*) from performance_schema.events_transactions_current +evalp select /*4-1*/ count(*) from performance_schema.events_transactions_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*4-1*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*4-1*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Statements user 1"; +echo ########################### Statements user 1 - 1; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history_long - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; +evalp select /*1-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history_long + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; -echo "=========================== Statements user 2"; +echo ########################### Statements user 2 - 1; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_statements_history +evalp select /*2-1*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-1*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*2-1*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Statements user 3"; +echo ########################### Statements user 3 - 1; -eval select count(*) from performance_schema.events_statements_current +evalp select /*3-1*/ count(*) from performance_schema.events_statements_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_statements_history +evalp select /*3-1*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*3-1*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Statements user 4"; +echo ########################### Statements user 4 - 1; -eval select count(*) from performance_schema.events_statements_current +evalp select /*4-1*/ count(*) from performance_schema.events_statements_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_statements_history +evalp select /*4-1*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*4-1*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Stages user 1"; +echo ########################### Stages user 1 - 1; -eval select EVENT_NAME from performance_schema.events_stages_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME from performance_schema.events_stages_history - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME from performance_schema.events_stages_history_long - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; +evalp select /*1-1*/ EVENT_NAME from performance_schema.events_stages_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-1*/ EVENT_NAME from performance_schema.events_stages_history + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-1*/ EVENT_NAME from performance_schema.events_stages_history_long + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; -echo "=========================== Stages user 2"; +echo ########################### Stages user 2 - 1; -eval select EVENT_NAME from performance_schema.events_stages_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_stages_history +evalp select /*2-1*/ EVENT_NAME from performance_schema.events_stages_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-1*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*2-1*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Stages user 3"; +echo ########################### Stages user 3 - 1; -eval select count(*) from performance_schema.events_stages_current +evalp select /*3-1*/ count(*) from performance_schema.events_stages_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_stages_history +evalp select /*3-1*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*3-1*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Stages user 4"; +echo ########################### Stages user 4 - 1; -eval select count(*) from performance_schema.events_stages_current +evalp select /*4-1*/ count(*) from performance_schema.events_stages_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_stages_history +evalp select /*4-1*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*4-1*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Waits user 1"; +echo ########################### Waits user 1 - 1; -eval select EVENT_NAME from performance_schema.events_waits_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select (count(*) > 5) as has_waits from performance_schema.events_waits_history +evalp select /*1-1*/ EVENT_NAME from performance_schema.events_waits_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-1*/ (count(*) > 5) as has_waits from performance_schema.events_waits_history where THREAD_ID = $con1_thread_id; -eval select (count(*) > 15) as has_waits from performance_schema.events_waits_history_long +evalp select /*1-1*/ (count(*) > 15) as has_waits from performance_schema.events_waits_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Waits user 2"; +echo ########################### Waits user 2 - 1; -eval select EVENT_NAME from performance_schema.events_waits_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_waits_history +evalp select /*2-1*/ EVENT_NAME from performance_schema.events_waits_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-1*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*2-1*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Waits user 3"; +echo ########################### Waits user 3 - 1; -eval select count(*) from performance_schema.events_waits_current +evalp select /*3-1*/ count(*) from performance_schema.events_waits_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_waits_history +evalp select /*3-1*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*3-1*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Waits user 4"; +echo ########################### Waits user 4 - 1; -eval select count(*) from performance_schema.events_waits_current +evalp select /*4-1*/ count(*) from performance_schema.events_waits_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_waits_history +evalp select /*4-1*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*4-1*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con4_thread_id; ---enable_query_log - ---echo # Switch to connection default, disable consumers --connection default update performance_schema.setup_consumers @@ -296,7 +272,6 @@ truncate table performance_schema.events_waits_history; truncate table performance_schema.events_waits_history_long; ---echo # Switch to connection con1 --connection con1 XA START 'XA_CON1', 'XA_BQUAL', 12; @@ -305,7 +280,6 @@ XA PREPARE 'XA_CON1', 'XA_BQUAL', 12; XA COMMIT 'XA_CON1', 'XA_BQUAL', 12; ---echo # Switch to connection con2 --connection con2 XA START 'XA_CON2', 'XA_BQUAL', 12; @@ -314,7 +288,6 @@ XA PREPARE 'XA_CON2', 'XA_BQUAL', 12; XA COMMIT 'XA_CON2', 'XA_BQUAL', 12; ---echo # Switch to connection con3 --connection con3 XA START 'XA_CON3', 'XA_BQUAL', 12; @@ -323,7 +296,6 @@ XA PREPARE 'XA_CON3', 'XA_BQUAL', 12; XA COMMIT 'XA_CON3', 'XA_BQUAL', 12; ---echo # Switch to connection con4 --connection con4 XA START 'XA_CON4', 'XA_BQUAL', 12; @@ -334,161 +306,150 @@ --connection default ---disable_query_log - -echo "=========================== Transactions user 1"; +echo ########################### Transactions user 1 - 2; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +evalp select /*1-2*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current where THREAD_ID = $con1_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*1-2*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con1_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*1-2*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Transactions user 2"; +echo ########################### Transactions user 2 - 2; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +evalp select /*2-2*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*2-2*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*2-2*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Transactions user 3"; +echo ########################### Transactions user 3 - 2; -eval select count(*) from performance_schema.events_transactions_current +evalp select /*3-2*/ count(*) from performance_schema.events_transactions_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*3-2*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*3-2*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Transactions user 4"; +echo ########################### Transactions user 4 - 2; -eval select count(*) from performance_schema.events_transactions_current +evalp select /*4-2*/ count(*) from performance_schema.events_transactions_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*4-2*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*4-2*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Statements user 1"; +echo ########################### Statements user 1 - 2; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_statements_history +evalp select /*1-2*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-2*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con1_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*1-2*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Statements user 2"; +echo ########################### Statements user 2 - 2; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_statements_history +evalp select /*2-2*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-2*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*2-2*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Statements user 3"; +echo ########################### Statements user 3 - 2; -eval select count(*) from performance_schema.events_statements_current +evalp select /*3-2*/ count(*) from performance_schema.events_statements_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_statements_history +evalp select /*3-2*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*3-2*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Statements user 4"; +echo ########################### Statements user 4 - 2; -eval select count(*) from performance_schema.events_statements_current +evalp select /*4-2*/ count(*) from performance_schema.events_statements_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_statements_history +evalp select /*4-2*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*4-2*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Stages user 1"; +echo ########################### Stages user 1 - 2; -eval select EVENT_NAME from performance_schema.events_stages_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_stages_history +evalp select /*1-2*/ EVENT_NAME from performance_schema.events_stages_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-2*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con1_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*1-2*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Stages user 2"; +echo ########################### Stages user 2 - 2; -eval select EVENT_NAME from performance_schema.events_stages_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_stages_history +evalp select /*2-2*/ EVENT_NAME from performance_schema.events_stages_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-2*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*2-2*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Stages user 3"; +echo ########################### Stages user 3 - 2; -eval select count(*) from performance_schema.events_stages_current +evalp select /*3-2*/ count(*) from performance_schema.events_stages_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_stages_history +evalp select /*3-2*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*3-2*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Stages user 4"; +echo ########################### Stages user 4 - 2; -eval select count(*) from performance_schema.events_stages_current +evalp select /*4-2*/ count(*) from performance_schema.events_stages_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_stages_history +evalp select /*4-2*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*4-2*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Waits user 1"; +echo ########################### Waits user 1 - 2; -eval select EVENT_NAME from performance_schema.events_waits_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) as has_waits from performance_schema.events_waits_history +evalp select /*1-2*/ EVENT_NAME from performance_schema.events_waits_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-2*/ count(*) as has_waits from performance_schema.events_waits_history where THREAD_ID = $con1_thread_id; -eval select count(*) as has_waits from performance_schema.events_waits_history_long +evalp select /*1-2*/ count(*) as has_waits from performance_schema.events_waits_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Waits user 2"; +echo ########################### Waits user 2 - 2; -eval select EVENT_NAME from performance_schema.events_waits_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_waits_history +evalp select /*2-2*/ EVENT_NAME from performance_schema.events_waits_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-2*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*2-2*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Waits user 3"; +echo ########################### Waits user 3 - 2; -eval select count(*) from performance_schema.events_waits_current +evalp select /*3-2*/ count(*) from performance_schema.events_waits_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_waits_history +evalp select /*3-2*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*3-2*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Waits user 4"; +echo ########################### Waits user 4 - 2; -eval select count(*) from performance_schema.events_waits_current +evalp select /*4-2*/ count(*) from performance_schema.events_waits_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_waits_history +evalp select /*4-2*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*4-2*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con4_thread_id; ---enable_query_log - ---echo # Switch to connection default, enable consumers --connection default update performance_schema.setup_consumers @@ -509,7 +470,6 @@ truncate table performance_schema.events_waits_history; truncate table performance_schema.events_waits_history_long; ---echo # Switch to connection con1 --connection con1 XA START 'XA_CON1', 'XA_BQUAL', 12; @@ -518,7 +478,6 @@ XA PREPARE 'XA_CON1', 'XA_BQUAL', 12; XA COMMIT 'XA_CON1', 'XA_BQUAL', 12; ---echo # Switch to connection con2 --connection con2 XA START 'XA_CON2', 'XA_BQUAL', 12; @@ -527,7 +486,6 @@ XA PREPARE 'XA_CON2', 'XA_BQUAL', 12; XA COMMIT 'XA_CON2', 'XA_BQUAL', 12; ---echo # Switch to connection con3 --connection con3 XA START 'XA_CON3', 'XA_BQUAL', 12; @@ -536,7 +494,6 @@ XA PREPARE 'XA_CON3', 'XA_BQUAL', 12; XA COMMIT 'XA_CON3', 'XA_BQUAL', 12; ---echo # Switch to connection con4 --connection con4 XA START 'XA_CON4', 'XA_BQUAL', 12; @@ -547,165 +504,150 @@ --connection default ---disable_query_log - -echo "=========================== Transactions user 1"; +echo ########################### Transactions user 1 - 3; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +evalp select /*1-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current where THREAD_ID = $con1_thread_id; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history +evalp select /*1-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history where THREAD_ID = $con1_thread_id; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history_long +evalp select /*1-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Transactions user 2"; +echo ########################### Transactions user 2 - 3; -eval select XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current +evalp select /*2-3*/ XID_FORMAT_ID, XID_GTRID, XID_BQUAL from performance_schema.events_transactions_current where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*2-3*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*2-3*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Transactions user 3"; +echo ########################### Transactions user 3 - 3; -eval select count(*) from performance_schema.events_transactions_current +evalp select /*3-3*/ count(*) from performance_schema.events_transactions_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*3-3*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*3-3*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Transactions user 4"; +echo ########################### Transactions user 4 - 3; -eval select count(*) from performance_schema.events_transactions_current +evalp select /*4-3*/ count(*) from performance_schema.events_transactions_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_transactions_history +evalp select /*4-3*/ count(*) from performance_schema.events_transactions_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_transactions_history_long +evalp select /*4-3*/ count(*) from performance_schema.events_transactions_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Statements user 1"; +echo ########################### Statements user 1 - 3; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history_long - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; +evalp select /*1-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_history_long + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; -echo "=========================== Statements user 2"; +echo ########################### Statements user 2 - 3; -eval select EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_statements_history +evalp select /*2-3*/ EVENT_NAME, SQL_TEXT from performance_schema.events_statements_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-3*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*2-3*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Statements user 3"; +echo ########################### Statements user 3 - 3; -eval select count(*) from performance_schema.events_statements_current +evalp select /*3-3*/ count(*) from performance_schema.events_statements_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_statements_history +evalp select /*3-3*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*3-3*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Statements user 4"; +echo ########################### Statements user 4 - 3; -eval select count(*) from performance_schema.events_statements_current +evalp select /*4-3*/ count(*) from performance_schema.events_statements_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_statements_history +evalp select /*4-3*/ count(*) from performance_schema.events_statements_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_statements_history_long +evalp select /*4-3*/ count(*) from performance_schema.events_statements_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Stages user 1"; +echo ########################### Stages user 1 - 3; -eval select EVENT_NAME from performance_schema.events_stages_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME from performance_schema.events_stages_history - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select EVENT_NAME from performance_schema.events_stages_history_long - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; +evalp select /*1-3*/ EVENT_NAME from performance_schema.events_stages_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-3*/ EVENT_NAME from performance_schema.events_stages_history + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-3*/ EVENT_NAME from performance_schema.events_stages_history_long + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; -echo "=========================== Stages user 2"; +echo ########################### Stages user 2 - 3; -eval select EVENT_NAME from performance_schema.events_stages_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_stages_history +evalp select /*2-3*/ EVENT_NAME from performance_schema.events_stages_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-3*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*2-3*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Stages user 3"; +echo ########################### Stages user 3 - 3; -eval select count(*) from performance_schema.events_stages_current +evalp select /*3-3*/ count(*) from performance_schema.events_stages_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_stages_history +evalp select /*3-3*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*3-3*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Stages user 4"; +echo ########################### Stages user 4 - 3; -eval select count(*) from performance_schema.events_stages_current +evalp select /*4-3*/ count(*) from performance_schema.events_stages_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_stages_history +evalp select /*4-3*/ count(*) from performance_schema.events_stages_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_stages_history_long +evalp select /*4-3*/ count(*) from performance_schema.events_stages_history_long where THREAD_ID = $con4_thread_id; -echo "=========================== Waits user 1"; +echo ########################### Waits user 1 - 3; -eval select EVENT_NAME from performance_schema.events_waits_current - where THREAD_ID = $con1_thread_id - order by THREAD_ID, EVENT_ID; -eval select (count(*) > 5) as has_waits from performance_schema.events_waits_history +evalp select /*1-3*/ EVENT_NAME from performance_schema.events_waits_current + where THREAD_ID = $con1_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*1-3*/ (count(*) > 5) as has_waits from performance_schema.events_waits_history where THREAD_ID = $con1_thread_id; -eval select (count(*) > 15) as has_waits from performance_schema.events_waits_history_long +evalp select /*1-3*/ (count(*) > 15) as has_waits from performance_schema.events_waits_history_long where THREAD_ID = $con1_thread_id; -echo "=========================== Waits user 2"; +echo ########################### Waits user 2 - 3; -eval select EVENT_NAME from performance_schema.events_waits_current - where THREAD_ID = $con2_thread_id - order by THREAD_ID, EVENT_ID; -eval select count(*) from performance_schema.events_waits_history +evalp select /*2-3*/ EVENT_NAME from performance_schema.events_waits_current + where THREAD_ID = $con2_thread_id order by THREAD_ID, EVENT_ID; +evalp select /*2-3*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con2_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*2-3*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con2_thread_id; -echo "=========================== Waits user 3"; +echo ########################### Waits user 3 - 3; -eval select count(*) from performance_schema.events_waits_current +evalp select /*3-3*/ count(*) from performance_schema.events_waits_current where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_waits_history +evalp select /*3-3*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con3_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*3-3*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con3_thread_id; -echo "=========================== Waits user 4"; +echo ########################### Waits user 4 - 3; -eval select count(*) from performance_schema.events_waits_current +evalp select /*4-3*/ count(*) from performance_schema.events_waits_current where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_waits_history +evalp select /*4-3*/ count(*) from performance_schema.events_waits_history where THREAD_ID = $con4_thread_id; -eval select count(*) from performance_schema.events_waits_history_long +evalp select /*4-3*/ count(*) from performance_schema.events_waits_history_long where THREAD_ID = $con4_thread_id; ---enable_query_log - ---echo # Switch to connection default --connection default revoke all privileges, grant option from user1@localhost; diff -Nru mariadb-10.11.6/mysql-test/suite/period/r/overlaps.result mariadb-10.11.9/mysql-test/suite/period/r/overlaps.result --- mariadb-10.11.6/mysql-test/suite/period/r/overlaps.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/period/r/overlaps.result 2024-08-03 07:29:58.000000000 +0000 @@ -449,3 +449,85 @@ ('2000-01-01 00:00:00.000000', '2001-01-01 00:00:00.000000', 'abc'); ERROR 23000: Duplicate entry 'abc-2001-01-01 00:00:00.000000-2000-01-01 00:00:00.000000' for key 'index_name' DROP TABLE t1; +# MDEV-25370 Update for portion changes autoincrement key in period table +create or replace table cars(id int auto_increment, +price int, s date, e date, +period for p(s,e), +primary key(id, p without overlaps)); +insert into cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +select * from cars; +id price s e +1 1000 2018-01-01 2020-01-01 +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; +select * from cars; +id price s e +1 1000 2018-01-01 2019-01-01 +1 1000 2019-12-01 2020-01-01 +1 1100 2019-01-01 2019-12-01 +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +select * from cars; +id price s e +1 1000 2018-01-01 2019-01-01 +1 1000 2019-12-01 2019-12-10 +1 1000 2019-12-20 2020-01-01 +1 1100 2019-01-01 2019-12-01 +# AUTO_INCREMENT field is separate from WITHOUT OVERLAPS +create or replace table cars(id int primary key auto_increment, +car_id int, +price int, s date, e date, +period for p(s,e), +unique(car_id, p without overlaps)); +insert cars(car_id, price, s, e) values (1, 1000, '2018-01-01', '2020-01-01'); +select * from cars; +id car_id price s e +1 1 1000 2018-01-01 2020-01-01 +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; +select * from cars; +id car_id price s e +1 1 1100 2019-01-01 2019-12-01 +2 1 1000 2018-01-01 2019-01-01 +3 1 1000 2019-12-01 2020-01-01 +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +select * from cars; +id car_id price s e +1 1 1100 2019-01-01 2019-12-01 +2 1 1000 2018-01-01 2019-01-01 +4 1 1000 2019-12-01 2019-12-10 +5 1 1000 2019-12-20 2020-01-01 +# AUTO_INCREMENT field is both standalone and in WITHOUT OVERLAPS +create or replace table cars(id int primary key auto_increment, +price int, s date, e date, +period for p(s,e), +unique(id, p without overlaps)); +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +insert cars(price, s, e) values (1000, '2021-01-01', '2022-01-01'); +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; +# autoincrement index is: id int primary key +# id increments each time. +select * from cars; +id price s e +1 1100 2019-01-01 2019-12-01 +2 1000 2021-01-01 2022-01-01 +3 1000 2018-01-01 2019-01-01 +4 1000 2019-12-01 2020-01-01 +truncate cars; +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +select * from cars; +id price s e +2 1000 2018-01-01 2019-12-10 +3 1000 2019-12-20 2020-01-01 +create or replace table cars(id int unique auto_increment, +price int, s date, e date, +period for p(s,e), +primary key (id, p without overlaps)); +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +# autoincrement index is: primary key (id, p without overlaps) +# id is not incremented, hence duplication error +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; +ERROR 23000: Duplicate entry '1' for key 'id' +truncate cars; +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +ERROR 23000: Duplicate entry '1' for key 'id' +drop table cars; diff -Nru mariadb-10.11.6/mysql-test/suite/period/t/overlaps.test mariadb-10.11.9/mysql-test/suite/period/t/overlaps.test --- mariadb-10.11.6/mysql-test/suite/period/t/overlaps.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/period/t/overlaps.test 2024-08-03 07:29:58.000000000 +0000 @@ -458,3 +458,80 @@ ('2000-01-01 00:00:00.000000', '2001-01-01 00:00:00.000000', 'abc '), ('2000-01-01 00:00:00.000000', '2001-01-01 00:00:00.000000', 'abc'); DROP TABLE t1; + +--echo # MDEV-25370 Update for portion changes autoincrement key in period table +create or replace table cars(id int auto_increment, + price int, s date, e date, + period for p(s,e), + primary key(id, p without overlaps)); + +insert into cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +select * from cars; + +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; +--sorted_result +select * from cars; + +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +--sorted_result +select * from cars; + +--echo # AUTO_INCREMENT field is separate from WITHOUT OVERLAPS +create or replace table cars(id int primary key auto_increment, + car_id int, + price int, s date, e date, + period for p(s,e), + unique(car_id, p without overlaps)); + +insert cars(car_id, price, s, e) values (1, 1000, '2018-01-01', '2020-01-01'); +select * from cars; + +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; +--sorted_result +select * from cars; + +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +--sorted_result +select * from cars; + + +--echo # AUTO_INCREMENT field is both standalone and in WITHOUT OVERLAPS +create or replace table cars(id int primary key auto_increment, + price int, s date, e date, + period for p(s,e), + unique(id, p without overlaps)); + +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +insert cars(price, s, e) values (1000, '2021-01-01', '2022-01-01'); + +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; +--echo # autoincrement index is: id int primary key +--echo # id increments each time. +--sorted_result +select * from cars; + +truncate cars; +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); + +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; +--sorted_result +select * from cars; + +create or replace table cars(id int unique auto_increment, + price int, s date, e date, + period for p(s,e), + primary key (id, p without overlaps)); + +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); +--echo # autoincrement index is: primary key (id, p without overlaps) +--echo # id is not incremented, hence duplication error +--error ER_DUP_ENTRY +update cars for portion of p from '2019-01-01' to '2019-12-01' set price= 1100; + +truncate cars; +insert cars(price, s, e) values (1000, '2018-01-01', '2020-01-01'); + +--error ER_DUP_ENTRY +delete from cars for portion of p from '2019-12-10' to '2019-12-20'; + +drop table cars; diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff --- mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lz4.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -10,15 +10,19 @@ +set global innodb_compression_algorithm = lz4; call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt"); call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed"); - call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table"); -@@ -15,8 +15,8 @@ + call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate"); +@@ -16,12 +16,12 @@ 0 abcabcabc 300 1 defdefdef 3000 2 ghighighi 30000 -# restart: --disable-provider-bzip2 +# restart: --disable-provider-lz4 select a, left(b, 9), length(b) from t1; --ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table -+ERROR HY000: Table test/t1 is compressed with lz4, which is not currently loaded. Please load the lz4 provider plugin to open the table + ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. + show warnings; + Level Code Message +-Warning 4185 MariaDB tried to use the BZip2 compression, but its provider plugin is not loaded ++Warning 4185 MariaDB tried to use the LZ4 compression, but its provider plugin is not loaded + Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. drop table t1; # restart diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff --- mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lzma.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -10,15 +10,19 @@ +set global innodb_compression_algorithm = lzma; call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt"); call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed"); - call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table"); -@@ -15,8 +15,8 @@ + call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate"); +@@ -16,12 +16,12 @@ 0 abcabcabc 300 1 defdefdef 3000 2 ghighighi 30000 -# restart: --disable-provider-bzip2 +# restart: --disable-provider-lzma select a, left(b, 9), length(b) from t1; --ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table -+ERROR HY000: Table test/t1 is compressed with lzma, which is not currently loaded. Please load the lzma provider plugin to open the table + ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. + show warnings; + Level Code Message +-Warning 4185 MariaDB tried to use the BZip2 compression, but its provider plugin is not loaded ++Warning 4185 MariaDB tried to use the LZMA compression, but its provider plugin is not loaded + Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. drop table t1; # restart diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff --- mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-lzo.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -10,15 +10,19 @@ +set global innodb_compression_algorithm = lzo; call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt"); call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed"); - call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table"); -@@ -15,8 +15,8 @@ + call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate"); +@@ -16,12 +16,12 @@ 0 abcabcabc 300 1 defdefdef 3000 2 ghighighi 30000 -# restart: --disable-provider-bzip2 +# restart: --disable-provider-lzo select a, left(b, 9), length(b) from t1; --ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table -+ERROR HY000: Table test/t1 is compressed with lzo, which is not currently loaded. Please load the lzo provider plugin to open the table + ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. + show warnings; + Level Code Message +-Warning 4185 MariaDB tried to use the BZip2 compression, but its provider plugin is not loaded ++Warning 4185 MariaDB tried to use the LZO compression, but its provider plugin is not loaded + Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. drop table t1; # restart diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff --- mariadb-10.11.6/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/compression,innodb-snappy.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -10,15 +10,19 @@ +set global innodb_compression_algorithm = snappy; call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt"); call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed"); - call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table"); -@@ -15,8 +15,8 @@ + call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate"); +@@ -16,12 +16,12 @@ 0 abcabcabc 300 1 defdefdef 3000 2 ghighighi 30000 -# restart: --disable-provider-bzip2 +# restart: --disable-provider-snappy select a, left(b, 9), length(b) from t1; --ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table -+ERROR HY000: Table test/t1 is compressed with snappy, which is not currently loaded. Please load the snappy provider plugin to open the table + ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. + show warnings; + Level Code Message +-Warning 4185 MariaDB tried to use the BZip2 compression, but its provider plugin is not loaded ++Warning 4185 MariaDB tried to use the Snappy compression, but its provider plugin is not loaded + Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. drop table t1; # restart diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff mariadb-10.11.9/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff --- mariadb-10.11.6/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/compression,mroonga-lz4.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ --- suite/plugins/r/compression.result +++ suite/plugins/r/compression.reject -@@ -1,12 +1,8 @@ +@@ -1,13 +1,8 @@ # -# Testing bzip2 compression provider with innodb +# Testing lz4 compression provider with mroonga @@ -9,20 +9,25 @@ -set global innodb_compression_algorithm = bzip2; -call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt"); -call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed"); +-call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate"); -call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table"); -create table t1 (a int, b text ) engine = innodb page_compressed = 1; +create table t1 (a int, b text COMMENT 'FLAGS "COLUMN_SCALAR|COMPRESS_LZ4"') engine = mroonga charset = utf8; insert t1 (a, b) values (0, repeat("abc", 100)); insert t1 (a, b) values (1, repeat("def", 1000)); insert t1 (a, b) values (2, repeat("ghi", 10000)); -@@ -14,8 +11,20 @@ +@@ -16,12 +11,20 @@ 0 abcabcabc 300 1 defdefdef 3000 2 ghighighi 30000 -# restart: --disable-provider-bzip2 +# restart: --disable-provider-lz4 select a, left(b, 9), length(b) from t1; --ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table +-ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. +-show warnings; +-Level Code Message +-Warning 4185 MariaDB tried to use the BZip2 compression, but its provider plugin is not loaded +-Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. +a left(b, 9) length(b) +0 0 +1 0 diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/compression.result mariadb-10.11.9/mysql-test/suite/plugins/r/compression.result --- mariadb-10.11.6/mysql-test/suite/plugins/r/compression.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/compression.result 2024-08-03 07:29:58.000000000 +0000 @@ -5,6 +5,7 @@ set global innodb_compression_algorithm = bzip2; call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt"); call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed"); +call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate"); call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table"); create table t1 (a int, b text ) engine = innodb page_compressed = 1; insert t1 (a, b) values (0, repeat("abc", 100)); @@ -17,6 +18,10 @@ 2 ghighighi 30000 # restart: --disable-provider-bzip2 select a, left(b, 9), length(b) from t1; -ERROR HY000: Table test/t1 is compressed with bzip2, which is not currently loaded. Please load the bzip2 provider plugin to open the table +ERROR HY000: Table `test`.`t1` is corrupted. Please drop the table and recreate. +show warnings; +Level Code Message +Warning 4185 MariaDB tried to use the BZip2 compression, but its provider plugin is not loaded +Error 1877 Table `test`.`t1` is corrupted. Please drop the table and recreate. drop table t1; # restart diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/sql_error_log.result mariadb-10.11.9/mysql-test/suite/plugins/r/sql_error_log.result --- mariadb-10.11.6/mysql-test/suite/plugins/r/sql_error_log.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/sql_error_log.result 2024-08-03 07:29:58.000000000 +0000 @@ -9,6 +9,7 @@ sql_error_log_rotations 9 sql_error_log_size_limit 1000000 sql_error_log_warnings ON +sql_error_log_with_db_and_thread_info OFF set global sql_error_log_rate=1; select * from t_doesnt_exist; ERROR 42S02: Table 'test.t_doesnt_exist' doesn't exist diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/sql_error_log_withdbinfo.result mariadb-10.11.9/mysql-test/suite/plugins/r/sql_error_log_withdbinfo.result --- mariadb-10.11.6/mysql-test/suite/plugins/r/sql_error_log_withdbinfo.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/sql_error_log_withdbinfo.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,41 @@ +show variables like 'sql_error_log%'; +Variable_name Value +sql_error_log_filename sql_errors.log +sql_error_log_rate 1 +sql_error_log_rotate OFF +sql_error_log_rotations 9 +sql_error_log_size_limit 1000000 +sql_error_log_warnings ON +sql_error_log_with_db_and_thread_info ON +set global sql_error_log_rate=1; +# Trying to set the variable at runtime +SET sql_error_log_with_db_and_thread_info=OFF; +ERROR HY000: Variable 'sql_error_log_with_db_and_thread_info' is a read only variable +# +# Using test database from mtr +# +DROP DATABASE db; +ERROR HY000: Can't drop database 'db'; database doesn't exist +# +# Using no database at all +# +connect con1,localhost,root,,*NO-ONE*; +DROP DATABASE dbnodb; +ERROR HY000: Can't drop database 'dbnodb'; database doesn't exist +disconnect con1; +connection default; +# +# Using database with name `NULL` +# +CREATE DATABASE `NULL`; +USE `NULL`; +DROP DATABASE db; +ERROR HY000: Can't drop database 'db'; database doesn't exist +TIME THREAD_ID HOSTNAME `mtr` WARNING 1286: Unknown storage engine 'InnoDB' : SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql +TIME THREAD_ID HOSTNAME `mtr` WARNING 1286: Unknown storage engine 'InnoDB' : SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql +TIME THREAD_ID HOSTNAME `mtr` WARNING 1286: Unknown storage engine 'InnoDB' : SELECT CONCAT(table_schema, '.', table_name) AS columns_in_mysql, column_name, ordinal_position, column_default, is_nullable, data_type, character_maximum_length, character_octet_length, numeric_precision, numeric_scale, character_set_name, collation_name, column_type, column_key, extra, column_comment FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema='mysql' ORDER BY columns_in_mysql +TIME THREAD_ID HOSTNAME `test` ERROR 1238: Variable 'sql_error_log_with_db_and_thread_info' is a read only variable : SET sql_error_log_with_db_and_thread_info=OFF +TIME THREAD_ID HOSTNAME `test` ERROR 1008: Can't drop database 'db'; database doesn't exist : DROP DATABASE db +TIME THREAD_ID HOSTNAME NULL ERROR 1008: Can't drop database 'dbnodb'; database doesn't exist : DROP DATABASE dbnodb +TIME THREAD_ID HOSTNAME `NULL` ERROR 1008: Can't drop database 'db'; database doesn't exist : DROP DATABASE db +DROP DATABASE `NULL`; diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/r/test_sql_service.result mariadb-10.11.9/mysql-test/suite/plugins/r/test_sql_service.result --- mariadb-10.11.6/mysql-test/suite/plugins/r/test_sql_service.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/r/test_sql_service.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,8 +1,8 @@ -reset master; install plugin test_sql_service soname 'test_sql_service'; show status like 'test_sql_service_passed'; Variable_name Value Test_sql_service_passed 1 +reset master; set global test_sql_service_execute_sql_global= 'create table test.t1 select 1 as a, @@SQL_LOG_BIN'; set global test_sql_service_execute_sql_local= 'insert into test.t1 select 2 as a, @@SQL_LOG_BIN'; set global test_sql_service_execute_sql_global= 'SET SQL_LOG_BIN=1'; diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/t/compression.combinations mariadb-10.11.9/mysql-test/suite/plugins/t/compression.combinations --- mariadb-10.11.6/mysql-test/suite/plugins/t/compression.combinations 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/t/compression.combinations 2024-08-03 07:29:58.000000000 +0000 @@ -1,25 +1,30 @@ [innodb-bzip2] innodb +innodb-fast-shutdown=0 plugin-load-add=$PROVIDER_BZIP2_SO loose-provider-bzip2 [innodb-lz4] innodb +innodb-fast-shutdown=0 plugin-load-add=$PROVIDER_LZ4_SO loose-provider-lz4 [innodb-lzma] innodb +innodb-fast-shutdown=0 plugin-load-add=$PROVIDER_LZMA_SO loose-provider-lzma [innodb-lzo] innodb +innodb-fast-shutdown=0 plugin-load-add=$PROVIDER_LZO_SO loose-provider-lzo [innodb-snappy] innodb +innodb-fast-shutdown=0 plugin-load-add=$PROVIDER_SNAPPY_SO loose-provider-snappy diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/t/compression.test mariadb-10.11.9/mysql-test/suite/plugins/t/compression.test --- mariadb-10.11.6/mysql-test/suite/plugins/t/compression.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/t/compression.test 2024-08-03 07:29:58.000000000 +0000 @@ -21,6 +21,7 @@ let $table_params = page_compressed = 1; call mtr.add_suppression("Background Page read failed to read, uncompress, or decrypt"); call mtr.add_suppression("Table is compressed or encrypted but uncompress or decrypt failed"); + call mtr.add_suppression("Table `test`.`t1` is corrupted. Please drop the table and recreate"); call mtr.add_suppression("Table .*t1.* is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table"); } if ($engine == "mroonga") { @@ -39,8 +40,9 @@ source include/restart_mysqld.inc; if ($engine == "innodb") { - error ER_PROVIDER_NOT_LOADED; + error ER_TABLE_CORRUPT; select a, left(b, 9), length(b) from t1; + show warnings; } if ($engine == "mroonga"){ select a, left(b, 9), length(b) from t1; diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.opt mariadb-10.11.9/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.opt --- mariadb-10.11.6/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--plugin-load-add=$SQL_ERRLOG_SO --sql-error-log-with-db-and-thread-info=1 --lower_case_table_names=2 diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.test mariadb-10.11.9/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.test --- mariadb-10.11.6/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/t/sql_error_log_withdbinfo.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,49 @@ +--source include/not_embedded.inc + +if (!$SQL_ERRLOG_SO) { + skip No SQL_ERROR_LOG plugin; +} + +show variables like 'sql_error_log%'; +set global sql_error_log_rate=1; + +let $MYSQLD_DATADIR= `SELECT @@datadir`; + +--echo # Trying to set the variable at runtime + +--error ER_INCORRECT_GLOBAL_LOCAL_VAR +SET sql_error_log_with_db_and_thread_info=OFF; + +--echo # +--echo # Using test database from mtr +--echo # + +--error ER_DB_DROP_EXISTS +DROP DATABASE db; + +--echo # +--echo # Using no database at all +--echo # + + +connect (con1,localhost,root,,*NO-ONE*); +--error ER_DB_DROP_EXISTS +DROP DATABASE dbnodb; +disconnect con1; +connection default; + +--echo # +--echo # Using database with name `NULL` +--echo # +CREATE DATABASE `NULL`; +USE `NULL`; +--error ER_DB_DROP_EXISTS +DROP DATABASE db; + + +--let SEARCH_FILE= $MYSQLD_DATADIR/sql_errors.log +--let LINES_TO_READ=7 +--replace_regex /[1-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]* .* @ .* `mtr` /TIME THREAD_ID HOSTNAME `mtr` //[1-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]* .* @ .* `test` /TIME THREAD_ID HOSTNAME `test` //[1-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]* .* @ .* NULL /TIME THREAD_ID HOSTNAME NULL //[1-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [ 0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9]* .* @ .* `NULL` /TIME THREAD_ID HOSTNAME `NULL` / +--source include/read_head.inc + +DROP DATABASE `NULL`; diff -Nru mariadb-10.11.6/mysql-test/suite/plugins/t/test_sql_service.test mariadb-10.11.9/mysql-test/suite/plugins/t/test_sql_service.test --- mariadb-10.11.6/mysql-test/suite/plugins/t/test_sql_service.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/plugins/t/test_sql_service.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,8 +1,6 @@ --source include/not_embedded.inc --source include/have_log_bin.inc -reset master; # clear binlogs - if (!$TEST_SQL_SERVICE_SO) { skip No TEST_SQL_SERVICE plugin; } @@ -13,6 +11,7 @@ install plugin test_sql_service soname 'test_sql_service'; show status like 'test_sql_service_passed'; +reset master; set global test_sql_service_execute_sql_global= 'create table test.t1 select 1 as a, @@SQL_LOG_BIN'; set global test_sql_service_execute_sql_local= 'insert into test.t1 select 2 as a, @@SQL_LOG_BIN'; @@ -76,8 +75,7 @@ uninstall plugin test_sql_service; # Check that statements were executed/binlogged in correct order. -source include/show_binlog_events.inc; +--source include/show_binlog_events.inc # --replace_column 2 # 5 # # --replace_regex /xid=[0-9]+/xid=XX/ /GTID [0-9]+-[0-9]+-[0-9]+/GTID #-#-#/ -# SHOW BINLOG EVENTS LIMIT 3,100; - +# SHOW BINLOG EVENTS LIMIT 3,5; diff -Nru mariadb-10.11.6/mysql-test/suite/roles/definer.result mariadb-10.11.9/mysql-test/suite/roles/definer.result --- mariadb-10.11.6/mysql-test/suite/roles/definer.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/roles/definer.result 2024-08-03 07:29:58.000000000 +0000 @@ -279,6 +279,7 @@ 111 4 0 2 20 200 delete from t1 where a=111; +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; diff -Nru mariadb-10.11.6/mysql-test/suite/roles/set_default_role_for.result mariadb-10.11.9/mysql-test/suite/roles/set_default_role_for.result --- mariadb-10.11.6/mysql-test/suite/roles/set_default_role_for.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/roles/set_default_role_for.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ set default role invalid_role for user_a@localhost; ERROR OP000: Invalid role specification `invalid_role` set default role role_b for user_a@localhost; -ERROR OP000: User `root`@`localhost` has not been granted role `role_b` +ERROR OP000: User `user_a`@`localhost` has not been granted role `role_b` set default role role_b for user_b@localhost; show grants; Grants for user_a@localhost diff -Nru mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid.result mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid.result --- mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid.result 2024-08-03 07:29:58.000000000 +0000 @@ -48,7 +48,7 @@ CREATE ROLE r1; CREATE ROLE r2; SET DEFAULT ROLE r1 FOR a; -ERROR OP000: User `root`@`localhost` has not been granted role `r1` +ERROR OP000: User `a`@`%` has not been granted role `r1` GRANT r1 TO b; GRANT r2 TO b; SET DEFAULT ROLE r1 FOR b; @@ -100,7 +100,7 @@ GRANT SELECT, UPDATE ON `mysql`.* TO `b`@`%` SET DEFAULT ROLE `r2` FOR `b`@`%` SET DEFAULT ROLE r1 FOR a; -ERROR OP000: User `b`@`%` has not been granted role `r1` +ERROR OP000: User `a`@`%` has not been granted role `r1` SET DEFAULT ROLE invalid_role; ERROR OP000: Invalid role specification `invalid_role` SET DEFAULT ROLE invalid_role FOR a; @@ -117,7 +117,7 @@ # Change user b (session 3: role granted to user a) SET DEFAULT ROLE r1 FOR a; SET DEFAULT ROLE r2 FOR a; -ERROR OP000: User `b`@`%` has not been granted role `r2` +ERROR OP000: User `a`@`%` has not been granted role `r2` SET DEFAULT ROLE invalid_role; ERROR OP000: Invalid role specification `invalid_role` SET DEFAULT ROLE invalid_role FOR a; diff -Nru mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid.test mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid.test --- mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid.test 2024-08-03 07:29:58.000000000 +0000 @@ -70,7 +70,6 @@ CREATE USER b; CREATE ROLE r1; CREATE ROLE r2; -# Role has not been granted to user a, but the role is visible to current_user --error ER_INVALID_ROLE SET DEFAULT ROLE r1 FOR a; # Granting roles to user b diff -Nru mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve-master.opt mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve-master.opt --- mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve-master.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve-master.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--skip-name-resolve \ No newline at end of file diff -Nru mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.result mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.result --- mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,85 @@ +# +# MDEV-26875: Wrong user in SET DEFAULT ROLE error +# +create user test_user; +create role test_role; +show grants for test_user; +Grants for test_user@% +GRANT USAGE ON *.* TO `test_user`@`%` +set default role test_role for test_user; +ERROR OP000: User `test_user`@`%` has not been granted role `test_role` +grant test_role to test_user; +set default role test_role for test_user; +show grants for test_user; +Grants for test_user@% +GRANT `test_role` TO `test_user`@`%` +GRANT USAGE ON *.* TO `test_user`@`%` +SET DEFAULT ROLE `test_role` FOR `test_user`@`%` +set default role none for test_user; +# +# Try to set default role to role(`test_role`). +-------------------------------------------------------------- +show grants for test_role; +Grants for test_role +GRANT USAGE ON *.* TO `test_role` +create role new_role; +grant new_role to test_role; +show grants for test_role; +Grants for test_role +GRANT `new_role` TO `test_role` +GRANT USAGE ON *.* TO `test_role` +GRANT USAGE ON *.* TO `new_role` +set default role new_role for test_role; +ERROR OP000: User `test_role`@`%` has not been granted role `new_role` +# +# Test of errors, where hostname cannot be resolved `test_user` +-------------------------------------------------------------- +grant test_role to test_user@'%'; +set default role test_role for test_user@'%'; +connect con_test_user,127.0.0.1,test_user,,,$MASTER_MYPORT; +show grants; +Grants for test_user@% +GRANT `test_role` TO `test_user`@`%` +GRANT USAGE ON *.* TO `test_user`@`%` +GRANT `new_role` TO `test_role` +GRANT USAGE ON *.* TO `test_role` +GRANT USAGE ON *.* TO `new_role` +SET DEFAULT ROLE `test_role` FOR `test_user`@`%` +select current_role; +current_role +test_role +set role `new_role`; +ERROR OP000: User `test_user`@`%` has not been granted role `new_role` +connection default; +set default role none for test_user; +disconnect con_test_user; +connect con_test_user,127.0.0.1,test_user,,,$MASTER_MYPORT; +select current_role; +current_role +NULL +set role `new_role`; +ERROR OP000: User `test_user`@`%` has not been granted role `new_role` +connection default; +disconnect con_test_user; +# +# Test of anonymous user connection +-------------------------------------------------------------- +grant test_role to ''@localhost; +connect con1,localhost,'',,,$MASTER_MYPORT; +SELECT CURRENT_ROLE; +CURRENT_ROLE +NULL +SET role test_role; +SELECT CURRENT_ROLE; +CURRENT_ROLE +test_role +SET role new_role; +ERROR OP000: User ``@`localhost` has not been granted role `new_role` +set default role test_role for ''@localhost; +ERROR 42000: You are using MariaDB as an anonymous user and anonymous users are not allowed to modify user settings +connection default; +disconnect con1; +REVOKE all privileges, grant option from ''@localhost; +drop role new_role; +drop role test_role; +drop user test_user; diff -Nru mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.test mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.test --- mariadb-10.11.6/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/roles/set_default_role_invalid_skip_name_resolve.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,78 @@ +source include/not_embedded.inc; + +--echo # +--echo # MDEV-26875: Wrong user in SET DEFAULT ROLE error +--echo # +create user test_user; +create role test_role; +show grants for test_user; +--error ER_INVALID_ROLE +set default role test_role for test_user; +grant test_role to test_user; +set default role test_role for test_user; +show grants for test_user; +set default role none for test_user; + +--echo # +--echo # Try to set default role to role(`test_role`). +--echo -------------------------------------------------------------- +show grants for test_role; +create role new_role; +grant new_role to test_role; +show grants for test_role; +# One can not set role to a role +--error ER_INVALID_ROLE +set default role new_role for test_role; + +--echo # +--echo # Test of errors, where hostname cannot be resolved `test_user` +--echo -------------------------------------------------------------- +# `new_role` is granted to `test_role` +grant test_role to test_user@'%'; +set default role test_role for test_user@'%'; + +connect con_test_user,127.0.0.1,test_user,,,$MASTER_MYPORT; +show grants; +select current_role; +# `test_user` indirectly granted `new_role` +--error ER_INVALID_ROLE +set role `new_role`; + +connection default; +set default role none for test_user; +disconnect con_test_user; + +connect con_test_user,127.0.0.1,test_user,,,$MASTER_MYPORT; +select current_role; +--error ER_INVALID_ROLE +set role `new_role`; + +connection default; +disconnect con_test_user; + +--echo # +--echo # Test of anonymous user connection +--echo -------------------------------------------------------------- +--source include/add_anonymous_users.inc +# Skip windows, since it uses current user `Administrator` in buildbot. +--source include/not_windows.inc +grant test_role to ''@localhost; + +connect(con1,localhost,'',,,$MASTER_MYPORT); +SELECT CURRENT_ROLE; +SET role test_role; +SELECT CURRENT_ROLE; +# user cannot set subset role, since it is not granted explicitly +--error ER_INVALID_ROLE +SET role new_role; +--error ER_PASSWORD_ANONYMOUS_USER +set default role test_role for ''@localhost; + +connection default; +disconnect con1; +REVOKE all privileges, grant option from ''@localhost; +--source include/delete_anonymous_users.inc + +drop role new_role; +drop role test_role; +drop user test_user; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/mdev-31448_conservative.inc mariadb-10.11.9/mysql-test/suite/rpl/include/mdev-31448_conservative.inc --- mariadb-10.11.6/mysql-test/suite/rpl/include/mdev-31448_conservative.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/mdev-31448_conservative.inc 2024-08-03 07:29:58.000000000 +0000 @@ -36,7 +36,8 @@ --connection slave --source include/start_slave.inc ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)%' and command LIKE 'Slave_worker'; +# Wildcard for `state` as it depends on whether WSREP is compiled in or not. +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(%' and command LIKE 'Slave_worker'; --source include/wait_condition.inc --let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'; --source include/wait_condition.inc @@ -50,8 +51,8 @@ commit; --connection slave ---let $slave_timeout=1032 ---source include/wait_for_slave_sql_to_stop.inc +--let $slave_sql_errno=1032 +--source include/wait_for_slave_sql_error.inc update t1 set a=1 where a=2; set @@global.slave_parallel_threads = @save.slave_parallel_threads; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc mariadb-10.11.9/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc --- mariadb-10.11.6/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc 2024-08-03 07:29:58.000000000 +0000 @@ -55,7 +55,8 @@ --source include/start_slave.inc --echo # wait for T1 ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)%' and command LIKE 'Slave_worker'; +# Wildcard for `state` as it depends on whether WSREP is compiled in or not. +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(%' and command LIKE 'Slave_worker'; --source include/wait_condition.inc --echo # wait for T2 @@ -75,8 +76,8 @@ commit; --connection slave ---let $slave_timeout=1032 ---source include/wait_for_slave_sql_to_stop.inc +--let $slave_sql_errno=1032 +--source include/wait_for_slave_sql_error.inc update t1 set a=1 where a=2; set @@global.slave_parallel_threads = @save.slave_parallel_threads; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/mysqlbinlog_slave_consistency.inc mariadb-10.11.9/mysql-test/suite/rpl/include/mysqlbinlog_slave_consistency.inc --- mariadb-10.11.6/mysql-test/suite/rpl/include/mysqlbinlog_slave_consistency.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/mysqlbinlog_slave_consistency.inc 2024-08-03 07:29:58.000000000 +0000 @@ -128,6 +128,7 @@ } --echo # Stop $con2 so it stops receiving $con1 events. +--let $rpl_allow_error= 1 --source include/stop_slave.inc --connection $con1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_binlog_max_cache_size.test mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_binlog_max_cache_size.test --- mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_binlog_max_cache_size.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_binlog_max_cache_size.test 2024-08-03 07:29:58.000000000 +0000 @@ -418,6 +418,8 @@ COMMIT; --connection slave +# Multi-statement transaction raised ER_TRANS_CACHE_FULL (4096=128x32) +# that will stop SQL slave thread --let $slave_sql_errno= 1197 if (`SELECT @@binlog_format = 'ROW'`) { @@ -437,7 +439,8 @@ --replace_result $old_binlog_stmt_cache_size ORIGINAL_VALUE --eval SET GLOBAL binlog_stmt_cache_size= $old_binlog_stmt_cache_size -source include/stop_slave.inc; +# SQL slave is stopped, stop only IO thread +source include/stop_slave_io.inc; source include/start_slave.inc; connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_change_master_demote.inc mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_change_master_demote.inc --- mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_change_master_demote.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_change_master_demote.inc 2024-08-03 07:29:58.000000000 +0000 @@ -85,5 +85,16 @@ --eval CHANGE MASTER TO master_host='127.0.0.1', master_port=$MASTER_MYPORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1 --source include/start_slave.inc +# Ensure master is ready to start sending new transactions. That is, because +# the master does not have log_slave_updates, the slave's transactions of +# repl_t are not binlogged, and its state is behind. If the master binlogs +# any new transactions before the slaves connection is matured, +# ER_GTID_POSITION_NOT_FOUND_IN_BINLOG2 can be reported to the slave +# FIXME: We shouldn't need to do this, rather, the master should use +# log-slave-updates and gtid-strict-mode +--connection master +--let $wait_condition= SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE State like '%Master has sent all binlog to slave%' +--source include/wait_condition.inc + --let $include_filename= rpl_change_master_demote.inc --source include/end_include_file.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_extra_col_master.test mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_extra_col_master.test --- mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_extra_col_master.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_extra_col_master.test 2024-08-03 07:29:58.000000000 +0000 @@ -59,6 +59,10 @@ #VARCHAR(M) # +--disable_query_log +call mtr.add_suppression("Could not read packet:.* errno: 11"); +--enable_query_log + --let $_saved_conn= $CURRENT_CONNECTION let $binformat = `SHOW VARIABLES LIKE '%binlog_format%'`; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_parallel_29322.inc mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_parallel_29322.inc --- mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_parallel_29322.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_parallel_29322.inc 2024-08-03 07:29:58.000000000 +0000 @@ -67,6 +67,17 @@ if (!$same_version_binlogs) { + # Make sure the dump thread is gone before moving around binlog files. Else + # it might see an empty file and give error (MDEV-29816). + --let $dump_thrid= `Select id FROM information_schema.processlist WHERE Command='Binlog Dump'` + if ($dump_thrid) { + --disable_query_log + --error 0,ER_NO_SUCH_THREAD + eval KILL CONNECTION $dump_thrid; + --enable_query_log + --let $wait_condition= SELECT COUNT(*)=0 FROM information_schema.processlist WHERE Command='Binlog Dump' + --source include/wait_condition.inc + } --move_file $datadir/master-bin.000002 $datadir/master-bin.000002.sav --copy_file $MYSQL_TEST_DIR/std_data/mdev29078-mysql-bin.000001 $datadir/master-bin.000002 --exec $MYSQL_BINLOG --short-form $datadir/master-bin.000002 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_shutdown_wait_slaves.inc mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_shutdown_wait_slaves.inc --- mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_shutdown_wait_slaves.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_shutdown_wait_slaves.inc 2024-08-03 07:29:58.000000000 +0000 @@ -75,17 +75,22 @@ --connection server_1 DROP TABLE t1; +# Slaves IO thread will receive the disconnect error when master was shutdown +# so we are allowing error on start. --connection server_2 --disable_warnings +--let rpl_allow_error=1 --source include/start_slave.inc --enable_warnings --connection server_3 --disable_warnings +--let rpl_allow_error=1 --source include/start_slave.inc --enable_warnings --connection server_4 --disable_warnings +--let rpl_allow_error=1 --source include/start_slave.inc --enable_warnings diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_start_stop_slave.test mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_start_stop_slave.test --- mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_start_stop_slave.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_start_stop_slave.test 2024-08-03 07:29:58.000000000 +0000 @@ -207,7 +207,7 @@ --let $status_items= Last_IO_Errno, Last_IO_Error --source include/show_slave_status.inc ---source include/stop_slave.inc +--source include/stop_slave_sql.inc RESET SLAVE; --connection master diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_stop_middle_group.test mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_stop_middle_group.test --- mariadb-10.11.6/mysql-test/suite/rpl/include/rpl_stop_middle_group.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/include/rpl_stop_middle_group.test 2024-08-03 07:29:58.000000000 +0000 @@ -82,7 +82,9 @@ # slave will catch the killed status, won't shut down immediately # but does it eventually having the whole group unfinished (not committed) -source include/wait_for_slave_sql_to_stop.inc; +# ER_SLAVE_FATAL_ERROR +--let slave_sql_errno= 1593 +source include/wait_for_slave_sql_error.inc; # checking: the error and group unfinished @@ -120,7 +122,8 @@ # but does it eventually having the whole group unfinished (not committed) # -source include/wait_for_slave_sql_to_stop.inc; +--let slave_sql_errno= 1593 +source include/wait_for_slave_sql_error.inc; # checking: the error and group unfinished diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result mariadb-10.11.9/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result 2024-08-03 07:29:58.000000000 +0000 @@ -42,7 +42,8 @@ connection slave; # # Cleanup -include/stop_slave.inc +include/wait_for_slave_sql_to_stop.inc +include/stop_slave_io.inc set @@global.slave_parallel_threads= 0; set @@global.slave_parallel_mode= optimistic; set @@global.innodb_lock_wait_timeout= 50; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/parallel_backup.result mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/parallel_backup.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup.result 2024-08-03 07:29:58.000000000 +0000 @@ -73,8 +73,6 @@ # Normal XA ROLLBACK connection slave; include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped connection master; connection aux_slave; BEGIN; @@ -110,8 +108,6 @@ # Errored out XA COMMIT connection slave; include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped connection master; connection aux_slave; BEGIN; @@ -129,7 +125,7 @@ connection slave; SET @sav_innodb_lock_wait_timeout = @@global.innodb_lock_wait_timeout; SET @sav_slave_transaction_retries = @@global.slave_transaction_retries; -SET @@global.innodb_lock_wait_timeout =1; +SET @@global.innodb_lock_wait_timeout =5; SET @@global.slave_transaction_retries=0; include/start_slave.inc connection aux_slave; @@ -172,7 +168,7 @@ connection slave; SET @sav_innodb_lock_wait_timeout = @@global.innodb_lock_wait_timeout; SET @sav_slave_transaction_retries = @@global.slave_transaction_retries; -SET @@global.innodb_lock_wait_timeout =1; +SET @@global.innodb_lock_wait_timeout =5; SET @@global.slave_transaction_retries=0; include/start_slave.inc connection aux_slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/parallel_backup_lsu_off.result mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup_lsu_off.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/parallel_backup_lsu_off.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup_lsu_off.result 2024-08-03 07:29:58.000000000 +0000 @@ -76,8 +76,6 @@ # Normal XA ROLLBACK connection slave; include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped connection master; connection aux_slave; BEGIN; @@ -113,8 +111,6 @@ # Errored out XA COMMIT connection slave; include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped connection master; connection aux_slave; BEGIN; @@ -132,7 +128,7 @@ connection slave; SET @sav_innodb_lock_wait_timeout = @@global.innodb_lock_wait_timeout; SET @sav_slave_transaction_retries = @@global.slave_transaction_retries; -SET @@global.innodb_lock_wait_timeout =1; +SET @@global.innodb_lock_wait_timeout =5; SET @@global.slave_transaction_retries=0; include/start_slave.inc connection aux_slave; @@ -175,7 +171,7 @@ connection slave; SET @sav_innodb_lock_wait_timeout = @@global.innodb_lock_wait_timeout; SET @sav_slave_transaction_retries = @@global.slave_transaction_retries; -SET @@global.innodb_lock_wait_timeout =1; +SET @@global.innodb_lock_wait_timeout =5; SET @@global.slave_transaction_retries=0; include/start_slave.inc connection aux_slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/parallel_backup_slave_binlog_off.result mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup_slave_binlog_off.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/parallel_backup_slave_binlog_off.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/parallel_backup_slave_binlog_off.result 2024-08-03 07:29:58.000000000 +0000 @@ -76,8 +76,6 @@ # Normal XA ROLLBACK connection slave; include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped connection master; connection aux_slave; BEGIN; @@ -113,8 +111,6 @@ # Errored out XA COMMIT connection slave; include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped connection master; connection aux_slave; BEGIN; @@ -132,7 +128,7 @@ connection slave; SET @sav_innodb_lock_wait_timeout = @@global.innodb_lock_wait_timeout; SET @sav_slave_transaction_retries = @@global.slave_transaction_retries; -SET @@global.innodb_lock_wait_timeout =1; +SET @@global.innodb_lock_wait_timeout =5; SET @@global.slave_transaction_retries=0; include/start_slave.inc connection aux_slave; @@ -175,7 +171,7 @@ connection slave; SET @sav_innodb_lock_wait_timeout = @@global.innodb_lock_wait_timeout; SET @sav_slave_transaction_retries = @@global.slave_transaction_retries; -SET @@global.innodb_lock_wait_timeout =1; +SET @@global.innodb_lock_wait_timeout =5; SET @@global.slave_transaction_retries=0; include/start_slave.inc connection aux_slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_auditing.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_auditing.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_auditing.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_auditing.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,64 @@ +include/master-slave.inc +[connection master] +drop table if exists t1; +connection slave; +reset master; +CREATE TABLE IF NOT EXISTS mysql.server_audit_filters ( +filtername char(80) COLLATE utf8_bin NOT NULL DEFAULT '', +rule longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT 'true' CHECK (json_valid(rule)), +CONSTRAINT c_filtername UNIQUE (filtername) +) ENGINE=Aria; +CREATE TABLE IF NOT EXISTS mysql.server_audit_users (host char(60) COLLATE utf8_bin NOT NULL DEFAULT '', +user char(80) COLLATE utf8_bin NOT NULL DEFAULT '', +filtername char(80) NOT NULL DEFAULT '', +CONSTRAINT c_host_user UNIQUE (host, user) +) ENGINE=Aria; +INSERT INTO mysql.server_audit_filters VALUES ('ignore_sys', '{"ignore_tables" : "mysql.*"}'); +INSERT INTO mysql.server_audit_users VALUES ('%','','ignore_sys'); +INSERT INTO mysql.server_audit_users VALUES ('%','root','ignore_sys'); +install plugin server_audit soname 'server_audit2'; +set global server_audit_logging=on; +connection master; +create table t1 (a int); +insert into t1 values (1); +truncate t1; +drop table t1; +connection slave; +set global server_audit_logging=off; +truncate mysql.server_audit_filters; +truncate mysql.server_audit_users; +INSERT INTO mysql.server_audit_filters VALUES ('no_logging','false'); +INSERT INTO mysql.server_audit_users VALUES ('%','','no_logging'); +set global server_audit_logging=on; +connection master; +create table t1 (a int); +insert into t1 values (1); +truncate t1; +drop table t1; +connection slave; +set global server_audit_logging=off; +uninstall plugin server_audit; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +truncate mysql.server_audit_filters; +truncate mysql.server_audit_users; +TIME,HOSTNAME,,,0,0,AUDIT_CONFIG,,file_path=server_audit.log,0 +TIME,HOSTNAME,,,0,0,AUDIT_CONFIG,,rotate_size=1000000,0 +TIME,HOSTNAME,,,0,0,AUDIT_CONFIG,,file_rotations=9,0 +TIME,HOSTNAME,root,localhost,ID,0,AUDIT_CONFIG,test,logging=ON,0 +TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_logging=on',0 +TIME,HOSTNAME,,,ID,ID,CREATE,test,t1, +TIME,HOSTNAME,,,ID,ID,WRITE,test,t1, +TIME,HOSTNAME,,,ID,ID,CREATE,test,t1, +TIME,HOSTNAME,,,ID,ID,DROP,test,t1, +TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select master_pos_wait(\'master-bin.#', POS, 300, \'\')',0 +TIME,HOSTNAME,root,localhost,ID,0,AUDIT_CONFIG,test,logging=OFF,0 +TIME,HOSTNAME,,,0,0,AUDIT_CONFIG,,file_path=server_audit.log,0 +TIME,HOSTNAME,,,0,0,AUDIT_CONFIG,,rotate_size=1000000,0 +TIME,HOSTNAME,,,0,0,AUDIT_CONFIG,,file_rotations=9,0 +TIME,HOSTNAME,root,localhost,ID,0,AUDIT_CONFIG,test,logging=ON,0 +TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'set global server_audit_logging=on',0 +TIME,HOSTNAME,root,localhost,ID,ID,QUERY,test,'select master_pos_wait(\'master-bin.#', POS, 300, \'\')',0 +TIME,HOSTNAME,root,localhost,ID,0,AUDIT_CONFIG,test,logging=OFF,0 +connection master; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_loaddata.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_loaddata.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_loaddata.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_loaddata.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,38 @@ +include/master-slave.inc +[connection master] +connection master; +SET @save_binlog_stmt_cache_size= @@GLOBAL.binlog_stmt_cache_size; +SET GLOBAL binlog_stmt_cache_size= 4096; +CALL mtr.add_suppression('"No space left on device".*An incident event is written to binary log'); +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=MyISAM; +FLUSH STATUS; +SHOW STATUS LIKE "binlog_stmt_cache%"; +Variable_name Value +Binlog_stmt_cache_disk_use 0 +Binlog_stmt_cache_use 0 +SET @old_dbug= @@SESSION.debug_dbug; +SET SESSION debug_dbug="+d,load_data_binlog_cache_error"; +LOAD DATA CONCURRENT LOCAL INFILE 'std_data/bug30435_5k.txt' + REPLACE INTO TABLE t1 (a); +ERROR HY000: Error writing file '' (Errcode: 28 "No space left on device") +SET SESSION debug_dbug= @old_dbug; +SHOW STATUS LIKE "binlog_stmt_cache%"; +Variable_name Value +Binlog_stmt_cache_disk_use 1 +Binlog_stmt_cache_use 1 +SELECT IF(COUNT(*) > 0 AND COUNT(*) < 5000, +"ok", +CONCAT("ERROR! Row count ", COUNT(*), " not as expected for partially executed query")) +AS check_result +FROM t1; +check_result +ok +connection slave; +include/wait_for_slave_sql_error_and_skip.inc [errno=1590] +SELECT COUNT(*) FROM t1; +COUNT(*) +0 +connection master; +SET GLOBAL binlog_stmt_cache_size= @save_binlog_stmt_cache_size; +DROP TABLE t1; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_row.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_row.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_row.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_cache_disk_full_row.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,51 @@ +include/master-slave.inc +[connection master] +connection master; +SET @save_binlog_stmt_cache_size= @@GLOBAL.binlog_stmt_cache_size; +SET GLOBAL binlog_stmt_cache_size= 4096; +CALL mtr.add_suppression('"No space left on device".*An incident event is written to binary log'); +CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(255)) ENGINE=MyISAM; +FLUSH STATUS; +SHOW STATUS LIKE "binlog_stmt_cache%"; +Variable_name Value +Binlog_stmt_cache_disk_use 0 +Binlog_stmt_cache_use 0 +INSERT INTO t1 VALUES (0, CONCAT("?", "-", REPEAT("x", 200))); +INSERT INTO t1 SELECT a+1, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+2, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+4, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+8, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+16, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+32, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+64, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+128, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +SHOW STATUS LIKE "binlog_stmt_cache%"; +Variable_name Value +Binlog_stmt_cache_disk_use 2 +Binlog_stmt_cache_use 9 +SET @old_dbug= @@SESSION.debug_dbug; +SET SESSION debug_dbug="+d,simulate_disk_full_at_flush_pending"; +INSERT INTO t1 SELECT a+256, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +ERROR HY000: Error writing file '' (Errcode: 28 "No space left on device") +SET SESSION debug_dbug= @old_dbug; +SHOW STATUS LIKE "binlog_stmt_cache%"; +Variable_name Value +Binlog_stmt_cache_disk_use 3 +Binlog_stmt_cache_use 10 +SELECT IF(COUNT(*) > 256 AND COUNT(*) < 512, +"ok", +CONCAT("ERROR! Row count ", COUNT(*), " not as expected for partially executed query")) +AS check_result +FROM t1; +check_result +ok +ALTER TABLE t1 COMMENT ''; +connection slave; +include/wait_for_slave_sql_error_and_skip.inc [errno=1590] +SELECT COUNT(*) FROM t1; +COUNT(*) +256 +connection master; +SET GLOBAL binlog_stmt_cache_size= @save_binlog_stmt_cache_size; +DROP TABLE t1; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_binlog_dump_slave_gtid_state_info.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_dump_slave_gtid_state_info.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_binlog_dump_slave_gtid_state_info.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_binlog_dump_slave_gtid_state_info.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] connection master; +SET @org_log_warnings=@@GLOBAL.LOG_WARNINGS; SET GLOBAL LOG_WARNINGS=2; connection slave; include/stop_slave.inc @@ -8,6 +9,7 @@ include/start_slave.inc connection master; "Test Case 1: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('')" +include/wait_for_pattern_in_file.inc FOUND 1 /using_gtid\(1\), gtid\(\'\'\).*/ in mysqld.1.err connection slave; include/stop_slave.inc @@ -15,6 +17,7 @@ include/start_slave.inc connection master; "Test Case 2: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(0), gtid('')" +include/wait_for_pattern_in_file.inc FOUND 1 /using_gtid\(0\), gtid\(\'\'\).*/ in mysqld.1.err CREATE TABLE t (f INT) ENGINE=INNODB; INSERT INTO t VALUES(10); @@ -25,6 +28,7 @@ include/start_slave.inc connection master; "Test Case 3: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('0-1-2')" +include/wait_for_pattern_in_file.inc FOUND 1 /using_gtid\(1\), gtid\(\'0-1-2\'\).*/ in mysqld.1.err SET @@SESSION.gtid_domain_id=10; INSERT INTO t VALUES(20); @@ -35,13 +39,14 @@ include/start_slave.inc connection master; "Test Case 4: Start binlog_dump to slave_server(#), pos(master-bin.000001, ###), using_gtid(1), gtid('0-1-2,10-1-1')" +include/wait_for_pattern_in_file.inc FOUND 1 /using_gtid\(1\), gtid\(\'0-1-2,10-1-1\'\).*/ in mysqld.1.err "===== Clean up =====" +SET GLOBAL LOG_WARNINGS=@org_log_warnings; connection slave; include/stop_slave.inc CHANGE MASTER TO MASTER_USE_GTID=no; include/start_slave.inc connection master; DROP TABLE t; -SET GLOBAL LOG_WARNINGS=default; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result 2024-08-03 07:29:58.000000000 +0000 @@ -191,10 +191,10 @@ #010909 4:46:40 server id # end_log_pos # CRC32 XXX Binlog checkpoint slave-bin.000001 # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-1 ddl -/*!100101 SET @@session.skip_parallel_replication=0*//*!*/; -/*!100001 SET @@session.gtid_domain_id=0*//*!*/; -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=1*//*!*/; +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= use `test`/*!*/; @@ -211,7 +211,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 ddl -/*!100001 SET @@session.gtid_seq_no=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -219,8 +219,8 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-2-3 ddl -/*!100001 SET @@session.server_id=2*//*!*/; -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.server_id=2*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -228,8 +228,8 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 trans -/*!100001 SET @@session.server_id=1*//*!*/; -/*!100001 SET @@session.gtid_seq_no=3*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; START TRANSACTION /*!*/; # at # @@ -247,7 +247,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 trans -/*!100001 SET @@session.gtid_seq_no=4*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; START TRANSACTION /*!*/; # at # @@ -265,7 +265,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 trans -/*!100001 SET @@session.gtid_seq_no=5*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=5*//*!*/; START TRANSACTION /*!*/; # at # @@ -283,7 +283,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-6 trans -/*!100001 SET @@session.gtid_seq_no=6*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=6*//*!*/; START TRANSACTION /*!*/; # at # @@ -301,7 +301,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 trans -/*!100001 SET @@session.gtid_seq_no=7*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=7*//*!*/; START TRANSACTION /*!*/; # at # @@ -319,7 +319,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 ddl -/*!100001 SET @@session.gtid_seq_no=8*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=8*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -327,7 +327,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 trans -/*!100001 SET @@session.gtid_seq_no=9*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=9*//*!*/; START TRANSACTION /*!*/; # at # @@ -345,7 +345,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 trans -/*!100001 SET @@session.gtid_seq_no=10*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=10*//*!*/; START TRANSACTION /*!*/; # at # @@ -363,7 +363,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-11 trans -/*!100001 SET @@session.gtid_seq_no=11*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=11*//*!*/; START TRANSACTION /*!*/; # at # @@ -381,7 +381,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-12 ddl -/*!100001 SET @@session.gtid_seq_no=12*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=12*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; @@ -389,7 +389,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-13 trans -/*!100001 SET @@session.gtid_seq_no=13*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=13*//*!*/; START TRANSACTION /*!*/; # at # @@ -407,7 +407,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-14 trans -/*!100001 SET @@session.gtid_seq_no=14*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=14*//*!*/; START TRANSACTION /*!*/; # at # @@ -425,7 +425,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-15 trans -/*!100001 SET @@session.gtid_seq_no=15*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=15*//*!*/; START TRANSACTION /*!*/; # at # @@ -443,7 +443,7 @@ /*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-16 ddl -/*!100001 SET @@session.gtid_seq_no=16*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=16*//*!*/; # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= SET TIMESTAMP=1000000000/*!*/; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_change_master.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_change_master.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_change_master.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_change_master.result 2024-08-03 07:29:58.000000000 +0000 @@ -26,9 +26,4 @@ CHANGE MASTER TO MASTER_USER='root', MASTER_SSL=0, MASTER_SSL_CA='', MASTER_SSL_CERT='', MASTER_SSL_KEY='', MASTER_SSL_CRL='', MASTER_SSL_CRLPATH=''; CHANGE MASTER TO MASTER_USER='root', MASTER_PASSWORD='', MASTER_SSL=0; -"Usage of CURRENT_POS in CHANGE MASTER MASTER_USE_GTID is dreprecated. -CHANGE MASTER TO MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead -CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_change_master_demote.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_change_master_demote.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_change_master_demote.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_change_master_demote.result 2024-08-03 07:29:58.000000000 +0000 @@ -58,6 +58,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # # Test Case 2: If gtid_slave_pos is empty, gtid_binlog_pos will # completely overwrite it with MASTER_DEMOTE_TO_SLAVE=1. @@ -124,6 +125,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # # Test Case 3: Using a single domain id, if neither gtid_slave_pos nor # gtid_binlog_pos are empty, and gtid_binlog_pos is more recent, then @@ -183,6 +185,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # # Test Case 4: If gtid_slave_pos and gtid_binlog_pos are equivalent, # MASTER_DEMOTE_TO_SLAVE=1 will not change gtid_slave_pos. @@ -244,6 +247,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # # Test Case 5: If a new domain id is added into gtid_binlog_pos while # gtid_slave_pos already has a state, MASTER_DEMOTE_TO_SLAVE=1 will @@ -308,6 +312,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # # Test Case 6: If gtid_slave_pos has multiple GTID positions and # gtid_binlog_pos contains updates on existing domain ids, new @@ -390,6 +395,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # # Test Case 7: If MASTER_DEMOTE_TO_SLAVE=1 is combined with # IGNORE_DOMAIN_IDS such that gtid_binlog_pos has more recent GTIDs @@ -455,6 +461,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # # Test Case 8: If gtid_binlog_pos is more recent than gtid_slave_pos, # and MASTER_DEMOTE_TO_SLAVE=1 is combined with a later call to @@ -493,6 +500,8 @@ Warnings: Note 1278 It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mariadbd restart # Slave needs time to start and stop automatically +# Waiting for both SQL and IO threads to have started.. +# Waiting for Slave SQL and IO threads to be killed.. # Validating neither SQL nor IO threads are running.. # ..success # Clean slave state of master @@ -556,6 +565,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # Demote master to slave with the more recent gtid_slave_pos connection master; CHANGE MASTER TO master_host='127.0.0.1', master_port=SLAVE_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; @@ -619,6 +629,7 @@ connection master; connection slave; CHANGE MASTER TO master_host='127.0.0.1', master_port=MASTER_PORT, master_user='root', master_use_gtid=slave_pos, master_demote_to_slave=1; +connection master; # Tag gtid_slave_pos now (before binlog updates) for later comparison connection master; # In domain 1, make gtid_slave_pos < gtid_binlog_pos @@ -674,6 +685,23 @@ CHANGE MASTER TO master_host='127.0.0.1', master_port=SLAVE_PORT, master_user='root', master_use_gtid=Slave_Pos, master_demote_to_slave=invalid; ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'invalid' at line 1 # +# MDEV-31768 +# Ensure MASTER_DEMOTE_TO_REPLICA aliases MASTER_DEMOTE_TO_SLAVE +# +connection slave; +RESET MASTER; +include/reset_slave.inc +CREATE TABLE t_mdev_31768 (a int); +CHANGE MASTER TO master_use_gtid=Replica_Pos, master_demote_to_replica=1; +# Validating alias MASTER_DEMOTE_TO_REPLICA provides intended behavior.. +# ..success +DROP TABLE t_mdev_31768; +RESET MASTER; +include/reset_slave.inc +# Clear primary binlog state to match replica +connection master; +RESET MASTER; +# # Cleanup # connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_circular_semi_sync.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_circular_semi_sync.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_circular_semi_sync.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_circular_semi_sync.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,7 @@ include/master-slave.inc [connection master] +connection server_2; +call mtr.add_suppression("Timeout waiting for reply of binlog"); # Master server_1 and Slave server_2 initialization ... connection server_2; include/stop_slave.inc @@ -40,6 +42,8 @@ INSERT INTO t1(a) VALUES (2); include/save_master_gtid.inc connection server_1; +include/stop_slave.inc +include/start_slave.inc # # the successful sync is a required proof # diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_connection.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_connection.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_connection.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_connection.result 2024-08-03 07:29:58.000000000 +0000 @@ -6,7 +6,7 @@ CHANGE MASTER TO MASTER_USER= '', MASTER_PASSWORD= ''; START SLAVE; include/wait_for_slave_io_error.inc [errno=1045, 1593] -include/stop_slave.inc +include/stop_slave_sql.inc CHANGE MASTER TO MASTER_USER= 'root', MASTER_PASSWORD= ''; START SLAVE; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_deadlock_show_slave_status.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_deadlock_show_slave_status.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_deadlock_show_slave_status.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_deadlock_show_slave_status.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,66 @@ +include/master-slave.inc +[connection master] +# +# Initialize test data +connection master; +create table t1 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/stop_slave.inc +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); +set @save_parallel_threads= @@global.slave_parallel_threads; +set @save_parallel_mode= @@global.slave_parallel_mode; +set @save_transaction_retries= @@global.slave_transaction_retries; +set @save_innodb_lock_wait_timeout= @@global.innodb_lock_wait_timeout; +set @@global.slave_parallel_threads= 2; +set @@global.slave_parallel_mode= CONSERVATIVE; +set @@global.slave_transaction_retries= 0; +set @@global.innodb_lock_wait_timeout= 10; +# Grabbing lock on innodb row to force future replication transaction to wait (and eventually timeout) +BEGIN; +select * from t1 where a=1 for update; +a +1 +connection master; +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +update t1 set a=2 where a=1; +SET @commit_id= 10001; +insert into t1 values (3); +set @@session.debug_dbug= @old_dbug; +connection slave; +start slave; +# Waiting for first transaction to start (and be held at innodb row lock).. +# Waiting for next transaction to start and hold at do_gco_wait().. +connection slave1; +set @@session.debug_dbug="+d,hold_sss_with_err_lock"; +show slave status; +connection slave; +set debug_sync="now wait_for sss_got_err_lock"; +kill ; +set debug_sync="now signal sss_continue"; +connection slave1; +# Waiting for SHOW SLAVE STATUS to complete.. +# ..done +connection slave; +ROLLBACK; +include/wait_for_slave_sql_error.inc [errno=1927] +# +# Cleanup +connection master; +drop table t1; +include/save_master_gtid.inc +connection slave; +set debug_sync= "RESET"; +set @@global.slave_parallel_threads= @save_parallel_threads; +set @@global.slave_parallel_mode= @save_parallel_mode; +set @@global.slave_transaction_retries= @save_transaction_retries; +set @@global.innodb_lock_wait_timeout= @save_innodb_lock_wait_timeout; +start slave sql_thread; +include/sync_with_master_gtid.inc +include/rpl_end.inc +# End of rpl_deadlock_show_slave_status.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_delayed_slave.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_delayed_slave.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_delayed_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_delayed_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -70,6 +70,9 @@ # CHANGE MASTER TO MASTER_DELAY = 2*T include/start_slave.inc connection master; +INSERT INTO t1 VALUES ('Syncing slave', 5); +connection slave; +connection master; INSERT INTO t1 VALUES (delay_on_slave(1), 6); Warnings: Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system variable that may have a different value on the slave diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_domain_id_filter_io_crash.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_io_crash.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_domain_id_filter_io_crash.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_io_crash.result 2024-08-03 07:29:58.000000000 +0000 @@ -11,6 +11,7 @@ i 1 connection slave; +include/save_master_gtid.inc connection slave; call mtr.add_suppression("Slave I/O: Relay log write failure: could not queue event from master.*"); # Case 0 : Start slave with IGNORE_DOMAIN_IDS=(), then restart @@ -24,6 +25,7 @@ IGNORE_DOMAIN_IDS (BEFORE) : CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : SET @saved_dbug = @@GLOBAL.debug_dbug; @@ -33,6 +35,7 @@ INSERT INTO t1 VALUES(2); INSERT INTO t1 VALUES(3); COMMIT; +include/save_master_gtid.inc SELECT * FROM t1; i 1 @@ -46,6 +49,7 @@ SET @@global.debug_dbug=@saved_dbug; START SLAVE io_thread; include/wait_for_slave_io_to_start.inc +include/sync_with_master_gtid.inc SELECT * FROM t1; i 1 @@ -59,6 +63,7 @@ IGNORE_DOMAIN_IDS (BEFORE) : CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : 1 SET @@global.debug_dbug="d,kill_slave_io_before_commit"; @@ -67,6 +72,7 @@ INSERT INTO t1 VALUES(4); INSERT INTO t1 VALUES(5); COMMIT; +include/save_master_gtid.inc SELECT * FROM t1; i 1 @@ -84,6 +90,7 @@ SET @@global.debug_dbug=@saved_dbug; START SLAVE io_thread; include/wait_for_slave_io_to_start.inc +include/sync_with_master_gtid.inc SELECT * FROM t1; i 1 @@ -97,6 +104,7 @@ IGNORE_DOMAIN_IDS (BEFORE) : 1 CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : SET @@global.debug_dbug="d,kill_slave_io_before_commit"; @@ -114,6 +122,7 @@ INSERT INTO t1 VALUES(10); INSERT INTO t1 VALUES(11); COMMIT; +include/save_master_gtid.inc SELECT * FROM t1; i 1 @@ -135,11 +144,12 @@ 2 3 SET @@global.debug_dbug=@saved_dbug; -include/stop_slave.inc +include/stop_slave_sql.inc DO_DOMAIN_IDS (BEFORE) : IGNORE_DOMAIN_IDS (BEFORE) : CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : 1 SELECT * FROM t1; @@ -157,6 +167,7 @@ IGNORE_DOMAIN_IDS (BEFORE) : 1 CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : 1 SET @@global.debug_dbug="d,kill_slave_io_before_commit"; @@ -166,6 +177,7 @@ INSERT INTO t1 VALUES(12); INSERT INTO t1 VALUES(13); COMMIT; +include/save_master_gtid.inc START TRANSACTION; INSERT INTO t1 VALUES(14); INSERT INTO t1 VALUES(15); @@ -204,11 +216,16 @@ 10 11 SET @@global.debug_dbug=@saved_dbug; -include/stop_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave_sql.inc DO_DOMAIN_IDS (BEFORE) : IGNORE_DOMAIN_IDS (BEFORE) : 1 CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; +connection master; +include/save_master_gtid.inc +connection slave; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : SELECT * FROM t1; @@ -230,6 +247,7 @@ IGNORE_DOMAIN_IDS (BEFORE) : CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : 1 SET @@global.debug_dbug="d,kill_slave_io_after_2_events"; @@ -239,6 +257,7 @@ INSERT INTO t1 VALUES(18); INSERT INTO t1 VALUES(19); COMMIT; +include/save_master_gtid.inc START TRANSACTION; INSERT INTO t1 VALUES(20); INSERT INTO t1 VALUES(21); @@ -287,11 +306,16 @@ 16 17 SET @@global.debug_dbug=@saved_dbug; -include/stop_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave_sql.inc DO_DOMAIN_IDS (BEFORE) : IGNORE_DOMAIN_IDS (BEFORE) : 1 CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; +connection master; +include/save_master_gtid.inc +connection slave; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : SELECT * FROM t1; @@ -317,6 +341,7 @@ IGNORE_DOMAIN_IDS (BEFORE) : CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : SET @@global.debug_dbug="d,kill_slave_io_after_2_events"; @@ -335,6 +360,7 @@ INSERT INTO t1 VALUES(28); INSERT INTO t1 VALUES(29); COMMIT; +include/save_master_gtid.inc SELECT * FROM t1; i 1 @@ -384,11 +410,12 @@ 22 23 SET @@global.debug_dbug=@saved_dbug; -include/stop_slave.inc +include/stop_slave_sql.inc DO_DOMAIN_IDS (BEFORE) : IGNORE_DOMAIN_IDS (BEFORE) : CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; include/start_slave.inc +include/sync_with_master_gtid.inc DO_DOMAIN_IDS (AFTER) : IGNORE_DOMAIN_IDS (AFTER) : 1 SELECT * FROM t1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_domain_id_filter_master_crash.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_master_crash.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_domain_id_filter_master_crash.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_master_crash.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,9 +1,6 @@ include/master-slave.inc [connection master] connection master; -call mtr.add_suppression("mysqld: Table '.*gtid_slave_pos' is marked as crashed and should be repaired"); -call mtr.add_suppression("Checking table: './mysql/gtid_slave_pos'"); -call mtr.add_suppression("mysql.gtid_slave_pos: 1 client is using or hasn't closed the table properly"); SET @@session.gtid_domain_id= 0; create table ti (a int auto_increment primary key) engine=innodb; create table tm (a int auto_increment primary key) engine=myisam; @@ -38,7 +35,8 @@ include/rpl_start_server.inc [server_number=1] # Master has restarted successfully connection slave; -include/stop_slave.inc +include/stop_slave_sql.inc +include/stop_slave_io.inc include/start_slave.inc select * from ti; a diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_domain_id_filter_restart.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_restart.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_domain_id_filter_restart.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_domain_id_filter_restart.result 2024-08-03 07:29:58.000000000 +0000 @@ -21,8 +21,9 @@ SELECT * FROM t2; i 1 +include/save_master_gtid.inc connection slave; -connection slave; +include/sync_with_master_gtid.inc SELECT * FROM t1; i 1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_extra_col_master_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -657,7 +657,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-103. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-104. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos CREATE TABLE t15 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5) ) ENGINE='InnoDB'; @@ -697,7 +697,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-104. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-105. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos *** Drop t15 *** DROP TABLE t15; @@ -716,7 +716,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-105. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-106. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos CREATE TABLE t16 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5) ) ENGINE='InnoDB'; @@ -756,7 +756,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-106. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-107. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos *** Drop t16 *** DROP TABLE t16; @@ -775,7 +775,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-107. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-108. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos CREATE TABLE t17 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5) ) ENGINE='InnoDB'; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_extra_col_master_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -657,7 +657,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-103. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-104. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos CREATE TABLE t15 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5) ) ENGINE='MyISAM'; @@ -697,7 +697,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-104. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-105. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos *** Drop t15 *** DROP TABLE t15; @@ -716,7 +716,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-105. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-106. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos CREATE TABLE t16 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5) ) ENGINE='MyISAM'; @@ -756,7 +756,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-106. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-107. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos *** Drop t16 *** DROP TABLE t16; @@ -775,7 +775,7 @@ STOP SLAVE; include/reset_slave.inc Warnings: -Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-107. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos +Warning 1948 Specified value for @@gtid_slave_pos contains no value for replication domain 0. This conflicts with the binary log which contains GTID 0-2-108. If MASTER_GTID_POS=CURRENT_POS is used, the binlog position will override the new value of @@gtid_slave_pos CREATE TABLE t17 (c1 INT PRIMARY KEY, c4 BLOB, c5 CHAR(5) ) ENGINE='MyISAM'; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_fail_register.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_fail_register.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_fail_register.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_fail_register.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,14 +1,15 @@ include/master-slave.inc [connection master] connection slave; +CALL mtr.add_suppression("Slave I/O: Master command COM_REGISTER_SLAVE failed: Debug Induced Error"); set @old_dbug=@@global.debug_dbug; set global debug_dbug='d,fail_com_register_slave'; stop slave; reset slave; include/wait_for_slave_to_stop.inc start slave; -stop slave; -include/wait_for_slave_to_stop.inc +include/wait_for_slave_io_error.inc [errno=1597] +include/stop_slave_sql.inc set global debug_dbug=@old_dbug; connection master; kill DUMP_THREAD; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_get_lock.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_get_lock.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_get_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_get_lock.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ include/master-slave.inc [connection master] -CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +SET GLOBAL LOG_WARNINGS=4; create table t1(n int); insert into t1 values(get_lock("lock",2)); disconnect master; @@ -35,4 +35,5 @@ connection master1; drop table t1; connection slave; +connection default; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gis_user_var.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gis_user_var.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gis_user_var.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gis_user_var.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,21 @@ +include/master-slave.inc +[connection master] +# +# +# +connection master; +SET @p=POINT(1,1); +CREATE TABLE t1 AS SELECT @p AS p; +connection slave; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `p` point DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +SELECT ST_AsWKT(p) FROM t1; +ST_AsWKT(p) +POINT(1 1) +connection master; +DROP TABLE t1; +connection slave; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_basic.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_basic.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -69,8 +69,6 @@ connection server_4; CHANGE MASTER TO master_host = '127.0.0.1', master_port = MASTER_PORT, MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/start_slave.inc SELECT * FROM t1 ORDER BY a; a b @@ -91,8 +89,6 @@ include/stop_slave.inc CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_4, MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/start_slave.inc connection server_4; UPDATE t2 SET b="j1a" WHERE a=5; @@ -121,8 +117,6 @@ connection server_3; CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_4, MASTER_USE_GTID=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/start_slave.inc include/sync_with_master_gtid.inc SELECT * FROM t2 ORDER BY a; @@ -188,6 +182,13 @@ NULL Warnings: Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated +SET sql_log_bin= 0; +CREATE TABLE t1 AS SELECT MASTER_POS_WAIT(@binlog_file, 4, 0); +SELECT BINLOG_GTID_POS(@binlog_file, 4); +BINLOG_GTID_POS(@binlog_file, 4) +NULL +DROP TABLE t1; +SET sql_log_bin= 1; *** Some tests of @@GLOBAL.gtid_binlog_state *** connection server_2; include/sync_with_master_gtid.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_crash.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_crash.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_crash.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_crash.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,7 @@ call mtr.add_suppression("Checking table:"); call mtr.add_suppression("client is using or hasn't closed the table properly"); call mtr.add_suppression("Table .* is marked as crashed and should be repaired"); +call mtr.add_suppression("Could not read packet:.* errno: 11"); flush tables; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_delete_domain.result 2024-08-03 07:29:58.000000000 +0000 @@ -52,7 +52,7 @@ .. con='slave' warn='1' qlog='1' rlog='1' aborterr='1' ...==== BEGIN include/wait_for_slave_param.inc [Slave_SQL_Running] ==== ... con='slave' warn='1' qlog='1' rlog='1' aborterr='1' -Waiting until 'Slave_SQL_Running' = 'Yes' [$slave_error_param='1'] +Waiting until 'Slave_SQL_Running' = 'Yes' [$slave_error_param=''] [connection slave] ...==== END include/wait_for_slave_param.inc [Slave_SQL_Running] ==== ... con='slave' warn='1' qlog='1' rlog='1' aborterr='1' diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_errorhandling.result 2024-08-03 07:29:58.000000000 +0000 @@ -75,8 +75,6 @@ SET sql_log_bin = 1; INSERT INTO t1 VALUES (3); CHANGE MASTER TO master_use_gtid=current_pos; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead BEGIN; SET GLOBAL gtid_slave_pos = "100-100-100"; ERROR 25000: You are not allowed to execute this command in a transaction diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_errorlog.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_errorlog.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_errorlog.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_errorlog.result 2024-08-03 07:29:58.000000000 +0000 @@ -23,7 +23,8 @@ SET sql_log_bin=1; START SLAVE; include/wait_for_slave_sql_error.inc [errno=1062] -include/stop_slave.inc +include/wait_for_slave_io_to_start.inc +include/stop_slave_io.inc SET GLOBAL gtid_slave_pos= "0-1-100"; include/start_slave.inc SELECT * FROM t1 ORDER BY a; @@ -39,7 +40,7 @@ SET debug_dbug= @dbug_save; connection slave; include/wait_for_slave_sql_error.inc [errno=1590] -include/stop_slave.inc +include/stop_slave_io.inc SET sql_slave_skip_counter=1; include/start_slave.inc SELECT * FROM t1 ORDER BY a; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_grouping.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_grouping.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_grouping.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_grouping.result 2024-08-03 07:29:58.000000000 +0000 @@ -50,5 +50,4 @@ include/start_slave.inc connection master; DROP TABLE t; -SET GLOBAL LOG_WARNINGS=default; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_header_valid.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_header_valid.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_header_valid.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_header_valid.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,146 @@ +include/master-slave.inc +[connection master] +# +# Initialize test data +connection master; +create table t1 (a int) engine=innodb; +include/save_master_gtid.inc +set @@SESSION.debug_dbug= "+d,binlog_force_commit_id"; +connection slave; +set SQL_LOG_BIN= 0; +call mtr.add_suppression('Found invalid event in binary log'); +call mtr.add_suppression('Slave SQL.*Relay log read failure: Could not parse relay log event entry.* 1594'); +set SQL_LOG_BIN= 1; +include/sync_with_master_gtid.inc +include/stop_slave.inc +include/start_slave.inc +# +# Test FL_PREPARED_XA +connection master; +set @@SESSION.debug_dbug= "+d,negate_xid_from_gtid"; +set @commit_id= 100; +XA START 'x1'; +insert into t1 values (1); +XA END 'x1'; +XA PREPARE 'x1'; +set @@SESSION.debug_dbug= "-d,negate_xid_from_gtid"; +XA COMMIT 'x1'; +include/save_master_gtid.inc +# Waiting for slave to find invalid event.. +connection slave; +include/wait_for_slave_sql_error.inc [errno=1594] +STOP SLAVE IO_THREAD; +# Reset master binlogs (as there is an invalid event) and slave state +connection master; +RESET MASTER; +connection slave; +RESET MASTER; +RESET SLAVE; +set @@global.gtid_slave_pos=""; +include/start_slave.inc +# +# Test FL_COMPLETED_XA +connection master; +set @commit_id= 101; +XA START 'x1'; +insert into t1 values (2); +XA END 'x1'; +XA PREPARE 'x1'; +set @@SESSION.debug_dbug= "+d,negate_xid_from_gtid"; +XA COMMIT 'x1'; +set @@SESSION.debug_dbug= "-d,negate_xid_from_gtid"; +include/save_master_gtid.inc +# Waiting for slave to find invalid event.. +connection slave; +include/wait_for_slave_sql_error.inc [errno=1594] +STOP SLAVE IO_THREAD; +# Cleanup hanging XA PREPARE on slave +set statement SQL_LOG_BIN=0 for XA COMMIT 'x1'; +# Reset master binlogs (as there is an invalid event) and slave state +connection master; +RESET MASTER; +connection slave; +RESET MASTER; +RESET SLAVE; +set @@global.gtid_slave_pos=""; +include/start_slave.inc +# +# Test Missing xid.data (but has format id and length description parts) +connection master; +set @commit_id= 101; +XA START 'x1'; +insert into t1 values (1); +XA END 'x1'; +XA PREPARE 'x1'; +set @@SESSION.debug_dbug= "+d,negate_xid_data_from_gtid"; +XA COMMIT 'x1'; +set @@SESSION.debug_dbug= "-d,negate_xid_data_from_gtid"; +include/save_master_gtid.inc +# Waiting for slave to find invalid event.. +connection slave; +include/wait_for_slave_sql_error.inc [errno=1594] +STOP SLAVE IO_THREAD; +# Cleanup hanging XA PREPARE on slave +set statement SQL_LOG_BIN=0 for XA COMMIT 'x1'; +# Reset master binlogs (as there is an invalid event) and slave state +connection master; +RESET MASTER; +connection slave; +RESET MASTER; +RESET SLAVE; +set @@global.gtid_slave_pos=""; +include/start_slave.inc +# +# Test FL_EXTRA_MULTI_ENGINE +connection master; +set @old_dbug= @@SESSION.debug_dbug; +set @@SESSION.debug_dbug= "+d,inject_fl_extra_multi_engine_into_gtid"; +set @commit_id= 102; +insert into t1 values (3); +include/save_master_gtid.inc +set @@SESSION.debug_dbug=@old_dbug; +connection slave; +# Waiting for slave to find invalid event.. +include/wait_for_slave_sql_error.inc [errno=1594] +STOP SLAVE IO_THREAD; +# Reset master binlogs (as there is an invalid event) and slave state +connection master; +RESET MASTER; +connection slave; +RESET SLAVE; +RESET MASTER; +set @@global.gtid_slave_pos=""; +include/start_slave.inc +# +# Test FL_COMMIT_ALTER +connection master; +set @old_dbug= @@SESSION.debug_dbug; +set @@SESSION.debug_dbug= "+d,negate_alter_fl_from_gtid"; +set @old_alter_tp= @@SESSION.binlog_alter_two_phase; +set @@SESSION.binlog_alter_two_phase= 1; +alter table t1 add column (nc int); +include/save_master_gtid.inc +set @@SESSION.debug_dbug=@old_dbug; +set @@SESSION.binlog_alter_two_phase=@old_alter_tp; +connection slave; +# Waiting for slave to find invalid event.. +include/wait_for_slave_sql_error.inc [errno=1594] +STOP SLAVE IO_THREAD; +# Reset master binlogs (as there is an invalid event) and slave state +connection master; +RESET MASTER; +connection slave; +SET STATEMENT sql_log_bin=0 FOR alter table t1 add column (nc int); +RESET SLAVE; +RESET MASTER; +set @@global.gtid_slave_pos=""; +include/start_slave.inc +# +# Cleanup +connection master; +drop table t1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/rpl_end.inc +# End of rpl_gtid_header_valid.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_mdev4820.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_mdev4820.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_mdev4820.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_mdev4820.result 2024-08-03 07:29:58.000000000 +0000 @@ -45,8 +45,6 @@ connection server_1; CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_2, master_user= 'root', master_use_gtid=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead START SLAVE; connection server_2; INSERT INTO t1 VALUES (11); @@ -76,8 +74,6 @@ INSERT INTO t1 VALUES (22); CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1, master_user= 'root', master_use_gtid=CURRENT_POS; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead START SLAVE; SET sql_log_bin= 0; CALL mtr.add_suppression("which is not in the master's binlog. Since the master's binlog contains GTIDs with higher sequence numbers, it probably means that the slave has diverged"); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_slave_filtering.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_slave_filtering.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_slave_filtering.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_slave_filtering.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,78 @@ +include/rpl_init.inc [topology=1->2->3] +*** Test GTID master switch in a topology with filtered events. +*** With --gtid-ignore-duplicate and --gtid-strict-mode, should allow +*** GTID connect at a GTID position that is filtered on the new master. +connection server_1; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,1); +CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t3 VALUES (1,1); +INSERT INTO t1 VALUES (2,1); +INSERT INTO t3 VALUES (2,1); +include/save_master_gtid.inc +connection server_2; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1,2); +include/sync_with_master_gtid.inc +include/save_master_gtid.inc +connection server_3; +include/sync_with_master_gtid.inc +*** Promote 3 as new master, demote 2 as slave of 3. +*** GTID position of 2 in domain 0 is filtered on 3. +connection server_2; +include/stop_slave.inc +connection server_3; +include/stop_slave.inc +CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1, +MASTER_USE_GTID=SLAVE_POS; +connection server_2; +CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_3, +MASTER_USE_GTID=SLAVE_POS; +include/start_slave.inc +connection server_3; +include/start_slave.inc +connection server_1; +INSERT INTO t1 VALUES (3,1); +INSERT INTO t3 VALUES (3,1); +include/save_master_gtid.inc +connection server_3; +INSERT INTO t2 VALUES (2,2); +include/sync_with_master_gtid.inc +include/save_master_gtid.inc +connection server_2; +include/sync_with_master_gtid.inc +SELECT * FROM t1 ORDER BY a; +a b +1 1 +2 1 +3 1 +SELECT * FROM t3 ORDER BY a; +ERROR 42S02: Table 'test.t3' doesn't exist +SELECT * FROM t2 ORDER BY a; +a b +1 2 +2 2 +*** Restore original topology. +connection server_3; +include/stop_slave.inc +connection server_2; +include/stop_slave.inc +CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_1, +MASTER_USE_GTID=SLAVE_POS; +include/start_slave.inc +connection server_3; +CHANGE MASTER TO master_host = '127.0.0.1', master_port = SERVER_MYPORT_2, +MASTER_USE_GTID=SLAVE_POS; +include/start_slave.inc +connection server_1; +DROP TABLE t1; +DROP TABLE t3; +include/save_master_gtid.inc +connection server_2; +DROP TABLE t2; +include/sync_with_master_gtid.inc +include/save_master_gtid.inc +connection server_3; +include/sync_with_master_gtid.inc +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_startpos.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_startpos.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_startpos.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_startpos.result 2024-08-03 07:29:58.000000000 +0000 @@ -36,7 +36,7 @@ MASTER_USE_GTID=SLAVE_POS; START SLAVE; include/wait_for_slave_io_error.inc [errno=1236] -include/stop_slave.inc +include/stop_slave_sql.inc CHANGE MASTER TO master_host = '127.0.0.1', master_port = MASTER_PORT, MASTER_LOG_FILE="master-bin.000003", MASTER_LOG_POS=4, MASTER_USE_GTID=NO; include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_gtid_stop_start.result 2024-08-03 07:29:58.000000000 +0000 @@ -111,6 +111,10 @@ 6 7 *** MDEV-4486: Allow to start old-style replication even if mysql.gtid_slave_pos is unavailable +connection server_1; +INSERT INTO t1 VALUES (8); +DELETE FROM t1 WHERE a=8; +connection server_2; connection server_2; include/stop_slave.inc CHANGE MASTER TO master_use_gtid= no; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_heartbeat.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_heartbeat.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,8 +1,9 @@ -connect master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK; -connect slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK; +include/master-slave.inc +[connection master] connection master; reset master; connection slave; +include/stop_slave.inc set @restore_slave_net_timeout= @@global.slave_net_timeout; set @@global.slave_net_timeout= 10; change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root'; @@ -68,5 +69,5 @@ drop table t1; connection slave; set @@global.slave_net_timeout= @restore_slave_net_timeout; -include/stop_slave.inc +include/rpl_end.inc End of tests diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -228,7 +228,7 @@ call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); set sql_log_bin= 1; Heartbeat events are received while sql thread stopped (1 means 'yes'): 1 -include/stop_slave.inc +include/stop_slave_io.inc set sql_log_bin= 0; DROP TABLE t1; set sql_log_bin= 1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_heartbeat_debug.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat_debug.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_heartbeat_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_heartbeat_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -9,8 +9,6 @@ Value 60.000 SET @saved_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,simulate_slave_heartbeat_network_error"; -CALL mtr.add_suppression('SET @master_heartbeat_period to master failed with error'); -CALL mtr.add_suppression('Master command COM_REGISTER_SLAVE failed: failed registering on master, reconnecting to try again'); include/start_slave.inc connection master; drop table if exists t1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_invoked_features.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_invoked_features.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_invoked_features.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_invoked_features.result 2024-08-03 07:29:58.000000000 +0000 @@ -45,14 +45,14 @@ UPDATE t12 SET c = ''; UPDATE t13 SET c = ''; END| -CREATE EVENT e1 ON SCHEDULE EVERY 1 SECOND DISABLE DO +CREATE EVENT e1 ON SCHEDULE EVERY 10 SECOND DISABLE DO BEGIN ALTER EVENT e1 DISABLE; CALL p1(10, ''); END| Warnings: Warning 1105 Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it. -CREATE EVENT e11 ON SCHEDULE EVERY 1 SECOND DISABLE DO +CREATE EVENT e11 ON SCHEDULE EVERY 10 SECOND DISABLE DO BEGIN ALTER EVENT e11 DISABLE; CALL p11(10, ''); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mariadb_slave_capability.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mariadb_slave_capability.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mariadb_slave_capability.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mariadb_slave_capability.result 2024-08-03 07:29:58.000000000 +0000 @@ -6,6 +6,11 @@ include/stop_slave.inc CHANGE MASTER TO MASTER_USE_GTID=NO; include/start_slave.inc +connection master; +# Ensure only the new binlog dump thread is alive (wait for the old one +# to complete its kill) +# And that it has already sent its fake rotate +connection slave; include/stop_slave.inc # Test slave with no capability gets dummy event, which is ignored. set @old_dbug= @@global.debug_dbug; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mark_optimize_tbl_ddl.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mark_optimize_tbl_ddl.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mark_optimize_tbl_ddl.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mark_optimize_tbl_ddl.result 2024-08-03 07:29:58.000000000 +0000 @@ -55,7 +55,6 @@ INSERT INTO t1 VALUES (1), (10), (100), (1000); ALTER TABLE t1 ANALYZE PARTITION p0; Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK ALTER TABLE t1 OPTIMIZE PARTITION p0; Table Op Msg_type Msg_text diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mdev33798.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev33798.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mdev33798.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev33798.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,143 @@ +include/rpl_init.inc [topology=1->2,1->3] +connect server_2b,127.0.0.1,root,,,$SERVER_MYPORT_2; +connection server_2; +SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; +SET @old_parallel_mode= @@GLOBAL.slave_parallel_mode; +SET @old_timeout= @@GLOBAL.lock_wait_timeout; +SET @old_innodb_timeout= @@GLOBAL.innodb_lock_wait_timeout; +include/stop_slave.inc +SET GLOBAL slave_parallel_threads=5; +set global slave_parallel_mode= aggressive; +SET GLOBAL lock_wait_timeout= 86400; +SET GLOBAL innodb_lock_wait_timeout= 86400; +SET STATEMENT sql_log_bin=0 FOR ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +include/start_slave.inc +connection server_1; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0), (8, 0); +connection server_2; +include/stop_slave.inc +connection server_2b; +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; +a b +1 0 +SELECT * FROM t1 WHERE a=5 FOR UPDATE; +a b +5 0 +connection server_1; +SET SESSION gtid_domain_id= 1; +BEGIN; +UPDATE t1 SET b=1 WHERE a=1; +UPDATE t1 SET b=1 WHERE a=7; +COMMIT; +UPDATE t1 SET b=2 WHERE a=3; +SET SESSION gtid_domain_id=2; +BEGIN; +UPDATE t1 SET b=3 WHERE a=5; +UPDATE t1 SET b=3 WHERE a=3; +COMMIT; +UPDATE t1 SET b=4 WHERE a=7; +SET SESSION gtid_domain_id= 0; +include/save_master_gtid.inc +connection server_2; +include/start_slave.inc +connection server_2b; +ROLLBACK; +connection server_2; +include/sync_with_master_gtid.inc +SELECT a, ( +(a=1 AND b=1) OR +(a=3 AND (b=2 OR b=3)) OR +(a=5 AND b=3) OR +(a=7 AND (b=1 OR b=4)) OR +((a MOD 2)=0 AND b=0)) AS `ok` + FROM t1 +ORDER BY a; +a ok +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +connection server_3; +include/sync_with_master_gtid.inc +include/stop_slave.inc +connection server_2; +include/stop_slave.inc +CHANGE MASTER 'm2' to master_port=MYPORT_3 , master_host='127.0.0.1', master_user='root', master_use_gtid=slave_pos; +connection server_1; +SET SESSION gtid_domain_id= 1; +BEGIN; +UPDATE t1 SET b=11 WHERE a=1; +UPDATE t1 SET b=11 WHERE a=7; +COMMIT; +UPDATE t1 SET b=12 WHERE a=3; +SET SESSION gtid_domain_id= 1; +connection server_3; +SET SESSION gtid_domain_id=3; +BEGIN; +UPDATE t1 SET b=13 WHERE a=5; +UPDATE t1 SET b=13 WHERE a=3; +COMMIT; +UPDATE t1 SET b=14 WHERE a=7; +include/save_master_gtid.inc +connection server_2b; +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; +a b +1 1 +SELECT * FROM t1 WHERE a=5 FOR UPDATE; +a b +5 3 +START ALL SLAVES; +Warnings: +Note 1937 SLAVE 'm2' started +Note 1937 SLAVE '' started +connection server_2b; +ROLLBACK; +connection server_1; +include/save_master_gtid.inc +connection server_2; +include/sync_with_master_gtid.inc +connection server_3; +include/save_master_gtid.inc +connection server_2; +include/sync_with_master_gtid.inc +SELECT a, ( +(a=1 AND b=11) OR +(a=3 AND (b=12 OR b=13)) OR +(a=5 AND b=13) OR +(a=7 AND (b=11 OR b=14)) OR +((a MOD 2)=0 AND b=0)) AS `ok` + FROM t1 +ORDER BY a; +a ok +1 1 +2 1 +3 1 +4 1 +5 1 +6 1 +7 1 +8 1 +SET default_master_connection = 'm2'; +include/stop_slave.inc +RESET SLAVE 'm2' ALL; +SET default_master_connection = ''; +connection server_3; +include/start_slave.inc +disconnect server_2b; +connection server_1; +DROP TABLE t1; +connection server_2; +include/stop_slave.inc +SET GLOBAL slave_parallel_threads=@old_parallel_threads; +set global slave_parallel_mode= @old_parallel_mode; +SET GLOBAL lock_wait_timeout= @old_timeout; +SET GLOBAL innodb_lock_wait_timeout= @old_innodb_timeout; +include/start_slave.inc +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mdev382.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev382.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mdev382.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev382.result 2024-08-03 07:29:58.000000000 +0000 @@ -355,7 +355,7 @@ show binlog events in 'master-bin.000002' from ; Log_name Pos Event_type Server_id End_log_pos Info master-bin.000002 # Gtid 1 # GTID #-#-# -master-bin.000002 # Query 1 # DELETE FROM `db1``; select 'oops!'`.`t``1` +master-bin.000002 # Query 1 # TRUNCATE TABLE `db1``; select 'oops!'`.`t``1` connection slave; include/start_slave.inc connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mdev_17614.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev_17614.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mdev_17614.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mdev_17614.result 2024-08-03 07:29:58.000000000 +0000 @@ -29,8 +29,7 @@ a b c 1 1 1 2 2 3 -stop slave; -include/wait_for_slave_to_stop.inc +include/stop_slave_io.inc include/reset_slave.inc connection master; reset master; @@ -189,8 +188,7 @@ a b c 1 1 1 2 2 3 -stop slave; -include/wait_for_slave_to_stop.inc +include/stop_slave_io.inc include/reset_slave.inc connection master; reset master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_memory_engine_truncate_on_restart.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_memory_engine_truncate_on_restart.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_memory_engine_truncate_on_restart.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_memory_engine_truncate_on_restart.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,39 @@ +include/master-slave.inc +[connection master] +connection master; +create table t (val int) engine=MEMORY; +# DELETE trigger should never be activated +create trigger tr after delete on t for each row update t2 set val = 1; +insert into t values (1),(2); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# Check pre-restart values +include/diff_tables.inc [master:test.t,slave:test.t] +# Restarting master should empty master and slave `t` +connection master; +include/rpl_restart_server.inc [server_number=1] +connection master; +# Validating MEMORY table on master is empty after restart +# MYSQL_BINLOG datadir/binlog_file --result-file=assert_file +include/assert_grep.inc [Query to truncate the MEMORY table should be the contents of the new event] +# Ensuring slave MEMORY table is empty +connection master; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/diff_tables.inc [master:test.t,slave:test.t] +# Ensure new events replicate correctly +connection master; +insert into t values (3),(4); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# Validate values on slave, after master restart, do not include those inserted previously +include/diff_tables.inc [master:test.t,slave:test.t] +# +# Cleanup +connection master; +drop table t; +include/rpl_end.inc +# End of rpl_memory_engine_truncate_on_restart.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mixed_binlog_max_cache_size.result 2024-08-03 07:29:58.000000000 +0000 @@ -197,7 +197,7 @@ SET GLOBAL binlog_cache_size= ORIGINAL_VALUE; SET GLOBAL max_binlog_stmt_cache_size= ORIGINAL_VALUE; SET GLOBAL binlog_stmt_cache_size= ORIGINAL_VALUE; -include/stop_slave.inc +include/stop_slave_io.inc include/start_slave.inc connection master; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mysql_manager_race_condition.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mysql_manager_race_condition.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mysql_manager_race_condition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mysql_manager_race_condition.result 2024-08-03 07:29:58.000000000 +0000 @@ -17,6 +17,36 @@ include/rpl_restart_server.inc [server_number=2 parameters: --debug_dbug="+d,delay_start_handle_manager"] include/start_slave.inc # +# MDEV-33799 +# Ensure that when the binary log is used for recovery (as tc log), that +# the recovery process cannot start the binlog background thread before +# the mysql handle manager has started. +connection slave; +# Add test suppresssions so crash recovery messages don't fail the test +set session sql_log_bin=0; +call mtr.add_suppression("mariadbd: Got error '145.*"); +call mtr.add_suppression("Checking table:.*"); +call mtr.add_suppression("mysql.gtid_slave_pos:.*hasn't closed the table properly"); +call mtr.add_suppression("Can't init tc log"); +call mtr.add_suppression("Aborting"); +set session sql_log_bin=1; +# Create slave-side only table +create table t2 (a int) engine=innodb; +# Crash mariadbd when binlogging transaction to corrupt database state +connection slave1; +set @@session.debug_dbug="+d,crash_before_writing_xid"; +insert into t2 values (1); +connection slave; +connection slave1; +Got one of the listed errors +# Restart mariadbd in recovery mode. Note --tc-heuristic-recover +# forces mysqld to exit with error, so we run mariadbd via CLI +# MYSQLD_LAST_CMD --debug_dbug="+d,delay_start_handle_manager" --tc-heuristic-recover=COMMIT +connection server_2; +connection slave1; +connection slave; +include/start_slave.inc +# # Cleanup # connection master; @@ -24,4 +54,5 @@ include/save_master_gtid.inc connection slave; include/sync_with_master_gtid.inc +drop table t2; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mysqldump_gtid_slave_pos.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mysqldump_gtid_slave_pos.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_mysqldump_gtid_slave_pos.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_mysqldump_gtid_slave_pos.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,150 @@ +include/master-slave.inc +[connection master] +# Initialize +connection slave; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +# Setup data +connection master; +CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# 1. run some replication load that adds records to gtid_slave_pos table +# 2. stop slave, remove loaded data (it will be replicated), delete from +# gtid_slave_pos as the table is going to be restored +# 3. take dump from slave (master has an empty gtid_slave_pos) +# with --gtid and for the default value of both +# --dump-slave and --master-data +# and in loop for the two options do: +# 4. reset the slave state to install some initial state +# 5. restart slave server, restore the dump +# 6. check the final state which must be equal to the dump's one +# 7. start replication to see no error => Q.E.D. +# unless the test runs on a buggy version in which case set to zero. +# 1. +include/stop_slave.inc +delete from mysql.gtid_slave_pos; +connection master; +insert into t1 set a = 5; +insert into t1 set a = 4; +insert into t1 set a = 3; +insert into t1 set a = 2; +insert into t1 set a = 1; +include/save_master_gtid.inc +connection slave; +CHANGE MASTER TO master_use_gtid= no; +include/start_slave.inc +include/sync_with_master_gtid.inc +select * from mysql.gtid_slave_pos; +domain_id sub_id server_id seq_no +0 2 1 1 +0 3 1 2 +0 4 1 3 +0 5 1 4 +0 6 1 5 +0 7 1 6 +select @@global.gtid_slave_pos as "after initial slave got in sync"; +after initial slave got in sync +0-1-6 +# 2. +include/stop_slave.inc +# 3. A +include/stop_slave.inc +include/stop_slave.inc +# 4. +set statement sql_log_bin=0 for delete from mysql.gtid_slave_pos; +insert into mysql.gtid_slave_pos values (99 + 2, 1, 1, 1); +# 5. +include/rpl_restart_server.inc [server_number=2] +select * from mysql.gtid_slave_pos; +domain_id sub_id server_id seq_no +101 1 1 1 +select @@global.gtid_slave_pos as "before dump restore"; +before dump restore +101-1-1 +# 6. +select * from mysql.gtid_slave_pos; +domain_id sub_id server_id seq_no +0 2 1 6 +select @@global.gtid_slave_pos as "after dump restore"; +after dump restore +0-1-6 +# 7. +reset slave; +select @@global.gtid_slave_pos; +@@global.gtid_slave_pos +0-1-6 +change master to master_use_gtid=no; +connection master; +insert into t1 select 1+max(a),2 from t1; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +select * from mysql.gtid_slave_pos; +domain_id sub_id server_id seq_no +0 2 1 6 +0 3 1 1 +0 4 1 2 +0 5 1 3 +0 6 1 4 +0 7 1 5 +0 8 1 6 +0 9 1 7 +select @@global.gtid_slave_pos as "after slave got in sync"; +after slave got in sync +0-1-7 +include/stop_slave.inc +# 4. +set statement sql_log_bin=0 for delete from mysql.gtid_slave_pos; +insert into mysql.gtid_slave_pos values (99 + 1, 1, 1, 1); +# 5. +include/rpl_restart_server.inc [server_number=2] +select * from mysql.gtid_slave_pos; +domain_id sub_id server_id seq_no +100 1 1 1 +select @@global.gtid_slave_pos as "before dump restore"; +before dump restore +100-1-1 +# 6. +select * from mysql.gtid_slave_pos; +domain_id sub_id server_id seq_no +0 2 1 6 +select @@global.gtid_slave_pos as "after dump restore"; +after dump restore +0-1-6 +# 7. +reset slave; +select @@global.gtid_slave_pos; +@@global.gtid_slave_pos +0-1-6 +change master to master_use_gtid=no; +connection master; +insert into t1 select 1+max(a),1 from t1; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +select * from mysql.gtid_slave_pos; +domain_id sub_id server_id seq_no +0 2 1 6 +0 3 1 1 +0 4 1 2 +0 5 1 3 +0 6 1 4 +0 7 1 5 +0 8 1 6 +0 9 1 7 +0 10 1 8 +select @@global.gtid_slave_pos as "after slave got in sync"; +after slave got in sync +0-1-8 +# +# Cleanup +# +connection master; +DROP TABLE t1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_packet.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_packet.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_packet.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_packet.result 2024-08-03 07:29:58.000000000 +0000 @@ -2,6 +2,8 @@ [connection master] call mtr.add_suppression("Slave I/O: Got a packet bigger than 'slave_max_allowed_packet' bytes, .*error.* 1153"); call mtr.add_suppression("Log entry on master is longer than slave_max_allowed_packet"); +call mtr.add_suppression("Could not write packet:"); +call mtr.add_suppression("Got a packet bigger than 'max_allowed_packet' bytes"); drop database if exists DB_NAME_OF_MAX_LENGTH_AKA_NAME_LEN_64_BYTES_____________________; create database DB_NAME_OF_MAX_LENGTH_AKA_NAME_LEN_64_BYTES_____________________; connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_ignored_errors.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_ignored_errors.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_ignored_errors.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_ignored_errors.result 2024-08-03 07:29:58.000000000 +0000 @@ -36,7 +36,8 @@ connection con_temp2; COMMIT; connection server_2; -include/stop_slave.inc +include/wait_for_slave_sql_error.inc [errno=1062] +include/stop_slave_io.inc include/assert.inc [table t1 should have zero rows where a>32] SELECT * FROM t1 WHERE a>32; a diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_kill.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_kill.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_kill.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_kill.result 2024-08-03 07:29:58.000000000 +0000 @@ -30,7 +30,7 @@ connection slave1; commit; connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1032] update t1 set a=1 where a=2; set @@global.slave_parallel_threads = @save.slave_parallel_threads; set @@global.slave_parallel_mode = @save.slave_parallel_mode; @@ -78,7 +78,7 @@ connection slave1; commit; connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1032] update t1 set a=1 where a=2; set @@global.slave_parallel_threads = @save.slave_parallel_threads; set @@global.slave_parallel_mode = @save.slave_parallel_mode; @@ -127,7 +127,7 @@ connection slave1; commit; connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1032] update t1 set a=1 where a=2; set @@global.slave_parallel_threads = @save.slave_parallel_threads; set @@global.slave_parallel_mode = @save.slave_parallel_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_missed_error_handling.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_missed_error_handling.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_missed_error_handling.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_missed_error_handling.result 2024-08-03 07:29:58.000000000 +0000 @@ -38,7 +38,6 @@ SET debug_sync='RESET'; connection server_2; include/wait_for_slave_sql_error.inc [errno=1062] -include/wait_for_slave_sql_to_stop.inc SELECT * FROM t3 WHERE a >= 110 ORDER BY a; a b 110 1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_multi_domain_xa.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_multi_domain_xa.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_multi_domain_xa.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_multi_domain_xa.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,58 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction"); +call mtr.add_suppression("WSREP: handlerton rollback failed"); +connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +connection slave; +include/stop_slave.inc +SET @old_transaction_retries = @@GLOBAL.slave_transaction_retries; +SET @@global.slave_transaction_retries = 1000; +SET @old_parallel_threads = @@GLOBAL.slave_parallel_threads; +SET @old_slave_domain_parallel_threads = @@GLOBAL.slave_domain_parallel_threads; +SET @@global.slave_parallel_threads = 5; +SET @@global.slave_domain_parallel_threads = 3; +SET @old_parallel_mode = @@GLOBAL.slave_parallel_mode; +CHANGE MASTER TO master_use_gtid=slave_pos; +connection master; +CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 0); +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +SET @@global.slave_parallel_mode ='optimistic'; +connection master; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +connection master; +include/save_master_gtid.inc +connection slave; +SET @@global.slave_parallel_mode ='conservative'; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +include/save_master_gtid.inc +connection slave; +SET @@global.slave_parallel_mode = 'optimistic'; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/diff_tables.inc [master:t1, slave:t1] +connection slave; +include/stop_slave.inc +SET @@global.slave_parallel_mode = @old_parallel_mode; +SET @@global.slave_parallel_threads = @old_parallel_threads; +SET @@global.slave_domain_parallel_threads = @old_slave_domain_parallel_threads; +SET @@global.slave_transaction_retries = @old_transaction_retries; +include/start_slave.inc +connection master; +DROP TABLE t1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +connection master; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic.result 2024-08-03 07:29:58.000000000 +0000 @@ -626,6 +626,7 @@ connection server_2; include/sync_with_master_gtid.inc connection server_2; +SET @org_log_warnings=@@GLOBAL.LOG_WARNINGS; set global log_warnings=2; BEGIN; INSERT INTO t1 SET a=1; @@ -651,7 +652,7 @@ include/sync_with_master_gtid.inc connection server_2; include/stop_slave.inc -set global log_warnings=default; +set global log_warnings=@org_log_warnings; SET GLOBAL slave_parallel_mode=@old_parallel_mode; SET GLOBAL slave_parallel_threads=@old_parallel_threads; include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa.result 2024-08-03 07:29:58.000000000 +0000 @@ -32,7 +32,6 @@ include/diff_tables.inc [master:t1, slave:t1] connection slave; include/stop_slave.inc -set global log_warnings=default; SET GLOBAL slave_parallel_mode=@old_parallel_mode; SET GLOBAL slave_parallel_threads=@old_parallel_threads; include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa_lsu_off.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa_lsu_off.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa_lsu_off.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_optimistic_xa_lsu_off.result 2024-08-03 07:29:58.000000000 +0000 @@ -32,7 +32,6 @@ include/diff_tables.inc [master:t1, slave:t1] connection slave; include/stop_slave.inc -set global log_warnings=default; SET GLOBAL slave_parallel_mode=@old_parallel_mode; SET GLOBAL slave_parallel_threads=@old_parallel_threads; include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_retry.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_retry.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_retry.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_retry.result 2024-08-03 07:29:58.000000000 +0000 @@ -339,6 +339,28 @@ DROP TABLE t1, t2, t3, t4; DROP function foo; connection server_2; +connection server_2; +include/stop_slave.inc +SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; +SET GLOBAL slave_parallel_threads=4; +connection server_1; +CREATE TABLE t1 (a INT, b VARCHAR(123)) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 'asdf'); +UPDATE t1 SET b='zxf1' WHERE a=1; +UPDATE t1 SET b='\n' WHERE a=1; +connection server_2; +SET @old_dbug=@@GLOBAL.debug_dbug; +SET GLOBAL debug_dbug="+d,write_row_inject_sleep_before_ha_write_row"; +include/start_slave.inc +connection server_1; +connection server_2; +connection server_1; +DROP TABLE t1; +connection server_2; +include/stop_slave.inc +SET GLOBAL debug_dbug=@old_dbug; +SET GLOBAL slave_parallel_threads=@old_parallel_threads; +include/start_slave.inc connection server_1; CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; INSERT INTO t1 VALUES(100, 100); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_sbm.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_sbm.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_sbm.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_sbm.result 2024-08-03 07:29:58.000000000 +0000 @@ -27,12 +27,19 @@ # delaying a transaction; then when the reciprocal START SLAVE occurs, # if the event is still to be delayed, SBM should resume accordingly include/stop_slave.inc +# Lock t1 on slave to ensure the event can't finish (and thereby update +# Seconds_Behind_Master) so slow running servers don't accidentally +# catch up to the master before checking SBM. +connection server_2; +LOCK TABLES t1 WRITE; include/start_slave.inc connection slave; -# Waiting for replica to resume the delay for the transaction +# Waiting for replica to get blocked by the table lock # Sleeping 1s to increment SBM # Ensuring Seconds_Behind_Master increases after sleeping.. # ..done +connection server_2; +UNLOCK TABLES; include/sync_with_master_gtid.inc # # Pt 2) If the worker threads have not entered an idle state, ensure diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_seq.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_seq.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_seq.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_seq.result 2024-08-03 07:29:58.000000000 +0000 @@ -127,4 +127,14 @@ DROP SEQUENCE s2,s3,s4; DROP TABLE ti; connection slave; +connection master; +CREATE SEQUENCE s; +SELECT NEXTVAL(s); +NEXTVAL(s) +1 +flush binary logs; +DROP SEQUENCE s; +DROP SEQUENCE s; +connection slave; +connection master; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_slave_bgc_kill.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_slave_bgc_kill.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_slave_bgc_kill.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_slave_bgc_kill.result 2024-08-03 07:29:58.000000000 +0000 @@ -206,10 +206,12 @@ END || SET sql_log_bin=1; +include/stop_slave_io.inc connection server_1; INSERT INTO t3 VALUES (49,0); connection server_2; -START SLAVE SQL_THREAD; +CHANGE MASTER TO master_use_gtid=no; +include/start_slave.inc SELECT * FROM t3 WHERE a >= 40 ORDER BY a; a b 41 41 @@ -239,10 +241,6 @@ SET GLOBAL slave_parallel_threads=10; include/start_slave.inc *** 3. Same as (2), but not using gtid mode *** -connection server_2; -include/stop_slave.inc -CHANGE MASTER TO master_use_gtid=no; -include/start_slave.inc connection server_1; connection con_temp3; SET debug_sync='commit_after_release_LOCK_prepare_ordered SIGNAL master_queued1 WAIT_FOR master_cont1'; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_stop_slave.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_stop_slave.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_stop_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_stop_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -37,7 +37,9 @@ BEGIN; INSERT INTO t2 VALUES (21); connection server_2; -START SLAVE; +START SLAVE IO_THREAD; +include/wait_for_slave_param.inc [Read_Master_Log_Pos] +START SLAVE SQL_THREAD; connection con_temp2; SET @old_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,rpl_parallel_wait_for_done_trigger"; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_temptable.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_temptable.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_parallel_temptable.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_parallel_temptable.result 2024-08-03 07:29:58.000000000 +0000 @@ -202,6 +202,24 @@ include/stop_slave.inc SET GLOBAL slave_parallel_mode=@old_mode; include/start_slave.inc +*** MDEV33426: Memory allocation accounting incorrect for replicated temptable +connection server_1; +CREATE TEMPORARY TABLE t5 (a int) ENGINE=Aria; +CREATE TEMPORARY TABLE t6 (a int) ENGINE=Heap; +INSERT INTO t5 VALUES (1); +INSERT INTO t6 VALUES (2); +connection server_2; +include/stop_slave.inc +connection server_1; +INSERT INTO t1 SELECT a+40, 5 FROM t5; +INSERT INTO t1 SELECT a+40, 6 FROM t6; +DROP TABLE t5, t6; +connection server_2; +include/start_slave.inc +SELECT * FROM t1 WHERE a>=40 ORDER BY a; +a b +41 5 +42 6 connection server_2; include/stop_slave.inc SET GLOBAL slave_parallel_threads=@old_parallel_threads; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_perfschema_connect_config.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_perfschema_connect_config.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_perfschema_connect_config.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_perfschema_connect_config.result 2024-08-03 07:29:58.000000000 +0000 @@ -87,8 +87,6 @@ change master to master_user = 'root', master_use_gtid= CURRENT_POS; -Warnings: -Warning #### 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/assert.inc [Value returned by SSS and PS table for Using_Gtid should be same.] # 3) Test for Auto_position= SLAVE_POS diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_rewrite_db_sys_vars.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_rewrite_db_sys_vars.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_rewrite_db_sys_vars.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_rewrite_db_sys_vars.result 2024-08-03 07:29:58.000000000 +0000 @@ -12,11 +12,9 @@ create database replica_db1; create database y; create database test_replica; -SELECT @@GLOBAL.replicate_rewrite_db; -@@GLOBAL.replicate_rewrite_db -primary_db1->replica_db1,x->y -# Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB... -# ...success +SELECT @@GLOBAL.replicate_rewrite_db, 'primary_db1->replica_db1,x->y' as 'Replicate_Rewrite_DB from SHOW SLAVE STATUS'; +@@GLOBAL.replicate_rewrite_db Replicate_Rewrite_DB from SHOW SLAVE STATUS +primary_db1->replica_db1,x->y primary_db1->replica_db1,x->y # Create DBs and tables on primary connection master; create database primary_db1; @@ -60,15 +58,13 @@ @@GLOBAL.replicate_rewrite_db primary_db1->replica_db1,x->y SET @@GLOBAL.replicate_rewrite_db="test_master->test_replica"; -SELECT @@GLOBAL.replicate_rewrite_db; -@@GLOBAL.replicate_rewrite_db -test_master->test_replica SHOW DATABASES like 'test_replica'; Database (test_replica) test_replica include/start_slave.inc -# Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB... -# ...success +SELECT @@GLOBAL.replicate_rewrite_db, 'test_master->test_replica' as 'Replicate_Rewrite_DB from SHOW SLAVE STATUS'; +@@GLOBAL.replicate_rewrite_db Replicate_Rewrite_DB from SHOW SLAVE STATUS +test_master->test_replica test_master->test_replica # Create DB and tables on primary connection master; create database test_master; @@ -94,6 +90,8 @@ 3 include/diff_tables.inc [master:test_master.my_table,slave:test_replica.my_table] # Update of values on primary for DB not set in replication_rewrite_db +include/stop_slave.inc +include/reset_slave.inc connection master; use x; insert into my_table values (314); @@ -104,8 +102,6 @@ 314 include/save_master_gtid.inc connection slave; -include/stop_slave.inc -include/reset_slave.inc include/start_slave.inc SELECT @@GLOBAL.replicate_rewrite_db; @@GLOBAL.replicate_rewrite_db diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_big_table_id.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_big_table_id.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_big_table_id.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_big_table_id.result 2024-08-03 07:29:58.000000000 +0000 @@ -21,22 +21,22 @@ master-bin.000001 # Query 1 # use `test`; ALTER TABLE t comment '' master-bin.000001 # Gtid 1 # BEGIN GTID #-#-# master-bin.000001 # Annotate_rows 1 # INSERT INTO t SET a= 1 -master-bin.000001 # Table_map 1 # table_id: 4294967295 (test.t) -master-bin.000001 # Write_rows_v1 1 # table_id: 4294967295 flags: STMT_END_F +master-bin.000001 # Table_map 1 # table_id: 4294967296 (test.t) +master-bin.000001 # Write_rows_v1 1 # table_id: 4294967296 flags: STMT_END_F master-bin.000001 # Query 1 # COMMIT master-bin.000001 # Gtid 1 # GTID #-#-# master-bin.000001 # Query 1 # use `test`; ALTER TABLE t comment '' master-bin.000001 # Gtid 1 # BEGIN GTID #-#-# master-bin.000001 # Annotate_rows 1 # INSERT INTO t SET a= 2 -master-bin.000001 # Table_map 1 # table_id: 4294967296 (test.t) -master-bin.000001 # Write_rows_v1 1 # table_id: 4294967296 flags: STMT_END_F +master-bin.000001 # Table_map 1 # table_id: 4294967297 (test.t) +master-bin.000001 # Write_rows_v1 1 # table_id: 4294967297 flags: STMT_END_F master-bin.000001 # Query 1 # COMMIT master-bin.000001 # Gtid 1 # GTID #-#-# master-bin.000001 # Query 1 # use `test`; ALTER TABLE t comment '' master-bin.000001 # Gtid 1 # BEGIN GTID #-#-# master-bin.000001 # Annotate_rows 1 # INSERT INTO t SET a= 3 -master-bin.000001 # Table_map 1 # table_id: 4294967297 (test.t) -master-bin.000001 # Write_rows_v1 1 # table_id: 4294967297 flags: STMT_END_F +master-bin.000001 # Table_map 1 # table_id: 4294967298 (test.t) +master-bin.000001 # Write_rows_v1 1 # table_id: 4294967298 flags: STMT_END_F master-bin.000001 # Query 1 # COMMIT connection slave; connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_binlog_max_cache_size.result 2024-08-03 07:29:58.000000000 +0000 @@ -191,7 +191,7 @@ SET GLOBAL binlog_cache_size= ORIGINAL_VALUE; SET GLOBAL max_binlog_stmt_cache_size= ORIGINAL_VALUE; SET GLOBAL binlog_stmt_cache_size= ORIGINAL_VALUE; -include/stop_slave.inc +include/stop_slave_io.inc include/start_slave.inc connection master; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_corruption.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_corruption.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_corruption.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_corruption.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ UPDATE t1_11753004, t2_11753004 SET t1_11753004.c1=3, t2_11753004.c1=4 WHERE t1_11753004.c1=1 OR t2_11753004.c1=2; connection slave; include/wait_for_slave_sql_error.inc [errno=1593 ] -include/stop_slave.inc +include/stop_slave_io.inc SET @@global.debug_dbug=@saved_debug; include/start_slave.inc connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_find_row_debug.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_find_row_debug.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_find_row_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_find_row_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -20,6 +20,5 @@ FOUND 1 /The slave is applying a ROW event on behalf of a DELETE statement on table t1 and is currently taking a considerable amount/ in mysqld.2.err include/stop_slave.inc SET @@GLOBAL.debug_dbug = @saved_dbug; -SET GLOBAL log_warnings = 2; include/start_slave.inc include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_idempotency.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_idempotency.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_idempotency.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_idempotency.result 2024-08-03 07:29:58.000000000 +0000 @@ -89,7 +89,7 @@ 3 *** slave must stop (Trying to delete a referenced foreing key) connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1451] Last_SQL_Error 1451 select * from ti1 order by b /* must be (1),(2),(3) - not deleted */; @@ -114,7 +114,7 @@ insert into ti2 set a=3, b=3 /* offending write event */; *** slave must stop (Trying to insert an invalid foreign key) connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1452] Last_SQL_Error 1452 select * from ti2 order by b /* must be (2,2) */; @@ -139,9 +139,9 @@ insert into ti1 set b=1; connection master; insert into ti1 set b=1 /* offending write event */; -*** slave must stop (Trying to insert a dupliacte key) +*** slave must stop (Trying to insert a duplicate key) connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1062] Last_SQL_Error 1062 set foreign_key_checks= 0; @@ -164,7 +164,7 @@ DELETE FROM t1 WHERE a = -2; *** slave must stop (Key was not found) connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1032] Last_SQL_Error 1032 set global slave_exec_mode='IDEMPOTENT'; @@ -176,7 +176,7 @@ DELETE FROM t2 WHERE a = -2; *** slave must stop (Key was not found) connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1032] Last_SQL_Error 1032 set global slave_exec_mode='IDEMPOTENT'; @@ -190,7 +190,7 @@ UPDATE t1 SET a = 1 WHERE a = -1; *** slave must stop (Key was not found) connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1032] Last_SQL_Error 1032 set global slave_exec_mode='IDEMPOTENT'; @@ -202,7 +202,7 @@ UPDATE t2 SET a = 1 WHERE a = -1; *** slave must stop (Key was not found) connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1032] Last_SQL_Error 1032 set global slave_exec_mode='IDEMPOTENT'; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_until.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_until.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_row_until.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_row_until.result 2024-08-03 07:29:58.000000000 +0000 @@ -51,7 +51,9 @@ START SLAVE UNTIL RELAY_LOG_FILE='slave-relay-bin.000002', MASTER_LOG_POS=MASTER_LOG_POS; ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL START SLAVE UNTIL MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=MASTER_LOG_POS; -include/stop_slave.inc +include/wait_for_slave_io_to_start.inc +include/wait_for_slave_sql_to_stop.inc +include/stop_slave_io.inc include/reset_slave.inc include/start_slave.inc include/rpl_reset.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result 2024-08-03 07:29:58.000000000 +0000 @@ -6,7 +6,8 @@ include/start_slave.inc include/stop_slave.inc SET @save_dbug= @@GLOBAL.debug_dbug; -SET @@global.debug_dbug="+d,pause_sql_thread_on_fde,negate_clock_diff_with_master"; +SET @@global.debug_dbug="+d,pause_sql_thread_on_relay_fde_after_trans"; +SET @@global.debug_dbug="+d,negate_clock_diff_with_master"; include/start_slave.inc # Future events must be logged at least 2 seconds after # the slave starts @@ -18,11 +19,6 @@ # event in its relay log flush logs; connection slave; -# Ignore FDEs that happen before the CREATE/INSERT commands -SET DEBUG_SYNC='now WAIT_FOR paused_on_fde'; -SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; -SET DEBUG_SYNC='now WAIT_FOR paused_on_fde'; -SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; # On the next FDE, the slave should have the master CREATE/INSERT events SET DEBUG_SYNC='now WAIT_FOR paused_on_fde'; select count(*)=1 from t1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync.result 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,6 @@ call mtr.add_suppression("mysqld: Got an error reading communication packets"); connection slave; set sql_log_bin=0; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); set sql_log_bin=1; @@ -28,7 +27,7 @@ # Main test of semi-sync replication start here # connection master; -set global rpl_semi_sync_master_timeout= 60000; +set global rpl_semi_sync_master_timeout= 2000; [ default state of semi-sync on master should be OFF ] show variables like 'rpl_semi_sync_master_enabled'; Variable_name Value @@ -163,11 +162,15 @@ # Test semi-sync master will switch OFF after one transaction # timeout waiting for slave reply. # +connection master; +show status like "Rpl_semi_sync_master_status"; +Variable_name Value +Rpl_semi_sync_master_status ON connection slave; include/stop_slave.inc connection master; include/kill_binlog_dump_threads.inc -set global rpl_semi_sync_master_timeout= 5000; +set global rpl_semi_sync_master_timeout= 2000; [ master status should be ON ] show status like 'Rpl_semi_sync_master_no_tx'; Variable_name Value @@ -317,6 +320,8 @@ connection slave; include/start_slave.inc connection master; +connection slave; +connection master; create table t1 (a int) engine = ENGINE_TYPE; insert into t1 values (1); insert into t1 values (2), (3); @@ -359,6 +364,8 @@ Variable_name Value Rpl_semi_sync_slave_status ON connection master; +connection slave; +connection master; [ master semi-sync should be ON ] show status like 'Rpl_semi_sync_master_clients'; Variable_name Value diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync.result 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,6 @@ call mtr.add_suppression("mysqld: Got an error reading communication packets"); connection slave; set sql_log_bin=0; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); set sql_log_bin=1; @@ -29,7 +28,7 @@ # Main test of semi-sync replication start here # connection master; -set global rpl_semi_sync_master_timeout= 60000; +set global rpl_semi_sync_master_timeout= 2000; [ default state of semi-sync on master should be OFF ] show variables like 'rpl_semi_sync_master_enabled'; Variable_name Value @@ -164,11 +163,15 @@ # Test semi-sync master will switch OFF after one transaction # timeout waiting for slave reply. # +connection master; +show status like "Rpl_semi_sync_master_status"; +Variable_name Value +Rpl_semi_sync_master_status ON connection slave; include/stop_slave.inc connection master; include/kill_binlog_dump_threads.inc -set global rpl_semi_sync_master_timeout= 5000; +set global rpl_semi_sync_master_timeout= 2000; [ master status should be ON ] show status like 'Rpl_semi_sync_master_no_tx'; Variable_name Value @@ -318,6 +321,8 @@ connection slave; include/start_slave.inc connection master; +connection slave; +connection master; create table t1 (a int) engine = ENGINE_TYPE; insert into t1 values (1); insert into t1 values (2), (3); @@ -360,6 +365,8 @@ Variable_name Value Rpl_semi_sync_slave_status ON connection master; +connection slave; +connection master; [ master semi-sync should be ON ] show status like 'Rpl_semi_sync_master_clients'; Variable_name Value diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync_row.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync_row.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync_row.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_after_sync_row.result 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,6 @@ call mtr.add_suppression("mysqld: Got an error reading communication packets"); connection slave; set sql_log_bin=0; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); set sql_log_bin=1; @@ -29,7 +28,7 @@ # Main test of semi-sync replication start here # connection master; -set global rpl_semi_sync_master_timeout= 60000; +set global rpl_semi_sync_master_timeout= 2000; [ default state of semi-sync on master should be OFF ] show variables like 'rpl_semi_sync_master_enabled'; Variable_name Value @@ -164,11 +163,15 @@ # Test semi-sync master will switch OFF after one transaction # timeout waiting for slave reply. # +connection master; +show status like "Rpl_semi_sync_master_status"; +Variable_name Value +Rpl_semi_sync_master_status ON connection slave; include/stop_slave.inc connection master; include/kill_binlog_dump_threads.inc -set global rpl_semi_sync_master_timeout= 5000; +set global rpl_semi_sync_master_timeout= 2000; [ master status should be ON ] show status like 'Rpl_semi_sync_master_no_tx'; Variable_name Value @@ -318,6 +321,8 @@ connection slave; include/start_slave.inc connection master; +connection slave; +connection master; create table t1 (a int) engine = ENGINE_TYPE; insert into t1 values (1); insert into t1 values (2), (3); @@ -360,6 +365,8 @@ Variable_name Value Rpl_semi_sync_slave_status ON connection master; +connection slave; +connection master; [ master semi-sync should be ON ] show status like 'Rpl_semi_sync_master_clients'; Variable_name Value diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_cond_var_per_thd.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_cond_var_per_thd.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_cond_var_per_thd.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_cond_var_per_thd.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,35 @@ +include/master-slave.inc +[connection master] +connection master; +call mtr.add_suppression("Got an error reading communication packets"); +call mtr.add_suppression("Got an error writing communication packets"); +call mtr.add_suppression("Could not read packet"); +call mtr.add_suppression("Could not write packet"); +set @save_bgc_count= @@global.binlog_commit_wait_count; +set @save_bgc_usec= @@global.binlog_commit_wait_usec; +set @save_debug_dbug= @@global.debug_dbug; +set @@global.binlog_commit_wait_count=3; +set @@global.binlog_commit_wait_usec=10000000; +set @@global.debug_dbug="+d,testing_cond_var_per_thd"; +# Ensure semi-sync is on +connection slave; +connection master; +# Create three transactions to binlog group commit together +connection master; +create table t1 (a int); +connection server_1; +create table t2 (a int); +connection default; +create table t3 (a int); +connection master; +connection server_1; +connection default; +include/assert_grep.inc [Check that there is no 'Thread awaiting semi-sync ACK was awoken before its ACK' warning in error log.] +# +# Cleanup +connection master; +set @@global.binlog_commit_wait_count=@save_bgc_count; +set @@global.binlog_commit_wait_usec=@save_bgc_usec; +set @@global.debug_dbug=@save_debug_dbug; +drop table t1, t2, t3; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_event.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_event.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_event.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_event.result 2024-08-03 07:29:58.000000000 +0000 @@ -7,7 +7,6 @@ call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT."); call mtr.add_suppression("mysqld: Got an error reading communication packets"); connection slave; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_event_after_sync.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_event_after_sync.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_event_after_sync.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_event_after_sync.result 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,6 @@ call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT."); call mtr.add_suppression("mysqld: Got an error reading communication packets"); connection slave; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_fail_over.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_fail_over.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_fail_over.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_fail_over.result 2024-08-03 07:29:58.000000000 +0000 @@ -5,6 +5,7 @@ connection server_1; RESET MASTER; SET @@global.max_binlog_size= 4096; +set @@global.rpl_semi_sync_master_enabled = 1; connection server_2; RESET MASTER; SET @@global.max_binlog_size= 4096; @@ -14,7 +15,6 @@ include/start_slave.inc connection server_1; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; -set @@global.rpl_semi_sync_master_enabled = 1; set @@global.rpl_semi_sync_master_wait_point=AFTER_SYNC; CREATE TABLE t1 (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=Innodb; INSERT INTO t1 VALUES (1, 'dummy1'); @@ -44,13 +44,19 @@ connection server_2; include/wait_for_slave_param.inc [Slave_SQL_Running_State] include/stop_slave.inc -include/assert.inc [Table t1 should have 2 rows.] +select count(*) 'on slave must be 2' from t1; +on slave must be 2 +2 SELECT @@GLOBAL.gtid_current_pos; @@GLOBAL.gtid_current_pos 0-1-4 -# restart: --skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 +# restart: --skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 --init-rpl-role=SLAVE connection server_1; -include/assert.inc [Table t1 should have 1 rows.] +# Ensuring variable rpl_semi_sync_slave_enabled is ON.. +# Ensuring status rpl_semi_sync_slave_status is OFF.. +select count(*) 'on master must be 1' from t1; +on master must be 1 +1 FOUND 1 /truncated binlog file:.*master.*000001/ in mysqld.1.err disconnect conn_client; connection server_2; @@ -77,9 +83,9 @@ Variable_name Value gtid_slave_pos 0-1-4 connection server_1; -SELECT COUNT(*) = 3 as 'true' FROM t1; -true -1 +SELECT COUNT(*) 'must be 3' FROM t1; +must be 3 +3 # ... the gtid states on the slave: SHOW VARIABLES LIKE 'gtid_slave_pos'; Variable_name Value @@ -111,24 +117,32 @@ #================================================================= connect conn_client,127.0.0.1,root,,test,$SERVER_MYPORT_2,; SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL con1_ready WAIT_FOR con1_go"; +SET DEBUG_SYNC= "commit_after_release_LOCK_after_binlog_sync WAIT_FOR con1_go1"; SET STATEMENT server_id=1 FOR INSERT INTO t1 VALUES (4, REPEAT("x", 4100)); connect conn_client_2,127.0.0.1,root,,test,$SERVER_MYPORT_2,; SET DEBUG_SYNC= "now WAIT_FOR con1_ready"; -SET GLOBAL debug_dbug="d,Notify_binlog_EOF"; +SET DEBUG_SYNC= "commit_before_get_LOCK_after_binlog_sync SIGNAL con1_go"; +SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL con2_ready"; INSERT INTO t1 VALUES (5, REPEAT("x", 4100)); connection server_2; -SET DEBUG_SYNC= "now WAIT_FOR eof_reached"; +SET DEBUG_SYNC= "now WAIT_FOR con2_ready"; # Kill the server connection server_1; include/wait_for_slave_param.inc [Slave_SQL_Running_State] include/stop_slave.inc -include/assert.inc [Table t1 should have 5 rows.] +select count(*) 'on slave must be 5' from t1; +on slave must be 5 +5 SELECT @@GLOBAL.gtid_current_pos; @@GLOBAL.gtid_current_pos 0-2-7 -# restart: --skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 +# restart: --skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 --init-rpl-role=SLAVE connection server_2; -include/assert.inc [Table t1 should have 3 rows.] +# Ensuring variable rpl_semi_sync_slave_enabled is ON.. +# Ensuring status rpl_semi_sync_slave_status is OFF.. +select count(*) 'on master must be 3' from t1; +on master must be 3 +3 FOUND 1 /truncated binlog file:.*slave.*000002.* to remove transactions starting from GTID 0-1-6/ in mysqld.2.err disconnect conn_client; connection server_1; @@ -155,9 +169,9 @@ Variable_name Value gtid_slave_pos 0-2-7 connection server_2; -SELECT COUNT(*) = 6 as 'true' FROM t1; -true -1 +SELECT COUNT(*) 'must be 6 as' FROM t1; +must be 6 as +6 # ... the gtid states on the slave: SHOW VARIABLES LIKE 'gtid_slave_pos'; Variable_name Value @@ -201,13 +215,19 @@ connection server_2; include/wait_for_slave_param.inc [Slave_SQL_Running_State] include/stop_slave.inc -include/assert.inc [Table t1 should have 7 rows.] +select count(*) 'on slave must be 7' from t1; +on slave must be 7 +7 SELECT @@GLOBAL.gtid_current_pos; @@GLOBAL.gtid_current_pos 0-1-9 -# restart: --skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 +# restart: --skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 --init-rpl-role=SLAVE connection server_1; -include/assert.inc [Table t1 should have 6 rows.] +# Ensuring variable rpl_semi_sync_slave_enabled is ON.. +# Ensuring status rpl_semi_sync_slave_status is OFF.. +select count(*) 'on master must be 6' from t1; +on master must be 6 +6 FOUND 1 /truncated binlog file:.*master.*000002.* to remove transactions starting from GTID 0-1-9/ in mysqld.1.err disconnect conn_client; connection server_2; @@ -236,9 +256,9 @@ gtid_slave_pos 0-1-9 connection server_1; include/sync_with_master_gtid.inc -SELECT COUNT(*) = 8 as 'true' FROM t1; -true -1 +SELECT COUNT(*) 'must be 8' FROM t1; +must be 8 +8 # ... the gtid states on the slave: SHOW VARIABLES LIKE 'gtid_slave_pos'; Variable_name Value diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_master_shutdown.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_master_shutdown.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_master_shutdown.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_master_shutdown.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,7 @@ SET @@GLOBAL.rpl_semi_sync_master_enabled = 1; connection slave; include/stop_slave.inc -SET @@GLOBAL. rpl_semi_sync_slave_enabled = 1; +SET @@GLOBAL.rpl_semi_sync_slave_enabled = 1; include/start_slave.inc connection master; CREATE TABLE t1 (a INT); @@ -14,16 +14,13 @@ # Shutdown master include/rpl_stop_server.inc [server_number=1] connection slave; -include/stop_slave.inc +include/wait_for_slave_io_error.inc [errno=2003] # Restart master include/rpl_start_server.inc [server_number=1] connection slave; -include/stop_slave.inc -Warnings: -Note 1255 Slave already has been stopped -include/start_slave.inc +include/wait_for_slave_sql_to_start.inc +include/wait_for_slave_io_to_start.inc connection master; -SET @@GLOBAL.debug_dbug=""; SET @@GLOBAL. rpl_semi_sync_master_enabled = 0; connection master; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_no_missed_ack_after_add_slave.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_no_missed_ack_after_add_slave.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_no_missed_ack_after_add_slave.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_no_missed_ack_after_add_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,48 @@ +include/rpl_init.inc [topology=1->2,1->3] +connection server_1; +set @old_enabled= @@global.rpl_semi_sync_master_enabled; +set @old_timeout= @@global.rpl_semi_sync_master_timeout; +set global rpl_semi_sync_master_enabled= 1; +set global rpl_semi_sync_master_timeout= 500; +connection server_2; +include/stop_slave.inc +set @old_enabled= @@global.rpl_semi_sync_slave_enabled; +set @old_dbug= @@global.debug_dbug; +set global rpl_semi_sync_slave_enabled= 1; +set global debug_dbug="+d,simulate_delay_semisync_slave_reply"; +include/start_slave.inc +connection server_3; +include/stop_slave.inc +set @old_enabled= @@global.rpl_semi_sync_slave_enabled; +set global rpl_semi_sync_slave_enabled= 1; +include/start_slave.inc +# Ensure primary recognizes both replicas are semi-sync +connection server_1; +connection server_1; +create table t1 (a int); +connection server_2; +# Verifying server_2 did not send ACK +connection server_3; +# Verifying server_3 did send ACK +connection server_1; +# Verifying master's semi-sync status is still ON (This failed pre-MDEV-32960 fixes) +# Verifying rpl_semi_sync_master_yes_tx incremented +# +# Cleanup +connection server_2; +set global rpl_semi_sync_slave_enabled= @old_enabled; +set global debug_dbug= @old_dbug; +include/stop_slave.inc +connection server_3; +set global rpl_semi_sync_slave_enabled= @old_enabled; +include/stop_slave.inc +connection server_1; +set global rpl_semi_sync_master_enabled= @old_enabled; +set global rpl_semi_sync_master_timeout= @old_timeout; +drop table t1; +connection server_2; +include/start_slave.inc +connection server_3; +include/start_slave.inc +include/rpl_end.inc +# End of rpl_semi_sync_no_missed_ack_after_add_slave.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_shutdown_await_ack.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_shutdown_await_ack.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_shutdown_await_ack.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_shutdown_await_ack.result 2024-08-03 07:29:58.000000000 +0000 @@ -15,13 +15,17 @@ call mtr.add_suppression("Replication event checksum verification"); call mtr.add_suppression("Relay log write failure"); call mtr.add_suppression("Failed to kill the active semi-sync connection"); +set @sav_enabled_server_2= @@GLOBAL.rpl_semi_sync_slave_enabled; +set @sav_server_2_dbug= @@GLOBAL.debug_dbug; connection server_3; call mtr.add_suppression("reply failed"); call mtr.add_suppression("Replication event checksum verification"); call mtr.add_suppression("Relay log write failure"); call mtr.add_suppression("Failed to kill the active semi-sync connection"); +set @sav_enabled_server_3= @@GLOBAL.rpl_semi_sync_slave_enabled; +set @sav_server_3_dbug= @@GLOBAL.debug_dbug; connection server_1; -CREATE TABLE t1 (a int); +CREATE TABLE t1 (a int) engine=innodb; connection server_2; connection server_3; connect server_1_con2, localhost, root,,; @@ -30,8 +34,8 @@ ############################# # # Test Case 1) If both replicas simulate a delay that is within the -# allowed timeout, the primary should delay killing the suspended thread -# until an ACK is received (Rpl_semi_sync_master_yes_tx should be 1). +# allowed timeout, the primary should delay killing the Ack_thread +# until an ACK is received. # connection server_1; #-- @@ -40,15 +44,15 @@ #-- Enable semi-sync on slaves let slave_last= 3 connection server_2; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value Rpl_semi_sync_slave_status ON connection server_3; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value @@ -67,35 +71,22 @@ Variable_name Value Rpl_semi_sync_master_clients 2 #-- Prepare servers to simulate delay or error -connection server_1; -SET @@GLOBAL.debug_dbug= ""; connection server_2; SET @@GLOBAL.debug_dbug= "+d,simulate_delay_semisync_slave_reply"; connection server_3; SET @@GLOBAL.debug_dbug= "+d,simulate_delay_semisync_slave_reply"; #-- #-- Test begins +connection server_1_con2; connection server_1; #-- Begin semi-sync transaction INSERT INTO t1 VALUES (1); connection server_1_con2; #-- Wait until master recognizes a connection is awaiting semi-sync ACK -show status like 'Rpl_semi_sync_master_wait_sessions'; -Variable_name Value -Rpl_semi_sync_master_wait_sessions 1 -#-- Give enough time after timeout/ack received to query yes_tx/no_tx -SET @@GLOBAL.debug_dbug= "+d,delay_shutdown_phase_2_after_semisync_wait"; #-- Begin master shutdown SHUTDOWN WAIT FOR ALL SLAVES; connection server_1; -#-- Ensure either ACK was received (yes_tx=1) or timeout (no_tx=1) -show status like 'Rpl_semi_sync_master_yes_tx'; -Variable_name Value -Rpl_semi_sync_master_yes_tx 1 -show status like 'Rpl_semi_sync_master_no_tx'; -Variable_name Value -Rpl_semi_sync_master_no_tx 0 -connection server_1_con2; +ERROR HY000: Lost connection to server during query # Check logs to ensure shutdown was delayed FOUND 1 /Delaying shutdown to await semi-sync ACK/ in mysqld.1.err # Validate slave data is in correct state @@ -111,22 +102,19 @@ #-- Re-synchronize slaves with master and disable semi-sync #-- Stop slaves connection server_2; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc -connection server_3; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_2_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_2; +connection server_3; +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_3_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_3; #-- Bring the master back up connection server_1_con2; connection default; connection server_1; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_master_enabled = 0; -show status like 'Rpl_semi_sync_master_status'; -Variable_name Value -Rpl_semi_sync_master_status OFF TRUNCATE TABLE t1; #-- Bring slaves back up connection server_2; @@ -147,8 +135,8 @@ 1 # # Test Case 2) If both replicas simulate an error before sending an ACK, -# the primary should delay killing the suspended thread until the -# timeout is reached (Rpl_semi_sync_master_no_tx should be 1). +# the primary should delay killing the Ack_thread until the +# timeout is reached. # connection server_1; #-- @@ -157,15 +145,15 @@ #-- Enable semi-sync on slaves let slave_last= 3 connection server_2; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value Rpl_semi_sync_slave_status ON connection server_3; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value @@ -184,35 +172,22 @@ Variable_name Value Rpl_semi_sync_master_clients 2 #-- Prepare servers to simulate delay or error -connection server_1; -SET @@GLOBAL.debug_dbug= "+d,mysqld_delay_kill_threads_phase_1"; connection server_2; -SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event"; +SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141"; connection server_3; -SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event"; +SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141"; #-- #-- Test begins +connection server_1_con2; connection server_1; #-- Begin semi-sync transaction INSERT INTO t1 VALUES (1); connection server_1_con2; #-- Wait until master recognizes a connection is awaiting semi-sync ACK -show status like 'Rpl_semi_sync_master_wait_sessions'; -Variable_name Value -Rpl_semi_sync_master_wait_sessions 1 -#-- Give enough time after timeout/ack received to query yes_tx/no_tx -SET @@GLOBAL.debug_dbug= "+d,delay_shutdown_phase_2_after_semisync_wait"; #-- Begin master shutdown SHUTDOWN WAIT FOR ALL SLAVES; connection server_1; -#-- Ensure either ACK was received (yes_tx=1) or timeout (no_tx=1) -show status like 'Rpl_semi_sync_master_yes_tx'; -Variable_name Value -Rpl_semi_sync_master_yes_tx 0 -show status like 'Rpl_semi_sync_master_no_tx'; -Variable_name Value -Rpl_semi_sync_master_no_tx 1 -connection server_1_con2; +ERROR HY000: Lost connection to server during query # Check logs to ensure shutdown was delayed FOUND 2 /Delaying shutdown to await semi-sync ACK/ in mysqld.1.err # Validate slave data is in correct state @@ -226,24 +201,33 @@ 1 # #-- Re-synchronize slaves with master and disable semi-sync +#-- FIXME: workaround for MDEV-28141, preventing errored replicas from +# killing their semi-sync connections +connection server_2; +set debug_sync= "now wait_for at_semisync_kill_connection"; +set debug_sync= "now signal continue_semisync_kill_connection"; +# Wait for debug_sync signal to have been received before issuing RESET +set debug_sync= "reset"; +connection server_3; +set debug_sync= "now wait_for at_semisync_kill_connection"; +set debug_sync= "now signal continue_semisync_kill_connection"; +# Wait for debug_sync signal to have been received before issuing RESET +set debug_sync= "reset"; #-- Stop slaves connection server_2; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc -connection server_3; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_2_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_2; +connection server_3; +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_3_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_3; #-- Bring the master back up connection server_1_con2; connection default; connection server_1; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_master_enabled = 0; -show status like 'Rpl_semi_sync_master_status'; -Variable_name Value -Rpl_semi_sync_master_status OFF TRUNCATE TABLE t1; #-- Bring slaves back up connection server_2; @@ -265,8 +249,8 @@ # # Test Case 3) If one replica simulates a delay within the allowed # timeout and the other simulates an error before sending an ACK, the -# primary should delay killing the suspended thread until it receives an -# ACK from the delayed slave (Rpl_semi_sync_master_yes_tx should be 1). +# primary should delay killing the Ack_thread until it receives an +# ACK from the delayed slave. # connection server_1; #-- @@ -275,15 +259,15 @@ #-- Enable semi-sync on slaves let slave_last= 3 connection server_2; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value Rpl_semi_sync_slave_status ON connection server_3; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value @@ -302,35 +286,22 @@ Variable_name Value Rpl_semi_sync_master_clients 2 #-- Prepare servers to simulate delay or error -connection server_1; -SET @@GLOBAL.debug_dbug= "+d,mysqld_delay_kill_threads_phase_1"; connection server_2; -SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event"; +SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141"; connection server_3; SET @@GLOBAL.debug_dbug= "+d,simulate_delay_semisync_slave_reply"; #-- #-- Test begins +connection server_1_con2; connection server_1; #-- Begin semi-sync transaction INSERT INTO t1 VALUES (1); connection server_1_con2; #-- Wait until master recognizes a connection is awaiting semi-sync ACK -show status like 'Rpl_semi_sync_master_wait_sessions'; -Variable_name Value -Rpl_semi_sync_master_wait_sessions 1 -#-- Give enough time after timeout/ack received to query yes_tx/no_tx -SET @@GLOBAL.debug_dbug= "+d,delay_shutdown_phase_2_after_semisync_wait"; #-- Begin master shutdown SHUTDOWN WAIT FOR ALL SLAVES; connection server_1; -#-- Ensure either ACK was received (yes_tx=1) or timeout (no_tx=1) -show status like 'Rpl_semi_sync_master_yes_tx'; -Variable_name Value -Rpl_semi_sync_master_yes_tx 1 -show status like 'Rpl_semi_sync_master_no_tx'; -Variable_name Value -Rpl_semi_sync_master_no_tx 0 -connection server_1_con2; +ERROR HY000: Lost connection to server during query # Check logs to ensure shutdown was delayed FOUND 3 /Delaying shutdown to await semi-sync ACK/ in mysqld.1.err # Validate slave data is in correct state @@ -344,24 +315,28 @@ 1 # #-- Re-synchronize slaves with master and disable semi-sync +#-- FIXME: workaround for MDEV-28141, preventing errored replicas from +# killing their semi-sync connections +connection server_2; +set debug_sync= "now wait_for at_semisync_kill_connection"; +set debug_sync= "now signal continue_semisync_kill_connection"; +# Wait for debug_sync signal to have been received before issuing RESET +set debug_sync= "reset"; #-- Stop slaves connection server_2; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc -connection server_3; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_2_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_2; +connection server_3; +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_3_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_3; #-- Bring the master back up connection server_1_con2; connection default; connection server_1; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_master_enabled = 0; -show status like 'Rpl_semi_sync_master_status'; -Variable_name Value -Rpl_semi_sync_master_status OFF TRUNCATE TABLE t1; #-- Bring slaves back up connection server_2; @@ -389,8 +364,7 @@ # active semi-sync connection in-tact. The slave should notice this, and # not issue a `QUIT` command to the primary, which would otherwise be # sent to kill an active connection. This test case validates that the -# slave does not send a `QUIT` in this case (Rpl_semi_sync_master_yes_tx -# should be 1 because server_3 will send the ACK within a valid timeout). +# slave does not send a `QUIT` in this case. # connection server_1; #-- @@ -399,15 +373,15 @@ #-- Enable semi-sync on slaves let slave_last= 3 connection server_2; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value Rpl_semi_sync_slave_status ON connection server_3; -set global rpl_semi_sync_slave_enabled = 1; include/stop_slave.inc +set global rpl_semi_sync_slave_enabled = 1; include/start_slave.inc show status like 'Rpl_semi_sync_slave_status'; Variable_name Value @@ -426,35 +400,22 @@ Variable_name Value Rpl_semi_sync_master_clients 2 #-- Prepare servers to simulate delay or error -connection server_1; -SET @@GLOBAL.debug_dbug= "+d,mysqld_delay_kill_threads_phase_1"; connection server_2; -SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event,slave_delay_killing_semisync_connection"; +SET @@GLOBAL.debug_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141"; connection server_3; SET @@GLOBAL.debug_dbug= "+d,simulate_delay_semisync_slave_reply"; #-- #-- Test begins +connection server_1_con2; connection server_1; #-- Begin semi-sync transaction INSERT INTO t1 VALUES (1); connection server_1_con2; #-- Wait until master recognizes a connection is awaiting semi-sync ACK -show status like 'Rpl_semi_sync_master_wait_sessions'; -Variable_name Value -Rpl_semi_sync_master_wait_sessions 1 -#-- Give enough time after timeout/ack received to query yes_tx/no_tx -SET @@GLOBAL.debug_dbug= "+d,delay_shutdown_phase_2_after_semisync_wait"; #-- Begin master shutdown SHUTDOWN WAIT FOR ALL SLAVES; connection server_1; -#-- Ensure either ACK was received (yes_tx=1) or timeout (no_tx=1) -show status like 'Rpl_semi_sync_master_yes_tx'; -Variable_name Value -Rpl_semi_sync_master_yes_tx 1 -show status like 'Rpl_semi_sync_master_no_tx'; -Variable_name Value -Rpl_semi_sync_master_no_tx 0 -connection server_1_con2; +ERROR HY000: Lost connection to server during query # Check logs to ensure shutdown was delayed FOUND 4 /Delaying shutdown to await semi-sync ACK/ in mysqld.1.err # Validate slave data is in correct state @@ -468,24 +429,28 @@ 1 # #-- Re-synchronize slaves with master and disable semi-sync +#-- FIXME: workaround for MDEV-28141, preventing errored replicas from +# killing their semi-sync connections +connection server_2; +set debug_sync= "now wait_for at_semisync_kill_connection"; +set debug_sync= "now signal continue_semisync_kill_connection"; +# Wait for debug_sync signal to have been received before issuing RESET +set debug_sync= "reset"; #-- Stop slaves connection server_2; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc -connection server_3; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0; -include/stop_slave.inc +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_2_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_2; +connection server_3; +include/stop_slave_io.inc +include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_3_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_3; #-- Bring the master back up connection server_1_con2; connection default; connection server_1; -SET @@GLOBAL.debug_dbug= ""; -SET @@GLOBAL.rpl_semi_sync_master_enabled = 0; -show status like 'Rpl_semi_sync_master_status'; -Variable_name Value -Rpl_semi_sync_master_status OFF TRUNCATE TABLE t1; #-- Bring slaves back up connection server_2; @@ -504,14 +469,62 @@ SELECT COUNT(*)=0 from t1; COUNT(*)=0 1 +# +# Test Case 5) If a waiting-for-ACK user thread is killed (disconnected) +# during SHUTDOWN WAIT FOR ALL SLAVES, ensure the primary will still +# await the ACK from the replica before killing the Ack_receiver thread +# +connection server_1; +insert into t1 values (1); +include/save_master_gtid.inc +connection server_2; +include/sync_with_master_gtid.inc +include/stop_slave.inc +SET GLOBAL rpl_semi_sync_slave_enabled= 1; +include/start_slave.inc +connection server_1; +SET GLOBAL rpl_semi_sync_master_enabled= 1; +SET GLOBAL rpl_semi_sync_master_timeout= 2000; +show status like 'Rpl_semi_sync_master_status'; +Variable_name Value +Rpl_semi_sync_master_status ON +show status like 'Rpl_semi_sync_master_clients'; +Variable_name Value +Rpl_semi_sync_master_clients 1 +connection server_2; +SET @old_dbug= @@GLOBAL.debug_dbug; +SET GLOBAL debug_dbug="+d,simulate_delay_semisync_slave_reply"; +connect con1, localhost, root,,; +connect con2, localhost, root,,; +connection con1; +insert into t1 values (2); +connection server_1; +# Wait for thd to begin semi-sync wait.. +# ..done +disconnect con1; +connection default; +connection con2; +SHUTDOWN WAIT FOR ALL SLAVES; +# Ensure the primary waited for the ACK of the killed thread +FOUND 5 /Delaying shutdown to await semi-sync ACK/ in mysqld.1.err +connection default; +connection server_1; +connection server_2; +include/stop_slave.inc +connection server_3; +include/stop_slave.inc +connection default; +connection server_1; ############################# # Cleanup ############################# connection server_2; -include/stop_slave.inc +SET @@GLOBAL.rpl_semi_sync_slave_enabled = @sav_enabled_server_2; +SET @@GLOBAL.debug_dbug= @sav_server_2_dbug; include/start_slave.inc connection server_3; -include/stop_slave.inc +SET @@GLOBAL.rpl_semi_sync_slave_enabled = @sav_enabled_server_3; +SET @@GLOBAL.debug_dbug= @sav_server_3_dbug; include/start_slave.inc connection server_1; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_slave_enabled_consistent.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_slave_enabled_consistent.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_slave_enabled_consistent.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_slave_enabled_consistent.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,38 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression("Replication event checksum verification failed"); +call mtr.add_suppression("could not queue event from master"); +call mtr.add_suppression("Semisync ack receiver.*error reading communication packets"); +call mtr.add_suppression("Semisync ack receiver got hangup"); +connection slave; +# +# Set up a semisync connection +connection master; +set @@global.rpl_semi_sync_master_enabled= ON; +connection slave; +stop slave io_thread; +set @@global.rpl_semi_sync_slave_enabled= ON; +set @old_dbug= @@global.debug_dbug; +set @@global.debug_dbug= "+d,corrupt_queue_event"; +set @@global.debug_dbug= "+d,pause_before_io_read_event"; +set @@global.debug_dbug= "+d,placeholder"; +start slave io_thread; +# Disable semi-sync on the slave while the IO thread is active +set debug_sync='now wait_for io_thread_at_read_event'; +set @@global.rpl_semi_sync_slave_enabled= OFF; +set debug_sync='now signal io_thread_continue_read_event'; +# Waiting for the slave to stop with the error from corrupt_queue_event +connection slave; +include/wait_for_slave_io_error.inc [errno=1595,1743] +# Sleep 1 to give time for Ack_receiver to receive COM_QUIT +include/assert_grep.inc [Check that there is no 'Read semi-sync reply magic number error' in error log.] +# +# Cleanup +connection slave; +include/stop_slave.inc +set @@global.debug_dbug= @old_dbug; +include/start_slave.inc +connection master; +set @@global.rpl_semi_sync_master_enabled= default; +include/rpl_end.inc +# End of rpl_semi_sync_slave_enabled_consistent.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_slave_reply_fail.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_slave_reply_fail.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semi_sync_slave_reply_fail.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semi_sync_slave_reply_fail.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,7 @@ include/stop_slave.inc connection master; call mtr.add_suppression("Timeout waiting for reply of binlog*"); +call mtr.add_suppression("Master server does not read semi-sync messages*"); set global rpl_semi_sync_master_enabled = ON; SET @@GLOBAL.rpl_semi_sync_master_timeout=100; create table t1 (i int); @@ -15,8 +16,8 @@ include/start_slave.inc connection master; connection slave; -"Assert that the net_fulsh() reply failed is present in slave error log. -FOUND 1 /Semi-sync slave net_flush\(\) reply failed/ in mysqld.2.err +"Assert that Master server does not read semi-sync messages" is present in slave error log. +FOUND 1 /Master server does not read semi-sync messages/ in mysqld.2.err "Assert that Slave IO thread is up and running." SHOW STATUS LIKE 'Slave_running'; Variable_name Value @@ -32,7 +33,7 @@ include/diff_tables.inc [master:t1, slave:t1] connection master; set statement sql_log_bin=0 for call mtr.add_suppression("Read semi-sync reply magic number error"); -SET @save_debug_master= @@global.debug; +SET @save_debug_master= @@global.debug_dbug; SET GLOBAL debug_dbug="+d,semisync_corrupt_magic"; insert into t1 values (11); connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semisync_ali_issues.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semisync_ali_issues.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_semisync_ali_issues.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_semisync_ali_issues.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,6 @@ CALL mtr.add_suppression("Semi-sync master failed on*"); CALL mtr.add_suppression("Master command COM_BINLOG_DUMP failed*"); CALL mtr.add_suppression("on master failed*"); -CALL mtr.add_suppression("Master server does not support semi-sync*"); CALL mtr.add_suppression("Semi-sync slave net_flush*"); CALL mtr.add_suppression("Failed to flush master info*"); CALL mtr.add_suppression("Request to stop slave SQL Thread received while apply*"); @@ -196,7 +195,7 @@ Rpl_semi_sync_master_clients 0 show status like 'Rpl_semi_sync_master_status'; Variable_name Value -Rpl_semi_sync_master_status OFF +Rpl_semi_sync_master_status ON connection slave; START SLAVE IO_THREAD; include/wait_for_slave_io_to_start.inc @@ -270,16 +269,12 @@ Rpl_semi_sync_master_clients 1 # Test failure of select error . SET GLOBAL debug = 'd,rpl_semisync_simulate_select_error'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead INSERT INTO t1 VALUES(3); connection slave; connection con1; # Test failure of pthread_create SET GLOBAL rpl_semi_sync_master_enabled = 0; SET GLOBAL debug = 'd,rpl_semisync_simulate_create_thread_failure'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET GLOBAL rpl_semi_sync_master_enabled= ON; # Test failure of pthread_join SET GLOBAL rpl_semi_sync_master_enabled= OFF; @@ -287,8 +282,6 @@ # Failure on registering semisync slave # SET GLOBAL debug= 'd,rpl_semisync_simulate_add_slave_failure'; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead SET GLOBAL rpl_semi_sync_master_enabled= ON; connection slave; STOP SLAVE IO_THREAD; @@ -297,8 +290,6 @@ include/wait_for_slave_io_to_start.inc connection con1; SET GLOBAL debug=''; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead connection slave; START SLAVE IO_THREAD; include/wait_for_slave_io_to_start.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_session_var.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_session_var.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_session_var.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_session_var.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,16 @@ include/master-slave.inc [connection master] +select @@rpl_semi_sync_master_enabled; +@@rpl_semi_sync_master_enabled +0 +connection slave; +select @@rpl_semi_sync_slave_enabled; +@@rpl_semi_sync_slave_enabled +0 +show status like "rpl_semi_sync_slave_status"; +Variable_name Value +Rpl_semi_sync_slave_status OFF +connection master; drop table if exists t1; Warnings: Note 1051 Unknown table 'test.t1' diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_session_var2.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_session_var2.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_session_var2.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_session_var2.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,69 @@ +include/master-slave.inc +[connection master] +select @@rpl_semi_sync_master_enabled; +@@rpl_semi_sync_master_enabled +1 +connection slave; +select @@rpl_semi_sync_slave_enabled; +@@rpl_semi_sync_slave_enabled +1 +show status like "rpl_semi_sync_slave_status"; +Variable_name Value +Rpl_semi_sync_slave_status ON +connection master; +drop table if exists t1; +Warnings: +Note 1051 Unknown table 'test.t1' +create table t1(a varchar(100),b int); +set @@session.sql_mode=pipes_as_concat; +insert into t1 values('My'||'SQL', 1); +set @@session.sql_mode=default; +insert into t1 values('1'||'2', 2); +select * from t1 where b<3 order by a; +a b +1 2 +MySQL 1 +connection slave; +select * from t1 where b<3 order by a; +a b +1 2 +MySQL 1 +connection master; +set @@session.sql_mode=ignore_space; +insert into t1 values(password ('MySQL'), 3); +set @@session.sql_mode=ansi_quotes; +create table "t2" ("a" int); +drop table t1, t2; +set @@session.sql_mode=default; +create table t1(a int auto_increment primary key); +create table t2(b int, a int); +set @@session.sql_auto_is_null=1; +insert into t1 values(null); +insert into t2 select 1,a from t1 where a is null; +set @@session.sql_auto_is_null=0; +insert into t1 values(null); +insert into t2 select 2,a from t1 where a is null; +select * from t2 order by b; +b a +1 1 +connection slave; +select * from t2 order by b; +b a +1 1 +connection master; +drop table t1,t2; +connection slave; +connection master; +CREATE TABLE t1 ( +`id` int(11) NOT NULL auto_increment, +`data` varchar(100), +PRIMARY KEY (`id`) +) ENGINE=MyISAM; +INSERT INTO t1(data) VALUES(SESSION_USER()); +connection slave; +SELECT length(data) < 100 FROM t1; +length(data) < 100 +1 +connection master; +drop table t1; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_set_statement_default_master.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,6 +14,7 @@ CHANGE MASTER 'm1' TO MASTER_HOST='127.0.0.1', MASTER_PORT=MASTER_MYPORT, MASTER_USER='root'; SET STATEMENT default_master_connection = 'm1' FOR START SLAVE; set default_master_connection = 'm1'; +include/wait_for_slave_to_start.inc stop slave; include/wait_for_slave_to_stop.inc reset slave all; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_show_slave_status.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_show_slave_status.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_show_slave_status.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_show_slave_status.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,75 @@ +include/master-slave.inc +[connection master] +* +* The purpose of this test is to prevent incorrect additions to SHOW +* SLAVE STATUS, which has happened several times in the past. +* +* We must never, _ever_, add extra rows to this output of SHOW SLAVE +* STATUS, except at the very end, as this breaks backwards compatibility +* with applications or scripts that parse the output. This also means that +* we cannot add _any_ new rows in a GA version if a different row was +* already added in a later MariaDB version, as this would make it impossible +* to merge the change up while preserving the order of rows. +* +connection slave; +SHOW SLAVE STATUS; +Slave_IO_State # +Master_Host # +Master_User # +Master_Port # +Connect_Retry # +Master_Log_File # +Read_Master_Log_Pos # +Relay_Log_File # +Relay_Log_Pos # +Relay_Master_Log_File # +Slave_IO_Running # +Slave_SQL_Running # +Replicate_Do_DB # +Replicate_Ignore_DB # +Replicate_Do_Table # +Replicate_Ignore_Table # +Replicate_Wild_Do_Table # +Replicate_Wild_Ignore_Table # +Last_Errno # +Last_Error # +Skip_Counter # +Exec_Master_Log_Pos # +Relay_Log_Space # +Until_Condition # +Until_Log_File # +Until_Log_Pos # +Master_SSL_Allowed # +Master_SSL_CA_File # +Master_SSL_CA_Path # +Master_SSL_Cert # +Master_SSL_Cipher # +Master_SSL_Key # +Seconds_Behind_Master # +Master_SSL_Verify_Server_Cert # +Last_IO_Errno # +Last_IO_Error # +Last_SQL_Errno # +Last_SQL_Error # +Replicate_Ignore_Server_Ids # +Master_Server_Id # +Master_SSL_Crl # +Master_SSL_Crlpath # +Using_Gtid # +Gtid_IO_Pos # +Replicate_Do_Domain_Ids # +Replicate_Ignore_Domain_Ids # +Parallel_Mode # +SQL_Delay # +SQL_Remaining_Delay # +Slave_SQL_Running_State # +Slave_DDL_Groups # +Slave_Non_Transactional_Groups # +Slave_Transactional_Groups # +Replicate_Rewrite_DB # +* +* When modifying this test after adding a column to SHOW SLAVE STATUS, +* _only_ additions at the end are allowed, the column number of existing +* columns must _not_ change! +* +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_shutdown_sighup.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_shutdown_sighup.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_shutdown_sighup.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_shutdown_sighup.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,50 @@ +include/master-slave.inc +[connection master] +connection slave; +set statement sql_log_bin=0 for call mtr.add_suppression("Signal handler thread did not exit in a timely manner"); +# +# Main test +connection master; +create table t1 (a int); +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +set @@global.debug_dbug= "+d,hold_sighup_log_refresh"; +# Waiting for sighup to reach reload_acl_and_cache.. +set debug_sync="now wait_for in_reload_acl_and_cache"; +# Signalling signal handler to proceed to sleep before REFRESH_HOSTS +set debug_sync="now signal refresh_logs"; +# Starting shutdown (note this will take 3+ seconds due to DBUG my_sleep in reload_acl_and_cache) +shutdown; +connection server_2; +connection slave; +include/assert_grep.inc [Ensure Mariadbd did not segfault when shutting down] +connection master; +connection slave; +# +# Error testcase to ensure an error message is shown if the signal +# takes longer than the timeout while processing the SIGHUP +connection slave; +set @@global.debug_dbug= "+d,force_sighup_processing_timeout"; +set @@global.debug_dbug= "+d,hold_sighup_log_refresh"; +connection master; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# Waiting for sighup to reach reload_acl_and_cache.. +set debug_sync="now wait_for in_reload_acl_and_cache"; +# Signalling signal handler to proceed to sleep before REFRESH_HOSTS +set debug_sync="now signal refresh_logs"; +# Starting shutdown (note this will take 3+ seconds due to DBUG my_sleep in reload_acl_and_cache) +shutdown; +connection server_2; +connection slave; +include/assert_grep.inc [Ensure warning is issued that signal handler thread is still processing] +# +# Cleanup +connection master; +drop table t1; +include/rpl_end.inc +# End of rpl_shutdown_sighup.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_skip_error.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_skip_error.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_skip_error.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_skip_error.result 2024-08-03 07:29:58.000000000 +0000 @@ -122,6 +122,31 @@ # Slave_skipped_errros = 5 **** We cannot execute a select as there are differences in the **** behavior between STMT and RBR. +**** +**** Ensure transactions which are skipped due to encountering a +**** non-deadlock error which is present in --slave-skip-errors result +**** in partially committed transactions +connection master; +CREATE TABLE t3 (a INT UNIQUE) ENGINE=InnoDB; +connection slave; +connection slave; +INSERT INTO t3 VALUES (3); +connection master; +BEGIN; +INSERT INTO t3 VALUES (1); +INSERT INTO t3 VALUES (2); +INSERT INTO t3 VALUES (3); +INSERT INTO t3 VALUES (4); +COMMIT; +connection slave; +**** Master and slave tables should have the same data, due to the +**** partially replicated transaction's data overlapping with the data +**** that pre-existed on the slave. That is, despite the transaction +**** consisting of 4 statements, the errored statement should be ignored +**** and the other 3 should commit successfully. +include/diff_tables.inc [master:t3,slave:t3] +connection master; +DROP TABLE t3; ==== Clean Up ==== connection master; DROP TABLE t1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_slave_load_tmpdir_not_exist.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_load_tmpdir_not_exist.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_slave_load_tmpdir_not_exist.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_load_tmpdir_not_exist.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,7 @@ START SLAVE; call mtr.add_suppression("Slave SQL.*Unable to use slave.s temporary directory"); include/wait_for_slave_sql_error.inc [errno=12] +include/wait_for_slave_io_to_start.inc include/stop_slave_io.inc RESET SLAVE; include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_slave_restart_long_password.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_restart_long_password.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_slave_restart_long_password.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_restart_long_password.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,28 @@ +include/master-slave.inc +[connection master] +include/assert.inc [Password length is 96] +connection master; +SET SQL_LOG_BIN=0; +GRANT REPLICATION SLAVE ON *.* TO rpl@127.0.0.1 IDENTIFIED BY '123456789X12141618202224262830323436384042444648505254565860626466687072747678808284868890929496'; +SET SQL_LOG_BIN=1; +connection slave; +include/stop_slave.inc +CHANGE MASTER TO MASTER_HOST='127.0.0.1', master_user='rpl', master_password='123456789X12141618202224262830323436384042444648505254565860626466687072747678808284868890929496'; +include/start_slave.inc +include/check_slave_param.inc [Slave_IO_Running] +connection master; +include/rpl_restart_server.inc [server_number=2] +connection slave; +include/start_slave.inc +include/check_slave_param.inc [Slave_IO_Running] +connection master; +SET SQL_LOG_BIN=0; +DROP USER rpl@127.0.0.1; +FLUSH PRIVILEGES; +SET SQL_LOG_BIN=1; +connection slave; +include/stop_slave.inc +CHANGE MASTER TO MASTER_USER = 'root', MASTER_PASSWORD = ''; +include/start_slave.inc +connection master; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_slave_status.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_status.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_slave_status.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_slave_status.result 2024-08-03 07:29:58.000000000 +0000 @@ -36,7 +36,6 @@ include/stop_slave.inc START SLAVE; include/wait_for_slave_sql_to_start.inc -include/wait_for_slave_io_to_stop.inc ==== Verify that Slave IO thread stopped with error ==== include/wait_for_slave_io_error.inc [errno=1045] ==== Cleanup (Note that slave IO thread is not running) ==== diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_sql_thd_start_errno_cleared.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_sql_thd_start_errno_cleared.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_sql_thd_start_errno_cleared.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_sql_thd_start_errno_cleared.result 2024-08-03 07:29:58.000000000 +0000 @@ -34,6 +34,7 @@ # Validating that Last_SQL_Errno is cleared.. # ..success set debug_sync= "now signal sql_thread_continue"; +# Wait for debug_sync signal to have been received before issuing RESET set @@global.debug_dbug= @saved_dbug; set debug_sync= "RESET"; # Cleanup diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_ssl1.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_ssl1.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_ssl1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_ssl1.result 2024-08-03 07:29:58.000000000 +0000 @@ -14,8 +14,8 @@ connection slave; select * from t1; t -stop slave; -include/wait_for_slave_to_stop.inc +include/wait_for_slave_io_error.inc [errno=1045] +include/stop_slave_sql.inc change master to master_ssl=1 , master_ssl_ca ='MYSQL_TEST_DIR/std_data/cacert.pem', master_ssl_cert='MYSQL_TEST_DIR/std_data/client-cert.pem', master_ssl_key='MYSQL_TEST_DIR/std_data/client-key.pem'; start slave; include/wait_for_slave_to_start.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_1.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_1.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_1.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_2.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_2.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_2.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_2.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_3.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_3.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_3.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_3.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_4.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_4.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_4.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_4.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_5.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_5.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_5.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_5.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_6.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_6.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_6.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_6.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,7 @@ include/master-slave.inc [connection master] connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_7.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_7.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_7.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_7.result 2024-08-03 07:29:58.000000000 +0000 @@ -10,6 +10,10 @@ Note 1255 Slave already has been stopped set global binlog_alter_two_phase=true; connection server_3; +SET STATEMENT sql_log_bin=0 FOR +CALL mtr.add_suppression("The table mysql.gtid_slave_pos was removed. This change will not take full effect until all SQL threads have been restarted"); +SET STATEMENT sql_log_bin=0 FOR +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; SET GLOBAL slave_parallel_threads=8; set global slave_parallel_mode=optimistic; set global gtid_strict_mode=1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_8.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_8.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_8.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_8.result 2024-08-03 07:29:58.000000000 +0000 @@ -10,6 +10,10 @@ Note 1255 Slave already has been stopped set global binlog_alter_two_phase=true; connection server_3; +SET STATEMENT sql_log_bin=0 FOR +CALL mtr.add_suppression("The table mysql.gtid_slave_pos was removed. This change will not take full effect until all SQL threads have been restarted"); +SET STATEMENT sql_log_bin=0 FOR +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; SET GLOBAL slave_parallel_threads=20; set global slave_parallel_mode=optimistic; set global gtid_strict_mode=1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_chain_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -64,7 +64,10 @@ select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; domain_id seq_no 0 12 +connection server_1; +include/save_master_gtid.inc connection server_3; +include/sync_with_master_gtid.inc select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; domain_id seq_no 0 12 @@ -77,6 +80,7 @@ @@slave_parallel_threads 0 connection server_4; +include/sync_with_master_gtid.inc select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; domain_id seq_no 0 12 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_1.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,8 @@ set global binlog_alter_two_phase=true; connection slave; include/stop_slave.inc +SET STATEMENT sql_log_bin=0 FOR +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global gtid_strict_mode=1; # Legacy Master Slave connect master_node,127.0.0.1,root,,$db_name, $M_port; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_mysqlbinlog_2.result 2024-08-03 07:29:58.000000000 +0000 @@ -49,6 +49,10 @@ SET @save_binlog_alter_two_phase= @@GLOBAL.binlog_alter_two_phase; SET GLOBAL binlog_alter_two_phase = ON; connection server_3; +SET STATEMENT sql_log_bin=0 FOR +CALL mtr.add_suppression("The table mysql.gtid_slave_pos was removed. This change will not take full effect until all SQL threads have been restarted"); +SET STATEMENT sql_log_bin=0 FOR +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; SET @save_gtid_strict_mode= @@GLOBAL.gtid_strict_mode; SET @slave_parallel_threads= @@GLOBAL.slave_parallel_threads; SET @slave_parallel_mode= @@GLOBAL.slave_parallel_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_options.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_options.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_options.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_options.result 2024-08-03 07:29:58.000000000 +0000 @@ -3,8 +3,6 @@ connection slave; stop slave; change master to master_use_gtid= current_pos; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead SET GLOBAL slave_parallel_threads=4; set global slave_parallel_mode=optimistic; set global gtid_strict_mode=1; @@ -96,8 +94,6 @@ connection slave; stop slave; change master to master_use_gtid= current_pos; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead SET GLOBAL slave_parallel_threads=4; set global slave_parallel_mode=optimistic; set global gtid_strict_mode=1; @@ -189,8 +185,6 @@ connection slave; stop slave; change master to master_use_gtid= current_pos; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead SET GLOBAL slave_parallel_threads=4; set global slave_parallel_mode=optimistic; set global gtid_strict_mode=1; @@ -321,8 +315,6 @@ connection slave; stop slave; change master to master_use_gtid= current_pos; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead SET GLOBAL slave_parallel_threads=4; set global slave_parallel_mode=optimistic; set global gtid_strict_mode=1; @@ -377,8 +369,6 @@ alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=instant; alter table t1 add index if not exists index_1(f), force , algorithm=instant; alter table t1 disable keys, force , algorithm=copy; -Warnings: -Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option alter table t1 enable keys, force , algorithm=copy; Warnings: Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option @@ -414,8 +404,6 @@ connection slave; stop slave; change master to master_use_gtid= current_pos; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead SET GLOBAL slave_parallel_threads=4; set global slave_parallel_mode=optimistic; set global gtid_strict_mode=1; @@ -470,8 +458,6 @@ alter table t1 add column f varchar(100) after b,add column g varchar(100) first ,add column h char, force , algorithm=nocopy; alter table t1 add index if not exists index_1(f), force , algorithm=nocopy; alter table t1 disable keys, force , algorithm=copy; -Warnings: -Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option alter table t1 enable keys, force , algorithm=copy; Warnings: Note 1031 Storage engine InnoDB of the table `test`.`t1` doesn't have this option diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_start_alter_restart_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -52,6 +52,7 @@ # let's stop at first CA processing (in process_commit_alter) connection slave; include/sync_with_master_gtid.inc +# wait for CA_1 waiting itself connect extra_slave,127.0.0.1,root,,test,$SLAVE_MYPORT; stop slave;; connection slave; @@ -79,7 +80,9 @@ 0 5 include/start_slave.inc connection master; +include/save_master_gtid.inc connection slave; +include/sync_with_master_gtid.inc # Everything from the master binlog must have been applied now: select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; domain_id seq_no diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_binlog_max_cache_size.result 2024-08-03 07:29:58.000000000 +0000 @@ -197,7 +197,7 @@ SET GLOBAL binlog_cache_size= ORIGINAL_VALUE; SET GLOBAL max_binlog_stmt_cache_size= ORIGINAL_VALUE; SET GLOBAL binlog_stmt_cache_size= ORIGINAL_VALUE; -include/stop_slave.inc +include/stop_slave_io.inc include/start_slave.inc connection master; connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stm_start_stop_slave.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_start_stop_slave.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stm_start_stop_slave.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_start_stop_slave.result 2024-08-03 07:29:58.000000000 +0000 @@ -109,7 +109,7 @@ include/wait_for_slave_param.inc [Last_IO_Errno] Last_IO_Errno = '1236' Last_IO_Error = 'Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'master-bin.000001' at XXX, the last event read from 'master-bin.000001' at XXX, the last byte read from 'master-bin.000001' at XXX.'' -include/stop_slave.inc +include/stop_slave_sql.inc RESET SLAVE; Warnings: Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'No' to 'Slave_Pos' diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result 2024-08-03 07:29:58.000000000 +0000 @@ -43,7 +43,7 @@ Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction commit; connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1593] SELECT "Fatal error: ... Slave SQL Thread stopped with incomplete event group having non-transactional changes. If the group consists solely of row-based events, you can try to restart the slave with --slave-exec-mode=IDEMPOTENT, which ignores duplicate key, key not found, and similar errors (see documentation for details)." AS Last_SQL_Error, @check as `true`; Last_SQL_Error true Fatal error: ... Slave SQL Thread stopped with incomplete event group having non-transactional changes. If the group consists solely of row-based events, you can try to restart the slave with --slave-exec-mode=IDEMPOTENT, which ignores duplicate key, key not found, and similar errors (see documentation for details). 1 @@ -63,7 +63,7 @@ connection master; update tm as t1, ti as t2 set t1.a=t1.a * 2, t2.a=t2.a * 2; connection slave; -include/wait_for_slave_sql_to_stop.inc +include/wait_for_slave_sql_error.inc [errno=1593] SELECT "Fatal error: ... Slave SQL Thread stopped with incomplete event group having non-transactional changes. If the group consists solely of row-based events, you can try to restart the slave with --slave-exec-mode=IDEMPOTENT, which ignores duplicate key, key not found, and similar errors (see documentation for details)." AS Last_SQL_Error, @check as `true`; Last_SQL_Error true Fatal error: ... Slave SQL Thread stopped with incomplete event group having non-transactional changes. If the group consists solely of row-based events, you can try to restart the slave with --slave-exec-mode=IDEMPOTENT, which ignores duplicate key, key not found, and similar errors (see documentation for details). 1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stop_slave_error.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stop_slave_error.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_stop_slave_error.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_stop_slave_error.result 2024-08-03 07:29:58.000000000 +0000 @@ -2,7 +2,9 @@ [connection master] connection master; connection slave; +# MDEV-32892: Repeatedly starting/stopping io_thread.. include/stop_slave.inc NOT FOUND /Error reading packet from server: Lost connection/ in slave_log.err +NOT FOUND /error code: 2013/ in slave_log.err include/start_slave.inc include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_temporary_error2_skip_all.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,64 @@ +include/master-slave.inc +[connection master] +call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction"); +*** Provoke a deadlock on the slave, check that transaction retry succeeds. *** +connection master; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +CREATE TABLE t2 (a INT) ENGINE=InnoDB; +INSERT INTO t1(a) VALUES (1), (2), (3), (4), (5); +connection slave; +SELECT * FROM t1 ORDER BY a; +a b +1 NULL +2 NULL +3 NULL +4 NULL +5 NULL +SET sql_log_bin=0; +ALTER TABLE t2 ENGINE=MyISAM; +SET sql_log_bin=1; +connect con_temp1,127.0.0.1,root,,test,$SERVER_MYPORT_2,; +connection con_temp1; +BEGIN; +UPDATE t1 SET b=2 WHERE a=4; +INSERT INTO t2 VALUES (2); +DELETE FROM t2 WHERE a=2; +connection master; +BEGIN; +UPDATE t1 SET b=1 WHERE a=2; +INSERT INTO t2 VALUES (1); +UPDATE t1 SET b=1 WHERE a=4; +COMMIT; +connection slave; +connection con_temp1; +UPDATE t1 SET b=2 WHERE a=2; +SELECT * FROM t1 WHERE a<10 ORDER BY a; +a b +1 NULL +2 2 +3 NULL +4 2 +5 NULL +ROLLBACK; +Warnings: +Warning 1196 Some non-transactional changed tables couldn't be rolled back +connection slave; +SELECT * FROM t1 ORDER BY a; +a b +1 NULL +2 NULL +3 NULL +4 NULL +5 NULL +* There will be one row in t2 because the ignored deadlock does not retry. +SELECT * FROM t2 ORDER BY a; +a +1 +retries +0 +Last_SQL_Errno = '0' +Last_SQL_Error = '' +connection master; +DROP TABLE t1; +DROP TABLE t2; +include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_using_gtid_default.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_using_gtid_default.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_using_gtid_default.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_using_gtid_default.result 2024-08-03 07:29:58.000000000 +0000 @@ -58,8 +58,6 @@ # to its default of Slave_Pos after RESET SLAVE. include/stop_slave.inc CHANGE MASTER TO MASTER_USE_GTID=Current_Pos; -Warnings: -Warning 1681 'master_use_gtid=current_pos' is deprecated and will be removed in a future release. Please use master_demote_to_slave=1 instead include/start_slave.inc include/stop_slave.inc RESET SLAVE; @@ -117,7 +115,10 @@ # not master_use_gtid=no should warn the user that Using_Gtid is being # changed to No. # +connection master; +include/save_master_pos.inc connection slave; +include/sync_io_with_master.inc include/stop_slave.inc CHANGE MASTER TO master_log_pos=io_log_pos, master_log_file='io_log_file'; Warnings: diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_xa_empty_transaction.result mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_xa_empty_transaction.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/rpl_xa_empty_transaction.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/rpl_xa_empty_transaction.result 2024-08-03 07:29:58.000000000 +0000 @@ -1164,6 +1164,88 @@ connection server_1; set @@binlog_format = @sav_binlog_format; set @@global.binlog_format = @sav_binlog_format; +# +# MDEV-33921.1: If a slave's replication of an XA transaction results in +# an empty transaction, e.g. due to replication filters, the slave +# should not binlog any part of the XA transaction. +connection server_1; +create database db1; +create database db2; +create table db1.t1 (a int) engine=innodb; +include/save_master_gtid.inc +connection server_3; +include/sync_with_master_gtid.inc +include/stop_slave.inc +change master to master_use_gtid=slave_pos; +connection server_2; +include/stop_slave.inc +SET @@GLOBAL.replicate_ignore_db= ""; +SET @@GLOBAL.replicate_do_db= "db2"; +change master to master_use_gtid=slave_pos; +include/start_slave.inc +connection server_1; +use db1; +XA START "x1"; +insert into db1.t1 values (1); +XA END "x1"; +XA PREPARE "x1"; +XA COMMIT "x1"; +include/save_master_gtid.inc +connection server_2; +include/sync_with_master_gtid.inc +connection server_2; +include/save_master_gtid.inc +connection server_3; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# 33921.2: If the slave shuts down after "preparing" a filtered-to-empty +# XA transaction (and not completing it), then when the respective +# XA completion (COMMIT in this test) command is replicated, the slave +# should not throw ER_XAER_NOTA. Note that internally, the error is +# thrown, but it is ignored because the target db is filtered. +connection server_3; +include/stop_slave.inc +connection server_1; +use db1; +XA START "x2"; +insert into db1.t1 values (2); +XA END "x2"; +XA PREPARE "x2"; +include/save_master_gtid.inc +connection server_2; +include/sync_with_master_gtid.inc +# Connection named slave is needed for reconnection +connect slave,localhost,root,,; +connect slave1,localhost,root,,; +include/rpl_restart_server.inc [server_number=2] +connection server_2; +include/stop_slave.inc +SET @@GLOBAL.replicate_do_db= "db2"; +change master to master_use_gtid=slave_pos; +include/start_slave.inc +connection server_1; +XA COMMIT "x2"; +include/save_master_gtid.inc +connection server_2; +include/sync_with_master_gtid.inc +include/save_master_gtid.inc +connection server_3; +include/start_slave.inc +include/sync_with_master_gtid.inc +# +# 33921.3: Ensure XA commands are not considered by mysqlbinlog's +# --database filter +connection server_1; +# MYSQL_BINLOG datadir/binlog_file --start-position=pre_xa_pos --database=db2 --result-file=assert_file +include/assert_grep.inc [Mysqlbinlog should output all XA commands from the filtered transaction] +connection server_2; +include/stop_slave.inc +SET @@GLOBAL.replicate_do_db=""; +include/start_slave.inc +connection server_1; +drop database db1; +drop database db2; connection server_1; include/rpl_end.inc # End of rpl_xa_empty_transaction.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/semisync_future-7591.result mariadb-10.11.9/mysql-test/suite/rpl/r/semisync_future-7591.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/semisync_future-7591.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/semisync_future-7591.result 2024-08-03 07:29:58.000000000 +0000 @@ -13,7 +13,7 @@ insert into t1 values (1); reset master; connection slave; -include/stop_slave.inc +include/stop_slave_sql.inc include/reset_slave.inc Warnings: Note 4190 RESET SLAVE is implicitly changing the value of 'Using_Gtid' from 'No' to 'Slave_Pos' diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result mariadb-10.11.9/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result --- mariadb-10.11.6/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/r/show_status_stop_slave_race-7126.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,5 @@ include/master-slave.inc [connection master] -call mtr.add_suppression("Master is configured to log replication events"); connection slave; connection slave; include/wait_for_slave_to_stop.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/create_or_replace.inc mariadb-10.11.9/mysql-test/suite/rpl/t/create_or_replace.inc --- mariadb-10.11.6/mysql-test/suite/rpl/t/create_or_replace.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/create_or_replace.inc 2024-08-03 07:29:58.000000000 +0000 @@ -213,12 +213,19 @@ drop temporary table if exists t9; --connect(con1,localhost,root,,) +--let $conid = `SELECT CONNECTION_ID()` set session binlog_format=default; create temporary table t9 (i int); --echo *** Must be no DROP logged for t9 when there was no CREATE, at disconnect too *** --disconnect con1 --connection server_1 +# The disconnect runs asynchroneously. Wait for it to complete, otherwise the +# DROP TEMPORARY TABLE may not have been binlogged yet when SHOW BINLOG EVENTS +# is run. +--let $wait_condition= SELECT COUNT(*)=0 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID=$conid +--source include/wait_condition.inc + --source include/show_binlog_events.inc # Clean up diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test mariadb-10.11.9/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test 2024-08-03 07:29:58.000000000 +0000 @@ -54,7 +54,8 @@ --source include/start_slave.inc --echo # wait for T1 ---let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)%' and command LIKE 'Slave_worker'; +# Wildcard for `state` as it depends on whether WSREP is compiled in or not. +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(%' and command LIKE 'Slave_worker'; --source include/wait_condition.inc --echo # wait for T2 @@ -81,7 +82,9 @@ --connection slave --echo # --echo # Cleanup ---source include/stop_slave.inc +--let $rpl_allow_error= 1 +--source include/wait_for_slave_sql_to_stop.inc +--source include/stop_slave_io.inc eval set @@global.slave_parallel_threads= $save_slave_parallel_threads; eval set @@global.slave_parallel_mode= $save_slave_parallel_mode; eval set @@global.innodb_lock_wait_timeout= $save_innodb_lock_wait_timeout; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/parallel_backup_xa.inc mariadb-10.11.9/mysql-test/suite/rpl/t/parallel_backup_xa.inc --- mariadb-10.11.6/mysql-test/suite/rpl/t/parallel_backup_xa.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/parallel_backup_xa.inc 2024-08-03 07:29:58.000000000 +0000 @@ -41,7 +41,7 @@ { SET @sav_innodb_lock_wait_timeout = @@global.innodb_lock_wait_timeout; SET @sav_slave_transaction_retries = @@global.slave_transaction_retries; - SET @@global.innodb_lock_wait_timeout =1; + SET @@global.innodb_lock_wait_timeout =5; SET @@global.slave_transaction_retries=0; } --source include/start_slave.inc @@ -59,6 +59,7 @@ { --let $wait_condition= SELECT COUNT(*) = 0 FROM information_schema.processlist WHERE state = "Waiting for prior transaction to commit" --source include/wait_condition.inc + --let $rpl_allow_error=1 } ROLLBACK; --let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE state = "Waiting for backup lock" @@ -71,6 +72,7 @@ { --source include/sync_with_master_gtid.inc } +--let $rpl_only_running_threads= 1 --source include/stop_slave.inc if ($slave_ooo_error) { diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_auditing.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_auditing.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_auditing.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_auditing.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,77 @@ +if (!$SERVER_AUDIT2_SO) { + skip No SERVER_AUDIT2 plugin; +} + +source include/master-slave.inc; + +--disable_warnings +drop table if exists t1; +sync_slave_with_master; +reset master; +--enable_warnings + +--disable_warnings +CREATE TABLE IF NOT EXISTS mysql.server_audit_filters ( + filtername char(80) COLLATE utf8_bin NOT NULL DEFAULT '', + rule longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT 'true' CHECK (json_valid(rule)), + CONSTRAINT c_filtername UNIQUE (filtername) +) ENGINE=Aria; + +CREATE TABLE IF NOT EXISTS mysql.server_audit_users (host char(60) COLLATE utf8_bin NOT NULL DEFAULT '', + user char(80) COLLATE utf8_bin NOT NULL DEFAULT '', + filtername char(80) NOT NULL DEFAULT '', + CONSTRAINT c_host_user UNIQUE (host, user) +) ENGINE=Aria; +--enable_warnings + +INSERT INTO mysql.server_audit_filters VALUES ('ignore_sys', '{"ignore_tables" : "mysql.*"}'); +INSERT INTO mysql.server_audit_users VALUES ('%','','ignore_sys'); +INSERT INTO mysql.server_audit_users VALUES ('%','root','ignore_sys'); + +install plugin server_audit soname 'server_audit2'; +set global server_audit_logging=on; + +# this is done to make test deterministic +# so the above 'set' command is always logged before the 'create table t1' +-- disable_query_log +-- disable_result_log +select * from mysql.server_audit_filters; +select * from mysql.server_audit_users; +-- enable_result_log +-- enable_query_log + +connection master; +create table t1 (a int); +insert into t1 values (1); +truncate t1; +drop table t1; +sync_slave_with_master; + +set global server_audit_logging=off; + +truncate mysql.server_audit_filters; +truncate mysql.server_audit_users; +INSERT INTO mysql.server_audit_filters VALUES ('no_logging','false'); +INSERT INTO mysql.server_audit_users VALUES ('%','','no_logging'); + +set global server_audit_logging=on; + +connection master; +create table t1 (a int); +insert into t1 values (1); +truncate t1; +drop table t1; +sync_slave_with_master; + +set global server_audit_logging=off; +uninstall plugin server_audit; +truncate mysql.server_audit_filters; +truncate mysql.server_audit_users; +let $MYSQLD_DATADIR= `SELECT @@datadir`; +# replace the timestamp and the hostname with constant values +--replace_regex /[0-9]* [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\,[^,]*\,/TIME,HOSTNAME,/ /\,[1-9][0-9]*\,/,1,/ /\,[1-9][0-9]*/,ID/ /000001\\', [0-9]*,/#', POS,/ +cat_file $MYSQLD_DATADIR/server_audit.log; +remove_file $MYSQLD_DATADIR/server_audit.log; + +connection master; +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_loaddata.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_loaddata.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_loaddata.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_loaddata.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,47 @@ +--source include/have_binlog_format_statement.inc +--source include/have_debug.inc +--source include/master-slave.inc + +--connection master +# Set minimal cache size so smaller transaction can trigger spill to disk. +SET @save_binlog_stmt_cache_size= @@GLOBAL.binlog_stmt_cache_size; +SET GLOBAL binlog_stmt_cache_size= 4096; + +CALL mtr.add_suppression('"No space left on device".*An incident event is written to binary log'); +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=MyISAM; + +FLUSH STATUS; +SHOW STATUS LIKE "binlog_stmt_cache%"; +SET @old_dbug= @@SESSION.debug_dbug; +SET SESSION debug_dbug="+d,load_data_binlog_cache_error"; +--replace_regex /Error writing file '[^']+'/Error writing file ''/ +--error 3 +LOAD DATA CONCURRENT LOCAL INFILE 'std_data/bug30435_5k.txt' + REPLACE INTO TABLE t1 (a); +SET SESSION debug_dbug= @old_dbug; +SHOW STATUS LIKE "binlog_stmt_cache%"; +# The actual number of rows left after the disk full error may change as +# binlog event sizes are modified. So here we just test that we get partial +# update from the last INSERT..SELECT that gets disk full error. +SELECT IF(COUNT(*) > 0 AND COUNT(*) < 5000, + "ok", + CONCAT("ERROR! Row count ", COUNT(*), " not as expected for partially executed query")) + AS check_result + FROM t1; + +--save_master_pos + +--connection slave +--let $slave_sql_errno= 1590 +--source include/wait_for_slave_sql_error_and_skip.inc + +--sync_with_master +SELECT COUNT(*) FROM t1; + +# Cleanup + +--connection master +SET GLOBAL binlog_stmt_cache_size= @save_binlog_stmt_cache_size; +DROP TABLE t1; + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_row.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_row.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_row.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_cache_disk_full_row.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,61 @@ +--source include/have_binlog_format_row.inc +--source include/have_debug.inc +--source include/master-slave.inc + +--connection master +# Set minimal cache size so smaller transaction can trigger spill to disk. +SET @save_binlog_stmt_cache_size= @@GLOBAL.binlog_stmt_cache_size; +SET GLOBAL binlog_stmt_cache_size= 4096; + +CALL mtr.add_suppression('"No space left on device".*An incident event is written to binary log'); +CREATE TABLE t1 (a INT PRIMARY KEY, b VARCHAR(255)) ENGINE=MyISAM; + +FLUSH STATUS; +SHOW STATUS LIKE "binlog_stmt_cache%"; +INSERT INTO t1 VALUES (0, CONCAT("?", "-", REPEAT("x", 200))); +INSERT INTO t1 SELECT a+1, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+2, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+4, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+8, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+16, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+32, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+64, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +INSERT INTO t1 SELECT a+128, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +SHOW STATUS LIKE "binlog_stmt_cache%"; + +SET @old_dbug= @@SESSION.debug_dbug; +SET SESSION debug_dbug="+d,simulate_disk_full_at_flush_pending"; +--replace_regex /Error writing file '[^']+'/Error writing file ''/ +--error 3 +INSERT INTO t1 SELECT a+256, CONCAT(a, "-", REPEAT("x", 200)) FROM t1; +SET SESSION debug_dbug= @old_dbug; +SHOW STATUS LIKE "binlog_stmt_cache%"; +# The actual number of rows left after the disk full error may change as +# binlog event sizes are modified. So here we just test that we get partial +# update from the last INSERT..SELECT that gets disk full error. +SELECT IF(COUNT(*) > 256 AND COUNT(*) < 512, + "ok", + CONCAT("ERROR! Row count ", COUNT(*), " not as expected for partially executed query")) + AS check_result + FROM t1; + +# A random extra event that helped show the bug that a partial event +# group was binlogged. +ALTER TABLE t1 COMMENT ''; + +--save_master_pos + +--connection slave +--let $slave_sql_errno= 1590 +--source include/wait_for_slave_sql_error_and_skip.inc + +--sync_with_master +SELECT COUNT(*) FROM t1; + +# Cleanup + +--connection master +SET GLOBAL binlog_stmt_cache_size= @save_binlog_stmt_cache_size; +DROP TABLE t1; + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_binlog_dump_slave_gtid_state_info.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_dump_slave_gtid_state_info.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_binlog_dump_slave_gtid_state_info.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_binlog_dump_slave_gtid_state_info.test 2024-08-03 07:29:58.000000000 +0000 @@ -39,6 +39,7 @@ --source include/master-slave.inc --connection master +SET @org_log_warnings=@@GLOBAL.LOG_WARNINGS; SET GLOBAL LOG_WARNINGS=2; --connection slave @@ -59,7 +60,7 @@ --let SEARCH_FILE=$log_error_ --let SEARCH_RANGE=-50000 --let SEARCH_PATTERN=using_gtid\(1\), gtid\(\'\'\).* ---source include/search_pattern_in_file.inc +--source include/wait_for_pattern_in_file.inc --connection slave --source include/stop_slave.inc @@ -71,7 +72,7 @@ --let SEARCH_FILE=$log_error_ --let SEARCH_RANGE=-50000 --let SEARCH_PATTERN=using_gtid\(0\), gtid\(\'\'\).* ---source include/search_pattern_in_file.inc +--source include/wait_for_pattern_in_file.inc CREATE TABLE t (f INT) ENGINE=INNODB; INSERT INTO t VALUES(10); save_master_pos; @@ -89,7 +90,7 @@ --let SEARCH_FILE=$log_error_ --let SEARCH_RANGE=-50000 --let SEARCH_PATTERN=using_gtid\(1\), gtid\(\'0-1-2\'\).* ---source include/search_pattern_in_file.inc +--source include/wait_for_pattern_in_file.inc SET @@SESSION.gtid_domain_id=10; INSERT INTO t VALUES(20); save_master_pos; @@ -107,9 +108,10 @@ --let SEARCH_FILE=$log_error_ --let SEARCH_RANGE=-50000 --let SEARCH_PATTERN=using_gtid\(1\), gtid\(\'0-1-2,10-1-1\'\).* ---source include/search_pattern_in_file.inc +--source include/wait_for_pattern_in_file.inc --echo "===== Clean up =====" +SET GLOBAL LOG_WARNINGS=@org_log_warnings; --connection slave --source include/stop_slave.inc CHANGE MASTER TO MASTER_USE_GTID=no; @@ -117,5 +119,4 @@ --connection master DROP TABLE t; -SET GLOBAL LOG_WARNINGS=default; --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_change_master.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_change_master.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_change_master.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_change_master.test 2024-08-03 07:29:58.000000000 +0000 @@ -109,9 +109,4 @@ CHANGE MASTER TO MASTER_USER='root', MASTER_PASSWORD='', MASTER_SSL=0; -# MDEV-20122: Deprecate MASTER_USE_GTID=Current_Pos to favor new MASTER_DEMOTE_TO_SLAVE option ---echo "Usage of CURRENT_POS in CHANGE MASTER MASTER_USE_GTID is dreprecated. -CHANGE MASTER TO MASTER_USE_GTID=CURRENT_POS; -CHANGE MASTER TO MASTER_USE_GTID=SLAVE_POS; - --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_change_master_demote.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_change_master_demote.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_change_master_demote.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_change_master_demote.test 2024-08-03 07:29:58.000000000 +0000 @@ -73,6 +73,9 @@ # non-boolean value. # # +# Additionally ensure MASTER_DEMOTE_TO_REPLICA aliases MASTER_DEMOTE_TO_SLAVE +# +# # References: # MDEV-19801: Change defaults for CHANGE MASTER TO so that GTID-based # replication is used by default if master supports it @@ -273,24 +276,44 @@ --echo # binlog position and should still succeed despite the SSU stop --echo # position pointing to a previous event (because --echo # master_demote_to_slave=1 merges gtid_binlog_pos into gtid_slave_pos). + +# Note that we can't use sync_with_master_gtid.inc, +# wait_for_slave_to_start.inc, or wait_for_slave_to_stop.inc because our MTR +# connection thread races with the start/stop of the SQL/IO threads. So +# instead, for slave start, we prove the threads started by waiting for the +# connection count to increase by 2; and for slave stop, we wait for the +# processlist count to return to its pre start slave number. + +--let $pre_start_slave_conn_count= query_get_value(SHOW STATUS LIKE 'Connections', Value, 1) +--let $pre_start_slave_process_count= `SELECT count(*) from information_schema.PROCESSLIST` + --replace_result $ssu_middle_binlog_pos ssu_middle_binlog_pos eval START SLAVE UNTIL master_gtid_pos="$ssu_middle_binlog_pos"; --echo # Slave needs time to start and stop automatically -# Note sync_with_master_gtid.inc, wait_for_slave_to_start.inc, and -# wait_for_slave_to_stop.inc won't work due to replication state and race -# conditions ---sleep 1 +--echo # Waiting for both SQL and IO threads to have started.. +--let $expected_cons_after_start_slave= `SELECT ($pre_start_slave_conn_count + 2)` +--let $status_var= Connections +--let $status_var_value= $expected_cons_after_start_slave +--let $status_var_comparsion= >= +--source include/wait_for_status_var.inc +--let $status_var_comparsion= + +--echo # Waiting for Slave SQL and IO threads to be killed.. +--let $wait_condition= SELECT count(*)=$pre_start_slave_process_count from information_schema.PROCESSLIST +--source include/wait_condition.inc --echo # Validating neither SQL nor IO threads are running.. --let $io_state= query_get_value("SHOW SLAVE STATUS", Slave_IO_State, 1) if (`SELECT strcmp("$io_state","") != 0`) { + --echo # Slave_IO_State is "$io_state" but should be empty die "IO thread should not be running after START SLAVE UNTIL master_gtid_pos using a pre-existing GTID"; } --let $sql_state= query_get_value("SHOW SLAVE STATUS", Slave_SQL_Running_State, 1) if (`SELECT strcmp("$sql_state","") != 0`) { + --echo # Slave_SQL_Running_State is "$sql_state" but should be empty die "SQL thread should not be running after START SLAVE UNTIL master_gtid_pos using a pre-existing GTID"; } --echo # ..success @@ -455,6 +478,37 @@ --echo # +--echo # MDEV-31768 +--echo # Ensure MASTER_DEMOTE_TO_REPLICA aliases MASTER_DEMOTE_TO_SLAVE +--echo # +--connection slave +RESET MASTER; +--source include/reset_slave.inc +CREATE TABLE t_mdev_31768 (a int); +--let $gtid_binlog_pos= `SELECT @@GLOBAL.gtid_binlog_pos` +CHANGE MASTER TO master_use_gtid=Replica_Pos, master_demote_to_replica=1; +--let $gtid_slave_pos= `SELECT @@GLOBAL.gtid_slave_pos` + +--echo # Validating alias MASTER_DEMOTE_TO_REPLICA provides intended behavior.. +if (`SELECT strcmp("$gtid_binlog_pos","$gtid_slave_pos") != 0`) +{ + --echo # ..failed + --echo # Binlog pos: $gtid_binlog_pos + --echo # Replica pos: $gtid_slave_pos + die MASTER_DEMOTE_TO_REPLICA does not alias MASTER_DEMOTE_TO_SLAVE correctly; +} +--echo # ..success + +DROP TABLE t_mdev_31768; +RESET MASTER; +--source include/reset_slave.inc + +--echo # Clear primary binlog state to match replica +--connection master +RESET MASTER; + + +--echo # --echo # Cleanup --echo # --connection master diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_checksum.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_checksum.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_checksum.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_checksum.test 2024-08-03 07:29:58.000000000 +0000 @@ -95,6 +95,9 @@ flush logs; -- source include/wait_for_binlog_checkpoint.inc flush logs; +# The binlog position here is output in the error message from +# wait_for_slave_io_error below, so make sure it's deterministic. +-- source include/wait_for_binlog_checkpoint.inc sync_slave_with_master; #connection slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_circular_semi_sync.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_circular_semi_sync.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_circular_semi_sync.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_circular_semi_sync.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,6 +7,9 @@ --source include/have_binlog_format_mixed.inc --source include/master-slave.inc +connection server_2; +call mtr.add_suppression("Timeout waiting for reply of binlog"); + # The following tests prove # A. # no out-of-order gtid error is done to the stict gtid mode semisync @@ -66,10 +69,18 @@ --connection server_2 set @@global.gtid_strict_mode = true; set @@global.rpl_semi_sync_master_enabled = 1; + +# The following command is likely to cause the slave master is not yet setup +# for semi-sync + INSERT INTO t1(a) VALUES (2); --source include/save_master_gtid.inc --connection server_1 +# Update slave to notice that server_2 now has rpl_semi_sync_master_enabled +--source include/stop_slave.inc +--source include/start_slave.inc + --echo # --echo # the successful sync is a required proof --echo # diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_connection.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_connection.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_connection.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_connection.test 2024-08-03 07:29:58.000000000 +0000 @@ -16,7 +16,7 @@ START SLAVE; --let $slave_io_errno= 1045, 1593 --source include/wait_for_slave_io_error.inc ---source include/stop_slave.inc +--source include/stop_slave_sql.inc CHANGE MASTER TO MASTER_USER= 'root', MASTER_PASSWORD= ''; START SLAVE; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_deadlock_show_slave_status.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_deadlock_show_slave_status.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_deadlock_show_slave_status.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_deadlock_show_slave_status.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,121 @@ +# +# Verify that SHOW SLAVE STATUS will not cause deadlocks on the replica. +# A deadlock has been seen in do_gco_wait if the thread is killed, as it will +# hold the LOCK_parallel_entry, and during error reporting, try to grab the +# err_lock. Prior to MDEV-10653, SHOW SLAVE STATUS would grab these locks in +# the reverse order, as calling workers_idle() used to grab LOCK_parallel_entry +# with the err_lock already grabbed (though the MDEV-10653 patch changed the +# workles_idle() implementation to remove the need for locking the +# parallel_entry). +# +# References: +# MDEV-10653: SHOW SLAVE STATUS Can Deadlock an Errored Slave +# + +--source include/master-slave.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_binlog_format_row.inc + +--echo # +--echo # Initialize test data +--connection master +create table t1 (a int) engine=innodb; +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc + +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Commit failed due to failure of an earlier commit on which this one depends"); + +set @save_parallel_threads= @@global.slave_parallel_threads; +set @save_parallel_mode= @@global.slave_parallel_mode; +set @save_transaction_retries= @@global.slave_transaction_retries; +set @save_innodb_lock_wait_timeout= @@global.innodb_lock_wait_timeout; + +set @@global.slave_parallel_threads= 2; +set @@global.slave_parallel_mode= CONSERVATIVE; +set @@global.slave_transaction_retries= 0; +set @@global.innodb_lock_wait_timeout= 10; + +--echo # Grabbing lock on innodb row to force future replication transaction to wait (and eventually timeout) +BEGIN; +select * from t1 where a=1 for update; + +--connection master + +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; + + +# GCO 1 +SET @commit_id= 10000; +# T1 +update t1 set a=2 where a=1; + +# GCO 2 +SET @commit_id= 10001; +# T2 +insert into t1 values (3); + +set @@session.debug_dbug= @old_dbug; + +--connection slave +start slave; + +--echo # Waiting for first transaction to start (and be held at innodb row lock).. +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(%)%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # Waiting for next transaction to start and hold at do_gco_wait().. +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--connection slave1 +set @@session.debug_dbug="+d,hold_sss_with_err_lock"; +--send show slave status + +--connection slave +set debug_sync="now wait_for sss_got_err_lock"; + +--let $t2_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for prior transaction to start commit%'` +--replace_result $t2_tid "" +--eval kill $t2_tid +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE command LIKE 'Killed'; +--source include/wait_condition.inc + +set debug_sync="now signal sss_continue"; + +--connection slave1 +--echo # Waiting for SHOW SLAVE STATUS to complete.. +--disable_result_log +--reap +--enable_result_log +--echo # ..done + +--connection slave +ROLLBACK; +--let $slave_sql_errno= 1927 +--source include/wait_for_slave_sql_error.inc + + +--echo # +--echo # Cleanup +--connection master +drop table t1; +--source include/save_master_gtid.inc + +--connection slave +set debug_sync= "RESET"; +set @@global.slave_parallel_threads= @save_parallel_threads; +set @@global.slave_parallel_mode= @save_parallel_mode; +set @@global.slave_transaction_retries= @save_transaction_retries; +set @@global.innodb_lock_wait_timeout= @save_innodb_lock_wait_timeout; +start slave sql_thread; +--source include/sync_with_master_gtid.inc + +--source include/rpl_end.inc +--echo # End of rpl_deadlock_show_slave_status.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_delayed_slave.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_delayed_slave.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_delayed_slave.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_delayed_slave.test 2024-08-03 07:29:58.000000000 +0000 @@ -192,6 +192,12 @@ --enable_query_log --source include/start_slave.inc +# Ensure that slave has started properly +--connection master +INSERT INTO t1 VALUES ('Syncing slave', 5); +--save_master_pos +--sync_slave_with_master + --connection master INSERT INTO t1 VALUES (delay_on_slave(1), 6); --save_master_pos diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_domain_id_filter_io_crash.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_io_crash.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_domain_id_filter_io_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_io_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,6 +9,7 @@ INSERT INTO t1 VALUES(1); SELECT * FROM t1; sync_slave_with_master; +--source include/save_master_gtid.inc connection slave; @@ -28,7 +29,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -44,7 +45,7 @@ INSERT INTO t1 VALUES(2); INSERT INTO t1 VALUES(3); COMMIT; -save_master_pos; +--source include/save_master_gtid.inc SELECT * FROM t1; connection slave; @@ -55,7 +56,7 @@ START SLAVE io_thread; --source include/wait_for_slave_io_to_start.inc -sync_with_master; +--source include/sync_with_master_gtid.inc SELECT * FROM t1; --echo # Case 1 : Start slave with IGNORE_DOMAIN_IDS=(1), then restart @@ -70,7 +71,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -86,7 +87,7 @@ INSERT INTO t1 VALUES(5); COMMIT; -save_master_pos; +--source include/save_master_gtid.inc SELECT * FROM t1; connection slave; @@ -97,7 +98,7 @@ START SLAVE io_thread; --source include/wait_for_slave_io_to_start.inc -sync_with_master; +--source include/sync_with_master_gtid.inc SELECT * FROM t1; --echo # Case 2 : Start slave with IGNORE_DOMAIN_IDS=(), then restart @@ -112,7 +113,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -140,7 +141,7 @@ INSERT INTO t1 VALUES(11); COMMIT; -save_master_pos; +--source include/save_master_gtid.inc SELECT * FROM t1; connection slave; @@ -149,8 +150,7 @@ SELECT * FROM t1; SET @@global.debug_dbug=@saved_dbug; - ---source include/stop_slave.inc +--source include/stop_slave_sql.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before @@ -158,7 +158,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -179,7 +179,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -197,6 +197,15 @@ INSERT INTO t1 VALUES(13); COMMIT; # IO thread gets killed here. +# MDEV-14357 +# As the prior transaction will be ignored on slave because its domain id is +# ignored, the replica's gtid_slave_pos will be updated to have seen it, +# despite its eventual failure to queue the whole transaction to the relay log. +# So for test consistency, we need to synchronize the SQL thread with this +# position; otherwise, when restarting the server after resetting +# IGNORE_DOMAIN_IDS, we will re-fetch this event and execute it. +--source include/save_master_gtid.inc + START TRANSACTION; INSERT INTO t1 VALUES(14); INSERT INTO t1 VALUES(15); @@ -208,7 +217,6 @@ INSERT INTO t1 VALUES(17); COMMIT; -save_master_pos; SELECT * FROM t1; connection slave; @@ -218,15 +226,24 @@ SET @@global.debug_dbug=@saved_dbug; ---source include/stop_slave.inc +# MDEV-14357 +# Ensure the SQL thread is updated with the GTID of the ignored transaction +# so we don't fetch it and execute it after restarting without any ignored +# domain ids. +--source include/sync_with_master_gtid.inc +--source include/stop_slave_sql.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; + +--connection master +--source include/save_master_gtid.inc +--connection slave --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -247,7 +264,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -265,6 +282,11 @@ INSERT INTO t1 VALUES(19); # IO thread gets killed here. COMMIT; +# MDEV-14357 +# Synchronize gtid_slave_pos with the ignored event. See prior comments about +# MDEV-14357 for details. +--source include/save_master_gtid.inc + START TRANSACTION; INSERT INTO t1 VALUES(20); INSERT INTO t1 VALUES(21); @@ -276,7 +298,6 @@ INSERT INTO t1 VALUES(23); COMMIT; -save_master_pos; SELECT * FROM t1; connection slave; @@ -286,15 +307,23 @@ SET @@global.debug_dbug=@saved_dbug; ---source include/stop_slave.inc +# MDEV-14357 +# Synchronize gtid_slave_pos with the ignored event. See prior comments about +# MDEV-14357 for details. +--source include/sync_with_master_gtid.inc +--source include/stop_slave_sql.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before --echo IGNORE_DOMAIN_IDS (BEFORE) : $ignore_domain_ids_before CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; + +--connection master +--source include/save_master_gtid.inc +--connection slave --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -315,7 +344,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); @@ -344,7 +373,7 @@ INSERT INTO t1 VALUES(29); COMMIT; -save_master_pos; +--source include/save_master_gtid.inc SELECT * FROM t1; connection slave; @@ -354,7 +383,7 @@ SET @@global.debug_dbug=@saved_dbug; ---source include/stop_slave.inc +--source include/stop_slave_sql.inc let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); --echo DO_DOMAIN_IDS (BEFORE) : $do_domain_ids_before @@ -362,7 +391,7 @@ CHANGE MASTER TO IGNORE_DOMAIN_IDS=(1), MASTER_USE_GTID=slave_pos; --source include/start_slave.inc -sync_with_master; +--source include/sync_with_master_gtid.inc let $do_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); let $ignore_domain_ids_after= query_get_value(SHOW SLAVE STATUS, Replicate_Ignore_Domain_Ids, 1); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_domain_id_filter_master_crash.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_master_crash.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_domain_id_filter_master_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_master_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,9 +6,12 @@ connection master; +--disable_query_log call mtr.add_suppression("mysqld: Table '.*gtid_slave_pos' is marked as crashed and should be repaired"); call mtr.add_suppression("Checking table: './mysql/gtid_slave_pos'"); call mtr.add_suppression("mysql.gtid_slave_pos: 1 client is using or hasn't closed the table properly"); +call mtr.add_suppression("Could not read packet:.* errno: 11"); +--enable_query_log SET @@session.gtid_domain_id= 0; create table ti (a int auto_increment primary key) engine=innodb; @@ -39,7 +42,7 @@ insert into tm set a=null; set @@global.debug_dbug="+d,crash_before_send_xid"; ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.1.expect connection slave; let $do_domain_ids_before= query_get_value(SHOW SLAVE STATUS, Replicate_Do_Domain_Ids, 1); @@ -61,14 +64,32 @@ --enable_reconnect --let $rpl_server_number=1 --source include/rpl_start_server.inc -#--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +#--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/wait_until_connected_again.inc --echo # Master has restarted successfully save_master_pos; --connection slave ---source include/stop_slave.inc + +# Left to its own devices, the IO thread may or may not stop in error, +# depending on what it is doing when its connection to the primary is killed +# (e.g. a failed read results in an error, whereas if the IO thread is idly +# waiting for events when the connection dies, it will enter into a reconnect +# loop and reconnect). So we manually stop/start the IO thread to ensure it is +# in a consistent state +# +# FIXME: We shouldn't need to stop/start the SQL thread here, but due to +# MDEV-33268, we have to. So after fixing 33268, this should only stop/start +# the IO thread. Note the SQL thread must be stopped first due to an invalid +# DBUG_ASSERT in the IO thread's stop logic that depends on the state of the +# SQL thread (also reported and to be fixed in the same ticket). +# +--source include/stop_slave_sql.inc +--let rpl_allow_error=1 +--source include/stop_slave_io.inc +--let rpl_allow_error= --source include/start_slave.inc + sync_with_master; select * from ti; select * from tm; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_domain_id_filter_restart.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_restart.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_domain_id_filter_restart.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_domain_id_filter_restart.test 2024-08-03 07:29:58.000000000 +0000 @@ -35,9 +35,10 @@ INSERT INTO t2 VALUES(1); SELECT * FROM t2; -sync_slave_with_master; +source include/save_master_gtid.inc; connection slave; +source include/sync_with_master_gtid.inc; SELECT * FROM t1; SELECT * FROM t2; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test 2024-08-03 07:29:58.000000000 +0000 @@ -30,6 +30,10 @@ --let $rpl_skip_start_slave=1 --source include/master-slave.inc +--disable_query_log +call mtr.add_suppression("Could not read packet:.* errno: 11"); +--enable_query_log + # Do an insert on master CREATE TABLE t1(a int); INSERT INTO t1 VALUES(1); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_fail_register.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_fail_register.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_fail_register.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_fail_register.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,7 @@ source include/master-slave.inc; connection slave; - +CALL mtr.add_suppression("Slave I/O: Master command COM_REGISTER_SLAVE failed: Debug Induced Error"); set @old_dbug=@@global.debug_dbug; set global debug_dbug='d,fail_com_register_slave'; @@ -11,8 +11,11 @@ reset slave; source include/wait_for_slave_to_stop.inc; start slave; -stop slave; -source include/wait_for_slave_to_stop.inc; +# Debug point will raise IO thread error ER_SLAVE_MASTER_COM_FAILURE +# so we will wait for that and manually stop the SQL thread +--let $slave_io_errno= 1597 +--source include/wait_for_slave_io_error.inc +--source include/stop_slave_sql.inc set global debug_dbug=@old_dbug; connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_get_lock.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_get_lock.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_get_lock.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_get_lock.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,17 @@ source include/master-slave.inc; +--disable_query_log CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); +call mtr.add_suppression("Could not read packet:.* errno: 11 "); +# The following one comes from calling dirty_close on client side +call mtr.add_suppression("Could not read packet:.* errno: 2 "); +call mtr.add_suppression("Could not read packet:.* errno: 35 "); +--enable_query_log + +let $org_log_warnings=`select @@global.log_warnings`; + +# Test extended warnings +SET GLOBAL LOG_WARNINGS=4; create table t1(n int); # Use of get_lock gives a warning for unsafeness if binlog_format=statement @@ -41,6 +52,10 @@ drop table t1; sync_slave_with_master; +connection default; +--disable_query_log +--eval SET GLOBAL LOG_WARNINGS=$org_log_warnings; +--enable_query_log --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gis_user_var.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gis_user_var.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gis_user_var.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gis_user_var.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,18 @@ +--source include/have_geometry.inc +--source include/master-slave.inc + +--echo # +--echo # +--echo # + +connection master; +SET @p=POINT(1,1); +CREATE TABLE t1 AS SELECT @p AS p; +sync_slave_with_master; +SHOW CREATE TABLE t1; +SELECT ST_AsWKT(p) FROM t1; +connection master; +DROP TABLE t1; +sync_slave_with_master; + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_basic.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_basic.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_basic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_basic.test 2024-08-03 07:29:58.000000000 +0000 @@ -162,6 +162,13 @@ eval SELECT BINLOG_GTID_POS('$valid_binlog_name',18446744073709551615); eval SELECT BINLOG_GTID_POS('$valid_binlog_name',18446744073709551616); +# MDEV-33045: Server crashes in Item_func_binlog_gtid_pos::val_str / Binary_string::c_ptr_safe +SET sql_log_bin= 0; +CREATE TABLE t1 AS SELECT MASTER_POS_WAIT(@binlog_file, 4, 0); +SELECT BINLOG_GTID_POS(@binlog_file, 4); +DROP TABLE t1; +SET sql_log_bin= 1; + --echo *** Some tests of @@GLOBAL.gtid_binlog_state *** --connection server_2 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_crash-slave.opt mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash-slave.opt --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_crash-slave.opt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash-slave.opt 2024-08-03 07:29:58.000000000 +0000 @@ -1 +1 @@ ---master-retry-count=100 +--master-retry-count=100 --slave-net-timeout=10 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_crash.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_crash.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash.test 2024-08-03 07:29:58.000000000 +0000 @@ -12,6 +12,7 @@ call mtr.add_suppression("Checking table:"); call mtr.add_suppression("client is using or hasn't closed the table properly"); call mtr.add_suppression("Table .* is marked as crashed and should be repaired"); +call mtr.add_suppression("Could not read packet:.* errno: 11"); flush tables; ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_crash_myisam.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash_myisam.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_crash_myisam.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_crash_myisam.test 2024-08-03 07:29:58.000000000 +0000 @@ -5,6 +5,10 @@ --let $rpl_topology=1->2 --source include/rpl_init.inc +--disable_query_log +call mtr.add_suppression("Could not read packet:.* errno: 11"); +--enable_query_log + --echo *** Test crashing master with InnoDB disabled, the binlog gtid state should still be correctly recovered. *** --connection server_1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_errorhandling.test 2024-08-03 07:29:58.000000000 +0000 @@ -20,7 +20,7 @@ CALL mtr.add_suppression("Slave: Failed to open mysql.gtid_slave_pos"); --let $slave_sql_errno=1944 --source include/wait_for_slave_sql_error.inc - +--let $rpl_only_running_threads= 1 --source include/stop_slave.inc ALTER TABLE mysql.gtid_slave_pos CHANGE seq_no seq_no BIGINT UNSIGNED NOT NULL; ALTER TABLE mysql.gtid_slave_pos DROP PRIMARY KEY; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_errorlog.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_errorlog.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_errorlog.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_errorlog.test 2024-08-03 07:29:58.000000000 +0000 @@ -31,8 +31,8 @@ START SLAVE; --let $slave_sql_errno=1062 --source include/wait_for_slave_sql_error.inc - ---source include/stop_slave.inc +--source include/wait_for_slave_io_to_start.inc +--source include/stop_slave_io.inc # Skip the problem event from the master. SET GLOBAL gtid_slave_pos= "0-1-100"; --source include/start_slave.inc @@ -51,7 +51,7 @@ --connection slave --let $slave_sql_errno=1590 --source include/wait_for_slave_sql_error.inc ---source include/stop_slave.inc +--source include/stop_slave_io.inc SET sql_slave_skip_counter=1; --source include/start_slave.inc --sync_with_master diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_grouping.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_grouping.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_grouping.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_grouping.test 2024-08-03 07:29:58.000000000 +0000 @@ -93,5 +93,4 @@ --connection master DROP TABLE t; -SET GLOBAL LOG_WARNINGS=default; --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_header_valid.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_header_valid.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_header_valid.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_header_valid.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,213 @@ +# +# This test ensures that, when a GTID event is constructed by reading its +# content from a binlog file, the reader (e.g. replica, in this test) cannot +# read beyond the length of the GTID event. That is, we ensure that the +# structure indicated by its flags and extra_flags are consistent with the +# actual content of the event. +# +# To spoof a broken GTID log event, we use the DEBUG_DBUG mechanism to inject +# the master to write invalid GTID events for each flag. The transaction is +# given a commit id to ensure the event is not shorter than GTID_HEADER_LEN, +# which would result in zero padding up to GTID_HEADER_LEN. +# +# +# References: +# MDEV-33672: Gtid_log_event Construction from File Should Ensure Event +# Length When Using Extra Flags +# + +--source include/have_debug.inc + +# GTID event extra_flags are format independent +--source include/have_binlog_format_row.inc +--source include/have_innodb.inc +--source include/master-slave.inc + +--echo # +--echo # Initialize test data +--connection master +create table t1 (a int) engine=innodb; +--source include/save_master_gtid.inc +set @@SESSION.debug_dbug= "+d,binlog_force_commit_id"; + +--connection slave +set SQL_LOG_BIN= 0; +call mtr.add_suppression('Found invalid event in binary log'); +call mtr.add_suppression('Slave SQL.*Relay log read failure: Could not parse relay log event entry.* 1594'); +set SQL_LOG_BIN= 1; +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--source include/start_slave.inc +--let $cid_ctr= 100 + + +--echo # +--echo # Test FL_PREPARED_XA +--connection master +set @@SESSION.debug_dbug= "+d,negate_xid_from_gtid"; +--eval set @commit_id= $cid_ctr + +XA START 'x1'; +insert into t1 values (1); +XA END 'x1'; +XA PREPARE 'x1'; +set @@SESSION.debug_dbug= "-d,negate_xid_from_gtid"; +XA COMMIT 'x1'; +--source include/save_master_gtid.inc + +--echo # Waiting for slave to find invalid event.. +--connection slave +let $slave_sql_errno= 1594; # ER_SLAVE_RELAY_LOG_READ_FAILURE +source include/wait_for_slave_sql_error.inc; +STOP SLAVE IO_THREAD; + +--echo # Reset master binlogs (as there is an invalid event) and slave state +--connection master +RESET MASTER; +--connection slave +RESET MASTER; +RESET SLAVE; +set @@global.gtid_slave_pos=""; +--source include/start_slave.inc + + +--echo # +--echo # Test FL_COMPLETED_XA +--connection master +--inc $cid_ctr +--eval set @commit_id= $cid_ctr +XA START 'x1'; +--let $next_val = `SELECT max(a)+1 FROM t1` +--eval insert into t1 values ($next_val) +XA END 'x1'; +XA PREPARE 'x1'; +set @@SESSION.debug_dbug= "+d,negate_xid_from_gtid"; +XA COMMIT 'x1'; +set @@SESSION.debug_dbug= "-d,negate_xid_from_gtid"; +--source include/save_master_gtid.inc + +--echo # Waiting for slave to find invalid event.. +--connection slave +let $slave_sql_errno= 1594; # ER_SLAVE_RELAY_LOG_READ_FAILURE +source include/wait_for_slave_sql_error.inc; +STOP SLAVE IO_THREAD; + +--echo # Cleanup hanging XA PREPARE on slave +set statement SQL_LOG_BIN=0 for XA COMMIT 'x1'; + +--echo # Reset master binlogs (as there is an invalid event) and slave state +--connection master +RESET MASTER; +--connection slave +RESET MASTER; +RESET SLAVE; +set @@global.gtid_slave_pos=""; +--source include/start_slave.inc + + +--echo # +--echo # Test Missing xid.data (but has format id and length description parts) + +--connection master +--eval set @commit_id= $cid_ctr + +XA START 'x1'; +insert into t1 values (1); +XA END 'x1'; +XA PREPARE 'x1'; +set @@SESSION.debug_dbug= "+d,negate_xid_data_from_gtid"; +XA COMMIT 'x1'; +set @@SESSION.debug_dbug= "-d,negate_xid_data_from_gtid"; +--source include/save_master_gtid.inc + +--echo # Waiting for slave to find invalid event.. +--connection slave +let $slave_sql_errno= 1594; # ER_SLAVE_RELAY_LOG_READ_FAILURE +source include/wait_for_slave_sql_error.inc; +STOP SLAVE IO_THREAD; + +--echo # Cleanup hanging XA PREPARE on slave +set statement SQL_LOG_BIN=0 for XA COMMIT 'x1'; + +--echo # Reset master binlogs (as there is an invalid event) and slave state +--connection master +RESET MASTER; +--connection slave +RESET MASTER; +RESET SLAVE; +set @@global.gtid_slave_pos=""; +--source include/start_slave.inc + + +--echo # +--echo # Test FL_EXTRA_MULTI_ENGINE +--connection master +set @old_dbug= @@SESSION.debug_dbug; +set @@SESSION.debug_dbug= "+d,inject_fl_extra_multi_engine_into_gtid"; +--inc $cid_ctr +--eval set @commit_id= $cid_ctr +--let $next_val = `SELECT max(a)+1 FROM t1` +--eval insert into t1 values ($next_val) +--source include/save_master_gtid.inc +set @@SESSION.debug_dbug=@old_dbug; + +--connection slave +--echo # Waiting for slave to find invalid event.. +let $slave_sql_errno= 1594; # ER_SLAVE_RELAY_LOG_READ_FAILURE +source include/wait_for_slave_sql_error.inc; +STOP SLAVE IO_THREAD; + +--echo # Reset master binlogs (as there is an invalid event) and slave state +--connection master +RESET MASTER; + +--connection slave +RESET SLAVE; +RESET MASTER; +set @@global.gtid_slave_pos=""; +--source include/start_slave.inc + + +--echo # +--echo # Test FL_COMMIT_ALTER +--connection master +set @old_dbug= @@SESSION.debug_dbug; +set @@SESSION.debug_dbug= "+d,negate_alter_fl_from_gtid"; +set @old_alter_tp= @@SESSION.binlog_alter_two_phase; +set @@SESSION.binlog_alter_two_phase= 1; +alter table t1 add column (nc int); +--source include/save_master_gtid.inc +set @@SESSION.debug_dbug=@old_dbug; +set @@SESSION.binlog_alter_two_phase=@old_alter_tp; + +--connection slave +--echo # Waiting for slave to find invalid event.. +let $slave_sql_errno= 1594; # ER_SLAVE_RELAY_LOG_READ_FAILURE +source include/wait_for_slave_sql_error.inc; +STOP SLAVE IO_THREAD; + +--echo # Reset master binlogs (as there is an invalid event) and slave state +--connection master +RESET MASTER; + +--connection slave +# Just to keep tables consistent between master/slave +SET STATEMENT sql_log_bin=0 FOR alter table t1 add column (nc int); +RESET SLAVE; +RESET MASTER; +set @@global.gtid_slave_pos=""; +--source include/start_slave.inc + + +--echo # +--echo # Cleanup + +--connection master +drop table t1; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc + +--source include/rpl_end.inc +--echo # End of rpl_gtid_header_valid.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.cnf mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.cnf --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,28 @@ +!include ../my.cnf + +[mysqld.1] +log-slave-updates +loose-innodb +gtid-domain-id=1 +gtid-strict-mode=0 +gtid-ignore-duplicates=1 + +[mysqld.2] +log-slave-updates +loose-innodb +gtid-domain-id=0 +replicate-ignore-table=test.t3 +gtid-strict-mode=0 +gtid-ignore-duplicates=1 + +[mysqld.3] +log-slave-updates +loose-innodb +gtid-domain-id=0 +replicate-ignore-table=test.t3 +gtid-strict-mode=0 +gtid-ignore-duplicates=1 + +[ENV] +SERVER_MYPORT_3= @mysqld.3.port +SERVER_MYSOCK_3= @mysqld.3.socket diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_slave_filtering.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,109 @@ +--source include/have_innodb.inc +--source include/have_binlog_format_mixed.inc + +--let $rpl_topology=1->2->3 +--source include/rpl_init.inc + +--echo *** Test GTID master switch in a topology with filtered events. +--echo *** With --gtid-ignore-duplicate and --gtid-strict-mode, should allow +--echo *** GTID connect at a GTID position that is filtered on the new master. + +--connection server_1 + +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1,1); +CREATE TABLE t3 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t3 VALUES (1,1); +INSERT INTO t1 VALUES (2,1); +INSERT INTO t3 VALUES (2,1); +--source include/save_master_gtid.inc + +--connection server_2 +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (1,2); + +--let $slave_timeout= 10 +--source include/sync_with_master_gtid.inc +--source include/save_master_gtid.inc + +--connection server_3 +--source include/sync_with_master_gtid.inc + +--echo *** Promote 3 as new master, demote 2 as slave of 3. +--echo *** GTID position of 2 in domain 0 is filtered on 3. + +--connection server_2 +--source include/stop_slave.inc + +--connection server_3 +--source include/stop_slave.inc +--replace_result $SERVER_MYPORT_1 SERVER_MYPORT_1 +eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_1, + MASTER_USE_GTID=SLAVE_POS; + +--connection server_2 +--replace_result $SERVER_MYPORT_3 SERVER_MYPORT_3 +eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_3, + MASTER_USE_GTID=SLAVE_POS; +--source include/start_slave.inc + +--connection server_3 +--source include/start_slave.inc + +--connection server_1 +INSERT INTO t1 VALUES (3,1); +INSERT INTO t3 VALUES (3,1); +--source include/save_master_gtid.inc + +--connection server_3 +INSERT INTO t2 VALUES (2,2); + +--source include/sync_with_master_gtid.inc +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc + +SELECT * FROM t1 ORDER BY a; +# Verify that table t3 is being filtered. +--error 1146 +SELECT * FROM t3 ORDER BY a; +SELECT * FROM t2 ORDER BY a; + + +--echo *** Restore original topology. + +--connection server_3 +--source include/stop_slave.inc + +--connection server_2 +--source include/stop_slave.inc +--replace_result $SERVER_MYPORT_1 SERVER_MYPORT_1 +eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_1, + MASTER_USE_GTID=SLAVE_POS; +--source include/start_slave.inc + +--connection server_3 +--replace_result $SERVER_MYPORT_2 SERVER_MYPORT_2 +eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $SERVER_MYPORT_2, + MASTER_USE_GTID=SLAVE_POS; +--source include/start_slave.inc + + +# Cleanup + +--connection server_1 +DROP TABLE t1; +DROP TABLE t3; +--source include/save_master_gtid.inc + +--connection server_2 +DROP TABLE t2; +--source include/sync_with_master_gtid.inc +--source include/save_master_gtid.inc + +--connection server_3 +--source include/sync_with_master_gtid.inc + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_startpos.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_startpos.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_startpos.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_startpos.test 2024-08-03 07:29:58.000000000 +0000 @@ -50,7 +50,7 @@ START SLAVE; --let $slave_io_errno= 1236 --source include/wait_for_slave_io_error.inc ---source include/stop_slave.inc +--source include/stop_slave_sql.inc --replace_result $MASTER_MYPORT MASTER_PORT eval CHANGE MASTER TO master_host = '127.0.0.1', master_port = $MASTER_MYPORT, diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_gtid_stop_start.test 2024-08-03 07:29:58.000000000 +0000 @@ -173,6 +173,24 @@ --echo *** MDEV-4486: Allow to start old-style replication even if mysql.gtid_slave_pos is unavailable +# In GTID mode, the old-style replication position is also updated. But during +# GTID connect, the old-style position is not known until receiving the fake +# GTID list event, which contains the required position value. If we happened +# to stop the slave above before this fake GTID list event, the test could fail +# with duplicate key errors due to switching to non-GTID mode at a wrong +# position too far back in the binlog. +# +# Work-around this by injecting an extra dummt event and syncing the slave to +# it, ensuring the old-style position will be updated. +# +# This work-around could be removed after MDEV-33996 is fixed. +--connection server_1 +INSERT INTO t1 VALUES (8); +DELETE FROM t1 WHERE a=8; +--save_master_pos +--connection server_2 +--sync_with_master + --connection server_2 --source include/stop_slave.inc CHANGE MASTER TO master_use_gtid= no; @@ -210,7 +228,7 @@ call mtr.add_suppression("Failed to load slave replication state from table"); call mtr.add_suppression("Unable to load replication GTID slave state"); SET sql_log_bin=1; - +--let rpl_allow_error= 1 --source include/start_slave.inc --connection server_1 INSERT INTO t1 VALUES (9); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_heartbeat.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_heartbeat.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,14 +8,13 @@ # - SHOW STATUS like 'Slave_heartbeat_period' report -- source include/have_log_bin.inc - -connect (master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); -connect (slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK); +-- source include/master-slave.inc connection master; reset master; connection slave; +-- source include/stop_slave.inc set @restore_slave_net_timeout= @@global.slave_net_timeout; --disable_warnings set @@global.slave_net_timeout= 10; @@ -170,6 +169,5 @@ --disable_prepare_warnings ---source include/stop_slave.inc - +--source include/rpl_end.inc --echo End of tests diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_heartbeat_basic.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat_basic.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_heartbeat_basic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat_basic.test 2024-08-03 07:29:58.000000000 +0000 @@ -331,7 +331,7 @@ let $rcvd_heartbeats_after= query_get_value(SHOW STATUS LIKE 'slave_received_heartbeats', Value, 1); let $result= query_get_value(SELECT ($rcvd_heartbeats_after - $rcvd_heartbeats_before) > 0 AS Result, Result, 1); --echo Heartbeat events are received while sql thread stopped (1 means 'yes'): $result ---source include/stop_slave.inc +--source include/stop_slave_io.inc set sql_log_bin= 0; DROP TABLE t1; set sql_log_bin= 1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_heartbeat_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,6 +3,12 @@ --source include/have_debug.inc --source include/master-slave.inc +--disable_query_log +CALL mtr.add_suppression('SET @master_heartbeat_period to master failed with error'); +CALL mtr.add_suppression('Master command COM_REGISTER_SLAVE failed: failed registering on master, reconnecting to try again'); +call mtr.add_suppression("Could not read packet:.* errno: 11"); +--enable_query_log + connection slave; --source include/stop_slave.inc set @restore_slave_net_timeout= @@global.slave_net_timeout; @@ -14,14 +20,13 @@ ### Checking the range ### -# + # default period slave_net_timeout/2 # --query_vertical show status like 'Slave_heartbeat_period'; SET @saved_dbug= @@GLOBAL.debug_dbug; SET GLOBAL debug_dbug="+d,simulate_slave_heartbeat_network_error"; -CALL mtr.add_suppression('SET @master_heartbeat_period to master failed with error'); -CALL mtr.add_suppression('Master command COM_REGISTER_SLAVE failed: failed registering on master, reconnecting to try again'); + --source include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_invoked_features.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_invoked_features.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_invoked_features.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_invoked_features.test 2024-08-03 07:29:58.000000000 +0000 @@ -102,14 +102,17 @@ UPDATE t13 SET c = ''; END| -# Create events which will run every 1 sec -CREATE EVENT e1 ON SCHEDULE EVERY 1 SECOND DISABLE DO +# Create events which will run every 10 sec +# It cannot be much shorter as we have to ensure that a new +# event is not scheduled before the DISABLE has been +# executed. +CREATE EVENT e1 ON SCHEDULE EVERY 10 SECOND DISABLE DO BEGIN ALTER EVENT e1 DISABLE; CALL p1(10, ''); END| -CREATE EVENT e11 ON SCHEDULE EVERY 1 SECOND DISABLE DO +CREATE EVENT e11 ON SCHEDULE EVERY 10 SECOND DISABLE DO BEGIN ALTER EVENT e11 DISABLE; CALL p11(10, ''); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mariadb_slave_capability.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,13 +11,25 @@ # empty Gtid_list event # # Test this by binlog rotation before we log any GTIDs. -connection slave; +sync_slave_with_master; # Need to stop/start the master without GTID before setting debug_dbug --source include/stop_slave.inc CHANGE MASTER TO MASTER_USE_GTID=NO; --source include/start_slave.inc +--connection master +--echo # Ensure only the new binlog dump thread is alive (wait for the old one +--echo # to complete its kill) +--let $wait_condition= select count(*)=1 from information_schema.processlist where command='Binlog Dump' +--source include/wait_condition.inc + +--echo # And that it has already sent its fake rotate +--let $wait_condition= select count(*)=1 from information_schema.processlist where state LIKE '%Master has sent all binlog to slave%' and command='Binlog Dump' +--source include/wait_condition.inc + + +--connection slave --source include/stop_slave.inc --echo # Test slave with no capability gets dummy event, which is ignored. set @old_dbug= @@global.debug_dbug; @@ -26,6 +38,7 @@ connection master; FLUSH LOGS; +--source include/wait_for_binlog_checkpoint.inc CREATE TABLE t1 (a INT PRIMARY KEY); INSERT INTO t1 VALUES (0); sync_slave_with_master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev12179.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev12179.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev12179.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev12179.test 2024-08-03 07:29:58.000000000 +0000 @@ -55,9 +55,7 @@ # Restart the slave mysqld server, and verify that the GTID position is # read correctly from the new mysql.gtid_slave_pos_innodb table. ---write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect -wait -EOF +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -94,9 +92,7 @@ RENAME TABLE mysql.gtid_slave_pos_innodb TO mysql.gtid_slave_pos; SET sql_log_bin=1; ---write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect -wait -EOF +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -132,9 +128,7 @@ ALTER TABLE mysql.gtid_slave_pos ENGINE=Aria; SET sql_log_bin=1; ---write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect -wait -EOF +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -176,9 +170,7 @@ DROP TABLE mysql.gtid_slave_pos_InnoDB; SET sql_log_bin=1; ---write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect -wait -EOF +--write_line "wait" $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --shutdown_server --source include/wait_until_disconnected.inc @@ -272,9 +264,7 @@ # MDEV-15373 engine gtid_slave_pos table name disobeys lower-case-table-names # This snippet verifies that engine gtid_slave_pos table is found, # its data are up-to-date. ---write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect -wait -EOF +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --connection server_2 --shutdown_server --source include/wait_until_disconnected.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev33798.cnf mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev33798.cnf --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev33798.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev33798.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,17 @@ +!include suite/rpl/my.cnf + +[mysqld.1] +log-slave-updates +loose-innodb + +[mysqld.2] +log-slave-updates +loose-innodb + +[mysqld.3] +log-slave-updates +loose-innodb + +[ENV] +SERVER_MYPORT_3= @mysqld.3.port +SERVER_MYSOCK_3= @mysqld.3.socket diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev33798.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev33798.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev33798.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev33798.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,182 @@ +--source include/have_innodb.inc +--source include/have_log_bin.inc +--let $rpl_topology=1->2,1->3 +--source include/rpl_init.inc +--connect (server_2b,127.0.0.1,root,,,$SERVER_MYPORT_2) + +--connection server_2 +SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; +SET @old_parallel_mode= @@GLOBAL.slave_parallel_mode; +SET @old_timeout= @@GLOBAL.lock_wait_timeout; +SET @old_innodb_timeout= @@GLOBAL.innodb_lock_wait_timeout; +--source include/stop_slave.inc +SET GLOBAL slave_parallel_threads=5; +set global slave_parallel_mode= aggressive; +# High timeout so we get replication sync error and test failure if the +# conflict handling is insufficient and lock wait timeout occurs. +SET GLOBAL lock_wait_timeout= 86400; +SET GLOBAL innodb_lock_wait_timeout= 86400; +SET STATEMENT sql_log_bin=0 FOR ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +--source include/start_slave.inc + +--connection server_1 +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0), (8, 0); +--save_master_pos + +--connection server_2 +--sync_with_master +--source include/stop_slave.inc + +# Test the following scenario: +# +# Transactions T1, T2 in domain 1, U1, U2 in domain 2. +# Wait cycle T1->U2->U1->T2->T1 as follows: +# T1 row lock wait on U2 +# U2 wait_for_prior_commit on U1 +# U1 row lock wait on T2 +# T2 wait_for_prior_commit on T1 +# +# Test that the wait cycle is broken correctly with deadlock kill. + +--connection server_2b +# Temporarily block T1 and U1. +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; +SELECT * FROM t1 WHERE a=5 FOR UPDATE; + +--connection server_1 + +SET SESSION gtid_domain_id= 1; +# T1 in domain 1 +BEGIN; +UPDATE t1 SET b=1 WHERE a=1; +UPDATE t1 SET b=1 WHERE a=7; +COMMIT; +# T2 in domain 1 +UPDATE t1 SET b=2 WHERE a=3; + +SET SESSION gtid_domain_id=2; +# U1 in domain 2 +BEGIN; +UPDATE t1 SET b=3 WHERE a=5; +UPDATE t1 SET b=3 WHERE a=3; +COMMIT; +# U2 in domain 2 +UPDATE t1 SET b=4 WHERE a=7; +SET SESSION gtid_domain_id= 0; +--source include/save_master_gtid.inc + +--connection server_2 +--source include/start_slave.inc +# Wait until T2, U2 are holding the row locks. +--let $wait_condition= SELECT COUNT(*)=2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE state LIKE '%Waiting for prior transaction to commit%' +--source include/wait_condition.inc + +# Then let T1, U1 continue to conflict on the row locks, and check that +# replication correctly handles the conflict. +--connection server_2b +ROLLBACK; + +--connection server_2 +--source include/sync_with_master_gtid.inc + +# Allow either domain to "win" on the conflicting updates. +SELECT a, ( + (a=1 AND b=1) OR + (a=3 AND (b=2 OR b=3)) OR + (a=5 AND b=3) OR + (a=7 AND (b=1 OR b=4)) OR + ((a MOD 2)=0 AND b=0)) AS `ok` + FROM t1 + ORDER BY a; + +# Now try the same thing with multi-source replication. + +# Make server_3 a second master +--connection server_3 +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc + +--connection server_2 +--source include/stop_slave.inc +--replace_result $SERVER_MYPORT_3 MYPORT_3 +eval CHANGE MASTER 'm2' to master_port=$SERVER_MYPORT_3 , master_host='127.0.0.1', master_user='root', master_use_gtid=slave_pos; + +--connection server_1 + +SET SESSION gtid_domain_id= 1; +# T1 in domain 1 +BEGIN; +UPDATE t1 SET b=11 WHERE a=1; +UPDATE t1 SET b=11 WHERE a=7; +COMMIT; +# T2 in domain 1 +UPDATE t1 SET b=12 WHERE a=3; +SET SESSION gtid_domain_id= 1; + +--connection server_3 +SET SESSION gtid_domain_id=3; +# U1 in domain 3 +BEGIN; +UPDATE t1 SET b=13 WHERE a=5; +UPDATE t1 SET b=13 WHERE a=3; +COMMIT; +# U2 in domain 3 +UPDATE t1 SET b=14 WHERE a=7; +--source include/save_master_gtid.inc + +--connection server_2b +# Temporarily block T1 and U1. +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; +SELECT * FROM t1 WHERE a=5 FOR UPDATE; + +START ALL SLAVES; +# Wait until T2, U2 are holding the row locks. +--let $wait_condition= SELECT COUNT(*)=2 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE state LIKE '%Waiting for prior transaction to commit%' +--source include/wait_condition.inc + +--connection server_2b +ROLLBACK; + +--connection server_1 +--source include/save_master_gtid.inc +--connection server_2 +--source include/sync_with_master_gtid.inc +--connection server_3 +--source include/save_master_gtid.inc +--connection server_2 +--source include/sync_with_master_gtid.inc + +SELECT a, ( + (a=1 AND b=11) OR + (a=3 AND (b=12 OR b=13)) OR + (a=5 AND b=13) OR + (a=7 AND (b=11 OR b=14)) OR + ((a MOD 2)=0 AND b=0)) AS `ok` + FROM t1 + ORDER BY a; + +SET default_master_connection = 'm2'; +--source include/stop_slave.inc +RESET SLAVE 'm2' ALL; +SET default_master_connection = ''; + +--connection server_3 +--source include/start_slave.inc + +# Cleanup + +--disconnect server_2b +--connection server_1 +DROP TABLE t1; +--connection server_2 +--source include/stop_slave.inc +SET GLOBAL slave_parallel_threads=@old_parallel_threads; +set global slave_parallel_mode= @old_parallel_mode; +SET GLOBAL lock_wait_timeout= @old_timeout; +SET GLOBAL innodb_lock_wait_timeout= @old_innodb_timeout; +--source include/start_slave.inc + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev_17614.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev_17614.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mdev_17614.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mdev_17614.test 2024-08-03 07:29:58.000000000 +0000 @@ -40,8 +40,7 @@ SELECT * FROM t1; # restart replication for the next testcase -stop slave; ---source include/wait_for_slave_to_stop.inc +--source include/stop_slave_io.inc --source include/reset_slave.inc connection master; reset master; @@ -159,8 +158,7 @@ SELECT * FROM t1; # restart replication for the next testcase -stop slave; ---source include/wait_for_slave_to_stop.inc +--source include/stop_slave_io.inc --source include/reset_slave.inc connection master; reset master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_memory_engine_truncate_on_restart.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_memory_engine_truncate_on_restart.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_memory_engine_truncate_on_restart.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_memory_engine_truncate_on_restart.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,82 @@ +# +# This test ensures that a table with engine=memory is kept consistent with +# the slave when the master restarts. That is, when the master is restarted, it +# should binlog a new TRUNCATE TABLE command for tables with MEMORY engines, +# such that after the slave executes these events, its MEMORY-engine tables +# should be empty. +# +# References: +# MDEV-25607: Auto-generated DELETE from HEAP table can break replication +# +--source include/master-slave.inc + +--connection master +create table t (val int) engine=MEMORY; + +-- echo # DELETE trigger should never be activated +create trigger tr after delete on t for each row update t2 set val = 1; + +insert into t values (1),(2); +--source include/save_master_gtid.inc +--connection slave +--source include/sync_with_master_gtid.inc + +-- echo # Check pre-restart values +--let $diff_tables= master:test.t,slave:test.t +--source include/diff_tables.inc + +--echo # Restarting master should empty master and slave `t` +--connection master +--let $seq_no_before_restart= `SELECT REGEXP_REPLACE(@@global.gtid_binlog_pos, "0-1-", "")` +--let $rpl_server_number= 1 +--source include/rpl_restart_server.inc + +--connection master +--echo # Validating MEMORY table on master is empty after restart +--let $table_size= `select count(*) from t` +if ($table_size) +{ + --echo # MEMORY table is not empty + --die MEMORY table is not empty +} +--let $seq_no_after_restart= `SELECT REGEXP_REPLACE(@@global.gtid_binlog_pos, "0-1-", "")` +if ($seq_no_before_restart == $seq_no_after_restart) +{ + --echo # Event to empty MEMORY table was not binlogged + --die Event to empty MEMORY table was not binlogged +} + +--let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1) +--let $datadir=`select @@datadir` +--let assert_file= $MYSQLTEST_VARDIR/tmp/binlog_decoded.out +--echo # MYSQL_BINLOG datadir/binlog_file --result-file=assert_file +--exec $MYSQL_BINLOG $datadir/$binlog_file --result-file=$assert_file + +--let assert_text= Query to truncate the MEMORY table should be the contents of the new event +--let assert_count= 1 +--let assert_select= TRUNCATE TABLE +--source include/assert_grep.inc + +--echo # Ensuring slave MEMORY table is empty +--connection master +--source include/save_master_gtid.inc +--connection slave +--source include/sync_with_master_gtid.inc +--source include/diff_tables.inc + +--echo # Ensure new events replicate correctly +--connection master +insert into t values (3),(4); +--source include/save_master_gtid.inc +--connection slave +--source include/sync_with_master_gtid.inc + +--echo # Validate values on slave, after master restart, do not include those inserted previously +--source include/diff_tables.inc + +--echo # +--echo # Cleanup +--connection master +drop table t; +--source include/rpl_end.inc +--echo # End of rpl_memory_engine_truncate_on_restart.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mysql_manager_race_condition.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mysql_manager_race_condition.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mysql_manager_race_condition.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mysql_manager_race_condition.test 2024-08-03 07:29:58.000000000 +0000 @@ -18,8 +18,14 @@ # associated with this test should enforce that the binlog background thread is # not created before the handle manager is initialized. # +# Addendum 1) This test is extended for MDEV-33799, as the original fix +# left out the possibility that the binlog background thread can be +# started during recovery if the binary log is used as the transaction +# coordinator. This resulted in similar segfaults as seen by MDEV-26473. +# # References: # MDEV-26473 mysqld got exception 0xc0000005 (rpl_slave_state/rpl_load_gtid_slave_state) +# MDEV-33799 mysql_manager_submit Segfault at Startup Still Possible During Recovery # --source include/have_debug.inc @@ -54,6 +60,63 @@ --echo # +--echo # MDEV-33799 +--echo # Ensure that when the binary log is used for recovery (as tc log), that +--echo # the recovery process cannot start the binlog background thread before +--echo # the mysql handle manager has started. +--connection slave + +--echo # Add test suppresssions so crash recovery messages don't fail the test +set session sql_log_bin=0; +call mtr.add_suppression("mariadbd: Got error '145.*"); +call mtr.add_suppression("Checking table:.*"); +call mtr.add_suppression("mysql.gtid_slave_pos:.*hasn't closed the table properly"); +call mtr.add_suppression("Can't init tc log"); +call mtr.add_suppression("Aborting"); +set session sql_log_bin=1; + +--echo # Create slave-side only table +create table t2 (a int) engine=innodb; + +--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +wait +EOF + +--echo # Crash mariadbd when binlogging transaction to corrupt database state +--connection slave1 +set @@session.debug_dbug="+d,crash_before_writing_xid"; +--send insert into t2 values (1) + +--connection slave +--source include/wait_until_disconnected.inc + +--connection slave1 +--error 2013,ER_CONNECTION_KILLED +--reap + +--echo # Restart mariadbd in recovery mode. Note --tc-heuristic-recover +--echo # forces mysqld to exit with error, so we run mariadbd via CLI +--echo # MYSQLD_LAST_CMD --debug_dbug="+d,delay_start_handle_manager" --tc-heuristic-recover=COMMIT +--error 1 +--exec $MYSQLD_LAST_CMD --debug_dbug="+d,delay_start_handle_manager" --tc-heuristic-recover=COMMIT + +--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +restart +EOF + +--connection server_2 +--enable_reconnect +--source include/wait_until_connected_again.inc +--connection slave1 +--enable_reconnect +--source include/wait_until_connected_again.inc +--connection slave +--enable_reconnect +--source include/wait_until_connected_again.inc +--source include/start_slave.inc + + +--echo # --echo # Cleanup --echo # @@ -63,5 +126,6 @@ --connection slave --source include/sync_with_master_gtid.inc +drop table t2; --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mysqldump_gtid_slave_pos.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mysqldump_gtid_slave_pos.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_mysqldump_gtid_slave_pos.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_mysqldump_gtid_slave_pos.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,138 @@ +--source include/have_innodb.inc +--source include/master-slave.inc + +--echo # Initialize +--connection slave +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; + +--echo # Setup data +--connection master +CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc + +# The following test proves fixes to +# MDEV-15393 gtid_slave_pos duplicate key errors after mysqldump restore +# +--echo # 1. run some replication load that adds records to gtid_slave_pos table +--echo # 2. stop slave, remove loaded data (it will be replicated), delete from +--echo # gtid_slave_pos as the table is going to be restored +--echo # 3. take dump from slave (master has an empty gtid_slave_pos) +--echo # with --gtid and for the default value of both +--echo # --dump-slave and --master-data +--echo # and in loop for the two options do: +--echo # 4. reset the slave state to install some initial state +--echo # 5. restart slave server, restore the dump +--echo # 6. check the final state which must be equal to the dump's one +--echo # 7. start replication to see no error => Q.E.D. +--echo # unless the test runs on a buggy version in which case set $FIXED to zero. + +# set to ZERO when run with mysqldump of buggy version +--let $FIXED= 1 + +--echo # 1. +--source include/stop_slave.inc +delete from mysql.gtid_slave_pos; + +--connection master +--let $trx_number = 5 +--let $i = $trx_number +while ($i) +{ + eval insert into t1 set a = $i; + --dec $i +} +--source include/save_master_gtid.inc + +--connection slave +# due to MDEV-19801 on 10+.10+ +CHANGE MASTER TO master_use_gtid= no; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc +# Prior tests in a mtr batch could leave the min value of sub_id column with +# arbtirary value. Therefore before dumping let's +# adjust mysql.gtid_slave_pos to have sub_id growing deterministically. +# The value of 2 is choosen. +--disable_query_log + set statement sql_log_bin = 0 for update mysql.gtid_slave_pos set sub_id = sub_id - (select min(sub_id) from mysql.gtid_slave_pos) + 2; +--enable_query_log +select * from mysql.gtid_slave_pos; +select @@global.gtid_slave_pos as "after initial slave got in sync"; + +--echo # 2. +--source include/stop_slave.inc + +--echo # 3. A +# Two dumps prepared to be restored in the following loop +--exec $MYSQL_DUMP_SLAVE --dump-slave --gtid mysql gtid_slave_pos > $MYSQLTEST_VARDIR/tmp/dump_2.sql +--source include/stop_slave.inc + +--exec $MYSQL_DUMP_SLAVE --master-data --gtid mysql gtid_slave_pos > $MYSQLTEST_VARDIR/tmp/dump_1.sql + +--let $i=2 +while ($i) +{ + --disable_warnings + --source include/stop_slave.inc + --enable_warnings + --echo # 4. + set statement sql_log_bin=0 for delete from mysql.gtid_slave_pos; + # setup a new gtid/sub_id state as complication for future backup restore. + # After the restore the new state must be a union of the backup state + # and this one. + --eval insert into mysql.gtid_slave_pos values (99 + $i, 1, 1, 1) + + --echo # 5. + --let $rpl_server_number= 2 + --source include/rpl_restart_server.inc + select * from mysql.gtid_slave_pos; + select @@global.gtid_slave_pos as "before dump restore"; + --let $dump=dump_$i.sql + --exec $MYSQL_SLAVE mysql -e "source $MYSQLTEST_VARDIR/tmp/$dump" + + --echo # 6. + select * from mysql.gtid_slave_pos; + select @@global.gtid_slave_pos as "after dump restore"; + + --echo # 7. + reset slave; + select @@global.gtid_slave_pos; + change master to master_use_gtid=no; + + --connection master + eval insert into t1 select 1+max(a),$i from t1; + --source include/save_master_gtid.inc + + --connection slave + if ($FIXED) + { + --source include/start_slave.inc + --source include/sync_with_master_gtid.inc + } + if (!$FIXED) + { + start slave; + --let $slave_sql_errno= 1942 + --source include/wait_for_slave_sql_error.inc + + --die + } + select * from mysql.gtid_slave_pos; + select @@global.gtid_slave_pos as "after slave got in sync"; + + --dec $i +} +--echo # +--echo # Cleanup +--echo # +--connection master +DROP TABLE t1; +--source include/save_master_gtid.inc + +--connection slave +--remove_files_wildcard $MYSQLTEST_VARDIR/tmp dump_*.sql +--source include/sync_with_master_gtid.inc + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_packet.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_packet.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_packet.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_packet.test 2024-08-03 07:29:58.000000000 +0000 @@ -20,6 +20,9 @@ call mtr.add_suppression("Slave I/O: Got a packet bigger than 'slave_max_allowed_packet' bytes, .*error.* 1153"); call mtr.add_suppression("Log entry on master is longer than slave_max_allowed_packet"); +call mtr.add_suppression("Could not write packet:"); +call mtr.add_suppression("Got a packet bigger than 'max_allowed_packet' bytes"); + let $db= DB_NAME_OF_MAX_LENGTH_AKA_NAME_LEN_64_BYTES_____________________; disable_warnings; eval drop database if exists $db; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_gco_wait_kill.test 2024-08-03 07:29:58.000000000 +0000 @@ -300,7 +300,7 @@ # Find the thread id of the driver SQL thread that we want to kill. --let $wait_condition= SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Slave has read all relay log%' --source include/wait_condition.inc ---let $thd_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%Slave has read all relay log%'` +--let $thd_id= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE '%relay log%'` SET @old_max_queued= @@GLOBAL.slave_parallel_max_queued; SET GLOBAL slave_parallel_max_queued=9000; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_ignored_errors.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_ignored_errors.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_ignored_errors.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_ignored_errors.test 2024-08-03 07:29:58.000000000 +0000 @@ -96,7 +96,9 @@ # Clean up. --connection server_2 ---source include/stop_slave.inc +--let $slave_sql_errno= 1062 +--source include/wait_for_slave_sql_error.inc +--source include/stop_slave_io.inc --let $assert_cond= COUNT(*) = 0 FROM t1 WHERE a>32 --let $assert_text= table t1 should have zero rows where a>32 --source include/assert.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_missed_error_handling.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_missed_error_handling.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_missed_error_handling.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_missed_error_handling.test 2024-08-03 07:29:58.000000000 +0000 @@ -60,7 +60,6 @@ --connection server_2 --let $slave_sql_errno= 1062 --source include/wait_for_slave_sql_error.inc ---source include/wait_for_slave_sql_to_stop.inc # We should not see the row (112,3) here, it should be rolled back due to # error signal from the prior transaction. SELECT * FROM t3 WHERE a >= 110 ORDER BY a; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_multi_domain_xa.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_multi_domain_xa.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_multi_domain_xa.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_multi_domain_xa.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,181 @@ +# Similar to rpl_parallel_optimistic_xa to verify XA +# parallel execution with multiple gtid domain. +# References: +# MDEV-33668 Adapt parallel slave's round-robin scheduling to XA events + +--source include/have_innodb.inc +--source include/have_perfschema.inc +--source include/master-slave.inc + +# Tests' global declarations +--let $trx = _trx_ +--let $slave_timeout= -1 + +call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction"); +call mtr.add_suppression("WSREP: handlerton rollback failed"); + +--connection master +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +--save_master_pos + +# Prepare to restart slave into optimistic parallel mode +--connection slave +--sync_with_master +--source include/stop_slave.inc +# This test runs huge number of transactions independently in parallel that +# all conflict on a single row. This requires a large number of retries, as a +# transaction can repeatedly conflict/deadlock with a large number of other +# transactions (in a different domain) one by one. +SET @old_transaction_retries = @@GLOBAL.slave_transaction_retries; +SET @@global.slave_transaction_retries = 1000; +SET @old_parallel_threads = @@GLOBAL.slave_parallel_threads; +SET @old_slave_domain_parallel_threads = @@GLOBAL.slave_domain_parallel_threads; +SET @@global.slave_parallel_threads = 5; +SET @@global.slave_domain_parallel_threads = 3; +SET @old_parallel_mode = @@GLOBAL.slave_parallel_mode; + +CHANGE MASTER TO master_use_gtid=slave_pos; + +--connection master +CREATE TABLE t1 (a int PRIMARY KEY, b INT) ENGINE=InnoDB; +INSERT INTO t1 VALUES (1, 0); +--source include/save_master_gtid.inc + +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc + +--let $mode = 2 +# mode = 2 is optimistic +SET @@global.slave_parallel_mode ='optimistic'; +while ($mode) +{ + --connection master + # + # create XA events alternating gtid domains to run them in parallel on slave. + # + --let $domain_num = 3 + --let $trx_num = 777 + --let $i = $trx_num + --let $conn = master + --disable_query_log + while($i > 0) + { + --let $domain_id = `SELECT $i % $domain_num` + --eval set @@gtid_domain_id = $domain_id + # 'decision' to commit 0, or rollback 1 + --let $decision = `SELECT $i % 2` + --eval XA START '$conn$trx$i' + --eval UPDATE t1 SET b = 1 - 2 * $decision WHERE a = 1 + --eval XA END '$conn$trx$i' + --eval XA PREPARE '$conn$trx$i' + --let $term = COMMIT + if ($decision) + { + --let $term = ROLLBACK + } + --eval XA $term '$conn$trx$i' + + --dec $i + } + --enable_query_log + --source include/save_master_gtid.inc + + --connection slave + if (`select $mode = 1`) + { + SET @@global.slave_parallel_mode ='conservative'; + } + --source include/start_slave.inc + --source include/sync_with_master_gtid.inc + --source include/stop_slave.inc + + --dec $mode +} + + +# Generations test. +# Create few ranges of XAP groups length of greater than +# 3 * slave_parallel_threads + 1 +# terminated upon each range. +--let $iter = 3 +--let $generation_len = @@global.slave_parallel_threads +--let $domain_num = 3 +--disable_query_log +--connection master +while ($iter) +{ + --let $k = `select 3 * 3 * $generation_len` + --let $_k = $k + while ($k) + { + --source include/count_sessions.inc + --connect(con$k,localhost,root,,) + # + # create XA events alternating gtid domains to run them in parallel on slave. + # + --let $domain_id = `SELECT $k % $domain_num` + --eval set @@gtid_domain_id = $domain_id + --eval XA START '$trx$k' + --eval INSERT INTO t1 VALUES ($k + 1, $iter) + --eval XA END '$trx$k' + --eval XA PREPARE '$trx$k' + + --disconnect con$k + --connection master + --source include/wait_until_count_sessions.inc + + --dec $k + } + + --connection master + --let $k = $_k + while ($k) + { + --let $term = COMMIT + --let $decision = `SELECT $k % 2` + if ($decision) + { + --let $term = ROLLBACK + } + --eval XA $term '$trx$k' + } + --dec $iter +} +--enable_query_log +--source include/save_master_gtid.inc + +--connection slave +SET @@global.slave_parallel_mode = 'optimistic'; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + + +# +# Overall consistency check +# +--let $diff_tables= master:t1, slave:t1 +--source include/diff_tables.inc + + +# +# Clean up. +# +--connection slave +--source include/stop_slave.inc +SET @@global.slave_parallel_mode = @old_parallel_mode; +SET @@global.slave_parallel_threads = @old_parallel_threads; +SET @@global.slave_domain_parallel_threads = @old_slave_domain_parallel_threads; +SET @@global.slave_transaction_retries = @old_transaction_retries; +--source include/start_slave.inc + +--connection master +DROP TABLE t1; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc + +--connection master +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_optimistic.test 2024-08-03 07:29:58.000000000 +0000 @@ -508,6 +508,7 @@ # The 1st of the following two trx:s a blocker on slave --connection server_2 +SET @org_log_warnings=@@GLOBAL.LOG_WARNINGS; set global log_warnings=2; BEGIN; INSERT INTO t1 SET a=1; @@ -555,7 +556,7 @@ # --connection server_2 --source include/stop_slave.inc -set global log_warnings=default; +set global log_warnings=@org_log_warnings; SET GLOBAL slave_parallel_mode=@old_parallel_mode; SET GLOBAL slave_parallel_threads=@old_parallel_threads; --source include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_optimistic_xa.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_optimistic_xa.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_optimistic_xa.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_optimistic_xa.test 2024-08-03 07:29:58.000000000 +0000 @@ -206,7 +206,6 @@ # --connection slave --source include/stop_slave.inc -set global log_warnings=default; SET GLOBAL slave_parallel_mode=@old_parallel_mode; SET GLOBAL slave_parallel_threads=@old_parallel_threads; --source include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_retry.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_retry.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_retry.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_retry.test 2024-08-03 07:29:58.000000000 +0000 @@ -411,6 +411,44 @@ --sync_slave_with_master server_2 # +# MDEV-33303: slave_parallel_mode=optimistic should not report the mode's +# specific temporary errors. +# + +--connection server_2 +--source include/stop_slave.inc +SET @old_parallel_threads=@@GLOBAL.slave_parallel_threads; +SET GLOBAL slave_parallel_threads=4; + +--connection server_1 +# The problem occurred in the code path for row-based updates in tables +# with no primary/unique key, where a scan is needed. +CREATE TABLE t1 (a INT, b VARCHAR(123)) ENGINE=InnoDB; +INSERT INTO t1 VALUES(1, 'asdf'); +UPDATE t1 SET b='zxf1' WHERE a=1; +UPDATE t1 SET b='\n' WHERE a=1; + +--connection server_2 +# Inject a small sleep in the code that makes the race easier to hit. +SET @old_dbug=@@GLOBAL.debug_dbug; +SET GLOBAL debug_dbug="+d,write_row_inject_sleep_before_ha_write_row"; +--source include/start_slave.inc + +--connection server_1 +# Here, we would get errors in the slave's error log: +# [ERROR] mariadbd: Can't find record in 't1' +--sync_slave_with_master server_2 + +--connection server_1 +DROP TABLE t1; +--sync_slave_with_master server_2 +--source include/stop_slave.inc +SET GLOBAL debug_dbug=@old_dbug; +SET GLOBAL slave_parallel_threads=@old_parallel_threads; +--source include/start_slave.inc + + +# # MDEV-12746 rpl.rpl_parallel_optimistic_nobinlog fails committing out of order at retry # @@ -497,6 +535,7 @@ # Clean up # --connection server_2 +--let $rpl_only_running_threads= 1 --source include/stop_slave.inc SET @@GLOBAL.slave_parallel_threads=@old_parallel_threads; SET @@GLOBAL.slave_parallel_mode=@old_parallel_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_sbm.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_sbm.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_sbm.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_sbm.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,9 +1,9 @@ # # Ensure that Seconds_Behind_Master works correctly on the parallel replica. # ---source include/master-slave.inc --source include/have_log_bin.inc --source include/have_debug.inc +--source include/master-slave.inc --echo # --echo # MDEV-29639: Seconds_Behind_Master is incorrect for Delayed, Parallel Replicas @@ -67,11 +67,18 @@ --echo # if the event is still to be delayed, SBM should resume accordingly --source include/stop_slave.inc + +--echo # Lock t1 on slave to ensure the event can't finish (and thereby update +--echo # Seconds_Behind_Master) so slow running servers don't accidentally +--echo # catch up to the master before checking SBM. +--connection server_2 +LOCK TABLES t1 WRITE; + --source include/start_slave.inc --connection slave ---echo # Waiting for replica to resume the delay for the transaction ---let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting until MASTER_DELAY seconds after master executed event'; +--echo # Waiting for replica to get blocked by the table lock +--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock'; --source include/wait_condition.inc --echo # Sleeping 1s to increment SBM @@ -86,6 +93,9 @@ } --echo # ..done +--connection server_2 +UNLOCK TABLES; + --source include/sync_with_master_gtid.inc --echo # diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_seq.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_seq.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_seq.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_seq.test 2024-08-03 07:29:58.000000000 +0000 @@ -195,4 +195,22 @@ --sync_slave_with_master +# MDEV-31779 server crash in Rows_log_event::update_sequence at replaying binlog +--connection master +--let $binlog_file = query_get_value(SHOW MASTER STATUS, File, 1) +--let $binlog_start = query_get_value(SHOW MASTER STATUS, Position, 1) +CREATE SEQUENCE s; +--disable_ps2_protocol +SELECT NEXTVAL(s); +--enable_ps2_protocol +flush binary logs; +DROP SEQUENCE s; +--exec $MYSQL_BINLOG $datadir/$binlog_file | $MYSQL test +DROP SEQUENCE s; + +--sync_slave_with_master + +--connection master + + --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_slave_bgc_kill.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_slave_bgc_kill.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_slave_bgc_kill.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_slave_bgc_kill.test 2024-08-03 07:29:58.000000000 +0000 @@ -295,13 +295,14 @@ || --delimiter ; SET sql_log_bin=1; - +--source include/stop_slave_io.inc --connection server_1 INSERT INTO t3 VALUES (49,0); --save_master_pos --connection server_2 -START SLAVE SQL_THREAD; +CHANGE MASTER TO master_use_gtid=no; +--source include/start_slave.inc --sync_with_master SELECT * FROM t3 WHERE a >= 40 ORDER BY a; # Restore the foo() function. @@ -334,11 +335,6 @@ --echo *** 3. Same as (2), but not using gtid mode *** ---connection server_2 ---source include/stop_slave.inc -CHANGE MASTER TO master_use_gtid=no; ---source include/start_slave.inc - --connection server_1 # Set up three transactions on the master that will be group-committed # together so they can be replicated in parallel on the slave. diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_stop_slave.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_stop_slave.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_stop_slave.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_stop_slave.test 2024-08-03 07:29:58.000000000 +0000 @@ -57,6 +57,7 @@ INSERT INTO t3 VALUES(21, 21); INSERT INTO t3 VALUES(22, 22); --save_master_pos +--let $master_pos= query_get_value(SHOW MASTER STATUS, Position, 1) # Start a connection that will block the replicated transaction halfway. --connection con_temp1 @@ -64,7 +65,27 @@ INSERT INTO t2 VALUES (21); --connection server_2 -START SLAVE; + +# +# Parallel replication will complete any in-progress event group at STOP SLAVE, +# but only if the event group is already queued up for the worker thread. If +# the SQL driver thread is delayed in queueing up events, the parallel worker +# thread can abort the event group, leaving the non-transactional update to the +# MyISAM table that cannot be rolled back (MDEV-7432). If this happens the test +# would fail with duplicate key error after slave restart. +# +# To avoid this, we here wait for the IO thread to read all master events, and +# for the SQL driver thread to queue all the events for workers. This wait +# should be removed if/when MDEV-7432 is fixed. +# +START SLAVE IO_THREAD; +--let $slave_param= Read_Master_Log_Pos +--let $slave_param_value= $master_pos +--source include/wait_for_slave_param.inc +START SLAVE SQL_THREAD; +--let $wait_condition= SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE State LIKE '%Slave has read all relay log; waiting for more updates%' +--source include/wait_condition.inc + # Wait for the MyISAM change to be visible, after which replication will wait # for con_temp1 to roll back. --let $wait_condition= SELECT COUNT(*) = 1 FROM t1 WHERE a=20 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_temptable.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_temptable.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_parallel_temptable.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_parallel_temptable.test 2024-08-03 07:29:58.000000000 +0000 @@ -264,6 +264,30 @@ --source include/start_slave.inc +--echo *** MDEV33426: Memory allocation accounting incorrect for replicated temptable +--connection server_1 +CREATE TEMPORARY TABLE t5 (a int) ENGINE=Aria; +CREATE TEMPORARY TABLE t6 (a int) ENGINE=Heap; +INSERT INTO t5 VALUES (1); +INSERT INTO t6 VALUES (2); +--save_master_pos + +--connection server_2 +--sync_with_master +--source include/stop_slave.inc + +--connection server_1 +INSERT INTO t1 SELECT a+40, 5 FROM t5; +INSERT INTO t1 SELECT a+40, 6 FROM t6; +DROP TABLE t5, t6; + +--save_master_pos + +--connection server_2 +--source include/start_slave.inc +--sync_with_master +SELECT * FROM t1 WHERE a>=40 ORDER BY a; + # Clean up. --connection server_2 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_coordinator.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_coordinator.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_coordinator.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_coordinator.test 2024-08-03 07:29:58.000000000 +0000 @@ -209,6 +209,7 @@ reset master; --connection slave +--let $rpl_only_running_threads= 1 --source include/stop_slave.inc reset slave; reset master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_worker.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_worker.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_worker.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_perfschema_applier_status_by_worker.test 2024-08-03 07:29:58.000000000 +0000 @@ -227,6 +227,7 @@ #let $assert_cond= "$sss_value" = "$ps_value_in_sss_format"; #source include/assert.inc; +--let $rpl_only_running_threads= 1 --source include/stop_slave.inc RESET SLAVE; --connection master diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_relay_max_extension.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_relay_max_extension.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_relay_max_extension.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_relay_max_extension.test 2024-08-03 07:29:58.000000000 +0000 @@ -47,7 +47,7 @@ --echo # --let $datadir = `select @@datadir` ---exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--write_line wait $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --shutdown_server 10 --source include/wait_until_disconnected.inc @@ -64,7 +64,7 @@ --echo # Restart slave server --echo # ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --enable_reconnect --source include/wait_until_connected_again.inc SET @save_slave_parallel_threads= @@GLOBAL.slave_parallel_threads; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_rewrite_db_sys_vars.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_rewrite_db_sys_vars.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_rewrite_db_sys_vars.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_rewrite_db_sys_vars.test 2024-08-03 07:29:58.000000000 +0000 @@ -19,15 +19,8 @@ create database y; # This DB will be rewrited from test case create database test_replica; -SELECT @@GLOBAL.replicate_rewrite_db; let $rewrite_db_sss= query_get_value(SHOW SLAVE STATUS, Replicate_Rewrite_DB, 1); ---echo # Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB... -if (`SELECT strcmp(@@global.replicate_rewrite_db, "$rewrite_db_sss") != 0`) -{ - die SHOW SLAVE STATUS Replicate_Rewrite_DB value $rewrite_db_sss does not match variable @@GLOBAL.replicate_rewrite_db; -} ---echo # ...success - +eval SELECT @@GLOBAL.replicate_rewrite_db, '$rewrite_db_sss' as 'Replicate_Rewrite_DB from SHOW SLAVE STATUS'; --echo # Create DBs and tables on primary connection master; @@ -63,16 +56,10 @@ SET @save_replicate_rewrite_db = @@GLOBAL.replicate_rewrite_db; SELECT @@GLOBAL.replicate_rewrite_db; SET @@GLOBAL.replicate_rewrite_db="test_master->test_replica"; -SELECT @@GLOBAL.replicate_rewrite_db; SHOW DATABASES like 'test_replica'; source include/start_slave.inc; let $rewrite_db_sss= query_get_value(SHOW SLAVE STATUS, Replicate_Rewrite_DB, 1); ---echo # Ensuring SHOW SLAVE STATUS produces correct value for Replicate_Rewrite_DB... -if (`SELECT strcmp(@@global.replicate_rewrite_db, "$rewrite_db_sss") != 0`) -{ - die SHOW SLAVE STATUS Replicate_Rewrite_DB value $rewrite_db_sss does not match variable @@GLOBAL.replicate_rewrite_db; -} ---echo # ...success +eval SELECT @@GLOBAL.replicate_rewrite_db, '$rewrite_db_sss' as 'Replicate_Rewrite_DB from SHOW SLAVE STATUS'; --echo # Create DB and tables on primary connection master; @@ -101,6 +88,9 @@ --source include/diff_tables.inc --echo # Update of values on primary for DB not set in replication_rewrite_db +--source include/stop_slave.inc +--source include/reset_slave.inc + connection master; use x; insert into my_table values (314); @@ -108,8 +98,6 @@ --source include/save_master_gtid.inc connection slave; ---source include/stop_slave.inc ---source include/reset_slave.inc --source include/start_slave.inc SELECT @@GLOBAL.replicate_rewrite_db; --source include/sync_with_master_gtid.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_corruption.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_corruption.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_corruption.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_corruption.test 2024-08-03 07:29:58.000000000 +0000 @@ -39,7 +39,7 @@ # wait for error 1593 (ER_SLAVE_FATAL_ERROR) --let $slave_sql_errno=1593 --source include/wait_for_slave_sql_error.inc ---source include/stop_slave.inc +--source include/stop_slave_io.inc # clean up SET @@global.debug_dbug=@saved_debug; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_find_row_debug.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_find_row_debug.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_find_row_debug.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_find_row_debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -51,7 +51,9 @@ # cleanup --source include/stop_slave.inc SET @@GLOBAL.debug_dbug = @saved_dbug; +--disable_query_log --eval SET GLOBAL log_warnings = $log_warnings_save +--enable_query_log --source include/start_slave.inc --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_idempotency.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_idempotency.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_idempotency.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_idempotency.test 2024-08-03 07:29:58.000000000 +0000 @@ -139,7 +139,9 @@ --echo *** slave must stop (Trying to delete a referenced foreing key) connection slave; -source include/wait_for_slave_sql_to_stop.inc; +# ER_ROW_IS_REFERENCED_2 # Cannot add or update a child row: a foreign key constraint fails +--let slave_sql_errno= 1451 +source include/wait_for_slave_sql_error.inc; let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); disable_query_log; @@ -173,7 +175,9 @@ --echo *** slave must stop (Trying to insert an invalid foreign key) connection slave; -source include/wait_for_slave_sql_to_stop.inc; +# ER_NO_REFERENCED_ROW_2 # Cannot add or update a parent row: a foreign key constraint fails +--let slave_sql_errno= 1452 +source include/wait_for_slave_sql_error.inc; let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); disable_query_log; @@ -210,9 +214,11 @@ connection master; insert into ti1 set b=1 /* offending write event */; ---echo *** slave must stop (Trying to insert a dupliacte key) +--echo *** slave must stop (Trying to insert a duplicate key) connection slave; -source include/wait_for_slave_sql_to_stop.inc; +# ER_DUP_ENTRY # Duplicate entry for key +--let slave_sql_errno= 1062 +source include/wait_for_slave_sql_error.inc; let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); disable_query_log; @@ -247,7 +253,10 @@ --echo *** slave must stop (Key was not found) connection slave; -source include/wait_for_slave_sql_to_stop.inc; +# ER_KEY_NOT_FOUND # Can't find record +--let slave_sql_errno= 1032 +source include/wait_for_slave_sql_error.inc; + let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); disable_query_log; @@ -265,7 +274,9 @@ DELETE FROM t2 WHERE a = -2; --echo *** slave must stop (Key was not found) connection slave; -source include/wait_for_slave_sql_to_stop.inc; +# ER_KEY_NOT_FOUND # Can't find record +--let slave_sql_errno= 1032 +source include/wait_for_slave_sql_error.inc; let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); disable_query_log; @@ -287,7 +298,9 @@ --echo *** slave must stop (Key was not found) connection slave; -source include/wait_for_slave_sql_to_stop.inc; +# ER_KEY_NOT_FOUND # Can't find record +--let slave_sql_errno= 1032 +source include/wait_for_slave_sql_error.inc; let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); disable_query_log; @@ -307,7 +320,9 @@ --echo *** slave must stop (Key was not found) connection slave; -source include/wait_for_slave_sql_to_stop.inc; +# ER_KEY_NOT_FOUND # Can't find record +--let slave_sql_errno= 1032 +source include/wait_for_slave_sql_error.inc; let $last_error = query_get_value("SHOW SLAVE STATUS", Last_SQL_Errno, 1); disable_query_log; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_until.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_until.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_row_until.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_row_until.test 2024-08-03 07:29:58.000000000 +0000 @@ -101,7 +101,12 @@ --replace_result 740 MASTER_LOG_POS START SLAVE UNTIL MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=740; ---source include/stop_slave.inc +# Explicit wait for slave thread start and then stop. Otherwise the STOP SLAVE +# command can abort the slave connecting to the master, and an error state +# left which makes stop_slave.inc throw an error. +--source include/wait_for_slave_io_to_start.inc +--source include/wait_for_slave_sql_to_stop.inc +--source include/stop_slave_io.inc --source include/reset_slave.inc --source include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test 2024-08-03 07:29:58.000000000 +0000 @@ -33,7 +33,8 @@ --source include/stop_slave.inc SET @save_dbug= @@GLOBAL.debug_dbug; -SET @@global.debug_dbug="+d,pause_sql_thread_on_fde,negate_clock_diff_with_master"; +SET @@global.debug_dbug="+d,pause_sql_thread_on_relay_fde_after_trans"; +SET @@global.debug_dbug="+d,negate_clock_diff_with_master"; --source include/start_slave.inc --let $sleep_time=2 @@ -52,12 +53,6 @@ flush logs; --connection slave ---echo # Ignore FDEs that happen before the CREATE/INSERT commands -SET DEBUG_SYNC='now WAIT_FOR paused_on_fde'; -SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; -SET DEBUG_SYNC='now WAIT_FOR paused_on_fde'; -SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; - --echo # On the next FDE, the slave should have the master CREATE/INSERT events SET DEBUG_SYNC='now WAIT_FOR paused_on_fde'; select count(*)=1 from t1; @@ -138,6 +133,7 @@ } sleep 0.1; } +set debug_sync="RESET"; --enable_query_log --connection master diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync.test 2024-08-03 07:29:58.000000000 +0000 @@ -23,7 +23,6 @@ # inconsistent GTID values because the seq_nos are non-deterministic with # the masters events coming in concurrently set sql_log_bin=0; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); set sql_log_bin=1; @@ -58,7 +57,7 @@ connection master; -set global rpl_semi_sync_master_timeout= 60000; # 60s +set global rpl_semi_sync_master_timeout= 2000; # 2s echo [ default state of semi-sync on master should be OFF ]; show variables like 'rpl_semi_sync_master_enabled'; @@ -202,12 +201,16 @@ --echo # Test semi-sync master will switch OFF after one transaction --echo # timeout waiting for slave reply. --echo # + +connection master; +show status like "Rpl_semi_sync_master_status"; + connection slave; source include/stop_slave.inc; connection master; --source include/kill_binlog_dump_threads.inc -set global rpl_semi_sync_master_timeout= 5000; +set global rpl_semi_sync_master_timeout= 2000; # The first semi-sync check should be on because after slave stop, # there are no transactions on the master. @@ -239,8 +242,8 @@ show status like 'Rpl_semi_sync_master_no_tx'; show status like 'Rpl_semi_sync_master_yes_tx'; -# Semi-sync status on master is now OFF, so all these transactions -# will be replicated asynchronously. +# Semi-sync status on master is now ON, but there are no slaves attached, +# so all these transactions will be replicated asynchronously. delete from t1 where a=10; delete from t1 where a=9; delete from t1 where a=8; @@ -374,6 +377,9 @@ let $status_var_value= 1; source include/wait_for_status_var.inc; +sync_slave_with_master; +connection master; + replace_result $engine_type ENGINE_TYPE; eval create table t1 (a int) engine = $engine_type; insert into t1 values (1); @@ -420,6 +426,10 @@ let $status_var= Rpl_semi_sync_master_clients; let $status_var_value= 1; source include/wait_for_status_var.inc; + +sync_slave_with_master; +connection master; + echo [ master semi-sync should be ON ]; show status like 'Rpl_semi_sync_master_clients'; show status like 'Rpl_semi_sync_master_status'; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.cnf mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.cnf --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,10 @@ +!include ../my.cnf + +[mysqld.1] +log-warnings=9 +rpl_semi_sync_master_enabled=1 +rpl_semi_sync_master_wait_point=AFTER_COMMIT + +[mysqld.2] +log-warnings=9 +rpl_semi_sync_slave_enabled=1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_cond_var_per_thd.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,80 @@ +# +# This test ensures that, when using semi-sync with the wait_point +# AFTER_COMMIT, each thread awaiting an ACK is only woken up when its ACK (or +# an ACK for a later commit in binlog) has been received from the slave. +# +# Prior to MDEV-33551, all threads would be woken up for each ACK received, +# leading to large slowdowns, as each thread would check if the ACK was for it +# in mutual exclusion from the others. +# +# To ensure this, a debug-build-only log warning is added into +# Repl_semi_sync_master::commit_trx() at wakeup time, which will complain if +# the awoken thread's binlog wait coordinates are after the coordinate of the +# last ACK coordinates. Then, we use binlog group commit to commit a series of +# transactions, such that each will await an ACK concurrently. After all +# transactions have been finished (i.e. ACKed and committed), we check the log +# for the expected absence of the added debug warning message. +# +# +# References: +# MDEV-33551: Semi-sync Wait Point AFTER_COMMIT Slow on Workloads with Heavy +# Concurrency +# +--source include/have_binlog_format_row.inc +--source include/have_debug.inc +--source include/master-slave.inc + +--connection master +call mtr.add_suppression("Got an error reading communication packets"); +call mtr.add_suppression("Got an error writing communication packets"); +call mtr.add_suppression("Could not read packet"); +call mtr.add_suppression("Could not write packet"); +set @save_bgc_count= @@global.binlog_commit_wait_count; +set @save_bgc_usec= @@global.binlog_commit_wait_usec; +set @save_debug_dbug= @@global.debug_dbug; +set @@global.binlog_commit_wait_count=3; +set @@global.binlog_commit_wait_usec=10000000; +set @@global.debug_dbug="+d,testing_cond_var_per_thd"; + +--echo # Ensure semi-sync is on +--connection slave +let $status_var= rpl_semi_sync_slave_status; +let $status_var_value= ON; +source include/wait_for_status_var.inc; + +--connection master +let $status_var= rpl_semi_sync_master_status; +let $status_var_value= ON; +source include/wait_for_status_var.inc; + +--echo # Create three transactions to binlog group commit together +--connection master +--send create table t1 (a int) +--connection server_1 +--send create table t2 (a int) +--connection default +--send create table t3 (a int) + +--connection master +--reap +--connection server_1 +--reap +--connection default +--reap + +--let $assert_text= Check that there is no 'Thread awaiting semi-sync ACK was awoken before its ACK' warning in error log. +--let $assert_select=Thread awaiting semi-sync ACK was awoken before its ACK +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_count= 0 +--let $assert_only_after=CURRENT_TEST +--source include/assert_grep.inc + +--echo # +--echo # Cleanup +--connection master +set @@global.binlog_commit_wait_count=@save_bgc_count; +set @@global.binlog_commit_wait_usec=@save_bgc_usec; +set @@global.debug_dbug=@save_debug_dbug; +drop table t1, t2, t3; + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_crash.inc mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_crash.inc --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_crash.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_crash.inc 2024-08-03 07:29:58.000000000 +0000 @@ -34,14 +34,16 @@ if ($case == 2) { SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL con1_ready WAIT_FOR con1_go"; + SET DEBUG_SYNC= "commit_after_release_LOCK_after_binlog_sync WAIT_FOR con1_go1"; --send_eval $query_to_crash --connect (conn_client_2,127.0.0.1,root,,test,$SERVER_MYPORT_2,) # use the same signal with $query_to_crash SET DEBUG_SYNC= "now WAIT_FOR con1_ready"; - SET GLOBAL debug_dbug="d,Notify_binlog_EOF"; + SET DEBUG_SYNC= "commit_before_get_LOCK_after_binlog_sync SIGNAL con1_go"; + SET DEBUG_SYNC= "commit_before_get_LOCK_commit_ordered SIGNAL con2_ready"; --send_eval $query2_to_crash --connection server_$server_to_crash - SET DEBUG_SYNC= "now WAIT_FOR eof_reached"; + SET DEBUG_SYNC= "now WAIT_FOR con2_ready"; --source include/kill_mysqld.inc } @@ -68,22 +70,32 @@ --error 2003 --source include/stop_slave.inc ---let $assert_cond= COUNT(*) = $expected_rows_on_slave FROM t1 ---let $assert_text= Table t1 should have $expected_rows_on_slave rows. ---source include/assert.inc +--eval select count(*) 'on slave must be $expected_rows_on_slave' from t1 SELECT @@GLOBAL.gtid_current_pos; ---let $restart_parameters=--skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 +--let $restart_parameters=--skip-slave-start=1 --rpl-semi-sync-slave-enabled=1 --init-rpl-role=SLAVE --let $allow_rpl_inited=1 --source include/start_mysqld.inc --connection server_$server_to_crash --enable_reconnect --source include/wait_until_connected_again.inc ---let $assert_cond= COUNT(*) = $expected_rows_on_master FROM t1 ---let $assert_text= Table t1 should have $expected_rows_on_master rows. ---source include/assert.inc +--let $slave_semi_sync_enabled= query_get_value(SHOW VARIABLES LIKE 'Rpl_semi_sync_slave_enabled', Value, 1) +--echo # Ensuring variable rpl_semi_sync_slave_enabled is ON.. +if (`SELECT strcmp("ON", "$slave_semi_sync_enabled") != 0`) +{ + --die Slave started with rpl_semi_sync_slave_enabled=1 yet it is OFF in the variable output +} + +--let $slave_semi_sync_status= query_get_value(SHOW STATUS LIKE 'Rpl_semi_sync_slave_status', Value, 1) +--echo # Ensuring status rpl_semi_sync_slave_status is OFF.. +if (`SELECT strcmp("OFF", "$slave_semi_sync_status") != 0`) +{ + --die Slave started with skip-slave-start yet started with rpl_semi_sync_slave_status=ON +} + +--eval select count(*) 'on master must be $expected_rows_on_master' from t1 # Check error log for correct messages. let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.$server_to_crash.err; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_event.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_event.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_event.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_event.test 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,6 @@ call mtr.add_suppression("mysqld: Got an error reading communication packets"); connection slave; -call mtr.add_suppression("Master server does not support semi-sync"); call mtr.add_suppression("Semi-sync slave .* reply"); call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group"); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_fail_over.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_fail_over.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_fail_over.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_fail_over.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,6 +10,11 @@ --source include/have_binlog_format_row.inc --source include/master-slave.inc +--disable_query_log +call mtr.add_suppression("Could not read packet:.* errno: 11"); +flush tables; +--enable_query_log + # Initial slave --connection server_2 --source include/stop_slave.inc @@ -18,6 +23,7 @@ --connection server_1 RESET MASTER; SET @@global.max_binlog_size= 4096; +set @@global.rpl_semi_sync_master_enabled = 1; --connection server_2 RESET MASTER; @@ -29,7 +35,6 @@ --connection server_1 ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; -set @@global.rpl_semi_sync_master_enabled = 1; set @@global.rpl_semi_sync_master_wait_point=AFTER_SYNC; CREATE TABLE t1 (a INT PRIMARY KEY, b MEDIUMTEXT) ENGINE=Innodb; @@ -78,7 +83,7 @@ --connection server_1 --sync_with_master ---eval SELECT COUNT(*) = $rows_so_far as 'true' FROM t1 +--eval SELECT COUNT(*) 'must be $rows_so_far' FROM t1 --echo # ... the gtid states on the slave: SHOW VARIABLES LIKE 'gtid_slave_pos'; SHOW VARIABLES LIKE 'gtid_binlog_pos'; @@ -129,7 +134,7 @@ --connection server_2 --sync_with_master ---eval SELECT COUNT(*) = $rows_so_far as 'true' FROM t1 +--eval SELECT COUNT(*) 'must be $rows_so_far as' FROM t1 --echo # ... the gtid states on the slave: SHOW VARIABLES LIKE 'gtid_slave_pos'; SHOW VARIABLES LIKE 'gtid_binlog_pos'; @@ -180,7 +185,7 @@ --connection server_1 --source include/sync_with_master_gtid.inc ---eval SELECT COUNT(*) = $rows_so_far as 'true' FROM t1 +--eval SELECT COUNT(*) 'must be $rows_so_far' FROM t1 --echo # ... the gtid states on the slave: SHOW VARIABLES LIKE 'gtid_slave_pos'; SHOW VARIABLES LIKE 'gtid_binlog_pos'; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_master_shutdown.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_master_shutdown.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_master_shutdown.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_master_shutdown.test 2024-08-03 07:29:58.000000000 +0000 @@ -4,19 +4,17 @@ # finishes off as specified in particular trying to connect even to a shut down # master for a semisync firewell routine. -source include/not_embedded.inc; -source include/have_debug.inc; source include/master-slave.inc; --connection master ---let $sav_enabled_master=`SELECT @@GLOBAL.rpl_semi_sync_master_enabled ` +--let $sav_enabled_master=`SELECT @@GLOBAL.rpl_semi_sync_master_enabled` SET @@GLOBAL.rpl_semi_sync_master_enabled = 1; --connection slave source include/stop_slave.inc; ---let $sav_enabled_slave=`SELECT @@GLOBAL.rpl_semi_sync_slave_enabled ` -SET @@GLOBAL. rpl_semi_sync_slave_enabled = 1; +--let $sav_enabled_slave=`SELECT @@GLOBAL.rpl_semi_sync_slave_enabled` +SET @@GLOBAL.rpl_semi_sync_slave_enabled = 1; source include/start_slave.inc; --connection master @@ -30,8 +28,12 @@ --let $rpl_server_number=1 source include/rpl_stop_server.inc; +# After stoping the master, slave receives the disconnect error (2003) --connection slave ---source include/stop_slave.inc +--let $slave_io_errno=2003 +--let $slave_io_error_is_nonfatal=1 +--source include/wait_for_slave_io_error.inc +--let $slave_io_error_is_nonfatal=0 #connection master; --echo # Restart master @@ -42,11 +44,12 @@ # Clean up # --connection slave ---source include/stop_slave.inc ---source include/start_slave.inc +--source include/wait_for_slave_sql_to_start.inc +--let rpl_allow_error=1 +--source include/wait_for_slave_io_to_start.inc +#--source include/start_slave.inc --connection master -SET @@GLOBAL.debug_dbug=""; --eval SET @@GLOBAL. rpl_semi_sync_master_enabled = $sav_enabled_master --connection master diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.cnf mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.cnf --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,12 @@ +!include include/default_mysqld.cnf + +[mysqld.1] + +[mysqld.2] + +[mysqld.3] + +[ENV] +SERVER_MYPORT_1= @mysqld.1.port +SERVER_MYPORT_2= @mysqld.2.port +SERVER_MYPORT_3= @mysqld.3.port diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_no_missed_ack_after_add_slave.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,126 @@ +# +# This test ensures that a primary will listen for ACKs by newly added +# semi-sync connections connections, after a pre-existing connection is already +# established. MDEV-32960 reported that the newly added slave's ACK can be +# ignored if listen_on_sockets() does not timeout before +# rpl_semi_sync_master_timeout, and if the existing semi-sync connections fail +# to send ACKs, semi-sync is switched off. +# +# This test ensures this in a two-replica setup with a semi-sync timeout of +# 500ms, and delaying the ACK reply of the first-established replica by 800ms +# to force a timeout, and allowing the second replica to immediately ACK. +# +# References: +# MDEV-32960: Semi-sync ACKed Transaction can Timeout and Switch Off +# Semi-sync with Multiple Replicas +# +--source include/have_debug.inc +# binlog_format independent +--source include/have_binlog_format_statement.inc + +--let $rpl_topology= 1->2,1->3 +--source include/rpl_init.inc + + +--connection server_1 +set @old_enabled= @@global.rpl_semi_sync_master_enabled; +set @old_timeout= @@global.rpl_semi_sync_master_timeout; +set global rpl_semi_sync_master_enabled= 1; +set global rpl_semi_sync_master_timeout= 500; + +--connection server_2 +--source include/stop_slave.inc +set @old_enabled= @@global.rpl_semi_sync_slave_enabled; +set @old_dbug= @@global.debug_dbug; +set global rpl_semi_sync_slave_enabled= 1; +set global debug_dbug="+d,simulate_delay_semisync_slave_reply"; +--source include/start_slave.inc + +--connection server_3 +--source include/stop_slave.inc +set @old_enabled= @@global.rpl_semi_sync_slave_enabled; +set global rpl_semi_sync_slave_enabled= 1; +--source include/start_slave.inc + +--echo # Ensure primary recognizes both replicas are semi-sync +--connection server_1 +--let $status_var_value= 2 +--let $status_var= rpl_semi_sync_master_clients +--source include/wait_for_status_var.inc + +--let $master_ss_status= query_get_value(SHOW STATUS LIKE 'rpl_semi_sync_master_status', Value, 1) +if (`SELECT strcmp("$master_ss_status", "ON") != 0`) +{ + SHOW STATUS LIKE 'rpl_semi_sync_master_status'; + --die rpl_semi_sync_master_status should be ON to start +} + +--connection server_1 +--let $init_master_yes_tx= query_get_value(SHOW STATUS LIKE 'rpl_semi_sync_master_yes_tx', Value, 1) +create table t1 (a int); + +--connection server_2 +--echo # Verifying server_2 did not send ACK +--let $slave1_sent_ack= query_get_value(SHOW STATUS LIKE 'rpl_semi_sync_slave_send_ack', Value, 1) +if (`SELECT $slave1_sent_ack`) +{ + SHOW STATUS LIKE 'rpl_semi_sync_slave_send_ack'; + --die server_2 should not have sent semi-sync ACK to primary +} + +--connection server_3 +--echo # Verifying server_3 did send ACK +--let $status_var= Rpl_semi_sync_slave_send_ack +--let $status_var_comparsion= > +--let $status_var_value= 0 +--source include/wait_for_status_var.inc +--let $slave2_sent_ack= query_get_value(SHOW STATUS LIKE 'rpl_semi_sync_slave_send_ack', Value, 1) +if (`SELECT NOT $slave2_sent_ack`) +{ + SHOW STATUS LIKE 'rpl_semi_sync_slave_send_ack'; + --die server_3 should have sent semi-sync ACK to primary +} + +--connection server_1 +--echo # Verifying master's semi-sync status is still ON (This failed pre-MDEV-32960 fixes) +let $master_ss_status= query_get_value(SHOW STATUS LIKE 'rpl_semi_sync_master_status', Value, 1); +if (`SELECT strcmp("$master_ss_status", "ON") != 0`) +{ + SHOW STATUS LIKE 'rpl_semi_sync_master_status'; + --die rpl_semi_sync_master_status should not have switched off after server_3 ACKed transaction +} + +--echo # Verifying rpl_semi_sync_master_yes_tx incremented +--let $cur_master_yes_tx= query_get_value(SHOW STATUS LIKE 'rpl_semi_sync_master_yes_tx', Value, 1) +if (`SELECT $cur_master_yes_tx != ($init_master_yes_tx + 1)`) +{ + --echo # Initial yes_tx: $init_master_yes_tx + --echo # Current yes_tx: $cur_master_yes_tx + --die rpl_semi_sync_master_yes_tx should have been incremented by primary +} + + +--echo # +--echo # Cleanup + +--connection server_2 +set global rpl_semi_sync_slave_enabled= @old_enabled; +set global debug_dbug= @old_dbug; +--source include/stop_slave.inc + +--connection server_3 +set global rpl_semi_sync_slave_enabled= @old_enabled; +--source include/stop_slave.inc + +--connection server_1 +set global rpl_semi_sync_master_enabled= @old_enabled; +set global rpl_semi_sync_master_timeout= @old_timeout; +drop table t1; + +--connection server_2 +--source include/start_slave.inc +--connection server_3 +--source include/start_slave.inc + +--source include/rpl_end.inc +--echo # End of rpl_semi_sync_no_missed_ack_after_add_slave.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.cnf mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.cnf --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.cnf 2024-08-03 07:29:58.000000000 +0000 @@ -1,13 +1,13 @@ !include ../my.cnf [mysqld.1] -log_warnings=9 +log_warnings=3 [mysqld.2] -log_warnings=9 +log_warnings=3 [mysqld.3] -log_warnings=9 +log_warnings=3 [ENV] SERVER_MYPORT_3= @mysqld.3.port diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.inc mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.inc --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.inc 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,6 @@ # replicas before shutting down. # # Parameters: -# server_1_dbug (string) Debug setting for primary (server 1) # server_2_dbug (string) Debug setting to simulate delay or error on # the first replica (server 2) # server_3_dbug (string) Debug setting to simulate delay or error on @@ -32,8 +31,8 @@ --connection server_$i --sync_with_master - set global rpl_semi_sync_slave_enabled = 1; source include/stop_slave.inc; + set global rpl_semi_sync_slave_enabled = 1; source include/start_slave.inc; show status like 'Rpl_semi_sync_slave_status'; @@ -56,8 +55,6 @@ show status like 'Rpl_semi_sync_master_clients'; --echo #-- Prepare servers to simulate delay or error ---connection server_1 ---eval SET @@GLOBAL.debug_dbug= $server_1_dbug --connection server_2 --eval SET @@GLOBAL.debug_dbug= $server_2_dbug --connection server_3 @@ -66,6 +63,11 @@ --echo #-- --echo #-- Test begins +--connection server_1_con2 +--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +wait +EOF + --connection server_1 --echo #-- Begin semi-sync transaction --send INSERT INTO t1 VALUES (1) @@ -75,25 +77,13 @@ let $status_var= Rpl_semi_sync_master_wait_sessions; let $status_var_value= 1; source include/wait_for_status_var.inc; -show status like 'Rpl_semi_sync_master_wait_sessions'; - ---write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect -wait -EOF - ---echo #-- Give enough time after timeout/ack received to query yes_tx/no_tx -SET @@GLOBAL.debug_dbug= "+d,delay_shutdown_phase_2_after_semisync_wait"; --echo #-- Begin master shutdown ---send SHUTDOWN WAIT FOR ALL SLAVES +SHUTDOWN WAIT FOR ALL SLAVES; +--source include/wait_until_disconnected.inc --connection server_1 ---reap ---echo #-- Ensure either ACK was received (yes_tx=1) or timeout (no_tx=1) -show status like 'Rpl_semi_sync_master_yes_tx'; -show status like 'Rpl_semi_sync_master_no_tx'; - ---connection server_1_con2 +--error 2013 --reap --source include/wait_until_disconnected.inc @@ -111,17 +101,72 @@ --echo # --echo #-- Re-synchronize slaves with master and disable semi-sync +if (`SELECT ($server_2_expect_row_count + $server_3_expect_row_count) < 2`) +{ +--echo #-- FIXME: workaround for MDEV-28141, preventing errored replicas from +--echo # killing their semi-sync connections +# I.e. we can't create a new kill connection to the primary if we know that the +# primary is shutting down for risk of Packets out of order error. So we wait +# to hit a debug_sync point before the creation of the new kill_connection, and +# don't progress until the primary has been shutdown, so no new connection can +# be formed. +# Note this is only needed in the error case (using corrupt_queue_event), as +# the running io_thread will otherwise automatically detect that the primary +# has shutdown before progressing to the cleanup of the io thread. +} + +if (!$server_2_expect_row_count) +{ + --connection server_2 + set debug_sync= "now wait_for at_semisync_kill_connection"; + set debug_sync= "now signal continue_semisync_kill_connection"; + --echo # Wait for debug_sync signal to have been received before issuing RESET + let $wait_condition= select count(*)=0 from information_schema.processlist where state like "debug sync point%"; + source include/wait_condition.inc; + set debug_sync= "reset"; +} +if (!$server_3_expect_row_count) +{ + --connection server_3 + set debug_sync= "now wait_for at_semisync_kill_connection"; + set debug_sync= "now signal continue_semisync_kill_connection"; + --echo # Wait for debug_sync signal to have been received before issuing RESET + let $wait_condition= select count(*)=0 from information_schema.processlist where state like "debug sync point%"; + source include/wait_condition.inc; + set debug_sync= "reset"; +} + --echo #-- Stop slaves --connection server_2 ---eval SET @@GLOBAL.debug_dbug= "$sav_server_2_dbug" ---eval SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0 -source include/stop_slave.inc; +# If server_2_expect_row_count is 0, we are simulating an error on the replica +# and the IO thread will end with errno 1595. +# Otherwise, we still expect error, because the master has shutdown at this +# point, and the IO thread may or may not have realized the shutdown, and +# started to try to automatically reconnect. This may result in the IO thread +# giving a 2003 error if the slave tries to reconnect to a shutdown master. +# Additionally disable warnings because the slave may have stopped in err +# automatically, and we don't want a sporadic "Slave is already stopped" +# warning. +--disable_warnings +--let $rpl_allow_error= 1 +--source include/stop_slave_io.inc +--enable_warnings +--let $rpl_allow_error= +--source include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_2_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_2; --connection server_3 ---eval SET @@GLOBAL.debug_dbug= "$sav_server_3_dbug" ---eval SET @@GLOBAL.rpl_semi_sync_slave_enabled= 0 -source include/stop_slave.inc; +# Expect error for IO thread, see above comment for stopping server_2 +--disable_warnings +--let $rpl_allow_error= 1 +--source include/stop_slave_io.inc +--enable_warnings +--let $rpl_allow_error= +--source include/stop_slave_sql.inc +SET @@GLOBAL.debug_dbug= @sav_server_3_dbug; +SET @@GLOBAL.rpl_semi_sync_slave_enabled= @sav_enabled_server_3; --echo #-- Bring the master back up --connection server_1_con2 @@ -140,13 +185,6 @@ --enable_reconnect --source include/wait_until_connected_again.inc ---eval SET @@GLOBAL.debug_dbug= "$sav_master_dbug" -let $status_var= Rpl_semi_sync_master_clients; -let $status_var_value= 0; -source include/wait_for_status_var.inc; ---eval SET @@GLOBAL.rpl_semi_sync_master_enabled = 0 -show status like 'Rpl_semi_sync_master_status'; - TRUNCATE TABLE t1; --save_master_pos diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_shutdown_await_ack.test 2024-08-03 07:29:58.000000000 +0000 @@ -5,7 +5,7 @@ # This test validates that data is consistent between a primary and replica # in semi-sync mode when the primary is issued `SHUTDOWN WAIT FOR SLAVES` # during an active communication. More specifically, the primary should not -# kill the connection until it is sure a replica has received all binlog +# kill the Ack_thread until it is sure a replica has received all binlog # data, i.e. once the primary receives the ACK. If a primary is issued a # shutdown before receiving an ACK, it should wait until either 1) the ACK is # received, or 2) the configured timeout (rpl_semi_sync_master_timeout) is @@ -15,23 +15,18 @@ # Using a topology consisting of one primary with two replicas, all in # semi-sync mode, we use DEBUG_DBUG to simulate an error or delay on the # replicas during an active communication while the primary is issued -# `SHUTDOWN WAIT FOR SLAVES`. We create four test cases to ensure the primary -# will correctly wait for the communication to finish, and use the semi-sync -# status variables Rpl_semi_sync_master_yes_tx and Rpl_semi_sync_master_no_tx -# to ensure the connection was not prematurely killed due to the shutdown. +# `SHUTDOWN WAIT FOR SLAVES`. We create four test cases to ensure the +# Ack_thread is not prematurely killed due to the shutdown. # Test Case 1) If both replicas simulate a delay that is within the allowed -# timeout, the primary should delay killing the suspended thread -# until an ACK is received (Rpl_semi_sync_master_yes_tx should -# be 1). +# timeout, the primary should delay killing the Ack_thread +# until an ACK is received. # Test Case 2) If both replicas simulate an error before sending an ACK, the -# primary should delay killing the suspended thread until the -# the timeout is reached (Rpl_semi_sync_master_no_tx should be -# 1). +# primary should delay killing the Ack_thread until the +# the timeout is reached. # Test Case 3) If one replica simulates a delay within the allowed timeout # and the other simulates an error before sending an ACK, the -# primary should delay killing the suspended thread until it -# receives an ACK from the delayed slave -# (Rpl_semi_sync_master_yes_tx should be 1). +# primary should delay killing the Ack_thread until it +# receives an ACK from the delayed slave. # Test Case 4) If a replica errors before sending an ACK, it will cause the # IO thread to stop and handle the error. During error handling, # if semi-sync is active, the replica will form a new connection @@ -41,9 +36,11 @@ # slave should notice this, and not issue a `QUIT` command to # the primary, which would otherwise be sent to kill an active # connection. This test case validates that the slave does not -# send a `QUIT` in this case (Rpl_semi_sync_master_yes_tx should -# be 1 because server_3 will send the ACK within a valid -# timeout). +# send a `QUIT` in this case. +# Test Case 5) If a waiting-for-ACK user thread is killed (disconnected) +# during SHUTDOWN WAIT FOR ALL SLAVES, ensure the primary will +# still await the ACK from the replica before killing the +# Ack_thread. # # References: # MDEV-11853: semisync thread can be killed after sync binlog but before ACK @@ -58,6 +55,7 @@ --echo # Note: Simulated slave delay is hardcoded to 800 milliseconds --echo # Note: Simulated master shutdown delay is hardcoded to 500 milliseconds +--source include/have_innodb.inc --source include/have_debug.inc --let $rpl_topology=1->2, 1->3 --source include/rpl_init.inc @@ -69,9 +67,8 @@ call mtr.add_suppression("did not exit"); call mtr.add_suppression("Got an error reading communication packets"); ---let $sav_master_timeout= `SELECT @@global.rpl_semi_sync_master_timeout` +--let $sav_master_timeout= `SELECT @@GLOBAL.rpl_semi_sync_master_timeout` --let $sav_enabled_master= `SELECT @@GLOBAL.rpl_semi_sync_master_enabled` ---let $sav_master_dbug= `SELECT @@GLOBAL.debug_dbug` --echo # Suppress slave errors related to the simulated error --connection server_2 @@ -79,19 +76,19 @@ call mtr.add_suppression("Replication event checksum verification"); call mtr.add_suppression("Relay log write failure"); call mtr.add_suppression("Failed to kill the active semi-sync connection"); ---let $sav_enabled_server_2=`SELECT @@GLOBAL.rpl_semi_sync_slave_enabled` ---let $sav_server_2_dbug= `SELECT @@GLOBAL.debug_dbug` +set @sav_enabled_server_2= @@GLOBAL.rpl_semi_sync_slave_enabled; +set @sav_server_2_dbug= @@GLOBAL.debug_dbug; --connection server_3 call mtr.add_suppression("reply failed"); call mtr.add_suppression("Replication event checksum verification"); call mtr.add_suppression("Relay log write failure"); call mtr.add_suppression("Failed to kill the active semi-sync connection"); ---let $sav_enabled_server_3=`SELECT @@GLOBAL.rpl_semi_sync_slave_enabled` ---let $sav_server_3_dbug= `SELECT @@GLOBAL.debug_dbug` +set @sav_enabled_server_3= @@GLOBAL.rpl_semi_sync_slave_enabled; +set @sav_server_3_dbug= @@GLOBAL.debug_dbug; --connection server_1 -CREATE TABLE t1 (a int); +CREATE TABLE t1 (a int) engine=innodb; --save_master_pos --let i= 2 @@ -113,10 +110,9 @@ --echo # --echo # Test Case 1) If both replicas simulate a delay that is within the ---echo # allowed timeout, the primary should delay killing the suspended thread ---echo # until an ACK is received (Rpl_semi_sync_master_yes_tx should be 1). +--echo # allowed timeout, the primary should delay killing the Ack_thread +--echo # until an ACK is received. --echo # ---let server_1_dbug= "" --let server_2_dbug= "+d,simulate_delay_semisync_slave_reply" --let server_3_dbug= "+d,simulate_delay_semisync_slave_reply" --let semisync_timeout= 1600 @@ -126,12 +122,11 @@ --echo # --echo # Test Case 2) If both replicas simulate an error before sending an ACK, ---echo # the primary should delay killing the suspended thread until the ---echo # timeout is reached (Rpl_semi_sync_master_no_tx should be 1). +--echo # the primary should delay killing the Ack_thread until the +--echo # timeout is reached. --echo # ---let server_1_dbug= "+d,mysqld_delay_kill_threads_phase_1" ---let server_2_dbug= "+d,corrupt_queue_event" ---let server_3_dbug= "+d,corrupt_queue_event" +--let server_2_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141" +--let server_3_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141" --let semisync_timeout= 500 --let server_2_expect_row_count= 0 --let server_3_expect_row_count= 0 @@ -140,11 +135,10 @@ --echo # --echo # Test Case 3) If one replica simulates a delay within the allowed --echo # timeout and the other simulates an error before sending an ACK, the ---echo # primary should delay killing the suspended thread until it receives an ---echo # ACK from the delayed slave (Rpl_semi_sync_master_yes_tx should be 1). +--echo # primary should delay killing the Ack_thread until it receives an +--echo # ACK from the delayed slave. --echo # ---let server_1_dbug= "+d,mysqld_delay_kill_threads_phase_1" ---let server_2_dbug= "+d,corrupt_queue_event" +--let server_2_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141" --let server_3_dbug= "+d,simulate_delay_semisync_slave_reply" --let semisync_timeout= 1600 --let server_2_expect_row_count= 0 @@ -160,56 +154,123 @@ --echo # active semi-sync connection in-tact. The slave should notice this, and --echo # not issue a `QUIT` command to the primary, which would otherwise be --echo # sent to kill an active connection. This test case validates that the ---echo # slave does not send a `QUIT` in this case (Rpl_semi_sync_master_yes_tx ---echo # should be 1 because server_3 will send the ACK within a valid timeout). +--echo # slave does not send a `QUIT` in this case. --echo # - -# mysqld_delay_kill_threads_phase1 ensures that server_2 will have enough time -# to start a new connection that has the intent to kill the active semi-sync -# connection ---let server_1_dbug= "+d,mysqld_delay_kill_threads_phase_1" - -# slave_delay_killing_semisync_connection ensures that the primary has force -# killed its current connection before it is able to issue `KILL` ---let server_2_dbug= "+d,corrupt_queue_event,slave_delay_killing_semisync_connection" +--let server_2_dbug= "+d,corrupt_queue_event,delay_semisync_kill_connection_for_mdev_28141" --let server_3_dbug= "+d,simulate_delay_semisync_slave_reply" --let semisync_timeout= 1600 --let server_2_expect_row_count= 0 --let server_3_expect_row_count= 1 --source rpl_semi_sync_shutdown_await_ack.inc +# +# Added with MDEV-33551 +# +--echo # +--echo # Test Case 5) If a waiting-for-ACK user thread is killed (disconnected) +--echo # during SHUTDOWN WAIT FOR ALL SLAVES, ensure the primary will still +--echo # await the ACK from the replica before killing the Ack_receiver thread +--echo # +--connection server_1 +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +SET GLOBAL rpl_semi_sync_slave_enabled= 1; +--source include/start_slave.inc + +--connection server_1 +SET GLOBAL rpl_semi_sync_master_enabled= 1; +SET GLOBAL rpl_semi_sync_master_timeout= 2000; + +--let $status_var= Rpl_semi_sync_master_clients +--let $status_var_value= 1 +source include/wait_for_status_var.inc; + +show status like 'Rpl_semi_sync_master_status'; +show status like 'Rpl_semi_sync_master_clients'; + +--connection server_2 +SET @old_dbug= @@GLOBAL.debug_dbug; +SET GLOBAL debug_dbug="+d,simulate_delay_semisync_slave_reply"; + +--connect(con1, localhost, root,,) +--connect(con2, localhost, root,,) + +--connection con1 +--send insert into t1 values (2) + +--connection server_1 +--echo # Wait for thd to begin semi-sync wait.. +--let $wait_condition= SELECT COUNT(*) = 1 FROM information_schema.processlist WHERE state = 'Waiting for semi-sync ACK from slave' +--source include/wait_condition.inc +--echo # ..done + +--disconnect con1 + +--connection default +--write_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +wait +EOF + +--connection con2 +SHUTDOWN WAIT FOR ALL SLAVES; +--source include/wait_until_disconnected.inc + +--echo # Ensure the primary waited for the ACK of the killed thread +--let $SEARCH_PATTERN= Delaying shutdown to await semi-sync ACK +--let $SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err +--source include/search_pattern_in_file.inc + +--connection default +--source include/wait_until_disconnected.inc + +--connection server_1 +--source include/wait_until_disconnected.inc + +--connection server_2 +--let $rpl_allow_error= 1 +source include/stop_slave.inc; +--connection server_3 +source include/stop_slave.inc; +--let $rpl_allow_error= + +--connection default +--append_file $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +restart +EOF +--enable_reconnect +--source include/wait_until_connected_again.inc + +--connection server_1 +--enable_reconnect +--source include/wait_until_connected_again.inc + + --echo ############################# --echo # Cleanup --echo ############################# --connection server_2 -source include/stop_slave.inc; +SET @@GLOBAL.rpl_semi_sync_slave_enabled = @sav_enabled_server_2; +SET @@GLOBAL.debug_dbug= @sav_server_2_dbug; source include/start_slave.inc; ---disable_query_log ---eval SET @@GLOBAL.rpl_semi_sync_slave_enabled = $sav_enabled_server_2 ---eval SET @@GLOBAL.debug_dbug= "$sav_server_2_dbug" ---enable_query_log - --connection server_3 -source include/stop_slave.inc; +SET @@GLOBAL.rpl_semi_sync_slave_enabled = @sav_enabled_server_3; +SET @@GLOBAL.debug_dbug= @sav_server_3_dbug; source include/start_slave.inc; ---disable_query_log ---eval SET @@GLOBAL.rpl_semi_sync_slave_enabled = $sav_enabled_server_3 ---eval SET @@GLOBAL.debug_dbug= "$sav_server_3_dbug" ---enable_query_log - - --connection server_1 let $status_var= Rpl_semi_sync_master_clients; let $status_var_value= 0; source include/wait_for_status_var.inc; --disable_query_log ---eval SET @@GLOBAL.rpl_semi_sync_master_timeout= $sav_master_timeout ---eval SET @@GLOBAL.rpl_semi_sync_master_enabled= $sav_enabled_master ---eval SET @@GLOBAL.debug_dbug= "$sav_master_dbug" +--eval SET @@GLOBAL.rpl_semi_sync_master_timeout= $sav_master_timeout; +--eval SET @@GLOBAL.rpl_semi_sync_master_enabled= $sav_enabled_master; --enable_query_log drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_slave_compressed_protocol.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_compressed_protocol.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_slave_compressed_protocol.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_compressed_protocol.test 2024-08-03 07:29:58.000000000 +0000 @@ -40,7 +40,7 @@ --let $assert_select=Read semi-sync reply magic number error --let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err --let $assert_count= 0 ---let $assert_only_after = CURRENT_TEST:rpl.rpl_semi_sync_slave_compressed_protocol.test +--let $assert_only_after = CURRENT_TEST: rpl.rpl_semi_sync_slave_compressed_protocol --source include/assert_grep.inc --connection master diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_slave_enabled_consistent.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_enabled_consistent.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_slave_enabled_consistent.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_enabled_consistent.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,76 @@ +# +# MDEV-32551: "Read semi-sync reply magic number error" warnings on master +# +# Test that changing rpl_semi_sync_master_enabled after startup does not +# cause problems with semi-sync cleanup. +# + +--source include/have_debug.inc +--source include/have_debug_sync.inc + +# Test is binlog format independent, so save resources +--source include/have_binlog_format_row.inc +--source include/master-slave.inc + +call mtr.add_suppression("Replication event checksum verification failed"); +call mtr.add_suppression("could not queue event from master"); +call mtr.add_suppression("Semisync ack receiver.*error reading communication packets"); +call mtr.add_suppression("Semisync ack receiver got hangup"); +--sync_slave_with_master + +--echo # +--echo # Set up a semisync connection +--connection master +set @@global.rpl_semi_sync_master_enabled= ON; + +--connection slave +stop slave io_thread; +set @@global.rpl_semi_sync_slave_enabled= ON; +set @old_dbug= @@global.debug_dbug; + +# Force an error to abort out of the main IO thread loop +set @@global.debug_dbug= "+d,corrupt_queue_event"; + +# Pause the IO thread as soon as the main loop starts. Note we can't use +# processlist where "Waiting for master to send event" because the +# "corrupt_queue_event" will trigger before we can turn semisync OFF +set @@global.debug_dbug= "+d,pause_before_io_read_event"; + +# Because the other debug_dbug points are automatically negated when they are +# run, and there is a bug that if "-d" takes us to an empty debug string state, +# _all_ debug_print statements are output +set @@global.debug_dbug= "+d,placeholder"; + +start slave io_thread; + +--echo # Disable semi-sync on the slave while the IO thread is active +set debug_sync='now wait_for io_thread_at_read_event'; +set @@global.rpl_semi_sync_slave_enabled= OFF; +set debug_sync='now signal io_thread_continue_read_event'; + +--echo # Waiting for the slave to stop with the error from corrupt_queue_event +--connection slave +--let $slave_io_errno= 1595,1743 +--source include/wait_for_slave_io_error.inc + +--echo # Sleep 1 to give time for Ack_receiver to receive COM_QUIT +--sleep 1 + +--let $assert_text= Check that there is no 'Read semi-sync reply magic number error' in error log. +--let $assert_select=magic number error +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let $assert_count= 0 +--let $assert_only_after=CURRENT_TEST +--source include/assert_grep.inc + +--echo # +--echo # Cleanup +--connection slave +--source include/stop_slave.inc +set @@global.debug_dbug= @old_dbug; +--source include/start_slave.inc +--connection master +set @@global.rpl_semi_sync_master_enabled= default; + +--source include/rpl_end.inc +--echo # End of rpl_semi_sync_slave_enabled_consistent.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_slave_reply_fail.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_reply_fail.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semi_sync_slave_reply_fail.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semi_sync_slave_reply_fail.test 2024-08-03 07:29:58.000000000 +0000 @@ -31,6 +31,7 @@ --connection master call mtr.add_suppression("Timeout waiting for reply of binlog*"); +call mtr.add_suppression("Master server does not read semi-sync messages*"); --let $sav_timeout_master=`SELECT @@GLOBAL.rpl_semi_sync_master_timeout` set global rpl_semi_sync_master_enabled = ON; SET @@GLOBAL.rpl_semi_sync_master_timeout=100; @@ -54,9 +55,9 @@ # does not know the location of its .err log, use default location let $log_error_ = $MYSQLTEST_VARDIR/log/mysqld.2.err; } ---echo "Assert that the net_fulsh() reply failed is present in slave error log. +--echo "Assert that Master server does not read semi-sync messages" is present in slave error log. --let SEARCH_FILE=$log_error_ ---let SEARCH_PATTERN=Semi-sync slave net_flush\(\) reply failed +--let SEARCH_PATTERN=Master server does not read semi-sync messages --source include/search_pattern_in_file.inc --echo "Assert that Slave IO thread is up and running." @@ -78,7 +79,7 @@ --connection master set statement sql_log_bin=0 for call mtr.add_suppression("Read semi-sync reply magic number error"); -SET @save_debug_master= @@global.debug; +SET @save_debug_master= @@global.debug_dbug; SET GLOBAL debug_dbug="+d,semisync_corrupt_magic"; insert into t1 values (11); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semisync_ali_issues.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semisync_ali_issues.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_semisync_ali_issues.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_semisync_ali_issues.test 2024-08-03 07:29:58.000000000 +0000 @@ -16,7 +16,6 @@ CALL mtr.add_suppression("Semi-sync master failed on*"); CALL mtr.add_suppression("Master command COM_BINLOG_DUMP failed*"); CALL mtr.add_suppression("on master failed*"); -CALL mtr.add_suppression("Master server does not support semi-sync*"); CALL mtr.add_suppression("Semi-sync slave net_flush*"); CALL mtr.add_suppression("Failed to flush master info*"); CALL mtr.add_suppression("Request to stop slave SQL Thread received while apply*"); diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var.test 2024-08-03 07:29:58.000000000 +0000 @@ -7,6 +7,12 @@ call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); enable_query_log; +select @@rpl_semi_sync_master_enabled; +connection slave; +select @@rpl_semi_sync_slave_enabled; +show status like "rpl_semi_sync_slave_status"; +connection master; + drop table if exists t1; create table t1(a varchar(100),b int); set @@session.sql_mode=pipes_as_concat; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var2-master.opt mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2-master.opt --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var2-master.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2-master.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--rpl_semi_sync_master_enabled=1 --rpl_semi_sync_slave_enabled=1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var2-slave.opt mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2-slave.opt --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var2-slave.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2-slave.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--rpl_semi_sync_slave_enabled=1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var2.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_session_var2.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_session_var2.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,3 @@ +# Replication of session variables when semi-sync is on + +--source rpl_session_var.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_set_statement_default_master.test 2024-08-03 07:29:58.000000000 +0000 @@ -26,6 +26,7 @@ SET STATEMENT default_master_connection = 'm1' FOR START SLAVE; set default_master_connection = 'm1'; +--source include/wait_for_slave_to_start.inc stop slave; --source include/wait_for_slave_to_stop.inc reset slave all; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_show_slave_status.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_show_slave_status.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_show_slave_status.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_show_slave_status.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,27 @@ +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + +--echo * +--echo * The purpose of this test is to prevent incorrect additions to SHOW +--echo * SLAVE STATUS, which has happened several times in the past. +--echo * +--echo * We must never, _ever_, add extra rows to this output of SHOW SLAVE +--echo * STATUS, except at the very end, as this breaks backwards compatibility +--echo * with applications or scripts that parse the output. This also means that +--echo * we cannot add _any_ new rows in a GA version if a different row was +--echo * already added in a later MariaDB version, as this would make it impossible +--echo * to merge the change up while preserving the order of rows. +--echo * + +--connection slave +--replace_column 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 11 # 12 # 13 # 14 # 15 # 16 # 17 # 18 # 19 # 20 # 21 # 22 # 23 # 24 # 25 # 26 # 27 # 28 # 29 # 30 # 31 # 32 # 33 # 34 # 35 # 36 # 37 # 38 # 39 # 40 # 41 # 42 # 43 # 44 # 45 # 46 # 47 # 48 # 49 # 50 # 51 # 52 # 53 # 54 # +query_vertical +SHOW SLAVE STATUS; + +--echo * +--echo * When modifying this test after adding a column to SHOW SLAVE STATUS, +--echo * _only_ additions at the end are allowed, the column number of existing +--echo * columns must _not_ change! +--echo * + +--source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_shutdown_sighup.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_shutdown_sighup.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_shutdown_sighup.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_shutdown_sighup.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,154 @@ +# +# The signal handler thread can use various different runtime resources when +# processing a SIGHUP (e.g. master-info information), as the logic calls into +# reload_acl_and_cache(). This test ensures that SIGHUP processing, when +# concurrent with server shutdown, the shutdown logic must wait for the SIGHUP +# processing to finish before cleaning up any resources. +# +# Additionally, the error case is tested such that the signal handler thread +# takes too long processing a SIGHUP, and the main mysqld thread must skip its +# wait and output a warning. +# +# Note the SIGHUP is sent via the command-line kill program via a perl script. +# +# References: +# MDEV-30260: Slave crashed:reload_acl_and_cache during shutdown +# + +--source include/not_windows.inc +--source include/not_embedded.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +# Binlog format doesn't matter +--source include/have_binlog_format_statement.inc +--source include/master-slave.inc + +# For error test case which forces timeout +--connection slave +set statement sql_log_bin=0 for call mtr.add_suppression("Signal handler thread did not exit in a timely manner"); + + +--echo # +--echo # Main test +--connection master +create table t1 (a int); +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc + +# Make signal handler handle SIGHUP.. +set @@global.debug_dbug= "+d,hold_sighup_log_refresh"; +--let KILL_NODE_PIDFILE = `SELECT @@pid_file` +--perl + my $kill_sig = $ENV{'KILL_SIGNAL_VALUE'}; + my $pid_filename = $ENV{'KILL_NODE_PIDFILE'}; + my $mysqld_pid = `cat $pid_filename`; + chomp($mysqld_pid); + system("kill -HUP $mysqld_pid"); + exit(0); +EOF + +--echo # Waiting for sighup to reach reload_acl_and_cache.. +set debug_sync="now wait_for in_reload_acl_and_cache"; +--echo # Signalling signal handler to proceed to sleep before REFRESH_HOSTS +set debug_sync="now signal refresh_logs"; + +# ..while we are shutting down +--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +wait +EOF +--echo # Starting shutdown (note this will take 3+ seconds due to DBUG my_sleep in reload_acl_and_cache) +shutdown; + +--source include/wait_until_disconnected.inc +--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +restart: --skip-slave-start=0 +EOF + +--connection server_2 +--enable_reconnect +--source include/wait_until_connected_again.inc + +--connection slave +--enable_reconnect +--source include/wait_until_connected_again.inc + +--let $assert_text= Ensure Mariadbd did not segfault when shutting down +--let $assert_select= got signal 11 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_count= 0 +--let $assert_only_after = CURRENT_TEST: rpl.rpl_shutdown_sighup +--source include/assert_grep.inc + +--connection master +--sync_slave_with_master + + +--echo # +--echo # Error testcase to ensure an error message is shown if the signal +--echo # takes longer than the timeout while processing the SIGHUP + +--connection slave +set @@global.debug_dbug= "+d,force_sighup_processing_timeout"; +set @@global.debug_dbug= "+d,hold_sighup_log_refresh"; + +--connection master +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc + +# Make signal handler handle SIGHUP.. +--let KILL_NODE_PIDFILE = `SELECT @@pid_file` +--perl + my $kill_sig = $ENV{'KILL_SIGNAL_VALUE'}; + my $pid_filename = $ENV{'KILL_NODE_PIDFILE'}; + my $mysqld_pid = `cat $pid_filename`; + chomp($mysqld_pid); + system("kill -HUP $mysqld_pid"); + exit(0); +EOF +--echo # Waiting for sighup to reach reload_acl_and_cache.. +set debug_sync="now wait_for in_reload_acl_and_cache"; +--echo # Signalling signal handler to proceed to sleep before REFRESH_HOSTS +set debug_sync="now signal refresh_logs"; + +# ..while we are shutting down +--write_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +wait +EOF +--echo # Starting shutdown (note this will take 3+ seconds due to DBUG my_sleep in reload_acl_and_cache) +shutdown; + +--source include/wait_until_disconnected.inc +--append_file $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +restart: --skip-slave-start=0 +EOF + +--connection server_2 +--enable_reconnect +--source include/wait_until_connected_again.inc + +--connection slave +--enable_reconnect +--source include/wait_until_connected_again.inc + +--let $assert_text= Ensure warning is issued that signal handler thread is still processing +--let $assert_select= Signal handler thread did not exit in a timely manner. +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.2.err +--let $assert_count= 1 +--let $assert_only_after = CURRENT_TEST: rpl.rpl_shutdown_sighup +--source include/assert_grep.inc + + +--echo # +--echo # Cleanup +--connection master +drop table t1; + +--source include/rpl_end.inc +--echo # End of rpl_shutdown_sighup.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_shutdown_wait_semisync_slaves.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_shutdown_wait_semisync_slaves.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_shutdown_wait_semisync_slaves.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_shutdown_wait_semisync_slaves.test 2024-08-03 07:29:58.000000000 +0000 @@ -28,6 +28,9 @@ --inc $i } +# The following script will restart master and slaves. This will also set +# rpl_semi_sync_master_enabled=0 + --source include/rpl_shutdown_wait_slaves.inc --let i= 2 while (`SELECT $i <= $slaves`) diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_skip_error.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_skip_error.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_skip_error.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_skip_error.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,11 @@ # Verify that --slave-skip-errors works correctly. The error messages # specified by --slave-skip-errors on slave should be ignored. If # such errors occur, they should not be reported and not cause the -# slave to stop. +# slave to stop. If a skipped-due-to-error statement is a part of a +# larger transaction, and the error is not a deadlock error, the rest +# of the transaction should still commit, with just the errored statement +# ignored (note transactions which are skipped due to deadlocks are +# rolled back fully, see rpl_temporary_error2_skip_all.test). # # ==== Method ==== # @@ -164,6 +168,42 @@ --echo **** We cannot execute a select as there are differences in the --echo **** behavior between STMT and RBR. + +--echo **** +--echo **** Ensure transactions which are skipped due to encountering a +--echo **** non-deadlock error which is present in --slave-skip-errors result +--echo **** in partially committed transactions +# Slave will insert 3 first, and master will insert 3 within a larger trx +--let $value_preexisting_on_slave= 3 + +--connection master +CREATE TABLE t3 (a INT UNIQUE) ENGINE=InnoDB; + +--sync_slave_with_master +--connection slave +--eval INSERT INTO t3 VALUES ($value_preexisting_on_slave) + +--connection master +BEGIN; +INSERT INTO t3 VALUES (1); +INSERT INTO t3 VALUES (2); +--eval INSERT INTO t3 VALUES ($value_preexisting_on_slave) +INSERT INTO t3 VALUES (4); +COMMIT; +--sync_slave_with_master + +--echo **** Master and slave tables should have the same data, due to the +--echo **** partially replicated transaction's data overlapping with the data +--echo **** that pre-existed on the slave. That is, despite the transaction +--echo **** consisting of 4 statements, the errored statement should be ignored +--echo **** and the other 3 should commit successfully. +let $diff_tables=master:t3,slave:t3; +source include/diff_tables.inc; + +--connection master +DROP TABLE t3; + + --echo ==== Clean Up ==== connection master; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_load_tmpdir_not_exist.test 2024-08-03 07:29:58.000000000 +0000 @@ -15,6 +15,7 @@ --let $slave_sql_errno= 12 source include/wait_for_slave_sql_error.inc; +--source include/wait_for_slave_io_to_start.inc --source include/stop_slave_io.inc RESET SLAVE; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_slave_restart_long_password.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_restart_long_password.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_slave_restart_long_password.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_restart_long_password.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,80 @@ +# +# This test validates a fix for a bug where slaves only read the +# first 41 characters of MASTER_PASSWORD from the master.info file +# after restarts. +# +# The test ensures that passwords up to the maximum allowable +# length (96 ASCII characters) will be read from the master.info +# file after slave restarts +# +# References: +# MDEV-23857: replication master password length +# + +# Test is format independent, so only run with one format +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + + +##### +# Setup +# +--let $passwd=123456789X12141618202224262830323436384042444648505254565860626466687072747678808284868890929496 +--let $expected_pwlen=96 +--let assert_cond=CHAR_LENGTH("$passwd")=$expected_pwlen +--let assert_text=Password length is $expected_pwlen +--source include/assert.inc + +connection master; +SET SQL_LOG_BIN=0; +--eval GRANT REPLICATION SLAVE ON *.* TO rpl@127.0.0.1 IDENTIFIED BY '$passwd' +SET SQL_LOG_BIN=1; +##### + + +##### +# Change master to new user/password combination +# +connection slave; +--source include/stop_slave.inc +--eval CHANGE MASTER TO MASTER_HOST='127.0.0.1', master_user='rpl', master_password='$passwd' + +--source include/start_slave.inc +--let $slave_param= Slave_IO_Running +--let $slave_param_value= Yes +--source include/check_slave_param.inc +##### + + +##### +# Ensure slave can re-connect to master after restart +# +connection master; +--let $rpl_server_number= 2 +--source include/rpl_restart_server.inc + +connection slave; +--source include/start_slave.inc +--let $slave_param= Slave_IO_Running +--let $slave_param_value= Yes +--source include/check_slave_param.inc +##### + + +##### +# Cleanup +# +connection master; +SET SQL_LOG_BIN=0; +DROP USER rpl@127.0.0.1; +FLUSH PRIVILEGES; +SET SQL_LOG_BIN=1; + +connection slave; +--source include/stop_slave.inc +CHANGE MASTER TO MASTER_USER = 'root', MASTER_PASSWORD = ''; +--source include/start_slave.inc + +connection master; +-- source include/rpl_end.inc +##### diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_slave_status.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_status.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_slave_status.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_slave_status.test 2024-08-03 07:29:58.000000000 +0000 @@ -59,7 +59,6 @@ source include/stop_slave.inc; START SLAVE; source include/wait_for_slave_sql_to_start.inc; -source include/wait_for_slave_io_to_stop.inc; --echo ==== Verify that Slave IO thread stopped with error ==== # 1045 = ER_ACCESS_DENIED_ERROR @@ -68,7 +67,7 @@ --echo ==== Cleanup (Note that slave IO thread is not running) ==== -# cleanup: slave io thread has is stopped so we reset replication +# cleanup: slave io thread is stopped so we reset replication --source include/stop_slave_sql.inc CHANGE MASTER TO MASTER_USER = 'root', MASTER_PASSWORD = ''; # clear Slave_IO_Errno diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_sql_thd_start_errno_cleared.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_sql_thd_start_errno_cleared.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_sql_thd_start_errno_cleared.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_sql_thd_start_errno_cleared.test 2024-08-03 07:29:58.000000000 +0000 @@ -76,6 +76,10 @@ set debug_sync= "now signal sql_thread_continue"; +--echo # Wait for debug_sync signal to have been received before issuing RESET +let $wait_condition= select count(*)=0 from information_schema.processlist where state like "debug sync point%"; +source include/wait_condition.inc; + set @@global.debug_dbug= @saved_dbug; set debug_sync= "RESET"; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_ssl1.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_ssl1.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_ssl1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_ssl1.test 2024-08-03 07:29:58.000000000 +0000 @@ -29,8 +29,10 @@ select * from t1; #showing that replication could work with ssl params -stop slave; ---source include/wait_for_slave_to_stop.inc +--let $slave_io_errno=1045 +--source include/wait_for_slave_io_error.inc +--source include/stop_slave_sql.inc + --replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR eval change master to master_ssl=1 , master_ssl_ca ='$MYSQL_TEST_DIR/std_data/cacert.pem', master_ssl_cert='$MYSQL_TEST_DIR/std_data/client-cert.pem', master_ssl_key='$MYSQL_TEST_DIR/std_data/client-key.pem'; start slave; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_1.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_1.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_1.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,6 +6,7 @@ --source include/master-slave.inc --connection master +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $binlog_alter_two_phase= `select @@binlog_alter_two_phase` set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_2.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_2.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_2.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,9 +8,11 @@ --source include/have_debug.inc --source include/master-slave.inc --connection master +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $binlog_alter_two_phase= `select @@binlog_alter_two_phase` set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; + --connection slave --let $gtid_strict_mode= `select @@gtid_strict_mode` --let $slave_parallel_threads= `select @@slave_parallel_threads` diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_3.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_3.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_3.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_3.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,9 +9,11 @@ --source include/master-slave.inc --source include/have_debug.inc --connection master +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $binlog_alter_two_phase= `select @@binlog_alter_two_phase` set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; + --connection slave --let $gtid_strict_mode= `select @@gtid_strict_mode` --let $slave_parallel_threads= `select @@slave_parallel_threads` diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_4.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_4.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_4.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_4.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,6 +9,7 @@ --source include/master-slave.inc --source include/have_debug.inc --connection master +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $binlog_alter_two_phase= `select @@binlog_alter_two_phase` set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_5.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_5.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_5.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_5.test 2024-08-03 07:29:58.000000000 +0000 @@ -9,6 +9,7 @@ --source include/master-slave.inc --source include/have_debug.inc --connection master +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $binlog_alter_two_phase= `select @@binlog_alter_two_phase` set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_6.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_6.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_6.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_6.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,6 +10,7 @@ --source include/master-slave.inc --source include/have_debug.inc --connection master +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $binlog_alter_two_phase= `select @@binlog_alter_two_phase` set global binlog_alter_two_phase = ON; set binlog_alter_two_phase = ON; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_7.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_7.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_7.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_7.test 2024-08-03 07:29:58.000000000 +0000 @@ -21,6 +21,10 @@ set global binlog_alter_two_phase=true; --connection server_3 +SET STATEMENT sql_log_bin=0 FOR + CALL mtr.add_suppression("The table mysql.gtid_slave_pos was removed. This change will not take full effect until all SQL threads have been restarted"); +SET STATEMENT sql_log_bin=0 FOR + ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $gtid_strict_mode= `select @@gtid_strict_mode` --let $slave_parallel_threads= `select @@slave_parallel_threads` --let $slave_parallel_mode= `select @@slave_parallel_mode` diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_8.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_8.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_8.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_8.test 2024-08-03 07:29:58.000000000 +0000 @@ -21,6 +21,10 @@ set global binlog_alter_two_phase=true; --connection server_3 +SET STATEMENT sql_log_bin=0 FOR + CALL mtr.add_suppression("The table mysql.gtid_slave_pos was removed. This change will not take full effect until all SQL threads have been restarted"); +SET STATEMENT sql_log_bin=0 FOR + ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; --let $gtid_strict_mode= `select @@gtid_strict_mode` --let $slave_parallel_threads= `select @@slave_parallel_threads` --let $slave_parallel_mode= `select @@slave_parallel_mode` diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_chain_basic.test 2024-08-03 07:29:58.000000000 +0000 @@ -39,7 +39,11 @@ --connection server_2 select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; +--connection server_1 +--source include/save_master_gtid.inc --connection server_3 +--source include/sync_with_master_gtid.inc + select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; --source include/stop_slave.inc --eval set global slave_parallel_threads = $slave_parallel_threads; @@ -49,6 +53,7 @@ select @@slave_parallel_threads; --connection server_4 +--source include/sync_with_master_gtid.inc select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; --source include/rpl_end.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_1.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,6 +10,8 @@ set global binlog_alter_two_phase=true; --connection slave --source include/stop_slave.inc +SET STATEMENT sql_log_bin=0 FOR + ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; set global gtid_strict_mode=1; --echo # Legacy Master Slave diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_mysqlbinlog_2.test 2024-08-03 07:29:58.000000000 +0000 @@ -57,6 +57,10 @@ SET GLOBAL binlog_alter_two_phase = ON; --connection server_3 +SET STATEMENT sql_log_bin=0 FOR + CALL mtr.add_suppression("The table mysql.gtid_slave_pos was removed. This change will not take full effect until all SQL threads have been restarted"); +SET STATEMENT sql_log_bin=0 FOR + ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; SET @save_gtid_strict_mode= @@GLOBAL.gtid_strict_mode; SET @slave_parallel_threads= @@GLOBAL.slave_parallel_threads; SET @slave_parallel_mode= @@GLOBAL.slave_parallel_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_start_alter_restart_slave.test 2024-08-03 07:29:58.000000000 +0000 @@ -73,6 +73,10 @@ --connection slave --source include/sync_with_master_gtid.inc +--echo # wait for CA_1 waiting itself +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = 'debug sync point: now'; +--source include/wait_condition.inc + # set debug_sync="now wait_for CA_1_processing"; connect(extra_slave,127.0.0.1,root,,test,$SLAVE_MYPORT); --send stop slave; @@ -90,8 +94,12 @@ select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; --source include/start_slave.inc + --connection master ---sync_slave_with_master +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc --echo # Everything from the master binlog must have been applied now: select domain_id, seq_no from mysql.gtid_slave_pos order by seq_no desc limit 1; --let $slave_gtid_state = `select @@gtid_binlog_state` diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_stop_slave_error.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_stop_slave_error.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_stop_slave_error.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_stop_slave_error.test 2024-08-03 07:29:58.000000000 +0000 @@ -6,11 +6,26 @@ connection master; sync_slave_with_master; + +--let $iter=100 +--echo # MDEV-32892: Repeatedly starting/stopping io_thread.. +--disable_query_log +while ($iter) +{ + stop slave io_thread; + start slave io_thread; + --dec $iter +} +--enable_query_log source include/stop_slave.inc; + let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/slave_log.err; let SEARCH_PATTERN=Error reading packet from server: Lost connection; source include/search_pattern_in_file.inc; +let SEARCH_PATTERN=error code: 2013; +source include/search_pattern_in_file.inc; + source include/start_slave.inc; source include/rpl_end.inc; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_sync.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_sync.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_sync.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_sync.test 2024-08-03 07:29:58.000000000 +0000 @@ -82,7 +82,7 @@ close ($file); EOF ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.2.expect SET SESSION debug_dbug="d,crash_before_rotate_relaylog"; --error 2013 FLUSH LOGS; @@ -130,7 +130,7 @@ close FILE; EOF ---exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.2.expect +--write_line restart $MYSQLTEST_VARDIR/tmp/mysqld.2.expect SET SESSION debug_dbug="d,crash_before_rotate_relaylog"; --error 2013 FLUSH LOGS; diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_error2.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_error2.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2.test 2024-08-03 07:29:58.000000000 +0000 @@ -64,7 +64,14 @@ --connection slave --sync_with_master SELECT * FROM t1 ORDER BY a; ---echo * There will be two rows in t2 due to the retry. +if (!$ignored_db_deadlock) +{ + --echo * There will be two rows in t2 due to the retry. +} +if ($ignored_db_deadlock) +{ + --echo * There will be one row in t2 because the ignored deadlock does not retry. +} SELECT * FROM t2 ORDER BY a; let $new_retry= query_get_value(SHOW STATUS LIKE 'Slave_retried_transactions', Value, 1); --disable_query_log diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all-slave.opt mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all-slave.opt --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all-slave.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all-slave.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--slave-skip-errors=all diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_error2_skip_all.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,3 @@ +--source include/have_binlog_format_row.inc +--let $ignored_db_deadlock= 1 +--source rpl_temporary_error2.test diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_errors.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_errors.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_temporary_errors.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_temporary_errors.test 2024-08-03 07:29:58.000000000 +0000 @@ -71,13 +71,15 @@ set @@global.innodb_lock_wait_timeout=1; set @@global.slave_transaction_retries=100; +--let $rpl_allow_error=1 --source include/restart_slave_sql.inc +--let $rpl_allow_error=0 --let $last_retries= query_get_value(SHOW GLOBAL STATUS LIKE 'Slave_retried_transactions', Value, 1) --let $status_type=GLOBAL --let $status_var=Slave_retried_transactions --let $status_var_value=`SELECT 1 + $last_retries` ---let $$status_var_comparsion= > +--let $status_var_comparsion= > --source include/wait_for_status_var.inc # Release the record after just one retry diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_using_gtid_default.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_using_gtid_default.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_using_gtid_default.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_using_gtid_default.test 2024-08-03 07:29:58.000000000 +0000 @@ -42,10 +42,9 @@ # replication is used by default if master supports it # --source include/have_debug.inc ---source include/master-slave.inc - # Format independent test so just use one --source include/have_binlog_format_mixed.inc +--source include/master-slave.inc --echo # --echo # Slave default configuration should be Slave_Pos @@ -271,7 +270,10 @@ --echo # not master_use_gtid=no should warn the user that Using_Gtid is being --echo # changed to No. --echo # +--connection master +--source include/save_master_pos.inc --connection slave +--source include/sync_io_with_master.inc --let $io_log_pos= query_get_value('SHOW SLAVE STATUS', Read_Master_Log_Pos, 1) --let $io_log_file= query_get_value('SHOW SLAVE STATUS', Master_Log_File, 1) --source include/stop_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_xa_empty_transaction.test mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_xa_empty_transaction.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/rpl_xa_empty_transaction.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/rpl_xa_empty_transaction.test 2024-08-03 07:29:58.000000000 +0000 @@ -32,6 +32,10 @@ # MDEV-25616: Binlog event for XA COMMIT is generated without matching # XA START, replication aborts # +# MDEV-33921: Replication fails when XA transactions are used where the slave +# has replicate_do_db set and the client has touched a different +# database when running DML such as inserts. +# --source include/have_log_bin.inc --let $rpl_server_count= 3 @@ -167,6 +171,133 @@ set @@binlog_format = @sav_binlog_format; set @@global.binlog_format = @sav_binlog_format; + +--echo # +--echo # MDEV-33921.1: If a slave's replication of an XA transaction results in +--echo # an empty transaction, e.g. due to replication filters, the slave +--echo # should not binlog any part of the XA transaction. +# +# Note that the MDEV-33921 report is actually about that XA END is filtered +# out (not executed), and then its corresponding XA PREPARE errors because the +# XA state of the transaction is incorrect. This test case inherently tests +# both bugs. + +--connection server_1 +create database db1; +create database db2; +create table db1.t1 (a int) engine=innodb; +--source include/save_master_gtid.inc +--connection server_3 +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +change master to master_use_gtid=slave_pos; + +--connection server_2 +--source include/stop_slave.inc +SET @@GLOBAL.replicate_ignore_db= ""; +SET @@GLOBAL.replicate_do_db= "db2"; +change master to master_use_gtid=slave_pos; +--source include/start_slave.inc + +--connection server_1 +--let $pre_xa_gtid= `SELECT @@global.gtid_binlog_pos` +use db1; +XA START "x1"; +insert into db1.t1 values (1); +XA END "x1"; +XA PREPARE "x1"; +XA COMMIT "x1"; +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc +--let $slave_binlogged_gtid= `SELECT @@global.gtid_binlog_pos` +if (`SELECT strcmp("$slave_binlogged_gtid","$pre_xa_gtid")`) +{ + --die Slave binlogged an empty XA transaction yet should not have +} + +--connection server_2 +--source include/save_master_gtid.inc + +--connection server_3 +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + +--echo # +--echo # 33921.2: If the slave shuts down after "preparing" a filtered-to-empty +--echo # XA transaction (and not completing it), then when the respective +--echo # XA completion (COMMIT in this test) command is replicated, the slave +--echo # should not throw ER_XAER_NOTA. Note that internally, the error is +--echo # thrown, but it is ignored because the target db is filtered. + +--connection server_3 +--source include/stop_slave.inc + +--connection server_1 +--let $pre_xa_gtid= `SELECT @@global.gtid_binlog_pos` + +# Used by mysqlbinlog in part 3 +--let $pre_xa_pos = query_get_value(SHOW MASTER STATUS, Position, 1) + +use db1; +XA START "x2"; +insert into db1.t1 values (2); +XA END "x2"; +XA PREPARE "x2"; +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc +--let $rpl_server_number= 2 +--echo # Connection named slave is needed for reconnection +--connect(slave,localhost,root,,) +--connect(slave1,localhost,root,,) +--source include/rpl_restart_server.inc + +--connection server_2 +--source include/stop_slave.inc +SET @@GLOBAL.replicate_do_db= "db2"; +change master to master_use_gtid=slave_pos; +--source include/start_slave.inc + +--connection server_1 +XA COMMIT "x2"; +--source include/save_master_gtid.inc + +--connection server_2 +--source include/sync_with_master_gtid.inc +--source include/save_master_gtid.inc + +--connection server_3 +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + +--echo # +--echo # 33921.3: Ensure XA commands are not considered by mysqlbinlog's +--echo # --database filter +--connection server_1 +--let $datadir= `select @@datadir` +--let $binlog_file= query_get_value(SHOW MASTER STATUS, File, 1) +--let assert_file= $MYSQLTEST_VARDIR/tmp/binlog_decoded.out +--echo # MYSQL_BINLOG datadir/binlog_file --start-position=pre_xa_pos --database=db2 --result-file=assert_file +--exec $MYSQL_BINLOG $datadir/$binlog_file --start-position=$pre_xa_pos --database=db2 --result-file=$assert_file + +--let assert_text= Mysqlbinlog should output all XA commands from the filtered transaction +--let assert_count= 4 +--let assert_select= XA START|XA END|XA PREPARE|XA COMMIT +--source include/assert_grep.inc + +--connection server_2 +--source include/stop_slave.inc +SET @@GLOBAL.replicate_do_db=""; +--source include/start_slave.inc + +--connection server_1 +drop database db1; +drop database db2; + + # # Cleanup --connection server_1 diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/semisync_future-7591.test mariadb-10.11.9/mysql-test/suite/rpl/t/semisync_future-7591.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/semisync_future-7591.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/semisync_future-7591.test 2024-08-03 07:29:58.000000000 +0000 @@ -19,7 +19,7 @@ reset master; --connection slave ---source include/stop_slave.inc +--source include/stop_slave_sql.inc --let $master_use_gtid_option= No --source include/reset_slave.inc --source include/start_slave.inc diff -Nru mariadb-10.11.6/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test mariadb-10.11.9/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test --- mariadb-10.11.6/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/rpl/t/show_status_stop_slave_race-7126.test 2024-08-03 07:29:58.000000000 +0000 @@ -3,7 +3,10 @@ # --source include/master-slave.inc +--disable_query_log call mtr.add_suppression("Master is configured to log replication events"); +call mtr.add_suppression("Could not read packet:.* errno: 11"); +--enable_query_log --connection slave @@ -15,6 +18,9 @@ # All done. --connection slave +# The parallel START SLAVE can leave an error condition if the last START was +# aborted by the master due to conflicting server_id from multiple connections. +--let $rpl_allow_error= 1 --source include/wait_for_slave_to_stop.inc start slave; diff -Nru mariadb-10.11.6/mysql-test/suite/s3/amazon.result mariadb-10.11.9/mysql-test/suite/s3/amazon.result --- mariadb-10.11.6/mysql-test/suite/s3/amazon.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/s3/amazon.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,4 +4,14 @@ insert into t1 values (1,1),(2,2),(3,3),(4,4); alter table t1 engine=S3; drop table t1; +set @@global.s3_protocol_version="Amazon"; +create table t1 (pk int primary key, a int); +insert into t1 values (1,1),(2,2),(3,3),(4,4); +alter table t1 engine=S3; +drop table t1; +set @@global.s3_protocol_version="Domain"; +create table t1 (pk int primary key, a int); +insert into t1 values (1,1),(2,2),(3,3),(4,4); +alter table t1 engine=S3; +drop table t1; set @@global.s3_protocol_version=@save_s3_protocol_version; diff -Nru mariadb-10.11.6/mysql-test/suite/s3/amazon.test mariadb-10.11.9/mysql-test/suite/s3/amazon.test --- mariadb-10.11.6/mysql-test/suite/s3/amazon.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/s3/amazon.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ --source include/have_s3.inc -if (`SELECT @@s3_host_name <> "s3.amazonaws.com"`) +if (`SELECT @@s3_host_name NOT LIKE "%.amazonaws.com"`) { skip Not connected to AWS; } @@ -16,6 +16,22 @@ create table t1 (pk int primary key, a int); insert into t1 values (1,1),(2,2),(3,3),(4,4); +--replace_result $database database +alter table t1 engine=S3; +drop table t1; + +set @@global.s3_protocol_version="Amazon"; + +create table t1 (pk int primary key, a int); +insert into t1 values (1,1),(2,2),(3,3),(4,4); +--replace_result $database database +alter table t1 engine=S3; +drop table t1; + +set @@global.s3_protocol_version="Domain"; + +create table t1 (pk int primary key, a int); +insert into t1 values (1,1),(2,2),(3,3),(4,4); --replace_result $database database alter table t1 engine=S3; drop table t1; diff -Nru mariadb-10.11.6/mysql-test/suite/s3/debug.result mariadb-10.11.9/mysql-test/suite/s3/debug.result --- mariadb-10.11.6/mysql-test/suite/s3/debug.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/s3/debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,32 @@ +drop table if exists t1; +# +# MDEV-32884 Make s3_debug dynamic +# +create or replace table t1 (a int, b int, c varchar(1000), key (a), key(c)) engine=aria; +insert into t1 select seq, seq+10, repeat(char(65+ mod(seq, 20)),mod(seq,1000)) from seq_1_to_100; +alter table t1 engine=s3; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL, + `b` int(11) DEFAULT NULL, + `c` varchar(1000) DEFAULT NULL, + KEY `a` (`a`), + KEY `c` (`c`) +) ENGINE=S3 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +select count(*) from t1; +count(*) +100 +flush table t1; +NOT FOUND /s3_test_/ in mysqld.1.err +set @@global.s3_debug=1; +select count(*) from t1; +count(*) +100 +set @@global.s3_debug=0; +FOUND 6 /s3_test_/ in mysqld.1.err +select count(*) from t1; +count(*) +100 +drop table t1; +FOUND 6 /s3_test_/ in mysqld.1.err diff -Nru mariadb-10.11.6/mysql-test/suite/s3/debug.test mariadb-10.11.9/mysql-test/suite/s3/debug.test --- mariadb-10.11.6/mysql-test/suite/s3/debug.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/s3/debug.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,34 @@ +--source include/have_s3.inc +--source include/have_sequence.inc + +# +# Create unique database for running the tests +# +--source create_database.inc +--disable_warnings +drop table if exists t1; +--enable_warnings + +--echo # +--echo # MDEV-32884 Make s3_debug dynamic +--echo # + +create or replace table t1 (a int, b int, c varchar(1000), key (a), key(c)) engine=aria; +insert into t1 select seq, seq+10, repeat(char(65+ mod(seq, 20)),mod(seq,1000)) from seq_1_to_100; +alter table t1 engine=s3; +show create table t1; +select count(*) from t1; +flush table t1; + +--let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err +--let SEARCH_PATTERN=s3_test_ +--source include/search_pattern_in_file.inc +set @@global.s3_debug=1; +select count(*) from t1; +set @@global.s3_debug=0; +--source include/search_pattern_in_file.inc +select count(*) from t1; +drop table t1; +--source include/search_pattern_in_file.inc + +--source drop_database.inc diff -Nru mariadb-10.11.6/mysql-test/suite/s3/mysqldump.result mariadb-10.11.9/mysql-test/suite/s3/mysqldump.result --- mariadb-10.11.6/mysql-test/suite/s3/mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/s3/mysqldump.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,6 +4,7 @@ ##### # mysqldump with --copy-s3-tables=0 (by default) ### +/*M!999999\- enable the sandbox mode */ ##### # mysqldump with --copy-s3-tables=0 (by default) XML ### @@ -15,6 +16,7 @@ ##### # mysqldump with --copy-s3-tables=1 ### +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( diff -Nru mariadb-10.11.6/mysql-test/suite/s3/partition.result mariadb-10.11.9/mysql-test/suite/s3/partition.result --- mariadb-10.11.6/mysql-test/suite/s3/partition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/s3/partition.result 2024-08-03 07:29:58.000000000 +0000 @@ -55,8 +55,6 @@ ALTER TABLE t2 ANALYZE PARTITION p3; Table Op Msg_type Msg_text s3.t2 analyze status Table 's3.t2' is read only -s3.t2 analyze status Engine-independent statistics collected -s3.t2 analyze status OK SELECT count(*) FROM t2; count(*) 6 diff -Nru mariadb-10.11.6/mysql-test/suite/sql_sequence/alter.result mariadb-10.11.9/mysql-test/suite/sql_sequence/alter.result --- mariadb-10.11.6/mysql-test/suite/sql_sequence/alter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sql_sequence/alter.result 2024-08-03 07:29:58.000000000 +0000 @@ -210,8 +210,12 @@ alter sequence t1 minvalue=100; ERROR 42S02: 'test.t1' is not a SEQUENCE drop table t1; +# +# MDEV-32795: ALTER SEQUENCE IF NOT EXISTS non_existing_seq Errors rather than note +# alter sequence if exists t1 minvalue=100; -ERROR 42S02: Unknown SEQUENCE: 't1' +Warnings: +Note 4091 Unknown SEQUENCE: 'test.t1' alter sequence t1 minvalue=100; ERROR 42S02: Unknown SEQUENCE: 't1' create sequence t1; @@ -249,6 +253,55 @@ 1 DROP SEQUENCE s; # +# MDEV-33169 Alter sequence 2nd ps fails while alter sequence 2nd time (no ps) succeeds +# +create sequence s; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=MyISAM +alter sequence s maxvalue 123; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 123 increment by 1 cache 1000 nocycle ENGINE=MyISAM +alter sequence s maxvalue 123; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 123 increment by 1 cache 1000 nocycle ENGINE=MyISAM +drop sequence s; +create sequence s; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=MyISAM +prepare stmt from 'alter sequence s maxvalue 123'; +execute stmt; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 123 increment by 1 cache 1000 nocycle ENGINE=MyISAM +execute stmt; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 123 increment by 1 cache 1000 nocycle ENGINE=MyISAM +deallocate prepare stmt; +drop sequence s; +create sequence s; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=MyISAM +create procedure p() alter sequence s maxvalue 123; +call p; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 123 increment by 1 cache 1000 nocycle ENGINE=MyISAM +call p; +show create sequence s; +Table Create Table +s CREATE SEQUENCE `s` start with 1 minvalue 1 maxvalue 123 increment by 1 cache 1000 nocycle ENGINE=MyISAM +drop procedure p; +drop sequence s; +# +# End of 10.4 tests +# +# # MDEV-31607 ER_DUP_KEY in mysql.table_stats upon REANME on sequence # CREATE SEQUENCE s1 ENGINE=InnoDB; @@ -262,3 +315,6 @@ DROP SEQUENCE s2; RENAME TABLE s1 TO s2; DROP SEQUENCE s2; +# +# End of 10.6 tests +# diff -Nru mariadb-10.11.6/mysql-test/suite/sql_sequence/alter.test mariadb-10.11.9/mysql-test/suite/sql_sequence/alter.test --- mariadb-10.11.6/mysql-test/suite/sql_sequence/alter.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sql_sequence/alter.test 2024-08-03 07:29:58.000000000 +0000 @@ -120,8 +120,12 @@ alter sequence t1 minvalue=100; drop table t1; ---error ER_UNKNOWN_SEQUENCES +--echo # +--echo # MDEV-32795: ALTER SEQUENCE IF NOT EXISTS non_existing_seq Errors rather than note +--echo # + alter sequence if exists t1 minvalue=100; + --error ER_UNKNOWN_SEQUENCES alter sequence t1 minvalue=100; @@ -164,6 +168,41 @@ DROP SEQUENCE s; --echo # +--echo # MDEV-33169 Alter sequence 2nd ps fails while alter sequence 2nd time (no ps) succeeds +--echo # +create sequence s; +show create sequence s; +alter sequence s maxvalue 123; +show create sequence s; +alter sequence s maxvalue 123; +show create sequence s; +drop sequence s; + +create sequence s; +show create sequence s; +prepare stmt from 'alter sequence s maxvalue 123'; +execute stmt; +show create sequence s; +execute stmt; +show create sequence s; +deallocate prepare stmt; +drop sequence s; + +create sequence s; +show create sequence s; +create procedure p() alter sequence s maxvalue 123; +call p; +show create sequence s; +call p; +show create sequence s; +drop procedure p; +drop sequence s; + +--echo # +--echo # End of 10.4 tests +--echo # + +--echo # --echo # MDEV-31607 ER_DUP_KEY in mysql.table_stats upon REANME on sequence --echo # @@ -176,3 +215,7 @@ DROP SEQUENCE s2; --enable_ps2_protocol + +--echo # +--echo # End of 10.6 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/suite/sql_sequence/mysqldump.result mariadb-10.11.9/mysql-test/suite/sql_sequence/mysqldump.result --- mariadb-10.11.6/mysql-test/suite/sql_sequence/mysqldump.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sql_sequence/mysqldump.result 2024-08-03 07:29:58.000000000 +0000 @@ -3,10 +3,11 @@ insert into t1 values (1),(2); CREATE SEQUENCE x1 engine=innodb; # dump whole database +/*M!999999\- enable the sandbox mode */ CREATE SEQUENCE `a1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=Aria; -SELECT SETVAL(`a1`, 1, 0); +DO SETVAL(`a1`, 1, 0); CREATE SEQUENCE `x1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; -SELECT SETVAL(`x1`, 1, 0); +DO SETVAL(`x1`, 1, 0); /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -18,10 +19,11 @@ (1), (2); # dump by tables order 1 +/*M!999999\- enable the sandbox mode */ CREATE SEQUENCE `a1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=Aria; -SELECT SETVAL(`a1`, 1, 0); +DO SETVAL(`a1`, 1, 0); CREATE SEQUENCE `x1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; -SELECT SETVAL(`x1`, 1, 0); +DO SETVAL(`x1`, 1, 0); /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -33,10 +35,11 @@ (1), (2); # dump by tables order 2 +/*M!999999\- enable the sandbox mode */ CREATE SEQUENCE `a1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=Aria; -SELECT SETVAL(`a1`, 1, 0); +DO SETVAL(`a1`, 1, 0); CREATE SEQUENCE `x1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; -SELECT SETVAL(`x1`, 1, 0); +DO SETVAL(`x1`, 1, 0); /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -48,6 +51,7 @@ (1), (2); # dump by tables only tables +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -59,10 +63,11 @@ (1), (2); # dump by tables only sequences +/*M!999999\- enable the sandbox mode */ CREATE SEQUENCE `a1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=Aria; -SELECT SETVAL(`a1`, 1, 0); +DO SETVAL(`a1`, 1, 0); CREATE SEQUENCE `x1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB; -SELECT SETVAL(`x1`, 1, 0); +DO SETVAL(`x1`, 1, 0); # end of dumps DROP TABLE a1,t1,x1; set default_storage_engine=InnoDB; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/debug_basic.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/debug_basic.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/debug_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/debug_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,4 @@ set session debug="L"; -Warnings: -Warning 1287 '@@debug' is deprecated and will be removed in a future release. Please use '@@debug_dbug' instead select @@global.debug="1"; @@global.debug="1" 0 diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/debug_dbug_utf16le.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,31 @@ +# +# Start of 10.5 tests +# +# +# MDEV-28366 GLOBAL debug_dbug setting affected by collation_connection=utf16... +# +SET NAMES utf8; +SET collation_connection=utf16le_general_ci; +SET debug_dbug='d,any_random_string'; +SELECT @@debug_dbug; +@@debug_dbug +d,any_random_string +SET debug_dbug=CONCAT('d,', _latin1 0xDF); +SELECT @@debug_dbug; +@@debug_dbug +d,ß +SELECT HEX(@@debug_dbug); +HEX(@@debug_dbug) +642CC39F +SET @@debug_dbug=NULL; +SELECT @@debug_dbug; +@@debug_dbug + +SET @@debug_dbug=DEFAULT; +SELECT @@debug_dbug; +@@debug_dbug + +SET NAMES latin1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/innodb_fil_make_page_dirty_debug_basic.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/innodb_fil_make_page_dirty_debug_basic.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/innodb_fil_make_page_dirty_debug_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/innodb_fil_make_page_dirty_debug_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -22,7 +22,4 @@ set global innodb_saved_page_number_debug = 0; set global innodb_fil_make_page_dirty_debug = @space_id; drop table t1; -# Must always be 0. -SELECT @@global.innodb_fil_make_page_dirty_debug; -@@global.innodb_fil_make_page_dirty_debug -0 +set global innodb_fil_make_page_dirty_debug = 0; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/innodb_saved_page_number_debug_basic.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/innodb_saved_page_number_debug_basic.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/innodb_saved_page_number_debug_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/innodb_saved_page_number_debug_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -23,6 +23,7 @@ set global innodb_fil_make_page_dirty_debug = @space_id; drop table t1; set global innodb_saved_page_number_debug = 0; +set global innodb_fil_make_page_dirty_debug = 0; SELECT @@global.innodb_saved_page_number_debug; @@global.innodb_saved_page_number_debug 0 diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/old_mode_basic.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/old_mode_basic.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/old_mode_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/old_mode_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -114,8 +114,8 @@ SELECT @@global.old_mode; @@global.old_mode ZERO_DATE_TIME_CAST -SET @@global.old_mode = 64; -ERROR 42000: Variable 'old_mode' can't be set to the value of '64' +SET @@global.old_mode = 128; +ERROR 42000: Variable 'old_mode' can't be set to the value of '128' SELECT @@global.old_mode; @@global.old_mode ZERO_DATE_TIME_CAST diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/old_passwords_func.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/old_passwords_func.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/old_passwords_func.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/old_passwords_func.result 2024-08-03 07:29:58.000000000 +0000 @@ -9,6 +9,8 @@ SET SESSION old_passwords = TRUE; CREATE USER 'userOldPass'@'localhost' IDENTIFIED BY 'pass3'; SET GLOBAL secure_auth = FALSE; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release connect con1,localhost,userNewPass1,pass1,; SELECT CURRENT_USER(); CURRENT_USER() @@ -30,6 +32,8 @@ disconnect con3; '#------------------------FN_DYNVARS_115_02---------------------------#' SET GLOBAL secure_auth = TRUE; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release connect con1,localhost,userNewPass1,pass1,; SELECT CURRENT_USER(); CURRENT_USER() @@ -55,3 +59,5 @@ SET @@GLOBAL.old_passwords = @global_old_passwords; SET @@SESSION.old_passwords = @session_old_passwords; SET @@GLOBAL.secure_auth = @global_secure_auth; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/pseudo_slave_mode_notembedded.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/pseudo_slave_mode_notembedded.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/pseudo_slave_mode_notembedded.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/pseudo_slave_mode_notembedded.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,14 @@ +'### MDEV-32844: THD::rli_fake/rgi_fake not cleared on new connection' +connect con1,localhost,root,,; +BINLOG ' +6ENbZQ8BAAAA/AAAAAABAAAAAAQAMTAuMTEuNi1NYXJpYURCLWRlYnVnLWxvZwAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAADoQ1tlEzgNAAgAEgAEBAQEEgAA5AAEGggAAAAICAgCAAAACgoKAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAEEwQADQgICAoKCgGbvv33 +'; +disconnect con1; +connect con1,localhost,root,,; +SET SESSION pseudo_slave_mode= 1; +disconnect con1; +connection default; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/replicate_rewrite_db.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/replicate_rewrite_db.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/replicate_rewrite_db.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/replicate_rewrite_db.result 2024-08-03 07:29:58.000000000 +0000 @@ -85,15 +85,13 @@ VARIABLE_NAME VARIABLE_VALUE REPLICATE_REWRITE_DB db1->db2,db3->db4 # Check restart with appending the value -# restart: --replicate_rewrite_db=X->Y +# restart: --replicate_rewrite_db='X->Y' SELECT @@GLOBAL.replicate_rewrite_db; @@GLOBAL.replicate_rewrite_db -test->rewrite,mysqltest1->test,a->b,X->Y +test->rewrite,mysqltest1->test,a->b,'X->Y' # Check restart with wrong value on CLI [ERROR] Bad syntax in replicate-rewrite-db.Expected syntax is FROM->TO. -# restart: +# restart SELECT @@GLOBAL.replicate_rewrite_db; @@GLOBAL.replicate_rewrite_db test->rewrite,mysqltest1->test,a->b -# Cleanup. -SET @@GLOBAL.replicate_rewrite_db = @save_replicate_rewrite_db; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/secure_auth_basic.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_basic.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/secure_auth_basic.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_basic.result 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,11 @@ 1 '#--------------------FN_DYNVARS_143_01------------------------#' SET @@global.secure_auth = 1; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SET @@global.secure_auth = DEFAULT; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 1 @@ -17,15 +21,21 @@ SELECT global.secure_auth; ERROR 42S02: Unknown table 'global' in field list SET global secure_auth = 1; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 1 '#--------------------FN_DYNVARS_143_03------------------------#' SET @@global.secure_auth = 0; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 0 SET @@global.secure_auth = 1; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 1 @@ -83,23 +93,33 @@ ON '#---------------------FN_DYNVARS_143_08-------------------------#' SET @@global.secure_auth = OFF; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 0 SET @@global.secure_auth = ON; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 1 '#---------------------FN_DYNVARS_143_09----------------------#' SET @@global.secure_auth = TRUE; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 1 SET @@global.secure_auth = FALSE; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 0 SET @@global.secure_auth = @global_start_value; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SELECT @@global.secure_auth; @@global.secure_auth 1 diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/secure_auth_func.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_func.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/secure_auth_func.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_func.result 2024-08-03 07:29:58.000000000 +0000 @@ -8,6 +8,8 @@ 1 / ON Expected '#--------------------FN_DYNVARS_144_02-------------------------#' SET GLOBAL secure_auth = OFF; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release CREATE USER 'testUser'@'localhost' IDENTIFIED BY 'newpass'; connect con_user1,localhost,testUser,newpass,; connection default; @@ -16,6 +18,8 @@ connection default; '#--------------------FN_DYNVARS_144_03-------------------------#' SET GLOBAL secure_auth = ON; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SET PASSWORD FOR 'testUser'@'localhost' = PASSWORD('newpass'); connect con_user3,localhost,testUser,newpass,; connection default; @@ -27,6 +31,8 @@ connect con_user4,localhost,testUser,newpass,; connection default; SET GLOBAL secure_auth = @old_secure_auth; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release disconnect con_user1; disconnect con_user2; disconnect con_user3; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/secure_auth_grant.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_grant.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/secure_auth_grant.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/secure_auth_grant.result 2024-08-03 07:29:58.000000000 +0000 @@ -23,6 +23,8 @@ connect user1,localhost,user1,,; connection user1; SET GLOBAL secure_auth=1; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SET secure_auth=1; ERROR HY000: Variable 'secure_auth' is a GLOBAL variable and should be set with SET GLOBAL SET SESSION secure_auth=1; @@ -36,6 +38,8 @@ connect user1,localhost,user1,,; connection user1; SET GLOBAL secure_auth=1; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release SET secure_auth=1; ERROR HY000: Variable 'secure_auth' is a GLOBAL variable and should be set with SET GLOBAL SET SESSION secure_auth=1; @@ -44,3 +48,5 @@ connection default; DROP USER user1@localhost; SET @@global.secure_auth=@global; +Warnings: +Warning 1287 '@@secure_auth' is deprecated and will be removed in a future release diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/slave_transaction_retry_errors.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/slave_transaction_retry_errors.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/slave_transaction_retry_errors.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/slave_transaction_retry_errors.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,20 +1,20 @@ select @@global.slave_transaction_retry_errors; @@global.slave_transaction_retry_errors -1158,1159,1160,1161,1205,1213,1429,2013,12701,10,20,5000,400 +1158,1159,1160,1161,1205,1213,1020,1429,2013,12701,10,20,5000,400 select @@session.slave_transaction_retry_errors; ERROR HY000: Variable 'slave_transaction_retry_errors' is a GLOBAL variable show global variables like 'slave_transaction_retry_errors'; Variable_name Value -slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1429,2013,12701,10,20,5000,400 +slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701,10,20,5000,400 show session variables like 'slave_transaction_retry_errors'; Variable_name Value -slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1429,2013,12701,10,20,5000,400 +slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701,10,20,5000,400 select * from information_schema.global_variables where variable_name='slave_transaction_retry_errors'; VARIABLE_NAME VARIABLE_VALUE -SLAVE_TRANSACTION_RETRY_ERRORS 1158,1159,1160,1161,1205,1213,1429,2013,12701,10,20,5000,400 +SLAVE_TRANSACTION_RETRY_ERRORS 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701,10,20,5000,400 select * from information_schema.session_variables where variable_name='slave_transaction_retry_errors'; VARIABLE_NAME VARIABLE_VALUE -SLAVE_TRANSACTION_RETRY_ERRORS 1158,1159,1160,1161,1205,1213,1429,2013,12701,10,20,5000,400 +SLAVE_TRANSACTION_RETRY_ERRORS 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701,10,20,5000,400 set global slave_transaction_retry_errors=1; ERROR HY000: Variable 'slave_transaction_retry_errors' is a read only variable set session slave_transaction_retry_errors=1; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_debug.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_debug.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_debug.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_debug.result 2024-08-03 07:29:58.000000000 +0000 @@ -38,7 +38,7 @@ DEFAULT_VALUE VARIABLE_SCOPE SESSION VARIABLE_TYPE VARCHAR -VARIABLE_COMMENT Built-in DBUG debugger +VARIABLE_COMMENT Built-in DBUG debugger. Alias for --debug NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,6 @@ -@@ -49,7 +49,7 @@ +--- sysvars_innodb.result ++++ sysvars_innodb.result,32bit +@@ -47,7 +47,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 8 VARIABLE_SCOPE GLOBAL @@ -7,7 +9,7 @@ VARIABLE_COMMENT Number of InnoDB Adaptive Hash Index Partitions (default 8) NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -73,7 +73,7 @@ +@@ -71,7 +71,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -16,7 +18,7 @@ VARIABLE_COMMENT The AUTOINC lock modes supported by InnoDB: 0 => Old style AUTOINC locking (for backward compatibility); 1 => New style AUTOINC locking; 2 => No AUTOINC locking (unsafe for SBR) NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -85,10 +85,10 @@ +@@ -83,10 +83,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -29,7 +31,7 @@ NUMERIC_BLOCK_SIZE 1048576 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -121,7 +121,7 @@ +@@ -119,7 +119,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 25 VARIABLE_SCOPE GLOBAL @@ -38,7 +40,7 @@ VARIABLE_COMMENT Dump only the hottest N% of each buffer pool, defaults to 25 NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 100 -@@ -205,7 +205,7 @@ +@@ -203,7 +203,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -47,7 +49,7 @@ VARIABLE_COMMENT A number between [0, 100] that tells how oftern buffer pool dump status in percentages should be printed. E.g. 10 means that buffer pool dump status is printed when every 10% of number of buffer pool pages are dumped. Default is 0 (only start and end status is printed). NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -325,7 +325,7 @@ +@@ -323,7 +323,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 5 VARIABLE_SCOPE GLOBAL @@ -56,7 +58,7 @@ VARIABLE_COMMENT If the compression failure rate of a table is greater than this number more padding is added to the pages to reduce the failures. A value of zero implies no padding NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -349,7 +349,7 @@ +@@ -347,7 +347,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -65,7 +67,7 @@ VARIABLE_COMMENT Percentage of empty space on a data page that can be reserved to make the page compressible. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 75 -@@ -625,7 +625,7 @@ +@@ -623,7 +623,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 600 VARIABLE_SCOPE GLOBAL @@ -74,7 +76,7 @@ VARIABLE_COMMENT Maximum number of seconds that semaphore times out in InnoDB. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -673,7 +673,7 @@ +@@ -671,7 +671,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL @@ -83,7 +85,7 @@ VARIABLE_COMMENT Number of iterations over which the background flushing is averaged. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1000 -@@ -697,7 +697,7 @@ +@@ -695,7 +695,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -92,7 +94,7 @@ VARIABLE_COMMENT Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant). 1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3 -@@ -721,7 +721,7 @@ +@@ -719,7 +719,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -101,7 +103,7 @@ VARIABLE_COMMENT Set to 0 (don't flush neighbors from buffer pool), 1 (flush contiguous neighbors from buffer pool) or 2 (flush neighbors from buffer pool), when flushing a block NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -757,7 +757,7 @@ +@@ -755,7 +755,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -110,7 +112,7 @@ VARIABLE_COMMENT Helps to save your data in case the disk image of the database becomes corrupt. Value 5 can return bogus data, and 6 can permanently corrupt data. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 6 -@@ -781,10 +781,10 @@ +@@ -779,10 +779,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 8000000 VARIABLE_SCOPE GLOBAL @@ -123,7 +125,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -817,7 +817,7 @@ +@@ -815,7 +815,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 84 VARIABLE_SCOPE GLOBAL @@ -132,7 +134,7 @@ VARIABLE_COMMENT InnoDB Fulltext search maximum token size in characters NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -829,7 +829,7 @@ +@@ -827,7 +827,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 3 VARIABLE_SCOPE GLOBAL @@ -141,7 +143,7 @@ VARIABLE_COMMENT InnoDB Fulltext search minimum token size in characters NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16 -@@ -841,7 +841,7 @@ +@@ -839,7 +839,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL @@ -150,7 +152,7 @@ VARIABLE_COMMENT InnoDB Fulltext search number of words to optimize for each optimize table call NUMERIC_MIN_VALUE 1000 NUMERIC_MAX_VALUE 10000 -@@ -853,10 +853,10 @@ +@@ -851,10 +851,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 2000000000 VARIABLE_SCOPE GLOBAL @@ -163,7 +165,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -877,7 +877,7 @@ +@@ -875,7 +875,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -172,7 +174,7 @@ VARIABLE_COMMENT InnoDB Fulltext search parallel sort degree, will round up to nearest power of 2 number NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 16 -@@ -889,10 +889,10 @@ +@@ -887,10 +887,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 640000000 VARIABLE_SCOPE GLOBAL @@ -185,7 +187,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -937,22 +937,22 @@ +@@ -935,22 +935,22 @@ SESSION_VALUE NULL DEFAULT_VALUE 200 VARIABLE_SCOPE GLOBAL @@ -213,20 +215,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -985,10 +985,10 @@ - SESSION_VALUE NULL - DEFAULT_VALUE 16777216 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Redo log buffer size in bytes. - NUMERIC_MIN_VALUE 2097152 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 4096 - ENUM_VALUE_LIST NULL - READ_ONLY YES -@@ -1033,10 +1033,10 @@ +@@ -1043,10 +1043,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 32 VARIABLE_SCOPE GLOBAL @@ -239,7 +228,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1045,10 +1045,10 @@ +@@ -1055,10 +1055,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 1536 VARIABLE_SCOPE GLOBAL @@ -252,7 +241,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1081,10 +1081,10 @@ +@@ -1091,10 +1091,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -265,7 +254,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1093,7 +1093,7 @@ +@@ -1103,7 +1103,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -274,7 +263,7 @@ VARIABLE_COMMENT Maximum delay of user threads in micro-seconds NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 10000000 -@@ -1225,10 +1225,10 @@ +@@ -1235,10 +1235,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -287,7 +276,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY YES -@@ -1249,7 +1249,7 @@ +@@ -1259,7 +1259,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 16384 VARIABLE_SCOPE GLOBAL @@ -296,7 +285,7 @@ VARIABLE_COMMENT Page size to use for all InnoDB tablespaces. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 65536 -@@ -1285,7 +1285,7 @@ +@@ -1295,7 +1295,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1000 VARIABLE_SCOPE GLOBAL @@ -305,7 +294,7 @@ VARIABLE_COMMENT Number of UNDO log pages to purge in one batch from the history list. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5000 -@@ -1297,7 +1297,7 @@ +@@ -1307,7 +1307,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -314,7 +303,7 @@ VARIABLE_COMMENT Deprecated parameter with no effect NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -1333,7 +1333,7 @@ +@@ -1343,7 +1343,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 56 VARIABLE_SCOPE GLOBAL @@ -323,7 +312,7 @@ VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 64 -@@ -1405,7 +1405,7 @@ +@@ -1427,7 +1427,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -332,7 +321,7 @@ VARIABLE_COMMENT Memory buffer size for index creation NUMERIC_MIN_VALUE 65536 NUMERIC_MAX_VALUE 67108864 -@@ -1573,10 +1573,10 @@ +@@ -1595,10 +1595,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_innodb.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_innodb.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -55,6 +55,18 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_ALTER_COPY_BULK +SESSION_VALUE NULL +DEFAULT_VALUE ON +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Allow bulk insert operation for copy alter operation +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT NONE VARIABLE_NAME INNODB_AUTOEXTEND_INCREMENT SESSION_VALUE NULL DEFAULT_VALUE 64 @@ -983,10 +995,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 16777216 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Redo log buffer size in bytes. NUMERIC_MIN_VALUE 2097152 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 2147479552 NUMERIC_BLOCK_SIZE 4096 ENUM_VALUE_LIST NULL READ_ONLY YES @@ -1027,6 +1039,30 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME INNODB_LOG_SPIN_WAIT_DELAY +SESSION_VALUE NULL +DEFAULT_VALUE 0 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Delay between log buffer spin lock polls (0 to use a blocking latch) +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 6000 +NUMERIC_BLOCK_SIZE 0 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_LOG_WRITE_AHEAD_SIZE +SESSION_VALUE NULL +DEFAULT_VALUE 512 +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Redo log write size to avoid read-on-write; must be a power of two +NUMERIC_MIN_VALUE 512 +NUMERIC_MAX_VALUE 4096 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_LRU_FLUSH_SIZE SESSION_VALUE NULL DEFAULT_VALUE 32 @@ -1399,6 +1435,18 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME INNODB_SNAPSHOT_ISOLATION +SESSION_VALUE OFF +DEFAULT_VALUE OFF +VARIABLE_SCOPE SESSION +VARIABLE_TYPE BOOLEAN +VARIABLE_COMMENT Use snapshot isolation (write-write conflict detection). +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST OFF,ON +READ_ONLY NO +COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_SORT_BUFFER_SIZE SESSION_VALUE NULL DEFAULT_VALUE 1048576 diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +--- sysvars_server_embedded.result 2024-01-24 07:43:25.510260081 +0100 ++++ sysvars_server_embedded,32bit.result 2024-01-28 18:07:02.851488186 +0100 @@ -44,7 +44,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_BLOCK_SIZE @@ -429,7 +431,7 @@ VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity + VARIABLE_COMMENT Log some non critical warnings to the error log.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 @@ -1834,7 +1834,7 @@ @@ -722,6 +724,15 @@ NUMERIC_MAX_VALUE 4294967295 @@ -2324,7 +2324,7 @@ COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT 0 = No changes. 1 = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. 2 = Remove 'max_seek optimization' for secondary keys and slight adjustment of filter cost. This option will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 2 +@@ -2334,7 +2334,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_EXTRA_PRUNING_DEPTH VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED @@ -729,7 +740,7 @@ VARIABLE_COMMENT If the optimizer needs to enumerate join prefix of this size or larger, then it will try aggressively prune away the search space. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2334,7 +2334,7 @@ +@@ -2344,7 +2344,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARGS VARIABLE_SCOPE SESSION @@ -738,7 +749,7 @@ VARIABLE_COMMENT The maximum number of SEL_ARG objects created when optimizing a range. If more objects would be needed, the range will not be used by the optimizer. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2344,7 +2344,7 @@ +@@ -2354,7 +2354,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARG_WEIGHT VARIABLE_SCOPE SESSION @@ -747,7 +758,7 @@ VARIABLE_COMMENT The maximum weight of the SEL_ARG graph. Set to 0 for no limit NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2354,7 +2354,7 @@ +@@ -2364,7 +2364,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_PRUNE_LEVEL VARIABLE_SCOPE SESSION @@ -756,7 +767,7 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search: 1 - prune plans based on cost and number of retrieved rows eq_ref: 2 - prune also if we find an eq_ref chain NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -2364,7 +2364,7 @@ +@@ -2374,7 +2374,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH VARIABLE_SCOPE SESSION @@ -765,7 +776,7 @@ VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2374,7 +2374,7 @@ +@@ -2384,7 +2384,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT VARIABLE_SCOPE SESSION @@ -774,7 +785,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2404,17 +2404,17 @@ +@@ -2414,17 +2414,17 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE VARIABLE_SCOPE SESSION @@ -795,7 +806,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2434,7 +2434,7 @@ +@@ -2444,7 +2444,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE VARIABLE_SCOPE GLOBAL @@ -804,7 +815,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2444,7 +2444,7 @@ +@@ -2454,7 +2454,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE VARIABLE_SCOPE GLOBAL @@ -813,7 +824,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2454,7 +2454,7 @@ +@@ -2464,7 +2464,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -822,7 +833,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2464,7 +2464,7 @@ +@@ -2474,7 +2474,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -831,7 +842,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2474,7 +2474,7 @@ +@@ -2484,7 +2484,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -840,7 +851,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2484,7 +2484,7 @@ +@@ -2494,7 +2494,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -849,7 +860,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2494,7 +2494,7 @@ +@@ -2504,7 +2504,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -858,7 +869,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_TRANSACTIONS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2504,7 +2504,7 @@ +@@ -2514,7 +2514,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -867,7 +878,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_TRANSACTIONS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2514,7 +2514,7 @@ +@@ -2524,7 +2524,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -876,7 +887,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2524,7 +2524,7 @@ +@@ -2534,7 +2534,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -885,7 +896,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2534,7 +2534,7 @@ +@@ -2544,7 +2544,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE VARIABLE_SCOPE GLOBAL @@ -894,7 +905,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2544,7 +2544,7 @@ +@@ -2554,7 +2554,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES VARIABLE_SCOPE GLOBAL @@ -903,7 +914,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2554,7 +2554,7 @@ +@@ -2564,7 +2564,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES VARIABLE_SCOPE GLOBAL @@ -912,7 +923,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2564,7 +2564,7 @@ +@@ -2574,7 +2574,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH VARIABLE_SCOPE GLOBAL @@ -921,7 +932,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2574,7 +2574,7 @@ +@@ -2584,7 +2584,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES VARIABLE_SCOPE GLOBAL @@ -930,7 +941,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2584,7 +2584,7 @@ +@@ -2594,7 +2594,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES VARIABLE_SCOPE GLOBAL @@ -939,7 +950,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2594,7 +2594,7 @@ +@@ -2604,7 +2604,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -948,7 +959,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2604,7 +2604,7 @@ +@@ -2614,7 +2614,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_INDEX_STAT VARIABLE_SCOPE GLOBAL @@ -957,7 +968,7 @@ VARIABLE_COMMENT Maximum number of index statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2614,7 +2614,7 @@ +@@ -2624,7 +2624,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MEMORY_CLASSES VARIABLE_SCOPE GLOBAL @@ -966,7 +977,7 @@ VARIABLE_COMMENT Maximum number of memory pool instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2624,7 +2624,7 @@ +@@ -2634,7 +2634,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_METADATA_LOCKS VARIABLE_SCOPE GLOBAL @@ -975,7 +986,7 @@ VARIABLE_COMMENT Maximum number of metadata locks. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2634,7 +2634,7 @@ +@@ -2644,7 +2644,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES VARIABLE_SCOPE GLOBAL @@ -984,7 +995,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2644,7 +2644,7 @@ +@@ -2654,7 +2654,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES VARIABLE_SCOPE GLOBAL @@ -993,7 +1004,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2654,7 +2654,7 @@ +@@ -2664,7 +2664,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PREPARED_STATEMENTS_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1002,7 +1013,7 @@ VARIABLE_COMMENT Maximum number of instrumented prepared statements. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2664,7 +2664,7 @@ +@@ -2674,7 +2674,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PROGRAM_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1011,7 +1022,7 @@ VARIABLE_COMMENT Maximum number of instrumented programs. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2674,7 +2674,7 @@ +@@ -2684,7 +2684,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES VARIABLE_SCOPE GLOBAL @@ -1020,7 +1031,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2684,7 +2684,7 @@ +@@ -2694,7 +2694,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1029,7 +1040,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2694,7 +2694,7 @@ +@@ -2704,7 +2704,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES VARIABLE_SCOPE GLOBAL @@ -1038,7 +1049,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2704,7 +2704,7 @@ +@@ -2714,7 +2714,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1047,7 +1058,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2714,7 +2714,7 @@ +@@ -2724,7 +2724,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SQL_TEXT_LENGTH VARIABLE_SCOPE GLOBAL @@ -1056,7 +1067,7 @@ VARIABLE_COMMENT Maximum length of displayed sql text. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2724,7 +2724,7 @@ +@@ -2734,7 +2734,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES VARIABLE_SCOPE GLOBAL @@ -1065,7 +1076,7 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2734,7 +2734,7 @@ +@@ -2744,7 +2744,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES VARIABLE_SCOPE GLOBAL @@ -1074,7 +1085,7 @@ VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2744,7 +2744,7 @@ +@@ -2754,7 +2754,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_STACK VARIABLE_SCOPE GLOBAL @@ -1083,7 +1094,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_CURRENT. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 256 -@@ -2754,7 +2754,7 @@ +@@ -2764,7 +2764,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES VARIABLE_SCOPE GLOBAL @@ -1092,7 +1103,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2764,7 +2764,7 @@ +@@ -2774,7 +2774,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1101,7 +1112,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2774,7 +2774,7 @@ +@@ -2784,7 +2784,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_LOCK_STAT VARIABLE_SCOPE GLOBAL @@ -1110,7 +1121,7 @@ VARIABLE_COMMENT Maximum number of lock statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2784,7 +2784,7 @@ +@@ -2794,7 +2794,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES VARIABLE_SCOPE GLOBAL @@ -1119,7 +1130,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2794,7 +2794,7 @@ +@@ -2804,7 +2804,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1128,7 +1139,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2804,7 +2804,7 @@ +@@ -2814,7 +2814,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE VARIABLE_SCOPE GLOBAL @@ -1137,7 +1148,7 @@ VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2814,7 +2814,7 @@ +@@ -2824,7 +2824,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE VARIABLE_SCOPE GLOBAL @@ -1146,7 +1157,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2824,7 +2824,7 @@ +@@ -2834,7 +2834,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE VARIABLE_SCOPE GLOBAL @@ -1155,7 +1166,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2834,7 +2834,7 @@ +@@ -2844,7 +2844,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE VARIABLE_SCOPE GLOBAL @@ -1164,7 +1175,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2884,7 +2884,7 @@ +@@ -2894,7 +2894,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PRELOAD_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1173,7 +1184,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -2904,7 +2904,7 @@ +@@ -2914,7 +2914,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME PROFILING_HISTORY_SIZE VARIABLE_SCOPE SESSION @@ -1182,7 +1193,7 @@ VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -2914,7 +2914,7 @@ +@@ -2924,7 +2924,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PROGRESS_REPORT_TIME VARIABLE_SCOPE SESSION @@ -1191,7 +1202,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2974,7 +2974,7 @@ +@@ -2984,7 +2984,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE VARIABLE_SCOPE SESSION @@ -1200,7 +1211,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -2984,7 +2984,7 @@ +@@ -2994,7 +2994,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_LIMIT VARIABLE_SCOPE GLOBAL @@ -1209,7 +1220,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2994,7 +2994,7 @@ +@@ -3004,7 +3004,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT VARIABLE_SCOPE GLOBAL @@ -1218,7 +1229,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3007,7 +3007,7 @@ +@@ -3017,7 +3017,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1227,7 +1238,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3044,7 +3044,7 @@ +@@ -3054,7 +3054,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME QUERY_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1236,7 +1247,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3057,7 +3057,7 @@ +@@ -3067,7 +3067,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1245,7 +1256,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3067,14 +3067,14 @@ +@@ -3077,14 +3077,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1262,7 +1273,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3084,7 +3084,7 @@ +@@ -3094,7 +3094,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME READ_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1271,7 +1282,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3104,7 +3104,7 @@ +@@ -3114,7 +3114,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME READ_RND_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1280,7 +1291,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3124,10 +3124,10 @@ +@@ -3134,10 +3134,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ROWID_MERGE_BUFF_SIZE VARIABLE_SCOPE SESSION @@ -1293,7 +1304,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3164,7 +3164,7 @@ +@@ -3174,7 +3174,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SERVER_ID VARIABLE_SCOPE SESSION @@ -1302,7 +1313,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -3244,7 +3244,7 @@ +@@ -3254,7 +3254,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET VARIABLE_SCOPE GLOBAL @@ -1311,7 +1322,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3254,7 +3254,7 @@ +@@ -3264,7 +3264,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLOW_LAUNCH_TIME VARIABLE_SCOPE GLOBAL @@ -1320,7 +1331,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -3297,7 +3297,7 @@ +@@ -3307,7 +3307,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1329,7 +1340,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3514,7 +3514,7 @@ +@@ -3524,7 +3524,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME STORED_PROGRAM_CACHE VARIABLE_SCOPE GLOBAL @@ -1338,7 +1349,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -3604,7 +3604,7 @@ +@@ -3614,7 +3614,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME TABLE_DEFINITION_CACHE VARIABLE_SCOPE GLOBAL @@ -1347,7 +1358,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 2097152 -@@ -3614,7 +3614,7 @@ +@@ -3624,7 +3624,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE VARIABLE_SCOPE GLOBAL @@ -1356,7 +1367,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 -@@ -3674,7 +3674,7 @@ +@@ -3684,7 +3684,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME THREAD_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -1365,7 +1376,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -3757,7 +3757,7 @@ +@@ -3767,7 +3767,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 @@ -1374,7 +1385,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3767,7 +3767,7 @@ +@@ -3777,7 +3777,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. NUMERIC_MIN_VALUE 0 @@ -1383,7 +1394,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3777,14 +3777,14 @@ +@@ -3787,14 +3787,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 0 @@ -1400,7 +1411,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -3794,7 +3794,7 @@ +@@ -3804,7 +3804,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TRANSACTION_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1409,7 +1420,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -3934,7 +3934,7 @@ +@@ -3944,7 +3944,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -1418,7 +1429,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -3961,7 +3961,7 @@ +@@ -3971,7 +3971,7 @@ VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result 2024-08-03 07:29:58.000000000 +0000 @@ -977,7 +977,7 @@ VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Extra port number to use for tcp connections in a one-thread-per-connection manner. 0 means don't use another port NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 4294967295 +NUMERIC_MAX_VALUE 65535 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES @@ -1785,7 +1785,7 @@ VARIABLE_NAME LOG_WARNINGS VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity +VARIABLE_COMMENT Log some non critical warnings to the error log.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 @@ -2299,7 +2299,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM +ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM,NO_NULL_COLLATION_IDS READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OLD_PASSWORDS @@ -2322,6 +2322,16 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT A bit field with the following values: adjust_secondary_key_cost = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. disable_max_seek = Disable 'max_seek optimization' for secondary keys and slight adjustment of filter cost. disable_forced_index_in_group_by = Disable automatic forced index in GROUP BY. fix_innodb_cardinality = Disable doubling of the Cardinality for InnoDB secondary keys. This variable will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST adjust_secondary_key_cost,disable_max_seek,disable_forced_index_in_group_by,fix_innodb_cardinality +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_EXTRA_PRUNING_DEPTH VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED @@ -2877,7 +2887,7 @@ VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Port number to use for connection or 0 to default to, my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default (3306), whatever comes first NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 4294967295 +NUMERIC_MAX_VALUE 65535 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES @@ -3172,6 +3182,16 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME SERVER_UID +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE VARCHAR +VARIABLE_COMMENT Automatically calculated server unique id hash +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SKIP_EXTERNAL_LOCKING VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,32bit.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,5 @@ +--- sysvars_server_notembedded.result 2024-01-28 17:50:35.442241137 +0100 ++++ sysvars_server_notembedded,32bit.result 2024-01-28 17:51:20.662078993 +0100 @@ -44,7 +44,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ARIA_BLOCK_SIZE @@ -429,7 +431,7 @@ VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity + VARIABLE_COMMENT Log some non critical warnings to the error log.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 @@ -1994,7 +1994,7 @@ @@ -722,6 +724,15 @@ NUMERIC_MAX_VALUE 4294967295 @@ -2494,7 +2494,7 @@ COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT 0 = No changes. 1 = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. 2 = Remove 'max_seek optimization' for secondary keys and slight adjustment of filter cost. This option will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 2 +@@ -2504,7 +2504,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_EXTRA_PRUNING_DEPTH VARIABLE_SCOPE SESSION -VARIABLE_TYPE BIGINT UNSIGNED @@ -729,7 +740,7 @@ VARIABLE_COMMENT If the optimizer needs to enumerate join prefix of this size or larger, then it will try aggressively prune away the search space. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2504,7 +2504,7 @@ +@@ -2514,7 +2514,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARGS VARIABLE_SCOPE SESSION @@ -738,7 +749,7 @@ VARIABLE_COMMENT The maximum number of SEL_ARG objects created when optimizing a range. If more objects would be needed, the range will not be used by the optimizer. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2514,7 +2514,7 @@ +@@ -2524,7 +2524,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_MAX_SEL_ARG_WEIGHT VARIABLE_SCOPE SESSION @@ -747,7 +758,7 @@ VARIABLE_COMMENT The maximum weight of the SEL_ARG graph. Set to 0 for no limit NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -2524,7 +2524,7 @@ +@@ -2534,7 +2534,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_PRUNE_LEVEL VARIABLE_SCOPE SESSION @@ -756,7 +767,7 @@ VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search: 1 - prune plans based on cost and number of retrieved rows eq_ref: 2 - prune also if we find an eq_ref chain NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -2534,7 +2534,7 @@ +@@ -2544,7 +2544,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH VARIABLE_SCOPE SESSION @@ -765,7 +776,7 @@ VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 62 -@@ -2544,7 +2544,7 @@ +@@ -2554,7 +2554,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT VARIABLE_SCOPE SESSION @@ -774,7 +785,7 @@ VARIABLE_COMMENT Controls number of record samples to check condition selectivity NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 4294967295 -@@ -2574,17 +2574,17 @@ +@@ -2584,17 +2584,17 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE VARIABLE_SCOPE SESSION @@ -795,7 +806,7 @@ VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5 -@@ -2604,7 +2604,7 @@ +@@ -2614,7 +2614,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE VARIABLE_SCOPE GLOBAL @@ -804,7 +815,7 @@ VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2614,7 +2614,7 @@ +@@ -2624,7 +2624,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE VARIABLE_SCOPE GLOBAL @@ -813,7 +824,7 @@ VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2624,7 +2624,7 @@ +@@ -2634,7 +2634,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -822,7 +833,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2634,7 +2634,7 @@ +@@ -2644,7 +2644,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -831,7 +842,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2644,7 +2644,7 @@ +@@ -2654,7 +2654,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -840,7 +851,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2654,7 +2654,7 @@ +@@ -2664,7 +2664,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -849,7 +860,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2664,7 +2664,7 @@ +@@ -2674,7 +2674,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -858,7 +869,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_TRANSACTIONS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2674,7 +2674,7 @@ +@@ -2684,7 +2684,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -867,7 +878,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_TRANSACTIONS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2684,7 +2684,7 @@ +@@ -2694,7 +2694,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE VARIABLE_SCOPE GLOBAL @@ -876,7 +887,7 @@ VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2694,7 +2694,7 @@ +@@ -2704,7 +2704,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE VARIABLE_SCOPE GLOBAL @@ -885,7 +896,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2704,7 +2704,7 @@ +@@ -2714,7 +2714,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE VARIABLE_SCOPE GLOBAL @@ -894,7 +905,7 @@ VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2714,7 +2714,7 @@ +@@ -2724,7 +2724,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES VARIABLE_SCOPE GLOBAL @@ -903,7 +914,7 @@ VARIABLE_COMMENT Maximum number of condition instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2724,7 +2724,7 @@ +@@ -2734,7 +2734,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES VARIABLE_SCOPE GLOBAL @@ -912,7 +923,7 @@ VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2734,7 +2734,7 @@ +@@ -2744,7 +2744,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH VARIABLE_SCOPE GLOBAL @@ -921,7 +932,7 @@ VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2744,7 +2744,7 @@ +@@ -2754,7 +2754,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES VARIABLE_SCOPE GLOBAL @@ -930,7 +941,7 @@ VARIABLE_COMMENT Maximum number of file instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2754,7 +2754,7 @@ +@@ -2764,7 +2764,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES VARIABLE_SCOPE GLOBAL @@ -939,7 +950,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented files. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2764,7 +2764,7 @@ +@@ -2774,7 +2774,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -948,7 +959,7 @@ VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2774,7 +2774,7 @@ +@@ -2784,7 +2784,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_INDEX_STAT VARIABLE_SCOPE GLOBAL @@ -957,7 +968,7 @@ VARIABLE_COMMENT Maximum number of index statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2784,7 +2784,7 @@ +@@ -2794,7 +2794,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MEMORY_CLASSES VARIABLE_SCOPE GLOBAL @@ -966,7 +977,7 @@ VARIABLE_COMMENT Maximum number of memory pool instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1024 -@@ -2794,7 +2794,7 @@ +@@ -2804,7 +2804,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_METADATA_LOCKS VARIABLE_SCOPE GLOBAL @@ -975,7 +986,7 @@ VARIABLE_COMMENT Maximum number of metadata locks. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2804,7 +2804,7 @@ +@@ -2814,7 +2814,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES VARIABLE_SCOPE GLOBAL @@ -984,7 +995,7 @@ VARIABLE_COMMENT Maximum number of mutex instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2814,7 +2814,7 @@ +@@ -2824,7 +2824,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES VARIABLE_SCOPE GLOBAL @@ -993,7 +1004,7 @@ VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2824,7 +2824,7 @@ +@@ -2834,7 +2834,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PREPARED_STATEMENTS_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1002,7 +1013,7 @@ VARIABLE_COMMENT Maximum number of instrumented prepared statements. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2834,7 +2834,7 @@ +@@ -2844,7 +2844,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PROGRAM_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1011,7 +1022,7 @@ VARIABLE_COMMENT Maximum number of instrumented programs. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2844,7 +2844,7 @@ +@@ -2854,7 +2854,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES VARIABLE_SCOPE GLOBAL @@ -1020,7 +1031,7 @@ VARIABLE_COMMENT Maximum number of rwlock instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2854,7 +2854,7 @@ +@@ -2864,7 +2864,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1029,7 +1040,7 @@ VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 104857600 -@@ -2864,7 +2864,7 @@ +@@ -2874,7 +2874,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES VARIABLE_SCOPE GLOBAL @@ -1038,7 +1049,7 @@ VARIABLE_COMMENT Maximum number of socket instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2874,7 +2874,7 @@ +@@ -2884,7 +2884,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1047,7 +1058,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2884,7 +2884,7 @@ +@@ -2894,7 +2894,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SQL_TEXT_LENGTH VARIABLE_SCOPE GLOBAL @@ -1056,7 +1067,7 @@ VARIABLE_COMMENT Maximum length of displayed sql text. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1048576 -@@ -2894,7 +2894,7 @@ +@@ -2904,7 +2904,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES VARIABLE_SCOPE GLOBAL @@ -1065,7 +1076,7 @@ VARIABLE_COMMENT Maximum number of stage instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2904,7 +2904,7 @@ +@@ -2914,7 +2914,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES VARIABLE_SCOPE GLOBAL @@ -1074,7 +1085,7 @@ VARIABLE_COMMENT Maximum number of statement instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2914,7 +2914,7 @@ +@@ -2924,7 +2924,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_STACK VARIABLE_SCOPE GLOBAL @@ -1083,7 +1094,7 @@ VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_CURRENT. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 256 -@@ -2924,7 +2924,7 @@ +@@ -2934,7 +2934,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES VARIABLE_SCOPE GLOBAL @@ -1092,7 +1103,7 @@ VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2934,7 +2934,7 @@ +@@ -2944,7 +2944,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1101,7 +1112,7 @@ VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2944,7 +2944,7 @@ +@@ -2954,7 +2954,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_LOCK_STAT VARIABLE_SCOPE GLOBAL @@ -1110,7 +1121,7 @@ VARIABLE_COMMENT Maximum number of lock statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2954,7 +2954,7 @@ +@@ -2964,7 +2964,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES VARIABLE_SCOPE GLOBAL @@ -1119,7 +1130,7 @@ VARIABLE_COMMENT Maximum number of thread instruments. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 256 -@@ -2964,7 +2964,7 @@ +@@ -2974,7 +2974,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES VARIABLE_SCOPE GLOBAL @@ -1128,7 +1139,7 @@ VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2974,7 +2974,7 @@ +@@ -2984,7 +2984,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE VARIABLE_SCOPE GLOBAL @@ -1137,7 +1148,7 @@ VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -2984,7 +2984,7 @@ +@@ -2994,7 +2994,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE VARIABLE_SCOPE GLOBAL @@ -1146,7 +1157,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1024 -@@ -2994,7 +2994,7 @@ +@@ -3004,7 +3004,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE VARIABLE_SCOPE GLOBAL @@ -1155,7 +1166,7 @@ VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3004,7 +3004,7 @@ +@@ -3014,7 +3014,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE VARIABLE_SCOPE GLOBAL @@ -1164,7 +1175,7 @@ VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. NUMERIC_MIN_VALUE -1 NUMERIC_MAX_VALUE 1048576 -@@ -3054,7 +3054,7 @@ +@@ -3064,7 +3064,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PRELOAD_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1173,7 +1184,7 @@ VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3074,7 +3074,7 @@ +@@ -3084,7 +3084,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME PROFILING_HISTORY_SIZE VARIABLE_SCOPE SESSION @@ -1182,7 +1193,7 @@ VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -3084,7 +3084,7 @@ +@@ -3094,7 +3094,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME PROGRESS_REPORT_TIME VARIABLE_SCOPE SESSION @@ -1191,7 +1202,7 @@ VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3144,7 +3144,7 @@ +@@ -3154,7 +3154,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE VARIABLE_SCOPE SESSION @@ -1200,7 +1211,7 @@ VARIABLE_COMMENT Allocation block size for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3154,7 +3154,7 @@ +@@ -3164,7 +3164,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_LIMIT VARIABLE_SCOPE GLOBAL @@ -1209,7 +1220,7 @@ VARIABLE_COMMENT Don't cache results that are bigger than this NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3164,7 +3164,7 @@ +@@ -3174,7 +3174,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT VARIABLE_SCOPE GLOBAL @@ -1218,7 +1229,7 @@ VARIABLE_COMMENT The minimum size for blocks allocated by the query cache NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3177,7 +3177,7 @@ +@@ -3187,7 +3187,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The memory allocated to store results from old queries NUMERIC_MIN_VALUE 0 @@ -1227,7 +1238,7 @@ NUMERIC_BLOCK_SIZE 1024 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3214,7 +3214,7 @@ +@@ -3224,7 +3224,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME QUERY_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1236,7 +1247,7 @@ VARIABLE_COMMENT Persistent buffer for query parsing and execution NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 4294967295 -@@ -3227,7 +3227,7 @@ +@@ -3237,7 +3237,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1245,7 +1256,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3237,14 +3237,14 @@ +@@ -3247,14 +3247,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes NUMERIC_MIN_VALUE 0 @@ -1262,7 +1273,7 @@ VARIABLE_COMMENT Allocation block size for storing ranges during optimization NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 4294967295 -@@ -3257,14 +3257,14 @@ +@@ -3267,14 +3267,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Maximum speed(KB/s) to read binlog from master (0 = no limit) NUMERIC_MIN_VALUE 0 @@ -1279,7 +1290,7 @@ VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value NUMERIC_MIN_VALUE 8192 NUMERIC_MAX_VALUE 2147483647 -@@ -3284,7 +3284,7 @@ +@@ -3294,7 +3294,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME READ_RND_BUFFER_SIZE VARIABLE_SCOPE SESSION @@ -1288,7 +1299,7 @@ VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 2147483647 -@@ -3504,10 +3504,10 @@ +@@ -3514,10 +3514,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME ROWID_MERGE_BUFF_SIZE VARIABLE_SCOPE SESSION @@ -1301,7 +1312,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3524,20 +3524,20 @@ +@@ -3534,20 +3534,20 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_MASTER_TIMEOUT VARIABLE_SCOPE GLOBAL @@ -1326,7 +1337,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3594,10 +3594,10 @@ +@@ -3604,10 +3604,10 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_TRACE_LEVEL VARIABLE_SCOPE GLOBAL @@ -1339,7 +1350,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -3634,7 +3634,7 @@ +@@ -3644,7 +3644,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SERVER_ID VARIABLE_SCOPE SESSION @@ -1348,7 +1359,7 @@ VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -3774,7 +3774,7 @@ +@@ -3784,7 +3784,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_DOMAIN_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1357,7 +1368,7 @@ VARIABLE_COMMENT Maximum number of parallel threads to use on slave for events in a single replication domain. When using multiple domains, this can be used to limit a single domain from grabbing all threads and thus stalling other domains. The default of 0 means to allow a domain to grab as many threads as it wants, up to the value of slave_parallel_threads. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3804,7 +3804,7 @@ +@@ -3814,7 +3814,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET VARIABLE_SCOPE GLOBAL @@ -1366,7 +1377,7 @@ VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 1073741824 -@@ -3834,7 +3834,7 @@ +@@ -3844,7 +3844,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_MAX_QUEUED VARIABLE_SCOPE GLOBAL @@ -1375,7 +1386,7 @@ VARIABLE_COMMENT Limit on how much memory SQL threads should use per parallel replication thread when reading ahead in the relay log looking for opportunities for parallel replication. Only used when --slave-parallel-threads > 0. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2147483647 -@@ -3854,7 +3854,7 @@ +@@ -3864,7 +3864,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SLAVE_PARALLEL_THREADS VARIABLE_SCOPE GLOBAL @@ -1384,7 +1395,7 @@ VARIABLE_COMMENT If non-zero, number of threads to spawn to apply in parallel events on the slave that were group-committed on the master or were logged with GTID in different replication domains. Note that these threads are in addition to the IO and SQL threads, which are always created by a replication slave NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3864,7 +3864,7 @@ +@@ -3874,7 +3874,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_PARALLEL_WORKERS VARIABLE_SCOPE GLOBAL @@ -1393,7 +1404,7 @@ VARIABLE_COMMENT Alias for slave_parallel_threads NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16383 -@@ -3904,7 +3904,7 @@ +@@ -3914,7 +3914,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME SLAVE_TRANSACTION_RETRIES VARIABLE_SCOPE GLOBAL @@ -1402,7 +1413,7 @@ VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock, elapsed lock wait timeout or listed in slave_transaction_retry_errors, before giving up and stopping NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -3924,7 +3924,7 @@ +@@ -3934,7 +3934,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLAVE_TRANSACTION_RETRY_INTERVAL VARIABLE_SCOPE GLOBAL @@ -1411,7 +1422,7 @@ VARIABLE_COMMENT Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3600 -@@ -3944,7 +3944,7 @@ +@@ -3954,7 +3954,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME SLOW_LAUNCH_TIME VARIABLE_SCOPE GLOBAL @@ -1420,7 +1431,7 @@ VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 31536000 -@@ -3987,7 +3987,7 @@ +@@ -3997,7 +3997,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Each thread that needs to do a sort allocates a buffer of this size NUMERIC_MIN_VALUE 1024 @@ -1429,7 +1440,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4214,7 +4214,7 @@ +@@ -4224,7 +4224,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME STORED_PROGRAM_CACHE VARIABLE_SCOPE GLOBAL @@ -1438,7 +1449,7 @@ VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 524288 -@@ -4324,7 +4324,7 @@ +@@ -4334,7 +4334,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME TABLE_DEFINITION_CACHE VARIABLE_SCOPE GLOBAL @@ -1447,7 +1458,7 @@ VARIABLE_COMMENT The number of cached table definitions NUMERIC_MIN_VALUE 400 NUMERIC_MAX_VALUE 2097152 -@@ -4334,7 +4334,7 @@ +@@ -4344,7 +4344,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TABLE_OPEN_CACHE VARIABLE_SCOPE GLOBAL @@ -1456,7 +1467,7 @@ VARIABLE_COMMENT The number of cached open tables NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 1048576 -@@ -4394,7 +4394,7 @@ +@@ -4404,7 +4404,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME THREAD_CACHE_SIZE VARIABLE_SCOPE GLOBAL @@ -1465,7 +1476,7 @@ VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16384 -@@ -4567,7 +4567,7 @@ +@@ -4577,7 +4577,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Max size for data for an internal temporary on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 1024 @@ -1474,7 +1485,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4577,7 +4577,7 @@ +@@ -4587,7 +4587,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. Same as tmp_table_size. NUMERIC_MIN_VALUE 0 @@ -1483,7 +1494,7 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -4587,14 +4587,14 @@ +@@ -4597,14 +4597,14 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT Alias for tmp_memory_table_size. If an internal in-memory temporary table exceeds this size, MariaDB will automatically convert it to an on-disk MyISAM or Aria table. NUMERIC_MIN_VALUE 0 @@ -1500,7 +1511,7 @@ VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4604,7 +4604,7 @@ +@@ -4614,7 +4614,7 @@ COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME TRANSACTION_PREALLOC_SIZE VARIABLE_SCOPE SESSION @@ -1509,7 +1520,7 @@ VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log NUMERIC_MIN_VALUE 1024 NUMERIC_MAX_VALUE 134217728 -@@ -4744,7 +4744,7 @@ +@@ -4754,7 +4754,7 @@ COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME WAIT_TIMEOUT VARIABLE_SCOPE SESSION @@ -1518,7 +1529,7 @@ VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 31536000 -@@ -4771,7 +4771,7 @@ +@@ -4781,7 +4781,7 @@ VARIABLE_NAME LOG_TC_SIZE GLOBAL_VALUE_ORIGIN AUTO VARIABLE_SCOPE GLOBAL diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,win.rdiff mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,win.rdiff --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,win.rdiff 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded,win.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,1465 @@ +--- suite/sys_vars/r/sysvars_server_notembedded.result ++++ suite/sys_vars/r/sysvars_server_notembedded.reject +@@ -34,7 +34,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_BLOCK_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Block size to be used for Aria index pages. + NUMERIC_MIN_VALUE 4096 + NUMERIC_MAX_VALUE 32768 +@@ -44,7 +44,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_CHECKPOINT_INTERVAL + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Interval between tries to do an automatic checkpoints. In seconds; 0 means 'no automatic checkpoints' which makes sense only for testing. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -54,7 +54,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_CHECKPOINT_LOG_ACTIVITY + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of bytes that the transaction log has to grow between checkpoints before a new checkpoint is written to the log. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -74,7 +74,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME ARIA_FORCE_START_AFTER_RECOVERY_FAILURES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of consecutive log recovery failures after which logs will be automatically deleted to cure the problem; 0 (the default) disables the feature. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 255 +@@ -94,7 +94,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_GROUP_COMMIT_INTERVAL + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Interval between commits in microseconds (1/1000000 sec). 0 stands for no waiting for other threads to come and do a commit in "hard" mode and no sync()/commit at all in "soft" mode. Option has only an effect if aria_group_commit is used + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -114,7 +114,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_LOG_FILE_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Limit for transaction log size + NUMERIC_MIN_VALUE 8388608 + NUMERIC_MAX_VALUE 4294967295 +@@ -144,10 +144,10 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_PAGECACHE_AGE_THRESHOLD + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT This characterizes the number of hits a hot block has to be untouched until it is considered aged enough to be downgraded to a warm block. This specifies the percentage ratio of that number of hits to the total number of blocks in the page cache. + NUMERIC_MIN_VALUE 100 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 100 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -164,7 +164,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_PAGECACHE_DIVISION_LIMIT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The minimum percentage of warm blocks in key cache + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 100 +@@ -174,7 +174,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME ARIA_PAGECACHE_FILE_HASH_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of hash buckets for open and changed files. If you have a lot of Aria files open you should increase this for faster flush of changes. A good value is probably 1/10 of number of possible open Aria files. + NUMERIC_MIN_VALUE 128 + NUMERIC_MAX_VALUE 16384 +@@ -204,7 +204,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME ARIA_REPAIR_THREADS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of threads to use when repairing Aria tables. The value of 1 disables parallel repair. + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 128 +@@ -274,7 +274,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME AUTO_INCREMENT_INCREMENT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Auto-increment columns are incremented by this + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 65535 +@@ -284,7 +284,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME AUTO_INCREMENT_OFFSET + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Offset added to Auto-increment columns. Used when auto-increment-increment != 1 + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 65535 +@@ -294,7 +294,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME BACK_LOG + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of outstanding connection requests MariaDB can have. This comes into play when the main MariaDB thread gets very many connection requests in a very short time + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 65535 +@@ -364,20 +364,20 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME BINLOG_COMMIT_WAIT_COUNT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If non-zero, binlog write will wait at most binlog_commit_wait_usec microseconds for at least this many commits to queue up for group commit to the binlog. This can reduce I/O on the binlog and provide increased opportunity for parallel apply on the slave, but too high a value will decrease commit throughput. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME BINLOG_COMMIT_WAIT_USEC + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum time, in microseconds, to wait for more commits to queue up for binlog group commit. Only takes effect if the value of binlog_commit_wait_count is non-zero. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -394,7 +394,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME BINLOG_EXPIRE_LOGS_SECONDS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If non-zero, binary logs will be purged after binlog_expire_logs_seconds seconds; It and expire_logs_days are linked, such that changes in one are converted into the other. Possible purges happen at startup and at binary log rotation. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 8553600 +@@ -654,7 +654,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME CONNECT_TIMEOUT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of seconds the mysqld server is waiting for a connect packet before responding with 'Bad handshake' + NUMERIC_MIN_VALUE 2 + NUMERIC_MAX_VALUE 31536000 +@@ -704,7 +704,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_LONG + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Long search depth for the two-step deadlock detection + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 33 +@@ -714,7 +714,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME DEADLOCK_SEARCH_DEPTH_SHORT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Short search depth for the two-step deadlock detection + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 32 +@@ -724,7 +724,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME DEADLOCK_TIMEOUT_LONG + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Long timeout for the two-step deadlock detection (in microseconds) + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -734,7 +734,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME DEADLOCK_TIMEOUT_SHORT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Short timeout for the two-step deadlock detection (in microseconds) + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -794,7 +794,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME DEFAULT_WEEK_FORMAT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The default week format used by WEEK() functions + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 7 +@@ -804,7 +804,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME DELAYED_INSERT_LIMIT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT After inserting delayed_insert_limit rows, the INSERT DELAYED handler will check if there are any SELECT statements pending. If so, it allows these to execute before continuing. + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -814,7 +814,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME DELAYED_INSERT_TIMEOUT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT How long a INSERT DELAYED thread should wait for INSERT statements before terminating + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 31536000 +@@ -824,7 +824,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME DELAYED_QUEUE_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT What size queue (in rows) should be allocated for handling INSERT DELAYED. If the queue becomes full, any client that does INSERT DELAYED will wait until there is room in the queue again + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -854,7 +854,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME DIV_PRECISION_INCREMENT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Precision of the result of '/' operator will be increased on that value + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 38 +@@ -974,7 +974,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME EXTRA_MAX_CONNECTIONS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of connections on extra-port + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 100000 +@@ -1004,7 +1004,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME FLUSH_TIME + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT A dedicated thread is created to flush all tables at the given interval + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 31536000 +@@ -1034,7 +1034,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME FT_MAX_WORD_LEN + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable + NUMERIC_MIN_VALUE 10 + NUMERIC_MAX_VALUE 84 +@@ -1044,7 +1044,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME FT_MIN_WORD_LEN + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 84 +@@ -1054,7 +1054,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME FT_QUERY_EXPANSION_LIMIT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of best matches to use for query expansion + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1000 +@@ -1304,7 +1304,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME HISTOGRAM_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of bytes used for a histogram. If set to 0, no histograms are created by ANALYZE. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 255 +@@ -1334,7 +1334,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME HOST_CACHE_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT How many host names should be cached to avoid resolving. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 65536 +@@ -1357,7 +1357,7 @@ + VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of seconds the server waits for read-only idle transaction + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 31536000 ++NUMERIC_MAX_VALUE 2147483 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -1367,7 +1367,7 @@ + VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of seconds the server waits for idle transaction + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 31536000 ++NUMERIC_MAX_VALUE 2147483 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -1377,7 +1377,7 @@ + VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of seconds the server waits for write idle transaction + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 31536000 ++NUMERIC_MAX_VALUE 2147483 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -1444,7 +1444,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME INTERACTIVE_TIMEOUT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of seconds the server waits for activity on an interactive connection before closing it + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 31536000 +@@ -1494,7 +1494,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME JOIN_CACHE_LEVEL + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Controls what join operations can be executed with join buffers. Odd numbers are used for plain join buffers while even numbers are used for linked buffers + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 8 +@@ -1672,19 +1672,9 @@ + ENUM_VALUE_LIST OFF,ON + READ_ONLY NO + COMMAND_LINE_ARGUMENT OPTIONAL +-VARIABLE_NAME LOCKED_IN_MEMORY +-VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BOOLEAN +-VARIABLE_COMMENT Whether mysqld was locked in memory with --memlock +-NUMERIC_MIN_VALUE NULL +-NUMERIC_MAX_VALUE NULL +-NUMERIC_BLOCK_SIZE NULL +-ENUM_VALUE_LIST OFF,ON +-READ_ONLY YES +-COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME LOCK_WAIT_TIMEOUT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Timeout in seconds to wait for a lock before returning an error. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 31536000 +@@ -1834,7 +1824,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME LOG_SLOW_MAX_WARNINGS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Max numbers of warnings printed to slow query log per statement + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1000 +@@ -1844,7 +1834,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME LOG_SLOW_RATE_LIMIT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Write to slow log every #th slow query. Set to 1 to log everything. Increase it to reduce the size of the slow or the performance impact of slow logging + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -1874,7 +1864,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME LOG_WARNINGS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Log some non critical warnings to the error log.Value can be between 0 and 11. Higher values mean more verbosity + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -1934,7 +1924,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME MAX_ALLOWED_PACKET + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Max packet length to send to or receive from the server + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 1073741824 +@@ -1954,7 +1944,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_BINLOG_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Binary log will be rotated automatically when the size exceeds this value. + NUMERIC_MIN_VALUE 4096 + NUMERIC_MAX_VALUE 1073741824 +@@ -1974,7 +1964,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_CONNECTIONS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of simultaneous clients allowed + NUMERIC_MIN_VALUE 10 + NUMERIC_MAX_VALUE 100000 +@@ -1984,7 +1974,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_CONNECT_ERRORS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If there is more than this number of interrupted connections from a host this host will be blocked from further connections + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -1994,7 +1984,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_DELAYED_THREADS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 16384 +@@ -2014,7 +2004,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_ERROR_COUNT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Max number of errors/warnings to store for a statement + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 65535 +@@ -2034,7 +2024,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_INSERT_DELAYED_THREADS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Don't start more than this number of threads to handle INSERT DELAYED statements. If set to zero INSERT DELAYED will be not used + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 16384 +@@ -2054,7 +2044,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_LENGTH_FOR_SORT_DATA + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Max number of bytes in sorted records + NUMERIC_MIN_VALUE 4 + NUMERIC_MAX_VALUE 8388608 +@@ -2084,7 +2074,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_RECURSIVE_ITERATIONS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of iterations when executing recursive queries + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -2114,7 +2104,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_SEEKS_FOR_KEY + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Limit assumed max number of seeks when looking up rows based on a key + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -2134,7 +2124,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_SORT_LENGTH + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of bytes to use when sorting BLOB or TEXT values (only the first max_sort_length bytes of each value are used; the rest are ignored) + NUMERIC_MIN_VALUE 64 + NUMERIC_MAX_VALUE 8388608 +@@ -2144,7 +2134,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_SP_RECURSION_DEPTH + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum stored procedure recursion depth + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 255 +@@ -2164,7 +2154,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_TMP_TABLES + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Unused, will be removed. + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -2184,7 +2174,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MAX_WRITE_LOCK_COUNT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT After this many write locks, allow some read locks to run in between + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -2194,7 +2184,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME METADATA_LOCKS_CACHE_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Unused + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 1048576 +@@ -2204,7 +2194,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME METADATA_LOCKS_HASH_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Unused + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 1024 +@@ -2214,7 +2204,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MIN_EXAMINED_ROW_LIMIT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Don't write queries to slow log that examine fewer rows than that + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -2224,7 +2214,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MRR_BUFFER_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Size of buffer to use when using MRR with range access + NUMERIC_MIN_VALUE 8192 + NUMERIC_MAX_VALUE 2147483647 +@@ -2234,7 +2224,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MYISAM_BLOCK_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Block size to be used for MyISAM index pages + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 16384 +@@ -2244,7 +2234,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME MYISAM_DATA_POINTER_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Default pointer size to be used for MyISAM tables + NUMERIC_MIN_VALUE 2 + NUMERIC_MAX_VALUE 7 +@@ -2284,10 +2274,10 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME MYISAM_REPAIR_THREADS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If larger than 1, when repairing a MyISAM table all indexes will be created in parallel, with one thread per index. The value of 1 disables parallel repair + NUMERIC_MIN_VALUE 1 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -2332,9 +2322,19 @@ + ENUM_VALUE_LIST OFF,ON + READ_ONLY NO + COMMAND_LINE_ARGUMENT OPTIONAL ++VARIABLE_NAME NAMED_PIPE ++VARIABLE_SCOPE GLOBAL ++VARIABLE_TYPE BOOLEAN ++VARIABLE_COMMENT Enable the named pipe (NT) ++NUMERIC_MIN_VALUE NULL ++NUMERIC_MAX_VALUE NULL ++NUMERIC_BLOCK_SIZE NULL ++ENUM_VALUE_LIST OFF,ON ++READ_ONLY YES ++COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME NET_BUFFER_LENGTH + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Buffer length for TCP/IP and socket communication + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 1048576 +@@ -2344,7 +2344,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME NET_READ_TIMEOUT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of seconds to wait for more data from a connection before aborting the read + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 31536000 +@@ -2354,7 +2354,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME NET_RETRY_COUNT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If a read on a communication port is interrupted, retry this many times before giving up + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -2364,7 +2364,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME NET_WRITE_TIMEOUT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of seconds to wait for a block to be written to a connection before aborting the write + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 31536000 +@@ -2424,7 +2424,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME OPEN_FILES_LIMIT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If this is not 0, then mysqld will use this value to reserve file descriptors to use with setrlimit(). If this value is 0 or autoset then mysqld will reserve max_connections*5 or max_connections + table_cache*2 (whichever is larger) number of file descriptors + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -2434,7 +2434,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT 0 = No changes. 1 = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. 2 = Remove 'max_seek optimization' for secondary keys and slight adjustment of filter cost. This option will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 2 +@@ -2444,7 +2444,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_MAX_SEL_ARGS + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The maximum number of SEL_ARG objects created when optimizing a range. If more objects would be needed, the range will not be used by the optimizer. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -2454,7 +2454,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_MAX_SEL_ARG_WEIGHT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The maximum weight of the SEL_ARG graph. Set to 0 for no limit + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -2464,7 +2464,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_PRUNE_LEVEL + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Controls the heuristic(s) applied during query optimization to prune less-promising partial plans from the optimizer search space. Meaning: 0 - do not apply any heuristic, thus perform exhaustive search; 1 - prune plans based on number of retrieved rows + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1 +@@ -2474,7 +2474,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_SEARCH_DEPTH + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum depth of search performed by the query optimizer. Values larger than the number of relations in a query result in better query plans, but take longer to compile a query. Values smaller than the number of tables in a relation result in faster optimization, but may produce very bad query plans. If set to 0, the system will automatically pick a reasonable value. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 62 +@@ -2484,7 +2484,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_SELECTIVITY_SAMPLING_LIMIT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Controls number of record samples to check condition selectivity + NUMERIC_MIN_VALUE 10 + NUMERIC_MAX_VALUE 4294967295 +@@ -2514,17 +2514,17 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_TRACE_MAX_MEM_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum allowed size of an optimizer trace + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME OPTIMIZER_USE_CONDITION_SELECTIVITY + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Controls selectivity of which conditions the optimizer takes into account to calculate cardinality of a partial join when it searches for the best execution plan Meaning: 1 - use selectivity of index backed range conditions to calculate the cardinality of a partial join if the last joined table is accessed by full table scan or an index scan, 2 - use selectivity of index backed range conditions to calculate the cardinality of a partial join in any case, 3 - additionally always use selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join, 4 - use histograms to calculate selectivity of range conditions that are not backed by any index to calculate the cardinality of a partial join.5 - additionally use selectivity of certain non-range predicates calculated on record samples + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 5 +@@ -2544,7 +2544,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME PERFORMANCE_SCHEMA_ACCOUNTS_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented user@host accounts. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2554,7 +2554,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_DIGESTS_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Size of the statement digest. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2564,7 +2564,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_LONG_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows in EVENTS_STAGES_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2574,7 +2574,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STAGES_HISTORY_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows per thread in EVENTS_STAGES_HISTORY. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1024 +@@ -2584,7 +2584,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_LONG_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows in EVENTS_STATEMENTS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2594,7 +2594,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_STATEMENTS_HISTORY_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_HISTORY. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1024 +@@ -2604,7 +2604,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_LONG_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows in EVENTS_TRANSACTIONS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2614,7 +2614,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_TRANSACTIONS_HISTORY_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows per thread in EVENTS_TRANSACTIONS_HISTORY. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1024 +@@ -2624,7 +2624,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_LONG_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows in EVENTS_WAITS_HISTORY_LONG. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2634,7 +2634,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_EVENTS_WAITS_HISTORY_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Number of rows per thread in EVENTS_WAITS_HISTORY. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1024 +@@ -2644,7 +2644,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_HOSTS_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented hosts. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2654,7 +2654,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of condition instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2664,7 +2664,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_COND_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented condition objects. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2674,7 +2674,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_DIGEST_LENGTH + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum length considered for digest text, when stored in performance_schema tables. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1048576 +@@ -2684,7 +2684,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of file instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2694,7 +2694,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_HANDLES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of opened instrumented files. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1048576 +@@ -2704,7 +2704,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_FILE_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented files. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2714,7 +2714,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_INDEX_STAT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of index statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2724,7 +2724,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MEMORY_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of memory pool instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1024 +@@ -2734,7 +2734,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_METADATA_LOCKS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of metadata locks. Use 0 to disable, -1 for automated scaling. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 104857600 +@@ -2744,7 +2744,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of mutex instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2754,7 +2754,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_MUTEX_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented MUTEX objects. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 104857600 +@@ -2764,7 +2764,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PREPARED_STATEMENTS_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented prepared statements. Use 0 to disable, -1 for automated scaling. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2774,7 +2774,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_PROGRAM_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented programs. Use 0 to disable, -1 for automated scaling. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2784,7 +2784,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of rwlock instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2794,7 +2794,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_RWLOCK_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented RWLOCK objects. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 104857600 +@@ -2804,7 +2804,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of socket instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2814,7 +2814,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SOCKET_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of opened instrumented sockets. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2824,7 +2824,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_SQL_TEXT_LENGTH + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum length of displayed sql text. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 1048576 +@@ -2834,7 +2834,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STAGE_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of stage instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2844,7 +2844,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of statement instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2854,7 +2854,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_STATEMENT_STACK + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of rows per thread in EVENTS_STATEMENTS_CURRENT. + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 256 +@@ -2864,7 +2864,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_HANDLES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of opened instrumented tables. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2874,7 +2874,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented tables. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2884,7 +2884,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_TABLE_LOCK_STAT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of lock statistics for instrumented tables. Use 0 to disable, -1 for automated scaling. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2894,7 +2894,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_CLASSES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of thread instruments. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 256 +@@ -2904,7 +2904,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_MAX_THREAD_INSTANCES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented threads. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2914,7 +2914,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_SESSION_CONNECT_ATTRS_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Size of session attribute string buffer per thread. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2924,7 +2924,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_ACTORS_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of rows in SETUP_ACTORS. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1024 +@@ -2934,7 +2934,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_SETUP_OBJECTS_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of rows in SETUP_OBJECTS. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2944,7 +2944,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PERFORMANCE_SCHEMA_USERS_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT ++VARIABLE_TYPE INT + VARIABLE_COMMENT Maximum number of instrumented users. Use 0 to disable, -1 for automated sizing. + NUMERIC_MIN_VALUE -1 + NUMERIC_MAX_VALUE 1048576 +@@ -2994,7 +2994,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PRELOAD_BUFFER_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The size of the buffer that is allocated when preloading indexes + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 1073741824 +@@ -3014,7 +3014,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME PROFILING_HISTORY_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of statements about which profiling information is maintained. If set to 0, no profiles are stored. See SHOW PROFILES. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 100 +@@ -3024,7 +3024,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME PROGRESS_REPORT_TIME + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Seconds between sending progress reports to the client for time-consuming statements. Set to 0 to disable progress reporting. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -3084,7 +3084,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME QUERY_ALLOC_BLOCK_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Allocation block size for query parsing and execution + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 4294967295 +@@ -3094,7 +3094,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME QUERY_CACHE_LIMIT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Don't cache results that are bigger than this + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -3104,7 +3104,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME QUERY_CACHE_MIN_RES_UNIT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The minimum size for blocks allocated by the query cache + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -3117,7 +3117,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT The memory allocated to store results from old queries + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1024 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -3154,7 +3154,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME QUERY_PREALLOC_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Persistent buffer for query parsing and execution + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 4294967295 +@@ -3167,7 +3167,7 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -3177,14 +3177,14 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Sets the internal state of the RAND() generator for replication purposes + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME RANGE_ALLOC_BLOCK_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Allocation block size for storing ranges during optimization + NUMERIC_MIN_VALUE 4096 + NUMERIC_MAX_VALUE 4294967295 +@@ -3197,14 +3197,14 @@ + VARIABLE_TYPE BIGINT UNSIGNED + VARIABLE_COMMENT Maximum speed(KB/s) to read binlog from master (0 = no limit) + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME READ_BUFFER_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value + NUMERIC_MIN_VALUE 8192 + NUMERIC_MAX_VALUE 2147483647 +@@ -3224,7 +3224,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME READ_RND_BUFFER_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT When reading rows in sorted order after a sort, the rows are read through this buffer to avoid a disk seeks + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 2147483647 +@@ -3434,10 +3434,10 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME ROWID_MERGE_BUFF_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The size of the buffers used [NOT] IN evaluation via partial matching + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 9223372036854775807 ++NUMERIC_MAX_VALUE 2147483647 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -3454,20 +3454,20 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME RPL_SEMI_SYNC_MASTER_TIMEOUT + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The timeout value (in ms) for semi-synchronous replication in the master + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME RPL_SEMI_SYNC_MASTER_TRACE_LEVEL + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The tracing level for semi-sync replication. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -3524,10 +3524,10 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME RPL_SEMI_SYNC_SLAVE_TRACE_LEVEL + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The tracing level for semi-sync replication. + NUMERIC_MIN_VALUE 0 +-NUMERIC_MAX_VALUE 18446744073709551615 ++NUMERIC_MAX_VALUE 4294967295 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -3564,7 +3564,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME SERVER_ID + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Uniquely identifies the server instance in the community of replication partners + NUMERIC_MIN_VALUE 1 + NUMERIC_MAX_VALUE 4294967295 +@@ -3694,7 +3694,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME SLAVE_DOMAIN_PARALLEL_THREADS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Maximum number of parallel threads to use on slave for events in a single replication domain. When using multiple domains, this can be used to limit a single domain from grabbing all threads and thus stalling other domains. The default of 0 means to allow a domain to grab as many threads as it wants, up to the value of slave_parallel_threads. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 16383 +@@ -3724,7 +3724,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME SLAVE_MAX_ALLOWED_PACKET + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The maximum packet length to sent successfully from the master to slave. + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 1073741824 +@@ -3744,7 +3744,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME SLAVE_PARALLEL_MAX_QUEUED + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Limit on how much memory SQL threads should use per parallel replication thread when reading ahead in the relay log looking for opportunities for parallel replication. Only used when --slave-parallel-threads > 0. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 2147483647 +@@ -3764,7 +3764,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME SLAVE_PARALLEL_THREADS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If non-zero, number of threads to spawn to apply in parallel events on the slave that were group-committed on the master or were logged with GTID in different replication domains. Note that these threads are in addition to the IO and SQL threads, which are always created by a replication slave + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 16383 +@@ -3774,7 +3774,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME SLAVE_PARALLEL_WORKERS + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Alias for slave_parallel_threads + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 16383 +@@ -3814,7 +3814,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME SLAVE_TRANSACTION_RETRIES + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Number of times the slave SQL thread will retry a transaction in case it failed with a deadlock, elapsed lock wait timeout or listed in slave_transaction_retry_errors, before giving up and stopping + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 4294967295 +@@ -3834,7 +3834,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME SLAVE_TRANSACTION_RETRY_INTERVAL + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Interval of the slave SQL thread will retry a transaction in case it failed with a deadlock or elapsed lock wait timeout or listed in slave_transaction_retry_errors + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 3600 +@@ -3854,7 +3854,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME SLOW_LAUNCH_TIME + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT If creating the thread takes longer than this value (in seconds), the Slow_launch_threads counter will be incremented + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 31536000 +@@ -4124,7 +4124,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME STORED_PROGRAM_CACHE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The soft upper limit for number of cached stored routines for one connection. + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 524288 +@@ -4224,7 +4224,7 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME TABLE_DEFINITION_CACHE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of cached table definitions + NUMERIC_MIN_VALUE 400 + NUMERIC_MAX_VALUE 2097152 +@@ -4234,7 +4234,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME TABLE_OPEN_CACHE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of cached open tables + NUMERIC_MIN_VALUE 10 + NUMERIC_MAX_VALUE 1048576 +@@ -4294,7 +4294,7 @@ + COMMAND_LINE_ARGUMENT OPTIONAL + VARIABLE_NAME THREAD_CACHE_SIZE + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT How many threads we should keep in a cache for reuse. These are freed after 5 minutes of idle time + NUMERIC_MIN_VALUE 0 + NUMERIC_MAX_VALUE 16384 +@@ -4352,6 +4352,26 @@ + ENUM_VALUE_LIST NULL + READ_ONLY NO + COMMAND_LINE_ARGUMENT REQUIRED ++VARIABLE_NAME THREAD_POOL_MIN_THREADS ++VARIABLE_SCOPE GLOBAL ++VARIABLE_TYPE INT UNSIGNED ++VARIABLE_COMMENT Minimum number of threads in the thread pool. ++NUMERIC_MIN_VALUE 1 ++NUMERIC_MAX_VALUE 256 ++NUMERIC_BLOCK_SIZE 1 ++ENUM_VALUE_LIST NULL ++READ_ONLY NO ++COMMAND_LINE_ARGUMENT REQUIRED ++VARIABLE_NAME THREAD_POOL_MODE ++VARIABLE_SCOPE GLOBAL ++VARIABLE_TYPE ENUM ++VARIABLE_COMMENT Chose implementation of the threadpool ++NUMERIC_MIN_VALUE NULL ++NUMERIC_MAX_VALUE NULL ++NUMERIC_BLOCK_SIZE NULL ++ENUM_VALUE_LIST windows,generic ++READ_ONLY YES ++COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME THREAD_POOL_OVERSUBSCRIBE + VARIABLE_SCOPE GLOBAL + VARIABLE_TYPE INT UNSIGNED +@@ -4455,7 +4475,7 @@ + VARIABLE_NAME TMPDIR + VARIABLE_SCOPE GLOBAL + VARIABLE_TYPE VARCHAR +-VARIABLE_COMMENT Path for temporary files. Several paths may be specified, separated by a colon (:), in this case they are used in a round-robin fashion ++VARIABLE_COMMENT Path for temporary files. Several paths may be specified, separated by a semicolon (;), in this case they are used in a round-robin fashion + NUMERIC_MIN_VALUE NULL + NUMERIC_MAX_VALUE NULL + NUMERIC_BLOCK_SIZE NULL +@@ -4494,7 +4514,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME TRANSACTION_ALLOC_BLOCK_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Allocation block size for transactions to be stored in binary log + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 134217728 +@@ -4504,7 +4524,7 @@ + COMMAND_LINE_ARGUMENT REQUIRED + VARIABLE_NAME TRANSACTION_PREALLOC_SIZE + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Persistent buffer for transactions to be stored in binary log + NUMERIC_MIN_VALUE 1024 + NUMERIC_MAX_VALUE 134217728 +@@ -4644,10 +4664,10 @@ + COMMAND_LINE_ARGUMENT NULL + VARIABLE_NAME WAIT_TIMEOUT + VARIABLE_SCOPE SESSION +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT The number of seconds the server waits for activity on a connection before closing it + NUMERIC_MIN_VALUE 1 +-NUMERIC_MAX_VALUE 31536000 ++NUMERIC_MAX_VALUE 2147483 + NUMERIC_BLOCK_SIZE 1 + ENUM_VALUE_LIST NULL + READ_ONLY NO +@@ -4671,7 +4691,7 @@ + VARIABLE_NAME LOG_TC_SIZE + GLOBAL_VALUE_ORIGIN AUTO + VARIABLE_SCOPE GLOBAL +-VARIABLE_TYPE BIGINT UNSIGNED ++VARIABLE_TYPE INT UNSIGNED + VARIABLE_COMMENT Size of transaction coordinator log. + ENUM_VALUE_LIST NULL + READ_ONLY YES diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result --- mariadb-10.11.6/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result 2024-08-03 07:29:58.000000000 +0000 @@ -1007,7 +1007,7 @@ VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Extra port number to use for tcp connections in a one-thread-per-connection manner. 0 means don't use another port NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 4294967295 +NUMERIC_MAX_VALUE 65535 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES @@ -1935,7 +1935,7 @@ VARIABLE_NAME LOG_WARNINGS VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Log some not critical warnings to the general log file.Value can be between 0 and 11. Higher values mean more verbosity +VARIABLE_COMMENT Log some non critical warnings to the error log.Value can be between 0 and 11. Higher values mean more verbosity NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 1 @@ -2469,7 +2469,7 @@ NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL -ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM +ENUM_VALUE_LIST NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO,ZERO_DATE_TIME_CAST,UTF8_IS_UTF8MB3,IGNORE_INDEX_ONLY_FOR_JOIN,COMPAT_5_1_CHECKSUM,NO_NULL_COLLATION_IDS READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OLD_PASSWORDS @@ -2492,6 +2492,16 @@ ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME OPTIMIZER_ADJUST_SECONDARY_KEY_COSTS +VARIABLE_SCOPE SESSION +VARIABLE_TYPE SET +VARIABLE_COMMENT A bit field with the following values: adjust_secondary_key_cost = Update secondary key costs for ranges to be at least 5x of clustered primary key costs. disable_max_seek = Disable 'max_seek optimization' for secondary keys and slight adjustment of filter cost. disable_forced_index_in_group_by = Disable automatic forced index in GROUP BY. fix_innodb_cardinality = Disable doubling of the Cardinality for InnoDB secondary keys. This variable will be deleted in MariaDB 11.0 as it is not needed with the new 11.0 optimizer. +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST adjust_secondary_key_cost,disable_max_seek,disable_forced_index_in_group_by,fix_innodb_cardinality +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME OPTIMIZER_EXTRA_PRUNING_DEPTH VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED @@ -3047,7 +3057,7 @@ VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Port number to use for connection or 0 to default to, my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default (3306), whatever comes first NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 4294967295 +NUMERIC_MAX_VALUE 65535 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES @@ -3545,7 +3555,7 @@ VARIABLE_NAME RPL_SEMI_SYNC_MASTER_WAIT_NO_SLAVE VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BOOLEAN -VARIABLE_COMMENT Wait until timeout when no semi-synchronous replication slave available (enabled by default). +VARIABLE_COMMENT Wait until timeout when no semi-synchronous replication slave is available. NUMERIC_MIN_VALUE NULL NUMERIC_MAX_VALUE NULL NUMERIC_BLOCK_SIZE NULL @@ -3642,6 +3652,16 @@ ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED +VARIABLE_NAME SERVER_UID +VARIABLE_SCOPE GLOBAL +VARIABLE_TYPE VARCHAR +VARIABLE_COMMENT Automatically calculated server unique id hash +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME SESSION_TRACK_SCHEMA VARIABLE_SCOPE SESSION VARIABLE_TYPE BOOLEAN diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/allow_suspicious_udfs.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/allow_suspicious_udfs.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/allow_suspicious_udfs.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/allow_suspicious_udfs.test 2024-08-03 07:29:58.000000000 +0000 @@ -5,10 +5,10 @@ SELECT @@allow_suspicious_udfs AS EXPECT_0; # Restart the server the server with "--allow-suspicious-udfs" option ---let $restart_parameters = "--allow-suspicious-udfs" +--let $restart_parameters = --allow-suspicious-udfs --source include/restart_mysqld.inc SELECT @@allow_suspicious_udfs AS EXPECT_1; # Disable "--allow-suspicious-udfs" to restore the original state ---let $restart_parameters = "--skip-allow-suspicious-udfs" +--let $restart_parameters = --skip-allow-suspicious-udfs --source include/restart_mysqld.inc diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/debug_dbug_utf16le.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,29 @@ +--source include/have_debug.inc +--source include/have_utf16.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-28366 GLOBAL debug_dbug setting affected by collation_connection=utf16... +--echo # + +SET NAMES utf8; +SET collation_connection=utf16le_general_ci; +SET debug_dbug='d,any_random_string'; +SELECT @@debug_dbug; +SET debug_dbug=CONCAT('d,', _latin1 0xDF); +SELECT @@debug_dbug; +SELECT HEX(@@debug_dbug); + +SET @@debug_dbug=NULL; +SELECT @@debug_dbug; + +SET @@debug_dbug=DEFAULT; +SELECT @@debug_dbug; +SET NAMES latin1; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/innodb_fil_make_page_dirty_debug_basic.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/innodb_fil_make_page_dirty_debug_basic.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/innodb_fil_make_page_dirty_debug_basic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/innodb_fil_make_page_dirty_debug_basic.test 2024-08-03 07:29:58.000000000 +0000 @@ -31,6 +31,4 @@ set global innodb_fil_make_page_dirty_debug = @space_id; drop table t1; ---echo # Must always be 0. -SELECT @@global.innodb_fil_make_page_dirty_debug; - +set global innodb_fil_make_page_dirty_debug = 0; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/innodb_saved_page_number_debug_basic.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/innodb_saved_page_number_debug_basic.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/innodb_saved_page_number_debug_basic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/innodb_saved_page_number_debug_basic.test 2024-08-03 07:29:58.000000000 +0000 @@ -32,6 +32,7 @@ drop table t1; set global innodb_saved_page_number_debug = 0; +set global innodb_fil_make_page_dirty_debug = 0; SELECT @@global.innodb_saved_page_number_debug; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/old_mode_basic.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/old_mode_basic.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/old_mode_basic.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/old_mode_basic.test 2024-08-03 07:29:58.000000000 +0000 @@ -172,7 +172,7 @@ SELECT @@global.old_mode; --Error ER_WRONG_VALUE_FOR_VAR -SET @@global.old_mode = 64; +SET @@global.old_mode = 128; SELECT @@global.old_mode; # use of decimal values diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/pseudo_slave_mode_notembedded.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/pseudo_slave_mode_notembedded.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/pseudo_slave_mode_notembedded.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/pseudo_slave_mode_notembedded.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,20 @@ +--source include/not_embedded.inc +--source include/load_sysvars.inc + +--echo '### MDEV-32844: THD::rli_fake/rgi_fake not cleared on new connection' +--connect(con1,localhost,root,,) +BINLOG ' +6ENbZQ8BAAAA/AAAAAABAAAAAAQAMTAuMTEuNi1NYXJpYURCLWRlYnVnLWxvZwAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAADoQ1tlEzgNAAgAEgAEBAQEEgAA5AAEGggAAAAICAgCAAAACgoKAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAEEwQADQgICAoKCgGbvv33 +'; +--disconnect con1 +--connect(con1,localhost,root,,) +# The bug was that the THD::rli_fake was not cleared when the THD is re-used +# for the new connection, and we would get a warning from the following +# statement. +SET SESSION pseudo_slave_mode= 1; +--disconnect con1 +--connection default diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/replicate_rewrite_db.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/replicate_rewrite_db.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/replicate_rewrite_db.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/replicate_rewrite_db.test 2024-08-03 07:29:58.000000000 +0000 @@ -63,7 +63,7 @@ SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='replicate_rewrite_db'; --echo # Check restart with appending the value ---let $restart_parameters = "--replicate_rewrite_db='X->Y'" +--let $restart_parameters = --replicate_rewrite_db='X->Y' --source include/restart_mysqld.inc SELECT @@GLOBAL.replicate_rewrite_db; @@ -76,9 +76,6 @@ --replace_regex /mysqld/mariadbd/ /\d\d\d\d-\d*-\d* *\d*:\d*:\d* \d* // --cat_file $MYSQL_TMP_DIR/mysqld--replicate.err # Restart the server with the default options ---let $restart_parameters = "" +--let $restart_parameters = --source include/start_mysqld.inc SELECT @@GLOBAL.replicate_rewrite_db; - ---echo # Cleanup. -SET @@GLOBAL.replicate_rewrite_db = @save_replicate_rewrite_db; diff -Nru mariadb-10.11.6/mysql-test/suite/sys_vars/t/sysvars_star.test mariadb-10.11.9/mysql-test/suite/sys_vars/t/sysvars_star.test --- mariadb-10.11.6/mysql-test/suite/sys_vars/t/sysvars_star.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sys_vars/t/sysvars_star.test 2024-08-03 07:29:58.000000000 +0000 @@ -15,7 +15,7 @@ install soname 'sql_errlog'; vertical_results; -replace_regex /\/.*\//var\//; +replace_regex /(C:)?\/.*\//var\//; select * from information_schema.system_variables where variable_name in ( 'completion_type', #session!=global, origin=compile-time @@ -32,7 +32,7 @@ connect foo,localhost,foo; select global_value_path from information_schema.system_variables where variable_name='plugin_maturity'; connection default; -replace_regex /\/.*\//var\//; +replace_regex /(C:)?\/.*\//var\//; select global_value_path from information_schema.system_variables where variable_name='plugin_maturity'; disconnect foo; drop user foo@localhost; diff -Nru mariadb-10.11.6/mysql-test/suite/sysschema/t/fn_ps_thread_trx_info.test mariadb-10.11.9/mysql-test/suite/sysschema/t/fn_ps_thread_trx_info.test --- mariadb-10.11.6/mysql-test/suite/sysschema/t/fn_ps_thread_trx_info.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/sysschema/t/fn_ps_thread_trx_info.test 2024-08-03 07:29:58.000000000 +0000 @@ -78,7 +78,7 @@ SET @sys.ps_thread_trx_info.max_length = 100; # Should return an error JSON object ---replace_regex /Row 1[1-2] was/Row 1X was/ +--replace_regex /Row \d+ was/Row 1X was/ SELECT sys.ps_thread_trx_info(@ps_thread_id); # Setting the user variable back to NULL should reset to 65535 from sys_config, and no truncation diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/r/func_regexp.result mariadb-10.11.9/mysql-test/suite/vcol/r/func_regexp.result --- mariadb-10.11.6/mysql-test/suite/vcol/r/func_regexp.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/r/func_regexp.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,24 @@ +# +# Start of 10.5 tests +# +# +# MDEV-21058 CREATE TABLE with generated column and RLIKE results in sigabrt +# +CREATE TABLE t1 (c0 INT AS(('' RLIKE '['))); +ERROR 42000: Regex error 'missing terminating ] for character class at offset 1' +CREATE TABLE t1 (c0 INT AS(REGEXP_INSTR('','['))); +ERROR 42000: Regex error 'missing terminating ] for character class at offset 1' +CREATE TABLE t1 +( +c0 INT, +c1 INT AS(('' RLIKE NULL)), +c2 INT AS(REGEXP_INSTR('',NULL)) +); +INSERT INTO t1 (c0) VALUES (0); +SELECT * FROM t1; +c0 c1 c2 +0 NULL NULL +DROP TABLE t1; +# +# End of 10.5 tests +# diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/r/partition.result mariadb-10.11.9/mysql-test/suite/vcol/r/partition.result --- mariadb-10.11.6/mysql-test/suite/vcol/r/partition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/r/partition.result 2024-08-03 07:29:58.000000000 +0000 @@ -101,3 +101,25 @@ insert into t1 (x, b) values (1, ''), (2, ''), (3, 'a'), (4, 'b'); update t1 set b= 'bar' where x > 0 order by v limit 2; drop table t1; +# +# MDEV-28127 EXCHANGE PARTITION with non-matching vcol expression segfault +# +set @old_mode= @@sql_mode; +set sql_mode=''; +create table t1 (a int, key(a)) partition by range (a) (partition p values less than (1)); +create table t (a int generated always as (1) virtual, key(a)); +alter table t1 exchange partition p with table t; +ERROR HY000: Tables have different definitions +create or replace table t (a int, key(a)); +alter table t1 exchange partition p with table t; +create or replace table t1 (a int generated always as (1) virtual, key(a)) partition by range (a) (partition p values less than (1)); +create or replace table t (a int generated always as (1) virtual, key(a)); +alter table t1 exchange partition p with table t; +create or replace table t (a int generated always as (1) stored, key(a)); +alter table t1 exchange partition p with table t; +ERROR HY000: Tables have different definitions +insert into t values (1); +Warnings: +Warning 1906 The value specified for generated column 'a' in table 't' has been ignored +drop tables t1, t; +set sql_mode= @old_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/r/vcol_keys_myisam.result mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_keys_myisam.result --- mariadb-10.11.6/mysql-test/suite/vcol/r/vcol_keys_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_keys_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -418,3 +418,40 @@ insert into t2 (pk) select a from t1; ERROR 23000: Duplicate entry '1' for key 'PRIMARY' drop tables t1, t2; +# +# MDEV-23294 Segfault or assertion upon MyISAM repair +# +set @old_mode= @@sql_mode; +set @old_myisam_repair_threads= @@myisam_repair_threads; +set sql_mode='', myisam_repair_threads=2; +create table t (a binary,b blob,c blob as (concat (a,b)),h char,index (c)) engine=innodb; +Warnings: +Warning 1286 Unknown storage engine 'innodb' +Warning 1266 Using storage engine MyISAM for table 't' +Note 1071 Specified key was too long; max key length is 1000 bytes +insert into t values (0,0,default,0); +create table ti like t; +alter table ti engine=myisam; +insert into ti select * from t; +Warnings: +Warning 1906 The value specified for generated column 'c' in table 'ti' has been ignored +drop tables ti, t; +create table t (id int,a varchar(1),b varchar(1),c varchar(1) generated always as (concat (a,b)),key(c)) engine=myisam; +insert into t values (0,0,9687,0); +Warnings: +Warning 1265 Data truncated for column 'b' at row 1 +Warning 1906 The value specified for generated column 'c' in table 't' has been ignored +Warning 1265 Data truncated for column 'c' at row 1 +repair table t quick; +Table Op Msg_type Msg_text +test.t repair status OK +drop table t; +create table t1 (b varchar(1024), c char(3), unique(b,c)) engine=myisam; +insert into t1 values ('foo','baz'); +alter table t1 disable keys; +set session myisam_repair_threads= 2; +insert into t1 select 'qux'; +ERROR 21S01: Column count doesn't match value count at row 1 +drop table t1; +set sql_mode= @old_mode; +set myisam_repair_threads= @old_myisam_repair_threads; diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/r/vcol_syntax.result mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_syntax.result --- mariadb-10.11.6/mysql-test/suite/vcol/r/vcol_syntax.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_syntax.result 2024-08-03 07:29:58.000000000 +0000 @@ -238,3 +238,13 @@ Warning 1292 Incorrect datetime value: '0' for column `test`.`t`.`c2` at row 1 drop trigger tr; drop table t; +# +# MDEV-29932 Invalid expr in cleanup_session_expr() upon INSERT DELAYED +# +create table t (f timestamp default from_unixtime(1), g timestamp as (from_unixtime(2))); +insert delayed into t values (); +flush table t; +select unix_timestamp(f), unix_timestamp(g) from t; +unix_timestamp(f) unix_timestamp(g) +1 2 +drop table t; diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/r/vcol_utf32.result mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_utf32.result --- mariadb-10.11.6/mysql-test/suite/vcol/r/vcol_utf32.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/r/vcol_utf32.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,37 @@ +# +# MDEV-27966 Assertion `fixed()' failed and Assertion `fixed == 1' failed, both in Item_func_concat::val_str on SELECT after INSERT with collation utf32_bin on utf8_bin table +# +SET NAMES utf8mb3; +SET sql_mode=''; +CREATE TABLE t (c1 INT,c2 CHAR AS (CONCAT ('',DAYNAME ('')))) COLLATE utf8_bin ENGINE=InnoDB; +Warnings: +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1266 Using storage engine MyISAM for table 't' +INSERT INTO t VALUES (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0); +Warnings: +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +Warning 1906 The value specified for generated column 'c2' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '' +SET collation_connection='utf32_bin'; +INSERT INTO t VALUES (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0); +ERROR HY000: Illegal mix of collations (utf8mb3_bin,COERCIBLE) and (utf32_bin,COERCIBLE) for operation 'concat' +SELECT * FROM t; +ERROR HY000: Illegal mix of collations (utf8mb3_bin,COERCIBLE) and (utf32_bin,COERCIBLE) for operation 'concat' +DROP TABLE t; +SET sql_mode=DEFAULT; +SET NAMES utf8mb3; diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/t/func_regexp.test mariadb-10.11.9/mysql-test/suite/vcol/t/func_regexp.test --- mariadb-10.11.6/mysql-test/suite/vcol/t/func_regexp.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/t/func_regexp.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,30 @@ +--source inc/vcol_init_vars.pre +--source inc/vcol_cleanup.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-21058 CREATE TABLE with generated column and RLIKE results in sigabrt +--echo # + +--error ER_REGEXP_ERROR +CREATE TABLE t1 (c0 INT AS(('' RLIKE '['))); + +--error ER_REGEXP_ERROR +CREATE TABLE t1 (c0 INT AS(REGEXP_INSTR('','['))); + +CREATE TABLE t1 +( + c0 INT, + c1 INT AS(('' RLIKE NULL)), + c2 INT AS(REGEXP_INSTR('',NULL)) +); +INSERT INTO t1 (c0) VALUES (0); +SELECT * FROM t1; +DROP TABLE t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/t/partition.test mariadb-10.11.9/mysql-test/suite/vcol/t/partition.test --- mariadb-10.11.6/mysql-test/suite/vcol/t/partition.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/t/partition.test 2024-08-03 07:29:58.000000000 +0000 @@ -78,3 +78,24 @@ insert into t1 (x, b) values (1, ''), (2, ''), (3, 'a'), (4, 'b'); update t1 set b= 'bar' where x > 0 order by v limit 2; drop table t1; + +--echo # +--echo # MDEV-28127 EXCHANGE PARTITION with non-matching vcol expression segfault +--echo # +set @old_mode= @@sql_mode; +set sql_mode=''; +create table t1 (a int, key(a)) partition by range (a) (partition p values less than (1)); +create table t (a int generated always as (1) virtual, key(a)); +--error ER_TABLES_DIFFERENT_METADATA +alter table t1 exchange partition p with table t; +create or replace table t (a int, key(a)); +alter table t1 exchange partition p with table t; +create or replace table t1 (a int generated always as (1) virtual, key(a)) partition by range (a) (partition p values less than (1)); +create or replace table t (a int generated always as (1) virtual, key(a)); +alter table t1 exchange partition p with table t; +create or replace table t (a int generated always as (1) stored, key(a)); +--error ER_TABLES_DIFFERENT_METADATA +alter table t1 exchange partition p with table t; +insert into t values (1); +drop tables t1, t; +set sql_mode= @old_mode; diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/t/vcol_keys_myisam.test mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_keys_myisam.test --- mariadb-10.11.6/mysql-test/suite/vcol/t/vcol_keys_myisam.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_keys_myisam.test 2024-08-03 07:29:58.000000000 +0000 @@ -313,3 +313,32 @@ --error ER_DUP_ENTRY insert into t2 (pk) select a from t1; drop tables t1, t2; + +--echo # +--echo # MDEV-23294 Segfault or assertion upon MyISAM repair +--echo # +set @old_mode= @@sql_mode; +set @old_myisam_repair_threads= @@myisam_repair_threads; +set sql_mode='', myisam_repair_threads=2; +create table t (a binary,b blob,c blob as (concat (a,b)),h char,index (c)) engine=innodb; +insert into t values (0,0,default,0); +create table ti like t; +alter table ti engine=myisam; +insert into ti select * from t; +drop tables ti, t; + +create table t (id int,a varchar(1),b varchar(1),c varchar(1) generated always as (concat (a,b)),key(c)) engine=myisam; +insert into t values (0,0,9687,0); +repair table t quick; +drop table t; + +create table t1 (b varchar(1024), c char(3), unique(b,c)) engine=myisam; +insert into t1 values ('foo','baz'); +alter table t1 disable keys; +set session myisam_repair_threads= 2; +--error ER_WRONG_VALUE_COUNT_ON_ROW +insert into t1 select 'qux'; +# cleanup +drop table t1; +set sql_mode= @old_mode; +set myisam_repair_threads= @old_myisam_repair_threads; diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/t/vcol_syntax.test mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_syntax.test --- mariadb-10.11.6/mysql-test/suite/vcol/t/vcol_syntax.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_syntax.test 2024-08-03 07:29:58.000000000 +0000 @@ -187,3 +187,13 @@ drop trigger tr; drop table t; + +--echo # +--echo # MDEV-29932 Invalid expr in cleanup_session_expr() upon INSERT DELAYED +--echo # +create table t (f timestamp default from_unixtime(1), g timestamp as (from_unixtime(2))); +insert delayed into t values (); +flush table t; +select unix_timestamp(f), unix_timestamp(g) from t; +# Cleanup +drop table t; diff -Nru mariadb-10.11.6/mysql-test/suite/vcol/t/vcol_utf32.test mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_utf32.test --- mariadb-10.11.6/mysql-test/suite/vcol/t/vcol_utf32.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/vcol/t/vcol_utf32.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,18 @@ +--source include/have_utf32.inc + +--echo # +--echo # MDEV-27966 Assertion `fixed()' failed and Assertion `fixed == 1' failed, both in Item_func_concat::val_str on SELECT after INSERT with collation utf32_bin on utf8_bin table +--echo # + +SET NAMES utf8mb3; +SET sql_mode=''; +CREATE TABLE t (c1 INT,c2 CHAR AS (CONCAT ('',DAYNAME ('')))) COLLATE utf8_bin ENGINE=InnoDB; +INSERT INTO t VALUES (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0); +SET collation_connection='utf32_bin'; +--error ER_CANT_AGGREGATE_2COLLATIONS +INSERT INTO t VALUES (0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0),(0,0); +--error ER_CANT_AGGREGATE_2COLLATIONS +SELECT * FROM t; +DROP TABLE t; +SET sql_mode=DEFAULT; +SET NAMES utf8mb3; diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/r/alter.result mariadb-10.11.9/mysql-test/suite/versioning/r/alter.result --- mariadb-10.11.6/mysql-test/suite/versioning/r/alter.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/r/alter.result 2024-08-03 07:29:58.000000000 +0000 @@ -787,6 +787,77 @@ ERROR HY000: PERIOD FOR SYSTEM_TIME must use columns `row_start` and `row_end` drop table t1; # +# MDEV-20545 Assertion (col.vers_sys_end()) upon inplace ALTER with virtual columns +# +create table t1 ( +a int, +va int as (a) virtual, +b int, +vb int as (b) virtual, +c int, +vc int as (c) virtual, +d int, +e int, +index(va) +) engine=innodb with system versioning; +replace into t1 () values (),(); +set statement system_versioning_alter_history=keep for alter table t1 drop e; +alter table t1 algorithm=inplace, drop system versioning; +drop table t1; +# +# MDEV-20765 Assertion (type.vers_sys_end()) upon inplace ALTER with virtual columns +# +create table t1 ( +a int, +b int as (a) virtual, +c int, +d int as (c) virtual, +e int, +f int as (e) virtual, +g int, +h int, +i int, +index(d), +key(h), +foreign key (g) references t1 (h) +) engine=innodb with system versioning; +set system_versioning_alter_history= keep; +alter table t1 drop column i; +insert into t1 (g,h) values (1,1); +drop table t1; +# +# MDEV-29034 Assertion (o->ind == vers_start) upon inplace ALTER with virtual columns +# +create table b ( +pk integer auto_increment, +col_int_key integer, +col_varchar_key varchar(1), +o bit, n bit, +h float as ( n + 2 ) virtual, +v bit, +primary key (pk), +key (col_varchar_key, col_int_key) +) engine = innodb; +set `system_versioning_alter_history`= keep; +alter table `b` add system versioning; +alter table `b` add column if not exists ( w bit, v serial ); +Warnings: +Note 1060 Duplicate column name 'v' +alter table `b` add column if not exists ( p bit ); +drop table `b`; +# +# MDEV-30528 Assertion !mbmaxlen || ... failed +# in dtype_get_at_most_n_mbchars() +# +CREATE TABLE t(f TEXT) WITH SYSTEM VERSIONING CHARACTER SET utf8 ENGINE=InnoDB; +INSERT INTO t VALUES ('foo'); +DELETE FROM t; +ALTER TABLE t ADD FULLTEXT (f); +affected rows: 1 +info: Records: 1 Duplicates: 0 Warnings: 0 +DROP TABLE t; +# End of 10.4 tests +# # MDEV-21941 RENAME doesn't work for system time or period fields # create or replace table t1 (a int) with system versioning; diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/r/data.result mariadb-10.11.9/mysql-test/suite/versioning/r/data.result --- mariadb-10.11.6/mysql-test/suite/versioning/r/data.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/r/data.result 2024-08-03 07:29:58.000000000 +0000 @@ -10,6 +10,7 @@ delete from t1 where x=2; set timestamp=default; #MYSQL_DUMP --compact test +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -19,6 +20,7 @@ INSERT INTO `t1` VALUES (3); #MYSQL_DUMP --compact --as-of="1990-01-02 00:00" test +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -30,6 +32,7 @@ (2), (3); #MYSQL_DUMP --compact --as-of="1990-08-02 00:00" --databases test +/*M!999999\- enable the sandbox mode */ CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */; @@ -45,6 +48,7 @@ (2), (3); #MYSQL_DUMP --compact --as-of="1990-08-04 00:00" test t1 +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -87,6 +91,7 @@ x check_fields(x, row_start, row_end) 1 [CORRECT] 2 [CORRECT] +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( @@ -194,6 +199,7 @@ delete from t1 where x=1; mariadb-dump: Cannot use --dump-history for table `t1` with transaction-precise history mariadb-dump: Cannot use --dump-history for table `t1` with transaction-precise history +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t1` ( diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/r/delete_history.result mariadb-10.11.9/mysql-test/suite/versioning/r/delete_history.result --- mariadb-10.11.6/mysql-test/suite/versioning/r/delete_history.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/r/delete_history.result 2024-08-03 07:29:58.000000000 +0000 @@ -193,7 +193,7 @@ # MDEV-25004 Missing row in FTS_DOC_ID_INDEX during DELETE HISTORY # create table t1 (a integer, c0 varchar(255), fulltext key (c0)) -with system versioning engine innodb; +with system versioning engine innodb stats_persistent=0; set system_versioning_alter_history= keep; alter table t1 drop system versioning; alter table t1 add system versioning; @@ -203,7 +203,7 @@ delete history from t1; drop table t1; create table t1 (id int primary key, ftx varchar(255)) -with system versioning engine innodb; +with system versioning engine innodb stats_persistent=0; insert into t1 values (1, 'c'); delete from t1; alter table t1 add fulltext key(ftx); diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/r/partition,heap.rdiff mariadb-10.11.9/mysql-test/suite/versioning/r/partition,heap.rdiff --- mariadb-10.11.6/mysql-test/suite/versioning/r/partition,heap.rdiff 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/r/partition,heap.rdiff 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,6 @@ -@@ -2132,85 +2132,6 @@ +--- partition.result 2024-07-19 08:48:17.680094893 +0200 ++++ partition,heap.result 2024-07-19 11:32:08.570439183 +0200 +@@ -2244,85 +2244,6 @@ (PARTITION `p0` HISTORY ENGINE = X, PARTITION `pn` CURRENT ENGINE = X) drop tables t1, tp1; @@ -32,7 +34,7 @@ -tp1 CREATE TABLE `tp1` ( - `x` int(11) NOT NULL AUTO_INCREMENT, - `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', -- `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, +- `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, - `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, - `u` int(11) DEFAULT NULL, - `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -57,7 +59,7 @@ -t1 CREATE TABLE `t1` ( - `x` int(11) NOT NULL AUTO_INCREMENT, - `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', -- `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, +- `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, - `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, - `u` int(11) DEFAULT NULL, - `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -82,9 +84,9 @@ - PARTITION `pn` VALUES LESS THAN MAXVALUE ENGINE = X) -drop tables t1, tp1; # - # End of 10.7 tests + # MDEV-29841 Partition by system_time can be converted into table but not back # -@@ -2765,134 +2686,6 @@ +@@ -2886,134 +2807,6 @@ Warning 4114 Versioned table `test`.`t1`: last HISTORY partition (`p0`) is out of INTERVAL, need more HISTORY partitions drop prepare s; affected rows: 0 @@ -118,7 +120,7 @@ -t1 CREATE TABLE `t1` ( - `x` int(11) NOT NULL AUTO_INCREMENT, - `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', -- `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, +- `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, - `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, - `u` int(11) DEFAULT NULL, - `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -155,7 +157,7 @@ -t1 CREATE TABLE `t1` ( - `x` int(11) NOT NULL AUTO_INCREMENT, - `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', -- `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, +- `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, - `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, - `u` int(11) DEFAULT NULL, - `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -190,7 +192,7 @@ -t1 CREATE TABLE `t1` ( - `x` int(11) NOT NULL AUTO_INCREMENT, - `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', -- `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, +- `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, - `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, - `u` int(11) DEFAULT NULL, - `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/r/partition.result mariadb-10.11.9/mysql-test/suite/versioning/r/partition.result --- mariadb-10.11.6/mysql-test/suite/versioning/r/partition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/r/partition.result 2024-08-03 07:29:58.000000000 +0000 @@ -2274,7 +2274,7 @@ tp1 CREATE TABLE `tp1` ( `x` int(11) NOT NULL AUTO_INCREMENT, `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', - `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, + `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `u` int(11) DEFAULT NULL, `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -2299,7 +2299,7 @@ t1 CREATE TABLE `t1` ( `x` int(11) NOT NULL AUTO_INCREMENT, `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', - `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, + `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `u` int(11) DEFAULT NULL, `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -2916,7 +2916,7 @@ t1 CREATE TABLE `t1` ( `x` int(11) NOT NULL AUTO_INCREMENT, `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', - `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, + `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `u` int(11) DEFAULT NULL, `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -2953,7 +2953,7 @@ t1 CREATE TABLE `t1` ( `x` int(11) NOT NULL AUTO_INCREMENT, `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', - `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, + `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `u` int(11) DEFAULT NULL, `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -2988,7 +2988,7 @@ t1 CREATE TABLE `t1` ( `x` int(11) NOT NULL AUTO_INCREMENT, `t` timestamp(6) NULL DEFAULT '2001-11-11 11:11:11.000000', - `b` blob /*!100301 COMPRESSED*/ DEFAULT NULL, + `b` blob /*M!100301 COMPRESSED*/ DEFAULT NULL, `c` varchar(1033) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL, `u` int(11) DEFAULT NULL, `m` enum('a','b','c') NOT NULL DEFAULT 'a' COMMENT 'absolute', @@ -3447,4 +3447,27 @@ # # End of 10.5 tests # +# +# MDEV-31903 Server crashes in _ma_reset_history upon UNLOCK table with auto-create history partitions +# +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +create table t1 (x int) engine=aria with system versioning partition by system_time interval 1 hour auto partitions 3; +insert into t1 values (1); +create table t2 (x int) engine=aria; +create trigger tr after insert on t2 for each row update t1 set x= x + 11; +lock tables t1 write, t2 write; +update t1 set x= x + 1; +set timestamp= unix_timestamp('2000-01-01 13:00:00'); +insert into t2 values (5); +unlock tables; +drop table t1, t2; +set timestamp= default; +# +# MDEV-29872 MSAN/Valgrind uninitialised value errors in TABLE::vers_switch_partition +# +create table t (a int) with system versioning partition by system_time limit 100 partitions 3; +drop table t; +# +# End of 10.9 tests +# set global innodb_stats_persistent= @save_persistent; diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/r/select.result mariadb-10.11.9/mysql-test/suite/versioning/r/select.result --- mariadb-10.11.6/mysql-test/suite/versioning/r/select.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/r/select.result 2024-08-03 07:29:58.000000000 +0000 @@ -443,7 +443,7 @@ select * from t1 for system_time as of current_timestamp; x select * from t1 for system_time as of now; -ERROR 42S22: Unknown column 'now' in 'FOR SYSTEM_TIME' +ERROR HY000: Illegal parameter data type now for operation 'FOR SYSTEM_TIME' ### Issue #405, NATURAL JOIN failure create or replace table t1 (a int) with system versioning; create or replace table t2 (b int); @@ -708,3 +708,12 @@ 33 1 1 1 1 34 1 1 1 1 SET GLOBAL innodb_stats_persistent = @saved_stats_persistent; +# +# MDEV-32082 Server crash in find_field_in_table +# +create table t0 (c0 int) with system versioning; +select x0 from ( +select c0 x0 from t0 +) for system_time as of nowasdf deriv; +ERROR HY000: Illegal parameter data type nowasdf for operation 'FOR SYSTEM_TIME' +drop table t0; diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/t/alter.test mariadb-10.11.9/mysql-test/suite/versioning/t/alter.test --- mariadb-10.11.6/mysql-test/suite/versioning/t/alter.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/t/alter.test 2024-08-03 07:29:58.000000000 +0000 @@ -680,6 +680,82 @@ # cleanup drop table t1; +--echo # +--echo # MDEV-20545 Assertion (col.vers_sys_end()) upon inplace ALTER with virtual columns +--echo # +create table t1 ( + a int, + va int as (a) virtual, + b int, + vb int as (b) virtual, + c int, + vc int as (c) virtual, + d int, + e int, + index(va) +) engine=innodb with system versioning; +replace into t1 () values (),(); +set statement system_versioning_alter_history=keep for alter table t1 drop e; +alter table t1 algorithm=inplace, drop system versioning; +# cleanup +drop table t1; + +--echo # +--echo # MDEV-20765 Assertion (type.vers_sys_end()) upon inplace ALTER with virtual columns +--echo # +create table t1 ( + a int, + b int as (a) virtual, + c int, + d int as (c) virtual, + e int, + f int as (e) virtual, + g int, + h int, + i int, + index(d), + key(h), + foreign key (g) references t1 (h) +) engine=innodb with system versioning; +set system_versioning_alter_history= keep; +alter table t1 drop column i; +insert into t1 (g,h) values (1,1); +# cleanup +drop table t1; + +--echo # +--echo # MDEV-29034 Assertion (o->ind == vers_start) upon inplace ALTER with virtual columns +--echo # +create table b ( + pk integer auto_increment, + col_int_key integer, + col_varchar_key varchar(1), + o bit, n bit, + h float as ( n + 2 ) virtual, + v bit, + primary key (pk), + key (col_varchar_key, col_int_key) +) engine = innodb; +set `system_versioning_alter_history`= keep; +alter table `b` add system versioning; +alter table `b` add column if not exists ( w bit, v serial ); +alter table `b` add column if not exists ( p bit ); +drop table `b`; + +--echo # +--echo # MDEV-30528 Assertion !mbmaxlen || ... failed +--echo # in dtype_get_at_most_n_mbchars() +--echo # + +CREATE TABLE t(f TEXT) WITH SYSTEM VERSIONING CHARACTER SET utf8 ENGINE=InnoDB; +INSERT INTO t VALUES ('foo'); +DELETE FROM t; +--enable_info +ALTER TABLE t ADD FULLTEXT (f); +--disable_info +DROP TABLE t; + +--echo # End of 10.4 tests --echo # --echo # MDEV-21941 RENAME doesn't work for system time or period fields diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/t/delete_history.test mariadb-10.11.9/mysql-test/suite/versioning/t/delete_history.test --- mariadb-10.11.6/mysql-test/suite/versioning/t/delete_history.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/t/delete_history.test 2024-08-03 07:29:58.000000000 +0000 @@ -195,7 +195,7 @@ --echo # MDEV-25004 Missing row in FTS_DOC_ID_INDEX during DELETE HISTORY --echo # create table t1 (a integer, c0 varchar(255), fulltext key (c0)) -with system versioning engine innodb; +with system versioning engine innodb stats_persistent=0; set system_versioning_alter_history= keep; alter table t1 drop system versioning; alter table t1 add system versioning; @@ -206,7 +206,7 @@ drop table t1; create table t1 (id int primary key, ftx varchar(255)) -with system versioning engine innodb; +with system versioning engine innodb stats_persistent=0; insert into t1 values (1, 'c'); delete from t1; alter table t1 add fulltext key(ftx); diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/t/partition.test mariadb-10.11.9/mysql-test/suite/versioning/t/partition.test --- mariadb-10.11.6/mysql-test/suite/versioning/t/partition.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/t/partition.test 2024-08-03 07:29:58.000000000 +0000 @@ -2673,5 +2673,43 @@ --echo # End of 10.5 tests --echo # +--echo # +--echo # MDEV-31903 Server crashes in _ma_reset_history upon UNLOCK table with auto-create history partitions +--echo # +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +create table t1 (x int) engine=aria with system versioning partition by system_time interval 1 hour auto partitions 3; +insert into t1 values (1); + +create table t2 (x int) engine=aria; +create trigger tr after insert on t2 for each row update t1 set x= x + 11; +lock tables t1 write, t2 write; +update t1 set x= x + 1; +set timestamp= unix_timestamp('2000-01-01 13:00:00'); +insert into t2 values (5); +unlock tables; +drop table t1, t2; +set timestamp= default; + +--echo # +--echo # MDEV-29872 MSAN/Valgrind uninitialised value errors in TABLE::vers_switch_partition +--echo # +create table t (a int) with system versioning partition by system_time limit 100 partitions 3; +let $emb= `select if(version() like '%embedded%', 1, 0)`; +if (!$emb) +{ + --disable_result_log + --disable_query_log + --error ER_DELAYED_NOT_SUPPORTED + insert delayed into t () values (); + --enable_query_log + --enable_result_log +} +# cleanup +drop table t; + +--echo # +--echo # End of 10.9 tests +--echo # + set global innodb_stats_persistent= @save_persistent; --source suite/versioning/common_finish.inc diff -Nru mariadb-10.11.6/mysql-test/suite/versioning/t/select.test mariadb-10.11.9/mysql-test/suite/versioning/t/select.test --- mariadb-10.11.6/mysql-test/suite/versioning/t/select.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/versioning/t/select.test 2024-08-03 07:29:58.000000000 +0000 @@ -314,7 +314,7 @@ --echo ### Issue #398, NOW is now non-magic create or replace table t1 (x int) with system versioning; select * from t1 for system_time as of current_timestamp; ---error ER_BAD_FIELD_ERROR +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION select * from t1 for system_time as of now; --echo ### Issue #405, NATURAL JOIN failure @@ -487,4 +487,14 @@ SET GLOBAL innodb_stats_persistent = @saved_stats_persistent; +--echo # +--echo # MDEV-32082 Server crash in find_field_in_table +--echo # +create table t0 (c0 int) with system versioning; +--error ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION +select x0 from ( + select c0 x0 from t0 +) for system_time as of nowasdf deriv; +drop table t0; + -- source suite/versioning/common_finish.inc diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/disabled.def mariadb-10.11.9/mysql-test/suite/wsrep/disabled.def --- mariadb-10.11.6/mysql-test/suite/wsrep/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/disabled.def 2024-08-03 07:29:58.000000000 +0000 @@ -11,7 +11,3 @@ ############################################################################## -mdev_6832: wsrep_provider is read-only for security reasons -MDEV-23092: wsrep_provider is read-only for security reasons -wsrep_variables_no_provider: wsrep_provider is read-only for security reasons -MDEV-22443: it is no longer allowed enable wsrep_on if wsrep_provider is 'none' diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/r/MDEV-22443.result mariadb-10.11.9/mysql-test/suite/wsrep/r/MDEV-22443.result --- mariadb-10.11.6/mysql-test/suite/wsrep/r/MDEV-22443.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/r/MDEV-22443.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -SET SESSION wsrep_sync_wait=15; -SET SESSION wsrep_on=1; -START TRANSACTION READ WRITE; diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/r/MDEV-23092.result mariadb-10.11.9/mysql-test/suite/wsrep/r/MDEV-23092.result --- mariadb-10.11.6/mysql-test/suite/wsrep/r/MDEV-23092.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/r/MDEV-23092.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -SET COLLATION_CONNECTION='utf16le_bin'; -SET GLOBAL wsrep_provider='/invalid/path/libgalera_smm.so'; -ERROR 42000: Variable 'wsrep_provider' can't be set to the value of '/' -SET GLOBAL wsrep_cluster_address='OFF'; -SET GLOBAL wsrep_slave_threads=10; -SELECT 1; -1 -1 -SET GLOBAL wsrep_cluster_address='gcomm://'; -SET GLOBAL wsrep_slave_threads=DEFAULT; -CALL mtr.add_suppression("wsrep_load()"); -CALL mtr.add_suppression("Failed to create a new provider"); -CALL mtr.add_suppression("Failed to load provider"); diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/r/mdev_6832.result mariadb-10.11.9/mysql-test/suite/wsrep/r/mdev_6832.result --- mariadb-10.11.6/mysql-test/suite/wsrep/r/mdev_6832.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/r/mdev_6832.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -# -# MDEV-6832: ER_LOCK_WAIT_TIMEOUT on SHOW STATUS -# -SHOW STATUS LIKE 'wsrep_ready'; -Variable_name Value -wsrep_ready ON -SHOW STATUS LIKE 'wsrep_ready'; -Variable_name Value -wsrep_ready OFF -SET @@global.wsrep_cluster_address='gcomm://'; -# End of test. diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/r/wsrep_variables_no_provider.result mariadb-10.11.9/mysql-test/suite/wsrep/r/wsrep_variables_no_provider.result --- mariadb-10.11.6/mysql-test/suite/wsrep/r/wsrep_variables_no_provider.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/r/wsrep_variables_no_provider.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -SELECT @@wsrep_on; -@@wsrep_on -1 -SET @wsrep_slave_threads_global_saved = @@global.wsrep_slave_threads; -SET @wsrep_debug_saved = @@global.wsrep_debug; -SET @wsrep_provider_options_saved= @@global.wsrep_provider_options; -SET @wsrep_cluster_address_saved= @@global.wsrep_cluster_address; -SET GLOBAL wsrep_provider=none; -SET SESSION wsrep_trx_fragment_size=DEFAULT; -ERROR HY000: Incorrect arguments to SET -SELECT @@session.wsrep_trx_fragment_size; -@@session.wsrep_trx_fragment_size -0 -SET GLOBAL wsrep_start_position='12345678-1234-1234-1234-123456789012:100'; -ERROR 42000: Variable 'wsrep_start_position' can't be set to the value of '12345678-1234-1234-1234-123456789012:100' -SHOW WARNINGS; -Level Code Message -Warning 1231 Cannot set 'wsrep_start_position' because wsrep is switched off or provider is not loaded -Error 1231 Variable 'wsrep_start_position' can't be set to the value of '12345678-1234-1234-1234-123456789012:100' -SELECT @@global.wsrep_start_position; -@@global.wsrep_start_position -00000000-0000-0000-0000-000000000000:-1 -SET GLOBAL wsrep_debug=1; -Warnings: -Warning 1231 Setting 'wsrep_debug' has no effect because wsrep is switched off -SELECT @@global.wsrep_debug; -@@global.wsrep_debug -NONE -SET GLOBAL wsrep_slave_threads=5; -SELECT @@global.wsrep_slave_threads; -@@global.wsrep_slave_threads -5 -SET GLOBAL wsrep_desync=1; -ERROR HY000: WSREP (galera) not started -SELECT @@global.wsrep_desync; -@@global.wsrep_desync -0 -SET SESSION wsrep_trx_fragment_unit='rows'; -ERROR HY000: Incorrect arguments to SET -SELECT @@session.wsrep_trx_fragment_unit; -@@session.wsrep_trx_fragment_unit -rows -SET @@global.wsrep_slave_threads = @wsrep_slave_threads_global_saved; -SET @@global.wsrep_debug = @wsrep_debug_saved; diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-22443.cnf mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-22443.cnf --- mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-22443.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-22443.cnf 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -!include ../my.cnf - -[mysqld.1] -wsrep-on=OFF -binlog-format=ROW -wsrep-provider=none -wsrep-cluster-address='gcomm://' -innodb_autoinc_lock_mode=2 diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-22443.test mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-22443.test --- mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-22443.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-22443.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -# -# MDEV-22443: terminate called after throwing an instance of -# 'wsrep::runtime_error' in std::terminate on START TRANSACTION -# - ---source include/have_innodb.inc ---source include/have_wsrep.inc ---source include/have_binlog_format_row.inc - -SET SESSION wsrep_sync_wait=15; -SET SESSION wsrep_on=1; -START TRANSACTION READ WRITE; diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-23092.cnf mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-23092.cnf --- mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-23092.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-23092.cnf 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -!include ../my.cnf - -[mysqld.1] -wsrep-on=OFF -binlog-format=ROW -wsrep-provider=none -wsrep-cluster-address='gcomm://' -innodb_autoinc_lock_mode=2 diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-23092.test mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-23092.test --- mariadb-10.11.6/mysql-test/suite/wsrep/t/MDEV-23092.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/MDEV-23092.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# -# MDEV-23092: SIGABRT in wsrep::server_state::provider when setting -# invalid wsrep_provider (on optimized builds) -# - ---source include/have_innodb.inc ---source include/have_wsrep.inc ---source include/have_binlog_format_row.inc - -SET COLLATION_CONNECTION='utf16le_bin'; ---error 1231 -SET GLOBAL wsrep_provider='/invalid/path/libgalera_smm.so'; -SET GLOBAL wsrep_cluster_address='OFF'; -SET GLOBAL wsrep_slave_threads=10; -SELECT 1; - -SET GLOBAL wsrep_cluster_address='gcomm://'; -SET GLOBAL wsrep_slave_threads=DEFAULT; - -CALL mtr.add_suppression("wsrep_load()"); -CALL mtr.add_suppression("Failed to create a new provider"); -CALL mtr.add_suppression("Failed to load provider"); diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/mdev_6832.cnf mariadb-10.11.9/mysql-test/suite/wsrep/t/mdev_6832.cnf --- mariadb-10.11.6/mysql-test/suite/wsrep/t/mdev_6832.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/mdev_6832.cnf 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -!include ../my.cnf - -[mysqld.1] -wsrep-on=ON -wsrep-provider=@ENV.WSREP_PROVIDER -wsrep-cluster-address=gcomm:// - diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/mdev_6832.test mariadb-10.11.9/mysql-test/suite/wsrep/t/mdev_6832.test --- mariadb-10.11.6/mysql-test/suite/wsrep/t/mdev_6832.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/mdev_6832.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ ---source include/have_innodb.inc ---source include/have_wsrep_provider.inc ---source include/have_binlog_format_row.inc - ---echo # ---echo # MDEV-6832: ER_LOCK_WAIT_TIMEOUT on SHOW STATUS ---echo # - -SHOW STATUS LIKE 'wsrep_ready'; ---disable_query_log -eval SET @@global.wsrep_provider='$WSREP_PROVIDER'; ---enable_query_log -SHOW STATUS LIKE 'wsrep_ready'; -SET @@global.wsrep_cluster_address='gcomm://'; ---let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; ---source include/wait_condition.inc ---echo # End of test. diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.cnf mariadb-10.11.9/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.cnf --- mariadb-10.11.6/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.cnf 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -# Use default setting for mysqld processes -!include include/default_mysqld.cnf - -[mysqld.1] -wsrep-on=ON -binlog-format=ROW -wsrep-provider=@ENV.WSREP_PROVIDER -wsrep-cluster-address='gcomm://' -#galera_port=@OPT.port -#ist_port=@OPT.port -#sst_port=@OPT.port - diff -Nru mariadb-10.11.6/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.test mariadb-10.11.9/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.test --- mariadb-10.11.6/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite/wsrep/t/wsrep_variables_no_provider.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ ---source include/have_wsrep.inc ---source include/have_innodb.inc - -SELECT @@wsrep_on; - -SET @wsrep_slave_threads_global_saved = @@global.wsrep_slave_threads; -SET @wsrep_debug_saved = @@global.wsrep_debug; -SET @wsrep_provider_options_saved= @@global.wsrep_provider_options; -SET @wsrep_cluster_address_saved= @@global.wsrep_cluster_address; - -SET GLOBAL wsrep_provider=none; - ---error ER_WRONG_ARGUMENTS -SET SESSION wsrep_trx_fragment_size=DEFAULT; -SELECT @@session.wsrep_trx_fragment_size; ---error ER_WRONG_VALUE_FOR_VAR -SET GLOBAL wsrep_start_position='12345678-1234-1234-1234-123456789012:100'; -SHOW WARNINGS; -SELECT @@global.wsrep_start_position; -SET GLOBAL wsrep_debug=1; -SELECT @@global.wsrep_debug; -SET GLOBAL wsrep_slave_threads=5; -SELECT @@global.wsrep_slave_threads; ---error ER_WRONG_ARGUMENTS -SET GLOBAL wsrep_desync=1; -SELECT @@global.wsrep_desync; ---error ER_WRONG_ARGUMENTS -SET SESSION wsrep_trx_fragment_unit='rows'; -SELECT @@session.wsrep_trx_fragment_unit; - ---disable_query_log -eval SET GLOBAL wsrep_provider= '$WSREP_PROVIDER'; -SET GLOBAL wsrep_cluster_address= @wsrep_cluster_address_saved; -SET GLOBAL wsrep_provider_options= @wsrep_provider_options_saved; ---source include/galera_wait_ready.inc -SET @@global.wsrep_slave_threads = @wsrep_slave_threads_global_saved; -SET @@global.wsrep_debug = @wsrep_debug_saved; ---enable_query_log diff -Nru mariadb-10.11.6/mysql-test/suite.pm mariadb-10.11.9/mysql-test/suite.pm --- mariadb-10.11.6/mysql-test/suite.pm 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/suite.pm 2024-08-03 07:29:57.000000000 +0000 @@ -4,14 +4,7 @@ @ISA = qw(My::Suite); sub skip_combinations { - my @combinations; - - # disable innodb combinations for configurations that were not built - push @combinations, 'innodb_plugin' unless $ENV{HA_INNODB_SO}; - - push @combinations, 'innodb' unless $::mysqld_variables{'innodb'} eq "ON"; - - my %skip = ( 'include/have_innodb.combinations' => [ @combinations ]); + my %skip; $skip{'include/innodb_encrypt_log.combinations'} = [ 'crypt' ] unless $ENV{DEBUG_KEY_MANAGEMENT_SO}; diff -Nru mariadb-10.11.6/mysql-test/valgrind.supp mariadb-10.11.9/mysql-test/valgrind.supp --- mariadb-10.11.6/mysql-test/valgrind.supp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysql-test/valgrind.supp 2024-08-03 07:29:58.000000000 +0000 @@ -687,6 +687,16 @@ { ConnectSE: unixODBC SQLAllocEnv leaves some "still reachable" pointers Memcheck:Leak + fun:malloc + fun:strdup + ... + obj:*/libodbc.so* + fun:_ZN7ODBConn12AllocConnectEj +} + +{ + ConnectSE: unixODBC SQLAllocEnv leaves some "still reachable" pointers + Memcheck:Leak fun:calloc ... obj:*/libodbc.so* @@ -694,6 +704,15 @@ } { + ConnectSE: unixODBC SQLAllocEnv leaves some "still reachable" pointers + Memcheck:Leak + fun:calloc + ... + obj:*/libodbc.so* + fun:_ZN7ODBConn12AllocConnectEj +} + +{ ConnectSE: unixODBC SQLAllocEnv leavs some "still reachable" pointers Memcheck:Leak fun:malloc diff -Nru mariadb-10.11.6/mysys/CMakeLists.txt mariadb-10.11.9/mysys/CMakeLists.txt --- mariadb-10.11.6/mysys/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -14,7 +14,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA -INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/mysys) +INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/mysys) SET(MYSYS_SOURCES array.c charset-def.c charset.c my_default.c get_password.c @@ -59,29 +59,21 @@ ENDIF() IF(MSVC_INTEL) - SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32_x86.c) + SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32_x86.c crc32/crc32c_x86.cc) IF(CMAKE_SIZEOF_VOID_P EQUAL 8) SET (MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32c_amd64.cc) ENDIF() - ADD_DEFINITIONS(-DHAVE_SSE42 -DHAVE_PCLMUL) - IF(CLANG_CL) - SET_SOURCE_FILES_PROPERTIES(crc32/crc32_x86.c PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul") - ENDIF() ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|i386|i686") - MY_CHECK_CXX_COMPILER_FLAG(-msse4.2) - MY_CHECK_CXX_COMPILER_FLAG(-mpclmul) - CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H) - CHECK_INCLUDE_FILE(x86intrin.h HAVE_X86INTRIN_H) - IF(have_CXX__msse4.2 AND HAVE_CPUID_H) - ADD_DEFINITIONS(-DHAVE_SSE42) - IF (have_CXX__mpclmul AND HAVE_X86INTRIN_H) - ADD_DEFINITIONS(-DHAVE_PCLMUL) - SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32_x86.c) - SET_SOURCE_FILES_PROPERTIES(crc32/crc32_x86.c PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul") - IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32c_amd64.cc) - SET_SOURCE_FILES_PROPERTIES(crc32/crc32c_amd64.cc PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul") - ENDIF() + SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32_x86.c crc32/crc32c_x86.cc) + IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5") + SET_SOURCE_FILES_PROPERTIES(crc32/crc32_x86.c PROPERTIES + COMPILE_FLAGS "-msse4.2 -mpclmul") + ENDIF() + IF(CMAKE_SIZEOF_VOID_P EQUAL 8) + SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32c_amd64.cc) + IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5") + SET_SOURCE_FILES_PROPERTIES(crc32/crc32c_amd64.cc PROPERTIES + COMPILE_FLAGS "-msse4.2 -mpclmul") ENDIF() ENDIF() ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") @@ -164,7 +156,7 @@ ADD_CONVENIENCE_LIBRARY(mysys ${MYSYS_SOURCES}) MAYBE_DISABLE_IPO(mysys) -TARGET_LINK_LIBRARIES(mysys dbug strings ${ZLIB_LIBRARY} +TARGET_LINK_LIBRARIES(mysys dbug strings ${ZLIB_LIBRARIES} ${LIBNSL} ${LIBM} ${LIBRT} ${CMAKE_DL_LIBS} ${LIBSOCKET} ${LIBEXECINFO}) DTRACE_INSTRUMENT(mysys) diff -Nru mariadb-10.11.6/mysys/crc32/crc32_arm64.c mariadb-10.11.9/mysys/crc32/crc32_arm64.c --- mariadb-10.11.6/mysys/crc32/crc32_arm64.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32/crc32_arm64.c 2024-08-03 07:29:58.000000000 +0000 @@ -1,13 +1,18 @@ #include #include #include +#include -static int pmull_supported; +typedef unsigned (*my_crc32_t)(unsigned, const void *, size_t); -#if defined(HAVE_ARMV8_CRC) +#ifdef HAVE_ARMV8_CRC -#if defined(__APPLE__) -#include +# ifdef HAVE_ARMV8_CRYPTO +static unsigned crc32c_aarch64_pmull(unsigned, const void *, size_t); +# endif + +# ifdef __APPLE__ +# include int crc32_aarch64_available(void) { @@ -18,35 +23,35 @@ return ret; } -const char *crc32c_aarch64_available(void) +my_crc32_t crc32c_aarch64_available(void) { - if (crc32_aarch64_available() == 0) - return NULL; - pmull_supported = 1; - return "Using ARMv8 crc32 + pmull instructions"; +# ifdef HAVE_ARMV8_CRYPTO + if (crc32_aarch64_available()) + return crc32c_aarch64_pmull; +# endif + return NULL; } - -#else -#include -#if defined(__FreeBSD__) +# else +# include +# ifdef __FreeBSD__ static unsigned long getauxval(unsigned int key) { unsigned long val; - if (elf_aux_info(key, (void *)&val, (int)sizeof(val) != 0) + if (elf_aux_info(key, (void *)&val, (int)sizeof(val) != 0)) return 0ul; return val; } -#else -# include -#endif - -#ifndef HWCAP_CRC32 -# define HWCAP_CRC32 (1 << 7) -#endif - -#ifndef HWCAP_PMULL -# define HWCAP_PMULL (1 << 4) -#endif +# else +# include +# endif + +# ifndef HWCAP_CRC32 +# define HWCAP_CRC32 (1 << 7) +# endif + +# ifndef HWCAP_PMULL +# define HWCAP_PMULL (1 << 4) +# endif /* ARM made crc32 default from ARMv8.1 but optional in ARMv8A * Runtime check API. @@ -56,22 +61,37 @@ unsigned long auxv= getauxval(AT_HWCAP); return (auxv & HWCAP_CRC32) != 0; } +# endif -const char *crc32c_aarch64_available(void) +# ifndef __APPLE__ +static unsigned crc32c_aarch64(unsigned, const void *, size_t); + +my_crc32_t crc32c_aarch64_available(void) { unsigned long auxv= getauxval(AT_HWCAP); - if (!(auxv & HWCAP_CRC32)) return NULL; +# ifdef HAVE_ARMV8_CRYPTO + /* Raspberry Pi 4 supports crc32 but doesn't support pmull (MDEV-23030). */ + if (auxv & HWCAP_PMULL) + return crc32c_aarch64_pmull; +# endif + return crc32c_aarch64; +} +# endif - pmull_supported= (auxv & HWCAP_PMULL) != 0; - if (pmull_supported) +const char *crc32c_aarch64_impl(my_crc32_t c) +{ +# ifdef HAVE_ARMV8_CRYPTO + if (c == crc32c_aarch64_pmull) return "Using ARMv8 crc32 + pmull instructions"; - else +# endif +# ifndef __APPLE__ + if (c == crc32c_aarch64) return "Using ARMv8 crc32 instructions"; +# endif + return NULL; } - -#endif /* __APPLE__ */ #endif /* HAVE_ARMV8_CRC */ #ifndef HAVE_ARMV8_CRC_CRYPTO_INTRINSICS @@ -157,131 +177,14 @@ PREF4X64L2(buffer,(PREF_OFFSET), 8) \ PREF4X64L2(buffer,(PREF_OFFSET), 12) -uint32_t crc32c_aarch64(uint32_t crc, const unsigned char *buffer, uint64_t len) +#ifndef __APPLE__ +static unsigned crc32c_aarch64(unsigned crc, const void *buf, size_t len) { - uint32_t crc0, crc1, crc2; int64_t length= (int64_t)len; + const unsigned char *buffer= buf; crc^= 0xffffffff; - /* Pmull runtime check here. - * Raspberry Pi 4 supports crc32 but doesn't support pmull (MDEV-23030). - * - * Consider the condition that the target platform does support hardware crc32 - * but not support PMULL. In this condition, it should leverage the aarch64 - * crc32 instruction (__crc32c) and just only skip parallel computation (pmull/vmull) - * rather than skip all hardware crc32 instruction of computation. - */ - if (pmull_supported) - { -/* The following Macro (HAVE_ARMV8_CRYPTO) is used for compiling check */ -#ifdef HAVE_ARMV8_CRYPTO - -/* Crypto extension Support - * Parallel computation with 1024 Bytes (per block) - * Intrinsics Support - */ -# ifdef HAVE_ARMV8_CRC_CRYPTO_INTRINSICS - const poly64_t k1= 0xe417f38a, k2= 0x8f158014; - uint64_t t0, t1; - - /* Process per block size of 1024 Bytes - * A block size = 8 + 42*3*sizeof(uint64_t) + 8 - */ - while ((length-= 1024) >= 0) - { - /* Prefetch 3*1024 data for avoiding L2 cache miss */ - PREF1KL2(buffer, 1024*3); - /* Do first 8 bytes here for better pipelining */ - crc0= __crc32cd(crc, *(const uint64_t *)buffer); - crc1= 0; - crc2= 0; - buffer+= sizeof(uint64_t); - - /* Process block inline - * Process crc0 last to avoid dependency with above - */ - CRC32C7X3X8(buffer, 0); - CRC32C7X3X8(buffer, 1); - CRC32C7X3X8(buffer, 2); - CRC32C7X3X8(buffer, 3); - CRC32C7X3X8(buffer, 4); - CRC32C7X3X8(buffer, 5); - - buffer+= 42*3*sizeof(uint64_t); - /* Prefetch data for following block to avoid L1 cache miss */ - PREF1KL1(buffer, 1024); - - /* Last 8 bytes - * Merge crc0 and crc1 into crc2 - * crc1 multiply by K2 - * crc0 multiply by K1 - */ - t1= (uint64_t)vmull_p64(crc1, k2); - t0= (uint64_t)vmull_p64(crc0, k1); - crc= __crc32cd(crc2, *(const uint64_t *)buffer); - crc1= __crc32cd(0, t1); - crc^= crc1; - crc0= __crc32cd(0, t0); - crc^= crc0; - - buffer+= sizeof(uint64_t); - } - -# else /* HAVE_ARMV8_CRC_CRYPTO_INTRINSICS */ - - /*No intrinsics*/ - __asm__("mov x16, #0xf38a \n\t" - "movk x16, #0xe417, lsl 16 \n\t" - "mov v1.2d[0], x16 \n\t" - "mov x16, #0x8014 \n\t" - "movk x16, #0x8f15, lsl 16 \n\t" - "mov v0.2d[0], x16 \n\t" - :::"x16"); - - while ((length-= 1024) >= 0) - { - PREF1KL2(buffer, 1024*3); - __asm__("crc32cx %w[c0], %w[c], %x[v]\n\t" - :[c0]"=r"(crc0):[c]"r"(crc), [v]"r"(*(const uint64_t *)buffer):); - crc1= 0; - crc2= 0; - buffer+= sizeof(uint64_t); - - CRC32C7X3X8(buffer, 0); - CRC32C7X3X8(buffer, 1); - CRC32C7X3X8(buffer, 2); - CRC32C7X3X8(buffer, 3); - CRC32C7X3X8(buffer, 4); - CRC32C7X3X8(buffer, 5); - - buffer+= 42*3*sizeof(uint64_t); - PREF1KL1(buffer, 1024); - __asm__("mov v2.2d[0], %x[c1] \n\t" - "pmull v2.1q, v2.1d, v0.1d \n\t" - "mov v3.2d[0], %x[c0] \n\t" - "pmull v3.1q, v3.1d, v1.1d \n\t" - "crc32cx %w[c], %w[c2], %x[v] \n\t" - "mov %x[c1], v2.2d[0] \n\t" - "crc32cx %w[c1], wzr, %x[c1] \n\t" - "eor %w[c], %w[c], %w[c1] \n\t" - "mov %x[c0], v3.2d[0] \n\t" - "crc32cx %w[c0], wzr, %x[c0] \n\t" - "eor %w[c], %w[c], %w[c0] \n\t" - :[c1]"+r"(crc1), [c0]"+r"(crc0), [c2]"+r"(crc2), [c]"+r"(crc) - :[v]"r"(*((const uint64_t *)buffer))); - buffer+= sizeof(uint64_t); - } -# endif /* HAVE_ARMV8_CRC_CRYPTO_INTRINSICS */ - - /* Done if Input data size is aligned with 1024 */ - if (!(length+= 1024)) - return ~crc; - -#endif /* HAVE_ARMV8_CRYPTO */ - - } // end if pmull_supported - while ((length-= sizeof(uint64_t)) >= 0) { CRC32CX(crc, *(uint64_t *)buffer); @@ -306,6 +209,143 @@ return ~crc; } +#endif + +#ifdef HAVE_ARMV8_CRYPTO +static unsigned crc32c_aarch64_pmull(unsigned crc, const void *buf, size_t len) +{ + int64_t length= (int64_t)len; + const unsigned char *buffer= buf; + + crc^= 0xffffffff; + + /* Crypto extension Support + * Parallel computation with 1024 Bytes (per block) + * Intrinsics Support + */ +# ifdef HAVE_ARMV8_CRC_CRYPTO_INTRINSICS + /* Process per block size of 1024 Bytes + * A block size = 8 + 42*3*sizeof(uint64_t) + 8 + */ + for (const poly64_t k1= 0xe417f38a, k2= 0x8f158014; (length-= 1024) >= 0; ) + { + uint32_t crc0, crc1, crc2; + uint64_t t0, t1; + /* Prefetch 3*1024 data for avoiding L2 cache miss */ + PREF1KL2(buffer, 1024*3); + /* Do first 8 bytes here for better pipelining */ + crc0= __crc32cd(crc, *(const uint64_t *)buffer); + crc1= 0; + crc2= 0; + buffer+= sizeof(uint64_t); + + /* Process block inline + * Process crc0 last to avoid dependency with above + */ + CRC32C7X3X8(buffer, 0); + CRC32C7X3X8(buffer, 1); + CRC32C7X3X8(buffer, 2); + CRC32C7X3X8(buffer, 3); + CRC32C7X3X8(buffer, 4); + CRC32C7X3X8(buffer, 5); + + buffer+= 42*3*sizeof(uint64_t); + /* Prefetch data for following block to avoid L1 cache miss */ + PREF1KL1(buffer, 1024); + + /* Last 8 bytes + * Merge crc0 and crc1 into crc2 + * crc1 multiply by K2 + * crc0 multiply by K1 + */ + t1= (uint64_t)vmull_p64(crc1, k2); + t0= (uint64_t)vmull_p64(crc0, k1); + crc= __crc32cd(crc2, *(const uint64_t *)buffer); + crc1= __crc32cd(0, t1); + crc^= crc1; + crc0= __crc32cd(0, t0); + crc^= crc0; + + buffer+= sizeof(uint64_t); + } + +# else /* HAVE_ARMV8_CRC_CRYPTO_INTRINSICS */ + /*No intrinsics*/ + __asm__("mov x16, #0xf38a \n\t" + "movk x16, #0xe417, lsl 16 \n\t" + "mov v1.2d[0], x16 \n\t" + "mov x16, #0x8014 \n\t" + "movk x16, #0x8f15, lsl 16 \n\t" + "mov v0.2d[0], x16 \n\t" + :::"x16"); + + while ((length-= 1024) >= 0) + { + uint32_t crc0, crc1, crc2; + + PREF1KL2(buffer, 1024*3); + __asm__("crc32cx %w[c0], %w[c], %x[v]\n\t" + :[c0]"=r"(crc0):[c]"r"(crc), [v]"r"(*(const uint64_t *)buffer):); + crc1= 0; + crc2= 0; + buffer+= sizeof(uint64_t); + + CRC32C7X3X8(buffer, 0); + CRC32C7X3X8(buffer, 1); + CRC32C7X3X8(buffer, 2); + CRC32C7X3X8(buffer, 3); + CRC32C7X3X8(buffer, 4); + CRC32C7X3X8(buffer, 5); + + buffer+= 42*3*sizeof(uint64_t); + PREF1KL1(buffer, 1024); + __asm__("mov v2.2d[0], %x[c1] \n\t" + "pmull v2.1q, v2.1d, v0.1d \n\t" + "mov v3.2d[0], %x[c0] \n\t" + "pmull v3.1q, v3.1d, v1.1d \n\t" + "crc32cx %w[c], %w[c2], %x[v] \n\t" + "mov %x[c1], v2.2d[0] \n\t" + "crc32cx %w[c1], wzr, %x[c1] \n\t" + "eor %w[c], %w[c], %w[c1] \n\t" + "mov %x[c0], v3.2d[0] \n\t" + "crc32cx %w[c0], wzr, %x[c0] \n\t" + "eor %w[c], %w[c], %w[c0] \n\t" + :[c1]"+r"(crc1), [c0]"+r"(crc0), [c2]"+r"(crc2), [c]"+r"(crc) + :[v]"r"(*((const uint64_t *)buffer))); + buffer+= sizeof(uint64_t); + } +# endif /* HAVE_ARMV8_CRC_CRYPTO_INTRINSICS */ + + /* Done if Input data size is aligned with 1024 */ + length+= 1024; + if (length) + { + while ((length-= sizeof(uint64_t)) >= 0) + { + CRC32CX(crc, *(uint64_t *)buffer); + buffer+= sizeof(uint64_t); + } + + /* The following is more efficient than the straight loop */ + if (length & sizeof(uint32_t)) + { + CRC32CW(crc, *(uint32_t *)buffer); + buffer+= sizeof(uint32_t); + } + + if (length & sizeof(uint16_t)) + { + CRC32CH(crc, *(uint16_t *)buffer); + buffer+= sizeof(uint16_t); + } + + if (length & sizeof(uint8_t)) + CRC32CB(crc, *buffer); + } + + return ~crc; +} +#endif /* HAVE_ARMV8_CRYPTO */ /* There are multiple approaches to calculate crc. Approach-1: Process 8 bytes then 4 bytes then 2 bytes and then 1 bytes diff -Nru mariadb-10.11.6/mysys/crc32/crc32_x86.c mariadb-10.11.9/mysys/crc32/crc32_x86.c --- mariadb-10.11.6/mysys/crc32/crc32_x86.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32/crc32_x86.c 2024-08-03 07:29:58.000000000 +0000 @@ -56,11 +56,16 @@ #include #ifdef __GNUC__ -#include +# include +# include +# include +# include +# define USE_PCLMUL __attribute__((target("sse4.2,pclmul"))) #elif defined(_MSC_VER) -#include +# include +# define USE_PCLMUL /* nothing */ #else -#error "unknown compiler" +# error "unknown compiler" #endif /** @@ -71,6 +76,7 @@ * * @return \a reg << (\a num * 8) */ +USE_PCLMUL static inline __m128i xmm_shift_left(__m128i reg, const unsigned int num) { static const MY_ALIGNED(16) uint8_t crc_xmm_shift_tab[48]= { @@ -111,6 +117,7 @@ * * @return New 16 byte folded data */ +USE_PCLMUL static inline __m128i crcr32_folding_round(const __m128i data_block, const __m128i precomp, const __m128i fold) { @@ -128,6 +135,7 @@ * * @return data reduced to 64 bits */ +USE_PCLMUL static inline __m128i crcr32_reduce_128_to_64(__m128i data128, const __m128i precomp) { __m128i tmp0, tmp1, tmp2; @@ -152,6 +160,7 @@ * * @return data reduced to 32 bits */ +USE_PCLMUL static inline uint32_t crcr32_reduce_64_to_32(__m128i data64, const __m128i precomp) { static const MY_ALIGNED(16) uint32_t mask1[4]= { @@ -188,6 +197,7 @@ * * @return CRC for given \a data block (32 bits wide). */ +USE_PCLMUL static inline uint32_t crcr32_calc_pclmulqdq(const uint8_t *data, uint32_t data_len, uint32_t crc, const struct crcr_pclmulqdq_ctx *params) diff -Nru mariadb-10.11.6/mysys/crc32/crc32c.cc mariadb-10.11.9/mysys/crc32/crc32c.cc --- mariadb-10.11.6/mysys/crc32/crc32c.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32/crc32c.cc 2024-08-03 07:29:58.000000000 +0000 @@ -19,52 +19,23 @@ #include #include #include -#include -static inline uint32_t DecodeFixed32(const char *ptr) -{ - return uint4korr(ptr); -} - -#include -#ifdef _MSC_VER -#include -#endif - -#ifdef HAVE_SSE42 -# ifdef __GNUC__ -# include -# if __GNUC__ < 5 && !defined __clang__ -/* the headers do not really work in GCC before version 5 */ -# define _mm_crc32_u8(crc,data) __builtin_ia32_crc32qi(crc,data) -# define _mm_crc32_u32(crc,data) __builtin_ia32_crc32si(crc,data) -# define _mm_crc32_u64(crc,data) __builtin_ia32_crc32di(crc,data) -# else -# include -# endif -# define USE_SSE42 __attribute__((target("sse4.2"))) -# else -# define USE_SSE42 /* nothing */ -# endif -#endif - #ifdef __powerpc64__ -#include "crc32c_ppc.h" - -#if __linux__ -#include +# include "crc32c_ppc.h" +# ifdef __linux__ +# include -#ifndef PPC_FEATURE2_VEC_CRYPTO -#define PPC_FEATURE2_VEC_CRYPTO 0x02000000 -#endif +# ifndef PPC_FEATURE2_VEC_CRYPTO +# define PPC_FEATURE2_VEC_CRYPTO 0x02000000 +# endif -#ifndef AT_HWCAP2 -#define AT_HWCAP2 26 +# ifndef AT_HWCAP2 +# define AT_HWCAP2 26 +# endif +# endif #endif -#endif /* __linux__ */ - -#endif +typedef unsigned (*my_crc32_t)(unsigned, const void *, size_t); namespace mysys_namespace { namespace crc32c { @@ -75,6 +46,7 @@ #endif /* __powerpc64__ */ #endif +alignas(CPU_LEVEL1_DCACHE_LINESIZE) static const uint32_t table0_[256] = { 0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb, @@ -341,8 +313,9 @@ }; // Used to fetch a naturally-aligned 32-bit word in little endian byte-order -static inline uint32_t LE_LOAD32(const uint8_t *p) { - return DecodeFixed32(reinterpret_cast(p)); +static inline uint32_t LE_LOAD32(const uint8_t *p) +{ + return uint4korr(reinterpret_cast(p)); } static inline void Slow_CRC32(uint64_t* l, uint8_t const **p) @@ -362,10 +335,7 @@ table0_[c >> 24]; } -#ifdef ALIGN #undef ALIGN -#endif - // Align n to (1 << m) byte boundary #define ALIGN(n, m) ((n + ((1 << m) - 1)) & ~((1 << m) - 1)) @@ -374,70 +344,30 @@ l = table0_[c] ^ (l >> 8); \ } while (0) -static uint32_t crc32c_slow(uint32_t crc, const char* buf, size_t size) -{ - const uint8_t *p = reinterpret_cast(buf); - const uint8_t *e = p + size; - uint64_t l = crc ^ 0xffffffffu; - - // Point x at first 16-byte aligned byte in string. This might be - // just past the end of the string. - const uintptr_t pval = reinterpret_cast(p); - const uint8_t* x = reinterpret_cast(ALIGN(pval, 4)); - if (x <= e) - // Process bytes until finished or p is 16-byte aligned - while (p != x) - STEP1; - // Process bytes 16 at a time - while ((e-p) >= 16) - { - Slow_CRC32(&l, &p); - Slow_CRC32(&l, &p); - } - // Process bytes 8 at a time - while ((e-p) >= 8) - Slow_CRC32(&l, &p); - // Process the last few bytes - while (p != e) - STEP1; - return static_cast(l ^ 0xffffffffu); -} - -#if defined HAVE_POWER8 -#elif defined HAVE_ARMV8_CRC -#elif defined HAVE_SSE42 -constexpr uint32_t cpuid_ecx_SSE42= 1U << 20; -constexpr uint32_t cpuid_ecx_SSE42_AND_PCLMUL= cpuid_ecx_SSE42 | 1U<<1; - -static uint32_t cpuid_ecx() -{ -#ifdef __GNUC__ - uint32_t reax= 0, rebx= 0, recx= 0, redx= 0; - __cpuid(1, reax, rebx, recx, redx); - return recx; -#elif defined _MSC_VER - int regs[4]; - __cpuid(regs, 1); - return regs[2]; -#else -# error "unknown compiler" +#undef USE_SSE42 +#if defined _MSC_VER && (defined _M_X64 || defined _M_IX86) +# include +# include +# define USE_SSE42 /* nothing */ +#elif defined __GNUC__ && (defined __i386__||defined __x86_64__) +# if __GNUC__ < 5 && !defined __clang_major__ +/* the headers do not really work in GCC before version 5 */ +# define _mm_crc32_u8(crc,data) __builtin_ia32_crc32qi(crc,data) +# define _mm_crc32_u32(crc,data) __builtin_ia32_crc32si(crc,data) +# define _mm_crc32_u64(crc,data) __builtin_ia32_crc32di(crc,data) +# else +# include +# endif +# define USE_SSE42 __attribute__((target("sse4.2"))) #endif -} - -extern "C" int crc32_pclmul_enabled(void) -{ - return !(~cpuid_ecx() & cpuid_ecx_SSE42_AND_PCLMUL); -} - -#if SIZEOF_SIZE_T == 8 -extern "C" uint32_t crc32c_3way(uint32_t crc, const char *buf, size_t len); -USE_SSE42 +#ifdef USE_SSE42 +# if SIZEOF_SIZE_T == 8 static inline uint64_t LE_LOAD64(const uint8_t *ptr) { return uint8korr(reinterpret_cast(ptr)); } -#endif +# endif USE_SSE42 static inline void Fast_CRC32(uint64_t* l, uint8_t const **p) @@ -453,10 +383,11 @@ # endif } +extern "C" USE_SSE42 -static uint32_t crc32c_sse42(uint32_t crc, const char* buf, size_t size) +unsigned crc32c_sse42(unsigned crc, const void* buf, size_t size) { - const uint8_t *p = reinterpret_cast(buf); + const uint8_t *p = static_cast(buf); const uint8_t *e = p + size; uint64_t l = crc ^ 0xffffffffu; @@ -484,114 +415,118 @@ } #endif -typedef uint32_t (*Function)(uint32_t, const char*, size_t); +static unsigned crc32c_slow(unsigned crc, const void* buf, size_t size) +{ + const uint8_t *p = static_cast(buf); + const uint8_t *e = p + size; + uint64_t l = crc ^ 0xffffffffu; -#if defined(HAVE_POWER8) && defined(HAS_ALTIVEC) -uint32_t ExtendPPCImpl(uint32_t crc, const char *buf, size_t size) { - return crc32c_ppc(crc, (const unsigned char *)buf, size); + // Point x at first 16-byte aligned byte in string. This might be + // just past the end of the string. + const uintptr_t pval = reinterpret_cast(p); + const uint8_t* x = reinterpret_cast(ALIGN(pval, 4)); + if (x <= e) + // Process bytes until finished or p is 16-byte aligned + while (p != x) + STEP1; + // Process bytes 16 at a time + while ((e-p) >= 16) + { + Slow_CRC32(&l, &p); + Slow_CRC32(&l, &p); + } + // Process bytes 8 at a time + while ((e-p) >= 8) + Slow_CRC32(&l, &p); + // Process the last few bytes + while (p != e) + STEP1; + return static_cast(l ^ 0xffffffffu); } -#if __linux__ +#if defined(HAVE_POWER8) && defined(HAS_ALTIVEC) +# ifdef __linux__ static int arch_ppc_probe(void) { arch_ppc_crc32 = 0; -#if defined(__powerpc64__) +# if defined(__powerpc64__) if (getauxval(AT_HWCAP2) & PPC_FEATURE2_VEC_CRYPTO) arch_ppc_crc32 = 1; -#endif /* __powerpc64__ */ +# endif /* __powerpc64__ */ return arch_ppc_crc32; } -#elif __FreeBSD_version >= 1200000 -#include -#include -#include +# elif defined __FreeBSD_version && __FreeBSD_version >= 1200000 +# include +# include +# include static int arch_ppc_probe(void) { unsigned long cpufeatures; arch_ppc_crc32 = 0; -#if defined(__powerpc64__) +# if defined(__powerpc64__) elf_aux_info(AT_HWCAP2, &cpufeatures, sizeof(cpufeatures)); if (cpufeatures & PPC_FEATURE2_HAS_VEC_CRYPTO) arch_ppc_crc32 = 1; -#endif /* __powerpc64__ */ +# endif /* __powerpc64__ */ return arch_ppc_crc32; } -#elif defined(_AIX) || defined(__OpenBSD__) +# elif defined(_AIX) || defined(__OpenBSD__) static int arch_ppc_probe(void) { arch_ppc_crc32 = 0; -#if defined(__powerpc64__) +# if defined(__powerpc64__) // AIX 7.1+/OpenBSD has vector crypto features on all POWER 8+ arch_ppc_crc32 = 1; -#endif /* __powerpc64__ */ +# endif /* __powerpc64__ */ return arch_ppc_crc32; } -#endif // __linux__ +# endif #endif #if defined(HAVE_ARMV8_CRC) -extern "C" const char *crc32c_aarch64_available(void); -extern "C" uint32_t crc32c_aarch64(uint32_t crc, const unsigned char *buffer, uint64_t len); - -static uint32_t ExtendARMImpl(uint32_t crc, const char *buf, size_t size) { - return crc32c_aarch64(crc, (const unsigned char *)buf, (size_t) size); -} +extern "C" my_crc32_t crc32c_aarch64_available(void); +extern "C" const char *crc32c_aarch64_impl(my_crc32_t); +#elif defined __i386__||defined __x86_64__||defined _M_X64||defined _M_IX86 +extern "C" my_crc32_t crc32c_x86_available(void); +extern "C" const char *crc32c_x86_impl(my_crc32_t); #endif -static inline Function Choose_Extend() +static inline my_crc32_t Choose_Extend() { #if defined HAVE_POWER8 && defined HAS_ALTIVEC if (arch_ppc_probe()) - return ExtendPPCImpl; -#elif defined(HAVE_ARMV8_CRC) - if (crc32c_aarch64_available()) - return ExtendARMImpl; -#elif HAVE_SSE42 -# if defined HAVE_PCLMUL && SIZEOF_SIZE_T == 8 - switch (cpuid_ecx() & cpuid_ecx_SSE42_AND_PCLMUL) { - case cpuid_ecx_SSE42_AND_PCLMUL: - return crc32c_3way; - case cpuid_ecx_SSE42: - return crc32c_sse42; - } -# else - if (cpuid_ecx() & cpuid_ecx_SSE42) - return crc32c_sse42; -# endif + return crc32c_ppc; +#elif defined HAVE_ARMV8_CRC + if (my_crc32_t crc= crc32c_aarch64_available()) + return crc; +#elif defined __i386__||defined __x86_64__||defined _M_X64||defined _M_IX86 + if (my_crc32_t crc= crc32c_x86_available()) + return crc; #endif return crc32c_slow; } -static const Function ChosenExtend= Choose_Extend(); - -static inline uint32_t Extend(uint32_t crc, const char* buf, size_t size) -{ - return ChosenExtend(crc, buf, size); -} +static const my_crc32_t ChosenExtend= Choose_Extend(); extern "C" const char *my_crc32c_implementation() { -#if defined(HAVE_POWER8) && defined(HAS_ALTIVEC) - if (ChosenExtend == ExtendPPCImpl) +#if defined HAVE_POWER8 && defined HAS_ALTIVEC + if (ChosenExtend == crc32c_ppc) return "Using POWER8 crc32 instructions"; -#elif defined(HAVE_ARMV8_CRC) - if (const char *ret= crc32c_aarch64_available()) +#elif defined HAVE_ARMV8_CRC + if (const char *ret= crc32c_aarch64_impl(ChosenExtend)) + return ret; +#elif defined __i386__||defined __x86_64__||defined _M_X64||defined _M_IX86 + if (const char *ret= crc32c_x86_impl(ChosenExtend)) return ret; -#elif HAVE_SSE42 -# if defined HAVE_PCLMUL && SIZEOF_SIZE_T == 8 - if (ChosenExtend == crc32c_3way) - return "Using crc32 + pclmulqdq instructions"; -# endif - if (ChosenExtend == crc32c_sse42) - return "Using SSE4.2 crc32 instructions"; #endif return "Using generic crc32 instructions"; } } // namespace crc32c } // namespace mysys_namespace -extern "C" unsigned my_crc32c(unsigned int crc, const char *buf, size_t size) +extern "C" uint32 my_crc32c(uint32 crc, const void *buf, size_t size) { - return mysys_namespace::crc32c::Extend(crc,buf, size); + return mysys_namespace::crc32c::ChosenExtend(crc,buf, size); } diff -Nru mariadb-10.11.6/mysys/crc32/crc32c_amd64.cc mariadb-10.11.9/mysys/crc32/crc32c_amd64.cc --- mariadb-10.11.6/mysys/crc32/crc32c_amd64.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32/crc32c_amd64.cc 2024-08-03 07:29:58.000000000 +0000 @@ -47,6 +47,11 @@ #include #include +#ifdef _MSC_VER +# define USE_PCLMUL /* nothing */ +#else +# define USE_PCLMUL __attribute__((target("sse4.2,pclmul"))) +#endif #define CRCtriplet(crc, buf, offset) \ crc##0 = _mm_crc32_u64(crc##0, *(buf##0 + offset)); \ @@ -131,6 +136,7 @@ }; // Compute the crc32c value for buffer smaller than 8 +USE_PCLMUL static inline void align_to_8( size_t len, uint64_t& crc0, // crc so far, updated on return @@ -155,6 +161,7 @@ // CombineCRC performs pclmulqdq multiplication of 2 partial CRC's and a well // chosen constant and xor's these with the remaining CRC. // +USE_PCLMUL static inline uint64_t CombineCRC( size_t block_size, uint64_t crc0, @@ -176,9 +183,10 @@ // Compute CRC-32C using the Intel hardware instruction. extern "C" -uint32_t crc32c_3way(uint32_t crc, const char *buf, size_t len) +USE_PCLMUL +uint32_t crc32c_3way(uint32_t crc, const void *buf, size_t len) { - const unsigned char* next = (const unsigned char*)buf; + const unsigned char* next = static_cast(buf); uint64_t count; uint64_t crc0, crc1, crc2; crc0 = crc ^ 0xffffffffu; diff -Nru mariadb-10.11.6/mysys/crc32/crc32c_ppc.h mariadb-10.11.9/mysys/crc32/crc32c_ppc.h --- mariadb-10.11.6/mysys/crc32/crc32c_ppc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32/crc32c_ppc.h 2024-08-03 07:29:58.000000000 +0000 @@ -11,8 +11,7 @@ extern "C" { #endif -extern uint32_t crc32c_ppc(uint32_t crc, unsigned char const *buffer, - unsigned len); +extern unsigned crc32c_ppc(unsigned crc, const void *buffer, size_t len); #ifdef __cplusplus } diff -Nru mariadb-10.11.6/mysys/crc32/crc32c_x86.cc mariadb-10.11.9/mysys/crc32/crc32c_x86.cc --- mariadb-10.11.6/mysys/crc32/crc32c_x86.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32/crc32c_x86.cc 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,470 @@ +/* Copyright (c) 2024, MariaDB plc + + 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; version 2 of the License. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#include +#include +#include + +#ifdef _MSC_VER +# include +# if 0 /* So far, we have no environment where this could be tested. */ +# define USE_VPCLMULQDQ /* nothing */ +# endif +#else +# include +# ifdef __APPLE__ /* AVX512 states are not enabled in XCR0 */ +# elif __GNUC__ >= 14 || (defined __clang_major__ && __clang_major__ >= 18) +# define TARGET "pclmul,evex512,avx512f,avx512dq,avx512bw,avx512vl,vpclmulqdq" +# define USE_VPCLMULQDQ __attribute__((target(TARGET))) +# elif __GNUC__ >= 11 || (defined __clang_major__ && __clang_major__ >= 9) +/* clang 8 does not support _xgetbv(), which we also need */ +# define TARGET "pclmul,avx512f,avx512dq,avx512bw,avx512vl,vpclmulqdq" +# define USE_VPCLMULQDQ __attribute__((target(TARGET))) +# endif +#endif + +extern "C" unsigned crc32c_sse42(unsigned crc, const void* buf, size_t size); + +constexpr uint32_t cpuid_ecx_SSE42= 1U << 20; +constexpr uint32_t cpuid_ecx_SSE42_AND_PCLMUL= cpuid_ecx_SSE42 | 1U << 1; +constexpr uint32_t cpuid_ecx_XSAVE= 1U << 26; + +static uint32_t cpuid_ecx() +{ +#ifdef __GNUC__ + uint32_t reax= 0, rebx= 0, recx= 0, redx= 0; + __cpuid(1, reax, rebx, recx, redx); + return recx; +#elif defined _MSC_VER + int regs[4]; + __cpuid(regs, 1); + return regs[2]; +#else +# error "unknown compiler" +#endif +} + +typedef uint32_t (*my_crc32_t)(uint32_t, const void *, size_t); +extern "C" uint32_t crc32_pclmul(uint32_t, const void *, size_t); +extern "C" uint32_t crc32c_3way(uint32_t, const void *, size_t); + +#ifdef USE_VPCLMULQDQ +# include + +# ifdef _MSC_VER +/* MSVC does not seem to define this intrinsic for vmovdqa */ +# define _mm_load_epi32(x) *reinterpret_cast(x) +# endif + +/* + This implementation is based on + crc32_by16_vclmul_avx512 and crc32_refl_by16_vclmul_avx512 + in https://github.com/intel/intel-ipsec-mb/ with some optimizations. + The // comments in crc32_avx512() correspond to assembler labels. +*/ + +/** table of constants corresponding to a CRC polynomial up to degree 32 */ +struct alignas(64) crc32_tab +{ + const uint64_t b2048[2], b1024[2]; + alignas(64) const uint64_t b896[6]; /* includes b786, b640 */ + const uint64_t b512[2]; + const uint64_t b384[2], b256[2], b128[2], zeropad_for_b384[2]; + const uint64_t b64[2], b32[2]; +}; + +/** ISO 3309 CRC-32 (reflected polynomial 0x04C11DB7); zlib crc32() */ +static const crc32_tab refl32 = { + { 0x00000000e95c1271, 0x00000000ce3371cb }, + { 0x00000000910eeec1, 0x0000000033fff533 }, + { 0x000000000cbec0ed, 0x0000000031f8303f, + 0x0000000057c54819, 0x00000000df068dc2, + 0x00000000ae0b5394, 0x000000001c279815 }, + { 0x000000001d9513d7, 0x000000008f352d95 }, + { 0x00000000af449247, 0x000000003db1ecdc }, + { 0x0000000081256527, 0x00000000f1da05aa }, + { 0x00000000ccaa009e, 0x00000000ae689191 }, + { 0, 0 }, + { 0x00000000ccaa009e, 0x00000000b8bc6765 }, + { 0x00000001f7011640, 0x00000001db710640 } +}; + +/** Castagnoli CRC-32C (reflected polynomial 0x1EDC6F41) */ +static const crc32_tab refl32c = { + { 0x00000000b9e02b86, 0x00000000dcb17aa4 }, + { 0x000000000d3b6092, 0x000000006992cea2 }, + { 0x0000000047db8317, 0x000000002ad91c30, + 0x000000000715ce53, 0x00000000c49f4f67, + 0x0000000039d3b296, 0x00000000083a6eec }, + { 0x000000009e4addf8, 0x00000000740eef02 }, + { 0x00000000ddc0152b, 0x000000001c291d04 }, + { 0x00000000ba4fc28e, 0x000000003da6d0cb }, + { 0x00000000493c7d27, 0x00000000f20c0dfe }, + { 0, 0 }, + { 0x00000000493c7d27, 0x00000000dd45aab8 }, + { 0x00000000dea713f0, 0x0000000105ec76f0 } +}; + +/** Some ternary functions */ +class ternary +{ + static constexpr uint8_t A = 0b11110000; + static constexpr uint8_t B = 0b11001100; + static constexpr uint8_t C = 0b10101010; +public: + static constexpr uint8_t XOR3 = A ^ B ^ C; + static constexpr uint8_t XNOR3 = uint8_t(~(A ^ B ^ C)); + static constexpr uint8_t XOR2_AND = (A ^ B) & C; +}; + +USE_VPCLMULQDQ +/** @return a^b^c */ +static inline __m128i xor3_128(__m128i a, __m128i b, __m128i c) +{ + return _mm_ternarylogic_epi64(a, b, c, ternary::XOR3); +} + +USE_VPCLMULQDQ +/** @return ~(a^b^c) */ +static inline __m128i xnor3_128(__m128i a, __m128i b, __m128i c) +{ + return _mm_ternarylogic_epi64(a, b, c, ternary::XNOR3); +} + +USE_VPCLMULQDQ +/** @return a^b^c */ +static inline __m512i xor3_512(__m512i a, __m512i b, __m512i c) +{ + return _mm512_ternarylogic_epi64(a, b, c, ternary::XOR3); +} + +USE_VPCLMULQDQ +/** @return (a^b)&c */ +static inline __m128i xor2_and_128(__m128i a, __m128i b, __m128i c) +{ + return _mm_ternarylogic_epi64(a, b, c, ternary::XOR2_AND); +} + +USE_VPCLMULQDQ +/** Load 64 bytes */ +static inline __m512i load512(const char *b) { return _mm512_loadu_epi8(b); } + +USE_VPCLMULQDQ +/** Load 16 bytes */ +static inline __m128i load128(const char *b) { return _mm_loadu_epi64(b); } + +/** Combine 512 data bits with CRC */ +USE_VPCLMULQDQ +static inline __m512i combine512(__m512i a, __m512i tab, __m512i b) +{ + return xor3_512(b, _mm512_clmulepi64_epi128(a, tab, 0x01), + _mm512_clmulepi64_epi128(a, tab, 0x10)); +} + +# define xor512(a, b) _mm512_xor_epi64(a, b) +# define xor256(a, b) _mm256_xor_epi64(a, b) +# define xor128(a, b) _mm_xor_epi64(a, b) +# define and128(a, b) _mm_and_si128(a, b) + +template USE_VPCLMULQDQ +/** Pick and zero-extend 128 bits of a 512-bit vector (vextracti32x4) */ +static inline __m512i extract512_128(__m512i a) +{ + static_assert(bits <= 3, "usage"); + return _mm512_zextsi128_si512(_mm512_extracti64x2_epi64(a, bits)); +} + +alignas(16) static const uint64_t shuffle128[4] = { + 0x8786858483828100, 0x8f8e8d8c8b8a8988, + 0x0706050403020100, 0x000e0d0c0b0a0908 +}; + +static const __mmask16 size_mask[16] = { + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff +}; + +alignas(16) static const uint64_t shift128[4] = { + 0x8786858483828100, 0x8f8e8d8c8b8a8988, + 0x0706050403020100, 0x000e0d0c0b0a0908 +}; + +static const char shift_1_to_3_reflect[7 + 11] = { + -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 +}; + +USE_VPCLMULQDQ +static unsigned crc32_avx512(unsigned crc, const char *buf, size_t size, + const crc32_tab &tab) +{ + const __m512i crc_in = _mm512_castsi128_si512(_mm_cvtsi32_si128(~crc)), + b512 = _mm512_broadcast_i32x4(_mm_load_epi32(tab.b512)); + __m128i crc_out; + __m512i lo; + + if (size >= 256) { + lo = xor512(load512(buf), crc_in); + __m512i l1 = load512(buf + 64); + + const __m512i b1024 = _mm512_broadcast_i32x4(_mm_load_epi32(&tab.b1024)); + size -= 256; + if (size >= 256) { + __m512i h0 = load512(buf + 128), + hi = load512(buf + 192); + const __m512i b2048 = _mm512_broadcast_i32x4(_mm_load_epi32(&tab.b2048)); + size -= 256; + do { + buf += 256; + lo = combine512(lo, b2048, load512(buf)); + l1 = combine512(l1, b2048, load512(buf + 64)); + h0 = combine512(h0, b2048, load512(buf + 128)); + hi = combine512(hi, b2048, load512(buf + 192)); + size -= 256; + } while (ssize_t(size) >= 0); + + buf += 256; + lo = combine512(lo, b1024, h0); + l1 = combine512(l1, b1024, hi); + size += 128; + } else { + do { + buf += 128; + lo = combine512(lo, b1024, load512(buf)); + l1 = combine512(l1, b1024, load512(buf + 64)); + size -= 128; + } while (ssize_t(size) >= 0); + + buf += 128; + } + + if (ssize_t(size) >= -64) { + size += 128; + lo = combine512(lo, b512, l1); + goto fold_64_B_loop; + } + + const __m512i + b896 = _mm512_load_epi32(&tab.b896), + b384 = _mm512_load_epi32(&tab.b384); + + __m512i c4 = xor3_512(_mm512_clmulepi64_epi128(lo, b896, 1), + _mm512_clmulepi64_epi128(lo, b896, 0x10), + _mm512_clmulepi64_epi128(l1, b384, 1)); + c4 = xor3_512(c4, _mm512_clmulepi64_epi128(l1, b384, 0x10), + extract512_128<3>(l1)); + + __m256i c2 = + _mm512_castsi512_si256(_mm512_shuffle_i64x2(c4, c4, 0b01001110)); + c2 = xor256(c2, _mm512_castsi512_si256(c4)); + crc_out = xor128(_mm256_extracti64x2_epi64(c2, 1), + _mm256_castsi256_si128(c2)); + size += 128 - 16; + goto final_reduction; + } + + __m128i b; + + // less_than_256 + if (size >= 32) { + if (size >= 64) { + lo = xor512(load512(buf), crc_in); + + while (buf += 64, (size -= 64) >= 64) + fold_64_B_loop: + lo = combine512(lo, b512, load512(buf)); + + // reduce_64B + const __m512i b384 = _mm512_load_epi32(&tab.b384); + __m512i crc512 = + xor3_512(_mm512_clmulepi64_epi128(lo, b384, 1), + _mm512_clmulepi64_epi128(lo, b384, 0x10), + extract512_128<3>(lo)); + crc512 = + xor512(crc512, _mm512_shuffle_i64x2(crc512, crc512, 0b01001110)); + const __m256i crc256 = _mm512_castsi512_si256(crc512); + crc_out = xor128(_mm256_extracti64x2_epi64(crc256, 1), + _mm256_castsi256_si128(crc256)); + size -= 16; + } else { + // less_than_64 + crc_out = xor128(load128(buf), + _mm512_castsi512_si128(crc_in)); + buf += 16; + size -= 32; + } + + final_reduction: + b = _mm_load_epi32(&tab.b128); + + while (ssize_t(size) >= 0) { + // reduction_loop_16B + crc_out = xor3_128(load128(buf), + _mm_clmulepi64_si128(crc_out, b, 1), + _mm_clmulepi64_si128(crc_out, b, 0x10)); + buf += 16; + size -= 16; + } + // final_reduction_for_128 + + size += 16; + if (size) { + get_last_two_xmms: + const __m128i crc2 = crc_out, d = load128(buf + ssize_t(size) - 16); + __m128i S = load128(reinterpret_cast(shuffle128) + size); + crc_out = _mm_shuffle_epi8(crc_out, S); + S = xor128(S, _mm_set1_epi32(0x80808080)); + crc_out = xor3_128(_mm_blendv_epi8(_mm_shuffle_epi8(crc2, S), d, S), + _mm_clmulepi64_si128(crc_out, b, 1), + _mm_clmulepi64_si128(crc_out, b, 0x10)); + } + + done_128: + __m128i crc_tmp; + b = _mm_load_epi32(&tab.b64); + crc_tmp = xor128(_mm_clmulepi64_si128(crc_out, b, 0x00), + _mm_srli_si128(crc_out, 8)); + crc_out = _mm_slli_si128(crc_tmp, 4); + crc_out = _mm_clmulepi64_si128(crc_out, b, 0x10); + crc_out = xor128(crc_out, crc_tmp); + + barrett: + b = _mm_load_epi32(&tab.b32); + crc_tmp = crc_out; + crc_out = and128(crc_out, _mm_set_epi64x(~0ULL, ~0xFFFFFFFFULL)); + crc_out = _mm_clmulepi64_si128(crc_out, b, 0); + crc_out = xor2_and_128(crc_out, crc_tmp, _mm_set_epi64x(0, ~0ULL)); + crc_out = xnor3_128(crc_out, crc_tmp, + _mm_clmulepi64_si128(crc_out, b, 0x10)); + return _mm_extract_epi32(crc_out, 2); + } else { + // less_than_32 + if (size > 0) { + if (size > 16) { + crc_out = xor128(load128(buf), + _mm512_castsi512_si128(crc_in)); + buf += 16; + size -= 16; + b = _mm_load_epi32(&tab.b128); + goto get_last_two_xmms; + } else if (size < 16) { + crc_out = _mm_maskz_loadu_epi8(size_mask[size - 1], buf); + crc_out = xor128(crc_out, _mm512_castsi512_si128(crc_in)); + + if (size >= 4) { + crc_out = _mm_shuffle_epi8 + (crc_out, + load128(reinterpret_cast(shift128) + size)); + goto done_128; + } else { + // only_less_than_4 + /* Shift, zero-filling 5 to 7 of the 8-byte crc_out */ + crc_out = _mm_shuffle_epi8(crc_out, + load128(shift_1_to_3_reflect + size - 1)); + goto barrett; + } + } else { + crc_out = xor128(load128(buf), _mm512_castsi512_si128(crc_in)); + goto done_128; + } + } else + return crc; + } +} + +#ifdef __GNUC__ +__attribute__((target("xsave"))) +#endif +static bool os_have_avx512() +{ + // The following flags must be set: SSE, AVX, OPMASK, ZMM_HI256, HI16_ZMM + return !(~_xgetbv(0 /*_XCR_XFEATURE_ENABLED_MASK*/) & 0xe6); +} + +static ATTRIBUTE_NOINLINE bool have_vpclmulqdq(uint32_t cpuid_ecx) +{ + if (!(cpuid_ecx & cpuid_ecx_XSAVE) || !os_have_avx512()) + return false; +# ifdef _MSC_VER + int regs[4]; + __cpuidex(regs, 7, 0); + uint32_t ebx = regs[1], ecx = regs[2]; +# else + uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0; + __cpuid_count(7, 0, eax, ebx, ecx, edx); +# endif + return ecx & 1U<<10/*VPCLMULQDQ*/ && + !(~ebx & ((1U<<16/*AVX512F*/ | 1U<<17/*AVX512DQ*/ | + 1U<<30/*AVX512BW*/ | 1U<<31/*AVX512VL*/))); +} + +static unsigned crc32_vpclmulqdq(unsigned crc, const void *buf, size_t size) +{ + return crc32_avx512(crc, static_cast(buf), size, refl32); +} + +static unsigned crc32c_vpclmulqdq(unsigned crc, const void *buf, size_t size) +{ + return crc32_avx512(crc, static_cast(buf), size, refl32c); +} +#endif + +extern "C" my_crc32_t crc32_pclmul_enabled(void) +{ + const uint32_t ecx= cpuid_ecx(); + if (~ecx & cpuid_ecx_SSE42_AND_PCLMUL) + return nullptr; +#ifdef USE_VPCLMULQDQ + if (have_vpclmulqdq(ecx)) + return crc32_vpclmulqdq; +#endif + return crc32_pclmul; +} + +extern "C" my_crc32_t crc32c_x86_available(void) +{ + const uint32_t ecx= cpuid_ecx(); +#ifdef USE_VPCLMULQDQ + if (have_vpclmulqdq(ecx)) + return crc32c_vpclmulqdq; +#endif +#if SIZEOF_SIZE_T == 8 + switch (ecx & cpuid_ecx_SSE42_AND_PCLMUL) { + case cpuid_ecx_SSE42_AND_PCLMUL: + return crc32c_3way; + case cpuid_ecx_SSE42: + return crc32c_sse42; + } +#else + if (ecx & cpuid_ecx_SSE42) + return crc32c_sse42; +#endif + return nullptr; +} + +extern "C" const char *crc32c_x86_impl(my_crc32_t c) +{ +#ifdef USE_VPCLMULQDQ + if (c == crc32c_vpclmulqdq) + return "Using AVX512 instructions"; +#endif +#if SIZEOF_SIZE_T == 8 + if (c == crc32c_3way) + return "Using crc32 + pclmulqdq instructions"; +#endif + if (c == crc32c_sse42) + return "Using SSE4.2 crc32 instructions"; + return nullptr; +} diff -Nru mariadb-10.11.6/mysys/crc32/crc_ppc64.h mariadb-10.11.9/mysys/crc32/crc_ppc64.h --- mariadb-10.11.6/mysys/crc32/crc_ppc64.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32/crc_ppc64.h 2024-08-03 07:29:58.000000000 +0000 @@ -28,7 +28,7 @@ * any later version, or * b) the Apache License, Version 2.0 */ - +#include #include @@ -57,12 +57,13 @@ __crc32_vpmsum(unsigned int crc, const void* p, unsigned long len); -unsigned int CRC32_FUNCTION(unsigned int crc, const unsigned char *p, - unsigned long len) +unsigned CRC32_FUNCTION(unsigned crc, const void *buffer, size_t len) { unsigned int prealign; unsigned int tail; + const unsigned char *p = buffer; + #ifdef CRC_XOR crc ^= 0xffffffff; #endif diff -Nru mariadb-10.11.6/mysys/crc32ieee.cc mariadb-10.11.9/mysys/crc32ieee.cc --- mariadb-10.11.6/mysys/crc32ieee.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/crc32ieee.cc 2024-08-03 07:29:58.000000000 +0000 @@ -26,23 +26,22 @@ return (unsigned int) crc32(crc, (const Bytef *)data, (unsigned int) len); } -#ifdef HAVE_PCLMUL -extern "C" int crc32_pclmul_enabled(); -extern "C" unsigned int crc32_pclmul(unsigned int, const void *, size_t); -#elif defined(__GNUC__) && defined(HAVE_ARMV8_CRC) +typedef unsigned int (*my_crc32_t)(unsigned int, const void *, size_t); + +#if defined _M_IX86 || defined _M_X64 || defined __i386__ || defined __x86_64__ +extern "C" my_crc32_t crc32_pclmul_enabled(); +#elif defined HAVE_ARMV8_CRC extern "C" int crc32_aarch64_available(); extern "C" unsigned int crc32_aarch64(unsigned int, const void *, size_t); #endif -typedef unsigned int (*my_crc32_t)(unsigned int, const void *, size_t); - static my_crc32_t init_crc32() { -#ifdef HAVE_PCLMUL - if (crc32_pclmul_enabled()) - return crc32_pclmul; -#elif defined(__GNUC__) && defined(HAVE_ARMV8_CRC) +#if defined _M_IX86 || defined _M_X64 || defined __i386__ || defined __x86_64__ + if (my_crc32_t crc= crc32_pclmul_enabled()) + return crc; +#elif defined HAVE_ARMV8_CRC if (crc32_aarch64_available()) return crc32_aarch64; #endif diff -Nru mariadb-10.11.6/mysys/errors.c mariadb-10.11.9/mysys/errors.c --- mariadb-10.11.6/mysys/errors.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/errors.c 2024-08-03 07:29:58.000000000 +0000 @@ -112,6 +112,13 @@ } #endif +static void my_space_sleep(uint seconds) +{ + sleep(seconds); +} + +void (*my_sleep_for_space)(uint seconds)= my_space_sleep; + void wait_for_free_space(const char *filename, int errors) { if (errors == 0) @@ -123,7 +130,7 @@ MYF(ME_BELL | ME_ERROR_LOG | ME_WARNING), MY_WAIT_FOR_USER_TO_FIX_PANIC, MY_WAIT_GIVE_USER_A_MESSAGE * MY_WAIT_FOR_USER_TO_FIX_PANIC ); - (void) sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC); + my_sleep_for_space(MY_WAIT_FOR_USER_TO_FIX_PANIC); } const char **get_global_errmsgs(int nr __attribute__((unused))) diff -Nru mariadb-10.11.6/mysys/lf_alloc-pin.c mariadb-10.11.9/mysys/lf_alloc-pin.c --- mariadb-10.11.6/mysys/lf_alloc-pin.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/lf_alloc-pin.c 2024-08-03 07:29:58.000000000 +0000 @@ -103,12 +103,6 @@ #include #include "my_cpu.h" -/* - when using alloca() leave at least that many bytes of the stack - - for functions we might be calling from within this stack frame -*/ -#define ALLOCA_SAFETY_MARGIN 8192 - #define LF_PINBOX_MAX_PINS 65536 static void lf_pinbox_real_free(LF_PINS *pins); @@ -239,24 +233,21 @@ } while (!my_atomic_cas32((int32 volatile*) &pinbox->pinstack_top_ver, (int32*) &top_ver, top_ver-pins->link+nr+LF_PINBOX_MAX_PINS)); - return; } -static int ptr_cmp(void **a, void **b) +/* + Get the next pointer in the purgatory list. + Note that next_node is not used to avoid the extra volatile. +*/ +#define pnext_node(P, X) (*((void **)(((char *)(X)) + (P)->free_ptr_offset))) + +static inline void add_to_purgatory(LF_PINS *pins, void *addr) { - return *a < *b ? -1 : *a == *b ? 0 : 1; + pnext_node(pins->pinbox, addr)= pins->purgatory; + pins->purgatory= addr; + pins->purgatory_count++; } -#define add_to_purgatory(PINS, ADDR) \ - do \ - { \ - my_atomic_storeptr_explicit( \ - (void **)((char *)(ADDR)+(PINS)->pinbox->free_ptr_offset), \ - (PINS)->purgatory, MY_MEMORY_ORDER_RELEASE); \ - (PINS)->purgatory= (ADDR); \ - (PINS)->purgatory_count++; \ - } while (0) - /* Free an object allocated via pinbox allocator @@ -274,138 +265,87 @@ lf_pinbox_real_free(pins);); } -struct st_harvester { - void **granary; - int npins; +struct st_match_and_save_arg { + LF_PINS *pins; + LF_PINBOX *pinbox; + void *old_purgatory; }; /* - callback forlf_dynarray_iterate: - scan all pins of all threads and accumulate all pins + Callback for lf_dynarray_iterate: + Scan all pins of all threads, for each active (non-null) pin, + scan the current thread's purgatory. If present there, move it + to a new purgatory. At the end, the old purgatory will contain + pointers not pinned by any thread. */ -static int harvest_pins(LF_PINS *el, struct st_harvester *hv) +static int match_and_save(void *e, void *a) { + LF_PINS *el= e; + struct st_match_and_save_arg *arg= a; + int i; - LF_PINS *el_end= el+MY_MIN(hv->npins, LF_DYNARRAY_LEVEL_LENGTH); + LF_PINS *el_end= el + LF_DYNARRAY_LEVEL_LENGTH; for (; el < el_end; el++) { for (i= 0; i < LF_PINBOX_PINS; i++) { - void *p= el->pin[i]; + void *p= my_atomic_loadptr((void **)&el->pin[i]); if (p) - *hv->granary++= p; + { + void *cur= arg->old_purgatory; + void **list_prev= &arg->old_purgatory; + while (cur) + { + void *next= pnext_node(arg->pinbox, cur); + + if (p == cur) + { + /* pinned - keeping */ + add_to_purgatory(arg->pins, cur); + /* unlink from old purgatory */ + *list_prev= next; + } + else + list_prev= (void **)((char *)cur+arg->pinbox->free_ptr_offset); + cur= next; + } + if (!arg->old_purgatory) + return 1; + } } } - /* - hv->npins may become negative below, but it means that - we're on the last dynarray page and harvest_pins() won't be - called again. We don't bother to make hv->npins() correct - (that is 0) in this case. - */ - hv->npins-= LF_DYNARRAY_LEVEL_LENGTH; - return 0; -} - -/* - callback forlf_dynarray_iterate: - scan all pins of all threads and see if addr is present there -*/ -static int match_pins(LF_PINS *el, void *addr) -{ - int i; - LF_PINS *el_end= el+LF_DYNARRAY_LEVEL_LENGTH; - for (; el < el_end; el++) - for (i= 0; i < LF_PINBOX_PINS; i++) - if (el->pin[i] == addr) - return 1; return 0; } -#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset))) -#define anext_node(X) next_node(&allocator->pinbox, (X)) - /* Scan the purgatory and free everything that can be freed */ static void lf_pinbox_real_free(LF_PINS *pins) { - int npins; - void *list; - void **addr= NULL; - void *first= NULL, *last= NULL; - struct st_my_thread_var *var= my_thread_var; - void *stack_ends_here= var ? var->stack_ends_here : NULL; LF_PINBOX *pinbox= pins->pinbox; - npins= pinbox->pins_in_array+1; + /* Store info about current purgatory. */ + struct st_match_and_save_arg arg = {pins, pinbox, pins->purgatory}; + /* Reset purgatory. */ + pins->purgatory= NULL; + pins->purgatory_count= 0; -#ifdef HAVE_ALLOCA - if (stack_ends_here != NULL) - { - int alloca_size= sizeof(void *)*LF_PINBOX_PINS*npins; - /* create a sorted list of pinned addresses, to speed up searches */ - if (available_stack_size(&pinbox, stack_ends_here) > - alloca_size + ALLOCA_SAFETY_MARGIN) - { - struct st_harvester hv; - addr= (void **) alloca(alloca_size); - hv.granary= addr; - hv.npins= npins; - /* scan the dynarray and accumulate all pinned addresses */ - lf_dynarray_iterate(&pinbox->pinarray, - (lf_dynarray_func)harvest_pins, &hv); - - npins= (int)(hv.granary-addr); - /* and sort them */ - if (npins) - qsort(addr, npins, sizeof(void *), (qsort_cmp)ptr_cmp); - } - } -#endif - list= pins->purgatory; - pins->purgatory= 0; - pins->purgatory_count= 0; - while (list) + lf_dynarray_iterate(&pinbox->pinarray, match_and_save, &arg); + + if (arg.old_purgatory) { - void *cur= list; - list= *(void **)((char *)cur+pinbox->free_ptr_offset); - if (npins) - { - if (addr) /* use binary search */ - { - void **a, **b, **c; - for (a= addr, b= addr+npins-1, c= a+(b-a)/2; (b-a) > 1; c= a+(b-a)/2) - if (cur == *c) - a= b= c; - else if (cur > *c) - a= c; - else - b= c; - if (cur == *a || cur == *b) - goto found; - } - else /* no alloca - no cookie. linear search here */ - { - if (lf_dynarray_iterate(&pinbox->pinarray, - (lf_dynarray_func)match_pins, cur)) - goto found; - } - } - /* not pinned - freeing */ - if (last) - last= next_node(pinbox, last)= (uchar *)cur; - else - first= last= (uchar *)cur; - continue; -found: - /* pinned - keeping */ - add_to_purgatory(pins, cur); + /* Some objects in the old purgatory were not pinned, free them. */ + void *last= arg.old_purgatory; + while (pnext_node(pinbox, last)) + last= pnext_node(pinbox, last); + pinbox->free_func(arg.old_purgatory, last, pinbox->free_func_arg); } - if (last) - pinbox->free_func(first, last, pinbox->free_func_arg); } +#define next_node(P, X) (*((uchar * volatile *)(((uchar *)(X)) + (P)->free_ptr_offset))) +#define anext_node(X) next_node(&allocator->pinbox, (X)) + /* lock-free memory allocator for fixed-size objects */ /* @@ -416,10 +356,11 @@ 'first' and 'last' are the ends of the linked list of nodes: first->el->el->....->el->last. Use first==last to free only one element. */ -static void alloc_free(uchar *first, - uchar volatile *last, - LF_ALLOCATOR *allocator) +static void alloc_free(void *f, void *l, void *alloc) { + uchar *first= f; + uchar volatile *last= l; + LF_ALLOCATOR *allocator= alloc; /* we need a union here to access type-punned pointer reliably. otherwise gcc -fstrict-aliasing will not see 'tmp' changed in the loop @@ -448,8 +389,7 @@ */ void lf_alloc_init(LF_ALLOCATOR *allocator, uint size, uint free_ptr_offset) { - lf_pinbox_init(&allocator->pinbox, free_ptr_offset, - (lf_pinbox_free_func *)alloc_free, allocator); + lf_pinbox_init(&allocator->pinbox, free_ptr_offset, alloc_free, allocator); allocator->top= 0; allocator->mallocs= 0; allocator->element_size= size; @@ -501,7 +441,8 @@ { node= allocator->top; lf_pin(pins, 0, node); - } while (node != allocator->top && LF_BACKOFF()); + } while (node != my_atomic_loadptr((void **)(char *)&allocator->top) + && LF_BACKOFF()); if (!node) { node= (void *)my_malloc(key_memory_lf_node, allocator->element_size, diff -Nru mariadb-10.11.6/mysys/ma_dyncol.c mariadb-10.11.9/mysys/ma_dyncol.c --- mariadb-10.11.6/mysys/ma_dyncol.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/ma_dyncol.c 2024-08-03 07:29:58.000000000 +0000 @@ -3848,13 +3848,13 @@ register char c= append[i]; if (unlikely(((uchar)c) <= 0x1F)) { - if (lim < 5) + if (lim < 6) { if (dynstr_realloc(str, additional)) return TRUE; lim+= additional; } - lim-= 5; + lim -= 6; str->str[str->length++]= '\\'; str->str[str->length++]= 'u'; str->str[str->length++]= '0'; @@ -3865,17 +3865,18 @@ } else { + if (lim < 2) + { + if (dynstr_realloc(str, additional)) + return TRUE; + lim += additional; + } if (c == '"' || c == '\\') { - if (!lim) - { - if (dynstr_realloc(str, additional)) - return TRUE; - lim= additional; - } lim--; str->str[str->length++]= '\\'; } + lim--; str->str[str->length++]= c; } } diff -Nru mariadb-10.11.6/mysys/mf_tempfile.c mariadb-10.11.9/mysys/mf_tempfile.c --- mariadb-10.11.6/mysys/mf_tempfile.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/mf_tempfile.c 2024-08-03 07:29:58.000000000 +0000 @@ -66,7 +66,11 @@ DBUG_ENTER("create_temp_file"); DBUG_PRINT("enter", ("dir: %s, prefix: %s", dir ? dir : "(null)", prefix)); +#if !defined _WIN32 && defined O_DIRECT + DBUG_ASSERT((mode & (O_EXCL | O_TRUNC | O_CREAT | O_RDWR | O_DIRECT)) == 0); +#else DBUG_ASSERT((mode & (O_EXCL | O_TRUNC | O_CREAT | O_RDWR)) == 0); +#endif mode|= O_TRUNC | O_CREAT | O_RDWR; /* not O_EXCL, see Windows code below */ @@ -118,16 +122,41 @@ if ((MyFlags & MY_TEMPORARY) && O_TMPFILE_works) { - /* explictly don't use O_EXCL here has it has a different - meaning with O_TMPFILE + /* + explicitly don't use O_EXCL here has it has a different + meaning with O_TMPFILE */ - if ((file= open(dir, (mode & ~O_CREAT) | O_TMPFILE | O_CLOEXEC, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) >= 0) + const int flags= (mode & ~O_CREAT) | O_TMPFILE | O_CLOEXEC; + const mode_t open_mode= S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; +# ifdef O_DIRECT + static int O_TMPFILE_works_with_O_DIRECT= O_DIRECT; + const int try_O_DIRECT= mode & O_TMPFILE_works_with_O_DIRECT; + if (try_O_DIRECT) + file= open(dir, flags | O_DIRECT, open_mode); + else +# endif + file= open(dir, flags, open_mode); + + if (file >= 0) { +# ifdef O_DIRECT + O_TMPFILE_works: +# endif my_snprintf(to, FN_REFLEN, "%s/#sql/fd=%d", dir, file); file=my_register_filename(file, to, FILE_BY_O_TMPFILE, EE_CANTCREATEFILE, MyFlags); } +# ifdef O_DIRECT + else if (errno == EINVAL && try_O_DIRECT) + { + file= open(dir, flags, open_mode); + if (file >= 0) + { + O_TMPFILE_works_with_O_DIRECT= 0; + goto O_TMPFILE_works; + } + } +# endif else if (errno == EOPNOTSUPP || errno == EINVAL) { my_printf_error(EE_CANTCREATEFILE, "O_TMPFILE is not supported on %s " diff -Nru mariadb-10.11.6/mysys/my_alloc.c mariadb-10.11.9/mysys/my_alloc.c --- mariadb-10.11.6/mysys/my_alloc.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/my_alloc.c 2024-08-03 07:29:58.000000000 +0000 @@ -28,21 +28,16 @@ #undef EXTRA_DEBUG #define EXTRA_DEBUG -#ifndef DBUG_OFF -/* Put a protected barrier after every element when using multi_alloc_root() */ -#define ALLOC_BARRIER -#endif +#define ROOT_FLAG_THREAD_SPECIFIC 1 +#define ROOT_FLAG_MPROTECT 2 +#define ROOT_FLAG_READ_ONLY 4 /* data packed in MEM_ROOT -> min_malloc */ /* Don't allocate too small blocks */ #define ROOT_MIN_BLOCK_SIZE 256 -/* bits in MEM_ROOT->flags */ -#define ROOT_FLAG_THREAD_SPECIFIC 1 -#define ROOT_FLAG_MPROTECT 2 - -#define MALLOC_FLAG(R) MYF((R)->flags & ROOT_FLAG_THREAD_SPECIFIC ? THREAD_SPECIFIC : 0) +#define MALLOC_FLAG(root) (((root)->flags & ROOT_FLAG_THREAD_SPECIFIC) ? MY_THREAD_SPECIFIC : 0) #define TRASH_MEM(X) TRASH_FREE(((char*)(X) + ((X)->size-(X)->left)), (X)->left) @@ -69,8 +64,7 @@ #endif /* HAVE_MMAP */ return my_malloc(root->psi_key, size, - my_flags | MYF(root->flags & ROOT_FLAG_THREAD_SPECIFIC ? - MY_THREAD_SPECIFIC : 0)); + my_flags | MALLOC_FLAG(root)); } static void root_free(MEM_ROOT *root, void *ptr, size_t size) @@ -172,9 +166,6 @@ mem_root->block_num= 4; /* We shift this with >>2 */ mem_root->first_block_usage= 0; mem_root->psi_key= key; -#ifdef PROTECT_STATEMENT_MEMROOT - mem_root->read_only= 0; -#endif #if !(defined(HAVE_valgrind) && defined(EXTRA_DEBUG)) if (pre_alloc_size) @@ -281,10 +272,7 @@ DBUG_ENTER("alloc_root"); DBUG_PRINT("enter",("root: %p", mem_root)); DBUG_ASSERT(alloc_root_inited(mem_root)); - -#ifdef PROTECT_STATEMENT_MEMROOT - DBUG_ASSERT(mem_root->read_only == 0); -#endif + DBUG_ASSERT((mem_root->flags & ROOT_FLAG_READ_ONLY) == 0); DBUG_EXECUTE_IF("simulate_out_of_memory", { @@ -300,9 +288,7 @@ length+= ALIGN_SIZE(sizeof(USED_MEM)); if (!(next = (USED_MEM*) my_malloc(mem_root->psi_key, length, MYF(MY_WME | ME_FATAL | - (mem_root->flags & - ROOT_FLAG_THREAD_SPECIFIC ? - MY_THREAD_SPECIFIC : 0))))) + MALLOC_FLAG(mem_root))))) { if (mem_root->error_handler) (*mem_root->error_handler)(); @@ -410,7 +396,7 @@ { length= va_arg(args, uint); tot_length+= ALIGN_SIZE(length); -#ifdef ALLOC_BARRIER +#ifndef DBUG_OFF tot_length+= ALIGN_SIZE(1); #endif } @@ -426,7 +412,7 @@ *ptr= res; length= va_arg(args, uint); res+= ALIGN_SIZE(length); -#ifdef ALLOC_BARRIER +#ifndef DBUG_OFF TRASH_FREE(res, ALIGN_SIZE(1)); res+= ALIGN_SIZE(1); #endif @@ -560,6 +546,28 @@ } } +/* + Move allocated objects from one root to another. + + Notes: + We do not increase 'to->block_num' here as the variable isused to + increase block sizes in case of many allocations. This is special + case where this is not needed to take into account +*/ + +void move_root(MEM_ROOT *to, MEM_ROOT *from) +{ + USED_MEM *block, *next; + for (block= from->used; block ; block= next) + { + next= block->next; + block->next= to->used; + to->used= block; + } + from->used= 0; +} + + /* Remember last MEM_ROOT block. diff -Nru mariadb-10.11.6/mysys/my_bitmap.c mariadb-10.11.9/mysys/my_bitmap.c --- mariadb-10.11.6/mysys/my_bitmap.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/my_bitmap.c 2024-08-03 07:29:58.000000000 +0000 @@ -13,17 +13,28 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 + USA + */ /* - Handling of uchar arrays as large bitmaps. + Handling of my_bitmap_map (ulonglong) arrays as large bitmaps. API limitations (or, rather asserted safety assumptions, to encourage correct programming) - * the internal size is a set of 32 bit words + * the internal storage is a set of 64 bit words * the number of bits specified in creation can be any number > 0 + Implementation notes: + * MY_BITMAP includes a pointer, last_word_ptr, to the last word. + The implication is that if one copies bitmaps to another memory + location, one has to call create_last_bit_mask() on the bitmap to + fix the internal pointer. + * The not used part of a the last word should always be 0. + This avoids special handling of the last bitmap in several cases. + This is checked for most calls to bitmap functions. + TODO: Make assembler thread safe versions of these using test-and-set instructions @@ -31,117 +42,97 @@ New version written and test program added and some changes to the interface was made by Mikael Ronstrom 2005, with assistance of Tomas Ulin and Mats Kindahl. + Updated to 64 bits and use my_find_first_bit() to speed up + bitmap_get_next_set() by Monty in 2024 */ #include "mysys_priv.h" #include #include #include +#include + + +/* Defines to check bitmaps */ + +#define DBUG_ASSERT_BITMAP(M) \ + DBUG_ASSERT((M)->bitmap); \ + DBUG_ASSERT((M)->n_bits > 0); \ + DBUG_ASSERT((M)->last_word_ptr == (M)->bitmap + no_words_in_map(M)-1); \ + DBUG_ASSERT((*(M)->last_word_ptr & (M)->last_bit_mask) == 0); + +#define DBUG_ASSERT_BITMAP_AND_BIT(M,B) \ + DBUG_ASSERT_BITMAP(M); \ + DBUG_ASSERT((B) < (M)->n_bits); + +#define DBUG_ASSERT_DIFFERENT_BITMAPS(M,N) \ + DBUG_ASSERT_BITMAP(M); \ + DBUG_ASSERT_BITMAP(N); + +#define DBUG_ASSERT_IDENTICAL_BITMAPS(M,N) \ + DBUG_ASSERT_BITMAP(M); \ + DBUG_ASSERT_BITMAP(N); \ + DBUG_ASSERT((M)->n_bits == (N)->n_bits); /* - Create a mask with the upper 'unused' bits set and the lower 'used' - bits clear. The bits within each byte is stored in big-endian order. + Create a mask for the usable bits on the LAST my_bitmap_map position for + a bitmap with 'bits' number of bits. + + The lowest 'bits' bits are set to zero and the rest bits are set to 1. + For (bits & 63) == 0 , 0 is returned as in this case all bits in the + my_bitmap_position are significant. (This example assumes the + storage is ulonglong). + + For 'bits & 63' it will return values from the series + 0, 0xfffffffffffffffe,.... 0x8000000000000000 */ -static inline uchar invers_last_byte_mask(uint bits) +static inline my_bitmap_map last_bit_mask(uint bits) { - return last_byte_mask(bits) ^ 255; + uint bits_in_last_map= (bits & (my_bitmap_map_bits-1)); + return bits_in_last_map ? ~((1ULL << bits_in_last_map)-1) : 0ULL; } -void create_last_word_mask(MY_BITMAP *map) -{ - unsigned char const mask= invers_last_byte_mask(map->n_bits); - - /* - The first bytes are to be set to zero since they represent real bits - in the bitvector. The last bytes are set to 0xFF since they represent - bytes not used by the bitvector. Finally the last byte contains bits - as set by the mask above. - */ - unsigned char *ptr= (unsigned char*)&map->last_word_mask; - - map->last_word_ptr= map->bitmap + no_words_in_map(map)-1; - switch (no_bytes_in_map(map) & 3) { - case 1: - map->last_word_mask= ~0U; - ptr[0]= mask; - return; - case 2: - map->last_word_mask= ~0U; - ptr[0]= 0; - ptr[1]= mask; - return; - case 3: - map->last_word_mask= 0U; - ptr[2]= mask; - ptr[3]= 0xFFU; - return; - case 0: - map->last_word_mask= 0U; - ptr[3]= mask; - return; - } -} - - -static inline my_bitmap_map last_word_mask(uint bit) -{ - my_bitmap_map last_word_mask; - uint n_bits= bit + 1; - unsigned char const mask= invers_last_byte_mask(n_bits); - - /* - The first bytes are to be set to zero since they represent real bits - in the bitvector. The last bytes are set to 0xFF since they represent - bytes not used by the bitvector. Finally the last byte contains bits - as set by the mask above. - */ - unsigned char *ptr= (unsigned char*)&last_word_mask; - - switch ((n_bits + 7)/8 & 3) { - case 1: - last_word_mask= ~0U; - ptr[0]= mask; - break; - case 2: - last_word_mask= ~0U; - ptr[0]= 0; - ptr[1]= mask; - break; - case 3: - last_word_mask= 0U; - ptr[2]= mask; - ptr[3]= 0xFFU; - break; - case 0: - last_word_mask= 0U; - ptr[3]= mask; - break; - } - return last_word_mask; -} - - -static inline uint get_first_set(my_bitmap_map value, uint word_pos) -{ - uchar *byte_ptr= (uchar*)&value; - uchar byte_value; - uint byte_pos, bit_pos; +/* + Get a mask of the bits that are to be considered as 'on' at location + starting with 'bits'. + This function has _inv in it's name as it's usage is invers compared + to last_bit_mask(). - DBUG_ASSERT(value); - for (byte_pos=0; ; byte_pos++, byte_ptr++) + For (bits & 63) it will return values from the series + 0xffffffffffffffff, 0xfffffffffffffffe,.... 0x8000000000000000 +*/ + +static inline my_bitmap_map first_bit_mask_inv(uint bits) +{ + uint bits_in_last_map= (bits & (my_bitmap_map_bits-1)); + return ~((1ULL << bits_in_last_map)-1); +} + + +/* + Update the bitmap's last_word_ptr and last_bit_mask + Also ensure that the last world is all zero to make it + easy to find the next set bit. + + Note that if n_bits is 0, then last_word_ptr will point to + bitmap (safely). The bitmap will not be usable for almost any operation. +*/ + +void create_last_bit_mask(MY_BITMAP *map) +{ + my_bitmap_map mask= last_bit_mask(map->n_bits); + map->last_bit_mask= mask; + map->last_word_ptr= map->bitmap + MY_MAX(no_words_in_map(map),1) -1; + if (map->n_bits > 0) { - if ((byte_value= *byte_ptr)) - { - for (bit_pos=0; ; bit_pos++) - if (byte_value & (1 << bit_pos)) - return (word_pos*32) + (byte_pos*8) + bit_pos; - } + *map->last_word_ptr&= ~mask; /* Set not used bits to 0 */ + DBUG_ASSERT_BITMAP(map); } - return MY_BIT_NONE; /* Impossible */ } + /* Initialize a bitmap object. All bits will be set to zero */ @@ -149,17 +140,24 @@ my_bool my_bitmap_init(MY_BITMAP *map, my_bitmap_map *buf, uint n_bits) { DBUG_ENTER("my_bitmap_init"); + if (!buf) { uint size_in_bytes= bitmap_buffer_size(n_bits); if (!(buf= (my_bitmap_map*) my_malloc(key_memory_MY_BITMAP_bitmap, size_in_bytes, MYF(MY_WME)))) + { + map->bitmap= 0; DBUG_RETURN(1); + } + map->bitmap_allocated= 1; } + else + map->bitmap_allocated= 0; map->bitmap= buf; map->n_bits= n_bits; - create_last_word_mask(map); + create_last_bit_mask(map); bitmap_clear_all(map); DBUG_RETURN(0); } @@ -170,7 +168,8 @@ DBUG_ENTER("my_bitmap_free"); if (map->bitmap) { - my_free(map->bitmap); + if (map->bitmap_allocated) + my_free(map->bitmap); map->bitmap=0; } DBUG_VOID_RETURN; @@ -192,11 +191,14 @@ my_bool bitmap_fast_test_and_set(MY_BITMAP *map, uint bitmap_bit) { - uchar *value= ((uchar*) map->bitmap) + (bitmap_bit / 8); - uchar bit= 1 << ((bitmap_bit) & 7); - uchar res= (*value) & bit; + my_bitmap_map *value, bit, res; + DBUG_ASSERT_BITMAP_AND_BIT(map, bitmap_bit); + + value= map->bitmap + (bitmap_bit/my_bitmap_map_bits); + bit= 1ULL << (bitmap_bit & (my_bitmap_map_bits-1)); + res= *value & bit; *value|= bit; - return res; + return MY_TEST(res); } @@ -215,8 +217,7 @@ my_bool bitmap_test_and_set(MY_BITMAP *map, uint bitmap_bit) { - DBUG_ASSERT(map->bitmap); - DBUG_ASSERT(bitmap_bit < map->n_bits); + DBUG_ASSERT_BITMAP_AND_BIT(map, bitmap_bit); return bitmap_fast_test_and_set(map, bitmap_bit); } @@ -235,18 +236,20 @@ my_bool bitmap_fast_test_and_clear(MY_BITMAP *map, uint bitmap_bit) { - uchar *byte= (uchar*) map->bitmap + (bitmap_bit / 8); - uchar bit= 1 << ((bitmap_bit) & 7); - uchar res= (*byte) & bit; - *byte&= ~bit; - return res; + my_bitmap_map *value, bit, res; + DBUG_ASSERT_BITMAP_AND_BIT(map, bitmap_bit); + + value= map->bitmap + (bitmap_bit/my_bitmap_map_bits); + bit= 1ULL << (bitmap_bit & (my_bitmap_map_bits-1)); + res= *value & bit; + *value&= ~bit; + return MY_TEST(res); } my_bool bitmap_test_and_clear(MY_BITMAP *map, uint bitmap_bit) { - DBUG_ASSERT(map->bitmap); - DBUG_ASSERT(bitmap_bit < map->n_bits); + DBUG_ASSERT_BITMAP_AND_BIT(map, bitmap_bit); return bitmap_fast_test_and_clear(map, bitmap_bit); } @@ -254,8 +257,8 @@ uint bitmap_set_next(MY_BITMAP *map) { uint bit_found; - DBUG_ASSERT(map->bitmap); - if ((bit_found= bitmap_get_first(map)) != MY_BIT_NONE) + DBUG_ASSERT_BITMAP(map); + if ((bit_found= bitmap_get_first_clear(map)) != MY_BIT_NONE) bitmap_set_bit(map, bit_found); return bit_found; } @@ -265,58 +268,69 @@ Set the specified number of bits in the bitmap buffer. @param map [IN] Bitmap - @param prefix_size [IN] Number of bits to be set + @param prefix_size [IN] Number of bits to be set or (uint) ~0 for all */ + void bitmap_set_prefix(MY_BITMAP *map, uint prefix_size) { - uint prefix_bytes, prefix_bits, d; - uchar *m= (uchar *)map->bitmap; - - DBUG_ASSERT(map->bitmap); + uint prefix, prefix_bits; + my_bitmap_map *value= map->bitmap; + DBUG_ASSERT_BITMAP(map); DBUG_ASSERT(prefix_size <= map->n_bits || prefix_size == (uint) ~0); set_if_smaller(prefix_size, map->n_bits); - if ((prefix_bytes= prefix_size / 8)) - memset(m, 0xff, prefix_bytes); - m+= prefix_bytes; - if ((prefix_bits= prefix_size & 7)) - { - *(m++)= (1 << prefix_bits)-1; - // As the prefix bits are set, lets count this byte too as a prefix byte. - prefix_bytes ++; + + if ((prefix= prefix_size / my_bitmap_map_bits)) + { + my_bitmap_map *end= value+prefix; + do + { + *value++= ~(my_bitmap_map) 0; + } while (value < end); } - if ((d= no_bytes_in_map(map)-prefix_bytes)) - memset(m, 0, d); + if ((prefix_bits= prefix_size & (my_bitmap_map_bits-1))) + *value++= (1ULL << prefix_bits)-1; + while (value <= map->last_word_ptr) + *value++= 0; + DBUG_ASSERT_BITMAP(map); } +/** + Check if bitmap is a bitmap of prefix bits set in the beginning + + @param map bitmap + @param prefix_size number of bits that should be set. 0 is allowed. + + @return 1 Yes, prefix bits where set or prefix_size == 0. + @return 0 No +*/ + my_bool bitmap_is_prefix(const MY_BITMAP *map, uint prefix_size) { - uint prefix_mask= last_byte_mask(prefix_size); - uchar *m= (uchar*) map->bitmap; - uchar *end_prefix= m+(prefix_size-1)/8; - uchar *end; - DBUG_ASSERT(m); - DBUG_ASSERT(prefix_size <= map->n_bits); + my_bitmap_map *value= map->bitmap; + my_bitmap_map *end= value+ (prefix_size/my_bitmap_map_bits); + uint prefix_bits; /* Empty prefix is always true */ if (!prefix_size) return 1; - while (m < end_prefix) - if (*m++ != 0xff) - return 0; - - end= ((uchar*) map->bitmap) + no_bytes_in_map(map) - 1; - if (m == end) - return ((*m & last_byte_mask(map->n_bits)) == prefix_mask); + DBUG_ASSERT_BITMAP_AND_BIT(map, prefix_size-1); - if (*m != prefix_mask) - return 0; + while (value < end) + if (*value++ != ~(my_bitmap_map) 0) + return 0; - while (++m < end) - if (*m != 0) + if ((prefix_bits= prefix_size & (my_bitmap_map_bits-1))) + { + if (*value++ != (1ULL << prefix_bits)-1) return 0; - return ((*m & last_byte_mask(map->n_bits)) == 0); + } + end= map->last_word_ptr; + while (value <= end) + if (*value++ != 0) + return 0; + return 1; } @@ -324,10 +338,12 @@ { my_bitmap_map *data_ptr= map->bitmap; my_bitmap_map *end= map->last_word_ptr; + DBUG_ASSERT_BITMAP(map); + for (; data_ptr < end; data_ptr++) - if (*data_ptr != 0xFFFFFFFF) + if (*data_ptr != ~(my_bitmap_map)0) return FALSE; - return (*data_ptr | map->last_word_mask) == 0xFFFFFFFF; + return (*data_ptr | map->last_bit_mask) == ~(my_bitmap_map)0; } @@ -335,61 +351,58 @@ { my_bitmap_map *data_ptr= map->bitmap; my_bitmap_map *end= map->last_word_ptr; + DBUG_ASSERT_BITMAP(map); - DBUG_ASSERT(map->n_bits > 0); - for (; data_ptr < end; data_ptr++) + for (; data_ptr <= end; data_ptr++) if (*data_ptr) return FALSE; - return (*data_ptr & ~map->last_word_mask) == 0; + return TRUE; } + /* Return TRUE if map1 is a subset of map2 */ my_bool bitmap_is_subset(const MY_BITMAP *map1, const MY_BITMAP *map2) { - my_bitmap_map *m1= map1->bitmap, *m2= map2->bitmap, *end; - - DBUG_ASSERT(map1->bitmap && map2->bitmap); - DBUG_ASSERT(map1->n_bits==map2->n_bits); + my_bitmap_map *m1= map1->bitmap, *m2= map2->bitmap, *end= map1->last_word_ptr; + DBUG_ASSERT_IDENTICAL_BITMAPS(map1,map2); - end= map1->last_word_ptr; - while (m1 < end) + while (m1 <= end) { if ((*m1++) & ~(*m2++)) return 0; } - /* here both maps have the same number of bits - see assert above */ - return ((*m1 & ~*m2 & ~map1->last_word_mask) ? 0 : 1); + return 1; } /* True if bitmaps has any common bits */ my_bool bitmap_is_overlapping(const MY_BITMAP *map1, const MY_BITMAP *map2) { - my_bitmap_map *m1= map1->bitmap, *m2= map2->bitmap, *end; - - DBUG_ASSERT(map1->bitmap); - DBUG_ASSERT(map2->bitmap); - DBUG_ASSERT(map1->n_bits==map2->n_bits); + my_bitmap_map *m1= map1->bitmap, *m2= map2->bitmap, *end= map1->last_word_ptr; + DBUG_ASSERT_IDENTICAL_BITMAPS(map1,map2); - end= map1->last_word_ptr; - while (m1 < end) + while (m1 <= end) { if ((*m1++) & (*m2++)) return 1; } - /* here both maps have the same number of bits - see assert above */ - return ((*m1 & *m2 & ~map1->last_word_mask) ? 1 : 0); + return 0; } +/* + Create intersection of two bitmaps + + @param map map1. Result is stored here + @param map2 map2 +*/ + void bitmap_intersect(MY_BITMAP *map, const MY_BITMAP *map2) { my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end; uint len= no_words_in_map(map), len2 = no_words_in_map(map2); - - DBUG_ASSERT(map->bitmap); - DBUG_ASSERT(map2->bitmap); + DBUG_ASSERT_DIFFERENT_BITMAPS(map,map2); end= to+MY_MIN(len,len2); while (to < end) @@ -397,7 +410,7 @@ if (len2 <= len) { - to[-1]&= ~map2->last_word_mask; /* Clear last not relevant bits */ + to[-1]&= ~map2->last_bit_mask; /* Clear last not relevant bits */ end+= len-len2; while (to < end) *to++= 0; @@ -407,50 +420,51 @@ /* Check if there is some bit index between start_bit and end_bit, such that - this is bit is set for all bitmaps in bitmap_list. + this is at least on bit that set for all bitmaps in bitmap_list. SYNOPSIS bitmap_exists_intersection() bitmpap_array [in] a set of MY_BITMAPs - bitmap_count [in] number of elements in bitmpap_array + bitmap_count [in] number of elements in bitmap_array start_bit [in] beginning (inclusive) of the range of bits to search end_bit [in] end (inclusive) of the range of bits to search, must be no bigger than the bits of the shortest bitmap. - NOTES - This function assumes that for at least one of the bitmaps in bitmap_array all - bits outside the range [start_bit, end_bit] are 0. As a result is not - necessary to take care of the bits outside the range [start_bit, end_bit]. - RETURN TRUE if an intersecion exists FALSE no intersection */ -my_bool bitmap_exists_intersection(const MY_BITMAP **bitmap_array, +my_bool bitmap_exists_intersection(MY_BITMAP **bitmap_array, uint bitmap_count, uint start_bit, uint end_bit) { uint i, j, start_idx, end_idx; - my_bitmap_map cur_res; + my_bitmap_map cur_res, first_map; DBUG_ASSERT(bitmap_count); DBUG_ASSERT(end_bit >= start_bit); for (j= 0; j < bitmap_count; j++) - DBUG_ASSERT(end_bit < bitmap_array[j]->n_bits); + { + DBUG_ASSERT_BITMAP_AND_BIT(bitmap_array[j], end_bit); + } start_idx= start_bit/8/sizeof(my_bitmap_map); end_idx= end_bit/8/sizeof(my_bitmap_map); + first_map= first_bit_mask_inv(start_bit); + cur_res= first_map; for (i= start_idx; i < end_idx; i++) { - cur_res= ~0; for (j= 0; cur_res && j < bitmap_count; j++) cur_res &= bitmap_array[j]->bitmap[i]; if (cur_res) return TRUE; + cur_res= ~(my_bitmap_map) 0; } - cur_res= ~last_word_mask(end_bit); + cur_res= ~last_bit_mask(end_bit+1); + if (start_idx == end_idx) + cur_res&= first_map; for (j= 0; cur_res && j < bitmap_count; j++) cur_res &= bitmap_array[j]->bitmap[end_idx]; return cur_res != 0; @@ -461,60 +475,21 @@ my_bool bitmap_union_is_set_all(const MY_BITMAP *map1, const MY_BITMAP *map2) { - my_bitmap_map *m1= map1->bitmap, *m2= map2->bitmap, *end; + my_bitmap_map *m1= map1->bitmap, *m2= map2->bitmap, *end= map1->last_word_ptr; + DBUG_ASSERT_IDENTICAL_BITMAPS(map1,map2); - DBUG_ASSERT(map1->bitmap); - DBUG_ASSERT(map2->bitmap); - DBUG_ASSERT(map1->n_bits==map2->n_bits); - end= map1->last_word_ptr; while ( m1 < end) - if ((*m1++ | *m2++) != 0xFFFFFFFF) + if ((*m1++ | *m2++) != ~(my_bitmap_map)0) return FALSE; /* here both maps have the same number of bits - see assert above */ - return ((*m1 | *m2 | map1->last_word_mask) != 0xFFFFFFFF); -} - - - -/* - Set/clear all bits above a bit. - - SYNOPSIS - bitmap_set_above() - map RETURN The bitmap to change. - from_byte The bitmap buffer byte offset to start with. - use_bit The bit value (1/0) to use for all upper bits. - - NOTE - You can only set/clear full bytes. - The function is meant for the situation that you copy a smaller bitmap - to a bigger bitmap. Bitmap lengths are always multiple of eigth (the - size of a byte). Using 'from_byte' saves multiplication and division - by eight during parameter passing. - - RETURN - void -*/ - -void bitmap_set_above(MY_BITMAP *map, uint from_byte, uint use_bit) -{ - uchar use_byte= use_bit ? 0xff : 0; - uchar *to= (uchar *)map->bitmap + from_byte; - uchar *end= (uchar *)map->bitmap + (map->n_bits+7)/8; - - while (to < end) - *to++= use_byte; + return ((*m1 | *m2 | map1->last_bit_mask) != ~(my_bitmap_map)0); } void bitmap_subtract(MY_BITMAP *map, const MY_BITMAP *map2) { - my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end; - DBUG_ASSERT(map->bitmap); - DBUG_ASSERT(map2->bitmap); - DBUG_ASSERT(map->n_bits==map2->n_bits); - - end= map->last_word_ptr; + my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end= map->last_word_ptr; + DBUG_ASSERT_IDENTICAL_BITMAPS(map,map2); while (to <= end) *to++ &= ~(*from++); @@ -523,12 +498,8 @@ void bitmap_union(MY_BITMAP *map, const MY_BITMAP *map2) { - my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end; - - DBUG_ASSERT(map->bitmap); - DBUG_ASSERT(map2->bitmap); - DBUG_ASSERT(map->n_bits == map2->n_bits); - end= map->last_word_ptr; + my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end= map->last_word_ptr; + DBUG_ASSERT_IDENTICAL_BITMAPS(map,map2); while (to <= end) *to++ |= *from++; @@ -538,9 +509,8 @@ void bitmap_xor(MY_BITMAP *map, const MY_BITMAP *map2) { my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end= map->last_word_ptr; - DBUG_ASSERT(map->bitmap); - DBUG_ASSERT(map2->bitmap); - DBUG_ASSERT(map->n_bits == map2->n_bits); + DBUG_ASSERT_IDENTICAL_BITMAPS(map,map2); + while (to <= end) *to++ ^= *from++; } @@ -548,13 +518,14 @@ void bitmap_invert(MY_BITMAP *map) { - my_bitmap_map *to= map->bitmap, *end; + my_bitmap_map *to= map->bitmap, *end= map->last_word_ptr; + DBUG_ASSERT_BITMAP(map); - DBUG_ASSERT(map->bitmap); - end= map->last_word_ptr; + while (to < end) + *to++ ^= ~(my_bitmap_map)0; - while (to <= end) - *to++ ^= 0xFFFFFFFF; + *to ^= (~(my_bitmap_map)0 & ~map->last_bit_mask); + DBUG_ASSERT_BITMAP(map); } @@ -563,45 +534,54 @@ my_bitmap_map *data_ptr= map->bitmap; my_bitmap_map *end= map->last_word_ptr; uint res= 0; - DBUG_ASSERT(map->bitmap); + DBUG_ASSERT_BITMAP(map); - for (; data_ptr < end; data_ptr++) - res+= my_count_bits_uint32(*data_ptr); + for (; data_ptr <= end; data_ptr++) + res+= my_count_bits(*data_ptr); - /*Reset last bits to zero*/ - res+= my_count_bits_uint32(*map->last_word_ptr & ~map->last_word_mask); return res; } -void bitmap_copy(MY_BITMAP *map, const MY_BITMAP *map2) -{ - my_bitmap_map *to= map->bitmap, *from= map2->bitmap, *end; - DBUG_ASSERT(map->bitmap); - DBUG_ASSERT(map2->bitmap); - DBUG_ASSERT(map->n_bits == map2->n_bits); - end= map->last_word_ptr; +/** + Copy bitmaps - while (to <= end) - *to++ = *from++; + @param map1 to-bitmap + @param map2 from-bitmap + + @notes + Code will work even of the bitmaps are of different size. + In this case, only up to to->n_bits will be copied. +*/ + +void bitmap_copy(MY_BITMAP *map1, const MY_BITMAP *map2) +{ + my_bitmap_map *to= map1->bitmap, *from= map2->bitmap; + uint map1_length= no_words_in_map(map1)*sizeof(my_bitmap_map); + uint map2_length= no_words_in_map(map2)*sizeof(my_bitmap_map); + uint length= MY_MIN(map1_length, map2_length); + DBUG_ASSERT_DIFFERENT_BITMAPS(map1,map2); + + memcpy(to, from, length); + if (length < map1_length) + bzero(to + length, map1_length - length); + *map1->last_word_ptr&= ~map1->last_bit_mask; } +/* + Find first set bit in the bitmap +*/ + uint bitmap_get_first_set(const MY_BITMAP *map) { - uint i; my_bitmap_map *data_ptr= map->bitmap, *end= map->last_word_ptr; + DBUG_ASSERT_BITMAP(map); - DBUG_ASSERT(map->bitmap); - - for (i=0; data_ptr < end; data_ptr++, i++) + for (uint i=0; data_ptr <= end; data_ptr++, i++) if (*data_ptr) - goto found; - if (!(*data_ptr & ~map->last_word_mask)) - return MY_BIT_NONE; - -found: - return get_first_set(*data_ptr, i); + return my_find_first_bit(*data_ptr) + i * sizeof(my_bitmap_map)*8; + return MY_BIT_NONE; } @@ -616,80 +596,113 @@ uint bitmap_get_next_set(const MY_BITMAP *map, uint bitmap_bit) { - uint word_pos, byte_to_mask, i; - union { my_bitmap_map bitmap ; uchar bitmap_buff[sizeof(my_bitmap_map)]; } - first_word; - uchar *ptr= &first_word.bitmap_buff[0]; - my_bitmap_map *data_ptr, *end= map->last_word_ptr; - - DBUG_ASSERT(map->bitmap); + uint word_pos; + my_bitmap_map first_word, *data_ptr, *end= map->last_word_ptr; + DBUG_ASSERT_BITMAP(map); /* Look for the next bit */ bitmap_bit++; if (bitmap_bit >= map->n_bits) return MY_BIT_NONE; - word_pos= bitmap_bit / 32; + + word_pos= bitmap_bit / 64; data_ptr= map->bitmap + word_pos; - first_word.bitmap= *data_ptr; - /* Mask out previous bits from first_word */ - byte_to_mask= (bitmap_bit % 32) / 8; - for (i= 0; i < byte_to_mask; i++) - ptr[i]= 0; - ptr[byte_to_mask]&= 0xFFU << (bitmap_bit & 7); - - if (data_ptr == end) - { - if (first_word.bitmap & ~map->last_word_mask) - return get_first_set(first_word.bitmap, word_pos); - else - return MY_BIT_NONE; - } - - if (first_word.bitmap) - return get_first_set(first_word.bitmap, word_pos); + first_word= *data_ptr & first_bit_mask_inv(bitmap_bit); - for (data_ptr++, word_pos++; data_ptr < end; data_ptr++, word_pos++) - if (*data_ptr) - return get_first_set(*data_ptr, word_pos); + if (first_word) + { + /* Optimize common case when most bits are set */ + if (first_word & (1ULL << ((bitmap_bit & (my_bitmap_map_bits-1))))) + return bitmap_bit; + return my_find_first_bit(first_word) + (bitmap_bit & ~(my_bitmap_map_bits-1)); + } - if (!(*end & ~map->last_word_mask)) - return MY_BIT_NONE; - return get_first_set(*end, word_pos); + for (data_ptr++; data_ptr <= end; data_ptr++) + { + bitmap_bit+= 64; + if (*data_ptr) + return my_find_first_bit(*data_ptr) + (bitmap_bit & ~(my_bitmap_map_bits-1)); + } + return MY_BIT_NONE; } -/* Get first free bit */ +/* Get first clear bit */ -uint bitmap_get_first(const MY_BITMAP *map) +uint bitmap_get_first_clear(const MY_BITMAP *map) { - uchar *byte_ptr; - uint i,j,k; - my_bitmap_map *data_ptr, *end= map->last_word_ptr; - - DBUG_ASSERT(map->bitmap); - data_ptr= map->bitmap; - *map->last_word_ptr|= map->last_word_mask; + uint i; + my_bitmap_map *data_ptr= map->bitmap, *end= map->last_word_ptr; + DBUG_ASSERT_BITMAP(map); - for (i=0; data_ptr < end; data_ptr++, i++) - if (*data_ptr != 0xFFFFFFFF) + for (i= 0; data_ptr < end; data_ptr++, i++) + if (*data_ptr != ~(my_bitmap_map)0) goto found; - if ((*data_ptr | map->last_word_mask) == 0xFFFFFFFF) + if ((*data_ptr | map->last_bit_mask) == ~(my_bitmap_map)0) return MY_BIT_NONE; - found: - byte_ptr= (uchar*)data_ptr; - for (j=0; ; j++, byte_ptr++) + /* find first zero bit by reverting all bits and find first bit */ + return my_find_first_bit(~*data_ptr) + i * sizeof(my_bitmap_map)*8; +} +/* + Functions to export/import bitmaps to an architecture independent format + (low_byte_first) +*/ + +#ifdef WORDS_BIGENDIAN +/* Big endian machines, like powerpc or s390x */ + +void bitmap_export(uchar *to, MY_BITMAP *map) +{ + my_bitmap_map *value; + uint length; + uchar buff[my_bitmap_map_bytes]; + + for (value= map->bitmap ; value < map->last_word_ptr ; value++) { - if (*byte_ptr != 0xFF) - { - for (k=0; ; k++) - { - if (!(*byte_ptr & (1 << k))) - return (i*32) + (j*8) + k; - } - } + int8store(to, *value); + to+= 8; + } + int8store(buff, *value); + + /* We want length & 7 to return a serie 8,2,3,4,5,6,7, 8,2,3,... */ + length= 1+ ((no_bytes_in_export_map(map) + 7) & 7); + memcpy(to, buff, length); +} + + +void bitmap_import(MY_BITMAP *map, uchar *from) +{ + my_bitmap_map *value; + uint length; + uchar buff[my_bitmap_map_bytes]; + + for (value= map->bitmap ; value < map->last_word_ptr ; value++) + { + *value= uint8korr(from); + from+= 8; } - DBUG_ASSERT(0); - return MY_BIT_NONE; /* Impossible */ + bzero(buff, sizeof(buff)); + + /* We want length & 7 to return a serie 8,2,3,4,5,6,7, 8,2,3,... */ + length= 1+ ((no_bytes_in_export_map(map) + 7) & 7); + memcpy(buff, from, length); + *value= uint8korr(buff) & ~map->last_bit_mask; +} + +#else + +/* Little endian machines, like intel and amd */ + +void bitmap_export(uchar *to, MY_BITMAP *map) +{ + memcpy(to, (uchar*) map->bitmap, no_bytes_in_export_map(map)); +} + +void bitmap_import(MY_BITMAP *map, uchar *from) +{ + memcpy((uchar*) map->bitmap, from, no_bytes_in_export_map(map)); + *map->last_word_ptr&= ~map->last_bit_mask; } +#endif /* WORDS_BIGENDIAN */ diff -Nru mariadb-10.11.6/mysys/my_getopt.c mariadb-10.11.9/mysys/my_getopt.c --- mariadb-10.11.6/mysys/my_getopt.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/my_getopt.c 2024-08-03 07:29:58.000000000 +0000 @@ -172,6 +172,8 @@ #define validate_value(key, value, filename) (void)filename #endif +#define SET_HO_ERROR_AND_CONTINUE(e) { ho_error= (e); (*argc)--; continue; } + /** Handle command line options. Sort options. @@ -241,7 +243,7 @@ const char *UNINIT_VAR(prev_found); const struct my_option *optp; void *value; - int error, i; + int ho_error= 0, error, i; my_bool is_cmdline_arg= 1; DBUG_ENTER("handle_options"); @@ -255,7 +257,7 @@ is_cmdline_arg= !is_file_marker(**argv); - for (pos= *argv, pos_end=pos+ *argc; pos != pos_end ; pos++) + for (pos= *argv, pos_end=pos+ *argc; pos < pos_end ; pos++) { char **first= pos; char *cur_arg= *pos; @@ -344,7 +346,7 @@ my_progname, special_opt_prefix[i], opt_str, special_opt_prefix[i], prev_found); - DBUG_RETURN(EXIT_AMBIGUOUS_OPTION); + SET_HO_ERROR_AND_CONTINUE(EXIT_AMBIGUOUS_OPTION) } switch (i) { case OPT_SKIP: @@ -389,7 +391,7 @@ "%s: unknown variable '%s'", my_progname, cur_arg); if (!option_is_loose) - DBUG_RETURN(EXIT_UNKNOWN_VARIABLE); + SET_HO_ERROR_AND_CONTINUE(EXIT_UNKNOWN_VARIABLE) } else { @@ -399,7 +401,7 @@ "%s: unknown option '--%s'", my_progname, cur_arg); if (!option_is_loose) - DBUG_RETURN(EXIT_UNKNOWN_OPTION); + SET_HO_ERROR_AND_CONTINUE(EXIT_UNKNOWN_OPTION) } if (option_is_loose) { @@ -416,7 +418,7 @@ my_getopt_error_reporter(ERROR_LEVEL, "%s: variable prefix '%s' is not unique", my_progname, opt_str); - DBUG_RETURN(EXIT_VAR_PREFIX_NOT_UNIQUE); + SET_HO_ERROR_AND_CONTINUE(EXIT_VAR_PREFIX_NOT_UNIQUE) } else { @@ -425,7 +427,7 @@ "%s: ambiguous option '--%s' (%s, %s)", my_progname, opt_str, prev_found, optp->name); - DBUG_RETURN(EXIT_AMBIGUOUS_OPTION); + SET_HO_ERROR_AND_CONTINUE(EXIT_AMBIGUOUS_OPTION) } } if ((optp->var_type & GET_TYPE_MASK) == GET_DISABLED) @@ -439,14 +441,14 @@ (*argc)--; continue; } - DBUG_RETURN(EXIT_OPTION_DISABLED); + SET_HO_ERROR_AND_CONTINUE(EXIT_OPTION_DISABLED) } error= 0; value= optp->var_type & GET_ASK_ADDR ? (*my_getopt_get_addr)(key_name, (uint)strlen(key_name), optp, &error) : optp->value; if (error) - DBUG_RETURN(error); + SET_HO_ERROR_AND_CONTINUE(error) if (optp->arg_type == NO_ARG) { @@ -461,7 +463,7 @@ my_getopt_error_reporter(ERROR_LEVEL, "%s: option '--%s' cannot take an argument", my_progname, optp->name); - DBUG_RETURN(EXIT_NO_ARGUMENT_ALLOWED); + SET_HO_ERROR_AND_CONTINUE(EXIT_NO_ARGUMENT_ALLOWED) } if ((optp->var_type & GET_TYPE_MASK) == GET_BOOL) { @@ -490,7 +492,7 @@ if (get_one_option(optp, *((my_bool*) value) ? enabled_my_option : disabled_my_option, filename)) - DBUG_RETURN(EXIT_ARGUMENT_INVALID); + SET_HO_ERROR_AND_CONTINUE(EXIT_ARGUMENT_INVALID) continue; } argument= optend; @@ -504,7 +506,7 @@ "option '--%s' cannot take an argument", my_progname, optp->name); - DBUG_RETURN(EXIT_NO_ARGUMENT_ALLOWED); + SET_HO_ERROR_AND_CONTINUE(EXIT_NO_ARGUMENT_ALLOWED) } if (!(optp->var_type & GET_AUTO)) { @@ -514,7 +516,7 @@ "unsupported by option '--%s'", my_progname, optp->name); if (!option_is_loose) - DBUG_RETURN(EXIT_ARGUMENT_INVALID); + SET_HO_ERROR_AND_CONTINUE(EXIT_ARGUMENT_INVALID) continue; } else @@ -533,7 +535,7 @@ my_getopt_error_reporter(ERROR_LEVEL, "%s: option '--%s' requires an argument", my_progname, optp->name); - DBUG_RETURN(EXIT_ARGUMENT_REQUIRED); + SET_HO_ERROR_AND_CONTINUE(EXIT_ARGUMENT_REQUIRED) } argument= *pos; (*argc)--; @@ -558,14 +560,14 @@ fprintf(stderr, "%s: ERROR: Option '-%c' used, but is disabled\n", my_progname, optp->id); - DBUG_RETURN(EXIT_OPTION_DISABLED); + SET_HO_ERROR_AND_CONTINUE(EXIT_OPTION_DISABLED) } if ((optp->var_type & GET_TYPE_MASK) == GET_BOOL && optp->arg_type == NO_ARG) { *((my_bool*) optp->value)= (my_bool) 1; if (get_one_option(optp, argument, filename)) - DBUG_RETURN(EXIT_UNSPECIFIED_ERROR); + SET_HO_ERROR_AND_CONTINUE(EXIT_UNSPECIFIED_ERROR) continue; } else if (optp->arg_type == REQUIRED_ARG || @@ -585,7 +587,7 @@ if (optp->var_type == GET_BOOL) *((my_bool*) optp->value)= (my_bool) 1; if (get_one_option(optp, argument, filename)) - DBUG_RETURN(EXIT_UNSPECIFIED_ERROR); + SET_HO_ERROR_AND_CONTINUE(EXIT_UNSPECIFIED_ERROR) continue; } /* Check if there are more arguments after this one */ @@ -595,7 +597,7 @@ my_getopt_error_reporter(ERROR_LEVEL, "%s: option '-%c' requires an argument", my_progname, optp->id); - DBUG_RETURN(EXIT_ARGUMENT_REQUIRED); + SET_HO_ERROR_AND_CONTINUE(EXIT_ARGUMENT_REQUIRED) } argument= *++pos; (*argc)--; @@ -603,10 +605,10 @@ } } if ((error= setval(optp, optp->value, argument, - set_maximum_value,filename))) - DBUG_RETURN(error); + set_maximum_value,filename))) + SET_HO_ERROR_AND_CONTINUE(error) if (get_one_option(optp, argument, filename)) - DBUG_RETURN(EXIT_UNSPECIFIED_ERROR); + SET_HO_ERROR_AND_CONTINUE(EXIT_UNSPECIFIED_ERROR) break; } } @@ -640,7 +642,7 @@ my_getopt_error_reporter(ERROR_LEVEL, "%s: unknown option '-%c'", my_progname, *optend); - DBUG_RETURN(EXIT_UNKNOWN_OPTION); + SET_HO_ERROR_AND_CONTINUE(EXIT_UNKNOWN_OPTION) } } } @@ -651,15 +653,17 @@ if ((!option_is_autoset) && ((error= setval(optp, value, argument, set_maximum_value,filename))) && !option_is_loose) - DBUG_RETURN(error); + SET_HO_ERROR_AND_CONTINUE(error) if (get_one_option(optp, argument, filename)) - DBUG_RETURN(EXIT_UNSPECIFIED_ERROR); + SET_HO_ERROR_AND_CONTINUE(EXIT_UNSPECIFIED_ERROR) (*argc)--; /* option handled (long), decrease argument count */ } else /* non-option found */ (*argv)[argvpos++]= cur_arg; } + if (ho_error) + DBUG_RETURN(ho_error); /* Destroy the first, already handled option, so that programs that look for arguments in 'argv', without checking 'argc', know when to stop. @@ -899,7 +903,7 @@ } if (err) { - res= EXIT_UNKNOWN_SUFFIX; + res= err; goto ret; }; } @@ -1034,7 +1038,7 @@ case 'E': return 1ULL << 60; default: - *error= 1; + *error= EXIT_UNKNOWN_SUFFIX; return 0ULL; } } @@ -1060,15 +1064,18 @@ if (errno == ERANGE) { my_getopt_error_reporter(ERROR_LEVEL, - "Incorrect integer value: '%s'", argument); - *error= 1; + "Integer value out of range for int64:" + " '%s' for %s", + argument, option_name); + *error= EXIT_ARGUMENT_INVALID; DBUG_RETURN(0); } num*= eval_num_suffix(endchar, error); if (*error) - fprintf(stderr, - "Unknown suffix '%c' used for variable '%s' (value '%s')\n", - *endchar, option_name, argument); + my_getopt_error_reporter(ERROR_LEVEL, + "Unknown suffix '%c' used for variable '%s' (value '%s'). " + "Legal suffix characters are: K, M, G, T, P, E", + *endchar, option_name, argument); DBUG_RETURN(num); } @@ -1091,7 +1098,7 @@ my_getopt_error_reporter(ERROR_LEVEL, "Incorrect unsigned value: '%s' for %s", argument, option_name); - *error= 1; + *error= EXIT_ARGUMENT_INVALID; DBUG_RETURN(0); } *error= 0; @@ -1100,15 +1107,18 @@ if (errno == ERANGE) { my_getopt_error_reporter(ERROR_LEVEL, - "Incorrect integer value: '%s' for %s", + "Integer value out of range for uint64:" + " '%s' for %s", argument, option_name); - *error= 1; + *error= EXIT_ARGUMENT_INVALID; DBUG_RETURN(0); } num*= eval_num_suffix(endchar, error); if (*error) my_getopt_error_reporter(ERROR_LEVEL, - "Unknown suffix '%c' used for variable '%s' (value '%s')", + "Unknown suffix '%c' used for variable '%s'" + " (value '%s')." + " Legal suffix characters are: K, M, G, T, P, E", *endchar, option_name, argument); DBUG_RETURN(num); } @@ -1128,6 +1138,8 @@ static longlong getopt_ll(char *arg, const struct my_option *optp, int *err) { longlong num=eval_num_suffix_ll(arg, err, (char*) optp->name); + if (*err) + return(0); return getopt_ll_limit_value(num, optp, NULL); } @@ -1205,6 +1217,8 @@ static ulonglong getopt_ull(char *arg, const struct my_option *optp, int *err) { ulonglong num= eval_num_suffix_ull(arg, err, (char*) optp->name); + if (*err) + return(0); return getopt_ull_limit_value(num, optp, NULL); } diff -Nru mariadb-10.11.6/mysys/my_rdtsc.c mariadb-10.11.9/mysys/my_rdtsc.c --- mariadb-10.11.6/mysys/my_rdtsc.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/my_rdtsc.c 2024-08-03 07:29:58.000000000 +0000 @@ -338,7 +338,7 @@ static ulonglong my_timer_init_frequency(MY_TIMER_INFO *mti) { int i; - ulonglong time1, time2, time3, time4; + ulonglong time1, time2, time3, time4, denominator; time1= my_timer_cycles(); time2= my_timer_microseconds(); time3= time2; /* Avoids a Microsoft/IBM compiler warning */ @@ -349,7 +349,8 @@ } time4= my_timer_cycles() - mti->cycles.overhead; time4-= mti->microseconds.overhead; - return (mti->microseconds.frequency * (time4 - time1)) / (time3 - time2); + denominator = ((time3 - time2) == 0) ? 1 : time3 - time2; + return (mti->microseconds.frequency * (time4 - time1)) / denominator; } /* @@ -582,7 +583,7 @@ && mti->microseconds.routine && mti->cycles.routine) { - ulonglong time3, time4; + ulonglong time3, time4, denominator; time1= my_timer_cycles(); time2= my_timer_milliseconds(); time3= time2; /* Avoids a Microsoft/IBM compiler warning */ @@ -592,8 +593,9 @@ if (time3 - time2 > 10) break; } time4= my_timer_cycles(); + denominator = ((time4 - time1) == 0) ? 1 : time4 - time1; mti->milliseconds.frequency= - (mti->cycles.frequency * (time3 - time2)) / (time4 - time1); + (mti->cycles.frequency * (time3 - time2)) / denominator; } /* @@ -607,7 +609,7 @@ && mti->microseconds.routine && mti->cycles.routine) { - ulonglong time3, time4; + ulonglong time3, time4, denominator; time1= my_timer_cycles(); time2= my_timer_ticks(); time3= time2; /* Avoids a Microsoft/IBM compiler warning */ @@ -621,8 +623,9 @@ if (time3 - time2 > 10) break; } time4= my_timer_cycles(); + denominator = ((time4 - time1) == 0) ? 1 : time4 - time1; mti->ticks.frequency= - (mti->cycles.frequency * (time3 - time2)) / (time4 - time1); + (mti->cycles.frequency * (time3 - time2)) / denominator; } } diff -Nru mariadb-10.11.6/mysys/my_thr_init.c mariadb-10.11.9/mysys/my_thr_init.c --- mariadb-10.11.6/mysys/my_thr_init.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/my_thr_init.c 2024-08-03 07:29:58.000000000 +0000 @@ -220,7 +220,11 @@ fprintf(stderr, "Error in my_thread_global_end(): %d threads didn't exit\n", THR_thread_count); -#endif +#endif /* HAVE_PTHREAD_KILL */ +#ifdef SAFEMALLOC + /* We know we will have memoryleaks, suppress the leak report */ + sf_leaking_memory= 1; +#endif /* SAFEMALLOC */ all_threads_killed= 0; break; } @@ -234,9 +238,7 @@ that could use them. */ if (all_threads_killed) - { my_thread_destroy_internal_mutex(); - } my_thread_global_init_done= 0; } diff -Nru mariadb-10.11.6/mysys/safemalloc.c mariadb-10.11.9/mysys/safemalloc.c --- mariadb-10.11.6/mysys/safemalloc.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/safemalloc.c 2024-08-03 07:29:58.000000000 +0000 @@ -70,7 +70,7 @@ uint32 marker; /* Underrun marker value */ }; -static int sf_malloc_count= 0; /* Number of allocated chunks */ +static uint sf_malloc_count= 0; /* Number of allocated chunks */ static void *sf_min_adress= (void*) (intptr)~0ULL, *sf_max_adress= 0; @@ -362,7 +362,7 @@ { struct st_irem *irem; int flag= 0; - int count= 0; + uint count= 0; pthread_mutex_lock(&sf_mutex); count= sf_malloc_count; @@ -387,6 +387,7 @@ { size_t total= 0; struct st_irem *irem; + uint first= 0, chunks= 0; sf_sanity(); @@ -398,15 +399,18 @@ { my_thread_id tid = irem->thread_id && irem->flags & MY_THREAD_SPECIFIC ? irem->thread_id : 0; + if (!first++) + fprintf(stderr, "Memory report from safemalloc\n"); fprintf(stderr, "Warning: %4lu bytes lost at %p, allocated by T@%llu at ", (ulong) irem->datasize, (char*) (irem + 1), tid); print_stack(irem->frame); total+= irem->datasize; + chunks++; } } if (total) - fprintf(stderr, "Memory lost: %lu bytes in %d chunks\n", - (ulong) total, sf_malloc_count); + fprintf(stderr, "Memory lost: %lu bytes in %u chunks of %u total chunks\n", + (ulong) total, chunks, sf_malloc_count); return; } diff -Nru mariadb-10.11.6/mysys/thr_alarm.c mariadb-10.11.9/mysys/thr_alarm.c --- mariadb-10.11.6/mysys/thr_alarm.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/thr_alarm.c 2024-08-03 07:29:58.000000000 +0000 @@ -786,7 +786,6 @@ mysql_mutex_unlock(&LOCK_thread_count); DBUG_PRINT("info",("signal thread created")); - thr_setconcurrency(3); pthread_attr_setscope(&thr_attr,PTHREAD_SCOPE_PROCESS); printf("Main thread: %s\n",my_thread_name()); for (i=0 ; i < 2 ; i++) diff -Nru mariadb-10.11.6/mysys/thr_lock.c mariadb-10.11.9/mysys/thr_lock.c --- mariadb-10.11.6/mysys/thr_lock.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/thr_lock.c 2024-08-03 07:29:58.000000000 +0000 @@ -1784,9 +1784,6 @@ exit(1); } #endif -#ifdef HAVE_THR_SETCONCURRENCY - (void) thr_setconcurrency(2); -#endif for (i=0 ; i < array_elements(lock_counts) ; i++) { param[i]= i; diff -Nru mariadb-10.11.6/mysys/thr_mutex.c mariadb-10.11.9/mysys/thr_mutex.c --- mariadb-10.11.6/mysys/thr_mutex.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/thr_mutex.c 2024-08-03 07:29:58.000000000 +0000 @@ -62,14 +62,10 @@ static struct st_safe_mutex_create_info_t *safe_mutex_create_root= NULL; #endif -static my_bool add_used_to_locked_mutex(safe_mutex_t *used_mutex, - safe_mutex_deadlock_t *locked_mutex); -static my_bool add_to_locked_mutex(safe_mutex_deadlock_t *locked_mutex, - safe_mutex_t *current_mutex); -static my_bool remove_from_locked_mutex(safe_mutex_t *mp, - safe_mutex_t *delete_mutex); -static my_bool remove_from_used_mutex(safe_mutex_deadlock_t *locked_mutex, - safe_mutex_t *mutex); +static my_bool add_used_to_locked_mutex(void *used, void *locked); +static my_bool add_to_locked_mutex(void *locked, void *current); +static my_bool remove_from_locked_mutex(void *m, void* remove); +static my_bool remove_from_used_mutex(void *locked, void *m); static void print_deadlock_warning(safe_mutex_t *new_mutex, safe_mutex_t *conflicting_mutex); #endif @@ -375,8 +371,7 @@ are now locking (C) in B->C, then we would add C into B->locked_mutex and A->locked_mutex */ - my_hash_iterate(mutex_root->used_mutex, - (my_hash_walk_action) add_used_to_locked_mutex, + my_hash_iterate(mutex_root->used_mutex, add_used_to_locked_mutex, deadlock); /* @@ -656,17 +651,14 @@ if (!(mp->create_flags & MYF_NO_DEADLOCK_DETECTION) && mp->used_mutex != NULL) { pthread_mutex_lock(&THR_LOCK_mutex); - my_hash_iterate(mp->used_mutex, - (my_hash_walk_action) remove_from_locked_mutex, - mp); - my_hash_iterate(mp->locked_mutex, - (my_hash_walk_action) remove_from_used_mutex, - mp); + my_hash_iterate(mp->used_mutex, remove_from_locked_mutex, mp); + my_hash_iterate(mp->locked_mutex, remove_from_used_mutex, mp); pthread_mutex_unlock(&THR_LOCK_mutex); my_hash_free(mp->used_mutex); my_hash_free(mp->locked_mutex); my_free(mp->locked_mutex); + mp->locked_mutex= 0; mp->create_flags|= MYF_NO_DEADLOCK_DETECTION; } } @@ -711,15 +703,15 @@ #endif /* SAFE_MUTEX_DETECT_DESTROY */ } -static my_bool add_used_to_locked_mutex(safe_mutex_t *used_mutex, - safe_mutex_deadlock_t *locked_mutex) +static my_bool add_used_to_locked_mutex(void *used, void *locked) { + safe_mutex_t *used_mutex= used; + safe_mutex_deadlock_t *locked_mutex= locked; /* Add mutex to all parent of the current mutex */ if (!locked_mutex->warning_only) { (void) my_hash_iterate(locked_mutex->mutex->locked_mutex, - (my_hash_walk_action) add_to_locked_mutex, - used_mutex); + add_to_locked_mutex, used_mutex); /* mark that locked_mutex is locked after used_mutex */ (void) add_to_locked_mutex(locked_mutex, used_mutex); } @@ -731,12 +723,13 @@ register that locked_mutex was locked after current_mutex */ -static my_bool add_to_locked_mutex(safe_mutex_deadlock_t *locked_mutex, - safe_mutex_t *current_mutex) +static my_bool add_to_locked_mutex(void *locked, void *current) { + safe_mutex_deadlock_t *locked_mutex= locked; + safe_mutex_t *current_mutex= current; DBUG_ENTER("add_to_locked_mutex"); - DBUG_PRINT("info", ("inserting 0x%lx into 0x%lx (id: %lu -> %lu)", - (ulong) locked_mutex, (long) current_mutex, + DBUG_PRINT("info", ("inserting %p into %p (id: %lu -> %lu)", + locked_mutex, current_mutex, locked_mutex->id, current_mutex->id)); if (my_hash_insert(current_mutex->locked_mutex, (uchar*) locked_mutex)) { @@ -764,13 +757,14 @@ When counter goes to 0, we delete the safe_mutex_deadlock_t entry. */ -static my_bool remove_from_locked_mutex(safe_mutex_t *mp, - safe_mutex_t *delete_mutex) +static my_bool remove_from_locked_mutex(void *m, void *remove) { + safe_mutex_t *mp= m; + safe_mutex_t *delete_mutex= remove; safe_mutex_deadlock_t *found; DBUG_ENTER("remove_from_locked_mutex"); - DBUG_PRINT("enter", ("delete_mutex: 0x%lx mutex: 0x%lx (id: %lu <- %lu)", - (ulong) delete_mutex, (ulong) mp, + DBUG_PRINT("enter", ("delete_mutex: %p mutex: %p (id: %lu <- %lu)", + delete_mutex, mp, delete_mutex->id, mp->id)); found= (safe_mutex_deadlock_t *) my_hash_search(mp->locked_mutex, @@ -789,12 +783,13 @@ DBUG_RETURN(0); } -static my_bool remove_from_used_mutex(safe_mutex_deadlock_t *locked_mutex, - safe_mutex_t *mutex) +static my_bool remove_from_used_mutex(void *locked, void *m) { + safe_mutex_deadlock_t *locked_mutex= locked; + safe_mutex_t *mutex= m; DBUG_ENTER("remove_from_used_mutex"); - DBUG_PRINT("enter", ("delete_mutex: 0x%lx mutex: 0x%lx (id: %lu <- %lu)", - (ulong) mutex, (ulong) locked_mutex, + DBUG_PRINT("enter", ("delete_mutex: %p mutex: %p (id: %lu <- %lu)", + mutex, locked_mutex, mutex->id, locked_mutex->id)); if (my_hash_delete(locked_mutex->mutex->used_mutex, (uchar*) mutex)) { diff -Nru mariadb-10.11.6/mysys/thr_rwlock.c mariadb-10.11.9/mysys/thr_rwlock.c --- mariadb-10.11.6/mysys/thr_rwlock.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/thr_rwlock.c 2024-08-03 07:29:58.000000000 +0000 @@ -81,176 +81,7 @@ } #else - -/* - Source base from Sun Microsystems SPILT, simplified for MySQL use - -- Joshua Chamas - Some cleanup and additional code by Monty -*/ - -/* -* Multithreaded Demo Source -* -* Copyright (C) 1995 by Sun Microsystems, Inc. -* -* -* This file is a product of SunSoft, Inc. and is provided for -* unrestricted use provided that this legend is included on all -* media and as a part of the software program in whole or part. -* Users may copy, modify or distribute this file at will. -* -* THIS FILE IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING -* THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR -* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. -* -* This file is provided with no support and without any obligation on the -* part of SunSoft, Inc. to assist in its use, correction, modification or -* enhancement. -* -* SUNSOFT AND SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT -* TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS -* FILE OR ANY PART THEREOF. -* -* IN NO EVENT WILL SUNSOFT OR SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY -* LOST REVENUE OR PROFITS OR OTHER SPECIAL, INDIRECT AND CONSEQUENTIAL -* DAMAGES, EVEN IF THEY HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH -* DAMAGES. -* -* SunSoft, Inc. -* 2550 Garcia Avenue -* Mountain View, California 94043 -*/ - -int my_rw_init(my_rw_lock_t *rwp) -{ - pthread_condattr_t cond_attr; - - pthread_mutex_init( &rwp->lock, MY_MUTEX_INIT_FAST); - pthread_condattr_init( &cond_attr ); - pthread_cond_init( &rwp->readers, &cond_attr ); - pthread_cond_init( &rwp->writers, &cond_attr ); - pthread_condattr_destroy(&cond_attr); - - rwp->state = 0; - rwp->waiters = 0; -#ifdef SAFE_MUTEX - rwp->write_thread = 0; -#endif - - return(0); -} - - -int my_rw_destroy(my_rw_lock_t *rwp) -{ - DBUG_ASSERT(rwp->state == 0); - pthread_mutex_destroy( &rwp->lock ); - pthread_cond_destroy( &rwp->readers ); - pthread_cond_destroy( &rwp->writers ); - return(0); -} - - -int my_rw_rdlock(my_rw_lock_t *rwp) -{ - pthread_mutex_lock(&rwp->lock); - - /* active or queued writers */ - while (( rwp->state < 0 ) || rwp->waiters) - pthread_cond_wait( &rwp->readers, &rwp->lock); - - rwp->state++; - pthread_mutex_unlock(&rwp->lock); - return(0); -} - -int my_rw_tryrdlock(my_rw_lock_t *rwp) -{ - int res; - pthread_mutex_lock(&rwp->lock); - if ((rwp->state < 0 ) || rwp->waiters) - res= EBUSY; /* Can't get lock */ - else - { - res=0; - rwp->state++; - } - pthread_mutex_unlock(&rwp->lock); - return(res); -} - - -int my_rw_wrlock(my_rw_lock_t *rwp) -{ - pthread_mutex_lock(&rwp->lock); - rwp->waiters++; /* another writer queued */ - - my_rw_lock_assert_not_write_owner(rwp); - - while (rwp->state) - pthread_cond_wait(&rwp->writers, &rwp->lock); - rwp->state = -1; - rwp->waiters--; -#ifdef SAFE_MUTEX - rwp->write_thread= pthread_self(); -#endif - pthread_mutex_unlock(&rwp->lock); - return(0); -} - - -int my_rw_trywrlock(my_rw_lock_t *rwp) -{ - int res; - - pthread_mutex_lock(&rwp->lock); - if (rwp->state) - res= EBUSY; /* Can't get lock */ - else - { - res=0; - rwp->state = -1; -#ifdef SAFE_MUTEX - rwp->write_thread= pthread_self(); -#endif - } - pthread_mutex_unlock(&rwp->lock); - return(res); -} - - -int my_rw_unlock(my_rw_lock_t *rwp) -{ - DBUG_PRINT("rw_unlock", - ("state: %d waiters: %d", rwp->state, rwp->waiters)); - pthread_mutex_lock(&rwp->lock); - - DBUG_ASSERT(rwp->state != 0); - - if (rwp->state == -1) /* writer releasing */ - { - my_rw_lock_assert_write_owner(rwp); - rwp->state= 0; /* mark as available */ -#ifdef SAFE_MUTEX - rwp->write_thread= 0; -#endif - - if ( rwp->waiters ) /* writers queued */ - pthread_cond_signal( &rwp->writers ); - else - pthread_cond_broadcast( &rwp->readers ); - } - else - { - if ( --rwp->state == 0 && /* no more readers */ - rwp->waiters) - pthread_cond_signal( &rwp->writers ); - } - - pthread_mutex_unlock( &rwp->lock ); - return(0); -} - +#error no pthread_rwlock_init #endif /* !defined _WIN32 */ #endif /* NEED_MY_RW_LOCK*/ diff -Nru mariadb-10.11.6/mysys/thr_timer.c mariadb-10.11.9/mysys/thr_timer.c --- mariadb-10.11.6/mysys/thr_timer.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/thr_timer.c 2024-08-03 07:29:58.000000000 +0000 @@ -533,7 +533,6 @@ mysql_mutex_init(0, &LOCK_thread_count, MY_MUTEX_INIT_FAST); mysql_cond_init(0, &COND_thread_count, NULL); - thr_setconcurrency(3); pthread_attr_init(&thr_attr); pthread_attr_setscope(&thr_attr,PTHREAD_SCOPE_PROCESS); printf("Main thread: %s\n",my_thread_name()); diff -Nru mariadb-10.11.6/mysys/waiting_threads.c mariadb-10.11.9/mysys/waiting_threads.c --- mariadb-10.11.6/mysys/waiting_threads.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys/waiting_threads.c 2024-08-03 07:29:58.000000000 +0000 @@ -424,8 +424,10 @@ It's called from lf_hash when an element is inserted. */ static void wt_resource_init(LF_HASH *hash __attribute__((unused)), - WT_RESOURCE *rc, WT_RESOURCE_ID *id) + void *resource, const void *ident) { + WT_RESOURCE *rc= resource; + const WT_RESOURCE_ID *id= ident; DBUG_ENTER("wt_resource_init"); rc->id= *id; rc->waiter_count= 0; diff -Nru mariadb-10.11.6/mysys_ssl/my_crypt.cc mariadb-10.11.9/mysys_ssl/my_crypt.cc --- mariadb-10.11.6/mysys_ssl/my_crypt.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/mysys_ssl/my_crypt.cc 2024-08-03 07:29:58.000000000 +0000 @@ -101,10 +101,10 @@ uchar source_tail[MY_AES_BLOCK_SIZE]; MyCTX_nopad() : MyCTX() { } - ~MyCTX_nopad() = default; + ~MyCTX_nopad() override = default; int init(const EVP_CIPHER *cipher, int encrypt, const uchar *key, uint klen, - const uchar *iv, uint ivlen) + const uchar *iv, uint ivlen) override { compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX_nopad)); this->key= key; @@ -141,13 +141,13 @@ source_tail_len= new_tail_len; } - int update(const uchar *src, uint slen, uchar *dst, uint *dlen) + int update(const uchar *src, uint slen, uchar *dst, uint *dlen) override { update_source_tail(src, slen); return MyCTX::update(src, slen, dst, dlen); } - int finish(uchar *dst, uint *dlen) + int finish(uchar *dst, uint *dlen) override { if (source_tail_len) { @@ -206,10 +206,10 @@ const uchar *aad; int aadlen; MyCTX_gcm() : MyCTX() { } - ~MyCTX_gcm() { } + ~MyCTX_gcm() override { } int init(const EVP_CIPHER *cipher, int encrypt, const uchar *key, uint klen, - const uchar *iv, uint ivlen) + const uchar *iv, uint ivlen) override { compile_time_assert(MY_AES_CTX_SIZE >= sizeof(MyCTX_gcm)); int res= MyCTX::init(cipher, encrypt, key, klen, iv, ivlen); @@ -219,7 +219,7 @@ return res; } - int update(const uchar *src, uint slen, uchar *dst, uint *dlen) + int update(const uchar *src, uint slen, uchar *dst, uint *dlen) override { /* note that this GCM class cannot do streaming decryption, because @@ -244,7 +244,7 @@ return MyCTX::update(src, slen, dst, dlen); } - int finish(uchar *dst, uint *dlen) + int finish(uchar *dst, uint *dlen) override { int fin; if (!EVP_CipherFinal_ex(ctx, dst, &fin)) diff -Nru mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_mul.c mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_mul.c --- mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_mul.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_mul.c 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,6 @@ #include "fe.h" #include "crypto_int64.h" +#include "crypto_uint64.h" /* h = f * g @@ -179,16 +180,16 @@ crypto_int64 h7 = f0g7+f1g6 +f2g5 +f3g4 +f4g3 +f5g2 +f6g1 +f7g0 +f8g9_19+f9g8_19; crypto_int64 h8 = f0g8+f1g7_2 +f2g6 +f3g5_2 +f4g4 +f5g3_2 +f6g2 +f7g1_2 +f8g0 +f9g9_38; crypto_int64 h9 = f0g9+f1g8 +f2g7 +f3g6 +f4g5 +f5g4 +f6g3 +f7g2 +f8g1 +f9g0 ; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; + crypto_uint64 carry0; + crypto_uint64 carry1; + crypto_uint64 carry2; + crypto_uint64 carry3; + crypto_uint64 carry4; + crypto_uint64 carry5; + crypto_uint64 carry6; + crypto_uint64 carry7; + crypto_uint64 carry8; + crypto_uint64 carry9; /* |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38)) diff -Nru mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_sq.c mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_sq.c --- mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_sq.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_sq.c 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,6 @@ #include "fe.h" #include "crypto_int64.h" +#include "crypto_uint64.h" /* h = f * f @@ -106,16 +107,16 @@ crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; + crypto_uint64 carry0; + crypto_uint64 carry1; + crypto_uint64 carry2; + crypto_uint64 carry3; + crypto_uint64 carry4; + crypto_uint64 carry5; + crypto_uint64 carry6; + crypto_uint64 carry7; + crypto_uint64 carry8; + crypto_uint64 carry9; carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; diff -Nru mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_sq2.c mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_sq2.c --- mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_sq2.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_sq2.c 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,6 @@ #include "fe.h" #include "crypto_int64.h" +#include "crypto_uint64.h" /* h = 2 * f * f @@ -106,16 +107,16 @@ crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38; crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4 +f9f9_38; crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; + crypto_uint64 carry0; + crypto_uint64 carry1; + crypto_uint64 carry2; + crypto_uint64 carry3; + crypto_uint64 carry4; + crypto_uint64 carry5; + crypto_uint64 carry6; + crypto_uint64 carry7; + crypto_uint64 carry8; + crypto_uint64 carry9; h0 += h0; h1 += h1; diff -Nru mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_tobytes.c mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_tobytes.c --- mariadb-10.11.6/plugin/auth_ed25519/ref10/fe_tobytes.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_ed25519/ref10/fe_tobytes.c 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,5 @@ #include "fe.h" +#include "crypto_uint32.h" /* Preconditions: @@ -38,16 +39,16 @@ crypto_int32 h8 = h[8]; crypto_int32 h9 = h[9]; crypto_int32 q; - crypto_int32 carry0; - crypto_int32 carry1; - crypto_int32 carry2; - crypto_int32 carry3; - crypto_int32 carry4; - crypto_int32 carry5; - crypto_int32 carry6; - crypto_int32 carry7; - crypto_int32 carry8; - crypto_int32 carry9; + crypto_uint32 carry0; + crypto_uint32 carry1; + crypto_uint32 carry2; + crypto_uint32 carry3; + crypto_uint32 carry4; + crypto_uint32 carry5; + crypto_uint32 carry6; + crypto_uint32 carry7; + crypto_uint32 carry8; + crypto_uint32 carry9; q = (19 * h9 + (((crypto_int32) 1) << 24)) >> 25; q = (h0 + q) >> 26; @@ -87,32 +88,32 @@ s[0] = h0 >> 0; s[1] = h0 >> 8; s[2] = h0 >> 16; - s[3] = (h0 >> 24) | (h1 << 2); + s[3] = (h0 >> 24) | ((crypto_uint32)h1 << 2); s[4] = h1 >> 6; s[5] = h1 >> 14; - s[6] = (h1 >> 22) | (h2 << 3); + s[6] = (h1 >> 22) | ((crypto_uint32)h2 << 3); s[7] = h2 >> 5; s[8] = h2 >> 13; - s[9] = (h2 >> 21) | (h3 << 5); + s[9] = (h2 >> 21) | ((crypto_uint32)h3 << 5); s[10] = h3 >> 3; s[11] = h3 >> 11; - s[12] = (h3 >> 19) | (h4 << 6); + s[12] = (h3 >> 19) | ((crypto_uint32)h4 << 6); s[13] = h4 >> 2; s[14] = h4 >> 10; s[15] = h4 >> 18; s[16] = h5 >> 0; s[17] = h5 >> 8; s[18] = h5 >> 16; - s[19] = (h5 >> 24) | (h6 << 1); + s[19] = (h5 >> 24) | ((crypto_uint32)h6 << 1); s[20] = h6 >> 7; s[21] = h6 >> 15; - s[22] = (h6 >> 23) | (h7 << 3); + s[22] = (h6 >> 23) | ((crypto_uint32)h7 << 3); s[23] = h7 >> 5; s[24] = h7 >> 13; - s[25] = (h7 >> 21) | (h8 << 4); + s[25] = (h7 >> 21) | ((crypto_uint32)h8 << 4); s[26] = h8 >> 4; s[27] = h8 >> 12; - s[28] = (h8 >> 20) | (h9 << 6); + s[28] = (h8 >> 20) | ((crypto_uint32)h9 << 6); s[29] = h9 >> 2; s[30] = h9 >> 10; s[31] = h9 >> 18; diff -Nru mariadb-10.11.6/plugin/auth_ed25519/ref10/ge_scalarmult_base.c mariadb-10.11.9/plugin/auth_ed25519/ref10/ge_scalarmult_base.c --- mariadb-10.11.6/plugin/auth_ed25519/ref10/ge_scalarmult_base.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_ed25519/ref10/ge_scalarmult_base.c 2024-08-03 07:29:58.000000000 +0000 @@ -35,7 +35,7 @@ { ge_precomp minust; unsigned char bnegative = negative(b); - unsigned char babs = b - (((-bnegative) & b) << 1); + unsigned char babs = b - ((unsigned char)((-bnegative) & b) << 1); ge_precomp_0(t); cmov(t,&base[pos][0],equal(babs,1)); diff -Nru mariadb-10.11.6/plugin/auth_ed25519/ref10/sc_muladd.c mariadb-10.11.9/plugin/auth_ed25519/ref10/sc_muladd.c --- mariadb-10.11.6/plugin/auth_ed25519/ref10/sc_muladd.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_ed25519/ref10/sc_muladd.c 2024-08-03 07:29:58.000000000 +0000 @@ -95,29 +95,29 @@ crypto_int64 s21; crypto_int64 s22; crypto_int64 s23; - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - crypto_int64 carry10; - crypto_int64 carry11; - crypto_int64 carry12; - crypto_int64 carry13; - crypto_int64 carry14; - crypto_int64 carry15; - crypto_int64 carry16; - crypto_int64 carry17; - crypto_int64 carry18; - crypto_int64 carry19; - crypto_int64 carry20; - crypto_int64 carry21; - crypto_int64 carry22; + crypto_uint64 carry0; + crypto_uint64 carry1; + crypto_uint64 carry2; + crypto_uint64 carry3; + crypto_uint64 carry4; + crypto_uint64 carry5; + crypto_uint64 carry6; + crypto_uint64 carry7; + crypto_uint64 carry8; + crypto_uint64 carry9; + crypto_uint64 carry10; + crypto_uint64 carry11; + crypto_uint64 carry12; + crypto_uint64 carry13; + crypto_uint64 carry14; + crypto_uint64 carry15; + crypto_uint64 carry16; + crypto_uint64 carry17; + crypto_uint64 carry18; + crypto_uint64 carry19; + crypto_uint64 carry20; + crypto_uint64 carry21; + crypto_uint64 carry22; s0 = c0 + a0*b0; s1 = c1 + a0*b1 + a1*b0; diff -Nru mariadb-10.11.6/plugin/auth_ed25519/ref10/sc_reduce.c mariadb-10.11.9/plugin/auth_ed25519/ref10/sc_reduce.c --- mariadb-10.11.6/plugin/auth_ed25519/ref10/sc_reduce.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_ed25519/ref10/sc_reduce.c 2024-08-03 07:29:58.000000000 +0000 @@ -58,23 +58,23 @@ crypto_int64 s21 = 2097151 & (load_3(s + 55) >> 1); crypto_int64 s22 = 2097151 & (load_4(s + 57) >> 6); crypto_int64 s23 = (load_4(s + 60) >> 3); - crypto_int64 carry0; - crypto_int64 carry1; - crypto_int64 carry2; - crypto_int64 carry3; - crypto_int64 carry4; - crypto_int64 carry5; - crypto_int64 carry6; - crypto_int64 carry7; - crypto_int64 carry8; - crypto_int64 carry9; - crypto_int64 carry10; - crypto_int64 carry11; - crypto_int64 carry12; - crypto_int64 carry13; - crypto_int64 carry14; - crypto_int64 carry15; - crypto_int64 carry16; + crypto_uint64 carry0; + crypto_uint64 carry1; + crypto_uint64 carry2; + crypto_uint64 carry3; + crypto_uint64 carry4; + crypto_uint64 carry5; + crypto_uint64 carry6; + crypto_uint64 carry7; + crypto_uint64 carry8; + crypto_uint64 carry9; + crypto_uint64 carry10; + crypto_uint64 carry11; + crypto_uint64 carry12; + crypto_uint64 carry13; + crypto_uint64 carry14; + crypto_uint64 carry15; + crypto_uint64 carry16; s11 += s23 * 666643; s12 += s23 * 470296; diff -Nru mariadb-10.11.6/plugin/auth_gssapi/README.md mariadb-10.11.9/plugin/auth_gssapi/README.md --- mariadb-10.11.6/plugin/auth_gssapi/README.md 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_gssapi/README.md 2024-08-03 07:29:58.000000000 +0000 @@ -49,7 +49,7 @@ Creating service principal is not required here (but you can still do it using [_setspn_](https://technet.microsoft.com/en-us/library/cc731241.aspx) tool) -# Installing plugin +## Installing plugin - Start the server - On Unix, edit my the my.cnf/my.ini configuration file, set the parameter gssapi-keytab-path to point to previously @@ -72,7 +72,7 @@ INSTALL SONAME 'auth_gssapi' ``` -#Creating users +## Creating users Now, you can create a user for GSSAPI/SSPI authentication. CREATE USER command, for Kerberos user would be like this (*long* form, see below for short one) @@ -94,7 +94,7 @@ If this syntax is used, realm part is *not* used for comparison thus 'usr1@EXAMPLE.COM', 'usr1@EXAMPLE.CO.UK' and 'mymachine\usr1' will all identify as 'usr1'. -#Login as GSSAPI user with command line clients +## Login as GSSAPI user with command line clients Using command line client, do @@ -102,7 +102,7 @@ mysql --plugin-dir=/path/to/plugin-dir -u usr1 ``` -#Plugin variables +## Plugin variables - **gssapi-keytab-path** (Unix only) - Path to the server keytab file - **gssapi-principal-name** - name of the service principal. - **gssapi-mech-name** (Windows only) - Name of the SSPI package used by server. Can be either 'Kerberos' or 'Negotiate'. @@ -111,7 +111,7 @@ to allow non-domain environment (e.g if server does not run in domain environment). -#Implementation +## Implementation Overview of the protocol between client and server diff -Nru mariadb-10.11.6/plugin/auth_pam/auth_pam.c mariadb-10.11.9/plugin/auth_pam/auth_pam.c --- mariadb-10.11.6/plugin/auth_pam/auth_pam.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_pam/auth_pam.c 2024-08-03 07:29:58.000000000 +0000 @@ -22,6 +22,7 @@ #include #include #include +#include #include #include "auth_pam_tool.h" diff -Nru mariadb-10.11.6/plugin/auth_pam/auth_pam_base.c mariadb-10.11.9/plugin/auth_pam/auth_pam_base.c --- mariadb-10.11.6/plugin/auth_pam/auth_pam_base.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_pam/auth_pam_base.c 2024-08-03 07:29:58.000000000 +0000 @@ -99,7 +99,7 @@ freeing it is the responsibility of the caller */ if (*resp == 0) { - *resp = calloc(sizeof(struct pam_response), n); + *resp = calloc(n, sizeof(struct pam_response)); if (*resp == 0) return PAM_BUF_ERR; } diff -Nru mariadb-10.11.6/plugin/auth_pam/testing/pam_mariadb_mtr.c mariadb-10.11.9/plugin/auth_pam/testing/pam_mariadb_mtr.c --- mariadb-10.11.6/plugin/auth_pam/testing/pam_mariadb_mtr.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/auth_pam/testing/pam_mariadb_mtr.c 2024-08-03 07:29:58.000000000 +0000 @@ -10,8 +10,8 @@ #include #include -#include #include +#include #define N 3 diff -Nru mariadb-10.11.6/plugin/aws_key_management/aws_key_management_plugin.cc mariadb-10.11.9/plugin/aws_key_management/aws_key_management_plugin.cc --- mariadb-10.11.6/plugin/aws_key_management/aws_key_management_plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/aws_key_management/aws_key_management_plugin.cc 2024-08-03 07:29:58.000000000 +0000 @@ -154,7 +154,7 @@ Base(logLevel) { } - virtual LogLevel GetLogLevel(void) const override + LogLevel GetLogLevel(void) const override { return (LogLevel)log_level; } @@ -162,12 +162,12 @@ { } - virtual void Flush(void) override + void Flush(void) override { } protected: - virtual void ProcessFormattedStatement(Aws::String&& statement) override + void ProcessFormattedStatement(Aws::String&& statement) override { #ifdef _WIN32 /* diff -Nru mariadb-10.11.6/plugin/cracklib_password_check/CMakeLists.txt mariadb-10.11.9/plugin/cracklib_password_check/CMakeLists.txt --- mariadb-10.11.6/plugin/cracklib_password_check/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/cracklib_password_check/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -32,11 +32,12 @@ IF(CHECKMODULE AND SEMODULE_PACKAGE) FOREACH(pol mariadb-plugin-cracklib-password-check) SET(src ${CMAKE_CURRENT_SOURCE_DIR}/policy/selinux/${pol}.te) - SET(tmp ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${pol}-pp.dir/${pol}.mod) + SET(tmp ${CMAKE_CURRENT_BINARY_DIR}/${pol}.mod) SET(out ${CMAKE_CURRENT_BINARY_DIR}/${pol}.pp) ADD_CUSTOM_COMMAND(OUTPUT ${out} COMMAND ${CHECKMODULE} -M -m ${src} -o ${tmp} COMMAND ${SEMODULE_PACKAGE} -m ${tmp} -o ${out} + COMMAND ${CMAKE_COMMAND} -E remove ${tmp} DEPENDS ${src}) ADD_CUSTOM_TARGET(${pol}-pp ALL DEPENDS ${out}) INSTALL(FILES ${out} DESTINATION ${inst_location}/policy/selinux COMPONENT cracklib-password-check) diff -Nru mariadb-10.11.6/plugin/disks/CMakeLists.txt mariadb-10.11.9/plugin/disks/CMakeLists.txt --- mariadb-10.11.6/plugin/disks/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/disks/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -4,7 +4,8 @@ CHECK_SYMBOL_EXISTS (getmntent "sys/mnttab.h" HAVE_GETMNTENT_IN_SYS_MNTAB) CHECK_SYMBOL_EXISTS (setmntent "mntent.h" HAVE_SETMNTENT) CHECK_SYMBOL_EXISTS (getmntinfo "sys/types.h;sys/mount.h" HAVE_GETMNTINFO) -CHECK_SYMBOL_EXISTS (getmntinfo64 "sys/types.h;sys/mount.h" HAVE_GETMNTINFO64) + +CHECK_INCLUDE_FILES (sys/mntent.h HAVE_SYS_MNTENT_H) IF (HAVE_GETMNTINFO) CHECK_CXX_SOURCE_COMPILES(" @@ -18,7 +19,7 @@ " HAVE_GETMNTINFO_TAKES_statvfs) ENDIF() IF (HAVE_GETMNTENT OR HAVE_GETMNTENT_IN_SYS_MNTAB OR - HAVE_GETMNTINFO OR HAVE_GETMNTINFO64) + HAVE_GETMNTINFO) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql) MYSQL_ADD_PLUGIN(DISKS information_schema_disks.cc MODULE_ONLY RECOMPILE_FOR_EMBEDDED) ENDIF() diff -Nru mariadb-10.11.6/plugin/disks/information_schema_disks.cc mariadb-10.11.9/plugin/disks/information_schema_disks.cc --- mariadb-10.11.6/plugin/disks/information_schema_disks.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/disks/information_schema_disks.cc 2024-08-03 07:29:58.000000000 +0000 @@ -19,7 +19,7 @@ #include #if defined(HAVE_GETMNTENT) #include -#elif !defined(HAVE_GETMNTINFO_TAKES_statvfs) +#elif defined(HAVE_GETMNTINFO) && !defined(HAVE_GETMNTINFO_TAKES_statvfs) /* getmntinfo (the not NetBSD variants) */ #include #include @@ -28,6 +28,9 @@ #if defined(HAVE_GETMNTENT_IN_SYS_MNTAB) #include #define HAVE_GETMNTENT +#if defined(HAVE_SYS_MNTENT_H) +#include +#endif #endif #include #include @@ -37,8 +40,7 @@ This intends to support *BSD's, macOS, Solaris, AIX, HP-UX, and Linux. specificly: - FreeBSD/OpenBSD/DragonFly (statfs) NetBSD (statvfs) uses getmntinfo(). - macOS uses getmntinfo64(). + FreeBSD/OpenBSD/DragonFly/macOS (statfs) NetBSD (statvfs) uses getmntinfo(). Linux can use getmntent_r(), but we've just used getmntent for simplification. Linux/Solaris/AIX/HP-UX uses setmntent()/getmntent(). Solaris uses getmntent() with a diffent prototype, return structure, and @@ -46,8 +48,6 @@ */ #if defined(HAVE_GETMNTINFO_TAKES_statvfs) || defined(HAVE_GETMNTENT) typedef struct statvfs st_info; -#elif defined(HAVE_GETMNTINFO64) -typedef struct statfs64 st_info; #else // GETMNTINFO typedef struct statfs st_info; #endif @@ -150,8 +150,6 @@ #if defined(HAVE_GETMNTINFO_TAKES_statvfs) count= getmntinfo(&s, ST_WAIT); -#elif defined(HAVE_GETMNTINFO64) - count= getmntinfo64(&s, MNT_WAIT); #else count= getmntinfo(&s, MNT_WAIT); #endif diff -Nru mariadb-10.11.6/plugin/disks/mysql-test/disks/disks.result mariadb-10.11.9/plugin/disks/mysql-test/disks/disks.result --- mariadb-10.11.6/plugin/disks/mysql-test/disks/disks.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/disks/mysql-test/disks/disks.result 2024-08-03 07:29:58.000000000 +0000 @@ -7,6 +7,6 @@ `Used` bigint(32) NOT NULL, `Available` bigint(32) NOT NULL ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci -select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; -sum(Total) > sum(Available) sum(Total)>sum(Used) +select sum(Total) >= sum(Available), sum(Total)>=sum(Used) from information_schema.disks; +sum(Total) >= sum(Available) sum(Total)>=sum(Used) 1 1 diff -Nru mariadb-10.11.6/plugin/disks/mysql-test/disks/disks.test mariadb-10.11.9/plugin/disks/mysql-test/disks/disks.test --- mariadb-10.11.6/plugin/disks/mysql-test/disks/disks.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/disks/mysql-test/disks/disks.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,3 +1,3 @@ --replace_regex /varchar\([0-9]+\)/varchar(pathlen)/ show create table information_schema.disks; -select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; +select sum(Total) >= sum(Available), sum(Total)>=sum(Used) from information_schema.disks; diff -Nru mariadb-10.11.6/plugin/disks/mysql-test/disks/disks_notembedded.result mariadb-10.11.9/plugin/disks/mysql-test/disks/disks_notembedded.result --- mariadb-10.11.6/plugin/disks/mysql-test/disks/disks_notembedded.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/disks/mysql-test/disks/disks_notembedded.result 2024-08-03 07:29:58.000000000 +0000 @@ -6,16 +6,16 @@ GRANT SELECT ON *.* TO user1@localhost; connect con1,localhost,user1,,; connection con1; -select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; -sum(Total) > sum(Available) sum(Total)>sum(Used) +select sum(Total) >= sum(Available), sum(Total) >= sum(Used) from information_schema.disks; +sum(Total) >= sum(Available) sum(Total) >= sum(Used) NULL NULL disconnect con1; connection default; GRANT FILE ON *.* TO user1@localhost; connect con1,localhost,user1,,; connection con1; -select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; -sum(Total) > sum(Available) sum(Total)>sum(Used) +select sum(Total) >= sum(Available), sum(Total) >= sum(Used) from information_schema.disks; +sum(Total) >= sum(Available) sum(Total) >= sum(Used) 1 1 connection default; DROP USER user1@localhost; diff -Nru mariadb-10.11.6/plugin/disks/mysql-test/disks/disks_notembedded.test mariadb-10.11.9/plugin/disks/mysql-test/disks/disks_notembedded.test --- mariadb-10.11.6/plugin/disks/mysql-test/disks/disks_notembedded.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/disks/mysql-test/disks/disks_notembedded.test 2024-08-03 07:29:58.000000000 +0000 @@ -10,7 +10,7 @@ connect (con1,localhost,user1,,); connection con1; -select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; +select sum(Total) >= sum(Available), sum(Total) >= sum(Used) from information_schema.disks; disconnect con1; connection default; @@ -18,7 +18,7 @@ connect (con1,localhost,user1,,); connection con1; -select sum(Total) > sum(Available), sum(Total)>sum(Used) from information_schema.disks; +select sum(Total) >= sum(Available), sum(Total) >= sum(Used) from information_schema.disks; connection default; DROP USER user1@localhost; diff -Nru mariadb-10.11.6/plugin/feedback/CMakeLists.txt mariadb-10.11.9/plugin/feedback/CMakeLists.txt --- mariadb-10.11.6/plugin/feedback/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/feedback/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql - ${PCRE_INCLUDES} + ${PCRE_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS}) SET(FEEDBACK_SOURCES feedback.cc sender_thread.cc diff -Nru mariadb-10.11.6/plugin/feedback/feedback.cc mariadb-10.11.9/plugin/feedback/feedback.cc --- mariadb-10.11.6/plugin/feedback/feedback.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/feedback/feedback.cc 2024-08-03 07:29:58.000000000 +0000 @@ -26,10 +26,8 @@ ulong debug_startup_interval, debug_first_interval, debug_interval; #endif -char server_uid_buf[SERVER_UID_SIZE+1]; ///< server uid will be written here - /* backing store for system variables */ -static char *server_uid= server_uid_buf, *url, *http_proxy; +static char *url, *http_proxy; char *user_info; ulong send_timeout, send_retry_wait; @@ -253,9 +251,6 @@ PSI_register(cond); PSI_register(thread); - if (calculate_server_uid(server_uid_buf)) - return 1; - prepare_linux_info(); #ifndef DBUG_OFF @@ -339,6 +334,10 @@ shutdown_plugin= true; mysql_cond_signal(&sleep_condition); mysql_mutex_unlock(&sleep_mutex); + + for (uint i= 0; i < url_count; i++) + urls[i]->abort(); + pthread_join(sender_thread, NULL); mysql_mutex_destroy(&sleep_mutex); @@ -357,9 +356,6 @@ #define DEFAULT_PROTO "http://" #endif -static MYSQL_SYSVAR_STR(server_uid, server_uid, - PLUGIN_VAR_READONLY | PLUGIN_VAR_NOCMDOPT, - "Automatically calculated server unique id hash.", NULL, NULL, 0); static MYSQL_SYSVAR_STR(user_info, user_info, PLUGIN_VAR_READONLY | PLUGIN_VAR_RQCMDARG, "User specified string that will be included in the feedback report.", @@ -390,7 +386,6 @@ #endif static struct st_mysql_sys_var* settings[] = { - MYSQL_SYSVAR(server_uid), MYSQL_SYSVAR(user_info), MYSQL_SYSVAR(url), MYSQL_SYSVAR(send_timeout), diff -Nru mariadb-10.11.6/plugin/feedback/feedback.h mariadb-10.11.9/plugin/feedback/feedback.h --- mariadb-10.11.6/plugin/feedback/feedback.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/feedback/feedback.h 2024-08-03 07:29:58.000000000 +0000 @@ -25,8 +25,7 @@ int fill_linux_info(THD *thd, TABLE_LIST *tables); int fill_collation_statistics(THD *thd, TABLE_LIST *tables); -static const int SERVER_UID_SIZE= 29; -extern char server_uid_buf[SERVER_UID_SIZE+1], *user_info; +extern char *user_info; int calculate_server_uid(char *); int prepare_linux_info(); @@ -52,6 +51,7 @@ const char *url() { return full_url.str; } size_t url_length() { return full_url.length; } + virtual void abort() = 0; virtual int send(const char* data, size_t data_length) = 0; virtual int set_proxy(const char *proxy, size_t proxy_len) { diff -Nru mariadb-10.11.6/plugin/feedback/sender_thread.cc mariadb-10.11.9/plugin/feedback/sender_thread.cc --- mariadb-10.11.6/plugin/feedback/sender_thread.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/feedback/sender_thread.cc 2024-08-03 07:29:58.000000000 +0000 @@ -96,8 +96,8 @@ thd->mysys_var->current_cond= &sleep_condition; thd->mysys_var->current_mutex= &sleep_mutex; + thd->mark_connection_idle(); thd->proc_info="feedback"; - thd->set_command(COM_SLEEP); thd->system_thread= SYSTEM_THREAD_EVENT_WORKER; // whatever thd->set_time(); thd->init_for_queries(); @@ -183,7 +183,7 @@ str.length(0); str.append(STRING_WITH_LEN("FEEDBACK_SERVER_UID")); str.append('\t'); - str.append(server_uid_buf, sizeof(server_uid_buf)-1); + str.append(server_uid, sizeof(server_uid)-1); str.append('\n'); str.append(STRING_WITH_LEN("FEEDBACK_WHEN")); str.append('\t'); diff -Nru mariadb-10.11.6/plugin/feedback/url_http.cc mariadb-10.11.9/plugin/feedback/url_http.cc --- mariadb-10.11.6/plugin/feedback/url_http.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/feedback/url_http.cc 2024-08-03 07:29:58.000000000 +0000 @@ -37,8 +37,9 @@ class Url_http: public Url { protected: const LEX_STRING host, port, path; - bool ssl; LEX_STRING proxy_host, proxy_port; + my_socket fd; + bool ssl; bool use_proxy() { @@ -47,11 +48,12 @@ Url_http(LEX_STRING &url_arg, LEX_STRING &host_arg, LEX_STRING &port_arg, LEX_STRING &path_arg, bool ssl_arg) : - Url(url_arg), host(host_arg), port(port_arg), path(path_arg), ssl(ssl_arg) + Url(url_arg), host(host_arg), port(port_arg), path(path_arg), + fd(INVALID_SOCKET), ssl(ssl_arg) { proxy_host.length= 0; } - ~Url_http() + ~Url_http() override { my_free(host.str); my_free(port.str); @@ -60,8 +62,9 @@ } public: - int send(const char* data, size_t data_length); - int set_proxy(const char *proxy, size_t proxy_len) + void abort() override; + int send(const char* data, size_t data_length) override; + int set_proxy(const char *proxy, size_t proxy_len) override { if (use_proxy()) { @@ -158,13 +161,18 @@ return new Url_http(full_url, host, port, path, ssl); } +void Url_http::abort() +{ + if (fd != INVALID_SOCKET) + closesocket(fd); // interrupt I/O waits +} + /* do the vio_write and check that all data were sent ok */ #define write_check(VIO, DATA, LEN) \ (vio_write((VIO), (uchar*)(DATA), (LEN)) != (LEN)) int Url_http::send(const char* data, size_t data_length) { - my_socket fd= INVALID_SOCKET; char buf[1024]; size_t len= 0; @@ -180,6 +188,7 @@ return 1; } + DBUG_ASSERT(fd == INVALID_SOCKET); for (addr= addrs; addr != NULL; addr= addr->ai_next) { fd= socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol); @@ -208,6 +217,7 @@ sql_print_error("feedback plugin: vio_new failed for url '%s'", full_url.str); closesocket(fd); + fd= INVALID_SOCKET; return 1; } @@ -236,6 +246,7 @@ free_vio_ssl_acceptor_fd(ssl_fd); closesocket(fd); vio_delete(vio); + fd= INVALID_SOCKET; return 1; } } @@ -334,6 +345,7 @@ } #endif + fd= INVALID_SOCKET; return res; } diff -Nru mariadb-10.11.6/plugin/feedback/utils.cc mariadb-10.11.9/plugin/feedback/utils.cc --- mariadb-10.11.6/plugin/feedback/utils.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/feedback/utils.cc 2024-08-03 07:29:58.000000000 +0000 @@ -412,31 +412,4 @@ } return 0; }; - -/** - calculates the server unique identifier - - UID is a base64 encoded SHA1 hash of the MAC address of one of - the interfaces, and the tcp port that the server is listening on -*/ -int calculate_server_uid(char *dest) -{ - uchar rawbuf[2 + 6]; - uchar shabuf[MY_SHA1_HASH_SIZE]; - - int2store(rawbuf, mysqld_port); - if (my_gethwaddr(rawbuf + 2)) - { - sql_print_error("feedback plugin: failed to retrieve the MAC address"); - return 1; - } - - my_sha1((uint8*) shabuf, (char*) rawbuf, sizeof(rawbuf)); - - assert(my_base64_needed_encoded_length(sizeof(shabuf)) <= SERVER_UID_SIZE); - my_base64_encode(shabuf, sizeof(shabuf), dest); - - return 0; -} - } // namespace feedback diff -Nru mariadb-10.11.6/plugin/file_key_management/parser.cc mariadb-10.11.9/plugin/file_key_management/parser.cc --- mariadb-10.11.6/plugin/file_key_management/parser.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/file_key_management/parser.cc 2024-08-03 07:29:58.000000000 +0000 @@ -260,7 +260,7 @@ while (isdigit(*p)) { id = id * 10 + *p - '0'; - if (id > UINT_MAX32) + if (id > (longlong) UINT_MAX32) { report_error("Invalid key id", p - *line_ptr); return -1; diff -Nru mariadb-10.11.6/plugin/func_test/plugin.cc mariadb-10.11.9/plugin/func_test/plugin.cc --- mariadb-10.11.6/plugin/func_test/plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/func_test/plugin.cc 2024-08-03 07:29:58.000000000 +0000 @@ -42,7 +42,7 @@ } const char *fully_qualified_func_name() const override { return "sysconst_test()"; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; diff -Nru mariadb-10.11.6/plugin/handler_socket/handlersocket/database.cpp mariadb-10.11.9/plugin/handler_socket/handlersocket/database.cpp --- mariadb-10.11.6/plugin/handler_socket/handlersocket/database.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/handler_socket/handlersocket/database.cpp 2024-08-03 07:29:58.000000000 +0000 @@ -84,10 +84,10 @@ struct database : public database_i, private noncopyable { database(const config& c); - virtual ~database(); - virtual dbcontext_ptr create_context(bool for_write) volatile; - virtual void stop() volatile; - virtual const config& get_conf() const volatile; + ~database() override; + dbcontext_ptr create_context(bool for_write) volatile override; + void stop() volatile override; + const config& get_conf() const volatile override; public: int child_running; private: @@ -128,21 +128,21 @@ struct dbcontext : public dbcontext_i, private noncopyable { dbcontext(volatile database *d, bool for_write); - virtual ~dbcontext(); - virtual void init_thread(const void *stack_botton, - volatile int& shutdown_flag); - virtual void term_thread(); - virtual bool check_alive(); - virtual void lock_tables_if(); - virtual void unlock_tables_if(); - virtual bool get_commit_error(); - virtual void clear_error(); - virtual void close_tables_if(); - virtual void table_addref(size_t tbl_id); - virtual void table_release(size_t tbl_id); - virtual void cmd_open(dbcallback_i& cb, const cmd_open_args& args); - virtual void cmd_exec(dbcallback_i& cb, const cmd_exec_args& args); - virtual void set_statistics(size_t num_conns, size_t num_active); + ~dbcontext() override; + void init_thread(const void *stack_botton, + volatile int& shutdown_flag) override; + void term_thread() override; + bool check_alive() override; + void lock_tables_if() override; + void unlock_tables_if() override; + bool get_commit_error() override; + void clear_error() override; + void close_tables_if() override; + void table_addref(size_t tbl_id) override; + void table_release(size_t tbl_id) override; + void cmd_open(dbcallback_i& cb, const cmd_open_args& args) override; + void cmd_exec(dbcallback_i& cb, const cmd_exec_args& args) override; + void set_statistics(size_t num_conns, size_t num_active) override; private: int set_thread_message(const char *fmt, ...) __attribute__((format (printf, 2, 3))); diff -Nru mariadb-10.11.6/plugin/handler_socket/handlersocket/hstcpsvr.cpp mariadb-10.11.9/plugin/handler_socket/handlersocket/hstcpsvr.cpp --- mariadb-10.11.6/plugin/handler_socket/handlersocket/hstcpsvr.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/handler_socket/handlersocket/hstcpsvr.cpp 2024-08-03 07:29:58.000000000 +0000 @@ -34,8 +34,8 @@ struct hstcpsvr : public hstcpsvr_i, private noncopyable { hstcpsvr(const config& c); - ~hstcpsvr(); - virtual std::string start_listen(); + ~hstcpsvr() override; + std::string start_listen() override; private: hstcpsvr_shared_c cshared; volatile hstcpsvr_shared_v vshared; diff -Nru mariadb-10.11.6/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp mariadb-10.11.9/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp --- mariadb-10.11.6/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/handler_socket/handlersocket/hstcpsvr_worker.cpp 2024-08-03 07:29:58.000000000 +0000 @@ -77,15 +77,15 @@ bool write_more(bool *more_r = 0); bool read_more(bool *more_r = 0); public: - virtual void dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v); - virtual const prep_stmt *dbcb_get_prep_stmt(size_t pst_id) const; - virtual void dbcb_resp_short(uint32_t code, const char *msg); - virtual void dbcb_resp_short_num(uint32_t code, uint32_t value); - virtual void dbcb_resp_short_num64(uint32_t code, uint64_t value); - virtual void dbcb_resp_begin(size_t num_flds); - virtual void dbcb_resp_entry(const char *fld, size_t fldlen); - virtual void dbcb_resp_end(); - virtual void dbcb_resp_cancel(); + void dbcb_set_prep_stmt(size_t pst_id, const prep_stmt& v) override; + const prep_stmt *dbcb_get_prep_stmt(size_t pst_id) const override; + void dbcb_resp_short(uint32_t code, const char *msg) override; + void dbcb_resp_short_num(uint32_t code, uint32_t value) override; + void dbcb_resp_short_num64(uint32_t code, uint64_t value) override; + void dbcb_resp_begin(size_t num_flds) override; + void dbcb_resp_entry(const char *fld, size_t fldlen) override; + void dbcb_resp_end() override; + void dbcb_resp_cancel() override; public: hstcpsvr_conn() : addr_len(sizeof(addr)), readsize(4096), nonblocking(false), read_finished(false), write_finished(false), @@ -254,7 +254,7 @@ struct hstcpsvr_worker : public hstcpsvr_worker_i, private noncopyable { hstcpsvr_worker(const hstcpsvr_worker_arg& arg); - virtual void run(); + void run() override; private: const hstcpsvr_shared_c& cshared; volatile hstcpsvr_shared_v& vshared; diff -Nru mariadb-10.11.6/plugin/handler_socket/libhsclient/hstcpcli.cpp mariadb-10.11.9/plugin/handler_socket/libhsclient/hstcpcli.cpp --- mariadb-10.11.6/plugin/handler_socket/libhsclient/hstcpcli.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/handler_socket/libhsclient/hstcpcli.cpp 2024-08-03 07:29:58.000000000 +0000 @@ -27,23 +27,23 @@ struct hstcpcli : public hstcpcli_i, private noncopyable { hstcpcli(const socket_args& args); - virtual void close(); - virtual int reconnect(); - virtual bool stable_point(); - virtual void request_buf_open_index(size_t pst_id, const char *dbn, - const char *tbl, const char *idx, const char *retflds, const char *filflds); - virtual void request_buf_auth(const char *secret, const char *typ); - virtual void request_buf_exec_generic(size_t pst_id, const string_ref& op, + void close() override; + int reconnect() override; + bool stable_point() override; + void request_buf_open_index(size_t pst_id, const char *dbn, + const char *tbl, const char *idx, const char *retflds, const char *filflds) override; + void request_buf_auth(const char *secret, const char *typ) override; + void request_buf_exec_generic(size_t pst_id, const string_ref& op, const string_ref *kvs, size_t kvslen, uint32_t limit, uint32_t skip, const string_ref& mod_op, const string_ref *mvs, size_t mvslen, const hstcpcli_filter *fils, size_t filslen, int invalues_keypart, - const string_ref *invalues, size_t invalueslen); - virtual int request_send(); - virtual int response_recv(size_t& num_flds_r); - virtual const string_ref *get_next_row(); - virtual void response_buf_remove(); - virtual int get_error_code(); - virtual std::string get_error(); + const string_ref *invalues, size_t invalueslen) override; + int request_send() override; + int response_recv(size_t& num_flds_r) override; + const string_ref *get_next_row() override; + void response_buf_remove() override; + int get_error_code() override; + std::string get_error() override; private: int read_more(); void clear_error(); diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/CMakeLists.txt mariadb-10.11.9/plugin/hashicorp_key_management/CMakeLists.txt --- mariadb-10.11.6/plugin/hashicorp_key_management/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -1,10 +1,13 @@ -INCLUDE(FindCURL) +FIND_PACKAGE(CURL) IF(NOT CURL_FOUND) # Can't build plugin + MESSAGE_ONCE(WARNING "Hashicorp Key Management plugin requires curl development package") RETURN() ENDIF() -INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR}) +SET_PACKAGE_PROPERTIES(CURL PROPERTIES TYPE REQUIRED) + +INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS}) set(CPACK_RPM_hashicorp-key-management_PACKAGE_SUMMARY "Hashicorp Key Management plugin for MariaDB" PARENT_SCOPE) set(CPACK_RPM_hashicorp-key-management_PACKAGE_DESCRIPTION "This encryption plugin uses Hashicorp Vault for storing encryption diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/hashicorp_key_management_plugin.cc mariadb-10.11.9/plugin/hashicorp_key_management/hashicorp_key_management_plugin.cc --- mariadb-10.11.6/plugin/hashicorp_key_management/hashicorp_key_management_plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/hashicorp_key_management_plugin.cc 2024-08-03 07:29:58.000000000 +0000 @@ -13,28 +13,21 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ -#include #include #include +#include #include +#include +#include +#include #include #include #include #include -#ifdef _WIN32 -#include -#define alloca _alloca -#endif #include #include #include -#if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND) -#define HASHICORP_HAVE_EXCEPTIONS 1 -#else -#define HASHICORP_HAVE_EXCEPTIONS 0 -#endif - #define HASHICORP_DEBUG_LOGGING 0 #define PLUGIN_ERROR_HEADER "hashicorp: " @@ -209,15 +202,6 @@ if (key_version == ENCRYPTION_KEY_VERSION_INVALID) { clock_t timestamp; -#if HASHICORP_HAVE_EXCEPTIONS - try - { - VER_INFO &ver_info = latest_version_cache.at(key_id); - version = ver_info.key_version; - timestamp = ver_info.timestamp; - } - catch (const std::out_of_range &e) -#else VER_MAP::const_iterator ver_iter = latest_version_cache.find(key_id); if (ver_iter != latest_version_cache.end()) { @@ -225,7 +209,6 @@ timestamp = ver_iter->second.timestamp; } else -#endif { mtx.unlock(); return ENCRYPTION_KEY_VERSION_INVALID; @@ -246,13 +229,6 @@ } } KEY_INFO info; -#if HASHICORP_HAVE_EXCEPTIONS - try - { - info = key_info_cache.at(KEY_ID_AND_VERSION(key_id, version)); - } - catch (const std::out_of_range &e) -#else KEY_MAP::const_iterator key_iter = key_info_cache.find(KEY_ID_AND_VERSION(key_id, version)); if (key_iter != key_info_cache.end()) @@ -260,7 +236,6 @@ info = key_iter->second; } else -#endif { mtx.unlock(); return ENCRYPTION_KEY_VERSION_INVALID; @@ -305,20 +280,12 @@ { unsigned int version; mtx.lock(); -#if HASHICORP_HAVE_EXCEPTIONS - try - { - version = latest_version_cache.at(key_id).key_version; - } - catch (const std::out_of_range &e) -#else VER_MAP::const_iterator ver_iter = latest_version_cache.find(key_id); if (ver_iter != latest_version_cache.end()) { version = ver_iter->second.key_version; } else -#endif { version = ENCRYPTION_KEY_VERSION_INVALID; } @@ -331,15 +298,6 @@ unsigned int version; clock_t timestamp; mtx.lock(); -#if HASHICORP_HAVE_EXCEPTIONS - try - { - VER_INFO &ver_info = latest_version_cache.at(key_id); - version = ver_info.key_version; - timestamp = ver_info.timestamp; - } - catch (const std::out_of_range &e) -#else VER_MAP::const_iterator ver_iter = latest_version_cache.find(key_id); if (ver_iter != latest_version_cache.end()) { @@ -347,7 +305,6 @@ timestamp = ver_iter->second.timestamp; } else -#endif { mtx.unlock(); #if HASHICORP_DEBUG_LOGGING @@ -593,32 +550,16 @@ { const char *res = response->c_str(); /* - Error 404 requires special handling - in case the server - returned an empty array of error strings (the value of the - "error" object in JSON is equal to an empty array), we should - ignore this error at this level, since this means the missing - key (this problem is handled at a higher level), but if the - error object contains anything other than empty array, then - we need to print the error message to the log: + Error 404 requires special handling - we should ignore this + error at this level, since this means the missing key (this + problem is handled at a higher level) */ if (http_code == 404) { - const char *err; - int err_len; - if (json_get_object_key(res, res + response->size(), - "errors", &err, &err_len) == JSV_ARRAY) - { - const char *ev; - int ev_len; - if (json_get_array_item(err, err + err_len, 0, &ev, &ev_len) == - JSV_NOTHING) - { - *response = std::string(""); - is_error = false; - } - } + *response = std::string(""); + is_error = false; } - if (is_error) + else if (is_error) { my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER "Hashicorp server error: %d, response: %s", @@ -994,29 +935,6 @@ 0, 0, 0, 0, 0 }; -#ifdef _MSC_VER - -static int setenv (const char *name, const char *value, int overwrite) -{ - if (!overwrite) - { - size_t len= 0; - int rc= getenv_s(&len, NULL, 0, name); - if (rc) - { - return rc; - } - if (len) - { - errno = EINVAL; - return EINVAL; - } - } - return _putenv_s(name, value); -} - -#endif - #define MAX_URL_SIZE 32768 int HCData::init () @@ -1069,7 +987,11 @@ bool not_equal= token_env != NULL && strcmp(token_env, token) != 0; if (token_env == NULL || not_equal) { - setenv("VAULT_TOKEN", token, 1); +#if defined(HAVE_SETENV) || !defined(_WIN32) + setenv("VAULT_TOKEN", token, 1); +#else + _putenv_s("VAULT_TOKEN", token); +#endif if (not_equal) { my_printf_error(ER_UNKNOWN_ERROR, PLUGIN_ERROR_HEADER diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/suite.pm mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/suite.pm --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/suite.pm 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/suite.pm 2024-08-03 07:29:58.000000000 +0000 @@ -1,9 +1,13 @@ package My::Suite::Vault; +use My::Platform; @ISA = qw(My::Suite); use strict; +return "Hashicorp Key Management plugin tests are currently not available on Windows" + if IS_WINDOWS; + return "You need to set the value of the VAULT_ADDR variable" unless $ENV{VAULT_ADDR}; diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_cache_after_recreate.test mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_cache_after_recreate.test --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_cache_after_recreate.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_cache_after_recreate.test 2024-08-03 07:29:58.000000000 +0000 @@ -11,7 +11,7 @@ --exec vault kv put /bug/1 data=01234567890123456789012345678901 > /dev/null --exec vault kv put /bug/4 data=01234567890123456789012345678904 > /dev/null ---let $restart_parameters=--plugin-load-add=hashicorp_key_management --hashicorp-key-management-vault-url="$VAULT_ADDR/v1/bug/" --hashicorp-key-management-token="$VAULT_TOKEN" +--let $restart_parameters=--plugin-load-add=hashicorp_key_management --hashicorp-key-management-vault-url=$VAULT_ADDR/v1/bug/ --hashicorp-key-management-token=$VAULT_TOKEN --let $restart_noprint=1 --source include/restart_mysqld.inc diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_check_kv_version.test mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_check_kv_version.test --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_check_kv_version.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_check_kv_version.test 2024-08-03 07:29:58.000000000 +0000 @@ -20,7 +20,7 @@ --error 0,1 --remove_file $LOG_FILE ---let $vault_defaults=--plugin-load-add=hashicorp_key_management --hashicorp_key_management=force --hashicorp-key-management-check-kv-version=on --hashicorp-key-management-token="$VAULT_TOKEN" +--let $vault_defaults=--plugin-load-add=hashicorp_key_management --hashicorp_key_management=force --hashicorp-key-management-check-kv-version=on --hashicorp-key-management-token=$VAULT_TOKEN --let $defaults=--defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf $vault_defaults --log-error=$LOG_FILE --error 1 @@ -30,14 +30,14 @@ --remove_file $LOG_FILE ---let $restart_parameters=$vault_defaults --hashicorp-key-management-vault-url="$VAULT_ADDR/v1/good" +--let $restart_parameters=$vault_defaults --hashicorp-key-management-vault-url=$VAULT_ADDR/v1/good --let $restart_noprint=1 --source include/start_mysqld.inc CREATE TABLE t1 (a VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=1; INSERT INTO t1 VALUES ('foo'),('bar'); ---let $restart_parameters=$vault_defaults --hashicorp-key-management-vault-url="$VAULT_ADDR/v1/good//" +--let $restart_parameters=$vault_defaults --hashicorp-key-management-vault-url=$VAULT_ADDR/v1/good// --source include/restart_mysqld.inc CREATE TABLE t2 (a VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=2; diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_migration.test mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_migration.test --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_migration.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_migration.test 2024-08-03 07:29:58.000000000 +0000 @@ -24,7 +24,7 @@ --exec vault secrets disable bug > /dev/null --exec vault secrets enable -path /bug -version=2 kv > /dev/null --exec vault kv put /bug/1 data=$my_key > /dev/null ---let $restart_parameters=--plugin-load-add=hashicorp_key_management --hashicorp-key-management-vault-url="$VAULT_ADDR/v1/bug/" --hashicorp-key-management-token="$VAULT_TOKEN" +--let $restart_parameters=--plugin-load-add=hashicorp_key_management --hashicorp-key-management-vault-url=$VAULT_ADDR/v1/bug/ --hashicorp-key-management-token=$VAULT_TOKEN --source include/restart_mysqld.inc CREATE TABLE t2 (a VARCHAR(8)) ENGINE=InnoDB ENCRYPTED=YES ENCRYPTION_KEY_ID=1; diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_rotation_age.test mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_rotation_age.test --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_rotation_age.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_key_rotation_age.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,7 +8,7 @@ SHOW GLOBAL variables LIKE "hashicorp%"; --echo # Restart the server with encryption -let $default_parameters="--innodb-tablespaces-encryption --innodb_encrypt_tables=ON"; +let $default_parameters=--innodb-tablespaces-encryption --innodb_encrypt_tables=ON; let $restart_noprint=1; let $restart_parameters=$default_parameters; --source include/restart_mysqld.inc diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.opt mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.opt --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.opt 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1 @@ +--innodb --loose-changed_page_bitmaps --innodb-sys-tables --innodb-flush-log-at-trx-commit=2 --sequence diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.test mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.test --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_mariabackup.test 2024-08-03 07:29:58.000000000 +0000 @@ -8,9 +8,13 @@ CREATE TABLE t(i INT) ENGINE INNODB encrypted=yes encryption_key_id=1; INSERT INTO t VALUES(1); -echo # mariabackup backup; let $targetdir=$MYSQLTEST_VARDIR/tmp/backup; +--error 0,1 +rmdir $targetdir; + +echo # mariabackup backup; + --disable_result_log exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir; --enable_result_log diff -Nru mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_url_prefix.test mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_url_prefix.test --- mariadb-10.11.6/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_url_prefix.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/hashicorp_key_management/mysql-test/vault/t/hashicorp_url_prefix.test 2024-08-03 07:29:58.000000000 +0000 @@ -16,7 +16,7 @@ --error 0,1 --remove_file $LOG_FILE ---let $vault_defaults=--plugin-load-add=hashicorp_key_management --hashicorp_key_management=force --hashicorp-key-management-check-kv-version=off --hashicorp-key-management-token="$VAULT_TOKEN" +--let $vault_defaults=--plugin-load-add=hashicorp_key_management --hashicorp_key_management=force --hashicorp-key-management-check-kv-version=off --hashicorp-key-management-token=$VAULT_TOKEN --let $defaults=--defaults-group-suffix=.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf $vault_defaults --log-error=$LOG_FILE --error 1 @@ -76,7 +76,7 @@ --remove_file $LOG_FILE ---let $restart_parameters=$vault_defaults --hashicorp-key-management-vault-url="$VAULT_ADDR/v1/bug///" +--let $restart_parameters=$vault_defaults --hashicorp-key-management-vault-url=$VAULT_ADDR/v1/bug/// --let $restart_noprint=1 --source include/start_mysqld.inc diff -Nru mariadb-10.11.6/plugin/metadata_lock_info/metadata_lock_info.cc mariadb-10.11.9/plugin/metadata_lock_info/metadata_lock_info.cc --- mariadb-10.11.6/plugin/metadata_lock_info/metadata_lock_info.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/metadata_lock_info/metadata_lock_info.cc 2024-08-03 07:29:58.000000000 +0000 @@ -32,14 +32,25 @@ { C_STRING_WITH_LEN("User lock") }, }; + +#ifndef DBUG_OFF +static const LEX_STRING duration_name[] = { + { C_STRING_WITH_LEN("statement") }, + { C_STRING_WITH_LEN("transaction") }, + { C_STRING_WITH_LEN("explicit") }, +}; +#endif + namespace Show { static ST_FIELD_INFO i_s_metadata_lock_info_fields_info[] = { Column("THREAD_ID", ULonglong(20), NOT_NULL, "thread_id"), - Column("LOCK_MODE", Varchar(24), NULLABLE, "lock_mode"), - Column("LOCK_DURATION", Varchar(30), NULLABLE, "lock_duration"), - Column("LOCK_TYPE", Varchar(33), NULLABLE, "lock_type"), + Column("LOCK_MODE", Varchar(24), NOT_NULL, "lock_mode"), + Column("LOCK_DURATION", Varchar(33), NULLABLE, "lock_duration"), + Column("LOCK_TIME_MS", ULonglong(8), NULLABLE, "lock_time_ms"), + Column("LOCK_TYPE", Varchar(33), NOT_NULL, "lock_type"), + Column("TABLE_CATALOG", Name(), NULLABLE, "table_catalog"), Column("TABLE_SCHEMA", Name(), NULLABLE, "table_schema"), Column("TABLE_NAME", Name(), NULLABLE, "table_name"), CEnd() @@ -71,17 +82,31 @@ table->field[0]->store((longlong) mdl_ctx->get_thread_id(), TRUE); table->field[1]->set_notnull(); table->field[1]->store(mdl_ticket->get_type_name(), system_charset_info); +#ifndef DBUG_OFF + table->field[2]->set_notnull(); + table->field[2]->store( &duration_name[mdl_ticket->m_duration], + system_charset_info); +#else table->field[2]->set_null(); - table->field[3]->set_notnull(); - table->field[3]->store( - metadata_lock_info_lock_name[(int) mdl_namespace].str, - metadata_lock_info_lock_name[(int) mdl_namespace].length, - system_charset_info); +#endif + if (!mdl_ticket->m_time) + table->field[3]->set_null(); + else + { + ulonglong now= microsecond_interval_timer(); + table->field[3]->set_notnull(); + table->field[3]->store((now - mdl_ticket->m_time) / 1000, TRUE); + } table->field[4]->set_notnull(); - table->field[4]->store(mdl_key->db_name(), - mdl_key->db_name_length(), system_charset_info); + table->field[4]->store(&metadata_lock_info_lock_name[(int) mdl_namespace], + system_charset_info); table->field[5]->set_notnull(); - table->field[5]->store(mdl_key->name(), + table->field[5]->store(STRING_WITH_LEN("def"), system_charset_info); + table->field[6]->set_notnull(); + table->field[6]->store(mdl_key->db_name(), + mdl_key->db_name_length(), system_charset_info); + table->field[7]->set_notnull(); + table->field[7]->store(mdl_key->name(), mdl_key->name_length(), system_charset_info); if (schema_table_store_record(thd, table)) DBUG_RETURN(1); @@ -112,6 +137,7 @@ schema->fields_info = Show::i_s_metadata_lock_info_fields_info; schema->fill_table = i_s_metadata_lock_info_fill_table; schema->idx_field1 = 0; + metadata_lock_info_plugin_loaded= 1; DBUG_RETURN(0); } @@ -119,6 +145,7 @@ void *p ) { DBUG_ENTER("i_s_metadata_lock_info_deinit"); + metadata_lock_info_plugin_loaded= 0; DBUG_RETURN(0); } diff -Nru mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/global_read_lock.result mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/global_read_lock.result --- mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/global_read_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/global_read_lock.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,9 +1,9 @@ -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name FLUSH TABLES WITH READ LOCK; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name -MDL_BACKUP_FTWRL2 NULL Backup lock +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name +MDL_BACKUP_FTWRL2 Backup lock UNLOCK TABLES; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name diff -Nru mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/table_metadata_lock.result mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/table_metadata_lock.result --- mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/table_metadata_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/table_metadata_lock.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,13 +1,13 @@ CREATE TABLE IF NOT EXISTS t1(a int); BEGIN; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name SELECT * FROM t1; a -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name -MDL_SHARED_READ NULL Table metadata lock test t1 +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name +MDL_SHARED_READ Table metadata lock test t1 ROLLBACK; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name DROP TABLE t1; diff -Nru mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/user_lock.result mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/user_lock.result --- mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/user_lock.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/r/user_lock.result 2024-08-03 07:29:58.000000000 +0000 @@ -1,13 +1,13 @@ -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name SELECT GET_LOCK('LOCK1',0); GET_LOCK('LOCK1',0) 1 -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name -MDL_SHARED_NO_WRITE NULL User lock LOCK1 +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name +MDL_SHARED_NO_WRITE User lock LOCK1 SELECT RELEASE_LOCK('LOCK1'); RELEASE_LOCK('LOCK1') 1 -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; -lock_mode lock_duration lock_type table_schema table_name +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +lock_mode lock_type table_schema table_name diff -Nru mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/global_read_lock.test mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/global_read_lock.test --- mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/global_read_lock.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/global_read_lock.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,6 +1,6 @@ -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; FLUSH TABLES WITH READ LOCK; --sorted_result -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; UNLOCK TABLES; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; diff -Nru mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/table_metadata_lock.test mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/table_metadata_lock.test --- mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/table_metadata_lock.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/table_metadata_lock.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,8 +1,8 @@ CREATE TABLE IF NOT EXISTS t1(a int); BEGIN; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; SELECT * FROM t1; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; ROLLBACK; -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; DROP TABLE t1; diff -Nru mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/user_lock.test mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/user_lock.test --- mariadb-10.11.6/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/user_lock.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/metadata_lock_info/mysql-test/metadata_lock_info/t/user_lock.test 2024-08-03 07:29:58.000000000 +0000 @@ -1,5 +1,5 @@ -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; SELECT GET_LOCK('LOCK1',0); -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; SELECT RELEASE_LOCK('LOCK1'); -SELECT lock_mode, lock_duration, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; +SELECT lock_mode, lock_type, table_schema, table_name FROM information_schema.metadata_lock_info; diff -Nru mariadb-10.11.6/plugin/qc_info/CMakeLists.txt mariadb-10.11.9/plugin/qc_info/CMakeLists.txt --- mariadb-10.11.6/plugin/qc_info/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/qc_info/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -1,4 +1,4 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/sql - ${PCRE_INCLUDES}) + ${PCRE_INCLUDE_DIRS}) MYSQL_ADD_PLUGIN(QUERY_CACHE_INFO qc_info.cc RECOMPILE_FOR_EMBEDDED) diff -Nru mariadb-10.11.6/plugin/sql_errlog/sql_errlog.c mariadb-10.11.9/plugin/sql_errlog/sql_errlog.c --- mariadb-10.11.6/plugin/sql_errlog/sql_errlog.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/sql_errlog/sql_errlog.c 2024-08-03 07:29:58.000000000 +0000 @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -40,6 +41,7 @@ static unsigned int rotations; static char rotate; static char warnings; +static char with_db_and_thread_info; static unsigned int count; LOGGER_HANDLE *logfile; @@ -73,6 +75,12 @@ "Warnings. If set to 0, warnings are not logged.", NULL, NULL, 1); +static MYSQL_SYSVAR_BOOL(with_db_and_thread_info, with_db_and_thread_info, + PLUGIN_VAR_READONLY | PLUGIN_VAR_OPCMDARG, + "Show details about thread id and database name in the log", + NULL, NULL, + 0); + static struct st_mysql_sys_var* vars[] = { MYSQL_SYSVAR(rate), MYSQL_SYSVAR(size_limit), @@ -80,6 +88,7 @@ MYSQL_SYSVAR(rotate), MYSQL_SYSVAR(filename), MYSQL_SYSVAR(warnings), + MYSQL_SYSVAR(with_db_and_thread_info), NULL }; @@ -90,6 +99,7 @@ { const struct mysql_event_general *event = (const struct mysql_event_general*)ev; + if (rate && (event->event_subclass == MYSQL_AUDIT_GENERAL_ERROR || (warnings && event->event_subclass == MYSQL_AUDIT_GENERAL_WARNING))) @@ -103,12 +113,35 @@ count = 0; (void) localtime_r(&event_time, &t); - logger_printf(logfile, "%04d-%02d-%02d %2d:%02d:%02d " + if (with_db_and_thread_info) + { + if (event->database.str) + { + logger_printf(logfile, "%04d-%02d-%02d %2d:%02d:%02d %lu " + "%s %`s %s %d: %s : %s \n", + t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, + t.tm_sec, event->general_thread_id, event->general_user, + event->database.str, type, + event->general_error_code, event->general_command, event->general_query); + } + else + { + logger_printf(logfile, "%04d-%02d-%02d %2d:%02d:%02d %lu " + "%s NULL %s %d: %s : %s \n", + t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, + t.tm_sec, event->general_thread_id, event->general_user, type, + event->general_error_code, event->general_command, event->general_query); + } + } + else + { + logger_printf(logfile, "%04d-%02d-%02d %2d:%02d:%02d " "%s %s %d: %s : %s\n", - t.tm_year + 1900, t.tm_mon + 1, - t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, - event->general_user, type, event->general_error_code, - event->general_command, event->general_query); + t.tm_year + 1900, t.tm_mon + 1, + t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, + event->general_user, type, event->general_error_code, + event->general_command, event->general_query); + } } } } @@ -167,7 +200,7 @@ 0x0100, NULL, vars, - "1.0", + "1.1", MariaDB_PLUGIN_MATURITY_STABLE } maria_declare_plugin_end; diff -Nru mariadb-10.11.6/plugin/test_sql_service/CMakeLists.txt mariadb-10.11.9/plugin/test_sql_service/CMakeLists.txt --- mariadb-10.11.6/plugin/test_sql_service/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/test_sql_service/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -15,4 +15,4 @@ SET(SOURCES test_sql_service.c) -MYSQL_ADD_PLUGIN(test_sql_service ${SOURCES} MODULE_ONLY) +MYSQL_ADD_PLUGIN(test_sql_service ${SOURCES} MODULE_ONLY COMPONENT Test) diff -Nru mariadb-10.11.6/plugin/test_sql_service/test_sql_service.c mariadb-10.11.9/plugin/test_sql_service/test_sql_service.c --- mariadb-10.11.6/plugin/test_sql_service/test_sql_service.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/test_sql_service/test_sql_service.c 2024-08-03 07:29:58.000000000 +0000 @@ -129,7 +129,7 @@ static int run_test(MYSQL_THD thd, struct st_mysql_sys_var *var, void *save, struct st_mysql_value *value) { - *(my_bool*) save= 0; /* Set value for sql_service_run_test */ + *(my_bool*)save= 1; // must initialize the return value return (test_passed= (do_tests() == 0)) == 0; } @@ -140,6 +140,7 @@ int len= 0; MYSQL_RES *res; + *(my_bool*)save= 1; // must initialize the return value str= value->val_str(value, NULL, &len); if (mysql_real_query(mysql, str, len)) diff -Nru mariadb-10.11.6/plugin/type_inet/item_inetfunc.h mariadb-10.11.9/plugin/type_inet/item_inetfunc.h --- mariadb-10.11.6/plugin/type_inet/item_inetfunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_inet/item_inetfunc.h 2024-08-03 07:29:58.000000000 +0000 @@ -45,7 +45,7 @@ unsigned_flag= 1; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -72,7 +72,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -90,7 +90,7 @@ { null_value= false; } - bool need_parentheses_in_default() { return false; } + bool need_parentheses_in_default() override { return false; } }; @@ -118,7 +118,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } String *val_str(String *to) override; @@ -156,7 +156,7 @@ return FALSE; } String *val_str_ascii(String *to) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -178,7 +178,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("is_ipv4") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } longlong val_int() override; @@ -201,7 +201,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("is_ipv6") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } longlong val_int() override; @@ -223,7 +223,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("is_ipv4_compat") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } longlong val_int() override; }; @@ -244,7 +244,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("is_ipv4_mapped") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } longlong val_int() override; }; diff -Nru mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result --- mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet4_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -98,6 +98,8 @@ EXPLAIN SELECT * FROM t1 WHERE c>CAST('0.0.0.1' AS INET4); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index +Warnings: +Note 1105 Cannot use key `c` part[0] for lookup: `test`.`t1`.`c` of type `varchar` > "cast('0.0.0.1' as inet4)" of type `inet4` SELECT * FROM t1 WHERE c=CAST('0.0.0.1' AS INET4); c 0.0.0.1 diff -Nru mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet6.result mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6.result --- mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet6.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6.result 2024-08-03 07:29:58.000000000 +0000 @@ -2284,6 +2284,93 @@ Warning 1292 Incorrect inet6 value: '' DROP TABLE t1; # +# MDEV-32879 Server crash in my_decimal::operator= or unexpected ER_DUP_ENTRY upon comparison with INET6 and similar types +# +CREATE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL, c DATETIME(6) NOT NULL); +INSERT INTO t1 VALUES ('','::','2000-01-01'),('','::','1900-01-01'); +SELECT c + (b = a) AS f, GROUP_CONCAT(c) FROM t1 GROUP BY f; +f GROUP_CONCAT(c) +NULL 2000-01-01 00:00:00.000000,1900-01-01 00:00:00.000000 +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +DROP TABLE t1; +CREATE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL, c DATETIME(6) NOT NULL); +INSERT INTO t1 VALUES ('','::','2000-01-01'),('','::','1900-01-01'); +SELECT c + (b = a) AS f, COUNT(c) FROM t1 GROUP BY f; +f COUNT(c) +NULL 2 +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL, c DATETIME(6) NOT NULL); +INSERT INTO t1 VALUES ('','::','2000-01-01'),('','::','1900-01-01'); +SELECT c + (b = a) AS f FROM t1 ORDER BY f; +f +NULL +NULL +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +DROP TABLE t1; +CREATE OR REPLACE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL); +INSERT INTO t1 VALUES ('','::'),('','::'); +SELECT 1.00 + (b = a) AS f FROM t1 ORDER BY f; +f +NULL +NULL +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +SELECT 1.00 + (b BETWEEN a AND '') AS f FROM t1 ORDER BY f; +f +NULL +NULL +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +SELECT 1.00 + (b IN (a,'')) AS f FROM t1 ORDER BY f; +f +NULL +NULL +Warnings: +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +Warning 1292 Incorrect inet6 value: '' +DROP TABLE t1; +# +# MDEV-32458 ASAN unknown-crash in Inet6::ascii_to_fbt when casting character string to inet6 +# +CREATE TABLE t1 (c CHAR(3)); +INSERT INTO t1 VALUES ('1:0'),('00:'); +SELECT * FROM t1 WHERE c>CAST('::1' AS INET6); +c +Warnings: +Warning 1292 Incorrect inet6 value: '1:0' +Warning 1292 Incorrect inet6 value: '00:' +DROP TABLE t1; +# End of 10.6 tests +# # MDEV-22256 Assertion `length == pack_length()' failed in Field_timestamp_with_dec::sort_string # SET sql_mode=''; diff -Nru mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet6.test mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6.test --- mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet6.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6.test 2024-08-03 07:29:58.000000000 +0000 @@ -1676,6 +1676,43 @@ DROP TABLE t1; --echo # +--echo # MDEV-32879 Server crash in my_decimal::operator= or unexpected ER_DUP_ENTRY upon comparison with INET6 and similar types +--echo # + +CREATE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL, c DATETIME(6) NOT NULL); +INSERT INTO t1 VALUES ('','::','2000-01-01'),('','::','1900-01-01'); +SELECT c + (b = a) AS f, GROUP_CONCAT(c) FROM t1 GROUP BY f; +DROP TABLE t1; + +CREATE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL, c DATETIME(6) NOT NULL); +INSERT INTO t1 VALUES ('','::','2000-01-01'),('','::','1900-01-01'); +SELECT c + (b = a) AS f, COUNT(c) FROM t1 GROUP BY f; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL, c DATETIME(6) NOT NULL); +INSERT INTO t1 VALUES ('','::','2000-01-01'),('','::','1900-01-01'); +SELECT c + (b = a) AS f FROM t1 ORDER BY f; +DROP TABLE t1; + +CREATE OR REPLACE TABLE t1 (a CHAR(36) NOT NULL, b INET6 NOT NULL); +INSERT INTO t1 VALUES ('','::'),('','::'); +SELECT 1.00 + (b = a) AS f FROM t1 ORDER BY f; +SELECT 1.00 + (b BETWEEN a AND '') AS f FROM t1 ORDER BY f; +SELECT 1.00 + (b IN (a,'')) AS f FROM t1 ORDER BY f; +DROP TABLE t1; + +--echo # +--echo # MDEV-32458 ASAN unknown-crash in Inet6::ascii_to_fbt when casting character string to inet6 +--echo # + +CREATE TABLE t1 (c CHAR(3)); +INSERT INTO t1 VALUES ('1:0'),('00:'); +SELECT * FROM t1 WHERE c>CAST('::1' AS INET6); +DROP TABLE t1; + +--echo # End of 10.6 tests + +--echo # --echo # MDEV-22256 Assertion `length == pack_length()' failed in Field_timestamp_with_dec::sort_string --echo # diff -Nru mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.result mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.result --- mariadb-10.11.6/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_inet/mysql-test/type_inet/type_inet6_myisam.result 2024-08-03 07:29:58.000000000 +0000 @@ -98,6 +98,8 @@ EXPLAIN SELECT * FROM t1 WHERE c>CAST('::1' AS INET6); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index c c 67 NULL 3 Using where; Using index +Warnings: +Note 1105 Cannot use key `c` part[0] for lookup: `test`.`t1`.`c` of type `varchar` > "cast('::1' as inet6)" of type `inet6` SELECT * FROM t1 WHERE c=CAST('::1' AS INET6); c 0::1 diff -Nru mariadb-10.11.6/plugin/type_inet/plugin.cc mariadb-10.11.9/plugin/type_inet/plugin.cc --- mariadb-10.11.6/plugin/type_inet/plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_inet/plugin.cc 2024-08-03 07:29:58.000000000 +0000 @@ -47,7 +47,7 @@ static Create_func_inet_ntoa s_singleton; protected: Create_func_inet_ntoa() {} - virtual ~Create_func_inet_ntoa() {} + ~Create_func_inet_ntoa() override {} }; @@ -61,7 +61,7 @@ static Create_func_inet_aton s_singleton; protected: Create_func_inet_aton() {} - virtual ~Create_func_inet_aton() {} + ~Create_func_inet_aton() override {} }; @@ -75,7 +75,7 @@ static Create_func_inet6_aton s_singleton; protected: Create_func_inet6_aton() {} - virtual ~Create_func_inet6_aton() {} + ~Create_func_inet6_aton() override {} }; @@ -89,7 +89,7 @@ static Create_func_inet6_ntoa s_singleton; protected: Create_func_inet6_ntoa() {} - virtual ~Create_func_inet6_ntoa() {} + ~Create_func_inet6_ntoa() override {} }; @@ -103,7 +103,7 @@ static Create_func_is_ipv4 s_singleton; protected: Create_func_is_ipv4() {} - virtual ~Create_func_is_ipv4() {} + ~Create_func_is_ipv4() override {} }; @@ -117,7 +117,7 @@ static Create_func_is_ipv6 s_singleton; protected: Create_func_is_ipv6() {} - virtual ~Create_func_is_ipv6() {} + ~Create_func_is_ipv6() override {} }; @@ -131,7 +131,7 @@ static Create_func_is_ipv4_compat s_singleton; protected: Create_func_is_ipv4_compat() {} - virtual ~Create_func_is_ipv4_compat() {} + ~Create_func_is_ipv4_compat() override {} }; @@ -145,7 +145,7 @@ static Create_func_is_ipv4_mapped s_singleton; protected: Create_func_is_ipv4_mapped() {} - virtual ~Create_func_is_ipv4_mapped() {} + ~Create_func_is_ipv4_mapped() override {} }; diff -Nru mariadb-10.11.6/plugin/type_inet/sql_type_inet.cc mariadb-10.11.9/plugin/type_inet/sql_type_inet.cc --- mariadb-10.11.6/plugin/type_inet/sql_type_inet.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_inet/sql_type_inet.cc 2024-08-03 07:29:58.000000000 +0000 @@ -229,7 +229,7 @@ continue; } - if (!*p || p >= str_end) + if (p >= str_end || !*p) { DBUG_PRINT("error", ("ascii_to_ipv6(%.*s): invalid IPv6 address: " "ending at ':'.", (int) str_length, str)); diff -Nru mariadb-10.11.6/plugin/type_mysql_json/type.cc mariadb-10.11.9/plugin/type_mysql_json/type.cc --- mariadb-10.11.6/plugin/type_mysql_json/type.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_mysql_json/type.cc 2024-08-03 07:29:58.000000000 +0000 @@ -37,6 +37,11 @@ Field *make_table_field(MEM_ROOT *, const LEX_CSTRING *, const Record_addr &, const Type_all_attributes &, TABLE_SHARE *) const override; + bool Column_definition_fix_attributes(Column_definition *c) const override + { + my_error(ER_NOT_ALLOWED_IN_THIS_CONTEXT, MYF(0), "MYSQL_JSON"); + return true; + } void Column_definition_reuse_fix_attributes(THD *thd, Column_definition *def, const Field *field) const override; @@ -69,14 +74,14 @@ &my_charset_utf8mb4_bin) {} - String *val_str(String *val_buffer, String *val_str); - const Type_handler *type_handler() const { return &type_handler_mysql_json; } + String *val_str(String *val_buffer, String *val_str) override; + const Type_handler *type_handler() const override { return &type_handler_mysql_json; } bool parse_mysql(String *dest, const char *data, size_t length) const; - bool send(Protocol *protocol) { return Field::send(protocol); } - void sql_type(String &s) const - { s.set_ascii(STRING_WITH_LEN("json /* MySQL 5.7 */")); } + bool send(Protocol *protocol) override { return Field::send(protocol); } + void sql_type(String &s) const override + { s.set_ascii(STRING_WITH_LEN("mysql_json /* JSON from MySQL 5.7 */")); } /* this will make ALTER TABLE to consider it different from built-in field */ - Compression_method *compression_method() const { return (Compression_method*)1; } + Compression_method *compression_method() const override { return (Compression_method*)1; } }; Field *Type_handler_mysql_json::make_conversion_table_field(MEM_ROOT *root, diff -Nru mariadb-10.11.6/plugin/type_mysql_timestamp/plugin.cc mariadb-10.11.9/plugin/type_mysql_timestamp/plugin.cc --- mariadb-10.11.6/plugin/type_mysql_timestamp/plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_mysql_timestamp/plugin.cc 2024-08-03 07:29:58.000000000 +0000 @@ -103,7 +103,19 @@ Field_mysql_timestampf(*name, rec, attr->unireg_check, share, attr->temporal_dec(MAX_DATETIME_WIDTH)); } - void Column_definition_implicit_upgrade(Column_definition *c) const override + const Type_handler *type_handler_for_implicit_upgrade() const override + { + /* + The derived method as of 10.11.8 does "return this;" anyway. + However, in the future this may change to return a + opt_mysql56_temporal_format dependent handler. + Here in this class we need to make sure to do "return this;" + not to depend on the derived method changes. + */ + return this; + } + void Column_definition_implicit_upgrade_to_this(Column_definition *old) + const override { /* Suppress the automatic upgrade depending on opt_mysql56_temporal_format, diff -Nru mariadb-10.11.6/plugin/type_test/mysql-test/type_test/type_test_double.result mariadb-10.11.9/plugin/type_test/mysql-test/type_test/type_test_double.result --- mariadb-10.11.6/plugin/type_test/mysql-test/type_test/type_test_double.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_test/mysql-test/type_test/type_test_double.result 2024-08-03 07:29:58.000000000 +0000 @@ -83,7 +83,7 @@ END; $$ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def HEX(a) 253 44 3 Y 0 0 8 +def HEX(a) 253 16 3 Y 0 0 8 def a a 5 22 3 Y 32768 31 63 HEX(a) a 100 256 diff -Nru mariadb-10.11.6/plugin/type_test/mysql-test/type_test/type_test_int8.result mariadb-10.11.9/plugin/type_test/mysql-test/type_test/type_test_int8.result --- mariadb-10.11.6/plugin/type_test/mysql-test/type_test/type_test_int8.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_test/mysql-test/type_test/type_test_int8.result 2024-08-03 07:29:58.000000000 +0000 @@ -62,7 +62,7 @@ END; $$ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def HEX(a) 253 40 3 Y 0 0 8 +def HEX(a) 253 16 3 Y 0 0 8 def a a 8 20 3 Y 32768 0 63 HEX(a) a 100 256 diff -Nru mariadb-10.11.6/plugin/type_uuid/item_uuidfunc.h mariadb-10.11.9/plugin/type_uuid/item_uuidfunc.h --- mariadb-10.11.6/plugin/type_uuid/item_uuidfunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_uuid/item_uuidfunc.h 2024-08-03 07:29:58.000000000 +0000 @@ -45,7 +45,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_NON_DETERMINISTIC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -60,7 +60,7 @@ return name; } bool val_native(THD *thd, Native *to) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; diff -Nru mariadb-10.11.6/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result --- mariadb-10.11.6/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_innodb.result 2024-08-03 07:29:58.000000000 +0000 @@ -195,6 +195,8 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 system NULL NULL NULL NULL 1 1 SIMPLE t2 ALL d NULL NULL NULL 1 Using where +Warnings: +Note 1105 Cannot use key `d` part[0] for lookup: `test`.`t2`.`d` of type `blob` < "'00000000-0000-0000-0000-000000000000'" of type `uuid` UPDATE t2 JOIN t1 ON ( t1.pk > t2.d) SET t1.c = 1; ERROR 22007: Incorrect uuid value: '2' DROP TABLE t1, t2; diff -Nru mariadb-10.11.6/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.result mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.result --- mariadb-10.11.6/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.result 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,422 @@ +# +# Start of 10.11 tests +# +# +# MDEV-33442 REPAIR TABLE corrupts UUIDs +# +CREATE PROCEDURE show_table(long_version INT) +BEGIN +SHOW CREATE TABLE t1; +SELECT VERSION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; +IF long_version>0 THEN +SELECT * FROM t1 ORDER BY b; +ELSE +SELECT * FROM t1 ORDER BY a DESC LIMIT 5; +END IF; +END; +$$ +# Upgrade a 10.11.4 table using REPAIR +CALL show_table(1); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +00001234-5566-0777-0888-99aabbccddee 0 +10101234-5566-0777-8888-99aabbccddee 1 +00201234-5566-0777-c888-99aabbccddee 2 +10301234-5566-0777-e888-99aabbccddee 3 +00401234-5566-1777-0888-99aabbccddee 4 +10501234-5566-1777-8888-99aabbccddee 5 +00601234-5566-1777-c888-99aabbccddee 6 +10701234-5566-1777-e888-99aabbccddee 7 +00801234-5566-2777-0888-99aabbccddee 8 +10901234-5566-2777-8888-99aabbccddee 9 +01001234-5566-2777-c888-99aabbccddee 10 +11101234-5566-2777-e888-99aabbccddee 11 +01201234-5566-3777-0888-99aabbccddee 12 +11301234-5566-3777-8888-99aabbccddee 13 +01401234-5566-3777-c888-99aabbccddee 14 +11501234-5566-3777-e888-99aabbccddee 15 +01601234-5566-4777-0888-99aabbccddee 16 +11701234-5566-4777-8888-99aabbccddee 17 +01801234-5566-4777-c888-99aabbccddee 18 +11901234-5566-4777-e888-99aabbccddee 19 +02001234-5566-5777-0888-99aabbccddee 20 +12101234-5566-5777-8888-99aabbccddee 21 +02201234-5566-5777-c888-99aabbccddee 22 +12301234-5566-5777-e888-99aabbccddee 23 +02401234-5566-6777-0888-99aabbccddee 24 +12501234-5566-6777-8888-99aabbccddee 25 +02601234-5566-6777-c888-99aabbccddee 26 +12701234-5566-6777-e888-99aabbccddee 27 +02801234-5566-7777-0888-99aabbccddee 28 +12901234-5566-7777-8888-99aabbccddee 29 +03001234-5566-7777-c888-99aabbccddee 30 +13101234-5566-7777-e888-99aabbccddee 31 +03201234-5566-8777-0888-99aabbccddee 32 +13301234-5566-8777-8888-99aabbccddee 33 +03401234-5566-8777-c888-99aabbccddee 34 +13501234-5566-8777-e888-99aabbccddee 35 +03601234-5566-9777-0888-99aabbccddee 36 +13701234-5566-9777-8888-99aabbccddee 37 +03801234-5566-9777-c888-99aabbccddee 38 +13901234-5566-9777-e888-99aabbccddee 39 +04001234-5566-a777-0888-99aabbccddee 40 +14101234-5566-a777-8888-99aabbccddee 41 +04201234-5566-a777-c888-99aabbccddee 42 +14301234-5566-a777-e888-99aabbccddee 43 +04401234-5566-b777-0888-99aabbccddee 44 +14501234-5566-b777-8888-99aabbccddee 45 +04601234-5566-b777-c888-99aabbccddee 46 +14701234-5566-b777-e888-99aabbccddee 47 +04801234-5566-c777-0888-99aabbccddee 48 +14901234-5566-c777-8888-99aabbccddee 49 +05001234-5566-c777-c888-99aabbccddee 50 +15101234-5566-c777-e888-99aabbccddee 51 +05201234-5566-d777-0888-99aabbccddee 52 +15301234-5566-d777-8888-99aabbccddee 53 +05401234-5566-d777-c888-99aabbccddee 54 +15501234-5566-d777-e888-99aabbccddee 55 +05601234-5566-e777-0888-99aabbccddee 56 +15701234-5566-e777-8888-99aabbccddee 57 +05801234-5566-e777-c888-99aabbccddee 58 +15901234-5566-e777-e888-99aabbccddee 59 +06001234-5566-f777-0888-99aabbccddee 60 +16101234-5566-f777-8888-99aabbccddee 61 +06201234-5566-f777-c888-99aabbccddee 62 +16301234-5566-f777-e888-99aabbccddee 63 +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check error Upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it! +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +16301234-5566-f777-e888-99aabbccddee 63 +15901234-5566-e777-e888-99aabbccddee 59 +15501234-5566-d777-e888-99aabbccddee 55 +15101234-5566-c777-e888-99aabbccddee 51 +14701234-5566-b777-e888-99aabbccddee 47 +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check error Upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it! +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +16301234-5566-f777-e888-99aabbccddee 63 +15901234-5566-e777-e888-99aabbccddee 59 +15501234-5566-d777-e888-99aabbccddee 55 +15101234-5566-c777-e888-99aabbccddee 51 +14701234-5566-b777-e888-99aabbccddee 47 +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair Warning Incorrect uuid value: '03201234-5566-8777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 33 +test.t1 repair Warning Incorrect uuid value: '03601234-5566-9777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 37 +test.t1 repair Warning Incorrect uuid value: '04001234-5566-a777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 41 +test.t1 repair Warning Incorrect uuid value: '04401234-5566-b777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 45 +test.t1 repair Warning Incorrect uuid value: '04801234-5566-c777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 49 +test.t1 repair Warning Incorrect uuid value: '05201234-5566-d777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 53 +test.t1 repair Warning Incorrect uuid value: '05601234-5566-e777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 57 +test.t1 repair Warning Incorrect uuid value: '06001234-5566-f777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 61 +test.t1 repair status OK +CALL show_table(1); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +00001234-5566-0777-0888-99aabbccddee 0 +10101234-5566-0777-8888-99aabbccddee 1 +00201234-5566-0777-c888-99aabbccddee 2 +10301234-5566-0777-e888-99aabbccddee 3 +00401234-5566-1777-0888-99aabbccddee 4 +10501234-5566-1777-8888-99aabbccddee 5 +00601234-5566-1777-c888-99aabbccddee 6 +10701234-5566-1777-e888-99aabbccddee 7 +00801234-5566-2777-0888-99aabbccddee 8 +10901234-5566-2777-8888-99aabbccddee 9 +01001234-5566-2777-c888-99aabbccddee 10 +11101234-5566-2777-e888-99aabbccddee 11 +01201234-5566-3777-0888-99aabbccddee 12 +11301234-5566-3777-8888-99aabbccddee 13 +01401234-5566-3777-c888-99aabbccddee 14 +11501234-5566-3777-e888-99aabbccddee 15 +01601234-5566-4777-0888-99aabbccddee 16 +11701234-5566-4777-8888-99aabbccddee 17 +01801234-5566-4777-c888-99aabbccddee 18 +11901234-5566-4777-e888-99aabbccddee 19 +02001234-5566-5777-0888-99aabbccddee 20 +12101234-5566-5777-8888-99aabbccddee 21 +02201234-5566-5777-c888-99aabbccddee 22 +12301234-5566-5777-e888-99aabbccddee 23 +02401234-5566-6777-0888-99aabbccddee 24 +12501234-5566-6777-8888-99aabbccddee 25 +02601234-5566-6777-c888-99aabbccddee 26 +12701234-5566-6777-e888-99aabbccddee 27 +02801234-5566-7777-0888-99aabbccddee 28 +12901234-5566-7777-8888-99aabbccddee 29 +03001234-5566-7777-c888-99aabbccddee 30 +13101234-5566-7777-e888-99aabbccddee 31 +NULL 32 +13301234-5566-8777-8888-99aabbccddee 33 +03401234-5566-8777-c888-99aabbccddee 34 +13501234-5566-8777-e888-99aabbccddee 35 +NULL 36 +13701234-5566-9777-8888-99aabbccddee 37 +03801234-5566-9777-c888-99aabbccddee 38 +13901234-5566-9777-e888-99aabbccddee 39 +NULL 40 +14101234-5566-a777-8888-99aabbccddee 41 +04201234-5566-a777-c888-99aabbccddee 42 +14301234-5566-a777-e888-99aabbccddee 43 +NULL 44 +14501234-5566-b777-8888-99aabbccddee 45 +04601234-5566-b777-c888-99aabbccddee 46 +14701234-5566-b777-e888-99aabbccddee 47 +NULL 48 +14901234-5566-c777-8888-99aabbccddee 49 +05001234-5566-c777-c888-99aabbccddee 50 +15101234-5566-c777-e888-99aabbccddee 51 +NULL 52 +15301234-5566-d777-8888-99aabbccddee 53 +05401234-5566-d777-c888-99aabbccddee 54 +15501234-5566-d777-e888-99aabbccddee 55 +NULL 56 +15701234-5566-e777-8888-99aabbccddee 57 +05801234-5566-e777-c888-99aabbccddee 58 +15901234-5566-e777-e888-99aabbccddee 59 +NULL 60 +16101234-5566-f777-8888-99aabbccddee 61 +06201234-5566-f777-c888-99aabbccddee 62 +16301234-5566-f777-e888-99aabbccddee 63 +CHECK TABLE t1 FOR UPGRADE; +Table Op Msg_type Msg_text +test.t1 check status OK +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +12301234-5566-5777-e888-99aabbccddee 23 +11901234-5566-4777-e888-99aabbccddee 19 +11501234-5566-3777-e888-99aabbccddee 15 +11101234-5566-2777-e888-99aabbccddee 11 +10701234-5566-1777-e888-99aabbccddee 7 +DROP TABLE t1; +# Upgrade a 10.11.4 table using ALTER, adding a table COMMENT +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +16301234-5566-f777-e888-99aabbccddee 63 +15901234-5566-e777-e888-99aabbccddee 59 +15501234-5566-d777-e888-99aabbccddee 55 +15101234-5566-c777-e888-99aabbccddee 51 +14701234-5566-b777-e888-99aabbccddee 47 +# ALTER..INPLACE should fail - the old column 'b UUID' needs upgrade +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test10'; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER IGNORE TABLE t1 COMMENT 'test11'; +Warnings: +Warning 1292 Incorrect uuid value: '03201234-5566-8777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 33 +Warning 1292 Incorrect uuid value: '03601234-5566-9777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 37 +Warning 1292 Incorrect uuid value: '04001234-5566-a777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 41 +Warning 1292 Incorrect uuid value: '04401234-5566-b777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 45 +Warning 1292 Incorrect uuid value: '04801234-5566-c777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 49 +Warning 1292 Incorrect uuid value: '05201234-5566-d777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 53 +Warning 1292 Incorrect uuid value: '05601234-5566-e777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 57 +Warning 1292 Incorrect uuid value: '06001234-5566-f777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 61 +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='test11' +VERSION +10 +a b +12301234-5566-5777-e888-99aabbccddee 23 +11901234-5566-4777-e888-99aabbccddee 19 +11501234-5566-3777-e888-99aabbccddee 15 +11101234-5566-2777-e888-99aabbccddee 11 +10701234-5566-1777-e888-99aabbccddee 7 +# Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test12'; +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='test12' +VERSION +10 +a b +12301234-5566-5777-e888-99aabbccddee 23 +11901234-5566-4777-e888-99aabbccddee 19 +11501234-5566-3777-e888-99aabbccddee 15 +11101234-5566-2777-e888-99aabbccddee 11 +10701234-5566-1777-e888-99aabbccddee 7 +DROP TABLE t1; +# Upgrade a 10.11.4 table using ALTER, adding a DEFAULT for 'b INT' +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +16301234-5566-f777-e888-99aabbccddee 63 +15901234-5566-e777-e888-99aabbccddee 59 +15501234-5566-d777-e888-99aabbccddee 55 +15101234-5566-c777-e888-99aabbccddee 51 +14701234-5566-b777-e888-99aabbccddee 47 +# ALTER..INPLACE should fail - the old column 'b UUID' needs upgrade +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY b INT NOT NULL DEFAULT 10; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER IGNORE TABLE t1 MODIFY b INT NOT NULL DEFAULT 11; +Warnings: +Warning 1292 Incorrect uuid value: '03201234-5566-8777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 33 +Warning 1292 Incorrect uuid value: '03601234-5566-9777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 37 +Warning 1292 Incorrect uuid value: '04001234-5566-a777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 41 +Warning 1292 Incorrect uuid value: '04401234-5566-b777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 45 +Warning 1292 Incorrect uuid value: '04801234-5566-c777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 49 +Warning 1292 Incorrect uuid value: '05201234-5566-d777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 53 +Warning 1292 Incorrect uuid value: '05601234-5566-e777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 57 +Warning 1292 Incorrect uuid value: '06001234-5566-f777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 61 +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL DEFAULT 11, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +12301234-5566-5777-e888-99aabbccddee 23 +11901234-5566-4777-e888-99aabbccddee 19 +11501234-5566-3777-e888-99aabbccddee 15 +11101234-5566-2777-e888-99aabbccddee 11 +10701234-5566-1777-e888-99aabbccddee 7 +# Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY b INT NOT NULL DEFAULT 12; +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL DEFAULT 12, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +12301234-5566-5777-e888-99aabbccddee 23 +11901234-5566-4777-e888-99aabbccddee 19 +11501234-5566-3777-e888-99aabbccddee 15 +11101234-5566-2777-e888-99aabbccddee 11 +10701234-5566-1777-e888-99aabbccddee 7 +DROP TABLE t1; +# Upgrade a 10.11.4 table using ALTER, adding a DEFAULT for 'a UUID' +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT NULL, + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +16301234-5566-f777-e888-99aabbccddee 63 +15901234-5566-e777-e888-99aabbccddee 59 +15501234-5566-d777-e888-99aabbccddee 55 +15101234-5566-c777-e888-99aabbccddee 51 +14701234-5566-b777-e888-99aabbccddee 47 +# ALTER..INPLACE should fail - the old column 'b UUID' needs upgrade +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a UUID DEFAULT '16301234-5566-f777-e888-99aabbccdd00'; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ALTER IGNORE TABLE t1 MODIFY a UUID DEFAULT '16301234-5566-f777-e888-99aabbccdd01'; +Warnings: +Warning 1292 Incorrect uuid value: '03201234-5566-8777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 33 +Warning 1292 Incorrect uuid value: '03601234-5566-9777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 37 +Warning 1292 Incorrect uuid value: '04001234-5566-a777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 41 +Warning 1292 Incorrect uuid value: '04401234-5566-b777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 45 +Warning 1292 Incorrect uuid value: '04801234-5566-c777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 49 +Warning 1292 Incorrect uuid value: '05201234-5566-d777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 53 +Warning 1292 Incorrect uuid value: '05601234-5566-e777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 57 +Warning 1292 Incorrect uuid value: '06001234-5566-f777-0888-99aabbccddee' for column `test`.`t1`.`a` at row 61 +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT '16301234-5566-f777-e888-99aabbccdd01', + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +12301234-5566-5777-e888-99aabbccddee 23 +11901234-5566-4777-e888-99aabbccddee 19 +11501234-5566-3777-e888-99aabbccddee 15 +11101234-5566-2777-e888-99aabbccddee 11 +10701234-5566-1777-e888-99aabbccddee 7 +# Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 MODIFY a UUID DEFAULT '16301234-5566-f777-e888-99aabbccdd02'; +CALL show_table(0); +Table Create Table +t1 CREATE TABLE `t1` ( + `a` uuid DEFAULT '16301234-5566-f777-e888-99aabbccdd02', + `b` int(11) NOT NULL, + KEY `a` (`a`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +VERSION +10 +a b +12301234-5566-5777-e888-99aabbccddee 23 +11901234-5566-4777-e888-99aabbccddee 19 +11501234-5566-3777-e888-99aabbccddee 15 +11101234-5566-2777-e888-99aabbccddee 11 +10701234-5566-1777-e888-99aabbccddee 7 +DROP TABLE t1; +DROP PROCEDURE show_table; +# +# End of 10.11 tests +# diff -Nru mariadb-10.11.6/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.test mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.test --- mariadb-10.11.6/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/plugin/type_uuid/mysql-test/type_uuid/type_uuid_mariadb101104.test 2024-08-03 07:29:58.000000000 +0000 @@ -0,0 +1,110 @@ +let $datadir= `select @@datadir`; + +--echo # +--echo # Start of 10.11 tests +--echo # + +--echo # +--echo # MDEV-33442 REPAIR TABLE corrupts UUIDs +--echo # + +DELIMITER $$; +CREATE PROCEDURE show_table(long_version INT) +BEGIN + SHOW CREATE TABLE t1; + SELECT VERSION FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test'; + IF long_version>0 THEN + SELECT * FROM t1 ORDER BY b; + ELSE + SELECT * FROM t1 ORDER BY a DESC LIMIT 5; + END IF; +END; +$$ +DELIMITER ;$$ + + +--echo # Upgrade a 10.11.4 table using REPAIR + +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.frm $datadir/test/t1.frm +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYI $datadir/test/t1.MYI +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYD $datadir/test/t1.MYD +CALL show_table(1); + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table(0); + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table(0); + +REPAIR TABLE t1; +CALL show_table(1); + +CHECK TABLE t1 FOR UPGRADE; +CALL show_table(0); + +DROP TABLE t1; + +--echo # Upgrade a 10.11.4 table using ALTER, adding a table COMMENT + +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.frm $datadir/test/t1.frm +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYI $datadir/test/t1.MYI +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYD $datadir/test/t1.MYD +CALL show_table(0); + +--echo # ALTER..INPLACE should fail - the old column 'b UUID' needs upgrade +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test10'; +ALTER IGNORE TABLE t1 COMMENT 'test11'; +CALL show_table(0); + +--echo # Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, COMMENT 'test12'; +CALL show_table(0); + +DROP TABLE t1; + + +--echo # Upgrade a 10.11.4 table using ALTER, adding a DEFAULT for 'b INT' + +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.frm $datadir/test/t1.frm +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYI $datadir/test/t1.MYI +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYD $datadir/test/t1.MYD +CALL show_table(0); + +--echo # ALTER..INPLACE should fail - the old column 'b UUID' needs upgrade +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY b INT NOT NULL DEFAULT 10; +ALTER IGNORE TABLE t1 MODIFY b INT NOT NULL DEFAULT 11; +CALL show_table(0); + +--echo # Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY b INT NOT NULL DEFAULT 12; +CALL show_table(0); + +DROP TABLE t1; + + +--echo # Upgrade a 10.11.4 table using ALTER, adding a DEFAULT for 'a UUID' + +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.frm $datadir/test/t1.frm +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYI $datadir/test/t1.MYI +--copy_file $MTR_SUITE_DIR/std_data/mdev-29959.MYD $datadir/test/t1.MYD +CALL show_table(0); + +--echo # ALTER..INPLACE should fail - the old column 'b UUID' needs upgrade +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER IGNORE TABLE t1 ALGORITHM=INPLACE, MODIFY a UUID DEFAULT '16301234-5566-f777-e888-99aabbccdd00'; +ALTER IGNORE TABLE t1 MODIFY a UUID DEFAULT '16301234-5566-f777-e888-99aabbccdd01'; +CALL show_table(0); + +--echo # Now ALTER..INPLACE should work +ALTER IGNORE TABLE t1 MODIFY a UUID DEFAULT '16301234-5566-f777-e888-99aabbccdd02'; +CALL show_table(0); + +DROP TABLE t1; + +DROP PROCEDURE show_table; + +--echo # +--echo # End of 10.11 tests +--echo # diff -Nru mariadb-10.11.6/plugin/type_uuid/plugin.cc mariadb-10.11.9/plugin/type_uuid/plugin.cc --- mariadb-10.11.6/plugin/type_uuid/plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_uuid/plugin.cc 2024-08-03 07:29:58.000000000 +0000 @@ -98,6 +98,14 @@ return NULL; } + +const Type_handler *Type_collection_uuid::type_handler_for_implicit_upgrade( + const Type_handler *from) const +{ + return Type_handler_uuid_new::singleton(); +} + + /*************************************************************************/ class Create_func_uuid : public Create_func_arg0 @@ -107,7 +115,7 @@ { DBUG_ENTER("Create_func_uuid::create"); thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - thd->lex->safe_to_cache_query= 0; + thd->lex->uncacheable(UNCACHEABLE_RAND); DBUG_RETURN(new (thd->mem_root) Item_func_uuid(thd)); } static Create_func_uuid s_singleton; @@ -125,7 +133,7 @@ { DBUG_ENTER("Create_func_sys_guid::create"); thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - thd->lex->safe_to_cache_query= 0; + thd->lex->uncacheable(UNCACHEABLE_RAND); DBUG_RETURN(new (thd->mem_root) Item_func_sys_guid(thd)); } static Create_func_sys_guid s_singleton; diff -Nru mariadb-10.11.6/plugin/type_uuid/sql_type_uuid.h mariadb-10.11.9/plugin/type_uuid/sql_type_uuid.h --- mariadb-10.11.6/plugin/type_uuid/sql_type_uuid.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/type_uuid/sql_type_uuid.h 2024-08-03 07:29:58.000000000 +0000 @@ -316,6 +316,9 @@ const override { return NULL; } + const Type_handler *type_handler_for_implicit_upgrade( + const Type_handler *from) const; + static Type_collection_uuid *singleton() { static Type_collection_uuid tc; diff -Nru mariadb-10.11.6/plugin/user_variables/user_variables.cc mariadb-10.11.9/plugin/user_variables/user_variables.cc --- mariadb-10.11.6/plugin/user_variables/user_variables.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/user_variables/user_variables.cc 2024-08-03 07:29:58.000000000 +0000 @@ -79,9 +79,9 @@ else return 1; - const LEX_CSTRING *tmp= var->unsigned_flag ? - &unsigned_result_types[var->type] : - &result_types[var->type]; + const LEX_CSTRING *tmp= var->type_handler()->is_unsigned() ? + &unsigned_result_types[var->type_handler()->result_type()] : + &result_types[var->type_handler()->result_type()]; field[2]->store(tmp->str, tmp->length, system_charset_info); if (var->charset()) diff -Nru mariadb-10.11.6/plugin/versioning/versioning.cc mariadb-10.11.9/plugin/versioning/versioning.cc --- mariadb-10.11.6/plugin/versioning/versioning.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/plugin/versioning/versioning.cc 2024-08-03 07:29:58.000000000 +0000 @@ -30,14 +30,14 @@ class Create_func_trt : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_trt s_singleton; protected: - Create_func_trt() = default; - virtual ~Create_func_trt() = default; + Create_func_trt() = default; + ~Create_func_trt() override = default; }; template @@ -104,8 +104,8 @@ class Create_func_trt_trx_sees : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override { Item *func= NULL; int arg_count= 0; @@ -132,8 +132,8 @@ static Create_func_trt_trx_sees s_singleton; protected: - Create_func_trt_trx_sees() = default; - virtual ~Create_func_trt_trx_sees() = default; + Create_func_trt_trx_sees() = default; + ~Create_func_trt_trx_sees() override = default; }; template diff -Nru mariadb-10.11.6/scripts/CMakeLists.txt mariadb-10.11.9/scripts/CMakeLists.txt --- mariadb-10.11.6/scripts/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -233,6 +233,7 @@ SET(sysconfdir "/etc") ENDIF() SET(bindir ${INSTALL_BINDIRABS}) +SET(sbindir ${INSTALL_SBINDIRABS}) SET(libexecdir ${INSTALL_SBINDIRABS}) SET(scriptdir ${INSTALL_BINDIRABS}) SET(datadir ${INSTALL_MYSQLSHAREDIRABS}) diff -Nru mariadb-10.11.6/scripts/mysql_install_db.sh mariadb-10.11.9/scripts/mysql_install_db.sh --- mariadb-10.11.6/scripts/mysql_install_db.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/mysql_install_db.sh 2024-08-03 07:29:58.000000000 +0000 @@ -38,6 +38,7 @@ in_rpm=0 ip_only=0 cross_bootstrap=0 +do_resolve=0 auth_root_authentication_method=socket auth_root_socket_user="" skip_test_db=0 @@ -330,6 +331,11 @@ rel_mysqld="$dirname0/@INSTALL_SBINDIR@/mariadbd" +if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0 +then + do_resolve=1 +fi + # Configure paths to support files if test -n "$srcdir" then @@ -344,33 +350,13 @@ pamtooldir="$builddir/plugin/auth_pam" elif test -n "$basedir" then - bindir="$basedir/bin" # only used in the help text - resolveip=`find_in_dirs resolveip @resolveip_locations@` - if test -z "$resolveip" - then - cannot_find_file resolveip @resolveip_locations@ - exit 1 - fi - mysqld=`find_in_dirs mariadbd @mysqld_locations@` - if test -z "$mysqld" - then - cannot_find_file mariadbd @mysqld_locations@ - exit 1 - fi - langdir=`find_in_dirs --dir errmsg.sys @errmsg_locations@` - if test -z "$langdir" - then - cannot_find_file errmsg.sys @errmsg_locations@ - exit 1 - fi - srcpkgdatadir=`find_in_dirs --dir fill_help_tables.sql @pkgdata_locations@` - buildpkgdatadir=$srcpkgdatadir - if test -z "$srcpkgdatadir" - then - cannot_find_file fill_help_tables.sql @pkgdata_locations@ - exit 1 - fi - plugindir=`find_in_dirs --dir auth_pam.so $basedir/lib*/plugin $basedir/lib*/mysql/plugin $basedir/lib/*/mariadb19/plugin` + bindir="$basedir/@INSTALL_BINDIR@" + resolveip="$bindir/resolveip" + mysqld="$basedir/@INSTALL_SBINDIR@/mariadbd" + langdir="$basedir/@INSTALL_MYSQLSHAREDIR@/english" + srcpkgdatadir="$basedir/@INSTALL_MYSQLSHAREDIR@" + buildpkgdatadir="$basedir/@INSTALL_MYSQLSHAREDIR@" + plugindir="$basedir/@INSTALL_PLUGINDIR@" pamtooldir=$plugindir # relative from where the script was run for a relocatable install elif test -n "$dirname0" -a -x "$rel_mysqld" -a ! "$rel_mysqld" -ef "@sbindir@/mariadbd" @@ -442,7 +428,7 @@ hostname=`@HOSTNAME@` # Check if hostname is valid -if test "$cross_bootstrap" -eq 0 -a "$in_rpm" -eq 0 -a "$force" -eq 0 +if test "$do_resolve" -eq 1 then resolved=`"$resolveip" $hostname 2>&1` if test $? -ne 0 @@ -468,7 +454,7 @@ fi fi -if test "$ip_only" -eq 1 +if test "$do_resolve" -eq 1 -a "$ip_only" -eq 1 then hostname=`echo "$resolved" | awk '/ /{print $6}'` fi @@ -695,7 +681,7 @@ then echo echo "You can start the MariaDB daemon with:" - echo "cd '$basedir' ; $bindir/mariadb-safe --datadir='$ldata'" + echo "cd '$basedir' ; $bindir/mariadbd-safe --datadir='$ldata'" echo echo "You can test the MariaDB daemon with mysql-test-run.pl" echo "cd '$basedir/@INSTALL_MYSQLTESTDIR@' ; perl mariadb-test-run.pl" diff -Nru mariadb-10.11.6/scripts/mysql_secure_installation.sh mariadb-10.11.9/scripts/mysql_secure_installation.sh --- mariadb-10.11.6/scripts/mysql_secure_installation.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/mysql_secure_installation.sh 2024-08-03 07:29:58.000000000 +0000 @@ -27,6 +27,7 @@ basedir= defaults_file= defaults_extra_file= +defaults_group_suffix= no_defaults= parse_arg() @@ -52,6 +53,7 @@ --basedir=*) basedir=`parse_arg "$arg"` ;; --defaults-file=*) defaults_file="$arg" ;; --defaults-extra-file=*) defaults_extra_file="$arg" ;; + --defaults-group-suffix=*) defaults_group_suffix="$arg" ;; --no-defaults) no_defaults="$arg" ;; *) if test -n "$pick_args" @@ -184,7 +186,7 @@ # Now we can get arguments from the group [client] and [client-server] # in the my.cfg file, then re-run to merge with command line arguments. -parse_arguments `$print_defaults $defaults_file $defaults_extra_file $no_defaults client client-server client-mariadb` +parse_arguments `$print_defaults $defaults_file $defaults_extra_file $defaults_group_suffix $no_defaults client client-server client-mariadb` parse_arguments PICK-ARGS-FROM-ARGV "$@" set_echo_compat() { diff -Nru mariadb-10.11.6/scripts/mysql_setpermission.sh mariadb-10.11.9/scripts/mysql_setpermission.sh --- mariadb-10.11.6/scripts/mysql_setpermission.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/mysql_setpermission.sh 2024-08-03 07:29:58.000000000 +0000 @@ -68,7 +68,7 @@ if ($opt_host =~ s/:(\d+)$//) { - $opt_port = $1; + $opt_port = $1; } if ($opt_host eq '') @@ -98,7 +98,7 @@ if (eval {DBI->install_driver("MariaDB")}) { $dsn ="DBI:MariaDB:;"; $prefix= 'mariadb'; -} +} else { $dsn = "DBI:mysql:;"; } @@ -226,11 +226,11 @@ { $pass = "PASSWORD(". $dbh->quote($pass) . ")"; } - my $uh= "$user@$host"; + my $uh= $user."@".$host; my $sth = $dbh->prepare("set password for $uh =$pass") || die $dbh->errstr; $sth->execute || die $dbh->errstr; $sth->finish; - print "The password is set for user $user.\n\n"; + print "The password is set for user $uh.\n\n"; } diff -Nru mariadb-10.11.6/scripts/mysql_system_tables_fix.sql mariadb-10.11.9/scripts/mysql_system_tables_fix.sql --- mariadb-10.11.6/scripts/mysql_system_tables_fix.sql 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/mysql_system_tables_fix.sql 2024-08-03 07:29:58.000000000 +0000 @@ -230,6 +230,11 @@ SET plugin='unix_socket' WHERE plugin='auth_socket'; DELETE FROM plugin WHERE name='auth_socket'; +# Delete plugins that are now inbuilt but might not have been before (MDEV-32043) +DELETE plugin + FROM information_schema.PLUGINS is_p + JOIN plugin ON plugin.name = is_p.PLUGIN_NAME + WHERE is_p.PLUGIN_LIBRARY IS NULL; ALTER TABLE user MODIFY Password char(41) character set latin1 collate latin1_bin NOT NULL default '', @@ -768,19 +773,22 @@ end if // DELIMITER ; -# MDEV-4332 longer user names +# MDEV-4332 longer user names, extended by MDEV-24312 to longer again. alter table user modify User char(128) binary not null default ''; alter table db modify User char(128) binary not null default ''; alter table tables_priv modify User char(128) binary not null default ''; alter table columns_priv modify User char(128) binary not null default ''; -alter table procs_priv modify User char(128) binary not null default ''; +alter table procs_priv modify User char(128) binary not null default '', modify Host char(255) binary DEFAULT ''; alter table proc modify definer varchar(384) collate utf8mb3_bin not null default ''; -alter table proxies_priv modify User char(128) COLLATE utf8mb3_bin not null default ''; +alter table proxies_priv modify User char(128) COLLATE utf8mb3_bin not null default '', modify Host char(255) binary DEFAULT ''; alter table proxies_priv modify Proxied_user char(128) COLLATE utf8mb3_bin not null default ''; alter table proxies_priv modify Grantor varchar(384) COLLATE utf8mb3_bin not null default ''; alter table servers modify Username char(128) not null default ''; alter table procs_priv modify Grantor varchar(384) COLLATE utf8mb3_bin not null default ''; alter table tables_priv modify Grantor varchar(384) COLLATE utf8mb3_bin not null default ''; +# MDEV-33726 longer names from MDEV-24312 extension +alter table if exists global_priv modify Host char(255) binary DEFAULT '', modify User char(128) binary not null default ''; +alter table if exists roles_mapping modify Host char(255) binary not null DEFAULT '', modify User char(128) binary not null default ''; # Activate the new, possible modified privilege tables # This should not be needed, but gives us some extra testing that the above diff -Nru mariadb-10.11.6/scripts/mysqlhotcopy.sh mariadb-10.11.9/scripts/mysqlhotcopy.sh --- mariadb-10.11.6/scripts/mysqlhotcopy.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/mysqlhotcopy.sh 2024-08-03 07:29:58.000000000 +0000 @@ -189,21 +189,38 @@ $opt{allowold} = 1 if $opt{keepold}; # --- connect to the database --- +## Socket takes precedence. my $dsn; -$dsn = ";host=" . (defined($opt{host}) ? $opt{host} : "localhost"); -$dsn .= ";port=$opt{port}" if $opt{port}; -$dsn .= ";mariadb_socket=$opt{socket}" if $opt{socket}; +my $prefix= 'mysql'; -# use mariadb_read_default_group=mysqlhotcopy so that [client] and -# [mysqlhotcopy] groups will be read from standard options files. +if (eval {DBI->install_driver("MariaDB")}) { + $dsn ="DBI:MariaDB:;"; + $prefix= 'mariadb'; +} +else { + $dsn = "DBI:mysql:;"; +} -my $dbh = DBI->connect("DBI:MariaDB:$dsn;mariadb_read_default_group=mysqlhotcopy", - $opt{user}, $opt{password}, +if ($opt{socket} and -S $opt{socket}) +{ + $dsn .= "${prefix}_socket=$opt{socket}"; +} +else { - RaiseError => 1, - PrintError => 0, - AutoCommit => 1, -}); + $dsn .= "host=" . $opt{host}; + if ($opt{host} ne "localhost") + { + $dsn .= ";port=". $opt{port}; + } +} + +$dsn .= ";mariadb_read_default_group=mysqlhotcopy"; + +# use mariadb_read_default_group=mysqlhotcopy so that [client] and +# [mysqlhotcopy] groups will be read from standard options files. +# make the connection to MariaDB +my $dbh= DBI->connect($dsn, $opt{user}, $opt{password}, { RaiseError => 1, PrintError => 0}) || + die("Can't make a connection to the MariaDB server.\n The error: $DBI::errstr"); # --- check that checkpoint table exists if specified --- if ( $opt{checkpoint} ) { @@ -271,6 +288,8 @@ $sth_dbs->execute; while ( my ($db_name) = $sth_dbs->fetchrow_array ) { next if $db_name =~ m/^information_schema$/i; + next if $db_name =~ m/^performance_schema$/i; + next if $db_name =~ m/^sys$/i; push @db_desc, { 'src' => $db_name, 't_regex' => $t_regex } if ( $db_name =~ m/$opt{regexp}/o ); } } diff -Nru mariadb-10.11.6/scripts/mytop.sh mariadb-10.11.9/scripts/mytop.sh --- mariadb-10.11.6/scripts/mytop.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/mytop.sh 2024-08-03 07:29:58.000000000 +0000 @@ -147,7 +147,12 @@ if (/(\S+)\s*=\s*(.*\S)/) { - $config{lc $1} = $2 if exists $config{lc $1}; + my ($k, $v) = ($1, $2); + if ($k =~ /^filter_/i) { + $config{lc $k} = StringOrRegex($v) if exists $config{lc $k}; + } else { + $config{lc $k} = $v if exists $config{lc $k}; + } } } close CFG; diff -Nru mariadb-10.11.6/scripts/sys_schema/before_setup.sql mariadb-10.11.9/scripts/sys_schema/before_setup.sql --- mariadb-10.11.6/scripts/sys_schema/before_setup.sql 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/sys_schema/before_setup.sql 2024-08-03 07:29:58.000000000 +0000 @@ -17,6 +17,11 @@ SET @sql_log_bin = @@sql_log_bin; SET sql_log_bin = 0; -CREATE DATABASE IF NOT EXISTS sys DEFAULT CHARACTER SET utf8; +CREATE DATABASE IF NOT EXISTS sys DEFAULT CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci; + +-- If the database had existed, let's recreate its db.opt: +-- * to fix it if it contained unexpected charset/collation values +-- * to create it if it was removed in a mistake +ALTER DATABASE sys CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci; USE sys; diff -Nru mariadb-10.11.6/scripts/wsrep_sst_common.sh mariadb-10.11.9/scripts/wsrep_sst_common.sh --- mariadb-10.11.6/scripts/wsrep_sst_common.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/wsrep_sst_common.sh 2024-08-03 07:29:58.000000000 +0000 @@ -23,6 +23,22 @@ # Setting the path for some utilities on CentOS export PATH="$PATH:/usr/sbin:/usr/bin:/sbin:/bin" +commandex() +{ + if [ -n "$BASH_VERSION" ]; then + command -v "$1" || : + elif [ -x "$1" ]; then + echo "$1" + else + which "$1" || : + fi +} + +with_printf=1 +if [ -z "$BASH_VERSION" ]; then + [ -z "$(commandex printf)" ] && with_printf=0 +fi + trim_string() { if [ -n "$BASH_VERSION" ]; then @@ -35,9 +51,9 @@ y=${#y} x=$(( z-x-1 )) y=$(( y-x+1 )) - printf '%s' "${1:$x:$y}" + echo "${1:$x:$y}" else - printf '' + echo '' fi else local pattern="[[:space:]${2:-}]" @@ -59,9 +75,9 @@ y=$(( y-x+1 )) x="${1:$x:$y}" [ -z "$x" ] && x='.' - printf '%s' "$x" + echo "$x" else - printf '' + echo '' fi else local pattern="[:space:]${2:-}" @@ -85,9 +101,9 @@ y=${#y} if [ $y -ne $z ]; then y=$(( y+1 )) - printf '%s' "${1:0:$y}" + echo "${1:0:$y}" else - printf '' + echo '' fi else local pattern="[[:space:]${2:-}]" @@ -95,6 +111,25 @@ fi } +trim_left() +{ + if [ -n "$BASH_VERSION" ]; then + local pattern="[![:space:]${2:-}]" + local x="${1#*$pattern}" + local z=${#1} + x=${#x} + if [ $x -ne $z ]; then + x=$(( z-x-1 )) + echo "${1:$x:$z}" + else + echo '' + fi + else + local pattern="[[:space:]${2:-}]" + echo "$1" | sed -E "s/^$pattern+//g" + fi +} + to_minuses() { local x="$1" @@ -105,11 +140,7 @@ x="$t" t="${t#*_}" done - if [ -n "$BASH_VERSION" ]; then - printf '%s' "$r$x" - else - echo "$r$x" - fi + echo "$r$x" } WSREP_SST_OPT_BYPASS=0 @@ -121,7 +152,6 @@ WSREP_SST_OPT_AUTH="${WSREP_SST_OPT_AUTH:-}" WSREP_SST_OPT_USER="${WSREP_SST_OPT_USER:-}" WSREP_SST_OPT_PSWD="${WSREP_SST_OPT_PSWD:-}" -WSREP_SST_OPT_REMOTE_AUTH="${WSREP_SST_OPT_REMOTE_AUTH:-}" WSREP_SST_OPT_DEFAULT="" WSREP_SST_OPT_DEFAULTS="" WSREP_SST_OPT_EXTRA_DEFAULT="" @@ -383,9 +413,11 @@ # option name: if [ -n "$BASH_VERSION" ]; then option="${options:0:1}" + elif [ $with_printf -ne 0 ]; then + option=$(printf '%.1s' "$options") else - # If it's not bash, then we need to use slow - # external utilities: + # If it's not bash and without printf, + # then we need to use slow external utilities: option=$(echo "$options" | cut -c1) fi # And the subsequent characters consider option value: @@ -788,17 +820,6 @@ readonly WSREP_SST_OPT_ADDR readonly WSREP_SST_OPT_ADDR_PORT -commandex() -{ - if [ -n "$BASH_VERSION" ]; then - command -v "$1" || : - elif [ -x "$1" ]; then - echo "$1" - else - which "$1" || : - fi -} - # try to use my_print_defaults, mysql and mysqldump that come # with the sources (for MTR suite): script_binary=$(dirname "$0") @@ -929,11 +950,7 @@ # Truncate spaces: [ -n "$reval" ] && reval=$(trim_string "$reval") - if [ -n "$BASH_VERSION" ]; then - printf '%s' "$reval" - else - echo "$reval" - fi + echo "$reval" } # @@ -986,16 +1003,8 @@ break fi done - if [ -n "$BASH_VERSION" ]; then - printf '%s' $found - else - echo $found - fi -} -wsrep_auth_not_set() -{ - [ -z "$WSREP_SST_OPT_AUTH" ] + echo $found } # Get rid of incorrect values resulting from substitution @@ -1013,12 +1022,12 @@ # Let's read the value of the authentication string from the # configuration file so that it does not go to the command line # and does not appear in the ps output: -if wsrep_auth_not_set; then +if [ -z "$WSREP_SST_OPT_AUTH" ]; then WSREP_SST_OPT_AUTH=$(parse_cnf 'sst' 'wsrep-sst-auth') fi # Splitting WSREP_SST_OPT_AUTH as "user:password" pair: -if ! wsrep_auth_not_set; then +if [ -n "$WSREP_SST_OPT_AUTH" ]; then # Extract username as shortest prefix up to first ':' character: WSREP_SST_OPT_AUTH_USER="${WSREP_SST_OPT_AUTH%%:*}" if [ -z "$WSREP_SST_OPT_USER" ]; then @@ -1042,19 +1051,20 @@ fi fi -readonly WSREP_SST_OPT_USER -readonly WSREP_SST_OPT_PSWD -readonly WSREP_SST_OPT_AUTH - +WSREP_SST_OPT_REMOTE_AUTH="${WSREP_SST_OPT_REMOTE_AUTH:-}" +WSREP_SST_OPT_REMOTE_USER= +WSREP_SST_OPT_REMOTE_PSWD= if [ -n "$WSREP_SST_OPT_REMOTE_AUTH" ]; then # Split auth string at the last ':' - readonly WSREP_SST_OPT_REMOTE_USER="${WSREP_SST_OPT_REMOTE_AUTH%%:*}" - readonly WSREP_SST_OPT_REMOTE_PSWD="${WSREP_SST_OPT_REMOTE_AUTH#*:}" -else - readonly WSREP_SST_OPT_REMOTE_USER= - readonly WSREP_SST_OPT_REMOTE_PSWD= + WSREP_SST_OPT_REMOTE_USER="${WSREP_SST_OPT_REMOTE_AUTH%%:*}" + WSREP_SST_OPT_REMOTE_PSWD="${WSREP_SST_OPT_REMOTE_AUTH#*:}" fi +readonly WSREP_SST_OPT_USER +readonly WSREP_SST_OPT_PSWD +readonly WSREP_SST_OPT_AUTH +readonly WSREP_SST_OPT_REMOTE_USER +readonly WSREP_SST_OPT_REMOTE_PSWD readonly WSREP_SST_OPT_REMOTE_AUTH if [ -n "$WSREP_SST_OPT_DATA" ]; then @@ -1128,9 +1138,7 @@ printf '%04x%04x%04x%04x%04x%04x%04x%04x' \ $RANDOM $RANDOM $RANDOM $RANDOM \ $RANDOM $RANDOM $RANDOM $RANDOM - elif [ -n "$(commandex cksum)" -a \ - -n "$(commandex printf)" ] - then + elif [ $with_printf -ne 0 -a -n "$(commandex cksum)" ]; then printf '%08x%08x%08x%08x' \ $(head -8 /dev/urandom | cksum | cut -d ' ' -f1) \ $(head -8 /dev/urandom | cksum | cut -d ' ' -f1) \ @@ -1166,9 +1174,9 @@ # the domain name check: if [ "${2:-0}" -eq 0 ]; then # We consider all the names of a given host to be local addresses: - [ "$1" = "$(hostname -s)" -o \ - "$1" = "$(hostname -f)" -o \ - "$1" = "$(hostname -d)" ] && return 0 + [ "$1" = "$(hostname -s 2>/dev/null)" -o \ + "$1" = "$(hostname -f 2>/dev/null)" -o \ + "$1" = "$(hostname -d 2>/dev/null)" ] && return 0 fi # If the address contains anything other than digits # and separators, it is not a local address: @@ -1569,6 +1577,139 @@ fi } +# Get Common Name (CN) from the certificate: +openssl_getCN() +{ + get_openssl + if [ -z "$OPENSSL_BINARY" ]; then + wsrep_log_error \ + 'openssl not found but it is required for authentication' + exit 42 + fi + + local bug=0 + local CN=$("$OPENSSL_BINARY" x509 -noout -subject -in "$1" 2>&1) || bug=1 + + if [ $bug -ne 0 ]; then + wsrep_log_info "run: \"$OPENSSL_BINARY\" x509 -noout -subject -in \"$1\"" + wsrep_log_info "output: $CN" + wsrep_log_error "******** FATAL ERROR **********************************************" + wsrep_log_error "* Unable to parse the certificate file to obtain the common name. *" + wsrep_log_error "*******************************************************************" + exit 22 + fi + + CN=$(trim_string "$CN") + + if [ -n "$CN" ]; then + # If the string begins with the "subject" prefix + # then we need to remove it: + local saved="$CN" + local remain="${CN#subject}" + if [ "$remain" != "$saved" ]; then + remain=$(trim_left "$remain") + # Now let's check for the presence of "=" character + # after the "subject": + saved="$remain" + remain="${remain#=}" + if [ "$remain" != "$saved" ]; then + remain=$(trim_left "$remain") + else + remain="" + bug=1 + fi + fi + while [ -n "$remain" ]; do + local value="" + # Let's extract the option name - all characters + # up to the first '=' or ',' character (if present): + local option="${remain%%[=,]*}" + if [ "$option" != "$remain" ]; then + option=$(trim_right "$option") + # These variables will be needed to determine + # which separator comes first: + local x="${remain#*=}" + local y="${remain#*,}" + local z=${#remain} + x=${#x}; [ $x -eq $z ] && x=0 + y=${#y}; [ $y -eq $z ] && y=0 + # The remaining string is everything that follows + # the separator character: + remain=$(trim_left "${remain#*[=,]}") + # Let's check what we are dealing with - an equal + # sign or a comma? + if [ $x -gt $y ]; then + # If the remainder begins with a double quote, + # then there is a string containing commas and + # we need to parse it: + saved="$remain" + remain="${remain#\"}" + if [ "$remain" != "$saved" ]; then + while :; do + # We need to find the closing quote: + local prefix="$remain" + remain="${remain#*\"}" + # Let's check if there is a closing quote? + if [ "$remain" = "$prefix" ]; then + bug=1 + break + fi + # Everything up to the closing quote is + # the next part of the value: + value="$value${prefix%%\"*}" + # But if the last character of the value + # is a backslash, then it is a quoted quotation + # mark and we need to add it to the value: + if [ "${value%\\}" != "$value" ]; then + value="$value\"" + else + break + fi + done + [ $bug -ne 0 ] && break + # Now we have to remove "," if it is present + # in the string after the value: + saved=$(trim_left "$remain") + remain="${saved#,}" + if [ "$remain" != "$saved" ]; then + remain=$(trim_left "$remain") + elif [ -n "$remain" ]; then + bug=1 + break + fi + else + # We are dealing with a simple unquoted string value, + # therefore we need to take everything up to the end + # of the string, or up to the next comma character: + value="${remain%%,*}" + if [ "$value" != "$remain" ]; then + remain=$(trim_left "${remain#*,}") + else + remain="" + fi + value=$(trim_right "$value") + fi + if [ "$option" = 'CN' -a -n "$value" ]; then + echo "$value" + return + fi + fi + else + remain="" + fi + done + fi + + if [ $bug -ne 0 ]; then + wsrep_log_error "******** FATAL ERROR **********************************************" + wsrep_log_error "* Unable to parse the certificate options: '$CN'" + wsrep_log_error "*******************************************************************" + exit 22 + fi + + echo '' +} + simple_cleanup() { # Since this is invoked just after exit NNN diff -Nru mariadb-10.11.6/scripts/wsrep_sst_mariabackup.sh mariadb-10.11.9/scripts/wsrep_sst_mariabackup.sh --- mariadb-10.11.6/scripts/wsrep_sst_mariabackup.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/wsrep_sst_mariabackup.sh 2024-08-03 07:29:58.000000000 +0000 @@ -102,9 +102,12 @@ fi DATA="$WSREP_SST_OPT_DATA" + INFO_FILE='xtrabackup_galera_info' +DONOR_INFO_FILE='donor_galera_info' IST_FILE='xtrabackup_ist' MAGIC_FILE="$DATA/$INFO_FILE" +DONOR_MAGIC_FILE="$DATA/$DONOR_INFO_FILE" INNOAPPLYLOG="$DATA/mariabackup.prepare.log" INNOMOVELOG="$DATA/mariabackup.move.log" @@ -650,14 +653,14 @@ if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then strmcmd="'$STREAM_BIN' -x" else - strmcmd="'$STREAM_BIN' -c '$INFO_FILE'" + strmcmd="'$STREAM_BIN' -c '$INFO_FILE' '$DONOR_INFO_FILE'" fi else sfmt='tar' if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then strmcmd='tar xfi -' else - strmcmd="tar cf - '$INFO_FILE'" + strmcmd="tar cf - '$INFO_FILE' '$DONOR_INFO_FILE'" fi fi wsrep_log_info "Streaming with $sfmt" @@ -679,6 +682,7 @@ if [ $estatus -ne 0 ]; then wsrep_log_error "Removing $MAGIC_FILE file due to signal" [ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE" || : + [ -f "$DONOR_MAGIC_FILE" ] && rm -f "$DONOR_MAGIC_FILE" || : fi if [ "$WSREP_SST_OPT_ROLE" = 'joiner' ]; then @@ -710,7 +714,7 @@ fi # Final cleanup - pgid=$(ps -o pgid= $$ 2>/dev/null | grep -o -E '[0-9]+' || :) + pgid=$(ps -o 'pgid=' $$ 2>/dev/null | grep -o -E '[0-9]+' || :) # This means no setsid done in mysqld. # We don't want to kill mysqld here otherwise. @@ -799,7 +803,8 @@ if [ $tmt -gt 0 ]; then if [ -n "$(commandex timeout)" ]; then local koption=0 - if [ "$OS" = 'FreeBSD' ]; then + if [ "$OS" = 'FreeBSD' -o "$OS" = 'NetBSD' -o "$OS" = 'OpenBSD' -o \ + "$OS" = 'DragonFly' ]; then if timeout 2>&1 | grep -qw -F -- '-k'; then koption=1 fi @@ -915,6 +920,7 @@ } [ -f "$MAGIC_FILE" ] && rm -f "$MAGIC_FILE" +[ -f "$DONOR_MAGIC_FILE" ] && rm -rf "$DONOR_MAGIC_FILE" read_cnf setup_ports @@ -1042,6 +1048,23 @@ INNOBACKUP="$BACKUP_BIN$WSREP_SST_OPT_CONF --backup$disver${iopts:+ }$iopts$tmpopts$INNOEXTRA --galera-info --stream=$sfmt --target-dir='$itmpdir' --datadir='$DATA'$mysqld_args $INNOBACKUP" } +send_magic() +{ + # Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id + # (separated by a space). + echo "$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID" > "$MAGIC_FILE" + echo "$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID" > "$DONOR_MAGIC_FILE" + if [ -n "$WSREP_SST_OPT_REMOTE_PSWD" ]; then + # Let joiner know that we know its secret + echo "$SECRET_TAG $WSREP_SST_OPT_REMOTE_PSWD" >> "$MAGIC_FILE" + fi + + if [ $WSREP_SST_OPT_BYPASS -eq 0 -a $WSREP_SST_OPT_PROGRESS -eq 1 ]; then + # Tell joiner what to expect: + echo "$TOTAL_TAG $payload" >> "$MAGIC_FILE" + fi +} + get_stream get_transfer @@ -1063,27 +1086,27 @@ tmpdir=$(parse_cnf "$encgroups" 'tmpdir') if [ -z "$tmpdir" ]; then xtmpdir="$(mktemp -d)" + itmpdir="$(mktemp -d)" elif [ "$OS" = 'Linux' ]; then - xtmpdir=$(mktemp '-d' "--tmpdir=$tmpdir") + xtmpdir=$(mktemp -d "--tmpdir=$tmpdir") + itmpdir=$(mktemp -d "--tmpdir=$tmpdir") else - xtmpdir=$(TMPDIR="$tmpdir"; mktemp '-d') + xtmpdir=$(TMPDIR="$tmpdir"; mktemp -d) + itmpdir=$(TMPDIR="$tmpdir"; mktemp -d) fi wsrep_log_info "Using '$xtmpdir' as mariadb-backup temporary directory" tmpopts=" --tmpdir='$xtmpdir'" - itmpdir="$(mktemp -d)" - wsrep_log_info "Using '$itmpdir' as mariadb-abackup working directory" + wsrep_log_info "Using '$itmpdir' as mariadb-backup working directory" - usrst=0 if [ -n "$WSREP_SST_OPT_USER" ]; then INNOEXTRA="$INNOEXTRA --user='$WSREP_SST_OPT_USER'" - usrst=1 fi if [ -n "$WSREP_SST_OPT_PSWD" ]; then export MYSQL_PWD="$WSREP_SST_OPT_PSWD" - elif [ $usrst -eq 1 ]; then + elif [ -n "$WSREP_SST_OPT_USER" ]; then # Empty password, used for testing, debugging etc. unset MYSQL_PWD fi @@ -1099,20 +1122,7 @@ fi wsrep_log_info "Streaming GTID file before SST" - - # Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id - # (separated by a space). - echo "$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID" > "$MAGIC_FILE" - - if [ -n "$WSREP_SST_OPT_REMOTE_PSWD" ]; then - # Let joiner know that we know its secret - echo "$SECRET_TAG $WSREP_SST_OPT_REMOTE_PSWD" >> "$MAGIC_FILE" - fi - - if [ $WSREP_SST_OPT_PROGRESS -eq 1 ]; then - # Tell joiner what to expect: - echo "$TOTAL_TAG $payload" >> "$MAGIC_FILE" - fi + send_magic ttcmd="$tcmd" @@ -1157,12 +1167,6 @@ iopts="--databases-exclude='lost+found'${iopts:+ }$iopts" - if [ ${FORCE_FTWRL:-0} -eq 1 ]; then - wsrep_log_info "Forcing FTWRL due to environment variable" \ - "FORCE_FTWRL equal to $FORCE_FTWRL" - iopts="--no-backup-locks${iopts:+ }$iopts" - fi - # if compression is enabled for backup files, then add the # appropriate options to the mariadb-backup command line: if [ "$compress" != 'none' ]; then @@ -1200,12 +1204,11 @@ else # BYPASS FOR IST wsrep_log_info "Bypassing the SST for IST" - echo "continue" # now server can resume updating data + echo 'continue' # now server can resume updating data - # Store donor's wsrep GTID (state ID) and wsrep_gtid_domain_id - # (separated by a space). - echo "$WSREP_SST_OPT_GTID $WSREP_SST_OPT_GTID_DOMAIN_ID" > "$MAGIC_FILE" - echo "1" > "$DATA/$IST_FILE" + send_magic + + echo '1' > "$DATA/$IST_FILE" if [ -n "$scomp" ]; then tcmd="$scomp | $tcmd" @@ -1310,13 +1313,13 @@ impts="--parallel=$backup_threads${impts:+ }$impts" fi - SST_PID="$WSREP_SST_OPT_DATA/wsrep_sst.pid" + SST_PID="$DATA/wsrep_sst.pid" # give some time for previous SST to complete: check_round=0 while check_pid "$SST_PID" 0; do wsrep_log_info "previous SST is not completed, waiting for it to exit" - check_round=$(( check_round + 1 )) + check_round=$(( check_round+1 )) if [ $check_round -eq 10 ]; then wsrep_log_error "previous SST script still running." exit 114 # EALREADY @@ -1343,16 +1346,7 @@ # backward-incompatible behavior: CN="" if [ -n "$tpem" ]; then - # find out my Common Name - get_openssl - if [ -z "$OPENSSL_BINARY" ]; then - wsrep_log_error \ - 'openssl not found but it is required for authentication' - exit 42 - fi - CN=$("$OPENSSL_BINARY" x509 -noout -subject -in "$tpem" | \ - tr ',' '\n' | grep -F 'CN =' | cut -d '=' -f2 | sed s/^\ // | \ - sed s/\ %//) + CN=$(openssl_getCN "$tpem") fi MY_SECRET="$(wsrep_gen_secret)" # Add authentication data to address @@ -1451,8 +1445,8 @@ TDATA="$DATA" DATA="$DATA/.sst" - MAGIC_FILE="$DATA/$INFO_FILE" + wsrep_log_info "Waiting for SST streaming to complete!" monitor_process $jpid @@ -1590,9 +1584,16 @@ exit 2 fi + # use donor magic file, if present + # if IST was used, donor magic file was not created # Remove special tags from the magic file, and from the output: - coords=$(head -n1 "$MAGIC_FILE") - wsrep_log_info "Galera co-ords from recovery: $coords" + if [ -r "$DONOR_MAGIC_FILE" ]; then + coords=$(head -n1 "$DONOR_MAGIC_FILE") + wsrep_log_info "Galera co-ords from donor: $coords" + else + coords=$(head -n1 "$MAGIC_FILE") + wsrep_log_info "Galera co-ords from recovery: $coords" + fi echo "$coords" # Output : UUID:seqno wsrep_gtid_domain_id wsrep_log_info "Total time on joiner: $totime seconds" diff -Nru mariadb-10.11.6/scripts/wsrep_sst_mysqldump.sh mariadb-10.11.9/scripts/wsrep_sst_mysqldump.sh --- mariadb-10.11.6/scripts/wsrep_sst_mysqldump.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/wsrep_sst_mysqldump.sh 2024-08-03 07:29:58.000000000 +0000 @@ -40,17 +40,15 @@ fi # Check client version -if ! $MYSQL_CLIENT --version | grep -q -E 'Distrib 10\.[1-9]'; then +if ! $MYSQL_CLIENT --version | grep -q -E '(Distrib 10\.[1-9])|( from 1[1-9]\.)'; then $MYSQL_CLIENT --version >&2 wsrep_log_error "this operation requires MySQL client version 10.1 or newer" exit $EINVAL fi AUTH="" -usrst=0 if [ -n "$WSREP_SST_OPT_USER" ]; then AUTH="-u$WSREP_SST_OPT_USER" - usrst=1 fi # Refs https://github.com/codership/mysql-wsrep/issues/141 @@ -64,7 +62,7 @@ # word, it is arguably more secure than passing password on the command line. if [ -n "$WSREP_SST_OPT_PSWD" ]; then export MYSQL_PWD="$WSREP_SST_OPT_PSWD" -elif [ $usrst -eq 1 ]; then +elif [ -n "$WSREP_SST_OPT_USER" ]; then # Empty password, used for testing, debugging etc. unset MYSQL_PWD fi diff -Nru mariadb-10.11.6/scripts/wsrep_sst_rsync.sh mariadb-10.11.9/scripts/wsrep_sst_rsync.sh --- mariadb-10.11.6/scripts/wsrep_sst_rsync.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/scripts/wsrep_sst_rsync.sh 2024-08-03 07:29:58.000000000 +0000 @@ -149,10 +149,12 @@ check_pid "$pid_file" && [ $CHECK_PID -eq $pid ] } -STUNNEL_CONF="$WSREP_SST_OPT_DATA/stunnel.conf" -STUNNEL_PID="$WSREP_SST_OPT_DATA/stunnel.pid" +DATA="$WSREP_SST_OPT_DATA" + +STUNNEL_CONF="$DATA/stunnel.conf" +STUNNEL_PID="$DATA/stunnel.pid" -MAGIC_FILE="$WSREP_SST_OPT_DATA/rsync_sst_complete" +MAGIC_FILE="$DATA/rsync_sst_complete" get_binlog @@ -163,7 +165,6 @@ OLD_PWD="$(pwd)" -DATA="$WSREP_SST_OPT_DATA" if [ -n "$DATA" -a "$DATA" != '.' ]; then [ ! -d "$DATA" ] && mkdir -p "$DATA" cd "$DATA" @@ -347,13 +348,13 @@ readonly SECRET_TAG='secret' readonly BYPASS_TAG='bypass' -SST_PID="$WSREP_SST_OPT_DATA/wsrep_sst.pid" +SST_PID="$DATA/wsrep_sst.pid" # give some time for previous SST to complete: check_round=0 while check_pid "$SST_PID" 0; do wsrep_log_info "Previous SST is not completed, waiting for it to exit" - check_round=$(( check_round + 1 )) + check_round=$(( check_round+1 )) if [ $check_round -eq 20 ]; then wsrep_log_error "previous SST script still running." exit 114 # EALREADY @@ -369,7 +370,7 @@ while check_pid "$STUNNEL_PID" 1 "$STUNNEL_CONF"; do wsrep_log_info "Lingering stunnel daemon found at startup," \ "waiting for it to exit" - check_round=$(( check_round + 1 )) + check_round=$(( check_round+1 )) if [ $check_round -eq 10 ]; then wsrep_log_error "stunnel daemon still running." exit 114 # EALREADY @@ -379,15 +380,15 @@ MODULE="${WSREP_SST_OPT_MODULE:-rsync_sst}" -RSYNC_PID="$WSREP_SST_OPT_DATA/$MODULE.pid" -RSYNC_CONF="$WSREP_SST_OPT_DATA/$MODULE.conf" +RSYNC_PID="$DATA/$MODULE.pid" +RSYNC_CONF="$DATA/$MODULE.conf" # give some time for rsync from the previous SST to complete: check_round=0 while check_pid "$RSYNC_PID" 1 "$RSYNC_CONF"; do wsrep_log_info "Lingering rsync daemon found at startup," \ "waiting for it to exit" - check_round=$(( check_round + 1 )) + check_round=$(( check_round+1 )) if [ $check_round -eq 10 ]; then wsrep_log_error "rsync daemon still running." exit 114 # EALREADY @@ -422,8 +423,8 @@ if [ $WSREP_SST_OPT_BYPASS -eq 0 ]; then - FLUSHED="$WSREP_SST_OPT_DATA/tables_flushed" - ERROR="$WSREP_SST_OPT_DATA/sst_error" + FLUSHED="$DATA/tables_flushed" + ERROR="$DATA/sst_error" [ -f "$FLUSHED" ] && rm -f "$FLUSHED" [ -f "$ERROR" ] && rm -f "$ERROR" @@ -474,17 +475,13 @@ # Preparing binlog files for transfer: wsrep_log_info "Preparing binlog files for transfer:" tar_type=0 - if tar --help | grep -qw -F -- '--transform'; then + if tar --help 2>/dev/null | grep -qw -F -- '--transform'; then tar_type=1 - elif tar --version | grep -qw -E '^bsdtar'; then + elif tar --version 2>/dev/null | grep -qw -E '^bsdtar'; then tar_type=2 fi if [ $tar_type -eq 2 ]; then - if [ -n "$BASH_VERSION" ]; then - printf '%s' "$binlog_files" >&2 - else - echo "$binlog_files" >&2 - fi + echo "$binlog_files" >&2 fi if [ $tar_type -ne 0 ]; then # Preparing list of the binlog file names: @@ -580,7 +577,7 @@ eval rsync ${STUNNEL:+"--rsh='$STUNNEL'"} \ --owner --group --perms --links --specials \ --ignore-times --inplace --dirs --delete --quiet \ - $WHOLE_FILE_OPT $FILTER "'$WSREP_SST_OPT_DATA/'" \ + $WHOLE_FILE_OPT $FILTER "'$DATA/'" \ "'rsync://$WSREP_SST_OPT_ADDR'" >&2 || RC=$? if [ $RC -ne 0 ]; then @@ -688,7 +685,7 @@ -f '- $ib_log_dir/ib_logfile[0-9]*' \ -f '- $ar_log_dir/aria_log_control' \ -f '- $ar_log_dir/aria_log.*' \ - "$WSREP_SST_OPT_DATA/{}/" \ + "$DATA/{}/" \ "rsync://$WSREP_SST_OPT_ADDR/{}" >&2 || RC=$? cd "$OLD_PWD" @@ -770,7 +767,7 @@ timeout = 300 $SILENT [$MODULE] - path = $WSREP_SST_OPT_DATA + path = $DATA exclude = .zfs [$MODULE-log_dir] path = $ib_log_dir @@ -853,16 +850,7 @@ # backward-incompatible behavior: CN="" if [ -n "$SSTCERT" ]; then - # find out my Common Name - get_openssl - if [ -z "$OPENSSL_BINARY" ]; then - wsrep_log_error \ - 'openssl not found but it is required for authentication' - exit 42 - fi - CN=$("$OPENSSL_BINARY" x509 -noout -subject -in "$SSTCERT" | \ - tr ',' '\n' | grep -F 'CN =' | cut -d '=' -f2 | sed s/^\ // | \ - sed s/\ %//) + CN=$(openssl_getCN "$SSTCERT") fi MY_SECRET="$(wsrep_gen_secret)" # Add authentication data to address @@ -979,7 +967,7 @@ fi # Extracting binlog files: wsrep_log_info "Extracting binlog files:" - if tar --version | grep -qw -E '^bsdtar'; then + if tar --version 2>/dev/null | grep -qw -E '^bsdtar'; then tar -tf "$BINLOG_TAR_FILE" > "$tmpfile" && \ tar -xvf "$BINLOG_TAR_FILE" > /dev/null || RC=$? else diff -Nru mariadb-10.11.6/sql/CMakeLists.txt mariadb-10.11.9/sql/CMakeLists.txt --- mariadb-10.11.6/sql/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/CMakeLists.txt 2024-08-03 07:29:58.000000000 +0000 @@ -55,8 +55,8 @@ ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/sql ${LIBFMT_INCLUDE_DIR} -${PCRE_INCLUDES} -${ZLIB_INCLUDE_DIR} +${PCRE_INCLUDE_DIRS} +${ZLIB_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS} ${CMAKE_BINARY_DIR}/sql ${CMAKE_SOURCE_DIR}/tpool @@ -180,6 +180,7 @@ table_cache.cc encryption.cc temporary_tables.cc json_table.cc proxy_protocol.cc backup.cc xa.cc + socketpair.c socketpair.h ${CMAKE_CURRENT_BINARY_DIR}/lex_hash.h ${CMAKE_CURRENT_BINARY_DIR}/lex_token.h ${GEN_SOURCES} diff -Nru mariadb-10.11.6/sql/backup.cc mariadb-10.11.9/sql/backup.cc --- mariadb-10.11.6/sql/backup.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/backup.cc 2024-08-03 07:29:58.000000000 +0000 @@ -39,6 +39,7 @@ #ifdef WITH_WSREP #include "wsrep_server_state.h" #include "wsrep_mysqld.h" +#include "wsrep_sst.h" #endif /* WITH_WSREP */ static const char *stage_names[]= @@ -293,29 +294,40 @@ #ifdef WITH_WSREP DBUG_ASSERT(thd->wsrep_desynced_backup_stage == false); - /* - if user is specifically choosing to allow BF aborting for BACKUP STAGE BLOCK_DDL lock - holder, then do not desync and pause the node from cluster replication. - e.g. mariabackup uses BACKUP STATE BLOCK_DDL; and will be abortable by this. - But, If node is processing as SST donor or WSREP_MODE_BF_MARIABACKUP mode is not set, - we desync the node for BACKUP STAGE because applier threads - bypass backup MDL locks (see MDL_lock::can_grant_lock) - */ if (WSREP_NNULL(thd)) { Wsrep_server_state &server_state= Wsrep_server_state::instance(); - if (!wsrep_check_mode(WSREP_MODE_BF_MARIABACKUP) || - server_state.state() == Wsrep_server_state::s_donor) + /* + If user is specifically choosing to allow BF aborting for + BACKUP STAGE BLOCK_DDL lock holder, then do not desync and + pause the node from cluster replication. e.g. mariabackup + uses BACKUP STATE BLOCK_DDL; and will be abortable by this. + */ + bool mariabackup= (server_state.state() == Wsrep_server_state::s_donor + && !strcmp(wsrep_sst_method, "mariabackup")); + bool allow_bf= wsrep_check_mode(WSREP_MODE_BF_MARIABACKUP); + bool pause_and_desync= true; + + if ((allow_bf) || (mariabackup)) + { + pause_and_desync= false; + } + + if (pause_and_desync) { - if (server_state.desync_and_pause().is_undefined()) { + if (server_state.desync_and_pause().is_undefined()) DBUG_RETURN(1); - } + + WSREP_INFO("Server desynched from group during BACKUP STAGE BLOCK_DDL."); DEBUG_SYNC(thd, "wsrep_backup_stage_after_desync_and_pause"); thd->wsrep_desynced_backup_stage= true; } else - WSREP_INFO("Server not desynched from group because WSREP_MODE_BF_MARIABACKUP used."); + { + WSREP_INFO("Server not desynched from group at BLOCK_DDL because %s is used.", + allow_bf ? "WSREP_MODE_BF_MARIABACKUP" : wsrep_sst_method); + } } #endif /* WITH_WSREP */ @@ -399,6 +411,28 @@ } thd->clear_error(); +#ifdef WITH_WSREP + if (WSREP_NNULL(thd) && !thd->wsrep_desynced_backup_stage) + { + Wsrep_server_state &server_state= Wsrep_server_state::instance(); + bool mariabackup= (server_state.state() == Wsrep_server_state::s_donor + && !strcmp(wsrep_sst_method, "mariabackup")); + + /* If this node is donor and mariabackup is not used + we desync and pause provider here if it is not yet done. + */ + if (!mariabackup) + { + if (server_state.desync_and_pause().is_undefined()) + DBUG_RETURN(1); + + WSREP_INFO("Server desynched from group during BACKUP STAGE BLOCK_COMMIT."); + thd->wsrep_desynced_backup_stage= true; + DEBUG_SYNC(thd, "wsrep_backup_stage_commit_after_desync_and_pause"); + } + } +#endif /* WITH_WSREP */ + DBUG_RETURN(0); } diff -Nru mariadb-10.11.6/sql/ddl_log.cc mariadb-10.11.9/sql/ddl_log.cc --- mariadb-10.11.6/sql/ddl_log.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/ddl_log.cc 2024-08-03 07:29:58.000000000 +0000 @@ -924,12 +924,12 @@ first_error(0), only_ignore_non_existing_errors(0) {} - bool handle_condition(THD *thd, + bool handle_condition(THD *, uint sql_errno, - const char* sqlstate, + const char*, Sql_condition::enum_warning_level *level, - const char* msg, - Sql_condition ** cond_hdl) + const char*, + Sql_condition **cond_hdl) override { *cond_hdl= NULL; if (non_existing_table_error(sql_errno) || diff -Nru mariadb-10.11.6/sql/debug.cc mariadb-10.11.9/sql/debug.cc --- mariadb-10.11.6/sql/debug.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/debug.cc 2024-08-03 07:29:58.000000000 +0000 @@ -40,7 +40,8 @@ THD *thd= current_thd; user_var_entry *entry= (user_var_entry*) my_hash_search(&thd->user_vars, (uchar*) name->str, name->length); - if (!entry || entry->type != INT_RESULT || ! entry->value) + if (!entry || !entry->value || + entry->type_handler()->result_type() != INT_RESULT) return 0; (*(ulonglong*) entry->value)= (*(ulonglong*) entry->value)-1; return !*(ulonglong*) entry->value; diff -Nru mariadb-10.11.6/sql/debug_sync.cc mariadb-10.11.9/sql/debug_sync.cc --- mariadb-10.11.6/sql/debug_sync.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/debug_sync.cc 2024-08-03 07:29:58.000000000 +0000 @@ -1152,7 +1152,7 @@ st_debug_sync_action *action= NULL; const char *errmsg; char *ptr; - char *token; + char *token= nullptr; uint token_length= 0; DBUG_ENTER("debug_sync_eval_action"); DBUG_ASSERT(thd); diff -Nru mariadb-10.11.6/sql/des_key_file.cc mariadb-10.11.9/sql/des_key_file.cc --- mariadb-10.11.6/sql/des_key_file.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/des_key_file.cc 2024-08-03 07:29:58.000000000 +0000 @@ -19,7 +19,7 @@ #include "log.h" // sql_print_error #include -#ifdef HAVE_OPENSSL +#ifdef HAVE_des struct st_des_keyschedule des_keyschedule[10]; uint des_default_key; @@ -103,4 +103,4 @@ mysql_mutex_unlock(&LOCK_des_key_file); DBUG_RETURN(result); } -#endif /* HAVE_OPENSSL */ +#endif /* HAVE_des */ diff -Nru mariadb-10.11.6/sql/des_key_file.h mariadb-10.11.9/sql/des_key_file.h --- mariadb-10.11.6/sql/des_key_file.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/des_key_file.h 2024-08-03 07:29:58.000000000 +0000 @@ -16,7 +16,7 @@ #ifndef DES_KEY_FILE_INCLUDED #define DES_KEY_FILE_INCLUDED -#ifdef HAVE_OPENSSL +#ifdef HAVE_des #include #include "violite.h" /* DES_cblock, DES_key_schedule */ @@ -35,6 +35,6 @@ extern uint des_default_key; bool load_des_key_file(const char *file_name); -#endif /* HAVE_OPENSSL */ +#endif /* HAVE_des */ #endif /* DES_KEY_FILE_INCLUDED */ diff -Nru mariadb-10.11.6/sql/event_data_objects.cc mariadb-10.11.9/sql/event_data_objects.cc --- mariadb-10.11.6/sql/event_data_objects.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/event_data_objects.cc 2024-08-03 07:29:58.000000000 +0000 @@ -71,14 +71,14 @@ Stored_program_creation_ctx **ctx); public: - virtual Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) + Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) override { return new (mem_root) Event_creation_ctx(m_client_cs, m_connection_cl, m_db_cl); } protected: - virtual Object_creation_ctx *create_backup_ctx(THD *thd) const + Object_creation_ctx *create_backup_ctx(THD *thd) const override { /* We can avoid usual backup/restore employed in stored programs since we diff -Nru mariadb-10.11.6/sql/event_data_objects.h mariadb-10.11.9/sql/event_data_objects.h --- mariadb-10.11.6/sql/event_data_objects.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/event_data_objects.h 2024-08-03 07:29:58.000000000 +0000 @@ -117,7 +117,7 @@ virtual ~Event_queue_element(); virtual bool - load_from_row(THD *thd, TABLE *table); + load_from_row(THD *thd, TABLE *table) override; bool compute_next_execution_time(); @@ -155,7 +155,7 @@ init(); virtual bool - load_from_row(THD *thd, TABLE *table); + load_from_row(THD *thd, TABLE *table) override; int get_create_event(THD *thd, String *buf); @@ -176,7 +176,7 @@ Event_job_data(); virtual bool - load_from_row(THD *thd, TABLE *table); + load_from_row(THD *thd, TABLE *table) override; bool execute(THD *thd, bool drop); diff -Nru mariadb-10.11.6/sql/event_queue.cc mariadb-10.11.9/sql/event_queue.cc --- mariadb-10.11.6/sql/event_queue.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/event_queue.cc 2024-08-03 07:29:58.000000000 +0000 @@ -656,7 +656,6 @@ top->status= Event_parse_data::DISABLED; DBUG_PRINT("info", ("event %s status is %d", top->name.str, top->status)); - top->execution_count++; (*event_name)->dropped= top->dropped; /* Save new values of last_executed timestamp and event status on stack diff -Nru mariadb-10.11.6/sql/field.cc mariadb-10.11.9/sql/field.cc --- mariadb-10.11.6/sql/field.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/field.cc 2024-08-03 07:29:58.000000000 +0000 @@ -1502,6 +1502,9 @@ if (!(expr_item= thd->sp_fix_func_item_for_assignment(this, value))) goto error; + if (expr_item->check_is_evaluable_expression_or_error()) + goto error; + /* Save the value in the field. Convert the value if needed. */ expr_item->save_in_field(this, 0); @@ -4741,30 +4744,6 @@ single precision float ****************************************************************************/ -Field_float::Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, - uchar null_bit_arg, - enum utype unireg_check_arg, - const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg, - bool zero_arg, bool unsigned_arg) - :Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, - (dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg), - zero_arg, unsigned_arg) -{ -} - -Field_float::Field_float(uint32 len_arg, bool maybe_null_arg, - const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg) - :Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0, - NONE, field_name_arg, - (dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg), - 0, 0) -{ -} - - int Field_float::store(const char *from,size_t len,CHARSET_INFO *cs) { int error; @@ -4913,40 +4892,6 @@ double precision floating point numbers ****************************************************************************/ -Field_double::Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, - uchar null_bit_arg, - enum utype unireg_check_arg, - const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg, - bool zero_arg, bool unsigned_arg) - :Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, - unireg_check_arg, field_name_arg, - (dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg), - zero_arg, unsigned_arg) -{ -} - -Field_double::Field_double(uint32 len_arg, bool maybe_null_arg, - const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg) - :Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, - NONE, field_name_arg, - (dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg), - 0, 0) -{ -} - -Field_double::Field_double(uint32 len_arg, bool maybe_null_arg, - const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg, bool not_fixed_arg) - :Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, - NONE, field_name_arg, - (dec_arg >= FLOATING_POINT_DECIMALS ? NOT_FIXED_DEC : dec_arg), - 0, 0) -{ - not_fixed= not_fixed_arg; -} - int Field_double::store(const char *from,size_t len,CHARSET_INFO *cs) { int error; @@ -5335,6 +5280,8 @@ { ulong sec_part; my_time_t ts= get_timestamp(&sec_part); + if (!ts && !sec_part) + return to->store_time_dec(Datetime::zero().get_mysql_time(), decimals()); return to->store_timestamp_dec(Timeval(ts, sec_part), decimals()); } @@ -5456,11 +5403,33 @@ } -int Field_timestamp::store_timestamp_dec(const timeval &ts, uint dec) +int Field_timestamp::store_timestamp_dec(const timeval &tv, uint dec) { int warn= 0; time_round_mode_t mode= Datetime::default_round_mode(get_thd()); - store_TIMESTAMP(Timestamp(ts).round(decimals(), mode, &warn)); + const Timestamp ts= Timestamp(tv).round(decimals(), mode, &warn); + store_TIMESTAMP(ts); + if (ts.tv().tv_sec == 0 && ts.tv().tv_usec == 0) + { + /* + The value {tv_sec==0, tv_usec==0} here means '1970-01-01 00:00:00 +00'. + It does not mean zero datetime! because store_timestamp_dec() knows + nothing about zero dates. It inserts only real timeval values. + Zero ts={0,0} here is possible in two scenarios: + - the passed tv was already {0,0} meaning '1970-01-01 00:00:00 +00' + - the passed tv had some microseconds but they were rounded/truncated + to zero: '1970-01-01 00:00:00.1 +00' -> '1970-01-01 00:00:00 +00'. + It does not matter whether rounding/truncation really happened. + In both cases the call for store_TIMESTAMP(ts) above re-interpreted + '1970-01-01 00:00:00 +00:00' to zero date. Return 1 no matter what + sql_mode is. Even if sql_mode allows zero dates, there is still a problem + here: '1970-01-01 00:00:00 +00' could not be stored as-is! + */ + ErrConvString str(STRING_WITH_LEN("1970-01-01 00:00:00 +00:00"), + system_charset_info); + set_datetime_warning(ER_WARN_DATA_OUT_OF_RANGE, &str, "datetime", 1); + return 1; // '1970-01-01 00:00:00 +00' was converted to a zero date + } if (warn) { /* @@ -5474,9 +5443,6 @@ */ set_warning(Sql_condition::WARN_LEVEL_WARN, ER_WARN_DATA_OUT_OF_RANGE, 1); } - if (ts.tv_sec == 0 && ts.tv_usec == 0 && - get_thd()->variables.sql_mode & (ulonglong) TIME_NO_ZERO_DATE) - return zero_time_stored_return_code_with_warning(); return 0; } @@ -5847,8 +5813,10 @@ bool Field_timestampf::val_native(Native *to) { DBUG_ASSERT(marked_for_read()); + char zero[8]= "\0\0\0\0\0\0\0"; + DBUG_ASSERT(pack_length () <= sizeof(zero)); // Check if it's '0000-00-00 00:00:00' rather than a real timestamp - if (ptr[0] == 0 && ptr[1] == 0 && ptr[2] == 0 && ptr[3] == 0) + if (!memcmp(ptr, zero, pack_length())) { to->length(0); return false; @@ -7640,11 +7608,11 @@ { DBUG_ASSERT(marked_for_read()); THD *thd= get_thd(); - return Converter_strntod_with_warn(get_thd(), + const LEX_CSTRING str= to_lex_cstring(); + return Converter_strntod_with_warn(thd, Warn_filter_string(thd, this), Field_string::charset(), - (const char *) ptr, - field_length).result(); + str.str, str.length).result(); } @@ -7652,10 +7620,10 @@ { DBUG_ASSERT(marked_for_read()); THD *thd= get_thd(); + const LEX_CSTRING str= to_lex_cstring(); return Converter_strntoll_with_warn(thd, Warn_filter_string(thd, this), Field_string::charset(), - (const char *) ptr, - field_length).result(); + str.str, str.length).result(); } @@ -7671,20 +7639,26 @@ } -String *Field_string::val_str(String *val_buffer __attribute__((unused)), - String *val_ptr) +LEX_CSTRING Field_string::to_lex_cstring() const { DBUG_ASSERT(marked_for_read()); /* See the comment for Field_long::store(long long) */ DBUG_ASSERT(!table || table->in_use == current_thd); - size_t length; - if (get_thd()->variables.sql_mode & - MODE_PAD_CHAR_TO_FULL_LENGTH) - length= field_charset()->charpos(ptr, ptr + field_length, - Field_string::char_length()); - else - length= field_charset()->lengthsp((const char*) ptr, field_length); - val_ptr->set((const char*) ptr, length, field_charset()); + if (get_thd()->variables.sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH) + return Lex_cstring((const char*) ptr, + field_charset()->charpos(ptr, ptr + field_length, + Field_string::char_length())); + return Lex_cstring((const char *) ptr, + field_charset()->lengthsp((const char*) ptr, field_length)); +} + + +String *Field_string::val_str(String *val_buffer __attribute__((unused)), + String *val_ptr) +{ + DBUG_ASSERT(marked_for_read()); + const LEX_CSTRING str= to_lex_cstring(); + val_ptr->set(str.str, str.length, field_charset()); return val_ptr; } @@ -7693,12 +7667,12 @@ { DBUG_ASSERT(marked_for_read()); THD *thd= get_thd(); + const LEX_CSTRING str= to_lex_cstring(); Converter_str2my_decimal_with_warn(thd, Warn_filter_string(thd, this), E_DEC_FATAL_ERROR & ~E_DEC_BAD_NUM, Field_string::charset(), - (const char *) ptr, - field_length, decimal_value); + str.str, str.length, decimal_value); return decimal_value; } @@ -7743,7 +7717,20 @@ a_ptr, field_length, b_ptr, field_length, Field_string::char_length(), - MY_STRNNCOLLSP_NCHARS_EMULATE_TRIMMED_TRAILING_SPACES); + 0); +} + + +int Field_string::cmp_prefix(const uchar *a_ptr, const uchar *b_ptr, + size_t prefix_char_len) const +{ + size_t field_len= table->field[field_index]->field_length; + + return field_charset()->coll->strnncollsp_nchars(field_charset(), + a_ptr, field_len, + b_ptr, field_len, + prefix_char_len, + 0); } @@ -11396,6 +11383,7 @@ void Field::raise_note_cannot_use_key_part(THD *thd, uint keynr, uint part, const LEX_CSTRING &op, + CHARSET_INFO *op_collation, Item *value, Data_type_compatibility reason) const @@ -11416,7 +11404,7 @@ case Data_type_compatibility::INCOMPATIBLE_COLLATION: { const LEX_CSTRING colf(charset()->coll_name); - const LEX_CSTRING colv(value->collation.collation->coll_name); + const LEX_CSTRING colv(op_collation->coll_name); push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, ER_UNKNOWN_ERROR, "Cannot use key %`.*s part[%u] for lookup: " @@ -11525,6 +11513,30 @@ } +/** + Find which reaction should be for IGNORE value. +*/ + +ignore_value_reaction find_ignore_reaction(THD *thd) +{ + enum_sql_command com= thd->lex->sql_command; + + // All insert-like commands + if (com == SQLCOM_INSERT || com == SQLCOM_REPLACE || + com == SQLCOM_INSERT_SELECT || com == SQLCOM_REPLACE_SELECT || + com == SQLCOM_LOAD) + { + return IGNORE_MEANS_DEFAULT; + } + // Update commands + if (com == SQLCOM_UPDATE || com == SQLCOM_UPDATE_MULTI) + { + return IGNORE_MEANS_FIELD_VALUE; + } + return IGNORE_MEANS_ERROR; +} + + bool Field::save_in_field_default_value(bool view_error_processing) { THD *thd= table->in_use; diff -Nru mariadb-10.11.6/sql/field.h mariadb-10.11.9/sql/field.h --- mariadb-10.11.6/sql/field.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/field.h 2024-08-03 07:29:58.000000000 +0000 @@ -63,6 +63,15 @@ CHECK_FIELD_ERROR_FOR_NULL, }; +enum ignore_value_reaction +{ + IGNORE_MEANS_ERROR, + IGNORE_MEANS_DEFAULT, + IGNORE_MEANS_FIELD_VALUE +}; + +ignore_value_reaction find_ignore_reaction(THD *thd); + enum enum_conv_type { @@ -1657,6 +1666,7 @@ void print_key_value_binary(String *out, const uchar* key, uint32 length); void raise_note_cannot_use_key_part(THD *thd, uint keynr, uint part, const LEX_CSTRING &op, + CHARSET_INFO *op_collation, Item *value, const Data_type_compatibility reason) const; @@ -1836,6 +1846,16 @@ return flags & (VERS_ROW_START | VERS_ROW_END); } + bool vers_sys_start() const + { + return flags & VERS_ROW_START; + } + + bool vers_sys_end() const + { + return flags & VERS_ROW_END; + } + bool vers_update_unversioned() const { return flags & VERS_UPDATE_UNVERSIONED_FLAG; @@ -2137,7 +2157,7 @@ const LEX_CSTRING *field_name_arg, const DTCollation &collation); decimal_digits_t decimals() const override - { return is_created_from_null_item ? 0 : NOT_FIXED_DEC; } + { return is_created_from_null_item ? 0 : DECIMAL_NOT_SPECIFIED; } int save_in_field(Field *to) override { return save_in_field_str(to); } bool memcpy_field_possible(const Field *from) const override { @@ -2307,7 +2327,7 @@ Information_schema_numeric_attributes information_schema_numeric_attributes() const override { - return dec == NOT_FIXED_DEC ? + return dec == DECIMAL_NOT_SPECIFIED ? Information_schema_numeric_attributes(field_length) : Information_schema_numeric_attributes(field_length, dec); } @@ -2879,15 +2899,24 @@ integers. But in all other cases we treat it as TIME_RESULT! */ }; +static inline decimal_digits_t fix_dec_arg(decimal_digits_t dec_arg) +{ return dec_arg >= FLOATING_POINT_DECIMALS ? DECIMAL_NOT_SPECIFIED : dec_arg; } class Field_float final :public Field_real { public: Field_float(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg,bool zero_arg,bool unsigned_arg); + decimal_digits_t dec_arg,bool zero_arg,bool unsigned_arg) + :Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, + unireg_check_arg, field_name_arg, + fix_dec_arg(dec_arg), zero_arg, unsigned_arg) + { } Field_float(uint32 len_arg, bool maybe_null_arg, - const LEX_CSTRING *field_name_arg, decimal_digits_t dec_arg); + const LEX_CSTRING *field_name_arg, decimal_digits_t dec_arg) + :Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "": 0, (uint) 0, + NONE, field_name_arg, fix_dec_arg(dec_arg), 0, 0) + { } const Type_handler *type_handler() const override { return &type_handler_float; } enum ha_base_keytype key_type() const override { return HA_KEYTYPE_FLOAT; } @@ -2920,12 +2949,24 @@ Field_double(uchar *ptr_arg, uint32 len_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg,bool zero_arg,bool unsigned_arg); + decimal_digits_t dec_arg,bool zero_arg,bool unsigned_arg) + :Field_real(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, + unireg_check_arg, field_name_arg, + fix_dec_arg(dec_arg), zero_arg, unsigned_arg) + { } Field_double(uint32 len_arg, bool maybe_null_arg, - const LEX_CSTRING *field_name_arg, decimal_digits_t dec_arg); + const LEX_CSTRING *field_name_arg, decimal_digits_t dec_arg) + :Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, + NONE, field_name_arg, fix_dec_arg(dec_arg), 0, 0) + { } Field_double(uint32 len_arg, bool maybe_null_arg, const LEX_CSTRING *field_name_arg, - decimal_digits_t dec_arg, bool not_fixed_arg); + decimal_digits_t dec_arg, bool not_fixed_arg) + :Field_real((uchar*) 0, len_arg, maybe_null_arg ? (uchar*) "" : 0, (uint) 0, + NONE, field_name_arg, fix_dec_arg(dec_arg), 0, 0) + { + not_fixed= not_fixed_arg; + } void init_for_tmp_table(Field *org_field, TABLE *new_table) override { Field::init_for_tmp_table(org_field, new_table); @@ -3163,7 +3204,7 @@ :Field_temporal(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg) {} - bool validate_value_in_record(THD *thd, const uchar *record) const; + bool validate_value_in_record(THD *thd, const uchar *record) const override; }; @@ -4022,6 +4063,7 @@ field_length >= 4 && orig_table->s->frm_version < FRM_VER_TRUE_VARCHAR; } + LEX_CSTRING to_lex_cstring() const; public: bool can_alter_field_type; Field_string(uchar *ptr_arg, uint32 len_arg,uchar *null_ptr_arg, @@ -4056,6 +4098,8 @@ String *val_str(String *, String *) override; my_decimal *val_decimal(my_decimal *) override; int cmp(const uchar *,const uchar *) const override; + int cmp_prefix(const uchar *a, const uchar *b, size_t prefix_char_len) const + override; void sort_string(uchar *buff,uint length) override; void update_data_type_statistics(Data_type_statistics *st) const override { @@ -4078,9 +4122,6 @@ bool compatible_field_size(uint field_metadata, const Relay_log_info *rli, uint16 mflags, int *order_var) const override; uint row_pack_length() const override { return field_length; } - int pack_cmp(const uchar *a,const uchar *b,uint key_length, - bool insert_or_update); - int pack_cmp(const uchar *b,uint key_length,bool insert_or_update); uint packed_col_length(const uchar *to, uint length) override; uint max_packed_col_length(uint max_length) override; uint size_of() const override { return sizeof *this; } @@ -4264,7 +4305,7 @@ void sql_type(String &str) const override { Field_varstring::sql_type(str); - str.append(STRING_WITH_LEN(" /*!100301 COMPRESSED*/")); + str.append(STRING_WITH_LEN(" /*M!100301 COMPRESSED*/")); } uint32 max_display_length() const override { return field_length - 1; } uint32 character_octet_length() const override { return field_length - 1; } @@ -4702,7 +4743,7 @@ void sql_type(String &str) const override { Field_blob::sql_type(str); - str.append(STRING_WITH_LEN(" /*!100301 COMPRESSED*/")); + str.append(STRING_WITH_LEN(" /*M!100301 COMPRESSED*/")); } /* @@ -5127,20 +5168,20 @@ m_table(NULL) {} ~Field_row(); - en_fieldtype tmp_engine_column_type(bool use_packed_rows) const + en_fieldtype tmp_engine_column_type(bool use_packed_rows) const override { DBUG_ASSERT(0); return Field::tmp_engine_column_type(use_packed_rows); } enum_conv_type rpl_conv_type_from(const Conv_source &source, const Relay_log_info *rli, - const Conv_param ¶m) const + const Conv_param ¶m) const override { DBUG_ASSERT(0); return CONV_TYPE_IMPOSSIBLE; } - Virtual_tmp_table **virtual_tmp_table_addr() { return &m_table; } - bool sp_prepare_and_store_item(THD *thd, Item **value); + Virtual_tmp_table **virtual_tmp_table_addr() override { return &m_table; } + bool sp_prepare_and_store_item(THD *thd, Item **value) override; }; @@ -5714,7 +5755,8 @@ { List_iterator it(list); while (Create_field *f= it++) - f->type_handler()->Column_definition_implicit_upgrade(f); + f->type_handler()->type_handler_for_implicit_upgrade()-> + Column_definition_implicit_upgrade_to_this(f); } }; diff -Nru mariadb-10.11.6/sql/filesort.h mariadb-10.11.9/sql/filesort.h --- mariadb-10.11.6/sql/filesort.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/filesort.h 2024-08-03 07:29:58.000000000 +0000 @@ -56,8 +56,11 @@ bool using_pq; /* TRUE means sort operation must produce table rowids. - FALSE means that it halso has an option of producing {sort_key, - addon_fields} pairs. + FALSE means that it also has an option of producing {sort_key, addon_fields} + pairs. + + Usually initialized with value of join_tab->keep_current_rowid to allow for + a call to table->file->position() using these table rowids. */ bool sort_positions; /* diff -Nru mariadb-10.11.6/sql/gcalc_slicescan.cc mariadb-10.11.9/sql/gcalc_slicescan.cc --- mariadb-10.11.6/sql/gcalc_slicescan.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/gcalc_slicescan.cc 2024-08-03 07:29:58.000000000 +0000 @@ -144,7 +144,7 @@ size_t nbuf; char buf[1024]; nbuf= strlen(header); - strcpy(buf, header); + safe_strcpy(buf, sizeof(buf), header); for (; slice; slice= slice->get_next()) { size_t lnbuf= nbuf; diff -Nru mariadb-10.11.6/sql/gcalc_tools.h mariadb-10.11.9/sql/gcalc_tools.h --- mariadb-10.11.6/sql/gcalc_tools.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/gcalc_tools.h 2024-08-03 07:29:58.000000000 +0000 @@ -146,16 +146,16 @@ Gcalc_operation_transporter(Gcalc_function *fn, Gcalc_heap *heap) : Gcalc_shape_transporter(heap), m_fn(fn) {} - int single_point(double x, double y); - int start_line(); - int complete_line(); - int start_poly(); - int complete_poly(); - int start_ring(); - int complete_ring(); - int add_point(double x, double y); - int start_collection(int n_objects); - int empty_shape(); + int single_point(double x, double y) override; + int start_line() override; + int complete_line() override; + int start_poly() override; + int complete_poly() override; + int start_ring() override; + int complete_ring() override; + int add_point(double x, double y) override; + int start_collection(int n_objects) override; + int empty_shape() override; }; diff -Nru mariadb-10.11.6/sql/ha_handler_stats.h mariadb-10.11.9/sql/ha_handler_stats.h --- mariadb-10.11.6/sql/ha_handler_stats.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/ha_handler_stats.h 2024-08-03 07:29:58.000000000 +0000 @@ -26,9 +26,23 @@ ulonglong pages_accessed; /* Pages accessed from page cache */ ulonglong pages_updated; /* Pages changed in page cache */ ulonglong pages_read_count; /* Pages read from disk */ - ulonglong pages_read_time; /* Time reading pages, in microsec. */ + + /* Time spent reading pages, in timer_tracker_frequency() units */ + ulonglong pages_read_time; + + /* + Number of pages that we've requested to prefetch while running the query. + Note that we don't know: + - how much time was spent reading these pages (and how to count the time + if reading was done in parallel) + - whether the pages were read by "us" or somebody else... + */ + ulonglong pages_prefetched; + ulonglong undo_records_read; - ulonglong engine_time; /* Time spent in engine in microsec */ + + /* Time spent in engine, in timer_tracker_frequency() units */ + ulonglong engine_time; uint active; /* <> 0 if status has to be updated */ #define first_stat pages_accessed #define last_stat engine_time diff -Nru mariadb-10.11.6/sql/ha_partition.cc mariadb-10.11.9/sql/ha_partition.cc --- mariadb-10.11.6/sql/ha_partition.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/ha_partition.cc 2024-08-03 07:29:58.000000000 +0000 @@ -398,6 +398,7 @@ m_start_key.length= 0; m_myisam= FALSE; m_innodb= FALSE; + m_myisammrg= FALSE; m_extra_cache= FALSE; m_extra_cache_size= 0; m_extra_prepare_for_update= FALSE; @@ -692,6 +693,7 @@ partition_element *part; DBUG_ENTER("ha_partition::create_partitioning_metadata"); + mark_trx_read_write(); /* We need to update total number of parts since we might write the handler file as part of a partition management command @@ -1677,10 +1679,10 @@ int ha_partition::prepare_new_partition(TABLE *tbl, HA_CREATE_INFO *create_info, handler *file, const char *part_name, - partition_element *p_elem, - uint disable_non_uniq_indexes) + partition_element *p_elem) { int error; + key_map keys_in_use= table->s->keys_in_use; DBUG_ENTER("prepare_new_partition"); /* @@ -1736,8 +1738,8 @@ goto error_external_lock; DBUG_PRINT("info", ("partition %s external locked", part_name)); - if (disable_non_uniq_indexes) - file->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); + if (!keys_in_use.is_prefix(table->s->keys)) + file->ha_disable_indexes(keys_in_use, true); DBUG_RETURN(0); error_external_lock: @@ -2033,13 +2035,6 @@ calls */ - /* - Before creating new partitions check whether indexes are disabled - in the partitions. - */ - - uint disable_non_uniq_indexes= indexes_are_disabled(); - i= 0; part_count= 0; part_it.rewind(); @@ -2081,8 +2076,7 @@ prepare_new_partition(table, create_info, new_file_array[part], (const char *)part_name_buff, - sub_elem, - disable_non_uniq_indexes)))) + sub_elem)))) { cleanup_new_partition(part_count); DBUG_RETURN(error); @@ -2108,8 +2102,7 @@ prepare_new_partition(table, create_info, new_file_array[i], (const char *)part_name_buff, - part_elem, - disable_non_uniq_indexes)))) + part_elem)))) { cleanup_new_partition(part_count); DBUG_RETURN(error); @@ -3040,6 +3033,10 @@ DBUG_PRINT("info", ("InnoDB")); m_innodb= TRUE; } + else if (ha_legacy_type(hton0) == DB_TYPE_MRG_MYISAM) + { + m_myisammrg= TRUE; + } DBUG_RETURN(FALSE); } @@ -3306,10 +3303,12 @@ goto err; if (state.st_size <= 64) goto err; + if ((ulonglong)state.st_size >= SIZE_T_MAX) /* Whole file need to fit into memory*/ + goto err; if (!(frm_image= (uchar*)my_malloc(key_memory_Partition_share, - state.st_size, MYF(MY_WME)))) + (size_t)state.st_size, MYF(MY_WME)))) goto err; - if (mysql_file_read(file, frm_image, state.st_size, MYF(MY_NABP))) + if (mysql_file_read(file, frm_image, (size_t)state.st_size, MYF(MY_NABP))) goto err; if (frm_image[64] != '/') @@ -3972,7 +3971,8 @@ m_part_info->part_expr->get_monotonicity_info(); else if (m_part_info->list_of_part_fields) m_part_func_monotonicity_info= MONOTONIC_STRICT_INCREASING; - info(HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_OPEN); + if ((error= info(HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_OPEN))) + goto err_handler; DBUG_RETURN(0); err_handler: @@ -4312,9 +4312,12 @@ (void) (*file)->ha_external_lock(thd, lock_type); } while (*(++file)); } - if (lock_type == F_WRLCK && m_part_info->part_expr) - m_part_info->part_expr->walk(&Item::register_field_in_read_map, 1, 0); - + if (lock_type == F_WRLCK) + { + if (m_part_info->part_expr) + m_part_info->part_expr->walk(&Item::register_field_in_read_map, 1, 0); + need_info_for_auto_inc(); + } DBUG_RETURN(0); err_handler: @@ -4628,33 +4631,8 @@ */ if (have_auto_increment) { - if (!table_share->next_number_keypart) - if (unlikely(error= update_next_auto_inc_val())) - goto exit; - - /* - If we have failed to set the auto-increment value for this row, - it is highly likely that we will not be able to insert it into - the correct partition. We must check and fail if necessary. - */ if (unlikely(error= update_auto_increment())) goto exit; - - /* - Don't allow generation of auto_increment value the partitions handler. - If a partitions handler would change the value, then it might not - match the partition any longer. - This can occur if 'SET INSERT_ID = 0; INSERT (NULL)', - So allow this by adding 'MODE_NO_AUTO_VALUE_ON_ZERO' to sql_mode. - The partitions handler::next_insert_id must always be 0. Otherwise - we need to forward release_auto_increment, or reset it for all - partitions. - */ - if (table->next_number_field->val_int() == 0) - { - table->auto_increment_field_not_null= TRUE; - thd->variables.sql_mode|= MODE_NO_AUTO_VALUE_ON_ZERO; - } } old_map= dbug_tmp_use_all_columns(table, &table->read_set); error= m_part_info->get_partition_id(m_part_info, &part_id, &func_value); @@ -8660,7 +8638,7 @@ file->stats.auto_increment_value); } while (*(++file_array)); - DBUG_ASSERT(auto_increment_value); + DBUG_ASSERT(!all_parts_opened || auto_increment_value); stats.auto_increment_value= auto_increment_value; if (all_parts_opened && auto_inc_is_first_in_idx) { @@ -9338,8 +9316,9 @@ switch (operation) { /* Category 1), used by most handlers */ case HA_EXTRA_NO_KEYREAD: - DBUG_RETURN(loop_partitions(end_keyread_cb, NULL)); + DBUG_RETURN(loop_read_partitions(end_keyread_cb, NULL)); case HA_EXTRA_KEYREAD: + DBUG_RETURN(loop_read_partitions(extra_cb, &operation)); case HA_EXTRA_FLUSH: case HA_EXTRA_PREPARE_FOR_FORCED_CLOSE: DBUG_RETURN(loop_partitions(extra_cb, &operation)); @@ -9448,9 +9427,14 @@ } /* Category 9) Operations only used by MERGE */ case HA_EXTRA_ADD_CHILDREN_LIST: + if (!m_myisammrg) + DBUG_RETURN(0); DBUG_RETURN(loop_partitions(extra_cb, &operation)); case HA_EXTRA_ATTACH_CHILDREN: { + if (!m_myisammrg) + DBUG_RETURN(0); + int result; uint num_locks; handler **file; @@ -9469,8 +9453,9 @@ break; } case HA_EXTRA_IS_ATTACHED_CHILDREN: - DBUG_RETURN(loop_partitions(extra_cb, &operation)); case HA_EXTRA_DETACH_CHILDREN: + if (!m_myisammrg) + DBUG_RETURN(0); DBUG_RETURN(loop_partitions(extra_cb, &operation)); case HA_EXTRA_MARK_AS_LOG_TABLE: /* @@ -9555,7 +9540,7 @@ switch (operation) { case HA_EXTRA_KEYREAD: - DBUG_RETURN(loop_partitions(start_keyread_cb, &arg)); + DBUG_RETURN(loop_read_partitions(start_keyread_cb, &arg)); case HA_EXTRA_CACHE: prepare_extra_cache(arg); DBUG_RETURN(0); @@ -9644,13 +9629,52 @@ int ha_partition::loop_partitions(handler_callback callback, void *param) { + int result= loop_partitions_over_map(&m_part_info->lock_partitions, + callback, param); + /* Add all used partitions to be called in reset(). */ + bitmap_union(&m_partitions_to_reset, &m_part_info->lock_partitions); + return result; +} + + +/* + Call callback(part, param) on read_partitions (the ones used by the query) +*/ + +int ha_partition::loop_read_partitions(handler_callback callback, void *param) +{ + /* + There is no need to record partitions on m_partitions_to_reset as + read_partitions were opened, etc - they will be reset anyway. + */ + return loop_partitions_over_map(&m_part_info->read_partitions, callback, + param); +} + + +/** + Call callback(part, param) on specified set of partitions + + @part_map The set of partitions to call callback for + @param callback a callback to call for each partition + @param param a void*-parameter passed to callback + + @return Operation status + @retval >0 Error code + @retval 0 Success +*/ + +int ha_partition::loop_partitions_over_map(const MY_BITMAP *part_map, + handler_callback callback, + void *param) +{ int result= 0, tmp; uint i; - DBUG_ENTER("ha_partition::loop_partitions"); + DBUG_ENTER("ha_partition::loop_partitions_over_map"); - for (i= bitmap_get_first_set(&m_part_info->lock_partitions); + for (i= bitmap_get_first_set(part_map); i < m_tot_parts; - i= bitmap_get_next_set(&m_part_info->lock_partitions, i)) + i= bitmap_get_next_set(part_map, i)) { /* This can be called after an error in ha_open. @@ -9660,8 +9684,6 @@ (tmp= callback(m_file[i], param))) result= tmp; } - /* Add all used partitions to be called in reset(). */ - bitmap_union(&m_partitions_to_reset, &m_part_info->lock_partitions); DBUG_RETURN(result); } @@ -10493,7 +10515,7 @@ m_tot_parts(tot_parts) {} - ~ha_partition_inplace_ctx() + ~ha_partition_inplace_ctx() override { if (handler_ctx_array) { @@ -10897,18 +10919,19 @@ bool ha_partition::need_info_for_auto_inc() { - handler **file= m_file; DBUG_ENTER("ha_partition::need_info_for_auto_inc"); - do + for (uint i= bitmap_get_first_set(&m_locked_partitions); + i < m_tot_parts; + i= bitmap_get_next_set(&m_locked_partitions, i)) { - if ((*file)->need_info_for_auto_inc()) + if ((m_file[i])->need_info_for_auto_inc()) { /* We have to get new auto_increment values from handler */ part_share->auto_inc_initialized= FALSE; DBUG_RETURN(TRUE); } - } while (*(++file)); + } DBUG_RETURN(FALSE); } @@ -11017,10 +11040,7 @@ else { THD *thd= ha_thd(); - /* - This is initialized in the beginning of the first write_row call. - */ - DBUG_ASSERT(part_share->auto_inc_initialized); + update_next_auto_inc_val(); /* Get a lock for handling the auto_increment in part_share for avoiding two concurrent statements getting the same number. @@ -11197,7 +11217,7 @@ != 0 Error */ -int ha_partition::disable_indexes(uint mode) +int ha_partition::disable_indexes(key_map map, bool persist) { handler **file; int error= 0; @@ -11205,7 +11225,7 @@ DBUG_ASSERT(bitmap_is_set_all(&(m_part_info->lock_partitions))); for (file= m_file; *file; file++) { - if (unlikely((error= (*file)->ha_disable_indexes(mode)))) + if (unlikely((error= (*file)->ha_disable_indexes(map, persist)))) break; } return error; @@ -11222,7 +11242,7 @@ != 0 Error */ -int ha_partition::enable_indexes(uint mode) +int ha_partition::enable_indexes(key_map map, bool persist) { handler **file; int error= 0; @@ -11230,7 +11250,7 @@ DBUG_ASSERT(bitmap_is_set_all(&(m_part_info->lock_partitions))); for (file= m_file; *file; file++) { - if (unlikely((error= (*file)->ha_enable_indexes(mode)))) + if (unlikely((error= (*file)->ha_enable_indexes(map, persist)))) break; } return error; diff -Nru mariadb-10.11.6/sql/ha_partition.h mariadb-10.11.9/sql/ha_partition.h --- mariadb-10.11.6/sql/ha_partition.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/ha_partition.h 2024-08-03 07:29:58.000000000 +0000 @@ -399,6 +399,7 @@ */ bool m_innodb; // Are all underlying handlers // InnoDB + bool m_myisammrg; // Are any of the handlers of type MERGE /* When calling extra(HA_EXTRA_CACHE) we do not pass this to the underlying handlers immediately. Instead we cache it and call the underlying @@ -577,8 +578,7 @@ void cleanup_new_partition(uint part_count); int prepare_new_partition(TABLE *table, HA_CREATE_INFO *create_info, handler *file, const char *part_name, - partition_element *p_elem, - uint disable_non_uniq_indexes); + partition_element *p_elem); /* delete_table and rename_table uses very similar logic which is packed into this routine. @@ -988,6 +988,10 @@ handler *file, uint *n); static const uint NO_CURRENT_PART_ID= NOT_A_PARTITION_ID; int loop_partitions(handler_callback callback, void *param); + int loop_partitions_over_map(const MY_BITMAP *map, + handler_callback callback, + void *param); + int loop_read_partitions(handler_callback callback, void *param); int loop_extra_alter(enum ha_extra_function operations); void late_extra_cache(uint partition_id); void late_extra_no_cache(uint partition_id); @@ -1408,9 +1412,8 @@ { ulonglong nr= (((Field_num*) field)->unsigned_flag || field->val_int() > 0) ? field->val_int() : 0; + update_next_auto_inc_val(); lock_auto_increment(); - DBUG_ASSERT(part_share->auto_inc_initialized || - !can_use_for_auto_inc_init()); /* must check when the mutex is taken */ if (nr >= part_share->next_auto_inc_val) part_share->next_auto_inc_val= nr + 1; @@ -1581,8 +1584,8 @@ Enable/Disable Indexes are only supported by HEAP and MyISAM. ------------------------------------------------------------------------- */ - int disable_indexes(uint mode) override; - int enable_indexes(uint mode) override; + int disable_indexes(key_map map, bool persist) override; + int enable_indexes(key_map map, bool persist) override; int indexes_are_disabled() override; /* diff -Nru mariadb-10.11.6/sql/ha_sequence.cc mariadb-10.11.9/sql/ha_sequence.cc --- mariadb-10.11.6/sql/ha_sequence.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/ha_sequence.cc 2024-08-03 07:29:58.000000000 +0000 @@ -271,13 +271,26 @@ } #ifdef WITH_WSREP - /* We need to start Galera transaction for select NEXT VALUE FOR - sequence if it is not yet started. Note that ALTER is handled - as TOI. */ - if (WSREP_ON && WSREP(thd) && - !thd->wsrep_trx().active() && - wsrep_thd_is_local(thd)) - wsrep_start_transaction(thd, thd->wsrep_next_trx_id()); + if (WSREP_ON && WSREP(thd) && wsrep_thd_is_local(thd)) + { + if (sequence_locked && + (wsrep_thd_is_SR(thd) || wsrep_streaming_enabled(thd))) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "SEQUENCEs with streaming replication in Galera cluster"); + DBUG_RETURN(HA_ERR_UNSUPPORTED); + } + + /* + We need to start Galera transaction for select NEXT VALUE FOR + sequence if it is not yet started. Note that ALTER is handled + as TOI. + */ + if (!thd->wsrep_trx().active()) + { + wsrep_start_transaction(thd, thd->wsrep_next_trx_id()); + } + } #endif if (likely(!(error= file->update_first_row(buf)))) diff -Nru mariadb-10.11.6/sql/ha_sequence.h mariadb-10.11.9/sql/ha_sequence.h --- mariadb-10.11.6/sql/ha_sequence.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/ha_sequence.h 2024-08-03 07:29:58.000000000 +0000 @@ -67,44 +67,44 @@ ~ha_sequence(); /* virtual function that are re-implemented for sequence */ - int open(const char *name, int mode, uint test_if_locked); + int open(const char *name, int mode, uint test_if_locked) override; int create(const char *name, TABLE *form, - HA_CREATE_INFO *create_info); - handler *clone(const char *name, MEM_ROOT *mem_root); - int write_row(const uchar *buf); - Table_flags table_flags() const; + HA_CREATE_INFO *create_info) override; + handler *clone(const char *name, MEM_ROOT *mem_root) override; + int write_row(const uchar *buf) override; + Table_flags table_flags() const override; /* One can't update or delete from sequence engine */ - int update_row(const uchar *old_data, const uchar *new_data) + int update_row(const uchar *old_data, const uchar *new_data) override { return HA_ERR_WRONG_COMMAND; } - int delete_row(const uchar *buf) + int delete_row(const uchar *buf) override { return HA_ERR_WRONG_COMMAND; } /* One can't delete from sequence engine */ - int truncate() + int truncate() override { return HA_ERR_WRONG_COMMAND; } /* Can't use query cache */ - uint8 table_cache_type() + uint8 table_cache_type() override { return HA_CACHE_TBL_NOCACHE; } - void print_error(int error, myf errflag); - int info(uint); - LEX_CSTRING *engine_name() { return hton_name(file->ht); } - int external_lock(THD *thd, int lock_type); - int extra(enum ha_extra_function operation); + void print_error(int error, myf errflag) override; + int info(uint) override; + LEX_CSTRING *engine_name() override { return hton_name(file->ht); } + int external_lock(THD *thd, int lock_type) override; + int extra(enum ha_extra_function operation) override; /* For ALTER ONLINE TABLE */ bool check_if_incompatible_data(HA_CREATE_INFO *create_info, - uint table_changes); + uint table_changes) override; void write_lock() { write_locked= 1;} void unlock() { write_locked= 0; } bool is_locked() { return write_locked; } /* Functions that are directly mapped to the underlying handler */ - int rnd_init(bool scan) + int rnd_init(bool scan) override { return file->rnd_init(scan); } /* We need to have a lock here to protect engines like MyISAM from simultaneous read and write. For sequence's this is not critical as this function is used extremely seldom. */ - int rnd_next(uchar *buf) + int rnd_next(uchar *buf) override { int error; table->s->sequence->read_lock(table); @@ -112,9 +112,9 @@ table->s->sequence->read_unlock(table); return error; } - int rnd_end() + int rnd_end() override { return file->rnd_end(); } - int rnd_pos(uchar *buf, uchar *pos) + int rnd_pos(uchar *buf, uchar *pos) override { int error; table->s->sequence->read_lock(table); @@ -122,37 +122,37 @@ table->s->sequence->read_unlock(table); return error; } - void position(const uchar *record) + void position(const uchar *record) override { return file->position(record); } - const char *table_type() const + const char *table_type() const override { return file->table_type(); } - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return file->index_flags(inx, part, all_parts); } THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type) + enum thr_lock_type lock_type) override { return file->store_lock(thd, to, lock_type); } - int close(void) + int close(void) override { return file->close(); } const char **bas_ext() const { return file->bas_ext(); } - int delete_table(const char*name) + int delete_table(const char*name) override { return file->delete_table(name); } - int rename_table(const char *from, const char *to) + int rename_table(const char *from, const char *to) override { return file->rename_table(from, to); } - void unbind_psi() + void unbind_psi() override { file->unbind_psi(); } - void rebind_psi() + void rebind_psi() override { file->rebind_psi(); } - bool auto_repair(int error) const + bool auto_repair(int error) const override { return file->auto_repair(error); } - int repair(THD* thd, HA_CHECK_OPT* check_opt) + int repair(THD* thd, HA_CHECK_OPT* check_opt) override { return file->repair(thd, check_opt); } - bool check_and_repair(THD *thd) + bool check_and_repair(THD *thd) override { return file->check_and_repair(thd); } - bool is_crashed() const + bool is_crashed() const override { return file->is_crashed(); } - void column_bitmaps_signal() + void column_bitmaps_signal() override { return file->column_bitmaps_signal(); } /* New methods */ diff -Nru mariadb-10.11.6/sql/handler.cc mariadb-10.11.9/sql/handler.cc --- mariadb-10.11.6/sql/handler.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/handler.cc 2024-08-03 07:29:58.000000000 +0000 @@ -169,7 +169,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { *cond_hdl= NULL; if (non_existing_table_error(sql_errno)) @@ -298,20 +298,29 @@ } +/* + Resolve the storage engine by name. + + Succeed if the storage engine is found and initialised. Otherwise + fail if the sql mode contains NO_ENGINE_SUBSTITUTION. +*/ bool Storage_engine_name::resolve_storage_engine_with_error(THD *thd, handlerton **ha, bool tmp_table) { - if (plugin_ref plugin= ha_resolve_by_name(thd, &m_storage_engine_name, - tmp_table)) + plugin_ref plugin; + if ((plugin= ha_resolve_by_name(thd, &m_storage_engine_name, tmp_table)) && + (plugin_ref_to_int(plugin)->state == PLUGIN_IS_READY)) { *ha= plugin_hton(plugin); return false; } *ha= NULL; - if (thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION) + if ((thd_sql_command(thd) != SQLCOM_CREATE_TABLE && + thd_sql_command(thd) != SQLCOM_ALTER_TABLE) || + thd->variables.sql_mode & MODE_NO_ENGINE_SUBSTITUTION) { my_error(ER_UNKNOWN_STORAGE_ENGINE, MYF(0), m_storage_engine_name.str); return true; @@ -619,7 +628,7 @@ const char *hton_no_exts[]= { 0 }; - +static bool ddl_recovery_done= false; int ha_initialize_handlerton(st_plugin_int *plugin) { @@ -645,13 +654,6 @@ hton->slot= HA_SLOT_UNDEF; /* Historical Requirement */ plugin->data= hton; // shortcut for the future - /* [remove after merge] notes on merge conflict (MDEV-31400): - 10.6-10.11: 13ba00ff4933cfc1712676f323587504e453d1b5 - 11.0-11.2: 42f8be10f18163c4025710cf6a212e82bddb2f62 - The 10.11->11.0 conflict is trivial, but the reference commit also - contains different non-conflict changes needs to be applied to 11.0 - (and beyond). - */ if (plugin->plugin->init && (ret= plugin->plugin->init(hton))) goto err; @@ -769,6 +771,9 @@ resolve_sysvar_table_options(hton); update_discovery_counters(hton, 1); + if (ddl_recovery_done && hton->signal_ddl_recovery_done) + hton->signal_ddl_recovery_done(hton); + DBUG_RETURN(ret); err_deinit: @@ -955,7 +960,8 @@ { handlerton *hton= plugin_hton(plugin); if (hton->signal_ddl_recovery_done) - (hton->signal_ddl_recovery_done)(hton); + if ((hton->signal_ddl_recovery_done)(hton)) + plugin_ref_to_int(plugin)->state= PLUGIN_IS_DELETED; return 0; } @@ -965,6 +971,7 @@ DBUG_ENTER("ha_signal_ddl_recovery_done"); plugin_foreach(NULL, signal_ddl_recovery_done, MYSQL_STORAGE_ENGINE_PLUGIN, NULL); + ddl_recovery_done= true; DBUG_VOID_RETURN; } @@ -1508,6 +1515,22 @@ error=1; } } + else if (thd->rgi_slave) + { + /* + Slave threads will always process XA COMMITs in the binlog handler (see + MDEV-25616 and MDEV-30423), so if this is a slave thread preparing a + transaction which proved empty during replication (e.g. because of + replication filters) then mark it as XA_ROLLBACK_ONLY so the follow up + XA COMMIT will know to roll it back, rather than try to commit and binlog + a standalone XA COMMIT (without its preceding XA START - XA PREPARE). + + If the xid_cache is cleared before the completion event comes, before + issuing ER_XAER_NOTA, first check if the event targets an ignored + database, and ignore the error if so. + */ + thd->transaction->xid_state.set_rollback_only(); + } DBUG_RETURN(error); } @@ -1612,6 +1635,29 @@ return rw_ha_count; } +#ifdef WITH_WSREP +/** + Check if transaction contains storage engine not supporting + two-phase commit and transaction is read-write. + + @retval + true Transaction contains storage engine not supporting + two phase commit and transaction is read-write + @retval + false otherwise +*/ +static bool wsrep_have_no2pc_rw_ha(Ha_trx_info* ha_list) +{ + for (Ha_trx_info *ha_info=ha_list; ha_info; ha_info= ha_info->next()) + { + handlerton *ht= ha_info->ht(); + // Transaction is read-write and handler does not support 2pc + if (ha_info->is_trx_read_write() && ht->prepare==0) + return true; + } + return false; +} +#endif /* WITH_WSREP */ /** @retval @@ -1824,17 +1870,26 @@ */ if (run_wsrep_hooks) { - // This commit involves more than one storage engine and requires - // two phases, but some engines don't support it. - // Issue a message to the client and roll back the transaction. - if (trans->no_2pc && rw_ha_count > 1) + // This commit involves storage engines that do not support two phases. + // We allow read only transactions to such storage engines but not + // read write transactions. + if (trans->no_2pc && rw_ha_count > 1 && wsrep_have_no2pc_rw_ha(trans->ha_list)) { - my_message(ER_ERROR_DURING_COMMIT, "Transactional commit not supported " - "by involved engine(s)", MYF(0)); - error= 1; + // This commit involves more than one storage engine and requires + // two phases, but some engines don't support it. + // Issue a message to the client and roll back the transaction. + + // REPLACE|INSERT INTO ... SELECT uses TOI for MyISAM|Aria + if (WSREP(thd) && thd->wsrep_cs().mode() != wsrep::client_state::m_toi) + { + my_message(ER_ERROR_DURING_COMMIT, "Transactional commit not supported " + "by involved engine(s)", MYF(0)); + error= 1; + } } - else - error= wsrep_before_commit(thd, all); + + if (!error) + error= wsrep_before_commit(thd, all); } if (error) { @@ -2207,8 +2262,12 @@ } #ifdef WITH_WSREP - (void) wsrep_before_rollback(thd, all); + // REPLACE|INSERT INTO ... SELECT uses TOI in consistency check + if (thd->wsrep_consistency_check != CONSISTENCY_CHECK_RUNNING) + if (thd->wsrep_cs().mode() != wsrep::client_state::m_toi) + (void) wsrep_before_rollback(thd, all); #endif /* WITH_WSREP */ + if (ha_info) { /* Close all cursors that can not survive ROLLBACK */ @@ -2245,7 +2304,11 @@ thd->thread_id, all?"TRUE":"FALSE", wsrep_thd_query(thd), thd->get_stmt_da()->message(), is_real_trans); } - (void) wsrep_after_rollback(thd, all); + + // REPLACE|INSERT INTO ... SELECT uses TOI in consistency check + if (thd->wsrep_consistency_check != CONSISTENCY_CHECK_RUNNING) + if (thd->wsrep_cs().mode() != wsrep::client_state::m_toi) + (void) wsrep_after_rollback(thd, all); #endif /* WITH_WSREP */ if (all || !thd->in_active_multi_stmt_transaction()) @@ -3371,6 +3434,17 @@ DBUG_ASSERT(alloc_root_inited(&table->mem_root)); set_partitions_to_open(partitions_to_open); + internal_tmp_table= MY_TEST(test_if_locked & HA_OPEN_INTERNAL_TABLE); + + if (!internal_tmp_table && (test_if_locked & HA_OPEN_TMP_TABLE) && + current_thd->slave_thread) + { + /* + This is a temporary table used by replication that is not attached + to a THD. Mark it as a global temporary table. + */ + test_if_locked|= HA_OPEN_GLOBAL_TMP_TABLE; + } if (unlikely((error=open(name,mode,test_if_locked)))) { @@ -3416,7 +3490,6 @@ cached_table_flags= table_flags(); } reset_statistics(); - internal_tmp_table= MY_TEST(test_if_locked & HA_OPEN_INTERNAL_TABLE); DBUG_RETURN(error); } @@ -4651,7 +4724,7 @@ if (error < HA_ERR_FIRST && bas_ext()[0]) { char buff[FN_REFLEN]; - strxnmov(buff, sizeof(buff), + strxnmov(buff, sizeof(buff)-1, table_share->normalized_path.str, bas_ext()[0], NULL); my_error(textno, errflag, buff, error); } @@ -4749,7 +4822,8 @@ KEY *keyinfo, *keyend; KEY_PART_INFO *keypart, *keypartend; - if (table->s->incompatible_version) + if (table->s->incompatible_version || + check_old_types()) return HA_ADMIN_NEEDS_ALTER; if (!table->s->mysql_version) @@ -4775,6 +4849,12 @@ } } } + + /* + True VARCHAR appeared in MySQL-5.0.3. + If the FRM is older than 5.0.3, force alter even if the check_old_type() + call above did not find data types that want upgrade. + */ if (table->s->frm_version < FRM_VER_TRUE_VARCHAR) return HA_ADMIN_NEEDS_ALTER; @@ -4788,26 +4868,15 @@ } -int handler::check_old_types() +bool handler::check_old_types() const { - Field** field; - - if (!table->s->mysql_version) + for (Field **field= table->field; (*field); field++) { - /* check for bad DECIMAL field */ - for (field= table->field; (*field); field++) - { - if ((*field)->type() == MYSQL_TYPE_NEWDECIMAL) - { - return HA_ADMIN_NEEDS_ALTER; - } - if ((*field)->type() == MYSQL_TYPE_VAR_STRING) - { - return HA_ADMIN_NEEDS_ALTER; - } - } + const Type_handler *th= (*field)->type_handler(); + if (th != th->type_handler_for_implicit_upgrade()) + return true; } - return 0; + return false; } @@ -4875,6 +4944,12 @@ DBUG_RETURN(errkey); } +bool handler::has_dup_ref() const +{ + DBUG_ASSERT(lookup_errkey != (uint)-1 || errkey != (uint)-1); + return ha_table_flags() & HA_DUPLICATE_POS || lookup_errkey != (uint)-1; +} + /** Delete all files with extension from bas_ext(). @@ -5008,8 +5083,6 @@ if (table->s->mysql_version < MYSQL_VERSION_ID) { - if (unlikely((error= check_old_types()))) - return error; error= ha_check_for_upgrade(check_opt); if (unlikely(error && (error != HA_ADMIN_NEEDS_CHECK))) return error; @@ -5019,7 +5092,7 @@ if (unlikely((error= check(thd, check_opt)))) return error; /* Skip updating frm version if not main handler. */ - if (table->file != this) + if (table->file != this || opt_readonly) return error; return update_frm_version(table); } @@ -5068,7 +5141,7 @@ DBUG_ASSERT(result == HA_ADMIN_NOT_IMPLEMENTED || ha_table_flags() & HA_CAN_REPAIR); - if (result == HA_ADMIN_OK) + if (result == HA_ADMIN_OK && !opt_readonly) result= update_frm_version(table); return result; } @@ -5210,34 +5283,48 @@ /** Disable indexes: public interface. + @param map has 0 for all indexes that should be disabled + @param persist indexes should stay disabled after server restart + + Currently engines don't support disabling an arbitrary subset of indexes. + + In particular, if the change is persistent: + * auto-increment index should not be disabled + * unique indexes should not be disabled + + if unique or auto-increment indexes are disabled (non-persistently), + the caller should only insert data that does not require + auto-inc generation and does not violate uniqueness + @sa handler::disable_indexes() */ int -handler::ha_disable_indexes(uint mode) +handler::ha_disable_indexes(key_map map, bool persist) { - DBUG_ASSERT(table_share->tmp_table != NO_TMP_TABLE || - m_lock_type != F_UNLCK); + DBUG_ASSERT(table->s->tmp_table != NO_TMP_TABLE || m_lock_type != F_UNLCK); mark_trx_read_write(); - return disable_indexes(mode); + return disable_indexes(map, persist); } /** Enable indexes: public interface. + @param map has 1 for all indexes that should be enabled + @param persist indexes should stay enabled after server restart + @sa handler::enable_indexes() */ int -handler::ha_enable_indexes(uint mode) +handler::ha_enable_indexes(key_map map, bool persist) { - DBUG_ASSERT(table_share->tmp_table != NO_TMP_TABLE || - m_lock_type != F_UNLCK); + DBUG_ASSERT(table->s->tmp_table != NO_TMP_TABLE || m_lock_type != F_UNLCK); mark_trx_read_write(); - return enable_indexes(mode); + return enable_indexes(map, persist); } @@ -5513,6 +5600,9 @@ { DBUG_ASSERT(m_lock_type == F_UNLCK); mark_trx_read_write(); + if ((info_arg->options & HA_LEX_CREATE_TMP_TABLE) && + current_thd->slave_thread) + info_arg->options|= HA_LEX_CREATE_GLOBAL_TMP_TABLE; int error= create(name, form, info_arg); if (!error && !(info_arg->options & (HA_LEX_CREATE_TMP_TABLE | HA_CREATE_TMP_ALTER))) @@ -5540,8 +5630,6 @@ DBUG_ASSERT(m_lock_type == F_UNLCK || (!old_name && strcmp(name, table_share->path.str))); - - mark_trx_read_write(); return create_partitioning_metadata(name, old_name, action_flag); } @@ -6002,7 +6090,7 @@ void st_ha_check_opt::init() { - flags= sql_flags= 0; + flags= sql_flags= handler_flags= 0; start_time= my_time(0); } @@ -7331,11 +7419,8 @@ if (error == HA_ERR_FOUND_DUPP_KEY) { table->file->lookup_errkey= key_no; - if (ha_table_flags() & HA_DUPLICATE_POS) - { - lookup_handler->position(table->record[0]); - memcpy(table->file->dup_ref, lookup_handler->ref, ref_length); - } + lookup_handler->position(table->record[0]); + memcpy(table->file->dup_ref, lookup_handler->ref, ref_length); } restore_record(table, file->lookup_buffer); table->restore_blob_values(blob_storage); @@ -7414,7 +7499,7 @@ So also check for that too */ if((field->is_null(0) != field->is_null(reclength)) || - field->cmp_binary_offset(reclength)) + field->cmp_offset(reclength)) { if((error= check_duplicate_long_entry_key(new_rec, i))) return error; @@ -7623,7 +7708,16 @@ m_lock_type == F_WRLCK); DBUG_ENTER("handler::ha_write_row"); DEBUG_SYNC_C("ha_write_row_start"); - +#ifdef WITH_WSREP + DBUG_EXECUTE_IF("wsrep_ha_write_row", + { + const char act[]= + "now " + "SIGNAL wsrep_ha_write_row_reached " + "WAIT_FOR wsrep_ha_write_row_continue"; + DBUG_ASSERT(!debug_sync_set_action(ha_thd(), STRING_WITH_LEN(act))); + }); +#endif /* WITH_WSREP */ if ((error= ha_check_overlaps(NULL, buf))) DBUG_RETURN(error); @@ -7642,7 +7736,12 @@ { DBUG_ASSERT(inited == NONE || lookup_handler != this); if ((error= check_duplicate_long_entries(buf))) + { + if (table->next_number_field && buf == table->record[0]) + if (int err= update_auto_increment()) + error= err; DBUG_RETURN(error); + } } MYSQL_INSERT_ROW_START(table_share->db.str, table_share->table_name.str); @@ -7801,7 +7900,9 @@ } #ifdef WITH_WSREP THD *thd= ha_thd(); - if (WSREP_NNULL(thd)) + /* For streaming replication, when removing fragments, don't call + wsrep_after_row() as that would initiate new streaming transaction */ + if (WSREP_NNULL(thd) && !thd->wsrep_ignore_table) { /* for streaming replication, the following wsrep_after_row() may replicate a fragment, so we have to declare potential PA diff -Nru mariadb-10.11.6/sql/handler.h mariadb-10.11.9/sql/handler.h --- mariadb-10.11.6/sql/handler.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/handler.h 2024-08-03 07:29:58.000000000 +0000 @@ -451,12 +451,6 @@ #define HA_FAST_CHANGE_PARTITION (1UL << 13) #define HA_PARTITION_ONE_PHASE (1UL << 14) -/* operations for disable/enable indexes */ -#define HA_KEY_SWITCH_NONUNIQ 0 -#define HA_KEY_SWITCH_ALL 1 -#define HA_KEY_SWITCH_NONUNIQ_SAVE 2 -#define HA_KEY_SWITCH_ALL_SAVE 3 - /* Note: the following includes binlog and closing 0. TODO remove the limit, use dynarrays @@ -495,6 +489,12 @@ #define HA_LEX_CREATE_SEQUENCE 16U #define HA_VERSIONED_TABLE 32U #define HA_SKIP_KEY_SORT 64U +/* + A temporary table that can be used by different threads, eg. replication + threads. This flag ensure that memory is not allocated with THREAD_SPECIFIC, + as we do for other temporary tables. +*/ +#define HA_LEX_CREATE_GLOBAL_TMP_TABLE 128U #define HA_MAX_REC_LENGTH 65535 @@ -1495,7 +1495,7 @@ const LEX_CUSTRING *version, ulonglong create_id); /* Called for all storage handlers after ddl recovery is done */ - void (*signal_ddl_recovery_done)(handlerton *hton); + int (*signal_ddl_recovery_done)(handlerton *hton); /* Optional clauses in the CREATE/ALTER TABLE @@ -2673,6 +2673,7 @@ st_ha_check_opt() = default; /* Remove gcc warning */ uint flags; /* isam layer flags (e.g. for myisamchk) */ uint sql_flags; /* sql layer flags - for something myisamchk cannot do */ + uint handler_flags; /* Reserved for handler usage */ time_t start_time; /* When check/repair starts */ KEY_CACHE *key_cache; /* new key cache when changing key cache */ void init(); @@ -3360,6 +3361,7 @@ ("handler created F_UNLCK %d F_RDLCK %d F_WRLCK %d", F_UNLCK, F_RDLCK, F_WRLCK)); reset_statistics(); + active_handler_stats.active= 0; } virtual ~handler(void) { @@ -3500,8 +3502,8 @@ int ha_optimize(THD* thd, HA_CHECK_OPT* check_opt); int ha_analyze(THD* thd, HA_CHECK_OPT* check_opt); bool ha_check_and_repair(THD *thd); - int ha_disable_indexes(uint mode); - int ha_enable_indexes(uint mode); + int ha_disable_indexes(key_map map, bool persist); + int ha_enable_indexes(key_map map, bool persist); int ha_discard_or_import_tablespace(my_bool discard); int ha_rename_table(const char *from, const char *to); void ha_drop_table(const char *name); @@ -3525,6 +3527,7 @@ virtual void print_error(int error, myf errflag); virtual bool get_error_message(int error, String *buf); uint get_dup_key(int error); + bool has_dup_ref() const; /** Retrieves the names of the table and the key for which there was a duplicate entry in the case of HA_ERR_FOREIGN_DUPLICATE_KEY. @@ -4092,7 +4095,6 @@ } virtual void update_create_info(HA_CREATE_INFO *create_info) {} - int check_old_types(); virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT* check_opt) { return HA_ADMIN_NOT_IMPLEMENTED; } virtual int preload_keys(THD* thd, HA_CHECK_OPT* check_opt) @@ -4783,9 +4785,12 @@ } inline void ha_handler_stats_disable() { - handler_stats= 0; - active_handler_stats.active= 0; - handler_stats_updated(); + if (handler_stats) + { + handler_stats= 0; + active_handler_stats.active= 0; + handler_stats_updated(); + } } private: @@ -4800,6 +4805,7 @@ } private: + bool check_old_types() const; void mark_trx_read_write_internal(); bool check_table_binlog_row_based_internal(); @@ -5039,8 +5045,8 @@ virtual int analyze(THD* thd, HA_CHECK_OPT* check_opt) { return HA_ADMIN_NOT_IMPLEMENTED; } virtual bool check_and_repair(THD *thd) { return TRUE; } - virtual int disable_indexes(uint mode) { return HA_ERR_WRONG_COMMAND; } - virtual int enable_indexes(uint mode) { return HA_ERR_WRONG_COMMAND; } + virtual int disable_indexes(key_map map, bool persist) { return HA_ERR_WRONG_COMMAND; } + virtual int enable_indexes(key_map map, bool persist) { return HA_ERR_WRONG_COMMAND; } virtual int discard_or_import_tablespace(my_bool discard) { return (my_errno=HA_ERR_WRONG_COMMAND); } virtual void drop_table(const char *name); @@ -5250,8 +5256,8 @@ : thd(thd_arg), wild(NULL), with_temps(true), tables(tables_arg) {} ~Discovered_table_list() = default; - bool add_table(const char *tname, size_t tlen); - bool add_file(const char *fname); + bool add_table(const char *tname, size_t tlen) override; + bool add_file(const char *fname) override; void sort(); void remove_duplicates(); // assumes that the list is sorted diff -Nru mariadb-10.11.6/sql/hostname.cc mariadb-10.11.9/sql/hostname.cc --- mariadb-10.11.6/sql/hostname.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/hostname.cc 2024-08-03 07:29:58.000000000 +0000 @@ -514,42 +514,48 @@ DBUG_EXECUTE_IF("getnameinfo_error_noname", { - strcpy(hostname_buffer, ""); + safe_strcpy(hostname_buffer, sizeof(hostname_buffer), + ""); err_code= EAI_NONAME; } ); DBUG_EXECUTE_IF("getnameinfo_error_again", { - strcpy(hostname_buffer, ""); + safe_strcpy(hostname_buffer, sizeof(hostname_buffer), + ""); err_code= EAI_AGAIN; } ); DBUG_EXECUTE_IF("getnameinfo_fake_ipv4", { - strcpy(hostname_buffer, "santa.claus.ipv4.example.com"); + safe_strcpy(hostname_buffer, sizeof(hostname_buffer), + "santa.claus.ipv4.example.com"); err_code= 0; } ); DBUG_EXECUTE_IF("getnameinfo_fake_ipv6", { - strcpy(hostname_buffer, "santa.claus.ipv6.example.com"); + safe_strcpy(hostname_buffer, sizeof(hostname_buffer), + "santa.claus.ipv6.example.com"); err_code= 0; } ); DBUG_EXECUTE_IF("getnameinfo_format_ipv4", { - strcpy(hostname_buffer, "12.12.12.12"); + safe_strcpy(hostname_buffer, sizeof(hostname_buffer), + "12.12.12.12"); err_code= 0; } ); DBUG_EXECUTE_IF("getnameinfo_format_ipv6", { - strcpy(hostname_buffer, "12:DEAD:BEEF:0"); + safe_strcpy(hostname_buffer, sizeof(hostname_buffer), + "12:DEAD:BEEF:0"); err_code= 0; } ); diff -Nru mariadb-10.11.6/sql/item.cc mariadb-10.11.9/sql/item.cc --- mariadb-10.11.6/sql/item.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item.cc 2024-08-03 07:29:58.000000000 +0000 @@ -27,6 +27,7 @@ #include "sp_rcontext.h" #include "sp_head.h" #include "sql_trigger.h" +#include "sql_parse.h" #include "sql_select.h" #include "sql_show.h" // append_identifier #include "sql_view.h" // VIEW_ANY_SQL @@ -494,7 +495,10 @@ bool need_parens= precedence() < parent_prec; if (need_parens) str->append('('); - print(str, query_type); + if (check_stack_overrun(current_thd, STACK_MIN_SIZE, NULL)) + str->append(STRING_WITH_LEN("")); + else + print(str, query_type); if (need_parens) str->append(')'); } @@ -1280,6 +1284,25 @@ } +Item *Item::multiple_equality_transformer(THD *thd, uchar *arg) +{ + if (const_item()) + { + /* + Mark constant item in the condition with the MARKER_IMMUTABLE flag. + It is needed to prevent cleanup of the sub-items of this item and following + fix_fields() call that can cause a crash on this step of the optimization. + This flag will be removed at the end of the pushdown optimization by + remove_immutable_flag_processor processor. + */ + int new_flag= MARKER_IMMUTABLE; + this->walk(&Item::set_extraction_flag_processor, false, + (void*)&new_flag); + } + return this; +} + + Item *Item::safe_charset_converter(THD *thd, CHARSET_INFO *tocs) { if (!needs_charset_converter(tocs)) @@ -2180,6 +2203,37 @@ my_error(ER_RESERVED_SYNTAX, MYF(0), "NAME_CONST"); return TRUE; } + + /* + If we have either of the following: + ... WHERE foo=NAME_CONST(...) + ... JOIN ... ON foo=NAME_CONST(...) + then we have an opportunity to unwrap the NAME_CONST and + use the enclosed value directly, replacing NAME_CONST in + the parse tree with the value it encloses. + */ + if ((thd->where == THD_WHERE::WHERE_CLAUSE || + thd->where == THD_WHERE::ON_CLAUSE) && + (value_item->type() == CONST_ITEM || + value_item->type() == FUNC_ITEM) && + !thd->lex->is_ps_or_view_context_analysis()) + { + thd->change_item_tree(ref, value_item); + + /* + We're replacing NAME_CONST('name', value_item) with value_item. + Only a few constants and functions are possible as value_item, see + Create_func_name_const::create_2_arg. + Set the value_item's coercibility to be the same as NAME_CONST(...) + would have (see how it's set a few lines below). + */ + if (value_item->collation.derivation != DERIVATION_NUMERIC) + value_item->collation.set(value_item->collation.collation, + DERIVATION_IMPLICIT); + return FALSE; + } + // else, could not unwrap, fall back to default handling below. + if (value_item->collation.derivation == DERIVATION_NUMERIC) collation= DTCollation_numeric(); else @@ -2674,7 +2728,11 @@ if (conv->fix_fields_if_needed(thd, arg)) return TRUE; - if (!thd->stmt_arena->is_conventional()) + if (!thd->stmt_arena->is_conventional() && + ((!thd->lex->current_select && + (thd->stmt_arena->is_stmt_prepare_or_first_sp_execute() || + thd->stmt_arena->is_stmt_prepare_or_first_stmt_execute())) || + thd->lex->current_select->first_cond_optimization)) { Query_arena *arena, backup; arena= thd->activate_stmt_arena_if_needed(&backup); @@ -2715,7 +2773,7 @@ @retval 0 on a failure */ -Item* Item_func_or_sum::build_clone(THD *thd) +Item* Item_func_or_sum::do_build_clone(THD *thd) const { Item *copy_tmp_args[2]= {0,0}; Item **copy_args= copy_tmp_args; @@ -2798,11 +2856,11 @@ quoted `pkg` and `func` separately, so the entire result looks like: `db`.`pkg`.`func` */ - Database_qualified_name tmp= Database_qualified_name::split(m_name->m_name); - DBUG_ASSERT(tmp.m_db.length); - append_identifier(thd, &qname, &tmp.m_db); + Identifier_chain2 tmp= Identifier_chain2::split(m_name->m_name); + DBUG_ASSERT(tmp[0].length); + append_identifier(thd, &qname, &tmp[0]); qname.append('.'); - append_identifier(thd, &qname, &tmp.m_name); + append_identifier(thd, &qname, &tmp[1]); } else append_identifier(thd, &qname, &m_name->m_name); @@ -3035,7 +3093,7 @@ 0 if an error occurred */ -Item* Item_ref::build_clone(THD *thd) +Item* Item_ref::do_build_clone(THD *thd) const { Item_ref *copy= (Item_ref *) get_copy(thd); if (unlikely(!copy) || @@ -3864,7 +3922,7 @@ } -Item *Item_decimal::clone_item(THD *thd) +Item *Item_decimal::clone_item(THD *thd) const { return new (thd->mem_root) Item_decimal(thd, name.str, &decimal_value, decimals, max_length); @@ -3885,7 +3943,7 @@ } -Item *Item_float::clone_item(THD *thd) +Item *Item_float::clone_item(THD *thd) const { return new (thd->mem_root) Item_float(thd, name.str, value, decimals, max_length); @@ -4049,7 +4107,7 @@ return this; } -Item *Item_null::clone_item(THD *thd) +Item *Item_null::clone_item(THD *thd) const { return new (thd->mem_root) Item_null(thd, name.str); } @@ -4099,7 +4157,9 @@ as an actual parameter. See Item_param::set_from_item(). */ m_is_settable_routine_parameter(true), - m_clones(thd->mem_root) + m_clones(thd->mem_root), + m_associated_field(nullptr), + m_default_field(nullptr) { name= *name_arg; /* @@ -4109,6 +4169,7 @@ */ set_maybe_null(); with_flags= with_flags | item_with_t::PARAM; + collation= DTCollation(&my_charset_bin, DERIVATION_IGNORABLE); } @@ -4164,7 +4225,7 @@ } -void Item_param::set_null() +void Item_param::set_null(const DTCollation &c) { DBUG_ENTER("Item_param::set_null"); /* @@ -4179,6 +4240,7 @@ */ max_length= 0; decimals= 0; + collation= c; state= NULL_VALUE; DBUG_VOID_RETURN; } @@ -4437,7 +4499,7 @@ longlong val= item->val_int(); if (item->null_value) { - set_null(); + set_null(DTCollation_numeric()); DBUG_RETURN(false); } else @@ -4455,7 +4517,7 @@ DBUG_RETURN(set_value(thd, item, &tmp, h)); } else - set_null(); + set_null_string(item->collation); DBUG_RETURN(0); } @@ -4506,10 +4568,29 @@ case NULL_VALUE: return set_field_to_null_with_conversions(field, no_conversions); case DEFAULT_VALUE: + if (m_associated_field) + return assign_default(field); return field->save_in_field_default_value(field->table->pos_in_table_list-> top_table() != field->table->pos_in_table_list); case IGNORE_VALUE: + if (m_associated_field) + { + switch (find_ignore_reaction(field->table->in_use)) + { + case IGNORE_MEANS_DEFAULT: + DBUG_ASSERT(0); // impossible now, but fully working code if needed + return assign_default(field); + case IGNORE_MEANS_FIELD_VALUE: + m_associated_field->save_val(field); + return false; + default: + ; // fall through to error + } + DBUG_ASSERT(0); //impossible + my_error(ER_INVALID_DEFAULT_PARAM, MYF(0)); + return true; + } return field->save_in_field_ignore_value(field->table->pos_in_table_list-> top_table() != field->table->pos_in_table_list); @@ -4850,7 +4931,7 @@ } -Item *Item_param::value_clone_item(THD *thd) +Item *Item_param::value_clone_item(THD *thd) const { MEM_ROOT *mem_root= thd->mem_root; switch (value.type_handler()->cmp_type()) { @@ -4864,12 +4945,15 @@ case DECIMAL_RESULT: return 0; // Should create Item_decimal. See MDEV-11361. case STRING_RESULT: + { + String value_copy = value.m_string; // to preserve constness of the func return new (mem_root) Item_string(thd, name, - Lex_cstring(value.m_string.ptr(), - value.m_string.length()), - value.m_string.charset(), + Lex_cstring(value_copy.ptr(), + value_copy.length()), + value_copy.charset(), collation.derivation, collation.repertoire); + } case TIME_RESULT: break; case ROW_RESULT: @@ -4883,7 +4967,7 @@ /* see comments in the header file */ Item * -Item_param::clone_item(THD *thd) +Item_param::clone_item(THD *thd) const { // There's no "default". See comments in Item_param::save_in_field(). switch (state) { @@ -5019,7 +5103,7 @@ if (arg->save_in_value(thd, &tmp) || set_value(thd, arg, &tmp, arg->type_handler())) { - set_null(); + set_null_string(arg->collation); return false; } /* It is wrapper => other set_* shoud set null_value */ @@ -5093,6 +5177,92 @@ } +/** + Allocate a memory and create on it a copy of Field object. + + @param thd thread handler + @param field_arg an instance of Field the new Field object be based on + + @return a new created Field object on success, nullptr on error. +*/ + +static Field *make_default_field(THD *thd, Field *field_arg) +{ + Field *def_field; + + if (!(def_field= (Field*) thd->alloc(field_arg->size_of()))) + return nullptr; + + memcpy((void *)def_field, (void *)field_arg, field_arg->size_of()); + def_field->reset_fields(); + // If non-constant default value expression or a blob + if (def_field->default_value && + (def_field->default_value->flags || (def_field->flags & BLOB_FLAG))) + { + uchar *newptr= (uchar*) thd->alloc(1+def_field->pack_length()); + if (!newptr) + return nullptr; + + if (should_mark_column(thd->column_usage)) + def_field->default_value->expr->update_used_tables(); + def_field->move_field(newptr + 1, def_field->maybe_null() ? newptr : 0, 1); + } + else + def_field->move_field_offset((my_ptrdiff_t) + (def_field->table->s->default_values - + def_field->table->record[0])); + return def_field; +} + + +/** + Assign a default value of a table column to the positional parameter that + is performed on execution of a prepared statement with the clause + 'USING DEFAULT' + + @param field a field that should be assigned an actual value of positional + parameter passed via the clause 'USING DEFAULT' + + @return false on success, true on failure +*/ + +bool Item_param::assign_default(Field *field) +{ + DBUG_ASSERT(m_associated_field); + + if (m_associated_field->field->flags & NO_DEFAULT_VALUE_FLAG) + { + my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), + m_associated_field->field->field_name.str); + return true; + } + + if (!m_default_field) + { + m_default_field= make_default_field(field->table->in_use, + m_associated_field->field); + + if (!m_default_field) + return true; + } + + if (m_default_field->default_value) + { + return m_default_field->default_value->expr->save_in_field(field, 0); + } + else if (m_default_field->is_null()) + { + field->set_null(); + return false; + } + else + { + field->set_notnull(); + return field_conv(field, m_default_field); + } +} + + /**************************************************************************** Item_copy_string ****************************************************************************/ @@ -5445,7 +5615,7 @@ is ambiguous. */ my_error(ER_NON_UNIQ_ERROR, MYF(0), - find_item->full_name(), current_thd->where); + find_item->full_name(), thd_where(current_thd)); return NULL; } } @@ -5530,7 +5700,7 @@ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_NON_UNIQ_ERROR, ER_THD(thd,ER_NON_UNIQ_ERROR), ref->full_name(), - thd->where); + thd_where(thd)); } } @@ -5864,7 +6034,7 @@ if (upward_lookup) { // We can't say exactly what absent table or field - my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), thd->where); + my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), thd_where(thd)); } else { @@ -6091,7 +6261,7 @@ { /* The column to which we link isn't valid. */ my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name.str, - thd->where); + thd_where(thd)); return(1); } @@ -6136,7 +6306,7 @@ if (unlikely(!select)) { - my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), thd->where); + my_error(ER_BAD_FIELD_ERROR, MYF(0), full_name(), thd_where(thd)); goto error; } if ((ret= fix_outer_field(thd, &from_field, reference)) < 0) @@ -6888,7 +7058,7 @@ } -Item *Item_string::clone_item(THD *thd) +Item *Item_string::clone_item(THD *thd) const { LEX_CSTRING val; str_value.get_value(&val); @@ -6900,6 +7070,7 @@ Item_string::make_string_literal_concat(THD *thd, const LEX_CSTRING *str) { append(str->str, (uint32) str->length); + set_name(thd, &str_value); if (!(collation.repertoire & MY_REPERTOIRE_EXTENDED)) { // If the string has been pure ASCII so far, check the new part. @@ -6951,7 +7122,7 @@ } -Item *Item_int::clone_item(THD *thd) +Item *Item_int::clone_item(THD *thd) const { return new (thd->mem_root) Item_int(thd, name.str, value, max_length, unsigned_flag); } @@ -6980,7 +7151,7 @@ } -Item *Item_int_with_ref::clone_item(THD *thd) +Item *Item_int_with_ref::clone_item(THD *thd) const { DBUG_ASSERT(ref->const_item()); /* @@ -7040,7 +7211,25 @@ else if (value < 0 && max_length) max_length--; value= -value; - presentation= 0; + if (presentation) + { + if (*presentation == '-') + { + // Strip double minus: -(-1) -> '1' instead of '--1' + presentation++; + } + else + { + size_t presentation_length= strlen(presentation); + if (char *tmp= (char*) thd->alloc(presentation_length + 2)) + { + tmp[0]= '-'; + // Copy with the trailing '\0' + memcpy(tmp + 1, presentation, presentation_length + 1); + presentation= tmp; + } + } + } name= null_clex_str; return this; } @@ -7058,7 +7247,7 @@ } -Item *Item_uint::clone_item(THD *thd) +Item *Item_uint::clone_item(THD *thd) const { return new (thd->mem_root) Item_uint(thd, name.str, value, max_length); } @@ -7194,10 +7383,8 @@ void Item_hex_hybrid::print(String *str, enum_query_type query_type) { - uint32 len= MY_MIN(str_value.length(), sizeof(longlong)); - const char *ptr= str_value.ptr() + str_value.length() - len; - str->append("0x",2); - str->append_hex(ptr, len); + str->append("0x", 2); + str->append_hex(str_value.ptr(), str_value.length()); } @@ -7298,7 +7485,7 @@ } -Item *Item_date_literal::clone_item(THD *thd) +Item *Item_date_literal::clone_item(THD *thd) const { return new (thd->mem_root) Item_date_literal(thd, &cached_time); } @@ -7323,7 +7510,7 @@ } -Item *Item_datetime_literal::clone_item(THD *thd) +Item *Item_datetime_literal::clone_item(THD *thd) const { return new (thd->mem_root) Item_datetime_literal(thd, &cached_time, decimals); } @@ -7348,7 +7535,7 @@ } -Item *Item_time_literal::clone_item(THD *thd) +Item *Item_time_literal::clone_item(THD *thd) const { return new (thd->mem_root) Item_time_literal(thd, &cached_time, decimals); } @@ -7935,7 +8122,7 @@ public: THD *thd; st_select_lex *current_select; - virtual void visit_field(Item_field *item) + void visit_field(Item_field *item) override { // Find which select the field is in. This is achieved by walking up // the select tree and looking for the table of interest. @@ -8066,7 +8253,7 @@ if (unlikely(!outer_context)) { /* The current reference cannot be resolved in this query. */ - my_error(ER_BAD_FIELD_ERROR,MYF(0), full_name(), thd->where); + my_error(ER_BAD_FIELD_ERROR,MYF(0), full_name(), thd_where(thd)); goto error; } @@ -8217,7 +8404,7 @@ { /* The item was not a table field and not a reference */ my_error(ER_BAD_FIELD_ERROR, MYF(0), - this->full_name(), thd->where); + this->full_name(), thd_where(thd)); goto error; } /* Should be checked in resolve_ref_in_select_and_group(). */ @@ -9574,69 +9761,10 @@ bool Item_default_value::fix_fields(THD *thd, Item **items) { - Item *real_arg; - Item_field *field_arg; - Field *def_field; DBUG_ASSERT(fixed() == 0); DBUG_ASSERT(arg); - /* - DEFAULT() do not need table field so should not ask handler to bring - field value (mark column for read) - */ - enum_column_usage save_column_usage= thd->column_usage; - /* - Fields which has defult value could be read, so it is better hide system - invisible columns. - */ - thd->column_usage= COLUMNS_WRITE; - if (arg->fix_fields_if_needed(thd, &arg)) - { - thd->column_usage= save_column_usage; - goto error; - } - thd->column_usage= save_column_usage; - - real_arg= arg->real_item(); - if (real_arg->type() != FIELD_ITEM) - { - my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), arg->name.str); - goto error; - } - - field_arg= (Item_field *)real_arg; - if ((field_arg->field->flags & NO_DEFAULT_VALUE_FLAG)) - { - my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), - field_arg->field->field_name.str); - goto error; - } - if (!(def_field= (Field*) thd->alloc(field_arg->field->size_of()))) - goto error; - memcpy((void *)def_field, (void *)field_arg->field, - field_arg->field->size_of()); - def_field->reset_fields(); - // If non-constant default value expression or a blob - if (def_field->default_value && - (def_field->default_value->flags || (def_field->flags & BLOB_FLAG))) - { - uchar *newptr= (uchar*) thd->alloc(1+def_field->pack_length()); - if (!newptr) - goto error; - if (should_mark_column(thd->column_usage)) - def_field->default_value->expr->update_used_tables(); - def_field->move_field(newptr+1, def_field->maybe_null() ? newptr : 0, 1); - } - else - def_field->move_field_offset((my_ptrdiff_t) - (def_field->table->s->default_values - - def_field->table->record[0])); - set_field(def_field); - return FALSE; - -error: - context->process_error(thd); - return TRUE; + return tie_field(thd); } void Item_default_value::cleanup() @@ -9825,6 +9953,79 @@ } +bool Item_default_value:: + associate_with_target_field(THD *thd, + Item_field *field __attribute__((unused))) +{ + m_associated= true; + /* + arg set correctly in constructor (can also differ from field if + it is function with an argument) + */ + return tie_field(thd); +} + + +/** + Call fix_fields for an item representing the default value, create + an instance of Field for representing the default value and assign it + to the Item_field::field. + + @param thd thread handler + + @return false on success, true on error +*/ + +bool Item_default_value::tie_field(THD *thd) +{ + Item *real_arg; + Item_field *field_arg; + Field *def_field; + + /* + DEFAULT() do not need table field so should not ask handler to bring + field value (mark column for read) + */ + enum_column_usage save_column_usage= thd->column_usage; + /* + Fields which has defult value could be read, so it is better hide system + invisible columns. + */ + thd->column_usage= COLUMNS_WRITE; + if (arg->fix_fields_if_needed(thd, &arg)) + { + thd->column_usage= save_column_usage; + goto error; + } + thd->column_usage= save_column_usage; + + real_arg= arg->real_item(); + if (real_arg->type() != FIELD_ITEM) + { + my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), arg->name.str); + goto error; + } + + field_arg= (Item_field *)real_arg; + if ((field_arg->field->flags & NO_DEFAULT_VALUE_FLAG)) + { + my_error(ER_NO_DEFAULT_FOR_FIELD, MYF(0), + field_arg->field->field_name.str); + goto error; + } + def_field= make_default_field(thd, field_arg->field); + if (!def_field) + goto error; + + set_field(def_field); + return false; + +error: + context->process_error(thd); + return true; + +} + bool Item_insert_value::eq(const Item *item, bool binary_cmp) const { return item->type() == INSERT_VALUE_ITEM && @@ -10301,7 +10502,7 @@ } -Item *Item_cache_temporal::clone_item(THD *thd) +Item *Item_cache_temporal::clone_item(THD *thd) const { Item_cache *tmp= type_handler()->Item_get_cache(thd, this); Item_cache_temporal *item= static_cast(tmp); @@ -11003,10 +11204,15 @@ if (!(get_extraction_flag() == MARKER_IMMUTABLE)) return cleanup_processor(arg); else - { - clear_extraction_flag(); return false; - } +} + + +bool Item::remove_immutable_flag_processor (void *arg) +{ + if (get_extraction_flag() == MARKER_IMMUTABLE) + clear_extraction_flag(); + return false; } diff -Nru mariadb-10.11.6/sql/item.h mariadb-10.11.9/sql/item.h --- mariadb-10.11.6/sql/item.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item.h 2024-08-03 07:29:58.000000000 +0000 @@ -28,7 +28,9 @@ #include "field.h" /* Derivation */ #include "sql_type.h" #include "sql_time.h" +#include "sql_schema.h" #include "mem_root_array.h" +#include #include "cset_narrowing.h" @@ -457,16 +459,16 @@ class Sp_rcontext_handler_local: public Sp_rcontext_handler { public: - const LEX_CSTRING *get_name_prefix() const; - sp_rcontext *get_rcontext(sp_rcontext *ctx) const; + const LEX_CSTRING *get_name_prefix() const override; + sp_rcontext *get_rcontext(sp_rcontext *ctx) const override; }; class Sp_rcontext_handler_package_body: public Sp_rcontext_handler { public: - const LEX_CSTRING *get_name_prefix() const; - sp_rcontext *get_rcontext(sp_rcontext *ctx) const; + const LEX_CSTRING *get_name_prefix() const override; + sp_rcontext *get_rcontext(sp_rcontext *ctx) const override; }; @@ -945,7 +947,7 @@ const Tmp_field_param *param, bool is_explicit_null); - void raise_error_not_evaluable(); + virtual void raise_error_not_evaluable(); void push_note_converted_to_negative_complement(THD *thd); void push_note_converted_to_positive_complement(THD *thd); @@ -1015,6 +1017,19 @@ expressions with subqueries in the ORDER/GROUP clauses. */ String *val_str() { return val_str(&str_value); } + String *val_str_null_to_empty(String *to) + { + String *res= val_str(to); + if (res) + return res; + to->set_charset(collation.collation); + to->length(0); + return to; + } + String *val_str_null_to_empty(String *to, bool null_to_empty) + { + return null_to_empty ? val_str_null_to_empty(to) : val_str(to); + } virtual Item_func *get_item_func() { return NULL; } const MY_LOCALE *locale_from_val_str(); @@ -1881,10 +1896,57 @@ raise_error_not_evaluable(); return true; // Error } - /* cloning of constant items (0 if it is not const) */ - virtual Item *clone_item(THD *thd) { return 0; } - /* deep copy item */ - virtual Item* build_clone(THD *thd) { return get_copy(thd); } + + /* + Create a shallow copy of the item (usually invoking copy constructor). + For deep copying see build_clone(). + + Return value: + - pointer to a copy of the Item + - nullptr if the item is not copyable + */ + Item *get_copy(THD *thd) const + { + Item *copy= do_get_copy(thd); + if (copy) + { + // Make sure the copy is of same type as this item + DBUG_ASSERT(typeid(*copy) == typeid(*this)); + } + return copy; + } + + /* + Creates a clone of the item by deep copying. + + Return value: + - pointer to a clone of the Item + - nullptr if the item is not clonable + */ + Item* build_clone(THD *thd) const + { + Item *clone= do_build_clone(thd); + if (clone) + { + // Make sure the clone is of same type as this item + DBUG_ASSERT(typeid(*clone) == typeid(*this)); + } + return clone; + } + + /* + Clones the constant item (not necessary returning the same item type) + + Return value: + - pointer to a clone of the Item + - nullptr if the item is not clonable + + Note: the clone may have item type different from this + (i.e., instance of another basic constant class may be returned). + For real clones look at build_clone()/get_copy() methods + */ + virtual Item *clone_item(THD *thd) const { return nullptr; } + virtual cond_result eq_cmp_result() const { return COND_OK; } inline uint float_length(uint decimals_par) const { return decimals < FLOATING_POINT_DECIMALS ? (DBL_DIG+2+decimals_par) : DBL_DIG+8;} @@ -1986,7 +2048,8 @@ QT_ITEM_IDENT_SKIP_DB_NAMES | QT_ITEM_IDENT_SKIP_TABLE_NAMES | QT_NO_DATA_EXPANSION | - QT_TO_SYSTEM_CHARSET), + QT_TO_SYSTEM_CHARSET | + QT_FOR_FRM), LOWEST_PRECEDENCE); } virtual void print(String *str, enum_query_type query_type); @@ -2192,6 +2255,7 @@ virtual bool change_context_processor(void *arg) { return 0; } virtual bool reset_query_id_processor(void *arg) { return 0; } virtual bool is_expensive_processor(void *arg) { return 0; } + bool remove_immutable_flag_processor (void *arg); // FIXME reduce the number of "add field to bitmap" processors virtual bool add_field_to_set_processor(void *arg) { return 0; } @@ -2391,12 +2455,6 @@ */ virtual bool find_not_null_fields(table_map allowed) { return false; } - /* - Does not guarantee deep copy (depends on copy ctor). - See build_clone() for deep copy. - */ - virtual Item *get_copy(THD *thd)=0; - bool cache_const_expr_analyzer(uchar **arg); Item* cache_const_expr_transformer(THD *thd, uchar *arg); @@ -2500,8 +2558,7 @@ { return this; } virtual Item *field_transformer_for_having_pushdown(THD *thd, uchar *arg) { return this; } - virtual Item *multiple_equality_transformer(THD *thd, uchar *arg) - { return this; } + virtual Item *multiple_equality_transformer(THD *thd, uchar *arg); virtual bool expr_cache_is_needed(THD *) { return FALSE; } virtual Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs); bool needs_charset_converter(uint32 length, CHARSET_INFO *tocs) const @@ -2720,12 +2777,39 @@ Checks if this item consists in the left part of arg IN subquery predicate */ bool pushable_equality_checker_for_subquery(uchar *arg); + + /** + This method is to set relationship between a positional parameter + represented by the '?' and an actual argument value passed to the + call of PS/SP by the USING clause. The method is overridden in classes + Item_param and Item_default_value. + */ + virtual bool associate_with_target_field(THD *, Item_field *) + { + DBUG_ASSERT(fixed()); + return false; + } + +protected: + /* + Service function for public method get_copy(). See comments for get_copy() + above. Override this method in derived classes to create shallow copies of + the item + */ + virtual Item *do_get_copy(THD *thd) const = 0; + + /* + Service function for public method build_clone(). See comments for + build_clone() above. Override this method in derived classes to create + deep copies (clones) of the item where possible + */ + virtual Item* do_build_clone(THD *thd) const = 0; }; MEM_ROOT *get_thd_memroot(THD *thd); template -inline Item* get_item_copy (THD *thd, T* item) +inline Item* get_item_copy (THD *thd, const T* item) { Item *copy= new (get_thd_memroot(thd)) T(*item); if (likely(copy)) @@ -3032,8 +3116,8 @@ public: Item_basic_constant(THD *thd): Item_basic_value(thd) {}; Item_basic_constant(): Item_basic_value() {}; - bool check_vcol_func_processor(void *arg) { return false; } - const Item_const *get_item_const() const { return this; } + bool check_vcol_func_processor(void *) override { return false; } + const Item_const *get_item_const() const override { return this; } virtual Item_basic_constant *make_string_literal_concat(THD *thd, const LEX_CSTRING *) { @@ -3180,7 +3264,8 @@ bool append_for_log(THD *thd, String *str) override; - Item *get_copy(THD *) override { return nullptr; } + Item *do_get_copy(THD *) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } /* Override the inherited create_field_for_create_select(), @@ -3225,6 +3310,9 @@ :Item_splocal(thd, rh, sp_var_name, sp_var_idx, &type_handler_null, pos_in_q, len_in_q) { } + + Item *do_get_copy(THD *) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } }; @@ -3257,6 +3345,9 @@ Item **this_item_addr(THD *thd, Item **) override; bool append_for_log(THD *thd, String *str) override; void print(String *str, enum_query_type query_type) override; + + Item *do_get_copy(THD *) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } }; @@ -3277,6 +3368,9 @@ { } bool fix_fields(THD *thd, Item **it) override; void print(String *str, enum_query_type query_type) override; + + Item *do_get_copy(THD *) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } }; @@ -3320,7 +3414,8 @@ purposes. */ void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *) override { return nullptr; } + Item *do_get_copy(THD *) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } private: uint m_case_expr_id; @@ -3400,8 +3495,9 @@ { return mark_unsupported_function("name_const()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -3790,8 +3886,9 @@ bool cleanup_excluding_const_fields_processor(void *arg) override { return field && const_item() ? 0 : cleanup_processor(arg); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item* do_build_clone(THD *thd) const override { return get_copy(thd); } bool is_outer_field() const override { DBUG_ASSERT(fixed()); @@ -3816,7 +3913,7 @@ :Item_field(thd, field), Item_args() { } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } const Type_handler *type_handler() const override @@ -3865,7 +3962,7 @@ const Type_handler *type_handler() const override { return &type_handler_null; } bool basic_const_item() const override { return true; } - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; bool const_is_null() const override { return true; } bool is_null() override { return true; } @@ -3879,8 +3976,9 @@ Item_basic_constant *make_string_literal_concat(THD *thd, const LEX_CSTRING *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; class Item_null_result :public Item_null @@ -4089,7 +4187,7 @@ PValue value; const String *value_query_val_str(THD *thd, String* str) const; - Item *value_clone_item(THD *thd); + Item *value_clone_item(THD *thd) const; bool is_evaluable_expression() const override; bool check_assignability_to(const Field *field, bool ignore) const override; bool can_return_value() const; @@ -4121,6 +4219,12 @@ Item_param(THD *thd, const LEX_CSTRING *name_arg, uint pos_in_query_arg, uint len_in_query_arg); + void cleanup() override + { + m_default_field= NULL; + Item::cleanup(); + } + Type type() const override { // Don't pretend to be a constant unless value for this item is set. @@ -4201,7 +4305,32 @@ void set_default(); void set_ignore(); - void set_null(); + void set_null(const DTCollation &c); + void set_null_string(const DTCollation &c) + { + /* + We need to distinguish explicit NULL (marked by DERIVATION_IGNORABLE) + from other item types: + + - These statements should give an error, because + the character set of the bound parameter is not known: + EXECUTE IMMEDIATE "SELECT ? COLLATE utf8mb4_bin" USING NULL; + EXECUTE IMMEDIATE "SELECT ? COLLATE utf8mb4_bin" USING CONCAT(NULL); + + - These statements should return a good result, because + the character set of the bound parameter is known: + EXECUTE IMMEDIATE "SELECT ? COLLATE utf8mb4_bin" + USING CONVERT(NULL USING utf8mb4); + EXECUTE IMMEDIATE "SELECT ? COLLATE utf8mb4_bin" + USING CAST(NULL AS CHAR CHARACTER SET utf8mb4); + */ + set_null(DTCollation(c.collation, MY_MAX(c.derivation, + DERIVATION_COERCIBLE))); + } + void set_null() + { + set_null(DTCollation(&my_charset_bin, DERIVATION_IGNORABLE)); + } void set_int(longlong i, uint32 max_length_arg); void set_double(double i); void set_decimal(const char *str, ulong length); @@ -4310,7 +4439,7 @@ basic_const_item returned TRUE. */ Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs) override; - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; void set_param_type_and_swap_value(Item_param *from); Rewritable_query_parameter *get_rewritable_query_parameter() override @@ -4320,11 +4449,17 @@ bool append_for_log(THD *thd, String *str) override; bool check_vcol_func_processor(void *) override { return false; } - Item *get_copy(THD *) override { return nullptr; } + Item *do_get_copy(THD *thd) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } + bool add_as_clone(THD *thd); void sync_clones(); bool register_clone(Item_param *i) { return m_clones.push_back(i); } + void raise_error_not_evaluable() override + { + invalid_default_param(); + } private: void invalid_default_param() const; bool set_value(THD *thd, sp_rcontext *ctx, Item **it) override; @@ -4335,6 +4470,17 @@ Item_param *get_item_param() override { return this; } void make_send_field(THD *thd, Send_field *field) override; + /** + See comments on @see Item::associate_with_target_field for method + description + */ + bool associate_with_target_field(THD *, Item_field *field) override + { + m_associated_field= field; + return false; + } + bool assign_default(Field *field); + private: Send_field *m_out_param_info; bool m_is_settable_routine_parameter; @@ -4344,6 +4490,8 @@ synchronize the actual value of the parameter with the values of the clones. */ Mem_root_array m_clones; + Item_field *m_associated_field; + Field *m_default_field; }; @@ -4393,13 +4541,14 @@ String *val_str(String*) override; int save_in_field(Field *field, bool no_conversions) override; bool is_order_clause_position() const override { return true; } - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; void print(String *str, enum_query_type query_type) override; Item *neg(THD *thd) override; decimal_digits_t decimal_precision() const override { return (decimal_digits_t) (max_length - MY_TEST(value < 0)); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -4429,6 +4578,9 @@ predicate at various condition optimization stages in sql_select. */ } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -4444,6 +4596,9 @@ { DBUG_ASSERT(0); } void cleanup() override {} + + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } }; /* The following variablese are stored in a read only segment */ @@ -4455,12 +4610,12 @@ Item_uint(THD *thd, const char *str_arg, size_t length); Item_uint(THD *thd, ulonglong i): Item_int(thd, i, 10) {} Item_uint(THD *thd, const char *str_arg, longlong i, uint length); - double val_real() override { return ulonglong2double((ulonglong)value); } - Item *clone_item(THD *thd) override; + double val_real() override { return ulonglong2double((ulonglong)value); } + Item *clone_item(THD *thd) const override; Item *neg(THD *thd) override; decimal_digits_t decimal_precision() const override { return decimal_digits_t(max_length); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -4511,7 +4666,7 @@ const my_decimal *const_ptr_my_decimal() const override { return &decimal_value; } int save_in_field(Field *field, bool no_conversions) override; - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; void print(String *str, enum_query_type query_type) override { decimal_value.to_string(&str_value); @@ -4521,8 +4676,9 @@ decimal_digits_t decimal_precision() const override { return decimal_value.precision(); } void set_decimal_value(my_decimal *value_par); - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -4564,11 +4720,12 @@ } String *val_str(String*) override; my_decimal *val_decimal(my_decimal *) override; - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; Item *neg(THD *thd) override; void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -4684,7 +4841,7 @@ int save_in_field(Field *field, bool no_conversions) override; const Type_handler *type_handler() const override { return &type_handler_varchar; } - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs) override { return const_charset_converter(thd, tocs, true); @@ -4727,8 +4884,9 @@ const LEX_CSTRING *) override; Item *make_odbc_literal(THD *thd, const LEX_CSTRING *typestr) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -4744,10 +4902,13 @@ const LEX_CSTRING &str, CHARSET_INFO *tocs): Item_string(thd, name_arg, str, tocs) { } - virtual bool is_cs_specified() const + bool is_cs_specified() const override { return true; } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -4823,7 +4984,7 @@ { max_length= length; } - bool check_vcol_func_processor(void *arg) + bool check_vcol_func_processor(void *arg) override { return mark_unsupported_function("safe_string", arg, VCOL_IMPOSSIBLE); } @@ -4848,7 +5009,7 @@ :Item_partition_func_safe_string(thd, LEX_CSTRING({header, strlen(header)}), length * cs->mbmaxlen, cs) { } - void make_send_field(THD *thd, Send_field *field); + void make_send_field(THD *thd, Send_field *field) override; }; @@ -4937,8 +5098,9 @@ return field->store_hex_hybrid(str_value.ptr(), str_value.length()); } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -4976,8 +5138,9 @@ collation.collation); } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -5033,8 +5196,9 @@ { m_value= value; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -5101,7 +5265,7 @@ { return cached_time.get_mysql_time(); } - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; longlong val_int() override { return update_null() ? 0 : cached_time.to_longlong(); @@ -5123,8 +5287,9 @@ return update_null() ? 0 : cached_time.valid_date_to_packed(); } bool get_date(THD *thd, MYSQL_TIME *res, date_mode_t fuzzydate) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -5150,7 +5315,7 @@ { return cached_time.get_mysql_time(); } - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; longlong val_int() override { return cached_time.to_longlong(); } double val_real() override { return cached_time.to_double(); } String *val_str(String *to) override @@ -5166,8 +5331,9 @@ { return Time(thd, this).to_native(to, decimals); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -5203,7 +5369,7 @@ { return cached_time.get_mysql_time(); } - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; longlong val_int() override { return update_null() ? 0 : cached_time.to_longlong(); @@ -5225,8 +5391,9 @@ return update_null() ? 0 : cached_time.valid_datetime_to_packed(); } bool get_date(THD *thd, MYSQL_TIME *res, date_mode_t fuzzydate) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -5264,7 +5431,7 @@ { base_flags&= ~item_base_t::MAYBE_NULL; } - bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override { cached_time.copy_to_mysql_time(ltime); return (null_value= false); @@ -5286,11 +5453,14 @@ { base_flags&= ~item_base_t::MAYBE_NULL; } - bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override { cached_time.copy_to_mysql_time(ltime); return (null_value= false); } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -5482,6 +5652,14 @@ return (this->*processor)(arg); } /* + Built-in schema, e.g. mariadb_schema, oracle_schema, maxdb_schema + */ + virtual const Schema *schema() const + { + // A function does not belong to a built-in schema by default + return NULL; + } + /* This method is used for debug purposes to print the name of an item to the debug log. The second use of this method is as a helper function of print() and error messages, where it is @@ -5504,7 +5682,7 @@ virtual bool fix_length_and_dec(THD *thd)= 0; bool const_item() const override { return const_item_cache; } table_map used_tables() const override { return used_tables_cache; } - Item* build_clone(THD *thd) override; + Item* do_build_clone(THD *thd) const override; Sql_mode_dependency value_depends_on_sql_mode() const override { return Item_args::value_depends_on_sql_mode_bit_or().soft_to_hard(); @@ -5754,11 +5932,11 @@ DBUG_ASSERT(ref); return (*ref)->is_outer_field(); } - Item* build_clone(THD *thd) override; + Item *do_build_clone(THD *thd) const override; /** Checks if the item tree that ref points to contains a subquery. */ - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool excl_dep_on_table(table_map tab_map) override { @@ -5839,7 +6017,7 @@ longlong val_datetime_packed(THD *) override; longlong val_time_packed(THD *) override; Ref_Type ref_type() override { return DIRECT_REF; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } Item *remove_item_direct_ref() override { return (*ref)->remove_item_direct_ref(); } @@ -6008,9 +6186,9 @@ { return mark_unsupported_function("cache", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } - Item *build_clone(THD *) override { return nullptr; } + Item *do_build_clone(THD *) const override { return nullptr; } }; @@ -6031,6 +6209,8 @@ if (!view->is_inner_table_of_outer_join() || !(null_ref_table= view->get_real_join_table())) null_ref_table= NO_NULL_TABLE; + if (null_ref_table && null_ref_table != NO_NULL_TABLE) + set_maybe_null(); } bool check_null_ref() @@ -6220,7 +6400,7 @@ my_decimal *val_decimal_result(my_decimal *val) override; bool val_bool_result() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } Item *field_transformer_for_having_pushdown(THD *, uchar *) override { return this; } @@ -6284,6 +6464,9 @@ table_map not_null_tables() const override { return 0; } Ref_Type ref_type() override { return OUTER_REF; } bool check_inner_refs_processor(void * arg) override; + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -6320,7 +6503,7 @@ bool val_native(THD *thd, Native *to) override; void print(String *str, enum_query_type query_type) override; table_map used_tables() const override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -6346,8 +6529,11 @@ { return ref->save_in_field(field, no_conversions); } - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; Item *real_item() override { return ref; } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; #ifdef MYSQL_SERVER @@ -6483,8 +6669,9 @@ { return get_date_from_string(thd, ltime, fuzzydate); } void copy() override; int save_in_field(Field *field, bool no_conversions) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -6554,8 +6741,9 @@ DBUG_ASSERT(sane()); return null_value || m_value.to_native(to, decimals); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -6670,6 +6858,8 @@ class Item_default_value : public Item_field { bool vcol_assignment_ok; + bool m_associated= false; + void calculate(); public: Item *arg= nullptr; @@ -6738,6 +6928,15 @@ override; Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src, const Tmp_field_param *param) override; + + /** + See comments on @see Item::associate_with_target_field for method + description + */ + bool associate_with_target_field(THD *thd, Item_field *field) override; + +private: + bool tie_field(THD *thd); }; @@ -6826,8 +7025,9 @@ param->set_default(); return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -6864,8 +7064,9 @@ return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7214,8 +7415,9 @@ bool cache_value() override; int save_in_field(Field *field, bool no_conversions) override; Item *convert_to_basic_const_item(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7224,10 +7426,11 @@ public: Item_cache_year(THD *thd, const Type_handler *handler) :Item_cache_int(thd, handler) { } - bool get_date(THD *thd, MYSQL_TIME *to, date_mode_t mode) + bool get_date(THD *thd, MYSQL_TIME *to, date_mode_t mode) override { return type_handler_year.Item_get_date_with_warn(thd, this, to, mode); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7252,7 +7455,7 @@ is a constant and need not be optimized further. Important when storing packed datetime values. */ - Item *clone_item(THD *thd) override; + Item *clone_item(THD *thd) const override; Item *convert_to_basic_const_item(THD *thd) override; virtual Item *make_literal(THD *) =0; }; @@ -7264,7 +7467,7 @@ Item_cache_time(THD *thd) :Item_cache_temporal(thd, &type_handler_time2) { } bool cache_value() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } Item *make_literal(THD *) override; longlong val_datetime_packed(THD *thd) override @@ -7304,7 +7507,7 @@ public: Item_cache_datetime(THD *thd) :Item_cache_temporal(thd, &type_handler_datetime2) { } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } Item *make_literal(THD *) override; longlong val_datetime_packed(THD *) override @@ -7339,7 +7542,7 @@ public: Item_cache_date(THD *thd) :Item_cache_temporal(thd, &type_handler_newdate) { } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } Item *make_literal(THD *) override; longlong val_datetime_packed(THD *) override @@ -7372,8 +7575,9 @@ public: Item_cache_timestamp(THD *thd) :Item_cache(thd, &type_handler_timestamp2) { } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } bool cache_value() override; String* val_str(String *to) override { @@ -7432,8 +7636,9 @@ :Item_cache_real(thd, &type_handler_double) { } String *val_str(String *str) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7444,8 +7649,9 @@ :Item_cache_real(thd, &type_handler_float) { } String *val_str(String *str) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7467,8 +7673,9 @@ } bool cache_value() override; Item *convert_to_basic_const_item(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7497,8 +7704,9 @@ int save_in_field(Field *field, bool no_conversions) override; bool cache_value() override; Item *convert_to_basic_const_item(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7522,8 +7730,9 @@ */ return Item::safe_charset_converter(thd, tocs); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7599,8 +7808,9 @@ } bool cache_value() override; void set_null() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -7669,7 +7879,8 @@ make_and_init_table_field(root, &name, Record_addr(maybe_null()), *this, table); } - Item* get_copy(THD *) override { return nullptr; } + Item *do_get_copy(THD *) const override { return nullptr; } + Item *do_build_clone(THD *) const override { return nullptr; } }; @@ -7731,9 +7942,9 @@ public: Item_iterator_ref_list(List_iterator &arg_list): list(arg_list) {} - void open() { list.rewind(); } - Item *next() { return *(list++); } - void close() {} + void open() override { list.rewind(); } + Item *next() override { return *(list++); } + void close() override {} }; @@ -7747,9 +7958,9 @@ public: Item_iterator_list(List_iterator &arg_list): list(arg_list) {} - void open() { list.rewind(); } - Item *next() { return (list++); } - void close() {} + void open() override { list.rewind(); } + Item *next() override { return (list++); } + void close() override {} }; @@ -7763,14 +7974,14 @@ uint current; public: Item_iterator_row(Item *base) : base_item(base), current(0) {} - void open() { current= 0; } - Item *next() + void open() override { current= 0; } + Item *next() override { if (current >= base_item->cols()) return NULL; return base_item->element_index(current++); } - void close() {} + void close() override {} }; @@ -7816,84 +8027,85 @@ void change_item(THD *thd, Item *); - bool fix_fields(THD *thd, Item **it); + bool fix_fields(THD *thd, Item **it) override; - void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type) override; - Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs); - Item *get_tmp_table_item(THD *thd) + Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs) override; + Item *get_tmp_table_item(THD *thd) override { return m_item->get_tmp_table_item(thd); } - Item *get_copy(THD *thd) + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } COND *build_equal_items(THD *thd, COND_EQUAL *inherited, bool link_item_fields, - COND_EQUAL **cond_equal_ref) + COND_EQUAL **cond_equal_ref) override { return m_item->build_equal_items(thd, inherited, link_item_fields, cond_equal_ref); } - const char *full_name() const { return m_item->full_name(); } - void make_send_field(THD *thd, Send_field *field) + LEX_CSTRING full_name_cstring() const override + { return m_item->full_name_cstring(); } + void make_send_field(THD *thd, Send_field *field) override { m_item->make_send_field(thd, field); } - bool eq(const Item *item, bool binary_cmp) const + bool eq(const Item *item, bool binary_cmp) const override { const Item *it= item->real_item(); return m_item->eq(it, binary_cmp); } - void fix_after_pullout(st_select_lex *new_parent, Item **refptr, bool merge) + void fix_after_pullout(st_select_lex *new_parent, Item **refptr, bool merge) override { m_item->fix_after_pullout(new_parent, &m_item, merge); } - void save_val(Field *to) + void save_val(Field *to) override { return m_item->save_val(to); } - void save_result(Field *to) + void save_result(Field *to) override { return m_item->save_result(to); } - int save_in_field(Field *to, bool no_conversions) + int save_in_field(Field *to, bool no_conversions) override { return m_item->save_in_field(to, no_conversions); } - const Type_handler *type_handler() const { return m_item->type_handler(); } - table_map used_tables() const { return m_item->used_tables(); } - void update_used_tables() + const Type_handler *type_handler() const override { return m_item->type_handler(); } + table_map used_tables() const override { return m_item->used_tables(); } + void update_used_tables() override { m_item->update_used_tables(); } - bool const_item() const { return m_item->const_item(); } - table_map not_null_tables() const { return m_item->not_null_tables(); } - bool walk(Item_processor processor, bool walk_subquery, void *arg) + bool const_item() const override { return m_item->const_item(); } + table_map not_null_tables() const override { return m_item->not_null_tables(); } + bool walk(Item_processor processor, bool walk_subquery, void *arg) override { return m_item->walk(processor, walk_subquery, arg) || (this->*processor)(arg); } - bool enumerate_field_refs_processor(void *arg) + bool enumerate_field_refs_processor(void *arg) override { return m_item->enumerate_field_refs_processor(arg); } - Item_field *field_for_view_update() + Item_field *field_for_view_update() override { return m_item->field_for_view_update(); } /* Row emulation: forwarding of ROW-related calls to orig_item */ - uint cols() const + uint cols() const override { return m_item->cols(); } - Item* element_index(uint i) + Item* element_index(uint i) override { return this; } - Item** addr(uint i) + Item** addr(uint i) override { return &m_item; } - bool check_cols(uint c) + bool check_cols(uint c) override { return Item::check_cols(c); } - bool null_inside() + bool null_inside() override { return m_item->null_inside(); } - void bring_value() + void bring_value() override {} - Item_equal *get_item_equal() { return m_item->get_item_equal(); } - void set_item_equal(Item_equal *item_eq) { m_item->set_item_equal(item_eq); } - Item_equal *find_item_equal(COND_EQUAL *cond_equal) + Item_equal *get_item_equal() override { return m_item->get_item_equal(); } + void set_item_equal(Item_equal *item_eq) override { m_item->set_item_equal(item_eq); } + Item_equal *find_item_equal(COND_EQUAL *cond_equal) override { return m_item->find_item_equal(cond_equal); } - Item *propagate_equal_fields(THD *thd, const Context &ctx, COND_EQUAL *cond) + Item *propagate_equal_fields(THD *thd, const Context &ctx, COND_EQUAL *cond) override { return m_item->propagate_equal_fields(thd, ctx, cond); } - Item *replace_equal_field(THD *thd, uchar *arg) + Item *replace_equal_field(THD *thd, uchar *arg) override { return m_item->replace_equal_field(thd, arg); } - bool excl_dep_on_table(table_map tab_map) + bool excl_dep_on_table(table_map tab_map) override { return m_item->excl_dep_on_table(tab_map); } - bool excl_dep_on_grouping_fields(st_select_lex *sel) + bool excl_dep_on_grouping_fields(st_select_lex *sel) override { return m_item->excl_dep_on_grouping_fields(sel); } - bool is_expensive() { return m_item->is_expensive(); } + bool is_expensive() override { return m_item->is_expensive(); } void set_item(Item *item) { m_item= item; } - Item *build_clone(THD *thd) + Item *do_build_clone(THD *thd) const override { Item *clone_item= m_item->build_clone(thd); if (clone_item) @@ -7908,7 +8120,7 @@ } void split_sum_func(THD *thd, Ref_ptr_array ref_pointer_array, - List &fields, uint flags) + List &fields, uint flags) override { m_item->split_sum_func(thd, ref_pointer_array, fields, flags); } @@ -7916,7 +8128,7 @@ This processor states that this is safe for virtual columns (because this Item transparency) */ - bool check_vcol_func_processor(void *arg) { return FALSE;} + bool check_vcol_func_processor(void *arg) override { return FALSE;} }; inline bool TABLE::mark_column_with_deps(Field *field) diff -Nru mariadb-10.11.6/sql/item_cmpfunc.cc mariadb-10.11.9/sql/item_cmpfunc.cc --- mariadb-10.11.6/sql/item_cmpfunc.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_cmpfunc.cc 2024-08-03 07:29:58.000000000 +0000 @@ -457,40 +457,6 @@ } -bool Item_func::setup_args_and_comparator(THD *thd, Arg_comparator *cmp) -{ - DBUG_ASSERT(arg_count >= 2); // Item_func_nullif has arg_count == 3 - - if (args[0]->cmp_type() == STRING_RESULT && - args[1]->cmp_type() == STRING_RESULT) - { - CHARSET_INFO *tmp; - /* - Use charset narrowing only for equalities, as that would allow - to construct ref access. - Non-equality comparisons with constants work without charset narrowing, - the constant gets converted. - Non-equality comparisons with non-constants would need narrowing to - enable range optimizer to handle e.g. - t1.mb3key_col <= const_table.mb4_col - But this doesn't look important. - */ - bool allow_narrowing= MY_TEST(functype()==Item_func::EQ_FUNC || - functype()==Item_func::EQUAL_FUNC); - - if (agg_arg_charsets_for_comparison(&tmp, &args[0], &args[1], - allow_narrowing)) - return true; - cmp->m_compare_collation= tmp; - } - // Convert constants when compared to int/year field - DBUG_ASSERT(functype() != LIKE_FUNC); - convert_const_compared_to_int_field(thd); - - return cmp->set_cmp_func(thd, this, &args[0], &args[1], true); -} - - /* Comparison operators remove arguments' dependency on PAD_CHAR_TO_FULL_LENGTH in case of PAD SPACE comparison collations: trailing spaces do not affect @@ -519,8 +485,15 @@ if (!args[0] || !args[1]) return FALSE; Item_args old_args(args[0], args[1]); - if (setup_args_and_comparator(thd, &cmp)) + convert_const_compared_to_int_field(thd); + Type_handler_hybrid_field_type tmp; + if (tmp.aggregate_for_comparison(func_name_cstring(), args, 2, false) || + tmp.type_handler()->Item_bool_rowready_func2_fix_length_and_dec(thd, + this)) + { + DBUG_ASSERT(thd->is_error()); return true; + } raise_note_if_key_become_unused(thd, old_args); return false; } @@ -540,21 +513,14 @@ */ int Arg_comparator::set_cmp_func(THD *thd, Item_func_or_sum *owner_arg, + const Type_handler *compare_handler, Item **a1, Item **a2) { owner= owner_arg; set_null= set_null && owner_arg; a= a1; b= a2; - Item *tmp_args[2]= {*a1, *a2}; - Type_handler_hybrid_field_type tmp; - if (tmp.aggregate_for_comparison(owner_arg->func_name_cstring(), tmp_args, 2, - false)) - { - DBUG_ASSERT(thd->is_error()); - return 1; - } - m_compare_handler= tmp.type_handler(); + m_compare_handler= compare_handler; return m_compare_handler->set_comparator_func(thd, this); } @@ -605,6 +571,14 @@ We must set cmp_collation here as we may be called from for an automatic generated item, like in natural join. Allow reinterpted superset as subset. + Use charset narrowing only for equalities, as that would allow + to construct ref access. + Non-equality comparisons with constants work without charset narrowing, + the constant gets converted. + Non-equality comparisons with non-constants would need narrowing to + enable range optimizer to handle e.g. + t1.mb3key_col <= const_table.mb4_col + But this doesn't look important. */ bool allow_narrowing= false; if (owner->type() == Item::FUNC_ITEM) @@ -1430,7 +1404,13 @@ eval_not_null_tables(NULL); with_flags|= (args[0]->with_flags | (args[1]->with_flags & item_with_t::SP_VAR)); - if ((const_item_cache= args[0]->const_item())) + + /* + If left expression is a constant, cache its value. + But don't do that if that involves computing a subquery, as we are in a + prepare-phase rewrite. + */ + if ((const_item_cache= args[0]->const_item()) && !args[0]->with_subquery()) { cache->store(args[0]); cache->cache_value(); @@ -1509,6 +1489,23 @@ } +bool Item_in_optimizer::walk(Item_processor processor, + bool walk_subquery, + void *arg) +{ + bool res= FALSE; + if (args[1]->type() == Item::SUBSELECT_ITEM && + ((Item_subselect *)args[1])->substype() != Item_subselect::EXISTS_SUBS && + !(((Item_subselect *)args[1])->substype() == Item_subselect::IN_SUBS && + ((Item_in_subselect *)args[1])->test_strategy(SUBS_IN_TO_EXISTS))) + res= args[0]->walk(processor, walk_subquery, arg); + if (!res) + res= args[1]->walk(processor, walk_subquery, arg); + + return res || (this->*processor)(arg); +} + + /** Add an expression cache for this subquery if it is needed @@ -2812,8 +2809,9 @@ fix_char_length(args[2]->max_char_length()); set_maybe_null(); m_arg0= args[0]; - if (setup_args_and_comparator(thd, &cmp)) - return TRUE; + convert_const_compared_to_int_field(thd); + if (cmp.set_cmp_func(thd, this, &args[0], &args[1], true/*set_null*/)) + return true; /* A special code for EXECUTE..PREPARE. @@ -3484,7 +3482,13 @@ void Item_func_decode_oracle::print(String *str, enum_query_type query_type) { - str->append(func_name_cstring()); + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(STRING_WITH_LEN("decode_oracle")); + } + else + print_sql_mode_qualified_name(str, query_type); str->append('('); args[0]->print(str, query_type); for (uint i= 1, count= when_count() ; i <= count; i++) @@ -4915,7 +4919,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); Longlong_null a= item->arguments()[0]->to_longlong_null(); @@ -4928,7 +4932,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); VDec a(item->arguments()[0]); @@ -4950,7 +4954,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); Longlong_null a= item->arguments()[0]->to_longlong_null(); @@ -4963,7 +4967,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); VDec a(item->arguments()[0]); @@ -5535,17 +5539,16 @@ 0 if an error occurred */ -Item *Item_cond::build_clone(THD *thd) +Item *Item_cond::do_build_clone(THD *thd) const { - List_iterator_fast li(list); - Item *item; Item_cond *copy= (Item_cond *) get_copy(thd); if (!copy) return 0; copy->list.empty(); - while ((item= li++)) + + for (const Item &item : list) { - Item *arg_clone= item->build_clone(thd); + Item *arg_clone= item.build_clone(thd); if (!arg_clone) return 0; if (copy->list.push_back(arg_clone, thd->mem_root)) @@ -6092,7 +6095,7 @@ // Convert text data to utf-8. m_library_charset= data_charset == &my_charset_bin ? - &my_charset_bin : &my_charset_utf8mb3_general_ci; + &my_charset_bin : &my_charset_utf8mb4_general_ci; m_conversion_is_needed= (data_charset != &my_charset_bin) && !my_charset_same(data_charset, m_library_charset); @@ -6138,8 +6141,8 @@ if (!stringcmp(pattern, &m_prev_pattern)) return false; cleanup(); - m_prev_pattern.copy(*pattern); } + m_prev_pattern.copy(*pattern); if (!(pattern= convert_if_needed(pattern, &pattern_converter))) return true; @@ -6285,7 +6288,17 @@ } -void Regexp_processor_pcre::fix_owner(Item_func *owner, +/* + This method determines the owner's maybe_null flag. + Generally, the result is NULL-able. However, in case + of a constant pattern and a NOT NULL subject, the + result can also be NOT NULL. + @return true - in case if the constant regex compilation failed + (e.g. due to a wrong regex syntax in the pattern). + The compilation error message is put to the DA in this case. + false - otherwise. +*/ +bool Regexp_processor_pcre::fix_owner(Item_func *owner, Item *subject_arg, Item *pattern_arg) { @@ -6293,16 +6306,30 @@ pattern_arg->const_item() && !pattern_arg->is_expensive()) { - if (compile(pattern_arg, true)) + if (compile(pattern_arg, true/* raise errors to DA, e.g. on bad syntax */)) { owner->set_maybe_null(); // Will always return NULL - return; + if (pattern_arg->null_value) + { + /* + The pattern evaluated to NULL. Regex compilation did not happen. + No errors were put to DA. Continue with maybe_null==true. + The function will return NULL per row. + */ + return false; + } + /* + A syntax error in the pattern, an error was raised to the DA. + Let's abort the query. The caller will send the error to the client. + */ + return true; } set_const(true); owner->base_flags|= subject_arg->base_flags & item_base_t::MAYBE_NULL; } else owner->set_maybe_null(); + return false; } @@ -6314,8 +6341,7 @@ return TRUE; re.init(cmp_collation.collation, 0); - re.fix_owner(this, args[0], args[1]); - return FALSE; + return re.fix_owner(this, args[0], args[1]); } @@ -6339,9 +6365,8 @@ return TRUE; re.init(cmp_collation.collation, 0); - re.fix_owner(this, args[0], args[1]); max_length= MY_INT32_NUM_DECIMAL_DIGITS; // See also Item_func_locate - return FALSE; + return re.fix_owner(this, args[0], args[1]); } diff -Nru mariadb-10.11.6/sql/item_cmpfunc.h mariadb-10.11.9/sql/item_cmpfunc.h --- mariadb-10.11.6/sql/item_cmpfunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_cmpfunc.h 2024-08-03 07:29:58.000000000 +0000 @@ -57,6 +57,7 @@ // when one of arguments is NULL. int set_cmp_func(THD *thd, Item_func_or_sum *owner_arg, + const Type_handler *compare_handler, Item **a1, Item **a2); int compare_not_null_values(longlong val1, longlong val2) @@ -95,11 +96,24 @@ bool set_cmp_func_decimal(THD *thd); inline int set_cmp_func(THD *thd, Item_func_or_sum *owner_arg, - Item **a1, Item **a2, bool set_null_arg) + const Type_handler *compare_handler, + Item **a1, Item **a2, bool set_null_arg) { set_null= set_null_arg; - return set_cmp_func(thd, owner_arg, a1, a2); + return set_cmp_func(thd, owner_arg, compare_handler, a1, a2); } + int set_cmp_func(THD *thd, Item_func_or_sum *owner_arg, + Item **a1, Item **a2, bool set_null_arg) + { + Item *tmp_args[2]= { *a1, *a2 }; + Type_handler_hybrid_field_type tmp; + if (tmp.aggregate_for_comparison(owner_arg->func_name_cstring(), + tmp_args, 2, false)) + return 1; + return set_cmp_func(thd, owner_arg, tmp.type_handler(), + a1, a2, set_null_arg); + } + inline int compare() { return (this->*func)(); } int compare_string(); // compare args[0] & args[1] @@ -281,7 +295,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("istrue") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -302,7 +316,7 @@ return name; } bool find_not_null_fields(table_map allowed) override { return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool eval_not_null_tables(void *) override { not_null_tables_cache= 0; return false; } @@ -323,7 +337,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("isfalse") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -344,7 +358,7 @@ return name; } bool find_not_null_fields(table_map allowed) override { return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool eval_not_null_tables(void *) override { not_null_tables_cache= 0; return false; } @@ -414,12 +428,13 @@ void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge) override; bool invisible_mode(); + bool walk(Item_processor processor, bool walk_subquery, void *arg) override; void reset_cache() { cache= NULL; } void print(String *str, enum_query_type query_type) override; void restore_first_argument(); Item* get_wrapped_in_subselect_item() { return args[1]; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } enum precedence precedence() const override { return args[1]->precedence(); } }; @@ -438,10 +453,10 @@ Item_bool_func2(THD *thd, Item *a, Item *b): Item_bool_func(thd, a, b) { } - bool is_null() { return MY_TEST(args[0]->is_null() || args[1]->is_null()); } + bool is_null() override { return MY_TEST(args[0]->is_null() || args[1]->is_null()); } COND *remove_eq_conds(THD *thd, Item::cond_result *cond_value, - bool top_level); - bool count_sargable_conds(void *arg); + bool top_level) override; + bool count_sargable_conds(void *arg) override; /* Specifies which result type the function uses to compare its arguments. This method is used in equal field propagation. @@ -456,7 +471,7 @@ */ return &type_handler_varchar; } - SEL_TREE *get_mm_tree(RANGE_OPT_PARAM *param, Item **cond_ptr) + SEL_TREE *get_mm_tree(RANGE_OPT_PARAM *param, Item **cond_ptr) override { DBUG_ENTER("Item_bool_func2::get_mm_tree"); DBUG_ASSERT(arg_count == 2); @@ -489,7 +504,7 @@ { protected: SEL_TREE *get_func_mm_tree(RANGE_OPT_PARAM *param, - Field *field, Item *value) + Field *field, Item *value) override { DBUG_ENTER("Item_bool_func2_with_rev::get_func_mm_tree"); Item_func::Functype func_type= @@ -500,7 +515,7 @@ Item_bool_func2_with_rev(THD *thd, Item *a, Item *b): Item_bool_func2(thd, a, b) { } virtual enum Functype rev_functype() const= 0; - SEL_TREE *get_mm_tree(RANGE_OPT_PARAM *param, Item **cond_ptr) + SEL_TREE *get_mm_tree(RANGE_OPT_PARAM *param, Item **cond_ptr) override { DBUG_ENTER("Item_bool_func2_with_rev::get_mm_tree"); DBUG_ASSERT(arg_count == 2); @@ -561,9 +576,17 @@ return this; } bool fix_length_and_dec(THD *thd) override; + bool fix_length_and_dec_generic(THD *thd, + const Type_handler *compare_handler) + { + DBUG_ASSERT(args == tmp_arg); + return cmp.set_cmp_func(thd, this, compare_handler, + tmp_arg, tmp_arg + 1, true/*set_null*/); + } int set_cmp_func(THD *thd) { - return cmp.set_cmp_func(thd, this, tmp_arg, tmp_arg + 1, true); + DBUG_ASSERT(args == tmp_arg); + return cmp.set_cmp_func(thd, this, tmp_arg, tmp_arg + 1, true/*set_null*/); } CHARSET_INFO *compare_collation() const override { return cmp.compare_collation(); } @@ -584,10 +607,10 @@ return add_key_fields_optimize_op(join, key_fields, and_level, usable_tables, sargables, false); } - Item *build_clone(THD *thd) override + Item *do_build_clone(THD *thd) const override { Item_bool_rowready_func2 *clone= - (Item_bool_rowready_func2 *) Item_func::build_clone(thd); + (Item_bool_rowready_func2 *) Item_func::do_build_clone(thd); if (clone) { clone->cmp.comparators= 0; @@ -622,7 +645,7 @@ Item_args::propagate_equal_fields(thd, Context_boolean(), cond); return this; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -642,7 +665,7 @@ Item *neg_transformer(THD *thd) override; bool fix_fields(THD *, Item **) override; void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -695,7 +718,7 @@ void add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level, table_map usable_tables, SARGABLE_PARAM **sargables) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -743,7 +766,7 @@ return name; } Item *neg_transformer(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -786,7 +809,7 @@ uint in_equality_no; uint exists2in_reserved_items() override { return 1; }; friend class Arg_comparator; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -815,7 +838,7 @@ return add_key_fields_optimize_op(join, key_fields, and_level, usable_tables, sargables, true); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -835,7 +858,7 @@ return name; } Item *negated_item(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -855,7 +878,7 @@ return name; } Item *negated_item(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -875,7 +898,7 @@ return name; } Item *negated_item(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -895,7 +918,7 @@ return name; } Item *negated_item(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -920,7 +943,7 @@ Item *negated_item(THD *thd) override; void add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level, table_map usable_tables, SARGABLE_PARAM **sargables) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1018,7 +1041,7 @@ cond); return this; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } longlong val_int_cmp_string(); @@ -1054,7 +1077,7 @@ fix_char_length(2); // returns "1" or "0" or "-1" return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1093,7 +1116,7 @@ str->append(func_name_cstring()); print_args(str, 0, query_type); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1125,7 +1148,7 @@ return name; } table_map not_null_tables() const override { return 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1220,7 +1243,7 @@ } table_map not_null_tables() const override { return 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1243,32 +1266,32 @@ :Item_func_case_abbreviation2(thd, a, b, c) { } - bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override { Datetime_truncation_not_needed dt(thd, find_item(), fuzzydate); return (null_value= dt.copy_to_mysql_time(ltime, mysql_timestamp_type())); } - bool time_op(THD *thd, MYSQL_TIME *ltime) + bool time_op(THD *thd, MYSQL_TIME *ltime) override { return (null_value= Time(find_item()).copy_to_mysql_time(ltime)); } - longlong int_op() + longlong int_op() override { return val_int_from_item(find_item()); } - double real_op() + double real_op() override { return val_real_from_item(find_item()); } - my_decimal *decimal_op(my_decimal *decimal_value) + my_decimal *decimal_op(my_decimal *decimal_value) override { return val_decimal_from_item(find_item(), decimal_value); } - String *str_op(String *str) + String *str_op(String *str) override { return val_str_from_item(find_item(), str); } - bool native_op(THD *thd, Native *to) + bool native_op(THD *thd, Native *to) override { return val_native_with_conversion_from_item(thd, find_item(), to, type_handler()); @@ -1299,7 +1322,7 @@ bool eval_not_null_tables(void *opt_arg) override; void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } private: void cache_type_info(Item *source); @@ -1325,7 +1348,7 @@ { return fix_length_and_dec2_eliminate_null(args + 1); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1419,7 +1442,7 @@ cond, &args[2]); return this; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } Item *derived_field_transformer_for_having(THD *thd, uchar *arg) override { reset_first_arg_if_needed(); return this; } @@ -1585,8 +1608,8 @@ in_temporal(THD *thd, uint elements) :in_longlong(thd, elements) {}; - Item *create_item(THD *thd); - void value_to_item(uint pos, Item *item) + Item *create_item(THD *thd) override; + void value_to_item(uint pos, Item *item) override { packed_longlong *val= reinterpret_cast(base)+pos; Item_datetime *dt= static_cast(item); @@ -1723,7 +1746,7 @@ cmp_item_sort_string(CHARSET_INFO *cs): cmp_item_string(cs), value(value_buff, sizeof(value_buff), cs) {} - void store_value(Item *item) + void store_value(Item *item) override { value_res= item->val_str(&value); m_null_value= item->null_value; @@ -1735,13 +1758,13 @@ value_res= &value; } } - int cmp_not_null(const Value *val) + int cmp_not_null(const Value *val) override { DBUG_ASSERT(!val->is_null()); DBUG_ASSERT(val->is_string()); return sortcmp(value_res, &val->m_string, cmp_charset) != 0; } - int cmp(Item *arg) + int cmp(Item *arg) override { char buff[STRING_BUFFER_USUAL_SIZE]; String tmp(buff, sizeof(buff), cmp_charset), *res= arg->val_str(&tmp); @@ -1754,12 +1777,12 @@ else return TRUE; } - int compare(cmp_item *ci) + int compare(cmp_item *ci) override { cmp_item_string *l_cmp= (cmp_item_string *) ci; return sortcmp(value_res, l_cmp->value_res, cmp_charset); - } - cmp_item *make_same(THD *thd); + } + cmp_item *make_same(THD *thd) override; void set_charset(CHARSET_INFO *cs) { cmp_charset= cs; @@ -1772,28 +1795,28 @@ longlong value; public: cmp_item_int() = default; /* Remove gcc warning */ - void store_value(Item *item) + void store_value(Item *item) override { value= item->val_int(); m_null_value= item->null_value; } - int cmp_not_null(const Value *val) + int cmp_not_null(const Value *val) override { DBUG_ASSERT(!val->is_null()); DBUG_ASSERT(val->is_longlong()); return value != val->value.m_longlong; } - int cmp(Item *arg) + int cmp(Item *arg) override { const bool rc= value != arg->val_int(); return (m_null_value || arg->null_value) ? UNKNOWN : rc; } - int compare(cmp_item *ci) + int compare(cmp_item *ci) override { cmp_item_int *l_cmp= (cmp_item_int *)ci; return (value < l_cmp->value) ? -1 : ((value == l_cmp->value) ? 0 : 1); } - cmp_item *make_same(THD *thd); + cmp_item *make_same(THD *thd) override; }; /* @@ -1805,7 +1828,7 @@ longlong value; public: cmp_item_temporal() = default; - int compare(cmp_item *ci); + int compare(cmp_item *ci) override; }; @@ -1815,14 +1838,14 @@ cmp_item_datetime() :cmp_item_temporal() { } - void store_value(Item *item) + void store_value(Item *item) override { value= item->val_datetime_packed(current_thd); m_null_value= item->null_value; } - int cmp_not_null(const Value *val); - int cmp(Item *arg); - cmp_item *make_same(THD *thd); + int cmp_not_null(const Value *val) override; + int cmp(Item *arg) override; + cmp_item *make_same(THD *thd) override; }; @@ -1832,14 +1855,14 @@ cmp_item_time() :cmp_item_temporal() { } - void store_value(Item *item) + void store_value(Item *item) override { value= item->val_time_packed(current_thd); m_null_value= item->null_value; } - int cmp_not_null(const Value *val); - int cmp(Item *arg); - cmp_item *make_same(THD *thd); + int cmp_not_null(const Value *val) override; + int cmp(Item *arg) override; + cmp_item *make_same(THD *thd) override; }; @@ -1848,11 +1871,11 @@ Timestamp_or_zero_datetime_native m_native; public: cmp_item_timestamp() :cmp_item_scalar() { } - void store_value(Item *item); - int cmp_not_null(const Value *val); - int cmp(Item *arg); - int compare(cmp_item *ci); - cmp_item *make_same(THD *thd); + void store_value(Item *item) override; + int cmp_not_null(const Value *val) override; + int cmp(Item *arg) override; + int compare(cmp_item *ci) override; + cmp_item *make_same(THD *thd) override; }; @@ -1861,28 +1884,28 @@ double value; public: cmp_item_real() = default; /* Remove gcc warning */ - void store_value(Item *item) + void store_value(Item *item) override { value= item->val_real(); m_null_value= item->null_value; } - int cmp_not_null(const Value *val) + int cmp_not_null(const Value *val) override { DBUG_ASSERT(!val->is_null()); DBUG_ASSERT(val->is_double()); return value != val->value.m_double; } - int cmp(Item *arg) + int cmp(Item *arg) override { const bool rc= value != arg->val_real(); return (m_null_value || arg->null_value) ? UNKNOWN : rc; } - int compare(cmp_item *ci) + int compare(cmp_item *ci) override { cmp_item_real *l_cmp= (cmp_item_real *) ci; return (value < l_cmp->value)? -1 : ((value == l_cmp->value) ? 0 : 1); } - cmp_item *make_same(THD *thd); + cmp_item *make_same(THD *thd) override; }; @@ -1891,11 +1914,11 @@ my_decimal value; public: cmp_item_decimal() = default; /* Remove gcc warning */ - void store_value(Item *item); - int cmp(Item *arg); - int cmp_not_null(const Value *val); - int compare(cmp_item *c); - cmp_item *make_same(THD *thd); + void store_value(Item *item) override; + int cmp(Item *arg) override; + int cmp_not_null(const Value *val) override; + int compare(cmp_item *c) override; + cmp_item *make_same(THD *thd) override; }; @@ -1911,28 +1934,28 @@ public: cmp_item_sort_string_in_static(CHARSET_INFO *cs): cmp_item_string(cs) {} - void store_value(Item *item) + void store_value(Item *item) override { value_res= item->val_str(&value); m_null_value= item->null_value; } - int cmp_not_null(const Value *val) + int cmp_not_null(const Value *val) override { DBUG_ASSERT(false); return TRUE; } - int cmp(Item *item) + int cmp(Item *item) override { // Should never be called DBUG_ASSERT(false); return TRUE; } - int compare(cmp_item *ci) + int compare(cmp_item *ci) override { cmp_item_string *l_cmp= (cmp_item_string *) ci; return sortcmp(value_res, l_cmp->value_res, cmp_charset); } - cmp_item *make_same(THD *thd) + cmp_item *make_same(THD *) override { return new cmp_item_sort_string_in_static(cmp_charset); } @@ -2369,7 +2392,7 @@ return this; } Item *find_item() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2419,7 +2442,7 @@ Item *propagate_equal_fields(THD *thd, const Context &ctx, COND_EQUAL *cond) override; Item *find_item() override; - Item *build_clone(THD *thd) override + Item *do_build_clone(THD *thd) const override { Item_func_case_simple *clone= (Item_func_case_simple *) Item_func_case::build_clone(thd); @@ -2428,7 +2451,7 @@ return NULL; return clone; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2439,15 +2462,16 @@ Item_func_decode_oracle(THD *thd, List &list) :Item_func_case_simple(thd, list) { } + const Schema *schema() const override { return &oracle_schema_ref; } LEX_CSTRING func_name_cstring() const override { - static LEX_CSTRING name= {STRING_WITH_LEN("decode_oracle") }; + static LEX_CSTRING name= {STRING_WITH_LEN("decode") }; return name; } void print(String *str, enum_query_type query_type) override; bool fix_length_and_dec(THD *thd) override; Item *find_item() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2619,11 +2643,11 @@ void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge) override; bool count_sargable_conds(void *arg) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } - Item *build_clone(THD *thd) override + Item *do_build_clone(THD *thd) const override { - Item_func_in *clone= (Item_func_in *) Item_func::build_clone(thd); + Item_func_in *clone= (Item_func_in *) Item_func::do_build_clone(thd); if (clone) { clone->array= 0; @@ -2658,7 +2682,7 @@ bool prepare_comparators(THD *, const LEX_CSTRING &funcname, const Item_args *args, uint level); int cmp(Item *arg) override; - int cmp_not_null(const Value *val) override + int cmp_not_null(const Value *) override { DBUG_ASSERT(false); return TRUE; @@ -2771,7 +2795,7 @@ table_map not_null_tables() const override { return 0; } bool find_not_null_fields(table_map allowed) override; Item *neg_transformer(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2824,7 +2848,7 @@ { return is_top_level_item() ? not_null_tables_cache : 0; } Item *neg_transformer(THD *thd) override; void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2987,7 +3011,7 @@ bool find_selective_predicates_list_processor(void *arg) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3020,11 +3044,11 @@ m_pcre(NULL), m_pcre_match_data(NULL), m_conversion_is_needed(true), m_is_const(0), m_library_flags(0), - m_library_charset(&my_charset_utf8mb3_general_ci) + m_library_charset(&my_charset_utf8mb4_general_ci) {} int default_regex_flags(); void init(CHARSET_INFO *data_charset, int extra_flags); - void fix_owner(Item_func *owner, Item *subject_arg, Item *pattern_arg); + bool fix_owner(Item_func *owner, Item *subject_arg, Item *pattern_arg); bool compile(String *pattern, bool send_error); bool compile(Item *item, bool send_error); bool recompile(Item *item) @@ -3084,7 +3108,7 @@ return name; } enum precedence precedence() const override { return IN_PRECEDENCE; } - Item *get_copy(THD *) override { return 0; } + Item *do_get_copy(THD *thd) const override { return 0; } void print(String *str, enum_query_type query_type) override { print_op(str, query_type); @@ -3128,7 +3152,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("regexp_instr") }; return name; } - Item *get_copy(THD *thd) override { return 0; } + Item *do_get_copy(THD *thd) const override { return 0; } }; @@ -3227,7 +3251,7 @@ } bool eval_not_null_tables(void *opt_arg) override; bool find_not_null_fields(table_map allowed) override; - Item *build_clone(THD *thd) override; + Item *do_build_clone(THD *thd) const override; bool excl_dep_on_table(table_map tab_map) override; bool excl_dep_on_grouping_fields(st_select_lex *sel) override; @@ -3416,7 +3440,7 @@ void set_context_field(Item_field *ctx_field) { context_field= ctx_field; } void set_link_equal_fields(bool flag) { link_equal_fields= flag; } - Item* get_copy(THD *thd) override { return 0; } + Item* do_get_copy(THD *thd) const override { return 0; } /* This does not comply with the specification of the virtual method, but Item_equal items are processed distinguishly anyway @@ -3492,13 +3516,11 @@ { protected: Item_equal *item_equal; - Item *curr_item; + Item *curr_item= nullptr; public: Item_equal_iterator(Item_equal &item_eq) - :LI (item_eq.equal_items) + :LI (item_eq.equal_items), item_equal(&item_eq) { - curr_item= NULL; - item_equal= &item_eq; if (item_eq.with_const) { LI *list_it= this; @@ -3589,7 +3611,7 @@ table_map usable_tables, SARGABLE_PARAM **sargables) override; SEL_TREE *get_mm_tree(RANGE_OPT_PARAM *param, Item **cond_ptr) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3617,7 +3639,7 @@ table_map not_null_tables() const override { return and_tables_cache; } Item *copy_andor_structure(THD *thd) override; Item *neg_transformer(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3632,7 +3654,7 @@ return name; } bool need_parentheses_in_default() override { return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3648,7 +3670,7 @@ return name; } bool need_parentheses_in_default() override { return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3659,11 +3681,11 @@ Item_func_cursor_bool_attr(THD *thd, const LEX_CSTRING *name, uint offset) :Item_bool_func(thd), Cursor_ref(name, offset) { } - bool check_vcol_func_processor(void *arg) + bool check_vcol_func_processor(void *arg) override { return mark_unsupported_function(func_name(), arg, VCOL_SESSION_FUNC); } - void print(String *str, enum_query_type query_type) + void print(String *str, enum_query_type query_type) override { Cursor_ref::print_func(str, func_name_cstring()); } @@ -3681,7 +3703,7 @@ return name; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3700,7 +3722,7 @@ return name; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3719,7 +3741,7 @@ return name; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3758,11 +3780,11 @@ public: Eq_creator() = default; /* Remove gcc warning */ virtual ~Eq_creator() = default; /* Remove gcc warning */ - Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; - Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; - const char* symbol(bool invert) const { return invert? "<>" : "="; } - bool eqne_op() const { return 1; } - bool l_op() const { return 0; } + Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const override; + Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const override; + const char* symbol(bool invert) const override { return invert? "<>" : "="; } + bool eqne_op() const override { return 1; } + bool l_op() const override { return 0; } }; class Ne_creator :public Comp_creator @@ -3770,11 +3792,11 @@ public: Ne_creator() = default; /* Remove gcc warning */ virtual ~Ne_creator() = default; /* Remove gcc warning */ - Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; - Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; - const char* symbol(bool invert) const { return invert? "=" : "<>"; } - bool eqne_op() const { return 1; } - bool l_op() const { return 0; } + Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const override; + Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const override; + const char* symbol(bool invert) const override { return invert? "=" : "<>"; } + bool eqne_op() const override { return 1; } + bool l_op() const override { return 0; } }; class Gt_creator :public Comp_creator @@ -3782,11 +3804,11 @@ public: Gt_creator() = default; /* Remove gcc warning */ virtual ~Gt_creator() = default; /* Remove gcc warning */ - Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; - Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; - const char* symbol(bool invert) const { return invert? "<=" : ">"; } - bool eqne_op() const { return 0; } - bool l_op() const { return 0; } + Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const override; + Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const override; + const char* symbol(bool invert) const override { return invert? "<=" : ">"; } + bool eqne_op() const override { return 0; } + bool l_op() const override { return 0; } }; class Lt_creator :public Comp_creator @@ -3794,11 +3816,11 @@ public: Lt_creator() = default; /* Remove gcc warning */ virtual ~Lt_creator() = default; /* Remove gcc warning */ - Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; - Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; - const char* symbol(bool invert) const { return invert? ">=" : "<"; } - bool eqne_op() const { return 0; } - bool l_op() const { return 1; } + Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const override; + Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const override; + const char* symbol(bool invert) const override { return invert? ">=" : "<"; } + bool eqne_op() const override { return 0; } + bool l_op() const override { return 1; } }; class Ge_creator :public Comp_creator @@ -3806,11 +3828,11 @@ public: Ge_creator() = default; /* Remove gcc warning */ virtual ~Ge_creator() = default; /* Remove gcc warning */ - Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; - Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; - const char* symbol(bool invert) const { return invert? "<" : ">="; } - bool eqne_op() const { return 0; } - bool l_op() const { return 0; } + Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const override; + Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const override; + const char* symbol(bool invert) const override { return invert? "<" : ">="; } + bool eqne_op() const override { return 0; } + bool l_op() const override { return 0; } }; class Le_creator :public Comp_creator @@ -3818,11 +3840,11 @@ public: Le_creator() = default; /* Remove gcc warning */ virtual ~Le_creator() = default; /* Remove gcc warning */ - Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const; - Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const; - const char* symbol(bool invert) const { return invert? ">" : "<="; } - bool eqne_op() const { return 0; } - bool l_op() const { return 1; } + Item_bool_rowready_func2* create(THD *thd, Item *a, Item *b) const override; + Item_bool_rowready_func2* create_swap(THD *thd, Item *a, Item *b) const override; + const char* symbol(bool invert) const override { return invert? ">" : "<="; } + bool eqne_op() const override { return 0; } + bool l_op() const override { return 1; } }; /* diff -Nru mariadb-10.11.6/sql/item_create.cc mariadb-10.11.9/sql/item_create.cc --- mariadb-10.11.6/sql/item_create.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_create.cc 2024-08-03 07:29:58.000000000 +0000 @@ -67,10 +67,10 @@ class Create_sp_func : public Create_qfunc { public: - virtual Item *create_with_db(THD *thd, + Item *create_with_db(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *name, - bool use_explicit_name, List *item_list); + bool use_explicit_name, List *item_list) override; static Create_sp_func s_singleton; @@ -78,7 +78,7 @@ /** Constructor. */ Create_sp_func() = default; /** Destructor. */ - virtual ~Create_sp_func() = default; + ~Create_sp_func() override = default; }; @@ -91,319 +91,359 @@ class Create_func_abs : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_abs s_singleton; protected: Create_func_abs() = default; - virtual ~Create_func_abs() = default; + ~Create_func_abs() override = default; }; class Create_func_acos : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_acos s_singleton; protected: Create_func_acos() = default; - virtual ~Create_func_acos() = default; + ~Create_func_acos() override = default; }; class Create_func_addtime : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_addtime s_singleton; protected: Create_func_addtime() = default; - virtual ~Create_func_addtime() = default; + ~Create_func_addtime() override = default; +}; + + +class Create_func_addmonths : public Create_func_arg2 +{ +public: + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; + + static Create_func_addmonths s_singleton; + +protected: + Create_func_addmonths() = default; + virtual ~Create_func_addmonths() = default; }; class Create_func_aes_encrypt : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_aes_encrypt s_singleton; protected: Create_func_aes_encrypt() = default; - virtual ~Create_func_aes_encrypt() = default; + ~Create_func_aes_encrypt() override = default; }; class Create_func_aes_decrypt : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_aes_decrypt s_singleton; protected: Create_func_aes_decrypt() = default; - virtual ~Create_func_aes_decrypt() = default; + ~Create_func_aes_decrypt() override = default; }; class Create_func_asin : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_asin s_singleton; protected: Create_func_asin() = default; - virtual ~Create_func_asin() = default; + ~Create_func_asin() override = default; }; class Create_func_atan : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_atan s_singleton; protected: Create_func_atan() = default; - virtual ~Create_func_atan() = default; + ~Create_func_atan() override = default; }; class Create_func_benchmark : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_benchmark s_singleton; protected: Create_func_benchmark() = default; - virtual ~Create_func_benchmark() = default; + ~Create_func_benchmark() override = default; }; class Create_func_bin : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_bin s_singleton; protected: Create_func_bin() = default; - virtual ~Create_func_bin() = default; + ~Create_func_bin() override = default; }; class Create_func_binlog_gtid_pos : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_binlog_gtid_pos s_singleton; protected: Create_func_binlog_gtid_pos() = default; - virtual ~Create_func_binlog_gtid_pos() = default; + ~Create_func_binlog_gtid_pos() override = default; }; class Create_func_bit_count : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_bit_count s_singleton; protected: Create_func_bit_count() = default; - virtual ~Create_func_bit_count() = default; + ~Create_func_bit_count() override = default; }; class Create_func_bit_length : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_bit_length s_singleton; protected: Create_func_bit_length() = default; - virtual ~Create_func_bit_length() = default; + ~Create_func_bit_length() override = default; }; class Create_func_ceiling : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_ceiling s_singleton; protected: Create_func_ceiling() = default; - virtual ~Create_func_ceiling() = default; + ~Create_func_ceiling() override = default; +}; + + +class Create_func_collation : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override; + + static Create_func_collation s_singleton; + +protected: + Create_func_collation() = default; + virtual ~Create_func_collation() = default; }; class Create_func_chr : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_chr s_singleton; protected: Create_func_chr() = default; - virtual ~Create_func_chr() = default; + ~Create_func_chr() override = default; }; class Create_func_char_length : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_char_length s_singleton; protected: Create_func_char_length() = default; - virtual ~Create_func_char_length() = default; + ~Create_func_char_length() override = default; }; class Create_func_coercibility : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_coercibility s_singleton; protected: Create_func_coercibility() = default; - virtual ~Create_func_coercibility() = default; + ~Create_func_coercibility() override = default; }; class Create_func_dyncol_check : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_dyncol_check s_singleton; protected: Create_func_dyncol_check() = default; - virtual ~Create_func_dyncol_check() = default; + ~Create_func_dyncol_check() override = default; }; class Create_func_dyncol_exists : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_dyncol_exists s_singleton; protected: Create_func_dyncol_exists() = default; - virtual ~Create_func_dyncol_exists() = default; + ~Create_func_dyncol_exists() override = default; }; class Create_func_dyncol_list : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_dyncol_list s_singleton; protected: Create_func_dyncol_list() = default; - virtual ~Create_func_dyncol_list() = default; + ~Create_func_dyncol_list() override = default; }; class Create_func_dyncol_json : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_dyncol_json s_singleton; protected: Create_func_dyncol_json() = default; - virtual ~Create_func_dyncol_json() = default; + ~Create_func_dyncol_json() override = default; +}; + + +class Create_func_coalesce : public Create_native_func +{ +public: + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; + + static Create_func_coalesce s_singleton; + +protected: + Create_func_coalesce() = default; + virtual ~Create_func_coalesce() = default; }; class Create_func_compress : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_compress s_singleton; protected: Create_func_compress() = default; - virtual ~Create_func_compress() = default; + ~Create_func_compress() override = default; }; class Create_func_concat : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_concat s_singleton; protected: Create_func_concat() = default; - virtual ~Create_func_concat() = default; + ~Create_func_concat() override = default; }; class Create_func_concat_operator_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_concat_operator_oracle s_singleton; protected: Create_func_concat_operator_oracle() = default; - virtual ~Create_func_concat_operator_oracle() = default; + ~Create_func_concat_operator_oracle() override = default; }; class Create_func_decode_histogram : public Create_func_arg2 { public: - Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_decode_histogram s_singleton; protected: Create_func_decode_histogram() = default; - virtual ~Create_func_decode_histogram() = default; + ~Create_func_decode_histogram() override = default; }; class Create_func_decode_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override { if (unlikely(!item_list || item_list->elements < 3)) { @@ -417,19 +457,16 @@ protected: Create_func_decode_oracle() = default; - virtual ~Create_func_decode_oracle() = default; + ~Create_func_decode_oracle() override = default; }; class Create_func_decode : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override { - if (thd->variables.sql_mode & MODE_ORACLE) - return Create_func_decode_oracle::s_singleton.create_native(thd, name, - item_list); if (unlikely(!item_list || item_list->elements != 2)) { my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str); @@ -444,99 +481,112 @@ protected: Create_func_decode() {} - virtual ~Create_func_decode() {} + ~Create_func_decode() override {} }; class Create_func_concat_ws : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_concat_ws s_singleton; protected: Create_func_concat_ws() = default; - virtual ~Create_func_concat_ws() = default; + ~Create_func_concat_ws() override = default; }; class Create_func_connection_id : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_connection_id s_singleton; protected: Create_func_connection_id() = default; - virtual ~Create_func_connection_id() = default; + ~Create_func_connection_id() override = default; +}; + + +class Create_func_database : public Create_func_arg0 +{ +public: + Item *create_builder(THD *thd) override; + + static Create_func_database s_singleton; + +protected: + Create_func_database() = default; + virtual ~Create_func_database() = default; }; class Create_func_nvl2 : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override; static Create_func_nvl2 s_singleton; protected: Create_func_nvl2() = default; - virtual ~Create_func_nvl2() = default; + ~Create_func_nvl2() override = default; }; class Create_func_conv : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override; static Create_func_conv s_singleton; protected: Create_func_conv() = default; - virtual ~Create_func_conv() = default; + ~Create_func_conv() override = default; }; class Create_func_convert_tz : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override; static Create_func_convert_tz s_singleton; protected: Create_func_convert_tz() = default; - virtual ~Create_func_convert_tz() = default; + ~Create_func_convert_tz() override = default; }; class Create_func_cos : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_cos s_singleton; protected: Create_func_cos() = default; - virtual ~Create_func_cos() = default; + ~Create_func_cos() override = default; }; class Create_func_cot : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_cot s_singleton; protected: Create_func_cot() = default; - virtual ~Create_func_cot() = default; + ~Create_func_cot() override = default; }; @@ -550,7 +600,7 @@ protected: Create_func_crc32() = default; - virtual ~Create_func_crc32() = default; + ~Create_func_crc32() override = default; }; @@ -571,393 +621,409 @@ class Create_func_datediff : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_datediff s_singleton; protected: Create_func_datediff() = default; - virtual ~Create_func_datediff() = default; + ~Create_func_datediff() override = default; +}; + + +class Create_func_date_format : public Create_native_func +{ +public: + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; + + static Create_func_date_format s_singleton; + +protected: + Create_func_date_format() = default; + virtual ~Create_func_date_format() = default; }; + + class Create_func_dayname : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_dayname s_singleton; protected: Create_func_dayname() = default; - virtual ~Create_func_dayname() = default; + ~Create_func_dayname() override = default; }; class Create_func_dayofmonth : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_dayofmonth s_singleton; protected: Create_func_dayofmonth() = default; - virtual ~Create_func_dayofmonth() = default; + ~Create_func_dayofmonth() override = default; }; class Create_func_dayofweek : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_dayofweek s_singleton; protected: Create_func_dayofweek() = default; - virtual ~Create_func_dayofweek() = default; + ~Create_func_dayofweek() override = default; }; class Create_func_dayofyear : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_dayofyear s_singleton; protected: Create_func_dayofyear() = default; - virtual ~Create_func_dayofyear() = default; + ~Create_func_dayofyear() override = default; }; class Create_func_degrees : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_degrees s_singleton; protected: Create_func_degrees() = default; - virtual ~Create_func_degrees() = default; + ~Create_func_degrees() override = default; }; class Create_func_des_decrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_des_decrypt s_singleton; protected: Create_func_des_decrypt() = default; - virtual ~Create_func_des_decrypt() = default; + ~Create_func_des_decrypt() override = default; }; class Create_func_des_encrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_des_encrypt s_singleton; protected: Create_func_des_encrypt() = default; - virtual ~Create_func_des_encrypt() = default; + ~Create_func_des_encrypt() override = default; }; class Create_func_elt : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_elt s_singleton; protected: Create_func_elt() = default; - virtual ~Create_func_elt() = default; + ~Create_func_elt() override = default; }; class Create_func_encode : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_encode s_singleton; protected: Create_func_encode() = default; - virtual ~Create_func_encode() = default; + ~Create_func_encode() override = default; }; class Create_func_encrypt : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_encrypt s_singleton; protected: Create_func_encrypt() = default; - virtual ~Create_func_encrypt() = default; + ~Create_func_encrypt() override = default; }; class Create_func_exp : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_exp s_singleton; protected: Create_func_exp() = default; - virtual ~Create_func_exp() = default; + ~Create_func_exp() override = default; }; class Create_func_export_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_export_set s_singleton; protected: Create_func_export_set() = default; - virtual ~Create_func_export_set() = default; + ~Create_func_export_set() override = default; }; class Create_func_field : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_field s_singleton; protected: Create_func_field() = default; - virtual ~Create_func_field() = default; + ~Create_func_field() override = default; }; class Create_func_find_in_set : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_find_in_set s_singleton; protected: Create_func_find_in_set() = default; - virtual ~Create_func_find_in_set() = default; + ~Create_func_find_in_set() override = default; }; class Create_func_floor : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_floor s_singleton; protected: Create_func_floor() = default; - virtual ~Create_func_floor() = default; + ~Create_func_floor() override = default; }; class Create_func_format : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_format s_singleton; protected: Create_func_format() = default; - virtual ~Create_func_format() = default; + ~Create_func_format() override = default; }; class Create_func_found_rows : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_found_rows s_singleton; protected: Create_func_found_rows() = default; - virtual ~Create_func_found_rows() = default; + ~Create_func_found_rows() override = default; }; class Create_func_from_base64 : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_from_base64 s_singleton; protected: Create_func_from_base64() = default; - virtual ~Create_func_from_base64() = default; + ~Create_func_from_base64() override = default; }; class Create_func_from_days : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_from_days s_singleton; protected: Create_func_from_days() = default; - virtual ~Create_func_from_days() = default; + ~Create_func_from_days() override = default; }; class Create_func_from_unixtime : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_from_unixtime s_singleton; protected: Create_func_from_unixtime() = default; - virtual ~Create_func_from_unixtime() = default; + ~Create_func_from_unixtime() override = default; }; class Create_func_get_lock : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_get_lock s_singleton; protected: Create_func_get_lock() = default; - virtual ~Create_func_get_lock() = default; + ~Create_func_get_lock() override = default; }; class Create_func_greatest : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_greatest s_singleton; protected: Create_func_greatest() = default; - virtual ~Create_func_greatest() = default; + ~Create_func_greatest() override = default; }; class Create_func_hex : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_hex s_singleton; protected: Create_func_hex() = default; - virtual ~Create_func_hex() = default; + ~Create_func_hex() override = default; }; class Create_func_ifnull : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_ifnull s_singleton; protected: Create_func_ifnull() = default; - virtual ~Create_func_ifnull() = default; + ~Create_func_ifnull() override = default; }; class Create_func_instr : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_instr s_singleton; protected: Create_func_instr() = default; - virtual ~Create_func_instr() = default; + ~Create_func_instr() override = default; }; class Create_func_is_free_lock : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_is_free_lock s_singleton; protected: Create_func_is_free_lock() = default; - virtual ~Create_func_is_free_lock() = default; + ~Create_func_is_free_lock() override = default; }; class Create_func_is_used_lock : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_is_used_lock s_singleton; protected: Create_func_is_used_lock() = default; - virtual ~Create_func_is_used_lock() = default; + ~Create_func_is_used_lock() override = default; }; class Create_func_isnull : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_isnull s_singleton; protected: Create_func_isnull() = default; - virtual ~Create_func_isnull() = default; + ~Create_func_isnull() override = default; }; class Create_func_json_normalize : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_normalize s_singleton; @@ -970,7 +1036,7 @@ class Create_func_json_equals : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_json_equals s_singleton; @@ -983,375 +1049,375 @@ class Create_func_json_exists : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_json_exists s_singleton; protected: Create_func_json_exists() = default; - virtual ~Create_func_json_exists() = default; + ~Create_func_json_exists() override = default; }; class Create_func_json_valid : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_valid s_singleton; protected: Create_func_json_valid() = default; - virtual ~Create_func_json_valid() = default; + ~Create_func_json_valid() override = default; }; class Create_func_json_compact : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_compact s_singleton; protected: Create_func_json_compact() = default; - virtual ~Create_func_json_compact() = default; + ~Create_func_json_compact() override = default; }; class Create_func_json_loose : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_loose s_singleton; protected: Create_func_json_loose() = default; - virtual ~Create_func_json_loose() = default; + ~Create_func_json_loose() override = default; }; class Create_func_json_detailed: public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_detailed s_singleton; protected: Create_func_json_detailed() = default; - virtual ~Create_func_json_detailed() = default; + ~Create_func_json_detailed() override = default; }; class Create_func_json_type : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_type s_singleton; protected: Create_func_json_type() = default; - virtual ~Create_func_json_type() = default; + ~Create_func_json_type() override = default; }; class Create_func_json_depth : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_depth s_singleton; protected: Create_func_json_depth() = default; - virtual ~Create_func_json_depth() = default; + ~Create_func_json_depth() override = default; }; class Create_func_json_value : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_json_value s_singleton; protected: Create_func_json_value() = default; - virtual ~Create_func_json_value() = default; + ~Create_func_json_value() override = default; }; class Create_func_json_query : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_json_query s_singleton; protected: Create_func_json_query() = default; - virtual ~Create_func_json_query() = default; + ~Create_func_json_query() override = default; }; class Create_func_json_keys: public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_keys s_singleton; protected: Create_func_json_keys() = default; - virtual ~Create_func_json_keys() = default; + ~Create_func_json_keys() override = default; }; class Create_func_json_contains: public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_contains s_singleton; protected: Create_func_json_contains() = default; - virtual ~Create_func_json_contains() = default; + ~Create_func_json_contains() override = default; }; class Create_func_json_contains_path : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_contains_path s_singleton; protected: Create_func_json_contains_path() = default; - virtual ~Create_func_json_contains_path() = default; + ~Create_func_json_contains_path() override = default; }; class Create_func_json_extract : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_extract s_singleton; protected: Create_func_json_extract() = default; - virtual ~Create_func_json_extract() = default; + ~Create_func_json_extract() override = default; }; class Create_func_json_search : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_search s_singleton; protected: Create_func_json_search() = default; - virtual ~Create_func_json_search() = default; + ~Create_func_json_search() override = default; }; class Create_func_json_array : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_array s_singleton; protected: Create_func_json_array() = default; - virtual ~Create_func_json_array() = default; + ~Create_func_json_array() override = default; }; class Create_func_json_array_append : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_array_append s_singleton; protected: Create_func_json_array_append() = default; - virtual ~Create_func_json_array_append() = default; + ~Create_func_json_array_append() override = default; }; class Create_func_json_array_insert : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_array_insert s_singleton; protected: Create_func_json_array_insert() = default; - virtual ~Create_func_json_array_insert() = default; + ~Create_func_json_array_insert() override = default; }; class Create_func_json_insert : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_insert s_singleton; protected: Create_func_json_insert() = default; - virtual ~Create_func_json_insert() = default; + ~Create_func_json_insert() override = default; }; class Create_func_json_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_set s_singleton; protected: Create_func_json_set() = default; - virtual ~Create_func_json_set() = default; + ~Create_func_json_set() override = default; }; class Create_func_json_replace : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_replace s_singleton; protected: Create_func_json_replace() = default; - virtual ~Create_func_json_replace() = default; + ~Create_func_json_replace() override = default; }; class Create_func_json_remove : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_remove s_singleton; protected: Create_func_json_remove() = default; - virtual ~Create_func_json_remove() = default; + ~Create_func_json_remove() override = default; }; class Create_func_json_object : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_object s_singleton; protected: Create_func_json_object() = default; - virtual ~Create_func_json_object() = default; + ~Create_func_json_object() override = default; }; class Create_func_json_length : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_length s_singleton; protected: Create_func_json_length() = default; - virtual ~Create_func_json_length() = default; + ~Create_func_json_length() override = default; }; class Create_func_json_merge : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_merge s_singleton; protected: Create_func_json_merge() = default; - virtual ~Create_func_json_merge() = default; + ~Create_func_json_merge() override = default; }; class Create_func_json_merge_patch : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_json_merge_patch s_singleton; protected: Create_func_json_merge_patch() = default; - virtual ~Create_func_json_merge_patch() = default; + ~Create_func_json_merge_patch() override = default; }; class Create_func_json_quote : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_quote s_singleton; protected: Create_func_json_quote() = default; - virtual ~Create_func_json_quote() = default; + ~Create_func_json_quote() override = default; }; class Create_func_json_unquote : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_json_unquote s_singleton; protected: Create_func_json_unquote() = default; - virtual ~Create_func_json_unquote() = default; + ~Create_func_json_unquote() override = default; }; class Create_func_json_overlaps: public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_json_overlaps s_singleton; @@ -1364,79 +1430,104 @@ class Create_func_last_day : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_last_day s_singleton; protected: Create_func_last_day() = default; - virtual ~Create_func_last_day() = default; + ~Create_func_last_day() override = default; }; class Create_func_last_insert_id : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_last_insert_id s_singleton; protected: Create_func_last_insert_id() = default; - virtual ~Create_func_last_insert_id() = default; + ~Create_func_last_insert_id() override = default; }; class Create_func_lcase : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_lcase s_singleton; protected: Create_func_lcase() = default; - virtual ~Create_func_lcase() = default; + ~Create_func_lcase() override = default; }; class Create_func_least : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_least s_singleton; protected: Create_func_least() = default; - virtual ~Create_func_least() = default; + ~Create_func_least() override = default; }; class Create_func_length : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_length s_singleton; protected: Create_func_length() = default; - virtual ~Create_func_length() = default; + ~Create_func_length() override = default; }; class Create_func_octet_length : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_octet_length s_singleton; protected: Create_func_octet_length() = default; - virtual ~Create_func_octet_length() = default; + ~Create_func_octet_length() override = default; +}; + +class Create_func_old_password : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override; + + static Create_func_old_password s_singleton; + +protected: + Create_func_old_password() = default; + virtual ~Create_func_old_password() = default; +}; + + +class Create_func_password : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override; + + static Create_func_password s_singleton; + +protected: + Create_func_password() = default; + virtual ~Create_func_password() = default; }; @@ -1444,26 +1535,26 @@ class Create_func_like_range_min : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_like_range_min s_singleton; protected: Create_func_like_range_min() = default; - virtual ~Create_func_like_range_min() = default; + ~Create_func_like_range_min() override = default; }; class Create_func_like_range_max : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_like_range_max s_singleton; protected: Create_func_like_range_max() = default; - virtual ~Create_func_like_range_max() = default; + ~Create_func_like_range_max() override = default; }; #endif @@ -1471,98 +1562,96 @@ class Create_func_ln : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_ln s_singleton; protected: Create_func_ln() = default; - virtual ~Create_func_ln() = default; + ~Create_func_ln() override = default; }; class Create_func_load_file : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_load_file s_singleton; protected: Create_func_load_file() = default; - virtual ~Create_func_load_file() = default; + ~Create_func_load_file() override = default; }; class Create_func_locate : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_locate s_singleton; protected: Create_func_locate() = default; - virtual ~Create_func_locate() = default; + ~Create_func_locate() override = default; }; class Create_func_log : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_log s_singleton; protected: Create_func_log() = default; - virtual ~Create_func_log() = default; + ~Create_func_log() override = default; }; class Create_func_log10 : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_log10 s_singleton; protected: Create_func_log10() = default; - virtual ~Create_func_log10() = default; + ~Create_func_log10() override = default; }; class Create_func_log2 : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_log2 s_singleton; protected: Create_func_log2() = default; - virtual ~Create_func_log2() = default; + ~Create_func_log2() override = default; }; class Create_func_lpad : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override { - return thd->variables.sql_mode & MODE_ORACLE ? - create_native_oracle(thd, name, item_list) : - create_native_std(thd, name, item_list); + return create_native_std(thd, name, item_list); } static Create_func_lpad s_singleton; protected: Create_func_lpad() = default; - virtual ~Create_func_lpad() = default; + ~Create_func_lpad() override = default; Item *create_native_std(THD *thd, const LEX_CSTRING *name, List *items); Item *create_native_oracle(THD *thd, const LEX_CSTRING *name, @@ -1574,7 +1663,7 @@ { public: Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list) + List *item_list) override { return create_native_oracle(thd, name, item_list); } @@ -1585,133 +1674,159 @@ class Create_func_ltrim : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_ltrim s_singleton; protected: Create_func_ltrim() = default; - virtual ~Create_func_ltrim() = default; + ~Create_func_ltrim() override = default; }; class Create_func_ltrim_oracle : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_ltrim_oracle s_singleton; protected: Create_func_ltrim_oracle() = default; - virtual ~Create_func_ltrim_oracle() = default; + ~Create_func_ltrim_oracle() override = default; }; class Create_func_makedate : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_makedate s_singleton; protected: Create_func_makedate() = default; - virtual ~Create_func_makedate() = default; + ~Create_func_makedate() override = default; }; class Create_func_maketime : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override; static Create_func_maketime s_singleton; protected: Create_func_maketime() = default; - virtual ~Create_func_maketime() = default; + ~Create_func_maketime() override = default; }; class Create_func_make_set : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_make_set s_singleton; protected: Create_func_make_set() = default; - virtual ~Create_func_make_set() = default; + ~Create_func_make_set() override = default; }; class Create_func_master_pos_wait : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_master_pos_wait s_singleton; protected: Create_func_master_pos_wait() = default; - virtual ~Create_func_master_pos_wait() = default; + ~Create_func_master_pos_wait() override = default; }; class Create_func_master_gtid_wait : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_master_gtid_wait s_singleton; protected: Create_func_master_gtid_wait() = default; - virtual ~Create_func_master_gtid_wait() = default; + ~Create_func_master_gtid_wait() override = default; }; class Create_func_md5 : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_md5 s_singleton; protected: Create_func_md5() = default; - virtual ~Create_func_md5() = default; + ~Create_func_md5() override = default; +}; + + +class Create_func_microsecond : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override; + + static Create_func_microsecond s_singleton; + +protected: + Create_func_microsecond() = default; + virtual ~Create_func_microsecond() = default; +}; + + +class Create_func_mod : public Create_func_arg2 +{ +public: + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; + + static Create_func_mod s_singleton; + +protected: + Create_func_mod() = default; + virtual ~Create_func_mod() = default; }; class Create_func_monthname : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_monthname s_singleton; protected: Create_func_monthname() = default; - virtual ~Create_func_monthname() = default; + ~Create_func_monthname() override = default; }; class Create_func_name_const : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_name_const s_singleton; protected: Create_func_name_const() = default; - virtual ~Create_func_name_const() = default; + ~Create_func_name_const() override = default; }; class Create_func_natural_sort_key : public Create_func_arg1 @@ -1727,177 +1842,215 @@ class Create_func_nullif : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_nullif s_singleton; protected: Create_func_nullif() = default; - virtual ~Create_func_nullif() = default; + ~Create_func_nullif() override = default; }; class Create_func_oct : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_oct s_singleton; protected: Create_func_oct() = default; - virtual ~Create_func_oct() = default; + ~Create_func_oct() override = default; }; class Create_func_ord : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_ord s_singleton; protected: Create_func_ord() = default; - virtual ~Create_func_ord() = default; + ~Create_func_ord() override = default; }; class Create_func_period_add : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_period_add s_singleton; protected: Create_func_period_add() = default; - virtual ~Create_func_period_add() = default; + ~Create_func_period_add() override = default; }; class Create_func_period_diff : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_period_diff s_singleton; protected: Create_func_period_diff() = default; - virtual ~Create_func_period_diff() = default; + ~Create_func_period_diff() override = default; }; class Create_func_pi : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_pi s_singleton; protected: Create_func_pi() = default; - virtual ~Create_func_pi() = default; + ~Create_func_pi() override = default; }; class Create_func_pow : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_pow s_singleton; protected: Create_func_pow() = default; - virtual ~Create_func_pow() = default; + ~Create_func_pow() override = default; +}; + + +class Create_func_quarter : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override; + + static Create_func_quarter s_singleton; + +protected: + Create_func_quarter() = default; + virtual ~Create_func_quarter() = default; }; class Create_func_quote : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_quote s_singleton; protected: Create_func_quote() = default; - virtual ~Create_func_quote() = default; + ~Create_func_quote() override = default; }; class Create_func_regexp_instr : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_regexp_instr s_singleton; protected: Create_func_regexp_instr() = default; - virtual ~Create_func_regexp_instr() = default; + ~Create_func_regexp_instr() override = default; }; class Create_func_regexp_replace : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override + { + return new (thd->mem_root) Item_func_regexp_replace(thd, arg1, arg2, arg3); + } static Create_func_regexp_replace s_singleton; protected: Create_func_regexp_replace() = default; - virtual ~Create_func_regexp_replace() = default; + ~Create_func_regexp_replace() override = default; +}; + +Create_func_regexp_replace Create_func_regexp_replace::s_singleton; + + +class Create_func_regexp_replace_oracle : public Create_func_arg3 +{ +public: + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override + { + return new (thd->mem_root) Item_func_regexp_replace_oracle(thd, arg1, + arg2, arg3); + } + + static Create_func_regexp_replace_oracle s_singleton; + +protected: + Create_func_regexp_replace_oracle() = default; + ~Create_func_regexp_replace_oracle() override = default; }; +Create_func_regexp_replace_oracle + Create_func_regexp_replace_oracle::s_singleton; + class Create_func_regexp_substr : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_regexp_substr s_singleton; protected: Create_func_regexp_substr() = default; - virtual ~Create_func_regexp_substr() = default; + ~Create_func_regexp_substr() override = default; }; class Create_func_radians : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_radians s_singleton; protected: Create_func_radians() = default; - virtual ~Create_func_radians() = default; + ~Create_func_radians() override = default; }; class Create_func_rand : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_rand s_singleton; protected: Create_func_rand() = default; - virtual ~Create_func_rand() = default; + ~Create_func_rand() override = default; }; class Create_func_random_bytes : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_random_bytes s_singleton; @@ -1910,7 +2063,7 @@ class Create_func_release_all_locks : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_release_all_locks s_singleton; }; @@ -1919,71 +2072,82 @@ class Create_func_release_lock : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_release_lock s_singleton; protected: Create_func_release_lock() = default; - virtual ~Create_func_release_lock() = default; + ~Create_func_release_lock() override = default; }; class Create_func_replace_oracle : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override; static Create_func_replace_oracle s_singleton; protected: Create_func_replace_oracle() = default; - virtual ~Create_func_replace_oracle() = default; + ~Create_func_replace_oracle() override = default; }; class Create_func_reverse : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_reverse s_singleton; protected: Create_func_reverse() = default; - virtual ~Create_func_reverse() = default; + ~Create_func_reverse() override = default; }; class Create_func_round : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_round s_singleton; protected: Create_func_round() = default; - virtual ~Create_func_round() = default; + ~Create_func_round() override = default; +}; + + +class Create_func_row_count : public Create_func_arg0 +{ +public: + Item *create_builder(THD *thd) override; + + static Create_func_row_count s_singleton; + +protected: + Create_func_row_count() = default; + virtual ~Create_func_row_count() = default; }; class Create_func_rpad : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list) + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override { - return thd->variables.sql_mode & MODE_ORACLE ? - create_native_oracle(thd, name, item_list) : - create_native_std(thd, name, item_list); + return create_native_std(thd, name, item_list); } static Create_func_rpad s_singleton; protected: Create_func_rpad() = default; - virtual ~Create_func_rpad() = default; + ~Create_func_rpad() override = default; Item *create_native_std(THD *thd, const LEX_CSTRING *name, List *items); Item *create_native_oracle(THD *thd, const LEX_CSTRING *name, @@ -1995,7 +2159,7 @@ { public: Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list) + List *item_list) override { return create_native_oracle(thd, name, item_list); } @@ -2006,39 +2170,39 @@ class Create_func_rtrim : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_rtrim s_singleton; protected: Create_func_rtrim() = default; - virtual ~Create_func_rtrim() = default; + ~Create_func_rtrim() override = default; }; class Create_func_rtrim_oracle : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_rtrim_oracle s_singleton; protected: Create_func_rtrim_oracle() = default; - virtual ~Create_func_rtrim_oracle() = default; + ~Create_func_rtrim_oracle() override = default; }; class Create_func_sec_to_time : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_sec_to_time s_singleton; protected: Create_func_sec_to_time() = default; - virtual ~Create_func_sec_to_time() = default; + ~Create_func_sec_to_time() override = default; }; class Create_func_sformat : public Create_native_func @@ -2055,235 +2219,235 @@ class Create_func_sha : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_sha s_singleton; protected: Create_func_sha() = default; - virtual ~Create_func_sha() = default; + ~Create_func_sha() override = default; }; class Create_func_sha2 : public Create_func_arg2 { public: - virtual Item* create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item* create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_sha2 s_singleton; protected: Create_func_sha2() = default; - virtual ~Create_func_sha2() = default; + ~Create_func_sha2() override = default; }; class Create_func_sign : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_sign s_singleton; protected: Create_func_sign() = default; - virtual ~Create_func_sign() = default; + ~Create_func_sign() override = default; }; class Create_func_sin : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_sin s_singleton; protected: Create_func_sin() = default; - virtual ~Create_func_sin() = default; + ~Create_func_sin() override = default; }; class Create_func_sleep : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_sleep s_singleton; protected: Create_func_sleep() = default; - virtual ~Create_func_sleep() = default; + ~Create_func_sleep() override = default; }; class Create_func_soundex : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_soundex s_singleton; protected: Create_func_soundex() = default; - virtual ~Create_func_soundex() = default; + ~Create_func_soundex() override = default; }; class Create_func_space : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_space s_singleton; protected: Create_func_space() = default; - virtual ~Create_func_space() = default; + ~Create_func_space() override = default; }; class Create_func_sqrt : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_sqrt s_singleton; protected: Create_func_sqrt() = default; - virtual ~Create_func_sqrt() = default; + ~Create_func_sqrt() override = default; }; class Create_func_str_to_date : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_str_to_date s_singleton; protected: Create_func_str_to_date() = default; - virtual ~Create_func_str_to_date() = default; + ~Create_func_str_to_date() override = default; }; class Create_func_strcmp : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_strcmp s_singleton; protected: Create_func_strcmp() = default; - virtual ~Create_func_strcmp() = default; + ~Create_func_strcmp() override = default; }; class Create_func_substr_index : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override; static Create_func_substr_index s_singleton; protected: Create_func_substr_index() = default; - virtual ~Create_func_substr_index() = default; + ~Create_func_substr_index() override = default; }; class Create_func_substr_oracle : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_substr_oracle s_singleton; protected: Create_func_substr_oracle() = default; - virtual ~Create_func_substr_oracle() = default; + ~Create_func_substr_oracle() override = default; }; class Create_func_subtime : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_subtime s_singleton; protected: Create_func_subtime() = default; - virtual ~Create_func_subtime() = default; + ~Create_func_subtime() override = default; }; class Create_func_tan : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_tan s_singleton; protected: Create_func_tan() = default; - virtual ~Create_func_tan() = default; + ~Create_func_tan() override = default; }; class Create_func_time_format : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_time_format s_singleton; protected: Create_func_time_format() = default; - virtual ~Create_func_time_format() = default; + ~Create_func_time_format() override = default; }; class Create_func_time_to_sec : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_time_to_sec s_singleton; protected: Create_func_time_to_sec() = default; - virtual ~Create_func_time_to_sec() = default; + ~Create_func_time_to_sec() override = default; }; class Create_func_timediff : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_timediff s_singleton; protected: Create_func_timediff() = default; - virtual ~Create_func_timediff() = default; + ~Create_func_timediff() override = default; }; class Create_func_to_base64 : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_to_base64 s_singleton; protected: Create_func_to_base64() = default; - virtual ~Create_func_to_base64() = default; + ~Create_func_to_base64() override = default; }; @@ -2304,143 +2468,157 @@ class Create_func_to_days : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_to_days s_singleton; protected: Create_func_to_days() = default; - virtual ~Create_func_to_days() = default; + ~Create_func_to_days() override = default; }; class Create_func_to_seconds : public Create_func_arg1 { public: - virtual Item* create_1_arg(THD *thd, Item *arg1); + Item* create_1_arg(THD *thd, Item *arg1) override; static Create_func_to_seconds s_singleton; protected: Create_func_to_seconds() = default; - virtual ~Create_func_to_seconds() = default; + ~Create_func_to_seconds() override = default; }; class Create_func_ucase : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_ucase s_singleton; protected: Create_func_ucase() = default; - virtual ~Create_func_ucase() = default; + ~Create_func_ucase() override = default; }; class Create_func_uncompress : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_uncompress s_singleton; protected: Create_func_uncompress() = default; - virtual ~Create_func_uncompress() = default; + ~Create_func_uncompress() override = default; }; class Create_func_uncompressed_length : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_uncompressed_length s_singleton; protected: Create_func_uncompressed_length() = default; - virtual ~Create_func_uncompressed_length() = default; + ~Create_func_uncompressed_length() override = default; }; class Create_func_unhex : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_unhex s_singleton; protected: Create_func_unhex() = default; - virtual ~Create_func_unhex() = default; + ~Create_func_unhex() override = default; }; class Create_func_unix_timestamp : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_unix_timestamp s_singleton; protected: Create_func_unix_timestamp() = default; - virtual ~Create_func_unix_timestamp() = default; + ~Create_func_unix_timestamp() override = default; }; class Create_func_uuid_short : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_uuid_short s_singleton; protected: Create_func_uuid_short() = default; - virtual ~Create_func_uuid_short() = default; + ~Create_func_uuid_short() override = default; }; class Create_func_version : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_version s_singleton; protected: Create_func_version() = default; - virtual ~Create_func_version() = default; + ~Create_func_version() override = default; +}; + + +class Create_func_week : public Create_native_func +{ +public: + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; + + static Create_func_week s_singleton; + +protected: + Create_func_week() = default; + virtual ~Create_func_week() = default; }; class Create_func_weekday : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_weekday s_singleton; protected: Create_func_weekday() = default; - virtual ~Create_func_weekday() = default; + ~Create_func_weekday() override = default; }; class Create_func_weekofyear : public Create_func_arg1 { public: - virtual Item *create_1_arg(THD *thd, Item *arg1); + Item *create_1_arg(THD *thd, Item *arg1) override; static Create_func_weekofyear s_singleton; protected: Create_func_weekofyear() = default; - virtual ~Create_func_weekofyear() = default; + ~Create_func_weekofyear() override = default; }; @@ -2448,26 +2626,26 @@ class Create_func_wsrep_last_written_gtid : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_wsrep_last_written_gtid s_singleton; protected: Create_func_wsrep_last_written_gtid() = default; - virtual ~Create_func_wsrep_last_written_gtid() = default; + ~Create_func_wsrep_last_written_gtid() override = default; }; class Create_func_wsrep_last_seen_gtid : public Create_func_arg0 { public: - virtual Item *create_builder(THD *thd); + Item *create_builder(THD *thd) override; static Create_func_wsrep_last_seen_gtid s_singleton; protected: Create_func_wsrep_last_seen_gtid() = default; - virtual ~Create_func_wsrep_last_seen_gtid() = default; + ~Create_func_wsrep_last_seen_gtid() override = default; }; @@ -2481,7 +2659,7 @@ protected: Create_func_wsrep_sync_wait_upto() = default; - virtual ~Create_func_wsrep_sync_wait_upto() = default; + ~Create_func_wsrep_sync_wait_upto() override = default; }; #endif /* WITH_WSREP */ @@ -2489,40 +2667,40 @@ class Create_func_xml_extractvalue : public Create_func_arg2 { public: - virtual Item *create_2_arg(THD *thd, Item *arg1, Item *arg2); + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; static Create_func_xml_extractvalue s_singleton; protected: Create_func_xml_extractvalue() = default; - virtual ~Create_func_xml_extractvalue() = default; + ~Create_func_xml_extractvalue() override = default; }; class Create_func_xml_update : public Create_func_arg3 { public: - virtual Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3); + Item *create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) override; static Create_func_xml_update s_singleton; protected: Create_func_xml_update() = default; - virtual ~Create_func_xml_update() = default; + ~Create_func_xml_update() override = default; }; class Create_func_year_week : public Create_native_func { public: - virtual Item *create_native(THD *thd, const LEX_CSTRING *name, - List *item_list); + Item *create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) override; static Create_func_year_week s_singleton; protected: Create_func_year_week() = default; - virtual ~Create_func_year_week() = default; + ~Create_func_year_week() override = default; }; @@ -2897,6 +3075,16 @@ } +Create_func_addmonths Create_func_addmonths::s_singleton; + +Item* +Create_func_addmonths::create_2_arg(THD *thd, Item *arg1, Item *arg2) +{ + return new (thd->mem_root) + Item_date_add_interval(thd, arg1, arg2, INTERVAL_MONTH, false); +} + + Create_func_aes_encrypt Create_func_aes_encrypt::s_singleton; Item* @@ -3026,6 +3214,15 @@ } +Create_func_collation Create_func_collation::s_singleton; + +Item* +Create_func_collation::create_1_arg(THD *thd, Item *arg1) +{ + return new (thd->mem_root) Item_func_collation(thd, arg1); +} + + Create_func_chr Create_func_chr::s_singleton; Item* @@ -3086,6 +3283,26 @@ return new (thd->mem_root) Item_func_dyncol_json(thd, arg1); } +Create_func_coalesce Create_func_coalesce::s_singleton; + +Item* +Create_func_coalesce::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) +{ + int arg_count= 0; + + if (item_list != NULL) + arg_count= item_list->elements; + + if (unlikely(arg_count < 1)) + { + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str); + return NULL; + } + + return new (thd->mem_root) Item_func_coalesce(thd, *item_list); +} + Create_func_concat Create_func_concat::s_singleton; Item* @@ -3103,9 +3320,7 @@ return NULL; } - return thd->variables.sql_mode & MODE_ORACLE ? - new (thd->mem_root) Item_func_concat_operator_oracle(thd, *item_list) : - new (thd->mem_root) Item_func_concat(thd, *item_list); + return new (thd->mem_root) Item_func_concat(thd, *item_list); } Create_func_concat_operator_oracle @@ -3182,6 +3397,16 @@ } +Create_func_database Create_func_database::s_singleton; + +Item* +Create_func_database::create_builder(THD *thd) +{ + thd->lex->safe_to_cache_query= 0; + return new (thd->mem_root) Item_func_database(thd); +} + + Create_func_nvl2 Create_func_nvl2::s_singleton; Item* @@ -3290,6 +3515,37 @@ return new (thd->mem_root) Item_func_minus(thd, i1, i2); } +Create_func_date_format Create_func_date_format::s_singleton; + +Item* +Create_func_date_format::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) +{ + int arg_count= 0; + + if (item_list != NULL) + arg_count= item_list->elements; + + switch (arg_count) { + case 2: + { + Item *param_1= item_list->pop(); + Item *param_2= item_list->pop(); + return new (thd->mem_root) Item_func_date_format(thd, param_1, param_2); + } + case 3: + { + Item *param_1= item_list->pop(); + Item *param_2= item_list->pop(); + Item *param_3= item_list->pop(); + return new (thd->mem_root) Item_func_date_format(thd, + param_1, param_2, param_3); + } + } + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str); + return NULL; +} + Create_func_dayname Create_func_dayname::s_singleton; @@ -4430,10 +4686,24 @@ Item* Create_func_length::create_1_arg(THD *thd, Item *arg1) { - if (thd->variables.sql_mode & MODE_ORACLE) - return new (thd->mem_root) Item_func_char_length(thd, arg1); - else - return new (thd->mem_root) Item_func_octet_length(thd, arg1); + return new (thd->mem_root) Item_func_octet_length(thd, arg1); +} + +Create_func_old_password Create_func_old_password::s_singleton; + +Item* +Create_func_old_password::create_1_arg(THD *thd, Item *arg1) +{ + return new (thd->mem_root) Item_func_password(thd, arg1, + Item_func_password::OLD); +} + +Create_func_password Create_func_password::s_singleton; + +Item* +Create_func_password::create_1_arg(THD *thd, Item *arg1) +{ + return new (thd->mem_root) Item_func_password(thd, arg1); } Create_func_octet_length Create_func_octet_length::s_singleton; @@ -4651,7 +4921,7 @@ Item* Create_func_ltrim::create_1_arg(THD *thd, Item *arg1) { - return Lex_trim(TRIM_LEADING, arg1).make_item_func_trim(thd); + return Lex_trim(TRIM_LEADING, arg1).make_item_func_trim_std(thd); } @@ -4810,6 +5080,24 @@ return new (thd->mem_root) Item_func_natural_sort_key(thd, arg1); } +Create_func_microsecond Create_func_microsecond::s_singleton; + +Item* +Create_func_microsecond::create_1_arg(THD *thd, Item *arg1) +{ + return new (thd->mem_root) Item_func_microsecond(thd, arg1); +} + + +Create_func_mod Create_func_mod::s_singleton; + +Item* +Create_func_mod::create_2_arg(THD *thd, Item *arg1, Item *arg2) +{ + return new (thd->mem_root) Item_func_mod(thd, arg1, arg2); +} + + Create_func_monthname Create_func_monthname::s_singleton; Item* @@ -4912,30 +5200,30 @@ } -Create_func_quote Create_func_quote::s_singleton; +Create_func_quarter Create_func_quarter::s_singleton; Item* -Create_func_quote::create_1_arg(THD *thd, Item *arg1) +Create_func_quarter::create_1_arg(THD *thd, Item *arg1) { - return new (thd->mem_root) Item_func_quote(thd, arg1); + return new (thd->mem_root) Item_func_quarter(thd, arg1); } -Create_func_regexp_instr Create_func_regexp_instr::s_singleton; +Create_func_quote Create_func_quote::s_singleton; Item* -Create_func_regexp_instr::create_2_arg(THD *thd, Item *arg1, Item *arg2) +Create_func_quote::create_1_arg(THD *thd, Item *arg1) { - return new (thd->mem_root) Item_func_regexp_instr(thd, arg1, arg2); + return new (thd->mem_root) Item_func_quote(thd, arg1); } -Create_func_regexp_replace Create_func_regexp_replace::s_singleton; +Create_func_regexp_instr Create_func_regexp_instr::s_singleton; Item* -Create_func_regexp_replace::create_3_arg(THD *thd, Item *arg1, Item *arg2, Item *arg3) +Create_func_regexp_instr::create_2_arg(THD *thd, Item *arg1, Item *arg2) { - return new (thd->mem_root) Item_func_regexp_replace(thd, arg1, arg2, arg3); + return new (thd->mem_root) Item_func_regexp_instr(thd, arg1, arg2); } @@ -5097,6 +5385,17 @@ } +Create_func_row_count Create_func_row_count::s_singleton; + +Item* +Create_func_row_count::create_builder(THD *thd) +{ + thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + thd->lex->safe_to_cache_query= 0; + return new (thd->mem_root) Item_func_row_count(thd); +} + + Create_func_rpad Create_func_rpad::s_singleton; Create_func_rpad_oracle Create_func_rpad_oracle::s_singleton; @@ -5166,7 +5465,7 @@ Item* Create_func_rtrim::create_1_arg(THD *thd, Item *arg1) { - return Lex_trim(TRIM_TRAILING, arg1).make_item_func_trim(thd); + return Lex_trim(TRIM_TRAILING, arg1).make_item_func_trim_std(thd); } @@ -5532,7 +5831,7 @@ { DBUG_ENTER("Create_func_uuid_short::create"); thd->lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - thd->lex->safe_to_cache_query= 0; + thd->lex->uncacheable(UNCACHEABLE_RAND); // disallow cache and query merges DBUG_RETURN(new (thd->mem_root) Item_func_uuid_short(thd)); } @@ -5551,6 +5850,43 @@ } +Create_func_week Create_func_week::s_singleton; + +Item* +Create_func_week::create_native(THD *thd, const LEX_CSTRING *name, + List *item_list) +{ + Item* func= NULL; + int arg_count= 0; + + if (item_list != NULL) + arg_count= item_list->elements; + + switch (arg_count) { + case 1: + { + Item *param_1= item_list->pop(); + func= new (thd->mem_root) Item_func_week(thd, param_1); + break; + } + case 2: + { + Item *param_1= item_list->pop(); + Item *param_2= item_list->pop(); + func= new (thd->mem_root) Item_func_week(thd, param_1, param_2); + break; + } + default: + { + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), name->str); + break; + } + } + + return func; +} + + Create_func_weekday Create_func_weekday::s_singleton; Item* @@ -5701,6 +6037,7 @@ { { STRING_WITH_LEN("ABS") }, BUILDER(Create_func_abs)}, { { STRING_WITH_LEN("ACOS") }, BUILDER(Create_func_acos)}, { { STRING_WITH_LEN("ADDTIME") }, BUILDER(Create_func_addtime)}, + { { STRING_WITH_LEN("ADD_MONTHS") }, BUILDER(Create_func_addmonths)}, { { STRING_WITH_LEN("AES_DECRYPT") }, BUILDER(Create_func_aes_decrypt)}, { { STRING_WITH_LEN("AES_ENCRYPT") }, BUILDER(Create_func_aes_encrypt)}, { { STRING_WITH_LEN("ASIN") }, BUILDER(Create_func_asin)}, @@ -5716,7 +6053,9 @@ { { STRING_WITH_LEN("CHARACTER_LENGTH") }, BUILDER(Create_func_char_length)}, { { STRING_WITH_LEN("CHAR_LENGTH") }, BUILDER(Create_func_char_length)}, { { STRING_WITH_LEN("CHR") }, BUILDER(Create_func_chr)}, + { { STRING_WITH_LEN("COALESCE") }, BUILDER(Create_func_coalesce)}, { { STRING_WITH_LEN("COERCIBILITY") }, BUILDER(Create_func_coercibility)}, + { { STRING_WITH_LEN("COLLATION") }, BUILDER(Create_func_collation)}, { { STRING_WITH_LEN("COLUMN_CHECK") }, BUILDER(Create_func_dyncol_check)}, { { STRING_WITH_LEN("COLUMN_EXISTS") }, BUILDER(Create_func_dyncol_exists)}, { { STRING_WITH_LEN("COLUMN_LIST") }, BUILDER(Create_func_dyncol_list)}, @@ -5732,7 +6071,9 @@ { { STRING_WITH_LEN("COT") }, BUILDER(Create_func_cot)}, { { STRING_WITH_LEN("CRC32") }, BUILDER(Create_func_crc32)}, { { STRING_WITH_LEN("CRC32C") }, BUILDER(Create_func_crc32c)}, + { { STRING_WITH_LEN("DATABASE") }, BUILDER(Create_func_database)}, { { STRING_WITH_LEN("DATEDIFF") }, BUILDER(Create_func_datediff)}, + { { STRING_WITH_LEN("DATE_FORMAT") }, BUILDER(Create_func_date_format)}, { { STRING_WITH_LEN("DAYNAME") }, BUILDER(Create_func_dayname)}, { { STRING_WITH_LEN("DAYOFMONTH") }, BUILDER(Create_func_dayofmonth)}, { { STRING_WITH_LEN("DAYOFWEEK") }, BUILDER(Create_func_dayofweek)}, @@ -5824,6 +6165,8 @@ { { STRING_WITH_LEN("MASTER_GTID_WAIT") }, BUILDER(Create_func_master_gtid_wait)}, { { STRING_WITH_LEN("MASTER_POS_WAIT") }, BUILDER(Create_func_master_pos_wait)}, { { STRING_WITH_LEN("MD5") }, BUILDER(Create_func_md5)}, + { { STRING_WITH_LEN("MICROSECOND") }, BUILDER(Create_func_microsecond)}, + { { STRING_WITH_LEN("MOD") }, BUILDER(Create_func_mod)}, { { STRING_WITH_LEN("MONTHNAME") }, BUILDER(Create_func_monthname)}, { { STRING_WITH_LEN("NAME_CONST") }, BUILDER(Create_func_name_const)}, { {STRING_WITH_LEN("NATURAL_SORT_KEY")}, BUILDER(Create_func_natural_sort_key)}, @@ -5832,12 +6175,15 @@ { { STRING_WITH_LEN("NULLIF") }, BUILDER(Create_func_nullif)}, { { STRING_WITH_LEN("OCT") }, BUILDER(Create_func_oct)}, { { STRING_WITH_LEN("OCTET_LENGTH") }, BUILDER(Create_func_octet_length)}, + { { STRING_WITH_LEN("OLD_PASSWORD") }, BUILDER(Create_func_old_password)}, { { STRING_WITH_LEN("ORD") }, BUILDER(Create_func_ord)}, + { { STRING_WITH_LEN("PASSWORD") }, BUILDER(Create_func_password)}, { { STRING_WITH_LEN("PERIOD_ADD") }, BUILDER(Create_func_period_add)}, { { STRING_WITH_LEN("PERIOD_DIFF") }, BUILDER(Create_func_period_diff)}, { { STRING_WITH_LEN("PI") }, BUILDER(Create_func_pi)}, { { STRING_WITH_LEN("POW") }, BUILDER(Create_func_pow)}, { { STRING_WITH_LEN("POWER") }, BUILDER(Create_func_pow)}, + { { STRING_WITH_LEN("QUARTER") }, BUILDER(Create_func_quarter)}, { { STRING_WITH_LEN("QUOTE") }, BUILDER(Create_func_quote)}, { { STRING_WITH_LEN("RANDOM_BYTES")}, BUILDER(Create_func_random_bytes)}, { { STRING_WITH_LEN("REGEXP_INSTR") }, BUILDER(Create_func_regexp_instr)}, @@ -5852,12 +6198,15 @@ BUILDER(Create_func_replace_oracle)}, { { STRING_WITH_LEN("REVERSE") }, BUILDER(Create_func_reverse)}, { { STRING_WITH_LEN("ROUND") }, BUILDER(Create_func_round)}, + { { STRING_WITH_LEN("ROW_COUNT") }, BUILDER(Create_func_row_count)}, { { STRING_WITH_LEN("RPAD") }, BUILDER(Create_func_rpad)}, { { STRING_WITH_LEN("RPAD_ORACLE") }, BUILDER(Create_func_rpad_oracle)}, { { STRING_WITH_LEN("RTRIM") }, BUILDER(Create_func_rtrim)}, { { STRING_WITH_LEN("RTRIM_ORACLE") }, BUILDER(Create_func_rtrim_oracle)}, { { STRING_WITH_LEN("SEC_TO_TIME") }, BUILDER(Create_func_sec_to_time)}, { { STRING_WITH_LEN("SFORMAT") }, BUILDER(Create_func_sformat)}, + { { STRING_WITH_LEN("SCHEMA") }, BUILDER(Create_func_database)}, + { { STRING_WITH_LEN("SCHEMAS") }, BUILDER(Create_func_database)}, { { STRING_WITH_LEN("SHA") }, BUILDER(Create_func_sha)}, { { STRING_WITH_LEN("SHA1") }, BUILDER(Create_func_sha)}, { { STRING_WITH_LEN("SHA2") }, BUILDER(Create_func_sha2)}, @@ -5890,6 +6239,7 @@ { { STRING_WITH_LEN("UPPER") }, BUILDER(Create_func_ucase)}, { { STRING_WITH_LEN("UUID_SHORT") }, BUILDER(Create_func_uuid_short)}, { { STRING_WITH_LEN("VERSION") }, BUILDER(Create_func_version)}, + { { STRING_WITH_LEN("WEEK") }, BUILDER(Create_func_week)}, { { STRING_WITH_LEN("WEEKDAY") }, BUILDER(Create_func_weekday)}, { { STRING_WITH_LEN("WEEKOFYEAR") }, BUILDER(Create_func_weekofyear)}, #ifdef WITH_WSREP @@ -5903,9 +6253,26 @@ Native_func_registry_array native_func_registry_array(func_array, array_elements(func_array)); -const size_t func_array_length= sizeof(func_array) / sizeof(Native_func_registry) - 1; +const Native_func_registry func_array_oracle_overrides[] = +{ + { { STRING_WITH_LEN("CONCAT") }, BUILDER(Create_func_concat_operator_oracle)}, + { { STRING_WITH_LEN("DECODE") }, BUILDER(Create_func_decode_oracle)}, + { { STRING_WITH_LEN("LENGTH") }, BUILDER(Create_func_char_length)}, + { { STRING_WITH_LEN("LPAD") }, BUILDER(Create_func_lpad_oracle)}, + { { STRING_WITH_LEN("LTRIM") }, BUILDER(Create_func_ltrim_oracle)}, + { { STRING_WITH_LEN("REGEXP_REPLACE") }, + BUILDER(Create_func_regexp_replace_oracle)}, + { { STRING_WITH_LEN("RPAD") }, BUILDER(Create_func_rpad_oracle)}, + { { STRING_WITH_LEN("RTRIM") }, BUILDER(Create_func_rtrim_oracle)} +}; + +Native_func_registry_array + oracle_func_registry_array(func_array_oracle_overrides, + array_elements(func_array_oracle_overrides)); Native_functions_hash native_functions_hash; +Native_functions_hash native_functions_hash_oracle; + /* Load the hash table for native functions. @@ -6034,13 +6401,30 @@ native_func_registry_array_geom.count())) return true; #endif - return false; + + count+= oracle_func_registry_array.count(); + + if (native_functions_hash_oracle.init(count) || + native_functions_hash_oracle.append(native_func_registry_array.elements(), + native_func_registry_array.count())) + return true; + +#ifdef HAVE_SPATIAL + if (native_functions_hash_oracle.append(native_func_registry_array_geom.elements(), + native_func_registry_array_geom.count())) + return true; +#endif + + return + native_functions_hash_oracle.replace(oracle_func_registry_array.elements(), + oracle_func_registry_array.count()); } void item_create_cleanup() { native_functions_hash.cleanup(); + native_functions_hash_oracle.cleanup(); } diff -Nru mariadb-10.11.6/sql/item_create.h mariadb-10.11.9/sql/item_create.h --- mariadb-10.11.6/sql/item_create.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_create.h 2024-08-03 07:29:58.000000000 +0000 @@ -324,6 +324,12 @@ bool init(size_t count); bool append(const Native_func_registry array[], size_t count); bool remove(const Native_func_registry array[], size_t count); + bool replace(const Native_func_registry array[], size_t count) + { + DBUG_ENTER("Native_functions_hash::replace"); + remove(array, count); + DBUG_RETURN(append(array, count)); + } void cleanup(); /** Find the native function builder associated with a given function name. @@ -335,6 +341,7 @@ }; extern MYSQL_PLUGIN_IMPORT Native_functions_hash native_functions_hash; +extern MYSQL_PLUGIN_IMPORT Native_functions_hash native_functions_hash_oracle; extern const Native_func_registry func_array[]; extern const size_t func_array_length; @@ -377,4 +384,3 @@ #endif - diff -Nru mariadb-10.11.6/sql/item_func.cc mariadb-10.11.9/sql/item_func.cc --- mariadb-10.11.6/sql/item_func.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_func.cc 2024-08-03 07:29:58.000000000 +0000 @@ -72,6 +72,9 @@ return FALSE; } +void pause_execution(THD *thd, double timeout); +static int do_pause(THD *thd, Interruptible_wait *timed_cond, + mysql_cond_t *cond, double timeout); /** Test if the sum of arguments overflows the ulonglong range. @@ -131,6 +134,16 @@ } +void Item_func::wrong_param_count_error(const LEX_CSTRING &schema_name, + const LEX_CSTRING &func_name) +{ + DBUG_ASSERT(schema_name.length); + Database_qualified_name qname(schema_name, func_name); + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), + ErrConvDQName(&qname).ptr()); +} + + void Item_func::sync_with_sum_func_and_with_field(List &list) { List_iterator_fast li(list); @@ -618,13 +631,12 @@ void Item_func::print(String *str, enum_query_type query_type) { str->append(func_name_cstring()); - str->append('('); - print_args(str, 0, query_type); - str->append(')'); + print_args_parenthesized(str, query_type); } -void Item_func::print_args(String *str, uint from, enum_query_type query_type) +void Item_func::print_args(String *str, uint from, + enum_query_type query_type) const { for (uint i=from ; i < arg_count ; i++) { @@ -1814,7 +1826,7 @@ Use val() to get value as arg_type doesn't mean that item is Item_int or Item_float due to existence of Item_param. */ - if (args[0]->const_item()) + if (args[0]->const_item() && !args[0]->is_expensive()) { longlong val= args[0]->val_int(); if ((ulonglong) val >= (ulonglong) LONGLONG_MIN && @@ -1908,6 +1920,18 @@ set_handler(type_handler_long_or_longlong()); } +void Item_func_abs::fix_length_and_dec_sint_ge0() +{ + /* + We're converting slong_ge0 to slong/slonglong. + Add one character for the sign into max_length. + */ + max_length= args[0]->decimal_precision() + 1/*sign*/; + DBUG_ASSERT(!args[0]->unsigned_flag); + unsigned_flag= false; + set_handler(type_handler_long_or_longlong()); +} + void Item_func_abs::fix_length_and_dec_double() { @@ -2128,7 +2152,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return item->arguments()[0]->to_longlong_null() << @@ -2141,7 +2165,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return VDec(item->arguments()[0]).to_xlonglong_null() << @@ -2162,7 +2186,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return item->arguments()[0]->to_longlong_null() >> @@ -2175,7 +2199,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return VDec(item->arguments()[0]).to_xlonglong_null() >> @@ -2196,7 +2220,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return ~ item->arguments()[0]->to_longlong_null(); @@ -2208,7 +2232,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return ~ VDec(item->arguments()[0]).to_xlonglong_null(); @@ -2585,6 +2609,22 @@ } +void Item_func_round::fix_arg_slong_ge0() +{ + DBUG_ASSERT(!args[0]->unsigned_flag); + DBUG_ASSERT(args[0]->decimals == 0); + Type_std_attributes::set(args[0]); + /* + We're converting the data type from slong_ge0 to slong/slonglong. + Add one character for the sign, + to change max_length notation from "max_length digits" to + "max_length-1 digits and the sign". + */ + max_length+= 1/*sign*/ + test_if_length_can_increase(); + set_handler(type_handler_long_or_longlong()); +} + + void Item_func_round::fix_arg_hex_hybrid() { DBUG_ASSERT(args[0]->decimals == 0); @@ -2601,12 +2641,12 @@ } -double my_double_round(double value, longlong dec, bool dec_unsigned, +double my_double_round(double value, longlong dec_value, bool dec_unsigned, bool truncate) { double tmp; - bool dec_negative= (dec < 0) && !dec_unsigned; - ulonglong abs_dec= dec_negative ? -dec : dec; + const Longlong_hybrid dec(dec_value, dec_unsigned); + const ulonglong abs_dec= dec.abs(); /* tmp2 is here to avoid return the value with 80 bit precision This will fix that the test round(0.1,1) = round(0.1,1) is true @@ -2621,22 +2661,24 @@ volatile double value_div_tmp= value / tmp; volatile double value_mul_tmp= value * tmp; - if (!dec_negative && std::isinf(tmp)) // "dec" is too large positive number + if (!dec.neg() && std::isinf(tmp)) // "dec" is a too large positive number return value; - if (dec_negative && std::isinf(tmp)) - tmp2= 0.0; - else if (!dec_negative && std::isinf(value_mul_tmp)) + if (dec.neg() && std::isinf(tmp)) // "dec" is a too small negative number + return 0.0; + + // Handle "dec" with a reasonably small absolute value + if (!dec.neg() && std::isinf(value_mul_tmp)) tmp2= value; else if (truncate) { if (value >= 0.0) - tmp2= dec < 0 ? floor(value_div_tmp) * tmp : floor(value_mul_tmp) / tmp; + tmp2= dec.neg() ? floor(value_div_tmp) * tmp : floor(value_mul_tmp) / tmp; else - tmp2= dec < 0 ? ceil(value_div_tmp) * tmp : ceil(value_mul_tmp) / tmp; + tmp2= dec.neg() ? ceil(value_div_tmp) * tmp : ceil(value_mul_tmp) / tmp; } else - tmp2=dec < 0 ? rint(value_div_tmp) * tmp : rint(value_mul_tmp) / tmp; + tmp2=dec.neg() ? rint(value_div_tmp) * tmp : rint(value_mul_tmp) / tmp; return tmp2; } @@ -2793,8 +2835,17 @@ No need to send a Rand log event if seed was given eg: RAND(seed), as it will be replicated in the query as such. */ + DBUG_ASSERT((!rand && + (thd->active_stmt_arena_to_use()-> + is_stmt_prepare_or_first_stmt_execute() || + thd->active_stmt_arena_to_use()-> + is_conventional() || + thd->active_stmt_arena_to_use()->state == + Query_arena::STMT_SP_QUERY_ARGUMENTS + ) + ) || rand); if (!rand && !(rand= (struct my_rnd_struct*) - thd->stmt_arena->alloc(sizeof(*rand)))) + thd->active_stmt_arena_to_use()->alloc(sizeof(*rand)))) return TRUE; } else @@ -2976,7 +3027,7 @@ value=tmp; } if ((null_value= args[i]->null_value)) - break; + return 0; } return value; } @@ -2997,7 +3048,7 @@ value=tmp; } if ((null_value= args[i]->null_value)) - break; + return 0; } return value; } @@ -3095,11 +3146,27 @@ } +bool Item_func_coercibility::fix_length_and_dec(THD *thd) +{ + max_length=10; + base_flags&= ~item_base_t::MAYBE_NULL; + /* + Since this is a const item which doesn't use tables (see used_tables()), + we don't want to access the function arguments during execution. + That's why we store the derivation here during the preparation phase + and only return it later at the execution phase + */ + DBUG_ASSERT(args[0]->fixed()); + m_cached_collation_derivation= (longlong) args[0]->collation.derivation; + return false; +} + + longlong Item_func_coercibility::val_int() { DBUG_ASSERT(fixed()); null_value= 0; - return (longlong) args[0]->collation.derivation; + return m_cached_collation_derivation; } @@ -3381,7 +3448,7 @@ public Item_handled_func::Handler_slong2 { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return item->arguments()[0]->to_longlong_null().bit_count(); @@ -3393,7 +3460,7 @@ public Item_handled_func::Handler_slong2 { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return VDec(item->arguments()[0]).to_xlonglong_null().bit_count(); @@ -3522,6 +3589,7 @@ initid.const_item=func->const_item_cache; initid.decimals=func->decimals; initid.ptr=0; + not_original=0; for (uint i1= 0 ; i1 < arg_count ; i1++) buffers[i1].set_thread_specific(); @@ -4126,7 +4194,7 @@ const char * /* sqlstate */, Sql_condition::enum_warning_level* /* level */, const char *message, - Sql_condition ** /* cond_hdl */); + Sql_condition ** /* cond_hdl */) override; }; bool @@ -4565,32 +4633,7 @@ if (timeout < 0.00001) return 0; - timed_cond.set_timeout((ulonglong) (timeout * 1000000000.0)); - - mysql_cond_init(key_item_func_sleep_cond, &cond, NULL); - mysql_mutex_lock(&LOCK_item_func_sleep); - - THD_STAGE_INFO(thd, stage_user_sleep); - thd->mysys_var->current_mutex= &LOCK_item_func_sleep; - thd->mysys_var->current_cond= &cond; - - error= 0; - thd_wait_begin(thd, THD_WAIT_SLEEP); - while (!thd->killed) - { - error= timed_cond.wait(&cond, &LOCK_item_func_sleep); - if (error == ETIMEDOUT || error == ETIME) - break; - error= 0; - } - thd_wait_end(thd); - mysql_mutex_unlock(&LOCK_item_func_sleep); - mysql_mutex_lock(&thd->mysys_var->mutex); - thd->mysys_var->current_mutex= 0; - thd->mysys_var->current_cond= 0; - mysql_mutex_unlock(&thd->mysys_var->mutex); - - mysql_cond_destroy(&cond); + error= do_pause(thd, &timed_cond, &cond, timeout); #ifdef ENABLED_DEBUG_SYNC DBUG_EXECUTE_IF("sleep_inject_query_done_debug_sync", { @@ -4633,7 +4676,6 @@ entry->length=0; entry->update_query_id=0; entry->set_charset(NULL); - entry->unsigned_flag= 0; /* If we are here, we were called from a SET or a query which sets a variable. Imagine it is this: @@ -4645,7 +4687,7 @@ by Item_func_get_user_var (because that's not necessary). */ entry->used_query_id=current_thd->query_id; - entry->type=STRING_RESULT; + entry->set_handler(&type_handler_long_blob); memcpy((char*) entry->name.str, name->str, name->length+1); if (my_hash_insert(hash,(uchar*) entry)) { @@ -4721,9 +4763,12 @@ switch (args[0]->result_type()) { case STRING_RESULT: case TIME_RESULT: - set_handler(type_handler_long_blob. - type_handler_adjusted_to_max_octet_length(max_length, - collation.collation)); + if (args[0]->field_type() == MYSQL_TYPE_GEOMETRY) + set_handler(args[0]->type_handler()); + else + set_handler(type_handler_long_blob. + type_handler_adjusted_to_max_octet_length(max_length, + collation.collation)); break; case REAL_RESULT: set_handler(&type_handler_double); @@ -4773,7 +4818,9 @@ if (args[0]->collation.derivation == DERIVATION_NUMERIC) { collation.set(DERIVATION_NUMERIC); - fix_length_and_charset(args[0]->max_char_length(), &my_charset_numeric); + uint sign_length= args[0]->type_handler() == &type_handler_slong_ge0 ? 1: 0; + fix_length_and_charset(args[0]->max_char_length() + sign_length, + &my_charset_numeric); } else { @@ -4848,9 +4895,9 @@ bool update_hash(user_var_entry *entry, bool set_null, void *ptr, size_t length, - Item_result type, CHARSET_INFO *cs, - bool unsigned_arg) + const Type_handler *th, CHARSET_INFO *cs) { + entry->set_handler(th); if (set_null) { char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry)); @@ -4861,7 +4908,7 @@ } else { - if (type == STRING_RESULT) + if (th->result_type() == STRING_RESULT) length++; // Store strings with end \0 if (length <= extra_size) { @@ -4890,20 +4937,18 @@ return 1; } } - if (type == STRING_RESULT) + if (th->result_type() == STRING_RESULT) { length--; // Fix length change above entry->value[length]= 0; // Store end \0 } if (length) memmove(entry->value, ptr, length); - if (type == DECIMAL_RESULT) + if (th->result_type() == DECIMAL_RESULT) ((my_decimal*)entry->value)->fix_buffer_pointer(); entry->length= length; entry->set_charset(cs); - entry->unsigned_flag= unsigned_arg; } - entry->type=type; #ifdef USER_VAR_TRACKING #ifndef EMBEDDED_LIBRARY THD *thd= current_thd; @@ -4916,9 +4961,8 @@ bool Item_func_set_user_var::update_hash(void *ptr, size_t length, - Item_result res_type, - CHARSET_INFO *cs, - bool unsigned_arg) + const Type_handler *th, + CHARSET_INFO *cs) { /* If we set a variable explicitly to NULL then keep the old @@ -4932,9 +4976,8 @@ else null_value= args[0]->null_value; if (null_value && null_item) - res_type= m_var_entry->type; // Don't change type of item - if (::update_hash(m_var_entry, null_value, - ptr, length, res_type, cs, unsigned_arg)) + th= m_var_entry->type_handler(); // Don't change type of item + if (::update_hash(m_var_entry, null_value, ptr, length, th, cs)) { null_value= 1; return 1; @@ -4950,7 +4993,7 @@ if ((*null_value= (value == 0))) return 0.0; - switch (type) { + switch (type_handler()->result_type()) { case REAL_RESULT: return *(double*) value; case INT_RESULT: @@ -4975,7 +5018,7 @@ if ((*null_value= (value == 0))) return 0; - switch (type) { + switch (type_handler()->result_type()) { case REAL_RESULT: return (longlong) *(double*) value; case INT_RESULT: @@ -5004,12 +5047,12 @@ if ((*null_value= (value == 0))) return (String*) 0; - switch (type) { + switch (type_handler()->result_type()) { case REAL_RESULT: str->set_real(*(double*) value, decimals, charset()); break; case INT_RESULT: - if (!unsigned_flag) + if (!type_handler()->is_unsigned()) str->set(*(longlong*) value, charset()); else str->set(*(ulonglong*) value, charset()); @@ -5036,7 +5079,7 @@ if ((*null_value= (value == 0))) return 0; - switch (type) { + switch (type_handler()->result_type()) { case REAL_RESULT: double2my_decimal(E_DEC_FATAL_ERROR, *(double*) value, val); break; @@ -5175,33 +5218,37 @@ case REAL_RESULT: { res= update_hash((void*) &save_result.vreal,sizeof(save_result.vreal), - REAL_RESULT, &my_charset_numeric, 0); + &type_handler_double, &my_charset_numeric); break; } case INT_RESULT: { res= update_hash((void*) &save_result.vint, sizeof(save_result.vint), - INT_RESULT, &my_charset_numeric, unsigned_flag); + unsigned_flag ? (Type_handler *) &type_handler_ulonglong : + (Type_handler *) &type_handler_slonglong, + &my_charset_numeric); break; } case STRING_RESULT: { if (!save_result.vstr) // Null value - res= update_hash((void*) 0, 0, STRING_RESULT, &my_charset_bin, 0); + res= update_hash((void*) 0, 0, &type_handler_long_blob, &my_charset_bin); else res= update_hash((void*) save_result.vstr->ptr(), - save_result.vstr->length(), STRING_RESULT, - save_result.vstr->charset(), 0); + save_result.vstr->length(), + field_type() == MYSQL_TYPE_GEOMETRY ? + type_handler() : &type_handler_long_blob, + save_result.vstr->charset()); break; } case DECIMAL_RESULT: { if (!save_result.vdec) // Null value - res= update_hash((void*) 0, 0, DECIMAL_RESULT, &my_charset_bin, 0); + res= update_hash((void*) 0, 0, &type_handler_newdecimal, &my_charset_bin); else res= update_hash((void*) save_result.vdec, - sizeof(my_decimal), DECIMAL_RESULT, - &my_charset_numeric, 0); + sizeof(my_decimal), &type_handler_newdecimal, + &my_charset_numeric); break; } case ROW_RESULT: @@ -5593,9 +5640,8 @@ user_var_event->value= (char*) user_var_event + ALIGN_SIZE(sizeof(BINLOG_USER_VAR_EVENT)); user_var_event->user_var_event= var_entry; - user_var_event->type= var_entry->type; + user_var_event->th= var_entry->type_handler(); user_var_event->charset_number= var_entry->charset()->number; - user_var_event->unsigned_flag= var_entry->unsigned_flag; if (!var_entry->value) { /* NULL value*/ @@ -5637,9 +5683,9 @@ */ if (likely(!error && m_var_entry)) { - unsigned_flag= m_var_entry->unsigned_flag; + unsigned_flag= m_var_entry->type_handler()->is_unsigned(); max_length= (uint32)m_var_entry->length; - switch (m_var_entry->type) { + switch (m_var_entry->type_handler()->result_type()) { case REAL_RESULT: collation.set(&my_charset_numeric, DERIVATION_NUMERIC); fix_char_length(DBL_DIG + 8); @@ -5658,6 +5704,8 @@ collation.set(m_var_entry->charset(), DERIVATION_IMPLICIT); max_length= MAX_BLOB_WIDTH - 1; set_handler(&type_handler_long_blob); + if (m_var_entry->type_handler()->field_type() == MYSQL_TYPE_GEOMETRY) + set_handler(m_var_entry->type_handler()); break; case DECIMAL_RESULT: collation.set(&my_charset_numeric, DERIVATION_NUMERIC); @@ -5730,7 +5778,7 @@ DBUG_ASSERT(thd->lex->exchange); if (!(entry= get_variable(&thd->user_vars, &org_name, 1))) return TRUE; - entry->type= STRING_RESULT; + entry->set_handler(&type_handler_long_blob); /* Let us set the same collation which is used for loading of fields in LOAD DATA INFILE. @@ -5746,15 +5794,14 @@ void Item_user_var_as_out_param::set_null_value(CHARSET_INFO* cs) { - ::update_hash(entry, TRUE, 0, 0, STRING_RESULT, cs, 0 /* unsigned_arg */); + ::update_hash(entry, TRUE, 0, 0, &type_handler_long_blob, cs); } void Item_user_var_as_out_param::set_value(const char *str, uint length, CHARSET_INFO* cs) { - ::update_hash(entry, FALSE, (void*)str, length, STRING_RESULT, cs, - 0 /* unsigned_arg */); + ::update_hash(entry, FALSE, (void*)str, length, &type_handler_long_blob, cs); } @@ -6439,7 +6486,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return item->arguments()[0]->to_longlong_null() ^ @@ -6452,7 +6499,7 @@ public Item_handled_func::Handler_ulonglong { public: - Longlong_null to_longlong_null(Item_handled_func *item) const + Longlong_null to_longlong_null(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); return VDec(item->arguments()[0]).to_xlonglong_null() ^ @@ -7307,3 +7354,43 @@ ((Item_func_rownum*) item)->store_pointer_to_row_counter(ptr); } } + +static int do_pause(THD *thd, Interruptible_wait *timed_cond, mysql_cond_t *cond, double timeout) +{ + int error= 0; + timed_cond->set_timeout((ulonglong) (timeout * 1000000000.0)); + + mysql_cond_init(key_item_func_sleep_cond, cond, NULL); + mysql_mutex_lock(&LOCK_item_func_sleep); + + THD_STAGE_INFO(thd, stage_user_sleep); + thd->mysys_var->current_mutex= &LOCK_item_func_sleep; + thd->mysys_var->current_cond= cond; + + thd_wait_begin(thd, THD_WAIT_SLEEP); + while (!thd->killed) + { + error= timed_cond->wait(cond, &LOCK_item_func_sleep); + if (error == ETIMEDOUT || error == ETIME) + break; + error= 0; + } + thd_wait_end(thd); + mysql_mutex_unlock(&LOCK_item_func_sleep); + mysql_mutex_lock(&thd->mysys_var->mutex); + thd->mysys_var->current_mutex= 0; + thd->mysys_var->current_cond= 0; + mysql_mutex_unlock(&thd->mysys_var->mutex); + + mysql_cond_destroy(cond); + + return error; +} + +void pause_execution(THD *thd, double timeout) +{ + Interruptible_wait timed_cond(thd); + mysql_cond_t cond; + + do_pause(thd, &timed_cond, &cond, timeout); +} diff -Nru mariadb-10.11.6/sql/item_func.h mariadb-10.11.9/sql/item_func.h --- mariadb-10.11.6/sql/item_func.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_func.h 2024-08-03 07:29:58.000000000 +0000 @@ -55,9 +55,41 @@ bool check_argument_types_can_return_date(uint start, uint end) const; bool check_argument_types_can_return_time(uint start, uint end) const; void print_cast_temporal(String *str, enum_query_type query_type); + + void print_schema_qualified_name(String *to, + const LEX_CSTRING &schema_name, + const LEX_CSTRING &function_name) const + { + // e.g. oracle_schema.func() + to->append(schema_name); + to->append('.'); + to->append(function_name); + } + + void print_sql_mode_qualified_name(String *to, + enum_query_type query_type, + const LEX_CSTRING &function_name) const + { + const Schema *func_schema= schema(); + if (!func_schema || func_schema == Schema::find_implied(current_thd)) + to->append(function_name); + else + print_schema_qualified_name(to, func_schema->name(), function_name); + } + + void print_sql_mode_qualified_name(String *to, enum_query_type query_type) + const + { + return print_sql_mode_qualified_name(to, query_type, func_name_cstring()); + } + public: - table_map not_null_tables_cache; + // Print an error message for a builtin-schema qualified function call + static void wrong_param_count_error(const LEX_CSTRING &schema_name, + const LEX_CSTRING &func_name); + + table_map not_null_tables_cache= 0; enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC, GE_FUNC,GT_FUNC,FT_FUNC, @@ -79,6 +111,38 @@ CASE_SEARCHED_FUNC, // Used by ColumnStore/Spider CASE_SIMPLE_FUNC, // Used by ColumnStore/spider, }; + + /* + A function bitmap. Useful when some operation needs to be applied only + to certain functions. For now we only need to distinguish some + comparison predicates. + */ + enum Bitmap : ulonglong + { + BITMAP_NONE= 0, + BITMAP_EQ= 1ULL << EQ_FUNC, + BITMAP_EQUAL= 1ULL << EQUAL_FUNC, + BITMAP_NE= 1ULL << NE_FUNC, + BITMAP_LT= 1ULL << LT_FUNC, + BITMAP_LE= 1ULL << LE_FUNC, + BITMAP_GE= 1ULL << GE_FUNC, + BITMAP_GT= 1ULL << GT_FUNC, + BITMAP_LIKE= 1ULL << LIKE_FUNC, + BITMAP_BETWEEN= 1ULL << BETWEEN, + BITMAP_IN= 1ULL << IN_FUNC, + BITMAP_MULT_EQUAL= 1ULL << MULT_EQUAL_FUNC, + BITMAP_OTHER= 1ULL << 63, + BITMAP_ALL= 0xFFFFFFFFFFFFFFFFULL, + BITMAP_ANY_EQUALITY= BITMAP_EQ | BITMAP_EQUAL | BITMAP_MULT_EQUAL, + BITMAP_EXCEPT_ANY_EQUALITY= BITMAP_ALL & ~BITMAP_ANY_EQUALITY, + }; + + ulonglong bitmap_bit() const + { + Functype type= functype(); + return 1ULL << (type > 63 ? 63 : type); + } + static scalar_comparison_op functype_to_scalar_comparison_op(Functype type) { switch (type) { @@ -170,11 +234,17 @@ List &fields, uint flags) override; void print(String *str, enum_query_type query_type) override; void print_op(String *str, enum_query_type query_type); - void print_args(String *str, uint from, enum_query_type query_type); + void print_args(String *str, uint from, enum_query_type query_type) const; + void print_args_parenthesized(String *str, enum_query_type query_type) const + { + str->append('('); + print_args(str, 0, query_type); + str->append(')'); + } bool is_null() override - { + { update_null_value(); - return null_value; + return null_value; } String *val_str_from_val_str_ascii(String *str, String *str2); @@ -388,17 +458,8 @@ } } void convert_const_compared_to_int_field(THD *thd); - /** - Prepare arguments and setup a comparator. - Used in Item_func_xxx with two arguments and a comparator, - e.g. Item_bool_func2 and Item_func_nullif. - args[0] or args[1] can be modified: - - converted to character set and collation of the operation - - or replaced to an Item_int_with_ref - */ - bool setup_args_and_comparator(THD *thd, Arg_comparator *cmp); Item_func *get_item_func() override { return this; } - bool is_simplified_cond_processor(void *arg) override + bool is_simplified_cond_processor(void *) override { return const_item() && !val_int(); } }; @@ -506,30 +567,30 @@ class Handler_str: public Handler { public: - String *val_str_ascii(Item_handled_func *item, String *str) const + String *val_str_ascii(Item_handled_func *item, String *str) const override { return item->Item::val_str_ascii(str); } - double val_real(Item_handled_func *item) const + double val_real(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); StringBuffer<64> tmp; String *res= item->val_str(&tmp); return res ? item->double_from_string_with_check(res) : 0.0; } - longlong val_int(Item_handled_func *item) const + longlong val_int(Item_handled_func *item) const override { DBUG_ASSERT(item->fixed()); StringBuffer<22> tmp; String *res= item->val_str(&tmp); return res ? item->longlong_from_string_with_check(res) : 0; } - my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const + my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const override { return item->val_decimal_from_string(to); } bool get_date(THD *thd, Item_handled_func *item, MYSQL_TIME *to, - date_mode_t fuzzydate) const + date_mode_t fuzzydate) const override { return item->get_date_from_string(thd, to, fuzzydate); } @@ -542,7 +603,7 @@ class Handler_temporal: public Handler { public: - String *val_str(Item_handled_func *item, String *to) const + String *val_str(Item_handled_func *item, String *to) const override { StringBuffer ascii_buf; return item->val_str_from_val_str_ascii(to, &ascii_buf); @@ -557,28 +618,28 @@ class Handler_temporal_string: public Handler_temporal { public: - const Type_handler *return_type_handler(const Item_handled_func *) const + const Type_handler *return_type_handler(const Item_handled_func *) const override { return &type_handler_string; } const Type_handler * - type_handler_for_create_select(const Item_handled_func *item) const + type_handler_for_create_select(const Item_handled_func *item) const override { return return_type_handler(item)->type_handler_for_tmp_table(item); } - double val_real(Item_handled_func *item) const + double val_real(Item_handled_func *item) const override { return Temporal_hybrid(item).to_double(); } - longlong val_int(Item_handled_func *item) const + longlong val_int(Item_handled_func *item) const override { return Temporal_hybrid(item).to_longlong(); } - my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const + my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const override { return Temporal_hybrid(item).to_decimal(to); } - String *val_str_ascii(Item_handled_func *item, String *to) const + String *val_str_ascii(Item_handled_func *item, String *to) const override { return Temporal_hybrid(item).to_string(to, item->decimals); } @@ -588,28 +649,28 @@ class Handler_date: public Handler_temporal { public: - const Type_handler *return_type_handler(const Item_handled_func *) const + const Type_handler *return_type_handler(const Item_handled_func *) const override { return &type_handler_newdate; } - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { item->fix_attributes_date(); return false; } - double val_real(Item_handled_func *item) const + double val_real(Item_handled_func *item) const override { return Date(item).to_double(); } - longlong val_int(Item_handled_func *item) const + longlong val_int(Item_handled_func *item) const override { return Date(item).to_longlong(); } - my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const + my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const override { return Date(item).to_decimal(to); } - String *val_str_ascii(Item_handled_func *item, String *to) const + String *val_str_ascii(Item_handled_func *item, String *to) const override { return Date(item).to_string(to); } @@ -619,27 +680,27 @@ class Handler_time: public Handler_temporal { public: - const Type_handler *return_type_handler(const Item_handled_func *) const + const Type_handler *return_type_handler(const Item_handled_func *) const override { return &type_handler_time2; } - double val_real(Item_handled_func *item) const + double val_real(Item_handled_func *item) const override { return Time(item).to_double(); } - longlong val_int(Item_handled_func *item) const + longlong val_int(Item_handled_func *item) const override { return Time(item).to_longlong(); } - my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const + my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const override { return Time(item).to_decimal(to); } - String *val_str_ascii(Item_handled_func *item, String *to) const + String *val_str_ascii(Item_handled_func *item, String *to) const override { return Time(item).to_string(to, item->decimals); } - bool val_native(THD *thd, Item_handled_func *item, Native *to) const + bool val_native(THD *thd, Item_handled_func *item, Native *to) const override { return Time(thd, item).to_native(to, item->decimals); } @@ -649,23 +710,23 @@ class Handler_datetime: public Handler_temporal { public: - const Type_handler *return_type_handler(const Item_handled_func *) const + const Type_handler *return_type_handler(const Item_handled_func *) const override { return &type_handler_datetime2; } - double val_real(Item_handled_func *item) const + double val_real(Item_handled_func *item) const override { return Datetime(item).to_double(); } - longlong val_int(Item_handled_func *item) const + longlong val_int(Item_handled_func *item) const override { return Datetime(item).to_longlong(); } - my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const + my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const override { return Datetime(item).to_decimal(to); } - String *val_str_ascii(Item_handled_func *item, String *to) const + String *val_str_ascii(Item_handled_func *item, String *to) const override { return Datetime(item).to_string(to, item->decimals); } @@ -675,7 +736,7 @@ class Handler_int: public Handler { public: - String *val_str(Item_handled_func *item, String *to) const + String *val_str(Item_handled_func *item, String *to) const override { longlong nr= val_int(item); if (item->null_value) @@ -683,25 +744,25 @@ to->set_int(nr, item->unsigned_flag, item->collation.collation); return to; } - String *val_str_ascii(Item_handled_func *item, String *to) const + String *val_str_ascii(Item_handled_func *item, String *to) const override { return item->Item::val_str_ascii(to); } - double val_real(Item_handled_func *item) const + double val_real(Item_handled_func *item) const override { return item->unsigned_flag ? (double) ((ulonglong) val_int(item)) : (double) val_int(item); } - my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const + my_decimal *val_decimal(Item_handled_func *item, my_decimal *to) const override { return item->val_decimal_from_int(to); } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzydate) const + MYSQL_TIME *to, date_mode_t fuzzydate) const override { return item->get_date_from_int(thd, to, fuzzydate); } - longlong val_int(Item_handled_func *item) const + longlong val_int(Item_handled_func *item) const override { Longlong_null tmp= to_longlong_null(item); item->null_value= tmp.is_null(); @@ -713,11 +774,11 @@ class Handler_slong: public Handler_int { public: - const Type_handler *return_type_handler(const Item_handled_func *item) const + const Type_handler *return_type_handler(const Item_handled_func *item) const override { return &type_handler_slong; } - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { item->unsigned_flag= false; item->collation= DTCollation_numeric(); @@ -729,7 +790,7 @@ class Handler_slong2: public Handler_slong { public: - bool fix_length_and_dec(Item_handled_func *func) const + bool fix_length_and_dec(Item_handled_func *func) const override { bool rc= Handler_slong::fix_length_and_dec(func); func->max_length= 2; @@ -740,11 +801,11 @@ class Handler_ulonglong: public Handler_int { public: - const Type_handler *return_type_handler(const Item_handled_func *item) const + const Type_handler *return_type_handler(const Item_handled_func *item) const override { return &type_handler_ulonglong; } - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { item->unsigned_flag= true; item->collation= DTCollation_numeric(); @@ -1041,7 +1102,7 @@ Item_func_case_expression(THD *thd, List &list): Item_func_hybrid_field_type(thd, list) { } - bool find_not_null_fields(table_map allowed) { return false; } + bool find_not_null_fields(table_map allowed) override { return false; } }; @@ -1070,18 +1131,18 @@ Item_func_numhybrid(THD *thd, List &list): Item_func_hybrid_field_type(thd, list) { } - String *str_op(String *str) { DBUG_ASSERT(0); return 0; } - bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + String *str_op(String *str) override { DBUG_ASSERT(0); return 0; } + bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override { DBUG_ASSERT(0); return true; } - bool time_op(THD *thd, MYSQL_TIME *ltime) + bool time_op(THD *thd, MYSQL_TIME *ltime) override { DBUG_ASSERT(0); return true; } - bool native_op(THD *thd, Native *to) + bool native_op(THD *thd, Native *to) override { DBUG_ASSERT(0); return true; @@ -1095,8 +1156,8 @@ public: Item_func_num1(THD *thd, Item *a): Item_func_numhybrid(thd, a) {} Item_func_num1(THD *thd, Item *a, Item *b): Item_func_numhybrid(thd, a, b) {} - bool check_partition_func_processor(void *int_arg) { return FALSE; } - bool check_vcol_func_processor(void *arg) { return FALSE; } + bool check_partition_func_processor(void *int_arg) override { return FALSE; } + bool check_vcol_func_processor(void *arg) override { return FALSE; } }; @@ -1202,6 +1263,24 @@ }; +class Item_long_ge0_func: public Item_int_func +{ +public: + Item_long_ge0_func(THD *thd): Item_int_func(thd) { } + Item_long_ge0_func(THD *thd, Item *a): Item_int_func(thd, a) {} + Item_long_ge0_func(THD *thd, Item *a, Item *b): Item_int_func(thd, a, b) {} + Item_long_ge0_func(THD *thd, Item *a, Item *b, Item *c): Item_int_func(thd, a, b, c) {} + Item_long_ge0_func(THD *thd, List &list): Item_int_func(thd, list) { } + Item_long_ge0_func(THD *thd, Item_long_ge0_func *item) :Item_int_func(thd, item) {} + const Type_handler *type_handler() const override + { + DBUG_ASSERT(!unsigned_flag); + return &type_handler_slong_ge0; + } + bool fix_length_and_dec(THD *) override { max_length= 10; return FALSE; } +}; + + class Item_func_hash: public Item_int_func { public: @@ -1211,7 +1290,7 @@ bool fix_length_and_dec(THD *thd) override; const Type_handler *type_handler() const override { return &type_handler_slong; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } LEX_CSTRING func_name_cstring() const override { @@ -1226,10 +1305,14 @@ Item_func_hash_mariadb_100403(THD *thd, List &item) :Item_func_hash(thd, item) {} - longlong val_int(); - Item *get_copy(THD *thd) + longlong val_int() override; + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } - const char *func_name() const { return ""; } + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING name= {STRING_WITH_LEN("") }; + return name; + } }; class Item_longlong_func: public Item_int_func @@ -1289,7 +1372,7 @@ { return Cursor_ref::print_func(str, func_name_cstring()); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1314,7 +1397,7 @@ return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1346,6 +1429,13 @@ { fix_char_length(MAX_BIGINT_WIDTH); } + void fix_length_and_dec_sint_ge0() + { + uint32 digits= args[0]->decimal_precision(); + DBUG_ASSERT(digits > 0); + DBUG_ASSERT(digits <= MY_INT64_NUM_DECIMAL_DIGITS); + fix_char_length(digits + (unsigned_flag ? 0 : 1/*sign*/)); + } void fix_length_and_dec_generic() { uint32 char_length= MY_MIN(args[0]->max_char_length(), @@ -1379,7 +1469,7 @@ decimal_digits_t decimal_precision() const override { return args[0]->decimal_precision(); } bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1414,7 +1504,7 @@ } decimal_digits_t decimal_precision() const override { return max_length; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1455,7 +1545,7 @@ } void print(String *str, enum_query_type query_type) override; bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1471,8 +1561,8 @@ decimals= (uint8) dec; max_length= (uint32) len; } - bool need_parentheses_in_default() { return true; } - void print(String *str, enum_query_type query_type); + bool need_parentheses_in_default() override { return true; } + void print(String *str, enum_query_type query_type) override; void fix_length_and_dec_generic() { set_maybe_null(); @@ -1510,7 +1600,7 @@ nr.to_string(str, decimals); return str; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1532,7 +1622,7 @@ return name; } double val_real() override { return val_real_with_truncate(DBL_MAX); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1541,9 +1631,9 @@ { public: Item_func_additive_op(THD *thd, Item *a, Item *b): Item_num_op(thd, a, b) {} - void result_precision(); - bool check_partition_func_processor(void *int_arg) {return FALSE;} - bool check_vcol_func_processor(void *arg) { return FALSE;} + void result_precision() override; + bool check_partition_func_processor(void *int_arg) override {return FALSE;} + bool check_vcol_func_processor(void *arg) override { return FALSE;} }; @@ -1562,7 +1652,7 @@ longlong int_op() override; double real_op() override; my_decimal *decimal_op(my_decimal *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1601,7 +1691,7 @@ Item_func_additive_op::fix_length_and_dec_int(); fix_unsigned_flag(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1624,7 +1714,7 @@ bool fix_length_and_dec(THD *thd) override; bool check_partition_func_processor(void *int_arg) override {return FALSE;} bool check_vcol_func_processor(void *arg) override { return FALSE;} - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1647,7 +1737,7 @@ void fix_length_and_dec_double(); void fix_length_and_dec_int(); void result_precision() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1675,7 +1765,7 @@ bool check_partition_func_processor(void *int_arg) override {return FALSE;} bool check_vcol_func_processor(void *arg) override { return FALSE;} bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1713,7 +1803,7 @@ } bool check_partition_func_processor(void *int_arg) override {return FALSE;} bool check_vcol_func_processor(void *arg) override { return FALSE;} - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1744,7 +1834,7 @@ decimal_digits_t decimal_precision() const override { return args[0]->decimal_precision(); } bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1762,10 +1852,11 @@ return name; } void fix_length_and_dec_int(); + void fix_length_and_dec_sint_ge0(); void fix_length_and_dec_double(); void fix_length_and_dec_decimal(); bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1797,7 +1888,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("exp") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1812,7 +1903,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("ln") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1828,7 +1919,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("log") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1843,7 +1934,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("log2") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1858,7 +1949,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("log10") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1873,7 +1964,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("sqrt") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1888,7 +1979,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("pow") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1903,7 +1994,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("acos") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1917,7 +2008,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("asin") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1932,7 +2023,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("atan") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1946,7 +2037,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("cos") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1960,7 +2051,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("sin") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1974,7 +2065,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("tan") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1988,7 +2079,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("cot") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2035,7 +2126,7 @@ my_decimal *decimal_op(my_decimal *) override; bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override; bool time_op(THD *thd, MYSQL_TIME *ltime) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2055,7 +2146,7 @@ my_decimal *decimal_op(my_decimal *) override; bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override; bool time_op(THD *thd, MYSQL_TIME *ltime) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2091,6 +2182,7 @@ void fix_arg_int(const Type_handler *preferred, const Type_std_attributes *preferred_attributes, bool use_decimal_on_length_increase); + void fix_arg_slong_ge0(); void fix_arg_hex_hybrid(); void fix_arg_double(); void fix_arg_time(); @@ -2104,7 +2196,7 @@ */ return args[0]->real_type_handler()->Item_func_round_fix_length_and_dec(this); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2134,7 +2226,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2183,7 +2275,7 @@ return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override { return 0; } + Item *do_get_copy(THD *thd) const override { return 0; } /* This function is used in insert, update and delete */ void store_pointer_to_row_counter(ha_rows *row_counter) { @@ -2208,7 +2300,7 @@ decimal_digits_t decimal_precision() const override { return 1; } bool fix_length_and_dec(THD *thd) override { fix_char_length(2); return FALSE; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2235,7 +2327,7 @@ max_length= float_length(decimals); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2341,7 +2433,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("least") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2354,7 +2446,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("greatest") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2394,7 +2486,7 @@ Type_std_attributes::set(*args[0]); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2420,7 +2512,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("octet_length") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2440,7 +2532,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("bit_length") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2455,12 +2547,14 @@ static LEX_CSTRING name= {STRING_WITH_LEN("char_length") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; class Item_func_coercibility :public Item_long_func { + longlong m_cached_collation_derivation; + bool check_arguments() const override { return args[0]->check_type_can_return_str(func_name_cstring()); } public: @@ -2471,12 +2565,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("coercibility") }; return name; } - bool fix_length_and_dec(THD *thd) override - { - max_length=10; - base_flags&= ~item_base_t::MAYBE_NULL; - return FALSE; - } + bool fix_length_and_dec(THD *thd) override; bool eval_not_null_tables(void *) override { not_null_tables_cache= 0; @@ -2490,8 +2579,9 @@ override { return this; } bool const_item() const override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + table_map used_tables() const override { return 0; } }; @@ -2527,7 +2617,7 @@ return agg_arg_charsets_for_comparison(cmp_collation, args, 2); } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2546,7 +2636,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2565,7 +2655,7 @@ return name; } bool fix_length_and_dec(THD *thd) override { max_length=3; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2583,7 +2673,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("ord") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2605,7 +2695,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2651,7 +2741,7 @@ return name; } enum precedence precedence() const override { return BITOR_PRECEDENCE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2667,7 +2757,7 @@ return name; } enum precedence precedence() const override { return BITAND_PRECEDENCE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2683,7 +2773,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2699,7 +2789,7 @@ return name; } enum precedence precedence() const override { return SHIFT_PRECEDENCE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2715,7 +2805,7 @@ return name; } enum precedence precedence() const override { return SHIFT_PRECEDENCE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2735,7 +2825,7 @@ str->append(func_name_cstring()); args[0]->print_parenthesised(str, query_type, precedence()); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2765,7 +2855,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2798,7 +2888,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2829,7 +2919,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2986,7 +3076,7 @@ const Type_handler *type_handler() const override { return &type_handler_double; } bool fix_length_and_dec(THD *thd) override { fix_num_length_and_dec(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3013,7 +3103,7 @@ return &type_handler_slonglong; } bool fix_length_and_dec(THD *thd) override { decimals= 0; max_length= 21; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3041,7 +3131,7 @@ const Type_handler *type_handler() const override { return &type_handler_newdecimal; } bool fix_length_and_dec(THD *thd) override { fix_num_length_and_dec(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3081,7 +3171,7 @@ const Type_handler *type_handler() const override { return string_type_handler(); } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3174,7 +3264,7 @@ String value; public: Item_func_get_lock(THD *thd, Item *a, Item *b) :Item_func_lock(thd, a, b) {} - longlong val_int() final; + longlong val_int() override final; LEX_CSTRING func_name_cstring() const override final { static LEX_CSTRING name= {STRING_WITH_LEN("get_lock") }; @@ -3186,7 +3276,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) final + Item *do_get_copy(THD *thd) const override final { return get_item_copy(thd, this); } }; @@ -3196,13 +3286,13 @@ public: Item_func_release_all_locks(THD *thd): Item_func_lock(thd) { unsigned_flag= 1; } - longlong val_int() final; + longlong val_int() override final; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("release_all_locks") }; return name; } - Item *get_copy(THD *thd) final + Item *do_get_copy(THD *thd) const override final { return get_item_copy(thd, this); } }; @@ -3214,7 +3304,7 @@ String value; public: Item_func_release_lock(THD *thd, Item *a): Item_func_lock(thd, a) {} - longlong val_int() final; + longlong val_int() override final; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("release_lock") }; @@ -3226,7 +3316,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) final + Item *do_get_copy(THD *thd) const override final { return get_item_copy(thd, this); } }; @@ -3267,7 +3357,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3296,7 +3386,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3323,16 +3413,16 @@ :Item_hybrid_func(thd, item), m_var_entry(item->m_var_entry), name(item->name) { } Field *create_tmp_field_ex(MEM_ROOT *root, TABLE *table, Tmp_field_src *src, - const Tmp_field_param *param) + const Tmp_field_param *param) override { DBUG_ASSERT(fixed()); return create_tmp_field_ex_from_handler(root, table, src, param, type_handler()); } - Field *create_field_for_create_select(MEM_ROOT *root, TABLE *table) + Field *create_field_for_create_select(MEM_ROOT *root, TABLE *table) override { return create_table_field_from_handler(root, table); } - bool check_vcol_func_processor(void *arg); - bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + bool check_vcol_func_processor(void *arg) override; + bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override { return type_handler()->Item_get_date_with_warn(thd, this, ltime, fuzzydate); } @@ -3386,8 +3476,8 @@ String *str_result(String *str) override; my_decimal *val_decimal_result(my_decimal *) override; bool is_null_result() override; - bool update_hash(void *ptr, size_t length, enum Item_result type, - CHARSET_INFO *cs, bool unsigned_arg); + bool update_hash(void *ptr, size_t length, const Type_handler *th, + CHARSET_INFO *cs); bool send(Protocol *protocol, st_value *buffer) override; void make_send_field(THD *thd, Send_field *tmp_field) override; bool check(bool use_result_field); @@ -3417,7 +3507,7 @@ bool register_field_in_bitmap(void *arg) override; bool set_entry(THD *thd, bool create_if_not_exists); void cleanup() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool excl_dep_on_table(table_map tab_map) override { return false; } }; @@ -3450,7 +3540,7 @@ table_map used_tables() const override { return const_item() ? 0 : RAND_TABLE_BIT; } bool eq(const Item *item, bool binary_cmp) const override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } private: bool set_value(THD *thd, sp_rcontext *ctx, Item **it) override; @@ -3533,8 +3623,9 @@ void set_value(const char *str, uint length, CHARSET_INFO* cs); const Type_handler *type_handler() const override { return &type_handler_double; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -3596,7 +3687,7 @@ void cleanup() override; bool check_vcol_func_processor(void *arg) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3659,9 +3750,9 @@ { return mark_unsupported_function("match ... against()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } - Item *build_clone(THD *thd) override { return 0; } + Item *do_build_clone(THD *thd) const override { return nullptr; } private: /** Check whether storage engine for given table, @@ -3711,7 +3802,7 @@ return name; } enum precedence precedence() const override { return BITXOR_PRECEDENCE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3739,7 +3830,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3766,7 +3857,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3833,7 +3924,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -3971,7 +4062,7 @@ { return TRUE; } - Item *get_copy(THD *) override { return 0; } + Item *do_get_copy(THD *thd) const override { return 0; } bool eval_not_null_tables(void *opt_arg) override { not_null_tables_cache= 0; @@ -4006,7 +4097,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -4029,7 +4120,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -4059,7 +4150,7 @@ max_length= 11; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -4086,7 +4177,7 @@ return mark_unsupported_function(func_name(), "()", arg, VCOL_NON_DETERMINISTIC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -4127,7 +4218,7 @@ Item_func::update_used_tables(); copy_flags(last_value, item_base_t::MAYBE_NULL); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -4172,7 +4263,7 @@ } } bool const_item() const override { return 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } void print(String *str, enum_query_type query_type) override; bool check_vcol_func_processor(void *arg) override @@ -4195,7 +4286,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("lastval") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -4220,10 +4311,11 @@ return name; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; +class Interruptible_wait; Item *get_system_var(THD *thd, enum_var_type var_type, const LEX_CSTRING *name, const LEX_CSTRING *component); @@ -4234,7 +4326,6 @@ extern bool volatile mqh_used; bool update_hash(user_var_entry *entry, bool set_null, void *ptr, size_t length, - Item_result type, CHARSET_INFO *cs, - bool unsigned_arg); + const Type_handler *th, CHARSET_INFO *cs); #endif /* ITEM_FUNC_INCLUDED */ diff -Nru mariadb-10.11.6/sql/item_geofunc.cc mariadb-10.11.9/sql/item_geofunc.cc --- mariadb-10.11.6/sql/item_geofunc.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_geofunc.cc 2024-08-03 07:29:58.000000000 +0000 @@ -2787,7 +2787,7 @@ protected: Create_func_area() = default; - virtual ~Create_func_area() = default; + ~Create_func_area() override = default; }; @@ -2803,7 +2803,7 @@ protected: Create_func_as_wkb() = default; - virtual ~Create_func_as_wkb() = default; + ~Create_func_as_wkb() override = default; }; @@ -2819,7 +2819,7 @@ protected: Create_func_as_wkt() = default; - virtual ~Create_func_as_wkt() = default; + ~Create_func_as_wkt() override = default; }; @@ -2836,7 +2836,7 @@ protected: Create_func_centroid() = default; - virtual ~Create_func_centroid() = default; + ~Create_func_centroid() override = default; }; @@ -2852,7 +2852,7 @@ protected: Create_func_convexhull() = default; - virtual ~Create_func_convexhull() = default; + ~Create_func_convexhull() override = default; }; @@ -2868,7 +2868,7 @@ protected: Create_func_pointonsurface() = default; - virtual ~Create_func_pointonsurface() = default; + ~Create_func_pointonsurface() override = default; }; @@ -2885,7 +2885,7 @@ protected: Create_func_mbr_contains() = default; - virtual ~Create_func_mbr_contains() = default; + ~Create_func_mbr_contains() override = default; }; @@ -2901,7 +2901,7 @@ protected: Create_func_contains() = default; - virtual ~Create_func_contains() = default; + ~Create_func_contains() override = default; }; @@ -2917,7 +2917,7 @@ protected: Create_func_crosses() = default; - virtual ~Create_func_crosses() = default; + ~Create_func_crosses() override = default; }; @@ -2933,7 +2933,7 @@ protected: Create_func_dimension() = default; - virtual ~Create_func_dimension() = default; + ~Create_func_dimension() override = default; }; @@ -2950,7 +2950,7 @@ protected: Create_func_mbr_disjoint() = default; - virtual ~Create_func_mbr_disjoint() = default; + ~Create_func_mbr_disjoint() override = default; }; @@ -2966,7 +2966,7 @@ protected: Create_func_disjoint() = default; - virtual ~Create_func_disjoint() = default; + ~Create_func_disjoint() override = default; }; @@ -2982,7 +2982,7 @@ protected: Create_func_distance() = default; - virtual ~Create_func_distance() = default; + ~Create_func_distance() override = default; }; @@ -2995,7 +2995,7 @@ protected: Create_func_distance_sphere() = default; - virtual ~Create_func_distance_sphere() = default; + ~Create_func_distance_sphere() override = default; }; @@ -3030,7 +3030,7 @@ protected: Create_func_endpoint() = default; - virtual ~Create_func_endpoint() = default; + ~Create_func_endpoint() override = default; }; @@ -3046,7 +3046,7 @@ protected: Create_func_envelope() = default; - virtual ~Create_func_envelope() = default; + ~Create_func_envelope() override = default; }; class Create_func_boundary : public Create_func_arg1 @@ -3061,7 +3061,7 @@ protected: Create_func_boundary() = default; - virtual ~Create_func_boundary() = default; + ~Create_func_boundary() override = default; }; @@ -3078,7 +3078,7 @@ protected: Create_func_mbr_equals() = default; - virtual ~Create_func_mbr_equals() = default; + ~Create_func_mbr_equals() override = default; }; @@ -3095,7 +3095,7 @@ protected: Create_func_equals() = default; - virtual ~Create_func_equals() = default; + ~Create_func_equals() override = default; }; @@ -3112,7 +3112,7 @@ protected: Create_func_exteriorring() = default; - virtual ~Create_func_exteriorring() = default; + ~Create_func_exteriorring() override = default; }; @@ -3127,7 +3127,7 @@ protected: Create_func_geometry_from_text() = default; - virtual ~Create_func_geometry_from_text() = default; + ~Create_func_geometry_from_text() override = default; }; @@ -3178,7 +3178,7 @@ protected: Create_func_geometry_from_wkb() = default; - virtual ~Create_func_geometry_from_wkb() = default; + ~Create_func_geometry_from_wkb() override = default; }; @@ -3228,7 +3228,7 @@ protected: Create_func_geometry_from_json() = default; - virtual ~Create_func_geometry_from_json() = default; + ~Create_func_geometry_from_json() override = default; }; @@ -3288,7 +3288,7 @@ protected: Create_func_as_geojson() = default; - virtual ~Create_func_as_geojson() = default; + ~Create_func_as_geojson() override = default; }; @@ -3348,7 +3348,7 @@ protected: Create_func_geometry_type() = default; - virtual ~Create_func_geometry_type() = default; + ~Create_func_geometry_type() override = default; }; @@ -3365,7 +3365,7 @@ protected: Create_func_geometryn() = default; - virtual ~Create_func_geometryn() = default; + ~Create_func_geometryn() override = default; }; @@ -3382,7 +3382,7 @@ protected: Create_func_gis_debug() = default; - virtual ~Create_func_gis_debug() = default; + ~Create_func_gis_debug() override = default; }; #endif @@ -3399,7 +3399,7 @@ protected: Create_func_glength() = default; - virtual ~Create_func_glength() = default; + ~Create_func_glength() override = default; }; @@ -3416,7 +3416,7 @@ protected: Create_func_interiorringn() = default; - virtual ~Create_func_interiorringn() = default; + ~Create_func_interiorringn() override = default; }; @@ -3432,7 +3432,7 @@ protected: Create_func_relate() = default; - virtual ~Create_func_relate() = default; + ~Create_func_relate() override = default; }; @@ -3449,7 +3449,7 @@ protected: Create_func_mbr_intersects() = default; - virtual ~Create_func_mbr_intersects() = default; + ~Create_func_mbr_intersects() override = default; }; @@ -3466,7 +3466,7 @@ protected: Create_func_intersects() = default; - virtual ~Create_func_intersects() = default; + ~Create_func_intersects() override = default; }; @@ -3483,7 +3483,7 @@ protected: Create_func_intersection() = default; - virtual ~Create_func_intersection() = default; + ~Create_func_intersection() override = default; }; @@ -3500,7 +3500,7 @@ protected: Create_func_difference() = default; - virtual ~Create_func_difference() = default; + ~Create_func_difference() override = default; }; @@ -3517,7 +3517,7 @@ protected: Create_func_union() = default; - virtual ~Create_func_union() = default; + ~Create_func_union() override = default; }; @@ -3534,7 +3534,7 @@ protected: Create_func_symdifference() = default; - virtual ~Create_func_symdifference() = default; + ~Create_func_symdifference() override = default; }; @@ -3550,7 +3550,7 @@ protected: Create_func_buffer() = default; - virtual ~Create_func_buffer() = default; + ~Create_func_buffer() override = default; }; @@ -3566,7 +3566,7 @@ protected: Create_func_isclosed() = default; - virtual ~Create_func_isclosed() = default; + ~Create_func_isclosed() override = default; }; @@ -3582,7 +3582,7 @@ protected: Create_func_isring() = default; - virtual ~Create_func_isring() = default; + ~Create_func_isring() override = default; }; @@ -3598,7 +3598,7 @@ protected: Create_func_isempty() = default; - virtual ~Create_func_isempty() = default; + ~Create_func_isempty() override = default; }; @@ -3614,7 +3614,7 @@ protected: Create_func_issimple() = default; - virtual ~Create_func_issimple() = default; + ~Create_func_issimple() override = default; }; @@ -3631,7 +3631,7 @@ protected: Create_func_numgeometries() = default; - virtual ~Create_func_numgeometries() = default; + ~Create_func_numgeometries() override = default; }; @@ -3647,7 +3647,7 @@ protected: Create_func_numinteriorring() = default; - virtual ~Create_func_numinteriorring() = default; + ~Create_func_numinteriorring() override = default; }; @@ -3663,7 +3663,7 @@ protected: Create_func_numpoints() = default; - virtual ~Create_func_numpoints() = default; + ~Create_func_numpoints() override = default; }; @@ -3680,7 +3680,7 @@ protected: Create_func_mbr_overlaps() = default; - virtual ~Create_func_mbr_overlaps() = default; + ~Create_func_mbr_overlaps() override = default; }; @@ -3697,7 +3697,7 @@ protected: Create_func_overlaps() = default; - virtual ~Create_func_overlaps() = default; + ~Create_func_overlaps() override = default; }; @@ -3716,7 +3716,7 @@ protected: Create_func_pointn() = default; - virtual ~Create_func_pointn() = default; + ~Create_func_pointn() override = default; }; @@ -3734,7 +3734,7 @@ protected: Create_func_srid() = default; - virtual ~Create_func_srid() = default; + ~Create_func_srid() override = default; }; @@ -3751,7 +3751,7 @@ protected: Create_func_startpoint() = default; - virtual ~Create_func_startpoint() = default; + ~Create_func_startpoint() override = default; }; @@ -3769,7 +3769,7 @@ protected: Create_func_touches() = default; - virtual ~Create_func_touches() = default; + ~Create_func_touches() override = default; }; @@ -3786,7 +3786,7 @@ protected: Create_func_mbr_within() = default; - virtual ~Create_func_mbr_within() = default; + ~Create_func_mbr_within() override = default; }; @@ -3803,7 +3803,7 @@ protected: Create_func_within() = default; - virtual ~Create_func_within() = default; + ~Create_func_within() override = default; }; @@ -3819,7 +3819,7 @@ protected: Create_func_x() = default; - virtual ~Create_func_x() = default; + ~Create_func_x() override = default; }; @@ -3835,7 +3835,7 @@ protected: Create_func_y() = default; - virtual ~Create_func_y() = default; + ~Create_func_y() override = default; }; diff -Nru mariadb-10.11.6/sql/item_geofunc.h mariadb-10.11.9/sql/item_geofunc.h --- mariadb-10.11.6/sql/item_geofunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_geofunc.h 2024-08-03 07:29:58.000000000 +0000 @@ -219,7 +219,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -241,7 +241,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -267,7 +267,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -284,7 +284,7 @@ } String *val_str_ascii(String *) override; bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -309,7 +309,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -336,7 +336,7 @@ } bool fix_length_and_dec(THD *thd) override; String *val_str_ascii(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -359,7 +359,7 @@ set_maybe_null(); return FALSE; }; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -398,7 +398,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -418,7 +418,7 @@ { return &type_handler_point; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -437,7 +437,7 @@ { return &type_handler_polygon; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -454,16 +454,16 @@ Transporter(Gcalc_result_receiver *receiver) : Gcalc_shape_transporter(NULL), m_receiver(receiver) {} - int single_point(double x, double y); - int start_line(); - int complete_line(); - int start_poly(); - int complete_poly(); - int start_ring(); - int complete_ring(); - int add_point(double x, double y); + int single_point(double x, double y) override; + int start_line() override; + int complete_line() override; + int start_poly() override; + int complete_poly() override; + int start_ring() override; + int complete_ring() override; + int add_point(double x, double y) override; - int start_collection(int n_objects); + int start_collection(int n_objects) override; }; Gcalc_result_receiver res_receiver; public: @@ -475,7 +475,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -498,7 +498,7 @@ { return &type_handler_point; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -527,7 +527,7 @@ } } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -564,7 +564,7 @@ } } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -624,7 +624,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("geometrycollection") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -644,7 +644,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("linestring") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -664,7 +664,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("polygon") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -686,7 +686,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("multilinestring") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -708,7 +708,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("multipoint") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -730,7 +730,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("multipolygon") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -782,7 +782,7 @@ usable_tables, sargables, false); } bool need_parentheses_in_default() override { return false; } - Item *build_clone(THD *thd) override { return 0; } + Item *do_build_clone(THD *thd) const override { return nullptr; } }; @@ -794,7 +794,7 @@ { } longlong val_int() override; LEX_CSTRING func_name_cstring() const override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -810,7 +810,7 @@ { } longlong val_int() override; LEX_CSTRING func_name_cstring() const override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -837,7 +837,7 @@ return name; } bool need_parentheses_in_default() override { return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -874,7 +874,7 @@ { Item_func::print(str, query_type); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -909,16 +909,16 @@ Gcalc_function::op_difference), skip_line(FALSE) {} - int single_point(double x, double y); - int start_line(); - int complete_line(); - int start_poly(); - int complete_poly(); - int start_ring(); - int complete_ring(); - int add_point(double x, double y); + int single_point(double x, double y) override; + int start_line() override; + int complete_line() override; + int start_poly() override; + int complete_poly() override; + int start_ring() override; + int complete_ring() override; + int add_point(double x, double y) override; - int start_collection(int n_objects); + int start_collection(int n_objects) override; }; Gcalc_heap collector; Gcalc_function func; @@ -935,7 +935,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -954,7 +954,7 @@ bool fix_length_and_dec(THD *thd) override { set_maybe_null(); return FALSE; } bool need_parentheses_in_default() override { return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -975,7 +975,7 @@ } bool fix_length_and_dec(THD *thd) override { decimals=0; max_length=2; return FALSE; } decimal_digits_t decimal_precision() const override { return 1; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -992,7 +992,7 @@ } bool fix_length_and_dec(THD *thd) override { decimals=0; max_length=2; return FALSE; } decimal_digits_t decimal_precision() const override { return 1; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1006,7 +1006,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("st_isring") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1023,7 +1023,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length= 10; set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1045,7 +1045,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1067,7 +1067,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1085,7 +1085,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length= 10; set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1103,7 +1103,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length= 10; set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1121,7 +1121,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length= 10; set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1143,7 +1143,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1167,7 +1167,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1185,7 +1185,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length= 10; set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1206,7 +1206,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("st_distance") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1224,7 +1224,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("st_distance_sphere") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1248,7 +1248,7 @@ { return &type_handler_point; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1270,7 +1270,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; #endif diff -Nru mariadb-10.11.6/sql/item_jsonfunc.cc mariadb-10.11.9/sql/item_jsonfunc.cc --- mariadb-10.11.6/sql/item_jsonfunc.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_jsonfunc.cc 2024-08-03 07:29:58.000000000 +0000 @@ -20,6 +20,17 @@ #include "item.h" #include "sql_parse.h" // For check_stack_overrun +#ifndef DBUG_OFF +static int dbug_json_check_min_stack_requirement() +{ + my_error(ER_STACK_OVERRUN_NEED_MORE, MYF(ME_FATAL), + my_thread_stack_size, my_thread_stack_size, STACK_MIN_SIZE); + return 1; +} +#endif + +extern void pause_execution(THD *thd, double timeout); + /* Allocating memory and *also* using it (reading and writing from it) because some build instructions cause @@ -28,12 +39,12 @@ correctly and causes json_debug_nonembedded to fail ( --error ER_STACK_OVERRUN_NEED_MORE does not occur). */ -#define ALLOCATE_MEM_ON_STACK(A) do \ - { \ - uchar *array= (uchar*)alloca(A); \ - bzero(array, A); \ - my_checksum(0, array, A); \ - } while(0) + +#define JSON_DO_PAUSE_EXECUTION(A, B) do \ + { \ + DBUG_EXECUTE_IF("json_pause_execution", \ + { pause_execution(A, B); }); \ + } while(0) /* Compare ASCII string against the string with the specified @@ -152,11 +163,8 @@ const json_path_step_t *temp_b= b; DBUG_EXECUTE_IF("json_check_min_stack_requirement", - { - long arbitrary_var; - long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var)); - ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE); - }); + return dbug_json_check_min_stack_requirement();); + if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) return 1; @@ -845,7 +853,7 @@ { collation.set(&my_charset_utf8mb3_general_ci, DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII); - max_length= args[0]->max_length; + max_length= args[0]->max_char_length() * collation.collation->mbmaxlen; set_maybe_null(); return FALSE; } @@ -911,7 +919,7 @@ { if (*tmp_paths == 0) { - MEM_ROOT *root= thd->stmt_arena->mem_root; + MEM_ROOT *root= thd->active_stmt_arena_to_use()->mem_root; *paths= (json_path_with_flags *) alloc_root(root, sizeof(json_path_with_flags) * n_paths); @@ -943,21 +951,47 @@ } -bool Item_json_str_multipath::fix_fields(THD *thd, Item **ref) +Item_json_str_multipath::~Item_json_str_multipath() { - return alloc_tmp_paths(thd, get_n_paths(), &paths, &tmp_paths) || - Item_str_func::fix_fields(thd, ref); + if (tmp_paths) + { + for (uint i= n_paths; i>0; i--) + tmp_paths[i-1].free(); + } } -void Item_json_str_multipath::cleanup() +bool Item_json_str_multipath::fix_fields(THD *thd, Item **ref) { - if (tmp_paths) + if (!tmp_paths) { - for (uint i= get_n_paths(); i>0; i--) - tmp_paths[i-1].free(); + /* + Remember the number of paths and allocate required memory on first time + the method fix_fields() is invoked. For prepared statements the method + fix_fields can be called several times for the same item because its + clean up is performed every item a prepared statement finishing its + execution. In result, the data member fixed is reset and the method + fix_field() is invoked on next time the same prepared statement be + executed. On the other side, any memory allocations on behalf of + the prepared statement must be performed only once on its first execution. + The data member tmp_path is kind a guard to do these activities only once + on first time the method fix_field() is called. + */ + n_paths= get_n_paths(); + + if (alloc_tmp_paths(thd, n_paths, &paths, &tmp_paths)) + return true; } - Item_str_func::cleanup(); + +#ifdef PROTECT_STATEMENT_MEMROOT + /* + Check that the number of paths remembered on first run of a statement + never changed later. + */ + DBUG_ASSERT(n_paths == get_n_paths()); +#endif + + return Item_str_func::fix_fields(thd, ref); } @@ -972,16 +1006,17 @@ } -static bool path_exact(const json_path_with_flags *paths_list, int n_paths, +static int path_exact(const json_path_with_flags *paths_list, int n_paths, const json_path_t *p, json_value_types vt, const int *array_size_counter) { + int count_path= 0; for (; n_paths > 0; n_paths--, paths_list++) { if (json_path_compare(&paths_list->p, p, vt, array_size_counter) == 0) - return TRUE; + count_path++; } - return FALSE; + return count_path; } @@ -1006,7 +1041,7 @@ json_engine_t je, sav_je; json_path_t p; const uchar *value; - int not_first_value= 0; + int not_first_value= 0, count_path= 0; uint n_arg; size_t v_len; int possible_multiple_values; @@ -1065,7 +1100,8 @@ array_size_counter + (p.last_step - p.steps))) goto error; - if (!path_exact(paths, arg_count-1, &p, je.value_type, array_size_counter)) + if (!(count_path= path_exact(paths, arg_count-1, &p, je.value_type, + array_size_counter))) continue; value= je.value_begin; @@ -1095,9 +1131,19 @@ je= sav_je; } - if ((not_first_value && str->append(", ", 2)) || - str->append((const char *) value, v_len)) - goto error; /* Out of memory. */ + if ((not_first_value && str->append(", ", 2))) + goto error; + while(count_path) + { + if (str->append((const char *) value, v_len)) + goto error; + count_path--; + if (count_path) + { + if (str->append(", ", 2)) + goto error; + } + } not_first_value= 1; @@ -1280,11 +1326,7 @@ json_engine_t loc_js; bool set_js; DBUG_EXECUTE_IF("json_check_min_stack_requirement", - { - long arbitrary_var; - long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var)); - ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE); - }); + return dbug_json_check_min_stack_requirement();); if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) return 1; @@ -1498,10 +1540,19 @@ bool Item_func_json_contains_path::fix_fields(THD *thd, Item **ref) { - return alloc_tmp_paths(thd, arg_count-2, &paths, &tmp_paths) || - (p_found= (bool *) alloc_root(thd->mem_root, - (arg_count-2)*sizeof(bool))) == NULL || - Item_int_func::fix_fields(thd, ref); + /* + See comments on Item_json_str_multipath::fix_fields regarding + the aim of the condition 'if (!tmp_paths)'. + */ + if (!tmp_paths) + { + if (alloc_tmp_paths(thd, arg_count-2, &paths, &tmp_paths) || + (p_found= (bool *) alloc_root(thd->active_stmt_arena_to_use()->mem_root, + (arg_count-2)*sizeof(bool))) == NULL) + return true; + } + + return Item_int_func::fix_fields(thd, ref); } @@ -1514,8 +1565,7 @@ return Item_bool_func::fix_length_and_dec(thd); } - -void Item_func_json_contains_path::cleanup() +Item_func_json_contains_path::~Item_func_json_contains_path() { if (tmp_paths) { @@ -1523,7 +1573,6 @@ tmp_paths[i-1].free(); tmp_paths= 0; } - Item_int_func::cleanup(); } @@ -1879,7 +1928,23 @@ return TRUE; for (n_arg=0 ; n_arg < arg_count ; n_arg++) - char_length+= static_cast(args[n_arg]->max_char_length()) + 4; + { + ulonglong arg_length; + Item *arg= args[n_arg]; + + if (arg->result_type() == STRING_RESULT && + !Type_handler_json_common::is_json_type_handler(arg->type_handler())) + arg_length= arg->max_char_length() * 2; /*escaping possible */ + else if (arg->type_handler()->is_bool_type()) + arg_length= 5; + else + arg_length= arg->max_char_length(); + + if (arg_length < 4) + arg_length= 4; /* can be 'null' */ + + char_length+= arg_length + 4; + } fix_char_length_ulonglong(char_length); tmp_val.set_charset(collation.collation); @@ -1929,6 +1994,8 @@ bool Item_func_json_array_append::fix_length_and_dec(THD *thd) { + JSON_DO_PAUSE_EXECUTION(thd, 0.0002); + uint n_arg; ulonglong char_length; @@ -2087,6 +2154,8 @@ uint n_arg, n_path; THD *thd= current_thd; + JSON_DO_PAUSE_EXECUTION(thd, 0.0002); + DBUG_ASSERT(fixed()); if ((null_value= args[0]->null_value)) @@ -2276,13 +2345,8 @@ static int do_merge(String *str, json_engine_t *je1, json_engine_t *je2) { - DBUG_EXECUTE_IF("json_check_min_stack_requirement", - { - long arbitrary_var; - long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var)); - ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE); - }); + return dbug_json_check_min_stack_requirement();); if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) return 1; @@ -2497,6 +2561,8 @@ THD *thd= current_thd; LINT_INIT(js2); + JSON_DO_PAUSE_EXECUTION(thd, 0.0002); + if (args[0]->null_value) goto null_return; @@ -2621,11 +2687,7 @@ bool *empty_result) { DBUG_EXECUTE_IF("json_check_min_stack_requirement", - { - long arbitrary_var; - long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var)); - ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE); - }); + return dbug_json_check_min_stack_requirement();); if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) return 1; @@ -2810,6 +2872,8 @@ bool empty_result, merge_to_null; THD *thd= current_thd; + JSON_DO_PAUSE_EXECUTION(thd, 0.0002); + /* To report errors properly if some JSON is invalid. */ je1.s.error= je2.s.error= 0; merge_to_null= args[0]->null_value; @@ -3087,6 +3151,12 @@ break; } + /* ensure the json is at least valid. */ + while(json_scan_next(&je) == 0) {} + + if (je.s.error) + goto error; + str->set(type, strlen(type), &my_charset_utf8mb3_general_ci); return str; @@ -3102,14 +3172,20 @@ uint n_arg; ulonglong char_length; + JSON_DO_PAUSE_EXECUTION(thd, 0.0002); + collation.set(args[0]->collation); char_length= args[0]->max_char_length(); for (n_arg= 1; n_arg < arg_count; n_arg+= 2) { paths[n_arg/2].set_constant_flag(args[n_arg]->const_item()); - char_length+= - static_cast(args[n_arg+1]->max_char_length()) + 4; + /* + In the resulting JSON we can insert the property + name from the path, and the value itself. + */ + char_length+= args[n_arg/2]->max_char_length() + 6; + char_length+= args[n_arg/2+1]->max_char_length() + 4; } fix_char_length_ulonglong(char_length); @@ -3392,6 +3468,8 @@ DBUG_ASSERT(fixed()); + JSON_DO_PAUSE_EXECUTION(thd, 0.0002); + if (args[0]->null_value) goto null_return; @@ -3443,6 +3521,7 @@ { if (je.s.error) goto js_error; + continue; } if (json_read_value(&je)) @@ -3954,7 +4033,20 @@ { decimals= 0; collation.set(args[0]->collation); - max_length= args[0]->max_length; + switch (fmt) + { + case COMPACT: + max_length= args[0]->max_length; + break; + case LOOSE: + max_length= args[0]->max_length * 2; + break; + case DETAILED: + max_length= MAX_BLOB_WIDTH; + break; + default: + DBUG_ASSERT(0); + }; set_maybe_null(); return FALSE; } @@ -4088,6 +4180,13 @@ return MY_TEST(sortcmp(res1, res2, compare_collation()) == 0); } +bool Item_func_json_arrayagg::fix_fields(THD *thd, Item **ref) +{ + bool res= Item_func_group_concat::fix_fields(thd, ref); + m_tmp_json.set_charset(collation.collation); + return res; +} + String *Item_func_json_arrayagg::get_str_from_item(Item *i, String *tmp) { @@ -4665,11 +4764,7 @@ int check_overlaps(json_engine_t *js, json_engine_t *value, bool compare_whole) { DBUG_EXECUTE_IF("json_check_min_stack_requirement", - { - long arbitrary_var; - long stack_used_up= (available_stack_size(current_thd->thread_stack, &arbitrary_var)); - ALLOCATE_MEM_ON_STACK(my_thread_stack_size-stack_used_up-STACK_MIN_SIZE); - }); + return dbug_json_check_min_stack_requirement();); if (check_stack_overrun(current_thd, STACK_MIN_SIZE , NULL)) return 1; diff -Nru mariadb-10.11.6/sql/item_jsonfunc.h mariadb-10.11.9/sql/item_jsonfunc.h --- mariadb-10.11.6/sql/item_jsonfunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_jsonfunc.h 2024-08-03 07:29:58.000000000 +0000 @@ -114,7 +114,7 @@ static const Lex_cstring fmt(STRING_WITH_LEN("json")); return to->set_format_name(fmt); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } enum Functype functype() const override { return JSON_VALID_FUNC; } }; @@ -131,7 +131,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } longlong val_int() override; }; @@ -152,7 +152,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } longlong val_int() override; }; @@ -200,7 +200,7 @@ { return je->check_and_get_value_scalar(res, error); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -228,7 +228,7 @@ { return je->check_and_get_value_complex(res, error); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -247,7 +247,7 @@ } bool fix_length_and_dec(THD *thd) override; String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -266,7 +266,7 @@ } bool fix_length_and_dec(THD *thd) override; String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -276,11 +276,26 @@ protected: json_path_with_flags *paths; String *tmp_paths; +private: + /** + Number of paths returned by calling virtual method get_n_paths() and + remembered inside fix_fields(). It is used by the virtual destructor + ~Item_json_str_multipath() to iterate along allocated memory chunks stored + in the array tmp_paths and free every of them. The virtual method + get_n_paths() can't be used for this goal from within virtual destructor. + We could get rid of the virtual method get_n_paths() and store the number + of paths directly in the constructor of classes derived from the class + Item_json_str_multipath but presence of the method get_n_paths() allows + to check invariant that the number of arguments not changed between + sequential runs of the same prepared statement that seems to be useful. + */ + uint n_paths; public: Item_json_str_multipath(THD *thd, List &list): - Item_json_func(thd, list), tmp_paths(0) {} - bool fix_fields(THD *thd, Item **ref); - void cleanup(); + Item_json_func(thd, list), paths(NULL), tmp_paths(0), n_paths(0) {} + virtual ~Item_json_str_multipath(); + + bool fix_fields(THD *thd, Item **ref) override; virtual uint get_n_paths() const = 0; }; @@ -306,7 +321,7 @@ double val_real() override; my_decimal *val_decimal(my_decimal *) override; uint get_n_paths() const override { return arg_count - 1; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -329,7 +344,7 @@ } bool fix_length_and_dec(THD *thd) override; longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -347,6 +362,7 @@ public: Item_func_json_contains_path(THD *thd, List &list): Item_bool_func(thd, list), tmp_paths(0) {} + virtual ~Item_func_json_contains_path(); LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("json_contains_path") }; @@ -354,9 +370,8 @@ } bool fix_fields(THD *thd, Item **ref) override; bool fix_length_and_dec(THD *thd) override; - void cleanup() override; longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -378,7 +393,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("json_array") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -399,7 +414,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("json_array_append") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -415,7 +430,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("json_array_insert") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -433,7 +448,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("json_object") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -451,7 +466,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("json_merge_preserve") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -466,7 +481,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -483,7 +498,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -515,7 +530,7 @@ } bool fix_length_and_dec(THD *thd) override; longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -535,7 +550,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length= 10; return FALSE; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -553,7 +568,7 @@ } bool fix_length_and_dec(THD *thd) override; String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -579,7 +594,7 @@ return (mode_insert ? (mode_replace ? json_set : json_insert) : json_replace); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -599,7 +614,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("json_remove") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -620,7 +635,7 @@ } bool fix_length_and_dec(THD *thd) override; String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -649,7 +664,7 @@ bool fix_length_and_dec(THD *thd) override; String *val_str(String *) override; uint get_n_paths() const override { return arg_count > 4 ? arg_count - 4 : 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -677,7 +692,7 @@ bool fix_length_and_dec(THD *thd) override; String *val_str(String *str) override; String *val_json(String *str) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -717,12 +732,13 @@ static LEX_CSTRING name= {STRING_WITH_LEN("json_arrayagg(") }; return name; } + bool fix_fields(THD *thd, Item **ref) override; enum Sumfunctype sum_func() const override { return JSON_ARRAYAGG_FUNC; } String* val_str(String *str) override; Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -771,7 +787,7 @@ String* val_str(String* str) override; Item *copy_or_same(THD* thd) override; void no_rows_in_result() override {} - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -792,7 +808,7 @@ } bool fix_length_and_dec(THD *thd) override; longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; diff -Nru mariadb-10.11.6/sql/item_row.cc mariadb-10.11.9/sql/item_row.cc --- mariadb-10.11.6/sql/item_row.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_row.cc 2024-08-03 07:29:58.000000000 +0000 @@ -180,7 +180,7 @@ } -Item* Item_row::build_clone(THD *thd) +Item* Item_row::do_build_clone(THD *thd) const { Item **copy_args= static_cast (alloc_root(thd->mem_root, sizeof(Item*) * arg_count)); diff -Nru mariadb-10.11.6/sql/item_row.h mariadb-10.11.9/sql/item_row.h --- mariadb-10.11.6/sql/item_row.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_row.h 2024-08-03 07:29:58.000000000 +0000 @@ -148,9 +148,9 @@ } bool check_vcol_func_processor(void *arg) override {return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } - Item *build_clone(THD *thd) override; + Item *do_build_clone(THD *thd) const override; }; #endif /* ITEM_ROW_INCLUDED */ diff -Nru mariadb-10.11.6/sql/item_strfunc.cc mariadb-10.11.9/sql/item_strfunc.cc --- mariadb-10.11.6/sql/item_strfunc.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_strfunc.cc 2024-08-03 07:29:58.000000000 +0000 @@ -748,7 +748,7 @@ String *Item_func_des_encrypt::val_str(String *str) { DBUG_ASSERT(fixed()); -#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) +#if defined(HAVE_des) && !defined(EMBEDDED_LIBRARY) uint code= ER_WRONG_PARAMETERS_TO_PROCEDURE; DES_cblock ivec; struct st_des_keyblock keyblock; @@ -837,8 +837,8 @@ THD *thd= current_thd; push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_FEATURE_DISABLED, ER_THD(thd, ER_FEATURE_DISABLED), - "des_encrypt", "--with-ssl"); -#endif /* defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) */ + "des_encrypt", "openssl des cipher (HAVE_des)"); +#endif /* defined(HAVE_des) && !defined(EMBEDDED_LIBRARY) */ null_value=1; return 0; } @@ -861,7 +861,7 @@ String *Item_func_des_decrypt::val_str(String *str) { DBUG_ASSERT(fixed()); -#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) +#if defined(HAVE_des) && !defined(EMBEDDED_LIBRARY) uint code= ER_WRONG_PARAMETERS_TO_PROCEDURE; DES_cblock ivec; struct st_des_keyblock keyblock; @@ -936,9 +936,9 @@ THD *thd= current_thd; push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_FEATURE_DISABLED, ER_THD(thd, ER_FEATURE_DISABLED), - "des_decrypt", "--with-ssl"); + "des_decrypt", "openssl des cipher (HAVE_des)"); } -#endif /* defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) */ +#endif /* defined(HAVE_des) && !defined(EMBEDDED_LIBRARY) */ null_value=1; return 0; } @@ -1184,8 +1184,7 @@ Fix that this works with binary strings when using USE_MB */ -String *Item_func_replace::val_str_internal(String *str, - String *empty_string_for_null) +String *Item_func_replace::val_str_internal(String *str, bool null_to_empty) { DBUG_ASSERT(fixed()); String *res,*res2,*res3; @@ -1203,13 +1202,8 @@ res=args[0]->val_str(str); if (args[0]->null_value) goto null; - res2=args[1]->val_str(&tmp_value); - if (args[1]->null_value) - { - if (!empty_string_for_null) - goto null; - res2= empty_string_for_null; - } + if (!(res2= args[1]->val_str_null_to_empty(&tmp_value, null_to_empty))) + goto null; res->set_charset(collation.collation); #ifdef USE_MB @@ -1226,12 +1220,8 @@ if (binary_cmp && (offset=res->strstr(*res2)) < 0) return res; #endif - if (!(res3=args[2]->val_str(&tmp_value2))) - { - if (!empty_string_for_null) - goto null; - res3= empty_string_for_null; - } + if (!(res3= args[2]->val_str_null_to_empty(&tmp_value2, null_to_empty))) + goto null; from_length= res2->length(); to_length= res3->length(); @@ -1314,7 +1304,7 @@ } while ((offset=res->strstr(*res2,(uint) offset)) >= 0); } - if (empty_string_for_null && !res->length()) + if (null_to_empty && !res->length()) goto null; return res; @@ -1392,6 +1382,12 @@ namespace fmt { template <> struct formatter: formatter { template + auto format(String c, FormatContext& ctx) const -> decltype(ctx.out()) { + string_view name = { c.ptr(), c.length() }; + return formatter::format(name, ctx); + }; + /* needed below function for libfmt-7.1.3 compatibility, (not 9.1.0+) */ + template auto format(String c, FormatContext& ctx) -> decltype(ctx.out()) { string_view name = { c.ptr(), c.length() }; return formatter::format(name, ctx); @@ -1509,6 +1505,7 @@ bool Item_func_random_bytes::fix_length_and_dec(THD *thd) { + set_maybe_null(); used_tables_cache|= RAND_TABLE_BIT; if (args[0]->can_eval_in_optimize()) { @@ -1638,25 +1635,28 @@ } -String *Item_func_regexp_replace::val_str(String *str) +String *Item_func_regexp_replace::val_str_internal(String *str, + bool null_to_empty) { DBUG_ASSERT(fixed()); char buff0[MAX_FIELD_WIDTH]; char buff2[MAX_FIELD_WIDTH]; String tmp0(buff0,sizeof(buff0),&my_charset_bin); String tmp2(buff2,sizeof(buff2),&my_charset_bin); - String *source= args[0]->val_str(&tmp0); - String *replace= args[2]->val_str(&tmp2); + String *source, *replace; LEX_CSTRING src, rpl; size_t startoffset= 0; - if ((null_value= (args[0]->null_value || args[2]->null_value || - re.recompile(args[1])))) - return (String *) 0; - + source= args[0]->val_str(&tmp0); + if (!source) + goto err; + replace= args[2]->val_str_null_to_empty(&tmp2, null_to_empty); + if (!replace || re.recompile(args[1])) + goto err; if (!(source= re.convert_if_needed(source, &re.subject_converter)) || !(replace= re.convert_if_needed(replace, &re.replace_converter))) goto err; + null_value= false; source->get_value(&src); replace->get_value(&rpl); @@ -1702,7 +1702,7 @@ err: null_value= true; - return (String *) 0; + return nullptr; } @@ -1838,13 +1838,21 @@ String *Item_str_conv::val_str(String *str) { DBUG_ASSERT(fixed()); - String *res; - size_t alloced_length, len; + String *res= args[0]->val_str(&tmp_value); - if ((null_value= (!(res= args[0]->val_str(&tmp_value)) || - str->alloc((alloced_length= res->length() * multiply))))) - return 0; + if (!res) + { + err: + null_value= true; + return nullptr; + } + size_t alloced_length= res->length() * multiply, len; + + if (str->alloc((alloced_length))) + goto err; + + null_value= false; len= converter(collation.collation, (char*) res->ptr(), res->length(), (char*) str->ptr(), alloced_length); DBUG_ASSERT(len <= alloced_length); @@ -2417,13 +2425,31 @@ void Item_func_trim::print(String *str, enum_query_type query_type) { + LEX_CSTRING suffix= {STRING_WITH_LEN("_oracle")}; if (arg_count == 1) { - Item_func::print(str, query_type); + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(func_name_cstring()); + if (schema() == &oracle_schema_ref) + str->append(suffix); + } + else + print_sql_mode_qualified_name(str, query_type, func_name_cstring()); + print_args_parenthesized(str, query_type); return; } - str->append(Item_func_trim::func_name_cstring()); - str->append(func_name_ext()); + + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(Item_func_trim::func_name_cstring()); + if (schema() == &oracle_schema_ref) + str->append(suffix); + } + else + print_sql_mode_qualified_name(str, query_type, Item_func_trim::func_name_cstring()); str->append('('); str->append(mode_name()); str->append(' '); @@ -3463,13 +3489,13 @@ String name_str, *name; longlong pos; - if (args[0]->null_value || args[1]->null_value) - goto err; - name= args[0]->val_str(&name_str); pos= args[1]->val_int(); - if (pos < 0 || pos > UINT_MAX32) + if (args[0]->null_value || args[1]->null_value) + goto err; + + if (pos < 0 || pos > (longlong) UINT_MAX32) goto err; if (gtid_state_from_binlog_pos(name->c_ptr_safe(), (uint32)pos, str)) @@ -3854,20 +3880,44 @@ str=args[0]->val_str(str); if ((null_value=args[0]->null_value)) return 0; + /* + Let SCS be the character set of the source - args[0]. + Let TCS be the character set of the target - i.e. the character set + of the collation specified in the COLLATE clause. + + It's OK to return SQL NULL if SCS is not equal to TCS. + This is possible on the explicit NULL or expressions derived from + the explicit NULL: + SELECT NULL COLLATE utf8mb4_general_ci; + SELECT COALESCE(NULL) COLLATE utf8mb4_general_ci; + + But for a non-NULL result SCS and TCS must be compatible: + 1. Either SCS==TCS + 2. Or SCS can be can be reinterpeted to TCS. + This scenario is possible when args[0] is numeric and TCS->mbmaxlen==1. + + If SCS and TCS are not compatible here, then something went wrong during + fix_fields(), e.g. an Item_func_conv_charset was not added two wrap args[0]. + */ + DBUG_ASSERT(my_charset_same(args[0]->collation.collation, + collation.collation) || + (args[0]->collation.repertoire == MY_REPERTOIRE_ASCII && + !(collation.collation->state & MY_CS_NONASCII))); str->set_charset(collation.collation); return str; } bool Item_func_set_collation::fix_length_and_dec(THD *thd) { - if (agg_arg_charsets_for_string_result(collation, args, 1)) + if (agg_arg_charsets_for_string_result(collation, args, 1) || + collation.merge_collation(m_set_collation, + args[0]->collation.repertoire, + with_param() && + thd->lex->is_ps_or_view_context_analysis())) return true; - Lex_exact_charset_opt_extended_collate cl(collation.collation, true); - if (cl.merge_collation_override(m_set_collation)) - return true; - collation.set(cl.collation().charset_info(), DERIVATION_EXPLICIT, - args[0]->collation.repertoire); - max_length= args[0]->max_length; + ulonglong max_char_length= (ulonglong) args[0]->max_char_length(); + fix_char_length_ulonglong(max_char_length); + return FALSE; } @@ -3891,9 +3941,8 @@ DBUG_ASSERT(fixed()); uint dummy_errors; - CHARSET_INFO *cs= args[0]->charset_for_protocol(); null_value= 0; - str->copy(cs->cs_name.str, cs->cs_name.length, + str->copy(m_cached_charset_info.str, m_cached_charset_info.length, &my_charset_latin1, collation.collation, &dummy_errors); return str; } @@ -4037,9 +4086,11 @@ return 0; if ((val <= (double) LONGLONG_MIN) || (val >= (double) (ulonglong) ULONGLONG_MAX)) - dec= ~(longlong) 0; + dec= ULONGLONG_MAX; + else if (val < 0) + dec= (ulonglong) (longlong) (val - 0.5); else - dec= (ulonglong) (val + (val > 0 ? 0.5 : -0.5)); + dec= (ulonglong) (val + 0.5); return str->set_hex(dec) ? make_empty_result(str) : str; } @@ -4951,6 +5002,11 @@ { str->append(STRING_WITH_LEN(" charset ")); str->append(defs[i].cs->cs_name); + if (Charset(defs[i].cs).can_have_collate_clause()) + { + str->append(STRING_WITH_LEN(" collate ")); + str->append(defs[i].cs->coll_name); + } str->append(' '); } break; @@ -5728,7 +5784,7 @@ { size_t n_digits= 0; size_t n_lead_zeros= 0; - size_t num_start; + size_t num_start= 0; size_t reserve_length= std::min( natsort_max_key_size(in->length()) + MAX_BIGINT_WIDTH + 2, max_key_size); diff -Nru mariadb-10.11.6/sql/item_strfunc.h mariadb-10.11.9/sql/item_strfunc.h --- mariadb-10.11.6/sql/item_strfunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_strfunc.h 2024-08-03 07:29:58.000000000 +0000 @@ -109,7 +109,7 @@ :Item_str_ascii_func(thd, a) { } Item_str_ascii_checksum_func(THD *thd, Item *a, Item *b) :Item_str_ascii_func(thd, a, b) { } - bool eq(const Item *item, bool binary_cmp) const + bool eq(const Item *item, bool binary_cmp) const override { // Always use binary argument comparison: MD5('x') != MD5('X') return Item_func::eq(item, true); @@ -129,7 +129,7 @@ :Item_str_func(thd, a) { } Item_str_binary_checksum_func(THD *thd, Item *a, Item *b) :Item_str_func(thd, a, b) { } - bool eq(const Item *item, bool binary_cmp) const + bool eq(const Item *item, bool binary_cmp) const override { /* Always use binary argument comparison: @@ -155,7 +155,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("md5") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -171,7 +171,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("sha") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -187,7 +187,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("sha2") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -204,7 +204,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("to_base64") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -221,7 +221,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("from_base64") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -238,7 +238,7 @@ public: Item_aes_crypt(THD *thd, Item *a, Item *b) :Item_str_binary_checksum_func(thd, a, b) {} - String *val_str(String *); + String *val_str(String *) override; }; class Item_func_aes_encrypt :public Item_aes_crypt @@ -252,7 +252,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("aes_encrypt") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -267,7 +267,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("aes_decrypt") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -283,7 +283,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } @@ -307,6 +307,12 @@ public: Item_func_concat(THD *thd, List &list): Item_str_func(thd, list) {} Item_func_concat(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) {} + const Schema *schema() const override { return &mariadb_schema; } + void print(String *str, enum_query_type query_type) override + { + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); + } String *val_str(String *) override; bool fix_length_and_dec(THD *thd) override; LEX_CSTRING func_name_cstring() const override @@ -314,7 +320,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("concat") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -333,12 +339,19 @@ :Item_func_concat(thd, a, b) { } String *val_str(String *) override; - LEX_CSTRING func_name_cstring() const override + const Schema *schema() const override { return &oracle_schema_ref; } + void print(String *str, enum_query_type query_type) override { - static LEX_CSTRING name= {STRING_WITH_LEN("concat_operator_oracle") }; - return name; + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(STRING_WITH_LEN("concat_operator_oracle")); + } + else + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } @@ -363,7 +376,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("decode_histogram") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -380,7 +393,7 @@ return name; } table_map not_null_tables() const override { return 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -402,7 +415,7 @@ return mark_unsupported_function(func_name(), "()", arg, VCOL_NON_DETERMINISTIC | VCOL_NEXTVAL); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } @@ -422,7 +435,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("reverse") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -430,18 +443,25 @@ class Item_func_replace :public Item_str_func { String tmp_value,tmp_value2; +protected: + String *val_str_internal(String *str, bool null_to_empty); public: Item_func_replace(THD *thd, Item *org, Item *find, Item *replace): Item_str_func(thd, org, find, replace) {} - String *val_str(String *to) override { return val_str_internal(to, NULL); }; + String *val_str(String *to) override { return val_str_internal(to, false); }; bool fix_length_and_dec(THD *thd) override; - String *val_str_internal(String *str, String *empty_string_for_null); + const Schema *schema() const override { return &mariadb_schema; } + void print(String *str, enum_query_type query_type) override + { + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); + } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("replace") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -453,13 +473,20 @@ Item_func_replace_oracle(THD *thd, Item *org, Item *find, Item *replace): Item_func_replace(thd, org, find, replace) {} String *val_str(String *to) override - { return val_str_internal(to, &tmp_emtpystr); }; - LEX_CSTRING func_name_cstring() const override + { return val_str_internal(to, true); }; + const Schema *schema() const override { return &oracle_schema_ref; } + void print(String *str, enum_query_type query_type) override { - static LEX_CSTRING name= {STRING_WITH_LEN("replace_oracle") }; - return name; + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(STRING_WITH_LEN("replace_oracle")); + } + else + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -470,10 +497,18 @@ bool append_replacement(String *str, const LEX_CSTRING *source, const LEX_CSTRING *replace); +protected: + String *val_str_internal(String *str, bool null_to_empty); public: Item_func_regexp_replace(THD *thd, Item *a, Item *b, Item *c): Item_str_func(thd, a, b, c) {} + const Schema *schema() const override { return &mariadb_schema; } + void print(String *str, enum_query_type query_type) override + { + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); + } void cleanup() override { DBUG_ENTER("Item_func_regexp_replace::cleanup"); @@ -481,14 +516,37 @@ re.cleanup(); DBUG_VOID_RETURN; } - String *val_str(String *str) override; + String *val_str(String *str) override + { + return val_str_internal(str, false); + } bool fix_length_and_dec(THD *thd) override; LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("regexp_replace") }; return name; } - Item *get_copy(THD *thd) override { return 0;} + Item *do_get_copy(THD *thd) const override { return 0;} +}; + + +class Item_func_regexp_replace_oracle: public Item_func_regexp_replace +{ +public: + Item_func_regexp_replace_oracle(THD *thd, Item *a, Item *b, Item *c) + :Item_func_regexp_replace(thd, a, b, c) + {} + const Schema *schema() const override { return &oracle_schema_ref; } + bool fix_length_and_dec(THD *thd) override + { + bool rc= Item_func_regexp_replace::fix_length_and_dec(thd); + set_maybe_null(); // Empty result is converted to NULL + return rc; + } + String *val_str(String *str) override + { + return val_str_internal(str, true); + } }; @@ -513,7 +571,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("regexp_substr") }; return name; } - Item *get_copy(THD *thd) override { return 0; } + Item *do_get_copy(THD *thd) const override { return 0; } }; @@ -531,7 +589,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("insert") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -558,7 +616,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -572,7 +630,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -590,7 +648,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("left") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -607,7 +665,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("right") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -621,14 +679,22 @@ Item_func_substr(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) {} Item_func_substr(THD *thd, Item *a, Item *b, Item *c): Item_str_func(thd, a, b, c) {} + Item_func_substr(THD *thd, List &list) + :Item_str_func(thd, list) {} String *val_str(String *) override; bool fix_length_and_dec(THD *thd) override; + const Schema *schema() const override { return &mariadb_schema; } + void print(String *str, enum_query_type query_type) override + { + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); + } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("substr") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -645,7 +711,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("sformat") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -661,18 +727,27 @@ Item_func_substr(thd, a, b) {} Item_func_substr_oracle(THD *thd, Item *a, Item *b, Item *c): Item_func_substr(thd, a, b, c) {} + Item_func_substr_oracle(THD *thd, List &list) + :Item_func_substr(thd, list) {} bool fix_length_and_dec(THD *thd) override { bool res= Item_func_substr::fix_length_and_dec(thd); set_maybe_null(); return res; } - LEX_CSTRING func_name_cstring() const override + const Schema *schema() const override { return &oracle_schema_ref; } + void print(String *str, enum_query_type query_type) override { - static LEX_CSTRING name= {STRING_WITH_LEN("substr_oracle") }; - return name; + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(STRING_WITH_LEN("substr_oracle")); + } + else + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -689,7 +764,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("substring_index") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -718,17 +793,13 @@ { return trimmed_value(res, 0, res->length()); } - virtual LEX_CSTRING func_name_ext() const - { - static LEX_CSTRING name_ext= {STRING_WITH_LEN("") }; - return name_ext; - } public: Item_func_trim(THD *thd, Item *a, Item *b): Item_str_func(thd, a, b) {} Item_func_trim(THD *thd, Item *a): Item_str_func(thd, a) {} Sql_mode_dependency value_depends_on_sql_mode() const override; String *val_str(String *) override; bool fix_length_and_dec(THD *thd) override; + const Schema *schema() const override { return &mariadb_schema; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("trim") }; @@ -736,7 +807,7 @@ } void print(String *str, enum_query_type query_type) override; virtual LEX_CSTRING mode_name() const { return { "both", 4}; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -746,27 +817,18 @@ protected: String *make_empty_result(String *str) override { null_value= 1; return NULL; } - LEX_CSTRING func_name_ext() const override - { - static LEX_CSTRING name_ext= {STRING_WITH_LEN("_oracle") }; - return name_ext; - } public: Item_func_trim_oracle(THD *thd, Item *a, Item *b): Item_func_trim(thd, a, b) {} Item_func_trim_oracle(THD *thd, Item *a): Item_func_trim(thd, a) {} - LEX_CSTRING func_name_cstring() const override - { - static LEX_CSTRING name= {STRING_WITH_LEN("trim_oracle") }; - return name; - } + const Schema *schema() const override { return &oracle_schema_ref; } bool fix_length_and_dec(THD *thd) override { bool res= Item_func_trim::fix_length_and_dec(thd); set_maybe_null(); return res; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -781,6 +843,7 @@ return Item_func::value_depends_on_sql_mode(); } String *val_str(String *) override; + const Schema *schema() const override { return &mariadb_schema; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("ltrim") }; @@ -788,7 +851,7 @@ } LEX_CSTRING mode_name() const override { return { STRING_WITH_LEN("leading") }; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -798,27 +861,18 @@ protected: String *make_empty_result(String *str) override { null_value= 1; return NULL; } - LEX_CSTRING func_name_ext() const override - { - static LEX_CSTRING name_ext= {STRING_WITH_LEN("_oracle") }; - return name_ext; - } public: Item_func_ltrim_oracle(THD *thd, Item *a, Item *b): Item_func_ltrim(thd, a, b) {} Item_func_ltrim_oracle(THD *thd, Item *a): Item_func_ltrim(thd, a) {} - LEX_CSTRING func_name_cstring() const override - { - static LEX_CSTRING name= {STRING_WITH_LEN("ltrim_oracle") }; - return name; - } + const Schema *schema() const override { return &oracle_schema_ref; } bool fix_length_and_dec(THD *thd) override { bool res= Item_func_ltrim::fix_length_and_dec(thd); set_maybe_null(); return res; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -829,6 +883,7 @@ Item_func_rtrim(THD *thd, Item *a, Item *b): Item_func_trim(thd, a, b) {} Item_func_rtrim(THD *thd, Item *a): Item_func_trim(thd, a) {} String *val_str(String *) override; + const Schema *schema() const override { return &mariadb_schema; } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("rtrim") }; @@ -836,7 +891,7 @@ } LEX_CSTRING mode_name() const override { return { STRING_WITH_LEN("trailing") }; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -846,27 +901,18 @@ protected: String *make_empty_result(String *str) override { null_value= 1; return NULL; } - LEX_CSTRING func_name_ext() const override - { - static LEX_CSTRING name_ext= {STRING_WITH_LEN("_oracle") }; - return name_ext; - } public: Item_func_rtrim_oracle(THD *thd, Item *a, Item *b): Item_func_rtrim(thd, a, b) {} Item_func_rtrim_oracle(THD *thd, Item *a): Item_func_rtrim(thd, a) {} - LEX_CSTRING func_name_cstring() const override - { - static LEX_CSTRING name= {STRING_WITH_LEN("rtrim_oracle") }; - return name; - } + const Schema *schema() const override { return &oracle_schema_ref; } bool fix_length_and_dec(THD *thd) override { bool res= Item_func_rtrim::fix_length_and_dec(thd); set_maybe_null(); return res; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -909,7 +955,7 @@ } static char *alloc(THD *thd, const char *password, size_t pass_len, enum PW_Alg al); - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -930,7 +976,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("des_encrypt") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -949,7 +995,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("des_decrypt") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -994,7 +1040,7 @@ { return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1018,7 +1064,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("encode") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } protected: virtual void crypto_transform(String *); @@ -1032,12 +1078,18 @@ { public: Item_func_decode(THD *thd, Item *a, Item *seed_arg): Item_func_encode(thd, a, seed_arg) {} + const Schema *schema() const override { return &mariadb_schema; } + void print(String *str, enum_query_type query_type) override + { + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); + } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("decode") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } protected: void crypto_transform(String *) override; @@ -1049,19 +1101,19 @@ public: Item_func_sysconst(THD *thd): Item_str_func(thd) { collation.set(system_charset_info,DERIVATION_SYSCONST); } - Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs); + Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs) override; /* Used to create correct Item name in new converted item in safe_charset_converter, return string representation of this function call */ virtual const char *fully_qualified_func_name() const = 0; - bool check_vcol_func_processor(void *arg) + bool check_vcol_func_processor(void *arg) override { return mark_unsupported_function(fully_qualified_func_name(), arg, VCOL_SESSION_FUNC); } - bool const_item() const; + bool const_item() const override; }; @@ -1083,7 +1135,7 @@ } const char *fully_qualified_func_name() const override { return "database()"; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1111,7 +1163,7 @@ base_flags&= ~item_base_t::MAYBE_NULL; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1149,7 +1201,7 @@ { return save_str_value_in_field(field, &str_value); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1211,7 +1263,7 @@ return mark_unsupported_function(fully_qualified_func_name(), arg, VCOL_SESSION_FUNC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1228,7 +1280,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("soundex") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1246,7 +1298,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("elt") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1264,7 +1316,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("make_set") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1285,7 +1337,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("format") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1314,7 +1366,7 @@ return name; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1334,7 +1386,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("chr") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1351,7 +1403,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("repeat") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1367,7 +1419,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("space") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1388,7 +1440,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1402,6 +1454,8 @@ Item_str_func(thd, arg1, arg2, arg3) {} Item_func_pad(THD *thd, Item *arg1, Item *arg2): Item_str_func(thd, arg1, arg2) {} + Item_func_pad(THD *thd, List &list): + Item_str_func(thd,list) {} bool fix_length_and_dec(THD *thd) override; }; @@ -1413,14 +1467,22 @@ Item_func_pad(thd, arg1, arg2, arg3) {} Item_func_rpad(THD *thd, Item *arg1, Item *arg2): Item_func_pad(thd, arg1, arg2) {} + Item_func_rpad(THD *thd, List &list): + Item_func_pad(thd,list) {} String *val_str(String *) override; + const Schema *schema() const override { return &mariadb_schema; } + void print(String *str, enum_query_type query_type) override + { + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); + } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("rpad") }; return name; } Sql_mode_dependency value_depends_on_sql_mode() const override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1434,18 +1496,27 @@ Item_func_rpad(thd, arg1, arg2, arg3) {} Item_func_rpad_oracle(THD *thd, Item *arg1, Item *arg2): Item_func_rpad(thd, arg1, arg2) {} + Item_func_rpad_oracle(THD *thd, List &list): + Item_func_rpad(thd,list) {} bool fix_length_and_dec(THD *thd) override { bool res= Item_func_rpad::fix_length_and_dec(thd); set_maybe_null(); return res; } - LEX_CSTRING func_name_cstring() const override + const Schema *schema() const override { return &oracle_schema_ref; } + void print(String *str, enum_query_type query_type) override { - static LEX_CSTRING name= {STRING_WITH_LEN("rpad_oracle") }; - return name; + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(STRING_WITH_LEN("rpad_oracle")); + } + else + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1457,13 +1528,21 @@ Item_func_pad(thd, arg1, arg2, arg3) {} Item_func_lpad(THD *thd, Item *arg1, Item *arg2): Item_func_pad(thd, arg1, arg2) {} + Item_func_lpad(THD *thd, List &list): + Item_func_pad(thd,list) {} String *val_str(String *) override; + const Schema *schema() const override { return &mariadb_schema; } + void print(String *str, enum_query_type query_type) override + { + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); + } LEX_CSTRING func_name_cstring() const override { static LEX_CSTRING name= {STRING_WITH_LEN("lpad") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1477,18 +1556,27 @@ Item_func_lpad(thd, arg1, arg2, arg3) {} Item_func_lpad_oracle(THD *thd, Item *arg1, Item *arg2): Item_func_lpad(thd, arg1, arg2) {} + Item_func_lpad_oracle(THD *thd, List &list): + Item_func_lpad(thd,list) {} bool fix_length_and_dec(THD *thd) override { bool res= Item_func_lpad::fix_length_and_dec(thd); set_maybe_null(); return res; } - LEX_CSTRING func_name_cstring() const override + const Schema *schema() const override { return &oracle_schema_ref; } + void print(String *str, enum_query_type query_type) override { - static LEX_CSTRING name= {STRING_WITH_LEN("lpad_oracle") }; - return name; + if (query_type & QT_FOR_FRM) + { + // 10.3 downgrade compatibility for FRM + str->append(STRING_WITH_LEN("lpad_oracle")); + } + else + print_sql_mode_qualified_name(str, query_type); + print_args_parenthesized(str, query_type); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1511,7 +1599,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1545,13 +1633,23 @@ } bool fix_length_and_dec(THD *thd) override { + m_arg0_type_handler= args[0]->type_handler(); collation.set(default_charset(), DERIVATION_COERCIBLE, MY_REPERTOIRE_ASCII); decimals=0; - fix_char_length(args[0]->max_length * 2); - m_arg0_type_handler= args[0]->type_handler(); + /* + Reserve space for 16 characters for signed numeric data types: + hex(-1) -> 'FFFFFFFFFFFFFFFF'. + For unsigned numeric types, HEX() can create too large columns. + This should be eventually fixed to create minimum possible columns. + */ + const Type_handler_numeric *tn= + dynamic_cast(m_arg0_type_handler); + size_t char_length= (tn && !(tn->flags() & UNSIGNED_FLAG)) ? + (size_t) 16 : (size_t) args[0]->max_length * 2; + fix_char_length(char_length); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1577,7 +1675,7 @@ max_length=(1+args[0]->max_length)/2; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1616,7 +1714,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("like_range_min") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1631,7 +1729,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("like_range_max") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; #endif @@ -1663,7 +1761,7 @@ return name; } bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1690,7 +1788,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_IMPOSSIBLE); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1711,7 +1809,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("export_set") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1732,10 +1830,13 @@ collation.set(args[0]->collation); ulonglong max_result_length= (ulonglong) args[0]->max_length * 2 + 2 * collation.collation->mbmaxlen; + // NULL argument is returned as a string "NULL" without quotes + if (args[0]->maybe_null()) + set_if_bigger(max_result_length, 4 * collation.collation->mbmaxlen); max_length= (uint32) MY_MIN(max_result_length, MAX_BLOB_WIDTH); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1831,7 +1932,7 @@ return name; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } int save_in_field(Field*, bool) override; }; @@ -1860,7 +1961,7 @@ return args[0]->field_for_view_update(); } bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1886,6 +1987,8 @@ class Item_func_charset :public Item_func_expr_str_metadata { + LEX_CSTRING m_cached_charset_info; + public: Item_func_charset(THD *thd, Item *a) :Item_func_expr_str_metadata(thd, a) { } @@ -1895,8 +1998,25 @@ static LEX_CSTRING name= {STRING_WITH_LEN("charset") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + table_map used_tables() const override { return 0; } + bool fix_length_and_dec(THD* thd) override + { + if (Item_func_expr_str_metadata::fix_length_and_dec(thd)) + return true; + /* + Since this is a const item which doesn't use tables (see used_tables()), + we don't want to access the function arguments during execution. + That's why we store the charset here during the preparation phase + and only return it later at the execution phase + */ + DBUG_ASSERT(args[0]->fixed()); + m_cached_charset_info.str= args[0]->charset_for_protocol()->cs_name.str; + m_cached_charset_info.length= + args[0]->charset_for_protocol()->cs_name.length; + return false; + } }; @@ -1911,7 +2031,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("collation") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1951,7 +2071,7 @@ override { return this; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1982,7 +2102,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length=10; return FALSE; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2003,7 +2123,7 @@ set_maybe_null(); return FALSE; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2030,7 +2150,7 @@ return name; } String *val_str(String *) override ZLIB_DEPENDED_FUNCTION - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2052,7 +2172,7 @@ return name; } String *val_str(String *) override ZLIB_DEPENDED_FUNCTION - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2079,7 +2199,7 @@ String *val_str(String *) override; void print(String *str, enum_query_type query_type) override; enum Functype functype() const override { return DYNCOL_FUNC; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2097,7 +2217,7 @@ } String *val_str(String *) override; void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2119,7 +2239,7 @@ decimals= 0; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2169,7 +2289,7 @@ bool get_dyn_value(THD *thd, DYNAMIC_COLUMN_VALUE *val, String *tmp); bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override; void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2191,7 +2311,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2217,7 +2337,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; #ifdef WITH_WSREP @@ -2241,7 +2361,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2262,7 +2382,7 @@ set_maybe_null(); return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2280,7 +2400,7 @@ return name; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; #endif /* WITH_WSREP */ diff -Nru mariadb-10.11.6/sql/item_subselect.cc mariadb-10.11.9/sql/item_subselect.cc --- mariadb-10.11.6/sql/item_subselect.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_subselect.cc 2024-08-03 07:29:58.000000000 +0000 @@ -42,6 +42,7 @@ #include "sql_parse.h" // check_stack_overrun #include "sql_cte.h" #include "sql_test.h" +#include "my_json_writer.h" double get_post_group_estimate(JOIN* join, double join_op_rows); @@ -196,6 +197,7 @@ in_strategy&= ~SUBS_STRATEGY_CHOSEN; */ first_execution= TRUE; + materialization_tracker= NULL; pushed_cond_guards= NULL; Item_subselect::cleanup(); DBUG_VOID_RETURN; @@ -241,7 +243,7 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref) { - char const *save_where= thd_param->where; + THD_WHERE save_where= thd_param->where; uint8 uncacheable; bool res; @@ -320,7 +322,7 @@ if (have_to_be_excluded) engine->exclude(); substitution= 0; - thd->where= "checking transformed subquery"; + thd->where= THD_WHERE::CHECKING_TRANSFORMED_SUBQUERY; res= (*ref)->fix_fields_if_needed(thd, ref); goto end; @@ -472,7 +474,7 @@ public: table_map used_tables; /* Collect used_tables here */ st_select_lex *new_parent; /* Select we're in */ - virtual void visit_field(Item_field *item) + void visit_field(Item_field *item) override { //for (TABLE_LIST *tbl= new_parent->leaf_tables; tbl; tbl= tbl->next_local) //{ @@ -568,6 +570,9 @@ This measure is used instead of JOIN::read_time, because it is considered to be much more reliable than the cost estimate. + Note: the logic in this function must agree with + JOIN::init_join_cache_and_keyread(). + @return true if the subquery is expensive @return false otherwise */ @@ -1642,6 +1647,7 @@ st_select_lex *select_lex): Item_exists_subselect(thd), left_expr_cache(0), first_execution(TRUE), in_strategy(SUBS_NOT_TRANSFORMED), + materialization_tracker(NULL), pushed_cond_guards(NULL), do_not_convert_to_sj(FALSE), is_jtbm_merged(FALSE), is_jtbm_const_tab(FALSE), is_flattenable_semijoin(FALSE), is_registered_semijoin(FALSE), @@ -3225,6 +3231,7 @@ set_exists_transformed(); first_select->limit_params.select_limit= NULL; + first_select->limit_params.explicit_limit= FALSE; if (!(in_subs= new (thd->mem_root) Item_in_subselect(thd, left_exp, first_select))) { @@ -3281,8 +3288,12 @@ if (eqs.at(i).outer_exp-> walk(&Item::find_item_processor, TRUE, upper->item)) break; + DBUG_ASSERT(thd->stmt_arena->is_stmt_prepare_or_first_stmt_execute() || + thd->stmt_arena->is_conventional()); + DBUG_ASSERT(thd->stmt_arena->mem_root == thd->mem_root); if (i == (uint)eqs.elements() && - (in_subs->upper_refs.push_back(upper, thd->stmt_arena->mem_root))) + (in_subs->upper_refs.push_back( + upper, thd->mem_root))) goto out; } } @@ -3404,13 +3415,13 @@ { Query_arena *arena= 0, backup; SELECT_LEX *current= thd->lex->current_select; - const char *save_where= thd->where; + THD_WHERE save_where= thd->where; bool trans_res= true; bool result; DBUG_ENTER("Item_in_subselect::select_in_like_transformer"); DBUG_ASSERT(thd == join->thd); - thd->where= "IN/ALL/ANY subquery"; + thd->where= THD_WHERE::IN_ALL_ANY_SUBQUERY; /* In some optimisation cases we will not need this Item_in_optimizer @@ -3497,7 +3508,7 @@ { uint outer_cols_num; List *inner_cols; - char const *save_where= thd_arg->where; + THD_WHERE save_where= thd_arg->where; DBUG_ENTER("Item_in_subselect::fix_fields"); thd= thd_arg; @@ -3506,7 +3517,7 @@ if (test_strategy(SUBS_SEMI_JOIN)) DBUG_RETURN( !( (*ref)= new (thd->mem_root) Item_int(thd, 1)) ); - thd->where= "IN/ALL/ANY subquery"; + thd->where= THD_WHERE::IN_ALL_ANY_SUBQUERY; /* Check if the outer and inner IN operands match in those cases when we will not perform IN=>EXISTS transformation. Currently this is when we @@ -3687,6 +3698,26 @@ return FALSE; } +/** + Initialize the tracker which will be used to provide information for + the output of EXPLAIN and ANALYZE +*/ +void Item_in_subselect::init_subq_materialization_tracker(THD *thd) +{ + if (test_strategy(SUBS_MATERIALIZATION | SUBS_PARTIAL_MATCH_ROWID_MERGE | + SUBS_PARTIAL_MATCH_TABLE_SCAN)) + { + Explain_query *qw= thd->lex->explain; + DBUG_ASSERT(qw); + Explain_node *node= qw->get_node(unit->first_select()->select_number); + if (!node) + return; + node->subq_materialization= new(qw->mem_root) + Explain_subq_materialization(qw->mem_root); + materialization_tracker= node->subq_materialization->get_tracker(); + } +} + bool Item_allany_subselect::select_transformer(JOIN *join) @@ -3989,14 +4020,14 @@ if (unit->first_select()->item_list.elements == 1) { - if (set_row(unit->types, row)) + if (set_row(unit->item_list, row)) return TRUE; item->collation.set(row[0]->collation); } else { bool maybe_null_saved= maybe_null; - if (set_row(unit->types, row)) + if (set_row(unit->item_list, row)) return TRUE; maybe_null= maybe_null_saved; } @@ -4017,7 +4048,7 @@ int subselect_single_select_engine::exec() { - char const *save_where= thd->where; + THD_WHERE save_where= thd->where; SELECT_LEX *save_select= thd->lex->current_select; thd->lex->current_select= select_lex; DBUG_ENTER("subselect_single_select_engine::exec"); @@ -4138,7 +4169,7 @@ int subselect_union_engine::exec() { - char const *save_where= thd->where; + THD_WHERE save_where= thd->where; int res= unit->exec(); thd->where= save_where; return res; @@ -4285,12 +4316,14 @@ empty_result_set= TRUE; table->status= 0; Item_in_subselect *in_subs= item->get_IN_subquery(); + Subq_materialization_tracker *tracker= in_subs->get_materialization_tracker(); DBUG_ASSERT(in_subs); DBUG_ASSERT(thd); if (!tab->preread_init_done && tab->preread_init()) DBUG_RETURN(1); - + if (tracker) + tracker->increment_loops_count(); if (in_subs->left_expr_has_null()) { /* @@ -5044,6 +5077,9 @@ partial_match_key_parts_arg); if (pm_buff_size > thd->variables.rowid_merge_buff_size) strategy= PARTIAL_MATCH_SCAN; + else + item->get_IN_subquery()->get_materialization_tracker()-> + report_partial_match_buffer_size(pm_buff_size); } } @@ -5823,6 +5859,7 @@ } } + item_in->get_materialization_tracker()->report_exec_strategy(strategy); if (pm_engine) lookup_engine= pm_engine; item_in->change_engine(lookup_engine); @@ -6305,6 +6342,9 @@ DBUG_ASSERT(!(item_in->left_expr_has_null() && item_in->is_top_level_item())); + Subq_materialization_tracker *tracker= item_in->get_materialization_tracker(); + tracker->increment_loops_count(); + if (!item_in->left_expr_has_null()) { /* Try to find a matching row by index lookup. */ @@ -6318,6 +6358,7 @@ else { /* Search for a complete match. */ + tracker->increment_index_lookups(); if ((lookup_res= lookup_engine->index_lookup())) { /* An error occurred during lookup(). */ @@ -6362,6 +6403,7 @@ if (tmp_table->file->inited) tmp_table->file->ha_index_end(); + tracker->increment_partial_matches(); if (partial_match()) { /* The result of IN is UNKNOWN. */ @@ -6569,6 +6611,8 @@ 0, 0)) return TRUE; + item->get_IN_subquery()->get_materialization_tracker()-> + report_partial_merge_keys(merge_keys, merge_keys_count); return FALSE; } @@ -6712,9 +6756,10 @@ return FALSE; } - return bitmap_exists_intersection((const MY_BITMAP**) null_bitmaps, + return bitmap_exists_intersection(null_bitmaps, count_null_keys, - (uint)highest_min_row, (uint)lowest_max_row); + (uint)highest_min_row, + (uint)lowest_max_row); } @@ -7026,3 +7071,12 @@ DBUG_ASSERT(expr_cache->type() == Item::EXPR_CACHE_ITEM); node->cache_tracker= ((Item_cache_wrapper *)expr_cache)->init_tracker(qw->mem_root); } + + +void Subq_materialization_tracker::report_partial_merge_keys( + Ordered_key **merge_keys, uint merge_keys_count) +{ + partial_match_array_sizes.resize(merge_keys_count, 0); + for (uint i= 0; i < merge_keys_count; i++) + partial_match_array_sizes[i]= merge_keys[i]->get_key_buff_elements(); +} diff -Nru mariadb-10.11.6/sql/item_subselect.h mariadb-10.11.9/sql/item_subselect.h --- mariadb-10.11.6/sql/item_subselect.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_subselect.h 2024-08-03 07:29:58.000000000 +0000 @@ -18,6 +18,7 @@ /* subselect Item */ +#include "item.h" #ifdef USE_PRAGMA_INTERFACE #pragma interface /* gcc class implementation */ #endif @@ -43,6 +44,8 @@ */ typedef Comp_creator* (*chooser_compare_func_creator)(bool invert); class Cached_item; +class Subq_materialization_tracker; +class Explain_subq_materialization; /* base class for subselects */ @@ -274,8 +277,8 @@ void register_as_with_rec_ref(With_element *with_elem); void init_expr_cache_tracker(THD *thd); - Item* build_clone(THD *thd) override { return 0; } - Item* get_copy(THD *thd) override { return 0; } + Item* do_build_clone(THD *thd) const override { return nullptr; } + Item *do_get_copy(THD *thd) const override { return 0; } st_select_lex *wrap_tvc_into_select(THD *thd, st_select_lex *tvc_sl); @@ -495,6 +498,8 @@ bool was_null; /* A bitmap of possible execution strategies for an IN predicate. */ uchar in_strategy; + /* Tracker collecting execution parameters of a materialized subquery */ + Subq_materialization_tracker *materialization_tracker; protected: /* Used to trigger on/off conditions that were pushed down to subselect */ bool *pushed_cond_guards; @@ -519,6 +524,7 @@ left_expr could later be changed to something on the execution arena. */ Item *left_expr_orig; + public: /* Priority of this predicate in the convert-to-semi-join-nest process. */ int sj_convert_priority; @@ -620,7 +626,7 @@ Item_in_subselect(THD *thd_arg, Item * left_expr, st_select_lex *select_lex); Item_in_subselect(THD *thd_arg): Item_exists_subselect(thd_arg), left_expr_cache(0), first_execution(TRUE), - in_strategy(SUBS_NOT_TRANSFORMED), + in_strategy(SUBS_NOT_TRANSFORMED), materialization_tracker(NULL), pushed_cond_guards(NULL), func(NULL), do_not_convert_to_sj(FALSE), is_jtbm_merged(FALSE), is_jtbm_const_tab(FALSE), upper_item(0), converted_from_in_predicate(FALSE) {} @@ -772,6 +778,9 @@ { return left_expr; } inline Item* left_exp_orig() const { return left_expr_orig; } + void init_subq_materialization_tracker(THD *thd); + Subq_materialization_tracker *get_materialization_tracker() const + { return materialization_tracker; } friend class Item_ref_null_helper; friend class Item_is_not_null_test; @@ -794,16 +803,16 @@ chooser_compare_func_creator fc, st_select_lex *select_lex, bool all); - void cleanup(); + void cleanup() override; // only ALL subquery has upper not - subs_type substype() { return all?ALL_SUBS:ANY_SUBS; } - bool select_transformer(JOIN *join); + subs_type substype() override { return all?ALL_SUBS:ANY_SUBS; } + bool select_transformer(JOIN *join) override; void create_comp_func(bool invert) { func= func_creator(invert); } - void print(String *str, enum_query_type query_type); - enum precedence precedence() const { return CMP_PRECEDENCE; } + void print(String *str, enum_query_type query_type) override; + enum precedence precedence() const override { return CMP_PRECEDENCE; } bool is_maxmin_applicable(JOIN *join); bool transform_into_max_min(JOIN *join); - void no_rows_in_result(); + void no_rows_in_result() override; }; @@ -1063,9 +1072,9 @@ check_null(chk_null), having(having_arg) { DBUG_ASSERT(subs); } - int exec(); - void print (String *str, enum_query_type query_type); - virtual enum_engine_type engine_type() { return INDEXSUBQUERY_ENGINE; } + int exec() override; + void print (String *str, enum_query_type query_type) override; + enum_engine_type engine_type() override { return INDEXSUBQUERY_ENGINE; } }; /* @@ -1156,6 +1165,15 @@ select_result_interceptor *result, bool temp= FALSE) override; bool no_tables() const override;//=>base class + /* Possible execution strategies that can be used to compute hash semi-join.*/ + enum exec_strategy { + UNDEFINED= 0, + COMPLETE_MATCH, /* Use regular index lookups. */ + PARTIAL_MATCH, /* Use some partial matching strategy. */ + PARTIAL_MATCH_MERGE, /* Use partial matching through index merging. */ + PARTIAL_MATCH_SCAN, /* Use partial matching through table scan. */ + IMPOSSIBLE /* Subquery materialization is not applicable. */ + }; protected: /* The engine used to compute the IN predicate. */ @@ -1167,15 +1185,6 @@ uint count_partial_match_columns; uint count_null_only_columns; uint count_columns_with_nulls; - /* Possible execution strategies that can be used to compute hash semi-join.*/ - enum exec_strategy { - UNDEFINED, - COMPLETE_MATCH, /* Use regular index lookups. */ - PARTIAL_MATCH, /* Use some partial matching strategy. */ - PARTIAL_MATCH_MERGE, /* Use partial matching through index merging. */ - PARTIAL_MATCH_SCAN, /* Use partial matching through table scan. */ - IMPOSSIBLE /* Subquery materialization is not applicable. */ - }; /* The chosen execution strategy. Computed after materialization. */ exec_strategy strategy; exec_strategy get_strategy_using_schema(); @@ -1308,6 +1317,7 @@ rownum_t get_max_null_row() { return max_null_row; } MY_BITMAP * get_null_key() { return &null_key; } ha_rows get_null_count() { return null_count; } + ha_rows get_key_buff_elements() { return key_buff_elements; } /* Get the search key element that corresponds to the i-th key part of this index. @@ -1507,7 +1517,7 @@ bool test_null_row(rownum_t row_num); bool exists_complementing_null_row(MY_BITMAP *keys_to_complement); - bool partial_match(); + bool partial_match() override; public: subselect_rowid_merge_engine(THD *thd, subselect_uniquesubquery_engine *engine_arg, @@ -1527,15 +1537,15 @@ {} ~subselect_rowid_merge_engine(); bool init(MY_BITMAP *non_null_key_parts, MY_BITMAP *partial_match_key_parts); - void cleanup(); - virtual enum_engine_type engine_type() { return ROWID_MERGE_ENGINE; } + void cleanup() override; + enum_engine_type engine_type() override { return ROWID_MERGE_ENGINE; } }; class subselect_table_scan_engine: public subselect_partial_match_engine { protected: - bool partial_match(); + bool partial_match() override; public: subselect_table_scan_engine(THD *thd, subselect_uniquesubquery_engine *engine_arg, @@ -1545,7 +1555,96 @@ bool has_covering_null_row_arg, bool has_covering_null_columns_arg, uint count_columns_with_nulls_arg); - void cleanup(); - virtual enum_engine_type engine_type() { return TABLE_SCAN_ENGINE; } + void cleanup() override; + enum_engine_type engine_type() override { return TABLE_SCAN_ENGINE; } }; + +/** + @brief Subquery materialization tracker + + @details + Used to track various parameters of the materialized subquery execution, + such as the execution strategy, sizes of buffers employed, etc +*/ +class Subq_materialization_tracker +{ +public: + using Strategy = subselect_hash_sj_engine::exec_strategy; + + Subq_materialization_tracker(MEM_ROOT *mem_root) + : exec_strategy(Strategy::UNDEFINED), + partial_match_buffer_size(0), + partial_match_array_sizes(mem_root), + loops_count(0), + index_lookups_count(0), + partial_matches_count(0) + {} + + void report_partial_merge_keys(Ordered_key **merge_keys, + uint merge_keys_count); + + void report_exec_strategy(Strategy es) + { + exec_strategy= es; + } + + void report_partial_match_buffer_size(longlong sz) + { + partial_match_buffer_size= sz; + } + + void increment_loops_count() + { + loops_count++; + } + + void increment_index_lookups() + { + index_lookups_count++; + } + + void increment_partial_matches() + { + partial_matches_count++; + } + + void print_json_members(Json_writer *writer) const; +private: + Strategy exec_strategy; + ulonglong partial_match_buffer_size; + Dynamic_array partial_match_array_sizes; + + /* Number of times subquery predicate was evaluated */ + ulonglong loops_count; + + /* + Number of times we made a lookup in the materialized temptable + (we do this when all parts of left_expr are not NULLs) + */ + ulonglong index_lookups_count; + + /* + Number of times we had to check for a partial match (either by + scanning the materialized subquery or by doing a merge) + */ + ulonglong partial_matches_count; + + const char *get_exec_strategy() const + { + switch (exec_strategy) + { + case Strategy::UNDEFINED: + return "undefined"; + case Strategy::COMPLETE_MATCH: + return "index_lookup"; + case Strategy::PARTIAL_MATCH_MERGE: + return "index_lookup;array merge for partial match"; + case Strategy::PARTIAL_MATCH_SCAN: + return "index_lookup;full scan for partial match"; + default: + return "unsupported"; + } + } +}; + #endif /* ITEM_SUBSELECT_INCLUDED */ diff -Nru mariadb-10.11.6/sql/item_sum.cc mariadb-10.11.9/sql/item_sum.cc --- mariadb-10.11.6/sql/item_sum.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_sum.cc 2024-08-03 07:29:58.000000000 +0000 @@ -196,7 +196,11 @@ } if (window_func_sum_expr_flag) + { + thd->lex->in_sum_func= in_sum_func; return false; + } + /* The value of max_arg_level is updated if an argument of the set function contains a column reference resolved against a subquery whose level is @@ -1223,6 +1227,21 @@ } +bool Item_sum_hybrid::fix_length_and_dec_sint_ge0() +{ + // We don't have Item_field's of "ge0" type handlers. + DBUG_ASSERT(args[0]->real_item()->type() != FIELD_ITEM); + Type_std_attributes::set(args[0]); + /* + We're converting from e.g. slong_ge0 to slonglong + and need to add one extra character for the sign. + */ + max_length++; + set_handler(&type_handler_slonglong); + return false; +} + + /** MAX(str_field) converts ENUM/SET to CHAR, and preserve all other types for Fields. @@ -1296,9 +1315,14 @@ /* Don't cache value, as it will change */ if (!item->const_item()) arg_cache->set_used_tables(RAND_TABLE_BIT); + DBUG_ASSERT(item->type_handler_for_comparison() == + value->type_handler_for_comparison()); + DBUG_ASSERT(item->type_handler_for_comparison() == + arg_cache->type_handler_for_comparison()); cmp= new (thd->mem_root) Arg_comparator(); if (cmp) - cmp->set_cmp_func(thd, this, (Item**)&arg_cache, (Item**)&value, FALSE); + cmp->set_cmp_func(thd, this, item->type_handler_for_comparison(), + (Item**)&arg_cache, (Item**)&value, FALSE); DBUG_VOID_RETURN; } @@ -4056,6 +4080,7 @@ unique_filter= NULL; } } + row_count= 0; DBUG_ASSERT(tree == 0); } /* @@ -4287,8 +4312,14 @@ char *buf; String *new_separator; - if (!(buf= (char*) thd->stmt_arena->alloc(buflen)) || - !(new_separator= new(thd->stmt_arena->mem_root) + DBUG_ASSERT(thd->active_stmt_arena_to_use()-> + is_stmt_prepare_or_first_stmt_execute() || + thd->active_stmt_arena_to_use()-> + is_conventional() || + thd->active_stmt_arena_to_use()->state == + Query_arena::STMT_SP_QUERY_ARGUMENTS); + if (!(buf= (char*) thd->active_stmt_arena_to_use()->alloc(buflen)) || + !(new_separator= new(thd->active_stmt_arena_to_use()->mem_root) String(buf, buflen, collation.collation))) return TRUE; @@ -4575,7 +4606,7 @@ if (sum_func() == GROUP_CONCAT_FUNC) { str->append(STRING_WITH_LEN(" separator \'")); - str->append_for_single_quote(separator->ptr(), separator->length()); + str->append_for_single_quote_opt_convert(*separator); str->append(STRING_WITH_LEN("\'")); } diff -Nru mariadb-10.11.6/sql/item_sum.h mariadb-10.11.9/sql/item_sum.h --- mariadb-10.11.6/sql/item_sum.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_sum.h 2024-08-03 07:29:59.000000000 +0000 @@ -599,6 +599,17 @@ bool is_window_func_sum_expr() { return window_func_sum_expr_flag; } virtual void setup_caches(THD *thd) {}; virtual void set_partition_row_count(ulonglong count) { DBUG_ASSERT(0); } + + /* + While most Item_sum descendants employ standard aggregators configured + through Item_sum::set_aggregator() call, there are exceptions like + Item_func_group_concat, which implements its own custom aggregators for + deduplication values. + This function distinguishes between the use of standard and custom + aggregators by the object + */ + virtual bool uses_non_standard_aggregator_for_distinct() const + { return false; } }; @@ -693,15 +704,15 @@ Aggregator(sum), table(NULL), tmp_table_param(NULL), tree(NULL), always_null(false), use_distinct_values(false) {} virtual ~Aggregator_distinct (); - Aggregator_type Aggrtype() { return DISTINCT_AGGREGATOR; } + Aggregator_type Aggrtype() override { return DISTINCT_AGGREGATOR; } - bool setup(THD *); - void clear(); - bool add(); - void endup(); - virtual my_decimal *arg_val_decimal(my_decimal * value); - virtual double arg_val_real(); - virtual bool arg_is_null(bool use_null_value); + bool setup(THD *) override; + void clear() override; + bool add() override; + void endup() override; + my_decimal *arg_val_decimal(my_decimal * value) override; + double arg_val_real() override; + bool arg_is_null(bool use_null_value) override; bool unique_walk_function(void *element); bool unique_walk_function_for_count(void *element); @@ -720,15 +731,15 @@ Aggregator_simple (Item_sum *sum) : Aggregator(sum) {} - Aggregator_type Aggrtype() { return Aggregator::SIMPLE_AGGREGATOR; } + Aggregator_type Aggrtype() override { return Aggregator::SIMPLE_AGGREGATOR; } - bool setup(THD * thd) { return item_sum->setup(thd); } - void clear() { item_sum->clear(); } - bool add() { return item_sum->add(); } - void endup() {}; - virtual my_decimal *arg_val_decimal(my_decimal * value); - virtual double arg_val_real(); - virtual bool arg_is_null(bool use_null_value); + bool setup(THD * thd) override { return item_sum->setup(thd); } + void clear() override { item_sum->clear(); } + bool add() override { return item_sum->add(); } + void endup() override {}; + my_decimal *arg_val_decimal(my_decimal * value) override; + double arg_val_real() override; + bool arg_is_null(bool use_null_value) override; }; @@ -744,7 +755,7 @@ Item_sum(thd, list) {} Item_sum_num(THD *thd, Item_sum_num *item): Item_sum(thd, item) {} - bool fix_fields(THD *, Item **); + bool fix_fields(THD *, Item **) override; }; @@ -796,7 +807,8 @@ max_length=21; base_flags&= ~item_base_t::MAYBE_NULL; null_value=0; - return FALSE; } + return false; + } }; @@ -823,8 +835,8 @@ } Item_sum_sum(THD *thd, Item_sum_sum *item); enum Sumfunctype sum_func() const override - { - return has_with_distinct() ? SUM_DISTINCT_FUNC : SUM_FUNC; + { + return has_with_distinct() ? SUM_DISTINCT_FUNC : SUM_FUNC; } void cleanup() override; void direct_add(my_decimal *add_sum_decimal); @@ -854,7 +866,7 @@ } Item *copy_or_same(THD* thd) override; void remove() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool supports_removal() const override @@ -929,7 +941,7 @@ return has_with_distinct() ? name_distinct : name_normal; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool supports_removal() const override @@ -987,7 +999,7 @@ count= 0; Item_sum_sum::cleanup(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool supports_removal() const override @@ -1076,7 +1088,7 @@ m_stddev= Stddev(); Item_sum_double::cleanup(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1102,7 +1114,7 @@ return sample ? stddev_samp_name : std_name; } Item *copy_or_same(THD* thd) override final; - Item *get_copy(THD *thd) override final + Item *do_get_copy(THD *thd) const override final { return get_item_copy(thd, this); } }; @@ -1127,6 +1139,7 @@ { return Type_handler_hybrid_field_type::type_handler(); } bool fix_length_and_dec_generic(); bool fix_length_and_dec_numeric(const Type_handler *h); + bool fix_length_and_dec_sint_ge0(); bool fix_length_and_dec_string(); }; @@ -1172,7 +1185,8 @@ { return get_arg(0)->real_type_handler(); } - const TYPELIB *get_typelib() const override { return args[0]->get_typelib(); } + const TYPELIB *get_typelib() const override + { return args[0]->get_typelib(); } void update_field() override; void min_max_update_str_field(); void min_max_update_real_field(); @@ -1203,7 +1217,7 @@ return sum_name; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1213,7 +1227,7 @@ public: Item_sum_max(THD *thd, Item *item_par): Item_sum_min_max(thd, item_par, -1) {} Item_sum_max(THD *thd, Item_sum_max *item) :Item_sum_min_max(thd, item) {} - enum Sumfunctype sum_func () const override {return MAX_FUNC;} + enum Sumfunctype sum_func() const override {return MAX_FUNC;} bool add() override; LEX_CSTRING func_name_cstring() const override @@ -1222,7 +1236,7 @@ return sum_name; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1264,9 +1278,7 @@ clear_as_window(); Item_sum_int::cleanup(); } - void setup_window_func(THD *thd __attribute__((unused)), - Window_spec *window_spec __attribute__((unused))) - override + void setup_window_func(THD *, Window_spec *) override { as_window_function= TRUE; clear_as_window(); @@ -1317,7 +1329,7 @@ return sum_name; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } private: @@ -1338,7 +1350,7 @@ return sum_min_name; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } private: @@ -1357,7 +1369,7 @@ return sum_min_name; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } private: @@ -1501,7 +1513,7 @@ { return sp_result_field; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } Item *copy_or_same(THD *thd) override; }; @@ -1567,8 +1579,9 @@ String *val_str(String *str) override { return val_string_from_real(str); } double val_real() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -1597,8 +1610,9 @@ return VDec(this).to_string_round(str, decimals); } my_decimal *val_decimal(my_decimal *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -1619,8 +1633,9 @@ bool is_null() override { update_null_value(); return null_value; } const Type_handler *type_handler() const override { return &type_handler_double; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -1632,8 +1647,9 @@ { } enum Type type() const override { return FIELD_STD_ITEM; } double val_real() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; @@ -1731,7 +1747,7 @@ bool fix_length_and_dec(THD *thd) override { fix_num_length_and_dec(); return FALSE; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1758,7 +1774,7 @@ } bool fix_length_and_dec(THD *thd) override { decimals=0; max_length=21; return FALSE; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1800,7 +1816,7 @@ { return string_type_handler(); } bool fix_length_and_dec(THD *thd) override; Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1832,7 +1848,7 @@ bool fix_length_and_dec(THD *thd) override { fix_num_length_and_dec(); return FALSE; } Item *copy_or_same(THD* thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -2015,6 +2031,9 @@ { return f->val_str(tmp, key + offset); } virtual void cut_max_length(String *result, uint old_length, uint max_length) const; + bool uses_non_standard_aggregator_for_distinct() const override + { return distinct; } + public: // Methods used by ColumnStore bool get_distinct() const { return distinct; } @@ -2089,7 +2108,7 @@ void print(String *str, enum_query_type query_type) override; bool change_context_processor(void *cntx) override { context= (Name_resolution_context *)cntx; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } qsort_cmp2 get_comparator_function_for_distinct(); qsort_cmp2 get_comparator_function_for_order_by(); diff -Nru mariadb-10.11.6/sql/item_timefunc.cc mariadb-10.11.9/sql/item_timefunc.cc --- mariadb-10.11.6/sql/item_timefunc.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_timefunc.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1303,6 +1303,15 @@ } +static inline +uint32 adjust_interval_field_uint32(ulonglong value, int32 multiplier) +{ + return value > ((ulonglong) (uint32) (UINT_MAX32)) / multiplier ? + (uint32) UINT_MAX32 : + (uint32) (value * multiplier); +} + + /** Convert a string to a interval value. @@ -1313,7 +1322,7 @@ interval_type int_type, INTERVAL *interval) { ulonglong array[5]; - longlong UNINIT_VAR(value); + ulonglong UNINIT_VAR(value); const char *UNINIT_VAR(str); size_t UNINIT_VAR(length); CHARSET_INFO *UNINIT_VAR(cs); @@ -1340,14 +1349,17 @@ } else if ((int) int_type <= INTERVAL_MICROSECOND) { - value= args->val_int(); - if (args->null_value) - return 1; - if (value < 0) - { - interval->neg=1; - value= -value; - } + /* + Let's use Longlong_hybrid_null to handle correctly: + - signed and unsigned values + - the corner case with LONGLONG_MIN + (avoid undefined behavior with its negation) + */ + const Longlong_hybrid_null nr= args->to_longlong_hybrid_null(); + if (nr.is_null()) + return true; + value= nr.abs(); + interval->neg= nr.neg() ? 1 : 0; } else { @@ -1374,13 +1386,13 @@ interval->year= (ulong) value; break; case INTERVAL_QUARTER: - interval->month= (ulong)(value*3); + interval->month= adjust_interval_field_uint32(value, 3); break; case INTERVAL_MONTH: interval->month= (ulong) value; break; case INTERVAL_WEEK: - interval->day= (ulong)(value*7); + interval->day= adjust_interval_field_uint32(value, 7); break; case INTERVAL_DAY: interval->day= (ulong) value; @@ -2942,7 +2954,7 @@ switch (int_type) { case INTERVAL_YEAR: set_date_length(4); break; // YYYY case INTERVAL_YEAR_MONTH: set_date_length(6); break; // YYYYMM - case INTERVAL_QUARTER: set_date_length(2); break; // 1..4 + case INTERVAL_QUARTER: set_date_length(1); break; // 1..4 case INTERVAL_MONTH: set_date_length(2); break; // MM case INTERVAL_WEEK: set_date_length(2); break; // 0..52 case INTERVAL_DAY: set_day_length(daylen); break; // DD @@ -3080,6 +3092,13 @@ { str->append(STRING_WITH_LEN(" charset ")); str->append(cast_cs->cs_name); + /* + Print the "binary" keyword in cases like: + CAST('str' AS CHAR CHARACTER SET latin1 BINARY) + */ + if ((cast_cs->state & MY_CS_BINSORT) && + Charset(cast_cs).can_have_collate_clause()) + str->append(STRING_WITH_LEN(" binary")); } str->append(')'); } @@ -3242,21 +3261,21 @@ class Item_char_typecast_func_handler: public Item_handled_func::Handler_str { public: - const Type_handler *return_type_handler(const Item_handled_func *item) const + const Type_handler *return_type_handler(const Item_handled_func *item) const override { return Type_handler::string_type_handler(item->max_length); } const Type_handler * - type_handler_for_create_select(const Item_handled_func *item) const + type_handler_for_create_select(const Item_handled_func *item) const override { return return_type_handler(item)->type_handler_for_tmp_table(item); } - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { return false; } - String *val_str(Item_handled_func *item, String *to) const + String *val_str(Item_handled_func *item, String *to) const override { DBUG_ASSERT(dynamic_cast(item)); return static_cast(item)->val_str_generic(to); @@ -3500,6 +3519,24 @@ if (l_time1.neg != l_time2.neg) l_sign= -l_sign; + if (l_time1.time_type == MYSQL_TIMESTAMP_TIME) + { + /* + In case of TIME-alike arguments: + TIMEDIFF('38:59:59', '839:00:00') + let's truncate extra fractional seconds that might appear if the argument + values were out of the supported TIME range. For example, args[n]->get_time() + for the string literal '839:00:00' returns TIME'838:59:59.999999'. + The fractional part must be truncated according to this->decimals, + to avoid returning more fractional seconds than it was detected + during this->fix_length_and_dec(). + Note, the thd rounding mode should not be important here, as we're removing + redundant digits from the maximum possible value: '838:59:59.999999'. + */ + my_time_trunc(&l_time1, decimals); + my_time_trunc(&l_time2, decimals); + } + if (calc_time_diff(&l_time1, &l_time2, l_sign, &l_time3, fuzzydate)) return (null_value= 1); diff -Nru mariadb-10.11.6/sql/item_timefunc.h mariadb-10.11.9/sql/item_timefunc.h --- mariadb-10.11.6/sql/item_timefunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_timefunc.h 2024-08-03 07:29:59.000000000 +0000 @@ -30,23 +30,23 @@ interval_type int_type, INTERVAL *interval); -class Item_long_func_date_field: public Item_long_func +class Item_long_func_date_field: public Item_long_ge0_func { bool check_arguments() const override { return args[0]->check_type_can_return_date(func_name_cstring()); } public: Item_long_func_date_field(THD *thd, Item *a) - :Item_long_func(thd, a) { } + :Item_long_ge0_func(thd, a) { } }; -class Item_long_func_time_field: public Item_long_func +class Item_long_func_time_field: public Item_long_ge0_func { bool check_arguments() const override { return args[0]->check_type_can_return_time(func_name_cstring()); } public: Item_long_func_time_field(THD *thd, Item *a) - :Item_long_func(thd, a) { } + :Item_long_ge0_func(thd, a) { } }; @@ -67,7 +67,7 @@ max_length=6*MY_CHARSET_BIN_MB_MAXLEN; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -90,7 +90,7 @@ max_length=6*MY_CHARSET_BIN_MB_MAXLEN; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -120,7 +120,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -153,7 +153,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -181,15 +181,15 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; -class Item_func_month :public Item_long_func +class Item_func_month :public Item_long_ge0_func { public: - Item_func_month(THD *thd, Item *a): Item_long_func(thd, a) + Item_func_month(THD *thd, Item *a): Item_long_ge0_func(thd, a) { } longlong val_int() override; LEX_CSTRING func_name_cstring() const override @@ -210,7 +210,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -236,7 +236,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -264,7 +264,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -292,7 +292,7 @@ { return !has_time_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -320,7 +320,7 @@ { return !has_time_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -348,7 +348,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -376,12 +376,12 @@ { return !has_time_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; -class Item_func_week :public Item_long_func +class Item_func_week :public Item_long_ge0_func { bool check_arguments() const override { @@ -389,8 +389,8 @@ (arg_count > 1 && args[1]->check_type_can_return_int(func_name_cstring())); } public: - Item_func_week(THD *thd, Item *a): Item_long_func(thd, a) {} - Item_func_week(THD *thd, Item *a, Item *b): Item_long_func(thd, a, b) {} + Item_func_week(THD *thd, Item *a): Item_long_ge0_func(thd, a) {} + Item_func_week(THD *thd, Item *a, Item *b): Item_long_ge0_func(thd, a, b) {} longlong val_int() override; LEX_CSTRING func_name_cstring() const override { @@ -414,7 +414,7 @@ { return arg_count == 2; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -447,7 +447,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -477,7 +477,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -512,7 +512,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -539,7 +539,7 @@ { return !has_date_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -560,9 +560,9 @@ else set_handler(type_handler_long_or_longlong()); } - double real_op() { DBUG_ASSERT(0); return 0; } - String *str_op(String *str) { DBUG_ASSERT(0); return 0; } - bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + double real_op() override { DBUG_ASSERT(0); return 0; } + String *str_op(String *str) override { DBUG_ASSERT(0); return 0; } + bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override { DBUG_ASSERT(0); return true; @@ -608,7 +608,7 @@ } longlong int_op() override; my_decimal *decimal_op(my_decimal* buf) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -636,7 +636,7 @@ } longlong int_op() override; my_decimal *decimal_op(my_decimal* buf) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -744,7 +744,7 @@ return name; } void store_now_in_TIME(THD *thd, MYSQL_TIME *now_time) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -759,7 +759,7 @@ return name; } void store_now_in_TIME(THD *thd, MYSQL_TIME *now_time) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -791,7 +791,7 @@ return name; } void store_now_in_TIME(THD *thd, MYSQL_TIME *now_time) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -806,7 +806,7 @@ return name; } void store_now_in_TIME(THD* thd, MYSQL_TIME *now_time) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -849,7 +849,7 @@ int save_in_field(Field *field, bool no_conversions) override; void store_now_in_TIME(THD *thd, MYSQL_TIME *now_time) override; enum Functype functype() const override { return NOW_FUNC; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -870,7 +870,7 @@ return mark_unsupported_function(func_name(), "()", arg, VCOL_TIME_FUNC | VCOL_NON_DETERMINISTIC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -898,7 +898,7 @@ VCOL_TIME_FUNC | VCOL_NON_DETERMINISTIC); } enum Functype functype() const override { return SYSDATE_FUNC; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -921,7 +921,7 @@ { return has_date_args() || has_time_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -958,7 +958,7 @@ return false; return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -973,7 +973,7 @@ return name; } bool check_vcol_func_processor(void *arg) override { return false; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1027,7 +1027,7 @@ return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1050,7 +1050,7 @@ { return mark_unsupported_function(func_name(), "()", arg, VCOL_SESSION_FUNC); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1100,7 +1100,7 @@ } bool get_date(THD *thd, MYSQL_TIME *res, date_mode_t fuzzydate) override; void cleanup() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1123,7 +1123,7 @@ static LEX_CSTRING name= {STRING_WITH_LEN("sec_to_time") }; return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1147,7 +1147,7 @@ void print(String *str, enum_query_type query_type) override; enum precedence precedence() const override { return INTERVAL_PRECEDENCE; } bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1166,12 +1166,17 @@ void set_date_length(uint32 length) { /* - Although DATE components (e.g. YEAR, YEAR_MONTH, QUARTER, MONTH, WEEK) - cannot have a sign, we should probably still add +1, - because all around the code we assume that max_length is sign inclusive. - Another options is to set unsigned_flag to "true". + DATE components (e.g. YEAR, YEAR_MONTH, QUARTER, MONTH, WEEK) + return non-negative values but historically EXTRACT for date + components always returned the signed int data type. + So do equivalent functions YEAR(), QUARTER(), MONTH(), WEEK(). + Let's set the data type to "signed int, but not negative", + so "this" produces better data types in VARCHAR and DECIMAL context + by using the fact that all of the max_length characters are spent + for digits (non of them are spent for the sign). */ - set_handler(handler_by_length(max_length= length, 10)); // QQ: see above + set_handler(&type_handler_slong_ge0); + fix_char_length(length); m_date_mode= date_mode_t(0); } void set_day_length(uint32 length) @@ -1254,7 +1259,7 @@ } return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1301,7 +1306,7 @@ } void print(String *str, enum_query_type query_type) override; bool need_parentheses_in_default() override { return true; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1315,7 +1320,7 @@ &my_charset_latin1), m_fsp(fsp) { } - String *val_str(String *to) + String *val_str(String *to) override { Interval_DDhhmmssff it(current_thd, args[0], m_fsp); null_value= !it.is_valid_interval_DDhhmmssff(); @@ -1342,7 +1347,7 @@ { return args[0]->type_handler()->Item_date_typecast_fix_length_and_dec(this); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1368,7 +1373,7 @@ Item_time_typecast_fix_length_and_dec(this); } Sql_mode_dependency value_depends_on_sql_mode() const override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1394,7 +1399,7 @@ Item_datetime_typecast_fix_length_and_dec(this); } Sql_mode_dependency value_depends_on_sql_mode() const override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1412,7 +1417,7 @@ return name; } bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1453,7 +1458,7 @@ return (null_value= Sec6_add(dt.get_mysql_time(), it.get_mysql_time(), 1). to_datetime(ltime)); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1485,7 +1490,7 @@ static LEX_CSTRING subtime= { STRING_WITH_LEN("subtime") }; return sign > 0 ? addtime : subtime; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1510,7 +1515,7 @@ return FALSE; } bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1537,7 +1542,7 @@ return name; } bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1565,7 +1570,7 @@ { return !has_time_args(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1594,7 +1599,7 @@ return FALSE; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1625,7 +1630,7 @@ return FALSE; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1649,7 +1654,7 @@ return name; } bool fix_length_and_dec(THD *thd) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1666,7 +1671,7 @@ return name; } bool get_date(THD *thd, MYSQL_TIME *res, date_mode_t fuzzydate) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -1711,7 +1716,7 @@ public Func_handler_date_add_interval { public: - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { uint dec= MY_MAX(item->arguments()[0]->datetime_precision(current_thd), interval_dec(item->arguments()[1], int_type(item))); @@ -1719,7 +1724,7 @@ return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { Datetime::Options opt(TIME_CONV_NONE, thd); Datetime dt(thd, item->arguments()[0], opt); @@ -1738,7 +1743,7 @@ { public: bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const; + MYSQL_TIME *to, date_mode_t fuzzy) const override; }; @@ -1748,7 +1753,7 @@ { public: bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { /* The first argument is known to be of the DATE data type (not DATETIME). @@ -1770,7 +1775,7 @@ public Func_handler_date_add_interval { public: - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { uint dec= MY_MAX(item->arguments()[0]->time_precision(current_thd), interval_dec(item->arguments()[1], int_type(item))); @@ -1778,7 +1783,7 @@ return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { Time t(thd, item->arguments()[0]); if (!t.is_valid_time()) @@ -1795,7 +1800,7 @@ public Func_handler_date_add_interval { public: - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { uint dec= MY_MAX(item->arguments()[0]->datetime_precision(current_thd), interval_dec(item->arguments()[1], int_type(item))); @@ -1807,7 +1812,7 @@ return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { if (item->arguments()[0]-> get_date(thd, to, Datetime::Options(TIME_CONV_NONE, thd)) || @@ -1836,7 +1841,7 @@ Func_handler_add_time_datetime(int sign) :Func_handler_sign(sign) { } - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { THD *thd= current_thd; uint dec0= item->arguments()[0]->datetime_precision(thd); @@ -1845,7 +1850,7 @@ return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { DBUG_ASSERT(item->fixed()); Datetime::Options opt(TIME_CONV_NONE, thd); @@ -1870,7 +1875,7 @@ Func_handler_add_time_time(int sign) :Func_handler_sign(sign) { } - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { THD *thd= current_thd; uint dec0= item->arguments()[0]->time_precision(thd); @@ -1879,7 +1884,7 @@ return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { DBUG_ASSERT(item->fixed()); Time t(thd, item->arguments()[0]); @@ -1903,7 +1908,7 @@ Func_handler_add_time_string(int sign) :Func_handler_sign(sign) { } - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { uint dec0= item->arguments()[0]->decimals; uint dec1= Interval_DDhhmmssff::fsp(current_thd, item->arguments()[1]); @@ -1916,7 +1921,7 @@ return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { DBUG_ASSERT(item->fixed()); // Detect a proper timestamp type based on the argument values @@ -1940,13 +1945,13 @@ public Item_handled_func::Handler_datetime { public: - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { item->fix_attributes_datetime(0); return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { return static_cast(item)-> get_date_common(thd, to, fuzzy, MYSQL_TIMESTAMP_DATETIME); @@ -1958,13 +1963,13 @@ public Item_handled_func::Handler_datetime { public: - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { item->fix_attributes_datetime(TIME_SECOND_PART_DIGITS); return false; } bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { return static_cast(item)-> get_date_common(thd, to, fuzzy, MYSQL_TIMESTAMP_DATETIME); @@ -1976,7 +1981,7 @@ { public: bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { return static_cast(item)-> get_date_common(thd, to, fuzzy, MYSQL_TIMESTAMP_DATE); @@ -1988,7 +1993,7 @@ { public: bool get_date(THD *thd, Item_handled_func *item, - MYSQL_TIME *to, date_mode_t fuzzy) const + MYSQL_TIME *to, date_mode_t fuzzy) const override { if (static_cast(item)-> get_date_common(thd, to, fuzzy, MYSQL_TIMESTAMP_TIME)) @@ -2011,7 +2016,7 @@ class Func_handler_str_to_date_time_sec: public Func_handler_str_to_date_time { public: - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { item->fix_attributes_time(0); return false; @@ -2022,7 +2027,7 @@ class Func_handler_str_to_date_time_usec: public Func_handler_str_to_date_time { public: - bool fix_length_and_dec(Item_handled_func *item) const + bool fix_length_and_dec(Item_handled_func *item) const override { item->fix_attributes_time(TIME_SECOND_PART_DIGITS); return false; diff -Nru mariadb-10.11.6/sql/item_vers.h mariadb-10.11.9/sql/item_vers.h --- mariadb-10.11.6/sql/item_vers.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_vers.h 2024-08-03 07:29:59.000000000 +0000 @@ -49,7 +49,7 @@ return name; } void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -65,7 +65,7 @@ return (trt_field == TR_table::FLD_BEGIN_TS) ? begin_name : commit_name; } bool get_date(THD *thd, MYSQL_TIME *res, date_mode_t fuzzydate) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } bool fix_length_and_dec(THD *thd) override { fix_attributes_datetime(decimals); return FALSE; } @@ -110,7 +110,7 @@ } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -127,7 +127,7 @@ return name; } longlong val_int() override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; diff -Nru mariadb-10.11.6/sql/item_windowfunc.h mariadb-10.11.9/sql/item_windowfunc.h --- mariadb-10.11.6/sql/item_windowfunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_windowfunc.h 2024-08-03 07:29:59.000000000 +0000 @@ -150,7 +150,7 @@ return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -225,7 +225,7 @@ } Item_sum_int::cleanup(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -298,7 +298,7 @@ } Item_sum_int::cleanup(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -362,7 +362,7 @@ return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -389,7 +389,7 @@ return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -411,7 +411,7 @@ return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -433,7 +433,7 @@ return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -455,7 +455,7 @@ return name; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -570,7 +570,7 @@ Partition_row_count::set_partition_row_count(count); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } private: @@ -658,7 +658,7 @@ Partition_row_count::set_partition_row_count(count); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -735,7 +735,7 @@ Partition_row_count::set_partition_row_count(count); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } private: @@ -899,7 +899,7 @@ Partition_row_count::set_partition_row_count(count); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } void setup_window_func(THD *thd, Window_spec *window_spec) override; void setup_hybrid(THD *thd, Item *item); @@ -1036,7 +1036,7 @@ Partition_row_count::set_partition_row_count(count); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } void setup_window_func(THD *thd, Window_spec *window_spec) override; void setup_hybrid(THD *thd, Item *item); @@ -1391,7 +1391,7 @@ void print(String *str, enum_query_type query_type) override; - Item *get_copy(THD *thd) override { return 0; } + Item *do_get_copy(THD *thd) const override { return 0; } }; diff -Nru mariadb-10.11.6/sql/item_xmlfunc.cc mariadb-10.11.9/sql/item_xmlfunc.cc --- mariadb-10.11.6/sql/item_xmlfunc.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_xmlfunc.cc 2024-08-03 07:29:59.000000000 +0000 @@ -221,7 +221,7 @@ return { STRING_WITH_LEN("xpath_rootelement") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -237,7 +237,7 @@ return { STRING_WITH_LEN("xpath_union") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -277,7 +277,7 @@ return { STRING_WITH_LEN("xpath_selfbyname") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -294,7 +294,7 @@ return { STRING_WITH_LEN("xpath_childbyname") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -313,7 +313,7 @@ return { STRING_WITH_LEN("xpath_descendantbyname") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -332,7 +332,7 @@ return { STRING_WITH_LEN("xpath_ancestorbyname") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -350,7 +350,7 @@ return { STRING_WITH_LEN("xpath_parentbyname") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -367,7 +367,7 @@ return { STRING_WITH_LEN("xpath_attributebyname") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -387,7 +387,7 @@ return { STRING_WITH_LEN("xpath_predicate") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -403,7 +403,7 @@ return { STRING_WITH_LEN("xpath_elementbyindex") }; } bool val_native(THD *thd, Native *nodeset) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -434,7 +434,7 @@ } return args[0]->val_real() ? 1 : 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -451,7 +451,7 @@ return { STRING_WITH_LEN("xpath_cast_number") }; } double val_real() override { return args[0]->val_real(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -471,7 +471,7 @@ } bool fix_length_and_dec(THD *thd) override { max_length= MAX_BLOB_WIDTH; return FALSE; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -495,7 +495,7 @@ return tmp_native_value.element(0).pos + 1; return 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -521,7 +521,7 @@ return predicate_supplied_context_size; return tmp_native_value.elements(); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -569,7 +569,7 @@ } return sum; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -584,13 +584,13 @@ CHARSET_INFO *cs): Item_string(thd, str, length, cs) { } - bool const_item() const { return false ; } - bool basic_const_item() const { return false; } + bool const_item() const override { return false ; } + bool basic_const_item() const override { return false; } void set_value(const char *str, uint length, CHARSET_INFO *cs) { str_value.set(str, length, cs); } - Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs) + Item *safe_charset_converter(THD *thd, CHARSET_INFO *tocs) override { /* Item_string::safe_charset_converter() does not accept non-constants. @@ -654,7 +654,7 @@ } return 0; } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; diff -Nru mariadb-10.11.6/sql/item_xmlfunc.h mariadb-10.11.9/sql/item_xmlfunc.h --- mariadb-10.11.6/sql/item_xmlfunc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/item_xmlfunc.h 2024-08-03 07:29:59.000000000 +0000 @@ -137,7 +137,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -158,7 +158,7 @@ return name; } String *val_str(String *) override; - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; diff -Nru mariadb-10.11.6/sql/json_table.cc mariadb-10.11.9/sql/json_table.cc --- mariadb-10.11.6/sql/json_table.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/json_table.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1162,7 +1162,7 @@ bool Table_function_json_table::setup(THD *thd, TABLE_LIST *sql_table, SELECT_LEX *s_lex) { - thd->where= "JSON_TABLE argument"; + thd->where= THD_WHERE::JSON_TABLE_ARGUMENT; if (!m_context_setup_done) { diff -Nru mariadb-10.11.6/sql/key.cc mariadb-10.11.9/sql/key.cc --- mariadb-10.11.6/sql/key.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/key.cc 2024-08-03 07:29:59.000000000 +0000 @@ -609,7 +609,7 @@ } /* No null values in the fields - We use the virtual method cmp_max with a max length parameter. + We use the virtual method cmp_prefix with a max length parameter. For most field types this translates into a cmp without max length. The exceptions are the BLOB and VARCHAR field types that take the max length into account. @@ -758,13 +758,13 @@ if (is_string) { - if (cs->mbmaxlen > 1) - { - size_t char_length= cs->charpos(pos + pack_length, - pos + pack_length + length, - length / cs->mbmaxlen); - set_if_smaller(length, char_length); - } + /* + Surprisingly, BNL-H joins may use prefix keys. This may happen + when there is a real index on the column used in equi-join. + + In this case, the passed key tuple is already a prefix, no + special handling is required. + */ cs->hash_sort(pos+pack_length, length, &nr, &nr2); key+= pack_length; } @@ -868,25 +868,13 @@ if (is_string) { /* - Compare the strings taking into account length in characters - and collation + Surprisingly, BNL-H joins may use prefix keys. This may happen + when there is a real index on the column used in equi-join. + In this case, we get properly truncated prefixes here. */ - size_t byte_len1= length1, byte_len2= length2; - if (cs->mbmaxlen > 1) - { - size_t char_length1= cs->charpos(pos1 + pack_length, - pos1 + pack_length + length1, - length1 / cs->mbmaxlen); - size_t char_length2= cs->charpos(pos2 + pack_length, - pos2 + pack_length + length2, - length2 / cs->mbmaxlen); - set_if_smaller(length1, char_length1); - set_if_smaller(length2, char_length2); - } - if (length1 != length2 || - cs->strnncollsp(pos1 + pack_length, byte_len1, - pos2 + pack_length, byte_len2)) - return TRUE; + if (cs->strnncollsp(pos1 + pack_length, length1, + pos2 + pack_length, length2)) + return true; key1+= pack_length; key2+= pack_length; } else diff -Nru mariadb-10.11.6/sql/keycaches.cc mariadb-10.11.9/sql/keycaches.cc --- mariadb-10.11.6/sql/keycaches.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/keycaches.cc 2024-08-03 07:29:59.000000000 +0000 @@ -48,7 +48,7 @@ { return length == name_length && !memcmp(name, name_cmp, length); } - ~NAMED_ILINK() + ~NAMED_ILINK() override { my_free((void *) name); } diff -Nru mariadb-10.11.6/sql/lex.h mariadb-10.11.9/sql/lex.h --- mariadb-10.11.6/sql/lex.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/lex.h 2024-08-03 07:29:59.000000000 +0000 @@ -79,9 +79,9 @@ { "AT", SYM(AT_SYM)}, { "ATOMIC", SYM(ATOMIC_SYM)}, { "AUTHORS", SYM(AUTHORS_SYM)}, + { "AUTO", SYM(AUTO_SYM)}, { "AUTO_INCREMENT", SYM(AUTO_INC)}, { "AUTOEXTEND_SIZE", SYM(AUTOEXTEND_SIZE_SYM)}, - { "AUTO", SYM(AUTO_SYM)}, { "AVG", SYM(AVG_SYM)}, { "AVG_ROW_LENGTH", SYM(AVG_ROW_LENGTH)}, { "BACKUP", SYM(BACKUP_SYM)}, @@ -385,6 +385,7 @@ { "MASTER_SSL_VERIFY_SERVER_CERT", SYM(MASTER_SSL_VERIFY_SERVER_CERT_SYM)}, { "MASTER_USER", SYM(MASTER_USER_SYM)}, { "MASTER_USE_GTID", SYM(MASTER_USE_GTID_SYM)}, + { "MASTER_DEMOTE_TO_REPLICA", SYM(MASTER_DEMOTE_TO_SLAVE_SYM)}, { "MASTER_DEMOTE_TO_SLAVE", SYM(MASTER_DEMOTE_TO_SLAVE_SYM)}, { "MASTER_HEARTBEAT_PERIOD", SYM(MASTER_HEARTBEAT_PERIOD_SYM)}, { "MATCH", SYM(MATCH)}, @@ -428,7 +429,6 @@ { "NCHAR", SYM(NCHAR_SYM)}, { "NESTED", SYM(NESTED_SYM)}, { "NEVER", SYM(NEVER_SYM)}, - { "NEW", SYM(NEW_SYM)}, { "NEXT", SYM(NEXT_SYM)}, { "NEXTVAL", SYM(NEXTVAL_SYM)}, { "NO", SYM(NO_SYM)}, @@ -686,7 +686,6 @@ { "TRUE", SYM(TRUE_SYM)}, { "TRUNCATE", SYM(TRUNCATE_SYM)}, { "TYPE", SYM(TYPE_SYM)}, - { "TYPES", SYM(TYPES_SYM)}, { "UNBOUNDED", SYM(UNBOUNDED_SYM)}, { "UNCOMMITTED", SYM(UNCOMMITTED_SYM)}, { "UNDEFINED", SYM(UNDEFINED_SYM)}, @@ -752,7 +751,6 @@ SYMBOL sql_functions[] = { { "ADDDATE", SYM(ADDDATE_SYM)}, - { "ADD_MONTHS", SYM(ADD_MONTHS_SYM)}, { "BIT_AND", SYM(BIT_AND)}, { "BIT_OR", SYM(BIT_OR)}, { "BIT_XOR", SYM(BIT_XOR)}, @@ -763,7 +761,6 @@ { "CURTIME", SYM(CURTIME)}, { "DATE_ADD", SYM(DATE_ADD_INTERVAL)}, { "DATE_SUB", SYM(DATE_SUB_INTERVAL)}, - { "DATE_FORMAT", SYM(DATE_FORMAT_SYM)}, { "DENSE_RANK", SYM(DENSE_RANK_SYM)}, { "EXTRACT", SYM(EXTRACT_SYM)}, { "FIRST_VALUE", SYM(FIRST_VALUE_SYM)}, diff -Nru mariadb-10.11.6/sql/lex_charset.h mariadb-10.11.9/sql/lex_charset.h --- mariadb-10.11.6/sql/lex_charset.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/lex_charset.h 2024-08-03 07:29:59.000000000 +0000 @@ -288,6 +288,12 @@ DBUG_ASSERT(0); return m_ci->coll_name; } + static Lex_extended_collation_st collate_default() + { + Lex_extended_collation_st res; + res.set_collate_default(); + return res; + } void set_collate_default() { m_ci= &my_collation_contextually_typed_default; diff -Nru mariadb-10.11.6/sql/lex_ident.h mariadb-10.11.9/sql/lex_ident.h --- mariadb-10.11.6/sql/lex_ident.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/lex_ident.h 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,85 @@ +#ifndef LEX_IDENT_INCLUDED +#define LEX_IDENT_INCLUDED +/* + Copyright (c) 2023, MariaDB + + 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; version 2 of + the License. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA +*/ + + +extern MYSQL_PLUGIN_IMPORT CHARSET_INFO *table_alias_charset; + + +/* + Identifiers for the database objects stored on disk, + e.g. databases, tables, triggers. +*/ +class Lex_ident_fs: public LEX_CSTRING +{ +public: + static CHARSET_INFO *charset_info() + { + return table_alias_charset; + } +public: + Lex_ident_fs() + :LEX_CSTRING({0,0}) + { } + Lex_ident_fs(const char *str, size_t length) + :LEX_CSTRING({str, length}) + { } + explicit Lex_ident_fs(const LEX_CSTRING &str) + :LEX_CSTRING(str) + { } +#if MYSQL_VERSION_ID<=110501 +private: + static bool is_valid_ident(const LEX_CSTRING &str) + { + // NULL identifier, or 0-terminated identifier + return (str.str == NULL && str.length == 0) || str.str[str.length] == 0; + } +public: + bool streq(const LEX_CSTRING &rhs) const + { + DBUG_ASSERT(is_valid_ident(*this)); + DBUG_ASSERT(is_valid_ident(rhs)); + return length == rhs.length && + my_strcasecmp(charset_info(), str, rhs.str) == 0; + } +#else +/* + Starting from 11.5.1 streq() is inherited from the base. + The above implementations of streq() and is_valid_ident() should be removed. +*/ +#error Remove streq() above. +#endif +}; + + +class Lex_ident_db: public Lex_ident_fs +{ +public: + using Lex_ident_fs::Lex_ident_fs; +}; + + +class Lex_ident_table: public Lex_ident_fs +{ +public: + using Lex_ident_fs::Lex_ident_fs; +}; + + +#endif // LEX_IDENT_INCLUDED diff -Nru mariadb-10.11.6/sql/log.cc mariadb-10.11.9/sql/log.cc --- mariadb-10.11.6/sql/log.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log.cc 2024-08-03 07:29:59.000000000 +0000 @@ -40,6 +40,7 @@ #include "sql_audit.h" #include "mysqld.h" #include "ddl_log.h" +#include "repl_failsafe.h" #include #include // For test_if_number @@ -215,14 +216,14 @@ m_message[0]= '\0'; } - virtual ~Silence_log_table_errors() = default; + ~Silence_log_table_errors() override = default; - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sql_state, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; const char *message() const { return m_message; } }; @@ -1457,7 +1458,7 @@ query_utime= (current_utime - thd->start_utime); lock_utime= (thd->utime_after_lock - thd->start_utime); my_hrtime_t current_time= { hrtime_from_time(thd->start_time) + - thd->start_time_sec_part + query_utime }; + thd->start_time_sec_part }; if (!query || thd->get_command() == COM_STMT_PREPARE) { @@ -2539,6 +2540,23 @@ } +/* + Check if there was an error while writing the statement cache. + If the cache content is corrupt due to an error, we should write an incident + event to the binlog rather than write corrupt data to it. +*/ +bool +MYSQL_BIN_LOG::check_cache_error(THD *thd, binlog_cache_data *cache_data) +{ + if (!cache_data) + return false; + if (check_write_error(thd)) + return true; + if (!cache_data->empty() && cache_data->cache_log.error) + return true; + return false; +} + /** @note How do we handle this (unlikely but legal) case: @@ -3385,10 +3403,12 @@ if (my_b_printf(&log_file, "# Pages_accessed: %lu Pages_read: %lu " + "Pages_prefetched: %lu " "Pages_updated: %lu Old_rows_read: %lu\n" "# Pages_read_time: %s Engine_time: %s\n", (ulong) stats->pages_accessed, (ulong) stats->pages_read_count, + (ulong) stats->pages_prefetched, (ulong) stats->pages_updated, (ulong) stats->undo_records_read, query_time_buff, lock_time_buff)) @@ -3460,7 +3480,7 @@ } if (thd->db.str && strcmp(thd->db.str, db)) { // Database changed - if (my_b_printf(&log_file,"use %s;\n",thd->db.str)) + if (my_b_printf(&log_file,"use %`s;\n",thd->db.str)) goto err; strmov(db,thd->db.str); } @@ -3673,16 +3693,6 @@ } -/* Init binlog-specific vars */ -void MYSQL_BIN_LOG::init(ulong max_size_arg) -{ - DBUG_ENTER("MYSQL_BIN_LOG::init"); - max_size= max_size_arg; - DBUG_PRINT("info",("max_size: %lu", max_size)); - DBUG_VOID_RETURN; -} - - void MYSQL_BIN_LOG::init_pthread_objects() { MYSQL_LOG::init_pthread_objects(); @@ -3796,7 +3806,6 @@ bool null_created_arg, bool need_mutex) { - File file= -1; xid_count_per_binlog *new_xid_list_entry= NULL, *b; DBUG_ENTER("MYSQL_BIN_LOG::open"); @@ -3875,7 +3884,7 @@ DBUG_RETURN(1); /* all warnings issued */ } - init(max_size_arg); + max_size= max_size_arg; open_count++; @@ -4192,8 +4201,6 @@ sql_print_error(fatal_log_error, (name) ? name : log_name, tmp_errno); if (new_xid_list_entry) delete new_xid_list_entry; - if (file >= 0) - mysql_file_close(file, MYF(0)); close(LOG_CLOSE_INDEX); DBUG_RETURN(1); } @@ -5389,6 +5396,15 @@ return true; } +#ifdef WITH_WSREP +static bool is_gtid_written_on_trans_start(const THD *thd) +{ + return wsrep_on(thd) && + (thd->variables.gtid_seq_no || thd->variables.wsrep_gtid_seq_no) && + (thd->wsrep_cs().mode() == wsrep::client_state::m_local); +} +#endif + /** Create a new log file name. @@ -5465,8 +5481,6 @@ /** Start writing to a new log file or reopen the old file. - @param need_lock Set to 1 if caller has not locked LOCK_log - @retval nonzero - error @@ -5504,10 +5518,8 @@ */ if (unlikely((error= generate_new_name(new_name, name, 0)))) { -#ifdef ENABLE_AND_FIX_HANG - close_on_error= TRUE; -#endif - goto end2; + mysql_mutex_unlock(&LOCK_index); + DBUG_RETURN(error); } new_name_ptr=new_name; @@ -5615,7 +5627,6 @@ last_used_log_number--; } -end2: if (delay_close) { clear_inuse_flag_when_closing(old_file); @@ -6061,10 +6072,7 @@ Ha_trx_info *ha_info; ha_info= this->ha_data[binlog_hton->slot].ha_info + (mstmt_mode ? 1 : 0); - if (!ha_info->is_started() && - (this->variables.gtid_seq_no || this->variables.wsrep_gtid_seq_no) && - wsrep_on(this) && - (this->wsrep_cs().mode() == wsrep::client_state::m_local)) + if (!ha_info->is_started() && is_gtid_written_on_trans_start(this)) { uchar *buf= 0; size_t len= 0; @@ -6269,12 +6277,13 @@ int error= 1; bool is_transactional= table->file->row_logging_has_trans; DBUG_ENTER("THD::binlog_write_table_map"); - DBUG_PRINT("enter", ("table: %p (%s: #%lu)", + DBUG_PRINT("enter", ("table: %p (%s: #%llu)", table, table->s->table_name.str, table->s->table_map_id)); /* Pre-conditions */ - DBUG_ASSERT(table->s->table_map_id != ULONG_MAX); + DBUG_ASSERT((table->s->table_map_id & MAX_TABLE_MAP_ID) != UINT32_MAX && + (table->s->table_map_id & MAX_TABLE_MAP_ID) != 0); /* Ensure that all events in a GTID group are in the same cache */ if (variables.option_bits & OPTION_GTID_BEGIN) @@ -6315,7 +6324,7 @@ engines, data is written to table but writing to binary log failed. In these scenarios rollback is not possible. Hence report an incident. */ - if (mysql_bin_log.check_write_error(this) && cache_data && + if (mysql_bin_log.check_cache_error(this, cache_data) && lex->stmt_accessed_table(LEX::STMT_WRITES_NON_TRANS_TABLE) && table->current_lock == F_WRLCK) cache_data->set_incident(); @@ -6447,20 +6456,37 @@ /* Write pending event to the cache. */ +#ifndef DBUG_OFF + bool clear_dbug= false; +#endif DBUG_EXECUTE_IF("simulate_disk_full_at_flush_pending", - {DBUG_SET("+d,simulate_file_write_error");}); + { + if (my_b_tell(&cache_data->cache_log) > 10000) + { + DBUG_SET("+d,simulate_file_write_error"); + clear_dbug= true; + } + }); if (writer.write(pending)) { set_write_error(thd, is_transactional); - if (check_write_error(thd) && cache_data && + if (check_cache_error(thd, cache_data) && stmt_has_updated_non_trans_table(thd)) cache_data->set_incident(); delete pending; cache_data->set_pending(NULL); DBUG_EXECUTE_IF("simulate_disk_full_at_flush_pending", - {DBUG_SET("-d,simulate_file_write_error");}); + { + if (clear_dbug) + DBUG_SET("-d,simulate_file_write_error"); + }); DBUG_RETURN(1); } + DBUG_EXECUTE_IF("simulate_disk_full_at_flush_pending", + { + if (clear_dbug) + DBUG_SET("-d,simulate_file_write_error"); + }); delete pending; } @@ -6950,18 +6976,12 @@ BINLOG_USER_VAR_EVENT *user_var_event; get_dynamic(&thd->user_var_events,(uchar*) &user_var_event, i); - /* setting flags for user var log event */ - uchar flags= User_var_log_event::UNDEF_F; - if (user_var_event->unsigned_flag) - flags|= User_var_log_event::UNSIGNED_F; - User_var_log_event e(thd, user_var_event->user_var_event->name.str, user_var_event->user_var_event->name.length, user_var_event->value, user_var_event->length, - user_var_event->type, - user_var_event->charset_number, - flags, + user_var_event->th->user_var_log_event_data_type( + user_var_event->charset_number), using_trans, direct); if (write_event(&e, cache_data, file)) @@ -7000,8 +7020,8 @@ mysql_mutex_assert_not_owner(&LOCK_after_binlog_sync); mysql_mutex_assert_not_owner(&LOCK_commit_ordered); #ifdef HAVE_REPLICATION - if (repl_semisync_master.report_binlog_update(thd, log_file_name, - file->pos_in_file)) + if (repl_semisync_master.report_binlog_update( + thd, thd, log_file_name, file->pos_in_file)) { sql_print_error("Failed to run 'after_flush' hooks"); error= 1; @@ -7057,7 +7077,7 @@ if (unlikely(error)) { set_write_error(thd, is_trans_cache); - if (check_write_error(thd) && cache_data && + if (check_cache_error(thd, cache_data) && stmt_has_updated_non_trans_table(thd)) cache_data->set_incident(); } @@ -8159,9 +8179,9 @@ if (entry->cache_mngr->using_xa) { - DEBUG_SYNC(entry->thd, "commit_before_prepare_ordered"); + DEBUG_SYNC(orig_entry->thd, "commit_before_prepare_ordered"); run_prepare_ordered(entry->thd, entry->all); - DEBUG_SYNC(entry->thd, "commit_after_prepare_ordered"); + DEBUG_SYNC(orig_entry->thd, "commit_after_prepare_ordered"); } if (cur) @@ -8595,9 +8615,19 @@ for (current= queue; current != NULL; current= current->next) { #ifdef HAVE_REPLICATION + /* + The thread which will await the ACK from the replica can change + depending on the wait-point. If AFTER_COMMIT, then the user thread + will perform the wait. If AFTER_SYNC, the binlog group commit leader + will perform the wait on behalf of the user thread. + */ + THD *waiter_thd= (repl_semisync_master.wait_point() == + SEMI_SYNC_MASTER_WAIT_POINT_AFTER_STORAGE_COMMIT) + ? current->thd + : leader->thd; if (likely(!current->error) && unlikely(repl_semisync_master. - report_binlog_update(current->thd, + report_binlog_update(current->thd, waiter_thd, current->cache_mngr-> last_commit_pos_file, current->cache_mngr-> @@ -8751,13 +8781,10 @@ DEBUG_SYNC(leader->thd, "commit_loop_entry_commit_ordered"); ++num_commits; + set_current_thd(current->thd); if (current->cache_mngr->using_xa && likely(!current->error) && !DBUG_IF("skip_commit_ordered")) - { - mysql_mutex_lock(¤t->thd->LOCK_thd_data); run_commit_ordered(current->thd, current->all); - mysql_mutex_unlock(¤t->thd->LOCK_thd_data); - } current->thd->wakeup_subsequent_commits(current->error); /* @@ -8774,6 +8801,7 @@ } current= next; } + set_current_thd(leader->thd); DEBUG_SYNC(leader->thd, "commit_after_group_run_commit_ordered"); mysql_mutex_unlock(&LOCK_commit_ordered); DEBUG_SYNC(leader->thd, "commit_after_group_release_commit_ordered"); @@ -8794,6 +8822,20 @@ DBUG_ENTER("MYSQL_BIN_LOG::write_transaction_or_stmt"); + /* + An error in the trx_cache will truncate the cache to the last good + statement, it won't leave a lingering error. Assert that this holds. + */ + DBUG_ASSERT(!(entry->using_trx_cache && !mngr->trx_cache.empty() && + mngr->get_binlog_cache_log(TRUE)->error)); + /* + An error in the stmt_cache would be caught on the higher level and result + in an incident event being written over a (possibly corrupt) cache content. + Assert that this holds. + */ + DBUG_ASSERT(!(entry->using_stmt_cache && !mngr->stmt_cache.empty() && + mngr->get_binlog_cache_log(FALSE)->error)); + if (write_gtid_event(entry->thd, is_prepared_xa(entry->thd), entry->using_trx_cache, commit_id, has_xid, entry->ro_1pc)) @@ -11136,7 +11178,7 @@ prev_event_pos(0), last_gtid_standalone(false), last_gtid_valid(false), last_gtid_no2pc(false), last_gtid_engines(0), - do_truncate(rpl_semi_sync_slave_enabled), + do_truncate(rpl_status == RPL_IDLE_SLAVE), truncate_validated(false), truncate_reset_done(false), truncate_set_in_1st(false), id_binlog(MAX_binlog_id), checksum_alg(BINLOG_CHECKSUM_ALG_UNDEF), gtid_maybe_to_truncate(NULL) @@ -11945,14 +11987,21 @@ void TC_LOG_BINLOG::set_status_variables(THD *thd) { - binlog_cache_mngr *cache_mngr; + bool have_snapshot= false; if (thd && opt_bin_log) - cache_mngr= (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton); - else - cache_mngr= 0; + { + mysql_mutex_lock(&thd->LOCK_thd_data); + auto cache_mngr= (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton); + have_snapshot= cache_mngr && cache_mngr->last_commit_pos_file[0]; + if (have_snapshot) + { + set_binlog_snapshot_file(cache_mngr->last_commit_pos_file); + binlog_snapshot_position= cache_mngr->last_commit_pos_offset; + } + mysql_mutex_unlock(&thd->LOCK_thd_data); + } - bool have_snapshot= (cache_mngr && cache_mngr->last_commit_pos_file[0] != 0); mysql_mutex_lock(&LOCK_commit_ordered); binlog_status_var_num_commits= this->num_commits; binlog_status_var_num_group_commits= this->num_group_commits; @@ -11967,12 +12016,6 @@ binlog_status_group_commit_trigger_timeout= this->group_commit_trigger_timeout; binlog_status_group_commit_trigger_lock_wait= this->group_commit_trigger_lock_wait; mysql_mutex_unlock(&LOCK_prepare_ordered); - - if (have_snapshot) - { - set_binlog_snapshot_file(cache_mngr->last_commit_pos_file); - binlog_snapshot_position= cache_mngr->last_commit_pos_offset; - } } @@ -12083,6 +12126,15 @@ return NULL; } +bool wsrep_is_binlog_cache_empty(THD *thd) +{ + binlog_cache_mngr *cache_mngr= + (binlog_cache_mngr *) thd_get_ha_data(thd, binlog_hton); + if (cache_mngr) + return cache_mngr->trx_cache.empty() && cache_mngr->stmt_cache.empty(); + return true; +} + void wsrep_thd_binlog_trx_reset(THD * thd) { DBUG_ENTER("wsrep_thd_binlog_trx_reset"); @@ -12143,12 +12195,9 @@ /* Set an implicit savepoint in order to be able to truncate a trx-cache. */ - if (cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF) - { - my_off_t pos= 0; - binlog_trans_log_savepos(thd, &pos); - cache_mngr->trx_cache.set_prev_position(pos); - } + my_off_t pos= 0; + binlog_trans_log_savepos(thd, &pos); + cache_mngr->trx_cache.set_prev_position(pos); /* Set callbacks in order to be able to call commmit or rollback. diff -Nru mariadb-10.11.6/sql/log.h mariadb-10.11.9/sql/log.h --- mariadb-10.11.6/sql/log.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log.h 2024-08-03 07:29:59.000000000 +0000 @@ -101,25 +101,25 @@ { public: TC_LOG_DUMMY() = default; - int open(const char *opt_name) { return 0; } - void close() { } + int open(const char *opt_name) override { return 0; } + void close() override { } /* TC_LOG_DUMMY is only used when there are <= 1 XA-capable engines, and we only use internal XA during commit when >= 2 XA-capable engines participate. */ int log_and_order(THD *thd, my_xid xid, bool all, - bool need_prepare_ordered, bool need_commit_ordered) + bool need_prepare_ordered, bool need_commit_ordered) override { DBUG_ASSERT(0); return 1; } - int unlog(ulong cookie, my_xid xid) { return 0; } - int unlog_xa_prepare(THD *thd, bool all) + int unlog(ulong cookie, my_xid xid) override { return 0; } + int unlog_xa_prepare(THD *thd, bool all) override { return 0; } - void commit_checkpoint_notify(void *cookie) { DBUG_ASSERT(0); }; + void commit_checkpoint_notify(void *cookie) override { DBUG_ASSERT(0); }; }; #define TC_LOG_PAGE_SIZE 8192 @@ -197,16 +197,16 @@ public: TC_LOG_MMAP(): inited(0), pending_checkpoint(0) {} - int open(const char *opt_name); - void close(); + int open(const char *opt_name) override; + void close() override; int log_and_order(THD *thd, my_xid xid, bool all, - bool need_prepare_ordered, bool need_commit_ordered); - int unlog(ulong cookie, my_xid xid); - int unlog_xa_prepare(THD *thd, bool all) + bool need_prepare_ordered, bool need_commit_ordered) override; + int unlog(ulong cookie, my_xid xid) override; + int unlog_xa_prepare(THD *thd, bool all) override { return 0; } - void commit_checkpoint_notify(void *cookie); + void commit_checkpoint_notify(void *cookie) override; int recover(); private: @@ -426,6 +426,7 @@ class MYSQL_BIN_LOG: public TC_LOG, private MYSQL_LOG { +#ifdef HAVE_PSI_INTERFACE /** The instrumentation key to use for @ LOCK_index. */ PSI_mutex_key m_key_LOCK_index; /** The instrumentation key to use for @ COND_relay_log_updated */ @@ -440,6 +441,16 @@ PSI_cond_key m_key_COND_queue_busy; /** The instrumentation key to use for LOCK_binlog_end_pos. */ PSI_mutex_key m_key_LOCK_binlog_end_pos; +#else + static constexpr PSI_mutex_key m_key_LOCK_index= 0; + static constexpr PSI_cond_key m_key_relay_log_update= 0; + static constexpr PSI_cond_key m_key_bin_log_update= 0; + static constexpr PSI_file_key m_key_file_log= 0, m_key_file_log_cache= 0; + static constexpr PSI_file_key m_key_file_log_index= 0; + static constexpr PSI_file_key m_key_file_log_index_cache= 0; + static constexpr PSI_cond_key m_key_COND_queue_busy= 0; + static constexpr PSI_mutex_key m_key_LOCK_binlog_end_pos= 0; +#endif struct group_commit_entry { @@ -710,15 +721,15 @@ } #endif - int open(const char *opt_name); - void close(); - virtual int generate_new_name(char *new_name, const char *log_name, - ulong next_log_number); + int open(const char *opt_name) override; + void close() override; + int generate_new_name(char *new_name, const char *log_name, + ulong next_log_number) override; int log_and_order(THD *thd, my_xid xid, bool all, - bool need_prepare_ordered, bool need_commit_ordered); - int unlog(ulong cookie, my_xid xid); - int unlog_xa_prepare(THD *thd, bool all); - void commit_checkpoint_notify(void *cookie); + bool need_prepare_ordered, bool need_commit_ordered) override; + int unlog(ulong cookie, my_xid xid) override; + int unlog_xa_prepare(THD *thd, bool all) override; + void commit_checkpoint_notify(void *cookie) override; int recover(LOG_INFO *linfo, const char *last_log_name, IO_CACHE *first_log, Format_description_log_event *fdle, bool do_xa); int do_binlog_recovery(const char *opt_name, bool do_xa_recovery); @@ -824,6 +835,7 @@ int write_cache(THD *thd, IO_CACHE *cache); void set_write_error(THD *thd, bool is_transactional); bool check_write_error(THD *thd); + bool check_cache_error(THD *thd, binlog_cache_data *cache_data); void start_union_events(THD *thd, query_id_t query_id_param); void stop_union_events(THD *thd); @@ -930,7 +942,7 @@ mysql_mutex_assert_not_owner(&LOCK_binlog_end_pos); lock_binlog_end_pos(); binlog_end_pos= pos; - strcpy(binlog_end_pos_file, file_name); + safe_strcpy(binlog_end_pos_file, sizeof(binlog_end_pos_file), file_name); signal_bin_log_update(); unlock_binlog_end_pos(); } @@ -943,7 +955,7 @@ { mysql_mutex_assert_not_owner(&LOCK_log); mysql_mutex_assert_owner(&LOCK_binlog_end_pos); - strcpy(file_name_buf, binlog_end_pos_file); + safe_strcpy(file_name_buf, FN_REFLEN, binlog_end_pos_file); return binlog_end_pos; } void lock_binlog_end_pos() { mysql_mutex_lock(&LOCK_binlog_end_pos); } @@ -1011,19 +1023,19 @@ public: Log_to_csv_event_handler(); ~Log_to_csv_event_handler(); - virtual bool init(); - virtual void cleanup(); + bool init() override; + void cleanup() override; - virtual bool log_slow(THD *thd, my_hrtime_t current_time, + bool log_slow(THD *thd, my_hrtime_t current_time, const char *user_host, size_t user_host_len, ulonglong query_utime, ulonglong lock_utime, bool is_command, - const char *sql_text, size_t sql_text_len); - virtual bool log_error(enum loglevel level, const char *format, - va_list args); - virtual bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id, + const char *sql_text, size_t sql_text_len) override; + bool log_error(enum loglevel level, const char *format, + va_list args) override; + bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id, const char *command_type, size_t command_type_len, const char *sql_text, size_t sql_text_len, - CHARSET_INFO *client_cs); + CHARSET_INFO *client_cs) override; int activate_log(THD *thd, uint log_type); }; @@ -1041,19 +1053,19 @@ public: Log_to_file_event_handler(): is_initialized(FALSE) {} - virtual bool init(); - virtual void cleanup(); + bool init() override; + void cleanup() override; - virtual bool log_slow(THD *thd, my_hrtime_t current_time, + bool log_slow(THD *thd, my_hrtime_t current_time, const char *user_host, size_t user_host_len, ulonglong query_utime, ulonglong lock_utime, bool is_command, - const char *sql_text, size_t sql_text_len); - virtual bool log_error(enum loglevel level, const char *format, - va_list args); - virtual bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id, + const char *sql_text, size_t sql_text_len) override; + bool log_error(enum loglevel level, const char *format, + va_list args) override; + bool log_general(THD *thd, my_hrtime_t event_time, const char *user_host, size_t user_host_len, my_thread_id thread_id, const char *command_type, size_t command_type_len, const char *sql_text, size_t sql_text_len, - CHARSET_INFO *client_cs); + CHARSET_INFO *client_cs) override; void flush(); void init_pthread_objects(); MYSQL_QUERY_LOG *get_mysql_slow_log() { return &mysql_slow_log; } @@ -1253,6 +1265,7 @@ #ifdef WITH_WSREP IO_CACHE* wsrep_get_cache(THD *, bool); +bool wsrep_is_binlog_cache_empty(THD *); void wsrep_thd_binlog_trx_reset(THD * thd); void wsrep_thd_binlog_stmt_rollback(THD * thd); #endif /* WITH_WSREP */ diff -Nru mariadb-10.11.6/sql/log_event.cc mariadb-10.11.9/sql/log_event.cc --- mariadb-10.11.6/sql/log_event.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log_event.cc 2024-08-03 07:29:59.000000000 +0000 @@ -915,7 +915,8 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, const Format_description_log_event *fdle, - my_bool crc_check) + my_bool crc_check, + my_bool print_errors) { DBUG_ENTER("Log_event::read_log_event(IO_CACHE*,Format_description_log_event*...)"); DBUG_ASSERT(fdle != 0); @@ -954,8 +955,12 @@ goto err; } + /* + print_errors is false to prevent redundant error messages cluttering up the + log, as it will be printed below (if _our_ print_errors is true) + */ if ((res= read_log_event((uchar*) event.ptr(), event.length(), - &error, fdle, crc_check))) + &error, fdle, crc_check, false))) res->register_temp_buf((uchar*) event.release(), true); err: @@ -966,13 +971,7 @@ if (force_opt) DBUG_RETURN(new Unknown_log_event()); #endif - if (event.length() >= OLD_HEADER_LEN) - sql_print_error("Error in Log_event::read_log_event(): '%s'," - " data_len: %lu, event_type: %u", error, - (ulong) uint4korr(&event[EVENT_LEN_OFFSET]), - (uint) (uchar)event[EVENT_TYPE_OFFSET]); - else - sql_print_error("Error in Log_event::read_log_event(): '%s'", error); + /* The SQL slave thread will check if file->error<0 to know if there was an I/O error. Even if there is no "low-level" I/O errors @@ -982,6 +981,19 @@ only corrupt the slave's databases. So stop. */ file->error= -1; + +#ifndef MYSQL_CLIENT + if (!print_errors) + DBUG_RETURN(res); +#endif + + if (event.length() >= OLD_HEADER_LEN) + sql_print_error("Error in Log_event::read_log_event(): '%s'," + " data_len: %lu, event_type: %u", error, + (ulong) uint4korr(&event[EVENT_LEN_OFFSET]), + (uint) (uchar)event[EVENT_TYPE_OFFSET]); + else + sql_print_error("Error in Log_event::read_log_event(): '%s'", error); } DBUG_RETURN(res); } @@ -995,7 +1007,8 @@ Log_event* Log_event::read_log_event(const uchar *buf, uint event_len, const char **error, const Format_description_log_event *fdle, - my_bool crc_check) + my_bool crc_check, + my_bool print_errors) { Log_event* ev; enum enum_binlog_checksum_alg alg; @@ -1063,7 +1076,8 @@ DBUG_RETURN(NULL); #else *error= ER_THD_OR_DEFAULT(current_thd, ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE); - sql_print_error("%s", *error); + if (print_errors) + sql_print_error("%s", *error); DBUG_RETURN(NULL); #endif } @@ -2631,6 +2645,11 @@ } if (flags2 & (FL_PREPARED_XA | FL_COMPLETED_XA)) { + if (event_len < static_cast(buf - buf_0) + 6) + { + seq_no= 0; + return; + } xid.formatID= uint4korr(buf); buf+= 4; @@ -2639,6 +2658,11 @@ buf+= 2; long data_length= xid.bqual_length + xid.gtrid_length; + if (event_len < static_cast(buf - buf_0) + data_length) + { + seq_no= 0; + return; + } memcpy(xid.data, buf, data_length); buf+= data_length; } @@ -2653,14 +2677,22 @@ */ if (flags_extra & FL_EXTRA_MULTI_ENGINE_E1) { - DBUG_ASSERT(static_cast(buf - buf_0) < event_len); - + if (event_len < static_cast(buf - buf_0) + 1) + { + seq_no= 0; + return; + } extra_engines= *buf++; DBUG_ASSERT(extra_engines > 0); } if (flags_extra & (FL_COMMIT_ALTER_E1 | FL_ROLLBACK_ALTER_E1)) { + if (event_len < static_cast(buf - buf_0) + 8) + { + seq_no= 0; + return; + } sa_seq_no= uint8korr(buf); buf+= 8; } @@ -2928,6 +2960,41 @@ User_var_log_event methods **************************************************************************/ +bool Log_event_data_type::unpack_optional_attributes(const char *pos, + const char *end) + +{ + for ( ; pos < end; ) + { + switch (*pos) { + case CHUNK_SIGNED: + m_is_unsigned= false; + pos++; + continue; + case CHUNK_UNSIGNED: + m_is_unsigned= true; + pos++; + continue; + case CHUNK_DATA_TYPE_NAME: + { + pos++; + if (pos >= end) + return true; + uint length= (uchar) *pos++; + if (pos + length > end) + return true; + m_data_type_name= {pos, length}; + pos+= length; + continue; + } + default: + break; // Unknown chunk + } + } + return false; +} + + User_var_log_event:: User_var_log_event(const uchar *buf, uint event_len, const Format_description_log_event* description_event) @@ -2937,7 +3004,8 @@ #endif { bool error= false; - const uchar *buf_start= buf, *buf_end= buf + event_len; + const uchar *const buf_start= buf; + const char *buf_end= reinterpret_cast(buf) + event_len; /* The Post-Header is empty. The Variable Data part begins immediately. */ buf+= description_event->common_header_len + @@ -2965,11 +3033,8 @@ buf+= UV_NAME_LEN_SIZE + name_len; is_null= (bool) *buf; - flags= User_var_log_event::UNDEF_F; // defaults to UNDEF_F if (is_null) { - type= STRING_RESULT; - charset_number= my_charset_bin.number; val_len= 0; val= 0; } @@ -2984,8 +3049,8 @@ goto err; } - type= (Item_result) buf[UV_VAL_IS_NULL]; - charset_number= uint4korr(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE); + m_type= (Item_result) buf[UV_VAL_IS_NULL]; + m_charset_number= uint4korr(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE); val_len= uint4korr(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE + UV_CHARSET_NUMBER_SIZE); @@ -2998,20 +3063,14 @@ the flags value. Old events will not have this extra byte, thence, - we keep the flags set to UNDEF_F. + we keep m_is_unsigned==false. */ - size_t bytes_read= (val + val_len) - (char*) buf_start; - if (bytes_read > event_len) + const char *pos= val + val_len; + if (pos > buf_end || unpack_optional_attributes(pos, buf_end)) { error= true; goto err; } - if ((data_written - bytes_read) > 0) - { - flags= (uint) *(buf + UV_VAL_IS_NULL + UV_VAL_TYPE_SIZE + - UV_CHARSET_NUMBER_SIZE + UV_VAL_LEN_SIZE + - val_len); - } } err: @@ -3305,7 +3364,7 @@ } else { - m_table_id= (ulong) uint6korr(post_start); + m_table_id= (ulonglong) uint6korr(post_start); post_start+= RW_FLAGS_OFFSET; } @@ -3381,21 +3440,16 @@ /* if my_bitmap_init fails, caught in is_valid() */ if (likely(!my_bitmap_init(&m_cols, - m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, - m_width))) + m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, + m_width))) { DBUG_PRINT("debug", ("Reading from %p", ptr_after_width)); - memcpy(m_cols.bitmap, ptr_after_width, (m_width + 7) / 8); - create_last_word_mask(&m_cols); + bitmap_import(&m_cols, ptr_after_width); + DBUG_DUMP("m_cols", (uchar*) ptr_after_width, no_bytes_in_export_map(&m_cols)); ptr_after_width+= (m_width + 7) / 8; - DBUG_DUMP("m_cols", (uchar*) m_cols.bitmap, no_bytes_in_map(&m_cols)); } else - { - // Needed because my_bitmap_init() does not set it to null on failure - m_cols.bitmap= NULL; DBUG_VOID_RETURN; - } m_cols_ai.bitmap= m_cols.bitmap; /* See explanation in is_valid() */ @@ -3405,22 +3459,17 @@ /* if my_bitmap_init fails, caught in is_valid() */ if (likely(!my_bitmap_init(&m_cols_ai, - m_width <= sizeof(m_bitbuf_ai)*8 ? m_bitbuf_ai : NULL, - m_width))) + m_width <= sizeof(m_bitbuf_ai)*8 ? m_bitbuf_ai : + NULL, + m_width))) { DBUG_PRINT("debug", ("Reading from %p", ptr_after_width)); - memcpy(m_cols_ai.bitmap, ptr_after_width, (m_width + 7) / 8); - create_last_word_mask(&m_cols_ai); + bitmap_import(&m_cols_ai, ptr_after_width); + DBUG_DUMP("m_cols_ai", ptr_after_width, no_bytes_in_export_map(&m_cols_ai)); ptr_after_width+= (m_width + 7) / 8; - DBUG_DUMP("m_cols_ai", (uchar*) m_cols_ai.bitmap, - no_bytes_in_map(&m_cols_ai)); } else - { - // Needed because my_bitmap_init() does not set it to null on failure - m_cols_ai.bitmap= 0; DBUG_VOID_RETURN; - } } const uchar* const ptr_rows_data= (const uchar*) ptr_after_width; @@ -3483,8 +3532,6 @@ Rows_log_event::~Rows_log_event() { - if (m_cols.bitmap == m_bitbuf) // no my_malloc happened - m_cols.bitmap= 0; // so no my_free in my_bitmap_free my_bitmap_free(&m_cols); // To pair with my_bitmap_init(). my_free(m_rows_buf); my_free(m_extra_row_data); @@ -3498,9 +3545,10 @@ uchar *end= net_store_length(buf, m_width); DBUG_EXECUTE_IF("old_row_based_repl_4_byte_map_id_master", - return (int)(6 + no_bytes_in_map(&m_cols) + (end - buf) + - (general_type_code == UPDATE_ROWS_EVENT ? no_bytes_in_map(&m_cols_ai) : 0) + - m_rows_cur - m_rows_buf);); + return (int) (6 + no_bytes_in_export_map(&m_cols) + (end - buf) + + (general_type_code == UPDATE_ROWS_EVENT ? + no_bytes_in_export_map(&m_cols_ai) : 0) + + m_rows_cur - m_rows_buf);); int data_size= 0; Log_event_type type= get_type_code(); bool is_v2_event= LOG_EVENT_IS_ROW_V2(type); @@ -3515,11 +3563,11 @@ { data_size= ROWS_HEADER_LEN_V1; } - data_size+= no_bytes_in_map(&m_cols); + data_size+= no_bytes_in_export_map(&m_cols); data_size+= (uint) (end - buf); if (general_type_code == UPDATE_ROWS_EVENT) - data_size+= no_bytes_in_map(&m_cols_ai); + data_size+= no_bytes_in_export_map(&m_cols_ai); data_size+= (uint) (m_rows_cur - m_rows_buf); return data_size; @@ -3660,11 +3708,12 @@ else { DBUG_ASSERT(post_header_len == TABLE_MAP_HEADER_LEN); - m_table_id= (ulong) uint6korr(post_start); + m_table_id= (ulonglong) uint6korr(post_start); post_start+= TM_FLAGS_OFFSET; } - DBUG_ASSERT(m_table_id != ~0ULL); + DBUG_ASSERT((m_table_id & MAX_TABLE_MAP_ID) != UINT32_MAX && + (m_table_id & MAX_TABLE_MAP_ID) != 0); m_flags= uint2korr(post_start); @@ -4049,12 +4098,7 @@ Update_rows_log_event::~Update_rows_log_event() { - if (m_cols_ai.bitmap) - { - if (m_cols_ai.bitmap == m_bitbuf_ai) // no my_malloc happened - m_cols_ai.bitmap= 0; // so no my_free in my_bitmap_free - my_bitmap_free(&m_cols_ai); // To pair with my_bitmap_init(). - } + my_bitmap_free(&m_cols_ai); // To pair with my_bitmap_init(). } diff -Nru mariadb-10.11.6/sql/log_event.h mariadb-10.11.9/sql/log_event.h --- mariadb-10.11.6/sql/log_event.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log_event.h 2024-08-03 07:29:59.000000000 +0000 @@ -57,6 +57,8 @@ #include "rpl_gtid.h" +#include "log_event_data_type.h" + /* Forward declarations */ #ifndef MYSQL_CLIENT class String; @@ -156,6 +158,12 @@ #define NUM_LOAD_DELIM_STRS 5 +/* + The following is the max table_map_id. This is limited by that we + are using 6 bytes for it in replication +*/ +#define MAX_TABLE_MAP_ID ((1ULL << (6*8)) -1) + /***************************************************************************** MySQL Binary Log @@ -857,6 +865,7 @@ uint lc_time_names_number; uint charset_database_number; uint verbose; + uchar gtid_ev_flags2; uint32 flags2; uint32 server_id; uint32 domain_id; @@ -976,8 +985,10 @@ { m_is_event_group_filtering_enabled= TRUE; } + + my_bool is_xa_trans(); } PRINT_EVENT_INFO; -#endif +#endif // MYSQL_CLIENT /** This class encapsulates writing of Log_event objects to IO_CACHE. @@ -1379,7 +1390,8 @@ static Log_event* read_log_event(IO_CACHE* file, const Format_description_log_event *description_event, - my_bool crc_check); + my_bool crc_check, + my_bool print_errors= 1); /** Reads an event from a binlog or relay log. Used by the dump thread @@ -1523,7 +1535,8 @@ static Log_event* read_log_event(const uchar *buf, uint event_len, const char **error, const Format_description_log_event - *description_event, my_bool crc_check); + *description_event, my_bool crc_check, + my_bool print_errors= 1); /** Returns the human readable name of the given event type. */ @@ -2183,14 +2196,14 @@ Query_log_event(THD* thd_arg, const char* query_arg, size_t query_length, bool using_trans, bool direct, bool suppress_use, int error); - const char* get_db() { return db; } + const char* get_db() override { return db; } #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else bool print_query_header(IO_CACHE* file, PRINT_EVENT_INFO* print_event_info); bool print_verbose(IO_CACHE* cache, PRINT_EVENT_INFO* print_event_info); - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Query_log_event(); @@ -2202,16 +2215,16 @@ if (data_buf) my_free(data_buf); } - Log_event_type get_type_code() { return QUERY_EVENT; } + Log_event_type get_type_code() override { return QUERY_EVENT; } static int dummy_event(String *packet, ulong ev_offset, enum enum_binlog_checksum_alg checksum_alg); static int begin_event(String *packet, ulong ev_offset, enum enum_binlog_checksum_alg checksum_alg); #ifdef MYSQL_SERVER - bool write(); + bool write() override; virtual bool write_post_header_for_derived() { return FALSE; } #endif - bool is_valid() const { return query != 0; } + bool is_valid() const override { return query != 0; } /* Returns number of bytes additionally written to post header by derived @@ -2222,8 +2235,8 @@ public: /* !!! Public in this patch to allow old usage */ #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); - virtual int do_apply_event(rpl_group_info *rgi); + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; + int do_apply_event(rpl_group_info *rgi) override; int do_apply_event(rpl_group_info *rgi, const char *query_arg, @@ -2240,7 +2253,7 @@ If true, the event always be applied by slave SQL thread or be printed by mysqlbinlog */ - bool is_trans_keyword() + bool is_trans_keyword(bool is_xa) { /* Before the patch for bug#50407, The 'SAVEPOINT and ROLLBACK TO' @@ -2253,10 +2266,11 @@ but we don't handle these cases and after the patch, both quiries are binlogged in upper case with no comments. */ - return !strncmp(query, "BEGIN", q_len) || - !strncmp(query, "COMMIT", q_len) || - !strncasecmp(query, "SAVEPOINT", 9) || - !strncasecmp(query, "ROLLBACK", 8); + return is_xa ? !strncasecmp(query, C_STRING_WITH_LEN("XA ")) + : (!strncmp(query, "BEGIN", q_len) || + !strncmp(query, "COMMIT", q_len) || + !strncasecmp(query, "SAVEPOINT", 9) || + !strncasecmp(query, "ROLLBACK", 8)); } virtual bool is_begin() { return !strcmp(query, "BEGIN"); } virtual bool is_commit() { return !strcmp(query, "COMMIT"); } @@ -2275,21 +2289,21 @@ if (query_buf) my_free(query_buf); } - Log_event_type get_type_code() { return QUERY_COMPRESSED_EVENT; } + Log_event_type get_type_code() override { return QUERY_COMPRESSED_EVENT; } /* the min length of log_bin_compress_min_len is 10, means that Begin/Commit/Rollback would never be compressed! */ - virtual bool is_begin() { return false; } - virtual bool is_commit() { return false; } - virtual bool is_rollback() { return false; } + bool is_begin() override { return false; } + bool is_commit() override { return false; } + bool is_rollback() override { return false; } #ifdef MYSQL_SERVER Query_compressed_log_event(THD* thd_arg, const char* query_arg, ulong query_length, bool using_trans, bool direct, bool suppress_use, int error); - virtual bool write(); + bool write() override; #endif }; @@ -2599,12 +2613,12 @@ bool using_trans); void set_fields(const char* db, List &fields_arg, Name_resolution_context *context); - const char* get_db() { return db; } + const char* get_db() override { return db; } #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; bool print(FILE* file, PRINT_EVENT_INFO* print_event_info, bool commented); #endif @@ -2617,16 +2631,16 @@ Load_log_event(const uchar *buf, uint event_len, const Format_description_log_event* description_event); ~Load_log_event() = default; - Log_event_type get_type_code() + Log_event_type get_type_code() override { return sql_ex.new_format() ? NEW_LOAD_EVENT: LOAD_EVENT; } #ifdef MYSQL_SERVER - bool write_data_header(); - bool write_data_body(); + bool write_data_header() override; + bool write_data_body() override; #endif - bool is_valid() const { return table_name != 0; } - int get_data_size() + bool is_valid() const override { return table_name != 0; } + int get_data_size() override { return (table_name_len + db_len + 2 + fname_len + LOAD_HEADER_LEN @@ -2635,7 +2649,7 @@ public: /* !!! Public in this patch to allow old usage */ #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi) + int do_apply_event(rpl_group_info *rgi) override { return do_apply_event(thd->slave_net,rgi,0); } @@ -2697,32 +2711,32 @@ #ifdef MYSQL_SERVER Start_log_event_v3(); #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else Start_log_event_v3() = default; - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Start_log_event_v3(const uchar *buf, uint event_len, const Format_description_log_event* description_event); ~Start_log_event_v3() = default; - Log_event_type get_type_code() { return START_EVENT_V3;} - my_off_t get_header_len(my_off_t l __attribute__((unused))) + Log_event_type get_type_code() override { return START_EVENT_V3;} + my_off_t get_header_len(my_off_t l __attribute__((unused))) override { return LOG_EVENT_MINIMAL_HEADER_LEN; } #ifdef MYSQL_SERVER - bool write(); + bool write() override; #endif - bool is_valid() const { return server_version[0] != 0; } - int get_data_size() + bool is_valid() const override { return server_version[0] != 0; } + int get_data_size() override { return START_V3_HEADER_LEN; //no variable-sized part } protected: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info*) + int do_apply_event(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info*) override { /* Events from ourself should be skipped, but they should not @@ -2760,7 +2774,7 @@ memcpy(nonce, nonce_arg, BINLOG_NONCE_LENGTH); } - bool write_data_body() + bool write_data_body() override { uchar scheme_buf= crypto_scheme; uchar key_version_buf[BINLOG_KEY_VERSION_LENGTH]; @@ -2770,18 +2784,18 @@ write_data(nonce, BINLOG_NONCE_LENGTH); } #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Start_encryption_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); - bool is_valid() const { return crypto_scheme == 1; } + bool is_valid() const override { return crypto_scheme == 1; } - Log_event_type get_type_code() { return START_ENCRYPTION_EVENT; } + Log_event_type get_type_code() override { return START_ENCRYPTION_EVENT; } - int get_data_size() + int get_data_size() override { return BINLOG_CRYPTO_SCHEME_LENGTH + BINLOG_KEY_VERSION_LENGTH + BINLOG_NONCE_LENGTH; @@ -2793,9 +2807,9 @@ protected: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info* rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info* rgi) + int do_apply_event(rpl_group_info* rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info* rgi) override { return Log_event::EVENT_SKIP_NOT; } @@ -2886,9 +2900,9 @@ { my_free(post_header_len); } - Log_event_type get_type_code() { return FORMAT_DESCRIPTION_EVENT;} + Log_event_type get_type_code() override { return FORMAT_DESCRIPTION_EVENT;} #ifdef MYSQL_SERVER - bool write(); + bool write() override; #endif bool header_is_valid() const { @@ -2897,12 +2911,12 @@ (post_header_len != NULL)); } - bool is_valid() const + bool is_valid() const override { return header_is_valid() && server_version_split.version_is_valid(); } - int get_data_size() + int get_data_size() override { /* The vector of post-header lengths is considered as part of the @@ -2928,9 +2942,9 @@ static bool is_version_before_checksum(const master_version_split *version_split); protected: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif }; @@ -2988,29 +3002,31 @@ cache_type= Log_event::EVENT_NO_CACHE; } #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Intvar_log_event(const uchar *buf, const Format_description_log_event *description_event); ~Intvar_log_event() = default; - Log_event_type get_type_code() { return INTVAR_EVENT;} + Log_event_type get_type_code() override { return INTVAR_EVENT;} const char* get_var_type_name(); - int get_data_size() { return 9; /* sizeof(type) + sizeof(val) */;} + int get_data_size() override { return 9; /* sizeof(type) + sizeof(val) */;} #ifdef MYSQL_SERVER - bool write(); + bool write() override; +#ifdef HAVE_REPLICATION + bool is_part_of_group() override { return 1; } #endif - bool is_valid() const { return 1; } - bool is_part_of_group() { return 1; } +#endif + bool is_valid() const override { return 1; } private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif }; @@ -3069,28 +3085,30 @@ cache_type= Log_event::EVENT_NO_CACHE; } #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Rand_log_event(const uchar *buf, const Format_description_log_event *description_event); ~Rand_log_event() = default; - Log_event_type get_type_code() { return RAND_EVENT;} - int get_data_size() { return 16; /* sizeof(ulonglong) * 2*/ } + Log_event_type get_type_code() override { return RAND_EVENT;} + int get_data_size() override { return 16; /* sizeof(ulonglong) * 2*/ } #ifdef MYSQL_SERVER - bool write(); + bool write() override; +#ifdef HAVE_REPLICATION + bool is_part_of_group() override { return 1; } #endif - bool is_valid() const { return 1; } - bool is_part_of_group() { return 1; } +#endif + bool is_valid() const override { return 1; } private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif }; @@ -3107,14 +3125,14 @@ Log_event(buf, description_event) {} ~Xid_apply_log_event() {} - bool is_valid() const { return 1; } + bool is_valid() const override { return 1; } private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) virtual int do_commit()= 0; - virtual int do_apply_event(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; int do_record_gtid(THD *thd, rpl_group_info *rgi, bool in_trans, void **out_hton, bool force_err= false); - enum_skip_reason do_shall_skip(rpl_group_info *rgi); + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; virtual const char* get_query()= 0; #endif }; @@ -3144,29 +3162,29 @@ if (direct) cache_type= Log_event::EVENT_NO_CACHE; } - const char* get_query() +#ifdef HAVE_REPLICATION + const char* get_query() override { return "COMMIT /* implicit, from Xid_log_event */"; } -#ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Xid_log_event(const uchar *buf, const Format_description_log_event *description_event); ~Xid_log_event() = default; - Log_event_type get_type_code() { return XID_EVENT;} - int get_data_size() { return sizeof(xid); } + Log_event_type get_type_code() override { return XID_EVENT;} + int get_data_size() override { return sizeof(xid); } #ifdef MYSQL_SERVER - bool write(); + bool write() override; #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - int do_commit(); + int do_commit() override; #endif }; @@ -3295,30 +3313,30 @@ cache_type= Log_event::EVENT_NO_CACHE; } #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif XA_prepare_log_event(const uchar *buf, const Format_description_log_event *description_event); ~XA_prepare_log_event() {} - Log_event_type get_type_code() { return XA_PREPARE_LOG_EVENT; } - bool is_valid() const { return m_xid.formatID != -1; } - int get_data_size() + Log_event_type get_type_code() override { return XA_PREPARE_LOG_EVENT; } + bool is_valid() const override { return m_xid.formatID != -1; } + int get_data_size() override { return xid_subheader_no_data + m_xid.gtrid_length + m_xid.bqual_length; } #ifdef MYSQL_SERVER - bool write(); + bool write() override; #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) char query[sizeof("XA COMMIT ONE PHASE") + 1 + ser_buf_size]; - int do_commit(); - const char* get_query() + int do_commit() override; + const char* get_query() override { sprintf(query, (one_phase ? "XA COMMIT %s ONE PHASE" : "XA PREPARE %s"), @@ -3338,49 +3356,45 @@ @section User_var_log_event_binary_format Binary Format */ -class User_var_log_event: public Log_event + +class User_var_log_event: public Log_event, public Log_event_data_type { public: - enum { - UNDEF_F= 0, - UNSIGNED_F= 1 - }; const char *name; size_t name_len; const char *val; size_t val_len; - Item_result type; - uint charset_number; bool is_null; - uchar flags; #ifdef MYSQL_SERVER bool deferred; query_id_t query_id; User_var_log_event(THD* thd_arg, const char *name_arg, size_t name_len_arg, const char *val_arg, size_t val_len_arg, - Item_result type_arg, - uint charset_number_arg, uchar flags_arg, + const Log_event_data_type &data_type, bool using_trans, bool direct) :Log_event(thd_arg, 0, using_trans), + Log_event_data_type(data_type), name(name_arg), name_len(name_len_arg), val(val_arg), - val_len(val_len_arg), type(type_arg), charset_number(charset_number_arg), - flags(flags_arg), deferred(false) + val_len(val_len_arg), + deferred(false) { is_null= !val; if (direct) cache_type= Log_event::EVENT_NO_CACHE; } - void pack_info(Protocol* protocol); +#ifdef HAVE_REPLICATION + void pack_info(Protocol* protocol) override; +#endif #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif User_var_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); ~User_var_log_event() = default; - Log_event_type get_type_code() { return USER_VAR_EVENT;} + Log_event_type get_type_code() override { return USER_VAR_EVENT;} #ifdef MYSQL_SERVER - bool write(); + bool write() override; /* Getter and setter for deferred User-event. Returns true if the event is not applied directly @@ -3392,15 +3406,17 @@ and the parsing time query id is stored to be used at applying time. */ void set_deferred(query_id_t qid) { deferred= true; query_id= qid; } +#ifdef HAVE_REPLICATION + bool is_part_of_group() override { return 1; } +#endif #endif - bool is_valid() const { return name != 0; } - bool is_part_of_group() { return 1; } + bool is_valid() const override { return name != 0; } private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif }; @@ -3420,7 +3436,7 @@ Stop_log_event() :Log_event() {} #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Stop_log_event(const uchar *buf, @@ -3428,13 +3444,13 @@ Log_event(buf, description_event) {} ~Stop_log_event() = default; - Log_event_type get_type_code() { return STOP_EVENT;} - bool is_valid() const { return 1; } + Log_event_type get_type_code() override { return STOP_EVENT;} + bool is_valid() const override { return 1; } private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi) + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override { /* Events from ourself should be skipped, but they should not @@ -3513,10 +3529,10 @@ uint ident_len_arg, ulonglong pos_arg, uint flags); #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Rotate_log_event(const uchar *buf, uint event_len, @@ -3526,19 +3542,19 @@ if (flags & DUP_NAME) my_free((void*) new_log_ident); } - Log_event_type get_type_code() { return ROTATE_EVENT;} - my_off_t get_header_len(my_off_t l __attribute__((unused))) + Log_event_type get_type_code() override { return ROTATE_EVENT;} + my_off_t get_header_len(my_off_t l __attribute__((unused))) override { return LOG_EVENT_MINIMAL_HEADER_LEN; } - int get_data_size() { return ident_len + ROTATE_HEADER_LEN;} - bool is_valid() const { return new_log_ident != 0; } + int get_data_size() override { return ident_len + ROTATE_HEADER_LEN;} + bool is_valid() const override { return new_log_ident != 0; } #ifdef MYSQL_SERVER - bool write(); + bool write() override; #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif }; @@ -3553,21 +3569,24 @@ Binlog_checkpoint_log_event(const char *binlog_file_name_arg, uint binlog_file_len_arg); #ifdef HAVE_REPLICATION - void pack_info(Protocol *protocol); + void pack_info(Protocol *protocol) override; #endif #else - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif Binlog_checkpoint_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); ~Binlog_checkpoint_log_event() { my_free(binlog_file_name); } - Log_event_type get_type_code() { return BINLOG_CHECKPOINT_EVENT;} - int get_data_size() { return binlog_file_len + BINLOG_CHECKPOINT_HEADER_LEN;} - bool is_valid() const { return binlog_file_name != 0; } + Log_event_type get_type_code() override { return BINLOG_CHECKPOINT_EVENT;} + int get_data_size() override + { return binlog_file_len + BINLOG_CHECKPOINT_HEADER_LEN;} + bool is_valid() const override { return binlog_file_name != 0; } #ifdef MYSQL_SERVER - bool write(); - enum_skip_reason do_shall_skip(rpl_group_info *rgi); + bool write() override; +#ifdef HAVE_REPLICATION + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; +#endif #endif }; @@ -3712,26 +3731,35 @@ uint16 flags, bool is_transactional, uint64 commit_id, bool has_xid= false, bool is_ro_1pc= false); #ifdef HAVE_REPLICATION - void pack_info(Protocol *protocol); - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + void pack_info(Protocol *protocol) override; + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif #else - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif Gtid_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); ~Gtid_log_event() = default; - Log_event_type get_type_code() { return GTID_EVENT; } - enum_logged_status logged_status() { return LOGGED_NO_DATA; } - int get_data_size() + Log_event_type get_type_code() override { return GTID_EVENT; } + enum_logged_status logged_status() override { return LOGGED_NO_DATA; } + int get_data_size() override { return GTID_HEADER_LEN + ((flags2 & FL_GROUP_COMMIT_ID) ? 2 : 0); } - bool is_valid() const { return seq_no != 0; } + + bool is_valid() const override + { + /* + seq_no is set to 0 if the structure of a serialized GTID event does not + align with that as indicated by flags and extra_flags. + */ + return seq_no != 0; + } + #ifdef MYSQL_SERVER - bool write(); + bool write() override; static int make_compatible_event(String *packet, bool *need_dummy_event, ulong ev_offset, enum enum_binlog_checksum_alg checksum_alg); static bool peek(const uchar *event_start, size_t event_len, @@ -3829,16 +3857,16 @@ Gtid_list_log_event(rpl_binlog_state *gtid_set, uint32 gl_flags); Gtid_list_log_event(slave_connection_state *gtid_set, uint32 gl_flags); #ifdef HAVE_REPLICATION - void pack_info(Protocol *protocol); + void pack_info(Protocol *protocol) override; #endif #else - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif Gtid_list_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); ~Gtid_list_log_event() { my_free(list); my_free(sub_id_list); } - Log_event_type get_type_code() { return GTID_LIST_EVENT; } - int get_data_size() { + Log_event_type get_type_code() override { return GTID_LIST_EVENT; } + int get_data_size() override { /* Replacing with dummy event, needed for older slaves, requires a minimum of 6 bytes in the body. @@ -3846,12 +3874,12 @@ return (count==0 ? GTID_LIST_HEADER_LEN+2 : GTID_LIST_HEADER_LEN+count*element_size); } - bool is_valid() const { return list != NULL; } + bool is_valid() const override { return list != NULL; } #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) bool to_packet(String *packet); - bool write(); - virtual int do_apply_event(rpl_group_info *rgi); - enum_skip_reason do_shall_skip(rpl_group_info *rgi); + bool write() override; + int do_apply_event(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif static bool peek(const char *event_start, size_t event_len, enum enum_binlog_checksum_alg checksum_alg, @@ -3893,10 +3921,10 @@ uchar* block_arg, uint block_len_arg, bool using_trans); #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; bool print(FILE* file, PRINT_EVENT_INFO* print_event_info, bool enable_local); #endif @@ -3908,20 +3936,20 @@ my_free((void*) event_buf); } - Log_event_type get_type_code() + Log_event_type get_type_code() override { return fake_base ? Load_log_event::get_type_code() : CREATE_FILE_EVENT; } - int get_data_size() + int get_data_size() override { return (fake_base ? Load_log_event::get_data_size() : Load_log_event::get_data_size() + 4 + 1 + block_len); } - bool is_valid() const { return inited_from_old || block != 0; } + bool is_valid() const override { return inited_from_old || block != 0; } #ifdef MYSQL_SERVER - bool write_data_header(); - bool write_data_body(); + bool write_data_header() override; + bool write_data_body() override; /* Cut out Create_file extensions and write it as Load event - used on the slave @@ -3931,7 +3959,7 @@ private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; #endif }; @@ -3965,28 +3993,28 @@ Append_block_log_event(THD* thd, const char* db_arg, uchar* block_arg, uint block_len_arg, bool using_trans); #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; virtual int get_create_or_append() const; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Append_block_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); ~Append_block_log_event() = default; - Log_event_type get_type_code() { return APPEND_BLOCK_EVENT;} - int get_data_size() { return block_len + APPEND_BLOCK_HEADER_LEN ;} - bool is_valid() const { return block != 0; } + Log_event_type get_type_code() override { return APPEND_BLOCK_EVENT;} + int get_data_size() override { return block_len + APPEND_BLOCK_HEADER_LEN ;} + bool is_valid() const override { return block != 0; } #ifdef MYSQL_SERVER - bool write(); - const char* get_db() { return db; } + bool write() override; + const char* get_db() override { return db; } #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; #endif }; @@ -4006,10 +4034,10 @@ #ifdef MYSQL_SERVER Delete_file_log_event(THD* thd, const char* db_arg, bool using_trans); #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; bool print(FILE* file, PRINT_EVENT_INFO* print_event_info, bool enable_local); #endif @@ -4017,17 +4045,17 @@ Delete_file_log_event(const uchar *buf, uint event_len, const Format_description_log_event* description_event); ~Delete_file_log_event() = default; - Log_event_type get_type_code() { return DELETE_FILE_EVENT;} - int get_data_size() { return DELETE_FILE_HEADER_LEN ;} - bool is_valid() const { return file_id != 0; } + Log_event_type get_type_code() override { return DELETE_FILE_EVENT;} + int get_data_size() override { return DELETE_FILE_HEADER_LEN ;} + bool is_valid() const override { return file_id != 0; } #ifdef MYSQL_SERVER - bool write(); - const char* get_db() { return db; } + bool write() override; + const char* get_db() override { return db; } #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; #endif }; @@ -4047,27 +4075,27 @@ #ifdef MYSQL_SERVER Execute_load_log_event(THD* thd, const char* db_arg, bool using_trans); #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; #endif Execute_load_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); ~Execute_load_log_event() = default; - Log_event_type get_type_code() { return EXEC_LOAD_EVENT;} - int get_data_size() { return EXEC_LOAD_HEADER_LEN ;} - bool is_valid() const { return file_id != 0; } + Log_event_type get_type_code() override { return EXEC_LOAD_EVENT;} + int get_data_size() override { return EXEC_LOAD_HEADER_LEN ;} + bool is_valid() const override { return file_id != 0; } #ifdef MYSQL_SERVER - bool write(); - const char* get_db() { return db; } + bool write() override; + const char* get_db() override { return db; } #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; #endif }; @@ -4090,17 +4118,17 @@ bool using_trans); #ifdef HAVE_REPLICATION Begin_load_query_log_event(THD* thd); - int get_create_or_append() const; + int get_create_or_append() const override; #endif /* HAVE_REPLICATION */ #endif Begin_load_query_log_event(const uchar *buf, uint event_len, const Format_description_log_event *description_event); ~Begin_load_query_log_event() = default; - Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; } + Log_event_type get_type_code() override { return BEGIN_LOAD_QUERY_EVENT; } private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif }; @@ -4143,10 +4171,10 @@ bool using_trans, bool direct, bool suppress_use, int errcode); #ifdef HAVE_REPLICATION - void pack_info(Protocol* protocol); + void pack_info(Protocol* protocol) override; #endif /* HAVE_REPLICATION */ #else - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; /* Prints the query as LOAD DATA LOCAL and with rewritten filename */ bool print(FILE* file, PRINT_EVENT_INFO* print_event_info, const char *local_fname); @@ -4156,17 +4184,17 @@ *description_event); ~Execute_load_query_log_event() = default; - Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; } - bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; } + Log_event_type get_type_code() override { return EXECUTE_LOAD_QUERY_EVENT; } + bool is_valid() const override { return Query_log_event::is_valid() && file_id != 0; } - ulong get_post_header_size_for_derived(); + ulong get_post_header_size_for_derived() override; #ifdef MYSQL_SERVER - bool write_post_header_for_derived(); + bool write_post_header_for_derived() override; #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; #endif }; @@ -4193,9 +4221,9 @@ /* constructor for hopelessly corrupted events */ Unknown_log_event(): Log_event(), what(ENCRYPTED) {} ~Unknown_log_event() = default; - bool print(FILE* file, PRINT_EVENT_INFO* print_event_info); - Log_event_type get_type_code() { return UNKNOWN_EVENT;} - bool is_valid() const { return 1; } + bool print(FILE* file, PRINT_EVENT_INFO* print_event_info) override; + Log_event_type get_type_code() override { return UNKNOWN_EVENT;} + bool is_valid() const override { return 1; } }; #endif char *str_to_hex(char *to, const char *from, size_t len); @@ -4222,30 +4250,32 @@ const Format_description_log_event*); ~Annotate_rows_log_event(); - virtual int get_data_size(); - virtual Log_event_type get_type_code(); - enum_logged_status logged_status() { return LOGGED_NO_DATA; } - virtual bool is_valid() const; - virtual bool is_part_of_group() { return 1; } + int get_data_size() override; + Log_event_type get_type_code() override; + enum_logged_status logged_status() override { return LOGGED_NO_DATA; } + bool is_valid() const override; #ifndef MYSQL_CLIENT - virtual bool write_data_header(); - virtual bool write_data_body(); +#ifdef HAVE_REPLICATION + bool is_part_of_group() override { return 1; } +#endif + bool write_data_header() override; + bool write_data_body() override; #endif #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) - virtual void pack_info(Protocol*); + void pack_info(Protocol*) override; #endif #ifdef MYSQL_CLIENT - virtual bool print(FILE*, PRINT_EVENT_INFO*); + bool print(FILE*, PRINT_EVENT_INFO*) override; #endif #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) private: - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info*); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info*) override; #endif private: @@ -4865,7 +4895,8 @@ flag_set get_flags(flag_set flag) const { return m_flags & flag; } #ifdef MYSQL_SERVER - Table_map_log_event(THD *thd, TABLE *tbl, ulong tid, bool is_transactional); + Table_map_log_event(THD *thd, TABLE *tbl, ulonglong tid, + bool is_transactional); #endif #ifdef HAVE_REPLICATION Table_map_log_event(const uchar *buf, uint event_len, @@ -4887,33 +4918,35 @@ const char *get_table_name() const { return m_tblnam; } const char *get_db_name() const { return m_dbnam; } - virtual Log_event_type get_type_code() { return TABLE_MAP_EVENT; } - virtual enum_logged_status logged_status() { return LOGGED_TABLE_MAP; } - virtual bool is_valid() const { return m_memory != NULL; /* we check malloc */ } - virtual bool is_part_of_group() { return 1; } + Log_event_type get_type_code() override { return TABLE_MAP_EVENT; } + enum_logged_status logged_status() override { return LOGGED_TABLE_MAP; } + bool is_valid() const override { return m_memory != NULL; /* we check malloc */ } - virtual int get_data_size() { return (uint) m_data_size; } + int get_data_size() override { return (uint) m_data_size; } #ifdef MYSQL_SERVER +#ifdef HAVE_REPLICATION + bool is_part_of_group() override { return 1; } +#endif virtual int save_field_metadata(); - virtual bool write_data_header(); - virtual bool write_data_body(); - virtual const char *get_db() { return m_dbnam; } + bool write_data_header() override; + bool write_data_body() override; + const char *get_db() override { return m_dbnam; } #endif #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual void pack_info(Protocol *protocol); + void pack_info(Protocol *protocol) override; #endif #ifdef MYSQL_CLIENT - virtual bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; #endif #ifdef MYSQL_SERVER @@ -5063,17 +5096,17 @@ flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; } void update_flags() { int2store(temp_buf + m_flags_pos, m_flags); } - Log_event_type get_type_code() { return m_type; } /* Specific type (_V1 etc) */ - enum_logged_status logged_status() { return LOGGED_ROW_EVENT; } + Log_event_type get_type_code() override { return m_type; } /* Specific type (_V1 etc) */ + enum_logged_status logged_status() override { return LOGGED_ROW_EVENT; } virtual Log_event_type get_general_type_code() = 0; /* General rows op type, no version */ #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual void pack_info(Protocol *protocol); + void pack_info(Protocol *protocol) override; #endif #ifdef MYSQL_CLIENT /* not for direct call, each derived has its own ::print() */ - virtual bool print(FILE *file, PRINT_EVENT_INFO *print_event_info)= 0; + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override= 0; void change_to_flashback_event(PRINT_EVENT_INFO *print_event_info, uchar *rows_buff, Log_event_type ev_type); bool print_verbose(IO_CACHE *file, PRINT_EVENT_INFO *print_event_info); @@ -5098,7 +5131,7 @@ #endif /* Member functions to implement superclass interface */ - virtual int get_data_size(); + int get_data_size() override; MY_BITMAP const *get_cols() const { return &m_cols; } MY_BITMAP const *get_cols_ai() const { return &m_cols_ai; } @@ -5154,10 +5187,13 @@ #endif #ifdef MYSQL_SERVER - virtual bool write_data_header(); - virtual bool write_data_body(); + bool write_data_header() override; + bool write_data_body() override; virtual bool write_compressed(); - virtual const char *get_db() { return m_table->s->db.str; } + const char *get_db() override { return m_table->s->db.str; } +#ifdef HAVE_REPLICATION + bool is_part_of_group() override { return get_flags(STMT_END_F) != 0; } +#endif #endif /* Check that malloc() succeeded in allocating memory for the rows @@ -5165,11 +5201,10 @@ is valid is done in the Update_rows_log_event::is_valid() function. */ - virtual bool is_valid() const + bool is_valid() const override { return m_rows_buf && m_cols.bitmap; } - bool is_part_of_group() { return get_flags(STMT_END_F) != 0; } uint m_row_count; /* The number of rows added to the event */ @@ -5191,7 +5226,7 @@ this class, not create instances of this class. */ #ifdef MYSQL_SERVER - Rows_log_event(THD*, TABLE*, ulong table_id, + Rows_log_event(THD*, TABLE*, ulonglong table_id, MY_BITMAP const *cols, bool is_transactional, Log_event_type event_type); #endif @@ -5225,8 +5260,8 @@ ulong m_master_reclength; /* Length of record on master side */ /* Bit buffers in the same memory as the class */ - uint32 m_bitbuf[128/(sizeof(uint32)*8)]; - uint32 m_bitbuf_ai[128/(sizeof(uint32)*8)]; + my_bitmap_map m_bitbuf[128/(sizeof(my_bitmap_map)*8)]; + my_bitmap_map m_bitbuf_ai[128/(sizeof(my_bitmap_map)*8)]; uchar *m_rows_buf; /* The rows in packed format */ uchar *m_rows_cur; /* One-after the end of the data */ @@ -5347,9 +5382,9 @@ private: #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; /* Primitive to prepare for a sequence of row executions. @@ -5425,7 +5460,7 @@ }; #if defined(MYSQL_SERVER) - Write_rows_log_event(THD*, TABLE*, ulong table_id, + Write_rows_log_event(THD*, TABLE*, ulonglong table_id, bool is_transactional); #endif #ifdef HAVE_REPLICATION @@ -5445,20 +5480,20 @@ #endif #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - uint8 get_trg_event_map(); + uint8 get_trg_event_map() override; #endif private: - virtual Log_event_type get_general_type_code() { return (Log_event_type)TYPE_CODE; } + Log_event_type get_general_type_code() override { return (Log_event_type)TYPE_CODE; } #ifdef MYSQL_CLIENT - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_before_row_operations(const Slave_reporting_capability *const); - virtual int do_after_row_operations(const Slave_reporting_capability *const,int); - virtual int do_exec_row(rpl_group_info *); + int do_before_row_operations(const Slave_reporting_capability *const) override; + int do_after_row_operations(const Slave_reporting_capability *const,int) override; + int do_exec_row(rpl_group_info *) override; #endif }; @@ -5466,9 +5501,9 @@ { public: #if defined(MYSQL_SERVER) - Write_rows_compressed_log_event(THD*, TABLE*, ulong table_id, + Write_rows_compressed_log_event(THD*, TABLE*, ulonglong table_id, bool is_transactional); - virtual bool write(); + bool write() override; #endif #ifdef HAVE_REPLICATION Write_rows_compressed_log_event(const uchar *buf, uint event_len, @@ -5476,7 +5511,7 @@ #endif private: #if defined(MYSQL_CLIENT) - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif }; @@ -5502,7 +5537,7 @@ }; #ifdef MYSQL_SERVER - Update_rows_log_event(THD*, TABLE*, ulong table_id, + Update_rows_log_event(THD*, TABLE*, ulonglong table_id, bool is_transactional); void init(MY_BITMAP const *cols); @@ -5527,26 +5562,26 @@ } #endif - virtual bool is_valid() const + bool is_valid() const override { return Rows_log_event::is_valid() && m_cols_ai.bitmap; } #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - uint8 get_trg_event_map(); + uint8 get_trg_event_map() override; #endif protected: - virtual Log_event_type get_general_type_code() { return (Log_event_type)TYPE_CODE; } + Log_event_type get_general_type_code() override { return (Log_event_type)TYPE_CODE; } #ifdef MYSQL_CLIENT - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_before_row_operations(const Slave_reporting_capability *const); - virtual int do_after_row_operations(const Slave_reporting_capability *const,int); - virtual int do_exec_row(rpl_group_info *); + int do_before_row_operations(const Slave_reporting_capability *const) override; + int do_after_row_operations(const Slave_reporting_capability *const,int) override; + int do_exec_row(rpl_group_info *) override; #endif /* defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) */ }; @@ -5554,9 +5589,9 @@ { public: #if defined(MYSQL_SERVER) - Update_rows_compressed_log_event(THD*, TABLE*, ulong table_id, + Update_rows_compressed_log_event(THD*, TABLE*, ulonglong table_id, bool is_transactional); - virtual bool write(); + bool write() override; #endif #ifdef HAVE_REPLICATION Update_rows_compressed_log_event(const uchar *buf, uint event_len, @@ -5564,7 +5599,7 @@ #endif private: #if defined(MYSQL_CLIENT) - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif }; @@ -5598,7 +5633,7 @@ }; #ifdef MYSQL_SERVER - Delete_rows_log_event(THD*, TABLE*, ulong, bool is_transactional); + Delete_rows_log_event(THD*, TABLE*, ulonglong, bool is_transactional); #endif #ifdef HAVE_REPLICATION Delete_rows_log_event(const uchar *buf, uint event_len, @@ -5618,20 +5653,20 @@ #endif #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - uint8 get_trg_event_map(); + uint8 get_trg_event_map() override; #endif protected: - virtual Log_event_type get_general_type_code() { return (Log_event_type)TYPE_CODE; } + Log_event_type get_general_type_code() override { return (Log_event_type)TYPE_CODE; } #ifdef MYSQL_CLIENT - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_before_row_operations(const Slave_reporting_capability *const); - virtual int do_after_row_operations(const Slave_reporting_capability *const,int); - virtual int do_exec_row(rpl_group_info *); + int do_before_row_operations(const Slave_reporting_capability *const) override; + int do_after_row_operations(const Slave_reporting_capability *const,int) override; + int do_exec_row(rpl_group_info *) override; #endif }; @@ -5639,8 +5674,9 @@ { public: #if defined(MYSQL_SERVER) - Delete_rows_compressed_log_event(THD*, TABLE*, ulong, bool is_transactional); - virtual bool write(); + Delete_rows_compressed_log_event(THD*, TABLE*, ulonglong, + bool is_transactional); + bool write() override; #endif #ifdef HAVE_REPLICATION Delete_rows_compressed_log_event(const uchar *buf, uint event_len, @@ -5648,7 +5684,7 @@ #endif private: #if defined(MYSQL_CLIENT) - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif }; @@ -5731,10 +5767,11 @@ #endif #ifdef MYSQL_SERVER - void pack_info(Protocol*); - - virtual bool write_data_header(); - virtual bool write_data_body(); +#ifdef HAVE_REPLICATION + void pack_info(Protocol*) override; +#endif + bool write_data_header() override; + bool write_data_body() override; #endif Incident_log_event(const uchar *buf, uint event_len, @@ -5743,20 +5780,20 @@ virtual ~Incident_log_event(); #ifdef MYSQL_CLIENT - virtual bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif #if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; #endif - virtual Log_event_type get_type_code() { return INCIDENT_EVENT; } + Log_event_type get_type_code() override { return INCIDENT_EVENT; } - virtual bool is_valid() const + bool is_valid() const override { return m_incident > INCIDENT_NONE && m_incident < INCIDENT_COUNT; } - virtual int get_data_size() { + int get_data_size() override { return INCIDENT_HEADER_LEN + 1 + (uint) m_message.length; } @@ -5806,18 +5843,18 @@ virtual ~Ignorable_log_event(); #ifndef MYSQL_CLIENT - void pack_info(Protocol*); +#ifdef HAVE_REPLICATION + void pack_info(Protocol*) override; #endif - -#ifdef MYSQL_CLIENT - virtual bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); +#else + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif - virtual Log_event_type get_type_code() { return IGNORABLE_LOG_EVENT; } + Log_event_type get_type_code() override { return IGNORABLE_LOG_EVENT; } - virtual bool is_valid() const { return 1; } + bool is_valid() const override { return 1; } - virtual int get_data_size() { return IGNORABLE_HEADER_LEN; } + int get_data_size() override { return IGNORABLE_HEADER_LEN; } }; #ifdef MYSQL_CLIENT @@ -5855,8 +5892,8 @@ uint8 hb_flags; Heartbeat_log_event(const uchar *buf, uint event_len, const Format_description_log_event* description_event); - Log_event_type get_type_code() { return HEARTBEAT_LOG_EVENT; } - bool is_valid() const + Log_event_type get_type_code() override { return HEARTBEAT_LOG_EVENT; } + bool is_valid() const override { return (log_ident != NULL && ident_len <= FN_REFLEN-1 && log_pos >= BIN_LOG_HEADER_SIZE); diff -Nru mariadb-10.11.6/sql/log_event_client.cc mariadb-10.11.9/sql/log_event_client.cc --- mariadb-10.11.6/sql/log_event_client.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log_event_client.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1503,8 +1503,9 @@ if (!(map= print_event_info->m_table_map.get_table(m_table_id)) || !(td= map->create_table_def())) { - return (my_b_printf(file, "### Row event for unknown table #%lu", - (ulong) m_table_id)); + char llbuff[22]; + return (my_b_printf(file, "### Row event for unknown table #%s", + ullstr(m_table_id, llbuff))); } /* If the write rows event contained no values for the AI */ @@ -1837,7 +1838,7 @@ if ((flags & LOG_EVENT_SUPPRESS_USE_F)) { - if (!is_trans_keyword()) + if (!is_trans_keyword(print_event_info->is_xa_trans())) print_event_info->db[0]= '\0'; } else if (db) @@ -2488,7 +2489,7 @@ } else { - switch (type) { + switch (m_type) { case REAL_RESULT: double real_val; char real_buf[FMT_G_BUFSIZE(14)]; @@ -2500,8 +2501,7 @@ break; case INT_RESULT: char int_buf[22]; - longlong10_to_str(uint8korr(val), int_buf, - ((flags & User_var_log_event::UNSIGNED_F) ? 10 : -10)); + longlong10_to_str(uint8korr(val), int_buf, is_unsigned() ? 10 : -10); if (my_b_printf(&cache, ":=%s%s\n", int_buf, print_event_info->delimiter)) goto err; @@ -2556,7 +2556,7 @@ people want to mysqlbinlog|mysql into another server not supporting the character set. But there's not much to do about this and it's unlikely. */ - if (!(cs= get_charset(charset_number, MYF(0)))) + if (!(cs= get_charset(m_charset_number, MYF(0)))) { /* Generate an unusable command (=> syntax error) is probably the best thing we can do here. @@ -3087,7 +3087,7 @@ { char *pbeg; // beginning of the next line char *pend; // end of the next line - uint cnt= 0; // characters counter + char *qend= m_query_txt + m_query_len; if (!pinfo->short_form) { @@ -3098,28 +3098,21 @@ else if (my_b_printf(&pinfo->head_cache, "# Annotate_rows:\n")) goto err; - for (pbeg= m_query_txt; ; pbeg= pend) + for (pbeg= m_query_txt; pbeg < qend; pbeg= pend) { // skip all \r's and \n's at the beginning of the next line - for (;; pbeg++) - { - if (++cnt > m_query_len) - return 0; - - if (*pbeg != '\r' && *pbeg != '\n') - break; - } + for (; pbeg < qend && (*pbeg == '\r' || *pbeg == '\n'); pbeg++) + ; // find end of the next line - for (pend= pbeg + 1; - ++cnt <= m_query_len && *pend != '\r' && *pend != '\n'; - pend++) + for (pend= pbeg + 1; pend < qend && *pend != '\r' && *pend != '\n'; pend++) ; // print next line - if (my_b_write(&pinfo->head_cache, (const uchar*) "#Q> ", 4) || - my_b_write(&pinfo->head_cache, (const uchar*) pbeg, pend - pbeg) || - my_b_write(&pinfo->head_cache, (const uchar*) "\n", 1)) + if (pbeg < qend && + (my_b_write(&pinfo->head_cache, (const uchar*) "#Q> ", 4) || + my_b_write(&pinfo->head_cache, (const uchar*) pbeg, pend - pbeg) || + my_b_write(&pinfo->head_cache, (const uchar*) "\n", 1))) goto err; } @@ -3828,6 +3821,7 @@ bzero(time_zone_str, sizeof(time_zone_str)); delimiter[0]= ';'; delimiter[1]= 0; + gtid_ev_flags2= 0; flags2_inited= 0; flags2= 0; sql_mode_inited= 0; @@ -3863,6 +3857,11 @@ #endif } +my_bool st_print_event_info::is_xa_trans() +{ + return (gtid_ev_flags2 & + (Gtid_log_event::FL_PREPARED_XA | Gtid_log_event::FL_COMPLETED_XA)); +} bool copy_event_cache_to_string_and_reinit(IO_CACHE *cache, LEX_STRING *to) { @@ -3934,7 +3933,7 @@ print_event_info->allow_parallel != !!(flags2 & FL_ALLOW_PARALLEL)) { if (my_b_printf(&cache, - "/*!100101 SET @@session.skip_parallel_replication=%u*/%s\n", + "/*M!100101 SET @@session.skip_parallel_replication=%u*/%s\n", !(flags2 & FL_ALLOW_PARALLEL), print_event_info->delimiter)) goto err; @@ -3946,7 +3945,7 @@ print_event_info->domain_id != domain_id) { if (my_b_printf(&cache, - "/*!100001 SET @@session.gtid_domain_id=%u*/%s\n", + "/*M!100001 SET @@session.gtid_domain_id=%u*/%s\n", domain_id, print_event_info->delimiter)) goto err; print_event_info->domain_id= domain_id; @@ -3956,7 +3955,7 @@ if (!print_event_info->server_id_printed || print_event_info->server_id != server_id) { - if (my_b_printf(&cache, "/*!100001 SET @@session.server_id=%u*/%s\n", + if (my_b_printf(&cache, "/*M!100001 SET @@session.server_id=%u*/%s\n", server_id, print_event_info->delimiter)) goto err; print_event_info->server_id= server_id; @@ -3964,7 +3963,7 @@ } if (!is_flashback) - if (my_b_printf(&cache, "/*!100001 SET @@session.gtid_seq_no=%s*/%s\n", + if (my_b_printf(&cache, "/*M!100001 SET @@session.gtid_seq_no=%s*/%s\n", buf, print_event_info->delimiter)) goto err; } @@ -3983,6 +3982,8 @@ goto err; } + print_event_info->gtid_ev_flags2= flags2; + return cache.flush_data(); err: return 1; diff -Nru mariadb-10.11.6/sql/log_event_data_type.h mariadb-10.11.9/sql/log_event_data_type.h --- mariadb-10.11.6/sql/log_event_data_type.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/log_event_data_type.h 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,74 @@ +/* Copyright (c) 2024, MariaDB Corporation. + + 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; version 2 of the License. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#ifndef LOG_EVENT_DATA_TYPE_H +#define LOG_EVENT_DATA_TYPE_H + +class Log_event_data_type +{ +public: + + enum { + CHUNK_SIGNED= 0, + CHUNK_UNSIGNED= 1, + CHUNK_DATA_TYPE_NAME= 2 + }; + +protected: + LEX_CSTRING m_data_type_name; + Item_result m_type; + uint m_charset_number; + bool m_is_unsigned; + +public: + + Log_event_data_type() + :m_data_type_name({NULL,0}), + m_type(STRING_RESULT), + m_charset_number(my_charset_bin.number), + m_is_unsigned(false) + { } + + Log_event_data_type(const LEX_CSTRING &data_type_name_arg, + Item_result type_arg, + uint charset_number_arg, + bool is_unsigned_arg) + :m_data_type_name(data_type_name_arg), + m_type(type_arg), + m_charset_number(charset_number_arg), + m_is_unsigned(is_unsigned_arg) + { } + + const LEX_CSTRING & data_type_name() const + { + return m_data_type_name; + } + Item_result type() const + { + return m_type; + } + uint charset_number() const + { + return m_charset_number; + } + bool is_unsigned() const + { + return m_is_unsigned; + } + + bool unpack_optional_attributes(const char *str, const char *end); +}; + +#endif // LOG_EVENT_DATA_TYPE_H diff -Nru mariadb-10.11.6/sql/log_event_old.cc mariadb-10.11.9/sql/log_event_old.cc --- mariadb-10.11.6/sql/log_event_old.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log_event_old.cc 2024-08-03 07:29:59.000000000 +0000 @@ -27,7 +27,10 @@ #include "lock.h" // mysql_unlock_tables #include "rpl_rli.h" #include "rpl_utility.h" -#endif +#ifdef WITH_WSREP +#include "wsrep_mysqld.h" +#endif /* WITH_WSREP */ +#endif /* MYSQL_CLIENT */ #include "log_event_old.h" #include "rpl_record_old.h" #include "transaction.h" @@ -47,12 +50,12 @@ const Relay_log_info *rli= rgi->rli; /* - If m_table_id == ~0UL, then we have a dummy event that does not + If m_table_id == UINT32_MAX, then we have a dummy event that does not contain any data. In that case, we just remove all tables in the tables_to_lock list, close the thread tables, and return with success. */ - if (ev->m_table_id == ~0UL) + if (ev->m_table_id == UINT32_MAX) { /* This one is supposed to be set: just an extra check so that @@ -205,7 +208,10 @@ TIMESTAMP column to a table with one. So we call set_time(), like in SBR. Presently it changes nothing. */ - ev_thd->set_time(ev->when, ev->when_sec_part); +#ifdef WITH_WSREP + if (!wsrep_thd_is_applying(thd)) +#endif + ev_thd->set_time(ev->when, ev->when_sec_part); /* There are a few flags that are replicated with each row event. Make sure to set/clear them before executing the main body of @@ -1123,13 +1129,14 @@ **************************************************************************/ #ifndef MYSQL_CLIENT -Old_rows_log_event::Old_rows_log_event(THD *thd_arg, TABLE *tbl_arg, ulong tid, +Old_rows_log_event::Old_rows_log_event(THD *thd_arg, TABLE *tbl_arg, + ulonglong table_id, MY_BITMAP const *cols, bool is_transactional) : Log_event(thd_arg, 0, is_transactional), m_row_count(0), m_table(tbl_arg), - m_table_id(tid), + m_table_id(table_id), m_width(tbl_arg ? tbl_arg->s->fields : 1), m_rows_buf(0), m_rows_cur(0), m_rows_end(0), m_flags(0) #ifdef HAVE_REPLICATION @@ -1142,12 +1149,12 @@ /* We allow a special form of dummy event when the table, and cols - are null and the table id is ~0UL. This is a temporary + are null and the table id is UINT32_MAX. This is a temporary solution, to be able to terminate a started statement in the binary log: the extraneous events will be removed in the future. */ - DBUG_ASSERT((tbl_arg && tbl_arg->s && tid != ~0UL) || - (!tbl_arg && !cols && tid == ~0UL)); + DBUG_ASSERT((tbl_arg && tbl_arg->s && table_id != UINT32_MAX) || + (!tbl_arg && !cols && table_id == UINT32_MAX)); if (thd_arg->variables.option_bits & OPTION_NO_FOREIGN_KEY_CHECKS) set_flags(NO_FOREIGN_KEY_CHECKS_F); @@ -1155,20 +1162,12 @@ set_flags(RELAXED_UNIQUE_CHECKS_F); /* if my_bitmap_init fails, caught in is_valid() */ if (likely(!my_bitmap_init(&m_cols, - m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, - m_width))) + m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, + m_width))) { /* Cols can be zero if this is a dummy binrows event */ if (likely(cols != NULL)) - { - memcpy(m_cols.bitmap, cols->bitmap, no_bytes_in_map(cols)); - create_last_word_mask(&m_cols); - } - } - else - { - // Needed because my_bitmap_init() does not set it to null on failure - m_cols.bitmap= 0; + bitmap_copy(&m_cols, cols); } } #endif @@ -1208,7 +1207,7 @@ } else { - m_table_id= (ulong) uint6korr(post_start); + m_table_id= (ulonglong) uint6korr(post_start); post_start+= RW_FLAGS_OFFSET; } @@ -1230,25 +1229,20 @@ /* if my_bitmap_init fails, caught in is_valid() */ if (likely(!my_bitmap_init(&m_cols, - m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, - m_width))) + m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, + m_width))) { DBUG_PRINT("debug", ("Reading from %p", ptr_after_width)); - memcpy(m_cols.bitmap, ptr_after_width, (m_width + 7) / 8); - create_last_word_mask(&m_cols); + bitmap_import(&m_cols, ptr_after_width); + DBUG_DUMP("m_cols", ptr_after_width, no_bytes_in_export_map(&m_cols)); ptr_after_width+= (m_width + 7) / 8; - DBUG_DUMP("m_cols", (uchar*) m_cols.bitmap, no_bytes_in_map(&m_cols)); } else - { - // Needed because my_bitmap_init() does not set it to null on failure - m_cols.bitmap= NULL; DBUG_VOID_RETURN; - } const uchar* const ptr_rows_data= (const uchar*) ptr_after_width; size_t const data_size= event_len - (ptr_rows_data - (const uchar *) buf); - DBUG_PRINT("info",("m_table_id: %lu m_flags: %d m_width: %lu data_size: %zu", + DBUG_PRINT("info",("m_table_id: %llu m_flags: %d m_width: %lu data_size: %zu", m_table_id, m_flags, m_width, data_size)); DBUG_DUMP("rows_data", (uchar*) ptr_rows_data, data_size); @@ -1262,8 +1256,6 @@ m_rows_cur= m_rows_end; memcpy(m_rows_buf, ptr_rows_data, data_size); } - else - m_cols.bitmap= 0; // to not free it DBUG_VOID_RETURN; } @@ -1271,8 +1263,6 @@ Old_rows_log_event::~Old_rows_log_event() { - if (m_cols.bitmap == m_bitbuf) // no my_malloc happened - m_cols.bitmap= 0; // so no my_free in my_bitmap_free my_bitmap_free(&m_cols); // To pair with my_bitmap_init(). my_free(m_rows_buf); } @@ -1284,10 +1274,10 @@ uchar *end= net_store_length(buf, (m_width + 7) / 8); DBUG_EXECUTE_IF("old_row_based_repl_4_byte_map_id_master", - return (int)(6 + no_bytes_in_map(&m_cols) + (end - buf) + - m_rows_cur - m_rows_buf);); + return (int)(6 + no_bytes_in_export_map(&m_cols) + (end - buf) + + m_rows_cur - m_rows_buf);); int data_size= ROWS_HEADER_LEN; - data_size+= no_bytes_in_map(&m_cols); + data_size+= no_bytes_in_export_map(&m_cols); data_size+= (uint) (end - buf); data_size+= (uint) (m_rows_cur - m_rows_buf); @@ -1362,12 +1352,12 @@ Relay_log_info const *rli= rgi->rli; /* - If m_table_id == ~0UL, then we have a dummy event that does not + If m_table_id == UINT32_MAX, then we have a dummy event that does not contain any data. In that case, we just remove all tables in the tables_to_lock list, close the thread tables, and return with success. */ - if (m_table_id == ~0UL) + if (m_table_id == UINT32_MAX) { /* This one is supposed to be set: just an extra check so that @@ -1507,7 +1497,10 @@ TIMESTAMP column to a table with one. So we call set_time(), like in SBR. Presently it changes nothing. */ - thd->set_time(when, when_sec_part); +#ifdef WITH_WSREP + if (!wsrep_thd_is_applying(thd)) +#endif + thd->set_time(when, when_sec_part); /* There are a few flags that are replicated with each row event. Make sure to set/clear them before executing the main body of @@ -1784,10 +1777,10 @@ // This method should not be reached. assert(0); - DBUG_ASSERT(m_table_id != ~0UL); + DBUG_ASSERT(m_table_id != UINT32_MAX); DBUG_EXECUTE_IF("old_row_based_repl_4_byte_map_id_master", { - int4store(buf + 0, m_table_id); + int4store(buf + 0, (ulong) m_table_id); int2store(buf + 4, m_flags); return write_data(buf, 6); }); @@ -1805,6 +1798,8 @@ */ uchar sbuf[MAX_INT_WIDTH]; my_ptrdiff_t const data_size= m_rows_cur - m_rows_buf; + uint bitmap_size= no_bytes_in_export_map(&m_cols); + uchar *bitmap; // This method should not be reached. assert(0); @@ -1816,10 +1811,14 @@ DBUG_DUMP("m_width", sbuf, (size_t) (sbuf_end - sbuf)); res= res || write_data(sbuf, (size_t) (sbuf_end - sbuf)); - DBUG_DUMP("m_cols", (uchar*) m_cols.bitmap, no_bytes_in_map(&m_cols)); - res= res || write_data((uchar*)m_cols.bitmap, no_bytes_in_map(&m_cols)); + bitmap= (uchar*) my_alloca(bitmap_size); + bitmap_export(bitmap, &m_cols); + + DBUG_DUMP("m_cols", bitmap, no_bytes_in_export_map(&m_cols)); + res= res || write_data(bitmap, no_bytes_in_export_map(&m_cols)); DBUG_DUMP("rows", m_rows_buf, data_size); res= res || write_data(m_rows_buf, (size_t) data_size); + my_afree(bitmap); return res; @@ -1834,7 +1833,7 @@ char const *const flagstr= get_flags(STMT_END_F) ? " flags: STMT_END_F" : ""; size_t bytes= my_snprintf(buf, sizeof(buf), - "table_id: %lu%s", m_table_id, flagstr); + "table_id: %llu%s", m_table_id, flagstr); protocol->store(buf, bytes, &my_charset_bin); } #endif @@ -1856,9 +1855,10 @@ if (!print_event_info->short_form) { + char llbuff[22]; if (print_header(head, print_event_info, !do_print_encoded) || - my_b_printf(head, "\t%s: table id %lu%s\n", - name, m_table_id, + my_b_printf(head, "\t%s: table id %s%s\n", + name, ullstr(m_table_id, llbuff), do_print_encoded ? " flags: STMT_END_F" : "") || print_base64(body, print_event_info, do_print_encoded)) goto err; @@ -2398,7 +2398,7 @@ #if !defined(MYSQL_CLIENT) Write_rows_log_event_old::Write_rows_log_event_old(THD *thd_arg, TABLE *tbl_arg, - ulong tid_arg, + ulonglong tid_arg, MY_BITMAP const *cols, bool is_transactional) : Old_rows_log_event(thd_arg, tbl_arg, tid_arg, cols, is_transactional) @@ -2510,7 +2510,7 @@ #ifndef MYSQL_CLIENT Delete_rows_log_event_old::Delete_rows_log_event_old(THD *thd_arg, TABLE *tbl_arg, - ulong tid, + ulonglong tid, MY_BITMAP const *cols, bool is_transactional) : Old_rows_log_event(thd_arg, tbl_arg, tid, cols, is_transactional), @@ -2618,7 +2618,7 @@ #if !defined(MYSQL_CLIENT) Update_rows_log_event_old::Update_rows_log_event_old(THD *thd_arg, TABLE *tbl_arg, - ulong tid, + ulonglong tid, MY_BITMAP const *cols, bool is_transactional) : Old_rows_log_event(thd_arg, tbl_arg, tid, cols, is_transactional), diff -Nru mariadb-10.11.6/sql/log_event_old.h mariadb-10.11.9/sql/log_event_old.h --- mariadb-10.11.6/sql/log_event_old.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log_event_old.h 2024-08-03 07:29:59.000000000 +0000 @@ -111,12 +111,12 @@ flag_set get_flags(flag_set flags_arg) const { return m_flags & flags_arg; } #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) - virtual void pack_info(Protocol *protocol); + void pack_info(Protocol *protocol) override; #endif #ifdef MYSQL_CLIENT /* not for direct call, each derived has its own ::print() */ - virtual bool print(FILE *file, PRINT_EVENT_INFO *print_event_info)= 0; + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override= 0; #endif #ifndef MYSQL_CLIENT @@ -127,16 +127,19 @@ #endif /* Member functions to implement superclass interface */ - virtual int get_data_size(); + int get_data_size() override; MY_BITMAP const *get_cols() const { return &m_cols; } size_t get_width() const { return m_width; } - ulong get_table_id() const { return m_table_id; } + ulonglong get_table_id() const { return m_table_id; } #ifndef MYSQL_CLIENT - virtual bool write_data_header(); - virtual bool write_data_body(); - virtual const char *get_db() { return m_table->s->db.str; } + bool write_data_header() override; + bool write_data_body() override; + const char *get_db() override { return m_table->s->db.str; } +#ifdef HAVE_REPLICATION + bool is_part_of_group() override { return 1; } +#endif #endif /* Check that malloc() succeeded in allocating memory for the rows @@ -144,11 +147,10 @@ is valid is done in the Update_rows_log_event_old::is_valid() function. */ - virtual bool is_valid() const + bool is_valid() const override { return m_rows_buf && m_cols.bitmap; } - bool is_part_of_group() { return 1; } uint m_row_count; /* The number of rows added to the event */ @@ -158,7 +160,7 @@ this class, not create instances of this class. */ #ifndef MYSQL_CLIENT - Old_rows_log_event(THD*, TABLE*, ulong table_id, + Old_rows_log_event(THD*, TABLE*, ulonglong table_id, MY_BITMAP const *cols, bool is_transactional); #endif Old_rows_log_event(const uchar *row_data, uint event_len, @@ -176,15 +178,15 @@ #ifndef MYSQL_CLIENT TABLE *m_table; /* The table the rows belong to */ #endif - ulong m_table_id; /* Table ID */ + ulonglong m_table_id; /* Table ID */ MY_BITMAP m_cols; /* Bitmap denoting columns available */ ulong m_width; /* The width of the columns bitmap */ ulong m_master_reclength; /* Length of record on master side */ /* Bit buffers in the same memory as the class */ - uint32 m_bitbuf[128/(sizeof(uint32)*8)]; - uint32 m_bitbuf_ai[128/(sizeof(uint32)*8)]; + my_bitmap_map m_bitbuf[128/(sizeof(my_bitmap_map)*8)]; + my_bitmap_map m_bitbuf_ai[128/(sizeof(my_bitmap_map)*8)]; uchar *m_rows_buf; /* The rows in packed format */ uchar *m_rows_cur; /* One-after the end of the data */ @@ -215,9 +217,9 @@ private: #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) - virtual int do_apply_event(rpl_group_info *rgi); - virtual int do_update_pos(rpl_group_info *rgi); - virtual enum_skip_reason do_shall_skip(rpl_group_info *rgi); + int do_apply_event(rpl_group_info *rgi) override; + int do_update_pos(rpl_group_info *rgi) override; + enum_skip_reason do_shall_skip(rpl_group_info *rgi) override; /* Primitive to prepare for a sequence of row executions. @@ -359,7 +361,7 @@ /********** BEGIN CUT & PASTE FROM Write_rows_log_event **********/ public: #if !defined(MYSQL_CLIENT) - Write_rows_log_event_old(THD*, TABLE*, ulong table_id, + Write_rows_log_event_old(THD*, TABLE*, ulonglong table_id, MY_BITMAP const *cols, bool is_transactional); #endif #ifdef HAVE_REPLICATION @@ -379,13 +381,13 @@ private: #ifdef MYSQL_CLIENT - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) - virtual int do_before_row_operations(const Slave_reporting_capability *const); - virtual int do_after_row_operations(const Slave_reporting_capability *const,int); - virtual int do_exec_row(rpl_group_info *); + int do_before_row_operations(const Slave_reporting_capability *const) override; + int do_after_row_operations(const Slave_reporting_capability *const,int) override; + int do_exec_row(rpl_group_info *) override; #endif /********** END OF CUT & PASTE FROM Write_rows_log_event **********/ @@ -397,19 +399,19 @@ }; private: - virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; } + Log_event_type get_type_code() override { return (Log_event_type)TYPE_CODE; } #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) // use old definition of do_apply_event() - virtual int do_apply_event(rpl_group_info *rgi) + int do_apply_event(rpl_group_info *rgi) override { return Old_rows_log_event::do_apply_event(this, rgi); } // primitives for old version of do_apply_event() - virtual int do_before_row_operations(TABLE *table); - virtual int do_after_row_operations(TABLE *table, int error); + int do_before_row_operations(TABLE *table) override; + int do_after_row_operations(TABLE *table, int error) override; virtual int do_prepare_row(THD*, rpl_group_info*, TABLE*, - uchar const *row_start, uchar const **row_end); - virtual int do_exec_row(TABLE *table); + uchar const *row_start, uchar const **row_end) override; + int do_exec_row(TABLE *table) override; #endif }; @@ -430,7 +432,7 @@ /********** BEGIN CUT & PASTE FROM Update_rows_log_event **********/ public: #ifndef MYSQL_CLIENT - Update_rows_log_event_old(THD*, TABLE*, ulong table_id, + Update_rows_log_event_old(THD*, TABLE*, ulonglong table_id, MY_BITMAP const *cols, bool is_transactional); #endif @@ -455,13 +457,13 @@ protected: #ifdef MYSQL_CLIENT - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) - virtual int do_before_row_operations(const Slave_reporting_capability *const); - virtual int do_after_row_operations(const Slave_reporting_capability *const,int); - virtual int do_exec_row(rpl_group_info *); + int do_before_row_operations(const Slave_reporting_capability *const) override; + int do_after_row_operations(const Slave_reporting_capability *const,int) override; + int do_exec_row(rpl_group_info *) override; #endif /* !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) */ /********** END OF CUT & PASTE FROM Update_rows_log_event **********/ @@ -475,19 +477,19 @@ }; private: - virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; } + Log_event_type get_type_code() override { return (Log_event_type)TYPE_CODE; } #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) // use old definition of do_apply_event() - virtual int do_apply_event(rpl_group_info *rgi) + int do_apply_event(rpl_group_info *rgi) override { return Old_rows_log_event::do_apply_event(this, rgi); } // primitives for old version of do_apply_event() - virtual int do_before_row_operations(TABLE *table); - virtual int do_after_row_operations(TABLE *table, int error); + int do_before_row_operations(TABLE *table) override; + int do_after_row_operations(TABLE *table, int error) override; virtual int do_prepare_row(THD*, rpl_group_info*, TABLE*, - uchar const *row_start, uchar const **row_end); - virtual int do_exec_row(TABLE *table); + uchar const *row_start, uchar const **row_end) override; + int do_exec_row(TABLE *table) override; #endif /* !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) */ }; @@ -507,7 +509,7 @@ /********** BEGIN CUT & PASTE FROM Update_rows_log_event **********/ public: #ifndef MYSQL_CLIENT - Delete_rows_log_event_old(THD*, TABLE*, ulong, + Delete_rows_log_event_old(THD*, TABLE*, ulonglong, MY_BITMAP const *cols, bool is_transactional); #endif #ifdef HAVE_REPLICATION @@ -529,13 +531,13 @@ protected: #ifdef MYSQL_CLIENT - bool print(FILE *file, PRINT_EVENT_INFO *print_event_info); + bool print(FILE *file, PRINT_EVENT_INFO *print_event_info) override; #endif #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) - virtual int do_before_row_operations(const Slave_reporting_capability *const); - virtual int do_after_row_operations(const Slave_reporting_capability *const,int); - virtual int do_exec_row(rpl_group_info *); + int do_before_row_operations(const Slave_reporting_capability *const) override; + int do_after_row_operations(const Slave_reporting_capability *const,int) override; + int do_exec_row(rpl_group_info *) override; #endif /********** END CUT & PASTE FROM Delete_rows_log_event **********/ @@ -549,19 +551,19 @@ }; private: - virtual Log_event_type get_type_code() { return (Log_event_type)TYPE_CODE; } + Log_event_type get_type_code() override { return (Log_event_type)TYPE_CODE; } #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) // use old definition of do_apply_event() - virtual int do_apply_event(rpl_group_info *rgi) + int do_apply_event(rpl_group_info *rgi) override { return Old_rows_log_event::do_apply_event(this, rgi); } // primitives for old version of do_apply_event() - virtual int do_before_row_operations(TABLE *table); - virtual int do_after_row_operations(TABLE *table, int error); + int do_before_row_operations(TABLE *table) override; + int do_after_row_operations(TABLE *table, int error) override; virtual int do_prepare_row(THD*, rpl_group_info*, TABLE*, - uchar const *row_start, uchar const **row_end); - virtual int do_exec_row(TABLE *table); + uchar const *row_start, uchar const **row_end) override; + int do_exec_row(TABLE *table) override; #endif }; diff -Nru mariadb-10.11.6/sql/log_event_server.cc mariadb-10.11.9/sql/log_event_server.cc --- mariadb-10.11.6/sql/log_event_server.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/log_event_server.cc 2024-08-03 07:29:59.000000000 +0000 @@ -918,6 +918,10 @@ int Log_event_writer::write_data(const uchar *pos, size_t len) { DBUG_ENTER("Log_event_writer::write_data"); + + if (!len) + DBUG_RETURN(0); + if (checksum_len) crc= my_checksum(crc, pos, len); @@ -1463,7 +1467,7 @@ is created we create tables with thd->variables.wsrep_on=false to avoid replicating wsrep_schema tables to other nodes. */ - if (WSREP_ON && !is_trans_keyword()) + if (WSREP_ON && !is_trans_keyword(false)) { thd->wsrep_PA_safe= false; } @@ -1964,16 +1968,28 @@ ::do_apply_event(), then the companion SET also have so we don't need to reset_one_shot_variables(). */ - if (is_trans_keyword() || rpl_filter->db_ok(thd->db.str)) + if (rpl_filter->is_db_empty() || + is_trans_keyword( + (rgi->gtid_ev_flags2 & (Gtid_log_event::FL_PREPARED_XA | + Gtid_log_event::FL_COMPLETED_XA))) || + rpl_filter->db_ok(thd->db.str)) { bool is_rb_alter= gtid_flags_extra & Gtid_log_event::FL_ROLLBACK_ALTER_E1; - thd->set_time(when, when_sec_part); +#ifdef WITH_WSREP + if (!wsrep_thd_is_applying(thd)) +#endif + thd->set_time(when, when_sec_part); thd->set_query_and_id((char*)query_arg, q_len_arg, thd->charset(), next_query_id()); thd->variables.pseudo_thread_id= thread_id; // for temp tables DBUG_PRINT("query",("%s", thd->query())); +#ifdef WITH_WSREP + WSREP_DEBUG("Query_log_event thread=%llu for query=%s", + thd_get_thread_id(thd), wsrep_thd_query(thd)); +#endif + if (unlikely(!(expected_error= !is_rb_alter ? error_code : 0)) || ignored_error_code(expected_error) || !unexpected_error_code(expected_error)) @@ -2305,6 +2321,16 @@ actual_error == ER_CONNECTION_KILLED) thd->reset_killed(); } + else if (actual_error == ER_XAER_NOTA && !rpl_filter->db_ok(get_db())) + { + /* + If there is an XA query whos XID cannot be found, if the replication + filter is active and filters the target database, assume that the XID + cache has been cleared (e.g. by server restart) since it was prepared, + so we can just ignore this event. + */ + thd->clear_error(1); + } /* Other cases: mostly we expected no error and get one. */ @@ -3130,7 +3156,7 @@ thd->lex->local_file= local_fname; thd->reset_for_next_command(0); // Errors are cleared above - /* + /* We test replicate_*_db rules. Note that we have already prepared the file to load, even if we are going to ignore and delete it now. So it is possible that we did a lot of disk writes for @@ -3143,7 +3169,6 @@ filtering in the I/O thread (more efficient: no disk writes at all). - Note: We do not need to execute reset_one_shot_variables() if this db_ok() test fails. Reason: The db stored in binlog events is the same for SET and for @@ -3155,7 +3180,10 @@ */ if (rpl_filter->db_ok(thd->db.str)) { - thd->set_time(when, when_sec_part); +#ifdef WITH_WSREP + if (!wsrep_thd_is_applying(thd)) +#endif + thd->set_time(when, when_sec_part); thd->set_query_id(next_query_id()); thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); @@ -3721,28 +3749,43 @@ write_len= GTID_HEADER_LEN + 2; } - if (flags2 & (FL_PREPARED_XA | FL_COMPLETED_XA)) + if (flags2 & (FL_PREPARED_XA | FL_COMPLETED_XA) + && !DBUG_IF("negate_xid_from_gtid")) { int4store(&buf[write_len], xid.formatID); buf[write_len +4]= (uchar) xid.gtrid_length; buf[write_len +4+1]= (uchar) xid.bqual_length; write_len+= 6; long data_length= xid.bqual_length + xid.gtrid_length; - memcpy(buf+write_len, xid.data, data_length); - write_len+= data_length; + + if (!DBUG_IF("negate_xid_data_from_gtid")) + { + memcpy(buf+write_len, xid.data, data_length); + write_len+= data_length; + } } + + DBUG_EXECUTE_IF("inject_fl_extra_multi_engine_into_gtid", { + flags_extra|= FL_EXTRA_MULTI_ENGINE_E1; + }); if (flags_extra > 0) { buf[write_len]= flags_extra; write_len++; } + DBUG_EXECUTE_IF("inject_fl_extra_multi_engine_into_gtid", { + flags_extra&= ~FL_EXTRA_MULTI_ENGINE_E1; + }); + if (flags_extra & FL_EXTRA_MULTI_ENGINE_E1) { buf[write_len]= extra_engines; write_len++; } - if (flags_extra & (FL_COMMIT_ALTER_E1 | FL_ROLLBACK_ALTER_E1)) + if (flags_extra & (FL_COMMIT_ALTER_E1 | FL_ROLLBACK_ALTER_E1) + && !DBUG_IF("negate_alter_fl_from_gtid") + ) { int8store(buf + write_len, sa_seq_no); write_len+= 8; @@ -4385,6 +4428,9 @@ thd->wsrep_affected_rows= 0; #endif +#ifndef DBUG_OFF + bool record_gtid_delayed_for_xa= false; +#endif if (rgi->gtid_pending) { sub_id= rgi->gtid_sub_id; @@ -4403,6 +4449,10 @@ return 1; }); } +#ifndef DBUG_OFF + else + record_gtid_delayed_for_xa= true; +#endif } general_log_print(thd, COM_QUERY, get_query()); @@ -4412,6 +4462,22 @@ { DBUG_ASSERT(!thd->transaction->xid_state.is_explicit_XA()); + DBUG_ASSERT(record_gtid_delayed_for_xa); + if (thd->rgi_slave->is_parallel_exec) + { + /* + With XA, since the transaction is prepared/committed without updating + the GTID pos (MDEV-32020...), we need here to clear any pending + deadlock kill. + + Otherwise if the kill happened after the prepare/commit completed, it + might end up killing the subsequent GTID position update, causing the + slave to fail with error. + */ + wait_for_pending_deadlock_kill(thd, thd->rgi_slave); + thd->reset_killed(); + } + if ((err= do_record_gtid(thd, rgi, false, &hton, true))) return err; } @@ -4518,7 +4584,8 @@ thd->lex->xid= &xid; if (!one_phase) { - if ((res= thd->wait_for_prior_commit())) + if (thd->is_current_stmt_binlog_disabled() && + (res= thd->wait_for_prior_commit())) return res; thd->lex->sql_command= SQLCOM_XA_PREPARE; @@ -4561,11 +4628,16 @@ #if defined(HAVE_REPLICATION) static bool user_var_append_name_part(THD *thd, String *buf, - const char *name, size_t name_len) + const char *name, size_t name_len, + const LEX_CSTRING &data_type_name) { return buf->append('@') || append_identifier(thd, buf, name, name_len) || - buf->append('='); + buf->append('=') || + (data_type_name.length && + (buf->append(STRING_WITH_LEN("/*")) || + buf->append(data_type_name.str, data_type_name.length) || + buf->append(STRING_WITH_LEN("*/")))); } void User_var_log_event::pack_info(Protocol* protocol) @@ -4575,14 +4647,15 @@ char buf_mem[FN_REFLEN+7]; String buf(buf_mem, sizeof(buf_mem), system_charset_info); buf.length(0); - if (user_var_append_name_part(protocol->thd, &buf, name, name_len) || + if (user_var_append_name_part(protocol->thd, &buf, name, name_len, + m_data_type_name) || buf.append(NULL_clex_str)) return; protocol->store(buf.ptr(), buf.length(), &my_charset_bin); } else { - switch (type) { + switch (m_type) { case REAL_RESULT: { double real_val; @@ -4591,7 +4664,8 @@ String buf(buf_mem, sizeof(buf_mem), system_charset_info); float8get(real_val, val); buf.length(0); - if (user_var_append_name_part(protocol->thd, &buf, name, name_len) || + if (user_var_append_name_part(protocol->thd, &buf, name, name_len, + m_data_type_name) || buf.append(buf2, my_gcvt(real_val, MY_GCVT_ARG_DOUBLE, MY_GCVT_MAX_FIELD_WIDTH, buf2, NULL))) return; @@ -4604,10 +4678,11 @@ char buf_mem[FN_REFLEN + 22]; String buf(buf_mem, sizeof(buf_mem), system_charset_info); buf.length(0); - if (user_var_append_name_part(protocol->thd, &buf, name, name_len) || + if (user_var_append_name_part(protocol->thd, &buf, name, name_len, + m_data_type_name) || buf.append(buf2, longlong10_to_str(uint8korr(val), buf2, - ((flags & User_var_log_event::UNSIGNED_F) ? 10 : -10))-buf2)) + (is_unsigned() ? 10 : -10))-buf2)) return; protocol->store(buf.ptr(), buf.length(), &my_charset_bin); break; @@ -4620,7 +4695,8 @@ String str(buf2, sizeof(buf2), &my_charset_bin); buf.length(0); my_decimal((const uchar *) (val + 2), val[0], val[1]).to_string(&str); - if (user_var_append_name_part(protocol->thd, &buf, name, name_len) || + if (user_var_append_name_part(protocol->thd, &buf, name, name_len, + m_data_type_name) || buf.append(str)) return; protocol->store(buf.ptr(), buf.length(), &my_charset_bin); @@ -4636,7 +4712,7 @@ String buf(buf_mem, sizeof(buf_mem), system_charset_info); CHARSET_INFO *cs; buf.length(0); - if (!(cs= get_charset(charset_number, MYF(0)))) + if (!(cs= get_charset(m_charset_number, MYF(0)))) { if (buf.append(STRING_WITH_LEN("???"))) return; @@ -4645,7 +4721,8 @@ { size_t old_len; char *beg, *end; - if (user_var_append_name_part(protocol->thd, &buf, name, name_len) || + if (user_var_append_name_part(protocol->thd, &buf, name, name_len, + m_data_type_name) || buf.append('_') || buf.append(cs->cs_name) || buf.append(' ')) @@ -4693,10 +4770,10 @@ } else { - buf1[1]= type; - int4store(buf1 + 2, charset_number); + buf1[1]= m_type; + int4store(buf1 + 2, m_charset_number); - switch (type) { + switch (m_type) { case REAL_RESULT: float8store(buf2, *(double*) val); break; @@ -4726,15 +4803,28 @@ buf1_length= 10; } + uchar data_type_name_chunk_signature= (uchar) CHUNK_DATA_TYPE_NAME; + uint data_type_name_chunk_signature_length= m_data_type_name.length ? 1 : 0; + uchar data_type_name_length_length= m_data_type_name.length ? 1 : 0; + /* Length of the whole event */ - event_length= sizeof(buf)+ name_len + buf1_length + val_len + unsigned_len; + event_length= sizeof(buf)+ name_len + buf1_length + val_len + unsigned_len + + data_type_name_chunk_signature_length + + data_type_name_length_length + + (uint) m_data_type_name.length; + uchar unsig= m_is_unsigned ? CHUNK_UNSIGNED : CHUNK_SIGNED; + uchar data_type_name_length= (uchar) m_data_type_name.length; return write_header(event_length) || write_data(buf, sizeof(buf)) || write_data(name, name_len) || write_data(buf1, buf1_length) || write_data(pos, val_len) || - write_data(&flags, unsigned_len) || + write_data(&unsig, unsigned_len) || + write_data(&data_type_name_chunk_signature, + data_type_name_chunk_signature_length) || + write_data(&data_type_name_length, data_type_name_length_length) || + write_data(m_data_type_name.str, (uint) m_data_type_name.length) || write_footer(); } @@ -4758,7 +4848,7 @@ current_thd->query_id= query_id; /* recreating original time context */ } - if (!(charset= get_charset(charset_number, MYF(MY_WME)))) + if (!(charset= get_charset(m_charset_number, MYF(MY_WME)))) { rgi->rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, ER_THD(thd, ER_SLAVE_FATAL_ERROR), @@ -4777,7 +4867,7 @@ } else { - switch (type) { + switch (m_type) { case REAL_RESULT: if (val_len != 8) { @@ -4841,13 +4931,10 @@ if (e->fix_fields(thd, 0)) DBUG_RETURN(1); - /* - A variable can just be considered as a table with - a single record and with a single column. Thus, like - a column value, it could always have IMPLICIT derivation. - */ - e->update_hash((void*) val, val_len, type, charset, - (flags & User_var_log_event::UNSIGNED_F)); + const Type_handler *th= Type_handler::handler_by_log_event_data_type(thd, + *this); + e->update_hash((void*) val, val_len, th, charset); + if (!is_deferred()) free_root(thd->mem_root, 0); else @@ -5575,13 +5662,14 @@ Rows_log_event member functions **************************************************************************/ -Rows_log_event::Rows_log_event(THD *thd_arg, TABLE *tbl_arg, ulong tid, +Rows_log_event::Rows_log_event(THD *thd_arg, TABLE *tbl_arg, + ulonglong table_id, MY_BITMAP const *cols, bool is_transactional, Log_event_type event_type) : Log_event(thd_arg, 0, is_transactional), m_row_count(0), m_table(tbl_arg), - m_table_id(tid), + m_table_id(table_id), m_width(tbl_arg ? tbl_arg->s->fields : 1), m_rows_buf(0), m_rows_cur(0), m_rows_end(0), m_flags(0), m_type(event_type), m_extra_row_data(0) @@ -5593,12 +5681,13 @@ { /* We allow a special form of dummy event when the table, and cols - are null and the table id is ~0UL. This is a temporary + are null and the table id is UINT32_MAX. This is a temporary solution, to be able to terminate a started statement in the binary log: the extraneous events will be removed in the future. */ - DBUG_ASSERT((tbl_arg && tbl_arg->s && tid != ~0UL) || - (!tbl_arg && !cols && tid == ~0UL)); + DBUG_ASSERT((tbl_arg && tbl_arg->s && + (table_id & MAX_TABLE_MAP_ID) != UINT32_MAX) || + (!tbl_arg && !cols && (table_id & MAX_TABLE_MAP_ID) == UINT32_MAX)); if (thd_arg->variables.option_bits & OPTION_NO_FOREIGN_KEY_CHECKS) set_flags(NO_FOREIGN_KEY_CHECKS_F); @@ -5608,20 +5697,12 @@ set_flags(NO_CHECK_CONSTRAINT_CHECKS_F); /* if my_bitmap_init fails, caught in is_valid() */ if (likely(!my_bitmap_init(&m_cols, - m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, - m_width))) + m_width <= sizeof(m_bitbuf)*8 ? m_bitbuf : NULL, + m_width))) { /* Cols can be zero if this is a dummy binrows event */ if (likely(cols != NULL)) - { - memcpy(m_cols.bitmap, cols->bitmap, no_bytes_in_map(cols)); - create_last_word_mask(&m_cols); - } - } - else - { - // Needed because my_bitmap_init() does not set it to null on failure - m_cols.bitmap= 0; + bitmap_copy(&m_cols, cols); } } @@ -5745,12 +5826,12 @@ LEX *lex= thd->lex; uint8 new_trg_event_map= get_trg_event_map(); /* - If m_table_id == ~0ULL, then we have a dummy event that does not + If m_table_id == UINT32_MAX, then we have a dummy event that does not contain any data. In that case, we just remove all tables in the tables_to_lock list, close the thread tables, and return with success. */ - if (m_table_id == ~0ULL) + if (m_table_id == UINT32_MAX) { /* This one is supposed to be set: just an extra check so that @@ -6056,21 +6137,21 @@ which tested replicate-* rules). */ - if (m_width == table->s->fields && bitmap_is_set_all(&m_cols)) + if (m_width == table->s->fields && bitmap_is_set_all(&m_cols)) set_flags(COMPLETE_ROWS_F); - /* + /* Set tables write and read sets. - + Read_set contains all slave columns (in case we are going to fetch - a complete record from slave) - - Write_set equals the m_cols bitmap sent from master but it can be - longer if slave has extra columns. - */ + a complete record from slave). + + Write_set equals the m_cols bitmap sent from master but it can be + longer if slave has extra columns. + */ DBUG_PRINT_BITSET("debug", "Setting table's read_set from: %s", &m_cols); - + bitmap_set_all(table->read_set); if (get_general_type_code() == DELETE_ROWS_EVENT || get_general_type_code() == UPDATE_ROWS_EVENT) @@ -6086,9 +6167,12 @@ if (table->versioned()) { + bitmap_set_bit(table->read_set, table->s->vers.start_fieldno); bitmap_set_bit(table->write_set, table->s->vers.start_fieldno); + bitmap_set_bit(table->read_set, table->s->vers.end_fieldno); bitmap_set_bit(table->write_set, table->s->vers.end_fieldno); } + m_table->mark_columns_per_binlog_row_image(); this->slave_exec_mode= slave_exec_mode_options; // fix the mode @@ -6319,11 +6403,13 @@ Xid_log_event will come next which will, if some transactional engines are involved, commit the transaction and flush the pending event to the binlog. - If there was a deadlock the transaction should have been rolled back - already. So there should be no need to rollback the transaction. - */ - DBUG_ASSERT(! thd->transaction_rollback_request); - error|= (int)(error ? trans_rollback_stmt(thd) : trans_commit_stmt(thd)); + We check for thd->transaction_rollback_request because it is possible + there was a deadlock that was ignored by slave-skip-errors. Normally, the + deadlock would have been rolled back already. + */ + error|= (int) ((error || thd->transaction_rollback_request) + ? trans_rollback_stmt(thd) + : trans_commit_stmt(thd)); /* Now what if this is not a transactional engine? we still need to @@ -6412,10 +6498,10 @@ bool Rows_log_event::write_data_header() { uchar buf[ROWS_HEADER_LEN_V2]; // No need to init the buffer - DBUG_ASSERT(m_table_id != ~0ULL); + DBUG_ASSERT(m_table_id != UINT32_MAX); DBUG_EXECUTE_IF("old_row_based_repl_4_byte_map_id_master", { - int4store(buf + 0, m_table_id); + int4store(buf + 0, (ulong) m_table_id); int2store(buf + 4, m_flags); return (write_data(buf, 6)); }); @@ -6434,30 +6520,37 @@ my_ptrdiff_t const data_size= m_rows_cur - m_rows_buf; bool res= false; uchar *const sbuf_end= net_store_length(sbuf, (size_t) m_width); + uint bitmap_size= no_bytes_in_export_map(&m_cols); + uchar *bitmap; DBUG_ASSERT(static_cast(sbuf_end - sbuf) <= sizeof(sbuf)); DBUG_DUMP("m_width", sbuf, (size_t) (sbuf_end - sbuf)); res= res || write_data(sbuf, (size_t) (sbuf_end - sbuf)); - DBUG_DUMP("m_cols", (uchar*) m_cols.bitmap, no_bytes_in_map(&m_cols)); - res= res || write_data((uchar*)m_cols.bitmap, no_bytes_in_map(&m_cols)); + bitmap= (uchar*) my_alloca(bitmap_size); + bitmap_export(bitmap, &m_cols); + + DBUG_DUMP("m_cols", bitmap, bitmap_size); + res= res || write_data(bitmap, bitmap_size); /* TODO[refactor write]: Remove the "down cast" here (and elsewhere). */ if (get_general_type_code() == UPDATE_ROWS_EVENT) { - DBUG_DUMP("m_cols_ai", (uchar*) m_cols_ai.bitmap, - no_bytes_in_map(&m_cols_ai)); - res= res || write_data((uchar*)m_cols_ai.bitmap, - no_bytes_in_map(&m_cols_ai)); + DBUG_ASSERT(m_cols.n_bits == m_cols_ai.n_bits); + bitmap_export(bitmap, &m_cols_ai); + + DBUG_DUMP("m_cols_ai", bitmap, bitmap_size); + res= res || write_data(bitmap, bitmap_size); } DBUG_DUMP("rows", m_rows_buf, data_size); res= res || write_data(m_rows_buf, (size_t) data_size); + my_afree(bitmap); return res; - } + bool Rows_log_event::write_compressed() { uchar *m_rows_buf_tmp= m_rows_buf; @@ -6620,7 +6713,7 @@ Mats says tbl->s lives longer than this event so it's ok to copy pointers (tbl->s->db etc) and not pointer content. */ -Table_map_log_event::Table_map_log_event(THD *thd, TABLE *tbl, ulong tid, +Table_map_log_event::Table_map_log_event(THD *thd, TABLE *tbl, ulonglong tid, bool is_transactional) : Log_event(thd, 0, is_transactional), m_table(tbl), @@ -6643,7 +6736,7 @@ uchar cbuf[MAX_INT_WIDTH]; uchar *cbuf_end; DBUG_ENTER("Table_map_log_event::Table_map_log_event(TABLE)"); - DBUG_ASSERT(m_table_id != ~0ULL); + DBUG_ASSERT(m_table_id != UINT32_MAX); /* In TABLE_SHARE, "db" and "table_name" are 0-terminated (see this comment in table.cc / alloc_table_share(): @@ -6929,7 +7022,7 @@ char buf[256]; my_snprintf(buf, sizeof(buf), - "Found table map event mapping table id %u which " + "Found table map event mapping table id %llu which " "was already mapped but with different settings.", table_list->table_id); @@ -6970,11 +7063,11 @@ bool Table_map_log_event::write_data_header() { - DBUG_ASSERT(m_table_id != ~0ULL); + DBUG_ASSERT(m_table_id != UINT32_MAX); uchar buf[TABLE_MAP_HEADER_LEN]; DBUG_EXECUTE_IF("old_row_based_repl_4_byte_map_id_master", { - int4store(buf + 0, m_table_id); + int4store(buf + 0, (ulong) m_table_id); int2store(buf + 4, m_flags); return (write_data(buf, 6)); }); @@ -7410,7 +7503,7 @@ { char buf[256]; size_t bytes= my_snprintf(buf, sizeof(buf), - "table_id: %llu (%s.%s)", + "table_id: %llu (%s.%s)", m_table_id, m_dbnam, m_tblnam); protocol->store(buf, bytes, &my_charset_bin); } @@ -7425,7 +7518,7 @@ Constructor used to build an event for writing to the binary log. */ Write_rows_log_event::Write_rows_log_event(THD *thd_arg, TABLE *tbl_arg, - ulong tid_arg, + ulonglong tid_arg, bool is_transactional) :Rows_log_event(thd_arg, tbl_arg, tid_arg, tbl_arg->rpl_write_set, is_transactional, WRITE_ROWS_EVENT_V1) @@ -7435,7 +7528,7 @@ Write_rows_compressed_log_event::Write_rows_compressed_log_event( THD *thd_arg, TABLE *tbl_arg, - ulong tid_arg, + ulonglong tid_arg, bool is_transactional) : Write_rows_log_event(thd_arg, tbl_arg, tid_arg, is_transactional) { @@ -7521,7 +7614,7 @@ indexed and it cannot have a DEFAULT value). */ m_table->auto_increment_field_not_null= FALSE; - m_table->mark_auto_increment_column(); + m_table->mark_auto_increment_column(true); } return error; @@ -7741,6 +7834,8 @@ TODO: Add safety measures against infinite looping. */ + DBUG_EXECUTE_IF("write_row_inject_sleep_before_ha_write_row", + my_sleep(20000);); if (table->s->sequence) error= update_sequence(); else while (unlikely(error= table->file->ha_write_row(table->record[0]))) @@ -7936,6 +8031,7 @@ #if defined(WITH_WSREP) ! WSREP(thd) && #endif + table->in_use->rgi_slave && !(table->in_use->rgi_slave->gtid_ev_flags2 & Gtid_log_event::FL_DDL) && !(old_master= rpl_master_has_bug(thd->rgi_slave->rli, @@ -8238,6 +8334,12 @@ ? HA_ERR_KEY_NOT_FOUND : HA_ERR_RECORD_CHANGED; } +static int end_of_file_error(rpl_group_info *rgi) +{ + return rgi->speculation != rpl_group_info::SPECULATE_OPTIMISTIC + ? HA_ERR_END_OF_FILE : HA_ERR_RECORD_CHANGED; +} + /** Locate the current row in event's table. @@ -8482,6 +8584,8 @@ while ((error= table->file->ha_index_next(table->record[0]))) { DBUG_PRINT("info",("no record matching the given row found")); + if (error == HA_ERR_END_OF_FILE) + error= end_of_file_error(rgi); table->file->print_error(error, MYF(0)); table->file->ha_index_end(); goto end; @@ -8518,6 +8622,7 @@ break; case HA_ERR_END_OF_FILE: + error= end_of_file_error(rgi); DBUG_PRINT("info", ("Record not found")); table->file->ha_rnd_end(); goto end; @@ -8554,7 +8659,8 @@ */ Delete_rows_log_event::Delete_rows_log_event(THD *thd_arg, TABLE *tbl_arg, - ulong tid, bool is_transactional) + ulonglong tid, + bool is_transactional) : Rows_log_event(thd_arg, tbl_arg, tid, tbl_arg->read_set, is_transactional, DELETE_ROWS_EVENT_V1) { @@ -8562,7 +8668,7 @@ Delete_rows_compressed_log_event::Delete_rows_compressed_log_event( THD *thd_arg, TABLE *tbl_arg, - ulong tid_arg, + ulonglong tid_arg, bool is_transactional) : Delete_rows_log_event(thd_arg, tbl_arg, tid_arg, is_transactional) { @@ -8702,7 +8808,7 @@ Constructor used to build an event for writing to the binary log. */ Update_rows_log_event::Update_rows_log_event(THD *thd_arg, TABLE *tbl_arg, - ulong tid, + ulonglong tid, bool is_transactional) : Rows_log_event(thd_arg, tbl_arg, tid, tbl_arg->read_set, is_transactional, UPDATE_ROWS_EVENT_V1) @@ -8710,9 +8816,9 @@ init(tbl_arg->rpl_write_set); } -Update_rows_compressed_log_event::Update_rows_compressed_log_event(THD *thd_arg, TABLE *tbl_arg, - ulong tid, - bool is_transactional) +Update_rows_compressed_log_event:: +Update_rows_compressed_log_event(THD *thd_arg, TABLE *tbl_arg, + ulonglong tid, bool is_transactional) : Update_rows_log_event(thd_arg, tbl_arg, tid, is_transactional) { m_type = UPDATE_ROWS_COMPRESSED_EVENT_V1; @@ -8732,10 +8838,7 @@ { /* Cols can be zero if this is a dummy binrows event */ if (likely(cols != NULL)) - { - memcpy(m_cols_ai.bitmap, cols->bitmap, no_bytes_in_map(cols)); - create_last_word_mask(&m_cols_ai); - } + bitmap_copy(&m_cols_ai, cols); } } @@ -8799,11 +8902,6 @@ #endif /* WSREP_PROC_INFO */ thd_proc_info(thd, message); - // Temporary fix to find out why it fails [/Matz] - memcpy(m_table->read_set->bitmap, m_cols.bitmap, (m_table->read_set->n_bits + 7) / 8); - memcpy(m_table->write_set->bitmap, m_cols_ai.bitmap, (m_table->write_set->n_bits + 7) / 8); - - m_table->mark_columns_per_binlog_row_image(); int error= find_row(rgi); if (unlikely(error)) @@ -8909,7 +9007,6 @@ error= vers_insert_history_row(m_table); restore_record(m_table, record[2]); } - m_table->default_column_bitmaps(); if (invoke_triggers && likely(!error) && unlikely(process_triggers(TRG_EVENT_UPDATE, TRG_ACTION_AFTER, TRUE))) @@ -8933,6 +9030,7 @@ #endif +#if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) void Incident_log_event::pack_info(Protocol *protocol) { char buf[256]; @@ -8945,7 +9043,7 @@ m_incident, description(), m_message.str); protocol->store(buf, bytes, &my_charset_bin); } - +#endif #if defined(WITH_WSREP) /* @@ -9031,6 +9129,7 @@ } +#if defined(MYSQL_SERVER) && defined(HAVE_REPLICATION) /* Pack info for its unrecognized ignorable event */ void Ignorable_log_event::pack_info(Protocol *protocol) { @@ -9040,7 +9139,7 @@ number, description); protocol->store(buf, bytes, &my_charset_bin); } - +#endif #if defined(HAVE_REPLICATION) Heartbeat_log_event::Heartbeat_log_event(const uchar *buf, uint event_len, diff -Nru mariadb-10.11.6/sql/mdl.cc mariadb-10.11.9/sql/mdl.cc --- mariadb-10.11.6/sql/mdl.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/mdl.cc 2024-08-03 07:29:59.000000000 +0000 @@ -199,10 +199,10 @@ m_current_search_depth(0), m_found_deadlock(FALSE) {} - virtual bool enter_node(MDL_context *node); - virtual void leave_node(MDL_context *node); + bool enter_node(MDL_context *node) override; + void leave_node(MDL_context *node) override; - virtual bool inspect_edge(MDL_context *dest); + bool inspect_edge(MDL_context *dest) override; MDL_context *get_victim() const { return m_victim; } private: @@ -434,11 +434,11 @@ struct MDL_scoped_lock : public MDL_lock_strategy { MDL_scoped_lock() = default; - virtual const bitmap_t *incompatible_granted_types_bitmap() const + const bitmap_t *incompatible_granted_types_bitmap() const override { return m_granted_incompatible; } - virtual const bitmap_t *incompatible_waiting_types_bitmap() const + const bitmap_t *incompatible_waiting_types_bitmap() const override { return m_waiting_incompatible; } - virtual bool needs_notification(const MDL_ticket *ticket) const + bool needs_notification(const MDL_ticket *ticket) const override { return (ticket->get_type() == MDL_SHARED); } /** @@ -449,14 +449,14 @@ insert delayed. We need to kill such threads in order to get global shared lock. We do this my calling code outside of MDL. */ - virtual bool conflicting_locks(const MDL_ticket *ticket) const + bool conflicting_locks(const MDL_ticket *ticket) const override { return ticket->get_type() == MDL_INTENTION_EXCLUSIVE; } /* In scoped locks, only IX lock request would starve because of X/S. But that is practically very rare case. So just return 0 from this function. */ - virtual bitmap_t hog_lock_types_bitmap() const + bitmap_t hog_lock_types_bitmap() const override { return 0; } private: static const bitmap_t m_granted_incompatible[MDL_TYPE_END]; @@ -471,11 +471,11 @@ struct MDL_object_lock : public MDL_lock_strategy { MDL_object_lock() = default; - virtual const bitmap_t *incompatible_granted_types_bitmap() const + const bitmap_t *incompatible_granted_types_bitmap() const override { return m_granted_incompatible; } - virtual const bitmap_t *incompatible_waiting_types_bitmap() const + const bitmap_t *incompatible_waiting_types_bitmap() const override { return m_waiting_incompatible; } - virtual bool needs_notification(const MDL_ticket *ticket) const + bool needs_notification(const MDL_ticket *ticket) const override { return (MDL_BIT(ticket->get_type()) & (MDL_BIT(MDL_SHARED_NO_WRITE) | @@ -491,7 +491,7 @@ lock or some other non-MDL resource we might need to wake it up by calling code outside of MDL. */ - virtual bool conflicting_locks(const MDL_ticket *ticket) const + bool conflicting_locks(const MDL_ticket *ticket) const override { return ticket->get_type() < MDL_SHARED_UPGRADABLE; } /* @@ -499,7 +499,7 @@ max_write_lock_count times in a row while other lock types are waiting. */ - virtual bitmap_t hog_lock_types_bitmap() const + bitmap_t hog_lock_types_bitmap() const override { return (MDL_BIT(MDL_SHARED_NO_WRITE) | MDL_BIT(MDL_SHARED_NO_READ_WRITE) | @@ -515,11 +515,11 @@ struct MDL_backup_lock: public MDL_lock_strategy { MDL_backup_lock() = default; - virtual const bitmap_t *incompatible_granted_types_bitmap() const + const bitmap_t *incompatible_granted_types_bitmap() const override { return m_granted_incompatible; } - virtual const bitmap_t *incompatible_waiting_types_bitmap() const + const bitmap_t *incompatible_waiting_types_bitmap() const override { return m_waiting_incompatible; } - virtual bool needs_notification(const MDL_ticket *ticket) const + bool needs_notification(const MDL_ticket *ticket) const override { return (MDL_BIT(ticket->get_type()) & MDL_BIT(MDL_BACKUP_FTWRL1)); } @@ -529,7 +529,7 @@ We need to kill such threads in order to get lock for FTWRL statements. We do this by calling code outside of MDL. */ - virtual bool conflicting_locks(const MDL_ticket *ticket) const + bool conflicting_locks(const MDL_ticket *ticket) const override { return (MDL_BIT(ticket->get_type()) & (MDL_BIT(MDL_BACKUP_DML) | @@ -541,7 +541,7 @@ BACKUP statements. This scenario is partically useless in real world, so we just return 0 here. */ - virtual bitmap_t hog_lock_types_bitmap() const + bitmap_t hog_lock_types_bitmap() const override { return 0; } private: static const bitmap_t m_granted_incompatible[MDL_BACKUP_END]; @@ -673,8 +673,10 @@ { ((MDL_lock*)(arg + LF_HASH_OVERHEAD))->~MDL_lock(); } static void lf_hash_initializer(LF_HASH *hash __attribute__((unused)), - MDL_lock *lock, MDL_key *key_arg) + void *_lock, const void *_key_arg) { + MDL_lock *lock= static_cast(_lock); + const MDL_key *key_arg= static_cast(_key_arg); DBUG_ASSERT(key_arg->mdl_namespace() != MDL_key::BACKUP); new (&lock->key) MDL_key(key_arg); if (key_arg->mdl_namespace() == MDL_key::SCHEMA) @@ -760,8 +762,10 @@ }; -static my_bool mdl_iterate_lock(MDL_lock *lock, mdl_iterate_arg *arg) +static my_bool mdl_iterate_lock(void *lk, void *a) { + MDL_lock *lock= static_cast(lk); + mdl_iterate_arg *arg= static_cast(a); /* We can skip check for m_strategy here, becase m_granted must be empty for such locks anyway. @@ -784,14 +788,13 @@ { DBUG_ENTER("mdl_iterate"); mdl_iterate_arg argument= { callback, arg }; - LF_PINS *pins= mdl_locks.get_pins(); int res= 1; - if (pins) + if (LF_PINS *pins= mdl_locks.get_pins()) { res= mdl_iterate_lock(mdl_locks.m_backup_lock, &argument) || - lf_hash_iterate(&mdl_locks.m_locks, pins, - (my_hash_walk_action) mdl_iterate_lock, &argument); + lf_hash_iterate(&mdl_locks.m_locks, pins, mdl_iterate_lock, + &argument); lf_hash_put_pins(pins); } DBUG_RETURN(res); @@ -1195,15 +1198,8 @@ { #ifdef WITH_WSREP # ifdef ENABLED_DEBUG_SYNC - // Allow tests to block the applier thread using the DBUG facilities - DBUG_EXECUTE_IF("sync.wsrep_before_mdl_wait", - { - const char act[]= - "now " - "wait_for signal.wsrep_before_mdl_wait"; - DBUG_ASSERT(!debug_sync_set_action((owner->get_thd()), - STRING_WITH_LEN(act))); - };); + // Allow tests to block thread before MDL-wait + DEBUG_SYNC(owner->get_thd(), "wsrep_before_mdl_wait"); # endif if (WSREP_ON && wsrep_thd_is_BF(owner->get_thd(), false)) { @@ -2134,6 +2130,8 @@ if (lock->can_grant_lock(mdl_request->type, this, false)) { + if (metadata_lock_info_plugin_loaded) + ticket->m_time= microsecond_interval_timer(); lock->m_granted.add_ticket(ticket); mysql_prlock_unlock(&lock->m_rwlock); @@ -2205,6 +2203,7 @@ DBUG_ASSERT(mdl_request->ticket->has_stronger_or_equal_type(ticket->m_type)); ticket->m_lock= mdl_request->ticket->m_lock; + ticket->m_time= mdl_request->ticket->m_time; mdl_request->ticket= ticket; mysql_prlock_wrlock(&ticket->m_lock->m_rwlock); @@ -2348,6 +2347,8 @@ } #endif /* WITH_WSREP */ + if (metadata_lock_info_plugin_loaded) + ticket->m_time= microsecond_interval_timer(); lock->m_waiting.add_ticket(ticket); /* diff -Nru mariadb-10.11.6/sql/mdl.h mariadb-10.11.9/sql/mdl.h --- mariadb-10.11.6/sql/mdl.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/mdl.h 2024-08-03 07:29:59.000000000 +0000 @@ -699,7 +699,17 @@ */ MDL_ticket *next_in_context; MDL_ticket **prev_in_context; + +#ifndef DBUG_OFF + /** + Duration of lock represented by this ticket. + Context public. Debug-only. + */ public: + enum_mdl_duration m_duration; +#endif + ulonglong m_time; + #ifdef WITH_WSREP void wsrep_report(bool debug) const; #endif /* WITH_WSREP */ @@ -726,8 +736,8 @@ bool is_incompatible_when_waiting(enum_mdl_type type) const; /** Implement MDL_wait_for_subgraph interface. */ - virtual bool accept_visitor(MDL_wait_for_graph_visitor *dvisitor); - virtual uint get_deadlock_weight() const; + bool accept_visitor(MDL_wait_for_graph_visitor *dvisitor) override; + uint get_deadlock_weight() const override; /** Status of lock request represented by the ticket as reflected in P_S. */ @@ -741,10 +751,12 @@ , enum_mdl_duration duration_arg #endif ) - : m_type(type_arg), + : #ifndef DBUG_OFF m_duration(duration_arg), #endif + m_time(0), + m_type(type_arg), m_ctx(ctx_arg), m_lock(NULL), m_psi(NULL) @@ -764,13 +776,7 @@ private: /** Type of metadata lock. Externally accessible. */ enum enum_mdl_type m_type; -#ifndef DBUG_OFF - /** - Duration of lock represented by this ticket. - Context private. Debug-only. - */ - enum_mdl_duration m_duration; -#endif + /** Context of the owner of the metadata lock ticket. Externally accessible. */ diff -Nru mariadb-10.11.6/sql/multi_range_read.h mariadb-10.11.9/sql/multi_range_read.h --- mariadb-10.11.6/sql/multi_range_read.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/multi_range_read.h 2024-08-03 07:29:59.000000000 +0000 @@ -247,11 +247,11 @@ void *seq_init_param, uint n_ranges, uint mode, Key_parameters *key_par, Lifo_buffer *key_buffer, - Buffer_manager *buf_manager_arg); - int get_next(range_id_t *range_info); - int refill_buffer(bool initial) { return initial? 0: HA_ERR_END_OF_FILE; } - uchar *get_rowid_ptr() { return file->ref; } - bool skip_record(range_id_t range_id, uchar *rowid) + Buffer_manager *buf_manager_arg) override; + int get_next(range_id_t *range_info) override; + int refill_buffer(bool initial) override { return initial? 0: HA_ERR_END_OF_FILE; } + uchar *get_rowid_ptr() override { return file->ref; } + bool skip_record(range_id_t range_id, uchar *rowid) override { return (file->mrr_funcs.skip_record && file->mrr_funcs.skip_record(file->mrr_iter, range_id, rowid)); @@ -270,12 +270,12 @@ void *seq_init_param, uint n_ranges, uint mode, Key_parameters *key_par, Lifo_buffer *key_buffer, - Buffer_manager *buf_manager_arg); - int get_next(range_id_t *range_info); - int refill_buffer(bool initial); - uchar *get_rowid_ptr() { return file->ref; } + Buffer_manager *buf_manager_arg) override; + int get_next(range_id_t *range_info) override; + int refill_buffer(bool initial) override; + uchar *get_rowid_ptr() override { return file->ref; } - bool skip_record(range_id_t range_info, uchar *rowid) + bool skip_record(range_id_t range_info, uchar *rowid) override { return (mrr_funcs.skip_record && mrr_funcs.skip_record(mrr_iter, range_info, rowid)); @@ -292,9 +292,9 @@ uchar **space_start, uchar *space_end); void set_no_interruption_temp_buffer(); - void interrupt_read(); - void resume_read(); - void position(); + void interrupt_read() override; + void resume_read() override; + void position() override; private: Key_value_records_iterator kv_it; @@ -365,8 +365,8 @@ public: int init(handler *file, Mrr_index_reader *index_reader, uint mode, Lifo_buffer *buf, Rowid_filter *filter); - int get_next(range_id_t *range_info); - int refill_buffer(bool initial); + int get_next(range_id_t *range_info) override; + int refill_buffer(bool initial) override; private: handler *file; /* Handler to use */ @@ -556,10 +556,6 @@ public: typedef void (handler::*range_check_toggle_func_t)(bool on); - DsMrr_impl() - : secondary_file(NULL), - rowid_filter(NULL) {}; - void init(handler *h_arg, TABLE *table_arg) { primary_file= h_arg; @@ -581,7 +577,7 @@ int dsmrr_explain_info(uint mrr_mode, char *str, size_t size); private: /* Buffer to store (key, range_id) pairs */ - Lifo_buffer *key_buffer; + Lifo_buffer *key_buffer= nullptr; /* The "owner" handler object (the one that is expected to "own" this object @@ -594,13 +590,13 @@ Secondary handler object. (created when needed, we need it when we need to run both index scan and rnd_pos() scan at the same time) */ - handler *secondary_file; + handler *secondary_file= nullptr; /* The rowid filter that DS-MRR has "unpushed" from the storage engine. If it's present, DS-MRR will use it. */ - Rowid_filter *rowid_filter; + Rowid_filter *rowid_filter= nullptr; uint keyno; /* index we're running the scan on */ /* TRUE <=> need range association, buffers hold {rowid, range_id} pairs */ diff -Nru mariadb-10.11.6/sql/my_json_writer.cc mariadb-10.11.9/sql/my_json_writer.cc --- mariadb-10.11.6/sql/my_json_writer.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/my_json_writer.cc 2024-08-03 07:29:59.000000000 +0000 @@ -212,7 +212,7 @@ } -/* Add a memory size, printing in Kb, Kb, Gb if necessary */ +/* Add a memory size, printing in Kb, Mb if necessary */ void Json_writer::add_size(longlong val) { char buf[64]; @@ -220,18 +220,10 @@ if (val < 1024) len= my_snprintf(buf, sizeof(buf), "%lld", val); else if (val < 1024*1024*16) - { /* Values less than 16MB are specified in KB for precision */ - len= my_snprintf(buf, sizeof(buf), "%lld", val/1024); - strcpy(buf + len, "Kb"); - len+= 2; - } + len= my_snprintf(buf, sizeof(buf), "%lldKb", val/1024); else - { - len= my_snprintf(buf, sizeof(buf), "%lld", val/(1024*1024)); - strcpy(buf + len, "Mb"); - len+= 2; - } + len= my_snprintf(buf, sizeof(buf), "%lldMb", val/(1024*1024)); add_str(buf, len); } diff -Nru mariadb-10.11.6/sql/mysql_install_db.cc mariadb-10.11.9/sql/mysql_install_db.cc --- mariadb-10.11.6/sql/mysql_install_db.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/mysql_install_db.cc 2024-08-03 07:29:59.000000000 +0000 @@ -160,7 +160,7 @@ char *datadir = NULL; MY_INIT(argv[0]); GetModuleFileName(NULL, self_name, MAX_PATH); - strcpy(mysqld_path,self_name); + safe_strcpy(mysqld_path, sizeof(mysqld_path), self_name); p= strrchr(mysqld_path, FN_LIBCHAR); if (p) { @@ -224,7 +224,7 @@ Figure out default data directory. It "data" directory, next to "bin" directory, where mysql_install_db.exe resides. */ - strcpy(default_datadir, self_name); + safe_strcpy(default_datadir, sizeof(default_datadir), self_name); p = strrchr(default_datadir, FN_LIBCHAR); if (p) { @@ -335,6 +335,7 @@ " %s" " --bootstrap" " --datadir=." + " --tmpdir=." " --loose-innodb-buffer-pool-size=20M" "\"" , mysqld_path, opt_verbose_bootstrap ? "--console" : ""); diff -Nru mariadb-10.11.6/sql/mysqld.cc mariadb-10.11.9/sql/mysqld.cc --- mariadb-10.11.6/sql/mysqld.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/mysqld.cc 2024-08-03 07:29:59.000000000 +0000 @@ -302,7 +302,8 @@ }; const char *first_keyword= "first"; -const char *my_localhost= "localhost", *delayed_user= "DELAYED"; +const char *my_localhost= "localhost", + *delayed_user= "delayed", *slave_user= ""; bool opt_large_files= sizeof(my_off_t) > 4; static my_bool opt_autocommit; ///< for --autocommit command-line option @@ -354,6 +355,8 @@ static DYNAMIC_ARRAY all_options; static longlong start_memory_used; +char server_uid[SERVER_UID_SIZE+1]; // server uid will be written here + /* Global variables */ bool opt_bin_log, opt_bin_log_used=0, opt_ignore_builtin_innodb= 0; @@ -737,9 +740,6 @@ server may be fairly high, we need a dedicated lock. */ mysql_mutex_t LOCK_prepared_stmt_count; -#ifdef HAVE_OPENSSL -mysql_mutex_t LOCK_des_key_file; -#endif mysql_mutex_t LOCK_backup_log; mysql_rwlock_t LOCK_grant, LOCK_sys_init_connect, LOCK_sys_init_slave; mysql_rwlock_t LOCK_ssl_refresh; @@ -763,7 +763,11 @@ char *opt_logname, *opt_slow_logname, *opt_bin_logname; char *opt_binlog_index_name=0; - +/* + Flag if the METADATA_LOCK_INFO is used. In this case we store the time + when we take a MDL lock. +*/ +bool metadata_lock_info_plugin_loaded= 0; /* Static variables */ @@ -883,7 +887,7 @@ PSI_file_key key_file_binlog, key_file_binlog_cache, key_file_binlog_index, key_file_binlog_index_cache, key_file_casetest, - key_file_dbopt, key_file_des_key_file, key_file_ERRMSG, key_select_to_file, + key_file_dbopt, key_file_ERRMSG, key_select_to_file, key_file_fileparser, key_file_frm, key_file_global_ddl_log, key_file_load, key_file_loadfile, key_file_log_event_data, key_file_log_event_info, key_file_log_ddl, @@ -895,16 +899,19 @@ key_file_relaylog_cache, key_file_relaylog_index_cache; PSI_file_key key_file_binlog_state; +#ifdef HAVE_des +char *des_key_file; +PSI_file_key key_file_des_key_file; +PSI_mutex_key key_LOCK_des_key_file; +mysql_mutex_t LOCK_des_key_file; +#endif /* HAVE_des */ + #ifdef HAVE_PSI_INTERFACE #ifdef HAVE_MMAP PSI_mutex_key key_PAGE_lock, key_LOCK_sync, key_LOCK_active, key_LOCK_pool, key_LOCK_pending_checkpoint; #endif /* HAVE_MMAP */ -#ifdef HAVE_OPENSSL -PSI_mutex_key key_LOCK_des_key_file; -#endif /* HAVE_OPENSSL */ - PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list, key_BINLOG_LOCK_binlog_background_thread, key_LOCK_binlog_end_pos, @@ -962,9 +969,9 @@ { &key_LOCK_pool, "TC_LOG_MMAP::LOCK_pending_checkpoint", 0}, #endif /* HAVE_MMAP */ -#ifdef HAVE_OPENSSL +#ifdef HAVE_des { &key_LOCK_des_key_file, "LOCK_des_key_file", PSI_FLAG_GLOBAL}, -#endif /* HAVE_OPENSSL */ +#endif /* HAVE_des */ { &key_BINLOG_LOCK_index, "MYSQL_BIN_LOG::LOCK_index", 0}, { &key_BINLOG_LOCK_xid_list, "MYSQL_BIN_LOG::LOCK_xid_list", 0}, @@ -1173,6 +1180,8 @@ PSI_statement_info stmt_info_new_packet; #endif +static int calculate_server_uid(char *dest); + #ifndef EMBEDDED_LIBRARY void net_before_header_psi(struct st_net *net, void *thd, size_t /* unused: count */) { @@ -1491,7 +1500,6 @@ static void openssl_lock_function(int, int, const char *, int); static void openssl_lock(int, openssl_lock_t *, const char *, int); #endif /* HAVE_OPENSSL10 */ -char *des_key_file; #ifndef EMBEDDED_LIBRARY struct st_VioSSLFd *ssl_acceptor_fd; #endif @@ -1567,15 +1575,12 @@ /** First shutdown everything but slave threads and binlog dump connections */ -static my_bool kill_thread_phase_1(THD *thd, int *n_threads_awaiting_ack) +static my_bool kill_thread_phase_1(THD *thd, void *) { DBUG_PRINT("quit", ("Informing thread %ld that it's time to die", (ulong) thd->thread_id)); - if (thd->slave_thread || thd->is_binlog_dump_thread() || - (shutdown_wait_for_slaves && - repl_semisync_master.is_thd_awaiting_semisync_ack(thd) && - ++(*n_threads_awaiting_ack))) + if (thd->slave_thread || thd->is_binlog_dump_thread()) return 0; if (DBUG_IF("only_kill_system_threads") && !thd->system_thread) @@ -1773,31 +1778,20 @@ This will give the threads some time to gracefully abort their statements and inform their clients that the server is about to die. */ - DBUG_EXECUTE_IF("mysqld_delay_kill_threads_phase_1", my_sleep(200000);); - int n_threads_awaiting_ack= 0; - server_threads.iterate(kill_thread_phase_1, &n_threads_awaiting_ack); + server_threads.iterate(kill_thread_phase_1); /* If we are waiting on any ACKs, delay killing the thread until either an ACK is received or the timeout is hit. - - Allow at max the number of sessions to await a timeout; however, if all - ACKs have been received in less iterations, then quit early */ if (shutdown_wait_for_slaves && repl_semisync_master.get_master_enabled()) { - int waiting_threads= repl_semisync_master.sync_get_master_wait_sessions(); - if (waiting_threads) - sql_print_information("Delaying shutdown to await semi-sync ACK"); - - while (waiting_threads-- > 0) - repl_semisync_master.await_slave_reply(); + repl_semisync_master.await_all_slave_replies( + "Delaying shutdown to await semi-sync ACK"); } - DBUG_EXECUTE_IF("delay_shutdown_phase_2_after_semisync_wait", - my_sleep(500000);); - - Events::deinit(); + if (Events::inited) + Events::stop(); slave_prepare_for_shutdown(); ack_receiver.stop(); @@ -1817,8 +1811,7 @@ */ DBUG_PRINT("info", ("THD_count: %u", THD_count::value())); - for (int i= 0; THD_count::connection_thd_count() - n_threads_awaiting_ack - && i < 1000; i++) + for (int i= 0; THD_count::connection_thd_count() && i < 1000; i++) { if (DBUG_IF("only_kill_system_threads_no_loop")) break; @@ -1837,9 +1830,9 @@ #endif /* All threads has now been aborted */ DBUG_PRINT("quit", ("Waiting for threads to die (count=%u)", - THD_count::connection_thd_count() - n_threads_awaiting_ack)); + THD_count::connection_thd_count())); - while (THD_count::connection_thd_count() - n_threads_awaiting_ack) + while (THD_count::connection_thd_count()) { if (DBUG_IF("only_kill_system_threads_no_loop")) break; @@ -1860,6 +1853,12 @@ } /* End of kill phase 2 */ + /* + The signal thread can use server resources, e.g. when processing SIGHUP, + and it must end gracefully before clean_up() + */ + wait_for_signal_thread_to_end(); + DBUG_PRINT("quit",("close_connections thread")); DBUG_VOID_RETURN; } @@ -1928,6 +1927,7 @@ wsrep_sst_auth_free(); #endif // WITH_WSREP + wait_for_signal_thread_to_end(); clean_up(!opt_abort && (exit_code || !opt_bootstrap)); /* purecov: inspected */ DBUG_PRINT("quit",("done with cleanup in unireg_abort")); mysqld_exit(exit_code); @@ -1936,14 +1936,8 @@ static void mysqld_exit(int exit_code) { DBUG_ENTER("mysqld_exit"); - /* - Important note: we wait for the signal thread to end, - but if a kill -15 signal was sent, the signal thread did - spawn the kill_server_thread thread, which is running concurrently. - */ rpl_deinit_gtid_waiting(); rpl_deinit_gtid_slave_state(); - wait_for_signal_thread_to_end(); #ifdef WITH_WSREP wsrep_deinit_server(); wsrep_sst_auth_free(); @@ -2025,6 +2019,9 @@ free_status_vars(); end_thr_alarm(1); /* Free allocated memory */ end_thr_timer(); +#ifndef EMBEDDED_LIBRARY + Events::deinit(); +#endif my_free_open_file_info(); if (defaults_argv) free_defaults(defaults_argv); @@ -2095,16 +2092,32 @@ */ static void wait_for_signal_thread_to_end() { - uint i; + uint i, n_waits= DBUG_IF("force_sighup_processing_timeout") ? 5 : 100; + int err= 0; /* Wait up to 10 seconds for signal thread to die. We use this mainly to avoid getting warnings that my_thread_end has not been called */ - for (i= 0 ; i < 100 && signal_thread_in_use; i++) + for (i= 0 ; i < n_waits && signal_thread_in_use; i++) { - if (pthread_kill(signal_thread, MYSQL_KILL_SIGNAL) == ESRCH) + err= pthread_kill(signal_thread, MYSQL_KILL_SIGNAL); + if (err) break; - my_sleep(100); // Give it time to die + my_sleep(100000); // Give it time to die, .1s per iteration + } + + if (err && err != ESRCH) + { + sql_print_error("Failed to send kill signal to signal handler thread, " + "pthread_kill() errno: %d", + err); + } + + if (i == n_waits && signal_thread_in_use) + { + sql_print_warning("Signal handler thread did not exit in a timely manner. " + "Continuing to wait for it to stop.."); + pthread_join(signal_thread, NULL); } } #endif /*EMBEDDED_LIBRARY*/ @@ -2129,7 +2142,9 @@ mysql_mutex_destroy(&LOCK_global_table_stats); mysql_mutex_destroy(&LOCK_global_index_stats); #ifdef HAVE_OPENSSL +#ifdef HAVE_des mysql_mutex_destroy(&LOCK_des_key_file); +#endif /* HAVE_des */ #if defined(HAVE_OPENSSL10) && !defined(HAVE_WOLFSSL) for (int i= 0; i < CRYPTO_num_locks(); ++i) mysql_rwlock_destroy(&openssl_stdlocks[i].lock); @@ -2323,6 +2338,7 @@ else real_bind_addr_str= my_bind_addr_str; + DBUG_EXECUTE_IF("sabotage_port_number", port= UINT_MAX32;); my_snprintf(port_buf, NI_MAXSERV, "%d", port); if (real_bind_addr_str && *real_bind_addr_str) @@ -2366,6 +2382,13 @@ else { error= getaddrinfo(real_bind_addr_str, port_buf, &hints, &ai); + if (unlikely(error != 0)) + { + sql_print_error("%s: %s", ER_DEFAULT(ER_IPSOCK_ERROR), + gai_strerror(error)); + unireg_abort(1); /* purecov: tested */ + } + head= ai; } @@ -3183,7 +3206,6 @@ (void) pthread_attr_init(&thr_attr); pthread_attr_setscope(&thr_attr,PTHREAD_SCOPE_SYSTEM); - (void) pthread_attr_setdetachstate(&thr_attr,PTHREAD_CREATE_DETACHED); (void) my_setstacksize(&thr_attr,my_thread_stack_size); mysql_mutex_lock(&LOCK_start_thread); @@ -3202,17 +3224,14 @@ DBUG_VOID_RETURN; } - -#if defined(USE_ONE_SIGNAL_HAND) -pthread_handler_t kill_server_thread(void *arg __attribute__((unused))) +/** Called only from signal_hand function. */ +static void* exit_signal_handler() { - my_thread_init(); // Initialize new thread - break_connect_loop(); - my_thread_end(); - pthread_exit(0); - return 0; + my_thread_end(); + signal_thread_in_use= 0; + pthread_exit(0); // Safety + return nullptr; // Avoid compiler warnings } -#endif /** This threads handles all signals and alarms. */ @@ -3222,7 +3241,6 @@ sigset_t set; int sig; my_thread_init(); // Init new thread - DBUG_ENTER("signal_hand"); signal_thread_in_use= 1; /* @@ -3272,14 +3290,10 @@ int origin; while ((error= my_sigwait(&set, &sig, &origin)) == EINTR) /* no-op */; - if (cleanup_done) + if (abort_loop) { DBUG_PRINT("quit",("signal_handler: calling my_thread_end()")); - my_thread_end(); - DBUG_LEAVE; // Must match DBUG_ENTER() - signal_thread_in_use= 0; - pthread_exit(0); // Safety - return 0; // Avoid compiler warnings + return exit_signal_handler(); } switch (sig) { case SIGTERM: @@ -3296,18 +3310,9 @@ { /* Delete the instrumentation for the signal thread */ PSI_CALL_delete_current_thread(); -#ifdef USE_ONE_SIGNAL_HAND - pthread_t tmp; - if (unlikely((error= mysql_thread_create(0, /* Not instrumented */ - &tmp, &connection_attrib, - kill_server_thread, - (void*) &sig)))) - sql_print_error("Can't create thread to kill server (errno= %d)", - error); -#else my_sigset(sig, SIG_IGN); break_connect_loop(); // MIT THREAD has a alarm thread -#endif + return exit_signal_handler(); } break; case SIGHUP: @@ -3794,20 +3799,35 @@ thd->status_var.local_memory_used > (int64)thd->variables.max_mem_used && likely(!thd->killed) && !thd->get_stmt_da()->is_set()) { - /* Ensure we don't get called here again */ - char buf[50], *buf2; - thd->set_killed(KILL_QUERY); - my_snprintf(buf, sizeof(buf), "--max-session-mem-used=%llu", - thd->variables.max_mem_used); - if ((buf2= (char*) thd->alloc(256))) - { - my_snprintf(buf2, 256, ER_THD(thd, ER_OPTION_PREVENTS_STATEMENT), buf); - thd->set_killed(KILL_QUERY, ER_OPTION_PREVENTS_STATEMENT, buf2); - } - else - { - thd->set_killed(KILL_QUERY, ER_OPTION_PREVENTS_STATEMENT, - "--max-session-mem-used"); + /* + Ensure we don't get called here again. + + It is not safe to wait for LOCK_thd_kill here, as we could be called + from almost any context. For example while LOCK_plugin is being held; + but THD::awake() locks LOCK_thd_kill and LOCK_plugin in the opposite + order (MDEV-33443). + + So ignore the max_mem_used limit in the unlikely case we cannot obtain + LOCK_thd_kill here (the limit will be enforced on the next allocation). + */ + if (!mysql_mutex_trylock(&thd->LOCK_thd_kill)) { + char buf[50], *buf2; + thd->set_killed_no_mutex(KILL_QUERY); + my_snprintf(buf, sizeof(buf), "--max-session-mem-used=%llu", + thd->variables.max_mem_used); + if ((buf2= (char*) thd->alloc(256))) + { + my_snprintf(buf2, 256, + ER_THD(thd, ER_OPTION_PREVENTS_STATEMENT), buf); + thd->set_killed_no_mutex(KILL_QUERY, + ER_OPTION_PREVENTS_STATEMENT, buf2); + } + else + { + thd->set_killed_no_mutex(KILL_QUERY, ER_OPTION_PREVENTS_STATEMENT, + "--max-session-mem-used"); + } + mysql_mutex_unlock(&thd->LOCK_thd_kill); } } DBUG_ASSERT((longlong) thd->status_var.local_memory_used >= 0 || @@ -4117,11 +4137,15 @@ SQLCOM_END + 10); #endif - if (get_options(&remaining_argc, &remaining_argv)) - exit(1); + int opt_err; + if ((opt_err= get_options(&remaining_argc, &remaining_argv))) + exit(opt_err); if (IS_SYSVAR_AUTOSIZE(&server_version_ptr)) set_server_version(server_version, sizeof(server_version)); + if (calculate_server_uid(server_uid)) + strmov(server_uid, "unknown"); + mysql_real_data_home_len= uint(strlen(mysql_real_data_home)); sf_leaking_memory= 0; // no memory leaks from now on @@ -4334,8 +4358,10 @@ if (is_supported_parser_charset(default_charset_info)) { global_system_variables.collation_connection= default_charset_info; - global_system_variables.character_set_results= default_charset_info; - global_system_variables.character_set_client= default_charset_info; + global_system_variables.character_set_results= + global_system_variables.character_set_client= + Lex_exact_charset_opt_extended_collate(default_charset_info, true). + find_default_collation(); } else { @@ -4520,8 +4546,10 @@ mysql_mutex_init(key_LOCK_temp_pool, &LOCK_temp_pool, MY_MUTEX_INIT_FAST); #ifdef HAVE_OPENSSL +#ifdef HAVE_des mysql_mutex_init(key_LOCK_des_key_file, &LOCK_des_key_file, MY_MUTEX_INIT_FAST); +#endif /* HAVE_des */ #if defined(HAVE_OPENSSL10) && !defined(HAVE_WOLFSSL) openssl_stdlocks= (openssl_lock_t*) OPENSSL_malloc(CRYPTO_num_locks() * sizeof(openssl_lock_t)); @@ -4740,8 +4768,10 @@ { have_ssl= SHOW_OPTION_DISABLED; } +#ifdef HAVE_des if (des_key_file) load_des_key_file(des_key_file); +#endif /* HAVE_des */ #endif /* HAVE_OPENSSL */ #endif /* !EMBEDDED_LIBRARY */ } @@ -4982,13 +5012,18 @@ error_handler_hook= my_message_sql; proc_info_hook= set_thd_stage_info; + /* Set up hook to handle disk full */ + my_sleep_for_space= mariadb_sleep_for_space; + /* - Print source revision hash, as one of the first lines, if not the - first in error log, for troubleshooting and debugging purposes - */ + Print source revision hash, as one of the first lines, if not the + first in error log, for troubleshooting and debugging purposes + */ if (!opt_help) - sql_print_information("Starting MariaDB %s source revision %s as process %lu", - server_version, SOURCE_REVISION, (ulong) getpid()); + sql_print_information("Starting MariaDB %s source revision %s " + "server_uid %s as process %lu", + server_version, SOURCE_REVISION, server_uid, + (ulong) getpid()); #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE /* @@ -5013,6 +5048,19 @@ xid_cache_init(); + /* + Do not open binlong when doing bootstrap. + This ensures that rpl_load_gtid_slave_state() will not fail with an error + as the mysql schema does not yet exists. + This also ensures that we don't get an empty binlog file if the user has + log-bin in his config files. + */ + if (opt_bootstrap) + { + opt_bin_log= opt_bin_log_used= binlog_format_used= 0; + opt_log_slave_updates= 0; + } + /* need to configure logging before initializing storage engines */ if (!opt_bin_log_used && !WSREP_ON) { @@ -5221,6 +5269,14 @@ if (!opt_abort && ddl_log_initialize()) unireg_abort(1); + /* + Plugins may not be completed because system table DDLs are only + run after the ddl recovery done. Therefore between the + plugin_init() call and the ha_signal_ddl_recovery_done() call + below only things related to preparation for recovery should be + done and nothing else, and definitely not anything assuming that + all plugins have been initialised. + */ if (plugin_init(&remaining_argc, remaining_argv, (opt_noacl ? PLUGIN_INIT_SKIP_PLUGIN_TABLE : 0) | (opt_abort ? PLUGIN_INIT_SKIP_INITIALIZATION : 0))) @@ -5323,7 +5379,6 @@ MARIADB_REMOVED_OPTION("innodb-log-compressed-pages"), MARIADB_REMOVED_OPTION("innodb-log-files-in-group"), MARIADB_REMOVED_OPTION("innodb-log-optimize-ddl"), - MARIADB_REMOVED_OPTION("innodb-log-write-ahead-size"), MARIADB_REMOVED_OPTION("innodb-page-cleaners"), MARIADB_REMOVED_OPTION("innodb-replication-delay"), MARIADB_REMOVED_OPTION("innodb-scrub-log"), @@ -5465,6 +5520,10 @@ } #endif +#ifndef EMBEDDED_LIBRARY + start_handle_manager(); +#endif + tc_log= get_tc_log_implementation(); if (tc_log->open(opt_bin_log ? opt_bin_logname : opt_tc_log_file)) @@ -5476,9 +5535,6 @@ if (ha_recover(0)) unireg_abort(1); -#ifndef EMBEDDED_LIBRARY - start_handle_manager(); -#endif if (opt_bin_log) { int error; @@ -5544,6 +5600,15 @@ #else locked_in_memory= 0; #endif +#ifdef PR_SET_THP_DISABLE + /* + Engine page buffers are now allocated. + Disable transparent huge pages for all + future allocations as these causes memory + leaks. + */ + prctl(PR_SET_THP_DISABLE, 1, 0, 0, 0); +#endif ft_init_stopwords(); @@ -5791,8 +5856,6 @@ SYSVAR_AUTOSIZE(my_thread_stack_size, new_thread_stack_size); } - (void) thr_setconcurrency(concurrency); // 10 by default - select_thread=pthread_self(); select_thread_in_use=1; @@ -6572,12 +6635,12 @@ &opt_debug_sync_timeout, 0, 0, GET_UINT, OPT_ARG, 0, 0, UINT_MAX, 0, 0, 0}, #endif /* defined(ENABLED_DEBUG_SYNC) */ -#ifdef HAVE_OPENSSL +#ifdef HAVE_des {"des-key-file", 0, "Load keys for des_encrypt() and des_encrypt from given file.", &des_key_file, &des_key_file, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, -#endif /* HAVE_OPENSSL */ +#endif /* HAVE_des */ #ifdef HAVE_STACKTRACE {"stack-trace", 0 , "Print a symbolic stack trace on failure", &opt_stack_trace, &opt_stack_trace, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, @@ -6681,7 +6744,7 @@ #ifdef HAVE_REPLICATION {"init-rpl-role", 0, "Set the replication role", &rpl_status, &rpl_status, &rpl_role_typelib, - GET_ENUM, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + GET_ENUM, REQUIRED_ARG, RPL_AUTH_MASTER, 0, 0, 0, 0, 0}, #endif /* HAVE_REPLICATION */ {"memlock", 0, "Lock mysqld in memory.", &locked_in_memory, &locked_in_memory, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -6867,8 +6930,8 @@ #endif }; -static int show_queries(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_queries(THD *thd, SHOW_VAR *var, void *, + system_status_var *, enum_var_type) { var->type= SHOW_LONGLONG; var->value= &thd->query_id; @@ -6876,16 +6939,16 @@ } -static int show_net_compression(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_net_compression(THD *thd, SHOW_VAR *var, void *, + system_status_var *, enum_var_type) { var->type= SHOW_MY_BOOL; var->value= &thd->net.compress; return 0; } -static int show_starttime(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_starttime(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -6894,8 +6957,8 @@ } #ifdef ENABLED_PROFILING -static int show_flushstatustime(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_flushstatustime(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -6905,32 +6968,28 @@ #endif #ifdef HAVE_REPLICATION -static int show_rpl_status(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_rpl_status(THD *, SHOW_VAR *var, void *, system_status_var *, + enum_var_type) { var->type= SHOW_CHAR; var->value= const_cast(rpl_status_type[(int)rpl_status]); return 0; } -static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_slave_running(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { - Master_info *mi= NULL; - bool UNINIT_VAR(tmp); - - var->type= SHOW_MY_BOOL; - var->value= buff; - - if ((mi= get_master_info(&thd->variables.default_master_connection, - Sql_condition::WARN_LEVEL_NOTE))) - { - tmp= (my_bool) (mi->slave_running == MYSQL_SLAVE_RUN_READING && - mi->rli.slave_running != MYSQL_SLAVE_NOT_RUN); + if (Master_info *mi= + get_master_info(&thd->variables.default_master_connection, + Sql_condition::WARN_LEVEL_NOTE)) + { + *((my_bool*) buff)= + (mi->slave_running == MYSQL_SLAVE_RUN_READING && + mi->rli.slave_running != MYSQL_SLAVE_NOT_RUN); mi->release(); + var->type= SHOW_MY_BOOL; + var->value= buff; } - if (mi) - *((my_bool *)buff)= tmp; else var->type= SHOW_UNDEF; return 0; @@ -6940,7 +6999,8 @@ /* How many masters this slave is connected to */ -static int show_slaves_running(THD *thd, SHOW_VAR *var, char *buff) +static int show_slaves_running(THD *, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONGLONG; var->value= buff; @@ -6951,19 +7011,17 @@ } -static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { - Master_info *mi; - - var->type= SHOW_LONGLONG; - var->value= buff; - - if ((mi= get_master_info(&thd->variables.default_master_connection, - Sql_condition::WARN_LEVEL_NOTE))) + if (Master_info *mi= + get_master_info(&thd->variables.default_master_connection, + Sql_condition::WARN_LEVEL_NOTE)) { *((longlong *)buff)= mi->received_heartbeats; mi->release(); + var->type= SHOW_LONGLONG; + var->value= buff; } else var->type= SHOW_UNDEF; @@ -6971,19 +7029,17 @@ } -static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_heartbeat_period(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { - Master_info *mi; - - var->type= SHOW_CHAR; - var->value= buff; - - if ((mi= get_master_info(&thd->variables.default_master_connection, - Sql_condition::WARN_LEVEL_NOTE))) + if (Master_info *mi= + get_master_info(&thd->variables.default_master_connection, + Sql_condition::WARN_LEVEL_NOTE)) { - sprintf(buff, "%.3f", mi->heartbeat_period); + sprintf(static_cast(buff), "%.3f", mi->heartbeat_period); mi->release(); + var->type= SHOW_CHAR; + var->value= buff; } else var->type= SHOW_UNDEF; @@ -6993,8 +7049,8 @@ #endif /* HAVE_REPLICATION */ -static int show_open_tables(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_open_tables(THD *, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -7002,8 +7058,8 @@ return 0; } -static int show_prepared_stmt_count(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_prepared_stmt_count(THD *, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -7013,8 +7069,8 @@ return 0; } -static int show_table_definitions(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_table_definitions(THD *, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -7033,8 +7089,8 @@ inside an Event. */ -static int show_ssl_get_version(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_ssl_get_version(THD *thd, SHOW_VAR *var, void *, + system_status_var *, enum_var_type) { var->type= SHOW_CHAR; if( thd->vio_ok() && thd->net.vio->ssl_arg ) @@ -7044,8 +7100,8 @@ return 0; } -static int show_ssl_get_default_timeout(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_ssl_get_default_timeout(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -7056,8 +7112,8 @@ return 0; } -static int show_ssl_get_verify_mode(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_ssl_get_verify_mode(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -7072,8 +7128,8 @@ return 0; } -static int show_ssl_get_verify_depth(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_ssl_get_verify_depth(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_LONG; var->value= buff; @@ -7085,8 +7141,8 @@ return 0; } -static int show_ssl_get_cipher(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_ssl_get_cipher(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_CHAR; if( thd->vio_ok() && thd->net.vio->ssl_arg ) @@ -7096,9 +7152,10 @@ return 0; } -static int show_ssl_get_cipher_list(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_ssl_get_cipher_list(THD *thd, SHOW_VAR *var, void *buf, + system_status_var *, enum_var_type) { + char *buff= static_cast(buf); var->type= SHOW_CHAR; var->value= buff; if (thd->vio_ok() && thd->net.vio->ssl_arg) @@ -7183,8 +7240,8 @@ */ static int -show_ssl_get_server_not_before(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +show_ssl_get_server_not_before(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_CHAR; if(thd->vio_ok() && thd->net.vio->ssl_arg) @@ -7193,7 +7250,7 @@ X509 *cert= SSL_get_certificate(ssl); const ASN1_TIME *not_before= X509_get0_notBefore(cert); - var->value= my_asn1_time_to_string(not_before, buff, + var->value= my_asn1_time_to_string(not_before, static_cast(buff), SHOW_VAR_FUNC_BUFF_SIZE); if (!var->value) return 1; @@ -7217,8 +7274,8 @@ */ static int -show_ssl_get_server_not_after(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +show_ssl_get_server_not_after(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_CHAR; if(thd->vio_ok() && thd->net.vio->ssl_arg) @@ -7227,7 +7284,7 @@ X509 *cert= SSL_get_certificate(ssl); const ASN1_TIME *not_after= X509_get0_notAfter(cert); - var->value= my_asn1_time_to_string(not_after, buff, + var->value= my_asn1_time_to_string(not_after, static_cast(buff), SHOW_VAR_FUNC_BUFF_SIZE); if (!var->value) return 1; @@ -7281,7 +7338,7 @@ } -static int show_memory_used(THD *thd, SHOW_VAR *var, char *buff, +static int show_memory_used(THD *thd, SHOW_VAR *var, void *buff, struct system_status_var *status_var, enum enum_var_type scope) { @@ -7337,8 +7394,8 @@ #endif #ifdef HAVE_POOL_OF_THREADS -static int show_threadpool_idle_threads(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_threadpool_idle_threads(THD *, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_INT; var->value= buff; @@ -7347,8 +7404,8 @@ } -static int show_threadpool_threads(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_threadpool_threads(THD *, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_INT; var->value= buff; @@ -7500,7 +7557,7 @@ SHOW_FUNC_ENTRY("Rpl_semi_sync_master_net_avg_wait_time", &SHOW_FNAME(avg_net_wait_time)), {"Rpl_semi_sync_master_request_ack", (char*) &rpl_semi_sync_master_request_ack, SHOW_LONGLONG}, {"Rpl_semi_sync_master_get_ack", (char*)&rpl_semi_sync_master_get_ack, SHOW_LONGLONG}, - {"Rpl_semi_sync_slave_status", (char*) &rpl_semi_sync_slave_status, SHOW_BOOL}, + SHOW_FUNC_ENTRY("Rpl_semi_sync_slave_status", &rpl_semi_sync_enabled), {"Rpl_semi_sync_slave_send_ack", (char*) &rpl_semi_sync_slave_send_ack, SHOW_LONGLONG}, #endif /* HAVE_REPLICATION */ #ifdef HAVE_QUERY_CACHE @@ -7933,7 +7990,9 @@ libwrapName= NullS; #endif #ifdef HAVE_OPENSSL +#ifdef HAVE_des des_key_file = 0; +#endif /* HAVE_des */ #ifndef EMBEDDED_LIBRARY ssl_acceptor_fd= 0; #endif /* ! EMBEDDED_LIBRARY */ @@ -8082,6 +8141,9 @@ test_flags= argument ? ((uint) atoi(argument) & ~TEST_BLOCKING) : 0; opt_endinfo=1; break; + case OPT_SECURE_AUTH: + WARN_DEPRECATED_NO_REPLACEMENT(NULL, "--secure-auth"); + break; case OPT_THREAD_CONCURRENCY: WARN_DEPRECATED_NO_REPLACEMENT(NULL, "THREAD_CONCURRENCY"); break; @@ -8227,7 +8289,7 @@ case (int) OPT_SAFE: opt_specialflag|= SPECIAL_SAFE_MODE | SPECIAL_NO_NEW_FUNC; SYSVAR_AUTOSIZE(delay_key_write_options, (uint) DELAY_KEY_WRITE_NONE); - SYSVAR_AUTOSIZE(myisam_recover_options, HA_RECOVER_DEFAULT); + myisam_recover_options= HA_RECOVER_DEFAULT; ha_open_options&= ~(HA_OPEN_DELAY_KEY_WRITE); #ifdef HAVE_QUERY_CACHE SYSVAR_AUTOSIZE(query_cache_size, 0); @@ -8299,6 +8361,14 @@ if (argument == NULL) /* no argument */ log_error_file_ptr= const_cast(""); break; + case OPT_LOG_SLOW_FILTER: + if (argument == NULL || *argument == 0) + { + /* By default log_slow_filter_has all values except QPLAN_NOT_USING_INDEX */ + global_system_variables.log_slow_filter= opt->def_value | QPLAN_NOT_USING_INDEX; + sql_print_warning("log_slow_filter=\"\" changed to log_slow_filter=ALL"); + } + break; case OPT_IGNORE_DB_DIRECTORY: opt_ignore_db_dirs= NULL; // will be set in ignore_db_dirs_process_additions if (*argument == 0) @@ -9146,7 +9216,9 @@ { &key_file_io_cache, "io_cache", 0}, { &key_file_casetest, "casetest", 0}, { &key_file_dbopt, "dbopt", 0}, +#ifdef HAVE_des { &key_file_des_key_file, "des_key_file", 0}, +#endif { &key_file_ERRMSG, "ERRMSG", 0}, { &key_select_to_file, "select_to_file", 0}, { &key_file_fileparser, "file_parser", 0}, @@ -9273,6 +9345,7 @@ PSI_stage_info stage_user_sleep= { 0, "User sleep", 0}; PSI_stage_info stage_verifying_table= { 0, "Verifying table", 0}; PSI_stage_info stage_waiting_for_delay_list= { 0, "Waiting for delay_list", 0}; +PSI_stage_info stage_waiting_for_disk_space= {0, "Waiting for someone to free space", 0}; PSI_stage_info stage_waiting_for_gtid_to_be_written_to_binary_log= { 0, "Waiting for GTID to be written to binary log", 0}; PSI_stage_info stage_waiting_for_handler_insert= { 0, "Waiting for handler insert", 0}; PSI_stage_info stage_waiting_for_handler_lock= { 0, "Waiting for handler lock", 0}; @@ -9882,3 +9955,31 @@ mysql_mutex_unlock(&LOCK_thread_id); return retval; } + + +/** + calculates the server unique identifier + + UID is a base64 encoded SHA1 hash of the MAC address of one of + the interfaces, and the tcp port that the server is listening on +*/ + +static int calculate_server_uid(char *dest) +{ + uchar rawbuf[2 + 6]; + uchar shabuf[MY_SHA1_HASH_SIZE]; + + int2store(rawbuf, mysqld_port); + if (my_gethwaddr(rawbuf + 2)) + { + sql_print_error("feedback plugin: failed to retrieve the MAC address"); + return 1; + } + + my_sha1((uint8*) shabuf, (char*) rawbuf, sizeof(rawbuf)); + + assert(my_base64_needed_encoded_length(sizeof(shabuf)) <= SERVER_UID_SIZE); + my_base64_encode(shabuf, sizeof(shabuf), dest); + + return 0; +} diff -Nru mariadb-10.11.6/sql/mysqld.h mariadb-10.11.9/sql/mysqld.h --- mariadb-10.11.6/sql/mysqld.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/mysqld.h 2024-08-03 07:29:59.000000000 +0000 @@ -143,6 +143,7 @@ extern uint opt_crash_binlog_innodb; extern const char *shared_memory_base_name; extern MYSQL_PLUGIN_IMPORT char *mysqld_unix_port; +extern MYSQL_PLUGIN_IMPORT bool metadata_lock_info_plugin_loaded; extern my_bool opt_enable_shared_memory; extern ulong opt_replicate_events_marked_for_skip; extern char *default_tz_name; @@ -267,7 +268,7 @@ extern char *opt_mysql_tmpdir, mysql_charsets_dir[]; extern size_t mysql_unpacked_real_data_home_len; extern MYSQL_PLUGIN_IMPORT MY_TMPDIR mysql_tmpdir_list; -extern const char *first_keyword, *delayed_user; +extern const char *first_keyword, *delayed_user, *slave_user; extern MYSQL_PLUGIN_IMPORT const char *my_localhost; extern MYSQL_PLUGIN_IMPORT const char **errmesg; /* Error messages */ extern const char *myisam_recover_options_str; @@ -316,10 +317,6 @@ key_LOCK_pool, key_LOCK_pending_checkpoint; #endif /* HAVE_MMAP */ -#ifdef HAVE_OPENSSL -extern PSI_mutex_key key_LOCK_des_key_file; -#endif - extern PSI_mutex_key key_BINLOG_LOCK_index, key_BINLOG_LOCK_xid_list, key_BINLOG_LOCK_binlog_background_thread, key_LOCK_binlog_end_pos, @@ -399,7 +396,7 @@ extern PSI_file_key key_file_binlog, key_file_binlog_cache, key_file_binlog_index, key_file_binlog_index_cache, key_file_casetest, - key_file_dbopt, key_file_des_key_file, key_file_ERRMSG, key_select_to_file, + key_file_dbopt, key_file_ERRMSG, key_select_to_file, key_file_fileparser, key_file_frm, key_file_global_ddl_log, key_file_load, key_file_loadfile, key_file_log_event_data, key_file_log_event_info, key_file_master_info, key_file_misc, key_file_partition_ddl_log, @@ -412,6 +409,13 @@ key_socket_client_connection; extern PSI_file_key key_file_binlog_state; +#ifdef HAVE_des +extern char* des_key_file; +extern PSI_file_key key_file_des_key_file; +extern PSI_mutex_key key_LOCK_des_key_file; +extern mysql_mutex_t LOCK_des_key_file; +#endif + #ifdef HAVE_PSI_INTERFACE void init_server_psi_keys(); #endif /* HAVE_PSI_INTERFACE */ @@ -651,6 +655,7 @@ extern PSI_stage_info stage_verifying_table; extern PSI_stage_info stage_waiting_for_ddl; extern PSI_stage_info stage_waiting_for_delay_list; +extern PSI_stage_info stage_waiting_for_disk_space; extern PSI_stage_info stage_waiting_for_flush; extern PSI_stage_info stage_waiting_for_gtid_to_be_written_to_binary_log; extern PSI_stage_info stage_waiting_for_handler_insert; @@ -766,10 +771,6 @@ extern MYSQL_PLUGIN_IMPORT mysql_mutex_t LOCK_global_system_variables; extern mysql_rwlock_t LOCK_all_status_vars; extern mysql_mutex_t LOCK_start_thread; -#ifdef HAVE_OPENSSL -extern char* des_key_file; -extern mysql_mutex_t LOCK_des_key_file; -#endif extern MYSQL_PLUGIN_IMPORT mysql_mutex_t LOCK_server_started; extern MYSQL_PLUGIN_IMPORT mysql_cond_t COND_server_started; extern mysql_rwlock_t LOCK_grant, LOCK_sys_init_connect, LOCK_sys_init_slave; @@ -812,6 +813,7 @@ OPT_KEY_CACHE_CHANGED_BLOCKS_HASH_SIZE, OPT_LOG_BASENAME, OPT_LOG_ERROR, + OPT_LOG_SLOW_FILTER, OPT_LOWER_CASE_TABLE_NAMES, OPT_PLUGIN_LOAD, OPT_PLUGIN_LOAD_ADD, @@ -842,7 +844,7 @@ OPT_WSREP_SYNC_WAIT, #endif /* WITH_WSREP */ OPT_MYSQL_COMPATIBILITY, - OPT_TLS_VERSION, + OPT_TLS_VERSION, OPT_SECURE_AUTH, OPT_MYSQL_TO_BE_IMPLEMENTED, OPT_SEQURE_FILE_PRIV, OPT_which_is_always_the_last @@ -884,6 +886,11 @@ /// good for parsing QT_PARSABLE= (1 << 8), + // If an expression is constant, print the expression, not the value + // it evaluates to. Should be used for error messages, so that they + // don't reveal values. + QT_NO_DATA_EXPANSION= (1 << 9), + /// This value means focus on readability, not on ability to parse back, etc. QT_EXPLAIN= QT_TO_SYSTEM_CHARSET | QT_ITEM_IDENT_SKIP_DB_NAMES | @@ -904,12 +911,12 @@ QT_EXPLAIN_EXTENDED= QT_TO_SYSTEM_CHARSET| QT_SHOW_SELECT_NUMBER, - // If an expression is constant, print the expression, not the value - // it evaluates to. Should be used for error messages, so that they - // don't reveal values. - QT_NO_DATA_EXPANSION= (1 << 9), // Remove wrappers added for TVC when creating or showing view - QT_NO_WRAPPERS_FOR_TVC_IN_VIEW= (1 << 12) + QT_NO_WRAPPERS_FOR_TVC_IN_VIEW= (1 << 12), + + /// Print for FRM file. Focus on parse-back. + /// e.g. VIEW expressions and virtual column expressions + QT_FOR_FRM= (1 << 13) }; @@ -975,6 +982,8 @@ extern ulong binlog_checksum_options; extern bool max_user_connections_checking; extern ulong opt_binlog_dbug_fsync_sleep; +static const int SERVER_UID_SIZE= 29; +extern char server_uid[SERVER_UID_SIZE+1]; extern uint volatile global_disable_checkpoint; extern my_bool opt_help; diff -Nru mariadb-10.11.6/sql/net_serv.cc mariadb-10.11.9/sql/net_serv.cc --- mariadb-10.11.6/sql/net_serv.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/net_serv.cc 2024-08-03 07:29:59.000000000 +0000 @@ -74,7 +74,13 @@ #ifdef MYSQL_SERVER #include #include -#define MYSQL_SERVER_my_error my_error + +static void inline MYSQL_SERVER_my_error(uint error, myf flags) +{ + my_error(error, + flags | MYF(global_system_variables.log_warnings > 3 ? ME_ERROR_LOG : 0)); +} + #else static void inline MYSQL_SERVER_my_error(...) {} #endif @@ -156,6 +162,8 @@ net->where_b = net->remain_in_buf=0; net->net_skip_rest_factor= 0; net->last_errno=0; + net->pkt_nr_can_be_reset= 0; + net->using_proxy_protocol= 0; net->thread_specific_malloc= MY_TEST(my_flags & MY_THREAD_SPECIFIC); net->thd= 0; #ifdef MYSQL_SERVER @@ -210,6 +218,7 @@ DBUG_ENTER("net_end"); my_free(net->buff); net->buff=0; + net->using_proxy_protocol= 0; DBUG_VOID_RETURN; } @@ -765,7 +774,18 @@ #endif /* !defined(MYSQL_SERVER) */ net->error= 2; /* Close socket */ net->last_errno= (interrupted ? ER_NET_WRITE_INTERRUPTED : - ER_NET_ERROR_ON_WRITE); + ER_NET_ERROR_ON_WRITE); +#ifdef MYSQL_SERVER + if (global_system_variables.log_warnings > 3) + { + sql_print_warning("Could not write packet: fd: %lld state: %d " + "errno: %d vio_errno: %d length: %ld", + MYF(ME_ERROR_LOG | ME_WARNING), + (longlong) vio_fd(net->vio), (int) net->vio->state, + vio_errno(net->vio), net->last_errno, + (ulong) (end-pos)); + } +#endif MYSQL_SERVER_my_error(net->last_errno, MYF(0)); break; } @@ -936,6 +956,7 @@ return RETRY; /* Change peer address in THD and ACL structures.*/ uint host_errors; + net->using_proxy_protocol= 1; return (handle_proxy_header_result)thd_set_peer_addr(thd, &(peer_info.peer_addr), NULL, peer_info.port, false, &host_errors); @@ -1057,24 +1078,39 @@ { /* Probably in MIT threads */ if (retry_count++ < net->retry_count) continue; - EXTRA_DEBUG_fprintf(stderr, "%s: read looped with error %d, aborting thread\n", - my_progname,vio_errno(net->vio)); + EXTRA_DEBUG_fprintf(stderr, "%s: read looped with error %d on " + "file %lld, aborting thread\n", + my_progname, vio_errno(net->vio), + (longlong) vio_fd(net->vio)); } #ifndef MYSQL_SERVER - if (length != 0 && vio_errno(net->vio) == SOCKET_EINTR) + if (length != 0 && vio_should_retry(net->vio)) { DBUG_PRINT("warning",("Interrupted read. Retrying...")); continue; } #endif - DBUG_PRINT("error",("Couldn't read packet: remain: %u errno: %d length: %ld", + DBUG_PRINT("error",("Could not read packet: remain: %u errno: %d length: %ld", remain, vio_errno(net->vio), (long) length)); len= packet_error; net->error= 2; /* Close socket */ net->last_errno= (vio_was_timeout(net->vio) ? - ER_NET_READ_INTERRUPTED : - ER_NET_READ_ERROR); - MYSQL_SERVER_my_error(net->last_errno, MYF(0)); + ER_NET_READ_INTERRUPTED : + ER_NET_READ_ERROR); +#ifdef MYSQL_SERVER + if (global_system_variables.log_warnings > 3) + { + /* Log things as a warning */ + sql_print_warning("Could not read packet: fd: %lld state: %d " + "read_length: %u errno: %d vio_errno: %d " + "length: %lld", + (longlong) vio_fd(net->vio), + (int) net->vio->state, + remain, vio_errno(net->vio), net->last_errno, + (longlong) length); + } + my_error(net->last_errno, MYF(0)); +#endif /* MYSQL_SERVER */ goto end; } remain -= (uint32) length; @@ -1094,19 +1130,31 @@ #endif if (net->buff[net->where_b + 3] != (uchar) net->pkt_nr) { -#ifndef MYSQL_SERVER - if (net->buff[net->where_b + 3] == (uchar) (net->pkt_nr -1)) + if (net->pkt_nr_can_be_reset) { /* - If the server was killed then the server may have missed the - last sent client packet and the packet numbering may be one off. + We are using a protocol like semi-sync where master and slave + sends packets in parallel. + Copy current one as it can be useful for debugging. */ - DBUG_PRINT("warning", ("Found possible out of order packets")); - expect_error_packet= 1; + net->pkt_nr= net->buff[net->where_b + 3]; } else + { +#ifndef MYSQL_SERVER + if (net->buff[net->where_b + 3] == (uchar) (net->pkt_nr -1)) + { + /* + If the server was killed then the server may have missed the + last sent client packet and the packet numbering may be one off. + */ + DBUG_PRINT("warning", ("Found possible out of order packets")); + expect_error_packet= 1; + } + else #endif - goto packets_out_of_order; + goto packets_out_of_order; + } } net->compress_pkt_nr= ++net->pkt_nr; #ifdef HAVE_COMPRESS @@ -1267,7 +1315,10 @@ my_net_read_packet(NET *net, my_bool read_from_server) { ulong reallen = 0; - return my_net_read_packet_reallen(net, read_from_server, &reallen); + ulong length; + DBUG_ENTER("my_net_read_packet"); + length= my_net_read_packet_reallen(net, read_from_server, &reallen); + DBUG_RETURN(length); } diff -Nru mariadb-10.11.6/sql/opt_range.cc mariadb-10.11.9/sql/opt_range.cc --- mariadb-10.11.6/sql/opt_range.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/opt_range.cc 2024-08-03 07:29:59.000000000 +0000 @@ -2272,10 +2272,10 @@ TRP_RANGE(SEL_ARG *key_arg, uint idx_arg, uint mrr_flags_arg) : key(key_arg), key_idx(idx_arg), mrr_flags(mrr_flags_arg) {} - virtual ~TRP_RANGE() = default; /* Remove gcc warning */ + ~TRP_RANGE() override = default; /* Remove gcc warning */ QUICK_SELECT_I *make_quick(PARAM *param, bool retrieve_full_rows, - MEM_ROOT *parent_alloc) + MEM_ROOT *parent_alloc) override { DBUG_ENTER("TRP_RANGE::make_quick"); QUICK_RANGE_SELECT *quick; @@ -2288,7 +2288,7 @@ DBUG_RETURN(quick); } void trace_basic_info(PARAM *param, - Json_writer_object *trace_object) const; + Json_writer_object *trace_object) const override; }; void TRP_RANGE::trace_basic_info(PARAM *param, @@ -2320,9 +2320,9 @@ { public: TRP_ROR_INTERSECT() = default; /* Remove gcc warning */ - virtual ~TRP_ROR_INTERSECT() = default; /* Remove gcc warning */ + ~TRP_ROR_INTERSECT() override = default; /* Remove gcc warning */ QUICK_SELECT_I *make_quick(PARAM *param, bool retrieve_full_rows, - MEM_ROOT *parent_alloc); + MEM_ROOT *parent_alloc) override; /* Array of pointers to ROR range scans used in this intersection */ struct st_ror_scan_info **first_scan; @@ -2331,7 +2331,7 @@ bool is_covering; /* TRUE if no row retrieval phase is necessary */ double index_scan_costs; /* SUM(cost(index_scan)) */ void trace_basic_info(PARAM *param, - Json_writer_object *trace_object) const; + Json_writer_object *trace_object) const override; }; @@ -2346,13 +2346,13 @@ { public: TRP_ROR_UNION() = default; /* Remove gcc warning */ - virtual ~TRP_ROR_UNION() = default; /* Remove gcc warning */ + ~TRP_ROR_UNION() override = default; /* Remove gcc warning */ QUICK_SELECT_I *make_quick(PARAM *param, bool retrieve_full_rows, - MEM_ROOT *parent_alloc); + MEM_ROOT *parent_alloc) override; TABLE_READ_PLAN **first_ror; /* array of ptrs to plans for merged scans */ TABLE_READ_PLAN **last_ror; /* end of the above array */ void trace_basic_info(PARAM *param, - Json_writer_object *trace_object) const; + Json_writer_object *trace_object) const override; }; void TRP_ROR_UNION::trace_basic_info(PARAM *param, @@ -2379,15 +2379,15 @@ { public: TRP_INDEX_INTERSECT() = default; /* Remove gcc warning */ - virtual ~TRP_INDEX_INTERSECT() = default; /* Remove gcc warning */ + ~TRP_INDEX_INTERSECT() override = default; /* Remove gcc warning */ QUICK_SELECT_I *make_quick(PARAM *param, bool retrieve_full_rows, - MEM_ROOT *parent_alloc); + MEM_ROOT *parent_alloc) override; TRP_RANGE **range_scans; /* array of ptrs to plans of intersected scans */ TRP_RANGE **range_scans_end; /* end of the array */ /* keys whose scans are to be filtered by cpk conditions */ key_map filtered_scans; void trace_basic_info(PARAM *param, - Json_writer_object *trace_object) const; + Json_writer_object *trace_object) const override; }; @@ -2416,13 +2416,13 @@ { public: TRP_INDEX_MERGE() = default; /* Remove gcc warning */ - virtual ~TRP_INDEX_MERGE() = default; /* Remove gcc warning */ + ~TRP_INDEX_MERGE() override = default; /* Remove gcc warning */ QUICK_SELECT_I *make_quick(PARAM *param, bool retrieve_full_rows, - MEM_ROOT *parent_alloc); + MEM_ROOT *parent_alloc) override; TRP_RANGE **range_scans; /* array of ptrs to plans of merged scans */ TRP_RANGE **range_scans_end; /* end of the array */ void trace_basic_info(PARAM *param, - Json_writer_object *trace_object) const; + Json_writer_object *trace_object) const override; }; void TRP_INDEX_MERGE::trace_basic_info(PARAM *param, @@ -2484,13 +2484,13 @@ if (key_infix_len) memcpy(this->key_infix, key_infix_arg, key_infix_len); } - virtual ~TRP_GROUP_MIN_MAX() = default; /* Remove gcc warning */ + ~TRP_GROUP_MIN_MAX() override = default; /* Remove gcc warning */ QUICK_SELECT_I *make_quick(PARAM *param, bool retrieve_full_rows, - MEM_ROOT *parent_alloc); + MEM_ROOT *parent_alloc) override; void use_index_scan() { is_index_scan= TRUE; } void trace_basic_info(PARAM *param, - Json_writer_object *trace_object) const; + Json_writer_object *trace_object) const override; }; @@ -2692,7 +2692,7 @@ bool ordered_output, bool remove_false_parts_of_where, bool only_single_index_range_scan, - bool suppress_unusable_key_notes) + Item_func::Bitmap note_unusable_keys) { uint idx; double scan_time; @@ -2722,7 +2722,10 @@ only_single_index_range_scan= 1; if (head->force_index || force_quick_range) + { + DEBUG_SYNC(thd, "in_forced_range_optimize"); scan_time= read_time= DBL_MAX; + } else { scan_time= rows2double(records) / TIME_FOR_COMPARE; @@ -2786,9 +2789,9 @@ param.max_key_parts= 0; param.remove_false_where_parts= remove_false_parts_of_where; param.force_default_mrr= ordered_output; - param.note_unusable_keys= (!suppress_unusable_key_notes && - thd->give_notes_for_unusable_keys()); - + param.note_unusable_keys= thd->give_notes_for_unusable_keys() ? + note_unusable_keys : + Item_func::BITMAP_NONE; param.possible_keys.clear_all(); thd->no_errors=1; // Don't warn about NULL @@ -3119,6 +3122,12 @@ free_root(&alloc,MYF(0)); // Return memory & allocator thd->mem_root= param.old_root; thd->no_errors=0; + if (thd->killed || thd->is_error()) + { + delete quick; + quick= NULL; + returnval= ERROR; + } } DBUG_EXECUTE("info", print_quick(quick, &needed_reg);); @@ -3136,6 +3145,53 @@ /* + @brief + Create a bitmap of columns for which to perform Range Analysis for EITS + condition selectivity estimates. + + @detail + Walk through the bitmap of fields used in the query, and + - pick columns for which EITS data is usable (see is_eits_usable() call) + - do not produce more than MAX_KEY columns. Range Analyzer cannot handle + more than that. If there are more than MAX_KEY eligible columns, + this function should be called multiple times to produce multiple + bitmaps. + + @param used_fields Columns used by the query + @param col_no Start from this column + @param out OUT Filled column bitmap + + @return + (uint)-1 If there are no more columns for range analysis. + Other Index of the last considered column. Pass this to next call to + this function +*/ + +uint get_columns_for_pseudo_indexes(const TABLE *table, + const MY_BITMAP *used_fields, int col_no, + MY_BITMAP *out) +{ + bitmap_clear_all(out); + int n_bits= 0; + + for (; table->field[col_no]; col_no++) + { + if (bitmap_is_set(used_fields, col_no) && + is_eits_usable(table->field[col_no])) + { + bitmap_set_bit(out, col_no); + if (++n_bits == MAX_KEY) + { + col_no++; + break; + } + } + } + return n_bits? col_no: (uint)-1; +} + + +/* Build descriptors of pseudo-indexes over columns to perform range analysis SYNOPSIS @@ -3160,22 +3216,11 @@ { Field **field_ptr; TABLE *table= param->table; - uint parts= 0; - - for (field_ptr= table->field; *field_ptr; field_ptr++) - { - Field *field= *field_ptr; - if (bitmap_is_set(used_fields, field->field_index) && - is_eits_usable(field)) - parts++; - } + uint parts= bitmap_bits_set(used_fields); KEY_PART *key_part; uint keys= 0; - if (!parts) - return TRUE; - if (!(key_part= (KEY_PART *) alloc_root(param->mem_root, sizeof(KEY_PART) * parts))) return TRUE; @@ -3187,9 +3232,6 @@ Field *field= *field_ptr; if (bitmap_is_set(used_fields, field->field_index)) { - if (!is_eits_usable(field)) - continue; - uint16 store_length; uint16 max_key_part_length= (uint16) table->file->max_key_part_length(); key_part->key= keys; @@ -3534,8 +3576,6 @@ PARAM param; MEM_ROOT alloc; SEL_TREE *tree; - double rows; - init_sql_alloc(key_memory_quick_range_select_root, &alloc, thd->variables.range_alloc_block_size, 0, MYF(MY_THREAD_SPECIFIC)); bzero((void*) ¶m, sizeof(param)); @@ -3545,67 +3585,90 @@ param.table= table; param.remove_false_where_parts= true; - if (create_key_parts_for_pseudo_indexes(¶m, used_fields)) - goto free_alloc; - param.prev_tables= param.read_tables= 0; param.current_table= table->map; param.using_real_indexes= FALSE; - param.real_keynr[0]= 0; + MEM_UNDEFINED(¶m.real_keynr, sizeof(param.real_keynr)); + param.alloced_sel_args= 0; param.max_key_parts= 0; - thd->no_errors=1; + thd->no_errors=1; + table->reginfo.impossible_range= 0; - tree= cond[0]->get_mm_tree(¶m, cond); + uint used_fields_buff_size= bitmap_buffer_size(table->s->fields); + my_bitmap_map *used_fields_buff= (my_bitmap_map*)thd->alloc(used_fields_buff_size); + MY_BITMAP cols_for_indexes; + (void) my_bitmap_init(&cols_for_indexes, used_fields_buff, table->s->fields); + bitmap_clear_all(&cols_for_indexes); - if (!tree) - goto free_alloc; - - table->reginfo.impossible_range= 0; - if (tree->type == SEL_TREE::IMPOSSIBLE) - { - rows= 0; - table->reginfo.impossible_range= 1; - goto free_alloc; - } - else if (tree->type == SEL_TREE::ALWAYS) - { - rows= table_records; - goto free_alloc; - } - else if (tree->type == SEL_TREE::MAYBE) - { - rows= table_records; - goto free_alloc; - } + uint column_no= 0; // Start looping from the first column. + /* + Try getting selectivity estimates for every field that is used in the + query and has EITS statistics. We do this: + + for every usable field col + create a pseudo INDEX(col); + Run the range analyzer (get_mm_tree) for these pseudo-indexes; + Look at produced ranges and get their selectivity estimates; - for (uint idx= 0; idx < param.keys; idx++) + Note that the range analyzer can process at most MAX_KEY indexes. If + the table has >MAX_KEY eligible columns, we will do several range + analyzer runs. + */ + + while (1) { - SEL_ARG *key= tree->keys[idx]; - if (key) + column_no= get_columns_for_pseudo_indexes(table, used_fields, column_no, + &cols_for_indexes); + if (column_no == (uint)-1) + break; /* Couldn't create any pseudo-indexes. This means we're done */ + + if (create_key_parts_for_pseudo_indexes(¶m, &cols_for_indexes)) + goto free_alloc; + + tree= cond[0]->get_mm_tree(¶m, cond); + + if (!tree || + tree->type == SEL_TREE::ALWAYS || + tree->type == SEL_TREE::MAYBE) { - Json_writer_object selectivity_for_column(thd); - selectivity_for_column.add("column_name", key->field->field_name); - if (key->type == SEL_ARG::IMPOSSIBLE) - { - rows= 0; - table->reginfo.impossible_range= 1; - selectivity_for_column.add("selectivity_from_histogram", rows); - selectivity_for_column.add("cause", "impossible range"); - goto free_alloc; - } - else + /* Couldn't infer anything. But there could be more fields, so continue */ + continue; + } + + if (tree->type == SEL_TREE::IMPOSSIBLE) + { + table->reginfo.impossible_range= 1; + goto free_alloc; + } + + for (uint idx= 0; idx < param.keys; idx++) + { + SEL_ARG *key= tree->keys[idx]; + if (key) { - enum_check_fields save_count_cuted_fields= thd->count_cuted_fields; - thd->count_cuted_fields= CHECK_FIELD_IGNORE; - rows= records_in_column_ranges(¶m, idx, key); - thd->count_cuted_fields= save_count_cuted_fields; - if (rows != DBL_MAX) + Json_writer_object selectivity_for_column(thd); + selectivity_for_column.add("column_name", key->field->field_name); + if (key->type == SEL_ARG::IMPOSSIBLE) { - key->field->cond_selectivity= rows/table_records; - selectivity_for_column.add("selectivity_from_histogram", - key->field->cond_selectivity); + table->reginfo.impossible_range= 1; + selectivity_for_column.add("selectivity_from_histogram", 0); + selectivity_for_column.add("cause", "impossible range"); + goto free_alloc; + } + else + { + enum_check_fields save_count_cuted_fields= thd->count_cuted_fields; + thd->count_cuted_fields= CHECK_FIELD_IGNORE; + double rows= records_in_column_ranges(¶m, idx, key); + thd->count_cuted_fields= save_count_cuted_fields; + if (rows != DBL_MAX) + { + key->field->cond_selectivity= rows/table_records; + selectivity_for_column.add("selectivity_from_histogram", + key->field->cond_selectivity); + } } } } @@ -3999,7 +4062,7 @@ range_par->remove_jump_scans= FALSE; range_par->real_keynr[0]= 0; range_par->alloced_sel_args= 0; - range_par->note_unusable_keys= 0; + range_par->note_unusable_keys= Item_func::BITMAP_NONE; thd->no_errors=1; // Don't warn about NULL thd->mem_root=&alloc; @@ -6733,8 +6796,7 @@ void ror_intersect_cpy(ROR_INTERSECT_INFO *dst, const ROR_INTERSECT_INFO *src) { dst->param= src->param; - memcpy(dst->covered_fields.bitmap, src->covered_fields.bitmap, - no_bytes_in_map(&src->covered_fields)); + bitmap_copy(&dst->covered_fields, &src->covered_fields); dst->out_rows= src->out_rows; dst->is_covering= src->is_covering; dst->index_records= src->index_records; @@ -7391,7 +7453,7 @@ (*scan)->used_fields_covered= bitmap_bits_set(&(*scan)->covered_fields); (*scan)->first_uncovered_field= - bitmap_get_first(&(*scan)->covered_fields); + bitmap_get_first_clear(&(*scan)->covered_fields); } my_qsort(ror_scan_mark, ror_scans_end-ror_scan_mark, sizeof(ROR_SCAN_INFO*), @@ -8762,9 +8824,11 @@ if (field->result_type() == STRING_RESULT && field->charset() != compare_collation()) { - if (param->note_unusable_keys) + if (param->note_unusable_keys & BITMAP_LIKE) field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part, - func_name_cstring(), value, + func_name_cstring(), + compare_collation(), + value, Data_type_compatibility:: INCOMPATIBLE_COLLATION); DBUG_RETURN(0); @@ -8780,9 +8844,11 @@ field->type_handler() == &type_handler_enum || field->type_handler() == &type_handler_set) { - if (param->note_unusable_keys) + if (param->note_unusable_keys & BITMAP_LIKE) field->raise_note_cannot_use_key_part(param->thd, keynr, key_part->part, - func_name_cstring(), value, + func_name_cstring(), + compare_collation(), + value, Data_type_compatibility:: INCOMPATIBLE_DATA_TYPE); DBUG_RETURN(0); @@ -8887,7 +8953,8 @@ TODO: Perhaps we also need to raise a similar note when a partition could not be used (when using_real_indexes==false). */ - if (param->using_real_indexes && param->note_unusable_keys) + if (param->using_real_indexes && param->note_unusable_keys && + (param->note_unusable_keys & cond->bitmap_bit())) { DBUG_ASSERT(keynr < table->s->keys); /* @@ -8901,6 +8968,7 @@ */ raise_note_cannot_use_key_part(param->thd, keynr, key_part->part, scalar_comparison_op_to_lex_cstring(op), + cond->compare_collation(), value, compat); } return compat; @@ -15173,13 +15241,6 @@ { if (group_prefix) /* Already initialized. */ return 0; - - /* - We allocate one byte more to serve the case when the last field in - the buffer is compared using uint3korr (e.g. a Field_newdate field) - */ - if (!(last_prefix= (uchar*) alloc_root(&alloc, group_prefix_len+1))) - return 1; /* We may use group_prefix to store keys with all select fields, so allocate enough space for it. @@ -15436,8 +15497,7 @@ QUICK_GROUP_MIN_MAX_SELECT::reset() DESCRIPTION - Initialize the index chosen for access and find and store the prefix - of the last group. The method is expensive since it performs disk access. + Initialize the index chosen for access. RETURN 0 OK @@ -15459,12 +15519,6 @@ } if (quick_prefix_select && quick_prefix_select->reset()) DBUG_RETURN(1); - result= file->ha_index_last(record); - if (result == HA_ERR_END_OF_FILE) - DBUG_RETURN(0); - /* Save the prefix of the last group. */ - key_copy(last_prefix, record, index_info, group_prefix_len); - DBUG_RETURN(0); } @@ -15510,34 +15564,20 @@ #else int result; #endif - int is_last_prefix= 0; - DBUG_ENTER("QUICK_GROUP_MIN_MAX_SELECT::get_next"); /* - Loop until a group is found that satisfies all query conditions or the last - group is reached. + Loop until a group is found that satisfies all query conditions or + there are no satisfying groups left */ do { result= next_prefix(); + if (result != 0) + break; /* - Check if this is the last group prefix. Notice that at this point - this->record contains the current prefix in record format. + At this point this->record contains the current prefix in record format. */ - if (!result) - { - is_last_prefix= key_cmp(index_info->key_part, last_prefix, - group_prefix_len); - DBUG_ASSERT(is_last_prefix <= 0); - } - else - { - if (result == HA_ERR_KEY_NOT_FOUND) - continue; - break; - } - if (have_min) { min_res= next_min(); @@ -15566,8 +15606,7 @@ HA_READ_KEY_EXACT); result= have_min ? min_res : have_max ? max_res : result; - } while ((result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE) && - is_last_prefix != 0); + } while (result == HA_ERR_KEY_NOT_FOUND || result == HA_ERR_END_OF_FILE); if (result == HA_ERR_KEY_NOT_FOUND) result= HA_ERR_END_OF_FILE; @@ -16597,6 +16636,7 @@ void print_range(String *out, const KEY_PART_INFO *key_part, KEY_MULTI_RANGE *range, uint n_key_parts) { + Check_level_instant_set check_field(current_thd, CHECK_FIELD_IGNORE); uint flag= range->range_flag; String key_name; key_name.set_charset(system_charset_info); diff -Nru mariadb-10.11.6/sql/opt_range.h mariadb-10.11.9/sql/opt_range.h --- mariadb-10.11.6/sql/opt_range.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/opt_range.h 2024-08-03 07:29:59.000000000 +0000 @@ -889,7 +889,10 @@ */ bool remove_false_where_parts; - bool note_unusable_keys; // Give SQL notes for unusable keys + /* + Which functions should give SQL notes for unusable keys. + */ + Item_func::Bitmap note_unusable_keys; /* used_key_no -> table_key_no translation table. Only makes sense if @@ -914,7 +917,6 @@ { return thd->killed || - thd->is_fatal_error || thd->is_error() || alloced_sel_args > thd->variables.optimizer_max_sel_args; } @@ -1340,28 +1342,28 @@ { return new QUICK_RANGE_SELECT(thd, head, index, no_alloc, parent_alloc, create_error); } - void need_sorted_output(); - int init(); - int reset(void); - int get_next(); - void range_end(); + void need_sorted_output() override; + int init() override; + int reset(void) override; + int get_next() override; + void range_end() override; int get_next_prefix(uint prefix_length, uint group_key_parts, uchar *cur_prefix); - bool reverse_sorted() { return 0; } - bool unique_key_range(); - int init_ror_merged_scan(bool reuse_handler, MEM_ROOT *alloc); - void save_last_pos() + bool reverse_sorted() override { return 0; } + bool unique_key_range() override; + int init_ror_merged_scan(bool reuse_handler, MEM_ROOT *alloc) override; + void save_last_pos() override { file->position(record); } - int get_type() { return QS_TYPE_RANGE; } - void add_keys_and_lengths(String *key_names, String *used_lengths); - Explain_quick_select *get_explain(MEM_ROOT *alloc); + int get_type() override { return QS_TYPE_RANGE; } + void add_keys_and_lengths(String *key_names, String *used_lengths) override; + Explain_quick_select *get_explain(MEM_ROOT *alloc) override; #ifndef DBUG_OFF - void dbug_dump(int indent, bool verbose); + void dbug_dump(int indent, bool verbose) override; #endif - virtual void replace_handler(handler *new_file) { file= new_file; } - QUICK_SELECT_I *make_reverse(uint used_key_parts_arg); + void replace_handler(handler *new_file) override { file= new_file; } + QUICK_SELECT_I *make_reverse(uint used_key_parts_arg) override; - virtual void add_used_key_part_to_set(); + void add_used_key_part_to_set() override; private: /* Default copy ctor used by QUICK_SELECT_DESC */ @@ -1409,13 +1411,13 @@ :QUICK_RANGE_SELECT(thd, table, index_arg, no_alloc, parent_alloc, create_err) {}; - virtual QUICK_RANGE_SELECT *clone(bool *create_error) + QUICK_RANGE_SELECT *clone(bool *create_error) override { DBUG_ASSERT(0); return new QUICK_RANGE_SELECT_GEOM(thd, head, index, no_alloc, parent_alloc, create_error); } - virtual int get_next(); + int get_next() override; }; @@ -1491,16 +1493,16 @@ QUICK_INDEX_SORT_SELECT(THD *thd, TABLE *table); ~QUICK_INDEX_SORT_SELECT(); - int init(); - void need_sorted_output() { DBUG_ASSERT(0); /* Can't do it */ } - int reset(void); - bool reverse_sorted() { return false; } - bool unique_key_range() { return false; } - bool is_keys_used(const MY_BITMAP *fields); + int init() override; + void need_sorted_output() override { DBUG_ASSERT(0); /* Can't do it */ } + int reset(void) override; + bool reverse_sorted() override { return false; } + bool unique_key_range() override { return false; } + bool is_keys_used(const MY_BITMAP *fields) override; #ifndef DBUG_OFF - void dbug_dump(int indent, bool verbose); + void dbug_dump(int indent, bool verbose) override; #endif - Explain_quick_select *get_explain(MEM_ROOT *alloc); + Explain_quick_select *get_explain(MEM_ROOT *alloc) override; bool push_quick_back(QUICK_RANGE_SELECT *quick_sel_range); @@ -1512,7 +1514,7 @@ MEM_ROOT alloc; THD *thd; - virtual bool is_valid() + bool is_valid() override { List_iterator_fast it(quick_selects); QUICK_RANGE_SELECT *quick; @@ -1531,7 +1533,7 @@ /* used to get rows collected in Unique */ READ_RECORD read_record; - virtual void add_used_key_part_to_set(); + void add_used_key_part_to_set() override; }; @@ -1542,31 +1544,31 @@ /* true if this select is currently doing a clustered PK scan */ bool doing_pk_scan; protected: - int read_keys_and_merge(); + int read_keys_and_merge() override; public: QUICK_INDEX_MERGE_SELECT(THD *thd_arg, TABLE *table) :QUICK_INDEX_SORT_SELECT(thd_arg, table) {} - int get_next(); - int get_type() { return QS_TYPE_INDEX_MERGE; } - void add_keys_and_lengths(String *key_names, String *used_lengths); + int get_next() override; + int get_type() override { return QS_TYPE_INDEX_MERGE; } + void add_keys_and_lengths(String *key_names, String *used_lengths) override; }; class QUICK_INDEX_INTERSECT_SELECT : public QUICK_INDEX_SORT_SELECT { protected: - int read_keys_and_merge(); + int read_keys_and_merge() override; public: QUICK_INDEX_INTERSECT_SELECT(THD *thd_arg, TABLE *table) :QUICK_INDEX_SORT_SELECT(thd_arg, table) {} key_map filtered_scans; - int get_next(); - int get_type() { return QS_TYPE_INDEX_INTERSECT; } - void add_keys_and_lengths(String *key_names, String *used_lengths); - Explain_quick_select *get_explain(MEM_ROOT *alloc); + int get_next() override; + int get_type() override { return QS_TYPE_INDEX_INTERSECT; } + void add_keys_and_lengths(String *key_names, String *used_lengths) override; + Explain_quick_select *get_explain(MEM_ROOT *alloc) override; }; @@ -1596,21 +1598,21 @@ MEM_ROOT *parent_alloc); ~QUICK_ROR_INTERSECT_SELECT(); - int init(); - void need_sorted_output() { DBUG_ASSERT(0); /* Can't do it */ } - int reset(void); - int get_next(); - bool reverse_sorted() { return false; } - bool unique_key_range() { return false; } - int get_type() { return QS_TYPE_ROR_INTERSECT; } - void add_keys_and_lengths(String *key_names, String *used_lengths); - Explain_quick_select *get_explain(MEM_ROOT *alloc); - bool is_keys_used(const MY_BITMAP *fields); - void add_used_key_part_to_set(); + int init() override; + void need_sorted_output() override { DBUG_ASSERT(0); /* Can't do it */ } + int reset(void) override; + int get_next() override; + bool reverse_sorted() override { return false; } + bool unique_key_range() override { return false; } + int get_type() override { return QS_TYPE_ROR_INTERSECT; } + void add_keys_and_lengths(String *key_names, String *used_lengths) override; + Explain_quick_select *get_explain(MEM_ROOT *alloc) override; + bool is_keys_used(const MY_BITMAP *fields) override; + void add_used_key_part_to_set() override; #ifndef DBUG_OFF - void dbug_dump(int indent, bool verbose); + void dbug_dump(int indent, bool verbose) override; #endif - int init_ror_merged_scan(bool reuse_handler, MEM_ROOT *alloc); + int init_ror_merged_scan(bool reuse_handler, MEM_ROOT *alloc) override; bool push_quick_back(MEM_ROOT *alloc, QUICK_RANGE_SELECT *quick_sel_range); class QUICK_SELECT_WITH_RECORD : public Sql_alloc @@ -1627,7 +1629,7 @@ */ List quick_selects; - virtual bool is_valid() + bool is_valid() override { List_iterator_fast it(quick_selects); QUICK_SELECT_WITH_RECORD *quick; @@ -1676,26 +1678,26 @@ QUICK_ROR_UNION_SELECT(THD *thd, TABLE *table); ~QUICK_ROR_UNION_SELECT(); - int init(); - void need_sorted_output() { DBUG_ASSERT(0); /* Can't do it */ } - int reset(void); - int get_next(); - bool reverse_sorted() { return false; } - bool unique_key_range() { return false; } - int get_type() { return QS_TYPE_ROR_UNION; } - void add_keys_and_lengths(String *key_names, String *used_lengths); - Explain_quick_select *get_explain(MEM_ROOT *alloc); - bool is_keys_used(const MY_BITMAP *fields); - void add_used_key_part_to_set(); + int init() override; + void need_sorted_output() override { DBUG_ASSERT(0); /* Can't do it */ } + int reset(void) override; + int get_next() override; + bool reverse_sorted() override { return false; } + bool unique_key_range() override { return false; } + int get_type() override { return QS_TYPE_ROR_UNION; } + void add_keys_and_lengths(String *key_names, String *used_lengths) override; + Explain_quick_select *get_explain(MEM_ROOT *alloc) override; + bool is_keys_used(const MY_BITMAP *fields) override; + void add_used_key_part_to_set() override; #ifndef DBUG_OFF - void dbug_dump(int indent, bool verbose); + void dbug_dump(int indent, bool verbose) override; #endif bool push_quick_back(QUICK_SELECT_I *quick_sel_range); List quick_selects; /* Merged quick selects */ - virtual bool is_valid() + bool is_valid() override { List_iterator_fast it(quick_selects); QUICK_SELECT_I *quick; @@ -1768,7 +1770,6 @@ uchar *group_prefix; /* Key prefix consisting of the GROUP fields. */ const uint group_prefix_len; /* Length of the group prefix. */ uint group_key_parts; /* A number of keyparts in the group prefix */ - uchar *last_prefix; /* Prefix of the last group for detecting EOF. */ bool have_min; /* Specify whether we are computing */ bool have_max; /* a MIN, a MAX, or both. */ bool have_agg_distinct;/* aggregate_function(DISTINCT ...). */ @@ -1822,21 +1823,21 @@ void update_key_stat(); void adjust_prefix_ranges(); bool alloc_buffers(); - int init(); - void need_sorted_output() { /* always do it */ } - int reset(); - int get_next(); - bool reverse_sorted() { return false; } - bool unique_key_range() { return false; } - int get_type() { return QS_TYPE_GROUP_MIN_MAX; } - void add_keys_and_lengths(String *key_names, String *used_lengths); - void add_used_key_part_to_set(); + int init() override; + void need_sorted_output() override { /* always do it */ } + int reset() override; + int get_next() override; + bool reverse_sorted() override { return false; } + bool unique_key_range() override { return false; } + int get_type() override { return QS_TYPE_GROUP_MIN_MAX; } + void add_keys_and_lengths(String *key_names, String *used_lengths) override; + void add_used_key_part_to_set() override; #ifndef DBUG_OFF - void dbug_dump(int indent, bool verbose); + void dbug_dump(int indent, bool verbose) override; #endif bool is_agg_distinct() { return have_agg_distinct; } bool loose_scan_is_scanning() { return is_index_scan; } - Explain_quick_select *get_explain(MEM_ROOT *alloc); + Explain_quick_select *get_explain(MEM_ROOT *alloc) override; }; @@ -1844,18 +1845,18 @@ { public: QUICK_SELECT_DESC(QUICK_RANGE_SELECT *q, uint used_key_parts); - virtual QUICK_RANGE_SELECT *clone(bool *create_error) + QUICK_RANGE_SELECT *clone(bool *create_error) override { DBUG_ASSERT(0); return new QUICK_SELECT_DESC(this, used_key_parts); } - int get_next(); - bool reverse_sorted() { return 1; } - int get_type() { return QS_TYPE_RANGE_DESC; } - QUICK_SELECT_I *make_reverse(uint used_key_parts_arg) + int get_next() override; + bool reverse_sorted() override { return 1; } + int get_type() override { return QS_TYPE_RANGE_DESC; } + QUICK_SELECT_I *make_reverse(uint used_key_parts_arg) override { return this; // is already reverse sorted } private: bool range_reads_after_key(QUICK_RANGE *range); - int reset(void) { rev_it.rewind(); return QUICK_RANGE_SELECT::reset(); } + int reset(void) override { rev_it.rewind(); return QUICK_RANGE_SELECT::reset(); } List rev_ranges; List_iterator rev_it; uint used_key_parts; @@ -1894,12 +1895,14 @@ true - for ERROR and IMPOSSIBLE_RANGE false - Ok */ - bool check_quick(THD *thd, bool force_quick_range, ha_rows limit) + bool check_quick(THD *thd, bool force_quick_range, ha_rows limit, + Item_func::Bitmap note_unusable_keys) { key_map tmp; tmp.set_all(); return test_quick_select(thd, tmp, 0, limit, force_quick_range, - FALSE, FALSE, FALSE) != OK; + FALSE, FALSE, FALSE, + note_unusable_keys) != OK; } /* @@ -1929,7 +1932,7 @@ bool ordered_output, bool remove_false_parts_of_where, bool only_single_index_range_scan, - bool suppress_unusable_key_notes = 0); + Item_func::Bitmap note_unusable_keys); }; typedef enum SQL_SELECT::quick_select_return_type quick_select_return; @@ -1974,12 +1977,12 @@ QUICK_RANGE_SELECT (thd, table, key, 1, NULL, create_err) { (void) init(); } ~FT_SELECT() { file->ft_end(); } - virtual QUICK_RANGE_SELECT *clone(bool *create_error) + QUICK_RANGE_SELECT *clone(bool *create_error) override { DBUG_ASSERT(0); return new FT_SELECT(thd, head, index, create_error); } - int init() { return file->ft_init(); } - int reset() { return 0; } - int get_next() { return file->ha_ft_read(record); } - int get_type() { return QS_TYPE_FULLTEXT; } + int init() override { return file->ft_init(); } + int reset() override { return 0; } + int get_next() override { return file->ha_ft_read(record); } + int get_type() override { return QS_TYPE_FULLTEXT; } }; FT_SELECT *get_ft_select(THD *thd, TABLE *table, uint key); diff -Nru mariadb-10.11.6/sql/opt_split.cc mariadb-10.11.9/sql/opt_split.cc --- mariadb-10.11.6/sql/opt_split.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/opt_split.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1335,6 +1335,7 @@ { table_map prev_tables= 0; table_map all_tables= (table_map(1) << table_count) - 1; + table_map prev_sjm_lookup_tables= 0; for (uint tablenr= 0; tablenr < table_count; tablenr++) { POSITION *cur_pos= &best_positions[tablenr]; @@ -1343,7 +1344,7 @@ { SplM_plan_info *spl_plan= cur_pos->spl_plan; table_map excluded_tables= (all_tables & ~prev_tables) | - sjm_lookup_tables; + prev_sjm_lookup_tables; ; if (spl_plan) { @@ -1361,6 +1362,8 @@ return true; } prev_tables|= tab->table->map; + if (cur_pos->sj_strategy == SJ_OPT_MATERIALIZE) + prev_sjm_lookup_tables|= tab->table->map; } return false; } diff -Nru mariadb-10.11.6/sql/opt_subselect.cc mariadb-10.11.9/sql/opt_subselect.cc --- mariadb-10.11.6/sql/opt_subselect.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/opt_subselect.cc 2024-08-03 07:29:59.000000000 +0000 @@ -638,8 +638,8 @@ { SELECT_LEX *current= thd->lex->current_select; thd->lex->current_select= current->return_after_parsing(); - char const *save_where= thd->where; - thd->where= "IN/ALL/ANY subquery"; + THD_WHERE save_where= thd->where; + thd->where= THD_WHERE::IN_ALL_ANY_SUBQUERY; Item **left= in_subs->left_exp_ptr(); bool failure= (*left)->fix_fields_if_needed(thd, left); @@ -5849,7 +5849,7 @@ select_value_catcher(THD *thd_arg, Item_subselect *item_arg): select_subselect(thd_arg, item_arg) {} - int send_data(List &items); + int send_data(List &items) override; int setup(List *items); bool assigned; /* TRUE <=> we've caught a value */ uint n_elements; /* How many elements we get */ diff -Nru mariadb-10.11.6/sql/opt_table_elimination.cc mariadb-10.11.9/sql/opt_table_elimination.cc --- mariadb-10.11.6/sql/opt_table_elimination.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/opt_table_elimination.cc 2024-08-03 07:29:59.000000000 +0000 @@ -257,9 +257,9 @@ Field *field; /* Field this object is representing */ /* Iteration over unbound modules that are our dependencies */ - Iterator init_unbound_modules_iter(char *buf); + Iterator init_unbound_modules_iter(char *buf) override; Dep_module* get_next_unbound_module(Dep_analysis_context *dac, - Iterator iter); + Iterator iter) override; void make_unbound_modules_iter_skip_keys(Iterator iter); @@ -326,9 +326,9 @@ Dep_module_pseudo_key *pseudo_key; /* Iteration over unbound modules that are our dependencies */ - Iterator init_unbound_modules_iter(char *buf); + Iterator init_unbound_modules_iter(char *buf) override; Dep_module* get_next_unbound_module(Dep_analysis_context *dac, - Iterator iter); + Iterator iter) override; static const size_t iterator_size; private: class Module_iter @@ -410,8 +410,8 @@ /* Used during condition analysis only, similar to KEYUSE::level */ uint level; - Iterator init_unbound_values_iter(char *buf); - Dep_value* get_next_unbound_value(Dep_analysis_context *dac, Iterator iter); + Iterator init_unbound_values_iter(char *buf) override; + Dep_value* get_next_unbound_value(Dep_analysis_context *dac, Iterator iter) override; static const size_t iterator_size; private: class Value_iter @@ -445,8 +445,8 @@ /* Unique keys form a linked list, ordered by keyno */ Dep_module_key *next_table_key; - Iterator init_unbound_values_iter(char *buf); - Dep_value* get_next_unbound_value(Dep_analysis_context *dac, Iterator iter); + Iterator init_unbound_values_iter(char *buf) override; + Dep_value* get_next_unbound_value(Dep_analysis_context *dac, Iterator iter) override; static const size_t iterator_size; private: class Value_iter @@ -529,18 +529,18 @@ { unbound_args= n_children; } - bool is_final() { return TRUE; } + bool is_final() override { return TRUE; } /* This is the goal module, so the running wave algorithm should terminate once it sees that this module is applicable and should never try to apply it, hence no use for unbound value iterator implementation. */ - Iterator init_unbound_values_iter(char *buf) + Iterator init_unbound_values_iter(char *buf) override { DBUG_ASSERT(0); return NULL; } - Dep_value* get_next_unbound_value(Dep_analysis_context *dac, Iterator iter) + Dep_value* get_next_unbound_value(Dep_analysis_context *dac, Iterator iter) override { DBUG_ASSERT(0); return NULL; @@ -1057,7 +1057,7 @@ Field_dependency_recorder(Dep_analysis_context *ctx_arg): ctx(ctx_arg) {} - void visit_field(Item_field *item) + void visit_field(Item_field *item) override { Field *field= item->field; Dep_value_table *tbl_dep; diff -Nru mariadb-10.11.6/sql/opt_trace.cc mariadb-10.11.9/sql/opt_trace.cc --- mariadb-10.11.6/sql/opt_trace.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/opt_trace.cc 2024-08-03 07:29:59.000000000 +0000 @@ -103,7 +103,8 @@ sql_command == SQLCOM_UPDATE || sql_command == SQLCOM_DELETE || sql_command == SQLCOM_DELETE_MULTI || - sql_command == SQLCOM_UPDATE_MULTI; + sql_command == SQLCOM_UPDATE_MULTI || + sql_command == SQLCOM_INSERT_SELECT; } void opt_trace_print_expanded_query(THD *thd, SELECT_LEX *select_lex, diff -Nru mariadb-10.11.6/sql/parse_file.h mariadb-10.11.9/sql/parse_file.h --- mariadb-10.11.6/sql/parse_file.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/parse_file.h 2024-08-03 07:29:59.000000000 +0000 @@ -68,8 +68,8 @@ { public: File_parser_dummy_hook() = default; /* Remove gcc warning */ - virtual bool process_unknown_string(const char *&unknown_key, uchar* base, - MEM_ROOT *mem_root, const char *end); + bool process_unknown_string(const char *&unknown_key, uchar* base, + MEM_ROOT *mem_root, const char *end) override; }; extern File_parser_dummy_hook file_parser_dummy_hook; diff -Nru mariadb-10.11.6/sql/partition_info.cc mariadb-10.11.9/sql/partition_info.cc --- mariadb-10.11.6/sql/partition_info.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/partition_info.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1985,7 +1985,7 @@ part_column_list_val *col_val; Name_resolution_context *context= &thd->lex->current_select->context; TABLE_LIST *save_list= context->table_list; - const char *save_where= thd->where; + THD_WHERE save_where= thd->where; DBUG_ENTER("partition_info::add_column_list_value"); if (part_type == LIST_PARTITION && @@ -1999,9 +1999,9 @@ context->table_list= 0; if (column_list) - thd->where= "field list"; + thd->where= THD_WHERE::FIELD_LIST; else - thd->where= "partition function"; + thd->where= THD_WHERE::PARTITION_FUNCTION; if (item->walk(&Item::check_partition_func_processor, 0, NULL)) { diff -Nru mariadb-10.11.6/sql/procedure.h mariadb-10.11.9/sql/procedure.h --- mariadb-10.11.6/sql/procedure.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/procedure.h 2024-08-03 07:29:59.000000000 +0000 @@ -70,7 +70,7 @@ { return type_handler()->Item_get_date_with_warn(thd, this, ltime, fuzzydate); } - Item* get_copy(THD *thd) override { return 0; } + Item* do_get_copy(THD *thd) const override { return 0; } }; class Item_proc_real :public Item_proc @@ -125,6 +125,8 @@ { s->set(value, default_charset()); return s; } my_decimal *val_decimal(my_decimal *) override; unsigned int size_of() { return sizeof(*this);} + Item *do_get_copy(THD *thd) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } }; @@ -165,6 +167,8 @@ my_decimal *val_decimal(my_decimal *) override; void cleanup() override { value.free(); } unsigned int size_of() { return sizeof(*this);} + Item *do_get_copy(THD *thd) const override { return nullptr; } + Item *do_build_clone(THD *thd) const override { return nullptr; } }; /* The procedure class definitions */ diff -Nru mariadb-10.11.6/sql/protocol.cc mariadb-10.11.9/sql/protocol.cc --- mariadb-10.11.6/sql/protocol.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/protocol.cc 2024-08-03 07:29:59.000000000 +0000 @@ -414,7 +414,6 @@ bool Protocol::net_send_error_packet(THD *thd, uint sql_errno, const char *err, const char* sqlstate) - { NET *net= &thd->net; uint length; diff -Nru mariadb-10.11.6/sql/protocol.h mariadb-10.11.9/sql/protocol.h --- mariadb-10.11.6/sql/protocol.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/protocol.h 2024-08-03 07:29:59.000000000 +0000 @@ -229,9 +229,9 @@ #ifdef EMBEDDED_LIBRARY void remove_last_row() override; #endif - virtual bool store_field_metadata(const THD *thd, const Send_field &field, - CHARSET_INFO *charset_for_protocol, - uint pos); + bool store_field_metadata(const THD *thd, const Send_field &field, + CHARSET_INFO *charset_for_protocol, + uint pos); bool store_item_metadata(THD *thd, Item *item, uint pos); bool store_field_metadata_for_list_fields(const THD *thd, Field *field, const TABLE_LIST *table_list, diff -Nru mariadb-10.11.6/sql/repl_failsafe.cc mariadb-10.11.9/sql/repl_failsafe.cc --- mariadb-10.11.6/sql/repl_failsafe.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/repl_failsafe.cc 2024-08-03 07:29:59.000000000 +0000 @@ -159,7 +159,7 @@ return 0; err: - delete si; + my_free(si); my_message(ER_UNKNOWN_ERROR, errmsg, MYF(0)); /* purecov: inspected */ return 1; } diff -Nru mariadb-10.11.6/sql/rowid_filter.h mariadb-10.11.9/sql/rowid_filter.h --- mariadb-10.11.6/sql/rowid_filter.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rowid_filter.h 2024-08-03 07:29:59.000000000 +0000 @@ -274,9 +274,9 @@ ~Range_rowid_filter(); - build_return_code build(); + build_return_code build() override; - bool check(char *elem) + bool check(char *elem) override { if (container->is_empty()) return false; @@ -373,16 +373,16 @@ Rowid_filter_sorted_array(uint elems, uint elem_size) : refpos_container(elems, elem_size), is_checked(false) {} - Rowid_filter_container_type get_type() + Rowid_filter_container_type get_type() override { return SORTED_ARRAY_CONTAINER; } - bool alloc() { return refpos_container.alloc(); } + bool alloc() override { return refpos_container.alloc(); } - bool add(void *ctxt, char *elem) { return refpos_container.add(elem); } + bool add(void *ctxt, char *elem) override { return refpos_container.add(elem); } - bool check(void *ctxt, char *elem); + bool check(void *ctxt, char *elem) override; - bool is_empty() { return refpos_container.is_empty(); } + bool is_empty() override { return refpos_container.is_empty(); } }; /** diff -Nru mariadb-10.11.6/sql/rpl_filter.cc mariadb-10.11.9/sql/rpl_filter.cc --- mariadb-10.11.6/sql/rpl_filter.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_filter.cc 2024-08-03 07:29:59.000000000 +0000 @@ -268,6 +268,13 @@ } +bool +Rpl_filter::is_db_empty() +{ + return do_db.is_empty() && ignore_db.is_empty(); +} + + /** Parse and add the given comma-separated sequence of filter rules. diff -Nru mariadb-10.11.6/sql/rpl_filter.h mariadb-10.11.9/sql/rpl_filter.h --- mariadb-10.11.6/sql/rpl_filter.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_filter.h 2024-08-03 07:29:59.000000000 +0000 @@ -56,6 +56,7 @@ bool db_ok_with_wild_table(const char *db); bool is_on(); + bool is_db_empty(); /* Setters - add filtering rules */ diff -Nru mariadb-10.11.6/sql/rpl_gtid.cc mariadb-10.11.9/sql/rpl_gtid.cc --- mariadb-10.11.6/sql/rpl_gtid.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_gtid.cc 2024-08-03 07:29:59.000000000 +0000 @@ -715,12 +715,16 @@ #ifdef WITH_WSREP /* - We should replicate local gtid_slave_pos updates to other nodes. + We should replicate local gtid_slave_pos updates to other nodes if + wsrep gtid mode is set. In applier we should not append them to galera writeset. */ - if (WSREP_ON_ && wsrep_thd_is_local(thd)) + if (WSREP_ON_ && wsrep_gtid_mode && wsrep_thd_is_local(thd)) { thd->wsrep_ignore_table= false; + table->file->row_logging= 1; // replication requires binary logging + if (thd->wsrep_next_trx_id() == WSREP_UNDEFINED_TRX_ID) + thd->set_query_id(next_query_id()); wsrep_start_trx_if_not_started(thd); } else @@ -903,10 +907,12 @@ #ifdef WITH_WSREP /* - We should replicate local gtid_slave_pos updates to other nodes. + We should replicate local gtid_slave_pos updates to other nodes if + wsrep gtid mode is set. In applier we should not append them to galera writeset. */ - if (WSREP_ON_ && wsrep_thd_is_local(thd) && + if (WSREP_ON_ && wsrep_gtid_mode && + wsrep_thd_is_local(thd) && thd->wsrep_cs().state() != wsrep::client_state::s_none) { if (thd->wsrep_trx().active() == false) @@ -917,7 +923,8 @@ } thd->wsrep_ignore_table= false; } - thd->wsrep_ignore_table= true; + else + thd->wsrep_ignore_table= true; #endif thd_saved_option= thd->variables.option_bits; diff -Nru mariadb-10.11.6/sql/rpl_gtid.h mariadb-10.11.9/sql/rpl_gtid.h --- mariadb-10.11.6/sql/rpl_gtid.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_gtid.h 2024-08-03 07:29:59.000000000 +0000 @@ -583,9 +583,9 @@ public: Accept_all_gtid_filter() {} ~Accept_all_gtid_filter() {} - my_bool exclude(rpl_gtid *gtid) { return FALSE; } - uint32 get_filter_type() { return ACCEPT_ALL_GTID_FILTER_TYPE; } - my_bool has_finished() { return FALSE; } + my_bool exclude(rpl_gtid *) override { return FALSE; } + uint32 get_filter_type() override { return ACCEPT_ALL_GTID_FILTER_TYPE; } + my_bool has_finished() override { return FALSE; } }; /* @@ -596,9 +596,9 @@ public: Reject_all_gtid_filter() {} ~Reject_all_gtid_filter() {} - my_bool exclude(rpl_gtid *gtid) { return TRUE; } - uint32 get_filter_type() { return REJECT_ALL_GTID_FILTER_TYPE; } - my_bool has_finished() { return FALSE; } + my_bool exclude(rpl_gtid *) override { return TRUE; } + uint32 get_filter_type() override { return REJECT_ALL_GTID_FILTER_TYPE; } + my_bool has_finished() override { return FALSE; } }; /* @@ -616,8 +616,8 @@ Window_gtid_event_filter(); ~Window_gtid_event_filter() {} - my_bool exclude(rpl_gtid*); - my_bool has_finished(); + my_bool exclude(rpl_gtid*) override; + my_bool has_finished() override; /* Set the GTID that begins this window (exclusive) @@ -633,7 +633,7 @@ */ int set_stop_gtid(rpl_gtid *stop); - uint32 get_filter_type() { return WINDOW_GTID_FILTER_TYPE; } + uint32 get_filter_type() override { return WINDOW_GTID_FILTER_TYPE; } /* Validates the underlying range is correct, and writes an error if not, i.e. @@ -736,11 +736,11 @@ Id_delegating_gtid_event_filter(); ~Id_delegating_gtid_event_filter(); - my_bool exclude(rpl_gtid *gtid); - my_bool has_finished(); + my_bool exclude(rpl_gtid *gtid) override; + my_bool has_finished() override; void set_default_filter(Gtid_event_filter *default_filter); - uint32 get_filter_type() { return DELEGATING_GTID_FILTER_TYPE; } + uint32 get_filter_type() override { return DELEGATING_GTID_FILTER_TYPE; } virtual T get_id_from_gtid(rpl_gtid *) = 0; virtual const char* get_id_type_name() = 0; @@ -809,18 +809,18 @@ /* Returns the domain id of from the input GTID */ - decltype(rpl_gtid::domain_id) get_id_from_gtid(rpl_gtid *gtid) + decltype(rpl_gtid::domain_id) get_id_from_gtid(rpl_gtid *gtid) override { return gtid->domain_id; } - const char* get_id_type_name() { return "domain"; } + const char* get_id_type_name() override { return "domain"; } /* Override Id_delegating_gtid_event_filter to extend with domain specific filtering logic */ - my_bool exclude(rpl_gtid*); + my_bool exclude(rpl_gtid*) override; /* Validates that window filters with both a start and stop GTID satisfy @@ -887,12 +887,12 @@ /* Returns the server id of from the input GTID */ - decltype(rpl_gtid::server_id) get_id_from_gtid(rpl_gtid *gtid) + decltype(rpl_gtid::server_id) get_id_from_gtid(rpl_gtid *gtid) override { return gtid->server_id; } - const char* get_id_type_name() { return "server"; } + const char* get_id_type_name() override { return "server"; } }; /* @@ -910,16 +910,16 @@ Returns TRUE if any filers exclude the gtid, returns FALSE otherwise, i.e. all filters must allow the GTID. */ - my_bool exclude(rpl_gtid *gtid); + my_bool exclude(rpl_gtid *gtid) override; /* Returns true if any filters have finished. To elaborate, as this filter performs an intersection, if any filter has finished, the result would be excluded regardless. */ - my_bool has_finished(); + my_bool has_finished() override; - uint32 get_filter_type() { return INTERSECTING_GTID_FILTER_TYPE; } + uint32 get_filter_type() override { return INTERSECTING_GTID_FILTER_TYPE; } /* Adds a new filter to the intersection diff -Nru mariadb-10.11.6/sql/rpl_mi.cc mariadb-10.11.9/sql/rpl_mi.cc --- mariadb-10.11.6/sql/rpl_mi.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_mi.cc 2024-08-03 07:29:59.000000000 +0000 @@ -43,7 +43,8 @@ gtid_reconnect_event_skip_count(0), gtid_event_seen(false), in_start_all_slaves(0), in_stop_all_slaves(0), in_flush_all_relay_logs(0), users(0), killed(0), - total_ddl_groups(0), total_non_trans_groups(0), total_trans_groups(0) + total_ddl_groups(0), total_non_trans_groups(0), total_trans_groups(0), + semi_sync_reply_enabled(0) { char *tmp; host[0] = 0; user[0] = 0; password[0] = 0; @@ -497,7 +498,7 @@ if (init_intvar_from_file(&master_log_pos, &mi->file, 4) || init_strvar_from_file(mi->host, sizeof(mi->host), &mi->file, 0) || init_strvar_from_file(mi->user, sizeof(mi->user), &mi->file, "test") || - init_strvar_from_file(mi->password, SCRAMBLED_PASSWORD_CHAR_LENGTH+1, + init_strvar_from_file(mi->password, sizeof(mi->password), &mi->file, 0) || init_intvar_from_file(&port, &mi->file, MYSQL_PORT) || init_intvar_from_file(&connect_retry, &mi->file, diff -Nru mariadb-10.11.6/sql/rpl_mi.h mariadb-10.11.9/sql/rpl_mi.h --- mariadb-10.11.6/sql/rpl_mi.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_mi.h 2024-08-03 07:29:59.000000000 +0000 @@ -210,6 +210,16 @@ void lock_slave_threads(); void unlock_slave_threads(); + ulonglong get_slave_skip_counter() + { + return rli.slave_skip_counter; + } + + ulonglong get_max_relay_log_size() + { + return rli.max_relay_log_size; + } + /* the variables below are needed because we can change masters on the fly */ char master_log_name[FN_REFLEN+6]; /* Room for multi-*/ char host[HOSTNAME_LENGTH*SYSTEM_CHARSET_MBMAXLEN+1]; @@ -366,6 +376,12 @@ it must be ignored similarly to the replicate-same-server-id rule. */ bool do_accept_own_server_id= false; + /* + Set to 1 when semi_sync is enabled. Set to 0 if there is any transmit + problems to the slave, in which case any furter semi-sync reply is + ignored + */ + bool semi_sync_reply_enabled; List start_alter_list; MEM_ROOT mem_root; /* diff -Nru mariadb-10.11.6/sql/rpl_parallel.cc mariadb-10.11.9/sql/rpl_parallel.cc --- mariadb-10.11.6/sql/rpl_parallel.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_parallel.cc 2024-08-03 07:29:59.000000000 +0000 @@ -54,11 +54,13 @@ thd->system_thread_info.rpl_sql_info->rpl_filter = rli->mi->rpl_filter; ev->thd= thd; - strcpy(rgi->event_relay_log_name_buf, qev->event_relay_log_name); + safe_strcpy(rgi->event_relay_log_name_buf, sizeof(rgi->event_relay_log_name_buf), + qev->event_relay_log_name); rgi->event_relay_log_name= rgi->event_relay_log_name_buf; rgi->event_relay_log_pos= qev->event_relay_log_pos; rgi->future_event_relay_log_pos= qev->future_event_relay_log_pos; - strcpy(rgi->future_event_master_log_name, qev->future_event_master_log_name); + safe_strcpy(rgi->future_event_master_log_name, sizeof(rgi->future_event_master_log_name), + qev->future_event_master_log_name); if (event_can_update_last_master_timestamp(ev)) rgi->last_master_timestamp= ev->when + (time_t)ev->exec_time; err= apply_event_and_update_pos_for_parallel(ev, thd, rgi); @@ -115,7 +117,8 @@ cmp= compare_log_name(rli->group_master_log_name, qev->future_event_master_log_name); if (cmp < 0) { - strcpy(rli->group_master_log_name, qev->future_event_master_log_name); + safe_strcpy(rli->group_master_log_name, sizeof(rli->group_master_log_name), + qev->future_event_master_log_name); rli->group_master_log_pos= qev->future_event_master_log_pos; } else if (cmp == 0 @@ -131,12 +134,13 @@ asynchronously, we need to be sure they will be completed before starting a new transaction. Otherwise the new transaction might suffer a spurious kill. */ -static void +void wait_for_pending_deadlock_kill(THD *thd, rpl_group_info *rgi) { PSI_stage_info old_stage; mysql_mutex_lock(&thd->LOCK_wakeup_ready); + thd->set_time_for_next_stage(); thd->ENTER_COND(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready, &stage_waiting_for_deadlock_kill, &old_stage); while (rgi->killed_for_retry == rpl_group_info::RETRY_KILL_PENDING) @@ -214,6 +218,13 @@ signal_error_to_sql_driver_thread(thd, rgi, err); thd->wait_for_commit_ptr= NULL; + /* + Calls to check_duplicate_gtid() must match up with + record_and_update_gtid() (or release_domain_owner() in error case). This + assertion tries to catch any missing release of the domain. + */ + DBUG_ASSERT(rgi->gtid_ignore_duplicate_state != rpl_group_info::GTID_DUPLICATE_OWNER); + mysql_mutex_lock(&entry->LOCK_parallel_entry); /* We need to mark that this event group started its commit phase, in case we @@ -399,12 +410,12 @@ if (wait_count > entry->count_committing_event_groups) { DEBUG_SYNC(thd, "rpl_parallel_start_waiting_for_prior"); + thd->set_time_for_next_stage(); thd->ENTER_COND(&gco->COND_group_commit_orderer, &entry->LOCK_parallel_entry, &stage_waiting_for_prior_transaction_to_start_commit, old_stage); *did_enter_cond= true; - thd->set_time_for_next_stage(); do { if (!rgi->worker_error && unlikely(thd->check_killed(1))) @@ -492,10 +503,10 @@ */ if (unlikely(sub_id > entry->pause_sub_id)) { + thd->set_time_for_next_stage(); thd->ENTER_COND(&entry->COND_parallel_entry, &entry->LOCK_parallel_entry, &stage_waiting_for_ftwrl, old_stage); *did_enter_cond= true; - thd->set_time_for_next_stage(); do { if (entry->force_abort || rgi->worker_error) @@ -558,9 +569,9 @@ mysql_mutex_lock(&pool->LOCK_rpl_thread_pool); if (thd) { + thd->set_time_for_next_stage(); thd->ENTER_COND(&pool->COND_rpl_thread_pool, &pool->LOCK_rpl_thread_pool, &stage_waiting_for_rpl_thread_pool, &old_stage); - thd->set_time_for_next_stage(); } while (pool->busy) { @@ -700,9 +711,9 @@ mysql_mutex_lock(&e->LOCK_parallel_entry); }); } + thd->set_time_for_next_stage(); thd->ENTER_COND(&e->COND_parallel_entry, &e->LOCK_parallel_entry, &stage_waiting_for_ftwrl_threads_to_pause, &old_stage); - thd->set_time_for_next_stage(); while (e->pause_sub_id < (uint64)ULONGLONG_MAX && e->last_committed_sub_id < e->pause_sub_id && !err) @@ -895,8 +906,7 @@ thd->wait_for_commit_ptr->unregister_wait_for_prior_commit(); DBUG_EXECUTE_IF("inject_mdev8031", { /* Simulate that we get deadlock killed at this exact point. */ - rgi->killed_for_retry= rpl_group_info::RETRY_KILL_KILLED; - thd->set_killed(KILL_CONNECTION); + slave_background_kill_request(thd); }); #ifdef ENABLED_DEBUG_SYNC DBUG_EXECUTE_IF("rpl_parallel_simulate_wait_at_retry", { @@ -908,7 +918,13 @@ }); #endif - rgi->cleanup_context(thd, 1); + /* + We are still applying the event group, even though we will roll it back + and retry it. So for --gtid-ignore-duplicates, keep ownership of the + domain during the retry so another master connection will not try to take + over and duplicate apply the same event group (MDEV-33475). + */ + rgi->cleanup_context(thd, 1, 1 /* keep_domain_owner */); wait_for_pending_deadlock_kill(thd, rgi); thd->reset_killed(); thd->clear_error(); @@ -2038,10 +2054,13 @@ queued_event *qev= get_qev_common(ev, event_size); if (!qev) return NULL; - strcpy(qev->event_relay_log_name, rli->event_relay_log_name); + safe_strcpy(qev->event_relay_log_name, sizeof(qev->event_relay_log_name), + rli->event_relay_log_name); qev->event_relay_log_pos= rli->event_relay_log_pos; qev->future_event_relay_log_pos= rli->future_event_relay_log_pos; - strcpy(qev->future_event_master_log_name, rli->future_event_master_log_name); + safe_strcpy(qev->future_event_master_log_name, + sizeof(qev->future_event_master_log_name), + rli->future_event_master_log_name); return qev; } @@ -2055,11 +2074,13 @@ if (!qev) return NULL; qev->rgi= orig_qev->rgi; - strcpy(qev->event_relay_log_name, relay_log_name); + safe_strcpy(qev->event_relay_log_name, sizeof(qev->event_relay_log_name), + relay_log_name); qev->event_relay_log_pos= event_pos; qev->future_event_relay_log_pos= event_pos+event_size; - strcpy(qev->future_event_master_log_name, - orig_qev->future_event_master_log_name); + safe_strcpy(qev->future_event_master_log_name, + sizeof(qev->future_event_master_log_name), + orig_qev->future_event_master_log_name); return qev; } @@ -2405,13 +2426,17 @@ false Worker not allocated (choose_thread_internal not called) */ static bool handle_split_alter(rpl_parallel_entry *e, - Gtid_log_event *gtid_ev, uint32 *idx, + Gtid_log_event *gtid_ev, + //uint32 *idx, + rpl_parallel_entry::sched_bucket **ptr_cur_thr, //choose_thread_internal specific bool *did_enter_cond, rpl_group_info* rgi, PSI_stage_info *old_stage) { uint16 flags_extra= gtid_ev->flags_extra; bool thread_allocated= false; + uint32 i= 0, *idx= &i; + //Step 1 if (flags_extra & Gtid_log_event::FL_START_ALTER_E1 || //This will arrange finding threads for CA/RA as well @@ -2422,11 +2447,12 @@ j is needed for round robin scheduling, we will start with rpl_thread_idx go till rpl_thread_max and then start with 0 to rpl_thread_idx */ - int j= e->rpl_thread_idx; + auto j= static_cast(e->thread_sched_fifo->head() - e->rpl_threads); // formerly e->rpl_thread_idx; for(uint i= 0; i < e->rpl_thread_max; i++) { - if (!e->rpl_threads[j] || e->rpl_threads[j]->current_owner - != &e->rpl_threads[j] || !e->rpl_threads[j]->current_start_alter_id) + if (!e->rpl_threads[j].thr || + e->rpl_threads[j].thr->current_owner != &e->rpl_threads[j].thr || + !e->rpl_threads[j].thr->current_start_alter_id) { //This condition will hit atleast one time no matter what happens *idx= j; @@ -2437,17 +2463,26 @@ j= j % e->rpl_thread_max; } //We did not find and idx - DBUG_ASSERT(0); - return false; + DBUG_ASSERT(0); + + return false; + idx_found: - e->rpl_thread_idx= *idx; - e->choose_thread_internal(*idx, did_enter_cond, rgi, old_stage); + //e->rpl_thread_idx= *idx; + /* place the found *idx index into the head */ + *ptr_cur_thr= &e->rpl_threads[*idx]; + (*ptr_cur_thr)->unlink(); + e->thread_sched_fifo->append(*ptr_cur_thr); + *ptr_cur_thr= e->thread_sched_fifo->head(); + + e->choose_thread_internal(*ptr_cur_thr, did_enter_cond, rgi, + old_stage); thread_allocated= true; if (flags_extra & Gtid_log_event::FL_START_ALTER_E1) { - mysql_mutex_assert_owner(&e->rpl_threads[*idx]->LOCK_rpl_thread); - e->rpl_threads[e->rpl_thread_idx]->current_start_alter_id= gtid_ev->seq_no; - e->rpl_threads[e->rpl_thread_idx]->current_start_alter_domain_id= + mysql_mutex_assert_owner(&e->rpl_threads[*idx].thr->LOCK_rpl_thread); + e->rpl_threads[*idx].thr->current_start_alter_id= gtid_ev->seq_no; + e->rpl_threads[*idx].thr->current_start_alter_domain_id= gtid_ev->domain_id; /* We are locking LOCK_rpl_thread_pool becuase we are going to update @@ -2463,9 +2498,9 @@ } else { - e->rpl_threads[*idx]->reserved_start_alter_thread= true; - e->rpl_threads[*idx]->current_start_alter_id= 0; - e->rpl_threads[*idx]->current_start_alter_domain_id= 0; + e->rpl_threads[*idx].thr->reserved_start_alter_thread= true; + e->rpl_threads[*idx].thr->current_start_alter_id= 0; + e->rpl_threads[*idx].thr->current_start_alter_domain_id= 0; } mysql_mutex_unlock(&global_rpl_thread_pool.LOCK_rpl_thread_pool); } @@ -2476,13 +2511,13 @@ //Free the corrosponding rpt current_start_alter_id for(uint i= 0; i < e->rpl_thread_max; i++) { - if(e->rpl_threads[i] && - e->rpl_threads[i]->current_start_alter_id == gtid_ev->sa_seq_no && - e->rpl_threads[i]->current_start_alter_domain_id == gtid_ev->domain_id) + if(e->rpl_threads[i].thr && + e->rpl_threads[i].thr->current_start_alter_id == gtid_ev->sa_seq_no && + e->rpl_threads[i].thr->current_start_alter_domain_id == gtid_ev->domain_id) { mysql_mutex_lock(&global_rpl_thread_pool.LOCK_rpl_thread_pool); - e->rpl_threads[i]->current_start_alter_id= 0; - e->rpl_threads[i]->current_start_alter_domain_id= 0; + e->rpl_threads[i].thr->current_start_alter_id= 0; + e->rpl_threads[i].thr->current_start_alter_domain_id= 0; global_rpl_thread_pool.current_start_alters--; e->pending_start_alters--; DBUG_PRINT("info", ("Commit/Rollback alter id %d", i)); @@ -2498,6 +2533,79 @@ /* + Check when we have done a complete round of scheduling for workers + 0, 1, ..., (rpl_thread_max-1), in this order. + This often occurs every rpl_thread_max event group, but XA XID dependency + restrictions can cause insertion of extra out-of-order worker scheduling + in-between the normal round-robin scheduling. +*/ +void +rpl_parallel_entry::check_scheduling_generation(sched_bucket *cur) +{ + uint32 idx= static_cast(cur - rpl_threads); + DBUG_ASSERT(cur >= rpl_threads); + DBUG_ASSERT(cur < rpl_threads + rpl_thread_max); + if (idx == current_generation_idx) + { + ++idx; + if (idx >= rpl_thread_max) + { + /* A new generation; all workers have been scheduled at least once. */ + idx= 0; + ++current_generation; + } + current_generation_idx= idx; + } +} + + +rpl_parallel_entry::sched_bucket * +rpl_parallel_entry::check_xa_xid_dependency(xid_t *xid) +{ + uint64 cur_gen= current_generation; + my_off_t i= 0; + while (i < maybe_active_xid.elements) + { + /* + Purge no longer active XID from the list: + + - In generation N, XID might have been scheduled for worker W. + - Events in generation (N+1) might run freely in parallel with W. + - Events in generation (N+2) will have done wait_for_prior_commit for + the event group with XID (or a later one), but the XID might still be + active for a bit longer after wakeup_prior_commit(). + - Events in generation (N+3) will have done wait_for_prior_commit() for + an event in W _after_ the XID, so are sure not to see the XID active. + + Therefore, XID can be safely scheduled to a different worker in + generation (N+3) when last prior use was in generation N (or earlier). + */ + xid_active_generation *a= + dynamic_element(&maybe_active_xid, i, xid_active_generation *); + if (a->generation + 3 <= cur_gen) + { + *a= *((xid_active_generation *)pop_dynamic(&maybe_active_xid)); + continue; + } + if (xid->eq(&a->xid)) + { + /* Update the last used generation and return the match. */ + a->generation= cur_gen; + return a->thr; + } + ++i; + } + /* try to keep allocated memory in the range of [2,10] * initial_chunk_size */ + if (maybe_active_xid.elements <= 2 * active_xid_init_alloc() && + maybe_active_xid.max_element > 10 * active_xid_init_alloc()) + freeze_size(&maybe_active_xid); + + /* No matching XID conflicts. */ + return nullptr; +} + + +/* Obtain a worker thread that we can queue an event to. Each invocation allocates a new worker thread, to maximise @@ -2529,40 +2637,70 @@ PSI_stage_info *old_stage, Gtid_log_event *gtid_ev) { - uint32 idx; + sched_bucket *cur_thr; - idx= rpl_thread_idx; if (gtid_ev) { - if (++idx >= rpl_thread_max) - idx= 0; + /* New event group; cycle the thread scheduling buckets round-robin. */ + thread_sched_fifo->push_back(thread_sched_fifo->get()); + //rpl_thread_idx will be updated handle_split_alter - if (handle_split_alter(this, gtid_ev, &idx, did_enter_cond, rgi, old_stage)) - return rpl_threads[idx]; + if (handle_split_alter(this, gtid_ev, &cur_thr, did_enter_cond, rgi, + old_stage)) + return cur_thr->thr; + if (gtid_ev->flags2 & (Gtid_log_event::FL_COMPLETED_XA | Gtid_log_event::FL_PREPARED_XA)) - { - idx= my_hash_sort(&my_charset_bin, gtid_ev->xid.key(), - gtid_ev->xid.key_length()) % rpl_thread_max; + { + if ((cur_thr= check_xa_xid_dependency(>id_ev->xid))) + { + /* + A previously scheduled event group with the same XID might still be + active in a worker, so schedule this event group in the same worker + to avoid a conflict. + */ + cur_thr->unlink(); + thread_sched_fifo->append(cur_thr); + } + else + { + /* Record this XID now active. */ + xid_active_generation *a= + (xid_active_generation *)alloc_dynamic(&maybe_active_xid); + if (!a) + return NULL; + a->thr= cur_thr= thread_sched_fifo->head(); + a->generation= current_generation; + a->xid.set(>id_ev->xid); + } } - rpl_thread_idx= idx; + else + cur_thr= thread_sched_fifo->head(); + + check_scheduling_generation(cur_thr); } - return choose_thread_internal(idx, did_enter_cond, rgi, old_stage); + else + cur_thr= thread_sched_fifo->head(); + + return choose_thread_internal(cur_thr /*idx*/, did_enter_cond, rgi, old_stage); } -rpl_parallel_thread * rpl_parallel_entry::choose_thread_internal(uint idx, - bool *did_enter_cond, rpl_group_info *rgi, - PSI_stage_info *old_stage) +rpl_parallel_thread * +rpl_parallel_entry::choose_thread_internal(sched_bucket *cur_thr, + bool *did_enter_cond, + rpl_group_info *rgi, + PSI_stage_info *old_stage) { - rpl_parallel_thread* thr= rpl_threads[idx]; Relay_log_info *rli= rgi->rli; + rpl_parallel_thread *thr= cur_thr->thr; + if (thr) { *did_enter_cond= false; mysql_mutex_lock(&thr->LOCK_rpl_thread); for (;;) { - if (thr->current_owner != &rpl_threads[idx]) + if (thr->current_owner != &cur_thr->thr) { /* The worker thread became idle, and returned to the free list and @@ -2594,16 +2732,16 @@ and this can cause THD::awake to use the wrong mutex. */ #ifdef ENABLED_DEBUG_SYNC - DBUG_EXECUTE_IF("rpl_parallel_wait_queue_max", - { - debug_sync_set_action(rli->sql_driver_thd, - STRING_WITH_LEN("now SIGNAL wait_queue_ready")); - };); + DBUG_EXECUTE_IF("rpl_parallel_wait_queue_max", { + debug_sync_set_action( + rli->sql_driver_thd, + STRING_WITH_LEN("now SIGNAL wait_queue_ready")); + };); #endif - rli->sql_driver_thd->ENTER_COND(&thr->COND_rpl_thread_queue, - &thr->LOCK_rpl_thread, - &stage_waiting_for_room_in_worker_thread, - old_stage); + rli->sql_driver_thd->set_time_for_next_stage(); + rli->sql_driver_thd->ENTER_COND( + &thr->COND_rpl_thread_queue, &thr->LOCK_rpl_thread, + &stage_waiting_for_room_in_worker_thread, old_stage); *did_enter_cond= true; } @@ -2613,11 +2751,11 @@ did_enter_cond, old_stage); my_error(ER_CONNECTION_KILLED, MYF(0)); #ifdef ENABLED_DEBUG_SYNC - DBUG_EXECUTE_IF("rpl_parallel_wait_queue_max", - { - debug_sync_set_action(rli->sql_driver_thd, - STRING_WITH_LEN("now SIGNAL wait_queue_killed")); - };); + DBUG_EXECUTE_IF("rpl_parallel_wait_queue_max", { + debug_sync_set_action( + rli->sql_driver_thd, + STRING_WITH_LEN("now SIGNAL wait_queue_killed")); + };); #endif slave_output_error_info(rgi, rli->sql_driver_thd); return NULL; @@ -2627,9 +2765,10 @@ } } } + if (!thr) - rpl_threads[idx]= thr= global_rpl_thread_pool.get_thread(&rpl_threads[idx], - this); + cur_thr->thr= thr= + global_rpl_thread_pool.get_thread(&cur_thr->thr, this); return thr; } @@ -2644,6 +2783,7 @@ dealloc_gco(e->current_gco); e->current_gco= prev_gco; } + delete_dynamic(&e->maybe_active_xid); mysql_cond_destroy(&e->COND_parallel_entry); mysql_mutex_destroy(&e->LOCK_parallel_entry); my_free(e); @@ -2687,17 +2827,37 @@ ulong count= opt_slave_domain_parallel_threads; if (count == 0 || count > opt_slave_parallel_threads) count= opt_slave_parallel_threads; - rpl_parallel_thread **p; + rpl_parallel_entry::sched_bucket *p; + I_List *fifo; if (!my_multi_malloc(PSI_INSTRUMENT_ME, MYF(MY_WME|MY_ZEROFILL), &e, sizeof(*e), &p, count*sizeof(*p), + &fifo, sizeof(*fifo), NULL)) { my_error(ER_OUTOFMEMORY, MYF(0), (int)(sizeof(*e)+count*sizeof(*p))); return NULL; } + /* Initialize a FIFO of scheduled worker threads. */ + e->thread_sched_fifo = new (fifo) I_List; + /* + (We cycle the FIFO _before_ allocating next entry in + rpl_parallel_entry::choose_thread(). So initialize the FIFO with the + highest element at the front, just so that the first event group gets + scheduled on entry 0). + */ + e->thread_sched_fifo-> + push_back(::new (p+count-1) rpl_parallel_entry::sched_bucket); + for (ulong i= 0; i < count-1; ++i) + e->thread_sched_fifo-> + push_back(::new (p+i) rpl_parallel_entry::sched_bucket); e->rpl_threads= p; e->rpl_thread_max= count; + e->current_generation = 0; + e->current_generation_idx = 0; + init_dynamic_array2(PSI_INSTRUMENT_ME, &e->maybe_active_xid, + sizeof(rpl_parallel_entry::xid_active_generation), + 0, e->active_xid_init_alloc(), 0, MYF(0)); e->domain_id= domain_id; e->stop_on_error_sub_id= (uint64)ULONGLONG_MAX; e->pause_sub_id= (uint64)ULONGLONG_MAX; @@ -2767,10 +2927,10 @@ mysql_mutex_unlock(&e->LOCK_parallel_entry); for (j= 0; j < e->rpl_thread_max; ++j) { - if ((rpt= e->rpl_threads[j])) + if ((rpt= e->rpl_threads[j].thr)) { mysql_mutex_lock(&rpt->LOCK_rpl_thread); - if (rpt->current_owner == &e->rpl_threads[j]) + if (rpt->current_owner == &e->rpl_threads[j].thr) mysql_cond_signal(&rpt->COND_rpl_thread); mysql_mutex_unlock(&rpt->LOCK_rpl_thread); } @@ -2829,10 +2989,10 @@ e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i); for (j= 0; j < e->rpl_thread_max; ++j) { - if ((rpt= e->rpl_threads[j])) + if ((rpt= e->rpl_threads[j].thr)) { mysql_mutex_lock(&rpt->LOCK_rpl_thread); - while (rpt->current_owner == &e->rpl_threads[j]) + while (rpt->current_owner == &e->rpl_threads[j].thr) mysql_cond_wait(&rpt->COND_rpl_thread_stop, &rpt->LOCK_rpl_thread); mysql_mutex_unlock(&rpt->LOCK_rpl_thread); } @@ -2877,23 +3037,12 @@ bool -rpl_parallel::workers_idle() +rpl_parallel::workers_idle(Relay_log_info *rli) { - struct rpl_parallel_entry *e; - uint32 i, max_i; - - max_i= domain_hash.records; - for (i= 0; i < max_i; ++i) - { - bool active; - e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i); - mysql_mutex_lock(&e->LOCK_parallel_entry); - active= e->current_sub_id > e->last_committed_sub_id; - mysql_mutex_unlock(&e->LOCK_parallel_entry); - if (active) - break; - } - return (i == max_i); + mysql_mutex_assert_owner(&rli->data_lock); + return !rli->last_inuse_relaylog || + rli->last_inuse_relaylog->queued_count == + rli->last_inuse_relaylog->dequeued_count; } @@ -2901,7 +3050,7 @@ rpl_parallel_entry::queue_master_restart(rpl_group_info *rgi, Format_description_log_event *fdev) { - uint32 idx; + sched_bucket *cur_thr; rpl_parallel_thread *thr; rpl_parallel_thread::queued_event *qev; Relay_log_info *rli= rgi->rli; @@ -2916,12 +3065,12 @@ Thus there is no need for the full complexity of choose_thread(). We only need to check if we have a current worker thread, and queue for it if so. */ - idx= rpl_thread_idx; - thr= rpl_threads[idx]; + cur_thr= thread_sched_fifo->head(); + thr= cur_thr->thr; if (!thr) return 0; mysql_mutex_lock(&thr->LOCK_rpl_thread); - if (thr->current_owner != &rpl_threads[idx]) + if (thr->current_owner != &cur_thr->thr) { /* No active worker thread, so no need to queue the master restart. */ mysql_mutex_unlock(&thr->LOCK_rpl_thread); @@ -2965,6 +3114,7 @@ e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i); mysql_mutex_lock(&e->LOCK_parallel_entry); ++e->need_sub_id_signal; + thd->set_time_for_next_stage(); thd->ENTER_COND(&e->COND_parallel_entry, &e->LOCK_parallel_entry, &stage_waiting_for_workers_idle, &old_stage); while (e->current_sub_id > e->last_committed_sub_id) diff -Nru mariadb-10.11.6/sql/rpl_parallel.h mariadb-10.11.9/sql/rpl_parallel.h --- mariadb-10.11.6/sql/rpl_parallel.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_parallel.h 2024-08-03 07:29:59.000000000 +0000 @@ -344,6 +344,27 @@ struct rpl_parallel_entry { + /* + A small struct to put worker threads references into a FIFO (using an + I_List) for round-robin scheduling. + */ + struct sched_bucket : public ilink { + sched_bucket() : thr(nullptr) { } + rpl_parallel_thread *thr; + }; + /* + A struct to keep track of into which "generation" an XA XID was last + scheduled. A "generation" means that we know that every worker thread + slot in the rpl_parallel_entry was scheduled at least once. When more + that two generations have passed, we can safely reuse the XID in a + different worker. + */ + struct xid_active_generation { + uint64 generation; + sched_bucket *thr; + xid_t xid; + }; + mysql_mutex_t LOCK_parallel_entry; mysql_cond_t COND_parallel_entry; uint32 domain_id; @@ -374,17 +395,36 @@ uint64 stop_sub_id; /* - Cyclic array recording the last rpl_thread_max worker threads that we + Array recording the last rpl_thread_max worker threads that we queued event for. This is used to limit how many workers a single domain can occupy (--slave-domain-parallel-threads). + The array is structured as a FIFO using an I_List thread_sched_fifo. + Note that workers are never explicitly deleted from the array. Instead, we need to check (under LOCK_rpl_thread) that the thread still belongs to us before re-using (rpl_thread::current_owner). */ - rpl_parallel_thread **rpl_threads; + sched_bucket *rpl_threads; + I_List *thread_sched_fifo; uint32 rpl_thread_max; - uint32 rpl_thread_idx; + /* + Keep track of all XA XIDs that may still be active in a worker thread. + The elements are of type xid_active_generation. + */ + DYNAMIC_ARRAY maybe_active_xid; + /* + Keeping track of the current scheduling generation. + + A new generation means that every worker thread in the rpl_threads array + have been scheduled at least one event group. + + When we have scheduled to slot current_generation_idx= 0, 1, ..., N-1 in this + order, we know that (at least) one generation has passed. + */ + uint64 current_generation; + uint32 current_generation_idx; + /* The sub_id of the last transaction to commit within this domain_id. Must be accessed under LOCK_parallel_entry protection. @@ -440,14 +480,22 @@ /* Relay log info of replication source for this entry. */ Relay_log_info *rli; + void check_scheduling_generation(sched_bucket *cur); + sched_bucket *check_xa_xid_dependency(xid_t *xid); rpl_parallel_thread * choose_thread(rpl_group_info *rgi, bool *did_enter_cond, PSI_stage_info *old_stage, Gtid_log_event *gtid_ev); rpl_parallel_thread * - choose_thread_internal(uint idx, bool *did_enter_cond, rpl_group_info *rgi, - PSI_stage_info *old_stage); + choose_thread_internal(sched_bucket *cur_thr, bool *did_enter_cond, + rpl_group_info *rgi, PSI_stage_info *old_stage); int queue_master_restart(rpl_group_info *rgi, Format_description_log_event *fdev); + /* + the initial size of maybe_ array corresponds to the case of + each worker receives perhaps unlikely XA-PREPARE and XA-COMMIT within + the same generation. + */ + inline uint active_xid_init_alloc() { return 3 * 2 * rpl_thread_max; } }; struct rpl_parallel { HASH domain_hash; @@ -460,15 +508,17 @@ rpl_parallel_entry *find(uint32 domain_id, Relay_log_info *rli); void wait_for_done(THD *thd, Relay_log_info *rli); void stop_during_until(); - bool workers_idle(); int wait_for_workers_idle(THD *thd); int do_event(rpl_group_info *serial_rgi, Log_event *ev, ulonglong event_size); + + static bool workers_idle(Relay_log_info *rli); }; extern struct rpl_parallel_thread_pool global_rpl_thread_pool; +extern void wait_for_pending_deadlock_kill(THD *thd, rpl_group_info *rgi); extern int rpl_parallel_resize_pool_if_no_slaves(void); extern int rpl_parallel_activate_pool(rpl_parallel_thread_pool *pool); extern int rpl_parallel_inactivate_pool(rpl_parallel_thread_pool *pool); diff -Nru mariadb-10.11.6/sql/rpl_rli.cc mariadb-10.11.9/sql/rpl_rli.cc --- mariadb-10.11.6/sql/rpl_rli.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_rli.cc 2024-08-03 07:29:59.000000000 +0000 @@ -44,8 +44,6 @@ /* Object used for MASTER_GTID_WAIT(). */ gtid_waiting rpl_global_gtid_waiting; -const char *const Relay_log_info::state_delaying_string = "Waiting until MASTER_DELAY seconds after master executed event"; - Relay_log_info::Relay_log_info(bool is_slave_recovery, const char* thread_name) :Slave_reporting_capability(thread_name), replicate_same_server_id(::replicate_same_server_id), @@ -1011,7 +1009,8 @@ { if (cmp < 0) { - strcpy(group_master_log_name, rgi->future_event_master_log_name); + safe_strcpy(group_master_log_name, sizeof(group_master_log_name), + rgi->future_event_master_log_name); group_master_log_pos= log_pos; } else if (group_master_log_pos < log_pos) @@ -2262,7 +2261,7 @@ } -void rpl_group_info::cleanup_context(THD *thd, bool error) +void rpl_group_info::cleanup_context(THD *thd, bool error, bool keep_domain_owner) { DBUG_ENTER("rpl_group_info::cleanup_context"); DBUG_PRINT("enter", ("error: %d", (int) error)); @@ -2317,7 +2316,7 @@ Ensure we always release the domain for others to process, when using --gtid-ignore-duplicates. */ - if (gtid_ignore_duplicate_state != GTID_DUPLICATE_NULL) + if (gtid_ignore_duplicate_state != GTID_DUPLICATE_NULL && !keep_domain_owner) rpl_global_gtid_slave_state->release_domain_owner(this); } diff -Nru mariadb-10.11.6/sql/rpl_rli.h mariadb-10.11.9/sql/rpl_rli.h --- mariadb-10.11.6/sql/rpl_rli.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/rpl_rli.h 2024-08-03 07:29:59.000000000 +0000 @@ -506,11 +506,6 @@ m_flags&= ~flag; } - /** - Text used in THD::proc_info when the slave SQL thread is delaying. - */ - static const char *const state_delaying_string; - bool flush(); /** @@ -533,7 +528,7 @@ { mysql_mutex_assert_owner(&data_lock); sql_delay_end= delay_end; - thd_proc_info(sql_driver_thd, state_delaying_string); + THD_STAGE_INFO(sql_driver_thd, stage_sql_thd_waiting_until_delay); } int32 get_sql_delay() { return sql_delay; } @@ -564,6 +559,10 @@ Guarded by data_lock. Written by the sql thread. Read by client threads executing SHOW SLAVE STATUS. + + This is calculated as: + clock_time_for_event_on_master + clock_difference_between_master_and_slave + + SQL_DELAY. */ time_t sql_delay_end; @@ -623,7 +622,7 @@ rpl_gtid *relay_log_state; uint32 relay_log_state_count; /* Number of events in this relay log queued for worker threads. */ - int64 queued_count; + Atomic_counter queued_count; /* Number of events completed by worker threads. */ Atomic_counter dequeued_count; /* Set when all events have been read from a relaylog. */ @@ -959,7 +958,7 @@ } void clear_tables_to_lock(); - void cleanup_context(THD *, bool); + void cleanup_context(THD *, bool, bool keep_domain_owner= false); void slave_close_thread_tables(THD *); void mark_start_commit_no_lock(); void mark_start_commit(); diff -Nru mariadb-10.11.6/sql/semisync_master.cc mariadb-10.11.9/sql/semisync_master.cc --- mariadb-10.11.6/sql/semisync_master.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/semisync_master.cc 2024-08-03 07:29:59.000000000 +0000 @@ -68,6 +68,19 @@ return (ulonglong) ts->tv_sec * TIME_MILLION + ts->tv_nsec / TIME_THOUSAND; } +int signal_waiting_transaction(THD *waiting_thd, const char *binlog_file, + my_off_t binlog_pos) +{ + /* + It is possible that the connection thd waiting for an ACK was killed. In + such circumstance, the connection thread will nullify the thd member of its + Active_tranx node. So before we try to signal, ensure the THD exists. + */ + if (waiting_thd) + mysql_cond_signal(&waiting_thd->COND_wakeup_ready); + return 0; +} + /******************************************************************************* * * class : manage all active transaction nodes @@ -75,12 +88,14 @@ ******************************************************************************/ Active_tranx::Active_tranx(mysql_mutex_t *lock, + mysql_cond_t *cond, ulong trace_level) : Trace(trace_level), m_allocator(max_connections), m_num_entries(max_connections << 1), /* Transaction hash table size * is set to double the size * of max_connections */ - m_lock(lock) + m_lock(lock), + m_cond_empty(cond) { /* No transactions are in the list initially. */ m_trx_front = NULL; @@ -91,7 +106,9 @@ for (int idx = 0; idx < m_num_entries; ++idx) m_trx_htb[idx] = NULL; +#ifdef EXTRA_DEBUG sql_print_information("Semi-sync replication initialized for transactions."); +#endif } Active_tranx::~Active_tranx() @@ -140,7 +157,8 @@ return 0; } -int Active_tranx::insert_tranx_node(const char *log_file_name, +int Active_tranx::insert_tranx_node(THD *thd_to_wait, + const char *log_file_name, my_off_t log_file_pos) { Tranx_node *ins_node; @@ -163,6 +181,7 @@ strncpy(ins_node->log_name, log_file_name, FN_REFLEN-1); ins_node->log_name[FN_REFLEN-1] = 0; /* make sure it ends properly */ ins_node->log_pos = log_file_pos; + ins_node->thd= thd_to_wait; if (!m_trx_front) { @@ -230,28 +249,22 @@ DBUG_RETURN(entry != NULL); } -void Active_tranx::clear_active_tranx_nodes(const char *log_file_name, - my_off_t log_file_pos) +void Active_tranx::clear_active_tranx_nodes( + const char *log_file_name, my_off_t log_file_pos, + active_tranx_action pre_delete_hook) { Tranx_node *new_front; DBUG_ENTER("Active_tranx::::clear_active_tranx_nodes"); - if (log_file_name != NULL) - { - new_front = m_trx_front; - - while (new_front) - { - if (compare(new_front, log_file_name, log_file_pos) > 0) - break; - new_front = new_front->next; - } - } - else + new_front= m_trx_front; + while (new_front) { - /* If log_file_name is NULL, clear everything. */ - new_front = NULL; + if ((log_file_name != NULL) && + compare(new_front, log_file_name, log_file_pos) > 0) + break; + pre_delete_hook(new_front->thd, new_front->log_name, new_front->log_pos); + new_front = new_front->next; } if (new_front == NULL) @@ -313,9 +326,66 @@ m_trx_front->log_name, (ulong)m_trx_front->log_pos)); } + /* + m_cond_empty aliases Repl_semi_sync_master::COND_binlog, which holds the + condition variable to notify that we have cleared all nodes, e.g. used by + SHUTDOWN WAIT FOR ALL SLAVES. + */ + if (is_empty()) + mysql_cond_signal(m_cond_empty); + + DBUG_VOID_RETURN; +} + +void Active_tranx::unlink_thd_as_waiter(const char *log_file_name, + my_off_t log_file_pos) +{ + DBUG_ENTER("Active_tranx::unlink_thd_as_waiter"); + mysql_mutex_assert_owner(m_lock); + + unsigned int hash_val = get_hash_value(log_file_name, log_file_pos); + Tranx_node *entry = m_trx_htb[hash_val]; + + while (entry != NULL) + { + if (compare(entry, log_file_name, log_file_pos) == 0) + break; + + entry = entry->hash_next; + } + + if (entry) + entry->thd= NULL; + DBUG_VOID_RETURN; } +#ifndef DBUG_OFF +void Active_tranx::assert_thd_is_waiter(THD *thd_to_check, + const char *log_file_name, + my_off_t log_file_pos) +{ + DBUG_ENTER("Active_tranx::assert_thd_is_waiter"); + mysql_mutex_assert_owner(m_lock); + + unsigned int hash_val = get_hash_value(log_file_name, log_file_pos); + Tranx_node *entry = m_trx_htb[hash_val]; + + while (entry != NULL) + { + if (compare(entry, log_file_name, log_file_pos) == 0) + break; + + entry = entry->hash_next; + } + + DBUG_ASSERT(entry); + DBUG_ASSERT(entry->thd); + DBUG_ASSERT(entry->thd->thread_id == thd_to_check->thread_id); + + DBUG_VOID_RETURN; +} +#endif /******************************************************************************* * @@ -352,8 +422,8 @@ m_state(0), m_wait_point(0) { - strcpy(m_reply_file_name, ""); - strcpy(m_wait_file_name, ""); + m_reply_file_name[0]= '\0'; + m_wait_file_name[0]= '\0'; } int Repl_semi_sync_master::init_object() @@ -379,20 +449,10 @@ { result = enable_master(); if (!result) - { result= ack_receiver.start(); /* Start the ACK thread. */ - /* - If rpl_semi_sync_master_wait_no_slave is disabled, let's temporarily - switch off semisync to avoid hang if there's none active slave. - */ - if (!rpl_semi_sync_master_wait_no_slave) - switch_off(); - } } else - { disable_master(); - } return result; } @@ -406,7 +466,8 @@ if (!get_master_enabled()) { - m_active_tranxs = new Active_tranx(&LOCK_binlog, m_trace_level); + m_active_tranxs= + new Active_tranx(&LOCK_binlog, &COND_binlog_send, m_trace_level); if (m_active_tranxs != NULL) { m_commit_file_name_inited = false; @@ -441,7 +502,7 @@ */ switch_off(); - assert(m_active_tranxs != NULL); + DBUG_ASSERT(m_active_tranxs != NULL); delete m_active_tranxs; m_active_tranxs = NULL; @@ -450,7 +511,6 @@ m_commit_file_name_inited = false; set_master_enabled(false); - sql_print_information("Semi-sync replication disabled on the master."); } unlock(); @@ -469,15 +529,6 @@ delete m_active_tranxs; } -int Repl_semi_sync_master::sync_get_master_wait_sessions() -{ - int wait_sessions; - lock(); - wait_sessions= rpl_semi_sync_master_wait_sessions; - unlock(); - return wait_sessions; -} - void Repl_semi_sync_master::create_timeout(struct timespec *out, struct timespec *start_arg) { @@ -510,23 +561,6 @@ mysql_mutex_unlock(&LOCK_binlog); } -void Repl_semi_sync_master::cond_broadcast() -{ - mysql_cond_broadcast(&COND_binlog_send); -} - -int Repl_semi_sync_master::cond_timewait(struct timespec *wait_time) -{ - int wait_res; - - DBUG_ENTER("Repl_semi_sync_master::cond_timewait()"); - - wait_res= mysql_cond_timedwait(&COND_binlog_send, - &LOCK_binlog, wait_time); - - DBUG_RETURN(wait_res); -} - void Repl_semi_sync_master::add_slave() { lock(); @@ -537,31 +571,36 @@ void Repl_semi_sync_master::remove_slave() { lock(); - rpl_semi_sync_master_clients--; - - /* Only switch off if semi-sync is enabled and is on */ - if (get_master_enabled() && is_on()) + DBUG_ASSERT(rpl_semi_sync_master_clients > 0); + if (!(--rpl_semi_sync_master_clients) && !rpl_semi_sync_master_wait_no_slave) { - /* If user has chosen not to wait if no semi-sync slave available - and the last semi-sync slave exits, turn off semi-sync on master - immediately. - */ - if (!rpl_semi_sync_master_wait_no_slave && - rpl_semi_sync_master_clients == 0) - switch_off(); + /* + Signal transactions waiting in commit_trx() that they do not have to + wait anymore. + */ + m_active_tranxs->clear_active_tranx_nodes(NULL, 0, + signal_waiting_transaction); } unlock(); } + +/* + Check report package + + @retval 0 ok + @retval 1 Error + @retval -1 Slave is going down (ok) +*/ + int Repl_semi_sync_master::report_reply_packet(uint32 server_id, const uchar *packet, ulong packet_len) { - int result= -1; + int result= 1; // Assume error char log_file_name[FN_REFLEN+1]; my_off_t log_file_pos; ulong log_file_len = 0; - DBUG_ENTER("Repl_semi_sync_master::report_reply_packet"); DBUG_EXECUTE_IF("semisync_corrupt_magic", @@ -569,7 +608,14 @@ if (unlikely(packet[REPLY_MAGIC_NUM_OFFSET] != Repl_semi_sync_master::k_packet_magic_num)) { - sql_print_error("Read semi-sync reply magic number error"); + if (packet[0] == COM_QUIT && packet_len == 1) + { + /* Slave sent COM_QUIT as part of IO thread going down */ + sql_print_information("slave IO thread has stopped"); + DBUG_RETURN(-1); + } + else + sql_print_error("Read semi-sync reply magic number error"); goto l_end; } @@ -597,14 +643,13 @@ rpl_semi_sync_master_get_ack++; report_reply_binlog(server_id, log_file_name, log_file_pos); - result= 0; + DBUG_RETURN(0); l_end: - if (result == -1) { char buf[256]; - octet2hex(buf, (const char*) packet, std::min(static_cast(sizeof(buf)-1), - packet_len)); + octet2hex(buf, (const char*) packet, + MY_MIN(sizeof(buf)-1, (size_t) packet_len)); sql_print_information("First bytes of the packet from semisync slave " "server-id %d: %s", server_id, buf); @@ -617,7 +662,6 @@ my_off_t log_file_pos) { int cmp; - bool can_release_threads = false; bool need_copy_send_pos = true; DBUG_ENTER("Repl_semi_sync_master::report_reply_binlog"); @@ -668,46 +712,27 @@ m_reply_file_name_inited = true; /* Remove all active transaction nodes before this point. */ - assert(m_active_tranxs != NULL); - m_active_tranxs->clear_active_tranx_nodes(log_file_name, log_file_pos); + DBUG_ASSERT(m_active_tranxs != NULL); + m_active_tranxs->clear_active_tranx_nodes(log_file_name, log_file_pos, + signal_waiting_transaction); + if (m_active_tranxs->is_empty()) + m_wait_file_name_inited= false; DBUG_PRINT("semisync", ("%s: Got reply at (%s, %lu)", "Repl_semi_sync_master::report_reply_binlog", log_file_name, (ulong)log_file_pos)); } - if (rpl_semi_sync_master_wait_sessions > 0) - { - /* Let us check if some of the waiting threads doing a trx - * commit can now proceed. - */ - cmp = Active_tranx::compare(m_reply_file_name, m_reply_file_pos, - m_wait_file_name, m_wait_file_pos); - if (cmp >= 0) - { - /* Yes, at least one waiting thread can now proceed: - * let us release all waiting threads with a broadcast - */ - can_release_threads = true; - m_wait_file_name_inited = false; - } - } l_end: unlock(); - if (can_release_threads) - { - DBUG_PRINT("semisync", ("%s: signal all waiting threads.", - "Repl_semi_sync_master::report_reply_binlog")); - - cond_broadcast(); - } DBUG_RETURN(0); } -int Repl_semi_sync_master::wait_after_sync(const char *log_file, my_off_t log_pos) +int Repl_semi_sync_master::wait_after_sync(const char *log_file, + my_off_t log_pos) { if (!get_master_enabled()) return 0; @@ -763,24 +788,28 @@ /** The method runs after flush to binary log is done. */ -int Repl_semi_sync_master::report_binlog_update(THD* thd, const char *log_file, +int Repl_semi_sync_master::report_binlog_update(THD *trans_thd, + THD *waiter_thd, + const char *log_file, my_off_t log_pos) { if (get_master_enabled()) { Trans_binlog_info *log_info; - if (!(log_info= thd->semisync_info)) + if (!(log_info= trans_thd->semisync_info)) { if(!(log_info= (Trans_binlog_info*)my_malloc(PSI_INSTRUMENT_ME, sizeof(Trans_binlog_info), MYF(0)))) return 1; - thd->semisync_info= log_info; + trans_thd->semisync_info= log_info; } - strcpy(log_info->log_file, log_file + dirname_length(log_file)); + safe_strcpy(log_info->log_file, sizeof(log_info->log_file), + log_file + dirname_length(log_file)); log_info->log_pos = log_pos; - return write_tranx_in_binlog(log_info->log_file, log_pos); + return write_tranx_in_binlog(waiter_thd, log_info->log_file, + log_pos); } return 0; @@ -809,6 +838,8 @@ (long) thd->variables.server_id, log_file, (ulong) log_pos); + /* Mark that semi-sync net->pkt_nr is not reliable */ + thd->net.pkt_nr_can_be_reset= 1; return 0; } @@ -824,11 +855,18 @@ ack_receiver.remove_slave(thd); } -int Repl_semi_sync_master::commit_trx(const char* trx_wait_binlog_name, +int Repl_semi_sync_master::commit_trx(const char *trx_wait_binlog_name, my_off_t trx_wait_binlog_pos) { + bool success= 0; DBUG_ENTER("Repl_semi_sync_master::commit_trx"); + if (!rpl_semi_sync_master_clients && !rpl_semi_sync_master_wait_no_slave) + { + rpl_semi_sync_master_no_transactions++; + DBUG_RETURN(0); + } + if (get_master_enabled() && trx_wait_binlog_name) { struct timespec start_ts; @@ -836,7 +874,7 @@ int wait_result; PSI_stage_info old_stage; THD *thd= current_thd; - + bool aborted __attribute__((unused)) = 0; set_timespec(start_ts, 0); DEBUG_SYNC(thd, "rpl_semisync_master_commit_trx_before_lock"); @@ -844,9 +882,8 @@ lock(); /* This must be called after acquired the lock */ - THD_ENTER_COND(thd, &COND_binlog_send, &LOCK_binlog, - & stage_waiting_for_semi_sync_ack_from_slave, - & old_stage); + THD_ENTER_COND(thd, &thd->COND_wakeup_ready, &LOCK_binlog, + &stage_waiting_for_semi_sync_ack_from_slave, &old_stage); /* This is the real check inside the mutex. */ if (!get_master_enabled() || !is_on()) @@ -857,8 +894,15 @@ trx_wait_binlog_name, (ulong)trx_wait_binlog_pos, (int)is_on())); - while (is_on() && !thd_killed(thd)) + while (is_on() && !(aborted= thd_killed(thd))) { + /* We have to check these again as things may have changed */ + if (!rpl_semi_sync_master_clients && !rpl_semi_sync_master_wait_no_slave) + { + aborted= 1; + break; + } + if (m_reply_file_name_inited) { int cmp = Active_tranx::compare(m_reply_file_name, m_reply_file_pos, @@ -873,6 +917,7 @@ "Repl_semi_sync_master::commit_trx", m_reply_file_name, (ulong)m_reply_file_pos)); + success= 1; break; } } @@ -886,7 +931,7 @@ trx_wait_binlog_pos, m_wait_file_name, m_wait_file_pos); if (cmp <= 0) - { + { /* This thd has a lower position, let's update the minimum info. */ strmake_buf(m_wait_file_name, trx_wait_binlog_name); m_wait_file_pos = trx_wait_binlog_pos; @@ -918,20 +963,18 @@ */ rpl_semi_sync_master_wait_sessions++; - /* We keep track of when this thread is awaiting an ack to ensure it is - * not killed while awaiting an ACK if a shutdown is issued. - */ - set_thd_awaiting_semisync_ack(thd, TRUE); - DBUG_PRINT("semisync", ("%s: wait %lu ms for binlog sent (%s, %lu)", "Repl_semi_sync_master::commit_trx", m_wait_timeout, m_wait_file_name, (ulong)m_wait_file_pos)); +#ifndef DBUG_OFF + m_active_tranxs->assert_thd_is_waiter(thd, trx_wait_binlog_name, + trx_wait_binlog_pos); +#endif create_timeout(&abstime, &start_ts); - wait_result = cond_timewait(&abstime); - - set_thd_awaiting_semisync_ack(thd, FALSE); + wait_result= mysql_cond_timedwait(&thd->COND_wakeup_ready, &LOCK_binlog, + &abstime); rpl_semi_sync_master_wait_sessions--; if (wait_result != 0) @@ -963,23 +1006,55 @@ { rpl_semi_sync_master_trx_wait_num++; rpl_semi_sync_master_trx_wait_time += wait_time; + + DBUG_EXECUTE_IF("testing_cond_var_per_thd", { + /* + DBUG log warning to ensure we have either recieved our ACK; or + have timed out and are awoken in an off state. Test + rpl.rpl_semi_sync_cond_var_per_thd scans the logs to ensure this + warning is not present. + */ + bool valid_wakeup= + (!get_master_enabled() || !is_on() || thd->is_killed() || + 0 <= Active_tranx::compare( + m_reply_file_name, m_reply_file_pos, + trx_wait_binlog_name, trx_wait_binlog_pos)); + if (!valid_wakeup) + { + sql_print_warning( + "Thread awaiting semi-sync ACK was awoken before its " + "ACK. THD (%llu), Wait coord: (%s, %llu), ACK coord: (%s, " + "%llu)", + thd->thread_id, trx_wait_binlog_name, trx_wait_binlog_pos, + m_reply_file_name, m_reply_file_pos); + } + }); } } } /* + If our THD was killed (rather than awoken from an ACK) notify the + Active_tranx cache that we are no longer waiting for the ACK, so nobody + signals our COND var invalidly. + */ + if (aborted) + m_active_tranxs->unlink_thd_as_waiter(trx_wait_binlog_name, + trx_wait_binlog_pos); + + /* At this point, the binlog file and position of this transaction must have been removed from Active_tranx. m_active_tranxs may be NULL if someone disabled semi sync during - cond_timewait() + mysql_cond_timedwait */ - assert(thd_killed(thd) || !m_active_tranxs || - !m_active_tranxs->is_tranx_end_pos(trx_wait_binlog_name, - trx_wait_binlog_pos)); + DBUG_ASSERT(aborted || !m_active_tranxs || m_active_tranxs->is_empty() || + !m_active_tranxs->is_tranx_end_pos(trx_wait_binlog_name, + trx_wait_binlog_pos)); l_end: /* Update the status counter. */ - if (is_on()) + if (success) rpl_semi_sync_master_yes_transactions++; else rpl_semi_sync_master_no_transactions++; @@ -1014,18 +1089,21 @@ { DBUG_ENTER("Repl_semi_sync_master::switch_off"); - m_state = false; - /* Clear the active transaction list. */ - assert(m_active_tranxs != NULL); - m_active_tranxs->clear_active_tranx_nodes(NULL, 0); + if (m_active_tranxs) + m_active_tranxs->clear_active_tranx_nodes(NULL, 0, + signal_waiting_transaction); - rpl_semi_sync_master_off_times++; - m_wait_file_name_inited = false; - m_reply_file_name_inited = false; - sql_print_information("Semi-sync replication switched OFF."); - cond_broadcast(); /* wake up all waiting threads */ + if (m_state) + { + m_state = false; + + rpl_semi_sync_master_off_times++; + m_wait_file_name_inited = false; + m_reply_file_name_inited = false; + sql_print_information("Semi-sync replication switched OFF."); + } DBUG_VOID_RETURN; } @@ -1072,9 +1150,10 @@ { DBUG_ENTER("Repl_semi_sync_master::reserve_sync_header"); - /* Set the magic number and the sync status. By default, no sync - * is required. - */ + /* + Set the magic number and the sync status. By default, no sync + is required. + */ packet->append(reinterpret_cast(k_sync_header), sizeof(k_sync_header)); DBUG_RETURN(0); @@ -1087,7 +1166,6 @@ { int cmp = 0; bool sync = false; - DBUG_ENTER("Repl_semi_sync_master::update_sync_header"); /* If the semi-sync master is not enabled, or the slave is not a semi-sync @@ -1103,16 +1181,11 @@ /* This is the real check inside the mutex. */ if (!get_master_enabled()) - { - assert(sync == false); goto l_end; - } if (is_on()) { /* semi-sync is ON */ - sync = false; /* No sync unless a transaction is involved. */ - if (m_reply_file_name_inited) { cmp = Active_tranx::compare(log_file_name, log_file_pos, @@ -1126,15 +1199,10 @@ } } + cmp = 1; if (m_wait_file_name_inited) - { cmp = Active_tranx::compare(log_file_name, log_file_pos, m_wait_file_name, m_wait_file_pos); - } - else - { - cmp = 1; - } /* If we are already waiting for some transaction replies which * are later in binlog, do not wait for this one event. @@ -1144,7 +1212,7 @@ /* * We only wait if the event is a transaction's ending event. */ - assert(m_active_tranxs != NULL); + DBUG_ASSERT(m_active_tranxs != NULL); sync = m_active_tranxs->is_tranx_end_pos(log_file_name, log_file_pos); } @@ -1172,18 +1240,18 @@ l_end: unlock(); - /* We do not need to clear sync flag because we set it to 0 when we - * reserve the packet header. - */ + /* + We do not need to clear sync flag in packet because we set it to 0 when we + reserve the packet header. + */ if (sync) - { - (packet)[2] = k_packet_flag_sync; - } + packet[2]= k_packet_flag_sync; DBUG_RETURN(0); } -int Repl_semi_sync_master::write_tranx_in_binlog(const char* log_file_name, +int Repl_semi_sync_master::write_tranx_in_binlog(THD *thd, + const char *log_file_name, my_off_t log_file_pos) { int result = 0; @@ -1225,8 +1293,8 @@ if (is_on()) { - assert(m_active_tranxs != NULL); - if(m_active_tranxs->insert_tranx_node(log_file_name, log_file_pos)) + DBUG_ASSERT(m_active_tranxs != NULL); + if(m_active_tranxs->insert_tranx_node(thd, log_file_name, log_file_pos)) { /* if insert tranx_node failed, print a warning message @@ -1256,7 +1324,7 @@ DBUG_ENTER("Repl_semi_sync_master::flush_net"); - assert((unsigned char)event_buf[1] == k_packet_magic_num); + DBUG_ASSERT((unsigned char)event_buf[1] == k_packet_magic_num); if ((unsigned char)event_buf[2] != k_packet_flag_sync) { /* current event does not require reply */ @@ -1274,6 +1342,11 @@ goto l_end; } + /* + We have to do a net_clear() as with semi-sync the slave_reply's are + interleaved with data from the master and then the net->pkt_nr + cannot be kept in sync. Better to start pkt_nr from 0 again. + */ net_clear(net, 0); net->pkt_nr++; net->compress_pkt_nr++; @@ -1300,11 +1373,7 @@ lock(); - if (rpl_semi_sync_master_clients == 0 && - !rpl_semi_sync_master_wait_no_slave) - m_state = 0; - else - m_state = get_master_enabled()? 1 : 0; + m_state = get_master_enabled() ? 1 : 0; m_wait_file_name_inited = false; m_reply_file_name_inited = false; @@ -1338,18 +1407,6 @@ DBUG_RETURN(result); } -void Repl_semi_sync_master::check_and_switch() -{ - lock(); - if (get_master_enabled() && is_on()) - { - if (!rpl_semi_sync_master_wait_no_slave - && rpl_semi_sync_master_clients == 0) - switch_off(); - } - unlock(); -} - void Repl_semi_sync_master::set_export_stats() { lock(); @@ -1363,25 +1420,37 @@ ((rpl_semi_sync_master_net_wait_num) ? (ulong)((double)rpl_semi_sync_master_net_wait_time / ((double)rpl_semi_sync_master_net_wait_num)) : 0); - unlock(); } -void Repl_semi_sync_master::await_slave_reply() +void Repl_semi_sync_master::await_all_slave_replies(const char *msg) { - struct timespec abstime; - - DBUG_ENTER("Repl_semi_sync_master::::await_slave_reply"); - lock(); + struct timespec timeout; + int wait_result= 0; + bool first= true; + DBUG_ENTER("Repl_semi_sync_master::::await_all_slave_replies"); - /* Just return if there is nothing to wait for */ - if (!rpl_semi_sync_master_wait_sessions) - goto end; + /* + Wait for all transactions that need ACKS to have received them; or timeout. + If it is a timeout, the connection thread should attempt to turn off + semi-sync and broadcast to all other waiting threads to move on. - create_timeout(&abstime, NULL); - cond_timewait(&abstime); + COND_binlog_send is only signalled after the Active_tranx cache has been + emptied. + */ + create_timeout(&timeout, NULL); + lock(); + while (get_master_enabled() && is_on() && !m_active_tranxs->is_empty() && !wait_result) + { + if (msg && first) + { + first= false; + sql_print_information(msg); + } -end: + wait_result= + mysql_cond_timedwait(&COND_binlog_send, &LOCK_binlog, &timeout); + } unlock(); DBUG_VOID_RETURN; } diff -Nru mariadb-10.11.6/sql/semisync_master.h mariadb-10.11.9/sql/semisync_master.h --- mariadb-10.11.6/sql/semisync_master.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/semisync_master.h 2024-08-03 07:29:59.000000000 +0000 @@ -31,6 +31,7 @@ struct Tranx_node { char log_name[FN_REFLEN]; my_off_t log_pos; + THD *thd; /* The thread awaiting an ACK */ struct Tranx_node *next; /* the next node in the sorted list */ struct Tranx_node *hash_next; /* the next node during hash collision */ }; @@ -289,6 +290,18 @@ }; /** + Function pointer type to run on the contents of an Active_tranx node. + + Return 0 for success, 1 for error. + + Note Repl_semi_sync_master::LOCK_binlog is not guaranteed to be held for + its invocation. See the context in which it is called to know. +*/ + +typedef int (*active_tranx_action)(THD *trx_thd, const char *log_file_name, + my_off_t trx_log_file_pos); + +/** This class manages memory for active transaction list. We record each active transaction with a Tranx_node, each session @@ -308,6 +321,7 @@ int m_num_entries; /* maximum hash table entries */ mysql_mutex_t *m_lock; /* mutex lock */ + mysql_cond_t *m_cond_empty; /* signalled when cleared all Tranx_node */ inline void assert_lock_owner(); @@ -330,7 +344,8 @@ } public: - Active_tranx(mysql_mutex_t *lock, unsigned long trace_level); + Active_tranx(mysql_mutex_t *lock, mysql_cond_t *cond, + unsigned long trace_level); ~Active_tranx(); /* Insert an active transaction node with the specified position. @@ -338,15 +353,38 @@ * Return: * 0: success; non-zero: error */ - int insert_tranx_node(const char *log_file_name, my_off_t log_file_pos); + int insert_tranx_node(THD *thd_to_wait, const char *log_file_name, + my_off_t log_file_pos); /* Clear the active transaction nodes until(inclusive) the specified * position. * If log_file_name is NULL, everything will be cleared: the sorted * list and the hash table will be reset to empty. + * + * The pre_delete_hook parameter is a function pointer that will be invoked + * for each Active_tranx node, in order, from m_trx_front to m_trx_rear, + * e.g. to signal their wakeup condition. Repl_semi_sync_binlog::LOCK_binlog + * is held while this is invoked. */ void clear_active_tranx_nodes(const char *log_file_name, - my_off_t log_file_pos); + my_off_t log_file_pos, + active_tranx_action pre_delete_hook); + + /* Unlinks a thread from a Tranx_node, so it will not be referenced/signalled + * if it is separately killed. Note that this keeps the Tranx_node itself in + * the cache so it can still be awaited by await_all_slave_replies(), e.g. + * as is done by SHUTDOWN WAIT FOR ALL SLAVES. + */ + void unlink_thd_as_waiter(const char *log_file_name, my_off_t log_file_pos); + +#ifndef DBUG_OFF + /* Uses DBUG_ASSERT statements to ensure that the argument thd_to_check + * matches the thread of the respective Tranx_node::thd of the passed in + * log_file_name and log_file_pos. + */ + void assert_thd_is_waiter(THD *thd_to_check, const char *log_file_name, + my_off_t log_file_pos); +#endif /* Given a position, check to see whether the position is an active * transaction's ending position by probing the hash table. @@ -359,6 +397,12 @@ static int compare(const char *log_file_name1, my_off_t log_file_pos1, const char *log_file_name2, my_off_t log_file_pos2); + + /* Check if there are no transactions actively awaiting ACKs. Returns true + * if the internal linked list has no entries, false otherwise. + */ + bool is_empty() { return m_trx_front == NULL; } + }; /** @@ -433,8 +477,6 @@ void lock(); void unlock(); - void cond_broadcast(); - int cond_timewait(struct timespec *wait_time); /* Is semi-sync replication on? */ bool is_on() { @@ -472,8 +514,6 @@ m_wait_timeout = wait_timeout; } - int sync_get_master_wait_sessions(); - /* Calculates a timeout that is m_wait_timeout after start_arg and saves it in out. If start_arg is NULL, the timeout is m_wait_timeout after the @@ -482,10 +522,15 @@ void create_timeout(struct timespec *out, struct timespec *start_arg); /* - Blocks the calling thread until the ack_receiver either receives an ACK - or times out (from rpl_semi_sync_master_timeout) + Blocks the calling thread until the ack_receiver either receives ACKs for + all transactions awaiting ACKs, or times out (from + rpl_semi_sync_master_timeout). + + If info_msg is provided, it will be output via sql_print_information when + there are transactions awaiting ACKs; info_msg is not output if there are + no transasctions to await. */ - void await_slave_reply(); + void await_all_slave_replies(const char *msg); /*set the ACK point, after binlog sync or after transaction commit*/ void set_wait_point(unsigned long ack_point) @@ -561,9 +606,23 @@ /*Wait after the transaction is rollback*/ int wait_after_rollback(THD *thd, bool all); - /*Store the current binlog position in m_active_tranxs. This position should - * be acked by slave*/ - int report_binlog_update(THD *thd, const char *log_file,my_off_t log_pos); + /* Store the current binlog position in m_active_tranxs. This position should + * be acked by slave. + * + * Inputs: + * trans_thd Thread of the transaction which is executing the + * transaction. + * waiter_thd Thread that will wait for the ACK from the replica, + * which depends on the semi-sync wait point. If AFTER_SYNC, + * and also using binlog group commit, this will be the leader + * thread of the binlog commit. Otherwise, it is the thread that + * is executing the transaction, i.e. the same as trans_thd. + * log_file Name of the binlog file that the transaction is written into + * log_pos Offset within the binlog file that the transaction is written + * at + */ + int report_binlog_update(THD *trans_thd, THD *waiter_thd, + const char *log_file, my_off_t log_pos); int dump_start(THD* thd, const char *log_file, @@ -609,13 +668,19 @@ * semi-sync is on * * Input: (the transaction events' ending binlog position) + * THD - (IN) thread that will wait for an ACK. This can be the + * binlog leader thread when using wait_point + * AFTER_SYNC with binlog group commit. In all other + * cases, this is the user thread executing the + * transaction. * log_file_name - (IN) transaction ending position's file name * log_file_pos - (IN) transaction ending position's file offset * * Return: * 0: success; non-zero: error */ - int write_tranx_in_binlog(const char* log_file_name, my_off_t log_file_pos); + int write_tranx_in_binlog(THD *thd, const char *log_file_name, + my_off_t log_file_pos); /* Read the slave's reply so that we know how much progress the slave makes * on receive replication events. @@ -633,32 +698,6 @@ /*called before reset master*/ int before_reset_master(); - void check_and_switch(); - - /* - Determines if the given thread is currently awaiting a semisync_ack. Note - that the thread's value is protected by this class's LOCK_binlog, so this - function (indirectly) provides safe access. - */ - my_bool is_thd_awaiting_semisync_ack(THD *thd) - { - lock(); - my_bool ret= thd->is_awaiting_semisync_ack; - unlock(); - return ret; - } - - /* - Update the thread's value for is_awaiting_semisync_ack. LOCK_binlog (from - this class) should be acquired before calling this function. - */ - void set_thd_awaiting_semisync_ack(THD *thd, - my_bool _is_awaiting_semisync_ack) - { - mysql_mutex_assert_owner(&LOCK_binlog); - thd->is_awaiting_semisync_ack= _is_awaiting_semisync_ack; - } - mysql_mutex_t LOCK_rpl_semi_sync_master_enabled; }; diff -Nru mariadb-10.11.6/sql/semisync_master_ack_receiver.cc mariadb-10.11.9/sql/semisync_master_ack_receiver.cc --- mariadb-10.11.6/sql/semisync_master_ack_receiver.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/semisync_master_ack_receiver.cc 2024-08-03 07:29:59.000000000 +0000 @@ -24,7 +24,8 @@ #ifdef HAVE_PSI_THREAD_INTERFACE extern PSI_thread_key key_thread_ack_receiver; #endif -extern Repl_semi_sync_master repl_semisync; + +my_socket global_ack_signal_fd= -1; /* Callback function of ack receive thread */ pthread_handler_t ack_receive_handler(void *arg) @@ -45,6 +46,7 @@ m_status= ST_DOWN; mysql_mutex_init(key_LOCK_ack_receiver, &m_mutex, NULL); mysql_cond_init(key_COND_ack_receiver, &m_cond, NULL); + mysql_cond_init(key_COND_ack_receiver, &m_cond_reply, NULL); m_pid= 0; DBUG_VOID_RETURN; @@ -57,6 +59,7 @@ stop(); mysql_mutex_destroy(&m_mutex); mysql_cond_destroy(&m_cond); + mysql_cond_destroy(&m_cond_reply); DBUG_VOID_RETURN; } @@ -104,6 +107,7 @@ if (m_status == ST_UP) { m_status= ST_STOPPING; + signal_listener(); // Signal listener thread to stop mysql_cond_broadcast(&m_cond); while (m_status == ST_STOPPING) @@ -118,6 +122,21 @@ DBUG_VOID_RETURN; } +#ifndef DBUG_OFF +void static dbug_verify_no_duplicate_slaves(Slave_ilist *m_slaves, THD *thd) +{ + I_List_iterator it(*m_slaves); + Slave *slave; + while ((slave= it++)) + { + DBUG_ASSERT(slave->thd->variables.server_id != thd->variables.server_id); + } +} +#else +#define dbug_verify_no_duplicate_slaves(A,B) do {} while(0) +#endif + + bool Ack_receiver::add_slave(THD *thd) { Slave *slave; @@ -126,17 +145,23 @@ if (!(slave= new Slave)) DBUG_RETURN(true); + slave->active= 0; slave->thd= thd; slave->vio= *thd->net.vio; slave->vio.mysql_socket.m_psi= NULL; - slave->vio.read_timeout= 1; + slave->vio.read_timeout= 1; // 1 ms mysql_mutex_lock(&m_mutex); + + dbug_verify_no_duplicate_slaves(&m_slaves, thd); + m_slaves.push_back(slave); m_slaves_changed= true; mysql_cond_broadcast(&m_cond); mysql_mutex_unlock(&m_mutex); + signal_listener(); // Inform listener that there are new slaves + DBUG_RETURN(false); } @@ -144,6 +169,7 @@ { I_List_iterator it(m_slaves); Slave *slave; + bool slaves_changed= 0; DBUG_ENTER("Ack_receiver::remove_slave"); mysql_mutex_lock(&m_mutex); @@ -153,10 +179,23 @@ if (slave->thd == thd) { delete slave; - m_slaves_changed= true; + slaves_changed= true; break; } } + if (slaves_changed) + { + m_slaves_changed= true; + mysql_cond_broadcast(&m_cond); + /* + Wait until Ack_receiver::run() acknowledges remove of slave + As this is only sent under the mutex and after listners has + been collected, we know that listener has ignored the found + slave. + */ + if (m_status != ST_DOWN) + mysql_cond_wait(&m_cond_reply, &m_mutex); + } mysql_mutex_unlock(&m_mutex); DBUG_VOID_RETURN; @@ -167,10 +206,15 @@ (void)MYSQL_SET_STAGE(stage.m_key, __FILE__, __LINE__); } -inline void Ack_receiver::wait_for_slave_connection() +void Ack_receiver::wait_for_slave_connection(THD *thd) { - set_stage_info(stage_waiting_for_semi_sync_slave); - mysql_cond_wait(&m_cond, &m_mutex); + thd->enter_cond(&m_cond, &m_mutex, &stage_waiting_for_semi_sync_slave, + 0, __func__, __FILE__, __LINE__); + + while (m_status == ST_UP && m_slaves.is_empty()) + mysql_cond_wait(&m_cond, &m_mutex); + + thd->exit_cond(0, __func__, __FILE__, __LINE__); } /* Auxilary function to initialize a NET object with given net buffer. */ @@ -188,17 +232,23 @@ THD *thd= new THD(next_thread_id()); NET net; unsigned char net_buff[REPLY_MESSAGE_MAX_LENGTH]; + DBUG_ENTER("Ack_receiver::run"); my_thread_init(); - DBUG_ENTER("Ack_receiver::run"); - #ifdef HAVE_POLL Poll_socket_listener listener(m_slaves); #else Select_socket_listener listener(m_slaves); #endif //HAVE_POLL + if (listener.got_error()) + { + sql_print_error("Got error %M starting ack receiver thread", + listener.got_error()); + return; + } + sql_print_information("Starting ack receiver thread"); thd->system_thread= SYSTEM_THREAD_SEMISYNC_MASTER_BACKGROUND; thd->thread_stack= (char*) &thd; @@ -207,64 +257,79 @@ thd->set_command(COM_DAEMON); init_net(&net, net_buff, REPLY_MESSAGE_MAX_LENGTH); - mysql_mutex_lock(&m_mutex); + /* + Mark that we have to setup the listener. Note that only this functions can + set m_slaves_changed to false + */ m_slaves_changed= true; - mysql_mutex_unlock(&m_mutex); while (1) { - int ret; - uint slave_count __attribute__((unused))= 0; + int ret, slave_count= 0; Slave *slave; mysql_mutex_lock(&m_mutex); - if (unlikely(m_status == ST_STOPPING)) + if (unlikely(m_status != ST_UP)) goto end; - set_stage_info(stage_waiting_for_semi_sync_ack_from_slave); if (unlikely(m_slaves_changed)) { if (unlikely(m_slaves.is_empty())) { - wait_for_slave_connection(); - mysql_mutex_unlock(&m_mutex); + m_slaves_changed= false; + mysql_cond_broadcast(&m_cond_reply); // Signal remove_slave + wait_for_slave_connection(thd); + /* Wait for slave unlocks m_mutex */ continue; } + set_stage_info(stage_waiting_for_semi_sync_ack_from_slave); if ((slave_count= listener.init_slave_sockets()) == 0) + { + mysql_mutex_unlock(&m_mutex); + m_slaves_changed= true; + continue; // Retry + } + if (slave_count < 0) goto end; m_slaves_changed= false; + mysql_cond_broadcast(&m_cond_reply); // Signal remove_slave + } + #ifdef HAVE_POLL DBUG_PRINT("info", ("fd count %u", slave_count)); #else DBUG_PRINT("info", ("fd count %u, max_fd %d", slave_count, (int) listener.get_max_fd())); #endif - } + mysql_mutex_unlock(&m_mutex); ret= listener.listen_on_sockets(); + if (ret <= 0) { - mysql_mutex_unlock(&m_mutex); ret= DBUG_IF("rpl_semisync_simulate_select_error") ? -1 : ret; if (ret == -1 && errno != EINTR) sql_print_information("Failed to wait on semi-sync sockets, " "error: errno=%d", socket_errno); - /* Sleep 1us, so other threads can catch the m_mutex easily. */ - my_sleep(1); continue; } + listener.clear_signal(); + mysql_mutex_lock(&m_mutex); set_stage_info(stage_reading_semi_sync_ack); Slave_ilist_iterator it(m_slaves); while ((slave= it++)) { - if (listener.is_socket_active(slave)) + if (slave->active && + ((slave->vio.read_pos < slave->vio.read_end) || + listener.is_socket_active(slave))) { ulong len; + /* Semi-sync packets will always be sent with pkt_nr == 1 */ net_clear(&net, 0); net.vio= &slave->vio; /* @@ -273,31 +338,55 @@ */ net.compress= slave->thd->net.compress; + if (unlikely(listener.is_socket_hangup(slave))) + { + if (global_system_variables.log_warnings > 2) + sql_print_warning("Semisync ack receiver got hangup " + "from slave server-id %d", + slave->server_id()); + it.remove(); + m_slaves_changed= true; + continue; + } + len= my_net_read(&net); if (likely(len != packet_error)) - repl_semisync_master.report_reply_packet(slave->server_id(), - net.read_pos, len); - else { - if (net.last_errno == ER_NET_READ_ERROR) + int res; + res= repl_semisync_master.report_reply_packet(slave->server_id(), + net.read_pos, len); + if (unlikely(res < 0)) { - listener.clear_socket_info(slave); + /* + Slave has sent COM_QUIT or other failure. + Delete it from listener + */ + it.remove(); + m_slaves_changed= true; } + } + else if (net.last_errno == ER_NET_READ_ERROR) + { if (net.last_errno > 0 && global_system_variables.log_warnings > 2) sql_print_warning("Semisync ack receiver got error %d \"%s\" " "from slave server-id %d", net.last_errno, ER_DEFAULT(net.last_errno), slave->server_id()); + it.remove(); + m_slaves_changed= true; } } } mysql_mutex_unlock(&m_mutex); } + end: sql_print_information("Stopping ack receiver thread"); m_status= ST_DOWN; - delete thd; mysql_cond_broadcast(&m_cond); + mysql_cond_broadcast(&m_cond_reply); mysql_mutex_unlock(&m_mutex); + + delete thd; DBUG_VOID_RETURN; } diff -Nru mariadb-10.11.6/sql/semisync_master_ack_receiver.h mariadb-10.11.9/sql/semisync_master_ack_receiver.h --- mariadb-10.11.6/sql/semisync_master_ack_receiver.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/semisync_master_ack_receiver.h 2024-08-03 07:29:59.000000000 +0000 @@ -20,6 +20,7 @@ #include "my_pthread.h" #include "sql_class.h" #include "semisync.h" +#include "socketpair.h" #include struct Slave :public ilink @@ -29,6 +30,7 @@ #ifdef HAVE_POLL uint m_fds_index; #endif + bool active; my_socket sock_fd() const { return vio.mysql_socket.fd; } uint server_id() const { return thd->variables.server_id; } }; @@ -46,6 +48,7 @@ add_slave: maintain a new semisync slave's information remove_slave: remove a semisync slave's information */ + class Ack_receiver : public Repl_semi_sync_base { public: @@ -96,15 +99,20 @@ { m_trace_level= trace_level; } + bool running() + { + return m_status != ST_DOWN; + } + private: enum status {ST_UP, ST_DOWN, ST_STOPPING}; - uint8 m_status; + enum status m_status; /* Protect m_status, m_slaves_changed and m_slaves. ack thread and other session may access the variables at the same time. */ mysql_mutex_t m_mutex; - mysql_cond_t m_cond; + mysql_cond_t m_cond, m_cond_reply; /* If slave list is updated(add or remove). */ bool m_slaves_changed; @@ -116,25 +124,103 @@ Ack_receiver& operator=(const Ack_receiver &ack_receiver); void set_stage_info(const PSI_stage_info &stage); - void wait_for_slave_connection(); + void wait_for_slave_connection(THD *thd); +}; + + +extern my_socket global_ack_signal_fd; + +class Ack_listener +{ +public: + my_socket local_read_signal; + const Slave_ilist &m_slaves; + int error; + + Ack_listener(const Slave_ilist &slaves) + :local_read_signal(-1), m_slaves(slaves), error(0) + { + my_socket pipes[2]; +#ifdef _WIN32 + error= create_socketpair(pipes); +#else + if (!pipe(pipes)) + { + fcntl(pipes[0], F_SETFL, O_NONBLOCK); + fcntl(pipes[1], F_SETFL, O_NONBLOCK); + } + else + { + pipes[0]= pipes[1]= -1; + } +#endif /* _WIN32 */ + local_read_signal= pipes[0]; + global_ack_signal_fd= pipes[1]; + } + + virtual ~Ack_listener() + { +#ifdef _WIN32 + my_socket pipes[2]; + pipes[0]= local_read_signal; + pipes[1]= global_ack_signal_fd; + close_socketpair(pipes); +#else + if (global_ack_signal_fd >= 0) + close(global_ack_signal_fd); + if (local_read_signal >= 0) + close(local_read_signal); +#endif /* _WIN32 */ + global_ack_signal_fd= local_read_signal= -1; + } + + int got_error() { return error; } + + virtual bool has_signal_data()= 0; + + /* Clear data sent by signal_listener() to abort read */ + void clear_signal() + { + if (has_signal_data()) + { + char buff[100]; + /* Clear the signal message */ +#ifndef _WIN32 + (void) !read(local_read_signal, buff, sizeof(buff)); +#else + recv(local_read_signal, buff, sizeof(buff), 0); +#endif /* _WIN32 */ + } + } }; +static inline void signal_listener() +{ +#ifndef _WIN32 + my_write(global_ack_signal_fd, (uchar*) "a", 1, MYF(0)); +#else + send(global_ack_signal_fd, "a", 1, 0); +#endif /* _WIN32 */ +} #ifdef HAVE_POLL #include -#include -class Poll_socket_listener +class Poll_socket_listener final : public Ack_listener { +private: + std::vector m_fds; + public: Poll_socket_listener(const Slave_ilist &slaves) - :m_slaves(slaves) - { - } + :Ack_listener(slaves) + {} + + virtual ~Poll_socket_listener() = default; bool listen_on_sockets() { - return poll(m_fds.data(), m_fds.size(), 1000 /*1 Second timeout*/); + return poll(m_fds.data(), m_fds.size(), -1); } bool is_socket_active(const Slave *slave) @@ -142,21 +228,40 @@ return m_fds[slave->m_fds_index].revents & POLLIN; } + bool is_socket_hangup(const Slave *slave) + { + return m_fds[slave->m_fds_index].revents & POLLHUP; + } + void clear_socket_info(const Slave *slave) { m_fds[slave->m_fds_index].fd= -1; m_fds[slave->m_fds_index].events= 0; } - uint init_slave_sockets() + bool has_signal_data() override + { + /* The signal fd is always first */ + return (m_fds[0].revents & POLLIN); + } + + int init_slave_sockets() { Slave_ilist_iterator it(const_cast(m_slaves)); Slave *slave; uint fds_index= 0; + pollfd poll_fd; m_fds.clear(); + /* First put in the signal socket */ + poll_fd.fd= local_read_signal; + poll_fd.events= POLLIN; + m_fds.push_back(poll_fd); + fds_index++; + while ((slave= it++)) { + slave->active= 1; pollfd poll_fd; poll_fd.fd= slave->sock_fd(); poll_fd.events= POLLIN; @@ -165,29 +270,30 @@ } return fds_index; } - -private: - const Slave_ilist &m_slaves; - std::vector m_fds; }; #else //NO POLL -class Select_socket_listener +class Select_socket_listener final : public Ack_listener { +private: + my_socket m_max_fd; + fd_set m_init_fds; + fd_set m_fds; + public: Select_socket_listener(const Slave_ilist &slaves) - :m_slaves(slaves), m_max_fd(INVALID_SOCKET) - { - } + :Ack_listener(slaves), m_max_fd(INVALID_SOCKET) + {} + + virtual ~Select_socket_listener() = default; bool listen_on_sockets() { /* Reinitialize the fds with active fds before calling select */ m_fds= m_init_fds; - struct timeval tv= {1,0}; /* select requires max fd + 1 for the first argument */ - return select((int) m_max_fd+1, &m_fds, NULL, NULL, &tv); + return select((int) m_max_fd+1, &m_fds, NULL, NULL, NULL); } bool is_socket_active(const Slave *slave) @@ -195,43 +301,66 @@ return FD_ISSET(slave->sock_fd(), &m_fds); } + bool is_socket_hangup(const Slave *slave) + { + return 0; + } + + bool has_signal_data() override + { + return FD_ISSET(local_read_signal, &m_fds); + } + void clear_socket_info(const Slave *slave) { FD_CLR(slave->sock_fd(), &m_init_fds); } - uint init_slave_sockets() + int init_slave_sockets() { Slave_ilist_iterator it(const_cast(m_slaves)); Slave *slave; uint fds_index= 0; FD_ZERO(&m_init_fds); + m_max_fd= -1; + + /* First put in the signal socket */ + FD_SET(local_read_signal, &m_init_fds); + fds_index++; + set_if_bigger(m_max_fd, local_read_signal); +#ifndef _WIN32 + if (local_read_signal > FD_SETSIZE) + { + int socket_id= local_read_signal; + sql_print_error("Semisync slave socket fd is %u. " + "select() cannot handle if the socket fd is " + "greater than %u (FD_SETSIZE).", socket_id, FD_SETSIZE); + return -1; + } +#endif + while ((slave= it++)) { my_socket socket_id= slave->sock_fd(); - m_max_fd= (socket_id > m_max_fd ? socket_id : m_max_fd); + set_if_bigger(m_max_fd, socket_id); #ifndef _WIN32 if (socket_id > FD_SETSIZE) { sql_print_error("Semisync slave socket fd is %u. " "select() cannot handle if the socket fd is " "greater than %u (FD_SETSIZE).", socket_id, FD_SETSIZE); - return 0; + it.remove(); + continue; } #endif //_WIN32 FD_SET(socket_id, &m_init_fds); fds_index++; + slave->active= 1; } return fds_index; } my_socket get_max_fd() { return m_max_fd; } - -private: - const Slave_ilist &m_slaves; - my_socket m_max_fd; - fd_set m_init_fds; - fd_set m_fds; }; #endif //HAVE_POLL diff -Nru mariadb-10.11.6/sql/semisync_slave.cc mariadb-10.11.9/sql/semisync_slave.cc --- mariadb-10.11.6/sql/semisync_slave.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/semisync_slave.cc 2024-08-03 07:29:59.000000000 +0000 @@ -17,23 +17,13 @@ #include #include "semisync_slave.h" +#include "debug_sync.h" Repl_semi_sync_slave repl_semisync_slave; -my_bool rpl_semi_sync_slave_enabled= 0; - +my_bool global_rpl_semi_sync_slave_enabled= 0; char rpl_semi_sync_slave_delay_master; -my_bool rpl_semi_sync_slave_status= 0; ulong rpl_semi_sync_slave_trace_level; - -/* - indicate whether or not the slave should send a reply to the master. - - This is set to true in repl_semi_slave_read_event if the current - event read is the last event of a transaction. And the value is - checked in repl_semi_slave_queue_event. -*/ -bool semi_sync_need_reply= false; unsigned int rpl_semi_sync_slave_kill_conn_timeout; unsigned long long rpl_semi_sync_slave_send_ack = 0; @@ -44,14 +34,25 @@ m_init_done = true; /* References to the parameter works after set_options(). */ - set_slave_enabled(rpl_semi_sync_slave_enabled); set_trace_level(rpl_semi_sync_slave_trace_level); set_delay_master(rpl_semi_sync_slave_delay_master); set_kill_conn_timeout(rpl_semi_sync_slave_kill_conn_timeout); - return result; } +static bool local_semi_sync_enabled; + +int rpl_semi_sync_enabled(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *status_var, + enum_var_type scope) +{ + local_semi_sync_enabled= repl_semisync_slave.get_slave_enabled(); + var->type= SHOW_BOOL; + var->value= (char*) &local_semi_sync_enabled; + return 0; +} + + int Repl_semi_sync_slave::slave_read_sync_header(const uchar *header, unsigned long total_len, int *semi_flags, @@ -61,12 +62,12 @@ int read_res = 0; DBUG_ENTER("Repl_semi_sync_slave::slave_read_sync_header"); - if (rpl_semi_sync_slave_status) + if (get_slave_enabled()) { if (!DBUG_IF("semislave_corrupt_log") && header[0] == k_packet_magic_num) { - semi_sync_need_reply = (header[1] & k_packet_flag_sync); + bool semi_sync_need_reply = (header[1] & k_packet_flag_sync); *payload_len = total_len - 2; *payload = header + 2; @@ -85,7 +86,9 @@ "len: %lu", total_len); read_res = -1; } - } else { + } + else + { *payload= header; *payload_len= total_len; } @@ -93,9 +96,23 @@ DBUG_RETURN(read_res); } -int Repl_semi_sync_slave::slave_start(Master_info *mi) +/* + Set default semisync variables and print some replication info to the log + + Note that the main setup is done in request_transmit() +*/ + +void Repl_semi_sync_slave::slave_start(Master_info *mi) { - bool semi_sync= get_slave_enabled(); + + /* + Set semi_sync_enabled at slave start. This is not changed until next + slave start or reconnect. + */ + bool semi_sync= global_rpl_semi_sync_slave_enabled; + + set_slave_enabled(semi_sync); + mi->semi_sync_reply_enabled= 0; sql_print_information("Slave I/O thread: Start %s replication to\ master '%s@%s:%d' in log '%s' at position %lu", @@ -104,30 +121,43 @@ const_cast(mi->master_log_name), (unsigned long)(mi->master_log_pos)); - if (semi_sync && !rpl_semi_sync_slave_status) - rpl_semi_sync_slave_status= 1; - /*clear the counter*/ rpl_semi_sync_slave_send_ack= 0; - return 0; } -int Repl_semi_sync_slave::slave_stop(Master_info *mi) +void Repl_semi_sync_slave::slave_stop(Master_info *mi) { if (get_slave_enabled()) + { +#ifdef ENABLED_DEBUG_SYNC + /* + TODO: Remove after MDEV-28141 + */ + DBUG_EXECUTE_IF("delay_semisync_kill_connection_for_mdev_28141", { + const char act[]= "now " + "signal at_semisync_kill_connection " + "wait_for continue_semisync_kill_connection"; + DBUG_ASSERT(debug_sync_service); + DBUG_ASSERT(!debug_sync_set_action(mi->io_thd, STRING_WITH_LEN(act))); + };); +#endif kill_connection(mi->mysql); + } - if (rpl_semi_sync_slave_status) - rpl_semi_sync_slave_status= 0; - - return 0; + set_slave_enabled(0); } -int Repl_semi_sync_slave::reset_slave(Master_info *mi) +void Repl_semi_sync_slave::slave_reconnect(Master_info *mi) { - return 0; + /* + Start semi-sync either if it globally enabled or if was enabled + before the reconnect. + */ + if (global_rpl_semi_sync_slave_enabled || get_slave_enabled()) + slave_start(mi); } + void Repl_semi_sync_slave::kill_connection(MYSQL *mysql) { if (!mysql) @@ -151,8 +181,6 @@ goto failed_graceful_kill; } - DBUG_EXECUTE_IF("slave_delay_killing_semisync_connection", my_sleep(400000);); - kill_buffer_length= my_snprintf(kill_buffer, 30, "KILL %lu", mysql->thread_id); if (mysql_real_query(kill_mysql, kill_buffer, (ulong)kill_buffer_length)) @@ -194,33 +222,43 @@ !(res= mysql_store_result(mysql))) { sql_print_error("Execution failed on master: %s, error :%s", query, mysql_error(mysql)); + set_slave_enabled(0); return 1; } row= mysql_fetch_row(res); - if (DBUG_IF("master_not_support_semisync") || !row) + if (DBUG_IF("master_not_support_semisync") || (!row || ! row[1])) { /* Master does not support semi-sync */ - sql_print_warning("Master server does not support semi-sync, " - "fallback to asynchronous replication"); - rpl_semi_sync_slave_status= 0; + if (!row) + sql_print_warning("Master server does not support semi-sync, " + "fallback to asynchronous replication"); + set_slave_enabled(0); mysql_free_result(res); return 0; } + if (strcmp(row[1], "ON")) + sql_print_information("Slave has semi-sync enabled but master server does " + "not. Semi-sync will be activated when master " + "enables it"); mysql_free_result(res); /* Tell master dump thread that we want to do semi-sync - replication + replication. This is done by setting a thread local variable in + the master connection. */ query= "SET @rpl_semi_sync_slave= 1"; if (mysql_real_query(mysql, query, (ulong)strlen(query))) { - sql_print_error("Set 'rpl_semi_sync_slave=1' on master failed"); + sql_print_error("%s on master failed", query); + set_slave_enabled(0); return 1; } + mi->semi_sync_reply_enabled= 1; + /* Inform net_server that pkt_nr can come out of order */ + mi->mysql->net.pkt_nr_can_be_reset= 1; mysql_free_result(mysql_store_result(mysql)); - rpl_semi_sync_slave_status= 1; return 0; } @@ -230,46 +268,40 @@ MYSQL* mysql= mi->mysql; const char *binlog_filename= const_cast(mi->master_log_name); my_off_t binlog_filepos= mi->master_log_pos; - NET *net= &mysql->net; uchar reply_buffer[REPLY_MAGIC_NUM_LEN + REPLY_BINLOG_POS_LEN + REPLY_BINLOG_NAME_LEN]; int reply_res = 0; size_t name_len = strlen(binlog_filename); - DBUG_ENTER("Repl_semi_sync_slave::slave_reply"); + DBUG_ASSERT(get_slave_enabled() && mi->semi_sync_reply_enabled); + + /* Prepare the buffer of the reply. */ + reply_buffer[REPLY_MAGIC_NUM_OFFSET] = k_packet_magic_num; + int8store(reply_buffer + REPLY_BINLOG_POS_OFFSET, binlog_filepos); + memcpy(reply_buffer + REPLY_BINLOG_NAME_OFFSET, + binlog_filename, + name_len + 1 /* including trailing '\0' */); + + DBUG_PRINT("semisync", ("%s: reply (%s, %lu)", + "Repl_semi_sync_slave::slave_reply", + binlog_filename, (ulong)binlog_filepos)); - if (rpl_semi_sync_slave_status && semi_sync_need_reply) + /* + We have to do a net_clear() as with semi-sync the slave_reply's are + interleaved with data from the master and then the net->pkt_nr + cannot be kept in sync. Better to start pkt_nr from 0 again. + */ + net_clear(net, 0); + /* Send the reply. */ + reply_res = my_net_write(net, reply_buffer, + name_len + REPLY_BINLOG_NAME_OFFSET); + if (!reply_res) { - /* Prepare the buffer of the reply. */ - reply_buffer[REPLY_MAGIC_NUM_OFFSET] = k_packet_magic_num; - int8store(reply_buffer + REPLY_BINLOG_POS_OFFSET, binlog_filepos); - memcpy(reply_buffer + REPLY_BINLOG_NAME_OFFSET, - binlog_filename, - name_len + 1 /* including trailing '\0' */); - - DBUG_PRINT("semisync", ("%s: reply (%s, %lu)", - "Repl_semi_sync_slave::slave_reply", - binlog_filename, (ulong)binlog_filepos)); - - net_clear(net, 0); - /* Send the reply. */ - reply_res = my_net_write(net, reply_buffer, - name_len + REPLY_BINLOG_NAME_OFFSET); + reply_res= DBUG_IF("semislave_failed_net_flush") || net_flush(net); if (!reply_res) - { - reply_res = (DBUG_IF("semislave_failed_net_flush") || net_flush(net)); - if (reply_res) - sql_print_error("Semi-sync slave net_flush() reply failed"); rpl_semi_sync_slave_send_ack++; - } - else - { - sql_print_error("Semi-sync slave send reply failed: %s (%d)", - net->last_error, net->last_errno); - } } - DBUG_RETURN(reply_res); } diff -Nru mariadb-10.11.6/sql/semisync_slave.h mariadb-10.11.9/sql/semisync_slave.h --- mariadb-10.11.6/sql/semisync_slave.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/semisync_slave.h 2024-08-03 07:29:59.000000000 +0000 @@ -33,7 +33,7 @@ class Repl_semi_sync_slave :public Repl_semi_sync_base { public: - Repl_semi_sync_slave() :m_slave_enabled(false) {} + Repl_semi_sync_slave() :m_slave_enabled(false) {} ~Repl_semi_sync_slave() = default; void set_trace_level(unsigned long trace_level) { @@ -45,7 +45,7 @@ */ int init_object(); - bool get_slave_enabled() { + inline bool get_slave_enabled() { return m_slave_enabled; } @@ -53,7 +53,7 @@ m_slave_enabled = enabled; } - bool is_delay_master(){ + inline bool is_delay_master(){ return m_delay_master; } @@ -88,24 +88,23 @@ * binlog position. */ int slave_reply(Master_info* mi); - int slave_start(Master_info *mi); - int slave_stop(Master_info *mi); - int request_transmit(Master_info*); + void slave_start(Master_info *mi); + void slave_stop(Master_info *mi); + void slave_reconnect(Master_info *mi); + int request_transmit(Master_info *mi); void kill_connection(MYSQL *mysql); - int reset_slave(Master_info *mi); private: /* True when init_object has been called */ bool m_init_done; - bool m_slave_enabled; /* semi-sycn is enabled on the slave */ + bool m_slave_enabled; /* semi-sync is enabled on the slave */ bool m_delay_master; unsigned int m_kill_conn_timeout; }; /* System and status variables for the slave component */ -extern my_bool rpl_semi_sync_slave_enabled; -extern my_bool rpl_semi_sync_slave_status; +extern my_bool global_rpl_semi_sync_slave_enabled; extern ulong rpl_semi_sync_slave_trace_level; extern Repl_semi_sync_slave repl_semisync_slave; @@ -113,4 +112,7 @@ extern unsigned int rpl_semi_sync_slave_kill_conn_timeout; extern unsigned long long rpl_semi_sync_slave_send_ack; +extern int rpl_semi_sync_enabled(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *status_var, + enum_var_type scope); #endif /* SEMISYNC_SLAVE_H */ diff -Nru mariadb-10.11.6/sql/service_wsrep.cc mariadb-10.11.9/sql/service_wsrep.cc --- mariadb-10.11.6/sql/service_wsrep.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/service_wsrep.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1,4 +1,4 @@ -/* Copyright 2018-2023 Codership Oy +/* Copyright 2018-2024 Codership Oy 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 @@ -201,11 +201,11 @@ /* Note: do not store/reset globals before wsrep_bf_abort() call to avoid losing BF thd context. */ - mysql_mutex_lock(&victim_thd->LOCK_thd_data); if (!(bf_thd && bf_thd != victim_thd)) { DEBUG_SYNC(victim_thd, "wsrep_before_SR_rollback"); } + mysql_mutex_lock(&victim_thd->LOCK_thd_data); if (bf_thd) { wsrep_bf_abort(bf_thd, victim_thd); @@ -249,26 +249,47 @@ extern "C" my_bool wsrep_thd_order_before(const THD *left, const THD *right) { - if (wsrep_thd_is_BF(left, false) && - wsrep_thd_is_BF(right, false) && - wsrep_thd_trx_seqno(left) < wsrep_thd_trx_seqno(right)) { - WSREP_DEBUG("BF conflict, order: %lld %lld\n", - (long long)wsrep_thd_trx_seqno(left), - (long long)wsrep_thd_trx_seqno(right)); - return TRUE; - } - WSREP_DEBUG("waiting for BF, trx order: %lld %lld\n", - (long long)wsrep_thd_trx_seqno(left), - (long long)wsrep_thd_trx_seqno(right)); - return FALSE; -} + my_bool before= (wsrep_thd_is_BF(left, false) && + wsrep_thd_is_BF(right, false) && + wsrep_thd_trx_seqno(left) < wsrep_thd_trx_seqno(right)); + + WSREP_DEBUG("wsrep_thd_order_before: %s thread=%llu seqno=%llu query=%s " + "%s %s thread=%llu, seqno=%llu query=%s", + (wsrep_thd_is_BF(left, false) ? "BF" : "def"), + thd_get_thread_id(left), + wsrep_thd_trx_seqno(left), + wsrep_thd_query(left), + (before ? " TRUE " : " FALSE "), + (wsrep_thd_is_BF(right, false) ? "BF" : "def"), + thd_get_thread_id(right), + wsrep_thd_trx_seqno(right), + wsrep_thd_query(right)); + + return before; +} + +/** Check if wsrep transaction is aborting state. + +Calling function should make sure that wsrep transaction state +can't change during this function. + +This function is called from +wsrep_abort_thd where we hold THD::LOCK_thd_data +wsrep_handle_mdl_conflict we hold THD::LOCK_thd_data +wsrep_assert_no_bf_bf_wait we hold lock_sys.latch +innobase_kill_query we hold THD::LOCK_thd_data (THD::awake_no_mutex) + +@param thd thread handle + +@return true if wsrep transaction is aborting +@return false if not +*/ extern "C" my_bool wsrep_thd_is_aborting(const MYSQL_THD thd) { - mysql_mutex_assert_owner(&thd->LOCK_thd_data); - const wsrep::client_state& cs(thd->wsrep_cs()); const enum wsrep::transaction::state tx_state(cs.transaction().state()); + switch (tx_state) { case wsrep::transaction::s_must_abort: @@ -277,7 +298,7 @@ case wsrep::transaction::s_aborting: return true; default: - return false; + break; } return false; @@ -395,17 +416,9 @@ } } -extern "C" int wsrep_thd_append_table_key(MYSQL_THD thd, - const char* db, - const char* table, - enum Wsrep_service_key_type key_type) +extern "C" uint32 wsrep_get_domain_id() { - wsrep_key_arr_t key_arr = {0, 0}; - int ret = wsrep_prepare_keys_for_isolation(thd, db, table, NULL, &key_arr); - ret = ret || wsrep_thd_append_key(thd, key_arr.keys, - (int)key_arr.keys_len, key_type); - wsrep_keys_free(&key_arr); - return ret; + return wsrep_gtid_domain_id; } extern "C" my_bool wsrep_thd_is_local_transaction(const THD *thd) @@ -413,4 +426,3 @@ return (wsrep_thd_is_local(thd) && thd->wsrep_cs().transaction().active()); } - diff -Nru mariadb-10.11.6/sql/session_tracker.h mariadb-10.11.9/sql/session_tracker.h --- mariadb-10.11.6/sql/session_tracker.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/session_tracker.h 2024-08-03 07:29:59.000000000 +0000 @@ -210,9 +210,9 @@ public: void init(THD *thd); void deinit(THD *thd); - bool enable(THD *thd); - bool update(THD *thd, set_var *var); - bool store(THD *thd, String *buf); + bool enable(THD *thd) override; + bool update(THD *thd, set_var *var) override; + bool store(THD *thd, String *buf) override; void mark_as_changed(THD *thd, const sys_var *var); void deinit() { orig_list.deinit(); } /* callback */ @@ -237,8 +237,8 @@ class Current_schema_tracker: public State_tracker { public: - bool update(THD *thd, set_var *var); - bool store(THD *thd, String *buf); + bool update(THD *thd, set_var *var) override; + bool store(THD *thd, String *buf) override; }; @@ -259,8 +259,8 @@ class Session_state_change_tracker: public State_tracker { public: - bool update(THD *thd, set_var *var); - bool store(THD *thd, String *buf); + bool update(THD *thd, set_var *var) override; + bool store(THD *thd, String *buf) override; }; @@ -329,7 +329,7 @@ enum_tx_state calc_trx_state(THD *thd, thr_lock_type l, bool has_trx); public: - bool enable(THD *thd) + bool enable(THD *thd) override { m_enabled= false; tx_changed= TX_CHG_NONE; @@ -340,8 +340,8 @@ return State_tracker::enable(thd); } - bool update(THD *thd, set_var *var); - bool store(THD *thd, String *buf); + bool update(THD *thd, set_var *var) override; + bool store(THD *thd, String *buf) override; /** Change transaction characteristics */ void set_read_flags(THD *thd, enum enum_tx_read_flags flags); diff -Nru mariadb-10.11.6/sql/set_var.h mariadb-10.11.9/sql/set_var.h --- mariadb-10.11.6/sql/set_var.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/set_var.h 2024-08-03 07:29:59.000000000 +0000 @@ -326,11 +326,11 @@ set_var(THD *thd, enum_var_type type_arg, sys_var *var_arg, const LEX_CSTRING *base_name_arg, Item *value_arg); - virtual bool is_system() { return 1; } - int check(THD *thd); - int update(THD *thd); - int light_check(THD *thd); - virtual bool is_var_optimizer_trace() const + bool is_system() override { return 1; } + int check(THD *thd) override; + int update(THD *thd) override; + int light_check(THD *thd) override; + bool is_var_optimizer_trace() const override { extern sys_var *Sys_optimizer_trace_ptr; return var == Sys_optimizer_trace_ptr; @@ -346,9 +346,9 @@ set_var_user(Item_func_set_user_var *item) :user_var_item(item) {} - int check(THD *thd); - int update(THD *thd); - int light_check(THD *thd); + int check(THD *thd) override; + int update(THD *thd) override; + int light_check(THD *thd) override; }; /* For SET PASSWORD */ @@ -359,8 +359,8 @@ public: set_var_password(LEX_USER *user_arg) :user(user_arg) {} - int check(THD *thd); - int update(THD *thd); + int check(THD *thd) override; + int update(THD *thd) override; }; /* For SET ROLE */ @@ -371,8 +371,8 @@ privilege_t access; public: set_var_role(LEX_CSTRING role_arg) : role(role_arg), access(NO_ACL) {} - int check(THD *thd); - int update(THD *thd); + int check(THD *thd) override; + int update(THD *thd) override; }; /* For SET DEFAULT ROLE */ @@ -385,8 +385,8 @@ public: set_var_default_role(LEX_USER *user_arg, LEX_CSTRING role_arg) : user(user_arg), role(role_arg) {} - int check(THD *thd); - int update(THD *thd); + int check(THD *thd) override; + int update(THD *thd) override; }; /* For SET NAMES and SET CHARACTER SET */ @@ -404,8 +404,8 @@ character_set_results(result_coll_arg), collation_connection(connection_coll_arg) {} - int check(THD *thd); - int update(THD *thd); + int check(THD *thd) override; + int update(THD *thd) override; }; diff -Nru mariadb-10.11.6/sql/share/errmsg-utf8.txt mariadb-10.11.9/sql/share/errmsg-utf8.txt --- mariadb-10.11.6/sql/share/errmsg-utf8.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/share/errmsg-utf8.txt 2024-08-03 07:29:59.000000000 +0000 @@ -4440,23 +4440,23 @@ swe "Fick fel %M vid CHECKPOINT" ukr "Отримано помилку %M під Ñ‡Ð°Ñ CHECKPOINT" ER_NEW_ABORTING_CONNECTION 08S01 - chi "终止的连接 %lld 到数æ®åº“: '%-.192s' 用户: '%-.48s' 主机: '%-.64s' (%-.64s)" - cze "Spojení %lld do databáze: '%-.192s' uživatel: '%-.48s' stroj: '%-.64s' (%-.64s) bylo pÅ™eruÅ¡eno" - dan "Afbrød forbindelsen %lld til databasen '%-.192s' bruger: '%-.48s' vært: '%-.64s' (%-.64s)" - eng "Aborted connection %lld to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)" - est "Ãœhendus katkestatud %lld andmebaas: '%-.192s' kasutaja: '%-.48s' masin: '%-.64s' (%-.64s)" - fre "Connection %lld avortée vers la bd: '%-.192s' utilisateur: '%-.48s' hôte: '%-.64s' (%-.64s)" - ger "Abbruch der Verbindung %lld zur Datenbank '%-.192s'. Benutzer: '%-.48s', Host: '%-.64s' (%-.64s)" - geo "შეწყდრკáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜ %lld ბáƒáƒ–áƒáƒ›áƒ“ე: '%-.192s' მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი: '%-.48s' ჰáƒáƒ¡áƒ¢áƒ˜: '%-.64s' (%-.64s)" - ita "Interrotta la connessione %lld al db: ''%-.192s' utente: '%-.48s' host: '%-.64s' (%-.64s)" - jpn "接続 %lld ãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸã€‚データベース: '%-.192s' ユーザー: '%-.48s' ホスト: '%-.64s' (%-.64s)" - nla "Afgebroken verbinding %lld naar db: '%-.192s' gebruiker: '%-.48s' host: '%-.64s' (%-.64s)" - por "Conexão %lld abortada para banco de dados '%-.192s' - usuário '%-.48s' - 'host' '%-.64s' ('%-.64s')" - rus "Прервано Ñоединение %lld к базе данных '%-.192s' Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ '%-.48s' Ñ Ñ…Ð¾Ñта '%-.64s' (%-.64s)" - serbian "Prekinuta konekcija broj %lld ka bazi: '%-.192s' korisnik je bio: '%-.48s' a host: '%-.64s' (%-.64s)" - spa "Abortada conexión %lld a la base de datos: '%-.192s' usuario: '%-.48s' equipo: '%-.64s' (%-.64s)" - swe "Avbröt länken för trÃ¥d %lld till db '%-.192s', användare '%-.48s', host '%-.64s' (%-.64s)" - ukr "Перервано з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %lld до бази данних: '%-.192s' кориÑтувач: '%-.48s' хоÑÑ‚: '%-.64s' (%-.64s)" + chi "终止的连接 %lld 到数æ®åº“: '%-.192s' 用户: '%-.48s' 主机: '%-.64s'%-.64s (%-.64s)" + cze "Spojení %lld do databáze: '%-.192s' uživatel: '%-.48s' stroj: '%-.64s'%-.64s (%-.64s) bylo pÅ™eruÅ¡eno" + dan "Afbrød forbindelsen %lld til databasen '%-.192s' bruger: '%-.48s' vært: '%-.64s'%-.64s (%-.64s)" + eng "Aborted connection %lld to db: '%-.192s' user: '%-.48s' host: '%-.64s'%-.64s (%-.64s)" + est "Ãœhendus katkestatud %lld andmebaas: '%-.192s' kasutaja: '%-.48s' masin: '%-.64s'%-.64s (%-.64s)" + fre "Connection %lld avortée vers la bd: '%-.192s' utilisateur: '%-.48s' hôte: '%-.64s'%-.64s (%-.64s)" + ger "Abbruch der Verbindung %lld zur Datenbank '%-.192s'. Benutzer: '%-.48s', Host: '%-.64s'%-.64s (%-.64s)" + geo "შეწყდრკáƒáƒ•áƒ¨áƒ˜áƒ áƒ˜ %lld ბáƒáƒ–áƒáƒ›áƒ“ე: '%-.192s' მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი: '%-.48s' ჰáƒáƒ¡áƒ¢áƒ˜: '%-.64s'%-.64s (%-.64s)" + ita "Interrotta la connessione %lld al db: ''%-.192s' utente: '%-.48s' host: '%-.64s'%-.64s (%-.64s)" + jpn "接続 %lld ãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸã€‚データベース: '%-.192s' ユーザー: '%-.48s' ホスト: '%-.64s'%-.64s (%-.64s)" + nla "Afgebroken verbinding %lld naar db: '%-.192s' gebruiker: '%-.48s' host: '%-.64s'%-.64s (%-.64s)" + por "Conexão %lld abortada para banco de dados '%-.192s' - usuário '%-.48s' - 'host' '%-.64s'%-.64s ('%-.64s')" + rus "Прервано Ñоединение %lld к базе данных '%-.192s' Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ '%-.48s' Ñ Ñ…Ð¾Ñта '%-.64s'%-.64s (%-.64s)" + serbian "Prekinuta konekcija broj %lld ka bazi: '%-.192s' korisnik je bio: '%-.48s' a host: '%-.64s'%-.64s (%-.64s)" + spa "Abortada conexión %lld a la base de datos: '%-.192s' usuario: '%-.48s' equipo: '%-.64s'%-.64s (%-.64s)" + swe "Avbröt länken för trÃ¥d %lld till db '%-.192s', användare '%-.48s', host '%-.64s'%-.64s (%-.64s)" + ukr "Перервано з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %lld до бази данних: '%-.192s' кориÑтувач: '%-.48s' хоÑÑ‚: '%-.64s'%-.64s (%-.64s)" ER_UNUSED_10 eng "You should never see it" geo "ეს ვერáƒáƒ¡áƒ“რáƒáƒ¡ უნდრდáƒáƒ˜áƒœáƒáƒ®áƒáƒ—" @@ -10626,9 +10626,9 @@ eng "Unknown backup stage: '%s'. Stage should be one of START, FLUSH, BLOCK_DDL, BLOCK_COMMIT or END" spa "Fase de respaldo desconocida: '%s'. La fase debería de ser una de START, FLUSH, BLOCK_DDL, BLOCK_COMMIT o END" ER_USER_IS_BLOCKED - chi "由于凭è¯é”™è¯¯å¤ªå¤šï¼Œç”¨æˆ·è¢«é˜»æ­¢;用'FLUSH PRIVILEGES'解é”" - eng "User is blocked because of too many credential errors; unblock with 'FLUSH PRIVILEGES'" - spa "El usuario está bloqueado a causa de demasiados errores de credenciales; desbloquee mediante 'FLUSH PRIVILEGES'" + chi "由于凭è¯é”™è¯¯å¤ªå¤šï¼Œç”¨æˆ·è¢«é˜»æ­¢;用'ALTER USER / FLUSH PRIVILEGES'解é”" + eng "User is blocked because of too many credential errors; unblock with 'ALTER USER / FLUSH PRIVILEGES'" + spa "El usuario está bloqueado a causa de demasiados errores de credenciales; desbloquee mediante 'ALTER USER / FLUSH PRIVILEGES'" ER_ACCOUNT_HAS_BEEN_LOCKED chi "访问拒ç»ï¼Œæ­¤å¸æˆ·å·²é”定" eng "Access denied, this account is locked" @@ -10673,7 +10673,7 @@ eng "Unknown data type: '%-.64s'" spa "Tipo de datos desconocido: '%-.64s'" ER_UNKNOWN_OPERATOR - eng "Operator does not exists: '%-.128s'" + eng "Operator does not exist: '%-.128s'" spa "El operador no existe: '%-.128s'" ER_UNUSED_29 eng "You should never see it" diff -Nru mariadb-10.11.6/sql/signal_handler.cc mariadb-10.11.9/sql/signal_handler.cc --- mariadb-10.11.6/sql/signal_handler.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/signal_handler.cc 2024-08-03 07:29:59.000000000 +0000 @@ -149,6 +149,7 @@ goto end; } segfaulted = 1; + abort_loop= 1; // Disable now connections DBUG_PRINT("error", ("handling fatal signal")); curr_time= my_time(0); diff -Nru mariadb-10.11.6/sql/slave.cc mariadb-10.11.9/sql/slave.cc --- mariadb-10.11.6/sql/slave.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/slave.cc 2024-08-03 07:29:59.000000000 +0000 @@ -46,7 +46,7 @@ #include #include #include - +#include "debug_sync.h" // debug_sync_set_action #include "sql_base.h" // close_thread_tables #include "tztime.h" // struct Time_zone #include "log_event.h" // Rotate_log_event, @@ -63,7 +63,6 @@ #ifdef HAVE_REPLICATION #include "rpl_tblmap.h" -#include "debug_sync.h" #include "rpl_parallel.h" #include "sql_show.h" #include "semisync_slave.h" @@ -859,7 +858,7 @@ } -#define DEFAULT_SLAVE_RETRY_ERRORS 9 +static constexpr uint DEFAULT_SLAVE_RETRY_ERRORS= 10; bool init_slave_transaction_retry_errors(const char* arg) { @@ -901,9 +900,10 @@ slave_transaction_retry_errors[3]= ER_NET_WRITE_INTERRUPTED; slave_transaction_retry_errors[4]= ER_LOCK_WAIT_TIMEOUT; slave_transaction_retry_errors[5]= ER_LOCK_DEADLOCK; - slave_transaction_retry_errors[6]= ER_CONNECT_TO_FOREIGN_DATA_SOURCE; - slave_transaction_retry_errors[7]= 2013; /* CR_SERVER_LOST */ - slave_transaction_retry_errors[8]= 12701; /* ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM */ + slave_transaction_retry_errors[6]= ER_CHECKREAD; + slave_transaction_retry_errors[7]= ER_CONNECT_TO_FOREIGN_DATA_SOURCE; + slave_transaction_retry_errors[8]= 2013; /* CR_SERVER_LOST */ + slave_transaction_retry_errors[9]= 12701; /* ER_SPIDER_REMOTE_SERVER_GONE_AWAY_NUM */ /* Add user codes after this */ for (p= arg, i= DEFAULT_SLAVE_RETRY_ERRORS; *p; ) @@ -1341,6 +1341,8 @@ DBUG_ENTER("io_slave_killed"); DBUG_ASSERT(mi->slave_running); // tracking buffer overrun + if (mi->abort_slave || mi->io_thd->killed) + DBUG_PRINT("info", ("killed")); DBUG_RETURN(mi->abort_slave || mi->io_thd->killed); } @@ -2299,6 +2301,9 @@ if (unlikely(mysql_real_query(mysql, STRING_WITH_LEN("SET skip_replication=1")))) { + if (check_io_slave_killed(mi, NULL)) + goto slave_killed_err; + err_code= mysql_errno(mysql); if (is_network_error(err_code)) { @@ -2343,6 +2348,9 @@ STRINGIFY_ARG(MARIA_SLAVE_CAPABILITY_MINE))); if (unlikely(rc)) { + if (check_io_slave_killed(mi, NULL)) + goto slave_killed_err; + err_code= mysql_errno(mysql); if (is_network_error(err_code)) { @@ -2392,6 +2400,9 @@ !(master_res= mysql_store_result(mysql)) || !(master_row= mysql_fetch_row(master_res))) { + if (check_io_slave_killed(mi, NULL)) + goto slave_killed_err; + err_code= mysql_errno(mysql); if (is_network_error(err_code)) { @@ -2427,6 +2438,9 @@ rc= mysql_real_query(mysql, query_str.ptr(), query_str.length()); if (unlikely(rc)) { + if (check_io_slave_killed(mi, NULL)) + goto slave_killed_err; + err_code= mysql_errno(mysql); if (is_network_error(err_code)) { @@ -2460,6 +2474,9 @@ rc= mysql_real_query(mysql, query_str.ptr(), query_str.length()); if (unlikely(rc)) { + if (check_io_slave_killed(mi, NULL)) + goto slave_killed_err; + err_code= mysql_errno(mysql); if (is_network_error(err_code)) { @@ -2493,6 +2510,9 @@ rc= mysql_real_query(mysql, query_str.ptr(), query_str.length()); if (unlikely(rc)) { + if (check_io_slave_killed(mi, NULL)) + goto slave_killed_err; + err_code= mysql_errno(mysql); if (is_network_error(err_code)) { @@ -2529,6 +2549,9 @@ rc= mysql_real_query(mysql, query_str.ptr(), query_str.length()); if (unlikely(rc)) { + if (check_io_slave_killed(mi, NULL)) + goto slave_killed_err; + err_code= mysql_errno(mysql); if (is_network_error(err_code)) { @@ -2959,9 +2982,6 @@ Item_empty_string(thd, "Slave_SQL_Running", 3), mem_root); field_list->push_back(new (mem_root) - Item_empty_string(thd, "Replicate_Rewrite_DB", 23), - mem_root); - field_list->push_back(new (mem_root) Item_empty_string(thd, "Replicate_Do_DB", 20), mem_root); field_list->push_back(new (mem_root) @@ -3109,6 +3129,21 @@ Item_return_int(thd, "Slave_Transactional_Groups", 20, MYSQL_TYPE_LONGLONG), mem_root); + field_list->push_back(new (mem_root) + Item_empty_string(thd, "Replicate_Rewrite_DB", 23), + mem_root); + + /* + Note, we must never, _ever_, add extra rows to this output of SHOW SLAVE + STATUS, except here at the end before the extra rows of SHOW ALL SLAVES + STATUS. Otherwise, we break backwards compatibility with applications or + scripts that parse the output! + + This also means that we cannot add _any_ new rows in a GA version if a + different row was already added in a later MariaDB version, as this would + make it impossible to merge the change up while preserving the order of + rows. + */ if (full) { @@ -3200,6 +3235,14 @@ mysql_mutex_lock(&mi->err_lock); /* err_lock is to protect mi->rli.last_error() */ mysql_mutex_lock(&mi->rli.err_lock); + + DBUG_EXECUTE_IF("hold_sss_with_err_lock", { + DBUG_ASSERT(!debug_sync_set_action( + thd, STRING_WITH_LEN("now SIGNAL sss_got_err_lock " + "WAIT_FOR sss_continue"))); + DBUG_SET("-d,hold_sss_with_err_lock"); + }); + protocol->store_string_or_null(mi->host, &my_charset_bin); protocol->store_string_or_null(mi->user, &my_charset_bin); protocol->store((uint32) mi->port); @@ -3216,7 +3259,6 @@ &my_charset_bin); protocol->store(&slave_running[mi->slave_running], &my_charset_bin); protocol->store(mi->rli.slave_running ? &msg_yes : &msg_no, &my_charset_bin); - protocol->store(rpl_filter->get_rewrite_db()); protocol->store(rpl_filter->get_do_db()); protocol->store(rpl_filter->get_ignore_db()); @@ -3279,7 +3321,8 @@ while the slave is processing ignored events, such as those skipped due to slave_skip_counter. */ - if (mi->using_parallel() && idle && !mi->rli.parallel.workers_idle()) + if (mi->using_parallel() && idle && + !rpl_parallel::workers_idle(&mi->rli)) idle= false; } if (idle) @@ -3362,7 +3405,7 @@ // to ensure that we use the same value throughout this function. const char *slave_sql_running_state= mi->rli.sql_driver_thd ? mi->rli.sql_driver_thd->proc_info : ""; - if (slave_sql_running_state == Relay_log_info::state_delaying_string) + if (slave_sql_running_state == stage_sql_thd_waiting_until_delay.m_name) { time_t t= my_time(0), sql_delay_end= mi->rli.get_sql_delay_end(); protocol->store((uint32)(t < sql_delay_end ? sql_delay_end - t : 0)); @@ -3375,6 +3418,7 @@ protocol->store(mi->total_ddl_groups); protocol->store(mi->total_non_trans_groups); protocol->store(mi->total_trans_groups); + protocol->store(rpl_filter->get_rewrite_db()); if (full) { @@ -3549,6 +3593,7 @@ } thd->security_ctx->skip_grants(); + thd->security_ctx->user=(char*) slave_user; thd->slave_thread= 1; thd->connection_name= mi->connection_name; thd->variables.sql_log_slow= !MY_TEST(thd->variables.log_slow_disabled_statements & LOG_SLOW_DISABLE_SLAVE); @@ -3695,7 +3740,7 @@ } else { - if (!mi->rli.abort_slave) + if (!(mi->rli.abort_slave || io_slave_killed(mi))) { sql_print_error("Error reading packet from server: %s (server_errno=%d)", mysql_error(mysql), mysql_errno(mysql)); @@ -3932,7 +3977,7 @@ if (thd->system_thread == SYSTEM_THREAD_SLAVE_SQL && ((rli->mi->using_parallel() && rli->mi->parallel_mode <= SLAVE_PARALLEL_CONSERVATIVE) || - wsrep_ready == 0)) { + !wsrep_ready_get())) { rli->abort_slave= 1; rli->report(ERROR_LEVEL, ER_UNKNOWN_COM_ERROR, rgi->gtid_info(), "Node has dropped from cluster"); @@ -4399,6 +4444,13 @@ rli->last_inuse_relaylog->dequeued_count))) && event_can_update_last_master_timestamp(ev)) { + /* + This is the first event from the master after the slave was up to date + and has been waiting for new events. + We update last_master_timestamp before executing the event to not + have Seconds_after_master == 0 while executing the event. + last_master_timestamp will be updated again when the event is commited. + */ if (rli->last_master_timestamp < ev->when) { rli->last_master_timestamp= ev->when; @@ -4435,7 +4487,7 @@ Seconds_Behind_Master is zero. */ if (ev->get_type_code() != FORMAT_DESCRIPTION_EVENT && - rli->last_master_timestamp < ev->when) + rli->last_master_timestamp < ev->when + (time_t) ev->exec_time) rli->last_master_timestamp= ev->when + (time_t) ev->exec_time; DBUG_ASSERT(rli->last_master_timestamp >= 0); @@ -4446,6 +4498,15 @@ { Gtid_log_event *gev= static_cast(ev); +#ifdef ENABLED_DEBUG_SYNC + DBUG_EXECUTE_IF( + "pause_sql_thread_on_relay_fde_after_trans", + { + DBUG_SET("-d,pause_sql_thread_on_relay_fde_after_trans"); + DBUG_SET("+d,pause_sql_thread_on_next_relay_fde"); + }); +#endif + /* For GTID, allocate a new sub_id for the given domain_id. The sub_id must be allocated in increasing order of binlog order. @@ -4598,12 +4659,14 @@ #endif /* WITH_WSREP */ #ifdef ENABLED_DEBUG_SYNC DBUG_EXECUTE_IF( - "pause_sql_thread_on_fde", - if (ev && typ == FORMAT_DESCRIPTION_EVENT) { + "pause_sql_thread_on_next_relay_fde", + if (ev && typ == FORMAT_DESCRIPTION_EVENT && + ((Format_description_log_event *) ev)->is_relay_log_event()) { DBUG_ASSERT(!debug_sync_set_action( thd, STRING_WITH_LEN( "now SIGNAL paused_on_fde WAIT_FOR sql_thread_continue"))); + DBUG_SET("-d,pause_sql_thread_on_next_relay_fde"); }); #endif @@ -4720,6 +4783,7 @@ sql_print_information("%s", messages[SLAVE_RECON_MSG_KILLED_AFTER]); return 1; } + repl_semisync_slave.slave_reconnect(mi); return 0; } @@ -4808,14 +4872,7 @@ } thd->variables.wsrep_on= 0; - if (DBUG_IF("failed_slave_start") - || repl_semisync_slave.slave_start(mi)) - { - mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL, - ER_THD(thd, ER_SLAVE_FATAL_ERROR), - "Failed to run 'thread_start' hook"); - goto err; - } + repl_semisync_slave.slave_start(mi); if (!(mi->mysql = mysql = mysql_init(NULL))) { @@ -4909,6 +4966,7 @@ if (try_to_reconnect(thd, mysql, mi, &retry_count, suppress_warnings, reconnect_messages[SLAVE_RECON_ACT_REG])) goto err; + goto connected; } @@ -4932,7 +4990,13 @@ goto err; goto connected; } - DBUG_EXECUTE_IF("fail_com_register_slave", goto err;); + DBUG_EXECUTE_IF("fail_com_register_slave", + { + mi->report(ERROR_LEVEL, ER_SLAVE_MASTER_COM_FAILURE, NULL, + ER(ER_SLAVE_MASTER_COM_FAILURE), "COM_REGISTER_SLAVE", + "Debug Induced Error"); + goto err; + }); } DBUG_PRINT("info",("Starting reading binary log from master")); @@ -4966,6 +5030,15 @@ we're in fact receiving nothing. */ THD_STAGE_INFO(thd, stage_waiting_for_master_to_send_event); + +#ifdef ENABLED_DEBUG_SYNC + DBUG_EXECUTE_IF("pause_before_io_read_event", + { + DBUG_ASSERT(!debug_sync_set_action( thd, STRING_WITH_LEN( + "now signal io_thread_at_read_event wait_for io_thread_continue_read_event"))); + DBUG_SET("-d,pause_before_io_read_event"); + };); +#endif event_len= read_event(mysql, mi, &suppress_warnings, &network_read_len); if (check_io_slave_killed(mi, NullS)) goto err; @@ -5065,17 +5138,36 @@ goto err; } - if (rpl_semi_sync_slave_status && (mi->semi_ack & SEMI_SYNC_NEED_ACK)) - { - /* - We deliberately ignore the error in slave_reply, such error should - not cause the slave IO thread to stop, and the error messages are - already reported. - */ - DBUG_EXECUTE_IF("simulate_delay_semisync_slave_reply", my_sleep(800000);); - (void)repl_semisync_slave.slave_reply(mi); + if (repl_semisync_slave.get_slave_enabled() && + mi->semi_sync_reply_enabled && + (mi->semi_ack & SEMI_SYNC_NEED_ACK)) + { + DBUG_EXECUTE_IF("simulate_delay_semisync_slave_reply", + my_sleep(800000);); + if (repl_semisync_slave.slave_reply(mi)) + { + /* + Master is not responding (gone away?) or it has turned semi sync + off. Turning off semi-sync responses as there is no point in sending + data to the master if the master not receiving the messages. + This also stops the logs from getting filled with + "Semi-sync slave net_flush() reply failed" messages. + On reconnect semi sync will be turned on again, if the + master has semi-sync enabled. + + We check mi->abort_slave to see if the io thread was + killed and in this case we do not need an error message as + we know what is going on. + */ + if (!mi->abort_slave) + sql_print_error("Master server does not read semi-sync messages " + "last_error: %s (%d). " + "Fallback to asynchronous replication", + mi->mysql->net.last_error, + mi->mysql->net.last_errno); + mi->semi_sync_reply_enabled= 0; + } } - if (mi->using_gtid == Master_info::USE_GTID_NO && /* If rpl_semi_sync_slave_delay_master is enabled, we will flush @@ -5513,19 +5605,25 @@ } else rli->gtid_skip_flag = GTID_SKIP_NOT; + mysql_mutex_lock(&rli->data_lock); if (init_relay_log_pos(rli, rli->group_relay_log_name, rli->group_relay_log_pos, - 1 /*need data lock*/, &errmsg, + 0 /*need data lock*/, &errmsg, 1 /*look for a description_event*/)) { rli->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR, NULL, "Error initializing relay log position: %s", errmsg); + mysql_mutex_unlock(&rli->data_lock); goto err_before_start; } rli->reset_inuse_relaylog(); if (rli->alloc_inuse_relaylog(rli->group_relay_log_name)) + { + mysql_mutex_unlock(&rli->data_lock); goto err_before_start; + } + mysql_mutex_unlock(&rli->data_lock); strcpy(rli->future_event_master_log_name, rli->group_master_log_name); THD_CHECK_SENTRY(thd); @@ -6948,7 +7046,7 @@ */ mi->do_accept_own_server_id= (s_id == global_system_variables.server_id && - rpl_semi_sync_slave_enabled && opt_gtid_strict_mode && + repl_semisync_slave.get_slave_enabled() && opt_gtid_strict_mode && mi->using_gtid != Master_info::USE_GTID_NO && !mysql_bin_log.check_strict_gtid_sequence(event_gtid.domain_id, event_gtid.server_id, @@ -7530,9 +7628,6 @@ default_client_charset_info->cs_name.str); } - /* This one is not strictly needed but we have it here for completeness */ - mysql_options(mysql, MYSQL_SET_CHARSET_DIR, (char *) charsets_dir); - /* Set MYSQL_PLUGIN_DIR in case master asks for an external authentication plugin */ if (opt_plugin_dir_ptr && *opt_plugin_dir_ptr) mysql_options(mysql, MYSQL_PLUGIN_DIR, opt_plugin_dir_ptr); @@ -7553,7 +7648,7 @@ mi->port, 0, client_flag) == 0)) { /* Don't repeat last error */ - if ((int)mysql_errno(mysql) != last_errno) + if ((int)mysql_errno(mysql) != last_errno && !io_slave_killed(mi)) { last_errno=mysql_errno(mysql); suppress_warnings= 0; @@ -7676,8 +7771,6 @@ mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset_info->cs_name.str); - /* This one is not strictly needed but we have it here for completeness */ - mysql_options(mysql, MYSQL_SET_CHARSET_DIR, (char *) charsets_dir); if (mi->user == NULL || mi->user[0] == 0 diff -Nru mariadb-10.11.6/sql/socketpair.c mariadb-10.11.9/sql/socketpair.c --- mariadb-10.11.6/sql/socketpair.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/socketpair.c 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,156 @@ +/* socketpair.c +Copyright 2007, 2010 by Nathan C. Myers +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + The name of the author must not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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. + */ + +/* Changes: + * 2023-12-25 Addopted for MariaDB usage + * 2014-02-12: merge David Woodhouse, Ger Hobbelt improvements + * git.infradead.org/users/dwmw2/openconnect.git/commitdiff/bdeefa54 + * github.com/GerHobbelt/selectable-socketpair + * always init the socks[] to -1/INVALID_SOCKET on error, both on Win32/64 + * and UNIX/other platforms + * 2013-07-18: Change to BSD 3-clause license + * 2010-03-31: + * set addr to 127.0.0.1 because win32 getsockname does not always set it. + * 2010-02-25: + * set SO_REUSEADDR option to avoid leaking some windows resource. + * Windows System Error 10049, "Event ID 4226 TCP/IP has reached + * the security limit imposed on the number of concurrent TCP connect + * attempts." Bleah. + * 2007-04-25: + * preserve value of WSAGetLastError() on all error returns. + * 2007-04-22: (Thanks to Matthew Gregan ) + * s/EINVAL/WSAEINVAL/ fix trivial compile failure + * s/socket/WSASocket/ enable creation of sockets suitable as stdin/stdout + * of a child process. + * add argument make_overlapped + */ + +#include +#ifdef _WIN32 +#include /* socklen_t, et al (MSVC20xx) */ +#include +#include +#include "socketpair.h" + +#define safe_errno (errno != 0) ? errno : -1 + +/** + create_socketpair() + + @param socks[2] Will be filled by 2 SOCKET entries (similar to pipe()) + socks[0] for reading + socks[1] for writing + + @return: 0 ok + # System error code. -1 if unknown + */ + +int create_socketpair(SOCKET socks[2]) +{ + union + { + struct sockaddr_in inaddr; + struct sockaddr addr; + } a; + SOCKET listener= -1; + int reuse = 1; + int last_error; + socklen_t addrlen = sizeof(a.inaddr); + + socks[0]= socks[1]= -1; + + if ((listener= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) + return safe_errno; + + memset(&a, 0, sizeof(a)); + a.inaddr.sin_family = AF_INET; + a.inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + a.inaddr.sin_port = 0; + + for (;;) /* Avoid using goto */ + { + if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, + (char*) &reuse, (socklen_t) sizeof(reuse)) == -1) + break; + if (bind(listener, &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR) + break; + + memset(&a, 0, sizeof(a)); + if (getsockname(listener, &a.addr, &addrlen) == SOCKET_ERROR) + break; + // win32 getsockname may only set the port number, p=0.0005. + // ( http://msdn.microsoft.com/library/ms738543.aspx ): + a.inaddr.sin_addr.s_addr= htonl(INADDR_LOOPBACK); + a.inaddr.sin_family= AF_INET; + + if (listen(listener, 1) == SOCKET_ERROR) + break; + + socks[1]= socket(AF_INET, SOCK_STREAM, 0); + if (socks[1] == -1) + break; + if (connect(socks[1], &a.addr, sizeof(a.inaddr)) == SOCKET_ERROR) + break; + + socks[0]= accept(listener, NULL, NULL); + if (socks[0] == -1) + break; + + closesocket(listener); + + { + /* Make both sockets non blocking */ + ulong arg= 1; + ioctlsocket(socks[0], FIONBIO,(void*) &arg); + ioctlsocket(socks[1], FIONBIO,(void*) &arg); + } + return 0; + } + /* Error handling */ + last_error= WSAGetLastError(); + if (listener != -1) + closesocket(listener); + close_socketpair(socks); + WSASetLastError(last_error); + + return last_error; +} + +/* + Free socketpair +*/ + +void close_socketpair(SOCKET socks[2]) +{ + if (socks[0] != -1) + closesocket(socks[0]); + if (socks[1] != -1) + closesocket(socks[1]); + socks[0]= socks[1]= -1; +} + +#endif /*_WIN32 */ diff -Nru mariadb-10.11.6/sql/socketpair.h mariadb-10.11.9/sql/socketpair.h --- mariadb-10.11.6/sql/socketpair.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/socketpair.h 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,21 @@ +/* Copyright (c) 2023, MariaDB Plc + + 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; version 2 of the License. + + 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, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ + +#ifdef _WIN32 +C_MODE_START + int create_socketpair(SOCKET socks[2]); + void close_socketpair(SOCKET socks[2]); +C_MODE_END +#endif /* _WIN32 */ diff -Nru mariadb-10.11.6/sql/sp.cc mariadb-10.11.9/sql/sp.cc --- mariadb-10.11.6/sql/sp.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sp.cc 2024-08-03 07:29:59.000000000 +0000 @@ -255,7 +255,7 @@ load_from_db(THD *thd, const Database_qualified_name *name, TABLE *proc_tbl); public: - virtual Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) + Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) override { return new (mem_root) Stored_routine_creation_ctx(m_client_cs, m_connection_cl, @@ -263,7 +263,7 @@ } protected: - virtual Object_creation_ctx *create_backup_ctx(THD *thd) const + Object_creation_ctx *create_backup_ctx(THD *thd) const override { DBUG_ENTER("Stored_routine_creation_ctx::create_backup_ctx"); DBUG_RETURN(new Stored_routine_creation_ctx(thd)); @@ -431,7 +431,7 @@ Proc_table_intact() : m_print_once(TRUE) { has_keys= TRUE; } protected: - void report_error(uint code, const char *fmt, ...); + void report_error(uint code, const char *fmt, ...) override; }; @@ -805,12 +805,12 @@ struct Silence_deprecated_warning : public Internal_error_handler { public: - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; }; bool @@ -900,12 +900,12 @@ :m_error_caught(false) {} - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, const char* message, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; bool error_caught() const { return m_error_caught; } @@ -1714,7 +1714,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { if (sql_errno == ER_NO_SUCH_TABLE || sql_errno == ER_NO_SUCH_TABLE_IN_ENGINE || @@ -1944,7 +1944,7 @@ DBUG_EXECUTE_IF("cache_sp_in_show_create", /* Some tests need just need a way to cache SP without other side-effects.*/ - sp_cache_routine(thd, name, false, &sp); + sp_cache_routine(thd, name, &sp); sp->show_create_routine(thd, this); DBUG_RETURN(false); ); @@ -2368,7 +2368,7 @@ int ret; Parser_state *oldps= thd->m_parser_state; thd->m_parser_state= NULL; - ret= sp_cache_routine(thd, name, false, sp); + ret= sp_cache_routine(thd, name, sp); thd->m_parser_state= oldps; return ret; } @@ -2731,7 +2731,13 @@ for (uint i=0 ; i < src->records ; i++) { Sroutine_hash_entry *rt= (Sroutine_hash_entry *)my_hash_element(src, i); - (void)sp_add_used_routine(prelocking_ctx, thd->stmt_arena, + DBUG_ASSERT(thd->active_stmt_arena_to_use()-> + is_stmt_prepare_or_first_stmt_execute() || + thd->active_stmt_arena_to_use()-> + is_conventional() || + thd->active_stmt_arena_to_use()->state == + Query_arena::STMT_SP_QUERY_ARGUMENTS); + (void)sp_add_used_routine(prelocking_ctx, thd->active_stmt_arena_to_use(), &rt->mdl_request.key, rt->m_handler, belong_to_view); } @@ -2757,7 +2763,7 @@ TABLE_LIST *belong_to_view) { for (Sroutine_hash_entry *rt= src->first; rt; rt= rt->next) - (void)sp_add_used_routine(prelocking_ctx, thd->stmt_arena, + (void)sp_add_used_routine(prelocking_ctx, thd->active_stmt_arena_to_use(), &rt->mdl_request.key, rt->m_handler, belong_to_view); } @@ -2769,7 +2775,6 @@ */ int Sroutine_hash_entry::sp_cache_routine(THD *thd, - bool lookup_only, sp_head **sp) const { char qname_buff[NAME_LEN*2+1+1]; @@ -2782,7 +2787,7 @@ */ DBUG_ASSERT(mdl_request.ticket || this == thd->lex->sroutines_list.first); - return m_handler->sp_cache_routine(thd, &name, lookup_only, sp); + return m_handler->sp_cache_routine(thd, &name, sp); } @@ -2794,9 +2799,6 @@ @param[in] thd Thread context. @param[in] name Name of routine. - @param[in] lookup_only Only check that the routine is in the cache. - If it's not, don't try to load. If it is present, - but old, don't try to reload. @param[out] sp Pointer to sp_head object for routine, NULL if routine was not found. @@ -2807,7 +2809,6 @@ int Sp_handler::sp_cache_routine(THD *thd, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const { int ret= 0; @@ -2819,9 +2820,6 @@ *sp= sp_cache_lookup(spc, name); - if (lookup_only) - DBUG_RETURN(SP_OK); - if (*sp) { sp_cache_flush_obsolete(spc, sp); @@ -2873,7 +2871,6 @@ * name->m_db is a database name, e.g. "dbname" * name->m_name is a package-qualified name, e.g. "pkgname.spname" - @param lookup_only - don't load mysql.proc if not cached @param [OUT] sp - the result is returned here. @retval false - loaded or does not exists @retval true - error while loading mysql.proc @@ -2883,14 +2880,13 @@ Sp_handler::sp_cache_package_routine(THD *thd, const LEX_CSTRING &pkgname_cstr, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const + sp_head **sp) const { DBUG_ENTER("sp_cache_package_routine"); DBUG_ASSERT(type() == SP_TYPE_FUNCTION || type() == SP_TYPE_PROCEDURE); sp_name pkgname(&name->m_db, &pkgname_cstr, false); sp_head *ph= NULL; int ret= sp_handler_package_body.sp_cache_routine(thd, &pkgname, - lookup_only, &ph); if (!ret) { @@ -2925,12 +2921,12 @@ int Sp_handler::sp_cache_package_routine(THD *thd, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const + sp_head **sp) const { DBUG_ENTER("Sp_handler::sp_cache_package_routine"); Prefix_name_buf pkgname(thd, name->m_name); DBUG_ASSERT(pkgname.length); - DBUG_RETURN(sp_cache_package_routine(thd, pkgname, name, lookup_only, sp)); + DBUG_RETURN(sp_cache_package_routine(thd, pkgname, name, sp)); } diff -Nru mariadb-10.11.6/sql/sp.h mariadb-10.11.9/sql/sp.h --- mariadb-10.11.6/sql/sp.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sp.h 2024-08-03 07:29:59.000000000 +0000 @@ -102,10 +102,10 @@ int sp_cache_package_routine(THD *thd, const LEX_CSTRING &pkgname_cstr, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const; + sp_head **sp) const; int sp_cache_package_routine(THD *thd, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const; + sp_head **sp) const; sp_head *sp_find_package_routine(THD *thd, const LEX_CSTRING pkgname_str, const Database_qualified_name *name, @@ -202,7 +202,7 @@ const Database_qualified_name *name, bool cache_only) const; virtual int sp_cache_routine(THD *thd, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const; + sp_head **sp) const; int sp_cache_routine_reentrant(THD *thd, const Database_qualified_name *nm, @@ -249,33 +249,33 @@ class Sp_handler_procedure: public Sp_handler { public: - enum_sp_type type() const { return SP_TYPE_PROCEDURE; } - LEX_CSTRING type_lex_cstring() const + enum_sp_type type() const override { return SP_TYPE_PROCEDURE; } + LEX_CSTRING type_lex_cstring() const override { static LEX_CSTRING m_type_str= { STRING_WITH_LEN("PROCEDURE")}; return m_type_str; } - LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const; - const char *show_create_routine_col1_caption() const + LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const override; + const char *show_create_routine_col1_caption() const override { return "Procedure"; } - const char *show_create_routine_col3_caption() const + const char *show_create_routine_col3_caption() const override { return "Create Procedure"; } - MDL_key::enum_mdl_namespace get_mdl_type() const + MDL_key::enum_mdl_namespace get_mdl_type() const override { return MDL_key::PROCEDURE; } - const Sp_handler *package_routine_handler() const; - sp_cache **get_cache(THD *) const; + const Sp_handler *package_routine_handler() const override; + sp_cache **get_cache(THD *) const override; #ifndef NO_EMBEDDED_ACCESS_CHECKS - HASH *get_priv_hash() const; + HASH *get_priv_hash() const override; #endif - ulong recursion_depth(THD *thd) const; - void recursion_level_error(THD *thd, const sp_head *sp) const; - bool add_instr_preturn(THD *thd, sp_head *sp, sp_pcontext *spcont) const; + ulong recursion_depth(THD *thd) const override; + void recursion_level_error(THD *thd, const sp_head *sp) const override; + bool add_instr_preturn(THD *thd, sp_head *sp, sp_pcontext *spcont) const override; }; @@ -283,13 +283,13 @@ { public: int sp_cache_routine(THD *thd, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const + sp_head **sp) const override { - return sp_cache_package_routine(thd, name, lookup_only, sp); + return sp_cache_package_routine(thd, name, sp); } sp_head *sp_find_routine(THD *thd, const Database_qualified_name *name, - bool cache_only) const + bool cache_only) const override { return sp_find_package_routine(thd, name, cache_only); } @@ -299,32 +299,32 @@ class Sp_handler_function: public Sp_handler { public: - enum_sp_type type() const { return SP_TYPE_FUNCTION; } - LEX_CSTRING type_lex_cstring() const + enum_sp_type type() const override { return SP_TYPE_FUNCTION; } + LEX_CSTRING type_lex_cstring() const override { static LEX_CSTRING m_type_str= { STRING_WITH_LEN("FUNCTION")}; return m_type_str; } - LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const; - const char *show_create_routine_col1_caption() const + LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const override; + const char *show_create_routine_col1_caption() const override { return "Function"; } - const char *show_create_routine_col3_caption() const + const char *show_create_routine_col3_caption() const override { return "Create Function"; } - MDL_key::enum_mdl_namespace get_mdl_type() const + MDL_key::enum_mdl_namespace get_mdl_type() const override { return MDL_key::FUNCTION; } - const Sp_handler *package_routine_handler() const; - sp_cache **get_cache(THD *) const; + const Sp_handler *package_routine_handler() const override; + sp_cache **get_cache(THD *) const override; #ifndef NO_EMBEDDED_ACCESS_CHECKS - HASH *get_priv_hash() const; + HASH *get_priv_hash() const override; #endif bool add_instr_freturn(THD *thd, sp_head *sp, sp_pcontext *spcont, - Item *item, LEX *lex) const; + Item *item, LEX *lex) const override; }; @@ -332,13 +332,13 @@ { public: int sp_cache_routine(THD *thd, const Database_qualified_name *name, - bool lookup_only, sp_head **sp) const + sp_head **sp) const override { - return sp_cache_package_routine(thd, name, lookup_only, sp); + return sp_cache_package_routine(thd, name, sp); } sp_head *sp_find_routine(THD *thd, const Database_qualified_name *name, - bool cache_only) const + bool cache_only) const override { return sp_find_package_routine(thd, name, cache_only); } @@ -357,7 +357,7 @@ const st_sp_chistics &chistics, const AUTHID &definer, const DDL_options_st ddl_options, - sql_mode_t sql_mode) const; + sql_mode_t sql_mode) const override; }; @@ -366,34 +366,34 @@ public: // TODO: make it private or protected int sp_find_and_drop_routine(THD *thd, TABLE *table, const Database_qualified_name *name) - const; + const override; public: - enum_sp_type type() const { return SP_TYPE_PACKAGE; } - LEX_CSTRING type_lex_cstring() const + enum_sp_type type() const override { return SP_TYPE_PACKAGE; } + LEX_CSTRING type_lex_cstring() const override { static LEX_CSTRING m_type_str= {STRING_WITH_LEN("PACKAGE")}; return m_type_str; } - LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const + LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const override { static LEX_CSTRING m_empty_body= {STRING_WITH_LEN("BEGIN END")}; return m_empty_body; } - const char *show_create_routine_col1_caption() const + const char *show_create_routine_col1_caption() const override { return "Package"; } - const char *show_create_routine_col3_caption() const + const char *show_create_routine_col3_caption() const override { return "Create Package"; } - MDL_key::enum_mdl_namespace get_mdl_type() const + MDL_key::enum_mdl_namespace get_mdl_type() const override { return MDL_key::PACKAGE_BODY; } - sp_cache **get_cache(THD *) const; + sp_cache **get_cache(THD *) const override; #ifndef NO_EMBEDDED_ACCESS_CHECKS - HASH *get_priv_hash() const; + HASH *get_priv_hash() const override; #endif }; @@ -401,32 +401,32 @@ class Sp_handler_package_body: public Sp_handler_package { public: - enum_sp_type type() const { return SP_TYPE_PACKAGE_BODY; } - LEX_CSTRING type_lex_cstring() const + enum_sp_type type() const override { return SP_TYPE_PACKAGE_BODY; } + LEX_CSTRING type_lex_cstring() const override { static LEX_CSTRING m_type_str= {STRING_WITH_LEN("PACKAGE BODY")}; return m_type_str; } - LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const + LEX_CSTRING empty_body_lex_cstring(sql_mode_t mode) const override { static LEX_CSTRING m_empty_body= {STRING_WITH_LEN("BEGIN END")}; return m_empty_body; } - const char *show_create_routine_col1_caption() const + const char *show_create_routine_col1_caption() const override { return "Package body"; } - const char *show_create_routine_col3_caption() const + const char *show_create_routine_col3_caption() const override { return "Create Package Body"; } - MDL_key::enum_mdl_namespace get_mdl_type() const + MDL_key::enum_mdl_namespace get_mdl_type() const override { return MDL_key::PACKAGE_BODY; } - sp_cache **get_cache(THD *) const; + sp_cache **get_cache(THD *) const override; #ifndef NO_EMBEDDED_ACCESS_CHECKS - HASH *get_priv_hash() const; + HASH *get_priv_hash() const override; #endif }; @@ -434,18 +434,18 @@ class Sp_handler_trigger: public Sp_handler { public: - enum_sp_type type() const { return SP_TYPE_TRIGGER; } - LEX_CSTRING type_lex_cstring() const + enum_sp_type type() const override { return SP_TYPE_TRIGGER; } + LEX_CSTRING type_lex_cstring() const override { static LEX_CSTRING m_type_str= { STRING_WITH_LEN("TRIGGER")}; return m_type_str; } - MDL_key::enum_mdl_namespace get_mdl_type() const + MDL_key::enum_mdl_namespace get_mdl_type() const override { DBUG_ASSERT(0); return MDL_key::TRIGGER; } - const Sp_handler *sp_handler_mysql_proc() const { return NULL; } + const Sp_handler *sp_handler_mysql_proc() const override { return NULL; } }; @@ -632,7 +632,7 @@ const Sp_handler *m_handler; - int sp_cache_routine(THD *thd, bool lookup_only, sp_head **sp) const; + int sp_cache_routine(THD *thd, sp_head **sp) const; }; diff -Nru mariadb-10.11.6/sql/sp_cache.cc mariadb-10.11.9/sql/sp_cache.cc --- mariadb-10.11.6/sql/sp_cache.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sp_cache.cc 2024-08-03 07:29:59.000000000 +0000 @@ -78,6 +78,8 @@ /* All routines in this cache */ HASH m_hashtable; +public: + void clear(); }; // class sp_cache #ifdef HAVE_PSI_INTERFACE @@ -195,7 +197,7 @@ sp_cache *c= *cp; if (! c) return NULL; - return c->lookup(buf, name->make_qname(buf, sizeof(buf))); + return c->lookup(buf, name->make_qname(buf, sizeof(buf), true)); } @@ -302,7 +304,7 @@ void sp_cache::init() { - my_hash_init(key_memory_sp_cache, &m_hashtable, system_charset_info, 0, 0, 0, + my_hash_init(key_memory_sp_cache, &m_hashtable, &my_charset_bin, 0, 0, 0, hash_get_key_for_sp_head, hash_free_sp_head, 0); } @@ -313,6 +315,10 @@ my_hash_free(&m_hashtable); } +void sp_cache::clear() +{ + my_hash_reset(&m_hashtable); +} void Sp_caches::sp_caches_clear() { @@ -321,3 +327,15 @@ sp_cache_clear(&sp_package_spec_cache); sp_cache_clear(&sp_package_body_cache); } + +void Sp_caches::sp_caches_empty() +{ + if (sp_proc_cache) + sp_proc_cache->clear(); + if (sp_func_cache) + sp_func_cache->clear(); + if (sp_package_spec_cache) + sp_package_spec_cache->clear(); + if (sp_package_body_cache) + sp_package_body_cache->clear(); +} diff -Nru mariadb-10.11.6/sql/sp_head.cc mariadb-10.11.9/sql/sp_head.cc --- mariadb-10.11.6/sql/sp_head.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sp_head.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1575,7 +1575,7 @@ { // Don't count a call ended with an error as normal run executed_counter= 0; - main_mem_root.read_only= 0; + main_mem_root.flags &= ~ROOT_FLAG_READ_ONLY; reset_instrs_executed_counter(); } #endif @@ -1696,10 +1696,10 @@ #ifdef PROTECT_STATEMENT_MEMROOT if (!err_status) { - if (!main_mem_root.read_only && + if (!(main_mem_root.flags & ROOT_FLAG_READ_ONLY) && has_all_instrs_executed()) { - main_mem_root.read_only= 1; + main_mem_root.flags |= ROOT_FLAG_READ_ONLY; } ++executed_counter; DBUG_PRINT("info", ("execute counter: %lu", executed_counter)); @@ -3862,6 +3862,9 @@ thd->update_stats(); thd->lex->sql_command= save_sql_command; *nextp= m_ip+1; +#ifdef PROTECT_STATEMENT_MEMROOT + mark_as_qc_used(); +#endif } thd->set_query(query_backup); thd->query_name_consts= 0; diff -Nru mariadb-10.11.6/sql/sp_head.h mariadb-10.11.9/sql/sp_head.h --- mariadb-10.11.6/sql/sp_head.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sp_head.h 2024-08-03 07:29:59.000000000 +0000 @@ -87,7 +87,7 @@ { } protected: - virtual void change_env(THD *thd) const + void change_env(THD *thd) const override { thd->variables.collation_database= m_db_cl; @@ -1056,9 +1056,9 @@ return m_routine_implementations.check_dup_qualified(lex->sphead) || m_routine_implementations.push_back(lex, &main_mem_root); } - sp_package *get_package() { return this; } - void init_psi_share(); - bool is_invoked() const + sp_package *get_package() override { return this; } + void init_psi_share() override; + bool is_invoked() const override { /* Cannot flush a package out of the SP cache when: @@ -1093,7 +1093,7 @@ Query_arena(thd->lex->sphead->get_main_mem_root(), STMT_INITIALIZED_FOR_SP) { } ~sp_lex_cursor() { free_items(); } - virtual bool cleanup_stmt(bool /*restore_set_statement_vars*/) override + bool cleanup_stmt(bool /*restore_set_statement_vars*/) override { return false; } Query_arena *query_arena() override { return this; } bool validate() @@ -1138,7 +1138,7 @@ sp_instr(uint ip, sp_pcontext *ctx) :Query_arena(0, STMT_INITIALIZED_FOR_SP), marked(0), m_ip(ip), m_ctx(ctx) #ifdef PROTECT_STATEMENT_MEMROOT - , m_has_been_run(false) + , m_has_been_run(NON_RUN) #endif {} @@ -1233,21 +1233,29 @@ #ifdef PROTECT_STATEMENT_MEMROOT bool has_been_run() const { - return m_has_been_run; + return m_has_been_run == RUN; + } + + void mark_as_qc_used() + { + m_has_been_run= QC; } void mark_as_run() { - m_has_been_run= true; + if (m_has_been_run == QC) + m_has_been_run= NON_RUN; // answer was from WC => not really executed + else + m_has_been_run= RUN; } void mark_as_not_run() { - m_has_been_run= false; + m_has_been_run= NON_RUN; } private: - bool m_has_been_run; + enum {NON_RUN, QC, RUN} m_has_been_run; #endif }; // class sp_instr : public Sql_alloc @@ -1363,18 +1371,18 @@ virtual ~sp_instr_stmt() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; private: sp_lex_keeper m_lex_keeper; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_stmt : public sp_instr @@ -1398,11 +1406,11 @@ virtual ~sp_instr_set() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; protected: sp_rcontext *get_rcontext(THD *thd) const; @@ -1412,7 +1420,7 @@ sp_lex_keeper m_lex_keeper; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_set : public sp_instr @@ -1441,9 +1449,9 @@ virtual ~sp_instr_set_row_field() = default; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; }; // class sp_instr_set_field : public sp_instr_set @@ -1483,9 +1491,9 @@ virtual ~sp_instr_set_row_field_by_name() = default; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; }; // class sp_instr_set_field_by_name : public sp_instr_set @@ -1509,11 +1517,11 @@ virtual ~sp_instr_set_trigger_field() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; private: Item_trigger_field *trigger_field; @@ -1521,7 +1529,7 @@ sp_lex_keeper m_lex_keeper; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_trigger_field : public sp_instr @@ -1555,7 +1563,7 @@ virtual void set_destination(uint old_dest, uint new_dest) = 0; - virtual uint get_cont_dest() const; + uint get_cont_dest() const override; protected: @@ -1581,17 +1589,17 @@ virtual ~sp_instr_jump() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; - virtual uint opt_mark(sp_head *sp, List *leads); + uint opt_mark(sp_head *sp, List *leads) override; - virtual uint opt_shortcut_jump(sp_head *sp, sp_instr *start); + uint opt_shortcut_jump(sp_head *sp, sp_instr *start) override; - virtual void opt_move(uint dst, List *ibp); + void opt_move(uint dst, List *ibp) override; - virtual void backpatch(uint dest, sp_pcontext *dst_ctx) + void backpatch(uint dest, sp_pcontext *dst_ctx) override { /* Calling backpatch twice is a logic flaw in jump resolution. */ DBUG_ASSERT(m_dest == 0); @@ -1601,14 +1609,14 @@ /** Update the destination; used by the optimizer. */ - virtual void set_destination(uint old_dest, uint new_dest) + void set_destination(uint old_dest, uint new_dest) override { if (m_dest == old_dest) m_dest= new_dest; } public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_jump : public sp_instr_opt_meta @@ -1632,23 +1640,23 @@ virtual ~sp_instr_jump_if_not() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; - virtual uint opt_mark(sp_head *sp, List *leads); + uint opt_mark(sp_head *sp, List *leads) override; /** Override sp_instr_jump's shortcut; we stop here */ - virtual uint opt_shortcut_jump(sp_head *sp, sp_instr *start) + uint opt_shortcut_jump(sp_head *sp, sp_instr *start) override { return m_ip; } - virtual void opt_move(uint dst, List *ibp); + void opt_move(uint dst, List *ibp) override; - virtual void set_destination(uint old_dest, uint new_dest) + void set_destination(uint old_dest, uint new_dest) override { sp_instr_jump::set_destination(old_dest, new_dest); if (m_cont_dest == old_dest) @@ -1661,7 +1669,7 @@ sp_lex_keeper m_lex_keeper; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_jump_if_not : public sp_instr_jump @@ -1679,18 +1687,18 @@ virtual ~sp_instr_preturn() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; - virtual uint opt_mark(sp_head *sp, List *leads) + uint opt_mark(sp_head *sp, List *leads) override { marked= 1; return UINT_MAX; } public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_preturn : public sp_instr @@ -1710,13 +1718,13 @@ virtual ~sp_instr_freturn() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; - virtual uint opt_mark(sp_head *sp, List *leads) + uint opt_mark(sp_head *sp, List *leads) override { marked= 1; return UINT_MAX; @@ -1729,7 +1737,7 @@ sp_lex_keeper m_lex_keeper; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_freturn : public sp_instr @@ -1758,19 +1766,19 @@ m_handler= NULL; } - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; - virtual uint opt_mark(sp_head *sp, List *leads); + uint opt_mark(sp_head *sp, List *leads) override; /** Override sp_instr_jump's shortcut; we stop here. */ - virtual uint opt_shortcut_jump(sp_head *sp, sp_instr *start) + uint opt_shortcut_jump(sp_head *sp, sp_instr *start) override { return m_ip; } - virtual void backpatch(uint dest, sp_pcontext *dst_ctx) + void backpatch(uint dest, sp_pcontext *dst_ctx) override { DBUG_ASSERT(!m_dest || !m_opt_hpop); if (!m_dest) @@ -1797,7 +1805,7 @@ uint m_frame; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_hpush_jump : public sp_instr_jump @@ -1820,16 +1828,16 @@ m_count= count; } - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; private: uint m_count; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_hpop : public sp_instr @@ -1848,24 +1856,24 @@ virtual ~sp_instr_hreturn() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; /* This instruction will not be short cut optimized. */ - virtual uint opt_shortcut_jump(sp_head *sp, sp_instr *start) + uint opt_shortcut_jump(sp_head *sp, sp_instr *start) override { return m_ip; } - virtual uint opt_mark(sp_head *sp, List *leads); + uint opt_mark(sp_head *sp, List *leads) override; private: uint m_frame; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_hreturn : public sp_instr_jump @@ -1893,7 +1901,7 @@ cursor is closed. For now stored procedures always use materialized cursors and the call is not used. */ - virtual bool cleanup_stmt(bool /*restore_set_statement_vars*/) override + bool cleanup_stmt(bool /*restore_set_statement_vars*/) override { return false; } private: @@ -1924,16 +1932,16 @@ m_count= count; } - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; private: uint m_count; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_cpop : public sp_instr @@ -1951,18 +1959,18 @@ virtual ~sp_instr_copen() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; private: uint m_cursor; ///< Stack index public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_copen : public sp_instr_stmt @@ -1987,12 +1995,12 @@ m_var(voffs) {} virtual ~sp_instr_cursor_copy_struct() = default; - virtual int execute(THD *thd, uint *nextp); - virtual int exec_core(THD *thd, uint *nextp); - virtual void print(String *str); + int execute(THD *thd, uint *nextp) override; + int exec_core(THD *thd, uint *nextp) override; + void print(String *str) override; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; @@ -2010,16 +2018,16 @@ virtual ~sp_instr_cclose() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; private: uint m_cursor; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_cclose : public sp_instr @@ -2039,9 +2047,9 @@ virtual ~sp_instr_cfetch() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; void add_to_varlist(sp_variable *var) { @@ -2055,7 +2063,7 @@ bool m_error_on_no_data; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_cfetch : public sp_instr @@ -2077,12 +2085,12 @@ virtual ~sp_instr_agg_cfetch() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_agg_cfetch : public sp_instr @@ -2102,11 +2110,11 @@ virtual ~sp_instr_error() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; - virtual uint opt_mark(sp_head *sp, List *leads) + uint opt_mark(sp_head *sp, List *leads) override { marked= 1; return UINT_MAX; @@ -2117,7 +2125,7 @@ int m_errcode; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_error : public sp_instr @@ -2135,17 +2143,17 @@ virtual ~sp_instr_set_case_expr() = default; - virtual int execute(THD *thd, uint *nextp); + int execute(THD *thd, uint *nextp) override; - virtual int exec_core(THD *thd, uint *nextp); + int exec_core(THD *thd, uint *nextp) override; - virtual void print(String *str); + void print(String *str) override; - virtual uint opt_mark(sp_head *sp, List *leads); + uint opt_mark(sp_head *sp, List *leads) override; - virtual void opt_move(uint dst, List *ibp); + void opt_move(uint dst, List *ibp) override; - virtual void set_destination(uint old_dest, uint new_dest) + void set_destination(uint old_dest, uint new_dest) override { if (m_cont_dest == old_dest) m_cont_dest= new_dest; @@ -2158,7 +2166,7 @@ sp_lex_keeper m_lex_keeper; public: - virtual PSI_statement_info* get_psi_info() { return & psi_info; } + PSI_statement_info* get_psi_info() override { return & psi_info; } static PSI_statement_info psi_info; }; // class sp_instr_set_case_expr : public sp_instr_opt_meta diff -Nru mariadb-10.11.6/sql/spatial.h mariadb-10.11.9/sql/spatial.h --- mariadb-10.11.6/sql/spatial.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/spatial.h 2024-08-03 07:29:59.000000000 +0000 @@ -397,14 +397,14 @@ public: Gis_point() = default; /* Remove gcc warning */ virtual ~Gis_point() = default; /* Remove gcc warning */ - uint32 get_data_size() const; - bool init_from_wkt(Gis_read_stream *trs, String *wkb); - uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); - bool get_data_as_wkt(String *txt, const char **end) const; + uint32 get_data_size() const override; + bool init_from_wkt(Gis_read_stream *trs, String *wkb) override; + uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res) override; + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) override; + bool get_data_as_wkt(String *txt, const char **end) const override; bool get_data_as_json(String *txt, uint max_dec_digits, - const char **end) const; - bool get_mbr(MBR *mbr, const char **end) const; + const char **end) const override; + bool get_mbr(MBR *mbr, const char **end) const override; int get_xy(double *x, double *y) const { @@ -427,7 +427,7 @@ return 1; } - int get_x(double *x) const + int get_x(double *x) const override { if (no_data(m_data, SIZEOF_STORED_DOUBLE)) return 1; @@ -435,7 +435,7 @@ return 0; } - int get_y(double *y) const + int get_y(double *y) const override { const char *data= m_data; if (no_data(data, SIZEOF_STORED_DOUBLE * 2)) return 1; @@ -443,16 +443,16 @@ return 0; } - int geom_length(double *len, const char **end) const; - int area(double *ar, const char **end) const; - bool dimension(uint32 *dim, const char **end) const + int geom_length(double *len, const char **end) const override; + int area(double *ar, const char **end) const override; + bool dimension(uint32 *dim, const char **end) const override { *dim= 0; *end= 0; /* No default end */ return 0; } - int store_shapes(Gcalc_shape_transporter *trn) const; - const Class_info *get_class_info() const; + int store_shapes(Gcalc_shape_transporter *trn) const override; + const Class_info *get_class_info() const override; double calculate_haversine(const Geometry *g, const double sphere_radius, int *error); int spherical_distance_multipoints(Geometry *g, const double r, double *result, @@ -467,29 +467,29 @@ public: Gis_line_string() = default; /* Remove gcc warning */ virtual ~Gis_line_string() = default; /* Remove gcc warning */ - uint32 get_data_size() const; - bool init_from_wkt(Gis_read_stream *trs, String *wkb); - uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); - bool get_data_as_wkt(String *txt, const char **end) const; - bool get_data_as_json(String *txt, uint max_dec_digits, - const char **end) const; - bool get_mbr(MBR *mbr, const char **end) const; - int geom_length(double *len, const char **end) const; - int area(double *ar, const char **end) const; - int is_closed(int *closed) const; - int num_points(uint32 *n_points) const; - int start_point(String *point) const; - int end_point(String *point) const; - int point_n(uint32 n, String *result) const; - bool dimension(uint32 *dim, const char **end) const + uint32 get_data_size() const override; + bool init_from_wkt(Gis_read_stream *trs, String *wkb) override; + uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res) override; + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) override; + bool get_data_as_wkt(String *txt, const char **end) const override; + bool get_data_as_json(String *txt, uint max_dec_digits, + const char **end) const override; + bool get_mbr(MBR *mbr, const char **end) const override; + int geom_length(double *len, const char **end) const override; + int area(double *ar, const char **end) const override; + int is_closed(int *closed) const override; + int num_points(uint32 *n_points) const override; + int start_point(String *point) const override; + int end_point(String *point) const override; + int point_n(uint32 n, String *result) const override; + bool dimension(uint32 *dim, const char **end) const override { *dim= 1; *end= 0; /* No default end */ return 0; } - int store_shapes(Gcalc_shape_transporter *trn) const; - const Class_info *get_class_info() const; + int store_shapes(Gcalc_shape_transporter *trn) const override; + const Class_info *get_class_info() const override; }; @@ -500,29 +500,29 @@ public: Gis_polygon() = default; /* Remove gcc warning */ virtual ~Gis_polygon() = default; /* Remove gcc warning */ - uint32 get_data_size() const; - bool init_from_wkt(Gis_read_stream *trs, String *wkb); - uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); - bool get_data_as_wkt(String *txt, const char **end) const; - bool get_data_as_json(String *txt, uint max_dec_digits, - const char **end) const; - bool get_mbr(MBR *mbr, const char **end) const; - int area(double *ar, const char **end) const; - int exterior_ring(String *result) const; - int num_interior_ring(uint32 *n_int_rings) const; - int interior_ring_n(uint32 num, String *result) const; + uint32 get_data_size() const override; + bool init_from_wkt(Gis_read_stream *trs, String *wkb) override; + uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res) override; + uint init_from_opresult(String *bin, const char *opres, uint res_len) override; + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) override; + bool get_data_as_wkt(String *txt, const char **end) const override; + bool get_data_as_json(String *txt, uint max_dec_digits, + const char **end) const override; + bool get_mbr(MBR *mbr, const char **end) const override; + int area(double *ar, const char **end) const override; + int exterior_ring(String *result) const override; + int num_interior_ring(uint32 *n_int_rings) const override; + int interior_ring_n(uint32 num, String *result) const override; int centroid_xy(double *x, double *y) const; - int centroid(String *result) const; - bool dimension(uint32 *dim, const char **end) const + int centroid(String *result) const override; + bool dimension(uint32 *dim, const char **end) const override { *dim= 2; *end= 0; /* No default end */ return 0; } - int store_shapes(Gcalc_shape_transporter *trn) const; - const Class_info *get_class_info() const; + int store_shapes(Gcalc_shape_transporter *trn) const override; + const Class_info *get_class_info() const override; }; @@ -537,25 +537,25 @@ public: Gis_multi_point() = default; /* Remove gcc warning */ virtual ~Gis_multi_point() = default; /* Remove gcc warning */ - uint32 get_data_size() const; - bool init_from_wkt(Gis_read_stream *trs, String *wkb); - uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); - bool get_data_as_wkt(String *txt, const char **end) const; - bool get_data_as_json(String *txt, uint max_dec_digits, - const char **end) const; - bool get_mbr(MBR *mbr, const char **end) const; - int num_geometries(uint32 *num) const; - int geometry_n(uint32 num, String *result) const; - bool dimension(uint32 *dim, const char **end) const + uint32 get_data_size() const override; + bool init_from_wkt(Gis_read_stream *trs, String *wkb) override; + uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res) override; + uint init_from_opresult(String *bin, const char *opres, uint res_len) override; + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) override; + bool get_data_as_wkt(String *txt, const char **end) const override; + bool get_data_as_json(String *txt, uint max_dec_digits, + const char **end) const override; + bool get_mbr(MBR *mbr, const char **end) const override; + int num_geometries(uint32 *num) const override; + int geometry_n(uint32 num, String *result) const override; + bool dimension(uint32 *dim, const char **end) const override { *dim= 0; *end= 0; /* No default end */ return 0; } - int store_shapes(Gcalc_shape_transporter *trn) const; - const Class_info *get_class_info() const; + int store_shapes(Gcalc_shape_transporter *trn) const override; + const Class_info *get_class_info() const override; int spherical_distance_multipoints(Geometry *g, const double r, double *res, int *error); }; @@ -568,27 +568,27 @@ public: Gis_multi_line_string() = default; /* Remove gcc warning */ virtual ~Gis_multi_line_string() = default; /* Remove gcc warning */ - uint32 get_data_size() const; - bool init_from_wkt(Gis_read_stream *trs, String *wkb); - uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); - bool get_data_as_wkt(String *txt, const char **end) const; - bool get_data_as_json(String *txt, uint max_dec_digits, - const char **end) const; - bool get_mbr(MBR *mbr, const char **end) const; - int num_geometries(uint32 *num) const; - int geometry_n(uint32 num, String *result) const; - int geom_length(double *len, const char **end) const; - int is_closed(int *closed) const; - bool dimension(uint32 *dim, const char **end) const + uint32 get_data_size() const override; + bool init_from_wkt(Gis_read_stream *trs, String *wkb) override; + uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res) override; + uint init_from_opresult(String *bin, const char *opres, uint res_len) override; + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) override; + bool get_data_as_wkt(String *txt, const char **end) const override; + bool get_data_as_json(String *txt, uint max_dec_digits, + const char **end) const override; + bool get_mbr(MBR *mbr, const char **end) const override; + int num_geometries(uint32 *num) const override; + int geometry_n(uint32 num, String *result) const override; + int geom_length(double *len, const char **end) const override; + int is_closed(int *closed) const override; + bool dimension(uint32 *dim, const char **end) const override { *dim= 1; *end= 0; /* No default end */ return 0; } - int store_shapes(Gcalc_shape_transporter *trn) const; - const Class_info *get_class_info() const; + int store_shapes(Gcalc_shape_transporter *trn) const override; + const Class_info *get_class_info() const override; }; @@ -599,27 +599,27 @@ public: Gis_multi_polygon() = default; /* Remove gcc warning */ virtual ~Gis_multi_polygon() = default; /* Remove gcc warning */ - uint32 get_data_size() const; - bool init_from_wkt(Gis_read_stream *trs, String *wkb); - uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); - bool get_data_as_wkt(String *txt, const char **end) const; - bool get_data_as_json(String *txt, uint max_dec_digits, - const char **end) const; - bool get_mbr(MBR *mbr, const char **end) const; - int num_geometries(uint32 *num) const; - int geometry_n(uint32 num, String *result) const; - int area(double *ar, const char **end) const; - int centroid(String *result) const; - bool dimension(uint32 *dim, const char **end) const + uint32 get_data_size() const override; + bool init_from_wkt(Gis_read_stream *trs, String *wkb) override; + uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res) override; + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) override; + bool get_data_as_wkt(String *txt, const char **end) const override; + bool get_data_as_json(String *txt, uint max_dec_digits, + const char **end) const override; + bool get_mbr(MBR *mbr, const char **end) const override; + int num_geometries(uint32 *num) const override; + int geometry_n(uint32 num, String *result) const override; + int area(double *ar, const char **end) const override; + int centroid(String *result) const override; + bool dimension(uint32 *dim, const char **end) const override { *dim= 2; *end= 0; /* No default end */ return 0; } - int store_shapes(Gcalc_shape_transporter *trn) const; - const Class_info *get_class_info() const; - uint init_from_opresult(String *bin, const char *opres, uint res_len); + int store_shapes(Gcalc_shape_transporter *trn) const override; + const Class_info *get_class_info() const override; + uint init_from_opresult(String *bin, const char *opres, uint res_len) override; }; @@ -630,22 +630,22 @@ public: Gis_geometry_collection() = default; /* Remove gcc warning */ virtual ~Gis_geometry_collection() = default; /* Remove gcc warning */ - uint32 get_data_size() const; - bool init_from_wkt(Gis_read_stream *trs, String *wkb); - uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res); - uint init_from_opresult(String *bin, const char *opres, uint res_len); - bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb); - bool get_data_as_wkt(String *txt, const char **end) const; - bool get_data_as_json(String *txt, uint max_dec_digits, - const char **end) const; - bool get_mbr(MBR *mbr, const char **end) const; - int area(double *ar, const char **end) const; - int geom_length(double *len, const char **end) const; - int num_geometries(uint32 *num) const; - int geometry_n(uint32 num, String *result) const; - bool dimension(uint32 *dim, const char **end) const; - int store_shapes(Gcalc_shape_transporter *trn) const; - const Class_info *get_class_info() const; + uint32 get_data_size() const override; + bool init_from_wkt(Gis_read_stream *trs, String *wkb) override; + uint init_from_wkb(const char *wkb, uint len, wkbByteOrder bo, String *res) override; + uint init_from_opresult(String *bin, const char *opres, uint res_len) override; + bool init_from_json(json_engine_t *je, bool er_on_3D, String *wkb) override; + bool get_data_as_wkt(String *txt, const char **end) const override; + bool get_data_as_json(String *txt, uint max_dec_digits, + const char **end) const override; + bool get_mbr(MBR *mbr, const char **end) const override; + int area(double *ar, const char **end) const override; + int geom_length(double *len, const char **end) const override; + int num_geometries(uint32 *num) const override; + int geometry_n(uint32 num, String *result) const override; + bool dimension(uint32 *dim, const char **end) const override; + int store_shapes(Gcalc_shape_transporter *trn) const override; + const Class_info *get_class_info() const override; }; struct Geometry_buffer : public diff -Nru mariadb-10.11.6/sql/sql_acl.cc mariadb-10.11.9/sql/sql_acl.cc --- mariadb-10.11.6/sql/sql_acl.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_acl.cc 2024-08-03 07:29:59.000000000 +0000 @@ -262,6 +262,28 @@ return compare_hostname(&host, host2, ip2 ? ip2 : host2); } + + enum PASSWD_ERROR_ACTION + { + PASSWD_ERROR_CLEAR, + PASSWD_ERROR_INCREMENT + }; + + void update_password_errors(PASSWD_ERROR_ACTION action) + { + switch (action) + { + case PASSWD_ERROR_INCREMENT: + password_errors++; + break; + case PASSWD_ERROR_CLEAR: + password_errors= 0; + break; + default: + DBUG_ASSERT(0); + break; + } + } }; class ACL_ROLE :public ACL_USER_BASE @@ -953,10 +975,11 @@ { public: - LEX_CSTRING& name() const { return MYSQL_TABLE_NAME_USER; } + LEX_CSTRING& name() const override { return MYSQL_TABLE_NAME_USER; } - int get_auth(THD *thd, MEM_ROOT *root, ACL_USER *u) const + int get_auth(THD *thd, MEM_ROOT *root, ACL_USER *u) const override { + mysql_mutex_assert_owner(&acl_cache->lock); u->alloc_auth(root, 1); if (have_password()) { @@ -997,7 +1020,7 @@ return 0; } - bool set_auth(const ACL_USER &u) const + bool set_auth(const ACL_USER &u) const override { if (u.nauth != 1) return 1; @@ -1018,7 +1041,7 @@ return 0; } - privilege_t get_access() const + privilege_t get_access() const override { privilege_t access(Grant_table_base::get_access()); if ((num_fields() <= 13) && (access & CREATE_ACL)) @@ -1077,7 +1100,7 @@ return access & GLOBAL_ACLS; } - void set_access(const privilege_t rights, bool revoke) const + void set_access(const privilege_t rights, bool revoke) const override { ulonglong priv(SELECT_ACL); for (uint i= start_priv_columns; i < end_priv_columns; i++, priv <<= 1) @@ -1087,132 +1110,132 @@ } } - SSL_type get_ssl_type () const + SSL_type get_ssl_type () const override { Field *f= get_field(end_priv_columns, MYSQL_TYPE_ENUM); return (SSL_type)(f ? f->val_int()-1 : 0); } - int set_ssl_type (SSL_type x) const + int set_ssl_type (SSL_type x) const override { if (Field *f= get_field(end_priv_columns, MYSQL_TYPE_ENUM)) return f->store(x+1, 0); else return 1; } - const char* get_ssl_cipher (MEM_ROOT *root) const + const char* get_ssl_cipher (MEM_ROOT *root) const override { Field *f= get_field(end_priv_columns + 1, MYSQL_TYPE_BLOB); return f ? ::get_field(root,f) : 0; } - int set_ssl_cipher (const char *s, size_t l) const + int set_ssl_cipher (const char *s, size_t l) const override { if (Field *f= get_field(end_priv_columns + 1, MYSQL_TYPE_BLOB)) return f->store(s, l, &my_charset_latin1); else return 1; } - const char* get_x509_issuer (MEM_ROOT *root) const + const char* get_x509_issuer (MEM_ROOT *root) const override { Field *f= get_field(end_priv_columns + 2, MYSQL_TYPE_BLOB); return f ? ::get_field(root,f) : 0; } - int set_x509_issuer (const char *s, size_t l) const + int set_x509_issuer (const char *s, size_t l) const override { if (Field *f= get_field(end_priv_columns + 2, MYSQL_TYPE_BLOB)) return f->store(s, l, &my_charset_latin1); else return 1; } - const char* get_x509_subject (MEM_ROOT *root) const + const char* get_x509_subject (MEM_ROOT *root) const override { Field *f= get_field(end_priv_columns + 3, MYSQL_TYPE_BLOB); return f ? ::get_field(root,f) : 0; } - int set_x509_subject (const char *s, size_t l) const + int set_x509_subject (const char *s, size_t l) const override { if (Field *f= get_field(end_priv_columns + 3, MYSQL_TYPE_BLOB)) return f->store(s, l, &my_charset_latin1); else return 1; } - longlong get_max_questions () const + longlong get_max_questions () const override { Field *f= get_field(end_priv_columns + 4, MYSQL_TYPE_LONG); return f ? f->val_int() : 0; } - int set_max_questions (longlong x) const + int set_max_questions (longlong x) const override { if (Field *f= get_field(end_priv_columns + 4, MYSQL_TYPE_LONG)) return f->store(x, 0); else return 1; } - longlong get_max_updates () const + longlong get_max_updates () const override { Field *f= get_field(end_priv_columns + 5, MYSQL_TYPE_LONG); return f ? f->val_int() : 0; } - int set_max_updates (longlong x) const + int set_max_updates (longlong x) const override { if (Field *f= get_field(end_priv_columns + 5, MYSQL_TYPE_LONG)) return f->store(x, 0); else return 1; } - longlong get_max_connections () const + longlong get_max_connections () const override { Field *f= get_field(end_priv_columns + 6, MYSQL_TYPE_LONG); return f ? f->val_int() : 0; } - int set_max_connections (longlong x) const + int set_max_connections (longlong x) const override { if (Field *f= get_field(end_priv_columns + 6, MYSQL_TYPE_LONG)) return f->store(x, 0); else return 1; } - longlong get_max_user_connections () const + longlong get_max_user_connections () const override { Field *f= get_field(end_priv_columns + 7, MYSQL_TYPE_LONG); return f ? f->val_int() : 0; } - int set_max_user_connections (longlong x) const + int set_max_user_connections (longlong x) const override { if (Field *f= get_field(end_priv_columns + 7, MYSQL_TYPE_LONG)) return f->store(x, 0); else return 1; } - double get_max_statement_time () const + double get_max_statement_time () const override { Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_NEWDECIMAL); return f ? f->val_real() : 0; } - int set_max_statement_time (double x) const + int set_max_statement_time (double x) const override { if (Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_NEWDECIMAL)) return f->store(x); else return 1; } - bool get_is_role () const + bool get_is_role () const override { Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_ENUM); return f ? f->val_int()-1 : 0; } - int set_is_role (bool x) const + int set_is_role (bool x) const override { if (Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_ENUM)) return f->store(x+1, 0); else return 1; } - const char* get_default_role (MEM_ROOT *root) const + const char* get_default_role (MEM_ROOT *root) const override { Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_STRING); return f ? ::get_field(root,f) : 0; } - int set_default_role (const char *s, size_t l) const + int set_default_role (const char *s, size_t l) const override { if (Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_STRING)) return f->store(s, l, system_charset_info); @@ -1222,12 +1245,12 @@ /* On a MariaDB 10.3 user table, the account locking accessors will try to get the content of the max_statement_time column, but they will fail due to the typecheck in get_field. */ - bool get_account_locked () const + bool get_account_locked () const override { Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_ENUM); return f ? f->val_int()-1 : 0; } - int set_account_locked (bool x) const + int set_account_locked (bool x) const override { if (Field *f= get_field(end_priv_columns + 13, MYSQL_TYPE_ENUM)) return f->store(x+1, 0); @@ -1235,14 +1258,14 @@ return 1; } - bool get_password_expired () const + bool get_password_expired () const override { uint field_num= end_priv_columns + 10; Field *f= get_field(field_num, MYSQL_TYPE_ENUM); return f ? f->val_int()-1 : 0; } - int set_password_expired (bool x) const + int set_password_expired (bool x) const override { uint field_num= end_priv_columns + 10; @@ -1250,14 +1273,14 @@ return f->store(x+1, 0); return 1; } - my_time_t get_password_last_changed () const + my_time_t get_password_last_changed () const override { ulong unused_dec; if (Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_TIMESTAMP2)) return f->get_timestamp(&unused_dec); return 0; } - int set_password_last_changed (my_time_t x) const + int set_password_last_changed (my_time_t x) const override { if (Field *f= get_field(end_priv_columns + 11, MYSQL_TYPE_TIMESTAMP2)) { @@ -1266,7 +1289,7 @@ } return 1; } - longlong get_password_lifetime () const + longlong get_password_lifetime () const override { if (Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_SHORT)) { @@ -1276,7 +1299,7 @@ } return 0; } - int set_password_lifetime (longlong x) const + int set_password_lifetime (longlong x) const override { if (Field *f= get_field(end_priv_columns + 12, MYSQL_TYPE_SHORT)) { @@ -1291,7 +1314,7 @@ return 1; } - virtual ~User_table_tabular() = default; + ~User_table_tabular() override = default; private: friend class Grant_tables; @@ -1316,7 +1339,7 @@ return f->real_type() == type ? f : NULL; } - int setup_sysvars() const + int setup_sysvars() const override { username_char_length= MY_MIN(m_table->field[1]->char_length(), USERNAME_CHAR_LENGTH); @@ -1390,9 +1413,9 @@ */ class User_table_json: public User_table { - LEX_CSTRING& name() const { return MYSQL_TABLE_NAME[USER_TABLE]; } + LEX_CSTRING& name() const override { return MYSQL_TABLE_NAME[USER_TABLE]; } - int get_auth(THD *thd, MEM_ROOT *root, ACL_USER *u) const + int get_auth(THD *thd, MEM_ROOT *root, ACL_USER *u) const override { size_t array_len; const char *array; @@ -1471,7 +1494,7 @@ return 0; } - bool set_auth(const ACL_USER &u) const + bool set_auth(const ACL_USER &u) const override { size_t array_len; const char *array; @@ -1601,7 +1624,7 @@ return access & ALL_KNOWN_ACL; } - privilege_t get_access() const + privilege_t get_access() const override { ulonglong version_id= (ulonglong) get_int_value("version_id"); ulonglong access= (ulonglong) get_int_value("access"); @@ -1628,7 +1651,7 @@ return adjust_access(version_id, access) & GLOBAL_ACLS; } - void set_access(const privilege_t rights, bool revoke) const + void set_access(const privilege_t rights, bool revoke) const override { privilege_t access= get_access(); if (revoke) @@ -1641,77 +1664,77 @@ const char *unsafe_str(const char *s) const { return s[0] ? s : NULL; } - SSL_type get_ssl_type () const + SSL_type get_ssl_type () const override { return (SSL_type)get_int_value("ssl_type"); } - int set_ssl_type (SSL_type x) const + int set_ssl_type (SSL_type x) const override { return set_int_value("ssl_type", x); } - const char* get_ssl_cipher (MEM_ROOT *root) const + const char* get_ssl_cipher (MEM_ROOT *root) const override { return unsafe_str(get_str_value(root, "ssl_cipher")); } - int set_ssl_cipher (const char *s, size_t l) const + int set_ssl_cipher (const char *s, size_t l) const override { return set_str_value("ssl_cipher", s, l); } - const char* get_x509_issuer (MEM_ROOT *root) const + const char* get_x509_issuer (MEM_ROOT *root) const override { return unsafe_str(get_str_value(root, "x509_issuer")); } - int set_x509_issuer (const char *s, size_t l) const + int set_x509_issuer (const char *s, size_t l) const override { return set_str_value("x509_issuer", s, l); } - const char* get_x509_subject (MEM_ROOT *root) const + const char* get_x509_subject (MEM_ROOT *root) const override { return unsafe_str(get_str_value(root, "x509_subject")); } - int set_x509_subject (const char *s, size_t l) const + int set_x509_subject (const char *s, size_t l) const override { return set_str_value("x509_subject", s, l); } - longlong get_max_questions () const + longlong get_max_questions () const override { return get_int_value("max_questions"); } - int set_max_questions (longlong x) const + int set_max_questions (longlong x) const override { return set_int_value("max_questions", x); } - longlong get_max_updates () const + longlong get_max_updates () const override { return get_int_value("max_updates"); } - int set_max_updates (longlong x) const + int set_max_updates (longlong x) const override { return set_int_value("max_updates", x); } - longlong get_max_connections () const + longlong get_max_connections () const override { return get_int_value("max_connections"); } - int set_max_connections (longlong x) const + int set_max_connections (longlong x) const override { return set_int_value("max_connections", x); } - longlong get_max_user_connections () const + longlong get_max_user_connections () const override { return get_int_value("max_user_connections"); } - int set_max_user_connections (longlong x) const + int set_max_user_connections (longlong x) const override { return set_int_value("max_user_connections", x); } - double get_max_statement_time () const + double get_max_statement_time () const override { return get_double_value("max_statement_time"); } - int set_max_statement_time (double x) const + int set_max_statement_time (double x) const override { return set_double_value("max_statement_time", x); } - bool get_is_role () const + bool get_is_role () const override { return get_bool_value("is_role"); } - int set_is_role (bool x) const + int set_is_role (bool x) const override { return set_bool_value("is_role", x); } - const char* get_default_role (MEM_ROOT *root) const + const char* get_default_role (MEM_ROOT *root) const override { return get_str_value(root, "default_role"); } - int set_default_role (const char *s, size_t l) const + int set_default_role (const char *s, size_t l) const override { return set_str_value("default_role", s, l); } - bool get_account_locked () const + bool get_account_locked () const override { return get_bool_value("account_locked"); } - int set_account_locked (bool x) const + int set_account_locked (bool x) const override { return set_bool_value("account_locked", x); } - my_time_t get_password_last_changed () const + my_time_t get_password_last_changed () const override { return static_cast(get_int_value("password_last_changed")); } - int set_password_last_changed (my_time_t x) const + int set_password_last_changed (my_time_t x) const override { return set_int_value("password_last_changed", static_cast(x)); } - int set_password_lifetime (longlong x) const + int set_password_lifetime (longlong x) const override { return set_int_value("password_lifetime", x); } - longlong get_password_lifetime () const + longlong get_password_lifetime () const override { return get_int_value("password_lifetime", -1); } /* password_last_changed=0 means the password is manually expired. In MySQL 5.7+ this state is described using the password_expired column in mysql.user */ - bool get_password_expired () const + bool get_password_expired () const override { return get_int_value("password_last_changed", -1) == 0; } - int set_password_expired (bool x) const + int set_password_expired (bool x) const override { return x ? set_password_last_changed(0) : 0; } - ~User_table_json() = default; + ~User_table_json() override = default; private: friend class Grant_tables; static const uint JSON_SIZE=1024; - int setup_sysvars() const + int setup_sysvars() const override { using_global_priv_table= true; username_char_length= MY_MIN(m_table->field[1]->char_length(), @@ -2316,6 +2339,9 @@ static int set_user_salt(ACL_USER::AUTH *auth, plugin_ref plugin) { st_mysql_auth *info= (st_mysql_auth *) plugin_decl(plugin)->info; + + mysql_mutex_assert_owner(&acl_cache->lock); + if (info->interface_version >= 0x0202 && info->preprocess_hash && auth->auth_string.length) { @@ -2351,6 +2377,8 @@ plugin_ref plugin= get_auth_plugin(thd, auth->plugin, &unlock_plugin); int res= 1; + mysql_mutex_assert_owner(&acl_cache->lock); + if (!plugin) { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, @@ -2427,10 +2455,13 @@ if (auth_copy->salt.str) return 0; // already done + mysql_mutex_lock(&acl_cache->lock); if (set_user_salt(auth_copy, plugin)) + { + mysql_mutex_unlock(&acl_cache->lock); return 1; + } - mysql_mutex_lock(&acl_cache->lock); ACL_USER *user= find_user_exact(user_copy->host.hostname, user_copy->user.str); // make sure the user wasn't altered or dropped meanwhile if (user) @@ -2942,6 +2973,7 @@ } acl_cache->clear(0); + mysql_mutex_record_order(&acl_cache->lock, &LOCK_status); mysql_mutex_lock(&acl_cache->lock); old_acl_hosts= acl_hosts; @@ -3403,10 +3435,18 @@ check_role_is_granted_callback, NULL) == -1)) { - /* Role is not granted but current user can see the role */ - my_printf_error(ER_INVALID_ROLE, "User %`s@%`s has not been granted role %`s", - MYF(0), thd->security_ctx->priv_user, - thd->security_ctx->priv_host, rolename); + /* This happens for SET ROLE case and when `--skip-name-resolve` option + is used. In that situation host can be NULL and current user is always + target user, so printing `priv_user@priv_host` is not incorrect. + */ + if (!host) + my_printf_error(ER_INVALID_ROLE, "User %`s@%`s has not been granted role %`s", + MYF(0), thd->security_ctx->priv_user, + thd->security_ctx->priv_host, rolename); + else + /* Role is not granted but current user can see the role */ + my_printf_error(ER_INVALID_ROLE, "User %`s@%`s has not been granted role %`s", + MYF(0), user, host, rolename); } else { @@ -3477,6 +3517,7 @@ const Account_options &options, const privilege_t privileges) { + mysql_mutex_assert_owner(&acl_cache->lock); user= safe_lexcstrdup_root(&acl_memroot, combo.user); update_hostname(&host, safe_strdup_root(&acl_memroot, combo.host.str)); hostname_length= combo.host.length; @@ -3493,6 +3534,8 @@ const privilege_t privileges) { ACL_USER_PARAM::AUTH *work_copy= NULL; + mysql_mutex_assert_owner(&acl_cache->lock); + if (nauth) { if (!(work_copy= (ACL_USER_PARAM::AUTH*) @@ -3584,6 +3627,9 @@ break; } + // Any alter user resets password_errors; + acl_user->update_password_errors(ACL_USER::PASSWD_ERROR_CLEAR); + return 0; } @@ -5201,6 +5247,7 @@ return 0; } + mysql_mutex_assert_owner(&acl_cache->lock); /* allocate a new entry that will go in the hash */ ROLE_GRANT_PAIR *hash_entry= new (&acl_memroot) ROLE_GRANT_PAIR; if (hash_entry->init(&acl_memroot, user->str, host->str, @@ -5265,6 +5312,7 @@ DBUG_ENTER("replace_proxies_priv_table"); + mysql_mutex_assert_owner(&acl_cache->lock); if (!table) { my_error(ER_NO_SUCH_TABLE, MYF(0), MYSQL_SCHEMA_NAME.str, @@ -5436,8 +5484,8 @@ GRANT_TABLE(const char *h, const char *d,const char *u, const char *t, privilege_t p, privilege_t c); GRANT_TABLE (TABLE *form, TABLE *col_privs); - ~GRANT_TABLE(); - bool ok() { return privs != NO_ACL || cols != NO_ACL; } + ~GRANT_TABLE() override; + bool ok() override { return privs != NO_ACL || cols != NO_ACL; } void init_hash() { my_hash_init2(key_memory_acl_memex, &hash_columns, 4, system_charset_info, @@ -7302,8 +7350,8 @@ continue; // Add next user } - db_name= table_list->get_db_name(); - table_name= table_list->get_table_name(); + db_name= table_list->get_db_name().str; + table_name= table_list->get_table_name().str; /* Find/create cached table grant */ grant_table= table_hash_search(Str->host.str, NullS, db_name, @@ -7609,7 +7657,7 @@ { Security_context *sctx= thd->security_ctx; - if (!sctx->user) // replication + if (!sctx->is_user_defined()) // galera return true; ACL_USER *grantee= find_user_exact(sctx->priv_host, sctx->priv_user); @@ -8373,15 +8421,10 @@ INSERT_ACL : SELECT_ACL); } - if (tl->with || !tl->db.str || - (tl->select_lex && - (tl->with= tl->select_lex->find_table_def_in_with_clauses(tl)))) - continue; - const ACL_internal_table_access *access= get_cached_table_access(&t_ref->grant.m_internal, - t_ref->get_db_name(), - t_ref->get_table_name()); + t_ref->get_db_name().str, + t_ref->get_table_name().str); if (access) { @@ -8446,7 +8489,8 @@ mysql_rwlock_rdlock(&LOCK_grant); } - t_ref->grant.read(sctx, t_ref->get_db_name(), t_ref->get_table_name()); + t_ref->grant.read(sctx, + t_ref->get_db_name().str, t_ref->get_table_name().str); if (!t_ref->grant.grant_table_user && !t_ref->grant.grant_table_role && @@ -8491,7 +8535,7 @@ command, sctx->priv_user, sctx->host_or_ip, tl ? tl->db.str : "unknown", - tl ? tl->get_table_name() : "unknown"); + tl ? tl->get_table_name().str : "unknown"); } DBUG_RETURN(TRUE); } @@ -11753,14 +11797,14 @@ : is_grave(FALSE) {} - virtual ~Silence_routine_definer_errors() = default; + ~Silence_routine_definer_errors() override = default; - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; bool has_errors() { return is_grave; } @@ -12159,8 +12203,8 @@ This must be performed under the mutex in order to make sure the iteration does not fail. */ -static int show_column_grants(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_column_grants(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum enum_var_type scope) { var->type= SHOW_ULONG; var->value= buff; @@ -12176,8 +12220,8 @@ return 0; } -static int show_database_grants(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +static int show_database_grants(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum enum_var_type scope) { var->type= SHOW_UINT; var->value= buff; @@ -13337,8 +13381,27 @@ *end++= 0; int2store(end, thd->client_capabilities); + + CHARSET_INFO *handshake_cs= default_charset_info; + if (handshake_cs->number > 0xFF) + { + /* + A workaround for a 2-byte collation ID: translate it into + the ID of the primary collation of this character set. + */ + CHARSET_INFO *cs= get_charset_by_csname(handshake_cs->cs_name.str, + MY_CS_PRIMARY, MYF(MY_WME)); + /* + cs should not normally be NULL, however it may be possible + with a dynamic character set incorrectly defined in Index.xml. + For safety let's fallback to latin1 in case cs is NULL. + */ + handshake_cs= cs ? cs : &my_charset_latin1; + } + /* write server characteristics: up to 16 bytes allowed */ - end[2]= (char) default_charset_info->number; + end[2]= (char) handshake_cs->number; + int2store(end+3, mpvio->auth_info.thd->server_status); int2store(end+5, thd->client_capabilities >> 16); end[7]= data_len; @@ -13568,8 +13631,37 @@ DBUG_RETURN(0); } + +/** + Determine if the client is MySQL Connector/NET. + + Checks whether the given connection attributes blob corresponds to + MySQL Connector/NET by examining the "_client_name" attribute, which is + expected to be the first attribute in the blob. + + @param connection_attrs - The connection attributes blob. + @param length - The length of the blob. + + @return true if the client is MySQL Connector/NET, false otherwise. +*/ +static inline bool is_connector_net_client(const char *connection_attrs, + size_t length) +{ + constexpr LEX_CSTRING prefix= + {STRING_WITH_LEN("\x0c_client_name\x13mysql-connector-net")}; + + if (length < prefix.length) + return false; + + /* Optimization to avoid following memcmp in common cases.*/ + if (connection_attrs[prefix.length - 1] != prefix.str[prefix.length - 1]) + return false; + + return !memcmp(connection_attrs, prefix.str, prefix.length); +} + static bool -read_client_connect_attrs(char **ptr, char *end, CHARSET_INFO *from_cs) +read_client_connect_attrs(char **ptr, char *end, THD* thd) { ulonglong length; char *ptr_save= *ptr; @@ -13592,10 +13684,14 @@ if (length > 65535) return true; - if (PSI_CALL_set_thread_connect_attrs(*ptr, (uint)length, from_cs) && + if (PSI_CALL_set_thread_connect_attrs(*ptr, (uint)length, thd->charset()) && current_thd->variables.log_warnings) sql_print_warning("Connection attributes of length %llu were truncated", length); + + /* Connector/Net crashes, when "show collations" returns NULL IDs*/ + if (is_connector_net_client(*ptr, length)) + thd->variables.old_behavior |= OLD_MODE_NO_NULL_COLLATION_IDS; return false; } @@ -13729,7 +13825,7 @@ } if ((thd->client_capabilities & CLIENT_CONNECT_ATTRS) && - read_client_connect_attrs(&next_field, end, thd->charset())) + read_client_connect_attrs(&next_field, end, thd)) { my_message(ER_UNKNOWN_COM_ERROR, ER_THD(thd, ER_UNKNOWN_COM_ERROR), MYF(0)); @@ -13902,9 +13998,11 @@ Since 4.1 all database names are stored in utf8 The cast is ok as copy_with_error will create a new area for db */ + DBUG_ASSERT(db || !db_len); + // Don't pass db==nullptr to avoid UB nullptr+0 inside copy_with_error() if (unlikely(thd->copy_with_error(system_charset_info, (LEX_STRING*) &mpvio->db, - thd->charset(), db, db_len))) + thd->charset(), db ? db : "", db_len))) return packet_error; user_len= copy_and_convert(user_buff, sizeof(user_buff) - 1, @@ -13979,7 +14077,7 @@ if ((thd->client_capabilities & CLIENT_CONNECT_ATTRS) && read_client_connect_attrs(&next_field, ((char *)net->read_pos) + pkt_len, - mpvio->auth_info.thd->charset())) + mpvio->auth_info.thd)) return packet_error; /* @@ -14363,34 +14461,17 @@ return res; } -enum PASSWD_ERROR_ACTION -{ - PASSWD_ERROR_CLEAR, - PASSWD_ERROR_INCREMENT -}; /* Increment, or clear password errors for a user. */ -static void handle_password_errors(const char *user, const char *hostname, PASSWD_ERROR_ACTION action) +static void handle_password_errors(const char *user, const char *hostname, + ACL_USER::PASSWD_ERROR_ACTION action) { #ifndef NO_EMBEDDED_ACCESS_CHECKS mysql_mutex_assert_not_owner(&acl_cache->lock); mysql_mutex_lock(&acl_cache->lock); ACL_USER *u = find_user_exact(hostname, user); if (u) - { - switch(action) - { - case PASSWD_ERROR_INCREMENT: - u->password_errors++; - break; - case PASSWD_ERROR_CLEAR: - u->password_errors= 0; - break; - default: - DBUG_ASSERT(0); - break; - } - } + u->update_password_errors(action); mysql_mutex_unlock(&acl_cache->lock); #endif } @@ -14538,7 +14619,8 @@ case CR_AUTH_USER_CREDENTIALS: errors.m_authentication= 1; if (thd->password && !mpvio.make_it_fail) - handle_password_errors(acl_user->user.str, acl_user->host.hostname, PASSWD_ERROR_INCREMENT); + handle_password_errors(acl_user->user.str, acl_user->host.hostname, + ACL_USER::PASSWD_ERROR_INCREMENT); break; case CR_ERROR: default: @@ -14556,7 +14638,8 @@ if (thd->password && acl_user->password_errors) { /* Login succeeded, clear password errors.*/ - handle_password_errors(acl_user->user.str, acl_user->host.hostname, PASSWD_ERROR_CLEAR); + handle_password_errors(acl_user->user.str, acl_user->host.hostname, + ACL_USER::PASSWD_ERROR_CLEAR); } if (initialized) // if not --skip-grant-tables @@ -14575,7 +14658,8 @@ DBUG_RETURN(1); } - if (acl_user->account_locked) { + if (acl_user->account_locked) + { status_var_increment(denied_connections); my_error(ER_ACCOUNT_HAS_BEEN_LOCKED, MYF(0)); DBUG_RETURN(1); diff -Nru mariadb-10.11.6/sql/sql_acl.h mariadb-10.11.9/sql/sql_acl.h --- mariadb-10.11.6/sql/sql_acl.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_acl.h 2024-08-03 07:29:59.000000000 +0000 @@ -313,7 +313,7 @@ :m_command(command) { } bool is_revoke() const { return m_command == SQLCOM_REVOKE; } - enum_sql_command sql_command_code() const { return m_command; } + enum_sql_command sql_command_code() const override { return m_command; } }; @@ -327,7 +327,7 @@ Sql_cmd_grant_proxy(enum_sql_command command, privilege_t grant_option) :Sql_cmd_grant(command), m_grant_option(grant_option) { } - bool execute(THD *thd); + bool execute(THD *thd) override; }; @@ -354,7 +354,7 @@ Sql_cmd_grant_table(enum_sql_command command, const Grant_privilege &grant) :Sql_cmd_grant_object(command, grant) { } - bool execute(THD *thd); + bool execute(THD *thd) override; }; @@ -368,7 +368,7 @@ :Sql_cmd_grant_object(command, grant), m_sph(sph) { } - bool execute(THD *thd); + bool execute(THD *thd) override; }; #endif /* SQL_ACL_INCLUDED */ diff -Nru mariadb-10.11.6/sql/sql_admin.cc mariadb-10.11.9/sql/sql_admin.cc --- mariadb-10.11.6/sql/sql_admin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_admin.cc 2024-08-03 07:29:59.000000000 +0000 @@ -818,7 +818,7 @@ if (lock_type == TL_WRITE && table->mdl_request.type > MDL_SHARED_WRITE) { if (table->table->s->tmp_table) - thd->close_unused_temporary_table_instances(tables); + thd->close_unused_temporary_table_instances(table); else { /* Store information about table for ddl log */ @@ -863,11 +863,9 @@ !(check_opt->sql_flags & TT_USEFRM)) { handler *file= table->table->file; - int check_old_types= file->check_old_types(); int check_for_upgrade= file->ha_check_for_upgrade(check_opt); - if (check_old_types == HA_ADMIN_NEEDS_ALTER || - check_for_upgrade == HA_ADMIN_NEEDS_ALTER) + if (check_for_upgrade == HA_ADMIN_NEEDS_ALTER) { /* We use extra_open_options to be able to open crashed tables */ thd->open_options|= extra_open_options; @@ -876,7 +874,7 @@ thd->open_options&= ~extra_open_options; goto send_result; } - if (check_old_types || check_for_upgrade) + if (check_for_upgrade) { /* If repair is not implemented for the engine, run ALTER TABLE */ need_repair_or_alter= 1; @@ -905,7 +903,7 @@ */ collect_eis= (table->table->s->table_category == TABLE_CATEGORY_USER && - !(lex->alter_info.flags & ALTER_PARTITION_ADMIN) && + !(lex->alter_info.partition_flags & ALTER_PARTITION_ADMIN) && (check_eits_collection_allowed(thd) || lex->with_persistent_for_clause)); } @@ -917,6 +915,10 @@ result_code = (table->table->file->*operator_func)(thd, check_opt); THD_STAGE_INFO(thd, stage_sending_data); DBUG_PRINT("admin", ("operator_func returned: %d", result_code)); +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (lex->alter_info.partition_flags & ALTER_PARTITION_ADMIN) + set_part_state(&lex->alter_info, table->table->part_info, PART_NORMAL); +#endif } /* Note: compl_result_code can be different from result_code here */ diff -Nru mariadb-10.11.6/sql/sql_admin.h mariadb-10.11.9/sql/sql_admin.h --- mariadb-10.11.6/sql/sql_admin.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_admin.h 2024-08-03 07:29:59.000000000 +0000 @@ -38,9 +38,9 @@ ~Sql_cmd_analyze_table() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ANALYZE; } @@ -61,9 +61,9 @@ ~Sql_cmd_check_table() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_CHECK; } @@ -83,9 +83,9 @@ ~Sql_cmd_optimize_table() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_OPTIMIZE; } @@ -106,9 +106,9 @@ ~Sql_cmd_repair_table() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_REPAIR; } diff -Nru mariadb-10.11.6/sql/sql_alter.cc mariadb-10.11.9/sql/sql_alter.cc --- mariadb-10.11.6/sql/sql_alter.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_alter.cc 2024-08-03 07:29:59.000000000 +0000 @@ -641,19 +641,19 @@ } wsrep::key_array keys; - wsrep_append_fk_parent_table(thd, first_table, &keys); - - WSREP_TO_ISOLATION_BEGIN_ALTER(lex->name.str ? select_lex->db.str - : first_table->db.str, - lex->name.str ? lex->name.str - : first_table->table_name.str, - first_table, &alter_info, &keys, - used_engine ? &create_info : nullptr) + if (!wsrep_append_fk_parent_table(thd, first_table, &keys)) { - WSREP_WARN("ALTER TABLE isolation failure"); - DBUG_RETURN(TRUE); + WSREP_TO_ISOLATION_BEGIN_ALTER(lex->name.str ? select_lex->db.str + : first_table->db.str, + lex->name.str ? lex->name.str + : first_table->table_name.str, + first_table, &alter_info, &keys, + used_engine ? &create_info : nullptr) + { + WSREP_WARN("ALTER TABLE isolation failure"); + DBUG_RETURN(TRUE); + } } - DEBUG_SYNC(thd, "wsrep_alter_table_after_toi"); } #endif diff -Nru mariadb-10.11.6/sql/sql_alter.h mariadb-10.11.9/sql/sql_alter.h --- mariadb-10.11.6/sql/sql_alter.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_alter.h 2024-08-03 07:29:59.000000000 +0000 @@ -462,7 +462,7 @@ virtual ~Sql_cmd_common_alter_table() = default; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_TABLE; } @@ -483,9 +483,9 @@ ~Sql_cmd_alter_table() = default; - Storage_engine_name *option_storage_engine_name() { return this; } + Storage_engine_name *option_storage_engine_name() override { return this; } - bool execute(THD *thd); + bool execute(THD *thd) override; }; @@ -505,11 +505,11 @@ ~Sql_cmd_alter_sequence() = default; - enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_SEQUENCE; } - bool execute(THD *thd); + bool execute(THD *thd) override; }; @@ -529,7 +529,7 @@ : m_tablespace_op(tablespace_op_arg) {} - bool execute(THD *thd); + bool execute(THD *thd) override; private: const enum_tablespace_op_type m_tablespace_op; diff -Nru mariadb-10.11.6/sql/sql_analyse.cc mariadb-10.11.9/sql/sql_analyse.cc --- mariadb-10.11.6/sql/sql_analyse.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_analyse.cc 2024-08-03 07:29:59.000000000 +0000 @@ -258,7 +258,9 @@ info->decimals++; if (str == end) { - info->dval = my_atof(begin); + int error; + const char *end2= end; + info->dval= my_strtod(begin, (char **) &end2, &error); DBUG_RETURN(1); } } @@ -953,7 +955,8 @@ UINT_MAX24 : INT_MAX24)) snprintf(buff, sizeof(buff), "MEDIUMINT(%d)", (int) max_length); else if (min_arg >= INT_MIN32 && max_arg <= (min_arg >= 0 ? - UINT_MAX32 : INT_MAX32)) + (longlong) UINT_MAX32 : + (longlong) INT_MAX32)) snprintf(buff, sizeof(buff), "INT(%d)", (int) max_length); else snprintf(buff, sizeof(buff), "BIGINT(%d)", (int) max_length); diff -Nru mariadb-10.11.6/sql/sql_analyse.h mariadb-10.11.9/sql/sql_analyse.h --- mariadb-10.11.6/sql/sql_analyse.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_analyse.h 2024-08-03 07:29:59.000000000 +0000 @@ -123,13 +123,13 @@ { init_tree(&tree, 0, 0, sizeof(String), (qsort_cmp2) sortcmp2, free_string, NULL, MYF(MY_THREAD_SPECIFIC)); }; - void add(); - void get_opt_type(String*, ha_rows); - String *get_min_arg(String *not_used __attribute__((unused))) + void add() override; + void get_opt_type(String*, ha_rows) override; + String *get_min_arg(String *not_used __attribute__((unused))) override { return &min_arg; } - String *get_max_arg(String *not_used __attribute__((unused))) + String *get_max_arg(String *not_used __attribute__((unused))) override { return &max_arg; } - String *avg(String *s, ha_rows rows) + String *avg(String *s, ha_rows rows) override { if (!(rows - nulls)) s->set_real((double) 0.0, 1,my_thd_charset); @@ -140,10 +140,10 @@ } friend int collect_string(String *element, element_count count, TREE_INFO *info); - tree_walk_action collect_enum() + tree_walk_action collect_enum() override { return (tree_walk_action) collect_string; } String *std(String *s __attribute__((unused)), - ha_rows rows __attribute__((unused))) + ha_rows rows __attribute__((unused))) override { return (String*) 0; } }; @@ -165,16 +165,16 @@ 0, (void *)&bin_size, MYF(MY_THREAD_SPECIFIC)); }; - void add(); - void get_opt_type(String*, ha_rows); - String *get_min_arg(String *); - String *get_max_arg(String *); - String *avg(String *s, ha_rows rows); + void add() override; + void get_opt_type(String*, ha_rows) override; + String *get_min_arg(String *) override; + String *get_max_arg(String *) override; + String *avg(String *s, ha_rows rows) override; friend int collect_decimal(uchar *element, element_count count, TREE_INFO *info); - tree_walk_action collect_enum() + tree_walk_action collect_enum() override { return (tree_walk_action) collect_decimal; } - String *std(String *s, ha_rows rows); + String *std(String *s, ha_rows rows) override; }; @@ -193,19 +193,19 @@ (qsort_cmp2) compare_double2, NULL, NULL, MYF(MY_THREAD_SPECIFIC)); } - void add(); - void get_opt_type(String*, ha_rows); - String *get_min_arg(String *s) + void add() override; + void get_opt_type(String*, ha_rows) override; + String *get_min_arg(String *s) override { s->set_real(min_arg, item->decimals, my_thd_charset); return s; } - String *get_max_arg(String *s) + String *get_max_arg(String *s) override { s->set_real(max_arg, item->decimals, my_thd_charset); return s; } - String *avg(String *s, ha_rows rows) + String *avg(String *s, ha_rows rows) override { if (!(rows - nulls)) s->set_real((double) 0.0, 1,my_thd_charset); @@ -213,7 +213,7 @@ s->set_real(((double)sum / (double) (rows - nulls)), item->decimals,my_thd_charset); return s; } - String *std(String *s, ha_rows rows) + String *std(String *s, ha_rows rows) override { double tmp = ulonglong2double(rows); if (!(tmp - nulls)) @@ -226,10 +226,10 @@ } return s; } - uint decimals() { return item->decimals; } + uint decimals() override { return item->decimals; } friend int collect_real(double *element, element_count count, TREE_INFO *info); - tree_walk_action collect_enum() + tree_walk_action collect_enum() override { return (tree_walk_action) collect_real;} }; @@ -248,11 +248,11 @@ (qsort_cmp2) compare_longlong2, NULL, NULL, MYF(MY_THREAD_SPECIFIC)); } - void add(); - void get_opt_type(String*, ha_rows); - String *get_min_arg(String *s) { s->set(min_arg,my_thd_charset); return s; } - String *get_max_arg(String *s) { s->set(max_arg,my_thd_charset); return s; } - String *avg(String *s, ha_rows rows) + void add() override; + void get_opt_type(String*, ha_rows) override; + String *get_min_arg(String *s) override { s->set(min_arg,my_thd_charset); return s; } + String *get_max_arg(String *s) override { s->set(max_arg,my_thd_charset); return s; } + String *avg(String *s, ha_rows rows) override { if (!(rows - nulls)) s->set_real((double) 0.0, 1,my_thd_charset); @@ -260,7 +260,7 @@ s->set_real(((double) sum / (double) (rows - nulls)), DEC_IN_AVG,my_thd_charset); return s; } - String *std(String *s, ha_rows rows) + String *std(String *s, ha_rows rows) override { double tmp = ulonglong2double(rows); if (!(tmp - nulls)) @@ -275,7 +275,7 @@ } friend int collect_longlong(longlong *element, element_count count, TREE_INFO *info); - tree_walk_action collect_enum() + tree_walk_action collect_enum() override { return (tree_walk_action) collect_longlong;} }; @@ -293,11 +293,11 @@ { init_tree(&tree, 0, 0, sizeof(ulonglong), (qsort_cmp2) compare_ulonglong2, NULL, NULL, MYF(MY_THREAD_SPECIFIC)); } - void add(); - void get_opt_type(String*, ha_rows); - String *get_min_arg(String *s) { s->set(min_arg,my_thd_charset); return s; } - String *get_max_arg(String *s) { s->set(max_arg,my_thd_charset); return s; } - String *avg(String *s, ha_rows rows) + void add() override; + void get_opt_type(String*, ha_rows) override; + String *get_min_arg(String *s) override { s->set(min_arg,my_thd_charset); return s; } + String *get_max_arg(String *s) override { s->set(max_arg,my_thd_charset); return s; } + String *avg(String *s, ha_rows rows) override { if (!(rows - nulls)) s->set_real((double) 0.0, 1,my_thd_charset); @@ -306,7 +306,7 @@ DEC_IN_AVG,my_thd_charset); return s; } - String *std(String *s, ha_rows rows) + String *std(String *s, ha_rows rows) override { double tmp = ulonglong2double(rows); if (!(tmp - nulls)) @@ -322,7 +322,7 @@ } friend int collect_ulonglong(ulonglong *element, element_count count, TREE_INFO *info); - tree_walk_action collect_enum() + tree_walk_action collect_enum() override { return (tree_walk_action) collect_ulonglong; } }; @@ -354,11 +354,11 @@ delete (*f); } } - virtual void add() {} - virtual bool change_columns(THD *thd, List &fields); - virtual int send_row(List &field_list); - virtual void end_group(void) {} - virtual int end_of_records(void); + void add() override {} + bool change_columns(THD *thd, List &fields) override; + int send_row(List &field_list) override; + void end_group(void) override {} + int end_of_records(void) override; friend Procedure *proc_analyse_init(THD *thd, ORDER *param, select_result *result, List &field_list); diff -Nru mariadb-10.11.6/sql/sql_array.h mariadb-10.11.9/sql/sql_array.h --- mariadb-10.11.6/sql/sql_array.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_array.h 2024-08-03 07:29:59.000000000 +0000 @@ -140,12 +140,24 @@ DBUG_ASSERT(idx < array.elements); return *(((Elem*)array.buffer) + idx); } + /// Const variant of at(), which cannot change data const Elem& at(size_t idx) const { return *(((Elem*)array.buffer) + idx); } + Elem& operator[](size_t idx) + { + return at(idx); + } + + /// Const variant of operator[] + const Elem& operator[](size_t idx) const + { + return at(idx); + } + /// @returns pointer to first element Elem *front() { diff -Nru mariadb-10.11.6/sql/sql_base.cc mariadb-10.11.9/sql/sql_base.cc --- mariadb-10.11.6/sql/sql_base.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_base.cc 2024-08-03 07:29:59.000000000 +0000 @@ -74,7 +74,9 @@ *cond_hdl= NULL; if (!first_error) first_error= sql_errno; - if (sql_errno == ER_NO_SUCH_TABLE || sql_errno == ER_NO_SUCH_TABLE_IN_ENGINE) + if (sql_errno == ER_NO_SUCH_TABLE + || sql_errno == ER_NO_SUCH_TABLE_IN_ENGINE + || sql_errno == ER_UNKNOWN_SEQUENCES) { m_handled_errors++; return TRUE; @@ -114,7 +116,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; /** Returns TRUE if there were ER_NO_SUCH_/WRONG_MRG_TABLE and there @@ -198,9 +200,9 @@ is properly initialized, so table definition cache can be produced from key used by MDL subsystem. */ - DBUG_ASSERT(!strcmp(table_list->get_db_name(), + DBUG_ASSERT(!strcmp(table_list->get_db_name().str, table_list->mdl_request.key.db_name())); - DBUG_ASSERT(!strcmp(table_list->get_table_name(), + DBUG_ASSERT(!strcmp(table_list->get_table_name().str, table_list->mdl_request.key.name())); *key= (const char*)table_list->mdl_request.key.ptr() + 1; @@ -231,33 +233,41 @@ # Pointer to list of names of open tables. */ -struct list_open_tables_arg +class list_open_tables_arg { +public: THD *thd; - const char *db; + const Lex_ident_db db; const char *wild; TABLE_LIST table_list; OPEN_TABLE_LIST **start_list, *open_list; + + list_open_tables_arg(THD *thd_arg, const LEX_CSTRING &db_arg, + const char *wild_arg) + :thd(thd_arg), db(db_arg), wild(wild_arg), + start_list(&open_list), open_list(0) + { + bzero((char*) &table_list, sizeof(table_list)); + } }; -static my_bool list_open_tables_callback(TDC_element *element, - list_open_tables_arg *arg) +static my_bool list_open_tables_callback(void *el, void *a) { - const char *db= (char*) element->m_key; - size_t db_length= strlen(db); - const char *table_name= db + db_length + 1; + TDC_element *element= static_cast(el); + list_open_tables_arg *arg= static_cast(a); + const Lex_ident_db + db= Lex_ident_db(Lex_cstring_strlen((const char*) element->m_key)); + const char *table_name= db.str + db.length + 1; - if (arg->db && my_strcasecmp(system_charset_info, arg->db, db)) + if (arg->db.str && !arg->db.streq(db)) return FALSE; if (arg->wild && wild_compare(table_name, arg->wild, 0)) return FALSE; /* Check if user has SELECT privilege for any column in the table */ - arg->table_list.db.str= db; - arg->table_list.db.length= db_length; - arg->table_list.table_name.str= table_name; - arg->table_list.table_name.length= strlen(table_name); + arg->table_list.db= db; + arg->table_list.table_name= Lex_cstring_strlen(table_name); arg->table_list.grant.privilege= NO_ACL; if (check_table_access(arg->thd, SELECT_ACL, &arg->table_list, TRUE, 1, TRUE)) @@ -269,7 +279,7 @@ strmov((*arg->start_list)->table= strmov(((*arg->start_list)->db= (char*) ((*arg->start_list) + 1)), - db) + 1, table_name); + db.str) + 1, table_name); (*arg->start_list)->in_use= 0; mysql_mutex_lock(&element->LOCK_table_share); @@ -286,20 +296,14 @@ } -OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *db, const char *wild) +OPEN_TABLE_LIST *list_open_tables(THD *thd, + const LEX_CSTRING &db, + const char *wild) { - list_open_tables_arg argument; DBUG_ENTER("list_open_tables"); + list_open_tables_arg argument(thd, db, wild); - argument.thd= thd; - argument.db= db; - argument.wild= wild; - bzero((char*) &argument.table_list, sizeof(argument.table_list)); - argument.start_list= &argument.open_list; - argument.open_list= 0; - - if (tdc_iterate(thd, (my_hash_walk_action) list_open_tables_callback, - &argument, true)) + if (tdc_iterate(thd, list_open_tables_callback, &argument, true)) DBUG_RETURN(0); DBUG_RETURN(argument.open_list); @@ -458,9 +462,10 @@ flush_tables_type flush_type; }; -static my_bool tc_collect_used_shares(TDC_element *element, - tc_collect_arg *arg) +static my_bool tc_collect_used_shares(void *el, void *a) { + TDC_element *element= static_cast(el); + tc_collect_arg *arg= static_cast(a); my_bool result= FALSE; DYNAMIC_ARRAY *shares= &arg->shares; @@ -512,7 +517,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { *cond_hdl= NULL; if (sql_errno == ER_OPEN_AS_READONLY || sql_errno == ER_LOCK_WAIT_TIMEOUT) @@ -570,8 +575,7 @@ my_init_dynamic_array(PSI_INSTRUMENT_ME, &collect_arg.shares, sizeof(TABLE_SHARE*), 100, 100, MYF(0)); collect_arg.flush_type= flag; - if (tdc_iterate(thd, (my_hash_walk_action) tc_collect_used_shares, - &collect_arg, true)) + if (tdc_iterate(thd, tc_collect_used_shares, &collect_arg, true)) { /* Release already collected shares */ for (uint i= 0 ; i < collect_arg.shares.elements ; i++) @@ -812,8 +816,10 @@ { TABLE *table; int error= 0; + PSI_stage_info org_stage; DBUG_ENTER("close_thread_tables"); + thd->backup_stage(&org_stage); THD_STAGE_INFO(thd, stage_closing_tables); #ifdef EXTRA_DEBUG @@ -929,7 +935,10 @@ we will exit this function a few lines below. */ if (! thd->lex->requires_prelocking()) - DBUG_RETURN(0); + { + error= 0; + goto end; + } /* We are in the top-level statement of a prelocked statement, @@ -940,7 +949,10 @@ thd->locked_tables_mode= LTM_LOCK_TABLES; if (thd->locked_tables_mode == LTM_LOCK_TABLES) - DBUG_RETURN(0); + { + error= 0; + goto end; + } thd->leave_locked_tables_mode(); @@ -969,6 +981,8 @@ while (thd->open_tables) (void) close_thread_table(thd, &thd->open_tables); +end: + THD_STAGE_INFO(thd, org_stage); DBUG_RETURN(error); } @@ -1441,14 +1455,14 @@ : m_ot_ctx(ot_ctx_arg), m_is_active(FALSE) {} - virtual ~MDL_deadlock_handler() = default; + ~MDL_deadlock_handler() override = default; - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; private: /** Open table context to be used for back-off request. */ @@ -1858,7 +1872,7 @@ TABLE *table; const char *key; uint key_length; - const char *alias= table_list->alias.str; + const LEX_CSTRING &alias= table_list->alias; uint flags= ot_ctx->get_flags(); MDL_ticket *mdl_ticket; TABLE_SHARE *share; @@ -1926,7 +1940,7 @@ if (table->s->table_cache_key.length == key_length && !memcmp(table->s->table_cache_key.str, key, key_length)) { - if (!my_strcasecmp(system_charset_info, table->alias.c_ptr(), alias) && + if (Lex_ident_table(table->alias.to_lex_cstring()).streq(alias) && table->query_id != thd->query_id && /* skip tables already used */ (thd->locked_tables_mode == LTM_LOCK_TABLES || table->query_id == 0)) @@ -2000,7 +2014,7 @@ if (thd->locked_tables_mode == LTM_PRELOCKED) my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db.str, table_list->alias.str); else - my_error(ER_TABLE_NOT_LOCKED, MYF(0), alias); + my_error(ER_TABLE_NOT_LOCKED, MYF(0), alias.str); DBUG_RETURN(TRUE); } @@ -2288,6 +2302,7 @@ if (thd->has_read_only_protection()) { MYSQL_UNBIND_TABLE(table->file); + table->vcol_cleanup_expr(thd); tc_release_table(table); DBUG_RETURN(TRUE); } @@ -2307,6 +2322,7 @@ if (result) { MYSQL_UNBIND_TABLE(table->file); + table->vcol_cleanup_expr(thd); tc_release_table(table); DBUG_RETURN(TRUE); } @@ -3192,7 +3208,7 @@ String query(query_buf, sizeof(query_buf), system_charset_info); query.length(0); - query.append(STRING_WITH_LEN("DELETE FROM ")); + query.append(STRING_WITH_LEN("TRUNCATE TABLE ")); append_identifier(thd, &query, &share->db); query.append('.'); append_identifier(thd, &query, &share->table_name); @@ -3369,12 +3385,12 @@ class MDL_deadlock_discovery_repair_handler : public Internal_error_handler { public: - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { if (sql_errno == ER_LOCK_DEADLOCK) { @@ -3766,7 +3782,7 @@ DBUG_RETURN(TRUE); /* Ensures the routine is up-to-date and cached, if exists. */ - if (rt->sp_cache_routine(thd, has_prelocking_list, &sp)) + if (rt->sp_cache_routine(thd, &sp)) DBUG_RETURN(TRUE); /* Remember the version of the routine in the parse tree. */ @@ -3807,7 +3823,7 @@ Validating routine version is unnecessary, since CALL does not affect the prepared statement prelocked list. */ - if (rt->sp_cache_routine(thd, false, &sp)) + if (rt->sp_cache_routine(thd, &sp)) DBUG_RETURN(TRUE); } } @@ -4640,7 +4656,8 @@ have failed to open since closing tables can trigger removal of elements from the table list (if MERGE tables are involved), */ - close_tables_for_reopen(thd, start, ot_ctx.start_of_statement_svp()); + close_tables_for_reopen(thd, start, ot_ctx.start_of_statement_svp(), + ot_ctx.remove_implicitly_used_deps()); /* Here we rely on the fact that 'tables' still points to the valid @@ -4708,10 +4725,10 @@ /* F.ex. deadlock happened */ if (ot_ctx.can_recover_from_failed_open()) { - DBUG_ASSERT(ot_ctx.get_action() != - Open_table_context::OT_ADD_HISTORY_PARTITION); + DBUG_ASSERT(ot_ctx.remove_implicitly_used_deps()); close_tables_for_reopen(thd, start, - ot_ctx.start_of_statement_svp()); + ot_ctx.start_of_statement_svp(), + ot_ctx.remove_implicitly_used_deps()); if (ot_ctx.recover_from_failed_open()) goto error; @@ -5001,6 +5018,9 @@ Query_arena *arena, backup; TABLE *table= table_list->table; + if (!table->file->referenced_by_foreign_key()) + DBUG_RETURN(FALSE); + arena= thd->activate_stmt_arena_if_needed(&backup); table->file->get_parent_foreign_key_list(thd, &fk_list); @@ -5086,16 +5106,12 @@ return TRUE; } - if (table->file->referenced_by_foreign_key()) - { - if (prepare_fk_prelocking_list(thd, prelocking_ctx, table_list, - need_prelocking, - table_list->trg_event_map)) - return TRUE; - } + if (prepare_fk_prelocking_list(thd, prelocking_ctx, table_list, + need_prelocking, + table_list->trg_event_map)) + return TRUE; } - else if (table_list->slave_fk_event_map && - table->file->referenced_by_foreign_key()) + else if (table_list->slave_fk_event_map) { if (prepare_fk_prelocking_list(thd, prelocking_ctx, table_list, need_prelocking, @@ -5839,13 +5855,23 @@ } } - DEBUG_SYNC(thd, "before_lock_tables_takes_lock"); +#ifdef ENABLED_DEBUG_SYNC + if (!tables || + !(strcmp(tables->db.str, "mysql") == 0 && + strcmp(tables->table_name.str, "proc") == 0)) + DEBUG_SYNC(thd, "before_lock_tables_takes_lock"); +#endif if (! (thd->lock= mysql_lock_tables(thd, start, (uint) (ptr - start), flags))) DBUG_RETURN(TRUE); - DEBUG_SYNC(thd, "after_lock_tables_takes_lock"); +#ifdef ENABLED_DEBUG_SYNC + if (!tables || + !(strcmp(tables->db.str, "mysql") == 0 && + strcmp(tables->table_name.str, "proc") == 0)) + DEBUG_SYNC(thd, "after_lock_tables_takes_lock"); +#endif if (thd->lex->requires_prelocking() && thd->lex->sql_command != SQLCOM_LOCK_TABLES && @@ -5992,27 +6018,34 @@ trying to reopen tables. NULL if no metadata locks were held and thus all metadata locks should be released. + @param[in] remove_implicit_deps True in case routines and tables implicitly + used by a statement should be removed. */ void close_tables_for_reopen(THD *thd, TABLE_LIST **tables, - const MDL_savepoint &start_of_statement_svp) + const MDL_savepoint &start_of_statement_svp, + bool remove_implicit_deps) { TABLE_LIST *first_not_own_table= thd->lex->first_not_own_table(); TABLE_LIST *tmp; - /* - If table list consists only from tables from prelocking set, table list - for new attempt should be empty, so we have to update list's root pointer. - */ - if (first_not_own_table == *tables) - *tables= 0; - thd->lex->chop_off_not_own_tables(); - /* Reset MDL tickets for procedures/functions */ - for (Sroutine_hash_entry *rt= - (Sroutine_hash_entry*)thd->lex->sroutines_list.first; - rt; rt= rt->next) - rt->mdl_request.ticket= NULL; - sp_remove_not_own_routines(thd->lex); + if (remove_implicit_deps) + { + /* + If table list consists only from tables from prelocking set, table list + for new attempt should be empty, so we have to update list's root pointer. + */ + if (first_not_own_table == *tables) + *tables= 0; + thd->lex->chop_off_not_own_tables(); + + /* Reset MDL tickets for procedures/functions */ + for (Sroutine_hash_entry *rt= + (Sroutine_hash_entry*)thd->lex->sroutines_list.first; + rt; rt= rt->next) + rt->mdl_request.ticket= NULL; + sp_remove_not_own_routines(thd->lex); + } for (tmp= *tables; tmp; tmp= tmp->next_global) { tmp->table= 0; @@ -6206,7 +6239,7 @@ { if (nj_col) { - my_error(ER_NON_UNIQ_ERROR, MYF(0), name, thd->where); + my_error(ER_NON_UNIQ_ERROR, MYF(0), name, thd_where(thd)); DBUG_RETURN(NULL); } nj_col= curr_nj_col; @@ -6851,7 +6884,7 @@ item->cached_field_index= NO_CACHED_FIELD_INDEX; } - DBUG_ASSERT(thd->where); + DBUG_ASSERT(thd->where != THD_WHERE::NOWHERE); /* If we found a fully qualified field we return it directly as it can't have duplicates. @@ -6864,7 +6897,7 @@ if (report_error == REPORT_ALL_ERRORS || report_error == IGNORE_EXCEPT_NON_UNIQUE) my_error(ER_NON_UNIQ_ERROR, MYF(0), - table_name ? item->full_name() : name, thd->where); + table_name ? item->full_name() : name, thd_where(thd)); return (Field*) 0; } found= cur_field; @@ -6892,13 +6925,13 @@ strxnmov(buff,sizeof(buff)-1,db,".",table_name,NullS); table_name=buff; } - my_error(ER_UNKNOWN_TABLE, MYF(0), table_name, thd->where); + my_error(ER_UNKNOWN_TABLE, MYF(0), table_name, thd_where(thd)); } else { if (report_error == REPORT_ALL_ERRORS || report_error == REPORT_EXCEPT_NON_UNIQUE) - my_error(ER_BAD_FIELD_ERROR, MYF(0), item->full_name(), thd->where); + my_error(ER_BAD_FIELD_ERROR, MYF(0), item->full_name(), thd_where(thd)); else found= not_found_field; } @@ -7031,7 +7064,7 @@ */ if (report_error != IGNORE_ERRORS) my_error(ER_NON_UNIQ_ERROR, MYF(0), - find->full_name(), current_thd->where); + find->full_name(), thd_where(current_thd)); return (Item**) 0; } found_unaliased= li.ref(); @@ -7062,7 +7095,7 @@ continue; // Same field twice if (report_error != IGNORE_ERRORS) my_error(ER_NON_UNIQ_ERROR, MYF(0), - find->full_name(), current_thd->where); + find->full_name(), thd_where(current_thd)); return (Item**) 0; } found= li.ref(); @@ -7117,7 +7150,7 @@ { if (report_error != IGNORE_ERRORS) my_error(ER_NON_UNIQ_ERROR, MYF(0), - find->full_name(), current_thd->where); + find->full_name(), thd_where(current_thd)); return (Item **) 0; } if (found_unaliased) @@ -7134,7 +7167,7 @@ { if (report_error == REPORT_ALL_ERRORS) my_error(ER_BAD_FIELD_ERROR, MYF(0), - find->full_name(), current_thd->where); + find->full_name(), thd_where(current_thd)); return (Item **) 0; } else @@ -7202,6 +7235,7 @@ if (!(context= new (thd->mem_root) Name_resolution_context)) return TRUE; context->init(); + context->select_lex= table_ref->select_lex; context->first_name_resolution_table= context->last_name_resolution_table= table_ref; item->context= context; @@ -7339,7 +7373,7 @@ DBUG_PRINT ("info", ("match c1.is_common=%d", nj_col_1->is_common)); if (cur_nj_col_2->is_common || found) { - my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1->str, thd->where); + my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1->str, thd_where(thd)); goto err; } if ((!using_fields && !field_2_invisible) || is_using_column_1) @@ -7553,7 +7587,7 @@ if (!(common_field= it++)) { my_error(ER_BAD_FIELD_ERROR, MYF(0), using_field_name_ptr, - current_thd->where); + thd_where(current_thd)); goto err; } if (!my_strcasecmp(system_charset_info, @@ -7807,7 +7841,7 @@ Name_resolution_context *context) { DBUG_ENTER("setup_natural_join_row_types"); - thd->where= "from clause"; + thd->where= THD_WHERE::FROM_CLAUSE; if (from_clause->elements == 0) DBUG_RETURN(false); /* We come here in the case of UNIONs. */ @@ -7978,7 +8012,7 @@ lex->current_select->nest_level); if (allow_sum_func) lex->allow_sum_func.set_bit(lex->current_select->nest_level); - thd->where= THD::DEFAULT_WHERE; + thd->where= THD_WHERE::DEFAULT_WHERE; save_is_item_list_lookup= lex->current_select->is_item_list_lookup; lex->current_select->is_item_list_lookup= 0; @@ -8020,7 +8054,7 @@ while ((item= it++)) { if (make_pre_fix) - pre_fix->push_back(item, thd->stmt_arena->mem_root); + pre_fix->push_back(item, thd->active_stmt_arena_to_use()->mem_root); if (item->fix_fields_if_needed_for_scalar(thd, it.ref())) { @@ -8736,7 +8770,7 @@ embedded= embedding; if (embedded->on_expr) { - thd->where="on clause"; + thd->where= THD_WHERE::ON_CLAUSE; embedded->on_expr->mark_as_condition_AND_part(embedded); if (embedded->on_expr->fix_fields_if_needed_for_bool(thd, &embedded->on_expr)) @@ -8837,7 +8871,7 @@ if (*conds) { - thd->where="where clause"; + thd->where= THD_WHERE::WHERE_CLAUSE; DBUG_EXECUTE("where", print_where(*conds, "WHERE in setup_conds", @@ -9207,6 +9241,9 @@ @param values values to fill with @param ignore_errors TRUE if we should ignore errors @param use_value forces usage of value of the items instead of result + @param check_for_computability whether to check for ability to invoke val_*() + methods (val_int () etc) against supplied + values @details fill_record() may set table->auto_increment_field_not_null and a @@ -9220,7 +9257,7 @@ bool fill_record(THD *thd, TABLE *table, Field **ptr, List &values, - bool ignore_errors, bool use_value) + bool ignore_errors, bool use_value, bool check_for_computability) { List_iterator_fast v(values); List
    tbl_list; @@ -9260,6 +9297,10 @@ /* Ensure the end of the list of values is not reached */ DBUG_ASSERT(value); + if (check_for_computability && + value->check_is_evaluable_expression_or_error()) + goto err; + const bool skip_sys_field= field->vers_sys_field() && !thd->vers_insert_history_fast(table); @@ -9336,7 +9377,7 @@ bool result; Table_triggers_list *triggers= table->triggers; - result= fill_record(thd, table, ptr, values, ignore_errors, FALSE); + result= fill_record(thd, table, ptr, values, ignore_errors, false, false); if (!result && triggers && *ptr) result= triggers->process_triggers(thd, event, TRG_ACTION_BEFORE, TRUE) || diff -Nru mariadb-10.11.6/sql/sql_base.h mariadb-10.11.9/sql/sql_base.h --- mariadb-10.11.6/sql/sql_base.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_base.h 2024-08-03 07:29:59.000000000 +0000 @@ -156,7 +156,8 @@ my_bool mysql_rm_tmp_tables(void); void close_tables_for_reopen(THD *thd, TABLE_LIST **tables, - const MDL_savepoint &start_of_statement_svp); + const MDL_savepoint &start_of_statement_svp, + bool remove_implicit_dependencies); bool table_already_fk_prelocked(TABLE_LIST *tl, LEX_CSTRING *db, LEX_CSTRING *table, thr_lock_type lock_type); TABLE_LIST *find_table_in_list(TABLE_LIST *table, @@ -194,7 +195,8 @@ bool fill_record(THD * thd, TABLE *table_arg, List &fields, List &values, bool ignore_errors, bool update); bool fill_record(THD *thd, TABLE *table, Field **field, List &values, - bool ignore_errors, bool use_value); + bool ignore_errors, bool use_value, + bool check_for_evaluability); Field * find_field_in_tables(THD *thd, Item_ident *item, @@ -314,7 +316,8 @@ void close_all_tables_for_name(THD *thd, TABLE_SHARE *share, ha_extra_function extra, TABLE *skip_table); -OPEN_TABLE_LIST *list_open_tables(THD *thd, const char *db, const char *wild); +OPEN_TABLE_LIST *list_open_tables(THD *thd, const LEX_CSTRING &db, + const char *wild); bool tdc_open_view(THD *thd, TABLE_LIST *table_list, uint flags); TABLE *find_table_for_mdl_upgrade(THD *thd, const char *db, @@ -423,13 +426,13 @@ class DML_prelocking_strategy : public Prelocking_strategy { public: - virtual bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx, - Sroutine_hash_entry *rt, sp_head *sp, - bool *need_prelocking); - virtual bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, - TABLE_LIST *table_list, bool *need_prelocking); - virtual bool handle_view(THD *thd, Query_tables_list *prelocking_ctx, - TABLE_LIST *table_list, bool *need_prelocking); + bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx, + Sroutine_hash_entry *rt, sp_head *sp, + bool *need_prelocking) override; + bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, + TABLE_LIST *table_list, bool *need_prelocking) override; + bool handle_view(THD *thd, Query_tables_list *prelocking_ctx, + TABLE_LIST *table_list, bool *need_prelocking) override; }; @@ -440,8 +443,8 @@ class Lock_tables_prelocking_strategy : public DML_prelocking_strategy { - virtual bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, - TABLE_LIST *table_list, bool *need_prelocking); + bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, + TABLE_LIST *table_list, bool *need_prelocking) override; }; @@ -456,13 +459,13 @@ class Alter_table_prelocking_strategy : public Prelocking_strategy { public: - virtual bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx, - Sroutine_hash_entry *rt, sp_head *sp, - bool *need_prelocking); - virtual bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, - TABLE_LIST *table_list, bool *need_prelocking); - virtual bool handle_view(THD *thd, Query_tables_list *prelocking_ctx, - TABLE_LIST *table_list, bool *need_prelocking); + bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx, + Sroutine_hash_entry *rt, sp_head *sp, + bool *need_prelocking) override; + bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, + TABLE_LIST *table_list, bool *need_prelocking) override; + bool handle_view(THD *thd, Query_tables_list *prelocking_ctx, + TABLE_LIST *table_list, bool *need_prelocking) override; }; @@ -564,9 +567,21 @@ return m_timeout; } - enum_open_table_action get_action() const + /** + Return true in case tables and routines the statement implicilty + dependent on should be removed, else return false. + + @note The use case when routines and tables the statement implicitly + dependent on shouldn't be removed is the one when a new partition be + created on handling the INSERT statement against a versioning partitioned + table. For this case re-opening a versioning table would result in adding + implicitly dependent routines (e.g. table's triggers) that lead to + allocation of memory on PS mem_root and so leaking a memory until the PS + statement be deallocated. + */ + bool remove_implicitly_used_deps() const { - return m_action; + return m_action != OT_ADD_HISTORY_PARTITION; } uint get_flags() const { return m_flags; } @@ -661,7 +676,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; /** Returns TRUE if one or more ER_NO_SUCH_TABLE errors have been diff -Nru mariadb-10.11.6/sql/sql_binlog.cc mariadb-10.11.9/sql/sql_binlog.cc --- mariadb-10.11.6/sql/sql_binlog.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_binlog.cc 2024-08-03 07:29:59.000000000 +0000 @@ -137,7 +137,7 @@ entry[k]= (user_var_entry*) my_hash_search(&thd->user_vars, (uchar*) name[k].str, name[k].length); - if (!entry[k] || entry[k]->type != STRING_RESULT) + if (!entry[k] || entry[k]->type_handler()->result_type() != STRING_RESULT) { my_error(ER_WRONG_TYPE_FOR_VAR, MYF(0), name[k].str); return -1; @@ -162,7 +162,8 @@ gathered_length += entry[k]->length; } for (uint k=0; k < 2; k++) - update_hash(entry[k], true, NULL, 0, STRING_RESULT, &my_charset_bin, 0); + update_hash(entry[k], true, NULL, 0, + &type_handler_long_blob, &my_charset_bin); DBUG_ASSERT(gathered_length == thd->lex->comment.length); diff -Nru mariadb-10.11.6/sql/sql_bootstrap.cc mariadb-10.11.9/sql/sql_bootstrap.cc --- mariadb-10.11.6/sql/sql_bootstrap.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_bootstrap.cc 2024-08-03 07:29:59.000000000 +0000 @@ -33,26 +33,35 @@ fgets_input_t input, fgets_fn_t fgets_fn, int preserve_delimiter, int *error) { - char line_buffer[MAX_BOOTSTRAP_LINE_SIZE]; + char *line_buffer; const char *line; size_t len; size_t query_len= 0; int fgets_error= 0; + int exit_code= 0; *error= 0; + line_buffer= (char*) malloc(MAX_BOOTSTRAP_LINE_SIZE); + *query_length= 0; for ( ; ; ) { - line= (*fgets_fn)(line_buffer, sizeof(line_buffer), input, &fgets_error); + line= (*fgets_fn)(line_buffer, MAX_BOOTSTRAP_LINE_SIZE, input, &fgets_error); if (error) *error= fgets_error; if (fgets_error != 0) - return READ_BOOTSTRAP_ERROR; + { + exit_code= READ_BOOTSTRAP_ERROR; + break; + } if (line == NULL) - return (query_len == 0) ? READ_BOOTSTRAP_EOF : READ_BOOTSTRAP_ERROR; + { + exit_code= (query_len == 0) ? READ_BOOTSTRAP_EOF : READ_BOOTSTRAP_ERROR; + break; + } len= strlen(line); @@ -98,7 +107,8 @@ if (!p || !p[1]) { /* Invalid DELIMITER specifier */ - return READ_BOOTSTRAP_ERROR; + exit_code= READ_BOOTSTRAP_ERROR; + break; } delimiter.assign(p+1); if (preserve_delimiter) @@ -106,7 +116,8 @@ memcpy(query,line,len); query[len]=0; *query_length = (int)len; - return READ_BOOTSTRAP_SUCCESS; + exit_code= READ_BOOTSTRAP_SUCCESS; + break; } continue; } @@ -125,7 +136,8 @@ } query[query_len]= '\0'; *query_length= (int)query_len; - return READ_BOOTSTRAP_QUERY_SIZE; + exit_code= READ_BOOTSTRAP_QUERY_SIZE; + break; } if (query_len != 0) @@ -152,8 +164,11 @@ } query[query_len]= 0; *query_length= (int)query_len; - return READ_BOOTSTRAP_SUCCESS; + exit_code= READ_BOOTSTRAP_SUCCESS; + break; } } + free(line_buffer); + return exit_code; } diff -Nru mariadb-10.11.6/sql/sql_cache.cc mariadb-10.11.9/sql/sql_cache.cc --- mariadb-10.11.6/sql/sql_cache.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_cache.cc 2024-08-03 07:29:59.000000000 +0000 @@ -2530,14 +2530,9 @@ void Query_cache::disable_query_cache(THD *thd) { + lock(thd); m_cache_status= DISABLE_REQUEST; - /* - If there is no requests in progress try to free buffer. - try_lock(TRY) will exit immediately if there is lock. - unlock() should free block. - */ - if (m_requests_in_progress == 0 && !try_lock(thd, TRY)) - unlock(); + unlock(); } diff -Nru mariadb-10.11.6/sql/sql_class.cc mariadb-10.11.9/sql/sql_class.cc --- mariadb-10.11.6/sql/sql_class.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_class.cc 2024-08-03 07:29:59.000000000 +0000 @@ -84,8 +84,6 @@ char internal_table_name[2]= "*"; char empty_c_string[1]= {0}; /* used for not defined db */ -const char * const THD::DEFAULT_WHERE= "field list"; - /**************************************************************************** ** User variables ****************************************************************************/ @@ -630,6 +628,64 @@ thd->awake(KILL_TIMEOUT); } +const char *thd_where(THD *thd) +{ + switch(thd->where) { + case THD_WHERE::CHECKING_TRANSFORMED_SUBQUERY: + return "checking transformed subquery"; + break; + case THD_WHERE::IN_ALL_ANY_SUBQUERY: + return "IN/ALL/ANY subquery"; + break; + case THD_WHERE::JSON_TABLE_ARGUMENT: + return "JSON_TABLE argument"; + break; + case THD_WHERE::DEFAULT_WHERE: // same as FIELD_LIST + case THD_WHERE::FIELD_LIST: + return "field list"; + break; + case THD_WHERE::PARTITION_FUNCTION: + return "partition function"; + break; + case THD_WHERE::FROM_CLAUSE: + return "from clause"; + break; + case THD_WHERE::ON_CLAUSE: + return "on clause"; + break; + case THD_WHERE::WHERE_CLAUSE: + return "where clause"; + break; + case THD_WHERE::CONVERT_CHARSET_CONST: + return "convert character set partition constant"; + break; + case THD_WHERE::FOR_SYSTEM_TIME: + return "FOR SYSTEM_TIME"; + break; + case THD_WHERE::ORDER_CLAUSE: + return "order clause"; + break; + case THD_WHERE::HAVING_CLAUSE: + return "having clause"; + break; + case THD_WHERE::GROUP_STATEMENT: + return "group statement"; + break; + case THD_WHERE::PROCEDURE_LIST: + return "procedure list"; + break; + case THD_WHERE::CHECK_OPTION: + return "check option"; + break; + case THD_WHERE::USE_WHERE_STRING: + return thd->where_str; + default: + break; // "fall-through" to default return below + }; + DBUG_ASSERT(false); + return "UNKNOWN"; +} + THD::THD(my_thread_id id, bool is_wsrep_applier) :Statement(&main_lex, &main_mem_root, STMT_CONVENTIONAL_EXECUTION, /* statement id */ 0), @@ -680,8 +736,7 @@ #ifdef HAVE_REPLICATION , current_linfo(0), - slave_info(0), - is_awaiting_semisync_ack(0) + slave_info(0) #endif #ifdef WITH_WSREP , @@ -727,7 +782,6 @@ wsrep_wfc() #endif /*WITH_WSREP */ { - ulong tmp; bzero(&variables, sizeof(variables)); /* @@ -837,7 +891,7 @@ /* Variables with default values */ proc_info="login"; - where= THD::DEFAULT_WHERE; + where= THD_WHERE::DEFAULT_WHERE; slave_net = 0; m_command=COM_CONNECT; *scramble= '\0'; @@ -858,7 +912,7 @@ my_hash_init(key_memory_user_var_entry, &user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0, (my_hash_get_key) get_var_key, (my_hash_free_key) free_user_var, HASH_THREAD_SPECIFIC); - my_hash_init(PSI_INSTRUMENT_ME, &sequences, system_charset_info, + my_hash_init(PSI_INSTRUMENT_ME, &sequences, Lex_ident_fs::charset_info(), SEQUENCES_HASH_SIZE, 0, 0, (my_hash_get_key) get_sequence_last_key, (my_hash_free_key) free_sequence_last, HASH_THREAD_SPECIFIC); @@ -879,14 +933,6 @@ tablespace_op=FALSE; - /* - Initialize the random generator. We call my_rnd() without a lock as - it's not really critical if two threads modifies the structure at the - same time. We ensure that we have an unique number foreach thread - by adding the address of the stack. - */ - tmp= (ulong) (my_rnd(&sql_rand) * 0xffffffff); - my_rnd_init(&rand, tmp + (ulong)((size_t) &rand), tmp + (ulong) ::global_query_id); substitute_null_with_insert_id = FALSE; lock_info.mysql_thd= (void *)this; @@ -903,6 +949,7 @@ prepare_derived_at_open= FALSE; create_tmp_table_for_derived= FALSE; save_prep_leaf_list= FALSE; + reset_sp_cache= false; org_charset= 0; /* Restore THR_THD */ set_current_thd(old_THR_THD); @@ -1247,7 +1294,9 @@ user_time.val= start_time= start_time_sec_part= 0; - server_status= SERVER_STATUS_AUTOCOMMIT; + server_status= 0; + if (variables.option_bits & OPTION_AUTOCOMMIT) + server_status|= SERVER_STATUS_AUTOCOMMIT; if (variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) server_status|= SERVER_STATUS_NO_BACKSLASH_ESCAPES; if (variables.sql_mode & MODE_ANSI_QUOTES) @@ -1312,6 +1361,17 @@ /* Set to handle counting of aborted connections */ userstat_running= opt_userstat_running; last_global_update_time= current_connect_time= time(NULL); + + /* + Initialize the random generator. We call my_rnd() without a lock as + it's not really critical if two threads modify the structure at the + same time. We ensure that we have a unique number for each thread + by adding the address of this THD. + */ + ulong tmp= (ulong) (my_rnd(&sql_rand) * 0xffffffff); + my_rnd_init(&rand, tmp + (ulong)(intptr) this, + (ulong)(my_timer_cycles() + global_query_id)); + #ifndef EMBEDDED_LIBRARY session_tracker.enable(this); #endif //EMBEDDED_LIBRARY @@ -1436,7 +1496,8 @@ my_hash_init(key_memory_user_var_entry, &user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0, (my_hash_get_key) get_var_key, (my_hash_free_key) free_user_var, HASH_THREAD_SPECIFIC); - my_hash_init(key_memory_user_var_entry, &sequences, system_charset_info, + my_hash_init(key_memory_user_var_entry, &sequences, + Lex_ident_fs::charset_info(), SEQUENCES_HASH_SIZE, 0, 0, (my_hash_get_key) get_sequence_last_key, (my_hash_free_key) free_sequence_last, HASH_THREAD_SPECIFIC); @@ -1604,6 +1665,10 @@ vio_delete(net.vio); net.vio= nullptr; net_end(&net); + delete(rgi_fake); + rgi_fake= NULL; + delete(rli_fake); + rli_fake= NULL; #endif if (!cleanup_done) cleanup(); @@ -1642,6 +1707,7 @@ abort_on_warning= 0; free_connection_done= 0; m_command= COM_CONNECT; + proc_info= "login"; // Same as in THD::THD() transaction->on= 1; #if defined(ENABLED_PROFILING) profiling.reset(); @@ -1654,6 +1720,7 @@ wsrep_cs().reset_error(); wsrep_aborter= 0; wsrep_abort_by_kill= NOT_KILLED; + my_free(wsrep_abort_by_kill_err); wsrep_abort_by_kill_err= 0; #ifndef DBUG_OFF wsrep_killed_state= 0; @@ -1696,6 +1763,8 @@ #ifdef WITH_WSREP mysql_cond_destroy(&COND_wsrep_thd); + my_free(wsrep_abort_by_kill_err); + wsrep_abort_by_kill_err= 0; #endif mdl_context.destroy(); @@ -1708,17 +1777,6 @@ dbug_sentry= THD_SENTRY_GONE; #endif #ifndef EMBEDDED_LIBRARY - if (rgi_fake) - { - delete rgi_fake; - rgi_fake= NULL; - } - if (rli_fake) - { - delete rli_fake; - rli_fake= NULL; - } - if (rgi_slave) rgi_slave->cleanup_after_session(); my_free(semisync_info); @@ -1726,6 +1784,7 @@ main_lex.free_set_stmt_mem_root(); free_root(&main_mem_root, MYF(0)); my_free(m_token_array); + my_free(killed_err); main_da.free_memory(); if (tdc_hash_pins) lf_hash_put_pins(tdc_hash_pins); @@ -1857,14 +1916,6 @@ */ } -#define SECONDS_TO_WAIT_FOR_KILL 2 -#if !defined(_WIN32) && defined(HAVE_SELECT) -/* my_sleep() can wait for sub second times */ -#define WAIT_FOR_KILL_TRY_TIMES 20 -#else -#define WAIT_FOR_KILL_TRY_TIMES 2 -#endif - /** Awake a thread. @@ -2142,7 +2193,11 @@ mysql_mutex_assert_not_owner(&LOCK_thd_kill); mysql_mutex_lock(&LOCK_thd_kill); killed= NOT_KILLED; - killed_err= 0; + if (unlikely(killed_err)) + { + my_free(killed_err); + killed_err= 0; + } mysql_mutex_unlock(&LOCK_thd_kill); } #ifdef WITH_WSREP @@ -2153,6 +2208,7 @@ mysql_mutex_assert_not_owner(&LOCK_thd_kill); mysql_mutex_lock(&LOCK_thd_kill); wsrep_abort_by_kill= NOT_KILLED; + my_free(wsrep_abort_by_kill_err); wsrep_abort_by_kill_err= 0; mysql_mutex_unlock(&LOCK_thd_kill); } @@ -2312,7 +2368,7 @@ /* Free Items that were created during this execution */ free_items(); /* Reset where. */ - where= THD::DEFAULT_WHERE; + where= THD_WHERE::DEFAULT_WHERE; /* reset table map for multi-table update */ table_map_for_update= 0; m_binlog_invoker= INVOKER_NONE; @@ -2494,6 +2550,8 @@ CHARSET_INFO *srccs, const char *src, size_t src_length) { + // Don't allow NULL to avoid UB in the called functions: nullptr+0 + DBUG_ASSERT(src); String_copier_with_error status; return copy_fix(dstcs, dst, srccs, src, src_length, &status) || status.check_errors(srccs, src, src_length); @@ -4480,7 +4538,7 @@ my_free((char*) host); host= NULL; } - if (user != delayed_user) + if (is_user_defined()) { my_free((char*) user); user= NULL; @@ -5050,6 +5108,9 @@ thd->real_id= 0; thd->thread_id= 0; thd->query_id= 0; +#ifdef WITH_WSREP + thd->variables.wsrep_on= FALSE; +#endif /* WITH_WSREP */ return thd; } @@ -5297,18 +5358,21 @@ } -extern "C" enum enum_server_command thd_current_command(MYSQL_THD thd) +extern "C" int thd_double_innodb_cardinality(MYSQL_THD thd) { - return thd->get_command(); + /* + The original behavior was to double the cardinality. + OPTIMIZER_FIX_INNODB_CARDINALITY means do not double. + */ + return !(thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_FIX_INNODB_CARDINALITY); } -#ifdef HAVE_REPLICATION /* Working around MDEV-24622 */ -/** @return whether the current thread is for applying binlog in a replica */ -extern "C" int thd_is_slave(const MYSQL_THD thd) + +extern "C" enum enum_server_command thd_current_command(MYSQL_THD thd) { - return thd && thd->slave_thread; + return thd->get_command(); } -#endif /* HAVE_REPLICATION */ /* Returns high resolution timestamp for the start of the current query. */ @@ -5393,14 +5457,38 @@ return 0; if (!rgi->is_parallel_exec) return 0; - if (rgi->rli != other_rgi->rli) - return 0; - if (!rgi->gtid_sub_id || !other_rgi->gtid_sub_id) - return 0; - if (rgi->current_gtid.domain_id != other_rgi->current_gtid.domain_id) - return 0; - if (rgi->gtid_sub_id > other_rgi->gtid_sub_id) - return 0; + if (rgi->rli == other_rgi->rli && + rgi->current_gtid.domain_id == other_rgi->current_gtid.domain_id) + { + /* + Within the same master connection and domain, we can compare transaction + order on the GTID sub_id, and rollback the later transaction to allow the + earlier transaction to commit first. + */ + if (!rgi->gtid_sub_id || !other_rgi->gtid_sub_id || + rgi->gtid_sub_id > other_rgi->gtid_sub_id) + return 0; + } + else + { + /* + Lock conflicts between different master connections or domains should + usually not occur, but could still happen if user is running some + special setup that tolerates conflicting updates (or in case of user + error). We do not have a pre-defined ordering of transactions in this + case, but we still need to handle conflicts in _some_ way to avoid + undetected deadlocks and hangs. + + We do this by rolling back and retrying any transaction that is being + _optimistically_ applied. This can be overly conservative in some cases, + but should be fine as conflicts between different master connections / + domains are not common. And it ensures that we won't end up in a + deadlock and hang due to a transaction doing wait_for_prior_commit while + holding locks that block something in another master connection. + */ + if (other_rgi->speculation != rpl_group_info::SPECULATE_OPTIMISTIC) + return 0; + } if (rgi->finish_event_group_called || other_rgi->finish_event_group_called) { /* @@ -5708,6 +5796,40 @@ return &thd->mdl_context; } +/** + Send check/repair message to the user + + @param op one of check or repair + @param msg_type one of info, warning or error + @param print_to_log <> 0 if we should also print the message to error log. +*/ + +extern "C" void +print_check_msg(THD *thd, const char *db_name, const char *table_name, const char *op, + const char *msg_type, const char *message, my_bool print_to_log) +{ + char name[NAME_LEN * 2 + 2]; + Protocol *protocol= thd->protocol; + + DBUG_ASSERT(strlen(db_name) <= NAME_LEN); + DBUG_ASSERT(strlen(table_name) <= NAME_LEN); + + size_t length= size_t(strxnmov(name, sizeof name - 1, + db_name, ".", table_name, NullS) - + name); + protocol->prepare_for_resend(); + protocol->store(name, length, system_charset_info); + protocol->store(op, strlen(op), system_charset_info); + protocol->store(msg_type, strlen(msg_type), system_charset_info); + protocol->store(message, strlen(message), system_charset_info); + if (protocol->write()) + sql_print_error("Failed on my_net_write, writing to stderr instead: %s: %s\n", + table_name, message); + else if (thd->variables.log_warnings > 2 && print_to_log) + sql_print_error("%s: table '%s' got '%s' during %s", + msg_type, table_name, message, op); +} + /**************************************************************************** Handling of statement states in functions and triggers. @@ -5933,8 +6055,6 @@ void THD::inc_sent_row_count(ha_rows count) { m_sent_row_count+= count; - DBUG_EXECUTE_IF("debug_huge_number_of_examined_rows", - m_examined_row_count= (ULONGLONG_MAX - 1000000);); MYSQL_SET_STATEMENT_ROWS_SENT(m_statement_psi, m_sent_row_count); } @@ -6351,7 +6471,8 @@ wsrep_is_active(this) && variables.wsrep_trx_fragment_size > 0) { - if (!is_current_stmt_binlog_format_row()) + if (!is_current_stmt_binlog_disabled() && + !is_current_stmt_binlog_format_row()) { my_message(ER_NOT_SUPPORTED_YET, "Streaming replication not supported with " @@ -6998,7 +7119,8 @@ { DBUG_ENTER("binlog_prepare_pending_rows_event"); /* Pre-conditions */ - DBUG_ASSERT(table->s->table_map_id != ~0UL); + DBUG_ASSERT((table->s->table_map_id & MAX_TABLE_MAP_ID) != UINT32_MAX && + (table->s->table_map_id & MAX_TABLE_MAP_ID) != 0); /* Fetch the type code for the RowsEventT template parameter */ int const general_type_code= RowsEventT::TYPE_CODE; @@ -8310,6 +8432,34 @@ mysql_mutex_unlock(&LOCK_wait_commit); } +/* + Wait # seconds or until someone sends a signal (through kill) + + Note that this must have same prototype as my_sleep_for_space() +*/ + +C_MODE_START + +void mariadb_sleep_for_space(unsigned int seconds) +{ + THD *thd= current_thd; + PSI_stage_info old_stage; + if (!thd) + { + sleep(seconds); + return; + } + mysql_mutex_lock(&thd->LOCK_wakeup_ready); + thd->ENTER_COND(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready, + &stage_waiting_for_disk_space, &old_stage); + if (!thd->killed) + mysql_cond_wait(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready); + thd->EXIT_COND(&old_stage); + return; +} + +C_MODE_END + bool Discrete_intervals_list::append(ulonglong start, ulonglong val, ulonglong incr) diff -Nru mariadb-10.11.6/sql/sql_class.h mariadb-10.11.9/sql/sql_class.h --- mariadb-10.11.6/sql/sql_class.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_class.h 2024-08-03 07:29:59.000000000 +0000 @@ -1,5 +1,4 @@ /* - Copyright (c) 2000, 2016, Oracle and/or its affiliates. Copyright (c) 2009, 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify @@ -24,6 +23,7 @@ #include "dur_prop.h" #include #include "sql_const.h" +#include "lex_ident.h" #include #include "log.h" #include "rpl_tblmap.h" @@ -201,6 +201,7 @@ #define OLD_MODE_UTF8_IS_UTF8MB3 (1 << 3) #define OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN (1 << 4) #define OLD_MODE_COMPAT_5_1_CHECKSUM (1 << 5) +#define OLD_MODE_NO_NULL_COLLATION_IDS (1 << 6) extern char internal_table_name[2]; extern char empty_c_string[1]; @@ -217,6 +218,7 @@ extern "C" LEX_CSTRING *thd_current_db(MYSQL_THD thd); extern "C" int thd_current_status(MYSQL_THD thd); extern "C" enum enum_server_command thd_current_command(MYSQL_THD thd); +extern "C" int thd_double_innodb_cardinality(MYSQL_THD thd); /** @class CSET_STRING @@ -281,9 +283,8 @@ user_var_entry *user_var_event; char *value; size_t length; - Item_result type; + const Type_handler *th; uint charset_number; - bool unsigned_flag; } BINLOG_USER_VAR_EVENT; /* @@ -521,7 +522,7 @@ Used to make a clone of this object for ALTER/CREATE TABLE @sa comment for Key_part_spec::clone */ - virtual Key *clone(MEM_ROOT *mem_root) const + Key *clone(MEM_ROOT *mem_root) const override { return new (mem_root) Foreign_key(*this, mem_root); } /* Used to validate foreign key options */ bool validate(List &table_fields); @@ -657,6 +658,15 @@ KILL_TYPE_QUERY }; +#define SECONDS_TO_WAIT_FOR_KILL 2 +#define SECONDS_TO_WAIT_FOR_DUMP_THREAD_KILL 10 +#if !defined(_WIN32) && defined(HAVE_SELECT) +/* my_sleep() can wait for sub second times */ +#define WAIT_FOR_KILL_TRY_TIMES 20 +#else +#define WAIT_FOR_KILL_TRY_TIMES 2 +#endif + #include "sql_lex.h" /* Must be here */ class Delayed_insert; @@ -694,7 +704,6 @@ ulonglong max_statement_time; ulonglong optimizer_switch; ulonglong optimizer_trace; - ulong optimizer_trace_max_mem_size; sql_mode_t sql_mode; ///< which non-standard SQL behaviour should be enabled sql_mode_t old_behavior; ///< which old SQL behaviour should be enabled ulonglong option_bits; ///< OPTION_xxx constants, e.g. OPTION_PROFILING @@ -709,6 +718,11 @@ ulonglong sortbuff_size; ulonglong default_regex_flags; ulonglong max_mem_used; + /* + A bitmap of OPTIMIZER_ADJ_* flags (defined in sql_priv.h). + See sys_vars.cc:adjust_secondary_key_cost for symbolic names. + */ + ulonglong optimizer_adjust_secondary_key_costs; /** Place holders to store Multi-source variables in sys_var.cc during @@ -758,6 +772,7 @@ ulong optimizer_use_condition_selectivity; ulong optimizer_max_sel_arg_weight; ulong optimizer_max_sel_args; + ulong optimizer_trace_max_mem_size; ulong use_stat_tables; double sample_percentage; ulong histogram_size; @@ -1429,7 +1444,7 @@ void set_n_backup_statement(Statement *stmt, Statement *backup); void restore_backup_statement(Statement *stmt, Statement *backup); /* return class type */ - virtual Type type() const; + Type type() const override; }; @@ -1563,6 +1578,8 @@ */ bool check_access(const privilege_t want_access, bool match_any = false); bool is_priv_user(const char *user, const char *host); + bool is_user_defined() const + { return user && user != delayed_user && user != slave_user; }; }; @@ -1990,7 +2007,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { m_unhandled_errors++; if (!first_error) @@ -2014,7 +2031,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { if (*level == Sql_condition::WARN_LEVEL_ERROR) errors++; @@ -2042,7 +2059,7 @@ const char* sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl); + Sql_condition ** cond_hdl) override; private: }; @@ -2063,7 +2080,7 @@ const char *sqlstate, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition **cond_hdl); + Sql_condition **cond_hdl) override; bool need_reopen() const { return m_need_reopen; }; void init() { m_need_reopen= FALSE; }; @@ -2076,12 +2093,12 @@ { public: Turn_errors_to_warnings_handler() = default; - bool handle_condition(THD *thd, - uint sql_errno, - const char* sqlstate, + bool handle_condition(THD *, + uint, + const char*, Sql_condition::enum_warning_level *level, - const char* msg, - Sql_condition ** cond_hdl) + const char*, + Sql_condition ** cond_hdl) override { *cond_hdl= NULL; if (*level == Sql_condition::WARN_LEVEL_ERROR) @@ -2093,12 +2110,12 @@ struct Suppress_warnings_error_handler : public Internal_error_handler { - bool handle_condition(THD *thd, - uint sql_errno, - const char *sqlstate, + bool handle_condition(THD *, + uint, + const char *, Sql_condition::enum_warning_level *level, - const char *msg, - Sql_condition **cond_hdl) + const char *, + Sql_condition **) override { return *level == Sql_condition::WARN_LEVEL_WARN; } @@ -2454,6 +2471,11 @@ swap_variables(sp_cache*, sp_package_body_cache, rhs.sp_package_body_cache); } void sp_caches_clear(); + /** + Clear content of sp related caches. + Don't delete cache objects itself. + */ + void sp_caches_empty(); }; @@ -2632,6 +2654,33 @@ }; +enum class THD_WHERE +{ + NOWHERE = 0, + CHECKING_TRANSFORMED_SUBQUERY, + IN_ALL_ANY_SUBQUERY, + JSON_TABLE_ARGUMENT, + FIELD_LIST, + PARTITION_FUNCTION, + FROM_CLAUSE, + DEFAULT_WHERE, + ON_CLAUSE, + WHERE_CLAUSE, + CONVERT_CHARSET_CONST, + FOR_SYSTEM_TIME, + ORDER_CLAUSE, + HAVING_CLAUSE, + GROUP_STATEMENT, + PROCEDURE_LIST, + CHECK_OPTION, + USE_WHERE_STRING, // ugh, a compromise for vcol... +}; + + +class THD; +const char *thd_where(THD *thd); + + /** @class THD For each client connection we create a separate thread with THD serving as @@ -2684,13 +2733,6 @@ MDL_request *backup_commit_lock; void reset_for_next_command(bool do_clear_errors= 1); - /* - Constant for THD::where initialization in the beginning of every query. - - It's needed because we do not save/restore THD::where normally during - primary (non subselect) query execution. - */ - static const char * const DEFAULT_WHERE; #ifdef EMBEDDED_LIBRARY struct st_mysql *mysql; @@ -2846,12 +2888,15 @@ const char *get_proc_info() const { return proc_info; } + // Used by thd_where() when where==USE_WHERE_STRING + const char *where_str; + /* Used in error messages to tell user in what part of MySQL we found an error. E. g. when where= "having clause", if fix_fields() fails, user will know that the error was in having clause. */ - const char *where; + THD_WHERE where; /* Needed by MariaDB semi sync replication */ Trans_binlog_info *semisync_info; @@ -2944,6 +2989,12 @@ bool save_prep_leaf_list; + /** + The data member reset_sp_cache is to signal that content of sp_cache + must be reset (all items be removed from it). + */ + bool reset_sp_cache; + /* container for handler's private per-connection data */ Ha_data ha_data[MAX_HA]; @@ -3204,6 +3255,17 @@ */ Query_arena *stmt_arena; + /** + Get either call or statement arena. In case some function is called from + within a query the call arena has to be used for a memory allocation, + else use the statement arena. + */ + Query_arena *active_stmt_arena_to_use() + { + return (state == Query_arena::STMT_SP_QUERY_ARGUMENTS) ? this : + stmt_arena; + } + void *bulk_param; /* @@ -3435,7 +3497,11 @@ { return m_sent_row_count; } ha_rows get_examined_row_count() const - { return m_examined_row_count; } + { + DBUG_EXECUTE_IF("debug_huge_number_of_examined_rows", + return (ULONGLONG_MAX - 1000000);); + return m_examined_row_count; + } ulonglong get_affected_rows() const { return affected_rows; } @@ -3901,7 +3967,7 @@ enter_cond(mysql_cond_t *cond, mysql_mutex_t* mutex, const PSI_stage_info *stage, PSI_stage_info *old_stage, const char *src_function, const char *src_file, - int src_line) + int src_line) override { mysql_mutex_assert_owner(mutex); mysys_var->current_mutex = mutex; @@ -3913,7 +3979,7 @@ } inline void exit_cond(const PSI_stage_info *stage, const char *src_function, const char *src_file, - int src_line) + int src_line) override { /* Putting the mutex unlock in thd->exit_cond() ensures that @@ -3930,8 +3996,8 @@ mysql_mutex_unlock(&mysys_var->mutex); return; } - virtual int is_killed() { return killed; } - virtual THD* get_thd() { return this; } + int is_killed() override { return killed; } + THD* get_thd() override { return this; } /** A callback to the server internals that is used to address @@ -3956,8 +4022,8 @@ @retval TRUE if the thread was woken up @retval FALSE otherwise. */ - virtual bool notify_shared_lock(MDL_context_owner *ctx_in_use, - bool needs_thr_lock_abort); + bool notify_shared_lock(MDL_context_owner *ctx_in_use, + bool needs_thr_lock_abort) override; // End implementation of MDL_context_owner interface. @@ -4608,7 +4674,8 @@ The worst things that can happen is that we get a suboptimal error message. */ - killed_err= (err_info*) alloc_root(&main_mem_root, sizeof(*killed_err)); + if (!killed_err) + killed_err= (err_info*) my_malloc(PSI_INSTRUMENT_ME, sizeof(*killed_err), MYF(MY_WME)); if (likely(killed_err)) { killed_err->no= killed_errno_arg; @@ -4802,26 +4869,26 @@ */ bool copy_db_to(LEX_CSTRING *to) { - if (db.str == NULL) + if (db.str) { - /* - No default database is set. In this case if it's guaranteed that - no CTE can be used in the statement then we can throw an error right - now at the parser stage. Otherwise the decision about throwing such - a message must be postponed until a post-parser stage when we are able - to resolve all CTE names as we don't need this message to be thrown - for any CTE references. - */ - if (!lex->with_cte_resolution) - my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); - return TRUE; + to->str= strmake(db.str, db.length); + to->length= db.length; + return to->str == NULL; /* True on error */ } - to->str= strmake(db.str, db.length); - to->length= db.length; - return to->str == NULL; /* True on error */ + /* + No default database is set. In this case if it's guaranteed that + no CTE can be used in the statement then we can throw an error right + now at the parser stage. Otherwise the decision about throwing such + a message must be postponed until a post-parser stage when we are able + to resolve all CTE names as we don't need this message to be thrown + for any CTE references. + */ + if (!lex->with_cte_resolution) + my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0)); + return TRUE; } - /* Get db name or "". Use for printing current db */ + /* Get db name or "". */ const char *get_db() { return safe_str(db.str); } @@ -5038,14 +5105,25 @@ public: /** Overloaded to guard query/query_length fields */ - virtual void set_statement(Statement *stmt); - void set_command(enum enum_server_command command) + void set_statement(Statement *stmt) override; + inline void set_command(enum enum_server_command command) { + DBUG_ASSERT(command != COM_SLEEP); m_command= command; #ifdef HAVE_PSI_THREAD_INTERFACE PSI_STATEMENT_CALL(set_thread_command)(m_command); #endif } + /* As sleep needs a bit of special handling, we have a special case for it */ + inline void mark_connection_idle() + { + proc_info= 0; + m_command= COM_SLEEP; +#ifdef HAVE_PSI_THREAD_INTERFACE + PSI_STATEMENT_CALL(set_thread_command)(m_command); +#endif + } + inline enum enum_server_command get_command() const { return m_command; } @@ -5149,11 +5227,29 @@ { if (global_system_variables.log_warnings > threshold) { + char real_ip_str[64]; + real_ip_str[0]= 0; + + /* For proxied connections, add the real IP to the warning message */ + if (net.using_proxy_protocol && net.vio) + { + if(net.vio->localhost) + snprintf(real_ip_str, sizeof(real_ip_str), " real ip: 'localhost'"); + else + { + char buf[INET6_ADDRSTRLEN]; + if (!vio_getnameinfo((sockaddr *)&(net.vio->remote), buf, + sizeof(buf),NULL, 0, NI_NUMERICHOST)) + { + snprintf(real_ip_str, sizeof(real_ip_str), " real ip: '%s'",buf); + } + } + } Security_context *sctx= &main_security_ctx; sql_print_warning(ER_THD(this, ER_NEW_ABORTING_CONNECTION), thread_id, (db.str ? db.str : "unconnected"), sctx->user ? sctx->user : "unauthenticated", - sctx->host_or_ip, reason); + sctx->host_or_ip, real_ip_str, reason); } } @@ -5251,8 +5347,18 @@ Flag, mutex and condition for a thread to wait for a signal from another thread. - Currently used to wait for group commit to complete, can also be used for - other purposes. + Currently used to wait for group commit to complete, and COND_wakeup_ready + is used for threads to wait on semi-sync ACKs (though is protected by + Repl_semi_sync_master::LOCK_binlog). Note the following relationships + between these two use-cases when using + rpl_semi_sync_master_wait_point=AFTER_SYNC during group commit: + 1) Non-leader threads use COND_wakeup_ready to wait for the leader thread + to complete binlog commit. + 2) The leader thread uses COND_wakeup_ready to await ACKs from the + replica before signalling the non-leader threads to wake up. + + With wait_point=AFTER_COMMIT, there is no overlap as binlogging has + finished, so COND_wakeup_ready is safe to re-use. */ bool wakeup_ready; mysql_mutex_t LOCK_wakeup_ready; @@ -5380,14 +5486,6 @@ bool is_binlog_dump_thread(); #endif - /* - Indicates if this thread is suspended due to awaiting an ACK from a - replica. True if suspended, false otherwise. - - Note that this variable is protected by Repl_semi_sync_master::LOCK_binlog - */ - bool is_awaiting_semisync_ack; - inline ulong wsrep_binlog_format(ulong binlog_format) const { #ifdef WITH_WSREP @@ -5981,7 +6079,7 @@ TABLE *dst_table; /* table to write into */ /* The following is called in the child thread: */ - int send_data(List &items); + int send_data(List &items) override; }; @@ -5995,7 +6093,7 @@ { public: select_result_text_buffer(THD *thd_arg): select_result_sink(thd_arg) {} - int send_data(List &items); + int send_data(List &items) override; bool send_result_set_metadata(List &fields, uint flag); void save_to(String *res); @@ -6023,9 +6121,9 @@ DBUG_PRINT("enter", ("this %p", this)); DBUG_VOID_RETURN; } /* Remove gcc warning */ - uint field_count(List &fields) const { return 0; } - bool send_result_set_metadata(List &fields, uint flag) { return FALSE; } - select_result_interceptor *result_interceptor() { return this; } + uint field_count(List &fields) const override { return 0; } + bool send_result_set_metadata(List &fields, uint flag) override { return FALSE; } + select_result_interceptor *result_interceptor() override { return this; } /* Instruct the object to not call my_ok(). Client output will be handled @@ -6093,10 +6191,10 @@ uint get_field_count() { return field_count; } void set_spvar_list(List *vars) { spvar_list= vars; } - virtual bool send_eof() { return FALSE; } - virtual int send_data(List &items); - virtual int prepare(List &list, SELECT_LEX_UNIT *u); - virtual bool view_structure_only() const { return m_view_structure_only; } + bool send_eof() override { return FALSE; } + int send_data(List &items) override; + int prepare(List &list, SELECT_LEX_UNIT *u) override; + bool view_structure_only() const override { return m_view_structure_only; } }; public: @@ -6153,13 +6251,13 @@ public: select_send(THD *thd_arg): select_result(thd_arg), is_result_set_started(FALSE) {} - bool send_result_set_metadata(List &list, uint flags); - int send_data(List &items); - bool send_eof(); - virtual bool check_simple_select() const { return FALSE; } - void abort_result_set(); - virtual void cleanup(); - select_result_interceptor *result_interceptor() { return NULL; } + bool send_result_set_metadata(List &list, uint flags) override; + int send_data(List &items) override; + bool send_eof() override; + bool check_simple_select() const override { return FALSE; } + void abort_result_set() override; + void cleanup() override; + select_result_interceptor *result_interceptor() override { return NULL; } }; @@ -6171,9 +6269,9 @@ class select_send_analyze : public select_send { - bool send_result_set_metadata(List &list, uint flags) { return 0; } - bool send_eof() { return 0; } - void abort_result_set() {} + bool send_result_set_metadata(List &list, uint flags) override { return 0; } + bool send_eof() override { return 0; } + void abort_result_set() override {} public: select_send_analyze(THD *thd_arg): select_send(thd_arg) {} }; @@ -6192,8 +6290,8 @@ select_result_interceptor(thd_arg), exchange(ex), file(-1),row_count(0L) { path[0]=0; } ~select_to_file(); - bool send_eof(); - void cleanup(); + bool send_eof() override; + void cleanup() override; }; @@ -6233,16 +6331,16 @@ public: select_export(THD *thd_arg, sql_exchange *ex): select_to_file(thd_arg, ex) {} ~select_export(); - int prepare(List &list, SELECT_LEX_UNIT *u); - int send_data(List &items); + int prepare(List &list, SELECT_LEX_UNIT *u) override; + int send_data(List &items) override; }; class select_dump :public select_to_file { public: select_dump(THD *thd_arg, sql_exchange *ex): select_to_file(thd_arg, ex) {} - int prepare(List &list, SELECT_LEX_UNIT *u); - int send_data(List &items); + int prepare(List &list, SELECT_LEX_UNIT *u) override; + int send_data(List &items) override; }; @@ -6260,17 +6358,17 @@ List *update_values, enum_duplicates duplic, bool ignore, select_result *sel_ret_list); ~select_insert(); - int prepare(List &list, SELECT_LEX_UNIT *u); - virtual int prepare2(JOIN *join); - virtual int send_data(List &items); + int prepare(List &list, SELECT_LEX_UNIT *u) override; + int prepare2(JOIN *join) override; + int send_data(List &items) override; virtual bool store_values(List &values); virtual bool can_rollback_data() { return 0; } bool prepare_eof(); bool send_ok_packet(); - bool send_eof(); - virtual void abort_result_set(); + bool send_eof() override; + void abort_result_set() override; /* not implemented: select_insert is never re-used in prepared statements */ - void cleanup(); + void cleanup() override; }; @@ -6305,18 +6403,18 @@ bzero(&ddl_log_state_create, sizeof(ddl_log_state_create)); bzero(&ddl_log_state_rm, sizeof(ddl_log_state_rm)); } - int prepare(List &list, SELECT_LEX_UNIT *u); + int prepare(List &list, SELECT_LEX_UNIT *u) override; int binlog_show_create_table(TABLE **tables, uint count); - bool store_values(List &values); - bool send_eof(); - virtual void abort_result_set(); - virtual bool can_rollback_data() { return 1; } + bool store_values(List &values) override; + bool send_eof() override; + void abort_result_set() override; + bool can_rollback_data() override { return 1; } // Needed for access from local class MY_HOOKS in prepare(), since thd is proteted. const THD *get_thd(void) { return thd; } const HA_CREATE_INFO *get_create_info() { return create_info; }; - int prepare2(JOIN *join) { return 0; } + int prepare2(JOIN *join) override { return 0; } private: TABLE *create_table_from_items(THD *thd, @@ -6478,7 +6576,7 @@ init(); tmp_table_param.init(); } - int prepare(List &list, SELECT_LEX_UNIT *u); + int prepare(List &list, SELECT_LEX_UNIT *u) override; /** Do prepare() and prepare2() if they have been postponed until column type information is computed (used by select_union_direct). @@ -6489,13 +6587,13 @@ */ virtual bool postponed_prepare(List &types) { return false; } - int send_data(List &items); + int send_data(List &items) override; int write_record(); int update_counter(Field *counter, longlong value); int delete_record(); - bool send_eof(); + bool send_eof() override; virtual bool flush(); - void cleanup(); + void cleanup() override; virtual bool create_result_table(THD *thd, List *column_types, bool is_distinct, ulonglong options, const LEX_CSTRING *alias, @@ -6622,11 +6720,11 @@ curr_op_type(UNSPECIFIED) { }; - int send_data(List &items); - void change_select(); + int send_data(List &items) override; + void change_select() override; int unfold_record(ha_rows cnt); - bool send_eof(); - bool force_enable_index_if_needed() + bool send_eof() override; + bool force_enable_index_if_needed() override { is_index_enabled= true; return true; @@ -6683,15 +6781,15 @@ row_counter(0) { incr_table_param.init(); }; - int send_data(List &items); + int send_data(List &items) override; bool create_result_table(THD *thd, List *column_types, bool is_distinct, ulonglong options, const LEX_CSTRING *alias, bool bit_fields_as_long, bool create_table, bool keep_row_order, - uint hidden); - void cleanup(); + uint hidden) override; + void cleanup() override; }; /** @@ -6738,30 +6836,30 @@ done_send_result_set_metadata(false), done_initialize_tables(false), limit_found_rows(0) { send_records= 0; } - bool change_result(select_result *new_result); - uint field_count(List &fields) const + bool change_result(select_result *new_result) override; + uint field_count(List &fields) const override { // Only called for top-level select_results, usually select_send DBUG_ASSERT(false); /* purecov: inspected */ return 0; /* purecov: inspected */ } - bool postponed_prepare(List &types); - bool send_result_set_metadata(List &list, uint flags); - int send_data(List &items); - bool initialize_tables (JOIN *join); - bool send_eof(); - bool flush() { return false; } - bool check_simple_select() const + bool postponed_prepare(List &types) override; + bool send_result_set_metadata(List &list, uint flags) override; + int send_data(List &items) override; + bool initialize_tables (JOIN *join) override; + bool send_eof() override; + bool flush() override { return false; } + bool check_simple_select() const override { /* Only called for top-level select_results, usually select_send */ DBUG_ASSERT(false); /* purecov: inspected */ return false; /* purecov: inspected */ } - void abort_result_set() + void abort_result_set() override { result->abort_result_set(); /* purecov: inspected */ } - void cleanup() + void cleanup() override { send_records= 0; } @@ -6779,7 +6877,11 @@ // EXPLAIN should never output to a select_union_direct DBUG_ASSERT(false); /* purecov: inspected */ } +#ifdef EMBEDDED_LIBRARY + void begin_dataset() override +#else void begin_dataset() +#endif { // Only called for sp_cursor::Select_fetch_into_spvars DBUG_ASSERT(false); /* purecov: inspected */ @@ -6795,8 +6897,8 @@ public: select_subselect(THD *thd_arg, Item_subselect *item_arg): select_result_interceptor(thd_arg), item(item_arg) {} - int send_data(List &items)=0; - bool send_eof() { return 0; }; + int send_data(List &items) override=0; + bool send_eof() override { return 0; }; }; /* Single value subselect interface class */ @@ -6806,7 +6908,7 @@ select_singlerow_subselect(THD *thd_arg, Item_subselect *item_arg): select_subselect(thd_arg, item_arg) {} - int send_data(List &items); + int send_data(List &items) override; }; @@ -6857,10 +6959,10 @@ bool bit_fields_as_long, bool create_table, bool keep_row_order, - uint hidden); + uint hidden) override; bool init_result_table(ulonglong select_options); - int send_data(List &items); - void cleanup(); + int send_data(List &items) override; + void cleanup() override; ha_rows get_null_count_of_col(uint idx) { DBUG_ASSERT(idx < table->s->fields); @@ -6893,8 +6995,8 @@ bool mx, bool all): select_subselect(thd_arg, item_arg), cache(0), fmax(mx), is_all(all) {} - void cleanup(); - int send_data(List &items); + void cleanup() override; + int send_data(List &items) override; bool cmp_real(); bool cmp_int(); bool cmp_decimal(); @@ -6909,7 +7011,7 @@ public: select_exists_subselect(THD *thd_arg, Item_subselect *item_arg): select_subselect(thd_arg, item_arg) {} - int send_data(List &items); + int send_data(List &items) override; }; @@ -7118,7 +7220,7 @@ // this is needed for user_vars hash -class user_var_entry +class user_var_entry: public Type_handler_hybrid_field_type { CHARSET_INFO *m_charset; public: @@ -7127,8 +7229,6 @@ char *value; size_t length; query_id_t update_query_id, used_query_id; - Item_result type; - bool unsigned_flag; double val_real(bool *null_value); longlong val_int(bool *null_value) const; @@ -7168,15 +7268,15 @@ public: multi_delete(THD *thd_arg, TABLE_LIST *dt, uint num_of_tables); ~multi_delete(); - int prepare(List &list, SELECT_LEX_UNIT *u); - int send_data(List &items); - bool initialize_tables (JOIN *join); + int prepare(List &list, SELECT_LEX_UNIT *u) override; + int send_data(List &items) override; + bool initialize_tables (JOIN *join) override; int do_deletes(); int do_table_deletes(TABLE *table, SORT_INFO *sort_info, bool ignore); - bool send_eof(); + bool send_eof() override; inline ha_rows num_deleted() const { return deleted; } - virtual void abort_result_set(); - void prepare_to_read_rows(); + void abort_result_set() override; + void prepare_to_read_rows() override; }; @@ -7223,17 +7323,17 @@ enum_duplicates handle_duplicates, bool ignore); ~multi_update(); bool init(THD *thd); - int prepare(List &list, SELECT_LEX_UNIT *u); - int send_data(List &items); - bool initialize_tables (JOIN *join); - int prepare2(JOIN *join); + int prepare(List &list, SELECT_LEX_UNIT *u) override; + int send_data(List &items) override; + bool initialize_tables (JOIN *join) override; + int prepare2(JOIN *join) override; int do_updates(); - bool send_eof(); + bool send_eof() override; inline ha_rows num_found() const { return found; } inline ha_rows num_updated() const { return updated; } - virtual void abort_result_set(); - void update_used_tables(); - void prepare_to_read_rows(); + void abort_result_set() override; + void update_used_tables() override; + void prepare_to_read_rows() override; }; class my_var_sp; @@ -7265,8 +7365,8 @@ m_rcontext_handler(rcontext_handler), m_type_handler(type_handler), offset(o), sp(s) { } ~my_var_sp() = default; - bool set(THD *thd, Item *val); - my_var_sp *get_my_var_sp() { return this; } + bool set(THD *thd, Item *val) override; + my_var_sp *get_my_var_sp() override { return this; } const Type_handler *type_handler() const { return m_type_handler; } sp_rcontext *get_rcontext(sp_rcontext *local_ctx) const; @@ -7287,7 +7387,7 @@ &type_handler_double/*Not really used*/, s), m_field_offset(field_idx) { } - bool set(THD *thd, Item *val); + bool set(THD *thd, Item *val) override; }; class my_var_user: public my_var { @@ -7295,7 +7395,7 @@ my_var_user(const LEX_CSTRING *j) : my_var(j, SESSION_VAR) { } ~my_var_user() = default; - bool set(THD *thd, Item *val); + bool set(THD *thd, Item *val) override; }; class select_dumpvar :public select_result_interceptor { @@ -7308,11 +7408,11 @@ :select_result_interceptor(thd_arg), row_count(0), m_var_sp_row(NULL) { var_list.empty(); } ~select_dumpvar() = default; - int prepare(List &list, SELECT_LEX_UNIT *u); - int send_data(List &items); - bool send_eof(); - virtual bool check_simple_select() const; - void cleanup(); + int prepare(List &list, SELECT_LEX_UNIT *u) override; + int send_data(List &items) override; + bool send_eof() override; + bool check_simple_select() const override; + void cleanup() override; }; /* Bits in sql_command_flags */ @@ -7809,6 +7909,66 @@ }; +class Identifier_chain2 +{ + LEX_CSTRING m_name[2]; +public: + Identifier_chain2() + :m_name{Lex_cstring(), Lex_cstring()} + { } + Identifier_chain2(const LEX_CSTRING &a, const LEX_CSTRING &b) + :m_name{a, b} + { } + + const LEX_CSTRING& operator [] (size_t i) const + { + return m_name[i]; + } + + static Identifier_chain2 split(const LEX_CSTRING &txt) + { + DBUG_ASSERT(txt.str[txt.length] == '\0'); // Expect 0-terminated input + const char *dot= strchr(txt.str, '.'); + if (!dot) + return Identifier_chain2(Lex_cstring(), txt); + size_t length0= dot - txt.str; + Lex_cstring name0(txt.str, length0); + Lex_cstring name1(txt.str + length0 + 1, txt.length - length0 - 1); + return Identifier_chain2(name0, name1); + } + + // Export as a qualified name string: 'db.name' + size_t make_qname(char *dst, size_t dstlen, bool casedn_part1) const + { + size_t res= my_snprintf(dst, dstlen, "%.*s.%.*s", + (int) m_name[0].length, m_name[0].str, + (int) m_name[1].length, m_name[1].str); + if (casedn_part1 && dstlen > m_name[0].length) + my_casedn_str(system_charset_info, dst + m_name[0].length + 1); + return res; + } + + // Export as a qualified name string, allocate on mem_root. + LEX_CSTRING make_qname(MEM_ROOT *mem_root, bool casedn_part1) const + { + LEX_STRING dst; + /* format: [pkg + dot] + name + '\0' */ + size_t dst_size= m_name[0].length + 1 /*dot*/ + m_name[1].length + 1/*\0*/; + if (unlikely(!(dst.str= (char*) alloc_root(mem_root, dst_size)))) + return {NULL, 0}; + if (!m_name[0].length) + { + DBUG_ASSERT(!casedn_part1); // Should not be called this way + dst.length= my_snprintf(dst.str, dst_size, "%.*s", + (int) m_name[1].length, m_name[1].str); + return {dst.str, dst.length}; + } + dst.length= make_qname(dst.str, dst_size, casedn_part1); + return {dst.str, dst.length}; + } +}; + + /** This class resembles the SQL Standard schema qualified object name: ::= [ ] @@ -7849,41 +8009,16 @@ void copy(MEM_ROOT *mem_root, const LEX_CSTRING &db, const LEX_CSTRING &name); - static Database_qualified_name split(const LEX_CSTRING &txt) - { - DBUG_ASSERT(txt.str[txt.length] == '\0'); // Expect 0-terminated input - const char *dot= strchr(txt.str, '.'); - if (!dot) - return Database_qualified_name(NULL, 0, txt.str, txt.length); - size_t dblen= dot - txt.str; - Lex_cstring db(txt.str, dblen); - Lex_cstring name(txt.str + dblen + 1, txt.length - dblen - 1); - return Database_qualified_name(db, name); - } - // Export db and name as a qualified name string: 'db.name' - size_t make_qname(char *dst, size_t dstlen) const + size_t make_qname(char *dst, size_t dstlen, bool casedn_name) const { - return my_snprintf(dst, dstlen, "%.*s.%.*s", - (int) m_db.length, m_db.str, - (int) m_name.length, m_name.str); + return Identifier_chain2(m_db, m_name).make_qname(dst, dstlen, casedn_name); } // Export db and name as a qualified name string, allocate on mem_root. - bool make_qname(MEM_ROOT *mem_root, LEX_CSTRING *dst) const + LEX_CSTRING make_qname(MEM_ROOT *mem_root, bool casedn_name) const { - const uint dot= !!m_db.length; - char *tmp; - /* format: [database + dot] + name + '\0' */ - dst->length= m_db.length + dot + m_name.length; - if (unlikely(!(dst->str= tmp= (char*) alloc_root(mem_root, - dst->length + 1)))) - return true; - snprintf(tmp, dst->length + 1, "%.*s%.*s%.*s", - (int) m_db.length, (m_db.length ? m_db.str : ""), - dot, ".", - (int) m_name.length, m_name.str); DBUG_SLOW_ASSERT(ok_for_lower_case_names(m_db.str)); - return false; + return Identifier_chain2(m_db, m_name).make_qname(mem_root, casedn_name); } bool make_package_routine_name(MEM_ROOT *mem_root, @@ -7894,9 +8029,8 @@ size_t length= package.length + 1 + routine.length + 1; if (unlikely(!(tmp= (char *) alloc_root(mem_root, length)))) return true; - m_name.length= my_snprintf(tmp, length, "%.*s.%.*s", - (int) package.length, package.str, - (int) routine.length, routine.str); + m_name.length= Identifier_chain2(package, routine).make_qname(tmp, length, + false); m_name.str= tmp; return false; } @@ -7925,7 +8059,7 @@ { } LEX_CSTRING lex_cstring() const override { - size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer)); + size_t length= m_name->make_qname(err_buffer, sizeof(err_buffer), false); return {err_buffer, length}; } }; @@ -7943,10 +8077,11 @@ m_maybe_null(false) { } - void set_type_maybe_null(bool maybe_null_arg) { m_maybe_null= maybe_null_arg; } + void set_type_maybe_null(bool maybe_null_arg) override + { m_maybe_null= maybe_null_arg; } bool get_maybe_null() const { return m_maybe_null; } - decimal_digits_t decimal_precision() const + decimal_digits_t decimal_precision() const override { /* Type_holder is not used directly to create fields, so @@ -7958,11 +8093,11 @@ DBUG_ASSERT(0); return 0; } - void set_typelib(const TYPELIB *typelib) + void set_typelib(const TYPELIB *typelib) override { m_typelib= typelib; } - const TYPELIB *get_typelib() const + const TYPELIB *get_typelib() const override { return m_typelib; } @@ -8104,6 +8239,10 @@ void setup_tmp_table_column_bitmaps(TABLE *table, uchar *bitmaps, uint field_count); +C_MODE_START +void mariadb_sleep_for_space(unsigned int seconds); +C_MODE_END + #ifdef WITH_WSREP extern void wsrep_to_isolation_end(THD*); #endif diff -Nru mariadb-10.11.6/sql/sql_cmd.h mariadb-10.11.9/sql/sql_cmd.h --- mariadb-10.11.6/sql/sql_cmd.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_cmd.h 2024-08-03 07:29:59.000000000 +0000 @@ -220,9 +220,9 @@ :show_all_slaves_status(status_all) {} - enum_sql_command sql_command_code() const { return SQLCOM_SHOW_SLAVE_STAT; } + enum_sql_command sql_command_code() const override { return SQLCOM_SHOW_SLAVE_STAT; } - bool execute(THD *thd); + bool execute(THD *thd) override; bool is_show_all_slaves_stat() { return show_all_slaves_status; } }; @@ -231,20 +231,20 @@ public Storage_engine_name { public: - Storage_engine_name *option_storage_engine_name() { return this; } - bool execute(THD *thd); + Storage_engine_name *option_storage_engine_name() override { return this; } + bool execute(THD *thd) override; }; class Sql_cmd_create_table: public Sql_cmd_create_table_like { public: - enum_sql_command sql_command_code() const { return SQLCOM_CREATE_TABLE; } + enum_sql_command sql_command_code() const override { return SQLCOM_CREATE_TABLE; } }; class Sql_cmd_create_sequence: public Sql_cmd_create_table_like { public: - enum_sql_command sql_command_code() const { return SQLCOM_CREATE_SEQUENCE; } + enum_sql_command sql_command_code() const override { return SQLCOM_CREATE_SEQUENCE; } }; @@ -268,9 +268,9 @@ @param thd the current thread. @return false on success. */ - bool execute(THD *thd); + bool execute(THD *thd) override; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_CALL; } diff -Nru mariadb-10.11.6/sql/sql_connect.cc mariadb-10.11.9/sql/sql_connect.cc --- mariadb-10.11.6/sql/sql_connect.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_connect.cc 2024-08-03 07:29:59.000000000 +0000 @@ -509,7 +509,8 @@ void init_global_table_stats(void) { - my_hash_init(PSI_INSTRUMENT_ME, &global_table_stats, system_charset_info, + my_hash_init(PSI_INSTRUMENT_ME, &global_table_stats, + Lex_ident_fs::charset_info(), max_connections, 0, 0, (my_hash_get_key) get_key_table_stats, (my_hash_free_key) free_table_stats, 0); } @@ -528,7 +529,8 @@ void init_global_index_stats(void) { - my_hash_init(PSI_INSTRUMENT_ME, &global_index_stats, system_charset_info, + my_hash_init(PSI_INSTRUMENT_ME, &global_index_stats, + Lex_ident_fs::charset_info(), max_connections, 0, 0, (my_hash_get_key) get_key_index_stats, (my_hash_free_key) free_index_stats, 0); } @@ -986,7 +988,7 @@ /* See RFC 5737, 192.0.2.0/24 is reserved. */ const char* fake= "192.0.2.4"; inet_pton(AF_INET,fake, ip4); - strcpy(ip, fake); + safe_strcpy(ip, sizeof(ip), fake); peer_rc= 0; } ); @@ -1016,7 +1018,7 @@ ip6->s6_addr[13] = 0x06; ip6->s6_addr[14] = 0x00; ip6->s6_addr[15] = 0x06; - strcpy(ip, fake); + safe_strcpy(ip, sizeof(ip), fake); peer_rc= 0; } ); @@ -1240,8 +1242,7 @@ embedded server library. TODO: refactor this to avoid code duplication there */ - thd->proc_info= 0; - thd->set_command(COM_SLEEP); + thd->mark_connection_idle(); thd->init_for_queries(); if (opt_init_connect.length && @@ -1275,7 +1276,7 @@ thd->thread_id, thd->db.str ? thd->db.str : "unconnected", sctx->user ? sctx->user : "unauthenticated", - sctx->host_or_ip, "init_connect command failed"); + sctx->host_or_ip, "", "init_connect command failed"); thd->server_status&= ~SERVER_STATUS_CLEAR_SET; thd->protocol->end_statement(); thd->killed = KILL_CONNECTION; diff -Nru mariadb-10.11.6/sql/sql_cte.cc mariadb-10.11.9/sql/sql_cte.cc --- mariadb-10.11.6/sql/sql_cte.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_cte.cc 2024-08-03 07:29:59.000000000 +0000 @@ -106,6 +106,7 @@ @param tables Points to the beginning of the sub-chain @param tables_last Points to the address with the sub-chain barrier + @param excl_spec Ignore the definition with this spec @details The method resolves tables references to CTE from the chain of @@ -147,7 +148,8 @@ */ bool LEX::resolve_references_to_cte(TABLE_LIST *tables, - TABLE_LIST **tables_last) + TABLE_LIST **tables_last, + st_select_lex_unit *excl_spec) { With_element *with_elem= 0; @@ -156,7 +158,8 @@ if (tbl->derived) continue; if (!tbl->db.str && !tbl->with) - tbl->with= tbl->select_lex->find_table_def_in_with_clauses(tbl); + tbl->with= tbl->select_lex->find_table_def_in_with_clauses(tbl, + excl_spec); if (!tbl->with) // no CTE matches table reference tbl { if (only_cte_resolution) @@ -244,7 +247,7 @@ return true; if (!with_cte_resolution) return false; - if (resolve_references_to_cte(query_tables, query_tables_last)) + if (resolve_references_to_cte(query_tables, query_tables_last, NULL)) return true; return false; } @@ -388,6 +391,7 @@ @param table The reference to the table that is looked for @param barrier The barrier with element for the search + @param excl_spec Ignore the definition with this spec @details The function looks through the elements of this with clause trying to find @@ -401,12 +405,15 @@ */ With_element *With_clause::find_table_def(TABLE_LIST *table, - With_element *barrier) + With_element *barrier, + st_select_lex_unit *excl_spec) { for (With_element *with_elem= with_list.first; with_elem != barrier; with_elem= with_elem->next) { + if (excl_spec && with_elem->spec == excl_spec) + continue; if (my_strcasecmp(system_charset_info, with_elem->get_name_str(), table->table_name.str) == 0 && !table->is_fqtn) @@ -466,7 +473,7 @@ top_unit->with_element && top_unit->with_element->get_owner() == with_clause) barrier= top_unit->with_element; - found= with_clause->find_table_def(tbl, barrier); + found= with_clause->find_table_def(tbl, barrier, NULL); if (found) break; } @@ -521,10 +528,11 @@ { With_clause *with_clause= sl->master_unit()->with_clause; if (with_clause) - tbl->with= with_clause->find_table_def(tbl, NULL); + tbl->with= with_clause->find_table_def(tbl, NULL, NULL); if (!tbl->with) tbl->with= owner->find_table_def(tbl, - owner->with_recursive ? NULL : this); + owner->with_recursive ? NULL : this, + NULL); } if (!tbl->with) tbl->with= find_table_def_in_with_clauses(tbl, ctxt); @@ -643,6 +651,8 @@ { check_dependencies_in_select(sl, &unit_ctxt_elem, in_subq, dep_map); } + if ((sl= unit->fake_select_lex)) + check_dependencies_in_select(sl, &unit_ctxt_elem, in_subq, dep_map); } @@ -1099,7 +1109,8 @@ */ lex->only_cte_resolution= old_lex->only_cte_resolution; if (lex->resolve_references_to_cte(lex->query_tables, - lex->query_tables_last)) + lex->query_tables_last, + spec)) { res= NULL; goto err; @@ -1199,7 +1210,7 @@ /* Rename the columns of the first select in the unit */ while ((item= it++, name= nm++)) { - item->set_name(thd, *name); + lex_string_set(&item->name, name->str); item->base_flags|= item_base_t::IS_EXPLICIT_NAME; } @@ -1279,14 +1290,14 @@ sl= sl->next_select()) sl->context.outer_context= 0; + uint8 save_context_analysys_only= thd->lex->context_analysis_only; thd->lex->context_analysis_only|= CONTEXT_ANALYSIS_ONLY_DERIVED; if (!spec->prepared && (spec->prepare(spec->derived, 0, 0) || process_columns_of_derived_unit(thd, spec) || check_duplicate_names(thd, first_sl->item_list, 1))) rc= true; - - thd->lex->context_analysis_only&= ~CONTEXT_ANALYSIS_ONLY_DERIVED; + thd->lex->context_analysis_only= save_context_analysys_only; return rc; } @@ -1302,6 +1313,7 @@ Search for the definition of the given table referred in this select node @param table reference to the table whose definition is searched for + @param excl_spec ignore the definition with this spec @details The method looks for the definition of the table whose reference is occurred @@ -1314,7 +1326,8 @@ NULL - otherwise */ -With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table) +With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table, + st_select_lex_unit *excl_spec) { With_element *found= NULL; With_clause *containing_with_clause= NULL; @@ -1331,7 +1344,7 @@ With_clause *attached_with_clause= sl->get_with_clause(); if (attached_with_clause && attached_with_clause != containing_with_clause && - (found= attached_with_clause->find_table_def(table, NULL))) + (found= attached_with_clause->find_table_def(table, NULL, excl_spec))) break; master_unit= sl->master_unit(); outer_sl= master_unit->outer_select(); @@ -1341,7 +1354,8 @@ containing_with_clause= with_elem->get_owner(); With_element *barrier= containing_with_clause->with_recursive ? NULL : with_elem; - if ((found= containing_with_clause->find_table_def(table, barrier))) + if ((found= containing_with_clause->find_table_def(table, barrier, + excl_spec))) break; if (outer_sl && !outer_sl->get_with_element()) break; diff -Nru mariadb-10.11.6/sql/sql_cte.h mariadb-10.11.9/sql/sql_cte.h --- mariadb-10.11.6/sql/sql_cte.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_cte.h 2024-08-03 07:29:59.000000000 +0000 @@ -325,7 +325,8 @@ friend bool LEX::resolve_references_to_cte(TABLE_LIST *tables, - TABLE_LIST **tables_last); + TABLE_LIST **tables_last, + st_select_lex_unit *excl_spec); }; const uint max_number_of_elements_in_with_clause= sizeof(table_map)*8; @@ -425,7 +426,8 @@ void move_anchors_ahead(); - With_element *find_table_def(TABLE_LIST *table, With_element *barrier); + With_element *find_table_def(TABLE_LIST *table, With_element *barrier, + st_select_lex_unit *excl_spec); With_element *find_table_def_in_with_clauses(TABLE_LIST *table); diff -Nru mariadb-10.11.6/sql/sql_cursor.cc mariadb-10.11.9/sql/sql_cursor.cc --- mariadb-10.11.6/sql/sql_cursor.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_cursor.cc 2024-08-03 07:29:59.000000000 +0000 @@ -49,15 +49,15 @@ Materialized_cursor(select_result *result, TABLE *table); int send_result_set_metadata(THD *thd, List &send_result_set_metadata); - virtual bool is_open() const { return table != 0; } - virtual int open(JOIN *join __attribute__((unused))); - virtual void fetch(ulong num_rows); - virtual void close(); - bool export_structure(THD *thd, Row_definition_list *defs) + bool is_open() const override { return table != 0; } + int open(JOIN *join __attribute__((unused))) override; + void fetch(ulong num_rows) override; + void close() override; + bool export_structure(THD *thd, Row_definition_list *defs) override { return table->export_structure(thd, defs); } - virtual ~Materialized_cursor(); + ~Materialized_cursor() override; void on_table_fill_finished(); }; @@ -79,9 +79,9 @@ Materialized_cursor *materialized_cursor; Select_materialize(THD *thd_arg, select_result *result_arg): select_unit(thd_arg), result(result_arg), materialized_cursor(0) {} - virtual bool send_result_set_metadata(List &list, uint flags); - bool send_eof() { return false; } - bool view_structure_only() const + bool send_result_set_metadata(List &list, uint flags) override; + bool send_eof() override { return false; } + bool view_structure_only() const override { return result->view_structure_only(); } diff -Nru mariadb-10.11.6/sql/sql_db.cc mariadb-10.11.9/sql/sql_db.cc --- mariadb-10.11.6/sql/sql_db.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_db.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1089,8 +1089,7 @@ Disable drop of enabled log tables, must be done before name locking. This check is only needed if we are dropping the "mysql" database. */ - if ((rm_mysql_schema= - (my_strcasecmp(system_charset_info, MYSQL_SCHEMA_NAME.str, db->str) == 0))) + if ((rm_mysql_schema= MYSQL_SCHEMA_NAME.streq(*db))) { for (table= tables; table; table= table->next_local) if (check_if_log_table(table, TRUE, "DROP")) diff -Nru mariadb-10.11.6/sql/sql_delete.cc mariadb-10.11.9/sql/sql_delete.cc --- mariadb-10.11.6/sql/sql_delete.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_delete.cc 2024-08-03 07:29:59.000000000 +0000 @@ -263,7 +263,10 @@ res= src->save_in_field(table->field[dst_fieldno], true); if (likely(!res)) + { + table->period_prepare_autoinc(); res= table->update_generated_fields(); + } if(likely(!res)) res= table->file->ha_update_row(table->record[1], table->record[0]); @@ -534,7 +537,8 @@ select=make_select(table, 0, 0, conds, (SORT_INFO*) 0, 0, &error); if (unlikely(error)) DBUG_RETURN(TRUE); - if ((select && select->check_quick(thd, safe_update, limit)) || !limit) + if ((select && select->check_quick(thd, safe_update, limit, + Item_func::BITMAP_ALL)) || !limit) { query_plan.set_impossible_where(); if (thd->lex->describe || thd->lex->analyze_stmt) @@ -1268,6 +1272,13 @@ { TABLE_LIST *tbl= walk->correspondent_table->find_table_for_update(); tables_to_delete_from|= tbl->table->map; + + /* + Ensure that filesort re-reads the row from the engine before + delete is called. + */ + join->map2table[tbl->table->tablenr]->keep_current_rowid= true; + if (delete_while_scanning && unique_table(thd, tbl, join->tables_list, 0)) { diff -Nru mariadb-10.11.6/sql/sql_derived.cc mariadb-10.11.9/sql/sql_derived.cc --- mariadb-10.11.6/sql/sql_derived.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_derived.cc 2024-08-03 07:29:59.000000000 +0000 @@ -431,7 +431,7 @@ derived->on_expr= expr; derived->prep_on_expr= expr->copy_andor_structure(thd); } - thd->where= "on clause"; + thd->where= THD_WHERE::ON_CLAUSE; if (derived->on_expr && derived->on_expr->fix_fields_if_needed_for_bool(thd, &derived->on_expr)) { @@ -1217,8 +1217,12 @@ (derived->alias.str ? derived->alias.str : ""), derived->get_unit())); - if (unit->executed && !unit->uncacheable && !unit->describe && - !derived_is_recursive) + /* + Only fill derived tables once, unless the derived table is dependent in + which case we will delete all of its rows and refill it below. + */ + if (unit->executed && !(unit->uncacheable & UNCACHEABLE_DEPENDENT) && + !unit->describe && !derived_is_recursive) DBUG_RETURN(FALSE); /*check that table creation passed without problems. */ DBUG_ASSERT(derived->table && derived->table->is_created()); @@ -1233,7 +1237,9 @@ /* Execute the query that specifies the derived table by a foreign engine */ res= derived->pushdown_derived->execute(); unit->executed= true; + if (res) DBUG_RETURN(res); + goto after_exec; } if (unit->executed && !derived_is_recursive && @@ -1243,6 +1249,9 @@ goto err; JOIN *join= unit->first_select()->join; join->first_record= false; + if (join->zero_result_cause) + goto err; + for (uint i= join->top_join_tab_count; i < join->top_join_tab_count + join->aggr_tables; i++) @@ -1272,6 +1281,7 @@ } else { + DBUG_ASSERT(!unit->executed || (unit->uncacheable & UNCACHEABLE_DEPENDENT)); SELECT_LEX *first_select= unit->first_select(); unit->set_limit(unit->global_parameters()); if (unit->lim.is_unlimited()) @@ -1291,6 +1301,7 @@ derived_result, unit, first_select); } + after_exec: if (!res && !derived_is_recursive) { if (derived_result->flush()) @@ -1351,6 +1362,10 @@ derived->get_unit())); st_select_lex_unit *unit= derived->get_unit(); + // reset item names to that saved after wildcard expansion in JOIN::prepare + for(st_select_lex *sl= unit->first_select(); sl; sl= sl->next_select()) + sl->restore_item_list_names(); + derived->merged_for_insert= FALSE; unit->unclean(); unit->types.empty(); @@ -1559,6 +1574,7 @@ if (sl != first_sl) { DBUG_ASSERT(sl->item_list.elements == first_sl->item_list.elements); + sl->save_item_list_names(thd); List_iterator_fast it(sl->item_list); List_iterator_fast nm_it(unit->types); while (Item *item= it++) diff -Nru mariadb-10.11.6/sql/sql_explain.cc mariadb-10.11.9/sql/sql_explain.cc --- mariadb-10.11.6/sql/sql_explain.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_explain.cc 2024-08-03 07:29:59.000000000 +0000 @@ -24,6 +24,7 @@ #include "my_json_writer.h" #include "opt_range.h" #include "sql_expression_cache.h" +#include "item_subselect.h" #include @@ -234,6 +235,9 @@ int Explain_query::print_explain(select_result_sink *output, uint8 explain_flags, bool is_analyze) { + /* A sanity check for ANALYZE: */ + DBUG_ASSERT(timer_tracker_frequency() != 0.0); + if (upd_del_plan) { upd_del_plan->print_explain(this, output, explain_flags, is_analyze); @@ -855,6 +859,18 @@ } +bool Explain_node::print_explain_json_subq_materialization(Json_writer *writer, + bool is_analyze) +{ + if (subq_materialization) + { + subq_materialization->print_explain_json(writer, is_analyze); + return true; + } + return false; +} + + Explain_basic_join::~Explain_basic_join() { if (join_tabs) @@ -1002,6 +1018,8 @@ Json_writer_nesting_guard guard(writer); bool started_cache= print_explain_json_cache(writer, is_analyze); + bool started_subq_mat= print_explain_json_subq_materialization(writer, + is_analyze); if (message || select_type == pushed_derived_text || @@ -1111,6 +1129,8 @@ writer->end_object(); } + if (started_subq_mat) + writer->end_object(); if (started_cache) writer->end_object(); } @@ -1812,7 +1832,9 @@ writer->add_member("pages_read_count").add_ull(hs->pages_read_count); if (hs->pages_read_time) writer->add_member("pages_read_time_ms"). - add_double(hs->pages_read_time / 1000.0); + add_double(hs->pages_read_time * 1000. / timer_tracker_frequency()); + if (hs->pages_prefetched) + writer->add_member("pages_prefetch_read_count").add_ull(hs->pages_prefetched); if (hs->undo_records_read) writer->add_member("old_rows_read").add_ull(hs->undo_records_read); writer->end_object(); @@ -2843,3 +2865,41 @@ writer->end_object(); } } + + +void Explain_subq_materialization::print_explain_json(Json_writer *writer, + bool is_analyze) +{ + writer->add_member("materialization").start_object(); + if (is_analyze) + tracker.print_json_members(writer); +} + + +void Subq_materialization_tracker::print_json_members(Json_writer *writer) const +{ + writer->add_member("r_strategy").add_str(get_exec_strategy()); + if (loops_count) + writer->add_member("r_loops").add_ull(loops_count); + + if (index_lookups_count) + writer->add_member("r_index_lookups").add_ull(index_lookups_count); + + if (partial_matches_count) + writer->add_member("r_partial_matches").add_ull(partial_matches_count); + + if (partial_match_buffer_size) + { + writer->add_member("r_partial_match_buffer_size"). + add_size(partial_match_buffer_size); + } + + if (partial_match_array_sizes.elements()) + { + writer->add_member("r_partial_match_array_sizes").start_array(); + for(size_t i= 0; i < partial_match_array_sizes.elements(); i++) + writer->add_ull(partial_match_array_sizes[i]); + writer->end_array(); + } +} + diff -Nru mariadb-10.11.6/sql/sql_explain.h mariadb-10.11.9/sql/sql_explain.h --- mariadb-10.11.6/sql/sql_explain.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_explain.h 2024-08-03 07:29:59.000000000 +0000 @@ -84,6 +84,7 @@ public: Explain_node(MEM_ROOT *root) : cache_tracker(NULL), + subq_materialization(NULL), connection_type(EXPLAIN_NODE_OTHER), children(root) {} @@ -113,6 +114,12 @@ */ Expression_cache_tracker* cache_tracker; + /** + If not NULL, this node is a SELECT (or UNION) in a materialized + IN-subquery. + */ + Explain_subq_materialization* subq_materialization; + /* How this node is connected to its parent. (NOTE: EXPLAIN_NODE_NON_MERGED_SJ is set very late currently) @@ -141,6 +148,8 @@ void print_explain_json_for_children(Explain_query *query, Json_writer *writer, bool is_analyze); bool print_explain_json_cache(Json_writer *writer, bool is_analyze); + bool print_explain_json_subq_materialization(Json_writer *writer, + bool is_analyze); virtual ~Explain_node() = default; }; @@ -159,21 +168,21 @@ class Explain_basic_join : public Explain_node { public: - enum explain_node_type get_type() { return EXPLAIN_BASIC_JOIN; } + enum explain_node_type get_type() override { return EXPLAIN_BASIC_JOIN; } Explain_basic_join(MEM_ROOT *root) : Explain_node(root), join_tabs(NULL) {} ~Explain_basic_join(); bool add_table(Explain_table_access *tab, Explain_query *query); - uint get_select_id() { return select_id; } + uint get_select_id() override { return select_id; } uint select_id; int print_explain(Explain_query *query, select_result_sink *output, - uint8 explain_flags, bool is_analyze); + uint8 explain_flags, bool is_analyze) override; void print_explain_json(Explain_query *query, Json_writer *writer, - bool is_analyze); + bool is_analyze) override; void print_explain_json_interns(Explain_query *query, Json_writer *writer, bool is_analyze); @@ -203,7 +212,7 @@ class Explain_select : public Explain_basic_join { public: - enum explain_node_type get_type() { return EXPLAIN_SELECT; } + enum explain_node_type get_type() override { return EXPLAIN_SELECT; } Explain_select(MEM_ROOT *root, bool is_analyze) : Explain_basic_join(root), @@ -258,9 +267,9 @@ Explain_aggr_node* aggr_tree; int print_explain(Explain_query *query, select_result_sink *output, - uint8 explain_flags, bool is_analyze); + uint8 explain_flags, bool is_analyze) override; void print_explain_json(Explain_query *query, Json_writer *writer, - bool is_analyze); + bool is_analyze) override; Table_access_tracker *get_using_temporary_read_tracker() { @@ -297,7 +306,7 @@ List sort_items; List sort_directions; public: - enum_explain_aggr_node_type get_type() { return AGGR_OP_FILESORT; } + enum_explain_aggr_node_type get_type() override { return AGGR_OP_FILESORT; } Filesort_tracker tracker; Explain_aggr_filesort(MEM_ROOT *mem_root, bool is_analyze, @@ -309,20 +318,20 @@ class Explain_aggr_tmp_table : public Explain_aggr_node { public: - enum_explain_aggr_node_type get_type() { return AGGR_OP_TEMP_TABLE; } + enum_explain_aggr_node_type get_type() override { return AGGR_OP_TEMP_TABLE; } }; class Explain_aggr_remove_dups : public Explain_aggr_node { public: - enum_explain_aggr_node_type get_type() { return AGGR_OP_REMOVE_DUPLICATES; } + enum_explain_aggr_node_type get_type() override { return AGGR_OP_REMOVE_DUPLICATES; } }; class Explain_aggr_window_funcs : public Explain_aggr_node { List sorts; public: - enum_explain_aggr_node_type get_type() { return AGGR_OP_WINDOW_FUNCS; } + enum_explain_aggr_node_type get_type() override { return AGGR_OP_WINDOW_FUNCS; } void print_json_members(Json_writer *writer, bool is_analyze); friend class Window_funcs_computation; @@ -349,10 +358,10 @@ fake_select_lex_explain(root, is_analyze) {} - enum explain_node_type get_type() { return EXPLAIN_UNION; } + enum explain_node_type get_type() override { return EXPLAIN_UNION; } unit_common_op operation; - uint get_select_id() + uint get_select_id() override { DBUG_ASSERT(union_members.elements() > 0); return union_members.at(0); @@ -375,9 +384,9 @@ union_members.append(select_no); } int print_explain(Explain_query *query, select_result_sink *output, - uint8 explain_flags, bool is_analyze); + uint8 explain_flags, bool is_analyze) override; void print_explain_json(Explain_query *query, Json_writer *writer, - bool is_analyze); + bool is_analyze) override; const char *fake_select_type; bool using_filesort; @@ -941,8 +950,8 @@ handler_for_stats(NULL) {} - virtual enum explain_node_type get_type() { return EXPLAIN_UPDATE; } - virtual uint get_select_id() { return 1; /* always root */ } + enum explain_node_type get_type() override { return EXPLAIN_UPDATE; } + uint get_select_id() override { return 1; /* always root */ } const char *select_type; @@ -1001,10 +1010,10 @@ /* The same as Explain_table_access::handler_for_stats */ handler *handler_for_stats; - virtual int print_explain(Explain_query *query, select_result_sink *output, - uint8 explain_flags, bool is_analyze); - virtual void print_explain_json(Explain_query *query, Json_writer *writer, - bool is_analyze); + int print_explain(Explain_query *query, select_result_sink *output, + uint8 explain_flags, bool is_analyze) override; + void print_explain_json(Explain_query *query, Json_writer *writer, + bool is_analyze) override; }; @@ -1024,13 +1033,13 @@ StringBuffer<64> table_name; - enum explain_node_type get_type() { return EXPLAIN_INSERT; } - uint get_select_id() { return 1; /* always root */ } + enum explain_node_type get_type() override { return EXPLAIN_INSERT; } + uint get_select_id() override { return 1; /* always root */ } - int print_explain(Explain_query *query, select_result_sink *output, - uint8 explain_flags, bool is_analyze); - void print_explain_json(Explain_query *query, Json_writer *writer, - bool is_analyze); + int print_explain(Explain_query *query, select_result_sink *output, + uint8 explain_flags, bool is_analyze) override; + void print_explain_json(Explain_query *query, Json_writer *writer, + bool is_analyze) override; }; @@ -1051,14 +1060,36 @@ */ bool deleting_all_rows; - virtual enum explain_node_type get_type() { return EXPLAIN_DELETE; } - virtual uint get_select_id() { return 1; /* always root */ } + enum explain_node_type get_type() override { return EXPLAIN_DELETE; } + uint get_select_id() override { return 1; /* always root */ } - virtual int print_explain(Explain_query *query, select_result_sink *output, - uint8 explain_flags, bool is_analyze); - virtual void print_explain_json(Explain_query *query, Json_writer *writer, - bool is_analyze); + int print_explain(Explain_query *query, select_result_sink *output, + uint8 explain_flags, bool is_analyze) override; + void print_explain_json(Explain_query *query, Json_writer *writer, + bool is_analyze) override; }; +/* + EXPLAIN data structure for subquery materialization. + + All decisions are made at execution time so here we just store the tracker + that has all the info. +*/ + +class Explain_subq_materialization : public Sql_alloc +{ +public: + Explain_subq_materialization(MEM_ROOT *mem_root) + : tracker(mem_root) + {} + + Subq_materialization_tracker *get_tracker() { return &tracker; } + + void print_explain_json(Json_writer *writer, bool is_analyze); + +private: + Subq_materialization_tracker tracker; +}; + #endif //SQL_EXPLAIN_INCLUDED diff -Nru mariadb-10.11.6/sql/sql_expression_cache.cc mariadb-10.11.9/sql/sql_expression_cache.cc --- mariadb-10.11.6/sql/sql_expression_cache.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_expression_cache.cc 2024-08-03 07:29:59.000000000 +0000 @@ -272,7 +272,8 @@ } *(items.head_ref())= value; - fill_record(table_thd, cache_table, cache_table->field, items, TRUE, TRUE); + fill_record(table_thd, cache_table, cache_table->field, items, true, true, + true); if (unlikely(table_thd->is_error())) goto err;; diff -Nru mariadb-10.11.6/sql/sql_expression_cache.h mariadb-10.11.9/sql/sql_expression_cache.h --- mariadb-10.11.6/sql/sql_expression_cache.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_expression_cache.h 2024-08-03 07:29:59.000000000 +0000 @@ -113,19 +113,19 @@ public: Expression_cache_tmptable(THD *thd, List &dependants, Item *value); virtual ~Expression_cache_tmptable(); - virtual result check_value(Item **value); - virtual my_bool put_value(Item *value); + result check_value(Item **value) override; + my_bool put_value(Item *value) override; - void print(String *str, enum_query_type query_type); - bool is_inited() { return inited; }; - void init(); + void print(String *str, enum_query_type query_type) override; + bool is_inited() override { return inited; }; + void init() override; void set_tracker(Expression_cache_tracker *st) { tracker= st; update_tracker(); } - virtual void update_tracker() + void update_tracker() override { if (tracker) { diff -Nru mariadb-10.11.6/sql/sql_get_diagnostics.h mariadb-10.11.9/sql/sql_get_diagnostics.h --- mariadb-10.11.6/sql/sql_get_diagnostics.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_get_diagnostics.h 2024-08-03 07:29:59.000000000 +0000 @@ -39,12 +39,12 @@ : m_info(info) {} - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_GET_DIAGNOSTICS; } - virtual bool execute(THD *thd); + bool execute(THD *thd) override; private: /** The information to be obtained. */ @@ -223,7 +223,7 @@ {} /** Obtain statement information in the context of a diagnostics area. */ - bool aggregate(THD *thd, const Diagnostics_area *da); + bool aggregate(THD *thd, const Diagnostics_area *da) override; private: /* List of statement information items. */ @@ -302,7 +302,7 @@ {} /** Obtain condition information in the context of a diagnostics area. */ - bool aggregate(THD *thd, const Diagnostics_area *da); + bool aggregate(THD *thd, const Diagnostics_area *da) override; private: /** diff -Nru mariadb-10.11.6/sql/sql_handler.cc mariadb-10.11.9/sql/sql_handler.cc --- mariadb-10.11.6/sql/sql_handler.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_handler.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1080,10 +1080,9 @@ if (tables->is_anonymous_derived_table()) continue; if ((! tables->db.str[0] || - ! my_strcasecmp(&my_charset_latin1, hash_tables->db.str, - tables->get_db_name())) && - ! my_strcasecmp(&my_charset_latin1, hash_tables->table_name.str, - tables->get_table_name())) + Lex_ident_db(tables->get_db_name()).streq(hash_tables->db)) && + Lex_ident_table(tables->get_table_name()). + streq(hash_tables->table_name)) { /* Link into hash_tables list */ hash_tables->next= head; diff -Nru mariadb-10.11.6/sql/sql_help.cc mariadb-10.11.9/sql/sql_help.cc --- mariadb-10.11.6/sql/sql_help.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_help.cc 2024-08-03 07:29:59.000000000 +0000 @@ -667,7 +667,8 @@ SQL_SELECT *res= make_select(table, 0, 0, cond, 0, 0, error); if (unlikely(*error) || - (likely(res) && unlikely(res->check_quick(thd, 0, HA_POS_ERROR))) || + (likely(res) && unlikely(res->check_quick(thd, 0, HA_POS_ERROR, + Item_func::BITMAP_ALL))) || (likely(res) && res->quick && unlikely(res->quick->reset()))) { delete res; diff -Nru mariadb-10.11.6/sql/sql_insert.cc mariadb-10.11.9/sql/sql_insert.cc --- mariadb-10.11.6/sql/sql_insert.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_insert.cc 2024-08-03 07:29:59.000000000 +0000 @@ -83,6 +83,7 @@ #include "rpl_rli.h" #ifdef WITH_WSREP +#include "wsrep_mysqld.h" /* wsrep_append_table_keys() */ #include "wsrep_trans_observer.h" /* wsrep_start_transction() */ #endif /* WITH_WSREP */ @@ -95,7 +96,8 @@ pthread_handler_t handle_delayed_insert(void *arg); static void unlink_blobs(TABLE *table); #endif -static bool check_view_insertability(THD *thd, TABLE_LIST *view); +static bool check_view_insertability(THD *thd, TABLE_LIST *view, + List &fields); static int binlog_show_create_table_(THD *thd, TABLE *table, Table_specification_st *create_info); @@ -310,7 +312,7 @@ if (check_key_in_view(thd, table_list) || (table_list->view && - check_view_insertability(thd, table_list))) + check_view_insertability(thd, table_list, fields))) { my_error(ER_NON_INSERTABLE_TABLE, MYF(0), table_list->alias.str, "INSERT"); DBUG_RETURN(-1); @@ -591,7 +593,8 @@ Open tables used for sub-selects or in stored functions, will also cache these functions. */ - if (open_and_lock_tables(thd, table_list->next_global, TRUE, + if (table_list->next_global && + open_and_lock_tables(thd, table_list->next_global, TRUE, MYSQL_OPEN_IGNORE_ENGINE_STATS)) { end_delayed_insert(thd); @@ -1050,10 +1053,19 @@ */ restore_record(table,s->default_values); // Get empty record table->reset_default_fields(); + /* + Reset the sentinel thd->bulk_param in order not to consume the next + values of a bound array in case one of statement executed by + the trigger's body is INSERT statement. + */ + void *save_bulk_param= thd->bulk_param; + thd->bulk_param= nullptr; + if (unlikely(fill_record_n_invoke_before_triggers(thd, table, fields, *values, 0, TRG_EVENT_INSERT))) { + thd->bulk_param= save_bulk_param; if (values_list.elements != 1 && ! thd->is_error()) { info.records++; @@ -1067,6 +1079,7 @@ error=1; break; } + thd->bulk_param= save_bulk_param; } else { @@ -1096,12 +1109,22 @@ } } table->reset_default_fields(); + + /* + Reset the sentinel thd->bulk_param in order not to consume the next + values of a bound array in case one of statement executed by + the trigger's body is INSERT statement. + */ + void *save_bulk_param= thd->bulk_param; + thd->bulk_param= nullptr; + if (unlikely(fill_record_n_invoke_before_triggers(thd, table, table-> field_to_fill(), *values, 0, TRG_EVENT_INSERT))) { + thd->bulk_param= save_bulk_param; if (values_list.elements != 1 && ! thd->is_error()) { info.records++; @@ -1110,6 +1133,7 @@ error=1; break; } + thd->bulk_param= save_bulk_param; } /* @@ -1424,6 +1448,7 @@ check_view_insertability() thd - thread handler view - reference on VIEW + fields - fields used in insert IMPLEMENTATION A view is insertable if the folloings are true: @@ -1439,7 +1464,8 @@ TRUE - can't be used for insert */ -static bool check_view_insertability(THD * thd, TABLE_LIST *view) +static bool check_view_insertability(THD *thd, TABLE_LIST *view, + List &fields) { uint num= view->view->first_select_lex()->item_list.elements; TABLE *table= view->table; @@ -1447,9 +1473,11 @@ *trans_end= trans_start + num; Field_translator *trans; uint used_fields_buff_size= bitmap_buffer_size(table->s->fields); - uint32 *used_fields_buff= (uint32*)thd->alloc(used_fields_buff_size); + my_bitmap_map *used_fields_buff= (my_bitmap_map*)thd->alloc(used_fields_buff_size); MY_BITMAP used_fields; enum_column_usage saved_column_usage= thd->column_usage; + List_iterator_fast it(fields); + Item *ex; DBUG_ENTER("check_key_in_view"); if (!used_fields_buff) @@ -1478,6 +1506,17 @@ /* simple SELECT list entry (field without expression) */ if (!(field= trans->item->field_for_view_update())) { + // Do not check fields which we are not inserting into + while((ex= it++)) + { + // The field used in the INSERT + if (ex->real_item()->field_for_view_update() == + trans->item->field_for_view_update()) + break; + } + it.rewind(); + if (!ex) + continue; thd->column_usage= saved_column_usage; DBUG_RETURN(TRUE); } @@ -1492,11 +1531,12 @@ } thd->column_usage= saved_column_usage; /* unique test */ - for (trans= trans_start; trans != trans_end; trans++) + while((ex= it++)) { /* Thanks to test above, we know that all columns are of type Item_field */ - Item_field *field= (Item_field *)trans->item; - /* check fields belong to table in which we are inserting */ + DBUG_ASSERT(ex->real_item()->field_for_view_update()->type() == + Item::FIELD_ITEM); + Item_field *field= (Item_field *)ex->real_item()->field_for_view_update(); if (field->field->table == table && bitmap_fast_test_and_set(&used_fields, field->field->field_index)) DBUG_RETURN(TRUE); @@ -1780,7 +1820,7 @@ /* Check if there is more uniq keys after field */ -static int last_uniq_key(TABLE *table,uint keynr) +static int last_uniq_key(TABLE *table, const KEY *key, uint keynr) { /* When an underlying storage engine informs that the unique key @@ -1800,7 +1840,7 @@ return 0; while (++keynr < table->s->keys) - if (table->key_info[keynr].flags & HA_NOSAME) + if (key[keynr].flags & HA_NOSAME) return 0; return 1; } @@ -1932,14 +1972,31 @@ was used. This ensures that we don't get a problem when the whole range of the key has been used. */ - if (info->handle_duplicates == DUP_REPLACE && table->next_number_field && + if (info->handle_duplicates == DUP_REPLACE && key_nr == table->s->next_number_index && insert_id_for_cur_row > 0) goto err; - if (table->file->ha_table_flags() & HA_DUPLICATE_POS) + if (table->file->has_dup_ref()) { + /* + If engine doesn't support HA_DUPLICATE_POS, the handler may init to + INDEX, but dup_ref could also be set by lookup_handled (and then, + lookup_errkey is set, f.ex. long unique duplicate). + + In such case, handler would stay uninitialized, so do it here. + */ + bool init_lookup_handler= table->file->lookup_errkey != (uint)-1 && + table->file->inited == handler::NONE; + if (init_lookup_handler && table->file->ha_rnd_init_with_error(false)) + goto err; + DBUG_ASSERT(table->file->inited == handler::RND); - if (table->file->ha_rnd_pos(table->record[1],table->file->dup_ref)) - goto err; + int rnd_pos_err= table->file->ha_rnd_pos(table->record[1], + table->file->dup_ref); + + if (init_lookup_handler) + table->file->ha_rnd_end(); + if (rnd_pos_err) + goto err; } else { @@ -2115,8 +2172,27 @@ tables which have ON UPDATE but have no ON DELETE triggers, we just should not expose this fact to users by invoking ON UPDATE triggers. + + Note, TABLE_SHARE and TABLE see long uniques differently: + - TABLE_SHARE sees as HA_KEY_ALG_LONG_HASH and HA_NOSAME + - TABLE sees as usual non-unique indexes */ - if (last_uniq_key(table,key_nr) && + bool is_long_unique= table->s->key_info && + table->s->key_info[key_nr].algorithm == + HA_KEY_ALG_LONG_HASH; + if ((is_long_unique ? + /* + We have a long unique. Test that there are no in-engine + uniques and the current long unique is the last long unique. + */ + !(table->key_info[0].flags & HA_NOSAME) && + last_uniq_key(table, table->s->key_info, key_nr) : + /* + We have a normal key - not a long unique. + Test is the current normal key is unique and + it is the last normal unique. + */ + last_uniq_key(table, table->key_info, key_nr)) && !table->file->referenced_by_foreign_key() && (!table->triggers || !table->triggers->has_delete_triggers())) { @@ -2317,7 +2393,7 @@ forced_insert_id(0), query(query_arg), time_zone(0), user(0), host(0), ip(0) {} - ~delayed_row() + ~delayed_row() override { my_free(query.str); my_free(record); @@ -2363,7 +2439,7 @@ passed from connection thread to the handler thread. */ MDL_request grl_protection; - Delayed_insert(SELECT_LEX *current_select) + Delayed_insert(LEX *lex) :locks_in_memory(0), thd(next_thread_id()), table(0),tables_in_use(0), stacked_inserts(0), status(0), retry(0), handler_thread_initialized(FALSE), group_count(0) @@ -2376,8 +2452,9 @@ strmake_buf(thd.security_ctx->priv_user, thd.security_ctx->user); thd.current_tablenr=0; thd.set_command(COM_DELAYED_INSERT); - thd.lex->current_select= current_select; - thd.lex->sql_command= SQLCOM_INSERT; // For innodb::store_lock() + thd.lex->current_select= lex->current_select; + thd.lex->sql_command= lex->sql_command; // For innodb::store_lock() + thd.lex->duplicates= lex->duplicates; /* Prevent changes to global.lock_wait_timeout from affecting delayed insert threads as any timeouts in delayed inserts @@ -2400,7 +2477,7 @@ TL_WRITE_LOW_PRIORITY : TL_WRITE; DBUG_VOID_RETURN; } - ~Delayed_insert() + ~Delayed_insert() override { /* The following is not really needed, but just for safety */ delayed_row *row; @@ -2553,7 +2630,7 @@ */ if (! (di= find_handler(thd, table_list))) { - if (!(di= new Delayed_insert(thd->lex->current_select))) + if (!(di= new Delayed_insert(thd->lex))) goto end_create; /* @@ -2721,7 +2798,7 @@ } THD_STAGE_INFO(client_thd, stage_got_handler_lock); if (client_thd->killed) - goto error; + goto error2; if (thd.killed) { /* @@ -2746,7 +2823,7 @@ my_message(thd.get_stmt_da()->sql_errno(), thd.get_stmt_da()->message(), MYF(0)); } - goto error; + goto error2; } } share= table->s; @@ -2775,11 +2852,14 @@ &record, (uint) share->reclength, &bitmap, (uint) share->column_bitmap_size*4, NullS)) - goto error; + goto error2; /* Copy the TABLE object. */ copy= new (copy_tmp) TABLE; *copy= *table; + copy->vcol_refix_list.empty(); + init_sql_alloc(key_memory_TABLE, ©->mem_root, TABLE_ALLOC_BLOCK_SIZE, 0, + MYF(MY_THREAD_SPECIFIC)); /* We don't need to change the file handler here */ /* Assign the pointers for the field pointers array and the record. */ @@ -2851,6 +2931,8 @@ copy->def_read_set.bitmap= (my_bitmap_map*) bitmap; copy->def_write_set.bitmap= ((my_bitmap_map*) (bitmap + share->column_bitmap_size)); + create_last_bit_mask(©->def_read_set); + create_last_bit_mask(©->def_write_set); bitmaps_used= 2; if (share->default_fields || share->default_expressions) { @@ -2863,11 +2945,15 @@ bzero((char*) bitmap, share->column_bitmap_size * bitmaps_used); copy->read_set= ©->def_read_set; copy->write_set= ©->def_write_set; + move_root(client_thd->mem_root, ©->mem_root); + free_root(©->mem_root, 0); DBUG_RETURN(copy); /* Got fatal error */ error: + free_root(©->mem_root, 0); +error2: tables_in_use--; mysql_cond_signal(&cond); // Inform thread about abort DBUG_RETURN(0); @@ -3072,13 +3158,13 @@ class Delayed_prelocking_strategy : public Prelocking_strategy { public: - virtual bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx, + bool handle_routine(THD *thd, Query_tables_list *prelocking_ctx, Sroutine_hash_entry *rt, sp_head *sp, - bool *need_prelocking); - virtual bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, - TABLE_LIST *table_list, bool *need_prelocking); - virtual bool handle_view(THD *thd, Query_tables_list *prelocking_ctx, - TABLE_LIST *table_list, bool *need_prelocking); + bool *need_prelocking) override; + bool handle_table(THD *thd, Query_tables_list *prelocking_ctx, + TABLE_LIST *table_list, bool *need_prelocking) override; + bool handle_view(THD *thd, Query_tables_list *prelocking_ctx, + TABLE_LIST *table_list, bool *need_prelocking) override; }; @@ -4270,7 +4356,16 @@ if (info.ignore || info.handle_duplicates != DUP_ERROR) if (table->file->ha_table_flags() & HA_DUPLICATE_POS) table->file->ha_rnd_end(); - table->file->extra(HA_EXTRA_END_ALTER_COPY); + if (error <= 0) + { + error= table->file->extra(HA_EXTRA_END_ALTER_COPY); + if (error == HA_ERR_FOUND_DUPP_KEY) + { + uint key_nr= table->file->get_dup_key(error); + if ((int)key_nr >= 0 && key_nr < table->s->keys) + print_keydup_error(table, &table->key_info[key_nr], MYF(0)); + } + } table->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); table->file->extra(HA_EXTRA_WRITE_CANNOT_REPLACE); @@ -5115,17 +5210,13 @@ thd->wsrep_trx_id(), thd->thread_id, thd->query_id); /* - append table level exclusive key for CTAS + For CTAS, append table level exclusive key for created table + and table level shared key for selected table. */ - wsrep_key_arr_t key_arr= {0, 0}; - wsrep_prepare_keys_for_isolation(thd, - table_list->db.str, - table_list->table_name.str, - table_list, - &key_arr); - int rcode= wsrep_thd_append_key(thd, key_arr.keys, key_arr.keys_len, - WSREP_SERVICE_KEY_EXCLUSIVE); - wsrep_keys_free(&key_arr); + int rcode= wsrep_append_table_keys(thd, table_list, table_list, + WSREP_SERVICE_KEY_EXCLUSIVE); + rcode= rcode || wsrep_append_table_keys(thd, nullptr, select_tables, + WSREP_SERVICE_KEY_SHARED); if (rcode) { DBUG_PRINT("wsrep", ("row key failed: %d", rcode)); diff -Nru mariadb-10.11.6/sql/sql_join_cache.cc mariadb-10.11.9/sql/sql_join_cache.cc --- mariadb-10.11.6/sql/sql_join_cache.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_join_cache.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1590,6 +1590,7 @@ { bool is_full; uchar *link= 0; + DBUG_ASSERT(!for_explain_only); if (prev_cache) link= prev_cache->get_curr_rec_link(); write_record_data(link, &is_full); diff -Nru mariadb-10.11.6/sql/sql_join_cache.h mariadb-10.11.9/sql/sql_join_cache.h --- mariadb-10.11.6/sql/sql_join_cache.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_join_cache.h 2024-08-03 07:29:59.000000000 +0000 @@ -943,7 +943,7 @@ } /* Get the total length of all prefixes of a record in hashed join buffer */ - uint get_prefix_length() + uint get_prefix_length() override { return base_prefix_length + get_size_of_rec_offset(); } @@ -952,13 +952,13 @@ Get maximum size of the additional space per record used for the hash table with record keys */ - uint get_max_key_addon_space_per_record(); + uint get_max_key_addon_space_per_record() override; /* Calculate how much space in the buffer would not be occupied by records, key entries and additional memory for the MMR buffer. */ - size_t rem_space() + size_t rem_space() override { return MY_MAX(last_key_entry-end_pos-aux_buff_size,0); } @@ -967,25 +967,25 @@ Calculate how much space is taken by allocation of the key entry for a record in the join buffer */ - uint extra_key_length() { return key_entry_length; } + uint extra_key_length() override { return key_entry_length; } /* Skip record from a hashed join buffer if its match flag is set to MATCH_FOUND */ - bool skip_if_matched(); + bool skip_if_matched() override; /* Skip record from a hashed join buffer if its match flag setting commands to do so */ - bool skip_if_not_needed_match(); + bool skip_if_not_needed_match() override; /* Search for a key in the hash table of the join buffer */ bool key_search(uchar *key, uint key_len, uchar **key_ref_ptr); /* Reallocate the join buffer of a hashed join cache */ - int realloc_buffer(); + int realloc_buffer() override; /* This constructor creates an unlinked hashed join cache. The cache is to be @@ -1006,16 +1006,16 @@ public: /* Initialize a hashed join cache */ - int init(bool for_explain); + int init(bool for_explain) override; /* Reset the buffer of a hashed join cache for reading/writing */ - void reset(bool for_writing); + void reset(bool for_writing) override; /* Add a record into the buffer of a hashed join cache */ - bool put_record(); + bool put_record() override; /* Read the next record from the buffer of a hashed join cache */ - bool get_record(); + bool get_record() override; /* Shall check whether all records in a key chain have @@ -1115,13 +1115,13 @@ protected: - bool prepare_look_for_matches(bool skip_last); + bool prepare_look_for_matches(bool skip_last) override; - uchar *get_next_candidate_for_match(); + uchar *get_next_candidate_for_match() override; - bool skip_next_candidate_for_match(uchar *rec_ptr); + bool skip_next_candidate_for_match(uchar *rec_ptr) override; - void read_next_candidate_for_match(uchar *rec_ptr); + void read_next_candidate_for_match(uchar *rec_ptr) override; public: @@ -1142,11 +1142,11 @@ :JOIN_CACHE(j, tab, prev) {} /* Initialize the BNL cache */ - int init(bool for_explain); + int init(bool for_explain) override; - enum Join_algorithm get_join_alg() { return BNL_JOIN_ALG; } + enum Join_algorithm get_join_alg() override { return BNL_JOIN_ALG; } - bool is_key_access() { return FALSE; } + bool is_key_access() override { return FALSE; } }; @@ -1182,13 +1182,13 @@ */ uchar *get_matching_chain_by_join_key(); - bool prepare_look_for_matches(bool skip_last); + bool prepare_look_for_matches(bool skip_last) override; - uchar *get_next_candidate_for_match(); + uchar *get_next_candidate_for_match() override; - bool skip_next_candidate_for_match(uchar *rec_ptr); + bool skip_next_candidate_for_match(uchar *rec_ptr) override; - void read_next_candidate_for_match(uchar *rec_ptr); + void read_next_candidate_for_match(uchar *rec_ptr) override; public: @@ -1209,11 +1209,11 @@ : JOIN_CACHE_HASHED(j, tab, prev) {} /* Initialize the BNLH cache */ - int init(bool for_explain); + int init(bool for_explain) override; - enum Join_algorithm get_join_alg() { return BNLH_JOIN_ALG; } + enum Join_algorithm get_join_alg() override { return BNLH_JOIN_ALG; } - bool is_key_access() { return TRUE; } + bool is_key_access() override { return TRUE; } }; @@ -1256,11 +1256,11 @@ JOIN_TAB_SCAN_MRR(JOIN *j, JOIN_TAB *tab, uint flags, RANGE_SEQ_IF rs_funcs) :JOIN_TAB_SCAN(j, tab), range_seq_funcs(rs_funcs), mrr_mode(flags) {} - uint aux_buffer_incr(size_t recno); + uint aux_buffer_incr(size_t recno) override; - int open(); + int open() override; - int next(); + int next() override; friend class JOIN_CACHE_BKA; /* it needs to add an mrr_mode flag after JOIN_CACHE::init() call */ }; @@ -1296,26 +1296,26 @@ Get the number of ranges in the cache buffer passed to the MRR interface. For each record its own range is passed. */ - uint get_number_of_ranges_for_mrr() { return (uint)records; } + uint get_number_of_ranges_for_mrr() override { return (uint)records; } /* Setup the MRR buffer as the space between the last record put into the join buffer and the very end of the join buffer */ - int setup_aux_buffer(HANDLER_BUFFER &aux_buff) + int setup_aux_buffer(HANDLER_BUFFER &aux_buff) override { aux_buff.buffer= end_pos; aux_buff.buffer_end= buff+buff_size; return 0; } - bool prepare_look_for_matches(bool skip_last); + bool prepare_look_for_matches(bool skip_last) override; - uchar *get_next_candidate_for_match(); + uchar *get_next_candidate_for_match() override; - bool skip_next_candidate_for_match(uchar *rec_ptr); + bool skip_next_candidate_for_match(uchar *rec_ptr) override; - void read_next_candidate_for_match(uchar *rec_ptr); + void read_next_candidate_for_match(uchar *rec_ptr) override; public: @@ -1341,14 +1341,14 @@ :JOIN_CACHE(bka->join, bka->join_tab, bka->prev_cache), mrr_mode(bka->mrr_mode) {} - uchar **get_curr_association_ptr() { return &curr_association; } + uchar **get_curr_association_ptr() override { return &curr_association; } /* Initialize the BKA cache */ - int init(bool for_explain); + int init(bool for_explain) override; - enum Join_algorithm get_join_alg() { return BKA_JOIN_ALG; } + enum Join_algorithm get_join_alg() override { return BKA_JOIN_ALG; } - bool is_key_access() { return TRUE; } + bool is_key_access() override { return TRUE; } /* Get the key built over the next record from the join buffer */ uint get_next_key(uchar **key); @@ -1356,7 +1356,7 @@ /* Check index condition of the joined table for a record from BKA cache */ bool skip_index_tuple(range_id_t range_info); - bool save_explain_data(EXPLAIN_BKA_TYPE *explain); + bool save_explain_data(EXPLAIN_BKA_TYPE *explain) override; }; @@ -1392,21 +1392,21 @@ protected: - uint get_number_of_ranges_for_mrr() { return key_entries; } + uint get_number_of_ranges_for_mrr() override { return key_entries; } /* Initialize the MRR buffer allocating some space within the join buffer. The entire space between the last record put into the join buffer and the last key entry added to the hash table is used for the MRR buffer. */ - int setup_aux_buffer(HANDLER_BUFFER &aux_buff) + int setup_aux_buffer(HANDLER_BUFFER &aux_buff) override { aux_buff.buffer= end_pos; aux_buff.buffer_end= last_key_entry; return 0; } - bool prepare_look_for_matches(bool skip_last); + bool prepare_look_for_matches(bool skip_last) override; /* The implementations of the methods @@ -1441,15 +1441,15 @@ :JOIN_CACHE_BNLH(bkah->join, bkah->join_tab, bkah->prev_cache), mrr_mode(bkah->mrr_mode) {} - uchar **get_curr_association_ptr() { return &curr_matching_chain; } + uchar **get_curr_association_ptr() override { return &curr_matching_chain; } /* Initialize the BKAH cache */ - int init(bool for_explain); + int init(bool for_explain) override; - enum Join_algorithm get_join_alg() { return BKAH_JOIN_ALG; } + enum Join_algorithm get_join_alg() override { return BKAH_JOIN_ALG; } /* Check index condition of the joined table for a record from BKAH cache */ bool skip_index_tuple(range_id_t range_info); - bool save_explain_data(EXPLAIN_BKA_TYPE *explain); + bool save_explain_data(EXPLAIN_BKA_TYPE *explain) override; }; diff -Nru mariadb-10.11.6/sql/sql_lex.cc mariadb-10.11.9/sql/sql_lex.cc --- mariadb-10.11.6/sql/sql_lex.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_lex.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1459,7 +1459,7 @@ bool is_native_function(THD *thd, const LEX_CSTRING *name) { - if (native_functions_hash.find(thd, *name)) + if (mariadb_schema.find_native_function_builder(thd, *name)) return true; if (is_lex_native_function(name)) @@ -2138,7 +2138,18 @@ if (lex->parsing_options.lookup_keywords_after_qualifier) next_state= MY_LEX_IDENT_OR_KEYWORD; else - next_state= MY_LEX_IDENT_START; // Next is ident (not keyword) + { + /* + Next is: + - A qualified func with a special syntax: + mariadb_schema.REPLACE('a','b','c') + mariadb_schema.SUSTRING('a',1,2) + mariadb_schema.TRIM('a') + - Or an identifier otherwise. No keyword lookup is done, + all keywords are treated as identifiers. + */ + next_state= MY_LEX_IDENT_OR_QUALIFIED_SPECIAL_FUNC; + } if (!ident_map[(uchar) yyPeek()]) // Probably ` or " next_state= MY_LEX_START; return((int) c); @@ -2582,7 +2593,12 @@ We should now be able to handle: [(global | local | session) .]variable_name */ - return scan_ident_sysvar(thd, &yylval->ident_cli); + return scan_ident_common(thd, &yylval->ident_cli, + GENERAL_KEYWORD_OR_FUNC_LPAREN); + + case MY_LEX_IDENT_OR_QUALIFIED_SPECIAL_FUNC: + return scan_ident_common(thd, &yylval->ident_cli, + QUALIFIED_SPECIAL_FUNC_LPAREN); } } } @@ -2604,7 +2620,64 @@ } -int Lex_input_stream::scan_ident_sysvar(THD *thd, Lex_ident_cli_st *str) +/* + Resolve special SQL functions that have a qualified syntax in sql_yacc.yy. + These functions are not listed in the native function registry + because of a special syntax, or a reserved keyword: + + mariadb_schema.SUBSTRING('a' FROM 1 FOR 2) -- Special syntax + mariadb_schema.TRIM(BOTH ' ' FROM 'a') -- Special syntax + mariadb_schema.REPLACE('a','b','c') -- Verb keyword +*/ + +int Lex_input_stream::find_keyword_qualified_special_func(Lex_ident_cli_st *str, + uint length) const +{ + /* + There are many other special functions, see the following grammar rules: + function_call_keyword + function_call_nonkeyword + Here we resolve only those that have a qualified syntax to handle + different behavior in different @@sql_mode settings. + + Other special functions do not work in qualified context: + SELECT mariadb_schema.year(now()); -- Function year is not defined + SELECT mariadb_schema.now(); -- Function now is not defined + + We don't resolve TRIM_ORACLE here, because it does not have + a qualified syntax yet. Search for "trim_operands" in sql_yacc.yy + to find more comments. + */ + static LEX_CSTRING funcs[]= + { + {STRING_WITH_LEN("SUBSTRING")}, + {STRING_WITH_LEN("SUBSTR")}, + {STRING_WITH_LEN("TRIM")}, + {STRING_WITH_LEN("REPLACE")} + }; + + int tokval= find_keyword(str, length, true); + if (!tokval) + return 0; + for (size_t i= 0; i < array_elements(funcs); i++) + { + CHARSET_INFO *cs= system_charset_info; + /* + Check length equality to avoid non-ASCII variants + compared as equal to ASCII variants. + */ + if (length == funcs[i].length && + !cs->coll->strnncollsp(cs, + (const uchar *) m_tok_start, length, + (const uchar *) funcs[i].str, funcs[i].length)) + return tokval; + } + return 0; +} + + +int Lex_input_stream::scan_ident_common(THD *thd, Lex_ident_cli_st *str, + Ident_mode mode) { uchar last_char; uint length; @@ -2618,10 +2691,41 @@ next_state= MY_LEX_IDENT_SEP; if (!(length= yyLength())) return ABORT_SYM; // Names must be nonempty. - if ((tokval= find_keyword(str, length, 0))) - { - yyUnget(); // Put back 'c' - return tokval; // Was keyword + + switch (mode) { + case GENERAL_KEYWORD_OR_FUNC_LPAREN: + /* + We can come here inside a system variable after "@@", + e.g. @@global.character_set_client. + We resolve all general purpose keywords here. + + We can come here when LEX::parsing_options.lookup_keywords_after_qualifier + is true, i.e. within the "field_spec" Bison rule. + We need to resolve functions that have special rules inside sql_yacc.yy, + such as SUBSTR, REPLACE, TRIM, to make this work: + c2 varchar(4) GENERATED ALWAYS AS (mariadb_schema.substr(c1,1,4)) + */ + if ((tokval= find_keyword(str, length, last_char == '('))) + { + yyUnget(); // Put back 'c' + return tokval; // Was keyword + } + break; + case QUALIFIED_SPECIAL_FUNC_LPAREN: + /* + We come here after '.' in various contexts: + SELECT @@global.character_set_client; + SELECT t1.a FROM t1; + SELECT test.f1() FROM t1; + SELECT mariadb_schema.trim('a'); + */ + if (last_char == '(' && + (tokval= find_keyword_qualified_special_func(str, length))) + { + yyUnget(); // Put back 'c' + return tokval; // Was keyword + } + break; } yyUnget(); // ptr points now after last token char @@ -2921,6 +3025,7 @@ is_correlated= 0; first_natural_join_processing= 1; first_cond_optimization= 1; + first_rownum_optimization= true; no_wrap_view_item= 0; exclude_from_table_unique_test= 0; in_tvc= 0; @@ -2960,6 +3065,7 @@ tvc= 0; versioned_tables= 0; pushdown_select= 0; + orig_names_of_item_list_elems= 0; } void st_select_lex::init_select() @@ -3011,6 +3117,7 @@ versioned_tables= 0; is_tvc_wrapper= false; nest_flags= 0; + orig_names_of_item_list_elems= 0; } /* @@ -3526,8 +3633,9 @@ uint n_elems= get_cardinality_of_ref_ptrs_slice(order_group_num) * 5; if (!ref_pointer_array.is_null()) return false; - Item **array= static_cast(thd->stmt_arena->alloc(sizeof(Item*) * - n_elems)); + + Item **array= static_cast( + thd->active_stmt_arena_to_use()->alloc(sizeof(Item*) * n_elems)); if (likely(array != NULL)) ref_pointer_array= Ref_ptr_array(array, n_elems); return array == NULL; @@ -4157,17 +4265,18 @@ bool LEX::copy_db_to(LEX_CSTRING *to) { - if (sphead && sphead->m_name.str) - { - DBUG_ASSERT(sphead->m_db.str && sphead->m_db.length); - /* - It is safe to assign the string by-pointer, both sphead and - its statements reside in the same memory root. - */ - *to= sphead->m_db; - return FALSE; - } - return thd->copy_db_to(to); + if (!sphead || !sphead->m_name.str) + return thd->copy_db_to(to); + + DBUG_ASSERT(sphead->m_db.str); + DBUG_ASSERT(sphead->m_db.length); + + /* + It is safe to assign the string by-pointer, both sphead and + its statements reside in the same memory root. + */ + *to= sphead->m_db; + return FALSE; } /** @@ -4671,18 +4780,27 @@ void st_select_lex::fix_prepare_information(THD *thd, Item **conds, Item **having_conds) { + Query_arena *active_arena= thd->active_stmt_arena_to_use(); + DBUG_ENTER("st_select_lex::fix_prepare_information"); - if (!thd->stmt_arena->is_conventional() && + + if (!active_arena->is_conventional() && !(changed_elements & TOUCHED_SEL_COND)) { Query_arena_stmt on_stmt_arena(thd); changed_elements|= TOUCHED_SEL_COND; + /* + TODO: return after MDEV-33218 fix + DBUG_ASSERT( + active_arena->is_stmt_prepare_or_first_stmt_execute() || + active_arena->state == Query_arena::STMT_SP_QUERY_ARGUMENTS); + */ if (group_list.first) { if (!group_list_ptrs) { - void *mem= thd->stmt_arena->alloc(sizeof(Group_list_ptrs)); - group_list_ptrs= new (mem) Group_list_ptrs(thd->stmt_arena->mem_root); + void *mem= active_arena->alloc(sizeof(Group_list_ptrs)); + group_list_ptrs= new (mem) Group_list_ptrs(active_arena->mem_root); } group_list_ptrs->reserve(group_list.elements); for (ORDER *order= group_list.first; order; order= order->next) @@ -5357,6 +5475,9 @@ while ((tl= ti++)) { + if (tl->table_function) + is_correlated|= MY_TEST(tl->table_function->used_tables() & + OUTER_REF_TABLE_BIT); // is_correlated|= tl->is_with_table_recursive_reference(); if (tl->on_expr) is_correlated|= MY_TEST(tl->on_expr->used_tables() & OUTER_REF_TABLE_BIT); @@ -7342,7 +7463,8 @@ name->m_name); else sp->init_sp_name(name); - sp->make_qname(sp->get_main_mem_root(), &sp->m_qname); + if (!(sp->m_qname= sp->make_qname(sp->get_main_mem_root(), true)).str) + return NULL; } sphead= sp; } @@ -8033,7 +8155,7 @@ { if (select_stack_top > 0) return false; // OK, fields are allowed - my_error(ER_BAD_FIELD_ERROR, MYF(0), name, thd->where); + my_error(ER_BAD_FIELD_ERROR, MYF(0), name, thd_where(thd)); return true; // Error, fields are not allowed } @@ -8056,7 +8178,7 @@ if (unlikely(current_select->no_table_names_allowed)) { - my_error(ER_TABLENAME_NOT_ALLOWED_HERE, MYF(0), a->str, thd->where); + my_error(ER_TABLENAME_NOT_ALLOWED_HERE, MYF(0), a->str, thd_where(thd)); return NULL; } @@ -8271,7 +8393,7 @@ if (current_select->no_table_names_allowed) { - my_error(ER_TABLENAME_NOT_ALLOWED_HERE, MYF(0), b->str, thd->where); + my_error(ER_TABLENAME_NOT_ALLOWED_HERE, MYF(0), b->str, thd_where(thd)); return NULL; } @@ -9229,7 +9351,7 @@ const Lex_ident_sys_st *proc) { Database_qualified_name q_db_pkg(db, pkg); - Database_qualified_name q_pkg_proc(pkg, proc); + Identifier_chain2 q_pkg_proc(*pkg, *proc); sp_name *spname; sql_command= SQLCOM_CALL; @@ -9247,7 +9369,7 @@ // Concat `pkg` and `name` to `pkg.name` LEX_CSTRING pkg_dot_proc; - if (q_pkg_proc.make_qname(thd->mem_root, &pkg_dot_proc) || + if (!(pkg_dot_proc= q_pkg_proc.make_qname(thd->mem_root, false)).str || check_ident_length(&pkg_dot_proc) || !(spname= new (thd->mem_root) sp_name(db, &pkg_dot_proc, true))) return true; @@ -9313,7 +9435,8 @@ return NULL; pkg->reset_thd_mem_root(thd); pkg->init(this); - pkg->make_qname(pkg->get_main_mem_root(), &pkg->m_qname); + if (!(pkg->m_qname= pkg->make_qname(pkg->get_main_mem_root(), true)).str) + return NULL; sphead= pkg; return pkg; } @@ -9376,6 +9499,136 @@ } +const Schema * +LEX::find_func_schema_by_name_or_error(const Lex_ident_sys &schema, + const Lex_ident_sys &func) +{ + Schema *res= Schema::find_by_name(schema); + if (res) + return res; + Database_qualified_name qname(schema, func); + my_error(ER_FUNCTION_NOT_DEFINED, MYF(0), ErrConvDQName(&qname).ptr()); + return NULL; +} + + +Item *LEX::make_item_func_substr(THD *thd, + const Lex_ident_cli_st &schema_name_cli, + const Lex_ident_cli_st &func_name_cli, + const Lex_substring_spec_st &spec) +{ + Lex_ident_sys schema_name(thd, &schema_name_cli); + Lex_ident_sys func_name(thd, &func_name_cli); + if (schema_name.is_null() || func_name.is_null()) + return NULL; // EOM + const Schema *schema= find_func_schema_by_name_or_error(schema_name, + func_name); + return schema ? schema->make_item_func_substr(thd, spec) : NULL; +} + + +Item *LEX::make_item_func_substr(THD *thd, + const Lex_ident_cli_st &schema_name_cli, + const Lex_ident_cli_st &func_name_cli, + List *item_list) +{ + Lex_ident_sys schema_name(thd, &schema_name_cli); + Lex_ident_sys func_name(thd, &func_name_cli); + if (schema_name.is_null() || func_name.is_null()) + return NULL; // EOM + Schema *schema; + if (item_list && + (item_list->elements == 2 || item_list->elements == 3) && + (schema= Schema::find_by_name(schema_name))) + { + Item_args args(thd, *item_list); + Lex_substring_spec_st spec= + Lex_substring_spec_st::init(args.arguments()[0], + args.arguments()[1], + item_list->elements == 3 ? + args.arguments()[2] : NULL); + return schema->make_item_func_substr(thd, spec); + } + return make_item_func_call_generic(thd, schema_name, func_name, item_list); +} + + +Item *LEX::make_item_func_replace(THD *thd, + const Lex_ident_cli_st &schema_name_cli, + const Lex_ident_cli_st &func_name_cli, + Item *org, + Item *find, + Item *replace) +{ + Lex_ident_sys schema_name(thd, &schema_name_cli); + Lex_ident_sys func_name(thd, &func_name_cli); + if (schema_name.is_null() || func_name.is_null()) + return NULL; // EOM + const Schema *schema= find_func_schema_by_name_or_error(schema_name, + func_name); + return schema ? schema->make_item_func_replace(thd, org, find, replace) : + NULL; +} + + +Item *LEX::make_item_func_replace(THD *thd, + const Lex_ident_cli_st &schema_name_cli, + const Lex_ident_cli_st &func_name_cli, + List *item_list) +{ + Lex_ident_sys schema_name(thd, &schema_name_cli); + Lex_ident_sys func_name(thd, &func_name_cli); + if (schema_name.is_null() || func_name.is_null()) + return NULL; // EOM + const Schema *schema; + if (item_list && item_list->elements == 3 && + (schema= Schema::find_by_name(schema_name))) + { + Item_args args(thd, *item_list); + return schema->make_item_func_replace(thd, args.arguments()[0], + args.arguments()[1], + args.arguments()[2]); + } + return make_item_func_call_generic(thd, schema_name, func_name, item_list); +} + + +Item *LEX::make_item_func_trim(THD *thd, + const Lex_ident_cli_st &schema_name_cli, + const Lex_ident_cli_st &func_name_cli, + const Lex_trim_st &spec) +{ + Lex_ident_sys schema_name(thd, &schema_name_cli); + Lex_ident_sys func_name(thd, &func_name_cli); + if (schema_name.is_null() || func_name.is_null()) + return NULL; // EOM + const Schema *schema= find_func_schema_by_name_or_error(schema_name, + func_name); + return schema ? schema->make_item_func_trim(thd, spec) : NULL; +} + + +Item *LEX::make_item_func_trim(THD *thd, + const Lex_ident_cli_st &schema_name_cli, + const Lex_ident_cli_st &func_name_cli, + List *item_list) +{ + Lex_ident_sys schema_name(thd, &schema_name_cli); + Lex_ident_sys func_name(thd, &func_name_cli); + if (schema_name.is_null() || func_name.is_null()) + return NULL; // EOM + const Schema *schema; + if (item_list && item_list->elements == 1 && + (schema= Schema::find_by_name(schema_name))) + { + Item_args args(thd, *item_list); + Lex_trim spec(TRIM_BOTH, args.arguments()[0]); + return schema->make_item_func_trim(thd, spec); + } + return make_item_func_call_generic(thd, schema_name, func_name, item_list); +} + + bool SELECT_LEX::vers_push_field(THD *thd, TABLE_LIST *table, const LEX_CSTRING field_name) { @@ -9454,16 +9707,10 @@ } -Item *Lex_trim_st::make_item_func_trim(THD *thd) const -{ - return (thd->variables.sql_mode & MODE_ORACLE) ? - make_item_func_trim_oracle(thd) : - make_item_func_trim_std(thd); -} - - -Item *LEX::make_item_func_call_generic(THD *thd, Lex_ident_cli_st *cdb, - Lex_ident_cli_st *cname, List *args) +Item *LEX::make_item_func_call_generic(THD *thd, + const Lex_ident_cli_st *cdb, + const Lex_ident_cli_st *cname, + List *args) { Lex_ident_sys db(thd, cdb), name(thd, cname); if (db.is_null() || name.is_null()) @@ -9490,6 +9737,19 @@ if (check_routine_name(&name)) return NULL; + return make_item_func_call_generic(thd, db, name, args); +} + + +Item *LEX::make_item_func_call_generic(THD *thd, + const Lex_ident_sys &db, + const Lex_ident_sys &name, + List *args) +{ + const Schema *schema= Schema::find_by_name(db); + if (schema) + return schema->make_item_func_call_native(thd, name, args); + Create_qfunc *builder= find_qualified_function_builder(thd); DBUG_ASSERT(builder); return builder->create_with_db(thd, &db, &name, true, args); @@ -9510,7 +9770,7 @@ static Lex_cstring dot(".", 1); Lex_ident_sys db(thd, cdb), pkg(thd, cpkg), func(thd, cfunc); Database_qualified_name q_db_pkg(db, pkg); - Database_qualified_name q_pkg_func(pkg, func); + Identifier_chain2 q_pkg_func(pkg, func); sp_name *qname; if (db.is_null() || pkg.is_null() || func.is_null()) @@ -9527,7 +9787,7 @@ // Concat `pkg` and `name` to `pkg.name` LEX_CSTRING pkg_dot_func; - if (q_pkg_func.make_qname(thd->mem_root, &pkg_dot_func) || + if (!(pkg_dot_func= q_pkg_func.make_qname(thd->mem_root, false)).str || check_ident_length(&pkg_dot_func) || !(qname= new (thd->mem_root) sp_name(&db, &pkg_dot_func, true))) return NULL; @@ -9936,8 +10196,17 @@ "CUBE/ROLLUP", "ORDER BY"); return TRUE; } + for (ORDER *order= order_list->first; order; order= order->next) + (*order->item)->walk(&Item::change_context_processor, FALSE, + &sel->context); sel->order_list= *(order_list); } + if (limit.select_limit) + limit.select_limit->walk(&Item::change_context_processor, FALSE, + &sel->context); + if (limit.offset_limit) + limit.offset_limit->walk(&Item::change_context_processor, FALSE, + &sel->context); sel->is_set_query_expr_tail= true; return FALSE; } @@ -10749,7 +11018,10 @@ (if cond is marked with MARKER_FULL_EXTRACTION or cond is an AND condition and some of its parts are marked with MARKER_FULL_EXTRACTION) - In this case condition is transformed and pushed into attach_to_conds + In this case condition is transformed with multiple_equality_transformer + transformer. It transforms all multiple equalities in the extracted + condition into the set of equalities. + After that the transformed condition is attached into attach_to_conds list. 2. Part of some other condition c1 that can't be entirely pushed (if Ñ1 isn't marked with any flag). @@ -10766,10 +11038,6 @@ In this case build_pushable_cond() is called for c1. This method builds a clone of the c1 part that can be pushed. - Transformation mentioned above is made with multiple_equality_transformer - transformer. It transforms all multiple equalities in the extracted - condition into the set of equalities. - @note Conditions that can be pushed are collected in attach_to_conds in this way: 1. if cond is an AND condition its parts that can be pushed into WHERE @@ -11185,12 +11453,91 @@ goto exit; } } + + /* + Remove IMMUTABLE_FL only after all of the elements of the condition are processed. + */ + it.rewind(); + while ((item=it++)) + { + if (item->walk(&Item::remove_immutable_flag_processor, 0, STOP_PTR)) + { + attach_to_conds.empty(); + goto exit; + } + } exit: thd->lex->current_select= save_curr_select; return having; } +/** + @brief + Save the original names of items from the item list. + + @retval + true - if an error occurs + false - otherwise +*/ + +bool st_select_lex::save_item_list_names(THD *thd) +{ + if (orig_names_of_item_list_elems) + return false; + + Query_arena *arena, backup; + arena= thd->activate_stmt_arena_if_needed(&backup); + + if (unlikely(!(orig_names_of_item_list_elems= new(thd->mem_root) + List))) + return true; + + List_iterator_fast li(item_list); + Item *item; + + while ((item= li++)) + { + Lex_ident_sys *name= new (thd->mem_root) Lex_ident_sys(thd, &item->name); + if (unlikely(!name || + orig_names_of_item_list_elems->push_back(name, thd->mem_root))) + { + if (arena) + thd->restore_active_arena(arena, &backup); + orig_names_of_item_list_elems= 0; + return true; + } + } + + if (arena) + thd->restore_active_arena(arena, &backup); + + return false; +} + + +/** + @brief + Restore the name of each item in the item_list of this st_select_lex + from orig_names_of_item_list_elems. +*/ + +void st_select_lex::restore_item_list_names() +{ + if (!orig_names_of_item_list_elems) + return; + + DBUG_ASSERT(item_list.elements == orig_names_of_item_list_elems->elements); + + List_iterator_fast it(*orig_names_of_item_list_elems); + Lex_ident_sys *new_name; + List_iterator_fast li(item_list); + Item *item; + + while ((item= li++) && (new_name= it++)) + lex_string_set( &item->name, new_name->str); +} + bool LEX::stmt_install_plugin(const DDL_options_st &opt, const Lex_ident_sys_st &name, const LEX_CSTRING &soname) @@ -11799,10 +12146,31 @@ } +/* + Handle the SET NAMES statement variants, e.g.: + SET NAMES DEFAULT; + SET NAMES DEFAULT COLLATE DEFAULT; + SET NAMES DEFAULT COLLATE latin1_bin; + SET NAMES latin1; + SET NAMES latin1 COLLATE DEFAULT; + SET NAMES latin1 COLLATE latin1_bin; + SET NAMES utf8mb4 COLLATE uca1400_ai_ci; + + @param pos - The position of the keyword `NAMES` inside the query + @param cs - The character set part, or nullptr if DEFAULT + @param cl - The collation (explicit or contextually typed) + @param no_lookahead - The tokinizer lookahead state +*/ bool LEX::set_names(const char *pos, - const Lex_exact_charset_opt_extended_collate &cscl, + CHARSET_INFO *cs, + const Lex_extended_collation_st &cl, bool no_lookahead) { + CHARSET_INFO *def= global_system_variables.character_set_client; + Lex_exact_charset_opt_extended_collate cscl(cs ? cs : def, true); + if (cscl.merge_collation_override(cl)) + return true; + if (sp_create_assignment_lex(thd, pos)) return true; CHARSET_INFO *ci= cscl.collation().charset_info(); diff -Nru mariadb-10.11.6/sql/sql_lex.h mariadb-10.11.9/sql/sql_lex.h --- mariadb-10.11.6/sql/sql_lex.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_lex.h 2024-08-03 07:29:59.000000000 +0000 @@ -146,6 +146,11 @@ struct Lex_ident_sys_st: public LEX_CSTRING { public: + static void *operator new(size_t size, MEM_ROOT *mem_root) throw () + { return alloc_root(mem_root, size); } + static void operator delete(void *ptr,size_t size) { TRASH_FREE(ptr, size); } + static void operator delete(void *ptr, MEM_ROOT *mem_root) {} + bool copy_ident_cli(THD *thd, const Lex_ident_cli_st *str); bool copy_keyword(THD *thd, const Lex_ident_cli_st *str); bool copy_sys(THD *thd, const LEX_CSTRING *str); @@ -179,6 +184,10 @@ LEX_CSTRING tmp= {name, length}; set_valid_utf8(&tmp); } + Lex_ident_sys(THD *thd, const LEX_CSTRING *str) + { + set_valid_utf8(str); + } Lex_ident_sys & operator=(const Lex_ident_sys_st &name) { Lex_ident_sys_st::operator=(name); @@ -1221,6 +1230,11 @@ List grouping_tmp_fields; List udf_list; /* udf function calls stack */ List *index_hints; /* list of USE/FORCE/IGNORE INDEX */ + /* + This list is used to restore the names of items + from item_list after each execution of the statement. + */ + List *orig_names_of_item_list_elems; List save_many_values; List *save_insert_list; @@ -1252,6 +1266,13 @@ bool is_correlated:1; bool first_natural_join_processing:1; bool first_cond_optimization:1; + /** + The purpose of this flag is to run initialization phase for rownum + only once. This flag is set on at st_select_lex::init_query and reset to + the value false after the method optimize_rownum() has been called + from the method JOIN::optimize_inner. + */ + bool first_rownum_optimization:1; /* do not wrap view fields with Item_ref */ bool no_wrap_view_item:1; /* exclude this select from check of unique_table() */ @@ -1438,6 +1459,9 @@ bool straight_fl); TABLE_LIST *convert_right_join(); List* get_item_list(); + bool save_item_list_names(THD *thd); + void restore_item_list_names(); + ulong get_table_join_options(); void set_lock_for_tables(thr_lock_type lock_type, bool for_update, bool skip_locks); @@ -1577,7 +1601,8 @@ master_unit()->cloned_from->with_element : master_unit()->with_element; } - With_element *find_table_def_in_with_clauses(TABLE_LIST *table); + With_element *find_table_def_in_with_clauses(TABLE_LIST *table, + st_select_lex_unit * excl_spec); bool check_unrestricted_recursive(bool only_standard_compliant); bool check_subqueries_with_recursive_references(); void collect_grouping_fields_for_derived(THD *thd, ORDER *grouping_list); @@ -2461,6 +2486,15 @@ void reduce_digest_token(uint token_left, uint token_right); private: + + enum Ident_mode + { + GENERAL_KEYWORD_OR_FUNC_LPAREN, + QUALIFIED_SPECIAL_FUNC_LPAREN + }; + + int scan_ident_common(THD *thd, Lex_ident_cli_st *str, Ident_mode mode); + /** Set the echo mode. @@ -2781,8 +2815,8 @@ bool consume_comment(int remaining_recursions_permitted); int lex_one_token(union YYSTYPE *yylval, THD *thd); int find_keyword(Lex_ident_cli_st *str, uint len, bool function) const; + int find_keyword_qualified_special_func(Lex_ident_cli_st *str, uint len) const; LEX_CSTRING get_token(uint skip, uint length); - int scan_ident_sysvar(THD *thd, Lex_ident_cli_st *str); int scan_ident_start(THD *thd, Lex_ident_cli_st *str); int scan_ident_middle(THD *thd, Lex_ident_cli_st *str, CHARSET_INFO **cs, my_lex_states *); @@ -3253,7 +3287,7 @@ Table_type table_type; /* Used for SHOW CREATE */ List ref_list; List users_list; - List *insert_list,field_list,value_list,update_list; + List *insert_list= nullptr,field_list,value_list,update_list; List many_values; List var_list; List stmt_var_list; //SET_STATEMENT values @@ -3617,6 +3651,15 @@ return (context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW); } + /** + Mark all queries in this lex structure as uncacheable for the cause given + + @param cause the reason queries are to be marked as uncacheable + + Note, any cause is sufficient for st_select_lex_unit::can_be_merged() to + disallow query merges. + */ + inline void uncacheable(uint8 cause) { safe_to_cache_query= 0; @@ -3839,7 +3882,8 @@ int case_stmt_action_then(); bool setup_select_in_parentheses(); bool set_names(const char *pos, - const Lex_exact_charset_opt_extended_collate &cs, + CHARSET_INFO *cs, + const Lex_extended_collation_st &coll, bool no_lookahead); bool set_trigger_new_row(const LEX_CSTRING *name, Item *val); bool set_trigger_field(const LEX_CSTRING *name1, const LEX_CSTRING *name2, @@ -4128,8 +4172,42 @@ Item *create_item_query_expression(THD *thd, st_select_lex_unit *unit); Item *make_item_func_sysdate(THD *thd, uint fsp); - Item *make_item_func_call_generic(THD *thd, Lex_ident_cli_st *db, - Lex_ident_cli_st *name, List *args); + + static const Schema * + find_func_schema_by_name_or_error(const Lex_ident_sys &schema_name, + const Lex_ident_sys &func_name); + Item *make_item_func_replace(THD *thd, + const Lex_ident_cli_st &schema_name, + const Lex_ident_cli_st &func_name, + Item *org, Item *find, Item *replace); + Item *make_item_func_replace(THD *thd, + const Lex_ident_cli_st &schema_name, + const Lex_ident_cli_st &func_name, + List *args); + Item *make_item_func_substr(THD *thd, + const Lex_ident_cli_st &schema_name, + const Lex_ident_cli_st &func_name, + const Lex_substring_spec_st &spec); + Item *make_item_func_substr(THD *thd, + const Lex_ident_cli_st &schema_name, + const Lex_ident_cli_st &func_name, + List *args); + Item *make_item_func_trim(THD *thd, + const Lex_ident_cli_st &schema_name, + const Lex_ident_cli_st &func_name, + const Lex_trim_st &spec); + Item *make_item_func_trim(THD *thd, + const Lex_ident_cli_st &schema_name, + const Lex_ident_cli_st &func_name, + List *args); + Item *make_item_func_call_generic(THD *thd, + const Lex_ident_cli_st *db, + const Lex_ident_cli_st *name, + List *args); + Item *make_item_func_call_generic(THD *thd, + const Lex_ident_sys &db, + const Lex_ident_sys &name, + List *args); Item *make_item_func_call_generic(THD *thd, Lex_ident_cli_st *db, Lex_ident_cli_st *pkg, @@ -4830,7 +4908,8 @@ bool check_dependencies_in_with_clauses(); bool check_cte_dependencies_and_resolve_references(); bool resolve_references_to_cte(TABLE_LIST *tables, - TABLE_LIST **tables_last); + TABLE_LIST **tables_last, + st_select_lex_unit *excl_spec); /** Turn on the SELECT_DESCRIBE flag for every SELECT_LEX involved into diff -Nru mariadb-10.11.6/sql/sql_lifo_buffer.h mariadb-10.11.9/sql/sql_lifo_buffer.h --- mariadb-10.11.6/sql/sql_lifo_buffer.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_lifo_buffer.h 2024-08-03 07:29:59.000000000 +0000 @@ -162,22 +162,22 @@ { uchar *pos; public: - enum_direction type() { return FORWARD; } - size_t used_size() + enum_direction type() override { return FORWARD; } + size_t used_size() override { return (size_t)(pos - start); } - void reset() + void reset() override { pos= start; } - uchar *end_of_space() { return pos; } - bool have_space_for(size_t bytes) + uchar *end_of_space() override { return pos; } + bool have_space_for(size_t bytes) override { return (pos + bytes < end); } - void write() + void write() override { write_bytes(write_ptr1, size1); if (size2) @@ -199,8 +199,8 @@ *position= (*position) - bytes; return *position; } - bool read() { return read(&pos, &read_ptr1, &read_ptr2); } - bool read(uchar **position, uchar **ptr1, uchar **ptr2) + bool read() override { return read(&pos, &read_ptr1, &read_ptr2); } + bool read(uchar **position, uchar **ptr1, uchar **ptr2) override { if (!have_data(*position, size1 + size2)) return TRUE; @@ -209,7 +209,7 @@ *ptr1= read_bytes(position, size1); return FALSE; } - void remove_unused_space(uchar **unused_start, uchar **unused_end) + void remove_unused_space(uchar **unused_start, uchar **unused_end) override { DBUG_ASSERT(0); /* Don't need this yet */ } @@ -228,9 +228,9 @@ end= unused_end; } /* Return pointer to start of the memory area that is occupied by the data */ - uchar *used_area() { return start; } + uchar *used_area() override { return start; } friend class Lifo_buffer_iterator; - uchar *get_pos() { return pos; } + uchar *get_pos() override { return pos; } }; @@ -254,22 +254,22 @@ { uchar *pos; public: - enum_direction type() { return BACKWARD; } + enum_direction type() override { return BACKWARD; } - size_t used_size() + size_t used_size() override { return (size_t)(end - pos); } - void reset() + void reset() override { pos= end; } - uchar *end_of_space() { return end; } - bool have_space_for(size_t bytes) + uchar *end_of_space() override { return end; } + bool have_space_for(size_t bytes) override { return (pos - bytes >= start); } - void write() + void write() override { if (write_ptr2) write_bytes(write_ptr2, size2); @@ -281,11 +281,11 @@ pos -= bytes; memcpy(pos, data, bytes); } - bool read() + bool read() override { return read(&pos, &read_ptr1, &read_ptr2); } - bool read(uchar **position, uchar **ptr1, uchar **ptr2) + bool read(uchar **position, uchar **ptr1, uchar **ptr2) override { if (!have_data(*position, size1 + size2)) return TRUE; @@ -310,7 +310,7 @@ @param unused_start OUT Start of the unused space @param unused_end OUT End of the unused space */ - void remove_unused_space(uchar **unused_start, uchar **unused_end) + void remove_unused_space(uchar **unused_start, uchar **unused_end) override { *unused_start= start; *unused_end= pos; @@ -321,9 +321,9 @@ DBUG_ASSERT(0); /* Not used for backward buffers */ } /* Return pointer to start of the memory area that is occupied by the data */ - uchar *used_area() { return pos; } + uchar *used_area() override { return pos; } friend class Lifo_buffer_iterator; - uchar *get_pos() { return pos; } + uchar *get_pos() override { return pos; } }; diff -Nru mariadb-10.11.6/sql/sql_list.h mariadb-10.11.9/sql/sql_list.h --- mariadb-10.11.6/sql/sql_list.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_list.h 2024-08-03 07:29:59.000000000 +0000 @@ -537,10 +537,9 @@ class Iterator; using value_type= T; using iterator= Iterator; - using const_iterator= const Iterator; - Iterator begin() const { return Iterator(first); } - Iterator end() const { return Iterator(); } + iterator begin() const { return iterator(first); } + iterator end() const { return iterator(); } class Iterator { @@ -561,7 +560,7 @@ return *this; } - T operator++(int) + Iterator operator++(int) { Iterator tmp(*this); operator++(); @@ -799,7 +798,9 @@ class base_ilist_iterator { base_ilist *list; - struct ilink **el,*current; + struct ilink **el; +protected: + struct ilink *current; public: base_ilist_iterator(base_ilist &list_par) :list(&list_par), el(&list_par.first),current(0) {} @@ -811,6 +812,13 @@ el= ¤t->next; return current; } + /* Unlink element returned by last next() call */ + inline void unlink(void) + { + struct ilink **tmp= current->prev; + current->unlink(); + el= tmp; + } }; @@ -840,6 +848,13 @@ public: I_List_iterator(I_List &a) : base_ilist_iterator(a) {} inline T* operator++(int) { return (T*) base_ilist_iterator::next(); } + /* Remove element returned by last next() call */ + inline void remove(void) + { + unlink(); + delete (T*) current; + current= 0; // Safety + } }; /** diff -Nru mariadb-10.11.6/sql/sql_load.cc mariadb-10.11.9/sql/sql_load.cc --- mariadb-10.11.6/sql/sql_load.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_load.cc 2024-08-03 07:29:59.000000000 +0000 @@ -107,23 +107,39 @@ class Wsrep_load_data_split { public: - Wsrep_load_data_split(THD *thd) + Wsrep_load_data_split(THD *thd, TABLE *table) : m_thd(thd) - , m_load_data_splitting(wsrep_load_data_splitting) + , m_load_data_splitting(false) , m_fragment_unit(thd->wsrep_trx().streaming_context().fragment_unit()) , m_fragment_size(thd->wsrep_trx().streaming_context().fragment_size()) { - if (WSREP(m_thd) && m_load_data_splitting) + /* + We support load data splitting for InnoDB only as it will use + streaming replication (SR). + */ + if (WSREP(thd) && wsrep_load_data_splitting) { - /* Override streaming settings with backward compatible values for - load data splitting */ - m_thd->wsrep_cs().streaming_params(wsrep::streaming_context::row, 10000); + // For partitioned tables find underlying hton + handlerton *ht= table->file->partition_ht(); + if (ht->db_type != DB_TYPE_INNODB) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_NOT_SUPPORTED_YET, + "wsrep_load_data_splitting for other than InnoDB tables"); + } + else + { + /* Override streaming settings with backward compatible values for + load data splitting */ + m_thd->wsrep_cs().streaming_params(wsrep::streaming_context::row, 10000); + m_load_data_splitting= true; + } } } ~Wsrep_load_data_split() { - if (WSREP(m_thd) && m_load_data_splitting) + if (m_load_data_splitting) { /* Restore original settings */ m_thd->wsrep_cs().streaming_params(m_fragment_unit, m_fragment_size); @@ -255,6 +271,10 @@ */ void skip_data_till_eof() { +#ifndef EMBEDDED_LIBRARY + if (mysql_bin_log.is_open()) + cache.read_function= cache.real_read_function; +#endif while (GET != my_b_EOF) ; } @@ -344,6 +364,7 @@ bool is_concurrent; #endif const char *db= table_list->db.str; // This is never null + /* If path for file is not defined, we will use the current database. If this is not set, we will use the directory where the table to be @@ -354,9 +375,6 @@ bool transactional_table __attribute__((unused)); DBUG_ENTER("mysql_load"); -#ifdef WITH_WSREP - Wsrep_load_data_split wsrep_load_data_split(thd); -#endif /* WITH_WSREP */ /* Bug #34283 mysqlbinlog leaves tmpfile after termination if binlog contains @@ -421,6 +439,11 @@ { DBUG_RETURN(TRUE); } + +#ifdef WITH_WSREP + Wsrep_load_data_split wsrep_load_data_split(thd, table_list->table); +#endif /* WITH_WSREP */ + thd_proc_info(thd, "Executing"); /* Let us emit an error if we are loading data to table which is used diff -Nru mariadb-10.11.6/sql/sql_locale.cc mariadb-10.11.9/sql/sql_locale.cc --- mariadb-10.11.6/sql/sql_locale.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_locale.cc 2024-08-03 07:29:59.000000000 +0000 @@ -969,9 +969,9 @@ /***** LOCALE BEGIN id_ID: Indonesian - Indonesia *****/ static const char *my_locale_month_names_id_ID[13] = - {"Januari","Pebruari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember", NullS }; + {"Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember", NullS }; static const char *my_locale_ab_month_names_id_ID[13] = - {"Jan","Peb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des", NullS }; + {"Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agu","Sep","Okt","Nov","Des", NullS }; static const char *my_locale_day_names_id_ID[8] = {"Senin","Selasa","Rabu","Kamis","Jumat","Sabtu","Minggu", NullS }; static const char *my_locale_ab_day_names_id_ID[8] = diff -Nru mariadb-10.11.6/sql/sql_manager.cc mariadb-10.11.9/sql/sql_manager.cc --- mariadb-10.11.6/sql/sql_manager.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_manager.cc 2024-08-03 07:29:59.000000000 +0000 @@ -26,7 +26,11 @@ #include "sql_manager.h" #include "sql_base.h" // flush_tables -static bool volatile manager_thread_in_use = 0; +/* + Values for manager_thread_in_use: 0 means "not started". 1 means "started + and active". 2 means "stopped". +*/ +static int volatile manager_thread_in_use = 0; static bool abort_manager = false; pthread_t manager_thread; @@ -44,7 +48,7 @@ bool mysql_manager_submit(void (*action)(void *), void *data) { bool result= FALSE; - DBUG_ASSERT(manager_thread_in_use); + DBUG_ASSERT(manager_thread_in_use == 1); struct handler_cb **cb; mysql_mutex_lock(&LOCK_manager); cb= &cb_list; @@ -76,7 +80,9 @@ pthread_detach_this_thread(); manager_thread = pthread_self(); mysql_mutex_lock(&LOCK_manager); - while (!abort_manager) + manager_thread_in_use = 1; + mysql_cond_signal(&COND_manager); + while (!abort_manager || cb_list) { /* XXX: This will need to be made more general to handle different * polling needs. */ @@ -116,7 +122,8 @@ } mysql_mutex_lock(&LOCK_manager); } - manager_thread_in_use = 0; + DBUG_ASSERT(cb_list == NULL); + manager_thread_in_use = 2; mysql_mutex_unlock(&LOCK_manager); mysql_mutex_destroy(&LOCK_manager); mysql_cond_destroy(&COND_manager); @@ -135,12 +142,28 @@ pthread_t hThread; int err; DBUG_EXECUTE_IF("delay_start_handle_manager", my_sleep(1000);); - manager_thread_in_use = 1; mysql_cond_init(key_COND_manager, &COND_manager,NULL); mysql_mutex_init(key_LOCK_manager, &LOCK_manager, NULL); if ((err= mysql_thread_create(key_thread_handle_manager, &hThread, &connection_attrib, handle_manager, 0))) + { sql_print_warning("Can't create handle_manager thread (errno: %M)", err); + DBUG_VOID_RETURN; + } + + mysql_mutex_lock(&LOCK_manager); + /* + Wait for manager thread to have started, otherwise in extreme cases the + server may start up and have initiated shutdown at the time the manager + thread even starts to run. + + Allow both values 1 and 2 for manager_thread_in_use, so that we will not + get stuck here if the manager thread somehow manages to start up and + abort again before we have time to test it here. + */ + while (!manager_thread_in_use) + mysql_cond_wait(&COND_manager, &LOCK_manager); + mysql_mutex_unlock(&LOCK_manager); } DBUG_VOID_RETURN; } diff -Nru mariadb-10.11.6/sql/sql_parse.cc mariadb-10.11.9/sql/sql_parse.cc --- mariadb-10.11.6/sql/sql_parse.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_parse.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1132,8 +1132,9 @@ { for (const TABLE_LIST *table= tables; table; table= table->next_global) { - LEX_CSTRING db= table->db, tn= table->table_name; - if (get_table_category(&db, &tn) < TABLE_CATEGORY_INFORMATION) + if (get_table_category(Lex_ident_db(table->db), + Lex_ident_table(table->table_name)) + < TABLE_CATEGORY_INFORMATION) return false; } return tables != NULL; @@ -1528,14 +1529,14 @@ int error; public: Silence_all_errors():error(0) {} - virtual ~Silence_all_errors() {} + ~Silence_all_errors() override {} - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sql_state, Sql_condition::enum_warning_level *level, const char* msg, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { error= sql_errno; *cond_hdl= NULL; @@ -2124,7 +2125,6 @@ { ulong pos; ushort flags; - uint32 slave_server_id; status_var_increment(thd->status_var.com_other); @@ -2135,10 +2135,26 @@ /* TODO: The following has to be changed to an 8 byte integer */ pos = uint4korr(packet); flags = uint2korr(packet + 4); - thd->variables.server_id=0; /* avoid suicide */ - if ((slave_server_id= uint4korr(packet+6))) // mysqlbinlog.server_id==0 - kill_zombie_dump_threads(slave_server_id); - thd->variables.server_id = slave_server_id; + if ((thd->variables.server_id= uint4korr(packet+6))) + { + bool got_error; + + got_error= kill_zombie_dump_threads(thd, + thd->variables.server_id); + if (got_error || thd->killed) + { + if (!thd->killed) + my_printf_error(ER_MASTER_FATAL_ERROR_READING_BINLOG, + "Could not start dump thread for slave: %u as " + "it has already a running dump thread", + MYF(0), (uint) thd->variables.server_id); + else if (! thd->get_stmt_da()->is_set()) + thd->send_kill_message(); + error= TRUE; + thd->unregister_slave(); // todo: can be extraneous + break; + } + } const char *name= packet + 10; size_t nlen= strlen(name); @@ -2146,6 +2162,8 @@ general_log_print(thd, command, "Log: '%s' Pos: %lu", name, pos); if (nlen < FN_REFLEN) mysql_binlog_send(thd, thd->strmake(name, nlen), (my_off_t)pos, flags); + if (thd->killed && ! thd->get_stmt_da()->is_set()) + thd->send_kill_message(); thd->unregister_slave(); // todo: can be extraneous /* fake COM_QUIT -- if we get here, the thread needs to terminate */ error = TRUE; @@ -2233,6 +2251,7 @@ my_eof(thd); kill_mysql(thd); error=TRUE; + DBUG_EXECUTE_IF("simulate_slow_client_at_shutdown", my_sleep(2000000);); break; } #endif @@ -2390,6 +2409,11 @@ } #endif /* WITH_WSREP */ + if (thd->reset_sp_cache) + { + thd->sp_caches_empty(); + thd->reset_sp_cache= false; + } if (do_end_of_statement) { @@ -2435,7 +2459,7 @@ /* Performance Schema Interface instrumentation, end */ MYSQL_END_STATEMENT(thd->m_statement_psi, thd->get_stmt_da()); thd->set_examined_row_count(0); // For processlist - thd->set_command(COM_SLEEP); + thd->mark_connection_idle(); thd->m_statement_psi= NULL; thd->m_digest= NULL; @@ -2449,6 +2473,8 @@ */ thd->lex->m_sql_cmd= NULL; free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC)); + DBUG_EXECUTE_IF("print_allocated_thread_memory", + SAFEMALLOC_REPORT_MEMORY(sf_malloc_dbug_id());); #if defined(ENABLED_PROFILING) thd->profiling.finish_current_query(); @@ -2464,6 +2490,7 @@ MYSQL_COMMAND_DONE(res); } DEBUG_SYNC(thd,"dispatch_command_end"); + DEBUG_SYNC(thd,"dispatch_command_end2"); /* Check that some variables are reset properly */ DBUG_ASSERT(thd->abort_on_warning == 0); @@ -2661,8 +2688,8 @@ DBUG_RETURN(1); lex->query_tables_last= query_tables_last; break; -#endif } +#endif case SCH_PROFILES: /* Mark this current profiling record to be discarded. We don't @@ -2918,7 +2945,7 @@ Deadlock occurred during upgrade of metadata lock. Let us restart acquring and opening tables for LOCK TABLES. */ - close_tables_for_reopen(thd, &tables, mdl_savepoint); + close_tables_for_reopen(thd, &tables, mdl_savepoint, true); if (thd->open_temporary_tables(tables)) goto err; goto retry; @@ -4630,10 +4657,15 @@ if ((res= insert_precheck(thd, all_tables))) break; + #ifdef WITH_WSREP - if (WSREP(thd) && thd->wsrep_consistency_check == CONSISTENCY_CHECK_DECLARED) + bool wsrep_toi= false; + const bool wsrep= WSREP(thd); + + if (wsrep && thd->wsrep_consistency_check == CONSISTENCY_CHECK_DECLARED) { thd->wsrep_consistency_check = CONSISTENCY_CHECK_RUNNING; + wsrep_toi= true; WSREP_TO_ISOLATION_BEGIN(first_table->db.str, first_table->table_name.str, NULL); } #endif /* WITH_WSREP */ @@ -4668,6 +4700,27 @@ if (!(res=open_and_lock_tables(thd, all_tables, TRUE, 0))) { MYSQL_INSERT_SELECT_START(thd->query()); + +#ifdef WITH_WSREP + if (wsrep && !first_table->view) + { + bool is_innodb= first_table->table->file->partition_ht()->db_type == DB_TYPE_INNODB; + + // For consistency check inserted table needs to be InnoDB + if (!is_innodb && thd->wsrep_consistency_check != NO_CONSISTENCY_CHECK) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_UNSUPPORTED, + "Galera cluster does support consistency check only" + " for InnoDB tables."); + thd->wsrep_consistency_check= NO_CONSISTENCY_CHECK; + } + + // For !InnoDB we start TOI if it is not yet started and hope for the best + if (!is_innodb && !wsrep_toi) + WSREP_TO_ISOLATION_BEGIN(first_table->db.str, first_table->table_name.str, NULL); + } +#endif /* WITH_WSREP */ /* Only the INSERT table should be merged. Other will be handled by select. @@ -5173,9 +5226,55 @@ my_ok(thd); break; case SQLCOM_BACKUP_LOCK: - if (check_global_access(thd, RELOAD_ACL)) - goto error; - /* first table is set for lock. For unlock the list is empty */ + if (check_global_access(thd, RELOAD_ACL, true)) + { +#ifndef NO_EMBEDDED_ACCESS_CHECKS + /* + In case there is no global privilege, check DB privilege for LOCK TABLES. + */ + if (first_table) // BACKUP LOCK + { + if (check_single_table_access(thd, LOCK_TABLES_ACL, first_table, true)) + { + char command[30]; + get_privilege_desc(command, sizeof(command), RELOAD_ACL|LOCK_TABLES_ACL); + my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), command); + goto error; + } + } + else // BACKUP UNLOCK + { + /* + We test mdl_backup_lock here because, if a user could obtain a lock + it would be silly to error and say `you can't BACKUP UNLOCK` + (because its obvious you did a `BACKUP LOCK`). + As `BACKUP UNLOCK` doesn't have a database reference, + there's no way we can check if the `BACKUP LOCK` privilege is missing. + Testing `thd->db` would involve faking a `TABLE_LIST` structure, + which because of the depth of inspection + in `check_single_table_access` makes the faking likely to cause crashes, + or unintended effects. The outcome of this is, + if a user does an `BACKUP UNLOCK` without a `BACKUP LOCKED` table, + there may be a` ER_SPECIFIC_ACCESS_DENIED` error even though + user has the privilege. + Its a bit different to what happens if the user has RELOAD_ACL, + where the error is silently ignored. + */ + if (!thd->mdl_backup_lock) + { + + char command[30]; + get_privilege_desc(command, sizeof(command), RELOAD_ACL|LOCK_TABLES_ACL); + my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), command); + goto error; + } + } +#endif + } + /* + There is reload privilege, first table is set for lock. + For unlock the list is empty + */ if (first_table) res= backup_lock(thd, first_table); else @@ -5799,7 +5898,7 @@ if (sph->sp_resolve_package_routine(thd, thd->lex->sphead, lex->spname, &sph, &pkgname)) return true; - if (sph->sp_cache_routine(thd, lex->spname, false, &sp)) + if (sph->sp_cache_routine(thd, lex->spname, &sp)) goto error; if (!sp || sp->show_routine_code(thd)) { @@ -6076,13 +6175,11 @@ if (unlikely(thd->is_error()) || (thd->variables.option_bits & OPTION_MASTER_SQL_ERROR)) { - THD_STAGE_INFO(thd, stage_rollback); trans_rollback_stmt(thd); } else { /* If commit fails, we should be able to reset the OK status. */ - THD_STAGE_INFO(thd, stage_commit); thd->get_stmt_da()->set_overwrite_status(true); trans_commit_stmt(thd); thd->get_stmt_da()->set_overwrite_status(false); @@ -6109,7 +6206,6 @@ one of storage engines (e.g. due to deadlock). Rollback transaction in all storage engines including binary log. */ - THD_STAGE_INFO(thd, stage_rollback_implicit); trans_rollback_implicit(thd); thd->release_transactional_locks(); } @@ -6119,7 +6215,6 @@ DBUG_ASSERT(! thd->in_sub_stmt); if (!(thd->variables.option_bits & OPTION_GTID_BEGIN)) { - THD_STAGE_INFO(thd, stage_commit_implicit); /* If commit fails, we should be able to reset the OK status. */ thd->get_stmt_da()->set_overwrite_status(true); /* Commit the normal transaction if one is active. */ @@ -6388,15 +6483,15 @@ { TABLE_LIST *next= table->next_local; - if (!strcmp(table->get_db_name(), cur_table->get_db_name()) && - !strcmp(table->get_table_name(), cur_table->get_table_name())) + if (!strcmp(table->get_db_name().str, cur_table->get_db_name().str) && + !strcmp(table->get_table_name().str, cur_table->get_table_name().str)) { /* Table was moved away, can't be same as 'table' */ found= 1; res= 0; // Table can't be a temporary table } - if (!strcmp(next->get_db_name(), cur_table->get_db_name()) && - !strcmp(next->get_table_name(), cur_table->get_table_name())) + if (!strcmp(next->get_db_name().str, cur_table->get_db_name().str) && + !strcmp(next->get_table_name().str, cur_table->get_table_name().str)) { /* Table has matching name with new name of this table. cur_table should @@ -6502,6 +6597,23 @@ DBUG_EXECUTE_IF("4x_server_emul", my_error(ER_UNKNOWN_ERROR, MYF(0)); return 1;); +#if MYSQL_VERSION_ID<=110301 + /* + This piece of the code was added in 10.5 to fix MDEV-32376. + It should not get to 11.3 or higer, as MDEV-32376 was fixed + in a different way in 11.3.1 (see MDEV-31948). + */ + if (lex->name.length > sizeof(db_name_buff) - 1) + { + my_error(ER_WRONG_DB_NAME, MYF(0), + ErrConvString(lex->name.str, lex->name.length, + system_charset_info).ptr()); + return 1; + } +#else +#error Remove this preprocessor-conditional code in 11.3.1+ +#endif + db_name.str= db_name_buff; db_name.length= lex->name.length; strmov(db_name_buff, lex->name.str); @@ -7155,8 +7267,7 @@ INSERT_ACL : SELECT_ACL); } - if (check_access(thd, want_access, - table_ref->get_db_name(), + if (check_access(thd, want_access, table_ref->get_db_name().str, &table_ref->grant.privilege, &table_ref->grant.m_internal, 0, no_errors)) @@ -7453,6 +7564,7 @@ #endif check_stack_overrun(THD *thd, long margin, uchar *buf __attribute__((unused))) { +#ifndef __SANITIZE_ADDRESS__ long stack_used; DBUG_ASSERT(thd == current_thd); if ((stack_used= available_stack_size(thd->thread_stack, &stack_used)) >= @@ -7475,6 +7587,7 @@ #ifndef DBUG_OFF max_stack_used= MY_MAX(max_stack_used, stack_used); #endif +#endif /* __SANITIZE_ADDRESS__ */ return 0; } @@ -7931,6 +8044,7 @@ thd->wsrep_retry_query = NULL; thd->wsrep_retry_query_len = 0; thd->wsrep_retry_command = COM_CONNECT; + thd->proc_info= 0; } return false; } @@ -8175,10 +8289,6 @@ List *partition_names, LEX_STRING *option) { - TABLE_LIST *ptr; - TABLE_LIST *UNINIT_VAR(previous_table_ref); /* The table preceding the current one. */ - LEX_CSTRING alias_str; - LEX *lex= thd->lex; DBUG_ENTER("add_table_to_list"); DBUG_PRINT("enter", ("Table '%s' (%p) Select %p (%u)", (alias ? alias->str : table->table.str), @@ -8188,9 +8298,7 @@ if (unlikely(!table)) DBUG_RETURN(0); // End of memory - alias_str= alias ? *alias : table->table; - DBUG_ASSERT(alias_str.str); - if (!MY_TEST(table_options & TL_OPTION_ALIAS) && + if (!(table_options & TL_OPTION_ALIAS) && unlikely(check_table_name(table->table.str, table->table.length, FALSE))) { my_error(ER_WRONG_TABLE_NAME, MYF(0), table->table.str); @@ -8205,6 +8313,34 @@ DBUG_RETURN(0); } + LEX_CSTRING db{0, 0}; + bool fqtn= false; + LEX *lex= thd->lex; + if (table->db.str) + { + fqtn= TRUE; + db= table->db; + } + else if (!lex->with_cte_resolution && lex->copy_db_to(&db)) + DBUG_RETURN(0); + else + fqtn= FALSE; + bool info_schema= is_infoschema_db(&db); + if (!table->sel && info_schema && + (table_options & TL_OPTION_UPDATING) && + /* Special cases which are processed by commands itself */ + lex->sql_command != SQLCOM_CHECK && + lex->sql_command != SQLCOM_CHECKSUM) + { + my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), + thd->security_ctx->priv_user, + thd->security_ctx->priv_host, + INFORMATION_SCHEMA_NAME.str); + DBUG_RETURN(0); + } + + LEX_CSTRING alias_str= alias ? *alias : table->table; + DBUG_ASSERT(alias_str.str); if (!alias) /* Alias is case sensitive */ { if (unlikely(table->sel)) @@ -8217,65 +8353,15 @@ if (unlikely(!(alias_str.str= (char*) thd->memdup(alias_str.str, alias_str.length+1)))) DBUG_RETURN(0); } - if (unlikely(!(ptr = (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))) - DBUG_RETURN(0); /* purecov: inspected */ - if (table->db.str) - { - ptr->is_fqtn= TRUE; - ptr->db= table->db; - } - else if (!lex->with_cte_resolution && lex->copy_db_to(&ptr->db)) - DBUG_RETURN(0); - else - ptr->is_fqtn= FALSE; - ptr->alias= alias_str; - ptr->is_alias= alias ? TRUE : FALSE; - if (lower_case_table_names) - { - if (table->table.length) - table->table.length= my_casedn_str(files_charset_info, - (char*) table->table.str); - if (ptr->db.length && ptr->db.str != any_db.str) - ptr->db.length= my_casedn_str(files_charset_info, (char*) ptr->db.str); - } - - ptr->table_name= table->table; - ptr->lock_type= lock_type; - ptr->mdl_type= mdl_type; - ptr->table_options= table_options; - ptr->updating= MY_TEST(table_options & TL_OPTION_UPDATING); - /* TODO: remove TL_OPTION_FORCE_INDEX as it looks like it's not used */ - ptr->force_index= MY_TEST(table_options & TL_OPTION_FORCE_INDEX); - ptr->ignore_leaves= MY_TEST(table_options & TL_OPTION_IGNORE_LEAVES); - ptr->sequence= MY_TEST(table_options & TL_OPTION_SEQUENCE); - ptr->derived= table->sel; - if (!ptr->derived && is_infoschema_db(&ptr->db)) - { - if (ptr->updating && - /* Special cases which are processed by commands itself */ - lex->sql_command != SQLCOM_CHECK && - lex->sql_command != SQLCOM_CHECKSUM) - { - my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), - thd->security_ctx->priv_user, - thd->security_ctx->priv_host, - INFORMATION_SCHEMA_NAME.str); - DBUG_RETURN(0); - } - ST_SCHEMA_TABLE *schema_table; - schema_table= find_schema_table(thd, &ptr->table_name); - ptr->schema_table_name= ptr->table_name; - ptr->schema_table= schema_table; - } - ptr->select_lex= this; - /* - We can't cache internal temporary tables between prepares as the - table may be deleted before next exection. - */ - ptr->cacheable_table= !table->is_derived_table(); - ptr->index_hints= index_hints_arg; - ptr->option= option ? option->str : 0; + bool has_alias_ptr= alias != nullptr; + void *memregion= thd->alloc(sizeof(TABLE_LIST)); + TABLE_LIST *ptr= new (memregion) TABLE_LIST(thd, db, fqtn, alias_str, + has_alias_ptr, table, lock_type, + mdl_type, table_options, + info_schema, this, + index_hints_arg, option); + /* check that used name is unique. Sequences are ignored */ if (lock_type != TL_IGNORE && !ptr->sequence) { @@ -8298,6 +8384,7 @@ } } /* Store the table reference preceding the current one. */ + TABLE_LIST *UNINIT_VAR(previous_table_ref); /* The table preceding the current one. */ if (table_list.elements > 0 && likely(!ptr->sequence)) { /* @@ -9053,6 +9140,7 @@ /** Fix condition which contains only field (f turns to f <> 0 ) + or only contains the function NOT field (not f turns to f == 0) @param cond The condition to fix @@ -9068,6 +9156,21 @@ { cond= new (thd->mem_root) Item_func_ne(thd, cond, new (thd->mem_root) Item_int(thd, 0)); } + else + { + if (type == Item::FUNC_ITEM) + { + Item_func *func_item= (Item_func *)cond; + if (func_item->functype() == Item_func::NOT_FUNC) + { + Item *arg= func_item->arguments()[0]; + if (arg->type() == Item::FIELD_ITEM || + arg->type() == Item::REF_ITEM) + cond= new (thd->mem_root) Item_func_eq(thd, arg, + new (thd->mem_root) Item_int(thd, 0)); + } + } + } } return cond; } @@ -9198,8 +9301,12 @@ @param type Type of id: thread id or query id */ -uint -kill_one_thread(THD *thd, my_thread_id id, killed_state kill_signal, killed_type type) +static uint +kill_one_thread(THD *thd, my_thread_id id, killed_state kill_signal, killed_type type +#ifdef WITH_WSREP + , bool &wsrep_high_priority +#endif +) { THD *tmp; uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD); @@ -9234,17 +9341,22 @@ mysql_mutex_lock(&tmp->LOCK_thd_data); // Lock from concurrent usage -#ifdef WITH_WSREP - if (((thd->security_ctx->master_access & PRIV_KILL_OTHER_USER_PROCESS) || - thd->security_ctx->user_matches(tmp->security_ctx)) && - !wsrep_thd_is_BF(tmp, false) && !tmp->wsrep_applier) -#else if ((thd->security_ctx->master_access & PRIV_KILL_OTHER_USER_PROCESS) || thd->security_ctx->user_matches(tmp->security_ctx)) -#endif /* WITH_WSREP */ { - { #ifdef WITH_WSREP + if (wsrep_thd_is_BF(tmp, false) || tmp->wsrep_applier) + { + error= ER_KILL_DENIED_ERROR; + wsrep_high_priority= true; + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_KILL_DENIED_ERROR, + "Thread %lld is %s and cannot be killed", + tmp->thread_id, + (tmp->wsrep_applier ? "wsrep applier" : "high priority")); + } + else + { if (WSREP(tmp)) { error = wsrep_kill_thd(thd, tmp, kill_signal); @@ -9256,8 +9368,8 @@ error= 0; #ifdef WITH_WSREP } -#endif /* WITH_WSREP */ } +#endif /* WITH_WSREP */ } else error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR : @@ -9285,11 +9397,13 @@ struct kill_threads_callback_arg { - kill_threads_callback_arg(THD *thd_arg, LEX_USER *user_arg): - thd(thd_arg), user(user_arg) {} + kill_threads_callback_arg(THD *thd_arg, LEX_USER *user_arg, + killed_state kill_signal_arg): + thd(thd_arg), user(user_arg), kill_signal(kill_signal_arg), counter(0) {} THD *thd; LEX_USER *user; - List threads_to_kill; + killed_state kill_signal; + uint counter; }; @@ -9312,11 +9426,12 @@ { return MY_TEST(arg->thd->security_ctx->master_access & PROCESS_ACL); } - if (!arg->threads_to_kill.push_back(thd, arg->thd->mem_root)) - { - mysql_mutex_lock(&thd->LOCK_thd_kill); // Lock from delete - mysql_mutex_lock(&thd->LOCK_thd_data); - } + arg->counter++; + mysql_mutex_lock(&thd->LOCK_thd_kill); // Lock from delete + mysql_mutex_lock(&thd->LOCK_thd_data); + thd->awake_no_mutex(arg->kill_signal); + mysql_mutex_unlock(&thd->LOCK_thd_data); + mysql_mutex_unlock(&thd->LOCK_thd_kill); } } return 0; @@ -9326,42 +9441,17 @@ static uint kill_threads_for_user(THD *thd, LEX_USER *user, killed_state kill_signal, ha_rows *rows) { - kill_threads_callback_arg arg(thd, user); + kill_threads_callback_arg arg(thd, user, kill_signal); DBUG_ENTER("kill_threads_for_user"); - - *rows= 0; - - if (unlikely(thd->is_fatal_error)) // If we run out of memory - DBUG_RETURN(ER_OUT_OF_RESOURCES); - DBUG_PRINT("enter", ("user: %s signal: %u", user->user.str, (uint) kill_signal)); + *rows= 0; + if (server_threads.iterate(kill_threads_callback, &arg)) DBUG_RETURN(ER_KILL_DENIED_ERROR); - if (!arg.threads_to_kill.is_empty()) - { - List_iterator_fast it2(arg.threads_to_kill); - THD *next_ptr; - THD *ptr= it2++; - do - { - ptr->awake_no_mutex(kill_signal); - /* - Careful here: The list nodes are allocated on the memroots of the - THDs to be awakened. - But those THDs may be terminated and deleted as soon as we release - LOCK_thd_kill, which will make the list nodes invalid. - Since the operation "it++" dereferences the "next" pointer of the - previous list node, we need to do this while holding LOCK_thd_kill. - */ - next_ptr= it2++; - mysql_mutex_unlock(&ptr->LOCK_thd_kill); - mysql_mutex_unlock(&ptr->LOCK_thd_data); - (*rows)++; - } while ((ptr= next_ptr)); - } + *rows= arg.counter; DBUG_RETURN(0); } @@ -9378,16 +9468,32 @@ static void sql_kill(THD *thd, my_thread_id id, killed_state state, killed_type type) { - uint error; - if (likely(!(error= kill_one_thread(thd, id, state, type)))) +#ifdef WITH_WSREP + bool wsrep_high_priority= false; +#endif + uint error= kill_one_thread(thd, id, state, type +#ifdef WITH_WSREP + , wsrep_high_priority +#endif + ); + + if (likely(!error)) { if (!thd->killed) my_ok(thd); else thd->send_kill_message(); } +#ifdef WITH_WSREP + else if (wsrep_high_priority) + my_printf_error(error, "This is a high priority thread/query and" + " cannot be killed without compromising" + " the consistency of the cluster", MYF(0)); +#endif else + { my_error(error, MYF(0), id); + } } @@ -9403,7 +9509,7 @@ break; case ER_KILL_DENIED_ERROR: char buf[DEFINER_LENGTH+1]; - strxnmov(buf, sizeof(buf), user->user.str, "@", user->host.str, NULL); + strxnmov(buf, sizeof(buf)-1, user->user.str, "@", user->host.str, NULL); my_printf_error(ER_KILL_DENIED_ERROR, ER_THD(thd, ER_CANNOT_USER), MYF(0), "KILL USER", buf); break; diff -Nru mariadb-10.11.6/sql/sql_partition.cc mariadb-10.11.9/sql/sql_partition.cc --- mariadb-10.11.6/sql/sql_partition.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_partition.cc 2024-08-03 07:29:59.000000000 +0000 @@ -137,11 +137,11 @@ THD *thd= current_thd; Name_resolution_context *context= &thd->lex->current_select->context; TABLE_LIST *save_list= context->table_list; - const char *save_where= thd->where; + THD_WHERE save_where= thd->where; item= item->safe_charset_converter(thd, cs); context->table_list= NULL; - thd->where= "convert character set partition constant"; + thd->where= THD_WHERE::CONVERT_CHARSET_CONST; if (item && item->fix_fields_if_needed(thd, (Item**)NULL)) item= NULL; thd->where= save_where; @@ -836,7 +836,7 @@ func_expr->walk(&Item::change_context_processor, 0, &lex.first_select_lex()->context); - thd->where= "partition function"; + thd->where= THD_WHERE::PARTITION_FUNCTION; /* In execution we must avoid the use of thd->change_item_tree since we might release memory before statement is completed. We do this @@ -1080,7 +1080,7 @@ static bool set_up_partition_bitmaps(THD *thd, partition_info *part_info) { - uint32 *bitmap_buf; + my_bitmap_map *bitmap_buf; uint bitmap_bits= part_info->num_subparts? (part_info->num_subparts* part_info->num_parts): part_info->num_parts; @@ -1091,14 +1091,15 @@ /* Allocate for both read and lock_partitions */ if (unlikely(!(bitmap_buf= - (uint32*) alloc_root(&part_info->table->mem_root, - bitmap_bytes * 2)))) + (my_bitmap_map*) alloc_root(&part_info->table->mem_root, + bitmap_bytes * 2)))) DBUG_RETURN(TRUE); my_bitmap_init(&part_info->read_partitions, bitmap_buf, bitmap_bits); /* Use the second half of the allocated buffer for lock_partitions */ - my_bitmap_init(&part_info->lock_partitions, bitmap_buf + (bitmap_bytes / 4), - bitmap_bits); + my_bitmap_init(&part_info->lock_partitions, + (my_bitmap_map*) (((char*) bitmap_buf) + bitmap_bytes), + bitmap_bits); part_info->bitmaps_are_initialized= TRUE; part_info->set_partition_bitmaps(NULL); DBUG_RETURN(FALSE); @@ -2177,7 +2178,7 @@ const char *path) { char temp_path[FN_REFLEN]; - strcpy(temp_path, path); + safe_strcpy(temp_path, sizeof(temp_path), path); #ifdef _WIN32 /* Convert \ to / to be able to create table on unix */ char *pos, *end; @@ -7752,7 +7753,7 @@ ERROR_INJECT("add_partition_1") || mysql_write_frm(lpt, WFRM_WRITE_SHADOW) || ERROR_INJECT("add_partition_2") || - wait_while_table_is_used(thd, table, HA_EXTRA_NOT_USED) || + wait_while_table_is_used(thd, table, HA_EXTRA_PREPARE_FOR_RENAME) || ERROR_INJECT("add_partition_3") || write_log_add_change_partition(lpt) || ERROR_INJECT("add_partition_4") || diff -Nru mariadb-10.11.6/sql/sql_partition_admin.h mariadb-10.11.9/sql/sql_partition_admin.h --- mariadb-10.11.6/sql/sql_partition_admin.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_partition_admin.h 2024-08-03 07:29:59.000000000 +0000 @@ -32,12 +32,12 @@ {} /* Override SQLCOM_*, since it is an ALTER command */ - virtual enum_sql_command sql_command_code() const + virtual enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_TABLE; } - bool execute(THD *thd); + bool execute(THD *thd) override; }; @@ -129,7 +129,7 @@ ~Sql_cmd_alter_table_exchange_partition() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; private: bool exchange_partition(THD *thd, TABLE_LIST *, Alter_info *); @@ -151,10 +151,10 @@ ~Sql_cmd_alter_table_analyze_partition() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; /* Override SQLCOM_ANALYZE, since it is an ALTER command */ - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_TABLE; } @@ -176,10 +176,10 @@ ~Sql_cmd_alter_table_check_partition() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; /* Override SQLCOM_CHECK, since it is an ALTER command */ - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_TABLE; } @@ -201,10 +201,10 @@ ~Sql_cmd_alter_table_optimize_partition() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; /* Override SQLCOM_OPTIMIZE, since it is an ALTER command */ - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_TABLE; } @@ -226,10 +226,10 @@ ~Sql_cmd_alter_table_repair_partition() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; /* Override SQLCOM_REPAIR, since it is an ALTER command */ - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_TABLE; } @@ -249,10 +249,10 @@ virtual ~Sql_cmd_alter_table_truncate_partition() = default; - bool execute(THD *thd); + bool execute(THD *thd) override; /* Override SQLCOM_TRUNCATE, since it is an ALTER command */ - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_ALTER_TABLE; } diff -Nru mariadb-10.11.6/sql/sql_plugin.cc mariadb-10.11.9/sql/sql_plugin.cc --- mariadb-10.11.6/sql/sql_plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_plugin.cc 2024-08-03 07:29:59.000000000 +0000 @@ -314,22 +314,22 @@ sys_var_pluginvar(sys_var_chain *chain, const char *name_arg, st_plugin_int *p, st_mysql_sys_var *plugin_var_arg, const char *substitute); - sys_var_pluginvar *cast_pluginvar() { return this; } + sys_var_pluginvar *cast_pluginvar() override { return this; } uchar* real_value_ptr(THD *thd, enum_var_type type) const; TYPELIB* plugin_var_typelib(void) const; const uchar* do_value_ptr(THD *thd, enum_var_type type, const LEX_CSTRING *base) const; - const uchar* session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar* session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return do_value_ptr(thd, OPT_SESSION, base); } - const uchar* global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar* global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return do_value_ptr(thd, OPT_GLOBAL, base); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return do_value_ptr(thd, OPT_DEFAULT, 0); } - bool do_check(THD *thd, set_var *var); - virtual void session_save_default(THD *thd, set_var *var) {} - virtual void global_save_default(THD *thd, set_var *var) {} - bool session_update(THD *thd, set_var *var); - bool global_update(THD *thd, set_var *var); - bool session_is_default(THD *thd); + bool do_check(THD *thd, set_var *var) override; + void session_save_default(THD *thd, set_var *var) override {} + void global_save_default(THD *thd, set_var *var) override {} + bool session_update(THD *thd, set_var *var) override; + bool global_update(THD *thd, set_var *var) override; + bool session_is_default(THD *thd) override; }; @@ -379,9 +379,10 @@ my_strcasecmp(&my_charset_latin1, dl->str + dl->length - so_ext_len, SO_EXT)) { - char *s= (char*)alloc_root(root, dl->length + so_ext_len + 1); + size_t s_size= dl->length + so_ext_len + 1; + char *s= (char*)alloc_root(root, s_size); memcpy(s, dl->str, dl->length); - strcpy(s + dl->length, SO_EXT); + safe_strcpy(s + dl->length, s_size - dl->length, SO_EXT); dl->str= s; dl->length+= so_ext_len; } @@ -1505,7 +1506,7 @@ else ret= plugin_do_initialize(plugin, state); - if (ret) + if (ret && ret != HA_ERR_RETRY_INIT) plugin_variables_deinit(plugin); mysql_mutex_lock(&LOCK_plugin); @@ -1688,7 +1689,6 @@ } } - free_root(&tmp_root, MYF(MY_MARK_BLOCKS_FREE)); tmp.state= PLUGIN_IS_UNINITIALIZED; if (register_builtin(plugin, &tmp, &plugin_ptr)) goto err_unlock; @@ -1787,6 +1787,7 @@ uint state= plugin_ptr->state; mysql_mutex_unlock(&LOCK_plugin); error= plugin_do_initialize(plugin_ptr, state); + DBUG_EXECUTE_IF("fail_spider_init_retry", error= 1;); mysql_mutex_lock(&LOCK_plugin); plugin_ptr->state= state; if (error == HA_ERR_RETRY_INIT) @@ -1967,7 +1968,7 @@ the mutex here to satisfy the assert */ mysql_mutex_lock(&LOCK_plugin); - plugin_add(tmp_root, false, &name, &dl, MYF(ME_ERROR_LOG)); + plugin_add(tmp_root, true, &name, &dl, MYF(ME_ERROR_LOG)); free_root(tmp_root, MYF(MY_MARK_BLOCKS_FREE)); mysql_mutex_unlock(&LOCK_plugin); } @@ -3842,7 +3843,7 @@ DBUG_ENTER("construct_options"); plugin_name_ptr= (char*) alloc_root(mem_root, plugin_name_len + 1); - strcpy(plugin_name_ptr, plugin_name); + safe_strcpy(plugin_name_ptr, plugin_name_len + 1, plugin_name); my_casedn_str(&my_charset_latin1, plugin_name_ptr); convert_underscore_to_dash(plugin_name_ptr, plugin_name_len); plugin_name_with_prefix_ptr= (char*) alloc_root(mem_root, @@ -4262,7 +4263,7 @@ if (unlikely(error)) { - sql_print_error("Parsing options for plugin '%s' failed.", + sql_print_error("Parsing options for plugin '%s' failed. Disabling plugin", tmp->name.str); goto err; } diff -Nru mariadb-10.11.6/sql/sql_plugin_services.inl mariadb-10.11.9/sql/sql_plugin_services.inl --- mariadb-10.11.6/sql/sql_plugin_services.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_plugin_services.inl 2024-08-03 07:29:59.000000000 +0000 @@ -18,6 +18,7 @@ #include #include #include +#include struct st_service_ref { const char *name; @@ -183,7 +184,8 @@ wsrep_report_bf_lock_wait, wsrep_thd_kill_LOCK, wsrep_thd_kill_UNLOCK, - wsrep_thd_set_PA_unsafe + wsrep_thd_set_PA_unsafe, + wsrep_get_domain_id }; static struct thd_specifics_service_st thd_specifics_handler= @@ -218,6 +220,11 @@ my_printv_error }; +static struct print_check_msg_service_st print_check_msg_handler= +{ + print_check_msg +}; + static struct json_service_st json_handler= { json_type, @@ -228,11 +235,6 @@ json_unescape_json }; -static struct thd_mdl_service_st thd_mdl_handler= -{ - thd_mdl_context -}; - struct sql_service_st sql_service_handler= { mysql_init, @@ -251,7 +253,13 @@ mysql_fetch_lengths, mysql_set_character_set, mysql_num_fields, - mysql_select_db + mysql_select_db, + mysql_ssl_set +}; + +static struct thd_mdl_service_st thd_mdl_handler= +{ + thd_mdl_context }; #define DEFINE_warning_function(name, ret) { \ @@ -334,6 +342,7 @@ { "my_crypt_service", VERSION_my_crypt, &crypt_handler}, { "my_md5_service", VERSION_my_md5, &my_md5_handler}, { "my_print_error_service", VERSION_my_print_error, &my_print_error_handler}, + { "print_check_msg_service", VERSION_print_check_msg, &print_check_msg_handler}, { "my_sha1_service", VERSION_my_sha1, &my_sha1_handler}, { "my_sha2_service", VERSION_my_sha2, &my_sha2_handler}, { "my_snprintf_service", VERSION_my_snprintf, &my_snprintf_handler }, @@ -348,8 +357,8 @@ { "thd_wait_service", VERSION_thd_wait, &thd_wait_handler }, { "wsrep_service", VERSION_wsrep, &wsrep_handler }, { "json_service", VERSION_json, &json_handler }, - { "thd_mdl_service", VERSION_thd_mdl, &thd_mdl_handler }, { "sql_service", VERSION_sql_service, &sql_service_handler }, + { "thd_mdl_service", VERSION_thd_mdl, &thd_mdl_handler }, { "provider_service_bzip2", VERSION_provider_bzip2, &provider_handler_bzip2 }, { "provider_service_lz4", VERSION_provider_lz4, &provider_handler_lz4 }, { "provider_service_lzma", VERSION_provider_lzma, &provider_handler_lzma }, diff -Nru mariadb-10.11.6/sql/sql_prepare.cc mariadb-10.11.9/sql/sql_prepare.cc --- mariadb-10.11.6/sql/sql_prepare.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_prepare.cc 2024-08-03 07:29:59.000000000 +0000 @@ -132,6 +132,7 @@ #include "wsrep_mysqld.h" #include "wsrep_trans_observer.h" #endif /* WITH_WSREP */ +#include "sql_audit.h" // mysql_audit_release #include "xa.h" // xa_recover_get_fields #include "sql_audit.h" // mysql_audit_release @@ -144,11 +145,11 @@ Protocol_binary protocol; public: Select_fetch_protocol_binary(THD *thd); - virtual bool send_result_set_metadata(List &list, uint flags); - virtual int send_data(List &items); - virtual bool send_eof(); + bool send_result_set_metadata(List &list, uint flags) override; + int send_data(List &items) override; + bool send_eof() override; #ifdef EMBEDDED_LIBRARY - void begin_dataset() + void begin_dataset() override { protocol.begin_dataset(); } @@ -181,7 +182,7 @@ /* The following data member is wholly for debugging purpose. It can be used for possible crash analysis to determine how many times - the stored routine was executed before the mem_root marked read_only + the stored routine was executed before the mem_root marked ROOT_FLAG_READ_ONLY was requested for a memory chunk. Additionally, a value of this data member is output to the log with DBUG_PRINT. */ @@ -209,7 +210,7 @@ String *expanded_query); public: Prepared_statement(THD *thd_arg); - virtual ~Prepared_statement(); + ~Prepared_statement() override; void setup_set_params(); Query_arena::Type type() const override; bool cleanup_stmt(bool restore_set_statement_vars) override; @@ -257,7 +258,7 @@ { public: Execute_sql_statement(LEX_STRING sql_text); - virtual bool execute_server_code(THD *thd); + bool execute_server_code(THD *thd) override; private: LEX_STRING m_sql_text; }; @@ -265,7 +266,6 @@ class Ed_connection; - /****************************************************************************** Implementation ******************************************************************************/ @@ -4068,6 +4068,7 @@ const char *sql_text, size_t sql_len) { PSI_statement_locker *parent_locker; + Reprepare_observer *reprepare_observer; bool error; query_id_t save_query_id= thd->query_id; query_id_t next_id= next_query_id(); @@ -4092,28 +4093,33 @@ parent_locker= thd->m_statement_psi; thd->m_statement_psi= NULL; + reprepare_observer= thd->m_reprepare_observer; + thd->m_reprepare_observer= NULL; error= mysql_execute_command(thd); thd->m_statement_psi= parent_locker; + thd->m_reprepare_observer= reprepare_observer; /* report error issued during command execution */ if (likely(error == 0) && thd->spcont == NULL) - general_log_write(thd, COM_QUERY, - thd->query(), thd->query_length()); + general_log_write(thd, COM_QUERY, thd->query(), thd->query_length()); end: thd->lex->restore_set_statement_var(); thd->query_id= save_query_id; delete_explain_query(thd->lex); + lex_end(thd->lex); return error; } + bool Execute_sql_statement::execute_server_code(THD *thd) { return ::execute_server_code(thd, m_sql_text.str, m_sql_text.length); } + /*************************************************************************** Prepared_statement ****************************************************************************/ @@ -4685,7 +4691,7 @@ #ifdef PROTECT_STATEMENT_MEMROOT // There was reprepare so the counter of runs should be reset executed_counter= 0; - mem_root->read_only= 0; + mem_root->flags &= ~ROOT_FLAG_READ_ONLY; #endif goto reexecute; } @@ -4694,7 +4700,7 @@ #ifdef PROTECT_STATEMENT_MEMROOT if (!error) { - mem_root->read_only= 1; + mem_root->flags |= ROOT_FLAG_READ_ONLY; ++executed_counter; DBUG_PRINT("info", ("execute counter: %lu", executed_counter)); @@ -4703,7 +4709,7 @@ { // Error on call shouldn't be counted as a normal run executed_counter= 0; - mem_root->read_only= 0; + mem_root->flags &= ~ROOT_FLAG_READ_ONLY; } #endif @@ -5695,29 +5701,33 @@ thd->set_binlog_bit(); } protected: - bool net_store_data(const uchar *from, size_t length); + bool net_store_data(const uchar *from, size_t length) override; bool net_store_data_cs(const uchar *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); - bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count); + CHARSET_INFO *fromcs, CHARSET_INFO *tocs) override; + bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count) override; bool net_send_ok(THD *, uint, uint, ulonglong, ulonglong, const char *, - bool); - bool net_send_error_packet(THD *, uint, const char *, const char *); + bool) override; + bool net_send_error_packet(THD *, uint, const char *, const char *) override; bool begin_dataset(); bool begin_dataset(THD *thd, uint numfields); - bool write(); - bool flush(); + bool write() override; + bool flush() override; bool store_field_metadata(const THD *thd, const Send_field &field, CHARSET_INFO *charset_for_protocol, uint pos); - bool send_result_set_metadata(List *list, uint flags); + bool send_result_set_metadata(List *list, uint flags) override; +#ifdef EMBEDDED_LIBRARY + void remove_last_row() override; +#else void remove_last_row(); - bool store_null(); - void prepare_for_resend(); +#endif + bool store_null() override; + void prepare_for_resend() override; bool send_list_fields(List *list, const TABLE_LIST *table_list); - enum enum_protocol_type type() { return PROTOCOL_LOCAL; }; + enum enum_protocol_type type() override { return PROTOCOL_LOCAL; }; }; static @@ -6081,7 +6091,8 @@ for (uint pos= 0 ; (item= it++); pos++) { - if (store_item_metadata(thd, item, pos)) + Send_field sf(thd, item); + if (store_field_metadata(thd, sf, item->charset_for_protocol(), pos)) goto err; } @@ -6473,10 +6484,9 @@ new_thd->security_ctx->skip_grants(); new_thd->query_cache_is_applicable= 0; new_thd->variables.wsrep_on= 0; + new_thd->client_capabilities= client_flag; new_thd->variables.sql_log_bin= 0; new_thd->set_binlog_bit(); - new_thd->client_capabilities= client_flag; - /* TOSO: decide if we should turn the auditing off for such threads. @@ -6507,4 +6517,3 @@ DBUG_PRINT("exit",("Mysql handler: %p", mysql)); DBUG_RETURN(mysql); } - diff -Nru mariadb-10.11.6/sql/sql_priv.h mariadb-10.11.9/sql/sql_priv.h --- mariadb-10.11.6/sql/sql_priv.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_priv.h 2024-08-03 07:29:59.000000000 +0000 @@ -273,6 +273,14 @@ OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE) /* + See adjust_secondary_key_cost in sys_vars.cc for symbolic names. +*/ +#define OPTIMIZER_ADJ_SEC_KEY_COST (1) +#define OPTIMIZER_ADJ_DISABLE_MAX_SEEKS (2) +#define OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY (4) +#define OPTIMIZER_FIX_INNODB_CARDINALITY (8) + +/* Replication uses 8 bytes to store SQL_MODE in the binary log. The day you use strictly more than 64 bits by adding one more define above, you should contact the replication team because the replication code should then be @@ -322,7 +330,10 @@ */ /* This subquery has fields from outer query (put by user) */ #define UNCACHEABLE_DEPENDENT_GENERATED 1 -/* This subquery contains functions with random result */ +/* + This subquery contains functions with random result. + Something that is uncacheable is by default unmergeable. +*/ #define UNCACHEABLE_RAND 2 /* This subquery contains functions with side effect */ #define UNCACHEABLE_SIDEEFFECT 4 diff -Nru mariadb-10.11.6/sql/sql_profile.cc mariadb-10.11.9/sql/sql_profile.cc --- mariadb-10.11.6/sql/sql_profile.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_profile.cc 2024-08-03 07:29:59.000000000 +0000 @@ -202,7 +202,8 @@ allocated_status_memory= (char *) my_malloc(key_memory_PROFILE, sizes[0] + sizes[1] + sizes[2], MYF(0)); - DBUG_ASSERT(allocated_status_memory != NULL); + if (!allocated_status_memory) + return; cursor= allocated_status_memory; @@ -266,6 +267,8 @@ { m_seq_counter= 1; PROF_MEASUREMENT *prof= new PROF_MEASUREMENT(this, status_arg); + if (!prof) + return; prof->m_seq= m_seq_counter++; m_start_time_usecs= prof->time_usecs; m_end_time_usecs= m_start_time_usecs; @@ -307,6 +310,8 @@ prof= new PROF_MEASUREMENT(this, status_arg, function_arg, base_name(file_arg), line_arg); else prof= new PROF_MEASUREMENT(this, status_arg); + if (!prof) + DBUG_VOID_RETURN; prof->m_seq= m_seq_counter++; m_end_time_usecs= prof->time_usecs; diff -Nru mariadb-10.11.6/sql/sql_profile.h mariadb-10.11.9/sql/sql_profile.h --- mariadb-10.11.6/sql/sql_profile.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_profile.h 2024-08-03 07:29:59.000000000 +0000 @@ -103,6 +103,8 @@ new_item= (struct queue_item *) my_malloc(key_memory_queue_item, sizeof(struct queue_item), MYF(0)); + if (!new_item) + return; new_item->payload= payload; @@ -296,7 +298,11 @@ { DBUG_ASSERT(!current); if (unlikely(enabled)) - current= new QUERY_PROFILE(this, initial_state); + { + QUERY_PROFILE *new_profile= new QUERY_PROFILE(this, initial_state); + if (new_profile) + current= new_profile; + } } void discard_current_query(); diff -Nru mariadb-10.11.6/sql/sql_reload.cc mariadb-10.11.9/sql/sql_reload.cc --- mariadb-10.11.6/sql/sql_reload.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_reload.cc 2024-08-03 07:29:59.000000000 +0000 @@ -68,6 +68,15 @@ bool result=0; select_errors=0; /* Write if more errors */ int tmp_write_to_binlog= *write_to_binlog= 1; +#ifndef DBUG_OFF + /* + When invoked for handling a SIGHUP by rpl_shutdown_sighup.test, we need to + force the signal handler to wait after REFRESH_TABLES, as that will check + for a killed server, and we need to call hostname_cache_refresh after + server cleanup has happened to trigger MDEV-30260. + */ + int do_dbug_sleep= 0; +#endif DBUG_ASSERT(!thd || !thd->in_sub_stmt); @@ -100,6 +109,15 @@ */ my_error(ER_UNKNOWN_ERROR, MYF(0)); } + +#ifndef DBUG_OFF + DBUG_EXECUTE_IF("hold_sighup_log_refresh", { + DBUG_ASSERT(!debug_sync_set_action( + thd, STRING_WITH_LEN("now SIGNAL in_reload_acl_and_cache " + "WAIT_FOR refresh_logs"))); + do_dbug_sleep= 1; + }); +#endif } opt_noacl= 0; @@ -352,6 +370,11 @@ } my_dbopt_cleanup(); } + +#ifndef DBUG_OFF + if (do_dbug_sleep) + my_sleep(3000000); // 3s +#endif if (options & REFRESH_HOSTS) hostname_cache_refresh(); if (thd && (options & REFRESH_STATUS)) @@ -370,7 +393,7 @@ } } #endif -#ifdef HAVE_OPENSSL +#ifdef HAVE_des if (options & REFRESH_DES_KEY_FILE) { if (des_key_file && load_des_key_file(des_key_file)) diff -Nru mariadb-10.11.6/sql/sql_repl.cc mariadb-10.11.9/sql/sql_repl.cc --- mariadb-10.11.6/sql/sql_repl.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_repl.cc 2024-08-03 07:29:59.000000000 +0000 @@ -221,7 +221,7 @@ char* p = info->log_file_name+dirname_length(info->log_file_name); uint ident_len = (uint) strlen(p); String *packet= info->packet; - ha_checksum crc; + ha_checksum crc= 0; /* reset transmit packet for the fake rotate event below */ if (reset_transmit_packet(info, info->flags, &ev_offset, &info->errmsg)) @@ -262,7 +262,7 @@ { my_bool do_checksum; int err; - ha_checksum crc; + ha_checksum crc= 0; char buf[128]; String str(buf, sizeof(buf), system_charset_info); String* packet= info->packet; @@ -510,7 +510,7 @@ } else { - DBUG_ASSERT(entry->type == STRING_RESULT); + DBUG_ASSERT(entry->type_handler()->result_type() == STRING_RESULT); String str; uint dummy_errors; str.copy(entry->value, entry->length, &my_charset_bin, &my_charset_bin, @@ -2060,7 +2060,7 @@ } if (need_sync && repl_semisync_master.flush_net(info->thd, - packet->c_ptr_safe())) + packet->c_ptr())) { info->error= ER_UNKNOWN_ERROR; return "Failed to run hook 'after_send_event'"; @@ -2828,12 +2828,6 @@ */ if (send_events(info, log, linfo, end_pos)) return 1; - DBUG_EXECUTE_IF("Notify_binlog_EOF", - { - const char act[]= "now signal eof_reached"; - DBUG_ASSERT(!debug_sync_set_action(current_thd, - STRING_WITH_LEN(act))); - };); } return 1; @@ -3011,8 +3005,13 @@ if (info->thd->killed == KILL_SLAVE_SAME_ID) { - info->errmsg= "A slave with the same server_uuid/server_id as this slave " - "has connected to the master"; + /* + Note that the text is limited to 64 characters in errmsg-utf8 in + ER_ABORTING_CONNECTION. + */ + info->errmsg= + "A slave with the same server_uuid/server_id is already " + "connected"; info->error= ER_SLAVE_SAME_ID; } @@ -3095,7 +3094,7 @@ info->error= ER_MASTER_FATAL_ERROR_READING_BINLOG; } else if (info->errmsg != NULL) - strcpy(info->error_text, info->errmsg); + safe_strcpy(info->error_text, sizeof(info->error_text), info->errmsg); my_message(info->error, info->error_text, MYF(0)); @@ -3385,6 +3384,7 @@ @retval 0 success @retval 1 error */ + int reset_slave(THD *thd, Master_info* mi) { MY_STAT stat_area; @@ -3482,8 +3482,6 @@ else if (global_system_variables.log_warnings > 1) sql_print_information("Deleted Master_info file '%s'.", fname); - if (rpl_semi_sync_slave_enabled) - repl_semisync_slave.reset_slave(mi); err: mi->unlock_slave_threads(); if (unlikely(error)) @@ -3511,43 +3509,89 @@ struct kill_callback_arg { - kill_callback_arg(uint32 id): slave_server_id(id), thd(0) {} - uint32 slave_server_id; + kill_callback_arg(THD *thd_arg, uint32 id): + thd(thd_arg), slave_server_id(id), counter(0) {} THD *thd; + uint32 slave_server_id; + uint counter; }; -static my_bool kill_callback(THD *thd, kill_callback_arg *arg) + +/* + Collect all active dump threads +*/ + +static my_bool kill_callback_collect(THD *thd, kill_callback_arg *arg) { if (thd->get_command() == COM_BINLOG_DUMP && - thd->variables.server_id == arg->slave_server_id) + thd->variables.server_id == arg->slave_server_id && + thd != arg->thd) { - arg->thd= thd; + arg->counter++; mysql_mutex_lock(&thd->LOCK_thd_kill); // Lock from delete mysql_mutex_lock(&thd->LOCK_thd_data); - return 1; + thd->awake_no_mutex(KILL_SLAVE_SAME_ID); // Mark killed + /* + Remover the thread from ack_receiver to ensure it is not + sending acks to the master anymore. + */ + ack_receiver.remove_slave(thd); + + mysql_mutex_unlock(&thd->LOCK_thd_data); + mysql_mutex_unlock(&thd->LOCK_thd_kill); } return 0; } -void kill_zombie_dump_threads(uint32 slave_server_id) +/* + Check if there are any active dump threads +*/ + +static my_bool kill_callback_check(THD *thd, kill_callback_arg *arg) { - kill_callback_arg arg(slave_server_id); - server_threads.iterate(kill_callback, &arg); + return (thd->get_command() == COM_BINLOG_DUMP && + thd->variables.server_id == arg->slave_server_id && + thd != arg->thd); +} - if (arg.thd) - { - /* - Here we do not call kill_one_thread() as - it will be slow because it will iterate through the list - again. We just to do kill the thread ourselves. - */ - arg.thd->awake_no_mutex(KILL_SLAVE_SAME_ID); - mysql_mutex_unlock(&arg.thd->LOCK_thd_kill); - mysql_mutex_unlock(&arg.thd->LOCK_thd_data); + +/** + Try to kill running dump threads on the master + + @result 0 ok + @result 1 old slave thread exists and does not want to die + + There should not be more than one dump thread with the same server id + this code has however in the past has several issues. To ensure that + things works in all cases (now and in the future), this code is collecting + all matching server id's and killing all of them. +*/ + +bool kill_zombie_dump_threads(THD *thd, uint32 slave_server_id) +{ + kill_callback_arg arg(thd, slave_server_id); + server_threads.iterate(kill_callback_collect, &arg); + + if (!arg.counter) + return 0; + + /* + Wait up to SECONDS_TO_WAIT_FOR_DUMP_THREAD_KILL for kill + of all dump thread, trying every 1/10 of second. + */ + for (uint i= 10 * SECONDS_TO_WAIT_FOR_DUMP_THREAD_KILL ; + --i > 0 && !thd->killed; + i++) + { + if (!server_threads.iterate(kill_callback_check, &arg)) + return 0; // All dump thread are killed + my_sleep(1000000L / 10); // Wait 1/10 of a second } + return 1; } + /** Get value for a string parameter with error checking @@ -3826,13 +3870,7 @@ if (lex_mi->use_gtid_opt == LEX_MASTER_INFO::LEX_GTID_SLAVE_POS) mi->using_gtid= Master_info::USE_GTID_SLAVE_POS; else if (lex_mi->use_gtid_opt == LEX_MASTER_INFO::LEX_GTID_CURRENT_POS) - { mi->using_gtid= Master_info::USE_GTID_CURRENT_POS; - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT, - ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), - "master_use_gtid=current_pos", "master_demote_to_slave=1"); - } else if (lex_mi->use_gtid_opt == LEX_MASTER_INFO::LEX_GTID_NO || lex_mi->log_file_name || lex_mi->pos || lex_mi->relay_log_name || lex_mi->relay_log_pos) @@ -4303,11 +4341,17 @@ } } + /* + Omit error messages from server log in Log_event::read_log_event. That + is, we only need to notify the client to correct their 'from' offset; + writing about this in the server log would be confusing as it isn't + related to server operational status. + */ for (event_count = 0; (ev = Log_event::read_log_event(&log, description_event, (opt_master_verify_checksum || - verify_checksum_once))); ) + verify_checksum_once), false)); ) { if (!unit->lim.check_offset(event_count) && ev->net_send(protocol, linfo.log_file_name, pos)) @@ -4595,6 +4639,10 @@ /* buffer contains position where we started last read */ uchar* buffer= (uchar*) my_b_get_buffer_start(file); uint max_event_size= lf_info->thd->variables.max_allowed_packet; + int res; +#ifndef DBUG_OFF + bool did_dbug_inject= false; +#endif if (lf_info->thd->is_current_stmt_binlog_format_row()) goto ret; @@ -4602,6 +4650,19 @@ lf_info->last_pos_in_file >= my_b_get_pos_in_file(file)) goto ret; + DBUG_EXECUTE_IF("load_data_binlog_cache_error", + { + /* + Simulate "disk full" error in the middle of writing to + the binlog cache. + */ + if (lf_info->last_pos_in_file >= 2*4096) + { + DBUG_SET("+d,simulate_file_write_error"); + did_dbug_inject= true; + } + };); + for (block_len= (uint) (my_b_get_bytes_in_buffer(file)); block_len > 0; buffer += MY_MIN(block_len, max_event_size), block_len -= MY_MIN(block_len, max_event_size)) @@ -4613,7 +4674,10 @@ MY_MIN(block_len, max_event_size), lf_info->log_delayed); if (mysql_bin_log.write(&a)) - DBUG_RETURN(1); + { + res= 1; + goto err; + } } else { @@ -4622,12 +4686,20 @@ MY_MIN(block_len, max_event_size), lf_info->log_delayed); if (mysql_bin_log.write(&b)) - DBUG_RETURN(1); + { + res= 1; + goto err; + } lf_info->wrote_create_file= 1; } } ret: - int res= Buffer ? lf_info->real_read_function(file, Buffer, Count) : 0; + res= Buffer ? lf_info->real_read_function(file, Buffer, Count) : 0; +err: +#ifndef DBUG_OFF + if (did_dbug_inject) + DBUG_SET("-d,simulate_file_write_error"); +#endif DBUG_RETURN(res); } diff -Nru mariadb-10.11.6/sql/sql_repl.h mariadb-10.11.9/sql/sql_repl.h --- mariadb-10.11.6/sql/sql_repl.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_repl.h 2024-08-03 07:29:59.000000000 +0000 @@ -43,7 +43,7 @@ void show_binlogs_get_fields(THD *thd, List *field_list); bool show_binlogs(THD* thd); extern int init_master_info(Master_info* mi); -void kill_zombie_dump_threads(uint32 slave_server_id); +bool kill_zombie_dump_threads(THD *thd, uint32 slave_server_id); int check_binlog_magic(IO_CACHE* log, const char** errmsg); int compare_log_name(const char *log_1, const char *log_2); diff -Nru mariadb-10.11.6/sql/sql_schema.cc mariadb-10.11.9/sql/sql_schema.cc --- mariadb-10.11.6/sql/sql_schema.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_schema.cc 2024-08-03 07:29:59.000000000 +0000 @@ -26,20 +26,26 @@ :Schema(name) { } const Type_handler *map_data_type(THD *thd, const Type_handler *src) - const + const override { if (src == &type_handler_newdate) return thd->type_handler_for_datetime(); return src; } + Create_func *find_native_function_builder(THD *thd, const LEX_CSTRING &name) + const override + { + return native_functions_hash_oracle.find(thd, name); + } + Item *make_item_func_replace(THD *thd, Item *subj, Item *find, - Item *replace) const; + Item *replace) const override; Item *make_item_func_substr(THD *thd, - const Lex_substring_spec_st &spec) const; - Item *make_item_func_trim(THD *thd, const Lex_trim_st &spec) const; + const Lex_substring_spec_st &spec) const override; + Item *make_item_func_trim(THD *thd, const Lex_trim_st &spec) const override; }; @@ -50,7 +56,7 @@ :Schema(name) { } const Type_handler *map_data_type(THD *thd, const Type_handler *src) - const + const override { if (src == &type_handler_timestamp || src == &type_handler_timestamp2) @@ -64,6 +70,7 @@ Schema_oracle oracle_schema(Lex_cstring(STRING_WITH_LEN("oracle_schema"))); Schema_maxdb maxdb_schema(Lex_cstring(STRING_WITH_LEN("maxdb_schema"))); +const Schema &oracle_schema_ref= oracle_schema; Schema *Schema::find_by_name(const LEX_CSTRING &name) { @@ -88,6 +95,26 @@ } +Create_func * +Schema::find_native_function_builder(THD *thd, const LEX_CSTRING &name) const +{ + return native_functions_hash.find(thd, name); +} + + +Item *Schema::make_item_func_call_native(THD *thd, + const Lex_ident_sys &name, + List *args) const +{ + Create_func *builder= find_native_function_builder(thd, name); + if (builder) + return builder->create_func(thd, &name, args); + my_error(ER_FUNCTION_NOT_DEFINED, MYF(0), name.str); + return NULL; +} + + + Item *Schema::make_item_func_replace(THD *thd, Item *subj, Item *find, diff -Nru mariadb-10.11.6/sql/sql_schema.h mariadb-10.11.9/sql/sql_schema.h --- mariadb-10.11.6/sql/sql_schema.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_schema.h 2024-08-03 07:29:59.000000000 +0000 @@ -19,6 +19,9 @@ #include "mysqld.h" #include "lex_string.h" +class Lex_ident_sys; +class Create_func; + class Schema { LEX_CSTRING m_name; @@ -34,6 +37,24 @@ return src; } + /** + Find a native function builder, return an error if not found, + build an Item otherwise. + */ + Item *make_item_func_call_native(THD *thd, + const Lex_ident_sys &name, + List *args) const; + + /** + Find the native function builder associated with a given function name. + @param thd The current thread + @param name The native function name + @return The native function builder associated with the name, or NULL + */ + virtual Create_func *find_native_function_builder(THD *thd, + const LEX_CSTRING &name) + const; + // Builders for native SQL function with a special syntax in sql_yacc.yy virtual Item *make_item_func_replace(THD *thd, Item *subj, @@ -67,5 +88,6 @@ extern Schema mariadb_schema; +extern const Schema &oracle_schema_ref; #endif // SQL_SCHEMA_H_INCLUDED diff -Nru mariadb-10.11.6/sql/sql_select.cc mariadb-10.11.9/sql/sql_select.cc --- mariadb-10.11.6/sql/sql_select.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_select.cc 2024-08-03 07:29:59.000000000 +0000 @@ -289,8 +289,6 @@ static void copy_sum_funcs(Item_sum **func_ptr, Item_sum **end); static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab); static bool setup_sum_funcs(THD *thd, Item_sum **func_ptr); -static bool prepare_sum_aggregators(THD *thd, Item_sum **func_ptr, - bool need_distinct); static bool init_sum_functions(Item_sum **func, Item_sum **end); static bool update_sum_func(Item_sum **func); static void select_describe(JOIN *join, bool need_tmp_table,bool need_order, @@ -810,37 +808,57 @@ if (subq_select_lex->group_list.elements && !subq_select_lex->with_sum_func && !subq_select_lex->join->having) { + /* + Temporary workaround for MDEV-28621: Do not remove GROUP BY expression + if it has any subqueries in it. + */ + bool have_subquery= false; for (ORDER *ord= subq_select_lex->group_list.first; ord; ord= ord->next) { - /* - Do not remove the item if it is used in select list and then referred - from GROUP BY clause by its name or number. Example: - - select (select ... ) as SUBQ ... group by SUBQ + if ((*ord->item)->with_subquery()) + { + have_subquery= true; + break; + } + } - Here SUBQ cannot be removed. - */ - if (!ord->in_field_list) + if (!have_subquery) + { + for (ORDER *ord= subq_select_lex->group_list.first; ord; ord= ord->next) { - (*ord->item)->walk(&Item::eliminate_subselect_processor, FALSE, NULL); /* - Remove from the JOIN::all_fields list any reference to the elements - of the eliminated GROUP BY list unless it is 'in_field_list'. - This is needed in order not to confuse JOIN::make_aggr_tables_info() - when it constructs different structure for execution phase. - */ - List_iterator li(subq_select_lex->join->all_fields); - Item *item; - while ((item= li++)) - { - if (item == *ord->item) - li.remove(); - } + Do not remove the item if it is used in select list and then referred + from GROUP BY clause by its name or number. Example: + + select (select ... ) as SUBQ ... group by SUBQ + + Here SUBQ cannot be removed. + */ + if (!ord->in_field_list) + { + /* + Not necessary due to workaround for MDEV-28621: + (*ord->item)->walk(&Item::eliminate_subselect_processor, FALSE, NULL); + */ + /* + Remove from the JOIN::all_fields list any reference to the elements + of the eliminated GROUP BY list unless it is 'in_field_list'. + This is needed in order not to confuse JOIN::make_aggr_tables_info() + when it constructs different structure for execution phase. + */ + List_iterator li(subq_select_lex->join->all_fields); + Item *item; + while ((item= li++)) + { + if (item == *ord->item) + li.remove(); + } + } } + subq_select_lex->join->group_list= NULL; + subq_select_lex->group_list.empty(); + DBUG_PRINT("info", ("GROUP BY removed")); } - subq_select_lex->join->group_list= NULL; - subq_select_lex->group_list.empty(); - DBUG_PRINT("info", ("GROUP BY removed")); } /* @@ -1254,7 +1272,7 @@ if (vers_conditions.is_set() && vers_conditions.type != SYSTEM_TIME_HISTORY) { - thd->where= "FOR SYSTEM_TIME"; + thd->where= THD_WHERE::FOR_SYSTEM_TIME; /* TODO: do resolve fix_length_and_dec(), fix_fields(). This requires storing vers_conditions as Item and make some magic related to vers_system_time_t/VERS_TRX_ID at stage of fix_fields() @@ -1457,6 +1475,26 @@ if (setup_wild(thd, tables_list, fields_list, &all_fields, select_lex, false)) DBUG_RETURN(-1); + /* + If the select_lex is immediately contained within a derived table + AND this derived table is a CTE + WITH supplied column names + AND we have the correct number of elements in both lists + (mismatches found in mysql_derived_prepare/rename_columns_of_derived_unit) + THEN NOW is the time to take a copy of these item_names for + later restoration if required. + */ + TABLE_LIST *derived= select_lex->master_unit()->derived; + + if (derived && + derived->with && + derived->with->column_list.elements && + (derived->with->column_list.elements == select_lex->item_list.elements)) + { + if (select_lex->save_item_list_names(thd)) + DBUG_RETURN(-1); + } + if (thd->lex->current_select->first_cond_optimization) { if ( conds && ! thd->lex->current_select->merged_into) @@ -1519,7 +1557,7 @@ { nesting_map save_allow_sum_func= thd->lex->allow_sum_func; thd->lex->allow_sum_func.set_bit(select_lex->nest_level); - thd->where= "order clause"; + thd->where= THD_WHERE::ORDER_CLAUSE; for (ORDER *order= select_lex->order_list.first; order; order= order->next) { /* Don't add the order items to all fields. Just resolve them to ensure @@ -1535,7 +1573,7 @@ if (having) { nesting_map save_allow_sum_func= thd->lex->allow_sum_func; - thd->where="having clause"; + thd->where= THD_WHERE::HAVING_CLAUSE; thd->lex->allow_sum_func.set_bit(select_lex_arg->nest_level); select_lex->having_fix_field= 1; /* @@ -1866,6 +1904,11 @@ curr_tab->tracker= tmp->get_using_temporary_read_tracker(); } } + if (is_in_subquery()) + { + Item_in_subselect *subq= unit->item->get_IN_subquery(); + subq->init_subq_materialization_tracker(thd); + } DBUG_RETURN(0); } @@ -1921,7 +1964,7 @@ the joined table. @retval false Ok - @retval true Error + @retval true Error, query should abort */ bool JOIN::make_range_rowid_filters() @@ -1965,12 +2008,18 @@ bool force_index_save= tab->table->force_index; tab->table->force_index= true; quick_select_return rc; + /* + EQ_FUNC and EQUAL_FUNC already sent unusable key notes (if any) + during update_ref_and_keys(). Have only other functions raise notes + from can_optimize_scalar_range(). + */ rc= sel->test_quick_select(thd, filter_map, (table_map) 0, (ha_rows) HA_POS_ERROR, true, false, true, - true); + true, Item_func::BITMAP_EXCEPT_ANY_EQUALITY); tab->table->force_index= force_index_save; - if (rc == SQL_SELECT::ERROR || thd->is_error()) + if (rc == SQL_SELECT::ERROR || thd->is_error() || thd->check_killed()) { + delete sel; DBUG_RETURN(true); /* Fatal error */ } /* @@ -1996,8 +2045,6 @@ continue; } no_filter: - if (sel->quick) - delete sel->quick; delete sel; } @@ -2015,7 +2062,9 @@ rowid container employed by the filter. On success it lets the table engine know that what rowid filter will be used when accessing the table rows. - @retval false always + @retval + false OK + true Error, query should abort */ bool @@ -2299,8 +2348,12 @@ DBUG_RETURN(1); } if (select_lex->with_rownum && ! order && ! group_list && - !select_distinct && conds && select_lex == unit->global_parameters()) + !select_distinct && conds && select_lex == unit->global_parameters() && + select_lex->first_rownum_optimization) + { optimize_rownum(thd, unit, conds); + select_lex->first_rownum_optimization= false; + } having= optimize_cond(this, having, join_list, TRUE, &having_value, &having_equal); @@ -2326,6 +2379,10 @@ select_lex->attach_to_conds, &cond_value); sel->attach_to_conds.empty(); + Json_writer_object wrapper(thd); + Json_writer_object pushd(thd, "condition_pushdown_from_having"); + pushd.add("conds", conds); + pushd.add("having", having); } } @@ -3533,7 +3590,8 @@ { List *curr_all_fields= &all_fields; List *curr_fields_list= &fields_list; - JOIN_TAB *curr_tab= join_tab + const_tables; + // Avoid UB (applying .. offset to nullptr) when join_tab is nullptr + JOIN_TAB *curr_tab= join_tab ? join_tab + const_tables : nullptr; TABLE *exec_tmp_table= NULL; bool distinct= false; const bool has_group_by= this->group; @@ -3569,7 +3627,7 @@ distinct in the engine, so we do this for all queries, not only GROUP BY queries. */ - if (tables_list && top_join_tab_count && !procedure) + if (tables_list && top_join_tab_count && !only_const_tables() && !procedure) { /* At the moment we only support push down for queries where @@ -4094,9 +4152,9 @@ - duplicate value removal Both of these operations are done after window function computation step. */ - curr_tab= join_tab + total_join_tab_cnt(); if (select_lex->window_funcs.elements) { + curr_tab= join_tab + total_join_tab_cnt(); if (!(curr_tab->window_funcs_step= new Window_funcs_computation)) DBUG_RETURN(true); if (curr_tab->window_funcs_step->setup(thd, &select_lex->window_funcs, @@ -4200,7 +4258,7 @@ if (make_sum_func_list(all_fields, fields_list, true)) goto err; if (prepare_sum_aggregators(thd, sum_funcs, - !(tables_list && + !(tables_list && join_tab->is_using_agg_loose_index_scan()))) goto err; if (setup_sum_funcs(thd, sum_funcs)) @@ -5194,13 +5252,19 @@ if (unlikely(check_stack_overrun(thd, STACK_MIN_SIZE, buff))) DBUG_RETURN(false); // Fatal error flag is set if (select) - { + { select->head=table; table->reginfo.impossible_range=0; + /* + EQ_FUNC and EQUAL_FUNC already sent unusable key notes (if any) + during update_ref_and_keys(). Have only other functions raise notes + from can_optimize_scalar_range(). + */ error= select->test_quick_select(thd, *(key_map *)keys, (table_map) 0, limit, 0, FALSE, TRUE, /* remove_where_parts*/ - FALSE, TRUE); + FALSE, + Item_func::BITMAP_EXCEPT_ANY_EQUALITY); if (error == SQL_SELECT::OK && select->quick) { @@ -5915,11 +5979,16 @@ This is can't be to high as otherwise we are likely to use table scan. */ - s->worst_seeks= MY_MIN((double) s->found_records / 10, - (double) s->read_time*3); - if (s->worst_seeks < 2.0) // Fix for small tables - s->worst_seeks=2.0; - + /* Largest integer that can be stored in double (no compiler warning) */ + s->worst_seeks= (double) (1ULL << 53); + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_MAX_SEEKS) == 0) + { + s->worst_seeks= MY_MIN((double) s->found_records / 10, + (double) s->read_time*3); + if (s->worst_seeks < 2.0) // Fix for small tables + s->worst_seeks=2.0; + } /* Add to stat->const_keys those indexes for which all group fields or all select distinct fields participate in one index. @@ -7031,6 +7100,7 @@ { field->raise_note_cannot_use_key_part(thd, key, part, equal_str, + key_field->cond->compare_collation(), key_field->val, compat); } @@ -7896,8 +7966,28 @@ if (table->covering_keys.is_set(key)) cost= file->keyread_time(key, 1, records); else + { cost= ((file->keyread_time(key, 0, records) + file->read_time(key, 1, MY_MIN(records, worst_seeks)))); + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_SEC_KEY_COST) && + file->is_clustering_key(0)) + { + /* + According to benchmarks done in 11.0 to calculate the new cost + model secondary key ranges are about 7x slower than primary + key ranges for big tables. Here we are a bit conservative and + only calculate with 5x. The reason for having it only 5x and + not for example 7x is is that choosing plans with more rows + that are read (ignored by the WHERE clause) causes the 10.x + optimizer to believe that there are more rows in the result + set, which can cause problems in finding the best join order. + Note: A clustering primary key is always key 0. + */ + double clustering_key_cost= file->read_time(0, 1, records); + cost= MY_MAX(cost, clustering_key_cost * 5); + } + } DBUG_PRINT("statistics", ("cost: %.3f", cost)); DBUG_RETURN(cost); @@ -8071,6 +8161,15 @@ double keyread_tmp= 0; ha_rows rec; bool best_uses_jbuf= FALSE; + /* + if optimizer_use_condition_selectivity adjust filter cost to be slightly + higher to ensure that ref|filter is not less than range over same + number of rows + */ + double filter_setup_cost= ((thd->variables. + optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_MAX_SEEKS) ? + 1.0 : 0.0); MY_BITMAP *eq_join_set= &s->table->eq_join_set; KEYUSE *hj_start_key= 0; SplM_plan_info *spl_plan= 0; @@ -8301,6 +8400,9 @@ trace_access_idx.add("used_range_estimates", true); tmp= adjust_quick_cost(table->opt_range[key].cost, table->opt_range[key].rows); + keyread_tmp= table->file->keyread_time(key, 1, + table->opt_range[key]. + rows); goto got_cost; } else @@ -8625,6 +8727,7 @@ type == JT_EQ_REF ? 0.5 * tmp : MY_MIN(tmp, keyread_tmp); double access_cost_factor= MY_MIN((tmp - key_access_cost) / rows, 1.0); + if (!(records < s->worst_seeks && records <= thd->variables.max_seeks_for_key)) { @@ -8641,7 +8744,9 @@ } if (filter) { - tmp-= filter->get_adjusted_gain(rows) - filter->get_cmp_gain(rows); + tmp-= (filter->get_adjusted_gain(rows) - + filter->get_cmp_gain(rows) - + filter_setup_cost); DBUG_ASSERT(tmp >= 0); trace_access_idx.add("rowid_filter_key", table->key_info[filter->key_no].name); @@ -8891,7 +8996,7 @@ access_cost_factor); if (filter) { - tmp-= filter->get_adjusted_gain(rows); + tmp-= filter->get_adjusted_gain(rows) - filter_setup_cost; DBUG_ASSERT(tmp >= 0); } @@ -13049,7 +13154,8 @@ HA_POS_ERROR : join->unit->lim.get_select_limit()), 0, - FALSE, FALSE, FALSE)) == + FALSE, FALSE, FALSE, + Item_func::BITMAP_ALL)) == SQL_SELECT::IMPOSSIBLE_RANGE) { /* @@ -13064,7 +13170,8 @@ OPTION_FOUND_ROWS ? HA_POS_ERROR : join->unit->lim.get_select_limit()), - 0, FALSE, FALSE, FALSE, TRUE)) == + 0, FALSE, FALSE, FALSE, + Item_func::BITMAP_NONE)) == SQL_SELECT::IMPOSSIBLE_RANGE) DBUG_RETURN(1); // Impossible WHERE } @@ -13813,7 +13920,8 @@ if (item->is_null()) DBUG_RETURN(NESTED_LOOP_OK); } - fill_record(thd, table, table->field, sjm->sjm_table_cols, TRUE, FALSE); + fill_record(thd, table, table->field, sjm->sjm_table_cols, true, false, + true); if (unlikely(thd->is_error())) DBUG_RETURN(NESTED_LOOP_ERROR); /* purecov: inspected */ if (unlikely((error= table->file->ha_write_tmp_row(table->record[0])))) @@ -17178,6 +17286,7 @@ if (!eq_item || eq_item->set_cmp_func(thd)) return 0; + eq_item->eval_not_null_tables(0); eq_item->quick_fix_field(); } current_sjm= field_sjm; @@ -17235,6 +17344,7 @@ { res->quick_fix_field(); res->update_used_tables(); + res->eval_not_null_tables(0); } return res; @@ -18868,6 +18978,12 @@ bool and_level= functype() == Item_func::COND_AND_FUNC; List *cond_arg_list= argument_list(); + if (check_stack_overrun(thd, STACK_MIN_SIZE, NULL)) + { + *cond_value= Item::COND_FALSE; + return (COND*) 0; // Fatal error flag is set! + } + if (and_level) { /* @@ -21431,7 +21547,7 @@ if (open_tmp_table(&new_table)) goto err1; if (table->file->indexes_are_disabled()) - new_table.file->ha_disable_indexes(HA_KEY_SWITCH_ALL); + new_table.file->ha_disable_indexes(key_map(0), false); table->file->ha_index_or_rnd_end(); if (table->file->ha_rnd_init_with_error(1)) DBUG_RETURN(1); @@ -23199,7 +23315,9 @@ res= tab->select->test_quick_select(tab->join->thd, tab->keys, (table_map) 0, HA_POS_ERROR, 0, FALSE, /*remove where parts*/FALSE, - FALSE, /* no warnings */ TRUE); + FALSE, + /* no unusable key notes */ + Item_func::BITMAP_NONE); if (tab->explain_plan && tab->explain_plan->range_checked_fer) tab->explain_plan->range_checked_fer->collect_data(tab->select->quick); @@ -25045,6 +25163,90 @@ } +/* + @brief + This is called when switching table access to produce records + in reverse order. + + @detail + - Disable "Range checked for each record" (Is this strictly necessary + here?) + - Disable Index Condition Pushdown and Rowid Filtering. + + IndexConditionPushdownAndReverseScans, RowidFilteringAndReverseScans: + Suppose we're computing + + select * from t1 + where + key1 between 10 and 20 and extra_condition + order by key1 desc + + here the range access uses a reverse-ordered scan on (1 <= key1 <= 10) and + extra_condition is checked by either ICP or Rowid Filtering. + + Also suppose that extra_condition happens to be false for rows of t1 that + do not satisfy the "10 <= key1 <= 20" condition. + + For forward ordered range scan, the SQL layer will make these calls: + + h->read_range_first(RANGE(10 <= key1 <= 20)); + while (h->read_range_next()) { ... } + + The storage engine sees the end endpoint of "key1<=20" and can stop scanning + as soon as it encounters a row with key1>20. + + For backward-ordered range scan, the SQL layer will make these calls: + + h->index_read_map(key1=20, HA_READ_PREFIX_LAST_OR_PREV); + while (h->index_prev()) { + if (cmp_key(h->record, "key1=10" )<0) + break; // end of range + ... + } + + Note that the check whether we've walked beyond the key=10 endpoint is + made at the SQL layer. The storage engine has no information about the left + endpoint of the interval we're scanning. If all rows before that endpoint + do not satisfy ICP condition or do not pass the Rowid Filter, the storage + engine will enumerate the records until the table start. + + In MySQL, the API is extended with set_end_range() call so that the storage + engine "knows" when to stop scanning. +*/ + +static void prepare_for_reverse_ordered_access(JOIN_TAB *tab) +{ + /* Cancel "Range checked for each record" */ + if (tab->use_quick == 2) + { + tab->use_quick= 1; + tab->read_first_record= join_init_read_record; + } + /* + Cancel Pushed Index Condition, as it doesn't work for reverse scans. + */ + if (tab->select && tab->select->pre_idx_push_select_cond) + { + tab->set_cond(tab->select->pre_idx_push_select_cond); + tab->table->file->cancel_pushed_idx_cond(); + } + /* + The same with Rowid Filter: it doesn't work with reverse scans so cancel + it, too. + */ + { + /* + Rowid Filter is initialized at a later stage. It is not pushed to + the storage engine yet: + */ + DBUG_ASSERT(!tab->table->file->pushed_rowid_filter); + tab->range_rowid_filter_info= NULL; + delete tab->rowid_filter; + tab->rowid_filter= NULL; + } +} + + /** Test if we can skip the ORDER BY by using an index. @@ -25250,7 +25452,8 @@ HA_POS_ERROR : tab->join->unit-> lim.get_select_limit(), - TRUE, TRUE, FALSE, FALSE); + TRUE, TRUE, FALSE, FALSE, + Item_func::BITMAP_ALL); // if we cannot use quick select if (res != SQL_SELECT::OK || !tab->select->quick) { @@ -25355,7 +25558,8 @@ join->select_options & OPTION_FOUND_ROWS ? HA_POS_ERROR : join->unit->lim.get_select_limit(), - TRUE, FALSE, FALSE, FALSE); + TRUE, FALSE, FALSE, FALSE, + Item_func::BITMAP_ALL); if (res == SQL_SELECT::ERROR) { *fatal_error= true; @@ -25506,23 +25710,11 @@ tab->limit= 0; goto use_filesort; // Reverse sort failed -> filesort } - /* - Cancel Pushed Index Condition, as it doesn't work for reverse scans. - */ - if (tab->select && tab->select->pre_idx_push_select_cond) - { - tab->set_cond(tab->select->pre_idx_push_select_cond); - tab->table->file->cancel_pushed_idx_cond(); - } + prepare_for_reverse_ordered_access(tab); + if (select->quick == save_quick) save_quick= 0; // make_reverse() consumed it select->set_quick(tmp); - /* Cancel "Range checked for each record" */ - if (tab->use_quick == 2) - { - tab->use_quick= 1; - tab->read_first_record= join_init_read_record; - } } else if (tab->type != JT_NEXT && tab->type != JT_REF_OR_NULL && tab->ref.key >= 0 && tab->ref.key_parts <= used_key_parts) @@ -25535,20 +25727,7 @@ */ tab->read_first_record= join_read_last_key; tab->read_record.read_record_func= join_read_prev_same; - /* Cancel "Range checked for each record" */ - if (tab->use_quick == 2) - { - tab->use_quick= 1; - tab->read_first_record= join_init_read_record; - } - /* - Cancel Pushed Index Condition, as it doesn't work for reverse scans. - */ - if (tab->select && tab->select->pre_idx_push_select_cond) - { - tab->set_cond(tab->select->pre_idx_push_select_cond); - tab->table->file->cancel_pushed_idx_cond(); - } + prepare_for_reverse_ordered_access(tab); } } else if (select && select->quick) @@ -26289,7 +26468,7 @@ if (!count || count > fields.elements) { my_error(ER_BAD_FIELD_ERROR, MYF(0), - order_item->full_name(), thd->where); + order_item->full_name(), thd_where(thd)); return TRUE; } thd->change_item_tree((Item **)&order->item, (Item *)&ref_pointer_array[count - 1]); @@ -26368,7 +26547,7 @@ ER_NON_UNIQ_ERROR, ER_THD(thd, ER_NON_UNIQ_ERROR), ((Item_ident*) order_item)->field_name.str, - thd->where); + thd_where(thd)); } } else if (from_window_spec) @@ -26438,7 +26617,7 @@ SELECT_LEX *select = thd->lex->current_select; enum_parsing_place context_analysis_place= thd->lex->current_select->context_analysis_place; - thd->where="order clause"; + thd->where= THD_WHERE::ORDER_CLAUSE; const bool for_union= select->master_unit()->is_unit_op() && select == select->master_unit()->fake_select_lex; for (uint number = 1; order; order=order->next, number++) @@ -26517,7 +26696,7 @@ uint org_fields=all_fields.elements; - thd->where="group statement"; + thd->where= THD_WHERE::GROUP_STATEMENT; for (ord= order; ord; ord= ord->next) { if (find_order_in_list(thd, ref_pointer_array, tables, ord, fields, @@ -26635,7 +26814,7 @@ new_field->item=item; /* Change to shared Item */ else { - thd->where="procedure list"; + thd->where= THD_WHERE::PROCEDURE_LIST; if ((*new_field->item)->fix_fields(thd, new_field->item)) DBUG_RETURN(1); /* purecov: inspected */ all_fields.push_front(*new_field->item, thd->mem_root); @@ -27593,15 +27772,86 @@ } -static bool prepare_sum_aggregators(THD *thd,Item_sum **func_ptr, - bool need_distinct) +/* + @brief + Setup aggregate functions. + + @param thd Thread descriptor + @param func_ptr Array of pointers to aggregate functions + @param need_distinct FALSE means that the table access method already + guarantees that arguments of all aggregate functions + will be unique. (This is the case for Loose Scan) + TRUE - Otherwise. + @return + false Ok + true Error +*/ + +bool JOIN::prepare_sum_aggregators(THD *thd, Item_sum **func_ptr, + bool need_distinct) { Item_sum *func; DBUG_ENTER("prepare_sum_aggregators"); while ((func= *(func_ptr++))) { - if (func->set_aggregator(thd, - need_distinct && func->has_with_distinct() ? + bool need_distinct_aggregator= need_distinct && func->has_with_distinct(); + if (need_distinct_aggregator && table_count - const_tables == 1) + { + /* + We are doing setup for an aggregate with DISTINCT, like + + SELECT agg_func(DISTINCT col1, col2 ...) FROM ... + + In general case, agg_func will need to use Aggregator_distinct to + remove duplicates from its arguments. + We won't have to remove duplicates if we know the arguments are already + unique. This is true when + 1. the join operation has only one non-const table (checked above) + 2. the argument list covers a PRIMARY or a UNIQUE index. + + Example: here the values of t1.pk are unique: + + SELECT agg_func(DISTINCT t1.pk, ...) FROM t1 + + and so the whole argument of agg_func is unique. + */ + List arg_fields; + for (uint i= 0; i < func->argument_count(); i++) + { + if (func->arguments()[i]->real_item()->type() == Item::FIELD_ITEM) + arg_fields.push_back(func->arguments()[i]); + } + + /* + If the query has a GROUP BY, then it's sufficient that a unique + key is covered by a concatenation of {argument_list, group_by_list}. + + Example: Suppose t1 has PRIMARY KEY(pk1, pk2). Then: + + SELECT agg_func(DISTINCT t1.pk1, ...) FROM t1 GROUP BY t1.pk2 + + Each GROUP BY group will have t1.pk2 fixed. Then, the values of t1.pk1 + will be unique, and no de-duplication will be needed. + */ + for (ORDER *group= group_list; group ; group= group->next) + { + if ((*group->item)->real_item()->type() == Item::FIELD_ITEM) + arg_fields.push_back(*group->item); + } + + if (list_contains_unique_index(join_tab[const_tables].table, + find_field_in_item_list, + (void *) &arg_fields)) + need_distinct_aggregator= false; + } + Json_writer_object trace_wrapper(thd); + Json_writer_object trace_aggr(thd, "prepare_sum_aggregators"); + trace_aggr.add("function", func); + trace_aggr.add("aggregator_type", + (need_distinct_aggregator || + func->uses_non_standard_aggregator_for_distinct()) ? + "distinct" : "simple"); + if (func->set_aggregator(thd, need_distinct_aggregator ? Aggregator::DISTINCT_AGGREGATOR : Aggregator::SIMPLE_AGGREGATOR)) DBUG_RETURN(TRUE); @@ -29163,7 +29413,6 @@ bool distinct,const char *message) { THD *thd=join->thd; - select_result *result=join->result; DBUG_ENTER("select_describe"); if (join->select_lex->pushdown_select) @@ -29198,7 +29447,7 @@ if (unit->explainable()) { - if (mysql_explain_union(thd, unit, result)) + if (mysql_explain_union(thd, unit, unit->result)) DBUG_VOID_RETURN; } } @@ -30530,12 +30779,13 @@ uint best_key_parts= 0; int best_key_direction= 0; ha_rows best_records= 0; - double read_time; + double read_time, records; int best_key= -1; bool is_best_covering= FALSE; double fanout= 1; ha_rows table_records= table->stat_records(); bool group= join && join->group && order == join->group_list; + bool group_forces_index_usage= group; ha_rows refkey_rows_estimate= table->opt_range_condition_rows; const bool has_limit= (select_limit_arg != HA_POS_ERROR); THD* thd= join ? join->thd : table->in_use; @@ -30572,6 +30822,7 @@ { uint tablenr= (uint)(tab - join->join_tab); read_time= join->best_positions[tablenr].read_time; + records= join->best_positions[tablenr].records_read; for (uint i= tablenr+1; i < join->table_count; i++) { fanout*= join->best_positions[i].records_read; // fanout is always >= 1 @@ -30580,8 +30831,23 @@ } } else + { read_time= table->file->scan_time(); + records= rows2double(table_records); + } + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group) + { + /* + read_time does not include TIME_FOR_COMPARE while opt_range.cost, which + is used by index_scan_time contains it. + Ensure that read_time and index_scan_time always include it to make + costs comparable. + */ + read_time+= records/TIME_FOR_COMPARE; + } + trace_cheaper_ordering.add("fanout", fanout); /* TODO: add cost of sorting here. @@ -30773,30 +31039,62 @@ possible_key.add("updated_limit", select_limit); rec_per_key= keyinfo->actual_rec_per_key(keyinfo->user_defined_key_parts-1); set_if_bigger(rec_per_key, 1); - /* - Here we take into account the fact that rows are - accessed in sequences rec_per_key records in each. - Rows in such a sequence are supposed to be ordered - by rowid/primary key. When reading the data - in a sequence we'll touch not more pages than the - table file contains. - TODO. Use the formula for a disk sweep sequential access - to calculate the cost of accessing data rows for one - index entry. - */ - index_scan_time= select_limit/rec_per_key * - MY_MIN(rec_per_key, table->file->scan_time()); - double range_scan_time; - if (get_range_limit_read_cost(tab, table, table_records, nr, - select_limit, &range_scan_time)) - { - possible_key.add("range_scan_time", range_scan_time); - if (range_scan_time < index_scan_time) - index_scan_time= range_scan_time; + + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group) + { + /* Special optimization to avoid forcing an index when group by is used */ + group_forces_index_usage= 0; + + if (table->opt_range_keys.is_set(nr)) + { + /* opt_range includes TIME_FOR_COMPARE */ + index_scan_time= (double) table->opt_range[nr].cost; + } + else + { + /* Enable secondary_key_cost and disable max_seek option */ + ulonglong save= thd->variables.optimizer_adjust_secondary_key_costs; + thd->variables.optimizer_adjust_secondary_key_costs|= + OPTIMIZER_ADJ_SEC_KEY_COST | OPTIMIZER_ADJ_DISABLE_MAX_SEEKS; + + index_scan_time= cost_for_index_read(thd, table, nr, + table_records, HA_ROWS_MAX); + index_scan_time+= rows2double(table_records) / TIME_FOR_COMPARE; + thd->variables.optimizer_adjust_secondary_key_costs= save; + } + /* Assume data is proportionalyl distributed */ + index_scan_time*= MY_MIN(select_limit, rec_per_key) / rec_per_key; + } + else + { + /* + Here we take into account the fact that rows are + accessed in sequences rec_per_key records in each. + Rows in such a sequence are supposed to be ordered + by rowid/primary key. When reading the data + in a sequence we'll touch not more pages than the + table file contains. + TODO. Use the formula for a disk sweep sequential access + to calculate the cost of accessing data rows for one + index entry. + */ + index_scan_time= select_limit/rec_per_key * + MY_MIN(rec_per_key, table->file->scan_time()); + + double range_scan_time; + if (get_range_limit_read_cost(tab, table, table_records, nr, + select_limit, &range_scan_time)) + { + possible_key.add("range_scan_time", range_scan_time); + if (range_scan_time < index_scan_time) + index_scan_time= range_scan_time; + } } possible_key.add("index_scan_time", index_scan_time); - if ((ref_key < 0 && (group || table->force_index || is_covering)) || + if ((ref_key < 0 && + (group_forces_index_usage || table->force_index || is_covering)) || index_scan_time < read_time) { ha_rows quick_records= table_records; @@ -30818,6 +31116,7 @@ possible_key.add("cause", "ref estimates better"); continue; } + if (table->opt_range_keys.is_set(nr)) quick_records= table->opt_range[nr].rows; possible_key.add("records", quick_records); @@ -30836,6 +31135,9 @@ is_best_covering= is_covering; best_key_direction= direction; best_select_limit= select_limit; + if ((thd->variables.optimizer_adjust_secondary_key_costs & + OPTIMIZER_ADJ_DISABLE_FORCE_INDEX_GROUP_BY) && group) + set_if_smaller(read_time, index_scan_time); } else { @@ -31698,7 +32000,26 @@ if (!(table->file->index_flags(table->file->keyread, 0, 1) & HA_CLUSTERED_INDEX)) table->mark_index_columns(table->file->keyread, table->read_set); } - if (tab->cache && tab->cache->init(select_options & SELECT_DESCRIBE)) + bool init_for_explain= false; + + /* + Can we use lightweight initalization mode just for EXPLAINs? We can if + we're certain that the optimizer will not execute the subquery. + The optimzier will not execute the subquery if it's too expensive. For + the exact criteria, see Item_subselect::is_expensive(). + Note that the subquery might be a UNION and we might not yet know if it + is expensive. + What we do know is that if this SELECT is too expensive, then the whole + subquery will be too expensive as well. + So, we can use lightweight initialization (init_for_explain=true) if this + SELECT examines more than @@expensive_subquery_limit rows. + */ + if ((select_options & SELECT_DESCRIBE) && + get_examined_rows() >= thd->variables.expensive_subquery_limit) + { + init_for_explain= true; + } + if (tab->cache && tab->cache->init(init_for_explain)) revise_cache_usage(tab); else tab->remove_redundant_bnl_scan_conds(); diff -Nru mariadb-10.11.6/sql/sql_select.h mariadb-10.11.9/sql/sql_select.h --- mariadb-10.11.6/sql/sql_select.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_select.h 2024-08-03 07:29:59.000000000 +0000 @@ -782,13 +782,13 @@ bool is_used; public: - void set_empty() + void set_empty() override { dupsweedout_tables= 0; first_dupsweedout_table= MAX_TABLES; is_used= FALSE; } - void set_from_prev(POSITION *prev); + void set_from_prev(POSITION *prev) override; bool check_qep(JOIN *join, uint idx, @@ -798,9 +798,9 @@ double *read_time, table_map *handled_fanout, sj_strategy_enum *stratey, - POSITION *loose_scan_pos); + POSITION *loose_scan_pos) override; - void mark_used() { is_used= TRUE; } + void mark_used() override { is_used= TRUE; } friend void fix_semijoin_strategies_for_picked_join_order(JOIN *join); }; @@ -828,13 +828,13 @@ bool in_firstmatch_prefix() { return (first_firstmatch_table != MAX_TABLES); } void invalidate_firstmatch_prefix() { first_firstmatch_table= MAX_TABLES; } public: - void set_empty() + void set_empty() override { invalidate_firstmatch_prefix(); is_used= FALSE; } - void set_from_prev(POSITION *prev); + void set_from_prev(POSITION *prev) override; bool check_qep(JOIN *join, uint idx, table_map remaining_tables, @@ -843,9 +843,9 @@ double *read_time, table_map *handled_fanout, sj_strategy_enum *strategy, - POSITION *loose_scan_pos); + POSITION *loose_scan_pos) override; - void mark_used() { is_used= TRUE; } + void mark_used() override { is_used= TRUE; } friend void fix_semijoin_strategies_for_picked_join_order(JOIN *join); }; @@ -871,13 +871,13 @@ uint loosescan_parts; /* Number of keyparts to be kept distinct */ bool is_used; - void set_empty() + void set_empty() override { first_loosescan_table= MAX_TABLES; is_used= FALSE; } - void set_from_prev(POSITION *prev); + void set_from_prev(POSITION *prev) override; bool check_qep(JOIN *join, uint idx, table_map remaining_tables, @@ -886,8 +886,8 @@ double *read_time, table_map *handled_fanout, sj_strategy_enum *strategy, - POSITION *loose_scan_pos); - void mark_used() { is_used= TRUE; } + POSITION *loose_scan_pos) override; + void mark_used() override { is_used= TRUE; } friend class Loose_scan_opt; friend void best_access_path(JOIN *join, @@ -919,13 +919,13 @@ table_map sjm_scan_need_tables; public: - void set_empty() + void set_empty() override { sjm_scan_need_tables= 0; sjm_scan_last_inner= 0; is_used= FALSE; } - void set_from_prev(POSITION *prev); + void set_from_prev(POSITION *prev) override; bool check_qep(JOIN *join, uint idx, table_map remaining_tables, @@ -934,8 +934,8 @@ double *read_time, table_map *handled_fanout, sj_strategy_enum *strategy, - POSITION *loose_scan_pos); - void mark_used() { is_used= TRUE; } + POSITION *loose_scan_pos) override; + void mark_used() override { is_used= TRUE; } friend void fix_semijoin_strategies_for_picked_join_order(JOIN *join); }; @@ -1866,6 +1866,8 @@ bool add_fields_for_current_rowid(JOIN_TAB *cur, List *fields); void free_pushdown_handlers(List& join_list); void init_join_cache_and_keyread(); + bool prepare_sum_aggregators(THD *thd,Item_sum **func_ptr, + bool need_distinct); bool transform_in_predicates_into_equalities(THD *thd); bool transform_all_conds_and_on_exprs(THD *thd, Item_transformer transformer); @@ -2060,7 +2062,7 @@ enum Type type() const override { return ITEM_STORE_KEY; } - const char *name() const override { return "func"; } + const char *name() const override { return "func"; } protected: enum store_key_result copy_inner() override @@ -2113,7 +2115,7 @@ {} enum Type type() const override { return CONST_ITEM_STORE_KEY; } - const char *name() const override { return "const"; } + const char *name() const override { return "const"; } bool store_key_is_const() override { return true; } protected: diff -Nru mariadb-10.11.6/sql/sql_sequence.cc mariadb-10.11.9/sql/sql_sequence.cc --- mariadb-10.11.6/sql/sql_sequence.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_sequence.cc 2024-08-03 07:29:59.000000000 +0000 @@ -28,6 +28,9 @@ #include "sql_acl.h" #ifdef WITH_WSREP #include "wsrep_mysqld.h" +bool wsrep_check_sequence(THD* thd, + const sequence_definition *seq, + const bool used_engine); #endif struct Field_definition @@ -921,6 +924,7 @@ TABLE_LIST *first_table= lex->query_tables; TABLE *table; sequence_definition *new_seq= lex->create_info.seq_create_info; + uint saved_used_fields= new_seq->used_fields; SEQUENCE *seq; No_such_table_error_handler no_such_table_handler; DBUG_ENTER("Sql_cmd_alter_sequence::execute"); @@ -941,7 +945,8 @@ #ifdef WITH_WSREP if (WSREP(thd) && wsrep_thd_is_local(thd)) { - if (wsrep_check_sequence(thd, new_seq)) + const bool used_engine= lex->create_info.used_fields & HA_CREATE_USED_ENGINE; + if (wsrep_check_sequence(thd, new_seq, used_engine)) DBUG_RETURN(TRUE); if (wsrep_to_isolation_begin(thd, first_table->db.str, @@ -1042,5 +1047,6 @@ my_ok(thd); end: + new_seq->used_fields= saved_used_fields; DBUG_RETURN(error); } diff -Nru mariadb-10.11.6/sql/sql_servers.cc mariadb-10.11.9/sql/sql_servers.cc --- mariadb-10.11.6/sql/sql_servers.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_servers.cc 2024-08-03 07:29:59.000000000 +0000 @@ -133,9 +133,10 @@ }; -static my_bool close_cached_connection_tables_callback( - TDC_element *element, close_cached_connection_tables_arg *arg) +static my_bool close_cached_connection_tables_callback(void *el, void *a) { + TDC_element *element= static_cast(el); + auto arg= static_cast(a); TABLE_LIST *tmp; mysql_mutex_lock(&element->LOCK_table_share); @@ -188,9 +189,7 @@ close_cached_connection_tables_arg argument= { thd, connection, 0 }; DBUG_ENTER("close_cached_connections"); - if (tdc_iterate(thd, - (my_hash_walk_action) close_cached_connection_tables_callback, - &argument)) + if (tdc_iterate(thd, close_cached_connection_tables_callback, &argument)) DBUG_RETURN(true); DBUG_RETURN(argument.tables ? diff -Nru mariadb-10.11.6/sql/sql_show.cc mariadb-10.11.9/sql/sql_show.cc --- mariadb-10.11.6/sql/sql_show.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_show.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1074,14 +1074,15 @@ ER_THD(thd, ER_TABLEACCESS_DENIED_ERROR), "SHOW VIEW", m_sctx->priv_user, m_sctx->host_or_ip, - m_top_view->get_db_name(), m_top_view->get_table_name()); + m_top_view->get_db_name().str, + m_top_view->get_table_name().str); } return m_view_access_denied_message_ptr; } bool handle_condition(THD *thd, uint sql_errno, const char * /* sqlstate */, Sql_condition::enum_warning_level *level, - const char *message, Sql_condition ** /* cond_hdl */) + const char *message, Sql_condition ** /* cond_hdl */) override { /* The handler does not handle the errors raised by itself. @@ -1119,8 +1120,8 @@ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_VIEW_INVALID, ER_THD(thd, ER_VIEW_INVALID), - m_top_view->get_db_name(), - m_top_view->get_table_name()); + m_top_view->get_db_name().str, + m_top_view->get_table_name().str); is_handled= TRUE; break; @@ -2777,7 +2778,7 @@ if (cond) return "Waiting on cond"; } - return NULL; + return ""; } @@ -2805,9 +2806,10 @@ thd_info->thread_id=tmp->thread_id; thd_info->os_thread_id=tmp->os_thread_id; - thd_info->user= arg->thd->strdup(tmp_sctx->user ? tmp_sctx->user : - (tmp->system_thread ? - "system user" : "unauthenticated user")); + thd_info->user= arg->thd->strdup(tmp_sctx->user && tmp_sctx->user != slave_user ? + tmp_sctx->user : + (tmp->system_thread ? + "system user" : "unauthenticated user")); if (tmp->peer_port && (tmp_sctx->host || tmp_sctx->ip) && arg->thd->security_ctx->host_or_ip[0]) { @@ -3029,7 +3031,7 @@ Show_explain_request::call_in_target_thread, is this necessary anymore?) */ set_current_thd(thd); - fill_record(thd, dst_table, dst_table->field, items, TRUE, FALSE); + fill_record(thd, dst_table, dst_table->field, items, true, false, false); res= dst_table->file->ha_write_tmp_row(dst_table->record[0]); set_current_thd(cur_thd); DBUG_RETURN(MY_TEST(res)); @@ -3310,7 +3312,7 @@ /* ID */ arg->table->field[0]->store((longlong) tmp->thread_id, TRUE); /* USER */ - val= tmp_sctx->user ? tmp_sctx->user : + val= tmp_sctx->user && tmp_sctx->user != slave_user ? tmp_sctx->user : (tmp->system_thread ? "system user" : "unauthenticated user"); arg->table->field[1]->store(val, strlen(val), cs); /* HOST */ @@ -3872,7 +3874,7 @@ */ for (var=variables; var->type == SHOW_FUNC || var->type == SHOW_SIMPLE_FUNC; var= &tmp) - ((mysql_show_var_func)(var->value))(thd, &tmp, buff, + ((mysql_show_var_func)(var->value))(thd, &tmp, (void *) buff, status_var, scope); SHOW_TYPE show_type=var->type; @@ -5188,7 +5190,7 @@ public: bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, - const char* msg, Sql_condition ** cond_hdl) + const char* msg, Sql_condition ** cond_hdl) override { if (sql_errno == ER_TRG_NO_DEFINER || sql_errno == ER_TRG_NO_CREATION_CTX || sql_errno == ER_PARSE_ERROR) @@ -6398,7 +6400,8 @@ tmp_cl->get_collation_name(MY_COLLATION_NAME_MODE_CONTEXT); LEX_CSTRING full_collation_name= tmp_cl->get_collation_name(MY_COLLATION_NAME_MODE_FULL); - bool is_context= cmp(context_collation_name, full_collation_name); + bool is_context= cmp(context_collation_name, full_collation_name) && + !(thd->variables.old_behavior & OLD_MODE_NO_NULL_COLLATION_IDS); /* Some collations are applicable to multiple character sets. Display them only once, with the short name (without the @@ -7110,8 +7113,7 @@ Security_context *sctx= thd->security_ctx; if (!tables->allowed_show) { - if (!my_strcasecmp(system_charset_info, tables->definer.user.str, - sctx->priv_user) && + if (!strcmp(tables->definer.user.str, sctx->priv_user) && !my_strcasecmp(system_charset_info, tables->definer.host.str, sctx->priv_host)) tables->allowed_show= TRUE; @@ -8184,7 +8186,7 @@ TABLE *table= tables->table; CHARSET_INFO *cs= system_charset_info; OPEN_TABLE_LIST *open_list; - if (!(open_list= list_open_tables(thd, thd->lex->first_select_lex()->db.str, + if (!(open_list= list_open_tables(thd, thd->lex->first_select_lex()->db, wild)) && thd->is_fatal_error) DBUG_RETURN(1); @@ -8833,9 +8835,9 @@ } List_iterator_fast it(sel->item_list); if (!(transl= - (Field_translator*)(thd->stmt_arena-> + (Field_translator*)(thd->active_stmt_arena_to_use()-> alloc(sel->item_list.elements * - sizeof(Field_translator))))) + sizeof(Field_translator))))) // ??? { DBUG_RETURN(1); } @@ -9607,7 +9609,7 @@ Column("PACKED", Varchar(10), NULLABLE, "Packed", OPEN_FRM_ONLY), Column("NULLABLE", Varchar(3), NOT_NULL, "Null", OPEN_FRM_ONLY), Column("INDEX_TYPE", Varchar(16), NOT_NULL, "Index_type", OPEN_FULL_TABLE), - Column("COMMENT", Varchar(16), NULLABLE, "Comment", OPEN_FRM_ONLY), + Column("COMMENT", Varchar(16), NULLABLE, "Comment", OPEN_FULL_TABLE), Column("INDEX_COMMENT", Varchar(INDEX_COMMENT_MAXLEN), NOT_NULL, "Index_comment",OPEN_FRM_ONLY), Column("IGNORED", Varchar(3), NOT_NULL, "Ignored", OPEN_FRM_ONLY), @@ -9795,7 +9797,7 @@ ST_FIELD_INFO variables_fields_info[]= { Column("VARIABLE_NAME", Varchar(64), NOT_NULL, "Variable_name"), - Column("VARIABLE_VALUE", Varchar(2048), NOT_NULL, "Value"), + Column("VARIABLE_VALUE", Varchar(4096), NOT_NULL, "Value"), CEnd() }; @@ -10195,6 +10197,7 @@ int initialize_schema_table(st_plugin_int *plugin) { ST_SCHEMA_TABLE *schema_table; + int err; DBUG_ENTER("initialize_schema_table"); if (!(schema_table= (ST_SCHEMA_TABLE *)my_malloc(key_memory_ST_SCHEMA_TABLE, @@ -10211,12 +10214,15 @@ /* Make the name available to the init() function. */ schema_table->table_name= plugin->name.str; - if (plugin->plugin->init(schema_table)) + if ((err= plugin->plugin->init(schema_table))) { - sql_print_error("Plugin '%s' init function returned error.", - plugin->name.str); + if (err != HA_ERR_RETRY_INIT) + sql_print_error("Plugin '%s' init function returned error.", + plugin->name.str); plugin->data= NULL; my_free(schema_table); + if (err == HA_ERR_RETRY_INIT) + DBUG_RETURN(err); DBUG_RETURN(1); } @@ -10542,12 +10548,12 @@ public: IS_internal_schema_access() = default; - ~IS_internal_schema_access() = default; + ~IS_internal_schema_access() override = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + privilege_t *save_priv) const override; - const ACL_internal_table_access *lookup(const char *name) const; + const ACL_internal_table_access *lookup(const char *name) const override; }; ACL_internal_access_result diff -Nru mariadb-10.11.6/sql/sql_signal.h mariadb-10.11.9/sql/sql_signal.h --- mariadb-10.11.6/sql/sql_signal.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_signal.h 2024-08-03 07:29:59.000000000 +0000 @@ -85,12 +85,12 @@ virtual ~Sql_cmd_signal() = default; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_SIGNAL; } - virtual bool execute(THD *thd); + bool execute(THD *thd) override; }; /** @@ -111,12 +111,12 @@ virtual ~Sql_cmd_resignal() = default; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_RESIGNAL; } - virtual bool execute(THD *thd); + bool execute(THD *thd) override; }; #endif diff -Nru mariadb-10.11.6/sql/sql_statistics.cc mariadb-10.11.9/sql/sql_statistics.cc --- mariadb-10.11.6/sql/sql_statistics.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_statistics.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1905,7 +1905,7 @@ tree_key_length, max_heap_table_size, 1); } - bool add() + bool add() override { longlong val= table_field->val_int(); return tree->unique_add(&val); @@ -2906,6 +2906,9 @@ After having been updated the statistical system tables are closed. */ +/* Stack usage 20248 from clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int update_statistics_for_table(THD *thd, TABLE *table) { TABLE_LIST tables[STATISTICS_TABLES]; @@ -2990,6 +2993,7 @@ new_trans.restore_old_transaction(); DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** @@ -3397,6 +3401,9 @@ The function is called when executing the statement DROP TABLE 'tab'. */ +/* Stack size 20248 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *tab) { @@ -3465,6 +3472,7 @@ new_trans.restore_old_transaction(); DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** @@ -4009,6 +4017,9 @@ The function is called when executing any statement that renames a table */ +/* Stack size 20968 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *tab, const LEX_CSTRING *new_db, @@ -4086,6 +4097,7 @@ new_trans.restore_old_transaction(); DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** diff -Nru mariadb-10.11.6/sql/sql_string.cc mariadb-10.11.9/sql/sql_string.cc --- mariadb-10.11.6/sql/sql_string.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_string.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1145,26 +1145,45 @@ int chlen; for (; st < end; st++) { - switch (*st) + char ch2= (char) (uchar) escaped_wc_for_single_quote((uchar) *st); + if (ch2) { - case '\\': APPEND(STRING_WITH_LEN("\\\\")); break; - case '\0': APPEND(STRING_WITH_LEN("\\0")); break; - case '\'': APPEND(STRING_WITH_LEN("\\'")); break; - case '\n': APPEND(STRING_WITH_LEN("\\n")); break; - case '\r': APPEND(STRING_WITH_LEN("\\r")); break; - case '\032': APPEND(STRING_WITH_LEN("\\Z")); break; - default: if ((chlen=charset()->charlen(st, end)) > 0) - { - APPEND(st, chlen); - st+= chlen-1; - } - else - APPEND(*st); + if (append('\\') || append(ch2)) + return true; + continue; } + if ((chlen= charset()->charlen(st, end)) > 0) + { + APPEND(st, chlen); + st+= chlen-1; + } + else + APPEND(*st); } return 0; } + +bool String::append_for_single_quote_using_mb_wc(const char *src, + size_t length, + CHARSET_INFO *cs) +{ + DBUG_ASSERT(&my_charset_bin != charset()); + DBUG_ASSERT(&my_charset_bin != cs); + const uchar *str= (const uchar *) src; + const uchar *end= (const uchar *) src + length; + int chlen; + my_wc_t wc; + for ( ; (chlen= cs->cset->mb_wc(cs, &wc, str, end)) > 0; str+= chlen) + { + my_wc_t wc2= escaped_wc_for_single_quote(wc); + if (wc2 ? (append_wc('\\') || append_wc(wc2)) : append_wc(wc)) + return true; + } + return false; +} + + void String::print(String *str) const { str->append_for_single_quote(Ptr, str_length); diff -Nru mariadb-10.11.6/sql/sql_string.h mariadb-10.11.9/sql/sql_string.h --- mariadb-10.11.6/sql/sql_string.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_string.h 2024-08-03 07:29:59.000000000 +0000 @@ -585,7 +585,7 @@ LEX_CSTRING tmp= {Ptr, str_length}; return tmp; } - inline LEX_CSTRING *get_value(LEX_CSTRING *res) + inline LEX_CSTRING *get_value(LEX_CSTRING *res) const { res->str= Ptr; res->length= str_length; @@ -1188,6 +1188,42 @@ print_with_conversion(to, cs); } + static my_wc_t escaped_wc_for_single_quote(my_wc_t ch) + { + switch (ch) + { + case '\\': return '\\'; + case '\0': return '0'; + case '\'': return '\''; + case '\n': return 'n'; + case '\r': return 'r'; + case '\032': return 'Z'; + } + return 0; + } + + // Append for single quote using mb_wc/wc_mb Unicode conversion + bool append_for_single_quote_using_mb_wc(const char *str, size_t length, + CHARSET_INFO *cs); + + // Append for single quote with optional mb_wc/wc_mb conversion + bool append_for_single_quote_opt_convert(const char *str, + size_t length, + CHARSET_INFO *cs) + { + return charset() == &my_charset_bin || cs == &my_charset_bin || + my_charset_same(charset(), cs) ? + append_for_single_quote(str, length) : + append_for_single_quote_using_mb_wc(str, length, cs); + } + + bool append_for_single_quote_opt_convert(const String &str) + { + return append_for_single_quote_opt_convert(str.ptr(), + str.length(), + str.charset()); + } + bool append_for_single_quote(const char *st, size_t len); bool append_for_single_quote(const String *s) { diff -Nru mariadb-10.11.6/sql/sql_table.cc mariadb-10.11.9/sql/sql_table.cc --- mariadb-10.11.6/sql/sql_table.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_table.cc 2024-08-03 07:29:59.000000000 +0000 @@ -921,7 +921,7 @@ */ build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, lpt->alter_info->table_name.str, "", 0); - strxnmov(frm_name, sizeof(frm_name), path, reg_ext, NullS); + strxnmov(frm_name, sizeof(frm_name)-1, path, reg_ext, NullS); /* When we are changing to use new frm file we need to ensure that we don't collide with another thread in process to open the frm file. @@ -1468,6 +1468,7 @@ temporary_table_was_dropped= 1; } is_temporary= 1; + thd->reset_sp_cache= true; } if ((drop_temporary && if_exists) || temporary_table_was_dropped) @@ -1841,8 +1842,11 @@ } DBUG_PRINT("table", ("table: %p s: %p", table->table, table->table ? table->table->s : NULL)); + if (is_temporary_table(table)) + thd->reset_sp_cache= true; } DEBUG_SYNC(thd, "rm_table_no_locks_before_binlog"); + thd->used|= THD::THREAD_SPECIFIC_USED; error= 0; @@ -4678,6 +4682,7 @@ if (is_trans != NULL) *is_trans= table->file->has_transactions(); + thd->reset_sp_cache= true; thd->used|= THD::THREAD_SPECIFIC_USED; create_info->table= table; // Store pointer to table } @@ -4804,18 +4809,21 @@ #ifdef WITH_WSREP /** Additional sequence checks for Galera cluster. -@param thd thread handle -@param seq sequence definition +@param thd thread handle +@param seq sequence definition +@param used_engine create used ENGINE= @retval false success @retval true failure */ -bool wsrep_check_sequence(THD* thd, const sequence_definition *seq) +bool wsrep_check_sequence(THD* thd, + const sequence_definition *seq, + const bool used_engine) { enum legacy_db_type db_type; DBUG_ASSERT(WSREP(thd)); - if (thd->lex->create_info.used_fields & HA_CREATE_USED_ENGINE) + if (used_engine) { db_type= thd->lex->create_info.db_type->db_type; } @@ -4846,6 +4854,57 @@ return (false); } + +/** Additional CREATE TABLE/SEQUENCE checks for Galera cluster. + +@param thd thread handle +@param wsrep_ctas CREATE TABLE AS SELECT ? +@param used_engine CREATE TABLE ... ENGINE = ? +@param create_info Create information + +@retval false Galera cluster does support used clause +@retval true Galera cluster does not support used clause +*/ +static +bool wsrep_check_support(THD* thd, + const bool wsrep_ctas, + const bool used_engine, + const HA_CREATE_INFO* create_info) +{ + /* CREATE TABLE ... AS SELECT */ + if (wsrep_ctas && + thd->variables.wsrep_trx_fragment_size > 0) + { + my_message(ER_NOT_ALLOWED_COMMAND, + "CREATE TABLE AS SELECT is not supported with streaming replication", + MYF(0)); + return true; + } + /* CREATE TABLE .. WITH SYSTEM VERSIONING AS SELECT + is not supported in Galera cluster. + */ + if (wsrep_ctas && + create_info->versioned()) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "SYSTEM VERSIONING AS SELECT in Galera cluster"); + return true; + } + /* + CREATE TABLE ... ENGINE=SEQUENCE is not supported in + Galera cluster. + CREATE SEQUENCE ... ENGINE=xxx Galera cluster supports + only InnoDB-sequences. + */ + if (((used_engine && create_info->db_type && + (create_info->db_type->db_type == DB_TYPE_SEQUENCE || + create_info->db_type->db_type >= DB_TYPE_FIRST_DYNAMIC)) || + thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE) && + wsrep_check_sequence(thd, create_info->seq_create_info, used_engine)) + return true; + + return false; +} #endif /* WITH_WSREP */ /** @@ -4921,15 +4980,6 @@ if (!(thd->variables.option_bits & OPTION_EXPLICIT_DEF_TIMESTAMP)) promote_first_timestamp_column(&alter_info->create_list); -#ifdef WITH_WSREP - if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && - WSREP(thd) && wsrep_thd_is_local_toi(thd)) - { - if (wsrep_check_sequence(thd, create_info->seq_create_info)) - DBUG_RETURN(true); - } -#endif /* WITH_WSREP */ - /* We can abort create table for any table type */ thd->abort_on_warning= thd->is_strict_mode(); @@ -5121,7 +5171,8 @@ if (!check) // Found unique name { name->length= (size_t) (real_end - buff); - name->str= strmake_root(thd->stmt_arena->mem_root, buff, name->length); + name->str= thd->strmake(buff, name->length); + return (name->str == NULL); } } @@ -6556,8 +6607,6 @@ @param thd Thread @param table The original table. - @param varchar Indicates that new definition has new - VARCHAR column. @param[in/out] ha_alter_info Data structure which already contains basic information about create options, field and keys for the new version of @@ -6592,7 +6641,7 @@ @retval false success */ -static bool fill_alter_inplace_info(THD *thd, TABLE *table, bool varchar, +static bool fill_alter_inplace_info(THD *thd, TABLE *table, Alter_inplace_info *ha_alter_info) { Field **f_ptr, *field; @@ -6642,13 +6691,6 @@ if (alter_info->flags & ALTER_CHANGE_COLUMN) ha_alter_info->handler_flags|= ALTER_COLUMN_DEFAULT; - /* - If we altering table with old VARCHAR fields we will be automatically - upgrading VARCHAR column types. - */ - if (table->s->frm_version < FRM_VER_TRUE_VARCHAR && varchar) - ha_alter_info->handler_flags|= ALTER_STORED_COLUMN_TYPE; - DBUG_PRINT("info", ("handler_flags: %llu", ha_alter_info->handler_flags)); /* @@ -6690,6 +6732,30 @@ Check if type of column has changed. */ bool is_equal= field->is_equal(*new_field); + + if (is_equal) + { + const Type_handler *th= field->type_handler(); + if (th != th->type_handler_for_implicit_upgrade()) + { + /* + The field data type says it wants upgrade. + This should not be possible: + - if this is a new column definition, e.g. from statements like: + ALTER TABLE t1 ADD a INT; + ALTER TABLE t1 MODIFY a INT; + then it's coming from the parser, which returns + only up-to-date data types. + - if this is an old column definition, e.g. from: + ALTER TABLE t1 COMMENT 'new comment'; + it should have ealier called Column_definition_implicit_upgrade(), + which replaces old data types to up-to-date data types. + */ + DBUG_ASSERT(0); + is_equal= false; + } + } + if (!is_equal) { if (field->table->file->can_convert_nocopy(*field, *new_field)) @@ -7208,6 +7274,14 @@ (uint) (field->flags & NOT_NULL_FLAG)) DBUG_RETURN(false); + if (field->vcol_info) + { + if (!tmp_new_field->field->vcol_info) + DBUG_RETURN(false); + if (!field->vcol_info->is_equal(tmp_new_field->field->vcol_info)) + DBUG_RETURN(false); + } + /* mysql_prepare_alter_table() clears HA_OPTION_PACK_RECORD bit when preparing description of existing table. In ALTER TABLE it is later @@ -7333,14 +7407,28 @@ switch (keys_onoff) { case Alter_info::ENABLE: DEBUG_SYNC(table->in_use, "alter_table_enable_indexes"); - error= table->file->ha_enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); + error= table->file->ha_enable_indexes(key_map(table->s->keys), true); break; case Alter_info::LEAVE_AS_IS: if (!indexes_were_disabled) break; /* fall through */ case Alter_info::DISABLE: - error= table->file->ha_disable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE); + { + key_map map= table->s->keys_in_use; + bool do_clear= false; + for (uint i=0; i < table->s->keys; i++) + { + if (!(table->s->key_info[i].flags & HA_NOSAME) && + i != table->s->next_number_index) + { + map.clear_bit(i); + do_clear= true; + } + } + if (do_clear) + error= table->file->ha_disable_indexes(map, true); + } } if (unlikely(error)) @@ -9085,10 +9173,34 @@ case Alter_drop::CHECK_CONSTRAINT: case Alter_drop::PERIOD: my_error(ER_CANT_DROP_FIELD_OR_KEY, MYF(0), drop->type_name(), - alter_info->drop_list.head()->name); + drop->name); goto err; case Alter_drop::FOREIGN_KEY: // Leave the DROP FOREIGN KEY names in the alter_info->drop_list. + /* If this is DROP FOREIGN KEY without IF EXIST, + we can now check does it exists and if not report a error. */ + if (!drop->drop_if_exists) + { + List fk_child_key_list; + table->file->get_foreign_key_list(thd, &fk_child_key_list); + if (fk_child_key_list.is_empty()) + { + fk_not_found: + my_error(ER_CANT_DROP_FIELD_OR_KEY, MYF(0), drop->type_name(), + drop->name); + goto err; + } + List_iterator fk_key_it(fk_child_key_list); + while (FOREIGN_KEY_INFO *f_key= fk_key_it++) + { + if (my_strcasecmp(system_charset_info, f_key->foreign_id->str, + drop->name) == 0) + goto fk_found; + } + goto fk_not_found; + fk_found: + break; + } break; } } @@ -10028,12 +10140,7 @@ */ KEY *key_info; uint key_count; - /* - Remember if the new definition has new VARCHAR column; - create_info->varchar will be reset in create_table_impl()/ - mysql_prepare_create_table(). - */ - bool varchar= create_info->varchar, table_creation_was_logged= 0; + bool table_creation_was_logged= 0; bool binlog_as_create_select= 0, log_if_exists= 0; uint tables_opened; handlerton *new_db_type= create_info->db_type, *old_db_type; @@ -10063,6 +10170,7 @@ TODO: this design is obsolete and will be removed. */ int table_kind= check_if_log_table(table_list, FALSE, NullS); + const bool used_engine= create_info->used_fields & HA_CREATE_USED_ENGINE; if (table_kind) { @@ -10074,7 +10182,7 @@ } /* Disable alter of log tables to unsupported engine */ - if ((create_info->used_fields & HA_CREATE_USED_ENGINE) && + if ((used_engine) && (!create_info->db_type || /* unknown engine */ !(create_info->db_type->flags & HTON_SUPPORT_LOG_TABLES))) { @@ -10164,14 +10272,14 @@ if we can support implementing storage engine. */ if (WSREP(thd) && table && table->s->sequence && - wsrep_check_sequence(thd, thd->lex->create_info.seq_create_info)) + wsrep_check_sequence(thd, create_info->seq_create_info, used_engine)) DBUG_RETURN(TRUE); - if (WSREP(thd) && + if (WSREP(thd) && table && (thd->lex->sql_command == SQLCOM_ALTER_TABLE || thd->lex->sql_command == SQLCOM_CREATE_INDEX || thd->lex->sql_command == SQLCOM_DROP_INDEX) && - !wsrep_should_replicate_ddl(thd, table_list->table->s->db_type())) + !wsrep_should_replicate_ddl(thd, table->s->db_type())) DBUG_RETURN(true); #endif /* WITH_WSREP */ @@ -10669,12 +10777,10 @@ #endif #ifdef WITH_WSREP + // ALTER TABLE for sequence object, check can we support it if (table->s->sequence && WSREP(thd) && - wsrep_thd_is_local_toi(thd)) - { - if (wsrep_check_sequence(thd, create_info->seq_create_info)) + wsrep_check_sequence(thd, create_info->seq_create_info, used_engine)) DBUG_RETURN(TRUE); - } #endif /* WITH_WSREP */ /* @@ -10852,7 +10958,7 @@ bool use_inplace= true; /* Fill the Alter_inplace_info structure. */ - if (fill_alter_inplace_info(thd, table, varchar, &ha_alter_info)) + if (fill_alter_inplace_info(thd, table, &ha_alter_info)) goto err_new_table_cleanup; alter_ctx.tmp_storage_engine_name_partitioned= @@ -11660,6 +11766,59 @@ DBUG_RETURN(error); } +/** Handle the error when copying data from source to target table. +@param error error code +@param ignore alter ignore statement +@param to target table handler +@param thd Mysql Thread +@param alter_ctx Runtime context for alter statement +@retval false in case of error +@retval true in case of skipping the row and continue alter operation */ +static bool +copy_data_error_ignore(int &error, bool ignore, TABLE *to, + THD *thd, Alter_table_ctx *alter_ctx) +{ + if (to->file->is_fatal_error(error, HA_CHECK_DUP)) + { + /* Not a duplicate key error. */ + to->file->print_error(error, MYF(0)); + error= 1; + return false; + } + /* Duplicate key error. */ + if (unlikely(alter_ctx->fk_error_if_delete_row)) + { + /* We are trying to omit a row from the table which serves + as parent in a foreign key. This might have broken + referential integrity so emit an error. Note that we + can't ignore this error even if we are + executing ALTER IGNORE TABLE. IGNORE allows to skip rows, but + doesn't allow to break unique or foreign key constraints, */ + my_error(ER_FK_CANNOT_DELETE_PARENT, MYF(0), + alter_ctx->fk_error_id, + alter_ctx->fk_error_table); + return false; + } + if (ignore) + return true; + /* Ordinary ALTER TABLE. Report duplicate key error. */ + uint key_nr= to->file->get_dup_key(error); + if (key_nr <= MAX_KEY) + { + const char *err_msg= ER_THD(thd, ER_DUP_ENTRY_WITH_KEY_NAME); + if (key_nr == 0 && to->s->keys > 0 && + (to->key_info[0].key_part[0].field->flags & + AUTO_INCREMENT_FLAG)) + err_msg= ER_THD(thd, ER_DUP_ENTRY_AUTOINCREMENT_CASE); + print_keydup_error(to, + key_nr >= to->s->keys ? NULL : + &to->key_info[key_nr], + err_msg, MYF(0)); + } + else + to->file->print_error(error, MYF(0)); + return false; +} static int copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, bool ignore, @@ -11921,58 +12080,11 @@ to->auto_increment_field_not_null= FALSE; if (unlikely(error)) { - if (to->file->is_fatal_error(error, HA_CHECK_DUP)) - { - /* Not a duplicate key error. */ - to->file->print_error(error, MYF(0)); - error= 1; - break; - } - else - { - /* Duplicate key error. */ - if (unlikely(alter_ctx->fk_error_if_delete_row)) - { - /* - We are trying to omit a row from the table which serves as parent - in a foreign key. This might have broken referential integrity so - emit an error. Note that we can't ignore this error even if we are - executing ALTER IGNORE TABLE. IGNORE allows to skip rows, but - doesn't allow to break unique or foreign key constraints, - */ - my_error(ER_FK_CANNOT_DELETE_PARENT, MYF(0), - alter_ctx->fk_error_id, - alter_ctx->fk_error_table); - break; - } - - if (ignore) - { - /* This ALTER IGNORE TABLE. Simply skip row and continue. */ - to->file->restore_auto_increment(prev_insert_id); - delete_count++; - } - else - { - /* Ordinary ALTER TABLE. Report duplicate key error. */ - uint key_nr= to->file->get_dup_key(error); - if ((int) key_nr >= 0) - { - const char *err_msg= ER_THD(thd, ER_DUP_ENTRY_WITH_KEY_NAME); - if (key_nr == 0 && to->s->keys > 0 && - (to->key_info[0].key_part[0].field->flags & - AUTO_INCREMENT_FLAG)) - err_msg= ER_THD(thd, ER_DUP_ENTRY_AUTOINCREMENT_CASE); - print_keydup_error(to, - key_nr >= to->s->keys ? NULL : - &to->key_info[key_nr], - err_msg, MYF(0)); - } - else - to->file->print_error(error, MYF(0)); - break; - } - } + if (!copy_data_error_ignore(error, ignore, to, thd, alter_ctx)) + break; + DBUG_ASSERT(ignore); + to->file->restore_auto_increment(prev_insert_id); + delete_count++; } else { @@ -11999,9 +12111,15 @@ error= 1; } bulk_insert_started= 0; - if (!ignore) - to->file->extra(HA_EXTRA_END_ALTER_COPY); - + if (!ignore && error <= 0) + { + int alt_error= to->file->extra(HA_EXTRA_END_ALTER_COPY); + if (alt_error > 0) + { + error= alt_error; + copy_data_error_ignore(error, false, to, thd, alter_ctx); + } + } cleanup_done= 1; to->file->extra(HA_EXTRA_NO_IGNORE_DUP_KEY); @@ -12278,13 +12396,18 @@ if (!*new_engine) DBUG_RETURN(true); - /* Enforced storage engine should not be used in - ALTER TABLE that does not use explicit ENGINE = x to - avoid unwanted unrelated changes.*/ - if (!(thd->lex->sql_command == SQLCOM_ALTER_TABLE && - !(create_info->used_fields & HA_CREATE_USED_ENGINE))) - enf_engine= thd->variables.enforced_table_plugin ? - plugin_hton(thd->variables.enforced_table_plugin) : NULL; + /* + Enforced storage engine should not be used in ALTER TABLE that does not + use explicit ENGINE = x to avoid unwanted unrelated changes. It should not + be used in CREATE INDEX too. + */ + if (!((thd->lex->sql_command == SQLCOM_ALTER_TABLE && + !(create_info->used_fields & HA_CREATE_USED_ENGINE)) || + thd->lex->sql_command == SQLCOM_CREATE_INDEX)) + { + plugin_ref enf_plugin= thd->variables.enforced_table_plugin; + enf_engine= enf_plugin ? plugin_hton(enf_plugin) : NULL; + } if (enf_engine && enf_engine != *new_engine) { @@ -12381,8 +12504,18 @@ Alter_info alter_info(lex->alter_info, thd->mem_root); #ifdef WITH_WSREP + bool wsrep_ctas= false; // If CREATE TABLE AS SELECT and wsrep_on - const bool wsrep_ctas= (select_lex->item_list.elements && WSREP(thd)); + if (WSREP(thd) && (select_lex->item_list.elements || + // Only CTAS may be applied not using TOI. + (wsrep_thd_is_applying(thd) && !wsrep_thd_is_toi(thd)))) + { + wsrep_ctas= true; + + // MDEV-22232: Disable CTAS retry by setting the retry counter to the + // threshold value. + thd->wsrep_retry_counter= thd->variables.wsrep_retry_autocommit; + } // This will be used in THD::decide_logging_format if CTAS Enable_wsrep_ctas_guard wsrep_ctas_guard(thd, wsrep_ctas); @@ -12454,17 +12587,11 @@ #endif #ifdef WITH_WSREP - if (wsrep_ctas) + if (WSREP(thd) && + wsrep_check_support(thd, wsrep_ctas, used_engine, &create_info)) { - if (thd->variables.wsrep_trx_fragment_size > 0) - { - my_message( - ER_NOT_ALLOWED_COMMAND, - "CREATE TABLE AS SELECT is not supported with streaming replication", - MYF(0)); - res= 1; - goto end_with_restore_list; - } + res= 1; + goto end_with_restore_list; } #endif /* WITH_WSREP */ @@ -12616,6 +12743,7 @@ create_table->table_name, create_table->db)) goto end_with_restore_list; +#ifdef WITH_WSREP /* In STATEMENT format, we probably have to replicate also temporary tables, like mysql replication does. Also check if the requested @@ -12624,33 +12752,32 @@ if (WSREP(thd)) { handlerton *orig_ht= create_info.db_type; + if (!check_engine(thd, create_table->db.str, create_table->table_name.str, &create_info) && (!thd->is_current_stmt_binlog_format_row() || !create_info.tmp_table())) { -#ifdef WITH_WSREP if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && - wsrep_check_sequence(thd, lex->create_info.seq_create_info)) + wsrep_check_sequence(thd, lex->create_info.seq_create_info, used_engine)) DBUG_RETURN(true); - WSREP_TO_ISOLATION_BEGIN_ALTER(create_table->db.str, - create_table->table_name.str, - first_table, &alter_info, NULL, - &create_info) - { - WSREP_WARN("CREATE TABLE isolation failure"); + WSREP_TO_ISOLATION_BEGIN_ALTER(create_table->db.str, create_table->table_name.str, + first_table, &alter_info, NULL, &create_info) + { + WSREP_WARN("CREATE TABLE isolation failure"); res= true; goto end_with_restore_list; - } -#endif /* WITH_WSREP */ + } } // check_engine will set db_type to NULL if e.g. TEMPORARY is // not supported by the storage engine, this case is checked // again in mysql_create_table create_info.db_type= orig_ht; } +#endif /* WITH_WSREP */ + /* Regular CREATE TABLE */ res= mysql_create_table(thd, create_table, &create_info, &alter_info); } diff -Nru mariadb-10.11.6/sql/sql_table.h mariadb-10.11.9/sql/sql_table.h --- mariadb-10.11.6/sql/sql_table.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_table.h 2024-08-03 07:29:59.000000000 +0000 @@ -216,8 +216,4 @@ bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *); -#ifdef WITH_WSREP -bool wsrep_check_sequence(THD* thd, const class sequence_definition *seq); -#endif - #endif /* SQL_TABLE_INCLUDED */ diff -Nru mariadb-10.11.6/sql/sql_test.cc mariadb-10.11.9/sql/sql_test.cc --- mariadb-10.11.6/sql/sql_test.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_test.cc 2024-08-03 07:29:59.000000000 +0000 @@ -29,11 +29,16 @@ #include #include "sql_connect.h" #include "thread_cache.h" -#if defined(HAVE_MALLINFO) && defined(HAVE_MALLOC_H) + +#if defined(HAVE_MALLOC_H) #include -#elif defined(HAVE_MALLINFO) && defined(HAVE_SYS_MALLOC_H) +#endif + +#if defined(HAVE_SYS_MALLOC_H) #include -#elif defined(HAVE_MALLOC_ZONE) +#endif + +#if defined(HAVE_MALLOC_ZONE) #include #endif @@ -84,9 +89,9 @@ #ifdef EXTRA_DEBUG /* This is for debugging purposes */ -static my_bool print_cached_tables_callback(TDC_element *element, - void *arg __attribute__((unused))) +static my_bool print_cached_tables_callback(void *el, void*) { + TDC_element *element= static_cast(el); TABLE *entry; mysql_mutex_lock(&element->LOCK_table_share); @@ -113,7 +118,7 @@ /* purecov: begin tested */ puts("DB Table Version Thread Open Lock"); - tdc_iterate(0, (my_hash_walk_action) print_cached_tables_callback, NULL, true); + tdc_iterate(0, print_cached_tables_callback, NULL, true); fflush(stdout); /* purecov: end */ diff -Nru mariadb-10.11.6/sql/sql_time.cc mariadb-10.11.9/sql/sql_time.cc --- mariadb-10.11.6/sql/sql_time.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_time.cc 2024-08-03 07:29:59.000000000 +0000 @@ -930,7 +930,7 @@ bool date_add_interval(THD *thd, MYSQL_TIME *ltime, interval_type int_type, const INTERVAL &interval, bool push_warn) { - long period, sign; + long sign; sign= (interval.neg == (bool)ltime->neg ? 1 : -1); @@ -1001,13 +1001,17 @@ break; } case INTERVAL_WEEK: - period= (calc_daynr(ltime->year,ltime->month,ltime->day) + - sign * (long) interval.day); + { + longlong period= calc_daynr(ltime->year, ltime->month, ltime->day) + + (longlong) sign * (longlong) interval.day; + if (period < 0 || period > 0x7FFFFFFF) + goto invalid_date; /* Daynumber from year 0 to 9999-12-31 */ if (get_date_from_daynr((long) period,<ime->year,<ime->month, <ime->day)) goto invalid_date; break; + } case INTERVAL_YEAR: ltime->year+= sign * (long) interval.year; if ((ulong) ltime->year >= 10000L) @@ -1019,8 +1023,9 @@ case INTERVAL_YEAR_MONTH: case INTERVAL_QUARTER: case INTERVAL_MONTH: - period= (ltime->year*12 + sign * (long) interval.year*12 + - ltime->month-1 + sign * (long) interval.month); + { + long period= (ltime->year*12 + sign * (long) interval.year*12 + + ltime->month-1 + sign * (long) interval.month); if ((ulong) period >= 120000L) goto invalid_date; ltime->year= (uint) (period / 12); @@ -1033,6 +1038,7 @@ ltime->day++; // Leap-year } break; + } default: goto null_date; } diff -Nru mariadb-10.11.6/sql/sql_trigger.cc mariadb-10.11.9/sql/sql_trigger.cc --- mariadb-10.11.6/sql/sql_trigger.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_trigger.cc 2024-08-03 07:29:59.000000000 +0000 @@ -82,7 +82,7 @@ :Stored_program_creation_ctx(client_cs, connection_cl, db_cl) { } - virtual Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) + Stored_program_creation_ctx *clone(MEM_ROOT *mem_root) override { return new (mem_root) Trigger_creation_ctx(m_client_cs, m_connection_cl, @@ -90,7 +90,7 @@ } protected: - virtual Object_creation_ctx *create_backup_ctx(THD *thd) const + Object_creation_ctx *create_backup_ctx(THD *thd) const override { return new Trigger_creation_ctx(thd); } @@ -282,8 +282,8 @@ Handle_old_incorrect_sql_modes_hook(const char *file_path) :path(file_path) {}; - virtual bool process_unknown_string(const char *&unknown_key, uchar* base, - MEM_ROOT *mem_root, const char *end); + bool process_unknown_string(const char *&unknown_key, uchar* base, + MEM_ROOT *mem_root, const char *end) override; }; @@ -294,8 +294,8 @@ LEX_CSTRING *trigger_table_arg) :path(file_path), trigger_table_value(trigger_table_arg) {}; - virtual bool process_unknown_string(const char *&unknown_key, uchar* base, - MEM_ROOT *mem_root, const char *end); + bool process_unknown_string(const char *&unknown_key, uchar* base, + MEM_ROOT *mem_root, const char *end) override; private: const char *path; LEX_CSTRING *trigger_table_value; @@ -322,12 +322,12 @@ Deprecated_trigger_syntax_handler() : m_trigger_name(NULL) {} - virtual bool handle_condition(THD *thd, + bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, const char* message, - Sql_condition ** cond_hdl) + Sql_condition ** cond_hdl) override { if (sql_errno != EE_OUTOFMEMORY && sql_errno != ER_OUT_OF_RESOURCES) @@ -470,7 +470,7 @@ /* We don't allow creating triggers on tables in the 'mysql' schema */ - if (create && lex_string_eq(&tables->db, STRING_WITH_LEN("mysql"))) + if (create && Lex_ident_db(tables->db).streq(MYSQL_SCHEMA_NAME)) { my_error(ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA, MYF(0)); DBUG_RETURN(TRUE); @@ -2537,7 +2537,8 @@ MDL_key key(MDL_key::TRIGGER, trigger->m_db.str, trigger->m_name.str); - if (sp_add_used_routine(prelocking_ctx, thd->stmt_arena, + if (sp_add_used_routine(prelocking_ctx, + thd->active_stmt_arena_to_use(), &key, &sp_handler_trigger, table_list->belong_to_view)) { diff -Nru mariadb-10.11.6/sql/sql_truncate.h mariadb-10.11.9/sql/sql_truncate.h --- mariadb-10.11.6/sql/sql_truncate.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_truncate.h 2024-08-03 07:29:59.000000000 +0000 @@ -40,9 +40,9 @@ @param thd the current thread. @return false on success. */ - bool execute(THD *thd); + bool execute(THD *thd) override; - virtual enum_sql_command sql_command_code() const + enum_sql_command sql_command_code() const override { return SQLCOM_TRUNCATE; } diff -Nru mariadb-10.11.6/sql/sql_tvc.cc mariadb-10.11.9/sql/sql_tvc.cc --- mariadb-10.11.6/sql/sql_tvc.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_tvc.cc 2024-08-03 07:29:59.000000000 +0000 @@ -271,7 +271,10 @@ if (!holders) { - holders= type_holders= new (thd->stmt_arena->mem_root) Type_holder[cnt]; + DBUG_ASSERT(thd->stmt_arena->is_stmt_prepare_or_first_stmt_execute() || + thd->stmt_arena->is_conventional()); + holders= type_holders= + new (thd->active_stmt_arena_to_use()->mem_root) Type_holder[cnt]; if (!holders || join_type_handlers_for_tvc(thd, li, holders, cnt) || get_type_attributes_for_tvc(thd, li, holders, @@ -309,7 +312,7 @@ (thd->lex->context_analysis_only & CONTEXT_ANALYSIS_ONLY_VIEW) */ - thd->where="order clause"; + thd->where= THD_WHERE::ORDER_CLAUSE; ORDER *order= sl->order_list.first; for (; order; order=order->next) { @@ -324,7 +327,7 @@ if (!count || count > first_elem->elements) { my_error(ER_BAD_FIELD_ERROR, MYF(0), - order_item->full_name(), thd->where); + order_item->full_name(), thd_where(thd)); DBUG_RETURN(true); } order->in_field_list= 1; diff -Nru mariadb-10.11.6/sql/sql_type.cc mariadb-10.11.9/sql/sql_type.cc --- mariadb-10.11.6/sql/sql_type.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_type.cc 2024-08-03 07:29:59.000000000 +0000 @@ -33,6 +33,88 @@ return tmp; } + +bool +DTCollation::merge_charset_and_collation(CHARSET_INFO *cs, + const Lex_extended_collation_st &cl, + my_repertoire_t repertoire) +{ + Lex_exact_charset_opt_extended_collate cscl(cs, true); + if (cscl.merge_collation_override(cl)) + return true; + set(cscl.collation().charset_info(), DERIVATION_EXPLICIT, repertoire); + return false; +} + + +bool DTCollation::merge_collation(const Lex_extended_collation_st &cl, + my_repertoire_t repertoire, + bool allow_ignorable_with_context_collation) +{ + if (derivation != DERIVATION_IGNORABLE) + { + // A known character set + an extended collation + return merge_charset_and_collation(collation, cl, repertoire); + } + + if (cl.type() == Lex_extended_collation::TYPE_EXACT) + { + /* + An unknown character set + an exact collation. + Just use this exact collation. + Examples: + - Expressions derived from an explicit NULL: + SELECT NULL COLLATE utf8mb4_general_ci; + SELECT CONCAT(NULL) COLLATE utf8mb4_general_ci; + Any collation is applicable to an explicit NULL. + + - Expressions with PS parameters (at PREPARE time, not bound yet) + SELECT ? COLLATE utf8mb4_general_ci; + SELECT CONCAT(?) COLLATE utf8mb4_general_ci; + The collation will be checked for applicability to the + character set of the actual bound parameter at the EXECUTE time. + We're now in PREPARE: let's assume it will be applicable. + */ + set(cl.charset_info(), DERIVATION_EXPLICIT, repertoire); + return false; + } + + // An unknown character set + a contextually typed collation + if (allow_ignorable_with_context_collation) + { + /* + Expressions with non-bound PS parameters, PREPARE time. + SELECT ? COLLATE uca1400_ai_ci; + SELECT CONCAT(?) COLLATE uca1400_ai_ci; + There is a chance the character set of the actual bound parameter + will be known at the EXECUTE time (unless an explicit NULL is bound). + + For now let's use utf8mb4 to resolve collations like uca1400_ai_ci. + The real character set of the actual bound parameter expression will be + later used to resolve the collation again, during the EXECUTE time. + */ + return merge_charset_and_collation(&my_charset_utf8mb4_general_ci, + cl, repertoire); + } + + /* + Expressions with an unknown character set: + - Either without PS parameters at all: + SELECT NULL COLLATE uca1400_ai_ci; + SELECT CONCAT(NULL) COLLATE uca1400_ai_ci; + - Or with PS parameters bound to NULL at EXECUTE time: + EXECUTE IMMEDIATE + 'SELECT ? COLLATE uca1400_ai_ci' USING NULL; + EXECUTE IMMEDIATE + 'SELECT CONCAT(?) COLLATE uca1400_ai_ci' USING NULL; + EXECUTE IMMEDIATE + 'SELECT ? COLLATE uca1400_ai_ci' USING CONCAT(NULL); + */ + my_error(ER_NOT_ALLOWED_IN_THIS_CONTEXT, MYF(0), "NULL"); + return true; +} + + Named_type_handler type_handler_row("row"); Named_type_handler type_handler_null("null"); @@ -41,6 +123,7 @@ Named_type_handler type_handler_stiny("tinyint"); Named_type_handler type_handler_sshort("smallint"); Named_type_handler type_handler_slong("int"); +Named_type_handler type_handler_slong_ge0("int"); Named_type_handler type_handler_sint24("mediumint"); Named_type_handler type_handler_slonglong("bigint"); Named_type_handler type_handler_utiny("tiny unsigned"); @@ -1446,22 +1529,6 @@ } -const Type_handler * -Type_handler::get_handler_by_cmp_type(Item_result type) -{ - switch (type) { - case REAL_RESULT: return &type_handler_double; - case INT_RESULT: return &type_handler_slonglong; - case DECIMAL_RESULT: return &type_handler_newdecimal; - case STRING_RESULT: return &type_handler_long_blob; - case TIME_RESULT: return &type_handler_datetime; - case ROW_RESULT: return &type_handler_row; - } - DBUG_ASSERT(0); - return &type_handler_string; -} - - /* If we have a mixture of: - a MariaDB standard (built-in permanent) data type, and @@ -2258,6 +2325,34 @@ } +const Type_handler * +Type_handler::handler_by_log_event_data_type(THD *thd, + const Log_event_data_type &type) +{ + if (type.data_type_name().length) + { + const Type_handler *th= handler_by_name(thd, type.data_type_name()); + if (th) + return th; + } + switch (type.type()) { + case STRING_RESULT: + case ROW_RESULT: + case TIME_RESULT: + break; + case REAL_RESULT: + return &type_handler_double; + case INT_RESULT: + if (type.is_unsigned()) + return &type_handler_ulonglong; + return &type_handler_slonglong; + case DECIMAL_RESULT: + return &type_handler_newdecimal; + } + return &type_handler_long_blob; +} + + /** Create a DOUBLE field by default. */ @@ -4608,6 +4703,10 @@ bool unsigned_flag= items[0]->unsigned_flag; for (uint i= 1; i < nitems; i++) { + /* + TODO: avoid creating DECIMAL for a mix of ulong and slong_ge0. + It's too late for 10.5. Let's do it in a higher version. + */ if (unsigned_flag != items[i]->unsigned_flag) { // Convert a mixture of signed and unsigned int to decimal @@ -4617,6 +4716,21 @@ } } func->aggregate_attributes_int(items, nitems); + for (uint i= 0; i < nitems; i++) + { + if (items[i]->type_handler() == &type_handler_slong_ge0) + { + /* + A slong_ge0 argument found. + We need to add an extra character for the sign. + TODO: rewrite aggregate_attributes_int() to find + the maximum decimal_precision() instead of the maximum max_length. + This change is too late for 10.5, so let's do it in a higher version. + */ + uint digits_and_sign= items[i]->decimal_precision() + 1; + set_if_bigger(func->max_length, digits_and_sign); + } + } handler->set_handler(func->unsigned_flag ? handler->type_handler()->type_handler_unsigned() : handler->type_handler()->type_handler_signed()); @@ -4912,6 +5026,13 @@ /*************************************************************************/ +bool Type_handler_long_ge0:: + Item_sum_hybrid_fix_length_and_dec(Item_sum_hybrid *func) const +{ + return func->fix_length_and_dec_sint_ge0(); +} + + bool Type_handler_int_result:: Item_sum_hybrid_fix_length_and_dec(Item_sum_hybrid *func) const { @@ -5668,6 +5789,14 @@ /***************************************************************************/ +bool Type_handler::Item_bool_rowready_func2_fix_length_and_dec(THD *thd, + Item_bool_rowready_func2 *func) const +{ + return func->fix_length_and_dec_generic(thd, this); +} + +/***************************************************************************/ + bool Type_handler_numeric:: Item_func_between_fix_length_and_dec(Item_func_between *func) const { @@ -6346,6 +6475,14 @@ } +bool Type_handler_long_ge0:: + Item_func_round_fix_length_and_dec(Item_func_round *item) const +{ + item->fix_arg_slong_ge0(); + return false; +} + + bool Type_handler_year:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { @@ -6567,6 +6704,14 @@ } +bool Type_handler_long_ge0:: + Item_func_abs_fix_length_and_dec(Item_func_abs *item) const +{ + item->fix_length_and_dec_sint_ge0(); + return false; +} + + bool Type_handler_real_result:: Item_func_abs_fix_length_and_dec(Item_func_abs *item) const { @@ -6677,6 +6822,22 @@ } +bool Type_handler_long_ge0:: + Item_func_signed_fix_length_and_dec(Item_func_signed *item) const +{ + item->fix_length_and_dec_sint_ge0(); + return false; +} + + +bool Type_handler_long_ge0:: + Item_func_unsigned_fix_length_and_dec(Item_func_unsigned *item) const +{ + item->fix_length_and_dec_sint_ge0(); + return false; +} + + bool Type_handler_string_result:: Item_func_signed_fix_length_and_dec(Item_func_signed *item) const { @@ -7162,6 +7323,18 @@ return (decimal_digits_t) MY_MIN(prec, DECIMAL_MAX_PRECISION); } +decimal_digits_t Type_handler_long_ge0::Item_decimal_precision(const Item *item) const +{ + DBUG_ASSERT(item->max_length); + DBUG_ASSERT(!item->decimals); + /* + Unlinke in Type_handler_long, Type_handler_long_ge does + not reserve one character for the sign. All max_length + characters are digits. + */ + return MY_MIN(item->max_length, DECIMAL_MAX_PRECISION); +} + decimal_digits_t Type_handler_time_common::Item_decimal_precision(const Item *item) const { return (decimal_digits_t) (7 + MY_MIN(item->decimals, TIME_SECOND_PART_DIGITS)); @@ -8163,6 +8336,26 @@ } +Field *Type_handler_long_ge0:: + make_table_field_from_def(TABLE_SHARE *share, MEM_ROOT *mem_root, + const LEX_CSTRING *name, + const Record_addr &rec, const Bit_addr &bit, + const Column_definition_attributes *attr, + uint32 flags) const +{ + /* + We're converting signed long_ge0 to signed long. + So add one character for the sign. + */ + return new (mem_root) + Field_long(rec.ptr(), (uint32) attr->length + 1/*sign*/, + rec.null_ptr(), rec.null_bit(), + attr->unireg_check, name, + f_is_zerofill(attr->pack_flag) != 0, + f_is_dec(attr->pack_flag) == 0); +} + + Field *Type_handler_longlong:: make_table_field_from_def(TABLE_SHARE *share, MEM_ROOT *mem_root, const LEX_CSTRING *name, @@ -8784,41 +8977,48 @@ /***************************************************************************/ -void Type_handler_var_string:: - Column_definition_implicit_upgrade(Column_definition *c) const + +const Type_handler * +Type_handler_var_string::type_handler_for_implicit_upgrade() const +{ + return &type_handler_varchar; +} + + +void Type_handler:: + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { - // Change old VARCHAR to new VARCHAR - c->set_handler(&type_handler_varchar); + old->set_handler(this); } void Type_handler_time_common:: - Column_definition_implicit_upgrade(Column_definition *c) const + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { if (opt_mysql56_temporal_format) - c->set_handler(&type_handler_time2); + old->set_handler(&type_handler_time2); else - c->set_handler(&type_handler_time); + old->set_handler(&type_handler_time); } void Type_handler_datetime_common:: - Column_definition_implicit_upgrade(Column_definition *c) const + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { if (opt_mysql56_temporal_format) - c->set_handler(&type_handler_datetime2); + old->set_handler(&type_handler_datetime2); else - c->set_handler(&type_handler_datetime); + old->set_handler(&type_handler_datetime); } void Type_handler_timestamp_common:: - Column_definition_implicit_upgrade(Column_definition *c) const + Column_definition_implicit_upgrade_to_this(Column_definition *old) const { if (opt_mysql56_temporal_format) - c->set_handler(&type_handler_timestamp2); + old->set_handler(&type_handler_timestamp2); else - c->set_handler(&type_handler_timestamp); + old->set_handler(&type_handler_timestamp); } diff -Nru mariadb-10.11.6/sql/sql_type.h mariadb-10.11.9/sql/sql_type.h --- mariadb-10.11.6/sql/sql_type.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_type.h 2024-08-03 07:29:59.000000000 +0000 @@ -30,6 +30,8 @@ #include "sql_type_string.h" #include "sql_type_real.h" #include "compat56.h" +#include "log_event_data_type.h" + C_MODE_START #include C_MODE_END @@ -55,6 +57,7 @@ class Item_func_min_max; class Item_func_hybrid_field_type; class Item_bool_func2; +class Item_bool_rowready_func2; class Item_func_between; class Item_func_in; class Item_func_round; @@ -150,8 +153,8 @@ case SCALAR_CMP_EQUAL: return LEX_CSTRING{STRING_WITH_LEN("<=>")}; case SCALAR_CMP_LT: return LEX_CSTRING{STRING_WITH_LEN("<")}; case SCALAR_CMP_LE: return LEX_CSTRING{STRING_WITH_LEN("<=")}; - case SCALAR_CMP_GE: return LEX_CSTRING{STRING_WITH_LEN(">")}; - case SCALAR_CMP_GT: return LEX_CSTRING{STRING_WITH_LEN(">=")}; + case SCALAR_CMP_GE: return LEX_CSTRING{STRING_WITH_LEN(">=")}; + case SCALAR_CMP_GT: return LEX_CSTRING{STRING_WITH_LEN(">")}; } DBUG_ASSERT(0); return LEX_CSTRING{STRING_WITH_LEN("")}; @@ -3073,6 +3076,12 @@ bool aggregate(const DTCollation &dt, uint flags= 0); bool set(DTCollation &dt1, DTCollation &dt2, uint flags= 0) { set(dt1); return aggregate(dt2, flags); } + bool merge_charset_and_collation(CHARSET_INFO *cs, + const Lex_extended_collation_st &cl, + my_repertoire_t repertoire); + bool merge_collation(const Lex_extended_collation_st &cl, + my_repertoire_t repertoire, + bool allow_ignorable_with_context_collation); const char *derivation_name() const { switch(derivation) @@ -3601,13 +3610,13 @@ class Vers_type_timestamp: public Vers_type_handler { public: - virtual vers_kind_t kind() const + vers_kind_t kind() const override { return VERS_TIMESTAMP; } bool check_sys_fields(const LEX_CSTRING &table_name, const Column_definition *row_start, - const Column_definition *row_end) const; + const Column_definition *row_end) const override; }; extern Vers_type_timestamp vers_type_timestamp; @@ -3615,13 +3624,13 @@ class Vers_type_trx: public Vers_type_handler { public: - virtual vers_kind_t kind() const + vers_kind_t kind() const override { return VERS_TRX_ID; } bool check_sys_fields(const LEX_CSTRING &table_name, const Column_definition *row_start, - const Column_definition *row_end) const; + const Column_definition *row_end) const override; }; extern MYSQL_PLUGIN_IMPORT Vers_type_trx vers_type_trx; @@ -3672,6 +3681,9 @@ static const Type_handler *handler_by_name(THD *thd, const LEX_CSTRING &name); static const Type_handler *handler_by_name_or_error(THD *thd, const LEX_CSTRING &name); + static const Type_handler *handler_by_log_event_data_type( + THD *thd, + const Log_event_data_type &type); static const Type_handler *odbc_literal_type_handler(const LEX_CSTRING *str); static const Type_handler *blob_type_handler(uint max_octet_length); static const Type_handler *string_type_handler(uint max_octet_length); @@ -3689,7 +3701,6 @@ static const Type_handler *blob_type_handler(const Item *item); static const Type_handler *get_handler_by_field_type(enum_field_types type); static const Type_handler *get_handler_by_real_type(enum_field_types type); - static const Type_handler *get_handler_by_cmp_type(Item_result type); static const Type_collection * type_collection_for_aggregation(const Type_handler *h1, const Type_handler *h2); @@ -3831,6 +3842,16 @@ const Type_handler *res= type_handler_base(); return res ? res : this; } + /* + In 10.11.8 the semantics of this method has changed to the opposite. + It used to be called with the old data type handler as "this". + Now it's called with the new data type hander as "this". + To avoid problems during merges, the method name was renamed. + */ + virtual const Type_handler *type_handler_for_implicit_upgrade() const + { + return this; + } virtual const Type_handler *type_handler_for_comparison() const= 0; virtual const Type_handler *type_handler_for_native_format() const { @@ -3957,6 +3978,12 @@ { return false; } + + virtual Log_event_data_type user_var_log_event_data_type(uint charset_nr) const + { + return Log_event_data_type({NULL,0}/*data type name*/, result_type(), + charset_nr, is_unsigned()); + } virtual uint Column_definition_gis_options_image(uchar *buff, const Column_definition &def) const @@ -3970,9 +3997,13 @@ virtual bool validate_implicit_default_value(THD *thd, const Column_definition &def) const; - // Automatic upgrade, e.g. for ALTER TABLE t1 FORCE - virtual void Column_definition_implicit_upgrade(Column_definition *c) const - { } + /* + Automatic upgrade, e.g. for REPAIR or ALTER TABLE t1 FORCE + - from the data type specified in old->type_handler() + - to the data type specified in "this" + */ + virtual void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const; // Validate CHECK constraint after the parser virtual bool Column_definition_validate_check_constraint(THD *thd, Column_definition *c) @@ -4257,6 +4288,8 @@ } virtual bool Item_eq_value(THD *thd, const Type_cmp_attributes *attr, Item *a, Item *b) const= 0; + virtual bool Item_bool_rowready_func2_fix_length_and_dec(THD *thd, + Item_bool_rowready_func2 *func) const; virtual bool Item_hybrid_func_fix_attributes(THD *thd, const LEX_CSTRING &name, Type_handler_hybrid_field_type *, @@ -5760,6 +5793,38 @@ }; +/* + The expression of this type reports itself as signed, + however it's known not to return negative values. + Items of this data type count only digits in Item::max_length, + without adding +1 for the sign. This allows expressions + of this type convert nicely to VARCHAR and DECIMAL. + For example, YEAR(now()) is: + - VARCHAR(4) in a string context + - DECIMAL(4,0) in a decimal context + - but INT(5) in an integer context +*/ +class Type_handler_long_ge0: public Type_handler_long +{ +public: + decimal_digits_t Item_decimal_precision(const Item *item) const override; + bool Item_func_signed_fix_length_and_dec(Item_func_signed *item) + const override; + bool Item_func_unsigned_fix_length_and_dec(Item_func_unsigned *item) + const override; + bool Item_func_abs_fix_length_and_dec(Item_func_abs *) const override; + bool Item_func_round_fix_length_and_dec(Item_func_round *) const override; + bool Item_sum_hybrid_fix_length_and_dec(Item_sum_hybrid *func) const override; + Field *make_table_field_from_def(TABLE_SHARE *share, + MEM_ROOT *mem_root, + const LEX_CSTRING *name, + const Record_addr &addr, + const Bit_addr &bit, + const Column_definition_attributes *attr, + uint32 flags) const override; +}; + + class Type_handler_ulong: public Type_handler_long { public: @@ -6175,7 +6240,8 @@ const Type_handler *type_handler_for_comparison() const override; int stored_field_cmp_to_item(THD *thd, Field *field, Item *item) const override; - void Column_definition_implicit_upgrade(Column_definition *c) const override; + void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const override; bool Column_definition_fix_attributes(Column_definition *c) const override; bool Column_definition_attributes_frm_unpack(Column_definition_attributes *attr, @@ -6499,7 +6565,8 @@ const Type_cast_attributes &attr) const override; bool validate_implicit_default_value(THD *thd, const Column_definition &def) const override; - void Column_definition_implicit_upgrade(Column_definition *c) const override; + void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const override; bool Column_definition_fix_attributes(Column_definition *c) const override; bool Column_definition_attributes_frm_unpack(Column_definition_attributes *attr, @@ -6637,7 +6704,8 @@ { return true; } - void Column_definition_implicit_upgrade(Column_definition *c) const override; + void Column_definition_implicit_upgrade_to_this( + Column_definition *old) const override; bool Column_definition_attributes_frm_unpack(Column_definition_attributes *attr, TABLE_SHARE *share, @@ -6987,6 +7055,7 @@ { return MYSQL_TYPE_VARCHAR; } + const Type_handler *type_handler_for_implicit_upgrade() const override; const Type_handler *type_handler_for_tmp_table(const Item *item) const override { return varstring_type_handler(item); @@ -6994,7 +7063,6 @@ uint32 max_display_length_for_field(const Conv_source &src) const override; void show_binlog_type(const Conv_source &src, const Field &dst, String *str) const override; - void Column_definition_implicit_upgrade(Column_definition *c) const override; bool Column_definition_fix_attributes(Column_definition *c) const override; bool Column_definition_prepare_stage2(Column_definition *c, handler *file, @@ -7594,6 +7662,7 @@ extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_sshort; extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_sint24; extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_slong; +extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_slong_ge0; extern MYSQL_PLUGIN_IMPORT Named_type_handler type_handler_slonglong; extern Named_type_handler type_handler_utiny; diff -Nru mariadb-10.11.6/sql/sql_type_fixedbin.h mariadb-10.11.9/sql/sql_type_fixedbin.h --- mariadb-10.11.6/sql/sql_type_fixedbin.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_type_fixedbin.h 2024-08-03 07:29:59.000000000 +0000 @@ -136,6 +136,21 @@ return Fbt_null(item, false).is_null(); } + /* + Check at fix_fields() time if any of the items can return a nullable + value on conversion to Fbt. + */ + static bool fix_fields_maybe_null_on_conversion_to_fbt(Item **items, + uint count) + { + for (uint i= 0; i < count; i++) + { + if (Fbt::fix_fields_maybe_null_on_conversion_to_fbt(items[i])) + return true; + } + return false; + } + public: Fbt(Item *item, bool *error, bool warn= true) @@ -275,8 +290,9 @@ str->append(tmp); str->append('\''); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } // Non-overriding methods void set_value(const Fbt &value) @@ -854,8 +870,9 @@ { return Item::save_in_field(field, no_conversions); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } }; class Item_char_typecast_func_handler_fbt_to_binary: @@ -955,7 +972,7 @@ Fbt_null tmp(args[0]); return null_value= tmp.is_null() || tmp.to_native(to); } - Item *get_copy(THD *thd) override + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } }; @@ -965,9 +982,10 @@ public: Item_cache_fbt(THD *thd) :Item_cache(thd, singleton()) { } - Item *get_copy(THD *thd) + Item *do_get_copy(THD *thd) const override { return get_item_copy(thd, this); } - bool cache_value() + Item *do_build_clone(THD *thd) const override { return get_copy(thd); } + bool cache_value() override { if (!example) return false; @@ -977,54 +995,54 @@ &m_value, type_handler()); return true; } - String* val_str(String *to) + String* val_str(String *to) override { if (!has_value()) return NULL; Fbt_null tmp(m_value.ptr(), m_value.length()); return tmp.is_null() || tmp.to_string(to) ? NULL : to; } - my_decimal *val_decimal(my_decimal *to) + my_decimal *val_decimal(my_decimal *to) override { if (!has_value()) return NULL; my_decimal_set_zero(to); return to; } - longlong val_int() + longlong val_int() override { if (!has_value()) return 0; return 0; } - double val_real() + double val_real() override { if (!has_value()) return 0; return 0; } - longlong val_datetime_packed(THD *thd) + longlong val_datetime_packed(THD *) override { DBUG_ASSERT(0); if (!has_value()) return 0; return 0; } - longlong val_time_packed(THD *thd) + longlong val_time_packed(THD *) override { DBUG_ASSERT(0); if (!has_value()) return 0; return 0; } - bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + bool get_date(THD *, MYSQL_TIME *ltime, date_mode_t) override { if (!has_value()) return true; set_zero_time(ltime, MYSQL_TIMESTAMP_TIME); return false; } - bool val_native(THD *thd, Native *to) + bool val_native(THD *, Native *to) override { if (!has_value()) return true; @@ -1110,6 +1128,11 @@ return FbtImpl::max_char_length(); } + const Type_handler *type_handler_for_implicit_upgrade() const override + { + return TypeCollectionImpl::singleton()-> + type_handler_for_implicit_upgrade(this); + } const Type_handler *type_handler_for_comparison() const override { return this; @@ -1534,6 +1557,16 @@ Fbt_null na(a), nb(b); return !na.is_null() && !nb.is_null() && !na.cmp(nb); } + bool Item_bool_rowready_func2_fix_length_and_dec(THD *thd, + Item_bool_rowready_func2 *func) const override + { + if (Type_handler::Item_bool_rowready_func2_fix_length_and_dec(thd, func)) + return true; + if (!func->maybe_null() && + Fbt::fix_fields_maybe_null_on_conversion_to_fbt(func->arguments(), 2)) + func->set_maybe_null(); + return false; + } bool Item_hybrid_func_fix_attributes(THD *thd, const LEX_CSTRING &name, Type_handler_hybrid_field_type *h, Type_all_attributes *attr, @@ -1715,6 +1748,9 @@ bool Item_func_between_fix_length_and_dec(Item_func_between *func) const override { + if (!func->maybe_null() && + Fbt::fix_fields_maybe_null_on_conversion_to_fbt(func->arguments(), 3)) + func->set_maybe_null(); return false; } longlong Item_func_between_val_int(Item_func_between *func) const override @@ -1737,6 +1773,10 @@ Item_func_in *func) const override { + if (!func->maybe_null() && + Fbt::fix_fields_maybe_null_on_conversion_to_fbt(func->arguments(), + func->argument_count())) + func->set_maybe_null(); if (func->compatible_types_scalar_bisection_possible()) { return func->value_list_convert_const_to_int(thd) || @@ -1911,6 +1951,12 @@ return NULL; } + const Type_handler *type_handler_for_implicit_upgrade( + const Type_handler *from) const + { + return from; + } + static Type_collection_fbt *singleton() { static Type_collection_fbt tc; diff -Nru mariadb-10.11.6/sql/sql_type_geom.h mariadb-10.11.9/sql/sql_type_geom.h --- mariadb-10.11.6/sql/sql_type_geom.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_type_geom.h 2024-08-03 07:29:59.000000000 +0000 @@ -82,6 +82,13 @@ Field *make_conversion_table_field(MEM_ROOT *root, TABLE *table, uint metadata, const Field *target) const override; + Log_event_data_type user_var_log_event_data_type(uint charset_nr) + const override + { + return Log_event_data_type(name().lex_cstring(), result_type(), + charset_nr, false/*unsigned*/); + } + uint Column_definition_gis_options_image(uchar *buff, const Column_definition &def) const override; diff -Nru mariadb-10.11.6/sql/sql_udf.h mariadb-10.11.9/sql/sql_udf.h --- mariadb-10.11.6/sql/sql_udf.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_udf.h 2024-08-03 07:29:59.000000000 +0000 @@ -147,6 +147,20 @@ *null_value= (my_bool) (is_null || error); } String *val_str(String *str,String *save_str); + + udf_handler(const udf_handler &orig) + { + u_d = orig.u_d; + buffers = orig.buffers; + f_args = orig.f_args; + initid = orig.initid; + num_buffer = orig.num_buffer; + error = orig.error; + is_null = orig.is_null; + initialized = orig.initialized; + args = orig.args; + not_original = true; + } }; diff -Nru mariadb-10.11.6/sql/sql_union.cc mariadb-10.11.9/sql/sql_union.cc --- mariadb-10.11.6/sql/sql_union.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_union.cc 2024-08-03 07:29:59.000000000 +0000 @@ -116,12 +116,12 @@ if (table->no_rows_with_nulls) table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT; - fill_record(thd, table, table->field + addon_cnt, values, true, false); + fill_record(thd, table, table->field + addon_cnt, values, true, false, true); /* set up initial values for records to be written */ if (addon_cnt && step == UNION_TYPE) { DBUG_ASSERT(addon_cnt == 1); - table->field[0]->store((longlong) curr_step, 1); + table->field[0]->store((ulonglong) curr_step, 1); } if (unlikely(thd->is_error())) @@ -485,7 +485,7 @@ !curr_sl->next_select()) ) { is_index_enabled= false; - if (table->file->ha_disable_indexes(HA_KEY_SWITCH_ALL)) + if (table->file->ha_disable_indexes(key_map(0), false)) return false; table->no_keyread=1; return true; @@ -619,7 +619,7 @@ if (table->no_rows_with_nulls) table->null_catch_flags= CHECK_ROW_FOR_NULLS_TO_REJECT; - fill_record(thd, table, table->field + addon_cnt, values, true, false); + fill_record(thd, table, table->field + addon_cnt, values, true, false, true); /* set up initial values for records to be written */ if ( step == UNION_TYPE ) { @@ -1003,7 +1003,7 @@ } send_records++; - fill_record(thd, table, table->field, items, true, false); + fill_record(thd, table, table->field, items, true, false, true); if (unlikely(thd->is_error())) return true; /* purecov: inspected */ @@ -1265,26 +1265,21 @@ } -bool init_item_int(THD* thd, Item_int* &item) +static bool init_item_int(THD* thd, Item_int* &item) { if (!item) { - Query_arena *arena, backup_arena; - arena= thd->activate_stmt_arena_if_needed(&backup_arena); - item= new (thd->mem_root) Item_int(thd, 0); - if (arena) - thd->restore_active_arena(arena, &backup_arena); - if (!item) - return false; + return true; } else { item->value= 0; } - return true; + + return false; } @@ -1760,8 +1755,12 @@ for(uint i= 0; i< hidden; i++) { - init_item_int(thd, addon_fields[i]); - types.push_front(addon_fields[i]); + if (init_item_int(thd, addon_fields[i]) || + types.push_front(addon_fields[i])) + { + types.empty(); + goto err; + } addon_fields[i]->name.str= i ? "__CNT_1" : "__CNT_2"; addon_fields[i]->name.length= 7; } @@ -2085,7 +2084,7 @@ /* re-enabling indexes for next subselect iteration */ if ((union_result->force_enable_index_if_needed() || union_distinct)) { - if(table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL)) + if(table->file->ha_enable_indexes(key_map(table->s->keys), false)) DBUG_ASSERT(0); else table->no_keyread= 0; @@ -2185,7 +2184,7 @@ union_result->table && union_result->table->is_created()) { union_result->table->file->ha_delete_all_rows(); - union_result->table->file->ha_enable_indexes(HA_KEY_SWITCH_ALL); + union_result->table->file->ha_enable_indexes(key_map(table->s->keys), false); } } @@ -2252,7 +2251,7 @@ { // This is UNION DISTINCT, so there should be a fake_select_lex DBUG_ASSERT(fake_select_lex != NULL); - if (unlikely(table->file->ha_disable_indexes(HA_KEY_SWITCH_ALL))) + if (table->file->ha_disable_indexes(key_map(0), false)) DBUG_RETURN(TRUE); table->no_keyread=1; } diff -Nru mariadb-10.11.6/sql/sql_update.cc mariadb-10.11.9/sql/sql_update.cc --- mariadb-10.11.6/sql/sql_update.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_update.cc 2024-08-03 07:29:59.000000000 +0000 @@ -257,7 +257,7 @@ Field *field; uint keynr; MY_BITMAP unique_map; /* Fields in offended unique. */ - my_bitmap_map unique_map_buf[bitmap_buffer_size(MAX_FIELDS)]; + my_bitmap_map unique_map_buf[bitmap_buffer_size(MAX_FIELDS)/sizeof(my_bitmap_map)]; DBUG_ENTER("prepare_record_for_error_message"); /* @@ -587,7 +587,8 @@ select= make_select(table, 0, 0, conds, (SORT_INFO*) 0, 0, &error); if (unlikely(error || !limit || thd->is_error() || - (select && select->check_quick(thd, safe_update, limit)))) + (select && select->check_quick(thd, safe_update, limit, + Item_func::BITMAP_ALL)))) { query_plan.set_impossible_where(); if (thd->lex->describe || thd->lex->analyze_stmt) @@ -1707,8 +1708,8 @@ bool done; bool has_prelocking_list; public: - void reset(THD *thd); - bool handle_end(THD *thd); + void reset(THD *thd) override; + bool handle_end(THD *thd) override; }; void Multiupdate_prelocking_strategy::reset(THD *thd) @@ -2181,6 +2182,10 @@ { Item *value= value_it++; uint offset= item->field->table->pos_in_table_list->shared; + + if (value->associate_with_target_field(thd, item)) + DBUG_RETURN(1); + fields_for_table[offset]->push_back(item, thd->mem_root); values_for_table[offset]->push_back(value, thd->mem_root); } @@ -2444,7 +2449,8 @@ group.direction= ORDER::ORDER_ASC; group.item= (Item**) temp_fields.head_ref(); - tmp_param->quick_group= 1; + tmp_param->init(); + tmp_param->tmp_name="update"; tmp_param->field_count= temp_fields.elements; tmp_param->func_count= temp_fields.elements - 1; calc_group_buffer(tmp_param, &group); @@ -2678,7 +2684,7 @@ tmp_table_param[offset].func_count); fill_record(thd, tmp_table, tmp_table->field + 1 + unupdated_check_opt_tables.elements, - *values_for_table[offset], TRUE, FALSE); + *values_for_table[offset], true, false, false); /* Write row, ignoring duplicated updates to a row */ error= tmp_table->file->ha_write_tmp_row(tmp_table->record[0]); diff -Nru mariadb-10.11.6/sql/sql_view.cc mariadb-10.11.9/sql/sql_view.cc --- mariadb-10.11.6/sql/sql_view.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_view.cc 2024-08-03 07:29:59.000000000 +0000 @@ -297,7 +297,8 @@ for (tbl= sl->get_table_list(); tbl; tbl= tbl->next_local) { if (!tbl->with && tbl->select_lex) - tbl->with= tbl->select_lex->find_table_def_in_with_clauses(tbl); + tbl->with= tbl->select_lex->find_table_def_in_with_clauses(tbl, + NULL); /* Ensure that we have some privileges on this table, more strict check will be done on column level after preparation, @@ -1005,7 +1006,8 @@ { Sql_mode_save_for_frm_handling sql_mode_save(thd); - lex->unit.print(&view_query, enum_query_type(QT_VIEW_INTERNAL | + lex->unit.print(&view_query, enum_query_type(QT_FOR_FRM | + QT_VIEW_INTERNAL | QT_ITEM_ORIGINAL_FUNC_NULLIF | QT_NO_WRAPPERS_FOR_TVC_IN_VIEW)); lex->unit.print(&is_query, enum_query_type(QT_TO_SYSTEM_CHARSET | @@ -1725,7 +1727,7 @@ objects of the view. */ if (!(table->view_sctx= (Security_context *) - thd->stmt_arena->calloc(sizeof(Security_context)))) + thd->active_stmt_arena_to_use()->calloc(sizeof(Security_context)))) goto err; security_ctx= table->view_sctx; } diff -Nru mariadb-10.11.6/sql/sql_window.cc mariadb-10.11.9/sql/sql_window.cc --- mariadb-10.11.6/sql/sql_window.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_window.cc 2024-08-03 07:29:59.000000000 +0000 @@ -262,9 +262,12 @@ For "win_func() OVER (ORDER BY order_list RANGE BETWEEN ...)", - ORDER BY order_list must not be ommitted - the list must have a single element. + But it really only matters if the frame is bounded. */ if (win_spec->window_frame && - win_spec->window_frame->units == Window_frame::UNITS_RANGE) + win_spec->window_frame->units == Window_frame::UNITS_RANGE && + !(win_spec->window_frame->top_bound->is_unbounded() && + win_spec->window_frame->bottom_bound->is_unbounded())) { if (win_spec->order_list->elements != 1) { @@ -950,7 +953,7 @@ class Table_read_cursor : public Rowid_seq_cursor { public: - virtual ~Table_read_cursor() = default; + ~Table_read_cursor() override = default; void init(READ_RECORD *info) { @@ -1018,7 +1021,7 @@ /* This returns -1 when end of partition was reached. */ - int next() + int next() override { int res; if (end_of_partition) @@ -1308,12 +1311,12 @@ item_add->fix_fields(thd, &item_add); } - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { // Save the value of FUNC(current_row) range_expr->fetch_value_from(item_add); @@ -1322,19 +1325,19 @@ end_of_partition= false; } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { walk_till_non_peer(); } - void pre_next_row() + void pre_next_row() override { if (end_of_partition) return; range_expr->fetch_value_from(item_add); } - void next_row() + void next_row() override { if (end_of_partition) return; @@ -1346,12 +1349,12 @@ walk_till_non_peer(); } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } - bool is_outside_computation_bounds() const + bool is_outside_computation_bounds() const override { if (end_of_partition) return true; @@ -1448,12 +1451,12 @@ item_add->fix_fields(thd, &item_add); } - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { // Save the value of FUNC(current_row) range_expr->fetch_value_from(item_add); @@ -1463,20 +1466,20 @@ added_values= false; } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { cursor.move_to(rownum); walk_till_non_peer(); } - void pre_next_row() + void pre_next_row() override { if (end_of_partition) return; range_expr->fetch_value_from(item_add); } - void next_row() + void next_row() override { if (end_of_partition) return; @@ -1488,14 +1491,14 @@ walk_till_non_peer(); } - bool is_outside_computation_bounds() const + bool is_outside_computation_bounds() const override { if (!added_values) return true; return false; } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { if (end_of_partition) return cursor.get_rownum(); // Cursor does not pass over partition bound. @@ -1557,13 +1560,13 @@ { } - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); peer_tracker.init(); } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { // Save the value of the current_row peer_tracker.check_if_next_group(); @@ -1572,17 +1575,17 @@ add_value_to_items(); } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { walk_till_non_peer(); } - void pre_next_row() + void pre_next_row() override { dont_move= !peer_tracker.check_if_next_group(); } - void next_row() + void next_row() override { // Check if our cursor is pointing at a peer of the current row. // If not, move forward until that becomes true @@ -1597,7 +1600,7 @@ walk_till_non_peer(); } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } @@ -1654,7 +1657,7 @@ move(false) {} - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { bound_tracker.init(); @@ -1662,23 +1665,23 @@ peer_tracker.init(); } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { // Fetch the value from the first row peer_tracker.check_if_next_group(); cursor.move_to(rownum); } - void next_partition(ha_rows rownum) {} + void next_partition(ha_rows rownum) override {} - void pre_next_row() + void pre_next_row() override { // Check if the new current_row is a peer of the row that our cursor is // pointing to. move= peer_tracker.check_if_next_group(); } - void next_row() + void next_row() override { if (move) { @@ -1706,7 +1709,7 @@ } } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } @@ -1728,9 +1731,9 @@ SQL_I_List *order_list) {} - void init(READ_RECORD *info) {} + void init(READ_RECORD *info) override {} - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { /* UNBOUNDED PRECEDING frame end just stays on the first row of the @@ -1740,12 +1743,12 @@ curr_rownum= rownum; } - void next_row() + void next_row() override { /* Do nothing, UNBOUNDED PRECEDING frame end doesn't move. */ } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return curr_rownum; } @@ -1770,17 +1773,17 @@ SQL_I_List *order_list) : cursor(thd, partition_list) {} - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { cursor.on_next_partition(rownum); } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { /* Activate the first row */ cursor.fetch(); @@ -1793,12 +1796,12 @@ } } - void next_row() + void next_row() override { /* Do nothing, UNBOUNDED FOLLOWING frame end doesn't move */ } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } @@ -1813,7 +1816,7 @@ SQL_I_List *partition_list, SQL_I_List *order_list) : Frame_unbounded_following(thd, partition_list, order_list) {} - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { ha_rows num_rows_in_partition= 0; if (cursor.fetch()) @@ -1826,7 +1829,7 @@ set_win_funcs_row_count(num_rows_in_partition); } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } @@ -1853,7 +1856,7 @@ { order_item= order_list->first->item[0]; } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { ha_rows num_rows_in_partition= 0; if (cursor.fetch()) @@ -1869,7 +1872,7 @@ set_win_funcs_row_count(num_rows_in_partition); } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } @@ -1900,12 +1903,12 @@ is_top_bound(is_top_bound_arg), n_rows(n_rows_arg), n_rows_behind(0) {} - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { /* Position our cursor to point at the first row in the new partition @@ -1931,13 +1934,13 @@ } - void next_row() + void next_row() override { n_rows_behind++; move_cursor_if_possible(); } - bool is_outside_computation_bounds() const + bool is_outside_computation_bounds() const override { /* As a bottom boundary, rows have not yet been added. */ if (!is_top_bound && n_rows - n_rows_behind) @@ -1945,7 +1948,7 @@ return false; } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } @@ -2003,26 +2006,26 @@ Frame_rows_current_row_bottom() : curr_rownum(0) {} - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { add_value_to_items(); curr_rownum= rownum; } - void next_partition(ha_rows rownum) {} + void next_partition(ha_rows rownum) override {} - void pre_next_row() + void pre_next_row() override { /* Temp table's current row is current_row. Add it to the window func */ add_value_to_items(); } - void next_row() + void next_row() override { curr_rownum++; }; - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return curr_rownum; } @@ -2079,13 +2082,13 @@ { } - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); at_partition_end= false; } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { at_partition_end= false; @@ -2093,7 +2096,7 @@ } /* Move our cursor to be n_rows ahead. */ - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { if (is_top_bound) next_part_top(rownum); @@ -2101,7 +2104,7 @@ next_part_bottom(rownum); } - void next_row() + void next_row() override { if (is_top_bound) next_row_top(); @@ -2109,7 +2112,7 @@ next_row_bottom(); } - bool is_outside_computation_bounds() const + bool is_outside_computation_bounds() const override { /* The top bound can go over the current partition. In this case, @@ -2120,7 +2123,7 @@ return false; } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return cursor.get_rownum(); } @@ -2206,12 +2209,12 @@ const Frame_cursor &bottom_bound) : top_bound(top_bound), bottom_bound(bottom_bound) {} - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { /* TODO(cvicentiu) Sum functions get cleared on next partition anyway during the window function computation algorithm. Either perform this only in @@ -2221,23 +2224,23 @@ clear_sum_functions(); } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { compute_values_for_current_row(); } - void pre_next_row() + void pre_next_row() override { clear_sum_functions(); } - void next_row() + void next_row() override { curr_rownum++; compute_values_for_current_row(); } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return curr_rownum; } @@ -2297,36 +2300,36 @@ bottom_bound(&bottom_bound), offset(&offset), negative_offset(negative_offset) {} - void init(READ_RECORD *info) + void init(READ_RECORD *info) override { cursor.init(info); } - void pre_next_partition(ha_rows rownum) + void pre_next_partition(ha_rows rownum) override { /* The offset is dependant on the current row values. We can only get * it here accurately. When fetching other rows, it changes. */ save_offset_value(); } - void next_partition(ha_rows rownum) + void next_partition(ha_rows rownum) override { save_positional_value(); } - void pre_next_row() + void pre_next_row() override { /* The offset is dependant on the current row values. We can only get * it here accurately. When fetching other rows, it changes. */ save_offset_value(); } - void next_row() + void next_row() override { save_positional_value(); } - ha_rows get_curr_rownum() const + ha_rows get_curr_rownum() const override { return position_cursor.get_curr_rownum(); } diff -Nru mariadb-10.11.6/sql/sql_window.h mariadb-10.11.9/sql/sql_window.h --- mariadb-10.11.6/sql/sql_window.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_window.h 2024-08-03 07:29:59.000000000 +0000 @@ -173,7 +173,7 @@ : Window_spec(win_ref, part_list, ord_list, win_frame), window_name(win_name) {} - const char *name() { return window_name->str; } + const char *name() override { return window_name->str; } }; diff -Nru mariadb-10.11.6/sql/sql_yacc.yy mariadb-10.11.9/sql/sql_yacc.yy --- mariadb-10.11.6/sql/sql_yacc.yy 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sql_yacc.yy 2024-08-03 07:29:59.000000000 +0000 @@ -80,6 +80,9 @@ #pragma GCC diagnostic ignored "-Wunused-label" /* yyexhaustedlab: */ #endif +/* Stack size 28200 with clang for MYSQLparse() and ORAparse() */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int yylex(void *yylval, void *yythd); #define yyoverflow(A,B,C,D,E,F) \ @@ -733,7 +736,6 @@ %token ACTION /* SQL-2003-N */ %token ADMIN_SYM /* SQL-2003-N */ %token ADDDATE_SYM /* MYSQL-FUNC */ -%token ADD_MONTHS_SYM /* Oracle FUNC*/ %token AFTER_SYM /* SQL-2003-N */ %token AGAINST %token AGGREGATE_SYM @@ -809,7 +811,6 @@ %token DATAFILE_SYM %token DATA_SYM /* SQL-2003-N */ %token DATETIME -%token DATE_FORMAT_SYM /* MYSQL-FUNC */ %token DATE_SYM /* SQL-2003-R, Oracle-R, PLSQL-R */ %token DAY_SYM /* SQL-2003-R */ %token DEALLOCATE_SYM /* SQL-2003-R */ @@ -961,7 +962,6 @@ %token NATIONAL_SYM /* SQL-2003-R */ %token NCHAR_SYM /* SQL-2003-R */ %token NEVER_SYM /* MySQL */ -%token NEW_SYM /* SQL-2003-R */ %token NEXT_SYM /* SQL-2003-N */ %token NEXTVAL_SYM /* PostgreSQL sequence function */ %token NOCACHE_SYM @@ -1124,7 +1124,6 @@ %token TRIGGERS_SYM %token TRIM_ORACLE %token TRUNCATE_SYM -%token TYPES_SYM %token TYPE_SYM /* SQL-2003-N */ %token UDF_RETURNS_SYM %token UNBOUNDED_SYM /* SQL-2011-N */ @@ -1315,6 +1314,7 @@ %type IDENT_sys + ident_func ident label_ident sp_decl_ident @@ -1339,6 +1339,7 @@ IDENT_cli ident_cli ident_cli_set_usual_case + ident_cli_func %type ident_sys_alloc @@ -1353,6 +1354,8 @@ keyword_sp_block_section keyword_sp_decl keyword_sp_head + keyword_func_sp_var_and_label + keyword_func_sp_var_not_label keyword_sp_var_and_label keyword_sp_var_not_label keyword_sysvar_name @@ -1833,8 +1836,17 @@ %type sp_param_anchored %type sp_for_loop_index_and_bounds %type sp_for_loop_bounds -%type trim_operands -%type substring_operands + +%type + trim_operands + trim_operands_regular + trim_operands_special + +%type + substring_operands + substring_operands_regular + substring_operands_special + %type opt_sp_for_loop_direction %type sp_parameter_type %type index_hint_type @@ -7176,11 +7188,7 @@ | ALTER SEQUENCE_SYM opt_if_exists { LEX *lex= Lex; - lex->name= null_clex_str; - lex->table_type= TABLE_TYPE_UNKNOWN; lex->sql_command= SQLCOM_ALTER_SEQUENCE; - lex->create_info.init(); - lex->no_write_to_binlog= 0; DBUG_ASSERT(!lex->m_sql_cmd); if (Lex->main_select_push()) MYSQL_YYABORT; @@ -9656,8 +9664,16 @@ trim_operands: + trim_operands_regular + | trim_operands_special + ; + +trim_operands_regular: expr { $$.set(TRIM_BOTH, $1); } - | LEADING expr FROM expr { $$.set(TRIM_LEADING, $2, $4); } + ; + +trim_operands_special: + LEADING expr FROM expr { $$.set(TRIM_LEADING, $2, $4); } | TRAILING expr FROM expr { $$.set(TRIM_TRAILING, $2, $4); } | BOTH expr FROM expr { $$.set(TRIM_BOTH, $2, $4); } | LEADING FROM expr { $$.set(TRIM_LEADING, $3); } @@ -10067,6 +10083,11 @@ ; substring_operands: + substring_operands_regular + | substring_operands_special + ; + +substring_operands_regular: expr ',' expr ',' expr { $$= Lex_substring_spec_st::init($1, $3, $5); @@ -10075,7 +10096,10 @@ { $$= Lex_substring_spec_st::init($1, $3); } - | expr FROM expr FOR_SYM expr + ; + +substring_operands_special: + expr FROM expr FOR_SYM expr { $$= Lex_substring_spec_st::init($1, $3, $5); } @@ -10099,14 +10123,7 @@ discouraged. */ function_call_nonkeyword: - ADD_MONTHS_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $5, - INTERVAL_MONTH, 0); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ADDDATE_SYM '(' expr ',' expr ')' + ADDDATE_SYM '(' expr ',' expr ')' { $$= new (thd->mem_root) Item_date_add_interval(thd, $3, $5, INTERVAL_DAY, 0); @@ -10145,18 +10162,6 @@ if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | DATE_FORMAT_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DATE_FORMAT_SYM '(' expr ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_date_format(thd, $3, $5, $7); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } | EXTRACT_SYM '(' interval FROM expr ')' { $$=new (thd->mem_root) Item_extract(thd, $3, $5); @@ -10282,13 +10287,6 @@ MYSQL_YYABORT; } | - COLUMN_CHECK_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_dyncol_check(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | COLUMN_CREATE_SYM '(' dyncall_create_list ')' { $$= create_func_dyncol_create(thd, *$3); @@ -10323,43 +10321,12 @@ if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | COALESCE '(' expr_list ')' - { - $$= new (thd->mem_root) Item_func_coalesce(thd, *$3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | COLLATION_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_collation(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | DATABASE '(' ')' - { - $$= new (thd->mem_root) Item_func_database(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->safe_to_cache_query=0; - } | IF_SYM '(' expr ',' expr ',' expr ')' { $$= new (thd->mem_root) Item_func_if(thd, $3, $5, $7); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | FORMAT_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_format(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | FORMAT_SYM '(' expr ',' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_format(thd, $3, $5, $7); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } /* LAST_VALUE here conflicts with the definition for window functions. We have these 2 separate rules to remove the shift/reduce conflict. */ @@ -10381,25 +10348,12 @@ if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | MICROSECOND_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_microsecond(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } | MOD_SYM '(' expr ',' expr ')' { $$= new (thd->mem_root) Item_func_mod(thd, $3, $5); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | OLD_PASSWORD_SYM '(' expr ')' - { - $$= new (thd->mem_root) - Item_func_password(thd, $3, Item_func_password::OLD); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } | PASSWORD_SYM '(' expr ')' { Item* i1; @@ -10408,12 +10362,6 @@ MYSQL_YYABORT; $$= i1; } - | QUARTER_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_quarter(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } | REPEAT_SYM '(' expr ',' expr ')' { $$= new (thd->mem_root) Item_func_repeat(thd, $3, $5); @@ -10426,38 +10374,12 @@ make_item_func_replace(thd, $3, $5, $7)))) MYSQL_YYABORT; } - | REVERSE_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_reverse(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | ROW_COUNT_SYM '(' ')' - { - $$= new (thd->mem_root) Item_func_row_count(thd); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); - Lex->safe_to_cache_query= 0; - } | TRUNCATE_SYM '(' expr ',' expr ')' { $$= new (thd->mem_root) Item_func_round(thd, $3, $5, 1); if (unlikely($$ == NULL)) MYSQL_YYABORT; } - | WEEK_SYM '(' expr ')' - { - $$= new (thd->mem_root) Item_func_week(thd, $3); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } - | WEEK_SYM '(' expr ',' expr ')' - { - $$= new (thd->mem_root) Item_func_week(thd, $3, $5); - if (unlikely($$ == NULL)) - MYSQL_YYABORT; - } | WEIGHT_STRING_SYM '(' expr opt_ws_levels ')' { $$= new (thd->mem_root) Item_func_weight_string(thd, $3, 0, 0, $4); @@ -10503,7 +10425,7 @@ in sql/item_create.cc */ function_call_generic: - IDENT_sys '(' + ident_func '(' { #ifdef HAVE_DLOPEN udf_func *udf= 0; @@ -10541,7 +10463,9 @@ This will be revised with WL#2128 (SQL PATH) */ - if ((builder= native_functions_hash.find(thd, $1))) + builder= Schema::find_implied(thd)-> + find_native_function_builder(thd, $1); + if (builder) { item= builder->create_func(thd, &$1, $4); } @@ -10605,6 +10529,43 @@ if (unlikely(!($$= Lex->make_item_func_call_generic(thd, &$1, &$3, &$5, $7)))) MYSQL_YYABORT; } + | ident_cli '.' REPLACE '(' opt_expr_list ')' + { + if (unlikely(!($$= Lex->make_item_func_replace(thd, $1, $3, $5)))) + MYSQL_YYABORT; + } + | ident_cli '.' SUBSTRING '(' opt_expr_list ')' + { + if (unlikely(!($$= Lex->make_item_func_substr(thd, $1, $3, $5)))) + MYSQL_YYABORT; + } + | ident_cli '.' SUBSTRING '(' substring_operands_special ')' + { + if (unlikely(!($$= Lex->make_item_func_substr(thd, $1, $3, $5)))) + MYSQL_YYABORT; + } + | ident_cli '.' TRIM '(' opt_expr_list ')' + { + if (unlikely(!($$= Lex->make_item_func_trim(thd, $1, $3, $5)))) + MYSQL_YYABORT; + } + | ident_cli '.' TRIM '(' trim_operands_special ')' + { + if (unlikely(!($$= Lex->make_item_func_trim(thd, $1, $3, $5)))) + MYSQL_YYABORT; + } + /* + We don't add a qualified syntax for TRIM_ORACLE here, + as this syntax is not absolutely required: + SELECT mariadb_schema.TRIM_ORACLE(..); + What absolutely required is only: + SELECT mariadb_schema.TRIM(..); + Adding a qualified syntax for TRIM_ORACLE would be tricky because + it is a non-reserved keyword. To avoid new shift/reduce conflicts + it would require grammar changes, like introducing a new rule + ident_step2_cli (which would include everything that ident_cli + includes but TRIM_ORACLE). + */ ; fulltext_options: @@ -12286,7 +12247,7 @@ order_clause: ORDER_SYM BY { - thd->where= "ORDER clause"; + thd->where= THD_WHERE::ORDER_CLAUSE; } order_list { @@ -15159,10 +15120,7 @@ ident_sys_alloc: ident_cli { - void *buf= thd->alloc(sizeof(Lex_ident_sys)); - if (!buf) - MYSQL_YYABORT; - $$= new (buf) Lex_ident_sys(thd, &$1); + $$= new (thd->mem_root) Lex_ident_sys(thd, &$1); } ; @@ -15383,6 +15341,22 @@ } ; +ident_cli_func: + IDENT + | IDENT_QUOTED + | keyword_func_sp_var_and_label { $$= $1; } + | keyword_func_sp_var_not_label { $$= $1; } + ; + +ident_func: + ident_cli_func + { + if (unlikely(thd->to_ident_sys_alloc(&$$, &$1))) + MYSQL_YYABORT; + } + ; + + TEXT_STRING_sys: TEXT_STRING { @@ -15606,7 +15580,8 @@ TODO: check if some of them can migrate to keyword_sp_var_and_label. */ keyword_sp_var_not_label: - ASCII_SYM + keyword_func_sp_var_not_label + | ASCII_SYM | BACKUP_SYM | BINLOG_SYM | BYTE_SYM @@ -15614,7 +15589,6 @@ | CHECKSUM_SYM | CHECKPOINT_SYM | COLUMN_ADD_SYM - | COLUMN_CHECK_SYM | COLUMN_CREATE_SYM | COLUMN_DELETE_SYM | COLUMN_GET_SYM @@ -15626,7 +15600,6 @@ | EXECUTE_SYM | FLUSH_SYM | FOLLOWING_SYM - | FORMAT_SYM | GET_SYM | HELP_SYM | HOST_SYM @@ -15780,21 +15753,15 @@ ; -/* - These keywords are fine for both SP variable names and SP labels. -*/ -keyword_sp_var_and_label: - ACTION +keyword_func_sp_var_and_label: + ACTION | ACCOUNT_SYM - | ADDDATE_SYM - | ADD_MONTHS_SYM | ADMIN_SYM | AFTER_SYM | AGAINST | AGGREGATE_SYM | ALGORITHM_SYM | ALWAYS_SYM - | ANY_SYM | AT_SYM | ATOMIC_SYM | AUTHORS_SYM @@ -15802,7 +15769,6 @@ | AUTOEXTEND_SIZE_SYM | AUTO_SYM | AVG_ROW_LENGTH - | AVG_SYM | BLOCK_SYM | BODY_MARIADB_SYM | BTREE_SYM @@ -15815,7 +15781,6 @@ | CLIENT_SYM | CLASS_ORIGIN_SYM | COALESCE - | CODE_SYM | COLLATION_SYM | COLUMN_NAME_SYM | COLUMNS @@ -15841,16 +15806,15 @@ | CURSOR_NAME_SYM | CYCLE_SYM | DATA_SYM + | DATABASE | DATAFILE_SYM - | DATE_FORMAT_SYM - | DAY_SYM | DEFINER_SYM | DELAY_KEY_WRITE_SYM | DES_KEY_FILE | DIAGNOSTICS_SYM + | DISCARD | DIRECTORY_SYM | DISABLE_SYM - | DISCARD | DISK_SYM | DUMPFILE | DUPLICATE_SYM @@ -15858,6 +15822,11 @@ | ELSEIF_ORACLE_SYM | ELSIF_MARIADB_SYM | EMPTY_SYM + | EXPIRE_SYM + | EXPORT_SYM + | EXTENDED_SYM + | EXTENT_SIZE_SYM + | ENABLE_SYM | ENDS_SYM | ENGINE_SYM | ENGINES_SYM @@ -15870,29 +15839,21 @@ | EXCEPTION_MARIADB_SYM | EXCHANGE_SYM | EXPANSION_SYM - | EXPIRE_SYM - | EXPORT_SYM - | EXTENDED_SYM - | EXTENT_SIZE_SYM | FAULTS_SYM | FAST_SYM - | FOUND_SYM - | ENABLE_SYM | FEDERATED_SYM - | FULL | FILE_SYM | FIRST_SYM + | FOUND_SYM + | FULL | GENERAL | GENERATED_SYM - | GET_FORMAT | GRANTS | GOTO_MARIADB_SYM | HASH_SYM | HARD_SYM | HISTORY_SYM | HOSTS_SYM - | HOUR_SYM - | ID_SYM | IDENTIFIED_SYM | IGNORE_SERVER_IDS_SYM | INCREMENT_SYM @@ -15910,9 +15871,7 @@ | INVISIBLE_SYM | JSON_TABLE_SYM | KEY_BLOCK_SIZE - | LAST_VALUE | LAST_SYM - | LASTVAL_SYM | LEAVES | LESS_SYM | LEVEL_SYM @@ -15954,7 +15913,6 @@ | MESSAGE_TEXT_SYM | MICROSECOND_SYM | MIGRATE_SYM - | MINUTE_SYM %ifdef MARIADB | MINUS_ORACLE_SYM %endif @@ -15963,7 +15921,6 @@ | MODIFY_SYM | MODE_SYM | MONITOR_SYM - | MONTH_SYM | MUTEX_SYM | MYSQL_SYM | MYSQL_ERRNO_SYM @@ -15971,8 +15928,6 @@ | NESTED_SYM | NEVER_SYM | NEXT_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 - | NEXTVAL_SYM - | NEW_SYM | NOCACHE_SYM | NOCYCLE_SYM | NOMINVALUE_SYM @@ -15988,7 +15943,6 @@ | ONLINE_SYM | ONLY_SYM | ORDINALITY_SYM - | OVERLAPS_SYM | PACKAGE_MARIADB_SYM | PACK_KEYS_SYM | PAGE_SYM @@ -16020,10 +15974,10 @@ | REDOFILE_SYM | REDUNDANT_SYM | RELAY - | RELAYLOG_SYM | RELAY_LOG_FILE_SYM | RELAY_LOG_POS_SYM | RELAY_THREAD + | RELAYLOG_SYM | RELOAD | REORGANIZE_SYM | REPEATABLE_SYM @@ -16038,20 +15992,15 @@ | REVERSE_SYM | ROLLUP_SYM | ROUTINE_SYM + | ROW_COUNT_SYM | ROWCOUNT_SYM | ROWTYPE_MARIADB_SYM - | ROW_COUNT_SYM | ROW_FORMAT_SYM -%ifdef MARIADB - | ROWNUM_SYM -%endif | RTREE_SYM | SCHEDULE_SYM | SCHEMA_NAME_SYM - | SECOND_SYM | SEQUENCE_SYM | SERIALIZABLE_SYM - | SETVAL_SYM | SIMPLE_SYM | SHARE_SYM | SKIP_SYM @@ -16059,7 +16008,6 @@ | SLOW | SNAPSHOT_SYM | SOFT_SYM - | SOUNDS_SYM | SOURCE_SYM | SQL_CACHE_SYM | SQL_BUFFER_RESULT @@ -16072,7 +16020,6 @@ | STORAGE_SYM | STRING_SYM | SUBCLASS_ORIGIN_SYM - | SUBDATE_SYM | SUBJECT_SYM | SUBPARTITION_SYM | SUBPARTITIONS_SYM @@ -16080,9 +16027,6 @@ | SUSPEND_SYM | SWAPS_SYM | SWITCHES_SYM -%ifdef MARIADB - | SYSDATE -%endif | SYSTEM | SYSTEM_TIME_SYM | TABLE_NAME_SYM @@ -16096,10 +16040,6 @@ | TRANSACTIONAL_SYM | THREADS_SYM | TRIGGERS_SYM - | TRIM_ORACLE - | TIMESTAMP_ADD - | TIMESTAMP_DIFF - | TYPES_SYM | TYPE_SYM | UDF_RETURNS_SYM | UNCOMMITTED_SYM @@ -16108,23 +16048,61 @@ | UNDOFILE_SYM | UNKNOWN_SYM | UNTIL_SYM - | USER_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 | USE_FRM | VARIABLES | VERSIONING_SYM | VIEW_SYM | VIRTUAL_SYM | VISIBLE_SYM - | VALUE_SYM | WARNINGS | WAIT_SYM - | WEEK_SYM - | WEIGHT_STRING_SYM | WITHOUT | WORK_SYM | X509_SYM | XML_SYM | VIA_SYM + | WEEK_SYM + ; + +keyword_func_sp_var_not_label: + FORMAT_SYM + | COLUMN_CHECK_SYM + ; +/* + These keywords are fine for both SP variable names and SP labels. +*/ +keyword_sp_var_and_label: + keyword_func_sp_var_and_label + | ADDDATE_SYM + | ANY_SYM + | AVG_SYM + | CODE_SYM + | DAY_SYM + | GET_FORMAT + | HOUR_SYM + | ID_SYM + | LAST_VALUE + | LASTVAL_SYM + | MINUTE_SYM + | MONTH_SYM + | NEXTVAL_SYM + | OVERLAPS_SYM +%ifdef MARIADB + | ROWNUM_SYM +%endif + | SECOND_SYM + | SETVAL_SYM + | SOUNDS_SYM + | SUBDATE_SYM +%ifdef MARIADB + | SYSDATE +%endif + | TRIM_ORACLE + | TIMESTAMP_ADD + | TIMESTAMP_DIFF + | USER_SYM %prec PREC_BELOW_CONTRACTION_TOKEN2 + | VALUE_SYM + | WEIGHT_STRING_SYM ; @@ -16165,7 +16143,6 @@ | CURRENT_USER | CURRENT_ROLE | CURTIME - | DATABASE | DATABASES | DATE_ADD_INTERVAL | DATE_SUB_INTERVAL @@ -16694,18 +16671,15 @@ } | NAMES_SYM charset_name_or_default { - CHARSET_INFO *def= global_system_variables.character_set_client; - Lex_exact_charset_opt_extended_collate tmp($2 ? $2 : def, false); - if (Lex->set_names($1.pos(), tmp, yychar == YYEMPTY)) + if (Lex->set_names($1.pos(), $2, + Lex_extended_collation_st::collate_default(), + yychar == YYEMPTY)) MYSQL_YYABORT; } | NAMES_SYM charset_name_or_default COLLATE_SYM collation_name_or_default { - CHARSET_INFO *def= global_system_variables.character_set_client; - Lex_exact_charset_opt_extended_collate tmp($2 ? $2 : def, false); - if (tmp.merge_collation($4) || - Lex->set_names($1.pos(), tmp, yychar == YYEMPTY)) + if (Lex->set_names($1.pos(), $2, $4, yychar == YYEMPTY)) MYSQL_YYABORT; } | DEFAULT ROLE_SYM grant_role diff -Nru mariadb-10.11.6/sql/structs.h mariadb-10.11.9/sql/structs.h --- mariadb-10.11.6/sql/structs.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/structs.h 2024-08-03 07:29:59.000000000 +0000 @@ -34,6 +34,7 @@ class Type_handler; class Field; class Index_statistics; +struct Lex_ident_cli_st; class THD; @@ -902,12 +903,6 @@ } Item *make_item_func_trim_std(THD *thd) const; Item *make_item_func_trim_oracle(THD *thd) const; - /* - This method is still used to handle LTRIM and RTRIM, - while the special syntax TRIM(... BOTH|LEADING|TRAILING) - is now handled by Schema::make_item_func_trim(). - */ - Item *make_item_func_trim(THD *thd) const; }; diff -Nru mariadb-10.11.6/sql/sys_vars.cc mariadb-10.11.9/sql/sys_vars.cc --- mariadb-10.11.6/sql/sys_vars.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sys_vars.cc 2024-08-03 07:29:59.000000000 +0000 @@ -824,7 +824,7 @@ READ_ONLY GLOBAL_VAR(system_charset_info), NO_CMD_LINE, offsetof(CHARSET_INFO, cs_name.str), DEFAULT(0)); -static Sys_var_struct Sys_character_set_server( +static Sys_var_charset Sys_character_set_server( "character_set_server", "The default character set", SESSION_VAR(collation_server), NO_CMD_LINE, offsetof(CHARSET_INFO, cs_name.str), DEFAULT(&default_charset_info), @@ -838,7 +838,7 @@ var->save_result.ptr= thd->db_charset; return false; } -static Sys_var_struct Sys_character_set_database( +static Sys_var_charset Sys_character_set_database( "character_set_database", "The character set used by the default database", SESSION_VAR(collation_database), NO_CMD_LINE, @@ -862,7 +862,8 @@ thd->update_charset(); return false; } -static Sys_var_struct Sys_character_set_client( + +static Sys_var_charset Sys_character_set_client( "character_set_client", "The character set for statements " "that arrive from the client", NO_SET_STMT SESSION_VAR(character_set_client), NO_CMD_LINE, @@ -872,7 +873,7 @@ // for check changing export sys_var *Sys_character_set_client_ptr= &Sys_character_set_client; -static Sys_var_struct Sys_character_set_connection( +static Sys_var_charset Sys_character_set_connection( "character_set_connection", "The character set used for " "literals that do not have a character set introducer and for " "number-to-string conversion", @@ -883,7 +884,7 @@ // for check changing export sys_var *Sys_character_set_connection_ptr= &Sys_character_set_connection; -static Sys_var_struct Sys_character_set_results( +static Sys_var_charset Sys_character_set_results( "character_set_results", "The character set used for returning " "query results to the client", SESSION_VAR(character_set_results), NO_CMD_LINE, @@ -1037,11 +1038,10 @@ static Sys_var_dbug Sys_dbug( "debug", "Built-in DBUG debugger", sys_var::SESSION, CMD_LINE(OPT_ARG, '#'), DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG, - ON_CHECK(check_has_super), ON_UPDATE(0), - DEPRECATED("'@@debug_dbug'")); // since 5.5.37 + ON_CHECK(check_has_super)); static Sys_var_dbug Sys_debug_dbug( - "debug_dbug", "Built-in DBUG debugger", sys_var::SESSION, + "debug_dbug", "Built-in DBUG debugger. Alias for --debug", sys_var::SESSION, CMD_LINE(OPT_ARG, '#'), DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_has_super)); #endif @@ -1538,7 +1538,7 @@ static Sys_var_ulong Sys_log_warnings( "log_warnings", - "Log some not critical warnings to the general log file." + "Log some non critical warnings to the error log." "Value can be between 0 and 11. Higher values mean more verbosity", SESSION_VAR(log_warnings), CMD_LINE(OPT_ARG, 'W'), @@ -2938,6 +2938,33 @@ SESSION_VAR(optimizer_trace_max_mem_size), CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, ULONG_MAX), DEFAULT(1024 * 1024), BLOCK_SIZE(1)); + +/* + Symbolic names for OPTIMIZER_ADJ_* flags in sql_priv.h +*/ +static const char *adjust_secondary_key_cost[]= +{ + "adjust_secondary_key_cost", "disable_max_seek", "disable_forced_index_in_group_by", "fix_innodb_cardinality",0 +}; + + +static Sys_var_set Sys_optimizer_adjust_secondary_key_costs( + "optimizer_adjust_secondary_key_costs", + "A bit field with the following values: " + "adjust_secondary_key_cost = Update secondary key costs for ranges to be " + "at least 5x of clustered primary key costs. " + "disable_max_seek = Disable 'max_seek optimization' for secondary keys and " + "slight adjustment of filter cost. " + "disable_forced_index_in_group_by = Disable automatic forced index in " + "GROUP BY. " + "fix_innodb_cardinality = Disable doubling of the Cardinality for InnoDB " + "secondary keys. " + "This variable will be deleted in MariaDB 11.0 as it is not needed with the " + "new 11.0 optimizer.", + SESSION_VAR(optimizer_adjust_secondary_key_costs), CMD_LINE(REQUIRED_ARG), + adjust_secondary_key_cost, DEFAULT(0)); + + static Sys_var_charptr_fscs Sys_pid_file( "pid_file", "Pid file used by safe_mysqld", READ_ONLY GLOBAL_VAR(pidfile_name_ptr), CMD_LINE(REQUIRED_ARG), @@ -2957,7 +2984,7 @@ #endif "built-in default (" STRINGIFY_ARG(MYSQL_PORT) "), whatever comes first", READ_ONLY GLOBAL_VAR(mysqld_port), CMD_LINE(REQUIRED_ARG, 'P'), - VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1)); + VALID_RANGE(0, UINT_MAX16), DEFAULT(0), BLOCK_SIZE(1)); static Sys_var_ulong Sys_preload_buff_size( "preload_buffer_size", @@ -3348,8 +3375,9 @@ "secure_auth", "Disallow authentication for accounts that have old (pre-4.1) " "passwords", - GLOBAL_VAR(opt_secure_auth), CMD_LINE(OPT_ARG), - DEFAULT(TRUE)); + GLOBAL_VAR(opt_secure_auth), CMD_LINE(OPT_ARG, OPT_SECURE_AUTH), + DEFAULT(TRUE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(0), + DEPRECATED("")); // since 10.6.17 static bool check_require_secure_transport(sys_var *self, THD *thd, set_var *var) { @@ -3433,6 +3461,14 @@ VALID_RANGE(1, UINT_MAX32), DEFAULT(1), BLOCK_SIZE(1), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_server_id), ON_UPDATE(fix_server_id)); +char *server_uid_ptr= &server_uid[0]; + +static Sys_var_charptr Sys_server_uid( + "server_uid", "Automatically calculated server unique id hash", + READ_ONLY GLOBAL_VAR(server_uid_ptr), + CMD_LINE_HELP_ONLY, + DEFAULT(server_uid)); + static Sys_var_on_access_global Sys_slave_compressed_protocol( @@ -3599,13 +3635,6 @@ return false; } -static bool fix_rpl_semi_sync_master_wait_no_slave(sys_var *self, THD *thd, - enum_var_type type) -{ - repl_semisync_master.check_and_switch(); - return false; -} - static Sys_var_on_access_global Sys_semisync_master_enabled( @@ -3632,12 +3661,11 @@ PRIV_SET_SYSTEM_GLOBAL_VAR_RPL_SEMI_SYNC_MASTER_WAIT_NO_SLAVE> Sys_semisync_master_wait_no_slave( "rpl_semi_sync_master_wait_no_slave", - "Wait until timeout when no semi-synchronous replication slave " - "available (enabled by default).", + "Wait until timeout when no semi-synchronous replication slave is " + "available.", GLOBAL_VAR(rpl_semi_sync_master_wait_no_slave), CMD_LINE(OPT_ARG), DEFAULT(TRUE), - NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), - ON_UPDATE(fix_rpl_semi_sync_master_wait_no_slave)); + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0)); static Sys_var_on_access_global @@ -3664,13 +3692,6 @@ NO_MUTEX_GUARD, NOT_IN_BINLOG,ON_CHECK(0), ON_UPDATE(fix_rpl_semi_sync_master_wait_point)); -static bool fix_rpl_semi_sync_slave_enabled(sys_var *self, THD *thd, - enum_var_type type) -{ - repl_semisync_slave.set_slave_enabled(rpl_semi_sync_slave_enabled != 0); - return false; -} - static bool fix_rpl_semi_sync_slave_trace_level(sys_var *self, THD *thd, enum_var_type type) { @@ -3698,10 +3719,9 @@ Sys_semisync_slave_enabled( "rpl_semi_sync_slave_enabled", "Enable semi-synchronous replication slave (disabled by default).", - GLOBAL_VAR(rpl_semi_sync_slave_enabled), + GLOBAL_VAR(global_rpl_semi_sync_slave_enabled), CMD_LINE(OPT_ARG), DEFAULT(FALSE), - NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), - ON_UPDATE(fix_rpl_semi_sync_slave_enabled)); + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0)); static Sys_var_on_access_global @@ -3887,6 +3907,7 @@ "UTF8_IS_UTF8MB3", "IGNORE_INDEX_ONLY_FOR_JOIN", "COMPAT_5_1_CHECKSUM", + "NO_NULL_COLLATION_IDS", 0 }; @@ -4823,7 +4844,7 @@ break; } char buf[1024]; - strxnmov(buf, sizeof(buf), "--secure-timestamp=", + strxnmov(buf, sizeof(buf)-1, "--secure-timestamp=", secure_timestamp_levels[opt_secure_timestamp], NULL); my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), buf); return true; @@ -5652,7 +5673,7 @@ */ ulonglong Sys_var_multi_source_ulonglong:: -get_master_info_ulonglong_value(THD *thd, ptrdiff_t offset) const +get_master_info_ulonglong_value(THD *thd) const { Master_info *mi; ulonglong res= 0; // Default value @@ -5660,7 +5681,7 @@ if ((mi= get_master_info(&thd->variables.default_master_connection, Sql_condition::WARN_LEVEL_WARN))) { - res= *((ulonglong*) (((uchar*) mi) + master_info_offset)); + res= (mi->*mi_accessor_func)(); mi->release(); } mysql_mutex_lock(&LOCK_global_system_variables); @@ -5730,7 +5751,7 @@ static Sys_var_multi_source_ulonglong Sys_slave_skip_counter( "sql_slave_skip_counter", "Skip the next N events from the master log", SESSION_VAR(slave_skip_counter), NO_CMD_LINE, - MASTER_INFO_VAR(rli.slave_skip_counter), + &Master_info::get_slave_skip_counter, VALID_RANGE(0, UINT_MAX), DEFAULT(0), BLOCK_SIZE(1), ON_UPDATE(update_slave_skip_counter)); @@ -5746,7 +5767,7 @@ "relay log will be rotated automatically when the size exceeds this " "value. If 0 at startup, it's set to max_binlog_size", SESSION_VAR(max_relay_log_size), CMD_LINE(REQUIRED_ARG), - MASTER_INFO_VAR(rli.max_relay_log_size), + &Master_info::get_max_relay_log_size, VALID_RANGE(0, 1024L*1024*1024), DEFAULT(0), BLOCK_SIZE(IO_SIZE), ON_UPDATE(update_max_relay_log_size)); @@ -6472,7 +6493,7 @@ "Extra port number to use for tcp connections in a " "one-thread-per-connection manner. 0 means don't use another port", READ_ONLY GLOBAL_VAR(mysqld_extra_port), CMD_LINE(REQUIRED_ARG), - VALID_RANGE(0, UINT_MAX32), DEFAULT(0), BLOCK_SIZE(1)); + VALID_RANGE(0, UINT_MAX16), DEFAULT(0), BLOCK_SIZE(1)); static Sys_var_on_access_global @@ -6509,7 +6530,8 @@ static Sys_var_set Sys_log_slow_filter( "log_slow_filter", "Log only certain types of queries to the slow log. If variable empty all kind of queries are logged. All types are bound by slow_query_time, except 'not_using_index' which is always logged if enabled", - SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG), + SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG, + OPT_LOG_SLOW_FILTER), log_slow_filter_names, /* by default we log all queries except 'not_using_index' */ DEFAULT(my_set_bits(array_elements(log_slow_filter_names)-1) & diff -Nru mariadb-10.11.6/sql/sys_vars.inl mariadb-10.11.9/sql/sys_vars.inl --- mariadb-10.11.6/sql/sys_vars.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sys_vars.inl 2024-08-03 07:29:59.000000000 +0000 @@ -198,7 +198,7 @@ SYSVAR_ASSERT(block_size > 0); SYSVAR_ASSERT(def_val % block_size == 0); } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { my_bool fixed= FALSE, unused; longlong v= var->value->val_int(); @@ -245,23 +245,23 @@ return throw_bounds_warning(thd, name.str, fixed, var->value->unsigned_flag, v); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, T)= static_cast(var->save_result.ulonglong_value); return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(T)= static_cast(var->save_result.ulonglong_value); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= (ulonglong)*(T*)global_value_ptr(thd, 0); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= option.def_value; } private: T get_max_var() { return *((T*) max_var_ptr()); } - const uchar *default_value_ptr(THD *thd) const { return (uchar*) &option.def_value; } + const uchar *default_value_ptr(THD *thd) const override { return (uchar*) &option.def_value; } }; typedef Sys_var_integer Sys_var_int; @@ -327,7 +327,7 @@ typelib.type_lengths= 0; // only used by Fields_enum and Field_set option.typelib= &typelib; } - bool do_check(THD *thd, set_var *var) // works for enums and my_bool + bool do_check(THD *thd, set_var *var) override // works for enums and my_bool { char buff[STRING_BUFFER_USUAL_SIZE]; String str(buff, sizeof(buff), system_charset_info), *res; @@ -395,7 +395,7 @@ SYSVAR_ASSERT(size == sizeof(ulong)); } bool check_maximum(THD *thd, set_var *var, - const char *c_val, longlong i_val) + const char *c_val, longlong i_val) override { if (!max_var_ptr() || var->save_result.ulonglong_value <= get_max_var()) @@ -406,27 +406,27 @@ throw_bounds_warning(thd, name.str, TRUE, var->value->unsigned_flag, i_val); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, ulong)= static_cast(var->save_result.ulonglong_value); return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(ulong)= static_cast(var->save_result.ulonglong_value); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= global_var(ulong); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= option.def_value; } const uchar *valptr(THD *thd, ulong val) const { return reinterpret_cast(typelib.type_names[val]); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, session_var(thd, ulong)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(ulong)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return valptr(thd, (ulong)option.def_value); } ulong get_max_var() { return *((ulong *) max_var_ptr()); } @@ -460,21 +460,21 @@ SYSVAR_ASSERT(getopt.arg_type == OPT_ARG || getopt.id < 0); SYSVAR_ASSERT(size == sizeof(my_bool)); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, my_bool)= var->save_result.ulonglong_value != 0; return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(my_bool)= var->save_result.ulonglong_value != 0; return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= (ulonglong)*(my_bool *)global_value_ptr(thd, 0); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= option.def_value; } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { thd->sys_var_tmp.my_bool_value=(my_bool) option.def_value; return (uchar*) &thd->sys_var_tmp.my_bool_value; @@ -518,7 +518,7 @@ option.var_type|= (flags & ALLOCATED) ? GET_STR_ALLOC : GET_STR; global_var(const char*)= def_val; } - void cleanup() + void cleanup() override { if (flags & ALLOCATED) { @@ -556,9 +556,9 @@ return false; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { return do_string_check(thd, var, charset(thd)); } - bool session_update(THD *thd, set_var *var)= 0; + bool session_update(THD *thd, set_var *var) override= 0; char *global_update_prepare(THD *thd, set_var *var) { char *new_val, *ptr= var->save_result.string_value.str; @@ -581,14 +581,14 @@ flags|= ALLOCATED; global_var(char*)= new_val; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { char *new_val= global_update_prepare(thd, var); global_update_finish(new_val); return (new_val == 0 && var->save_result.string_value.str != 0); } - void session_save_default(THD *thd, set_var *var)= 0; - void global_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override= 0; + void global_save_default(THD *thd, set_var *var) override { char *ptr= (char*)(intptr)option.def_value; var->save_result.string_value.str= ptr; @@ -615,12 +615,12 @@ SYSVAR_ASSERT(size == sizeof(char *)); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); } }; @@ -649,7 +649,7 @@ getopt, def_val, lock, VARIABLE_NOT_IN_BINLOG, 0, 0, 0) {} - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { if (Sys_var_charptr_base::do_check(thd, var) || sysvartrack_validate_value(thd, var->save_result.string_value.str, @@ -657,7 +657,7 @@ return TRUE; return FALSE; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { char *new_val= global_update_prepare(thd, var); if (new_val) @@ -673,9 +673,9 @@ global_update_finish(new_val); return (new_val == 0 && var->save_result.string_value.str != 0); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { return thd->session_tracker.sysvars.update(thd, var); } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.string_value.str= global_var(char*); var->save_result.string_value.length= @@ -707,27 +707,27 @@ { option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); } protected: - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return thd->security_ctx->proxy_user[0] ? (uchar *) &(thd->security_ctx->proxy_user[0]) : NULL; @@ -742,7 +742,7 @@ {} protected: - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return (uchar*)thd->security_ctx->external_user; } @@ -827,7 +827,7 @@ SYSVAR_ASSERT(size == sizeof(LEX_CSTRING)); *const_cast(&show_val_type)= SHOW_LEX_STRING; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { if (Sys_var_charptr::global_update(thd, var)) return true; @@ -861,7 +861,7 @@ SYSVAR_ASSERT(scope() == ONLY_SESSION) *const_cast(&show_val_type)= SHOW_LEX_STRING; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { char buff[STRING_BUFFER_USUAL_SIZE]; String str(buff, sizeof(buff), system_charset_info), *res; @@ -885,7 +885,7 @@ } return false; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { LEX_CSTRING *tmp= &session_var(thd, LEX_CSTRING); tmp->length= var->save_result.string_value.length; @@ -893,22 +893,22 @@ strmake((char*) tmp->str, var->save_result.string_value.str, tmp->length); return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { char *ptr= (char*)(intptr)option.def_value; var->save_result.string_value.str= ptr; var->save_result.string_value.length= strlen(ptr); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(FALSE); return NULL; @@ -945,25 +945,14 @@ lock, binlog_status_arg, on_check_func, on_update_func, substitute) { option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { - char buff[STRING_BUFFER_USUAL_SIZE]; - String str(buff, sizeof(buff), system_charset_info), *res; - - if (!(res=var->value->val_str(&str))) - { + bool rc= Sys_var_charptr::do_string_check(thd, var, charset(thd)); + if (var->save_result.string_value.str == nullptr) var->save_result.string_value.str= const_cast(""); - var->save_result.string_value.length= 0; - } - else - { - size_t len= res->length(); - var->save_result.string_value.str= thd->strmake(res->ptr(), len); - var->save_result.string_value.length= len; - } - return false; + return rc; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { const char *val= var->save_result.string_value.str; if (!var->value) @@ -972,33 +961,33 @@ DBUG_SET(val); return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { const char *val= var->save_result.string_value.str; DBUG_SET_INITIAL(val); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { char *ptr= (char*)(intptr)option.def_value; var->save_result.string_value.str= ptr; var->save_result.string_value.length= safe_strlen(ptr); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { char buf[256]; DBUG_EXPLAIN(buf, sizeof(buf)); return (uchar*) thd->strdup(buf); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { char buf[256]; DBUG_EXPLAIN_INITIAL(buf, sizeof(buf)); return (uchar*) thd->strdup(buf); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return (uchar*)""; } }; #endif @@ -1044,7 +1033,7 @@ offset= global_var_ptr() - (uchar*)dflt_key_cache; SYSVAR_ASSERT(scope() == GLOBAL); } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { ulonglong new_value= var->save_result.ulonglong_value; LEX_CSTRING *base_name= &var->base; @@ -1074,7 +1063,7 @@ return keycache_update(thd, key_cache, offset, new_value); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { KEY_CACHE *key_cache= get_key_cache(base); if (!key_cache) @@ -1208,7 +1197,7 @@ SYSVAR_ASSERT(max_val >= def_val); SYSVAR_ASSERT(size == sizeof(double)); } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { my_bool fixed; double v= var->value->val_real(); @@ -1216,19 +1205,19 @@ return throw_bounds_warning(thd, name.str, fixed, v); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, double)= var->save_result.double_value; return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(double)= var->save_result.double_value; return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.double_value= global_var(double); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.double_value= getopt_ulonglong2double(option.def_value); } }; @@ -1259,7 +1248,7 @@ lock, binlog_status_arg, on_check_func, on_update_func, substitute) { } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { if (thd->user_connect && thd->user_connect->user_resources.user_conn) return (uchar*) &(thd->user_connect->user_resources.user_conn); @@ -1305,7 +1294,7 @@ SYSVAR_ASSERT(strcmp(values[typelib.count-1], "default") == 0); SYSVAR_ASSERT(size == sizeof(ulonglong)); } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { char buff[STRING_BUFFER_USUAL_SIZE]; String str(buff, sizeof(buff), system_charset_info), *res; @@ -1357,27 +1346,27 @@ return false; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, ulonglong)= var->save_result.ulonglong_value; return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(ulonglong)= var->save_result.ulonglong_value; return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= global_var(ulonglong); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= option.def_value; } const uchar *valptr(THD *thd, ulonglong val) const { return (uchar*)flagset_to_string(thd, 0, val, typelib.type_names); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, session_var(thd, ulonglong)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(ulonglong)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return valptr(thd, option.def_value); } }; @@ -1424,7 +1413,7 @@ SYSVAR_ASSERT(size == sizeof(ulonglong)); } bool check_maximum(THD *thd, set_var *var, - const char *c_val, longlong i_val) + const char *c_val, longlong i_val) override { if (!max_var_ptr() || (var->save_result.ulonglong_value & ~(get_max_var())) == 0) @@ -1435,7 +1424,7 @@ throw_bounds_warning(thd, name.str, TRUE, var->value->unsigned_flag, i_val); } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { char buff[STRING_BUFFER_USUAL_SIZE]; String str(buff, sizeof(buff), system_charset_info), *res; @@ -1481,27 +1470,27 @@ var->save_result.ulonglong_value= tmp; return check_maximum(thd, var, 0, tmp); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, ulonglong)= var->save_result.ulonglong_value; return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(ulonglong)= var->save_result.ulonglong_value; return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= global_var(ulonglong); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= option.def_value; } const uchar *valptr(THD *thd, ulonglong val) const { return reinterpret_cast(set_to_string(thd, 0, val, typelib.type_names)); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, session_var(thd, ulonglong)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(ulonglong)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return valptr(thd, option.def_value); } ulonglong get_max_var() { return *((ulonglong*) max_var_ptr()); } @@ -1542,7 +1531,7 @@ SYSVAR_ASSERT(size == sizeof(plugin_ref)); SYSVAR_ASSERT(getopt.id < 0); // force NO_CMD_LINE } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { char buff[STRING_BUFFER_USUAL_SIZE]; String str(buff,sizeof(buff), system_charset_info), *res; @@ -1581,19 +1570,19 @@ plugin_unlock(NULL, oldval); } } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { do_update((plugin_ref*)session_var_ptr(thd), var->save_result.plugin); return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { do_update((plugin_ref*)global_var_ptr(), var->save_result.plugin); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { plugin_ref plugin= global_var(plugin_ref); var->save_result.plugin= plugin ? my_plugin_lock(thd, plugin) : 0; @@ -1615,7 +1604,7 @@ return my_plugin_lock(thd, plugin); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.plugin= get_default(thd); } @@ -1625,11 +1614,11 @@ return (uchar*)(plugin ? thd->strmake(plugin_name(plugin)->str, plugin_name(plugin)->length) : 0); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, session_var(thd, plugin_ref)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(plugin_ref)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return valptr(thd, get_default(thd)); } }; @@ -1678,7 +1667,7 @@ SYSVAR_ASSERT(size == sizeof(plugin_ref)); SYSVAR_ASSERT(getopt.id < 0); // force NO_CMD_LINE } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { char buff[STRING_BUFFER_USUAL_SIZE]; String str(buff,sizeof(buff), system_charset_info), *res; @@ -1699,19 +1688,19 @@ *valptr= copy_engine_list(newval); free_engine_list(oldval); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { do_update((plugin_ref**)session_var_ptr(thd), var->save_result.plugins); return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { do_update((plugin_ref**)global_var_ptr(), var->save_result.plugins); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { plugin_ref* plugins= global_var(plugin_ref *); var->save_result.plugins= plugins ? temp_copy_engine_list(thd, plugins) : 0; @@ -1725,7 +1714,7 @@ false, true); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.plugins= get_default(thd); } @@ -1734,11 +1723,11 @@ { return reinterpret_cast(pretty_print_engine_list(thd, plugins)); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, session_var(thd, plugin_ref*)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(plugin_ref*)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return valptr(thd, get_default(thd)); } }; @@ -1768,7 +1757,7 @@ SYSVAR_ASSERT(scope() == ONLY_SESSION); option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { char buff[STRING_BUFFER_USUAL_SIZE]; String str(buff, sizeof(buff), system_charset_info), *res; @@ -1783,35 +1772,35 @@ } return false; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { return debug_sync_update(thd, var->save_result.string_value.str, var->save_result.string_value.length); } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.string_value.str= const_cast(""); var->save_result.string_value.length= 0; } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return debug_sync_value_ptr(thd); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(FALSE); return 0; } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return (uchar*)""; } }; #endif /* defined(ENABLED_DEBUG_SYNC) */ @@ -1869,22 +1858,22 @@ SYSVAR_ASSERT(def_val < 2); SYSVAR_ASSERT(size == sizeof(ulonglong)); } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { set(session_var_ptr(thd), var->save_result.ulonglong_value); return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { set(global_var_ptr(), var->save_result.ulonglong_value); return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= (reverse_semantics == !(global_var(ulonglong) & bitmask)); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.ulonglong_value= option.def_value; } uchar *valptr(THD *thd, ulonglong val) const @@ -1892,11 +1881,11 @@ thd->sys_var_tmp.my_bool_value= (reverse_semantics == !(val & bitmask)); return (uchar*) &thd->sys_var_tmp.my_bool_value; } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, session_var(thd, ulonglong)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(ulonglong)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { thd->sys_var_tmp.my_bool_value= option.def_value != 0; return (uchar*) &thd->sys_var_tmp.my_bool_value; @@ -1944,28 +1933,28 @@ SYSVAR_ASSERT(scope() == ONLY_SESSION); SYSVAR_ASSERT(getopt.id < 0); // NO_CMD_LINE, because the offset is fake } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { return update_func(thd, var); } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->value= 0; } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { thd->sys_var_tmp.ulonglong_value= read_func(thd); return (uchar*) &thd->sys_var_tmp.ulonglong_value; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(FALSE); return 0; } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { thd->sys_var_tmp.ulonglong_value= 0; return (uchar*) &thd->sys_var_tmp.ulonglong_value; @@ -1997,7 +1986,7 @@ SYSVAR_ASSERT(scope() == ONLY_SESSION); SYSVAR_ASSERT(getopt.id < 0); // NO_CMD_LINE, because the offset is fake } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { if (var->value) { @@ -2008,36 +1997,36 @@ thd->user_time.val= 0; return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - bool session_is_default(THD *thd) + bool session_is_default(THD *thd) override { return thd->user_time.val == 0; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->value= 0; } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { thd->sys_var_tmp.double_value= thd->start_time + thd->start_time_sec_part/(double)TIME_SECOND_PART_FACTOR; return (uchar*) &thd->sys_var_tmp.double_value; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(FALSE); return 0; } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { thd->sys_var_tmp.double_value= 0; return (uchar*) &thd->sys_var_tmp.double_value; } - bool on_check_access_session(THD *thd) const; + bool on_check_access_session(THD *thd) const override; }; @@ -2076,28 +2065,28 @@ SYSVAR_ASSERT(size == sizeof(enum SHOW_COMP_OPTION)); option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) { + bool do_check(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(FALSE); return true; } - void session_save_default(THD *thd, set_var *var) { } - void global_save_default(THD *thd, set_var *var) { } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + void session_save_default(THD *thd, set_var *var) override { } + void global_save_default(THD *thd, set_var *var) override { } + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(FALSE); return 0; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return (uchar*)show_comp_option_name[global_var(enum SHOW_COMP_OPTION)]; } @@ -2148,35 +2137,60 @@ SYSVAR_ASSERT(getopt.id < 0); SYSVAR_ASSERT(size == sizeof(void *)); } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { return false; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, const void*)= var->save_result.ptr; return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(const void*)= var->save_result.ptr; return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.ptr= global_var(void*); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { void **default_value= reinterpret_cast(option.def_value); var->save_result.ptr= *default_value; } uchar *valptr(THD *thd, uchar *val) const { return val ? *(uchar**)(val+name_offset) : 0; } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, session_var(thd, uchar*)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(uchar*)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return valptr(thd, *(uchar**)option.def_value); } }; + +/** + The class to store character sets. +*/ +class Sys_var_charset: public Sys_var_struct +{ +public: + using Sys_var_struct::Sys_var_struct; + void global_save_default(THD *, set_var *var) override + { + /* + The default value can point to an arbitrary collation, + e.g. default_charset_info. + Let's convert it to the compiled default collation. + This makes the code easier in various places such as SET NAMES. + */ + void **default_value= reinterpret_cast(option.def_value); + var->save_result.ptr= + Lex_exact_charset_opt_extended_collate((CHARSET_INFO *) *default_value, + true). + find_default_collation(); + } +}; + + /** The class for variables that store time zones @@ -2207,7 +2221,7 @@ SYSVAR_ASSERT(size == sizeof(Time_zone *)); option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { char buff[MAX_TIME_ZONE_NAME_LENGTH]; String str(buff, sizeof(buff), &my_charset_latin1); @@ -2224,28 +2238,28 @@ } return false; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { session_var(thd, Time_zone*)= var->save_result.time_zone; return false; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { global_var(Time_zone*)= var->save_result.time_zone; return false; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { var->save_result.time_zone= global_var(Time_zone*); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { var->save_result.time_zone= *(Time_zone**)(intptr)option.def_value; } const uchar *valptr(THD *thd, Time_zone *val) const { return reinterpret_cast(val->get_name()->ptr()); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { /* This is an ugly fix for replication: we don't replicate properly queries @@ -2258,9 +2272,9 @@ thd->used|= THD::TIME_ZONE_USED; return valptr(thd, session_var(thd, Time_zone *)); } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return valptr(thd, global_var(Time_zone*)); } - const uchar *default_value_ptr(THD *thd) const + const uchar *default_value_ptr(THD *thd) const override { return valptr(thd, *(Time_zone**)option.def_value); } }; @@ -2286,7 +2300,7 @@ :Sys_var_enum(name_arg, comment, flag_args, off, size, getopt, values, def_val, lock, binlog_status_arg, on_check_func) {} - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { if (var->type == OPT_SESSION && Sys_var_enum::session_update(thd, var)) return TRUE; @@ -2347,7 +2361,7 @@ :Sys_var_mybool(name_arg, comment, flag_args, off, size, getopt, def_val, lock, binlog_status_arg, on_check_func) {} - virtual bool session_update(THD *thd, set_var *var); + bool session_update(THD *thd, set_var *var) override; }; /* @@ -2366,7 +2380,7 @@ :Sys_var_enum(name_arg, comment, flag_args, off, size, getopt, values, def_val, lock, binlog_status_arg) {} - bool global_update(THD *thd, set_var *var); + bool global_update(THD *thd, set_var *var) override; }; /* @@ -2378,10 +2392,10 @@ like sql_slave_skip_counter are GLOBAL. */ -#define MASTER_INFO_VAR(X) my_offsetof(Master_info, X), sizeof(((Master_info *)0x10)->X) class Sys_var_multi_source_ulonglong; class Master_info; +typedef ulonglong (Master_info::*mi_ulonglong_accessor_function)(void); typedef bool (*on_multi_source_update_function)(sys_var *self, THD *thd, Master_info *mi); bool update_multi_source_variable(sys_var *self, @@ -2390,48 +2404,45 @@ class Sys_var_multi_source_ulonglong :public Sys_var_ulonglong { - ptrdiff_t master_info_offset; + mi_ulonglong_accessor_function mi_accessor_func; on_multi_source_update_function update_multi_source_variable_func; public: Sys_var_multi_source_ulonglong(const char *name_arg, const char *comment, int flag_args, ptrdiff_t off, size_t size, CMD_LINE getopt, - ptrdiff_t master_info_offset_arg, - size_t master_info_arg_size, + mi_ulonglong_accessor_function mi_accessor_arg, ulonglong min_val, ulonglong max_val, ulonglong def_val, uint block_size, on_multi_source_update_function on_update_func) :Sys_var_ulonglong(name_arg, comment, flag_args, off, size, getopt, min_val, max_val, def_val, block_size, 0, VARIABLE_NOT_IN_BINLOG, 0, update_multi_source_variable), - master_info_offset(master_info_offset_arg), + mi_accessor_func(mi_accessor_arg), update_multi_source_variable_func(on_update_func) - { - SYSVAR_ASSERT(master_info_arg_size == size); - } - bool global_update(THD *thd, set_var *var) + { } + bool global_update(THD *thd, set_var *var) override { return session_update(thd, var); } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { /* Use value given in variable declaration */ global_save_default(thd, var); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { ulonglong *tmp, res; tmp= (ulonglong*) (((uchar*)&(thd->variables)) + offset); - res= get_master_info_ulonglong_value(thd, master_info_offset); + res= get_master_info_ulonglong_value(thd); *tmp= res; return (uchar*) tmp; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return session_value_ptr(thd, base); } - ulonglong get_master_info_ulonglong_value(THD *thd, ptrdiff_t offset) const; + ulonglong get_master_info_ulonglong_value(THD *thd) const; bool update_variable(THD *thd, Master_info *mi) { return update_multi_source_variable_func(this, thd, mi); @@ -2456,35 +2467,35 @@ SYSVAR_ASSERT(is_readonly()); option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(false); return NULL; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override; }; @@ -2505,35 +2516,35 @@ SYSVAR_ASSERT(is_readonly()); option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(false); return NULL; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override; }; @@ -2552,31 +2563,31 @@ { option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var); - bool session_update(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override; + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool global_update(THD *thd, set_var *var); - void session_save_default(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override; + void session_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { /* Record the attempt to use default so we can error. */ var->value= 0; } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(false); return NULL; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; - const uchar *default_value_ptr(THD *thd) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override; + const uchar *default_value_ptr(THD *thd) const override { return 0; } - bool on_check_access_global(THD *thd) const + bool on_check_access_global(THD *thd) const override { return check_global_access(thd, PRIV_SET_SYSTEM_GLOBAL_VAR_GTID_SLAVE_POS); } @@ -2598,31 +2609,31 @@ { option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var); - bool session_update(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override; + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool global_update(THD *thd, set_var *var); - void session_save_default(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override; + void session_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { /* Record the attempt to use default so we can error. */ var->value= 0; } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(false); return NULL; } - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; - const uchar *default_value_ptr(THD *thd) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override; + const uchar *default_value_ptr(THD *thd) const override { return 0; } - bool on_check_access_global(THD *thd) const + bool on_check_access_global(THD *thd) const override { return check_global_access(thd, PRIV_SET_SYSTEM_GLOBAL_VAR_GTID_BINLOG_STATE); @@ -2646,31 +2657,31 @@ SYSVAR_ASSERT(is_readonly()); option.var_type|= GET_STR; } - bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { DBUG_ASSERT(false); return true; } - void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { DBUG_ASSERT(false); } - const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const; - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override; + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { DBUG_ASSERT(false); return NULL; @@ -2695,8 +2706,8 @@ option.value= (uchar**)1; // crash me, please SYSVAR_ASSERT(scope() == GLOBAL); } - bool global_update(THD *thd, set_var *var); - const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const; + bool global_update(THD *thd, set_var *var) override; + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override; }; @@ -2717,7 +2728,7 @@ { option.var_type= GET_STR; } - virtual bool do_check(THD *thd, set_var *var) + bool do_check(THD *thd, set_var *var) override { if (!var->value) return false; @@ -2756,26 +2767,26 @@ } public: - virtual bool global_update(THD *thd, set_var *var) + bool global_update(THD *thd, set_var *var) override { return update(thd, var, &global_var(vers_asof_timestamp_t)); } - virtual bool session_update(THD *thd, set_var *var) + bool session_update(THD *thd, set_var *var) override { return update(thd, var, &session_var(thd, vers_asof_timestamp_t)); } - virtual bool session_is_default(THD *thd) + bool session_is_default(THD *thd) override { const vers_asof_timestamp_t &var= session_var(thd, vers_asof_timestamp_t); return var.type == SYSTEM_TIME_UNSPECIFIED; } - virtual void session_save_default(THD *thd, set_var *var) + void session_save_default(THD *thd, set_var *var) override { save_default(var, &session_var(thd, vers_asof_timestamp_t)); } - virtual void global_save_default(THD *thd, set_var *var) + void global_save_default(THD *thd, set_var *var) override { save_default(var, &global_var(vers_asof_timestamp_t)); } @@ -2813,8 +2824,8 @@ } public: - virtual const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return value_ptr(thd, session_var(thd, vers_asof_timestamp_t)); } - virtual const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const + const uchar *global_value_ptr(THD *thd, const LEX_CSTRING *base) const override { return value_ptr(thd, global_var(vers_asof_timestamp_t)); } }; diff -Nru mariadb-10.11.6/sql/sys_vars_shared.h mariadb-10.11.9/sql/sys_vars_shared.h --- mariadb-10.11.6/sql/sys_vars_shared.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/sys_vars_shared.h 2024-08-03 07:29:59.000000000 +0000 @@ -52,9 +52,9 @@ mysql_mutex_t *mutex; public: PolyLock_mutex(mysql_mutex_t *arg): mutex(arg) {} - void rdlock() { mysql_mutex_lock(mutex); } - void wrlock() { mysql_mutex_lock(mutex); } - void unlock() { mysql_mutex_unlock(mutex); } + void rdlock() override { mysql_mutex_lock(mutex); } + void wrlock() override { mysql_mutex_lock(mutex); } + void unlock() override { mysql_mutex_unlock(mutex); } }; class PolyLock_rwlock: public PolyLock @@ -62,9 +62,9 @@ mysql_rwlock_t *rwlock; public: PolyLock_rwlock(mysql_rwlock_t *arg): rwlock(arg) {} - void rdlock() { mysql_rwlock_rdlock(rwlock); } - void wrlock() { mysql_rwlock_wrlock(rwlock); } - void unlock() { mysql_rwlock_unlock(rwlock); } + void rdlock() override { mysql_rwlock_rdlock(rwlock); } + void wrlock() override { mysql_rwlock_wrlock(rwlock); } + void unlock() override { mysql_rwlock_unlock(rwlock); } }; class AutoWLock diff -Nru mariadb-10.11.6/sql/table.cc mariadb-10.11.9/sql/table.cc --- mariadb-10.11.6/sql/table.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/table.cc 2024-08-03 07:29:59.000000000 +0000 @@ -49,6 +49,8 @@ #ifdef WITH_WSREP #include "wsrep_schema.h" #endif +#include "log_event.h" // MAX_TABLE_MAP_ID +#include "sql_class.h" /* For MySQL 5.7 virtual fields */ #define MYSQL57_GENERATED_FIELD 128 @@ -91,7 +93,7 @@ LEX_CSTRING PERFORMANCE_SCHEMA_DB_NAME= {STRING_WITH_LEN("performance_schema")}; /* MYSQL_SCHEMA name */ -LEX_CSTRING MYSQL_SCHEMA_NAME= {STRING_WITH_LEN("mysql")}; +Lex_ident_db MYSQL_SCHEMA_NAME= {STRING_WITH_LEN("mysql")}; /* GENERAL_LOG name */ LEX_CSTRING GENERAL_LOG_NAME= {STRING_WITH_LEN("general_log")}; @@ -108,7 +110,7 @@ */ static LEX_CSTRING parse_vcol_keyword= { STRING_WITH_LEN("PARSE_VCOL_EXPR ") }; -static std::atomic last_table_id; +static std::atomic last_table_id; /* Functions defined in this file */ @@ -276,42 +278,38 @@ } -TABLE_CATEGORY get_table_category(const LEX_CSTRING *db, - const LEX_CSTRING *name) +TABLE_CATEGORY get_table_category(const Lex_ident_db &db, + const Lex_ident_table &name) { - DBUG_ASSERT(db != NULL); - DBUG_ASSERT(name != NULL); - #ifdef WITH_WSREP - if (db->str && - my_strcasecmp(system_charset_info, db->str, WSREP_SCHEMA) == 0) + if (db.str && db.streq(MYSQL_SCHEMA_NAME)) { - if ((my_strcasecmp(system_charset_info, name->str, WSREP_STREAMING_TABLE) == 0 || - my_strcasecmp(system_charset_info, name->str, WSREP_CLUSTER_TABLE) == 0 || - my_strcasecmp(system_charset_info, name->str, WSREP_MEMBERS_TABLE) == 0)) + if (name.streq(Lex_ident_table{STRING_WITH_LEN(WSREP_STREAMING_TABLE)}) || + name.streq(Lex_ident_table{STRING_WITH_LEN(WSREP_CLUSTER_TABLE)}) || + name.streq(Lex_ident_table{STRING_WITH_LEN(WSREP_MEMBERS_TABLE)})) { return TABLE_CATEGORY_INFORMATION; } } #endif /* WITH_WSREP */ - if (is_infoschema_db(db)) + if (is_infoschema_db(&db)) return TABLE_CATEGORY_INFORMATION; - if (is_perfschema_db(db)) + if (is_perfschema_db(&db)) return TABLE_CATEGORY_PERFORMANCE; - if (lex_string_eq(&MYSQL_SCHEMA_NAME, db)) + if (db.streq(MYSQL_SCHEMA_NAME)) { - if (is_system_table_name(name->str, name->length)) + if (is_system_table_name(name.str, name.length)) return TABLE_CATEGORY_SYSTEM; - if (lex_string_eq(&GENERAL_LOG_NAME, name)) + if (name.streq(GENERAL_LOG_NAME)) return TABLE_CATEGORY_LOG; - if (lex_string_eq(&SLOW_LOG_NAME, name)) + if (name.streq(SLOW_LOG_NAME)) return TABLE_CATEGORY_LOG; - if (lex_string_eq(&TRANSACTION_REG_NAME, name)) + if (name.streq(TRANSACTION_REG_NAME)) return TABLE_CATEGORY_LOG; } @@ -364,7 +362,8 @@ strmov(path_buff, path); share->normalized_path.str= share->path.str; share->normalized_path.length= path_length; - share->table_category= get_table_category(& share->db, & share->table_name); + share->table_category= get_table_category(Lex_ident_db(share->db), + Lex_ident_table(share->table_name)); share->open_errno= ENOENT; /* The following will be updated in open_table_from_share */ share->can_do_row_logging= 1; @@ -384,17 +383,20 @@ DBUG_EXECUTE_IF("simulate_big_table_id", if (last_table_id < UINT_MAX32) - last_table_id= UINT_MAX32 - 1;); + last_table_id= UINT_MAX32-1;); /* - There is one reserved number that cannot be used. Remember to - change this when 6-byte global table id's are introduced. + Replication is using 6 bytes as table_map_id. Ensure that + the 6 lowest bytes are not 0. + We also have to ensure that we do not use the special value + UINT_MAX32 as this is used to mark a dummy event row event. See + comments in Rows_log_event::Rows_log_event(). */ do { share->table_map_id= last_table_id.fetch_add(1, std::memory_order_relaxed); - } while (unlikely(share->table_map_id == ~0UL || - share->table_map_id == 0)); + } while (unlikely((share->table_map_id & MAX_TABLE_MAP_ID) == 0) || + unlikely((share->table_map_id & MAX_TABLE_MAP_ID) == UINT_MAX32)); } DBUG_RETURN(share); } @@ -457,7 +459,7 @@ table_map_id is also used for MERGE tables to suppress repeated compatibility checks. */ - share->table_map_id= (ulong) thd->query_id; + share->table_map_id= (ulonglong) thd->query_id; DBUG_VOID_RETURN; } @@ -1211,7 +1213,8 @@ expr_str.length(parse_vcol_keyword.length); expr_str.append((char*)pos, expr_length); - thd->where= vcol_type_name(static_cast(type)); + thd->where= THD_WHERE::USE_WHERE_STRING; + thd->where_str= vcol_type_name(static_cast(type)); switch (type) { case VCOL_GENERATED_VIRTUAL: @@ -1286,12 +1289,11 @@ if (keypart->key_part_flag & HA_PART_KEY_SEG) { int length= keypart->length/keypart->field->charset()->mbmaxlen; + Field *kpf= table->field[keypart->field->field_index]; list_item= new (mem_root) Item_func_left(thd, - new (mem_root) Item_field(thd, keypart->field), + new (mem_root) Item_field(thd, kpf), new (mem_root) Item_int(thd, length)); list_item->fix_fields(thd, NULL); - keypart->field->vcol_info= - table->field[keypart->field->field_index]->vcol_info; } else list_item= new (mem_root) Item_field(thd, keypart->field); @@ -3328,6 +3330,8 @@ goto err; // Wrong field definition reg_field->flags |= AUTO_INCREMENT_FLAG; } + else + share->next_number_index= MAX_KEY; if (share->blob_fields) { @@ -5865,6 +5869,60 @@ } } +TABLE_LIST::TABLE_LIST(THD *thd, + LEX_CSTRING db_str, + bool fqtn, + LEX_CSTRING alias_str, + bool has_alias_ptr, + Table_ident *table_ident, + thr_lock_type lock_t, + enum_mdl_type mdl_t, + ulong table_opts, + bool info_schema, + st_select_lex *sel, + List *index_hints_ptr, + LEX_STRING *option_ptr) +{ + reset(); + db= db_str; + is_fqtn= fqtn; + alias= alias_str; + is_alias= has_alias_ptr; + if (lower_case_table_names) + { + if (table_ident->table.length) + table_ident->table.length= my_casedn_str(files_charset_info, + (char*) table_ident->table.str); + if (db.length && db.str != any_db.str) + db.length= my_casedn_str(files_charset_info, (char*) db.str); + } + + table_name= table_ident->table; + lock_type= lock_t; + mdl_type= mdl_t; + table_options= table_opts; + updating= table_options & TL_OPTION_UPDATING; + /* TODO: remove TL_OPTION_FORCE_INDEX as it looks like it's not used */ + force_index= table_options & TL_OPTION_FORCE_INDEX; + ignore_leaves= table_options & TL_OPTION_IGNORE_LEAVES; + sequence= table_options & TL_OPTION_SEQUENCE; + derived= table_ident->sel; + + if (!table_ident->sel && info_schema) + { + schema_table= find_schema_table(thd, &table_name); + schema_table_name= table_name; + } + select_lex= sel; + /* + We can't cache internal temporary tables between prepares as the + table may be deleted before next exection. + */ + cacheable_table= !table_ident->is_derived_table(); + index_hints= index_hints_ptr; + option= option_ptr ? option_ptr->str : 0; +} + /* calculate md5 of query @@ -5958,7 +6016,7 @@ /* Create view fields translation table */ if (!(transl= - (Field_translator*)(thd->stmt_arena-> + (Field_translator*)(thd-> alloc(select->item_list.elements * sizeof(Field_translator))))) { @@ -6244,8 +6302,8 @@ if (check_option) { - const char *save_where= thd->where; - thd->where= "check option"; + THD_WHERE save_where= thd->where; + thd->where= THD_WHERE::CHECK_OPTION; if (check_option->fix_fields_if_needed_for_bool(thd, &check_option)) DBUG_RETURN(TRUE); thd->where= save_where; @@ -7585,7 +7643,7 @@ always set and sometimes read. */ -void TABLE::mark_auto_increment_column() +void TABLE::mark_auto_increment_column(bool is_insert) { DBUG_ASSERT(found_next_number_field); /* @@ -7593,7 +7651,8 @@ store() to check overflow of auto_increment values */ bitmap_set_bit(read_set, found_next_number_field->field_index); - bitmap_set_bit(write_set, found_next_number_field->field_index); + if (is_insert) + bitmap_set_bit(write_set, found_next_number_field->field_index); if (s->next_number_keypart) mark_index_columns_for_read(s->next_number_index); file->column_bitmaps_signal(); @@ -7718,7 +7777,7 @@ else { if (found_next_number_field) - mark_auto_increment_column(); + mark_auto_increment_column(false); } if (file->ha_table_flags() & HA_PRIMARY_KEY_REQUIRED_FOR_DELETE) @@ -7794,7 +7853,7 @@ triggers->mark_fields_used(TRG_EVENT_INSERT); } if (found_next_number_field) - mark_auto_increment_column(); + mark_auto_increment_column(true); if (default_field) mark_default_fields_for_write(TRUE); if (s->versioned) @@ -9155,10 +9214,9 @@ int TABLE::update_generated_fields() { int res= 0; - if (found_next_number_field) + if (next_number_field) { - next_number_field= found_next_number_field; - res= found_next_number_field->set_default(); + res= next_number_field->set_default(); if (likely(!res)) res= file->update_auto_increment(); next_number_field= NULL; @@ -9173,6 +9231,18 @@ return res; } +void TABLE::period_prepare_autoinc() +{ + if (!found_next_number_field) + return; + /* Don't generate a new value if the autoinc index is WITHOUT OVERLAPS */ + DBUG_ASSERT(s->next_number_index < MAX_KEY); + if (key_info[s->next_number_index].without_overlaps) + return; + + next_number_field= found_next_number_field; +} + int TABLE::period_make_insert(Item *src, Field *dst) { THD *thd= in_use; @@ -9182,7 +9252,10 @@ int res= src->save_in_field(dst, true); if (likely(!res)) + { + period_prepare_autoinc(); res= update_generated_fields(); + } if (likely(!res) && triggers) res= triggers->process_triggers(thd, TRG_EVENT_INSERT, @@ -9507,7 +9580,8 @@ } if (file->indexes_are_disabled()) - tmp_table->file->ha_disable_indexes(HA_KEY_SWITCH_ALL); + tmp_table->file->ha_disable_indexes(key_map(0), false); + file->ha_index_or_rnd_end(); if (unlikely(file->ha_rnd_init_with_error(1))) @@ -10467,6 +10541,12 @@ { if (!item) return false; + if (item->real_type() == Item::FIELD_ITEM) + { + my_error(ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION, MYF(0), + item->full_name(), "FOR SYSTEM_TIME"); + return true; + } if (item->fix_fields_if_needed(thd, &item)) return true; const Type_handler *t= item->this_item()->real_type_handler(); diff -Nru mariadb-10.11.6/sql/table.h mariadb-10.11.9/sql/table.h --- mariadb-10.11.6/sql/table.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/table.h 2024-08-03 07:29:59.000000000 +0000 @@ -22,6 +22,7 @@ #include "datadict.h" #include "sql_string.h" /* String */ #include "lex_string.h" +#include "lex_ident.h" #ifndef MYSQL_CLIENT @@ -173,9 +174,9 @@ CHARSET_INFO *connection_cl); protected: - virtual Object_creation_ctx *create_backup_ctx(THD *thd) const; + Object_creation_ctx *create_backup_ctx(THD *thd) const override; - virtual void change_env(THD *thd) const; + void change_env(THD *thd) const override; protected: /** @@ -533,8 +534,8 @@ typedef enum enum_table_category TABLE_CATEGORY; -TABLE_CATEGORY get_table_category(const LEX_CSTRING *db, - const LEX_CSTRING *name); +TABLE_CATEGORY get_table_category(const Lex_ident_db &db, + const Lex_ident_table &name); typedef struct st_table_field_type @@ -575,7 +576,7 @@ class Table_check_intact_log_error : public Table_check_intact { protected: - void report_error(uint, const char *fmt, ...); + void report_error(uint, const char *fmt, ...) override; public: Table_check_intact_log_error() : Table_check_intact(true) {} }; @@ -601,9 +602,9 @@ MDL_context *get_ctx() const { return m_ctx; } - virtual bool accept_visitor(MDL_wait_for_graph_visitor *dvisitor); + bool accept_visitor(MDL_wait_for_graph_visitor *dvisitor) override; - virtual uint get_deadlock_weight() const; + uint get_deadlock_weight() const override; /** Pointers for participating in the list of waiters for table share. @@ -861,7 +862,7 @@ /* 1 if frm version cannot be updated as part of upgrade */ bool keep_original_mysql_version; - ulong table_map_id; /* for row-based replication */ + ulonglong table_map_id; /* for row-based replication */ /* Things that are incompatible between the stored version and the @@ -1023,7 +1024,7 @@ return (table_category == TABLE_CATEGORY_LOG); } - inline ulong get_table_def_version() + inline ulonglong get_table_def_version() { return table_map_id; } @@ -1102,7 +1103,7 @@ @sa TABLE_LIST::is_the_same_definition() */ - ulong get_table_ref_version() const + ulonglong get_table_ref_version() const { return (tmp_table == SYSTEM_TMP_TABLE) ? 0 : table_map_id; } @@ -1585,7 +1586,7 @@ void mark_index_columns_no_reset(uint index, MY_BITMAP *bitmap); void mark_index_columns_for_read(uint index); void restore_column_maps_after_keyread(MY_BITMAP *backup); - void mark_auto_increment_column(void); + void mark_auto_increment_column(bool insert_fl); void mark_columns_needed_for_update(void); void mark_columns_needed_for_delete(void); void mark_columns_needed_for_insert(void); @@ -1840,6 +1841,7 @@ #endif int update_generated_fields(); + void period_prepare_autoinc(); int period_make_insert(Item *src, Field *dst); int insert_portion_of_time(THD *thd, const vers_select_conds_t &period_conds, ha_rows *rows_inserted); @@ -2088,7 +2090,6 @@ void empty() { unit= VERS_TIMESTAMP; item= NULL; } void print(String *str, enum_query_type, const char *prefix, size_t plen) const; bool check_unit(THD *thd); - void bad_expression_data_type_error(const char *type) const; bool eq(const vers_history_point_t &point) const; }; @@ -2220,8 +2221,23 @@ void set_end_pos(TABLE_LIST **pos) { end_pos= pos; } }; +class Table_ident; struct TABLE_LIST { + TABLE_LIST(THD *thd, + LEX_CSTRING db_str, + bool fqtn, + LEX_CSTRING alias_str, + bool has_alias_ptr, + Table_ident *table_ident, + thr_lock_type lock_t, + enum_mdl_type mdl_t, + ulong table_opts, + bool info_schema, + st_select_lex *sel, + List *index_hints_ptr, + LEX_STRING *option_ptr); + TABLE_LIST() = default; /* Remove gcc warning */ enum prelocking_types @@ -2827,7 +2843,7 @@ { set_table_ref_id(s->get_table_ref_type(), s->get_table_ref_version()); } inline void set_table_ref_id(enum_table_ref_type table_ref_type_arg, - ulong table_ref_version_arg) + ulonglong table_ref_version_arg) { m_table_ref_type= table_ref_type_arg; m_table_ref_version= table_ref_version_arg; @@ -2919,7 +2935,10 @@ @brief Returns the name of the database that the referenced table belongs to. */ - const char *get_db_name() const { return view != NULL ? view_db.str : db.str; } + const LEX_CSTRING get_db_name() const + { + return view != NULL ? view_db : db; + } /** @brief Returns the name of the table that this TABLE_LIST represents. @@ -2927,7 +2946,10 @@ @details The unqualified table name or view name for a table or view, respectively. */ - const char *get_table_name() const { return view != NULL ? view_name.str : table_name.str; } + const LEX_CSTRING get_table_name() const + { + return view != NULL ? view_name : table_name; + } bool is_active_sjm(); bool is_sjm_scan_table(); bool is_jtbm() { return MY_TEST(jtbm_subselect != NULL); } @@ -2982,7 +3004,7 @@ /** See comments for set_table_ref_id() */ enum enum_table_ref_type m_table_ref_type; /** See comments for set_table_ref_id() */ - ulong m_table_ref_version; + ulonglong m_table_ref_version; }; class Item; @@ -3015,13 +3037,13 @@ Field **ptr; public: Field_iterator_table() :ptr(0) {} - void set(TABLE_LIST *table) { ptr= table->table->field; } + void set(TABLE_LIST *table) override { ptr= table->table->field; } void set_table(TABLE *table) { ptr= table->field; } - void next() { ptr++; } - bool end_of_fields() { return *ptr == 0; } - LEX_CSTRING *name(); - Item *create_item(THD *thd); - Field *field() { return *ptr; } + void next() override { ptr++; } + bool end_of_fields() override { return *ptr == 0; } + LEX_CSTRING *name() override; + Item *create_item(THD *thd) override; + Field *field() override { return *ptr; } }; @@ -3033,13 +3055,13 @@ TABLE_LIST *view; public: Field_iterator_view() :ptr(0), array_end(0) {} - void set(TABLE_LIST *table); - void next() { ptr++; } - bool end_of_fields() { return ptr == array_end; } - LEX_CSTRING *name(); - Item *create_item(THD *thd); + void set(TABLE_LIST *table) override; + void next() override { ptr++; } + bool end_of_fields() override { return ptr == array_end; } + LEX_CSTRING *name() override; + Item *create_item(THD *thd) override; Item **item_ptr() {return &ptr->item; } - Field *field() { return 0; } + Field *field() override { return 0; } inline Item *item() { return ptr->item; } Field_translator *field_translator() { return ptr; } }; @@ -3057,12 +3079,12 @@ public: Field_iterator_natural_join() :cur_column_ref(NULL) {} ~Field_iterator_natural_join() = default; - void set(TABLE_LIST *table); - void next(); - bool end_of_fields() { return !cur_column_ref; } - LEX_CSTRING *name() { return cur_column_ref->name(); } - Item *create_item(THD *thd) { return cur_column_ref->create_item(thd); } - Field *field() { return cur_column_ref->field(); } + void set(TABLE_LIST *table) override; + void next() override; + bool end_of_fields() override { return !cur_column_ref; } + LEX_CSTRING *name() override { return cur_column_ref->name(); } + Item *create_item(THD *thd) override { return cur_column_ref->create_item(thd); } + Field *field() override { return cur_column_ref->field(); } Natural_join_column *column_ref() { return cur_column_ref; } }; @@ -3093,16 +3115,16 @@ void set_field_iterator(); public: Field_iterator_table_ref() :field_it(NULL) {} - void set(TABLE_LIST *table); - void next(); - bool end_of_fields() + void set(TABLE_LIST *table) override; + void next() override; + bool end_of_fields() override { return (table_ref == last_leaf && field_it->end_of_fields()); } - LEX_CSTRING *name() { return field_it->name(); } + LEX_CSTRING *name() override { return field_it->name(); } const char *get_table_name(); const char *get_db_name(); GRANT_INFO *grant(); - Item *create_item(THD *thd) { return field_it->create_item(thd); } - Field *field() { return field_it->field(); } + Item *create_item(THD *thd) override { return field_it->create_item(thd); } + Field *field() override { return field_it->field(); } Natural_join_column *get_or_create_column_ref(THD *thd, TABLE_LIST *parent_table_ref); Natural_join_column *get_natural_column_ref(); }; @@ -3333,7 +3355,7 @@ /* information schema */ extern LEX_CSTRING INFORMATION_SCHEMA_NAME; -extern LEX_CSTRING MYSQL_SCHEMA_NAME; +extern Lex_ident_db MYSQL_SCHEMA_NAME; /* table names */ extern LEX_CSTRING MYSQL_PROC_NAME; diff -Nru mariadb-10.11.6/sql/table_cache.cc mariadb-10.11.9/sql/table_cache.cc --- mariadb-10.11.6/sql/table_cache.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/table_cache.cc 2024-08-03 07:29:59.000000000 +0000 @@ -303,9 +303,11 @@ periodicly flush all not used tables. */ -static my_bool tc_purge_callback(TDC_element *element, - Share_free_tables::List *purge_tables) +static my_bool tc_purge_callback(void *_element, void *_purge_tables) { + TDC_element *element= static_cast(_element); + Share_free_tables::List *purge_tables= + static_cast(_purge_tables); mysql_mutex_lock(&element->LOCK_table_share); tc_remove_all_unused_tables(element, purge_tables); mysql_mutex_unlock(&element->LOCK_table_share); @@ -317,7 +319,7 @@ { Share_free_tables::List purge_tables; - tdc_iterate(0, (my_hash_walk_action) tc_purge_callback, &purge_tables); + tdc_iterate(0, tc_purge_callback, &purge_tables); while (auto table= purge_tables.pop_front()) intern_close_table(table); } @@ -576,17 +578,20 @@ static void tdc_hash_initializer(LF_HASH *, - TDC_element *element, LEX_STRING *key) + void *_element, const void *_key) { + TDC_element *element= static_cast(_element); + const LEX_STRING *key= static_cast(_key); memcpy(element->m_key, key->str, key->length); element->m_key_length= (uint)key->length; tdc_assert_clean_share(element); } -static uchar *tdc_hash_key(const TDC_element *element, size_t *length, +static uchar *tdc_hash_key(const unsigned char *_element, size_t *length, my_bool) { + const TDC_element *element= (const TDC_element *) _element; *length= element->m_key_length; return (uchar*) element->m_key; } @@ -1139,7 +1144,7 @@ static uchar *eliminate_duplicates_get_key(const uchar *element, size_t *length, - my_bool not_used __attribute__((unused))) + my_bool) { LEX_STRING *key= (LEX_STRING *) element; *length= key->length; @@ -1147,9 +1152,10 @@ } -static my_bool eliminate_duplicates(TDC_element *element, - eliminate_duplicates_arg *arg) +static my_bool eliminate_duplicates(void *el, void *a) { + TDC_element *element= static_cast(el); + eliminate_duplicates_arg *arg= static_cast(a); LEX_STRING *key= (LEX_STRING *) alloc_root(&arg->root, sizeof(LEX_STRING)); if (!key || !(key->str= (char*) memdup_root(&arg->root, element->m_key, @@ -1195,7 +1201,7 @@ hash_flags); no_dups_argument.action= action; no_dups_argument.argument= argument; - action= (my_hash_walk_action) eliminate_duplicates; + action= eliminate_duplicates; argument= &no_dups_argument; } @@ -1213,8 +1219,8 @@ } -int show_tc_active_instances(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope) +int show_tc_active_instances(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum enum_var_type scope) { var->type= SHOW_UINT; var->value= buff; diff -Nru mariadb-10.11.6/sql/table_cache.h mariadb-10.11.9/sql/table_cache.h --- mariadb-10.11.6/sql/table_cache.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/table_cache.h 2024-08-03 07:29:59.000000000 +0000 @@ -87,8 +87,8 @@ bool no_dups= false); extern uint tc_records(void); -int show_tc_active_instances(THD *thd, SHOW_VAR *var, char *buff, - enum enum_var_type scope); +int show_tc_active_instances(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum enum_var_type scope); extern void tc_purge(); extern void tc_add_table(THD *thd, TABLE *table); extern void tc_release_table(TABLE *table); diff -Nru mariadb-10.11.6/sql/temporary_tables.cc mariadb-10.11.9/sql/temporary_tables.cc --- mariadb-10.11.6/sql/temporary_tables.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/temporary_tables.cc 2024-08-03 07:29:59.000000000 +0000 @@ -154,7 +154,8 @@ Temporary_table_state state) { DBUG_ENTER("THD::find_temporary_table"); - TABLE *table= find_temporary_table(tl->get_db_name(), tl->get_table_name(), + TABLE *table= find_temporary_table(tl->get_db_name().str, + tl->get_table_name().str, state); DBUG_RETURN(table); } @@ -243,8 +244,8 @@ TMP_TABLE_SHARE *THD::find_tmp_table_share(const TABLE_LIST *tl) { DBUG_ENTER("THD::find_tmp_table_share"); - TMP_TABLE_SHARE *share= find_tmp_table_share(tl->get_db_name(), - tl->get_table_name()); + TMP_TABLE_SHARE *share= find_tmp_table_share(tl->get_db_name().str, + tl->get_table_name().str); DBUG_RETURN(share); } @@ -386,7 +387,7 @@ */ if (!table && (share= find_tmp_table_share(tl))) { - table= open_temporary_table(share, tl->get_table_name()); + table= open_temporary_table(share, tl->get_table_name().str); /* Temporary tables are not safe for parallel replication. They were designed to be visible to one thread only, so have no table locking. @@ -1128,11 +1129,16 @@ DBUG_RETURN(NULL); /* Out of memory */ } + uint flags= ha_open_options | (open_options & HA_OPEN_FOR_CREATE); + /* + In replication, temporary tables are not confined to a single + thread/THD. + */ + if (slave_thread) + flags|= HA_OPEN_GLOBAL_TMP_TABLE; if (open_table_from_share(this, share, &alias, (uint) HA_OPEN_KEYFILE, - EXTRA_RECORD, - (ha_open_options | - (open_options & HA_OPEN_FOR_CREATE)), + EXTRA_RECORD, flags, table, false)) { my_free(table); @@ -1176,8 +1182,8 @@ bool result; DBUG_ENTER("THD::find_and_use_tmp_table"); - key_length= create_tmp_table_def_key(key, tl->get_db_name(), - tl->get_table_name()); + key_length= create_tmp_table_def_key(key, tl->get_db_name().str, + tl->get_table_name().str); result= use_temporary_table(find_temporary_table(key, key_length, TMP_TABLE_NOT_IN_USE), out_table); @@ -1588,6 +1594,11 @@ { /* Note: removing current list element doesn't invalidate iterator. */ share->all_tmp_tables.remove(table); + /* + At least one instance should be left (guaratead by calling this + function for table which is opened and the table is under processing) + */ + DBUG_ASSERT(share->all_tmp_tables.front()); free_temporary_table(table); } } diff -Nru mariadb-10.11.6/sql/threadpool.h mariadb-10.11.9/sql/threadpool.h --- mariadb-10.11.6/sql/threadpool.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/threadpool.h 2024-08-03 07:29:59.000000000 +0000 @@ -140,13 +140,13 @@ struct TP_pool_win:TP_pool { TP_pool_win(); - virtual int init(); - virtual ~TP_pool_win(); - virtual TP_connection *new_connection(CONNECT *c); - virtual void add(TP_connection *); - virtual int set_max_threads(uint); - virtual int set_min_threads(uint); - void resume(TP_connection *c); + int init() override; + ~TP_pool_win() override; + TP_connection *new_connection(CONNECT *c) override; + void add(TP_connection *) override; + int set_max_threads(uint) override; + int set_min_threads(uint) override; + void resume(TP_connection *c) override; }; #endif @@ -154,13 +154,13 @@ { TP_pool_generic(); ~TP_pool_generic(); - virtual int init(); - virtual TP_connection *new_connection(CONNECT *c); - virtual void add(TP_connection *); - virtual int set_pool_size(uint); - virtual int set_stall_limit(uint); - virtual int get_idle_thread_count(); - void resume(TP_connection* c); + int init() override; + TP_connection *new_connection(CONNECT *c) override; + void add(TP_connection *) override; + int set_pool_size(uint) override; + int set_stall_limit(uint) override; + int get_idle_thread_count() override; + void resume(TP_connection* c) override; }; #endif /* HAVE_POOL_OF_THREADS */ diff -Nru mariadb-10.11.6/sql/threadpool_generic.cc mariadb-10.11.9/sql/threadpool_generic.cc --- mariadb-10.11.6/sql/threadpool_generic.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/threadpool_generic.cc 2024-08-03 07:29:59.000000000 +0000 @@ -107,7 +107,7 @@ mysql_cond_t cond; volatile uint64 current_microtime; std::atomic next_timeout_check; - int tick_interval; + uint tick_interval; bool shutdown; pthread_t timer_thread_id; }; @@ -569,7 +569,7 @@ struct timespec ts; int err; - set_timespec_nsec(ts,timer->tick_interval*1000000); + set_timespec_nsec(ts, timer->tick_interval*1000000LL); mysql_mutex_lock(&timer->mutex); err= mysql_cond_timedwait(&timer->cond, &timer->mutex, &ts); if (timer->shutdown) diff -Nru mariadb-10.11.6/sql/threadpool_win.cc mariadb-10.11.9/sql/threadpool_win.cc --- mariadb-10.11.6/sql/threadpool_win.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/threadpool_win.cc 2024-08-03 07:29:59.000000000 +0000 @@ -355,10 +355,13 @@ if (IS_SYSVAR_AUTOSIZE(&threadpool_max_threads)) { /* - Nr 500 comes from Microsoft documentation, - there is no API for GetThreadpoolThreadMaxThreads() + Default 500 comes from Microsoft documentation, + there is no API for GetThreadpoolThreadMaxThreads(). + + To avoid deadlocks, allow at least max_connections + safety + margin threads in the pool. */ - SYSVAR_AUTOSIZE(threadpool_max_threads,500); + SYSVAR_AUTOSIZE(threadpool_max_threads,std::max(500U,(uint)max_connections + 10)); } else { diff -Nru mariadb-10.11.6/sql/transaction.cc mariadb-10.11.9/sql/transaction.cc --- mariadb-10.11.6/sql/transaction.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/transaction.cc 2024-08-03 07:29:59.000000000 +0000 @@ -191,7 +191,7 @@ } #ifdef WITH_WSREP - if (wsrep_thd_is_local(thd)) + if (WSREP(thd) && wsrep_thd_is_local(thd)) { if (wsrep_sync_wait(thd)) DBUG_RETURN(TRUE); @@ -255,11 +255,15 @@ bool trans_commit(THD *thd) { int res; + PSI_stage_info org_stage; DBUG_ENTER("trans_commit"); if (trans_check(thd)) DBUG_RETURN(TRUE); + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_commit); + thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); @@ -288,6 +292,7 @@ DBUG_ASSERT(thd->m_transaction_psi == NULL); trans_track_end_trx(thd); + THD_STAGE_INFO(thd, org_stage); DBUG_RETURN(MY_TEST(res)); } @@ -320,6 +325,10 @@ if (thd->in_multi_stmt_transaction_mode() || (thd->variables.option_bits & OPTION_TABLE_LOCK)) { + PSI_stage_info org_stage; + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_commit_implicit); + /* Safety if one did "drop table" on locked tables */ if (!thd->locked_tables_mode) thd->variables.option_bits&= ~OPTION_TABLE_LOCK; @@ -327,6 +336,8 @@ ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); res= MY_TEST(ha_commit_trans(thd, TRUE)); + + THD_STAGE_INFO(thd, org_stage); } thd->variables.option_bits&= ~(OPTION_BEGIN | OPTION_BINLOG_THIS_TRX); @@ -361,11 +372,15 @@ bool trans_rollback(THD *thd) { int res; + PSI_stage_info org_stage; DBUG_ENTER("trans_rollback"); if (trans_check(thd)) DBUG_RETURN(TRUE); + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_rollback); + thd->server_status&= ~(SERVER_STATUS_IN_TRANS | SERVER_STATUS_IN_TRANS_READONLY); DBUG_PRINT("info", ("clearing SERVER_STATUS_IN_TRANS")); @@ -384,6 +399,7 @@ trans_track_end_trx(thd); + THD_STAGE_INFO(thd, org_stage); DBUG_RETURN(MY_TEST(res)); } @@ -406,8 +422,12 @@ bool trans_rollback_implicit(THD *thd) { int res; + PSI_stage_info org_stage; DBUG_ENTER("trans_rollback_implict"); + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_rollback_implicit); + /* Always commit/rollback statement transaction before manipulating with the normal one. @@ -434,6 +454,7 @@ trans_track_end_trx(thd); + THD_STAGE_INFO(thd, org_stage); DBUG_RETURN(MY_TEST(res)); } @@ -469,11 +490,17 @@ if (thd->transaction->stmt.ha_list) { + PSI_stage_info org_stage; + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_commit); + res= ha_commit_trans(thd, FALSE); if (! thd->in_active_multi_stmt_transaction()) { trans_reset_one_shot_chistics(thd); } + + THD_STAGE_INFO(thd, org_stage); } mysql_mutex_assert_not_owner(&LOCK_prepare_ordered); @@ -532,9 +559,15 @@ if (thd->transaction->stmt.ha_list) { + PSI_stage_info org_stage; + thd->backup_stage(&org_stage); + THD_STAGE_INFO(thd, stage_rollback); + ha_rollback_trans(thd, FALSE); if (! thd->in_active_multi_stmt_transaction()) trans_reset_one_shot_chistics(thd); + + THD_STAGE_INFO(thd, org_stage); } #ifdef HAVE_REPLICATION diff -Nru mariadb-10.11.6/sql/tztime.cc mariadb-10.11.9/sql/tztime.cc --- mariadb-10.11.6/sql/tztime.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/tztime.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1028,9 +1028,9 @@ { public: Time_zone_system() = default; /* Remove gcc warning */ - virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, uint *error_code) const; - virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const; - virtual const String * get_name() const; + my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, uint *error_code) const override; + void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const override; + const String * get_name() const override; }; @@ -1124,10 +1124,10 @@ { public: Time_zone_utc() = default; /* Remove gcc warning */ - virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, - uint *error_code) const; - virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const; - virtual const String * get_name() const; + my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, + uint *error_code) const override; + void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const override; + const String * get_name() const override; }; @@ -1207,9 +1207,9 @@ { public: Time_zone_db(TIME_ZONE_INFO *tz_info_arg, const String * tz_name_arg); - virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, uint *error_code) const; - virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const; - virtual const String * get_name() const; + my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, uint *error_code) const override; + void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const override; + const String * get_name() const override; private: TIME_ZONE_INFO *tz_info; const String *tz_name; @@ -1305,10 +1305,10 @@ { public: Time_zone_offset(long tz_offset_arg); - virtual my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, - uint *error_code) const; - virtual void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const; - virtual const String * get_name() const; + my_time_t TIME_to_gmt_sec(const MYSQL_TIME *t, + uint *error_code) const override; + void gmt_sec_to_TIME(MYSQL_TIME *tmp, my_time_t t) const override; + const String * get_name() const override; /* This have to be public because we want to be able to access it from my_offset_tzs_get_key() function @@ -2725,6 +2725,8 @@ " time_zone_transition WRITE,\n" " time_zone_transition_type WRITE"; static const char *trunc_tables_const= + "SET @old_alter_alg=@@SESSION.alter_algorithm;\n" + "SET session alter_algorithm='COPY';\n" "TRUNCATE TABLE time_zone;\n" "TRUNCATE TABLE time_zone_name;\n" "TRUNCATE TABLE time_zone_transition;\n" @@ -2769,7 +2771,7 @@ printf("set @wsrep_is_on=(%s);\n", wsrep_is_on); printf("SET STATEMENT SQL_MODE='' FOR " - "SELECT concat('%%', GROUP_CONCAT(OPTION), '%%') INTO @replicate_opt " + "SELECT concat('%%', GROUP_CONCAT(OPTION ORDER BY OPTION DESC), '%%') INTO @replicate_opt " " FROM" " (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION" " FROM information_schema.TABLES" @@ -2780,8 +2782,7 @@ " 'time_zone_transition_type'," " 'time_zone_leap_second')" " AND ENGINE in ('MyISAM'," - " 'Aria')) AS o" - " ORDER BY OPTION DESC;\n"); + " 'Aria')) AS o;\n"); printf("set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (%s);\n", wsrep_cannot_replicate_tz); if (opt_skip_write_binlog) /* We turn off session wsrep if we cannot replicate using galera. @@ -2873,6 +2874,9 @@ "concat('ALTER TABLE time_zone_transition_type ENGINE=', " "@time_zone_transition_type_engine, ', ORDER BY Time_zone_id, Transition_type_id'), 'do 0');\n"); + if (argc == 1 && !opt_leap) + printf("SET session alter_algorithm=@old_alter_alg;\n"); + free_allocated_data(); my_end(0); return 0; diff -Nru mariadb-10.11.6/sql/unireg.cc mariadb-10.11.9/sql/unireg.cc --- mariadb-10.11.6/sql/unireg.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/unireg.cc 2024-08-03 07:29:59.000000000 +0000 @@ -806,7 +806,15 @@ ? VCOL_GENERATED_STORED : VCOL_GENERATED_VIRTUAL)) return 1; if (field->has_default_expression() && !field->has_default_now_unireg_check()) - if (pack_expression(buf, field->default_value, field_nr, VCOL_DEFAULT)) + if (pack_expression(buf, field->default_value, field_nr, VCOL_DEFAULT) || + /* + field->has_default_expression() can return error (e.g. because + the method Item_param::basic_const_item invokes + invalid_default_param() + in case either DEFAULT_VALUE or IGNORE_VALUE is handled). + Take this fact into account and return error in this case. + */ + thd->is_error()) return 1; if (field->check_constraint) if (pack_expression(buf, field->check_constraint, field_nr, diff -Nru mariadb-10.11.6/sql/unireg.h mariadb-10.11.9/sql/unireg.h --- mariadb-10.11.6/sql/unireg.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/unireg.h 2024-08-03 07:29:59.000000000 +0000 @@ -217,7 +217,7 @@ #define FRM_FORMINFO_SIZE 288 #define FRM_MAX_SIZE (1024*1024) -static inline bool is_binary_frm_header(uchar *head) +static inline bool is_binary_frm_header(const uchar *head) { return head[0] == 254 && head[1] == 1 diff -Nru mariadb-10.11.6/sql/winmain.cc mariadb-10.11.9/sql/winmain.cc --- mariadb-10.11.6/sql/winmain.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/winmain.cc 2024-08-03 07:29:59.000000000 +0000 @@ -221,6 +221,25 @@ } /* + Disable CPU throttling for the process. + + Windows 11 heuristics misdetects server as a background process and runs it + on "efficiency" cores, in hybrid architectures such as Alder Lake (12th + generation Intel Core).This results in serious performance degradation. +*/ +void disable_cpu_throttling() +{ +#ifdef PROCESS_POWER_THROTTLING_EXECUTION_SPEED + PROCESS_POWER_THROTTLING_STATE power_throttling{}; + power_throttling.Version= PROCESS_POWER_THROTTLING_CURRENT_VERSION; + power_throttling.ControlMask= PROCESS_POWER_THROTTLING_EXECUTION_SPEED; + power_throttling.StateMask= 0; + SetProcessInformation(GetCurrentProcess(), ProcessPowerThrottling, + &power_throttling, sizeof(power_throttling)); +#endif +} + +/* Main function on Windows. Runs mysqld as normal process, or as a service. @@ -231,6 +250,7 @@ save_argv= argv; save_argc= argc; + disable_cpu_throttling(); /* If no special arguments are given, service name is nor present run as normal program. diff -Nru mariadb-10.11.6/sql/wsrep_applier.cc mariadb-10.11.9/sql/wsrep_applier.cc --- mariadb-10.11.6/sql/wsrep_applier.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_applier.cc 2024-08-03 07:29:59.000000000 +0000 @@ -177,8 +177,7 @@ break; } - - if (!thd->variables.gtid_seq_no && wsrep_thd_is_toi(thd) && + if (!thd->variables.gtid_seq_no && wsrep_thd_is_toi(thd) && (ev->get_type_code() == QUERY_EVENT)) { uint64 seqno= wsrep_gtid_server.seqno_inc(); @@ -188,22 +187,19 @@ thd->variables.gtid_seq_no= seqno; } } + /* Use the original server id for logging. */ thd->set_server_id(ev->server_id); - thd->set_time(); // time the query - thd->transaction->start_time.reset(thd); thd->lex->current_select= 0; - if (!ev->when) - { - my_hrtime_t hrtime= my_hrtime(); - ev->when= hrtime_to_my_time(hrtime); - ev->when_sec_part= hrtime_sec_part(hrtime); - } - thd->variables.option_bits= (thd->variables.option_bits & ~OPTION_SKIP_REPLICATION) | (ev->flags & LOG_EVENT_SKIP_REPLICATION_F ? OPTION_SKIP_REPLICATION : 0); + if (ev->get_type_code() == GTID_EVENT) + { + thd->variables.option_bits &= ~OPTION_GTID_BEGIN; + } + ev->thd= thd; exec_res= ev->apply_event(thd->wsrep_rgi); DBUG_PRINT("info", ("exec_event result: %d", exec_res)); diff -Nru mariadb-10.11.6/sql/wsrep_client_service.cc mariadb-10.11.9/sql/wsrep_client_service.cc --- mariadb-10.11.6/sql/wsrep_client_service.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_client_service.cc 2024-08-03 07:29:59.000000000 +0000 @@ -281,11 +281,18 @@ original THD state during replication event applying. */ THD *replayer_thd= new THD(true, true); + // Replace the security context of the replayer with the security context + // of the original THD. Since security context class doesn't have proper + // copy constructors, we need to store the original one and set it back + // before destruction so that THD desctruction doesn't cause double-free + // on the replaced security context. + Security_context old_ctx = replayer_thd->main_security_ctx; + replayer_thd->main_security_ctx = m_thd->main_security_ctx; replayer_thd->thread_stack= m_thd->thread_stack; replayer_thd->real_id= pthread_self(); replayer_thd->prior_thr_create_utime= replayer_thd->start_utime= microsecond_interval_timer(); - replayer_thd->set_command(COM_SLEEP); + replayer_thd->mark_connection_idle(); replayer_thd->reset_for_next_command(true); enum wsrep::provider::status ret; @@ -297,6 +304,7 @@ replayer_service.replay_status(ret); } + replayer_thd->main_security_ctx = old_ctx; delete replayer_thd; DBUG_RETURN(ret); } diff -Nru mariadb-10.11.6/sql/wsrep_client_service.h mariadb-10.11.9/sql/wsrep_client_service.h --- mariadb-10.11.6/sql/wsrep_client_service.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_client_service.h 2024-08-03 07:29:59.000000000 +0000 @@ -36,34 +36,38 @@ public: Wsrep_client_service(THD*, Wsrep_client_state&); - bool interrupted(wsrep::unique_lock&) const; - void reset_globals(); - void store_globals(); - int prepare_data_for_replication(); - void cleanup_transaction(); - bool statement_allowed_for_streaming() const; - size_t bytes_generated() const; - int prepare_fragment_for_replication(wsrep::mutable_buffer&, size_t&); - int remove_fragments(); - void emergency_shutdown() + bool interrupted(wsrep::unique_lock&) const override; + void reset_globals() override; + void store_globals() override; + int prepare_data_for_replication() override; + void cleanup_transaction() override; + bool statement_allowed_for_streaming() const override; + size_t bytes_generated() const override; + int prepare_fragment_for_replication(wsrep::mutable_buffer&, size_t&) override; + int remove_fragments() override; + void emergency_shutdown() override { throw wsrep::not_implemented_error(); } - void will_replay(); - void signal_replayed(); - enum wsrep::provider::status replay(); - enum wsrep::provider::status replay_unordered(); - void wait_for_replayers(wsrep::unique_lock&); - enum wsrep::provider::status commit_by_xid(); - bool is_explicit_xa() + void will_replay() override; + void signal_replayed() override; + enum wsrep::provider::status replay() override; + enum wsrep::provider::status replay_unordered() override; + void wait_for_replayers(wsrep::unique_lock&) override; + enum wsrep::provider::status commit_by_xid() override; + bool is_explicit_xa() override { return false; } - bool is_xa_rollback() + bool is_prepared_xa() override { return false; } - void debug_sync(const char*); - void debug_crash(const char*); - int bf_rollback(); + bool is_xa_rollback() override + { + return false; + } + void debug_sync(const char*) override; + void debug_crash(const char*) override; + int bf_rollback() override; private: friend class Wsrep_server_service; THD* m_thd; diff -Nru mariadb-10.11.6/sql/wsrep_condition_variable.h mariadb-10.11.9/sql/wsrep_condition_variable.h --- mariadb-10.11.6/sql/wsrep_condition_variable.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_condition_variable.h 2024-08-03 07:29:59.000000000 +0000 @@ -31,17 +31,17 @@ { } ~Wsrep_condition_variable() = default; - void notify_one() + void notify_one() override { mysql_cond_signal(m_cond); } - void notify_all() + void notify_all() override { mysql_cond_broadcast(m_cond); } - void wait(wsrep::unique_lock& lock) + void wait(wsrep::unique_lock& lock) override { mysql_mutex_t* mutex= static_cast(lock.mutex()->native()); mysql_cond_wait(m_cond, mutex); diff -Nru mariadb-10.11.6/sql/wsrep_dummy.cc mariadb-10.11.9/sql/wsrep_dummy.cc --- mariadb-10.11.6/sql/wsrep_dummy.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_dummy.cc 2024-08-03 07:29:59.000000000 +0000 @@ -167,3 +167,5 @@ void wsrep_thd_set_PA_unsafe(THD*) {} +uint32 wsrep_get_domain_id() +{ return 0;} diff -Nru mariadb-10.11.6/sql/wsrep_high_priority_service.cc mariadb-10.11.9/sql/wsrep_high_priority_service.cc --- mariadb-10.11.6/sql/wsrep_high_priority_service.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_high_priority_service.cc 2024-08-03 07:29:59.000000000 +0000 @@ -214,6 +214,7 @@ const wsrep::ws_handle& ws_handle, const wsrep::ws_meta& ws_meta) { DBUG_ENTER(" Wsrep_high_priority_service::start_transaction"); + m_thd->set_time(); DBUG_RETURN(m_thd->wsrep_cs().start_transaction(ws_handle, ws_meta) || trans_begin(m_thd)); } @@ -425,6 +426,7 @@ };); #endif + thd->set_time(); int ret= apply_events(thd, m_rli, data, err); wsrep_thd_set_ignored_error(thd, false); trans_commit(thd); @@ -569,6 +571,7 @@ THD* thd= m_thd; thd->variables.option_bits |= OPTION_BEGIN; + thd->variables.option_bits |= OPTION_GTID_BEGIN; thd->variables.option_bits |= OPTION_NOT_AUTOCOMMIT; DBUG_ASSERT(thd->wsrep_trx().active()); DBUG_ASSERT(thd->wsrep_trx().state() == wsrep::transaction::s_executing); @@ -600,6 +603,8 @@ thd->wsrep_cs().fragment_applied(ws_meta.seqno()); } thd_proc_info(thd, "wsrep applied write set"); + + thd->variables.option_bits &= ~OPTION_GTID_BEGIN; DBUG_RETURN(ret); } diff -Nru mariadb-10.11.6/sql/wsrep_high_priority_service.h mariadb-10.11.9/sql/wsrep_high_priority_service.h --- mariadb-10.11.6/sql/wsrep_high_priority_service.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_high_priority_service.h 2024-08-03 07:29:59.000000000 +0000 @@ -33,31 +33,31 @@ Wsrep_high_priority_service(THD*); ~Wsrep_high_priority_service(); int start_transaction(const wsrep::ws_handle&, - const wsrep::ws_meta&); - int next_fragment(const wsrep::ws_meta&); - const wsrep::transaction& transaction() const; - int adopt_transaction(const wsrep::transaction&); + const wsrep::ws_meta&) override; + int next_fragment(const wsrep::ws_meta&) override; + const wsrep::transaction& transaction() const override; + int adopt_transaction(const wsrep::transaction&) override; int apply_write_set(const wsrep::ws_meta&, const wsrep::const_buffer&, - wsrep::mutable_buffer&) = 0; + wsrep::mutable_buffer&) override = 0; int append_fragment_and_commit(const wsrep::ws_handle&, const wsrep::ws_meta&, const wsrep::const_buffer&, - const wsrep::xid&); - int remove_fragments(const wsrep::ws_meta&); - int commit(const wsrep::ws_handle&, const wsrep::ws_meta&); - int rollback(const wsrep::ws_handle&, const wsrep::ws_meta&); + const wsrep::xid&) override; + int remove_fragments(const wsrep::ws_meta&) override; + int commit(const wsrep::ws_handle&, const wsrep::ws_meta&) override; + int rollback(const wsrep::ws_handle&, const wsrep::ws_meta&) override; int apply_toi(const wsrep::ws_meta&, const wsrep::const_buffer&, - wsrep::mutable_buffer&); - void store_globals(); - void reset_globals(); - void switch_execution_context(wsrep::high_priority_service&); + wsrep::mutable_buffer&) override; + void store_globals() override; + void reset_globals() override; + void switch_execution_context(wsrep::high_priority_service&) override; int log_dummy_write_set(const wsrep::ws_handle&, const wsrep::ws_meta&, - wsrep::mutable_buffer&); - void adopt_apply_error(wsrep::mutable_buffer&); + wsrep::mutable_buffer&) override; + void adopt_apply_error(wsrep::mutable_buffer&) override; virtual bool check_exit_status() const = 0; - void debug_crash(const char*); + void debug_crash(const char*) override; protected: friend Wsrep_server_service; THD* m_thd; @@ -84,12 +84,12 @@ Wsrep_applier_service(THD*); ~Wsrep_applier_service(); int apply_write_set(const wsrep::ws_meta&, const wsrep::const_buffer&, - wsrep::mutable_buffer&); + wsrep::mutable_buffer&) override; int apply_nbo_begin(const wsrep::ws_meta&, const wsrep::const_buffer& data, - wsrep::mutable_buffer& err); - void after_apply(); - bool is_replaying() const { return false; } - bool check_exit_status() const; + wsrep::mutable_buffer& err) override; + void after_apply() override; + bool is_replaying() const override { return false; } + bool check_exit_status() const override; }; class Wsrep_replayer_service : public Wsrep_high_priority_service @@ -98,21 +98,21 @@ Wsrep_replayer_service(THD* replayer_thd, THD* orig_thd); ~Wsrep_replayer_service(); int apply_write_set(const wsrep::ws_meta&, const wsrep::const_buffer&, - wsrep::mutable_buffer&); + wsrep::mutable_buffer&) override; int apply_nbo_begin(const wsrep::ws_meta&, const wsrep::const_buffer& data, - wsrep::mutable_buffer& err) + wsrep::mutable_buffer& err) override { DBUG_ASSERT(0); /* DDL should never cause replaying */ return 0; } - void after_apply() { } - bool is_replaying() const { return true; } + void after_apply() override { } + bool is_replaying() const override { return true; } void replay_status(enum wsrep::provider::status status) { m_replay_status = status; } enum wsrep::provider::status replay_status() const { return m_replay_status; } /* Replayer should never be forced to exit */ - bool check_exit_status() const { return false; } + bool check_exit_status() const override { return false; } private: THD* m_orig_thd; struct da_shadow diff -Nru mariadb-10.11.6/sql/wsrep_mutex.h mariadb-10.11.9/sql/wsrep_mutex.h --- mariadb-10.11.6/sql/wsrep_mutex.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_mutex.h 2024-08-03 07:29:59.000000000 +0000 @@ -30,17 +30,17 @@ : m_mutex(mutex) { } - void lock() + void lock() override { mysql_mutex_lock(m_mutex); } - void unlock() + void unlock() override { mysql_mutex_unlock(m_mutex); } - void* native() + void* native() override { return m_mutex; } diff -Nru mariadb-10.11.6/sql/wsrep_mysqld.cc mariadb-10.11.9/sql/wsrep_mysqld.cc --- mariadb-10.11.6/sql/wsrep_mysqld.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_mysqld.cc 2024-08-03 07:29:59.000000000 +0000 @@ -584,7 +584,8 @@ return ret; } -int wsrep_show_ready(THD *thd, SHOW_VAR *var, char *buff) +int wsrep_show_ready(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { var->type= SHOW_MY_BOOL; var->value= buff; @@ -1127,10 +1128,8 @@ } } - -void wsrep_stop_replication(THD *thd) +static void wsrep_stop_replication_common(THD *thd) { - WSREP_INFO("Stop replication by %llu", (thd) ? thd->thread_id : 0); if (Wsrep_server_state::instance().state() != Wsrep_server_state::s_disconnected) { @@ -1143,10 +1142,10 @@ } } - /* my connection, should not terminate with wsrep_close_client_connection(), - make transaction to rollback - */ - if (thd && !thd->wsrep_applier) trans_rollback(thd); + /* my connection, should not terminate with + wsrep_close_client_connections(), make transaction to rollback */ + if (thd && !thd->wsrep_applier) + trans_rollback(thd); wsrep_close_client_connections(TRUE, thd); /* wait until appliers have stopped */ @@ -1155,26 +1154,16 @@ node_uuid= WSREP_UUID_UNDEFINED; } +void wsrep_stop_replication(THD *thd) +{ + WSREP_INFO("Stop replication by %llu", (thd) ? thd->thread_id : 0); + wsrep_stop_replication_common(thd); +} + void wsrep_shutdown_replication() { WSREP_INFO("Shutdown replication"); - if (Wsrep_server_state::instance().state() != wsrep::server_state::s_disconnected) - { - WSREP_DEBUG("Disconnect provider"); - Wsrep_server_state::instance().disconnect(); - if (Wsrep_server_state::instance().wait_until_state( - Wsrep_server_state::s_disconnected)) - { - WSREP_WARN("Wsrep interrupted while waiting for disconnected state"); - } - } - - wsrep_close_client_connections(TRUE); - - /* wait until appliers have stopped */ - wsrep_wait_appliers_close(NULL); - node_uuid= WSREP_UUID_UNDEFINED; - + wsrep_stop_replication_common(nullptr); /* Undocking the thread specific data. */ set_current_thd(nullptr); } @@ -1713,7 +1702,13 @@ return res; } -void wsrep_keys_free(wsrep_key_arr_t* key_arr) +typedef struct wsrep_key_arr +{ + wsrep_key_t* keys; + size_t keys_len; +} wsrep_key_arr_t; + +static void wsrep_keys_free(wsrep_key_arr_t* key_arr) { for (size_t i= 0; i < key_arr->keys_len; ++i) { @@ -1729,7 +1724,7 @@ * @param tables list of tables * @param keys prepared keys - * @return true if parent table append was successfull, otherwise false. + * @return 0 if parent table append was successful, non-zero otherwise. */ bool wsrep_append_fk_parent_table(THD* thd, TABLE_LIST* tables, wsrep::key_array* keys) @@ -1785,6 +1780,8 @@ } exit: + DEBUG_SYNC(thd, "wsrep_append_fk_toi_keys_before_close_tables"); + /* close the table and release MDL locks */ close_thread_tables(thd); thd->mdl_context.rollback_to_savepoint(mdl_savepoint); @@ -1803,6 +1800,24 @@ } } + /* + MDEV-32938: Check if DDL operation has been killed before. + + It may be that during collecting foreign keys this operation gets BF-aborted + by another already-running TOI operation because it got MDL locks on the same + table for checking foreign keys. + After `close_thread_tables()` has been called it's safe to assume that no-one + can BF-abort this operation as it's not holding any MDL locks any more. + */ + if (!fail) + { + mysql_mutex_lock(&thd->LOCK_thd_kill); + if (thd->killed) + { + fail= true; + } + mysql_mutex_unlock(&thd->LOCK_thd_kill); + } return fail; } @@ -2006,18 +2021,43 @@ } /* - * Prepare key list from db/table and table_list + * Prepare key list from db/table and table_list and append it to Wsrep + * with the given key type. * * Return zero in case of success, 1 in case of failure. */ +int wsrep_append_table_keys(THD* thd, + TABLE_LIST* first_table, + TABLE_LIST* table_list, + Wsrep_service_key_type key_type) +{ + wsrep_key_arr_t key_arr= {0, 0}; + const char* db_name= first_table ? first_table->db.str : NULL; + const char* table_name= first_table ? first_table->table_name.str : NULL; + int rcode= wsrep_prepare_keys_for_isolation(thd, db_name, table_name, + table_list, NULL, &key_arr); -bool wsrep_prepare_keys_for_isolation(THD* thd, - const char* db, - const char* table, - const TABLE_LIST* table_list, - wsrep_key_arr_t* ka) -{ - return wsrep_prepare_keys_for_isolation(thd, db, table, table_list, NULL, ka); + if (!rcode && key_arr.keys_len) + { + rcode= wsrep_thd_append_key(thd, key_arr.keys, + key_arr.keys_len, key_type); + } + + wsrep_keys_free(&key_arr); + return rcode; +} + +extern "C" int wsrep_thd_append_table_key(MYSQL_THD thd, + const char* db, + const char* table, + enum Wsrep_service_key_type key_type) +{ + wsrep_key_arr_t key_arr = {0, 0}; + int ret = wsrep_prepare_keys_for_isolation(thd, db, table, NULL, NULL, &key_arr); + ret = ret || wsrep_thd_append_key(thd, key_arr.keys, + (int)key_arr.keys_len, key_type); + wsrep_keys_free(&key_arr); + return ret; } bool wsrep_prepare_key(const uchar* cache_key, size_t cache_key_len, @@ -2939,6 +2979,15 @@ const wsrep::key_array *fk_tables, const HA_CREATE_INFO *create_info) { + mysql_mutex_lock(&thd->LOCK_thd_kill); + const killed_state killed = thd->killed; + mysql_mutex_unlock(&thd->LOCK_thd_kill); + if (killed) + { + DBUG_ASSERT(FALSE); + return -1; + } + /* No isolation for applier or replaying threads. */ @@ -3182,7 +3231,9 @@ } } else if (granted_thd->lex->sql_command == SQLCOM_FLUSH || - granted_thd->mdl_context.has_explicit_locks()) + /* System transactions with explicit locks are BACKUP. */ + (granted_thd->system_thread != NON_SYSTEM_THREAD && + granted_thd->mdl_context.has_explicit_locks())) { WSREP_DEBUG("BF thread waiting for FLUSH for %s", wsrep_thd_query(request_thd)); @@ -3287,14 +3338,20 @@ { DBUG_PRINT("quit",("Informing thread %lld that it's time to die", (longlong) thd->thread_id)); - if (is_client_connection(thd) && - (thd->killed == KILL_CONNECTION || - thd->killed == KILL_CONNECTION_HARD)) + if (is_client_connection(thd)) { - (void)abort_replicated(thd); - return 1; + if (thd->killed == KILL_CONNECTION || + thd->killed == KILL_CONNECTION_HARD) + { + (void)abort_replicated(thd); + return true; + } + if (thd->get_stmt_da()->is_eof()) + { + return true; + } } - return 0; + return false; } static void wsrep_close_thread(THD *thd) @@ -3332,14 +3389,24 @@ /* We skip slave threads & scheduler on this first loop through. */ if (is_client_connection(thd) && thd != caller_thd) { + if (thd->get_stmt_da()->is_eof()) + { + return 0; + } + if (is_replaying_connection(thd)) + { thd->set_killed(KILL_CONNECTION_HARD); - else if (!abort_replicated(thd)) + return 0; + } + + if (!abort_replicated(thd)) { /* replicated transactions must be skipped */ WSREP_DEBUG("closing connection %lld", (longlong) thd->thread_id); /* instead of wsrep_close_thread() we do now soft kill by THD::awake */ thd->awake(KILL_CONNECTION_HARD); + return 0; } } return 0; @@ -3351,6 +3418,7 @@ if (is_client_connection(thd) && !abort_replicated(thd) && !is_replaying_connection(thd) && + !thd->get_stmt_da()->is_eof() && thd_is_connection_alive(thd) && thd != caller_thd) { @@ -3689,8 +3757,7 @@ thd->security_ctx->skip_grants(); /* handle_one_connection() again... */ - thd->proc_info= 0; - thd->set_command(COM_SLEEP); + thd->mark_connection_idle(); thd->init_for_queries(); mysql_mutex_lock(&LOCK_wsrep_slave_threads); @@ -3846,7 +3913,7 @@ mysql_mutex_lock(&LOCK_wsrep_ready); wsrep_ready= ready_value; // Signal if we have reached ready state - if (wsrep_ready) + if (ready_value) mysql_cond_signal(&COND_wsrep_ready); mysql_mutex_unlock(&LOCK_wsrep_ready); } @@ -3861,21 +3928,11 @@ step is performed to leave the wsrep transaction in the state as it never existed. - This should not be an inline functions as it requires a lot of stack space - because of WSREP_DBUG() usage. It's also not a function that is - frequently called. */ void wsrep_commit_empty(THD* thd, bool all) { DBUG_ENTER("wsrep_commit_empty"); - WSREP_DEBUG("wsrep_commit_empty for %llu client_state %s client_mode" - " %s trans_state %s sql %s", - thd_get_thread_id(thd), - wsrep::to_c_string(thd->wsrep_cs().state()), - wsrep::to_c_string(thd->wsrep_cs().mode()), - wsrep::to_c_string(thd->wsrep_cs().transaction().state()), - wsrep_thd_query(thd)); if (wsrep_is_real(thd, all) && wsrep_thd_is_local(thd) && @@ -3883,14 +3940,40 @@ !thd->internal_transaction() && thd->wsrep_trx().state() != wsrep::transaction::s_committed) { - /* Here transaction is either empty (i.e. no changes) or - it was CREATE TABLE with no row binlog format or - we have already aborted transaction e.g. because max writeset size - has been reached. */ - DBUG_ASSERT(!wsrep_has_changes(thd) || - (thd->lex->sql_command == SQLCOM_CREATE_TABLE && - !thd->is_current_stmt_binlog_format_row()) || - thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted); +#ifndef DBUG_OFF + const bool empty= !wsrep_has_changes(thd); + const bool create= thd->lex->sql_command == SQLCOM_CREATE_TABLE && + !thd->is_current_stmt_binlog_format_row(); + const bool aborted= thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted; + const bool ddl_replay= ((sql_command_flags[thd->lex->sql_command] & + (CF_SCHEMA_CHANGE | CF_ADMIN_COMMAND)) && + thd->wsrep_cs().transaction().state() == wsrep::transaction::s_must_replay); + /* Here transaction is either + (1) empty (i.e. no changes) or + (2) it was CREATE TABLE with no row binlog format or + (3) we have already aborted transaction e.g. because max writeset size + has been reached or + (4) it was DDL and got BF aborted and must replay. + */ + if(!(empty || create || aborted || ddl_replay)) + { + WSREP_DEBUG("wsrep_commit_empty: thread: %llu client_state: %s client_mode:" + " %s trans_state: %s error: %s empty: %d create: %d aborted:" + " %d ddl_replay: %d sql: %s", + thd_get_thread_id(thd), + wsrep::to_c_string(thd->wsrep_cs().state()), + wsrep::to_c_string(thd->wsrep_cs().mode()), + wsrep::to_c_string(thd->wsrep_cs().transaction().state()), + wsrep::to_c_string(thd->wsrep_cs().current_error()), + empty, create, aborted, ddl_replay, + wsrep_thd_query(thd)); + + DBUG_ASSERT(empty || // 1 + create || // 2 + aborted || // 3 + ddl_replay); // 4 + } +#endif /* DBUG_OFF */ bool have_error= wsrep_current_error(thd); int ret= wsrep_before_rollback(thd, all) || wsrep_after_rollback(thd, all) || @@ -3904,10 +3987,10 @@ DBUG_ASSERT(wsrep_current_error(thd) == wsrep::e_deadlock_error); thd->wsrep_cs().reset_error(); } + if (ret) - { - WSREP_DEBUG("wsrep_commit_empty failed: %d", wsrep_current_error(thd)); - } + WSREP_DEBUG("wsrep_commit_empty failed: %s", + wsrep::to_c_string(thd->wsrep_cs().current_error())); } DBUG_VOID_RETURN; } diff -Nru mariadb-10.11.6/sql/wsrep_mysqld.h mariadb-10.11.9/sql/wsrep_mysqld.h --- mariadb-10.11.6/sql/wsrep_mysqld.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_mysqld.h 2024-08-03 07:29:59.000000000 +0000 @@ -162,7 +162,8 @@ int wsrep_show_status(THD *thd, SHOW_VAR *var, void *buff, system_status_var *status_var, enum_var_type scope); -int wsrep_show_ready(THD *thd, SHOW_VAR *var, char *buff); +int wsrep_show_ready(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type); void wsrep_free_status(THD *thd); void wsrep_update_cluster_state_uuid(const char* str); @@ -503,17 +504,10 @@ bool wsrep_check_gtid_seqno(const uint32&, const uint32&, uint64&); bool wsrep_get_binlog_gtid_seqno(wsrep_server_gtid_t&); -typedef struct wsrep_key_arr -{ - wsrep_key_t* keys; - size_t keys_len; -} wsrep_key_arr_t; -bool wsrep_prepare_keys_for_isolation(THD* thd, - const char* db, - const char* table, - const TABLE_LIST* table_list, - wsrep_key_arr_t* ka); -void wsrep_keys_free(wsrep_key_arr_t* key_arr); +int wsrep_append_table_keys(THD* thd, + TABLE_LIST* first_table, + TABLE_LIST* table_list, + Wsrep_service_key_type key_type); extern void wsrep_handle_mdl_conflict(MDL_context *requestor_ctx, diff -Nru mariadb-10.11.6/sql/wsrep_notify.cc mariadb-10.11.9/sql/wsrep_notify.cc --- mariadb-10.11.6/sql/wsrep_notify.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_notify.cc 2024-08-03 07:29:59.000000000 +0000 @@ -28,7 +28,7 @@ if (!view) { WSREP_DEBUG("wsrep_notify_status server not yet ready : wsrep_ready=%d status %d", - wsrep_ready, (int)status); + (int) wsrep_ready_get(), (int)status); return; } diff -Nru mariadb-10.11.6/sql/wsrep_plugin.cc mariadb-10.11.9/sql/wsrep_plugin.cc --- mariadb-10.11.6/sql/wsrep_plugin.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_plugin.cc 2024-08-03 07:29:59.000000000 +0000 @@ -18,18 +18,6 @@ #include -static int wsrep_plugin_init(void *p) -{ - WSREP_DEBUG("wsrep_plugin_init()"); - return 0; -} - -static int wsrep_plugin_deinit(void *p) -{ - WSREP_DEBUG("wsrep_plugin_deinit()"); - return 0; -} - struct Mysql_replication wsrep_plugin= { MYSQL_REPLICATION_INTERFACE_VERSION }; @@ -42,8 +30,8 @@ "Codership Oy", "Wsrep replication plugin", PLUGIN_LICENSE_GPL, - wsrep_plugin_init, - wsrep_plugin_deinit, + NULL, + NULL, 0x0100, NULL, /* Status variables */ NULL, /* System variables */ diff -Nru mariadb-10.11.6/sql/wsrep_schema.cc mariadb-10.11.9/sql/wsrep_schema.cc --- mariadb-10.11.6/sql/wsrep_schema.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_schema.cc 2024-08-03 07:29:59.000000000 +0000 @@ -163,6 +163,24 @@ my_bool m_wsrep_on; }; +class wsrep_ignore_table +{ +public: + wsrep_ignore_table(THD* thd) + : m_thd(thd) + , m_wsrep_ignore_table(thd->wsrep_ignore_table) + { + thd->wsrep_ignore_table= true; + } + ~wsrep_ignore_table() + { + m_thd->wsrep_ignore_table= m_wsrep_ignore_table; + } +private: + THD* m_thd; + my_bool m_wsrep_ignore_table; +}; + class thd_server_status { public: @@ -272,25 +290,17 @@ close_thread_tables(thd); } -static int open_table(THD* thd, - const LEX_CSTRING *schema_name, - const LEX_CSTRING *table_name, - enum thr_lock_type const lock_type, - TABLE** table) { - assert(table); - *table= NULL; - +static int open_table(THD *thd, const LEX_CSTRING *schema_name, + const LEX_CSTRING *table_name, + enum thr_lock_type const lock_type, + TABLE_LIST *table_list) +{ + assert(table_list); DBUG_ENTER("Wsrep_schema::open_table()"); - - TABLE_LIST tables; - uint flags= (MYSQL_OPEN_IGNORE_GLOBAL_READ_LOCK | - MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY | - MYSQL_OPEN_IGNORE_FLUSH | - MYSQL_LOCK_IGNORE_TIMEOUT); - - tables.init_one_table(schema_name, - table_name, - NULL, lock_type); + const uint flags= (MYSQL_OPEN_IGNORE_GLOBAL_READ_LOCK | + MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY | + MYSQL_OPEN_IGNORE_FLUSH | MYSQL_LOCK_IGNORE_TIMEOUT); + table_list->init_one_table(schema_name, table_name, NULL, lock_type); thd->lex->query_tables_own_last= 0; // No need to open table if the query was bf aborted, @@ -300,37 +310,39 @@ (thd->get_stmt_da()->sql_errno() == ER_QUERY_INTERRUPTED)); if (interrupted || - !open_n_lock_single_table(thd, &tables, tables.lock_type, flags)) { + !open_n_lock_single_table(thd, table_list, table_list->lock_type, flags)) + { close_thread_tables(thd); DBUG_RETURN(1); } - *table= tables.table; - (*table)->use_all_columns(); + table_list->table->use_all_columns(); DBUG_RETURN(0); } - -static int open_for_write(THD* thd, const char* table_name, TABLE** table) { +static int open_for_write(THD* thd, const char* table_name, TABLE_LIST* table_list) +{ LEX_CSTRING schema_str= { wsrep_schema_str.c_str(), wsrep_schema_str.length() }; LEX_CSTRING table_str= { table_name, strlen(table_name) }; if (Wsrep_schema_impl::open_table(thd, &schema_str, &table_str, TL_WRITE, - table)) { + table_list)) + { // No need to log an error if the query was bf aborted, // thd client will get ER_LOCK_DEADLOCK in the end. const bool interrupted= thd->killed || (thd->is_error() && (thd->get_stmt_da()->sql_errno() == ER_QUERY_INTERRUPTED)); - if (!interrupted) { + if (!interrupted) + { WSREP_ERROR("Failed to open table %s.%s for writing", schema_str.str, table_name); } return 1; } - empty_record(*table); - (*table)->use_all_columns(); - restore_record(*table, s->default_values); + empty_record(table_list->table); + table_list->table->use_all_columns(); + restore_record(table_list->table, s->default_values); return 0; } @@ -479,19 +491,21 @@ return 0; } -static int open_for_read(THD* thd, const char* table_name, TABLE** table) { - +static int open_for_read(THD *thd, const char *table_name, + TABLE_LIST *table_list) +{ LEX_CSTRING schema_str= { wsrep_schema_str.c_str(), wsrep_schema_str.length() }; LEX_CSTRING table_str= { table_name, strlen(table_name) }; if (Wsrep_schema_impl::open_table(thd, &schema_str, &table_str, TL_READ, - table)) { + table_list)) + { WSREP_ERROR("Failed to open table %s.%s for reading", schema_str.str, table_name); return 1; } - empty_record(*table); - (*table)->use_all_columns(); - restore_record(*table, s->default_values); + empty_record(table_list->table); + table_list->table->use_all_columns(); + restore_record(table_list->table, s->default_values); return 0; } @@ -752,8 +766,10 @@ assert(view.status() == Wsrep_view::primary); int ret= 1; int error; + TABLE_LIST cluster_table_l; TABLE* cluster_table= 0; - TABLE* members_table= 0; + TABLE_LIST members_table_l; + TABLE* members_table = 0; #ifdef WSREP_SCHEMA_MEMBERS_HISTORY TABLE* members_history_table= 0; #endif /* WSREP_SCHEMA_MEMBERS_HISTORY */ @@ -762,6 +778,12 @@ Wsrep_schema_impl::binlog_off binlog_off(thd); Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd); + if (trans_begin(thd, MYSQL_START_TRANS_OPT_READ_WRITE)) + { + WSREP_ERROR("Failed to start transaction for store view"); + goto out_not_started; + } + /* Clean up cluster table and members table. */ @@ -778,11 +800,13 @@ Store cluster view info */ Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_write(thd, cluster_table_str.c_str(), &cluster_table)) + if (Wsrep_schema_impl::open_for_write(thd, cluster_table_str.c_str(), &cluster_table_l)) { goto out; } + cluster_table= cluster_table_l.table; + Wsrep_schema_impl::store(cluster_table, 0, view.state_id().id()); Wsrep_schema_impl::store(cluster_table, 1, view.view_seqno().get()); Wsrep_schema_impl::store(cluster_table, 2, view.state_id().seqno().get()); @@ -802,12 +826,14 @@ */ Wsrep_schema_impl::init_stmt(thd); if (Wsrep_schema_impl::open_for_write(thd, members_table_str.c_str(), - &members_table)) + &members_table_l)) { WSREP_ERROR("failed to open wsrep.members table"); goto out; } + members_table= members_table_l.table; + for (size_t i= 0; i < view.members().size(); ++i) { Wsrep_schema_impl::store(members_table, 0, view.members()[i].id()); @@ -851,7 +877,22 @@ #endif /* WSREP_SCHEMA_MEMBERS_HISTORY */ ret= 0; out: + if (ret) + { + trans_rollback_stmt(thd); + if (!trans_rollback(thd)) + { + close_thread_tables(thd); + } + } + else if (trans_commit(thd)) + { + ret= 1; + WSREP_ERROR("Failed to commit transaction for store view"); + } + thd->release_transactional_locks(); +out_not_started: DBUG_RETURN(ret); } @@ -861,8 +902,10 @@ int ret= 1; int error; + TABLE_LIST cluster_table_l; TABLE* cluster_table= 0; bool end_cluster_scan= false; + TABLE_LIST members_table_l; TABLE* members_table= 0; bool end_members_scan= false; @@ -888,8 +931,12 @@ Read cluster info from cluster table */ Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_read(thd, cluster_table_str.c_str(), &cluster_table) || - Wsrep_schema_impl::init_for_scan(cluster_table)) { + if (Wsrep_schema_impl::open_for_read(thd, cluster_table_str.c_str(), &cluster_table_l)) { + goto out; + } + cluster_table = cluster_table_l.table; + + if (Wsrep_schema_impl::init_for_scan(cluster_table)) { goto out; } @@ -913,8 +960,14 @@ Read members from members table */ Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_read(thd, members_table_str.c_str(), &members_table) || - Wsrep_schema_impl::init_for_scan(members_table)) { + if (Wsrep_schema_impl::open_for_read(thd, members_table_str.c_str(), + &members_table_l)) + { + goto out; + } + + members_table= members_table_l.table; + if (Wsrep_schema_impl::init_for_scan(members_table)) { goto out; } end_members_scan= true; @@ -1018,14 +1071,15 @@ Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd); Wsrep_schema_impl::init_stmt(thd); - TABLE* frag_table= 0; - if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table)) + TABLE_LIST frag_table_l; + if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table_l)) { trans_rollback_stmt(thd); thd->lex->restore_backup_query_tables_list(&query_tables_list_backup); DBUG_RETURN(1); } + TABLE* frag_table= frag_table_l.table; Wsrep_schema_impl::store(frag_table, 0, server_id); Wsrep_schema_impl::store(frag_table, 1, transaction_id.get()); Wsrep_schema_impl::store(frag_table, 2, seqno.get()); @@ -1069,13 +1123,15 @@ uchar *key=NULL; key_part_map key_map= 0; TABLE* frag_table= 0; + TABLE_LIST frag_table_l; Wsrep_schema_impl::init_stmt(thd); - if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table)) + if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table_l)) { thd->lex->restore_backup_query_tables_list(&query_tables_list_backup); DBUG_RETURN(1); } + frag_table= frag_table_l.table; /* Find record with the given uuid, trx id, and seqno -1 */ Wsrep_schema_impl::store(frag_table, 0, ws_meta.server_id()); @@ -1163,7 +1219,10 @@ seqno.get(), error); } - ret= error; + else + { + ret= error; + } } else if (Wsrep_schema_impl::delete_row(frag_table)) { @@ -1185,7 +1244,7 @@ int ret= 0; WSREP_DEBUG("Removing %zu fragments", fragments.size()); - Wsrep_schema_impl::wsrep_off wsrep_off(thd); + Wsrep_schema_impl::wsrep_ignore_table wsrep_ignore_table(thd); Wsrep_schema_impl::binlog_off binlog_off(thd); Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd); @@ -1195,12 +1254,14 @@ thd->reset_n_backup_open_tables_state(&open_tables_backup); TABLE* frag_table= 0; - if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table)) + TABLE_LIST frag_table_l; + if (Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), &frag_table_l)) { ret= 1; } else { + frag_table= frag_table_l.table; for (std::vector::const_iterator i= fragments.begin(); i != fragments.end(); ++i) { @@ -1243,40 +1304,35 @@ DBUG_RETURN(ret); } -int Wsrep_schema::replay_transaction(THD* orig_thd, - Relay_log_info* rli, - const wsrep::ws_meta& ws_meta, - const std::vector& fragments) +static int replay_transaction(THD* thd, + THD* orig_thd, + Relay_log_info* rli, + const wsrep::ws_meta& ws_meta, + const std::vector& fragments) { - DBUG_ENTER("Wsrep_schema::replay_transaction"); - DBUG_ASSERT(!fragments.empty()); - - THD thd(next_thread_id(), true); - thd.thread_stack= (orig_thd ? orig_thd->thread_stack : - (char*) &thd); - wsrep_assign_from_threadvars(&thd); - - Wsrep_schema_impl::wsrep_off wsrep_off(&thd); - Wsrep_schema_impl::binlog_off binlog_off(&thd); - Wsrep_schema_impl::sql_safe_updates sql_safe_updates(&thd); - Wsrep_schema_impl::thd_context_switch thd_context_switch(orig_thd, &thd); + Wsrep_schema_impl::wsrep_off wsrep_off(thd); + Wsrep_schema_impl::binlog_off binlog_off(thd); + Wsrep_schema_impl::sql_safe_updates sql_safe_updates(thd); + Wsrep_schema_impl::thd_context_switch thd_context_switch(orig_thd, thd); int ret= 1; int error; TABLE* frag_table= 0; + TABLE_LIST frag_table_l; uchar *key=NULL; key_part_map key_map= 0; for (std::vector::const_iterator i= fragments.begin(); i != fragments.end(); ++i) { - Wsrep_schema_impl::init_stmt(&thd); - if ((error= Wsrep_schema_impl::open_for_read(&thd, sr_table_str.c_str(), &frag_table))) + Wsrep_schema_impl::init_stmt(thd); + if ((error= Wsrep_schema_impl::open_for_read(thd, sr_table_str.c_str(), &frag_table_l))) { WSREP_WARN("Could not open SR table for read: %d", error); - Wsrep_schema_impl::finish_stmt(&thd); - DBUG_RETURN(1); + Wsrep_schema_impl::finish_stmt(thd); + return 1; } + frag_table= frag_table_l.table; Wsrep_schema_impl::store(frag_table, 0, ws_meta.server_id()); Wsrep_schema_impl::store(frag_table, 1, ws_meta.transaction_id().get()); @@ -1305,7 +1361,7 @@ frag_table->field[4]->val_str(&buf); { - Wsrep_schema_impl::thd_context_switch thd_context_switch(&thd, orig_thd); + Wsrep_schema_impl::thd_context_switch thd_context_switch(thd, orig_thd); ret= wsrep_apply_events(orig_thd, rli, buf.ptr(), buf.length()); if (ret) @@ -1316,18 +1372,20 @@ } Wsrep_schema_impl::end_index_scan(frag_table); - Wsrep_schema_impl::finish_stmt(&thd); + Wsrep_schema_impl::finish_stmt(thd); - Wsrep_schema_impl::init_stmt(&thd); + Wsrep_schema_impl::init_stmt(thd); - if ((error= Wsrep_schema_impl::open_for_write(&thd, + if ((error= Wsrep_schema_impl::open_for_write(thd, sr_table_str.c_str(), - &frag_table))) + &frag_table_l))) { WSREP_WARN("Could not open SR table for write: %d", error); - Wsrep_schema_impl::finish_stmt(&thd); - DBUG_RETURN(1); + Wsrep_schema_impl::finish_stmt(thd); + ret= 1; + break; } + frag_table= frag_table_l.table; error= Wsrep_schema_impl::init_for_index_scan(frag_table, key, @@ -1351,86 +1409,120 @@ break; } Wsrep_schema_impl::end_index_scan(frag_table); - Wsrep_schema_impl::finish_stmt(&thd); + Wsrep_schema_impl::finish_stmt(thd); my_free(key); key= NULL; } if (key) my_free(key); + + return ret; +} + +int Wsrep_schema::replay_transaction(THD* orig_thd, + Relay_log_info* rli, + const wsrep::ws_meta& ws_meta, + const std::vector& fragments) +{ + DBUG_ENTER("Wsrep_schema::replay_transaction"); + DBUG_ASSERT(!fragments.empty()); + + THD *thd= new THD(next_thread_id(), true); + if (!thd) + { + WSREP_WARN("Could not allocate memory for THD"); + DBUG_RETURN(1); + } + + thd->thread_stack= (orig_thd ? orig_thd->thread_stack : (char *) &thd); + wsrep_assign_from_threadvars(thd); + + int ret= ::replay_transaction(thd, orig_thd, rli, ws_meta, fragments); + + delete thd; DBUG_RETURN(ret); } -int Wsrep_schema::recover_sr_transactions(THD *orig_thd) +static int recover_sr_transactions(THD* storage_thd, THD* orig_thd) { - DBUG_ENTER("Wsrep_schema::recover_sr_transactions"); - THD storage_thd(next_thread_id(), true); - storage_thd.thread_stack= (orig_thd ? orig_thd->thread_stack : - (char*) &storage_thd); - wsrep_assign_from_threadvars(&storage_thd); TABLE* frag_table= 0; + TABLE_LIST frag_table_l; TABLE* cluster_table= 0; - Wsrep_storage_service storage_service(&storage_thd); - Wsrep_schema_impl::binlog_off binlog_off(&storage_thd); - Wsrep_schema_impl::wsrep_off wsrep_off(&storage_thd); - Wsrep_schema_impl::sql_safe_updates sql_safe_updates(&storage_thd); + TABLE_LIST cluster_table_l; + Wsrep_storage_service storage_service(storage_thd); + Wsrep_schema_impl::binlog_off binlog_off(storage_thd); + Wsrep_schema_impl::wsrep_off wsrep_off(storage_thd); + Wsrep_schema_impl::sql_safe_updates sql_safe_updates(storage_thd); Wsrep_schema_impl::thd_context_switch thd_context_switch(orig_thd, - &storage_thd); + storage_thd); Wsrep_server_state& server_state(Wsrep_server_state::instance()); int ret= 1; int error; wsrep::id cluster_id; - Wsrep_schema_impl::init_stmt(&storage_thd); - storage_thd.wsrep_skip_locking= FALSE; - if (Wsrep_schema_impl::open_for_read(&storage_thd, - cluster_table_str.c_str(), - &cluster_table) || - Wsrep_schema_impl::init_for_scan(cluster_table)) + Wsrep_schema_impl::init_stmt(storage_thd); + storage_thd->wsrep_skip_locking= FALSE; + if (Wsrep_schema_impl::open_for_read(storage_thd, cluster_table_str.c_str(), + &cluster_table_l)) { - Wsrep_schema_impl::finish_stmt(&storage_thd); - DBUG_RETURN(1); + Wsrep_schema_impl::finish_stmt(storage_thd); + return 1; + } + cluster_table= cluster_table_l.table; + + if (Wsrep_schema_impl::init_for_scan(cluster_table)) + { + Wsrep_schema_impl::finish_stmt(storage_thd); + return 1; } if ((error= Wsrep_schema_impl::next_record(cluster_table))) { Wsrep_schema_impl::end_scan(cluster_table); - Wsrep_schema_impl::finish_stmt(&storage_thd); - trans_commit(&storage_thd); + Wsrep_schema_impl::finish_stmt(storage_thd); + trans_commit(storage_thd); if (error == HA_ERR_END_OF_FILE) { WSREP_INFO("Cluster table is empty, not recovering transactions"); - DBUG_RETURN(0); + return 0; } else { WSREP_ERROR("Failed to read cluster table: %d", error); - DBUG_RETURN(1); + return 1; } } Wsrep_schema_impl::scan(cluster_table, 0, cluster_id); Wsrep_schema_impl::end_scan(cluster_table); - Wsrep_schema_impl::finish_stmt(&storage_thd); + Wsrep_schema_impl::finish_stmt(storage_thd); std::ostringstream os; os << cluster_id; WSREP_INFO("Recovered cluster id %s", os.str().c_str()); - storage_thd.wsrep_skip_locking= TRUE; - Wsrep_schema_impl::init_stmt(&storage_thd); + storage_thd->wsrep_skip_locking= TRUE; + Wsrep_schema_impl::init_stmt(storage_thd); /* Open the table for reading and writing so that fragments without valid seqno can be deleted. */ - if (Wsrep_schema_impl::open_for_write(&storage_thd, sr_table_str.c_str(), &frag_table) || - Wsrep_schema_impl::init_for_scan(frag_table)) + if (Wsrep_schema_impl::open_for_write(storage_thd, sr_table_str.c_str(), + &frag_table_l)) { WSREP_ERROR("Failed to open SR table for write"); goto out; } + frag_table= frag_table_l.table; + + if (Wsrep_schema_impl::init_for_scan(frag_table)) + { + WSREP_ERROR("Failed to init for index scan"); + goto out; + } while (0 == error) { @@ -1474,7 +1566,7 @@ transaction_id))) { DBUG_ASSERT(wsrep::starts_transaction(flags)); - applier = wsrep_create_streaming_applier(&storage_thd, "recovery"); + applier = wsrep_create_streaming_applier(storage_thd, "recovery"); server_state.start_streaming_applier(server_id, transaction_id, applier); applier->start_transaction(wsrep::ws_handle(transaction_id, 0), @@ -1502,10 +1594,30 @@ } } Wsrep_schema_impl::end_scan(frag_table); - Wsrep_schema_impl::finish_stmt(&storage_thd); - trans_commit(&storage_thd); - storage_thd.set_mysys_var(0); + Wsrep_schema_impl::finish_stmt(storage_thd); + trans_commit(storage_thd); + storage_thd->set_mysys_var(0); out: + return ret; +} + +int Wsrep_schema::recover_sr_transactions(THD *orig_thd) +{ + DBUG_ENTER("Wsrep_schema::recover_sr_transactions"); + + THD *storage_thd= new THD(next_thread_id(), true); + if (!storage_thd) + { + WSREP_WARN("Could not allocate memory for THD"); + DBUG_RETURN(1); + } + storage_thd->thread_stack= + (orig_thd ? orig_thd->thread_stack : (char *) &storage_thd); + wsrep_assign_from_threadvars(storage_thd); + + int ret= ::recover_sr_transactions(storage_thd, orig_thd); + + delete storage_thd; DBUG_RETURN(ret); } @@ -1521,13 +1633,15 @@ thd->thread_stack= (char*)&thd; wsrep_init_thd_for_schema(thd); TABLE* allowlist_table= 0; + TABLE_LIST allowlist_table_l; int error= 0; Wsrep_schema_impl::init_stmt(thd); if (Wsrep_schema_impl::open_for_write(thd, allowlist_table_str.c_str(), - &allowlist_table) || - Wsrep_schema_impl::init_for_scan(allowlist_table)) + &allowlist_table_l) || + (allowlist_table= allowlist_table_l.table, + Wsrep_schema_impl::init_for_scan(allowlist_table))) { WSREP_ERROR("Failed to open mysql.wsrep_allowlist table"); goto out; @@ -1567,14 +1681,16 @@ thd->thread_stack= (char*)&thd; wsrep_init_thd_for_schema(thd); TABLE* allowlist_table= 0; + TABLE_LIST allowlist_table_l; int error; Wsrep_schema_impl::init_stmt(thd); if (Wsrep_schema_impl::open_for_write(thd, allowlist_table_str.c_str(), - &allowlist_table)) + &allowlist_table_l)) { WSREP_ERROR("Failed to open mysql.wsrep_allowlist table"); goto out; } + allowlist_table= allowlist_table_l.table; for (size_t i= 0; i < ip_allowlist.size(); ++i) { Wsrep_schema_impl::store(allowlist_table, 0, ip_allowlist[i]); @@ -1618,6 +1734,7 @@ int error; TABLE *allowlist_table= 0; + TABLE_LIST allowlist_table_l; bool match_found_or_empty= false; bool table_have_rows= false; char row[64]= { @@ -1629,8 +1746,9 @@ */ Wsrep_schema_impl::init_stmt(&thd); if (Wsrep_schema_impl::open_for_read(&thd, allowlist_table_str.c_str(), - &allowlist_table) || - Wsrep_schema_impl::init_for_scan(allowlist_table)) + &allowlist_table_l) || + (allowlist_table= allowlist_table_l.table, + Wsrep_schema_impl::init_for_scan(allowlist_table))) { goto out; } diff -Nru mariadb-10.11.6/sql/wsrep_server_service.cc mariadb-10.11.9/sql/wsrep_server_service.cc --- mariadb-10.11.6/sql/wsrep_server_service.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_server_service.cc 2024-08-03 07:29:59.000000000 +0000 @@ -39,7 +39,7 @@ thd->thread_stack= thread_stack; thd->real_id= pthread_self(); thd->prior_thr_create_utime= thd->start_utime= microsecond_interval_timer(); - thd->set_command(COM_SLEEP); + thd->mark_connection_idle(); thd->reset_for_next_command(true); server_threads.insert(thd); // as wsrep_innobase_kill_one_trx() uses find_thread_by_id() } @@ -239,29 +239,9 @@ view.state_id().seqno().get() >= prev_view.state_id().seqno().get()); } - if (trans_begin(applier->m_thd, MYSQL_START_TRANS_OPT_READ_WRITE)) + if (wsrep_schema->store_view(applier->m_thd, view)) { - WSREP_WARN("Failed to start transaction for store view"); - } - else - { - if (wsrep_schema->store_view(applier->m_thd, view)) - { - WSREP_WARN("Failed to store view"); - trans_rollback_stmt(applier->m_thd); - if (!trans_rollback(applier->m_thd)) - { - close_thread_tables(applier->m_thd); - } - } - else - { - if (trans_commit(applier->m_thd)) - { - WSREP_WARN("Failed to commit transaction for store view"); - } - } - applier->m_thd->release_transactional_locks(); + WSREP_WARN("Failed to store view"); } /* @@ -345,7 +325,6 @@ switch (current_state) { case Wsrep_server_state::s_synced: - wsrep_ready= TRUE; WSREP_INFO("Synchronized with group, ready for connections"); wsrep_ready_set(true); /* fall through */ diff -Nru mariadb-10.11.6/sql/wsrep_server_service.h mariadb-10.11.9/sql/wsrep_server_service.h --- mariadb-10.11.6/sql/wsrep_server_service.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_server_service.h 2024-08-03 07:29:59.000000000 +0000 @@ -32,49 +32,49 @@ : m_server_state(server_state) { } - wsrep::storage_service* storage_service(wsrep::client_service&); + wsrep::storage_service* storage_service(wsrep::client_service&) override; - wsrep::storage_service* storage_service(wsrep::high_priority_service&); + wsrep::storage_service* storage_service(wsrep::high_priority_service&) override; - void release_storage_service(wsrep::storage_service*); + void release_storage_service(wsrep::storage_service*) override; wsrep::high_priority_service* - streaming_applier_service(wsrep::client_service&); + streaming_applier_service(wsrep::client_service&) override; wsrep::high_priority_service* - streaming_applier_service(wsrep::high_priority_service&); + streaming_applier_service(wsrep::high_priority_service&) override; - void release_high_priority_service(wsrep::high_priority_service*); + void release_high_priority_service(wsrep::high_priority_service*) override; void background_rollback(wsrep::unique_lock &, - wsrep::client_state &); + wsrep::client_state &) override; - void bootstrap(); - void log_message(enum wsrep::log::level, const char*); + void bootstrap() override; + void log_message(enum wsrep::log::level, const char*) override; - void log_dummy_write_set(wsrep::client_state&, const wsrep::ws_meta&) + void log_dummy_write_set(wsrep::client_state&, const wsrep::ws_meta&) override { throw wsrep::not_implemented_error(); } - void log_view(wsrep::high_priority_service*, const wsrep::view&); + void log_view(wsrep::high_priority_service*, const wsrep::view&) override; - void recover_streaming_appliers(wsrep::client_service&); - void recover_streaming_appliers(wsrep::high_priority_service&); - wsrep::view get_view(wsrep::client_service&, const wsrep::id& own_id); + void recover_streaming_appliers(wsrep::client_service&) override; + void recover_streaming_appliers(wsrep::high_priority_service&) override; + wsrep::view get_view(wsrep::client_service&, const wsrep::id& own_id) override; - wsrep::gtid get_position(wsrep::client_service&); - void set_position(wsrep::client_service&, const wsrep::gtid&); + wsrep::gtid get_position(wsrep::client_service&) override; + void set_position(wsrep::client_service&, const wsrep::gtid&) override; void log_state_change(enum wsrep::server_state::state, - enum wsrep::server_state::state); + enum wsrep::server_state::state) override; - bool sst_before_init() const; + bool sst_before_init() const override; - std::string sst_request(); - int start_sst(const std::string&, const wsrep::gtid&, bool); + std::string sst_request() override; + int start_sst(const std::string&, const wsrep::gtid&, bool) override; - int wait_committing_transactions(int); + int wait_committing_transactions(int) override; - void debug_sync(const char*); + void debug_sync(const char*) override; private: Wsrep_server_state& m_server_state; }; diff -Nru mariadb-10.11.6/sql/wsrep_sst.cc mariadb-10.11.9/sql/wsrep_sst.cc --- mariadb-10.11.6/sql/wsrep_sst.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_sst.cc 2024-08-03 07:29:59.000000000 +0000 @@ -732,7 +732,9 @@ { proc.wait(); // Read state ID (UUID:SEQNO) followed by wsrep_gtid_domain_id (if any). + unsigned long int domain_id= wsrep_gtid_domain_id; const char *pos= strchr(out, ' '); + WSREP_DEBUG("SST state ID tmp=%s out=%s pos=%p", tmp, out, pos); if (!pos) { @@ -742,6 +744,13 @@ WSREP_WARN("Did not find domain ID from SST script output '%s'. " "Domain ID must be set manually to keep binlog consistent", out); + if (wsrep_gtid_domain_id) + { + WSREP_INFO("This node is configured to use wsrep_gtid_domain_id=%lu by user.", + domain_id); + wsrep_gtid_server.domain_id= (uint32)domain_id; + wsrep_gtid_domain_id= (uint32)domain_id; + } } err= sst_scan_uuid_seqno (out, &ret_uuid, &ret_seqno); @@ -1769,6 +1778,8 @@ char content[100]; snprintf(content, sizeof(content), "%s:%lld %d\n", wsrep_cluster_state_uuid, (long long)wsrep_locked_seqno, wsrep_gtid_server.domain_id); + WSREP_DEBUG("sst_flush_tables : %s:%lld %d", wsrep_cluster_state_uuid, + (long long)wsrep_locked_seqno, wsrep_gtid_server.domain_id); err= sst_create_file(flush_success, content); if (err) diff -Nru mariadb-10.11.6/sql/wsrep_storage_service.h mariadb-10.11.9/sql/wsrep_storage_service.h --- mariadb-10.11.6/sql/wsrep_storage_service.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_storage_service.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,19 +28,19 @@ public: Wsrep_storage_service(THD*); ~Wsrep_storage_service(); - int start_transaction(const wsrep::ws_handle&); - void adopt_transaction(const wsrep::transaction&); + int start_transaction(const wsrep::ws_handle&) override; + void adopt_transaction(const wsrep::transaction&) override; int append_fragment(const wsrep::id&, wsrep::transaction_id, int flags, const wsrep::const_buffer&, - const wsrep::xid&); - int update_fragment_meta(const wsrep::ws_meta&); - int remove_fragments(); - int commit(const wsrep::ws_handle&, const wsrep::ws_meta&); - int rollback(const wsrep::ws_handle&, const wsrep::ws_meta&); - void store_globals(); - void reset_globals(); + const wsrep::xid&) override; + int update_fragment_meta(const wsrep::ws_meta&) override; + int remove_fragments() override; + int commit(const wsrep::ws_handle&, const wsrep::ws_meta&) override; + int rollback(const wsrep::ws_handle&, const wsrep::ws_meta&) override; + void store_globals() override; + void reset_globals() override; private: friend class Wsrep_server_service; THD* m_thd; diff -Nru mariadb-10.11.6/sql/wsrep_thd.cc mariadb-10.11.9/sql/wsrep_thd.cc --- mariadb-10.11.6/sql/wsrep_thd.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_thd.cc 2024-08-03 07:29:59.000000000 +0000 @@ -36,7 +36,7 @@ static Atomic_counter wsrep_bf_aborts_counter; -int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff, +int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, void *, system_status_var *, enum enum_var_type scope) { wsrep_local_bf_aborts= wsrep_bf_aborts_counter; @@ -487,6 +487,7 @@ thd->wsrep_trx().state() != wsrep::transaction::s_must_replay) { thd->wsrep_abort_by_kill= thd->killed; + my_free(thd->wsrep_abort_by_kill_err); thd->wsrep_abort_by_kill_err= thd->killed_err; thd->killed= NOT_KILLED; thd->killed_err= 0; @@ -499,6 +500,7 @@ DBUG_ASSERT(WSREP(thd)); mysql_mutex_assert_owner(&thd->LOCK_thd_kill); thd->killed= thd->wsrep_abort_by_kill; + my_free(thd->killed_err); thd->killed_err= thd->wsrep_abort_by_kill_err; thd->wsrep_abort_by_kill= NOT_KILLED; thd->wsrep_abort_by_kill_err= 0; diff -Nru mariadb-10.11.6/sql/wsrep_thd.h mariadb-10.11.9/sql/wsrep_thd.h --- mariadb-10.11.6/sql/wsrep_thd.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_thd.h 2024-08-03 07:29:59.000000000 +0000 @@ -82,7 +82,7 @@ mysql_cond_t COND_wsrep_thd_queue; }; -int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, char *buff, +int wsrep_show_bf_aborts (THD *thd, SHOW_VAR *var, void *, system_status_var *, enum enum_var_type scope); bool wsrep_create_appliers(long threads, bool mutex_protected=false); void wsrep_create_rollbacker(); diff -Nru mariadb-10.11.6/sql/wsrep_trans_observer.h mariadb-10.11.9/sql/wsrep_trans_observer.h --- mariadb-10.11.6/sql/wsrep_trans_observer.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/wsrep_trans_observer.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,7 +91,13 @@ */ static inline bool wsrep_has_changes(THD* thd) { - return (thd->wsrep_trx().is_empty() == false); + // Transaction has changes to replicate if it + // has appended one or more certification keys, + // and has actual changes to replicate in binlog + // cache. Except for streaming replication, + // where commit message may have no payload. + return !thd->wsrep_trx().is_empty() && + (!wsrep_is_binlog_cache_empty(thd) || thd->wsrep_trx().is_streaming()); } /* diff -Nru mariadb-10.11.6/sql/xa.cc mariadb-10.11.9/sql/xa.cc --- mariadb-10.11.6/sql/xa.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/xa.cc 2024-08-03 07:29:59.000000000 +0000 @@ -126,10 +126,11 @@ } return true; } - static void lf_hash_initializer(LF_HASH *hash __attribute__((unused)), - XID_cache_element *element, - XID_cache_insert_element *new_element) + static void lf_hash_initializer(LF_HASH *, void *el, const void *ie) { + XID_cache_element *element= static_cast(el); + XID_cache_insert_element *new_element= + static_cast(const_cast(ie)); DBUG_ASSERT(!element->is_set(ACQUIRED | RECOVERED)); element->rm_error= 0; element->xa_state= new_element->xa_state; @@ -146,11 +147,11 @@ DBUG_ASSERT(!reinterpret_cast(ptr + LF_HASH_OVERHEAD) ->is_set(ACQUIRED)); } - static uchar *key(const XID_cache_element *element, size_t *length, - my_bool not_used __attribute__((unused))) + static uchar *key(const unsigned char *el, size_t *length, my_bool) { - *length= element->xid.key_length(); - return element->xid.key(); + const XID &xid= reinterpret_cast(el)->xid; + *length= xid.key_length(); + return xid.key(); } }; @@ -179,6 +180,13 @@ xid_cache_element->rm_error= error; } +void XID_STATE::set_rollback_only() +{ + xid_cache_element->xa_state= XA_ROLLBACK_ONLY; + if (current_thd) + MYSQL_SET_TRANSACTION_XA_STATE(current_thd->m_transaction_psi, + XA_ROLLBACK_ONLY); +} void XID_STATE::er_xaer_rmfail() const { @@ -221,11 +229,10 @@ { xid_cache_inited= true; lf_hash_init(&xid_cache, sizeof(XID_cache_element), LF_HASH_UNIQUE, 0, 0, - (my_hash_get_key) XID_cache_element::key, &my_charset_bin); + XID_cache_element::key, &my_charset_bin); xid_cache.alloc.constructor= XID_cache_element::lf_alloc_constructor; xid_cache.alloc.destructor= XID_cache_element::lf_alloc_destructor; - xid_cache.initializer= - (lf_hash_initializer) XID_cache_element::lf_hash_initializer; + xid_cache.initializer= XID_cache_element::lf_hash_initializer; } @@ -331,9 +338,10 @@ void *argument; }; -static my_bool xid_cache_iterate_callback(XID_cache_element *element, - xid_cache_iterate_arg *arg) +static my_bool xid_cache_iterate_callback(void *el, void *a) { + XID_cache_element *element= static_cast(el); + xid_cache_iterate_arg *arg= static_cast(a); my_bool res= FALSE; if (element->lock()) { @@ -348,8 +356,7 @@ xid_cache_iterate_arg argument= { action, arg }; return thd->fix_xid_hash_pins() ? -1 : lf_hash_iterate(&xid_cache, thd->xid_hash_pins, - (my_hash_walk_action) xid_cache_iterate_callback, - &argument); + xid_cache_iterate_callback, &argument); } @@ -547,8 +554,21 @@ } else { - thd->transaction->xid_state.xid_cache_element->xa_state= XA_PREPARED; - MYSQL_SET_TRANSACTION_XA_STATE(thd->m_transaction_psi, XA_PREPARED); + if (thd->transaction->xid_state.xid_cache_element->xa_state != + XA_ROLLBACK_ONLY) + { + thd->transaction->xid_state.xid_cache_element->xa_state= XA_PREPARED; + MYSQL_SET_TRANSACTION_XA_STATE(thd->m_transaction_psi, XA_PREPARED); + } + else + { + /* + In the non-err case, XA_ROLLBACK_ONLY should only be set by a slave + thread which prepared an empty transaction, to prevent binlogging a + standalone XA COMMIT. + */ + DBUG_ASSERT(thd->rgi_slave && !(thd->transaction->all.ha_list)); + } res= thd->variables.pseudo_slave_mode || thd->slave_thread ? slave_applier_reset_xa_trans(thd) : 0; } @@ -1039,17 +1059,19 @@ } -static my_bool xa_recover_callback_short(XID_cache_element *xs, - Protocol *protocol) +static my_bool xa_recover_callback_short(void *x, void *p) { + XID_cache_element *xs= static_cast(x); + Protocol *protocol= static_cast(p); return xa_recover_callback(xs, protocol, xs->xid.data, xs->xid.gtrid_length + xs->xid.bqual_length, &my_charset_bin); } -static my_bool xa_recover_callback_verbose(XID_cache_element *xs, - Protocol *protocol) +static my_bool xa_recover_callback_verbose(void *x, void *p) { + XID_cache_element *xs= static_cast(x); + Protocol *protocol= static_cast(p); char buf[SQL_XIDSIZE]; uint len= get_sql_xid(&xs->xid, buf); return xa_recover_callback(xs, protocol, buf, len, @@ -1089,14 +1111,14 @@ len= SQL_XIDSIZE; cs= &my_charset_utf8mb3_general_ci; if (action) - *action= (my_hash_walk_action) xa_recover_callback_verbose; + *action= xa_recover_callback_verbose; } else { len= XIDDATASIZE; cs= &my_charset_bin; if (action) - *action= (my_hash_walk_action) xa_recover_callback_short; + *action= xa_recover_callback_short; } field_list->push_back(new (mem_root) diff -Nru mariadb-10.11.6/sql/xa.h mariadb-10.11.9/sql/xa.h --- mariadb-10.11.6/sql/xa.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql/xa.h 2024-08-03 07:29:59.000000000 +0000 @@ -34,6 +34,7 @@ bool check_has_uncommitted_xa() const; bool is_explicit_XA() const { return xid_cache_element != 0; } void set_error(uint error); + void set_rollback_only(); void er_xaer_rmfail() const; XID *get_xid() const; enum xa_states get_state_code() const; diff -Nru mariadb-10.11.6/sql/yy_mariadb.cc mariadb-10.11.9/sql/yy_mariadb.cc --- mariadb-10.11.6/sql/yy_mariadb.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/yy_mariadb.cc 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1,52203 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 3 of the License, 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 + +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "/home/buildbot/git/mkdist/sql/myskel.m4" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse MYSQLparse +#define yylex MYSQLlex +#define yyerror MYSQLerror +#define yydebug MYSQLdebug +#define yynerrs MYSQLnerrs + +/* First part of user prologue. */ +#line 25 "/home/buildbot/git/sql/sql_yacc.yy" + +#define YYLIP (& thd->m_parser_state->m_lip) +#define YYPS (& thd->m_parser_state->m_yacc) +#define YYCSCL (thd->variables.character_set_client) + +#define MYSQL_YACC +#define YYINITDEPTH 100 +#define YYMAXDEPTH 3200 /* Because of 64K stack */ +#define Lex (thd->lex) + +#define Select Lex->current_select +#include "mariadb.h" +#include "sql_priv.h" +#include "sql_parse.h" /* comp_*_creator */ +#include "sql_table.h" /* primary_key_name */ +#include "sql_partition.h" /* partition_info, HASH_PARTITION */ +#include "sql_class.h" /* Key_part_spec, enum_filetype, Diag_condition_item_name */ +#include "slave.h" +#include "lex_symbol.h" +#include "item_create.h" +#include "sp_head.h" +#include "sp_rcontext.h" +#include "sp.h" +#include "sql_show.h" +#include "sql_alter.h" // Sql_cmd_alter_table* +#include "sql_truncate.h" // Sql_cmd_truncate_table +#include "sql_admin.h" // Sql_cmd_analyze/Check..._table +#include "sql_partition_admin.h" // Sql_cmd_alter_table_*_part. +#include "sql_handler.h" // Sql_cmd_handler_* +#include "sql_signal.h" +#include "sql_get_diagnostics.h" // Sql_cmd_get_diagnostics +#include "sql_cte.h" +#include "sql_window.h" +#include "item_windowfunc.h" +#include "event_parse_data.h" +#include "create_options.h" +#include +#include +#include "keycaches.h" +#include "set_var.h" +#include "rpl_mi.h" +#include "lex_token.h" +#include "sql_lex.h" +#include "sql_sequence.h" +#include "my_base.h" +#include "sql_type_json.h" +#include "json_table.h" + +/* this is to get the bison compilation windows warnings out */ +#ifdef _MSC_VER +/* warning C4065: switch statement contains 'default' but no 'case' labels */ +/* warning C4102: 'yyexhaustedlab': unreferenced label */ +#pragma warning (disable : 4065 4102) +#endif +#if defined (__GNUC__) || defined (__clang__) +#pragma GCC diagnostic ignored "-Wunused-label" /* yyexhaustedlab: */ +#endif + +/* Stack size 28200 with clang for MYSQLparse() and ORAparse() */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + +int yylex(void *yylval, void *yythd); + +#define yyoverflow(A,B,C,D,E,F) \ + { \ + size_t val= *(F); \ + if (unlikely(my_yyoverflow((B), (D), &val))) \ + { \ + yyerror(thd, (char*) (A)); \ + return 2; \ + } \ + else \ + { \ + *(F)= (YYSIZE_T)val; \ + } \ + } + +#define MYSQL_YYABORT \ + do \ + { \ + YYABORT; \ + } while (0) + +#define MYSQL_YYABORT_UNLESS(A) \ + if (unlikely(!(A))) \ + { \ + thd->parse_error(); \ + MYSQL_YYABORT; \ + } + +#define my_yyabort_error(A) \ + do { my_error A; MYSQL_YYABORT; } while(0) + +#ifndef DBUG_OFF +#define YYDEBUG 1 +#else +#define YYDEBUG 0 +#endif + + +static Item* escape(THD *thd) +{ + thd->lex->escape_used= false; + const char *esc= thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES ? "" : "\\"; + return new (thd->mem_root) Item_string_ascii(thd, esc, MY_TEST(esc[0])); +} + + +/** + @brief Bison callback to report a syntax/OOM error + + This function is invoked by the bison-generated parser + when a syntax error, a parse error or an out-of-memory + condition occurs. This function is not invoked when the + parser is requested to abort by semantic action code + by means of YYABORT or YYACCEPT macros. This is why these + macros should not be used (use MYSQL_YYABORT/MYSQL_YYACCEPT + instead). + + The parser will abort immediately after invoking this callback. + + This function is not for use in semantic actions and is internal to + the parser, as it performs some pre-return cleanup. + In semantic actions, please use thd->parse_error() or my_error to + push an error into the error stack and MYSQL_YYABORT + to abort from the parser. +*/ + +static void yyerror(THD *thd, const char *s) +{ + /* "parse error" changed into "syntax error" between bison 1.75 and 1.875 */ + if (strcmp(s,"parse error") == 0 || strcmp(s,"syntax error") == 0) + s= ER_THD(thd, ER_SYNTAX_ERROR); + thd->parse_error(s, 0); +} + + +#ifndef DBUG_OFF +#define __CONCAT_UNDERSCORED(x,y) x ## _ ## y +#define _CONCAT_UNDERSCORED(x,y) __CONCAT_UNDERSCORED(x,y) +void _CONCAT_UNDERSCORED(turn_parser_debug_on,yyparse)() +{ + /* + MYSQLdebug is in sql/yy_*.cc, in bison generated code. + Turning this option on is **VERY** verbose, and should be + used when investigating a syntax error problem only. + + The syntax to run with bison traces is as follows : + - Starting a server manually : + mysqld --debug-dbug="d,parser_debug" ... + - Running a test : + mysql-test-run.pl --mysqld="--debug-dbug=d,parser_debug" ... + + The result will be in the process stderr (var/log/master.err) + */ + +#ifndef _AIX + extern int yydebug; +#else + static int yydebug; +#endif + yydebug= 1; +} +#endif + + + +#line 244 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +#include "yy_mariadb.hh" +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_3_ = 3, /* '@' */ + YYSYMBOL_ABORT_SYM = 4, /* ABORT_SYM */ + YYSYMBOL_IMPOSSIBLE_ACTION = 5, /* IMPOSSIBLE_ACTION */ + YYSYMBOL_FORCE_LOOKAHEAD = 6, /* FORCE_LOOKAHEAD */ + YYSYMBOL_END_OF_INPUT = 7, /* END_OF_INPUT */ + YYSYMBOL_COLON_ORACLE_SYM = 8, /* COLON_ORACLE_SYM */ + YYSYMBOL_PARAM_MARKER = 9, /* PARAM_MARKER */ + YYSYMBOL_FOR_SYSTEM_TIME_SYM = 10, /* FOR_SYSTEM_TIME_SYM */ + YYSYMBOL_LEFT_PAREN_ALT = 11, /* LEFT_PAREN_ALT */ + YYSYMBOL_LEFT_PAREN_WITH = 12, /* LEFT_PAREN_WITH */ + YYSYMBOL_LEFT_PAREN_LIKE = 13, /* LEFT_PAREN_LIKE */ + YYSYMBOL_ORACLE_CONCAT_SYM = 14, /* ORACLE_CONCAT_SYM */ + YYSYMBOL_PERCENT_ORACLE_SYM = 15, /* PERCENT_ORACLE_SYM */ + YYSYMBOL_WITH_CUBE_SYM = 16, /* WITH_CUBE_SYM */ + YYSYMBOL_WITH_ROLLUP_SYM = 17, /* WITH_ROLLUP_SYM */ + YYSYMBOL_WITH_SYSTEM_SYM = 18, /* WITH_SYSTEM_SYM */ + YYSYMBOL_IDENT = 19, /* IDENT */ + YYSYMBOL_IDENT_QUOTED = 20, /* IDENT_QUOTED */ + YYSYMBOL_LEX_HOSTNAME = 21, /* LEX_HOSTNAME */ + YYSYMBOL_UNDERSCORE_CHARSET = 22, /* UNDERSCORE_CHARSET */ + YYSYMBOL_BIN_NUM = 23, /* BIN_NUM */ + YYSYMBOL_DECIMAL_NUM = 24, /* DECIMAL_NUM */ + YYSYMBOL_FLOAT_NUM = 25, /* FLOAT_NUM */ + YYSYMBOL_HEX_NUM = 26, /* HEX_NUM */ + YYSYMBOL_HEX_STRING = 27, /* HEX_STRING */ + YYSYMBOL_LONG_NUM = 28, /* LONG_NUM */ + YYSYMBOL_NCHAR_STRING = 29, /* NCHAR_STRING */ + YYSYMBOL_NUM = 30, /* NUM */ + YYSYMBOL_TEXT_STRING = 31, /* TEXT_STRING */ + YYSYMBOL_ULONGLONG_NUM = 32, /* ULONGLONG_NUM */ + YYSYMBOL_AND_AND_SYM = 33, /* AND_AND_SYM */ + YYSYMBOL_DOT_DOT_SYM = 34, /* DOT_DOT_SYM */ + YYSYMBOL_EQUAL_SYM = 35, /* EQUAL_SYM */ + YYSYMBOL_GE = 36, /* GE */ + YYSYMBOL_LE = 37, /* LE */ + YYSYMBOL_MYSQL_CONCAT_SYM = 38, /* MYSQL_CONCAT_SYM */ + YYSYMBOL_NE = 39, /* NE */ + YYSYMBOL_NOT2_SYM = 40, /* NOT2_SYM */ + YYSYMBOL_OR2_SYM = 41, /* OR2_SYM */ + YYSYMBOL_SET_VAR = 42, /* SET_VAR */ + YYSYMBOL_SHIFT_LEFT = 43, /* SHIFT_LEFT */ + YYSYMBOL_SHIFT_RIGHT = 44, /* SHIFT_RIGHT */ + YYSYMBOL_ACCESSIBLE_SYM = 45, /* ACCESSIBLE_SYM */ + YYSYMBOL_ADD = 46, /* ADD */ + YYSYMBOL_ALL = 47, /* ALL */ + YYSYMBOL_ALTER = 48, /* ALTER */ + YYSYMBOL_ANALYZE_SYM = 49, /* ANALYZE_SYM */ + YYSYMBOL_AND_SYM = 50, /* AND_SYM */ + YYSYMBOL_ASC = 51, /* ASC */ + YYSYMBOL_ASENSITIVE_SYM = 52, /* ASENSITIVE_SYM */ + YYSYMBOL_AS = 53, /* AS */ + YYSYMBOL_BEFORE_SYM = 54, /* BEFORE_SYM */ + YYSYMBOL_BETWEEN_SYM = 55, /* BETWEEN_SYM */ + YYSYMBOL_BIGINT = 56, /* BIGINT */ + YYSYMBOL_BINARY = 57, /* BINARY */ + YYSYMBOL_BIT_AND = 58, /* BIT_AND */ + YYSYMBOL_BIT_OR = 59, /* BIT_OR */ + YYSYMBOL_BIT_XOR = 60, /* BIT_XOR */ + YYSYMBOL_BLOB_MARIADB_SYM = 61, /* BLOB_MARIADB_SYM */ + YYSYMBOL_BLOB_ORACLE_SYM = 62, /* BLOB_ORACLE_SYM */ + YYSYMBOL_BODY_ORACLE_SYM = 63, /* BODY_ORACLE_SYM */ + YYSYMBOL_BOTH = 64, /* BOTH */ + YYSYMBOL_BY = 65, /* BY */ + YYSYMBOL_CALL_SYM = 66, /* CALL_SYM */ + YYSYMBOL_CASCADE = 67, /* CASCADE */ + YYSYMBOL_CASE_SYM = 68, /* CASE_SYM */ + YYSYMBOL_CAST_SYM = 69, /* CAST_SYM */ + YYSYMBOL_CHANGE = 70, /* CHANGE */ + YYSYMBOL_CHAR_SYM = 71, /* CHAR_SYM */ + YYSYMBOL_CHECK_SYM = 72, /* CHECK_SYM */ + YYSYMBOL_COLLATE_SYM = 73, /* COLLATE_SYM */ + YYSYMBOL_CONDITION_SYM = 74, /* CONDITION_SYM */ + YYSYMBOL_CONSTRAINT = 75, /* CONSTRAINT */ + YYSYMBOL_CONTINUE_MARIADB_SYM = 76, /* CONTINUE_MARIADB_SYM */ + YYSYMBOL_CONTINUE_ORACLE_SYM = 77, /* CONTINUE_ORACLE_SYM */ + YYSYMBOL_CONVERT_SYM = 78, /* CONVERT_SYM */ + YYSYMBOL_COUNT_SYM = 79, /* COUNT_SYM */ + YYSYMBOL_CREATE = 80, /* CREATE */ + YYSYMBOL_CROSS = 81, /* CROSS */ + YYSYMBOL_CUME_DIST_SYM = 82, /* CUME_DIST_SYM */ + YYSYMBOL_CURDATE = 83, /* CURDATE */ + YYSYMBOL_CURRENT_ROLE = 84, /* CURRENT_ROLE */ + YYSYMBOL_CURRENT_USER = 85, /* CURRENT_USER */ + YYSYMBOL_CURSOR_SYM = 86, /* CURSOR_SYM */ + YYSYMBOL_CURTIME = 87, /* CURTIME */ + YYSYMBOL_DATABASE = 88, /* DATABASE */ + YYSYMBOL_DATABASES = 89, /* DATABASES */ + YYSYMBOL_DATE_ADD_INTERVAL = 90, /* DATE_ADD_INTERVAL */ + YYSYMBOL_DATE_SUB_INTERVAL = 91, /* DATE_SUB_INTERVAL */ + YYSYMBOL_DAY_HOUR_SYM = 92, /* DAY_HOUR_SYM */ + YYSYMBOL_DAY_MICROSECOND_SYM = 93, /* DAY_MICROSECOND_SYM */ + YYSYMBOL_DAY_MINUTE_SYM = 94, /* DAY_MINUTE_SYM */ + YYSYMBOL_DAY_SECOND_SYM = 95, /* DAY_SECOND_SYM */ + YYSYMBOL_DECIMAL_SYM = 96, /* DECIMAL_SYM */ + YYSYMBOL_DECLARE_MARIADB_SYM = 97, /* DECLARE_MARIADB_SYM */ + YYSYMBOL_DECLARE_ORACLE_SYM = 98, /* DECLARE_ORACLE_SYM */ + YYSYMBOL_DEFAULT = 99, /* DEFAULT */ + YYSYMBOL_DELETE_DOMAIN_ID_SYM = 100, /* DELETE_DOMAIN_ID_SYM */ + YYSYMBOL_DELETE_SYM = 101, /* DELETE_SYM */ + YYSYMBOL_DENSE_RANK_SYM = 102, /* DENSE_RANK_SYM */ + YYSYMBOL_DESCRIBE = 103, /* DESCRIBE */ + YYSYMBOL_DESC = 104, /* DESC */ + YYSYMBOL_DETERMINISTIC_SYM = 105, /* DETERMINISTIC_SYM */ + YYSYMBOL_DISTINCT = 106, /* DISTINCT */ + YYSYMBOL_DIV_SYM = 107, /* DIV_SYM */ + YYSYMBOL_DO_DOMAIN_IDS_SYM = 108, /* DO_DOMAIN_IDS_SYM */ + YYSYMBOL_DOUBLE_SYM = 109, /* DOUBLE_SYM */ + YYSYMBOL_DROP = 110, /* DROP */ + YYSYMBOL_DUAL_SYM = 111, /* DUAL_SYM */ + YYSYMBOL_EACH_SYM = 112, /* EACH_SYM */ + YYSYMBOL_ELSEIF_MARIADB_SYM = 113, /* ELSEIF_MARIADB_SYM */ + YYSYMBOL_ELSE = 114, /* ELSE */ + YYSYMBOL_ELSIF_ORACLE_SYM = 115, /* ELSIF_ORACLE_SYM */ + YYSYMBOL_EMPTY_SYM = 116, /* EMPTY_SYM */ + YYSYMBOL_ENCLOSED = 117, /* ENCLOSED */ + YYSYMBOL_ESCAPED = 118, /* ESCAPED */ + YYSYMBOL_EXCEPT_SYM = 119, /* EXCEPT_SYM */ + YYSYMBOL_EXISTS = 120, /* EXISTS */ + YYSYMBOL_EXTRACT_SYM = 121, /* EXTRACT_SYM */ + YYSYMBOL_FALSE_SYM = 122, /* FALSE_SYM */ + YYSYMBOL_FETCH_SYM = 123, /* FETCH_SYM */ + YYSYMBOL_FIRST_VALUE_SYM = 124, /* FIRST_VALUE_SYM */ + YYSYMBOL_FLOAT_SYM = 125, /* FLOAT_SYM */ + YYSYMBOL_FOREIGN = 126, /* FOREIGN */ + YYSYMBOL_FOR_SYM = 127, /* FOR_SYM */ + YYSYMBOL_FROM = 128, /* FROM */ + YYSYMBOL_FULLTEXT_SYM = 129, /* FULLTEXT_SYM */ + YYSYMBOL_GOTO_ORACLE_SYM = 130, /* GOTO_ORACLE_SYM */ + YYSYMBOL_GRANT = 131, /* GRANT */ + YYSYMBOL_GROUP_CONCAT_SYM = 132, /* GROUP_CONCAT_SYM */ + YYSYMBOL_JSON_ARRAYAGG_SYM = 133, /* JSON_ARRAYAGG_SYM */ + YYSYMBOL_JSON_OBJECTAGG_SYM = 134, /* JSON_OBJECTAGG_SYM */ + YYSYMBOL_JSON_TABLE_SYM = 135, /* JSON_TABLE_SYM */ + YYSYMBOL_GROUP_SYM = 136, /* GROUP_SYM */ + YYSYMBOL_HAVING = 137, /* HAVING */ + YYSYMBOL_HOUR_MICROSECOND_SYM = 138, /* HOUR_MICROSECOND_SYM */ + YYSYMBOL_HOUR_MINUTE_SYM = 139, /* HOUR_MINUTE_SYM */ + YYSYMBOL_HOUR_SECOND_SYM = 140, /* HOUR_SECOND_SYM */ + YYSYMBOL_IF_SYM = 141, /* IF_SYM */ + YYSYMBOL_IGNORE_DOMAIN_IDS_SYM = 142, /* IGNORE_DOMAIN_IDS_SYM */ + YYSYMBOL_IGNORE_SYM = 143, /* IGNORE_SYM */ + YYSYMBOL_IGNORED_SYM = 144, /* IGNORED_SYM */ + YYSYMBOL_INDEX_SYM = 145, /* INDEX_SYM */ + YYSYMBOL_INFILE = 146, /* INFILE */ + YYSYMBOL_INNER_SYM = 147, /* INNER_SYM */ + YYSYMBOL_INOUT_SYM = 148, /* INOUT_SYM */ + YYSYMBOL_INSENSITIVE_SYM = 149, /* INSENSITIVE_SYM */ + YYSYMBOL_INSERT = 150, /* INSERT */ + YYSYMBOL_IN_SYM = 151, /* IN_SYM */ + YYSYMBOL_INTERSECT_SYM = 152, /* INTERSECT_SYM */ + YYSYMBOL_INTERVAL_SYM = 153, /* INTERVAL_SYM */ + YYSYMBOL_INTO = 154, /* INTO */ + YYSYMBOL_INT_SYM = 155, /* INT_SYM */ + YYSYMBOL_IS = 156, /* IS */ + YYSYMBOL_ITERATE_SYM = 157, /* ITERATE_SYM */ + YYSYMBOL_JOIN_SYM = 158, /* JOIN_SYM */ + YYSYMBOL_KEYS = 159, /* KEYS */ + YYSYMBOL_KEY_SYM = 160, /* KEY_SYM */ + YYSYMBOL_KILL_SYM = 161, /* KILL_SYM */ + YYSYMBOL_LAG_SYM = 162, /* LAG_SYM */ + YYSYMBOL_LEADING = 163, /* LEADING */ + YYSYMBOL_LEAD_SYM = 164, /* LEAD_SYM */ + YYSYMBOL_LEAVE_SYM = 165, /* LEAVE_SYM */ + YYSYMBOL_LEFT = 166, /* LEFT */ + YYSYMBOL_LIKE = 167, /* LIKE */ + YYSYMBOL_LIMIT = 168, /* LIMIT */ + YYSYMBOL_LINEAR_SYM = 169, /* LINEAR_SYM */ + YYSYMBOL_LINES = 170, /* LINES */ + YYSYMBOL_LOAD = 171, /* LOAD */ + YYSYMBOL_LOCATOR_SYM = 172, /* LOCATOR_SYM */ + YYSYMBOL_LOCK_SYM = 173, /* LOCK_SYM */ + YYSYMBOL_LONGBLOB = 174, /* LONGBLOB */ + YYSYMBOL_LONG_SYM = 175, /* LONG_SYM */ + YYSYMBOL_LONGTEXT = 176, /* LONGTEXT */ + YYSYMBOL_LOOP_SYM = 177, /* LOOP_SYM */ + YYSYMBOL_LOW_PRIORITY = 178, /* LOW_PRIORITY */ + YYSYMBOL_MASTER_SSL_VERIFY_SERVER_CERT_SYM = 179, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + YYSYMBOL_MATCH = 180, /* MATCH */ + YYSYMBOL_MAX_SYM = 181, /* MAX_SYM */ + YYSYMBOL_MAXVALUE_SYM = 182, /* MAXVALUE_SYM */ + YYSYMBOL_MEDIAN_SYM = 183, /* MEDIAN_SYM */ + YYSYMBOL_MEDIUMBLOB = 184, /* MEDIUMBLOB */ + YYSYMBOL_MEDIUMINT = 185, /* MEDIUMINT */ + YYSYMBOL_MEDIUMTEXT = 186, /* MEDIUMTEXT */ + YYSYMBOL_MIN_SYM = 187, /* MIN_SYM */ + YYSYMBOL_MINUS_ORACLE_SYM = 188, /* MINUS_ORACLE_SYM */ + YYSYMBOL_MINUTE_MICROSECOND_SYM = 189, /* MINUTE_MICROSECOND_SYM */ + YYSYMBOL_MINUTE_SECOND_SYM = 190, /* MINUTE_SECOND_SYM */ + YYSYMBOL_MODIFIES_SYM = 191, /* MODIFIES_SYM */ + YYSYMBOL_MOD_SYM = 192, /* MOD_SYM */ + YYSYMBOL_NATURAL = 193, /* NATURAL */ + YYSYMBOL_NEG = 194, /* NEG */ + YYSYMBOL_NESTED_SYM = 195, /* NESTED_SYM */ + YYSYMBOL_NOT_SYM = 196, /* NOT_SYM */ + YYSYMBOL_NO_WRITE_TO_BINLOG = 197, /* NO_WRITE_TO_BINLOG */ + YYSYMBOL_NOW_SYM = 198, /* NOW_SYM */ + YYSYMBOL_NTH_VALUE_SYM = 199, /* NTH_VALUE_SYM */ + YYSYMBOL_NTILE_SYM = 200, /* NTILE_SYM */ + YYSYMBOL_NULL_SYM = 201, /* NULL_SYM */ + YYSYMBOL_NUMERIC_SYM = 202, /* NUMERIC_SYM */ + YYSYMBOL_ON = 203, /* ON */ + YYSYMBOL_OPTIMIZE = 204, /* OPTIMIZE */ + YYSYMBOL_OPTIONALLY = 205, /* OPTIONALLY */ + YYSYMBOL_ORDER_SYM = 206, /* ORDER_SYM */ + YYSYMBOL_ORDINALITY_SYM = 207, /* ORDINALITY_SYM */ + YYSYMBOL_OR_SYM = 208, /* OR_SYM */ + YYSYMBOL_OTHERS_ORACLE_SYM = 209, /* OTHERS_ORACLE_SYM */ + YYSYMBOL_OUTER = 210, /* OUTER */ + YYSYMBOL_OUTFILE = 211, /* OUTFILE */ + YYSYMBOL_OUT_SYM = 212, /* OUT_SYM */ + YYSYMBOL_OVER_SYM = 213, /* OVER_SYM */ + YYSYMBOL_PACKAGE_ORACLE_SYM = 214, /* PACKAGE_ORACLE_SYM */ + YYSYMBOL_PAGE_CHECKSUM_SYM = 215, /* PAGE_CHECKSUM_SYM */ + YYSYMBOL_PARSE_VCOL_EXPR_SYM = 216, /* PARSE_VCOL_EXPR_SYM */ + YYSYMBOL_PARTITION_SYM = 217, /* PARTITION_SYM */ + YYSYMBOL_PATH_SYM = 218, /* PATH_SYM */ + YYSYMBOL_PERCENTILE_CONT_SYM = 219, /* PERCENTILE_CONT_SYM */ + YYSYMBOL_PERCENTILE_DISC_SYM = 220, /* PERCENTILE_DISC_SYM */ + YYSYMBOL_PERCENT_RANK_SYM = 221, /* PERCENT_RANK_SYM */ + YYSYMBOL_PORTION_SYM = 222, /* PORTION_SYM */ + YYSYMBOL_POSITION_SYM = 223, /* POSITION_SYM */ + YYSYMBOL_PRECISION = 224, /* PRECISION */ + YYSYMBOL_PRIMARY_SYM = 225, /* PRIMARY_SYM */ + YYSYMBOL_PROCEDURE_SYM = 226, /* PROCEDURE_SYM */ + YYSYMBOL_PURGE = 227, /* PURGE */ + YYSYMBOL_RAISE_ORACLE_SYM = 228, /* RAISE_ORACLE_SYM */ + YYSYMBOL_RANGE_SYM = 229, /* RANGE_SYM */ + YYSYMBOL_RANK_SYM = 230, /* RANK_SYM */ + YYSYMBOL_READS_SYM = 231, /* READS_SYM */ + YYSYMBOL_READ_SYM = 232, /* READ_SYM */ + YYSYMBOL_READ_WRITE_SYM = 233, /* READ_WRITE_SYM */ + YYSYMBOL_REAL = 234, /* REAL */ + YYSYMBOL_RECURSIVE_SYM = 235, /* RECURSIVE_SYM */ + YYSYMBOL_REFERENCES = 236, /* REFERENCES */ + YYSYMBOL_REF_SYSTEM_ID_SYM = 237, /* REF_SYSTEM_ID_SYM */ + YYSYMBOL_REGEXP = 238, /* REGEXP */ + YYSYMBOL_RELEASE_SYM = 239, /* RELEASE_SYM */ + YYSYMBOL_RENAME = 240, /* RENAME */ + YYSYMBOL_REPEAT_SYM = 241, /* REPEAT_SYM */ + YYSYMBOL_REQUIRE_SYM = 242, /* REQUIRE_SYM */ + YYSYMBOL_RESIGNAL_SYM = 243, /* RESIGNAL_SYM */ + YYSYMBOL_RESTRICT = 244, /* RESTRICT */ + YYSYMBOL_RETURNING_SYM = 245, /* RETURNING_SYM */ + YYSYMBOL_RETURN_MARIADB_SYM = 246, /* RETURN_MARIADB_SYM */ + YYSYMBOL_RETURN_ORACLE_SYM = 247, /* RETURN_ORACLE_SYM */ + YYSYMBOL_REVOKE = 248, /* REVOKE */ + YYSYMBOL_RIGHT = 249, /* RIGHT */ + YYSYMBOL_ROW_NUMBER_SYM = 250, /* ROW_NUMBER_SYM */ + YYSYMBOL_ROWS_SYM = 251, /* ROWS_SYM */ + YYSYMBOL_ROWTYPE_ORACLE_SYM = 252, /* ROWTYPE_ORACLE_SYM */ + YYSYMBOL_SECOND_MICROSECOND_SYM = 253, /* SECOND_MICROSECOND_SYM */ + YYSYMBOL_SELECT_SYM = 254, /* SELECT_SYM */ + YYSYMBOL_SENSITIVE_SYM = 255, /* SENSITIVE_SYM */ + YYSYMBOL_SEPARATOR_SYM = 256, /* SEPARATOR_SYM */ + YYSYMBOL_SERVER_OPTIONS = 257, /* SERVER_OPTIONS */ + YYSYMBOL_SET = 258, /* SET */ + YYSYMBOL_SHOW = 259, /* SHOW */ + YYSYMBOL_SIGNAL_SYM = 260, /* SIGNAL_SYM */ + YYSYMBOL_SMALLINT = 261, /* SMALLINT */ + YYSYMBOL_SPATIAL_SYM = 262, /* SPATIAL_SYM */ + YYSYMBOL_SPECIFIC_SYM = 263, /* SPECIFIC_SYM */ + YYSYMBOL_SQL_BIG_RESULT = 264, /* SQL_BIG_RESULT */ + YYSYMBOL_SQLEXCEPTION_SYM = 265, /* SQLEXCEPTION_SYM */ + YYSYMBOL_SQL_SMALL_RESULT = 266, /* SQL_SMALL_RESULT */ + YYSYMBOL_SQLSTATE_SYM = 267, /* SQLSTATE_SYM */ + YYSYMBOL_SQL_SYM = 268, /* SQL_SYM */ + YYSYMBOL_SQLWARNING_SYM = 269, /* SQLWARNING_SYM */ + YYSYMBOL_SSL_SYM = 270, /* SSL_SYM */ + YYSYMBOL_STARTING = 271, /* STARTING */ + YYSYMBOL_STATS_AUTO_RECALC_SYM = 272, /* STATS_AUTO_RECALC_SYM */ + YYSYMBOL_STATS_PERSISTENT_SYM = 273, /* STATS_PERSISTENT_SYM */ + YYSYMBOL_STATS_SAMPLE_PAGES_SYM = 274, /* STATS_SAMPLE_PAGES_SYM */ + YYSYMBOL_STDDEV_SAMP_SYM = 275, /* STDDEV_SAMP_SYM */ + YYSYMBOL_STD_SYM = 276, /* STD_SYM */ + YYSYMBOL_STRAIGHT_JOIN = 277, /* STRAIGHT_JOIN */ + YYSYMBOL_SUM_SYM = 278, /* SUM_SYM */ + YYSYMBOL_SYSDATE = 279, /* SYSDATE */ + YYSYMBOL_TABLE_REF_PRIORITY = 280, /* TABLE_REF_PRIORITY */ + YYSYMBOL_TABLE_SYM = 281, /* TABLE_SYM */ + YYSYMBOL_TERMINATED = 282, /* TERMINATED */ + YYSYMBOL_THEN_SYM = 283, /* THEN_SYM */ + YYSYMBOL_TINYBLOB = 284, /* TINYBLOB */ + YYSYMBOL_TINYINT = 285, /* TINYINT */ + YYSYMBOL_TINYTEXT = 286, /* TINYTEXT */ + YYSYMBOL_TO_SYM = 287, /* TO_SYM */ + YYSYMBOL_TRAILING = 288, /* TRAILING */ + YYSYMBOL_TRIGGER_SYM = 289, /* TRIGGER_SYM */ + YYSYMBOL_TRUE_SYM = 290, /* TRUE_SYM */ + YYSYMBOL_UNDO_SYM = 291, /* UNDO_SYM */ + YYSYMBOL_UNION_SYM = 292, /* UNION_SYM */ + YYSYMBOL_UNIQUE_SYM = 293, /* UNIQUE_SYM */ + YYSYMBOL_UNLOCK_SYM = 294, /* UNLOCK_SYM */ + YYSYMBOL_UNSIGNED = 295, /* UNSIGNED */ + YYSYMBOL_UPDATE_SYM = 296, /* UPDATE_SYM */ + YYSYMBOL_USAGE = 297, /* USAGE */ + YYSYMBOL_USE_SYM = 298, /* USE_SYM */ + YYSYMBOL_USING = 299, /* USING */ + YYSYMBOL_UTC_DATE_SYM = 300, /* UTC_DATE_SYM */ + YYSYMBOL_UTC_TIMESTAMP_SYM = 301, /* UTC_TIMESTAMP_SYM */ + YYSYMBOL_UTC_TIME_SYM = 302, /* UTC_TIME_SYM */ + YYSYMBOL_VALUES_IN_SYM = 303, /* VALUES_IN_SYM */ + YYSYMBOL_VALUES_LESS_SYM = 304, /* VALUES_LESS_SYM */ + YYSYMBOL_VALUES = 305, /* VALUES */ + YYSYMBOL_VARBINARY = 306, /* VARBINARY */ + YYSYMBOL_VARCHAR = 307, /* VARCHAR */ + YYSYMBOL_VARIANCE_SYM = 308, /* VARIANCE_SYM */ + YYSYMBOL_VAR_SAMP_SYM = 309, /* VAR_SAMP_SYM */ + YYSYMBOL_VARYING = 310, /* VARYING */ + YYSYMBOL_WHEN_SYM = 311, /* WHEN_SYM */ + YYSYMBOL_WHERE = 312, /* WHERE */ + YYSYMBOL_WHILE_SYM = 313, /* WHILE_SYM */ + YYSYMBOL_WITH = 314, /* WITH */ + YYSYMBOL_XOR = 315, /* XOR */ + YYSYMBOL_YEAR_MONTH_SYM = 316, /* YEAR_MONTH_SYM */ + YYSYMBOL_ZEROFILL = 317, /* ZEROFILL */ + YYSYMBOL_BODY_MARIADB_SYM = 318, /* BODY_MARIADB_SYM */ + YYSYMBOL_ELSEIF_ORACLE_SYM = 319, /* ELSEIF_ORACLE_SYM */ + YYSYMBOL_ELSIF_MARIADB_SYM = 320, /* ELSIF_MARIADB_SYM */ + YYSYMBOL_EXCEPTION_ORACLE_SYM = 321, /* EXCEPTION_ORACLE_SYM */ + YYSYMBOL_GOTO_MARIADB_SYM = 322, /* GOTO_MARIADB_SYM */ + YYSYMBOL_OTHERS_MARIADB_SYM = 323, /* OTHERS_MARIADB_SYM */ + YYSYMBOL_PACKAGE_MARIADB_SYM = 324, /* PACKAGE_MARIADB_SYM */ + YYSYMBOL_RAISE_MARIADB_SYM = 325, /* RAISE_MARIADB_SYM */ + YYSYMBOL_ROWTYPE_MARIADB_SYM = 326, /* ROWTYPE_MARIADB_SYM */ + YYSYMBOL_ROWNUM_SYM = 327, /* ROWNUM_SYM */ + YYSYMBOL_REPLACE = 328, /* REPLACE */ + YYSYMBOL_SUBSTRING = 329, /* SUBSTRING */ + YYSYMBOL_TRIM = 330, /* TRIM */ + YYSYMBOL_ACCOUNT_SYM = 331, /* ACCOUNT_SYM */ + YYSYMBOL_ACTION = 332, /* ACTION */ + YYSYMBOL_ADMIN_SYM = 333, /* ADMIN_SYM */ + YYSYMBOL_ADDDATE_SYM = 334, /* ADDDATE_SYM */ + YYSYMBOL_AFTER_SYM = 335, /* AFTER_SYM */ + YYSYMBOL_AGAINST = 336, /* AGAINST */ + YYSYMBOL_AGGREGATE_SYM = 337, /* AGGREGATE_SYM */ + YYSYMBOL_ALGORITHM_SYM = 338, /* ALGORITHM_SYM */ + YYSYMBOL_ALWAYS_SYM = 339, /* ALWAYS_SYM */ + YYSYMBOL_ANY_SYM = 340, /* ANY_SYM */ + YYSYMBOL_ASCII_SYM = 341, /* ASCII_SYM */ + YYSYMBOL_AT_SYM = 342, /* AT_SYM */ + YYSYMBOL_ATOMIC_SYM = 343, /* ATOMIC_SYM */ + YYSYMBOL_AUTHORS_SYM = 344, /* AUTHORS_SYM */ + YYSYMBOL_AUTOEXTEND_SIZE_SYM = 345, /* AUTOEXTEND_SIZE_SYM */ + YYSYMBOL_AUTO_INC = 346, /* AUTO_INC */ + YYSYMBOL_AUTO_SYM = 347, /* AUTO_SYM */ + YYSYMBOL_AVG_ROW_LENGTH = 348, /* AVG_ROW_LENGTH */ + YYSYMBOL_AVG_SYM = 349, /* AVG_SYM */ + YYSYMBOL_BACKUP_SYM = 350, /* BACKUP_SYM */ + YYSYMBOL_BEGIN_MARIADB_SYM = 351, /* BEGIN_MARIADB_SYM */ + YYSYMBOL_BEGIN_ORACLE_SYM = 352, /* BEGIN_ORACLE_SYM */ + YYSYMBOL_BINLOG_SYM = 353, /* BINLOG_SYM */ + YYSYMBOL_BIT_SYM = 354, /* BIT_SYM */ + YYSYMBOL_BLOCK_SYM = 355, /* BLOCK_SYM */ + YYSYMBOL_BOOL_SYM = 356, /* BOOL_SYM */ + YYSYMBOL_BOOLEAN_SYM = 357, /* BOOLEAN_SYM */ + YYSYMBOL_BTREE_SYM = 358, /* BTREE_SYM */ + YYSYMBOL_BYTE_SYM = 359, /* BYTE_SYM */ + YYSYMBOL_CACHE_SYM = 360, /* CACHE_SYM */ + YYSYMBOL_CASCADED = 361, /* CASCADED */ + YYSYMBOL_CATALOG_NAME_SYM = 362, /* CATALOG_NAME_SYM */ + YYSYMBOL_CHAIN_SYM = 363, /* CHAIN_SYM */ + YYSYMBOL_CHANGED = 364, /* CHANGED */ + YYSYMBOL_CHANNEL_SYM = 365, /* CHANNEL_SYM */ + YYSYMBOL_CHARSET = 366, /* CHARSET */ + YYSYMBOL_CHECKPOINT_SYM = 367, /* CHECKPOINT_SYM */ + YYSYMBOL_CHECKSUM_SYM = 368, /* CHECKSUM_SYM */ + YYSYMBOL_CIPHER_SYM = 369, /* CIPHER_SYM */ + YYSYMBOL_CLASS_ORIGIN_SYM = 370, /* CLASS_ORIGIN_SYM */ + YYSYMBOL_CLIENT_SYM = 371, /* CLIENT_SYM */ + YYSYMBOL_CLOB_MARIADB_SYM = 372, /* CLOB_MARIADB_SYM */ + YYSYMBOL_CLOB_ORACLE_SYM = 373, /* CLOB_ORACLE_SYM */ + YYSYMBOL_CLOSE_SYM = 374, /* CLOSE_SYM */ + YYSYMBOL_COALESCE = 375, /* COALESCE */ + YYSYMBOL_CODE_SYM = 376, /* CODE_SYM */ + YYSYMBOL_COLLATION_SYM = 377, /* COLLATION_SYM */ + YYSYMBOL_COLUMNS = 378, /* COLUMNS */ + YYSYMBOL_COLUMN_ADD_SYM = 379, /* COLUMN_ADD_SYM */ + YYSYMBOL_COLUMN_CHECK_SYM = 380, /* COLUMN_CHECK_SYM */ + YYSYMBOL_COLUMN_CREATE_SYM = 381, /* COLUMN_CREATE_SYM */ + YYSYMBOL_COLUMN_DELETE_SYM = 382, /* COLUMN_DELETE_SYM */ + YYSYMBOL_COLUMN_GET_SYM = 383, /* COLUMN_GET_SYM */ + YYSYMBOL_COLUMN_SYM = 384, /* COLUMN_SYM */ + YYSYMBOL_COLUMN_NAME_SYM = 385, /* COLUMN_NAME_SYM */ + YYSYMBOL_COMMENT_SYM = 386, /* COMMENT_SYM */ + YYSYMBOL_COMMITTED_SYM = 387, /* COMMITTED_SYM */ + YYSYMBOL_COMMIT_SYM = 388, /* COMMIT_SYM */ + YYSYMBOL_COMPACT_SYM = 389, /* COMPACT_SYM */ + YYSYMBOL_COMPLETION_SYM = 390, /* COMPLETION_SYM */ + YYSYMBOL_COMPRESSED_SYM = 391, /* COMPRESSED_SYM */ + YYSYMBOL_CONCURRENT = 392, /* CONCURRENT */ + YYSYMBOL_CONNECTION_SYM = 393, /* CONNECTION_SYM */ + YYSYMBOL_CONSISTENT_SYM = 394, /* CONSISTENT_SYM */ + YYSYMBOL_CONSTRAINT_CATALOG_SYM = 395, /* CONSTRAINT_CATALOG_SYM */ + YYSYMBOL_CONSTRAINT_NAME_SYM = 396, /* CONSTRAINT_NAME_SYM */ + YYSYMBOL_CONSTRAINT_SCHEMA_SYM = 397, /* CONSTRAINT_SCHEMA_SYM */ + YYSYMBOL_CONTAINS_SYM = 398, /* CONTAINS_SYM */ + YYSYMBOL_CONTEXT_SYM = 399, /* CONTEXT_SYM */ + YYSYMBOL_CONTRIBUTORS_SYM = 400, /* CONTRIBUTORS_SYM */ + YYSYMBOL_CPU_SYM = 401, /* CPU_SYM */ + YYSYMBOL_CUBE_SYM = 402, /* CUBE_SYM */ + YYSYMBOL_CURRENT_SYM = 403, /* CURRENT_SYM */ + YYSYMBOL_CURRENT_POS_SYM = 404, /* CURRENT_POS_SYM */ + YYSYMBOL_CURSOR_NAME_SYM = 405, /* CURSOR_NAME_SYM */ + YYSYMBOL_CYCLE_SYM = 406, /* CYCLE_SYM */ + YYSYMBOL_DATAFILE_SYM = 407, /* DATAFILE_SYM */ + YYSYMBOL_DATA_SYM = 408, /* DATA_SYM */ + YYSYMBOL_DATETIME = 409, /* DATETIME */ + YYSYMBOL_DATE_SYM = 410, /* DATE_SYM */ + YYSYMBOL_DAY_SYM = 411, /* DAY_SYM */ + YYSYMBOL_DEALLOCATE_SYM = 412, /* DEALLOCATE_SYM */ + YYSYMBOL_DEFINER_SYM = 413, /* DEFINER_SYM */ + YYSYMBOL_DELAYED_SYM = 414, /* DELAYED_SYM */ + YYSYMBOL_DELAY_KEY_WRITE_SYM = 415, /* DELAY_KEY_WRITE_SYM */ + YYSYMBOL_DES_KEY_FILE = 416, /* DES_KEY_FILE */ + YYSYMBOL_DIAGNOSTICS_SYM = 417, /* DIAGNOSTICS_SYM */ + YYSYMBOL_DIRECTORY_SYM = 418, /* DIRECTORY_SYM */ + YYSYMBOL_DISABLE_SYM = 419, /* DISABLE_SYM */ + YYSYMBOL_DISCARD = 420, /* DISCARD */ + YYSYMBOL_DISK_SYM = 421, /* DISK_SYM */ + YYSYMBOL_DO_SYM = 422, /* DO_SYM */ + YYSYMBOL_DUMPFILE = 423, /* DUMPFILE */ + YYSYMBOL_DUPLICATE_SYM = 424, /* DUPLICATE_SYM */ + YYSYMBOL_DYNAMIC_SYM = 425, /* DYNAMIC_SYM */ + YYSYMBOL_ENABLE_SYM = 426, /* ENABLE_SYM */ + YYSYMBOL_END = 427, /* END */ + YYSYMBOL_ENDS_SYM = 428, /* ENDS_SYM */ + YYSYMBOL_ENGINES_SYM = 429, /* ENGINES_SYM */ + YYSYMBOL_ENGINE_SYM = 430, /* ENGINE_SYM */ + YYSYMBOL_ENUM = 431, /* ENUM */ + YYSYMBOL_ERROR_SYM = 432, /* ERROR_SYM */ + YYSYMBOL_ERRORS = 433, /* ERRORS */ + YYSYMBOL_ESCAPE_SYM = 434, /* ESCAPE_SYM */ + YYSYMBOL_EVENTS_SYM = 435, /* EVENTS_SYM */ + YYSYMBOL_EVENT_SYM = 436, /* EVENT_SYM */ + YYSYMBOL_EVERY_SYM = 437, /* EVERY_SYM */ + YYSYMBOL_EXCHANGE_SYM = 438, /* EXCHANGE_SYM */ + YYSYMBOL_EXAMINED_SYM = 439, /* EXAMINED_SYM */ + YYSYMBOL_EXCLUDE_SYM = 440, /* EXCLUDE_SYM */ + YYSYMBOL_EXECUTE_SYM = 441, /* EXECUTE_SYM */ + YYSYMBOL_EXCEPTION_MARIADB_SYM = 442, /* EXCEPTION_MARIADB_SYM */ + YYSYMBOL_EXIT_MARIADB_SYM = 443, /* EXIT_MARIADB_SYM */ + YYSYMBOL_EXIT_ORACLE_SYM = 444, /* EXIT_ORACLE_SYM */ + YYSYMBOL_EXPANSION_SYM = 445, /* EXPANSION_SYM */ + YYSYMBOL_EXPIRE_SYM = 446, /* EXPIRE_SYM */ + YYSYMBOL_EXPORT_SYM = 447, /* EXPORT_SYM */ + YYSYMBOL_EXTENDED_SYM = 448, /* EXTENDED_SYM */ + YYSYMBOL_EXTENT_SIZE_SYM = 449, /* EXTENT_SIZE_SYM */ + YYSYMBOL_FAST_SYM = 450, /* FAST_SYM */ + YYSYMBOL_FAULTS_SYM = 451, /* FAULTS_SYM */ + YYSYMBOL_FEDERATED_SYM = 452, /* FEDERATED_SYM */ + YYSYMBOL_FILE_SYM = 453, /* FILE_SYM */ + YYSYMBOL_FIRST_SYM = 454, /* FIRST_SYM */ + YYSYMBOL_FIXED_SYM = 455, /* FIXED_SYM */ + YYSYMBOL_FLUSH_SYM = 456, /* FLUSH_SYM */ + YYSYMBOL_FOLLOWS_SYM = 457, /* FOLLOWS_SYM */ + YYSYMBOL_FOLLOWING_SYM = 458, /* FOLLOWING_SYM */ + YYSYMBOL_FORCE_SYM = 459, /* FORCE_SYM */ + YYSYMBOL_FORMAT_SYM = 460, /* FORMAT_SYM */ + YYSYMBOL_FOUND_SYM = 461, /* FOUND_SYM */ + YYSYMBOL_FULL = 462, /* FULL */ + YYSYMBOL_FUNCTION_SYM = 463, /* FUNCTION_SYM */ + YYSYMBOL_GENERAL = 464, /* GENERAL */ + YYSYMBOL_GENERATED_SYM = 465, /* GENERATED_SYM */ + YYSYMBOL_GET_FORMAT = 466, /* GET_FORMAT */ + YYSYMBOL_GET_SYM = 467, /* GET_SYM */ + YYSYMBOL_GLOBAL_SYM = 468, /* GLOBAL_SYM */ + YYSYMBOL_GRANTS = 469, /* GRANTS */ + YYSYMBOL_HANDLER_SYM = 470, /* HANDLER_SYM */ + YYSYMBOL_HARD_SYM = 471, /* HARD_SYM */ + YYSYMBOL_HASH_SYM = 472, /* HASH_SYM */ + YYSYMBOL_HELP_SYM = 473, /* HELP_SYM */ + YYSYMBOL_HIGH_PRIORITY = 474, /* HIGH_PRIORITY */ + YYSYMBOL_HISTORY_SYM = 475, /* HISTORY_SYM */ + YYSYMBOL_HOST_SYM = 476, /* HOST_SYM */ + YYSYMBOL_HOSTS_SYM = 477, /* HOSTS_SYM */ + YYSYMBOL_HOUR_SYM = 478, /* HOUR_SYM */ + YYSYMBOL_ID_SYM = 479, /* ID_SYM */ + YYSYMBOL_IDENTIFIED_SYM = 480, /* IDENTIFIED_SYM */ + YYSYMBOL_IGNORE_SERVER_IDS_SYM = 481, /* IGNORE_SERVER_IDS_SYM */ + YYSYMBOL_IMMEDIATE_SYM = 482, /* IMMEDIATE_SYM */ + YYSYMBOL_IMPORT = 483, /* IMPORT */ + YYSYMBOL_INCREMENT_SYM = 484, /* INCREMENT_SYM */ + YYSYMBOL_INDEXES = 485, /* INDEXES */ + YYSYMBOL_INITIAL_SIZE_SYM = 486, /* INITIAL_SIZE_SYM */ + YYSYMBOL_INSERT_METHOD = 487, /* INSERT_METHOD */ + YYSYMBOL_INSTALL_SYM = 488, /* INSTALL_SYM */ + YYSYMBOL_INVOKER_SYM = 489, /* INVOKER_SYM */ + YYSYMBOL_IO_SYM = 490, /* IO_SYM */ + YYSYMBOL_IPC_SYM = 491, /* IPC_SYM */ + YYSYMBOL_ISOLATION = 492, /* ISOLATION */ + YYSYMBOL_ISOPEN_SYM = 493, /* ISOPEN_SYM */ + YYSYMBOL_ISSUER_SYM = 494, /* ISSUER_SYM */ + YYSYMBOL_INVISIBLE_SYM = 495, /* INVISIBLE_SYM */ + YYSYMBOL_JSON_SYM = 496, /* JSON_SYM */ + YYSYMBOL_KEY_BLOCK_SIZE = 497, /* KEY_BLOCK_SIZE */ + YYSYMBOL_LANGUAGE_SYM = 498, /* LANGUAGE_SYM */ + YYSYMBOL_LAST_SYM = 499, /* LAST_SYM */ + YYSYMBOL_LAST_VALUE = 500, /* LAST_VALUE */ + YYSYMBOL_LASTVAL_SYM = 501, /* LASTVAL_SYM */ + YYSYMBOL_LEAVES = 502, /* LEAVES */ + YYSYMBOL_LESS_SYM = 503, /* LESS_SYM */ + YYSYMBOL_LEVEL_SYM = 504, /* LEVEL_SYM */ + YYSYMBOL_LIST_SYM = 505, /* LIST_SYM */ + YYSYMBOL_LOCAL_SYM = 506, /* LOCAL_SYM */ + YYSYMBOL_LOCKED_SYM = 507, /* LOCKED_SYM */ + YYSYMBOL_LOCKS_SYM = 508, /* LOCKS_SYM */ + YYSYMBOL_LOGFILE_SYM = 509, /* LOGFILE_SYM */ + YYSYMBOL_LOGS_SYM = 510, /* LOGS_SYM */ + YYSYMBOL_MASTER_CONNECT_RETRY_SYM = 511, /* MASTER_CONNECT_RETRY_SYM */ + YYSYMBOL_MASTER_DELAY_SYM = 512, /* MASTER_DELAY_SYM */ + YYSYMBOL_MASTER_GTID_POS_SYM = 513, /* MASTER_GTID_POS_SYM */ + YYSYMBOL_MASTER_HOST_SYM = 514, /* MASTER_HOST_SYM */ + YYSYMBOL_MASTER_LOG_FILE_SYM = 515, /* MASTER_LOG_FILE_SYM */ + YYSYMBOL_MASTER_LOG_POS_SYM = 516, /* MASTER_LOG_POS_SYM */ + YYSYMBOL_MASTER_PASSWORD_SYM = 517, /* MASTER_PASSWORD_SYM */ + YYSYMBOL_MASTER_PORT_SYM = 518, /* MASTER_PORT_SYM */ + YYSYMBOL_MASTER_SERVER_ID_SYM = 519, /* MASTER_SERVER_ID_SYM */ + YYSYMBOL_MASTER_SSL_CAPATH_SYM = 520, /* MASTER_SSL_CAPATH_SYM */ + YYSYMBOL_MASTER_SSL_CA_SYM = 521, /* MASTER_SSL_CA_SYM */ + YYSYMBOL_MASTER_SSL_CERT_SYM = 522, /* MASTER_SSL_CERT_SYM */ + YYSYMBOL_MASTER_SSL_CIPHER_SYM = 523, /* MASTER_SSL_CIPHER_SYM */ + YYSYMBOL_MASTER_SSL_CRL_SYM = 524, /* MASTER_SSL_CRL_SYM */ + YYSYMBOL_MASTER_SSL_CRLPATH_SYM = 525, /* MASTER_SSL_CRLPATH_SYM */ + YYSYMBOL_MASTER_SSL_KEY_SYM = 526, /* MASTER_SSL_KEY_SYM */ + YYSYMBOL_MASTER_SSL_SYM = 527, /* MASTER_SSL_SYM */ + YYSYMBOL_MASTER_SYM = 528, /* MASTER_SYM */ + YYSYMBOL_MASTER_USER_SYM = 529, /* MASTER_USER_SYM */ + YYSYMBOL_MASTER_USE_GTID_SYM = 530, /* MASTER_USE_GTID_SYM */ + YYSYMBOL_MASTER_HEARTBEAT_PERIOD_SYM = 531, /* MASTER_HEARTBEAT_PERIOD_SYM */ + YYSYMBOL_MASTER_DEMOTE_TO_SLAVE_SYM = 532, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + YYSYMBOL_MAX_CONNECTIONS_PER_HOUR = 533, /* MAX_CONNECTIONS_PER_HOUR */ + YYSYMBOL_MAX_QUERIES_PER_HOUR = 534, /* MAX_QUERIES_PER_HOUR */ + YYSYMBOL_MAX_ROWS = 535, /* MAX_ROWS */ + YYSYMBOL_MAX_SIZE_SYM = 536, /* MAX_SIZE_SYM */ + YYSYMBOL_MAX_UPDATES_PER_HOUR = 537, /* MAX_UPDATES_PER_HOUR */ + YYSYMBOL_MAX_STATEMENT_TIME_SYM = 538, /* MAX_STATEMENT_TIME_SYM */ + YYSYMBOL_MAX_USER_CONNECTIONS_SYM = 539, /* MAX_USER_CONNECTIONS_SYM */ + YYSYMBOL_MEDIUM_SYM = 540, /* MEDIUM_SYM */ + YYSYMBOL_MEMORY_SYM = 541, /* MEMORY_SYM */ + YYSYMBOL_MERGE_SYM = 542, /* MERGE_SYM */ + YYSYMBOL_MESSAGE_TEXT_SYM = 543, /* MESSAGE_TEXT_SYM */ + YYSYMBOL_MICROSECOND_SYM = 544, /* MICROSECOND_SYM */ + YYSYMBOL_MIGRATE_SYM = 545, /* MIGRATE_SYM */ + YYSYMBOL_MINUTE_SYM = 546, /* MINUTE_SYM */ + YYSYMBOL_MINVALUE_SYM = 547, /* MINVALUE_SYM */ + YYSYMBOL_MIN_ROWS = 548, /* MIN_ROWS */ + YYSYMBOL_MODE_SYM = 549, /* MODE_SYM */ + YYSYMBOL_MODIFY_SYM = 550, /* MODIFY_SYM */ + YYSYMBOL_MONITOR_SYM = 551, /* MONITOR_SYM */ + YYSYMBOL_MONTH_SYM = 552, /* MONTH_SYM */ + YYSYMBOL_MUTEX_SYM = 553, /* MUTEX_SYM */ + YYSYMBOL_MYSQL_SYM = 554, /* MYSQL_SYM */ + YYSYMBOL_MYSQL_ERRNO_SYM = 555, /* MYSQL_ERRNO_SYM */ + YYSYMBOL_NAMES_SYM = 556, /* NAMES_SYM */ + YYSYMBOL_NAME_SYM = 557, /* NAME_SYM */ + YYSYMBOL_NATIONAL_SYM = 558, /* NATIONAL_SYM */ + YYSYMBOL_NCHAR_SYM = 559, /* NCHAR_SYM */ + YYSYMBOL_NEVER_SYM = 560, /* NEVER_SYM */ + YYSYMBOL_NEXT_SYM = 561, /* NEXT_SYM */ + YYSYMBOL_NEXTVAL_SYM = 562, /* NEXTVAL_SYM */ + YYSYMBOL_NOCACHE_SYM = 563, /* NOCACHE_SYM */ + YYSYMBOL_NOCYCLE_SYM = 564, /* NOCYCLE_SYM */ + YYSYMBOL_NODEGROUP_SYM = 565, /* NODEGROUP_SYM */ + YYSYMBOL_NONE_SYM = 566, /* NONE_SYM */ + YYSYMBOL_NOTFOUND_SYM = 567, /* NOTFOUND_SYM */ + YYSYMBOL_NO_SYM = 568, /* NO_SYM */ + YYSYMBOL_NOMAXVALUE_SYM = 569, /* NOMAXVALUE_SYM */ + YYSYMBOL_NOMINVALUE_SYM = 570, /* NOMINVALUE_SYM */ + YYSYMBOL_NO_WAIT_SYM = 571, /* NO_WAIT_SYM */ + YYSYMBOL_NOWAIT_SYM = 572, /* NOWAIT_SYM */ + YYSYMBOL_NUMBER_MARIADB_SYM = 573, /* NUMBER_MARIADB_SYM */ + YYSYMBOL_NUMBER_ORACLE_SYM = 574, /* NUMBER_ORACLE_SYM */ + YYSYMBOL_NVARCHAR_SYM = 575, /* NVARCHAR_SYM */ + YYSYMBOL_OF_SYM = 576, /* OF_SYM */ + YYSYMBOL_OFFSET_SYM = 577, /* OFFSET_SYM */ + YYSYMBOL_OLD_PASSWORD_SYM = 578, /* OLD_PASSWORD_SYM */ + YYSYMBOL_ONE_SYM = 579, /* ONE_SYM */ + YYSYMBOL_ONLY_SYM = 580, /* ONLY_SYM */ + YYSYMBOL_ONLINE_SYM = 581, /* ONLINE_SYM */ + YYSYMBOL_OPEN_SYM = 582, /* OPEN_SYM */ + YYSYMBOL_OPTIONS_SYM = 583, /* OPTIONS_SYM */ + YYSYMBOL_OPTION = 584, /* OPTION */ + YYSYMBOL_OVERLAPS_SYM = 585, /* OVERLAPS_SYM */ + YYSYMBOL_OWNER_SYM = 586, /* OWNER_SYM */ + YYSYMBOL_PACK_KEYS_SYM = 587, /* PACK_KEYS_SYM */ + YYSYMBOL_PAGE_SYM = 588, /* PAGE_SYM */ + YYSYMBOL_PARSER_SYM = 589, /* PARSER_SYM */ + YYSYMBOL_PARTIAL = 590, /* PARTIAL */ + YYSYMBOL_PARTITIONS_SYM = 591, /* PARTITIONS_SYM */ + YYSYMBOL_PARTITIONING_SYM = 592, /* PARTITIONING_SYM */ + YYSYMBOL_PASSWORD_SYM = 593, /* PASSWORD_SYM */ + YYSYMBOL_PERIOD_SYM = 594, /* PERIOD_SYM */ + YYSYMBOL_PERSISTENT_SYM = 595, /* PERSISTENT_SYM */ + YYSYMBOL_PHASE_SYM = 596, /* PHASE_SYM */ + YYSYMBOL_PLUGINS_SYM = 597, /* PLUGINS_SYM */ + YYSYMBOL_PLUGIN_SYM = 598, /* PLUGIN_SYM */ + YYSYMBOL_PORT_SYM = 599, /* PORT_SYM */ + YYSYMBOL_PRECEDES_SYM = 600, /* PRECEDES_SYM */ + YYSYMBOL_PRECEDING_SYM = 601, /* PRECEDING_SYM */ + YYSYMBOL_PREPARE_SYM = 602, /* PREPARE_SYM */ + YYSYMBOL_PRESERVE_SYM = 603, /* PRESERVE_SYM */ + YYSYMBOL_PREV_SYM = 604, /* PREV_SYM */ + YYSYMBOL_PREVIOUS_SYM = 605, /* PREVIOUS_SYM */ + YYSYMBOL_PRIVILEGES = 606, /* PRIVILEGES */ + YYSYMBOL_PROCESS = 607, /* PROCESS */ + YYSYMBOL_PROCESSLIST_SYM = 608, /* PROCESSLIST_SYM */ + YYSYMBOL_PROFILE_SYM = 609, /* PROFILE_SYM */ + YYSYMBOL_PROFILES_SYM = 610, /* PROFILES_SYM */ + YYSYMBOL_PROXY_SYM = 611, /* PROXY_SYM */ + YYSYMBOL_QUARTER_SYM = 612, /* QUARTER_SYM */ + YYSYMBOL_QUERY_SYM = 613, /* QUERY_SYM */ + YYSYMBOL_QUICK = 614, /* QUICK */ + YYSYMBOL_RAW_MARIADB_SYM = 615, /* RAW_MARIADB_SYM */ + YYSYMBOL_RAW_ORACLE_SYM = 616, /* RAW_ORACLE_SYM */ + YYSYMBOL_READ_ONLY_SYM = 617, /* READ_ONLY_SYM */ + YYSYMBOL_REBUILD_SYM = 618, /* REBUILD_SYM */ + YYSYMBOL_RECOVER_SYM = 619, /* RECOVER_SYM */ + YYSYMBOL_REDOFILE_SYM = 620, /* REDOFILE_SYM */ + YYSYMBOL_REDO_BUFFER_SIZE_SYM = 621, /* REDO_BUFFER_SIZE_SYM */ + YYSYMBOL_REDUNDANT_SYM = 622, /* REDUNDANT_SYM */ + YYSYMBOL_RELAY = 623, /* RELAY */ + YYSYMBOL_RELAYLOG_SYM = 624, /* RELAYLOG_SYM */ + YYSYMBOL_RELAY_LOG_FILE_SYM = 625, /* RELAY_LOG_FILE_SYM */ + YYSYMBOL_RELAY_LOG_POS_SYM = 626, /* RELAY_LOG_POS_SYM */ + YYSYMBOL_RELAY_THREAD = 627, /* RELAY_THREAD */ + YYSYMBOL_RELOAD = 628, /* RELOAD */ + YYSYMBOL_REMOVE_SYM = 629, /* REMOVE_SYM */ + YYSYMBOL_REORGANIZE_SYM = 630, /* REORGANIZE_SYM */ + YYSYMBOL_REPAIR = 631, /* REPAIR */ + YYSYMBOL_REPEATABLE_SYM = 632, /* REPEATABLE_SYM */ + YYSYMBOL_REPLAY_SYM = 633, /* REPLAY_SYM */ + YYSYMBOL_REPLICATION = 634, /* REPLICATION */ + YYSYMBOL_RESET_SYM = 635, /* RESET_SYM */ + YYSYMBOL_RESTART_SYM = 636, /* RESTART_SYM */ + YYSYMBOL_RESOURCES = 637, /* RESOURCES */ + YYSYMBOL_RESTORE_SYM = 638, /* RESTORE_SYM */ + YYSYMBOL_RESUME_SYM = 639, /* RESUME_SYM */ + YYSYMBOL_RETURNED_SQLSTATE_SYM = 640, /* RETURNED_SQLSTATE_SYM */ + YYSYMBOL_RETURNS_SYM = 641, /* RETURNS_SYM */ + YYSYMBOL_REUSE_SYM = 642, /* REUSE_SYM */ + YYSYMBOL_REVERSE_SYM = 643, /* REVERSE_SYM */ + YYSYMBOL_ROLE_SYM = 644, /* ROLE_SYM */ + YYSYMBOL_ROLLBACK_SYM = 645, /* ROLLBACK_SYM */ + YYSYMBOL_ROLLUP_SYM = 646, /* ROLLUP_SYM */ + YYSYMBOL_ROUTINE_SYM = 647, /* ROUTINE_SYM */ + YYSYMBOL_ROWCOUNT_SYM = 648, /* ROWCOUNT_SYM */ + YYSYMBOL_ROW_SYM = 649, /* ROW_SYM */ + YYSYMBOL_ROW_COUNT_SYM = 650, /* ROW_COUNT_SYM */ + YYSYMBOL_ROW_FORMAT_SYM = 651, /* ROW_FORMAT_SYM */ + YYSYMBOL_RTREE_SYM = 652, /* RTREE_SYM */ + YYSYMBOL_SAVEPOINT_SYM = 653, /* SAVEPOINT_SYM */ + YYSYMBOL_SCHEDULE_SYM = 654, /* SCHEDULE_SYM */ + YYSYMBOL_SCHEMA_NAME_SYM = 655, /* SCHEMA_NAME_SYM */ + YYSYMBOL_SECOND_SYM = 656, /* SECOND_SYM */ + YYSYMBOL_SECURITY_SYM = 657, /* SECURITY_SYM */ + YYSYMBOL_SEQUENCE_SYM = 658, /* SEQUENCE_SYM */ + YYSYMBOL_SERIALIZABLE_SYM = 659, /* SERIALIZABLE_SYM */ + YYSYMBOL_SERIAL_SYM = 660, /* SERIAL_SYM */ + YYSYMBOL_SESSION_SYM = 661, /* SESSION_SYM */ + YYSYMBOL_SERVER_SYM = 662, /* SERVER_SYM */ + YYSYMBOL_SETVAL_SYM = 663, /* SETVAL_SYM */ + YYSYMBOL_SHARE_SYM = 664, /* SHARE_SYM */ + YYSYMBOL_SHUTDOWN = 665, /* SHUTDOWN */ + YYSYMBOL_SIGNED_SYM = 666, /* SIGNED_SYM */ + YYSYMBOL_SIMPLE_SYM = 667, /* SIMPLE_SYM */ + YYSYMBOL_SKIP_SYM = 668, /* SKIP_SYM */ + YYSYMBOL_SLAVE = 669, /* SLAVE */ + YYSYMBOL_SLAVES = 670, /* SLAVES */ + YYSYMBOL_SLAVE_POS_SYM = 671, /* SLAVE_POS_SYM */ + YYSYMBOL_SLOW = 672, /* SLOW */ + YYSYMBOL_SNAPSHOT_SYM = 673, /* SNAPSHOT_SYM */ + YYSYMBOL_SOCKET_SYM = 674, /* SOCKET_SYM */ + YYSYMBOL_SOFT_SYM = 675, /* SOFT_SYM */ + YYSYMBOL_SONAME_SYM = 676, /* SONAME_SYM */ + YYSYMBOL_SOUNDS_SYM = 677, /* SOUNDS_SYM */ + YYSYMBOL_SOURCE_SYM = 678, /* SOURCE_SYM */ + YYSYMBOL_SQL_BUFFER_RESULT = 679, /* SQL_BUFFER_RESULT */ + YYSYMBOL_SQL_CACHE_SYM = 680, /* SQL_CACHE_SYM */ + YYSYMBOL_SQL_CALC_FOUND_ROWS = 681, /* SQL_CALC_FOUND_ROWS */ + YYSYMBOL_SQL_NO_CACHE_SYM = 682, /* SQL_NO_CACHE_SYM */ + YYSYMBOL_SQL_THREAD = 683, /* SQL_THREAD */ + YYSYMBOL_STAGE_SYM = 684, /* STAGE_SYM */ + YYSYMBOL_STARTS_SYM = 685, /* STARTS_SYM */ + YYSYMBOL_START_SYM = 686, /* START_SYM */ + YYSYMBOL_STATEMENT_SYM = 687, /* STATEMENT_SYM */ + YYSYMBOL_STATUS_SYM = 688, /* STATUS_SYM */ + YYSYMBOL_STOP_SYM = 689, /* STOP_SYM */ + YYSYMBOL_STORAGE_SYM = 690, /* STORAGE_SYM */ + YYSYMBOL_STORED_SYM = 691, /* STORED_SYM */ + YYSYMBOL_STRING_SYM = 692, /* STRING_SYM */ + YYSYMBOL_SUBCLASS_ORIGIN_SYM = 693, /* SUBCLASS_ORIGIN_SYM */ + YYSYMBOL_SUBDATE_SYM = 694, /* SUBDATE_SYM */ + YYSYMBOL_SUBJECT_SYM = 695, /* SUBJECT_SYM */ + YYSYMBOL_SUBPARTITIONS_SYM = 696, /* SUBPARTITIONS_SYM */ + YYSYMBOL_SUBPARTITION_SYM = 697, /* SUBPARTITION_SYM */ + YYSYMBOL_SUPER_SYM = 698, /* SUPER_SYM */ + YYSYMBOL_SUSPEND_SYM = 699, /* SUSPEND_SYM */ + YYSYMBOL_SWAPS_SYM = 700, /* SWAPS_SYM */ + YYSYMBOL_SWITCHES_SYM = 701, /* SWITCHES_SYM */ + YYSYMBOL_SYSTEM = 702, /* SYSTEM */ + YYSYMBOL_SYSTEM_TIME_SYM = 703, /* SYSTEM_TIME_SYM */ + YYSYMBOL_TABLES = 704, /* TABLES */ + YYSYMBOL_TABLESPACE = 705, /* TABLESPACE */ + YYSYMBOL_TABLE_CHECKSUM_SYM = 706, /* TABLE_CHECKSUM_SYM */ + YYSYMBOL_TABLE_NAME_SYM = 707, /* TABLE_NAME_SYM */ + YYSYMBOL_TEMPORARY = 708, /* TEMPORARY */ + YYSYMBOL_TEMPTABLE_SYM = 709, /* TEMPTABLE_SYM */ + YYSYMBOL_TEXT_SYM = 710, /* TEXT_SYM */ + YYSYMBOL_THAN_SYM = 711, /* THAN_SYM */ + YYSYMBOL_TIES_SYM = 712, /* TIES_SYM */ + YYSYMBOL_TIMESTAMP = 713, /* TIMESTAMP */ + YYSYMBOL_TIMESTAMP_ADD = 714, /* TIMESTAMP_ADD */ + YYSYMBOL_TIMESTAMP_DIFF = 715, /* TIMESTAMP_DIFF */ + YYSYMBOL_TIME_SYM = 716, /* TIME_SYM */ + YYSYMBOL_TRANSACTION_SYM = 717, /* TRANSACTION_SYM */ + YYSYMBOL_TRANSACTIONAL_SYM = 718, /* TRANSACTIONAL_SYM */ + YYSYMBOL_THREADS_SYM = 719, /* THREADS_SYM */ + YYSYMBOL_TRIGGERS_SYM = 720, /* TRIGGERS_SYM */ + YYSYMBOL_TRIM_ORACLE = 721, /* TRIM_ORACLE */ + YYSYMBOL_TRUNCATE_SYM = 722, /* TRUNCATE_SYM */ + YYSYMBOL_TYPE_SYM = 723, /* TYPE_SYM */ + YYSYMBOL_UDF_RETURNS_SYM = 724, /* UDF_RETURNS_SYM */ + YYSYMBOL_UNBOUNDED_SYM = 725, /* UNBOUNDED_SYM */ + YYSYMBOL_UNCOMMITTED_SYM = 726, /* UNCOMMITTED_SYM */ + YYSYMBOL_UNDEFINED_SYM = 727, /* UNDEFINED_SYM */ + YYSYMBOL_UNDOFILE_SYM = 728, /* UNDOFILE_SYM */ + YYSYMBOL_UNDO_BUFFER_SIZE_SYM = 729, /* UNDO_BUFFER_SIZE_SYM */ + YYSYMBOL_UNICODE_SYM = 730, /* UNICODE_SYM */ + YYSYMBOL_UNINSTALL_SYM = 731, /* UNINSTALL_SYM */ + YYSYMBOL_UNKNOWN_SYM = 732, /* UNKNOWN_SYM */ + YYSYMBOL_UNTIL_SYM = 733, /* UNTIL_SYM */ + YYSYMBOL_UPGRADE_SYM = 734, /* UPGRADE_SYM */ + YYSYMBOL_USER_SYM = 735, /* USER_SYM */ + YYSYMBOL_USE_FRM = 736, /* USE_FRM */ + YYSYMBOL_VALUE_SYM = 737, /* VALUE_SYM */ + YYSYMBOL_VARCHAR2_MARIADB_SYM = 738, /* VARCHAR2_MARIADB_SYM */ + YYSYMBOL_VARCHAR2_ORACLE_SYM = 739, /* VARCHAR2_ORACLE_SYM */ + YYSYMBOL_VARIABLES = 740, /* VARIABLES */ + YYSYMBOL_VERSIONING_SYM = 741, /* VERSIONING_SYM */ + YYSYMBOL_VIA_SYM = 742, /* VIA_SYM */ + YYSYMBOL_VIEW_SYM = 743, /* VIEW_SYM */ + YYSYMBOL_VISIBLE_SYM = 744, /* VISIBLE_SYM */ + YYSYMBOL_VIRTUAL_SYM = 745, /* VIRTUAL_SYM */ + YYSYMBOL_WAIT_SYM = 746, /* WAIT_SYM */ + YYSYMBOL_WARNINGS = 747, /* WARNINGS */ + YYSYMBOL_WEEK_SYM = 748, /* WEEK_SYM */ + YYSYMBOL_WEIGHT_STRING_SYM = 749, /* WEIGHT_STRING_SYM */ + YYSYMBOL_WINDOW_SYM = 750, /* WINDOW_SYM */ + YYSYMBOL_WITHIN = 751, /* WITHIN */ + YYSYMBOL_WITHOUT = 752, /* WITHOUT */ + YYSYMBOL_WORK_SYM = 753, /* WORK_SYM */ + YYSYMBOL_WRAPPER_SYM = 754, /* WRAPPER_SYM */ + YYSYMBOL_WRITE_SYM = 755, /* WRITE_SYM */ + YYSYMBOL_X509_SYM = 756, /* X509_SYM */ + YYSYMBOL_XA_SYM = 757, /* XA_SYM */ + YYSYMBOL_XML_SYM = 758, /* XML_SYM */ + YYSYMBOL_YEAR_SYM = 759, /* YEAR_SYM */ + YYSYMBOL_CONDITIONLESS_JOIN = 760, /* CONDITIONLESS_JOIN */ + YYSYMBOL_ON_SYM = 761, /* ON_SYM */ + YYSYMBOL_PREC_BELOW_NOT = 762, /* PREC_BELOW_NOT */ + YYSYMBOL_763_ = 763, /* '=' */ + YYSYMBOL_764_ = 764, /* '>' */ + YYSYMBOL_765_ = 765, /* '<' */ + YYSYMBOL_766_ = 766, /* '|' */ + YYSYMBOL_767_ = 767, /* '&' */ + YYSYMBOL_768_ = 768, /* '-' */ + YYSYMBOL_769_ = 769, /* '+' */ + YYSYMBOL_770_ = 770, /* '*' */ + YYSYMBOL_771_ = 771, /* '/' */ + YYSYMBOL_772_ = 772, /* '%' */ + YYSYMBOL_773_ = 773, /* '^' */ + YYSYMBOL_774_ = 774, /* '~' */ + YYSYMBOL_SUBQUERY_AS_EXPR = 775, /* SUBQUERY_AS_EXPR */ + YYSYMBOL_PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 776, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + YYSYMBOL_USER = 777, /* USER */ + YYSYMBOL_PREC_BELOW_CONTRACTION_TOKEN2 = 778, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + YYSYMBOL_779_ = 779, /* '(' */ + YYSYMBOL_780_ = 780, /* ')' */ + YYSYMBOL_EMPTY_FROM_CLAUSE = 781, /* EMPTY_FROM_CLAUSE */ + YYSYMBOL_782_ = 782, /* ',' */ + YYSYMBOL_783_ = 783, /* '!' */ + YYSYMBOL_784_ = 784, /* '{' */ + YYSYMBOL_785_ = 785, /* '}' */ + YYSYMBOL_786_ = 786, /* ';' */ + YYSYMBOL_787_ = 787, /* '.' */ + YYSYMBOL_788_ = 788, /* ':' */ + YYSYMBOL_YYACCEPT = 789, /* $accept */ + YYSYMBOL_query = 790, /* query */ + YYSYMBOL_791_1 = 791, /* $@1 */ + YYSYMBOL_opt_end_of_input = 792, /* opt_end_of_input */ + YYSYMBOL_directly_executable_statement = 793, /* directly_executable_statement */ + YYSYMBOL_verb_clause = 794, /* verb_clause */ + YYSYMBOL_deallocate = 795, /* deallocate */ + YYSYMBOL_deallocate_or_drop = 796, /* deallocate_or_drop */ + YYSYMBOL_prepare = 797, /* prepare */ + YYSYMBOL_798_2 = 798, /* $@2 */ + YYSYMBOL_execute = 799, /* execute */ + YYSYMBOL_800_3 = 800, /* $@3 */ + YYSYMBOL_801_4 = 801, /* $@4 */ + YYSYMBOL_execute_using = 802, /* execute_using */ + YYSYMBOL_803_5 = 803, /* $@5 */ + YYSYMBOL_execute_params = 804, /* execute_params */ + YYSYMBOL_help = 805, /* help */ + YYSYMBOL_806_6 = 806, /* $@6 */ + YYSYMBOL_change = 807, /* change */ + YYSYMBOL_808_7 = 808, /* $@7 */ + YYSYMBOL_master_defs = 809, /* master_defs */ + YYSYMBOL_master_def = 810, /* master_def */ + YYSYMBOL_ignore_server_id_list = 811, /* ignore_server_id_list */ + YYSYMBOL_ignore_server_id = 812, /* ignore_server_id */ + YYSYMBOL_do_domain_id_list = 813, /* do_domain_id_list */ + YYSYMBOL_do_domain_id = 814, /* do_domain_id */ + YYSYMBOL_ignore_domain_id_list = 815, /* ignore_domain_id_list */ + YYSYMBOL_ignore_domain_id = 816, /* ignore_domain_id */ + YYSYMBOL_master_file_def = 817, /* master_file_def */ + YYSYMBOL_optional_connection_name = 818, /* optional_connection_name */ + YYSYMBOL_connection_name = 819, /* connection_name */ + YYSYMBOL_optional_for_channel = 820, /* optional_for_channel */ + YYSYMBOL_for_channel = 821, /* for_channel */ + YYSYMBOL_create = 822, /* create */ + YYSYMBOL_823_8 = 823, /* $@8 */ + YYSYMBOL_824_9 = 824, /* $@9 */ + YYSYMBOL_825_10 = 825, /* $@10 */ + YYSYMBOL_826_11 = 826, /* $@11 */ + YYSYMBOL_827_12 = 827, /* $@12 */ + YYSYMBOL_828_13 = 828, /* $@13 */ + YYSYMBOL_829_14 = 829, /* $@14 */ + YYSYMBOL_830_15 = 830, /* $@15 */ + YYSYMBOL_831_16 = 831, /* $@16 */ + YYSYMBOL_832_17 = 832, /* $@17 */ + YYSYMBOL_833_18 = 833, /* $@18 */ + YYSYMBOL_834_19 = 834, /* $@19 */ + YYSYMBOL_835_20 = 835, /* $@20 */ + YYSYMBOL_836_21 = 836, /* $@21 */ + YYSYMBOL_837_22 = 837, /* $@22 */ + YYSYMBOL_838_23 = 838, /* $@23 */ + YYSYMBOL_839_24 = 839, /* $@24 */ + YYSYMBOL_opt_sequence = 840, /* opt_sequence */ + YYSYMBOL_sequence_defs = 841, /* sequence_defs */ + YYSYMBOL_sequence_def = 842, /* sequence_def */ + YYSYMBOL_force_lookahead = 843, /* force_lookahead */ + YYSYMBOL_server_def = 844, /* server_def */ + YYSYMBOL_845_25 = 845, /* $@25 */ + YYSYMBOL_server_options_list = 846, /* server_options_list */ + YYSYMBOL_server_option = 847, /* server_option */ + YYSYMBOL_event_tail = 848, /* event_tail */ + YYSYMBOL_849_26 = 849, /* $@26 */ + YYSYMBOL_ev_schedule_time = 850, /* ev_schedule_time */ + YYSYMBOL_851_27 = 851, /* $@27 */ + YYSYMBOL_opt_ev_status = 852, /* opt_ev_status */ + YYSYMBOL_ev_starts = 853, /* ev_starts */ + YYSYMBOL_ev_ends = 854, /* ev_ends */ + YYSYMBOL_opt_ev_on_completion = 855, /* opt_ev_on_completion */ + YYSYMBOL_ev_on_completion = 856, /* ev_on_completion */ + YYSYMBOL_opt_ev_comment = 857, /* opt_ev_comment */ + YYSYMBOL_ev_sql_stmt = 858, /* ev_sql_stmt */ + YYSYMBOL_859_28 = 859, /* $@28 */ + YYSYMBOL_clear_privileges = 860, /* clear_privileges */ + YYSYMBOL_opt_aggregate = 861, /* opt_aggregate */ + YYSYMBOL_sp_handler = 862, /* sp_handler */ + YYSYMBOL_sp_name = 863, /* sp_name */ + YYSYMBOL_sp_a_chistics = 864, /* sp_a_chistics */ + YYSYMBOL_sp_c_chistics = 865, /* sp_c_chistics */ + YYSYMBOL_sp_chistic = 866, /* sp_chistic */ + YYSYMBOL_sp_c_chistic = 867, /* sp_c_chistic */ + YYSYMBOL_sp_suid = 868, /* sp_suid */ + YYSYMBOL_call = 869, /* call */ + YYSYMBOL_870_29 = 870, /* $@29 */ + YYSYMBOL_871_30 = 871, /* $@30 */ + YYSYMBOL_872_31 = 872, /* $@31 */ + YYSYMBOL_opt_sp_cparam_list = 873, /* opt_sp_cparam_list */ + YYSYMBOL_opt_sp_cparams = 874, /* opt_sp_cparams */ + YYSYMBOL_sp_cparams = 875, /* sp_cparams */ + YYSYMBOL_sp_fdparam_list = 876, /* sp_fdparam_list */ + YYSYMBOL_877_32 = 877, /* $@32 */ + YYSYMBOL_sp_fdparams = 878, /* sp_fdparams */ + YYSYMBOL_sp_param_name = 879, /* sp_param_name */ + YYSYMBOL_sp_pdparam_list = 880, /* sp_pdparam_list */ + YYSYMBOL_sp_pdparams = 881, /* sp_pdparams */ + YYSYMBOL_sp_parameter_type = 882, /* sp_parameter_type */ + YYSYMBOL_sp_parenthesized_pdparam_list = 883, /* sp_parenthesized_pdparam_list */ + YYSYMBOL_884_33 = 884, /* $@33 */ + YYSYMBOL_sp_parenthesized_fdparam_list = 885, /* sp_parenthesized_fdparam_list */ + YYSYMBOL_sp_proc_stmts = 886, /* sp_proc_stmts */ + YYSYMBOL_sp_proc_stmts1 = 887, /* sp_proc_stmts1 */ + YYSYMBOL_optionally_qualified_column_ident = 888, /* optionally_qualified_column_ident */ + YYSYMBOL_row_field_definition = 889, /* row_field_definition */ + YYSYMBOL_row_field_definition_list = 890, /* row_field_definition_list */ + YYSYMBOL_row_type_body = 891, /* row_type_body */ + YYSYMBOL_sp_decl_idents_init_vars = 892, /* sp_decl_idents_init_vars */ + YYSYMBOL_sp_decl_variable_list = 893, /* sp_decl_variable_list */ + YYSYMBOL_894_34 = 894, /* $@34 */ + YYSYMBOL_sp_decl_handler = 895, /* sp_decl_handler */ + YYSYMBOL_896_35 = 896, /* $@35 */ + YYSYMBOL_opt_parenthesized_cursor_formal_parameters = 897, /* opt_parenthesized_cursor_formal_parameters */ + YYSYMBOL_sp_cursor_stmt_lex = 898, /* sp_cursor_stmt_lex */ + YYSYMBOL_sp_cursor_stmt = 899, /* sp_cursor_stmt */ + YYSYMBOL_900_36 = 900, /* $@36 */ + YYSYMBOL_sp_handler_type = 901, /* sp_handler_type */ + YYSYMBOL_sp_hcond_list = 902, /* sp_hcond_list */ + YYSYMBOL_sp_hcond_element = 903, /* sp_hcond_element */ + YYSYMBOL_sp_cond = 904, /* sp_cond */ + YYSYMBOL_sqlstate = 905, /* sqlstate */ + YYSYMBOL_opt_value = 906, /* opt_value */ + YYSYMBOL_sp_hcond = 907, /* sp_hcond */ + YYSYMBOL_raise_stmt_oracle = 908, /* raise_stmt_oracle */ + YYSYMBOL_signal_stmt = 909, /* signal_stmt */ + YYSYMBOL_signal_value = 910, /* signal_value */ + YYSYMBOL_opt_signal_value = 911, /* opt_signal_value */ + YYSYMBOL_opt_set_signal_information = 912, /* opt_set_signal_information */ + YYSYMBOL_signal_information_item_list = 913, /* signal_information_item_list */ + YYSYMBOL_signal_allowed_expr = 914, /* signal_allowed_expr */ + YYSYMBOL_signal_condition_information_item_name = 915, /* signal_condition_information_item_name */ + YYSYMBOL_resignal_stmt = 916, /* resignal_stmt */ + YYSYMBOL_get_diagnostics = 917, /* get_diagnostics */ + YYSYMBOL_which_area = 918, /* which_area */ + YYSYMBOL_diagnostics_information = 919, /* diagnostics_information */ + YYSYMBOL_statement_information = 920, /* statement_information */ + YYSYMBOL_statement_information_item = 921, /* statement_information_item */ + YYSYMBOL_simple_target_specification = 922, /* simple_target_specification */ + YYSYMBOL_statement_information_item_name = 923, /* statement_information_item_name */ + YYSYMBOL_condition_number = 924, /* condition_number */ + YYSYMBOL_condition_information = 925, /* condition_information */ + YYSYMBOL_condition_information_item = 926, /* condition_information_item */ + YYSYMBOL_condition_information_item_name = 927, /* condition_information_item_name */ + YYSYMBOL_sp_decl_ident = 928, /* sp_decl_ident */ + YYSYMBOL_sp_decl_idents = 929, /* sp_decl_idents */ + YYSYMBOL_sp_proc_stmt_if = 930, /* sp_proc_stmt_if */ + YYSYMBOL_931_37 = 931, /* $@37 */ + YYSYMBOL_sp_proc_stmt_statement = 932, /* sp_proc_stmt_statement */ + YYSYMBOL_933_38 = 933, /* $@38 */ + YYSYMBOL_RETURN_ALLMODES_SYM = 934, /* RETURN_ALLMODES_SYM */ + YYSYMBOL_sp_proc_stmt_return = 935, /* sp_proc_stmt_return */ + YYSYMBOL_936_39 = 936, /* $@39 */ + YYSYMBOL_sp_proc_stmt_exit_oracle = 937, /* sp_proc_stmt_exit_oracle */ + YYSYMBOL_938_40 = 938, /* $@40 */ + YYSYMBOL_939_41 = 939, /* $@41 */ + YYSYMBOL_sp_proc_stmt_continue_oracle = 940, /* sp_proc_stmt_continue_oracle */ + YYSYMBOL_941_42 = 941, /* $@42 */ + YYSYMBOL_942_43 = 942, /* $@43 */ + YYSYMBOL_sp_proc_stmt_leave = 943, /* sp_proc_stmt_leave */ + YYSYMBOL_sp_proc_stmt_iterate = 944, /* sp_proc_stmt_iterate */ + YYSYMBOL_sp_proc_stmt_goto_oracle = 945, /* sp_proc_stmt_goto_oracle */ + YYSYMBOL_expr_lex = 946, /* expr_lex */ + YYSYMBOL_947_44 = 947, /* @44 */ + YYSYMBOL_assignment_source_lex = 948, /* assignment_source_lex */ + YYSYMBOL_assignment_source_expr = 949, /* assignment_source_expr */ + YYSYMBOL_950_45 = 950, /* $@45 */ + YYSYMBOL_for_loop_bound_expr = 951, /* for_loop_bound_expr */ + YYSYMBOL_952_46 = 952, /* $@46 */ + YYSYMBOL_cursor_actual_parameters = 953, /* cursor_actual_parameters */ + YYSYMBOL_opt_parenthesized_cursor_actual_parameters = 954, /* opt_parenthesized_cursor_actual_parameters */ + YYSYMBOL_sp_proc_stmt_with_cursor = 955, /* sp_proc_stmt_with_cursor */ + YYSYMBOL_sp_proc_stmt_open = 956, /* sp_proc_stmt_open */ + YYSYMBOL_sp_proc_stmt_fetch_head = 957, /* sp_proc_stmt_fetch_head */ + YYSYMBOL_sp_proc_stmt_fetch = 958, /* sp_proc_stmt_fetch */ + YYSYMBOL_sp_proc_stmt_close = 959, /* sp_proc_stmt_close */ + YYSYMBOL_sp_fetch_list = 960, /* sp_fetch_list */ + YYSYMBOL_sp_if = 961, /* sp_if */ + YYSYMBOL_962_47 = 962, /* $@47 */ + YYSYMBOL_963_48 = 963, /* $@48 */ + YYSYMBOL_sp_elseifs = 964, /* sp_elseifs */ + YYSYMBOL_case_stmt_specification = 965, /* case_stmt_specification */ + YYSYMBOL_966_49 = 966, /* $@49 */ + YYSYMBOL_case_stmt_body = 967, /* case_stmt_body */ + YYSYMBOL_968_50 = 968, /* $@50 */ + YYSYMBOL_simple_when_clause_list = 969, /* simple_when_clause_list */ + YYSYMBOL_searched_when_clause_list = 970, /* searched_when_clause_list */ + YYSYMBOL_simple_when_clause = 971, /* simple_when_clause */ + YYSYMBOL_972_51 = 972, /* $@51 */ + YYSYMBOL_searched_when_clause = 973, /* searched_when_clause */ + YYSYMBOL_974_52 = 974, /* $@52 */ + YYSYMBOL_else_clause_opt = 975, /* else_clause_opt */ + YYSYMBOL_sp_opt_label = 976, /* sp_opt_label */ + YYSYMBOL_opt_sp_for_loop_direction = 977, /* opt_sp_for_loop_direction */ + YYSYMBOL_sp_for_loop_index_and_bounds = 978, /* sp_for_loop_index_and_bounds */ + YYSYMBOL_sp_for_loop_bounds = 979, /* sp_for_loop_bounds */ + YYSYMBOL_loop_body = 980, /* loop_body */ + YYSYMBOL_repeat_body = 981, /* repeat_body */ + YYSYMBOL_pop_sp_loop_label = 982, /* pop_sp_loop_label */ + YYSYMBOL_sp_labeled_control = 983, /* sp_labeled_control */ + YYSYMBOL_984_53 = 984, /* $@53 */ + YYSYMBOL_985_54 = 985, /* $@54 */ + YYSYMBOL_986_55 = 986, /* $@55 */ + YYSYMBOL_987_56 = 987, /* $@56 */ + YYSYMBOL_988_57 = 988, /* $@57 */ + YYSYMBOL_989_58 = 989, /* $@58 */ + YYSYMBOL_sp_unlabeled_control = 990, /* sp_unlabeled_control */ + YYSYMBOL_991_59 = 991, /* $@59 */ + YYSYMBOL_992_60 = 992, /* $@60 */ + YYSYMBOL_993_61 = 993, /* $@61 */ + YYSYMBOL_994_62 = 994, /* $@62 */ + YYSYMBOL_995_63 = 995, /* $@63 */ + YYSYMBOL_trg_action_time = 996, /* trg_action_time */ + YYSYMBOL_trg_event = 997, /* trg_event */ + YYSYMBOL_create_body = 998, /* create_body */ + YYSYMBOL_999_64 = 999, /* $@64 */ + YYSYMBOL_create_like = 1000, /* create_like */ + YYSYMBOL_opt_create_select = 1001, /* opt_create_select */ + YYSYMBOL_create_select_query_expression = 1002, /* create_select_query_expression */ + YYSYMBOL_opt_create_partitioning = 1003, /* opt_create_partitioning */ + YYSYMBOL_opt_partitioning = 1004, /* opt_partitioning */ + YYSYMBOL_partitioning = 1005, /* partitioning */ + YYSYMBOL_1006_65 = 1006, /* $@65 */ + YYSYMBOL_have_partitioning = 1007, /* have_partitioning */ + YYSYMBOL_partition_entry = 1008, /* partition_entry */ + YYSYMBOL_1009_66 = 1009, /* $@66 */ + YYSYMBOL_partition = 1010, /* partition */ + YYSYMBOL_1011_67 = 1011, /* $@67 */ + YYSYMBOL_part_type_def = 1012, /* part_type_def */ + YYSYMBOL_1013_68 = 1013, /* $@68 */ + YYSYMBOL_1014_69 = 1014, /* $@69 */ + YYSYMBOL_1015_70 = 1015, /* $@70 */ + YYSYMBOL_opt_linear = 1016, /* opt_linear */ + YYSYMBOL_opt_key_algo = 1017, /* opt_key_algo */ + YYSYMBOL_part_field_list = 1018, /* part_field_list */ + YYSYMBOL_part_field_item_list = 1019, /* part_field_item_list */ + YYSYMBOL_part_field_item = 1020, /* part_field_item */ + YYSYMBOL_part_column_list = 1021, /* part_column_list */ + YYSYMBOL_part_func = 1022, /* part_func */ + YYSYMBOL_sub_part_func = 1023, /* sub_part_func */ + YYSYMBOL_opt_num_parts = 1024, /* opt_num_parts */ + YYSYMBOL_opt_sub_part = 1025, /* opt_sub_part */ + YYSYMBOL_1026_71 = 1026, /* $@71 */ + YYSYMBOL_1027_72 = 1027, /* $@72 */ + YYSYMBOL_sub_part_field_list = 1028, /* sub_part_field_list */ + YYSYMBOL_sub_part_field_item = 1029, /* sub_part_field_item */ + YYSYMBOL_part_func_expr = 1030, /* part_func_expr */ + YYSYMBOL_opt_num_subparts = 1031, /* opt_num_subparts */ + YYSYMBOL_part_defs = 1032, /* part_defs */ + YYSYMBOL_part_def_list = 1033, /* part_def_list */ + YYSYMBOL_opt_partition = 1034, /* opt_partition */ + YYSYMBOL_part_definition = 1035, /* part_definition */ + YYSYMBOL_1036_73 = 1036, /* $@73 */ + YYSYMBOL_part_name = 1037, /* part_name */ + YYSYMBOL_opt_part_values = 1038, /* opt_part_values */ + YYSYMBOL_1039_74 = 1039, /* $@74 */ + YYSYMBOL_1040_75 = 1040, /* $@75 */ + YYSYMBOL_part_func_max = 1041, /* part_func_max */ + YYSYMBOL_part_values_in = 1042, /* part_values_in */ + YYSYMBOL_part_value_list = 1043, /* part_value_list */ + YYSYMBOL_part_value_item = 1044, /* part_value_item */ + YYSYMBOL_1045_76 = 1045, /* $@76 */ + YYSYMBOL_1046_77 = 1046, /* $@77 */ + YYSYMBOL_part_value_item_list = 1047, /* part_value_item_list */ + YYSYMBOL_part_value_expr_item = 1048, /* part_value_expr_item */ + YYSYMBOL_opt_sub_partition = 1049, /* opt_sub_partition */ + YYSYMBOL_sub_part_list = 1050, /* sub_part_list */ + YYSYMBOL_sub_part_definition = 1051, /* sub_part_definition */ + YYSYMBOL_1052_78 = 1052, /* $@78 */ + YYSYMBOL_sub_name = 1053, /* sub_name */ + YYSYMBOL_opt_part_options = 1054, /* opt_part_options */ + YYSYMBOL_part_option_list = 1055, /* part_option_list */ + YYSYMBOL_part_option = 1056, /* part_option */ + YYSYMBOL_opt_subpart_options = 1057, /* opt_subpart_options */ + YYSYMBOL_subpart_option_list = 1058, /* subpart_option_list */ + YYSYMBOL_server_part_option = 1059, /* server_part_option */ + YYSYMBOL_opt_versioning_rotation = 1060, /* opt_versioning_rotation */ + YYSYMBOL_1061_79 = 1061, /* $@79 */ + YYSYMBOL_opt_versioning_interval_start = 1062, /* opt_versioning_interval_start */ + YYSYMBOL_opt_vers_auto_part = 1063, /* opt_vers_auto_part */ + YYSYMBOL_opt_as = 1064, /* opt_as */ + YYSYMBOL_opt_create_database_options = 1065, /* opt_create_database_options */ + YYSYMBOL_create_database_options = 1066, /* create_database_options */ + YYSYMBOL_create_database_option = 1067, /* create_database_option */ + YYSYMBOL_opt_if_not_exists_table_element = 1068, /* opt_if_not_exists_table_element */ + YYSYMBOL_opt_if_not_exists = 1069, /* opt_if_not_exists */ + YYSYMBOL_create_or_replace = 1070, /* create_or_replace */ + YYSYMBOL_opt_create_table_options = 1071, /* opt_create_table_options */ + YYSYMBOL_create_table_options_space_separated = 1072, /* create_table_options_space_separated */ + YYSYMBOL_create_table_options = 1073, /* create_table_options */ + YYSYMBOL_create_table_option = 1074, /* create_table_option */ + YYSYMBOL_1075_80 = 1075, /* $@80 */ + YYSYMBOL_engine_defined_option = 1076, /* engine_defined_option */ + YYSYMBOL_opt_versioning_option = 1077, /* opt_versioning_option */ + YYSYMBOL_versioning_option = 1078, /* versioning_option */ + YYSYMBOL_default_charset = 1079, /* default_charset */ + YYSYMBOL_default_collation = 1080, /* default_collation */ + YYSYMBOL_storage_engines = 1081, /* storage_engines */ + YYSYMBOL_known_storage_engines = 1082, /* known_storage_engines */ + YYSYMBOL_row_types = 1083, /* row_types */ + YYSYMBOL_merge_insert_types = 1084, /* merge_insert_types */ + YYSYMBOL_udf_type = 1085, /* udf_type */ + YYSYMBOL_create_field_list = 1086, /* create_field_list */ + YYSYMBOL_create_field_list_parens = 1087, /* create_field_list_parens */ + YYSYMBOL_field_list = 1088, /* field_list */ + YYSYMBOL_field_list_item = 1089, /* field_list_item */ + YYSYMBOL_column_def = 1090, /* column_def */ + YYSYMBOL_key_def = 1091, /* key_def */ + YYSYMBOL_1092_81 = 1092, /* $@81 */ + YYSYMBOL_1093_82 = 1093, /* $@82 */ + YYSYMBOL_1094_83 = 1094, /* $@83 */ + YYSYMBOL_1095_84 = 1095, /* $@84 */ + YYSYMBOL_1096_85 = 1096, /* $@85 */ + YYSYMBOL_1097_86 = 1097, /* $@86 */ + YYSYMBOL_1098_87 = 1098, /* $@87 */ + YYSYMBOL_constraint_def = 1099, /* constraint_def */ + YYSYMBOL_period_for_system_time = 1100, /* period_for_system_time */ + YYSYMBOL_period_for_application_time = 1101, /* period_for_application_time */ + YYSYMBOL_opt_check_constraint = 1102, /* opt_check_constraint */ + YYSYMBOL_check_constraint = 1103, /* check_constraint */ + YYSYMBOL_opt_constraint_no_id = 1104, /* opt_constraint_no_id */ + YYSYMBOL_opt_constraint = 1105, /* opt_constraint */ + YYSYMBOL_constraint = 1106, /* constraint */ + YYSYMBOL_field_spec = 1107, /* field_spec */ + YYSYMBOL_1108_88 = 1108, /* @88 */ + YYSYMBOL_field_type_or_serial = 1109, /* field_type_or_serial */ + YYSYMBOL_1110_89 = 1110, /* $@89 */ + YYSYMBOL_1111_90 = 1111, /* $@90 */ + YYSYMBOL_opt_serial_attribute = 1112, /* opt_serial_attribute */ + YYSYMBOL_opt_serial_attribute_list = 1113, /* opt_serial_attribute_list */ + YYSYMBOL_opt_asrow_attribute = 1114, /* opt_asrow_attribute */ + YYSYMBOL_opt_asrow_attribute_list = 1115, /* opt_asrow_attribute_list */ + YYSYMBOL_field_def = 1116, /* field_def */ + YYSYMBOL_1117_91 = 1117, /* $@91 */ + YYSYMBOL_opt_generated_always = 1118, /* opt_generated_always */ + YYSYMBOL_vcol_opt_specifier = 1119, /* vcol_opt_specifier */ + YYSYMBOL_vcol_opt_attribute = 1120, /* vcol_opt_attribute */ + YYSYMBOL_vcol_opt_attribute_list = 1121, /* vcol_opt_attribute_list */ + YYSYMBOL_vcol_attribute = 1122, /* vcol_attribute */ + YYSYMBOL_parse_vcol_expr = 1123, /* parse_vcol_expr */ + YYSYMBOL_1124_92 = 1124, /* $@92 */ + YYSYMBOL_parenthesized_expr = 1125, /* parenthesized_expr */ + YYSYMBOL_virtual_column_func = 1126, /* virtual_column_func */ + YYSYMBOL_expr_or_literal = 1127, /* expr_or_literal */ + YYSYMBOL_column_default_expr = 1128, /* column_default_expr */ + YYSYMBOL_field_type = 1129, /* field_type */ + YYSYMBOL_qualified_field_type = 1130, /* qualified_field_type */ + YYSYMBOL_udt_name = 1131, /* udt_name */ + YYSYMBOL_field_type_all = 1132, /* field_type_all */ + YYSYMBOL_field_type_numeric = 1133, /* field_type_numeric */ + YYSYMBOL_opt_binary_and_compression = 1134, /* opt_binary_and_compression */ + YYSYMBOL_field_type_string = 1135, /* field_type_string */ + YYSYMBOL_field_type_temporal = 1136, /* field_type_temporal */ + YYSYMBOL_field_type_lob = 1137, /* field_type_lob */ + YYSYMBOL_field_type_misc = 1138, /* field_type_misc */ + YYSYMBOL_char = 1139, /* char */ + YYSYMBOL_nchar = 1140, /* nchar */ + YYSYMBOL_varchar = 1141, /* varchar */ + YYSYMBOL_nvarchar = 1142, /* nvarchar */ + YYSYMBOL_int_type = 1143, /* int_type */ + YYSYMBOL_real_type = 1144, /* real_type */ + YYSYMBOL_srid_option = 1145, /* srid_option */ + YYSYMBOL_float_options = 1146, /* float_options */ + YYSYMBOL_precision = 1147, /* precision */ + YYSYMBOL_field_options = 1148, /* field_options */ + YYSYMBOL_last_field_options = 1149, /* last_field_options */ + YYSYMBOL_field_length_str = 1150, /* field_length_str */ + YYSYMBOL_field_length = 1151, /* field_length */ + YYSYMBOL_field_scale = 1152, /* field_scale */ + YYSYMBOL_opt_field_length = 1153, /* opt_field_length */ + YYSYMBOL_opt_field_scale = 1154, /* opt_field_scale */ + YYSYMBOL_opt_precision = 1155, /* opt_precision */ + YYSYMBOL_attribute_list = 1156, /* attribute_list */ + YYSYMBOL_attribute = 1157, /* attribute */ + YYSYMBOL_opt_compression_method = 1158, /* opt_compression_method */ + YYSYMBOL_opt_compressed = 1159, /* opt_compressed */ + YYSYMBOL_opt_enable = 1160, /* opt_enable */ + YYSYMBOL_compressed = 1161, /* compressed */ + YYSYMBOL_compressed_deprecated_data_type_attribute = 1162, /* compressed_deprecated_data_type_attribute */ + YYSYMBOL_compressed_deprecated_column_attribute = 1163, /* compressed_deprecated_column_attribute */ + YYSYMBOL_asrow_attribute = 1164, /* asrow_attribute */ + YYSYMBOL_serial_attribute = 1165, /* serial_attribute */ + YYSYMBOL_with_or_without_system = 1166, /* with_or_without_system */ + YYSYMBOL_charset = 1167, /* charset */ + YYSYMBOL_charset_name = 1168, /* charset_name */ + YYSYMBOL_charset_name_or_default = 1169, /* charset_name_or_default */ + YYSYMBOL_opt_load_data_charset = 1170, /* opt_load_data_charset */ + YYSYMBOL_old_or_new_charset_name = 1171, /* old_or_new_charset_name */ + YYSYMBOL_old_or_new_charset_name_or_default = 1172, /* old_or_new_charset_name_or_default */ + YYSYMBOL_collation_name = 1173, /* collation_name */ + YYSYMBOL_collation_name_or_default = 1174, /* collation_name_or_default */ + YYSYMBOL_opt_default = 1175, /* opt_default */ + YYSYMBOL_charset_or_alias = 1176, /* charset_or_alias */ + YYSYMBOL_opt_binary = 1177, /* opt_binary */ + YYSYMBOL_binary = 1178, /* binary */ + YYSYMBOL_opt_bin_mod = 1179, /* opt_bin_mod */ + YYSYMBOL_ws_nweights = 1180, /* ws_nweights */ + YYSYMBOL_1181_93 = 1181, /* $@93 */ + YYSYMBOL_ws_level_flag_desc = 1182, /* ws_level_flag_desc */ + YYSYMBOL_ws_level_flag_reverse = 1183, /* ws_level_flag_reverse */ + YYSYMBOL_ws_level_flags = 1184, /* ws_level_flags */ + YYSYMBOL_ws_level_number = 1185, /* ws_level_number */ + YYSYMBOL_ws_level_list_item = 1186, /* ws_level_list_item */ + YYSYMBOL_ws_level_list = 1187, /* ws_level_list */ + YYSYMBOL_ws_level_range = 1188, /* ws_level_range */ + YYSYMBOL_ws_level_list_or_range = 1189, /* ws_level_list_or_range */ + YYSYMBOL_opt_ws_levels = 1190, /* opt_ws_levels */ + YYSYMBOL_opt_primary = 1191, /* opt_primary */ + YYSYMBOL_references = 1192, /* references */ + YYSYMBOL_opt_ref_list = 1193, /* opt_ref_list */ + YYSYMBOL_ref_list = 1194, /* ref_list */ + YYSYMBOL_opt_match_clause = 1195, /* opt_match_clause */ + YYSYMBOL_opt_on_update_delete = 1196, /* opt_on_update_delete */ + YYSYMBOL_delete_option = 1197, /* delete_option */ + YYSYMBOL_constraint_key_type = 1198, /* constraint_key_type */ + YYSYMBOL_key_or_index = 1199, /* key_or_index */ + YYSYMBOL_opt_key_or_index = 1200, /* opt_key_or_index */ + YYSYMBOL_keys_or_index = 1201, /* keys_or_index */ + YYSYMBOL_fulltext = 1202, /* fulltext */ + YYSYMBOL_spatial = 1203, /* spatial */ + YYSYMBOL_normal_key_options = 1204, /* normal_key_options */ + YYSYMBOL_fulltext_key_options = 1205, /* fulltext_key_options */ + YYSYMBOL_spatial_key_options = 1206, /* spatial_key_options */ + YYSYMBOL_normal_key_opts = 1207, /* normal_key_opts */ + YYSYMBOL_spatial_key_opts = 1208, /* spatial_key_opts */ + YYSYMBOL_fulltext_key_opts = 1209, /* fulltext_key_opts */ + YYSYMBOL_opt_USING_key_algorithm = 1210, /* opt_USING_key_algorithm */ + YYSYMBOL_opt_key_algorithm_clause = 1211, /* opt_key_algorithm_clause */ + YYSYMBOL_key_using_alg = 1212, /* key_using_alg */ + YYSYMBOL_all_key_opt = 1213, /* all_key_opt */ + YYSYMBOL_normal_key_opt = 1214, /* normal_key_opt */ + YYSYMBOL_spatial_key_opt = 1215, /* spatial_key_opt */ + YYSYMBOL_fulltext_key_opt = 1216, /* fulltext_key_opt */ + YYSYMBOL_btree_or_rtree = 1217, /* btree_or_rtree */ + YYSYMBOL_ignorability = 1218, /* ignorability */ + YYSYMBOL_key_list = 1219, /* key_list */ + YYSYMBOL_opt_without_overlaps = 1220, /* opt_without_overlaps */ + YYSYMBOL_key_part = 1221, /* key_part */ + YYSYMBOL_opt_ident = 1222, /* opt_ident */ + YYSYMBOL_string_list = 1223, /* string_list */ + YYSYMBOL_alter = 1224, /* alter */ + YYSYMBOL_1225_94 = 1225, /* $@94 */ + YYSYMBOL_1226_95 = 1226, /* $@95 */ + YYSYMBOL_1227_96 = 1227, /* $@96 */ + YYSYMBOL_1228_97 = 1228, /* $@97 */ + YYSYMBOL_1229_98 = 1229, /* $@98 */ + YYSYMBOL_1230_99 = 1230, /* $@99 */ + YYSYMBOL_1231_100 = 1231, /* $@100 */ + YYSYMBOL_1232_101 = 1232, /* $@101 */ + YYSYMBOL_1233_102 = 1233, /* $@102 */ + YYSYMBOL_1234_103 = 1234, /* $@103 */ + YYSYMBOL_1235_104 = 1235, /* $@104 */ + YYSYMBOL_1236_105 = 1236, /* $@105 */ + YYSYMBOL_1237_106 = 1237, /* $@106 */ + YYSYMBOL_account_locking_option = 1238, /* account_locking_option */ + YYSYMBOL_opt_password_expire_option = 1239, /* opt_password_expire_option */ + YYSYMBOL_opt_account_locking_and_opt_password_expiration = 1240, /* opt_account_locking_and_opt_password_expiration */ + YYSYMBOL_ev_alter_on_schedule_completion = 1241, /* ev_alter_on_schedule_completion */ + YYSYMBOL_opt_ev_rename_to = 1242, /* opt_ev_rename_to */ + YYSYMBOL_opt_ev_sql_stmt = 1243, /* opt_ev_sql_stmt */ + YYSYMBOL_ident_or_empty = 1244, /* ident_or_empty */ + YYSYMBOL_alter_commands = 1245, /* alter_commands */ + YYSYMBOL_1246_107 = 1246, /* $@107 */ + YYSYMBOL_1247_108 = 1247, /* $@108 */ + YYSYMBOL_1248_109 = 1248, /* $@109 */ + YYSYMBOL_1249_110 = 1249, /* $@110 */ + YYSYMBOL_remove_partitioning = 1250, /* remove_partitioning */ + YYSYMBOL_all_or_alt_part_name_list = 1251, /* all_or_alt_part_name_list */ + YYSYMBOL_add_partition_rule = 1252, /* add_partition_rule */ + YYSYMBOL_1253_111 = 1253, /* $@111 */ + YYSYMBOL_add_part_extra = 1254, /* add_part_extra */ + YYSYMBOL_reorg_partition_rule = 1255, /* reorg_partition_rule */ + YYSYMBOL_1256_112 = 1256, /* $@112 */ + YYSYMBOL_reorg_parts_rule = 1257, /* reorg_parts_rule */ + YYSYMBOL_1258_113 = 1258, /* $@113 */ + YYSYMBOL_alt_part_name_list = 1259, /* alt_part_name_list */ + YYSYMBOL_alt_part_name_item = 1260, /* alt_part_name_item */ + YYSYMBOL_alter_list = 1261, /* alter_list */ + YYSYMBOL_add_column = 1262, /* add_column */ + YYSYMBOL_alter_list_item = 1263, /* alter_list_item */ + YYSYMBOL_opt_index_lock_algorithm = 1264, /* opt_index_lock_algorithm */ + YYSYMBOL_alter_algorithm_option = 1265, /* alter_algorithm_option */ + YYSYMBOL_alter_lock_option = 1266, /* alter_lock_option */ + YYSYMBOL_opt_column = 1267, /* opt_column */ + YYSYMBOL_opt_ignore = 1268, /* opt_ignore */ + YYSYMBOL_alter_options = 1269, /* alter_options */ + YYSYMBOL_1270_114 = 1270, /* $@114 */ + YYSYMBOL_alter_options_part2 = 1271, /* alter_options_part2 */ + YYSYMBOL_alter_option_list = 1272, /* alter_option_list */ + YYSYMBOL_alter_option = 1273, /* alter_option */ + YYSYMBOL_opt_restrict = 1274, /* opt_restrict */ + YYSYMBOL_opt_place = 1275, /* opt_place */ + YYSYMBOL_opt_to = 1276, /* opt_to */ + YYSYMBOL_slave = 1277, /* slave */ + YYSYMBOL_1278_115 = 1278, /* $@115 */ + YYSYMBOL_1279_116 = 1279, /* $@116 */ + YYSYMBOL_start = 1280, /* start */ + YYSYMBOL_opt_start_transaction_option_list = 1281, /* opt_start_transaction_option_list */ + YYSYMBOL_start_transaction_option_list = 1282, /* start_transaction_option_list */ + YYSYMBOL_start_transaction_option = 1283, /* start_transaction_option */ + YYSYMBOL_slave_thread_opts = 1284, /* slave_thread_opts */ + YYSYMBOL_1285_117 = 1285, /* $@117 */ + YYSYMBOL_slave_thread_opt_list = 1286, /* slave_thread_opt_list */ + YYSYMBOL_slave_thread_opt = 1287, /* slave_thread_opt */ + YYSYMBOL_slave_until = 1288, /* slave_until */ + YYSYMBOL_slave_until_opts = 1289, /* slave_until_opts */ + YYSYMBOL_checksum = 1290, /* checksum */ + YYSYMBOL_1291_118 = 1291, /* $@118 */ + YYSYMBOL_opt_checksum_type = 1292, /* opt_checksum_type */ + YYSYMBOL_repair_table_or_view = 1293, /* repair_table_or_view */ + YYSYMBOL_1294_119 = 1294, /* $@119 */ + YYSYMBOL_repair = 1295, /* repair */ + YYSYMBOL_1296_120 = 1296, /* $@120 */ + YYSYMBOL_opt_mi_repair_type = 1297, /* opt_mi_repair_type */ + YYSYMBOL_mi_repair_types = 1298, /* mi_repair_types */ + YYSYMBOL_mi_repair_type = 1299, /* mi_repair_type */ + YYSYMBOL_opt_view_repair_type = 1300, /* opt_view_repair_type */ + YYSYMBOL_analyze = 1301, /* analyze */ + YYSYMBOL_1302_121 = 1302, /* $@121 */ + YYSYMBOL_analyze_table_list = 1303, /* analyze_table_list */ + YYSYMBOL_analyze_table_elem_spec = 1304, /* analyze_table_elem_spec */ + YYSYMBOL_opt_persistent_stat_clause = 1305, /* opt_persistent_stat_clause */ + YYSYMBOL_persistent_stat_spec = 1306, /* persistent_stat_spec */ + YYSYMBOL_persistent_column_stat_spec = 1307, /* persistent_column_stat_spec */ + YYSYMBOL_1308_122 = 1308, /* $@122 */ + YYSYMBOL_persistent_index_stat_spec = 1309, /* persistent_index_stat_spec */ + YYSYMBOL_1310_123 = 1310, /* $@123 */ + YYSYMBOL_table_column_list = 1311, /* table_column_list */ + YYSYMBOL_table_index_list = 1312, /* table_index_list */ + YYSYMBOL_table_index_name = 1313, /* table_index_name */ + YYSYMBOL_binlog_base64_event = 1314, /* binlog_base64_event */ + YYSYMBOL_check_view_or_table = 1315, /* check_view_or_table */ + YYSYMBOL_1316_124 = 1316, /* $@124 */ + YYSYMBOL_check = 1317, /* check */ + YYSYMBOL_1318_125 = 1318, /* $@125 */ + YYSYMBOL_opt_mi_check_type = 1319, /* opt_mi_check_type */ + YYSYMBOL_mi_check_types = 1320, /* mi_check_types */ + YYSYMBOL_mi_check_type = 1321, /* mi_check_type */ + YYSYMBOL_opt_view_check_type = 1322, /* opt_view_check_type */ + YYSYMBOL_optimize = 1323, /* optimize */ + YYSYMBOL_1324_126 = 1324, /* $@126 */ + YYSYMBOL_opt_no_write_to_binlog = 1325, /* opt_no_write_to_binlog */ + YYSYMBOL_rename = 1326, /* rename */ + YYSYMBOL_1327_127 = 1327, /* $@127 */ + YYSYMBOL_rename_list = 1328, /* rename_list */ + YYSYMBOL_table_to_table_list = 1329, /* table_to_table_list */ + YYSYMBOL_table_to_table = 1330, /* table_to_table */ + YYSYMBOL_keycache = 1331, /* keycache */ + YYSYMBOL_1332_128 = 1332, /* $@128 */ + YYSYMBOL_keycache_list_or_parts = 1333, /* keycache_list_or_parts */ + YYSYMBOL_keycache_list = 1334, /* keycache_list */ + YYSYMBOL_assign_to_keycache = 1335, /* assign_to_keycache */ + YYSYMBOL_assign_to_keycache_parts = 1336, /* assign_to_keycache_parts */ + YYSYMBOL_key_cache_name = 1337, /* key_cache_name */ + YYSYMBOL_preload = 1338, /* preload */ + YYSYMBOL_1339_129 = 1339, /* $@129 */ + YYSYMBOL_preload_list_or_parts = 1340, /* preload_list_or_parts */ + YYSYMBOL_preload_list = 1341, /* preload_list */ + YYSYMBOL_preload_keys = 1342, /* preload_keys */ + YYSYMBOL_preload_keys_parts = 1343, /* preload_keys_parts */ + YYSYMBOL_adm_partition = 1344, /* adm_partition */ + YYSYMBOL_1345_130 = 1345, /* $@130 */ + YYSYMBOL_cache_keys_spec = 1346, /* cache_keys_spec */ + YYSYMBOL_1347_131 = 1347, /* $@131 */ + YYSYMBOL_cache_key_list_or_empty = 1348, /* cache_key_list_or_empty */ + YYSYMBOL_opt_ignore_leaves = 1349, /* opt_ignore_leaves */ + YYSYMBOL_select = 1350, /* select */ + YYSYMBOL_1351_132 = 1351, /* $@132 */ + YYSYMBOL_1352_133 = 1352, /* $@133 */ + YYSYMBOL_select_into = 1353, /* select_into */ + YYSYMBOL_1354_134 = 1354, /* $@134 */ + YYSYMBOL_1355_135 = 1355, /* $@135 */ + YYSYMBOL_simple_table = 1356, /* simple_table */ + YYSYMBOL_table_value_constructor = 1357, /* table_value_constructor */ + YYSYMBOL_1358_136 = 1358, /* $@136 */ + YYSYMBOL_query_specification_start = 1359, /* query_specification_start */ + YYSYMBOL_1360_137 = 1360, /* $@137 */ + YYSYMBOL_1361_138 = 1361, /* $@138 */ + YYSYMBOL_query_specification = 1362, /* query_specification */ + YYSYMBOL_select_into_query_specification = 1363, /* select_into_query_specification */ + YYSYMBOL_query_expression = 1364, /* query_expression */ + YYSYMBOL_query_expression_no_with_clause = 1365, /* query_expression_no_with_clause */ + YYSYMBOL_query_expression_body_ext = 1366, /* query_expression_body_ext */ + YYSYMBOL_1367_139 = 1367, /* $@139 */ + YYSYMBOL_1368_140 = 1368, /* $@140 */ + YYSYMBOL_query_expression_body_ext_parens = 1369, /* query_expression_body_ext_parens */ + YYSYMBOL_query_expression_body = 1370, /* query_expression_body */ + YYSYMBOL_1371_141 = 1371, /* $@141 */ + YYSYMBOL_query_primary = 1372, /* query_primary */ + YYSYMBOL_query_simple = 1373, /* query_simple */ + YYSYMBOL_subselect = 1374, /* subselect */ + YYSYMBOL_subquery = 1375, /* subquery */ + YYSYMBOL_opt_from_clause = 1376, /* opt_from_clause */ + YYSYMBOL_from_clause = 1377, /* from_clause */ + YYSYMBOL_table_reference_list = 1378, /* table_reference_list */ + YYSYMBOL_select_options = 1379, /* select_options */ + YYSYMBOL_opt_history_unit = 1380, /* opt_history_unit */ + YYSYMBOL_history_point = 1381, /* history_point */ + YYSYMBOL_for_portion_of_time_clause = 1382, /* for_portion_of_time_clause */ + YYSYMBOL_opt_for_portion_of_time_clause = 1383, /* opt_for_portion_of_time_clause */ + YYSYMBOL_opt_for_system_time_clause = 1384, /* opt_for_system_time_clause */ + YYSYMBOL_system_time_expr = 1385, /* system_time_expr */ + YYSYMBOL_select_option_list = 1386, /* select_option_list */ + YYSYMBOL_select_option = 1387, /* select_option */ + YYSYMBOL_select_lock_type = 1388, /* select_lock_type */ + YYSYMBOL_opt_select_lock_type = 1389, /* opt_select_lock_type */ + YYSYMBOL_opt_lock_wait_timeout_new = 1390, /* opt_lock_wait_timeout_new */ + YYSYMBOL_select_item_list = 1391, /* select_item_list */ + YYSYMBOL_select_item = 1392, /* select_item */ + YYSYMBOL_remember_tok_start = 1393, /* remember_tok_start */ + YYSYMBOL_remember_name = 1394, /* remember_name */ + YYSYMBOL_remember_end = 1395, /* remember_end */ + YYSYMBOL_select_alias = 1396, /* select_alias */ + YYSYMBOL_opt_default_time_precision = 1397, /* opt_default_time_precision */ + YYSYMBOL_opt_time_precision = 1398, /* opt_time_precision */ + YYSYMBOL_optional_braces = 1399, /* optional_braces */ + YYSYMBOL_expr = 1400, /* expr */ + YYSYMBOL_boolean_test = 1401, /* boolean_test */ + YYSYMBOL_predicate = 1402, /* predicate */ + YYSYMBOL_bit_expr = 1403, /* bit_expr */ + YYSYMBOL_or = 1404, /* or */ + YYSYMBOL_and = 1405, /* and */ + YYSYMBOL_not = 1406, /* not */ + YYSYMBOL_not2 = 1407, /* not2 */ + YYSYMBOL_comp_op = 1408, /* comp_op */ + YYSYMBOL_all_or_any = 1409, /* all_or_any */ + YYSYMBOL_opt_dyncol_type = 1410, /* opt_dyncol_type */ + YYSYMBOL_dyncol_type = 1411, /* dyncol_type */ + YYSYMBOL_numeric_dyncol_type = 1412, /* numeric_dyncol_type */ + YYSYMBOL_temporal_dyncol_type = 1413, /* temporal_dyncol_type */ + YYSYMBOL_string_dyncol_type = 1414, /* string_dyncol_type */ + YYSYMBOL_dyncall_create_element = 1415, /* dyncall_create_element */ + YYSYMBOL_dyncall_create_list = 1416, /* dyncall_create_list */ + YYSYMBOL_plsql_cursor_attr = 1417, /* plsql_cursor_attr */ + YYSYMBOL_explicit_cursor_attr = 1418, /* explicit_cursor_attr */ + YYSYMBOL_trim_operands = 1419, /* trim_operands */ + YYSYMBOL_trim_operands_regular = 1420, /* trim_operands_regular */ + YYSYMBOL_trim_operands_special = 1421, /* trim_operands_special */ + YYSYMBOL_column_default_non_parenthesized_expr = 1422, /* column_default_non_parenthesized_expr */ + YYSYMBOL_primary_expr = 1423, /* primary_expr */ + YYSYMBOL_string_factor_expr = 1424, /* string_factor_expr */ + YYSYMBOL_simple_expr = 1425, /* simple_expr */ + YYSYMBOL_mysql_concatenation_expr = 1426, /* mysql_concatenation_expr */ + YYSYMBOL_function_call_keyword_timestamp = 1427, /* function_call_keyword_timestamp */ + YYSYMBOL_function_call_keyword = 1428, /* function_call_keyword */ + YYSYMBOL_substring_operands = 1429, /* substring_operands */ + YYSYMBOL_substring_operands_regular = 1430, /* substring_operands_regular */ + YYSYMBOL_substring_operands_special = 1431, /* substring_operands_special */ + YYSYMBOL_function_call_nonkeyword = 1432, /* function_call_nonkeyword */ + YYSYMBOL_function_call_conflict = 1433, /* function_call_conflict */ + YYSYMBOL_function_call_generic = 1434, /* function_call_generic */ + YYSYMBOL_1435_142 = 1435, /* @142 */ + YYSYMBOL_fulltext_options = 1436, /* fulltext_options */ + YYSYMBOL_opt_natural_language_mode = 1437, /* opt_natural_language_mode */ + YYSYMBOL_opt_query_expansion = 1438, /* opt_query_expansion */ + YYSYMBOL_opt_udf_expr_list = 1439, /* opt_udf_expr_list */ + YYSYMBOL_udf_expr_list = 1440, /* udf_expr_list */ + YYSYMBOL_udf_expr = 1441, /* udf_expr */ + YYSYMBOL_sum_expr = 1442, /* sum_expr */ + YYSYMBOL_1443_143 = 1443, /* $@143 */ + YYSYMBOL_1444_144 = 1444, /* $@144 */ + YYSYMBOL_1445_145 = 1445, /* $@145 */ + YYSYMBOL_1446_146 = 1446, /* $@146 */ + YYSYMBOL_1447_147 = 1447, /* $@147 */ + YYSYMBOL_window_func_expr = 1448, /* window_func_expr */ + YYSYMBOL_window_func = 1449, /* window_func */ + YYSYMBOL_simple_window_func = 1450, /* simple_window_func */ + YYSYMBOL_inverse_distribution_function = 1451, /* inverse_distribution_function */ + YYSYMBOL_percentile_function = 1452, /* percentile_function */ + YYSYMBOL_1453_148 = 1453, /* $@148 */ + YYSYMBOL_inverse_distribution_function_def = 1454, /* inverse_distribution_function_def */ + YYSYMBOL_order_by_single_element_list = 1455, /* order_by_single_element_list */ + YYSYMBOL_window_name = 1456, /* window_name */ + YYSYMBOL_variable = 1457, /* variable */ + YYSYMBOL_1458_149 = 1458, /* $@149 */ + YYSYMBOL_variable_aux = 1459, /* variable_aux */ + YYSYMBOL_opt_distinct = 1460, /* opt_distinct */ + YYSYMBOL_opt_gconcat_separator = 1461, /* opt_gconcat_separator */ + YYSYMBOL_opt_gorder_clause = 1462, /* opt_gorder_clause */ + YYSYMBOL_gorder_list = 1463, /* gorder_list */ + YYSYMBOL_opt_glimit_clause = 1464, /* opt_glimit_clause */ + YYSYMBOL_glimit_clause = 1465, /* glimit_clause */ + YYSYMBOL_glimit_options = 1466, /* glimit_options */ + YYSYMBOL_in_sum_expr = 1467, /* in_sum_expr */ + YYSYMBOL_1468_150 = 1468, /* $@150 */ + YYSYMBOL_cast_type = 1469, /* cast_type */ + YYSYMBOL_cast_type_numeric = 1470, /* cast_type_numeric */ + YYSYMBOL_cast_type_temporal = 1471, /* cast_type_temporal */ + YYSYMBOL_opt_expr_list = 1472, /* opt_expr_list */ + YYSYMBOL_expr_list = 1473, /* expr_list */ + YYSYMBOL_ident_list_arg = 1474, /* ident_list_arg */ + YYSYMBOL_ident_list = 1475, /* ident_list */ + YYSYMBOL_when_list = 1476, /* when_list */ + YYSYMBOL_when_list_opt_else = 1477, /* when_list_opt_else */ + YYSYMBOL_table_ref = 1478, /* table_ref */ + YYSYMBOL_json_text_literal = 1479, /* json_text_literal */ + YYSYMBOL_json_text_literal_or_num = 1480, /* json_text_literal_or_num */ + YYSYMBOL_join_table_list = 1481, /* join_table_list */ + YYSYMBOL_json_table_columns_clause = 1482, /* json_table_columns_clause */ + YYSYMBOL_json_table_columns_list = 1483, /* json_table_columns_list */ + YYSYMBOL_json_table_column = 1484, /* json_table_column */ + YYSYMBOL_1485_151 = 1485, /* $@151 */ + YYSYMBOL_1486_152 = 1486, /* $@152 */ + YYSYMBOL_json_table_column_type = 1487, /* json_table_column_type */ + YYSYMBOL_json_table_field_type = 1488, /* json_table_field_type */ + YYSYMBOL_json_opt_on_empty_or_error = 1489, /* json_opt_on_empty_or_error */ + YYSYMBOL_json_on_response = 1490, /* json_on_response */ + YYSYMBOL_json_on_error_response = 1491, /* json_on_error_response */ + YYSYMBOL_json_on_empty_response = 1492, /* json_on_empty_response */ + YYSYMBOL_table_function = 1493, /* table_function */ + YYSYMBOL_1494_153 = 1494, /* $@153 */ + YYSYMBOL_1495_154 = 1495, /* $@154 */ + YYSYMBOL_esc_table_ref = 1496, /* esc_table_ref */ + YYSYMBOL_derived_table_list = 1497, /* derived_table_list */ + YYSYMBOL_join_table = 1498, /* join_table */ + YYSYMBOL_1499_155 = 1499, /* $@155 */ + YYSYMBOL_1500_156 = 1500, /* $@156 */ + YYSYMBOL_1501_157 = 1501, /* $@157 */ + YYSYMBOL_1502_158 = 1502, /* $@158 */ + YYSYMBOL_1503_159 = 1503, /* $@159 */ + YYSYMBOL_1504_160 = 1504, /* $@160 */ + YYSYMBOL_inner_join = 1505, /* inner_join */ + YYSYMBOL_normal_join = 1506, /* normal_join */ + YYSYMBOL_opt_use_partition = 1507, /* opt_use_partition */ + YYSYMBOL_use_partition = 1508, /* use_partition */ + YYSYMBOL_table_factor = 1509, /* table_factor */ + YYSYMBOL_table_primary_ident_opt_parens = 1510, /* table_primary_ident_opt_parens */ + YYSYMBOL_table_primary_derived_opt_parens = 1511, /* table_primary_derived_opt_parens */ + YYSYMBOL_table_reference_list_parens = 1512, /* table_reference_list_parens */ + YYSYMBOL_nested_table_reference_list = 1513, /* nested_table_reference_list */ + YYSYMBOL_join_table_parens = 1514, /* join_table_parens */ + YYSYMBOL_table_primary_ident = 1515, /* table_primary_ident */ + YYSYMBOL_table_primary_derived = 1516, /* table_primary_derived */ + YYSYMBOL_opt_outer = 1517, /* opt_outer */ + YYSYMBOL_index_hint_clause = 1518, /* index_hint_clause */ + YYSYMBOL_index_hint_type = 1519, /* index_hint_type */ + YYSYMBOL_index_hint_definition = 1520, /* index_hint_definition */ + YYSYMBOL_1521_161 = 1521, /* $@161 */ + YYSYMBOL_1522_162 = 1522, /* $@162 */ + YYSYMBOL_index_hints_list = 1523, /* index_hints_list */ + YYSYMBOL_opt_index_hints_list = 1524, /* opt_index_hints_list */ + YYSYMBOL_1525_163 = 1525, /* $@163 */ + YYSYMBOL_opt_key_definition = 1526, /* opt_key_definition */ + YYSYMBOL_1527_164 = 1527, /* $@164 */ + YYSYMBOL_opt_key_usage_list = 1528, /* opt_key_usage_list */ + YYSYMBOL_key_usage_element = 1529, /* key_usage_element */ + YYSYMBOL_key_usage_list = 1530, /* key_usage_list */ + YYSYMBOL_using_list = 1531, /* using_list */ + YYSYMBOL_interval = 1532, /* interval */ + YYSYMBOL_interval_time_stamp = 1533, /* interval_time_stamp */ + YYSYMBOL_date_time_type = 1534, /* date_time_type */ + YYSYMBOL_table_alias = 1535, /* table_alias */ + YYSYMBOL_opt_table_alias_clause = 1536, /* opt_table_alias_clause */ + YYSYMBOL_table_alias_clause = 1537, /* table_alias_clause */ + YYSYMBOL_opt_all = 1538, /* opt_all */ + YYSYMBOL_opt_where_clause = 1539, /* opt_where_clause */ + YYSYMBOL_1540_165 = 1540, /* $@165 */ + YYSYMBOL_opt_having_clause = 1541, /* opt_having_clause */ + YYSYMBOL_1542_166 = 1542, /* $@166 */ + YYSYMBOL_opt_group_clause = 1543, /* opt_group_clause */ + YYSYMBOL_group_list = 1544, /* group_list */ + YYSYMBOL_olap_opt = 1545, /* olap_opt */ + YYSYMBOL_opt_window_clause = 1546, /* opt_window_clause */ + YYSYMBOL_window_def_list = 1547, /* window_def_list */ + YYSYMBOL_window_def = 1548, /* window_def */ + YYSYMBOL_window_spec = 1549, /* window_spec */ + YYSYMBOL_1550_167 = 1550, /* $@167 */ + YYSYMBOL_opt_window_ref = 1551, /* opt_window_ref */ + YYSYMBOL_opt_window_partition_clause = 1552, /* opt_window_partition_clause */ + YYSYMBOL_opt_window_order_clause = 1553, /* opt_window_order_clause */ + YYSYMBOL_opt_window_frame_clause = 1554, /* opt_window_frame_clause */ + YYSYMBOL_window_frame_units = 1555, /* window_frame_units */ + YYSYMBOL_window_frame_extent = 1556, /* window_frame_extent */ + YYSYMBOL_window_frame_start = 1557, /* window_frame_start */ + YYSYMBOL_window_frame_bound = 1558, /* window_frame_bound */ + YYSYMBOL_opt_window_frame_exclusion = 1559, /* opt_window_frame_exclusion */ + YYSYMBOL_alter_order_clause = 1560, /* alter_order_clause */ + YYSYMBOL_alter_order_list = 1561, /* alter_order_list */ + YYSYMBOL_alter_order_item = 1562, /* alter_order_item */ + YYSYMBOL_opt_order_clause = 1563, /* opt_order_clause */ + YYSYMBOL_order_clause = 1564, /* order_clause */ + YYSYMBOL_1565_168 = 1565, /* $@168 */ + YYSYMBOL_order_list = 1566, /* order_list */ + YYSYMBOL_order_dir = 1567, /* order_dir */ + YYSYMBOL_opt_limit_clause = 1568, /* opt_limit_clause */ + YYSYMBOL_limit_clause = 1569, /* limit_clause */ + YYSYMBOL_fetch_first_clause = 1570, /* fetch_first_clause */ + YYSYMBOL_first_or_next = 1571, /* first_or_next */ + YYSYMBOL_row_or_rows = 1572, /* row_or_rows */ + YYSYMBOL_only_or_with_ties = 1573, /* only_or_with_ties */ + YYSYMBOL_opt_global_limit_clause = 1574, /* opt_global_limit_clause */ + YYSYMBOL_limit_options = 1575, /* limit_options */ + YYSYMBOL_limit_option = 1576, /* limit_option */ + YYSYMBOL_limit_rows_option = 1577, /* limit_rows_option */ + YYSYMBOL_delete_limit_clause = 1578, /* delete_limit_clause */ + YYSYMBOL_order_limit_lock = 1579, /* order_limit_lock */ + YYSYMBOL_opt_order_limit_lock = 1580, /* opt_order_limit_lock */ + YYSYMBOL_query_expression_tail = 1581, /* query_expression_tail */ + YYSYMBOL_opt_query_expression_tail = 1582, /* opt_query_expression_tail */ + YYSYMBOL_opt_procedure_or_into = 1583, /* opt_procedure_or_into */ + YYSYMBOL_order_or_limit = 1584, /* order_or_limit */ + YYSYMBOL_opt_plus = 1585, /* opt_plus */ + YYSYMBOL_int_num = 1586, /* int_num */ + YYSYMBOL_ulong_num = 1587, /* ulong_num */ + YYSYMBOL_real_ulong_num = 1588, /* real_ulong_num */ + YYSYMBOL_longlong_num = 1589, /* longlong_num */ + YYSYMBOL_ulonglong_num = 1590, /* ulonglong_num */ + YYSYMBOL_real_ulonglong_num = 1591, /* real_ulonglong_num */ + YYSYMBOL_dec_num_error = 1592, /* dec_num_error */ + YYSYMBOL_dec_num = 1593, /* dec_num */ + YYSYMBOL_choice = 1594, /* choice */ + YYSYMBOL_bool = 1595, /* bool */ + YYSYMBOL_procedure_clause = 1596, /* procedure_clause */ + YYSYMBOL_1597_169 = 1597, /* $@169 */ + YYSYMBOL_procedure_list = 1598, /* procedure_list */ + YYSYMBOL_procedure_list2 = 1599, /* procedure_list2 */ + YYSYMBOL_procedure_item = 1600, /* procedure_item */ + YYSYMBOL_select_var_list_init = 1601, /* select_var_list_init */ + YYSYMBOL_1602_170 = 1602, /* $@170 */ + YYSYMBOL_select_var_list = 1603, /* select_var_list */ + YYSYMBOL_select_var_ident = 1604, /* select_var_ident */ + YYSYMBOL_select_outvar = 1605, /* select_outvar */ + YYSYMBOL_into = 1606, /* into */ + YYSYMBOL_into_destination = 1607, /* into_destination */ + YYSYMBOL_1608_171 = 1608, /* $@171 */ + YYSYMBOL_1609_172 = 1609, /* $@172 */ + YYSYMBOL_do = 1610, /* do */ + YYSYMBOL_1611_173 = 1611, /* $@173 */ + YYSYMBOL_drop = 1612, /* drop */ + YYSYMBOL_1613_174 = 1613, /* $@174 */ + YYSYMBOL_1614_175 = 1614, /* $@175 */ + YYSYMBOL_1615_176 = 1615, /* $@176 */ + YYSYMBOL_1616_177 = 1616, /* $@177 */ + YYSYMBOL_table_list = 1617, /* table_list */ + YYSYMBOL_table_name = 1618, /* table_name */ + YYSYMBOL_table_name_with_opt_use_partition = 1619, /* table_name_with_opt_use_partition */ + YYSYMBOL_table_alias_ref_list = 1620, /* table_alias_ref_list */ + YYSYMBOL_table_alias_ref = 1621, /* table_alias_ref */ + YYSYMBOL_opt_if_exists_table_element = 1622, /* opt_if_exists_table_element */ + YYSYMBOL_opt_if_exists = 1623, /* opt_if_exists */ + YYSYMBOL_opt_temporary = 1624, /* opt_temporary */ + YYSYMBOL_insert = 1625, /* insert */ + YYSYMBOL_1626_178 = 1626, /* $@178 */ + YYSYMBOL_1627_179 = 1627, /* $@179 */ + YYSYMBOL_replace = 1628, /* replace */ + YYSYMBOL_1629_180 = 1629, /* $@180 */ + YYSYMBOL_1630_181 = 1630, /* $@181 */ + YYSYMBOL_insert_start = 1631, /* insert_start */ + YYSYMBOL_stmt_end = 1632, /* stmt_end */ + YYSYMBOL_insert_lock_option = 1633, /* insert_lock_option */ + YYSYMBOL_replace_lock_option = 1634, /* replace_lock_option */ + YYSYMBOL_insert_replace_option = 1635, /* insert_replace_option */ + YYSYMBOL_opt_into = 1636, /* opt_into */ + YYSYMBOL_insert_table = 1637, /* insert_table */ + YYSYMBOL_1638_182 = 1638, /* $@182 */ + YYSYMBOL_insert_field_spec = 1639, /* insert_field_spec */ + YYSYMBOL_1640_183 = 1640, /* $@183 */ + YYSYMBOL_insert_field_list = 1641, /* insert_field_list */ + YYSYMBOL_opt_fields = 1642, /* opt_fields */ + YYSYMBOL_fields = 1643, /* fields */ + YYSYMBOL_insert_values = 1644, /* insert_values */ + YYSYMBOL_values_list = 1645, /* values_list */ + YYSYMBOL_ident_eq_list = 1646, /* ident_eq_list */ + YYSYMBOL_ident_eq_value = 1647, /* ident_eq_value */ + YYSYMBOL_equal = 1648, /* equal */ + YYSYMBOL_opt_equal = 1649, /* opt_equal */ + YYSYMBOL_opt_with = 1650, /* opt_with */ + YYSYMBOL_opt_by = 1651, /* opt_by */ + YYSYMBOL_no_braces = 1652, /* no_braces */ + YYSYMBOL_1653_184 = 1653, /* $@184 */ + YYSYMBOL_no_braces_with_names = 1654, /* no_braces_with_names */ + YYSYMBOL_1655_185 = 1655, /* $@185 */ + YYSYMBOL_opt_values = 1656, /* opt_values */ + YYSYMBOL_opt_values_with_names = 1657, /* opt_values_with_names */ + YYSYMBOL_values = 1658, /* values */ + YYSYMBOL_values_with_names = 1659, /* values_with_names */ + YYSYMBOL_expr_or_ignore = 1660, /* expr_or_ignore */ + YYSYMBOL_expr_or_ignore_or_default = 1661, /* expr_or_ignore_or_default */ + YYSYMBOL_opt_insert_update = 1662, /* opt_insert_update */ + YYSYMBOL_1663_186 = 1663, /* $@186 */ + YYSYMBOL_1664_187 = 1664, /* $@187 */ + YYSYMBOL_update_table_list = 1665, /* update_table_list */ + YYSYMBOL_update = 1666, /* update */ + YYSYMBOL_1667_188 = 1667, /* $@188 */ + YYSYMBOL_1668_189 = 1668, /* $@189 */ + YYSYMBOL_1669_190 = 1669, /* $@190 */ + YYSYMBOL_update_list = 1670, /* update_list */ + YYSYMBOL_update_elem = 1671, /* update_elem */ + YYSYMBOL_insert_update_list = 1672, /* insert_update_list */ + YYSYMBOL_insert_update_elem = 1673, /* insert_update_elem */ + YYSYMBOL_opt_low_priority = 1674, /* opt_low_priority */ + YYSYMBOL_delete = 1675, /* delete */ + YYSYMBOL_1676_191 = 1676, /* $@191 */ + YYSYMBOL_opt_delete_system_time = 1677, /* opt_delete_system_time */ + YYSYMBOL_delete_part2 = 1678, /* delete_part2 */ + YYSYMBOL_delete_single_table = 1679, /* delete_single_table */ + YYSYMBOL_delete_single_table_for_period = 1680, /* delete_single_table_for_period */ + YYSYMBOL_single_multi = 1681, /* single_multi */ + YYSYMBOL_1682_192 = 1682, /* $@192 */ + YYSYMBOL_1683_193 = 1683, /* $@193 */ + YYSYMBOL_1684_194 = 1684, /* $@194 */ + YYSYMBOL_1685_195 = 1685, /* $@195 */ + YYSYMBOL_opt_returning = 1686, /* opt_returning */ + YYSYMBOL_1687_196 = 1687, /* $@196 */ + YYSYMBOL_table_wild_list = 1688, /* table_wild_list */ + YYSYMBOL_table_wild_one = 1689, /* table_wild_one */ + YYSYMBOL_opt_wild = 1690, /* opt_wild */ + YYSYMBOL_opt_delete_options = 1691, /* opt_delete_options */ + YYSYMBOL_opt_delete_option = 1692, /* opt_delete_option */ + YYSYMBOL_truncate = 1693, /* truncate */ + YYSYMBOL_1694_197 = 1694, /* $@197 */ + YYSYMBOL_1695_198 = 1695, /* $@198 */ + YYSYMBOL_opt_table_sym = 1696, /* opt_table_sym */ + YYSYMBOL_opt_profile_defs = 1697, /* opt_profile_defs */ + YYSYMBOL_profile_defs = 1698, /* profile_defs */ + YYSYMBOL_profile_def = 1699, /* profile_def */ + YYSYMBOL_opt_profile_args = 1700, /* opt_profile_args */ + YYSYMBOL_show = 1701, /* show */ + YYSYMBOL_1702_199 = 1702, /* $@199 */ + YYSYMBOL_show_param = 1703, /* show_param */ + YYSYMBOL_1704_200 = 1704, /* $@200 */ + YYSYMBOL_1705_201 = 1705, /* $@201 */ + YYSYMBOL_show_engine_param = 1706, /* show_engine_param */ + YYSYMBOL_master_or_binary = 1707, /* master_or_binary */ + YYSYMBOL_opt_storage = 1708, /* opt_storage */ + YYSYMBOL_opt_db = 1709, /* opt_db */ + YYSYMBOL_opt_full = 1710, /* opt_full */ + YYSYMBOL_from_or_in = 1711, /* from_or_in */ + YYSYMBOL_binlog_in = 1712, /* binlog_in */ + YYSYMBOL_binlog_from = 1713, /* binlog_from */ + YYSYMBOL_wild_and_where = 1714, /* wild_and_where */ + YYSYMBOL_describe = 1715, /* describe */ + YYSYMBOL_1716_202 = 1716, /* $@202 */ + YYSYMBOL_1717_203 = 1717, /* $@203 */ + YYSYMBOL_explainable_command = 1718, /* explainable_command */ + YYSYMBOL_describe_command = 1719, /* describe_command */ + YYSYMBOL_analyze_stmt_command = 1720, /* analyze_stmt_command */ + YYSYMBOL_opt_extended_describe = 1721, /* opt_extended_describe */ + YYSYMBOL_opt_format_json = 1722, /* opt_format_json */ + YYSYMBOL_opt_describe_column = 1723, /* opt_describe_column */ + YYSYMBOL_explain_for_connection = 1724, /* explain_for_connection */ + YYSYMBOL_flush = 1725, /* flush */ + YYSYMBOL_1726_204 = 1726, /* $@204 */ + YYSYMBOL_flush_options = 1727, /* flush_options */ + YYSYMBOL_1728_205 = 1728, /* $@205 */ + YYSYMBOL_opt_flush_lock = 1729, /* opt_flush_lock */ + YYSYMBOL_flush_lock = 1730, /* flush_lock */ + YYSYMBOL_1731_206 = 1731, /* $@206 */ + YYSYMBOL_flush_options_list = 1732, /* flush_options_list */ + YYSYMBOL_flush_option = 1733, /* flush_option */ + YYSYMBOL_opt_table_list = 1734, /* opt_table_list */ + YYSYMBOL_backup = 1735, /* backup */ + YYSYMBOL_backup_statements = 1736, /* backup_statements */ + YYSYMBOL_1737_207 = 1737, /* $@207 */ + YYSYMBOL_opt_delete_gtid_domain = 1738, /* opt_delete_gtid_domain */ + YYSYMBOL_delete_domain_id_list = 1739, /* delete_domain_id_list */ + YYSYMBOL_delete_domain_id = 1740, /* delete_domain_id */ + YYSYMBOL_optional_flush_tables_arguments = 1741, /* optional_flush_tables_arguments */ + YYSYMBOL_reset = 1742, /* reset */ + YYSYMBOL_1743_208 = 1743, /* $@208 */ + YYSYMBOL_reset_options = 1744, /* reset_options */ + YYSYMBOL_reset_option = 1745, /* reset_option */ + YYSYMBOL_1746_209 = 1746, /* $@209 */ + YYSYMBOL_1747_210 = 1747, /* $@210 */ + YYSYMBOL_slave_reset_options = 1748, /* slave_reset_options */ + YYSYMBOL_master_reset_options = 1749, /* master_reset_options */ + YYSYMBOL_purge = 1750, /* purge */ + YYSYMBOL_1751_211 = 1751, /* $@211 */ + YYSYMBOL_kill = 1752, /* kill */ + YYSYMBOL_1753_212 = 1753, /* $@212 */ + YYSYMBOL_kill_type = 1754, /* kill_type */ + YYSYMBOL_kill_option = 1755, /* kill_option */ + YYSYMBOL_opt_connection = 1756, /* opt_connection */ + YYSYMBOL_kill_expr = 1757, /* kill_expr */ + YYSYMBOL_shutdown = 1758, /* shutdown */ + YYSYMBOL_1759_213 = 1759, /* $@213 */ + YYSYMBOL_shutdown_option = 1760, /* shutdown_option */ + YYSYMBOL_use = 1761, /* use */ + YYSYMBOL_load = 1762, /* load */ + YYSYMBOL_1763_214 = 1763, /* $@214 */ + YYSYMBOL_1764_215 = 1764, /* $@215 */ + YYSYMBOL_1765_216 = 1765, /* $@216 */ + YYSYMBOL_1766_217 = 1766, /* $@217 */ + YYSYMBOL_data_or_xml = 1767, /* data_or_xml */ + YYSYMBOL_opt_local = 1768, /* opt_local */ + YYSYMBOL_load_data_lock = 1769, /* load_data_lock */ + YYSYMBOL_opt_duplicate = 1770, /* opt_duplicate */ + YYSYMBOL_opt_field_term = 1771, /* opt_field_term */ + YYSYMBOL_field_term_list = 1772, /* field_term_list */ + YYSYMBOL_field_term = 1773, /* field_term */ + YYSYMBOL_opt_line_term = 1774, /* opt_line_term */ + YYSYMBOL_line_term_list = 1775, /* line_term_list */ + YYSYMBOL_line_term = 1776, /* line_term */ + YYSYMBOL_opt_xml_rows_identified_by = 1777, /* opt_xml_rows_identified_by */ + YYSYMBOL_opt_ignore_lines = 1778, /* opt_ignore_lines */ + YYSYMBOL_lines_or_rows = 1779, /* lines_or_rows */ + YYSYMBOL_opt_field_or_var_spec = 1780, /* opt_field_or_var_spec */ + YYSYMBOL_fields_or_vars = 1781, /* fields_or_vars */ + YYSYMBOL_field_or_var = 1782, /* field_or_var */ + YYSYMBOL_opt_load_data_set_spec = 1783, /* opt_load_data_set_spec */ + YYSYMBOL_load_data_set_list = 1784, /* load_data_set_list */ + YYSYMBOL_load_data_set_elem = 1785, /* load_data_set_elem */ + YYSYMBOL_text_literal = 1786, /* text_literal */ + YYSYMBOL_text_string = 1787, /* text_string */ + YYSYMBOL_hex_or_bin_String = 1788, /* hex_or_bin_String */ + YYSYMBOL_param_marker = 1789, /* param_marker */ + YYSYMBOL_signed_literal = 1790, /* signed_literal */ + YYSYMBOL_literal = 1791, /* literal */ + YYSYMBOL_NUM_literal = 1792, /* NUM_literal */ + YYSYMBOL_temporal_literal = 1793, /* temporal_literal */ + YYSYMBOL_with_clause = 1794, /* with_clause */ + YYSYMBOL_1795_218 = 1795, /* $@218 */ + YYSYMBOL_opt_recursive = 1796, /* opt_recursive */ + YYSYMBOL_with_list = 1797, /* with_list */ + YYSYMBOL_with_list_element = 1798, /* with_list_element */ + YYSYMBOL_opt_cycle = 1799, /* opt_cycle */ + YYSYMBOL_1800_219 = 1800, /* $@219 */ + YYSYMBOL_opt_with_column_list = 1801, /* opt_with_column_list */ + YYSYMBOL_with_column_list = 1802, /* with_column_list */ + YYSYMBOL_ident_sys_alloc = 1803, /* ident_sys_alloc */ + YYSYMBOL_comma_separated_ident_list = 1804, /* comma_separated_ident_list */ + YYSYMBOL_with_element_head = 1805, /* with_element_head */ + YYSYMBOL_insert_ident = 1806, /* insert_ident */ + YYSYMBOL_table_wild = 1807, /* table_wild */ + YYSYMBOL_select_sublist_qualified_asterisk = 1808, /* select_sublist_qualified_asterisk */ + YYSYMBOL_order_ident = 1809, /* order_ident */ + YYSYMBOL_simple_ident = 1810, /* simple_ident */ + YYSYMBOL_simple_ident_nospvar = 1811, /* simple_ident_nospvar */ + YYSYMBOL_field_ident = 1812, /* field_ident */ + YYSYMBOL_table_ident = 1813, /* table_ident */ + YYSYMBOL_table_ident_opt_wild = 1814, /* table_ident_opt_wild */ + YYSYMBOL_table_ident_nodb = 1815, /* table_ident_nodb */ + YYSYMBOL_IDENT_cli = 1816, /* IDENT_cli */ + YYSYMBOL_ident_cli = 1817, /* ident_cli */ + YYSYMBOL_IDENT_sys = 1818, /* IDENT_sys */ + YYSYMBOL_ident_cli_func = 1819, /* ident_cli_func */ + YYSYMBOL_ident_func = 1820, /* ident_func */ + YYSYMBOL_TEXT_STRING_sys = 1821, /* TEXT_STRING_sys */ + YYSYMBOL_TEXT_STRING_literal = 1822, /* TEXT_STRING_literal */ + YYSYMBOL_TEXT_STRING_filesystem = 1823, /* TEXT_STRING_filesystem */ + YYSYMBOL_ident_table_alias = 1824, /* ident_table_alias */ + YYSYMBOL_ident_cli_set_usual_case = 1825, /* ident_cli_set_usual_case */ + YYSYMBOL_ident_sysvar_name = 1826, /* ident_sysvar_name */ + YYSYMBOL_ident = 1827, /* ident */ + YYSYMBOL_label_ident = 1828, /* label_ident */ + YYSYMBOL_ident_or_text = 1829, /* ident_or_text */ + YYSYMBOL_user_maybe_role = 1830, /* user_maybe_role */ + YYSYMBOL_user_or_role = 1831, /* user_or_role */ + YYSYMBOL_user = 1832, /* user */ + YYSYMBOL_keyword_table_alias = 1833, /* keyword_table_alias */ + YYSYMBOL_keyword_ident = 1834, /* keyword_ident */ + YYSYMBOL_keyword_sysvar_name = 1835, /* keyword_sysvar_name */ + YYSYMBOL_keyword_set_usual_case = 1836, /* keyword_set_usual_case */ + YYSYMBOL_non_reserved_keyword_udt = 1837, /* non_reserved_keyword_udt */ + YYSYMBOL_keyword_sp_var_not_label = 1838, /* keyword_sp_var_not_label */ + YYSYMBOL_keyword_sp_head = 1839, /* keyword_sp_head */ + YYSYMBOL_keyword_verb_clause = 1840, /* keyword_verb_clause */ + YYSYMBOL_keyword_set_special_case = 1841, /* keyword_set_special_case */ + YYSYMBOL_keyword_sysvar_type = 1842, /* keyword_sysvar_type */ + YYSYMBOL_keyword_data_type = 1843, /* keyword_data_type */ + YYSYMBOL_keyword_cast_type = 1844, /* keyword_cast_type */ + YYSYMBOL_keyword_func_sp_var_and_label = 1845, /* keyword_func_sp_var_and_label */ + YYSYMBOL_keyword_func_sp_var_not_label = 1846, /* keyword_func_sp_var_not_label */ + YYSYMBOL_keyword_sp_var_and_label = 1847, /* keyword_sp_var_and_label */ + YYSYMBOL_reserved_keyword_udt_not_param_type = 1848, /* reserved_keyword_udt_not_param_type */ + YYSYMBOL_set = 1849, /* set */ + YYSYMBOL_1850_220 = 1850, /* $@220 */ + YYSYMBOL_set_param = 1851, /* set_param */ + YYSYMBOL_1852_221 = 1852, /* $@221 */ + YYSYMBOL_1853_222 = 1853, /* $@222 */ + YYSYMBOL_1854_223 = 1854, /* $@223 */ + YYSYMBOL_set_stmt_option_list = 1855, /* set_stmt_option_list */ + YYSYMBOL_start_option_value_list_following_option_type = 1856, /* start_option_value_list_following_option_type */ + YYSYMBOL_1857_224 = 1857, /* $@224 */ + YYSYMBOL_option_value_list = 1858, /* option_value_list */ + YYSYMBOL_option_value = 1859, /* option_value */ + YYSYMBOL_1860_225 = 1860, /* $@225 */ + YYSYMBOL_option_type = 1861, /* option_type */ + YYSYMBOL_opt_var_type = 1862, /* opt_var_type */ + YYSYMBOL_opt_var_ident_type = 1863, /* opt_var_ident_type */ + YYSYMBOL_set_stmt_option = 1864, /* set_stmt_option */ + YYSYMBOL_1865_226 = 1865, /* $@226 */ + YYSYMBOL_1866_227 = 1866, /* $@227 */ + YYSYMBOL_1867_228 = 1867, /* $@228 */ + YYSYMBOL_option_value_following_option_type = 1868, /* option_value_following_option_type */ + YYSYMBOL_1869_229 = 1869, /* $@229 */ + YYSYMBOL_1870_230 = 1870, /* $@230 */ + YYSYMBOL_1871_231 = 1871, /* $@231 */ + YYSYMBOL_option_value_no_option_type = 1872, /* option_value_no_option_type */ + YYSYMBOL_1873_232 = 1873, /* $@232 */ + YYSYMBOL_1874_233 = 1874, /* $@233 */ + YYSYMBOL_1875_234 = 1875, /* $@234 */ + YYSYMBOL_1876_235 = 1876, /* $@235 */ + YYSYMBOL_1877_236 = 1877, /* $@236 */ + YYSYMBOL_1878_237 = 1878, /* $@237 */ + YYSYMBOL_1879_238 = 1879, /* $@238 */ + YYSYMBOL_1880_239 = 1880, /* $@239 */ + YYSYMBOL_1881_240 = 1881, /* $@240 */ + YYSYMBOL_1882_241 = 1882, /* $@241 */ + YYSYMBOL_transaction_characteristics = 1883, /* transaction_characteristics */ + YYSYMBOL_transaction_access_mode = 1884, /* transaction_access_mode */ + YYSYMBOL_isolation_level = 1885, /* isolation_level */ + YYSYMBOL_transaction_access_mode_types = 1886, /* transaction_access_mode_types */ + YYSYMBOL_isolation_types = 1887, /* isolation_types */ + YYSYMBOL_text_or_password = 1888, /* text_or_password */ + YYSYMBOL_set_expr_or_default = 1889, /* set_expr_or_default */ + YYSYMBOL_lock = 1890, /* lock */ + YYSYMBOL_1891_242 = 1891, /* $@242 */ + YYSYMBOL_opt_lock_wait_timeout = 1892, /* opt_lock_wait_timeout */ + YYSYMBOL_table_or_tables = 1893, /* table_or_tables */ + YYSYMBOL_table_lock_list = 1894, /* table_lock_list */ + YYSYMBOL_table_lock = 1895, /* table_lock */ + YYSYMBOL_lock_option = 1896, /* lock_option */ + YYSYMBOL_unlock = 1897, /* unlock */ + YYSYMBOL_1898_243 = 1898, /* $@243 */ + YYSYMBOL_handler = 1899, /* handler */ + YYSYMBOL_1900_244 = 1900, /* $@244 */ + YYSYMBOL_handler_tail = 1901, /* handler_tail */ + YYSYMBOL_1902_245 = 1902, /* $@245 */ + YYSYMBOL_handler_read_or_scan = 1903, /* handler_read_or_scan */ + YYSYMBOL_handler_scan_function = 1904, /* handler_scan_function */ + YYSYMBOL_handler_rkey_function = 1905, /* handler_rkey_function */ + YYSYMBOL_1906_246 = 1906, /* $@246 */ + YYSYMBOL_handler_rkey_mode = 1907, /* handler_rkey_mode */ + YYSYMBOL_revoke = 1908, /* revoke */ + YYSYMBOL_revoke_command = 1909, /* revoke_command */ + YYSYMBOL_admin_option_for_role = 1910, /* admin_option_for_role */ + YYSYMBOL_grant = 1911, /* grant */ + YYSYMBOL_grant_command = 1912, /* grant_command */ + YYSYMBOL_opt_with_admin = 1913, /* opt_with_admin */ + YYSYMBOL_opt_with_admin_option = 1914, /* opt_with_admin_option */ + YYSYMBOL_role_list = 1915, /* role_list */ + YYSYMBOL_current_role = 1916, /* current_role */ + YYSYMBOL_role_name = 1917, /* role_name */ + YYSYMBOL_grant_role = 1918, /* grant_role */ + YYSYMBOL_opt_table = 1919, /* opt_table */ + YYSYMBOL_grant_privileges = 1920, /* grant_privileges */ + YYSYMBOL_opt_privileges = 1921, /* opt_privileges */ + YYSYMBOL_object_privilege_list = 1922, /* object_privilege_list */ + YYSYMBOL_column_list_privilege = 1923, /* column_list_privilege */ + YYSYMBOL_column_privilege = 1924, /* column_privilege */ + YYSYMBOL_object_privilege = 1925, /* object_privilege */ + YYSYMBOL_opt_and = 1926, /* opt_and */ + YYSYMBOL_require_list = 1927, /* require_list */ + YYSYMBOL_require_list_element = 1928, /* require_list_element */ + YYSYMBOL_grant_ident = 1929, /* grant_ident */ + YYSYMBOL_user_list = 1930, /* user_list */ + YYSYMBOL_grant_list = 1931, /* grant_list */ + YYSYMBOL_user_and_role_list = 1932, /* user_and_role_list */ + YYSYMBOL_via_or_with = 1933, /* via_or_with */ + YYSYMBOL_using_or_as = 1934, /* using_or_as */ + YYSYMBOL_grant_user = 1935, /* grant_user */ + YYSYMBOL_auth_expression = 1936, /* auth_expression */ + YYSYMBOL_auth_token = 1937, /* auth_token */ + YYSYMBOL_opt_auth_str = 1938, /* opt_auth_str */ + YYSYMBOL_opt_require_clause = 1939, /* opt_require_clause */ + YYSYMBOL_resource_option = 1940, /* resource_option */ + YYSYMBOL_resource_option_list = 1941, /* resource_option_list */ + YYSYMBOL_opt_resource_options = 1942, /* opt_resource_options */ + YYSYMBOL_opt_grant_options = 1943, /* opt_grant_options */ + YYSYMBOL_opt_grant_option = 1944, /* opt_grant_option */ + YYSYMBOL_grant_option_list = 1945, /* grant_option_list */ + YYSYMBOL_grant_option = 1946, /* grant_option */ + YYSYMBOL_begin_stmt_mariadb = 1947, /* begin_stmt_mariadb */ + YYSYMBOL_1948_247 = 1948, /* $@247 */ + YYSYMBOL_compound_statement = 1949, /* compound_statement */ + YYSYMBOL_opt_not = 1950, /* opt_not */ + YYSYMBOL_opt_work = 1951, /* opt_work */ + YYSYMBOL_opt_chain = 1952, /* opt_chain */ + YYSYMBOL_opt_release = 1953, /* opt_release */ + YYSYMBOL_commit = 1954, /* commit */ + YYSYMBOL_rollback = 1955, /* rollback */ + YYSYMBOL_savepoint = 1956, /* savepoint */ + YYSYMBOL_release = 1957, /* release */ + YYSYMBOL_unit_type_decl = 1958, /* unit_type_decl */ + YYSYMBOL_union_option = 1959, /* union_option */ + YYSYMBOL_query_expression_option = 1960, /* query_expression_option */ + YYSYMBOL_definer_opt = 1961, /* definer_opt */ + YYSYMBOL_no_definer = 1962, /* no_definer */ + YYSYMBOL_definer = 1963, /* definer */ + YYSYMBOL_view_algorithm = 1964, /* view_algorithm */ + YYSYMBOL_opt_view_suid = 1965, /* opt_view_suid */ + YYSYMBOL_view_suid = 1966, /* view_suid */ + YYSYMBOL_view_list_opt = 1967, /* view_list_opt */ + YYSYMBOL_view_list = 1968, /* view_list */ + YYSYMBOL_view_select = 1969, /* view_select */ + YYSYMBOL_1970_248 = 1970, /* $@248 */ + YYSYMBOL_view_check_option = 1971, /* view_check_option */ + YYSYMBOL_trigger_action_order = 1972, /* trigger_action_order */ + YYSYMBOL_trigger_follows_precedes_clause = 1973, /* trigger_follows_precedes_clause */ + YYSYMBOL_trigger_tail = 1974, /* trigger_tail */ + YYSYMBOL_1975_249 = 1975, /* $@249 */ + YYSYMBOL_1976_250 = 1976, /* $@250 */ + YYSYMBOL_1977_251 = 1977, /* $@251 */ + YYSYMBOL_1978_252 = 1978, /* $@252 */ + YYSYMBOL_1979_253 = 1979, /* $@253 */ + YYSYMBOL_sf_return_type = 1980, /* sf_return_type */ + YYSYMBOL_1981_254 = 1981, /* $@254 */ + YYSYMBOL_xa = 1982, /* xa */ + YYSYMBOL_opt_format_xid = 1983, /* opt_format_xid */ + YYSYMBOL_xid = 1984, /* xid */ + YYSYMBOL_begin_or_start = 1985, /* begin_or_start */ + YYSYMBOL_opt_join_or_resume = 1986, /* opt_join_or_resume */ + YYSYMBOL_opt_one_phase = 1987, /* opt_one_phase */ + YYSYMBOL_opt_suspend = 1988, /* opt_suspend */ + YYSYMBOL_1989_255 = 1989, /* $@255 */ + YYSYMBOL_opt_migrate = 1990, /* opt_migrate */ + YYSYMBOL_install = 1991, /* install */ + YYSYMBOL_uninstall = 1992, /* uninstall */ + YYSYMBOL_keep_gcc_happy = 1993, /* keep_gcc_happy */ + YYSYMBOL__empty = 1994, /* _empty */ + YYSYMBOL_statement = 1995, /* statement */ + YYSYMBOL_sp_statement = 1996, /* sp_statement */ + YYSYMBOL_sp_if_then_statements = 1997, /* sp_if_then_statements */ + YYSYMBOL_sp_case_then_statements = 1998, /* sp_case_then_statements */ + YYSYMBOL_reserved_keyword_udt_param_type = 1999, /* reserved_keyword_udt_param_type */ + YYSYMBOL_reserved_keyword_udt = 2000, /* reserved_keyword_udt */ + YYSYMBOL_keyword_sp_block_section = 2001, /* keyword_sp_block_section */ + YYSYMBOL_keyword_label = 2002, /* keyword_label */ + YYSYMBOL_keyword_sp_decl = 2003, /* keyword_sp_decl */ + YYSYMBOL_opt_truncate_table_storage_clause = 2004, /* opt_truncate_table_storage_clause */ + YYSYMBOL_ident_for_loop_index = 2005, /* ident_for_loop_index */ + YYSYMBOL_row_field_name = 2006, /* row_field_name */ + YYSYMBOL_while_body = 2007, /* while_body */ + YYSYMBOL_2008_256 = 2008, /* $@256 */ + YYSYMBOL_for_loop_statements = 2009, /* for_loop_statements */ + YYSYMBOL_sp_label = 2010, /* sp_label */ + YYSYMBOL_sp_control_label = 2011, /* sp_control_label */ + YYSYMBOL_sp_block_label = 2012, /* sp_block_label */ + YYSYMBOL_sp_opt_default = 2013, /* sp_opt_default */ + YYSYMBOL_sp_decl_variable_list_anchored = 2014, /* sp_decl_variable_list_anchored */ + YYSYMBOL_sp_param_name_and_mode = 2015, /* sp_param_name_and_mode */ + YYSYMBOL_sp_param = 2016, /* sp_param */ + YYSYMBOL_sp_param_anchored = 2017, /* sp_param_anchored */ + YYSYMBOL_sf_c_chistics_and_body_standalone = 2018, /* sf_c_chistics_and_body_standalone */ + YYSYMBOL_2019_257 = 2019, /* $@257 */ + YYSYMBOL_sp_tail_standalone = 2020, /* sp_tail_standalone */ + YYSYMBOL_2021_258 = 2021, /* $@258 */ + YYSYMBOL_2022_259 = 2022, /* $@259 */ + YYSYMBOL_drop_routine = 2023, /* drop_routine */ + YYSYMBOL_create_routine = 2024, /* create_routine */ + YYSYMBOL_2025_260 = 2025, /* $@260 */ + YYSYMBOL_2026_261 = 2026, /* $@261 */ + YYSYMBOL_2027_262 = 2027, /* $@262 */ + YYSYMBOL_sp_decls = 2028, /* sp_decls */ + YYSYMBOL_sp_decl = 2029, /* sp_decl */ + YYSYMBOL_sp_decl_body = 2030, /* sp_decl_body */ + YYSYMBOL_2031_263 = 2031, /* $@263 */ + YYSYMBOL_sp_proc_stmt_in_returns_clause = 2032, /* sp_proc_stmt_in_returns_clause */ + YYSYMBOL_sp_proc_stmt = 2033, /* sp_proc_stmt */ + YYSYMBOL_sp_proc_stmt_compound_ok = 2034, /* sp_proc_stmt_compound_ok */ + YYSYMBOL_sp_labeled_block = 2035, /* sp_labeled_block */ + YYSYMBOL_2036_264 = 2036, /* $@264 */ + YYSYMBOL_sp_unlabeled_block = 2037, /* sp_unlabeled_block */ + YYSYMBOL_2038_265 = 2038, /* $@265 */ + YYSYMBOL_sp_unlabeled_block_not_atomic = 2039, /* sp_unlabeled_block_not_atomic */ + YYSYMBOL_2040_266 = 2040 /* $@266 */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; + + +/* Second part of user prologue. */ +#line 330 "/home/buildbot/git/sql/sql_yacc.yy" + +/* avoid unintentional %union size increases, it's what a parser stack made of */ +static_assert(sizeof(YYSTYPE) == sizeof(void*)*2+8, "%union size check"); +bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); + +#line 2324 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + + +#ifdef short +# undef short +#endif + +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif +#endif + +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; +#endif + +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; +#else +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned +# endif +#endif + +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int16 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YY_USE(E) ((void) (E)) +#else +# define YY_USE(E) /* empty */ +#endif + +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* !defined yyoverflow */ + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 740 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 112981 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 789 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 1252 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 3718 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 6225 + +/* YYMAXUTOK -- Last valid token kind. */ +#define YYMAXUTOK 1021 + + +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int16 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 783, 2, 2, 2, 772, 767, 2, + 779, 780, 770, 769, 782, 768, 787, 771, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 788, 786, + 765, 763, 764, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 773, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 784, 766, 785, 774, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 775, 776, 777, + 778, 781 +}; + +#if YYDEBUG +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int16 yyrline[] = +{ + 0, 1975, 1975, 1985, 1984, 2009, 2016, 2018, 2022, 2023, + 2024, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, + 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, + 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, + 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, + 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2092, 2099, 2100, 2105, 2104, 2115, 2121, 2123, 2120, + 2132, 2134, 2133, 2143, 2148, 2160, 2159, 2176, 2175, 2185, + 2186, 2190, 2194, 2198, 2202, 2206, 2210, 2220, 2225, 2229, + 2233, 2237, 2241, 2245, 2250, 2254, 2259, 2287, 2291, 2295, + 2300, 2303, 2305, 2306, 2310, 2316, 2318, 2319, 2323, 2329, + 2331, 2332, 2336, 2343, 2347, 2362, 2366, 2372, 2378, 2384, + 2390, 2398, 2402, 2406, 2418, 2421, 2426, 2448, 2460, 2447, + 2483, 2482, 2538, 2545, 2537, 2557, 2564, 2556, 2577, 2583, + 2576, 2595, 2601, 2594, 2613, 2612, 2626, 2624, 2640, 2638, + 2652, 2651, 2662, 2661, 2671, 2678, 2685, 2685, 2688, 2692, + 2693, 2697, 2698, 2702, 2707, 2713, 2719, 2727, 2733, 2739, + 2747, 2755, 2763, 2771, 2779, 2787, 2799, 2815, 2815, 2819, + 2818, 2830, 2831, 2835, 2840, 2845, 2850, 2855, 2860, 2865, + 2873, 2872, 2905, 2904, 2911, 2918, 2919, 2925, 2931, 2941, + 2947, 2953, 2955, 2962, 2963, 2967, 2977, 2978, 2986, 2986, + 3028, 3037, 3038, 3043, 3044, 3045, 3046, 3051, 3056, 3064, + 3065, 3069, 3070, 3075, 3077, 3079, 3081, 3083, 3085, 3087, + 3093, 3094, 3098, 3099, 3104, 3103, 3114, 3113, 3124, 3123, + 3136, 3138, 3141, 3143, 3147, 3151, 3160, 3165, 3165, 3175, + 3176, 3180, 3188, 3190, 3194, 3195, 3199, 3200, 3201, 3206, + 3205, 3217, 3221, 3222, 3226, 3227, 3232, 3238, 3244, 3254, + 3262, 3267, 3275, 3279, 3288, 3286, 3300, 3308, 3313, 3312, + 3326, 3328, 3333, 3343, 3342, 3361, 3362, 3363, 3364, 3369, + 3371, 3376, 3391, 3399, 3403, 3423, 3424, 3428, 3432, 3438, + 3444, 3450, 3456, 3466, 3471, 3479, 3487, 3492, 3498, 3499, + 3505, 3508, 3512, 3520, 3537, 3539, 3557, 3563, 3565, 3567, + 3569, 3571, 3573, 3575, 3577, 3579, 3581, 3583, 3585, 3587, + 3592, 3600, 3616, 3617, 3622, 3628, 3637, 3644, 3653, 3662, + 3667, 3681, 3683, 3685, 3694, 3699, 3706, 3715, 3724, 3726, + 3728, 3730, 3732, 3734, 3736, 3738, 3740, 3742, 3744, 3746, + 3748, 3750, 3755, 3756, 3764, 3776, 3792, 3791, 3802, 3802, + 3824, 3825, 3830, 3829, 3837, 3848, 3853, 3859, 3858, 3865, + 3864, 3873, 3878, 3884, 3883, 3890, 3889, 3899, 3907, 3915, + 3924, 3924, 3947, 3957, 3956, 3977, 3976, 3996, 4002, 4010, + 4011, 4015, 4016, 4017, 4021, 4029, 4034, 4039, 4047, 4048, + 4056, 4074, 4090, 4110, 4115, 4109, 4127, 4129, 4130, 4131, + 4136, 4135, 4206, 4205, 4212, 4217, 4218, 4222, 4223, 4228, + 4227, 4243, 4242, 4257, 4267, 4271, 4272, 4277, 4278, 4282, + 4290, 4295, 4302, 4311, 4325, 4333, 4342, 4341, 4349, 4348, + 4356, 4361, 4368, 4355, 4378, 4377, 4388, 4387, 4397, 4396, + 4406, 4413, 4405, 4428, 4427, 4439, 4441, 4446, 4448, 4450, + 4456, 4455, 4458, 4459, 4473, 4474, 4478, 4479, 4489, 4494, + 4505, 4542, 4543, 4548, 4547, 4563, 4578, 4577, 4599, 4598, + 4604, 4612, 4611, 4614, 4616, 4619, 4618, 4627, 4630, 4629, + 4638, 4639, 4645, 4646, 4663, 4664, 4668, 4669, 4673, 4687, + 4697, 4708, 4717, 4718, 4731, 4733, 4732, 4737, 4735, 4746, + 4747, 4751, 4765, 4777, 4778, 4791, 4800, 4822, 4823, 4826, + 4828, 4833, 4832, 4856, 4868, 4884, 4883, 4898, 4897, 4911, + 4918, 4925, 4945, 4963, 4967, 4994, 5006, 5007, 5012, 5021, + 5011, 5046, 5047, 5051, 5062, 5081, 5094, 5120, 5121, 5126, + 5125, 5162, 5171, 5172, 5176, 5177, 5181, 5182, 5190, 5191, + 5195, 5196, 5200, 5202, 5208, 5214, 5216, 5218, 5220, 5222, + 5224, 5229, 5230, 5230, 5239, 5251, 5254, 5262, 5265, 5275, + 5276, 5280, 5281, 5285, 5286, 5290, 5291, 5292, 5301, 5304, + 5312, 5315, 5322, 5326, 5332, 5334, 5338, 5339, 5343, 5344, + 5345, 5349, 5364, 5369, 5374, 5379, 5384, 5389, 5394, 5409, + 5415, 5430, 5435, 5450, 5456, 5474, 5479, 5484, 5489, 5494, + 5499, 5505, 5504, 5530, 5531, 5532, 5537, 5542, 5547, 5549, + 5551, 5553, 5559, 5564, 5569, 5573, 5578, 5582, 5589, 5596, + 5601, 5608, 5610, 5614, 5633, 5641, 5650, 5660, 5671, 5672, + 5673, 5674, 5675, 5676, 5677, 5681, 5682, 5683, 5687, 5688, + 5689, 5690, 5695, 5702, 5709, 5710, 5714, 5715, 5716, 5717, + 5718, 5722, 5724, 5735, 5734, 5742, 5741, 5749, 5748, 5756, + 5755, 5765, 5762, 5773, 5771, 5780, 5779, 5798, 5806, 5814, + 5822, 5823, 5827, 5837, 5838, 5842, 5843, 5847, 5852, 5851, + 5890, 5889, 5902, 5901, 5912, 5913, 5917, 5918, 5922, 5923, + 5927, 5928, 5932, 5933, 5934, 5935, 5941, 5940, 5948, 5954, + 5963, 5964, 5969, 5972, 5976, 5980, 5987, 5988, 5992, 5993, + 5997, 6003, 6009, 6010, 6018, 6017, 6039, 6040, 6050, 6058, + 6070, 6070, 6073, 6074, 6081, 6088, 6092, 6100, 6101, 6102, + 6106, 6107, 6108, 6109, 6110, 6111, 6119, 6123, 6124, 6138, + 6142, 6146, 6150, 6152, 6159, 6161, 6167, 6168, 6169, 6170, + 6174, 6178, 6183, 6187, 6191, 6195, 6200, 6204, 6211, 6227, + 6228, 6235, 6242, 6250, 6254, 6258, 6262, 6266, 6270, 6274, + 6278, 6280, 6282, 6284, 6286, 6288, 6290, 6292, 6299, 6301, + 6306, 6310, 6311, 6315, 6316, 6320, 6321, 6322, 6323, 6324, + 6328, 6329, 6330, 6331, 6332, 6336, 6342, 6343, 6348, 6350, + 6357, 6358, 6359, 6363, 6367, 6368, 6369, 6370, 6371, 6372, + 6376, 6380, 6381, 6382, 6383, 6386, 6390, 6395, 6396, 6400, + 6401, 6405, 6406, 6411, 6416, 6420, 6426, 6431, 6439, 6440, + 6447, 6451, 6455, 6456, 6460, 6461, 6465, 6466, 6470, 6478, + 6486, 6495, 6499, 6505, 6509, 6510, 6514, 6527, 6533, 6543, + 6544, 6548, 6555, 6559, 6560, 6564, 6565, 6569, 6578, 6582, + 6583, 6587, 6595, 6596, 6600, 6601, 6605, 6606, 6607, 6615, + 6616, 6620, 6624, 6628, 6633, 6634, 6639, 6643, 6649, 6653, + 6660, 6661, 6666, 6665, 6678, 6679, 6683, 6686, 6687, 6688, + 6689, 6693, 6701, 6708, 6709, 6713, 6723, 6724, 6728, 6729, + 6732, 6734, 6738, 6750, 6751, 6755, 6762, 6775, 6776, 6778, + 6780, 6786, 6791, 6797, 6803, 6810, 6820, 6821, 6822, 6823, + 6824, 6828, 6829, 6833, 6834, 6838, 6839, 6843, 6844, 6845, + 6849, 6853, 6865, 6866, 6870, 6871, 6875, 6876, 6880, 6881, + 6885, 6886, 6890, 6891, 6895, 6896, 6901, 6902, 6903, 6907, + 6909, 6914, 6919, 6921, 6925, 6929, 6936, 6937, 6941, 6945, + 6946, 6956, 6957, 6958, 6962, 6963, 6967, 6972, 6980, 6981, + 6989, 6995, 7007, 7008, 7012, 7014, 7024, 7040, 7023, 7063, + 7062, 7079, 7078, 7093, 7102, 7101, 7109, 7108, 7116, 7115, + 7129, 7123, 7137, 7136, 7176, 7175, 7182, 7189, 7197, 7207, + 7188, 7216, 7220, 7228, 7231, 7235, 7239, 7247, 7249, 7250, + 7251, 7252, 7256, 7257, 7258, 7259, 7263, 7264, 7276, 7277, + 7282, 7283, 7286, 7288, 7296, 7304, 7306, 7308, 7309, 7317, + 7318, 7324, 7333, 7331, 7344, 7357, 7356, 7369, 7367, 7380, + 7387, 7397, 7398, 7404, 7416, 7415, 7455, 7462, 7466, 7472, + 7470, 7487, 7489, 7494, 7502, 7501, 7515, 7519, 7518, 7530, + 7531, 7535, 7548, 7549, 7553, 7557, 7564, 7569, 7573, 7580, + 7587, 7591, 7596, 7604, 7612, 7622, 7633, 7643, 7654, 7664, + 7670, 7676, 7683, 7693, 7698, 7704, 7709, 7719, 7724, 7730, + 7735, 7739, 7744, 7745, 7746, 7751, 7756, 7760, 7770, 7772, + 7773, 7774, 7775, 7779, 7784, 7792, 7797, 7805, 7806, 7810, + 7811, 7815, 7815, 7818, 7820, 7824, 7825, 7829, 7830, 7838, + 7839, 7840, 7844, 7845, 7850, 7859, 7860, 7861, 7862, 7867, + 7866, 7876, 7875, 7883, 7890, 7900, 7917, 7920, 7927, 7931, + 7938, 7942, 7946, 7953, 7953, 7959, 7960, 7964, 7965, 7966, + 7970, 7971, 7980, 7987, 7988, 7993, 7992, 8004, 8005, 8006, + 8010, 8012, 8011, 8018, 8017, 8038, 8039, 8043, 8044, 8048, + 8049, 8050, 8054, 8055, 8056, 8061, 8060, 8081, 8082, 8086, + 8091, 8092, 8099, 8101, 8106, 8108, 8107, 8120, 8122, 8121, + 8135, 8136, 8141, 8150, 8151, 8152, 8156, 8163, 8173, 8181, + 8190, 8192, 8191, 8197, 8196, 8219, 8220, 8224, 8225, 8229, + 8230, 8231, 8232, 8233, 8234, 8238, 8239, 8244, 8243, 8264, + 8265, 8266, 8271, 8270, 8281, 8288, 8294, 8303, 8304, 8308, + 8324, 8323, 8336, 8337, 8341, 8342, 8346, 8357, 8368, 8369, + 8374, 8373, 8388, 8389, 8393, 8394, 8398, 8409, 8421, 8420, + 8428, 8428, 8437, 8438, 8443, 8444, 8454, 8453, 8468, 8467, + 8486, 8485, 8502, 8500, 8521, 8522, 8527, 8526, 8540, 8549, + 8539, 8559, 8571, 8635, 8640, 8655, 8656, 8671, 8670, 8686, + 8685, 8698, 8700, 8715, 8723, 8721, 8736, 8754, 8756, 8766, + 8770, 8811, 8820, 8830, 8831, 8835, 8839, 8845, 8852, 8854, + 8863, 8867, 8871, 8878, 8887, 8891, 8898, 8915, 8918, 8926, + 8929, 8936, 8940, 8944, 8948, 8955, 8956, 8960, 8961, 8970, + 8983, 8989, 9000, 9003, 9011, 9014, 9020, 9026, 9035, 9036, + 9037, 9057, 9062, 9084, 9090, 9096, 9102, 9103, 9104, 9105, + 9106, 9110, 9111, 9112, 9116, 9117, 9118, 9122, 9123, 9128, + 9179, 9186, 9229, 9235, 9239, 9245, 9251, 9257, 9263, 9269, + 9275, 9281, 9287, 9293, 9299, 9305, 9309, 9315, 9324, 9330, + 9338, 9344, 9353, 9359, 9367, 9377, 9383, 9390, 9397, 9405, + 9411, 9420, 9424, 9430, 9436, 9442, 9448, 9455, 9461, 9467, + 9473, 9479, 9486, 9492, 9498, 9504, 9510, 9516, 9522, 9528, + 9534, 9538, 9539, 9543, 9544, 9548, 9549, 9553, 9554, 9558, + 9559, 9560, 9561, 9562, 9563, 9567, 9568, 9573, 9576, 9580, + 9581, 9582, 9586, 9587, 9588, 9589, 9590, 9591, 9595, 9596, + 9597, 9601, 9606, 9613, 9635, 9642, 9651, 9652, 9653, 9654, + 9658, 9667, 9668, 9672, 9676, 9677, 9678, 9679, 9680, 9681, + 9682, 9714, 9715, 9716, 9717, 9718, 9719, 9720, 9721, 9722, + 9730, 9738, 9739, 9746, 9752, 9757, 9767, 9772, 9777, 9783, + 9788, 9794, 9805, 9812, 9817, 9822, 9827, 9832, 9837, 9842, + 9850, 9851, 9852, 9853, 9861, 9862, 9871, 9872, 9878, 9882, + 9888, 9894, 9903, 9904, 9913, 9920, 9934, 9940, 9946, 9955, + 9964, 9970, 9976, 9982, 9988, 10003, 10014, 10020, 10026, 10032, + 10038, 10044, 10052, 10059, 10063, 10069, 10077, 10086, 10087, 10091, + 10095, 10102, 10106, 10126, 10133, 10139, 10146, 10153, 10159, 10165, + 10171, 10177, 10184, 10190, 10201, 10208, 10214, 10227, 10232, 10237, + 10243, 10249, 10254, 10261, 10268, 10276, 10283, 10290, 10297, 10312, + 10318, 10324, 10333, 10344, 10351, 10357, 10365, 10371, 10377, 10383, + 10389, 10397, 10409, 10429, 10428, 10504, 10510, 10516, 10522, 10527, + 10532, 10537, 10542, 10547, 10552, 10572, 10574, 10579, 10580, 10584, + 10585, 10589, 10590, 10594, 10601, 10609, 10636, 10642, 10648, 10654, + 10660, 10666, 10675, 10682, 10684, 10681, 10691, 10702, 10708, 10714, + 10720, 10726, 10732, 10738, 10744, 10750, 10757, 10756, 10777, 10776, + 10807, 10806, 10820, 10829, 10847, 10849, 10851, 10866, 10873, 10880, + 10887, 10894, 10901, 10908, 10915, 10922, 10929, 10940, 10947, 10958, + 10969, 10989, 10988, 10994, 11011, 11017, 11026, 11035, 11045, 11044, + 11056, 11071, 11084, 11089, 11097, 11098, 11103, 11108, 11111, 11113, + 11117, 11122, 11130, 11131, 11136, 11143, 11153, 11152, 11169, 11171, + 11177, 11183, 11189, 11193, 11194, 11195, 11203, 11204, 11205, 11206, + 11207, 11208, 11209, 11210, 11214, 11215, 11216, 11217, 11224, 11225, + 11229, 11234, 11242, 11243, 11247, 11254, 11262, 11271, 11281, 11282, + 11293, 11294, 11306, 11310, 11314, 11322, 11323, 11327, 11331, 11335, + 11342, 11346, 11351, 11352, 11358, 11357, 11386, 11385, 11401, 11410, + 11422, 11434, 11435, 11436, 11437, 11442, 11443, 11444, 11445, 11446, + 11450, 11454, 11458, 11468, 11475, 11483, 11489, 11482, 11535, 11536, + 11542, 11547, 11561, 11569, 11567, 11587, 11585, 11598, 11610, 11608, + 11628, 11627, 11639, 11652, 11650, 11671, 11670, 11683, 11697, 11698, + 11699, 11703, 11704, 11712, 11713, 11717, 11726, 11727, 11728, 11733, + 11734, 11738, 11739, 11743, 11744, 11748, 11749, 11757, 11765, 11773, + 11774, 11787, 11803, 11822, 11823, 11828, 11832, 11833, 11834, 11838, + 11839, 11844, 11843, 11849, 11848, 11856, 11857, 11860, 11862, 11862, + 11866, 11866, 11871, 11872, 11876, 11878, 11883, 11884, 11888, 11899, + 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920, 11921, 11922, + 11923, 11924, 11928, 11929, 11930, 11931, 11932, 11933, 11934, 11935, + 11936, 11940, 11941, 11942, 11943, 11946, 11948, 11949, 11953, 11954, + 11958, 11966, 11968, 11972, 11974, 11973, 11987, 11990, 11989, 12007, + 12009, 12013, 12018, 12026, 12027, 12044, 12067, 12068, 12074, 12075, + 12079, 12092, 12091, 12100, 12101, 12110, 12111, 12115, 12116, 12120, + 12121, 12135, 12136, 12140, 12150, 12159, 12166, 12173, 12183, 12184, + 12191, 12201, 12202, 12204, 12206, 12208, 12210, 12219, 12223, 12224, + 12228, 12242, 12243, 12249, 12248, 12259, 12265, 12274, 12275, 12276, + 12282, 12283, 12288, 12295, 12301, 12306, 12317, 12327, 12338, 12345, + 12353, 12363, 12364, 12368, 12369, 12373, 12374, 12379, 12386, 12393, + 12400, 12410, 12415, 12420, 12424, 12430, 12436, 12445, 12453, 12457, + 12464, 12465, 12469, 12474, 12479, 12492, 12496, 12500, 12504, 12509, + 12512, 12516, 12530, 12538, 12549, 12551, 12555, 12556, 12560, 12561, + 12562, 12563, 12564, 12565, 12569, 12570, 12571, 12572, 12573, 12577, + 12578, 12579, 12580, 12584, 12585, 12586, 12587, 12588, 12592, 12593, + 12594, 12595, 12596, 12600, 12605, 12606, 12610, 12611, 12615, 12616, + 12617, 12622, 12621, 12653, 12654, 12658, 12659, 12663, 12673, 12673, + 12685, 12686, 12689, 12709, 12719, 12724, 12732, 12738, 12749, 12737, + 12751, 12766, 12778, 12777, 12800, 12799, 12809, 12808, 12831, 12837, + 12841, 12846, 12845, 12854, 12859, 12865, 12872, 12870, 12881, 12885, + 12886, 12890, 12902, 12915, 12916, 12920, 12934, 12938, 12947, 12950, + 12957, 12958, 12966, 12973, 12965, 12986, 12993, 12985, 13004, 13013, + 13022, 13030, 13031, 13035, 13036, 13040, 13041, 13049, 13049, 13052, + 13052, 13065, 13066, 13068, 13067, 13080, 13086, 13088, 13092, 13094, + 13100, 13104, 13105, 13109, 13110, 13114, 13124, 13125, 13129, 13130, + 13134, 13135, 13139, 13140, 13145, 13144, 13161, 13160, 13176, 13177, + 13181, 13182, 13186, 13191, 13199, 13207, 13218, 13219, 13228, 13229, + 13237, 13239, 13241, 13239, 13251, 13263, 13270, 13280, 13299, 13269, + 13306, 13307, 13311, 13318, 13326, 13327, 13331, 13341, 13342, 13349, + 13348, 13369, 13372, 13379, 13380, 13390, 13405, 13413, 13426, 13432, + 13425, 13437, 13443, 13436, 13451, 13455, 13454, 13488, 13489, 13493, + 13508, 13526, 13527, 13531, 13532, 13536, 13537, 13538, 13543, 13554, + 13542, 13564, 13566, 13569, 13571, 13574, 13575, 13578, 13582, 13586, + 13590, 13594, 13598, 13602, 13606, 13610, 13618, 13621, 13631, 13630, + 13649, 13656, 13664, 13672, 13680, 13688, 13696, 13703, 13710, 13716, + 13718, 13720, 13729, 13733, 13738, 13737, 13744, 13743, 13750, 13759, + 13766, 13771, 13776, 13781, 13786, 13791, 13793, 13795, 13797, 13804, + 13812, 13814, 13822, 13829, 13836, 13844, 13850, 13855, 13863, 13871, + 13879, 13883, 13887, 13894, 13901, 13908, 13915, 13921, 13927, 13933, + 13939, 13945, 13953, 13958, 13965, 13972, 13979, 13986, 13993, 14000, + 14005, 14010, 14015, 14020, 14025, 14037, 14045, 14067, 14069, 14071, + 14076, 14077, 14080, 14082, 14086, 14087, 14091, 14092, 14096, 14097, + 14101, 14102, 14106, 14107, 14111, 14112, 14121, 14133, 14132, 14151, + 14150, 14160, 14161, 14162, 14163, 14164, 14165, 14169, 14170, 14174, + 14181, 14182, 14184, 14185, 14189, 14190, 14203, 14204, 14205, 14221, + 14245, 14244, 14256, 14255, 14267, 14272, 14273, 14286, 14289, 14288, + 14301, 14302, 14307, 14309, 14311, 14313, 14315, 14317, 14325, 14327, + 14329, 14331, 14336, 14338, 14346, 14348, 14350, 14352, 14354, 14356, + 14373, 14374, 14378, 14382, 14395, 14394, 14409, 14419, 14420, 14423, + 14425, 14426, 14430, 14446, 14447, 14452, 14451, 14461, 14462, 14466, + 14466, 14471, 14470, 14476, 14480, 14481, 14485, 14486, 14493, 14498, + 14497, 14512, 14511, 14526, 14527, 14528, 14532, 14533, 14534, 14543, + 14544, 14548, 14552, 14560, 14560, 14565, 14566, 14575, 14587, 14601, + 14612, 14625, 14586, 14636, 14637, 14641, 14642, 14646, 14647, 14655, + 14659, 14660, 14661, 14664, 14666, 14670, 14671, 14675, 14680, 14687, + 14692, 14699, 14701, 14705, 14706, 14710, 14715, 14723, 14724, 14728, + 14730, 14738, 14739, 14743, 14744, 14745, 14749, 14751, 14756, 14757, + 14772, 14773, 14777, 14778, 14782, 14795, 14800, 14805, 14810, 14818, + 14826, 14831, 14839, 14847, 14862, 14869, 14875, 14885, 14886, 14894, + 14895, 14896, 14897, 14911, 14917, 14923, 14929, 14935, 14941, 14962, + 14972, 14982, 14988, 14995, 15005, 15012, 15019, 15030, 15029, 15054, + 15055, 15060, 15061, 15066, 15090, 15093, 15092, 15108, 15112, 15117, + 15121, 15128, 15134, 15143, 15161, 15162, 15166, 15171, 15179, 15184, + 15192, 15197, 15202, 15207, 15213, 15218, 15226, 15231, 15236, 15241, + 15247, 15255, 15256, 15267, 15275, 15279, 15285, 15291, 15301, 15307, + 15316, 15326, 15327, 15331, 15332, 15333, 15337, 15345, 15346, 15347, + 15348, 15352, 15361, 15369, 15377, 15385, 15386, 15394, 15395, 15399, + 15400, 15405, 15414, 15415, 15423, 15424, 15432, 15433, 15434, 15438, + 15449, 15478, 15487, 15487, 15489, 15499, 15500, 15501, 15502, 15503, + 15504, 15505, 15506, 15507, 15508, 15509, 15510, 15515, 15516, 15517, + 15518, 15519, 15520, 15521, 15522, 15523, 15524, 15525, 15526, 15527, + 15531, 15532, 15533, 15534, 15535, 15536, 15537, 15538, 15539, 15540, + 15541, 15542, 15543, 15547, 15548, 15549, 15550, 15551, 15552, 15553, + 15554, 15555, 15556, 15557, 15558, 15559, 15563, 15564, 15565, 15566, + 15567, 15568, 15569, 15570, 15583, 15584, 15585, 15586, 15587, 15588, + 15589, 15590, 15591, 15592, 15593, 15594, 15595, 15596, 15597, 15598, + 15599, 15600, 15601, 15602, 15603, 15604, 15605, 15606, 15607, 15608, + 15609, 15610, 15611, 15612, 15613, 15614, 15615, 15616, 15617, 15618, + 15619, 15620, 15621, 15622, 15623, 15624, 15625, 15626, 15627, 15628, + 15629, 15630, 15631, 15632, 15633, 15634, 15635, 15676, 15677, 15678, + 15679, 15680, 15681, 15692, 15693, 15694, 15695, 15696, 15697, 15698, + 15699, 15700, 15701, 15705, 15706, 15707, 15711, 15712, 15713, 15722, + 15723, 15724, 15725, 15726, 15727, 15728, 15729, 15730, 15731, 15732, + 15733, 15734, 15735, 15736, 15737, 15738, 15739, 15740, 15741, 15742, + 15743, 15744, 15745, 15746, 15747, 15752, 15757, 15758, 15759, 15760, + 15761, 15762, 15763, 15764, 15765, 15766, 15767, 15768, 15769, 15770, + 15771, 15772, 15773, 15774, 15775, 15776, 15777, 15778, 15779, 15780, + 15781, 15782, 15783, 15784, 15785, 15786, 15787, 15788, 15789, 15790, + 15791, 15792, 15793, 15794, 15795, 15796, 15797, 15798, 15799, 15800, + 15805, 15806, 15807, 15808, 15809, 15810, 15811, 15812, 15813, 15814, + 15815, 15816, 15817, 15818, 15819, 15820, 15821, 15822, 15823, 15824, + 15825, 15826, 15827, 15828, 15829, 15830, 15831, 15832, 15833, 15834, + 15835, 15836, 15837, 15838, 15839, 15840, 15841, 15842, 15843, 15844, + 15845, 15846, 15847, 15848, 15849, 15850, 15851, 15852, 15853, 15854, + 15855, 15856, 15857, 15858, 15859, 15860, 15861, 15862, 15863, 15864, + 15865, 15866, 15867, 15868, 15869, 15870, 15871, 15872, 15873, 15874, + 15875, 15876, 15877, 15878, 15879, 15880, 15881, 15882, 15883, 15884, + 15885, 15886, 15887, 15888, 15889, 15890, 15891, 15892, 15893, 15894, + 15895, 15896, 15897, 15898, 15899, 15900, 15901, 15902, 15903, 15904, + 15905, 15906, 15907, 15908, 15909, 15910, 15911, 15912, 15913, 15914, + 15915, 15917, 15919, 15920, 15921, 15922, 15923, 15924, 15925, 15926, + 15927, 15928, 15929, 15930, 15931, 15932, 15933, 15934, 15935, 15936, + 15937, 15938, 15939, 15940, 15941, 15942, 15943, 15944, 15945, 15946, + 15947, 15948, 15949, 15950, 15951, 15952, 15953, 15954, 15955, 15956, + 15957, 15958, 15959, 15960, 15961, 15962, 15963, 15964, 15965, 15966, + 15967, 15968, 15969, 15970, 15971, 15972, 15973, 15974, 15975, 15976, + 15977, 15978, 15979, 15980, 15981, 15982, 15983, 15984, 15985, 15986, + 15987, 15988, 15989, 15990, 15991, 15992, 15993, 15994, 15995, 15996, + 15997, 15998, 15999, 16000, 16001, 16002, 16003, 16004, 16005, 16006, + 16007, 16008, 16009, 16010, 16011, 16012, 16013, 16014, 16015, 16016, + 16017, 16018, 16019, 16020, 16021, 16022, 16023, 16024, 16025, 16026, + 16027, 16028, 16029, 16030, 16031, 16032, 16033, 16034, 16035, 16036, + 16037, 16038, 16039, 16040, 16041, 16042, 16043, 16044, 16045, 16046, + 16047, 16048, 16049, 16050, 16051, 16052, 16053, 16054, 16055, 16056, + 16057, 16058, 16059, 16060, 16061, 16062, 16063, 16064, 16068, 16069, + 16075, 16076, 16077, 16078, 16079, 16080, 16081, 16082, 16083, 16084, + 16085, 16086, 16087, 16088, 16089, 16091, 16093, 16094, 16095, 16096, + 16098, 16100, 16101, 16102, 16103, 16104, 16105, 16110, 16111, 16112, + 16113, 16114, 16115, 16116, 16117, 16118, 16119, 16120, 16121, 16122, + 16123, 16124, 16125, 16126, 16127, 16128, 16129, 16130, 16131, 16132, + 16133, 16134, 16135, 16136, 16137, 16138, 16139, 16140, 16141, 16142, + 16143, 16144, 16145, 16146, 16147, 16148, 16149, 16150, 16151, 16152, + 16153, 16154, 16155, 16156, 16157, 16158, 16159, 16160, 16161, 16162, + 16163, 16164, 16165, 16166, 16167, 16168, 16169, 16170, 16171, 16172, + 16173, 16174, 16175, 16176, 16177, 16178, 16179, 16180, 16181, 16182, + 16183, 16184, 16185, 16186, 16187, 16188, 16189, 16190, 16191, 16192, + 16193, 16194, 16195, 16196, 16197, 16198, 16199, 16200, 16201, 16202, + 16203, 16204, 16205, 16206, 16207, 16208, 16209, 16210, 16211, 16212, + 16213, 16214, 16215, 16216, 16217, 16218, 16219, 16220, 16221, 16222, + 16223, 16224, 16225, 16226, 16227, 16228, 16229, 16233, 16234, 16235, + 16236, 16237, 16238, 16239, 16240, 16241, 16242, 16243, 16244, 16245, + 16246, 16247, 16248, 16249, 16250, 16251, 16252, 16253, 16254, 16255, + 16256, 16257, 16258, 16259, 16260, 16261, 16262, 16263, 16264, 16265, + 16266, 16267, 16268, 16269, 16270, 16271, 16272, 16273, 16274, 16275, + 16276, 16277, 16278, 16279, 16280, 16281, 16282, 16283, 16284, 16285, + 16286, 16287, 16288, 16289, 16290, 16291, 16292, 16293, 16294, 16295, + 16296, 16297, 16298, 16299, 16300, 16301, 16302, 16303, 16304, 16305, + 16306, 16307, 16308, 16309, 16310, 16311, 16312, 16313, 16314, 16315, + 16316, 16317, 16318, 16319, 16320, 16321, 16322, 16323, 16324, 16325, + 16326, 16327, 16328, 16329, 16330, 16331, 16332, 16333, 16334, 16335, + 16336, 16337, 16338, 16339, 16340, 16341, 16342, 16343, 16344, 16345, + 16346, 16347, 16359, 16358, 16371, 16372, 16374, 16373, 16385, 16384, + 16391, 16389, 16409, 16410, 16415, 16416, 16418, 16417, 16431, 16432, + 16438, 16437, 16442, 16446, 16447, 16448, 16452, 16453, 16454, 16455, + 16459, 16460, 16461, 16462, 16471, 16470, 16484, 16483, 16498, 16497, + 16515, 16514, 16528, 16527, 16541, 16540, 16556, 16555, 16569, 16568, + 16582, 16581, 16594, 16593, 16611, 16610, 16622, 16621, 16633, 16632, + 16643, 16661, 16672, 16679, 16685, 16707, 16723, 16735, 16734, 16748, + 16747, 16759, 16758, 16772, 16773, 16774, 16775, 16779, 16798, 16816, + 16817, 16821, 16822, 16823, 16824, 16829, 16834, 16839, 16850, 16851, + 16852, 16858, 16864, 16876, 16875, 16889, 16890, 16896, 16905, 16906, + 16910, 16911, 16915, 16934, 16935, 16936, 16941, 16942, 16947, 16946, + 16964, 16963, 16975, 16984, 16994, 16993, 17036, 17037, 17041, 17042, + 17046, 17047, 17048, 17049, 17051, 17050, 17063, 17064, 17065, 17066, + 17067, 17073, 17078, 17083, 17088, 17092, 17097, 17106, 17108, 17113, + 17118, 17124, 17130, 17135, 17147, 17148, 17152, 17153, 17157, 17162, + 17170, 17179, 17200, 17200, 17202, 17204, 17208, 17209, 17216, 17218, + 17222, 17227, 17234, 17238, 17247, 17254, 17255, 17256, 17257, 17261, + 17262, 17263, 17264, 17265, 17266, 17267, 17268, 17269, 17270, 17271, + 17272, 17273, 17274, 17275, 17276, 17277, 17278, 17279, 17280, 17281, + 17282, 17283, 17284, 17285, 17286, 17287, 17288, 17289, 17290, 17291, + 17292, 17293, 17294, 17295, 17296, 17297, 17298, 17299, 17300, 17301, + 17302, 17306, 17307, 17311, 17312, 17316, 17323, 17330, 17340, 17349, + 17355, 17362, 17370, 17375, 17383, 17388, 17396, 17401, 17408, 17408, + 17409, 17409, 17412, 17418, 17424, 17429, 17436, 17442, 17449, 17458, + 17462, 17468, 17476, 17478, 17482, 17486, 17490, 17497, 17502, 17507, + 17512, 17517, 17525, 17526, 17530, 17531, 17536, 17537, 17541, 17542, + 17546, 17547, 17551, 17552, 17557, 17556, 17566, 17575, 17576, 17580, + 17581, 17586, 17587, 17588, 17593, 17594, 17595, 17599, 17611, 17620, + 17626, 17635, 17644, 17657, 17659, 17661, 17669, 17670, 17671, 17675, + 17676, 17682, 17683, 17684, 17685, 17686, 17687, 17688, 17698, 17699, + 17704, 17717, 17731, 17732, 17733, 17737, 17738, 17742, 17743, 17748, + 17749, 17753, 17759, 17768, 17768, 17782, 17783, 17784, 17785, 17795, + 17797, 17803, 17809, 17819, 17828, 17834, 17839, 17843, 17817, 17892, + 17892, 17907, 17911, 17915, 17919, 17923, 17927, 17935, 17936, 17952, + 17959, 17966, 17979, 17980, 17981, 17985, 17986, 17987, 17991, 17992, + 17997, 17999, 17998, 18004, 18005, 18009, 18014, 18021, 18026, 18035, + 18041, 18049, 18053, 18057, 18061, 18065, 18066, 18067, 18071, 18072, + 18077, 18078, 18084, 18085, 18086, 18087, 18088, 18089, 18090, 18094, + 18095, 18096, 18097, 18098, 18099, 18100, 18101, 18102, 18103, 18104, + 18105, 18109, 18114, 18118, 18127, 18126, 18139, 18144, 18148, 18152, + 18161, 18162, 18166, 18174, 18185, 18190, 18194, 18199, 18204, 18208, + 18215, 18221, 18226, 18236, 18235, 18250, 18258, 18249, 18270, 18275, + 18280, 18290, 18289, 18300, 18298, 18312, 18310, 18322, 18333, 18337, + 18349, 18354, 18355, 18362, 18364, 18363, 18391, 18392, 18393, 18394, + 18395, 18399, 18400, 18401, 18402, 18403, 18404, 18405, 18406, 18410, + 18411, 18412, 18413, 18420, 18418, 18435, 18434, 18449, 18448 +}; +#endif + +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "\"invalid token\"", "'@'", "ABORT_SYM", + "IMPOSSIBLE_ACTION", "FORCE_LOOKAHEAD", "END_OF_INPUT", + "COLON_ORACLE_SYM", "PARAM_MARKER", "FOR_SYSTEM_TIME_SYM", + "LEFT_PAREN_ALT", "LEFT_PAREN_WITH", "LEFT_PAREN_LIKE", + "ORACLE_CONCAT_SYM", "PERCENT_ORACLE_SYM", "WITH_CUBE_SYM", + "WITH_ROLLUP_SYM", "WITH_SYSTEM_SYM", "IDENT", "IDENT_QUOTED", + "LEX_HOSTNAME", "UNDERSCORE_CHARSET", "BIN_NUM", "DECIMAL_NUM", + "FLOAT_NUM", "HEX_NUM", "HEX_STRING", "LONG_NUM", "NCHAR_STRING", "NUM", + "TEXT_STRING", "ULONGLONG_NUM", "AND_AND_SYM", "DOT_DOT_SYM", + "EQUAL_SYM", "GE", "LE", "MYSQL_CONCAT_SYM", "NE", "NOT2_SYM", "OR2_SYM", + "SET_VAR", "SHIFT_LEFT", "SHIFT_RIGHT", "ACCESSIBLE_SYM", "ADD", "ALL", + "ALTER", "ANALYZE_SYM", "AND_SYM", "ASC", "ASENSITIVE_SYM", "AS", + "BEFORE_SYM", "BETWEEN_SYM", "BIGINT", "BINARY", "BIT_AND", "BIT_OR", + "BIT_XOR", "BLOB_MARIADB_SYM", "BLOB_ORACLE_SYM", "BODY_ORACLE_SYM", + "BOTH", "BY", "CALL_SYM", "CASCADE", "CASE_SYM", "CAST_SYM", "CHANGE", + "CHAR_SYM", "CHECK_SYM", "COLLATE_SYM", "CONDITION_SYM", "CONSTRAINT", + "CONTINUE_MARIADB_SYM", "CONTINUE_ORACLE_SYM", "CONVERT_SYM", + "COUNT_SYM", "CREATE", "CROSS", "CUME_DIST_SYM", "CURDATE", + "CURRENT_ROLE", "CURRENT_USER", "CURSOR_SYM", "CURTIME", "DATABASE", + "DATABASES", "DATE_ADD_INTERVAL", "DATE_SUB_INTERVAL", "DAY_HOUR_SYM", + "DAY_MICROSECOND_SYM", "DAY_MINUTE_SYM", "DAY_SECOND_SYM", "DECIMAL_SYM", + "DECLARE_MARIADB_SYM", "DECLARE_ORACLE_SYM", "DEFAULT", + "DELETE_DOMAIN_ID_SYM", "DELETE_SYM", "DENSE_RANK_SYM", "DESCRIBE", + "DESC", "DETERMINISTIC_SYM", "DISTINCT", "DIV_SYM", "DO_DOMAIN_IDS_SYM", + "DOUBLE_SYM", "DROP", "DUAL_SYM", "EACH_SYM", "ELSEIF_MARIADB_SYM", + "ELSE", "ELSIF_ORACLE_SYM", "EMPTY_SYM", "ENCLOSED", "ESCAPED", + "EXCEPT_SYM", "EXISTS", "EXTRACT_SYM", "FALSE_SYM", "FETCH_SYM", + "FIRST_VALUE_SYM", "FLOAT_SYM", "FOREIGN", "FOR_SYM", "FROM", + "FULLTEXT_SYM", "GOTO_ORACLE_SYM", "GRANT", "GROUP_CONCAT_SYM", + "JSON_ARRAYAGG_SYM", "JSON_OBJECTAGG_SYM", "JSON_TABLE_SYM", "GROUP_SYM", + "HAVING", "HOUR_MICROSECOND_SYM", "HOUR_MINUTE_SYM", "HOUR_SECOND_SYM", + "IF_SYM", "IGNORE_DOMAIN_IDS_SYM", "IGNORE_SYM", "IGNORED_SYM", + "INDEX_SYM", "INFILE", "INNER_SYM", "INOUT_SYM", "INSENSITIVE_SYM", + "INSERT", "IN_SYM", "INTERSECT_SYM", "INTERVAL_SYM", "INTO", "INT_SYM", + "IS", "ITERATE_SYM", "JOIN_SYM", "KEYS", "KEY_SYM", "KILL_SYM", + "LAG_SYM", "LEADING", "LEAD_SYM", "LEAVE_SYM", "LEFT", "LIKE", "LIMIT", + "LINEAR_SYM", "LINES", "LOAD", "LOCATOR_SYM", "LOCK_SYM", "LONGBLOB", + "LONG_SYM", "LONGTEXT", "LOOP_SYM", "LOW_PRIORITY", + "MASTER_SSL_VERIFY_SERVER_CERT_SYM", "MATCH", "MAX_SYM", "MAXVALUE_SYM", + "MEDIAN_SYM", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIN_SYM", + "MINUS_ORACLE_SYM", "MINUTE_MICROSECOND_SYM", "MINUTE_SECOND_SYM", + "MODIFIES_SYM", "MOD_SYM", "NATURAL", "NEG", "NESTED_SYM", "NOT_SYM", + "NO_WRITE_TO_BINLOG", "NOW_SYM", "NTH_VALUE_SYM", "NTILE_SYM", + "NULL_SYM", "NUMERIC_SYM", "ON", "OPTIMIZE", "OPTIONALLY", "ORDER_SYM", + "ORDINALITY_SYM", "OR_SYM", "OTHERS_ORACLE_SYM", "OUTER", "OUTFILE", + "OUT_SYM", "OVER_SYM", "PACKAGE_ORACLE_SYM", "PAGE_CHECKSUM_SYM", + "PARSE_VCOL_EXPR_SYM", "PARTITION_SYM", "PATH_SYM", + "PERCENTILE_CONT_SYM", "PERCENTILE_DISC_SYM", "PERCENT_RANK_SYM", + "PORTION_SYM", "POSITION_SYM", "PRECISION", "PRIMARY_SYM", + "PROCEDURE_SYM", "PURGE", "RAISE_ORACLE_SYM", "RANGE_SYM", "RANK_SYM", + "READS_SYM", "READ_SYM", "READ_WRITE_SYM", "REAL", "RECURSIVE_SYM", + "REFERENCES", "REF_SYSTEM_ID_SYM", "REGEXP", "RELEASE_SYM", "RENAME", + "REPEAT_SYM", "REQUIRE_SYM", "RESIGNAL_SYM", "RESTRICT", "RETURNING_SYM", + "RETURN_MARIADB_SYM", "RETURN_ORACLE_SYM", "REVOKE", "RIGHT", + "ROW_NUMBER_SYM", "ROWS_SYM", "ROWTYPE_ORACLE_SYM", + "SECOND_MICROSECOND_SYM", "SELECT_SYM", "SENSITIVE_SYM", "SEPARATOR_SYM", + "SERVER_OPTIONS", "SET", "SHOW", "SIGNAL_SYM", "SMALLINT", "SPATIAL_SYM", + "SPECIFIC_SYM", "SQL_BIG_RESULT", "SQLEXCEPTION_SYM", "SQL_SMALL_RESULT", + "SQLSTATE_SYM", "SQL_SYM", "SQLWARNING_SYM", "SSL_SYM", "STARTING", + "STATS_AUTO_RECALC_SYM", "STATS_PERSISTENT_SYM", + "STATS_SAMPLE_PAGES_SYM", "STDDEV_SAMP_SYM", "STD_SYM", "STRAIGHT_JOIN", + "SUM_SYM", "SYSDATE", "TABLE_REF_PRIORITY", "TABLE_SYM", "TERMINATED", + "THEN_SYM", "TINYBLOB", "TINYINT", "TINYTEXT", "TO_SYM", "TRAILING", + "TRIGGER_SYM", "TRUE_SYM", "UNDO_SYM", "UNION_SYM", "UNIQUE_SYM", + "UNLOCK_SYM", "UNSIGNED", "UPDATE_SYM", "USAGE", "USE_SYM", "USING", + "UTC_DATE_SYM", "UTC_TIMESTAMP_SYM", "UTC_TIME_SYM", "VALUES_IN_SYM", + "VALUES_LESS_SYM", "VALUES", "VARBINARY", "VARCHAR", "VARIANCE_SYM", + "VAR_SAMP_SYM", "VARYING", "WHEN_SYM", "WHERE", "WHILE_SYM", "WITH", + "XOR", "YEAR_MONTH_SYM", "ZEROFILL", "BODY_MARIADB_SYM", + "ELSEIF_ORACLE_SYM", "ELSIF_MARIADB_SYM", "EXCEPTION_ORACLE_SYM", + "GOTO_MARIADB_SYM", "OTHERS_MARIADB_SYM", "PACKAGE_MARIADB_SYM", + "RAISE_MARIADB_SYM", "ROWTYPE_MARIADB_SYM", "ROWNUM_SYM", "REPLACE", + "SUBSTRING", "TRIM", "ACCOUNT_SYM", "ACTION", "ADMIN_SYM", "ADDDATE_SYM", + "AFTER_SYM", "AGAINST", "AGGREGATE_SYM", "ALGORITHM_SYM", "ALWAYS_SYM", + "ANY_SYM", "ASCII_SYM", "AT_SYM", "ATOMIC_SYM", "AUTHORS_SYM", + "AUTOEXTEND_SIZE_SYM", "AUTO_INC", "AUTO_SYM", "AVG_ROW_LENGTH", + "AVG_SYM", "BACKUP_SYM", "BEGIN_MARIADB_SYM", "BEGIN_ORACLE_SYM", + "BINLOG_SYM", "BIT_SYM", "BLOCK_SYM", "BOOL_SYM", "BOOLEAN_SYM", + "BTREE_SYM", "BYTE_SYM", "CACHE_SYM", "CASCADED", "CATALOG_NAME_SYM", + "CHAIN_SYM", "CHANGED", "CHANNEL_SYM", "CHARSET", "CHECKPOINT_SYM", + "CHECKSUM_SYM", "CIPHER_SYM", "CLASS_ORIGIN_SYM", "CLIENT_SYM", + "CLOB_MARIADB_SYM", "CLOB_ORACLE_SYM", "CLOSE_SYM", "COALESCE", + "CODE_SYM", "COLLATION_SYM", "COLUMNS", "COLUMN_ADD_SYM", + "COLUMN_CHECK_SYM", "COLUMN_CREATE_SYM", "COLUMN_DELETE_SYM", + "COLUMN_GET_SYM", "COLUMN_SYM", "COLUMN_NAME_SYM", "COMMENT_SYM", + "COMMITTED_SYM", "COMMIT_SYM", "COMPACT_SYM", "COMPLETION_SYM", + "COMPRESSED_SYM", "CONCURRENT", "CONNECTION_SYM", "CONSISTENT_SYM", + "CONSTRAINT_CATALOG_SYM", "CONSTRAINT_NAME_SYM", "CONSTRAINT_SCHEMA_SYM", + "CONTAINS_SYM", "CONTEXT_SYM", "CONTRIBUTORS_SYM", "CPU_SYM", "CUBE_SYM", + "CURRENT_SYM", "CURRENT_POS_SYM", "CURSOR_NAME_SYM", "CYCLE_SYM", + "DATAFILE_SYM", "DATA_SYM", "DATETIME", "DATE_SYM", "DAY_SYM", + "DEALLOCATE_SYM", "DEFINER_SYM", "DELAYED_SYM", "DELAY_KEY_WRITE_SYM", + "DES_KEY_FILE", "DIAGNOSTICS_SYM", "DIRECTORY_SYM", "DISABLE_SYM", + "DISCARD", "DISK_SYM", "DO_SYM", "DUMPFILE", "DUPLICATE_SYM", + "DYNAMIC_SYM", "ENABLE_SYM", "END", "ENDS_SYM", "ENGINES_SYM", + "ENGINE_SYM", "ENUM", "ERROR_SYM", "ERRORS", "ESCAPE_SYM", "EVENTS_SYM", + "EVENT_SYM", "EVERY_SYM", "EXCHANGE_SYM", "EXAMINED_SYM", "EXCLUDE_SYM", + "EXECUTE_SYM", "EXCEPTION_MARIADB_SYM", "EXIT_MARIADB_SYM", + "EXIT_ORACLE_SYM", "EXPANSION_SYM", "EXPIRE_SYM", "EXPORT_SYM", + "EXTENDED_SYM", "EXTENT_SIZE_SYM", "FAST_SYM", "FAULTS_SYM", + "FEDERATED_SYM", "FILE_SYM", "FIRST_SYM", "FIXED_SYM", "FLUSH_SYM", + "FOLLOWS_SYM", "FOLLOWING_SYM", "FORCE_SYM", "FORMAT_SYM", "FOUND_SYM", + "FULL", "FUNCTION_SYM", "GENERAL", "GENERATED_SYM", "GET_FORMAT", + "GET_SYM", "GLOBAL_SYM", "GRANTS", "HANDLER_SYM", "HARD_SYM", "HASH_SYM", + "HELP_SYM", "HIGH_PRIORITY", "HISTORY_SYM", "HOST_SYM", "HOSTS_SYM", + "HOUR_SYM", "ID_SYM", "IDENTIFIED_SYM", "IGNORE_SERVER_IDS_SYM", + "IMMEDIATE_SYM", "IMPORT", "INCREMENT_SYM", "INDEXES", + "INITIAL_SIZE_SYM", "INSERT_METHOD", "INSTALL_SYM", "INVOKER_SYM", + "IO_SYM", "IPC_SYM", "ISOLATION", "ISOPEN_SYM", "ISSUER_SYM", + "INVISIBLE_SYM", "JSON_SYM", "KEY_BLOCK_SIZE", "LANGUAGE_SYM", + "LAST_SYM", "LAST_VALUE", "LASTVAL_SYM", "LEAVES", "LESS_SYM", + "LEVEL_SYM", "LIST_SYM", "LOCAL_SYM", "LOCKED_SYM", "LOCKS_SYM", + "LOGFILE_SYM", "LOGS_SYM", "MASTER_CONNECT_RETRY_SYM", + "MASTER_DELAY_SYM", "MASTER_GTID_POS_SYM", "MASTER_HOST_SYM", + "MASTER_LOG_FILE_SYM", "MASTER_LOG_POS_SYM", "MASTER_PASSWORD_SYM", + "MASTER_PORT_SYM", "MASTER_SERVER_ID_SYM", "MASTER_SSL_CAPATH_SYM", + "MASTER_SSL_CA_SYM", "MASTER_SSL_CERT_SYM", "MASTER_SSL_CIPHER_SYM", + "MASTER_SSL_CRL_SYM", "MASTER_SSL_CRLPATH_SYM", "MASTER_SSL_KEY_SYM", + "MASTER_SSL_SYM", "MASTER_SYM", "MASTER_USER_SYM", "MASTER_USE_GTID_SYM", + "MASTER_HEARTBEAT_PERIOD_SYM", "MASTER_DEMOTE_TO_SLAVE_SYM", + "MAX_CONNECTIONS_PER_HOUR", "MAX_QUERIES_PER_HOUR", "MAX_ROWS", + "MAX_SIZE_SYM", "MAX_UPDATES_PER_HOUR", "MAX_STATEMENT_TIME_SYM", + "MAX_USER_CONNECTIONS_SYM", "MEDIUM_SYM", "MEMORY_SYM", "MERGE_SYM", + "MESSAGE_TEXT_SYM", "MICROSECOND_SYM", "MIGRATE_SYM", "MINUTE_SYM", + "MINVALUE_SYM", "MIN_ROWS", "MODE_SYM", "MODIFY_SYM", "MONITOR_SYM", + "MONTH_SYM", "MUTEX_SYM", "MYSQL_SYM", "MYSQL_ERRNO_SYM", "NAMES_SYM", + "NAME_SYM", "NATIONAL_SYM", "NCHAR_SYM", "NEVER_SYM", "NEXT_SYM", + "NEXTVAL_SYM", "NOCACHE_SYM", "NOCYCLE_SYM", "NODEGROUP_SYM", "NONE_SYM", + "NOTFOUND_SYM", "NO_SYM", "NOMAXVALUE_SYM", "NOMINVALUE_SYM", + "NO_WAIT_SYM", "NOWAIT_SYM", "NUMBER_MARIADB_SYM", "NUMBER_ORACLE_SYM", + "NVARCHAR_SYM", "OF_SYM", "OFFSET_SYM", "OLD_PASSWORD_SYM", "ONE_SYM", + "ONLY_SYM", "ONLINE_SYM", "OPEN_SYM", "OPTIONS_SYM", "OPTION", + "OVERLAPS_SYM", "OWNER_SYM", "PACK_KEYS_SYM", "PAGE_SYM", "PARSER_SYM", + "PARTIAL", "PARTITIONS_SYM", "PARTITIONING_SYM", "PASSWORD_SYM", + "PERIOD_SYM", "PERSISTENT_SYM", "PHASE_SYM", "PLUGINS_SYM", "PLUGIN_SYM", + "PORT_SYM", "PRECEDES_SYM", "PRECEDING_SYM", "PREPARE_SYM", + "PRESERVE_SYM", "PREV_SYM", "PREVIOUS_SYM", "PRIVILEGES", "PROCESS", + "PROCESSLIST_SYM", "PROFILE_SYM", "PROFILES_SYM", "PROXY_SYM", + "QUARTER_SYM", "QUERY_SYM", "QUICK", "RAW_MARIADB_SYM", "RAW_ORACLE_SYM", + "READ_ONLY_SYM", "REBUILD_SYM", "RECOVER_SYM", "REDOFILE_SYM", + "REDO_BUFFER_SIZE_SYM", "REDUNDANT_SYM", "RELAY", "RELAYLOG_SYM", + "RELAY_LOG_FILE_SYM", "RELAY_LOG_POS_SYM", "RELAY_THREAD", "RELOAD", + "REMOVE_SYM", "REORGANIZE_SYM", "REPAIR", "REPEATABLE_SYM", "REPLAY_SYM", + "REPLICATION", "RESET_SYM", "RESTART_SYM", "RESOURCES", "RESTORE_SYM", + "RESUME_SYM", "RETURNED_SQLSTATE_SYM", "RETURNS_SYM", "REUSE_SYM", + "REVERSE_SYM", "ROLE_SYM", "ROLLBACK_SYM", "ROLLUP_SYM", "ROUTINE_SYM", + "ROWCOUNT_SYM", "ROW_SYM", "ROW_COUNT_SYM", "ROW_FORMAT_SYM", + "RTREE_SYM", "SAVEPOINT_SYM", "SCHEDULE_SYM", "SCHEMA_NAME_SYM", + "SECOND_SYM", "SECURITY_SYM", "SEQUENCE_SYM", "SERIALIZABLE_SYM", + "SERIAL_SYM", "SESSION_SYM", "SERVER_SYM", "SETVAL_SYM", "SHARE_SYM", + "SHUTDOWN", "SIGNED_SYM", "SIMPLE_SYM", "SKIP_SYM", "SLAVE", "SLAVES", + "SLAVE_POS_SYM", "SLOW", "SNAPSHOT_SYM", "SOCKET_SYM", "SOFT_SYM", + "SONAME_SYM", "SOUNDS_SYM", "SOURCE_SYM", "SQL_BUFFER_RESULT", + "SQL_CACHE_SYM", "SQL_CALC_FOUND_ROWS", "SQL_NO_CACHE_SYM", "SQL_THREAD", + "STAGE_SYM", "STARTS_SYM", "START_SYM", "STATEMENT_SYM", "STATUS_SYM", + "STOP_SYM", "STORAGE_SYM", "STORED_SYM", "STRING_SYM", + "SUBCLASS_ORIGIN_SYM", "SUBDATE_SYM", "SUBJECT_SYM", "SUBPARTITIONS_SYM", + "SUBPARTITION_SYM", "SUPER_SYM", "SUSPEND_SYM", "SWAPS_SYM", + "SWITCHES_SYM", "SYSTEM", "SYSTEM_TIME_SYM", "TABLES", "TABLESPACE", + "TABLE_CHECKSUM_SYM", "TABLE_NAME_SYM", "TEMPORARY", "TEMPTABLE_SYM", + "TEXT_SYM", "THAN_SYM", "TIES_SYM", "TIMESTAMP", "TIMESTAMP_ADD", + "TIMESTAMP_DIFF", "TIME_SYM", "TRANSACTION_SYM", "TRANSACTIONAL_SYM", + "THREADS_SYM", "TRIGGERS_SYM", "TRIM_ORACLE", "TRUNCATE_SYM", "TYPE_SYM", + "UDF_RETURNS_SYM", "UNBOUNDED_SYM", "UNCOMMITTED_SYM", "UNDEFINED_SYM", + "UNDOFILE_SYM", "UNDO_BUFFER_SIZE_SYM", "UNICODE_SYM", "UNINSTALL_SYM", + "UNKNOWN_SYM", "UNTIL_SYM", "UPGRADE_SYM", "USER_SYM", "USE_FRM", + "VALUE_SYM", "VARCHAR2_MARIADB_SYM", "VARCHAR2_ORACLE_SYM", "VARIABLES", + "VERSIONING_SYM", "VIA_SYM", "VIEW_SYM", "VISIBLE_SYM", "VIRTUAL_SYM", + "WAIT_SYM", "WARNINGS", "WEEK_SYM", "WEIGHT_STRING_SYM", "WINDOW_SYM", + "WITHIN", "WITHOUT", "WORK_SYM", "WRAPPER_SYM", "WRITE_SYM", "X509_SYM", + "XA_SYM", "XML_SYM", "YEAR_SYM", "CONDITIONLESS_JOIN", "ON_SYM", + "PREC_BELOW_NOT", "'='", "'>'", "'<'", "'|'", "'&'", "'-'", "'+'", "'*'", + "'/'", "'%'", "'^'", "'~'", "SUBQUERY_AS_EXPR", + "PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE", "USER", + "PREC_BELOW_CONTRACTION_TOKEN2", "'('", "')'", "EMPTY_FROM_CLAUSE", + "','", "'!'", "'{'", "'}'", "';'", "'.'", "':'", "$accept", "query", + "$@1", "opt_end_of_input", "directly_executable_statement", + "verb_clause", "deallocate", "deallocate_or_drop", "prepare", "$@2", + "execute", "$@3", "$@4", "execute_using", "$@5", "execute_params", + "help", "$@6", "change", "$@7", "master_defs", "master_def", + "ignore_server_id_list", "ignore_server_id", "do_domain_id_list", + "do_domain_id", "ignore_domain_id_list", "ignore_domain_id", + "master_file_def", "optional_connection_name", "connection_name", + "optional_for_channel", "for_channel", "create", "$@8", "$@9", "$@10", + "$@11", "$@12", "$@13", "$@14", "$@15", "$@16", "$@17", "$@18", "$@19", + "$@20", "$@21", "$@22", "$@23", "$@24", "opt_sequence", "sequence_defs", + "sequence_def", "force_lookahead", "server_def", "$@25", + "server_options_list", "server_option", "event_tail", "$@26", + "ev_schedule_time", "$@27", "opt_ev_status", "ev_starts", "ev_ends", + "opt_ev_on_completion", "ev_on_completion", "opt_ev_comment", + "ev_sql_stmt", "$@28", "clear_privileges", "opt_aggregate", "sp_handler", + "sp_name", "sp_a_chistics", "sp_c_chistics", "sp_chistic", + "sp_c_chistic", "sp_suid", "call", "$@29", "$@30", "$@31", + "opt_sp_cparam_list", "opt_sp_cparams", "sp_cparams", "sp_fdparam_list", + "$@32", "sp_fdparams", "sp_param_name", "sp_pdparam_list", "sp_pdparams", + "sp_parameter_type", "sp_parenthesized_pdparam_list", "$@33", + "sp_parenthesized_fdparam_list", "sp_proc_stmts", "sp_proc_stmts1", + "optionally_qualified_column_ident", "row_field_definition", + "row_field_definition_list", "row_type_body", "sp_decl_idents_init_vars", + "sp_decl_variable_list", "$@34", "sp_decl_handler", "$@35", + "opt_parenthesized_cursor_formal_parameters", "sp_cursor_stmt_lex", + "sp_cursor_stmt", "$@36", "sp_handler_type", "sp_hcond_list", + "sp_hcond_element", "sp_cond", "sqlstate", "opt_value", "sp_hcond", + "raise_stmt_oracle", "signal_stmt", "signal_value", "opt_signal_value", + "opt_set_signal_information", "signal_information_item_list", + "signal_allowed_expr", "signal_condition_information_item_name", + "resignal_stmt", "get_diagnostics", "which_area", + "diagnostics_information", "statement_information", + "statement_information_item", "simple_target_specification", + "statement_information_item_name", "condition_number", + "condition_information", "condition_information_item", + "condition_information_item_name", "sp_decl_ident", "sp_decl_idents", + "sp_proc_stmt_if", "$@37", "sp_proc_stmt_statement", "$@38", + "RETURN_ALLMODES_SYM", "sp_proc_stmt_return", "$@39", + "sp_proc_stmt_exit_oracle", "$@40", "$@41", + "sp_proc_stmt_continue_oracle", "$@42", "$@43", "sp_proc_stmt_leave", + "sp_proc_stmt_iterate", "sp_proc_stmt_goto_oracle", "expr_lex", "@44", + "assignment_source_lex", "assignment_source_expr", "$@45", + "for_loop_bound_expr", "$@46", "cursor_actual_parameters", + "opt_parenthesized_cursor_actual_parameters", "sp_proc_stmt_with_cursor", + "sp_proc_stmt_open", "sp_proc_stmt_fetch_head", "sp_proc_stmt_fetch", + "sp_proc_stmt_close", "sp_fetch_list", "sp_if", "$@47", "$@48", + "sp_elseifs", "case_stmt_specification", "$@49", "case_stmt_body", + "$@50", "simple_when_clause_list", "searched_when_clause_list", + "simple_when_clause", "$@51", "searched_when_clause", "$@52", + "else_clause_opt", "sp_opt_label", "opt_sp_for_loop_direction", + "sp_for_loop_index_and_bounds", "sp_for_loop_bounds", "loop_body", + "repeat_body", "pop_sp_loop_label", "sp_labeled_control", "$@53", "$@54", + "$@55", "$@56", "$@57", "$@58", "sp_unlabeled_control", "$@59", "$@60", + "$@61", "$@62", "$@63", "trg_action_time", "trg_event", "create_body", + "$@64", "create_like", "opt_create_select", + "create_select_query_expression", "opt_create_partitioning", + "opt_partitioning", "partitioning", "$@65", "have_partitioning", + "partition_entry", "$@66", "partition", "$@67", "part_type_def", "$@68", + "$@69", "$@70", "opt_linear", "opt_key_algo", "part_field_list", + "part_field_item_list", "part_field_item", "part_column_list", + "part_func", "sub_part_func", "opt_num_parts", "opt_sub_part", "$@71", + "$@72", "sub_part_field_list", "sub_part_field_item", "part_func_expr", + "opt_num_subparts", "part_defs", "part_def_list", "opt_partition", + "part_definition", "$@73", "part_name", "opt_part_values", "$@74", + "$@75", "part_func_max", "part_values_in", "part_value_list", + "part_value_item", "$@76", "$@77", "part_value_item_list", + "part_value_expr_item", "opt_sub_partition", "sub_part_list", + "sub_part_definition", "$@78", "sub_name", "opt_part_options", + "part_option_list", "part_option", "opt_subpart_options", + "subpart_option_list", "server_part_option", "opt_versioning_rotation", + "$@79", "opt_versioning_interval_start", "opt_vers_auto_part", "opt_as", + "opt_create_database_options", "create_database_options", + "create_database_option", "opt_if_not_exists_table_element", + "opt_if_not_exists", "create_or_replace", "opt_create_table_options", + "create_table_options_space_separated", "create_table_options", + "create_table_option", "$@80", "engine_defined_option", + "opt_versioning_option", "versioning_option", "default_charset", + "default_collation", "storage_engines", "known_storage_engines", + "row_types", "merge_insert_types", "udf_type", "create_field_list", + "create_field_list_parens", "field_list", "field_list_item", + "column_def", "key_def", "$@81", "$@82", "$@83", "$@84", "$@85", "$@86", + "$@87", "constraint_def", "period_for_system_time", + "period_for_application_time", "opt_check_constraint", + "check_constraint", "opt_constraint_no_id", "opt_constraint", + "constraint", "field_spec", "@88", "field_type_or_serial", "$@89", + "$@90", "opt_serial_attribute", "opt_serial_attribute_list", + "opt_asrow_attribute", "opt_asrow_attribute_list", "field_def", "$@91", + "opt_generated_always", "vcol_opt_specifier", "vcol_opt_attribute", + "vcol_opt_attribute_list", "vcol_attribute", "parse_vcol_expr", "$@92", + "parenthesized_expr", "virtual_column_func", "expr_or_literal", + "column_default_expr", "field_type", "qualified_field_type", "udt_name", + "field_type_all", "field_type_numeric", "opt_binary_and_compression", + "field_type_string", "field_type_temporal", "field_type_lob", + "field_type_misc", "char", "nchar", "varchar", "nvarchar", "int_type", + "real_type", "srid_option", "float_options", "precision", + "field_options", "last_field_options", "field_length_str", + "field_length", "field_scale", "opt_field_length", "opt_field_scale", + "opt_precision", "attribute_list", "attribute", "opt_compression_method", + "opt_compressed", "opt_enable", "compressed", + "compressed_deprecated_data_type_attribute", + "compressed_deprecated_column_attribute", "asrow_attribute", + "serial_attribute", "with_or_without_system", "charset", "charset_name", + "charset_name_or_default", "opt_load_data_charset", + "old_or_new_charset_name", "old_or_new_charset_name_or_default", + "collation_name", "collation_name_or_default", "opt_default", + "charset_or_alias", "opt_binary", "binary", "opt_bin_mod", "ws_nweights", + "$@93", "ws_level_flag_desc", "ws_level_flag_reverse", "ws_level_flags", + "ws_level_number", "ws_level_list_item", "ws_level_list", + "ws_level_range", "ws_level_list_or_range", "opt_ws_levels", + "opt_primary", "references", "opt_ref_list", "ref_list", + "opt_match_clause", "opt_on_update_delete", "delete_option", + "constraint_key_type", "key_or_index", "opt_key_or_index", + "keys_or_index", "fulltext", "spatial", "normal_key_options", + "fulltext_key_options", "spatial_key_options", "normal_key_opts", + "spatial_key_opts", "fulltext_key_opts", "opt_USING_key_algorithm", + "opt_key_algorithm_clause", "key_using_alg", "all_key_opt", + "normal_key_opt", "spatial_key_opt", "fulltext_key_opt", + "btree_or_rtree", "ignorability", "key_list", "opt_without_overlaps", + "key_part", "opt_ident", "string_list", "alter", "$@94", "$@95", "$@96", + "$@97", "$@98", "$@99", "$@100", "$@101", "$@102", "$@103", "$@104", + "$@105", "$@106", "account_locking_option", "opt_password_expire_option", + "opt_account_locking_and_opt_password_expiration", + "ev_alter_on_schedule_completion", "opt_ev_rename_to", "opt_ev_sql_stmt", + "ident_or_empty", "alter_commands", "$@107", "$@108", "$@109", "$@110", + "remove_partitioning", "all_or_alt_part_name_list", "add_partition_rule", + "$@111", "add_part_extra", "reorg_partition_rule", "$@112", + "reorg_parts_rule", "$@113", "alt_part_name_list", "alt_part_name_item", + "alter_list", "add_column", "alter_list_item", + "opt_index_lock_algorithm", "alter_algorithm_option", + "alter_lock_option", "opt_column", "opt_ignore", "alter_options", + "$@114", "alter_options_part2", "alter_option_list", "alter_option", + "opt_restrict", "opt_place", "opt_to", "slave", "$@115", "$@116", + "start", "opt_start_transaction_option_list", + "start_transaction_option_list", "start_transaction_option", + "slave_thread_opts", "$@117", "slave_thread_opt_list", + "slave_thread_opt", "slave_until", "slave_until_opts", "checksum", + "$@118", "opt_checksum_type", "repair_table_or_view", "$@119", "repair", + "$@120", "opt_mi_repair_type", "mi_repair_types", "mi_repair_type", + "opt_view_repair_type", "analyze", "$@121", "analyze_table_list", + "analyze_table_elem_spec", "opt_persistent_stat_clause", + "persistent_stat_spec", "persistent_column_stat_spec", "$@122", + "persistent_index_stat_spec", "$@123", "table_column_list", + "table_index_list", "table_index_name", "binlog_base64_event", + "check_view_or_table", "$@124", "check", "$@125", "opt_mi_check_type", + "mi_check_types", "mi_check_type", "opt_view_check_type", "optimize", + "$@126", "opt_no_write_to_binlog", "rename", "$@127", "rename_list", + "table_to_table_list", "table_to_table", "keycache", "$@128", + "keycache_list_or_parts", "keycache_list", "assign_to_keycache", + "assign_to_keycache_parts", "key_cache_name", "preload", "$@129", + "preload_list_or_parts", "preload_list", "preload_keys", + "preload_keys_parts", "adm_partition", "$@130", "cache_keys_spec", + "$@131", "cache_key_list_or_empty", "opt_ignore_leaves", "select", + "$@132", "$@133", "select_into", "$@134", "$@135", "simple_table", + "table_value_constructor", "$@136", "query_specification_start", "$@137", + "$@138", "query_specification", "select_into_query_specification", + "query_expression", "query_expression_no_with_clause", + "query_expression_body_ext", "$@139", "$@140", + "query_expression_body_ext_parens", "query_expression_body", "$@141", + "query_primary", "query_simple", "subselect", "subquery", + "opt_from_clause", "from_clause", "table_reference_list", + "select_options", "opt_history_unit", "history_point", + "for_portion_of_time_clause", "opt_for_portion_of_time_clause", + "opt_for_system_time_clause", "system_time_expr", "select_option_list", + "select_option", "select_lock_type", "opt_select_lock_type", + "opt_lock_wait_timeout_new", "select_item_list", "select_item", + "remember_tok_start", "remember_name", "remember_end", "select_alias", + "opt_default_time_precision", "opt_time_precision", "optional_braces", + "expr", "boolean_test", "predicate", "bit_expr", "or", "and", "not", + "not2", "comp_op", "all_or_any", "opt_dyncol_type", "dyncol_type", + "numeric_dyncol_type", "temporal_dyncol_type", "string_dyncol_type", + "dyncall_create_element", "dyncall_create_list", "plsql_cursor_attr", + "explicit_cursor_attr", "trim_operands", "trim_operands_regular", + "trim_operands_special", "column_default_non_parenthesized_expr", + "primary_expr", "string_factor_expr", "simple_expr", + "mysql_concatenation_expr", "function_call_keyword_timestamp", + "function_call_keyword", "substring_operands", + "substring_operands_regular", "substring_operands_special", + "function_call_nonkeyword", "function_call_conflict", + "function_call_generic", "@142", "fulltext_options", + "opt_natural_language_mode", "opt_query_expansion", "opt_udf_expr_list", + "udf_expr_list", "udf_expr", "sum_expr", "$@143", "$@144", "$@145", + "$@146", "$@147", "window_func_expr", "window_func", + "simple_window_func", "inverse_distribution_function", + "percentile_function", "$@148", "inverse_distribution_function_def", + "order_by_single_element_list", "window_name", "variable", "$@149", + "variable_aux", "opt_distinct", "opt_gconcat_separator", + "opt_gorder_clause", "gorder_list", "opt_glimit_clause", "glimit_clause", + "glimit_options", "in_sum_expr", "$@150", "cast_type", + "cast_type_numeric", "cast_type_temporal", "opt_expr_list", "expr_list", + "ident_list_arg", "ident_list", "when_list", "when_list_opt_else", + "table_ref", "json_text_literal", "json_text_literal_or_num", + "join_table_list", "json_table_columns_clause", + "json_table_columns_list", "json_table_column", "$@151", "$@152", + "json_table_column_type", "json_table_field_type", + "json_opt_on_empty_or_error", "json_on_response", + "json_on_error_response", "json_on_empty_response", "table_function", + "$@153", "$@154", "esc_table_ref", "derived_table_list", "join_table", + "$@155", "$@156", "$@157", "$@158", "$@159", "$@160", "inner_join", + "normal_join", "opt_use_partition", "use_partition", "table_factor", + "table_primary_ident_opt_parens", "table_primary_derived_opt_parens", + "table_reference_list_parens", "nested_table_reference_list", + "join_table_parens", "table_primary_ident", "table_primary_derived", + "opt_outer", "index_hint_clause", "index_hint_type", + "index_hint_definition", "$@161", "$@162", "index_hints_list", + "opt_index_hints_list", "$@163", "opt_key_definition", "$@164", + "opt_key_usage_list", "key_usage_element", "key_usage_list", + "using_list", "interval", "interval_time_stamp", "date_time_type", + "table_alias", "opt_table_alias_clause", "table_alias_clause", "opt_all", + "opt_where_clause", "$@165", "opt_having_clause", "$@166", + "opt_group_clause", "group_list", "olap_opt", "opt_window_clause", + "window_def_list", "window_def", "window_spec", "$@167", + "opt_window_ref", "opt_window_partition_clause", + "opt_window_order_clause", "opt_window_frame_clause", + "window_frame_units", "window_frame_extent", "window_frame_start", + "window_frame_bound", "opt_window_frame_exclusion", "alter_order_clause", + "alter_order_list", "alter_order_item", "opt_order_clause", + "order_clause", "$@168", "order_list", "order_dir", "opt_limit_clause", + "limit_clause", "fetch_first_clause", "first_or_next", "row_or_rows", + "only_or_with_ties", "opt_global_limit_clause", "limit_options", + "limit_option", "limit_rows_option", "delete_limit_clause", + "order_limit_lock", "opt_order_limit_lock", "query_expression_tail", + "opt_query_expression_tail", "opt_procedure_or_into", "order_or_limit", + "opt_plus", "int_num", "ulong_num", "real_ulong_num", "longlong_num", + "ulonglong_num", "real_ulonglong_num", "dec_num_error", "dec_num", + "choice", "bool", "procedure_clause", "$@169", "procedure_list", + "procedure_list2", "procedure_item", "select_var_list_init", "$@170", + "select_var_list", "select_var_ident", "select_outvar", "into", + "into_destination", "$@171", "$@172", "do", "$@173", "drop", "$@174", + "$@175", "$@176", "$@177", "table_list", "table_name", + "table_name_with_opt_use_partition", "table_alias_ref_list", + "table_alias_ref", "opt_if_exists_table_element", "opt_if_exists", + "opt_temporary", "insert", "$@178", "$@179", "replace", "$@180", "$@181", + "insert_start", "stmt_end", "insert_lock_option", "replace_lock_option", + "insert_replace_option", "opt_into", "insert_table", "$@182", + "insert_field_spec", "$@183", "insert_field_list", "opt_fields", + "fields", "insert_values", "values_list", "ident_eq_list", + "ident_eq_value", "equal", "opt_equal", "opt_with", "opt_by", + "no_braces", "$@184", "no_braces_with_names", "$@185", "opt_values", + "opt_values_with_names", "values", "values_with_names", "expr_or_ignore", + "expr_or_ignore_or_default", "opt_insert_update", "$@186", "$@187", + "update_table_list", "update", "$@188", "$@189", "$@190", "update_list", + "update_elem", "insert_update_list", "insert_update_elem", + "opt_low_priority", "delete", "$@191", "opt_delete_system_time", + "delete_part2", "delete_single_table", "delete_single_table_for_period", + "single_multi", "$@192", "$@193", "$@194", "$@195", "opt_returning", + "$@196", "table_wild_list", "table_wild_one", "opt_wild", + "opt_delete_options", "opt_delete_option", "truncate", "$@197", "$@198", + "opt_table_sym", "opt_profile_defs", "profile_defs", "profile_def", + "opt_profile_args", "show", "$@199", "show_param", "$@200", "$@201", + "show_engine_param", "master_or_binary", "opt_storage", "opt_db", + "opt_full", "from_or_in", "binlog_in", "binlog_from", "wild_and_where", + "describe", "$@202", "$@203", "explainable_command", "describe_command", + "analyze_stmt_command", "opt_extended_describe", "opt_format_json", + "opt_describe_column", "explain_for_connection", "flush", "$@204", + "flush_options", "$@205", "opt_flush_lock", "flush_lock", "$@206", + "flush_options_list", "flush_option", "opt_table_list", "backup", + "backup_statements", "$@207", "opt_delete_gtid_domain", + "delete_domain_id_list", "delete_domain_id", + "optional_flush_tables_arguments", "reset", "$@208", "reset_options", + "reset_option", "$@209", "$@210", "slave_reset_options", + "master_reset_options", "purge", "$@211", "kill", "$@212", "kill_type", + "kill_option", "opt_connection", "kill_expr", "shutdown", "$@213", + "shutdown_option", "use", "load", "$@214", "$@215", "$@216", "$@217", + "data_or_xml", "opt_local", "load_data_lock", "opt_duplicate", + "opt_field_term", "field_term_list", "field_term", "opt_line_term", + "line_term_list", "line_term", "opt_xml_rows_identified_by", + "opt_ignore_lines", "lines_or_rows", "opt_field_or_var_spec", + "fields_or_vars", "field_or_var", "opt_load_data_set_spec", + "load_data_set_list", "load_data_set_elem", "text_literal", + "text_string", "hex_or_bin_String", "param_marker", "signed_literal", + "literal", "NUM_literal", "temporal_literal", "with_clause", "$@218", + "opt_recursive", "with_list", "with_list_element", "opt_cycle", "$@219", + "opt_with_column_list", "with_column_list", "ident_sys_alloc", + "comma_separated_ident_list", "with_element_head", "insert_ident", + "table_wild", "select_sublist_qualified_asterisk", "order_ident", + "simple_ident", "simple_ident_nospvar", "field_ident", "table_ident", + "table_ident_opt_wild", "table_ident_nodb", "IDENT_cli", "ident_cli", + "IDENT_sys", "ident_cli_func", "ident_func", "TEXT_STRING_sys", + "TEXT_STRING_literal", "TEXT_STRING_filesystem", "ident_table_alias", + "ident_cli_set_usual_case", "ident_sysvar_name", "ident", "label_ident", + "ident_or_text", "user_maybe_role", "user_or_role", "user", + "keyword_table_alias", "keyword_ident", "keyword_sysvar_name", + "keyword_set_usual_case", "non_reserved_keyword_udt", + "keyword_sp_var_not_label", "keyword_sp_head", "keyword_verb_clause", + "keyword_set_special_case", "keyword_sysvar_type", "keyword_data_type", + "keyword_cast_type", "keyword_func_sp_var_and_label", + "keyword_func_sp_var_not_label", "keyword_sp_var_and_label", + "reserved_keyword_udt_not_param_type", "set", "$@220", "set_param", + "$@221", "$@222", "$@223", "set_stmt_option_list", + "start_option_value_list_following_option_type", "$@224", + "option_value_list", "option_value", "$@225", "option_type", + "opt_var_type", "opt_var_ident_type", "set_stmt_option", "$@226", + "$@227", "$@228", "option_value_following_option_type", "$@229", "$@230", + "$@231", "option_value_no_option_type", "$@232", "$@233", "$@234", + "$@235", "$@236", "$@237", "$@238", "$@239", "$@240", "$@241", + "transaction_characteristics", "transaction_access_mode", + "isolation_level", "transaction_access_mode_types", "isolation_types", + "text_or_password", "set_expr_or_default", "lock", "$@242", + "opt_lock_wait_timeout", "table_or_tables", "table_lock_list", + "table_lock", "lock_option", "unlock", "$@243", "handler", "$@244", + "handler_tail", "$@245", "handler_read_or_scan", "handler_scan_function", + "handler_rkey_function", "$@246", "handler_rkey_mode", "revoke", + "revoke_command", "admin_option_for_role", "grant", "grant_command", + "opt_with_admin", "opt_with_admin_option", "role_list", "current_role", + "role_name", "grant_role", "opt_table", "grant_privileges", + "opt_privileges", "object_privilege_list", "column_list_privilege", + "column_privilege", "object_privilege", "opt_and", "require_list", + "require_list_element", "grant_ident", "user_list", "grant_list", + "user_and_role_list", "via_or_with", "using_or_as", "grant_user", + "auth_expression", "auth_token", "opt_auth_str", "opt_require_clause", + "resource_option", "resource_option_list", "opt_resource_options", + "opt_grant_options", "opt_grant_option", "grant_option_list", + "grant_option", "begin_stmt_mariadb", "$@247", "compound_statement", + "opt_not", "opt_work", "opt_chain", "opt_release", "commit", "rollback", + "savepoint", "release", "unit_type_decl", "union_option", + "query_expression_option", "definer_opt", "no_definer", "definer", + "view_algorithm", "opt_view_suid", "view_suid", "view_list_opt", + "view_list", "view_select", "$@248", "view_check_option", + "trigger_action_order", "trigger_follows_precedes_clause", + "trigger_tail", "$@249", "$@250", "$@251", "$@252", "$@253", + "sf_return_type", "$@254", "xa", "opt_format_xid", "xid", + "begin_or_start", "opt_join_or_resume", "opt_one_phase", "opt_suspend", + "$@255", "opt_migrate", "install", "uninstall", "keep_gcc_happy", + "_empty", "statement", "sp_statement", "sp_if_then_statements", + "sp_case_then_statements", "reserved_keyword_udt_param_type", + "reserved_keyword_udt", "keyword_sp_block_section", "keyword_label", + "keyword_sp_decl", "opt_truncate_table_storage_clause", + "ident_for_loop_index", "row_field_name", "while_body", "$@256", + "for_loop_statements", "sp_label", "sp_control_label", "sp_block_label", + "sp_opt_default", "sp_decl_variable_list_anchored", + "sp_param_name_and_mode", "sp_param", "sp_param_anchored", + "sf_c_chistics_and_body_standalone", "$@257", "sp_tail_standalone", + "$@258", "$@259", "drop_routine", "create_routine", "$@260", "$@261", + "$@262", "sp_decls", "sp_decl", "sp_decl_body", "$@263", + "sp_proc_stmt_in_returns_clause", "sp_proc_stmt", + "sp_proc_stmt_compound_ok", "sp_labeled_block", "$@264", + "sp_unlabeled_block", "$@265", "sp_unlabeled_block_not_atomic", "$@266", YY_NULLPTR +}; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} +#endif + +#define YYPACT_NINF (-5341) + +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) + +#define YYTABLE_NINF (-3660) + +#define yytable_value_is_error(Yyn) \ + 0 + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const int yypact[] = +{ + 7647, -5341, -5341, 2971, 1711, 93552, -5341, 116, -5341, 1031, + -5341, -5341, -5341, 3395, -5341, -5341, -5341, -5341, -5341, 198, + 463, -5341, 326, -5341, -5341, 353, 80214, 634, 580, -5341, + 83178, -5341, -5341, -5341, -5341, 83178, -5341, -5341, 93552, -5341, + -5341, 1436, -5341, 172, 1568, 2263, 1565, 463, 1074, -5341, + -5341, 94293, 326, 1603, -5341, -5341, 1251, 93552, 326, -5341, + 1074, 93552, -5341, 313, 279, -5341, 1342, 4371, 133, 2180, + 2197, -5341, -5341, 1640, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4703, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 1891, -5341, -5341, -5341, + -5341, 4408, 1835, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 45266, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 133, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 95034, 93552, 1543, 1584, + 93552, 2226, 80955, 2226, -5341, 126, -5341, -5341, 1971, -5341, + 1630, -5341, 463, 2744, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, 1718, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 2204, 2508, + 536, 2237, 278, 2226, -5341, 2226, 2226, 2226, 2226, 2226, + 2226, -5341, 2226, 2226, 943, 93552, 67617, -5341, -5341, 108, + 2417, -5341, -5341, -5341, -5341, -5341, -5341,108132, 463, 23317, + 2512, -5341, -5341, 2074, 3711, 1871, -5341, 2356, -5341, -5341, + 93552, -5341, 2226,108132, -5341, 2356, 68358, 3781, 49723, 7733, + 2356, 463, 2453, -5341, 1882, -5341, -5341, -5341, -5341, -5341, + -5341, 93552, -5341, -5341, -5341, 2338, 1074, 80955, -5341, -5341, + -5341, -5341, -5341, 2625, 23317, 243, 2385, -5341, -5341, 2304, + 46007, 80955, 2583, 2508, 2606, -5341, 1528, 572, -5341, 1998, + 2077, 2508, 1514, 2091, 2508, 2497, 2226, 2226, -5341, -5341, + 3364, 3364, 3364, 2333, 3364, -5341, 3364, 2673, 2022, 447, + -5341, -5341, 2028, 93552, 2583, -5341, 2583, -5341, 2668, 2583, + 2583, 2166, 2682, 2695, 160, 1531, 187, 187, 1971, 40820, + 1148, 2531, -5341, 2673, 2078, 1905, 2119, 2119, 2119, 2078, + 133, 2078, -5341, 2861, 1630, 2895, 93552, -5341, 2729, -5341, + 2070, -5341, -5341, 239, -5341, 2133, -5341, 2092, 1415, 69840, + -5341, 2763, -5341, -5341, -5341, -5341, -5341, -5341, 2589, 259, + 2235, 2457, 2161, -5341, 2642, 80955, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 93552, 2132, -5341, -5341, 23317, 2801, + 2204, -5341, 2632, -5341, -5341, -5341, -5341, 46007, -5341, -5341, + -5341, 2800, -5341, -5341, 83919, 663, 93552, 2813, 93552, 93552, + 93552, 93552, -5341, 80955, -5341, -5341, 2226, 2226, -5341, -5341, + 2795, 2350, 2316, 1553, 2203, 2511, -5341, 2399, -5341, 2210, + 2289, 2420, 2227, 2230, 2283, 211, -5341, 2242, -5341, 929, + 2692, 146, 154, 2696, 162, 424, 2847, 2705, 454, 971, + 466, 2503, 470, -5341, -5341, -5341, -5341, 2780, 2867, 2309, + -5341, 2323, -5341, 2812, 2646, 1149, -5341, -5341, 895, 2748, + 1213, 46007,110200, 81696,111492, -5341,111492,111492, -5341, 245, + -5341, 1568, 93552,110846, -5341, 93552,103866, -5341, 11694, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 93552, -5341, + -5341, -5341, -5341, -5341, 2321, -5341, -5341, -5341, -5341, -5341, + 2765, 2247, 2772, -5341, 2345, -5341, -5341, -5341, -5341, -5341, + 84660, -5341, 190, 205, 3475, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 29469, 2357, 2360, 2363, + 18703, 2366, 2372, 2376, 2390, 2394, 2203, 2203, 2203, 2395, + 2400, 2414, 2422, 2423, 2434, 2477, -5341, 2478, 2482, 2506, + 2518, 2527, 2551, 24086, 2555, 2560, 2561, 37103, 2567, 2568, + 2578, 2579, 23317, 2395, 2610, 2622, -5341, 2629, 2644, 2657, + 2674, 2693, 2711, 2720, 2726, 3149, 2730, 2738, 2745, 2746, + -5341, 2203, 2395, 2395, 2755, 2758, 2759, 2773, 2776, 2781, + 2788, 2799, 2811, 2830, 2833, 2844, 2845, 2853, 2855, 201, + 2859, 2866, 2868, 2869, 2872, 2873, 2875, 2461, 2884, 2886, + 2887, 2504, 2888, 2889, 2891, 2899, 206, 2902, 2903, 210, + 2904, 2908, 2910, 2913, 2914, 2920, 2921, 30238, 31007, 29469, + 16396, -5341, 93552, 95775, -5341, -5341, 4197, 1112, 3315, 2082, + 29469, -5341, -5341, -5341, 3126, -5341, 3243, -5341, -5341, -5341, + -5341, 3077, 3097, -5341, 3108, -5341, -5341, 3138, 2660, -5341, + 3448, -5341, -5341, -5341, -5341, -5341, 2721, -5341, 2926, 3514, + 3536, 2933, 2934, -5341, -5341, 479, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 2792, + 2864, -5341, 3448, -5341, -5341, 72804, -5341,108843, -5341, -5341, + 2350, 3007, 3413, -5341, 3518, -5341, 3452, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3781, + -5341, -5341, 51227, 3458, -105, -5341, -5341, 186, -5341, 196, + 240, 63171, -5341, 305, 63912, 260, 85401, 949, -5341, 70581, + -5341, 316, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 2935, -5341, 3051, 3262, 2944, 3317, 1571, -5341, + -5341, 384, 537, 3038, 115, -5341, 62, -5341, 1571, -5341, + 73545, 725, 2169, -5341, 801, -5341, 3601, -5341, -5341, 3043, + 3029, 3059, -5341, 3276, -5341, 2508, -5341, 539, -5341, 725, + 1571, 2169, -5341, 3226, 3308, 1383, 3262, -5341, 1084, -5341, + -5341, -5341, 3597, -5341, 2959, -5341, 3321, -5341, 93552, 1217, + 46007, -5341, -5341, -5341, 2963, 46007, 46007, 1221, 299, 4197, + 2965, 23317, -5341, -5341, 4092, 53483, 3166, 368, 1085, -5341, + -5341, 1568, 93552, -5341, -5341, 624, -5341, 3389, -5341, 2968, + -5341, 96516, 299, 3628, -5341, -5341, -5341, 774, 3362, -5341, + 2977, -5341, -5341, -5341, -5341, 46007, 93552, 2508, -5341, -5341, + -5341, -5341, 2979, -5341, -5341, 3183, 3065, -5341, 3003, -5341, + -5341, 225, -5341, -5341, 3761, -5341, 93552, -5341, 2583, -5341, + -5341, 2583, -5341, -5341, -5341, 2583, 2583, 2583, -5341, -5341, + 3031, -5341, 3313, 3314, 2642, -5341, 3002, 40079, 93552, 3777, + -5341, 3572, -5341, -5341, -5341, 3009, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3575, 3762, 3762, -5341, 51979, -5341, + -5341, 3660, 2531, 1589, 3501, 54987, 3649, 3737, 57243, -5341, + 725, -5341, -5341, -5341, -5341, 2249, 93552, -5341, 2249, 2249, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 133, -5341, -5341, 2744, 3410, 71322, 93552, 2078, + 1905, -5341, -5341, -5341, 2508, 369, 3406, -5341, 93552, -5341, + -5341, -5341, 2203, 3812, -5341, -5341, -5341, -5341, -5341, 46007, + 3235, 69840, 2226, -5341, -5341, -5341, 259, -5341, 1596, 93552, + 46007, 3076, -5341, 46007, 3037, 23317, -5341, -5341, 3515, 4197, + 108132, 3398, -5341, -5341, 46007, 1686, -5341, -5341, 46007, 3773, + 46007, 3707, 2531, -5341, 3053, -5341, 3052, -5341, -5341, 3721, + 93552, -5341, -5341, -5341, 3055, 74286, -5341, 72804, 46007, -5341, + -5341, 3424, 3205, -5341, -5341, -5341, -5341, -5341, -5341, 3146, + -5341, -5341, 3071, -5341, -5341, -5341, -5341, 3519, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 72804, -5341, -5341, 3520, + 3523, -5341, 69840, 1506, 5228, 95775, -5341, 3718, -5341, -5341, + -5341, 3597, -5341, -5341, 24855, -5341, 25624, -5341, -5341, -5341, + 3354, 549, 1062, -5341, -5341, 3550, 93552, 3301, 3746, 3725, + -5341, -5341, -5341, -5341, -5341, -5341, 3569, 3102, 3706, 3099, + -5341, -5341, -5341, 3104, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 46007, 52731, -5341, -5341, -5341, 3110, -5341, -5341, + -5341, 3116, 29469, 29469, -5341, 3842, 3842, 3842, 23317, 2919, + 396, 3471, 23317, 23317, 23317, 2143, 3123, -5341, -5341, -5341, + 284, -5341, 23317, 23317, 37850, 3150, 987, 5096, 23317, 3820, + 3820, -5341, 23317, 23317, 16396, 3454, 23317, 23317, 23317, 95775, + 37850, 3595, 3152, -5341, 3156, 2151, 23317, 2184, 23317, -5341, + -5341, 23317, 23317, 23317, 23317, 3155, 31776, 3159, 23317, 23317, + 3169, 3303, 3842, 3842, 2277, 293, -5341, -5341, -5341, 3842, + 3842, 3177, 23317, 23317, 17165, 23317, 23317, 2291, 23317, 23317, + 23317, 23317, 23317, 23317, -5341, 23317, 23317, 1009, 23317, 23317, + 46007, 23317, 23317, 3831, 46007, 23317, 23317, 3832, 23317, 23317, + 46007, 23317, -5341, 23317, 3942, 3942, -5341, 23317, 17165, 23317, + 3184, 38597, 23317, 23317, 23317, 24086, -5341, 24086, -5341, -5341, + 3188, 3393, 355, 133, 23317, 3178, -5341, -5341, -5341, -5341, + 23317, 23317, 23317, 31776, -5341, -5341, -5341, 432, -5341, -5341, + -5341, 26393, 31776, 3193, 31776, 31776, 3806, 2112, 31776, 31776, + 31776, 31776, 31776, 31776, 31776, 32545, 33314, 31776, 31776, 31776, + 31776, -5341, 80955, 29469, 48971, 3199, 3845, -5341, 75027, -5341, + 1591, 645, -5341, 2508, 3711, 34852, -5341, 3206, -5341, 3703, + 46007, 3203, 3211, 3868, 72804, 69840, 1506, 3229, -5341, 1300, + 234, -5341, 74286, 93552, -5341, -5341, -5341, 3928, 23317, -5341, + -5341, -5341, -5341, -5341, 3222, 383, 3230, -5341, 1040, -5341, + -5341, -5341, -5341, -5341, 93552, -5341, 86142, 50475, 3333, 3892, + 3252, 2583, 86883, 93552, 46007, 93552, 97257, 93552, 93552, 46007, + 72804, 46007, -5341, -5341, -5341, 818, 1571, 93552, 1571, 2169, + 852, 1571, 3874, -5341, -5341, 937, 937, -5341, -5341, -5341, + -5341, -5341, -5341, 1571, 93552, 93552, 1571, 69840, -5341, 2169, + 1479, -5341, 3539, 3330, -5341, -5341, -5341, 3581, -5341, -5341, + 3907, 3254, -5341, 3603, -5341, 3352, -5341, -5341, 46007, -5341, + -5341, 2169, -5341, 2169, 2169, 3919, 1571, 1571, 1571, -5341, + 41561, 3275, 3280, -5341, 3282, -5341, 3283, -5341, 3911, -5341, + -5341, -5341, 4064, 3924, 3289, -5341, -5341, 3859, 890, -5341, + 3715, -5341, 3840, -5341, 23317, 4197, 19472, 3570, -5341, -5341, + 3573, 3577, 3583, -5341, -5341, -5341, -5341, 3722, 3585, -5341, + 2508, 3587, -5341, -5341, -5341, 3319, -5341, -5341, -5341, 80955, + 34852, -5341, 3322, -5341, 3336, -5341, 208, -5341, -5341, 3989, + 3437, 23317, -5341, -5341, 46007, 3835, -5341, 2508, 1528, 93552, + -5341, -5341, 4072, -5341, 1440, 3999, -5341, -5341, 3460, 1514, + -5341, 3999, -21, -5341, -5341, 3364, 3531, -5341, -5341, -5341, + 80955, -5341, -5341, -5341, -5341, -5341, -5341, 93552, -5341, 74286, + 69840, 80955, 2583, 2583, -5341, 46007, -5341, -5341, -5341, 2583, + 2583, 2583, 3388, -5341, 2876, 3361, 3365, 3366, 3370, 2027, + 3371, 42302, 2341, 291, 3976, 3994, -5341, 3945, 2700, 3945, + -5341, -5341, 42302, 41561, 3377, 3777, -5341, -5341, -5341, -5341, + 80955, 3375, -5341, -5341, 3374, -5341, 23317, 4097, 4021, 3660, + -5341, -5341, 55739, 1465, 84660, -5341, -5341, -5341, 3729, 3913, + 1166, -5341, 3383, 3510, -5341, 444, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 23317, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 234, 229, -5341, -5341, -5341, 1397, 3767, + 2573, -5341, -5341, 80955, 2573, -5341, 3407, 3713, -5341, 3716, + 122, -5341, 46007, -5341, -5341, -5341, -5341, -5341, 46007, 3405, + -5341, 3596, 93552, 2132, 3420, 3421, 4197, 3918, -5341, 3515, + -5341,103155, -5341, 4136, 5255, 139, 3472, -5341, -5341, -5341, + -5341, -5341, 46007, -5341, -5341, 338, 3575, 3504, -5341, 3427, + -5341, -5341, 563, 4007, -5341, -5341, 4005, 93552, 4107, 58725, + -5341, -5341, 4040, 93552, 3462, -5341, -5341, 3466, 193, 46007, + 46007,108132, -5341, -5341, 3470, -5341, -5341, -5341, 3971, -5341, + -5341, 68, 4198, -5341, -5341, -5341, 43043, 43043, 929, 2692, + -5341, -5341, 2696, -5341, -5341, 2705, -5341, 971, -5341, 2503, + -5341, -5341, -5341, -5341, 2083, -5341,108132, -5341, 3911, 23317, + 48230, 4197, -5341, -5341, 46007, -5341, 4116, -5341, -5341,100221, + 185, -5341, -5341, 230, 46007, -5341, -5341, -5341, 4111, 3618, + 93552, -5341, -5341, 4171, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 93552, 93552,108132,108132, -5341, -5341, 1091, 1300, -5341, + 4229, 95775, 23317, -5341, 3497, -5341, 3499, 3500, 2972, 3858, + 23317, 23317, -5341, 2925, 67, 309, -5341, 3506, 3517, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3509, -5341, -5341, + 379, 413, 3513, -5341, -5341, -5341, 3516, 133, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4162, -5341, + 263, -5341, -5341, -5341, 23317, 493, 511, 612, 3528, 417, + 455, 931, 3110, 2095, 3522, 37850, 95775, 3842, 3524, 378, + 3842, 3525, 1329, 1461, 515, 766, 893, -5341, 348, -5341, + 1483, 1516, -5341, -5341, 3526, 3527, 3842, 3529, -5341, 3532, + 3533, 3534, -5341, 1520, 296, 3537, -5341, -5341, 20241, 21010, + 21779, 3185, 3538, -5341, -5341, 1526, 905, 3842, 3540, 1188, + 1580, 1610, -5341, 2106, 1624, 1712, 3543, 2965, 1536, 1878, + -5341, -5341, -5341, -5341, 3542, 1966, 2120, 3544, 3552, 2123, + 2272, 46007, 3556, 3560, 2294, 46007, 1793, 2332, 3548, 1813, + 813, 3559, 3561, 2398, 3562, 1860, -5341, 95775, 93552, 3564, + 3511, 298, 3565, 2480, 3454, 3454, -5341, 23317, 3566, 274, + 95775, 581, 1323, -5341, 3315, -5341, -5341, -5341, -5341, 458, + -5341, 3568, 3315, 3576, 3112, 16396, -5341, 1382, 1568, 31776, + 31776, 3578, 31776, 31776, 809, 354, 354, 3586, 3586, 488, + 446, 24086, 809, 24086, 809, 3586, 3586, 3586, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 4083, 3584, 3589, 3591, + 3592, -144, 3574, -5341, -5341, -5341, -5341, -5341, -5341, 40, + 3933, -5341, 3757, 450, 23317, -5341, 3553, 4271, 4325, 4329, + -5341, -5341, -5341, -5341, 72804, 72804, 3579, -5341, -21, 3937, + 4243, 74286, 4247, -5341, 3598, 43043, 43043, -5341, 3599, -5341, + 23317, 3590, 3600, 3604, 97998, -5341, 4251, 234, 75768, 4197, + 72804, 618, 17934, 93552, 93552, -5341, 85401, 4252, 855, 3879, + -5341, 3606, 3610, -5341, 234, 17934, 3612, 1140, 400, -5341, + 3611, 3615, -5341, -5341, -5341, -5341, 23317, 3621, 93552, 93552, + -5341, -5341, -5341, -5341, 93552, -5341, -5341, -5341, -5341, -5341, + -5341, 2508, 23317, 93552, 1571, -5341, -5341, -5341, 1571, 93552, + 1571, -5341, 2508, 4258, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 1571, -5341, -5341, -5341, -5341, -5341, + 3790, 725, 3276, 3874, 3999, 2169, 46007, 1571, 1571, 23317, + -5341, -5341, -5341, -5341, 4150, 3575, 19472, 3632, 3631, -5341, + -5341,108132, 93552, 95775, 4363, -5341, -5341, 4171, 80955, 87624, + 46007, -5341, -5341, -5341, 2218, -5341, -5341, -5341, -5341, -5341, + 4197, 2385, 2422, -5341, 3635, 4197, -5341, -5341, 4322, -5341, + -5341, -5341, -5341, 2508, -5341, -5341, 4217, -5341, 46007, -5341, + -5341, 54235, 54235, 1763, -5341, 98739, -5341, 2508, 4197, 46007, + 1151, 230, -5341, 4376, -5341, -5341, 3756, -5341, -5341, -5341, + 3642, -5341, 4066, -5341, -5341, -5341, -5341, -5341, -5341, 3653, + -5341, 4309, -5341, 1597, 212, 93552, 90, 122, -5341, 93552, + 93552, 46007, -5341, 93552, 2583, -5341, -5341, 2583, 46007, 93552, + 93552, 2583, 23317, 42302, -5341, -5341, -5341, -5341, -5341, 42302, + -5341, 2966, -5341, 3861, 1812, 1812, -5341, -5341, -5341, -5341, + -5341, 4280, 3945, 3945, 42302, 4281, 4248, -5341, 93552, 6410, + 545, -5341, 51979, 93552, 4197, 23317, -5341, 3690, 4021, -5341, + 215, 783, 444, -5341, 3936, 230, -5341, -5341, 57243, 4009, + 57243, 57243, 95775, 3897, 23317, -5341, 4326, 3675, 4197, 1597, + 2508, -5341, 234, 234, 3895, 4187, 4188, 3800, 2508, 4190, + 4196, 4200, -5341, -5341, -5341, -5341, -5341, 3663, 1055, 315, + 1019, 69840, 4151, -21, 4266, 3692, -5341, 46007, 4345, -5341, + -5341, -5341, -5341, 23317,108132, -5341, -5341, -5341, 3710, 3712, + 3714, 3717, 3726, 3730, 3740, 3741, 3742, 3743, 3744, 3755, + 3758, 3760, 3763, 3765, 3766, 3770, 3775, 3779, 3785, 3788, + 3789, 3796, 3798, 157, -5341, -5341, 3750, -5341, -5341, -5341, + -5341, -5341, 1812, 93552, 4186, 58725, -5341, 3916, 4328, -5341, + -5341, 41561, -5341, 3732, 46007, -5341, 74286, 72804, -5341, -5341, + -5341, 3764, 1091,104577, -5341, -5341, 4502, 69840, 4207, -5341, + -5341, 3778, -5341, 3780, 4277, 4279, -5341, 95775,102444, -5341, + -5341, 4197, -5341, -5341, 3771, -5341, -5341, 3859, 3762, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3816, 4069, 4180, -5341, -5341, -5341, + 3160, -5341, -5341, -5341, -5341, -5341, -5341, 4423, 76509,105288, + 3792, -5341, -5341, -5341, -5341, 2165, -5341, -5341,111492,111492, + 111492, 4171, -5341,100962, 23317, -5341, 1872, -5341, 23317, -5341, + -5341, 23317, -5341, 4197, 3822,112223, 77250, -5341, 77250,112223, + 23317, -5341, 3799, -5341, 4427, 4430, -5341, -5341, -5341, 23317, + -5341, 23317, 23317, 1932, 23317, 23317, 23317, 23317, -5341, 23317, + -5341, 23317, 23317, -5341, 31776, -5341, 3797, 3807, -5341, -5341, + 3808, -5341, 23317, 23317, -5341, -5341, -5341, 23317, 23317, 23317, + -5341, -5341, 3810, -5341, -5341, -5341, -5341, 23317, 23317, 23317, + -5341, 23317, 3486, 23317, 3521, 23317, 4020, 23317, -5341, 27162, + -5341, 3811, -5341, -5341, 23317, 23317, -5341, 23317, 23317, 23317, + -5341, -5341, -5341, 23317, -5341, 4379, 23317, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, 23317, -5341, 302, 27931, -5341, + 23317, 23317, 23317, -5341, -5341, 23317, 3809, 3813, -5341, 93552, + 2435, 3843, 230, 3815, -5341, -5341, 3824, 3830, 2965, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 987, 31776, 827, 31776, + 1568, 3733, 16396, -5341, 1431, 1568, 3454, 3454, 93552, 4536, + 3826, -5341, 23317, 23317, 17165, 23317, 95775, 23317, 3828, 3836, + -5341, 3834, 31776, -5341, -5341, 3838, -5341, 2299, 3843, 3929, + 4283, -5341, 4197, 34852, 4338, -5341, 46007, 4340, 4387, 4045, + -5341, 72804, 69840, 4503, 4507, -5341, 4197, -5341, 3850, -5341, + -5341, -5341, 3851, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 402, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 23317, 72804, -5341, -5341, -5341, -5341, 234, -5341, 3860, 3862, + -5341, -5341, 29469, 2422, -5341, 4197, -5341, 234, 234, 17934, + -5341, 8887, -5341, -5341, 1021, 4138, 4410, -5341, -5341, 93552, + 1040, 93552, -5341, 50475, 50475, 88365, 4197, 143, -5341, -5341, + -5341, -5341, 4197, -5341, -5341, -5341, -5341, -5341, -5341, 3875, + -5341, -5341, -5341, 4613, -5341, -5341, 4258, -5341, 2531, 2169, + -5341, -5341, 4197, 38597, 564, -5341, -5341, -5341, 19472,105999, + -5341, 3866, 3869, 3873, -5341, 46007,106710, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3878, -5341, -5341, + 19472, 3885, -5341, 3999, -5341, 3764, 1412, 3890, 3872, -5341, + -5341, -5341, -5341, -5341, -5341, 233, 248, 1915, 2531, -5341, + -5341, 287, -5341, -5341, -5341, -5341, -5341, 878, -5341, -5341, + 3999, -5341, 1440, 2508, 3927, -5341, 230, 4118, -5341, -5341, + 1597, 1165, 1165, 4458, 212, 4331, -5341, 4151, 4540, 4464, + 4466, -5341, 3663, -5341, -5341, -5341, 93552, -5341, -5341, 1068, + -5341, 46007, 1947, 3572, 3572, -5341, 1812, 227, -5341, 31776, + 4620, -5341, 4384, 42302, 4514, 4516, -5341, 42302, -5341, -5341, + 2173, -5341, -5341, 72063, -5341, -5341, -5341, 4197, 195, 2178, + 23317, 93552, -5341, 3690, 3963, -5341, -5341, 783, -5341, -5341, + -5341, -5341, 57243, -5341, -5341, -5341, 1465, 3896, 2178, 1589, + 3899, -5341, -5341, 75768, 72063, -5341, 4269, 4272, 1659, -5341, + -5341, -5341, -5341, 234, 234, -5341, 311, 234, -5341, -5341, + 518, -5341, -5341, 1688, 337, 3663, -5341, 2508, 2508, 2508, + 2508, 230, 2508, 2508, 2190, -5341, 321, -5341, -5341, 80955, + -5341, 4651, 4652, -5341, 4653, -5341, -5341, 841, -5341, 2778, + 933, -5341, 961, -5341, 4446, 93552, 4635, 3692, -5341, 461, + 2132, 4197, -5341, 4404, 3910, 3912, 230, 3917, 230, 230, + 2508, 2508, 3875, 2508, 230, 2508, 2508, 2508, 2508, 2508, + 2508, 2508, 230, 2508, 1486, 3754, 414, 2508, 230, 5255, + -5341, -5341, -5341, -5341, 3908, 41561, 633, -5341, 56491, 4452, + 2531, 3932, -5341, -21, -5341, -5341, 434, 4572, -5341, 3923, + 23317, -5341, 113, 4120, 3938, 59466, 69840, 69840, -5341, 2594, + -5341, 46007, -5341, 4564, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 65394, -5341, -5341, 4241, 1782, 3931, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 3934, -5341, -5341, 23317, -5341, -5341, 3424, -5341, + -5341, -5341, -5341, -5341,107421, 3930, 4197, 23317, 4197, 4197, + 23317, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 3939, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3939, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 3940, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3947, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4626, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 4569, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 3939, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3939, -5341, 3939, + -5341, 4575, 3939, 3939, -5341, 3952, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 3953, 3954, 3955, 2965, -5341, 23317, 23317, 2491, 169, 169, + 23317, 2008, 2056, 838, -5341, 2493, 2509, 2572, 2311, 95775, + -5341, -5341, 2612, 2623, 2624, 2652, 2653, -5341, 2060, 3286, + 2096, 4197, 23317, 4197, 23317, 4197, 23317, 4197, 24086, 2753, + -5341, 2219, 4130, -5341, 2250, 4219, 2784, 2789, 2253, -5341, + 2805, 4706, 2264, 24086, 2796, 2831, 2102, 2158, 2835, 95775, + 93552, 3951, 3960, 3960, 194, -5341, 3958, -5341, -5341, -5341, + 3959, -5341, 23317, 23317, 3966, 3315, -5341, 23317, 1568, 31776, + 1025, 31776, -5341, -5341, 4083, -5341, 23317, -5341, 4538, 3967, + 4164, 3969, 3970, 3185, 3972, 3975, 3977, 3983, 4197, -5341, + -5341, 93552, 3985, 2082, -5341, 3875, -5341, 4598, -5341, 4701, + 3991, 4011, 3993, 3838, -5341, 72804, -5341, 46007, -5341, 4648, + 3466, -5341, 69840, 69840, -5341, 82437, -5341, 57984, 93552, 93552, + -5341, 4197, -5341, 17934, 618, 4747, 4750, -5341, -5341, -5341, + -5341, 72, 4550, -5341, -5341, -5341, -5341, 17934, 234, -5341, + 234, 17934, 3615, -5341, -5341, -5341, -5341, 4093, -5341, 725, + -5341, -5341, -5341, 1571, 4001, -5341, 234, 1344, -5341, 19472, + 4006, 4003, -5341, 4475, -5341, 987, 283, -5341, 3575, -5341, + 4016, 89106, -5341, 4018, -5341, -5341, 4558, -5341, -5341, 4649, + 54235, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 725, 4065, 4246, -5341, -5341, -5341, -5341, -5341, + 2174, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 46007, 4602, 69840, 933, 4393, 46007, 46007, 6731, 9105, + 3663, 4027, 93552, -5341, 3692, 4028, 481, 4028, -5341, -5341, + -5341, -5341, 2082, 1812, 1812, 3125, 4509, 42302, 42302, 3605, + 4510, 23317, 4031, -5341, 93552, -5341, 1083, -5341, 4434, -5341, + -5341, 23317, -5341, -5341, -5341, -5341, 4197, 4761, 4033, -5341, + -5341, -5341, -5341, -5341, -5341, 23317, -5341, 55739, 23317, 4037, + 4038, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 302, 302, + -5341, -5341, 302, 302, -5341, -5341, -5341, -5341, 302, 302, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 1055, -5341, 4788, 474, -5341, 4614, -5341, -5341, -5341, -5341, + 118, 230, 230, 230, 3754, 1727, -5341, 2778, 1685, 4375, + -5341, 6390, 1568, 1654, 4537, 1759, -5341, 2273, -5341, 4772, + -5341, 200, -5341, -5341,108132, 218, 238, -5341, 257, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 58725, 2531, -5341, 93552, + 4388, 4577, -5341, -5341, -5341, -5341, -5341, -5341, 987, -5341, + 4197, -5341, 4695, -5341, -5341, -5341, -5341, 122, 122, -5341, + 108132, -5341, -5341, 283, -5341, -5341, 4564, 4327, -5341, 1384, + -5341, 3939, 3939, 48, -5341, 3940, 4607, 3940, -5341, -5341, + 4443, 3148, 2220, 4443, -5341, 2220, 3940, -5341, 4058, -5341, + 4443, -5341, 2220, 3939, -5341, 3939, -5341, -5341, 2220, 3939, + -5341, 4059, 3940, 4443, 1355, 2330, 3940, -5341, 3939, 1499, + 3939, 3939, 3939, 4260, 3939, 3939, -5341, 3940, -5341, -5341, + -5341, -5341, -5341, -5341, 138, 3939, 3939, 3939, 3939, 3947, + 4712, 4715, -5341, 93552, -5341, 4197, -5341, -5341,111492, 93552, + 838, 4197, 3090, -5341, -5341, -5341, 604, 3246, -5341, -5341, + -5341, 4814, -5341, -5341, 3939, -5341, 604, -5341, -5341, -5341, + -5341, -5341, -5341, 604, -5341, -5341, -5341, -5341, 4070, 3454, + 3454, -5341, 4780, 4590, 4683, 2856, 23317, 23317, -5341, 23317, + -5341, -5341, -5341, 1350, 4073, 4541, -5341, -5341, -5341, -5341, + -5341, -5341, 23317, 23317, 23317, 4197, 4197, 4197, 3454, -5341, + -5341, 4057, -5341, -5341,112223, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 414, 3454, -5341, -5341, 23317, 23317, -5341, -5341, + -5341, 93552, 3843, 4077, 4348, -5341, -5341, -5341, 3843, 4215, + -5341, -5341, 3843, 230, -5341, -5341, -5341, 2280, 3315, -5341, + 23317, 1568, 4655, 4078, 4799, 4085, -5341, -5341, -5341, -5341, + -5341, -5341, 23317, 82437, -5341, 4086, 4089, -5341, -5341, -5341, + 4521, 23317, 4705, 4658, -5341, 3843, 93552, -5341, -5341, -5341, + 69840, 3598, 3598, 89847, -5341, -5341, -5341, -5341, 680, 234, + 234, 17934, -5341, -5341, 4096, 4099, 17934, 17934, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 725, -5341, 38597, 2531, 22548, -5341, -5341, -5341, 19472, + -5341, 4104, 38597, 4563, -5341, -5341, -5341, 4452, 189, -5341, + -5341, 90588, -5341, 4110, -5341, 4090, -5341, 1809, 4440, 4718, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 4113, -5341, -5341, -5341, + 4131, -5341, 4115, -5341, 46007, -5341, -5341, 4139, -5341, -5341, + 39338, 4728, 4157, 4482, 46007, 234, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 4483, 234, 234, 234, 234, + 234, 234, 234, 234, 234, 234, 1653, 93552, 234, 234, + -5341, -5341, 4685, -5341, 6520, -5341, -5341, -5341, -5341, -5341, + 234, -5341, -5341, -5341, 847, 4704, 4851, 4132, 4270, -5341, + -5341, -5341, -5341, 4237, 4273, 3692, 2468, -5341, -5341, -5341, + 4616, -5341, -5341, -5341, 4617, 4197, 93552, -5341, -5341, -5341, + 1163, 2066, 4748, 2178, 4142, 93552, 2178, 783, 444, 4197, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 551, -5341, 80955, -5341, -5341, -5341, -5341, + -5341, 4887, 4892, -5341, -5341, -5341, -5341, 4330, 632, 4372, + 1370, 4709, 4544, 4713, 2053, 3582, 234, 4716, 4867, -5341, + 459, 234, 4717, 4776, 4235, 4782, 4725, -5341, 4239, 4544, + 4729, 4355, 4731, 4733, 4735, -5341, -5341, 9105, -5341, -5341, + -5341, -5341, 420, 43784, -5341, -5341, -5341, -5341, -5341, 4350, + 23317, 23317, 4752, 93552, 4753, -5341, 4571, -5341, 93552, -5341, + 987, -5341, -5341, -5341, 4476, -5341, 2281, -5341, -5341, 2339, + -5341, -5341, 2374, -5341, -5341, 3732, -5341, 4834, -5341, 4524, + 3229, -5341, -5341, 133, 4383, 4660, 4660, -5341, -5341, -5341, + 4765, -5341, -5341, -5341, -5341, 4815, -5341, 4443, 234, 4443, + -5341, -5341, 158, -5341, 158, -5341, 217, 3458, 77991, 4443, + -5341, -5341, -5341, -5341, 4662, 2220, 604, 77250, 1629, 4584, + -5341, -5341, -5341, 158, 3364, -5341, -5341, 4443, -5341, -5341, + -5341, 3364, 158, -5341, 4668, -5341, -5341, -5341, 158, 4443, + 4405, 93552, 4884, 2220, -5341, -5341,101703, 2220, 158, 4884, + 4749, -5341, 604, 4930, 2220, 4443, 158, 158, -5341, 197, + 4209, -5341,111492, -5341, -5341, 4213, 4214, 4218, 4220, -5341, + -5341, 2383, 4221, -5341, -5341, -5341, -5341, 4222, 4225, 23317, + 3364, 4683, 57243, 4226, -5341, -5341, 2857, 2162, 2432, 4491, + 4448, -5341, 4382, -5341, 2879, 4197, 4197, 1769, 3940, -5341, + -5341, -5341, -5341, 4846, 3939, -5341, 4936, -5341, 3939, 604, + -5341, -5341, -5341, -5341, -5341, 4232, 2442, 1776, 2880, 2881, + -5341, -5341, -5341, 4234, -5341, -5341, 418, -5341, 4227, -5341, + 2445, 4950, 2110, 23317, -5341, 4240, -5341, -5341, 93552, -5341, + -5341, 3454, 1118, -5341, 2449, -5341, -5341, -5341, 4244, 3598, + -5341, -5341, 60207, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 17934, 17934, 3999, -5341, 4005, 2422, -5341, -5341, -5341, -5341, + 4611, 4245, 4249, -5341, -5341, -5341, 4236, 133, 38597, -5341, + -5341, -5341, 4253, 4250, -5341, -5341, -5341, 89106, -5341, 2462, + -5341, -5341, 4971, 19472, 2508, 2628, 4256, -5341, 80955, 4257, + 4259, 46748, 1625, 93552, 2484, -5341, -5341, -5341, -5341, -5341, + 1463, -5341, 484, 2583, 2218, 2218, -5341, 4255, 46007, -5341, + 234, -5341, 273, 275, 294, 335, -5341, 3875, 230, 230, + 2508, 2508, 234, 230, 80955, 1708, 230, 3875, 3875, 387, + 2508, 2329, 273, -5341, -5341, -5341, 230, 273, 265, -5341, + -5341, 4495, -5341, 9105, 69099, 78732, 3783, -5341, -5341, 1592, + 4373, -5341, 4267, 78732, -5341, 2508, -5341, 4984, 5008, -5341, + -5341, 4670, 23317, 4261, 23317, 4274, 2502, -5341, 2218, -5341, + 2218, -5341, 1163, 4985, 4986, 4932, 4987, 2066, -5341, 2240, + -5341, -5341, -5341, -5341, -5341, -5341, 783, -5341, -5341, 4276, + -5341, -5341, -5341, -5341, 4612, -5341, 5030, -5341, 4730, 44525, + 2583, -5341, 1739, 4321, -5341, -5341, -5341, 4924, 2813, 2813, + 326, 2813, 90588, 93552, 46007, 545, 443, 4907, 2226, 1869, + 4332, 4845, 2813, 2813, 91329, 326, 38597, -5341, -5341, -5341, + 2813, -5341, 2813, 46007, 92070, 326, -5341, -5341, -5341, 93552, + -5341, 2813, 326, -5341, 326, 326, 90588, -5341, 10320, -5341, + -5341, 39338, 1406, -5341, 4197, 3454, 4682, -5341, -5341, 4406, + 2508, 4656, -5341, -5341, 4762, -5341, 93552, 226, -5341, 230, + -5341, 230, -5341, 230, -5341, 31776, -5341, 3599, -5341, -5341, + 2065, -5341, -5341, 4657, 4452, 4802, -5341, -5341, 93552, -5341, + 4763, 4789, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 79473, 234, -5341, -5341, 2516, -5341, + -5341, 2523, -5341, -5341, -5341, -5341,101703, -5341, 2542, -5341, + 66876, 23317, -5341, -5341, -5341, 4884, 4298, -5341, -5341, -5341, + 4323, -5341, -5341, -5341, -5341, -5341, 4930, -5341, -5341, 62430, + -5341, -5341, -5341, 78732, 4960, -5341, -5341, -5341, -5341, -5341, + 5059, -5341, -5341, 4308, 2178, -5341, 4311, -5341, -5341, -5341, + -5341, 23317, -5341, 4543, -5341, 4650, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 3875, -5341, -5341, -5341, + 4313, -5341, 230, -5341, 23317, -5341, -5341, 4314, 3419, 2178, + -5341, -5341, 4411, 4283, 4318, -5341, 4658, 93552, -5341, -5341, + 17934, 17934, -5341, -5341, -5341, 4328, -5341, -5341, -5341, 38597, + 60948, 4319, 4316, -5341, 234, -5341, -5341, 93552, -5341, -5341, + 3875, 4681, -5341, 2553, -5341, -5341, 93552, 4324, 4518, 93552, + 93552, -5341, -5341, 4333, 93552, -5341, -5341, -5341, 39338, 4334, + 4942, 4944, 2218, -5341, 2583, 4869, 46748, -5341, 2583, 2583, + 64653, 93552, 4335, 2508, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 4339, -5341, -5341, -5341, -5341, -5341, 2508, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 5053, -5341, 4685, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 4341, 4337, 93552, -5341, 66135, -5341, -5341, -5341, -5341, 5002, + 108132, -5341, -5341, -5341, 4905, 1654, -5341, -5341, 4342, -5341, + -5341, 66876, -5341, -5341, -5341, -5341, 4344, 4346, 4197, 93552, + 4197, 93552, -5341, 4982, 4982, -5341, 3364, 3364, 5049, 3364, + -5341, 5055, 5060, 2240, -5341, -5341, 5097, 632, 4719, 1685, + 1568, 326, 1568, 5000, -5341, -5341, 93552, 46748, 90588, 46748, + -5341, 4842, -5341, 72063, 46748, 2813, 93552, -5341, 5004, -5341, + 4972, 46748, 46748, -5341, -5341, 90588, 4351, -5341, 2178, 2512, + 93552, 46748, -5341, -5341, -5341, 3843, 4822, 46748, 90588, -5341, + 90588, -5341, 4634, 4850, 3331, -5341, 4358, 4357, 93552, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 846, -5341, -5341, 2574, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 1346, 4557, + -5341, 2065, -5341, -5341, -5341, 46007, -5341, -5341, -5341, -5341, + -5341, -5341, 604, 3364, 604, 4884, -5341, 93552, -5341, 4197, + -5341, 93552, 5113, -5341, -5341, -5341, -5341, 47489, -5341, -5341, + -5341, 4684, -5341, 2581, -5341, 4367, 23317, -5341, -5341, 2892, + -5341, -5341, 4368, -5341, 4369, 3896, -5341, 3557, 4501, 4271, + 4325, 4329, 4551, 4720, -5341, 4555, -5341, 4193, 4521, 4378, + 31776, -5341, -5341, 1600, -5341, -5341, -5341, -5341, 95775, -5341, + -5341, 4374, -5341, 38597, 19472, -5341, -5341, 4795, -5341, 2597, + 2178, 4385, 93552, 4386, 2603, 2617, 93552, 4389, -5341, 23317, + 2583, -5341, -5341, 46748, 46007, -5341, 4868, 708, 46748, 46748, + 4392, 1381, 4394, 4396, 2550, 1663, 4397, 4059, 1687, 58, + 1355, 462, 1765, 4399, 1785, 4400, 1801, 1831, 1840, 1862, + 1864, 4409, 5094, -5341, -5341, 4412, 4415, 4416, 4418, 4419, + 4420, 4421, 4422, 4424, -5341, -5341, 46007, -5341, -5341, 189, + 265, -5341, 78732, -5341, 1714, 4593, -5341, -5341, 5164, -5341, + 4752, 78732, 3783, -5341, -5341, -5341, -5341, 99480, 6991, 2648, + 2649, 2241, -5341, -5341, -5341, -5341, 3364, -5341, 3364, 3364, + -5341, 4413, -5341, -5341, -5341, 5052, -5341, 5054, -5341, 2071, + 1501, -5341, 46748, 338, 4899, 4886, 5122, -5341, 46748, 4250, + 93552, -5341, -5341, 434, -5341, 38597, -5341, -5341, 4910, 4911, + -5341, 4929, 1406, -5341, 93552, -5341, -5341, -5341, 4527, -5341, + 108132, 4630, 5143, 5144, -5341, 93552, 92811, 31776, -5341, -5341, + 5058, -5341, 3575, -5341, -5341, -5341, -5341, -5341, 4439, -5341, + 62430, -5341, -5341, -5341, -5341, -5341, 2178, -5341, -5341, -5341, + 151, -5341, 5171, 1546, -5341, -5341, 253, -5341, -5341, -5341, + -5341, 93552, 4447, 4533, -5341, -5341, 4519, -5341, -5341, 2945, + -5341, 137, 61689, -5341, -5341, -5341, -21, 93552, -5341, 5201, + 4450, 1055, -21, -21, 4451, 93552, 2893, 46748, 4868, 1289, + 4459, 1165, -5341, 1165, -5341, -5341, 3008, 66876, -5341, -5341, + 3325, 93552, 4460, 5221, -5341, -5341, 4665, -5341, 93552, -5341, + -5341, -5341, 1759, -5341, -5341,109554, 5024, 2655, -5341, -5341, + -5341, -5341, -5341, 5178, -5341, 5179, 4467, 4468, -5341, -5341, + -5341, -5341, 46748, -98, -5341, -5341, 5101, -5341, 5149, 5151, + 1406, -5341, 46007, 5036, 75768, -5341, -5341, -5341, 326, -5341, + 93552, 46748, 46007, -5341, -5341, 4250, 878, 23317, 4826, 5164, + -5341, 4671, 4672, -5341, -5341, 2676, -5341, -5341, 2082, 4961, + -5341, 93552, -5341, -5341, -5341, 3557, -5341, -5341, 4609, 360, + -5341, 2679, -5341, -5341, -5341, 3843, -5341, 4481, -5341, 4843, + 234, 234, 4844, 234, 234, 234, 234, 4484, 2945, -5341, + -5341, -5341, 4835, -5341, -5341, -5341, 2752, 2178, 4487, 93552, + 4489, 2687, 1675, 2791, 93552, 4488, -5341, -5341, -5341, 1165, + 93552, 5091, -5341, 4493, -5341, 4494, 4496, -5341, -5341, 5114, + 2508, -5341, 4576, -5341, -5341, 3008, -5341, -5341, -5341, 4539, + 5119, 5080, -5341, 80955, 34083, -5341, 4988, -5341, 4943, 5184, + -5341, 5234, 3793, -5341, -5341, -5341, -5341, -5341, -5341, 93552, + 4508, 46007, 4571, 5164, 2468, -5341, 99480, 9273, -5341, -5341, + 89106, 89106, 5094, 3843, 4658, -5341, -5341, -5341, 34083, -5341, + -5341, 4658, -5341, -5341, -5341, -5341, -5341, 5134, -5341, 4197, + 23317, -5341, -5341, -5341, -5341, -5341, 92811, -5341, 545, -5341, + -5341, -5341, -5341, -5341, -5341, 93552, -5341, 4511, -5341, -5341, + 188, 234, 2508, 2508, 234, 3920, 3920, 3843, 80955, 4603, + -5341, -5341, 234, 1165, 2508, 234, 1165, -5341, -5341, 1256, + 2752, -5341, -5341, -5341, -5341, -5341, -5341, 1612, -21, -5341, + 4714, 1256, 1675, -5341, -5341, 1256, 2791, -5341, -5341, 4522, + 93552, 4526, 4530, -5341, 2691, -5341, 1088, 5108, 93552, 4535, + 93552, 93552, -5341, -5341, -5341, -5341, -5341, -5341, 4891, -5341, + 4542, 4545, 3754, 3754, 16396, -5341, -5341, -5341, -5341, -5341, + -5341, 5120, -5341, 4582, 849, 234, -5341, 3964, 4525, 93552, + 5193, 4904, -5341, -5341, -5341, 5121, -5341, -5341, -5341, -5341, + -5341, 2000, 4547, 2706, -5341, -5341, 2733, -5341, -5341, -5341, + -5341, 4552, 4197, -5341, 38597, -5341, 4533, -5341, -5341, 2750, + -5341, 28700, -5341, -5341, -5341, 2508, -5341, -5341, 2508, -5341, + -5341, -5341, -5341, -5341, 2762, -5341, 80955, -5341, -5341, 230, + -5341, -5341, 5157, 4994, -5341, 4754, 2752, 2650, -5341, -5341, + -5341, -5341, -5341, 4554, 93552, 93552, 4556, -5341, 93552, -5341, + -5341, -5341, 1363, -5341, 2790, 93552, 2815, 2820, -5341, -5341, + -5341, -5341, 4561, 4565, -5341, 24, -5341, -5341, 3964, 93552, + 4559, -5341, -5341, 4670, -5341, 5130, 2468, -5341, -5341, -5341, + 4658, 4568, -5341, 234, 5086, -5341, -5341, 4511, -5341, 4570, + -5341, 2082, -5341, -5341, 80955, -5341, 4603, -5341, -5341, -5341, + -5341, -5341, -5341, 1256, -5341, -5341, 2825, 4450, 93552, -5341, + 600, 600, 2752, 2828, 1675, 2791, -5341, 308, -5341, 1644, + 1644, 1326, -5341, 93552, -5341, -5341, -5341, 2468, 346, 2837, + 38597, 19472, 4873, 4434, -5341, 28700, 4586, 4177, -5341, -5341, + -5341, 4869, 4587, 4450, -5341, -5341, 1599, 5023, 5154, 5159, + -5341, 2752, -5341, -5341, -5341, 4588, -5341, 1644, -5341, -5341, + -5341, -5341, -5341, 1758, -5341, 5252, -5341, 3673, -5341, -5341, + -5341, 5166, 346, 346, -5341, -5341, -5341, 5305, 4748, -5341, + -5341, -5341, 4177, -5341, -5341, 2752, 4591, -5341, -5341, -5341, + 5078, 5274, -5341, -5341, -5341, -5341, 1758, -5341, 4732, -5341, + -5341, -5341, -5341, -5341, -5341, 391, 5174, -5341, 5176, -5341, + 3364, 5237, -5341, -5341, 2752, 600, 600, -5341, -5341, -5341, + -5341, 5266, 4951, -5341, 5354, 4606, -5341, -5341, -5341, 1413, + 421, 35604, 5129, -5341, -5341, 80955, -5341, -5341, -5341, -5341, + 80955, -5341, 2848, -5341, -5341, 38597, -5341, -5341,108132, -5341, + -5341, 36356, 4608, -5341, 234, -5341, 5164, -5341, 38597, -5341, + -5341, -5341, 19472, -5341, -5341 +}; + +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int16 yydefact[] = +{ + 0, 3619, 2, 1016, 2294, 0, 430, 0, 1243, 612, + 2139, 2288, 2287, 2060, 470, 220, 376, 2062, 2361, 0, + 0, 466, 1259, 754, 496, 0, 320, 0, 0, 473, + 318, 220, 1308, 3262, 2188, 0, 3368, 2126, 0, 1306, + 468, 2459, 2065, 0, 3524, 0, 0, 0, 3529, 72, + 2032, 0, 1259, 342, 3370, 85, 0, 0, 1259, 2345, + 3529, 0, 2373, 0, 0, 2168, 0, 0, 0, 0, + 3, 3621, 22, 0, 45, 27, 33, 17, 21, 16, + 47, 60, 53, 30, 3709, 3710, 3712, 43, 3560, 42, + 11, 63, 64, 19, 50, 12, 15, 18, 41, 49, + 37, 44, 57, 58, 1329, 1305, 1333, 1304, 1300, 1296, + 1315, 1316, 1317, 1323, 25, 26, 34, 51, 68, 23, + 65, 61, 24, 2294, 13, 28, 29, 14, 52, 46, + 38, 62, 69, 39, 0, 59, 40, 67, 32, 54, + 31, 9, 10, 20, 55, 56, 48, 70, 35, 66, + 36, 8, 2048, 168, 3526, 3711, 1060, 0, 0, 0, + 0, 2058, 0, 2058, 1151, 1374, 3558, 3559, 3560, 1260, + 0, 1261, 0, 0, 2501, 2502, 2744, 2759, 2807, 2559, + 2851, 2861, 2878, 2885, 3020, 2712, 2757, 2758, 2558, 2787, + 2620, 2879, 2902, 2930, 3015, 2697, 2696, 2698, 3001, 2699, + 2700, 2701, 2702, 2703, 3002, 2595, 2704, 2705, 2706, 2708, + 2707, 2709, 2710, 3003, 2596, 3630, 2597, 2669, 2711, 2671, + 2670, 2713, 2598, 2599, 2714, 2715, 2716, 2718, 2717, 2650, + 2601, 2600, 2719, 2721, 2720, 2672, 2673, 2653, 2722, 3004, + 2723, 2725, 2602, 2999, 2603, 2604, 2605, 2724, 2606, 2726, + 2654, 2727, 2728, 2607, 2729, 2730, 2731, 2732, 2734, 2733, + 2647, 2735, 2736, 2738, 2739, 2740, 2737, 2741, 2742, 2745, + 2743, 2675, 2674, 3005, 2608, 2746, 2747, 2748, 2749, 2751, + 2752, 2750, 2753, 2655, 2754, 2755, 2756, 2764, 3631, 2765, + 2767, 2766, 2676, 2768, 2769, 2770, 2772, 2771, 2773, 2775, + 2609, 2610, 2611, 2774, 2776, 2760, 2761, 2762, 2763, 2778, + 2777, 2779, 2780, 2781, 2677, 2612, 2651, 2613, 2998, 2782, + 2783, 2556, 2784, 2785, 3006, 2614, 2666, 2786, 2656, 2789, + 2788, 2615, 2790, 2616, 2791, 3007, 3008, 2792, 2793, 2795, + 2797, 2794, 2798, 2799, 2805, 2617, 2796, 2800, 2801, 2802, + 2803, 2804, 2806, 2678, 2808, 2648, 2809, 3009, 3010, 2810, + 2811, 2812, 2813, 2667, 2814, 2815, 2816, 2817, 2830, 2831, + 2821, 2822, 2824, 2825, 2828, 2823, 2829, 2834, 2833, 2835, + 2836, 2837, 2838, 2839, 2832, 2819, 2826, 2827, 2820, 2840, + 2841, 2818, 2842, 2844, 2843, 2845, 2679, 2846, 2847, 2848, + 2849, 2850, 3011, 2852, 2853, 2855, 2854, 2856, 3012, 2857, + 2858, 2859, 2663, 2860, 2680, 2681, 2862, 2863, 3013, 2864, + 2865, 2870, 2871, 2872, 2649, 2867, 2866, 2868, 2869, 2682, + 2683, 2684, 2873, 2874, 2875, 2877, 2876, 2657, 2619, 2618, + 3014, 2621, 2880, 2881, 2622, 2882, 2884, 2883, 2665, 2623, + 2886, 2887, 2889, 2888, 2624, 2652, 2625, 2626, 2890, 2891, + 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, + 2685, 2686, 2903, 2904, 2905, 2907, 2906, 2908, 2909, 2913, + 2910, 2911, 2912, 2914, 2627, 2915, 2658, 2916, 2917, 2918, + 2628, 2920, 2919, 2629, 2921, 2922, 2923, 2924, 2925, 2664, + 2659, 2926, 2927, 2929, 2687, 2928, 2931, 2932, 2660, 2933, + 2934, 3016, 2630, 2935, 2936, 2688, 2668, 2631, 3017, 2938, + 2661, 2695, 2937, 2939, 2633, 2634, 2940, 2941, 2942, 2632, + 2943, 2635, 3018, 2944, 2946, 2945, 2947, 2948, 2949, 2950, + 2636, 2951, 2952, 2637, 2953, 2638, 2954, 2955, 3019, 2956, + 2958, 2957, 2959, 2960, 2961, 2962, 2963, 2964, 2966, 2968, + 2967, 2965, 2969, 2970, 2689, 2971, 2639, 2690, 3022, 3023, + 2691, 2972, 2973, 2974, 2975, 3021, 2662, 2976, 2977, 2642, + 2978, 2979, 2981, 2980, 2640, 2641, 2982, 2983, 2646, 3024, + 2984, 3025, 2692, 2693, 2985, 2986, 2996, 2987, 2989, 2988, + 2991, 2990, 2997, 3026, 2557, 2643, 2992, 2993, 2644, 2994, + 2645, 2995, 2694, 2506, 2522, 244, 2523, 2553, 2551, 2555, + 2549, 2554, 2547, 2548, 3000, 2594, 2552, 2550, 400, 131, + 0, 0, 2163, 2058, 2036, 2058, 2058, 2058, 2058, 2058, + 2058, 2061, 2058, 2058, 0, 0, 0, 400, 2068, 2363, + 0, 2383, 2384, 2378, 3358, 3359, 3353, 378, 0, 0, + 0, 2261, 2260, 0, 0, 305, 317, 320, 313, 316, + 0, 220, 2058, 378, 319, 320, 0, 1338, 0, 2266, + 320, 0, 2137, 2377, 0, 400, 2460, 2457, 2068, 2334, + 2336, 0, 2332, 1446, 1445, 0, 3529, 0, 2512, 1238, + 1270, 1195, 3530, 3531, 0, 77, 80, 2300, 343, 0, + 0, 0, 610, 0, 0, 1203, 0, 3531, 3541, 2375, + 0, 131, 1176, 0, 131, 2171, 2058, 2058, 3602, 3603, + 0, 0, 0, 3597, 0, 3604, 0, 1333, 0, 1319, + 1, 5, 0, 0, 610, 970, 610, 971, 0, 610, + 610, 0, 0, 0, 0, 3565, 3558, 3559, 3560, 0, + 2018, 1873, 1334, 1333, 1965, 1969, 3546, 3546, 3546, 0, + 0, 1965, 1324, 2762, 2998, 2884, 0, 2279, 2293, 2277, + 2495, 1302, 1298, 2606, 1019, 1061, 1024, 228, 0, 0, + 1026, 0, 1037, 2528, 2527, 2526, 1034, 220, 0, 1153, + 0, 0, 0, 3566, 3565, 0, 1215, 2281, 2282, 2283, + 2284, 2285, 2286, 2289, 0, 250, 400, 432, 0, 443, + 434, 437, 0, 132, 133, 1241, 1244, 0, 613, 2167, + 2166, 0, 2165, 2140, 0, 2163, 0, 2056, 0, 0, + 0, 0, 220, 0, 220, 2041, 2058, 2058, 471, 3652, + 0, 3418, 3436, 3437, 1387, 3433, 3438, 0, 3435, 3430, + 0, 0, 3432, 3429, 0, 0, 3457, 3431, 3434, 2597, + 2730, 2771, 2611, 2779, 2780, 2894, 2898, 2903, 2914, 2918, + 2661, 2633, 2959, 3411, 3399, 3413, 3412, 0, 0, 3416, + 3421, 0, 3420, 0, 0, 2070, 2364, 2365, 2369, 0, + 2387, 0, 391, 0, 0, 3638, 0, 0, 380, 381, + 3637, 3715, 0, 385, 3636, 0, 378, 3702, 0, 400, + 3696, 3704, 3703, 3705, 3706, 3707, 3708, 411, 0, 412, + 413, 467, 3699, 2524, 0, 3633, 3635, 3632, 3634, 2525, + 3658, 0, 0, 3701, 0, 3700, 3697, 3698, 1257, 1678, + 0, 2434, 2503, 2504, 0, 2447, 2452, 2453, 2445, 2446, + 2450, 2426, 2449, 2425, 2451, 1448, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1387, 1387, 1387, 1384, + 0, 0, 0, 0, 0, 0, 2443, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1384, 0, 0, 2442, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3020, + 2444, 1387, 1384, 1384, 0, 0, 3015, 0, 0, 0, + 3001, 2595, 3003, 2650, 2602, 2603, 2604, 2605, 2647, 2674, + 3005, 3006, 3007, 3009, 3010, 3011, 3012, 2863, 3013, 3014, + 2665, 2892, 2687, 3016, 3017, 3019, 2690, 3022, 3023, 2691, + 3021, 2662, 3024, 3025, 3026, 2643, 2694, 0, 0, 0, + 0, 1447, 0, 0, 1331, 1523, 755, 1393, 1405, 1421, + 0, 1521, 1520, 1524, 1526, 1532, 1440, 1553, 1492, 1493, + 1495, 1494, 1499, 1500, 0, 1654, 1501, 0, 0, 1498, + 2439, 1497, 1496, 2440, 2441, 1491, 2481, 2511, 0, 0, + 2505, 3000, 2594, 498, 497, 0, 339, 332, 327, 335, + 329, 331, 330, 336, 337, 338, 333, 328, 334, 321, + 0, 306, 0, 314, 3542, 0, 1262, 378, 474, 340, + 3418, 2698, 2898, 3391, 0, 3398, 0, 3557, 3551, 3554, + 3553, 3549, 3552, 3550, 3555, 1359, 3556, 1358, 1309, 1339, + 1356, 1357, 0, 0, 0, 2584, 2583, 890, 2581, 3283, + 3284, 0, 2585, 0, 0, 3285, 2951, 2972, 2582, 0, + 2517, 0, 2518, 2578, 2576, 2580, 2579, 2573, 2574, 2577, + 3263, 3268, 3264, 2575, 0, 2294, 0, 0, 2274, 968, + 967, 0, 0, 0, 0, 2210, 0, 890, 2274, 2211, + 0, 1930, 2264, 2267, 0, 3287, 2224, 969, 3288, 2260, + 0, 2196, 2212, 2173, 2217, 131, 3289, 131, 2263, 1930, + 2274, 0, 2189, 0, 0, 0, 2294, 1373, 0, 315, + 3369, 2138, 1149, 2106, 1307, 2092, 0, 469, 0, 2073, + 0, 2333, 3717, 3525, 0, 0, 0, 0, 3534, 1720, + 2033, 0, 81, 76, 0, 0, 0, 0, 2500, 3371, + 86, 0, 0, 3616, 74, 0, 2351, 0, 2349, 2346, + 2348, 0, 3534, 0, 2374, 1183, 1183, 0, 0, 1175, + 1177, 1178, 1183, 1183, 2172, 0, 0, 0, 2433, 2431, + 2432, 2513, 3599, 2430, 2429, 3608, 3610, 3593, 0, 3596, + 3595, 3605, 1322, 1321, 6, 71, 0, 142, 610, 220, + 220, 610, 167, 148, 151, 610, 610, 610, 160, 162, + 0, 222, 0, 0, 3565, 1337, 2807, 0, 0, 1349, + 1335, 1768, 1336, 1800, 1770, 1740, 1731, 1730, 1796, 1797, + 1799, 1798, 1801, 1803, 1793, 0, 0, 2031, 0, 2026, + 1874, 1879, 1873, 0, 0, 0, 0, 0, 0, 1964, + 1930, 1973, 1935, 1966, 1301, 1962, 0, 1297, 1362, 1362, + 3548, 3547, 3545, 3544, 3543, 1967, 1320, 1328, 1326, 1327, + 1968, 1318, 0, 2291, 2497, 0, 0, 2296, 0, 1965, + 1969, 2097, 2096, 2099, 0, 904, 0, 229, 0, 3563, + 3564, 3562, 1387, 2529, 2532, 3561, 2533, 229, 2059, 0, + 0, 0, 2058, 1157, 1158, 1152, 1154, 1156, 0, 0, + 0, 0, 2295, 0, 246, 252, 245, 441, 0, 401, + 378, 0, 438, 87, 0, 1245, 2049, 2051, 0, 2141, + 0, 1347, 1873, 2143, 2148, 2157, 2161, 2164, 2038, 0, + 0, 3680, 2044, 2043, 3679, 0, 2045, 0, 0, 2046, + 2034, 0, 447, 449, 3419, 3417, 3454, 3453, 3458, 0, + 3455, 3451, 0, 3410, 3459, 3444, 3448, 0, 3460, 3445, + 3452, 3466, 3465, 3467, 3462, 3461, 0, 3464, 3450, 0, + 3449, 3470, 0, 3414, 0, 0, 423, 0, 2075, 2076, + 2072, 1149, 2071, 2370, 0, 2362, 0, 1280, 2389, 2388, + 2385, 1865, 3355, 3360, 400, 392, 0, 0, 2863, 0, + 399, 398, 397, 3620, 420, 400, 386, 409, 0, 0, + 3622, 379, 382, 418, 421, 3657, 460, 456, 464, 458, + 3713, 274, 0, 0, 2503, 2504, 2436, 2435, 2505, 2427, + 2448, 0, 0, 0, 1527, 1871, 1871, 1871, 0, 0, + 1728, 0, 0, 0, 0, 1871, 0, 1565, 1539, 1538, + 0, 1566, 0, 0, 0, 0, 0, 0, 0, 1684, + 1684, 1650, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1722, 1724, 2481, 1871, 0, 1871, 0, 1392, + 1571, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1871, 1871, 1871, 0, 1582, 1584, 1583, 1871, + 1871, 0, 0, 0, 0, 0, 0, 1871, 0, 0, + 0, 0, 0, 1718, 2454, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1718, 0, 0, 0, 0, + 0, 0, 2456, 0, 0, 0, 2455, 0, 0, 0, + 0, 0, 0, 1718, 0, 0, 1529, 0, 1528, 1530, + 0, 1331, 756, 0, 0, 0, 1444, 1442, 1443, 1441, + 0, 0, 0, 0, 1450, 1452, 1454, 0, 1449, 1451, + 1453, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1531, 0, 0, 0, 0, 0, 2428, 0, 1603, + 0, 510, 2359, 0, 0, 0, 304, 1264, 2534, 0, + 0, 400, 3417, 0, 0, 0, 3414, 1374, 1355, 3290, + 0, 889, 0, 0, 892, 894, 893, 3322, 0, 891, + 3331, 3329, 3327, 3326, 0, 0, 3270, 3272, 0, 898, + 900, 899, 3320, 897, 0, 3306, 0, 0, 0, 0, + 0, 610, 0, 0, 0, 0, 0, 0, 0, 0, + 2241, 0, 1373, 1373, 2190, 0, 2274, 0, 2274, 2264, + 0, 2274, 2270, 2230, 2223, 0, 0, 667, 1947, 1931, + 2216, 2268, 2269, 2274, 0, 0, 2274, 0, 2231, 2264, + 2274, 2185, 0, 0, 2177, 2182, 2178, 0, 2184, 2183, + 2186, 2174, 2175, 0, 2203, 0, 2215, 2222, 0, 2202, + 2209, 0, 2220, 2264, 2264, 0, 2274, 2274, 2274, 1150, + 0, 1374, 0, 3654, 2458, 2461, 2467, 2473, 2077, 2074, + 2335, 3620, 0, 0, 1272, 1274, 1273, 1290, 1197, 3533, + 0, 3535, 0, 3537, 0, 78, 0, 0, 2327, 2325, + 0, 0, 0, 2319, 2321, 2324, 2320, 0, 0, 2326, + 131, 0, 2322, 2328, 2301, 2304, 2311, 1373, 2302, 0, + 0, 341, 344, 346, 0, 349, 1865, 3374, 3373, 0, + 0, 0, 1201, 1204, 0, 2356, 2353, 131, 0, 2660, + 3540, 3538, 0, 1171, 1187, 134, 1181, 1182, 0, 0, + 1174, 134, 3355, 3617, 3618, 0, 0, 3594, 3611, 3592, + 0, 3606, 3607, 3591, 7, 4, 154, 0, 145, 0, + 0, 0, 610, 610, 137, 0, 3681, 1374, 1374, 610, + 610, 610, 0, 1765, 0, 1731, 1796, 1797, 1799, 0, + 1798, 0, 0, 1865, 0, 0, 1788, 1813, 0, 1813, + 1790, 1791, 0, 0, 0, 1349, 1794, 2514, 2027, 2030, + 0, 2019, 2021, 2022, 2526, 2024, 0, 0, 1876, 1879, + 1941, 1942, 0, 1364, 0, 1955, 1956, 1954, 0, 1932, + 1948, 1953, 1951, 0, 1923, 0, 1972, 1963, 2011, 1363, + 1970, 1971, 1325, 2280, 0, 2278, 2297, 2298, 2496, 1303, + 1299, 1021, 905, 2098, 904, 603, 606, 605, 0, 0, + 2069, 227, 2531, 0, 2069, 1038, 0, 2532, 3495, 0, + 3502, 3484, 0, 1155, 3567, 3568, 1032, 1030, 0, 1216, + 1217, 1220, 0, 250, 0, 253, 255, 0, 400, 433, + 435, 378, 444, 0, 0, 1255, 0, 1253, 1252, 1250, + 1251, 1249, 0, 1240, 1246, 1247, 1793, 0, 2144, 2151, + 2053, 2055, 2495, 0, 1348, 2146, 1921, 0, 0, 0, + 2159, 2057, 0, 0, 2040, 3408, 3482, 2039, 1159, 0, + 0, 378, 472, 448, 402, 3447, 1388, 3463, 0, 3468, + 3469, 3406, 225, 224, 3415, 223, 0, 0, 0, 0, + 3456, 3439, 0, 3443, 3442, 0, 3440, 0, 3441, 0, + 3446, 3423, 3422, 2471, 0, 2470, 378, 377, 2077, 3008, + 3024, 2371, 2367, 2366, 0, 2386, 0, 1866, 1867, 0, + 0, 1869, 3357, 1974, 0, 3354, 393, 400, 0, 0, + 0, 415, 3688, 272, 387, 400, 402, 414, 453, 275, + 383, 0, 0, 378, 378, 400, 3620, 3355, 3290, 1679, + 1681, 0, 0, 1872, 0, 1696, 0, 0, 0, 0, + 0, 0, 1507, 0, 0, 0, 1633, 0, 1696, 1661, + 2004, 2005, 1985, 1986, 1984, 1987, 1385, 0, 1988, 2003, + 0, 0, 0, 1659, 1330, 1313, 0, 0, 1841, 1842, + 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, + 1854, 1859, 1855, 1856, 1857, 1858, 1853, 1860, 0, 1840, + 0, 1685, 1646, 1648, 0, 0, 0, 756, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1871, 0, 0, + 1871, 0, 0, 0, 0, 0, 0, 1660, 0, 1658, + 0, 0, 1657, 1551, 0, 0, 1871, 0, 1577, 0, + 0, 0, 1573, 0, 0, 0, 1557, 1558, 0, 0, + 0, 1483, 0, 1481, 1482, 0, 0, 1871, 0, 0, + 0, 0, 1474, 0, 0, 0, 0, 1719, 0, 0, + 1863, 1861, 1864, 1862, 0, 0, 1720, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1555, 0, 0, 0, + 2486, 938, 0, 0, 0, 0, 1522, 0, 0, 0, + 0, 1390, 1389, 1391, 1402, 1396, 1400, 1394, 1398, 0, + 1455, 3002, 1403, 0, 0, 0, 1406, 1415, 1419, 0, + 0, 0, 0, 0, 1426, 1424, 1425, 1437, 1438, 1422, + 1423, 0, 1428, 0, 1427, 1434, 1435, 1436, 1439, 1525, + 901, 1533, 1891, 1652, 1653, 1677, 1895, 0, 0, 0, + 0, 2482, 1374, 1477, 1476, 1478, 1479, 1480, 511, 0, + 505, 508, 522, 0, 0, 2358, 0, 2674, 2690, 2691, + 322, 325, 324, 326, 0, 0, 1263, 1267, 3355, 0, + 0, 0, 0, 3486, 3396, 0, 0, 1370, 1310, 1369, + 0, 0, 0, 0, 0, 3312, 3324, 0, 0, 3321, + 0, 0, 0, 0, 0, 3294, 0, 0, 0, 0, + 3267, 3333, 3334, 3337, 0, 0, 0, 2972, 0, 3269, + 3274, 3265, 3278, 3280, 3282, 2232, 0, 0, 0, 0, + 2237, 2234, 2227, 2240, 2712, 2236, 2253, 2235, 2229, 2242, + 2228, 0, 0, 0, 2274, 2246, 2249, 2243, 2274, 0, + 2274, 2245, 0, 2272, 2259, 2258, 2257, 2200, 2199, 2193, + 2265, 2250, 2244, 220, 2274, 2198, 2197, 2179, 2180, 2181, + 0, 1930, 0, 2270, 134, 2264, 0, 2274, 2274, 0, + 2256, 2219, 2221, 2125, 0, 1793, 0, 0, 2111, 2104, + 2091, 378, 0, 0, 0, 2078, 2079, 272, 0, 0, + 0, 495, 1290, 1276, 1292, 1199, 1198, 1196, 3532, 3536, + 1721, 80, 2119, 2117, 82, 2116, 2118, 83, 2337, 2313, + 2312, 2314, 2318, 131, 2323, 2315, 0, 2329, 2330, 350, + 354, 0, 0, 0, 3372, 0, 611, 0, 75, 0, + 1205, 1974, 2352, 2354, 2347, 3539, 0, 1172, 1189, 1188, + 1184, 1185, 0, 1169, 135, 1180, 1179, 1173, 2169, 3600, + 3609, 3613, 3598, 601, 986, 0, 3404, 3502, 189, 0, + 0, 0, 140, 0, 610, 161, 163, 610, 0, 0, + 0, 610, 0, 0, 1810, 1802, 1804, 1805, 1806, 0, + 1809, 0, 1352, 0, 1340, 1340, 1350, 1812, 1792, 1789, + 1814, 0, 1813, 1813, 0, 0, 1772, 1771, 0, 1865, + 895, 2023, 0, 0, 1875, 0, 1877, 1886, 1876, 1944, + 2687, 0, 0, 1366, 0, 1974, 1360, 2435, 0, 0, + 0, 0, 0, 0, 0, 1943, 1940, 0, 2299, 601, + 0, 604, 2098, 2098, 0, 0, 0, 0, 0, 0, + 0, 0, 230, 239, 1025, 2530, 1027, 0, 0, 0, + 0, 0, 3514, 3355, 1052, 3569, 1028, 0, 0, 1219, + 248, 247, 251, 0, 378, 439, 436, 431, 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, 134, 89, 110, 0, 1242, 1254, 2050, + 1248, 2145, 1340, 0, 0, 0, 2498, 0, 1958, 1922, + 2158, 0, 2162, 2161, 0, 3678, 0, 0, 1161, 1160, + 2042, 2047, 3355, 378, 292, 405, 451, 0, 0, 3403, + 226, 3478, 3481, 2495, 0, 0, 3424, 0, 378, 424, + 2079, 2368, 2372, 1281, 1283, 1284, 1282, 1290, 0, 2546, + 2545, 2544, 2515, 1870, 2516, 2541, 2539, 2543, 2537, 2542, + 2535, 2536, 2540, 2538, 0, 3363, 3364, 3362, 1979, 1975, + 0, 3356, 3361, 394, 395, 416, 419, 0, 0, 378, + 0, 388, 389, 403, 407, 0, 422, 461, 445, 445, + 445, 272, 1258, 0, 0, 2485, 0, 1628, 0, 1629, + 1630, 0, 1508, 1729, 0, 0, 0, 1536, 0, 0, + 0, 1632, 0, 1386, 0, 0, 1511, 1503, 1314, 0, + 1663, 0, 0, 0, 0, 0, 0, 0, 1668, 0, + 1666, 0, 0, 1723, 0, 1725, 2482, 0, 1638, 1673, + 0, 1636, 0, 0, 1662, 1674, 1675, 0, 0, 0, + 1642, 1640, 0, 1644, 1578, 1641, 1643, 0, 0, 0, + 1576, 0, 0, 0, 0, 0, 0, 0, 1554, 0, + 1589, 0, 1626, 1590, 0, 0, 1587, 0, 0, 0, + 1605, 1540, 1541, 0, 1542, 1592, 0, 1516, 1547, 1548, + 1513, 1514, 1606, 1595, 1515, 0, 1550, 1974, 0, 1534, + 0, 0, 0, 1552, 1581, 0, 0, 0, 1512, 0, + 0, 0, 1974, 0, 1607, 1556, 0, 0, 757, 1332, + 1504, 2483, 1397, 1401, 1395, 1399, 0, 0, 0, 0, + 1414, 0, 0, 1407, 1417, 1420, 0, 0, 1893, 0, + 0, 1671, 1718, 1718, 1718, 1718, 0, 0, 0, 1622, + 1623, 0, 0, 504, 503, 0, 507, 591, 0, 524, + 512, 501, 2360, 0, 0, 1265, 0, 0, 0, 0, + 3397, 0, 0, 0, 0, 1374, 1375, 1375, 2481, 3291, + 3292, 3293, 0, 2571, 2570, 2568, 2572, 2569, 2519, 2521, + 0, 2520, 2566, 2564, 2567, 2562, 2560, 2561, 2565, 2563, + 0, 0, 3310, 903, 902, 3323, 0, 3345, 0, 0, + 3330, 3351, 3352, 3349, 3350, 3348, 3328, 0, 0, 0, + 3273, 0, 3339, 3340, 0, 0, 0, 3308, 3307, 0, + 0, 0, 3300, 0, 0, 0, 2255, 0, 2226, 2239, + 2238, 2275, 2276, 2252, 2248, 2194, 2251, 2247, 2271, 1974, + 2204, 2225, 2195, 0, 2218, 2176, 2272, 2233, 1873, 2264, + 2191, 2192, 2254, 0, 1349, 1375, 2107, 1374, 2108, 378, + 2462, 0, 2469, 0, 2066, 0, 378, 1239, 1279, 1271, + 1278, 1275, 1290, 1288, 1277, 964, 963, 0, 1291, 79, + 0, 0, 2316, 134, 2310, 2331, 2305, 0, 345, 355, + 347, 351, 352, 353, 348, 2781, 2863, 0, 1873, 3376, + 3615, 1212, 1210, 1209, 1211, 1200, 1206, 1207, 2357, 2355, + 134, 2376, 1187, 0, 1190, 3620, 1974, 0, 3612, 155, + 602, 0, 0, 0, 986, 0, 165, 3514, 0, 0, + 0, 138, 169, 3675, 3682, 3583, 0, 156, 3685, 228, + 3683, 0, 0, 1807, 1808, 1769, 1340, 1342, 1341, 0, + 0, 1344, 0, 0, 0, 0, 1777, 0, 1773, 1775, + 0, 1838, 1830, 0, 2028, 2020, 2025, 2480, 1883, 1927, + 0, 0, 1311, 1886, 0, 1945, 1936, 0, 1367, 1365, + 1957, 1934, 0, 1950, 1949, 1952, 1364, 1924, 1927, 0, + 1374, 1022, 607, 0, 0, 1023, 0, 0, 0, 233, + 236, 234, 235, 2098, 2098, 183, 2098, 2098, 182, 184, + 0, 178, 175, 185, 2098, 1039, 171, 0, 0, 0, + 0, 1974, 0, 0, 0, 191, 0, 3489, 3488, 0, + 3504, 0, 0, 3506, 0, 3505, 3503, 3474, 3485, 0, + 1047, 1017, 0, 1054, 1056, 0, 0, 3569, 1218, 0, + 250, 254, 442, 0, 0, 0, 1974, 0, 1974, 1974, + 0, 0, 1974, 0, 1974, 0, 0, 0, 0, 0, + 0, 0, 1974, 0, 0, 0, 1974, 0, 1974, 0, + 88, 1256, 2142, 2054, 2161, 0, 2496, 1373, 0, 2154, + 1873, 0, 2160, 3355, 3409, 3483, 1159, 0, 293, 0, + 0, 402, 3518, 0, 0, 0, 0, 0, 2472, 426, + 2063, 0, 1290, 1294, 2379, 3366, 3367, 3365, 1982, 1983, + 1980, 1978, 1981, 396, 417, 296, 298, 3650, 295, 297, + 3648, 3649, 0, 3691, 3693, 0, 374, 283, 372, 3645, + 3643, 3647, 3641, 3646, 3639, 3640, 3644, 3642, 373, 287, + 3690, 3716, 0, 3689, 390, 0, 410, 402, 0, 455, + 457, 446, 465, 459, 378, 1682, 1680, 0, 1697, 1726, + 0, 3027, 3028, 3029, 3030, 3031, 3032, 3034, 3035, 3033, + 3036, 3037, 857, 3038, 3039, 3040, 3041, 3042, 3043, 3044, + 3045, 3046, 3047, 3048, 857, 3049, 3050, 3051, 3052, 3053, + 3054, 3055, 3056, 3057, 3058, 3059, 3061, 3060, 3062, 3063, + 3064, 3065, 3066, 3067, 3068, 3069, 840, 3070, 3071, 3072, + 3073, 3074, 3075, 3077, 3076, 3078, 3079, 3080, 3081, 861, + 3082, 3083, 3084, 3086, 3085, 3087, 3088, 3089, 3090, 3091, + 3092, 3093, 3094, 3095, 1712, 3096, 3097, 3098, 3099, 3100, + 3102, 3101, 3105, 3106, 3107, 3108, 3109, 3110, 3111, 3112, + 3113, 3114, 3115, 3625, 3116, 3117, 3626, 3118, 3119, 3120, + 1706, 3121, 3122, 3123, 3124, 3125, 3126, 3103, 3127, 3104, + 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, 3136, 3137, + 3138, 3139, 3140, 3141, 3142, 3143, 3146, 3144, 3145, 3147, + 3148, 3149, 3150, 3151, 3153, 3152, 3156, 3154, 3155, 3157, + 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3627, 3165, 3166, + 3167, 3168, 3169, 3171, 3172, 3170, 3173, 3174, 3175, 3176, + 3177, 3178, 3179, 3180, 3181, 3182, 3183, 3184, 3185, 3187, + 3186, 3188, 3189, 3190, 3191, 3193, 3194, 3195, 3196, 3197, + 3198, 3199, 3200, 3203, 3201, 3202, 3204, 3205, 3206, 3207, + 3208, 3209, 3210, 3211, 3212, 3216, 3213, 3217, 3214, 3218, + 3215, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, 3228, + 3229, 3230, 3231, 3232, 3233, 3234, 3235, 3237, 3238, 3239, + 3240, 3241, 1709, 3242, 3243, 3244, 3245, 3246, 3247, 3248, + 3250, 3251, 3249, 0, 3252, 3254, 3253, 3255, 3256, 3257, + 3258, 3259, 3260, 3261, 3192, 3227, 3236, 859, 1714, 857, + 2593, 1707, 859, 0, 1705, 0, 1703, 1704, 767, 769, + 2586, 2587, 2588, 2589, 2591, 2592, 3628, 3629, 768, 2590, + 0, 0, 0, 1634, 1631, 0, 0, 0, 1688, 1688, + 0, 0, 0, 0, 1431, 0, 0, 0, 1617, 0, + 1639, 1637, 0, 0, 0, 0, 0, 1645, 0, 1562, + 1560, 1489, 0, 1487, 0, 1488, 0, 1490, 0, 0, + 1627, 0, 1457, 1475, 0, 0, 0, 1721, 0, 1990, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2487, 0, 0, 927, 933, 936, 937, 939, 931, + 0, 1599, 0, 0, 0, 1412, 1408, 0, 1416, 0, + 0, 0, 1430, 1429, 1895, 1894, 0, 1670, 0, 0, + 1720, 0, 0, 1720, 0, 0, 0, 2484, 1375, 1604, + 1374, 514, 0, 532, 506, 1974, 509, 0, 523, 0, + 535, 0, 0, 0, 323, 0, 1268, 0, 454, 0, + 3395, 3487, 0, 0, 1368, 1376, 1371, 0, 0, 0, + 3314, 3313, 3325, 0, 0, 0, 0, 3298, 3296, 3295, + 3271, 0, 0, 3344, 3338, 3335, 3336, 0, 0, 3277, + 0, 0, 3275, 3279, 3281, 2214, 2213, 0, 2273, 1930, + 2187, 2206, 2208, 2274, 2127, 2131, 0, 1865, 2115, 0, + 0, 2109, 2113, 0, 2468, 0, 0, 2080, 1793, 3718, + 0, 1832, 84, 0, 2317, 2308, 0, 2303, 2306, 0, + 0, 3387, 3388, 3380, 3383, 3381, 3382, 3386, 3389, 3390, + 3377, 3384, 1930, 0, 0, 1202, 1208, 2350, 1186, 136, + 0, 1170, 3651, 2170, 3601, 3614, 1001, 1003, 1002, 987, + 988, 0, 0, 0, 1047, 0, 0, 0, 614, 614, + 170, 0, 0, 200, 3569, 0, 0, 0, 158, 1766, + 1351, 1343, 1345, 1340, 1340, 0, 1730, 0, 0, 0, + 1730, 0, 0, 495, 0, 1811, 1827, 896, 2393, 1884, + 1885, 0, 1880, 1928, 1929, 1882, 1878, 0, 1887, 1889, + 1312, 1946, 1938, 1933, 1361, 0, 1926, 0, 0, 0, + 2014, 2016, 665, 664, 238, 237, 242, 243, 1974, 1974, + 2103, 2102, 1974, 1974, 177, 174, 2101, 2100, 1974, 1974, + 172, 2069, 195, 194, 196, 197, 199, 198, 193, 1035, + 0, 3492, 0, 3499, 3494, 3497, 3477, 3476, 3475, 3472, + 0, 1974, 1974, 1974, 0, 1974, 3513, 3515, 0, 0, + 1036, 904, 3527, 0, 0, 205, 3571, 0, 3573, 0, + 1222, 0, 1221, 249, 378, 1974, 1974, 103, 1974, 95, + 96, 91, 123, 124, 93, 94, 99, 98, 100, 101, + 104, 105, 102, 97, 92, 127, 129, 128, 106, 2010, + 2009, 2008, 130, 125, 126, 90, 0, 1873, 2499, 0, + 0, 1959, 2155, 2147, 2149, 2037, 2035, 3656, 0, 452, + 406, 450, 0, 3402, 3407, 3480, 3479, 3502, 3502, 400, + 378, 400, 425, 0, 1285, 1290, 1294, 0, 1286, 2390, + 834, 857, 857, 874, 820, 840, 836, 840, 3119, 830, + 874, 786, 786, 874, 833, 786, 840, 835, 0, 832, + 874, 831, 786, 857, 824, 857, 780, 781, 786, 857, + 799, 0, 840, 874, 0, 821, 840, 826, 857, 0, + 857, 857, 857, 2976, 857, 857, 284, 840, 764, 770, + 772, 771, 773, 774, 857, 857, 857, 857, 857, 861, + 0, 0, 3694, 0, 273, 404, 408, 462, 445, 0, + 0, 1727, 0, 855, 858, 1698, 909, 0, 1711, 842, + 841, 0, 862, 1713, 0, 1710, 909, 856, 860, 1716, + 1702, 1708, 1715, 909, 1506, 1537, 1510, 1509, 0, 0, + 0, 1569, 0, 1686, 1692, 0, 0, 0, 1544, 0, + 1669, 1667, 1546, 0, 0, 1619, 2484, 1594, 1665, 1572, + 1596, 1549, 0, 0, 0, 1486, 1484, 1485, 0, 1563, + 1585, 0, 1473, 1586, 0, 1570, 1593, 1502, 1992, 1991, + 1989, 1517, 1974, 0, 1574, 1535, 0, 0, 1598, 2488, + 2489, 0, 0, 0, 938, 924, 925, 926, 0, 928, + 930, 932, 0, 1974, 1433, 1432, 1404, 0, 1413, 1410, + 0, 1418, 1897, 1896, 0, 0, 1610, 1612, 1611, 1614, + 1613, 1608, 1718, 1376, 1624, 0, 515, 516, 518, 520, + 597, 0, 510, 539, 499, 0, 514, 502, 1266, 1269, + 0, 3393, 3392, 0, 1372, 1380, 1379, 2478, 2482, 0, + 0, 0, 3311, 3332, 0, 0, 0, 0, 3342, 3341, + 3343, 3309, 3304, 3302, 3301, 1996, 1997, 1995, 1993, 1994, + 2205, 1930, 2201, 0, 1873, 0, 1830, 1375, 2105, 0, + 3655, 0, 2086, 0, 2083, 2090, 488, 2154, 0, 2081, + 2052, 0, 1835, 0, 1836, 1833, 1834, 1974, 0, 0, + 371, 363, 358, 366, 360, 362, 361, 367, 368, 369, + 370, 364, 359, 365, 357, 356, 0, 3375, 1213, 1214, + 0, 1193, 1191, 143, 0, 3405, 164, 0, 149, 152, + 715, 0, 0, 0, 0, 2098, 2098, 2098, 2098, 2098, + 2098, 2098, 2098, 2098, 2098, 0, 2098, 2098, 2098, 2098, + 2098, 2098, 2098, 2098, 2098, 2098, 0, 0, 2098, 2098, + 139, 483, 491, 615, 618, 654, 656, 643, 644, 480, + 0, 141, 269, 231, 0, 0, 0, 257, 0, 680, + 681, 679, 678, 0, 0, 3569, 0, 1354, 1353, 1778, + 0, 1782, 1787, 1783, 0, 1774, 0, 1795, 1839, 1831, + 0, 0, 2401, 1927, 0, 0, 1927, 0, 0, 1375, + 2012, 1374, 176, 181, 180, 173, 186, 179, 1040, 192, + 3493, 3491, 3490, 0, 3498, 0, 3473, 3509, 3507, 3508, + 3511, 0, 0, 3510, 3512, 1041, 1042, 1048, 1043, 1147, + 1147, 0, 1147, 0, 0, 1147, 2098, 0, 0, 495, + 1165, 2098, 0, 0, 0, 0, 0, 1130, 0, 1147, + 0, 0, 0, 0, 0, 1068, 1129, 616, 1018, 1067, + 1069, 1081, 491, 0, 1102, 1132, 1133, 1131, 3528, 0, + 0, 0, 1053, 0, 208, 206, 216, 3570, 0, 2069, + 0, 3573, 1224, 1225, 0, 440, 0, 116, 118, 0, + 120, 122, 0, 112, 114, 2161, 2152, 0, 1960, 0, + 1374, 2069, 294, 0, 0, 3516, 3516, 427, 429, 428, + 2120, 1287, 1295, 2392, 2391, 0, 792, 874, 872, 874, + 806, 875, 844, 837, 844, 808, 914, 820, 0, 874, + 907, 911, 908, 816, 0, 786, 909, 0, 912, 787, + 814, 807, 813, 844, 0, 803, 811, 874, 779, 815, + 802, 0, 844, 817, 822, 825, 827, 829, 844, 874, + 0, 0, 3620, 786, 801, 800, 0, 786, 844, 3620, + 838, 823, 909, 920, 786, 874, 844, 844, 288, 1974, + 290, 375, 445, 3714, 1683, 0, 0, 0, 0, 1699, + 910, 0, 0, 1717, 1700, 1701, 1635, 0, 0, 0, + 0, 1692, 0, 0, 1693, 1651, 0, 0, 0, 0, + 0, 1505, 0, 1615, 0, 1561, 1559, 0, 840, 1464, + 1466, 1462, 1465, 0, 859, 1468, 0, 821, 859, 909, + 1472, 1458, 1459, 1460, 1461, 0, 0, 0, 0, 0, + 2490, 922, 1601, 0, 935, 929, 927, 934, 0, 1409, + 0, 0, 1899, 0, 1672, 0, 1625, 519, 0, 598, + 594, 0, 0, 540, 0, 541, 537, 513, 0, 3394, + 1378, 1377, 0, 3318, 3316, 3315, 3347, 3346, 3299, 3297, + 0, 0, 134, 2130, 1921, 2132, 2133, 2124, 2114, 2112, + 2464, 0, 2087, 2089, 2475, 2474, 2486, 0, 0, 2069, + 2082, 1087, 0, 1088, 1099, 1101, 1293, 0, 2342, 0, + 2340, 2309, 2343, 0, 0, 0, 0, 146, 0, 0, + 0, 1012, 2623, 0, 0, 684, 686, 687, 688, 689, + 0, 716, 691, 610, 965, 965, 718, 2491, 0, 663, + 2098, 484, 1974, 1974, 1974, 1974, 641, 1974, 1974, 1974, + 0, 0, 2098, 1974, 0, 0, 1974, 1974, 1974, 1974, + 0, 0, 1974, 649, 650, 648, 1974, 1974, 2390, 490, + 492, 904, 619, 614, 0, 262, 3676, 475, 476, 0, + 0, 3573, 0, 0, 3589, 0, 3589, 0, 0, 1733, + 1732, 0, 0, 0, 0, 0, 0, 1820, 0, 1819, + 0, 1825, 1829, 0, 0, 0, 0, 2394, 2396, 0, + 2029, 1881, 1890, 1888, 1925, 1937, 0, 2017, 2015, 0, + 3500, 3496, 1977, 1976, 0, 1045, 0, 1044, 1049, 1012, + 610, 1148, 608, 0, 1106, 1110, 1107, 608, 2056, 2056, + 1259, 2056, 0, 0, 0, 0, 2056, 0, 2058, 2056, + 0, 0, 2056, 2056, 0, 1259, 0, 493, 1168, 1166, + 2056, 1167, 2056, 0, 0, 1259, 1119, 1063, 1120, 0, + 1064, 2056, 1259, 1086, 1259, 1259, 0, 617, 904, 1065, + 1066, 715, 1162, 215, 204, 0, 0, 1055, 1057, 0, + 0, 1058, 3572, 1031, 3575, 2069, 1230, 0, 108, 1974, + 109, 1974, 107, 1974, 2069, 0, 1961, 2156, 2150, 3519, + 0, 3401, 3400, 0, 2154, 0, 804, 878, 0, 805, + 846, 847, 845, 850, 782, 778, 915, 919, 918, 809, + 810, 789, 906, 913, 0, 872, 788, 784, 0, 1014, + 796, 0, 785, 828, 783, 797, 0, 280, 0, 3653, + 0, 0, 3660, 286, 812, 3620, 276, 794, 798, 285, + 0, 775, 790, 921, 791, 793, 920, 776, 777, 1974, + 3692, 303, 302, 0, 0, 463, 853, 851, 854, 852, + 0, 1567, 1568, 1689, 1927, 1687, 0, 1694, 1695, 1649, + 1591, 0, 1545, 0, 1616, 0, 1597, 1564, 1467, 1463, + 1470, 822, 1469, 1471, 1588, 1518, 1974, 1575, 1579, 1580, + 0, 1600, 1974, 1411, 0, 1902, 1901, 0, 0, 1927, + 1609, 517, 595, 512, 0, 536, 539, 0, 500, 2479, + 0, 0, 3305, 3303, 2207, 1958, 2465, 2463, 2085, 0, + 0, 0, 2084, 2094, 0, 2067, 1289, 0, 1837, 2338, + 1974, 0, 2307, 0, 1192, 1194, 0, 0, 0, 0, + 0, 717, 1013, 0, 0, 690, 2494, 683, 715, 0, + 0, 0, 965, 707, 610, 0, 1012, 966, 610, 610, + 0, 0, 0, 0, 2007, 2006, 638, 631, 630, 633, + 632, 635, 634, 0, 627, 624, 636, 626, 651, 0, + 639, 621, 676, 677, 675, 645, 652, 622, 623, 629, + 628, 625, 668, 673, 671, 670, 669, 674, 672, 640, + 655, 637, 653, 482, 599, 620, 491, 2000, 2001, 1998, + 1999, 660, 659, 2002, 657, 658, 268, 266, 267, 3665, + 0, 263, 0, 261, 0, 265, 3668, 240, 232, 0, + 378, 479, 477, 478, 0, 0, 157, 271, 258, 260, + 231, 0, 3687, 231, 3573, 1734, 0, 0, 1779, 0, + 1784, 0, 1776, 1815, 1815, 1826, 0, 0, 0, 0, + 2395, 0, 0, 2402, 2404, 1939, 0, 1043, 0, 0, + 0, 1259, 0, 0, 1134, 1104, 0, 0, 0, 0, + 1075, 0, 1084, 0, 0, 2056, 0, 1136, 0, 1135, + 0, 0, 0, 1145, 1146, 0, 1917, 1919, 1927, 0, + 0, 0, 1124, 1143, 1144, 0, 0, 0, 0, 1094, + 0, 1080, 1147, 0, 1147, 1103, 0, 682, 0, 1164, + 1105, 202, 207, 217, 218, 1033, 0, 3574, 1029, 0, + 1231, 1227, 1228, 1223, 117, 121, 113, 2153, 0, 0, + 3523, 3517, 3521, 2121, 2069, 0, 873, 848, 849, 916, + 917, 879, 909, 0, 909, 3620, 282, 0, 279, 3661, + 3662, 0, 0, 795, 312, 311, 309, 378, 299, 307, + 301, 0, 308, 0, 292, 0, 0, 1691, 1647, 0, + 1618, 1620, 0, 923, 0, 1898, 1892, 0, 0, 0, + 0, 0, 0, 1911, 1903, 0, 1676, 0, 597, 0, + 0, 525, 538, 544, 543, 3319, 3317, 2128, 0, 2088, + 2476, 2487, 489, 0, 0, 1100, 2341, 0, 3385, 0, + 1927, 1010, 0, 0, 0, 0, 0, 0, 685, 0, + 610, 961, 962, 1012, 0, 692, 984, 2491, 1012, 1012, + 3112, 857, 780, 781, 786, 857, 799, 2676, 840, 874, + 2680, 821, 840, 826, 857, 722, 857, 857, 857, 857, + 857, 0, 710, 720, 765, 767, 2586, 2587, 2588, 2589, + 2591, 2592, 2590, 2493, 485, 647, 2330, 646, 600, 0, + 2390, 270, 0, 3664, 0, 2976, 3666, 241, 187, 1374, + 213, 0, 3673, 3686, 3590, 3684, 159, 0, 1865, 0, + 0, 0, 1823, 1821, 2399, 2400, 0, 2397, 0, 0, + 2403, 0, 1050, 1046, 1051, 0, 1089, 0, 1108, 0, + 0, 1074, 0, 1245, 0, 0, 1127, 1115, 0, 1070, + 0, 1117, 1118, 1159, 1072, 0, 1920, 494, 0, 0, + 1079, 0, 1162, 1071, 1096, 1077, 1109, 1163, 209, 1059, + 378, 0, 0, 0, 1226, 0, 1233, 0, 3522, 3520, + 0, 2064, 1793, 819, 1015, 818, 3663, 281, 277, 839, + 1974, 289, 310, 291, 3695, 843, 1927, 1543, 1519, 1602, + 0, 1908, 0, 0, 1906, 1905, 0, 1900, 1907, 596, + 593, 0, 0, 533, 551, 547, 0, 549, 550, 572, + 2069, 0, 0, 2093, 2095, 2344, 3355, 0, 1007, 0, + 1008, 0, 3355, 3355, 0, 0, 0, 1012, 984, 2491, + 943, 0, 693, 0, 697, 699, 724, 0, 719, 711, + 732, 0, 0, 661, 481, 264, 0, 3667, 0, 188, + 3677, 3584, 205, 214, 259, 0, 2861, 0, 1742, 1744, + 1767, 1781, 1786, 0, 1816, 0, 0, 0, 2398, 2406, + 2405, 3501, 0, 1091, 609, 1004, 0, 1122, 0, 0, + 1162, 1076, 0, 0, 0, 1116, 1137, 1114, 1259, 1918, + 0, 0, 0, 1113, 1095, 1097, 1205, 0, 211, 187, + 3576, 0, 0, 1232, 1237, 0, 1234, 1236, 1346, 0, + 2380, 0, 300, 1690, 1909, 0, 1910, 1913, 0, 0, + 1914, 0, 529, 531, 521, 0, 526, 0, 545, 0, + 2098, 2098, 0, 2098, 2098, 2098, 2098, 565, 573, 575, + 576, 577, 0, 2129, 2466, 2477, 972, 1927, 0, 0, + 0, 0, 974, 976, 0, 0, 712, 705, 701, 0, + 0, 947, 985, 0, 695, 0, 0, 887, 941, 750, + 0, 753, 0, 885, 723, 725, 883, 884, 727, 0, + 0, 0, 766, 0, 0, 865, 0, 868, 0, 0, + 721, 0, 733, 864, 871, 2492, 642, 487, 662, 0, + 0, 0, 216, 187, 0, 1741, 0, 0, 1818, 1817, + 1832, 0, 0, 0, 539, 1090, 1005, 1123, 0, 1112, + 495, 539, 1128, 1073, 1125, 1126, 495, 0, 1078, 210, + 0, 203, 219, 3577, 3578, 1229, 0, 2122, 895, 278, + 1904, 1912, 1916, 1915, 527, 0, 534, 558, 548, 554, + 0, 2098, 0, 0, 2098, 0, 0, 0, 0, 0, + 542, 574, 2098, 0, 0, 2098, 0, 993, 995, 1138, + 973, 997, 996, 978, 994, 1006, 1011, 1010, 3355, 190, + 0, 1138, 975, 999, 982, 1138, 977, 998, 980, 0, + 0, 0, 0, 703, 0, 946, 0, 951, 0, 0, + 0, 0, 751, 752, 888, 726, 886, 882, 876, 870, + 2503, 2504, 0, 0, 0, 762, 763, 866, 759, 760, + 761, 0, 741, 0, 0, 872, 863, 734, 3671, 0, + 0, 0, 3674, 1746, 1743, 0, 1751, 1753, 1752, 1754, + 1745, 0, 0, 0, 1111, 1093, 0, 1121, 1083, 1085, + 1082, 0, 212, 1235, 0, 2381, 533, 530, 558, 0, + 556, 0, 552, 546, 553, 0, 590, 584, 0, 586, + 587, 585, 582, 569, 0, 567, 0, 989, 992, 1974, + 990, 144, 1140, 1139, 979, 0, 972, 0, 150, 983, + 153, 981, 708, 0, 0, 0, 0, 944, 0, 948, + 949, 950, 0, 942, 0, 0, 0, 0, 877, 881, + 2438, 2437, 0, 1381, 869, 0, 736, 880, 735, 0, + 3669, 1374, 218, 0, 1748, 0, 0, 1824, 1822, 1092, + 539, 2123, 2135, 0, 2407, 528, 555, 0, 563, 559, + 561, 564, 589, 588, 0, 566, 0, 583, 666, 991, + 1142, 1141, 1009, 1138, 1000, 709, 0, 1008, 0, 945, + 0, 0, 972, 0, 974, 976, 758, 0, 867, 728, + 728, 742, 3672, 0, 3585, 201, 1747, 0, 1755, 0, + 0, 0, 0, 2393, 557, 0, 0, 578, 571, 568, + 147, 0, 0, 1008, 957, 956, 0, 0, 953, 952, + 694, 972, 698, 700, 1382, 0, 739, 729, 731, 738, + 744, 745, 743, 746, 3670, 0, 1750, 0, 1761, 1760, + 1749, 0, 1756, 1758, 1098, 2134, 2136, 0, 2401, 562, + 560, 570, 579, 581, 706, 972, 0, 960, 958, 959, + 0, 0, 696, 1383, 730, 737, 747, 749, 0, 1738, + 1739, 1737, 1736, 1735, 1762, 0, 0, 1757, 0, 1759, + 0, 2409, 580, 702, 972, 0, 0, 748, 3586, 1764, + 1763, 0, 0, 2408, 0, 2413, 704, 955, 954, 3581, + 0, 0, 2420, 3579, 3580, 0, 3587, 2411, 2412, 2410, + 0, 2415, 0, 2417, 2418, 0, 2069, 3582, 378, 2419, + 2414, 0, 2421, 2423, 0, 2382, 187, 2416, 0, 1374, + 3588, 2422, 0, 1375, 2424 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -5341, -5341, -5341, -5341, 2297, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, 2818, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 2032, -5341, 389, -5341, 394, -5341, 393, -3726, -593, + -5341, -1880, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 2183, -2922, -5340, -5341, -5341, -235, 1368, -5341, + -5341, 144, -5341, -262, -5341, -5341, -5341, -4405, -410, -629, + -5341, 45, 4647, 3659, -82, 3990, 945, -4381, -5341, -5341, + -5341, -5341, -5341, -5341, -1919, -5341, -5341, -5341, -5341, 333, + 167, -5341, -5341, -5341, -5341, -5341, 1453, -2126, -628, 367, + 37, -5341, -89, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 22, -5341, -5341, -5341, -173, 739, -4505, -5341, -5341, -5341, + -5341, 2419, -5341, 1834, -5341, -1747, 3685, -5341, -5341, -5341, + -5341, -5341, 2829, -2466, -5341, -5341, -5341, 1510, -5341, -2790, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -301, -5341, -2031, + 1985, -5341, 2042, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -1220, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 3355, -5341, 4605, -5341, -5341, 1228, -5341, 3245, + -5341, 3247, 3248, -2766, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -71, -68, 207, 873, 1385, -5341, -3887, -5341, + -5341, 120, -5341, -5341, -5341, -5341, -5341, 1120, 317, 1117, + -5341, 686, 3025, -2825, -5341, -5341, -5341, -5341, -5341, -5341, + -409, 27, -516, -5341, -4382, -5341, -4835, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -4018, -5341, -5341, -5341, -644, + -5341, -5341, -604, -5341, -5341, -5341, -5341, -293, -5341, -5341, + -3828, -5341, -5341, -5341, 38, -5341, 2760, 4052, -1887, 521, + -679, -5341, -3767, 904, -3962, -3891, -5341, -3849, -5341, -191, + -1300, -1294, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 482, + 297, 903, -4323, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -4322, -4320, 174, -5341, -5030, -5341, 636, -5341, -4857, -5341, + -5341, -5341, -5341, -5341, -5341, -611, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -3864, -5341, -5341, -454, -461, -5341, -354, + -3414, -5341, -2742, -4795, -342, -1415, -341, -340, -339, -5341, + -2110, 1218, 1339, -5341, -5341, -5341, -5341, -3372, -3229, -5341, + -2076, -3524, -3280, 1269, -3076, -3540, 1295, -452, -4346, -4849, + -575, -5341, -3899, -5341, -5341, -3636, -4034, -5341, -670, -2770, + -3171, -360, -5341, -5341, -1705, -3212, -5341, 863, -4055, -4074, + 426, 1707, -5341, -5341, 1204, -5341, -1642, 1202, -5341, -5341, + -5341, 1211, -5341, -605, -5341, -5341, -5341, -5341, -4097, -5341, + -2475, -4344, -5341, 5410, 5411, -2786, -574, -573, -5341, -5341, + -5341, -137, 2300, -5341, -3080, -377, -387, -384, -3133, -29, + -4870, -3687, -4250, -3722, 860, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 224, + 228, 1570, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 954, -1966, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -4785, -3009, -5341, -5341, 540, -5301, -3967, -3964, -4301, 4008, + -5341, -5341, -5341, -5341, 4094, -3312, -4244, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3593, 1439, -5341, -5341, 2331, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -180, 2340, + -5341, -5341, -5341, -5341, -5341, 2802, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -318, -5341, -5341, -5341, -5341, -5341, + -13, 3446, -5341, -5341, -5341, -5341, 5, -5341, -5341, -5341, + -5341, 2496, -5341, -5341, -5341, -5341, 2973, -5341, -5341, -5341, + -5341, -5341, -5341, 2144, -5341, 2717, -5341, -2450, -5341, -5341, + 1410, -153, -5341, -5341, -19, -5341, -5341, -5341, -5341, -5341, + 35, -5341, -5341, -5341, 5404, -1539, 7, -66, -5341, -5341, + 6, -5341, -5341, 4147, -435, 2544, -717, 4778, -5341, -5341, + -5341, -5341, -2485, 2408, -5341, 4205, -5341, -5341, 4395, 1641, + 4167, 2282, 947, 2507, -1670, -164, -3006, 1238, -5341, 1423, + 596, 10618, -5341, -1480, -1521, -5341, -5341, -41, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 2608, 2609, -5341, -5341, + 3888, -5341, 2543, -3755, -5341, -5341, -850, -5341, -2479, -5341, + -5341, -5341, 2545, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, 1740, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, 3837, -1597, -5341, + -5341, 3973, -5341, 1833, -5341, 864, -5341, -5341, 1670, -5341, + -2759, -5341, -5341, -1538, -636, -5341, 3978, -5341, 3995, -1191, + -4064, -5341, -1749, -467, -5341, -249, -5341, -5341, -5341, -5341, + -5341, -3437, -561, -559, -5341, -5341, -5341, 3594, -5341, 4238, + -5341, -5341, -5341, -5341, -5341, -5341, 3602, -5341, -2060, -5341, + -2534, 4242, 4254, 4262, -5341, 4263, -5341, -5341, -1522, 310, + -5341, 674, -5341, -5341, -5341, -5341, -5341, 1216, -5341, -237, + 779, -234, -4276, -1558, 1092, -5341, -5341, -1892, 3617, 4013, + -1271, -5341, 2915, -5341, 3608, 1786, -5341, 2342, -5341, 1099, + 1103, -5341, -5341, 1794, -5341, -5341, -5341, -5341, 483, -123, + -5341, -5341, -5341, 53, 819, -2046, -5341, 496, -3188, 4264, + -168, -5341, 2344, -1961, -3142, -1174, 909, -1278, 2352, 480, + 4847, -449, -5341, -5341, 4223, -5341, -2833, -5341, -603, -1540, + -1028, -3036, -3077, -4711, -5341, -2250, 1347, -5341, -5341, -5341, + -5341, 1124, -5341, -5341, -5341, 2946, -5341, 5520, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -701, -1176, + -5341, -5341, 2854, -936, -159, 5541, -17, -5341, -5341, -15, + -5341, -5341, 4945, -2016, -5341, -5341, 4390, 3483, 2826, -5341, + 1512, -5341, -5341, -5341, -5341, 1259, -5341, -5341, 216, -1158, + -521, 2347, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 825, + -5341, 1278, -1857, -5341, -5341, -5341, -5341, -9, -5341, -5341, + -5341, -5341, 1281, -5341, -445, -5341, -8, -5341, -5341, -5341, + 4816, -5341, -5341, -5341, -5341, -5341, -5341, -4085, -5341, -5341, + 3558, -1425, 4819, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + 3127, -5341, -5341, -5341, -5341, -5341, -5341, 3852, 4978, 4981, + -1660, -5341, -926, 3128, 2536, -1087, -5341, -5341, -5341, 4268, + 4989, -5341, -5341, 49, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 3079, 170, -5341, -5341, -5341, -5341, + -5341, 520, -5341, -5341, -5341, -5341, 3753, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 4156, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 1544, -419, -5341, 768, -462, -5341, 395, -5341, -5341, + -5341, -5341, -5341, -532, -5341, -5341, -536, -5341, -1386, 4734, + -1306, -5341, -1697, -3307, -5341, 12, -5341, -5341, -5341, 3131, + -5341, -5341, -5341, -5341, 2877, -2504, -5341, 547, -5341, -5341, + -2651, -924, -1661, -3990, 231, -5341, -5341, -586, 1742, 9697, + -5341, -5341, 69, -474, -1243, -5341, -5341, 2827, -5, -825, + -126, -757, -767, -1060, -5341, 4654, -5341, -5341, -5341, -625, + -576, -568, -388, -507, 946, -618, 7026, 8611, -639, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, 2588, + 2590, -5341, 5014, -5341, 3505, 3232, -5341, -5341, -5341, 2595, + -5341, -5341, -5341, 5021, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, 2602, 2611, 2614, -5341, -5341, 1850, + -2371, -5341, -5341, -1908, 250, -5341, 3541, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -5341, 3768, -580, 4532, -549, + 3965, 5034, 4573, -5341, 4208, -5341, 4210, -5341, 1678, -5341, + -858, 2678, -1393, -3465, -5341, -5341, 2994, 1205, -5341, -5341, + -2520, -3086, -5341, 2519, 1119, -5341, -5341, 370, -5341, -5341, + -5341, 1676, 440, 5012, 4453, -5341, -5341, -5341, -5341, 5618, + 2030, -5341, 267, 5644, 5645, 5649, -414, -5341, -3150, -5341, + -4306, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, + -5341, 854, -5341, -5341, -5341, 2087, -5341, -5341, -5341, -5341, + -5341, -5341, -5341, -5341, -5341, -1435, 4820, -5341, 1621, -2598, + -5341, -5341, -530, -5341, -5341, -5341, -5341, -5341, 3563, -5341, + 2305, -5341, -5341, -5341, -4358, -5341, -5341, -4340, -5341, 486, + -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -5341, -1399, + -5341, -5341, -5341, 80, -911, 44, -5341, -5341, -5341, -5341, + -5341, -5341 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + 0, 69, 742, 1945, 70, 71, 72, 73, 74, 1911, + 75, 1261, 2571, 1263, 1876, 2574, 76, 711, 77, 2074, + 2763, 2764, 4592, 4593, 4586, 4587, 4589, 4590, 2765, 822, + 823, 2613, 2614, 78, 2631, 3948, 3212, 1947, 4816, 2625, + 5157, 1952, 4819, 1953, 4820, 2623, 3954, 4475, 1957, 1958, + 751, 3949, 3295, 3296, 5660, 1322, 3208, 3304, 3305, 2636, + 4465, 4572, 5568, 4576, 5708, 5841, 5662, 3323, 4991, 5569, + 5570, 646, 1332, 2126, 786, 2040, 5512, 2712, 5248, 2713, + 79, 815, 2063, 3330, 1436, 2064, 2065, 4882, 4883, 5258, + 5239, 5240, 5241, 5242, 4463, 4875, 4468, 2849, 2071, 5055, + 5047, 5048, 4662, 3412, 3413, 4669, 3414, 5069, 5074, 3378, + 3379, 4108, 3415, 5387, 5388, 5389, 666, 1132, 5390, 80, + 81, 667, 675, 668, 1129, 2430, 1130, 82, 83, 709, + 1901, 1902, 1903, 1904, 3174, 2591, 3168, 3169, 4404, 5056, + 3417, 84, 647, 917, 918, 919, 920, 2180, 921, 2851, + 3434, 922, 2843, 3403, 923, 924, 925, 893, 818, 2795, + 2854, 3435, 2796, 3380, 2855, 2177, 926, 927, 928, 929, + 930, 1543, 894, 2146, 3389, 4122, 85, 628, 819, 1438, + 2069, 820, 2070, 3333, 821, 2067, 1441, 3439, 2114, 848, + 1473, 931, 1138, 3440, 932, 2183, 2185, 2182, 3438, 4682, + 2184, 86, 657, 685, 645, 1471, 673, 4879, 5254, 4450, + 4873, 4451, 5223, 4375, 4868, 4869, 4870, 5319, 3153, 87, + 660, 1114, 1731, 2422, 3833, 3025, 3027, 2423, 3832, 4315, + 4316, 4317, 3023, 3024, 5421, 3029, 3830, 5613, 5966, 5731, + 5732, 3822, 5736, 4324, 4764, 4765, 4766, 5127, 5423, 5619, + 5860, 5737, 5973, 5858, 5969, 5859, 5971, 6096, 6049, 6050, + 5870, 5984, 5985, 6054, 6097, 5747, 5748, 5749, 6141, 6142, + 5750, 3826, 3827, 5418, 4760, 5499, 3199, 3200, 2035, 5293, + 1272, 88, 4452, 4556, 4453, 4454, 5193, 5878, 5807, 4456, + 4457, 4458, 6057, 1806, 5219, 5205, 4473, 5336, 4459, 4824, + 4825, 4826, 4827, 5773, 5909, 5775, 5776, 5902, 6006, 5901, + 4828, 4829, 5165, 5648, 5173, 4951, 4830, 4831, 4832, 5180, + 5482, 5650, 5646, 5784, 5785, 6116, 6117, 5800, 6081, 5801, + 6123, 6155, 6156, 5786, 89, 659, 1680, 5925, 5926, 5927, + 4176, 5483, 4177, 4178, 4179, 4649, 4180, 4181, 4182, 4183, + 4184, 4185, 4186, 4187, 4188, 4189, 5061, 4652, 4209, 5023, + 5024, 4203, 4204, 4218, 4648, 4219, 4213, 5802, 5803, 5017, + 4653, 6019, 4621, 5036, 5937, 5787, 5804, 5789, 4637, 1756, + 1757, 3244, 1771, 1772, 3074, 3075, 2038, 4638, 4689, 4639, + 5064, 4283, 5110, 4289, 4290, 4291, 3784, 3785, 3786, 3787, + 3788, 2983, 5790, 5455, 5771, 5904, 5907, 6013, 6108, 5174, + 4833, 5178, 1231, 4834, 4835, 5879, 5891, 5895, 5880, 5896, + 5892, 5642, 3203, 5881, 5882, 5883, 5898, 5894, 3939, 5884, + 5439, 5760, 5440, 5161, 5038, 90, 164, 4051, 1405, 2699, + 1407, 1417, 3327, 2725, 2724, 1420, 1419, 2717, 4021, 4527, + 4928, 4050, 3324, 4055, 5345, 784, 4558, 5698, 5543, 5706, + 5545, 4559, 4802, 4560, 5683, 5825, 4561, 5564, 5704, 5837, + 4803, 4804, 4562, 4563, 4564, 5991, 5992, 5993, 4937, 1850, + 798, 799, 1425, 1426, 1427, 2790, 5340, 4963, 91, 3194, + 2607, 92, 1289, 1290, 1291, 1923, 1924, 2610, 2611, 3931, + 4412, 93, 1256, 2567, 1913, 2599, 94, 1275, 3185, 3186, + 3187, 3925, 95, 1433, 2059, 2060, 2729, 4062, 4584, 4996, + 5353, 5576, 5349, 5715, 5716, 96, 826, 1444, 97, 630, + 2083, 2084, 2085, 2767, 98, 1552, 172, 99, 1740, 1737, + 2436, 2437, 100, 1255, 1863, 1864, 1865, 1866, 3149, 101, + 2154, 2813, 2814, 2815, 2816, 2562, 3900, 2563, 2564, 3158, + 4128, 102, 765, 1400, 103, 764, 1399, 104, 105, 684, + 737, 677, 1747, 107, 108, 4376, 2225, 110, 771, 769, + 1074, 112, 1392, 1388, 113, 2226, 1075, 761, 762, 1340, + 1158, 3229, 3230, 2094, 2095, 2669, 2656, 1159, 1160, 1369, + 2020, 2686, 2448, 2449, 1846, 2450, 3845, 4334, 6078, 1581, + 1483, 1259, 1077, 1078, 1079, 1691, 1692, 1707, 1080, 1701, + 2373, 4262, 4731, 4732, 4733, 4734, 2312, 2313, 2417, 1081, + 2302, 2303, 2304, 1082, 1083, 1084, 1085, 1086, 1087, 1088, + 2295, 2296, 2297, 1089, 1090, 1091, 2412, 4244, 4245, 4713, + 3018, 3019, 3020, 1092, 2880, 4228, 2891, 2892, 2254, 1093, + 1094, 1095, 1096, 1097, 3808, 1098, 4305, 3987, 1099, 1553, + 2189, 2252, 4701, 4233, 5083, 4703, 4704, 5087, 2194, 2868, + 3705, 3706, 3707, 2316, 2317, 1601, 1602, 1570, 1571, 1341, + 4891, 6164, 1342, 5267, 5667, 5668, 5817, 6033, 5950, 5951, + 6130, 6131, 6132, 6133, 1343, 2642, 4476, 1344, 1345, 1346, + 3971, 3972, 4892, 4480, 4894, 4484, 1981, 1982, 1985, 1986, + 1347, 1348, 1349, 1350, 1969, 1351, 1352, 1353, 2661, 5522, + 4900, 4901, 5677, 5676, 4902, 4489, 4490, 3975, 3976, 4383, + 4384, 4385, 3240, 2248, 2249, 2324, 2159, 2160, 2161, 2195, + 1361, 1996, 2677, 3250, 1998, 3248, 3982, 3252, 3988, 3989, + 2404, 3008, 3804, 3010, 4752, 5117, 5118, 5413, 5601, 5602, + 5607, 4567, 5316, 5317, 2778, 1370, 2694, 3267, 3985, 1808, + 1809, 1372, 2002, 2681, 3256, 1810, 2009, 2010, 3261, 3369, + 1373, 1374, 1386, 1391, 1377, 1375, 2840, 4523, 5072, 3789, + 3772, 4808, 5232, 2218, 2219, 5186, 4092, 1378, 2697, 3999, + 4000, 4001, 1357, 1358, 1991, 1992, 1993, 1379, 1359, 2670, + 3978, 114, 704, 115, 2110, 837, 1468, 2109, 3165, 1446, + 3897, 2089, 2090, 1460, 792, 644, 116, 648, 4123, 117, + 688, 3896, 895, 2714, 1511, 1858, 1512, 2556, 3144, 3145, + 4377, 4798, 4378, 4791, 4792, 4379, 1244, 5142, 5143, 1403, + 4017, 4018, 4012, 2550, 3138, 1245, 1851, 3890, 2547, 3891, + 2548, 2576, 3892, 5014, 5580, 5964, 2544, 118, 682, 4364, + 5620, 3884, 3885, 6041, 6042, 1242, 119, 632, 2088, 833, + 1449, 1452, 1453, 2098, 4601, 2774, 5004, 4103, 4600, 1454, + 1455, 2776, 834, 835, 120, 725, 3195, 1295, 1830, 1831, + 1832, 2531, 121, 679, 1232, 3879, 4361, 2517, 663, 5752, + 1813, 1235, 1814, 2513, 3120, 1794, 122, 1397, 1395, 813, + 123, 124, 777, 173, 2025, 125, 126, 1264, 1894, 2588, + 3907, 3908, 4388, 1895, 1896, 3166, 127, 692, 1250, 3162, + 4809, 4810, 5152, 128, 716, 1279, 1280, 1917, 1915, 3190, + 2602, 129, 2424, 130, 649, 898, 1515, 1516, 2152, 131, + 719, 1284, 132, 133, 900, 4129, 5848, 6044, 653, 2156, + 1520, 5224, 4492, 4907, 4908, 4910, 5283, 5284, 6093, 6185, + 6199, 6192, 6202, 6203, 6206, 6212, 6213, 1100, 1302, 1303, + 1101, 5930, 1102, 1103, 1104, 2227, 1248, 687, 1854, 1855, + 5137, 5428, 2554, 3141, 2143, 2144, 1856, 4793, 4794, 3047, + 3249, 1105, 3886, 5162, 1447, 2091, 1267, 613, 1106, 614, + 1107, 1108, 794, 1304, 1988, 2823, 1181, 3060, 1109, 934, + 1413, 1738, 2048, 2049, 2824, 616, 3061, 1182, 3709, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 3716, + 135, 678, 1190, 1768, 1776, 2467, 1766, 2479, 3100, 2481, + 2482, 3105, 2483, 1238, 2454, 1767, 3089, 4347, 4346, 2480, + 3871, 4781, 4780, 2484, 2475, 3867, 3853, 3070, 4341, 5131, + 5130, 2462, 2461, 2460, 2470, 2471, 2472, 2473, 3864, 3080, + 3086, 136, 901, 2165, 656, 1522, 1523, 2837, 137, 681, + 138, 710, 1269, 2595, 3178, 3179, 3920, 4406, 3921, 139, + 1143, 1144, 140, 884, 3206, 2799, 2104, 1416, 886, 2105, + 2127, 888, 1475, 889, 890, 891, 892, 4040, 3316, 3317, + 2804, 2107, 2050, 2444, 3309, 4513, 2051, 4034, 4035, 4514, + 2722, 5360, 4047, 3320, 5011, 4113, 5361, 5362, 141, 696, + 142, 5249, 703, 1258, 1873, 143, 144, 145, 146, 770, + 1382, 1161, 165, 166, 167, 168, 802, 803, 3326, 4057, + 4579, 4580, 5347, 6195, 6196, 2635, 3952, 5811, 6125, 6189, + 6208, 5260, 5261, 147, 1309, 1305, 736, 1943, 1937, 1939, + 2621, 3198, 148, 149, 150, 5052, 151, 1541, 2809, 2072, + 3717, 3718, 627, 939, 3428, 3933, 850, 5050, 1247, 2551, + 2112, 940, 941, 942, 5053, 3429, 5244, 5259, 5246, 5513, + 5665, 3214, 3951, 5250, 152, 153, 2633, 3957, 3955, 2173, + 2850, 3430, 4680, 943, 944, 945, 946, 2186, 947, 1533, + 155, 1861 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 615, 801, 738, 695, 797, 1539, 111, 109, 1179, 1230, + 2349, 2026, 134, 1758, 2594, 1761, 1762, 2399, 938, 2577, + 807, 669, 1415, 1775, 2618, 669, 2771, 658, 2716, 916, + 669, 2100, 1414, 683, 938, 106, 796, 2258, 2432, 1189, + 2217, 3846, 1339, 3268, 154, 1137, 706, 2224, 4088, 3142, + 2779, 2617, 714, 1183, 2696, 1836, 718, 707, 3416, 2011, + 1188, 4002, 2011, 715, 4106, 1316, 885, 1317, 1260, 3940, + 1319, 1320, 3977, 1603, 739, 1739, 676, 1525, 790, 1530, + 3996, 1531, 1532, 3878, 4565, 2289, 4487, 4566, 1536, 3157, + 2015, 1999, 1180, 3442, 3443, 2278, 885, 887, 2172, 4455, + 4455, 2543, 1184, 4003, 3098, 2036, 3720, 3207, 3721, 2121, + 1185, 2037, 3154, 1989, 699, 3992, 1564, 2333, 780, 1932, + 3722, 1804, 2501, 2502, 4208, 3167, 1445, 1145, 1286, 3888, + 3236, 1293, 4690, 3704, 3771, 2352, 3332, 3704, 2431, 2508, + 111, 782, 4690, 1837, 2731, 2853, 1964, 2701, 1193, 4690, + 936, 785, 787, 2590, 808, 787, 809, 795, 810, 2524, + 4557, 4694, 4222, 5233, 811, 812, 936, 4987, 4695, 106, + 3232, 1186, 778, 4217, 5071, 3231, 3231, 4059, 4217, 111, + 109, 2096, 4461, 2537, 2538, 134, 5371, 2384, 2385, 2386, + 2387, 2388, 2389, 2390, 2392, 2394, 2395, 2396, 2397, 2398, + 3824, 4373, 4455, 2432, 4411, -2501, 4934, 4935, 106, 4936, + 4896, 3979, 3980, 2364, -1868, -1868, 4210, 1676, 1678, 1679, + -2502, 2372, 2374, 2838, 2377, 2378, 1539, 2587, -2650, 4939, + 1721, 4941, 1644, 4046, 4953, -1020, -1020, 1662, -2666, -3378, + -3378, 1666, 4636, 4636, 2838, 4285, 4636, 4582, 4971, -2795, + -2795, -384, -384, 4636, -3379, -3379, 2838, 2061, 3961, 4636, + 2788, 2157, 1404, 938, 2838, 938, 2766, 938, 938, 935, + -2098, -486, -486, 5351, 938, 4995, 1401, 938, 672, 2862, + 4212, 1401, -2667, 2838, 2612, 935, 3877, 3362, 1163, 5444, + 5445, 5422, 4799, 3231, 4372, 4373, 1686, 701, 4286, 2838, + 1489, 2838, -2668, 2431, 1687, 1838, 4073, 1686, 2210, 2211, + 2212, 5059, 2213, 1688, 2214, 1687, 2215, 2210, 2211, 2212, + 2838, 2213, 1390, 2214, 1688, 2215, 723, 817, 2032, 1686, + 3769, 1686, 2210, 2211, 2212, 1389, 2213, 1687, 2214, 1687, + 2215, 1330, 1686, 650, 2157, 689, 1688, 1401, 1688, -3456, + 1687, 2980, 4031, 1401, 779, 755, -3378, -3439, 1401, 1688, + 720, 2838, 1708, 2834, 2720, -3443, 2876, 3393, 1708, 5842, + 5972, -3379, 5184, 4020, 5187, 4232, 4010, 4331, 4332, 1401, + 3306, 5754, 2798, 1941, 1246, 5484, 4205, 32, 1686, 5727, + 1431, 1709, 1710, 5189, 800, 936, 1687, 936, 4206, 936, + 936, -3378, 1423, 4216, 3205, 1688, 936, 2106, 4613, 936, + 661, 1686, 1686, 2838, 3923, 3924, -3379, 2835, 3021, 1687, + 1687, 829, 806, 4223, 2928, 1401, 2172, 4112, 1688, 1688, + 4836, 3146, 1760, 1800, 5191, 804, 2118, 2789, 39, 4618, + 2838, 1325, 1401, 32, 1401, 6127, 1686, 1795, 4671, 4618, + 1686, 6079, 5649, 5020, 1687, 1711, 830, 2665, 1687, 4348, + 1708, 1711, 2557, 1688, 665, 2076, 690, 1688, 2032, 4285, + 5562, 1689, 693, 5942, 836, 5021, 838, 839, 840, 841, + 842, 843, 1689, 844, 845, 3134, 5209, 3311, 1686, 1709, + 1710, 5179, 4872, 5823, 39, 5247, 1687, 1802, 938, 2917, + 717, 2788, 1708, 41, 1689, 1688, 1689, 6179, 4060, 3877, + 2200, 3201, 4958, 1136, 935, 1437, 935, 1689, 935, 935, + 883, 5549, 4286, 169, 1331, 935, 1686, 4511, 935, -1943, + 3037, 1709, 1710, 1732, 1687, 5245, 4089, 32, 1871, 1752, + 1712, 4374, -2795, 1688, 1686, -3378, 1712, 6128, 1686, 2619, + 883, 2162, 1687, 1711, 2365, 1868, 1687, 2627, 4630, 4821, + -3379, 1688, 4690, 1689, 5071, 1688, 766, 1296, 1297, 5852, + 698, 1254, 5630, 4836, 1972, 5256, 3875, 4469, 1690, 896, + 2992, 5031, 698, 1207, 1459, 1270, 1689, 1689, 39, 1690, + 5998, 6197, 2455, 4614, 6000, 1711, 1371, 41, 4690, 767, + 1907, 1371, 2157, 1371, 3155, 4455, 651, 2465, 2878, 5724, + 3030, 1690, 3312, 1690, 1686, 2033, 1163, 5062, 1542, 3156, + 1339, 1689, 1257, 4220, 1690, 1689, 1727, -3442, 694, 3307, + 936, 1688, 1833, 2366, 1835, 3015, 4470, 4539, 1712, 1948, + 849, 795, 1951, 3016, 629, 1686, 1954, 1955, 1956, 3077, + -221, 4016, 4957, 1687, 3127, 4690, 5728, -3440, 1736, 2993, + 2222, 4626, 1688, 1689, 2047, 1134, 4557, 6104, -714, -3441, + 1690, 795, 6198, -3446, 5103, 1163, 1603, 4628, 2789, 1432, + 1712, 5824, 1753, 5853, 2442, 5690, 1251, 1469, 1470, 3135, + 4217, 2093, 795, 1690, 1690, 2679, 2011, 5380, 824, 3966, + 4014, 1689, 2077, 3970, 4090, 1268, 795, 2201, 4455, 2505, + 6080, 2507, 1676, 1678, 2511, 4471, 1135, 1466, 3859, 1689, + -715, 3257, 2367, 1689, 2682, 2163, 2519, -1868, 1690, 2522, + 2499, 4925, 1690, 2525, 2036, 3444, 4636, 4520, 1315, 768, + 2037, 3960, 1908, 2075, 654, 2047, 4959, 3231, 2994, 935, + 1803, 2172, 5605, 831, 780, 2033, 1461, 1462, 1463, 2540, + 2541, 2542, 6100, 4622, 4636, 4624, 1733, 2108, 4636, 4656, + 1690, 1394, 4657, 4512, 4643, 4636, 1387, 3242, 6129, 5705, + 2651, -1868, 1273, 897, 795, 4926, 2078, 2861, 2079, 4320, + 824, 2666, 5954, 824, 4658, -1943, 2986, 2987, 4349, 1686, + 795, 938, 2981, 1801, 4466, 4670, 829, 1687, 1690, 1434, + -3378, 2433, 4313, 3314, 2418, 3321, 1688, 654, 1326, 3022, + 1689, 5729, 780, 6180, 5022, -3379, 1690, 4202, 5452, 1456, + 1690, 1458, 171, 787, 787, 787, 1464, 4287, 795, 4061, + 1424, 830, 1421, 4960, 6105, -2678, 1686, 2877, 1363, 1874, + 2721, 2187, 5792, 4619, 1687, 4210, 691, 4210, 6106, 1281, + 1686, 654, -2161, 1688, 1942, 4769, 4210, 1872, 1687, -3565, + 695, 1686, 2786, 2401, 2419, 3128, 6220, 1688, 2080, 1687, + 827, 662, 4210, 3360, 3376, 885, 4210, 1465, 1688, 1467, + 3876, 4039, 832, 1365, 847, 2721, 780, 4210, 1529, 3000, + 3001, 4877, 3004, 3005, 2721, 654, 2769, 1534, 948, 5225, + 1537, 1207, 68, 1797, 4032, 2536, 1711, 4202, 5571, 2807, + 1962, 2082, 3031, 1544, 111, 109, 1686, 1690, -3456, 5364, + 134, 1240, -2161, 936, 1687, 3202, -3439, 2204, 1686, 3359, + 2836, 1266, 4126, 1688, -3443, 4630, 1687, 4632, 724, -2650, + 2029, 1874, 2081, 106, 1490, 1688, 652, 1389, 5516, -2666, + 4212, 4524, 4288, 4631, 1686, 5730, 2839, 5968, 68, -2507, + 1207, 2158, 1687, -2650, 1689, 2082, 2433, 3981, 2443, 4583, + 1645, 1688, 721, -2666, -2508, 1663, 2376, 2839, 1414, 1667, + 1354, 4836, 3877, 5519, -1868, 5520, 5959, 1402, -115, 2839, + -115, 1712, 1402, -2667, 738, 5352, 1663, 2839, 4327, 4934, + 4935, 4565, 4936, 2327, 4566, -1020, 1834, 5586, -119, -3378, + -119, 1689, 4455, -2668, 4455, 1334, 2839, -2667, 4020, -2795, + 722, -384, 3370, 4953, -3379, 1689, 1750, -111, 6014, -111, + 6016, 6017, 2839, 2890, 2839, 1759, 1689, -2668, 883, 4551, + 2523, -486, 935, 1773, 2158, 4616, 4617, 3308, 1686, 2990, + 1414, 4287, 68, 2839, 2216, 4015, 1687, 1684, 1402, 2082, + 3770, 2839, 1796, 2288, 1402, 1688, 1681, 4647, 2929, 1402, + 2982, 1690, 1683, 4650, 1807, 5071, 6027, 4557, 6114, 5155, + 2812, 2879, 4659, 2695, 4663, 4664, 4665, 3254, 4667, 4668, + 1402, 1689, 2488, 1774, 2839, 5663, 5226, 1179, 4672, 4673, + 4674, 4675, 4676, 1689, 1713, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, 1715, 1716, 1717, 1718, 1719, 1720, 1690, 4455, + 795, 5247, 1521, 1339, 6066, 6067, 1253, 2357, 1189, 1689, + 3234, 3235, 1690, 3297, 4919, 6073, 1402, 1693, 1694, 1695, + 2420, 1696, 1183, 1690, 5233, 5233, 2839, 795, 2909, 1188, + 1539, 2884, 5655, 1402, 2368, 1402, 795, 655, 6107, 795, + 2464, 5664, 885, 4472, 795, 3771, 3771, 1815, 4836, 3771, + 3771, -3266, 4878, 2839, 5100, 3771, 3771, 3101, 5102, 3849, + 2995, 1180, 4927, 2047, 2503, 2885, 3078, 2898, 6103, 2899, + 4217, 1184, 4978, 2456, 4217, 795, -3442, 5572, 1690, 1185, + -3471, 3079, 4522, 2600, 1715, 1716, 1717, 1718, 1719, 1720, + 1690, 1686, 4961, 2166, 654, 1798, -1828, 1313, 2509, 1687, + 1909, 1371, 1995, 1689, 2174, 2900, -3440, 2901, 1688, 631, + 655, 32, 807, 1857, 1779, 780, 1690, 1193, -3441, -2681, + 780, 780, -3446, 3861, 1339, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, 1491, 2052, 4048, 1339, 1339, 1910, 1697, 2805, + 1186, 738, 2468, 2629, 2630, 2894, 1920, 832, 5123, 825, + 2638, 2639, 2640, 3904, 655, 1845, 3834, 670, 1513, 3310, + 780, 1933, 39, 2895, 824, 2914, 824, 2584, 4690, 3072, + 4690, 41, 1368, 3902, -1868, 4911, 4897, 5540, 4914, 5542, + 3927, 1946, 2158, 2701, 5547, 671, 3097, 5583, 5703, 5585, + 3102, 5552, 5553, 2036, 2603, 4887, 3182, 1508, 655, 2037, + 4493, 5559, 780, 1971, 4632, -3471, 2432, 4836, 2565, 883, + 1690, 2905, 1498, 1681, 4496, -2161, 5098, 2056, 2421, 1683, + 2775, 4052, 5573, 1994, 1926, 4915, 1686, 3124, 3372, 1355, + 1708, 4788, 1686, 3255, 1949, 1950, 1934, 1912, 2703, 885, + 1687, 2018, -3276, 1688, 3034, 3035, 808, 5757, 809, 1688, + 810, -1828, 2011, 3738, 2011, 2011, 811, 812, 3311, 1709, + 1710, 1518, 2027, 2028, 2896, 1508, 1689, 2157, 1387, 2036, + 3076, 111, 109, 2041, 3382, 2037, 2853, 134, 2791, 2792, + 3260, 4063, 3263, 3264, 780, -2161, 795, 3114, 2320, 2321, + 3371, 3115, 693, 3117, 787, 780, 4654, 2190, 780, 4536, + 106, 5643, 938, 4481, 4482, 3092, 2431, 3122, 4210, 780, + 2439, -3266, 5956, 780, 3167, 2092, 5829, 2514, 3802, 3803, + 3130, 3131, 3223, 1711, 5456, 2102, 5936, 2224, 3224, 3015, + 795, 4898, 795, 780, 6070, 4105, 4585, 4772, 1163, 3883, + 2702, 693, 938, 2031, 3809, 3812, 3815, 3816, 4477, 4478, + 1492, 1860, 4342, 2793, 3231, 3231, 1867, -1868, 3828, 1816, + 2515, 795, 3183, 4917, 1686, 5181, 4351, 795, 6025, 1499, + 4354, 3823, 1687, 1690, 2566, 4735, 2504, 938, 1514, 5757, + 698, 1688, 2700, 3312, 1898, 3155, 1686, 3795, 2808, 3798, + 2832, 2168, 3704, 3936, 1687, 1914, 4049, 4613, 738, 1927, + 3156, 3298, 2469, 1688, 2825, 5169, -3471, 1689, 1712, 3905, + 2510, 2831, -1828, 4709, 938, 938, 2915, 780, 795, 1686, + 6009, 2061, 4836, 1686, 3877, 916, 1137, 1687, 5695, 1686, + 2841, 1687, 1493, 1509, 936, 4636, 1688, 1687, 1354, 1686, + 1688, 1356, 1577, 1578, 1579, 3394, 1688, 1687, 694, 1717, + 1718, 1719, 1720, 2826, 1869, 3313, 1688, 3043, 3044, 5170, + 5124, 2827, 111, 2969, 4541, 2970, 2400, 4605, 4606, 3182, + 1681, 846, -1868, 937, 936, 1519, 1683, 3796, 693, 3797, + 3093, 5688, 5788, 1686, 3184, 4053, 4097, 1626, 4238, 937, + 4239, 1687, 4899, 1510, 1187, 2516, 883, 694, 5924, 2833, + 1688, 1509, -3276, 5577, 2162, 5163, 5378, 3937, 1690, 936, + 1500, 3299, -1868, 1686, 1690, 780, 1792, 655, 3300, 780, + 2045, 1687, 2829, 3862, 3301, 780, 2369, 1686, 6089, 6071, + 1688, 2057, 4655, 2162, 3003, 1687, 2350, -2495, -904, 1689, + -904, 686, 2082, 2916, 1688, 3393, 936, 936, 6010, 2086, + 3863, 2086, 5936, 935, 693, 2940, 5033, 2546, 5171, 111, + 2358, 1689, 5822, 5251, 174, 175, 2032, 4099, 6147, 5614, + 2490, 2491, 5034, 2493, 2495, 2496, 2497, 4710, 3962, 3956, + 700, 5835, 4614, 2902, 3314, 2506, -2098, 795, -2098, 2405, + 2122, 2988, 2322, 935, 1689, 2323, 3906, 3375, 1689, 3302, + 1401, 5638, 2123, 2521, 1689, 780, 5644, 5645, 1792, 795, + 795, 5338, 5252, 2690, 1689, 1686, 1287, 795, 2457, 5163, + 5943, 5915, 5164, 1687, 4931, 6011, 5172, 1327, 935, 5689, + 3932, 1841, 1688, 1207, 694, 3183, 68, 2735, 2451, 2474, + 5751, 2828, 1847, 2589, 5285, 3315, 1690, 787, 787, 780, + 787, 787, 787, 787, 780, 795, 780, 2124, 1689, 1870, + 3303, 1793, 787, 2634, 2637, 935, 935, 5783, 1690, 800, + 6148, 5783, 2425, -1868, -940, 4299, 2452, 4300, 2163, 2520, + 787, 5194, 795, 2076, 2622, 3068, 2999, 3938, 1689, 5685, + 1328, 5207, 5208, 883, 1848, 2628, 1686, 702, 1288, 3062, + 5506, 1690, 1689, 780, 1687, 1690, 3067, 2163, 4380, 5970, + 694, 1690, 5974, 1688, 2164, 780, 1686, 5514, 937, 712, + 937, 1690, 937, 937, 1687, 1408, 4191, 3882, 4525, 937, + 5339, 885, 937, 1688, 2671, 3801, 2844, 5032, 4192, 5778, + 6193, 5686, 1398, 2082, 2852, 1698, 1699, 1700, 3063, 5307, + 5292, 2328, 1539, 1793, 1246, 2332, 3064, 3184, 5253, 2526, + 4085, 2338, 3040, 1686, 795, 1690, 5397, 1539, 3181, 5751, + 2036, 1687, 3850, 5615, 5616, 1686, 2037, 3922, 169, 780, + 1688, 1686, 938, 1687, 2605, 5767, 5075, 2715, 3854, 1687, + 1689, 6120, 1688, 3139, 3069, 1690, 1339, 713, 1688, 3857, + 3858, 5416, 1339, 2082, 5301, 795, 5783, 5779, 3432, 1690, + 726, 4098, 2624, 5958, 795, 795, 795, 1339, 2691, 5960, + 780, 3911, 3912, 5783, 766, 3215, 2011, 1409, 3216, 824, + 5326, 2453, 3221, -904, 2047, 1686, 780, 1329, 2943, 2125, + 4775, 2438, 6088, 1687, 6109, 4778, 4779, 780, 780, 4526, + 1686, 2106, 1688, 2033, 3260, 795, 824, 767, 1687, 5890, + 3163, 1842, -1259, 4117, 4118, 4366, 4570, 1688, 3188, 1686, + 3243, 1689, 4016, 5617, 5726, 4508, 708, 1687, 2042, 2054, + 1459, 3852, 5769, 6194, 3877, 2492, 1688, 6121, 727, 759, + 2498, 1689, 2500, 6126, 3877, 3877, 6061, 1690, 6060, 6094, + 5780, 4634, 4367, 3441, 3441, 3441, 4497, 2683, 795, 5929, + 2047, 1686, 3965, 2000, 936, 760, 3969, 780, 5084, 1687, + 2077, 5779, 2413, 780, 4086, 4938, 1276, 2730, 1688, 760, + 4952, 5874, 2011, 6163, 1339, 4962, 3065, 2608, 1689, 2535, + 5402, 6122, 4006, 5929, 4863, 5618, 5181, 780, 6187, 6188, + 1689, 2545, 3259, 937, 2414, 2055, 1689, 1843, 5783, 1686, + 4101, 4571, 1456, 1686, 2783, 938, 1708, 1687, 2785, 4104, + 4658, 1687, 5119, 1844, 780, 780, 1688, 2158, 1690, 2433, + 1688, 2912, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, + 6035, 2803, 2803, 2609, 1410, 1709, 1710, 768, 1690, 1686, + 5556, 1376, 5546, 2684, 2078, 1686, 2079, 1687, 5435, 5781, + 1689, 1277, 1411, 1687, 5780, 795, 1688, 5608, 4007, 780, + 2001, 4729, 1688, 1686, 938, 1689, 1686, 4087, 2415, 780, + 4202, 1687, 5202, 935, 1687, 2847, 1380, 2380, -2669, 938, + 1688, 170, 5875, 1688, 1689, 1690, 2856, 849, 4574, 5783, + 740, 3273, 3274, 4903, 4904, 4575, 2632, 1690, 4210, 1711, + 2193, 1686, 4210, 1690, 4864, 1686, 5359, 1278, 2193, 1687, + 1477, 1363, 1354, 1687, 741, 1364, 885, 5203, 1688, 3426, + 938, 2685, 1688, 1354, 1354, 5685, 1689, 171, 6036, 938, + 938, 938, 4660, 3419, 3068, 1381, 2080, 936, 1539, 3983, + 3425, 2193, 1564, 111, 2888, 3432, 3715, 3374, 3062, 2416, + 3715, 5697, 743, 2913, 3723, 3067, 1365, 1690, 3017, 2206, + 3710, 1366, 5628, 5781, 3710, 3728, 3729, 2267, 1478, 6157, + 2988, 1479, 1690, 2381, 1689, 2918, 697, 5686, 1689, 6143, + 4943, 4905, 3420, 3877, 1712, 3841, 5204, 4626, 4661, 2382, + 3421, 1690, 3984, 2723, 1367, 1414, 936, 3063, 1480, 2726, + 2270, 1163, 6177, 4628, 698, 3064, 1481, 1811, 2919, 3711, + 2081, 936, 2927, 3711, 1689, 1686, 788, 3712, 2939, 738, + 1689, 3712, 3764, 1687, 6172, 883, 2951, 3877, 3427, 4298, + 1812, 4301, 1688, 1690, 2193, 1708, 780, 1686, 1689, 3768, + 780, 1689, 2400, 3069, 4944, 1687, 3171, 3172, 2193, 5115, + 4945, 3423, 936, 2977, 1688, 3719, 935, 789, 4906, 3719, + 2383, 936, 936, 936, 1709, 1710, 4371, 2802, 2802, 5177, + 5177, 5116, 2944, 3155, 5995, 1686, 1689, 791, 3714, 3913, + 1689, 1690, 3714, 1687, 1546, 1690, 1364, 5673, 3156, 3790, + 6102, 1681, 1688, 2286, 159, 2817, 937, 1683, 2652, 4650, + 5481, 5629, 2945, 805, 2653, 1521, 2654, 2307, 4659, 5674, + 4663, 4664, 4665, 4667, 4668, 935, 2948, 3109, 5723, 5132, + 5133, 1690, 3110, 3173, 3914, -1259, 6146, 1690, 1711, 5877, + 935, 3113, 1366, 5273, 1547, 5274, 1610, 3116, 5212, 795, + 795, 1686, 3147, 1179, 1179, 1690, 795, 5656, 1690, 1687, + 2803, 2803, 4202, 6118, 6118, 1627, 1628, 5675, 1688, 674, + -2675, 1402, -592, 795, 680, 795, -2098, -2098, 3087, 3088, + 3422, 935, 4243, 3268, 1189, 1189, 4207, 3825, 2082, 2655, + 935, 935, 935, 1690, -2677, 3065, 3915, 1690, 1183, 1183, + 1689, 6154, 5832, 3108, 787, 1188, 1188, 3713, 1548, 787, + 4888, 3713, 3782, 4661, 2949, 4521, 2839, 4889, 787, 4890, + 938, 1133, 1689, 1712, 787, 814, 3783, 938, 5772, 1139, + 5774, 5281, 4789, 1686, 1239, 816, 1339, 1180, 1180, 3916, + 1339, 1687, 5282, 3059, 1686, 3227, 1686, 1184, 1184, 3228, + 1688, 780, 1687, 3432, 1687, 1185, 1185, 4916, 2897, 698, + 1689, 1688, 1686, 1688, 4207, 2897, 1995, 1857, 5025, 5097, + 1687, 3213, -2683, 795, 3150, 780, 5107, 3218, 3220, 1688, + 1549, 4630, 2960, 4993, 4202, 828, 2964, 5037, 3121, 5885, + 3111, 899, -2686, 1193, 1193, 2965, 5042, 1113, 2839, 4631, + 4202, 3118, 5044, 780, 1115, 5008, 1207, 1690, -2689, -2339, + 3177, -2339, 5058, 3934, 780, 2968, 1186, 1186, 4041, 4042, + 5067, 5068, 4043, 4044, 4045, 1686, 1689, 4626, 1131, 1690, + 4202, 4618, 5220, 1687, 664, 6020, 6021, 5222, -2690, 4202, + 3204, 1163, 1688, 4628, 3209, 3210, 780, -2691, 787, 2047, + 2047, 1241, 936, 780, 3219, 787, 5903, 4656, 780, 936, + 4657, 4202, 2975, 4202, 780, 1686, 4744, 1690, 1339, -2693, + 4746, -2694, 824, 1687, 3447, 1368, 1686, 1686, 2952, 780, + 883, 1243, 1688, 3241, 1687, 1687, 3180, 1994, 3246, 174, + 175, 4697, 4698, 1688, 1688, 1257, 2802, 2802, 3917, 3918, + 3919, 1252, 5893, 5897, 1262, 1686, 1686, 4410, 1689, 2745, + 2746, 2011, 1557, 1687, 1687, 6166, 6168, 5177, 4026, 1689, + 4717, 1689, 1688, 1688, 2758, 4360, 2760, 4119, 4120, 4121, + 4352, 4795, 4353, 1690, 3730, 4737, 795, 1689, 5213, 4498, + 5214, 1265, 780, 1187, 1271, 1925, 4633, 4640, 4365, 3959, + 4642, 1930, 1931, 4067, 1274, 4069, 4070, 4646, 2779, 1604, + 5987, 4075, 4741, 5990, 1283, 5596, 2954, 1285, 4407, 4083, + 1759, 935, 1759, 4091, 5215, 4094, 2341, 2342, 935, 5425, + 5426, 1292, 4008, 4009, 2705, 4011, 4013, 3129, 3364, 3272, + 3366, 174, 175, 3715, 4755, 4328, 780, 3279, 1294, 780, + 1689, 795, 795, 5145, 5216, 4767, 1686, 3710, 5979, 5980, + 4236, 3152, 795, 1308, 1687, 1690, 4362, 1383, 1384, 2761, + 2762, 759, 1312, 1688, 2706, 938, 1690, 2648, 1690, 2649, + 174, 175, 5893, 1318, 1314, 1685, 5897, 1686, 1306, 1307, + 1689, 1310, 1686, 1311, 1690, 1687, 4596, 1323, 1321, 1686, + 1687, 1689, 1689, 4268, 1688, 4269, 3711, 1687, 4237, 1688, + 1324, 2707, 4252, 1360, 3712, 10, 1688, 1975, 1713, 1714, + 1715, 1716, 1717, 1718, 1719, 1720, 1396, 1398, 1976, 4952, + 1689, 1689, 3211, 2806, 1686, 2807, 2662, 1406, 1686, 3217, + 1422, 795, 1687, 795, 1354, 2903, 1687, 2265, 4254, 1408, + 1354, 1688, 3719, 1418, 4276, 1688, 2946, 1690, 2947, 1686, + 1686, 4630, 1428, 1429, 17, 1354, 5685, 1687, 1687, 4607, + 2955, 4609, 5134, 2958, 1430, 3714, 1688, 1688, 1393, 4631, + 800, 1435, 1686, 1686, 1686, 1440, 1207, 5217, 1765, 1443, + 1687, 1687, 1687, 5028, 5621, 1686, 1686, 1690, 1448, 1688, + 1688, 1688, 3059, 1687, 1687, 5685, 738, 936, 1690, 1690, + 4277, 4618, 1688, 1688, 5091, 3436, 1472, 3437, 5686, 2663, + 4632, 5218, 1686, 3973, 1459, 3974, 1474, 1974, 1686, 2708, + 1687, 1689, -2290, 1476, 174, 175, 1687, 1690, 1690, 1688, + 4029, 2709, 4030, 3889, 3781, 1688, 5300, 1980, 2875, 5348, + 4502, 4503, 1482, 1485, 4504, 4505, 1484, 5686, 5357, -3426, + 4506, 4507, 1689, 1486, 5893, 5897, -2292, 1689, 32, 4260, + 1487, 2947, 111, 3805, 1689, 1686, -3428, 1905, 1681, -3425, + 5331, -2290, 1354, 1687, 1683, 3373, 2017, 937, 1488, 2019, + 2019, -3427, 1688, 1975, 3713, 1494, 5777, 174, 175, 1495, + 4263, 780, 1874, 4267, 1976, 1874, 795, 795, 1497, 1689, + 37, 4994, 1977, 1689, 4271, -2292, 4272, 1974, 693, 39, + 1496, 5873, 2959, 4577, 1501, 4578, 935, 937, 41, 156, + 4749, 4998, 1874, 4999, 1689, 1689, 795, 1502, 1690, 1978, + 1503, 2710, 42, 1507, 2963, 2443, 2443, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, 1414, 1414, 1689, 1689, 1689, + 5739, 1504, 937, 4784, 3868, 1506, 3870, 111, 109, 1690, + 1689, 1689, 1505, 134, 1690, 2830, 3998, 2012, 1517, 1545, + 2012, 1690, 2966, 1975, 4685, -2290, -3659, 1759, 4686, 5000, + 4687, 5001, 4688, 1550, 1976, 1979, 106, 1689, 2350, 937, + 937, 1551, 1977, 1689, 3953, 154, 1565, 5144, 5874, 1566, + 780, 2711, 1567, 2745, 2746, 1572, 1690, 2400, 1759, -2292, + 1690, 1573, 693, 1980, 5002, 1574, 5003, -2290, 2758, 1978, + 2760, 4297, 2997, 5078, 1621, 5080, -2290, 1702, -940, 1575, + 4098, 1690, 1690, 1576, 1580, -2290, 4415, 5874, 2973, 1582, + 1689, 4773, 4774, 4033, 3398, 3399, 1414, 4782, 3400, -2290, + 3401, -2292, 3402, 1583, 1690, 1690, 1690, 157, 1653, 1722, + -2292, 1584, 1585, 5122, 694, 4626, 1974, 1690, 1690, -2292, + 6063, 787, 5092, 1586, 1874, 1979, 780, 6224, 1686, 4627, + 5030, 4628, 5105, -2292, 5106, 5113, 1687, 1874, 780, 5125, + 1568, 5126, 780, 5778, 1690, 1688, 2196, 2197, 795, -3560, + 1690, 1657, 5149, 1980, 5150, 2207, 2405, 2145, 5054, 5875, + 1339, 1339, 5057, 2761, 2762, 2871, 1587, 1588, 5039, 5065, + 2985, 1589, 3929, 1703, 5167, 5039, 5168, 2438, 795, 795, + 4685, 4231, 1975, 4240, 4686, 2268, 4691, 2271, 4688, 1704, + 4632, 1723, 5272, 1976, 3974, 1590, 6110, 1690, 5875, 4241, + -1656, 1977, 2284, 2285, 2287, 5318, 5372, 1591, 5373, 2290, + 2291, 5779, 4874, 5374, 795, 5373, 1592, 2308, 694, 158, + -1655, 4041, 4042, 2937, 5085, 4043, 4044, 4045, 1978, 1686, + 4056, 1724, 5376, 1821, 5377, 6152, 1604, 1687, 4479, 5370, + 1593, 5740, 5541, 5438, 1596, 4369, 1688, -2673, 5741, 1597, + 1598, 2262, 1604, 5777, 174, 175, 1605, 1606, 5581, 5554, + 1705, 1725, 4242, 5742, 5574, 693, 5575, 1607, 1608, 6173, + 780, 5593, 5563, 5511, 5565, 693, 4022, 4023, 4024, 4025, + 1702, 4027, 4028, 3441, 1979, -2262, 3898, 5626, -740, 5627, + 2028, 795, 795, 5632, 159, 5627, 780, 1298, 6186, 1611, + 1299, 1300, 4247, 1689, 5780, 1301, 2011, 5633, 5793, 5627, + 3066, 1612, 1980, 4248, 4249, 1781, 4946, -3560, 1613, 4071, + 4072, 1726, 4074, 4253, 4076, 4077, 4078, 4079, 4080, 4081, + 4082, 5415, 4084, 1614, 5794, 938, 4093, 5341, 5671, 5672, + 3974, 3974, 4250, 4251, 160, 5815, 1615, 5816, 4517, 4518, + 4519, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 3958, 1616, 4629, 4154, 5845, 4947, 5846, 5854, + 5018, 5855, 4588, 4591, 1354, 4594, 1703, 5889, 1354, 4030, + 2411, 6007, 1617, 6008, 5407, 5876, 3155, 1604, 4795, 1301, + 5743, 938, 1704, 633, 5358, -940, 6038, 1686, 4807, 4630, + 1618, 3156, 2808, 5744, 1689, 1687, 5877, 937, 1298, 1619, + 1690, 1299, 1300, 5781, 1688, 1620, 1559, 4631, 1728, 1622, + 5745, 694, 766, 6039, 1207, 5126, -1319, 1623, 2478, 1686, + -1319, 694, 5720, 68, 1624, 1625, 5795, 1687, 5796, 1730, + 6046, 1782, 6047, 4259, 1629, 5877, 1688, 1630, 1631, 4618, + 634, 986, 6055, 1783, 6056, 767, 2228, 2229, 2230, 2231, + 5778, -2523, 1632, 1705, 1686, 1633, -713, 936, 4620, 938, + 1634, -1319, 1687, 2443, 4265, 4625, -1319, 1635, 4641, 4266, + 6072, 1688, 5627, 1414, 1734, 4645, 4274, 5624, 1636, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 1637, 1743, 2232, 2233, 2234, 6074, 1354, 5627, 1784, -1319, + 6075, 1690, 5627, 4708, 5753, 6101, 1785, 5627, 6111, 1638, + 5627, 4275, 1639, 936, 3752, 4278, 1744, 6134, 5779, 5126, + 1006, 635, 4125, 1640, 1641, 3715, 5670, 1735, 6210, 161, + 6211, 1822, 1642, 162, 1643, 1228, 4705, 5090, 1646, 3710, + -2290, 1786, 1604, 2235, 2236, 1647, 1745, 1648, 1649, 3754, + 5746, 1650, 1651, 1974, 1652, 1746, 3017, 4946, 2643, 5096, + 5108, 5109, 1689, 1654, 4750, 1655, 1656, 1658, 1659, 4091, + 1660, 5797, 5597, 5766, -2292, 1823, 935, 1824, 1661, 986, + 937, 1664, 1665, 1668, 636, 768, 1974, 1669, 3711, 1670, + 4748, 936, 1671, 1672, 1689, 4888, 3712, 6159, 6160, 1673, + 1674, 6161, 4889, 6162, 4890, 1729, 163, 2237, 4947, 1020, + 5603, 5780, -2509, -2510, -3560, 4931, 1751, 1777, 5756, 1975, + 5609, 1778, 170, 1780, 5762, 5763, 1799, 3155, 1817, 1689, + 1976, 1818, 935, 1819, 3719, 1820, 1839, 1840, 1977, 937, + 1849, 1852, 3156, 1853, 2012, 1862, 2687, 1874, 1906, 1916, + 1918, 3225, 1975, 1787, 937, 1922, 1928, 3714, 1006, 1929, + 5782, 1935, 1936, 1976, 1938, 1978, 1940, 1825, 1944, 1690, + 2238, 1977, 5144, 693, 1959, 4280, 1960, 1961, 956, 957, + 1788, 1963, 960, 3799, 962, 5560, 964, 1972, 1702, 1706, + 5798, 1983, 1984, 1987, 3424, 937, 1997, 2003, 1978, 4948, + 2013, 1690, 2014, 2024, 937, 937, 937, -713, 4483, 3066, + 935, 5777, 174, 175, 2039, 2043, 4318, 1826, 2046, 2058, + 5781, 1979, 5408, 693, 2062, 2073, 2068, 2087, 1147, 5409, + 795, 637, 780, 693, 2093, 2097, 1690, 795, 795, 2099, + 4336, 2101, 2103, 4339, 4340, 3283, 2111, 1020, 2113, 1980, + 2115, 2116, 2117, 2119, 1979, 1686, 2120, 3441, 638, 2147, + 2155, 2167, 2169, 1687, 1827, 2239, 5793, 2210, 2211, 2212, + 4464, 2213, 1688, 2214, 2170, 2215, 3713, 5018, 4632, 2171, + 2175, 2176, 1980, 2178, 1703, 2179, 2181, 1148, -3527, 2193, + 5524, 5525, 5794, 5527, 5318, 2192, 4386, 2191, 2202, 3823, + 1704, 111, 111, 2209, 4842, 4843, 4844, 4845, 4846, 4847, + 4848, 4849, 4850, 4851, 4335, 4853, 4854, 4855, 4856, 4857, + 4858, 4859, 4860, 4861, 4862, 4949, 2251, 4866, 4867, 694, + 2223, 2264, 2240, 2865, 2265, 2277, 780, 2907, 795, 2279, + 2910, 780, 780, 2266, 2210, 2211, 5227, 787, 5228, 2282, + 5229, 2283, 5230, -940, 1828, 4602, 2922, 2292, 2331, 2335, + 5408, 1116, 780, 780, 2346, 2360, 4931, 5409, 2356, 4488, + -1319, 1705, 2375, 2379, 2705, 1789, 1829, 2941, 2406, 694, + 5996, 2407, 5777, 174, 175, 5799, 5434, 5584, 2434, 694, + 2435, -2983, 1706, 2440, 5795, 2441, 5796, -73, 2241, 2447, + 2242, 2458, 5296, 5297, 693, 5299, 2243, 1604, 2906, 2463, + 5304, 4568, 2466, 5308, 2706, 4954, 5311, 5312, 5778, 2486, + 4964, 2485, 2487, 3284, 5320, 2512, 5321, 3426, 5603, 2527, + 1689, 2528, 2529, 4950, 2530, 5327, 2532, 5793, 2533, 639, + 2534, 3419, 5016, 938, 5019, 1149, 2539, 1150, 3425, 1187, + 1187, 2707, 1790, 1686, 5029, -2110, 5718, 640, 1151, 2549, + 1791, 1687, 2553, 5794, 2552, 2555, 2244, 2558, 4329, 3285, + 1688, 2560, 5040, 1117, 1152, 2559, 2561, 5782, 2568, 2569, + 2578, 1118, 2582, 2579, 5045, 937, 5779, 2580, 5919, 2976, + 3420, 4595, 937, 2581, 4597, 2583, 1119, 2585, 3421, 2593, + 5066, 2586, 2991, 641, 2592, 3450, 1120, 1121, 1122, 2596, + 2245, 174, 175, 2597, 111, 109, 1123, 4355, 4356, 2606, + 4603, 4357, 2601, 4358, -940, 4359, 2612, 2620, 4134, 111, + 642, 2641, 5410, 2615, 2658, 5411, 3427, 1690, 643, 5797, + 5678, 2644, 5679, 5680, 5412, 2645, 2646, 3286, 3756, 1877, + 2647, 2650, 2659, 4718, 5176, 2660, 2668, 2672, 2676, 3423, + 694, 2673, 2675, 1686, 2689, 5795, 4719, 5796, 2688, 2708, + 2692, 1687, 4413, 1313, 2693, 936, 4949, 4418, 4419, 5780, + 1688, 2709, 4720, 4261, 5935, 2704, 2718, 2727, 4681, 5778, + 6215, 2728, 3048, -2534, 4684, 5856, 2719, 1686, 1354, 1354, + 2732, 2734, 2246, 2733, 2737, 1687, 2768, 2772, 1765, 2773, + 3287, 1367, 4721, 2247, 1688, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 3288, 3289, 1689, 2777, + 1686, 3290, 3291, 3292, 6136, 2781, 174, 175, 1687, 5185, + 5188, 5190, 5192, 2784, 2786, 5195, 5196, 1688, 2787, 2794, + 5200, 5291, 1686, 5206, 1124, 1153, 5210, 5779, 2797, 5185, + 1687, 2800, 2818, 5221, 5185, 2845, 1125, 2846, 2848, 1688, + 5410, 2864, 4264, 5411, 1877, 5303, 4740, 2867, 3422, 2869, + 2870, 2710, 5600, 5955, 4950, 2872, 2881, 2882, 5781, 2883, + 2889, 4722, 2928, 2886, 935, 2145, 2887, 2897, 2979, 3293, + 3009, 2904, 1644, 6043, 2908, 2911, 2920, 2921, 4336, 2923, + 5797, 3021, 2924, 2925, 2926, 986, 3033, 2930, 2938, 5183, + 2942, 4318, 5739, 2950, 2953, 795, 2956, 5981, 4771, 1974, + 2967, 5199, 2957, 1905, 1905, 1690, 2961, 3998, 1689, 5508, + 2962, 2971, 2974, 2972, 2978, 2984, 2989, -1456, 3028, 3294, + 5780, 2711, 4723, 2239, -1621, 2996, 1662, 3002, 2350, 1720, + 1666, 3036, 1878, 3011, 3038, 6223, 1126, 4796, 3012, 5548, + 3013, 3014, 1689, 654, 3039, 3041, 4805, 3049, 3071, 3091, + 3042, 3045, 4335, 3094, 111, 4797, 3119, 3050, 3095, 4033, + 937, 3051, 3096, 3103, 1006, 1975, 4588, 3104, 4591, 3099, + 4594, 3107, 4770, 3123, 1127, 1689, 1976, 3426, 3133, 780, + 1706, 3715, 3136, 3137, 1977, 4837, 3143, 3160, 1128, 780, + 2240, 3419, 3161, 3189, 3192, 3710, 3191, 1689, 3425, 6043, + 2012, 3193, 2012, 2012, 3265, 3196, 3197, 3226, 3233, 3237, + 3251, 1978, 4865, 3258, -715, 1690, 3266, 4929, 3262, 3269, + 6051, 3238, 3275, 5799, 3270, 3276, 3277, 3278, 3280, 5781, + 1154, 1155, 1156, 1157, 3281, 3319, 4724, 4725, 3282, 3322, + 3420, 3325, 3329, 3334, 3711, 3335, 5591, 3336, 3421, 1690, + 3337, 3241, 3712, 1020, 3361, 3365, 2241, 1878, 2242, 3338, + 2405, 4988, 3367, 3339, 2243, 5453, 3368, 1979, -715, 5458, + 5459, 745, 2400, 3340, 3341, 3342, 3343, 3344, 1879, 5404, + 795, 1759, 1690, 4422, 174, 175, 3427, 3155, 3345, 3371, + 3719, 3346, 1880, 3347, 1881, 1980, 3348, 766, 3349, 3350, + 6204, -1319, 3156, 3351, 1690, -1319, 3381, 6115, 3352, 3423, + 3383, 5491, 3353, 3714, 6214, 5782, 2082, 3239, 3354, 2145, + 6204, 3355, 3356, 3391, 2244, 5486, 1882, 6214, 4837, 3357, + 767, 3358, 3425, 5740, 3386, 3384, 3387, 3385, 787, 1883, + 5741, 3395, 3397, 4992, 6051, 3396, -1319, 3404, 3433, 3724, + 3725, -1319, 4920, 3726, 3739, 5742, 111, 3740, 3741, 4930, + 3747, 3760, -1664, 3792, 2032, 3791, 3779, -715, 2245, 3793, + 3780, 3806, 1884, 5409, 5487, 3715, 3807, -2262, 3819, 111, + 782, 938, 5488, 3821, -1319, 4726, 4727, 3022, 3820, 3710, + 1885, 3831, 3715, 795, 5799, 3835, 3829, 3837, 3838, 3839, + 2469, 3842, 795, 1879, 747, 3843, 3710, 3847, 3848, 3855, + 4423, 3856, 2468, 3880, 2839, 4817, 3894, 1880, 3903, 1881, + 5492, 2807, 3895, 3909, 3910, 4841, 5049, 3901, 3422, 5709, + 3930, 3941, 3713, 3935, 3943, -715, 3945, 3946, 3711, 3947, + 3963, 3964, 3967, 5490, 3968, 3991, 3712, 4004, 3995, -2013, + 4005, 1882, 4036, 4037, 4038, 3711, 4054, 4064, 4058, 4065, + 2246, 4066, 5158, 3712, 1883, 4096, 4068, 4102, 1886, 4107, + 768, 2247, 2782, 4109, 4114, 1887, -715, 4127, 4115, 4929, + 4425, 4190, 5743, 4193, 3719, 1888, 5782, 4199, 4202, 4207, + 4194, 4214, 728, 729, 4215, 5744, 4211, 1884, 5201, 1889, + 4221, 3719, 4224, 4225, 4226, 4227, 4270, 3714, 4281, 4282, + 4292, 4293, 5745, 936, 4304, 1885, 4296, 4306, 938, 4307, + 4308, 4321, 4309, 4318, 3714, 4310, 4931, 4311, 3817, 730, + -715, 1890, 4312, 745, 1891, 4319, 4322, 4426, 4427, 4428, + 4323, 5637, 4326, 4728, 4325, 1604, 4330, 5018, 4344, 3155, + 1892, 4345, 4350, 4363, 6183, 4369, 4368, 4429, 4370, 5306, + 4389, 744, 5489, 2350, 3156, 4381, 655, 4387, 731, 4408, + 4409, 4417, 4386, 111, 5141, 4414, 4462, 4467, -1780, -1785, + 4486, 1893, 4491, 795, 4494, 4495, 4837, 4500, 5166, 4510, + 4501, 4528, 4515, 1886, 4573, 4581, 4604, 4598, 4599, 4612, + 1887, 4623, 745, 780, 4618, 4568, 4666, 4644, 4651, 4678, + 1888, 4430, 4679, 4431, 4692, 4699, 4700, 2478, 746, 795, + 4696, 4702, 2981, 4711, 1889, 4712, 3713, 4742, 4287, -715, + 3981, 4751, 935, 4432, 4753, 4754, 4757, 1228, 4759, 5235, + 5243, 4758, 4807, 3713, 2418, 4763, 4776, 41, 5243, 4777, + 936, 4433, 5746, 5154, 4790, 6091, 1890, 4811, 4434, 1891, + 4806, 4812, 4813, 4818, 4814, 4838, 747, 4815, 4839, 4390, + 4840, 4852, 4539, 4435, 4881, 1892, 5410, 4880, 2400, 5411, + 4436, 4884, -256, 4885, 4886, 4893, 4895, 4922, 4909, 5197, + 5198, 2402, 4923, 4924, 4837, 4437, 4940, -715, 4931, 5211, + 4942, 938, 4956, 4955, 4965, 4966, 1893, 4805, 4805, 780, + 4967, 4968, 4969, 5234, 4970, 5298, 4972, 4973, 4974, 5314, + 4975, 2350, 4976, 4983, 5262, 4986, 4989, 4990, 780, 5324, + 5315, 4997, 5005, 5006, 4805, 747, 4932, 5009, 5013, 5015, + 5325, 4805, 4671, 732, 5010, 5035, 4837, 5328, 5043, 5329, + 5330, 5046, 4438, 5051, -2060, -1319, 5060, 5063, 5073, 5093, + 733, 5350, 4439, 5076, 5077, 5095, 748, 5094, 5078, 935, + 5079, 5099, 5081, 5080, 2012, 5082, 5089, 5101, 3715, 5112, + 937, 4391, 5104, 5366, 5111, 5114, 734, 5136, 4931, 4392, + 5120, 5151, 3710, 5140, 5128, 5138, 938, 5255, 5391, 795, + 4440, 5139, 5147, 5146, 4393, 5156, 5159, 5264, 5160, 5265, + 5269, 158, 5181, 4441, 4394, 4395, 4396, 5257, 5266, 5278, + 5276, 5277, 5279, 5271, 4397, 5286, 6219, 735, 5287, 5343, + 5288, 5289, 5294, 936, 5392, 5292, 937, 5305, 5243, 5182, + 5310, 3711, 4052, 5309, 4933, 5342, 5346, 5928, 5344, 3712, + 5367, 5363, 4442, 5365, 5368, 5381, 5382, 5394, 4443, 5395, + 5396, 5398, 5400, 5403, 5406, 5401, 5417, 5420, 5433, 5432, + 5437, 5443, 5450, 5442, 5451, 5454, 5498, 5507, 5509, 5521, + 2012, 5928, 5446, 5449, 5526, 5494, 159, 3719, 5496, 5502, + 5528, 5501, 5424, 5517, 5511, 5529, 5518, 5164, 5531, 5544, + 5533, 5550, 5551, 5555, 4796, 5431, 5561, 4945, 5566, 5168, + 3714, 5578, 4805, 5589, 937, 5592, 4444, 5595, 5598, 5599, + 5604, 5441, 5605, 4445, 5441, 5441, 5608, 5611, 936, 5447, + 5606, 5622, 5625, 4837, 5629, 5631, 5169, 5641, 5635, 5658, + 5659, 5457, 5682, 5693, 5684, 5302, 5493, 1759, 3243, -3650, + 5692, -2671, 935, -2670, -2674, 4446, -2684, -2688, 2228, 2229, + 2230, 2231, 4398, 5681, 5322, 5694, 5647, 5700, 5701, -372, + 4447, 4448, -3645, -3643, 4399, -3647, -3641, -3646, -3644, -3642, + 5702, 5651, 5707, 4449, 5710, 5711, 5712, 5928, 5719, 5862, + 5863, 5725, 5865, 5866, 5867, 5868, 5721, 5734, 4932, 5735, + 5738, 5758, 5759, 5764, 2232, 2233, 2234, 5243, 5770, 4422, + 5806, 5809, 5814, 5818, 5819, 5826, 5820, 5821, 5827, 5535, + 5828, 5537, 5495, 5831, 5840, 5843, 5844, 5847, 5851, 3713, + 5857, 5861, 5864, 5869, 3241, 5872, 3241, 5886, 5497, 5888, + 5900, 5906, 5908, 5910, 5912, 5911, 852, 935, 5914, 5917, + 5916, 5918, 5932, 5933, 5931, 2235, 2236, 5934, 5961, 4400, + 5968, 5539, 4837, 4805, 4837, 5939, 5536, 6216, 795, 4837, + 5983, 4805, 6002, 5997, 4401, 6004, 4837, 4837, 853, 6005, + 4805, 6012, 6029, 1110, 6015, 5558, 4837, 6018, 6023, 6024, + 6031, -2507, 4837, 4805, -2508, 4805, 6032, 6037, 6034, 855, + 4536, 6040, 4541, 5567, 6065, 6068, 4933, 6092, 856, 6062, + 5975, 6076, 4402, 5978, 6077, 5661, 6083, 749, 6087, 2237, + 6090, 5986, 6095, 6137, 5989, 6149, 4403, 6150, 1110, 857, + 780, -2060, 6151, 2738, 6158, -166, 6140, 6145, 6153, 6165, + 6170, 6174, 5049, 858, 6175, 6176, 5588, 6181, 859, 6182, + 6184, 6178, 6179, 6180, 6190, 6191, 6059, 6205, 3860, 3159, + 6218, 4095, 5356, 5354, 5355, 3950, 5761, 2739, 4509, 5510, + 5812, 860, 5941, 6085, 1333, 2445, 5393, 2044, 4876, 5503, + 4474, 641, 2238, 5375, 5587, 5657, 5594, 5722, 5070, 2426, + 4405, 3170, 4196, 4111, 2736, 1442, 4683, 2857, 2350, 5654, + 2858, 5653, 2859, 5500, 2740, 4979, 4555, 5441, 750, 5557, + 5419, 5634, 4762, 4768, 5121, 3026, 5967, 5612, 5639, 780, + 6045, 6139, 6099, 4837, 4837, 5871, 5610, 2034, 5295, 3271, + 861, 4977, 5808, 5337, 862, 5448, 4982, 5538, 5175, 6119, + 6022, 4568, 1110, 6026, 5957, 5946, 5947, 5948, 5949, 4730, + 4635, 4246, 863, 4693, 4677, 6028, 864, 865, 5965, 5026, + 4284, 780, 5383, 4745, 4747, 4743, 6144, 5243, 752, 753, + 6112, 5768, 6113, 5994, 3942, 111, 5243, 2239, 5999, 6001, + 5687, 5041, 5669, 5534, 4416, 5532, 4980, 866, 5335, 2148, + 2053, 4279, 2616, 3928, 867, 868, 5838, 3926, 5963, 3328, + 5691, 2770, 3836, 3151, 3392, 4124, 4611, 4837, 781, 2022, + 3794, 1362, 3887, 4837, 1973, 5696, 2021, 5007, 3994, 5391, + 2350, 4756, 3844, 3761, 1748, 3763, 2344, 3814, 3811, 4805, + 4314, 2403, 4234, 2253, 2199, 5086, 6086, 5944, 2400, 938, + 5713, 5717, 6169, 6167, 2240, 1965, 5275, 2667, 2263, 1966, + 2664, 2128, 4787, 5952, 5523, 5392, 5148, 5953, 2208, 4338, + 2657, 1967, 4303, 3253, 4913, 3990, 5582, 4912, 4302, 1968, + 1970, 5414, 5850, 5135, 1558, 5791, 5733, 2678, 5699, 5791, + 5405, 5088, 3424, 3997, 3993, 5427, 1385, 4740, 3245, 4736, + 1110, 2129, 5441, 2030, 1110, 4918, 763, 3363, 937, 754, + 5765, 2810, 4837, 1249, 2016, 4610, 3390, 4800, 5153, 1859, + 2241, 4019, 2242, 4786, 4783, 6135, 5805, 1110, 2243, 5623, + 1451, 1558, 1905, 5810, 1457, 2780, 1110, 1233, 2518, 3125, + 1234, 3126, 3881, 2023, 2130, 3164, 5652, 2400, 1236, 2131, + 5436, 2604, 2153, 4615, 6138, 5280, 6171, 4837, 5530, 6217, + 2132, 2133, 6221, 3140, 3388, 5640, 5429, 780, 1560, 795, + 3445, 3872, 1191, 2863, 3873, 5834, 4837, 780, 3090, 1192, + 3874, 936, 3869, 5833, 4343, 2842, 1763, 3866, 2244, 3865, + 1146, 2446, 2141, 1742, 2142, 3318, 5849, 2626, 4516, 3840, + 4921, 1110, 1110, 1110, 1110, 5012, 3944, 1558, 4569, 1282, + 772, 5579, 756, 757, 1110, 1921, 2741, 758, 1540, 2012, + 5263, 4608, 5982, 4197, 5791, 5813, 0, 0, 2860, 5515, + 0, 0, 2245, 0, 5887, 0, 0, 0, 0, 5899, + 0, 5791, 0, 0, 0, 5905, 2742, 2743, 0, 2744, + 2745, 2746, 2747, 2748, 0, 2749, 2750, 2751, 2752, 2753, + 2754, 2755, 2756, 0, 2757, 2758, 2759, 2760, 795, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5938, 0, 780, 0, 0, 0, + 0, 5669, 0, 0, 0, 4386, 4386, 0, 0, 0, + 935, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1558, 0, 0, 0, 0, 2134, 0, 0, 0, 0, + 0, 5717, 0, 0, 2246, 2135, 0, 0, 0, 5913, + 5733, 0, 0, 0, 0, 2247, 2136, 0, 738, 0, + 6058, 0, 2137, 795, 0, 0, 0, 6084, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2761, 2762, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2138, 0, 6003, 5791, 2139, 0, 0, + 0, 0, 0, 5441, 0, 5441, 5441, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 1558, + 0, 0, 0, 5830, 0, 0, 2140, 0, 6098, 0, + 1681, 5976, 5977, 5836, 6030, 0, 1683, 0, 0, 0, + 0, 0, 0, 5988, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2350, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 795, 0, 0, 0, 0, 0, 5791, 0, 0, + 0, 0, 3424, 0, 0, 0, 0, 0, 0, 5441, + 5441, 0, 0, 6069, 0, 0, 0, 0, 0, 0, + 5441, 0, 0, 0, 0, 0, 0, 0, 0, 1558, + 0, 0, 1558, 0, 6082, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5791, 5791, + 0, 0, 5940, 0, 6052, 0, 0, 6053, 0, 795, + 0, 0, 0, 0, 0, 6222, 0, 0, 0, 0, + 0, 0, 0, 5441, 0, 0, 0, 0, 0, 6207, + 0, 0, 0, 0, 6209, 0, 5791, 0, 6124, 0, + 0, 0, 0, 0, 0, 2350, 0, 0, 0, 1110, + 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, 3424, 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, 1558, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, + 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2350, 0, 0, 0, + 795, 0, 0, 0, 0, 795, 937, 0, 0, 0, + 2350, 0, 0, 0, 0, 0, 2350, 0, 0, 0, + 0, 0, 0, 2350, 0, 0, 1110, 1110, 0, 0, + 0, 0, 1110, 0, 0, 0, 1110, 1110, 1110, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 1558, 0, + 0, 0, 1110, 0, 0, 0, 1110, 1110, 1110, 0, + 1110, 1110, 1110, 1558, 1558, 0, 0, 0, 0, 0, + 1110, 0, 1110, 0, 0, 1110, 1110, 1110, 1110, 0, + 1110, 0, 1110, 1110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, + 1110, 0, 1110, 1110, 1110, 1110, 1110, 1110, 0, 1110, + 1110, 0, 1110, 1110, 0, 1110, 1110, 0, 0, 1110, + 1110, 0, 1110, 1110, 0, 1110, 0, 1110, 0, 0, + 0, 1110, 1110, 1110, 0, 0, 1110, 1110, 1110, 1110, + 0, 1110, 0, 937, 0, 0, 0, 0, 1110, 0, + 0, 0, 0, 0, 1110, 1110, 1110, 1110, 0, 0, + 0, 0, 0, 0, 0, 1110, 1110, 0, 1110, 1110, + 0, 0, 1110, 1110, 1110, 1110, 1110, 1110, 1110, 1110, + 1110, 1110, 1110, 1110, 1110, 0, 0, 1110, 0, 0, + 0, 0, 1558, 0, 0, 0, 0, 0, 0, 1558, + 0, 0, 0, 0, 0, 0, -1062, -1062, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4422, 174, + 175, 0, 1110, 0, 0, 0, -1868, -1868, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1868, 0, + 1558, 0, 0, 0, 0, 0, 4529, 0, 4530, 4531, + 0, 0, 0, 0, 2012, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4532, 0, 4533, 2157, 0, 0, 0, 0, 4534, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, + 0, -1868, 0, 0, 0, 0, 0, 0, 0, 0, + 4535, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3817, 0, 937, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, -1868, + 1110, 0, 0, -1868, 0, 4423, 0, -1868, 4422, 174, + 175, 0, 0, 0, 0, 0, -1868, -1868, 0, 0, + 0, 0, 0, -1868, 1558, 0, 0, -1868, 0, 0, + 0, 0, -1868, 4536, -1868, 1110, 0, 0, -1868, 0, + 0, 0, 0, 0, 0, 0, -1868, 0, -1868, 0, + 0, 0, 0, -1868, 0, 0, 0, 0, 0, 0, + 0, -904, 0, -904, 4537, 0, 4538, 0, 0, 0, + 0, 0, 0, -1868, 0, 4425, 0, 4539, 0, 0, + 0, 937, 0, -1868, 0, 0, -1868, 0, 0, 2032, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4540, 0, 0, 0, 0, 0, -1868, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1110, 0, 0, 0, 0, -1868, 1558, 0, 1558, -1868, + 0, 0, 4426, 4427, 4428, 4423, 0, 0, -1868, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, + 0, 0, 4429, 0, 0, 0, 0, -1868, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1868, 0, 0, 0, 0, 0, -1868, -1868, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1868, 0, -1868, 0, 0, 0, 4541, 0, + 0, 0, 0, 0, 0, 4425, 4430, 0, 4431, 0, + 0, 0, 4420, 0, 4421, 0, 0, 0, 0, 4422, + 174, 175, 0, 0, 0, 0, 0, 0, 4432, 0, + 0, 0, 0, 0, 0, 4542, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4433, 0, 0, 0, + 0, 0, 0, 4434, 0, 0, 0, 0, 0, 0, + 0, 0, 4426, 4427, 4428, 0, 0, 0, 4435, 0, + 0, 0, -904, 1110, -904, 4436, 0, 0, 0, 4543, + 4544, 0, 4429, 0, 0, 0, 4545, 0, 0, 0, + 4437, 0, 0, 0, 0, 0, 0, 0, 4546, 0, + 2032, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1558, 1110, 0, 0, 4547, + 0, 0, 0, 0, 1110, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4430, 0, 4431, -1868, + 0, 0, 0, 4548, 0, 0, 4423, 4438, 0, 0, + 0, 0, 0, 0, 0, 0, -904, 4439, 4432, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4424, 0, + 0, 0, 0, 0, 0, 0, 4433, 0, 1110, 0, + 0, 0, 0, 4434, 0, 0, 0, 0, 0, 1558, + 1558, 0, 0, 0, 0, 4440, 0, 0, 4435, 0, + 0, 0, 0, 0, 0, 4436, 0, 0, 4441, 0, + 4549, 0, 0, 0, 0, 0, 4425, 0, 0, 0, + 4437, 0, 1110, 1110, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4442, 0, 0, + 0, 0, 0, 4443, 0, 0, 0, -1868, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1868, -1868, 0, + 0, 1558, 0, 4426, 4427, 4428, 0, 4438, 4550, -1868, + 0, 1110, 0, 0, 1558, 0, 0, 4439, 0, 4551, + 4552, 4553, 0, 4429, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 1110, 1110, 0, 1110, 1110, 0, 0, + 0, 4444, 0, 0, 2157, 1110, 0, 1110, 4445, 0, + 0, 0, 0, 0, 0, 4440, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4441, 0, + 0, 0, -1868, 0, 0, 0, 0, 4430, 1110, 4431, + 4446, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4447, 4448, -904, 0, 4432, + 0, 0, 0, 0, 1110, 0, 0, 4442, 4449, 0, + -1868, 0, 4554, 4443, -1868, 0, 1110, 4433, -1868, 0, + 1558, 0, 0, 0, 4434, 0, 0, -1868, -1868, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, -1868, 4435, + 1110, 0, 0, -1868, 0, -1868, 4436, 0, 0, -1868, + 0, 0, 0, 0, 937, 0, 1110, -1868, 0, -1868, + -1868, 4437, 0, 0, -1868, 0, 0, 0, 0, 0, + 2145, 4444, 0, 2158, 0, 0, -1062, 0, 4445, 0, + 0, 0, 0, 0, -1868, 0, 0, 0, 0, 0, + -1868, 0, -1868, 1110, -1868, -1868, -1868, -1868, 0, 0, + 1110, 0, 0, 0, 0, 0, 0, 1558, 0, 0, + 4446, 0, 0, 0, 0, 0, 0, -1868, 4438, 0, + 0, 0, 0, 0, 0, 4447, 4448, 0, 4439, 0, + 0, 0, 0, 0, 0, 0, -1868, 0, 4449, 0, + -1868, 0, 0, 0, 0, 1558, 1558, 0, 0, -1868, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4440, 0, -1868, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4441, + 0, 0, 0, -1868, 0, 0, 0, 0, 0, 0, + -1868, 0, 0, 0, 0, 0, 1110, 0, 0, 0, + 0, 0, 4871, -1868, 0, -1868, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4442, 0, + 0, 0, 0, 0, 4443, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1558, 0, 1558, 1558, 1558, 0, 1110, 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, 4444, 0, 0, 0, 0, 1110, 0, 4445, + 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, 4446, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4447, 4448, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4449, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1558, 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, 1110, 0, + 0, 0, 1110, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 0, 1110, 1110, 0, 1110, 1110, + 1110, 1110, 0, 1110, 0, 1110, 1110, 0, 1110, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, -1868, 0, + 0, 1110, 1110, 1110, 0, 0, 0, 0, 0, 0, + 0, 1110, 1110, 1110, 0, 1110, 0, 1110, 0, 1110, + 0, 1110, 0, 1110, 0, 0, 0, 0, 1110, 1110, + 0, 1110, 1110, 1110, 0, 0, 0, 1110, 0, 0, + 1110, 0, 0, 0, 0, 0, 0, 0, 0, 1110, + 0, 0, 1110, 0, 1110, 1110, 1110, 0, 0, 1110, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 1, 1110, 2, 0, 1110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 1110, 1110, + 1558, 1110, 0, 0, 0, 0, 1110, 0, 0, 0, + 0, 0, 0, 0, 0, 1111, 0, 1558, 0, 0, + 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 6, 0, 7, 0, 8, + 0, 0, 0, 0, 1110, 0, 0, 9, 0, 0, + 1111, 0, 0, 0, 0, 0, 1110, 0, 0, 0, + 0, -1868, 0, 1110, 0, 0, 0, 0, 10, 0, + 11, 12, 174, 175, 2158, 0, 0, 13, 0, 1558, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1868, 0, -1868, 14, 0, -1868, -1868, 15, 0, + 1194, 0, 1195, 0, 0, 0, 0, 0, 16, 0, + 661, 0, 1110, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 1163, 0, 0, 0, 18, 0, + 0, 0, 1196, 1197, 1110, 0, 0, 0, 19, 0, + 20, 0, 1198, 0, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 11, 12, 0, 0, + 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 26, 0, 0, 1199, 0, + 0, 0, 0, 1110, 0, 0, 27, 28, 29, 0, + 30, 0, 1200, 0, 0, 31, 0, 0, 0, 0, + 0, 32, 0, 0, 1110, 33, 34, 35, 0, 0, + 0, 0, 0, 0, 0, 0, 1558, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 36, 0, 37, 0, 38, 0, 1201, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 1202, + 40, 41, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1111, 0, 0, 0, 1111, 43, 44, 0, + 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 0, 0, 0, 0, 1203, 47, 0, 0, 0, 1111, + 0, 0, 1558, 0, 0, 0, 0, 0, 1111, 0, + 0, 0, 0, 0, 1110, 48, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1204, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 0, 0, 1205, 0, 0, + 0, 0, 0, 0, 0, 0, 1206, 0, 51, 1110, + 0, 0, 0, 1111, 1111, 1111, 1111, 0, 0, 1207, + 0, 1110, 0, 52, 1110, 0, 1111, 0, 0, 0, + 1208, 0, 0, 0, 53, 0, 0, 54, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1209, 0, 56, 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, -2262, 1210, 0, 0, 1211, 0, 1212, 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, 1213, 1214, 0, 0, 0, + 0, 1215, 1216, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1217, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1218, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1219, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, + 0, 0, 59, 0, 0, 0, 0, 1111, 0, 0, + 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, + 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 62, 0, 0, 1220, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1221, 0, 0, 63, 0, 0, 64, 0, 0, 1222, + 0, 0, 1223, 1224, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1225, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 66, 1110, + 1110, 0, 0, 0, 1110, 0, 0, 0, 0, 0, + 0, 0, 0, 1558, 1226, 0, 0, 0, 0, 0, + 0, 0, 1227, 0, 67, 0, 1110, 0, 1110, 0, + 1110, 0, 1110, 0, 0, 0, 0, 0, 0, 0, + 0, -3286, 0, 1228, 0, 0, 68, 1110, 0, 0, + 0, 0, 0, 1558, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1110, 1110, 0, 0, + 0, 1110, 0, 1110, 0, 1110, 0, 0, 0, 0, + 1110, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3286, 0, 0, 0, 0, 0, 0, + 1229, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1558, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 1111, 1110, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1558, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 1111, + 0, 0, 0, 0, 1111, 0, 0, 0, 1111, 1111, + 1111, 0, 0, 0, 0, 0, 0, 0, 1111, 1111, + 0, 0, 0, 0, 1111, 0, 0, 0, 1111, 1111, + 1111, 0, 1111, 1111, 1111, 1110, 0, 0, 0, 0, + 0, 0, 1111, 0, 1111, 1110, 0, 1111, 1111, 1111, + 1111, 0, 1111, 0, 1111, 1111, 0, 0, 0, 1110, + 0, 1558, 1110, 0, 0, 0, 0, 0, 1111, 1111, + 1111, 1111, 1111, 0, 1111, 1111, 1111, 1111, 1111, 1111, + 0, 1111, 1111, 0, 1111, 1111, 0, 1111, 1111, 0, + 0, 1111, 1111, 0, 1111, 1111, 0, 1111, 0, 1111, + 0, 0, 0, 1111, 1111, 1111, 0, 0, 1111, 1111, + 1111, 1111, 0, 1111, 0, 0, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 1111, 1111, 1111, 1111, + 0, 0, 0, 0, 0, 0, 0, 1111, 1111, 0, + 1111, 1111, 0, 0, 1111, 1111, 1111, 1111, 1111, 1111, + 1111, 1111, 1111, 1111, 1111, 1111, 1111, 0, 0, 1111, + 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, 1111, 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, 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, + 1110, 1110, 1, 1110, 0, 0, 0, 0, 0, 0, + 1111, 0, 1111, 0, 0, 0, 1110, 1110, 1110, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1110, 1110, 0, 0, 0, 3, 4, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 1110, 6, 0, 7, 0, 8, + 0, 0, 0, 0, 0, 0, 1110, 9, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 11, 12, 0, 0, 0, 1110, 0, 13, 0, 0, + 1110, 1110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 15, 1110, + 0, 0, 1111, 1110, 0, 0, 0, 0, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 20, 0, 0, 0, 21, 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, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 23, 24, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25, 26, 0, 0, 0, 0, + 0, 0, 0, 4422, 174, 175, 27, 28, 29, 0, + 30, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 32, 0, 0, 0, 33, 34, 35, 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, 1111, -904, 0, -904, 0, + 0, 36, 0, 37, 0, 38, 0, 0, 0, 0, + 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, + 40, 41, 0, 0, 2032, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 42, 0, 0, 1111, 0, + 0, 0, 0, 0, 1110, 1110, 1111, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, + 45, 0, 0, 0, 0, 0, 0, 46, 0, 0, + 4423, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 48, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 4425, 0, 0, 0, 1111, 1111, 1111, 0, 51, 4130, + 4131, 0, 0, 0, 4132, 4133, 0, 0, 0, 0, + 0, 0, 0, 52, 4134, 0, 0, 0, 0, 0, + 0, 0, 0, 1110, 53, 0, 1558, 54, 0, 0, + 55, 0, 0, 0, 0, 0, 0, 0, 0, 4135, + 0, 0, 0, 0, 0, 56, 0, 4426, 4427, 4428, + 0, 0, 4136, 1111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4429, 4137, 0, + 5945, 1111, 0, 0, 0, 1111, 1111, 1110, 1111, 1111, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 1111, + 0, 0, 0, 0, 0, 0, 1558, 0, 4139, 1112, + 0, 0, 0, 0, 1110, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4140, 4141, 4142, + 1111, 4430, 0, 4431, 0, 0, 0, 4143, 4144, 4145, + 0, 0, 0, 0, 0, 0, 0, 1110, 0, 0, + 0, -904, 0, 4432, 0, 4146, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 57, + 0, 4433, 0, 0, 0, 0, 0, 0, 4434, 0, + 0, 1111, 0, 0, 0, 0, 0, 4147, 0, 0, + 0, 0, 1111, 4435, 0, 0, 0, 0, 58, 0, + 4436, 0, 59, 0, 0, 0, 0, 0, 1111, 0, + 0, 0, 60, 0, 4149, 4437, 0, 0, 0, 0, + 61, 0, 0, 0, 0, 0, 1110, 0, 1110, 0, + 0, 0, 62, 0, 0, 0, 0, 4150, 4151, 4152, + 0, 0, 0, 0, 0, 1111, 0, 0, 0, 0, + 0, 0, 1111, 63, 0, 0, 64, 1112, 0, 4153, + 4154, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4438, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4439, 0, 1112, 0, 0, 0, 0, 65, + 0, 0, 0, 1112, 0, 0, 0, 0, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 4155, 0, 4156, + 4157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4440, 0, 0, 0, 67, 0, 4158, 0, 0, 0, + 0, 0, 0, 4441, 0, 0, 0, 0, 0, 1110, + 0, 0, 0, 0, 0, 0, 68, 0, 1111, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 1112, + 1112, 1112, 4159, 4160, 0, 0, 0, 0, 0, 0, + 0, 1112, 4442, 0, 0, 0, 0, 0, 4443, 0, + 0, 1111, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 4162, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4444, 0, 0, 1111, + 0, 0, 0, 4445, 0, 0, 0, 0, 1110, 4163, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1110, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4446, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4447, 4448, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4449, 0, 0, 0, 0, 0, 0, + 0, 4164, 4165, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4166, 4167, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4168, + 1111, 0, 0, 0, 1111, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 1111, 0, 1111, 1111, 0, + 1111, 1111, 1111, 1111, 0, 1111, 0, 1111, 1111, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 1111, 1111, + 0, 0, 0, 1111, 1111, 1111, 0, 0, 0, 0, + 0, 0, 0, 1111, 1111, 1111, 0, 1111, 0, 1111, + 0, 1111, 0, 1111, 0, 1111, 0, 0, 0, 0, + 1111, 1111, 0, 1111, 1111, 1111, 0, 0, 0, 1111, + 0, 0, 1111, 4170, 0, 0, 4171, 0, 0, 4172, + 0, 1111, 0, 0, 1111, 0, 1111, 1111, 1111, 0, + 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4174, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 1111, 0, 0, 1111, 0, + 0, 0, 4175, 0, 0, 0, 0, 0, 1111, 1111, + 1111, 1111, 0, 1111, 0, 0, 1112, 0, 1111, 0, + 1110, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1110, 0, 0, 0, 0, 0, + 0, 0, 1558, 0, 0, 0, 0, 0, 1110, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 1110, 0, 0, 0, 0, 1111, 0, + 0, 0, 0, 0, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 1112, 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, 1111, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 0, 1112, + 0, 0, 0, 1112, 1112, 1112, 1111, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 0, 1112, + 0, 0, 0, 1112, 1112, 1112, 0, 1112, 1112, 1112, + 0, 0, 0, 0, 0, 0, 0, 1112, 0, 1112, + 0, 0, 1112, 1112, 1112, 1112, 0, 1112, 0, 1112, + 1112, 1110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 1112, 1112, 1112, 0, 1112, + 1112, 1112, 1112, 1112, 1112, 1111, 1112, 1112, 0, 1112, + 1112, 0, 1112, 1112, 0, 0, 1112, 1112, 0, 1112, + 1112, 0, 1112, 0, 1112, 0, 1111, 0, 1112, 1112, + 1112, 0, 0, 1112, 1112, 1112, 1112, 0, 1112, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 1112, 1112, 1112, 1112, 0, 0, 0, 0, 0, + 0, 0, 1112, 1112, 0, 1112, 1112, 0, 0, 1112, + 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1112, + 1112, 1112, 0, 0, 1112, 0, 0, 0, 4422, 174, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 933, 0, 0, 0, 0, 0, + 0, 1110, 0, 0, 0, 0, 5332, 0, 4530, 1112, + 933, 0, 0, 0, 0, 0, 1237, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4532, 0, 0, 0, 0, 0, 0, 0, 5333, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2032, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5334, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1558, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 0, 4423, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 0, 1111, 0, 0, 0, + 0, 0, 1558, 0, 0, 1112, 0, 1112, 0, 0, + 0, 0, 0, 4536, 1110, 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, 1112, 0, 0, 0, 4538, 0, 0, 0, + 0, 0, 0, 0, 0, 4425, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4540, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1110, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4426, 4427, 4428, 0, 0, 0, 0, 933, + 0, 933, 0, 933, 933, 0, 0, 1112, 0, 0, + 933, 0, 4429, 933, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4541, 0, + 0, 0, 0, 0, 0, 0, 4430, 0, 4431, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4432, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4433, 0, 0, 0, + 0, 0, 0, 4434, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4435, 0, + 0, 0, 0, 0, 0, 4436, 0, 0, 0, 4543, + 0, 0, 0, 0, 0, 1110, 4545, 0, 0, 1110, + 4437, 1111, 1111, 0, 0, 0, 1111, 0, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 4547, + 1111, 0, 1111, 0, 1111, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1111, + 0, 0, 0, 1112, 0, 0, 0, 4438, 0, 0, + 0, 1112, 1112, 0, 0, 0, 0, 4439, 1111, 1111, + 0, 0, 0, 1111, 0, 1111, 0, 1111, 0, 0, + 0, 0, 1111, 0, 933, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4440, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 4441, 0, + 4549, 0, 0, 0, 0, 0, 1110, 0, 0, 1111, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4442, 0, 1112, + 1112, 1112, 0, 4443, 0, 1111, 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, 1897, 0, 0, 0, 0, 0, 0, 1112, 0, + 0, 4444, 0, 0, 0, 0, 0, 0, 4445, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 1112, 1112, 0, 1112, 1112, 0, 0, 1111, 0, 0, + 0, 0, 1112, 0, 1112, 0, 0, 1111, 0, 0, + 4446, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 1111, 4447, 4448, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 4449, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 933, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 1112, 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, 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, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 1111, 1111, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1076, 1111, 1111, + 1111, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1111, 1111, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1111, 0, + 0, 0, 0, 0, 1112, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 0, + 0, 0, 1111, 1111, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 0, 1111, 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, 1439, 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, 1112, 0, 0, 0, 1112, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 1112, 1112, 0, 1112, 1112, 1112, 1112, 0, + 1112, 0, 1112, 1112, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 1112, 1112, + 1112, 0, 0, 0, 0, 0, 0, 0, 1112, 1112, + 1112, 0, 1112, 0, 1112, 0, 1112, 0, 1112, 0, + 1112, 0, 0, 0, 0, 1112, 1112, 0, 1112, 1112, + 1112, 0, 0, 0, 1112, 0, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 1112, + 0, 1112, 1112, 1112, 0, 0, 1112, 0, 1569, 0, + 0, 0, 0, 0, 0, 0, 1111, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1112, 0, + 1112, 1595, 0, 1112, 0, 0, 0, 0, 0, 0, + 1609, 0, 0, 1112, 1112, 1112, 1112, 0, 1112, 0, + 0, 0, 0, 1112, 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, 1112, 0, 0, 0, 0, 0, 0, 1682, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 1, + 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1111, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 4, 0, 0, 0, 0, 0, 1112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 7, 0, 8, 0, 933, 0, + 0, 1112, 0, 0, 9, 0, 0, 0, 0, 1111, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 10, 0, 11, 12, 0, + 0, 0, 0, 0, 13, 0, 1111, 1111, 933, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1111, + 1112, 0, 0, 933, 17, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 2822, 0, 0, 0, + 0, 1112, 0, 0, 0, 19, 0, 20, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1875, + 933, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 24, 0, 0, 0, 0, 0, 0, 1111, 0, + 1111, 25, 26, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 27, 28, 0, 0, 30, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 32, 0, + 0, 0, 33, 34, 35, 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, 36, 0, + 37, 1112, 38, 0, 0, 0, 0, 0, 0, 39, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, + 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 43, 0, 1112, 45, 0, 0, + 0, 0, 0, 2066, 46, 0, 0, 0, 1112, 0, + 0, 1112, 47, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2151, 0, 2151, 51, 0, 0, 0, 0, + 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 3058, 0, 0, 0, 0, 1111, 1111, 0, 0, + 0, 53, 0, 0, 54, 0, 0, 55, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 2198, 0, 0, 0, + 2203, 0, 2205, 0, 0, 0, 0, 0, 0, 0, + 2220, 2221, 0, 0, 0, 0, 2250, 0, 0, 0, + 2255, 2256, 2257, 0, 2259, 2260, 2261, 0, 0, 0, + 0, 0, 0, 0, 2269, 0, 2272, 0, 0, 2273, + 2274, 2275, 2276, 0, 0, 0, 2280, 2281, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 933, 0, + 2293, 2294, 2301, 2305, 2306, 0, 2309, 2310, 2311, 2314, + 2315, 0, 0, 2318, 2319, 0, 2325, 2326, 0, 2329, + 2330, 0, 0, 0, 2334, 0, 2336, 2337, 0, 2339, + 0, 2340, 0, 1897, 0, 2343, 2301, 2345, 0, 0, + 2351, 0, 2353, 2354, 0, 2355, 57, 0, 0, 0, + 0, 0, 2359, 0, 0, 0, 0, 0, 2361, 2362, + 2363, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 58, 0, 0, 0, 59, + 0, 0, 0, 0, 0, 0, 1112, 1112, 0, 60, + 0, 1112, 0, 0, 0, 0, 0, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, + 0, 0, 0, 1112, 0, 1112, 0, 1112, 0, 1112, + 0, 0, 0, 0, 0, 0, 2459, 0, 0, 0, + 63, 0, 0, 64, 1112, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 0, 0, 0, 1112, 0, + 1112, 0, 1112, 0, 0, 0, 65, 1112, 0, 0, + 0, 0, 1111, 0, 0, 66, 0, 0, 0, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1111, 0, 0, 0, + 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 0, 0, 1112, 0, 0, 0, 0, 0, + 0, 0, 0, 68, 0, 1111, 0, 0, 1112, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 933, 0, 2570, 0, 2575, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 933, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2598, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3418, 933, 0, 0, 0, + 0, 0, 0, 0, 0, 933, 933, 933, 0, 0, + 3058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3708, 0, 0, 0, 3708, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1111, 0, 0, 1112, 0, 0, 1112, + 0, 0, 0, 0, 2674, 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, 2698, 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, 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, 1111, 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, 2811, 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, + 2866, 0, 0, 0, 0, 0, 0, 0, 2873, 2874, + 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 933, 0, 0, 0, + 0, 0, 0, 933, 0, 0, 0, 1112, 1112, 0, + 1112, 0, 0, 0, 1111, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 1112, 1112, 1111, 0, 0, 0, + 0, 0, 2893, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1112, 1112, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 2932, 2934, 2936, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1111, 0, 1112, 0, 0, 0, 0, 1112, 1112, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2998, 0, 0, 0, 1111, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3006, + 0, 3007, 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, 3032, 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, 3046, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3085, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3085, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3106, 0, 0, 0, 0, 3708, + 0, 0, 0, 0, 0, 0, 0, 1111, 0, 0, + 3112, 1111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3132, 0, 0, + 0, 0, 0, 0, 2575, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 1112, 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, 0, 0, 1111, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3222, 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, 3247, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1112, 0, 3247, 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, 3331, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1112, 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, 1112, 1112, 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, 1112, 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, 3446, 0, 0, 0, 3448, 0, 0, 3449, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 1112, 0, 3727, 0, 0, + 0, 0, 3731, 3732, 3733, 3734, 0, 3735, 0, 3736, + 3737, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3742, 3743, 0, 0, 0, 3744, 3745, 3746, 0, 0, + 0, 0, 0, 0, 0, 3748, 3749, 3750, 0, 3751, + 0, 3753, 0, 3755, 0, 3757, 0, 3759, 0, 0, + 0, 0, 2311, 3762, 0, 2311, 0, 3765, 0, 0, + 0, 3766, 0, 0, 3767, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3774, 0, 3775, 3776, + 3777, 0, 0, 3778, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1112, 0, 0, 0, + 3800, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3810, 3813, 0, 0, 3818, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4460, 4460, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 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, 3851, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 3085, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 1112, 0, 0, 0, 0, 0, 4460, 0, + 0, 0, 0, 0, 0, 0, 2575, 0, 0, 0, + 0, 933, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2575, 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, 933, 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, 3986, 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, 933, 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, 0, + 0, 3708, 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, 4110, 0, + 0, 0, 0, 0, 0, 0, 0, 1112, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 0, 0, 0, 4195, 0, 0, 0, 0, 0, 0, + 1112, 0, 0, 0, 0, 4200, 0, 0, 4201, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4460, 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, 1112, 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, 0, 0, 4460, 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, 1112, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4229, 4230, 0, 0, 0, 4235, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3418, 0, 0, 0, 0, 0, 0, + 4255, 0, 4256, 0, 4257, 0, 4258, 0, 0, 933, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4273, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1112, 0, 0, 0, 0, + 4294, 4295, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3247, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1112, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3085, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3085, 0, 0, 0, 3085, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2575, 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, 1112, 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, 4460, 0, + 4460, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1112, 0, 0, 0, 0, 0, 0, 4485, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3247, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3247, 0, 0, 4499, 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, 4460, 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, 1112, 0, 0, 0, 1112, 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, 3418, 0, 0, 0, 3708, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4706, 4707, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4714, 4715, 4716, 0, 0, 0, 0, 5485, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4738, 4739, 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, 4761, + 0, 3708, 0, 0, 0, 0, 0, 933, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3708, 3085, + 0, 0, 0, 0, 3085, 3085, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2575, 0, 0, 0, 2575, 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, 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, 933, 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, 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, 4984, 4985, + 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 933, 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, 4460, 3247, 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, 4460, 3708, 0, 0, 4460, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 933, 0, 0, 0, 0, 0, 0, 0, + 0, 3247, 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, 3085, 3085, + 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, 2575, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4460, 0, 0, 0, 0, + 0, 0, 0, 4460, 0, 0, 0, 0, 0, 4460, + 4460, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4460, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4460, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5268, 0, 5270, 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, 0, 4460, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4460, + 0, 0, 0, 4460, 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, 4460, 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, 5379, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4460, 6064, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5399, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4460, 0, 0, 0, 0, + 0, 0, 3247, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3085, 3085, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4460, + 0, 4460, 4460, 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, 4460, 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, 4460, 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, 4460, 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, 933, 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, 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, 3247, 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, 2575, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5636, 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, 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, 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, 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, + 0, 0, 0, 0, 0, 5839, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 949, + 0, 0, 0, 0, 950, 951, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 952, 953, 0, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 0, + 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 966, 967, 968, 969, 0, 5962, 0, + 0, 0, 0, 0, 970, 971, 0, 972, 0, 0, + 0, 0, 0, 0, 973, 974, 0, 0, 975, 976, + 977, 978, 0, 979, 176, 0, 980, 981, 0, 0, + 0, 0, 0, 0, 0, 982, 0, 0, 983, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 984, 985, 986, 0, + 987, 0, 0, 0, 0, 0, 0, 0, 988, 989, + 990, 178, 0, 0, 0, 0, 0, 991, 0, 0, + 179, 0, 1682, 0, 0, 0, 992, 0, 0, 993, + 0, 0, 0, 0, 0, 0, 0, 0, 994, 0, + 995, 0, 996, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 997, 998, 0, 999, + 0, 0, 0, 1000, 180, 0, 0, 0, 1001, 0, + 0, 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, + 0, 0, 0, 0, 0, 0, 1011, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1015, 0, 0, 0, 0, 0, + 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1020, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, + 0, 39, 0, 0, 1024, 1025, 0, 0, 0, 2575, + 41, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, + 1030, 199, 200, 201, 202, 203, 204, 1031, 206, 207, + 208, 209, 210, 211, 212, 1032, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 1033, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 1038, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 1039, 1040, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 2575, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 1041, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 1042, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 1043, 1044, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 1045, 403, 404, 405, 406, 407, 1046, 409, + 410, 411, 412, 413, 414, 415, 416, 1047, 1048, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 1049, 441, 442, 443, 444, 445, 446, 447, 1050, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 1051, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 1052, 505, 506, 507, 508, + 509, 510, 1053, 512, 513, 514, 515, 516, 517, 1054, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 1055, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 1056, + 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 1062, 590, 1063, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 1064, 604, 1065, 606, 607, + 608, 0, 609, 610, 611, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 1068, 0, 0, 949, 0, + 1069, 0, 0, 950, 951, 1070, 0, 0, 0, 1071, + 1072, 0, 0, 1073, 952, 953, 0, 954, 955, 956, + 957, 958, 959, 960, 961, 962, 963, 964, 0, 0, + 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 966, 967, 968, 969, 0, 0, 0, 2298, + 0, 0, 0, 970, 971, 0, 972, 0, 0, 0, + 0, 0, 0, 973, 974, 0, 0, 975, 976, 977, + 978, 0, 979, 176, 0, 980, 981, 0, 0, 0, + 0, 0, 0, 0, 982, 0, 0, 983, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 984, 985, 986, 0, 987, + 0, 0, 0, 0, 0, 0, 0, 988, 989, 990, + 178, 0, 0, 0, 0, 0, 991, 0, 0, 179, + 0, 0, 0, 0, 0, 992, 0, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 994, 2299, 995, + 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 997, 998, 0, 999, 0, + 0, 0, 1000, 180, 0, 0, 0, 1001, 0, 0, + 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, + 0, 0, 0, 0, 0, 1011, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1015, 0, 0, 0, 0, 0, 0, + 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, + 0, 0, 0, 2300, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, + 0, 0, 0, 1024, 1025, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, + 199, 200, 201, 202, 203, 204, 1031, 206, 207, 208, + 209, 210, 211, 212, 1032, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1033, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 1038, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 1039, 1040, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 1041, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 1042, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 1043, 1044, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 1045, 403, 404, 405, 406, 407, 1046, 409, 410, + 411, 412, 413, 414, 415, 416, 1047, 1048, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 1049, 441, 442, 443, 444, 445, 446, 447, 1050, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 1051, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 1052, 505, 506, 507, 508, 509, + 510, 1053, 512, 513, 514, 515, 516, 517, 1054, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 1055, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 1056, 1057, + 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 1062, 590, 1063, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 1064, 604, 1065, 606, 607, 608, + 0, 609, 610, 611, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, + 0, 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, + 0, 0, 1073, 952, 953, 0, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 0, 0, 0, + 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, + 0, 3081, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3082, 967, 968, 969, 0, 0, 0, 0, 0, + 0, 0, 970, 971, 0, 972, 0, 0, 0, 0, + 0, 0, 973, 974, 0, 0, 975, 976, 977, 978, + 0, 979, 176, 0, 980, 981, 0, 0, 0, 0, + 0, 0, 0, 3083, 0, 0, 983, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 984, 985, 986, 0, 987, 0, + 0, 0, 0, 0, 0, 0, 988, 989, 990, 178, + 0, 0, 0, 0, 0, 991, 0, 0, 179, 0, + 0, 0, 0, 0, 992, 0, 0, 993, 0, 0, + 0, 0, 0, 0, 0, 0, 994, 0, 995, 0, + 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 997, 998, 0, 999, 0, 0, + 0, 1000, 180, 0, 0, 0, 1001, 0, 0, 181, + 1002, 0, 1003, 1004, 1005, 1006, 0, 3084, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, + 0, 0, 0, 0, 1011, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1015, 0, 0, 0, 0, 0, 0, 1016, + 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1020, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, + 0, 0, 1024, 1025, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, + 200, 201, 202, 203, 204, 1031, 206, 207, 208, 209, + 210, 211, 212, 1032, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 1033, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 1038, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 1039, 1040, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 1041, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 1042, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 1043, 1044, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 1045, 403, 404, 405, 406, 407, 1046, 409, 410, 411, + 412, 413, 414, 415, 416, 1047, 1048, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 1049, + 441, 442, 443, 444, 445, 446, 447, 1050, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 1051, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 1052, 505, 506, 507, 508, 509, 510, + 1053, 512, 513, 514, 515, 516, 517, 1054, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 1055, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, + 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 1062, + 590, 1063, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 1064, 604, 1065, 606, 607, 608, 0, + 609, 610, 611, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, + 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, + 0, 1073, 952, 953, 0, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 0, 0, 0, 0, + 0, 0, 0, 965, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 966, 967, 968, 969, 0, 0, 0, 0, 0, 0, + 0, 970, 971, 0, 972, 0, 0, 0, 0, 0, + 0, 973, 974, 0, 0, 975, 976, 977, 978, 0, + 979, 176, 0, 980, 981, 0, 0, 0, 0, 0, + 0, 0, 982, 0, 0, 983, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 984, 985, 986, 0, 987, 0, 0, + 0, 0, 0, 0, 0, 988, 989, 990, 178, 0, + 0, 0, 0, 0, 991, 0, 0, 179, 0, 0, + 0, 0, 0, 992, 0, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 994, 0, 995, 0, 996, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 997, 998, 0, 999, 0, 0, 0, + 1000, 180, 0, 0, 0, 1001, 0, 0, 181, 1002, + 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, + 0, 0, 0, 1011, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, + 0, 1018, 1019, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1020, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, + 0, 1024, 1025, 0, 1568, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, + 201, 202, 203, 204, 1031, 206, 207, 208, 209, 210, + 211, 212, 1032, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1033, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 1038, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 1039, 1040, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 1041, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 1042, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 1043, 1044, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 1045, + 403, 404, 405, 406, 407, 1046, 409, 410, 411, 412, + 413, 414, 415, 416, 1047, 1048, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 1049, 441, + 442, 443, 444, 445, 446, 447, 1050, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 1051, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 1052, 505, 506, 507, 508, 509, 510, 1053, + 512, 513, 514, 515, 516, 517, 1054, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 1055, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, + 571, 572, 573, 574, 1060, 1061, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 1062, 590, + 1063, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 1064, 604, 1065, 606, 607, 608, 0, 609, + 610, 611, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, + 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, + 1073, 952, 953, 0, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 0, 0, 0, 0, 0, + 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 966, + 967, 968, 969, 0, 0, 0, 0, 0, 0, 0, + 970, 971, 0, 972, 0, 0, 0, 0, 0, 0, + 973, 974, 0, 0, 975, 976, 977, 978, 0, 979, + 176, 0, 980, 981, 0, 0, 0, 0, 0, 0, + 0, 2572, 0, 0, 983, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 984, 985, 986, 0, 987, 0, 0, 0, + 0, 0, 0, 0, 988, 989, 990, 178, 0, 0, + 0, 0, 0, 991, 0, 2573, 179, 0, 0, 0, + 0, 0, 992, 0, 0, 993, 0, 0, 0, 0, + 0, 0, 0, 0, 994, 0, 995, 0, 996, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 997, 998, 0, 999, 0, 0, 0, 1000, + 180, 0, 0, 0, 1001, 0, 0, 181, 1002, 0, + 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, + 0, 0, 1011, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, 0, + 1018, 1019, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1020, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, + 1024, 1025, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 1026, + 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, + 202, 203, 204, 1031, 206, 207, 208, 209, 210, 211, + 212, 1032, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 1033, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 1038, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 1039, 1040, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 1041, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 1042, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 1043, 1044, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 1045, 403, + 404, 405, 406, 407, 1046, 409, 410, 411, 412, 413, + 414, 415, 416, 1047, 1048, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 1049, 441, 442, + 443, 444, 445, 446, 447, 1050, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 1051, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 1052, 505, 506, 507, 508, 509, 510, 1053, 512, + 513, 514, 515, 516, 517, 1054, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 1055, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, + 572, 573, 574, 1060, 1061, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 1062, 590, 1063, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 1064, 604, 1065, 606, 607, 608, 0, 609, 610, + 611, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, 950, + 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, + 952, 953, 0, 954, 955, 956, 957, 958, 959, 960, + 961, 962, 963, 964, 0, 0, 0, 0, 0, 0, + 0, 965, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 966, 967, + 968, 969, 0, 0, 0, 0, 0, 0, 0, 970, + 971, 0, 972, 0, 0, 0, 0, 0, 0, 973, + 974, 0, 0, 975, 976, 977, 978, 0, 979, 176, + 0, 980, 981, 0, 0, 0, 0, 0, 0, 0, + 982, 0, 0, 983, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 984, 985, 986, 0, 987, 0, 0, 0, 2931, + 0, 0, 0, 988, 989, 990, 178, 0, 0, 0, + 0, 0, 991, 0, 0, 179, 0, 0, 0, 0, + 0, 992, 0, 0, 993, 0, 0, 0, 0, 0, + 0, 0, 0, 994, 0, 995, 0, 996, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 997, 998, 0, 999, 0, 0, 0, 1000, 180, + 0, 0, 0, 1001, 0, 0, 181, 1002, 0, 1003, + 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, + 0, 1011, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1015, + 0, 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, + 1019, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1020, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, + 1025, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 1026, 1027, + 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, 202, + 203, 204, 1031, 206, 207, 208, 209, 210, 211, 212, + 1032, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 1033, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 1038, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 1039, 1040, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 1041, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 1042, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 1043, 1044, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 1045, 403, 404, + 405, 406, 407, 1046, 409, 410, 411, 412, 413, 414, + 415, 416, 1047, 1048, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 1049, 441, 442, 443, + 444, 445, 446, 447, 1050, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 1051, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 1052, 505, 506, 507, 508, 509, 510, 1053, 512, 513, + 514, 515, 516, 517, 1054, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 1055, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, + 573, 574, 1060, 1061, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 1062, 590, 1063, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 1064, 604, 1065, 606, 607, 608, 0, 609, 610, 611, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 1068, 0, 0, 949, 0, 1069, 0, 0, 950, 951, + 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, + 953, 0, 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 964, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 966, 967, 968, + 969, 0, 0, 0, 0, 0, 0, 0, 970, 971, + 0, 972, 0, 0, 0, 0, 0, 0, 973, 974, + 0, 0, 975, 976, 977, 978, 0, 979, 176, 0, + 980, 981, 0, 0, 0, 0, 0, 0, 0, 982, + 0, 0, 983, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 984, 985, 986, 0, 987, 0, 0, 0, 2933, 0, + 0, 0, 988, 989, 990, 178, 0, 0, 0, 0, + 0, 991, 0, 0, 179, 0, 0, 0, 0, 0, + 992, 0, 0, 993, 0, 0, 0, 0, 0, 0, + 0, 0, 994, 0, 995, 0, 996, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 997, 998, 0, 999, 0, 0, 0, 1000, 180, 0, + 0, 0, 1001, 0, 0, 181, 1002, 0, 1003, 1004, + 1005, 1006, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 1007, + 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, 0, + 1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1015, 0, + 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1020, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, + 1029, 195, 196, 197, 1030, 199, 200, 201, 202, 203, + 204, 1031, 206, 207, 208, 209, 210, 211, 212, 1032, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 1033, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 1034, + 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 1038, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 1039, 1040, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 1041, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 1042, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 1043, 1044, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 1045, 403, 404, 405, + 406, 407, 1046, 409, 410, 411, 412, 413, 414, 415, + 416, 1047, 1048, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 1049, 441, 442, 443, 444, + 445, 446, 447, 1050, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 1051, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 1052, + 505, 506, 507, 508, 509, 510, 1053, 512, 513, 514, + 515, 516, 517, 1054, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 1055, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, + 574, 1060, 1061, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 1062, 590, 1063, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 1064, + 604, 1065, 606, 607, 608, 0, 609, 610, 611, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 1068, + 0, 0, 949, 0, 1069, 0, 0, 950, 951, 1070, + 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, + 0, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 0, 0, 0, 0, 0, 0, 0, 965, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 966, 967, 968, 969, + 0, 0, 0, 0, 0, 0, 0, 970, 971, 0, + 972, 0, 0, 0, 0, 0, 0, 973, 974, 0, + 0, 975, 976, 977, 978, 0, 979, 176, 0, 980, + 981, 0, 0, 0, 0, 0, 0, 0, 982, 0, + 0, 983, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 984, + 985, 986, 0, 987, 0, 0, 0, 2935, 0, 0, + 0, 988, 989, 990, 178, 0, 0, 0, 0, 0, + 991, 0, 0, 179, 0, 0, 0, 0, 0, 992, + 0, 0, 993, 0, 0, 0, 0, 0, 0, 0, + 0, 994, 0, 995, 0, 996, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 997, + 998, 0, 999, 0, 0, 0, 1000, 180, 0, 0, + 0, 1001, 0, 0, 181, 1002, 0, 1003, 1004, 1005, + 1006, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 1007, 1008, + 1009, 0, 1010, 0, 0, 0, 0, 0, 0, 1011, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1015, 0, 0, + 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1020, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1021, + 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, + 195, 196, 197, 1030, 199, 200, 201, 202, 203, 204, + 1031, 206, 207, 208, 209, 210, 211, 212, 1032, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 1033, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 1034, 243, + 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 1038, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 1039, + 1040, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 1041, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 1042, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 1043, + 1044, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 1045, 403, 404, 405, 406, + 407, 1046, 409, 410, 411, 412, 413, 414, 415, 416, + 1047, 1048, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 1049, 441, 442, 443, 444, 445, + 446, 447, 1050, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 1051, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 1052, 505, + 506, 507, 508, 509, 510, 1053, 512, 513, 514, 515, + 516, 517, 1054, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 1055, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, + 1060, 1061, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 1062, 590, 1063, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 1064, 604, + 1065, 606, 607, 608, 0, 609, 610, 611, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 1068, 0, + 0, 949, 0, 1069, 0, 0, 950, 951, 1070, 0, + 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, + 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, + 964, 0, 0, 0, 0, 0, 0, 0, 965, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 966, 967, 968, 969, 0, + 0, 0, 0, 0, 0, 0, 970, 971, 0, 972, + 0, 0, 0, 0, 0, 0, 973, 974, 0, 0, + 975, 976, 977, 978, 0, 979, 176, 0, 980, 981, + 0, 0, 0, 0, 0, 0, 0, 4785, 0, 0, + 983, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 984, 985, + 986, 0, 987, 0, 0, 0, 0, 0, 0, 0, + 988, 989, 990, 178, 0, 0, 0, 0, 0, 991, + 0, 2573, 179, 0, 0, 0, 0, 0, 992, 0, + 0, 993, 0, 0, 0, 0, 0, 0, 0, 0, + 994, 0, 995, 0, 996, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 997, 998, + 0, 999, 0, 0, 0, 1000, 180, 0, 0, 0, + 1001, 0, 0, 181, 1002, 0, 1003, 1004, 1005, 1006, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, + 0, 1010, 0, 0, 0, 0, 0, 0, 1011, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1015, 0, 0, 0, + 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1020, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1021, 1022, + 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, + 196, 197, 1030, 199, 200, 201, 202, 203, 204, 1031, + 206, 207, 208, 209, 210, 211, 212, 1032, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 1033, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 1034, 243, 1035, + 1036, 1037, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 1038, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 1039, 1040, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 1041, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 1042, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 1043, 1044, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 1045, 403, 404, 405, 406, 407, + 1046, 409, 410, 411, 412, 413, 414, 415, 416, 1047, + 1048, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 1049, 441, 442, 443, 444, 445, 446, + 447, 1050, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 1051, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 1052, 505, 506, + 507, 508, 509, 510, 1053, 512, 513, 514, 515, 516, + 517, 1054, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 1055, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, + 1061, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 1062, 590, 1063, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 1064, 604, 1065, + 606, 607, 608, 0, 609, 610, 611, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 1067, 1068, 0, 0, + 949, 0, 1069, 0, 0, 950, 951, 1070, 0, 0, + 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 0, 0, 0, 0, 0, 0, 0, 965, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 966, 967, 968, 969, 0, 0, + 0, 0, 0, 0, 0, 970, 971, 0, 972, 0, + 0, 0, 0, 0, 0, 973, 974, 0, 0, 975, + 976, 977, 978, 0, 979, 176, 0, 980, 981, 0, + 0, 0, 0, 0, 0, 0, 982, 0, 0, 983, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 984, 985, 986, + 0, 987, 0, 0, 0, 0, 0, 0, 0, 988, + 989, 990, 178, 0, 0, 0, 0, 0, 991, 0, + 0, 179, 0, 0, 0, 0, 0, 992, 0, 0, + 993, 0, 0, 0, 0, 0, 0, 0, 0, 994, + 0, 995, 0, 996, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 997, 998, 0, + 999, 0, 0, 0, 1000, 180, 0, 0, 0, 1001, + 0, 0, 181, 1002, 0, 1003, 1004, 1005, 1006, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, + 1010, 0, 0, 0, 0, 0, 0, 1011, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1015, 0, 0, 0, 0, + 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1020, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, + 0, 0, 0, 0, 0, 1024, 1025, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, + 197, 1030, 199, 200, 201, 202, 203, 204, 1031, 206, + 207, 208, 209, 210, 211, 212, 1032, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 1033, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, + 1037, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 1038, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 1039, 1040, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 1041, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 1042, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 1043, 1044, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 1045, 403, 404, 405, 406, 407, 1046, + 409, 410, 411, 412, 413, 414, 415, 416, 1047, 1048, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 1049, 441, 442, 443, 444, 445, 446, 447, + 1050, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 1051, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 1052, 505, 506, 507, + 508, 509, 510, 1053, 512, 513, 514, 515, 516, 517, + 1054, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 1055, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 1062, 590, 1063, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 1064, 604, 1065, 606, + 607, 608, 0, 609, 610, 611, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 1067, 1068, 0, 0, 949, + 0, 1069, 0, 0, 950, 951, 1070, 0, 0, 0, + 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 0, + 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 966, 967, 968, 969, 0, 0, 0, + 0, 0, 0, 0, 970, 971, 0, 972, 0, 0, + 0, 0, 0, 0, 973, 974, 0, 0, 975, 976, + 977, 978, 0, 979, 176, 0, 980, 981, 0, 0, + 0, 0, 0, 0, 0, 982, 0, 0, 983, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 984, 985, 986, 0, + 987, 0, 0, 0, 0, 0, 0, 0, 988, 989, + 990, 178, 0, 0, 0, 0, 0, 991, 0, 0, + 179, 0, 0, 0, 0, 0, 992, 0, 0, 993, + 0, 0, 0, 0, 0, 0, 0, 0, 994, 0, + 995, 0, 996, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 997, 998, 0, 999, + 0, 0, 0, 1000, 180, 0, 0, 0, 1001, 0, + 0, 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, + 0, 0, 0, 0, 0, 0, 1011, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1015, 0, 0, 0, 0, 0, + 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1020, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, + 0, 0, 0, 0, 1024, 1025, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, + 1030, 199, 200, 201, 202, 203, 204, 1031, 206, 207, + 208, 209, 210, 211, 212, 1032, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 1033, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 1038, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 1039, 1040, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 1041, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 1042, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 1043, 1044, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 1045, 403, 404, 405, 406, 407, 1046, 409, + 410, 411, 412, 413, 414, 415, 416, 1047, 1048, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 1049, 441, 442, 443, 444, 445, 446, 447, 1050, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 1051, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 1052, 505, 506, 507, 508, + 509, 510, 1053, 512, 513, 514, 515, 516, 517, 1054, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 1055, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 1056, + 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 1062, 590, 1063, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 1064, 604, 1065, 606, 607, + 608, 0, 609, 610, 611, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 1068, 0, 0, 949, 0, + 1069, 0, 0, 950, 951, 1594, 0, 0, 0, 1071, + 1072, 0, 0, 1073, 952, 953, 0, 954, 955, 956, + 957, 958, 959, 960, 961, 962, 963, 964, 0, 0, + 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 966, 967, 968, 969, 0, 0, 0, 0, + 0, 0, 0, 970, 971, 0, 972, 0, 0, 0, + 0, 0, 0, 973, 974, 0, 0, 975, 976, 977, + 978, 0, 979, 176, 0, 980, 981, 0, 0, 0, + 0, 0, 0, 0, 982, 0, 0, 983, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 984, 985, 986, 0, 987, + 0, 0, 0, 0, 0, 0, 0, 988, 989, 990, + 178, 0, 0, 0, 0, 0, 991, 0, 0, 179, + 0, 0, 0, 0, 0, 992, 0, 0, 993, 0, + 0, 0, 0, 0, 0, 0, 0, 994, 0, 995, + 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 997, 998, 0, 999, 0, + 0, 0, 1000, 180, 0, 0, 0, 1001, 0, 0, + 181, 1002, 0, 1003, 1004, 1005, 1006, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, + 0, 0, 0, 0, 0, 1011, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1015, 0, 0, 0, 0, 0, 0, + 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, + 0, 0, 0, 1024, 1025, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, + 199, 200, 201, 202, 203, 204, 1031, 206, 207, 208, + 209, 210, 211, 212, 1032, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1033, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 1038, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 1039, 1040, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 1041, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 1042, 2149, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 1043, 1044, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 1045, 403, 404, 405, 406, 407, 1046, 409, 410, + 411, 412, 413, 414, 415, 416, 1047, 1048, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 1049, 441, 442, 443, 444, 445, 446, 447, 1050, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 1051, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 1052, 505, 506, 507, 508, 509, + 510, 1053, 512, 513, 514, 515, 516, 517, 1054, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 1055, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 1056, 1057, + 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 2150, 590, 1063, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 1064, 604, 1065, 606, 607, 608, + 0, 609, 610, 611, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, + 0, 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, + 0, 0, 1073, 952, 953, 0, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 0, 0, 0, + 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 966, 967, 968, 969, 0, 0, 0, 0, 0, + 0, 0, 970, 971, 0, 972, 0, 0, 0, 0, + 0, 0, 973, 974, 0, 0, 975, 976, 977, 978, + 0, 979, 176, 0, 980, 981, 0, 0, 0, 0, + 0, 0, 0, 982, 0, 0, 983, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 984, 985, 986, 0, 987, 0, + 0, 0, 0, 0, 0, 0, 988, 989, 990, 178, + 0, 0, 0, 0, 0, 991, 0, 0, 179, 0, + 0, 0, 0, 0, 992, 0, 0, 993, 0, 0, + 0, 0, 0, 0, 0, 0, 994, 0, 995, 0, + 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 997, 998, 0, 999, 0, 0, + 0, 1000, 180, 0, 0, 0, 1001, 0, 0, 181, + 1002, 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, + 0, 0, 0, 0, 1011, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1015, 0, 0, 0, 0, 0, 0, 1016, + 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1020, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, + 0, 0, 1024, 1025, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, + 200, 201, 202, 203, 204, 1031, 206, 207, 208, 209, + 210, 211, 212, 1032, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 1033, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 1038, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 1039, 1040, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 1041, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 1042, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 1043, 1044, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 1045, 403, 404, 405, 406, 407, 1046, 409, 410, 411, + 412, 413, 414, 415, 416, 1047, 1048, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 1049, + 441, 442, 443, 444, 445, 446, 447, 1050, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 1051, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 1052, 505, 506, 507, 508, 509, 510, + 1053, 512, 513, 514, 515, 516, 517, 1054, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 1055, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, + 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 2150, + 590, 1063, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 1064, 604, 1065, 606, 607, 608, 0, + 609, 610, 611, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, + 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, + 0, 1073, 952, 953, 0, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 0, 0, 0, 0, + 0, 0, 0, 965, 0, 0, 0, 0, 0, 0, + 2370, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 966, 967, 968, 969, 0, 0, 0, 0, 0, 0, + 0, 970, 971, 0, 972, 0, 0, 0, 0, 0, + 0, 973, 974, 0, 0, 975, 976, 977, 978, 0, + 979, 176, 0, 980, 981, 0, 0, 0, 0, 0, + 0, 0, 982, 0, 0, 983, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 984, 985, 986, 0, 987, 0, 0, + 0, 0, 0, 0, 0, 988, 989, 990, 178, 0, + 0, 0, 0, 0, 991, 0, 0, 179, 0, 0, + 0, 0, 0, 992, 0, 0, 993, 0, 0, 0, + 0, 0, 0, 0, 0, 994, 0, 995, 0, 996, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 997, 998, 0, 999, 0, 0, 0, + 1000, 180, 0, 0, 0, 1001, 0, 0, 181, 0, + 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, + 0, 0, 0, 1011, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, + 0, 1018, 1019, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1020, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, + 0, 1024, 1025, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, + 201, 202, 203, 2371, 1031, 206, 207, 208, 209, 210, + 211, 212, 1032, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1033, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 1038, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 1039, 1040, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 1041, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 1042, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 1043, 1044, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 1045, + 403, 404, 405, 406, 407, 1046, 409, 410, 411, 412, + 413, 414, 415, 416, 1047, 1048, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 1049, 441, + 442, 443, 444, 445, 446, 447, 1050, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 1051, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 1052, 505, 506, 507, 508, 509, 510, 1053, + 512, 513, 514, 515, 516, 517, 1054, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 1055, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, + 571, 572, 573, 574, 1060, 1061, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 1062, 590, + 1063, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 1064, 604, 1065, 606, 607, 608, 0, 609, + 610, 611, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, + 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, + 1073, 952, 953, 0, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 0, 0, 0, 0, 0, + 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 966, + 967, 968, 969, 0, 0, 0, 0, 0, 0, 0, + 970, 971, 0, 972, 0, 0, 0, 0, 0, 0, + 973, 974, 0, 0, 975, 976, 977, 978, 0, 979, + 176, 0, 980, 981, 0, 0, 0, 0, 0, 0, + 0, 982, 0, 0, 983, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 984, 985, 986, 0, 987, 0, 0, 0, + 0, 0, 0, 0, 988, 989, 990, 178, 0, 0, + 0, 0, 0, 991, 0, 0, 179, 0, 0, 0, + 0, 0, 992, 0, 0, 3758, 0, 0, 0, 0, + 0, 0, 0, 0, 994, 0, 995, 0, 996, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 997, 998, 0, 999, 0, 0, 0, 1000, + 180, 0, 0, 0, 1001, 0, 0, 181, 1002, 0, + 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, + 0, 0, 1011, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, 0, + 1018, 1019, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1020, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, + 1024, 1025, 0, 0, 0, 0, 0, 0, 0, 0, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 1026, + 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, + 202, 203, 204, 1031, 206, 207, 208, 209, 210, 211, + 212, 1032, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 1033, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 1038, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 1039, 1040, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 1041, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 1042, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 1043, 1044, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 1045, 403, + 404, 405, 406, 407, 1046, 409, 410, 411, 412, 413, + 414, 415, 416, 1047, 1048, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 1049, 441, 442, + 443, 444, 445, 446, 447, 1050, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 1051, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 1052, 505, 506, 507, 508, 509, 510, 1053, 512, + 513, 514, 515, 516, 517, 1054, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 1055, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, + 572, 573, 574, 1060, 1061, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 1062, 590, 1063, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 1064, 604, 1065, 606, 607, 608, 0, 609, 610, + 611, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 1068, 0, 0, 949, 0, 1069, 0, 0, 950, + 951, 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, + 952, 953, 0, 954, 955, 956, 957, 958, 959, 960, + 961, 962, 963, 964, 0, 0, 0, 0, 0, 0, + 0, 965, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 966, 967, + 968, 969, 0, 0, 0, 0, 0, 0, 0, 970, + 971, 0, 972, 0, 0, 0, 0, 0, 0, 973, + 974, 0, 0, 975, 976, 977, 978, 0, 979, 176, + 0, 980, 981, 0, 0, 0, 0, 0, 0, 0, + 982, 0, 0, 983, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 984, 985, 986, 0, 987, 0, 0, 0, 0, + 0, 0, 0, 988, 989, 990, 178, 0, 0, 0, + 0, 0, 991, 0, 0, 179, 0, 0, 0, 0, + 0, 992, 0, 0, 3773, 0, 0, 0, 0, 0, + 0, 0, 0, 994, 0, 995, 0, 996, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 997, 998, 0, 999, 0, 0, 0, 1000, 180, + 0, 0, 0, 1001, 0, 0, 181, 1002, 0, 1003, + 1004, 1005, 1006, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 1007, 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, + 0, 1011, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1015, + 0, 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, + 1019, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1020, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, + 1025, 0, 0, 0, 0, 0, 0, 0, 0, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 1026, 1027, + 1028, 1029, 195, 196, 197, 1030, 199, 200, 201, 202, + 203, 204, 1031, 206, 207, 208, 209, 210, 211, 212, + 1032, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 1033, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 1034, 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 1038, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 1039, 1040, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 1041, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 1042, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 1043, 1044, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 1045, 403, 404, + 405, 406, 407, 1046, 409, 410, 411, 412, 413, 414, + 415, 416, 1047, 1048, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 1049, 441, 442, 443, + 444, 445, 446, 447, 1050, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 1051, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 1052, 505, 506, 507, 508, 509, 510, 1053, 512, 513, + 514, 515, 516, 517, 1054, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 1055, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, + 573, 574, 1060, 1061, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 1062, 590, 1063, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 1064, 604, 1065, 606, 607, 608, 0, 609, 610, 611, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 1068, 0, 0, 949, 0, 1069, 0, 0, 950, 951, + 1070, 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, + 953, 0, 954, 955, 956, 957, 958, 959, 960, 961, + 962, 963, 964, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 966, 967, 968, + 969, 0, 0, 0, 0, 0, 0, 0, 970, 971, + 0, 972, 0, 0, 0, 0, 0, 0, 973, 974, + 0, 0, 975, 976, 977, 978, 0, 979, 176, 0, + 980, 981, 0, 0, 0, 0, 0, 0, 0, 982, + 0, 0, 983, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 984, 985, 986, 0, 987, 0, 0, 0, 0, 0, + 0, 0, 988, 989, 990, 178, 0, 0, 0, 0, + 0, 991, 0, 0, 179, 0, 0, 0, 0, 0, + 992, 0, 0, 993, 0, 0, 0, 0, 0, 0, + 0, 0, 994, 0, 995, 0, 996, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 997, 998, 6048, 999, 0, 0, 0, 1000, 180, 0, + 0, 0, 1001, 0, 0, 181, 0, 0, 1003, 1004, + 1005, 1006, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 1007, + 1008, 1009, 0, 1010, 0, 0, 0, 0, 0, 0, + 1011, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1015, 0, + 0, 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1020, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1021, 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, + 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, + 1029, 195, 196, 197, 1030, 199, 200, 201, 202, 203, + 204, 1031, 206, 207, 208, 209, 210, 211, 212, 1032, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 1033, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 1034, + 243, 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 1038, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 1039, 1040, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 1041, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 1042, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 1043, 1044, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 1045, 403, 404, 405, + 406, 407, 1046, 409, 410, 411, 412, 413, 414, 415, + 416, 1047, 1048, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 1049, 441, 442, 443, 444, + 445, 446, 447, 1050, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 1051, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 1052, + 505, 506, 507, 508, 509, 510, 1053, 512, 513, 514, + 515, 516, 517, 1054, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 1055, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, + 574, 1060, 1061, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 1062, 590, 1063, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 1064, + 604, 1065, 606, 607, 608, 0, 609, 610, 611, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 1068, + 0, 0, 949, 0, 1069, 0, 0, 950, 951, 1070, + 0, 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, + 0, 954, 955, 956, 957, 958, 959, 960, 961, 962, + 963, 964, 0, 0, 0, 0, 0, 0, 0, 965, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 966, 967, 968, 969, + 0, 0, 0, 0, 0, 0, 0, 970, 971, 0, + 972, 0, 0, 0, 0, 0, 0, 973, 974, 0, + 0, 975, 976, 977, 978, 0, 979, 176, 0, 980, + 981, 0, 0, 0, 0, 0, 0, 0, 982, 0, + 0, 983, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 984, + 985, 986, 0, 987, 0, 0, 0, 0, 0, 0, + 0, 988, 989, 990, 178, 0, 0, 0, 0, 0, + 991, 0, 0, 179, 0, 0, 0, 0, 0, 992, + 0, 0, 1561, 0, 0, 0, 0, 0, 0, 0, + 0, 994, 0, 995, 0, 996, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 997, + 998, 0, 999, 0, 0, 0, 1000, 180, 0, 0, + 0, 1001, 0, 0, 181, 0, 0, 1003, 1004, 1005, + 1006, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 1007, 1008, + 1009, 0, 1010, 0, 0, 0, 0, 0, 0, 1011, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1015, 0, 0, + 0, 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1020, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1021, + 1022, 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, + 0, 0, 0, 0, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, + 195, 196, 197, 1030, 199, 200, 201, 202, 203, 204, + 1031, 206, 207, 208, 209, 210, 211, 212, 1032, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 1033, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 1034, 243, + 1035, 1036, 1037, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 1038, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 1039, + 1040, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 1041, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 1042, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 1043, + 1044, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 1045, 403, 404, 405, 406, + 407, 1046, 409, 410, 411, 412, 413, 414, 415, 416, + 1047, 1048, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 1049, 441, 442, 443, 444, 445, + 446, 447, 1050, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 1051, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 1052, 505, + 506, 507, 508, 509, 510, 1053, 512, 513, 514, 515, + 516, 517, 1054, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 1055, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, + 1060, 1061, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 1062, 590, 1063, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 1064, 604, + 1065, 606, 607, 608, 0, 609, 610, 611, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 1562, 1563, 0, + 0, 949, 0, 1069, 0, 0, 950, 951, 1070, 0, + 0, 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, + 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, + 964, 0, 0, 0, 0, 0, 0, 0, 965, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 966, 967, 968, 969, 0, + 0, 0, 0, 0, 0, 0, 970, 971, 0, 972, + 0, 0, 0, 0, 0, 0, 973, 974, 0, 0, + 975, 976, 977, 978, 0, 979, 176, 0, 980, 981, + 0, 0, 0, 0, 0, 0, 0, 982, 0, 0, + 983, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 984, 985, + 986, 0, 987, 0, 0, 0, 0, 0, 0, 0, + 988, 989, 990, 178, 0, 0, 0, 0, 0, 991, + 0, 0, 179, 0, 0, 0, 0, 0, 992, 0, + 0, 1675, 0, 0, 0, 0, 0, 0, 0, 0, + 994, 0, 995, 0, 996, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 997, 998, + 0, 999, 0, 0, 0, 1000, 180, 0, 0, 0, + 1001, 0, 0, 181, 0, 0, 1003, 1004, 1005, 1006, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, + 0, 1010, 0, 0, 0, 0, 0, 0, 1011, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1015, 0, 0, 0, + 0, 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1020, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1021, 1022, + 1023, 0, 0, 0, 0, 0, 1024, 1025, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, + 196, 197, 1030, 199, 200, 201, 202, 203, 204, 1031, + 206, 207, 208, 209, 210, 211, 212, 1032, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 1033, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 1034, 243, 1035, + 1036, 1037, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 1038, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 1039, 1040, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 1041, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 1042, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 1043, 1044, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 1045, 403, 404, 405, 406, 407, + 1046, 409, 410, 411, 412, 413, 414, 415, 416, 1047, + 1048, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 1049, 441, 442, 443, 444, 445, 446, + 447, 1050, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 1051, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 1052, 505, 506, + 507, 508, 509, 510, 1053, 512, 513, 514, 515, 516, + 517, 1054, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 1055, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, + 1061, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 1062, 590, 1063, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 1064, 604, 1065, + 606, 607, 608, 0, 609, 610, 611, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 1562, 1563, 0, 0, + 949, 0, 1069, 0, 0, 950, 951, 1070, 0, 0, + 0, 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, + 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, + 0, 0, 0, 0, 0, 0, 0, 965, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 966, 967, 968, 969, 0, 0, + 0, 0, 0, 0, 0, 970, 971, 0, 972, 0, + 0, 0, 0, 0, 0, 973, 974, 0, 0, 975, + 976, 977, 978, 0, 979, 176, 0, 980, 981, 0, + 0, 0, 0, 0, 0, 0, 982, 0, 0, 983, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 984, 985, 986, + 0, 987, 0, 0, 0, 0, 0, 0, 0, 988, + 989, 990, 178, 0, 0, 0, 0, 0, 991, 0, + 0, 179, 0, 0, 0, 0, 0, 992, 0, 0, + 1677, 0, 0, 0, 0, 0, 0, 0, 0, 994, + 0, 995, 0, 996, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 997, 998, 0, + 999, 0, 0, 0, 1000, 180, 0, 0, 0, 1001, + 0, 0, 181, 0, 0, 1003, 1004, 1005, 1006, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, + 1010, 0, 0, 0, 0, 0, 0, 1011, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1015, 0, 0, 0, 0, + 0, 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1020, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, + 0, 0, 0, 0, 0, 1024, 1025, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, + 197, 1030, 199, 200, 201, 202, 203, 204, 1031, 206, + 207, 208, 209, 210, 211, 212, 1032, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 1033, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, + 1037, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 1038, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 1039, 1040, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 1041, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 1042, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 1043, 1044, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 1045, 403, 404, 405, 406, 407, 1046, + 409, 410, 411, 412, 413, 414, 415, 416, 1047, 1048, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 1049, 441, 442, 443, 444, 445, 446, 447, + 1050, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 1051, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 1052, 505, 506, 507, + 508, 509, 510, 1053, 512, 513, 514, 515, 516, 517, + 1054, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 1055, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 1056, 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 1062, 590, 1063, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 1064, 604, 1065, 606, + 607, 608, 0, 609, 610, 611, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 1562, 1563, 0, 0, 949, + 0, 1069, 0, 0, 950, 951, 1070, 0, 0, 0, + 1071, 1072, 0, 0, 1073, 952, 953, 0, 954, 955, + 956, 957, 958, 959, 960, 961, 962, 963, 964, 0, + 0, 0, 0, 0, 0, 0, 965, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 966, 967, 968, 969, 0, 0, 0, + 0, 0, 0, 0, 970, 971, 0, 972, 0, 0, + 0, 0, 0, 0, 973, 974, 0, 0, 975, 976, + 977, 978, 0, 979, 176, 0, 980, 981, 0, 0, + 0, 0, 0, 0, 0, 982, 0, 0, 983, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 177, 0, 0, 0, 984, 985, 986, 0, + 987, 0, 0, 0, 0, 0, 0, 0, 988, 989, + 990, 178, 0, 0, 0, 0, 0, 991, 0, 0, + 179, 0, 0, 0, 0, 0, 992, 0, 0, 993, + 0, 0, 0, 0, 0, 0, 0, 0, 994, 0, + 995, 0, 996, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 997, 998, 0, 999, + 0, 0, 0, 1000, 180, 0, 0, 0, 1001, 0, + 0, 181, 0, 0, 1003, 1004, 1005, 1006, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, + 0, 0, 0, 0, 0, 0, 1011, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1015, 0, 0, 0, 0, 0, + 0, 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1020, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, + 0, 0, 0, 0, 1024, 1025, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, + 1030, 199, 200, 201, 202, 203, 204, 1031, 206, 207, + 208, 209, 210, 211, 212, 1032, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 1033, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 1038, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 1039, 1040, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 1041, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 1042, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 1043, 1044, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 1045, 403, 404, 405, 406, 407, 1046, 409, + 410, 411, 412, 413, 414, 415, 416, 1047, 1048, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 1049, 441, 442, 443, 444, 445, 446, 447, 1050, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 1051, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 1052, 505, 506, 507, 508, + 509, 510, 1053, 512, 513, 514, 515, 516, 517, 1054, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 1055, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 1056, + 1057, 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 1062, 590, 1063, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 1064, 604, 1065, 606, 607, + 608, 0, 609, 610, 611, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 1068, 0, 0, 949, 0, + 1069, 0, 0, 950, 951, 1070, 0, 0, 0, 1071, + 1072, 0, 0, 1073, 952, 953, 0, 954, 955, 956, + 957, 958, 959, 960, 961, 962, 963, 964, 0, 0, + 0, 0, 0, 0, 0, 965, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 966, 967, 968, 969, 0, 0, 0, 0, + 0, 0, 0, 970, 971, 0, 972, 0, 0, 0, + 0, 0, 0, 973, 974, 0, 0, 975, 976, 977, + 978, 0, 979, 176, 0, 980, 981, 0, 0, 0, + 0, 0, 0, 0, 982, 0, 0, 983, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 984, 985, 986, 0, 987, + 0, 0, 0, 0, 0, 0, 0, 988, 989, 990, + 178, 0, 0, 0, 0, 0, 991, 0, 0, 179, + 0, 0, 0, 0, 0, 992, 0, 0, 2391, 0, + 0, 0, 0, 0, 0, 0, 0, 994, 0, 995, + 0, 996, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 997, 998, 0, 999, 0, + 0, 0, 1000, 180, 0, 0, 0, 1001, 0, 0, + 181, 0, 0, 1003, 1004, 1005, 1006, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, + 0, 0, 0, 0, 0, 1011, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1015, 0, 0, 0, 0, 0, 0, + 1016, 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1020, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, + 0, 0, 0, 1024, 1025, 0, 0, 0, 0, 0, + 0, 0, 0, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, + 199, 200, 201, 202, 203, 204, 1031, 206, 207, 208, + 209, 210, 211, 212, 1032, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1033, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 1038, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 1039, 1040, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 1041, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 1042, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 1043, 1044, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 1045, 403, 404, 405, 406, 407, 1046, 409, 410, + 411, 412, 413, 414, 415, 416, 1047, 1048, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 1049, 441, 442, 443, 444, 445, 446, 447, 1050, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 1051, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 1052, 505, 506, 507, 508, 509, + 510, 1053, 512, 513, 514, 515, 516, 517, 1054, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 1055, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 1056, 1057, + 1058, 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 1062, 590, 1063, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 1064, 604, 1065, 606, 607, 608, + 0, 609, 610, 611, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, + 0, 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, + 0, 0, 1073, 952, 953, 0, 954, 955, 956, 957, + 958, 959, 960, 961, 962, 963, 964, 0, 0, 0, + 0, 0, 0, 0, 965, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 966, 967, 968, 969, 0, 0, 0, 0, 0, + 0, 0, 970, 971, 0, 972, 0, 0, 0, 0, + 0, 0, 973, 974, 0, 0, 975, 976, 977, 978, + 0, 979, 176, 0, 980, 981, 0, 0, 0, 0, + 0, 0, 0, 982, 0, 0, 983, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 984, 985, 986, 0, 987, 0, + 0, 0, 0, 0, 0, 0, 988, 989, 990, 178, + 0, 0, 0, 0, 0, 991, 0, 0, 179, 0, + 0, 0, 0, 0, 992, 0, 0, 2393, 0, 0, + 0, 0, 0, 0, 0, 0, 994, 0, 995, 0, + 996, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 997, 998, 0, 999, 0, 0, + 0, 1000, 180, 0, 0, 0, 1001, 0, 0, 181, + 0, 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, + 0, 0, 0, 0, 1011, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1015, 0, 0, 0, 0, 0, 0, 1016, + 1017, 0, 1018, 1019, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1020, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, + 0, 0, 1024, 1025, 0, 0, 0, 0, 0, 0, + 0, 0, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, + 200, 201, 202, 203, 204, 1031, 206, 207, 208, 209, + 210, 211, 212, 1032, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 1033, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 1038, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 1039, 1040, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 1041, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 1042, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 1043, 1044, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 1045, 403, 404, 405, 406, 407, 1046, 409, 410, 411, + 412, 413, 414, 415, 416, 1047, 1048, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 1049, + 441, 442, 443, 444, 445, 446, 447, 1050, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 1051, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 1052, 505, 506, 507, 508, 509, 510, + 1053, 512, 513, 514, 515, 516, 517, 1054, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 1055, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, + 1059, 571, 572, 573, 574, 1060, 1061, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 1062, + 590, 1063, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 1064, 604, 1065, 606, 607, 608, 0, + 609, 610, 611, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 1068, 0, 0, 949, 0, 1069, 0, + 0, 950, 951, 1070, 0, 0, 0, 1071, 1072, 0, + 0, 1073, 5920, 5921, 0, 954, 955, 956, 957, 958, + 959, 960, 961, 962, 963, 964, 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, 967, 968, 969, 0, 0, 0, 0, 0, 0, + 0, 970, 971, 0, 972, 0, 0, 0, 0, 0, + 0, 973, 974, 0, 0, 975, 976, 977, 978, 0, + 979, 176, 0, 980, 981, 0, 0, 0, 0, 0, + 0, 0, 982, 0, 0, 983, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 984, 985, 986, 0, 987, 0, 0, + 0, 0, 0, 0, 0, 988, 989, 990, 178, 0, + 0, 0, 0, 0, 991, 0, 0, 179, 0, 0, + 0, 0, 0, 992, 0, 0, 1561, 0, 0, 0, + 0, 0, 0, 0, 0, 994, 0, 995, 0, 996, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 997, 998, 0, 999, 0, 0, 0, + 1000, 180, 0, 0, 0, 1001, 0, 0, 181, 0, + 0, 1003, 1004, 1005, 1006, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 1007, 1008, 1009, 0, 1010, 0, 0, 0, + 0, 0, 0, 1011, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1015, 0, 0, 0, 0, 0, 0, 1016, 1017, + 0, 1018, 1019, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1020, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1021, 1022, 1023, 0, 0, 0, 0, + 0, 1024, 1025, 0, 0, 0, 0, 0, 0, 0, + 0, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 1026, 1027, 1028, 1029, 195, 196, 197, 1030, 199, 200, + 201, 202, 203, 204, 1031, 206, 207, 208, 209, 210, + 211, 212, 1032, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1033, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 1034, 243, 1035, 1036, 1037, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 1038, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 1039, 1040, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 1041, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 1042, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 1043, 1044, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 1045, + 403, 404, 405, 406, 407, 1046, 409, 410, 411, 412, + 413, 414, 415, 416, 1047, 1048, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 1049, 441, + 442, 443, 444, 445, 446, 447, 1050, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 1051, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 1052, 505, 506, 507, 508, 509, 510, 1053, + 512, 513, 514, 515, 516, 517, 1054, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 1055, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 1056, 1057, 1058, 1059, + 571, 572, 573, 574, 1060, 1061, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 1062, 590, + 1063, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 1064, 604, 1065, 606, 607, 608, 0, 609, + 610, 611, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 5922, 5923, 0, 0, 949, 0, 0, 0, 0, + 1599, 0, 5924, 0, 0, 0, 0, 1072, 0, 0, + 1073, 1554, 1555, 0, 954, 955, 956, 957, 958, 959, + 960, 961, 962, 963, 964, 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, + 176, 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, 177, 0, + 0, 0, 0, 0, 986, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 1006, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1020, 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, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 2427, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 2428, 568, 569, 2429, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 6200, 609, 610, + 611, 612, 2347, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1073, + 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, 176, 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, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 6200, + 609, 610, 611, 612, 2347, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 6201, 0, 0, 0, 0, 0, + 0, 2348, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 1599, 609, 610, 611, 612, 0, 0, 0, 0, + 0, 0, 1554, 1555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2348, 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, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 1599, 609, + 610, 611, 612, 0, 0, 0, 0, 0, 0, 1554, + 1555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1600, 0, 0, 0, 0, 0, 0, 0, + 1073, 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, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 2347, 609, 610, 611, 612, + 0, 0, 0, 0, 0, 0, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1073, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 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, 2348, 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, 4821, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 745, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 3155, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3156, 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, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 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, + 747, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 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, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 4822, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 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, 4823, 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, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1336, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 32, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 184, 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, 39, 0, 0, 0, 0, 0, + 0, 0, 0, 41, 0, 0, 0, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1337, 0, + 0, 0, 0, 0, 0, 0, 776, 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, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1335, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1336, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1337, + 0, 0, 0, 0, 1338, 0, 0, 776, 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, 176, + 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, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1336, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1337, 0, 0, 0, 0, 1338, 0, 0, 776, 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, + 176, 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, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1336, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1337, 0, 0, 0, 0, 0, 0, 0, 776, + 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, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 2801, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 776, 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, 176, 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, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4981, 0, 0, 0, 0, 0, 0, + 0, 4823, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 5290, 0, 0, 179, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 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, 4823, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 773, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 774, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 775, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 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, 776, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 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, 776, 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, 176, 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, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 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, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 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, 4823, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 902, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 903, 0, 0, 0, 14, 0, 0, 904, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 16, 0, 0, 905, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 906, 0, 0, 0, + 0, 0, 0, 0, 907, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 908, 909, 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, 184, 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, 40, 0, 0, 0, 0, 185, 186, 187, + 910, 189, 0, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 0, 206, 207, 208, 209, 210, 211, 212, 213, 0, + 911, 0, 0, 217, 218, 219, 220, 221, 0, 0, + 224, 225, 226, 227, 228, 0, 0, 0, 232, 233, + 234, 235, 236, 912, 238, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 247, 0, 249, 0, 251, 252, + 0, 254, 255, 256, 257, 258, 259, 0, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 0, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 0, 284, 285, 286, 287, 0, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 0, 0, + 0, 303, 0, 913, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 0, 0, 0, 0, 0, + 319, 320, 914, 322, 323, 324, 0, 326, 327, 0, + 329, 330, 0, 0, 332, 0, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 0, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 0, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 0, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 915, 0, 0, 440, 0, 442, 443, 0, 445, + 446, 447, 448, 0, 450, 451, 452, 453, 0, 0, + 0, 0, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 0, 485, + 0, 487, 488, 489, 0, 491, 492, 0, 494, 495, + 496, 497, 498, 499, 0, 501, 502, 503, 504, 505, + 506, 507, 0, 509, 510, 511, 0, 513, 514, 515, + 516, 0, 518, 519, 0, 0, 522, 523, 0, 0, + 526, 527, 528, 0, 530, 0, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 0, 541, 542, 0, 544, + 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 0, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 0, 577, 578, 0, 580, 581, 582, 583, 0, + 0, 586, 587, 0, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 0, + 0, 606, 607, 0, 0, 609, 0, 611, 612, 174, + 175, 793, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 698, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5590, 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, 1412, 0, 0, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 0, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1670, + 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, 176, + 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, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 1162, 609, 610, 611, + 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 174, 175, 0, 0, 0, 0, 0, 0, + 2402, 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, 1163, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1164, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 1165, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 1166, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 1167, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 1168, 322, 323, 324, + 325, 1169, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 1170, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 1171, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 1172, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 1173, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 1174, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 1175, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 1176, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 1177, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 1178, 605, 606, 607, 608, 1162, 609, + 610, 611, 612, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 174, 175, 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, 1163, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1164, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 1165, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 1166, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 1167, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 1168, 322, + 323, 324, 325, 1169, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 1170, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 1171, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 1172, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 1173, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 1174, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 1175, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 1178, 605, 606, 607, 608, + 1749, 609, 610, 611, 612, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 174, 175, 793, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 1990, 609, 610, 611, 612, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 175, + 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 698, 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, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 2188, 609, 610, 611, 612, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 698, 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, 176, + 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, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 1899, 609, 610, 611, + 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1554, 1555, 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, 1900, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 1899, 609, + 610, 611, 612, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1554, 1555, 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, 0, + 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 2004, 951, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1554, 1555, 0, 0, + 0, 0, 0, 0, 0, 2005, 0, 2006, 0, 2007, + 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 2008, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 2004, 951, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1554, 1555, + 0, 0, 0, 0, 0, 0, 0, 2005, 0, 2006, + 0, 2007, 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, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, + 2679, 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, 184, 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, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 2680, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 2004, + 951, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1554, 1555, 0, 0, 0, 0, 0, 0, 0, 2005, + 0, 2006, 0, 2007, 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, 176, + 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, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, 4100, 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 2004, 951, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1554, 1555, 0, 0, 0, 0, 0, 0, + 0, 2005, 0, 2006, 0, 2007, 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, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 1554, 1555, 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, 0, 0, + 0, 0, 176, 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, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 2408, 2409, 2410, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 4337, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 2782, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 1554, 1555, 0, 0, + 0, 0, 0, 0, 0, 0, 4116, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 5129, 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, 176, 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, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 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, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 0, 0, 0, 0, 0, 5430, 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, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 0, 0, 0, 0, 0, 2838, 0, 0, 5755, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 693, 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, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 694, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 5384, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 5385, 0, 665, 0, 5386, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 2839, + 0, 0, 698, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1401, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1754, 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, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1755, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 793, 1402, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1401, 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, + 176, 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, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 0, 1402, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3451, 3452, + 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 4130, + 4131, 3463, 3464, 3465, 4132, 4133, 3466, 3467, 3468, 3469, + 3470, 3471, 3472, 3473, 4134, 3475, 3476, 0, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 0, + 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 4135, + 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, + 3507, 3508, 4136, 3510, 3511, 3512, 3513, 3514, 3515, 177, + 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 4137, 3525, + 0, 3526, 3527, 3528, 3529, 3530, 0, 0, 178, 3531, + 3532, 3533, 3534, 3535, 3536, 3537, 3538, 5460, 3540, 3541, + 3542, 3543, 3544, 3545, 3546, 3547, 4138, 3549, 4139, 3551, + 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, + 3562, 3563, 3564, 3565, 3566, 3567, 3568, 4140, 4141, 4142, + 3569, 3570, 3571, 3572, 3573, 3574, 3575, 4143, 4144, 4145, + 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, 181, 3583, + 3584, 3585, 3586, 3587, 3588, 4146, 3589, 3590, 3591, 3592, + 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, + 3611, 3612, 3613, 3614, 3615, 3616, 3617, 4147, 3618, 3619, + 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, + 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, + 3640, 4148, 3641, 3642, 4149, 3643, 3644, 3645, 3646, 3647, + 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, + 3658, 3659, 184, 3660, 3661, 3662, 3663, 4150, 4151, 4152, + 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 0, 3673, + 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 4153, + 4154, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, + 3693, 185, 186, 187, 0, 189, 190, 191, 192, 193, + 194, 3694, 3695, 3696, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 5461, 218, 5462, + 5463, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 5464, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 5465, 5466, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 5467, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 5468, 315, + 316, 317, 0, 318, 319, 320, 3410, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 5469, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 5470, 5471, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 5472, 5473, 432, + 3700, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 5474, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 5475, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 5476, 565, 566, 5477, 568, 569, 5478, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 5479, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 3411, 605, 606, 607, 608, 0, 609, + 610, 611, 5480, 174, 175, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3451, + 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, + 4130, 4131, 3463, 3464, 3465, 4132, 4133, 3466, 3467, 3468, + 3469, 3470, 3471, 3472, 3473, 4134, 3475, 3476, 0, 3477, + 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, + 0, 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, 3495, + 4135, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, + 3506, 3507, 3508, 4136, 3510, 3511, 3512, 3513, 3514, 3515, + 177, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 4137, + 3525, 0, 3526, 3527, 3528, 3529, 3530, 0, 0, 178, + 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, + 3541, 3542, 3543, 3544, 3545, 3546, 3547, 4138, 3549, 4139, + 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, + 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 4140, 4141, + 4142, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 4143, 4144, + 4145, 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, 181, + 3583, 3584, 3585, 3586, 3587, 3588, 4146, 3589, 3590, 3591, + 3592, 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, + 3601, 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, 3609, + 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 4147, 3618, + 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, + 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, + 3639, 3640, 4148, 3641, 3642, 4149, 3643, 3644, 3645, 3646, + 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, + 3657, 3658, 3659, 184, 3660, 3661, 3662, 3663, 4150, 4151, + 4152, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 0, + 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, + 4153, 4154, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, + 3692, 3693, 185, 186, 187, 0, 189, 190, 191, 192, + 193, 194, 3694, 3695, 3696, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 4155, 218, + 4156, 4157, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 0, 4158, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 4159, 4160, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 4161, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 4162, + 315, 316, 317, 0, 318, 319, 320, 0, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 4163, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 0, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 4164, 4165, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 0, 4166, 4167, + 432, 3700, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 0, + 4168, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 4169, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 0, 516, 517, 518, 519, 520, + 0, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 4170, 565, 566, 4171, 568, 569, + 4172, 571, 572, 573, 574, 575, 576, 4173, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 0, 4174, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 0, 605, 606, 607, 608, 0, + 609, 610, 611, 4175, 174, 175, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, + 3461, 4130, 4131, 3463, 3464, 3465, 4132, 4133, 3466, 3467, + 3468, 3469, 3470, 3471, 3472, 3473, 4134, 3475, 3476, 0, + 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, + 3487, 0, 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, + 3495, 4135, 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, + 3505, 3506, 3507, 3508, 4136, 3510, 3511, 3512, 3513, 3514, + 3515, 177, 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, + 4137, 3525, 0, 3526, 3527, 3528, 3529, 3530, 0, 0, + 178, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, + 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 4138, 3549, + 4139, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, + 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, 4140, + 4141, 4142, 3569, 3570, 3571, 3572, 3573, 3574, 3575, 4143, + 4144, 4145, 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, + 181, 3583, 3584, 3585, 3586, 3587, 3588, 4146, 3589, 3590, + 3591, 3592, 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, + 3600, 3601, 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, + 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, 4147, + 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, + 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, + 3638, 3639, 3640, 4148, 3641, 3642, 4149, 3643, 3644, 3645, + 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, + 3656, 3657, 3658, 3659, 184, 3660, 3661, 3662, 3663, 4150, + 4151, 4152, 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, + 0, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, + 3682, 4153, 4154, 3684, 3685, 3686, 3687, 3688, 3689, 3690, + 3691, 3692, 3693, 185, 186, 187, 0, 189, 190, 191, + 192, 193, 194, 3694, 3695, 3696, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 4155, + 218, 4156, 4157, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 0, 4158, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 4159, 4160, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 4161, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 4162, 315, 316, 317, 0, 318, 319, 320, 0, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 4163, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 0, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 4164, 4165, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 0, 4166, + 4167, 432, 3700, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 0, 4168, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 5504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 0, 516, 517, 518, 519, + 520, 0, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 4170, 565, 566, 4171, 568, + 569, 4172, 571, 572, 573, 574, 575, 576, 5505, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 0, 4174, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 0, 605, 606, 607, 608, + 0, 609, 610, 611, 4175, 174, 175, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3451, 3452, 3453, 3454, 3455, 3456, 3457, 3458, 3459, + 3460, 3461, 4130, 4131, 3463, 3464, 3465, 4132, 4133, 3466, + 3467, 3468, 3469, 3470, 3471, 3472, 3473, 4134, 3475, 3476, + 0, 3477, 3478, 3479, 3480, 3481, 3482, 3483, 3484, 3485, + 3486, 3487, 0, 3488, 176, 3489, 3490, 3491, 3492, 3493, + 3494, 3495, 4135, 3497, 3498, 3499, 3500, 3501, 3502, 3503, + 3504, 3505, 3506, 3507, 3508, 4136, 3510, 3511, 3512, 3513, + 3514, 3515, 177, 3516, 3517, 3518, 3519, 3520, 3521, 3522, + 3523, 4137, 3525, 0, 3526, 3527, 3528, 3529, 3530, 0, + 0, 178, 3531, 3532, 3533, 3534, 3535, 3536, 3537, 3538, + 3539, 3540, 3541, 3542, 3543, 3544, 3545, 3546, 3547, 4138, + 3549, 4139, 3551, 3552, 3553, 3554, 3555, 3556, 3557, 3558, + 3559, 3560, 3561, 3562, 3563, 3564, 3565, 3566, 3567, 3568, + 4140, 4141, 4142, 3569, 3570, 3571, 3572, 3573, 3574, 3575, + 4143, 4144, 4145, 3576, 180, 3577, 3578, 3579, 3580, 3581, + 3582, 181, 3583, 3584, 3585, 3586, 3587, 3588, 4146, 3589, + 3590, 3591, 3592, 182, 3593, 3594, 3595, 3596, 3597, 3598, + 3599, 3600, 3601, 3602, 183, 3603, 3604, 3605, 3606, 3607, + 3608, 3609, 3610, 3611, 3612, 3613, 3614, 3615, 3616, 3617, + 4147, 3618, 3619, 3620, 3621, 3622, 3623, 3624, 3625, 3626, + 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, 3635, 3636, + 3637, 3638, 3639, 3640, 4148, 3641, 3642, 4149, 3643, 3644, + 3645, 3646, 3647, 3648, 3649, 3650, 3651, 3652, 3653, 3654, + 3655, 3656, 3657, 3658, 3659, 184, 3660, 3661, 3662, 3663, + 4150, 4151, 4152, 3664, 3665, 3666, 3667, 3668, 3669, 3670, + 3671, 0, 3673, 3674, 3675, 3676, 3677, 3678, 3679, 3680, + 3681, 3682, 4153, 4154, 3684, 3685, 3686, 3687, 3688, 3689, + 3690, 3691, 3692, 3693, 185, 186, 187, 0, 189, 190, + 191, 192, 193, 194, 3694, 3695, 3696, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 4155, 218, 4156, 4157, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 0, 4158, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 4159, 4160, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 4161, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 4162, 315, 316, 317, 0, 318, 319, 320, 0, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 4163, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 0, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 4164, 4165, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 0, + 4166, 4167, 432, 3700, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 0, 4168, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 0, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 0, 516, 517, 518, + 519, 520, 0, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 4170, 565, 566, 4171, + 568, 569, 4172, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 0, 4174, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 0, 605, 606, 607, + 608, 0, 609, 610, 611, 4175, 174, 175, 793, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 851, 852, 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, 853, 0, 0, + 0, 854, 0, 0, 0, 176, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 855, 0, + 0, 0, 0, 0, 0, 0, 0, 856, 0, 0, + 0, 0, 0, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 857, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 858, 0, 0, 0, 0, 859, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 860, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 861, + 0, 0, 0, 862, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 863, 0, 0, 0, 864, 865, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 184, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 866, 0, 0, 0, + 0, 0, 0, 867, 868, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 869, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 870, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 871, 298, 299, 300, 301, 872, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 873, + 874, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 875, 463, 464, 465, 876, 467, + 468, 469, 470, 471, 877, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 878, 484, 485, 486, 487, + 488, 879, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 880, 521, 522, 523, 881, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 882, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 793, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 698, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1140, 852, 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, 853, 0, + 0, 0, 854, 0, 0, 0, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 855, + 0, 0, 0, 0, 0, 0, 0, 0, 856, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 857, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 858, 0, 0, 0, 0, 859, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 860, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 861, 0, 0, 0, 862, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 863, 0, 0, 0, 864, 865, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 866, 0, 0, + 0, 0, 0, 0, 867, 868, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 1141, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 869, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 870, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 871, 298, 299, 300, 301, 872, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 873, 874, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 875, 463, 464, 465, 1142, + 467, 468, 469, 470, 471, 877, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 878, 484, 485, 486, + 487, 488, 879, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 880, 521, 522, 523, 881, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 882, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 0, 0, 0, 2210, 2211, 5227, 0, 5228, 0, 5229, + 698, 5230, 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, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5231, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 793, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 698, 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, 854, 1412, 0, 0, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 698, 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, 1769, 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, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1770, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 1298, 0, 0, 1299, 1300, + 0, 0, 0, 1301, 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, + 176, 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, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 793, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 698, 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, + 1754, 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, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1755, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 793, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 698, 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, 1412, + 0, 0, 176, 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, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 793, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 698, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1805, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 793, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 698, 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, + 854, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 1554, 1555, 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, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 2408, 2409, 2410, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 793, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 698, + 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, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3073, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 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, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 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, 3405, 3406, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 3407, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, + 0, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 3408, 3409, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 3410, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 3411, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 793, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 698, 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, 1754, 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, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 793, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 698, 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, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5027, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 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, 0, 0, 0, 0, + 176, 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, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 0, 0, 0, + 5236, 0, 0, 5237, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 5238, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 793, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 698, 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, 176, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5369, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 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, 0, 0, + 0, 0, 176, 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, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 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, 664, 0, 0, 0, 0, 0, 0, 0, + 0, 665, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 174, 175, 793, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 698, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 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, + 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1526, 0, 0, 0, 0, 0, + 0, 178, 1527, 0, 0, 0, 0, 0, 0, 0, + 179, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 1528, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4333, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 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, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 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, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 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, 665, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 184, 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, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 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, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1450, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 1554, + 1555, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1556, 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, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 1554, 1555, 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, 0, 0, 0, 0, 176, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1764, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 1554, 1555, 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, 0, 0, 0, 0, + 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2476, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 2477, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 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, 2489, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 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, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3148, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 1554, 1555, 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, 0, + 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 2476, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 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, + 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 4382, 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, 184, 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, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 698, 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, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 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, 4801, 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, 176, 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, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 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, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 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, 0, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5313, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 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, 0, 0, 0, 0, 176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5323, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 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, 0, 0, 0, 0, 176, + 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, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 179, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 5714, 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, + 184, 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, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 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, 0, 0, 0, 0, + 176, 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, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 179, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 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, 0, 0, 0, + 0, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 705, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 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, 0, 0, + 0, 0, 176, 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, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 0, 0, 0, 179, 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, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, + 210, 211, 212, 213, 214, 215, 0, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 0, 247, + 783, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 0, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 0, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 0, + 609, 610, 611, 612, 1554, 1555, 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, 0, + 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 0, 0, 0, 179, + 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, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 0, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 0, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 0, 0, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 0, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 0, 609, 610, 611, 612, 174, 175, 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, + 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 179, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 188, 189, 190, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, 0, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 0, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 315, 316, 317, 0, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 0, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 1919, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 0, 609, 610, 611, 612, 174, 175, 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, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 0, 0, + 0, 179, 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, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 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, 184, 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, 2494, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 0, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 0, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 0, 0, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 315, 316, 317, 0, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 0, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 0, 609, 610, 611, 612, 174, 175, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 698, + 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, 176, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3052, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 177, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 0, + 0, 0, 3053, 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, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, 3054, + 189, 190, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 0, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 0, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 0, 0, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 315, 316, 317, 0, 318, 319, + 320, 3055, 322, 323, 324, 325, 0, 327, 328, 329, + 330, 331, 0, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 0, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 3056, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 0, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 3057, 605, + 606, 607, 608, 0, 609, 610, 611, 612, 174, 175, + 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, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 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, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, 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, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 0, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 0, 247, 248, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, + 302, 303, 0, 0, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 3175, 314, 315, 316, 317, 0, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 0, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 3176, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 0, 609, 610, 611, 612, 174, + 175, 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, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 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, 180, 0, + 0, 0, 0, 0, 0, 5666, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 0, 216, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 0, 247, 248, 249, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, + 301, 302, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 315, 316, 317, 0, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 0, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 0, 609, 610, 611, 612, + 174, 175, 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, 0, 0, 0, 0, 176, + 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, 177, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 0, 0, 0, 2819, 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, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 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, + 184, 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, 185, + 186, 187, 2820, 189, 190, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 0, 216, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 0, 247, 248, 249, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 300, 301, 302, 303, 0, 0, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 0, 318, 319, 320, 2821, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 0, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 0, 605, 606, 607, 608, 0, 609, 610, 611, + 612, 174, 175, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 698, 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, + 176, 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, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 3053, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 3054, 189, 190, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 0, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 0, 247, 248, 249, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 0, 318, 319, 320, 3055, 322, 323, 324, 325, + 0, 327, 328, 329, 330, 331, 0, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 0, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 3056, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 0, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 3057, 605, 606, 607, 608, 0, 609, 610, + 611, 612, 174, 175, 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, 0, 0, 0, + 0, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 0, 0, 0, 3407, 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, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 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, 184, 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, 185, 186, 187, 0, 189, 190, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 0, 318, 319, 320, 3410, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 3411, 605, 606, 607, 608, 0, 609, + 610, 611, 612, 174, 175, 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, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 902, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3623, -3623, -3623, + 177, 0, 0, 0, 0, 0, 0, 903, 0, 0, + 0, 14, 0, 0, 904, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 16, 0, 0, 905, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 906, 0, 0, 0, 0, 0, 0, 0, 907, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 908, 909, 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, 184, 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, 40, 0, 0, + 0, 0, 185, 186, 187, 910, 189, 0, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 0, 206, 207, 208, 209, + 210, 211, 212, 213, 0, 911, 0, 0, 217, 218, + 219, 220, 221, 0, 0, 224, 225, 226, 227, 228, + 0, 0, 0, 232, 233, 234, 235, 236, 912, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 247, + 0, 249, 0, 251, 252, 0, 254, 255, 256, 257, + 258, 259, 0, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 0, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 0, 284, 285, 286, + 287, -3623, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 0, 0, 0, 303, 0, 913, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 0, 0, 0, 0, 0, 319, 320, 914, 322, 323, + 324, 0, 326, 327, 0, 329, 330, 0, 0, 332, + 0, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 0, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 0, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 0, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 915, 0, 0, 440, + 0, 442, 443, 0, 445, 446, 447, 448, 0, 450, + 451, 452, 453, 0, 0, 0, 0, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 0, 485, 0, 487, 488, 489, 0, + 491, 492, 0, 494, 495, 496, 497, 498, 499, 0, + 501, 502, 503, 504, 505, 506, 507, 0, 509, 510, + 511, 0, 513, 514, 515, 516, 0, 518, 519, 0, + 0, 522, 523, 0, 0, 526, 527, 528, 0, 530, + 0, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 0, 541, 542, 0, 544, 0, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 0, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 0, 577, 578, 0, + 580, 581, 582, 583, 174, 175, 586, 587, 0, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 0, 0, 606, 607, 0, 0, + 609, 0, 611, 612, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, + 0, 0, 902, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 176, 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, -3624, + 0, 177, 0, 0, 0, 0, 0, 0, 903, 0, + 0, 0, 14, 0, 0, 904, 0, 0, 0, 0, + 178, 0, 0, 0, 0, 0, 16, 0, 0, 905, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 906, 0, 0, 0, 0, 0, 0, 0, + 907, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, + 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, + 0, 908, 909, 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, 184, 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, -3624, 0, 40, 0, + 0, 0, 0, 185, 186, 187, 910, 189, 0, 191, + 192, 193, 194, 0, 0, 0, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 0, 206, 207, 208, + 209, 210, 211, 212, 213, 0, 911, 0, 0, 217, + 218, 219, 220, 221, 0, 0, 224, 225, 226, 227, + 228, 0, 0, 0, 232, 233, 234, 235, 236, 912, + 238, 239, 240, 241, 0, 0, 0, 0, 0, 0, + 247, 0, 249, 0, 251, 252, 0, 254, 255, 256, + 257, 258, 259, 0, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 0, 275, 0, + 276, 277, 278, 279, 280, 281, 282, 0, 284, 285, + 286, 287, -3624, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 0, 0, 0, 303, 0, 913, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 0, 0, 0, 0, 0, 319, 320, 914, 322, + 323, 324, 0, 326, 327, 0, 329, 330, 0, 0, + 332, 0, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 0, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 0, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 0, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 0, 425, 426, 427, 428, 429, 430, + 431, 432, 0, 433, 434, 435, 436, 915, 0, 0, + 440, 0, 442, 443, 0, 445, 446, 447, 448, 0, + 450, 451, 452, 453, 0, 0, 0, 0, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 0, 485, 0, 487, 488, 489, + 0, 491, 492, 0, 494, 495, 496, 497, 498, 499, + 0, 501, 502, 503, 504, 505, 506, 507, 0, 509, + 510, 511, 0, 513, 514, 515, 516, 0, 518, 519, + 0, 0, 522, 523, 0, 0, 526, 527, 528, 0, + 530, 0, 532, 533, 534, 535, 0, 536, 537, 538, + 539, 0, 541, 542, 0, 544, 0, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 0, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 0, 577, 578, + 0, 580, 581, 582, 583, 174, 175, 586, 587, 0, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 0, 0, 606, 607, 0, + 0, 609, 0, 611, 612, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, + 0, 0, 0, 902, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, 903, + 0, 0, 0, 14, 0, 0, 904, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 16, 0, 0, + 905, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 906, 0, 0, 0, 0, 0, 0, + 0, 907, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 908, 909, 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, 184, 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, 40, + 0, 0, 0, 0, 185, 186, 187, 910, 189, 0, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 0, 911, 0, 0, + 217, 218, 219, 220, 221, 0, 0, 224, 225, 226, + 227, 228, 0, 0, 0, 232, 233, 234, 235, 236, + 912, 238, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 247, 0, 249, 0, 251, 252, 0, 254, 255, + 256, 257, 258, 259, 0, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 0, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 0, 284, + 285, 286, 287, 1538, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 0, 0, 0, 303, 0, + 913, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 0, 0, 0, 0, 0, 319, 320, 914, + 322, 323, 324, 0, 326, 327, 0, 329, 330, 0, + 0, 332, 0, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 0, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 0, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 0, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 915, 0, + 0, 440, 0, 442, 443, 0, 445, 446, 447, 448, + 0, 450, 451, 452, 453, 0, 0, 0, 0, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 0, 485, 0, 487, 488, + 489, 0, 491, 492, 0, 494, 495, 496, 497, 498, + 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, + 509, 510, 511, 0, 513, 514, 515, 516, 0, 518, + 519, 0, 0, 522, 523, 0, 0, 526, 527, 528, + 0, 530, 0, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 0, 541, 542, 0, 544, 0, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 0, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 0, 577, + 578, 0, 580, 581, 582, 583, 174, 175, 586, 587, + 0, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 0, 0, 606, 607, + 0, 0, 609, 0, 611, 612, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 0, 0, 0, 0, 902, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, 0, + 903, 0, 0, 0, 14, 0, 0, 904, 0, 0, + 0, 0, 178, 0, 0, 0, 0, 0, 16, 0, + 0, 905, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 906, 0, 0, 0, 0, 0, + 0, 0, 907, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 181, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, + 0, 0, 0, 908, 909, 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, 184, 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, + 40, 0, 0, 0, 0, 185, 186, 187, 910, 189, + 0, 191, 192, 193, 194, 0, 0, 0, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 0, 206, + 207, 208, 209, 210, 211, 212, 213, 0, 911, 0, + 0, 217, 218, 219, 220, 221, 0, 0, 224, 225, + 226, 227, 228, 0, 0, 0, 232, 233, 234, 235, + 236, 912, 238, 239, 240, 241, 0, 0, 0, 0, + 0, 0, 247, 0, 249, 0, 251, 252, 0, 254, + 255, 256, 257, 258, 259, 0, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 0, + 275, 0, 276, 277, 278, 279, 280, 281, 282, 0, + 284, 285, 286, 287, 3377, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 0, 0, 0, 303, + 0, 913, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 314, 0, 0, 0, 0, 0, 319, 320, + 914, 322, 323, 324, 0, 326, 327, 0, 329, 330, + 0, 0, 332, 0, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 0, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 0, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 0, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 0, 425, 426, 427, 428, + 429, 430, 431, 432, 0, 433, 434, 435, 436, 915, + 0, 0, 440, 0, 442, 443, 0, 445, 446, 447, + 448, 0, 450, 451, 452, 453, 0, 0, 0, 0, + 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 0, 485, 0, 487, + 488, 489, 0, 491, 492, 0, 494, 495, 496, 497, + 498, 499, 0, 501, 502, 503, 504, 505, 506, 507, + 0, 509, 510, 511, 0, 513, 514, 515, 516, 0, + 518, 519, 0, 0, 522, 523, 0, 0, 526, 527, + 528, 0, 530, 0, 532, 533, 534, 535, 0, 536, + 537, 538, 539, 0, 541, 542, 0, 544, 0, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 0, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 0, + 577, 578, 0, 580, 581, 582, 583, 174, 175, 586, + 587, 0, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 0, 0, 606, + 607, 0, 0, 609, 0, 611, 612, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 0, 0, 0, 0, 0, 902, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, 0, + 0, 903, 0, 0, 0, 14, 0, 0, 904, 0, + 0, 0, 0, 178, 0, 0, 0, 0, 0, 16, + 0, 0, 905, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 906, 0, 0, 0, 0, + 0, 0, 0, 907, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, + 0, 0, 0, 181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 0, 0, 0, 0, 908, 909, 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, 184, 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, 40, 0, 0, 0, 0, 185, 186, 187, 910, + 189, 0, 191, 192, 193, 194, 0, 0, 0, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 0, + 206, 207, 208, 209, 210, 211, 212, 213, 0, 911, + 0, 0, 217, 218, 219, 220, 221, 0, 0, 224, + 225, 226, 227, 228, 0, 0, 0, 232, 233, 234, + 235, 236, 912, 238, 239, 240, 241, 0, 0, 0, + 0, 0, 0, 247, 0, 249, 0, 251, 252, 0, + 254, 255, 256, 257, 258, 259, 0, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 0, 275, 0, 276, 277, 278, 279, 280, 281, 282, + 0, 284, 285, 286, 287, 3431, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 0, 0, 0, + 303, 0, 913, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 314, 0, 0, 0, 0, 0, 319, + 320, 914, 322, 323, 324, 0, 326, 327, 0, 329, + 330, 0, 0, 332, 0, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 0, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 0, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 0, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 0, 425, 426, 427, + 428, 429, 430, 431, 432, 0, 433, 434, 435, 436, + 915, 0, 0, 440, 0, 442, 443, 0, 445, 446, + 447, 448, 0, 450, 451, 452, 453, 0, 0, 0, + 0, 458, 459, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 0, 485, 0, + 487, 488, 489, 0, 491, 492, 0, 494, 495, 496, + 497, 498, 499, 0, 501, 502, 503, 504, 505, 506, + 507, 0, 509, 510, 511, 0, 513, 514, 515, 516, + 0, 518, 519, 0, 0, 522, 523, 0, 0, 526, + 527, 528, 0, 530, 0, 532, 533, 534, 535, 0, + 536, 537, 538, 539, 0, 541, 542, 0, 544, 0, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 0, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 0, 577, 578, 0, 580, 581, 582, 583, 174, 175, + 586, 587, 0, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 0, 0, + 606, 607, 0, 0, 609, 0, 611, 612, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 902, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, 0, + 0, 0, 903, 0, 0, 0, 14, 0, 0, 904, + 0, 0, 0, 0, 178, 0, 0, 0, 0, 0, + 16, 0, 0, 905, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 906, 0, 0, 0, + 0, 0, 0, 0, 907, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, + 0, 0, 0, 0, 181, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 29, 0, 0, 0, 0, 908, 909, 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, 184, 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, 40, 0, 0, 0, 0, 185, 186, 187, + 910, 189, 0, 191, 192, 193, 194, 0, 0, 0, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 0, 206, 207, 208, 209, 210, 211, 212, 213, 0, + 911, 0, 0, 217, 218, 219, 220, 221, 0, 0, + 224, 225, 226, 227, 228, 0, 0, 0, 232, 233, + 234, 235, 236, 912, 238, 239, 240, 241, 0, 0, + 0, 0, 0, 0, 247, 0, 249, 0, 251, 252, + 0, 254, 255, 256, 257, 258, 259, 0, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 0, 275, 0, 276, 277, 278, 279, 280, 281, + 282, 0, 284, 285, 286, 287, 3893, 289, 290, 291, + 292, 293, 294, 295, 296, 297, 298, 299, 0, 0, + 0, 303, 0, 913, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 0, 0, 0, 0, 0, + 319, 320, 914, 322, 323, 324, 0, 326, 327, 0, + 329, 330, 0, 0, 332, 0, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 0, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 0, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 0, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 0, 425, 426, + 427, 428, 429, 430, 431, 432, 0, 433, 434, 435, + 436, 915, 0, 0, 440, 0, 442, 443, 0, 445, + 446, 447, 448, 0, 450, 451, 452, 453, 0, 0, + 0, 0, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 0, 485, + 0, 487, 488, 489, 0, 491, 492, 0, 494, 495, + 496, 497, 498, 499, 0, 501, 502, 503, 504, 505, + 506, 507, 0, 509, 510, 511, 0, 513, 514, 515, + 516, 0, 518, 519, 0, 0, 522, 523, 0, 0, + 526, 527, 528, 0, 530, 0, 532, 533, 534, 535, + 0, 536, 537, 538, 539, 0, 541, 542, 0, 544, + 0, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 0, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 0, 577, 578, 0, 580, 581, 582, 583, 174, + 175, 586, 587, 0, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 0, + 0, 606, 607, 0, 0, 609, 0, 611, 612, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, + 0, 0, 0, 0, 0, 0, 0, 902, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 176, 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, 177, 0, 0, 0, + 0, 0, 0, 903, 0, 0, 0, 14, 0, 0, + 904, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 16, 0, 0, 905, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 906, 0, 0, + 0, 0, 0, 0, 0, 907, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 908, 909, 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, 184, + 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, 40, 0, 0, 0, 0, 185, 186, + 187, 910, 189, 0, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 0, 911, 0, 0, 217, 218, 219, 220, 221, 0, + 0, 224, 225, 226, 227, 228, 0, 0, 0, 232, + 233, 234, 235, 236, 912, 238, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 247, 0, 249, 0, 251, + 252, 0, 254, 255, 256, 257, 258, 259, 0, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 0, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 0, 284, 285, 286, 287, 3899, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 0, + 0, 0, 303, 0, 913, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 0, 0, 0, 0, + 0, 319, 320, 914, 322, 323, 324, 0, 326, 327, + 0, 329, 330, 0, 0, 332, 0, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 0, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 0, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 0, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 915, 0, 0, 440, 0, 442, 443, 0, + 445, 446, 447, 448, 0, 450, 451, 452, 453, 0, + 0, 0, 0, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 0, + 485, 0, 487, 488, 489, 0, 491, 492, 0, 494, + 495, 496, 497, 498, 499, 0, 501, 502, 503, 504, + 505, 506, 507, 0, 509, 510, 511, 0, 513, 514, + 515, 516, 0, 518, 519, 0, 0, 522, 523, 0, + 0, 526, 527, 528, 0, 530, 0, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 0, 541, 542, 0, + 544, 0, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 0, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 0, 577, 578, 0, 580, 581, 582, 583, + 174, 175, 586, 587, 0, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 0, 0, 606, 607, 0, 0, 609, 0, 611, 612, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 902, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, + 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, 177, 0, 0, + 0, 0, 0, 0, 903, 0, 0, 0, 14, 0, + 0, 904, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 16, 0, 0, 905, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 906, 0, + 0, 0, 0, 0, 0, 0, 907, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, + 0, 0, 0, 0, 0, 0, 181, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 182, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 908, 909, 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, + 184, 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, 40, 0, 0, 0, 0, 185, + 186, 187, 910, 189, 0, 191, 192, 193, 194, 0, + 0, 0, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 0, 206, 207, 208, 209, 210, 211, 212, + 213, 0, 911, 0, 0, 217, 218, 219, 220, 221, + 0, 0, 224, 225, 226, 227, 228, 0, 0, 0, + 232, 233, 234, 235, 236, 912, 238, 239, 240, 241, + 0, 0, 0, 0, 0, 0, 247, 0, 249, 0, + 251, 252, 0, 254, 255, 256, 257, 258, 259, 0, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 0, 275, 0, 276, 277, 278, 279, + 280, 281, 282, 0, 284, 285, 286, 287, 4198, 289, + 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, + 0, 0, 0, 303, 0, 913, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 0, 0, 0, + 0, 0, 319, 320, 914, 322, 323, 324, 0, 326, + 327, 0, 329, 330, 0, 0, 332, 0, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 0, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 0, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 0, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 0, + 425, 426, 427, 428, 429, 430, 431, 432, 0, 433, + 434, 435, 436, 915, 0, 0, 440, 0, 442, 443, + 0, 445, 446, 447, 448, 0, 450, 451, 452, 453, + 0, 0, 0, 0, 458, 459, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 0, 485, 0, 487, 488, 489, 0, 491, 492, 0, + 494, 495, 496, 497, 498, 499, 0, 501, 502, 503, + 504, 505, 506, 507, 0, 509, 510, 511, 0, 513, + 514, 515, 516, 0, 518, 519, 0, 0, 522, 523, + 0, 0, 526, 527, 528, 0, 530, 0, 532, 533, + 534, 535, 0, 536, 537, 538, 539, 0, 541, 542, + 0, 544, 0, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 0, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 0, 577, 578, 0, 580, 581, 582, + 583, 174, 175, 586, 587, 0, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 0, 0, 606, 607, 0, 0, 609, 0, 611, + 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 0, 0, 0, 0, 0, 0, 0, 0, 902, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 176, 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, 177, 0, + 0, 0, 0, 0, 0, 903, 0, 0, 0, 14, + 0, 0, 904, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 16, 0, 0, 905, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 906, + 0, 0, 0, 0, 0, 0, 0, 907, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 29, 0, 0, 0, 0, 908, 909, + 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, 184, 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, 40, 0, 0, 0, 0, + 185, 186, 187, 910, 189, 0, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 0, 911, 0, 0, 217, 218, 219, 220, + 221, 0, 0, 224, 225, 226, 227, 228, 0, 0, + 0, 232, 233, 234, 235, 236, 912, 238, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 247, 0, 249, + 0, 251, 252, 0, 254, 255, 256, 257, 258, 259, + 0, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 0, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 0, 284, 285, 286, 287, 0, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 0, 0, 0, 303, 0, 913, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, + 0, 0, 0, 319, 320, 914, 322, 323, 324, 0, + 326, 327, 0, 329, 330, 0, 0, 332, 0, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 0, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 0, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 0, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 915, 0, 0, 440, 0, 442, + 443, 0, 445, 446, 447, 448, 0, 450, 451, 452, + 453, 0, 0, 0, 0, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 0, 485, 0, 487, 488, 489, 0, 491, 492, + 0, 494, 495, 496, 497, 498, 499, 0, 501, 502, + 503, 504, 505, 506, 507, 0, 509, 510, 511, 0, + 513, 514, 515, 516, 0, 518, 519, 0, 0, 522, + 523, 0, 0, 526, 527, 528, 0, 530, 0, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 0, 541, + 542, 0, 544, 0, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 0, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 0, 577, 578, 0, 580, 581, + 582, 583, 174, 175, 586, 587, 0, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 0, 0, 606, 607, 0, 0, 609, 0, + 611, 612, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, + 902, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 176, 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, 177, + 0, 0, 0, 0, 0, 0, 903, 0, 0, 0, + 14, 0, 0, 904, 0, 0, 0, 0, 178, 0, + 0, 0, 0, 0, 16, 0, 0, 905, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 906, 0, 0, 0, 0, 0, 0, 0, 907, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 180, 0, 0, 0, 0, 0, 0, 181, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 29, 0, 0, 0, 0, 908, + 909, 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, 184, 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, 40, 0, 0, 0, + 0, 185, 186, 187, 910, 189, 0, 191, 192, 193, + 194, 0, 0, 0, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 0, 206, 207, 208, 209, 210, + 211, 212, 213, 0, 911, 0, 0, 217, 218, 219, + 220, 221, 0, 0, 224, 225, 226, 227, 228, 0, + 0, 0, 232, 233, 234, 235, 236, 912, 238, 239, + 240, 241, 0, 0, 0, 0, 0, 0, 247, 0, + 249, 0, 251, 252, 0, 254, 255, 256, 257, 258, + 259, 0, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 0, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 0, 284, 285, 286, 287, + 0, 289, 290, 291, 292, 293, 294, 295, 296, 297, + 298, 299, 0, 0, 0, 303, 0, 913, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 0, + 0, 0, 0, 0, 319, 320, 914, 322, 323, 324, + 0, 326, 327, 0, 329, 330, 0, 0, 332, 0, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 0, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 0, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 0, 425, 426, 427, 428, 429, 430, 431, 432, + 0, 433, 434, 435, 436, 915, 0, 0, 440, 0, + 442, 443, 0, 445, 446, 447, 448, 0, 450, 451, + 452, 453, 0, 0, 0, 0, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 0, 485, 0, 487, 488, 489, 0, 491, + 492, 0, 494, 495, 496, 497, 498, 499, 0, 501, + 502, 503, 504, 505, 506, 507, 0, 509, 510, 511, + 0, 513, 514, 515, 516, 0, 518, 519, 0, 0, + 522, 523, 0, 0, 526, 527, 528, 0, 530, 0, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 0, + 541, 542, 0, 544, 0, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 0, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 0, 577, 578, 0, 580, + 581, 582, 583, 174, 175, 586, 1741, 0, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 0, 0, 606, 607, 0, 0, 609, + 0, 611, 612, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 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, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 14, 0, 0, 0, 0, 0, 0, 0, 178, + 0, 0, 0, 0, 0, 16, 0, 0, 905, 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, 21, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 180, 0, 0, 0, 0, 0, 0, 181, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, + 908, 909, 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, 184, 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, 40, 0, 0, + 0, 0, 185, 186, 187, 910, 189, 0, 191, 192, + 193, 194, 0, 0, 0, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 0, 206, 207, 208, 209, + 210, 211, 212, 213, 0, 911, 0, 0, 217, 218, + 219, 220, 221, 0, 0, 224, 225, 226, 227, 228, + 0, 0, 0, 232, 233, 234, 235, 236, 0, 238, + 239, 240, 241, 0, 0, 0, 0, 0, 0, 247, + 0, 249, 0, 251, 252, 0, 254, 255, 256, 257, + 258, 259, 0, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 0, 275, 0, 276, + 277, 278, 279, 280, 281, 282, 0, 284, 285, 286, + 287, 0, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 0, 0, 0, 303, 0, 0, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 0, 0, 0, 0, 0, 319, 320, 914, 322, 323, + 324, 0, 326, 327, 0, 329, 330, 0, 0, 332, + 0, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 0, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 0, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 0, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 0, 425, 426, 427, 428, 429, 430, 431, + 432, 0, 433, 434, 435, 436, 0, 0, 0, 440, + 0, 442, 443, 0, 445, 446, 447, 448, 0, 450, + 451, 452, 453, 0, 0, 0, 0, 458, 459, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 0, 485, 0, 487, 488, 489, 0, + 491, 492, 0, 494, 495, 496, 497, 498, 499, 0, + 501, 502, 503, 504, 505, 506, 507, 0, 509, 510, + 511, 0, 513, 514, 515, 516, 0, 518, 519, 174, + 175, 522, 523, 0, 0, 526, 527, 528, 0, 530, + 0, 532, 533, 534, 535, 0, 536, 537, 538, 539, + 0, 541, 542, 0, 544, 0, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 0, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 0, 577, 578, 0, + 580, 581, 582, 583, 0, 0, 586, 587, 176, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 0, 0, 606, 607, 0, 0, + 609, 0, 611, 612, 0, 0, 177, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 178, 0, 0, 0, 0, + 0, 0, 0, 0, 905, 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, 180, 0, + 0, 0, 0, 0, 0, 181, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 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, 184, + 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, 1524, 0, 0, 0, 0, 0, 0, 185, 186, + 187, 910, 189, 0, 191, 192, 193, 194, 0, 0, + 0, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 0, 206, 207, 208, 209, 210, 211, 212, 213, + 0, 0, 0, 0, 217, 218, 219, 220, 221, 0, + 0, 224, 225, 226, 227, 228, 0, 0, 0, 232, + 233, 234, 235, 236, 0, 238, 239, 240, 241, 0, + 0, 0, 0, 0, 0, 247, 0, 249, 0, 251, + 252, 0, 254, 255, 256, 257, 258, 259, 0, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 0, 275, 0, 276, 277, 278, 279, 280, + 281, 282, 0, 284, 285, 286, 287, 0, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, 299, 0, + 0, 0, 303, 0, 0, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 314, 0, 0, 0, 0, + 0, 319, 320, 914, 322, 323, 324, 0, 326, 327, + 0, 329, 330, 0, 0, 332, 0, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 0, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 0, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 0, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 0, 425, + 426, 427, 428, 429, 430, 431, 432, 0, 433, 434, + 435, 436, 0, 0, 0, 440, 0, 442, 443, 0, + 445, 446, 447, 448, 0, 450, 451, 452, 453, 0, + 0, 0, 0, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 0, + 485, 0, 487, 488, 489, 0, 491, 492, 0, 494, + 495, 496, 497, 498, 499, 0, 501, 502, 503, 504, + 505, 506, 507, 0, 509, 510, 511, 0, 513, 514, + 515, 516, 0, 518, 519, 174, 175, 522, 523, 0, + 0, 526, 527, 528, 0, 530, 0, 532, 533, 534, + 535, 0, 536, 537, 538, 539, 0, 541, 542, 0, + 544, 0, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 0, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 0, 577, 578, 0, 580, 581, 582, 583, + 0, 0, 586, 587, 176, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 0, 0, 606, 607, 0, 0, 609, 0, 611, 612, + 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 178, 0, 0, 0, 0, 0, 0, 0, 0, + 905, 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, 180, 0, 0, 0, 0, 0, + 0, 181, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 183, 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, 184, 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, 1535, 0, 0, + 0, 0, 0, 0, 185, 186, 187, 910, 189, 0, + 191, 192, 193, 194, 0, 0, 0, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 0, 206, 207, + 208, 209, 210, 211, 212, 213, 0, 0, 0, 0, + 217, 218, 219, 220, 221, 0, 0, 224, 225, 226, + 227, 228, 0, 0, 0, 232, 233, 234, 235, 236, + 0, 238, 239, 240, 241, 0, 0, 0, 0, 0, + 0, 247, 0, 249, 0, 251, 252, 0, 254, 255, + 256, 257, 258, 259, 0, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 0, 275, + 0, 276, 277, 278, 279, 280, 281, 282, 0, 284, + 285, 286, 287, 0, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 0, 0, 0, 303, 0, + 0, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 314, 0, 0, 0, 0, 0, 319, 320, 914, + 322, 323, 324, 0, 326, 327, 0, 329, 330, 0, + 0, 332, 0, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 0, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 0, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 0, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 0, 425, 426, 427, 428, 429, + 430, 431, 432, 0, 433, 434, 435, 436, 0, 0, + 0, 440, 0, 442, 443, 0, 445, 446, 447, 448, + 0, 450, 451, 452, 453, 0, 0, 0, 0, 458, + 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 0, 485, 0, 487, 488, + 489, 0, 491, 492, 0, 494, 495, 496, 497, 498, + 499, 0, 501, 502, 503, 504, 505, 506, 507, 0, + 509, 510, 511, 0, 513, 514, 515, 516, 0, 518, + 519, 174, 175, 522, 523, 0, 0, 526, 527, 528, + 0, 530, 0, 532, 533, 534, 535, 0, 536, 537, + 538, 539, 0, 541, 542, 0, 544, 0, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 0, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 0, 577, + 578, 0, 580, 581, 582, 583, 0, 0, 586, 587, + 176, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 0, 0, 606, 607, + 0, 0, 609, 0, 611, 612, 0, 0, 177, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 178, 0, 0, + 0, 0, 0, 0, 0, 0, 905, 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, + 180, 0, 0, 0, 0, 0, 0, 181, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 183, 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, 184, 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, + 185, 186, 187, 910, 189, 0, 191, 192, 193, 194, + 0, 0, 0, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 0, 206, 207, 208, 209, 210, 211, + 212, 213, 0, 0, 0, 0, 217, 218, 219, 220, + 221, 0, 0, 224, 225, 226, 227, 228, 0, 0, + 0, 232, 233, 234, 235, 236, 0, 238, 239, 240, + 241, 0, 0, 0, 0, 0, 0, 247, 0, 249, + 0, 251, 252, 0, 254, 255, 256, 257, 258, 259, + 0, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 0, 275, 0, 276, 277, 278, + 279, 280, 281, 282, 0, 284, 285, 286, 287, 0, + 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, + 299, 0, 0, 0, 303, 0, 0, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 0, 0, + 0, 0, 0, 319, 320, 914, 322, 323, 324, 0, + 326, 327, 0, 329, 330, 0, 0, 332, 0, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 0, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 0, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 0, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 0, 425, 426, 427, 428, 429, 430, 431, 432, 0, + 433, 434, 435, 436, 0, 0, 0, 440, 0, 442, + 443, 0, 445, 446, 447, 448, 0, 450, 451, 452, + 453, 0, 0, 0, 0, 458, 459, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 0, 485, 0, 487, 488, 489, 0, 491, 492, + 0, 494, 495, 496, 497, 498, 499, 0, 501, 502, + 503, 504, 505, 506, 507, 0, 509, 510, 511, 0, + 513, 514, 515, 516, 0, 518, 519, 0, 0, 522, + 523, 0, 0, 526, 527, 528, 0, 530, 0, 532, + 533, 534, 535, 0, 536, 537, 538, 539, 0, 541, + 542, 0, 544, 0, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 0, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 0, 577, 578, 0, 580, 581, + 582, 583, 0, 0, 586, 587, 0, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 174, 175, 606, 607, 0, 0, 609, 0, + 611, 612, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3451, 3452, + 3453, 3454, 3455, 3456, 3457, 3458, 3459, 3460, 3461, 0, + 3462, 3463, 3464, 3465, 0, 0, 3466, 3467, 3468, 3469, + 3470, 3471, 3472, 3473, 3474, 3475, 3476, 0, 3477, 3478, + 3479, 3480, 3481, 3482, 3483, 3484, 3485, 3486, 3487, 0, + 3488, 176, 3489, 3490, 3491, 3492, 3493, 3494, 3495, 3496, + 3497, 3498, 3499, 3500, 3501, 3502, 3503, 3504, 3505, 3506, + 3507, 3508, 3509, 3510, 3511, 3512, 3513, 3514, 3515, 177, + 3516, 3517, 3518, 3519, 3520, 3521, 3522, 3523, 3524, 3525, + 0, 3526, 3527, 3528, 3529, 3530, 0, 0, 178, 3531, + 3532, 3533, 3534, 3535, 3536, 3537, 3538, 3539, 3540, 3541, + 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3549, 3550, 3551, + 3552, 3553, 3554, 3555, 3556, 3557, 3558, 3559, 3560, 3561, + 3562, 3563, 3564, 3565, 3566, 3567, 3568, 0, 0, 0, + 3569, 3570, 3571, 3572, 3573, 3574, 3575, 0, 0, 0, + 3576, 180, 3577, 3578, 3579, 3580, 3581, 3582, 181, 3583, + 3584, 3585, 3586, 3587, 3588, 0, 3589, 3590, 3591, 3592, + 182, 3593, 3594, 3595, 3596, 3597, 3598, 3599, 3600, 3601, + 3602, 183, 3603, 3604, 3605, 3606, 3607, 3608, 3609, 3610, + 3611, 3612, 3613, 3614, 3615, 3616, 3617, 0, 3618, 3619, + 3620, 3621, 3622, 3623, 3624, 3625, 3626, 3627, 3628, 3629, + 3630, 3631, 3632, 3633, 3634, 3635, 3636, 3637, 3638, 3639, + 3640, 0, 3641, 3642, 0, 3643, 3644, 3645, 3646, 3647, + 3648, 3649, 3650, 3651, 3652, 3653, 3654, 3655, 3656, 3657, + 3658, 3659, 184, 3660, 3661, 3662, 3663, 0, 0, 0, + 3664, 3665, 3666, 3667, 3668, 3669, 3670, 3671, 3672, 3673, + 3674, 3675, 3676, 3677, 3678, 3679, 3680, 3681, 3682, 0, + 3683, 3684, 3685, 3686, 3687, 3688, 3689, 3690, 3691, 3692, + 3693, 185, 186, 187, 0, 189, 190, 191, 192, 193, + 194, 3694, 3695, 3696, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, + 211, 212, 213, 214, 215, 0, 216, 0, 218, 0, + 0, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 0, 0, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 0, 247, 248, + 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 3697, 3698, 273, 274, 275, 0, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 0, 293, 294, 295, 296, 297, + 298, 299, 300, 301, 302, 303, 0, 0, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 0, 315, + 316, 317, 0, 318, 319, 320, 0, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 0, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 0, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 0, 389, 390, 391, 392, + 393, 394, 395, 0, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 0, 3699, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 0, 0, 0, 432, + 3700, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 0, 0, + 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 0, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 0, 516, 517, 518, 519, 520, 3701, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 532, 533, 534, 535, 0, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 0, 565, 566, 0, 568, 569, 3702, + 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 0, 3703, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 0, 605, 606, 607, 608, 0, 609, + 610, 611 +}; + +static const yytype_int16 yycheck[] = +{ + 5, 165, 68, 44, 163, 916, 0, 0, 678, 679, + 1671, 1397, 0, 1171, 1906, 1173, 1174, 1722, 657, 1876, + 173, 26, 789, 1181, 1932, 30, 2086, 22, 2044, 657, + 35, 1456, 789, 38, 673, 0, 162, 1595, 1735, 678, + 1580, 3047, 759, 2694, 0, 673, 51, 1586, 3355, 2553, + 2096, 1931, 57, 678, 2015, 1229, 61, 52, 2848, 1365, + 678, 3273, 1368, 58, 3376, 744, 646, 746, 704, 3202, + 749, 750, 3243, 997, 68, 1135, 31, 902, 160, 904, + 3268, 906, 907, 3119, 4051, 1625, 3973, 4051, 913, 2564, + 1368, 1362, 678, 2859, 2860, 1616, 676, 646, 1533, 3948, + 3949, 1850, 678, 3274, 2475, 1405, 2876, 2627, 2878, 1502, + 678, 1405, 2562, 1356, 45, 3257, 966, 1655, 123, 1295, + 2879, 1208, 1792, 1793, 3496, 2591, 827, 676, 721, 3135, + 2664, 724, 4206, 2875, 2967, 1673, 2734, 2879, 1735, 1799, + 134, 134, 4216, 1230, 2063, 2176, 1337, 2034, 678, 4223, + 657, 156, 157, 1900, 173, 160, 173, 162, 173, 1819, + 4051, 4216, 3702, 4874, 173, 173, 673, 4572, 4223, 134, + 2655, 678, 123, 3697, 4679, 2654, 2655, 3327, 3702, 173, + 173, 1452, 3949, 1843, 1844, 173, 5035, 1708, 1709, 1710, + 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, 1720, + 3025, 12, 4051, 1900, 3930, 15, 4529, 4529, 173, 4529, + 4486, 16, 17, 1693, 6, 7, 3496, 1067, 1068, 1069, + 15, 1701, 1702, 26, 1704, 1705, 1137, 1897, 42, 4530, + 1080, 4532, 31, 3319, 4535, 6, 7, 31, 42, 6, + 7, 31, 4141, 4142, 26, 51, 4145, 47, 4549, 6, + 7, 6, 7, 4152, 6, 7, 26, 1433, 31, 4158, + 67, 53, 783, 902, 26, 904, 127, 906, 907, 657, + 31, 6, 7, 47, 913, 4581, 42, 916, 28, 2187, + 3509, 42, 42, 26, 127, 673, 3119, 2772, 71, 5159, + 5160, 5126, 4377, 2772, 11, 12, 33, 47, 104, 26, + 89, 26, 42, 1900, 41, 1231, 3342, 33, 24, 25, + 26, 4669, 28, 50, 30, 41, 32, 24, 25, 26, + 26, 28, 771, 30, 50, 32, 47, 628, 99, 33, + 28, 33, 24, 25, 26, 770, 28, 41, 30, 41, + 32, 755, 33, 145, 53, 173, 50, 42, 50, 203, + 41, 53, 31, 42, 123, 88, 123, 203, 42, 50, + 47, 26, 14, 178, 242, 203, 299, 2817, 14, 5709, + 182, 123, 99, 3295, 99, 206, 65, 3842, 3843, 42, + 65, 244, 314, 158, 685, 5180, 3462, 254, 33, 136, + 804, 43, 44, 99, 268, 902, 41, 904, 3474, 906, + 907, 168, 143, 3683, 314, 50, 913, 1467, 143, 916, + 57, 33, 33, 26, 127, 128, 168, 232, 378, 41, + 41, 143, 172, 3703, 128, 42, 1861, 314, 50, 50, + 4420, 2557, 127, 318, 99, 168, 1496, 244, 305, 391, + 26, 281, 42, 254, 42, 99, 33, 63, 310, 391, + 33, 427, 5482, 295, 41, 107, 178, 1979, 41, 387, + 14, 107, 1861, 50, 267, 127, 294, 50, 99, 51, + 5327, 208, 40, 5813, 633, 317, 635, 636, 637, 638, + 639, 640, 208, 642, 643, 2545, 99, 369, 33, 43, + 44, 4835, 4454, 591, 305, 4876, 41, 435, 1137, 151, + 60, 67, 14, 314, 208, 50, 208, 116, 47, 3342, + 114, 299, 53, 672, 902, 816, 904, 208, 906, 907, + 646, 5306, 104, 197, 337, 913, 33, 53, 916, 314, + 2438, 43, 44, 54, 41, 4875, 122, 254, 239, 644, + 192, 258, 299, 50, 33, 312, 192, 201, 33, 1935, + 676, 572, 41, 107, 122, 1256, 41, 1950, 341, 75, + 312, 50, 4636, 208, 5069, 50, 119, 726, 727, 209, + 31, 697, 5442, 4563, 10, 4881, 433, 96, 315, 471, + 122, 4636, 31, 366, 141, 711, 208, 208, 305, 315, + 5891, 170, 1750, 328, 5895, 107, 764, 314, 4672, 152, + 232, 769, 53, 771, 145, 4454, 408, 1765, 299, 458, + 160, 315, 494, 315, 33, 386, 71, 4672, 919, 160, + 1337, 208, 50, 3699, 315, 208, 1100, 203, 196, 314, + 1137, 50, 1225, 201, 1227, 779, 155, 217, 192, 1318, + 645, 646, 1321, 787, 528, 33, 1325, 1326, 1327, 31, + 463, 314, 4539, 41, 2534, 4729, 403, 203, 1132, 201, + 1584, 57, 50, 208, 1421, 670, 4557, 67, 225, 203, + 315, 676, 251, 203, 4729, 71, 1600, 73, 244, 805, + 192, 779, 787, 323, 1744, 5542, 691, 846, 847, 2546, + 4214, 127, 697, 315, 315, 251, 2002, 5055, 629, 3233, + 182, 208, 364, 3237, 290, 710, 711, 311, 4557, 1796, + 686, 1798, 1562, 1563, 1801, 234, 671, 843, 3089, 208, + 236, 2682, 290, 208, 2002, 746, 1813, 178, 315, 1816, + 1790, 99, 315, 1820, 2034, 2861, 4635, 4044, 743, 292, + 2034, 3226, 374, 1444, 281, 1502, 287, 3226, 290, 1137, + 688, 2186, 601, 475, 759, 386, 838, 839, 840, 1846, + 1847, 1848, 6063, 4135, 4663, 4137, 287, 1468, 4667, 307, + 315, 776, 310, 299, 4146, 4674, 770, 2669, 432, 5564, + 1971, 232, 713, 675, 789, 153, 448, 2186, 450, 3825, + 721, 1982, 5822, 724, 4166, 580, 2354, 2355, 726, 33, + 805, 1440, 504, 688, 3954, 4177, 143, 41, 315, 814, + 577, 1735, 3818, 695, 169, 2723, 50, 281, 658, 779, + 208, 568, 827, 432, 666, 577, 315, 779, 5172, 834, + 315, 836, 506, 838, 839, 840, 841, 643, 843, 378, + 581, 178, 797, 384, 244, 787, 33, 780, 123, 782, + 782, 1552, 5647, 4133, 41, 4135, 684, 4137, 258, 287, + 33, 281, 299, 50, 639, 4330, 4146, 568, 41, 743, + 911, 33, 782, 1723, 229, 2535, 6216, 50, 540, 41, + 630, 528, 4162, 2763, 2792, 1465, 4166, 842, 50, 844, + 747, 50, 614, 168, 644, 782, 901, 4177, 903, 2379, + 2380, 54, 2382, 2383, 782, 281, 2082, 912, 658, 4871, + 915, 366, 779, 376, 593, 1841, 107, 779, 72, 782, + 1334, 782, 472, 928, 918, 918, 33, 315, 782, 5014, + 918, 681, 299, 1440, 41, 723, 782, 1573, 33, 782, + 755, 710, 3392, 50, 782, 341, 41, 730, 669, 763, + 1399, 782, 614, 918, 743, 50, 758, 1392, 5264, 763, + 4189, 4047, 768, 359, 33, 712, 769, 779, 779, 779, + 366, 763, 41, 787, 208, 782, 1900, 782, 1745, 779, + 779, 50, 669, 787, 779, 779, 1703, 769, 1745, 779, + 759, 4981, 3825, 5269, 786, 5271, 5831, 763, 780, 769, + 782, 192, 763, 763, 1070, 779, 779, 769, 3833, 5332, + 5332, 4978, 5332, 1649, 4978, 786, 477, 5375, 780, 786, + 782, 208, 4871, 763, 4873, 758, 769, 787, 3950, 786, + 717, 786, 2781, 5334, 786, 208, 1162, 780, 5908, 782, + 5910, 5911, 769, 780, 769, 1171, 208, 787, 1174, 629, + 1817, 786, 1440, 1179, 763, 4131, 4132, 742, 33, 785, + 1817, 643, 779, 769, 780, 547, 41, 1072, 763, 782, + 768, 769, 688, 780, 763, 50, 1070, 4153, 782, 763, + 782, 315, 1070, 4159, 1210, 5590, 5935, 4978, 780, 4815, + 2150, 782, 4168, 649, 4170, 4171, 4172, 314, 4174, 4175, + 763, 208, 1781, 787, 769, 5510, 4873, 1777, 4184, 4185, + 4186, 4187, 4188, 208, 766, 767, 768, 769, 770, 771, + 772, 773, 768, 769, 770, 771, 772, 773, 315, 4978, + 1135, 5512, 901, 1850, 6004, 6005, 696, 782, 1777, 208, + 2662, 2663, 315, 88, 593, 6015, 763, 35, 36, 37, + 505, 39, 1777, 315, 5865, 5866, 769, 1162, 780, 1777, + 2071, 782, 5502, 763, 732, 763, 1171, 704, 568, 1174, + 787, 5511, 1752, 692, 1179, 4008, 4009, 376, 5168, 4012, + 4013, 232, 335, 769, 4724, 4018, 4019, 787, 4728, 787, + 732, 1777, 560, 1950, 376, 782, 578, 780, 6068, 782, + 4724, 1777, 782, 1752, 4728, 1210, 782, 361, 315, 1777, + 369, 593, 4045, 1914, 768, 769, 770, 771, 772, 773, + 315, 33, 763, 1524, 281, 688, 143, 780, 376, 41, + 1271, 1399, 1358, 208, 1535, 780, 782, 782, 50, 208, + 704, 254, 1395, 1248, 1195, 1250, 315, 1777, 782, 787, + 1255, 1256, 782, 232, 1971, 767, 768, 769, 770, 771, + 772, 773, 333, 1422, 331, 1982, 1983, 1272, 156, 2127, + 1777, 1337, 232, 1952, 1953, 782, 1281, 614, 160, 743, + 1959, 1960, 1961, 3163, 704, 1236, 3033, 653, 393, 270, + 1295, 1296, 305, 782, 1225, 780, 1227, 1890, 5372, 2457, + 5374, 314, 577, 3160, 755, 4493, 143, 5297, 4496, 5299, + 3190, 1316, 763, 3200, 5304, 735, 2474, 5372, 5562, 5374, + 2478, 5311, 5312, 2623, 1917, 4475, 448, 178, 704, 2623, + 3981, 5321, 1337, 1338, 730, 494, 3033, 5327, 448, 1465, + 315, 2265, 371, 1337, 3995, 782, 4718, 1429, 703, 1337, + 787, 390, 506, 1358, 580, 4497, 33, 2531, 2783, 211, + 14, 4367, 33, 580, 1319, 1320, 1297, 743, 2038, 1949, + 41, 1376, 232, 50, 2434, 2435, 1395, 5627, 1395, 50, + 1395, 298, 2688, 2904, 2690, 2691, 1395, 1395, 369, 43, + 44, 178, 1397, 1398, 782, 178, 208, 53, 1392, 2699, + 2460, 1395, 1395, 1408, 2797, 2699, 3437, 1395, 2109, 2110, + 2688, 3330, 2690, 2691, 1419, 782, 1421, 2504, 409, 410, + 787, 2508, 40, 2510, 1429, 1430, 71, 1553, 1433, 173, + 1395, 723, 2071, 3967, 3968, 580, 3033, 2524, 4718, 1444, + 1741, 492, 5824, 1448, 3910, 1450, 5690, 510, 3006, 3007, + 2537, 2538, 2643, 107, 5176, 1460, 5802, 2996, 2649, 779, + 1465, 298, 1467, 1468, 101, 3373, 4064, 787, 71, 3129, + 73, 40, 2111, 1404, 3012, 3013, 3014, 3015, 3963, 3964, + 551, 1250, 3853, 2111, 3963, 3964, 1255, 143, 3028, 688, + 553, 1496, 614, 4499, 33, 787, 3867, 1502, 649, 528, + 3871, 3022, 41, 315, 614, 4264, 688, 2146, 613, 5759, + 31, 50, 2033, 494, 1264, 145, 33, 2997, 2146, 2999, + 2159, 1526, 4264, 358, 41, 1275, 593, 143, 1594, 755, + 160, 476, 492, 50, 2159, 72, 695, 208, 192, 127, + 688, 2159, 459, 193, 2183, 2184, 780, 1552, 1553, 33, + 462, 2727, 5542, 33, 4387, 2183, 2184, 41, 5548, 33, + 2163, 41, 633, 414, 2071, 5464, 50, 41, 1337, 33, + 50, 423, 976, 977, 978, 2818, 50, 41, 196, 770, + 771, 772, 773, 2159, 363, 566, 50, 2445, 2446, 126, + 472, 2159, 1586, 780, 338, 782, 1722, 4117, 4118, 448, + 1594, 658, 258, 657, 2111, 392, 1594, 780, 40, 782, + 755, 110, 5646, 33, 736, 654, 3365, 1021, 780, 673, + 782, 41, 459, 474, 678, 688, 1752, 196, 779, 2159, + 50, 414, 492, 287, 572, 10, 5050, 472, 315, 2146, + 669, 586, 298, 33, 315, 1650, 167, 704, 593, 1654, + 1419, 41, 2159, 632, 599, 1660, 1697, 33, 6040, 296, + 50, 1430, 307, 572, 2381, 41, 1671, 582, 71, 208, + 73, 235, 782, 780, 50, 4125, 2183, 2184, 590, 1448, + 659, 1450, 6028, 2071, 40, 780, 57, 1851, 225, 1683, + 1683, 208, 5682, 101, 19, 20, 99, 3367, 99, 99, + 1782, 1783, 73, 1785, 1786, 1787, 1788, 357, 3229, 641, + 145, 5701, 328, 782, 695, 1797, 28, 1722, 30, 1724, + 214, 2357, 713, 2111, 208, 716, 314, 2787, 208, 674, + 42, 5453, 226, 1815, 208, 1740, 5458, 5459, 167, 1744, + 1745, 335, 150, 577, 208, 33, 232, 1752, 1753, 10, + 5814, 5785, 127, 41, 384, 667, 293, 226, 2146, 258, + 3195, 378, 50, 366, 196, 614, 779, 2068, 468, 1774, + 5619, 2159, 688, 1899, 4916, 756, 315, 1782, 1783, 1784, + 1785, 1786, 1787, 1788, 1789, 1790, 1791, 281, 208, 568, + 735, 312, 1797, 1957, 1958, 2183, 2184, 5646, 315, 268, + 201, 5650, 1733, 459, 160, 780, 506, 782, 746, 1814, + 1815, 4847, 1817, 127, 1940, 2454, 434, 652, 208, 144, + 289, 4857, 4858, 1949, 740, 1951, 33, 753, 314, 2454, + 5244, 315, 208, 1838, 41, 315, 2454, 746, 3898, 5857, + 196, 315, 5860, 50, 782, 1850, 33, 5261, 902, 598, + 904, 315, 906, 907, 41, 787, 74, 3128, 173, 913, + 454, 2441, 916, 50, 1990, 434, 2167, 4637, 86, 225, + 457, 196, 787, 782, 2175, 763, 764, 765, 2454, 10, + 141, 1650, 2793, 312, 2185, 1654, 2454, 736, 296, 1820, + 404, 1660, 2441, 33, 1899, 315, 5084, 2808, 2599, 5748, + 3200, 41, 3060, 303, 304, 33, 3200, 3178, 197, 1914, + 50, 33, 2551, 41, 1919, 5637, 4682, 2043, 3076, 41, + 208, 595, 50, 2551, 2454, 315, 2643, 676, 50, 3087, + 3088, 5119, 2649, 782, 4943, 1940, 5785, 293, 2849, 315, + 598, 3366, 1947, 5830, 1949, 1950, 1951, 2664, 782, 5836, + 1955, 36, 37, 5802, 119, 2634, 3262, 542, 2637, 1890, + 4969, 661, 2641, 366, 2721, 33, 1971, 436, 780, 463, + 4341, 1740, 6036, 41, 6071, 4346, 4347, 1982, 1983, 294, + 33, 3041, 50, 386, 3262, 1990, 1917, 152, 41, 314, + 2583, 608, 281, 3386, 3387, 3887, 342, 50, 2601, 33, + 2670, 208, 314, 403, 458, 4021, 403, 41, 1412, 413, + 141, 3071, 723, 600, 4847, 1784, 50, 691, 676, 128, + 1789, 208, 1791, 6087, 4857, 4858, 5993, 315, 5992, 6047, + 386, 4141, 3889, 2858, 2859, 2860, 3997, 572, 2043, 5794, + 2797, 33, 3233, 454, 2551, 154, 3237, 2052, 4699, 41, + 364, 293, 461, 2058, 568, 4530, 528, 2062, 50, 154, + 4535, 386, 3368, 6127, 2781, 4540, 2454, 627, 208, 1838, + 5106, 745, 413, 5828, 421, 475, 787, 2082, 6175, 6176, + 208, 1850, 2685, 1137, 493, 489, 208, 704, 5937, 33, + 3368, 437, 2097, 33, 2099, 2734, 14, 41, 2103, 3370, + 5472, 41, 4753, 720, 2109, 2110, 50, 763, 315, 3033, + 50, 782, 766, 767, 768, 769, 770, 771, 772, 773, + 120, 2126, 2127, 683, 709, 43, 44, 292, 315, 33, + 5318, 226, 5303, 668, 448, 33, 450, 41, 5147, 495, + 208, 613, 727, 41, 386, 2150, 50, 601, 489, 2154, + 561, 4261, 50, 33, 2793, 208, 33, 671, 567, 2164, + 779, 41, 454, 2551, 41, 2170, 47, 55, 787, 2808, + 50, 460, 497, 50, 208, 315, 2181, 2182, 419, 6028, + 0, 2702, 2703, 117, 118, 426, 1955, 315, 5468, 107, + 47, 33, 5472, 315, 541, 33, 131, 669, 47, 41, + 647, 123, 1971, 41, 7, 127, 2786, 499, 50, 2848, + 2849, 746, 50, 1982, 1983, 144, 208, 506, 218, 2858, + 2859, 2860, 723, 2848, 2863, 106, 540, 2734, 3139, 51, + 2848, 47, 3082, 2227, 2227, 3146, 2875, 2786, 2863, 648, + 2879, 5553, 602, 782, 2880, 2863, 168, 315, 2412, 106, + 2875, 173, 5440, 495, 2879, 2891, 2892, 106, 705, 6123, + 2896, 708, 315, 151, 208, 782, 3, 196, 208, 6097, + 217, 205, 2848, 5106, 192, 3042, 568, 57, 779, 167, + 2848, 315, 104, 2052, 206, 3042, 2793, 2863, 735, 2058, + 106, 71, 6156, 73, 31, 2863, 743, 128, 782, 2875, + 614, 2808, 782, 2879, 208, 33, 763, 2875, 782, 2375, + 208, 2879, 2948, 41, 6142, 2441, 780, 5150, 2848, 3799, + 151, 3801, 50, 315, 47, 14, 2331, 33, 208, 2965, + 2335, 208, 2458, 2863, 281, 41, 573, 574, 47, 229, + 287, 2848, 2849, 2348, 50, 2875, 2734, 763, 282, 2879, + 238, 2858, 2859, 2860, 43, 44, 3895, 2126, 2127, 4834, + 4835, 251, 782, 145, 752, 33, 208, 141, 2875, 454, + 208, 315, 2879, 41, 127, 315, 127, 136, 160, 2982, + 6067, 2375, 50, 106, 413, 2154, 1440, 2375, 47, 5465, + 5180, 779, 782, 763, 53, 2164, 55, 106, 5474, 158, + 5476, 5477, 5478, 5479, 5480, 2793, 782, 2489, 5596, 4780, + 4781, 315, 2494, 650, 499, 704, 6103, 315, 107, 744, + 2808, 2503, 173, 4898, 177, 4900, 1003, 2509, 99, 2434, + 2435, 33, 2558, 3103, 3104, 315, 2441, 723, 315, 41, + 2445, 2446, 779, 6079, 6080, 1022, 1023, 206, 50, 30, + 787, 763, 153, 2458, 35, 2460, 768, 769, 2463, 2464, + 2848, 2849, 151, 5114, 3103, 3104, 779, 168, 782, 128, + 2858, 2859, 2860, 315, 787, 2863, 561, 315, 3103, 3104, + 208, 6117, 5694, 2488, 2489, 3103, 3104, 2875, 241, 2494, + 22, 2879, 57, 779, 782, 768, 769, 29, 2503, 31, + 3139, 667, 208, 192, 2509, 787, 71, 3146, 5641, 675, + 5643, 271, 4369, 33, 680, 311, 3233, 3103, 3104, 604, + 3237, 41, 282, 2454, 33, 713, 33, 3103, 3104, 717, + 50, 2536, 41, 3444, 41, 3103, 3104, 4498, 769, 31, + 208, 50, 33, 50, 779, 769, 2672, 2552, 4624, 780, + 41, 2633, 787, 2558, 2559, 2560, 780, 2639, 2640, 50, + 313, 341, 2331, 4579, 779, 328, 2335, 4643, 2523, 5757, + 2501, 154, 787, 3103, 3104, 782, 4652, 65, 769, 359, + 779, 2512, 4658, 2588, 510, 4601, 366, 315, 787, 780, + 2595, 782, 4668, 3196, 2599, 782, 3103, 3104, 533, 534, + 4676, 4677, 537, 538, 539, 33, 208, 57, 737, 315, + 779, 391, 4862, 41, 258, 5922, 5923, 4867, 787, 779, + 2625, 71, 50, 73, 2629, 2630, 2631, 787, 2633, 3386, + 3387, 178, 3139, 2638, 2639, 2640, 5769, 307, 2643, 3146, + 310, 779, 782, 779, 2649, 33, 4288, 315, 3365, 787, + 4292, 787, 2583, 41, 782, 577, 33, 33, 780, 2664, + 2786, 779, 50, 2668, 41, 41, 2597, 2672, 2673, 19, + 20, 4229, 4230, 50, 50, 50, 2445, 2446, 763, 764, + 765, 343, 5762, 5763, 299, 33, 33, 513, 208, 515, + 516, 3997, 950, 41, 41, 6132, 6133, 5172, 3301, 208, + 4258, 208, 50, 50, 530, 3879, 532, 113, 114, 115, + 3868, 4372, 3870, 315, 782, 4273, 2721, 208, 389, 3997, + 391, 417, 2727, 1777, 141, 1286, 4141, 4142, 3886, 782, + 4145, 1292, 1293, 3336, 128, 3338, 3339, 4152, 4784, 997, + 5873, 3344, 4282, 5876, 746, 5396, 780, 670, 3922, 3352, + 2876, 3139, 2878, 3356, 425, 3358, 1664, 1665, 3146, 5130, + 5131, 670, 3283, 3284, 191, 3286, 3287, 2536, 2773, 2700, + 2775, 19, 20, 3412, 4312, 3835, 2781, 2708, 281, 2784, + 208, 2786, 2787, 4799, 455, 4325, 33, 3412, 5865, 5866, + 782, 2560, 2797, 460, 41, 315, 3883, 767, 768, 625, + 626, 128, 780, 50, 231, 3444, 315, 780, 315, 782, + 19, 20, 5892, 145, 786, 1073, 5896, 33, 731, 732, + 208, 734, 33, 736, 315, 41, 4097, 145, 662, 33, + 41, 208, 208, 28, 50, 30, 3412, 41, 782, 50, + 145, 268, 782, 312, 3412, 101, 50, 147, 766, 767, + 768, 769, 770, 771, 772, 773, 127, 787, 158, 5334, + 208, 208, 2631, 780, 33, 782, 166, 734, 33, 2638, + 281, 2876, 41, 2878, 2643, 780, 41, 782, 782, 787, + 2649, 50, 3412, 120, 782, 50, 780, 315, 782, 33, + 33, 341, 657, 436, 150, 2664, 144, 41, 41, 4119, + 780, 4121, 4782, 780, 743, 3412, 50, 50, 47, 359, + 268, 779, 33, 33, 33, 114, 366, 588, 1176, 287, + 41, 41, 41, 4628, 5428, 33, 33, 315, 128, 50, + 50, 50, 2863, 41, 41, 144, 3002, 3444, 315, 315, + 782, 391, 50, 50, 782, 780, 151, 782, 196, 249, + 730, 622, 33, 780, 141, 782, 606, 81, 33, 386, + 41, 208, 101, 647, 19, 20, 41, 315, 315, 50, + 780, 398, 782, 3137, 2979, 50, 4942, 277, 53, 4995, + 4008, 4009, 779, 584, 4012, 4013, 475, 196, 5004, 779, + 4018, 4019, 208, 704, 6074, 6075, 101, 208, 254, 780, + 580, 782, 2996, 3008, 208, 33, 779, 1265, 3002, 779, + 4976, 150, 2781, 41, 3002, 2784, 1375, 2071, 735, 1378, + 1379, 779, 50, 147, 3412, 333, 18, 19, 20, 333, + 780, 3036, 782, 780, 158, 782, 3041, 3042, 333, 208, + 296, 4580, 166, 208, 780, 150, 782, 81, 40, 305, + 203, 299, 780, 780, 551, 782, 3444, 2111, 314, 88, + 780, 780, 782, 782, 208, 208, 3071, 287, 315, 193, + 203, 498, 328, 427, 780, 3842, 3843, 766, 767, 768, + 769, 770, 771, 772, 773, 3842, 3843, 208, 208, 208, + 145, 782, 2146, 4364, 3099, 283, 3101, 3091, 3091, 315, + 208, 208, 779, 3091, 315, 2159, 3270, 1365, 360, 788, + 1368, 315, 780, 147, 24, 254, 351, 3243, 28, 780, + 30, 782, 32, 351, 158, 249, 3091, 208, 3133, 2183, + 2184, 786, 166, 208, 3216, 3091, 779, 4798, 386, 779, + 3145, 568, 779, 515, 516, 779, 315, 3273, 3274, 254, + 315, 779, 40, 277, 780, 779, 782, 296, 530, 193, + 532, 3797, 50, 780, 15, 782, 305, 55, 160, 779, + 4595, 315, 315, 779, 779, 314, 3943, 386, 780, 779, + 208, 4339, 4340, 3309, 24, 25, 3943, 4361, 28, 328, + 30, 296, 32, 779, 315, 315, 315, 226, 737, 73, + 305, 779, 779, 4761, 196, 57, 81, 315, 315, 314, + 5996, 3216, 780, 779, 782, 249, 3221, 6223, 33, 71, + 4635, 73, 780, 328, 782, 780, 41, 782, 3233, 780, + 311, 782, 3237, 225, 315, 50, 1566, 1567, 3243, 268, + 315, 737, 780, 277, 782, 1575, 3251, 1505, 4663, 497, + 3967, 3968, 4667, 625, 626, 283, 779, 779, 4644, 4674, + 780, 779, 3193, 151, 780, 4651, 782, 3036, 3273, 3274, + 24, 780, 147, 780, 28, 1605, 30, 1607, 32, 167, + 730, 38, 780, 158, 782, 779, 6072, 315, 497, 780, + 213, 166, 1622, 1623, 1624, 4956, 780, 779, 782, 1629, + 1630, 293, 4460, 780, 3309, 782, 779, 1637, 196, 338, + 213, 533, 534, 128, 4700, 537, 538, 539, 193, 33, + 3325, 213, 780, 47, 782, 6111, 1584, 41, 203, 5034, + 779, 386, 5298, 780, 779, 782, 50, 787, 393, 779, + 779, 1599, 1600, 18, 19, 20, 779, 779, 5364, 5315, + 238, 213, 780, 408, 780, 40, 782, 779, 779, 6145, + 3365, 780, 5328, 782, 5330, 40, 3297, 3298, 3299, 3300, + 55, 3302, 3303, 4198, 249, 430, 3145, 780, 53, 782, + 3385, 3386, 3387, 780, 413, 782, 3391, 23, 6174, 779, + 26, 27, 780, 208, 386, 31, 4702, 780, 73, 782, + 2454, 779, 277, 780, 780, 88, 75, 436, 779, 3340, + 3341, 751, 3343, 127, 3345, 3346, 3347, 3348, 3349, 3350, + 3351, 5118, 3353, 779, 99, 4064, 3357, 4985, 780, 780, + 782, 782, 780, 780, 463, 780, 779, 782, 4041, 4042, + 4043, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 3221, 779, 306, 307, 780, 126, 782, 780, + 4618, 782, 4065, 4066, 3233, 4068, 151, 780, 3237, 782, + 1728, 780, 779, 782, 55, 723, 145, 1735, 5139, 31, + 535, 4120, 167, 88, 5005, 160, 780, 33, 782, 341, + 779, 160, 4120, 548, 208, 41, 744, 2551, 23, 779, + 315, 26, 27, 495, 50, 779, 31, 359, 787, 779, + 565, 196, 119, 780, 366, 782, 123, 779, 1776, 33, + 127, 196, 5582, 779, 779, 779, 201, 41, 203, 15, + 780, 214, 782, 780, 779, 744, 50, 779, 779, 391, + 145, 122, 780, 226, 782, 152, 92, 93, 94, 95, + 225, 15, 779, 238, 33, 779, 225, 4064, 4133, 4198, + 779, 168, 41, 4330, 780, 4140, 173, 779, 4143, 780, + 780, 50, 782, 4330, 782, 4150, 780, 5434, 779, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 779, 584, 138, 139, 140, 780, 3365, 782, 281, 206, + 780, 315, 782, 4239, 5620, 780, 289, 782, 780, 779, + 782, 780, 779, 4120, 128, 780, 203, 780, 293, 782, + 201, 226, 3391, 779, 779, 4264, 5518, 763, 780, 658, + 782, 355, 779, 662, 779, 690, 780, 780, 779, 4264, + 779, 324, 1900, 189, 190, 779, 128, 779, 779, 128, + 705, 779, 779, 81, 779, 203, 3820, 75, 782, 780, + 780, 780, 208, 779, 4300, 779, 779, 779, 779, 4272, + 779, 346, 780, 780, 779, 399, 4064, 401, 779, 122, + 2734, 779, 779, 779, 289, 292, 81, 779, 4264, 779, + 4293, 4198, 779, 779, 208, 22, 4264, 24, 25, 779, + 779, 28, 29, 30, 31, 779, 735, 253, 126, 290, + 5407, 386, 779, 779, 743, 384, 258, 782, 5626, 147, + 5417, 670, 460, 779, 5632, 5633, 688, 145, 127, 208, + 158, 688, 4120, 704, 4264, 676, 510, 429, 166, 2793, + 143, 782, 160, 422, 2002, 782, 2004, 782, 582, 360, + 782, 785, 147, 436, 2808, 127, 394, 4264, 201, 782, + 752, 782, 579, 158, 699, 193, 763, 491, 7, 315, + 316, 166, 5433, 40, 743, 3780, 463, 463, 24, 25, + 463, 779, 28, 50, 30, 5325, 32, 10, 55, 677, + 465, 782, 217, 31, 2848, 2849, 136, 296, 193, 217, + 151, 315, 65, 393, 2858, 2859, 2860, 225, 203, 2863, + 4198, 18, 19, 20, 408, 3, 3821, 541, 583, 743, + 495, 249, 403, 40, 787, 427, 311, 54, 47, 410, + 3835, 436, 3837, 40, 127, 782, 315, 3842, 3843, 787, + 3845, 120, 787, 3848, 3849, 182, 422, 290, 643, 277, + 704, 780, 333, 333, 249, 33, 333, 4682, 463, 141, + 506, 311, 561, 41, 588, 411, 73, 24, 25, 26, + 3952, 28, 50, 30, 128, 32, 4264, 5035, 730, 154, + 311, 779, 277, 177, 151, 786, 782, 106, 105, 47, + 5276, 5277, 99, 5279, 5555, 779, 3901, 787, 427, 5420, + 167, 3895, 3896, 780, 4425, 4426, 4427, 4428, 4429, 4430, + 4431, 4432, 4433, 4434, 3845, 4436, 4437, 4438, 4439, 4440, + 4441, 4442, 4443, 4444, 4445, 594, 106, 4448, 4449, 196, + 780, 336, 478, 2191, 782, 780, 3941, 2267, 3943, 780, + 2270, 3946, 3947, 787, 24, 25, 26, 3952, 28, 780, + 30, 648, 32, 160, 678, 4108, 2286, 780, 127, 127, + 403, 250, 3967, 3968, 780, 787, 384, 410, 780, 3974, + 577, 238, 779, 167, 191, 658, 700, 2307, 779, 196, + 5888, 136, 18, 19, 20, 660, 5144, 5373, 782, 196, + 287, 788, 677, 782, 201, 127, 203, 602, 544, 770, + 546, 73, 4938, 4939, 40, 4941, 552, 2265, 2266, 787, + 4946, 4052, 782, 4949, 231, 4536, 4952, 4953, 225, 127, + 4541, 688, 770, 360, 4960, 151, 4962, 4666, 5725, 490, + 208, 701, 451, 702, 127, 4971, 782, 73, 435, 644, + 688, 4666, 4617, 4682, 4619, 264, 127, 266, 4666, 3103, + 3104, 268, 735, 33, 4629, 780, 5577, 662, 277, 779, + 743, 41, 779, 99, 782, 154, 612, 3, 3837, 406, + 50, 782, 4647, 362, 293, 151, 217, 752, 363, 239, + 510, 370, 360, 510, 4659, 3139, 293, 510, 5793, 2347, + 4666, 4096, 3146, 510, 4099, 510, 385, 510, 4666, 763, + 4675, 782, 2360, 708, 782, 283, 395, 396, 397, 120, + 656, 19, 20, 676, 4108, 4108, 405, 24, 25, 47, + 4108, 28, 287, 30, 160, 32, 127, 596, 71, 4123, + 735, 743, 713, 673, 158, 716, 4666, 315, 743, 346, + 5526, 780, 5528, 5529, 725, 780, 780, 484, 128, 57, + 780, 780, 158, 96, 4833, 210, 779, 782, 137, 4666, + 196, 787, 65, 33, 251, 201, 109, 203, 439, 386, + 787, 41, 3941, 780, 664, 4682, 594, 3946, 3947, 386, + 50, 398, 125, 53, 391, 418, 779, 782, 4193, 225, + 6206, 595, 2450, 480, 4199, 5735, 480, 33, 3967, 3968, + 780, 283, 748, 782, 68, 41, 734, 703, 2466, 782, + 547, 206, 155, 759, 50, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 563, 564, 208, 222, + 33, 568, 569, 570, 6091, 128, 19, 20, 41, 4842, + 4843, 4844, 4845, 203, 782, 4848, 4849, 50, 782, 779, + 4853, 4930, 33, 4856, 543, 474, 4859, 293, 287, 4862, + 41, 63, 146, 4866, 4867, 154, 555, 649, 97, 50, + 713, 42, 53, 716, 57, 4945, 4281, 780, 4666, 780, + 780, 498, 725, 5823, 702, 427, 780, 770, 495, 780, + 128, 234, 128, 780, 4682, 2553, 780, 769, 787, 636, + 217, 779, 31, 5964, 780, 780, 780, 780, 4313, 780, + 346, 378, 780, 780, 780, 122, 763, 780, 780, 4840, + 780, 4326, 145, 780, 782, 4330, 782, 5867, 4333, 81, + 782, 4852, 780, 2591, 2592, 315, 780, 4501, 208, 5250, + 780, 782, 780, 782, 780, 780, 780, 779, 591, 686, + 386, 568, 295, 411, 780, 779, 31, 779, 4363, 773, + 31, 782, 270, 779, 427, 6222, 655, 4372, 779, 5305, + 779, 779, 208, 281, 131, 128, 4381, 787, 127, 127, + 782, 782, 4313, 504, 4378, 4373, 128, 787, 782, 4515, + 3444, 787, 782, 782, 201, 147, 4999, 782, 5001, 787, + 5003, 780, 4333, 613, 693, 208, 158, 5046, 258, 4414, + 677, 5050, 780, 782, 166, 4420, 53, 782, 707, 4424, + 478, 5046, 100, 47, 782, 5050, 670, 208, 5046, 6090, + 2688, 365, 2690, 2691, 2692, 782, 127, 576, 158, 158, + 750, 193, 4447, 507, 72, 315, 549, 75, 439, 123, + 5971, 203, 557, 660, 779, 268, 268, 657, 268, 495, + 679, 680, 681, 682, 268, 314, 409, 410, 268, 203, + 5046, 779, 127, 763, 5050, 763, 5387, 763, 5046, 315, + 763, 4486, 5050, 290, 734, 299, 544, 270, 546, 763, + 4495, 4573, 576, 763, 552, 5174, 168, 249, 126, 5178, + 5179, 129, 4628, 763, 763, 763, 763, 763, 416, 5112, + 4515, 4637, 315, 18, 19, 20, 5046, 145, 763, 787, + 5050, 763, 430, 763, 432, 277, 763, 119, 763, 763, + 6191, 123, 160, 763, 315, 127, 34, 6077, 763, 5046, + 333, 5180, 763, 5050, 6205, 752, 782, 299, 763, 2807, + 6211, 763, 763, 782, 612, 5180, 464, 6218, 4563, 763, + 152, 763, 5180, 386, 287, 787, 287, 787, 4573, 477, + 393, 755, 392, 4578, 6095, 506, 168, 154, 786, 780, + 153, 173, 4513, 153, 787, 408, 4580, 780, 780, 217, + 780, 780, 213, 769, 99, 780, 787, 225, 656, 769, + 787, 65, 510, 410, 5180, 5244, 780, 430, 780, 4603, + 4603, 5250, 5180, 779, 206, 558, 559, 779, 782, 5244, + 528, 338, 5261, 4628, 660, 287, 697, 287, 241, 584, + 492, 128, 4637, 416, 262, 128, 5261, 787, 787, 779, + 145, 779, 232, 30, 769, 4414, 780, 430, 763, 432, + 5180, 782, 779, 763, 782, 4424, 4661, 779, 5046, 5570, + 733, 203, 5050, 545, 333, 293, 126, 203, 5244, 203, + 50, 287, 158, 5180, 158, 712, 5244, 408, 782, 780, + 408, 464, 31, 31, 31, 5261, 240, 283, 53, 779, + 748, 779, 4818, 5261, 477, 787, 779, 245, 606, 127, + 292, 759, 770, 780, 584, 613, 72, 143, 770, 75, + 215, 470, 535, 782, 5244, 623, 752, 787, 779, 779, + 786, 95, 351, 352, 155, 548, 779, 510, 4854, 637, + 155, 5261, 780, 780, 780, 780, 30, 5244, 787, 779, + 782, 782, 565, 5250, 206, 528, 780, 780, 5387, 780, + 780, 153, 780, 4758, 5261, 780, 384, 780, 3016, 388, + 126, 669, 779, 129, 672, 780, 65, 272, 273, 274, + 779, 5450, 779, 716, 763, 3033, 128, 5935, 31, 145, + 688, 31, 232, 782, 6170, 782, 780, 292, 313, 4948, + 232, 88, 5180, 4798, 160, 779, 704, 779, 427, 734, + 554, 408, 4807, 4797, 4797, 203, 779, 779, 299, 299, + 779, 719, 378, 4818, 53, 782, 4821, 780, 4823, 31, + 782, 446, 208, 606, 287, 53, 131, 439, 251, 502, + 613, 224, 129, 4838, 391, 4876, 576, 779, 779, 127, + 623, 346, 127, 348, 30, 65, 256, 3105, 145, 4854, + 780, 168, 504, 780, 637, 314, 5244, 780, 643, 225, + 782, 206, 5250, 368, 65, 780, 780, 690, 347, 4874, + 4875, 782, 782, 5261, 169, 217, 780, 314, 4883, 780, + 5387, 386, 705, 4814, 780, 6043, 669, 447, 393, 672, + 780, 173, 779, 754, 763, 167, 262, 782, 741, 250, + 418, 418, 217, 408, 53, 688, 713, 203, 5034, 716, + 415, 641, 780, 676, 641, 299, 299, 30, 170, 4850, + 4851, 779, 30, 593, 4929, 430, 217, 293, 384, 4860, + 217, 5570, 65, 217, 217, 159, 719, 4942, 4943, 4944, + 705, 159, 217, 4874, 705, 4940, 217, 592, 217, 4954, + 217, 4956, 217, 603, 4885, 203, 203, 386, 4963, 4964, + 4955, 485, 128, 439, 4969, 262, 594, 584, 203, 154, + 4965, 4976, 310, 602, 314, 391, 4981, 4972, 310, 4974, + 4975, 576, 487, 99, 281, 577, 237, 57, 779, 498, + 619, 4996, 497, 780, 780, 613, 293, 549, 780, 5387, + 780, 155, 780, 782, 3262, 780, 780, 71, 5647, 782, + 4064, 362, 780, 5018, 780, 65, 645, 406, 384, 370, + 780, 50, 5647, 787, 780, 780, 5665, 654, 5069, 5034, + 535, 782, 782, 780, 385, 779, 779, 53, 779, 31, + 779, 338, 787, 548, 395, 396, 397, 780, 378, 117, + 65, 65, 65, 779, 405, 779, 6214, 686, 446, 4990, + 30, 331, 741, 5570, 5069, 141, 4120, 160, 5073, 4838, + 225, 5647, 390, 741, 702, 669, 314, 5794, 422, 5647, + 317, 424, 587, 281, 295, 787, 763, 127, 593, 30, + 782, 780, 549, 780, 780, 445, 685, 779, 782, 780, + 419, 583, 160, 779, 160, 236, 53, 105, 203, 127, + 3368, 5828, 779, 779, 65, 780, 413, 5647, 779, 782, + 65, 780, 5127, 779, 782, 65, 780, 127, 31, 287, + 411, 127, 160, 782, 5139, 5140, 314, 287, 780, 782, + 5647, 584, 5147, 30, 4198, 461, 651, 780, 780, 780, + 649, 5156, 601, 658, 5159, 5160, 601, 779, 5665, 5164, + 440, 787, 367, 5168, 779, 779, 72, 299, 779, 576, + 6, 5176, 120, 287, 120, 4944, 5181, 5303, 5848, 787, + 281, 787, 5570, 787, 787, 690, 787, 787, 92, 93, + 94, 95, 543, 780, 4963, 73, 787, 287, 287, 787, + 705, 706, 787, 787, 555, 787, 787, 787, 787, 787, + 281, 787, 685, 718, 584, 72, 72, 5934, 160, 5740, + 5741, 50, 5743, 5744, 5745, 5746, 787, 780, 594, 696, + 711, 30, 782, 782, 138, 139, 140, 5242, 779, 18, + 780, 576, 218, 65, 65, 144, 779, 779, 99, 5290, + 99, 5292, 5183, 217, 428, 584, 584, 296, 649, 5647, + 779, 418, 418, 779, 5269, 430, 5271, 780, 5199, 780, + 782, 180, 779, 779, 160, 779, 48, 5665, 702, 160, + 741, 201, 339, 99, 296, 189, 190, 53, 154, 640, + 779, 5296, 5297, 5298, 5299, 787, 5291, 6208, 5303, 5304, + 697, 5306, 780, 589, 655, 779, 5311, 5312, 80, 779, + 5315, 203, 787, 659, 779, 5320, 5321, 426, 198, 737, + 127, 779, 5327, 5328, 779, 5330, 422, 780, 207, 101, + 173, 779, 338, 5338, 780, 779, 702, 251, 110, 585, + 5861, 780, 693, 5864, 779, 5509, 787, 644, 218, 253, + 782, 5872, 782, 480, 5875, 332, 707, 203, 704, 131, + 5365, 658, 203, 108, 112, 662, 780, 780, 780, 203, + 65, 780, 5377, 145, 296, 101, 5381, 203, 150, 203, + 143, 649, 116, 432, 30, 779, 5989, 258, 3091, 2571, + 782, 3359, 5003, 4999, 5001, 3212, 5631, 142, 4030, 5255, + 5662, 173, 5812, 6032, 757, 1746, 5073, 1417, 4463, 5242, + 3957, 708, 316, 5046, 5377, 5504, 5394, 5590, 4679, 1734, + 3910, 2592, 3437, 3381, 2069, 820, 4198, 2182, 5433, 5500, + 2183, 5499, 2184, 5226, 179, 4562, 4051, 5442, 735, 5319, + 5123, 5446, 4322, 4326, 4758, 2420, 5855, 5420, 5453, 5454, + 5966, 6095, 6056, 5458, 5459, 5748, 5418, 1405, 4937, 2699, + 232, 4557, 5653, 4981, 236, 5168, 4563, 5293, 4832, 6080, + 5924, 5512, 818, 5934, 5828, 5817, 5817, 5817, 5817, 4261, + 4141, 3739, 254, 4214, 4189, 5937, 258, 259, 5848, 4626, + 3783, 5496, 5066, 4289, 4292, 4284, 6101, 5502, 88, 88, + 6074, 5638, 6075, 5880, 3204, 5499, 5511, 411, 5892, 5896, + 5539, 4651, 5517, 5289, 3944, 5287, 4562, 289, 4978, 1511, + 1426, 3779, 1929, 3192, 296, 297, 5706, 3187, 5846, 2727, + 5543, 2085, 3036, 2560, 2817, 3391, 4126, 5542, 134, 1392, + 2996, 763, 3134, 5548, 1339, 5550, 1379, 4600, 3266, 5590, + 5555, 4313, 3045, 2944, 1159, 2947, 1668, 3014, 3013, 5564, + 3820, 1724, 3729, 1590, 1569, 4701, 6033, 5816, 5694, 6208, + 5575, 5576, 6133, 6132, 478, 1337, 4902, 1983, 1600, 1337, + 1978, 353, 4366, 5820, 5274, 5590, 4807, 5821, 1575, 3847, + 1973, 1337, 3806, 2678, 4495, 3253, 5365, 4494, 3804, 1337, + 1337, 5118, 5725, 4784, 950, 5646, 5611, 1999, 5555, 5650, + 5114, 4702, 4666, 3269, 3262, 5135, 769, 5622, 2672, 4272, + 966, 393, 5627, 1400, 970, 4501, 106, 2773, 4682, 88, + 5635, 2148, 5637, 688, 1370, 4123, 2810, 4378, 4813, 1249, + 544, 3294, 546, 4365, 4363, 6090, 5651, 993, 552, 5433, + 834, 997, 3910, 5658, 835, 2097, 1002, 679, 1806, 2532, + 679, 2533, 3126, 1395, 436, 2586, 5496, 5793, 679, 441, + 5150, 1918, 1516, 4129, 6093, 4907, 6138, 5682, 5283, 6211, + 452, 453, 6218, 2552, 2807, 5454, 5139, 5692, 954, 5694, + 2863, 3103, 678, 2188, 3104, 5700, 5701, 5702, 2466, 678, + 3105, 6208, 3100, 5698, 3854, 2164, 1174, 3096, 612, 3095, + 676, 1746, 1504, 1140, 1504, 2721, 5721, 1949, 4040, 3041, + 4515, 1067, 1068, 1069, 1070, 4606, 3207, 1073, 4052, 717, + 112, 5361, 88, 88, 1080, 1282, 481, 88, 918, 3997, + 4886, 4120, 5868, 3438, 5785, 5665, -1, -1, 2185, 5263, + -1, -1, 656, -1, 5759, -1, -1, -1, -1, 5764, + -1, 5802, -1, -1, -1, 5770, 511, 512, -1, 514, + 515, 516, 517, 518, -1, 520, 521, 522, 523, 524, + 525, 526, 527, -1, 529, 530, 531, 532, 5793, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5809, -1, 5811, -1, -1, -1, + -1, 5816, -1, -1, -1, 5820, 5821, -1, -1, -1, + 6208, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1176, -1, -1, -1, -1, 607, -1, -1, -1, -1, + -1, 5846, -1, -1, 748, 617, -1, -1, -1, 5780, + 5855, -1, -1, -1, -1, 759, 628, -1, 5924, -1, + 5986, -1, 634, 5868, -1, -1, -1, 6031, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 625, 626, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 665, -1, 5900, 5937, 669, -1, -1, + -1, -1, -1, 5908, -1, 5910, 5911, -1, -1, -1, + -1, -1, -1, -1, -1, 1261, -1, -1, -1, 1265, + -1, -1, -1, 5692, -1, -1, 698, -1, 6054, -1, + 5924, 5862, 5863, 5702, 5939, -1, 5924, -1, -1, -1, + -1, -1, -1, 5874, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5964, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5986, -1, -1, -1, -1, -1, 6028, -1, -1, + -1, -1, 5046, -1, -1, -1, -1, -1, -1, 6004, + 6005, -1, -1, 6008, -1, -1, -1, -1, -1, -1, + 6015, -1, -1, -1, -1, -1, -1, -1, -1, 1365, + -1, -1, 1368, -1, 6029, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6079, 6080, + -1, -1, 5811, -1, 5975, -1, -1, 5978, -1, 6054, + -1, -1, -1, -1, -1, 6219, -1, -1, -1, -1, + -1, -1, -1, 6068, -1, -1, -1, -1, -1, 6195, + -1, -1, -1, -1, 6200, -1, 6117, -1, 6083, -1, + -1, -1, -1, -1, -1, 6090, -1, -1, -1, 1435, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5180, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1505, + -1, -1, -1, -1, -1, -1, -1, -1, 1514, -1, + 1516, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6191, -1, -1, -1, + 6195, -1, -1, -1, -1, 6200, 5250, -1, -1, -1, + 6205, -1, -1, -1, -1, -1, 6211, -1, -1, -1, + -1, -1, -1, 6218, -1, -1, 1562, 1563, -1, -1, + -1, -1, 1568, -1, -1, -1, 1572, 1573, 1574, -1, + -1, -1, -1, -1, -1, -1, 1582, 1583, 1584, -1, + -1, -1, 1588, -1, -1, -1, 1592, 1593, 1594, -1, + 1596, 1597, 1598, 1599, 1600, -1, -1, -1, -1, -1, + 1606, -1, 1608, -1, -1, 1611, 1612, 1613, 1614, -1, + 1616, -1, 1618, 1619, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1632, 1633, 1634, 1635, + 1636, -1, 1638, 1639, 1640, 1641, 1642, 1643, -1, 1645, + 1646, -1, 1648, 1649, -1, 1651, 1652, -1, -1, 1655, + 1656, -1, 1658, 1659, -1, 1661, -1, 1663, -1, -1, + -1, 1667, 1668, 1669, -1, -1, 1672, 1673, 1674, 1675, + -1, 1677, -1, 5387, -1, -1, -1, -1, 1684, -1, + -1, -1, -1, -1, 1690, 1691, 1692, 1693, -1, -1, + -1, -1, -1, -1, -1, 1701, 1702, -1, 1704, 1705, + -1, -1, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, -1, -1, 1723, -1, -1, + -1, -1, 1728, -1, -1, -1, -1, -1, -1, 1735, + -1, -1, -1, -1, -1, -1, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 18, 19, + 20, -1, 1758, -1, -1, -1, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 18, -1, + 1776, -1, -1, -1, -1, -1, 46, -1, 48, 49, + -1, -1, -1, -1, 4702, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 70, -1, 72, 53, -1, -1, -1, -1, 78, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, + 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4772, -1, 5570, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1874, 119, + 1876, -1, -1, 123, -1, 145, -1, 127, 18, 19, + 20, -1, -1, -1, -1, -1, 136, 137, -1, -1, + -1, -1, -1, 143, 1900, -1, -1, 147, -1, -1, + -1, -1, 152, 173, 154, 1911, -1, -1, 158, -1, + -1, -1, -1, -1, -1, -1, 166, -1, 168, -1, + -1, -1, -1, 173, -1, -1, -1, -1, -1, -1, + -1, 71, -1, 73, 204, -1, 206, -1, -1, -1, + -1, -1, -1, 193, -1, 215, -1, 217, -1, -1, + -1, 5665, -1, 203, -1, -1, 206, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 240, -1, -1, -1, -1, -1, 226, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1996, -1, -1, -1, -1, 245, 2002, -1, 2004, 249, + -1, -1, 272, 273, 274, 145, -1, -1, 258, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2024, -1, + -1, -1, 292, -1, -1, -1, -1, 277, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 292, -1, -1, -1, -1, -1, 298, 299, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 312, -1, 314, -1, -1, -1, 338, -1, + -1, -1, -1, -1, -1, 215, 346, -1, 348, -1, + -1, -1, 11, -1, 13, -1, -1, -1, -1, 18, + 19, 20, -1, -1, -1, -1, -1, -1, 368, -1, + -1, -1, -1, -1, -1, 375, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 386, -1, -1, -1, + -1, -1, -1, 393, -1, -1, -1, -1, -1, -1, + -1, -1, 272, 273, 274, -1, -1, -1, 408, -1, + -1, -1, 71, 2149, 73, 415, -1, -1, -1, 419, + 420, -1, 292, -1, -1, -1, 426, -1, -1, -1, + 430, -1, -1, -1, -1, -1, -1, -1, 438, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2191, 2192, -1, -1, 459, + -1, -1, -1, -1, 2200, 2201, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 346, -1, 348, 459, + -1, -1, -1, 483, -1, -1, 145, 487, -1, -1, + -1, -1, -1, -1, -1, -1, 366, 497, 368, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 167, -1, + -1, -1, -1, -1, -1, -1, 386, -1, 2254, -1, + -1, -1, -1, 393, -1, -1, -1, -1, -1, 2265, + 2266, -1, -1, -1, -1, 535, -1, -1, 408, -1, + -1, -1, -1, -1, -1, 415, -1, -1, 548, -1, + 550, -1, -1, -1, -1, -1, 215, -1, -1, -1, + 430, -1, 2298, 2299, 2300, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 587, -1, -1, + -1, -1, -1, 593, -1, -1, -1, 577, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6, 7, -1, + -1, 2347, -1, 272, 273, 274, -1, 487, 618, 18, + -1, 2357, -1, -1, 2360, -1, -1, 497, -1, 629, + 630, 631, -1, 292, -1, -1, -1, -1, -1, 2375, + -1, -1, -1, 2379, 2380, -1, 2382, 2383, -1, -1, + -1, 651, -1, -1, 53, 2391, -1, 2393, 658, -1, + -1, -1, -1, -1, -1, 535, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 548, -1, + -1, -1, 81, -1, -1, -1, -1, 346, 2424, 348, + 690, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 705, 706, 366, -1, 368, + -1, -1, -1, -1, 2450, -1, -1, 587, 718, -1, + 119, -1, 722, 593, 123, -1, 2462, 386, 127, -1, + 2466, -1, -1, -1, 393, -1, -1, 136, 137, 2475, + -1, -1, -1, -1, -1, -1, -1, -1, 147, 408, + 2486, -1, -1, 152, -1, 154, 415, -1, -1, 158, + -1, -1, -1, -1, 6208, -1, 2502, 166, -1, 168, + 750, 430, -1, -1, 173, -1, -1, -1, -1, -1, + 5428, 651, -1, 763, -1, -1, 786, -1, 658, -1, + -1, -1, -1, -1, 193, -1, -1, -1, -1, -1, + 780, -1, 782, 2539, 203, 785, 786, 206, -1, -1, + 2546, -1, -1, -1, -1, -1, -1, 2553, -1, -1, + 690, -1, -1, -1, -1, -1, -1, 226, 487, -1, + -1, -1, -1, -1, -1, 705, 706, -1, 497, -1, + -1, -1, -1, -1, -1, -1, 245, -1, 718, -1, + 249, -1, -1, -1, -1, 2591, 2592, -1, -1, 258, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 535, -1, 277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 548, + -1, -1, -1, 292, -1, -1, -1, -1, -1, -1, + 299, -1, -1, -1, -1, -1, 2642, -1, -1, -1, + -1, -1, 782, 312, -1, 314, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 587, -1, + -1, -1, -1, -1, 593, -1, -1, -1, -1, 2675, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2688, -1, 2690, 2691, 2692, -1, 2694, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 651, -1, -1, -1, -1, 2733, -1, 658, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 690, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 705, 706, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 718, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2807, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2864, -1, + -1, -1, 2868, -1, -1, 2871, -1, -1, -1, -1, + -1, -1, -1, -1, 2880, -1, -1, -1, -1, -1, + -1, -1, -1, 2889, -1, 2891, 2892, -1, 2894, 2895, + 2896, 2897, -1, 2899, -1, 2901, 2902, -1, 2904, -1, + -1, -1, -1, -1, -1, -1, 2912, 2913, 577, -1, + -1, 2917, 2918, 2919, -1, -1, -1, -1, -1, -1, + -1, 2927, 2928, 2929, -1, 2931, -1, 2933, -1, 2935, + -1, 2937, -1, 2939, -1, -1, -1, -1, 2944, 2945, + -1, 2947, 2948, 2949, -1, -1, -1, 2953, -1, -1, + 2956, -1, -1, -1, -1, -1, -1, -1, -1, 2965, + -1, -1, 2968, -1, 2970, 2971, 2972, -1, -1, 2975, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2997, 5, 2999, 7, -1, 3002, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3012, 3013, 3014, 3015, + 3016, 3017, -1, -1, -1, -1, 3022, -1, -1, -1, + -1, -1, -1, -1, -1, 659, -1, 3033, -1, -1, + -1, -1, -1, -1, -1, 48, 49, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, -1, 68, -1, 70, -1, 72, + -1, -1, -1, -1, 3070, -1, -1, 80, -1, -1, + 704, -1, -1, -1, -1, -1, 3082, -1, -1, -1, + -1, 750, -1, 3089, -1, -1, -1, -1, 101, -1, + 103, 104, 19, 20, 763, -1, -1, 110, -1, 3105, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 780, -1, 782, 127, -1, 785, 786, 131, -1, + 47, -1, 49, -1, -1, -1, -1, -1, 141, -1, + 57, -1, 3138, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, 71, -1, -1, -1, 161, -1, + -1, -1, 79, 80, 3160, -1, -1, -1, 171, -1, + 173, -1, 89, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 103, 104, -1, -1, + -1, -1, -1, -1, 818, -1, -1, -1, -1, -1, + -1, 204, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, 145, -1, + -1, -1, -1, 3229, -1, -1, 239, 240, 241, -1, + 243, -1, 159, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, 3250, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, 3262, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 294, -1, 296, -1, 298, -1, 214, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, 226, + 313, 314, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 328, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 966, -1, -1, -1, 970, 350, 351, -1, + 353, -1, -1, -1, -1, -1, -1, 360, -1, -1, + -1, -1, -1, -1, 281, 368, -1, -1, -1, 993, + -1, -1, 3368, -1, -1, -1, -1, -1, 1002, -1, + -1, -1, -1, -1, 3380, 388, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 324, -1, 412, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 422, + -1, -1, -1, -1, -1, -1, -1, 344, -1, -1, + -1, -1, -1, -1, -1, -1, 353, -1, 441, 3435, + -1, -1, -1, 1067, 1068, 1069, 1070, -1, -1, 366, + -1, 3447, -1, 456, 3450, -1, 1080, -1, -1, -1, + 377, -1, -1, -1, 467, -1, -1, 470, -1, -1, + 473, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 400, -1, 488, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 429, 430, -1, -1, 433, -1, 435, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 462, 463, -1, -1, -1, + -1, 468, 469, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 485, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 506, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 602, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 528, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 631, -1, + -1, -1, 635, -1, -1, -1, -1, 1261, -1, -1, + -1, -1, 645, -1, -1, -1, -1, -1, -1, -1, + 653, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 665, -1, -1, 582, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 597, -1, -1, 686, -1, -1, 689, -1, -1, 606, + -1, -1, 609, 610, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 624, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 722, + -1, -1, -1, -1, -1, -1, -1, -1, 731, 3725, + 3726, -1, -1, -1, 3730, -1, -1, -1, -1, -1, + -1, -1, -1, 3739, 661, -1, -1, -1, -1, -1, + -1, -1, 669, -1, 757, -1, 3752, -1, 3754, -1, + 3756, -1, 3758, -1, -1, -1, -1, -1, -1, -1, + -1, 688, -1, 690, -1, -1, 779, 3773, -1, -1, + -1, -1, -1, 3779, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3792, 3793, -1, -1, + -1, 3797, -1, 3799, -1, 3801, -1, -1, -1, -1, + 3806, 1435, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 740, -1, -1, -1, -1, -1, -1, + 747, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3847, -1, -1, -1, -1, -1, 3853, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3867, -1, -1, -1, 3871, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1514, -1, 1516, 3889, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3910, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1562, 1563, + -1, -1, -1, -1, 1568, -1, -1, -1, 1572, 1573, + 1574, -1, -1, -1, -1, -1, -1, -1, 1582, 1583, + -1, -1, -1, -1, 1588, -1, -1, -1, 1592, 1593, + 1594, -1, 1596, 1597, 1598, 3971, -1, -1, -1, -1, + -1, -1, 1606, -1, 1608, 3981, -1, 1611, 1612, 1613, + 1614, -1, 1616, -1, 1618, 1619, -1, -1, -1, 3995, + -1, 3997, 3998, -1, -1, -1, -1, -1, 1632, 1633, + 1634, 1635, 1636, -1, 1638, 1639, 1640, 1641, 1642, 1643, + -1, 1645, 1646, -1, 1648, 1649, -1, 1651, 1652, -1, + -1, 1655, 1656, -1, 1658, 1659, -1, 1661, -1, 1663, + -1, -1, -1, 1667, 1668, 1669, -1, -1, 1672, 1673, + 1674, 1675, -1, 1677, -1, -1, -1, -1, -1, -1, + 1684, -1, -1, -1, -1, -1, 1690, 1691, 1692, 1693, + -1, -1, -1, -1, -1, -1, -1, 1701, 1702, -1, + 1704, 1705, -1, -1, 1708, 1709, 1710, 1711, 1712, 1713, + 1714, 1715, 1716, 1717, 1718, 1719, 1720, -1, -1, 1723, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1758, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4236, 4237, 5, 4239, -1, -1, -1, -1, -1, -1, + 1874, -1, 1876, -1, -1, -1, 4252, 4253, 4254, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4276, 4277, -1, -1, -1, 48, 49, 1911, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, 4300, 68, -1, 70, -1, 72, + -1, -1, -1, -1, -1, -1, 4312, 80, -1, -1, + -1, -1, -1, -1, -1, 4321, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + 103, 104, -1, -1, -1, 4341, -1, 110, -1, -1, + 4346, 4347, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 127, -1, -1, -1, 131, 4365, + -1, -1, 1996, 4369, -1, -1, -1, -1, 141, -1, + -1, -1, -1, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 161, -1, + 2024, -1, -1, -1, -1, -1, -1, -1, 171, -1, + 173, -1, -1, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 204, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, + -1, -1, -1, 18, 19, 20, 239, 240, 241, -1, + 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2149, 71, -1, 73, -1, + -1, 294, -1, 296, -1, 298, -1, -1, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, -1, + 313, 314, -1, -1, 99, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 328, -1, -1, 2192, -1, + -1, -1, -1, -1, 4570, 4571, 2200, 2201, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 350, 351, -1, + 353, -1, -1, -1, -1, -1, -1, 360, -1, -1, + 145, -1, -1, -1, -1, 368, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 659, -1, -1, -1, -1, 388, -1, -1, -1, -1, + 2254, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 412, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 422, + -1, -1, -1, -1, -1, 704, -1, -1, -1, -1, + 215, -1, -1, -1, 2298, 2299, 2300, -1, 441, 56, + 57, -1, -1, -1, 61, 62, -1, -1, -1, -1, + -1, -1, -1, 456, 71, -1, -1, -1, -1, -1, + -1, -1, -1, 4699, 467, -1, 4702, 470, -1, -1, + 473, -1, -1, -1, -1, -1, -1, -1, -1, 96, + -1, -1, -1, -1, -1, 488, -1, 272, 273, 274, + -1, -1, 109, 2357, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 292, 125, -1, + 127, 2375, -1, -1, -1, 2379, 2380, 4753, 2382, 2383, + -1, -1, -1, -1, -1, -1, -1, 2391, -1, 2393, + -1, -1, -1, -1, -1, -1, 4772, -1, 155, 818, + -1, -1, -1, -1, 4780, 4781, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 174, 175, 176, + 2424, 346, -1, 348, -1, -1, -1, 184, 185, 186, + -1, -1, -1, -1, -1, -1, -1, 4813, -1, -1, + -1, 366, -1, 368, -1, 202, 2450, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2462, 602, + -1, 386, -1, -1, -1, -1, -1, -1, 393, -1, + -1, 2475, -1, -1, -1, -1, -1, 234, -1, -1, + -1, -1, 2486, 408, -1, -1, -1, -1, 631, -1, + 415, -1, 635, -1, -1, -1, -1, -1, 2502, -1, + -1, -1, 645, -1, 261, 430, -1, -1, -1, -1, + 653, -1, -1, -1, -1, -1, 4892, -1, 4894, -1, + -1, -1, 665, -1, -1, -1, -1, 284, 285, 286, + -1, -1, -1, -1, -1, 2539, -1, -1, -1, -1, + -1, -1, 2546, 686, -1, -1, 689, 966, -1, 306, + 307, 970, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 487, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 497, -1, 993, -1, -1, -1, -1, 722, + -1, -1, -1, 1002, -1, -1, -1, -1, 731, -1, + -1, -1, -1, -1, -1, -1, -1, 354, -1, 356, + 357, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 535, -1, -1, -1, 757, -1, 373, -1, -1, -1, + -1, -1, -1, 548, -1, -1, -1, -1, -1, 5005, + -1, -1, -1, -1, -1, -1, 779, -1, 2642, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1067, 1068, + 1069, 1070, 409, 410, -1, -1, -1, -1, -1, -1, + -1, 1080, 587, -1, -1, -1, -1, -1, 593, -1, + -1, 2675, -1, -1, -1, 5051, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2694, -1, -1, -1, -1, -1, -1, -1, 455, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5091, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 651, -1, -1, 2733, + -1, -1, -1, 658, -1, -1, -1, -1, 5114, 496, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5130, 5131, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 690, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 705, 706, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 718, -1, -1, -1, -1, -1, -1, + -1, 558, 559, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 574, 575, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1261, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 616, + 2864, -1, -1, -1, 2868, -1, -1, 2871, -1, -1, + -1, -1, -1, -1, -1, -1, 2880, -1, -1, -1, + -1, -1, -1, -1, -1, 2889, -1, 2891, 2892, -1, + 2894, 2895, 2896, 2897, -1, 2899, -1, 2901, 2902, -1, + 2904, -1, -1, -1, -1, -1, -1, -1, 2912, 2913, + -1, -1, -1, 2917, 2918, 2919, -1, -1, -1, -1, + -1, -1, -1, 2927, 2928, 2929, -1, 2931, -1, 2933, + -1, 2935, -1, 2937, -1, 2939, -1, -1, -1, -1, + 2944, 2945, -1, 2947, 2948, 2949, -1, -1, -1, 2953, + -1, -1, 2956, 710, -1, -1, 713, -1, -1, 716, + -1, 2965, -1, -1, 2968, -1, 2970, 2971, 2972, -1, + -1, 2975, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 739, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2997, -1, 2999, -1, -1, 3002, -1, + -1, -1, 759, -1, -1, -1, -1, -1, 3012, 3013, + 3014, 3015, -1, 3017, -1, -1, 1435, -1, 3022, -1, + 5396, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5420, -1, -1, -1, -1, -1, + -1, -1, 5428, -1, -1, -1, -1, -1, 5434, -1, + -1, -1, -1, -1, -1, -1, 3070, -1, -1, -1, + -1, -1, -1, 5449, -1, -1, -1, -1, 3082, -1, + -1, -1, -1, -1, -1, 3089, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1514, -1, 1516, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3138, -1, -1, -1, -1, -1, + -1, -1, -1, 1562, 1563, -1, -1, -1, -1, 1568, + -1, -1, -1, 1572, 1573, 1574, 3160, -1, -1, -1, + -1, -1, -1, 1582, 1583, -1, -1, -1, -1, 1588, + -1, -1, -1, 1592, 1593, 1594, -1, 1596, 1597, 1598, + -1, -1, -1, -1, -1, -1, -1, 1606, -1, 1608, + -1, -1, 1611, 1612, 1613, 1614, -1, 1616, -1, 1618, + 1619, 5577, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1632, 1633, 1634, 1635, 1636, -1, 1638, + 1639, 1640, 1641, 1642, 1643, 3229, 1645, 1646, -1, 1648, + 1649, -1, 1651, 1652, -1, -1, 1655, 1656, -1, 1658, + 1659, -1, 1661, -1, 1663, -1, 3250, -1, 1667, 1668, + 1669, -1, -1, 1672, 1673, 1674, 1675, -1, 1677, -1, + -1, -1, -1, -1, -1, 1684, -1, -1, -1, -1, + -1, 1690, 1691, 1692, 1693, -1, -1, -1, -1, -1, + -1, -1, 1701, 1702, -1, 1704, 1705, -1, -1, 1708, + 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, -1, -1, 1723, -1, -1, -1, 18, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 657, -1, -1, -1, -1, -1, + -1, 5707, -1, -1, -1, -1, 46, -1, 48, 1758, + 673, -1, -1, -1, -1, -1, 679, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 70, -1, -1, -1, -1, -1, -1, -1, 78, -1, + -1, -1, -1, -1, -1, -1, 3380, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5794, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3435, -1, -1, -1, 145, -1, -1, -1, -1, + -1, -1, -1, 3447, -1, -1, 3450, -1, -1, -1, + -1, -1, 5828, -1, -1, 1874, -1, 1876, -1, -1, + -1, -1, -1, 173, 5840, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1911, -1, -1, -1, 206, -1, -1, -1, + -1, -1, -1, -1, -1, 215, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 240, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5924, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 272, 273, 274, -1, -1, -1, -1, 902, + -1, 904, -1, 906, 907, -1, -1, 1996, -1, -1, + 913, -1, 292, 916, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5971, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2024, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 338, -1, + -1, -1, -1, -1, -1, -1, 346, -1, 348, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 368, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 386, -1, -1, -1, + -1, -1, -1, 393, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 408, -1, + -1, -1, -1, -1, -1, 415, -1, -1, -1, 419, + -1, -1, -1, -1, -1, 6091, 426, -1, -1, 6095, + 430, 3725, 3726, -1, -1, -1, 3730, -1, -1, -1, + 2149, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3752, 459, + 3754, -1, 3756, -1, 3758, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3773, + -1, -1, -1, 2192, -1, -1, -1, 487, -1, -1, + -1, 2200, 2201, -1, -1, -1, -1, 497, 3792, 3793, + -1, -1, -1, 3797, -1, 3799, -1, 3801, -1, -1, + -1, -1, 3806, -1, 1137, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 535, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2254, -1, -1, 548, -1, + 550, -1, -1, -1, -1, -1, 6222, -1, -1, 3853, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3867, -1, -1, -1, 3871, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 587, -1, 2298, + 2299, 2300, -1, 593, -1, 3889, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1264, -1, -1, -1, -1, -1, -1, 2357, -1, + -1, 651, -1, -1, -1, -1, -1, -1, 658, -1, + -1, -1, -1, -1, -1, -1, 2375, -1, -1, -1, + 2379, 2380, -1, 2382, 2383, -1, -1, 3971, -1, -1, + -1, -1, 2391, -1, 2393, -1, -1, 3981, -1, -1, + 690, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3995, -1, -1, 3998, 705, 706, -1, -1, -1, + -1, -1, -1, -1, -1, 2424, -1, -1, 718, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2450, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2462, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2475, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2486, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2502, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 1440, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2539, -1, -1, -1, -1, -1, -1, 2546, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2642, -1, -1, -1, -1, -1, -1, + -1, -1, 4236, 4237, -1, 4239, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 659, 4252, 4253, + 4254, -1, -1, -1, -1, -1, 2675, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4276, 4277, -1, 2694, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4300, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4312, -1, + -1, -1, -1, -1, 2733, -1, -1, 4321, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4341, -1, -1, + -1, -1, 4346, 4347, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4365, -1, -1, -1, 4369, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 818, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2864, -1, -1, -1, 2868, + -1, -1, 2871, -1, -1, -1, -1, -1, -1, -1, + -1, 2880, -1, -1, -1, -1, -1, -1, -1, -1, + 2889, -1, 2891, 2892, -1, 2894, 2895, 2896, 2897, -1, + 2899, -1, 2901, 2902, -1, 2904, -1, -1, -1, -1, + -1, -1, -1, 2912, 2913, -1, -1, -1, 2917, 2918, + 2919, -1, -1, -1, -1, -1, -1, -1, 2927, 2928, + 2929, -1, 2931, -1, 2933, -1, 2935, -1, 2937, -1, + 2939, -1, -1, -1, -1, 2944, 2945, -1, 2947, 2948, + 2949, -1, -1, -1, 2953, -1, -1, 2956, -1, -1, + -1, -1, -1, -1, -1, -1, 2965, -1, -1, 2968, + -1, 2970, 2971, 2972, -1, -1, 2975, -1, 970, -1, + -1, -1, -1, -1, -1, -1, 4570, 4571, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2997, -1, + 2999, 993, -1, 3002, -1, -1, -1, -1, -1, -1, + 1002, -1, -1, 3012, 3013, 3014, 3015, -1, 3017, -1, + -1, -1, -1, 3022, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3070, -1, -1, -1, -1, -1, -1, 1070, -1, + -1, -1, -1, 3082, -1, -1, -1, -1, -1, 5, + 3089, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4699, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 48, 49, -1, -1, -1, -1, -1, 3138, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 66, -1, -1, -1, 70, -1, 72, -1, 2071, -1, + -1, 3160, -1, -1, 80, -1, -1, -1, -1, 4753, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 101, -1, 103, 104, -1, + -1, -1, -1, -1, 110, -1, 4780, 4781, 2111, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 131, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4813, + 3229, -1, -1, 2146, 150, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 161, 2159, -1, -1, -1, + -1, 3250, -1, -1, -1, 171, -1, 173, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1261, + 2183, 2184, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 204, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 216, 217, -1, -1, -1, -1, -1, -1, 4892, -1, + 4894, 227, 228, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 239, 240, -1, -1, 243, -1, -1, + -1, -1, 248, -1, -1, -1, -1, -1, 254, -1, + -1, -1, 258, 259, 260, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 294, -1, + 296, 3380, 298, -1, -1, -1, -1, -1, -1, 305, + -1, -1, -1, -1, -1, -1, -1, -1, 314, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 328, -1, -1, -1, -1, -1, -1, -1, + -1, 5005, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 350, -1, 3435, 353, -1, -1, + -1, -1, -1, 1435, 360, -1, -1, -1, 3447, -1, + -1, 3450, 368, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5051, -1, -1, + -1, -1, 388, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 412, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 422, 5091, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1514, -1, 1516, 441, -1, -1, -1, -1, + 5114, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 456, 2454, -1, -1, -1, -1, 5130, 5131, -1, -1, + -1, 467, -1, -1, 470, -1, -1, 473, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 488, -1, -1, -1, 1568, -1, -1, -1, + 1572, -1, 1574, -1, -1, -1, -1, -1, -1, -1, + 1582, 1583, -1, -1, -1, -1, 1588, -1, -1, -1, + 1592, 1593, 1594, -1, 1596, 1597, 1598, -1, -1, -1, + -1, -1, -1, -1, 1606, -1, 1608, -1, -1, 1611, + 1612, 1613, 1614, -1, -1, -1, 1618, 1619, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2551, -1, + 1632, 1633, 1634, 1635, 1636, -1, 1638, 1639, 1640, 1641, + 1642, -1, -1, 1645, 1646, -1, 1648, 1649, -1, 1651, + 1652, -1, -1, -1, 1656, -1, 1658, 1659, -1, 1661, + -1, 1663, -1, 2586, -1, 1667, 1668, 1669, -1, -1, + 1672, -1, 1674, 1675, -1, 1677, 602, -1, -1, -1, + -1, -1, 1684, -1, -1, -1, -1, -1, 1690, 1691, + 1692, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 631, -1, -1, -1, 635, + -1, -1, -1, -1, -1, -1, 3725, 3726, -1, 645, + -1, 3730, -1, -1, -1, -1, -1, 653, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 665, + -1, -1, -1, 3752, -1, 3754, -1, 3756, -1, 3758, + -1, -1, -1, -1, -1, -1, 1758, -1, -1, -1, + 686, -1, -1, 689, 3773, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3792, 3793, -1, -1, -1, 3797, -1, + 3799, -1, 3801, -1, -1, -1, 722, 3806, -1, -1, + -1, -1, 5396, -1, -1, 731, -1, -1, -1, -1, + -1, 2734, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5420, -1, -1, -1, + -1, 757, -1, -1, -1, -1, -1, -1, -1, -1, + 5434, -1, -1, -1, 3853, -1, -1, -1, -1, -1, + -1, -1, -1, 779, -1, 5449, -1, -1, 3867, -1, + -1, -1, 3871, -1, -1, -1, -1, -1, -1, -1, + 2793, -1, 1874, -1, 1876, -1, -1, -1, -1, -1, + 3889, -1, -1, -1, -1, 2808, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1911, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2848, 2849, -1, -1, -1, + -1, -1, -1, -1, -1, 2858, 2859, 2860, -1, -1, + 2863, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2875, -1, -1, -1, 2879, -1, -1, -1, + -1, -1, 3971, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3981, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5577, -1, -1, 3995, -1, -1, 3998, + -1, -1, -1, -1, 1996, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2024, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5707, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2149, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2192, -1, -1, -1, -1, -1, -1, -1, 2200, 2201, + 5794, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3139, -1, -1, -1, + -1, -1, -1, 3146, -1, -1, -1, 4236, 4237, -1, + 4239, -1, -1, -1, 5828, -1, -1, -1, -1, -1, + -1, -1, -1, 4252, 4253, 4254, 5840, -1, -1, -1, + -1, -1, 2254, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4276, 4277, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4300, -1, -1, -1, -1, 2298, 2299, 2300, -1, + -1, -1, -1, 4312, -1, -1, -1, -1, -1, -1, + -1, -1, 4321, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5924, -1, 4341, -1, -1, -1, -1, 4346, 4347, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4365, -1, -1, -1, + 4369, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2375, -1, -1, -1, 5971, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2391, + -1, 2393, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2424, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2450, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2462, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2475, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2486, -1, -1, -1, -1, 3412, + -1, -1, -1, -1, -1, -1, -1, 6091, -1, -1, + 2502, 6095, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3444, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2539, -1, -1, + -1, -1, -1, -1, 2546, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4570, 4571, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6222, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2642, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2675, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4699, -1, 2694, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2733, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4753, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4780, 4781, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4813, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2864, -1, -1, -1, 2868, -1, -1, 2871, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4892, -1, 4894, -1, 2889, -1, -1, + -1, -1, 2894, 2895, 2896, 2897, -1, 2899, -1, 2901, + 2902, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2912, 2913, -1, -1, -1, 2917, 2918, 2919, -1, -1, + -1, -1, -1, -1, -1, 2927, 2928, 2929, -1, 2931, + -1, 2933, -1, 2935, -1, 2937, -1, 2939, -1, -1, + -1, -1, 2944, 2945, -1, 2947, -1, 2949, -1, -1, + -1, 2953, -1, -1, 2956, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2968, -1, 2970, 2971, + 2972, -1, -1, 2975, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5005, -1, -1, -1, + 3002, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3013, 3014, -1, -1, 3017, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3948, 3949, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5051, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3070, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5091, -1, -1, -1, -1, 3089, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5114, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5130, 5131, -1, -1, -1, -1, -1, 4051, -1, + -1, -1, -1, -1, -1, -1, 3138, -1, -1, -1, + -1, 4064, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3160, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4120, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4198, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4264, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3380, -1, + -1, -1, -1, -1, -1, -1, -1, 5396, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5420, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5434, -1, -1, -1, -1, + -1, -1, -1, 3435, -1, -1, -1, -1, -1, -1, + 5449, -1, -1, -1, -1, 3447, -1, -1, 3450, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4454, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5577, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4557, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5707, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3725, 3726, -1, -1, -1, 3730, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4666, -1, -1, -1, -1, -1, -1, + 3752, -1, 3754, -1, 3756, -1, 3758, -1, -1, 4682, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3773, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5794, -1, -1, -1, -1, + 3792, 3793, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3806, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5828, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5840, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3853, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3867, -1, -1, -1, 3871, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3889, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5924, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4871, -1, + 4873, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5971, -1, -1, -1, -1, -1, -1, 3971, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3981, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3995, -1, -1, 3998, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4978, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6091, -1, -1, -1, 6095, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5046, -1, -1, -1, 5050, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6222, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4236, 4237, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4252, 4253, 4254, -1, -1, -1, -1, 5180, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4276, 4277, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4321, + -1, 5244, -1, -1, -1, -1, -1, 5250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5261, 4341, + -1, -1, -1, -1, 4346, 4347, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4365, -1, -1, -1, 4369, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5387, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4570, 4571, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5570, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5619, 4699, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5646, 5647, -1, -1, 5650, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5665, -1, -1, -1, -1, -1, -1, -1, + -1, 4753, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4780, 4781, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4813, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5748, -1, -1, -1, -1, + -1, -1, -1, 5756, -1, -1, -1, -1, -1, 5762, + 5763, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5785, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5802, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4892, -1, 4894, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5880, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5892, + -1, -1, -1, 5896, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5937, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5051, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5996, 5997, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5091, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6028, -1, -1, -1, -1, + -1, -1, 5114, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5130, 5131, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6072, + -1, 6074, 6075, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6111, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6145, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 6174, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6208, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5396, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5434, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5449, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5707, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, + -1, -1, -1, -1, 8, 9, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, 5840, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, 5924, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, 188, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + 254, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, 305, -1, -1, 308, 309, -1, -1, -1, 6091, + 314, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + 6222, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, 64, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, 163, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, 188, -1, -1, -1, 192, -1, -1, + 195, 196, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, 288, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, 188, -1, -1, -1, 192, -1, -1, 195, + 196, -1, 198, 199, 200, 201, -1, 203, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, 188, -1, -1, -1, 192, -1, -1, 195, 196, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, 311, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, 143, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + 188, -1, -1, -1, 192, -1, -1, 195, 196, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, 128, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, 188, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, 128, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, 188, -1, + -1, -1, 192, -1, -1, 195, 196, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, 128, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, 188, -1, -1, + -1, 192, -1, -1, 195, 196, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, 143, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, 188, -1, -1, -1, + 192, -1, -1, 195, 196, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, 188, -1, -1, -1, 192, + -1, -1, 195, 196, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, 188, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, 188, -1, -1, -1, 192, -1, -1, + 195, 196, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, 188, -1, -1, -1, 192, -1, -1, 195, + 196, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, 188, -1, -1, -1, 192, -1, -1, 195, -1, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + 188, -1, -1, -1, 192, -1, -1, 195, 196, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, 188, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, 182, 183, -1, -1, -1, 187, 188, -1, + -1, -1, 192, -1, -1, 195, -1, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, 188, -1, -1, + -1, 192, -1, -1, 195, -1, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, 188, -1, -1, -1, + 192, -1, -1, 195, -1, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, 188, -1, -1, -1, 192, + -1, -1, 195, -1, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, 188, -1, -1, -1, 192, -1, + -1, 195, -1, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, 188, -1, -1, -1, 192, -1, -1, + 195, -1, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, 188, -1, -1, -1, 192, -1, -1, 195, + -1, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, 188, -1, -1, -1, 192, -1, -1, 195, -1, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, -1, -1, -1, + 8, -1, 779, -1, -1, -1, -1, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, 122, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 3, 756, 757, + 758, 759, 8, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 3, + 756, 757, 758, 759, 8, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, -1, -1, -1, + -1, -1, -1, -1, 780, -1, -1, -1, -1, -1, + -1, 787, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, 8, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 787, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 8, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 779, -1, -1, -1, -1, -1, -1, -1, + 787, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 8, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 787, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 129, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, 145, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 160, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 262, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 254, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 305, -1, -1, -1, -1, -1, + -1, -1, -1, 314, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, + -1, -1, -1, -1, -1, -1, 787, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 111, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, 784, -1, -1, 787, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 779, -1, -1, -1, -1, 784, -1, -1, 787, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 779, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, 770, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 787, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 779, -1, -1, -1, -1, -1, -1, + -1, 787, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 787, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 787, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, + -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, 123, -1, -1, -1, 127, -1, -1, 130, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 157, -1, -1, -1, + -1, -1, -1, -1, 165, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 177, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 247, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 313, -1, -1, -1, -1, 318, 319, 320, + 321, 322, -1, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + -1, 342, 343, 344, 345, 346, 347, 348, 349, -1, + 351, -1, -1, 354, 355, 356, 357, 358, -1, -1, + 361, 362, 363, 364, 365, -1, -1, -1, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + -1, -1, -1, -1, 385, -1, 387, -1, 389, 390, + -1, 392, 393, 394, 395, 396, 397, -1, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, 413, -1, 415, 416, 417, 418, 419, 420, + 421, -1, 423, 424, 425, 426, -1, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, -1, -1, + -1, 442, -1, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, -1, -1, -1, -1, -1, + 461, 462, 463, 464, 465, 466, -1, 468, 469, -1, + 471, 472, -1, -1, 475, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, -1, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, -1, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, -1, -1, 585, -1, 587, 588, -1, 590, + 591, 592, 593, -1, 595, 596, 597, 598, -1, -1, + -1, -1, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, -1, 630, + -1, 632, 633, 634, -1, 636, 637, -1, 639, 640, + 641, 642, 643, 644, -1, 646, 647, 648, 649, 650, + 651, 652, -1, 654, 655, 656, -1, 658, 659, 660, + 661, -1, 663, 664, -1, -1, 667, 668, -1, -1, + 671, 672, 673, -1, 675, -1, 677, 678, 679, 680, + -1, 682, 683, 684, 685, -1, 687, 688, -1, 690, + -1, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, -1, 713, 714, 715, 716, 717, 718, 719, 720, + 721, -1, 723, 724, -1, 726, 727, 728, 729, -1, + -1, 732, 733, -1, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + -1, 752, 753, -1, -1, 756, -1, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 782, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 85, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, -1, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 3, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + 779, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 71, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 3, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 71, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + 3, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 3, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 3, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 3, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 74, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, 3, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 8, 9, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, -1, -1, -1, -1, 28, -1, 30, -1, 32, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 251, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 8, 9, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 19, 20, + -1, -1, -1, -1, -1, -1, -1, 28, -1, 30, + -1, 32, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 251, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 8, + 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, -1, -1, -1, -1, -1, -1, -1, 28, + -1, 30, -1, 32, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 251, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 8, 9, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 19, 20, -1, -1, -1, -1, -1, -1, + -1, 28, -1, 30, -1, 32, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, 770, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, 770, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, 770, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, 770, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, 770, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, 26, -1, -1, 770, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, 196, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, 209, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 265, -1, 267, -1, 269, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, -1, -1, -1, -1, -1, -1, 769, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, 21, 763, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 42, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, 763, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, -1, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + -1, 128, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + -1, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, -1, 128, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, -1, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, -1, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, -1, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, -1, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, -1, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, -1, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, -1, 661, 662, 663, 664, 665, + -1, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, -1, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, -1, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, -1, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, -1, 128, 129, 130, 131, 132, -1, -1, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, -1, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, -1, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, -1, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, -1, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, -1, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + -1, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, -1, 661, 662, 663, 664, + 665, -1, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, -1, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, -1, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, -1, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, -1, 128, 129, 130, 131, 132, -1, + -1, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, -1, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, -1, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, -1, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, -1, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, -1, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, -1, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, -1, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, -1, 661, 662, 663, + 664, 665, -1, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, -1, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 47, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, 84, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + -1, -1, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, 145, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 232, + -1, -1, -1, 236, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 289, -1, -1, -1, + -1, -1, -1, 296, 297, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 47, 48, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, + -1, -1, 84, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 101, + -1, -1, -1, -1, -1, -1, -1, -1, 110, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 131, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, 145, -1, -1, -1, -1, 150, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 173, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 232, -1, -1, -1, 236, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 254, -1, -1, -1, 258, 259, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 289, -1, -1, + -1, -1, -1, -1, 296, 297, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, 24, 25, 26, -1, 28, -1, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, 23, -1, -1, 26, 27, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 85, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 84, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 76, 77, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + -1, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + 148, -1, -1, 151, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, 212, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 258, -1, -1, -1, -1, -1, -1, -1, + -1, 267, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 128, -1, -1, -1, -1, -1, + -1, 135, 136, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 267, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 128, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 63, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, 225, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, 225, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, -1, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, -1, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, -1, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + -1, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, -1, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, -1, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, -1, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, -1, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, -1, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, -1, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + -1, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, -1, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, -1, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 68, -1, -1, -1, -1, -1, -1, -1, + -1, 77, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 113, 114, 115, + 116, -1, -1, -1, -1, -1, -1, 123, -1, -1, + -1, 127, -1, -1, 130, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 157, -1, -1, -1, -1, -1, -1, -1, 165, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 177, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, -1, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, -1, 342, 343, 344, 345, + 346, 347, 348, 349, -1, 351, -1, -1, 354, 355, + 356, 357, 358, -1, -1, 361, 362, 363, 364, 365, + -1, -1, -1, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, -1, -1, -1, -1, -1, -1, 385, + -1, 387, -1, 389, 390, -1, 392, 393, 394, 395, + 396, 397, -1, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, 413, -1, 415, + 416, 417, 418, 419, 420, 421, -1, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, -1, -1, -1, 442, -1, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, -1, -1, -1, 461, 462, 463, 464, 465, + 466, -1, 468, 469, -1, 471, 472, -1, -1, 475, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, -1, 489, 490, 491, 492, 493, 494, 495, + 496, 497, -1, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, -1, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, -1, -1, 585, + -1, 587, 588, -1, 590, 591, 592, 593, -1, 595, + 596, 597, 598, -1, -1, -1, -1, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, -1, 630, -1, 632, 633, 634, -1, + 636, 637, -1, 639, 640, 641, 642, 643, 644, -1, + 646, 647, 648, 649, 650, 651, 652, -1, 654, 655, + 656, -1, 658, 659, 660, 661, -1, 663, 664, -1, + -1, 667, 668, -1, -1, 671, 672, 673, -1, 675, + -1, 677, 678, 679, 680, -1, 682, 683, 684, 685, + -1, 687, 688, -1, 690, -1, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, -1, 713, 714, 715, + 716, 717, 718, 719, 720, 721, -1, 723, 724, -1, + 726, 727, 728, 729, 19, 20, 732, 733, -1, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, -1, -1, 752, 753, -1, -1, + 756, -1, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 68, -1, -1, -1, -1, -1, -1, + -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 114, + -1, 116, -1, -1, -1, -1, -1, -1, 123, -1, + -1, -1, 127, -1, -1, 130, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 157, -1, -1, -1, -1, -1, -1, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 177, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 188, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, 246, 247, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 311, -1, 313, -1, + -1, -1, -1, 318, 319, 320, 321, 322, -1, 324, + 325, 326, 327, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, -1, 342, 343, 344, + 345, 346, 347, 348, 349, -1, 351, -1, -1, 354, + 355, 356, 357, 358, -1, -1, 361, 362, 363, 364, + 365, -1, -1, -1, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, -1, -1, -1, -1, -1, -1, + 385, -1, 387, -1, 389, 390, -1, 392, 393, 394, + 395, 396, 397, -1, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, 413, -1, + 415, 416, 417, 418, 419, 420, 421, -1, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, -1, -1, -1, 442, -1, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, -1, -1, -1, -1, -1, 461, 462, 463, 464, + 465, 466, -1, 468, 469, -1, 471, 472, -1, -1, + 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, -1, 489, 490, 491, 492, 493, 494, + 495, 496, 497, -1, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, -1, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, -1, -1, + 585, -1, 587, 588, -1, 590, 591, 592, 593, -1, + 595, 596, 597, 598, -1, -1, -1, -1, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, -1, 630, -1, 632, 633, 634, + -1, 636, 637, -1, 639, 640, 641, 642, 643, 644, + -1, 646, 647, 648, 649, 650, 651, 652, -1, 654, + 655, 656, -1, 658, 659, 660, 661, -1, 663, 664, + -1, -1, 667, 668, -1, -1, 671, 672, 673, -1, + 675, -1, 677, 678, 679, 680, -1, 682, 683, 684, + 685, -1, 687, 688, -1, 690, -1, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, -1, 713, 714, + 715, 716, 717, 718, 719, 720, 721, -1, 723, 724, + -1, 726, 727, 728, 729, 19, 20, 732, 733, -1, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, -1, -1, 752, 753, -1, + -1, 756, -1, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 68, -1, -1, -1, -1, -1, + -1, -1, -1, 77, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, 123, + -1, -1, -1, 127, -1, -1, 130, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 157, -1, -1, -1, -1, -1, -1, + -1, 165, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 177, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 313, + -1, -1, -1, -1, 318, 319, 320, 321, 322, -1, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, -1, 342, 343, + 344, 345, 346, 347, 348, 349, -1, 351, -1, -1, + 354, 355, 356, 357, 358, -1, -1, 361, 362, 363, + 364, 365, -1, -1, -1, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, -1, -1, -1, -1, -1, + -1, 385, -1, 387, -1, 389, 390, -1, 392, 393, + 394, 395, 396, 397, -1, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, 413, + -1, 415, 416, 417, 418, 419, 420, 421, -1, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, -1, -1, -1, 442, -1, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, -1, -1, -1, 461, 462, 463, + 464, 465, 466, -1, 468, 469, -1, 471, 472, -1, + -1, 475, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, -1, 489, 490, 491, 492, 493, + 494, 495, 496, 497, -1, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, -1, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, -1, + -1, 585, -1, 587, 588, -1, 590, 591, 592, 593, + -1, 595, 596, 597, 598, -1, -1, -1, -1, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, -1, 630, -1, 632, 633, + 634, -1, 636, 637, -1, 639, 640, 641, 642, 643, + 644, -1, 646, 647, 648, 649, 650, 651, 652, -1, + 654, 655, 656, -1, 658, 659, 660, 661, -1, 663, + 664, -1, -1, 667, 668, -1, -1, 671, 672, 673, + -1, 675, -1, 677, 678, 679, 680, -1, 682, 683, + 684, 685, -1, 687, 688, -1, 690, -1, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, -1, 713, + 714, 715, 716, 717, 718, 719, 720, 721, -1, 723, + 724, -1, 726, 727, 728, 729, 19, 20, 732, 733, + -1, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, -1, 752, 753, + -1, -1, 756, -1, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 68, -1, -1, -1, -1, + -1, -1, -1, -1, 77, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + 123, -1, -1, -1, 127, -1, -1, 130, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 157, -1, -1, -1, -1, -1, + -1, -1, 165, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 188, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, 246, 247, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 313, -1, -1, -1, -1, 318, 319, 320, 321, 322, + -1, 324, 325, 326, 327, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, -1, 342, + 343, 344, 345, 346, 347, 348, 349, -1, 351, -1, + -1, 354, 355, 356, 357, 358, -1, -1, 361, 362, + 363, 364, 365, -1, -1, -1, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, -1, -1, -1, -1, + -1, -1, 385, -1, 387, -1, 389, 390, -1, 392, + 393, 394, 395, 396, 397, -1, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, -1, + 413, -1, 415, 416, 417, 418, 419, 420, 421, -1, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, -1, -1, -1, 442, + -1, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, -1, -1, -1, -1, -1, 461, 462, + 463, 464, 465, 466, -1, 468, 469, -1, 471, 472, + -1, -1, 475, -1, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, -1, 489, 490, 491, 492, + 493, 494, 495, 496, 497, -1, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, -1, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + -1, -1, 585, -1, 587, 588, -1, 590, 591, 592, + 593, -1, 595, 596, 597, 598, -1, -1, -1, -1, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, -1, 630, -1, 632, + 633, 634, -1, 636, 637, -1, 639, 640, 641, 642, + 643, 644, -1, 646, 647, 648, 649, 650, 651, 652, + -1, 654, 655, 656, -1, 658, 659, 660, 661, -1, + 663, 664, -1, -1, 667, 668, -1, -1, 671, 672, + 673, -1, 675, -1, 677, 678, 679, 680, -1, 682, + 683, 684, 685, -1, 687, 688, -1, 690, -1, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, -1, + 713, 714, 715, 716, 717, 718, 719, 720, 721, -1, + 723, 724, -1, 726, 727, 728, 729, 19, 20, 732, + 733, -1, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, -1, -1, 752, + 753, -1, -1, 756, -1, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 68, -1, -1, -1, + -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, 123, -1, -1, -1, 127, -1, -1, 130, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 157, -1, -1, -1, -1, + -1, -1, -1, 165, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 177, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 188, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, 246, 247, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 313, -1, -1, -1, -1, 318, 319, 320, 321, + 322, -1, 324, 325, 326, 327, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, -1, + 342, 343, 344, 345, 346, 347, 348, 349, -1, 351, + -1, -1, 354, 355, 356, 357, 358, -1, -1, 361, + 362, 363, 364, 365, -1, -1, -1, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, -1, -1, -1, + -1, -1, -1, 385, -1, 387, -1, 389, 390, -1, + 392, 393, 394, 395, 396, 397, -1, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + -1, 413, -1, 415, 416, 417, 418, 419, 420, 421, + -1, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, -1, -1, -1, + 442, -1, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, -1, -1, -1, -1, -1, 461, + 462, 463, 464, 465, 466, -1, 468, 469, -1, 471, + 472, -1, -1, 475, -1, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, -1, 489, 490, 491, + 492, 493, 494, 495, 496, 497, -1, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, -1, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, -1, -1, 585, -1, 587, 588, -1, 590, 591, + 592, 593, -1, 595, 596, 597, 598, -1, -1, -1, + -1, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, -1, 630, -1, + 632, 633, 634, -1, 636, 637, -1, 639, 640, 641, + 642, 643, 644, -1, 646, 647, 648, 649, 650, 651, + 652, -1, 654, 655, 656, -1, 658, 659, 660, 661, + -1, 663, 664, -1, -1, 667, 668, -1, -1, 671, + 672, 673, -1, 675, -1, 677, 678, 679, 680, -1, + 682, 683, 684, 685, -1, 687, 688, -1, 690, -1, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + -1, 713, 714, 715, 716, 717, 718, 719, 720, 721, + -1, 723, 724, -1, 726, 727, 728, 729, 19, 20, + 732, 733, -1, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, -1, -1, + 752, 753, -1, -1, 756, -1, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 68, -1, -1, + -1, -1, -1, -1, -1, -1, 77, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, 123, -1, -1, -1, 127, -1, -1, 130, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 157, -1, -1, -1, + -1, -1, -1, -1, 165, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 177, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 188, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, 246, 247, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 313, -1, -1, -1, -1, 318, 319, 320, + 321, 322, -1, 324, 325, 326, 327, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + -1, 342, 343, 344, 345, 346, 347, 348, 349, -1, + 351, -1, -1, 354, 355, 356, 357, 358, -1, -1, + 361, 362, 363, 364, 365, -1, -1, -1, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, -1, -1, + -1, -1, -1, -1, 385, -1, 387, -1, 389, 390, + -1, 392, 393, 394, 395, 396, 397, -1, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, 413, -1, 415, 416, 417, 418, 419, 420, + 421, -1, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, -1, -1, + -1, 442, -1, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, -1, -1, -1, -1, -1, + 461, 462, 463, 464, 465, 466, -1, 468, 469, -1, + 471, 472, -1, -1, 475, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, -1, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, -1, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, -1, -1, 585, -1, 587, 588, -1, 590, + 591, 592, 593, -1, 595, 596, 597, 598, -1, -1, + -1, -1, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, -1, 630, + -1, 632, 633, 634, -1, 636, 637, -1, 639, 640, + 641, 642, 643, 644, -1, 646, 647, 648, 649, 650, + 651, 652, -1, 654, 655, 656, -1, 658, 659, 660, + 661, -1, 663, 664, -1, -1, 667, 668, -1, -1, + 671, 672, 673, -1, 675, -1, 677, 678, 679, 680, + -1, 682, 683, 684, 685, -1, 687, 688, -1, 690, + -1, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, -1, 713, 714, 715, 716, 717, 718, 719, 720, + 721, -1, 723, 724, -1, 726, 727, 728, 729, 19, + 20, 732, 733, -1, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + -1, 752, 753, -1, -1, 756, -1, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 68, -1, + -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, 123, -1, -1, -1, 127, -1, -1, + 130, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 157, -1, -1, + -1, -1, -1, -1, -1, 165, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 177, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, 246, 247, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 313, -1, -1, -1, -1, 318, 319, + 320, 321, 322, -1, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, -1, 342, 343, 344, 345, 346, 347, 348, 349, + -1, 351, -1, -1, 354, 355, 356, 357, 358, -1, + -1, 361, 362, 363, 364, 365, -1, -1, -1, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, -1, + -1, -1, -1, -1, -1, 385, -1, 387, -1, 389, + 390, -1, 392, 393, 394, 395, 396, 397, -1, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, 413, -1, 415, 416, 417, 418, 419, + 420, 421, -1, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, -1, + -1, -1, 442, -1, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, -1, -1, -1, -1, + -1, 461, 462, 463, 464, 465, 466, -1, 468, 469, + -1, 471, 472, -1, -1, 475, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, -1, 489, + 490, 491, 492, 493, 494, 495, 496, 497, -1, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, -1, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, -1, -1, 585, -1, 587, 588, -1, + 590, 591, 592, 593, -1, 595, 596, 597, 598, -1, + -1, -1, -1, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, -1, + 630, -1, 632, 633, 634, -1, 636, 637, -1, 639, + 640, 641, 642, 643, 644, -1, 646, 647, 648, 649, + 650, 651, 652, -1, 654, 655, 656, -1, 658, 659, + 660, 661, -1, 663, 664, -1, -1, 667, 668, -1, + -1, 671, 672, 673, -1, 675, -1, 677, 678, 679, + 680, -1, 682, 683, 684, 685, -1, 687, 688, -1, + 690, -1, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, -1, 713, 714, 715, 716, 717, 718, 719, + 720, 721, -1, 723, 724, -1, 726, 727, 728, 729, + 19, 20, 732, 733, -1, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + -1, -1, 752, 753, -1, -1, 756, -1, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, + -1, -1, -1, -1, -1, -1, -1, -1, 77, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, 123, -1, -1, -1, 127, -1, + -1, 130, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 157, -1, + -1, -1, -1, -1, -1, -1, 165, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 177, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 188, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, 246, 247, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 313, -1, -1, -1, -1, 318, + 319, 320, 321, 322, -1, 324, 325, 326, 327, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, -1, 342, 343, 344, 345, 346, 347, 348, + 349, -1, 351, -1, -1, 354, 355, 356, 357, 358, + -1, -1, 361, 362, 363, 364, 365, -1, -1, -1, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + -1, -1, -1, -1, -1, -1, 385, -1, 387, -1, + 389, 390, -1, 392, 393, 394, 395, 396, 397, -1, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, -1, 413, -1, 415, 416, 417, 418, + 419, 420, 421, -1, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + -1, -1, -1, 442, -1, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, -1, -1, -1, + -1, -1, 461, 462, 463, 464, 465, 466, -1, 468, + 469, -1, 471, 472, -1, -1, 475, -1, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, -1, + 489, 490, 491, 492, 493, 494, 495, 496, 497, -1, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, -1, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, -1, -1, 585, -1, 587, 588, + -1, 590, 591, 592, 593, -1, 595, 596, 597, 598, + -1, -1, -1, -1, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + -1, 630, -1, 632, 633, 634, -1, 636, 637, -1, + 639, 640, 641, 642, 643, 644, -1, 646, 647, 648, + 649, 650, 651, 652, -1, 654, 655, 656, -1, 658, + 659, 660, 661, -1, 663, 664, -1, -1, 667, 668, + -1, -1, 671, 672, 673, -1, 675, -1, 677, 678, + 679, 680, -1, 682, 683, 684, 685, -1, 687, 688, + -1, 690, -1, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, -1, 713, 714, 715, 716, 717, 718, + 719, 720, 721, -1, 723, 724, -1, 726, 727, 728, + 729, 19, 20, 732, 733, -1, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, -1, -1, 752, 753, -1, -1, 756, -1, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 68, -1, -1, -1, -1, -1, -1, -1, -1, 77, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, 123, -1, -1, -1, 127, + -1, -1, 130, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 157, + -1, -1, -1, -1, -1, -1, -1, 165, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 177, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, 246, 247, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 313, -1, -1, -1, -1, + 318, 319, 320, 321, 322, -1, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, -1, 342, 343, 344, 345, 346, 347, + 348, 349, -1, 351, -1, -1, 354, 355, 356, 357, + 358, -1, -1, 361, 362, 363, 364, 365, -1, -1, + -1, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, -1, -1, -1, -1, -1, -1, 385, -1, 387, + -1, 389, 390, -1, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, 413, -1, 415, 416, 417, + 418, 419, 420, 421, -1, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, -1, -1, -1, 442, -1, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, + -1, -1, -1, 461, 462, 463, 464, 465, 466, -1, + 468, 469, -1, 471, 472, -1, -1, 475, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + -1, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, -1, -1, 585, -1, 587, + 588, -1, 590, 591, 592, 593, -1, 595, 596, 597, + 598, -1, -1, -1, -1, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, -1, 630, -1, 632, 633, 634, -1, 636, 637, + -1, 639, 640, 641, 642, 643, 644, -1, 646, 647, + 648, 649, 650, 651, 652, -1, 654, 655, 656, -1, + 658, 659, 660, 661, -1, 663, 664, -1, -1, 667, + 668, -1, -1, 671, 672, 673, -1, 675, -1, 677, + 678, 679, 680, -1, 682, 683, 684, 685, -1, 687, + 688, -1, 690, -1, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, -1, 713, 714, 715, 716, 717, + 718, 719, 720, 721, -1, 723, 724, -1, 726, 727, + 728, 729, 19, 20, 732, 733, -1, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, -1, -1, 752, 753, -1, -1, 756, -1, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 68, -1, -1, -1, -1, -1, -1, -1, -1, + 77, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, 123, -1, -1, -1, + 127, -1, -1, 130, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 157, -1, -1, -1, -1, -1, -1, -1, 165, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 177, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 188, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, 246, + 247, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 313, -1, -1, -1, + -1, 318, 319, 320, 321, 322, -1, 324, 325, 326, + 327, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, -1, 342, 343, 344, 345, 346, + 347, 348, 349, -1, 351, -1, -1, 354, 355, 356, + 357, 358, -1, -1, 361, 362, 363, 364, 365, -1, + -1, -1, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, -1, -1, -1, -1, -1, -1, 385, -1, + 387, -1, 389, 390, -1, 392, 393, 394, 395, 396, + 397, -1, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, -1, 413, -1, 415, 416, + 417, 418, 419, 420, 421, -1, 423, 424, 425, 426, + -1, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, -1, -1, -1, 442, -1, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, + -1, -1, -1, -1, 461, 462, 463, 464, 465, 466, + -1, 468, 469, -1, 471, 472, -1, -1, 475, -1, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, -1, 489, 490, 491, 492, 493, 494, 495, 496, + 497, -1, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, -1, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, -1, -1, 585, -1, + 587, 588, -1, 590, 591, 592, 593, -1, 595, 596, + 597, 598, -1, -1, -1, -1, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, -1, 630, -1, 632, 633, 634, -1, 636, + 637, -1, 639, 640, 641, 642, 643, 644, -1, 646, + 647, 648, 649, 650, 651, 652, -1, 654, 655, 656, + -1, 658, 659, 660, 661, -1, 663, 664, -1, -1, + 667, 668, -1, -1, 671, 672, 673, -1, 675, -1, + 677, 678, 679, 680, -1, 682, 683, 684, 685, -1, + 687, 688, -1, 690, -1, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, -1, 713, 714, 715, 716, + 717, 718, 719, 720, 721, -1, 723, 724, -1, 726, + 727, 728, 729, 19, 20, 732, 733, -1, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, -1, -1, 752, 753, -1, -1, 756, + -1, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 68, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 127, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 177, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 188, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 313, -1, -1, + -1, -1, 318, 319, 320, 321, 322, -1, 324, 325, + 326, 327, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, -1, 342, 343, 344, 345, + 346, 347, 348, 349, -1, 351, -1, -1, 354, 355, + 356, 357, 358, -1, -1, 361, 362, 363, 364, 365, + -1, -1, -1, 369, 370, 371, 372, 373, -1, 375, + 376, 377, 378, -1, -1, -1, -1, -1, -1, 385, + -1, 387, -1, 389, 390, -1, 392, 393, 394, 395, + 396, 397, -1, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, -1, 413, -1, 415, + 416, 417, 418, 419, 420, 421, -1, 423, 424, 425, + 426, -1, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, -1, -1, -1, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + -1, -1, -1, -1, -1, 461, 462, 463, 464, 465, + 466, -1, 468, 469, -1, 471, 472, -1, -1, 475, + -1, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, -1, 489, 490, 491, 492, 493, 494, 495, + 496, 497, -1, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, -1, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, -1, -1, -1, 585, + -1, 587, 588, -1, 590, 591, 592, 593, -1, 595, + 596, 597, 598, -1, -1, -1, -1, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, -1, 630, -1, 632, 633, 634, -1, + 636, 637, -1, 639, 640, 641, 642, 643, 644, -1, + 646, 647, 648, 649, 650, 651, 652, -1, 654, 655, + 656, -1, 658, 659, 660, 661, -1, 663, 664, 19, + 20, 667, 668, -1, -1, 671, 672, 673, -1, 675, + -1, 677, 678, 679, 680, -1, 682, 683, 684, 685, + -1, 687, 688, -1, 690, -1, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, -1, 713, 714, 715, + 716, 717, 718, 719, 720, 721, -1, 723, 724, -1, + 726, 727, 728, 729, -1, -1, 732, 733, 88, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, -1, -1, 752, 753, -1, -1, + 756, -1, 758, 759, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 188, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 311, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, -1, 324, 325, 326, 327, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, -1, 342, 343, 344, 345, 346, 347, 348, 349, + -1, -1, -1, -1, 354, 355, 356, 357, 358, -1, + -1, 361, 362, 363, 364, 365, -1, -1, -1, 369, + 370, 371, 372, 373, -1, 375, 376, 377, 378, -1, + -1, -1, -1, -1, -1, 385, -1, 387, -1, 389, + 390, -1, 392, 393, 394, 395, 396, 397, -1, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, -1, 413, -1, 415, 416, 417, 418, 419, + 420, 421, -1, 423, 424, 425, 426, -1, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, -1, + -1, -1, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, -1, -1, -1, -1, + -1, 461, 462, 463, 464, 465, 466, -1, 468, 469, + -1, 471, 472, -1, -1, 475, -1, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, -1, 489, + 490, 491, 492, 493, 494, 495, 496, 497, -1, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, -1, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, -1, -1, -1, 585, -1, 587, 588, -1, + 590, 591, 592, 593, -1, 595, 596, 597, 598, -1, + -1, -1, -1, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, -1, + 630, -1, 632, 633, 634, -1, 636, 637, -1, 639, + 640, 641, 642, 643, 644, -1, 646, 647, 648, 649, + 650, 651, 652, -1, 654, 655, 656, -1, 658, 659, + 660, 661, -1, 663, 664, 19, 20, 667, 668, -1, + -1, 671, 672, 673, -1, 675, -1, 677, 678, 679, + 680, -1, 682, 683, 684, 685, -1, 687, 688, -1, + 690, -1, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, -1, 713, 714, 715, 716, 717, 718, 719, + 720, 721, -1, 723, 724, -1, 726, 727, 728, 729, + -1, -1, 732, 733, 88, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + -1, -1, 752, 753, -1, -1, 756, -1, 758, 759, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 188, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 311, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, -1, + 324, 325, 326, 327, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, -1, 342, 343, + 344, 345, 346, 347, 348, 349, -1, -1, -1, -1, + 354, 355, 356, 357, 358, -1, -1, 361, 362, 363, + 364, 365, -1, -1, -1, 369, 370, 371, 372, 373, + -1, 375, 376, 377, 378, -1, -1, -1, -1, -1, + -1, 385, -1, 387, -1, 389, 390, -1, 392, 393, + 394, 395, 396, 397, -1, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, -1, 413, + -1, 415, 416, 417, 418, 419, 420, 421, -1, 423, + 424, 425, 426, -1, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, -1, -1, -1, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, -1, -1, -1, -1, -1, 461, 462, 463, + 464, 465, 466, -1, 468, 469, -1, 471, 472, -1, + -1, 475, -1, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, -1, 489, 490, 491, 492, 493, + 494, 495, 496, 497, -1, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, -1, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, -1, -1, + -1, 585, -1, 587, 588, -1, 590, 591, 592, 593, + -1, 595, 596, 597, 598, -1, -1, -1, -1, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, -1, 630, -1, 632, 633, + 634, -1, 636, 637, -1, 639, 640, 641, 642, 643, + 644, -1, 646, 647, 648, 649, 650, 651, 652, -1, + 654, 655, 656, -1, 658, 659, 660, 661, -1, 663, + 664, 19, 20, 667, 668, -1, -1, 671, 672, 673, + -1, 675, -1, 677, 678, 679, 680, -1, 682, 683, + 684, 685, -1, 687, 688, -1, 690, -1, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, -1, 713, + 714, 715, 716, 717, 718, 719, 720, 721, -1, 723, + 724, -1, 726, 727, 728, 729, -1, -1, 732, 733, + 88, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, -1, 752, 753, + -1, -1, 756, -1, 758, 759, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 188, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, -1, 324, 325, 326, 327, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, -1, 342, 343, 344, 345, 346, 347, + 348, 349, -1, -1, -1, -1, 354, 355, 356, 357, + 358, -1, -1, 361, 362, 363, 364, 365, -1, -1, + -1, 369, 370, 371, 372, 373, -1, 375, 376, 377, + 378, -1, -1, -1, -1, -1, -1, 385, -1, 387, + -1, 389, 390, -1, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, -1, 413, -1, 415, 416, 417, + 418, 419, 420, 421, -1, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, -1, -1, -1, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, -1, -1, + -1, -1, -1, 461, 462, 463, 464, 465, 466, -1, + 468, 469, -1, 471, 472, -1, -1, 475, -1, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + -1, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, -1, -1, -1, 585, -1, 587, + 588, -1, 590, 591, 592, 593, -1, 595, 596, 597, + 598, -1, -1, -1, -1, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, -1, 630, -1, 632, 633, 634, -1, 636, 637, + -1, 639, 640, 641, 642, 643, 644, -1, 646, 647, + 648, 649, 650, 651, 652, -1, 654, 655, 656, -1, + 658, 659, 660, 661, -1, 663, 664, -1, -1, 667, + 668, -1, -1, 671, 672, 673, -1, 675, -1, 677, + 678, 679, 680, -1, 682, 683, 684, 685, -1, 687, + 688, -1, 690, -1, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, -1, 713, 714, 715, 716, 717, + 718, 719, 720, 721, -1, 723, 724, -1, 726, 727, + 728, 729, -1, -1, 732, 733, -1, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 19, 20, 752, 753, -1, -1, 756, -1, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, -1, + 57, 58, 59, 60, -1, -1, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, -1, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + -1, 128, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, -1, -1, -1, + 177, 178, 179, 180, 181, 182, 183, -1, -1, -1, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, -1, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, -1, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, -1, 259, 260, -1, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, -1, -1, -1, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, -1, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, -1, 353, -1, 355, -1, + -1, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, -1, -1, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, -1, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, -1, 456, + 457, 458, -1, 460, 461, 462, -1, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, -1, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, -1, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, -1, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, -1, -1, -1, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, -1, -1, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, -1, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, -1, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, -1, 711, 712, -1, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, -1, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, -1, 751, 752, 753, 754, -1, 756, + 757, 758 +}; + +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ +static const yytype_int16 yystos[] = +{ + 0, 5, 7, 48, 49, 66, 68, 70, 72, 80, + 101, 103, 104, 110, 127, 131, 141, 150, 161, 171, + 173, 177, 204, 216, 217, 227, 228, 239, 240, 241, + 243, 248, 254, 258, 259, 260, 294, 296, 298, 305, + 313, 314, 328, 350, 351, 353, 360, 368, 388, 412, + 422, 441, 456, 467, 470, 473, 488, 602, 631, 635, + 645, 653, 665, 686, 689, 722, 731, 757, 779, 790, + 793, 794, 795, 796, 797, 799, 805, 807, 822, 869, + 908, 909, 916, 917, 930, 965, 990, 1008, 1070, 1123, + 1224, 1277, 1280, 1290, 1295, 1301, 1314, 1317, 1323, 1326, + 1331, 1338, 1350, 1353, 1356, 1357, 1359, 1362, 1363, 1365, + 1366, 1369, 1370, 1373, 1610, 1612, 1625, 1628, 1666, 1675, + 1693, 1701, 1715, 1719, 1720, 1724, 1725, 1735, 1742, 1750, + 1752, 1758, 1761, 1762, 1794, 1849, 1890, 1897, 1899, 1908, + 1911, 1947, 1949, 1954, 1955, 1956, 1957, 1982, 1991, 1992, + 1993, 1995, 2023, 2024, 2034, 2039, 88, 226, 338, 413, + 463, 658, 662, 735, 1225, 1961, 1962, 1963, 1964, 197, + 460, 506, 1325, 1722, 19, 20, 88, 116, 135, 144, + 188, 195, 207, 218, 279, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 756, + 757, 758, 759, 1816, 1818, 1827, 1834, 1838, 1839, 1840, + 1841, 1842, 1843, 1844, 1845, 1846, 1847, 2001, 966, 528, + 1318, 208, 1676, 88, 145, 226, 289, 436, 463, 644, + 662, 708, 735, 743, 1624, 993, 860, 931, 1626, 1753, + 145, 408, 758, 1767, 281, 704, 1893, 991, 1325, 1124, + 1009, 57, 528, 1707, 258, 267, 905, 910, 912, 1827, + 653, 735, 1893, 995, 910, 911, 860, 1360, 1850, 1702, + 910, 1898, 1667, 1827, 1358, 992, 235, 1796, 1629, 173, + 294, 684, 1736, 40, 196, 1406, 1948, 3, 31, 1821, + 145, 1893, 753, 1951, 1611, 482, 1827, 1325, 403, 918, + 1900, 806, 598, 676, 1827, 1325, 1743, 1951, 1827, 1759, + 47, 669, 717, 47, 669, 1694, 598, 676, 351, 352, + 388, 427, 602, 619, 645, 686, 1985, 1359, 1366, 1369, + 0, 7, 791, 602, 88, 129, 145, 262, 293, 644, + 735, 839, 1202, 1203, 1624, 1961, 1962, 1963, 1964, 128, + 154, 1376, 1377, 1606, 1354, 1351, 119, 152, 292, 1368, + 1958, 1367, 1958, 448, 460, 591, 787, 1721, 1722, 1813, + 1827, 1363, 1365, 386, 1244, 1827, 863, 1827, 763, 763, + 863, 141, 1623, 21, 1821, 1827, 1829, 1623, 1269, 1270, + 268, 1394, 1965, 1966, 1961, 763, 1893, 1350, 1353, 1625, + 1628, 1666, 1675, 1718, 787, 870, 311, 946, 947, 967, + 970, 973, 818, 819, 1821, 743, 1315, 1893, 328, 143, + 178, 475, 614, 1678, 1691, 1692, 1623, 1614, 1623, 1623, + 1623, 1623, 1623, 1623, 1623, 1623, 658, 1893, 978, 1827, + 2005, 47, 48, 80, 84, 101, 110, 131, 145, 150, + 173, 232, 236, 254, 258, 259, 289, 296, 297, 353, + 393, 436, 441, 452, 453, 607, 611, 617, 628, 634, + 665, 669, 698, 1829, 1912, 1916, 1917, 1918, 1920, 1922, + 1923, 1924, 1925, 946, 961, 1631, 471, 675, 1754, 154, + 1763, 1891, 77, 123, 130, 144, 157, 165, 246, 247, + 321, 351, 374, 444, 463, 582, 887, 932, 933, 934, + 935, 937, 940, 943, 944, 945, 955, 956, 957, 958, + 959, 980, 983, 1818, 1828, 1841, 1842, 1843, 1847, 2002, + 2010, 2011, 2012, 2032, 2033, 2034, 2035, 2037, 1893, 3, + 8, 9, 19, 20, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 40, 57, 58, 59, 60, + 68, 69, 71, 78, 79, 82, 83, 84, 85, 87, + 90, 91, 99, 102, 120, 121, 122, 124, 132, 133, + 134, 141, 150, 153, 162, 164, 166, 180, 181, 183, + 187, 192, 196, 198, 199, 200, 201, 219, 220, 221, + 223, 230, 241, 249, 250, 268, 275, 276, 278, 279, + 290, 300, 301, 302, 308, 309, 327, 328, 329, 330, + 334, 341, 349, 366, 379, 381, 382, 383, 398, 410, + 411, 466, 478, 500, 501, 546, 552, 561, 562, 585, + 593, 605, 649, 656, 663, 694, 713, 714, 715, 716, + 721, 722, 735, 737, 749, 751, 759, 768, 769, 774, + 779, 783, 784, 787, 1369, 1375, 1400, 1401, 1402, 1403, + 1407, 1418, 1422, 1423, 1424, 1425, 1426, 1427, 1428, 1432, + 1433, 1434, 1442, 1448, 1449, 1450, 1451, 1452, 1454, 1457, + 1786, 1789, 1791, 1792, 1793, 1810, 1817, 1819, 1820, 1827, + 1834, 1845, 1846, 65, 1010, 510, 250, 362, 370, 385, + 395, 396, 397, 405, 543, 555, 655, 693, 707, 913, + 915, 737, 906, 912, 1827, 860, 1623, 887, 981, 912, + 47, 333, 611, 1909, 1910, 1918, 1920, 47, 106, 264, + 266, 277, 293, 474, 679, 680, 681, 682, 1379, 1386, + 1387, 1960, 3, 71, 99, 144, 321, 366, 463, 468, + 506, 556, 577, 593, 644, 661, 687, 717, 750, 1167, + 1816, 1825, 1836, 1838, 1839, 1840, 1842, 1843, 1844, 1847, + 1851, 1861, 1872, 2001, 47, 49, 79, 80, 89, 145, + 159, 214, 226, 281, 324, 344, 353, 366, 377, 400, + 430, 433, 435, 462, 463, 468, 469, 485, 506, 528, + 582, 597, 606, 609, 610, 624, 661, 669, 690, 747, + 1167, 1201, 1703, 1707, 1708, 1710, 1719, 1818, 1862, 912, + 1893, 178, 1674, 779, 1645, 1654, 946, 2007, 1795, 1631, + 1737, 1827, 343, 1951, 1829, 1332, 1291, 50, 1952, 1400, + 1473, 800, 299, 802, 1726, 417, 1813, 1815, 1827, 1901, + 1829, 141, 1069, 1821, 128, 1296, 528, 613, 669, 1744, + 1745, 287, 1952, 746, 1760, 670, 818, 232, 314, 1281, + 1282, 1283, 670, 818, 281, 1696, 1623, 1623, 23, 26, + 27, 31, 1787, 1788, 1822, 1984, 1984, 1984, 460, 1983, + 1984, 1984, 780, 780, 786, 1827, 1069, 1069, 145, 1069, + 1069, 662, 844, 145, 145, 281, 658, 226, 289, 436, + 1965, 337, 861, 861, 1961, 111, 135, 779, 784, 1375, + 1378, 1478, 1481, 1493, 1496, 1497, 1498, 1509, 1510, 1511, + 1512, 1514, 1515, 1516, 1813, 211, 423, 1601, 1602, 1607, + 312, 1539, 1376, 123, 127, 168, 173, 206, 577, 1388, + 1564, 1569, 1570, 1579, 1580, 1584, 226, 1583, 1596, 1606, + 47, 106, 1959, 1959, 1959, 1579, 1581, 1369, 1372, 1373, + 1580, 1582, 1371, 47, 1827, 1717, 127, 1716, 787, 1355, + 1352, 42, 763, 1648, 1649, 1227, 734, 1229, 787, 542, + 709, 727, 85, 1829, 1830, 1831, 1916, 1230, 120, 1235, + 1234, 860, 281, 143, 581, 1271, 1272, 1273, 657, 436, + 743, 1965, 1829, 1302, 1827, 779, 873, 946, 968, 1400, + 114, 975, 973, 287, 1316, 1617, 1618, 1813, 128, 1679, + 128, 1679, 1680, 1681, 1688, 1689, 1827, 1691, 1827, 141, + 1622, 863, 863, 863, 1827, 860, 1829, 860, 1615, 1623, + 1623, 994, 151, 979, 606, 1921, 647, 647, 705, 708, + 735, 743, 779, 1399, 475, 584, 704, 580, 735, 89, + 743, 333, 551, 633, 333, 333, 203, 333, 371, 528, + 669, 551, 287, 203, 782, 779, 283, 427, 178, 414, + 474, 1633, 1635, 393, 613, 1755, 1756, 360, 178, 392, + 1769, 1813, 1894, 1895, 311, 1828, 128, 136, 561, 1827, + 1828, 1828, 1828, 2038, 1827, 311, 1828, 1827, 427, 2033, + 1995, 1996, 946, 960, 1827, 788, 127, 177, 241, 313, + 351, 786, 1324, 1458, 19, 20, 30, 1817, 1834, 31, + 1788, 153, 768, 769, 1425, 779, 779, 779, 311, 1400, + 1476, 1477, 779, 779, 779, 779, 779, 1399, 1399, 1399, + 779, 1398, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 779, 779, 779, 779, 1400, 779, 779, 779, 8, + 779, 1474, 1475, 1810, 1817, 779, 779, 779, 779, 1400, + 1398, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 15, 779, 779, 779, 779, 1399, 1398, 1398, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 779, 779, 779, 31, 779, 779, 779, 779, 779, + 779, 779, 779, 737, 779, 779, 779, 737, 779, 779, + 779, 779, 31, 779, 779, 779, 31, 779, 779, 779, + 779, 779, 779, 779, 779, 153, 1425, 153, 1425, 1425, + 1125, 1369, 1400, 1794, 1827, 1817, 33, 41, 50, 208, + 315, 1404, 1405, 35, 36, 37, 39, 156, 763, 764, + 765, 1408, 55, 151, 167, 238, 677, 1406, 14, 43, + 44, 107, 192, 766, 767, 768, 769, 770, 771, 772, + 773, 1425, 73, 38, 213, 213, 751, 1822, 787, 779, + 15, 1011, 54, 287, 782, 763, 1822, 1328, 1830, 1832, + 1327, 733, 1921, 584, 203, 128, 203, 1361, 1387, 3, + 1829, 258, 644, 787, 57, 99, 1168, 1169, 1648, 1829, + 127, 1648, 1648, 1917, 99, 1817, 1855, 1864, 1852, 57, + 99, 1171, 1172, 1829, 787, 1648, 1853, 782, 670, 1722, + 779, 88, 214, 226, 281, 289, 324, 436, 463, 658, + 735, 743, 167, 312, 1714, 63, 688, 376, 688, 688, + 318, 688, 435, 688, 1714, 47, 1082, 1829, 1568, 1569, + 1574, 128, 151, 1709, 1711, 376, 688, 127, 688, 704, + 676, 47, 355, 399, 401, 491, 541, 588, 678, 700, + 1697, 1698, 1699, 818, 477, 818, 1574, 1714, 1711, 510, + 429, 378, 608, 704, 720, 1722, 1393, 688, 740, 143, + 1268, 1655, 782, 422, 1797, 1798, 1805, 1827, 1634, 1635, + 1813, 2040, 782, 1333, 1334, 1335, 1336, 1813, 1617, 363, + 568, 239, 568, 1953, 782, 1400, 803, 57, 270, 416, + 430, 432, 464, 477, 510, 528, 606, 613, 623, 637, + 669, 672, 688, 719, 1727, 1732, 1733, 1818, 1893, 3, + 74, 919, 920, 921, 922, 1817, 582, 232, 374, 1406, + 1827, 798, 743, 1293, 1893, 1747, 360, 1746, 782, 653, + 1827, 1953, 127, 1284, 1285, 1284, 580, 755, 394, 782, + 1284, 1284, 1618, 1827, 1821, 782, 579, 1987, 699, 1988, + 763, 158, 639, 1986, 7, 792, 1827, 826, 1069, 860, + 860, 1069, 830, 832, 1069, 1069, 1069, 837, 838, 743, + 463, 463, 1965, 779, 1478, 1498, 1510, 1511, 1512, 1513, + 1514, 1827, 10, 1384, 81, 147, 158, 166, 193, 249, + 277, 1505, 1506, 782, 217, 1507, 1508, 31, 1823, 1823, + 3, 1603, 1604, 1605, 1827, 1829, 1540, 136, 1543, 1539, + 454, 561, 1571, 296, 8, 28, 30, 32, 251, 1575, + 1576, 1789, 1817, 151, 65, 1576, 1568, 1388, 1827, 1388, + 1389, 1389, 1372, 1718, 393, 1723, 1787, 1827, 1827, 1580, + 1583, 1821, 99, 386, 1066, 1067, 1079, 1080, 1175, 408, + 864, 1827, 1399, 3, 864, 1813, 583, 1830, 1831, 1832, + 1931, 1935, 1623, 1273, 413, 489, 863, 1813, 743, 1303, + 1304, 1618, 787, 871, 874, 875, 1400, 974, 311, 969, + 971, 887, 1998, 427, 808, 1617, 127, 364, 448, 450, + 540, 614, 782, 1319, 1320, 1321, 1813, 54, 1677, 1620, + 1621, 1814, 1827, 127, 1382, 1383, 1539, 782, 1682, 787, + 1690, 120, 1827, 787, 1915, 1918, 1832, 1930, 1617, 1616, + 1613, 422, 2009, 643, 977, 704, 780, 333, 1832, 333, + 333, 1931, 214, 226, 281, 463, 862, 1919, 353, 393, + 436, 441, 452, 453, 607, 617, 628, 634, 665, 669, + 698, 1923, 1925, 1803, 1804, 1817, 962, 141, 1268, 479, + 735, 1400, 1757, 1757, 1339, 506, 1768, 53, 763, 1535, + 1536, 1537, 572, 746, 782, 1892, 946, 311, 1827, 561, + 128, 154, 1994, 2028, 946, 311, 779, 954, 177, 786, + 936, 782, 986, 984, 989, 985, 2036, 1617, 3, 1459, + 1829, 787, 779, 47, 1467, 1538, 1467, 1467, 1400, 1477, + 114, 311, 427, 1400, 1473, 1400, 106, 1467, 1538, 780, + 24, 25, 26, 28, 30, 32, 780, 1588, 1592, 1593, + 1400, 1400, 1810, 780, 1364, 1365, 1374, 1794, 92, 93, + 94, 95, 138, 139, 140, 189, 190, 253, 316, 411, + 478, 544, 546, 552, 612, 656, 748, 759, 1532, 1533, + 1400, 106, 1460, 1460, 1447, 1400, 1400, 1400, 1532, 1400, + 1400, 1400, 1817, 1475, 336, 782, 787, 106, 1467, 1400, + 106, 1467, 1400, 1400, 1400, 1400, 1400, 780, 1403, 780, + 1400, 1400, 780, 648, 1467, 1467, 106, 1467, 780, 1588, + 1467, 1467, 780, 1400, 1400, 1429, 1430, 1431, 64, 163, + 288, 1400, 1419, 1420, 1421, 1400, 1400, 106, 1467, 1400, + 1400, 1400, 1415, 1416, 1400, 1400, 1472, 1473, 1400, 1400, + 409, 410, 713, 716, 1534, 1400, 1400, 1473, 1813, 1400, + 1400, 127, 1813, 1472, 1400, 127, 1400, 1400, 1813, 1400, + 1400, 1533, 1533, 1400, 1419, 1400, 780, 8, 787, 1811, + 1827, 1400, 1472, 1400, 1400, 1400, 780, 782, 1365, 1400, + 787, 1400, 1400, 1400, 1402, 122, 201, 290, 732, 1406, + 47, 340, 1402, 1409, 1402, 779, 1375, 1402, 1402, 167, + 55, 151, 167, 238, 1403, 1403, 1403, 1403, 1403, 1403, + 1403, 153, 1403, 153, 1403, 1403, 1403, 1403, 1403, 1173, + 1829, 1425, 779, 1456, 1549, 1827, 779, 136, 328, 329, + 330, 1817, 1435, 461, 493, 567, 648, 1417, 169, 229, + 505, 703, 1012, 1016, 1751, 1821, 915, 410, 713, 716, + 914, 1457, 1791, 1810, 782, 287, 1329, 1330, 1813, 946, + 782, 127, 1832, 1831, 1932, 862, 1919, 770, 1391, 1392, + 1394, 468, 506, 661, 1863, 1648, 1918, 1827, 73, 1400, + 1882, 1881, 1880, 787, 787, 1648, 782, 1854, 232, 492, + 1883, 1884, 1885, 1886, 1827, 1873, 99, 717, 1817, 1856, + 1868, 1858, 1859, 1861, 1872, 688, 127, 770, 1069, 63, + 863, 863, 1813, 863, 318, 863, 863, 863, 1813, 1832, + 1813, 1393, 1393, 376, 688, 1714, 863, 1714, 1709, 376, + 688, 1714, 151, 1712, 510, 553, 688, 1706, 1706, 1714, + 1827, 863, 1714, 1831, 1709, 1714, 1821, 490, 701, 451, + 127, 1700, 782, 435, 688, 1813, 1711, 1709, 1709, 127, + 1714, 1714, 1714, 1481, 1665, 1813, 1394, 1657, 1659, 779, + 1652, 2008, 782, 779, 1801, 154, 1636, 2028, 3, 151, + 782, 217, 1344, 1346, 1347, 448, 614, 1292, 363, 239, + 1400, 801, 99, 143, 804, 1400, 1660, 1661, 510, 510, + 510, 510, 360, 510, 818, 510, 782, 1393, 1728, 1829, + 914, 924, 782, 763, 1536, 1902, 120, 676, 1400, 1294, + 1617, 287, 1749, 818, 1745, 1827, 47, 1279, 627, 683, + 1286, 1287, 127, 820, 821, 673, 1283, 820, 1892, 1787, + 596, 1989, 1829, 834, 1827, 828, 1915, 1931, 1829, 1069, + 1069, 823, 1813, 2025, 1394, 1974, 848, 1394, 1069, 1069, + 1069, 743, 1494, 782, 780, 780, 780, 780, 780, 782, + 780, 1478, 47, 53, 55, 128, 1385, 1537, 158, 158, + 210, 1517, 166, 249, 1505, 1517, 1478, 1496, 779, 1384, + 1608, 1829, 782, 787, 1400, 65, 137, 1541, 1543, 251, + 649, 1572, 1576, 572, 668, 746, 1390, 1817, 439, 251, + 577, 782, 787, 664, 1565, 649, 1572, 1597, 1400, 1228, + 1649, 1067, 73, 1167, 418, 191, 231, 268, 386, 398, + 498, 568, 866, 868, 1632, 1829, 1632, 1236, 779, 480, + 242, 782, 1939, 1813, 1233, 1232, 1813, 782, 595, 1305, + 1827, 873, 780, 782, 283, 946, 971, 68, 108, 142, + 179, 481, 511, 512, 514, 515, 516, 517, 518, 520, + 521, 522, 523, 524, 525, 526, 527, 529, 530, 531, + 532, 625, 626, 809, 810, 817, 127, 1322, 734, 1618, + 1320, 1507, 703, 782, 1684, 787, 1690, 222, 1563, 1564, + 1689, 128, 770, 1827, 203, 1827, 782, 782, 67, 244, + 1274, 1617, 1617, 887, 779, 948, 951, 287, 314, 1914, + 63, 770, 1813, 1827, 1929, 1929, 780, 782, 887, 1997, + 1636, 1400, 1832, 1340, 1341, 1342, 1343, 1813, 146, 144, + 321, 463, 1818, 1824, 1833, 1838, 1839, 1840, 1841, 1842, + 1843, 1844, 1847, 2001, 178, 232, 755, 1896, 26, 769, + 1585, 1587, 1895, 941, 946, 154, 649, 1827, 97, 886, + 2029, 938, 946, 948, 949, 953, 1827, 978, 980, 981, + 2007, 2028, 1892, 1863, 42, 1817, 1400, 780, 1468, 780, + 780, 283, 427, 1400, 1400, 53, 299, 780, 299, 782, + 1443, 780, 770, 780, 782, 782, 780, 780, 1365, 128, + 780, 1445, 1446, 1400, 782, 782, 782, 769, 780, 782, + 780, 782, 782, 780, 779, 1810, 1817, 1467, 780, 780, + 1467, 780, 782, 782, 780, 780, 780, 151, 782, 782, + 780, 780, 1467, 780, 780, 780, 780, 782, 128, 782, + 780, 128, 1400, 128, 1400, 128, 1400, 128, 780, 782, + 780, 1467, 780, 780, 782, 782, 780, 782, 782, 782, + 780, 780, 780, 782, 780, 780, 782, 780, 780, 780, + 1813, 780, 780, 780, 1813, 782, 780, 782, 782, 780, + 782, 782, 782, 780, 780, 782, 1817, 1827, 780, 787, + 53, 504, 782, 1190, 780, 780, 1532, 1532, 1473, 780, + 785, 1817, 122, 201, 290, 732, 779, 50, 1400, 434, + 1402, 1402, 779, 1375, 1402, 1402, 1400, 1400, 1550, 217, + 1552, 779, 779, 779, 779, 779, 787, 1394, 1439, 1440, + 1441, 378, 779, 1021, 1022, 1014, 1021, 1015, 591, 1024, + 160, 472, 1400, 763, 1832, 1832, 782, 1892, 427, 131, + 1918, 128, 782, 1929, 1929, 782, 1400, 1808, 1817, 787, + 787, 787, 99, 144, 321, 463, 577, 750, 1818, 1821, + 1826, 1835, 1838, 1839, 1840, 1841, 1843, 1844, 1847, 2001, + 1876, 127, 1648, 99, 1173, 1174, 1832, 31, 578, 593, + 1888, 47, 57, 99, 203, 1400, 1889, 1827, 1827, 1865, + 1864, 127, 580, 755, 504, 782, 782, 1648, 1889, 787, + 1857, 787, 1648, 782, 782, 1860, 1400, 780, 1827, 863, + 863, 1821, 1400, 863, 1714, 1714, 863, 1714, 1821, 128, + 1713, 860, 1714, 613, 1574, 1699, 1712, 820, 1709, 1813, + 1714, 1714, 1400, 258, 1507, 1661, 780, 782, 1653, 887, + 1798, 1802, 1804, 53, 1637, 1638, 886, 1829, 99, 1337, + 1827, 1335, 1813, 1007, 1346, 145, 160, 1199, 1348, 802, + 782, 100, 1738, 818, 1733, 1617, 1734, 922, 925, 926, + 921, 573, 574, 650, 923, 454, 561, 1827, 1903, 1904, + 1821, 1617, 448, 614, 736, 1297, 1298, 1299, 1587, 47, + 1748, 670, 782, 365, 1278, 1695, 782, 127, 1990, 1065, + 1066, 299, 723, 1211, 1827, 314, 1913, 1939, 845, 1827, + 1827, 1813, 825, 863, 2020, 1069, 1069, 1813, 863, 1827, + 863, 1069, 1400, 1478, 1478, 785, 576, 713, 717, 1380, + 1381, 1427, 1381, 158, 1517, 1517, 1509, 158, 203, 299, + 1531, 1827, 1536, 1167, 1170, 1604, 1827, 1400, 1544, 1809, + 1542, 750, 1546, 1541, 314, 580, 1573, 1572, 507, 1587, + 1576, 1577, 439, 1576, 1576, 1817, 549, 1566, 1809, 123, + 779, 1065, 1821, 1649, 1649, 557, 268, 268, 657, 1821, + 268, 268, 268, 182, 360, 406, 484, 547, 563, 564, + 568, 569, 570, 636, 686, 841, 842, 88, 476, 586, + 593, 599, 674, 735, 846, 847, 65, 314, 742, 1933, + 270, 369, 494, 566, 695, 756, 1927, 1928, 1935, 314, + 1942, 1892, 203, 856, 1241, 779, 1967, 1231, 1304, 127, + 872, 1400, 1998, 972, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 782, + 820, 734, 1381, 1621, 1827, 299, 1827, 576, 168, 1578, + 1481, 787, 1690, 1813, 1918, 1832, 1892, 427, 898, 899, + 952, 34, 1931, 333, 787, 787, 287, 287, 1803, 963, + 1637, 782, 1344, 1346, 1823, 755, 506, 392, 24, 25, + 28, 30, 32, 942, 154, 76, 77, 144, 443, 444, + 463, 750, 892, 893, 895, 901, 928, 929, 1818, 1838, + 1839, 1840, 1841, 1842, 1843, 1844, 1847, 2001, 2003, 2014, + 2030, 427, 2033, 786, 939, 950, 780, 782, 987, 976, + 982, 1828, 982, 982, 886, 1826, 1400, 782, 1400, 1400, + 283, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 57, 58, 59, 60, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 87, 89, + 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, + 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 117, 118, 119, 120, + 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, + 132, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 177, + 178, 179, 180, 181, 182, 183, 187, 189, 190, 191, + 192, 193, 194, 196, 197, 198, 199, 200, 201, 203, + 204, 205, 206, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 259, 260, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 280, 281, 282, 283, 287, 288, 289, 290, 291, 292, + 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 328, 329, 330, 409, 410, 559, + 577, 666, 716, 739, 1131, 1469, 1470, 1471, 1818, 1837, + 1838, 1839, 1840, 1841, 1842, 1847, 1848, 1999, 2000, 2001, + 1168, 1168, 1469, 1473, 780, 153, 153, 1400, 1473, 1473, + 782, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1403, 787, + 780, 780, 1400, 1400, 1400, 1400, 1400, 780, 1400, 1400, + 1400, 1400, 128, 1400, 128, 1400, 128, 1400, 153, 1400, + 780, 1416, 1400, 1415, 1473, 1400, 1400, 1400, 1473, 28, + 768, 1585, 1589, 153, 1400, 1400, 1400, 1400, 1400, 787, + 787, 1827, 57, 71, 1185, 1186, 1187, 1188, 1189, 1588, + 1587, 780, 769, 769, 1374, 1402, 780, 782, 1402, 50, + 1400, 434, 1532, 1532, 1551, 1827, 65, 780, 1453, 1472, + 1400, 1431, 1472, 1400, 1421, 1472, 1472, 1817, 1400, 780, + 782, 779, 1030, 1403, 1022, 168, 1060, 1061, 1588, 697, + 1025, 338, 1017, 1013, 914, 287, 1330, 287, 241, 584, + 1930, 1831, 128, 128, 1392, 1395, 1395, 787, 787, 787, + 1648, 1400, 1832, 1875, 1648, 779, 779, 1648, 1648, 1889, + 793, 232, 632, 659, 1887, 1885, 1884, 1874, 1827, 1883, + 1827, 1869, 1858, 1859, 1868, 433, 747, 1585, 1590, 1704, + 30, 1713, 1539, 1709, 1670, 1671, 1811, 1382, 1395, 1394, + 1656, 1658, 1661, 427, 780, 779, 1630, 1619, 1813, 427, + 1345, 779, 1661, 763, 820, 127, 314, 1729, 1730, 763, + 782, 36, 37, 454, 499, 561, 604, 763, 764, 765, + 1905, 1907, 1539, 127, 128, 1300, 1298, 820, 1287, 1821, + 733, 1288, 1994, 2004, 1587, 545, 358, 472, 652, 1217, + 1217, 203, 1211, 333, 1942, 126, 203, 203, 824, 840, + 841, 2021, 1975, 863, 835, 2027, 641, 2026, 1813, 782, + 1381, 31, 1403, 50, 287, 1478, 1509, 158, 158, 1478, + 1509, 1499, 1500, 780, 782, 1526, 1527, 1169, 1609, 16, + 17, 782, 1545, 51, 104, 1567, 1400, 1456, 1547, 1548, + 1546, 712, 1573, 1577, 1390, 782, 1567, 1571, 1394, 1598, + 1599, 1600, 1174, 1169, 408, 408, 413, 489, 1649, 1649, + 65, 1649, 1651, 1649, 182, 547, 314, 1649, 1650, 1650, + 842, 1237, 1821, 1821, 1821, 1821, 1587, 1821, 1821, 780, + 782, 31, 593, 1829, 1936, 1937, 31, 31, 31, 50, + 1926, 533, 534, 537, 538, 539, 1940, 1941, 331, 593, + 1240, 1226, 390, 654, 240, 1242, 1827, 1968, 53, 1967, + 47, 378, 1306, 873, 283, 779, 779, 1587, 779, 1587, + 1587, 1821, 1821, 1590, 1821, 1587, 1821, 1821, 1821, 1821, + 1821, 1821, 1821, 1587, 1821, 404, 568, 671, 1792, 122, + 290, 1587, 1595, 1821, 1587, 810, 787, 1481, 1690, 1393, + 251, 1576, 245, 1686, 1539, 1892, 1274, 127, 900, 780, + 1400, 951, 314, 1944, 584, 770, 770, 1931, 1931, 113, + 114, 115, 964, 1627, 1342, 1813, 1346, 143, 1349, 1764, + 56, 57, 61, 62, 71, 96, 109, 125, 153, 155, + 174, 175, 176, 184, 185, 186, 202, 234, 258, 261, + 284, 285, 286, 306, 307, 354, 356, 357, 373, 409, + 410, 431, 455, 496, 558, 559, 574, 575, 616, 649, + 710, 713, 716, 723, 739, 759, 1129, 1131, 1132, 1133, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1144, + 470, 74, 86, 782, 786, 1400, 949, 2009, 427, 787, + 1400, 1400, 779, 1150, 1151, 1153, 1153, 779, 1146, 1147, + 1151, 779, 1147, 1155, 95, 155, 1151, 1150, 1152, 1154, + 1153, 155, 1154, 1151, 780, 780, 780, 780, 1444, 1400, + 1400, 780, 206, 1462, 1462, 1400, 782, 782, 780, 782, + 780, 780, 780, 151, 1436, 1437, 1817, 780, 780, 780, + 780, 780, 782, 127, 782, 1400, 1400, 1400, 1400, 780, + 780, 53, 1410, 780, 53, 780, 780, 780, 28, 30, + 30, 780, 782, 1400, 780, 780, 782, 782, 780, 1817, + 1827, 787, 779, 1180, 1180, 51, 104, 643, 768, 1182, + 1183, 1184, 782, 782, 1400, 1400, 780, 1473, 1402, 780, + 782, 1402, 1552, 1544, 206, 1455, 780, 780, 780, 780, + 780, 780, 779, 1395, 1441, 1018, 1019, 1020, 1827, 780, + 1590, 153, 65, 779, 1032, 763, 779, 1022, 1832, 1813, + 128, 1932, 1932, 53, 1396, 1821, 1827, 770, 1817, 1827, + 1827, 1877, 1889, 1888, 31, 31, 1867, 1866, 387, 726, + 232, 1889, 1648, 1648, 1889, 24, 25, 28, 30, 32, + 1574, 1705, 1714, 782, 1668, 1648, 1536, 1661, 780, 782, + 313, 1364, 11, 12, 258, 1002, 1364, 1639, 1641, 1644, + 1507, 779, 225, 1528, 1529, 1530, 1827, 779, 1731, 232, + 250, 362, 370, 385, 395, 396, 397, 405, 543, 555, + 640, 655, 693, 707, 927, 926, 1906, 1574, 734, 554, + 513, 817, 1289, 1813, 203, 1831, 1240, 408, 1813, 1813, + 11, 13, 18, 145, 167, 215, 272, 273, 274, 292, + 346, 348, 368, 386, 393, 408, 415, 430, 487, 497, + 535, 548, 587, 593, 651, 658, 690, 705, 706, 718, + 998, 1000, 1071, 1073, 1074, 1076, 1078, 1079, 1080, 1087, + 1818, 1071, 779, 883, 863, 849, 1967, 779, 885, 96, + 155, 234, 692, 1085, 885, 836, 1495, 1381, 1381, 203, + 1502, 1509, 1509, 203, 1504, 1400, 779, 1007, 1827, 1524, + 1525, 378, 1771, 1809, 53, 782, 1809, 1572, 1576, 1400, + 780, 782, 1589, 1589, 1589, 1589, 1589, 1589, 1632, 847, + 31, 53, 299, 1934, 1938, 208, 1927, 1587, 1587, 1587, + 1792, 768, 1585, 1586, 1940, 173, 294, 1238, 446, 46, + 48, 49, 70, 72, 78, 110, 173, 204, 206, 217, + 240, 338, 375, 419, 420, 426, 438, 459, 483, 550, + 618, 629, 630, 631, 722, 1005, 1072, 1074, 1245, 1250, + 1252, 1255, 1261, 1262, 1263, 1265, 1266, 1560, 1406, 1950, + 342, 437, 850, 287, 419, 426, 852, 780, 782, 1969, + 1970, 53, 47, 779, 1307, 1998, 813, 814, 1587, 815, + 816, 1587, 811, 812, 1587, 1827, 1539, 1827, 439, 251, + 1687, 1683, 1350, 1794, 131, 1939, 1939, 961, 1997, 961, + 1639, 1349, 502, 143, 328, 1770, 1153, 1153, 391, 1151, + 1159, 1161, 1146, 224, 1146, 1159, 57, 71, 73, 306, + 341, 359, 730, 1134, 1139, 1141, 1161, 1167, 1176, 1178, + 1134, 1159, 1134, 1146, 779, 1159, 1134, 1153, 1153, 1134, + 1153, 779, 1146, 1159, 71, 307, 307, 310, 1146, 1153, + 723, 779, 891, 1153, 1153, 1153, 576, 1153, 1153, 894, + 1146, 310, 1153, 1153, 1153, 1153, 1153, 1155, 127, 127, + 2031, 1827, 988, 976, 1827, 24, 28, 30, 32, 1177, + 1178, 30, 30, 1152, 1177, 1177, 780, 1532, 1532, 65, + 256, 1461, 168, 1464, 1465, 780, 1400, 1400, 1473, 193, + 357, 780, 314, 1438, 1400, 1400, 1400, 1532, 96, 109, + 125, 155, 234, 295, 409, 410, 558, 559, 716, 1139, + 1140, 1411, 1412, 1413, 1414, 1469, 1595, 1532, 1400, 1400, + 1827, 1588, 780, 1190, 1185, 1183, 1185, 1186, 1587, 780, + 1473, 206, 1553, 65, 780, 1472, 1396, 780, 782, 347, + 1063, 1400, 1016, 217, 1033, 1034, 1035, 1588, 1018, 1932, + 1821, 1827, 787, 1648, 1648, 1889, 780, 780, 1889, 1889, + 1871, 1870, 1574, 1671, 1539, 99, 1660, 1526, 1395, 1661, + 780, 1642, 1643, 1806, 1807, 1811, 1827, 1794, 1640, 1686, + 1644, 47, 1251, 1259, 1260, 1827, 780, 782, 1590, 1739, + 1740, 447, 173, 779, 763, 782, 827, 1813, 754, 831, + 833, 75, 594, 787, 1088, 1089, 1090, 1091, 1099, 1100, + 1105, 1106, 1107, 1199, 1202, 1203, 1812, 1827, 167, 741, + 418, 1813, 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 418, 1649, 1649, 1649, 1649, 1649, 1649, 1649, + 1649, 1649, 1649, 421, 541, 1827, 1649, 1649, 1003, 1004, + 1005, 782, 1073, 999, 1648, 884, 865, 54, 335, 996, + 203, 53, 876, 877, 641, 676, 641, 1967, 22, 29, + 31, 1479, 1501, 299, 1503, 299, 1531, 143, 298, 459, + 1519, 1520, 1523, 117, 118, 205, 282, 1772, 1773, 170, + 1774, 1567, 1549, 1548, 1567, 1573, 1572, 1395, 1600, 593, + 1821, 1936, 30, 30, 593, 99, 153, 560, 1239, 75, + 217, 384, 594, 702, 1091, 1099, 1100, 1267, 1199, 1267, + 217, 1267, 217, 217, 281, 287, 75, 126, 217, 594, + 702, 1104, 1199, 1267, 1649, 217, 65, 1007, 53, 287, + 384, 763, 1199, 1276, 1649, 217, 159, 705, 159, 217, + 705, 1267, 217, 592, 217, 217, 217, 1072, 782, 1004, + 1250, 779, 1090, 603, 1400, 1400, 203, 856, 863, 203, + 386, 857, 1827, 1632, 1364, 1969, 1308, 485, 780, 782, + 780, 782, 780, 782, 1685, 128, 439, 1391, 1632, 584, + 314, 1943, 1943, 203, 1662, 154, 1159, 1158, 1648, 1159, + 295, 317, 666, 1148, 1149, 1149, 1176, 99, 1173, 1159, + 1134, 1177, 1168, 57, 73, 391, 1162, 1149, 1223, 1787, + 1159, 1223, 1149, 310, 1149, 1159, 576, 889, 890, 1827, + 2006, 99, 1994, 2013, 1134, 888, 928, 1134, 1149, 2013, + 237, 1145, 1177, 57, 1179, 1134, 1159, 1149, 1149, 896, + 904, 905, 1587, 779, 897, 982, 780, 780, 780, 780, + 782, 780, 780, 1463, 1809, 1787, 1464, 1466, 1575, 780, + 780, 782, 780, 498, 549, 613, 780, 780, 1146, 155, + 1154, 71, 1154, 1177, 780, 780, 782, 780, 780, 780, + 1181, 780, 782, 780, 65, 229, 251, 1554, 1555, 1809, + 780, 1020, 1532, 160, 472, 780, 782, 1036, 780, 770, + 1879, 1878, 1889, 1889, 820, 1563, 406, 1799, 780, 782, + 787, 1365, 1646, 1647, 1811, 1632, 780, 782, 1529, 780, + 782, 50, 1741, 1658, 1821, 817, 779, 829, 1829, 779, + 779, 1222, 1812, 10, 127, 1101, 1827, 780, 782, 72, + 126, 225, 293, 1103, 1198, 1105, 1069, 1199, 1200, 1200, + 1108, 787, 1813, 1649, 99, 1587, 1594, 99, 1587, 99, + 1587, 99, 1587, 1075, 1590, 1587, 1587, 1821, 1821, 1649, + 1587, 1829, 454, 499, 568, 1084, 1587, 1590, 1590, 99, + 1587, 1821, 99, 389, 391, 425, 455, 588, 622, 1083, + 1594, 1587, 1594, 1001, 1770, 1073, 1071, 26, 28, 30, + 32, 99, 1591, 1592, 1821, 1827, 148, 151, 212, 879, + 880, 881, 882, 1827, 2015, 2016, 2017, 866, 867, 1950, + 2022, 101, 150, 296, 997, 654, 1969, 780, 878, 2016, + 1980, 1981, 1821, 1980, 53, 31, 378, 1482, 1400, 779, + 1400, 779, 780, 1199, 1199, 1520, 65, 65, 117, 65, + 1773, 271, 282, 1775, 1776, 1573, 779, 446, 30, 331, + 141, 1069, 141, 1068, 741, 1068, 1622, 1622, 1325, 1622, + 1251, 1260, 1813, 1167, 1622, 160, 1623, 10, 1622, 741, + 225, 1622, 1622, 99, 1827, 1325, 1561, 1562, 1811, 1006, + 1622, 1622, 1813, 99, 1827, 1325, 1260, 1622, 1325, 1325, + 1325, 1251, 46, 78, 110, 1263, 1086, 1088, 335, 454, + 1275, 1532, 669, 1821, 422, 1243, 314, 1971, 1632, 1311, + 1827, 47, 779, 1309, 814, 816, 812, 1632, 1403, 131, + 1940, 1945, 1946, 424, 1686, 281, 1827, 317, 295, 99, + 1173, 1158, 780, 782, 780, 888, 780, 782, 1129, 1400, + 2013, 787, 763, 1179, 209, 265, 269, 902, 903, 904, + 907, 1406, 1827, 878, 127, 30, 782, 1567, 780, 1400, + 549, 445, 1590, 780, 1587, 1566, 780, 55, 403, 410, + 713, 716, 725, 1556, 1557, 1791, 1567, 685, 1062, 1017, + 779, 1023, 1035, 1037, 1827, 1889, 1889, 1578, 1800, 1806, + 770, 1827, 780, 782, 1648, 1260, 1740, 419, 780, 1219, + 1221, 1827, 779, 583, 1219, 1219, 779, 1827, 1089, 779, + 160, 160, 1200, 1069, 236, 1192, 1222, 1827, 1069, 1069, + 144, 354, 356, 357, 373, 409, 410, 431, 455, 496, + 558, 559, 574, 575, 616, 660, 710, 713, 716, 739, + 759, 928, 1109, 1130, 1132, 1818, 1838, 1839, 1840, 1841, + 1842, 1847, 2001, 1827, 780, 1821, 779, 1821, 53, 1064, + 1003, 780, 782, 879, 649, 723, 1129, 105, 2033, 203, + 850, 782, 865, 2018, 1129, 2018, 1969, 779, 780, 1531, + 1531, 127, 1518, 1518, 1787, 1787, 65, 1787, 65, 65, + 1776, 31, 1239, 411, 1238, 1406, 1325, 1406, 1101, 1827, + 1812, 1251, 1812, 1247, 287, 1249, 1169, 1812, 1622, 1259, + 127, 160, 1812, 1812, 1251, 782, 1567, 1010, 1827, 1812, + 1588, 314, 1107, 1251, 1256, 1251, 780, 1827, 851, 858, + 859, 72, 361, 506, 780, 782, 1310, 287, 584, 1946, + 1663, 1632, 1813, 1177, 1787, 1177, 2013, 889, 1827, 30, + 782, 2033, 461, 780, 899, 780, 1809, 780, 780, 780, + 725, 1557, 1558, 1791, 649, 601, 440, 1559, 601, 1791, + 1063, 779, 1030, 1026, 99, 303, 304, 403, 475, 1038, + 1669, 1804, 787, 1647, 1661, 367, 780, 782, 1567, 779, + 1219, 779, 780, 780, 1827, 779, 1400, 1069, 1222, 1827, + 1813, 299, 1210, 723, 1222, 1222, 1111, 787, 1102, 1103, + 1110, 787, 1734, 1002, 1001, 2016, 723, 891, 576, 6, + 843, 1394, 855, 856, 2016, 2019, 195, 1483, 1484, 1827, + 1536, 780, 780, 136, 158, 206, 1522, 1521, 1787, 1787, + 1787, 780, 120, 1253, 120, 144, 196, 1218, 110, 258, + 1107, 1319, 281, 287, 73, 1812, 1827, 1274, 1246, 1562, + 287, 287, 281, 1275, 1257, 1259, 1248, 685, 853, 2033, + 584, 72, 72, 1827, 225, 1312, 1313, 1827, 1403, 160, + 1507, 787, 903, 1567, 458, 50, 458, 136, 403, 568, + 712, 1028, 1029, 1827, 780, 696, 1031, 1040, 711, 145, + 386, 393, 408, 535, 548, 565, 705, 1054, 1055, 1056, + 1059, 1076, 1708, 1632, 244, 770, 1892, 1221, 30, 782, + 1220, 846, 1892, 1892, 782, 1827, 780, 1222, 1210, 723, + 779, 1193, 1217, 1092, 1217, 1094, 1095, 18, 225, 293, + 386, 495, 752, 1076, 1112, 1113, 1122, 1164, 1165, 1166, + 1191, 1406, 1132, 73, 99, 201, 203, 346, 465, 660, + 1116, 1118, 1156, 1157, 1165, 1827, 780, 1077, 1078, 576, + 1827, 1976, 852, 2032, 218, 780, 782, 1485, 65, 65, + 779, 779, 1812, 591, 779, 1254, 144, 99, 99, 1275, + 1813, 217, 1174, 1325, 1827, 1812, 1813, 1258, 1297, 1400, + 428, 854, 843, 584, 584, 780, 782, 296, 1765, 1827, + 1558, 649, 209, 323, 780, 782, 1588, 779, 1042, 1044, + 1039, 418, 1649, 1649, 418, 1649, 1649, 1649, 1649, 779, + 1049, 1056, 430, 299, 386, 497, 723, 744, 1076, 1204, + 1207, 1212, 1213, 1214, 1218, 1567, 780, 1827, 780, 780, + 314, 1205, 1209, 1213, 1216, 1206, 1208, 1213, 1215, 1827, + 782, 1098, 1096, 1217, 1194, 1827, 180, 1195, 779, 1093, + 779, 779, 160, 1821, 702, 1165, 741, 160, 201, 1173, + 19, 20, 768, 769, 779, 1126, 1127, 1128, 1375, 1422, + 1790, 296, 339, 99, 53, 391, 1157, 1163, 1827, 787, + 1813, 857, 843, 1479, 1484, 127, 1133, 1135, 1136, 1137, + 1487, 1488, 1528, 1530, 1103, 1588, 1033, 1128, 1007, 1035, + 1007, 154, 1400, 1313, 1664, 1170, 1027, 1029, 779, 1043, + 1044, 1045, 182, 1041, 1044, 1649, 1821, 1821, 1649, 1591, + 1591, 1588, 1829, 697, 1050, 1051, 1649, 1217, 1821, 1649, + 1217, 1264, 1265, 1266, 1214, 752, 1892, 589, 1264, 1216, + 1264, 1215, 780, 1827, 779, 779, 1097, 780, 782, 462, + 590, 667, 203, 1196, 1219, 779, 1219, 1219, 426, 1160, + 1792, 1792, 1125, 198, 737, 649, 1126, 1158, 1156, 787, + 1827, 127, 422, 1486, 207, 120, 218, 780, 780, 780, + 779, 1672, 1673, 1811, 1766, 1031, 780, 782, 182, 1047, + 1048, 1403, 1821, 1821, 1052, 780, 782, 1081, 1829, 1587, + 1266, 1265, 585, 1204, 1818, 780, 1219, 1219, 779, 1827, + 101, 296, 780, 1219, 780, 780, 780, 779, 1397, 427, + 686, 1117, 1827, 787, 1394, 858, 1482, 218, 1479, 1033, + 782, 1648, 251, 1777, 1044, 782, 1046, 1053, 1829, 1051, + 1264, 780, 1220, 1219, 67, 244, 258, 568, 1197, 1197, + 1204, 780, 1205, 1206, 780, 1588, 1114, 1115, 1164, 1114, + 595, 691, 745, 1119, 1827, 1977, 1479, 99, 201, 432, + 1489, 1490, 1491, 1492, 780, 1673, 1661, 480, 1771, 1048, + 780, 1057, 1058, 1059, 1192, 780, 1220, 99, 201, 332, + 203, 203, 1204, 780, 1164, 1120, 1121, 1122, 112, 24, + 25, 28, 30, 1479, 1480, 203, 1490, 1492, 1490, 1491, + 65, 1774, 1059, 1204, 780, 296, 101, 1122, 649, 116, + 432, 203, 203, 1787, 143, 1778, 1204, 1197, 1197, 1978, + 30, 779, 1780, 457, 600, 1972, 1973, 170, 251, 1779, + 3, 780, 1781, 1782, 1811, 258, 1783, 1829, 1979, 1829, + 780, 782, 1784, 1785, 1811, 1632, 2033, 1782, 782, 1648, + 843, 1785, 1394, 1661, 1395 +}; + +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_int16 yyr1[] = +{ + 0, 789, 790, 791, 790, 790, 792, 792, 793, 793, + 793, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 794, + 794, 795, 796, 796, 798, 797, 799, 800, 801, 799, + 802, 803, 802, 804, 804, 806, 805, 808, 807, 809, + 809, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 811, 811, 811, 812, 813, 813, 813, 814, 815, + 815, 815, 816, 817, 817, 817, 817, 817, 817, 817, + 817, 818, 818, 819, 820, 820, 821, 823, 824, 822, + 825, 822, 826, 827, 822, 828, 829, 822, 830, 831, + 822, 832, 833, 822, 834, 822, 835, 822, 836, 822, + 837, 822, 838, 822, 822, 822, 839, 822, 822, 840, + 840, 841, 841, 842, 842, 842, 842, 842, 842, 842, + 842, 842, 842, 842, 842, 842, 842, 843, 843, 845, + 844, 846, 846, 847, 847, 847, 847, 847, 847, 847, + 849, 848, 851, 850, 850, 852, 852, 852, 852, 853, + 853, 854, 854, 855, 855, 856, 857, 857, 859, 858, + 860, 861, 861, 862, 862, 862, 862, 863, 863, 864, + 864, 865, 865, 866, 866, 866, 866, 866, 866, 866, + 867, 867, 868, 868, 870, 869, 871, 869, 872, 869, + 873, 873, 874, 874, 875, 875, 876, 877, 876, 878, + 878, 879, 880, 880, 881, 881, 882, 882, 882, 884, + 883, 885, 886, 886, 887, 887, 888, 888, 888, 889, + 890, 890, 891, 892, 894, 893, 893, 893, 896, 895, + 897, 897, 898, 900, 899, 901, 901, 901, 901, 902, + 902, 903, 904, 904, 905, 906, 906, 907, 907, 907, + 907, 907, 907, 908, 908, 909, 910, 910, 911, 911, + 912, 912, 913, 913, 914, 914, 914, 915, 915, 915, + 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, + 916, 917, 918, 918, 919, 919, 920, 920, 921, 922, + 922, 923, 923, 923, 924, 925, 925, 926, 927, 927, + 927, 927, 927, 927, 927, 927, 927, 927, 927, 927, + 927, 927, 928, 928, 929, 929, 931, 930, 933, 932, + 934, 934, 936, 935, 935, 937, 937, 938, 937, 939, + 937, 940, 940, 941, 940, 942, 940, 943, 944, 945, + 947, 946, 948, 950, 949, 952, 951, 953, 953, 954, + 954, 955, 955, 955, 956, 957, 957, 957, 958, 958, + 959, 960, 960, 962, 963, 961, 964, 964, 964, 964, + 966, 965, 968, 967, 967, 969, 969, 970, 970, 972, + 971, 974, 973, 975, 975, 976, 976, 977, 977, 978, + 979, 979, 979, 980, 981, 982, 984, 983, 985, 983, + 986, 987, 988, 983, 989, 983, 991, 990, 992, 990, + 993, 994, 990, 995, 990, 996, 996, 997, 997, 997, + 999, 998, 998, 998, 1000, 1000, 1001, 1001, 1002, 1002, + 1003, 1004, 1004, 1006, 1005, 1007, 1009, 1008, 1011, 1010, + 1012, 1013, 1012, 1012, 1012, 1014, 1012, 1012, 1015, 1012, + 1016, 1016, 1017, 1017, 1018, 1018, 1019, 1019, 1020, 1021, + 1022, 1023, 1024, 1024, 1025, 1026, 1025, 1027, 1025, 1028, + 1028, 1029, 1030, 1031, 1031, 1032, 1032, 1033, 1033, 1034, + 1034, 1036, 1035, 1037, 1038, 1039, 1038, 1040, 1038, 1038, + 1038, 1038, 1041, 1041, 1042, 1042, 1043, 1043, 1045, 1046, + 1044, 1047, 1047, 1048, 1048, 1049, 1049, 1050, 1050, 1052, + 1051, 1053, 1054, 1054, 1055, 1055, 1056, 1056, 1057, 1057, + 1058, 1058, 1059, 1059, 1059, 1059, 1059, 1059, 1059, 1059, + 1059, 1060, 1061, 1060, 1060, 1062, 1062, 1063, 1063, 1064, + 1064, 1065, 1065, 1066, 1066, 1067, 1067, 1067, 1068, 1068, + 1069, 1069, 1070, 1070, 1071, 1071, 1072, 1072, 1073, 1073, + 1073, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, + 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, + 1074, 1075, 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1074, + 1074, 1074, 1074, 1074, 1074, 1074, 1074, 1076, 1076, 1076, + 1076, 1077, 1077, 1078, 1079, 1080, 1081, 1082, 1083, 1083, + 1083, 1083, 1083, 1083, 1083, 1084, 1084, 1084, 1085, 1085, + 1085, 1085, 1086, 1087, 1088, 1088, 1089, 1089, 1089, 1089, + 1089, 1090, 1090, 1092, 1091, 1093, 1091, 1094, 1091, 1095, + 1091, 1096, 1091, 1097, 1091, 1098, 1091, 1099, 1100, 1101, + 1102, 1102, 1103, 1104, 1104, 1105, 1105, 1106, 1108, 1107, + 1110, 1109, 1111, 1109, 1112, 1112, 1113, 1113, 1114, 1114, + 1115, 1115, 1116, 1116, 1116, 1116, 1117, 1116, 1116, 1116, + 1118, 1118, 1119, 1119, 1119, 1119, 1120, 1120, 1121, 1121, + 1122, 1122, 1122, 1122, 1124, 1123, 1125, 1125, 1126, 1126, + 1127, 1127, 1128, 1128, 1129, 1130, 1130, 1131, 1131, 1131, + 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1133, 1133, 1133, + 1133, 1133, 1133, 1133, 1133, 1133, 1134, 1134, 1134, 1134, + 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1135, 1136, 1136, + 1136, 1136, 1136, 1137, 1137, 1137, 1137, 1137, 1137, 1137, + 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1137, 1138, 1138, + 1139, 1140, 1140, 1141, 1141, 1142, 1142, 1142, 1142, 1142, + 1143, 1143, 1143, 1143, 1143, 1144, 1144, 1144, 1145, 1145, + 1146, 1146, 1146, 1147, 1148, 1148, 1148, 1148, 1148, 1148, + 1149, 1150, 1150, 1150, 1150, 1151, 1152, 1153, 1153, 1154, + 1154, 1155, 1155, 1156, 1156, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, 1158, 1158, 1159, 1159, 1160, 1160, 1161, 1162, + 1163, 1164, 1164, 1164, 1165, 1165, 1165, 1166, 1166, 1167, + 1167, 1168, 1168, 1169, 1169, 1170, 1170, 1171, 1171, 1172, + 1172, 1173, 1174, 1174, 1175, 1175, 1176, 1176, 1176, 1177, + 1177, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, + 1179, 1179, 1181, 1180, 1182, 1182, 1183, 1184, 1184, 1184, + 1184, 1185, 1186, 1187, 1187, 1188, 1189, 1189, 1190, 1190, + 1191, 1191, 1192, 1193, 1193, 1194, 1194, 1195, 1195, 1195, + 1195, 1196, 1196, 1196, 1196, 1196, 1197, 1197, 1197, 1197, + 1197, 1198, 1198, 1199, 1199, 1200, 1200, 1201, 1201, 1201, + 1202, 1203, 1204, 1204, 1205, 1205, 1206, 1206, 1207, 1207, + 1208, 1208, 1209, 1209, 1210, 1210, 1211, 1211, 1211, 1212, + 1212, 1213, 1213, 1213, 1213, 1213, 1214, 1214, 1215, 1216, + 1216, 1217, 1217, 1217, 1218, 1218, 1219, 1219, 1220, 1220, + 1221, 1221, 1222, 1222, 1223, 1223, 1225, 1226, 1224, 1227, + 1224, 1228, 1224, 1224, 1229, 1224, 1230, 1224, 1231, 1224, + 1232, 1224, 1233, 1224, 1234, 1224, 1224, 1235, 1236, 1237, + 1224, 1238, 1238, 1239, 1239, 1239, 1239, 1240, 1240, 1240, + 1240, 1240, 1241, 1241, 1241, 1241, 1242, 1242, 1243, 1243, + 1244, 1244, 1245, 1245, 1245, 1245, 1245, 1245, 1245, 1245, + 1245, 1245, 1246, 1245, 1245, 1247, 1245, 1248, 1245, 1245, + 1245, 1245, 1245, 1245, 1249, 1245, 1250, 1251, 1251, 1253, + 1252, 1254, 1254, 1254, 1256, 1255, 1257, 1258, 1257, 1259, + 1259, 1260, 1261, 1261, 1262, 1263, 1263, 1263, 1263, 1263, + 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, + 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, + 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1264, 1264, + 1264, 1264, 1264, 1265, 1265, 1266, 1266, 1267, 1267, 1268, + 1268, 1270, 1269, 1271, 1271, 1272, 1272, 1273, 1273, 1274, + 1274, 1274, 1275, 1275, 1275, 1276, 1276, 1276, 1276, 1278, + 1277, 1279, 1277, 1277, 1277, 1280, 1281, 1281, 1282, 1282, + 1283, 1283, 1283, 1285, 1284, 1286, 1286, 1287, 1287, 1287, + 1288, 1288, 1288, 1289, 1289, 1291, 1290, 1292, 1292, 1292, + 1293, 1294, 1293, 1296, 1295, 1297, 1297, 1298, 1298, 1299, + 1299, 1299, 1300, 1300, 1300, 1302, 1301, 1303, 1303, 1304, + 1305, 1305, 1306, 1306, 1307, 1308, 1307, 1309, 1310, 1309, + 1311, 1311, 1311, 1312, 1312, 1312, 1313, 1313, 1314, 1314, + 1315, 1316, 1315, 1318, 1317, 1319, 1319, 1320, 1320, 1321, + 1321, 1321, 1321, 1321, 1321, 1322, 1322, 1324, 1323, 1325, + 1325, 1325, 1327, 1326, 1326, 1328, 1328, 1329, 1329, 1330, + 1332, 1331, 1333, 1333, 1334, 1334, 1335, 1336, 1337, 1337, + 1339, 1338, 1340, 1340, 1341, 1341, 1342, 1343, 1345, 1344, + 1347, 1346, 1348, 1348, 1349, 1349, 1351, 1350, 1352, 1350, + 1354, 1353, 1355, 1353, 1356, 1356, 1358, 1357, 1360, 1361, + 1359, 1362, 1363, 1364, 1364, 1365, 1365, 1367, 1366, 1368, + 1366, 1369, 1369, 1370, 1371, 1370, 1370, 1372, 1372, 1373, + 1374, 1375, 1375, 1376, 1376, 1377, 1378, 1378, 1379, 1379, + 1380, 1380, 1380, 1381, 1381, 1381, 1382, 1383, 1383, 1384, + 1384, 1385, 1385, 1385, 1385, 1386, 1386, 1387, 1387, 1387, + 1388, 1388, 1389, 1389, 1390, 1390, 1390, 1390, 1391, 1391, + 1391, 1392, 1392, 1393, 1394, 1395, 1396, 1396, 1396, 1396, + 1396, 1397, 1397, 1397, 1398, 1398, 1398, 1399, 1399, 1400, + 1400, 1400, 1400, 1400, 1401, 1401, 1401, 1401, 1401, 1401, + 1401, 1401, 1401, 1401, 1401, 1401, 1402, 1402, 1402, 1402, + 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, + 1402, 1402, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, 1403, + 1403, 1404, 1404, 1405, 1405, 1406, 1406, 1407, 1407, 1408, + 1408, 1408, 1408, 1408, 1408, 1409, 1409, 1410, 1410, 1411, + 1411, 1411, 1412, 1412, 1412, 1412, 1412, 1412, 1413, 1413, + 1413, 1414, 1414, 1415, 1416, 1416, 1417, 1417, 1417, 1417, + 1418, 1419, 1419, 1420, 1421, 1421, 1421, 1421, 1421, 1421, + 1421, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, 1422, + 1423, 1423, 1423, 1423, 1424, 1424, 1425, 1425, 1425, 1425, + 1425, 1425, 1426, 1426, 1427, 1427, 1428, 1428, 1428, 1428, + 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1428, + 1428, 1428, 1428, 1428, 1428, 1428, 1428, 1429, 1429, 1430, + 1430, 1431, 1431, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1433, + 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, 1433, + 1433, 1433, 1433, 1435, 1434, 1434, 1434, 1434, 1434, 1434, + 1434, 1434, 1434, 1434, 1434, 1436, 1436, 1437, 1437, 1438, + 1438, 1439, 1439, 1440, 1440, 1441, 1442, 1442, 1442, 1442, + 1442, 1442, 1442, 1443, 1444, 1442, 1442, 1442, 1442, 1442, + 1442, 1442, 1442, 1442, 1442, 1442, 1445, 1442, 1446, 1442, + 1447, 1442, 1448, 1448, 1449, 1449, 1449, 1450, 1450, 1450, + 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, 1450, + 1451, 1453, 1452, 1452, 1454, 1454, 1455, 1456, 1458, 1457, + 1459, 1459, 1459, 1459, 1460, 1460, 1461, 1461, 1462, 1462, + 1463, 1463, 1464, 1464, 1465, 1466, 1468, 1467, 1469, 1469, + 1469, 1469, 1469, 1469, 1469, 1469, 1470, 1470, 1470, 1470, + 1470, 1470, 1470, 1470, 1471, 1471, 1471, 1471, 1472, 1472, + 1473, 1473, 1474, 1474, 1475, 1475, 1476, 1476, 1477, 1477, + 1478, 1478, 1479, 1479, 1479, 1480, 1480, 1480, 1480, 1480, + 1481, 1482, 1483, 1483, 1485, 1484, 1486, 1484, 1487, 1487, + 1487, 1488, 1488, 1488, 1488, 1489, 1489, 1489, 1489, 1489, + 1490, 1490, 1490, 1491, 1492, 1494, 1495, 1493, 1496, 1496, + 1497, 1497, 1498, 1499, 1498, 1500, 1498, 1498, 1501, 1498, + 1502, 1498, 1498, 1503, 1498, 1504, 1498, 1498, 1505, 1505, + 1505, 1506, 1506, 1507, 1507, 1508, 1509, 1509, 1509, 1509, + 1509, 1510, 1510, 1511, 1511, 1512, 1512, 1513, 1513, 1514, + 1514, 1515, 1516, 1517, 1517, 1518, 1518, 1518, 1518, 1519, + 1519, 1521, 1520, 1522, 1520, 1523, 1523, 1524, 1525, 1524, + 1527, 1526, 1528, 1528, 1529, 1529, 1530, 1530, 1531, 1531, + 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, 1532, + 1532, 1532, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1533, + 1533, 1534, 1534, 1534, 1534, 1535, 1535, 1535, 1536, 1536, + 1537, 1538, 1538, 1539, 1540, 1539, 1541, 1542, 1541, 1543, + 1543, 1544, 1544, 1545, 1545, 1545, 1546, 1546, 1547, 1547, + 1548, 1550, 1549, 1551, 1551, 1552, 1552, 1553, 1553, 1554, + 1554, 1555, 1555, 1556, 1556, 1557, 1557, 1557, 1558, 1558, + 1558, 1559, 1559, 1559, 1559, 1559, 1559, 1560, 1561, 1561, + 1562, 1563, 1563, 1565, 1564, 1566, 1566, 1567, 1567, 1567, + 1568, 1568, 1569, 1569, 1569, 1569, 1570, 1570, 1570, 1570, + 1570, 1571, 1571, 1572, 1572, 1573, 1573, 1574, 1575, 1575, + 1575, 1576, 1576, 1576, 1576, 1576, 1576, 1577, 1578, 1578, + 1578, 1578, 1579, 1579, 1579, 1580, 1580, 1581, 1582, 1583, + 1583, 1583, 1584, 1584, 1585, 1585, 1586, 1586, 1587, 1587, + 1587, 1587, 1587, 1587, 1588, 1588, 1588, 1588, 1588, 1589, + 1589, 1589, 1589, 1590, 1590, 1590, 1590, 1590, 1591, 1591, + 1591, 1591, 1591, 1592, 1593, 1593, 1594, 1594, 1595, 1595, + 1595, 1597, 1596, 1598, 1598, 1599, 1599, 1600, 1602, 1601, + 1603, 1603, 1604, 1605, 1605, 1605, 1606, 1608, 1609, 1607, + 1607, 1607, 1611, 1610, 1613, 1612, 1614, 1612, 1612, 1612, + 1612, 1615, 1612, 1612, 1612, 1612, 1616, 1612, 1612, 1617, + 1617, 1618, 1619, 1620, 1620, 1621, 1622, 1622, 1623, 1623, + 1624, 1624, 1626, 1627, 1625, 1629, 1630, 1628, 1631, 1632, + 1633, 1633, 1633, 1634, 1634, 1635, 1635, 1636, 1636, 1638, + 1637, 1639, 1639, 1640, 1639, 1641, 1642, 1642, 1643, 1643, + 1644, 1645, 1645, 1646, 1646, 1647, 1648, 1648, 1649, 1649, + 1650, 1650, 1651, 1651, 1653, 1652, 1655, 1654, 1656, 1656, + 1657, 1657, 1658, 1658, 1659, 1659, 1660, 1660, 1661, 1661, + 1662, 1663, 1664, 1662, 1665, 1665, 1667, 1668, 1669, 1666, + 1670, 1670, 1671, 1671, 1672, 1672, 1673, 1674, 1674, 1676, + 1675, 1677, 1677, 1678, 1678, 1679, 1680, 1681, 1682, 1683, + 1681, 1684, 1685, 1681, 1686, 1687, 1686, 1688, 1688, 1689, + 1689, 1690, 1690, 1691, 1691, 1692, 1692, 1692, 1694, 1695, + 1693, 1696, 1696, 1697, 1697, 1698, 1698, 1699, 1699, 1699, + 1699, 1699, 1699, 1699, 1699, 1699, 1700, 1700, 1702, 1701, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1704, 1703, 1705, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1703, + 1703, 1703, 1703, 1703, 1703, 1703, 1703, 1706, 1706, 1706, + 1707, 1707, 1708, 1708, 1709, 1709, 1710, 1710, 1711, 1711, + 1712, 1712, 1713, 1713, 1714, 1714, 1714, 1716, 1715, 1717, + 1715, 1718, 1718, 1718, 1718, 1718, 1718, 1719, 1719, 1720, + 1721, 1721, 1721, 1721, 1722, 1722, 1723, 1723, 1723, 1724, + 1726, 1725, 1728, 1727, 1727, 1729, 1729, 1730, 1731, 1730, + 1732, 1732, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1734, 1734, 1735, 1736, 1737, 1736, 1736, 1738, 1738, 1739, + 1739, 1739, 1740, 1741, 1741, 1743, 1742, 1744, 1744, 1746, + 1745, 1747, 1745, 1745, 1748, 1748, 1749, 1749, 1750, 1751, + 1750, 1753, 1752, 1754, 1754, 1754, 1755, 1755, 1755, 1756, + 1756, 1757, 1757, 1759, 1758, 1760, 1760, 1761, 1763, 1764, + 1765, 1766, 1762, 1767, 1767, 1768, 1768, 1769, 1769, 1769, + 1770, 1770, 1770, 1771, 1771, 1772, 1772, 1773, 1773, 1773, + 1773, 1774, 1774, 1775, 1775, 1776, 1776, 1777, 1777, 1778, + 1778, 1779, 1779, 1780, 1780, 1780, 1781, 1781, 1782, 1782, + 1783, 1783, 1784, 1784, 1785, 1786, 1786, 1786, 1786, 1787, + 1787, 1788, 1788, 1788, 1789, 1789, 1789, 1790, 1790, 1791, + 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1791, 1792, + 1792, 1792, 1792, 1792, 1793, 1793, 1793, 1795, 1794, 1796, + 1796, 1797, 1797, 1798, 1799, 1800, 1799, 1801, 1801, 1802, + 1803, 1804, 1804, 1805, 1806, 1806, 1807, 1807, 1808, 1808, + 1809, 1810, 1810, 1810, 1810, 1810, 1811, 1811, 1811, 1811, + 1811, 1812, 1812, 1812, 1812, 1813, 1813, 1813, 1814, 1814, + 1815, 1816, 1816, 1817, 1817, 1817, 1818, 1819, 1819, 1819, + 1819, 1820, 1821, 1822, 1823, 1824, 1824, 1825, 1825, 1826, + 1826, 1826, 1827, 1827, 1828, 1828, 1829, 1829, 1829, 1830, + 1830, 1830, 1831, 1831, 1832, 1833, 1833, 1833, 1833, 1833, + 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1834, 1834, 1834, + 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, + 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, + 1835, 1835, 1835, 1836, 1836, 1836, 1836, 1836, 1836, 1836, + 1836, 1836, 1836, 1836, 1836, 1836, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1838, + 1838, 1838, 1838, 1838, 1838, 1838, 1838, 1839, 1839, 1839, + 1839, 1839, 1839, 1840, 1840, 1840, 1840, 1840, 1840, 1840, + 1840, 1840, 1840, 1841, 1841, 1841, 1842, 1842, 1842, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, 1843, + 1843, 1843, 1843, 1843, 1843, 1844, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, + 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1845, 1846, 1846, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, 1848, + 1848, 1848, 1850, 1849, 1851, 1851, 1852, 1851, 1853, 1851, + 1854, 1851, 1855, 1855, 1856, 1856, 1857, 1856, 1858, 1858, + 1860, 1859, 1859, 1861, 1861, 1861, 1862, 1862, 1862, 1862, + 1863, 1863, 1863, 1863, 1865, 1864, 1866, 1864, 1867, 1864, + 1869, 1868, 1870, 1868, 1871, 1868, 1873, 1872, 1874, 1872, + 1875, 1872, 1876, 1872, 1877, 1872, 1878, 1872, 1879, 1872, + 1872, 1872, 1872, 1872, 1872, 1872, 1872, 1880, 1872, 1881, + 1872, 1882, 1872, 1883, 1883, 1883, 1883, 1884, 1885, 1886, + 1886, 1887, 1887, 1887, 1887, 1888, 1888, 1888, 1889, 1889, + 1889, 1889, 1889, 1891, 1890, 1892, 1892, 1892, 1893, 1893, + 1894, 1894, 1895, 1896, 1896, 1896, 1896, 1896, 1898, 1897, + 1900, 1899, 1901, 1901, 1902, 1901, 1903, 1903, 1904, 1904, + 1905, 1905, 1905, 1905, 1906, 1905, 1907, 1907, 1907, 1907, + 1907, 1908, 1909, 1909, 1909, 1909, 1909, 1910, 1910, 1911, + 1912, 1912, 1912, 1912, 1913, 1913, 1914, 1914, 1915, 1915, + 1916, 1917, 1918, 1918, 1919, 1919, 1920, 1920, 1921, 1921, + 1922, 1922, 1922, 1922, 1923, 1924, 1924, 1924, 1924, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, 1925, + 1925, 1926, 1926, 1927, 1927, 1928, 1928, 1928, 1929, 1929, + 1929, 1929, 1930, 1930, 1931, 1931, 1932, 1932, 1933, 1933, + 1934, 1934, 1935, 1935, 1935, 1935, 1936, 1936, 1937, 1938, + 1938, 1938, 1939, 1939, 1939, 1939, 1939, 1940, 1940, 1940, + 1940, 1940, 1941, 1941, 1942, 1942, 1943, 1943, 1944, 1944, + 1945, 1945, 1946, 1946, 1948, 1947, 1949, 1950, 1950, 1951, + 1951, 1952, 1952, 1952, 1953, 1953, 1953, 1954, 1955, 1955, + 1955, 1956, 1957, 1958, 1958, 1958, 1959, 1959, 1959, 1960, + 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1960, 1961, 1961, + 1962, 1963, 1964, 1964, 1964, 1965, 1965, 1966, 1966, 1967, + 1967, 1968, 1968, 1970, 1969, 1971, 1971, 1971, 1971, 1972, + 1972, 1973, 1973, 1975, 1976, 1977, 1978, 1979, 1974, 1981, + 1980, 1982, 1982, 1982, 1982, 1982, 1982, 1983, 1983, 1984, + 1984, 1984, 1985, 1985, 1985, 1986, 1986, 1986, 1987, 1987, + 1988, 1989, 1988, 1990, 1990, 1991, 1991, 1992, 1992, 1993, + 1994, 1995, 1996, 1997, 1998, 1999, 1999, 1999, 2000, 2000, + 2001, 2001, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2003, + 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, 2003, + 2003, 2004, 2005, 2006, 2008, 2007, 2009, 2010, 2011, 2012, + 2013, 2013, 2014, 2014, 2015, 2015, 2016, 2016, 2016, 2017, + 2017, 2017, 2017, 2019, 2018, 2021, 2022, 2020, 2023, 2023, + 2023, 2025, 2024, 2026, 2024, 2027, 2024, 2024, 2028, 2028, + 2029, 2030, 2030, 2030, 2031, 2030, 2032, 2032, 2032, 2032, + 2032, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2033, 2034, + 2034, 2034, 2034, 2036, 2035, 2038, 2037, 2040, 2039 +}; + +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 1, 0, 4, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 0, 5, 3, 0, 0, 6, + 0, 0, 3, 1, 3, 0, 3, 0, 7, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, + 1, 0, 1, 3, 1, 0, 1, 3, 1, 0, + 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 1, 1, 0, 1, 3, 0, 0, 8, + 0, 8, 0, 0, 15, 0, 0, 17, 0, 0, + 15, 0, 0, 15, 0, 6, 0, 10, 0, 11, + 0, 5, 0, 5, 8, 6, 0, 3, 1, 0, + 1, 1, 2, 3, 2, 1, 3, 2, 1, 3, + 3, 3, 1, 1, 1, 1, 3, 0, 1, 0, + 12, 1, 3, 2, 2, 2, 2, 2, 2, 2, + 0, 12, 0, 6, 2, 0, 1, 3, 1, 0, + 2, 0, 2, 0, 1, 4, 0, 2, 0, 3, + 0, 0, 1, 1, 1, 1, 2, 3, 1, 0, + 2, 0, 2, 2, 2, 2, 2, 3, 3, 1, + 1, 2, 3, 3, 0, 4, 0, 6, 0, 8, + 0, 3, 0, 1, 3, 1, 0, 0, 2, 3, + 1, 1, 0, 1, 3, 1, 1, 1, 1, 0, + 4, 3, 0, 3, 2, 3, 1, 3, 5, 2, + 1, 3, 3, 1, 0, 4, 4, 1, 0, 6, + 0, 3, 0, 0, 3, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 3, 0, 1, 1, 1, 1, + 2, 1, 1, 2, 3, 3, 1, 1, 0, 1, + 0, 2, 3, 5, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 4, 0, 1, 1, 3, 1, 3, 3, 1, + 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 5, 0, 2, + 1, 1, 0, 3, 1, 1, 2, 0, 4, 0, + 5, 1, 2, 0, 4, 0, 5, 2, 2, 2, + 0, 2, 0, 0, 3, 0, 3, 1, 3, 0, + 3, 1, 1, 1, 3, 3, 4, 5, 2, 4, + 2, 1, 3, 0, 0, 6, 0, 2, 2, 2, + 0, 6, 0, 3, 1, 1, 2, 1, 2, 0, + 5, 0, 5, 0, 2, 0, 1, 0, 1, 2, + 5, 3, 5, 3, 5, 1, 0, 5, 0, 5, + 0, 0, 0, 8, 0, 5, 0, 3, 0, 3, + 0, 0, 5, 0, 3, 1, 1, 1, 1, 1, + 0, 5, 3, 1, 2, 4, 0, 4, 1, 4, + 1, 0, 1, 0, 4, 0, 0, 3, 0, 6, + 6, 0, 4, 2, 2, 0, 3, 2, 0, 3, + 0, 1, 0, 3, 0, 1, 1, 3, 1, 4, + 3, 3, 0, 2, 0, 0, 7, 0, 10, 1, + 3, 1, 1, 0, 2, 0, 3, 1, 3, 0, + 1, 0, 6, 1, 0, 0, 4, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 3, 0, 0, + 5, 1, 3, 1, 1, 0, 3, 1, 3, 0, + 4, 1, 0, 1, 2, 1, 1, 1, 0, 1, + 2, 1, 3, 4, 3, 3, 3, 3, 4, 4, + 3, 0, 0, 6, 3, 0, 2, 0, 1, 0, + 1, 0, 1, 1, 2, 1, 1, 3, 0, 3, + 0, 3, 1, 3, 0, 1, 1, 2, 1, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 6, 1, 1, 3, 4, 4, 2, 2, + 2, 3, 3, 3, 1, 3, 1, 3, 3, 3, + 3, 0, 1, 2, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, + 2, 1, 3, 0, 9, 0, 10, 0, 9, 0, + 9, 0, 11, 0, 12, 0, 10, 2, 7, 7, + 0, 1, 4, 0, 1, 0, 1, 2, 0, 4, + 0, 3, 0, 3, 0, 1, 2, 1, 0, 1, + 2, 1, 0, 1, 2, 3, 0, 6, 5, 5, + 0, 2, 0, 1, 1, 1, 0, 1, 2, 1, + 1, 2, 2, 1, 0, 3, 1, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, + 1, 1, 3, 3, 3, 3, 0, 1, 2, 2, + 3, 3, 2, 3, 3, 4, 3, 3, 3, 1, + 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, + 3, 2, 3, 2, 2, 2, 2, 2, 5, 5, + 1, 1, 2, 2, 1, 2, 1, 2, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 2, 0, 3, + 0, 1, 1, 5, 0, 1, 1, 1, 2, 2, + 1, 3, 3, 3, 3, 1, 1, 0, 1, 0, + 1, 0, 1, 2, 1, 1, 2, 4, 1, 3, + 2, 1, 0, 2, 0, 1, 0, 1, 2, 2, + 2, 3, 2, 1, 1, 1, 2, 1, 2, 2, + 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 2, 1, 1, 0, + 1, 1, 1, 2, 1, 2, 3, 3, 2, 2, + 0, 1, 0, 4, 1, 1, 1, 0, 1, 2, + 1, 1, 2, 1, 3, 3, 1, 1, 0, 2, + 0, 1, 5, 0, 3, 3, 1, 0, 2, 2, + 2, 0, 3, 3, 6, 6, 1, 1, 2, 2, + 2, 2, 2, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 1, 1, 2, + 1, 2, 1, 2, 0, 2, 0, 2, 2, 2, + 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 2, 4, 2, 0, 4, + 1, 4, 0, 1, 1, 3, 0, 0, 9, 0, + 5, 0, 7, 7, 0, 6, 0, 6, 0, 11, + 0, 10, 0, 11, 0, 8, 8, 0, 0, 0, + 9, 1, 1, 0, 1, 1, 3, 0, 2, 3, + 5, 5, 0, 3, 1, 4, 0, 3, 0, 2, + 0, 1, 0, 2, 2, 2, 2, 1, 1, 1, + 4, 4, 0, 6, 4, 0, 5, 0, 6, 4, + 3, 1, 7, 7, 0, 7, 2, 1, 1, 0, + 6, 0, 3, 2, 0, 5, 0, 0, 6, 1, + 3, 1, 1, 3, 3, 3, 2, 2, 4, 4, + 2, 7, 6, 5, 5, 4, 5, 4, 4, 2, + 2, 7, 5, 6, 3, 6, 6, 4, 6, 1, + 1, 1, 1, 1, 3, 3, 3, 5, 0, 1, + 1, 2, 2, 3, 3, 3, 3, 0, 1, 0, + 1, 0, 2, 0, 1, 2, 1, 1, 1, 0, + 1, 1, 0, 2, 1, 0, 1, 1, 1, 0, + 7, 0, 5, 5, 4, 3, 0, 1, 1, 3, + 3, 2, 2, 0, 2, 1, 3, 0, 1, 1, + 0, 2, 4, 1, 3, 0, 5, 0, 1, 1, + 3, 0, 4, 0, 4, 0, 1, 1, 2, 1, + 1, 1, 0, 2, 2, 0, 5, 1, 3, 2, + 0, 3, 1, 4, 1, 0, 4, 1, 0, 4, + 0, 1, 3, 0, 1, 3, 1, 1, 2, 6, + 3, 0, 4, 0, 3, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 2, 0, 2, 0, 6, 0, + 1, 1, 0, 5, 4, 3, 5, 1, 3, 4, + 0, 6, 1, 1, 1, 3, 2, 3, 1, 1, + 0, 6, 1, 1, 1, 3, 3, 4, 0, 6, + 0, 2, 0, 4, 0, 2, 0, 3, 0, 4, + 0, 3, 0, 4, 1, 1, 0, 3, 0, 0, + 5, 6, 7, 1, 2, 1, 1, 0, 3, 0, + 3, 3, 3, 1, 0, 4, 3, 1, 1, 1, + 1, 1, 4, 0, 1, 2, 1, 1, 0, 1, + 0, 1, 1, 2, 1, 2, 9, 0, 1, 0, + 2, 3, 1, 4, 4, 2, 1, 1, 1, 1, + 3, 5, 0, 1, 0, 2, 1, 2, 3, 1, + 1, 3, 4, 0, 0, 0, 0, 2, 2, 1, + 1, 0, 2, 3, 0, 2, 3, 0, 2, 3, + 3, 3, 2, 1, 3, 4, 3, 4, 3, 4, + 3, 4, 3, 3, 6, 1, 3, 4, 5, 7, + 6, 8, 5, 6, 4, 3, 5, 4, 6, 3, + 4, 1, 3, 3, 3, 3, 3, 3, 3, 5, + 5, 5, 6, 6, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, + 2, 2, 1, 4, 1, 3, 1, 1, 1, 1, + 3, 1, 1, 1, 4, 4, 4, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 6, 4, 4, 7, 6, 3, 4, 6, + 6, 4, 4, 4, 4, 4, 4, 6, 8, 10, + 1, 1, 3, 1, 1, 3, 1, 2, 2, 2, + 2, 2, 1, 3, 4, 6, 4, 6, 2, 2, + 4, 4, 4, 10, 6, 8, 6, 4, 4, 6, + 4, 3, 4, 1, 4, 3, 4, 1, 1, 5, + 3, 5, 3, 6, 8, 2, 2, 8, 8, 6, + 6, 2, 6, 3, 6, 8, 4, 3, 4, 8, + 8, 4, 2, 2, 2, 6, 6, 4, 8, 4, + 4, 8, 4, 6, 6, 4, 6, 8, 6, 5, + 8, 7, 10, 0, 5, 4, 4, 4, 6, 8, + 6, 6, 6, 6, 6, 2, 3, 0, 4, 0, + 3, 0, 1, 1, 3, 4, 4, 5, 4, 4, + 4, 5, 4, 0, 0, 7, 4, 5, 4, 5, + 4, 4, 4, 4, 4, 5, 0, 9, 0, 8, + 0, 7, 3, 3, 1, 1, 1, 3, 3, 3, + 3, 3, 4, 4, 4, 6, 4, 6, 4, 6, + 5, 0, 7, 4, 4, 4, 4, 1, 0, 3, + 3, 1, 3, 5, 0, 1, 0, 2, 0, 3, + 4, 2, 0, 1, 2, 1, 0, 3, 2, 3, + 3, 3, 2, 1, 1, 1, 1, 1, 2, 1, + 2, 2, 1, 2, 1, 2, 2, 3, 0, 1, + 1, 3, 1, 3, 1, 3, 4, 5, 1, 3, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 4, 1, 3, 0, 3, 0, 5, 2, 4, + 4, 1, 1, 1, 1, 0, 1, 2, 1, 2, + 1, 1, 2, 3, 3, 0, 0, 10, 1, 4, + 1, 3, 3, 0, 6, 0, 8, 4, 0, 8, + 0, 10, 6, 0, 8, 0, 10, 6, 1, 2, + 1, 1, 2, 0, 1, 5, 1, 1, 1, 1, + 1, 1, 3, 1, 3, 3, 3, 3, 3, 3, + 3, 5, 3, 0, 1, 0, 2, 3, 3, 1, + 1, 0, 7, 0, 7, 1, 2, 0, 0, 2, + 0, 2, 0, 1, 1, 1, 1, 3, 1, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, + 2, 0, 1, 0, 0, 3, 0, 0, 3, 0, + 4, 4, 2, 0, 1, 1, 0, 2, 3, 1, + 3, 0, 7, 0, 1, 0, 3, 0, 3, 0, + 3, 1, 1, 1, 4, 2, 2, 2, 1, 2, + 2, 0, 3, 2, 2, 3, 3, 3, 3, 1, + 2, 0, 1, 0, 4, 4, 2, 0, 1, 1, + 0, 1, 2, 5, 4, 1, 4, 7, 5, 8, + 3, 1, 1, 1, 1, 1, 2, 1, 1, 3, + 3, 1, 3, 1, 1, 1, 1, 1, 0, 2, + 3, 4, 1, 2, 1, 0, 1, 1, 1, 0, + 2, 2, 2, 1, 0, 1, 2, 2, 2, 1, + 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, + 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 6, 0, 1, 3, 1, 3, 0, 2, + 3, 1, 1, 2, 1, 3, 2, 0, 0, 7, + 2, 1, 0, 3, 0, 8, 0, 8, 4, 5, + 5, 0, 6, 4, 4, 4, 0, 6, 1, 1, + 3, 1, 2, 1, 3, 1, 0, 2, 0, 2, + 0, 1, 0, 0, 12, 0, 0, 10, 0, 0, + 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, + 2, 1, 2, 0, 3, 3, 0, 1, 3, 1, + 1, 3, 1, 3, 1, 3, 1, 1, 0, 1, + 1, 1, 1, 1, 0, 4, 0, 4, 0, 1, + 0, 1, 3, 1, 5, 3, 1, 1, 1, 1, + 0, 0, 0, 7, 5, 1, 0, 0, 0, 13, + 3, 1, 3, 3, 3, 1, 3, 0, 1, 0, + 3, 0, 3, 2, 3, 3, 2, 5, 0, 0, + 7, 0, 0, 8, 0, 0, 3, 1, 3, 2, + 4, 0, 2, 0, 2, 1, 1, 1, 0, 0, + 7, 0, 1, 0, 1, 1, 3, 1, 1, 2, + 2, 2, 1, 1, 1, 1, 0, 3, 0, 3, + 2, 4, 4, 3, 4, 4, 1, 3, 3, 3, + 3, 6, 2, 2, 0, 6, 0, 8, 5, 2, + 1, 1, 1, 5, 5, 2, 2, 1, 4, 3, + 2, 3, 2, 2, 1, 4, 4, 3, 3, 3, + 2, 2, 3, 4, 3, 3, 3, 3, 4, 4, + 3, 2, 3, 3, 3, 3, 3, 4, 4, 3, + 3, 4, 4, 3, 4, 4, 3, 1, 1, 1, + 1, 1, 0, 1, 0, 2, 0, 1, 1, 1, + 0, 2, 0, 2, 0, 3, 3, 0, 4, 0, + 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 1, 2, 1, 1, 0, 3, 0, 1, 1, 5, + 0, 4, 0, 4, 1, 0, 1, 4, 0, 3, + 3, 1, 2, 2, 2, 2, 3, 4, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, + 0, 1, 2, 2, 0, 3, 1, 0, 5, 0, + 1, 3, 1, 0, 3, 0, 3, 3, 1, 0, + 5, 0, 3, 2, 0, 1, 0, 2, 5, 0, + 6, 0, 4, 0, 1, 1, 2, 2, 3, 0, + 1, 1, 2, 0, 3, 0, 4, 2, 0, 0, + 0, 0, 23, 1, 1, 0, 1, 0, 1, 1, + 0, 1, 1, 0, 2, 2, 1, 3, 4, 3, + 3, 0, 2, 2, 1, 3, 3, 0, 4, 0, + 3, 1, 1, 0, 3, 2, 3, 1, 1, 2, + 0, 2, 3, 1, 5, 1, 1, 2, 2, 1, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 2, 2, 2, 0, 4, 0, + 1, 1, 3, 7, 0, 0, 4, 0, 3, 1, + 1, 1, 3, 1, 1, 1, 3, 5, 3, 5, + 1, 1, 3, 4, 5, 4, 1, 3, 4, 4, + 5, 1, 5, 3, 2, 1, 3, 2, 2, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 3, 1, 3, 0, 3, 0, 3, + 0, 5, 1, 3, 1, 3, 0, 3, 1, 3, + 0, 3, 1, 1, 1, 1, 0, 1, 1, 1, + 0, 2, 2, 2, 0, 4, 0, 6, 0, 6, + 0, 4, 0, 6, 0, 6, 0, 4, 0, 6, + 0, 6, 0, 5, 0, 7, 0, 9, 0, 9, + 2, 3, 2, 4, 3, 5, 2, 0, 4, 0, + 4, 0, 6, 1, 1, 3, 3, 1, 3, 2, + 2, 2, 2, 2, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 0, 5, 0, 2, 1, 1, 1, + 1, 3, 3, 1, 1, 2, 2, 2, 0, 3, + 0, 3, 3, 2, 0, 6, 1, 2, 1, 1, + 1, 1, 1, 1, 0, 5, 1, 1, 1, 1, + 1, 3, 6, 6, 7, 5, 3, 4, 1, 3, + 8, 8, 6, 4, 0, 3, 0, 3, 1, 3, + 2, 1, 1, 1, 0, 1, 1, 2, 0, 1, + 1, 1, 3, 3, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, + 2, 0, 1, 3, 1, 2, 2, 2, 1, 3, + 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, + 1, 1, 4, 5, 4, 1, 3, 1, 2, 0, + 2, 5, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 0, 2, 0, 2, 0, 3, + 2, 1, 2, 1, 0, 3, 1, 0, 1, 0, + 1, 0, 3, 2, 0, 1, 2, 4, 4, 5, + 4, 2, 3, 2, 2, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 3, 3, 3, 3, 0, 1, 3, 3, 0, + 3, 1, 3, 0, 3, 0, 3, 4, 4, 1, + 1, 0, 2, 0, 0, 0, 0, 0, 20, 0, + 2, 4, 4, 3, 4, 3, 3, 0, 3, 1, + 3, 5, 1, 1, 1, 0, 1, 1, 0, 2, + 0, 0, 3, 0, 2, 6, 3, 4, 4, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 6, 4, 2, 1, 1, + 1, 2, 5, 6, 2, 1, 2, 3, 1, 6, + 8, 5, 7, 0, 4, 0, 0, 7, 6, 4, + 4, 0, 6, 0, 11, 0, 11, 10, 1, 3, + 2, 1, 4, 1, 0, 6, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 7, 0, 5, 0, 7 +}; + + +enum { YYENOMEM = -2 }; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (thd, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value, thd); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + FILE *yyoutput = yyo; + YY_USE (yyoutput); + YY_USE (thd); + if (!yyvaluep) + return; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ + +static void +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); + + yy_symbol_value_print (yyo, yykind, yyvaluep, thd); + YYFPRINTF (yyo, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule, THD *thd) +{ + int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)], thd); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule, thd); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + + + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep, THD *thd) +{ + YY_USE (yyvaluep); + YY_USE (thd); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + switch (yykind) + { + case YYSYMBOL_expr_lex: /* expr_lex */ +#line 1551 "/home/buildbot/git/mkdist/sql/yy_mariadb.yy" +{ + /* + In case of a syntax/oom error let's free the sp_expr_lex + instance, but only if it has not been linked to any structures + such as sp_instr_jump_if_not::m_lex_keeper yet, e.g.: + IF f1() THEN1 + i.e. THEN1 came instead of the expected THEN causing a syntax error. + */ + if (!((*yyvaluep).expr_lex)->sp_lex_in_use) + delete ((*yyvaluep).expr_lex); +} +#line 29430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case YYSYMBOL_cursor_actual_parameters: /* cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_mariadb.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 29447 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case YYSYMBOL_opt_parenthesized_cursor_actual_parameters: /* opt_parenthesized_cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_mariadb.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 29464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + default: + break; + } + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (THD *thd) +{ +/* Lookahead token kind. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + + /* Number of syntax errors so far. */ + int yynerrs = 0; + + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; + + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = YYEMPTY; /* Cause a token to be read. */ + + goto yysetstate; + + +/*------------------------------------------------------------. +| yynewstate -- push a new state, which is found in yystate. | +`------------------------------------------------------------*/ +yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); + + if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else + { + /* Get the current used size of the three stacks, in elements. */ + YYPTRDIFF_T yysize = yyssp - yyss + 1; + +# if defined yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; + } +# else /* defined YYSTACK_RELOCATE */ + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + YYNOMEM; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (&yylval, thd); + } + + if (yychar <= YYEOF) + { + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + /* Discard the shifted token. */ + yychar = YYEMPTY; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: /* query: END_OF_INPUT */ +#line 1976 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->bootstrap && + (!(thd->lex->lex_options & OPTION_LEX_FOUND_COMMENT))) + my_yyabort_error((ER_EMPTY_QUERY, MYF(0))); + + thd->lex->sql_command= SQLCOM_EMPTY_QUERY; + YYLIP->found_semicolon= NULL; + } +#line 29747 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3: /* $@1: %empty */ +#line 1985 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_input_stream *lip = YYLIP; + + if ((thd->client_capabilities & CLIENT_MULTI_QUERIES) && + lip->multi_statements && + ! lip->eof()) + { + /* + We found a well formed query, and multi queries are allowed: + - force the parser to stop after the ';' + - mark the start of the next query for the next invocation + of the parser. + */ + lip->next_state= MY_LEX_END; + lip->found_semicolon= lip->get_ptr(); + } + else + { + /* Single query, terminated. */ + lip->found_semicolon= NULL; + } + } +#line 29774 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 5: /* query: directly_executable_statement END_OF_INPUT */ +#line 2010 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Single query, not terminated. */ + YYLIP->found_semicolon= NULL; + } +#line 29783 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 71: /* deallocate: deallocate_or_drop PREPARE_SYM ident */ +#line 2093 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_deallocate_prepare((yyvsp[0].ident_sys)); + } +#line 29791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 74: /* $@2: %empty */ +#line 2105 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PREPARE..FROM"; } +#line 29797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 75: /* prepare: PREPARE_SYM ident FROM $@2 expr */ +#line 2107 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_prepare((yyvsp[-3].ident_sys), (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 29807 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 76: /* execute: EXECUTE_SYM ident execute_using */ +#line 2116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute((yyvsp[-1].ident_sys), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29816 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 77: /* $@3: %empty */ +#line 2121 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE IMMEDIATE"; } +#line 29822 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 78: /* $@4: %empty */ +#line 2123 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= NULL; } +#line 29828 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 79: /* execute: EXECUTE_SYM IMMEDIATE_SYM $@3 expr $@4 execute_using */ +#line 2125 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute_immediate((yyvsp[-2].item), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29837 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 80: /* execute_using: %empty */ +#line 2132 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 29843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 81: /* $@5: %empty */ +#line 2134 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE..USING"; } +#line 29849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 82: /* execute_using: USING $@5 execute_params */ +#line 2136 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= (yyvsp[0].item_list); + Lex->clause_that_disallows_subselect= NULL; + } +#line 29858 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 83: /* execute_params: expr_or_ignore_or_default */ +#line 2144 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 29867 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 84: /* execute_params: execute_params ',' expr_or_ignore_or_default */ +#line 2149 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.item_list)= (yyvsp[-2].item_list))->push_back((yyvsp[0].item), thd->mem_root)) + MYSQL_YYABORT; + } +#line 29876 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 85: /* $@6: %empty */ +#line 2160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HELP")); + } +#line 29885 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 86: /* help: HELP_SYM $@6 ident_or_text */ +#line 2165 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_HELP; + lex->help_arg= (yyvsp[0].lex_str).str; + } +#line 29895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 87: /* $@7: %empty */ +#line 2176 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_CHANGE_MASTER; + } +#line 29903 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 88: /* change: CHANGE MASTER_SYM optional_connection_name TO_SYM $@7 master_defs optional_for_channel */ +#line 2181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 29909 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 91: /* master_def: MASTER_HOST_SYM '=' TEXT_STRING_sys */ +#line 2191 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.host = (yyvsp[0].lex_str).str; + } +#line 29917 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 92: /* master_def: MASTER_USER_SYM '=' TEXT_STRING_sys */ +#line 2195 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.user = (yyvsp[0].lex_str).str; + } +#line 29925 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 93: /* master_def: MASTER_PASSWORD_SYM '=' TEXT_STRING_sys */ +#line 2199 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.password = (yyvsp[0].lex_str).str; + } +#line 29933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 94: /* master_def: MASTER_PORT_SYM '=' ulong_num */ +#line 2203 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.port = (yyvsp[0].ulong_num); + } +#line 29941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 95: /* master_def: MASTER_CONNECT_RETRY_SYM '=' ulong_num */ +#line 2207 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connect_retry = (yyvsp[0].ulong_num); + } +#line 29949 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 96: /* master_def: MASTER_DELAY_SYM '=' ulong_num */ +#line 2211 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].ulong_num) > MASTER_DELAY_MAX) + { + my_error(ER_MASTER_DELAY_VALUE_OUT_OF_RANGE, MYF(0), + (ulong) (yyvsp[0].ulong_num), (ulong) MASTER_DELAY_MAX); + } + else + Lex->mi.sql_delay = (yyvsp[0].ulong_num); + } +#line 29963 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 97: /* master_def: MASTER_SSL_SYM '=' ulong_num */ +#line 2221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 29972 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 98: /* master_def: MASTER_SSL_CA_SYM '=' TEXT_STRING_sys */ +#line 2226 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_ca= (yyvsp[0].lex_str).str; + } +#line 29980 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 99: /* master_def: MASTER_SSL_CAPATH_SYM '=' TEXT_STRING_sys */ +#line 2230 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_capath= (yyvsp[0].lex_str).str; + } +#line 29988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 100: /* master_def: MASTER_SSL_CERT_SYM '=' TEXT_STRING_sys */ +#line 2234 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cert= (yyvsp[0].lex_str).str; + } +#line 29996 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 101: /* master_def: MASTER_SSL_CIPHER_SYM '=' TEXT_STRING_sys */ +#line 2238 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cipher= (yyvsp[0].lex_str).str; + } +#line 30004 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 102: /* master_def: MASTER_SSL_KEY_SYM '=' TEXT_STRING_sys */ +#line 2242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_key= (yyvsp[0].lex_str).str; + } +#line 30012 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 103: /* master_def: MASTER_SSL_VERIFY_SERVER_CERT_SYM '=' ulong_num */ +#line 2246 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_verify_server_cert= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 30021 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 104: /* master_def: MASTER_SSL_CRL_SYM '=' TEXT_STRING_sys */ +#line 2251 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crl= (yyvsp[0].lex_str).str; + } +#line 30029 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 105: /* master_def: MASTER_SSL_CRLPATH_SYM '=' TEXT_STRING_sys */ +#line 2255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crlpath= (yyvsp[0].lex_str).str; + } +#line 30037 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 106: /* master_def: MASTER_HEARTBEAT_PERIOD_SYM '=' NUM_literal */ +#line 2260 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.heartbeat_period= (float) (yyvsp[0].item_num)->val_real(); + if (unlikely(Lex->mi.heartbeat_period > + SLAVE_MAX_HEARTBEAT_PERIOD) || + unlikely(Lex->mi.heartbeat_period < 0.0)) + my_yyabort_error((ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), + SLAVE_MAX_HEARTBEAT_PERIOD)); + + if (unlikely(Lex->mi.heartbeat_period > slave_net_timeout)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); + } + if (unlikely(Lex->mi.heartbeat_period < 0.001)) + { + if (unlikely(Lex->mi.heartbeat_period != 0.0)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); + Lex->mi.heartbeat_period= 0.0; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_DISABLE; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30069 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 107: /* master_def: IGNORE_SERVER_IDS_SYM '=' '(' ignore_server_id_list ')' */ +#line 2288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30077 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 108: /* master_def: DO_DOMAIN_IDS_SYM '=' '(' do_domain_id_list ')' */ +#line 2292 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_do_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30085 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 109: /* master_def: IGNORE_DOMAIN_IDS_SYM '=' '(' ignore_domain_id_list ')' */ +#line 2296 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 30093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 114: /* ignore_server_id: ulong_num */ +#line 2311 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 30101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 118: /* do_domain_id: ulong_num */ +#line 2324 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_do_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 30109 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 122: /* ignore_domain_id: ulong_num */ +#line 2337 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 30117 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 123: /* master_file_def: MASTER_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2344 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.log_file_name = (yyvsp[0].lex_str).str; + } +#line 30125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 124: /* master_file_def: MASTER_LOG_POS_SYM '=' ulonglong_num */ +#line 2348 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it + instead of causing subsequent errors. + We need to do it in this file, because only there we know that + MASTER_LOG_POS has been explicitly specified. On the contrary + in change_master() (sql_repl.cc) we cannot distinguish between 0 + (MASTER_LOG_POS explicitly specified as 0) and 0 (unspecified), + whereas we want to distinguish (specified 0 means "read the binlog + from 0" (4 in fact), unspecified means "don't change the position + (keep the preceding value)"). + */ + Lex->mi.pos= MY_MAX(BIN_LOG_HEADER_SIZE, (yyvsp[0].ulonglong_number)); + } +#line 30144 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 125: /* master_file_def: RELAY_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2363 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_name = (yyvsp[0].lex_str).str; + } +#line 30152 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 126: /* master_file_def: RELAY_LOG_POS_SYM '=' ulong_num */ +#line 2367 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_pos = (yyvsp[0].ulong_num); + /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ + Lex->mi.relay_log_pos= MY_MAX(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); + } +#line 30162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 127: /* master_file_def: MASTER_USE_GTID_SYM '=' CURRENT_POS_SYM */ +#line 2373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_CURRENT_POS; + } +#line 30172 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 128: /* master_file_def: MASTER_USE_GTID_SYM '=' SLAVE_POS_SYM */ +#line 2379 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_SLAVE_POS; + } +#line 30182 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 129: /* master_file_def: MASTER_USE_GTID_SYM '=' NO_SYM */ +#line 2385 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_NO; + } +#line 30192 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 130: /* master_file_def: MASTER_DEMOTE_TO_SLAVE_SYM '=' bool */ +#line 2391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.is_demotion_opt= (bool) (yyvsp[0].ulong_num); + } +#line 30200 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 131: /* optional_connection_name: %empty */ +#line 2398 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->mi.connection_name= null_clex_str; + } +#line 30209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 133: /* connection_name: TEXT_STRING_sys */ +#line 2407 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } +#line 30221 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 134: /* optional_for_channel: %empty */ +#line 2418 "/home/buildbot/git/sql/sql_yacc.yy" + { + /*do nothing */ + } +#line 30229 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 136: /* for_channel: FOR_SYM CHANNEL_SYM TEXT_STRING_sys */ +#line 2427 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->mi.connection_name.str != NULL) + { + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)")); + } + else + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } + + } +#line 30249 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 137: /* $@8: %empty */ +#line 2448 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_table())) + MYSQL_YYABORT; + lex->create_info.init(); + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->current_select->parsing_place= BEFORE_OPT_LIST; + if (lex->set_command_with_check(SQLCOM_CREATE_TABLE, (yyvsp[-2].num), (yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30265 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 138: /* $@9: %empty */ +#line 2460 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + lex->alter_info.reset(); + /* + For CREATE TABLE we should not open the table even if it exists. + If the table exists, we should either not create it or replace it + */ + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + lex->inc_select_stack_outer_barrier(); + } +#line 30286 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 139: /* create: create_or_replace opt_temporary TABLE_SYM opt_if_not_exists $@8 table_ident $@9 create_body */ +#line 2477 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 30296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 140: /* $@10: %empty */ +#line 2483 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_sequence())) + MYSQL_YYABORT; + lex->create_info.init(); + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_SEQUENCE, (yyvsp[-3].num), + (yyvsp[-4].object_ddl_options) | (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + + /* + For CREATE TABLE, an non-existing table is not an error. + Instruct open_tables() to just take an MDL lock if the + table does not exist. + */ + lex->alter_info.reset(); + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + if (unlikely(!(lex->create_info.seq_create_info= + new (thd->mem_root) sequence_definition()))) + MYSQL_YYABORT; + } +#line 30330 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 141: /* create: create_or_replace opt_temporary SEQUENCE_SYM opt_if_not_exists table_ident $@10 opt_sequence opt_create_table_options */ +#line 2513 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->create_info.seq_create_info->check_and_adjust(1))) + { + my_error(ER_SEQUENCE_INVALID_DATA, MYF(0), + lex->first_select_lex()->table_list.first->db.str, + lex->first_select_lex()->table_list.first-> + table_name.str); + MYSQL_YYABORT; + } + + /* No fields specified, generate them */ + if (unlikely(prepare_sequence_fields(thd, + &lex->alter_info.create_list))) + MYSQL_YYABORT; + + /* CREATE SEQUENCE always creates a sequence */ + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= 1; + + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 30359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 142: /* $@11: %empty */ +#line 2538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30368 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 143: /* $@12: %empty */ +#line 2545 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::MULTIPLE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 144: /* create: create_or_replace INDEX_SYM opt_if_not_exists $@11 ident opt_key_algorithm_clause ON table_ident $@12 '(' key_list ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 145: /* $@13: %empty */ +#line 2557 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30396 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 146: /* $@14: %empty */ +#line 2564 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::UNIQUE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-8].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30407 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 147: /* create: create_or_replace UNIQUE_SYM INDEX_SYM opt_if_not_exists $@13 ident opt_key_algorithm_clause ON table_ident $@14 '(' key_list opt_without_overlaps ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2573 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 148: /* $@15: %empty */ +#line 2577 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30424 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 149: /* $@16: %empty */ +#line 2583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30435 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 150: /* create: create_or_replace fulltext INDEX_SYM $@15 opt_if_not_exists ident ON table_ident $@16 '(' key_list ')' opt_lock_wait_timeout fulltext_key_options opt_index_lock_algorithm */ +#line 2591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30443 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 151: /* $@17: %empty */ +#line 2595 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 30452 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 152: /* $@18: %empty */ +#line 2601 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 30463 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 153: /* create: create_or_replace spatial INDEX_SYM $@17 opt_if_not_exists ident ON table_ident $@18 '(' key_list ')' opt_lock_wait_timeout spatial_key_options opt_index_lock_algorithm */ +#line 2609 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30471 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 154: /* $@19: %empty */ +#line 2613 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + } +#line 30479 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 155: /* create: create_or_replace DATABASE opt_if_not_exists ident $@19 opt_create_database_options */ +#line 2617 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_DB, 0, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + lex->name= (yyvsp[-2].ident_sys); + } +#line 30491 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 156: /* $@20: %empty */ +#line 2626 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + if (Lex->add_create_view(thd, (yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), + DTYPE_ALGORITHM_UNDEFINED, (yyvsp[-3].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 30504 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 157: /* create: create_or_replace definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@20 view_list_opt AS view_select */ +#line 2635 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30512 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 158: /* $@21: %empty */ +#line 2640 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_view(thd, (yyvsp[-6].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-5].num), (yyvsp[-3].view_suid), (yyvsp[0].table)))) + MYSQL_YYABORT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + } +#line 30524 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 159: /* create: create_or_replace view_algorithm definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@21 view_list_opt AS view_select */ +#line 2648 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30532 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 160: /* $@22: %empty */ +#line 2652 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 30542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 161: /* create: create_or_replace definer_opt TRIGGER_SYM $@22 trigger_tail */ +#line 2658 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 162: /* $@23: %empty */ +#line 2662 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 30560 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 163: /* create: create_or_replace definer_opt EVENT_SYM $@23 event_tail */ +#line 2668 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 30568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 164: /* create: create_or_replace USER_SYM opt_if_not_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 2673 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_USER, + (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 30578 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 165: /* create: create_or_replace ROLE_SYM opt_if_not_exists clear_privileges role_list opt_with_admin */ +#line 2680 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_ROLE, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 30588 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 166: /* $@24: %empty */ +#line 2685 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->set_command(SQLCOM_CREATE_SERVER, (yyvsp[0].object_ddl_options)); } +#line 30594 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 167: /* create: create_or_replace $@24 server_def */ +#line 2687 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 30600 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 169: /* opt_sequence: %empty */ +#line 2692 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 30606 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 173: /* sequence_def: MINVALUE_SYM opt_equal longlong_num */ +#line 2703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.seq_create_info->min_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 30615 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 174: /* sequence_def: NO_SYM MINVALUE_SYM */ +#line 2708 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 30625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 175: /* sequence_def: NOMINVALUE_SYM */ +#line 2714 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 30635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 176: /* sequence_def: MAXVALUE_SYM opt_equal longlong_num */ +#line 2720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->max_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 30647 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 177: /* sequence_def: NO_SYM MAXVALUE_SYM */ +#line 2728 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 30657 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 178: /* sequence_def: NOMAXVALUE_SYM */ +#line 2734 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 30667 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 179: /* sequence_def: START_SYM opt_with longlong_num */ +#line 2740 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_start)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "START")); + Lex->create_info.seq_create_info->start= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_start; + } +#line 30679 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 180: /* sequence_def: INCREMENT_SYM opt_by longlong_num */ +#line 2748 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_increment)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "INCREMENT")); + Lex->create_info.seq_create_info->increment= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment; + } +#line 30691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 181: /* sequence_def: CACHE_SYM opt_equal longlong_num */ +#line 2756 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 30703 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 182: /* sequence_def: NOCACHE_SYM */ +#line 2764 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 30715 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 183: /* sequence_def: CYCLE_SYM */ +#line 2772 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 1; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 30727 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 184: /* sequence_def: NOCYCLE_SYM */ +#line 2780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 30739 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 185: /* sequence_def: RESTART_SYM */ +#line 2788 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart; + } +#line 30755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 186: /* sequence_def: RESTART_SYM opt_with longlong_num */ +#line 2800 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->restart= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value; + } +#line 30772 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 187: /* force_lookahead: %empty */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30778 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 188: /* force_lookahead: FORCE_LOOKAHEAD */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30784 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 189: /* $@25: %empty */ +#line 2819 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 30794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 190: /* server_def: SERVER_SYM opt_if_not_exists ident_or_text $@25 FOREIGN DATA_SYM WRAPPER_SYM ident_or_text OPTIONS_SYM '(' server_options_list ')' */ +#line 2826 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->server_options.scheme= (yyvsp[-4].lex_str); } +#line 30800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 193: /* server_option: USER_SYM TEXT_STRING_sys */ +#line 2836 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.username.str == 0); + Lex->server_options.username= (yyvsp[0].lex_str); + } +#line 30809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 194: /* server_option: HOST_SYM TEXT_STRING_sys */ +#line 2841 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.host.str == 0); + Lex->server_options.host= (yyvsp[0].lex_str); + } +#line 30818 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 195: /* server_option: DATABASE TEXT_STRING_sys */ +#line 2846 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.db.str == 0); + Lex->server_options.db= (yyvsp[0].lex_str); + } +#line 30827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 196: /* server_option: OWNER_SYM TEXT_STRING_sys */ +#line 2851 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.owner.str == 0); + Lex->server_options.owner= (yyvsp[0].lex_str); + } +#line 30836 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 197: /* server_option: PASSWORD_SYM TEXT_STRING_sys */ +#line 2856 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.password.str == 0); + Lex->server_options.password= (yyvsp[0].lex_str); + } +#line 30845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 198: /* server_option: SOCKET_SYM TEXT_STRING_sys */ +#line 2861 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.socket.str == 0); + Lex->server_options.socket= (yyvsp[0].lex_str); + } +#line 30854 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 199: /* server_option: PORT_SYM ulong_num */ +#line 2866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->server_options.port= (yyvsp[0].ulong_num); + } +#line 30862 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 200: /* $@26: %empty */ +#line 2873 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->stmt_definition_begin= (yyvsp[-2].simple_string); + if (unlikely(lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + if (unlikely(!(lex->event_parse_data= + Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + lex->event_parse_data->identifier= (yyvsp[0].spname); + lex->event_parse_data->on_completion= + Event_parse_data::ON_COMPLETION_DROP; + + lex->sql_command= SQLCOM_CREATE_EVENT; + /* We need that for disallowing subqueries */ + } +#line 30883 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 201: /* event_tail: remember_name opt_if_not_exists sp_name $@26 ON SCHEDULE_SYM ev_schedule_time opt_ev_on_completion opt_ev_status opt_ev_comment DO_SYM ev_sql_stmt */ +#line 2894 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_CREATE_EVENT; + } +#line 30895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 202: /* $@27: %empty */ +#line 2905 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_expression= (yyvsp[-1].item); + Lex->event_parse_data->interval= (yyvsp[0].interval); + } +#line 30904 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 204: /* ev_schedule_time: AT_SYM expr */ +#line 2912 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_execute_at= (yyvsp[0].item); + } +#line 30912 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 205: /* opt_ev_status: %empty */ +#line 2918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30918 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 206: /* opt_ev_status: ENABLE_SYM */ +#line 2920 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::ENABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30928 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 207: /* opt_ev_status: DISABLE_SYM ON SLAVE */ +#line 2926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30938 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 208: /* opt_ev_status: DISABLE_SYM */ +#line 2932 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30948 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 209: /* ev_starts: %empty */ +#line 2941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, 0); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->event_parse_data->item_starts= item; + } +#line 30959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 210: /* ev_starts: STARTS_SYM expr */ +#line 2948 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_starts= (yyvsp[0].item); + } +#line 30967 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 212: /* ev_ends: ENDS_SYM expr */ +#line 2956 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_ends= (yyvsp[0].item); + } +#line 30975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 213: /* opt_ev_on_completion: %empty */ +#line 2962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30981 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 215: /* ev_on_completion: ON COMPLETION_SYM opt_not PRESERVE_SYM */ +#line 2968 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->on_completion= (yyvsp[-1].num) + ? Event_parse_data::ON_COMPLETION_DROP + : Event_parse_data::ON_COMPLETION_PRESERVE; + (yyval.num)= 1; + } +#line 30992 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 216: /* opt_ev_comment: %empty */ +#line 2977 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 217: /* opt_ev_comment: COMMENT_SYM TEXT_STRING_sys */ +#line 2979 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->comment= Lex->event_parse_data->comment= (yyvsp[0].lex_str); + (yyval.num)= 1; + } +#line 31007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 218: /* $@28: %empty */ +#line 2986 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + /* + This stops the following : + - CREATE EVENT ... DO CREATE EVENT ...; + - ALTER EVENT ... DO CREATE EVENT ...; + - CREATE EVENT ... DO ALTER EVENT DO ....; + - CREATE PROCEDURE ... BEGIN CREATE EVENT ... END| + This allows: + - CREATE EVENT ... DO DROP EVENT yyy; + - CREATE EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO DROP EVENT yyy; + - CREATE PROCEDURE ... BEGIN ALTER EVENT ... END| + (the nested ALTER EVENT can have anything but DO clause) + - CREATE PROCEDURE ... BEGIN DROP EVENT ... END| + */ + if (unlikely(lex->sphead)) + my_yyabort_error((ER_EVENT_RECURSION_FORBIDDEN, MYF(0))); + + if (unlikely(!lex->make_sp_head(thd, + lex->event_parse_data->identifier, + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); + } +#line 31044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 219: /* ev_sql_stmt: $@28 sp_proc_stmt force_lookahead */ +#line 3019 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* return back to the original memory root ASAP */ + if (Lex->sp_body_finalize_event(thd)) + MYSQL_YYABORT; + } +#line 31054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 220: /* clear_privileges: %empty */ +#line 3028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->users_list.empty(); + lex->first_select_lex()->db= null_clex_str; + lex->account_options.reset(); + } +#line 31065 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 221: /* opt_aggregate: %empty */ +#line 3037 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= NOT_AGGREGATE; } +#line 31071 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 222: /* opt_aggregate: AGGREGATE_SYM */ +#line 3038 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= GROUP_AGGREGATE; } +#line 31077 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 223: /* sp_handler: FUNCTION_SYM */ +#line 3043 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_function; } +#line 31083 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 224: /* sp_handler: PROCEDURE_SYM */ +#line 3044 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_procedure; } +#line 31089 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 225: /* sp_handler: PACKAGE_ORACLE_SYM */ +#line 3045 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_spec; } +#line 31095 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 226: /* sp_handler: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM */ +#line 3046 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_body; } +#line 31101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 227: /* sp_name: ident '.' ident */ +#line 3052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 228: /* sp_name: ident */ +#line 3057 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 229: /* sp_a_chistics: %empty */ +#line 3064 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 230: /* sp_a_chistics: sp_a_chistics sp_chistic */ +#line 3065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31131 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 231: /* sp_c_chistics: %empty */ +#line 3069 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31137 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 232: /* sp_c_chistics: sp_c_chistics sp_c_chistic */ +#line 3070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 233: /* sp_chistic: COMMENT_SYM TEXT_STRING_sys */ +#line 3076 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.comment= (yyvsp[0].lex_str); } +#line 31149 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 234: /* sp_chistic: LANGUAGE_SYM SQL_SYM */ +#line 3078 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Just parse it, we only have one language for now. */ } +#line 31155 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 235: /* sp_chistic: NO_SYM SQL_SYM */ +#line 3080 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_NO_SQL; } +#line 31161 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 236: /* sp_chistic: CONTAINS_SYM SQL_SYM */ +#line 3082 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } +#line 31167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 237: /* sp_chistic: READS_SYM SQL_SYM DATA_SYM */ +#line 3084 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } +#line 31173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 238: /* sp_chistic: MODIFIES_SYM SQL_SYM DATA_SYM */ +#line 3086 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } +#line 31179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 239: /* sp_chistic: sp_suid */ +#line 3088 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.suid= (yyvsp[0].sp_suid); } +#line 31185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 240: /* sp_c_chistic: sp_chistic */ +#line 3093 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 31191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 241: /* sp_c_chistic: opt_not DETERMINISTIC_SYM */ +#line 3094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.detistic= ! (yyvsp[-1].num); } +#line 31197 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 242: /* sp_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 3098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_SUID; } +#line 31203 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 243: /* sp_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 3099 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_NOT_SUID; } +#line 31209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 244: /* $@29: %empty */ +#line 3104 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 245: /* call: CALL_SYM ident $@29 opt_sp_cparam_list */ +#line 3109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 31227 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 246: /* $@30: %empty */ +#line 3114 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31236 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 247: /* call: CALL_SYM ident '.' ident $@30 opt_sp_cparam_list */ +#line 3119 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 31245 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 248: /* $@31: %empty */ +#line 3124 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 249: /* call: CALL_SYM ident '.' ident '.' ident $@31 opt_sp_cparam_list */ +#line 3129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 31263 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 254: /* sp_cparams: sp_cparams ',' expr */ +#line 3148 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 31271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 255: /* sp_cparams: expr */ +#line 3152 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 31279 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 256: /* sp_fdparam_list: %empty */ +#line 3160 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + Lex->sphead->m_param_end= Lex->sphead->m_param_begin; + } +#line 31288 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 257: /* $@32: %empty */ +#line 3165 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + } +#line 31296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 258: /* sp_fdparam_list: $@32 sp_fdparams */ +#line 3169 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 31304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 261: /* sp_param_name: ident */ +#line 3181 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spvar)= Lex->sp_param_init(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31313 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 266: /* sp_parameter_type: IN_SYM */ +#line 3199 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_IN; } +#line 31319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 267: /* sp_parameter_type: OUT_SYM */ +#line 3200 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_OUT; } +#line 31325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 268: /* sp_parameter_type: INOUT_SYM */ +#line 3201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_INOUT; } +#line 31331 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 269: /* $@33: %empty */ +#line 3206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start() + 1; + } +#line 31339 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 270: /* sp_parenthesized_pdparam_list: '(' $@33 sp_pdparam_list ')' */ +#line 3211 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 31347 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 272: /* sp_proc_stmts: %empty */ +#line 3221 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 274: /* sp_proc_stmts1: sp_proc_stmt ';' */ +#line 3226 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 276: /* optionally_qualified_column_ident: sp_decl_ident */ +#line 3233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 277: /* optionally_qualified_column_ident: sp_decl_ident '.' ident */ +#line 3239 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 278: /* optionally_qualified_column_ident: sp_decl_ident '.' ident '.' ident */ +#line 3245 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 31389 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 279: /* row_field_definition: row_field_name field_type */ +#line 3255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 31398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 280: /* row_field_definition_list: row_field_definition */ +#line 3263 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition_list)= Row_definition_list::make(thd->mem_root, (yyvsp[0].spvar_definition)))) + MYSQL_YYABORT; + } +#line 31407 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 281: /* row_field_definition_list: row_field_definition_list ',' row_field_definition */ +#line 3268 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.spvar_definition_list)= (yyvsp[-2].spvar_definition_list))->append_uniq(thd->mem_root, (yyvsp[0].spvar_definition))) + MYSQL_YYABORT; + } +#line 31416 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 282: /* row_type_body: '(' row_field_definition_list ')' */ +#line 3275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_definition_list)= (yyvsp[-1].spvar_definition_list); } +#line 31422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 283: /* sp_decl_idents_init_vars: sp_decl_idents */ +#line 3280 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_variable_declarations_init(thd, (yyvsp[0].num)); + } +#line 31430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 284: /* $@34: %empty */ +#line 3288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 31439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 285: /* sp_decl_variable_list: sp_decl_idents_init_vars field_type $@34 sp_opt_default */ +#line 3293 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_finalize(thd, (yyvsp[-3].num), + &Lex->last_field[0], + (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 31451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 286: /* sp_decl_variable_list: sp_decl_idents_init_vars ROW_SYM row_type_body sp_opt_default */ +#line 3303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_row_finalize(thd, (yyvsp[-3].num), (yyvsp[-1].spvar_definition_list), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 31461 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 288: /* $@35: %empty */ +#line 3313 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_init(thd, (yyvsp[-2].num)))) + MYSQL_YYABORT; + } +#line 31470 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 289: /* sp_decl_handler: sp_handler_type HANDLER_SYM FOR_SYM $@35 sp_hcond_list sp_proc_stmt */ +#line 3318 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_finalize(thd, (yyvsp[-5].num)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).curs= 0; + (yyval.spblock).hndlrs= 1; + } +#line 31481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 292: /* sp_cursor_stmt_lex: %empty */ +#line 3333 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->lex->sphead); + if (unlikely(!((yyval.sp_cursor_stmt)= new (thd->mem_root) + sp_lex_cursor(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 31492 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 293: /* $@36: %empty */ +#line 3343 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].sp_cursor_stmt)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 31503 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 294: /* sp_cursor_stmt: sp_cursor_stmt_lex $@36 select */ +#line 3350 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex == (yyvsp[-2].sp_cursor_stmt)); + Lex->pop_select(); //main select + if (unlikely((yyvsp[-2].sp_cursor_stmt)->stmt_finalize(thd)) || + unlikely((yyvsp[-2].sp_cursor_stmt)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + (yyval.sp_cursor_stmt)= (yyvsp[-2].sp_cursor_stmt); + } +#line 31516 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 295: /* sp_handler_type: EXIT_MARIADB_SYM */ +#line 3361 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 31522 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 296: /* sp_handler_type: CONTINUE_MARIADB_SYM */ +#line 3362 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 31528 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 297: /* sp_handler_type: EXIT_ORACLE_SYM */ +#line 3363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 31534 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 298: /* sp_handler_type: CONTINUE_ORACLE_SYM */ +#line 3364 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 31540 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 299: /* sp_hcond_list: sp_hcond_element */ +#line 3370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 31546 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 300: /* sp_hcond_list: sp_hcond_list ',' sp_hcond_element */ +#line 3372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)+= 1; } +#line 31552 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 301: /* sp_hcond_element: sp_hcond */ +#line 3377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont->parent_context(); + + if (unlikely(ctx->check_duplicate_handler((yyvsp[0].spcondvalue)))) + my_yyabort_error((ER_SP_DUP_HANDLER, MYF(0))); + + sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); + i->add_condition((yyvsp[0].spcondvalue)); + } +#line 31568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 302: /* sp_cond: ulong_num */ +#line 3392 "/home/buildbot/git/sql/sql_yacc.yy" + { /* mysql errno */ + if (unlikely((yyvsp[0].ulong_num) == 0)) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "CONDITION", "0")); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].ulong_num)); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 304: /* sqlstate: SQLSTATE_SYM opt_value TEXT_STRING_literal */ +#line 3404 "/home/buildbot/git/sql/sql_yacc.yy" + { /* SQLSTATE */ + + /* + An error is triggered: + - if the specified string is not a valid SQLSTATE, + - or if it represents the completion condition -- it is not + allowed to SIGNAL, or declare a handler for the completion + condition. + */ + if (unlikely(!is_sqlstate_valid(&(yyvsp[0].lex_str)) || + is_sqlstate_completion((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_SP_BAD_SQLSTATE, MYF(0), (yyvsp[0].lex_str).str)); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].lex_str).str); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31601 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 305: /* opt_value: %empty */ +#line 3423 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31607 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 306: /* opt_value: VALUE_SYM */ +#line 3424 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 31613 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 307: /* sp_hcond: sp_cond */ +#line 3429 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= (yyvsp[0].spcondvalue); + } +#line 31621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 308: /* sp_hcond: ident */ +#line 3433 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= Lex->spcont->find_declared_or_predefined_condition(thd, &(yyvsp[0].ident_sys)); + if (unlikely((yyval.spcondvalue) == NULL)) + my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 31631 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 309: /* sp_hcond: SQLWARNING_SYM */ +#line 3439 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::WARNING); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 310: /* sp_hcond: not FOUND_SYM */ +#line 3445 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::NOT_FOUND); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 311: /* sp_hcond: SQLEXCEPTION_SYM */ +#line 3451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31661 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 312: /* sp_hcond: OTHERS_ORACLE_SYM */ +#line 3457 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 31671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 313: /* raise_stmt_oracle: RAISE_ORACLE_SYM opt_set_signal_information */ +#line 3467 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 31680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 314: /* raise_stmt_oracle: RAISE_ORACLE_SYM signal_value opt_set_signal_information */ +#line 3472 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 31689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 315: /* signal_stmt: SIGNAL_SYM signal_value opt_set_signal_information */ +#line 3480 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue))) + MYSQL_YYABORT; + } +#line 31698 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 316: /* signal_value: ident */ +#line 3488 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spcondvalue)= Lex->stmt_signal_value((yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31707 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 317: /* signal_value: sqlstate */ +#line 3493 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 31713 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 318: /* opt_signal_value: %empty */ +#line 3498 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= NULL; } +#line 31719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 319: /* opt_signal_value: signal_value */ +#line 3500 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 31725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 320: /* opt_set_signal_information: %empty */ +#line 3505 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->m_parser_state->m_yacc.m_set_signal_info.clear(); + } +#line 31733 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 322: /* signal_information_item_list: signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3513 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + info->clear(); + info->m_item[index]= (yyvsp[0].item); + } +#line 31745 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 323: /* signal_information_item_list: signal_information_item_list ',' signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3522 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + if (unlikely(info->m_item[index] != NULL)) + my_yyabort_error((ER_DUP_SIGNAL_SET, MYF(0), + Diag_condition_item_names[index].str)); + info->m_item[index]= (yyvsp[0].item); + } +#line 31759 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 324: /* signal_allowed_expr: literal */ +#line 3538 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31765 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 325: /* signal_allowed_expr: variable */ +#line 3540 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].item)->type() == Item::FUNC_ITEM) + { + Item_func *item= (Item_func*) (yyvsp[0].item); + if (unlikely(item->functype() == Item_func::SUSERVAR_FUNC)) + { + /* + Don't allow the following syntax: + SIGNAL/RESIGNAL ... + SET = @foo := expr + */ + thd->parse_error(); + MYSQL_YYABORT; + } + } + (yyval.item)= (yyvsp[0].item); + } +#line 31787 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 326: /* signal_allowed_expr: simple_ident */ +#line 3558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 327: /* signal_condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CLASS_ORIGIN; } +#line 31799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 328: /* signal_condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3566 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SUBCLASS_ORIGIN; } +#line 31805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 329: /* signal_condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_CATALOG; } +#line 31811 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 330: /* signal_condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_SCHEMA; } +#line 31817 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 331: /* signal_condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3572 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_NAME; } +#line 31823 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 332: /* signal_condition_information_item_name: CATALOG_NAME_SYM */ +#line 3574 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CATALOG_NAME; } +#line 31829 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 333: /* signal_condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SCHEMA_NAME; } +#line 31835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 334: /* signal_condition_information_item_name: TABLE_NAME_SYM */ +#line 3578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_TABLE_NAME; } +#line 31841 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 335: /* signal_condition_information_item_name: COLUMN_NAME_SYM */ +#line 3580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_COLUMN_NAME; } +#line 31847 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 336: /* signal_condition_information_item_name: CURSOR_NAME_SYM */ +#line 3582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CURSOR_NAME; } +#line 31853 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 337: /* signal_condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MESSAGE_TEXT; } +#line 31859 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 338: /* signal_condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MYSQL_ERRNO; } +#line 31865 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 339: /* signal_condition_information_item_name: ROW_NUMBER_SYM */ +#line 3588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_ROW_NUMBER; } +#line 31871 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 340: /* resignal_stmt: RESIGNAL_SYM opt_signal_value opt_set_signal_information */ +#line 3593 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 31880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 341: /* get_diagnostics: GET_SYM which_area DIAGNOSTICS_SYM diagnostics_information */ +#line 3601 "/home/buildbot/git/sql/sql_yacc.yy" + { + Diagnostics_information *info= (yyvsp[0].diag_info); + + info->set_which_da((yyvsp[-2].diag_area)); + + Lex->sql_command= SQLCOM_GET_DIAGNOSTICS; + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_get_diagnostics(info); + + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 31896 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 342: /* which_area: %empty */ +#line 3616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31902 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 343: /* which_area: CURRENT_SYM */ +#line 3618 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 344: /* diagnostics_information: statement_information */ +#line 3623 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Statement_information((yyvsp[0].stmt_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31918 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 345: /* diagnostics_information: CONDITION_SYM condition_number condition_information */ +#line 3629 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Condition_information((yyvsp[-1].item), (yyvsp[0].cond_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31928 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 346: /* statement_information: statement_information_item */ +#line 3638 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.stmt_info_list) == NULL) || + unlikely((yyval.stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 31939 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 347: /* statement_information: statement_information ',' statement_information_item */ +#line 3645 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.stmt_info_list)= (yyvsp[-2].stmt_info_list); + } +#line 31949 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 348: /* statement_information_item: simple_target_specification '=' statement_information_item_name */ +#line 3654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_item)= new (thd->mem_root) Statement_information_item((yyvsp[0].stmt_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.stmt_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 31959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 349: /* simple_target_specification: ident_cli */ +#line 3663 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= thd->lex->create_item_for_sp_var(&(yyvsp[0].ident_cli), NULL)))) + MYSQL_YYABORT; + } +#line 31968 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 350: /* simple_target_specification: '@' ident_or_text */ +#line 3668 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 31983 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 351: /* statement_information_item_name: NUMBER_MARIADB_SYM */ +#line 3682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31989 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 352: /* statement_information_item_name: NUMBER_ORACLE_SYM */ +#line 3684 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31995 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 353: /* statement_information_item_name: ROW_COUNT_SYM */ +#line 3686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::ROW_COUNT; } +#line 32001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 354: /* condition_number: signal_allowed_expr */ +#line 3695 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 32007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 355: /* condition_information: condition_information_item */ +#line 3700 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.cond_info_list) == NULL) || + unlikely((yyval.cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 32018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 356: /* condition_information: condition_information ',' condition_information_item */ +#line 3707 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.cond_info_list)= (yyvsp[-2].cond_info_list); + } +#line 32028 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 357: /* condition_information_item: simple_target_specification '=' condition_information_item_name */ +#line 3716 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_item)= new (thd->mem_root) Condition_information_item((yyvsp[0].cond_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.cond_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 32038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 358: /* condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3725 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CLASS_ORIGIN; } +#line 32044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 359: /* condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SUBCLASS_ORIGIN; } +#line 32050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 360: /* condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_CATALOG; } +#line 32056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 361: /* condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3731 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_SCHEMA; } +#line 32062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 362: /* condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_NAME; } +#line 32068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 363: /* condition_information_item_name: CATALOG_NAME_SYM */ +#line 3735 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CATALOG_NAME; } +#line 32074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 364: /* condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3737 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SCHEMA_NAME; } +#line 32080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 365: /* condition_information_item_name: TABLE_NAME_SYM */ +#line 3739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::TABLE_NAME; } +#line 32086 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 366: /* condition_information_item_name: COLUMN_NAME_SYM */ +#line 3741 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::COLUMN_NAME; } +#line 32092 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 367: /* condition_information_item_name: CURSOR_NAME_SYM */ +#line 3743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CURSOR_NAME; } +#line 32098 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 368: /* condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3745 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MESSAGE_TEXT; } +#line 32104 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 369: /* condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3747 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MYSQL_ERRNO; } +#line 32110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 370: /* condition_information_item_name: RETURNED_SQLSTATE_SYM */ +#line 3749 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::RETURNED_SQLSTATE; } +#line 32116 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 371: /* condition_information_item_name: ROW_NUMBER_SYM */ +#line 3751 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::ROW_NUMBER; } +#line 32122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 373: /* sp_decl_ident: keyword_sp_decl */ +#line 3757 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_ident_cli(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 32131 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 374: /* sp_decl_idents: sp_decl_ident */ +#line 3765 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= 1; + } +#line 32147 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 375: /* sp_decl_idents: sp_decl_idents ',' ident */ +#line 3777 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= (yyvsp[-2].num) + 1; + } +#line 32163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 376: /* $@37: %empty */ +#line 3792 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sphead->new_cont_backpatch(NULL); + } +#line 32173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 377: /* sp_proc_stmt_if: IF_SYM $@37 sp_if END IF_SYM */ +#line 3798 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sphead->do_cont_backpatch(); } +#line 32179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 378: /* $@38: %empty */ +#line 3802 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + lex->sphead->reset_lex(thd); + /* + We should not push main select here, it will be done or not + done by the statement, we just provide only a new LEX for the + statement here as if it is start of parsing a new statement. + */ + lex->sphead->m_tmp_query= lip->get_tok_start(); + } +#line 32196 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 379: /* sp_proc_stmt_statement: $@38 sp_statement */ +#line 3815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->sp_proc_stmt_statement_finalize(thd, yychar == YYEMPTY) || + Lex->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 32206 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 382: /* $@39: %empty */ +#line 3830 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= (yyvsp[0].expr_lex)->sphead; + if (unlikely(sp->m_handler->add_instr_freturn(thd, sp, (yyvsp[0].expr_lex)->spcont, + (yyvsp[0].expr_lex)->get_item(), (yyvsp[0].expr_lex)))) + MYSQL_YYABORT; + } +#line 32217 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 383: /* sp_proc_stmt_return: RETURN_ALLMODES_SYM expr_lex $@39 */ +#line 3836 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 384: /* sp_proc_stmt_return: RETURN_ORACLE_SYM */ +#line 3838 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + if (unlikely(sp->m_handler->add_instr_preturn(thd, sp, + lex->spcont))) + MYSQL_YYABORT; + } +#line 32235 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 385: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM */ +#line 3849 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 32244 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 386: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident */ +#line 3854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, &(yyvsp[0].ident_sys), NULL))) + MYSQL_YYABORT; + } +#line 32253 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 387: /* $@40: %empty */ +#line 3859 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 32262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 388: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM WHEN_SYM expr_lex $@40 */ +#line 3863 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32268 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 389: /* $@41: %empty */ +#line 3865 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 32277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 390: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident WHEN_SYM expr_lex $@41 */ +#line 3869 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 391: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM */ +#line 3874 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd))) + MYSQL_YYABORT; + } +#line 32292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 392: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident */ +#line 3879 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 393: /* $@42: %empty */ +#line 3884 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd))) + MYSQL_YYABORT; + } +#line 32310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 394: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM WHEN_SYM expr_lex $@42 */ +#line 3888 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32316 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 395: /* $@43: %empty */ +#line 3890 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd, &(yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 32325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 396: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident WHEN_SYM expr_lex $@43 */ +#line 3894 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 32331 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 397: /* sp_proc_stmt_leave: LEAVE_SYM label_ident */ +#line 3900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_leave_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 398: /* sp_proc_stmt_iterate: ITERATE_SYM label_ident */ +#line 3908 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_iterate_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 399: /* sp_proc_stmt_goto_oracle: GOTO_ORACLE_SYM label_ident */ +#line 3916 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_goto_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 32358 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 400: /* @44: %empty */ +#line 3924 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.expr_lex)= new (thd->mem_root) + sp_expr_lex(thd, thd->lex)))) + MYSQL_YYABORT; + Lex->sphead->reset_lex(thd, (yyval.expr_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 32372 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 401: /* expr_lex: @44 expr */ +#line 3934 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.expr_lex)= (yyvsp[-1].expr_lex); + (yyval.expr_lex)->set_item((yyvsp[0].item)); + Lex->pop_select(); //min select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + if ((yyval.expr_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 32386 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 402: /* assignment_source_lex: %empty */ +#line 3947 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.assignment_lex)= new (thd->mem_root) + sp_assignment_lex(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 32397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 403: /* $@45: %empty */ +#line 3957 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 32408 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 404: /* assignment_source_expr: assignment_source_lex $@45 expr */ +#line 3964 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), thd->free_list); + thd->free_list= NULL; + Lex->pop_select(); //min select + if ((yyval.assignment_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 32422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 405: /* $@46: %empty */ +#line 3977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + Lex->current_select->parsing_place= FOR_LOOP_BOUND; + } +#line 32433 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 406: /* for_loop_bound_expr: assignment_source_lex $@46 expr */ +#line 3984 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), NULL); + Lex->pop_select(); //main select + if (unlikely((yyval.assignment_lex)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + Lex->current_select->parsing_place= NO_MATTER; + } +#line 32447 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 407: /* cursor_actual_parameters: assignment_source_expr */ +#line 3997 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.sp_assignment_lex_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 32457 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 408: /* cursor_actual_parameters: cursor_actual_parameters ',' assignment_source_expr */ +#line 4003 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.sp_assignment_lex_list)= (yyvsp[-2].sp_assignment_lex_list); + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 32466 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 409: /* opt_parenthesized_cursor_actual_parameters: %empty */ +#line 4010 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= NULL; } +#line 32472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 410: /* opt_parenthesized_cursor_actual_parameters: '(' cursor_actual_parameters ')' */ +#line 4011 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= (yyvsp[-1].sp_assignment_lex_list); } +#line 32478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 414: /* sp_proc_stmt_open: OPEN_SYM ident opt_parenthesized_cursor_actual_parameters */ +#line 4022 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_open_cursor(thd, &(yyvsp[-1].ident_sys), (yyvsp[0].sp_assignment_lex_list)))) + MYSQL_YYABORT; + } +#line 32487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 415: /* sp_proc_stmt_fetch_head: FETCH_SYM ident INTO */ +#line 4030 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 32496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 416: /* sp_proc_stmt_fetch_head: FETCH_SYM FROM ident INTO */ +#line 4035 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 32505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 417: /* sp_proc_stmt_fetch_head: FETCH_SYM NEXT_SYM FROM ident INTO */ +#line 4040 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 32514 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 418: /* sp_proc_stmt_fetch: sp_proc_stmt_fetch_head sp_fetch_list */ +#line 4047 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32520 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 419: /* sp_proc_stmt_fetch: FETCH_SYM GROUP_SYM NEXT_SYM ROW_SYM */ +#line 4049 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_agg_cfetch())) + MYSQL_YYABORT; + } +#line 32529 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 420: /* sp_proc_stmt_close: CLOSE_SYM ident */ +#line 4057 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint offset; + sp_instr_cclose *i; + + if (unlikely(!lex->spcont->find_cursor(&(yyvsp[0].ident_sys), &offset, false))) + my_yyabort_error((ER_SP_CURSOR_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + i= new (thd->mem_root) + sp_instr_cclose(sp->instructions(), lex->spcont, offset); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 32548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 421: /* sp_fetch_list: ident */ +#line 4075 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 32568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 422: /* sp_fetch_list: sp_fetch_list ',' ident */ +#line 4091 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 32588 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 423: /* $@47: %empty */ +#line 4110 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_if_expr(thd))) + MYSQL_YYABORT; + } +#line 32597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 424: /* $@48: %empty */ +#line 4115 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-3].expr_lex)->sp_if_after_statements(thd))) + MYSQL_YYABORT; + } +#line 32606 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 425: /* sp_if: expr_lex THEN_SYM $@47 sp_if_then_statements $@48 sp_elseifs */ +#line 4120 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sphead->backpatch(lex->spcont->pop_label()); + } +#line 32616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 430: /* $@49: %empty */ +#line 4136 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + + /** + An example of the CASE statement in use is +
    +            CREATE PROCEDURE proc_19194_simple(i int)
    +            BEGIN
    +              DECLARE str CHAR(10);
    +
    +              CASE i
    +                WHEN 1 THEN SET str="1";
    +                WHEN 2 THEN SET str="2";
    +                WHEN 3 THEN SET str="3";
    +                ELSE SET str="unknown";
    +              END CASE;
    +
    +              SELECT str;
    +            END
    +            
    + The actions are used to generate the following code: +
    +            SHOW PROCEDURE CODE proc_19194_simple;
    +            Pos     Instruction
    +            0       set str@1 NULL
    +            1       set_case_expr (12) 0 i@0
    +            2       jump_if_not 5(12) (case_expr@0 = 1)
    +            3       set str@1 _latin1'1'
    +            4       jump 12
    +            5       jump_if_not 8(12) (case_expr@0 = 2)
    +            6       set str@1 _latin1'2'
    +            7       jump 12
    +            8       jump_if_not 11(12) (case_expr@0 = 3)
    +            9       set str@1 _latin1'3'
    +            10      jump 12
    +            11      set str@1 _latin1'unknown'
    +            12      stmt 0 "SELECT str"
    +            
    + */ + + Lex->sphead->new_cont_backpatch(NULL); + + /* + BACKPATCH: Creating target label for the jump to after END CASE + (instruction 12 in the example) + */ + Lex->spcont->push_label(thd, &empty_clex_str, Lex->sphead->instructions()); + } +#line 32670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 431: /* case_stmt_specification: CASE_SYM $@49 case_stmt_body else_clause_opt END CASE_SYM */ +#line 4189 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + BACKPATCH: Resolving forward jump from + "case_stmt_action_then" to after END CASE + (jump from instruction 4 to 12, 7 to 12 ... in the example) + */ + Lex->sphead->backpatch(Lex->spcont->pop_label()); + + if ((yyvsp[-3].num)) + Lex->spcont->pop_case_expr_id(); + + Lex->sphead->do_cont_backpatch(); + } +#line 32688 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 432: /* $@50: %empty */ +#line 4206 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_expr())) + MYSQL_YYABORT; + } +#line 32697 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 433: /* case_stmt_body: expr_lex $@50 simple_when_clause_list */ +#line 4211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 32703 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 434: /* case_stmt_body: searched_when_clause_list */ +#line 4213 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 32709 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 439: /* $@51: %empty */ +#line 4228 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Simple case: = */ + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(true))) + MYSQL_YYABORT; + } +#line 32719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 440: /* simple_when_clause: WHEN_SYM expr_lex $@51 THEN_SYM sp_case_then_statements */ +#line 4235 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 32728 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 441: /* $@52: %empty */ +#line 4243 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(false))) + MYSQL_YYABORT; + } +#line 32737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 442: /* searched_when_clause: WHEN_SYM expr_lex $@52 THEN_SYM sp_case_then_statements */ +#line 4249 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 32746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 443: /* else_clause_opt: %empty */ +#line 4257 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint ip= sp->instructions(); + sp_instr_error *i= new (thd->mem_root) + sp_instr_error(ip, lex->spcont, ER_SP_CASE_NOT_FOUND); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 32761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 445: /* sp_opt_label: %empty */ +#line 4271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 32767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 446: /* sp_opt_label: label_ident */ +#line 4272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 32773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 447: /* opt_sp_for_loop_direction: %empty */ +#line 4277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 32779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 448: /* opt_sp_for_loop_direction: REVERSE_SYM */ +#line 4278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= -1; } +#line 32785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 449: /* sp_for_loop_index_and_bounds: ident_for_loop_index sp_for_loop_bounds */ +#line 4283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_declarations(thd, &(yyval.for_loop), &(yyvsp[-1].ident_sys), (yyvsp[0].for_loop_bounds)))) + MYSQL_YYABORT; + } +#line 32794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 450: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr DOT_DOT_SYM for_loop_bound_expr */ +#line 4292 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds)= Lex_for_loop_bounds_intrange((yyvsp[-3].num), (yyvsp[-2].assignment_lex), (yyvsp[0].assignment_lex)); + } +#line 32802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 451: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr */ +#line 4296 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds).m_direction= (yyvsp[-1].num); + (yyval.for_loop_bounds).m_index= (yyvsp[0].assignment_lex); + (yyval.for_loop_bounds).m_target_bound= NULL; + (yyval.for_loop_bounds).m_implicit_cursor= false; + } +#line 32813 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 452: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')' */ +#line 4303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_implicit_cursor_statement(thd, &(yyval.for_loop_bounds), + (yyvsp[-1].sp_cursor_stmt)))) + MYSQL_YYABORT; + } +#line 32823 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 453: /* loop_body: sp_proc_stmts1 END LOOP_SYM */ +#line 4312 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + uint ip= lex->sphead->instructions(); + sp_label *lab= lex->spcont->last_label(); /* Jumping back */ + sp_instr_jump *i= new (thd->mem_root) + sp_instr_jump(ip, lex->spcont, lab->ip); + if (unlikely(i == NULL) || + unlikely(lex->sphead->add_instr(i))) + MYSQL_YYABORT; + } +#line 32838 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 454: /* repeat_body: sp_proc_stmts1 UNTIL_SYM expr_lex END REPEAT_SYM */ +#line 4326 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].expr_lex)->sp_repeat_loop_finalize(thd)) + MYSQL_YYABORT; + } +#line 32847 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 455: /* pop_sp_loop_label: sp_opt_label */ +#line 4334 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_pop_loop_label(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 32856 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 456: /* $@53: %empty */ +#line 4342 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32865 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 457: /* sp_labeled_control: sp_control_label LOOP_SYM $@53 loop_body pop_sp_loop_label */ +#line 4347 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32871 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 458: /* $@54: %empty */ +#line 4349 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 459: /* sp_labeled_control: sp_control_label WHILE_SYM $@54 while_body pop_sp_loop_label */ +#line 4354 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32886 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 460: /* $@55: %empty */ +#line 4356 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 461: /* $@56: %empty */ +#line 4361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-3].lex_str)))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32906 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 462: /* $@57: %empty */ +#line 4368 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 32915 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 463: /* sp_labeled_control: sp_control_label FOR_SYM $@55 sp_for_loop_index_and_bounds $@56 for_loop_statements $@57 pop_sp_loop_label */ +#line 4373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-4].for_loop)))) + MYSQL_YYABORT; + } +#line 32924 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 464: /* $@58: %empty */ +#line 4378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 465: /* sp_labeled_control: sp_control_label REPEAT_SYM $@58 repeat_body pop_sp_loop_label */ +#line 4383 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32939 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 466: /* $@59: %empty */ +#line 4388 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32948 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 467: /* sp_unlabeled_control: LOOP_SYM $@59 loop_body */ +#line 4393 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32956 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 468: /* $@60: %empty */ +#line 4397 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 469: /* sp_unlabeled_control: WHILE_SYM $@60 while_body */ +#line 4402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 470: /* $@61: %empty */ +#line 4406 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32984 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 471: /* $@62: %empty */ +#line 4413 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32995 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 472: /* sp_unlabeled_control: FOR_SYM $@61 sp_for_loop_index_and_bounds $@62 for_loop_statements */ +#line 4420 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + Lex->sp_pop_loop_empty_label(thd); // The inner WHILE block + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 33007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 473: /* $@63: %empty */ +#line 4428 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 33016 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 474: /* sp_unlabeled_control: REPEAT_SYM $@63 repeat_body */ +#line 4433 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 33024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 475: /* trg_action_time: BEFORE_SYM */ +#line 4440 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_BEFORE; } +#line 33030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 476: /* trg_action_time: AFTER_SYM */ +#line 4442 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_AFTER; } +#line 33036 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 477: /* trg_event: INSERT */ +#line 4447 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_INSERT; } +#line 33042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 478: /* trg_event: UPDATE_SYM */ +#line 4449 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_UPDATE; } +#line 33048 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 479: /* trg_event: DELETE_SYM */ +#line 4451 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_DELETE; } +#line 33054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 480: /* $@64: %empty */ +#line 4456 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.option_list= NULL; } +#line 33060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 481: /* create_body: create_field_list_parens $@64 opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33066 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 482: /* create_body: opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4458 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33072 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 483: /* create_body: create_like */ +#line 4460 "/home/buildbot/git/sql/sql_yacc.yy" + { + + Lex->create_info.add(DDL_options_st::OPT_LIKE); + TABLE_LIST *src_table= Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, 0, TL_READ, MDL_SHARED_READ); + if (unlikely(! src_table)) + MYSQL_YYABORT; + /* CREATE TABLE ... LIKE is not allowed for views. */ + src_table->required_type= TABLE_TYPE_NORMAL; + } +#line 33087 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 484: /* create_like: LIKE table_ident */ +#line 4473 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[0].table); } +#line 33093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 485: /* create_like: LEFT_PAREN_LIKE LIKE table_ident ')' */ +#line 4474 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[-1].table); } +#line 33099 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 486: /* opt_create_select: %empty */ +#line 4478 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 487: /* opt_create_select: opt_duplicate opt_as create_select_query_expression opt_versioning_option */ +#line 4481 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.add(DDL_options_st::OPT_CREATE_SELECT); + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 33115 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 488: /* create_select_query_expression: query_expression */ +#line 4490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_insert_select((yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 33124 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 489: /* create_select_query_expression: LEFT_PAREN_WITH with_clause query_expression_no_with_clause ')' */ +#line 4495 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *first_select= (yyvsp[-1].select_lex_unit)->first_select(); + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to(first_select); + if (Lex->parsed_insert_select(first_select)) + MYSQL_YYABORT; + } +#line 33136 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 490: /* opt_create_partitioning: opt_partitioning */ +#line 4506 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Remove all tables used in PARTITION clause from the global table + list. Partitioning with subqueries is not allowed anyway. + */ + TABLE_LIST *last_non_sel_table= Lex->create_last_non_select_table; + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + } +#line 33150 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 491: /* opt_partitioning: %empty */ +#line 4542 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33156 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 493: /* $@65: %empty */ +#line 4548 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + if (lex->sql_command == SQLCOM_ALTER_TABLE) + { + lex->alter_info.partition_flags|= ALTER_PARTITION_INFO; + } + } +#line 33171 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 495: /* have_partitioning: %empty */ +#line 4563 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + LEX_CSTRING partition_name={STRING_WITH_LEN("partition")}; + if (unlikely(!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN))) + my_yyabort_error((ER_OPTION_PREVENTS_STATEMENT, MYF(0), + "--skip-partition")); +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), "partitioning", + "--with-plugin-partition")); +#endif + } +#line 33187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 496: /* $@66: %empty */ +#line 4578 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->part_info)) + { + thd->parse_error(ER_PARTITION_ENTRY_ERROR); + MYSQL_YYABORT; + } + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + We enter here when opening the frm file to translate + partition info string into part_info data structure. + */ + } +#line 33205 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 497: /* partition_entry: PARTITION_SYM $@66 partition */ +#line 4592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 33213 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 498: /* $@67: %empty */ +#line 4599 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->safe_to_cache_query= 1; } +#line 33219 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 500: /* part_type_def: opt_linear KEY_SYM opt_key_algo '(' part_field_list ')' */ +#line 4605 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->list_of_part_fields= TRUE; + part_info->column_list= FALSE; + part_info->part_type= HASH_PARTITION; + } +#line 33230 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 501: /* $@68: %empty */ +#line 4612 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= HASH_PARTITION; } +#line 33236 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 502: /* part_type_def: opt_linear HASH_SYM $@68 part_func */ +#line 4613 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 503: /* part_type_def: RANGE_SYM part_func */ +#line 4615 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 33248 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 504: /* part_type_def: RANGE_SYM part_column_list */ +#line 4617 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 33254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 505: /* $@69: %empty */ +#line 4619 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_PART_FUNC; + } +#line 33262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 506: /* part_type_def: LIST_SYM $@69 part_func */ +#line 4623 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->part_type= LIST_PARTITION; + Select->parsing_place= NO_MATTER; + } +#line 33271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 507: /* part_type_def: LIST_SYM part_column_list */ +#line 4628 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= LIST_PARTITION; } +#line 33277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 508: /* $@70: %empty */ +#line 4630 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->vers_init_info(thd))) + MYSQL_YYABORT; + } +#line 33286 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 510: /* opt_linear: %empty */ +#line 4638 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 511: /* opt_linear: LINEAR_SYM */ +#line 4640 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->linear_hash_ind= TRUE;} +#line 33298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 512: /* opt_key_algo: %empty */ +#line 4645 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_NONE;} +#line 33304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 513: /* opt_key_algo: ALGORITHM_SYM '=' real_ulong_num */ +#line 4647 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch ((yyvsp[0].ulong_num)) { + case 1: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_51; + break; + case 2: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_55; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 33322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 514: /* part_field_list: %empty */ +#line 4663 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 515: /* part_field_list: part_field_item_list */ +#line 4664 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 516: /* part_field_item_list: part_field_item */ +#line 4668 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 517: /* part_field_item_list: part_field_item_list ',' part_field_item */ +#line 4669 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 518: /* part_field_item: ident */ +#line 4674 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_columns++; + if (unlikely(part_info->part_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + if (unlikely(part_info->num_columns > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of partition fields")); + } +#line 33361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 519: /* part_column_list: COLUMNS '(' part_field_list ')' */ +#line 4688 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->column_list= TRUE; + part_info->list_of_part_fields= TRUE; + } +#line 33371 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 520: /* part_func: '(' part_func_expr ')' */ +#line 4698 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->set_part_expr(thd, (yyvsp[-1].item), FALSE))) + MYSQL_YYABORT; + part_info->num_columns= 1; + part_info->column_list= FALSE; + } +#line 33383 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 521: /* sub_part_func: '(' part_func_expr ')' */ +#line 4709 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->set_part_expr(thd, (yyvsp[-1].item), TRUE))) + MYSQL_YYABORT; + } +#line 33392 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 522: /* opt_num_parts: %empty */ +#line 4717 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 523: /* opt_num_parts: PARTITIONS_SYM real_ulong_num */ +#line 4719 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + partition_info *part_info= Lex->part_info; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "partitions")); + + part_info->num_parts= num_parts; + part_info->use_default_num_partitions= FALSE; + } +#line 33412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 524: /* opt_sub_part: %empty */ +#line 4731 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33418 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 525: /* $@71: %empty */ +#line 4733 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->subpart_type= HASH_PARTITION; } +#line 33424 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 526: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear HASH_SYM sub_part_func $@71 opt_num_subparts */ +#line 4734 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 527: /* $@72: %empty */ +#line 4737 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->subpart_type= HASH_PARTITION; + part_info->list_of_subpart_fields= TRUE; + } +#line 33440 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 528: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear KEY_SYM opt_key_algo '(' sub_part_field_list ')' $@72 opt_num_subparts */ +#line 4742 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33446 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 529: /* sub_part_field_list: sub_part_field_item */ +#line 4746 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33452 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 530: /* sub_part_field_list: sub_part_field_list ',' sub_part_field_item */ +#line 4747 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33458 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 531: /* sub_part_field_item: ident */ +#line 4752 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->subpart_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + + if (unlikely(part_info->subpart_field_list.elements > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of subpartition fields")); + } +#line 33473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 532: /* part_func_expr: bit_expr */ +#line 4766 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + (yyval.item)=(yyvsp[0].item); + } +#line 33486 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 533: /* opt_num_subparts: %empty */ +#line 4777 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33492 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 534: /* opt_num_subparts: SUBPARTITIONS_SYM real_ulong_num */ +#line 4779 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + LEX *lex= Lex; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "subpartitions")); + lex->part_info->num_subparts= num_parts; + lex->part_info->use_default_num_subpartitions= FALSE; + } +#line 33505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 535: /* part_defs: %empty */ +#line 4791 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == RANGE_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "RANGE")); + if (unlikely(part_info->part_type == LIST_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "LIST")); + } +#line 33519 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 536: /* part_defs: '(' part_def_list ')' */ +#line 4801 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + uint count_curr_parts= part_info->partitions.elements; + if (part_info->num_parts != 0) + { + if (unlikely(part_info->num_parts != + count_curr_parts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_PART_ERROR); + MYSQL_YYABORT; + } + } + else if (count_curr_parts > 0) + { + part_info->num_parts= count_curr_parts; + } + part_info->count_curr_subparts= 0; + } +#line 33542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 537: /* part_def_list: part_definition */ +#line 4822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 538: /* part_def_list: part_def_list ',' part_definition */ +#line 4823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33554 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 541: /* $@73: %empty */ +#line 4833 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= new (thd->mem_root) partition_element(); + + if (unlikely(!p_elem) || + unlikely(part_info->partitions.push_back(p_elem, thd->mem_root))) + MYSQL_YYABORT; + + p_elem->part_state= PART_NORMAL; + p_elem->id= part_info->partitions.elements - 1; + part_info->curr_part_elem= p_elem; + part_info->current_partition= p_elem; + part_info->use_default_partitions= FALSE; + part_info->use_default_num_partitions= FALSE; + } +#line 33574 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 542: /* part_definition: opt_partition $@73 part_name opt_part_values opt_part_options opt_sub_partition */ +#line 4852 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 543: /* part_name: ident */ +#line 4857 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= part_info->curr_part_elem; + if (unlikely(check_ident_length(&(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + p_elem->partition_name= (yyvsp[0].ident_sys).str; + } +#line 33592 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 544: /* opt_part_values: %empty */ +#line 4868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->error_if_requires_values())) + MYSQL_YYABORT; + if (unlikely(part_info->part_type == VERSIONING_PARTITION)) + my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0), + lex->create_last_non_select_table-> + table_name.str)); + } + else + part_info->part_type= HASH_PARTITION; + } +#line 33612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 545: /* $@74: %empty */ +#line 4884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != RANGE_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "RANGE", "LESS THAN")); + } + else + part_info->part_type= RANGE_PARTITION; + } +#line 33629 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 546: /* opt_part_values: VALUES_LESS_SYM THAN_SYM $@74 part_func_max */ +#line 4896 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 547: /* $@75: %empty */ +#line 4898 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "IN")); + } + else + part_info->part_type= LIST_PARTITION; + } +#line 33652 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 548: /* opt_part_values: VALUES_IN_SYM $@75 part_values_in */ +#line 4910 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33658 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 549: /* opt_part_values: CURRENT_SYM */ +#line 4912 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_current(thd)) + MYSQL_YYABORT; +#endif + } +#line 33669 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 550: /* opt_part_values: HISTORY_SYM */ +#line 4919 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_history(thd)) + MYSQL_YYABORT; +#endif + } +#line 33680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 551: /* opt_part_values: DEFAULT */ +#line 4926 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "DEFAULT")); + } + else + part_info->part_type= LIST_PARTITION; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 552: /* part_func_max: MAXVALUE_SYM */ +#line 4946 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + + if (unlikely(part_info->num_columns && + part_info->num_columns != 1U)) + { + part_info->print_debug("Kilroy II", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + else + part_info->num_columns= 1U; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33723 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 553: /* part_func_max: part_value_item */ +#line 4963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33729 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 554: /* part_values_in: part_value_item */ +#line 4968 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + part_info->print_debug("part_values_in: part_value_item", NULL); + + if (part_info->num_columns != 1U) + { + if (unlikely(!lex->is_partition_management() || + part_info->num_columns == 0 || + part_info->num_columns > MAX_REF_PARTS)) + { + part_info->print_debug("Kilroy III", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + /* + Reorganize the current large array into a list of small + arrays with one entry in each array. This can happen + in the first partition of an ALTER TABLE statement where + we ADD or REORGANIZE partitions. Also can only happen + for LIST partitions. + */ + if (unlikely(part_info->reorganize_into_single_field_col_val(thd))) + MYSQL_YYABORT; + } + } +#line 33760 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 555: /* part_values_in: '(' part_value_list ')' */ +#line 4995 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_columns < 2U)) + { + thd->parse_error(ER_ROW_SINGLE_PARTITION_FIELD_ERROR); + MYSQL_YYABORT; + } + } +#line 33773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 556: /* part_value_list: part_value_item */ +#line 5006 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 557: /* part_value_list: part_value_list ',' part_value_item */ +#line 5007 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 558: /* $@76: %empty */ +#line 5012 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug("( part_value_item", NULL); + /* Initialisation code needed for each list of value expressions */ + if (unlikely(!(part_info->part_type == LIST_PARTITION && + part_info->num_columns == 1U) && + part_info->init_column_part(thd))) + MYSQL_YYABORT; + } +#line 33799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 559: /* $@77: %empty */ +#line 5021 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 560: /* part_value_item: '(' $@76 part_value_item_list $@77 ')' */ +#line 5023 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug(") part_value_item", NULL); + if (part_info->num_columns == 0) + part_info->num_columns= part_info->curr_list_object; + if (unlikely(part_info->num_columns != part_info->curr_list_object)) + { + /* + All value items lists must be of equal length, in some cases + which is covered by the above if-statement we don't know yet + how many columns is in the partition so the assignment above + ensures that we only report errors when we know we have an + error. + */ + part_info->print_debug("Kilroy I", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + part_info->curr_list_object= 0; + } +#line 33830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 561: /* part_value_item_list: part_value_expr_item */ +#line 5046 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33836 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 562: /* part_value_item_list: part_value_item_list ',' part_value_expr_item */ +#line 5047 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33842 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 563: /* part_value_expr_item: MAXVALUE_SYM */ +#line 5052 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == LIST_PARTITION)) + { + thd->parse_error(ER_MAXVALUE_IN_VALUES_IN); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 564: /* part_value_expr_item: bit_expr */ +#line 5063 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + Item *part_expr= (yyvsp[0].item); + + if (unlikely(!lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_column_list_value(thd, part_expr))) + MYSQL_YYABORT; + } +#line 33875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 565: /* opt_sub_partition: %empty */ +#line 5081 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_subparts != 0 && + !part_info->use_default_subpartitions)) + { + /* + We come here when we have defined subpartitions on the first + partition but not on all the subsequent partitions. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } +#line 33893 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 566: /* opt_sub_partition: '(' sub_part_list ')' */ +#line 5095 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (part_info->num_subparts != 0) + { + if (unlikely(part_info->num_subparts != + part_info->count_curr_subparts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } + else if (part_info->count_curr_subparts > 0) + { + if (unlikely(part_info->partitions.elements > 1)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + part_info->num_subparts= part_info->count_curr_subparts; + } + part_info->count_curr_subparts= 0; + } +#line 33920 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 567: /* sub_part_list: sub_part_definition */ +#line 5120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33926 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 568: /* sub_part_list: sub_part_list ',' sub_part_definition */ +#line 5121 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33932 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 569: /* $@78: %empty */ +#line 5126 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *curr_part= part_info->current_partition; + partition_element *sub_p_elem= new (thd->mem_root) + partition_element(curr_part); + if (unlikely(part_info->use_default_subpartitions && + part_info->partitions.elements >= 2)) + { + /* + create table t1 (a int) + partition by list (a) subpartition by hash (a) + (partition p0 values in (1), + partition p1 values in (2) subpartition sp11); + causes use to arrive since we are on the second + partition, but still use_default_subpartitions + is set. When we come here we're processing at least + the second partition (the current partition processed + have already been put into the partitions list. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + if (unlikely(!sub_p_elem) || + unlikely(curr_part->subpartitions.push_back(sub_p_elem, thd->mem_root))) + MYSQL_YYABORT; + + sub_p_elem->id= curr_part->subpartitions.elements - 1; + part_info->curr_part_elem= sub_p_elem; + part_info->use_default_subpartitions= FALSE; + part_info->use_default_num_subpartitions= FALSE; + part_info->count_curr_subparts++; + } +#line 33969 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 570: /* sub_part_definition: SUBPARTITION_SYM $@78 sub_name opt_subpart_options */ +#line 5158 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 571: /* sub_name: ident_or_text */ +#line 5163 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(check_ident_length(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + Lex->part_info->curr_part_elem->partition_name= (yyvsp[0].lex_str).str; + } +#line 33985 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 572: /* opt_part_options: %empty */ +#line 5171 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 573: /* opt_part_options: part_option_list */ +#line 5172 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 574: /* part_option_list: part_option_list part_option */ +#line 5176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34003 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 575: /* part_option_list: part_option */ +#line 5177 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34009 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 576: /* part_option: server_part_option */ +#line 5181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34015 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 577: /* part_option: engine_defined_option */ +#line 5183 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->part_info->curr_part_elem->option_list, + &Lex->option_list_last); + } +#line 34024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 578: /* opt_subpart_options: %empty */ +#line 5190 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 579: /* opt_subpart_options: subpart_option_list */ +#line 5191 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34036 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 580: /* subpart_option_list: subpart_option_list server_part_option */ +#line 5195 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 581: /* subpart_option_list: server_part_option */ +#line 5196 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34048 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 582: /* server_part_option: TABLESPACE opt_equal ident_or_text */ +#line 5201 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatibility with MySQL */ } +#line 34054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 583: /* server_part_option: opt_storage ENGINE_SYM opt_equal storage_engines */ +#line 5203 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->curr_part_elem->engine_type= (yyvsp[0].db_type); + part_info->default_engine_type= (yyvsp[0].db_type); + } +#line 34064 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 584: /* server_part_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5209 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->curr_part_elem->connect_string.str= (yyvsp[0].lex_str).str; + lex->part_info->curr_part_elem->connect_string.length= (yyvsp[0].lex_str).length; + } +#line 34074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 585: /* server_part_option: NODEGROUP_SYM opt_equal real_ulong_num */ +#line 5215 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) (yyvsp[0].ulong_num); } +#line 34080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 586: /* server_part_option: MAX_ROWS opt_equal real_ulonglong_num */ +#line 5217 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 34086 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 587: /* server_part_option: MIN_ROWS opt_equal real_ulonglong_num */ +#line 5219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 34092 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 588: /* server_part_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5221 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->data_file_name= (yyvsp[0].lex_str).str; } +#line 34098 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 589: /* server_part_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5223 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->index_file_name= (yyvsp[0].lex_str).str; } +#line 34104 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 590: /* server_part_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5225 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_comment= (yyvsp[0].lex_str).str; } +#line 34110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 591: /* opt_versioning_rotation: %empty */ +#line 5229 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34116 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 592: /* $@79: %empty */ +#line 5230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "INTERVAL"; } +#line 34122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 593: /* opt_versioning_rotation: $@79 INTERVAL_SYM expr interval opt_versioning_interval_start opt_vers_auto_part */ +#line 5232 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_interval(thd, (yyvsp[-3].item), (yyvsp[-2].interval), (yyvsp[-1].item), (yyvsp[0].num), + table_name))) + MYSQL_YYABORT; + } +#line 34134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 594: /* opt_versioning_rotation: LIMIT ulonglong_num opt_vers_auto_part */ +#line 5240 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_limit((yyvsp[-1].ulonglong_number), (yyvsp[0].num), table_name))) + MYSQL_YYABORT; + } +#line 34145 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 595: /* opt_versioning_interval_start: %empty */ +#line 5251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= NULL; + } +#line 34153 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 596: /* opt_versioning_interval_start: STARTS_SYM literal */ +#line 5255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 34161 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 597: /* opt_vers_auto_part: %empty */ +#line 5262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 34169 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 598: /* opt_vers_auto_part: AUTO_SYM */ +#line 5266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 1; + } +#line 34177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 599: /* opt_as: %empty */ +#line 5275 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 600: /* opt_as: AS */ +#line 5276 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34189 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 601: /* opt_create_database_options: %empty */ +#line 5280 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34195 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 602: /* opt_create_database_options: create_database_options */ +#line 5281 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34201 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 603: /* create_database_options: create_database_option */ +#line 5285 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34207 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 604: /* create_database_options: create_database_options create_database_option */ +#line 5286 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34213 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 605: /* create_database_option: default_collation */ +#line 5290 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34219 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 606: /* create_database_option: default_charset */ +#line 5291 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34225 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 607: /* create_database_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5293 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 34234 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 608: /* opt_if_not_exists_table_element: %empty */ +#line 5301 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + } +#line 34242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 609: /* opt_if_not_exists_table_element: IF_SYM not EXISTS */ +#line 5305 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + } +#line 34250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 610: /* opt_if_not_exists: %empty */ +#line 5312 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 34258 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 611: /* opt_if_not_exists: IF_SYM not EXISTS */ +#line 5316 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_NOT_EXISTS); + } +#line 34266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 612: /* create_or_replace: CREATE */ +#line 5323 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 34274 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 613: /* create_or_replace: CREATE OR_SYM REPLACE */ +#line 5327 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_OR_REPLACE); + } +#line 34282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 621: /* create_table_option: ENGINE_SYM opt_equal ident_or_text */ +#line 5350 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->m_sql_cmd) + { + DBUG_ASSERT(lex->sql_command == SQLCOM_ALTER_TABLE); + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table())) + MYSQL_YYABORT; + } + Storage_engine_name *opt= + lex->m_sql_cmd->option_storage_engine_name(); + DBUG_ASSERT(opt); // Expect a proper Sql_cmd + *opt= Storage_engine_name((yyvsp[0].lex_str)); + lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; + } +#line 34301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 622: /* create_table_option: MAX_ROWS opt_equal ulonglong_num */ +#line 5365 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.max_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS; + } +#line 34310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 623: /* create_table_option: MIN_ROWS opt_equal ulonglong_num */ +#line 5370 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.min_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS; + } +#line 34319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 624: /* create_table_option: AVG_ROW_LENGTH opt_equal ulong_num */ +#line 5375 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.avg_row_length=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH; + } +#line 34328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 625: /* create_table_option: PASSWORD_SYM opt_equal TEXT_STRING_sys */ +#line 5380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.password=(yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; + } +#line 34337 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 626: /* create_table_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.comment=(yyvsp[0].lex_str); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 34346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 627: /* create_table_option: AUTO_INC opt_equal ulonglong_num */ +#line 5390 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.auto_increment_value=(yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_AUTO; + } +#line 34355 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 628: /* create_table_option: PACK_KEYS_SYM opt_equal ulong_num */ +#line 5395 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_PACK_KEYS; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_PACK_KEYS; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 34374 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 629: /* create_table_option: PACK_KEYS_SYM opt_equal DEFAULT */ +#line 5410 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 34384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 630: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal ulong_num */ +#line 5416 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_OFF; + break; + case 1: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_ON; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 34403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 631: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal DEFAULT */ +#line 5431 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_DEFAULT; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 34412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 632: /* create_table_option: STATS_PERSISTENT_SYM opt_equal ulong_num */ +#line 5436 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_STATS_PERSISTENT; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_STATS_PERSISTENT; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 34431 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 633: /* create_table_option: STATS_PERSISTENT_SYM opt_equal DEFAULT */ +#line 5451 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_STATS_PERSISTENT | HA_OPTION_NO_STATS_PERSISTENT); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 34441 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 634: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal ulong_num */ +#line 5457 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* From user point of view STATS_SAMPLE_PAGES can be specified as + STATS_SAMPLE_PAGES=N (where 0 0xffff)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.stats_sample_pages=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 34463 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 635: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal DEFAULT */ +#line 5475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_sample_pages=0; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 34472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 636: /* create_table_option: CHECKSUM_SYM opt_equal ulong_num */ +#line 5480 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 34481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 637: /* create_table_option: TABLE_CHECKSUM_SYM opt_equal ulong_num */ +#line 5485 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 34490 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 638: /* create_table_option: PAGE_CHECKSUM_SYM opt_equal choice */ +#line 5490 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_PAGE_CHECKSUM; + Lex->create_info.page_checksum= (yyvsp[0].choice); + } +#line 34499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 639: /* create_table_option: DELAY_KEY_WRITE_SYM opt_equal ulong_num */ +#line 5495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; + Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; + } +#line 34508 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 640: /* create_table_option: ROW_FORMAT_SYM opt_equal row_types */ +#line 5500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.row_type= (yyvsp[0].row_type); + Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; + } +#line 34517 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 641: /* $@80: %empty */ +#line 5505 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->table_list.save_and_clear(&Lex->save_list); + } +#line 34525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 642: /* create_table_option: UNION_SYM opt_equal $@80 '(' opt_table_list ')' */ +#line 5509 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Move the union list to the merge_list and exclude its tables + from the global list. + */ + LEX *lex=Lex; + lex->create_info.merge_list= lex->first_select_lex()->table_list.first; + lex->first_select_lex()->table_list= lex->save_list; + /* + When excluding union list from the global list we assume that + elements of the former immediately follow elements which represent + table being created/altered and parent tables. + */ + TABLE_LIST *last_non_sel_table= lex->create_last_non_select_table; + DBUG_ASSERT(last_non_sel_table->next_global == + lex->create_info.merge_list); + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + + lex->create_info.used_fields|= HA_CREATE_USED_UNION; + } +#line 34551 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 645: /* create_table_option: INSERT_METHOD opt_equal merge_insert_types */ +#line 5533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.merge_insert_method= (yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD; + } +#line 34560 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 646: /* create_table_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5538 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.data_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; + } +#line 34569 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 647: /* create_table_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5543 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.index_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; + } +#line 34578 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 648: /* create_table_option: TABLESPACE ident */ +#line 5548 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatiblity with MySQL */ } +#line 34584 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 649: /* create_table_option: STORAGE_SYM DISK_SYM */ +#line 5550 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_DISK;} +#line 34590 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 650: /* create_table_option: STORAGE_SYM MEMORY_SYM */ +#line 5552 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_MEMORY;} +#line 34596 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 651: /* create_table_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5554 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.connect_string.str= (yyvsp[0].lex_str).str; + Lex->create_info.connect_string.length= (yyvsp[0].lex_str).length; + Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; + } +#line 34606 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 652: /* create_table_option: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 5560 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; + Lex->create_info.key_block_size= (yyvsp[0].ulong_num); + } +#line 34615 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 653: /* create_table_option: TRANSACTIONAL_SYM opt_equal choice */ +#line 5565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL; + Lex->create_info.transactional= (yyvsp[0].choice); + } +#line 34624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 654: /* create_table_option: engine_defined_option */ +#line 5570 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->create_info.option_list, &Lex->option_list_last); + } +#line 34632 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 655: /* create_table_option: SEQUENCE_SYM opt_equal choice */ +#line 5574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= ((yyvsp[0].choice) == HA_CHOICE_YES); + } +#line 34641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 657: /* engine_defined_option: IDENT_sys equal TEXT_STRING_sys */ +#line 5583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].lex_str), true); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34652 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 658: /* engine_defined_option: IDENT_sys equal ident */ +#line 5590 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ident_sys).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), false); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34663 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 659: /* engine_defined_option: IDENT_sys equal real_ulonglong_num */ +#line 5597 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ulonglong_number), thd->mem_root); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34672 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 660: /* engine_defined_option: IDENT_sys equal DEFAULT */ +#line 5602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys)); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 34681 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 663: /* versioning_option: WITH_SYSTEM_SYM VERSIONING_SYM */ +#line 5615 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) + { + if (!DBUG_IF("sysvers_force")) + { + my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CREATE TEMPORARY TABLE"); + MYSQL_YYABORT; + } + } + else + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } + } +#line 34701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 664: /* default_charset: opt_default charset opt_equal charset_name_or_default */ +#line 5634 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.add_table_option_default_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 34710 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 665: /* default_collation: opt_default COLLATE_SYM opt_equal collation_name_or_default */ +#line 5642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_specification_st *cinfo= &Lex->create_info; + if (unlikely(cinfo->add_table_option_default_collation((yyvsp[0].Lex_extended_collation)))) + MYSQL_YYABORT; + } +#line 34720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 666: /* storage_engines: ident_or_text */ +#line 5651 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Storage_engine_name((yyvsp[0].lex_str)). + resolve_storage_engine_with_error(thd, &(yyval.db_type), + thd->lex->create_info.tmp_table())) + MYSQL_YYABORT; + } +#line 34731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 667: /* known_storage_engines: ident_or_text */ +#line 5661 "/home/buildbot/git/sql/sql_yacc.yy" + { + plugin_ref plugin; + if (likely((plugin= ha_resolve_by_name(thd, &(yyvsp[0].lex_str), false)))) + (yyval.db_type)= plugin_hton(plugin); + else + my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 34743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 668: /* row_types: DEFAULT */ +#line 5671 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DEFAULT; } +#line 34749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 669: /* row_types: FIXED_SYM */ +#line 5672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_FIXED; } +#line 34755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 670: /* row_types: DYNAMIC_SYM */ +#line 5673 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DYNAMIC; } +#line 34761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 671: /* row_types: COMPRESSED_SYM */ +#line 5674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPRESSED; } +#line 34767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 672: /* row_types: REDUNDANT_SYM */ +#line 5675 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_REDUNDANT; } +#line 34773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 673: /* row_types: COMPACT_SYM */ +#line 5676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPACT; } +#line 34779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 674: /* row_types: PAGE_SYM */ +#line 5677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_PAGE; } +#line 34785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 675: /* merge_insert_types: NO_SYM */ +#line 5681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_DISABLED; } +#line 34791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 676: /* merge_insert_types: FIRST_SYM */ +#line 5682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_FIRST; } +#line 34797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 677: /* merge_insert_types: LAST_SYM */ +#line 5683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_LAST; } +#line 34803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 678: /* udf_type: STRING_SYM */ +#line 5687 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) STRING_RESULT; } +#line 34809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 679: /* udf_type: REAL */ +#line 5688 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) REAL_RESULT; } +#line 34815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 680: /* udf_type: DECIMAL_SYM */ +#line 5689 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) DECIMAL_RESULT; } +#line 34821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 681: /* udf_type: INT_SYM */ +#line 5690 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) INT_RESULT; } +#line 34827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 682: /* create_field_list: field_list */ +#line 5696 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 683: /* create_field_list_parens: LEFT_PAREN_ALT field_list ')' */ +#line 5703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 686: /* field_list_item: column_def */ +#line 5714 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 690: /* field_list_item: PERIOD_SYM period_for_application_time */ +#line 5718 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 691: /* column_def: field_spec */ +#line 5723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.create_field)= (yyvsp[0].create_field); } +#line 34861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 692: /* column_def: field_spec opt_constraint references */ +#line 5725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_column_foreign_key(&((yyvsp[-2].create_field)->field_name), &(yyvsp[-1].lex_str), + (yyvsp[0].table), DDL_options()))) + MYSQL_YYABORT; + (yyval.create_field)= (yyvsp[-2].create_field); + } +#line 34872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 693: /* $@81: %empty */ +#line 5735 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-1].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 694: /* key_def: key_or_index opt_if_not_exists opt_ident opt_USING_key_algorithm $@81 '(' key_list ')' normal_key_options */ +#line 5740 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 695: /* $@82: %empty */ +#line 5742 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-2].ident_sys), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 696: /* key_def: key_or_index opt_if_not_exists ident TYPE_SYM btree_or_rtree $@82 '(' key_list ')' normal_key_options */ +#line 5747 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34904 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 697: /* $@83: %empty */ +#line 5749 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34914 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 698: /* key_def: fulltext opt_key_or_index opt_if_not_exists opt_ident $@83 '(' key_list ')' fulltext_key_options */ +#line 5754 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34920 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 699: /* $@84: %empty */ +#line 5756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34930 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 700: /* key_def: spatial opt_key_or_index opt_if_not_exists opt_ident $@84 '(' key_list ')' spatial_key_options */ +#line 5761 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34936 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 701: /* $@85: %empty */ +#line 5765 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), (yyvsp[-1].lex_str).str ? &(yyvsp[-1].lex_str) : &(yyvsp[-4].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 702: /* key_def: opt_constraint constraint_key_type opt_if_not_exists opt_ident opt_USING_key_algorithm $@85 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5770 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34952 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 703: /* $@86: %empty */ +#line 5773 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-4].key_type), (yyvsp[-2].ident_sys).str ? &(yyvsp[-2].ident_sys) : &(yyvsp[-5].lex_str), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34962 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 704: /* key_def: opt_constraint constraint_key_type opt_if_not_exists ident TYPE_SYM btree_or_rtree $@86 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5778 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34968 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 705: /* $@87: %empty */ +#line 5780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->check_add_key((yyvsp[-1].object_ddl_options))) || + unlikely(!(Lex->last_key= (new (thd->mem_root) + Key(Key::MULTIPLE, + (yyvsp[-4].lex_str).str ? &(yyvsp[-4].lex_str) : &(yyvsp[0].lex_str), + HA_KEY_ALG_UNDEF, true, (yyvsp[-1].object_ddl_options)))))) + MYSQL_YYABORT; + Lex->option_list= NULL; + } +#line 34982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 706: /* key_def: opt_constraint FOREIGN KEY_SYM opt_if_not_exists opt_ident $@87 '(' key_list ')' references */ +#line 5790 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_table_foreign_key((yyvsp[-5].lex_str).str ? &(yyvsp[-5].lex_str) : &(yyvsp[-9].lex_str), + (yyvsp[-9].lex_str).str ? &(yyvsp[-9].lex_str) : &(yyvsp[-5].lex_str), (yyvsp[0].table), (yyvsp[-6].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34992 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 707: /* constraint_def: opt_constraint check_constraint */ +#line 5799 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), FALSE); + } +#line 35000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 708: /* period_for_system_time: PERIOD_SYM FOR_SYSTEM_TIME_SYM '(' ident ',' ident ')' */ +#line 5807 "/home/buildbot/git/sql/sql_yacc.yy" + { + Vers_parse_info &info= Lex->vers_get_info(); + info.set_period((yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys)); + } +#line 35009 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 709: /* period_for_application_time: FOR_SYM ident '(' ident ',' ident ')' */ +#line 5815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_period((yyvsp[-5].ident_sys), (yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys))) + MYSQL_YYABORT; + } +#line 35018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 710: /* opt_check_constraint: %empty */ +#line 5822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (Virtual_column_info*) 0; } +#line 35024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 711: /* opt_check_constraint: check_constraint */ +#line 5823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (yyvsp[0].virtual_column);} +#line 35030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 712: /* check_constraint: CHECK_SYM '(' expr ')' */ +#line 5828 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 35041 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 713: /* opt_constraint_no_id: %empty */ +#line 5837 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35047 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 714: /* opt_constraint_no_id: CONSTRAINT */ +#line 5838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35053 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 715: /* opt_constraint: %empty */ +#line 5842 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 35059 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 716: /* opt_constraint: constraint */ +#line 5843 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 35065 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 717: /* constraint: CONSTRAINT opt_ident */ +#line 5847 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 35071 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 718: /* @88: %empty */ +#line 5852 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].lex_str), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].lex_str).str)); + + if (unlikely(!f)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].lex_str)); + (yyval.create_field)= f; + lex->parsing_options.lookup_keywords_after_qualifier= true; + } +#line 35091 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 719: /* field_spec: field_ident @88 field_type_or_serial opt_check_constraint */ +#line 5868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->parsing_options.lookup_keywords_after_qualifier= false; + (yyval.create_field)= (yyvsp[-2].create_field); + + (yyval.create_field)->check_constraint= (yyvsp[0].virtual_column); + + if (unlikely((yyval.create_field)->check(thd))) + MYSQL_YYABORT; + + lex->alter_info.create_list.push_back((yyval.create_field), thd->mem_root); + + (yyval.create_field)->create_if_not_exists= Lex->check_exists; + if ((yyval.create_field)->flags & PRI_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::PRIMARY, lex->check_exists); + else if ((yyval.create_field)->flags & UNIQUE_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::UNIQUE, lex->check_exists); + } +#line 35114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 720: /* $@89: %empty */ +#line 5890 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + } +#line 35123 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 721: /* field_type_or_serial: qualified_field_type $@89 field_def */ +#line 5895 "/home/buildbot/git/sql/sql_yacc.yy" + { + auto tmp= (yyvsp[-2].Lex_field_type).charset_collation_attrs(); + if (tmp.merge_column_charset_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + Lex->last_field->set_charset_collation_attrs(tmp); + } +#line 35134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 722: /* $@90: %empty */ +#line 5902 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_handler(&type_handler_ulonglong); + Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG + | UNSIGNED_FLAG | UNIQUE_KEY_FLAG; + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35145 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 724: /* opt_serial_attribute: %empty */ +#line 5912 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 725: /* opt_serial_attribute: opt_serial_attribute_list */ +#line 5913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 726: /* opt_serial_attribute_list: opt_serial_attribute_list serial_attribute */ +#line 5917 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 728: /* opt_asrow_attribute: %empty */ +#line 5922 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35169 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 729: /* opt_asrow_attribute: opt_asrow_attribute_list */ +#line 5923 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35175 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 730: /* opt_asrow_attribute_list: opt_asrow_attribute_list asrow_attribute */ +#line 5927 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35181 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 732: /* field_def: %empty */ +#line 5932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 734: /* field_def: attribute_list compressed_deprecated_column_attribute */ +#line 5934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 35193 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 735: /* field_def: attribute_list compressed_deprecated_column_attribute attribute_list */ +#line 5936 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-2].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 35202 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 736: /* $@91: %empty */ +#line 5941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info= (yyvsp[0].virtual_column); + } +#line 35210 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 737: /* field_def: opt_generated_always AS virtual_column_func $@91 vcol_opt_specifier vcol_opt_attribute */ +#line 5945 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 738: /* field_def: opt_generated_always AS ROW_SYM START_SYM opt_asrow_attribute */ +#line 5949 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_start()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35228 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 739: /* field_def: opt_generated_always AS ROW_SYM END opt_asrow_attribute */ +#line 5955 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_end()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35238 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 740: /* opt_generated_always: %empty */ +#line 5963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35244 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 741: /* opt_generated_always: GENERATED_SYM ALWAYS_SYM */ +#line 5964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 742: /* vcol_opt_specifier: %empty */ +#line 5969 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 35258 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 743: /* vcol_opt_specifier: VIRTUAL_SYM */ +#line 5973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 35266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 744: /* vcol_opt_specifier: PERSISTENT_SYM */ +#line 5977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 35274 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 745: /* vcol_opt_specifier: STORED_SYM */ +#line 5981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 35282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 746: /* vcol_opt_attribute: %empty */ +#line 5987 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35288 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 747: /* vcol_opt_attribute: vcol_opt_attribute_list */ +#line 5988 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35294 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 748: /* vcol_opt_attribute_list: vcol_opt_attribute_list vcol_attribute */ +#line 5992 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35300 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 750: /* vcol_attribute: UNIQUE_SYM */ +#line 5998 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 751: /* vcol_attribute: UNIQUE_SYM KEY_SYM */ +#line 6004 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35320 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 752: /* vcol_attribute: COMMENT_SYM TEXT_STRING_sys */ +#line 6009 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->comment= (yyvsp[0].lex_str); } +#line 35326 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 753: /* vcol_attribute: INVISIBLE_SYM */ +#line 6011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->invisible= INVISIBLE_USER; + } +#line 35334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 754: /* $@92: %empty */ +#line 6018 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + "PARSE_VCOL_EXPR" can only be used by the SQL server + when reading a '*.frm' file. + Prevent the end user from invoking this command. + */ + MYSQL_YYABORT_UNLESS(Lex->parse_vcol_expr); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 35349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 755: /* parse_vcol_expr: PARSE_VCOL_EXPR_SYM $@92 expr */ +#line 6029 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[0].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + Lex->last_field->vcol_info= v; + Lex->pop_select(); //main select + } +#line 35361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 757: /* parenthesized_expr: expr ',' expr_list */ +#line 6041 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[0].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 35372 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 758: /* virtual_column_func: '(' parenthesized_expr ')' */ +#line 6051 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= + add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 35384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 759: /* virtual_column_func: subquery */ +#line 6059 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= new (thd->mem_root) Item_singlerow_subselect(thd, (yyvsp[0].select_lex)))) + MYSQL_YYABORT; + Virtual_column_info *v= add_virtual_expression(thd, item); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 35398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 763: /* column_default_expr: expr_or_literal */ +#line 6075 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.virtual_column)= add_virtual_expression(thd, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 35407 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 764: /* field_type: field_type_all */ +#line 6082 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 35415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 765: /* qualified_field_type: field_type_all */ +#line 6089 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 35423 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 766: /* qualified_field_type: sp_decl_ident '.' field_type_all */ +#line 6093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->map_data_type((yyvsp[-2].ident_sys), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 35432 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 767: /* udt_name: IDENT_sys */ +#line 6100 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 35438 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 768: /* udt_name: reserved_keyword_udt */ +#line 6101 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 35444 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 769: /* udt_name: non_reserved_keyword_udt */ +#line 6102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 35450 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 775: /* field_type_all: udt_name float_options srid_option */ +#line 6112 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_field_type_udt(&(yyval.Lex_field_type), (yyvsp[-2].lex_str), (yyvsp[-1].Lex_length_and_dec))) + MYSQL_YYABORT; + } +#line 35459 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 776: /* field_type_numeric: int_type opt_field_length last_field_options */ +#line 6120 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length_flags((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec), (uint32) (yyvsp[0].ulong_num)); + } +#line 35467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 777: /* field_type_numeric: real_type opt_precision last_field_options */ +#line 6123 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec)); } +#line 35473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 778: /* field_type_numeric: FLOAT_SYM float_options last_field_options */ +#line 6125 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_float, (yyvsp[-1].Lex_length_and_dec)); + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length() && !(yyvsp[-1].Lex_length_and_dec).has_explicit_dec()) + { + if (unlikely((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_DOUBLE)) + my_yyabort_error((ER_WRONG_FIELD_SPEC, MYF(0), + Lex->last_field->field_name.str)); + if ((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_FLOAT) + (yyval.Lex_field_type).set(&type_handler_double); + else + (yyval.Lex_field_type).set(&type_handler_float); + } + } +#line 35491 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 779: /* field_type_numeric: BIT_SYM opt_field_length */ +#line 6139 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_bit, (yyvsp[0].Lex_length_and_dec)); + } +#line 35499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 780: /* field_type_numeric: BOOL_SYM */ +#line 6143 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 35507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 781: /* field_type_numeric: BOOLEAN_SYM */ +#line 6147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 35515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 782: /* field_type_numeric: DECIMAL_SYM float_options last_field_options */ +#line 6151 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 35521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 783: /* field_type_numeric: NUMBER_ORACLE_SYM float_options last_field_options */ +#line 6153 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec)); + else + (yyval.Lex_field_type).set(&type_handler_double); + } +#line 35532 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 784: /* field_type_numeric: NUMERIC_SYM float_options last_field_options */ +#line 6160 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 35538 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 785: /* field_type_numeric: FIXED_SYM float_options last_field_options */ +#line 6162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 35544 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 786: /* opt_binary_and_compression: %empty */ +#line 6167 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 787: /* opt_binary_and_compression: binary */ +#line 6168 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 35556 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 788: /* opt_binary_and_compression: binary compressed_deprecated_data_type_attribute */ +#line 6169 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 35562 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 789: /* opt_binary_and_compression: compressed opt_binary */ +#line 6170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 35568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 790: /* field_type_string: char opt_field_length opt_binary */ +#line 6175 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 35576 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 791: /* field_type_string: nchar opt_field_length opt_bin_mod */ +#line 6179 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 35585 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 792: /* field_type_string: BINARY opt_field_length */ +#line 6184 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); + } +#line 35593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 793: /* field_type_string: varchar opt_field_length opt_binary_and_compression */ +#line 6188 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 35601 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 794: /* field_type_string: VARCHAR2_ORACLE_SYM opt_field_length opt_binary_and_compression */ +#line 6192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 35609 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 795: /* field_type_string: nvarchar opt_field_length opt_compressed opt_bin_mod */ +#line 6196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-2].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 35618 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 796: /* field_type_string: VARBINARY opt_field_length opt_compressed */ +#line 6201 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35626 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 797: /* field_type_string: RAW_ORACLE_SYM opt_field_length opt_compressed */ +#line 6205 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35634 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 798: /* field_type_temporal: YEAR_SYM opt_field_length last_field_options */ +#line 6212 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + { + if ((yyvsp[-1].Lex_length_and_dec).length() != 4) + { + char buff[sizeof("YEAR()") + MY_INT64_NUM_DECIMAL_DIGITS + 1]; + my_snprintf(buff, sizeof(buff), "YEAR(%u)", (uint) (yyvsp[-1].Lex_length_and_dec).length()); + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + buff, "YEAR(4)"); + } + } + (yyval.Lex_field_type).set(&type_handler_year, (yyvsp[-1].Lex_length_and_dec)); + } +#line 35654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 799: /* field_type_temporal: DATE_SYM */ +#line 6227 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdate); } +#line 35660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 800: /* field_type_temporal: TIME_SYM opt_field_length */ +#line 6229 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_time2) : + static_cast(&type_handler_time), + (yyvsp[0].Lex_length_and_dec)); + } +#line 35671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 801: /* field_type_temporal: TIMESTAMP opt_field_length */ +#line 6236 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_timestamp2): + static_cast(&type_handler_timestamp), + (yyvsp[0].Lex_length_and_dec)); + } +#line 35682 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 802: /* field_type_temporal: DATETIME opt_field_length */ +#line 6243 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(thd->type_handler_for_datetime(), (yyvsp[0].Lex_length_and_dec)); + } +#line 35690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 803: /* field_type_lob: TINYBLOB opt_compressed */ +#line 6251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_tiny_blob, &my_charset_bin); + } +#line 35698 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 804: /* field_type_lob: BLOB_MARIADB_SYM opt_field_length opt_compressed */ +#line 6255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35706 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 805: /* field_type_lob: BLOB_ORACLE_SYM field_length opt_compressed */ +#line 6259 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 35714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 806: /* field_type_lob: BLOB_ORACLE_SYM opt_compressed */ +#line 6263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 35722 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 807: /* field_type_lob: MEDIUMBLOB opt_compressed */ +#line 6267 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 35730 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 808: /* field_type_lob: LONGBLOB opt_compressed */ +#line 6271 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 35738 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 809: /* field_type_lob: LONG_SYM VARBINARY opt_compressed */ +#line 6275 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 35746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 810: /* field_type_lob: LONG_SYM varchar opt_binary_and_compression */ +#line 6279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 811: /* field_type_lob: TINYTEXT opt_binary_and_compression */ +#line 6281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_tiny_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 812: /* field_type_lob: TEXT_SYM opt_field_length opt_binary_and_compression */ +#line 6283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35764 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 813: /* field_type_lob: MEDIUMTEXT opt_binary_and_compression */ +#line 6285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35770 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 814: /* field_type_lob: LONGTEXT opt_binary_and_compression */ +#line 6287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 815: /* field_type_lob: CLOB_ORACLE_SYM opt_binary_and_compression */ +#line 6289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35782 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 816: /* field_type_lob: LONG_SYM opt_binary_and_compression */ +#line 6291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35788 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 817: /* field_type_lob: JSON_SYM opt_compressed */ +#line 6293 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob_json, &my_charset_utf8mb4_bin); + } +#line 35796 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 818: /* field_type_misc: ENUM '(' string_list ')' opt_binary */ +#line 6300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_enum, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 819: /* field_type_misc: SET '(' string_list ')' opt_binary */ +#line 6302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_set, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 820: /* char: CHAR_SYM */ +#line 6306 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 821: /* nchar: NCHAR_SYM */ +#line 6310 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35820 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 822: /* nchar: NATIONAL_SYM CHAR_SYM */ +#line 6311 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35826 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 823: /* varchar: char VARYING */ +#line 6315 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35832 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 824: /* varchar: VARCHAR */ +#line 6316 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35838 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 825: /* nvarchar: NATIONAL_SYM VARCHAR */ +#line 6320 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35844 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 826: /* nvarchar: NVARCHAR_SYM */ +#line 6321 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35850 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 827: /* nvarchar: NCHAR_SYM VARCHAR */ +#line 6322 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35856 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 828: /* nvarchar: NATIONAL_SYM CHAR_SYM VARYING */ +#line 6323 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35862 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 829: /* nvarchar: NCHAR_SYM VARYING */ +#line 6324 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 830: /* int_type: INT_SYM */ +#line 6328 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slong; } +#line 35874 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 831: /* int_type: TINYINT */ +#line 6329 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_stiny; } +#line 35880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 832: /* int_type: SMALLINT */ +#line 6330 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sshort; } +#line 35886 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 833: /* int_type: MEDIUMINT */ +#line 6331 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sint24; } +#line 35892 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 834: /* int_type: BIGINT */ +#line 6332 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slonglong; } +#line 35898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 835: /* real_type: REAL */ +#line 6337 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.type_handler)= thd->variables.sql_mode & MODE_REAL_AS_FLOAT ? + static_cast(&type_handler_float) : + static_cast(&type_handler_double); + } +#line 35908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 836: /* real_type: DOUBLE_SYM */ +#line 6342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35914 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 837: /* real_type: DOUBLE_SYM PRECISION */ +#line 6343 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35920 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 838: /* srid_option: %empty */ +#line 6348 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->srid= 0; } +#line 35926 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 839: /* srid_option: REF_SYSTEM_ID_SYM '=' NUM */ +#line 6351 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->srid=atoi((yyvsp[0].lex_str).str); + } +#line 35934 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 840: /* float_options: %empty */ +#line 6357 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35940 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 843: /* precision: '(' NUM ',' NUM ')' */ +#line 6363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[-3].lex_str).str, (yyvsp[-1].lex_str).str); } +#line 35946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 844: /* field_options: %empty */ +#line 6367 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35952 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 845: /* field_options: SIGNED_SYM */ +#line 6368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35958 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 846: /* field_options: UNSIGNED */ +#line 6369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG; } +#line 35964 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 847: /* field_options: ZEROFILL */ +#line 6370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35970 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 848: /* field_options: UNSIGNED ZEROFILL */ +#line 6371 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35976 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 849: /* field_options: ZEROFILL UNSIGNED */ +#line 6372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 850: /* last_field_options: field_options */ +#line 6376 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= ((yyval.ulong_num)= (yyvsp[0].ulong_num)); } +#line 35988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 851: /* field_length_str: '(' LONG_NUM ')' */ +#line 6380 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35994 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 852: /* field_length_str: '(' ULONGLONG_NUM ')' */ +#line 6381 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 36000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 853: /* field_length_str: '(' DECIMAL_NUM ')' */ +#line 6382 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 36006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 854: /* field_length_str: '(' NUM ')' */ +#line 6383 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 36012 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 855: /* field_length: field_length_str */ +#line 6386 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[0].const_simple_string), NULL); } +#line 36018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 856: /* field_scale: field_length_str */ +#line 6390 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set(NULL, (yyvsp[0].const_simple_string)); } +#line 36024 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 857: /* opt_field_length: %empty */ +#line 6395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); /* use default length */ } +#line 36030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 859: /* opt_field_scale: %empty */ +#line 6400 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 36036 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 861: /* opt_precision: %empty */ +#line 6405 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 36042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 862: /* opt_precision: precision */ +#line 6406 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec)= (yyvsp[0].Lex_length_and_dec); } +#line 36048 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 863: /* attribute_list: attribute_list attribute */ +#line 6412 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 36057 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 865: /* attribute: NULL_SYM */ +#line 6421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags&= ~NOT_NULL_FLAG; + Lex->last_field->explicitly_nullable= true; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36067 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 866: /* attribute: DEFAULT column_default_expr */ +#line 6427 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->default_value= (yyvsp[0].virtual_column); + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36076 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 867: /* attribute: ON UPDATE_SYM NOW_SYM opt_default_time_precision */ +#line 6432 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->last_field->on_update= item; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36088 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 868: /* attribute: AUTO_INC */ +#line 6439 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 36094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 869: /* attribute: SERIAL_SYM DEFAULT VALUE_SYM */ +#line 6441 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 36105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 870: /* attribute: COLLATE_SYM collation_name */ +#line 6448 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 36113 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 871: /* attribute: serial_attribute */ +#line 6451 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 36119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 872: /* opt_compression_method: %empty */ +#line 6455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= NULL; } +#line 36125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 873: /* opt_compression_method: equal ident */ +#line 6456 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[0].ident_sys).str; } +#line 36131 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 874: /* opt_compressed: %empty */ +#line 6460 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36137 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 875: /* opt_compressed: compressed */ +#line 6461 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 36143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 876: /* opt_enable: %empty */ +#line 6465 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36149 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 877: /* opt_enable: ENABLE_SYM */ +#line 6466 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 36155 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 878: /* compressed: COMPRESSED_SYM opt_compression_method */ +#line 6471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed((yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 36164 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 879: /* compressed_deprecated_data_type_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed_deprecated(thd, (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 36173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 880: /* compressed_deprecated_column_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6487 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field-> + set_compressed_deprecated_column_attribute(thd, (yyvsp[-1].kwd).pos(), (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 36183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 881: /* asrow_attribute: not NULL_SYM opt_enable */ +#line 6496 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags|= NOT_NULL_FLAG; + } +#line 36191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 882: /* asrow_attribute: opt_primary KEY_SYM */ +#line 6500 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= PRI_KEY_FLAG | NOT_NULL_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 36201 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 885: /* serial_attribute: engine_defined_option */ +#line 6511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->last_field->option_list, &Lex->option_list_last); + } +#line 36209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 886: /* serial_attribute: with_or_without_system VERSIONING_SYM */ +#line 6515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->versioning= (yyvsp[-1].vers_column_versioning); + Lex->create_info.options|= HA_VERSIONED_TABLE; + if (Lex->alter_info.flags & ALTER_DROP_SYSTEM_VERSIONING) + { + my_yyabort_error((ER_VERS_NOT_VERSIONED, MYF(0), + Lex->create_last_non_select_table->table_name.str)); + } + } +#line 36223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 887: /* with_or_without_system: WITH_SYSTEM_SYM */ +#line 6528 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.versioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITH_VERSIONING; + } +#line 36233 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 888: /* with_or_without_system: WITHOUT SYSTEM */ +#line 6534 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.unversioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITHOUT_VERSIONING; + } +#line 36243 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 889: /* charset: CHAR_SYM SET */ +#line 6543 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[-1].kwd); } +#line 36249 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 890: /* charset: CHARSET */ +#line 6544 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[0].kwd); } +#line 36255 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 891: /* charset_name: ident_or_text */ +#line 6549 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, MY_CS_PRIMARY, + MYF(utf8_flag))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 36266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 892: /* charset_name: BINARY */ +#line 6555 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 36272 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 893: /* charset_name_or_default: charset_name */ +#line 6559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 36278 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 894: /* charset_name_or_default: DEFAULT */ +#line 6560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 36284 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 895: /* opt_load_data_charset: %empty */ +#line 6564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= NULL; } +#line 36290 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 896: /* opt_load_data_charset: charset charset_name_or_default */ +#line 6565 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 36296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 897: /* old_or_new_charset_name: ident_or_text */ +#line 6570 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, + MY_CS_PRIMARY, + MYF(utf8_flag))) && + !((yyval.charset)=get_old_charset_by_name((yyvsp[0].lex_str).str)))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 36309 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 898: /* old_or_new_charset_name: BINARY */ +#line 6578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 36315 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 899: /* old_or_new_charset_name_or_default: old_or_new_charset_name */ +#line 6582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 36321 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 900: /* old_or_new_charset_name_or_default: DEFAULT */ +#line 6583 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 36327 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 901: /* collation_name: ident_or_text */ +#line 6588 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_extended_collation).set_by_name((yyvsp[0].lex_str).str, thd->get_utf8_flag())) + MYSQL_YYABORT; + } +#line 36336 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 902: /* collation_name_or_default: collation_name */ +#line 6595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation)=(yyvsp[0].Lex_extended_collation); } +#line 36342 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 903: /* collation_name_or_default: DEFAULT */ +#line 6596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation).set_collate_default(); } +#line 36348 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 904: /* opt_default: %empty */ +#line 6600 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36354 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 905: /* opt_default: DEFAULT */ +#line 6601 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36360 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 906: /* charset_or_alias: charset charset_name */ +#line 6605 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 36366 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 907: /* charset_or_alias: ASCII_SYM */ +#line 6606 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_latin1; } +#line 36372 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 908: /* charset_or_alias: UNICODE_SYM */ +#line 6608 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.charset)= get_charset_by_csname("ucs2", MY_CS_PRIMARY,MYF(0))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2")); + } +#line 36381 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 909: /* opt_binary: %empty */ +#line 6615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 36387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 911: /* binary: BYTE_SYM */ +#line 6621 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset(&my_charset_bin)); + } +#line 36395 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 912: /* binary: charset_or_alias */ +#line 6625 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset((yyvsp[0].charset))); + } +#line 36403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 913: /* binary: charset_or_alias BINARY */ +#line 6629 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[-1].charset)))) + MYSQL_YYABORT; + } +#line 36412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 914: /* binary: BINARY */ +#line 6633 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).set_contextually_typed_binary_style(); } +#line 36418 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 915: /* binary: BINARY charset_or_alias */ +#line 6635 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 36427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 916: /* binary: charset_or_alias COLLATE_SYM DEFAULT */ +#line 6640 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_default(Lex_exact_charset((yyvsp[-2].charset))); + } +#line 36435 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 917: /* binary: charset_or_alias COLLATE_SYM collation_name */ +#line 6644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].Lex_extended_collation).merge_exact_charset(Lex_exact_charset((yyvsp[-2].charset)))) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 36445 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 918: /* binary: COLLATE_SYM collation_name */ +#line 6650 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 36453 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 919: /* binary: COLLATE_SYM DEFAULT */ +#line 6654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_collate_default(); + } +#line 36461 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 920: /* opt_bin_mod: %empty */ +#line 6660 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 36467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 921: /* opt_bin_mod: BINARY */ +#line 6661 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 36473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 922: /* $@93: %empty */ +#line 6666 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ulong_num) == 0)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 36485 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 923: /* ws_nweights: '(' real_ulong_num $@93 ')' */ +#line 6674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-2].ulong_num); } +#line 36491 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 924: /* ws_level_flag_desc: ASC */ +#line 6678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 36497 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 925: /* ws_level_flag_desc: DESC */ +#line 6679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_DESC_SHIFT; } +#line 36503 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 926: /* ws_level_flag_reverse: REVERSE_SYM */ +#line 6683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_REVERSE_SHIFT; } +#line 36509 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 927: /* ws_level_flags: %empty */ +#line 6686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 36515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 928: /* ws_level_flags: ws_level_flag_desc */ +#line 6687 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 929: /* ws_level_flags: ws_level_flag_desc ws_level_flag_reverse */ +#line 6688 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-1].ulong_num) | (yyvsp[0].ulong_num); } +#line 36527 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 930: /* ws_level_flags: ws_level_flag_reverse */ +#line 6689 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) ; } +#line 36533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 931: /* ws_level_number: real_ulong_num */ +#line 6694 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (yyvsp[0].ulong_num) < 1 ? 1 : ((yyvsp[0].ulong_num) > MY_STRXFRM_NLEVELS ? MY_STRXFRM_NLEVELS : (yyvsp[0].ulong_num)); + (yyval.ulong_num)--; + } +#line 36542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 932: /* ws_level_list_item: ws_level_number ws_level_flags */ +#line 6702 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (1 | (yyvsp[0].ulong_num)) << (yyvsp[-1].ulong_num); + } +#line 36550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 933: /* ws_level_list: ws_level_list_item */ +#line 6708 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36556 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 934: /* ws_level_list: ws_level_list ',' ws_level_list_item */ +#line 6709 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)|= (yyvsp[0].ulong_num); } +#line 36562 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 935: /* ws_level_range: ws_level_number '-' ws_level_number */ +#line 6714 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint start= (yyvsp[-2].ulong_num); + uint end= (yyvsp[0].ulong_num); + for ((yyval.ulong_num)= 0; start <= end; start++) + (yyval.ulong_num)|= (1 << start); + } +#line 36573 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 936: /* ws_level_list_or_range: ws_level_list */ +#line 6723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36579 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 937: /* ws_level_list_or_range: ws_level_range */ +#line 6724 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36585 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 938: /* opt_ws_levels: %empty */ +#line 6728 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 36591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 939: /* opt_ws_levels: LEVEL_SYM ws_level_list_or_range */ +#line 6729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 36597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 942: /* references: REFERENCES table_ident opt_ref_list opt_match_clause opt_on_update_delete */ +#line 6743 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)=(yyvsp[-3].table); + } +#line 36605 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 943: /* opt_ref_list: %empty */ +#line 6750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ref_list.empty(); } +#line 36611 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 945: /* ref_list: ref_list ',' ident */ +#line 6756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + Lex->ref_list.push_back(key, thd->mem_root); + } +#line 36622 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 946: /* ref_list: ident */ +#line 6763 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->ref_list.empty(); + lex->ref_list.push_back(key, thd->mem_root); + } +#line 36635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 947: /* opt_match_clause: %empty */ +#line 6775 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_UNDEF; } +#line 36641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 948: /* opt_match_clause: MATCH FULL */ +#line 6777 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } +#line 36647 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 949: /* opt_match_clause: MATCH PARTIAL */ +#line 6779 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } +#line 36653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 950: /* opt_match_clause: MATCH SIMPLE_SYM */ +#line 6781 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } +#line 36659 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 951: /* opt_on_update_delete: %empty */ +#line 6786 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 36669 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 952: /* opt_on_update_delete: ON UPDATE_SYM delete_option */ +#line 6792 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 36679 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 953: /* opt_on_update_delete: ON DELETE_SYM delete_option */ +#line 6798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 36689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 954: /* opt_on_update_delete: ON UPDATE_SYM delete_option ON DELETE_SYM delete_option */ +#line 6805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[-3].m_fk_option); + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 36699 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 955: /* opt_on_update_delete: ON DELETE_SYM delete_option ON UPDATE_SYM delete_option */ +#line 6812 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= (yyvsp[-3].m_fk_option); + } +#line 36709 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 956: /* delete_option: RESTRICT */ +#line 6820 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_RESTRICT; } +#line 36715 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 957: /* delete_option: CASCADE */ +#line 6821 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_CASCADE; } +#line 36721 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 958: /* delete_option: SET NULL_SYM */ +#line 6822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_NULL; } +#line 36727 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 959: /* delete_option: NO_SYM ACTION */ +#line 6823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_NO_ACTION; } +#line 36733 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 960: /* delete_option: SET DEFAULT */ +#line 6824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_DEFAULT; } +#line 36739 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 961: /* constraint_key_type: PRIMARY_SYM KEY_SYM */ +#line 6828 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::PRIMARY; } +#line 36745 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 962: /* constraint_key_type: UNIQUE_SYM opt_key_or_index */ +#line 6829 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::UNIQUE; } +#line 36751 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 963: /* key_or_index: KEY_SYM */ +#line 6833 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36757 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 964: /* key_or_index: INDEX_SYM */ +#line 6834 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36763 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 965: /* opt_key_or_index: %empty */ +#line 6838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 967: /* keys_or_index: KEYS */ +#line 6843 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36775 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 968: /* keys_or_index: INDEX_SYM */ +#line 6844 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36781 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 969: /* keys_or_index: INDEXES */ +#line 6845 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36787 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 970: /* fulltext: FULLTEXT_SYM */ +#line 6849 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::FULLTEXT;} +#line 36793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 971: /* spatial: SPATIAL_SYM */ +#line 6854 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_SPATIAL + (yyval.key_type)= Key::SPATIAL; +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), sym_group_geom.name, + sym_group_geom.needed_define)); +#endif + } +#line 36806 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 972: /* normal_key_options: %empty */ +#line 6865 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36812 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 973: /* normal_key_options: normal_key_opts */ +#line 6866 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36818 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 974: /* fulltext_key_options: %empty */ +#line 6870 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36824 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 975: /* fulltext_key_options: fulltext_key_opts */ +#line 6871 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 976: /* spatial_key_options: %empty */ +#line 6875 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36836 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 977: /* spatial_key_options: spatial_key_opts */ +#line 6876 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36842 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 984: /* opt_USING_key_algorithm: %empty */ +#line 6895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36848 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 985: /* opt_USING_key_algorithm: USING btree_or_rtree */ +#line 6896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36854 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 986: /* opt_key_algorithm_clause: %empty */ +#line 6901 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36860 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 987: /* opt_key_algorithm_clause: USING btree_or_rtree */ +#line 6902 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36866 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 988: /* opt_key_algorithm_clause: TYPE_SYM btree_or_rtree */ +#line 6903 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 989: /* key_using_alg: USING btree_or_rtree */ +#line 6908 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36878 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 990: /* key_using_alg: TYPE_SYM btree_or_rtree */ +#line 6910 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36884 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 991: /* all_key_opt: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 6915 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.block_size= (yyvsp[0].ulong_num); + Lex->last_key->key_create_info.flags|= HA_USES_BLOCK_SIZE; + } +#line 36893 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 992: /* all_key_opt: COMMENT_SYM TEXT_STRING_sys */ +#line 6920 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.comment= (yyvsp[0].lex_str); } +#line 36899 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 993: /* all_key_opt: VISIBLE_SYM */ +#line 6922 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* This is mainly for MySQL 8.0 compatibility */ + } +#line 36907 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 994: /* all_key_opt: ignorability */ +#line 6926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.is_ignored= (yyvsp[0].num); + } +#line 36915 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 995: /* all_key_opt: engine_defined_option */ +#line 6930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->option_list, &Lex->option_list_last); + } +#line 36923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1000: /* fulltext_key_opt: WITH PARSER_SYM IDENT_sys */ +#line 6947 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(plugin_is_ready(&(yyvsp[0].ident_sys), MYSQL_FTPARSER_PLUGIN))) + Lex->last_key->key_create_info.parser_name= (yyvsp[0].ident_sys); + else + my_yyabort_error((ER_FUNCTION_NOT_DEFINED, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 36934 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1001: /* btree_or_rtree: BTREE_SYM */ +#line 6956 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_BTREE; } +#line 36940 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1002: /* btree_or_rtree: RTREE_SYM */ +#line 6957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_RTREE; } +#line 36946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1003: /* btree_or_rtree: HASH_SYM */ +#line 6958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_HASH; } +#line 36952 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1004: /* ignorability: IGNORED_SYM */ +#line 6962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 36958 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1005: /* ignorability: NOT_SYM IGNORED_SYM */ +#line 6963 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 36964 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1006: /* key_list: key_list ',' key_part order_dir */ +#line 6968 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1007: /* key_list: key_part order_dir */ +#line 6973 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1008: /* opt_without_overlaps: %empty */ +#line 6980 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1009: /* opt_without_overlaps: ',' ident WITHOUT OVERLAPS_SYM */ +#line 6982 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->without_overlaps= true; + Lex->last_key->period= (yyvsp[-2].ident_sys); + } +#line 36997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1010: /* key_part: ident */ +#line 6990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 37007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1011: /* key_part: ident '(' NUM ')' */ +#line 6996 "/home/buildbot/git/sql/sql_yacc.yy" + { + int key_part_len= atoi((yyvsp[-1].lex_str).str); + if (unlikely(!key_part_len)) + my_yyabort_error((ER_KEY_PART_0, MYF(0), (yyvsp[-3].ident_sys).str)); + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[-3].ident_sys), (uint) key_part_len); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 37020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1012: /* opt_ident: %empty */ +#line 7007 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 37026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1013: /* opt_ident: field_ident */ +#line 7008 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 37032 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1014: /* string_list: text_string */ +#line 7013 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 37038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1015: /* string_list: string_list ',' text_string */ +#line 7015 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 37044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1016: /* $@94: %empty */ +#line 7024 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->name= null_clex_str; + Lex->table_type= TABLE_TYPE_UNKNOWN; + Lex->sql_command= SQLCOM_ALTER_TABLE; + Lex->duplicates= DUP_ERROR; + Lex->first_select_lex()->order_list.empty(); + Lex->create_info.init(); + Lex->create_info.row_type= ROW_TYPE_NOT_USED; + Lex->alter_info.reset(); + Lex->no_write_to_binlog= 0; + Lex->create_info.storage_media= HA_SM_DEFAULT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + DBUG_ASSERT(!Lex->m_sql_cmd); + } +#line 37064 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1017: /* $@95: %empty */ +#line 7040 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + if (!Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + Lex->first_select_lex()->db= + (Lex->first_select_lex()->table_list.first)->db; + Lex->create_last_non_select_table= Lex->last_table(); + Lex->mark_first_table_as_inserting(); + } +#line 37080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1018: /* alter: ALTER $@94 alter_options TABLE_SYM opt_if_exists table_ident opt_lock_wait_timeout $@95 alter_commands */ +#line 7052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(!Lex->m_sql_cmd)) + { + /* Create a generic ALTER TABLE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } + Lex->pop_select(); //main select + } +#line 37095 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1019: /* $@96: %empty */ +#line 7063 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 37105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1020: /* alter: ALTER DATABASE ident_or_empty $@96 create_database_options */ +#line 7069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= (yyvsp[-2].ident_sys); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 37119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1021: /* $@97: %empty */ +#line 7079 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 37129 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1022: /* alter: ALTER DATABASE COMMENT_SYM opt_equal TEXT_STRING_sys $@97 opt_create_database_options */ +#line 7085 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= Lex_ident_sys(); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + } +#line 37142 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1023: /* alter: ALTER DATABASE ident UPGRADE_SYM DATA_SYM DIRECTORY_SYM NAME_SYM */ +#line 7094 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "DATABASE")); + lex->sql_command= SQLCOM_ALTER_DB_UPGRADE; + lex->name= (yyvsp[-4].ident_sys); + } +#line 37154 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1024: /* $@98: %empty */ +#line 7102 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_procedure_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 37163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1025: /* alter: ALTER PROCEDURE_SYM sp_name $@98 sp_a_chistics stmt_end */ +#line 7107 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37169 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1026: /* $@99: %empty */ +#line 7109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_function_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 37178 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1027: /* alter: ALTER FUNCTION_SYM sp_name $@99 sp_a_chistics stmt_end */ +#line 7114 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37184 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1028: /* $@100: %empty */ +#line 7116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, (yyvsp[-4].num), (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 37195 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1029: /* alter: ALTER view_algorithm definer_opt opt_view_suid VIEW_SYM table_ident $@100 view_list_opt AS view_select stmt_end */ +#line 7122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37201 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1030: /* $@101: %empty */ +#line 7129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, VIEW_ALGORITHM_INHERIT, (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 37212 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1031: /* alter: ALTER definer_opt opt_view_suid VIEW_SYM table_ident $@101 view_list_opt AS view_select stmt_end */ +#line 7135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1032: /* $@102: %empty */ +#line 7137 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + It is safe to use Lex->spname because + ALTER EVENT xxx RENATE TO yyy DO ALTER EVENT RENAME TO + is not allowed. Lex->spname is used in the case of RENAME TO + If it had to be supported spname had to be added to + Event_parse_data. + */ + + if (unlikely(!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + Lex->event_parse_data->identifier= (yyvsp[0].spname); + + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_begin= (yyvsp[-2].simple_string); + } +#line 37241 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1033: /* alter: ALTER definer_opt remember_name EVENT_SYM sp_name $@102 ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_status opt_ev_comment opt_ev_sql_stmt */ +#line 7160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyvsp[-4].num) || (yyvsp[-3].num) || (yyvsp[-2].num) || (yyvsp[-1].num) || (yyvsp[0].num)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_end= (char*)YYLIP->get_cpp_ptr(); + + Lex->pop_select(); //main select + } +#line 37261 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1034: /* $@103: %empty */ +#line 7176 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SERVER; + lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 37271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1035: /* alter: ALTER SERVER_SYM ident_or_text $@103 OPTIONS_SYM '(' server_options_list ')' */ +#line 7180 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1036: /* alter: ALTER USER_SYM opt_if_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 7184 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-5].object_ddl_options)); + Lex->sql_command= SQLCOM_ALTER_USER; + } +#line 37286 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1037: /* $@104: %empty */ +#line 7189 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SEQUENCE; + DBUG_ASSERT(!lex->m_sql_cmd); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 37298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1038: /* $@105: %empty */ +#line 7197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!(lex->create_info.seq_create_info= new (thd->mem_root) + sequence_definition()) || + !lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_SEQUENCE, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + } +#line 37312 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1039: /* $@106: %empty */ +#line 7207 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Create a generic ALTER SEQUENCE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_sequence((yyvsp[-4].object_ddl_options)); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37323 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1040: /* alter: ALTER SEQUENCE_SYM opt_if_exists $@104 table_ident $@105 sequence_defs $@106 stmt_end */ +#line 7212 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1041: /* account_locking_option: LOCK_SYM */ +#line 7217 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_LOCKED; + } +#line 37337 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1042: /* account_locking_option: UNLOCK_SYM */ +#line 7221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_UNLOCKED; + } +#line 37345 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1043: /* opt_password_expire_option: %empty */ +#line 7228 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NOW; + } +#line 37353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1044: /* opt_password_expire_option: NEVER_SYM */ +#line 7232 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NEVER; + } +#line 37361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1045: /* opt_password_expire_option: DEFAULT */ +#line 7236 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_DEFAULT; + } +#line 37369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1046: /* opt_password_expire_option: INTERVAL_SYM NUM DAY_SYM */ +#line 7240 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_INTERVAL; + if (!(Lex->account_options.num_expiration_days= atoi((yyvsp[-1].lex_str).str))) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "DAY", (yyvsp[-1].lex_str).str)); + } +#line 37379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1052: /* ev_alter_on_schedule_completion: %empty */ +#line 7256 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 37385 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1053: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time */ +#line 7257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37391 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1054: /* ev_alter_on_schedule_completion: ev_on_completion */ +#line 7258 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1055: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time ev_on_completion */ +#line 7259 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1056: /* opt_ev_rename_to: %empty */ +#line 7263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 37409 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1057: /* opt_ev_rename_to: RENAME TO_SYM sp_name */ +#line 7265 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use lex's spname to hold the new name. + The original name is in the Event_parse_data object + */ + Lex->spname= (yyvsp[0].spname); + (yyval.num)= 1; + } +#line 37422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1058: /* opt_ev_sql_stmt: %empty */ +#line 7276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 37428 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1059: /* opt_ev_sql_stmt: DO_SYM ev_sql_stmt */ +#line 7277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 37434 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1060: /* ident_or_empty: %empty */ +#line 7282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys)= Lex_ident_sys(); } +#line 37440 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1063: /* alter_commands: DISCARD TABLESPACE */ +#line 7289 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::DISCARD_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37452 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1064: /* alter_commands: IMPORT TABLESPACE */ +#line 7297 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::IMPORT_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1070: /* alter_commands: DROP PARTITION_SYM opt_if_exists alt_part_name_list */ +#line 7319 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_DROP; + DBUG_ASSERT(!Lex->if_exists()); + Lex->create_info.add((yyvsp[-1].object_ddl_options)); + } +#line 37474 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1071: /* alter_commands: REBUILD_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7326 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_REBUILD; + lex->no_write_to_binlog= (yyvsp[-1].num); + } +#line 37484 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1072: /* $@107: %empty */ +#line 7333 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_optimize_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1074: /* alter_commands: ANALYZE_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7346 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_analyze_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37514 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1075: /* $@108: %empty */ +#line 7357 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_check_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37528 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1077: /* $@109: %empty */ +#line 7369 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_repair_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37543 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1079: /* alter_commands: COALESCE PARTITION_SYM opt_no_write_to_binlog real_ulong_num */ +#line 7381 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_COALESCE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->alter_info.num_parts= (yyvsp[0].ulong_num); + } +#line 37554 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1080: /* alter_commands: TRUNCATE_SYM PARTITION_SYM all_or_alt_part_name_list */ +#line 7388 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_truncate_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37568 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1082: /* alter_commands: EXCHANGE_SYM PARTITION_SYM alt_part_name_item WITH TABLE_SYM table_ident have_partitioning */ +#line 7400 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table_exchange_partition((yyvsp[-1].table))) + MYSQL_YYABORT; + } +#line 37577 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1083: /* alter_commands: CONVERT_SYM PARTITION_SYM alt_part_name_item TO_SYM TABLE_SYM table_ident have_partitioning */ +#line 7406 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->stmt_alter_table((yyvsp[-1].table))) + MYSQL_YYABORT; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + lex->alter_info.partition_flags|= ALTER_PARTITION_CONVERT_OUT; + } +#line 37591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1084: /* $@110: %empty */ +#line 7416 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), nullptr, 0, + TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + + /* + This will appear as (new_db, new_name) in alter_ctx. + new_db will be IX-locked and new_name X-locked. + */ + lex->first_select_lex()->db= (yyvsp[0].table)->db; + lex->name= (yyvsp[0].table)->table; + if (lex->first_select_lex()->db.str == NULL && + lex->copy_db_to(&lex->first_select_lex()->db)) + MYSQL_YYABORT; + + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->part_info->num_parts= 1; + /* + OR-ed with ALTER_PARTITION_ADD because too many checks of + ALTER_PARTITION_ADD required. + */ + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD | + ALTER_PARTITION_CONVERT_IN; + } +#line 37625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1085: /* alter_commands: CONVERT_SYM TABLE_SYM table_ident $@110 TO_SYM PARTITION_SYM part_definition */ +#line 7446 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37636 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1086: /* remove_partitioning: REMOVE_SYM PARTITIONING_SYM */ +#line 7456 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REMOVE; + } +#line 37644 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1087: /* all_or_alt_part_name_list: ALL */ +#line 7463 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ALL; + } +#line 37652 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1089: /* $@111: %empty */ +#line 7472 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD; + DBUG_ASSERT(!Lex->create_info.if_not_exists()); + lex->create_info.set((yyvsp[-1].object_ddl_options)); + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 37668 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1090: /* add_partition_rule: ADD PARTITION_SYM opt_if_not_exists opt_no_write_to_binlog $@111 add_part_extra */ +#line 7484 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37674 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1092: /* add_part_extra: '(' part_def_list ')' */ +#line 7490 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->num_parts= lex->part_info->partitions.elements; + } +#line 37683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1093: /* add_part_extra: PARTITIONS_SYM real_ulong_num */ +#line 7495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->num_parts= (yyvsp[0].ulong_num); + } +#line 37691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1094: /* $@112: %empty */ +#line 7502 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 37704 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1096: /* reorg_parts_rule: %empty */ +#line 7515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_TABLE_REORG; + } +#line 37712 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1097: /* $@113: %empty */ +#line 7519 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REORGANIZE; + } +#line 37720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1098: /* reorg_parts_rule: alt_part_name_list $@113 INTO '(' part_def_list ')' */ +#line 7523 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_parts= part_info->partitions.elements; + } +#line 37729 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1099: /* alt_part_name_list: alt_part_name_item */ +#line 7530 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37735 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1100: /* alt_part_name_list: alt_part_name_list ',' alt_part_name_item */ +#line 7531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37741 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1101: /* alt_part_name_item: ident */ +#line 7536 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.partition_names.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 37751 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1105: /* alter_list_item: add_column column_def opt_place */ +#line 7558 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->create_last_non_select_table= lex->last_table(); + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37762 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1106: /* alter_list_item: ADD key_def */ +#line 7565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37771 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1107: /* alter_list_item: ADD period_for_system_time */ +#line 7570 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_PERIOD; + } +#line 37779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1108: /* alter_list_item: ADD PERIOD_SYM opt_if_not_exists_table_element period_for_application_time */ +#line 7575 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_period_info &period= Lex->create_info.period_info; + period.create_if_not_exists= Lex->check_exists; + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37789 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1109: /* alter_list_item: add_column '(' create_field_list ')' */ +#line 7581 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + if (!lex->alter_info.key_list.is_empty()) + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1110: /* alter_list_item: ADD constraint_def */ +#line 7588 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1111: /* alter_list_item: ADD CONSTRAINT IF_SYM not EXISTS field_ident check_constraint */ +#line 7592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), TRUE); + } +#line 37817 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1112: /* alter_list_item: CHANGE opt_column opt_if_exists_table_element field_ident field_spec opt_place */ +#line 7598 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN | ALTER_RENAME_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-2].lex_str); + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37828 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1113: /* alter_list_item: MODIFY_SYM opt_column opt_if_exists_table_element field_spec opt_place */ +#line 7606 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-1].create_field)->field_name; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1114: /* alter_list_item: DROP opt_column opt_if_exists_table_element field_ident opt_restrict */ +#line 7613 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::COLUMN, (yyvsp[-1].lex_str).str, (yyvsp[-2].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_PARSER_DROP_COLUMN; + } +#line 37853 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1115: /* alter_list_item: DROP CONSTRAINT opt_if_exists_table_element field_ident */ +#line 7623 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::CHECK_CONSTRAINT, + (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 37868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1116: /* alter_list_item: DROP FOREIGN KEY_SYM opt_if_exists_table_element field_ident */ +#line 7634 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::FOREIGN_KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_FOREIGN_KEY; + } +#line 37882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1117: /* alter_list_item: DROP opt_constraint_no_id PRIMARY_SYM KEY_SYM */ +#line 7644 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, primary_key_name.str, + FALSE)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37897 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1118: /* alter_list_item: DROP key_or_index opt_if_exists_table_element field_ident */ +#line 7655 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37911 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1119: /* alter_list_item: DISABLE_SYM KEYS */ +#line 7665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::DISABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37921 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1120: /* alter_list_item: ENABLE_SYM KEYS */ +#line 7671 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::ENABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37931 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1121: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident SET DEFAULT column_default_expr */ +#line 7677 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (check_expression((yyvsp[0].virtual_column), &(yyvsp[-3].lex_str), VCOL_DEFAULT)) + MYSQL_YYABORT; + if (unlikely(Lex->add_alter_list((yyvsp[-3].lex_str), (yyvsp[0].virtual_column), (yyvsp[-4].num)))) + MYSQL_YYABORT; + } +#line 37942 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1122: /* alter_list_item: ALTER key_or_index opt_if_exists_table_element ident ignorability */ +#line 7684 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + Alter_index_ignorability *ac= new (thd->mem_root) + Alter_index_ignorability((yyvsp[-1].ident_sys).str, (yyvsp[0].num), (yyvsp[-2].num)); + if (ac == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_index_ignorability_list.push_back(ac); + lex->alter_info.flags|= ALTER_INDEX_IGNORABILITY; + } +#line 37956 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1123: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident DROP DEFAULT */ +#line 7694 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].lex_str), (Virtual_column_info*) 0, (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1124: /* alter_list_item: RENAME opt_to table_ident */ +#line 7699 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table((yyvsp[0].table))) + MYSQL_YYABORT; + Lex->alter_info.flags|= ALTER_RENAME; + } +#line 37975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1125: /* alter_list_item: RENAME COLUMN_SYM opt_if_exists_table_element ident TO_SYM ident */ +#line 7705 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37984 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1126: /* alter_list_item: RENAME key_or_index opt_if_exists_table_element field_ident TO_SYM field_ident */ +#line 7710 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_rename_key *ak= new (thd->mem_root) + Alter_rename_key((yyvsp[-2].lex_str), (yyvsp[0].lex_str), (yyvsp[-3].num)); + if (ak == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_rename_key_list.push_back(ak); + lex->alter_info.flags|= ALTER_RENAME_INDEX; + } +#line 37998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1127: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default */ +#line 7720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[0].charset))) + MYSQL_YYABORT; + } +#line 38007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1128: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 7726 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[-2].charset), (yyvsp[0].Lex_extended_collation))) + MYSQL_YYABORT; + } +#line 38016 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1129: /* alter_list_item: create_table_options_space_separated */ +#line 7731 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_OPTIONS; + } +#line 38025 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1130: /* alter_list_item: FORCE_SYM */ +#line 7736 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_RECREATE; + } +#line 38033 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1131: /* alter_list_item: alter_order_clause */ +#line 7740 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_ORDER; + } +#line 38042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1134: /* alter_list_item: ADD SYSTEM VERSIONING_SYM */ +#line 7747 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } +#line 38051 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1135: /* alter_list_item: DROP SYSTEM VERSIONING_SYM */ +#line 7752 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_SYSTEM_VERSIONING; + Lex->create_info.options&= ~HA_VERSIONED_TABLE; + } +#line 38060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1136: /* alter_list_item: DROP PERIOD_SYM FOR_SYSTEM_TIME_SYM */ +#line 7757 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_PERIOD; + } +#line 38068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1137: /* alter_list_item: DROP PERIOD_SYM opt_if_exists_table_element FOR_SYM ident */ +#line 7761 "/home/buildbot/git/sql/sql_yacc.yy" + { + Alter_drop *ad= new Alter_drop(Alter_drop::PERIOD, (yyvsp[0].ident_sys).str, (yyvsp[-2].num)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + Lex->alter_info.drop_list.push_back(ad, thd->mem_root); + Lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 38080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1143: /* alter_algorithm_option: ALGORITHM_SYM opt_equal DEFAULT */ +#line 7780 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT); + } +#line 38089 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1144: /* alter_algorithm_option: ALGORITHM_SYM opt_equal ident */ +#line 7785 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_algorithm(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_ALGORITHM, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 38098 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1145: /* alter_lock_option: LOCK_SYM opt_equal DEFAULT */ +#line 7793 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_DEFAULT; + } +#line 38107 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1146: /* alter_lock_option: LOCK_SYM opt_equal ident */ +#line 7798 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_lock(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_LOCK, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 38116 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1147: /* opt_column: %empty */ +#line 7805 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1148: /* opt_column: COLUMN_SYM */ +#line 7806 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38128 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1149: /* opt_ignore: %empty */ +#line 7810 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 38134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1150: /* opt_ignore: IGNORE_SYM */ +#line 7811 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 38140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1151: /* $@114: %empty */ +#line 7815 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 38146 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1157: /* alter_option: IGNORE_SYM */ +#line 7829 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 38152 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1158: /* alter_option: ONLINE_SYM */ +#line 7831 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_NONE; + } +#line 38161 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1159: /* opt_restrict: %empty */ +#line 7838 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_DEFAULT; } +#line 38167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1160: /* opt_restrict: RESTRICT */ +#line 7839 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_RESTRICT; } +#line 38173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1161: /* opt_restrict: CASCADE */ +#line 7840 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_CASCADE; } +#line 38179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1162: /* opt_place: %empty */ +#line 7844 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 38185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1163: /* opt_place: AFTER_SYM ident */ +#line 7846 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str)= (yyvsp[0].ident_sys); + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 38194 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1164: /* opt_place: FIRST_SYM */ +#line 7851 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str).str= first_keyword; + (yyval.lex_str).length= 5; /* Length of "first" */ + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 38204 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1165: /* opt_to: %empty */ +#line 7859 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38210 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1166: /* opt_to: TO_SYM */ +#line 7860 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38216 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1167: /* opt_to: '=' */ +#line 7861 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38222 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1168: /* opt_to: AS */ +#line 7862 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38228 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1169: /* $@115: %empty */ +#line 7867 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_START; + lex->type = 0; + /* If you change this code don't forget to update SLAVE START too */ + } +#line 38239 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1170: /* slave: START_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel $@115 slave_until */ +#line 7874 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38245 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1171: /* $@116: %empty */ +#line 7876 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_START; + lex->type = 0; + /* If you change this code don't forget to update STOP SLAVE too */ + } +#line 38256 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1172: /* slave: START_SYM ALL SLAVES slave_thread_opts $@116 */ +#line 7882 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1173: /* slave: STOP_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel */ +#line 7884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 38273 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1174: /* slave: STOP_SYM ALL SLAVES slave_thread_opts */ +#line 7891 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 38284 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1175: /* start: START_SYM TRANSACTION_SYM opt_start_transaction_option_list */ +#line 7901 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_BEGIN; + /* READ ONLY and READ WRITE are mutually exclusive. */ + if (unlikely(((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_WRITE) && + ((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_ONLY))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + lex->start_transaction_opt= (yyvsp[0].num); + } +#line 38301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1176: /* opt_start_transaction_option_list: %empty */ +#line 7917 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 38309 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1177: /* opt_start_transaction_option_list: start_transaction_option_list */ +#line 7921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 38317 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1178: /* start_transaction_option_list: start_transaction_option */ +#line 7928 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 38325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1179: /* start_transaction_option_list: start_transaction_option_list ',' start_transaction_option */ +#line 7932 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[-2].num) | (yyvsp[0].num); + } +#line 38333 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1180: /* start_transaction_option: WITH CONSISTENT_SYM SNAPSHOT_SYM */ +#line 7939 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; + } +#line 38341 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1181: /* start_transaction_option: READ_SYM ONLY_SYM */ +#line 7943 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_ONLY; + } +#line 38349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1182: /* start_transaction_option: READ_SYM WRITE_SYM */ +#line 7947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_WRITE; + } +#line 38357 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1183: /* $@117: %empty */ +#line 7953 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt= 0; } +#line 38363 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1184: /* slave_thread_opts: $@117 slave_thread_opt_list */ +#line 7955 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1187: /* slave_thread_opt: %empty */ +#line 7964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38375 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1188: /* slave_thread_opt: SQL_THREAD */ +#line 7965 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_SQL; } +#line 38381 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1189: /* slave_thread_opt: RELAY_THREAD */ +#line 7966 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_IO; } +#line 38387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1190: /* slave_until: %empty */ +#line 7970 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1191: /* slave_until: UNTIL_SYM slave_until_opts */ +#line 7972 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(((lex->mi.log_file_name || lex->mi.pos) && + (lex->mi.relay_log_name || lex->mi.relay_log_pos)) || + !((lex->mi.log_file_name && lex->mi.pos) || + (lex->mi.relay_log_name && lex->mi.relay_log_pos)))) + my_yyabort_error((ER_BAD_SLAVE_UNTIL_COND, MYF(0))); + } +#line 38406 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1192: /* slave_until: UNTIL_SYM MASTER_GTID_POS_SYM '=' TEXT_STRING_sys */ +#line 7981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.gtid_pos_str = (yyvsp[0].lex_str); + } +#line 38414 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1195: /* $@118: %empty */ +#line 7993 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_CHECKSUM; + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38425 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1196: /* checksum: CHECKSUM_SYM table_or_tables $@118 table_list opt_checksum_type */ +#line 8000 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38431 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1197: /* opt_checksum_type: %empty */ +#line 8004 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= 0; } +#line 38437 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1198: /* opt_checksum_type: QUICK */ +#line 8005 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_QUICK; } +#line 38443 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1199: /* opt_checksum_type: EXTENDED_SYM */ +#line 8006 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_EXTEND; } +#line 38449 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1201: /* $@119: %empty */ +#line 8012 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 38455 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1203: /* $@120: %empty */ +#line 8018 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_REPAIR; + lex->no_write_to_binlog= (yyvsp[0].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38469 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1204: /* repair: REPAIR opt_no_write_to_binlog $@120 repair_table_or_view */ +#line 8028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_repair_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1205: /* opt_mi_repair_type: %empty */ +#line 8038 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 38487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1206: /* opt_mi_repair_type: mi_repair_types */ +#line 8039 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38493 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1207: /* mi_repair_types: mi_repair_type */ +#line 8043 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1208: /* mi_repair_types: mi_repair_type mi_repair_types */ +#line 8044 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1209: /* mi_repair_type: QUICK */ +#line 8048 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 38511 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1210: /* mi_repair_type: EXTENDED_SYM */ +#line 8049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 38517 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1211: /* mi_repair_type: USE_FRM */ +#line 8050 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_USEFRM; } +#line 38523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1212: /* opt_view_repair_type: %empty */ +#line 8054 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38529 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1213: /* opt_view_repair_type: FOR_SYM UPGRADE_SYM */ +#line 8055 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38535 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1214: /* opt_view_repair_type: FROM MYSQL_SYM */ +#line 8056 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FROM_MYSQL; } +#line 38541 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1215: /* $@121: %empty */ +#line 8061 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_ANALYZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38555 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1216: /* analyze: ANALYZE_SYM opt_no_write_to_binlog table_or_tables $@121 analyze_table_list */ +#line 8071 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_analyze_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38567 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1220: /* opt_persistent_stat_clause: %empty */ +#line 8091 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38573 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1221: /* opt_persistent_stat_clause: PERSISTENT_SYM FOR_SYM persistent_stat_spec */ +#line 8093 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->with_persistent_for_clause= TRUE; + } +#line 38581 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1222: /* persistent_stat_spec: ALL */ +#line 8100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38587 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1223: /* persistent_stat_spec: COLUMNS persistent_column_stat_spec INDEXES persistent_index_stat_spec */ +#line 8102 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1224: /* persistent_column_stat_spec: ALL */ +#line 8106 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38599 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1225: /* $@122: %empty */ +#line 8108 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->column_list= new (thd->mem_root) List; + if (unlikely(lex->column_list == NULL)) + MYSQL_YYABORT; + } +#line 38610 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1226: /* persistent_column_stat_spec: '(' $@122 table_column_list ')' */ +#line 8116 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1227: /* persistent_index_stat_spec: ALL */ +#line 8120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38622 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1228: /* $@123: %empty */ +#line 8122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->index_list= new (thd->mem_root) List; + if (unlikely(lex->index_list == NULL)) + MYSQL_YYABORT; + } +#line 38633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1229: /* persistent_index_stat_spec: '(' $@123 table_index_list ')' */ +#line 8130 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38639 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1230: /* table_column_list: %empty */ +#line 8135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1231: /* table_column_list: ident */ +#line 8137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 38654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1232: /* table_column_list: table_column_list ',' ident */ +#line 8142 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 38663 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1233: /* table_index_list: %empty */ +#line 8150 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38669 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1236: /* table_index_name: ident */ +#line 8157 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), + thd->mem_root); + } +#line 38679 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1237: /* table_index_name: PRIMARY_SYM */ +#line 8164 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_STRING str= {(char*) "PRIMARY", 7}; + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&str, sizeof(LEX_STRING)), + thd->mem_root); + } +#line 38690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1238: /* binlog_base64_event: BINLOG_SYM TEXT_STRING_sys */ +#line 8174 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[0].lex_str); + Lex->ident.str= NULL; + Lex->ident.length= 0; + } +#line 38701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1239: /* binlog_base64_event: BINLOG_SYM '@' ident_or_text ',' '@' ident_or_text */ +#line 8182 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[-3].lex_str); + Lex->ident= (yyvsp[0].lex_str); + } +#line 38711 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1241: /* $@124: %empty */ +#line 8192 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 38717 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1243: /* $@125: %empty */ +#line 8197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->sql_command = SQLCOM_CHECK; + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1244: /* check: CHECK_SYM $@125 check_view_or_table */ +#line 8207 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "CHECK")); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_check_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38745 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1245: /* opt_mi_check_type: %empty */ +#line 8219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 38751 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1246: /* opt_mi_check_type: mi_check_types */ +#line 8220 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38757 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1247: /* mi_check_types: mi_check_type */ +#line 8224 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38763 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1248: /* mi_check_types: mi_check_type mi_check_types */ +#line 8225 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1249: /* mi_check_type: QUICK */ +#line 8229 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 38775 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1250: /* mi_check_type: FAST_SYM */ +#line 8230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_FAST; } +#line 38781 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1251: /* mi_check_type: MEDIUM_SYM */ +#line 8231 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_MEDIUM; } +#line 38787 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1252: /* mi_check_type: EXTENDED_SYM */ +#line 8232 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 38793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1253: /* mi_check_type: CHANGED */ +#line 8233 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } +#line 38799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1254: /* mi_check_type: FOR_SYM UPGRADE_SYM */ +#line 8234 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1255: /* opt_view_check_type: %empty */ +#line 8238 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38811 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1256: /* opt_view_check_type: FOR_SYM UPGRADE_SYM */ +#line 8239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38817 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1257: /* $@126: %empty */ +#line 8244 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_OPTIMIZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38831 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1258: /* optimize: OPTIMIZE opt_no_write_to_binlog table_or_tables $@126 table_list opt_lock_wait_timeout */ +#line 8254 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_optimize_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1259: /* opt_no_write_to_binlog: %empty */ +#line 8264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 38849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1260: /* opt_no_write_to_binlog: NO_WRITE_TO_BINLOG */ +#line 8265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1261: /* opt_no_write_to_binlog: LOCAL_SYM */ +#line 8266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1262: /* $@127: %empty */ +#line 8271 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_RENAME_TABLE; + Lex->create_info.set((yyvsp[0].object_ddl_options)); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1263: /* rename: RENAME table_or_tables opt_if_exists $@127 table_to_table_list */ +#line 8278 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38880 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1264: /* rename: RENAME USER_SYM clear_privileges rename_list */ +#line 8282 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_RENAME_USER; + } +#line 38888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1265: /* rename_list: user TO_SYM user */ +#line 8289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1266: /* rename_list: rename_list ',' user TO_SYM user */ +#line 8295 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1269: /* table_to_table: table_ident opt_lock_wait_timeout TO_SYM table_ident */ +#line 8309 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *sl= lex->current_select; + if (unlikely(!sl->add_table_to_list(thd, (yyvsp[-3].table),NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE)) || + unlikely(!sl->add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE))) + MYSQL_YYABORT; + } +#line 38924 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1270: /* $@128: %empty */ +#line 8324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.reset(); + } +#line 38932 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1271: /* keycache: CACHE_SYM INDEX_SYM $@128 keycache_list_or_parts IN_SYM key_cache_name */ +#line 8328 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; + lex->ident= (yyvsp[0].lex_str); + } +#line 38942 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1276: /* assign_to_keycache: table_ident cache_keys_spec */ +#line 8347 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38954 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1277: /* assign_to_keycache_parts: table_ident adm_partition cache_keys_spec */ +#line 8358 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38966 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1278: /* key_cache_name: ident */ +#line 8368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 38972 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1279: /* key_cache_name: DEFAULT */ +#line 8369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str) = default_key_cache_base; } +#line 38978 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1280: /* $@129: %empty */ +#line 8374 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_PRELOAD_KEYS; + lex->alter_info.reset(); + if (lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38990 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1281: /* preload: LOAD INDEX_SYM INTO CACHE_SYM $@129 preload_list_or_parts */ +#line 8382 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1286: /* preload_keys: table_ident cache_keys_spec opt_ignore_leaves */ +#line 8399 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 39010 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1287: /* preload_keys_parts: table_ident adm_partition cache_keys_spec opt_ignore_leaves */ +#line 8410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-3].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 39022 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1288: /* $@130: %empty */ +#line 8421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ADMIN; + } +#line 39030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1290: /* $@131: %empty */ +#line 8428 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->alloc_index_hints(thd); + Select->set_index_hint_type(INDEX_HINT_USE, + INDEX_HINT_MASK_ALL); + } +#line 39040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1292: /* cache_key_list_or_empty: %empty */ +#line 8437 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 39046 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1294: /* opt_ignore_leaves: %empty */ +#line 8443 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39052 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1295: /* opt_ignore_leaves: IGNORE_SYM LEAVES */ +#line 8444 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_OPTION_IGNORE_LEAVES; } +#line 39058 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1296: /* $@132: %empty */ +#line 8454 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 39069 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1297: /* select: query_expression_no_with_clause $@132 opt_procedure_or_into */ +#line 8461 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause(NULL); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 39080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1298: /* $@133: %empty */ +#line 8468 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 39091 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1299: /* select: with_clause query_expression_no_with_clause $@133 opt_procedure_or_into */ +#line 8475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex_unit)->first_select()); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 39103 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1300: /* $@134: %empty */ +#line 8486 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 39112 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1301: /* select_into: select_into_query_specification $@134 opt_order_limit_lock */ +#line 8491 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 39126 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1302: /* $@135: %empty */ +#line 8502 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 39135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1303: /* select_into: with_clause select_into_query_specification $@135 opt_order_limit_lock */ +#line 8507 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + unit->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 39151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1304: /* simple_table: query_specification */ +#line 8521 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 39157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1305: /* simple_table: table_value_constructor */ +#line 8522 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 39163 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1306: /* $@136: %empty */ +#line 8527 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_TVC_start()) + MYSQL_YYABORT; + } +#line 39172 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1307: /* table_value_constructor: VALUES $@136 values_list */ +#line 8532 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_TVC_end())) + MYSQL_YYABORT; + } +#line 39181 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1308: /* $@137: %empty */ +#line 8540 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel; + LEX *lex= Lex; + if (!(sel= lex->alloc_select(TRUE)) || lex->push_select(sel)) + MYSQL_YYABORT; + sel->init_select(); + sel->braces= FALSE; + } +#line 39194 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1309: /* $@138: %empty */ +#line 8549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= SELECT_LIST; + } +#line 39202 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1310: /* query_specification_start: SELECT_SYM $@137 select_options $@138 select_item_list */ +#line 8553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 39210 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1311: /* query_specification: query_specification_start opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8565 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 39218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1312: /* select_into_query_specification: query_specification_start into opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8578 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 39226 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1313: /* query_expression: query_expression_no_with_clause */ +#line 8636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause(NULL); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 39235 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1314: /* query_expression: with_clause query_expression_no_with_clause */ +#line 8642 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause((yyvsp[-1].with_clause)); + (yyvsp[-1].with_clause)->attach_to((yyvsp[0].select_lex_unit)->first_select()); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 39245 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1315: /* query_expression_no_with_clause: query_expression_body_ext */ +#line 8655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 39251 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1316: /* query_expression_no_with_clause: query_expression_body_ext_parens */ +#line 8656 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 39257 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1317: /* $@139: %empty */ +#line 8671 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].select_lex_unit)->first_select()->next_select()) + { + if (Lex->parsed_multi_operand_query_expression_body((yyvsp[0].select_lex_unit))) + MYSQL_YYABORT; + } + } +#line 39269 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1318: /* query_expression_body_ext: query_expression_body $@139 opt_query_expression_tail */ +#line 8679 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].order_limit_lock)) + (yyval.select_lex_unit)= (yyvsp[-2].select_lex_unit); + else + (yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)); + } +#line 39280 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1319: /* $@140: %empty */ +#line 8686 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select(!(yyvsp[0].select_lex_unit)->first_select()->next_select() ? + (yyvsp[0].select_lex_unit)->first_select() : (yyvsp[0].select_lex_unit)->fake_select_lex); + } +#line 39289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1320: /* query_expression_body_ext: query_expression_body_ext_parens $@140 query_expression_tail */ +#line 8691 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body_ext_parens((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)))) + MYSQL_YYABORT; + } +#line 39298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1321: /* query_expression_body_ext_parens: '(' query_expression_body_ext_parens ')' */ +#line 8699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); } +#line 39304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1322: /* query_expression_body_ext_parens: '(' query_expression_body_ext ')' */ +#line 8701 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= (yyvsp[-1].select_lex_unit)->first_select()->next_select() ? + (yyvsp[-1].select_lex_unit)->fake_select_lex : (yyvsp[-1].select_lex_unit)->first_select(); + sel->braces= true; + (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); + } +#line 39315 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1323: /* query_expression_body: query_simple */ +#line 8716 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select((yyvsp[0].select_lex)); + if (!((yyval.select_lex_unit)= Lex->create_unit((yyvsp[0].select_lex)))) + MYSQL_YYABORT; + } +#line 39325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1324: /* $@141: %empty */ +#line 8723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].select_lex_unit)->first_select()->next_select()) + { + Lex->pop_select(); + } + } +#line 39336 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1325: /* query_expression_body: query_expression_body unit_type_decl $@141 query_primary */ +#line 8730 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body((yyvsp[-3].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-2].unit_operation).unit_type, + (yyvsp[-2].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 39347 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1326: /* query_expression_body: query_expression_body_ext_parens unit_type_decl query_primary */ +#line 8739 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body_ext_parens( + (yyvsp[-2].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-1].unit_operation).unit_type, + (yyvsp[-1].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 39359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1327: /* query_primary: query_simple */ +#line 8755 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 39365 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1328: /* query_primary: query_expression_body_ext_parens */ +#line 8757 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex_unit)->first_select(); } +#line 39371 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1329: /* query_simple: simple_table */ +#line 8766 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex);} +#line 39377 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1330: /* subselect: query_expression */ +#line 8771 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 39386 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1331: /* subquery: query_expression_body_ext_parens */ +#line 8812 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].select_lex_unit)->fake_select_lex) + (yyvsp[0].select_lex_unit)->first_select()->braces= false; + else + (yyvsp[0].select_lex_unit)->fake_select_lex->braces= false; + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 39399 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1332: /* subquery: '(' with_clause query_expression_no_with_clause ')' */ +#line 8821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to((yyvsp[-1].select_lex_unit)->first_select()); + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[-1].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 39410 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1336: /* table_reference_list: join_table_list */ +#line 8840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->context.table_list= + Select->context.first_name_resolution_table= + Select->table_list.first; + } +#line 39420 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1339: /* select_options: select_option_list */ +#line 8855 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((Select->options & SELECT_DISTINCT) && + (Select->options & SELECT_ALL))) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT")); + } +#line 39430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1340: /* opt_history_unit: %empty */ +#line 8864 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 39438 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1341: /* opt_history_unit: TRANSACTION_SYM */ +#line 8868 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TRX_ID; + } +#line 39446 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1342: /* opt_history_unit: TIMESTAMP */ +#line 8872 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 39454 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1343: /* history_point: TIMESTAMP TEXT_STRING */ +#line 8879 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true))) + MYSQL_YYABORT; + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, item); + } +#line 39467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1344: /* history_point: function_call_keyword_timestamp */ +#line 8888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)); + } +#line 39475 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1345: /* history_point: opt_history_unit bit_expr */ +#line 8892 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point((yyvsp[-1].vers_range_unit), (yyvsp[0].item)); + } +#line 39483 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1346: /* for_portion_of_time_clause: FOR_SYM PORTION_SYM OF_SYM remember_tok_start ident FROM bit_expr TO_SYM bit_expr */ +#line 8900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(0 == strcasecmp((yyvsp[-4].ident_sys).str, "SYSTEM_TIME"))) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-5].simple_string)); + MYSQL_YYABORT; + } + Lex->period_conditions.init(SYSTEM_TIME_FROM_TO, + Vers_history_point(VERS_TIMESTAMP, (yyvsp[-2].item)), + Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)), + (yyvsp[-4].ident_sys)); + } +#line 39499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1347: /* opt_for_portion_of_time_clause: %empty */ +#line 8915 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 39507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1348: /* opt_for_portion_of_time_clause: for_portion_of_time_clause */ +#line 8919 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 39515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1349: /* opt_for_system_time_clause: %empty */ +#line 8926 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 39523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1350: /* opt_for_system_time_clause: FOR_SYSTEM_TIME_SYM system_time_expr */ +#line 8930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 39531 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1351: /* system_time_expr: AS OF_SYM history_point */ +#line 8937 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_AS_OF, (yyvsp[0].vers_history_point)); + } +#line 39539 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1352: /* system_time_expr: ALL */ +#line 8941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_ALL); + } +#line 39547 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1353: /* system_time_expr: FROM history_point TO_SYM history_point */ +#line 8945 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_FROM_TO, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 39555 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1354: /* system_time_expr: BETWEEN_SYM history_point AND_SYM history_point */ +#line 8949 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BETWEEN, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 39563 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1358: /* select_option: SQL_NO_CACHE_SYM */ +#line 8962 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_NO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_NO_CACHE")); + Select->options|= OPTION_NO_QUERY_CACHE; + } +#line 39576 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1359: /* select_option: SQL_CACHE_SYM */ +#line 8971 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_TO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_CACHE")); + Select->options|= OPTION_TO_QUERY_CACHE; + } +#line 39589 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1360: /* select_lock_type: FOR_SYM UPDATE_SYM opt_lock_wait_timeout_new */ +#line 8984 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= TRUE; + } +#line 39599 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1361: /* select_lock_type: LOCK_SYM IN_SYM SHARE_SYM MODE_SYM opt_lock_wait_timeout_new */ +#line 8990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= FALSE; + } +#line 39609 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1362: /* opt_select_lock_type: %empty */ +#line 9000 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 39617 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1363: /* opt_select_lock_type: select_lock_type */ +#line 9004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 39625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1364: /* opt_lock_wait_timeout_new: %empty */ +#line 9011 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 39633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1365: /* opt_lock_wait_timeout_new: WAIT_SYM ulong_num */ +#line 9015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= (yyvsp[0].ulong_num); + } +#line 39643 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1366: /* opt_lock_wait_timeout_new: NOWAIT_SYM */ +#line 9021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= 0; + } +#line 39653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1367: /* opt_lock_wait_timeout_new: SKIP_SYM LOCKED_SYM */ +#line 9027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).skip_locked= 1; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SKIP_LOCKED); + } +#line 39663 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1370: /* select_item_list: '*' */ +#line 9038 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool is_parsing_returning= + thd->lex->current_select->parsing_place == + IN_RETURNING; + SELECT_LEX *correct_select= is_parsing_returning ? + thd->lex->returning() : + thd->lex->current_select; + Item *item= new (thd->mem_root) + Item_field(thd, &correct_select->context, + star_clex_str); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_item_to_list(thd, item))) + MYSQL_YYABORT; + correct_select->with_wild++; + } +#line 39684 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1371: /* select_item: remember_name select_sublist_qualified_asterisk remember_end */ +#line 9058 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_item_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + } +#line 39693 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1372: /* select_item: remember_name expr remember_end select_alias */ +#line 9063 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-3].simple_string) < (yyvsp[-1].simple_string)); + + if (unlikely(add_item_to_list(thd, (yyvsp[-2].item)))) + MYSQL_YYABORT; + if ((yyvsp[0].lex_str).str) + { + if (unlikely(Lex->sql_command == SQLCOM_CREATE_VIEW && + check_column_name((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), (yyvsp[0].lex_str).str)); + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + else if (!(yyvsp[-2].item)->name.str || (yyvsp[-2].item)->name.str == item_empty_name) + { + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + } + } +#line 39716 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1373: /* remember_tok_start: %empty */ +#line 9084 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_tok_start(); + } +#line 39724 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1374: /* remember_name: %empty */ +#line 9090 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_start(); + } +#line 39732 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1375: /* remember_end: %empty */ +#line 9096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_end_rtrim(); + } +#line 39740 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1376: /* select_alias: %empty */ +#line 9102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=null_clex_str;} +#line 39746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1377: /* select_alias: AS ident */ +#line 9103 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1378: /* select_alias: AS TEXT_STRING_sys */ +#line 9104 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1379: /* select_alias: ident */ +#line 9105 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39764 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1380: /* select_alias: TEXT_STRING_sys */ +#line 9106 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39770 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1381: /* opt_default_time_precision: %empty */ +#line 9110 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1382: /* opt_default_time_precision: '(' ')' */ +#line 9111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39782 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1383: /* opt_default_time_precision: '(' real_ulong_num ')' */ +#line 9112 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39788 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1384: /* opt_time_precision: %empty */ +#line 9116 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1385: /* opt_time_precision: '(' ')' */ +#line 9117 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1386: /* opt_time_precision: '(' real_ulong_num ')' */ +#line 9118 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39806 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1387: /* optional_braces: %empty */ +#line 9122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39812 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1388: /* optional_braces: '(' ')' */ +#line 9123 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39818 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1389: /* expr: expr or expr */ +#line 9129 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Design notes: + Do not use a manually maintained stack like thd->lex->xxx_list, + but use the internal bison stack ($$, $1 and $3) instead. + Using the bison stack is: + - more robust to changes in the grammar, + - guaranteed to be in sync with the parser state, + - better for performances (no memory allocation). + */ + Item_cond_or *item1; + Item_cond_or *item3; + if (is_cond_or((yyvsp[-2].item))) + { + item1= (Item_cond_or*) (yyvsp[-2].item); + if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + (X1 OR X2) OR (Y1 OR Y2) ==> OR (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 OR X2) OR Y ==> OR (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + X OR (Y1 OR Y2) ==> OR (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X OR Y */ + (yyval.item)= new (thd->mem_root) Item_cond_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39873 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1390: /* expr: expr XOR expr */ +#line 9180 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* XOR is a proprietary extension */ + (yyval.item)= new (thd->mem_root) Item_func_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39884 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1391: /* expr: expr and expr */ +#line 9187 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* See comments in rule expr: expr or expr */ + Item_cond_and *item1; + Item_cond_and *item3; + if (is_cond_and((yyvsp[-2].item))) + { + item1= (Item_cond_and*) (yyvsp[-2].item); + if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + (X1 AND X2) AND (Y1 AND Y2) ==> AND (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 AND X2) AND Y ==> AND (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + X AND (Y1 AND Y2) ==> AND (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X AND Y */ + (yyval.item)= new (thd->mem_root) Item_cond_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39931 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1392: /* expr: NOT_SYM expr */ +#line 9230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1394: /* boolean_test: boolean_test IS TRUE_SYM */ +#line 9240 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_istrue(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39951 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1395: /* boolean_test: boolean_test IS not TRUE_SYM */ +#line 9246 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnottrue(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39961 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1396: /* boolean_test: boolean_test IS FALSE_SYM */ +#line 9252 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isfalse(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39971 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1397: /* boolean_test: boolean_test IS not FALSE_SYM */ +#line 9258 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotfalse(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39981 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1398: /* boolean_test: boolean_test IS UNKNOWN_SYM */ +#line 9264 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1399: /* boolean_test: boolean_test IS not UNKNOWN_SYM */ +#line 9270 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1400: /* boolean_test: boolean_test IS NULL_SYM */ +#line 9276 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40011 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1401: /* boolean_test: boolean_test IS not NULL_SYM */ +#line 9282 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40021 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1402: /* boolean_test: boolean_test EQUAL_SYM predicate */ +#line 9288 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_equal(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40031 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1403: /* boolean_test: boolean_test comp_op predicate */ +#line 9294 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (*(yyvsp[-1].boolfunc2creator))(0)->create(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40041 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1404: /* boolean_test: boolean_test comp_op all_or_any '(' subselect ')' */ +#line 9300 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= all_any_subquery_creator(thd, (yyvsp[-5].item), (yyvsp[-4].boolfunc2creator), (yyvsp[-3].num), (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40051 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1406: /* predicate: predicate IN_SYM subquery */ +#line 9310 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-2].item), (yyvsp[0].select_lex)); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40061 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1407: /* predicate: predicate not IN_SYM subquery */ +#line 9316 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-3].item), (yyvsp[0].select_lex)); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1408: /* predicate: predicate IN_SYM '(' expr ')' */ +#line 9325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-4].item), true, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40084 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1409: /* predicate: predicate IN_SYM '(' expr ',' expr_list ')' */ +#line 9331 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-6].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40096 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1410: /* predicate: predicate not IN_SYM '(' expr ')' */ +#line 9339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-5].item), false, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40106 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1411: /* predicate: predicate not IN_SYM '(' expr ',' expr_list ')' */ +#line 9345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-7].item), thd->mem_root); + Item_func_in *item= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1412: /* predicate: predicate BETWEEN_SYM predicate AND_SYM predicate */ +#line 9354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_between(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40129 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1413: /* predicate: predicate not BETWEEN_SYM predicate AND_SYM predicate */ +#line 9360 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_between *item; + item= new (thd->mem_root) Item_func_between(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40141 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1414: /* predicate: predicate SOUNDS_SYM LIKE predicate */ +#line 9368 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item1= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[-3].item)); + Item *item4= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[0].item)); + if (unlikely(item1 == NULL) || unlikely(item4 == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_eq(thd, item1, item4); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40155 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1415: /* predicate: predicate LIKE predicate */ +#line 9378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-2].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40165 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1416: /* predicate: predicate LIKE predicate ESCAPE_SYM predicate */ +#line 9384 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 40176 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1417: /* predicate: predicate not LIKE predicate */ +#line 9391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-3].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1418: /* predicate: predicate not LIKE predicate ESCAPE_SYM predicate */ +#line 9398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 40199 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1419: /* predicate: predicate REGEXP predicate */ +#line 9406 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1420: /* predicate: predicate not REGEXP predicate */ +#line 9412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-3].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40222 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1422: /* bit_expr: bit_expr '|' bit_expr */ +#line 9425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40232 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1423: /* bit_expr: bit_expr '&' bit_expr */ +#line 9431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1424: /* bit_expr: bit_expr SHIFT_LEFT bit_expr */ +#line 9437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_left(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40252 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1425: /* bit_expr: bit_expr SHIFT_RIGHT bit_expr */ +#line 9443 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_right(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40262 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1426: /* bit_expr: bit_expr ORACLE_CONCAT_SYM bit_expr */ +#line 9449 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat_operator_oracle(thd, + (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40273 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1427: /* bit_expr: bit_expr '+' bit_expr */ +#line 9456 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_plus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1428: /* bit_expr: bit_expr '-' bit_expr */ +#line 9462 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40293 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1429: /* bit_expr: bit_expr '+' INTERVAL_SYM expr interval */ +#line 9468 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40303 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1430: /* bit_expr: bit_expr '-' INTERVAL_SYM expr interval */ +#line 9474 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40313 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1431: /* bit_expr: INTERVAL_SYM expr interval '+' expr */ +#line 9481 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40323 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1432: /* bit_expr: '+' INTERVAL_SYM expr interval '+' expr */ +#line 9487 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40333 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1433: /* bit_expr: '-' INTERVAL_SYM expr interval '+' expr */ +#line 9493 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40343 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1434: /* bit_expr: bit_expr '*' bit_expr */ +#line 9499 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mul(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1435: /* bit_expr: bit_expr '/' bit_expr */ +#line 9505 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40363 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1436: /* bit_expr: bit_expr '%' bit_expr */ +#line 9511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1437: /* bit_expr: bit_expr DIV_SYM bit_expr */ +#line 9517 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_int_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40383 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1438: /* bit_expr: bit_expr MOD_SYM bit_expr */ +#line 9523 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1439: /* bit_expr: bit_expr '^' bit_expr */ +#line 9529 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1449: /* comp_op: '=' */ +#line 9558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_eq_creator; } +#line 40409 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1450: /* comp_op: GE */ +#line 9559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ge_creator; } +#line 40415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1451: /* comp_op: '>' */ +#line 9560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_gt_creator; } +#line 40421 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1452: /* comp_op: LE */ +#line 9561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_le_creator; } +#line 40427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1453: /* comp_op: '<' */ +#line 9562 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_lt_creator; } +#line 40433 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1454: /* comp_op: NE */ +#line 9563 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ne_creator; } +#line 40439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1455: /* all_or_any: ALL */ +#line 9567 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 40445 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1456: /* all_or_any: ANY_SYM */ +#line 9568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 40451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1457: /* opt_dyncol_type: %empty */ +#line 9573 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_NULL); /* automatic type */ + } +#line 40459 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1458: /* opt_dyncol_type: AS dyncol_type */ +#line 9576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type)= (yyvsp[0].Lex_dyncol_type); } +#line 40465 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1462: /* numeric_dyncol_type: INT_SYM */ +#line 9586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_INT); } +#line 40471 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1463: /* numeric_dyncol_type: UNSIGNED INT_SYM */ +#line 9587 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_UINT); } +#line 40477 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1464: /* numeric_dyncol_type: DOUBLE_SYM */ +#line 9588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 40483 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1465: /* numeric_dyncol_type: REAL */ +#line 9589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 40489 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1466: /* numeric_dyncol_type: FLOAT_SYM */ +#line 9590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 40495 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1467: /* numeric_dyncol_type: DECIMAL_SYM float_options */ +#line 9591 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DECIMAL, (yyvsp[0].Lex_length_and_dec)); } +#line 40501 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1468: /* temporal_dyncol_type: DATE_SYM */ +#line 9595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATE); } +#line 40507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1469: /* temporal_dyncol_type: TIME_SYM opt_field_scale */ +#line 9596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_TIME, (yyvsp[0].Lex_length_and_dec)); } +#line 40513 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1470: /* temporal_dyncol_type: DATETIME opt_field_scale */ +#line 9597 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATETIME, (yyvsp[0].Lex_length_and_dec)); } +#line 40519 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1471: /* string_dyncol_type: char opt_binary */ +#line 9602 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_dyncol_type).set(DYN_COL_STRING, (yyvsp[0].Lex_exact_charset_extended_collation_attrs), thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 40528 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1472: /* string_dyncol_type: nchar */ +#line 9607 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_STRING, national_charset_info); + } +#line 40536 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1473: /* dyncall_create_element: expr ',' expr opt_dyncol_type */ +#line 9614 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def)= (DYNCALL_CREATE_DEF *) + alloc_root(thd->mem_root, sizeof(DYNCALL_CREATE_DEF)); + if (unlikely((yyval.dyncol_def) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def)->key= (yyvsp[-3].item); + (yyval.dyncol_def)->value= (yyvsp[-1].item); + (yyval.dyncol_def)->type= (DYNAMIC_COLUMN_TYPE)(yyvsp[0].Lex_dyncol_type).dyncol_type(); + (yyval.dyncol_def)->cs= (yyvsp[0].Lex_dyncol_type).charset_collation(); + if ((yyvsp[0].Lex_dyncol_type).has_explicit_length()) + (yyval.dyncol_def)->len= (yyvsp[0].Lex_dyncol_type).length(); + else + (yyval.dyncol_def)->len= 0; + if ((yyvsp[0].Lex_dyncol_type).has_explicit_dec()) + (yyval.dyncol_def)->frac= (yyvsp[0].Lex_dyncol_type).dec(); + else + (yyval.dyncol_def)->len= 0; + } +#line 40559 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1474: /* dyncall_create_list: dyncall_create_element */ +#line 9636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def_list)= new (thd->mem_root) List; + if (unlikely((yyval.dyncol_def_list) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + } +#line 40570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1475: /* dyncall_create_list: dyncall_create_list ',' dyncall_create_element */ +#line 9643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + (yyval.dyncol_def_list)= (yyvsp[-2].dyncol_def_list); + } +#line 40579 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1476: /* plsql_cursor_attr: ISOPEN_SYM */ +#line 9651 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ISOPEN; } +#line 40585 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1477: /* plsql_cursor_attr: FOUND_SYM */ +#line 9652 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_FOUND; } +#line 40591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1478: /* plsql_cursor_attr: NOTFOUND_SYM */ +#line 9653 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_NOTFOUND; } +#line 40597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1479: /* plsql_cursor_attr: ROWCOUNT_SYM */ +#line 9654 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ROWCOUNT; } +#line 40603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1480: /* explicit_cursor_attr: ident PERCENT_ORACLE_SYM plsql_cursor_attr */ +#line 9659 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_plsql_cursor_attr(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].plsql_cursor_attr))))) + MYSQL_YYABORT; + } +#line 40612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1483: /* trim_operands_regular: expr */ +#line 9672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 40618 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1484: /* trim_operands_special: LEADING expr FROM expr */ +#line 9676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1485: /* trim_operands_special: TRAILING expr FROM expr */ +#line 9677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40630 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1486: /* trim_operands_special: BOTH expr FROM expr */ +#line 9678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40636 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1487: /* trim_operands_special: LEADING FROM expr */ +#line 9679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[0].item)); } +#line 40642 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1488: /* trim_operands_special: TRAILING FROM expr */ +#line 9680 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[0].item)); } +#line 40648 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1489: /* trim_operands_special: BOTH FROM expr */ +#line 9681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 40654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1490: /* trim_operands_special: expr FROM expr */ +#line 9682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 40660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1497: /* column_default_non_parenthesized_expr: param_marker */ +#line 9720 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item_param); } +#line 40666 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1499: /* column_default_non_parenthesized_expr: sum_expr */ +#line 9723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top || Lex->json_table) + { + my_error(ER_INVALID_GROUP_FUNC_USE, MYF(0)); + MYSQL_YYABORT; + } + } +#line 40678 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1500: /* column_default_non_parenthesized_expr: window_func_expr */ +#line 9731 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top) + { + my_error(ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION, MYF(0)); + MYSQL_YYABORT; + } + } +#line 40690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1502: /* column_default_non_parenthesized_expr: ROW_SYM '(' expr ',' expr_list ')' */ +#line 9740 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1503: /* column_default_non_parenthesized_expr: EXISTS '(' subselect ')' */ +#line 9747 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_exists_subselect(thd, (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40711 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1504: /* column_default_non_parenthesized_expr: '{' ident expr '}' */ +#line 9753 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].item)->make_odbc_literal(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 40720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1505: /* column_default_non_parenthesized_expr: MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')' */ +#line 9758 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + Item_func_match *i1= new (thd->mem_root) Item_func_match(thd, *(yyvsp[-5].item_list), + (yyvsp[-1].num)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + Select->add_ftfunc_to_list(thd, i1); + (yyval.item)= i1; + } +#line 40734 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1506: /* column_default_non_parenthesized_expr: CAST_SYM '(' expr AS cast_type ')' */ +#line 9768 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1507: /* column_default_non_parenthesized_expr: CASE_SYM when_list_opt_else END */ +#line 9773 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new(thd->mem_root) Item_func_case_searched(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1508: /* column_default_non_parenthesized_expr: CASE_SYM expr when_list_opt_else END */ +#line 9778 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + if (unlikely(!((yyval.item)= new (thd->mem_root) Item_func_case_simple(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40762 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1509: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr ',' cast_type ')' */ +#line 9784 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40771 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1510: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr USING charset_name ')' */ +#line 9789 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_conv_charset(thd, (yyvsp[-3].item), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40781 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1511: /* column_default_non_parenthesized_expr: DEFAULT '(' simple_ident ')' */ +#line 9795 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_splocal *il= (yyvsp[-1].item)->get_item_splocal(); + if (unlikely(il)) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); + (yyval.item)= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), + (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->default_used= TRUE; + } +#line 40796 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1512: /* column_default_non_parenthesized_expr: VALUE_SYM '(' simple_ident_nospvar ')' */ +#line 9806 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_insert_value(thd, Lex->current_context(), + (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40807 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1513: /* column_default_non_parenthesized_expr: NEXT_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9813 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40816 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1514: /* column_default_non_parenthesized_expr: NEXTVAL_SYM '(' table_ident ')' */ +#line 9818 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40825 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1515: /* column_default_non_parenthesized_expr: PREVIOUS_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9823 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40834 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1516: /* column_default_non_parenthesized_expr: LASTVAL_SYM '(' table_ident ')' */ +#line 9828 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1517: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ')' */ +#line 9833 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-3].table), (yyvsp[-1].longlong_number), 0, 1)))) + MYSQL_YYABORT; + } +#line 40852 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1518: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ')' */ +#line 9838 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-5].table), (yyvsp[-3].longlong_number), 0, (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 40861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1519: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ',' ulonglong_num ')' */ +#line 9843 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-7].table), (yyvsp[-5].longlong_number), (yyvsp[-1].ulonglong_number), (yyvsp[-3].ulong_num))))) + MYSQL_YYABORT; + } +#line 40870 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1522: /* primary_expr: '(' parenthesized_expr ')' */ +#line 9852 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[-1].item); } +#line 40876 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1523: /* primary_expr: subquery */ +#line 9854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->create_item_query_expression(thd, (yyvsp[0].select_lex)->master_unit()))) + MYSQL_YYABORT; + } +#line 40885 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1525: /* string_factor_expr: string_factor_expr COLLATE_SYM collation_name */ +#line 9863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new (thd->mem_root) + Item_func_set_collation(thd, (yyvsp[-2].item), (yyvsp[0].Lex_extended_collation))))) + MYSQL_YYABORT; + } +#line 40895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1527: /* simple_expr: BINARY simple_expr */ +#line 9873 "/home/buildbot/git/sql/sql_yacc.yy" + { + Type_cast_attributes at(&my_charset_bin); + if (unlikely(!((yyval.item)= type_handler_long_blob.create_typecast_item(thd, (yyvsp[0].item), at)))) + MYSQL_YYABORT; + } +#line 40905 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1528: /* simple_expr: '+' simple_expr */ +#line 9879 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 40913 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1529: /* simple_expr: '-' simple_expr */ +#line 9883 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item)->neg(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1530: /* simple_expr: '~' simple_expr */ +#line 9889 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_neg(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1531: /* simple_expr: not2 simple_expr */ +#line 9895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40943 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1533: /* mysql_concatenation_expr: mysql_concatenation_expr MYSQL_CONCAT_SYM simple_expr */ +#line 9905 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40953 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1534: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ')' */ +#line 9914 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_datetime_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40964 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1535: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ',' expr ')' */ +#line 9921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40974 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1536: /* function_call_keyword: CHAR_SYM '(' expr_list ')' */ +#line 9935 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40984 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1537: /* function_call_keyword: CHAR_SYM '(' expr_list USING charset_name ')' */ +#line 9941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-3].item_list), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40994 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1538: /* function_call_keyword: CURRENT_USER optional_braces */ +#line 9947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_user(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 41007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1539: /* function_call_keyword: CURRENT_ROLE optional_braces */ +#line 9956 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_role(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 41020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1540: /* function_call_keyword: DATE_SYM '(' expr ')' */ +#line 9965 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_typecast(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1541: /* function_call_keyword: DAY_SYM '(' expr ')' */ +#line 9971 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_dayofmonth(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1542: /* function_call_keyword: HOUR_SYM '(' expr ')' */ +#line 9977 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_hour(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1543: /* function_call_keyword: INSERT '(' expr ',' expr ',' expr ',' expr ')' */ +#line 9983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_insert(thd, (yyvsp[-7].item), (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1544: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ')' */ +#line 9989 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + if (unlikely(list->push_front((yyvsp[-1].item), thd->mem_root)) || + unlikely(list->push_front((yyvsp[-3].item), thd->mem_root))) + MYSQL_YYABORT; + Item_row *item= new (thd->mem_root) Item_row(thd, *list); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41079 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1545: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ',' expr_list ')' */ +#line 10004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-5].item), thd->mem_root); + Item_row *item= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1546: /* function_call_keyword: LEFT '(' expr ',' expr ')' */ +#line 10015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_left(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41104 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1547: /* function_call_keyword: MINUTE_SYM '(' expr ')' */ +#line 10021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minute(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1548: /* function_call_keyword: MONTH_SYM '(' expr ')' */ +#line 10027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_month(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41124 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1549: /* function_call_keyword: RIGHT '(' expr ',' expr ')' */ +#line 10033 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_right(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41134 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1550: /* function_call_keyword: SECOND_SYM '(' expr ')' */ +#line 10039 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_second(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41144 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1551: /* function_call_keyword: SQL_SYM PERCENT_ORACLE_SYM ROWCOUNT_SYM */ +#line 10045 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 41156 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1552: /* function_call_keyword: TIME_SYM '(' expr ')' */ +#line 10053 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_time_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1553: /* function_call_keyword: function_call_keyword_timestamp */ +#line 10060 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 41175 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1554: /* function_call_keyword: TRIM '(' trim_operands ')' */ +#line 10064 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_trim(thd, (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 41185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1555: /* function_call_keyword: USER_SYM '(' ')' */ +#line 10070 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_user(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query=0; + } +#line 41197 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1556: /* function_call_keyword: YEAR_SYM '(' expr ')' */ +#line 10078 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_year(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41207 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1559: /* substring_operands_regular: expr ',' expr ',' expr */ +#line 10092 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41215 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1560: /* substring_operands_regular: expr ',' expr */ +#line 10096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1561: /* substring_operands_special: expr FROM expr FOR_SYM expr */ +#line 10103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41231 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1562: /* substring_operands_special: expr FROM expr */ +#line 10107 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 41239 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1563: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' expr ')' */ +#line 10127 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1564: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10134 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41260 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1565: /* function_call_nonkeyword: CURDATE optional_braces */ +#line 10140 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_local(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1566: /* function_call_nonkeyword: CURTIME opt_time_precision */ +#line 10147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1567: /* function_call_nonkeyword: DATE_ADD_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10154 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41292 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1568: /* function_call_nonkeyword: DATE_SUB_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41302 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1569: /* function_call_nonkeyword: EXTRACT_SYM '(' interval FROM expr ')' */ +#line 10166 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_extract(thd, (yyvsp[-3].interval), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41312 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1570: /* function_call_nonkeyword: GET_FORMAT '(' date_time_type ',' expr ')' */ +#line 10172 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_get_format(thd, (yyvsp[-3].date_time_type), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1571: /* function_call_nonkeyword: NOW_SYM opt_time_precision */ +#line 10178 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41333 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1572: /* function_call_nonkeyword: POSITION_SYM '(' bit_expr IN_SYM expr ')' */ +#line 10185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_locate(thd, (yyvsp[-1].item), (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41343 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1573: /* function_call_nonkeyword: ROWNUM_SYM '(' ')' */ +#line 10196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_rownum(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41353 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1574: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' expr ')' */ +#line 10202 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41364 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1575: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10209 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41374 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1576: /* function_call_nonkeyword: SUBSTRING '(' substring_operands ')' */ +#line 10215 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_substr(thd, (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 41384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1577: /* function_call_nonkeyword: SYSDATE '(' ')' */ +#line 10228 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, 0)))) + MYSQL_YYABORT; + } +#line 41393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1578: /* function_call_nonkeyword: SYSDATE '(' real_ulong_num ')' */ +#line 10233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, (uint) (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 41402 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1579: /* function_call_nonkeyword: TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10238 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-1].item), (yyvsp[-3].item), (yyvsp[-5].interval_time_st), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1580: /* function_call_nonkeyword: TIMESTAMP_DIFF '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10244 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp_diff(thd, (yyvsp[-3].item), (yyvsp[-1].item), (yyvsp[-5].interval_time_st)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1581: /* function_call_nonkeyword: TRIM_ORACLE '(' trim_operands ')' */ +#line 10250 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].trim).make_item_func_trim_oracle(thd)))) + MYSQL_YYABORT; + } +#line 41431 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1582: /* function_call_nonkeyword: UTC_DATE_SYM optional_braces */ +#line 10255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_utc(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41442 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1583: /* function_call_nonkeyword: UTC_TIME_SYM opt_time_precision */ +#line 10262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41453 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1584: /* function_call_nonkeyword: UTC_TIMESTAMP_SYM opt_time_precision */ +#line 10269 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 41464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1585: /* function_call_nonkeyword: COLUMN_ADD_SYM '(' expr ',' dyncall_create_list ')' */ +#line 10277 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_add(thd, (yyvsp[-3].item), *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41474 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1586: /* function_call_nonkeyword: COLUMN_DELETE_SYM '(' expr ',' expr_list ')' */ +#line 10284 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_delete(thd, (yyvsp[-3].item), *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41484 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1587: /* function_call_nonkeyword: COLUMN_CREATE_SYM '(' dyncall_create_list ')' */ +#line 10291 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_create(thd, *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41494 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1588: /* function_call_nonkeyword: COLUMN_GET_SYM '(' expr ',' expr AS cast_type ')' */ +#line 10298 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_get(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].Lex_cast_type).type_handler(), + (yyvsp[-1].Lex_cast_type), (yyvsp[-1].Lex_cast_type).charset()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1589: /* function_call_conflict: ASCII_SYM '(' expr ')' */ +#line 10313 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_ascii(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1590: /* function_call_conflict: CHARSET '(' expr ')' */ +#line 10319 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_charset(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1591: /* function_call_conflict: IF_SYM '(' expr ',' expr ',' expr ')' */ +#line 10325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_if(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41535 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1592: /* function_call_conflict: LAST_VALUE '(' expr ')' */ +#line 10334 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + list->push_back((yyvsp[-1].item), thd->mem_root); + + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *list); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41550 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1593: /* function_call_conflict: LAST_VALUE '(' expr_list ',' expr ')' */ +#line 10345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].item_list)->push_back((yyvsp[-1].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *(yyvsp[-3].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1594: /* function_call_conflict: MOD_SYM '(' expr ',' expr ')' */ +#line 10352 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41571 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1595: /* function_call_conflict: PASSWORD_SYM '(' expr ')' */ +#line 10358 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* i1; + i1= new (thd->mem_root) Item_func_password(thd, (yyvsp[-1].item)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + (yyval.item)= i1; + } +#line 41583 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1596: /* function_call_conflict: REPEAT_SYM '(' expr ',' expr ')' */ +#line 10366 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_repeat(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1597: /* function_call_conflict: REPLACE '(' expr ',' expr ',' expr ')' */ +#line 10372 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_replace(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item))))) + MYSQL_YYABORT; + } +#line 41603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1598: /* function_call_conflict: TRUNCATE_SYM '(' expr ',' expr ')' */ +#line 10378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_round(thd, (yyvsp[-3].item), (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41613 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1599: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr opt_ws_levels ')' */ +#line 10384 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-2].item), 0, 0, (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41623 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1600: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS CHAR_SYM ws_nweights opt_ws_levels ')' */ +#line 10390 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, (yyvsp[-5].item), 0, (yyvsp[-2].ulong_num), + (yyvsp[-1].ulong_num) | MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41635 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1601: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS BINARY ws_nweights ')' */ +#line 10398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_char_typecast(thd, (yyvsp[-4].item), (yyvsp[-1].ulong_num), + &my_charset_bin); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, item, 0, (yyvsp[-1].ulong_num), + MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1602: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr ',' ulong_num ',' ulong_num ',' ulong_num ')' */ +#line 10410 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-7].item), (yyvsp[-5].ulong_num), (yyvsp[-3].ulong_num), + (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41662 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1603: /* @142: %empty */ +#line 10429 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_DLOPEN + udf_func *udf= 0; + LEX *lex= Lex; + if (using_udf_functions && + (udf= find_udf((yyvsp[-1].ident_sys).str, (yyvsp[-1].ident_sys).length)) && + udf->type == UDFTYPE_AGGREGATE) + { + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } + /* Temporary placing the result of find_udf in $3 */ + (yyval.udf)= udf; +#endif + } +#line 41685 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1604: /* function_call_generic: ident_func '(' @142 opt_udf_expr_list ')' */ +#line 10448 "/home/buildbot/git/sql/sql_yacc.yy" + { + const Type_handler *h; + Create_func *builder; + Item *item= NULL; + + if (unlikely(check_routine_name(&(yyvsp[-4].ident_sys)))) + MYSQL_YYABORT; + + /* + Implementation note: + names are resolved with the following order: + - MySQL native functions, + - User Defined Functions, + - Constructors, like POINT(1,1) + - Stored Functions (assuming the current database) + + This will be revised with WL#2128 (SQL PATH) + */ + builder= Schema::find_implied(thd)-> + find_native_function_builder(thd, (yyvsp[-4].ident_sys)); + if (builder) + { + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + else if ((h= Type_handler::handler_by_name(thd, (yyvsp[-4].ident_sys))) && + (item= h->make_constructor_item(thd, (yyvsp[-1].item_list)))) + { + // Found a constructor with a proper argument count + } + else + { +#ifdef HAVE_DLOPEN + /* Retrieving the result of find_udf */ + udf_func *udf= (yyvsp[-2].udf); + + if (udf) + { + if (udf->type == UDFTYPE_AGGREGATE) + { + Select->in_sum_expr--; + } + + item= Create_udf_func::s_singleton.create(thd, udf, (yyvsp[-1].item_list)); + } + else +#endif + { + builder= find_qualified_function_builder(thd); + DBUG_ASSERT(builder); + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + } + + if (unlikely(! ((yyval.item)= item))) + MYSQL_YYABORT; + } +#line 41746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1605: /* function_call_generic: CONTAINS_SYM '(' opt_expr_list ')' */ +#line 10505 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41756 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1606: /* function_call_generic: OVERLAPS_SYM '(' opt_expr_list ')' */ +#line 10511 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41766 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1607: /* function_call_generic: WITHIN '(' opt_expr_list ')' */ +#line 10517 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1608: /* function_call_generic: ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10523 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1609: /* function_call_generic: ident_cli '.' ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-7].ident_cli), &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1610: /* function_call_generic: ident_cli '.' REPLACE '(' opt_expr_list ')' */ +#line 10533 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_replace(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1611: /* function_call_generic: ident_cli '.' SUBSTRING '(' opt_expr_list ')' */ +#line 10538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41812 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1612: /* function_call_generic: ident_cli '.' SUBSTRING '(' substring_operands_special ')' */ +#line 10543 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 41821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1613: /* function_call_generic: ident_cli '.' TRIM '(' opt_expr_list ')' */ +#line 10548 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1614: /* function_call_generic: ident_cli '.' TRIM '(' trim_operands_special ')' */ +#line 10553 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 41839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1615: /* fulltext_options: opt_natural_language_mode opt_query_expansion */ +#line 10573 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].num) | (yyvsp[0].num); } +#line 41845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1616: /* fulltext_options: IN_SYM BOOLEAN_SYM MODE_SYM */ +#line 10575 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_BOOL; } +#line 41851 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1617: /* opt_natural_language_mode: %empty */ +#line 10579 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1618: /* opt_natural_language_mode: IN_SYM NATURAL LANGUAGE_SYM MODE_SYM */ +#line 10580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1619: /* opt_query_expansion: %empty */ +#line 10584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 41869 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1620: /* opt_query_expansion: WITH QUERY_SYM EXPANSION_SYM */ +#line 10585 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_EXPAND; } +#line 41875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1621: /* opt_udf_expr_list: %empty */ +#line 10589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 41881 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1622: /* opt_udf_expr_list: udf_expr_list */ +#line 10590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 41887 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1623: /* udf_expr_list: udf_expr */ +#line 10595 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); + } +#line 41898 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1624: /* udf_expr_list: udf_expr_list ',' udf_expr */ +#line 10602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 41907 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1625: /* udf_expr: remember_name expr remember_end select_alias */ +#line 10610 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use Item::name as a storage for the attribute value of user + defined function argument. It is safe to use Item::name + because the syntax will not allow having an explicit name here. + See WL#1017 re. udf attributes. + */ + if ((yyvsp[0].lex_str).str) + { + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + /* + A field has to have its proper name in order for name + resolution to work, something we are only guaranteed if we + parse it out. If we hijack the input stream with + remember_name we may get quoted or escaped names. + */ + else if ((yyvsp[-2].item)->type() != Item::FIELD_ITEM && + (yyvsp[-2].item)->type() != Item::REF_ITEM /* For HAVING */ ) + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + (yyval.item)= (yyvsp[-2].item); + } +#line 41935 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1626: /* sum_expr: AVG_SYM '(' in_sum_expr ')' */ +#line 10637 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41945 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1627: /* sum_expr: AVG_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41955 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1628: /* sum_expr: BIT_AND '(' in_sum_expr ')' */ +#line 10649 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_and(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1629: /* sum_expr: BIT_OR '(' in_sum_expr ')' */ +#line 10655 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_or(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41975 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1630: /* sum_expr: BIT_XOR '(' in_sum_expr ')' */ +#line 10661 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_xor(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41985 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1631: /* sum_expr: COUNT_SYM '(' opt_all '*' ')' */ +#line 10667 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_int(thd, (int32) 0L, 1); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41998 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1632: /* sum_expr: COUNT_SYM '(' in_sum_expr ')' */ +#line 10676 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42008 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1633: /* $@143: %empty */ +#line 10682 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42014 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1634: /* $@144: %empty */ +#line 10684 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr--; } +#line 42020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1635: /* sum_expr: COUNT_SYM '(' DISTINCT $@143 expr_list $@144 ')' */ +#line 10686 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, *(yyvsp[-2].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42030 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1636: /* sum_expr: MIN_SYM '(' in_sum_expr ')' */ +#line 10692 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1637: /* sum_expr: MIN_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10703 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1638: /* sum_expr: MAX_SYM '(' in_sum_expr ')' */ +#line 10709 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1639: /* sum_expr: MAX_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10715 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42070 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1640: /* sum_expr: STD_SYM '(' in_sum_expr ')' */ +#line 10721 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1641: /* sum_expr: VARIANCE_SYM '(' in_sum_expr ')' */ +#line 10727 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42090 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1642: /* sum_expr: STDDEV_SAMP_SYM '(' in_sum_expr ')' */ +#line 10733 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42100 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1643: /* sum_expr: VAR_SAMP_SYM '(' in_sum_expr ')' */ +#line 10739 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1644: /* sum_expr: SUM_SYM '(' in_sum_expr ')' */ +#line 10745 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42120 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1645: /* sum_expr: SUM_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10751 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42130 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1646: /* $@145: %empty */ +#line 10757 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42136 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1647: /* sum_expr: GROUP_CONCAT_SYM '(' opt_distinct $@145 expr_list opt_gorder_clause opt_gconcat_separator opt_glimit_clause ')' */ +#line 10761 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + (yyval.item)= new (thd->mem_root) + Item_func_group_concat(thd, Lex->current_context(), + (yyvsp[-6].num), (yyvsp[-4].item_list), + sel->gorder_list, (yyvsp[-2].string), (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-4].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 42156 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1648: /* $@146: %empty */ +#line 10777 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1649: /* sum_expr: JSON_ARRAYAGG_SYM '(' opt_distinct $@146 expr_list opt_gorder_clause opt_glimit_clause ')' */ +#line 10780 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + List *args= (yyvsp[-3].item_list); + sel->in_sum_expr--; + if (args && args->elements > 1) + { + /* JSON_ARRAYAGG supports only one parameter */ + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), "JSON_ARRAYAGG"); + MYSQL_YYABORT; + } + String* s= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely(s == NULL)) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) + Item_func_json_arrayagg(thd, Lex->current_context(), + (yyvsp[-5].num), args, + sel->gorder_list, s, (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-3].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 42193 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1650: /* $@147: %empty */ +#line 10807 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 42199 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1651: /* sum_expr: JSON_OBJECTAGG_SYM '(' $@147 expr ',' expr ')' */ +#line 10809 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + + (yyval.item)= new (thd->mem_root) Item_func_json_objectagg(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42212 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1652: /* window_func_expr: window_func OVER_SYM window_name */ +#line 10821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), (yyvsp[0].lex_str_ptr)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 42224 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1653: /* window_func_expr: window_func OVER_SYM window_spec */ +#line 10830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 42243 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1656: /* window_func: function_call_generic */ +#line 10852 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* item = (Item*)(yyvsp[0].item); + /* Only UDF aggregate here possible */ + if ((item == NULL) || + (item->type() != Item::SUM_FUNC_ITEM) + || (((Item_sum *)item)->sum_func() != Item_sum::UDF_SUM_FUNC)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42259 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1657: /* simple_window_func: ROW_NUMBER_SYM '(' ')' */ +#line 10867 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_row_number(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42269 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1658: /* simple_window_func: RANK_SYM '(' ')' */ +#line 10874 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42279 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1659: /* simple_window_func: DENSE_RANK_SYM '(' ')' */ +#line 10881 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_dense_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1660: /* simple_window_func: PERCENT_RANK_SYM '(' ')' */ +#line 10888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percent_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42299 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1661: /* simple_window_func: CUME_DIST_SYM '(' ')' */ +#line 10895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_cume_dist(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42309 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1662: /* simple_window_func: NTILE_SYM '(' expr ')' */ +#line 10902 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_ntile(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1663: /* simple_window_func: FIRST_VALUE_SYM '(' expr ')' */ +#line 10909 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_first_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1664: /* simple_window_func: LAST_VALUE '(' expr ')' */ +#line 10916 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_last_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42339 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1665: /* simple_window_func: NTH_VALUE_SYM '(' expr ',' expr ')' */ +#line 10923 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_nth_value(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1666: /* simple_window_func: LEAD_SYM '(' expr ')' */ +#line 10930 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42363 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1667: /* simple_window_func: LEAD_SYM '(' expr ',' expr ')' */ +#line 10941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1668: /* simple_window_func: LAG_SYM '(' expr ')' */ +#line 10948 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42387 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1669: /* simple_window_func: LAG_SYM '(' expr ',' expr ')' */ +#line 10959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1670: /* inverse_distribution_function: percentile_function OVER_SYM '(' opt_window_partition_clause ')' */ +#line 10971 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + NULL))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-4].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 42416 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1671: /* $@148: %empty */ +#line 10989 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 42422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1672: /* percentile_function: inverse_distribution_function_def WITHIN GROUP_SYM '(' $@148 order_by_single_element_list ')' */ +#line 10991 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[-6].item); + } +#line 42430 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1673: /* percentile_function: MEDIAN_SYM '(' expr ')' */ +#line 10995 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *args= new (thd->mem_root) Item_decimal(thd, "0.5", 3, + thd->charset()); + if (unlikely(args == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + Select->prepare_add_window_spec(thd); + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),FALSE))) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, args); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42448 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1674: /* inverse_distribution_function_def: PERCENTILE_CONT_SYM '(' expr ')' */ +#line 11012 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42458 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1675: /* inverse_distribution_function_def: PERCENTILE_DISC_SYM '(' expr ')' */ +#line 11018 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_disc(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 42468 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1676: /* order_by_single_element_list: ORDER_SYM BY order_ident order_dir */ +#line 11027 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 42477 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1677: /* window_name: ident */ +#line 11036 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 42487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1678: /* $@149: %empty */ +#line 11045 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(! Lex->parsing_options.allows_variable)) + my_yyabort_error((ER_VIEW_SELECT_VARIABLE, MYF(0))); + } +#line 42496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1679: /* variable: '@' $@149 variable_aux */ +#line 11050 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 42504 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1680: /* variable_aux: ident_or_text SET_VAR expr */ +#line 11057 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_set_user_var *item; + if (!(yyvsp[-2].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= item= new (thd->mem_root) Item_func_set_user_var(thd, &(yyvsp[-2].lex_str), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + lex->set_var_list.push_back(item, thd->mem_root); + } +#line 42523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1681: /* variable_aux: ident_or_text */ +#line 11072 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 42540 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1682: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name */ +#line 11085 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-1].var_type), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 42549 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1683: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name '.' ident */ +#line 11090 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-3].var_type), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 42558 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1684: /* opt_distinct: %empty */ +#line 11097 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42564 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1685: /* opt_distinct: DISTINCT */ +#line 11098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 42570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1686: /* opt_gconcat_separator: %empty */ +#line 11103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 42580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1687: /* opt_gconcat_separator: SEPARATOR_SYM text_string */ +#line 11108 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string) = (yyvsp[0].string); } +#line 42586 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1690: /* gorder_list: gorder_list ',' order_ident order_dir */ +#line 11118 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 42595 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1691: /* gorder_list: order_ident order_dir */ +#line 11123 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 42604 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1692: /* opt_glimit_clause: %empty */ +#line 11130 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42610 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1693: /* opt_glimit_clause: glimit_clause */ +#line 11131 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 42616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1694: /* glimit_clause: LIMIT glimit_options */ +#line 11137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 42624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1695: /* glimit_options: limit_options */ +#line 11144 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 42632 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1696: /* $@150: %empty */ +#line 11153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1697: /* in_sum_expr: opt_all $@150 expr */ +#line 11162 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->in_sum_expr--; + (yyval.item)= (yyvsp[0].item); + } +#line 42654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1698: /* cast_type: BINARY opt_field_length */ +#line 11170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); } +#line 42660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1699: /* cast_type: CHAR_SYM opt_field_length opt_binary */ +#line 11172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 42670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1700: /* cast_type: VARCHAR field_length opt_binary */ +#line 11178 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 42680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1701: /* cast_type: VARCHAR2_ORACLE_SYM field_length opt_binary */ +#line 11184 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 42690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1702: /* cast_type: NCHAR_SYM opt_field_length */ +#line 11190 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), national_charset_info); + } +#line 42698 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1703: /* cast_type: cast_type_numeric */ +#line 11193 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 42704 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1704: /* cast_type: cast_type_temporal */ +#line 11194 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 42710 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1705: /* cast_type: udt_name */ +#line 11196 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_cast_type_udt(&(yyval.Lex_cast_type), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 42719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1706: /* cast_type_numeric: INT_SYM */ +#line 11203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1707: /* cast_type_numeric: SIGNED_SYM */ +#line 11204 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1708: /* cast_type_numeric: SIGNED_SYM INT_SYM */ +#line 11205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1709: /* cast_type_numeric: UNSIGNED */ +#line 11206 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1710: /* cast_type_numeric: UNSIGNED INT_SYM */ +#line 11207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1711: /* cast_type_numeric: DECIMAL_SYM float_options */ +#line 11208 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdecimal, (yyvsp[0].Lex_length_and_dec)); } +#line 42755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1712: /* cast_type_numeric: FLOAT_SYM */ +#line 11209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_float); } +#line 42761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1713: /* cast_type_numeric: DOUBLE_SYM opt_precision */ +#line 11210 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_double, (yyvsp[0].Lex_length_and_dec)); } +#line 42767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1714: /* cast_type_temporal: DATE_SYM */ +#line 11214 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdate); } +#line 42773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1715: /* cast_type_temporal: TIME_SYM opt_field_scale */ +#line 11215 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_time2, (yyvsp[0].Lex_length_and_dec)); } +#line 42779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1716: /* cast_type_temporal: DATETIME opt_field_scale */ +#line 11216 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_datetime2, (yyvsp[0].Lex_length_and_dec)); } +#line 42785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1717: /* cast_type_temporal: INTERVAL_SYM DAY_SECOND_SYM field_scale */ +#line 11218 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_interval_DDhhmmssff, (yyvsp[0].Lex_length_and_dec)); + } +#line 42793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1718: /* opt_expr_list: %empty */ +#line 11224 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 42799 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1719: /* opt_expr_list: expr_list */ +#line 11225 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list);} +#line 42805 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1720: /* expr_list: expr */ +#line 11230 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 42814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1721: /* expr_list: expr_list ',' expr */ +#line 11235 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42823 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1722: /* ident_list_arg: ident_list */ +#line 11242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 42829 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1723: /* ident_list_arg: '(' ident_list ')' */ +#line 11243 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[-1].item_list); } +#line 42835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1724: /* ident_list: simple_ident */ +#line 11248 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL) || + unlikely((yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42846 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1725: /* ident_list: ident_list ',' simple_ident */ +#line 11255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1726: /* when_list: WHEN_SYM expr THEN_SYM expr */ +#line 11263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + if (unlikely((yyval.item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1727: /* when_list: when_list WHEN_SYM expr THEN_SYM expr */ +#line 11272 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-4].item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyvsp[-4].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-4].item_list); + } +#line 42879 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1729: /* when_list_opt_else: when_list ELSE expr */ +#line 11283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42889 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1730: /* table_ref: table_factor */ +#line 11293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1731: /* table_ref: join_table */ +#line 11295 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->nest_last_join(thd)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1732: /* json_text_literal: TEXT_STRING */ +#line 11307 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42916 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1733: /* json_text_literal: NCHAR_STRING */ +#line 11311 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= national_charset_info; + } +#line 42924 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1734: /* json_text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 11315 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= (yyvsp[-1].charset); + (yyval.lex_string_with_metadata)= (yyvsp[0].lex_string_with_metadata); + } +#line 42933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1736: /* json_text_literal_or_num: NUM */ +#line 11324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1737: /* json_text_literal_or_num: LONG_NUM */ +#line 11328 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42949 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1738: /* json_text_literal_or_num: DECIMAL_NUM */ +#line 11332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42957 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1739: /* json_text_literal_or_num: FLOAT_NUM */ +#line 11336 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1740: /* join_table_list: derived_table_list */ +#line 11342 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT_UNLESS((yyval.table_list)=(yyvsp[0].table_list)); } +#line 42971 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1741: /* json_table_columns_clause: COLUMNS '(' json_table_columns_list ')' */ +#line 11347 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42977 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1743: /* json_table_columns_list: json_table_columns_list ',' json_table_column */ +#line 11353 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42983 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1744: /* $@151: %empty */ +#line 11358 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].ident_sys), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].ident_sys).str)); + + lex->json_table->m_cur_json_table_column= + new (thd->mem_root) Json_table_column(f, + lex->json_table->get_cur_nested_path()); + + if (unlikely(!f || + !lex->json_table->m_cur_json_table_column)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].ident_sys)); + } +#line 43006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1745: /* json_table_column: ident $@151 json_table_column_type */ +#line 11377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->json_table-> + m_cur_json_table_column->m_field->check(thd))) + MYSQL_YYABORT; + lex->json_table->m_columns.push_back( + lex->json_table->m_cur_json_table_column, thd->mem_root); + } +#line 43019 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1746: /* $@152: %empty */ +#line 11386 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Json_table_nested_path *np= new (thd->mem_root) + Json_table_nested_path(); + np->set_path(thd, (yyvsp[0].lex_string_with_metadata)); + lex->json_table->start_nested_path(np); + } +#line 43031 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1747: /* json_table_column: NESTED_SYM PATH_SYM json_text_literal $@152 json_table_columns_clause */ +#line 11394 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->json_table->end_nested_path(); + } +#line 43040 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1748: /* json_table_column_type: FOR_SYM ORDINALITY_SYM */ +#line 11402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_field_type_st type; + type.set(&type_handler_slong); + Lex->last_field->set_attributes(thd, type, + COLUMN_DEFINITION_TABLE_FIELD); + Lex->json_table->m_cur_json_table_column-> + set(Json_table_column::FOR_ORDINALITY); + } +#line 43053 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1749: /* json_table_column_type: json_table_field_type PATH_SYM json_text_literal json_opt_on_empty_or_error */ +#line 11412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::PATH, (yyvsp[-1].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + { + MYSQL_YYABORT; + } + } +#line 43068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1750: /* json_table_column_type: json_table_field_type EXISTS PATH_SYM json_text_literal */ +#line 11423 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::EXISTS_PATH, (yyvsp[0].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + MYSQL_YYABORT; + } +#line 43081 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1755: /* json_opt_on_empty_or_error: %empty */ +#line 11442 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43087 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1760: /* json_on_response: ERROR_SYM */ +#line 11451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_ERROR; + } +#line 43095 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1761: /* json_on_response: NULL_SYM */ +#line 11455 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_NULL; + } +#line 43103 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1762: /* json_on_response: DEFAULT json_text_literal_or_num */ +#line 11459 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_DEFAULT; + (yyval.json_on_response).m_default= (yyvsp[0].lex_string_with_metadata); + Lex->json_table->m_cur_json_table_column->m_defaults_cs= + thd->variables.collation_connection; + } +#line 43114 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1763: /* json_on_error_response: json_on_response ON ERROR_SYM */ +#line 11469 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_error= (yyvsp[-2].json_on_response); + } +#line 43122 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1764: /* json_on_empty_response: json_on_response ON EMPTY_SYM */ +#line 11476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_empty= (yyvsp[-2].json_on_response); + } +#line 43130 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1765: /* $@153: %empty */ +#line 11483 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_table_function_arg_context(Lex, thd->mem_root); + //TODO: introduce IN_TABLE_FUNC_ARGUMENT? + Select->parsing_place= IN_ON; + } +#line 43140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1766: /* $@154: %empty */ +#line 11489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_function_json_table *jt= + new (thd->mem_root) Table_function_json_table((yyvsp[-1].item)); + if (unlikely(!jt)) + MYSQL_YYABORT; + /* See comment for class Table_function_json_table: */ + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->json_table= jt; + + Select->parsing_place= NO_MATTER; + jt->set_name_resolution_context(Lex->pop_context()); + } +#line 43157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1767: /* table_function: JSON_TABLE_SYM '(' $@153 expr ',' $@154 json_text_literal json_table_columns_clause ')' opt_table_alias_clause */ +#line 11502 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + if (unlikely((yyvsp[0].lex_str_ptr) == NULL)) + { + /* Alias is not optional. */ + my_error(ER_JSON_TABLE_ALIAS_REQUIRED, MYF(0)); + MYSQL_YYABORT; + } + if (unlikely(Lex->json_table->m_nested_path.set_path(thd, (yyvsp[-3].lex_string_with_metadata)))) + MYSQL_YYABORT; + if (!((yyval.table_list)= sel->add_table_to_list(thd, + new (thd->mem_root) Table_ident(thd, &any_db, + (yyvsp[0].lex_str_ptr), TRUE), + NULL, + TL_OPTION_TABLE_FUNCTION, + YYPS->m_lock_type, + YYPS->m_mdl_type, + 0,0,0))) + MYSQL_YYABORT; + (yyval.table_list)->table_function= Lex->json_table; + Lex->json_table= 0; + status_var_increment(thd->status_var.feature_json); + } +#line 43185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1768: /* esc_table_ref: table_ref */ +#line 11535 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[0].table_list); } +#line 43191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1769: /* esc_table_ref: '{' ident table_ref '}' */ +#line 11536 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[-1].table_list); } +#line 43197 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1770: /* derived_table_list: esc_table_ref */ +#line 11543 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table_list)=(yyvsp[0].table_list); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43206 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1771: /* derived_table_list: derived_table_list ',' esc_table_ref */ +#line 11548 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43215 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1772: /* join_table: table_ref normal_join table_ref */ +#line 11562 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + if (unlikely(Select->add_cross_joined_table((yyvsp[-2].table_list), (yyvsp[0].table_list), (yyvsp[-1].num)))) + MYSQL_YYABORT; + } +#line 43225 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1773: /* $@155: %empty */ +#line 11569 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-3].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 43239 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1774: /* join_table: table_ref normal_join table_ref ON $@155 expr */ +#line 11579 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].table_list)->straight=(yyvsp[-4].num); + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 43250 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1775: /* $@156: %empty */ +#line 11587 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + } +#line 43260 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1776: /* join_table: table_ref normal_join table_ref USING $@156 '(' using_list ')' */ +#line 11593 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].table_list)->straight=(yyvsp[-6].num); + add_join_natural((yyvsp[-7].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 43270 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1777: /* join_table: table_ref NATURAL inner_join table_factor */ +#line 11599 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyvsp[0].table_list)->straight=(yyvsp[-1].num); + add_join_natural((yyvsp[-3].table_list),(yyvsp[0].table_list),NULL,Select); + } +#line 43282 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1778: /* $@157: %empty */ +#line 11610 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 43296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1779: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_ref ON $@157 expr */ +#line 11620 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + (yyvsp[-3].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-3].table_list); + Select->parsing_place= NO_MATTER; + } +#line 43308 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1780: /* $@158: %empty */ +#line 11628 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43318 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1781: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_factor $@158 USING '(' using_list ')' */ +#line 11634 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_natural((yyvsp[-9].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyvsp[-5].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 43328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1782: /* join_table: table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor */ +#line 11640 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[-5].table_list),(yyvsp[0].table_list),NULL,Select); + (yyvsp[0].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[0].table_list); + } +#line 43341 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1783: /* $@159: %empty */ +#line 11652 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 43355 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1784: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_ref ON $@159 expr */ +#line 11662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_on(thd, (yyval.table_list), (yyvsp[0].item)); + (yyvsp[-7].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 43368 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1785: /* $@160: %empty */ +#line 11671 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 43378 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1786: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_factor $@160 USING '(' using_list ')' */ +#line 11677 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_natural((yyval.table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + } +#line 43389 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1787: /* join_table: table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor */ +#line 11684 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[0].table_list),(yyvsp[-5].table_list),NULL,Select); + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + } +#line 43403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1788: /* inner_join: JOIN_SYM */ +#line 11697 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 43409 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1789: /* inner_join: INNER_SYM JOIN_SYM */ +#line 11698 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 43415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1790: /* inner_join: STRAIGHT_JOIN */ +#line 11699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 43421 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1791: /* normal_join: inner_join */ +#line 11703 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = (yyvsp[0].num); } +#line 43427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1792: /* normal_join: CROSS JOIN_SYM */ +#line 11704 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 43433 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1793: /* opt_use_partition: %empty */ +#line 11712 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string_list)= 0;} +#line 43439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1795: /* use_partition: PARTITION_SYM '(' using_list ')' have_partitioning */ +#line 11718 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string_list)= (yyvsp[-2].string_list); + Select->parsing_place= Select->save_parsing_place; + Select->save_parsing_place= NO_MATTER; + } +#line 43449 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1796: /* table_factor: table_primary_ident_opt_parens */ +#line 11726 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43455 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1797: /* table_factor: table_primary_derived_opt_parens */ +#line 11727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43461 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1798: /* table_factor: join_table_parens */ +#line 11729 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].table_list)->nested_join->nest_type= 0; + (yyval.table_list)= (yyvsp[0].table_list); + } +#line 43470 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1799: /* table_factor: table_reference_list_parens */ +#line 11733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43476 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1800: /* table_factor: table_function */ +#line 11734 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43482 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1801: /* table_primary_ident_opt_parens: table_primary_ident */ +#line 11738 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43488 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1802: /* table_primary_ident_opt_parens: '(' table_primary_ident_opt_parens ')' */ +#line 11739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43494 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1803: /* table_primary_derived_opt_parens: table_primary_derived */ +#line 11743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 43500 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1804: /* table_primary_derived_opt_parens: '(' table_primary_derived_opt_parens ')' */ +#line 11744 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43506 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1805: /* table_reference_list_parens: '(' table_reference_list_parens ')' */ +#line 11748 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43512 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1806: /* table_reference_list_parens: '(' nested_table_reference_list ')' */ +#line 11750 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->end_nested_join(thd))) + MYSQL_YYABORT; + } +#line 43521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1807: /* nested_table_reference_list: table_ref ',' table_ref */ +#line 11758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Select->init_nested_join(thd)) + MYSQL_YYABORT; + Select->add_joined_table((yyvsp[-2].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list)->embedding; + } +#line 43533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1808: /* nested_table_reference_list: nested_table_reference_list ',' table_ref */ +#line 11766 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list); + } +#line 43542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1809: /* join_table_parens: '(' join_table_parens ')' */ +#line 11773 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 43548 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1810: /* join_table_parens: '(' join_table ')' */ +#line 11775 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!((yyval.table_list)= lex->current_select->nest_last_join(thd))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 43561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1811: /* table_primary_ident: table_ident opt_use_partition opt_for_system_time_clause opt_table_alias_clause opt_key_definition */ +#line 11789 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + if ((yyvsp[-2].num)) + (yyval.table_list)->vers_conditions= Lex->vers_conditions; + } +#line 43577 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1812: /* table_primary_derived: subquery opt_for_system_time_clause table_alias_clause */ +#line 11805 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Lex->parsed_derived_table((yyvsp[-2].select_lex)->master_unit(), (yyvsp[-1].num), (yyvsp[0].lex_str_ptr)))) + MYSQL_YYABORT; + } +#line 43586 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1813: /* opt_outer: %empty */ +#line 11822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43592 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1814: /* opt_outer: OUTER */ +#line 11823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43598 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1815: /* index_hint_clause: %empty */ +#line 11828 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (thd->variables.old_behavior & OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN) ? + INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; + } +#line 43607 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1816: /* index_hint_clause: FOR_SYM JOIN_SYM */ +#line 11832 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_JOIN; } +#line 43613 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1817: /* index_hint_clause: FOR_SYM ORDER_SYM BY */ +#line 11833 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_ORDER; } +#line 43619 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1818: /* index_hint_clause: FOR_SYM GROUP_SYM BY */ +#line 11834 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_GROUP; } +#line 43625 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1819: /* index_hint_type: FORCE_SYM */ +#line 11838 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_FORCE; } +#line 43631 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1820: /* index_hint_type: IGNORE_SYM */ +#line 11839 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_IGNORE; } +#line 43637 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1821: /* $@161: %empty */ +#line 11844 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type((yyvsp[-2].index_hint), (yyvsp[0].num)); + } +#line 43645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1823: /* $@162: %empty */ +#line 11849 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type(INDEX_HINT_USE, (yyvsp[0].num)); + } +#line 43653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1828: /* $@163: %empty */ +#line 11862 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->alloc_index_hints(thd); } +#line 43659 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1830: /* $@164: %empty */ +#line 11866 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->clear_index_hints(); } +#line 43665 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1832: /* opt_key_usage_list: %empty */ +#line 11871 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, NULL, 0); } +#line 43671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1833: /* opt_key_usage_list: key_usage_list */ +#line 11872 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43677 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1834: /* key_usage_element: ident */ +#line 11877 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, (yyvsp[0].ident_sys).str, (yyvsp[0].ident_sys).length); } +#line 43683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1835: /* key_usage_element: PRIMARY_SYM */ +#line 11879 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, "PRIMARY", 7); } +#line 43689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1838: /* using_list: ident */ +#line 11889 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.string_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + (yyval.string_list)->push_back(s, thd->mem_root); + } +#line 43704 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1839: /* using_list: using_list ',' ident */ +#line 11900 "/home/buildbot/git/sql/sql_yacc.yy" + { + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + if (unlikely((yyvsp[-2].string_list)->push_back(s, thd->mem_root))) + MYSQL_YYABORT; + (yyval.string_list)= (yyvsp[-2].string_list); + } +#line 43719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1840: /* interval: interval_time_stamp */ +#line 11913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1841: /* interval: DAY_HOUR_SYM */ +#line 11914 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_HOUR; } +#line 43731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1842: /* interval: DAY_MICROSECOND_SYM */ +#line 11915 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MICROSECOND; } +#line 43737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1843: /* interval: DAY_MINUTE_SYM */ +#line 11916 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MINUTE; } +#line 43743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1844: /* interval: DAY_SECOND_SYM */ +#line 11917 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_SECOND; } +#line 43749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1845: /* interval: HOUR_MICROSECOND_SYM */ +#line 11918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MICROSECOND; } +#line 43755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1846: /* interval: HOUR_MINUTE_SYM */ +#line 11919 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MINUTE; } +#line 43761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1847: /* interval: HOUR_SECOND_SYM */ +#line 11920 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_SECOND; } +#line 43767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1848: /* interval: MINUTE_MICROSECOND_SYM */ +#line 11921 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_MICROSECOND; } +#line 43773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1849: /* interval: MINUTE_SECOND_SYM */ +#line 11922 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_SECOND; } +#line 43779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1850: /* interval: SECOND_MICROSECOND_SYM */ +#line 11923 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_SECOND_MICROSECOND; } +#line 43785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1851: /* interval: YEAR_MONTH_SYM */ +#line 11924 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_YEAR_MONTH; } +#line 43791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1852: /* interval_time_stamp: DAY_SYM */ +#line 11928 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_DAY; } +#line 43797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1853: /* interval_time_stamp: WEEK_SYM */ +#line 11929 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_WEEK; } +#line 43803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1854: /* interval_time_stamp: HOUR_SYM */ +#line 11930 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_HOUR; } +#line 43809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1855: /* interval_time_stamp: MINUTE_SYM */ +#line 11931 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MINUTE; } +#line 43815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1856: /* interval_time_stamp: MONTH_SYM */ +#line 11932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MONTH; } +#line 43821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1857: /* interval_time_stamp: QUARTER_SYM */ +#line 11933 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_QUARTER; } +#line 43827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1858: /* interval_time_stamp: SECOND_SYM */ +#line 11934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_SECOND; } +#line 43833 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1859: /* interval_time_stamp: MICROSECOND_SYM */ +#line 11935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MICROSECOND; } +#line 43839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1860: /* interval_time_stamp: YEAR_SYM */ +#line 11936 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_YEAR; } +#line 43845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1861: /* date_time_type: DATE_SYM */ +#line 11940 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATE;} +#line 43851 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1862: /* date_time_type: TIME_SYM */ +#line 11941 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_TIME;} +#line 43857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1863: /* date_time_type: DATETIME */ +#line 11942 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1864: /* date_time_type: TIMESTAMP */ +#line 11943 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43869 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1868: /* opt_table_alias_clause: %empty */ +#line 11953 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)=0; } +#line 43875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1869: /* opt_table_alias_clause: table_alias_clause */ +#line 11954 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)= (yyvsp[0].lex_str_ptr); } +#line 43881 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1870: /* table_alias_clause: table_alias ident_table_alias */ +#line 11959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING*) thd->memdup(&(yyvsp[0].ident_sys),sizeof(LEX_STRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 43891 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1873: /* opt_where_clause: %empty */ +#line 11972 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->where= 0; } +#line 43897 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1874: /* $@165: %empty */ +#line 11974 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_WHERE; + } +#line 43905 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1875: /* opt_where_clause: WHERE $@165 expr */ +#line 11978 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *select= Select; + select->where= normalize_cond(thd, (yyvsp[0].item)); + select->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43917 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1877: /* $@166: %empty */ +#line 11990 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_HAVING; + } +#line 43925 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1878: /* opt_having_clause: HAVING $@166 expr */ +#line 11994 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->having= normalize_cond(thd, (yyvsp[0].item)); + sel->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43937 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1881: /* group_list: group_list ',' order_ident order_dir */ +#line 12014 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43946 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1882: /* group_list: order_ident order_dir */ +#line 12019 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43955 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1883: /* olap_opt: %empty */ +#line 12026 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43961 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1884: /* olap_opt: WITH_CUBE_SYM */ +#line 12028 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH CUBE' is reserved in the MySQL syntax, but not implemented, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH CUBE + SQL-2003: GROUP BY ... CUBE(col1, col2, col3) + */ + LEX *lex=Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH CUBE", + "global union parameters")); + lex->current_select->olap= CUBE_TYPE; + + my_yyabort_error((ER_NOT_SUPPORTED_YET, MYF(0), "CUBE")); + } +#line 43982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1885: /* olap_opt: WITH_ROLLUP_SYM */ +#line 12045 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH ROLLUP' is needed for backward compatibility, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH ROLLUP + SQL-2003: GROUP BY ... ROLLUP(col1, col2, col3) + */ + LEX *lex= Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH ROLLUP", + "global union parameters")); + lex->current_select->olap= ROLLUP_TYPE; + } +#line 44001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1886: /* opt_window_clause: %empty */ +#line 12067 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44007 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1887: /* opt_window_clause: WINDOW_SYM window_def_list */ +#line 12070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44013 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1890: /* window_def: window_name AS window_spec */ +#line 12080 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_def(thd, (yyvsp[-2].lex_str_ptr), lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + } +#line 44026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1891: /* $@167: %empty */ +#line 12092 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 44032 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1892: /* window_spec: '(' $@167 opt_window_ref opt_window_partition_clause opt_window_order_clause opt_window_frame_clause ')' */ +#line 12096 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 44038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1893: /* opt_window_ref: %empty */ +#line 12100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1894: /* opt_window_ref: ident */ +#line 12102 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->win_ref= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely(thd->lex->win_ref == NULL)) + MYSQL_YYABORT; + } +#line 44054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1895: /* opt_window_partition_clause: %empty */ +#line 12110 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 44060 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1897: /* opt_window_order_clause: %empty */ +#line 12115 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 44066 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1898: /* opt_window_order_clause: ORDER_SYM BY order_list */ +#line 12116 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->order_list= *((yyvsp[0].select_order)); } +#line 44072 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1899: /* opt_window_frame_clause: %empty */ +#line 12120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44078 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1900: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ +#line 12122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->win_frame= + new (thd->mem_root) Window_frame((yyvsp[-2].frame_units), + lex->frame_top_bound, + lex->frame_bottom_bound, + (yyvsp[0].frame_exclusion)); + if (unlikely(lex->win_frame == NULL)) + MYSQL_YYABORT; + } +#line 44093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1901: /* window_frame_units: ROWS_SYM */ +#line 12135 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_ROWS; } +#line 44099 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1902: /* window_frame_units: RANGE_SYM */ +#line 12136 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_RANGE; } +#line 44105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1903: /* window_frame_extent: window_frame_start */ +#line 12141 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[0].window_frame_bound); + lex->frame_bottom_bound= + new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely(lex->frame_bottom_bound == NULL)) + MYSQL_YYABORT; + } +#line 44119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1904: /* window_frame_extent: BETWEEN_SYM window_frame_bound AND_SYM window_frame_bound */ +#line 12151 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[-2].window_frame_bound); + lex->frame_bottom_bound= (yyvsp[0].window_frame_bound); + } +#line 44129 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1905: /* window_frame_start: UNBOUNDED_SYM PRECEDING_SYM */ +#line 12160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1906: /* window_frame_start: CURRENT_SYM ROW_SYM */ +#line 12167 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1907: /* window_frame_start: literal PRECEDING_SYM */ +#line 12174 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1908: /* window_frame_bound: window_frame_start */ +#line 12183 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.window_frame_bound)= (yyvsp[0].window_frame_bound); } +#line 44168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1909: /* window_frame_bound: UNBOUNDED_SYM FOLLOWING_SYM */ +#line 12185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44179 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1910: /* window_frame_bound: literal FOLLOWING_SYM */ +#line 12192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 44190 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1911: /* opt_window_frame_exclusion: %empty */ +#line 12201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 44196 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1912: /* opt_window_frame_exclusion: EXCLUDE_SYM CURRENT_SYM ROW_SYM */ +#line 12203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_CURRENT_ROW; } +#line 44202 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1913: /* opt_window_frame_exclusion: EXCLUDE_SYM GROUP_SYM */ +#line 12205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_GROUP; } +#line 44208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1914: /* opt_window_frame_exclusion: EXCLUDE_SYM TIES_SYM */ +#line 12207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_TIES; } +#line 44214 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1915: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_MARIADB_SYM */ +#line 12209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 44220 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1916: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_ORACLE_SYM */ +#line 12211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 44226 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1920: /* alter_order_item: simple_ident_nospvar order_dir */ +#line 12229 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool ascending= ((yyvsp[0].num) == 1) ? true : false; + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item), ascending))) + MYSQL_YYABORT; + } +#line 44236 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1921: /* opt_order_clause: %empty */ +#line 12242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= NULL; } +#line 44242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1922: /* opt_order_clause: order_clause */ +#line 12244 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= (yyvsp[0].select_order); } +#line 44248 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1923: /* $@168: %empty */ +#line 12249 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->where= THD_WHERE::ORDER_CLAUSE; + } +#line 44256 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1924: /* order_clause: ORDER_SYM BY $@168 order_list */ +#line 12253 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[0].select_order); + } +#line 44264 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1925: /* order_list: order_list ',' order_ident order_dir */ +#line 12260 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[-3].select_order); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item),(bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 44274 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1926: /* order_list: order_ident order_dir */ +#line 12266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= new (thd->mem_root) SQL_I_List(); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item), (bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 44284 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1927: /* order_dir: %empty */ +#line 12274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 44290 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1928: /* order_dir: ASC */ +#line 12275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 44296 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1929: /* order_dir: DESC */ +#line 12276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 44302 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1930: /* opt_limit_clause: %empty */ +#line 12282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit).clear(); } +#line 44308 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1931: /* opt_limit_clause: limit_clause */ +#line 12284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit)= (yyvsp[0].select_limit); } +#line 44314 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1932: /* limit_clause: LIMIT limit_options */ +#line 12289 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1933: /* limit_clause: LIMIT limit_options ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12297 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[-3].select_limit); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1934: /* limit_clause: LIMIT ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).clear(); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44343 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1935: /* limit_clause: fetch_first_clause */ +#line 12307 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit || + !(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 44355 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1936: /* fetch_first_clause: FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12318 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1937: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12329 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= (yyvsp[-5].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44383 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1938: /* fetch_first_clause: FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44394 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1939: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12347 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[-6].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 44405 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1940: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows */ +#line 12354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= 0; + (yyval.select_limit).offset_limit= (yyvsp[-1].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44416 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1945: /* only_or_with_ties: ONLY_SYM */ +#line 12373 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 44422 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1946: /* only_or_with_ties: WITH TIES_SYM */ +#line 12374 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 44428 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1947: /* opt_global_limit_clause: opt_limit_clause */ +#line 12380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 44436 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1948: /* limit_options: limit_option */ +#line 12387 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= NULL; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44447 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1949: /* limit_options: limit_option ',' limit_option */ +#line 12394 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= (yyvsp[-2].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44458 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1950: /* limit_options: limit_option OFFSET_SYM limit_option */ +#line 12401 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[0].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 44469 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1951: /* limit_option: ident_cli */ +#line 12411 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 44478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1952: /* limit_option: ident_cli '.' ident_cli */ +#line 12416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 44487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1953: /* limit_option: param_marker */ +#line 12421 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_param)->limit_clause_param= TRUE; + } +#line 44495 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1954: /* limit_option: ULONGLONG_NUM */ +#line 12425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1955: /* limit_option: LONG_NUM */ +#line 12431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1956: /* limit_option: NUM */ +#line 12437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1957: /* limit_rows_option: limit_option */ +#line 12446 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->limit_rows_examined= (yyvsp[0].item); + } +#line 44533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1958: /* delete_limit_clause: %empty */ +#line 12453 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->current_select->limit_params.select_limit= 0; + } +#line 44542 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1959: /* delete_limit_clause: LIMIT limit_option */ +#line 12458 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->limit_params.select_limit= (yyvsp[0].item); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + sel->limit_params.explicit_limit= 1; + } +#line 44553 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1960: /* delete_limit_clause: LIMIT ROWS_SYM EXAMINED_SYM */ +#line 12464 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 44559 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1961: /* delete_limit_clause: LIMIT limit_option ROWS_SYM EXAMINED_SYM */ +#line 12465 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 44565 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1962: /* order_limit_lock: order_or_limit */ +#line 12470 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); + (yyval.order_limit_lock)->lock.empty(); + } +#line 44574 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1963: /* order_limit_lock: order_or_limit select_lock_type */ +#line 12475 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[-1].order_limit_lock); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 44583 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1964: /* order_limit_lock: select_lock_type */ +#line 12480 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit.clear(); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 44596 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1965: /* opt_order_limit_lock: %empty */ +#line 12492 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyval.order_limit_lock)= NULL; + } +#line 44605 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1966: /* opt_order_limit_lock: order_limit_lock */ +#line 12496 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); } +#line 44611 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1969: /* opt_procedure_or_into: %empty */ +#line 12509 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 44619 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1970: /* opt_procedure_or_into: procedure_clause opt_select_lock_type */ +#line 12513 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 44627 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1971: /* opt_procedure_or_into: into opt_select_lock_type */ +#line 12517 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + " INTO " + " FROM...'"); + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 44641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1972: /* order_or_limit: order_clause opt_limit_clause */ +#line 12531 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= (yyvsp[-1].select_order); + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 44653 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1973: /* order_or_limit: limit_clause */ +#line 12539 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 44665 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1976: /* int_num: opt_plus NUM */ +#line 12555 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= (int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44671 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1977: /* int_num: '-' NUM */ +#line 12556 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= -(int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44677 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1978: /* ulong_num: opt_plus NUM */ +#line 12560 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1979: /* ulong_num: HEX_NUM */ +#line 12561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= strtoul((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44689 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1980: /* ulong_num: opt_plus LONG_NUM */ +#line 12562 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44695 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1981: /* ulong_num: opt_plus ULONGLONG_NUM */ +#line 12563 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1982: /* ulong_num: opt_plus DECIMAL_NUM */ +#line 12564 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44707 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1983: /* ulong_num: opt_plus FLOAT_NUM */ +#line 12565 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44713 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1984: /* real_ulong_num: NUM */ +#line 12569 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44719 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1985: /* real_ulong_num: HEX_NUM */ +#line 12570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (ulong) strtol((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44725 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1986: /* real_ulong_num: LONG_NUM */ +#line 12571 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1987: /* real_ulong_num: ULONGLONG_NUM */ +#line 12572 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1988: /* real_ulong_num: dec_num_error */ +#line 12573 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1989: /* longlong_num: opt_plus NUM */ +#line 12577 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1990: /* longlong_num: LONG_NUM */ +#line 12578 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44755 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1991: /* longlong_num: '-' NUM */ +#line 12579 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44761 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1992: /* longlong_num: '-' LONG_NUM */ +#line 12580 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1993: /* ulonglong_num: opt_plus NUM */ +#line 12584 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44773 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1994: /* ulonglong_num: opt_plus ULONGLONG_NUM */ +#line 12585 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44779 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1995: /* ulonglong_num: opt_plus LONG_NUM */ +#line 12586 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1996: /* ulonglong_num: opt_plus DECIMAL_NUM */ +#line 12587 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1997: /* ulonglong_num: opt_plus FLOAT_NUM */ +#line 12588 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44797 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1998: /* real_ulonglong_num: NUM */ +#line 12592 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44803 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 1999: /* real_ulonglong_num: ULONGLONG_NUM */ +#line 12593 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44809 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2000: /* real_ulonglong_num: HEX_NUM */ +#line 12594 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulonglong_number)= strtoull((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2001: /* real_ulonglong_num: LONG_NUM */ +#line 12595 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44821 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2002: /* real_ulonglong_num: dec_num_error */ +#line 12596 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44827 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2003: /* dec_num_error: dec_num */ +#line 12601 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(ER_ONLY_INTEGERS_ALLOWED); } +#line 44833 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2006: /* choice: ulong_num */ +#line 12610 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= (yyvsp[0].ulong_num) != 0 ? HA_CHOICE_YES : HA_CHOICE_NO; } +#line 44839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2007: /* choice: DEFAULT */ +#line 12611 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= HA_CHOICE_UNDEF; } +#line 44845 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2008: /* bool: ulong_num */ +#line 12615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) != 0; } +#line 44851 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2009: /* bool: TRUE_SYM */ +#line 12616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1; } +#line 44857 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2010: /* bool: FALSE_SYM */ +#line 12617 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 44863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2011: /* $@169: %empty */ +#line 12622 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->proc_list.elements=0; + lex->proc_list.first=0; + lex->proc_list.next= &lex->proc_list.first; + Item_field *item= new (thd->mem_root) + Item_field(thd, &lex->current_select->context, + (yyvsp[0].ident_sys)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_proc_to_list(thd, item))) + MYSQL_YYABORT; + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + + /* + PROCEDURE CLAUSE cannot handle subquery as one of its parameter, + so disallow any subqueries further. + Alow subqueries back once the parameters are reduced. + */ + Lex->clause_that_disallows_subselect= "PROCEDURE"; + Select->options|= OPTION_PROCEDURE_CLAUSE; + } +#line 44891 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2012: /* procedure_clause: PROCEDURE_SYM ident $@169 '(' procedure_list ')' */ +#line 12646 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Subqueries are allowed from now.*/ + Lex->clause_that_disallows_subselect= NULL; + } +#line 44900 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2013: /* procedure_list: %empty */ +#line 12653 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44906 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2014: /* procedure_list: procedure_list2 */ +#line 12654 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44912 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2017: /* procedure_item: remember_name expr remember_end */ +#line 12664 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_proc_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2018: /* $@170: %empty */ +#line 12673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe && + unlikely((!(lex->result= new (thd->mem_root) + select_dumpvar(thd))))) + MYSQL_YYABORT; + } +#line 44935 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2019: /* select_var_list_init: $@170 select_var_list */ +#line 12681 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2021: /* select_var_list: select_var_ident */ +#line 12686 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44947 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2022: /* select_var_ident: select_outvar */ +#line 12690 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->result) + { + if (unlikely((yyvsp[0].myvar) == NULL)) + MYSQL_YYABORT; + ((select_dumpvar *)Lex->result)->var_list.push_back((yyvsp[0].myvar), thd->mem_root); + } + else + { + /* + The parser won't create select_result instance only + if it's an EXPLAIN. + */ + DBUG_ASSERT(Lex->describe); + } + } +#line 44968 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2023: /* select_outvar: '@' ident_or_text */ +#line 12710 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.myvar) = Lex->result ? new (thd->mem_root) my_var_user(&(yyvsp[0].lex_str)) : NULL; + } +#line 44982 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2024: /* select_outvar: ident_or_text */ +#line 12720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[0].lex_str))) && Lex->result)) + MYSQL_YYABORT; + } +#line 44991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2025: /* select_outvar: ident '.' ident */ +#line 12725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))) && Lex->result)) + MYSQL_YYABORT; + } +#line 45000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2026: /* into: INTO into_destination */ +#line 12733 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2027: /* $@171: %empty */ +#line 12738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str, 0))) || + unlikely(!(lex->result= + new (thd->mem_root) + select_export(thd, lex->exchange)))) + MYSQL_YYABORT; + } +#line 45021 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2028: /* $@172: %empty */ +#line 12749 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 45027 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2030: /* into_destination: DUMPFILE TEXT_STRING_filesystem */ +#line 12752 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe) + { + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str,1)))) + MYSQL_YYABORT; + if (unlikely(!(lex->result= + new (thd->mem_root) + select_dump(thd, lex->exchange)))) + MYSQL_YYABORT; + } + } +#line 45046 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2031: /* into_destination: select_var_list_init */ +#line 12767 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 45054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2032: /* $@173: %empty */ +#line 12778 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_DO; + if (lex->main_select_push(true)) + MYSQL_YYABORT; + lex->init_select(); + } +#line 45066 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2033: /* do: DO_SYM $@173 expr_list */ +#line 12786 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->insert_list= (yyvsp[0].item_list); + Lex->pop_select(); //main select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 45077 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2034: /* $@174: %empty */ +#line 12800 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_TABLE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45088 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2035: /* drop: DROP opt_temporary table_or_tables opt_if_exists $@174 table_list opt_lock_wait_timeout opt_restrict */ +#line 12807 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2036: /* $@175: %empty */ +#line 12809 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 45103 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2037: /* drop: DROP INDEX_SYM $@175 opt_if_exists_table_element ident ON table_ident opt_lock_wait_timeout */ +#line 12814 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[-3].ident_sys).str, (yyvsp[-4].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->sql_command= SQLCOM_DROP_INDEX; + lex->alter_info.reset(); + lex->alter_info.flags= ALTER_DROP_INDEX; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + if (unlikely(!lex->current_select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, + MDL_SHARED_UPGRADABLE))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 45125 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2038: /* drop: DROP DATABASE opt_if_exists ident */ +#line 12832 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_DB, (yyvsp[-1].object_ddl_options)); + lex->name= (yyvsp[0].ident_sys); + } +#line 45135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2039: /* drop: DROP USER_SYM opt_if_exists clear_privileges user_list */ +#line 12838 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_USER, (yyvsp[-2].object_ddl_options)); + } +#line 45143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2040: /* drop: DROP ROLE_SYM opt_if_exists clear_privileges role_list */ +#line 12842 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_ROLE, (yyvsp[-2].object_ddl_options)); + } +#line 45151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2041: /* $@176: %empty */ +#line 12846 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_VIEW, (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45162 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2042: /* drop: DROP VIEW_SYM opt_if_exists $@176 table_list opt_restrict */ +#line 12853 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2043: /* drop: DROP EVENT_SYM opt_if_exists sp_name */ +#line 12855 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->set_command(SQLCOM_DROP_EVENT, (yyvsp[-1].object_ddl_options)); + } +#line 45177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2044: /* drop: DROP TRIGGER_SYM opt_if_exists sp_name */ +#line 12860 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_TRIGGER, (yyvsp[-1].object_ddl_options)); + lex->spname= (yyvsp[0].spname); + } +#line 45187 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2045: /* drop: DROP SERVER_SYM opt_if_exists ident_or_text */ +#line 12866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_SERVER, (yyvsp[-1].object_ddl_options)); + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 45196 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2046: /* $@177: %empty */ +#line 12872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_SEQUENCE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + lex->table_type= TABLE_TYPE_SEQUENCE; + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2047: /* drop: DROP opt_temporary SEQUENCE_SYM opt_if_exists $@177 table_list */ +#line 12880 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45214 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2051: /* table_name: table_ident */ +#line 12891 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type)) + MYSQL_YYABORT; + } +#line 45227 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2052: /* table_name_with_opt_use_partition: table_ident opt_use_partition */ +#line 12903 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + } +#line 45241 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2055: /* table_alias_ref: table_ident_opt_wild */ +#line 12921 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 45255 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2056: /* opt_if_exists_table_element: %empty */ +#line 12934 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + (yyval.num)= 0; + } +#line 45264 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2057: /* opt_if_exists_table_element: IF_SYM EXISTS */ +#line 12939 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + (yyval.num)= 1; + } +#line 45273 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2058: /* opt_if_exists: %empty */ +#line 12947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_NONE); + } +#line 45281 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2059: /* opt_if_exists: IF_SYM EXISTS */ +#line 12951 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_EXISTS); + } +#line 45289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2060: /* opt_temporary: %empty */ +#line 12957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 45295 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2061: /* opt_temporary: TEMPORARY */ +#line 12958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= HA_LEX_CREATE_TMP_TABLE; } +#line 45301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2062: /* $@178: %empty */ +#line 12966 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_INSERT; + Lex->duplicates= DUP_ERROR; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 45312 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2063: /* $@179: %empty */ +#line 12973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-3].lock_type), true, false); + } +#line 45320 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2064: /* insert: INSERT $@178 insert_start insert_lock_option opt_ignore opt_into insert_table $@179 insert_field_spec opt_insert_update opt_returning stmt_end */ +#line 12978 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 45329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2065: /* $@180: %empty */ +#line 12986 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REPLACE; + Lex->duplicates= DUP_REPLACE; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 45340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2066: /* $@181: %empty */ +#line 12993 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-2].lock_type), true, false); + } +#line 45348 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2067: /* replace: REPLACE $@180 insert_start replace_lock_option opt_into insert_table $@181 insert_field_spec opt_returning stmt_end */ +#line 12998 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 45357 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2068: /* insert_start: %empty */ +#line 13004 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->init_select(); + Lex->inc_select_stack_outer_barrier(); + Lex->current_select->parsing_place= BEFORE_OPT_LIST; + } +#line 45369 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2069: /* stmt_end: %empty */ +#line 13013 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2070: /* insert_lock_option: %empty */ +#line 13022 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If it is SP we do not allow insert optimisation when result of + insert visible only after the table unlocking but everyone can + read table. + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 45392 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2072: /* insert_lock_option: HIGH_PRIORITY */ +#line 13031 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE; } +#line 45398 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2073: /* replace_lock_option: %empty */ +#line 13035 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 45404 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2075: /* insert_replace_option: LOW_PRIORITY */ +#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 45410 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2076: /* insert_replace_option: DELAYED_SYM */ +#line 13042 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->keyword_delayed_begin_offset= (uint)((yyvsp[0].kwd).pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)((yyvsp[0].kwd).end() - thd->query()); + (yyval.lock_type)= TL_WRITE_DELAYED; + } +#line 45420 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2079: /* $@182: %empty */ +#line 13052 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->save_parsing_place= Select->parsing_place; + } +#line 45428 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2080: /* insert_table: $@182 table_name_with_opt_use_partition */ +#line 13056 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + //lex->field_list.empty(); + lex->many_values.empty(); + lex->insert_list=0; + } +#line 45439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2081: /* insert_field_spec: insert_values */ +#line 13065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45445 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2082: /* insert_field_spec: insert_field_list insert_values */ +#line 13066 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2083: /* $@183: %empty */ +#line 13068 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item)) || + unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + lex->current_select->parsing_place= NO_MATTER; + } +#line 45464 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2085: /* insert_field_list: LEFT_PAREN_ALT opt_fields ')' */ +#line 13081 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->current_select->parsing_place= AFTER_LIST; + } +#line 45472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2088: /* fields: fields ',' insert_ident */ +#line 13093 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 45478 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2089: /* fields: insert_ident */ +#line 13094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 45484 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2090: /* insert_values: create_select_query_expression */ +#line 13100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45490 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2095: /* ident_eq_value: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13115 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->field_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45501 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2096: /* equal: '=' */ +#line 13124 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45507 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2097: /* equal: SET_VAR */ +#line 13125 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45513 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2098: /* opt_equal: %empty */ +#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45519 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2099: /* opt_equal: equal */ +#line 13130 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2100: /* opt_with: opt_equal */ +#line 13134 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45531 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2101: /* opt_with: WITH */ +#line 13135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45537 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2102: /* opt_by: opt_equal */ +#line 13139 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45543 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2103: /* opt_by: BY */ +#line 13140 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45549 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2104: /* $@184: %empty */ +#line 13145 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 45558 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2105: /* no_braces: '(' $@184 opt_values ')' */ +#line 13150 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 45570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2106: /* $@185: %empty */ +#line 13161 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 45579 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2107: /* no_braces_with_names: '(' $@185 opt_values_with_names ')' */ +#line 13166 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 45591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2108: /* opt_values: %empty */ +#line 13176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2110: /* opt_values_with_names: %empty */ +#line 13181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2112: /* values: values ',' expr_or_ignore_or_default */ +#line 13187 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2113: /* values: expr_or_ignore_or_default */ +#line 13192 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2114: /* values_with_names: values_with_names ',' remember_name expr_or_ignore_or_default remember_end */ +#line 13200 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 45633 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2115: /* values_with_names: remember_name expr_or_ignore_or_default remember_end */ +#line 13208 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 45645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2116: /* expr_or_ignore: expr */ +#line 13218 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 45651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2117: /* expr_or_ignore: IGNORE_SYM */ +#line 13220 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_ignore_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 45661 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2118: /* expr_or_ignore_or_default: expr_or_ignore */ +#line 13228 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 45667 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2119: /* expr_or_ignore_or_default: DEFAULT */ +#line 13230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_default_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 45677 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2121: /* $@186: %empty */ +#line 13239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates= DUP_UPDATE; } +#line 45683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2122: /* $@187: %empty */ +#line 13241 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_UPDATE_ON_DUP_KEY; + } +#line 45691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2123: /* opt_insert_update: ON DUPLICATE_SYM $@186 KEY_SYM UPDATE_SYM $@187 insert_update_list */ +#line 13245 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 45699 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2124: /* update_table_list: table_ident opt_use_partition for_portion_of_time_clause opt_table_alias_clause opt_key_definition */ +#line 13253 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + (yyval.table_list)->period_conditions= Lex->period_conditions; + } +#line 45714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2125: /* update_table_list: join_table_list */ +#line 13263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 45720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2126: /* $@188: %empty */ +#line 13270 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->sql_command= SQLCOM_UPDATE; + lex->duplicates= DUP_ERROR; + } +#line 45733 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2127: /* $@189: %empty */ +#line 13280 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *slex= Lex->first_select_lex(); + if (slex->table_list.elements > 1) + Lex->sql_command= SQLCOM_UPDATE_MULTI; + else if (slex->get_table_list()->derived) + { + /* it is single table update and it is update of derived table */ + my_error(ER_NON_UPDATABLE_TABLE, MYF(0), + slex->get_table_list()->alias.str, "UPDATE"); + MYSQL_YYABORT; + } + /* + In case of multi-update setting write lock for all tables may + be too pessimistic. We will decrease lock level if possible in + mysql_multi_update(). + */ + slex->set_lock_for_tables((yyvsp[-4].lock_type), slex->table_list.elements == 1, false); + } +#line 45756 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2128: /* $@190: %empty */ +#line 13299 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].select_order)) + Select->order_list= *((yyvsp[-1].select_order)); + } +#line 45765 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2129: /* update: UPDATE_SYM $@188 opt_low_priority opt_ignore update_table_list SET update_list $@189 opt_where_clause opt_order_clause delete_limit_clause $@190 stmt_end */ +#line 13302 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45771 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2132: /* update_elem: simple_ident_nospvar equal DEFAULT */ +#line 13312 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *def= new (thd->mem_root) Item_default_value(thd, + Lex->current_context(), (yyvsp[-2].item), 1); + if (!def || add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, def)) + MYSQL_YYABORT; + } +#line 45782 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2133: /* update_elem: simple_ident_nospvar equal expr_or_ignore */ +#line 13319 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 45791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2136: /* insert_update_elem: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13332 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2137: /* opt_low_priority: %empty */ +#line 13341 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 45808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2138: /* opt_low_priority: LOW_PRIORITY */ +#line 13342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 45814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2139: /* $@191: %empty */ +#line 13349 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_DELETE; + YYPS->m_lock_type= TL_WRITE_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_WRITE; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->ignore= 0; + lex->first_select_lex()->order_list.empty(); + } +#line 45830 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2140: /* delete: DELETE_SYM $@191 delete_part2 */ +#line 13361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 45839 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2141: /* opt_delete_system_time: %empty */ +#line 13369 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_HISTORY); + } +#line 45847 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2142: /* opt_delete_system_time: BEFORE_SYM SYSTEM_TIME_SYM history_point */ +#line 13373 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BEFORE, (yyvsp[0].vers_history_point)); + } +#line 45855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2143: /* delete_part2: opt_delete_options single_multi */ +#line 13379 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45861 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2144: /* delete_part2: HISTORY_SYM delete_single_table opt_delete_system_time */ +#line 13381 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_table()->vers_conditions= Lex->vers_conditions; + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45872 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2145: /* delete_single_table: FROM table_ident opt_use_partition */ +#line 13391 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2146: /* delete_single_table_for_period: delete_single_table opt_for_portion_of_time_clause */ +#line 13406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].num)) + Lex->last_table()->period_conditions= Lex->period_conditions; + } +#line 45897 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2147: /* single_multi: delete_single_table_for_period opt_where_clause opt_order_clause delete_limit_clause opt_returning */ +#line 13418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].select_order)) + Select->order_list= *((yyvsp[-2].select_order)); + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45909 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2148: /* $@192: %empty */ +#line 13426 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45919 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2149: /* $@193: %empty */ +#line 13432 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45928 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2150: /* single_multi: table_wild_list $@192 FROM join_table_list opt_where_clause $@193 stmt_end */ +#line 13435 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45934 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2151: /* $@194: %empty */ +#line 13437 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45944 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2152: /* $@195: %empty */ +#line 13443 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45953 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2153: /* single_multi: FROM table_alias_ref_list $@194 USING join_table_list opt_where_clause $@195 stmt_end */ +#line 13446 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2154: /* opt_returning: %empty */ +#line 13451 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + } +#line 45967 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2155: /* $@196: %empty */ +#line 13455 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + /* + When parsing_place is IN_RETURNING, we push select items to + item_list of builtin_select instead of current_select. + But set parsing_place of current_select to true. + + Because parsing_place for builtin_select will be IN_RETURNING, + regardless there is SELECT in RETURNING. Example, if + there is RETURNING (SELECT...), then when we parse + SELECT inside RETURNING, builtin_select->parsing_place + will still be true. So the select items of SELECT inside + RETURNING will be added to item_list of builtin_select which + is incorrect. We want to prevent this from happening. + Since for every new select, a new SELECT_LEX + object is created and pushed to select stack, current_select + will point to SELECT inside RETURNING, and also has + parsing_place not set to IN_RETURNING by default. + So items are correctly added to item_list of SELECT inside + RETURNING instead of builtin_select. + */ + + thd->lex->current_select->parsing_place= IN_RETURNING; + thd->lex->push_context(&thd->lex->returning()->context); + } +#line 45997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2156: /* opt_returning: RETURNING_SYM $@196 select_item_list */ +#line 13481 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->pop_context(); + thd->lex->current_select->parsing_place= NO_MATTER; + } +#line 46006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2159: /* table_wild_one: ident opt_wild */ +#line 13494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 46025 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2160: /* table_wild_one: ident '.' ident opt_wild */ +#line 13509 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 46044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2161: /* opt_wild: %empty */ +#line 13526 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2162: /* opt_wild: '.' '*' */ +#line 13527 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2163: /* opt_delete_options: %empty */ +#line 13531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2164: /* opt_delete_options: opt_delete_option opt_delete_options */ +#line 13532 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2165: /* opt_delete_option: QUICK */ +#line 13536 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_QUICK; } +#line 46074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2166: /* opt_delete_option: LOW_PRIORITY */ +#line 13537 "/home/buildbot/git/sql/sql_yacc.yy" + { YYPS->m_lock_type= TL_WRITE_LOW_PRIORITY; } +#line 46080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2167: /* opt_delete_option: IGNORE_SYM */ +#line 13538 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 46086 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2168: /* $@197: %empty */ +#line 13543 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= Lex; + lex->sql_command= SQLCOM_TRUNCATE; + lex->alter_info.reset(); + lex->first_select_lex()->options= 0; + lex->sql_cache= LEX::SQL_CACHE_UNSPECIFIED; + lex->first_select_lex()->order_list.empty(); + YYPS->m_lock_type= TL_WRITE; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 46101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2169: /* $@198: %empty */ +#line 13554 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_truncate_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 46113 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2170: /* truncate: TRUNCATE_SYM $@197 opt_table_sym table_name opt_lock_wait_timeout $@198 opt_truncate_table_storage_clause */ +#line 13561 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46119 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2177: /* profile_def: CPU_SYM */ +#line 13579 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CPU; + } +#line 46127 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2178: /* profile_def: MEMORY_SYM */ +#line 13583 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_MEMORY; + } +#line 46135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2179: /* profile_def: BLOCK_SYM IO_SYM */ +#line 13587 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_BLOCK_IO; + } +#line 46143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2180: /* profile_def: CONTEXT_SYM SWITCHES_SYM */ +#line 13591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CONTEXT; + } +#line 46151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2181: /* profile_def: PAGE_SYM FAULTS_SYM */ +#line 13595 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_PAGE_FAULTS; + } +#line 46159 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2182: /* profile_def: IPC_SYM */ +#line 13599 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_IPC; + } +#line 46167 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2183: /* profile_def: SWAPS_SYM */ +#line 13603 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SWAPS; + } +#line 46175 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2184: /* profile_def: SOURCE_SYM */ +#line 13607 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SOURCE; + } +#line 46183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2185: /* profile_def: ALL */ +#line 13611 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_ALL; + } +#line 46191 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2186: /* opt_profile_args: %empty */ +#line 13618 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= 0; + } +#line 46199 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2187: /* opt_profile_args: FOR_SYM QUERY_SYM NUM */ +#line 13622 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= atoi((yyvsp[0].lex_str).str); + } +#line 46207 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2188: /* $@199: %empty */ +#line 13631 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + } +#line 46222 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2189: /* show: SHOW $@199 show_param */ +#line 13642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 46231 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2190: /* show_param: DATABASES wild_and_where */ +#line 13650 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_DATABASES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SCHEMATA))) + MYSQL_YYABORT; + } +#line 46242 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2191: /* show_param: opt_full TABLES opt_db wild_and_where */ +#line 13657 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLE_NAMES)) + MYSQL_YYABORT; + } +#line 46254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2192: /* show_param: opt_full TRIGGERS_SYM opt_db wild_and_where */ +#line 13665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TRIGGERS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TRIGGERS)) + MYSQL_YYABORT; + } +#line 46266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2193: /* show_param: EVENTS_SYM opt_db wild_and_where */ +#line 13673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_EVENTS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_EVENTS)) + MYSQL_YYABORT; + } +#line 46278 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2194: /* show_param: TABLE_SYM STATUS_SYM opt_db wild_and_where */ +#line 13681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLE_STATUS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLES)) + MYSQL_YYABORT; + } +#line 46290 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2195: /* show_param: OPEN_SYM TABLES opt_db wild_and_where */ +#line 13689 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_OPEN_TABLES)) + MYSQL_YYABORT; + } +#line 46302 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2196: /* show_param: PLUGINS_SYM */ +#line 13697 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PLUGINS))) + MYSQL_YYABORT; + } +#line 46313 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2197: /* show_param: PLUGINS_SYM SONAME_SYM TEXT_STRING_sys */ +#line 13704 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->ident= (yyvsp[0].lex_str); + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 46324 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2198: /* show_param: PLUGINS_SYM SONAME_SYM wild_and_where */ +#line 13711 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 46334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2199: /* show_param: ENGINE_SYM known_storage_engines show_engine_param */ +#line 13717 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= (yyvsp[-1].db_type); } +#line 46340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2200: /* show_param: ENGINE_SYM ALL show_engine_param */ +#line 13719 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= NULL; } +#line 46346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2201: /* show_param: opt_full COLUMNS from_or_in table_ident opt_db wild_and_where */ +#line 13721 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_FIELDS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 46359 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2202: /* show_param: master_or_binary LOGS_SYM */ +#line 13730 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOGS; + } +#line 46367 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2203: /* show_param: SLAVE HOSTS_SYM */ +#line 13734 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; + } +#line 46375 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2204: /* $@200: %empty */ +#line 13738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; + } +#line 46384 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2206: /* $@201: %empty */ +#line 13744 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; + } +#line 46393 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2207: /* show_param: RELAYLOG_SYM optional_connection_name EVENTS_SYM binlog_in binlog_from $@201 opt_global_limit_clause optional_for_channel */ +#line 13749 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46399 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2208: /* show_param: keys_or_index from_or_in table_ident opt_db opt_where_clause */ +#line 13751 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_KEYS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_STATISTICS))) + MYSQL_YYABORT; + } +#line 46412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2209: /* show_param: opt_storage ENGINES_SYM */ +#line 13760 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_ENGINES))) + MYSQL_YYABORT; + } +#line 46423 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2210: /* show_param: AUTHORS_SYM */ +#line 13767 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_AUTHORS; + } +#line 46432 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2211: /* show_param: CONTRIBUTORS_SYM */ +#line 13772 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; + } +#line 46441 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2212: /* show_param: PRIVILEGES */ +#line 13777 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_PRIVILEGES; + } +#line 46450 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2213: /* show_param: COUNT_SYM '(' '*' ')' WARNINGS */ +#line 13782 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("warning_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 46459 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2214: /* show_param: COUNT_SYM '(' '*' ')' ERRORS */ +#line 13787 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("error_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 46468 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2215: /* show_param: WARNINGS opt_global_limit_clause */ +#line 13792 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_WARNS;} +#line 46474 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2216: /* show_param: ERRORS opt_global_limit_clause */ +#line 13794 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_ERRORS;} +#line 46480 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2217: /* show_param: PROFILES_SYM */ +#line 13796 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_PROFILES; } +#line 46486 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2218: /* show_param: PROFILE_SYM opt_profile_defs opt_profile_args opt_global_limit_clause */ +#line 13798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PROFILE; + if (unlikely(prepare_schema_table(thd, lex, NULL, SCH_PROFILES))) + MYSQL_YYABORT; + } +#line 46497 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2219: /* show_param: opt_var_type STATUS_SYM wild_and_where */ +#line 13805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_STATUS))) + MYSQL_YYABORT; + } +#line 46509 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2220: /* show_param: opt_full PROCESSLIST_SYM */ +#line 13813 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} +#line 46515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2221: /* show_param: opt_var_type VARIABLES wild_and_where */ +#line 13815 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_VARIABLES; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_VARIABLES))) + MYSQL_YYABORT; + } +#line 46527 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2222: /* show_param: charset wild_and_where */ +#line 13823 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CHARSETS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_CHARSETS))) + MYSQL_YYABORT; + } +#line 46538 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2223: /* show_param: COLLATION_SYM wild_and_where */ +#line 13830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_COLLATIONS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_COLLATIONS))) + MYSQL_YYABORT; + } +#line 46549 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2224: /* show_param: GRANTS */ +#line 13837 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_GRANTS; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user_and_current_role; + } +#line 46561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2225: /* show_param: GRANTS FOR_SYM user_or_role clear_privileges */ +#line 13845 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_GRANTS; + lex->grant_user=(yyvsp[-1].lex_user); + } +#line 46571 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2226: /* show_param: CREATE DATABASE opt_if_not_exists ident */ +#line 13851 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_SHOW_CREATE_DB, (yyvsp[-1].object_ddl_options)); + Lex->name= (yyvsp[0].ident_sys); + } +#line 46580 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2227: /* show_param: CREATE TABLE_SYM table_ident */ +#line 13856 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL,0)) + MYSQL_YYABORT; + lex->create_info.storage_media= HA_SM_DEFAULT; + } +#line 46592 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2228: /* show_param: CREATE VIEW_SYM table_ident */ +#line 13864 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_VIEW; + } +#line 46604 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2229: /* show_param: CREATE SEQUENCE_SYM table_ident */ +#line 13872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_SEQUENCE; + } +#line 46616 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2230: /* show_param: BINLOG_SYM STATUS_SYM */ +#line 13880 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 46624 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2231: /* show_param: MASTER_SYM STATUS_SYM */ +#line 13884 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 46632 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2232: /* show_param: ALL SLAVES STATUS_SYM */ +#line 13888 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status(true))) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 46643 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2233: /* show_param: SLAVE optional_connection_name STATUS_SYM optional_for_channel */ +#line 13895 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status())) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 46654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2234: /* show_param: CREATE PROCEDURE_SYM sp_name */ +#line 13902 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_PROC; + lex->spname= (yyvsp[0].spname); + } +#line 46665 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2235: /* show_param: CREATE FUNCTION_SYM sp_name */ +#line 13909 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; + lex->spname= (yyvsp[0].spname); + } +#line 46676 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2236: /* show_param: CREATE PACKAGE_MARIADB_SYM sp_name */ +#line 13916 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 46686 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2237: /* show_param: CREATE PACKAGE_ORACLE_SYM sp_name */ +#line 13922 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 46696 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2238: /* show_param: CREATE PACKAGE_MARIADB_SYM BODY_MARIADB_SYM sp_name */ +#line 13928 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 46706 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2239: /* show_param: CREATE PACKAGE_ORACLE_SYM BODY_ORACLE_SYM sp_name */ +#line 13934 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 46716 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2240: /* show_param: CREATE TRIGGER_SYM sp_name */ +#line 13940 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; + lex->spname= (yyvsp[0].spname); + } +#line 46726 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2241: /* show_param: CREATE USER_SYM */ +#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user; + } +#line 46738 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2242: /* show_param: CREATE USER_SYM user */ +#line 13954 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + Lex->grant_user= (yyvsp[0].lex_user); + } +#line 46747 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2243: /* show_param: PROCEDURE_SYM STATUS_SYM wild_and_where */ +#line 13959 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PROC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2244: /* show_param: FUNCTION_SYM STATUS_SYM wild_and_where */ +#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2245: /* show_param: PACKAGE_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13973 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46780 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2246: /* show_param: PACKAGE_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13980 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46791 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2247: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13987 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2248: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13994 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46813 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2249: /* show_param: PROCEDURE_SYM CODE_SYM sp_name */ +#line 14001 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PROC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46822 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2250: /* show_param: FUNCTION_SYM CODE_SYM sp_name */ +#line 14006 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46831 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2251: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM CODE_SYM sp_name */ +#line 14011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46840 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2252: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM CODE_SYM sp_name */ +#line 14016 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46849 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2253: /* show_param: CREATE EVENT_SYM sp_name */ +#line 14021 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; + } +#line 46858 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2254: /* show_param: describe_command opt_format_json FOR_SYM expr */ +#line 14030 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46870 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2255: /* show_param: ANALYZE_SYM opt_format_json FOR_SYM expr */ +#line 14038 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_ANALYZE; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_ANALYZE_JSON : SCH_ANALYZE_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2256: /* show_param: IDENT_sys remember_tok_start wild_and_where */ +#line 14046 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + bool in_plugin; + lex->sql_command= SQLCOM_SHOW_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-2].ident_sys), &in_plugin); + if (unlikely(!table || !table->old_format || !in_plugin)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-1].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(lex->wild && table->idx_field1 < 0)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(make_schema_select(thd, Lex->current_select, table))) + MYSQL_YYABORT; + } +#line 46905 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2257: /* show_engine_param: STATUS_SYM */ +#line 14068 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } +#line 46911 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2258: /* show_engine_param: MUTEX_SYM */ +#line 14070 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } +#line 46917 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2259: /* show_engine_param: LOGS_SYM */ +#line 14072 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } +#line 46923 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2264: /* opt_db: %empty */ +#line 14086 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 46929 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2265: /* opt_db: from_or_in ident */ +#line 14087 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 46935 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2266: /* opt_full: %empty */ +#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=0; } +#line 46941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2267: /* opt_full: FULL */ +#line 14092 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=1; } +#line 46947 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2270: /* binlog_in: %empty */ +#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = 0; } +#line 46953 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2271: /* binlog_in: IN_SYM TEXT_STRING_sys */ +#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = (yyvsp[0].lex_str).str; } +#line 46959 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2272: /* binlog_from: %empty */ +#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = 4; /* skip magic number */ } +#line 46965 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2273: /* binlog_from: FROM ulonglong_num */ +#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = (yyvsp[0].ulonglong_number); } +#line 46971 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2274: /* wild_and_where: %empty */ +#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.simple_string)= 0; } +#line 46977 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2275: /* wild_and_where: LIKE remember_tok_start TEXT_STRING_sys */ +#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 46990 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2276: /* wild_and_where: WHERE remember_tok_start expr */ +#line 14122 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->where= normalize_cond(thd, (yyvsp[0].item)); + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 47001 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2277: /* $@202: %empty */ +#line 14133 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->sql_command= SQLCOM_SHOW_FIELDS; + lex->first_select_lex()->db= null_clex_str; + lex->verbose= 0; + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[0].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 47018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2278: /* describe: describe_command table_ident $@202 opt_describe_column */ +#line 14146 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 47027 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2279: /* $@203: %empty */ +#line 14151 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_NORMAL; } +#line 47033 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2280: /* describe: describe_command opt_extended_describe $@203 explainable_command */ +#line 14153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->first_select_lex()->options|= SELECT_DESCRIBE; + } +#line 47042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2289: /* analyze_stmt_command: ANALYZE_SYM opt_format_json explainable_command */ +#line 14175 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->analyze_stmt= true; + } +#line 47050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2290: /* opt_extended_describe: EXTENDED_SYM */ +#line 14181 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED; } +#line 47056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2291: /* opt_extended_describe: EXTENDED_SYM ALL */ +#line 14183 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED | DESCRIBE_EXTENDED2; } +#line 47062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2292: /* opt_extended_describe: PARTITIONS_SYM */ +#line 14184 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_PARTITIONS; } +#line 47068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2293: /* opt_extended_describe: opt_format_json */ +#line 14185 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2294: /* opt_format_json: %empty */ +#line 14189 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2295: /* opt_format_json: FORMAT_SYM '=' ident_or_text */ +#line 14191 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("JSON"))) + Lex->explain_json= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("TRADITIONAL"))) + DBUG_ASSERT(Lex->explain_json==false); + else + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "EXPLAIN/ANALYZE", (yyvsp[0].lex_str).str)); + } +#line 47094 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2296: /* opt_describe_column: %empty */ +#line 14203 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47100 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2297: /* opt_describe_column: text_string */ +#line 14204 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->wild= (yyvsp[0].string); } +#line 47106 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2298: /* opt_describe_column: ident */ +#line 14206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + } +#line 47118 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2299: /* explain_for_connection: describe_command opt_format_json FOR_SYM CONNECTION_SYM expr */ +#line 14222 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 47140 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2300: /* $@204: %empty */ +#line 14245 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_FLUSH; + lex->type= 0; + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 47151 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2301: /* flush: FLUSH_SYM opt_no_write_to_binlog $@204 flush_options */ +#line 14251 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47157 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2302: /* $@205: %empty */ +#line 14256 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_TABLES; + /* + Set type of metadata and table locks for + FLUSH TABLES table_list [WITH READ LOCK]. + */ + YYPS->m_lock_type= TL_READ_NO_INSERT; + YYPS->m_mdl_type= MDL_SHARED_HIGH_PRIO; + } +#line 47171 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2303: /* flush_options: table_or_tables $@205 opt_table_list opt_flush_lock */ +#line 14266 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2304: /* flush_options: flush_options_list */ +#line 14268 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2305: /* opt_flush_lock: %empty */ +#line 14272 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47189 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2306: /* opt_flush_lock: flush_lock */ +#line 14274 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *tables= Lex->query_tables; + for (; tables; tables= tables->next_global) + { + tables->mdl_request.set_type(MDL_SHARED_NO_WRITE); + /* Ignore temporary tables. */ + tables->open_type= OT_BASE_ONLY; + } + } +#line 47203 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2307: /* flush_lock: WITH READ_SYM LOCK_SYM optional_flush_tables_arguments */ +#line 14287 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_READ_LOCK | (yyvsp[0].num); } +#line 47209 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2308: /* $@206: %empty */ +#line 14289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->query_tables == NULL)) + { + // Table list can't be empty + thd->parse_error(ER_NO_TABLES_USED); + MYSQL_YYABORT; + } + Lex->type|= REFRESH_FOR_EXPORT; + } +#line 47223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2309: /* flush_lock: FOR_SYM $@206 EXPORT_SYM */ +#line 14297 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47229 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2311: /* flush_options_list: flush_option */ +#line 14303 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47235 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2312: /* flush_option: ERROR_SYM LOGS_SYM */ +#line 14308 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ERROR_LOG; } +#line 47241 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2313: /* flush_option: ENGINE_SYM LOGS_SYM */ +#line 14310 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ENGINE_LOG; } +#line 47247 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2314: /* flush_option: GENERAL LOGS_SYM */ +#line 14312 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GENERAL_LOG; } +#line 47253 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2315: /* flush_option: SLOW LOGS_SYM */ +#line 14314 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLOW_LOG; } +#line 47259 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2316: /* flush_option: BINARY LOGS_SYM opt_delete_gtid_domain */ +#line 14316 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_BINARY_LOG; } +#line 47265 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2317: /* flush_option: RELAY LOGS_SYM optional_connection_name optional_for_channel */ +#line 14318 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_RELAY_LOG)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH", "RELAY LOGS")); + lex->type|= REFRESH_RELAY_LOG; + lex->relay_log_connection_name= lex->mi.connection_name; + } +#line 47277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2318: /* flush_option: QUERY_SYM CACHE_SYM */ +#line 14326 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE_FREE; } +#line 47283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2319: /* flush_option: HOSTS_SYM */ +#line 14328 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_HOSTS; } +#line 47289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2320: /* flush_option: PRIVILEGES */ +#line 14330 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GRANT; } +#line 47295 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2321: /* flush_option: LOGS_SYM */ +#line 14332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_LOG; + Lex->relay_log_connection_name= empty_clex_str; + } +#line 47304 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2322: /* flush_option: STATUS_SYM */ +#line 14337 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_STATUS; } +#line 47310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2323: /* flush_option: SLAVE optional_connection_name */ +#line 14339 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_SLAVE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH","SLAVE")); + lex->type|= REFRESH_SLAVE; + lex->reset_slave_info.all= false; + } +#line 47322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2324: /* flush_option: MASTER_SYM */ +#line 14347 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_MASTER; } +#line 47328 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2325: /* flush_option: DES_KEY_FILE */ +#line 14349 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_DES_KEY_FILE; } +#line 47334 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2326: /* flush_option: RESOURCES */ +#line 14351 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_USER_RESOURCES; } +#line 47340 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2327: /* flush_option: SSL_SYM */ +#line 14353 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SSL;} +#line 47346 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2328: /* flush_option: THREADS_SYM */ +#line 14355 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_THREADS;} +#line 47352 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2329: /* flush_option: IDENT_sys remember_tok_start */ +#line 14357 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-1].ident_sys)); + if (unlikely(!table || !table->reset_table)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[-1].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root))) + MYSQL_YYABORT; + } +#line 47370 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2330: /* opt_table_list: %empty */ +#line 14373 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47376 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2331: /* opt_table_list: table_list */ +#line 14374 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47382 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2332: /* backup: BACKUP_SYM backup_statements */ +#line 14378 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47388 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2333: /* backup_statements: STAGE_SYM ident */ +#line 14383 "/home/buildbot/git/sql/sql_yacc.yy" + { + int type; + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP STAGE")); + if ((type= find_type((yyvsp[0].ident_sys).str, &backup_stage_names, + FIND_TYPE_NO_PREFIX)) <= 0) + my_yyabort_error((ER_BACKUP_UNKNOWN_STAGE, MYF(0), (yyvsp[0].ident_sys).str)); + Lex->sql_command= SQLCOM_BACKUP; + Lex->backup_stage= (backup_stages) (type-1); + break; + } +#line 47404 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2334: /* $@207: %empty */ +#line 14395 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP LOCK")); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 47415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2335: /* backup_statements: LOCK_SYM $@207 table_ident */ +#line 14402 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[0].table), NULL, 0, + TL_READ, MDL_SHARED_HIGH_PRIO))) + MYSQL_YYABORT; + Lex->sql_command= SQLCOM_BACKUP_LOCK; + Lex->pop_select(); //main select + } +#line 47427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2336: /* backup_statements: UNLOCK_SYM */ +#line 14410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP UNLOCK")); + /* Table list is empty for unlock */ + Lex->sql_command= SQLCOM_BACKUP_LOCK; + } +#line 47438 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2337: /* opt_delete_gtid_domain: %empty */ +#line 14419 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47444 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2338: /* opt_delete_gtid_domain: DELETE_DOMAIN_ID_SYM '=' '(' delete_domain_id_list ')' */ +#line 14421 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47450 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2342: /* delete_domain_id: ulonglong_num */ +#line 14431 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint32 value= (uint32) (yyvsp[0].ulonglong_number); + if ((yyvsp[0].ulonglong_number) > UINT_MAX32) + { + my_printf_error(ER_BINLOG_CANT_DELETE_GTID_DOMAIN, + "The value of gtid domain being deleted ('%llu') " + "exceeds its maximum size " + "of 32 bit unsigned integer", MYF(0), (yyvsp[0].ulonglong_number)); + MYSQL_YYABORT; + } + insert_dynamic(&Lex->delete_gtid_domain, (uchar*) &value); + } +#line 47467 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2343: /* optional_flush_tables_arguments: %empty */ +#line 14446 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= 0;} +#line 47473 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2344: /* optional_flush_tables_arguments: AND_SYM DISABLE_SYM CHECKPOINT_SYM */ +#line 14447 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= REFRESH_CHECKPOINT; } +#line 47479 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2345: /* $@208: %empty */ +#line 14452 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RESET; lex->type=0; + } +#line 47488 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2346: /* reset: RESET_SYM $@208 reset_options */ +#line 14457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47494 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2349: /* $@209: %empty */ +#line 14466 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLAVE; } +#line 47500 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2350: /* reset_option: SLAVE $@209 optional_connection_name slave_reset_options optional_for_channel */ +#line 14469 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47506 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2351: /* $@210: %empty */ +#line 14471 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_MASTER; + Lex->next_binlog_file_number= 0; + } +#line 47515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2353: /* reset_option: QUERY_SYM CACHE_SYM */ +#line 14476 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE;} +#line 47521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2354: /* slave_reset_options: %empty */ +#line 14480 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= false; } +#line 47527 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2355: /* slave_reset_options: ALL */ +#line 14481 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= true; } +#line 47533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2356: /* master_reset_options: %empty */ +#line 14485 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47539 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2357: /* master_reset_options: TO_SYM ulong_num */ +#line 14487 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->next_binlog_file_number = (yyvsp[0].ulong_num); + } +#line 47547 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2358: /* purge: PURGE master_or_binary LOGS_SYM TO_SYM TEXT_STRING_sys */ +#line 14494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_purge_to((yyvsp[0].lex_str)); + } +#line 47555 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2359: /* $@211: %empty */ +#line 14498 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PURGE..BEFORE"; } +#line 47561 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2360: /* purge: PURGE master_or_binary LOGS_SYM BEFORE_SYM $@211 expr */ +#line 14500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_purge_before((yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 47571 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2361: /* $@212: %empty */ +#line 14512 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->value_list.empty(); + lex->users_list.empty(); + lex->sql_command= SQLCOM_KILL; + lex->kill_type= KILL_TYPE_ID; + } +#line 47583 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2362: /* kill: KILL_SYM $@212 kill_type kill_option */ +#line 14520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->kill_signal= (killed_state) ((yyvsp[-1].num) | (yyvsp[0].num)); + } +#line 47591 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2363: /* kill_type: %empty */ +#line 14526 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 47597 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2364: /* kill_type: HARD_SYM */ +#line 14527 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 47603 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2365: /* kill_type: SOFT_SYM */ +#line 14528 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 47609 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2366: /* kill_option: opt_connection kill_expr */ +#line 14532 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_CONNECTION; } +#line 47615 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2367: /* kill_option: QUERY_SYM kill_expr */ +#line 14533 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_QUERY; } +#line 47621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2368: /* kill_option: QUERY_SYM ID_SYM expr */ +#line 14535 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (int) KILL_QUERY; + Lex->kill_type= KILL_TYPE_QUERY; + Lex->value_list.push_front((yyvsp[0].item), thd->mem_root); + } +#line 47631 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2369: /* opt_connection: %empty */ +#line 14543 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47637 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2370: /* opt_connection: CONNECTION_SYM */ +#line 14544 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47643 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2371: /* kill_expr: expr */ +#line 14549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_front((yyval.item), thd->mem_root); + } +#line 47651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2372: /* kill_expr: USER_SYM user */ +#line 14553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root); + Lex->kill_type= KILL_TYPE_USER; + } +#line 47660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2373: /* $@213: %empty */ +#line 14560 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHUTDOWN; } +#line 47666 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2374: /* shutdown: SHUTDOWN $@213 shutdown_option */ +#line 14561 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47672 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2375: /* shutdown_option: %empty */ +#line 14565 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->is_shutdown_wait_for_slaves= false; } +#line 47678 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2376: /* shutdown_option: WAIT_SYM FOR_SYM ALL SLAVES */ +#line 14567 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->is_shutdown_wait_for_slaves= true; + } +#line 47686 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2377: /* use: USE_SYM ident */ +#line 14576 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_CHANGE_DB; + lex->first_select_lex()->db= (yyvsp[0].ident_sys); + } +#line 47696 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2378: /* $@214: %empty */ +#line 14587 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->sphead)) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), + (yyvsp[0].filetype) == FILETYPE_CSV ? "LOAD DATA" : "LOAD XML"); + MYSQL_YYABORT; + } + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + } +#line 47714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2379: /* $@215: %empty */ +#line 14601 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_LOAD; + lex->local_file= (yyvsp[-2].num); + lex->duplicates= DUP_ERROR; + lex->ignore= 0; + if (unlikely(!(lex->exchange= new (thd->mem_root) + sql_exchange((yyvsp[0].lex_str).str, 0, (yyvsp[-5].filetype))))) + MYSQL_YYABORT; + } +#line 47729 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2380: /* $@216: %empty */ +#line 14612 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + (yyvsp[-9].lock_type), MDL_SHARED_WRITE, + NULL, (yyvsp[0].string_list)))) + MYSQL_YYABORT; + lex->field_list.empty(); + lex->update_list.empty(); + lex->value_list.empty(); + lex->many_values.empty(); + } +#line 47746 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2381: /* $@217: %empty */ +#line 14625 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 47752 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2382: /* load: LOAD data_or_xml $@214 load_data_lock opt_local INFILE TEXT_STRING_filesystem $@215 opt_duplicate INTO TABLE_SYM table_ident opt_use_partition $@216 opt_load_data_charset $@217 opt_xml_rows_identified_by opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec opt_load_data_set_spec stmt_end */ +#line 14630 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + } +#line 47760 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2383: /* data_or_xml: DATA_SYM */ +#line 14636 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_CSV; } +#line 47766 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2384: /* data_or_xml: XML_SYM */ +#line 14637 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_XML; } +#line 47772 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2385: /* opt_local: %empty */ +#line 14641 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0;} +#line 47778 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2386: /* opt_local: LOCAL_SYM */ +#line 14642 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1;} +#line 47784 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2387: /* load_data_lock: %empty */ +#line 14646 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 47790 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2388: /* load_data_lock: CONCURRENT */ +#line 14648 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Ignore this option in SP to avoid problem with query cache and + triggers with non default priority locks + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 47802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2389: /* load_data_lock: LOW_PRIORITY */ +#line 14655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 47808 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2390: /* opt_duplicate: %empty */ +#line 14659 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_ERROR; } +#line 47814 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2391: /* opt_duplicate: REPLACE */ +#line 14660 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_REPLACE; } +#line 47820 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2392: /* opt_duplicate: IGNORE_SYM */ +#line 14661 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 47826 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2397: /* field_term: TERMINATED BY text_string */ +#line 14676 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->field_term= (yyvsp[0].string); + } +#line 47835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2398: /* field_term: OPTIONALLY ENCLOSED BY text_string */ +#line 14681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + DBUG_ASSERT(lex->exchange != 0); + lex->exchange->enclosed= (yyvsp[0].string); + lex->exchange->opt_enclosed= 1; + } +#line 47846 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2399: /* field_term: ENCLOSED BY text_string */ +#line 14688 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->enclosed= (yyvsp[0].string); + } +#line 47855 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2400: /* field_term: ESCAPED BY text_string */ +#line 14693 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->escaped= (yyvsp[0].string); + } +#line 47864 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2405: /* line_term: TERMINATED BY text_string */ +#line 14711 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_term= (yyvsp[0].string); + } +#line 47873 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2406: /* line_term: STARTING BY text_string */ +#line 14716 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_start= (yyvsp[0].string); + } +#line 47882 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2407: /* opt_xml_rows_identified_by: %empty */ +#line 14723 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47888 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2408: /* opt_xml_rows_identified_by: ROWS_SYM IDENTIFIED_SYM BY text_string */ +#line 14725 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->line_term = (yyvsp[0].string); } +#line 47894 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2410: /* opt_ignore_lines: IGNORE_SYM NUM lines_or_rows */ +#line 14731 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->skip_lines= atol((yyvsp[-1].lex_str).str); + } +#line 47903 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2411: /* lines_or_rows: LINES */ +#line 14738 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47909 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2412: /* lines_or_rows: ROWS_SYM */ +#line 14739 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47915 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2413: /* opt_field_or_var_spec: %empty */ +#line 14743 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47921 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2414: /* opt_field_or_var_spec: '(' fields_or_vars ')' */ +#line 14744 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47927 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2415: /* opt_field_or_var_spec: '(' ')' */ +#line 14745 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2416: /* fields_or_vars: fields_or_vars ',' field_or_var */ +#line 14750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47939 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2417: /* fields_or_vars: field_or_var */ +#line 14752 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47945 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2418: /* field_or_var: simple_ident_nospvar */ +#line 14756 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.item)= (yyvsp[0].item);} +#line 47951 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2419: /* field_or_var: '@' ident_or_text */ +#line 14758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.item)= new (thd->mem_root) Item_user_var_as_out_param(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47967 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2420: /* opt_load_data_set_spec: %empty */ +#line 14772 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2421: /* opt_load_data_set_spec: SET load_data_set_list */ +#line 14773 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47979 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2424: /* load_data_set_elem: simple_ident_nospvar equal remember_name expr_or_ignore_or_default remember_end */ +#line 14783 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-4].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + (yyvsp[-1].item)->set_name_no_truncate(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 47991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2425: /* text_literal: TEXT_STRING */ +#line 14796 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 48000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2426: /* text_literal: NCHAR_STRING */ +#line 14801 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_nchar((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 48009 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2427: /* text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 14806 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_charset((yyvsp[0].lex_string_with_metadata), (yyvsp[-1].charset))))) + MYSQL_YYABORT; + } +#line 48018 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2428: /* text_literal: text_literal TEXT_STRING_literal */ +#line 14811 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= (yyvsp[-1].item_basic_constant)->make_string_literal_concat(thd, &(yyvsp[0].lex_str))))) + MYSQL_YYABORT; + } +#line 48027 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2429: /* text_string: TEXT_STRING_literal */ +#line 14819 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + thd->variables.collation_connection); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 48039 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2430: /* text_string: hex_or_bin_String */ +#line 14826 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string)= (yyvsp[0].string); } +#line 48045 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2431: /* hex_or_bin_String: HEX_NUM */ +#line 14832 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 48057 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2432: /* hex_or_bin_String: HEX_STRING */ +#line 14840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 48069 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2433: /* hex_or_bin_String: BIN_NUM */ +#line 14848 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + /* + it is OK only emulate fix_fields, because we need only + value of constant + */ + (yyval.string)= tmp->val_str((String*) 0); + } +#line 48085 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2434: /* param_marker: PARAM_MARKER */ +#line 14863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, ¶m_clex_str, + YYLIP->get_tok_start(), + YYLIP->get_tok_start() + 1)))) + MYSQL_YYABORT; + } +#line 48096 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2435: /* param_marker: COLON_ORACLE_SYM ident_cli */ +#line 14870 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), (yyvsp[0].ident_cli).end())))) + MYSQL_YYABORT; + } +#line 48106 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2436: /* param_marker: COLON_ORACLE_SYM NUM */ +#line 14876 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), + YYLIP->get_ptr())))) + MYSQL_YYABORT; + } +#line 48117 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2437: /* signed_literal: '+' NUM_literal */ +#line 14885 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 48123 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2438: /* signed_literal: '-' NUM_literal */ +#line 14887 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_num)->max_length++; + (yyval.item)= (yyvsp[0].item_num)->neg(thd); + } +#line 48132 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2439: /* literal: text_literal */ +#line 14894 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_basic_constant); } +#line 48138 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2440: /* literal: NUM_literal */ +#line 14895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 48144 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2441: /* literal: temporal_literal */ +#line 14896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 48150 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2442: /* literal: NULL_SYM */ +#line 14898 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + For the digest computation, in this context only, + NULL is considered a literal, hence reduced to '?' + REDUCE: + TOK_GENERIC_VALUE := NULL_SYM + */ + YYLIP->reduce_digest_token(TOK_GENERIC_VALUE, NULL_SYM); + (yyval.item)= new (thd->mem_root) Item_null(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT; + } +#line 48168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2443: /* literal: FALSE_SYM */ +#line 14912 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "FALSE",0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48178 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2444: /* literal: TRUE_SYM */ +#line 14918 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "TRUE",1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48188 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2445: /* literal: HEX_NUM */ +#line 14924 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48198 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2446: /* literal: HEX_STRING */ +#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48208 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2447: /* literal: BIN_NUM */ +#line 14936 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48218 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2448: /* literal: UNDERSCORE_CHARSET hex_or_bin_String */ +#line 14942 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_string_with_introducer *item_str; + LEX_CSTRING tmp; + (yyvsp[0].string)->get_value(&tmp); + /* + Pass NULL as name. Name will be set in the "select_item" rule and + will include the introducer and the original hex/bin notation. + */ + item_str= new (thd->mem_root) + Item_string_with_introducer(thd, null_clex_str, + tmp, (yyvsp[-1].charset)); + if (unlikely(!item_str || + !item_str->check_well_formed_result(true))) + MYSQL_YYABORT; + + (yyval.item)= item_str; + } +#line 48240 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2449: /* NUM_literal: NUM */ +#line 14963 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 48254 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2450: /* NUM_literal: LONG_NUM */ +#line 14973 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 48268 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2451: /* NUM_literal: ULONGLONG_NUM */ +#line 14983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 48278 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2452: /* NUM_literal: DECIMAL_NUM */ +#line 14989 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_decimal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, + thd->charset()); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 48289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2453: /* NUM_literal: FLOAT_NUM */ +#line 14996 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_float(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 48299 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2454: /* temporal_literal: DATE_SYM TEXT_STRING */ +#line 15006 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_newdate.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 48310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2455: /* temporal_literal: TIME_SYM TEXT_STRING */ +#line 15013 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_time2.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 48321 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2456: /* temporal_literal: TIMESTAMP TEXT_STRING */ +#line 15020 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 48332 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2457: /* $@218: %empty */ +#line 15030 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + With_clause *with_clause= + new With_clause((yyvsp[0].num), Lex->curr_with_clause); + if (unlikely(with_clause == NULL)) + MYSQL_YYABORT; + lex->derived_tables|= DERIVED_WITH; + lex->with_cte_resolution= true; + lex->curr_with_clause= with_clause; + with_clause->add_to_list(&lex->with_clauses_list, + lex->with_clauses_list_last_next); + if (lex->current_select && + lex->current_select->parsing_place == BEFORE_OPT_LIST) + lex->current_select->parsing_place= NO_MATTER; + } +#line 48352 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2458: /* with_clause: WITH opt_recursive $@218 with_list */ +#line 15046 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.with_clause)= Lex->curr_with_clause; + Lex->curr_with_clause= Lex->curr_with_clause->pop(); + } +#line 48361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2459: /* opt_recursive: %empty */ +#line 15054 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 48367 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2460: /* opt_recursive: RECURSIVE_SYM */ +#line 15055 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 48373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2463: /* with_list_element: with_element_head opt_with_column_list AS '(' query_expression ')' opt_cycle */ +#line 15069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + const char *query_start= lex->sphead ? lex->sphead->m_tmp_query + : thd->query(); + const char *spec_start= (yyvsp[-3].kwd).pos() + 1; + With_element *elem= new With_element((yyvsp[-6].with_element_head), *(yyvsp[-5].ident_sys_list), (yyvsp[-2].select_lex_unit)); + if (elem == NULL || Lex->curr_with_clause->add_with_element(elem)) + MYSQL_YYABORT; + if (elem->set_unparsed_spec(thd, spec_start, (yyvsp[-1].kwd).pos(), + spec_start - query_start)) + MYSQL_YYABORT; + if ((yyvsp[0].ident_sys_list)) + { + elem->set_cycle_list((yyvsp[0].ident_sys_list)); + } + elem->set_tables_end_pos(lex->query_tables_last); + } +#line 48395 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2464: /* opt_cycle: %empty */ +#line 15090 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= NULL; } +#line 48401 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2465: /* $@219: %empty */ +#line 15093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->curr_with_clause->with_recursive) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].kwd).pos()); + } + } +#line 48412 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2466: /* opt_cycle: CYCLE_SYM $@219 comma_separated_ident_list RESTRICT */ +#line 15100 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); + } +#line 48420 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2467: /* opt_with_column_list: %empty */ +#line 15108 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= new (thd->mem_root) List) == NULL) + MYSQL_YYABORT; + } +#line 48429 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2468: /* opt_with_column_list: '(' with_column_list ')' */ +#line 15113 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); } +#line 48435 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2470: /* ident_sys_alloc: ident_cli */ +#line 15122 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_ptr)= new (thd->mem_root) Lex_ident_sys(thd, &(yyvsp[0].ident_cli)); + } +#line 48443 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2471: /* comma_separated_ident_list: ident_sys_alloc */ +#line 15129 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= new (thd->mem_root) List; + if (unlikely((yyval.ident_sys_list) == NULL || (yyval.ident_sys_list)->push_back((yyvsp[0].ident_sys_ptr)))) + MYSQL_YYABORT; + } +#line 48453 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2472: /* comma_separated_ident_list: comma_separated_ident_list ',' ident_sys_alloc */ +#line 15135 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= (yyvsp[-2].ident_sys_list))->push_back((yyvsp[0].ident_sys_ptr))) + MYSQL_YYABORT; + } +#line 48462 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2473: /* with_element_head: ident */ +#line 15144 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING *name= + (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + (yyval.with_element_head)= new (thd->mem_root) With_element_head(name); + if (unlikely(name == NULL || (yyval.with_element_head) == NULL)) + MYSQL_YYABORT; + (yyval.with_element_head)->tables_pos.set_start_pos(Lex->query_tables_last); + } +#line 48475 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2474: /* insert_ident: simple_ident_nospvar */ +#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2475: /* insert_ident: table_wild */ +#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2476: /* table_wild: ident '.' '*' */ +#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 48496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2477: /* table_wild: ident '.' ident '.' '*' */ +#line 15172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 48505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2478: /* select_sublist_qualified_asterisk: ident_cli '.' '*' */ +#line 15180 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 48514 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2479: /* select_sublist_qualified_asterisk: ident_cli '.' ident_cli '.' '*' */ +#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 48523 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2480: /* order_ident: expr */ +#line 15192 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48529 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2481: /* simple_ident: ident_cli */ +#line 15198 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48538 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2482: /* simple_ident: ident_cli '.' ident_cli */ +#line 15203 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48547 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2483: /* simple_ident: '.' ident_cli '.' ident_cli */ +#line 15208 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_cli empty((yyvsp[-2].ident_cli).pos(), 0); + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &empty, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48557 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2484: /* simple_ident: ident_cli '.' ident_cli '.' ident_cli */ +#line 15214 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48566 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2485: /* simple_ident: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15219 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48575 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2486: /* simple_ident_nospvar: ident */ +#line 15227 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nosp(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48584 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2487: /* simple_ident_nospvar: ident '.' ident */ +#line 15232 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nospvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48593 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2488: /* simple_ident_nospvar: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15237 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 48602 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2489: /* simple_ident_nospvar: '.' ident '.' ident */ +#line 15242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys none; + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &none, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2490: /* simple_ident_nospvar: ident '.' ident '.' ident */ +#line 15248 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 48621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2491: /* field_ident: ident */ +#line 15255 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48627 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2492: /* field_ident: ident '.' ident '.' ident */ +#line 15257 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-4].ident_sys).str, + table->db.str))) + my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), (yyvsp[-4].ident_sys).str)); + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->table_name.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 48642 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2493: /* field_ident: ident '.' ident */ +#line 15268 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->alias.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 48654 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2494: /* field_ident: '.' ident */ +#line 15275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48660 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2495: /* table_ident: ident */ +#line 15280 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2496: /* table_ident: ident '.' ident */ +#line 15286 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48680 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2497: /* table_ident: '.' ident */ +#line 15292 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* For Delphi */ + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48691 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2498: /* table_ident_opt_wild: ident opt_wild */ +#line 15302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48701 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2499: /* table_ident_opt_wild: ident '.' ident opt_wild */ +#line 15308 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48711 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2500: /* table_ident_nodb: ident */ +#line 15317 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db= any_db; + (yyval.table)= new (thd->mem_root) Table_ident(thd, &db, &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48722 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2505: /* ident_cli: keyword_ident */ +#line 15333 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48728 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2506: /* IDENT_sys: IDENT_cli */ +#line 15338 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48737 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2509: /* ident_cli_func: keyword_func_sp_var_and_label */ +#line 15347 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48743 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2510: /* ident_cli_func: keyword_func_sp_var_not_label */ +#line 15348 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48749 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2511: /* ident_func: ident_cli_func */ +#line 15353 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2512: /* TEXT_STRING_sys: TEXT_STRING */ +#line 15362 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_sys(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48767 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2513: /* TEXT_STRING_literal: TEXT_STRING */ +#line 15370 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_connection(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48776 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2514: /* TEXT_STRING_filesystem: TEXT_STRING */ +#line 15378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_filesystem(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48785 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2516: /* ident_table_alias: keyword_table_alias */ +#line 15387 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48794 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2517: /* ident_cli_set_usual_case: IDENT_cli */ +#line 15394 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].ident_cli); } +#line 48800 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2518: /* ident_cli_set_usual_case: keyword_set_usual_case */ +#line 15395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48806 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2520: /* ident_sysvar_name: keyword_sysvar_name */ +#line 15401 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2521: /* ident_sysvar_name: TEXT_STRING_sys */ +#line 15406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_sys(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 48824 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2523: /* ident: keyword_ident */ +#line 15416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48833 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2525: /* label_ident: keyword_label */ +#line 15425 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48842 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2526: /* ident_or_text: ident */ +#line 15432 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48848 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2527: /* ident_or_text: TEXT_STRING_sys */ +#line 15433 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48854 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2528: /* ident_or_text: LEX_HOSTNAME */ +#line 15434 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48860 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2529: /* user_maybe_role: ident_or_text */ +#line 15439 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0))) + MYSQL_YYABORT; + } +#line 48875 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2530: /* user_maybe_role: ident_or_text '@' ident_or_text */ +#line 15450 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[-2].lex_str); (yyval.lex_user)->host=(yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0)) || + unlikely(check_host_name(&(yyval.lex_user)->host))) + MYSQL_YYABORT; + if ((yyval.lex_user)->host.str[0]) + { + /* + Convert hostname part of username to lowercase. + It's OK to use in-place lowercase as long as + the character set is utf8. + */ + my_casedn_str(system_charset_info, (char*) (yyval.lex_user)->host.str); + } + else + { + /* + fix historical undocumented convention that empty host is the + same as '%' + */ + (yyval.lex_user)->host= host_not_specified; + } + } +#line 48908 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2531: /* user_maybe_role: CURRENT_USER optional_braces */ +#line 15479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_user; + (yyval.lex_user)->auth= new (thd->mem_root) USER_AUTH(); + } +#line 48919 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 2534: /* user: user_maybe_role */ +#line 15490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].lex_user)->user.str != current_user.str && (yyvsp[0].lex_user)->host.str == 0) + (yyvsp[0].lex_user)->host= host_not_specified; + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 48929 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3262: /* $@220: %empty */ +#line 16359 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + } +#line 48938 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3263: /* set: SET $@220 set_param */ +#line 16364 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48947 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3266: /* $@221: %empty */ +#line 16374 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= OPT_DEFAULT; + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48957 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3267: /* set_param: TRANSACTION_SYM $@221 transaction_characteristics */ +#line 16380 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48966 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3268: /* $@222: %empty */ +#line 16385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 48974 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3270: /* $@223: %empty */ +#line 16391 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->table_or_sp_used())) + my_yyabort_error((ER_SUBQUERIES_NOT_SUPPORTED, MYF(0), "SET STATEMENT")); + lex->stmt_var_list= lex->var_list; + lex->var_list.empty(); + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48988 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3276: /* $@224: %empty */ +#line 16418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48997 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3277: /* start_option_value_list_following_option_type: TRANSACTION_SYM $@224 transaction_characteristics */ +#line 16423 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49006 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3280: /* $@225: %empty */ +#line 16438 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 49014 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3283: /* option_type: GLOBAL_SYM */ +#line 16446 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 49020 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3284: /* option_type: LOCAL_SYM */ +#line 16447 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3285: /* option_type: SESSION_SYM */ +#line 16448 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49032 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3286: /* opt_var_type: %empty */ +#line 16452 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49038 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3287: /* opt_var_type: GLOBAL_SYM */ +#line 16453 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 49044 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3288: /* opt_var_type: LOCAL_SYM */ +#line 16454 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49050 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3289: /* opt_var_type: SESSION_SYM */ +#line 16455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49056 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3290: /* opt_var_ident_type: %empty */ +#line 16459 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_DEFAULT; } +#line 49062 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3291: /* opt_var_ident_type: GLOBAL_SYM '.' */ +#line 16460 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 49068 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3292: /* opt_var_ident_type: LOCAL_SYM '.' */ +#line 16461 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49074 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3293: /* opt_var_ident_type: SESSION_SYM '.' */ +#line 16462 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 49080 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3294: /* $@226: %empty */ +#line 16471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 49089 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3295: /* set_stmt_option: ident_cli equal $@226 set_expr_or_default */ +#line 16476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 49101 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3296: /* $@227: %empty */ +#line 16484 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 49110 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3297: /* set_stmt_option: ident_cli '.' ident equal $@227 set_expr_or_default */ +#line 16489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, + &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 49123 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3298: /* $@228: %empty */ +#line 16498 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 49132 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3299: /* set_stmt_option: DEFAULT '.' ident equal $@228 set_expr_or_default */ +#line 16503 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, + &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 49143 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3300: /* $@229: %empty */ +#line 16515 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49152 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3301: /* option_value_following_option_type: ident_cli equal $@229 set_expr_or_default */ +#line 16520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49164 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3302: /* $@230: %empty */ +#line 16528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49173 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3303: /* option_value_following_option_type: ident_cli '.' ident equal $@230 set_expr_or_default */ +#line 16533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49185 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3304: /* $@231: %empty */ +#line 16541 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 49194 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3305: /* option_value_following_option_type: DEFAULT '.' ident equal $@231 set_expr_or_default */ +#line 16546 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49204 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3306: /* $@232: %empty */ +#line 16556 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49213 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3307: /* option_value_no_option_type: ident_cli_set_usual_case equal $@232 set_expr_or_default */ +#line 16561 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49225 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3308: /* $@233: %empty */ +#line 16569 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 49234 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3309: /* option_value_no_option_type: ident_cli_set_usual_case '.' ident equal $@233 set_expr_or_default */ +#line 16574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49246 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3310: /* $@234: %empty */ +#line 16582 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 49255 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3311: /* option_value_no_option_type: DEFAULT '.' ident equal $@234 set_expr_or_default */ +#line 16587 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49266 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3312: /* $@235: %empty */ +#line 16594 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + if (sp_create_assignment_lex(thd, (yyvsp[-2].lex_str).str)) + MYSQL_YYABORT; + } +#line 49281 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3313: /* option_value_no_option_type: '@' ident_or_text equal $@235 expr */ +#line 16605 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_user_variable(thd, &(yyvsp[-3].lex_str), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49291 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3314: /* $@236: %empty */ +#line 16611 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].lex_str).str)) + MYSQL_YYABORT; + } +#line 49300 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3315: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name equal $@236 set_expr_or_default */ +#line 16616 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable((yyvsp[-4].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49310 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3316: /* $@237: %empty */ +#line 16622 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 49319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3317: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name '.' ident equal $@237 set_expr_or_default */ +#line 16627 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable(thd, (yyvsp[-6].var_type), &(yyvsp[-5].ident_sys), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49329 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3318: /* $@238: %empty */ +#line 16633 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 49338 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3319: /* option_value_no_option_type: '@' '@' opt_var_ident_type DEFAULT '.' ident equal $@238 set_expr_or_default */ +#line 16638 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable((yyvsp[-6].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49348 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3320: /* option_value_no_option_type: charset old_or_new_charset_name_or_default */ +#line 16644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex= thd->lex; + CHARSET_INFO *cs2; + cs2= (yyvsp[0].charset) ? (yyvsp[0].charset): global_system_variables.character_set_client; + set_var_collation_client *var; + var= (new (thd->mem_root) + set_var_collation_client(cs2, + thd->variables.collation_database, + cs2)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + lex->var_list.push_back(var, thd->mem_root); + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49370 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3321: /* option_value_no_option_type: NAMES_SYM equal expr */ +#line 16662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + LEX_CSTRING names= { STRING_WITH_LEN("names") }; + if (unlikely(spc && spc->find_variable(&names, false))) + my_error(ER_SP_BAD_VAR_SHADOW, MYF(0), names.str); + else + thd->parse_error(); + MYSQL_YYABORT; + } +#line 49385 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3322: /* option_value_no_option_type: NAMES_SYM charset_name_or_default */ +#line 16673 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_names((yyvsp[-1].kwd).pos(), (yyvsp[0].charset), + Lex_extended_collation_st::collate_default(), + yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 49396 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3323: /* option_value_no_option_type: NAMES_SYM charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 16681 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_names((yyvsp[-3].kwd).pos(), (yyvsp[-2].charset), (yyvsp[0].Lex_extended_collation), yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 49405 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3324: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role */ +#line 16686 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-2].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + LEX_USER *user; + if (unlikely(!(user=(LEX_USER *) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + user->user= current_user; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role(user, + (yyvsp[0].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49431 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3325: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role FOR_SYM user */ +#line 16708 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role((yyvsp[0].lex_user), (yyvsp[-2].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3326: /* option_value_no_option_type: ROLE_SYM role_name */ +#line 16724 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_role *var= new (thd->mem_root) set_var_role((yyvsp[0].lex_user)->user); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root)) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49466 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3327: /* $@239: %empty */ +#line 16735 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 49475 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3328: /* option_value_no_option_type: ROLE_SYM equal $@239 set_expr_or_default */ +#line 16740 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].kwd)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3329: /* $@240: %empty */ +#line 16748 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 49496 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3330: /* option_value_no_option_type: PASSWORD_SYM equal $@240 text_or_password */ +#line 16753 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49506 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3331: /* $@241: %empty */ +#line 16759 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 49515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3332: /* option_value_no_option_type: PASSWORD_SYM FOR_SYM $@241 user equal text_or_password */ +#line 16764 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[-2].lex_user), (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 49525 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3337: /* transaction_access_mode: transaction_access_mode_types */ +#line 16780 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_read_only"), + &null_clex_str, + item)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + if (unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 49545 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3338: /* isolation_level: ISOLATION LEVEL_SYM isolation_types */ +#line 16799 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].tx_isolation)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_isolation"), + &null_clex_str, + item)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 49564 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3339: /* transaction_access_mode_types: READ_SYM ONLY_SYM */ +#line 16816 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 49570 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3340: /* transaction_access_mode_types: READ_SYM WRITE_SYM */ +#line 16817 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 49576 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3341: /* isolation_types: READ_SYM UNCOMMITTED_SYM */ +#line 16821 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_UNCOMMITTED; } +#line 49582 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3342: /* isolation_types: READ_SYM COMMITTED_SYM */ +#line 16822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_COMMITTED; } +#line 49588 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3343: /* isolation_types: REPEATABLE_SYM READ_SYM */ +#line 16823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_REPEATABLE_READ; } +#line 49594 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3344: /* isolation_types: SERIALIZABLE_SYM */ +#line 16824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_SERIALIZABLE; } +#line 49600 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3345: /* text_or_password: TEXT_STRING */ +#line 16830 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 49609 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3346: /* text_or_password: PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16835 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 49618 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3347: /* text_or_password: OLD_PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16840 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + (yyval.user_auth)->auth_str.str= Item_func_password::alloc(thd, + (yyvsp[-1].lex_string_with_metadata).str, (yyvsp[-1].lex_string_with_metadata).length, Item_func_password::OLD); + (yyval.user_auth)->auth_str.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; + } +#line 49630 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3348: /* set_expr_or_default: expr */ +#line 16850 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 49636 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3349: /* set_expr_or_default: DEFAULT */ +#line 16851 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=0; } +#line 49642 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3350: /* set_expr_or_default: ON */ +#line 16853 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ON", 2); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 49652 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3351: /* set_expr_or_default: ALL */ +#line 16859 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ALL", 3); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 49662 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3352: /* set_expr_or_default: BINARY */ +#line 16865 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "binary", 6); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 49672 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3353: /* $@242: %empty */ +#line 16876 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "LOCK")); + lex->sql_command= SQLCOM_LOCK_TABLES; + } +#line 49684 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3354: /* lock: LOCK_SYM table_or_tables $@242 table_lock_list opt_lock_wait_timeout */ +#line 16884 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49690 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3355: /* opt_lock_wait_timeout: %empty */ +#line 16889 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49696 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3356: /* opt_lock_wait_timeout: WAIT_SYM ulong_num */ +#line 16891 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), (yyvsp[0].ulong_num))) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), (yyvsp[0].ulong_num)))) + MYSQL_YYABORT; + } +#line 49706 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3357: /* opt_lock_wait_timeout: NOWAIT_SYM */ +#line 16897 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), 0)) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), 0))) + MYSQL_YYABORT; + } +#line 49716 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3358: /* table_or_tables: TABLE_SYM */ +#line 16905 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49722 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3359: /* table_or_tables: TABLES */ +#line 16906 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49728 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3362: /* table_lock: table_ident opt_table_alias_clause lock_option */ +#line 16916 "/home/buildbot/git/sql/sql_yacc.yy" + { + thr_lock_type lock_type= (thr_lock_type) (yyvsp[0].num); + bool lock_for_write= (lock_type >= TL_FIRST_WRITE); + ulong table_options= lock_for_write ? TL_OPTION_UPDATING : 0; + enum_mdl_type mdl_type= !lock_for_write + ? MDL_SHARED_READ + : lock_type == TL_WRITE_CONCURRENT_INSERT + ? MDL_SHARED_WRITE + : MDL_SHARED_NO_READ_WRITE; + + if (unlikely(!Lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[-1].lex_str_ptr), table_options, + lock_type, mdl_type))) + MYSQL_YYABORT; + } +#line 49748 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3363: /* lock_option: READ_SYM */ +#line 16934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ_NO_INSERT; } +#line 49754 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3364: /* lock_option: WRITE_SYM */ +#line 16935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_DEFAULT; } +#line 49760 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3365: /* lock_option: WRITE_SYM CONCURRENT */ +#line 16937 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 49768 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3366: /* lock_option: LOW_PRIORITY WRITE_SYM */ +#line 16941 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_LOW_PRIORITY; } +#line 49774 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3367: /* lock_option: READ_SYM LOCAL_SYM */ +#line 16942 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ; } +#line 49780 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3368: /* $@243: %empty */ +#line 16947 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "UNLOCK")); + lex->sql_command= SQLCOM_UNLOCK_TABLES; + } +#line 49792 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3369: /* unlock: UNLOCK_SYM $@243 table_or_tables */ +#line 16955 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49798 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3370: /* $@244: %empty */ +#line 16964 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 49807 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3371: /* handler: HANDLER_SYM $@244 handler_tail */ +#line 16969 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 49815 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3372: /* handler_tail: table_ident OPEN_SYM opt_table_alias_clause */ +#line 16976 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_OPEN; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[0].lex_str_ptr), 0)) + MYSQL_YYABORT; + } +#line 49828 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3373: /* handler_tail: table_ident_nodb CLOSE_SYM */ +#line 16985 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_CLOSE; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49841 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3374: /* $@245: %empty */ +#line 16994 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->clause_that_disallows_subselect= "HANDLER..READ"; + lex->sql_command = SQLCOM_HA_READ; + lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49863 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3375: /* handler_tail: table_ident_nodb READ_SYM $@245 handler_read_or_scan opt_where_clause opt_global_limit_clause */ +#line 17012 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + lex->clause_that_disallows_subselect= NULL; + if (!lex->current_select->limit_params.explicit_limit) + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (one == NULL) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + } + /* Stored functions are not supported for HANDLER READ. */ + if (lex->uses_stored_routines()) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "stored functions in HANDLER ... READ"); + MYSQL_YYABORT; + } + } +#line 49889 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3376: /* handler_read_or_scan: handler_scan_function */ +#line 17036 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= null_clex_str; } +#line 49895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3377: /* handler_read_or_scan: ident handler_rkey_function */ +#line 17037 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= (yyvsp[-1].ident_sys); } +#line 49901 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3378: /* handler_scan_function: FIRST_SYM */ +#line 17041 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49907 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3379: /* handler_scan_function: NEXT_SYM */ +#line 17042 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49913 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3380: /* handler_rkey_function: FIRST_SYM */ +#line 17046 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49919 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3381: /* handler_rkey_function: NEXT_SYM */ +#line 17047 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49925 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3382: /* handler_rkey_function: PREV_SYM */ +#line 17048 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RPREV; } +#line 49931 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3383: /* handler_rkey_function: LAST_SYM */ +#line 17049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RLAST; } +#line 49937 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3384: /* $@246: %empty */ +#line 17051 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->ha_read_mode = RKEY; + lex->ha_rkey_mode=(yyvsp[0].ha_rkey_mode); + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 49949 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3385: /* handler_rkey_function: handler_rkey_mode $@246 '(' values ')' */ +#line 17059 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49955 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3386: /* handler_rkey_mode: '=' */ +#line 17063 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_EXACT; } +#line 49961 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3387: /* handler_rkey_mode: GE */ +#line 17064 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_NEXT; } +#line 49967 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3388: /* handler_rkey_mode: LE */ +#line 17065 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_PREV; } +#line 49973 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3389: /* handler_rkey_mode: '>' */ +#line 17066 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_AFTER_KEY; } +#line 49979 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3390: /* handler_rkey_mode: '<' */ +#line 17067 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_BEFORE_KEY; } +#line 49985 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3391: /* revoke: REVOKE clear_privileges revoke_command */ +#line 17074 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49991 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3392: /* revoke_command: grant_privileges ON opt_table grant_ident FROM user_and_role_list */ +#line 17079 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_table(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident))) + MYSQL_YYABORT; + } +#line 50000 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3393: /* revoke_command: grant_privileges ON sp_handler grant_ident FROM user_and_role_list */ +#line 17084 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_sp(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident), *(yyvsp[-3].sp_handler))) + MYSQL_YYABORT; + } +#line 50009 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3394: /* revoke_command: ALL opt_privileges ',' GRANT OPTION FROM user_and_role_list */ +#line 17089 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REVOKE_ALL; + } +#line 50017 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3395: /* revoke_command: PROXY_SYM ON user FROM user_list */ +#line 17093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_proxy(thd, (yyvsp[-2].lex_user))) + MYSQL_YYABORT; + } +#line 50026 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3396: /* revoke_command: admin_option_for_role FROM user_and_role_list */ +#line 17098 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_REVOKE_ROLE; + if (unlikely(Lex->users_list.push_front((yyvsp[-2].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50036 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3397: /* admin_option_for_role: ADMIN_SYM OPTION FOR_SYM grant_role */ +#line 17107 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 50042 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3398: /* admin_option_for_role: grant_role */ +#line 17109 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 50048 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3399: /* grant: GRANT clear_privileges grant_command */ +#line 17114 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50054 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3400: /* grant_command: grant_privileges ON opt_table grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17120 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_table(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 50063 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3401: /* grant_command: grant_privileges ON sp_handler grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17126 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_sp(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), *(yyvsp[-5].sp_handler), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 50072 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3402: /* grant_command: PROXY_SYM ON user TO_SYM grant_list opt_grant_option */ +#line 17131 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_proxy(thd, (yyvsp[-3].lex_user), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 50081 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3403: /* grant_command: grant_role TO_SYM grant_list opt_with_admin_option */ +#line 17136 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_GRANT_ROLE; + /* The first role is the one that is granted */ + if (unlikely(Lex->users_list.push_front((yyvsp[-3].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3404: /* opt_with_admin: %empty */ +#line 17147 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = 0; } +#line 50099 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3405: /* opt_with_admin: WITH ADMIN_SYM user_or_role */ +#line 17148 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = (yyvsp[0].lex_user); } +#line 50105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3406: /* opt_with_admin_option: %empty */ +#line 17152 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; } +#line 50111 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3407: /* opt_with_admin_option: WITH ADMIN_SYM OPTION */ +#line 17153 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; } +#line 50117 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3408: /* role_list: grant_role */ +#line 17158 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50126 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3409: /* role_list: role_list ',' grant_role */ +#line 17163 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50135 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3410: /* current_role: CURRENT_ROLE optional_braces */ +#line 17171 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_role; + } +#line 50145 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3411: /* role_name: ident_or_text */ +#line 17180 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *cs= system_charset_info; + /* trim end spaces (as they'll be lost in mysql.user anyway) */ + (yyvsp[0].lex_str).length= cs->lengthsp((yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + ((char*) (yyvsp[0].lex_str).str)[(yyvsp[0].lex_str).length] = '\0'; + if (unlikely((yyvsp[0].lex_str).length == 0)) + my_yyabort_error((ER_INVALID_ROLE, MYF(0), "")); + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + if (lex_string_eq(&(yyvsp[0].lex_str), &none)) + (yyval.lex_user)->user= none; + else if (lex_string_eq(&(yyvsp[0].lex_str), &public_name)) + (yyval.lex_user)->user= public_name; + else if (check_string_char_length(&((yyval.lex_user)->user= (yyvsp[0].lex_str)), ER_USERNAME, + username_char_length, cs, 0)) + MYSQL_YYABORT; + (yyval.lex_user)->host= empty_clex_str; + } +#line 50168 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3417: /* grant_privileges: ALL opt_privileges */ +#line 17210 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege(GLOBAL_ACLS, true))) + MYSQL_YYABORT; + } +#line 50177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3420: /* object_privilege_list: object_privilege */ +#line 17223 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege((yyvsp[0].privilege)))) + MYSQL_YYABORT; + } +#line 50186 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3421: /* object_privilege_list: column_list_privilege */ +#line 17228 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege()) || + (yyval.lex_grant)->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 50197 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3422: /* object_privilege_list: object_privilege_list ',' object_privilege */ +#line 17235 "/home/buildbot/git/sql/sql_yacc.yy" + { + ((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_object_privilege((yyvsp[0].privilege)); + } +#line 50205 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3423: /* object_privilege_list: object_privilege_list ',' column_list_privilege */ +#line 17239 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 50215 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3424: /* column_list_privilege: column_privilege '(' comma_separated_ident_list ')' */ +#line 17248 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.column_list_privilege)= Lex_column_list_privilege((yyvsp[-1].ident_sys_list), (yyvsp[-3].privilege)); + } +#line 50223 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3425: /* column_privilege: SELECT_SYM */ +#line 17254 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 50229 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3426: /* column_privilege: INSERT */ +#line 17255 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 50235 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3427: /* column_privilege: UPDATE_SYM */ +#line 17256 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 50241 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3428: /* column_privilege: REFERENCES */ +#line 17257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 50247 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3429: /* object_privilege: SELECT_SYM */ +#line 17261 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 50253 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3430: /* object_privilege: INSERT */ +#line 17262 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 50259 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3431: /* object_privilege: UPDATE_SYM */ +#line 17263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 50265 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3432: /* object_privilege: REFERENCES */ +#line 17264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 50271 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3433: /* object_privilege: DELETE_SYM */ +#line 17265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_ACL;} +#line 50277 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3434: /* object_privilege: USAGE */ +#line 17266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50283 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3435: /* object_privilege: INDEX_SYM */ +#line 17267 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INDEX_ACL;} +#line 50289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3436: /* object_privilege: ALTER */ +#line 17268 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_ACL;} +#line 50295 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3437: /* object_privilege: CREATE */ +#line 17269 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_ACL;} +#line 50301 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3438: /* object_privilege: DROP */ +#line 17270 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DROP_ACL;} +#line 50307 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3439: /* object_privilege: EXECUTE_SYM */ +#line 17271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EXECUTE_ACL;} +#line 50313 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3440: /* object_privilege: RELOAD */ +#line 17272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= RELOAD_ACL;} +#line 50319 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3441: /* object_privilege: SHUTDOWN */ +#line 17273 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHUTDOWN_ACL;} +#line 50325 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3442: /* object_privilege: PROCESS */ +#line 17274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= PROCESS_ACL;} +#line 50331 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3443: /* object_privilege: FILE_SYM */ +#line 17275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FILE_ACL;} +#line 50337 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3444: /* object_privilege: GRANT OPTION */ +#line 17276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 50343 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3445: /* object_privilege: SHOW DATABASES */ +#line 17277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_DB_ACL;} +#line 50349 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3446: /* object_privilege: SUPER_SYM */ +#line 17278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SUPER_ACL;} +#line 50355 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3447: /* object_privilege: CREATE TEMPORARY TABLES */ +#line 17279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TMP_ACL;} +#line 50361 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3448: /* object_privilege: LOCK_SYM TABLES */ +#line 17280 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= LOCK_TABLES_ACL; } +#line 50367 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3449: /* object_privilege: REPLICATION SLAVE */ +#line 17281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ACL; } +#line 50373 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3450: /* object_privilege: REPLICATION CLIENT_SYM */ +#line 17282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; /*Compatibility*/ } +#line 50379 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3451: /* object_privilege: CREATE VIEW_SYM */ +#line 17283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_VIEW_ACL; } +#line 50385 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3452: /* object_privilege: SHOW VIEW_SYM */ +#line 17284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_VIEW_ACL; } +#line 50391 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3453: /* object_privilege: CREATE ROUTINE_SYM */ +#line 17285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_PROC_ACL; } +#line 50397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3454: /* object_privilege: ALTER ROUTINE_SYM */ +#line 17286 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_PROC_ACL; } +#line 50403 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3455: /* object_privilege: CREATE USER_SYM */ +#line 17287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_USER_ACL; } +#line 50409 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3456: /* object_privilege: EVENT_SYM */ +#line 17288 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EVENT_ACL;} +#line 50415 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3457: /* object_privilege: TRIGGER_SYM */ +#line 17289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= TRIGGER_ACL; } +#line 50421 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3458: /* object_privilege: CREATE TABLESPACE */ +#line 17290 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TABLESPACE_ACL; } +#line 50427 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3459: /* object_privilege: DELETE_SYM HISTORY_SYM */ +#line 17291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_HISTORY_ACL; } +#line 50433 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3460: /* object_privilege: SET USER_SYM */ +#line 17292 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SET_USER_ACL; } +#line 50439 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3461: /* object_privilege: FEDERATED_SYM ADMIN_SYM */ +#line 17293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FEDERATED_ADMIN_ACL; } +#line 50445 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3462: /* object_privilege: CONNECTION_SYM ADMIN_SYM */ +#line 17294 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CONNECTION_ADMIN_ACL; } +#line 50451 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3463: /* object_privilege: READ_SYM ONLY_SYM ADMIN_SYM */ +#line 17295 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 50457 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3464: /* object_privilege: READ_ONLY_SYM ADMIN_SYM */ +#line 17296 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 50463 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3465: /* object_privilege: BINLOG_SYM MONITOR_SYM */ +#line 17297 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; } +#line 50469 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3466: /* object_privilege: BINLOG_SYM ADMIN_SYM */ +#line 17298 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_ADMIN_ACL; } +#line 50475 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3467: /* object_privilege: BINLOG_SYM REPLAY_SYM */ +#line 17299 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_REPLAY_ACL; } +#line 50481 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3468: /* object_privilege: REPLICATION MASTER_SYM ADMIN_SYM */ +#line 17300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_MASTER_ADMIN_ACL; } +#line 50487 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3469: /* object_privilege: REPLICATION SLAVE ADMIN_SYM */ +#line 17301 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ADMIN_ACL; } +#line 50493 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3470: /* object_privilege: SLAVE MONITOR_SYM */ +#line 17302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SLAVE_MONITOR_ACL; } +#line 50499 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3471: /* opt_and: %empty */ +#line 17306 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50505 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3472: /* opt_and: AND_SYM */ +#line 17307 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50511 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3475: /* require_list_element: SUBJECT_SYM TEXT_STRING */ +#line 17317 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_subject.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SUBJECT")); + lex->account_options.x509_subject= (yyvsp[0].lex_string_with_metadata); + } +#line 50522 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3476: /* require_list_element: ISSUER_SYM TEXT_STRING */ +#line 17324 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_issuer.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "ISSUER")); + lex->account_options.x509_issuer= (yyvsp[0].lex_string_with_metadata); + } +#line 50533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3477: /* require_list_element: CIPHER_SYM TEXT_STRING */ +#line 17331 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.ssl_cipher.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CIPHER")); + lex->account_options.ssl_cipher= (yyvsp[0].lex_string_with_metadata); + } +#line 50544 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3478: /* grant_ident: '*' */ +#line 17341 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db; + if (unlikely(Lex->copy_db_to(&db))) + MYSQL_YYABORT; + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name(db, + Lex_grant_object_name::STAR))) + MYSQL_YYABORT; + } +#line 50557 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3479: /* grant_ident: ident '.' '*' */ +#line 17350 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[-2].ident_sys), + Lex_grant_object_name::IDENT_STAR))) + MYSQL_YYABORT; + } +#line 50567 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3480: /* grant_ident: '*' '.' '*' */ +#line 17356 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name( + null_clex_str, + Lex_grant_object_name::STAR_STAR))) + MYSQL_YYABORT; + } +#line 50578 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3481: /* grant_ident: table_ident */ +#line 17363 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[0].table)))) + MYSQL_YYABORT; + } +#line 50587 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3482: /* user_list: user */ +#line 17371 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50596 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3483: /* user_list: user_list ',' user */ +#line 17376 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50605 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3484: /* grant_list: grant_user */ +#line 17384 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50614 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3485: /* grant_list: grant_list ',' grant_user */ +#line 17389 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50623 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3486: /* user_and_role_list: user_or_role */ +#line 17397 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50632 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3487: /* user_and_role_list: user_and_role_list ',' user_or_role */ +#line 17402 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 50641 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3492: /* grant_user: user IDENTIFIED_SYM BY TEXT_STRING */ +#line 17413 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-3].lex_user)->auth->pwtext= (yyvsp[0].lex_string_with_metadata); + } +#line 50651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3493: /* grant_user: user IDENTIFIED_SYM BY PASSWORD_SYM TEXT_STRING */ +#line 17419 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-4].lex_user); + (yyvsp[-4].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-4].lex_user)->auth->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 50661 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3494: /* grant_user: user IDENTIFIED_SYM via_or_with auth_expression */ +#line 17425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= (yyvsp[0].user_auth); + } +#line 50670 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3495: /* grant_user: user_or_role */ +#line 17430 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 50678 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3496: /* auth_expression: auth_token OR_SYM auth_expression */ +#line 17437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[-2].user_auth); + DBUG_ASSERT((yyval.user_auth)->next == NULL); + (yyval.user_auth)->next= (yyvsp[0].user_auth); + } +#line 50688 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3497: /* auth_expression: auth_token */ +#line 17443 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + } +#line 50696 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3498: /* auth_token: ident_or_text opt_auth_str */ +#line 17450 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + (yyval.user_auth)->plugin= (yyvsp[-1].lex_str); + } +#line 50705 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3499: /* opt_auth_str: %empty */ +#line 17458 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + } +#line 50714 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3500: /* opt_auth_str: using_or_as TEXT_STRING_sys */ +#line 17463 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->auth_str= (yyvsp[0].lex_str); + } +#line 50724 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3501: /* opt_auth_str: using_or_as PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 17469 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 50734 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3503: /* opt_require_clause: REQUIRE_SYM require_list */ +#line 17479 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_SPECIFIED; + } +#line 50742 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3504: /* opt_require_clause: REQUIRE_SYM SSL_SYM */ +#line 17483 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_ANY; + } +#line 50750 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3505: /* opt_require_clause: REQUIRE_SYM X509_SYM */ +#line 17487 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_X509; + } +#line 50758 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3506: /* opt_require_clause: REQUIRE_SYM NONE_SYM */ +#line 17491 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_NONE; + } +#line 50766 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3507: /* resource_option: MAX_QUERIES_PER_HOUR ulong_num */ +#line 17498 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.questions=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; + } +#line 50775 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3508: /* resource_option: MAX_UPDATES_PER_HOUR ulong_num */ +#line 17503 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.updates=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; + } +#line 50784 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3509: /* resource_option: MAX_CONNECTIONS_PER_HOUR ulong_num */ +#line 17508 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.conn_per_hour= (yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; + } +#line 50793 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3510: /* resource_option: MAX_USER_CONNECTIONS_SYM int_num */ +#line 17513 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.user_conn= (yyvsp[0].num); + Lex->account_options.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; + } +#line 50802 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3511: /* resource_option: MAX_STATEMENT_TIME_SYM NUM_literal */ +#line 17518 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.max_statement_time= (yyvsp[0].item_num)->val_real(); + Lex->account_options.specified_limits|= USER_RESOURCES::MAX_STATEMENT_TIME; + } +#line 50811 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3512: /* resource_option_list: resource_option_list resource_option */ +#line 17525 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50817 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3513: /* resource_option_list: resource_option */ +#line 17526 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50823 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3514: /* opt_resource_options: %empty */ +#line 17530 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50829 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3516: /* opt_grant_options: %empty */ +#line 17536 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50835 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3517: /* opt_grant_options: WITH grant_option_list */ +#line 17537 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[0].privilege); } +#line 50841 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3518: /* opt_grant_option: %empty */ +#line 17541 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50847 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3519: /* opt_grant_option: WITH GRANT OPTION */ +#line 17542 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL; } +#line 50853 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3520: /* grant_option_list: grant_option_list grant_option */ +#line 17546 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[-1].privilege) | (yyvsp[0].privilege); } +#line 50859 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3522: /* grant_option: GRANT OPTION */ +#line 17551 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 50865 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3523: /* grant_option: resource_option */ +#line 17552 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50871 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3524: /* $@247: %empty */ +#line 17557 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_BEGIN; + lex->start_transaction_opt= 0; + } +#line 50881 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3525: /* begin_stmt_mariadb: BEGIN_MARIADB_SYM $@247 opt_work */ +#line 17562 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50887 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3526: /* compound_statement: sp_proc_stmt_compound_ok */ +#line 17567 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_COMPOUND; + if (Lex->sp_body_finalize_procedure(thd)) + MYSQL_YYABORT; + } +#line 50897 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3527: /* opt_not: %empty */ +#line 17575 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 50903 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3528: /* opt_not: not */ +#line 17576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 50909 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3529: /* opt_work: %empty */ +#line 17580 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50915 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3530: /* opt_work: WORK_SYM */ +#line 17581 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50921 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3531: /* opt_chain: %empty */ +#line 17586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50927 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3532: /* opt_chain: AND_SYM NO_SYM CHAIN_SYM */ +#line 17587 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3533: /* opt_chain: AND_SYM CHAIN_SYM */ +#line 17588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50939 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3534: /* opt_release: %empty */ +#line 17593 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50945 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3535: /* opt_release: RELEASE_SYM */ +#line 17594 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50951 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3536: /* opt_release: NO_SYM RELEASE_SYM */ +#line 17595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50957 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3537: /* commit: COMMIT_SYM opt_work opt_chain opt_release */ +#line 17600 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_COMMIT; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50970 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3538: /* rollback: ROLLBACK_SYM opt_work opt_chain opt_release */ +#line 17612 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50983 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3539: /* rollback: ROLLBACK_SYM opt_work TO_SYM SAVEPOINT_SYM ident */ +#line 17621 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50993 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3540: /* rollback: ROLLBACK_SYM opt_work TO_SYM ident */ +#line 17627 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 51003 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3541: /* savepoint: SAVEPOINT_SYM ident */ +#line 17636 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 51013 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3542: /* release: RELEASE_SYM SAVEPOINT_SYM ident */ +#line 17645 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 51023 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3543: /* unit_type_decl: UNION_SYM union_option */ +#line 17658 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= UNION_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 51029 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3544: /* unit_type_decl: INTERSECT_SYM union_option */ +#line 17660 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= INTERSECT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 51035 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3545: /* unit_type_decl: EXCEPT_SYM union_option */ +#line 17662 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= EXCEPT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 51041 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3546: /* union_option: %empty */ +#line 17669 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 51047 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3547: /* union_option: DISTINCT */ +#line 17670 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 51053 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3548: /* union_option: ALL */ +#line 17671 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0; } +#line 51059 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3549: /* query_expression_option: STRAIGHT_JOIN */ +#line 17675 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_STRAIGHT_JOIN; } +#line 51065 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3550: /* query_expression_option: HIGH_PRIORITY */ +#line 17677 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYPS->m_lock_type= TL_READ_HIGH_PRIORITY; + YYPS->m_mdl_type= MDL_SHARED_READ; + Select->options|= SELECT_HIGH_PRIORITY; + } +#line 51075 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3551: /* query_expression_option: DISTINCT */ +#line 17682 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 51081 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3552: /* query_expression_option: UNIQUE_SYM */ +#line 17683 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 51087 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3553: /* query_expression_option: SQL_SMALL_RESULT */ +#line 17684 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_SMALL_RESULT; } +#line 51093 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3554: /* query_expression_option: SQL_BIG_RESULT */ +#line 17685 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_BIG_RESULT; } +#line 51099 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3555: /* query_expression_option: SQL_BUFFER_RESULT */ +#line 17686 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_BUFFER_RESULT; } +#line 51105 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3556: /* query_expression_option: SQL_CALC_FOUND_ROWS */ +#line 17687 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_FOUND_ROWS; } +#line 51111 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3557: /* query_expression_option: ALL */ +#line 17688 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_ALL; } +#line 51117 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3560: /* no_definer: %empty */ +#line 17704 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + We have to distinguish missing DEFINER-clause from case when + CURRENT_USER specified as definer explicitly in order to properly + handle CREATE TRIGGER statements which come to replication thread + from older master servers (i.e. to create non-suid trigger in this + case). + */ + thd->lex->definer= 0; + } +#line 51132 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3561: /* definer: DEFINER_SYM '=' user_or_role */ +#line 17718 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->definer= (yyvsp[0].lex_user); + Lex->account_options.reset(); + } +#line 51141 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3562: /* view_algorithm: ALGORITHM_SYM '=' UNDEFINED_SYM */ +#line 17731 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= DTYPE_ALGORITHM_UNDEFINED; } +#line 51147 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3563: /* view_algorithm: ALGORITHM_SYM '=' MERGE_SYM */ +#line 17732 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_MERGE; } +#line 51153 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3564: /* view_algorithm: ALGORITHM_SYM '=' TEMPTABLE_SYM */ +#line 17733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_TMPTABLE; } +#line 51159 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3565: /* opt_view_suid: %empty */ +#line 17737 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFAULT; } +#line 51165 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3566: /* opt_view_suid: view_suid */ +#line 17738 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= (yyvsp[0].view_suid); } +#line 51171 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3567: /* view_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 17742 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFINER; } +#line 51177 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3568: /* view_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 17743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_INVOKER; } +#line 51183 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3569: /* view_list_opt: %empty */ +#line 17748 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51189 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3570: /* view_list_opt: '(' view_list ')' */ +#line 17749 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51195 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3571: /* view_list: ident */ +#line 17754 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 51205 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3572: /* view_list: view_list ',' ident */ +#line 17760 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 51215 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3573: /* $@248: %empty */ +#line 17768 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->parsing_options.allows_variable= FALSE; + lex->create_view->select.str= (char *) YYLIP->get_cpp_ptr(); + } +#line 51225 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3574: /* view_select: $@248 query_expression view_check_option */ +#line 17775 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_create_view((yyvsp[-1].select_lex_unit), (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 51234 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3575: /* view_check_option: %empty */ +#line 17782 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_NONE; } +#line 51240 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3576: /* view_check_option: WITH CHECK_SYM OPTION */ +#line 17783 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 51246 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3577: /* view_check_option: WITH CASCADED CHECK_SYM OPTION */ +#line 17784 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 51252 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3578: /* view_check_option: WITH LOCAL_SYM CHECK_SYM OPTION */ +#line 17785 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_LOCAL; } +#line 51258 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3579: /* trigger_action_order: FOLLOWS_SYM */ +#line 17796 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_FOLLOWS; } +#line 51264 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3580: /* trigger_action_order: PRECEDES_SYM */ +#line 17798 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_PRECEDES; } +#line 51270 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3581: /* trigger_follows_precedes_clause: %empty */ +#line 17803 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= TRG_ORDER_NONE; + (yyval.trg_execution_order).anchor_trigger_name.str= NULL; + (yyval.trg_execution_order).anchor_trigger_name.length= 0; + } +#line 51280 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3582: /* trigger_follows_precedes_clause: trigger_action_order ident_or_text */ +#line 17810 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= (yyvsp[-1].trigger_action_order_type); + (yyval.trg_execution_order).anchor_trigger_name= (yyvsp[0].lex_str); + } +#line 51289 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3583: /* $@249: %empty */ +#line 17819 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[0].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 51298 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3584: /* $@250: %empty */ +#line 17828 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $9 */ + Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); + } +#line 51306 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3585: /* $@251: %empty */ +#line 17834 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $13 */ + Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); + } +#line 51314 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3586: /* $@252: %empty */ +#line 17839 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->trg_chistics.ordering_clause_begin= YYLIP->get_cpp_ptr(); + } +#line 51322 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3587: /* $@253: %empty */ +#line 17843 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $18 */ + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_RECURSIVE_CREATE, MYF(0), "TRIGGER")); + + lex->stmt_definition_begin= (yyvsp[-16].simple_string); + lex->ident.str= (yyvsp[-9].simple_string); + lex->ident.length= (yyvsp[-5].simple_string) - (yyvsp[-9].simple_string); + lex->spname= (yyvsp[-13].spname); + (*static_cast(&lex->trg_chistics))= ((yyvsp[0].trg_execution_order)); + lex->trg_chistics.ordering_clause_end= lip->get_cpp_ptr(); + + if (unlikely(!lex->make_sp_head(thd, (yyvsp[-13].spname), &sp_handler_trigger, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); + } +#line 51347 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3588: /* trigger_tail: remember_name opt_if_not_exists $@249 sp_name trg_action_time trg_event ON remember_name $@250 table_ident FOR_SYM remember_name $@251 EACH_SYM ROW_SYM $@252 trigger_follows_precedes_clause $@253 sp_proc_stmt force_lookahead */ +#line 17864 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $21 */ + LEX *lex= Lex; + + lex->sql_command= SQLCOM_CREATE_TRIGGER; + if (lex->sp_body_finalize_trigger(thd)) + MYSQL_YYABORT; + + /* + We have to do it after parsing trigger body, because some of + sp_proc_stmt alternatives are not saving/restoring LEX, so + lex->query_tables can be wiped out. + */ + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-10].table), (LEX_CSTRING*) 0, + TL_OPTION_UPDATING, TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + } +#line 51370 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3589: /* $@254: %empty */ +#line 17892 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->init_last_field(&lex->sphead->m_return_field_def, + &empty_clex_str); + } +#line 51380 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3590: /* sf_return_type: $@254 field_type */ +#line 17898 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sf_return_fill_definition((yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 51389 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3591: /* xa: XA_SYM begin_or_start xid opt_join_or_resume */ +#line 17908 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_START; + } +#line 51397 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3592: /* xa: XA_SYM END xid opt_suspend */ +#line 17912 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_END; + } +#line 51405 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3593: /* xa: XA_SYM PREPARE_SYM xid */ +#line 17916 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_PREPARE; + } +#line 51413 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3594: /* xa: XA_SYM COMMIT_SYM xid opt_one_phase */ +#line 17920 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_COMMIT; + } +#line 51421 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3595: /* xa: XA_SYM ROLLBACK_SYM xid */ +#line 17924 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_ROLLBACK; + } +#line 51429 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3596: /* xa: XA_SYM RECOVER_SYM opt_format_xid */ +#line 17928 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_RECOVER; + Lex->verbose= (yyvsp[0].num); + } +#line 51438 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3597: /* opt_format_xid: %empty */ +#line 17935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 51444 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3598: /* opt_format_xid: FORMAT_SYM '=' ident_or_text */ +#line 17937 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("SQL"))) + (yyval.num)= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("RAW"))) + (yyval.num)= false; + else + { + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "XA RECOVER", (yyvsp[0].lex_str).str)); + (yyval.num)= false; + } + } +#line 51461 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3599: /* xid: text_string */ +#line 17953 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[0].string)->length() <= MAXGTRIDSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length(), 0, 0); + } +#line 51472 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3600: /* xid: text_string ',' text_string */ +#line 17960 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].string)->length() <= MAXGTRIDSIZE && (yyvsp[0].string)->length() <= MAXBQUALSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length(), (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length()); + } +#line 51483 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3601: /* xid: text_string ',' text_string ',' ulong_num */ +#line 17967 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].string)->length() <= MAXGTRIDSIZE && + (yyvsp[-2].string)->length() <= MAXBQUALSIZE && + (yyvsp[0].ulong_num) <= static_cast( + std::numeric_limits::max())); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set((yyvsp[0].ulong_num), (yyvsp[-4].string)->ptr(), (yyvsp[-4].string)->length(), (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length()); + } +#line 51497 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3602: /* begin_or_start: BEGIN_MARIADB_SYM */ +#line 17979 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51503 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3603: /* begin_or_start: BEGIN_ORACLE_SYM */ +#line 17980 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51509 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3604: /* begin_or_start: START_SYM */ +#line 17981 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51515 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3605: /* opt_join_or_resume: %empty */ +#line 17985 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 51521 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3606: /* opt_join_or_resume: JOIN_SYM */ +#line 17986 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_JOIN; } +#line 51527 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3607: /* opt_join_or_resume: RESUME_SYM */ +#line 17987 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_RESUME; } +#line 51533 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3608: /* opt_one_phase: %empty */ +#line 17991 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 51539 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3609: /* opt_one_phase: ONE_SYM PHASE_SYM */ +#line 17992 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_ONE_PHASE; } +#line 51545 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3610: /* opt_suspend: %empty */ +#line 17997 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 51551 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3611: /* $@255: %empty */ +#line 17999 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_SUSPEND; } +#line 51557 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3613: /* opt_migrate: %empty */ +#line 18004 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51563 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3614: /* opt_migrate: FOR_SYM MIGRATE_SYM */ +#line 18005 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_FOR_MIGRATE; } +#line 51569 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3615: /* install: INSTALL_SYM PLUGIN_SYM opt_if_not_exists ident SONAME_SYM TEXT_STRING_sys */ +#line 18010 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_install_plugin((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51578 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3616: /* install: INSTALL_SYM SONAME_SYM TEXT_STRING_sys */ +#line 18015 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_install_plugin((yyvsp[0].lex_str)); + } +#line 51586 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3617: /* uninstall: UNINSTALL_SYM PLUGIN_SYM opt_if_exists ident */ +#line 18022 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_name((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51595 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3618: /* uninstall: UNINSTALL_SYM SONAME_SYM opt_if_exists TEXT_STRING_sys */ +#line 18027 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_soname((yyvsp[-1].object_ddl_options), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51604 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3619: /* keep_gcc_happy: IMPOSSIBLE_ACTION */ +#line 18036 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYERROR; + } +#line 51612 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3653: /* row_field_name: ident */ +#line 18119 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition)= Lex->row_field_name(thd, (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51621 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3654: /* $@256: %empty */ +#line 18127 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_while_loop_expression(thd))) + MYSQL_YYABORT; + } +#line 51630 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3655: /* while_body: expr_lex DO_SYM $@256 sp_proc_stmts1 END WHILE_SYM */ +#line 18132 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_while_loop_finalize(thd))) + MYSQL_YYABORT; + } +#line 51639 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3656: /* for_loop_statements: DO_SYM sp_proc_stmts1 END FOR_SYM */ +#line 18140 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51645 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3657: /* sp_label: label_ident ':' */ +#line 18144 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[-1].ident_sys); } +#line 51651 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3659: /* sp_block_label: sp_label */ +#line 18153 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->block_label_declare(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + (yyval.lex_str)= (yyvsp[0].lex_str); + } +#line 51661 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3660: /* sp_opt_default: _empty */ +#line 18161 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = NULL; } +#line 51667 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3661: /* sp_opt_default: DEFAULT expr */ +#line 18162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item); } +#line 51673 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3662: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars TYPE_SYM OF_SYM optionally_qualified_column_ident sp_opt_default */ +#line 18169 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, (yyvsp[-4].num), (yyvsp[-1].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-4].num)); + } +#line 51683 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3663: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars ROW_SYM TYPE_SYM OF_SYM optionally_qualified_column_ident sp_opt_default */ +#line 18177 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, (yyvsp[-5].num), (yyvsp[-1].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-5].num)); + } +#line 51693 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3664: /* sp_param_name_and_mode: sp_parameter_type sp_param_name */ +#line 18186 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].spvar)->mode= (yyvsp[-1].spvar_mode); + (yyval.spvar)= (yyvsp[0].spvar); + } +#line 51702 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3666: /* sp_param: sp_param_name_and_mode field_type */ +#line 18195 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_param_fill_definition((yyval.spvar)= (yyvsp[-1].spvar), (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 51711 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3667: /* sp_param: sp_param_name_and_mode ROW_SYM row_type_body */ +#line 18200 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_row(thd, (yyval.spvar)= (yyvsp[-2].spvar), (yyvsp[0].spvar_definition_list)))) + MYSQL_YYABORT; + } +#line 51720 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3669: /* sp_param_anchored: sp_param_name_and_mode TYPE_SYM OF_SYM ident '.' ident */ +#line 18209 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, + (yyval.spvar)= (yyvsp[-5].spvar), (yyvsp[-2].ident_sys), + (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51731 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3670: /* sp_param_anchored: sp_param_name_and_mode TYPE_SYM OF_SYM ident '.' ident '.' ident */ +#line 18216 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, (yyval.spvar)= (yyvsp[-7].spvar), + (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51741 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3671: /* sp_param_anchored: sp_param_name_and_mode ROW_SYM TYPE_SYM OF_SYM ident */ +#line 18222 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-4].spvar), (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51750 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3672: /* sp_param_anchored: sp_param_name_and_mode ROW_SYM TYPE_SYM OF_SYM ident '.' ident */ +#line 18227 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-6].spvar), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 51759 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3673: /* $@257: %empty */ +#line 18236 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->sphead->set_c_chistics(lex->sp_chistics); + lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51769 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3674: /* sf_c_chistics_and_body_standalone: sp_c_chistics $@257 sp_proc_stmt_in_returns_clause force_lookahead */ +#line 18242 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_function(thd))) + MYSQL_YYABORT; + } +#line 51778 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3675: /* $@258: %empty */ +#line 18250 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->make_sp_head_no_recursive(thd, (yyvsp[0].spname), + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + } +#line 51789 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3676: /* $@259: %empty */ +#line 18258 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51798 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3677: /* sp_tail_standalone: sp_name $@258 sp_parenthesized_pdparam_list sp_c_chistics $@259 sp_proc_stmt force_lookahead */ +#line 18263 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_procedure(thd))) + MYSQL_YYABORT; + } +#line 51807 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3678: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident '.' ident */ +#line 18271 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51816 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3679: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident */ +#line 18276 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51825 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3680: /* drop_routine: DROP PROCEDURE_SYM opt_if_exists sp_name */ +#line 18281 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_procedure((yyvsp[-1].object_ddl_options), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51834 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3681: /* $@260: %empty */ +#line 18290 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_procedure_start((yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 51843 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3682: /* create_routine: create_or_replace definer_opt PROCEDURE_SYM opt_if_not_exists $@260 sp_tail_standalone */ +#line 18295 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51851 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3683: /* $@261: %empty */ +#line 18300 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51860 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3684: /* create_routine: create_or_replace definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@261 sp_parenthesized_fdparam_list RETURNS_SYM sf_return_type sf_c_chistics_and_body_standalone */ +#line 18307 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51868 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3685: /* $@262: %empty */ +#line 18312 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51877 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3686: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@262 sp_parenthesized_fdparam_list RETURNS_SYM sf_return_type sf_c_chistics_and_body_standalone */ +#line 18319 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51885 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3687: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists ident RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys */ +#line 18324 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_udf_function((yyvsp[-9].object_ddl_options) | (yyvsp[-5].object_ddl_options), (yyvsp[-7].sp_aggregate_type), (yyvsp[-4].ident_sys), + (Item_result) (yyvsp[-2].num), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51895 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3688: /* sp_decls: _empty */ +#line 18334 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).init(); + } +#line 51903 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3689: /* sp_decls: sp_decls sp_decl ';' */ +#line 18338 "/home/buildbot/git/sql/sql_yacc.yy" + { + // We check for declarations out of (standard) order this way + // because letting the grammar rules reflect it caused tricky + // shift/reduce conflicts with the wrong result. (And we get + // better error handling this way.) + if (unlikely(Lex->sp_declarations_join(&(yyval.spblock), (yyvsp[-2].spblock), (yyvsp[-1].spblock)))) + MYSQL_YYABORT; + } +#line 51916 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3690: /* sp_decl: DECLARE_MARIADB_SYM sp_decl_body */ +#line 18349 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[0].spblock); } +#line 51922 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3692: /* sp_decl_body: sp_decl_ident CONDITION_SYM FOR_SYM sp_cond */ +#line 18356 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->declare_condition(thd, &(yyvsp[-3].ident_sys), (yyvsp[0].spcondvalue)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; + (yyval.spblock).conds= 1; + } +#line 51933 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3694: /* $@263: %empty */ +#line 18364 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51941 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3695: /* sp_decl_body: sp_decl_ident CURSOR_SYM $@263 opt_parenthesized_cursor_formal_parameters FOR_SYM sp_cursor_stmt */ +#line 18369 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_pcontext *param_ctx= Lex->spcont; + if (unlikely(Lex->sp_block_finalize(thd))) + MYSQL_YYABORT; + if (unlikely(Lex->sp_declare_cursor(thd, &(yyvsp[-5].ident_sys), (yyvsp[0].sp_cursor_stmt), param_ctx, true))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).hndlrs= 0; + (yyval.spblock).curs= 1; + } +#line 51955 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3713: /* $@264: %empty */ +#line 18420 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd, &(yyvsp[-1].lex_str)); + } +#line 51963 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3714: /* sp_labeled_block: sp_block_label BEGIN_MARIADB_SYM $@264 sp_decls sp_proc_stmts END sp_opt_label */ +#line 18427 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-3].spblock), &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 51972 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3715: /* $@265: %empty */ +#line 18435 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51980 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3716: /* sp_unlabeled_block: BEGIN_MARIADB_SYM $@265 sp_decls sp_proc_stmts END */ +#line 18441 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-2].spblock)))) + MYSQL_YYABORT; + } +#line 51989 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3717: /* $@266: %empty */ +#line 18449 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); + } +#line 51999 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + case 3718: /* sp_unlabeled_block_not_atomic: BEGIN_MARIADB_SYM not ATOMIC_SYM $@266 sp_decls sp_proc_stmts END */ +#line 18457 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-2].spblock)))) + MYSQL_YYABORT; + } +#line 52008 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + break; + + +#line 52012 "/home/buildbot/git/mkdist/sql/yy_mariadb.cc" + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + yyerror (thd, YY_("syntax error")); + } + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, thd); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + /* Pop stack until we find a state that shifts the error token. */ + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + YY_ACCESSING_SYMBOL (yystate), yyvsp, thd); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturnlab; + + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturnlab; + + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ +yyexhaustedlab: + yyerror (thd, YY_("memory exhausted")); + yyresult = 2; + goto yyreturnlab; + + +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, thd); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, thd); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + + return yyresult; +} + diff -Nru mariadb-10.11.6/sql/yy_mariadb.hh mariadb-10.11.9/sql/yy_mariadb.hh --- mariadb-10.11.6/sql/yy_mariadb.hh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/yy_mariadb.hh 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1,981 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 3 of the License, 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_MYSQL_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_MARIADB_HH_INCLUDED +# define YY_MYSQL_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_MARIADB_HH_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int MYSQLdebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + ABORT_SYM = 258, /* ABORT_SYM */ + IMPOSSIBLE_ACTION = 259, /* IMPOSSIBLE_ACTION */ + FORCE_LOOKAHEAD = 260, /* FORCE_LOOKAHEAD */ + END_OF_INPUT = 261, /* END_OF_INPUT */ + COLON_ORACLE_SYM = 262, /* COLON_ORACLE_SYM */ + PARAM_MARKER = 263, /* PARAM_MARKER */ + FOR_SYSTEM_TIME_SYM = 264, /* FOR_SYSTEM_TIME_SYM */ + LEFT_PAREN_ALT = 265, /* LEFT_PAREN_ALT */ + LEFT_PAREN_WITH = 266, /* LEFT_PAREN_WITH */ + LEFT_PAREN_LIKE = 267, /* LEFT_PAREN_LIKE */ + ORACLE_CONCAT_SYM = 268, /* ORACLE_CONCAT_SYM */ + PERCENT_ORACLE_SYM = 269, /* PERCENT_ORACLE_SYM */ + WITH_CUBE_SYM = 270, /* WITH_CUBE_SYM */ + WITH_ROLLUP_SYM = 271, /* WITH_ROLLUP_SYM */ + WITH_SYSTEM_SYM = 272, /* WITH_SYSTEM_SYM */ + IDENT = 273, /* IDENT */ + IDENT_QUOTED = 274, /* IDENT_QUOTED */ + LEX_HOSTNAME = 275, /* LEX_HOSTNAME */ + UNDERSCORE_CHARSET = 276, /* UNDERSCORE_CHARSET */ + BIN_NUM = 277, /* BIN_NUM */ + DECIMAL_NUM = 278, /* DECIMAL_NUM */ + FLOAT_NUM = 279, /* FLOAT_NUM */ + HEX_NUM = 280, /* HEX_NUM */ + HEX_STRING = 281, /* HEX_STRING */ + LONG_NUM = 282, /* LONG_NUM */ + NCHAR_STRING = 283, /* NCHAR_STRING */ + NUM = 284, /* NUM */ + TEXT_STRING = 285, /* TEXT_STRING */ + ULONGLONG_NUM = 286, /* ULONGLONG_NUM */ + AND_AND_SYM = 287, /* AND_AND_SYM */ + DOT_DOT_SYM = 288, /* DOT_DOT_SYM */ + EQUAL_SYM = 289, /* EQUAL_SYM */ + GE = 290, /* GE */ + LE = 291, /* LE */ + MYSQL_CONCAT_SYM = 292, /* MYSQL_CONCAT_SYM */ + NE = 293, /* NE */ + NOT2_SYM = 294, /* NOT2_SYM */ + OR2_SYM = 295, /* OR2_SYM */ + SET_VAR = 296, /* SET_VAR */ + SHIFT_LEFT = 297, /* SHIFT_LEFT */ + SHIFT_RIGHT = 298, /* SHIFT_RIGHT */ + ACCESSIBLE_SYM = 299, /* ACCESSIBLE_SYM */ + ADD = 300, /* ADD */ + ALL = 301, /* ALL */ + ALTER = 302, /* ALTER */ + ANALYZE_SYM = 303, /* ANALYZE_SYM */ + AND_SYM = 304, /* AND_SYM */ + ASC = 305, /* ASC */ + ASENSITIVE_SYM = 306, /* ASENSITIVE_SYM */ + AS = 307, /* AS */ + BEFORE_SYM = 308, /* BEFORE_SYM */ + BETWEEN_SYM = 309, /* BETWEEN_SYM */ + BIGINT = 310, /* BIGINT */ + BINARY = 311, /* BINARY */ + BIT_AND = 312, /* BIT_AND */ + BIT_OR = 313, /* BIT_OR */ + BIT_XOR = 314, /* BIT_XOR */ + BLOB_MARIADB_SYM = 315, /* BLOB_MARIADB_SYM */ + BLOB_ORACLE_SYM = 316, /* BLOB_ORACLE_SYM */ + BODY_ORACLE_SYM = 317, /* BODY_ORACLE_SYM */ + BOTH = 318, /* BOTH */ + BY = 319, /* BY */ + CALL_SYM = 320, /* CALL_SYM */ + CASCADE = 321, /* CASCADE */ + CASE_SYM = 322, /* CASE_SYM */ + CAST_SYM = 323, /* CAST_SYM */ + CHANGE = 324, /* CHANGE */ + CHAR_SYM = 325, /* CHAR_SYM */ + CHECK_SYM = 326, /* CHECK_SYM */ + COLLATE_SYM = 327, /* COLLATE_SYM */ + CONDITION_SYM = 328, /* CONDITION_SYM */ + CONSTRAINT = 329, /* CONSTRAINT */ + CONTINUE_MARIADB_SYM = 330, /* CONTINUE_MARIADB_SYM */ + CONTINUE_ORACLE_SYM = 331, /* CONTINUE_ORACLE_SYM */ + CONVERT_SYM = 332, /* CONVERT_SYM */ + COUNT_SYM = 333, /* COUNT_SYM */ + CREATE = 334, /* CREATE */ + CROSS = 335, /* CROSS */ + CUME_DIST_SYM = 336, /* CUME_DIST_SYM */ + CURDATE = 337, /* CURDATE */ + CURRENT_ROLE = 338, /* CURRENT_ROLE */ + CURRENT_USER = 339, /* CURRENT_USER */ + CURSOR_SYM = 340, /* CURSOR_SYM */ + CURTIME = 341, /* CURTIME */ + DATABASE = 342, /* DATABASE */ + DATABASES = 343, /* DATABASES */ + DATE_ADD_INTERVAL = 344, /* DATE_ADD_INTERVAL */ + DATE_SUB_INTERVAL = 345, /* DATE_SUB_INTERVAL */ + DAY_HOUR_SYM = 346, /* DAY_HOUR_SYM */ + DAY_MICROSECOND_SYM = 347, /* DAY_MICROSECOND_SYM */ + DAY_MINUTE_SYM = 348, /* DAY_MINUTE_SYM */ + DAY_SECOND_SYM = 349, /* DAY_SECOND_SYM */ + DECIMAL_SYM = 350, /* DECIMAL_SYM */ + DECLARE_MARIADB_SYM = 351, /* DECLARE_MARIADB_SYM */ + DECLARE_ORACLE_SYM = 352, /* DECLARE_ORACLE_SYM */ + DEFAULT = 353, /* DEFAULT */ + DELETE_DOMAIN_ID_SYM = 354, /* DELETE_DOMAIN_ID_SYM */ + DELETE_SYM = 355, /* DELETE_SYM */ + DENSE_RANK_SYM = 356, /* DENSE_RANK_SYM */ + DESCRIBE = 357, /* DESCRIBE */ + DESC = 358, /* DESC */ + DETERMINISTIC_SYM = 359, /* DETERMINISTIC_SYM */ + DISTINCT = 360, /* DISTINCT */ + DIV_SYM = 361, /* DIV_SYM */ + DO_DOMAIN_IDS_SYM = 362, /* DO_DOMAIN_IDS_SYM */ + DOUBLE_SYM = 363, /* DOUBLE_SYM */ + DROP = 364, /* DROP */ + DUAL_SYM = 365, /* DUAL_SYM */ + EACH_SYM = 366, /* EACH_SYM */ + ELSEIF_MARIADB_SYM = 367, /* ELSEIF_MARIADB_SYM */ + ELSE = 368, /* ELSE */ + ELSIF_ORACLE_SYM = 369, /* ELSIF_ORACLE_SYM */ + EMPTY_SYM = 370, /* EMPTY_SYM */ + ENCLOSED = 371, /* ENCLOSED */ + ESCAPED = 372, /* ESCAPED */ + EXCEPT_SYM = 373, /* EXCEPT_SYM */ + EXISTS = 374, /* EXISTS */ + EXTRACT_SYM = 375, /* EXTRACT_SYM */ + FALSE_SYM = 376, /* FALSE_SYM */ + FETCH_SYM = 377, /* FETCH_SYM */ + FIRST_VALUE_SYM = 378, /* FIRST_VALUE_SYM */ + FLOAT_SYM = 379, /* FLOAT_SYM */ + FOREIGN = 380, /* FOREIGN */ + FOR_SYM = 381, /* FOR_SYM */ + FROM = 382, /* FROM */ + FULLTEXT_SYM = 383, /* FULLTEXT_SYM */ + GOTO_ORACLE_SYM = 384, /* GOTO_ORACLE_SYM */ + GRANT = 385, /* GRANT */ + GROUP_CONCAT_SYM = 386, /* GROUP_CONCAT_SYM */ + JSON_ARRAYAGG_SYM = 387, /* JSON_ARRAYAGG_SYM */ + JSON_OBJECTAGG_SYM = 388, /* JSON_OBJECTAGG_SYM */ + JSON_TABLE_SYM = 389, /* JSON_TABLE_SYM */ + GROUP_SYM = 390, /* GROUP_SYM */ + HAVING = 391, /* HAVING */ + HOUR_MICROSECOND_SYM = 392, /* HOUR_MICROSECOND_SYM */ + HOUR_MINUTE_SYM = 393, /* HOUR_MINUTE_SYM */ + HOUR_SECOND_SYM = 394, /* HOUR_SECOND_SYM */ + IF_SYM = 395, /* IF_SYM */ + IGNORE_DOMAIN_IDS_SYM = 396, /* IGNORE_DOMAIN_IDS_SYM */ + IGNORE_SYM = 397, /* IGNORE_SYM */ + IGNORED_SYM = 398, /* IGNORED_SYM */ + INDEX_SYM = 399, /* INDEX_SYM */ + INFILE = 400, /* INFILE */ + INNER_SYM = 401, /* INNER_SYM */ + INOUT_SYM = 402, /* INOUT_SYM */ + INSENSITIVE_SYM = 403, /* INSENSITIVE_SYM */ + INSERT = 404, /* INSERT */ + IN_SYM = 405, /* IN_SYM */ + INTERSECT_SYM = 406, /* INTERSECT_SYM */ + INTERVAL_SYM = 407, /* INTERVAL_SYM */ + INTO = 408, /* INTO */ + INT_SYM = 409, /* INT_SYM */ + IS = 410, /* IS */ + ITERATE_SYM = 411, /* ITERATE_SYM */ + JOIN_SYM = 412, /* JOIN_SYM */ + KEYS = 413, /* KEYS */ + KEY_SYM = 414, /* KEY_SYM */ + KILL_SYM = 415, /* KILL_SYM */ + LAG_SYM = 416, /* LAG_SYM */ + LEADING = 417, /* LEADING */ + LEAD_SYM = 418, /* LEAD_SYM */ + LEAVE_SYM = 419, /* LEAVE_SYM */ + LEFT = 420, /* LEFT */ + LIKE = 421, /* LIKE */ + LIMIT = 422, /* LIMIT */ + LINEAR_SYM = 423, /* LINEAR_SYM */ + LINES = 424, /* LINES */ + LOAD = 425, /* LOAD */ + LOCATOR_SYM = 426, /* LOCATOR_SYM */ + LOCK_SYM = 427, /* LOCK_SYM */ + LONGBLOB = 428, /* LONGBLOB */ + LONG_SYM = 429, /* LONG_SYM */ + LONGTEXT = 430, /* LONGTEXT */ + LOOP_SYM = 431, /* LOOP_SYM */ + LOW_PRIORITY = 432, /* LOW_PRIORITY */ + MASTER_SSL_VERIFY_SERVER_CERT_SYM = 433, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + MATCH = 434, /* MATCH */ + MAX_SYM = 435, /* MAX_SYM */ + MAXVALUE_SYM = 436, /* MAXVALUE_SYM */ + MEDIAN_SYM = 437, /* MEDIAN_SYM */ + MEDIUMBLOB = 438, /* MEDIUMBLOB */ + MEDIUMINT = 439, /* MEDIUMINT */ + MEDIUMTEXT = 440, /* MEDIUMTEXT */ + MIN_SYM = 441, /* MIN_SYM */ + MINUS_ORACLE_SYM = 442, /* MINUS_ORACLE_SYM */ + MINUTE_MICROSECOND_SYM = 443, /* MINUTE_MICROSECOND_SYM */ + MINUTE_SECOND_SYM = 444, /* MINUTE_SECOND_SYM */ + MODIFIES_SYM = 445, /* MODIFIES_SYM */ + MOD_SYM = 446, /* MOD_SYM */ + NATURAL = 447, /* NATURAL */ + NEG = 448, /* NEG */ + NESTED_SYM = 449, /* NESTED_SYM */ + NOT_SYM = 450, /* NOT_SYM */ + NO_WRITE_TO_BINLOG = 451, /* NO_WRITE_TO_BINLOG */ + NOW_SYM = 452, /* NOW_SYM */ + NTH_VALUE_SYM = 453, /* NTH_VALUE_SYM */ + NTILE_SYM = 454, /* NTILE_SYM */ + NULL_SYM = 455, /* NULL_SYM */ + NUMERIC_SYM = 456, /* NUMERIC_SYM */ + ON = 457, /* ON */ + OPTIMIZE = 458, /* OPTIMIZE */ + OPTIONALLY = 459, /* OPTIONALLY */ + ORDER_SYM = 460, /* ORDER_SYM */ + ORDINALITY_SYM = 461, /* ORDINALITY_SYM */ + OR_SYM = 462, /* OR_SYM */ + OTHERS_ORACLE_SYM = 463, /* OTHERS_ORACLE_SYM */ + OUTER = 464, /* OUTER */ + OUTFILE = 465, /* OUTFILE */ + OUT_SYM = 466, /* OUT_SYM */ + OVER_SYM = 467, /* OVER_SYM */ + PACKAGE_ORACLE_SYM = 468, /* PACKAGE_ORACLE_SYM */ + PAGE_CHECKSUM_SYM = 469, /* PAGE_CHECKSUM_SYM */ + PARSE_VCOL_EXPR_SYM = 470, /* PARSE_VCOL_EXPR_SYM */ + PARTITION_SYM = 471, /* PARTITION_SYM */ + PATH_SYM = 472, /* PATH_SYM */ + PERCENTILE_CONT_SYM = 473, /* PERCENTILE_CONT_SYM */ + PERCENTILE_DISC_SYM = 474, /* PERCENTILE_DISC_SYM */ + PERCENT_RANK_SYM = 475, /* PERCENT_RANK_SYM */ + PORTION_SYM = 476, /* PORTION_SYM */ + POSITION_SYM = 477, /* POSITION_SYM */ + PRECISION = 478, /* PRECISION */ + PRIMARY_SYM = 479, /* PRIMARY_SYM */ + PROCEDURE_SYM = 480, /* PROCEDURE_SYM */ + PURGE = 481, /* PURGE */ + RAISE_ORACLE_SYM = 482, /* RAISE_ORACLE_SYM */ + RANGE_SYM = 483, /* RANGE_SYM */ + RANK_SYM = 484, /* RANK_SYM */ + READS_SYM = 485, /* READS_SYM */ + READ_SYM = 486, /* READ_SYM */ + READ_WRITE_SYM = 487, /* READ_WRITE_SYM */ + REAL = 488, /* REAL */ + RECURSIVE_SYM = 489, /* RECURSIVE_SYM */ + REFERENCES = 490, /* REFERENCES */ + REF_SYSTEM_ID_SYM = 491, /* REF_SYSTEM_ID_SYM */ + REGEXP = 492, /* REGEXP */ + RELEASE_SYM = 493, /* RELEASE_SYM */ + RENAME = 494, /* RENAME */ + REPEAT_SYM = 495, /* REPEAT_SYM */ + REQUIRE_SYM = 496, /* REQUIRE_SYM */ + RESIGNAL_SYM = 497, /* RESIGNAL_SYM */ + RESTRICT = 498, /* RESTRICT */ + RETURNING_SYM = 499, /* RETURNING_SYM */ + RETURN_MARIADB_SYM = 500, /* RETURN_MARIADB_SYM */ + RETURN_ORACLE_SYM = 501, /* RETURN_ORACLE_SYM */ + REVOKE = 502, /* REVOKE */ + RIGHT = 503, /* RIGHT */ + ROW_NUMBER_SYM = 504, /* ROW_NUMBER_SYM */ + ROWS_SYM = 505, /* ROWS_SYM */ + ROWTYPE_ORACLE_SYM = 506, /* ROWTYPE_ORACLE_SYM */ + SECOND_MICROSECOND_SYM = 507, /* SECOND_MICROSECOND_SYM */ + SELECT_SYM = 508, /* SELECT_SYM */ + SENSITIVE_SYM = 509, /* SENSITIVE_SYM */ + SEPARATOR_SYM = 510, /* SEPARATOR_SYM */ + SERVER_OPTIONS = 511, /* SERVER_OPTIONS */ + SET = 512, /* SET */ + SHOW = 513, /* SHOW */ + SIGNAL_SYM = 514, /* SIGNAL_SYM */ + SMALLINT = 515, /* SMALLINT */ + SPATIAL_SYM = 516, /* SPATIAL_SYM */ + SPECIFIC_SYM = 517, /* SPECIFIC_SYM */ + SQL_BIG_RESULT = 518, /* SQL_BIG_RESULT */ + SQLEXCEPTION_SYM = 519, /* SQLEXCEPTION_SYM */ + SQL_SMALL_RESULT = 520, /* SQL_SMALL_RESULT */ + SQLSTATE_SYM = 521, /* SQLSTATE_SYM */ + SQL_SYM = 522, /* SQL_SYM */ + SQLWARNING_SYM = 523, /* SQLWARNING_SYM */ + SSL_SYM = 524, /* SSL_SYM */ + STARTING = 525, /* STARTING */ + STATS_AUTO_RECALC_SYM = 526, /* STATS_AUTO_RECALC_SYM */ + STATS_PERSISTENT_SYM = 527, /* STATS_PERSISTENT_SYM */ + STATS_SAMPLE_PAGES_SYM = 528, /* STATS_SAMPLE_PAGES_SYM */ + STDDEV_SAMP_SYM = 529, /* STDDEV_SAMP_SYM */ + STD_SYM = 530, /* STD_SYM */ + STRAIGHT_JOIN = 531, /* STRAIGHT_JOIN */ + SUM_SYM = 532, /* SUM_SYM */ + SYSDATE = 533, /* SYSDATE */ + TABLE_REF_PRIORITY = 534, /* TABLE_REF_PRIORITY */ + TABLE_SYM = 535, /* TABLE_SYM */ + TERMINATED = 536, /* TERMINATED */ + THEN_SYM = 537, /* THEN_SYM */ + TINYBLOB = 538, /* TINYBLOB */ + TINYINT = 539, /* TINYINT */ + TINYTEXT = 540, /* TINYTEXT */ + TO_SYM = 541, /* TO_SYM */ + TRAILING = 542, /* TRAILING */ + TRIGGER_SYM = 543, /* TRIGGER_SYM */ + TRUE_SYM = 544, /* TRUE_SYM */ + UNDO_SYM = 545, /* UNDO_SYM */ + UNION_SYM = 546, /* UNION_SYM */ + UNIQUE_SYM = 547, /* UNIQUE_SYM */ + UNLOCK_SYM = 548, /* UNLOCK_SYM */ + UNSIGNED = 549, /* UNSIGNED */ + UPDATE_SYM = 550, /* UPDATE_SYM */ + USAGE = 551, /* USAGE */ + USE_SYM = 552, /* USE_SYM */ + USING = 553, /* USING */ + UTC_DATE_SYM = 554, /* UTC_DATE_SYM */ + UTC_TIMESTAMP_SYM = 555, /* UTC_TIMESTAMP_SYM */ + UTC_TIME_SYM = 556, /* UTC_TIME_SYM */ + VALUES_IN_SYM = 557, /* VALUES_IN_SYM */ + VALUES_LESS_SYM = 558, /* VALUES_LESS_SYM */ + VALUES = 559, /* VALUES */ + VARBINARY = 560, /* VARBINARY */ + VARCHAR = 561, /* VARCHAR */ + VARIANCE_SYM = 562, /* VARIANCE_SYM */ + VAR_SAMP_SYM = 563, /* VAR_SAMP_SYM */ + VARYING = 564, /* VARYING */ + WHEN_SYM = 565, /* WHEN_SYM */ + WHERE = 566, /* WHERE */ + WHILE_SYM = 567, /* WHILE_SYM */ + WITH = 568, /* WITH */ + XOR = 569, /* XOR */ + YEAR_MONTH_SYM = 570, /* YEAR_MONTH_SYM */ + ZEROFILL = 571, /* ZEROFILL */ + BODY_MARIADB_SYM = 572, /* BODY_MARIADB_SYM */ + ELSEIF_ORACLE_SYM = 573, /* ELSEIF_ORACLE_SYM */ + ELSIF_MARIADB_SYM = 574, /* ELSIF_MARIADB_SYM */ + EXCEPTION_ORACLE_SYM = 575, /* EXCEPTION_ORACLE_SYM */ + GOTO_MARIADB_SYM = 576, /* GOTO_MARIADB_SYM */ + OTHERS_MARIADB_SYM = 577, /* OTHERS_MARIADB_SYM */ + PACKAGE_MARIADB_SYM = 578, /* PACKAGE_MARIADB_SYM */ + RAISE_MARIADB_SYM = 579, /* RAISE_MARIADB_SYM */ + ROWTYPE_MARIADB_SYM = 580, /* ROWTYPE_MARIADB_SYM */ + ROWNUM_SYM = 581, /* ROWNUM_SYM */ + REPLACE = 582, /* REPLACE */ + SUBSTRING = 583, /* SUBSTRING */ + TRIM = 584, /* TRIM */ + ACCOUNT_SYM = 585, /* ACCOUNT_SYM */ + ACTION = 586, /* ACTION */ + ADMIN_SYM = 587, /* ADMIN_SYM */ + ADDDATE_SYM = 588, /* ADDDATE_SYM */ + AFTER_SYM = 589, /* AFTER_SYM */ + AGAINST = 590, /* AGAINST */ + AGGREGATE_SYM = 591, /* AGGREGATE_SYM */ + ALGORITHM_SYM = 592, /* ALGORITHM_SYM */ + ALWAYS_SYM = 593, /* ALWAYS_SYM */ + ANY_SYM = 594, /* ANY_SYM */ + ASCII_SYM = 595, /* ASCII_SYM */ + AT_SYM = 596, /* AT_SYM */ + ATOMIC_SYM = 597, /* ATOMIC_SYM */ + AUTHORS_SYM = 598, /* AUTHORS_SYM */ + AUTOEXTEND_SIZE_SYM = 599, /* AUTOEXTEND_SIZE_SYM */ + AUTO_INC = 600, /* AUTO_INC */ + AUTO_SYM = 601, /* AUTO_SYM */ + AVG_ROW_LENGTH = 602, /* AVG_ROW_LENGTH */ + AVG_SYM = 603, /* AVG_SYM */ + BACKUP_SYM = 604, /* BACKUP_SYM */ + BEGIN_MARIADB_SYM = 605, /* BEGIN_MARIADB_SYM */ + BEGIN_ORACLE_SYM = 606, /* BEGIN_ORACLE_SYM */ + BINLOG_SYM = 607, /* BINLOG_SYM */ + BIT_SYM = 608, /* BIT_SYM */ + BLOCK_SYM = 609, /* BLOCK_SYM */ + BOOL_SYM = 610, /* BOOL_SYM */ + BOOLEAN_SYM = 611, /* BOOLEAN_SYM */ + BTREE_SYM = 612, /* BTREE_SYM */ + BYTE_SYM = 613, /* BYTE_SYM */ + CACHE_SYM = 614, /* CACHE_SYM */ + CASCADED = 615, /* CASCADED */ + CATALOG_NAME_SYM = 616, /* CATALOG_NAME_SYM */ + CHAIN_SYM = 617, /* CHAIN_SYM */ + CHANGED = 618, /* CHANGED */ + CHANNEL_SYM = 619, /* CHANNEL_SYM */ + CHARSET = 620, /* CHARSET */ + CHECKPOINT_SYM = 621, /* CHECKPOINT_SYM */ + CHECKSUM_SYM = 622, /* CHECKSUM_SYM */ + CIPHER_SYM = 623, /* CIPHER_SYM */ + CLASS_ORIGIN_SYM = 624, /* CLASS_ORIGIN_SYM */ + CLIENT_SYM = 625, /* CLIENT_SYM */ + CLOB_MARIADB_SYM = 626, /* CLOB_MARIADB_SYM */ + CLOB_ORACLE_SYM = 627, /* CLOB_ORACLE_SYM */ + CLOSE_SYM = 628, /* CLOSE_SYM */ + COALESCE = 629, /* COALESCE */ + CODE_SYM = 630, /* CODE_SYM */ + COLLATION_SYM = 631, /* COLLATION_SYM */ + COLUMNS = 632, /* COLUMNS */ + COLUMN_ADD_SYM = 633, /* COLUMN_ADD_SYM */ + COLUMN_CHECK_SYM = 634, /* COLUMN_CHECK_SYM */ + COLUMN_CREATE_SYM = 635, /* COLUMN_CREATE_SYM */ + COLUMN_DELETE_SYM = 636, /* COLUMN_DELETE_SYM */ + COLUMN_GET_SYM = 637, /* COLUMN_GET_SYM */ + COLUMN_SYM = 638, /* COLUMN_SYM */ + COLUMN_NAME_SYM = 639, /* COLUMN_NAME_SYM */ + COMMENT_SYM = 640, /* COMMENT_SYM */ + COMMITTED_SYM = 641, /* COMMITTED_SYM */ + COMMIT_SYM = 642, /* COMMIT_SYM */ + COMPACT_SYM = 643, /* COMPACT_SYM */ + COMPLETION_SYM = 644, /* COMPLETION_SYM */ + COMPRESSED_SYM = 645, /* COMPRESSED_SYM */ + CONCURRENT = 646, /* CONCURRENT */ + CONNECTION_SYM = 647, /* CONNECTION_SYM */ + CONSISTENT_SYM = 648, /* CONSISTENT_SYM */ + CONSTRAINT_CATALOG_SYM = 649, /* CONSTRAINT_CATALOG_SYM */ + CONSTRAINT_NAME_SYM = 650, /* CONSTRAINT_NAME_SYM */ + CONSTRAINT_SCHEMA_SYM = 651, /* CONSTRAINT_SCHEMA_SYM */ + CONTAINS_SYM = 652, /* CONTAINS_SYM */ + CONTEXT_SYM = 653, /* CONTEXT_SYM */ + CONTRIBUTORS_SYM = 654, /* CONTRIBUTORS_SYM */ + CPU_SYM = 655, /* CPU_SYM */ + CUBE_SYM = 656, /* CUBE_SYM */ + CURRENT_SYM = 657, /* CURRENT_SYM */ + CURRENT_POS_SYM = 658, /* CURRENT_POS_SYM */ + CURSOR_NAME_SYM = 659, /* CURSOR_NAME_SYM */ + CYCLE_SYM = 660, /* CYCLE_SYM */ + DATAFILE_SYM = 661, /* DATAFILE_SYM */ + DATA_SYM = 662, /* DATA_SYM */ + DATETIME = 663, /* DATETIME */ + DATE_SYM = 664, /* DATE_SYM */ + DAY_SYM = 665, /* DAY_SYM */ + DEALLOCATE_SYM = 666, /* DEALLOCATE_SYM */ + DEFINER_SYM = 667, /* DEFINER_SYM */ + DELAYED_SYM = 668, /* DELAYED_SYM */ + DELAY_KEY_WRITE_SYM = 669, /* DELAY_KEY_WRITE_SYM */ + DES_KEY_FILE = 670, /* DES_KEY_FILE */ + DIAGNOSTICS_SYM = 671, /* DIAGNOSTICS_SYM */ + DIRECTORY_SYM = 672, /* DIRECTORY_SYM */ + DISABLE_SYM = 673, /* DISABLE_SYM */ + DISCARD = 674, /* DISCARD */ + DISK_SYM = 675, /* DISK_SYM */ + DO_SYM = 676, /* DO_SYM */ + DUMPFILE = 677, /* DUMPFILE */ + DUPLICATE_SYM = 678, /* DUPLICATE_SYM */ + DYNAMIC_SYM = 679, /* DYNAMIC_SYM */ + ENABLE_SYM = 680, /* ENABLE_SYM */ + END = 681, /* END */ + ENDS_SYM = 682, /* ENDS_SYM */ + ENGINES_SYM = 683, /* ENGINES_SYM */ + ENGINE_SYM = 684, /* ENGINE_SYM */ + ENUM = 685, /* ENUM */ + ERROR_SYM = 686, /* ERROR_SYM */ + ERRORS = 687, /* ERRORS */ + ESCAPE_SYM = 688, /* ESCAPE_SYM */ + EVENTS_SYM = 689, /* EVENTS_SYM */ + EVENT_SYM = 690, /* EVENT_SYM */ + EVERY_SYM = 691, /* EVERY_SYM */ + EXCHANGE_SYM = 692, /* EXCHANGE_SYM */ + EXAMINED_SYM = 693, /* EXAMINED_SYM */ + EXCLUDE_SYM = 694, /* EXCLUDE_SYM */ + EXECUTE_SYM = 695, /* EXECUTE_SYM */ + EXCEPTION_MARIADB_SYM = 696, /* EXCEPTION_MARIADB_SYM */ + EXIT_MARIADB_SYM = 697, /* EXIT_MARIADB_SYM */ + EXIT_ORACLE_SYM = 698, /* EXIT_ORACLE_SYM */ + EXPANSION_SYM = 699, /* EXPANSION_SYM */ + EXPIRE_SYM = 700, /* EXPIRE_SYM */ + EXPORT_SYM = 701, /* EXPORT_SYM */ + EXTENDED_SYM = 702, /* EXTENDED_SYM */ + EXTENT_SIZE_SYM = 703, /* EXTENT_SIZE_SYM */ + FAST_SYM = 704, /* FAST_SYM */ + FAULTS_SYM = 705, /* FAULTS_SYM */ + FEDERATED_SYM = 706, /* FEDERATED_SYM */ + FILE_SYM = 707, /* FILE_SYM */ + FIRST_SYM = 708, /* FIRST_SYM */ + FIXED_SYM = 709, /* FIXED_SYM */ + FLUSH_SYM = 710, /* FLUSH_SYM */ + FOLLOWS_SYM = 711, /* FOLLOWS_SYM */ + FOLLOWING_SYM = 712, /* FOLLOWING_SYM */ + FORCE_SYM = 713, /* FORCE_SYM */ + FORMAT_SYM = 714, /* FORMAT_SYM */ + FOUND_SYM = 715, /* FOUND_SYM */ + FULL = 716, /* FULL */ + FUNCTION_SYM = 717, /* FUNCTION_SYM */ + GENERAL = 718, /* GENERAL */ + GENERATED_SYM = 719, /* GENERATED_SYM */ + GET_FORMAT = 720, /* GET_FORMAT */ + GET_SYM = 721, /* GET_SYM */ + GLOBAL_SYM = 722, /* GLOBAL_SYM */ + GRANTS = 723, /* GRANTS */ + HANDLER_SYM = 724, /* HANDLER_SYM */ + HARD_SYM = 725, /* HARD_SYM */ + HASH_SYM = 726, /* HASH_SYM */ + HELP_SYM = 727, /* HELP_SYM */ + HIGH_PRIORITY = 728, /* HIGH_PRIORITY */ + HISTORY_SYM = 729, /* HISTORY_SYM */ + HOST_SYM = 730, /* HOST_SYM */ + HOSTS_SYM = 731, /* HOSTS_SYM */ + HOUR_SYM = 732, /* HOUR_SYM */ + ID_SYM = 733, /* ID_SYM */ + IDENTIFIED_SYM = 734, /* IDENTIFIED_SYM */ + IGNORE_SERVER_IDS_SYM = 735, /* IGNORE_SERVER_IDS_SYM */ + IMMEDIATE_SYM = 736, /* IMMEDIATE_SYM */ + IMPORT = 737, /* IMPORT */ + INCREMENT_SYM = 738, /* INCREMENT_SYM */ + INDEXES = 739, /* INDEXES */ + INITIAL_SIZE_SYM = 740, /* INITIAL_SIZE_SYM */ + INSERT_METHOD = 741, /* INSERT_METHOD */ + INSTALL_SYM = 742, /* INSTALL_SYM */ + INVOKER_SYM = 743, /* INVOKER_SYM */ + IO_SYM = 744, /* IO_SYM */ + IPC_SYM = 745, /* IPC_SYM */ + ISOLATION = 746, /* ISOLATION */ + ISOPEN_SYM = 747, /* ISOPEN_SYM */ + ISSUER_SYM = 748, /* ISSUER_SYM */ + INVISIBLE_SYM = 749, /* INVISIBLE_SYM */ + JSON_SYM = 750, /* JSON_SYM */ + KEY_BLOCK_SIZE = 751, /* KEY_BLOCK_SIZE */ + LANGUAGE_SYM = 752, /* LANGUAGE_SYM */ + LAST_SYM = 753, /* LAST_SYM */ + LAST_VALUE = 754, /* LAST_VALUE */ + LASTVAL_SYM = 755, /* LASTVAL_SYM */ + LEAVES = 756, /* LEAVES */ + LESS_SYM = 757, /* LESS_SYM */ + LEVEL_SYM = 758, /* LEVEL_SYM */ + LIST_SYM = 759, /* LIST_SYM */ + LOCAL_SYM = 760, /* LOCAL_SYM */ + LOCKED_SYM = 761, /* LOCKED_SYM */ + LOCKS_SYM = 762, /* LOCKS_SYM */ + LOGFILE_SYM = 763, /* LOGFILE_SYM */ + LOGS_SYM = 764, /* LOGS_SYM */ + MASTER_CONNECT_RETRY_SYM = 765, /* MASTER_CONNECT_RETRY_SYM */ + MASTER_DELAY_SYM = 766, /* MASTER_DELAY_SYM */ + MASTER_GTID_POS_SYM = 767, /* MASTER_GTID_POS_SYM */ + MASTER_HOST_SYM = 768, /* MASTER_HOST_SYM */ + MASTER_LOG_FILE_SYM = 769, /* MASTER_LOG_FILE_SYM */ + MASTER_LOG_POS_SYM = 770, /* MASTER_LOG_POS_SYM */ + MASTER_PASSWORD_SYM = 771, /* MASTER_PASSWORD_SYM */ + MASTER_PORT_SYM = 772, /* MASTER_PORT_SYM */ + MASTER_SERVER_ID_SYM = 773, /* MASTER_SERVER_ID_SYM */ + MASTER_SSL_CAPATH_SYM = 774, /* MASTER_SSL_CAPATH_SYM */ + MASTER_SSL_CA_SYM = 775, /* MASTER_SSL_CA_SYM */ + MASTER_SSL_CERT_SYM = 776, /* MASTER_SSL_CERT_SYM */ + MASTER_SSL_CIPHER_SYM = 777, /* MASTER_SSL_CIPHER_SYM */ + MASTER_SSL_CRL_SYM = 778, /* MASTER_SSL_CRL_SYM */ + MASTER_SSL_CRLPATH_SYM = 779, /* MASTER_SSL_CRLPATH_SYM */ + MASTER_SSL_KEY_SYM = 780, /* MASTER_SSL_KEY_SYM */ + MASTER_SSL_SYM = 781, /* MASTER_SSL_SYM */ + MASTER_SYM = 782, /* MASTER_SYM */ + MASTER_USER_SYM = 783, /* MASTER_USER_SYM */ + MASTER_USE_GTID_SYM = 784, /* MASTER_USE_GTID_SYM */ + MASTER_HEARTBEAT_PERIOD_SYM = 785, /* MASTER_HEARTBEAT_PERIOD_SYM */ + MASTER_DEMOTE_TO_SLAVE_SYM = 786, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + MAX_CONNECTIONS_PER_HOUR = 787, /* MAX_CONNECTIONS_PER_HOUR */ + MAX_QUERIES_PER_HOUR = 788, /* MAX_QUERIES_PER_HOUR */ + MAX_ROWS = 789, /* MAX_ROWS */ + MAX_SIZE_SYM = 790, /* MAX_SIZE_SYM */ + MAX_UPDATES_PER_HOUR = 791, /* MAX_UPDATES_PER_HOUR */ + MAX_STATEMENT_TIME_SYM = 792, /* MAX_STATEMENT_TIME_SYM */ + MAX_USER_CONNECTIONS_SYM = 793, /* MAX_USER_CONNECTIONS_SYM */ + MEDIUM_SYM = 794, /* MEDIUM_SYM */ + MEMORY_SYM = 795, /* MEMORY_SYM */ + MERGE_SYM = 796, /* MERGE_SYM */ + MESSAGE_TEXT_SYM = 797, /* MESSAGE_TEXT_SYM */ + MICROSECOND_SYM = 798, /* MICROSECOND_SYM */ + MIGRATE_SYM = 799, /* MIGRATE_SYM */ + MINUTE_SYM = 800, /* MINUTE_SYM */ + MINVALUE_SYM = 801, /* MINVALUE_SYM */ + MIN_ROWS = 802, /* MIN_ROWS */ + MODE_SYM = 803, /* MODE_SYM */ + MODIFY_SYM = 804, /* MODIFY_SYM */ + MONITOR_SYM = 805, /* MONITOR_SYM */ + MONTH_SYM = 806, /* MONTH_SYM */ + MUTEX_SYM = 807, /* MUTEX_SYM */ + MYSQL_SYM = 808, /* MYSQL_SYM */ + MYSQL_ERRNO_SYM = 809, /* MYSQL_ERRNO_SYM */ + NAMES_SYM = 810, /* NAMES_SYM */ + NAME_SYM = 811, /* NAME_SYM */ + NATIONAL_SYM = 812, /* NATIONAL_SYM */ + NCHAR_SYM = 813, /* NCHAR_SYM */ + NEVER_SYM = 814, /* NEVER_SYM */ + NEXT_SYM = 815, /* NEXT_SYM */ + NEXTVAL_SYM = 816, /* NEXTVAL_SYM */ + NOCACHE_SYM = 817, /* NOCACHE_SYM */ + NOCYCLE_SYM = 818, /* NOCYCLE_SYM */ + NODEGROUP_SYM = 819, /* NODEGROUP_SYM */ + NONE_SYM = 820, /* NONE_SYM */ + NOTFOUND_SYM = 821, /* NOTFOUND_SYM */ + NO_SYM = 822, /* NO_SYM */ + NOMAXVALUE_SYM = 823, /* NOMAXVALUE_SYM */ + NOMINVALUE_SYM = 824, /* NOMINVALUE_SYM */ + NO_WAIT_SYM = 825, /* NO_WAIT_SYM */ + NOWAIT_SYM = 826, /* NOWAIT_SYM */ + NUMBER_MARIADB_SYM = 827, /* NUMBER_MARIADB_SYM */ + NUMBER_ORACLE_SYM = 828, /* NUMBER_ORACLE_SYM */ + NVARCHAR_SYM = 829, /* NVARCHAR_SYM */ + OF_SYM = 830, /* OF_SYM */ + OFFSET_SYM = 831, /* OFFSET_SYM */ + OLD_PASSWORD_SYM = 832, /* OLD_PASSWORD_SYM */ + ONE_SYM = 833, /* ONE_SYM */ + ONLY_SYM = 834, /* ONLY_SYM */ + ONLINE_SYM = 835, /* ONLINE_SYM */ + OPEN_SYM = 836, /* OPEN_SYM */ + OPTIONS_SYM = 837, /* OPTIONS_SYM */ + OPTION = 838, /* OPTION */ + OVERLAPS_SYM = 839, /* OVERLAPS_SYM */ + OWNER_SYM = 840, /* OWNER_SYM */ + PACK_KEYS_SYM = 841, /* PACK_KEYS_SYM */ + PAGE_SYM = 842, /* PAGE_SYM */ + PARSER_SYM = 843, /* PARSER_SYM */ + PARTIAL = 844, /* PARTIAL */ + PARTITIONS_SYM = 845, /* PARTITIONS_SYM */ + PARTITIONING_SYM = 846, /* PARTITIONING_SYM */ + PASSWORD_SYM = 847, /* PASSWORD_SYM */ + PERIOD_SYM = 848, /* PERIOD_SYM */ + PERSISTENT_SYM = 849, /* PERSISTENT_SYM */ + PHASE_SYM = 850, /* PHASE_SYM */ + PLUGINS_SYM = 851, /* PLUGINS_SYM */ + PLUGIN_SYM = 852, /* PLUGIN_SYM */ + PORT_SYM = 853, /* PORT_SYM */ + PRECEDES_SYM = 854, /* PRECEDES_SYM */ + PRECEDING_SYM = 855, /* PRECEDING_SYM */ + PREPARE_SYM = 856, /* PREPARE_SYM */ + PRESERVE_SYM = 857, /* PRESERVE_SYM */ + PREV_SYM = 858, /* PREV_SYM */ + PREVIOUS_SYM = 859, /* PREVIOUS_SYM */ + PRIVILEGES = 860, /* PRIVILEGES */ + PROCESS = 861, /* PROCESS */ + PROCESSLIST_SYM = 862, /* PROCESSLIST_SYM */ + PROFILE_SYM = 863, /* PROFILE_SYM */ + PROFILES_SYM = 864, /* PROFILES_SYM */ + PROXY_SYM = 865, /* PROXY_SYM */ + QUARTER_SYM = 866, /* QUARTER_SYM */ + QUERY_SYM = 867, /* QUERY_SYM */ + QUICK = 868, /* QUICK */ + RAW_MARIADB_SYM = 869, /* RAW_MARIADB_SYM */ + RAW_ORACLE_SYM = 870, /* RAW_ORACLE_SYM */ + READ_ONLY_SYM = 871, /* READ_ONLY_SYM */ + REBUILD_SYM = 872, /* REBUILD_SYM */ + RECOVER_SYM = 873, /* RECOVER_SYM */ + REDOFILE_SYM = 874, /* REDOFILE_SYM */ + REDO_BUFFER_SIZE_SYM = 875, /* REDO_BUFFER_SIZE_SYM */ + REDUNDANT_SYM = 876, /* REDUNDANT_SYM */ + RELAY = 877, /* RELAY */ + RELAYLOG_SYM = 878, /* RELAYLOG_SYM */ + RELAY_LOG_FILE_SYM = 879, /* RELAY_LOG_FILE_SYM */ + RELAY_LOG_POS_SYM = 880, /* RELAY_LOG_POS_SYM */ + RELAY_THREAD = 881, /* RELAY_THREAD */ + RELOAD = 882, /* RELOAD */ + REMOVE_SYM = 883, /* REMOVE_SYM */ + REORGANIZE_SYM = 884, /* REORGANIZE_SYM */ + REPAIR = 885, /* REPAIR */ + REPEATABLE_SYM = 886, /* REPEATABLE_SYM */ + REPLAY_SYM = 887, /* REPLAY_SYM */ + REPLICATION = 888, /* REPLICATION */ + RESET_SYM = 889, /* RESET_SYM */ + RESTART_SYM = 890, /* RESTART_SYM */ + RESOURCES = 891, /* RESOURCES */ + RESTORE_SYM = 892, /* RESTORE_SYM */ + RESUME_SYM = 893, /* RESUME_SYM */ + RETURNED_SQLSTATE_SYM = 894, /* RETURNED_SQLSTATE_SYM */ + RETURNS_SYM = 895, /* RETURNS_SYM */ + REUSE_SYM = 896, /* REUSE_SYM */ + REVERSE_SYM = 897, /* REVERSE_SYM */ + ROLE_SYM = 898, /* ROLE_SYM */ + ROLLBACK_SYM = 899, /* ROLLBACK_SYM */ + ROLLUP_SYM = 900, /* ROLLUP_SYM */ + ROUTINE_SYM = 901, /* ROUTINE_SYM */ + ROWCOUNT_SYM = 902, /* ROWCOUNT_SYM */ + ROW_SYM = 903, /* ROW_SYM */ + ROW_COUNT_SYM = 904, /* ROW_COUNT_SYM */ + ROW_FORMAT_SYM = 905, /* ROW_FORMAT_SYM */ + RTREE_SYM = 906, /* RTREE_SYM */ + SAVEPOINT_SYM = 907, /* SAVEPOINT_SYM */ + SCHEDULE_SYM = 908, /* SCHEDULE_SYM */ + SCHEMA_NAME_SYM = 909, /* SCHEMA_NAME_SYM */ + SECOND_SYM = 910, /* SECOND_SYM */ + SECURITY_SYM = 911, /* SECURITY_SYM */ + SEQUENCE_SYM = 912, /* SEQUENCE_SYM */ + SERIALIZABLE_SYM = 913, /* SERIALIZABLE_SYM */ + SERIAL_SYM = 914, /* SERIAL_SYM */ + SESSION_SYM = 915, /* SESSION_SYM */ + SERVER_SYM = 916, /* SERVER_SYM */ + SETVAL_SYM = 917, /* SETVAL_SYM */ + SHARE_SYM = 918, /* SHARE_SYM */ + SHUTDOWN = 919, /* SHUTDOWN */ + SIGNED_SYM = 920, /* SIGNED_SYM */ + SIMPLE_SYM = 921, /* SIMPLE_SYM */ + SKIP_SYM = 922, /* SKIP_SYM */ + SLAVE = 923, /* SLAVE */ + SLAVES = 924, /* SLAVES */ + SLAVE_POS_SYM = 925, /* SLAVE_POS_SYM */ + SLOW = 926, /* SLOW */ + SNAPSHOT_SYM = 927, /* SNAPSHOT_SYM */ + SOCKET_SYM = 928, /* SOCKET_SYM */ + SOFT_SYM = 929, /* SOFT_SYM */ + SONAME_SYM = 930, /* SONAME_SYM */ + SOUNDS_SYM = 931, /* SOUNDS_SYM */ + SOURCE_SYM = 932, /* SOURCE_SYM */ + SQL_BUFFER_RESULT = 933, /* SQL_BUFFER_RESULT */ + SQL_CACHE_SYM = 934, /* SQL_CACHE_SYM */ + SQL_CALC_FOUND_ROWS = 935, /* SQL_CALC_FOUND_ROWS */ + SQL_NO_CACHE_SYM = 936, /* SQL_NO_CACHE_SYM */ + SQL_THREAD = 937, /* SQL_THREAD */ + STAGE_SYM = 938, /* STAGE_SYM */ + STARTS_SYM = 939, /* STARTS_SYM */ + START_SYM = 940, /* START_SYM */ + STATEMENT_SYM = 941, /* STATEMENT_SYM */ + STATUS_SYM = 942, /* STATUS_SYM */ + STOP_SYM = 943, /* STOP_SYM */ + STORAGE_SYM = 944, /* STORAGE_SYM */ + STORED_SYM = 945, /* STORED_SYM */ + STRING_SYM = 946, /* STRING_SYM */ + SUBCLASS_ORIGIN_SYM = 947, /* SUBCLASS_ORIGIN_SYM */ + SUBDATE_SYM = 948, /* SUBDATE_SYM */ + SUBJECT_SYM = 949, /* SUBJECT_SYM */ + SUBPARTITIONS_SYM = 950, /* SUBPARTITIONS_SYM */ + SUBPARTITION_SYM = 951, /* SUBPARTITION_SYM */ + SUPER_SYM = 952, /* SUPER_SYM */ + SUSPEND_SYM = 953, /* SUSPEND_SYM */ + SWAPS_SYM = 954, /* SWAPS_SYM */ + SWITCHES_SYM = 955, /* SWITCHES_SYM */ + SYSTEM = 956, /* SYSTEM */ + SYSTEM_TIME_SYM = 957, /* SYSTEM_TIME_SYM */ + TABLES = 958, /* TABLES */ + TABLESPACE = 959, /* TABLESPACE */ + TABLE_CHECKSUM_SYM = 960, /* TABLE_CHECKSUM_SYM */ + TABLE_NAME_SYM = 961, /* TABLE_NAME_SYM */ + TEMPORARY = 962, /* TEMPORARY */ + TEMPTABLE_SYM = 963, /* TEMPTABLE_SYM */ + TEXT_SYM = 964, /* TEXT_SYM */ + THAN_SYM = 965, /* THAN_SYM */ + TIES_SYM = 966, /* TIES_SYM */ + TIMESTAMP = 967, /* TIMESTAMP */ + TIMESTAMP_ADD = 968, /* TIMESTAMP_ADD */ + TIMESTAMP_DIFF = 969, /* TIMESTAMP_DIFF */ + TIME_SYM = 970, /* TIME_SYM */ + TRANSACTION_SYM = 971, /* TRANSACTION_SYM */ + TRANSACTIONAL_SYM = 972, /* TRANSACTIONAL_SYM */ + THREADS_SYM = 973, /* THREADS_SYM */ + TRIGGERS_SYM = 974, /* TRIGGERS_SYM */ + TRIM_ORACLE = 975, /* TRIM_ORACLE */ + TRUNCATE_SYM = 976, /* TRUNCATE_SYM */ + TYPE_SYM = 977, /* TYPE_SYM */ + UDF_RETURNS_SYM = 978, /* UDF_RETURNS_SYM */ + UNBOUNDED_SYM = 979, /* UNBOUNDED_SYM */ + UNCOMMITTED_SYM = 980, /* UNCOMMITTED_SYM */ + UNDEFINED_SYM = 981, /* UNDEFINED_SYM */ + UNDOFILE_SYM = 982, /* UNDOFILE_SYM */ + UNDO_BUFFER_SIZE_SYM = 983, /* UNDO_BUFFER_SIZE_SYM */ + UNICODE_SYM = 984, /* UNICODE_SYM */ + UNINSTALL_SYM = 985, /* UNINSTALL_SYM */ + UNKNOWN_SYM = 986, /* UNKNOWN_SYM */ + UNTIL_SYM = 987, /* UNTIL_SYM */ + UPGRADE_SYM = 988, /* UPGRADE_SYM */ + USER_SYM = 989, /* USER_SYM */ + USE_FRM = 990, /* USE_FRM */ + VALUE_SYM = 991, /* VALUE_SYM */ + VARCHAR2_MARIADB_SYM = 992, /* VARCHAR2_MARIADB_SYM */ + VARCHAR2_ORACLE_SYM = 993, /* VARCHAR2_ORACLE_SYM */ + VARIABLES = 994, /* VARIABLES */ + VERSIONING_SYM = 995, /* VERSIONING_SYM */ + VIA_SYM = 996, /* VIA_SYM */ + VIEW_SYM = 997, /* VIEW_SYM */ + VISIBLE_SYM = 998, /* VISIBLE_SYM */ + VIRTUAL_SYM = 999, /* VIRTUAL_SYM */ + WAIT_SYM = 1000, /* WAIT_SYM */ + WARNINGS = 1001, /* WARNINGS */ + WEEK_SYM = 1002, /* WEEK_SYM */ + WEIGHT_STRING_SYM = 1003, /* WEIGHT_STRING_SYM */ + WINDOW_SYM = 1004, /* WINDOW_SYM */ + WITHIN = 1005, /* WITHIN */ + WITHOUT = 1006, /* WITHOUT */ + WORK_SYM = 1007, /* WORK_SYM */ + WRAPPER_SYM = 1008, /* WRAPPER_SYM */ + WRITE_SYM = 1009, /* WRITE_SYM */ + X509_SYM = 1010, /* X509_SYM */ + XA_SYM = 1011, /* XA_SYM */ + XML_SYM = 1012, /* XML_SYM */ + YEAR_SYM = 1013, /* YEAR_SYM */ + CONDITIONLESS_JOIN = 1014, /* CONDITIONLESS_JOIN */ + ON_SYM = 1015, /* ON_SYM */ + PREC_BELOW_NOT = 1016, /* PREC_BELOW_NOT */ + SUBQUERY_AS_EXPR = 1017, /* SUBQUERY_AS_EXPR */ + PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 1018, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + USER = 1019, /* USER */ + PREC_BELOW_CONTRACTION_TOKEN2 = 1020, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + EMPTY_FROM_CLAUSE = 1021 /* EMPTY_FROM_CLAUSE */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 192 "/home/buildbot/git/sql/sql_yacc.yy" + + int num; + ulong ulong_num; + ulonglong ulonglong_number; + longlong longlong_number; + uint sp_instr_addr; + + /* structs */ + LEX_CSTRING lex_str; + Lex_ident_cli_st kwd; + Lex_ident_cli_st ident_cli; + Lex_ident_sys_st ident_sys; + Lex_column_list_privilege_st column_list_privilege; + Lex_string_with_metadata_st lex_string_with_metadata; + Lex_spblock_st spblock; + Lex_spblock_handlers_st spblock_handlers; + Lex_length_and_dec_st Lex_length_and_dec; + Lex_cast_type_st Lex_cast_type; + Lex_field_type_st Lex_field_type; + Lex_exact_charset_extended_collation_attrs_st + Lex_exact_charset_extended_collation_attrs; + Lex_extended_collation_st Lex_extended_collation; + Lex_dyncol_type_st Lex_dyncol_type; + Lex_for_loop_st for_loop; + Lex_for_loop_bounds_st for_loop_bounds; + Lex_trim_st trim; + Json_table_column::On_response json_on_response; + Lex_substring_spec_st substring_spec; + vers_history_point_t vers_history_point; + struct + { + enum sub_select_type unit_type; + bool distinct; + } unit_operation; + struct + { + SELECT_LEX *first; + SELECT_LEX *prev_last; + } select_list; + SQL_I_List *select_order; + Lex_select_lock select_lock; + Lex_select_limit select_limit; + Lex_order_limit_lock *order_limit_lock; + + /* pointers */ + Lex_ident_sys *ident_sys_ptr; + Create_field *create_field; + Spvar_definition *spvar_definition; + Row_definition_list *spvar_definition_list; + const Type_handler *type_handler; + const class Sp_handler *sp_handler; + CHARSET_INFO *charset; + Condition_information_item *cond_info_item; + DYNCALL_CREATE_DEF *dyncol_def; + Diagnostics_information *diag_info; + Item *item; + Item_num *item_num; + Item_param *item_param; + Item_basic_constant *item_basic_constant; + Key_part_spec *key_part; + LEX *lex; + sp_expr_lex *expr_lex; + sp_assignment_lex *assignment_lex; + class sp_lex_cursor *sp_cursor_stmt; + LEX_CSTRING *lex_str_ptr; + LEX_USER *lex_user; + USER_AUTH *user_auth; + List *cond_info_list; + List *dyncol_def_list; + List *item_list; + List *sp_assignment_lex_list; + List *stmt_info_list; + List *string_list; + List *ident_sys_list; + Statement_information_item *stmt_info_item; + String *string; + TABLE_LIST *table_list; + Table_ident *table; + Qualified_column_ident *qualified_column_ident; + char *simple_string; + const char *const_simple_string; + chooser_compare_func_creator boolfunc2creator; + class Lex_grant_privilege *lex_grant; + class Lex_grant_object_name *lex_grant_ident; + class my_var *myvar; + class sp_condition_value *spcondvalue; + class sp_head *sphead; + class sp_name *spname; + class sp_variable *spvar; + class With_element_head *with_element_head; + class With_clause *with_clause; + class Virtual_column_info *virtual_column; + engine_option_value *engine_option_value_ptr; + + handlerton *db_type; + st_select_lex *select_lex; + st_select_lex_unit *select_lex_unit; + struct p_elem_val *p_elem_value; + class Window_frame *window_frame; + class Window_frame_bound *window_frame_bound; + udf_func *udf; + st_trg_execution_order trg_execution_order; + + /* enums */ + enum enum_sp_suid_behaviour sp_suid; + enum enum_sp_aggregate_type sp_aggregate_type; + enum enum_view_suid view_suid; + enum Condition_information_item::Name cond_info_item_name; + enum enum_diag_condition_item_name diag_condition_item_name; + enum Diagnostics_information::Which_area diag_area; + enum enum_fk_option m_fk_option; + enum Item_udftype udf_type; + enum Key::Keytype key_type; + enum Statement_information_item::Name stmt_info_item_name; + enum enum_filetype filetype; + enum enum_tx_isolation tx_isolation; + enum enum_var_type var_type; + enum enum_yes_no_unknown m_yes_no_unk; + enum ha_choice choice; + enum ha_key_alg key_alg; + enum ha_rkey_function ha_rkey_mode; + enum index_hint_type index_hint; + enum interval_type interval, interval_time_st; + enum row_type row_type; + enum sp_variable::enum_mode spvar_mode; + enum thr_lock_type lock_type; + enum enum_mysql_timestamp_type date_time_type; + enum Window_frame_bound::Bound_precedence_type bound_precedence_type; + enum Window_frame::Frame_units frame_units; + enum Window_frame::Frame_exclusion frame_exclusion; + enum trigger_order_type trigger_action_order_type; + DDL_options_st object_ddl_options; + enum vers_kind_t vers_range_unit; + enum Column_definition::enum_column_versioning vers_column_versioning; + enum plsql_cursor_attr_t plsql_cursor_attr; + privilege_t privilege; + +#line 968 "/home/buildbot/git/mkdist/sql/yy_mariadb.hh" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + +int MYSQLparse (THD *thd); + + +#endif /* !YY_MYSQL_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_MARIADB_HH_INCLUDED */ diff -Nru mariadb-10.11.6/sql/yy_oracle.cc mariadb-10.11.9/sql/yy_oracle.cc --- mariadb-10.11.6/sql/yy_oracle.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/yy_oracle.cc 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1,52286 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 3 of the License, 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 + +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "/home/buildbot/git/mkdist/sql/myskel.m4" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + +/* Substitute the variable and function names. */ +#define yyparse ORAparse +#define yylex ORAlex +#define yyerror ORAerror +#define yydebug ORAdebug +#define yynerrs ORAnerrs + +/* First part of user prologue. */ +#line 25 "/home/buildbot/git/sql/sql_yacc.yy" + +#define YYLIP (& thd->m_parser_state->m_lip) +#define YYPS (& thd->m_parser_state->m_yacc) +#define YYCSCL (thd->variables.character_set_client) + +#define MYSQL_YACC +#define YYINITDEPTH 100 +#define YYMAXDEPTH 3200 /* Because of 64K stack */ +#define Lex (thd->lex) + +#define Select Lex->current_select +#include "mariadb.h" +#include "sql_priv.h" +#include "sql_parse.h" /* comp_*_creator */ +#include "sql_table.h" /* primary_key_name */ +#include "sql_partition.h" /* partition_info, HASH_PARTITION */ +#include "sql_class.h" /* Key_part_spec, enum_filetype, Diag_condition_item_name */ +#include "slave.h" +#include "lex_symbol.h" +#include "item_create.h" +#include "sp_head.h" +#include "sp_rcontext.h" +#include "sp.h" +#include "sql_show.h" +#include "sql_alter.h" // Sql_cmd_alter_table* +#include "sql_truncate.h" // Sql_cmd_truncate_table +#include "sql_admin.h" // Sql_cmd_analyze/Check..._table +#include "sql_partition_admin.h" // Sql_cmd_alter_table_*_part. +#include "sql_handler.h" // Sql_cmd_handler_* +#include "sql_signal.h" +#include "sql_get_diagnostics.h" // Sql_cmd_get_diagnostics +#include "sql_cte.h" +#include "sql_window.h" +#include "item_windowfunc.h" +#include "event_parse_data.h" +#include "create_options.h" +#include +#include +#include "keycaches.h" +#include "set_var.h" +#include "rpl_mi.h" +#include "lex_token.h" +#include "sql_lex.h" +#include "sql_sequence.h" +#include "my_base.h" +#include "sql_type_json.h" +#include "json_table.h" + +/* this is to get the bison compilation windows warnings out */ +#ifdef _MSC_VER +/* warning C4065: switch statement contains 'default' but no 'case' labels */ +/* warning C4102: 'yyexhaustedlab': unreferenced label */ +#pragma warning (disable : 4065 4102) +#endif +#if defined (__GNUC__) || defined (__clang__) +#pragma GCC diagnostic ignored "-Wunused-label" /* yyexhaustedlab: */ +#endif + +/* Stack size 28200 with clang for MYSQLparse() and ORAparse() */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + +int yylex(void *yylval, void *yythd); + +#define yyoverflow(A,B,C,D,E,F) \ + { \ + size_t val= *(F); \ + if (unlikely(my_yyoverflow((B), (D), &val))) \ + { \ + yyerror(thd, (char*) (A)); \ + return 2; \ + } \ + else \ + { \ + *(F)= (YYSIZE_T)val; \ + } \ + } + +#define MYSQL_YYABORT \ + do \ + { \ + YYABORT; \ + } while (0) + +#define MYSQL_YYABORT_UNLESS(A) \ + if (unlikely(!(A))) \ + { \ + thd->parse_error(); \ + MYSQL_YYABORT; \ + } + +#define my_yyabort_error(A) \ + do { my_error A; MYSQL_YYABORT; } while(0) + +#ifndef DBUG_OFF +#define YYDEBUG 1 +#else +#define YYDEBUG 0 +#endif + + +static Item* escape(THD *thd) +{ + thd->lex->escape_used= false; + const char *esc= thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES ? "" : "\\"; + return new (thd->mem_root) Item_string_ascii(thd, esc, MY_TEST(esc[0])); +} + + +/** + @brief Bison callback to report a syntax/OOM error + + This function is invoked by the bison-generated parser + when a syntax error, a parse error or an out-of-memory + condition occurs. This function is not invoked when the + parser is requested to abort by semantic action code + by means of YYABORT or YYACCEPT macros. This is why these + macros should not be used (use MYSQL_YYABORT/MYSQL_YYACCEPT + instead). + + The parser will abort immediately after invoking this callback. + + This function is not for use in semantic actions and is internal to + the parser, as it performs some pre-return cleanup. + In semantic actions, please use thd->parse_error() or my_error to + push an error into the error stack and MYSQL_YYABORT + to abort from the parser. +*/ + +static void yyerror(THD *thd, const char *s) +{ + /* "parse error" changed into "syntax error" between bison 1.75 and 1.875 */ + if (strcmp(s,"parse error") == 0 || strcmp(s,"syntax error") == 0) + s= ER_THD(thd, ER_SYNTAX_ERROR); + thd->parse_error(s, 0); +} + + +#ifndef DBUG_OFF +#define __CONCAT_UNDERSCORED(x,y) x ## _ ## y +#define _CONCAT_UNDERSCORED(x,y) __CONCAT_UNDERSCORED(x,y) +void _CONCAT_UNDERSCORED(turn_parser_debug_on,yyparse)() +{ + /* + MYSQLdebug is in sql/yy_*.cc, in bison generated code. + Turning this option on is **VERY** verbose, and should be + used when investigating a syntax error problem only. + + The syntax to run with bison traces is as follows : + - Starting a server manually : + mysqld --debug-dbug="d,parser_debug" ... + - Running a test : + mysql-test-run.pl --mysqld="--debug-dbug=d,parser_debug" ... + + The result will be in the process stderr (var/log/master.err) + */ + +#ifndef _AIX + extern int yydebug; +#else + static int yydebug; +#endif + yydebug= 1; +} +#endif + + + +#line 244 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +#include "yy_oracle.hh" +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_3_ = 3, /* '@' */ + YYSYMBOL_ABORT_SYM = 4, /* ABORT_SYM */ + YYSYMBOL_IMPOSSIBLE_ACTION = 5, /* IMPOSSIBLE_ACTION */ + YYSYMBOL_FORCE_LOOKAHEAD = 6, /* FORCE_LOOKAHEAD */ + YYSYMBOL_END_OF_INPUT = 7, /* END_OF_INPUT */ + YYSYMBOL_COLON_ORACLE_SYM = 8, /* COLON_ORACLE_SYM */ + YYSYMBOL_PARAM_MARKER = 9, /* PARAM_MARKER */ + YYSYMBOL_FOR_SYSTEM_TIME_SYM = 10, /* FOR_SYSTEM_TIME_SYM */ + YYSYMBOL_LEFT_PAREN_ALT = 11, /* LEFT_PAREN_ALT */ + YYSYMBOL_LEFT_PAREN_WITH = 12, /* LEFT_PAREN_WITH */ + YYSYMBOL_LEFT_PAREN_LIKE = 13, /* LEFT_PAREN_LIKE */ + YYSYMBOL_ORACLE_CONCAT_SYM = 14, /* ORACLE_CONCAT_SYM */ + YYSYMBOL_PERCENT_ORACLE_SYM = 15, /* PERCENT_ORACLE_SYM */ + YYSYMBOL_WITH_CUBE_SYM = 16, /* WITH_CUBE_SYM */ + YYSYMBOL_WITH_ROLLUP_SYM = 17, /* WITH_ROLLUP_SYM */ + YYSYMBOL_WITH_SYSTEM_SYM = 18, /* WITH_SYSTEM_SYM */ + YYSYMBOL_IDENT = 19, /* IDENT */ + YYSYMBOL_IDENT_QUOTED = 20, /* IDENT_QUOTED */ + YYSYMBOL_LEX_HOSTNAME = 21, /* LEX_HOSTNAME */ + YYSYMBOL_UNDERSCORE_CHARSET = 22, /* UNDERSCORE_CHARSET */ + YYSYMBOL_BIN_NUM = 23, /* BIN_NUM */ + YYSYMBOL_DECIMAL_NUM = 24, /* DECIMAL_NUM */ + YYSYMBOL_FLOAT_NUM = 25, /* FLOAT_NUM */ + YYSYMBOL_HEX_NUM = 26, /* HEX_NUM */ + YYSYMBOL_HEX_STRING = 27, /* HEX_STRING */ + YYSYMBOL_LONG_NUM = 28, /* LONG_NUM */ + YYSYMBOL_NCHAR_STRING = 29, /* NCHAR_STRING */ + YYSYMBOL_NUM = 30, /* NUM */ + YYSYMBOL_TEXT_STRING = 31, /* TEXT_STRING */ + YYSYMBOL_ULONGLONG_NUM = 32, /* ULONGLONG_NUM */ + YYSYMBOL_AND_AND_SYM = 33, /* AND_AND_SYM */ + YYSYMBOL_DOT_DOT_SYM = 34, /* DOT_DOT_SYM */ + YYSYMBOL_EQUAL_SYM = 35, /* EQUAL_SYM */ + YYSYMBOL_GE = 36, /* GE */ + YYSYMBOL_LE = 37, /* LE */ + YYSYMBOL_MYSQL_CONCAT_SYM = 38, /* MYSQL_CONCAT_SYM */ + YYSYMBOL_NE = 39, /* NE */ + YYSYMBOL_NOT2_SYM = 40, /* NOT2_SYM */ + YYSYMBOL_OR2_SYM = 41, /* OR2_SYM */ + YYSYMBOL_SET_VAR = 42, /* SET_VAR */ + YYSYMBOL_SHIFT_LEFT = 43, /* SHIFT_LEFT */ + YYSYMBOL_SHIFT_RIGHT = 44, /* SHIFT_RIGHT */ + YYSYMBOL_ACCESSIBLE_SYM = 45, /* ACCESSIBLE_SYM */ + YYSYMBOL_ADD = 46, /* ADD */ + YYSYMBOL_ALL = 47, /* ALL */ + YYSYMBOL_ALTER = 48, /* ALTER */ + YYSYMBOL_ANALYZE_SYM = 49, /* ANALYZE_SYM */ + YYSYMBOL_AND_SYM = 50, /* AND_SYM */ + YYSYMBOL_ASC = 51, /* ASC */ + YYSYMBOL_ASENSITIVE_SYM = 52, /* ASENSITIVE_SYM */ + YYSYMBOL_AS = 53, /* AS */ + YYSYMBOL_BEFORE_SYM = 54, /* BEFORE_SYM */ + YYSYMBOL_BETWEEN_SYM = 55, /* BETWEEN_SYM */ + YYSYMBOL_BIGINT = 56, /* BIGINT */ + YYSYMBOL_BINARY = 57, /* BINARY */ + YYSYMBOL_BIT_AND = 58, /* BIT_AND */ + YYSYMBOL_BIT_OR = 59, /* BIT_OR */ + YYSYMBOL_BIT_XOR = 60, /* BIT_XOR */ + YYSYMBOL_BLOB_MARIADB_SYM = 61, /* BLOB_MARIADB_SYM */ + YYSYMBOL_BLOB_ORACLE_SYM = 62, /* BLOB_ORACLE_SYM */ + YYSYMBOL_BODY_ORACLE_SYM = 63, /* BODY_ORACLE_SYM */ + YYSYMBOL_BOTH = 64, /* BOTH */ + YYSYMBOL_BY = 65, /* BY */ + YYSYMBOL_CALL_SYM = 66, /* CALL_SYM */ + YYSYMBOL_CASCADE = 67, /* CASCADE */ + YYSYMBOL_CASE_SYM = 68, /* CASE_SYM */ + YYSYMBOL_CAST_SYM = 69, /* CAST_SYM */ + YYSYMBOL_CHANGE = 70, /* CHANGE */ + YYSYMBOL_CHAR_SYM = 71, /* CHAR_SYM */ + YYSYMBOL_CHECK_SYM = 72, /* CHECK_SYM */ + YYSYMBOL_COLLATE_SYM = 73, /* COLLATE_SYM */ + YYSYMBOL_CONDITION_SYM = 74, /* CONDITION_SYM */ + YYSYMBOL_CONSTRAINT = 75, /* CONSTRAINT */ + YYSYMBOL_CONTINUE_MARIADB_SYM = 76, /* CONTINUE_MARIADB_SYM */ + YYSYMBOL_CONTINUE_ORACLE_SYM = 77, /* CONTINUE_ORACLE_SYM */ + YYSYMBOL_CONVERT_SYM = 78, /* CONVERT_SYM */ + YYSYMBOL_COUNT_SYM = 79, /* COUNT_SYM */ + YYSYMBOL_CREATE = 80, /* CREATE */ + YYSYMBOL_CROSS = 81, /* CROSS */ + YYSYMBOL_CUME_DIST_SYM = 82, /* CUME_DIST_SYM */ + YYSYMBOL_CURDATE = 83, /* CURDATE */ + YYSYMBOL_CURRENT_ROLE = 84, /* CURRENT_ROLE */ + YYSYMBOL_CURRENT_USER = 85, /* CURRENT_USER */ + YYSYMBOL_CURSOR_SYM = 86, /* CURSOR_SYM */ + YYSYMBOL_CURTIME = 87, /* CURTIME */ + YYSYMBOL_DATABASE = 88, /* DATABASE */ + YYSYMBOL_DATABASES = 89, /* DATABASES */ + YYSYMBOL_DATE_ADD_INTERVAL = 90, /* DATE_ADD_INTERVAL */ + YYSYMBOL_DATE_SUB_INTERVAL = 91, /* DATE_SUB_INTERVAL */ + YYSYMBOL_DAY_HOUR_SYM = 92, /* DAY_HOUR_SYM */ + YYSYMBOL_DAY_MICROSECOND_SYM = 93, /* DAY_MICROSECOND_SYM */ + YYSYMBOL_DAY_MINUTE_SYM = 94, /* DAY_MINUTE_SYM */ + YYSYMBOL_DAY_SECOND_SYM = 95, /* DAY_SECOND_SYM */ + YYSYMBOL_DECIMAL_SYM = 96, /* DECIMAL_SYM */ + YYSYMBOL_DECLARE_MARIADB_SYM = 97, /* DECLARE_MARIADB_SYM */ + YYSYMBOL_DECLARE_ORACLE_SYM = 98, /* DECLARE_ORACLE_SYM */ + YYSYMBOL_DEFAULT = 99, /* DEFAULT */ + YYSYMBOL_DELETE_DOMAIN_ID_SYM = 100, /* DELETE_DOMAIN_ID_SYM */ + YYSYMBOL_DELETE_SYM = 101, /* DELETE_SYM */ + YYSYMBOL_DENSE_RANK_SYM = 102, /* DENSE_RANK_SYM */ + YYSYMBOL_DESCRIBE = 103, /* DESCRIBE */ + YYSYMBOL_DESC = 104, /* DESC */ + YYSYMBOL_DETERMINISTIC_SYM = 105, /* DETERMINISTIC_SYM */ + YYSYMBOL_DISTINCT = 106, /* DISTINCT */ + YYSYMBOL_DIV_SYM = 107, /* DIV_SYM */ + YYSYMBOL_DO_DOMAIN_IDS_SYM = 108, /* DO_DOMAIN_IDS_SYM */ + YYSYMBOL_DOUBLE_SYM = 109, /* DOUBLE_SYM */ + YYSYMBOL_DROP = 110, /* DROP */ + YYSYMBOL_DUAL_SYM = 111, /* DUAL_SYM */ + YYSYMBOL_EACH_SYM = 112, /* EACH_SYM */ + YYSYMBOL_ELSEIF_MARIADB_SYM = 113, /* ELSEIF_MARIADB_SYM */ + YYSYMBOL_ELSE = 114, /* ELSE */ + YYSYMBOL_ELSIF_ORACLE_SYM = 115, /* ELSIF_ORACLE_SYM */ + YYSYMBOL_EMPTY_SYM = 116, /* EMPTY_SYM */ + YYSYMBOL_ENCLOSED = 117, /* ENCLOSED */ + YYSYMBOL_ESCAPED = 118, /* ESCAPED */ + YYSYMBOL_EXCEPT_SYM = 119, /* EXCEPT_SYM */ + YYSYMBOL_EXISTS = 120, /* EXISTS */ + YYSYMBOL_EXTRACT_SYM = 121, /* EXTRACT_SYM */ + YYSYMBOL_FALSE_SYM = 122, /* FALSE_SYM */ + YYSYMBOL_FETCH_SYM = 123, /* FETCH_SYM */ + YYSYMBOL_FIRST_VALUE_SYM = 124, /* FIRST_VALUE_SYM */ + YYSYMBOL_FLOAT_SYM = 125, /* FLOAT_SYM */ + YYSYMBOL_FOREIGN = 126, /* FOREIGN */ + YYSYMBOL_FOR_SYM = 127, /* FOR_SYM */ + YYSYMBOL_FROM = 128, /* FROM */ + YYSYMBOL_FULLTEXT_SYM = 129, /* FULLTEXT_SYM */ + YYSYMBOL_GOTO_ORACLE_SYM = 130, /* GOTO_ORACLE_SYM */ + YYSYMBOL_GRANT = 131, /* GRANT */ + YYSYMBOL_GROUP_CONCAT_SYM = 132, /* GROUP_CONCAT_SYM */ + YYSYMBOL_JSON_ARRAYAGG_SYM = 133, /* JSON_ARRAYAGG_SYM */ + YYSYMBOL_JSON_OBJECTAGG_SYM = 134, /* JSON_OBJECTAGG_SYM */ + YYSYMBOL_JSON_TABLE_SYM = 135, /* JSON_TABLE_SYM */ + YYSYMBOL_GROUP_SYM = 136, /* GROUP_SYM */ + YYSYMBOL_HAVING = 137, /* HAVING */ + YYSYMBOL_HOUR_MICROSECOND_SYM = 138, /* HOUR_MICROSECOND_SYM */ + YYSYMBOL_HOUR_MINUTE_SYM = 139, /* HOUR_MINUTE_SYM */ + YYSYMBOL_HOUR_SECOND_SYM = 140, /* HOUR_SECOND_SYM */ + YYSYMBOL_IF_SYM = 141, /* IF_SYM */ + YYSYMBOL_IGNORE_DOMAIN_IDS_SYM = 142, /* IGNORE_DOMAIN_IDS_SYM */ + YYSYMBOL_IGNORE_SYM = 143, /* IGNORE_SYM */ + YYSYMBOL_IGNORED_SYM = 144, /* IGNORED_SYM */ + YYSYMBOL_INDEX_SYM = 145, /* INDEX_SYM */ + YYSYMBOL_INFILE = 146, /* INFILE */ + YYSYMBOL_INNER_SYM = 147, /* INNER_SYM */ + YYSYMBOL_INOUT_SYM = 148, /* INOUT_SYM */ + YYSYMBOL_INSENSITIVE_SYM = 149, /* INSENSITIVE_SYM */ + YYSYMBOL_INSERT = 150, /* INSERT */ + YYSYMBOL_IN_SYM = 151, /* IN_SYM */ + YYSYMBOL_INTERSECT_SYM = 152, /* INTERSECT_SYM */ + YYSYMBOL_INTERVAL_SYM = 153, /* INTERVAL_SYM */ + YYSYMBOL_INTO = 154, /* INTO */ + YYSYMBOL_INT_SYM = 155, /* INT_SYM */ + YYSYMBOL_IS = 156, /* IS */ + YYSYMBOL_ITERATE_SYM = 157, /* ITERATE_SYM */ + YYSYMBOL_JOIN_SYM = 158, /* JOIN_SYM */ + YYSYMBOL_KEYS = 159, /* KEYS */ + YYSYMBOL_KEY_SYM = 160, /* KEY_SYM */ + YYSYMBOL_KILL_SYM = 161, /* KILL_SYM */ + YYSYMBOL_LAG_SYM = 162, /* LAG_SYM */ + YYSYMBOL_LEADING = 163, /* LEADING */ + YYSYMBOL_LEAD_SYM = 164, /* LEAD_SYM */ + YYSYMBOL_LEAVE_SYM = 165, /* LEAVE_SYM */ + YYSYMBOL_LEFT = 166, /* LEFT */ + YYSYMBOL_LIKE = 167, /* LIKE */ + YYSYMBOL_LIMIT = 168, /* LIMIT */ + YYSYMBOL_LINEAR_SYM = 169, /* LINEAR_SYM */ + YYSYMBOL_LINES = 170, /* LINES */ + YYSYMBOL_LOAD = 171, /* LOAD */ + YYSYMBOL_LOCATOR_SYM = 172, /* LOCATOR_SYM */ + YYSYMBOL_LOCK_SYM = 173, /* LOCK_SYM */ + YYSYMBOL_LONGBLOB = 174, /* LONGBLOB */ + YYSYMBOL_LONG_SYM = 175, /* LONG_SYM */ + YYSYMBOL_LONGTEXT = 176, /* LONGTEXT */ + YYSYMBOL_LOOP_SYM = 177, /* LOOP_SYM */ + YYSYMBOL_LOW_PRIORITY = 178, /* LOW_PRIORITY */ + YYSYMBOL_MASTER_SSL_VERIFY_SERVER_CERT_SYM = 179, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + YYSYMBOL_MATCH = 180, /* MATCH */ + YYSYMBOL_MAX_SYM = 181, /* MAX_SYM */ + YYSYMBOL_MAXVALUE_SYM = 182, /* MAXVALUE_SYM */ + YYSYMBOL_MEDIAN_SYM = 183, /* MEDIAN_SYM */ + YYSYMBOL_MEDIUMBLOB = 184, /* MEDIUMBLOB */ + YYSYMBOL_MEDIUMINT = 185, /* MEDIUMINT */ + YYSYMBOL_MEDIUMTEXT = 186, /* MEDIUMTEXT */ + YYSYMBOL_MIN_SYM = 187, /* MIN_SYM */ + YYSYMBOL_MINUS_ORACLE_SYM = 188, /* MINUS_ORACLE_SYM */ + YYSYMBOL_MINUTE_MICROSECOND_SYM = 189, /* MINUTE_MICROSECOND_SYM */ + YYSYMBOL_MINUTE_SECOND_SYM = 190, /* MINUTE_SECOND_SYM */ + YYSYMBOL_MODIFIES_SYM = 191, /* MODIFIES_SYM */ + YYSYMBOL_MOD_SYM = 192, /* MOD_SYM */ + YYSYMBOL_NATURAL = 193, /* NATURAL */ + YYSYMBOL_NEG = 194, /* NEG */ + YYSYMBOL_NESTED_SYM = 195, /* NESTED_SYM */ + YYSYMBOL_NOT_SYM = 196, /* NOT_SYM */ + YYSYMBOL_NO_WRITE_TO_BINLOG = 197, /* NO_WRITE_TO_BINLOG */ + YYSYMBOL_NOW_SYM = 198, /* NOW_SYM */ + YYSYMBOL_NTH_VALUE_SYM = 199, /* NTH_VALUE_SYM */ + YYSYMBOL_NTILE_SYM = 200, /* NTILE_SYM */ + YYSYMBOL_NULL_SYM = 201, /* NULL_SYM */ + YYSYMBOL_NUMERIC_SYM = 202, /* NUMERIC_SYM */ + YYSYMBOL_ON = 203, /* ON */ + YYSYMBOL_OPTIMIZE = 204, /* OPTIMIZE */ + YYSYMBOL_OPTIONALLY = 205, /* OPTIONALLY */ + YYSYMBOL_ORDER_SYM = 206, /* ORDER_SYM */ + YYSYMBOL_ORDINALITY_SYM = 207, /* ORDINALITY_SYM */ + YYSYMBOL_OR_SYM = 208, /* OR_SYM */ + YYSYMBOL_OTHERS_ORACLE_SYM = 209, /* OTHERS_ORACLE_SYM */ + YYSYMBOL_OUTER = 210, /* OUTER */ + YYSYMBOL_OUTFILE = 211, /* OUTFILE */ + YYSYMBOL_OUT_SYM = 212, /* OUT_SYM */ + YYSYMBOL_OVER_SYM = 213, /* OVER_SYM */ + YYSYMBOL_PACKAGE_ORACLE_SYM = 214, /* PACKAGE_ORACLE_SYM */ + YYSYMBOL_PAGE_CHECKSUM_SYM = 215, /* PAGE_CHECKSUM_SYM */ + YYSYMBOL_PARSE_VCOL_EXPR_SYM = 216, /* PARSE_VCOL_EXPR_SYM */ + YYSYMBOL_PARTITION_SYM = 217, /* PARTITION_SYM */ + YYSYMBOL_PATH_SYM = 218, /* PATH_SYM */ + YYSYMBOL_PERCENTILE_CONT_SYM = 219, /* PERCENTILE_CONT_SYM */ + YYSYMBOL_PERCENTILE_DISC_SYM = 220, /* PERCENTILE_DISC_SYM */ + YYSYMBOL_PERCENT_RANK_SYM = 221, /* PERCENT_RANK_SYM */ + YYSYMBOL_PORTION_SYM = 222, /* PORTION_SYM */ + YYSYMBOL_POSITION_SYM = 223, /* POSITION_SYM */ + YYSYMBOL_PRECISION = 224, /* PRECISION */ + YYSYMBOL_PRIMARY_SYM = 225, /* PRIMARY_SYM */ + YYSYMBOL_PROCEDURE_SYM = 226, /* PROCEDURE_SYM */ + YYSYMBOL_PURGE = 227, /* PURGE */ + YYSYMBOL_RAISE_ORACLE_SYM = 228, /* RAISE_ORACLE_SYM */ + YYSYMBOL_RANGE_SYM = 229, /* RANGE_SYM */ + YYSYMBOL_RANK_SYM = 230, /* RANK_SYM */ + YYSYMBOL_READS_SYM = 231, /* READS_SYM */ + YYSYMBOL_READ_SYM = 232, /* READ_SYM */ + YYSYMBOL_READ_WRITE_SYM = 233, /* READ_WRITE_SYM */ + YYSYMBOL_REAL = 234, /* REAL */ + YYSYMBOL_RECURSIVE_SYM = 235, /* RECURSIVE_SYM */ + YYSYMBOL_REFERENCES = 236, /* REFERENCES */ + YYSYMBOL_REF_SYSTEM_ID_SYM = 237, /* REF_SYSTEM_ID_SYM */ + YYSYMBOL_REGEXP = 238, /* REGEXP */ + YYSYMBOL_RELEASE_SYM = 239, /* RELEASE_SYM */ + YYSYMBOL_RENAME = 240, /* RENAME */ + YYSYMBOL_REPEAT_SYM = 241, /* REPEAT_SYM */ + YYSYMBOL_REQUIRE_SYM = 242, /* REQUIRE_SYM */ + YYSYMBOL_RESIGNAL_SYM = 243, /* RESIGNAL_SYM */ + YYSYMBOL_RESTRICT = 244, /* RESTRICT */ + YYSYMBOL_RETURNING_SYM = 245, /* RETURNING_SYM */ + YYSYMBOL_RETURN_MARIADB_SYM = 246, /* RETURN_MARIADB_SYM */ + YYSYMBOL_RETURN_ORACLE_SYM = 247, /* RETURN_ORACLE_SYM */ + YYSYMBOL_REVOKE = 248, /* REVOKE */ + YYSYMBOL_RIGHT = 249, /* RIGHT */ + YYSYMBOL_ROW_NUMBER_SYM = 250, /* ROW_NUMBER_SYM */ + YYSYMBOL_ROWS_SYM = 251, /* ROWS_SYM */ + YYSYMBOL_ROWTYPE_ORACLE_SYM = 252, /* ROWTYPE_ORACLE_SYM */ + YYSYMBOL_SECOND_MICROSECOND_SYM = 253, /* SECOND_MICROSECOND_SYM */ + YYSYMBOL_SELECT_SYM = 254, /* SELECT_SYM */ + YYSYMBOL_SENSITIVE_SYM = 255, /* SENSITIVE_SYM */ + YYSYMBOL_SEPARATOR_SYM = 256, /* SEPARATOR_SYM */ + YYSYMBOL_SERVER_OPTIONS = 257, /* SERVER_OPTIONS */ + YYSYMBOL_SET = 258, /* SET */ + YYSYMBOL_SHOW = 259, /* SHOW */ + YYSYMBOL_SIGNAL_SYM = 260, /* SIGNAL_SYM */ + YYSYMBOL_SMALLINT = 261, /* SMALLINT */ + YYSYMBOL_SPATIAL_SYM = 262, /* SPATIAL_SYM */ + YYSYMBOL_SPECIFIC_SYM = 263, /* SPECIFIC_SYM */ + YYSYMBOL_SQL_BIG_RESULT = 264, /* SQL_BIG_RESULT */ + YYSYMBOL_SQLEXCEPTION_SYM = 265, /* SQLEXCEPTION_SYM */ + YYSYMBOL_SQL_SMALL_RESULT = 266, /* SQL_SMALL_RESULT */ + YYSYMBOL_SQLSTATE_SYM = 267, /* SQLSTATE_SYM */ + YYSYMBOL_SQL_SYM = 268, /* SQL_SYM */ + YYSYMBOL_SQLWARNING_SYM = 269, /* SQLWARNING_SYM */ + YYSYMBOL_SSL_SYM = 270, /* SSL_SYM */ + YYSYMBOL_STARTING = 271, /* STARTING */ + YYSYMBOL_STATS_AUTO_RECALC_SYM = 272, /* STATS_AUTO_RECALC_SYM */ + YYSYMBOL_STATS_PERSISTENT_SYM = 273, /* STATS_PERSISTENT_SYM */ + YYSYMBOL_STATS_SAMPLE_PAGES_SYM = 274, /* STATS_SAMPLE_PAGES_SYM */ + YYSYMBOL_STDDEV_SAMP_SYM = 275, /* STDDEV_SAMP_SYM */ + YYSYMBOL_STD_SYM = 276, /* STD_SYM */ + YYSYMBOL_STRAIGHT_JOIN = 277, /* STRAIGHT_JOIN */ + YYSYMBOL_SUM_SYM = 278, /* SUM_SYM */ + YYSYMBOL_SYSDATE = 279, /* SYSDATE */ + YYSYMBOL_TABLE_REF_PRIORITY = 280, /* TABLE_REF_PRIORITY */ + YYSYMBOL_TABLE_SYM = 281, /* TABLE_SYM */ + YYSYMBOL_TERMINATED = 282, /* TERMINATED */ + YYSYMBOL_THEN_SYM = 283, /* THEN_SYM */ + YYSYMBOL_TINYBLOB = 284, /* TINYBLOB */ + YYSYMBOL_TINYINT = 285, /* TINYINT */ + YYSYMBOL_TINYTEXT = 286, /* TINYTEXT */ + YYSYMBOL_TO_SYM = 287, /* TO_SYM */ + YYSYMBOL_TRAILING = 288, /* TRAILING */ + YYSYMBOL_TRIGGER_SYM = 289, /* TRIGGER_SYM */ + YYSYMBOL_TRUE_SYM = 290, /* TRUE_SYM */ + YYSYMBOL_UNDO_SYM = 291, /* UNDO_SYM */ + YYSYMBOL_UNION_SYM = 292, /* UNION_SYM */ + YYSYMBOL_UNIQUE_SYM = 293, /* UNIQUE_SYM */ + YYSYMBOL_UNLOCK_SYM = 294, /* UNLOCK_SYM */ + YYSYMBOL_UNSIGNED = 295, /* UNSIGNED */ + YYSYMBOL_UPDATE_SYM = 296, /* UPDATE_SYM */ + YYSYMBOL_USAGE = 297, /* USAGE */ + YYSYMBOL_USE_SYM = 298, /* USE_SYM */ + YYSYMBOL_USING = 299, /* USING */ + YYSYMBOL_UTC_DATE_SYM = 300, /* UTC_DATE_SYM */ + YYSYMBOL_UTC_TIMESTAMP_SYM = 301, /* UTC_TIMESTAMP_SYM */ + YYSYMBOL_UTC_TIME_SYM = 302, /* UTC_TIME_SYM */ + YYSYMBOL_VALUES_IN_SYM = 303, /* VALUES_IN_SYM */ + YYSYMBOL_VALUES_LESS_SYM = 304, /* VALUES_LESS_SYM */ + YYSYMBOL_VALUES = 305, /* VALUES */ + YYSYMBOL_VARBINARY = 306, /* VARBINARY */ + YYSYMBOL_VARCHAR = 307, /* VARCHAR */ + YYSYMBOL_VARIANCE_SYM = 308, /* VARIANCE_SYM */ + YYSYMBOL_VAR_SAMP_SYM = 309, /* VAR_SAMP_SYM */ + YYSYMBOL_VARYING = 310, /* VARYING */ + YYSYMBOL_WHEN_SYM = 311, /* WHEN_SYM */ + YYSYMBOL_WHERE = 312, /* WHERE */ + YYSYMBOL_WHILE_SYM = 313, /* WHILE_SYM */ + YYSYMBOL_WITH = 314, /* WITH */ + YYSYMBOL_XOR = 315, /* XOR */ + YYSYMBOL_YEAR_MONTH_SYM = 316, /* YEAR_MONTH_SYM */ + YYSYMBOL_ZEROFILL = 317, /* ZEROFILL */ + YYSYMBOL_BODY_MARIADB_SYM = 318, /* BODY_MARIADB_SYM */ + YYSYMBOL_ELSEIF_ORACLE_SYM = 319, /* ELSEIF_ORACLE_SYM */ + YYSYMBOL_ELSIF_MARIADB_SYM = 320, /* ELSIF_MARIADB_SYM */ + YYSYMBOL_EXCEPTION_ORACLE_SYM = 321, /* EXCEPTION_ORACLE_SYM */ + YYSYMBOL_GOTO_MARIADB_SYM = 322, /* GOTO_MARIADB_SYM */ + YYSYMBOL_OTHERS_MARIADB_SYM = 323, /* OTHERS_MARIADB_SYM */ + YYSYMBOL_PACKAGE_MARIADB_SYM = 324, /* PACKAGE_MARIADB_SYM */ + YYSYMBOL_RAISE_MARIADB_SYM = 325, /* RAISE_MARIADB_SYM */ + YYSYMBOL_ROWTYPE_MARIADB_SYM = 326, /* ROWTYPE_MARIADB_SYM */ + YYSYMBOL_ROWNUM_SYM = 327, /* ROWNUM_SYM */ + YYSYMBOL_REPLACE = 328, /* REPLACE */ + YYSYMBOL_SUBSTRING = 329, /* SUBSTRING */ + YYSYMBOL_TRIM = 330, /* TRIM */ + YYSYMBOL_ACCOUNT_SYM = 331, /* ACCOUNT_SYM */ + YYSYMBOL_ACTION = 332, /* ACTION */ + YYSYMBOL_ADMIN_SYM = 333, /* ADMIN_SYM */ + YYSYMBOL_ADDDATE_SYM = 334, /* ADDDATE_SYM */ + YYSYMBOL_AFTER_SYM = 335, /* AFTER_SYM */ + YYSYMBOL_AGAINST = 336, /* AGAINST */ + YYSYMBOL_AGGREGATE_SYM = 337, /* AGGREGATE_SYM */ + YYSYMBOL_ALGORITHM_SYM = 338, /* ALGORITHM_SYM */ + YYSYMBOL_ALWAYS_SYM = 339, /* ALWAYS_SYM */ + YYSYMBOL_ANY_SYM = 340, /* ANY_SYM */ + YYSYMBOL_ASCII_SYM = 341, /* ASCII_SYM */ + YYSYMBOL_AT_SYM = 342, /* AT_SYM */ + YYSYMBOL_ATOMIC_SYM = 343, /* ATOMIC_SYM */ + YYSYMBOL_AUTHORS_SYM = 344, /* AUTHORS_SYM */ + YYSYMBOL_AUTOEXTEND_SIZE_SYM = 345, /* AUTOEXTEND_SIZE_SYM */ + YYSYMBOL_AUTO_INC = 346, /* AUTO_INC */ + YYSYMBOL_AUTO_SYM = 347, /* AUTO_SYM */ + YYSYMBOL_AVG_ROW_LENGTH = 348, /* AVG_ROW_LENGTH */ + YYSYMBOL_AVG_SYM = 349, /* AVG_SYM */ + YYSYMBOL_BACKUP_SYM = 350, /* BACKUP_SYM */ + YYSYMBOL_BEGIN_MARIADB_SYM = 351, /* BEGIN_MARIADB_SYM */ + YYSYMBOL_BEGIN_ORACLE_SYM = 352, /* BEGIN_ORACLE_SYM */ + YYSYMBOL_BINLOG_SYM = 353, /* BINLOG_SYM */ + YYSYMBOL_BIT_SYM = 354, /* BIT_SYM */ + YYSYMBOL_BLOCK_SYM = 355, /* BLOCK_SYM */ + YYSYMBOL_BOOL_SYM = 356, /* BOOL_SYM */ + YYSYMBOL_BOOLEAN_SYM = 357, /* BOOLEAN_SYM */ + YYSYMBOL_BTREE_SYM = 358, /* BTREE_SYM */ + YYSYMBOL_BYTE_SYM = 359, /* BYTE_SYM */ + YYSYMBOL_CACHE_SYM = 360, /* CACHE_SYM */ + YYSYMBOL_CASCADED = 361, /* CASCADED */ + YYSYMBOL_CATALOG_NAME_SYM = 362, /* CATALOG_NAME_SYM */ + YYSYMBOL_CHAIN_SYM = 363, /* CHAIN_SYM */ + YYSYMBOL_CHANGED = 364, /* CHANGED */ + YYSYMBOL_CHANNEL_SYM = 365, /* CHANNEL_SYM */ + YYSYMBOL_CHARSET = 366, /* CHARSET */ + YYSYMBOL_CHECKPOINT_SYM = 367, /* CHECKPOINT_SYM */ + YYSYMBOL_CHECKSUM_SYM = 368, /* CHECKSUM_SYM */ + YYSYMBOL_CIPHER_SYM = 369, /* CIPHER_SYM */ + YYSYMBOL_CLASS_ORIGIN_SYM = 370, /* CLASS_ORIGIN_SYM */ + YYSYMBOL_CLIENT_SYM = 371, /* CLIENT_SYM */ + YYSYMBOL_CLOB_MARIADB_SYM = 372, /* CLOB_MARIADB_SYM */ + YYSYMBOL_CLOB_ORACLE_SYM = 373, /* CLOB_ORACLE_SYM */ + YYSYMBOL_CLOSE_SYM = 374, /* CLOSE_SYM */ + YYSYMBOL_COALESCE = 375, /* COALESCE */ + YYSYMBOL_CODE_SYM = 376, /* CODE_SYM */ + YYSYMBOL_COLLATION_SYM = 377, /* COLLATION_SYM */ + YYSYMBOL_COLUMNS = 378, /* COLUMNS */ + YYSYMBOL_COLUMN_ADD_SYM = 379, /* COLUMN_ADD_SYM */ + YYSYMBOL_COLUMN_CHECK_SYM = 380, /* COLUMN_CHECK_SYM */ + YYSYMBOL_COLUMN_CREATE_SYM = 381, /* COLUMN_CREATE_SYM */ + YYSYMBOL_COLUMN_DELETE_SYM = 382, /* COLUMN_DELETE_SYM */ + YYSYMBOL_COLUMN_GET_SYM = 383, /* COLUMN_GET_SYM */ + YYSYMBOL_COLUMN_SYM = 384, /* COLUMN_SYM */ + YYSYMBOL_COLUMN_NAME_SYM = 385, /* COLUMN_NAME_SYM */ + YYSYMBOL_COMMENT_SYM = 386, /* COMMENT_SYM */ + YYSYMBOL_COMMITTED_SYM = 387, /* COMMITTED_SYM */ + YYSYMBOL_COMMIT_SYM = 388, /* COMMIT_SYM */ + YYSYMBOL_COMPACT_SYM = 389, /* COMPACT_SYM */ + YYSYMBOL_COMPLETION_SYM = 390, /* COMPLETION_SYM */ + YYSYMBOL_COMPRESSED_SYM = 391, /* COMPRESSED_SYM */ + YYSYMBOL_CONCURRENT = 392, /* CONCURRENT */ + YYSYMBOL_CONNECTION_SYM = 393, /* CONNECTION_SYM */ + YYSYMBOL_CONSISTENT_SYM = 394, /* CONSISTENT_SYM */ + YYSYMBOL_CONSTRAINT_CATALOG_SYM = 395, /* CONSTRAINT_CATALOG_SYM */ + YYSYMBOL_CONSTRAINT_NAME_SYM = 396, /* CONSTRAINT_NAME_SYM */ + YYSYMBOL_CONSTRAINT_SCHEMA_SYM = 397, /* CONSTRAINT_SCHEMA_SYM */ + YYSYMBOL_CONTAINS_SYM = 398, /* CONTAINS_SYM */ + YYSYMBOL_CONTEXT_SYM = 399, /* CONTEXT_SYM */ + YYSYMBOL_CONTRIBUTORS_SYM = 400, /* CONTRIBUTORS_SYM */ + YYSYMBOL_CPU_SYM = 401, /* CPU_SYM */ + YYSYMBOL_CUBE_SYM = 402, /* CUBE_SYM */ + YYSYMBOL_CURRENT_SYM = 403, /* CURRENT_SYM */ + YYSYMBOL_CURRENT_POS_SYM = 404, /* CURRENT_POS_SYM */ + YYSYMBOL_CURSOR_NAME_SYM = 405, /* CURSOR_NAME_SYM */ + YYSYMBOL_CYCLE_SYM = 406, /* CYCLE_SYM */ + YYSYMBOL_DATAFILE_SYM = 407, /* DATAFILE_SYM */ + YYSYMBOL_DATA_SYM = 408, /* DATA_SYM */ + YYSYMBOL_DATETIME = 409, /* DATETIME */ + YYSYMBOL_DATE_SYM = 410, /* DATE_SYM */ + YYSYMBOL_DAY_SYM = 411, /* DAY_SYM */ + YYSYMBOL_DEALLOCATE_SYM = 412, /* DEALLOCATE_SYM */ + YYSYMBOL_DEFINER_SYM = 413, /* DEFINER_SYM */ + YYSYMBOL_DELAYED_SYM = 414, /* DELAYED_SYM */ + YYSYMBOL_DELAY_KEY_WRITE_SYM = 415, /* DELAY_KEY_WRITE_SYM */ + YYSYMBOL_DES_KEY_FILE = 416, /* DES_KEY_FILE */ + YYSYMBOL_DIAGNOSTICS_SYM = 417, /* DIAGNOSTICS_SYM */ + YYSYMBOL_DIRECTORY_SYM = 418, /* DIRECTORY_SYM */ + YYSYMBOL_DISABLE_SYM = 419, /* DISABLE_SYM */ + YYSYMBOL_DISCARD = 420, /* DISCARD */ + YYSYMBOL_DISK_SYM = 421, /* DISK_SYM */ + YYSYMBOL_DO_SYM = 422, /* DO_SYM */ + YYSYMBOL_DUMPFILE = 423, /* DUMPFILE */ + YYSYMBOL_DUPLICATE_SYM = 424, /* DUPLICATE_SYM */ + YYSYMBOL_DYNAMIC_SYM = 425, /* DYNAMIC_SYM */ + YYSYMBOL_ENABLE_SYM = 426, /* ENABLE_SYM */ + YYSYMBOL_END = 427, /* END */ + YYSYMBOL_ENDS_SYM = 428, /* ENDS_SYM */ + YYSYMBOL_ENGINES_SYM = 429, /* ENGINES_SYM */ + YYSYMBOL_ENGINE_SYM = 430, /* ENGINE_SYM */ + YYSYMBOL_ENUM = 431, /* ENUM */ + YYSYMBOL_ERROR_SYM = 432, /* ERROR_SYM */ + YYSYMBOL_ERRORS = 433, /* ERRORS */ + YYSYMBOL_ESCAPE_SYM = 434, /* ESCAPE_SYM */ + YYSYMBOL_EVENTS_SYM = 435, /* EVENTS_SYM */ + YYSYMBOL_EVENT_SYM = 436, /* EVENT_SYM */ + YYSYMBOL_EVERY_SYM = 437, /* EVERY_SYM */ + YYSYMBOL_EXCHANGE_SYM = 438, /* EXCHANGE_SYM */ + YYSYMBOL_EXAMINED_SYM = 439, /* EXAMINED_SYM */ + YYSYMBOL_EXCLUDE_SYM = 440, /* EXCLUDE_SYM */ + YYSYMBOL_EXECUTE_SYM = 441, /* EXECUTE_SYM */ + YYSYMBOL_EXCEPTION_MARIADB_SYM = 442, /* EXCEPTION_MARIADB_SYM */ + YYSYMBOL_EXIT_MARIADB_SYM = 443, /* EXIT_MARIADB_SYM */ + YYSYMBOL_EXIT_ORACLE_SYM = 444, /* EXIT_ORACLE_SYM */ + YYSYMBOL_EXPANSION_SYM = 445, /* EXPANSION_SYM */ + YYSYMBOL_EXPIRE_SYM = 446, /* EXPIRE_SYM */ + YYSYMBOL_EXPORT_SYM = 447, /* EXPORT_SYM */ + YYSYMBOL_EXTENDED_SYM = 448, /* EXTENDED_SYM */ + YYSYMBOL_EXTENT_SIZE_SYM = 449, /* EXTENT_SIZE_SYM */ + YYSYMBOL_FAST_SYM = 450, /* FAST_SYM */ + YYSYMBOL_FAULTS_SYM = 451, /* FAULTS_SYM */ + YYSYMBOL_FEDERATED_SYM = 452, /* FEDERATED_SYM */ + YYSYMBOL_FILE_SYM = 453, /* FILE_SYM */ + YYSYMBOL_FIRST_SYM = 454, /* FIRST_SYM */ + YYSYMBOL_FIXED_SYM = 455, /* FIXED_SYM */ + YYSYMBOL_FLUSH_SYM = 456, /* FLUSH_SYM */ + YYSYMBOL_FOLLOWS_SYM = 457, /* FOLLOWS_SYM */ + YYSYMBOL_FOLLOWING_SYM = 458, /* FOLLOWING_SYM */ + YYSYMBOL_FORCE_SYM = 459, /* FORCE_SYM */ + YYSYMBOL_FORMAT_SYM = 460, /* FORMAT_SYM */ + YYSYMBOL_FOUND_SYM = 461, /* FOUND_SYM */ + YYSYMBOL_FULL = 462, /* FULL */ + YYSYMBOL_FUNCTION_SYM = 463, /* FUNCTION_SYM */ + YYSYMBOL_GENERAL = 464, /* GENERAL */ + YYSYMBOL_GENERATED_SYM = 465, /* GENERATED_SYM */ + YYSYMBOL_GET_FORMAT = 466, /* GET_FORMAT */ + YYSYMBOL_GET_SYM = 467, /* GET_SYM */ + YYSYMBOL_GLOBAL_SYM = 468, /* GLOBAL_SYM */ + YYSYMBOL_GRANTS = 469, /* GRANTS */ + YYSYMBOL_HANDLER_SYM = 470, /* HANDLER_SYM */ + YYSYMBOL_HARD_SYM = 471, /* HARD_SYM */ + YYSYMBOL_HASH_SYM = 472, /* HASH_SYM */ + YYSYMBOL_HELP_SYM = 473, /* HELP_SYM */ + YYSYMBOL_HIGH_PRIORITY = 474, /* HIGH_PRIORITY */ + YYSYMBOL_HISTORY_SYM = 475, /* HISTORY_SYM */ + YYSYMBOL_HOST_SYM = 476, /* HOST_SYM */ + YYSYMBOL_HOSTS_SYM = 477, /* HOSTS_SYM */ + YYSYMBOL_HOUR_SYM = 478, /* HOUR_SYM */ + YYSYMBOL_ID_SYM = 479, /* ID_SYM */ + YYSYMBOL_IDENTIFIED_SYM = 480, /* IDENTIFIED_SYM */ + YYSYMBOL_IGNORE_SERVER_IDS_SYM = 481, /* IGNORE_SERVER_IDS_SYM */ + YYSYMBOL_IMMEDIATE_SYM = 482, /* IMMEDIATE_SYM */ + YYSYMBOL_IMPORT = 483, /* IMPORT */ + YYSYMBOL_INCREMENT_SYM = 484, /* INCREMENT_SYM */ + YYSYMBOL_INDEXES = 485, /* INDEXES */ + YYSYMBOL_INITIAL_SIZE_SYM = 486, /* INITIAL_SIZE_SYM */ + YYSYMBOL_INSERT_METHOD = 487, /* INSERT_METHOD */ + YYSYMBOL_INSTALL_SYM = 488, /* INSTALL_SYM */ + YYSYMBOL_INVOKER_SYM = 489, /* INVOKER_SYM */ + YYSYMBOL_IO_SYM = 490, /* IO_SYM */ + YYSYMBOL_IPC_SYM = 491, /* IPC_SYM */ + YYSYMBOL_ISOLATION = 492, /* ISOLATION */ + YYSYMBOL_ISOPEN_SYM = 493, /* ISOPEN_SYM */ + YYSYMBOL_ISSUER_SYM = 494, /* ISSUER_SYM */ + YYSYMBOL_INVISIBLE_SYM = 495, /* INVISIBLE_SYM */ + YYSYMBOL_JSON_SYM = 496, /* JSON_SYM */ + YYSYMBOL_KEY_BLOCK_SIZE = 497, /* KEY_BLOCK_SIZE */ + YYSYMBOL_LANGUAGE_SYM = 498, /* LANGUAGE_SYM */ + YYSYMBOL_LAST_SYM = 499, /* LAST_SYM */ + YYSYMBOL_LAST_VALUE = 500, /* LAST_VALUE */ + YYSYMBOL_LASTVAL_SYM = 501, /* LASTVAL_SYM */ + YYSYMBOL_LEAVES = 502, /* LEAVES */ + YYSYMBOL_LESS_SYM = 503, /* LESS_SYM */ + YYSYMBOL_LEVEL_SYM = 504, /* LEVEL_SYM */ + YYSYMBOL_LIST_SYM = 505, /* LIST_SYM */ + YYSYMBOL_LOCAL_SYM = 506, /* LOCAL_SYM */ + YYSYMBOL_LOCKED_SYM = 507, /* LOCKED_SYM */ + YYSYMBOL_LOCKS_SYM = 508, /* LOCKS_SYM */ + YYSYMBOL_LOGFILE_SYM = 509, /* LOGFILE_SYM */ + YYSYMBOL_LOGS_SYM = 510, /* LOGS_SYM */ + YYSYMBOL_MASTER_CONNECT_RETRY_SYM = 511, /* MASTER_CONNECT_RETRY_SYM */ + YYSYMBOL_MASTER_DELAY_SYM = 512, /* MASTER_DELAY_SYM */ + YYSYMBOL_MASTER_GTID_POS_SYM = 513, /* MASTER_GTID_POS_SYM */ + YYSYMBOL_MASTER_HOST_SYM = 514, /* MASTER_HOST_SYM */ + YYSYMBOL_MASTER_LOG_FILE_SYM = 515, /* MASTER_LOG_FILE_SYM */ + YYSYMBOL_MASTER_LOG_POS_SYM = 516, /* MASTER_LOG_POS_SYM */ + YYSYMBOL_MASTER_PASSWORD_SYM = 517, /* MASTER_PASSWORD_SYM */ + YYSYMBOL_MASTER_PORT_SYM = 518, /* MASTER_PORT_SYM */ + YYSYMBOL_MASTER_SERVER_ID_SYM = 519, /* MASTER_SERVER_ID_SYM */ + YYSYMBOL_MASTER_SSL_CAPATH_SYM = 520, /* MASTER_SSL_CAPATH_SYM */ + YYSYMBOL_MASTER_SSL_CA_SYM = 521, /* MASTER_SSL_CA_SYM */ + YYSYMBOL_MASTER_SSL_CERT_SYM = 522, /* MASTER_SSL_CERT_SYM */ + YYSYMBOL_MASTER_SSL_CIPHER_SYM = 523, /* MASTER_SSL_CIPHER_SYM */ + YYSYMBOL_MASTER_SSL_CRL_SYM = 524, /* MASTER_SSL_CRL_SYM */ + YYSYMBOL_MASTER_SSL_CRLPATH_SYM = 525, /* MASTER_SSL_CRLPATH_SYM */ + YYSYMBOL_MASTER_SSL_KEY_SYM = 526, /* MASTER_SSL_KEY_SYM */ + YYSYMBOL_MASTER_SSL_SYM = 527, /* MASTER_SSL_SYM */ + YYSYMBOL_MASTER_SYM = 528, /* MASTER_SYM */ + YYSYMBOL_MASTER_USER_SYM = 529, /* MASTER_USER_SYM */ + YYSYMBOL_MASTER_USE_GTID_SYM = 530, /* MASTER_USE_GTID_SYM */ + YYSYMBOL_MASTER_HEARTBEAT_PERIOD_SYM = 531, /* MASTER_HEARTBEAT_PERIOD_SYM */ + YYSYMBOL_MASTER_DEMOTE_TO_SLAVE_SYM = 532, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + YYSYMBOL_MAX_CONNECTIONS_PER_HOUR = 533, /* MAX_CONNECTIONS_PER_HOUR */ + YYSYMBOL_MAX_QUERIES_PER_HOUR = 534, /* MAX_QUERIES_PER_HOUR */ + YYSYMBOL_MAX_ROWS = 535, /* MAX_ROWS */ + YYSYMBOL_MAX_SIZE_SYM = 536, /* MAX_SIZE_SYM */ + YYSYMBOL_MAX_UPDATES_PER_HOUR = 537, /* MAX_UPDATES_PER_HOUR */ + YYSYMBOL_MAX_STATEMENT_TIME_SYM = 538, /* MAX_STATEMENT_TIME_SYM */ + YYSYMBOL_MAX_USER_CONNECTIONS_SYM = 539, /* MAX_USER_CONNECTIONS_SYM */ + YYSYMBOL_MEDIUM_SYM = 540, /* MEDIUM_SYM */ + YYSYMBOL_MEMORY_SYM = 541, /* MEMORY_SYM */ + YYSYMBOL_MERGE_SYM = 542, /* MERGE_SYM */ + YYSYMBOL_MESSAGE_TEXT_SYM = 543, /* MESSAGE_TEXT_SYM */ + YYSYMBOL_MICROSECOND_SYM = 544, /* MICROSECOND_SYM */ + YYSYMBOL_MIGRATE_SYM = 545, /* MIGRATE_SYM */ + YYSYMBOL_MINUTE_SYM = 546, /* MINUTE_SYM */ + YYSYMBOL_MINVALUE_SYM = 547, /* MINVALUE_SYM */ + YYSYMBOL_MIN_ROWS = 548, /* MIN_ROWS */ + YYSYMBOL_MODE_SYM = 549, /* MODE_SYM */ + YYSYMBOL_MODIFY_SYM = 550, /* MODIFY_SYM */ + YYSYMBOL_MONITOR_SYM = 551, /* MONITOR_SYM */ + YYSYMBOL_MONTH_SYM = 552, /* MONTH_SYM */ + YYSYMBOL_MUTEX_SYM = 553, /* MUTEX_SYM */ + YYSYMBOL_MYSQL_SYM = 554, /* MYSQL_SYM */ + YYSYMBOL_MYSQL_ERRNO_SYM = 555, /* MYSQL_ERRNO_SYM */ + YYSYMBOL_NAMES_SYM = 556, /* NAMES_SYM */ + YYSYMBOL_NAME_SYM = 557, /* NAME_SYM */ + YYSYMBOL_NATIONAL_SYM = 558, /* NATIONAL_SYM */ + YYSYMBOL_NCHAR_SYM = 559, /* NCHAR_SYM */ + YYSYMBOL_NEVER_SYM = 560, /* NEVER_SYM */ + YYSYMBOL_NEXT_SYM = 561, /* NEXT_SYM */ + YYSYMBOL_NEXTVAL_SYM = 562, /* NEXTVAL_SYM */ + YYSYMBOL_NOCACHE_SYM = 563, /* NOCACHE_SYM */ + YYSYMBOL_NOCYCLE_SYM = 564, /* NOCYCLE_SYM */ + YYSYMBOL_NODEGROUP_SYM = 565, /* NODEGROUP_SYM */ + YYSYMBOL_NONE_SYM = 566, /* NONE_SYM */ + YYSYMBOL_NOTFOUND_SYM = 567, /* NOTFOUND_SYM */ + YYSYMBOL_NO_SYM = 568, /* NO_SYM */ + YYSYMBOL_NOMAXVALUE_SYM = 569, /* NOMAXVALUE_SYM */ + YYSYMBOL_NOMINVALUE_SYM = 570, /* NOMINVALUE_SYM */ + YYSYMBOL_NO_WAIT_SYM = 571, /* NO_WAIT_SYM */ + YYSYMBOL_NOWAIT_SYM = 572, /* NOWAIT_SYM */ + YYSYMBOL_NUMBER_MARIADB_SYM = 573, /* NUMBER_MARIADB_SYM */ + YYSYMBOL_NUMBER_ORACLE_SYM = 574, /* NUMBER_ORACLE_SYM */ + YYSYMBOL_NVARCHAR_SYM = 575, /* NVARCHAR_SYM */ + YYSYMBOL_OF_SYM = 576, /* OF_SYM */ + YYSYMBOL_OFFSET_SYM = 577, /* OFFSET_SYM */ + YYSYMBOL_OLD_PASSWORD_SYM = 578, /* OLD_PASSWORD_SYM */ + YYSYMBOL_ONE_SYM = 579, /* ONE_SYM */ + YYSYMBOL_ONLY_SYM = 580, /* ONLY_SYM */ + YYSYMBOL_ONLINE_SYM = 581, /* ONLINE_SYM */ + YYSYMBOL_OPEN_SYM = 582, /* OPEN_SYM */ + YYSYMBOL_OPTIONS_SYM = 583, /* OPTIONS_SYM */ + YYSYMBOL_OPTION = 584, /* OPTION */ + YYSYMBOL_OVERLAPS_SYM = 585, /* OVERLAPS_SYM */ + YYSYMBOL_OWNER_SYM = 586, /* OWNER_SYM */ + YYSYMBOL_PACK_KEYS_SYM = 587, /* PACK_KEYS_SYM */ + YYSYMBOL_PAGE_SYM = 588, /* PAGE_SYM */ + YYSYMBOL_PARSER_SYM = 589, /* PARSER_SYM */ + YYSYMBOL_PARTIAL = 590, /* PARTIAL */ + YYSYMBOL_PARTITIONS_SYM = 591, /* PARTITIONS_SYM */ + YYSYMBOL_PARTITIONING_SYM = 592, /* PARTITIONING_SYM */ + YYSYMBOL_PASSWORD_SYM = 593, /* PASSWORD_SYM */ + YYSYMBOL_PERIOD_SYM = 594, /* PERIOD_SYM */ + YYSYMBOL_PERSISTENT_SYM = 595, /* PERSISTENT_SYM */ + YYSYMBOL_PHASE_SYM = 596, /* PHASE_SYM */ + YYSYMBOL_PLUGINS_SYM = 597, /* PLUGINS_SYM */ + YYSYMBOL_PLUGIN_SYM = 598, /* PLUGIN_SYM */ + YYSYMBOL_PORT_SYM = 599, /* PORT_SYM */ + YYSYMBOL_PRECEDES_SYM = 600, /* PRECEDES_SYM */ + YYSYMBOL_PRECEDING_SYM = 601, /* PRECEDING_SYM */ + YYSYMBOL_PREPARE_SYM = 602, /* PREPARE_SYM */ + YYSYMBOL_PRESERVE_SYM = 603, /* PRESERVE_SYM */ + YYSYMBOL_PREV_SYM = 604, /* PREV_SYM */ + YYSYMBOL_PREVIOUS_SYM = 605, /* PREVIOUS_SYM */ + YYSYMBOL_PRIVILEGES = 606, /* PRIVILEGES */ + YYSYMBOL_PROCESS = 607, /* PROCESS */ + YYSYMBOL_PROCESSLIST_SYM = 608, /* PROCESSLIST_SYM */ + YYSYMBOL_PROFILE_SYM = 609, /* PROFILE_SYM */ + YYSYMBOL_PROFILES_SYM = 610, /* PROFILES_SYM */ + YYSYMBOL_PROXY_SYM = 611, /* PROXY_SYM */ + YYSYMBOL_QUARTER_SYM = 612, /* QUARTER_SYM */ + YYSYMBOL_QUERY_SYM = 613, /* QUERY_SYM */ + YYSYMBOL_QUICK = 614, /* QUICK */ + YYSYMBOL_RAW_MARIADB_SYM = 615, /* RAW_MARIADB_SYM */ + YYSYMBOL_RAW_ORACLE_SYM = 616, /* RAW_ORACLE_SYM */ + YYSYMBOL_READ_ONLY_SYM = 617, /* READ_ONLY_SYM */ + YYSYMBOL_REBUILD_SYM = 618, /* REBUILD_SYM */ + YYSYMBOL_RECOVER_SYM = 619, /* RECOVER_SYM */ + YYSYMBOL_REDOFILE_SYM = 620, /* REDOFILE_SYM */ + YYSYMBOL_REDO_BUFFER_SIZE_SYM = 621, /* REDO_BUFFER_SIZE_SYM */ + YYSYMBOL_REDUNDANT_SYM = 622, /* REDUNDANT_SYM */ + YYSYMBOL_RELAY = 623, /* RELAY */ + YYSYMBOL_RELAYLOG_SYM = 624, /* RELAYLOG_SYM */ + YYSYMBOL_RELAY_LOG_FILE_SYM = 625, /* RELAY_LOG_FILE_SYM */ + YYSYMBOL_RELAY_LOG_POS_SYM = 626, /* RELAY_LOG_POS_SYM */ + YYSYMBOL_RELAY_THREAD = 627, /* RELAY_THREAD */ + YYSYMBOL_RELOAD = 628, /* RELOAD */ + YYSYMBOL_REMOVE_SYM = 629, /* REMOVE_SYM */ + YYSYMBOL_REORGANIZE_SYM = 630, /* REORGANIZE_SYM */ + YYSYMBOL_REPAIR = 631, /* REPAIR */ + YYSYMBOL_REPEATABLE_SYM = 632, /* REPEATABLE_SYM */ + YYSYMBOL_REPLAY_SYM = 633, /* REPLAY_SYM */ + YYSYMBOL_REPLICATION = 634, /* REPLICATION */ + YYSYMBOL_RESET_SYM = 635, /* RESET_SYM */ + YYSYMBOL_RESTART_SYM = 636, /* RESTART_SYM */ + YYSYMBOL_RESOURCES = 637, /* RESOURCES */ + YYSYMBOL_RESTORE_SYM = 638, /* RESTORE_SYM */ + YYSYMBOL_RESUME_SYM = 639, /* RESUME_SYM */ + YYSYMBOL_RETURNED_SQLSTATE_SYM = 640, /* RETURNED_SQLSTATE_SYM */ + YYSYMBOL_RETURNS_SYM = 641, /* RETURNS_SYM */ + YYSYMBOL_REUSE_SYM = 642, /* REUSE_SYM */ + YYSYMBOL_REVERSE_SYM = 643, /* REVERSE_SYM */ + YYSYMBOL_ROLE_SYM = 644, /* ROLE_SYM */ + YYSYMBOL_ROLLBACK_SYM = 645, /* ROLLBACK_SYM */ + YYSYMBOL_ROLLUP_SYM = 646, /* ROLLUP_SYM */ + YYSYMBOL_ROUTINE_SYM = 647, /* ROUTINE_SYM */ + YYSYMBOL_ROWCOUNT_SYM = 648, /* ROWCOUNT_SYM */ + YYSYMBOL_ROW_SYM = 649, /* ROW_SYM */ + YYSYMBOL_ROW_COUNT_SYM = 650, /* ROW_COUNT_SYM */ + YYSYMBOL_ROW_FORMAT_SYM = 651, /* ROW_FORMAT_SYM */ + YYSYMBOL_RTREE_SYM = 652, /* RTREE_SYM */ + YYSYMBOL_SAVEPOINT_SYM = 653, /* SAVEPOINT_SYM */ + YYSYMBOL_SCHEDULE_SYM = 654, /* SCHEDULE_SYM */ + YYSYMBOL_SCHEMA_NAME_SYM = 655, /* SCHEMA_NAME_SYM */ + YYSYMBOL_SECOND_SYM = 656, /* SECOND_SYM */ + YYSYMBOL_SECURITY_SYM = 657, /* SECURITY_SYM */ + YYSYMBOL_SEQUENCE_SYM = 658, /* SEQUENCE_SYM */ + YYSYMBOL_SERIALIZABLE_SYM = 659, /* SERIALIZABLE_SYM */ + YYSYMBOL_SERIAL_SYM = 660, /* SERIAL_SYM */ + YYSYMBOL_SESSION_SYM = 661, /* SESSION_SYM */ + YYSYMBOL_SERVER_SYM = 662, /* SERVER_SYM */ + YYSYMBOL_SETVAL_SYM = 663, /* SETVAL_SYM */ + YYSYMBOL_SHARE_SYM = 664, /* SHARE_SYM */ + YYSYMBOL_SHUTDOWN = 665, /* SHUTDOWN */ + YYSYMBOL_SIGNED_SYM = 666, /* SIGNED_SYM */ + YYSYMBOL_SIMPLE_SYM = 667, /* SIMPLE_SYM */ + YYSYMBOL_SKIP_SYM = 668, /* SKIP_SYM */ + YYSYMBOL_SLAVE = 669, /* SLAVE */ + YYSYMBOL_SLAVES = 670, /* SLAVES */ + YYSYMBOL_SLAVE_POS_SYM = 671, /* SLAVE_POS_SYM */ + YYSYMBOL_SLOW = 672, /* SLOW */ + YYSYMBOL_SNAPSHOT_SYM = 673, /* SNAPSHOT_SYM */ + YYSYMBOL_SOCKET_SYM = 674, /* SOCKET_SYM */ + YYSYMBOL_SOFT_SYM = 675, /* SOFT_SYM */ + YYSYMBOL_SONAME_SYM = 676, /* SONAME_SYM */ + YYSYMBOL_SOUNDS_SYM = 677, /* SOUNDS_SYM */ + YYSYMBOL_SOURCE_SYM = 678, /* SOURCE_SYM */ + YYSYMBOL_SQL_BUFFER_RESULT = 679, /* SQL_BUFFER_RESULT */ + YYSYMBOL_SQL_CACHE_SYM = 680, /* SQL_CACHE_SYM */ + YYSYMBOL_SQL_CALC_FOUND_ROWS = 681, /* SQL_CALC_FOUND_ROWS */ + YYSYMBOL_SQL_NO_CACHE_SYM = 682, /* SQL_NO_CACHE_SYM */ + YYSYMBOL_SQL_THREAD = 683, /* SQL_THREAD */ + YYSYMBOL_STAGE_SYM = 684, /* STAGE_SYM */ + YYSYMBOL_STARTS_SYM = 685, /* STARTS_SYM */ + YYSYMBOL_START_SYM = 686, /* START_SYM */ + YYSYMBOL_STATEMENT_SYM = 687, /* STATEMENT_SYM */ + YYSYMBOL_STATUS_SYM = 688, /* STATUS_SYM */ + YYSYMBOL_STOP_SYM = 689, /* STOP_SYM */ + YYSYMBOL_STORAGE_SYM = 690, /* STORAGE_SYM */ + YYSYMBOL_STORED_SYM = 691, /* STORED_SYM */ + YYSYMBOL_STRING_SYM = 692, /* STRING_SYM */ + YYSYMBOL_SUBCLASS_ORIGIN_SYM = 693, /* SUBCLASS_ORIGIN_SYM */ + YYSYMBOL_SUBDATE_SYM = 694, /* SUBDATE_SYM */ + YYSYMBOL_SUBJECT_SYM = 695, /* SUBJECT_SYM */ + YYSYMBOL_SUBPARTITIONS_SYM = 696, /* SUBPARTITIONS_SYM */ + YYSYMBOL_SUBPARTITION_SYM = 697, /* SUBPARTITION_SYM */ + YYSYMBOL_SUPER_SYM = 698, /* SUPER_SYM */ + YYSYMBOL_SUSPEND_SYM = 699, /* SUSPEND_SYM */ + YYSYMBOL_SWAPS_SYM = 700, /* SWAPS_SYM */ + YYSYMBOL_SWITCHES_SYM = 701, /* SWITCHES_SYM */ + YYSYMBOL_SYSTEM = 702, /* SYSTEM */ + YYSYMBOL_SYSTEM_TIME_SYM = 703, /* SYSTEM_TIME_SYM */ + YYSYMBOL_TABLES = 704, /* TABLES */ + YYSYMBOL_TABLESPACE = 705, /* TABLESPACE */ + YYSYMBOL_TABLE_CHECKSUM_SYM = 706, /* TABLE_CHECKSUM_SYM */ + YYSYMBOL_TABLE_NAME_SYM = 707, /* TABLE_NAME_SYM */ + YYSYMBOL_TEMPORARY = 708, /* TEMPORARY */ + YYSYMBOL_TEMPTABLE_SYM = 709, /* TEMPTABLE_SYM */ + YYSYMBOL_TEXT_SYM = 710, /* TEXT_SYM */ + YYSYMBOL_THAN_SYM = 711, /* THAN_SYM */ + YYSYMBOL_TIES_SYM = 712, /* TIES_SYM */ + YYSYMBOL_TIMESTAMP = 713, /* TIMESTAMP */ + YYSYMBOL_TIMESTAMP_ADD = 714, /* TIMESTAMP_ADD */ + YYSYMBOL_TIMESTAMP_DIFF = 715, /* TIMESTAMP_DIFF */ + YYSYMBOL_TIME_SYM = 716, /* TIME_SYM */ + YYSYMBOL_TRANSACTION_SYM = 717, /* TRANSACTION_SYM */ + YYSYMBOL_TRANSACTIONAL_SYM = 718, /* TRANSACTIONAL_SYM */ + YYSYMBOL_THREADS_SYM = 719, /* THREADS_SYM */ + YYSYMBOL_TRIGGERS_SYM = 720, /* TRIGGERS_SYM */ + YYSYMBOL_TRIM_ORACLE = 721, /* TRIM_ORACLE */ + YYSYMBOL_TRUNCATE_SYM = 722, /* TRUNCATE_SYM */ + YYSYMBOL_TYPE_SYM = 723, /* TYPE_SYM */ + YYSYMBOL_UDF_RETURNS_SYM = 724, /* UDF_RETURNS_SYM */ + YYSYMBOL_UNBOUNDED_SYM = 725, /* UNBOUNDED_SYM */ + YYSYMBOL_UNCOMMITTED_SYM = 726, /* UNCOMMITTED_SYM */ + YYSYMBOL_UNDEFINED_SYM = 727, /* UNDEFINED_SYM */ + YYSYMBOL_UNDOFILE_SYM = 728, /* UNDOFILE_SYM */ + YYSYMBOL_UNDO_BUFFER_SIZE_SYM = 729, /* UNDO_BUFFER_SIZE_SYM */ + YYSYMBOL_UNICODE_SYM = 730, /* UNICODE_SYM */ + YYSYMBOL_UNINSTALL_SYM = 731, /* UNINSTALL_SYM */ + YYSYMBOL_UNKNOWN_SYM = 732, /* UNKNOWN_SYM */ + YYSYMBOL_UNTIL_SYM = 733, /* UNTIL_SYM */ + YYSYMBOL_UPGRADE_SYM = 734, /* UPGRADE_SYM */ + YYSYMBOL_USER_SYM = 735, /* USER_SYM */ + YYSYMBOL_USE_FRM = 736, /* USE_FRM */ + YYSYMBOL_VALUE_SYM = 737, /* VALUE_SYM */ + YYSYMBOL_VARCHAR2_MARIADB_SYM = 738, /* VARCHAR2_MARIADB_SYM */ + YYSYMBOL_VARCHAR2_ORACLE_SYM = 739, /* VARCHAR2_ORACLE_SYM */ + YYSYMBOL_VARIABLES = 740, /* VARIABLES */ + YYSYMBOL_VERSIONING_SYM = 741, /* VERSIONING_SYM */ + YYSYMBOL_VIA_SYM = 742, /* VIA_SYM */ + YYSYMBOL_VIEW_SYM = 743, /* VIEW_SYM */ + YYSYMBOL_VISIBLE_SYM = 744, /* VISIBLE_SYM */ + YYSYMBOL_VIRTUAL_SYM = 745, /* VIRTUAL_SYM */ + YYSYMBOL_WAIT_SYM = 746, /* WAIT_SYM */ + YYSYMBOL_WARNINGS = 747, /* WARNINGS */ + YYSYMBOL_WEEK_SYM = 748, /* WEEK_SYM */ + YYSYMBOL_WEIGHT_STRING_SYM = 749, /* WEIGHT_STRING_SYM */ + YYSYMBOL_WINDOW_SYM = 750, /* WINDOW_SYM */ + YYSYMBOL_WITHIN = 751, /* WITHIN */ + YYSYMBOL_WITHOUT = 752, /* WITHOUT */ + YYSYMBOL_WORK_SYM = 753, /* WORK_SYM */ + YYSYMBOL_WRAPPER_SYM = 754, /* WRAPPER_SYM */ + YYSYMBOL_WRITE_SYM = 755, /* WRITE_SYM */ + YYSYMBOL_X509_SYM = 756, /* X509_SYM */ + YYSYMBOL_XA_SYM = 757, /* XA_SYM */ + YYSYMBOL_XML_SYM = 758, /* XML_SYM */ + YYSYMBOL_YEAR_SYM = 759, /* YEAR_SYM */ + YYSYMBOL_CONDITIONLESS_JOIN = 760, /* CONDITIONLESS_JOIN */ + YYSYMBOL_ON_SYM = 761, /* ON_SYM */ + YYSYMBOL_PREC_BELOW_NOT = 762, /* PREC_BELOW_NOT */ + YYSYMBOL_763_ = 763, /* '=' */ + YYSYMBOL_764_ = 764, /* '>' */ + YYSYMBOL_765_ = 765, /* '<' */ + YYSYMBOL_766_ = 766, /* '|' */ + YYSYMBOL_767_ = 767, /* '&' */ + YYSYMBOL_768_ = 768, /* '-' */ + YYSYMBOL_769_ = 769, /* '+' */ + YYSYMBOL_770_ = 770, /* '*' */ + YYSYMBOL_771_ = 771, /* '/' */ + YYSYMBOL_772_ = 772, /* '%' */ + YYSYMBOL_773_ = 773, /* '^' */ + YYSYMBOL_774_ = 774, /* '~' */ + YYSYMBOL_SUBQUERY_AS_EXPR = 775, /* SUBQUERY_AS_EXPR */ + YYSYMBOL_PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 776, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + YYSYMBOL_USER = 777, /* USER */ + YYSYMBOL_PREC_BELOW_CONTRACTION_TOKEN2 = 778, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + YYSYMBOL_779_ = 779, /* '(' */ + YYSYMBOL_780_ = 780, /* ')' */ + YYSYMBOL_EMPTY_FROM_CLAUSE = 781, /* EMPTY_FROM_CLAUSE */ + YYSYMBOL_782_ = 782, /* ',' */ + YYSYMBOL_783_ = 783, /* '!' */ + YYSYMBOL_784_ = 784, /* '{' */ + YYSYMBOL_785_ = 785, /* '}' */ + YYSYMBOL_786_ = 786, /* ';' */ + YYSYMBOL_787_ = 787, /* '.' */ + YYSYMBOL_YYACCEPT = 788, /* $accept */ + YYSYMBOL_query = 789, /* query */ + YYSYMBOL_790_1 = 790, /* $@1 */ + YYSYMBOL_opt_end_of_input = 791, /* opt_end_of_input */ + YYSYMBOL_directly_executable_statement = 792, /* directly_executable_statement */ + YYSYMBOL_verb_clause = 793, /* verb_clause */ + YYSYMBOL_deallocate = 794, /* deallocate */ + YYSYMBOL_deallocate_or_drop = 795, /* deallocate_or_drop */ + YYSYMBOL_prepare = 796, /* prepare */ + YYSYMBOL_797_2 = 797, /* $@2 */ + YYSYMBOL_execute = 798, /* execute */ + YYSYMBOL_799_3 = 799, /* $@3 */ + YYSYMBOL_800_4 = 800, /* $@4 */ + YYSYMBOL_execute_using = 801, /* execute_using */ + YYSYMBOL_802_5 = 802, /* $@5 */ + YYSYMBOL_execute_params = 803, /* execute_params */ + YYSYMBOL_help = 804, /* help */ + YYSYMBOL_805_6 = 805, /* $@6 */ + YYSYMBOL_change = 806, /* change */ + YYSYMBOL_807_7 = 807, /* $@7 */ + YYSYMBOL_master_defs = 808, /* master_defs */ + YYSYMBOL_master_def = 809, /* master_def */ + YYSYMBOL_ignore_server_id_list = 810, /* ignore_server_id_list */ + YYSYMBOL_ignore_server_id = 811, /* ignore_server_id */ + YYSYMBOL_do_domain_id_list = 812, /* do_domain_id_list */ + YYSYMBOL_do_domain_id = 813, /* do_domain_id */ + YYSYMBOL_ignore_domain_id_list = 814, /* ignore_domain_id_list */ + YYSYMBOL_ignore_domain_id = 815, /* ignore_domain_id */ + YYSYMBOL_master_file_def = 816, /* master_file_def */ + YYSYMBOL_optional_connection_name = 817, /* optional_connection_name */ + YYSYMBOL_connection_name = 818, /* connection_name */ + YYSYMBOL_optional_for_channel = 819, /* optional_for_channel */ + YYSYMBOL_for_channel = 820, /* for_channel */ + YYSYMBOL_create = 821, /* create */ + YYSYMBOL_822_8 = 822, /* $@8 */ + YYSYMBOL_823_9 = 823, /* $@9 */ + YYSYMBOL_824_10 = 824, /* $@10 */ + YYSYMBOL_825_11 = 825, /* $@11 */ + YYSYMBOL_826_12 = 826, /* $@12 */ + YYSYMBOL_827_13 = 827, /* $@13 */ + YYSYMBOL_828_14 = 828, /* $@14 */ + YYSYMBOL_829_15 = 829, /* $@15 */ + YYSYMBOL_830_16 = 830, /* $@16 */ + YYSYMBOL_831_17 = 831, /* $@17 */ + YYSYMBOL_832_18 = 832, /* $@18 */ + YYSYMBOL_833_19 = 833, /* $@19 */ + YYSYMBOL_834_20 = 834, /* $@20 */ + YYSYMBOL_835_21 = 835, /* $@21 */ + YYSYMBOL_836_22 = 836, /* $@22 */ + YYSYMBOL_837_23 = 837, /* $@23 */ + YYSYMBOL_838_24 = 838, /* $@24 */ + YYSYMBOL_opt_sequence = 839, /* opt_sequence */ + YYSYMBOL_sequence_defs = 840, /* sequence_defs */ + YYSYMBOL_sequence_def = 841, /* sequence_def */ + YYSYMBOL_force_lookahead = 842, /* force_lookahead */ + YYSYMBOL_server_def = 843, /* server_def */ + YYSYMBOL_844_25 = 844, /* $@25 */ + YYSYMBOL_server_options_list = 845, /* server_options_list */ + YYSYMBOL_server_option = 846, /* server_option */ + YYSYMBOL_event_tail = 847, /* event_tail */ + YYSYMBOL_848_26 = 848, /* $@26 */ + YYSYMBOL_ev_schedule_time = 849, /* ev_schedule_time */ + YYSYMBOL_850_27 = 850, /* $@27 */ + YYSYMBOL_opt_ev_status = 851, /* opt_ev_status */ + YYSYMBOL_ev_starts = 852, /* ev_starts */ + YYSYMBOL_ev_ends = 853, /* ev_ends */ + YYSYMBOL_opt_ev_on_completion = 854, /* opt_ev_on_completion */ + YYSYMBOL_ev_on_completion = 855, /* ev_on_completion */ + YYSYMBOL_opt_ev_comment = 856, /* opt_ev_comment */ + YYSYMBOL_ev_sql_stmt = 857, /* ev_sql_stmt */ + YYSYMBOL_858_28 = 858, /* $@28 */ + YYSYMBOL_clear_privileges = 859, /* clear_privileges */ + YYSYMBOL_opt_aggregate = 860, /* opt_aggregate */ + YYSYMBOL_sp_handler = 861, /* sp_handler */ + YYSYMBOL_sp_name = 862, /* sp_name */ + YYSYMBOL_sp_a_chistics = 863, /* sp_a_chistics */ + YYSYMBOL_sp_c_chistics = 864, /* sp_c_chistics */ + YYSYMBOL_sp_chistic = 865, /* sp_chistic */ + YYSYMBOL_sp_c_chistic = 866, /* sp_c_chistic */ + YYSYMBOL_sp_suid = 867, /* sp_suid */ + YYSYMBOL_call = 868, /* call */ + YYSYMBOL_869_29 = 869, /* $@29 */ + YYSYMBOL_870_30 = 870, /* $@30 */ + YYSYMBOL_871_31 = 871, /* $@31 */ + YYSYMBOL_opt_sp_cparam_list = 872, /* opt_sp_cparam_list */ + YYSYMBOL_opt_sp_cparams = 873, /* opt_sp_cparams */ + YYSYMBOL_sp_cparams = 874, /* sp_cparams */ + YYSYMBOL_sp_fdparam_list = 875, /* sp_fdparam_list */ + YYSYMBOL_876_32 = 876, /* $@32 */ + YYSYMBOL_sp_fdparams = 877, /* sp_fdparams */ + YYSYMBOL_sp_param_name = 878, /* sp_param_name */ + YYSYMBOL_sp_pdparam_list = 879, /* sp_pdparam_list */ + YYSYMBOL_sp_pdparams = 880, /* sp_pdparams */ + YYSYMBOL_sp_parameter_type = 881, /* sp_parameter_type */ + YYSYMBOL_sp_parenthesized_pdparam_list = 882, /* sp_parenthesized_pdparam_list */ + YYSYMBOL_883_33 = 883, /* $@33 */ + YYSYMBOL_sp_parenthesized_fdparam_list = 884, /* sp_parenthesized_fdparam_list */ + YYSYMBOL_sp_proc_stmts = 885, /* sp_proc_stmts */ + YYSYMBOL_sp_proc_stmts1 = 886, /* sp_proc_stmts1 */ + YYSYMBOL_optionally_qualified_column_ident = 887, /* optionally_qualified_column_ident */ + YYSYMBOL_row_field_definition = 888, /* row_field_definition */ + YYSYMBOL_row_field_definition_list = 889, /* row_field_definition_list */ + YYSYMBOL_row_type_body = 890, /* row_type_body */ + YYSYMBOL_sp_decl_idents_init_vars = 891, /* sp_decl_idents_init_vars */ + YYSYMBOL_sp_decl_variable_list = 892, /* sp_decl_variable_list */ + YYSYMBOL_893_34 = 893, /* $@34 */ + YYSYMBOL_sp_decl_handler = 894, /* sp_decl_handler */ + YYSYMBOL_895_35 = 895, /* $@35 */ + YYSYMBOL_opt_parenthesized_cursor_formal_parameters = 896, /* opt_parenthesized_cursor_formal_parameters */ + YYSYMBOL_sp_cursor_stmt_lex = 897, /* sp_cursor_stmt_lex */ + YYSYMBOL_sp_cursor_stmt = 898, /* sp_cursor_stmt */ + YYSYMBOL_899_36 = 899, /* $@36 */ + YYSYMBOL_sp_handler_type = 900, /* sp_handler_type */ + YYSYMBOL_sp_hcond_list = 901, /* sp_hcond_list */ + YYSYMBOL_sp_hcond_element = 902, /* sp_hcond_element */ + YYSYMBOL_sp_cond = 903, /* sp_cond */ + YYSYMBOL_sqlstate = 904, /* sqlstate */ + YYSYMBOL_opt_value = 905, /* opt_value */ + YYSYMBOL_sp_hcond = 906, /* sp_hcond */ + YYSYMBOL_raise_stmt_oracle = 907, /* raise_stmt_oracle */ + YYSYMBOL_signal_stmt = 908, /* signal_stmt */ + YYSYMBOL_signal_value = 909, /* signal_value */ + YYSYMBOL_opt_signal_value = 910, /* opt_signal_value */ + YYSYMBOL_opt_set_signal_information = 911, /* opt_set_signal_information */ + YYSYMBOL_signal_information_item_list = 912, /* signal_information_item_list */ + YYSYMBOL_signal_allowed_expr = 913, /* signal_allowed_expr */ + YYSYMBOL_signal_condition_information_item_name = 914, /* signal_condition_information_item_name */ + YYSYMBOL_resignal_stmt = 915, /* resignal_stmt */ + YYSYMBOL_get_diagnostics = 916, /* get_diagnostics */ + YYSYMBOL_which_area = 917, /* which_area */ + YYSYMBOL_diagnostics_information = 918, /* diagnostics_information */ + YYSYMBOL_statement_information = 919, /* statement_information */ + YYSYMBOL_statement_information_item = 920, /* statement_information_item */ + YYSYMBOL_simple_target_specification = 921, /* simple_target_specification */ + YYSYMBOL_statement_information_item_name = 922, /* statement_information_item_name */ + YYSYMBOL_condition_number = 923, /* condition_number */ + YYSYMBOL_condition_information = 924, /* condition_information */ + YYSYMBOL_condition_information_item = 925, /* condition_information_item */ + YYSYMBOL_condition_information_item_name = 926, /* condition_information_item_name */ + YYSYMBOL_sp_decl_ident = 927, /* sp_decl_ident */ + YYSYMBOL_sp_decl_idents = 928, /* sp_decl_idents */ + YYSYMBOL_sp_proc_stmt_if = 929, /* sp_proc_stmt_if */ + YYSYMBOL_930_37 = 930, /* $@37 */ + YYSYMBOL_sp_proc_stmt_statement = 931, /* sp_proc_stmt_statement */ + YYSYMBOL_932_38 = 932, /* $@38 */ + YYSYMBOL_RETURN_ALLMODES_SYM = 933, /* RETURN_ALLMODES_SYM */ + YYSYMBOL_sp_proc_stmt_return = 934, /* sp_proc_stmt_return */ + YYSYMBOL_935_39 = 935, /* $@39 */ + YYSYMBOL_sp_proc_stmt_exit_oracle = 936, /* sp_proc_stmt_exit_oracle */ + YYSYMBOL_937_40 = 937, /* $@40 */ + YYSYMBOL_938_41 = 938, /* $@41 */ + YYSYMBOL_sp_proc_stmt_continue_oracle = 939, /* sp_proc_stmt_continue_oracle */ + YYSYMBOL_940_42 = 940, /* $@42 */ + YYSYMBOL_941_43 = 941, /* $@43 */ + YYSYMBOL_sp_proc_stmt_leave = 942, /* sp_proc_stmt_leave */ + YYSYMBOL_sp_proc_stmt_iterate = 943, /* sp_proc_stmt_iterate */ + YYSYMBOL_sp_proc_stmt_goto_oracle = 944, /* sp_proc_stmt_goto_oracle */ + YYSYMBOL_expr_lex = 945, /* expr_lex */ + YYSYMBOL_946_44 = 946, /* @44 */ + YYSYMBOL_assignment_source_lex = 947, /* assignment_source_lex */ + YYSYMBOL_assignment_source_expr = 948, /* assignment_source_expr */ + YYSYMBOL_949_45 = 949, /* $@45 */ + YYSYMBOL_for_loop_bound_expr = 950, /* for_loop_bound_expr */ + YYSYMBOL_951_46 = 951, /* $@46 */ + YYSYMBOL_cursor_actual_parameters = 952, /* cursor_actual_parameters */ + YYSYMBOL_opt_parenthesized_cursor_actual_parameters = 953, /* opt_parenthesized_cursor_actual_parameters */ + YYSYMBOL_sp_proc_stmt_with_cursor = 954, /* sp_proc_stmt_with_cursor */ + YYSYMBOL_sp_proc_stmt_open = 955, /* sp_proc_stmt_open */ + YYSYMBOL_sp_proc_stmt_fetch_head = 956, /* sp_proc_stmt_fetch_head */ + YYSYMBOL_sp_proc_stmt_fetch = 957, /* sp_proc_stmt_fetch */ + YYSYMBOL_sp_proc_stmt_close = 958, /* sp_proc_stmt_close */ + YYSYMBOL_sp_fetch_list = 959, /* sp_fetch_list */ + YYSYMBOL_sp_if = 960, /* sp_if */ + YYSYMBOL_961_47 = 961, /* $@47 */ + YYSYMBOL_962_48 = 962, /* $@48 */ + YYSYMBOL_sp_elseifs = 963, /* sp_elseifs */ + YYSYMBOL_case_stmt_specification = 964, /* case_stmt_specification */ + YYSYMBOL_965_49 = 965, /* $@49 */ + YYSYMBOL_case_stmt_body = 966, /* case_stmt_body */ + YYSYMBOL_967_50 = 967, /* $@50 */ + YYSYMBOL_simple_when_clause_list = 968, /* simple_when_clause_list */ + YYSYMBOL_searched_when_clause_list = 969, /* searched_when_clause_list */ + YYSYMBOL_simple_when_clause = 970, /* simple_when_clause */ + YYSYMBOL_971_51 = 971, /* $@51 */ + YYSYMBOL_searched_when_clause = 972, /* searched_when_clause */ + YYSYMBOL_973_52 = 973, /* $@52 */ + YYSYMBOL_else_clause_opt = 974, /* else_clause_opt */ + YYSYMBOL_sp_opt_label = 975, /* sp_opt_label */ + YYSYMBOL_opt_sp_for_loop_direction = 976, /* opt_sp_for_loop_direction */ + YYSYMBOL_sp_for_loop_index_and_bounds = 977, /* sp_for_loop_index_and_bounds */ + YYSYMBOL_sp_for_loop_bounds = 978, /* sp_for_loop_bounds */ + YYSYMBOL_loop_body = 979, /* loop_body */ + YYSYMBOL_repeat_body = 980, /* repeat_body */ + YYSYMBOL_pop_sp_loop_label = 981, /* pop_sp_loop_label */ + YYSYMBOL_sp_labeled_control = 982, /* sp_labeled_control */ + YYSYMBOL_983_53 = 983, /* $@53 */ + YYSYMBOL_984_54 = 984, /* $@54 */ + YYSYMBOL_985_55 = 985, /* $@55 */ + YYSYMBOL_986_56 = 986, /* $@56 */ + YYSYMBOL_987_57 = 987, /* $@57 */ + YYSYMBOL_988_58 = 988, /* $@58 */ + YYSYMBOL_sp_unlabeled_control = 989, /* sp_unlabeled_control */ + YYSYMBOL_990_59 = 990, /* $@59 */ + YYSYMBOL_991_60 = 991, /* $@60 */ + YYSYMBOL_992_61 = 992, /* $@61 */ + YYSYMBOL_993_62 = 993, /* $@62 */ + YYSYMBOL_994_63 = 994, /* $@63 */ + YYSYMBOL_trg_action_time = 995, /* trg_action_time */ + YYSYMBOL_trg_event = 996, /* trg_event */ + YYSYMBOL_create_body = 997, /* create_body */ + YYSYMBOL_998_64 = 998, /* $@64 */ + YYSYMBOL_create_like = 999, /* create_like */ + YYSYMBOL_opt_create_select = 1000, /* opt_create_select */ + YYSYMBOL_create_select_query_expression = 1001, /* create_select_query_expression */ + YYSYMBOL_opt_create_partitioning = 1002, /* opt_create_partitioning */ + YYSYMBOL_opt_partitioning = 1003, /* opt_partitioning */ + YYSYMBOL_partitioning = 1004, /* partitioning */ + YYSYMBOL_1005_65 = 1005, /* $@65 */ + YYSYMBOL_have_partitioning = 1006, /* have_partitioning */ + YYSYMBOL_partition_entry = 1007, /* partition_entry */ + YYSYMBOL_1008_66 = 1008, /* $@66 */ + YYSYMBOL_partition = 1009, /* partition */ + YYSYMBOL_1010_67 = 1010, /* $@67 */ + YYSYMBOL_part_type_def = 1011, /* part_type_def */ + YYSYMBOL_1012_68 = 1012, /* $@68 */ + YYSYMBOL_1013_69 = 1013, /* $@69 */ + YYSYMBOL_1014_70 = 1014, /* $@70 */ + YYSYMBOL_opt_linear = 1015, /* opt_linear */ + YYSYMBOL_opt_key_algo = 1016, /* opt_key_algo */ + YYSYMBOL_part_field_list = 1017, /* part_field_list */ + YYSYMBOL_part_field_item_list = 1018, /* part_field_item_list */ + YYSYMBOL_part_field_item = 1019, /* part_field_item */ + YYSYMBOL_part_column_list = 1020, /* part_column_list */ + YYSYMBOL_part_func = 1021, /* part_func */ + YYSYMBOL_sub_part_func = 1022, /* sub_part_func */ + YYSYMBOL_opt_num_parts = 1023, /* opt_num_parts */ + YYSYMBOL_opt_sub_part = 1024, /* opt_sub_part */ + YYSYMBOL_1025_71 = 1025, /* $@71 */ + YYSYMBOL_1026_72 = 1026, /* $@72 */ + YYSYMBOL_sub_part_field_list = 1027, /* sub_part_field_list */ + YYSYMBOL_sub_part_field_item = 1028, /* sub_part_field_item */ + YYSYMBOL_part_func_expr = 1029, /* part_func_expr */ + YYSYMBOL_opt_num_subparts = 1030, /* opt_num_subparts */ + YYSYMBOL_part_defs = 1031, /* part_defs */ + YYSYMBOL_part_def_list = 1032, /* part_def_list */ + YYSYMBOL_opt_partition = 1033, /* opt_partition */ + YYSYMBOL_part_definition = 1034, /* part_definition */ + YYSYMBOL_1035_73 = 1035, /* $@73 */ + YYSYMBOL_part_name = 1036, /* part_name */ + YYSYMBOL_opt_part_values = 1037, /* opt_part_values */ + YYSYMBOL_1038_74 = 1038, /* $@74 */ + YYSYMBOL_1039_75 = 1039, /* $@75 */ + YYSYMBOL_part_func_max = 1040, /* part_func_max */ + YYSYMBOL_part_values_in = 1041, /* part_values_in */ + YYSYMBOL_part_value_list = 1042, /* part_value_list */ + YYSYMBOL_part_value_item = 1043, /* part_value_item */ + YYSYMBOL_1044_76 = 1044, /* $@76 */ + YYSYMBOL_1045_77 = 1045, /* $@77 */ + YYSYMBOL_part_value_item_list = 1046, /* part_value_item_list */ + YYSYMBOL_part_value_expr_item = 1047, /* part_value_expr_item */ + YYSYMBOL_opt_sub_partition = 1048, /* opt_sub_partition */ + YYSYMBOL_sub_part_list = 1049, /* sub_part_list */ + YYSYMBOL_sub_part_definition = 1050, /* sub_part_definition */ + YYSYMBOL_1051_78 = 1051, /* $@78 */ + YYSYMBOL_sub_name = 1052, /* sub_name */ + YYSYMBOL_opt_part_options = 1053, /* opt_part_options */ + YYSYMBOL_part_option_list = 1054, /* part_option_list */ + YYSYMBOL_part_option = 1055, /* part_option */ + YYSYMBOL_opt_subpart_options = 1056, /* opt_subpart_options */ + YYSYMBOL_subpart_option_list = 1057, /* subpart_option_list */ + YYSYMBOL_server_part_option = 1058, /* server_part_option */ + YYSYMBOL_opt_versioning_rotation = 1059, /* opt_versioning_rotation */ + YYSYMBOL_1060_79 = 1060, /* $@79 */ + YYSYMBOL_opt_versioning_interval_start = 1061, /* opt_versioning_interval_start */ + YYSYMBOL_opt_vers_auto_part = 1062, /* opt_vers_auto_part */ + YYSYMBOL_opt_as = 1063, /* opt_as */ + YYSYMBOL_opt_create_database_options = 1064, /* opt_create_database_options */ + YYSYMBOL_create_database_options = 1065, /* create_database_options */ + YYSYMBOL_create_database_option = 1066, /* create_database_option */ + YYSYMBOL_opt_if_not_exists_table_element = 1067, /* opt_if_not_exists_table_element */ + YYSYMBOL_opt_if_not_exists = 1068, /* opt_if_not_exists */ + YYSYMBOL_create_or_replace = 1069, /* create_or_replace */ + YYSYMBOL_opt_create_table_options = 1070, /* opt_create_table_options */ + YYSYMBOL_create_table_options_space_separated = 1071, /* create_table_options_space_separated */ + YYSYMBOL_create_table_options = 1072, /* create_table_options */ + YYSYMBOL_create_table_option = 1073, /* create_table_option */ + YYSYMBOL_1074_80 = 1074, /* $@80 */ + YYSYMBOL_engine_defined_option = 1075, /* engine_defined_option */ + YYSYMBOL_opt_versioning_option = 1076, /* opt_versioning_option */ + YYSYMBOL_versioning_option = 1077, /* versioning_option */ + YYSYMBOL_default_charset = 1078, /* default_charset */ + YYSYMBOL_default_collation = 1079, /* default_collation */ + YYSYMBOL_storage_engines = 1080, /* storage_engines */ + YYSYMBOL_known_storage_engines = 1081, /* known_storage_engines */ + YYSYMBOL_row_types = 1082, /* row_types */ + YYSYMBOL_merge_insert_types = 1083, /* merge_insert_types */ + YYSYMBOL_udf_type = 1084, /* udf_type */ + YYSYMBOL_create_field_list = 1085, /* create_field_list */ + YYSYMBOL_create_field_list_parens = 1086, /* create_field_list_parens */ + YYSYMBOL_field_list = 1087, /* field_list */ + YYSYMBOL_field_list_item = 1088, /* field_list_item */ + YYSYMBOL_column_def = 1089, /* column_def */ + YYSYMBOL_key_def = 1090, /* key_def */ + YYSYMBOL_1091_81 = 1091, /* $@81 */ + YYSYMBOL_1092_82 = 1092, /* $@82 */ + YYSYMBOL_1093_83 = 1093, /* $@83 */ + YYSYMBOL_1094_84 = 1094, /* $@84 */ + YYSYMBOL_1095_85 = 1095, /* $@85 */ + YYSYMBOL_1096_86 = 1096, /* $@86 */ + YYSYMBOL_1097_87 = 1097, /* $@87 */ + YYSYMBOL_constraint_def = 1098, /* constraint_def */ + YYSYMBOL_period_for_system_time = 1099, /* period_for_system_time */ + YYSYMBOL_period_for_application_time = 1100, /* period_for_application_time */ + YYSYMBOL_opt_check_constraint = 1101, /* opt_check_constraint */ + YYSYMBOL_check_constraint = 1102, /* check_constraint */ + YYSYMBOL_opt_constraint_no_id = 1103, /* opt_constraint_no_id */ + YYSYMBOL_opt_constraint = 1104, /* opt_constraint */ + YYSYMBOL_constraint = 1105, /* constraint */ + YYSYMBOL_field_spec = 1106, /* field_spec */ + YYSYMBOL_1107_88 = 1107, /* @88 */ + YYSYMBOL_field_type_or_serial = 1108, /* field_type_or_serial */ + YYSYMBOL_1109_89 = 1109, /* $@89 */ + YYSYMBOL_1110_90 = 1110, /* $@90 */ + YYSYMBOL_opt_serial_attribute = 1111, /* opt_serial_attribute */ + YYSYMBOL_opt_serial_attribute_list = 1112, /* opt_serial_attribute_list */ + YYSYMBOL_opt_asrow_attribute = 1113, /* opt_asrow_attribute */ + YYSYMBOL_opt_asrow_attribute_list = 1114, /* opt_asrow_attribute_list */ + YYSYMBOL_field_def = 1115, /* field_def */ + YYSYMBOL_1116_91 = 1116, /* $@91 */ + YYSYMBOL_opt_generated_always = 1117, /* opt_generated_always */ + YYSYMBOL_vcol_opt_specifier = 1118, /* vcol_opt_specifier */ + YYSYMBOL_vcol_opt_attribute = 1119, /* vcol_opt_attribute */ + YYSYMBOL_vcol_opt_attribute_list = 1120, /* vcol_opt_attribute_list */ + YYSYMBOL_vcol_attribute = 1121, /* vcol_attribute */ + YYSYMBOL_parse_vcol_expr = 1122, /* parse_vcol_expr */ + YYSYMBOL_1123_92 = 1123, /* $@92 */ + YYSYMBOL_parenthesized_expr = 1124, /* parenthesized_expr */ + YYSYMBOL_virtual_column_func = 1125, /* virtual_column_func */ + YYSYMBOL_expr_or_literal = 1126, /* expr_or_literal */ + YYSYMBOL_column_default_expr = 1127, /* column_default_expr */ + YYSYMBOL_field_type = 1128, /* field_type */ + YYSYMBOL_qualified_field_type = 1129, /* qualified_field_type */ + YYSYMBOL_udt_name = 1130, /* udt_name */ + YYSYMBOL_field_type_all = 1131, /* field_type_all */ + YYSYMBOL_field_type_numeric = 1132, /* field_type_numeric */ + YYSYMBOL_opt_binary_and_compression = 1133, /* opt_binary_and_compression */ + YYSYMBOL_field_type_string = 1134, /* field_type_string */ + YYSYMBOL_field_type_temporal = 1135, /* field_type_temporal */ + YYSYMBOL_field_type_lob = 1136, /* field_type_lob */ + YYSYMBOL_field_type_misc = 1137, /* field_type_misc */ + YYSYMBOL_char = 1138, /* char */ + YYSYMBOL_nchar = 1139, /* nchar */ + YYSYMBOL_varchar = 1140, /* varchar */ + YYSYMBOL_nvarchar = 1141, /* nvarchar */ + YYSYMBOL_int_type = 1142, /* int_type */ + YYSYMBOL_real_type = 1143, /* real_type */ + YYSYMBOL_srid_option = 1144, /* srid_option */ + YYSYMBOL_float_options = 1145, /* float_options */ + YYSYMBOL_precision = 1146, /* precision */ + YYSYMBOL_field_options = 1147, /* field_options */ + YYSYMBOL_last_field_options = 1148, /* last_field_options */ + YYSYMBOL_field_length_str = 1149, /* field_length_str */ + YYSYMBOL_field_length = 1150, /* field_length */ + YYSYMBOL_field_scale = 1151, /* field_scale */ + YYSYMBOL_opt_field_length = 1152, /* opt_field_length */ + YYSYMBOL_opt_field_scale = 1153, /* opt_field_scale */ + YYSYMBOL_opt_precision = 1154, /* opt_precision */ + YYSYMBOL_attribute_list = 1155, /* attribute_list */ + YYSYMBOL_attribute = 1156, /* attribute */ + YYSYMBOL_opt_compression_method = 1157, /* opt_compression_method */ + YYSYMBOL_opt_compressed = 1158, /* opt_compressed */ + YYSYMBOL_opt_enable = 1159, /* opt_enable */ + YYSYMBOL_compressed = 1160, /* compressed */ + YYSYMBOL_compressed_deprecated_data_type_attribute = 1161, /* compressed_deprecated_data_type_attribute */ + YYSYMBOL_compressed_deprecated_column_attribute = 1162, /* compressed_deprecated_column_attribute */ + YYSYMBOL_asrow_attribute = 1163, /* asrow_attribute */ + YYSYMBOL_serial_attribute = 1164, /* serial_attribute */ + YYSYMBOL_with_or_without_system = 1165, /* with_or_without_system */ + YYSYMBOL_charset = 1166, /* charset */ + YYSYMBOL_charset_name = 1167, /* charset_name */ + YYSYMBOL_charset_name_or_default = 1168, /* charset_name_or_default */ + YYSYMBOL_opt_load_data_charset = 1169, /* opt_load_data_charset */ + YYSYMBOL_old_or_new_charset_name = 1170, /* old_or_new_charset_name */ + YYSYMBOL_old_or_new_charset_name_or_default = 1171, /* old_or_new_charset_name_or_default */ + YYSYMBOL_collation_name = 1172, /* collation_name */ + YYSYMBOL_collation_name_or_default = 1173, /* collation_name_or_default */ + YYSYMBOL_opt_default = 1174, /* opt_default */ + YYSYMBOL_charset_or_alias = 1175, /* charset_or_alias */ + YYSYMBOL_opt_binary = 1176, /* opt_binary */ + YYSYMBOL_binary = 1177, /* binary */ + YYSYMBOL_opt_bin_mod = 1178, /* opt_bin_mod */ + YYSYMBOL_ws_nweights = 1179, /* ws_nweights */ + YYSYMBOL_1180_93 = 1180, /* $@93 */ + YYSYMBOL_ws_level_flag_desc = 1181, /* ws_level_flag_desc */ + YYSYMBOL_ws_level_flag_reverse = 1182, /* ws_level_flag_reverse */ + YYSYMBOL_ws_level_flags = 1183, /* ws_level_flags */ + YYSYMBOL_ws_level_number = 1184, /* ws_level_number */ + YYSYMBOL_ws_level_list_item = 1185, /* ws_level_list_item */ + YYSYMBOL_ws_level_list = 1186, /* ws_level_list */ + YYSYMBOL_ws_level_range = 1187, /* ws_level_range */ + YYSYMBOL_ws_level_list_or_range = 1188, /* ws_level_list_or_range */ + YYSYMBOL_opt_ws_levels = 1189, /* opt_ws_levels */ + YYSYMBOL_opt_primary = 1190, /* opt_primary */ + YYSYMBOL_references = 1191, /* references */ + YYSYMBOL_opt_ref_list = 1192, /* opt_ref_list */ + YYSYMBOL_ref_list = 1193, /* ref_list */ + YYSYMBOL_opt_match_clause = 1194, /* opt_match_clause */ + YYSYMBOL_opt_on_update_delete = 1195, /* opt_on_update_delete */ + YYSYMBOL_delete_option = 1196, /* delete_option */ + YYSYMBOL_constraint_key_type = 1197, /* constraint_key_type */ + YYSYMBOL_key_or_index = 1198, /* key_or_index */ + YYSYMBOL_opt_key_or_index = 1199, /* opt_key_or_index */ + YYSYMBOL_keys_or_index = 1200, /* keys_or_index */ + YYSYMBOL_fulltext = 1201, /* fulltext */ + YYSYMBOL_spatial = 1202, /* spatial */ + YYSYMBOL_normal_key_options = 1203, /* normal_key_options */ + YYSYMBOL_fulltext_key_options = 1204, /* fulltext_key_options */ + YYSYMBOL_spatial_key_options = 1205, /* spatial_key_options */ + YYSYMBOL_normal_key_opts = 1206, /* normal_key_opts */ + YYSYMBOL_spatial_key_opts = 1207, /* spatial_key_opts */ + YYSYMBOL_fulltext_key_opts = 1208, /* fulltext_key_opts */ + YYSYMBOL_opt_USING_key_algorithm = 1209, /* opt_USING_key_algorithm */ + YYSYMBOL_opt_key_algorithm_clause = 1210, /* opt_key_algorithm_clause */ + YYSYMBOL_key_using_alg = 1211, /* key_using_alg */ + YYSYMBOL_all_key_opt = 1212, /* all_key_opt */ + YYSYMBOL_normal_key_opt = 1213, /* normal_key_opt */ + YYSYMBOL_spatial_key_opt = 1214, /* spatial_key_opt */ + YYSYMBOL_fulltext_key_opt = 1215, /* fulltext_key_opt */ + YYSYMBOL_btree_or_rtree = 1216, /* btree_or_rtree */ + YYSYMBOL_ignorability = 1217, /* ignorability */ + YYSYMBOL_key_list = 1218, /* key_list */ + YYSYMBOL_opt_without_overlaps = 1219, /* opt_without_overlaps */ + YYSYMBOL_key_part = 1220, /* key_part */ + YYSYMBOL_opt_ident = 1221, /* opt_ident */ + YYSYMBOL_string_list = 1222, /* string_list */ + YYSYMBOL_alter = 1223, /* alter */ + YYSYMBOL_1224_94 = 1224, /* $@94 */ + YYSYMBOL_1225_95 = 1225, /* $@95 */ + YYSYMBOL_1226_96 = 1226, /* $@96 */ + YYSYMBOL_1227_97 = 1227, /* $@97 */ + YYSYMBOL_1228_98 = 1228, /* $@98 */ + YYSYMBOL_1229_99 = 1229, /* $@99 */ + YYSYMBOL_1230_100 = 1230, /* $@100 */ + YYSYMBOL_1231_101 = 1231, /* $@101 */ + YYSYMBOL_1232_102 = 1232, /* $@102 */ + YYSYMBOL_1233_103 = 1233, /* $@103 */ + YYSYMBOL_1234_104 = 1234, /* $@104 */ + YYSYMBOL_1235_105 = 1235, /* $@105 */ + YYSYMBOL_1236_106 = 1236, /* $@106 */ + YYSYMBOL_account_locking_option = 1237, /* account_locking_option */ + YYSYMBOL_opt_password_expire_option = 1238, /* opt_password_expire_option */ + YYSYMBOL_opt_account_locking_and_opt_password_expiration = 1239, /* opt_account_locking_and_opt_password_expiration */ + YYSYMBOL_ev_alter_on_schedule_completion = 1240, /* ev_alter_on_schedule_completion */ + YYSYMBOL_opt_ev_rename_to = 1241, /* opt_ev_rename_to */ + YYSYMBOL_opt_ev_sql_stmt = 1242, /* opt_ev_sql_stmt */ + YYSYMBOL_ident_or_empty = 1243, /* ident_or_empty */ + YYSYMBOL_alter_commands = 1244, /* alter_commands */ + YYSYMBOL_1245_107 = 1245, /* $@107 */ + YYSYMBOL_1246_108 = 1246, /* $@108 */ + YYSYMBOL_1247_109 = 1247, /* $@109 */ + YYSYMBOL_1248_110 = 1248, /* $@110 */ + YYSYMBOL_remove_partitioning = 1249, /* remove_partitioning */ + YYSYMBOL_all_or_alt_part_name_list = 1250, /* all_or_alt_part_name_list */ + YYSYMBOL_add_partition_rule = 1251, /* add_partition_rule */ + YYSYMBOL_1252_111 = 1252, /* $@111 */ + YYSYMBOL_add_part_extra = 1253, /* add_part_extra */ + YYSYMBOL_reorg_partition_rule = 1254, /* reorg_partition_rule */ + YYSYMBOL_1255_112 = 1255, /* $@112 */ + YYSYMBOL_reorg_parts_rule = 1256, /* reorg_parts_rule */ + YYSYMBOL_1257_113 = 1257, /* $@113 */ + YYSYMBOL_alt_part_name_list = 1258, /* alt_part_name_list */ + YYSYMBOL_alt_part_name_item = 1259, /* alt_part_name_item */ + YYSYMBOL_alter_list = 1260, /* alter_list */ + YYSYMBOL_add_column = 1261, /* add_column */ + YYSYMBOL_alter_list_item = 1262, /* alter_list_item */ + YYSYMBOL_opt_index_lock_algorithm = 1263, /* opt_index_lock_algorithm */ + YYSYMBOL_alter_algorithm_option = 1264, /* alter_algorithm_option */ + YYSYMBOL_alter_lock_option = 1265, /* alter_lock_option */ + YYSYMBOL_opt_column = 1266, /* opt_column */ + YYSYMBOL_opt_ignore = 1267, /* opt_ignore */ + YYSYMBOL_alter_options = 1268, /* alter_options */ + YYSYMBOL_1269_114 = 1269, /* $@114 */ + YYSYMBOL_alter_options_part2 = 1270, /* alter_options_part2 */ + YYSYMBOL_alter_option_list = 1271, /* alter_option_list */ + YYSYMBOL_alter_option = 1272, /* alter_option */ + YYSYMBOL_opt_restrict = 1273, /* opt_restrict */ + YYSYMBOL_opt_place = 1274, /* opt_place */ + YYSYMBOL_opt_to = 1275, /* opt_to */ + YYSYMBOL_slave = 1276, /* slave */ + YYSYMBOL_1277_115 = 1277, /* $@115 */ + YYSYMBOL_1278_116 = 1278, /* $@116 */ + YYSYMBOL_start = 1279, /* start */ + YYSYMBOL_opt_start_transaction_option_list = 1280, /* opt_start_transaction_option_list */ + YYSYMBOL_start_transaction_option_list = 1281, /* start_transaction_option_list */ + YYSYMBOL_start_transaction_option = 1282, /* start_transaction_option */ + YYSYMBOL_slave_thread_opts = 1283, /* slave_thread_opts */ + YYSYMBOL_1284_117 = 1284, /* $@117 */ + YYSYMBOL_slave_thread_opt_list = 1285, /* slave_thread_opt_list */ + YYSYMBOL_slave_thread_opt = 1286, /* slave_thread_opt */ + YYSYMBOL_slave_until = 1287, /* slave_until */ + YYSYMBOL_slave_until_opts = 1288, /* slave_until_opts */ + YYSYMBOL_checksum = 1289, /* checksum */ + YYSYMBOL_1290_118 = 1290, /* $@118 */ + YYSYMBOL_opt_checksum_type = 1291, /* opt_checksum_type */ + YYSYMBOL_repair_table_or_view = 1292, /* repair_table_or_view */ + YYSYMBOL_1293_119 = 1293, /* $@119 */ + YYSYMBOL_repair = 1294, /* repair */ + YYSYMBOL_1295_120 = 1295, /* $@120 */ + YYSYMBOL_opt_mi_repair_type = 1296, /* opt_mi_repair_type */ + YYSYMBOL_mi_repair_types = 1297, /* mi_repair_types */ + YYSYMBOL_mi_repair_type = 1298, /* mi_repair_type */ + YYSYMBOL_opt_view_repair_type = 1299, /* opt_view_repair_type */ + YYSYMBOL_analyze = 1300, /* analyze */ + YYSYMBOL_1301_121 = 1301, /* $@121 */ + YYSYMBOL_analyze_table_list = 1302, /* analyze_table_list */ + YYSYMBOL_analyze_table_elem_spec = 1303, /* analyze_table_elem_spec */ + YYSYMBOL_opt_persistent_stat_clause = 1304, /* opt_persistent_stat_clause */ + YYSYMBOL_persistent_stat_spec = 1305, /* persistent_stat_spec */ + YYSYMBOL_persistent_column_stat_spec = 1306, /* persistent_column_stat_spec */ + YYSYMBOL_1307_122 = 1307, /* $@122 */ + YYSYMBOL_persistent_index_stat_spec = 1308, /* persistent_index_stat_spec */ + YYSYMBOL_1309_123 = 1309, /* $@123 */ + YYSYMBOL_table_column_list = 1310, /* table_column_list */ + YYSYMBOL_table_index_list = 1311, /* table_index_list */ + YYSYMBOL_table_index_name = 1312, /* table_index_name */ + YYSYMBOL_binlog_base64_event = 1313, /* binlog_base64_event */ + YYSYMBOL_check_view_or_table = 1314, /* check_view_or_table */ + YYSYMBOL_1315_124 = 1315, /* $@124 */ + YYSYMBOL_check = 1316, /* check */ + YYSYMBOL_1317_125 = 1317, /* $@125 */ + YYSYMBOL_opt_mi_check_type = 1318, /* opt_mi_check_type */ + YYSYMBOL_mi_check_types = 1319, /* mi_check_types */ + YYSYMBOL_mi_check_type = 1320, /* mi_check_type */ + YYSYMBOL_opt_view_check_type = 1321, /* opt_view_check_type */ + YYSYMBOL_optimize = 1322, /* optimize */ + YYSYMBOL_1323_126 = 1323, /* $@126 */ + YYSYMBOL_opt_no_write_to_binlog = 1324, /* opt_no_write_to_binlog */ + YYSYMBOL_rename = 1325, /* rename */ + YYSYMBOL_1326_127 = 1326, /* $@127 */ + YYSYMBOL_rename_list = 1327, /* rename_list */ + YYSYMBOL_table_to_table_list = 1328, /* table_to_table_list */ + YYSYMBOL_table_to_table = 1329, /* table_to_table */ + YYSYMBOL_keycache = 1330, /* keycache */ + YYSYMBOL_1331_128 = 1331, /* $@128 */ + YYSYMBOL_keycache_list_or_parts = 1332, /* keycache_list_or_parts */ + YYSYMBOL_keycache_list = 1333, /* keycache_list */ + YYSYMBOL_assign_to_keycache = 1334, /* assign_to_keycache */ + YYSYMBOL_assign_to_keycache_parts = 1335, /* assign_to_keycache_parts */ + YYSYMBOL_key_cache_name = 1336, /* key_cache_name */ + YYSYMBOL_preload = 1337, /* preload */ + YYSYMBOL_1338_129 = 1338, /* $@129 */ + YYSYMBOL_preload_list_or_parts = 1339, /* preload_list_or_parts */ + YYSYMBOL_preload_list = 1340, /* preload_list */ + YYSYMBOL_preload_keys = 1341, /* preload_keys */ + YYSYMBOL_preload_keys_parts = 1342, /* preload_keys_parts */ + YYSYMBOL_adm_partition = 1343, /* adm_partition */ + YYSYMBOL_1344_130 = 1344, /* $@130 */ + YYSYMBOL_cache_keys_spec = 1345, /* cache_keys_spec */ + YYSYMBOL_1346_131 = 1346, /* $@131 */ + YYSYMBOL_cache_key_list_or_empty = 1347, /* cache_key_list_or_empty */ + YYSYMBOL_opt_ignore_leaves = 1348, /* opt_ignore_leaves */ + YYSYMBOL_select = 1349, /* select */ + YYSYMBOL_1350_132 = 1350, /* $@132 */ + YYSYMBOL_1351_133 = 1351, /* $@133 */ + YYSYMBOL_select_into = 1352, /* select_into */ + YYSYMBOL_1353_134 = 1353, /* $@134 */ + YYSYMBOL_1354_135 = 1354, /* $@135 */ + YYSYMBOL_simple_table = 1355, /* simple_table */ + YYSYMBOL_table_value_constructor = 1356, /* table_value_constructor */ + YYSYMBOL_1357_136 = 1357, /* $@136 */ + YYSYMBOL_query_specification_start = 1358, /* query_specification_start */ + YYSYMBOL_1359_137 = 1359, /* $@137 */ + YYSYMBOL_1360_138 = 1360, /* $@138 */ + YYSYMBOL_query_specification = 1361, /* query_specification */ + YYSYMBOL_select_into_query_specification = 1362, /* select_into_query_specification */ + YYSYMBOL_query_expression = 1363, /* query_expression */ + YYSYMBOL_query_expression_no_with_clause = 1364, /* query_expression_no_with_clause */ + YYSYMBOL_query_expression_body_ext = 1365, /* query_expression_body_ext */ + YYSYMBOL_1366_139 = 1366, /* $@139 */ + YYSYMBOL_1367_140 = 1367, /* $@140 */ + YYSYMBOL_query_expression_body_ext_parens = 1368, /* query_expression_body_ext_parens */ + YYSYMBOL_query_expression_body = 1369, /* query_expression_body */ + YYSYMBOL_1370_141 = 1370, /* $@141 */ + YYSYMBOL_query_primary = 1371, /* query_primary */ + YYSYMBOL_query_simple = 1372, /* query_simple */ + YYSYMBOL_subselect = 1373, /* subselect */ + YYSYMBOL_subquery = 1374, /* subquery */ + YYSYMBOL_opt_from_clause = 1375, /* opt_from_clause */ + YYSYMBOL_from_clause = 1376, /* from_clause */ + YYSYMBOL_table_reference_list = 1377, /* table_reference_list */ + YYSYMBOL_select_options = 1378, /* select_options */ + YYSYMBOL_opt_history_unit = 1379, /* opt_history_unit */ + YYSYMBOL_history_point = 1380, /* history_point */ + YYSYMBOL_for_portion_of_time_clause = 1381, /* for_portion_of_time_clause */ + YYSYMBOL_opt_for_portion_of_time_clause = 1382, /* opt_for_portion_of_time_clause */ + YYSYMBOL_opt_for_system_time_clause = 1383, /* opt_for_system_time_clause */ + YYSYMBOL_system_time_expr = 1384, /* system_time_expr */ + YYSYMBOL_select_option_list = 1385, /* select_option_list */ + YYSYMBOL_select_option = 1386, /* select_option */ + YYSYMBOL_select_lock_type = 1387, /* select_lock_type */ + YYSYMBOL_opt_select_lock_type = 1388, /* opt_select_lock_type */ + YYSYMBOL_opt_lock_wait_timeout_new = 1389, /* opt_lock_wait_timeout_new */ + YYSYMBOL_select_item_list = 1390, /* select_item_list */ + YYSYMBOL_select_item = 1391, /* select_item */ + YYSYMBOL_remember_tok_start = 1392, /* remember_tok_start */ + YYSYMBOL_remember_name = 1393, /* remember_name */ + YYSYMBOL_remember_end = 1394, /* remember_end */ + YYSYMBOL_select_alias = 1395, /* select_alias */ + YYSYMBOL_opt_default_time_precision = 1396, /* opt_default_time_precision */ + YYSYMBOL_opt_time_precision = 1397, /* opt_time_precision */ + YYSYMBOL_optional_braces = 1398, /* optional_braces */ + YYSYMBOL_expr = 1399, /* expr */ + YYSYMBOL_boolean_test = 1400, /* boolean_test */ + YYSYMBOL_predicate = 1401, /* predicate */ + YYSYMBOL_bit_expr = 1402, /* bit_expr */ + YYSYMBOL_or = 1403, /* or */ + YYSYMBOL_and = 1404, /* and */ + YYSYMBOL_not = 1405, /* not */ + YYSYMBOL_not2 = 1406, /* not2 */ + YYSYMBOL_comp_op = 1407, /* comp_op */ + YYSYMBOL_all_or_any = 1408, /* all_or_any */ + YYSYMBOL_opt_dyncol_type = 1409, /* opt_dyncol_type */ + YYSYMBOL_dyncol_type = 1410, /* dyncol_type */ + YYSYMBOL_numeric_dyncol_type = 1411, /* numeric_dyncol_type */ + YYSYMBOL_temporal_dyncol_type = 1412, /* temporal_dyncol_type */ + YYSYMBOL_string_dyncol_type = 1413, /* string_dyncol_type */ + YYSYMBOL_dyncall_create_element = 1414, /* dyncall_create_element */ + YYSYMBOL_dyncall_create_list = 1415, /* dyncall_create_list */ + YYSYMBOL_plsql_cursor_attr = 1416, /* plsql_cursor_attr */ + YYSYMBOL_explicit_cursor_attr = 1417, /* explicit_cursor_attr */ + YYSYMBOL_trim_operands = 1418, /* trim_operands */ + YYSYMBOL_trim_operands_regular = 1419, /* trim_operands_regular */ + YYSYMBOL_trim_operands_special = 1420, /* trim_operands_special */ + YYSYMBOL_column_default_non_parenthesized_expr = 1421, /* column_default_non_parenthesized_expr */ + YYSYMBOL_primary_expr = 1422, /* primary_expr */ + YYSYMBOL_string_factor_expr = 1423, /* string_factor_expr */ + YYSYMBOL_simple_expr = 1424, /* simple_expr */ + YYSYMBOL_mysql_concatenation_expr = 1425, /* mysql_concatenation_expr */ + YYSYMBOL_function_call_keyword_timestamp = 1426, /* function_call_keyword_timestamp */ + YYSYMBOL_function_call_keyword = 1427, /* function_call_keyword */ + YYSYMBOL_substring_operands = 1428, /* substring_operands */ + YYSYMBOL_substring_operands_regular = 1429, /* substring_operands_regular */ + YYSYMBOL_substring_operands_special = 1430, /* substring_operands_special */ + YYSYMBOL_function_call_nonkeyword = 1431, /* function_call_nonkeyword */ + YYSYMBOL_function_call_conflict = 1432, /* function_call_conflict */ + YYSYMBOL_function_call_generic = 1433, /* function_call_generic */ + YYSYMBOL_1434_142 = 1434, /* @142 */ + YYSYMBOL_fulltext_options = 1435, /* fulltext_options */ + YYSYMBOL_opt_natural_language_mode = 1436, /* opt_natural_language_mode */ + YYSYMBOL_opt_query_expansion = 1437, /* opt_query_expansion */ + YYSYMBOL_opt_udf_expr_list = 1438, /* opt_udf_expr_list */ + YYSYMBOL_udf_expr_list = 1439, /* udf_expr_list */ + YYSYMBOL_udf_expr = 1440, /* udf_expr */ + YYSYMBOL_sum_expr = 1441, /* sum_expr */ + YYSYMBOL_1442_143 = 1442, /* $@143 */ + YYSYMBOL_1443_144 = 1443, /* $@144 */ + YYSYMBOL_1444_145 = 1444, /* $@145 */ + YYSYMBOL_1445_146 = 1445, /* $@146 */ + YYSYMBOL_1446_147 = 1446, /* $@147 */ + YYSYMBOL_window_func_expr = 1447, /* window_func_expr */ + YYSYMBOL_window_func = 1448, /* window_func */ + YYSYMBOL_simple_window_func = 1449, /* simple_window_func */ + YYSYMBOL_inverse_distribution_function = 1450, /* inverse_distribution_function */ + YYSYMBOL_percentile_function = 1451, /* percentile_function */ + YYSYMBOL_1452_148 = 1452, /* $@148 */ + YYSYMBOL_inverse_distribution_function_def = 1453, /* inverse_distribution_function_def */ + YYSYMBOL_order_by_single_element_list = 1454, /* order_by_single_element_list */ + YYSYMBOL_window_name = 1455, /* window_name */ + YYSYMBOL_variable = 1456, /* variable */ + YYSYMBOL_1457_149 = 1457, /* $@149 */ + YYSYMBOL_variable_aux = 1458, /* variable_aux */ + YYSYMBOL_opt_distinct = 1459, /* opt_distinct */ + YYSYMBOL_opt_gconcat_separator = 1460, /* opt_gconcat_separator */ + YYSYMBOL_opt_gorder_clause = 1461, /* opt_gorder_clause */ + YYSYMBOL_gorder_list = 1462, /* gorder_list */ + YYSYMBOL_opt_glimit_clause = 1463, /* opt_glimit_clause */ + YYSYMBOL_glimit_clause = 1464, /* glimit_clause */ + YYSYMBOL_glimit_options = 1465, /* glimit_options */ + YYSYMBOL_in_sum_expr = 1466, /* in_sum_expr */ + YYSYMBOL_1467_150 = 1467, /* $@150 */ + YYSYMBOL_cast_type = 1468, /* cast_type */ + YYSYMBOL_cast_type_numeric = 1469, /* cast_type_numeric */ + YYSYMBOL_cast_type_temporal = 1470, /* cast_type_temporal */ + YYSYMBOL_opt_expr_list = 1471, /* opt_expr_list */ + YYSYMBOL_expr_list = 1472, /* expr_list */ + YYSYMBOL_ident_list_arg = 1473, /* ident_list_arg */ + YYSYMBOL_ident_list = 1474, /* ident_list */ + YYSYMBOL_when_list = 1475, /* when_list */ + YYSYMBOL_when_list_opt_else = 1476, /* when_list_opt_else */ + YYSYMBOL_table_ref = 1477, /* table_ref */ + YYSYMBOL_json_text_literal = 1478, /* json_text_literal */ + YYSYMBOL_json_text_literal_or_num = 1479, /* json_text_literal_or_num */ + YYSYMBOL_join_table_list = 1480, /* join_table_list */ + YYSYMBOL_json_table_columns_clause = 1481, /* json_table_columns_clause */ + YYSYMBOL_json_table_columns_list = 1482, /* json_table_columns_list */ + YYSYMBOL_json_table_column = 1483, /* json_table_column */ + YYSYMBOL_1484_151 = 1484, /* $@151 */ + YYSYMBOL_1485_152 = 1485, /* $@152 */ + YYSYMBOL_json_table_column_type = 1486, /* json_table_column_type */ + YYSYMBOL_json_table_field_type = 1487, /* json_table_field_type */ + YYSYMBOL_json_opt_on_empty_or_error = 1488, /* json_opt_on_empty_or_error */ + YYSYMBOL_json_on_response = 1489, /* json_on_response */ + YYSYMBOL_json_on_error_response = 1490, /* json_on_error_response */ + YYSYMBOL_json_on_empty_response = 1491, /* json_on_empty_response */ + YYSYMBOL_table_function = 1492, /* table_function */ + YYSYMBOL_1493_153 = 1493, /* $@153 */ + YYSYMBOL_1494_154 = 1494, /* $@154 */ + YYSYMBOL_esc_table_ref = 1495, /* esc_table_ref */ + YYSYMBOL_derived_table_list = 1496, /* derived_table_list */ + YYSYMBOL_join_table = 1497, /* join_table */ + YYSYMBOL_1498_155 = 1498, /* $@155 */ + YYSYMBOL_1499_156 = 1499, /* $@156 */ + YYSYMBOL_1500_157 = 1500, /* $@157 */ + YYSYMBOL_1501_158 = 1501, /* $@158 */ + YYSYMBOL_1502_159 = 1502, /* $@159 */ + YYSYMBOL_1503_160 = 1503, /* $@160 */ + YYSYMBOL_inner_join = 1504, /* inner_join */ + YYSYMBOL_normal_join = 1505, /* normal_join */ + YYSYMBOL_opt_use_partition = 1506, /* opt_use_partition */ + YYSYMBOL_use_partition = 1507, /* use_partition */ + YYSYMBOL_table_factor = 1508, /* table_factor */ + YYSYMBOL_table_primary_ident_opt_parens = 1509, /* table_primary_ident_opt_parens */ + YYSYMBOL_table_primary_derived_opt_parens = 1510, /* table_primary_derived_opt_parens */ + YYSYMBOL_table_reference_list_parens = 1511, /* table_reference_list_parens */ + YYSYMBOL_nested_table_reference_list = 1512, /* nested_table_reference_list */ + YYSYMBOL_join_table_parens = 1513, /* join_table_parens */ + YYSYMBOL_table_primary_ident = 1514, /* table_primary_ident */ + YYSYMBOL_table_primary_derived = 1515, /* table_primary_derived */ + YYSYMBOL_opt_outer = 1516, /* opt_outer */ + YYSYMBOL_index_hint_clause = 1517, /* index_hint_clause */ + YYSYMBOL_index_hint_type = 1518, /* index_hint_type */ + YYSYMBOL_index_hint_definition = 1519, /* index_hint_definition */ + YYSYMBOL_1520_161 = 1520, /* $@161 */ + YYSYMBOL_1521_162 = 1521, /* $@162 */ + YYSYMBOL_index_hints_list = 1522, /* index_hints_list */ + YYSYMBOL_opt_index_hints_list = 1523, /* opt_index_hints_list */ + YYSYMBOL_1524_163 = 1524, /* $@163 */ + YYSYMBOL_opt_key_definition = 1525, /* opt_key_definition */ + YYSYMBOL_1526_164 = 1526, /* $@164 */ + YYSYMBOL_opt_key_usage_list = 1527, /* opt_key_usage_list */ + YYSYMBOL_key_usage_element = 1528, /* key_usage_element */ + YYSYMBOL_key_usage_list = 1529, /* key_usage_list */ + YYSYMBOL_using_list = 1530, /* using_list */ + YYSYMBOL_interval = 1531, /* interval */ + YYSYMBOL_interval_time_stamp = 1532, /* interval_time_stamp */ + YYSYMBOL_date_time_type = 1533, /* date_time_type */ + YYSYMBOL_table_alias = 1534, /* table_alias */ + YYSYMBOL_opt_table_alias_clause = 1535, /* opt_table_alias_clause */ + YYSYMBOL_table_alias_clause = 1536, /* table_alias_clause */ + YYSYMBOL_opt_all = 1537, /* opt_all */ + YYSYMBOL_opt_where_clause = 1538, /* opt_where_clause */ + YYSYMBOL_1539_165 = 1539, /* $@165 */ + YYSYMBOL_opt_having_clause = 1540, /* opt_having_clause */ + YYSYMBOL_1541_166 = 1541, /* $@166 */ + YYSYMBOL_opt_group_clause = 1542, /* opt_group_clause */ + YYSYMBOL_group_list = 1543, /* group_list */ + YYSYMBOL_olap_opt = 1544, /* olap_opt */ + YYSYMBOL_opt_window_clause = 1545, /* opt_window_clause */ + YYSYMBOL_window_def_list = 1546, /* window_def_list */ + YYSYMBOL_window_def = 1547, /* window_def */ + YYSYMBOL_window_spec = 1548, /* window_spec */ + YYSYMBOL_1549_167 = 1549, /* $@167 */ + YYSYMBOL_opt_window_ref = 1550, /* opt_window_ref */ + YYSYMBOL_opt_window_partition_clause = 1551, /* opt_window_partition_clause */ + YYSYMBOL_opt_window_order_clause = 1552, /* opt_window_order_clause */ + YYSYMBOL_opt_window_frame_clause = 1553, /* opt_window_frame_clause */ + YYSYMBOL_window_frame_units = 1554, /* window_frame_units */ + YYSYMBOL_window_frame_extent = 1555, /* window_frame_extent */ + YYSYMBOL_window_frame_start = 1556, /* window_frame_start */ + YYSYMBOL_window_frame_bound = 1557, /* window_frame_bound */ + YYSYMBOL_opt_window_frame_exclusion = 1558, /* opt_window_frame_exclusion */ + YYSYMBOL_alter_order_clause = 1559, /* alter_order_clause */ + YYSYMBOL_alter_order_list = 1560, /* alter_order_list */ + YYSYMBOL_alter_order_item = 1561, /* alter_order_item */ + YYSYMBOL_opt_order_clause = 1562, /* opt_order_clause */ + YYSYMBOL_order_clause = 1563, /* order_clause */ + YYSYMBOL_1564_168 = 1564, /* $@168 */ + YYSYMBOL_order_list = 1565, /* order_list */ + YYSYMBOL_order_dir = 1566, /* order_dir */ + YYSYMBOL_opt_limit_clause = 1567, /* opt_limit_clause */ + YYSYMBOL_limit_clause = 1568, /* limit_clause */ + YYSYMBOL_fetch_first_clause = 1569, /* fetch_first_clause */ + YYSYMBOL_first_or_next = 1570, /* first_or_next */ + YYSYMBOL_row_or_rows = 1571, /* row_or_rows */ + YYSYMBOL_only_or_with_ties = 1572, /* only_or_with_ties */ + YYSYMBOL_opt_global_limit_clause = 1573, /* opt_global_limit_clause */ + YYSYMBOL_limit_options = 1574, /* limit_options */ + YYSYMBOL_limit_option = 1575, /* limit_option */ + YYSYMBOL_limit_rows_option = 1576, /* limit_rows_option */ + YYSYMBOL_delete_limit_clause = 1577, /* delete_limit_clause */ + YYSYMBOL_order_limit_lock = 1578, /* order_limit_lock */ + YYSYMBOL_opt_order_limit_lock = 1579, /* opt_order_limit_lock */ + YYSYMBOL_query_expression_tail = 1580, /* query_expression_tail */ + YYSYMBOL_opt_query_expression_tail = 1581, /* opt_query_expression_tail */ + YYSYMBOL_opt_procedure_or_into = 1582, /* opt_procedure_or_into */ + YYSYMBOL_order_or_limit = 1583, /* order_or_limit */ + YYSYMBOL_opt_plus = 1584, /* opt_plus */ + YYSYMBOL_int_num = 1585, /* int_num */ + YYSYMBOL_ulong_num = 1586, /* ulong_num */ + YYSYMBOL_real_ulong_num = 1587, /* real_ulong_num */ + YYSYMBOL_longlong_num = 1588, /* longlong_num */ + YYSYMBOL_ulonglong_num = 1589, /* ulonglong_num */ + YYSYMBOL_real_ulonglong_num = 1590, /* real_ulonglong_num */ + YYSYMBOL_dec_num_error = 1591, /* dec_num_error */ + YYSYMBOL_dec_num = 1592, /* dec_num */ + YYSYMBOL_choice = 1593, /* choice */ + YYSYMBOL_bool = 1594, /* bool */ + YYSYMBOL_procedure_clause = 1595, /* procedure_clause */ + YYSYMBOL_1596_169 = 1596, /* $@169 */ + YYSYMBOL_procedure_list = 1597, /* procedure_list */ + YYSYMBOL_procedure_list2 = 1598, /* procedure_list2 */ + YYSYMBOL_procedure_item = 1599, /* procedure_item */ + YYSYMBOL_select_var_list_init = 1600, /* select_var_list_init */ + YYSYMBOL_1601_170 = 1601, /* $@170 */ + YYSYMBOL_select_var_list = 1602, /* select_var_list */ + YYSYMBOL_select_var_ident = 1603, /* select_var_ident */ + YYSYMBOL_select_outvar = 1604, /* select_outvar */ + YYSYMBOL_into = 1605, /* into */ + YYSYMBOL_into_destination = 1606, /* into_destination */ + YYSYMBOL_1607_171 = 1607, /* $@171 */ + YYSYMBOL_1608_172 = 1608, /* $@172 */ + YYSYMBOL_do = 1609, /* do */ + YYSYMBOL_1610_173 = 1610, /* $@173 */ + YYSYMBOL_drop = 1611, /* drop */ + YYSYMBOL_1612_174 = 1612, /* $@174 */ + YYSYMBOL_1613_175 = 1613, /* $@175 */ + YYSYMBOL_1614_176 = 1614, /* $@176 */ + YYSYMBOL_1615_177 = 1615, /* $@177 */ + YYSYMBOL_table_list = 1616, /* table_list */ + YYSYMBOL_table_name = 1617, /* table_name */ + YYSYMBOL_table_name_with_opt_use_partition = 1618, /* table_name_with_opt_use_partition */ + YYSYMBOL_table_alias_ref_list = 1619, /* table_alias_ref_list */ + YYSYMBOL_table_alias_ref = 1620, /* table_alias_ref */ + YYSYMBOL_opt_if_exists_table_element = 1621, /* opt_if_exists_table_element */ + YYSYMBOL_opt_if_exists = 1622, /* opt_if_exists */ + YYSYMBOL_opt_temporary = 1623, /* opt_temporary */ + YYSYMBOL_insert = 1624, /* insert */ + YYSYMBOL_1625_178 = 1625, /* $@178 */ + YYSYMBOL_1626_179 = 1626, /* $@179 */ + YYSYMBOL_replace = 1627, /* replace */ + YYSYMBOL_1628_180 = 1628, /* $@180 */ + YYSYMBOL_1629_181 = 1629, /* $@181 */ + YYSYMBOL_insert_start = 1630, /* insert_start */ + YYSYMBOL_stmt_end = 1631, /* stmt_end */ + YYSYMBOL_insert_lock_option = 1632, /* insert_lock_option */ + YYSYMBOL_replace_lock_option = 1633, /* replace_lock_option */ + YYSYMBOL_insert_replace_option = 1634, /* insert_replace_option */ + YYSYMBOL_opt_into = 1635, /* opt_into */ + YYSYMBOL_insert_table = 1636, /* insert_table */ + YYSYMBOL_1637_182 = 1637, /* $@182 */ + YYSYMBOL_insert_field_spec = 1638, /* insert_field_spec */ + YYSYMBOL_1639_183 = 1639, /* $@183 */ + YYSYMBOL_insert_field_list = 1640, /* insert_field_list */ + YYSYMBOL_opt_fields = 1641, /* opt_fields */ + YYSYMBOL_fields = 1642, /* fields */ + YYSYMBOL_insert_values = 1643, /* insert_values */ + YYSYMBOL_values_list = 1644, /* values_list */ + YYSYMBOL_ident_eq_list = 1645, /* ident_eq_list */ + YYSYMBOL_ident_eq_value = 1646, /* ident_eq_value */ + YYSYMBOL_equal = 1647, /* equal */ + YYSYMBOL_opt_equal = 1648, /* opt_equal */ + YYSYMBOL_opt_with = 1649, /* opt_with */ + YYSYMBOL_opt_by = 1650, /* opt_by */ + YYSYMBOL_no_braces = 1651, /* no_braces */ + YYSYMBOL_1652_184 = 1652, /* $@184 */ + YYSYMBOL_no_braces_with_names = 1653, /* no_braces_with_names */ + YYSYMBOL_1654_185 = 1654, /* $@185 */ + YYSYMBOL_opt_values = 1655, /* opt_values */ + YYSYMBOL_opt_values_with_names = 1656, /* opt_values_with_names */ + YYSYMBOL_values = 1657, /* values */ + YYSYMBOL_values_with_names = 1658, /* values_with_names */ + YYSYMBOL_expr_or_ignore = 1659, /* expr_or_ignore */ + YYSYMBOL_expr_or_ignore_or_default = 1660, /* expr_or_ignore_or_default */ + YYSYMBOL_opt_insert_update = 1661, /* opt_insert_update */ + YYSYMBOL_1662_186 = 1662, /* $@186 */ + YYSYMBOL_1663_187 = 1663, /* $@187 */ + YYSYMBOL_update_table_list = 1664, /* update_table_list */ + YYSYMBOL_update = 1665, /* update */ + YYSYMBOL_1666_188 = 1666, /* $@188 */ + YYSYMBOL_1667_189 = 1667, /* $@189 */ + YYSYMBOL_1668_190 = 1668, /* $@190 */ + YYSYMBOL_update_list = 1669, /* update_list */ + YYSYMBOL_update_elem = 1670, /* update_elem */ + YYSYMBOL_insert_update_list = 1671, /* insert_update_list */ + YYSYMBOL_insert_update_elem = 1672, /* insert_update_elem */ + YYSYMBOL_opt_low_priority = 1673, /* opt_low_priority */ + YYSYMBOL_delete = 1674, /* delete */ + YYSYMBOL_1675_191 = 1675, /* $@191 */ + YYSYMBOL_opt_delete_system_time = 1676, /* opt_delete_system_time */ + YYSYMBOL_delete_part2 = 1677, /* delete_part2 */ + YYSYMBOL_delete_single_table = 1678, /* delete_single_table */ + YYSYMBOL_delete_single_table_for_period = 1679, /* delete_single_table_for_period */ + YYSYMBOL_single_multi = 1680, /* single_multi */ + YYSYMBOL_1681_192 = 1681, /* $@192 */ + YYSYMBOL_1682_193 = 1682, /* $@193 */ + YYSYMBOL_1683_194 = 1683, /* $@194 */ + YYSYMBOL_1684_195 = 1684, /* $@195 */ + YYSYMBOL_opt_returning = 1685, /* opt_returning */ + YYSYMBOL_1686_196 = 1686, /* $@196 */ + YYSYMBOL_table_wild_list = 1687, /* table_wild_list */ + YYSYMBOL_table_wild_one = 1688, /* table_wild_one */ + YYSYMBOL_opt_wild = 1689, /* opt_wild */ + YYSYMBOL_opt_delete_options = 1690, /* opt_delete_options */ + YYSYMBOL_opt_delete_option = 1691, /* opt_delete_option */ + YYSYMBOL_truncate = 1692, /* truncate */ + YYSYMBOL_1693_197 = 1693, /* $@197 */ + YYSYMBOL_1694_198 = 1694, /* $@198 */ + YYSYMBOL_opt_table_sym = 1695, /* opt_table_sym */ + YYSYMBOL_opt_profile_defs = 1696, /* opt_profile_defs */ + YYSYMBOL_profile_defs = 1697, /* profile_defs */ + YYSYMBOL_profile_def = 1698, /* profile_def */ + YYSYMBOL_opt_profile_args = 1699, /* opt_profile_args */ + YYSYMBOL_show = 1700, /* show */ + YYSYMBOL_1701_199 = 1701, /* $@199 */ + YYSYMBOL_show_param = 1702, /* show_param */ + YYSYMBOL_1703_200 = 1703, /* $@200 */ + YYSYMBOL_1704_201 = 1704, /* $@201 */ + YYSYMBOL_show_engine_param = 1705, /* show_engine_param */ + YYSYMBOL_master_or_binary = 1706, /* master_or_binary */ + YYSYMBOL_opt_storage = 1707, /* opt_storage */ + YYSYMBOL_opt_db = 1708, /* opt_db */ + YYSYMBOL_opt_full = 1709, /* opt_full */ + YYSYMBOL_from_or_in = 1710, /* from_or_in */ + YYSYMBOL_binlog_in = 1711, /* binlog_in */ + YYSYMBOL_binlog_from = 1712, /* binlog_from */ + YYSYMBOL_wild_and_where = 1713, /* wild_and_where */ + YYSYMBOL_describe = 1714, /* describe */ + YYSYMBOL_1715_202 = 1715, /* $@202 */ + YYSYMBOL_1716_203 = 1716, /* $@203 */ + YYSYMBOL_explainable_command = 1717, /* explainable_command */ + YYSYMBOL_describe_command = 1718, /* describe_command */ + YYSYMBOL_analyze_stmt_command = 1719, /* analyze_stmt_command */ + YYSYMBOL_opt_extended_describe = 1720, /* opt_extended_describe */ + YYSYMBOL_opt_format_json = 1721, /* opt_format_json */ + YYSYMBOL_opt_describe_column = 1722, /* opt_describe_column */ + YYSYMBOL_explain_for_connection = 1723, /* explain_for_connection */ + YYSYMBOL_flush = 1724, /* flush */ + YYSYMBOL_1725_204 = 1725, /* $@204 */ + YYSYMBOL_flush_options = 1726, /* flush_options */ + YYSYMBOL_1727_205 = 1727, /* $@205 */ + YYSYMBOL_opt_flush_lock = 1728, /* opt_flush_lock */ + YYSYMBOL_flush_lock = 1729, /* flush_lock */ + YYSYMBOL_1730_206 = 1730, /* $@206 */ + YYSYMBOL_flush_options_list = 1731, /* flush_options_list */ + YYSYMBOL_flush_option = 1732, /* flush_option */ + YYSYMBOL_opt_table_list = 1733, /* opt_table_list */ + YYSYMBOL_backup = 1734, /* backup */ + YYSYMBOL_backup_statements = 1735, /* backup_statements */ + YYSYMBOL_1736_207 = 1736, /* $@207 */ + YYSYMBOL_opt_delete_gtid_domain = 1737, /* opt_delete_gtid_domain */ + YYSYMBOL_delete_domain_id_list = 1738, /* delete_domain_id_list */ + YYSYMBOL_delete_domain_id = 1739, /* delete_domain_id */ + YYSYMBOL_optional_flush_tables_arguments = 1740, /* optional_flush_tables_arguments */ + YYSYMBOL_reset = 1741, /* reset */ + YYSYMBOL_1742_208 = 1742, /* $@208 */ + YYSYMBOL_reset_options = 1743, /* reset_options */ + YYSYMBOL_reset_option = 1744, /* reset_option */ + YYSYMBOL_1745_209 = 1745, /* $@209 */ + YYSYMBOL_1746_210 = 1746, /* $@210 */ + YYSYMBOL_slave_reset_options = 1747, /* slave_reset_options */ + YYSYMBOL_master_reset_options = 1748, /* master_reset_options */ + YYSYMBOL_purge = 1749, /* purge */ + YYSYMBOL_1750_211 = 1750, /* $@211 */ + YYSYMBOL_kill = 1751, /* kill */ + YYSYMBOL_1752_212 = 1752, /* $@212 */ + YYSYMBOL_kill_type = 1753, /* kill_type */ + YYSYMBOL_kill_option = 1754, /* kill_option */ + YYSYMBOL_opt_connection = 1755, /* opt_connection */ + YYSYMBOL_kill_expr = 1756, /* kill_expr */ + YYSYMBOL_shutdown = 1757, /* shutdown */ + YYSYMBOL_1758_213 = 1758, /* $@213 */ + YYSYMBOL_shutdown_option = 1759, /* shutdown_option */ + YYSYMBOL_use = 1760, /* use */ + YYSYMBOL_load = 1761, /* load */ + YYSYMBOL_1762_214 = 1762, /* $@214 */ + YYSYMBOL_1763_215 = 1763, /* $@215 */ + YYSYMBOL_1764_216 = 1764, /* $@216 */ + YYSYMBOL_1765_217 = 1765, /* $@217 */ + YYSYMBOL_data_or_xml = 1766, /* data_or_xml */ + YYSYMBOL_opt_local = 1767, /* opt_local */ + YYSYMBOL_load_data_lock = 1768, /* load_data_lock */ + YYSYMBOL_opt_duplicate = 1769, /* opt_duplicate */ + YYSYMBOL_opt_field_term = 1770, /* opt_field_term */ + YYSYMBOL_field_term_list = 1771, /* field_term_list */ + YYSYMBOL_field_term = 1772, /* field_term */ + YYSYMBOL_opt_line_term = 1773, /* opt_line_term */ + YYSYMBOL_line_term_list = 1774, /* line_term_list */ + YYSYMBOL_line_term = 1775, /* line_term */ + YYSYMBOL_opt_xml_rows_identified_by = 1776, /* opt_xml_rows_identified_by */ + YYSYMBOL_opt_ignore_lines = 1777, /* opt_ignore_lines */ + YYSYMBOL_lines_or_rows = 1778, /* lines_or_rows */ + YYSYMBOL_opt_field_or_var_spec = 1779, /* opt_field_or_var_spec */ + YYSYMBOL_fields_or_vars = 1780, /* fields_or_vars */ + YYSYMBOL_field_or_var = 1781, /* field_or_var */ + YYSYMBOL_opt_load_data_set_spec = 1782, /* opt_load_data_set_spec */ + YYSYMBOL_load_data_set_list = 1783, /* load_data_set_list */ + YYSYMBOL_load_data_set_elem = 1784, /* load_data_set_elem */ + YYSYMBOL_text_literal = 1785, /* text_literal */ + YYSYMBOL_text_string = 1786, /* text_string */ + YYSYMBOL_hex_or_bin_String = 1787, /* hex_or_bin_String */ + YYSYMBOL_param_marker = 1788, /* param_marker */ + YYSYMBOL_signed_literal = 1789, /* signed_literal */ + YYSYMBOL_literal = 1790, /* literal */ + YYSYMBOL_NUM_literal = 1791, /* NUM_literal */ + YYSYMBOL_temporal_literal = 1792, /* temporal_literal */ + YYSYMBOL_with_clause = 1793, /* with_clause */ + YYSYMBOL_1794_218 = 1794, /* $@218 */ + YYSYMBOL_opt_recursive = 1795, /* opt_recursive */ + YYSYMBOL_with_list = 1796, /* with_list */ + YYSYMBOL_with_list_element = 1797, /* with_list_element */ + YYSYMBOL_opt_cycle = 1798, /* opt_cycle */ + YYSYMBOL_1799_219 = 1799, /* $@219 */ + YYSYMBOL_opt_with_column_list = 1800, /* opt_with_column_list */ + YYSYMBOL_with_column_list = 1801, /* with_column_list */ + YYSYMBOL_ident_sys_alloc = 1802, /* ident_sys_alloc */ + YYSYMBOL_comma_separated_ident_list = 1803, /* comma_separated_ident_list */ + YYSYMBOL_with_element_head = 1804, /* with_element_head */ + YYSYMBOL_insert_ident = 1805, /* insert_ident */ + YYSYMBOL_table_wild = 1806, /* table_wild */ + YYSYMBOL_select_sublist_qualified_asterisk = 1807, /* select_sublist_qualified_asterisk */ + YYSYMBOL_order_ident = 1808, /* order_ident */ + YYSYMBOL_simple_ident = 1809, /* simple_ident */ + YYSYMBOL_simple_ident_nospvar = 1810, /* simple_ident_nospvar */ + YYSYMBOL_field_ident = 1811, /* field_ident */ + YYSYMBOL_table_ident = 1812, /* table_ident */ + YYSYMBOL_table_ident_opt_wild = 1813, /* table_ident_opt_wild */ + YYSYMBOL_table_ident_nodb = 1814, /* table_ident_nodb */ + YYSYMBOL_IDENT_cli = 1815, /* IDENT_cli */ + YYSYMBOL_ident_cli = 1816, /* ident_cli */ + YYSYMBOL_IDENT_sys = 1817, /* IDENT_sys */ + YYSYMBOL_ident_cli_func = 1818, /* ident_cli_func */ + YYSYMBOL_ident_func = 1819, /* ident_func */ + YYSYMBOL_TEXT_STRING_sys = 1820, /* TEXT_STRING_sys */ + YYSYMBOL_TEXT_STRING_literal = 1821, /* TEXT_STRING_literal */ + YYSYMBOL_TEXT_STRING_filesystem = 1822, /* TEXT_STRING_filesystem */ + YYSYMBOL_ident_table_alias = 1823, /* ident_table_alias */ + YYSYMBOL_ident_cli_set_usual_case = 1824, /* ident_cli_set_usual_case */ + YYSYMBOL_ident_sysvar_name = 1825, /* ident_sysvar_name */ + YYSYMBOL_ident = 1826, /* ident */ + YYSYMBOL_label_ident = 1827, /* label_ident */ + YYSYMBOL_ident_or_text = 1828, /* ident_or_text */ + YYSYMBOL_user_maybe_role = 1829, /* user_maybe_role */ + YYSYMBOL_user_or_role = 1830, /* user_or_role */ + YYSYMBOL_user = 1831, /* user */ + YYSYMBOL_keyword_table_alias = 1832, /* keyword_table_alias */ + YYSYMBOL_keyword_ident = 1833, /* keyword_ident */ + YYSYMBOL_keyword_sysvar_name = 1834, /* keyword_sysvar_name */ + YYSYMBOL_keyword_set_usual_case = 1835, /* keyword_set_usual_case */ + YYSYMBOL_non_reserved_keyword_udt = 1836, /* non_reserved_keyword_udt */ + YYSYMBOL_keyword_sp_var_not_label = 1837, /* keyword_sp_var_not_label */ + YYSYMBOL_keyword_sp_head = 1838, /* keyword_sp_head */ + YYSYMBOL_keyword_verb_clause = 1839, /* keyword_verb_clause */ + YYSYMBOL_keyword_set_special_case = 1840, /* keyword_set_special_case */ + YYSYMBOL_keyword_sysvar_type = 1841, /* keyword_sysvar_type */ + YYSYMBOL_keyword_data_type = 1842, /* keyword_data_type */ + YYSYMBOL_keyword_cast_type = 1843, /* keyword_cast_type */ + YYSYMBOL_keyword_func_sp_var_and_label = 1844, /* keyword_func_sp_var_and_label */ + YYSYMBOL_keyword_func_sp_var_not_label = 1845, /* keyword_func_sp_var_not_label */ + YYSYMBOL_keyword_sp_var_and_label = 1846, /* keyword_sp_var_and_label */ + YYSYMBOL_reserved_keyword_udt_not_param_type = 1847, /* reserved_keyword_udt_not_param_type */ + YYSYMBOL_set = 1848, /* set */ + YYSYMBOL_1849_220 = 1849, /* $@220 */ + YYSYMBOL_set_param = 1850, /* set_param */ + YYSYMBOL_1851_221 = 1851, /* $@221 */ + YYSYMBOL_1852_222 = 1852, /* $@222 */ + YYSYMBOL_1853_223 = 1853, /* $@223 */ + YYSYMBOL_set_stmt_option_list = 1854, /* set_stmt_option_list */ + YYSYMBOL_start_option_value_list_following_option_type = 1855, /* start_option_value_list_following_option_type */ + YYSYMBOL_1856_224 = 1856, /* $@224 */ + YYSYMBOL_option_value_list = 1857, /* option_value_list */ + YYSYMBOL_option_value = 1858, /* option_value */ + YYSYMBOL_1859_225 = 1859, /* $@225 */ + YYSYMBOL_option_type = 1860, /* option_type */ + YYSYMBOL_opt_var_type = 1861, /* opt_var_type */ + YYSYMBOL_opt_var_ident_type = 1862, /* opt_var_ident_type */ + YYSYMBOL_set_stmt_option = 1863, /* set_stmt_option */ + YYSYMBOL_1864_226 = 1864, /* $@226 */ + YYSYMBOL_1865_227 = 1865, /* $@227 */ + YYSYMBOL_1866_228 = 1866, /* $@228 */ + YYSYMBOL_option_value_following_option_type = 1867, /* option_value_following_option_type */ + YYSYMBOL_1868_229 = 1868, /* $@229 */ + YYSYMBOL_1869_230 = 1869, /* $@230 */ + YYSYMBOL_1870_231 = 1870, /* $@231 */ + YYSYMBOL_option_value_no_option_type = 1871, /* option_value_no_option_type */ + YYSYMBOL_1872_232 = 1872, /* $@232 */ + YYSYMBOL_1873_233 = 1873, /* $@233 */ + YYSYMBOL_1874_234 = 1874, /* $@234 */ + YYSYMBOL_1875_235 = 1875, /* $@235 */ + YYSYMBOL_1876_236 = 1876, /* $@236 */ + YYSYMBOL_1877_237 = 1877, /* $@237 */ + YYSYMBOL_1878_238 = 1878, /* $@238 */ + YYSYMBOL_1879_239 = 1879, /* $@239 */ + YYSYMBOL_1880_240 = 1880, /* $@240 */ + YYSYMBOL_1881_241 = 1881, /* $@241 */ + YYSYMBOL_transaction_characteristics = 1882, /* transaction_characteristics */ + YYSYMBOL_transaction_access_mode = 1883, /* transaction_access_mode */ + YYSYMBOL_isolation_level = 1884, /* isolation_level */ + YYSYMBOL_transaction_access_mode_types = 1885, /* transaction_access_mode_types */ + YYSYMBOL_isolation_types = 1886, /* isolation_types */ + YYSYMBOL_text_or_password = 1887, /* text_or_password */ + YYSYMBOL_set_expr_or_default = 1888, /* set_expr_or_default */ + YYSYMBOL_lock = 1889, /* lock */ + YYSYMBOL_1890_242 = 1890, /* $@242 */ + YYSYMBOL_opt_lock_wait_timeout = 1891, /* opt_lock_wait_timeout */ + YYSYMBOL_table_or_tables = 1892, /* table_or_tables */ + YYSYMBOL_table_lock_list = 1893, /* table_lock_list */ + YYSYMBOL_table_lock = 1894, /* table_lock */ + YYSYMBOL_lock_option = 1895, /* lock_option */ + YYSYMBOL_unlock = 1896, /* unlock */ + YYSYMBOL_1897_243 = 1897, /* $@243 */ + YYSYMBOL_handler = 1898, /* handler */ + YYSYMBOL_1899_244 = 1899, /* $@244 */ + YYSYMBOL_handler_tail = 1900, /* handler_tail */ + YYSYMBOL_1901_245 = 1901, /* $@245 */ + YYSYMBOL_handler_read_or_scan = 1902, /* handler_read_or_scan */ + YYSYMBOL_handler_scan_function = 1903, /* handler_scan_function */ + YYSYMBOL_handler_rkey_function = 1904, /* handler_rkey_function */ + YYSYMBOL_1905_246 = 1905, /* $@246 */ + YYSYMBOL_handler_rkey_mode = 1906, /* handler_rkey_mode */ + YYSYMBOL_revoke = 1907, /* revoke */ + YYSYMBOL_revoke_command = 1908, /* revoke_command */ + YYSYMBOL_admin_option_for_role = 1909, /* admin_option_for_role */ + YYSYMBOL_grant = 1910, /* grant */ + YYSYMBOL_grant_command = 1911, /* grant_command */ + YYSYMBOL_opt_with_admin = 1912, /* opt_with_admin */ + YYSYMBOL_opt_with_admin_option = 1913, /* opt_with_admin_option */ + YYSYMBOL_role_list = 1914, /* role_list */ + YYSYMBOL_current_role = 1915, /* current_role */ + YYSYMBOL_role_name = 1916, /* role_name */ + YYSYMBOL_grant_role = 1917, /* grant_role */ + YYSYMBOL_opt_table = 1918, /* opt_table */ + YYSYMBOL_grant_privileges = 1919, /* grant_privileges */ + YYSYMBOL_opt_privileges = 1920, /* opt_privileges */ + YYSYMBOL_object_privilege_list = 1921, /* object_privilege_list */ + YYSYMBOL_column_list_privilege = 1922, /* column_list_privilege */ + YYSYMBOL_column_privilege = 1923, /* column_privilege */ + YYSYMBOL_object_privilege = 1924, /* object_privilege */ + YYSYMBOL_opt_and = 1925, /* opt_and */ + YYSYMBOL_require_list = 1926, /* require_list */ + YYSYMBOL_require_list_element = 1927, /* require_list_element */ + YYSYMBOL_grant_ident = 1928, /* grant_ident */ + YYSYMBOL_user_list = 1929, /* user_list */ + YYSYMBOL_grant_list = 1930, /* grant_list */ + YYSYMBOL_user_and_role_list = 1931, /* user_and_role_list */ + YYSYMBOL_via_or_with = 1932, /* via_or_with */ + YYSYMBOL_using_or_as = 1933, /* using_or_as */ + YYSYMBOL_grant_user = 1934, /* grant_user */ + YYSYMBOL_auth_expression = 1935, /* auth_expression */ + YYSYMBOL_auth_token = 1936, /* auth_token */ + YYSYMBOL_opt_auth_str = 1937, /* opt_auth_str */ + YYSYMBOL_opt_require_clause = 1938, /* opt_require_clause */ + YYSYMBOL_resource_option = 1939, /* resource_option */ + YYSYMBOL_resource_option_list = 1940, /* resource_option_list */ + YYSYMBOL_opt_resource_options = 1941, /* opt_resource_options */ + YYSYMBOL_opt_grant_options = 1942, /* opt_grant_options */ + YYSYMBOL_opt_grant_option = 1943, /* opt_grant_option */ + YYSYMBOL_grant_option_list = 1944, /* grant_option_list */ + YYSYMBOL_grant_option = 1945, /* grant_option */ + YYSYMBOL_begin_stmt_mariadb = 1946, /* begin_stmt_mariadb */ + YYSYMBOL_1947_247 = 1947, /* $@247 */ + YYSYMBOL_compound_statement = 1948, /* compound_statement */ + YYSYMBOL_opt_not = 1949, /* opt_not */ + YYSYMBOL_opt_work = 1950, /* opt_work */ + YYSYMBOL_opt_chain = 1951, /* opt_chain */ + YYSYMBOL_opt_release = 1952, /* opt_release */ + YYSYMBOL_commit = 1953, /* commit */ + YYSYMBOL_rollback = 1954, /* rollback */ + YYSYMBOL_savepoint = 1955, /* savepoint */ + YYSYMBOL_release = 1956, /* release */ + YYSYMBOL_unit_type_decl = 1957, /* unit_type_decl */ + YYSYMBOL_union_option = 1958, /* union_option */ + YYSYMBOL_query_expression_option = 1959, /* query_expression_option */ + YYSYMBOL_definer_opt = 1960, /* definer_opt */ + YYSYMBOL_no_definer = 1961, /* no_definer */ + YYSYMBOL_definer = 1962, /* definer */ + YYSYMBOL_view_algorithm = 1963, /* view_algorithm */ + YYSYMBOL_opt_view_suid = 1964, /* opt_view_suid */ + YYSYMBOL_view_suid = 1965, /* view_suid */ + YYSYMBOL_view_list_opt = 1966, /* view_list_opt */ + YYSYMBOL_view_list = 1967, /* view_list */ + YYSYMBOL_view_select = 1968, /* view_select */ + YYSYMBOL_1969_248 = 1969, /* $@248 */ + YYSYMBOL_view_check_option = 1970, /* view_check_option */ + YYSYMBOL_trigger_action_order = 1971, /* trigger_action_order */ + YYSYMBOL_trigger_follows_precedes_clause = 1972, /* trigger_follows_precedes_clause */ + YYSYMBOL_trigger_tail = 1973, /* trigger_tail */ + YYSYMBOL_1974_249 = 1974, /* $@249 */ + YYSYMBOL_1975_250 = 1975, /* $@250 */ + YYSYMBOL_1976_251 = 1976, /* $@251 */ + YYSYMBOL_1977_252 = 1977, /* $@252 */ + YYSYMBOL_1978_253 = 1978, /* $@253 */ + YYSYMBOL_sf_return_type = 1979, /* sf_return_type */ + YYSYMBOL_1980_254 = 1980, /* $@254 */ + YYSYMBOL_xa = 1981, /* xa */ + YYSYMBOL_opt_format_xid = 1982, /* opt_format_xid */ + YYSYMBOL_xid = 1983, /* xid */ + YYSYMBOL_begin_or_start = 1984, /* begin_or_start */ + YYSYMBOL_opt_join_or_resume = 1985, /* opt_join_or_resume */ + YYSYMBOL_opt_one_phase = 1986, /* opt_one_phase */ + YYSYMBOL_opt_suspend = 1987, /* opt_suspend */ + YYSYMBOL_1988_255 = 1988, /* $@255 */ + YYSYMBOL_opt_migrate = 1989, /* opt_migrate */ + YYSYMBOL_install = 1990, /* install */ + YYSYMBOL_uninstall = 1991, /* uninstall */ + YYSYMBOL_keep_gcc_happy = 1992, /* keep_gcc_happy */ + YYSYMBOL__empty = 1993, /* _empty */ + YYSYMBOL_statement = 1994, /* statement */ + YYSYMBOL_sp_statement = 1995, /* sp_statement */ + YYSYMBOL_1996_256 = 1996, /* $@256 */ + YYSYMBOL_1997_257 = 1997, /* $@257 */ + YYSYMBOL_1998_258 = 1998, /* $@258 */ + YYSYMBOL_sp_if_then_statements = 1999, /* sp_if_then_statements */ + YYSYMBOL_sp_case_then_statements = 2000, /* sp_case_then_statements */ + YYSYMBOL_reserved_keyword_udt = 2001, /* reserved_keyword_udt */ + YYSYMBOL_keyword_sp_block_section = 2002, /* keyword_sp_block_section */ + YYSYMBOL_keyword_label = 2003, /* keyword_label */ + YYSYMBOL_keyword_sp_decl = 2004, /* keyword_sp_decl */ + YYSYMBOL_opt_truncate_table_storage_clause = 2005, /* opt_truncate_table_storage_clause */ + YYSYMBOL_ident_for_loop_index = 2006, /* ident_for_loop_index */ + YYSYMBOL_row_field_name = 2007, /* row_field_name */ + YYSYMBOL_while_body = 2008, /* while_body */ + YYSYMBOL_2009_259 = 2009, /* $@259 */ + YYSYMBOL_for_loop_statements = 2010, /* for_loop_statements */ + YYSYMBOL_sp_control_label = 2011, /* sp_control_label */ + YYSYMBOL_sp_block_label = 2012, /* sp_block_label */ + YYSYMBOL_remember_end_opt = 2013, /* remember_end_opt */ + YYSYMBOL_sp_opt_default = 2014, /* sp_opt_default */ + YYSYMBOL_sp_opt_inout = 2015, /* sp_opt_inout */ + YYSYMBOL_sp_proc_stmts1_implicit_block = 2016, /* sp_proc_stmts1_implicit_block */ + YYSYMBOL_2017_260 = 2017, /* $@260 */ + YYSYMBOL_remember_lex = 2018, /* remember_lex */ + YYSYMBOL_keyword_directly_assignable = 2019, /* keyword_directly_assignable */ + YYSYMBOL_ident_directly_assignable = 2020, /* ident_directly_assignable */ + YYSYMBOL_ident_cli_directly_assignable = 2021, /* ident_cli_directly_assignable */ + YYSYMBOL_set_assign = 2022, /* set_assign */ + YYSYMBOL_2023_261 = 2023, /* $@261 */ + YYSYMBOL_2024_262 = 2024, /* $@262 */ + YYSYMBOL_2025_263 = 2025, /* $@263 */ + YYSYMBOL_labels_declaration_oracle = 2026, /* labels_declaration_oracle */ + YYSYMBOL_label_declaration_oracle = 2027, /* label_declaration_oracle */ + YYSYMBOL_opt_exception_clause = 2028, /* opt_exception_clause */ + YYSYMBOL_exception_handlers = 2029, /* exception_handlers */ + YYSYMBOL_exception_handler = 2030, /* exception_handler */ + YYSYMBOL_2031_264 = 2031, /* $@264 */ + YYSYMBOL_sp_no_param = 2032, /* sp_no_param */ + YYSYMBOL_opt_sp_parenthesized_fdparam_list = 2033, /* opt_sp_parenthesized_fdparam_list */ + YYSYMBOL_opt_sp_parenthesized_pdparam_list = 2034, /* opt_sp_parenthesized_pdparam_list */ + YYSYMBOL_opt_sp_name = 2035, /* opt_sp_name */ + YYSYMBOL_opt_package_routine_end_name = 2036, /* opt_package_routine_end_name */ + YYSYMBOL_sp_tail_is = 2037, /* sp_tail_is */ + YYSYMBOL_sp_instr_addr = 2038, /* sp_instr_addr */ + YYSYMBOL_sp_body = 2039, /* sp_body */ + YYSYMBOL_2040_265 = 2040, /* $@265 */ + YYSYMBOL_2041_266 = 2041, /* $@266 */ + YYSYMBOL_2042_267 = 2042, /* $@267 */ + YYSYMBOL_create_package_chistic = 2043, /* create_package_chistic */ + YYSYMBOL_create_package_chistics = 2044, /* create_package_chistics */ + YYSYMBOL_opt_create_package_chistics = 2045, /* opt_create_package_chistics */ + YYSYMBOL_opt_create_package_chistics_init = 2046, /* opt_create_package_chistics_init */ + YYSYMBOL_2047_268 = 2047, /* $@268 */ + YYSYMBOL_package_implementation_executable_section = 2048, /* package_implementation_executable_section */ + YYSYMBOL_package_implementation_declare_section = 2049, /* package_implementation_declare_section */ + YYSYMBOL_package_implementation_declare_section_list1 = 2050, /* package_implementation_declare_section_list1 */ + YYSYMBOL_package_implementation_declare_section_list2 = 2051, /* package_implementation_declare_section_list2 */ + YYSYMBOL_package_routine_lex = 2052, /* package_routine_lex */ + YYSYMBOL_package_specification_function = 2053, /* package_specification_function */ + YYSYMBOL_2054_269 = 2054, /* $@269 */ + YYSYMBOL_package_specification_procedure = 2055, /* package_specification_procedure */ + YYSYMBOL_2056_270 = 2056, /* $@270 */ + YYSYMBOL_package_implementation_routine_definition = 2057, /* package_implementation_routine_definition */ + YYSYMBOL_package_implementation_function_body = 2058, /* package_implementation_function_body */ + YYSYMBOL_2059_271 = 2059, /* $@271 */ + YYSYMBOL_package_implementation_procedure_body = 2060, /* package_implementation_procedure_body */ + YYSYMBOL_2061_272 = 2061, /* $@272 */ + YYSYMBOL_package_implementation_item_declaration = 2062, /* package_implementation_item_declaration */ + YYSYMBOL_opt_package_specification_element_list = 2063, /* opt_package_specification_element_list */ + YYSYMBOL_package_specification_element_list = 2064, /* package_specification_element_list */ + YYSYMBOL_package_specification_element = 2065, /* package_specification_element */ + YYSYMBOL_sp_decl_variable_list_anchored = 2066, /* sp_decl_variable_list_anchored */ + YYSYMBOL_sp_param_name_and_mode = 2067, /* sp_param_name_and_mode */ + YYSYMBOL_sp_param = 2068, /* sp_param */ + YYSYMBOL_sp_param_anchored = 2069, /* sp_param_anchored */ + YYSYMBOL_sf_c_chistics_and_body_standalone = 2070, /* sf_c_chistics_and_body_standalone */ + YYSYMBOL_2071_273 = 2071, /* $@273 */ + YYSYMBOL_sp_tail_standalone = 2072, /* sp_tail_standalone */ + YYSYMBOL_2073_274 = 2073, /* $@274 */ + YYSYMBOL_2074_275 = 2074, /* $@275 */ + YYSYMBOL_drop_routine = 2075, /* drop_routine */ + YYSYMBOL_create_routine = 2076, /* create_routine */ + YYSYMBOL_2077_276 = 2077, /* $@276 */ + YYSYMBOL_2078_277 = 2078, /* $@277 */ + YYSYMBOL_2079_278 = 2079, /* $@278 */ + YYSYMBOL_2080_279 = 2080, /* $@279 */ + YYSYMBOL_2081_280 = 2081, /* $@280 */ + YYSYMBOL_2082_281 = 2082, /* $@281 */ + YYSYMBOL_2083_282 = 2083, /* $@282 */ + YYSYMBOL_opt_sp_decl_body_list = 2084, /* opt_sp_decl_body_list */ + YYSYMBOL_sp_decl_body_list = 2085, /* sp_decl_body_list */ + YYSYMBOL_2086_283 = 2086, /* $@283 */ + YYSYMBOL_sp_decl_non_handler_list = 2087, /* sp_decl_non_handler_list */ + YYSYMBOL_sp_decl_handler_list = 2088, /* sp_decl_handler_list */ + YYSYMBOL_opt_sp_decl_handler_list = 2089, /* opt_sp_decl_handler_list */ + YYSYMBOL_sp_decl_non_handler = 2090, /* sp_decl_non_handler */ + YYSYMBOL_2091_284 = 2091, /* $@284 */ + YYSYMBOL_sp_proc_stmt = 2092, /* sp_proc_stmt */ + YYSYMBOL_sp_labelable_stmt = 2093, /* sp_labelable_stmt */ + YYSYMBOL_sp_proc_stmt_compound_ok = 2094, /* sp_proc_stmt_compound_ok */ + YYSYMBOL_sp_labeled_block = 2095, /* sp_labeled_block */ + YYSYMBOL_2096_285 = 2096, /* $@285 */ + YYSYMBOL_2097_286 = 2097, /* $@286 */ + YYSYMBOL_2098_287 = 2098, /* $@287 */ + YYSYMBOL_opt_not_atomic = 2099, /* opt_not_atomic */ + YYSYMBOL_sp_unlabeled_block = 2100, /* sp_unlabeled_block */ + YYSYMBOL_2101_288 = 2101, /* $@288 */ + YYSYMBOL_2102_289 = 2102, /* $@289 */ + YYSYMBOL_2103_290 = 2103, /* $@290 */ + YYSYMBOL_sp_block_statements_and_exceptions = 2104, /* sp_block_statements_and_exceptions */ + YYSYMBOL_2105_291 = 2105 /* $@291 */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; + + +/* Second part of user prologue. */ +#line 330 "/home/buildbot/git/sql/sql_yacc.yy" + +/* avoid unintentional %union size increases, it's what a parser stack made of */ +static_assert(sizeof(YYSTYPE) == sizeof(void*)*2+8, "%union size check"); +bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); + +#line 2389 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + + +#ifdef short +# undef short +#endif + +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif +#endif + +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; +#endif + +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; +#else +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned +# endif +#endif + +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int16 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YY_USE(E) ((void) (E)) +#else +# define YY_USE(E) /* empty */ +#endif + +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* !defined yyoverflow */ + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 757 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 108324 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 788 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 1318 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 3833 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 6409 + +/* YYMAXUTOK -- Last valid token kind. */ +#define YYMAXUTOK 1021 + + +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int16 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 783, 2, 2, 2, 772, 767, 2, + 779, 780, 770, 769, 782, 768, 787, 771, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 786, + 765, 763, 764, 2, 3, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 773, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 784, 766, 785, 774, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, + 756, 757, 758, 759, 760, 761, 762, 775, 776, 777, + 778, 781 +}; + +#if YYDEBUG +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int16 yyrline[] = +{ + 0, 1975, 1975, 1985, 1984, 2009, 2016, 2018, 2022, 2023, + 2024, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, + 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, + 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, + 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, + 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2076, 2077, + 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, + 2088, 2092, 2099, 2100, 2105, 2104, 2115, 2121, 2123, 2120, + 2132, 2134, 2133, 2143, 2148, 2160, 2159, 2176, 2175, 2185, + 2186, 2190, 2194, 2198, 2202, 2206, 2210, 2220, 2225, 2229, + 2233, 2237, 2241, 2245, 2250, 2254, 2259, 2287, 2291, 2295, + 2300, 2303, 2305, 2306, 2310, 2316, 2318, 2319, 2323, 2329, + 2331, 2332, 2336, 2343, 2347, 2362, 2366, 2372, 2378, 2384, + 2390, 2398, 2402, 2406, 2418, 2421, 2426, 2448, 2460, 2447, + 2483, 2482, 2538, 2545, 2537, 2557, 2564, 2556, 2577, 2583, + 2576, 2595, 2601, 2594, 2613, 2612, 2626, 2624, 2640, 2638, + 2652, 2651, 2662, 2661, 2671, 2678, 2685, 2685, 2688, 2692, + 2693, 2697, 2698, 2702, 2707, 2713, 2719, 2727, 2733, 2739, + 2747, 2755, 2763, 2771, 2779, 2787, 2799, 2815, 2815, 2819, + 2818, 2830, 2831, 2835, 2840, 2845, 2850, 2855, 2860, 2865, + 2873, 2872, 2905, 2904, 2911, 2918, 2919, 2925, 2931, 2941, + 2947, 2953, 2955, 2962, 2963, 2967, 2977, 2978, 2986, 2986, + 3028, 3037, 3038, 3043, 3044, 3045, 3046, 3051, 3056, 3064, + 3065, 3069, 3070, 3075, 3077, 3079, 3081, 3083, 3085, 3087, + 3093, 3094, 3098, 3099, 3104, 3103, 3114, 3113, 3124, 3123, + 3136, 3138, 3141, 3143, 3147, 3151, 3160, 3165, 3165, 3175, + 3176, 3180, 3188, 3190, 3194, 3195, 3199, 3200, 3201, 3206, + 3205, 3217, 3221, 3222, 3226, 3227, 3232, 3238, 3244, 3254, + 3262, 3267, 3275, 3279, 3288, 3286, 3300, 3308, 3313, 3312, + 3326, 3328, 3333, 3343, 3342, 3361, 3362, 3363, 3364, 3369, + 3371, 3376, 3391, 3399, 3403, 3423, 3424, 3428, 3432, 3438, + 3444, 3450, 3456, 3466, 3471, 3479, 3487, 3492, 3498, 3499, + 3505, 3508, 3512, 3520, 3537, 3539, 3557, 3563, 3565, 3567, + 3569, 3571, 3573, 3575, 3577, 3579, 3581, 3583, 3585, 3587, + 3592, 3600, 3616, 3617, 3622, 3628, 3637, 3644, 3653, 3662, + 3667, 3681, 3683, 3685, 3694, 3699, 3706, 3715, 3724, 3726, + 3728, 3730, 3732, 3734, 3736, 3738, 3740, 3742, 3744, 3746, + 3748, 3750, 3755, 3756, 3764, 3776, 3792, 3791, 3802, 3802, + 3824, 3825, 3830, 3829, 3837, 3848, 3853, 3859, 3858, 3865, + 3864, 3873, 3878, 3884, 3883, 3890, 3889, 3899, 3907, 3915, + 3924, 3924, 3947, 3957, 3956, 3977, 3976, 3996, 4002, 4010, + 4011, 4015, 4016, 4017, 4021, 4029, 4034, 4039, 4047, 4048, + 4056, 4074, 4090, 4110, 4115, 4109, 4127, 4129, 4130, 4131, + 4136, 4135, 4206, 4205, 4212, 4217, 4218, 4222, 4223, 4228, + 4227, 4243, 4242, 4257, 4267, 4271, 4272, 4277, 4278, 4282, + 4290, 4295, 4302, 4311, 4325, 4333, 4342, 4341, 4349, 4348, + 4356, 4361, 4368, 4355, 4378, 4377, 4388, 4387, 4397, 4396, + 4406, 4413, 4405, 4428, 4427, 4439, 4441, 4446, 4448, 4450, + 4456, 4455, 4458, 4459, 4473, 4474, 4478, 4479, 4489, 4494, + 4505, 4542, 4543, 4548, 4547, 4563, 4578, 4577, 4599, 4598, + 4604, 4612, 4611, 4614, 4616, 4619, 4618, 4627, 4630, 4629, + 4638, 4639, 4645, 4646, 4663, 4664, 4668, 4669, 4673, 4687, + 4697, 4708, 4717, 4718, 4731, 4733, 4732, 4737, 4735, 4746, + 4747, 4751, 4765, 4777, 4778, 4791, 4800, 4822, 4823, 4826, + 4828, 4833, 4832, 4856, 4868, 4884, 4883, 4898, 4897, 4911, + 4918, 4925, 4945, 4963, 4967, 4994, 5006, 5007, 5012, 5021, + 5011, 5046, 5047, 5051, 5062, 5081, 5094, 5120, 5121, 5126, + 5125, 5162, 5171, 5172, 5176, 5177, 5181, 5182, 5190, 5191, + 5195, 5196, 5200, 5202, 5208, 5214, 5216, 5218, 5220, 5222, + 5224, 5229, 5230, 5230, 5239, 5251, 5254, 5262, 5265, 5275, + 5276, 5280, 5281, 5285, 5286, 5290, 5291, 5292, 5301, 5304, + 5312, 5315, 5322, 5326, 5332, 5334, 5338, 5339, 5343, 5344, + 5345, 5349, 5364, 5369, 5374, 5379, 5384, 5389, 5394, 5409, + 5415, 5430, 5435, 5450, 5456, 5474, 5479, 5484, 5489, 5494, + 5499, 5505, 5504, 5530, 5531, 5532, 5537, 5542, 5547, 5549, + 5551, 5553, 5559, 5564, 5569, 5573, 5578, 5582, 5589, 5596, + 5601, 5608, 5610, 5614, 5633, 5641, 5650, 5660, 5671, 5672, + 5673, 5674, 5675, 5676, 5677, 5681, 5682, 5683, 5687, 5688, + 5689, 5690, 5695, 5702, 5709, 5710, 5714, 5715, 5716, 5717, + 5718, 5722, 5724, 5735, 5734, 5742, 5741, 5749, 5748, 5756, + 5755, 5765, 5762, 5773, 5771, 5780, 5779, 5798, 5806, 5814, + 5822, 5823, 5827, 5837, 5838, 5842, 5843, 5847, 5852, 5851, + 5890, 5889, 5902, 5901, 5912, 5913, 5917, 5918, 5922, 5923, + 5927, 5928, 5932, 5933, 5934, 5935, 5941, 5940, 5948, 5954, + 5963, 5964, 5969, 5972, 5976, 5980, 5987, 5988, 5992, 5993, + 5997, 6003, 6009, 6010, 6018, 6017, 6039, 6040, 6050, 6058, + 6070, 6070, 6073, 6074, 6081, 6088, 6092, 6100, 6101, 6102, + 6106, 6107, 6108, 6109, 6110, 6111, 6119, 6123, 6124, 6138, + 6142, 6146, 6150, 6152, 6159, 6161, 6167, 6168, 6169, 6170, + 6174, 6178, 6183, 6187, 6191, 6195, 6200, 6204, 6211, 6227, + 6228, 6235, 6242, 6250, 6254, 6258, 6262, 6266, 6270, 6274, + 6278, 6280, 6282, 6284, 6286, 6288, 6290, 6292, 6299, 6301, + 6306, 6310, 6311, 6315, 6316, 6320, 6321, 6322, 6323, 6324, + 6328, 6329, 6330, 6331, 6332, 6336, 6342, 6343, 6348, 6350, + 6357, 6358, 6359, 6363, 6367, 6368, 6369, 6370, 6371, 6372, + 6376, 6380, 6381, 6382, 6383, 6386, 6390, 6395, 6396, 6400, + 6401, 6405, 6406, 6411, 6416, 6420, 6426, 6431, 6439, 6440, + 6447, 6451, 6455, 6456, 6460, 6461, 6465, 6466, 6470, 6478, + 6486, 6495, 6499, 6505, 6509, 6510, 6514, 6527, 6533, 6543, + 6544, 6548, 6555, 6559, 6560, 6564, 6565, 6569, 6578, 6582, + 6583, 6587, 6595, 6596, 6600, 6601, 6605, 6606, 6607, 6615, + 6616, 6620, 6624, 6628, 6633, 6634, 6639, 6643, 6649, 6653, + 6660, 6661, 6666, 6665, 6678, 6679, 6683, 6686, 6687, 6688, + 6689, 6693, 6701, 6708, 6709, 6713, 6723, 6724, 6728, 6729, + 6732, 6734, 6738, 6750, 6751, 6755, 6762, 6775, 6776, 6778, + 6780, 6786, 6791, 6797, 6803, 6810, 6820, 6821, 6822, 6823, + 6824, 6828, 6829, 6833, 6834, 6838, 6839, 6843, 6844, 6845, + 6849, 6853, 6865, 6866, 6870, 6871, 6875, 6876, 6880, 6881, + 6885, 6886, 6890, 6891, 6895, 6896, 6901, 6902, 6903, 6907, + 6909, 6914, 6919, 6921, 6925, 6929, 6936, 6937, 6941, 6945, + 6946, 6956, 6957, 6958, 6962, 6963, 6967, 6972, 6980, 6981, + 6989, 6995, 7007, 7008, 7012, 7014, 7024, 7040, 7023, 7063, + 7062, 7079, 7078, 7093, 7102, 7101, 7109, 7108, 7116, 7115, + 7129, 7123, 7137, 7136, 7176, 7175, 7182, 7189, 7197, 7207, + 7188, 7216, 7220, 7228, 7231, 7235, 7239, 7247, 7249, 7250, + 7251, 7252, 7256, 7257, 7258, 7259, 7263, 7264, 7276, 7277, + 7282, 7283, 7286, 7288, 7296, 7304, 7306, 7308, 7309, 7317, + 7318, 7324, 7333, 7331, 7344, 7357, 7356, 7369, 7367, 7380, + 7387, 7397, 7398, 7404, 7416, 7415, 7455, 7462, 7466, 7472, + 7470, 7487, 7489, 7494, 7502, 7501, 7515, 7519, 7518, 7530, + 7531, 7535, 7548, 7549, 7553, 7557, 7564, 7569, 7573, 7580, + 7587, 7591, 7596, 7604, 7612, 7622, 7633, 7643, 7654, 7664, + 7670, 7676, 7683, 7693, 7698, 7704, 7709, 7719, 7724, 7730, + 7735, 7739, 7744, 7745, 7746, 7751, 7756, 7760, 7770, 7772, + 7773, 7774, 7775, 7779, 7784, 7792, 7797, 7805, 7806, 7810, + 7811, 7815, 7815, 7818, 7820, 7824, 7825, 7829, 7830, 7838, + 7839, 7840, 7844, 7845, 7850, 7859, 7860, 7861, 7862, 7867, + 7866, 7876, 7875, 7883, 7890, 7900, 7917, 7920, 7927, 7931, + 7938, 7942, 7946, 7953, 7953, 7959, 7960, 7964, 7965, 7966, + 7970, 7971, 7980, 7987, 7988, 7993, 7992, 8004, 8005, 8006, + 8010, 8012, 8011, 8018, 8017, 8038, 8039, 8043, 8044, 8048, + 8049, 8050, 8054, 8055, 8056, 8061, 8060, 8081, 8082, 8086, + 8091, 8092, 8099, 8101, 8106, 8108, 8107, 8120, 8122, 8121, + 8135, 8136, 8141, 8150, 8151, 8152, 8156, 8163, 8173, 8181, + 8190, 8192, 8191, 8197, 8196, 8219, 8220, 8224, 8225, 8229, + 8230, 8231, 8232, 8233, 8234, 8238, 8239, 8244, 8243, 8264, + 8265, 8266, 8271, 8270, 8281, 8288, 8294, 8303, 8304, 8308, + 8324, 8323, 8336, 8337, 8341, 8342, 8346, 8357, 8368, 8369, + 8374, 8373, 8388, 8389, 8393, 8394, 8398, 8409, 8421, 8420, + 8428, 8428, 8437, 8438, 8443, 8444, 8454, 8453, 8468, 8467, + 8486, 8485, 8502, 8500, 8521, 8522, 8527, 8526, 8540, 8549, + 8539, 8559, 8571, 8635, 8640, 8655, 8656, 8671, 8670, 8686, + 8685, 8698, 8700, 8715, 8723, 8721, 8736, 8754, 8756, 8766, + 8770, 8811, 8820, 8830, 8831, 8835, 8839, 8845, 8852, 8854, + 8863, 8867, 8871, 8878, 8887, 8891, 8898, 8915, 8918, 8926, + 8929, 8936, 8940, 8944, 8948, 8955, 8956, 8960, 8961, 8970, + 8983, 8989, 9000, 9003, 9011, 9014, 9020, 9026, 9035, 9036, + 9037, 9057, 9062, 9084, 9090, 9096, 9102, 9103, 9104, 9105, + 9106, 9110, 9111, 9112, 9116, 9117, 9118, 9122, 9123, 9128, + 9179, 9186, 9229, 9235, 9239, 9245, 9251, 9257, 9263, 9269, + 9275, 9281, 9287, 9293, 9299, 9305, 9309, 9315, 9324, 9330, + 9338, 9344, 9353, 9359, 9367, 9377, 9383, 9390, 9397, 9405, + 9411, 9420, 9424, 9430, 9436, 9442, 9448, 9455, 9461, 9467, + 9473, 9479, 9486, 9492, 9498, 9504, 9510, 9516, 9522, 9528, + 9534, 9538, 9539, 9543, 9544, 9548, 9549, 9553, 9554, 9558, + 9559, 9560, 9561, 9562, 9563, 9567, 9568, 9573, 9576, 9580, + 9581, 9582, 9586, 9587, 9588, 9589, 9590, 9591, 9595, 9596, + 9597, 9601, 9606, 9613, 9635, 9642, 9651, 9652, 9653, 9654, + 9658, 9667, 9668, 9672, 9676, 9677, 9678, 9679, 9680, 9681, + 9682, 9714, 9715, 9716, 9717, 9718, 9719, 9720, 9721, 9722, + 9730, 9738, 9739, 9746, 9752, 9757, 9767, 9772, 9777, 9783, + 9788, 9794, 9805, 9812, 9817, 9822, 9827, 9832, 9837, 9842, + 9850, 9851, 9852, 9853, 9861, 9862, 9871, 9872, 9878, 9882, + 9888, 9894, 9903, 9904, 9913, 9920, 9934, 9940, 9946, 9955, + 9964, 9970, 9976, 9982, 9988, 10003, 10014, 10020, 10026, 10032, + 10038, 10044, 10052, 10059, 10063, 10069, 10077, 10086, 10087, 10091, + 10095, 10102, 10106, 10126, 10133, 10139, 10146, 10153, 10159, 10165, + 10171, 10177, 10184, 10190, 10201, 10208, 10214, 10221, 10227, 10232, + 10237, 10243, 10249, 10254, 10261, 10268, 10276, 10283, 10290, 10297, + 10312, 10318, 10324, 10333, 10344, 10351, 10357, 10365, 10371, 10377, + 10383, 10389, 10397, 10409, 10429, 10428, 10504, 10510, 10516, 10522, + 10527, 10532, 10537, 10542, 10547, 10552, 10572, 10574, 10579, 10580, + 10584, 10585, 10589, 10590, 10594, 10601, 10609, 10636, 10642, 10648, + 10654, 10660, 10666, 10675, 10682, 10684, 10681, 10691, 10702, 10708, + 10714, 10720, 10726, 10732, 10738, 10744, 10750, 10757, 10756, 10777, + 10776, 10807, 10806, 10820, 10829, 10847, 10849, 10851, 10866, 10873, + 10880, 10887, 10894, 10901, 10908, 10915, 10922, 10929, 10940, 10947, + 10958, 10969, 10989, 10988, 10994, 11011, 11017, 11026, 11035, 11045, + 11044, 11056, 11071, 11084, 11089, 11097, 11098, 11103, 11108, 11111, + 11113, 11117, 11122, 11130, 11131, 11136, 11143, 11153, 11152, 11169, + 11171, 11177, 11183, 11189, 11193, 11194, 11195, 11203, 11204, 11205, + 11206, 11207, 11208, 11209, 11210, 11214, 11215, 11216, 11217, 11224, + 11225, 11229, 11234, 11242, 11243, 11247, 11254, 11262, 11271, 11281, + 11282, 11293, 11294, 11306, 11310, 11314, 11322, 11323, 11327, 11331, + 11335, 11342, 11346, 11351, 11352, 11358, 11357, 11386, 11385, 11401, + 11410, 11422, 11434, 11435, 11436, 11437, 11442, 11443, 11444, 11445, + 11446, 11450, 11454, 11458, 11468, 11475, 11483, 11489, 11482, 11535, + 11536, 11542, 11547, 11561, 11569, 11567, 11587, 11585, 11598, 11610, + 11608, 11628, 11627, 11639, 11652, 11650, 11671, 11670, 11683, 11697, + 11698, 11699, 11703, 11704, 11712, 11713, 11717, 11726, 11727, 11728, + 11733, 11734, 11738, 11739, 11743, 11744, 11748, 11749, 11757, 11765, + 11773, 11774, 11787, 11803, 11810, 11822, 11823, 11828, 11832, 11833, + 11834, 11838, 11839, 11844, 11843, 11849, 11848, 11856, 11857, 11860, + 11862, 11862, 11866, 11866, 11871, 11872, 11876, 11878, 11883, 11884, + 11888, 11899, 11913, 11914, 11915, 11916, 11917, 11918, 11919, 11920, + 11921, 11922, 11923, 11924, 11928, 11929, 11930, 11931, 11932, 11933, + 11934, 11935, 11936, 11940, 11941, 11942, 11943, 11946, 11948, 11949, + 11953, 11954, 11958, 11966, 11968, 11972, 11974, 11973, 11987, 11990, + 11989, 12007, 12009, 12013, 12018, 12026, 12027, 12044, 12067, 12068, + 12074, 12075, 12079, 12092, 12091, 12100, 12101, 12110, 12111, 12115, + 12116, 12120, 12121, 12135, 12136, 12140, 12150, 12159, 12166, 12173, + 12183, 12184, 12191, 12201, 12202, 12204, 12206, 12208, 12210, 12219, + 12223, 12224, 12228, 12242, 12243, 12249, 12248, 12259, 12265, 12274, + 12275, 12276, 12282, 12283, 12288, 12295, 12301, 12306, 12317, 12327, + 12338, 12345, 12353, 12363, 12364, 12368, 12369, 12373, 12374, 12379, + 12386, 12393, 12400, 12410, 12415, 12420, 12424, 12430, 12436, 12445, + 12453, 12457, 12464, 12465, 12469, 12474, 12479, 12492, 12496, 12500, + 12504, 12509, 12512, 12516, 12530, 12538, 12549, 12551, 12555, 12556, + 12560, 12561, 12562, 12563, 12564, 12565, 12569, 12570, 12571, 12572, + 12573, 12577, 12578, 12579, 12580, 12584, 12585, 12586, 12587, 12588, + 12592, 12593, 12594, 12595, 12596, 12600, 12605, 12606, 12610, 12611, + 12615, 12616, 12617, 12622, 12621, 12653, 12654, 12658, 12659, 12663, + 12673, 12673, 12685, 12686, 12689, 12709, 12719, 12724, 12732, 12738, + 12749, 12737, 12751, 12766, 12778, 12777, 12800, 12799, 12809, 12808, + 12831, 12837, 12841, 12846, 12845, 12854, 12859, 12865, 12872, 12870, + 12881, 12885, 12886, 12890, 12902, 12915, 12916, 12920, 12934, 12938, + 12947, 12950, 12957, 12958, 12966, 12973, 12965, 12986, 12993, 12985, + 13004, 13013, 13022, 13030, 13031, 13035, 13036, 13040, 13041, 13049, + 13049, 13052, 13052, 13065, 13066, 13068, 13067, 13080, 13086, 13088, + 13092, 13094, 13100, 13104, 13105, 13109, 13110, 13114, 13124, 13125, + 13129, 13130, 13134, 13135, 13139, 13140, 13145, 13144, 13161, 13160, + 13176, 13177, 13181, 13182, 13186, 13191, 13199, 13207, 13218, 13219, + 13228, 13229, 13237, 13239, 13241, 13239, 13251, 13263, 13270, 13280, + 13299, 13269, 13306, 13307, 13311, 13318, 13326, 13327, 13331, 13341, + 13342, 13349, 13348, 13369, 13372, 13379, 13380, 13390, 13405, 13413, + 13426, 13432, 13425, 13437, 13443, 13436, 13451, 13455, 13454, 13488, + 13489, 13493, 13508, 13526, 13527, 13531, 13532, 13536, 13537, 13538, + 13543, 13554, 13542, 13564, 13566, 13569, 13571, 13574, 13575, 13578, + 13582, 13586, 13590, 13594, 13598, 13602, 13606, 13610, 13618, 13621, + 13631, 13630, 13649, 13656, 13664, 13672, 13680, 13688, 13696, 13703, + 13710, 13716, 13718, 13720, 13729, 13733, 13738, 13737, 13744, 13743, + 13750, 13759, 13766, 13771, 13776, 13781, 13786, 13791, 13793, 13795, + 13797, 13804, 13812, 13814, 13822, 13829, 13836, 13844, 13850, 13855, + 13863, 13871, 13879, 13883, 13887, 13894, 13901, 13908, 13915, 13921, + 13927, 13933, 13939, 13945, 13953, 13958, 13965, 13972, 13979, 13986, + 13993, 14000, 14005, 14010, 14015, 14020, 14025, 14037, 14045, 14067, + 14069, 14071, 14076, 14077, 14080, 14082, 14086, 14087, 14091, 14092, + 14096, 14097, 14101, 14102, 14106, 14107, 14111, 14112, 14121, 14133, + 14132, 14151, 14150, 14160, 14161, 14162, 14163, 14164, 14165, 14169, + 14170, 14174, 14181, 14182, 14184, 14185, 14189, 14190, 14203, 14204, + 14205, 14221, 14245, 14244, 14256, 14255, 14267, 14272, 14273, 14286, + 14289, 14288, 14301, 14302, 14307, 14309, 14311, 14313, 14315, 14317, + 14325, 14327, 14329, 14331, 14336, 14338, 14346, 14348, 14350, 14352, + 14354, 14356, 14373, 14374, 14378, 14382, 14395, 14394, 14409, 14419, + 14420, 14423, 14425, 14426, 14430, 14446, 14447, 14452, 14451, 14461, + 14462, 14466, 14466, 14471, 14470, 14476, 14480, 14481, 14485, 14486, + 14493, 14498, 14497, 14512, 14511, 14526, 14527, 14528, 14532, 14533, + 14534, 14543, 14544, 14548, 14552, 14560, 14560, 14565, 14566, 14575, + 14587, 14601, 14612, 14625, 14586, 14636, 14637, 14641, 14642, 14646, + 14647, 14655, 14659, 14660, 14661, 14664, 14666, 14670, 14671, 14675, + 14680, 14687, 14692, 14699, 14701, 14705, 14706, 14710, 14715, 14723, + 14724, 14728, 14730, 14738, 14739, 14743, 14744, 14745, 14749, 14751, + 14756, 14757, 14772, 14773, 14777, 14778, 14782, 14795, 14800, 14805, + 14810, 14818, 14826, 14831, 14839, 14847, 14862, 14869, 14875, 14885, + 14886, 14894, 14895, 14896, 14897, 14911, 14917, 14923, 14929, 14935, + 14941, 14962, 14972, 14982, 14988, 14995, 15005, 15012, 15019, 15030, + 15029, 15054, 15055, 15060, 15061, 15066, 15090, 15093, 15092, 15108, + 15112, 15117, 15121, 15128, 15134, 15143, 15161, 15162, 15166, 15171, + 15179, 15184, 15192, 15197, 15202, 15207, 15213, 15218, 15226, 15231, + 15236, 15241, 15247, 15255, 15256, 15267, 15275, 15279, 15285, 15291, + 15301, 15307, 15316, 15326, 15327, 15331, 15332, 15333, 15337, 15345, + 15346, 15347, 15348, 15352, 15361, 15369, 15377, 15385, 15386, 15394, + 15395, 15399, 15400, 15405, 15414, 15415, 15423, 15424, 15432, 15433, + 15434, 15438, 15449, 15478, 15487, 15487, 15489, 15499, 15500, 15501, + 15502, 15503, 15504, 15505, 15506, 15507, 15508, 15509, 15510, 15515, + 15516, 15517, 15518, 15519, 15520, 15521, 15522, 15523, 15524, 15525, + 15526, 15527, 15531, 15532, 15533, 15534, 15535, 15536, 15537, 15538, + 15539, 15540, 15541, 15542, 15543, 15547, 15548, 15549, 15550, 15551, + 15552, 15553, 15554, 15555, 15556, 15557, 15558, 15559, 15563, 15564, + 15565, 15566, 15567, 15568, 15569, 15570, 15583, 15584, 15585, 15586, + 15587, 15588, 15589, 15590, 15591, 15592, 15593, 15594, 15595, 15596, + 15597, 15598, 15599, 15600, 15601, 15602, 15603, 15604, 15605, 15606, + 15607, 15608, 15609, 15610, 15611, 15612, 15613, 15614, 15615, 15616, + 15617, 15618, 15619, 15620, 15621, 15622, 15623, 15624, 15625, 15626, + 15627, 15628, 15629, 15630, 15631, 15632, 15633, 15634, 15635, 15676, + 15677, 15678, 15679, 15680, 15681, 15692, 15693, 15694, 15695, 15696, + 15697, 15698, 15699, 15700, 15701, 15705, 15706, 15707, 15711, 15712, + 15713, 15722, 15723, 15724, 15725, 15726, 15727, 15728, 15729, 15730, + 15731, 15732, 15733, 15734, 15735, 15736, 15737, 15738, 15739, 15740, + 15741, 15742, 15743, 15744, 15745, 15746, 15747, 15752, 15757, 15758, + 15759, 15760, 15761, 15762, 15763, 15764, 15765, 15766, 15767, 15768, + 15769, 15770, 15771, 15772, 15773, 15774, 15775, 15776, 15777, 15778, + 15779, 15780, 15781, 15782, 15783, 15784, 15785, 15786, 15787, 15788, + 15789, 15790, 15791, 15792, 15793, 15794, 15795, 15796, 15797, 15798, + 15799, 15800, 15805, 15806, 15807, 15808, 15809, 15810, 15811, 15812, + 15813, 15814, 15815, 15816, 15817, 15818, 15819, 15820, 15821, 15822, + 15823, 15824, 15825, 15826, 15827, 15828, 15829, 15830, 15831, 15832, + 15833, 15834, 15835, 15836, 15837, 15838, 15839, 15840, 15841, 15842, + 15843, 15844, 15845, 15846, 15847, 15848, 15849, 15850, 15851, 15852, + 15853, 15854, 15855, 15856, 15857, 15858, 15859, 15860, 15861, 15862, + 15863, 15864, 15865, 15866, 15867, 15868, 15869, 15870, 15871, 15872, + 15873, 15874, 15875, 15876, 15877, 15878, 15879, 15880, 15881, 15882, + 15883, 15884, 15885, 15886, 15887, 15888, 15889, 15890, 15891, 15892, + 15893, 15894, 15895, 15896, 15897, 15898, 15899, 15900, 15901, 15902, + 15903, 15904, 15905, 15906, 15907, 15908, 15909, 15910, 15911, 15912, + 15913, 15914, 15915, 15919, 15920, 15921, 15922, 15923, 15924, 15925, + 15926, 15927, 15928, 15929, 15930, 15931, 15932, 15933, 15934, 15935, + 15936, 15937, 15938, 15939, 15940, 15941, 15942, 15943, 15944, 15945, + 15946, 15947, 15948, 15949, 15950, 15951, 15952, 15953, 15954, 15955, + 15956, 15957, 15958, 15959, 15960, 15961, 15962, 15963, 15964, 15965, + 15966, 15967, 15968, 15969, 15970, 15971, 15972, 15973, 15974, 15975, + 15976, 15977, 15978, 15979, 15980, 15981, 15982, 15983, 15984, 15985, + 15986, 15987, 15988, 15989, 15990, 15991, 15992, 15993, 15994, 15995, + 15996, 15997, 15998, 15999, 16000, 16001, 16002, 16003, 16004, 16005, + 16006, 16007, 16008, 16009, 16010, 16011, 16012, 16013, 16014, 16015, + 16016, 16017, 16018, 16019, 16020, 16021, 16022, 16023, 16024, 16025, + 16026, 16027, 16028, 16029, 16030, 16031, 16032, 16033, 16034, 16035, + 16036, 16037, 16038, 16039, 16040, 16041, 16042, 16043, 16044, 16045, + 16046, 16047, 16048, 16049, 16050, 16051, 16052, 16053, 16054, 16055, + 16056, 16057, 16058, 16059, 16060, 16061, 16062, 16063, 16064, 16068, + 16069, 16075, 16076, 16077, 16078, 16079, 16080, 16081, 16082, 16083, + 16084, 16085, 16086, 16087, 16088, 16089, 16093, 16094, 16095, 16096, + 16100, 16101, 16102, 16103, 16104, 16105, 16110, 16111, 16112, 16113, + 16114, 16115, 16116, 16117, 16118, 16119, 16120, 16121, 16122, 16123, + 16124, 16125, 16126, 16127, 16128, 16129, 16130, 16131, 16132, 16133, + 16134, 16135, 16136, 16137, 16138, 16139, 16140, 16141, 16142, 16143, + 16144, 16145, 16146, 16147, 16148, 16149, 16150, 16151, 16152, 16153, + 16154, 16155, 16156, 16157, 16158, 16159, 16160, 16161, 16162, 16163, + 16164, 16165, 16166, 16167, 16168, 16169, 16170, 16171, 16172, 16173, + 16174, 16175, 16176, 16177, 16178, 16179, 16180, 16181, 16182, 16183, + 16184, 16185, 16186, 16187, 16188, 16189, 16190, 16191, 16192, 16193, + 16194, 16195, 16196, 16197, 16198, 16199, 16200, 16201, 16202, 16203, + 16204, 16205, 16206, 16207, 16208, 16209, 16210, 16211, 16212, 16213, + 16214, 16215, 16216, 16217, 16218, 16219, 16220, 16221, 16222, 16223, + 16224, 16225, 16226, 16227, 16228, 16229, 16231, 16233, 16234, 16235, + 16236, 16237, 16238, 16239, 16240, 16241, 16242, 16243, 16244, 16245, + 16246, 16247, 16248, 16249, 16250, 16251, 16252, 16253, 16254, 16255, + 16256, 16257, 16258, 16259, 16260, 16261, 16262, 16263, 16264, 16265, + 16266, 16267, 16268, 16269, 16270, 16271, 16272, 16273, 16274, 16275, + 16276, 16277, 16278, 16279, 16280, 16281, 16282, 16283, 16284, 16285, + 16286, 16287, 16288, 16289, 16290, 16291, 16292, 16293, 16294, 16295, + 16296, 16297, 16298, 16299, 16300, 16301, 16302, 16303, 16304, 16305, + 16306, 16307, 16308, 16309, 16310, 16311, 16312, 16313, 16314, 16315, + 16316, 16317, 16318, 16319, 16320, 16321, 16322, 16323, 16324, 16325, + 16326, 16327, 16328, 16329, 16330, 16331, 16332, 16333, 16334, 16335, + 16336, 16337, 16338, 16339, 16340, 16341, 16342, 16343, 16344, 16345, + 16346, 16347, 16359, 16358, 16371, 16372, 16374, 16373, 16385, 16384, + 16391, 16389, 16409, 16410, 16415, 16416, 16418, 16417, 16431, 16432, + 16438, 16437, 16442, 16446, 16447, 16448, 16452, 16453, 16454, 16455, + 16459, 16460, 16461, 16462, 16471, 16470, 16484, 16483, 16498, 16497, + 16515, 16514, 16528, 16527, 16541, 16540, 16556, 16555, 16569, 16568, + 16582, 16581, 16594, 16593, 16611, 16610, 16622, 16621, 16633, 16632, + 16643, 16661, 16672, 16679, 16685, 16707, 16723, 16735, 16734, 16748, + 16747, 16759, 16758, 16772, 16773, 16774, 16775, 16779, 16798, 16816, + 16817, 16821, 16822, 16823, 16824, 16829, 16834, 16839, 16850, 16851, + 16852, 16858, 16864, 16876, 16875, 16889, 16890, 16896, 16905, 16906, + 16910, 16911, 16915, 16934, 16935, 16936, 16941, 16942, 16947, 16946, + 16964, 16963, 16975, 16984, 16994, 16993, 17036, 17037, 17041, 17042, + 17046, 17047, 17048, 17049, 17051, 17050, 17063, 17064, 17065, 17066, + 17067, 17073, 17078, 17083, 17088, 17092, 17097, 17106, 17108, 17113, + 17118, 17124, 17130, 17135, 17147, 17148, 17152, 17153, 17157, 17162, + 17170, 17179, 17200, 17200, 17202, 17204, 17208, 17209, 17216, 17218, + 17222, 17227, 17234, 17238, 17247, 17254, 17255, 17256, 17257, 17261, + 17262, 17263, 17264, 17265, 17266, 17267, 17268, 17269, 17270, 17271, + 17272, 17273, 17274, 17275, 17276, 17277, 17278, 17279, 17280, 17281, + 17282, 17283, 17284, 17285, 17286, 17287, 17288, 17289, 17290, 17291, + 17292, 17293, 17294, 17295, 17296, 17297, 17298, 17299, 17300, 17301, + 17302, 17306, 17307, 17311, 17312, 17316, 17323, 17330, 17340, 17349, + 17355, 17362, 17370, 17375, 17383, 17388, 17396, 17401, 17408, 17408, + 17409, 17409, 17412, 17418, 17424, 17429, 17436, 17442, 17449, 17458, + 17462, 17468, 17476, 17478, 17482, 17486, 17490, 17497, 17502, 17507, + 17512, 17517, 17525, 17526, 17530, 17531, 17536, 17537, 17541, 17542, + 17546, 17547, 17551, 17552, 17557, 17556, 17566, 17575, 17576, 17580, + 17581, 17586, 17587, 17588, 17593, 17594, 17595, 17599, 17611, 17620, + 17626, 17635, 17644, 17657, 17659, 17661, 17669, 17670, 17671, 17675, + 17676, 17682, 17683, 17684, 17685, 17686, 17687, 17688, 17698, 17699, + 17704, 17717, 17731, 17732, 17733, 17737, 17738, 17742, 17743, 17748, + 17749, 17753, 17759, 17768, 17768, 17782, 17783, 17784, 17785, 17795, + 17797, 17803, 17809, 17819, 17828, 17834, 17839, 17843, 17817, 17892, + 17892, 17907, 17911, 17915, 17919, 17923, 17927, 17935, 17936, 17952, + 17959, 17966, 17979, 17980, 17981, 17985, 17986, 17987, 17991, 17992, + 17997, 17999, 17998, 18004, 18005, 18009, 18014, 18021, 18026, 18035, + 18041, 18470, 18471, 18475, 18477, 18476, 18490, 18489, 18502, 18501, + 18515, 18519, 18523, 18528, 18529, 18535, 18536, 18537, 18538, 18539, + 18540, 18541, 18542, 18546, 18547, 18548, 18549, 18550, 18551, 18552, + 18553, 18557, 18558, 18559, 18564, 18568, 18577, 18576, 18589, 18595, + 18599, 18609, 18618, 18619, 18620, 18624, 18625, 18626, 18630, 18630, + 18642, 18648, 18649, 18650, 18651, 18652, 18653, 18654, 18655, 18659, + 18660, 18668, 18669, 18675, 18674, 18691, 18690, 18709, 18708, 18732, + 18733, 18737, 18746, 18747, 18751, 18752, 18757, 18756, 18771, 18779, + 18780, 18784, 18785, 18790, 18791, 18796, 18797, 18801, 18802, 18806, + 18810, 18814, 18820, 18810, 18829, 18831, 18836, 18837, 18841, 18842, + 18846, 18846, 18852, 18858, 18866, 18867, 18868, 18874, 18875, 18881, + 18882, 18888, 18899, 18898, 18926, 18925, 18951, 18960, 18969, 18975, + 18974, 18994, 18993, 19013, 19017, 19018, 19022, 19023, 19027, 19034, + 19044, 19052, 19063, 19071, 19076, 19081, 19085, 19090, 19095, 19100, + 19110, 19109, 19124, 19132, 19123, 19146, 19151, 19156, 19161, 19169, + 19182, 19181, 19192, 19190, 19206, 19204, 19218, 19227, 19225, 19247, + 19261, 19266, 19245, 19279, 19283, 19288, 19287, 19296, 19300, 19301, + 19308, 19309, 19316, 19317, 19321, 19322, 19329, 19340, 19339, 19358, + 19359, 19360, 19361, 19362, 19363, 19367, 19368, 19369, 19370, 19371, + 19372, 19373, 19374, 19375, 19376, 19377, 19381, 19382, 19383, 19384, + 19391, 19389, 19405, 19409, 19403, 19425, 19426, 19431, 19430, 19445, + 19451, 19444, 19468, 19466 +}; +#endif + +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "\"invalid token\"", "'@'", "ABORT_SYM", + "IMPOSSIBLE_ACTION", "FORCE_LOOKAHEAD", "END_OF_INPUT", + "COLON_ORACLE_SYM", "PARAM_MARKER", "FOR_SYSTEM_TIME_SYM", + "LEFT_PAREN_ALT", "LEFT_PAREN_WITH", "LEFT_PAREN_LIKE", + "ORACLE_CONCAT_SYM", "PERCENT_ORACLE_SYM", "WITH_CUBE_SYM", + "WITH_ROLLUP_SYM", "WITH_SYSTEM_SYM", "IDENT", "IDENT_QUOTED", + "LEX_HOSTNAME", "UNDERSCORE_CHARSET", "BIN_NUM", "DECIMAL_NUM", + "FLOAT_NUM", "HEX_NUM", "HEX_STRING", "LONG_NUM", "NCHAR_STRING", "NUM", + "TEXT_STRING", "ULONGLONG_NUM", "AND_AND_SYM", "DOT_DOT_SYM", + "EQUAL_SYM", "GE", "LE", "MYSQL_CONCAT_SYM", "NE", "NOT2_SYM", "OR2_SYM", + "SET_VAR", "SHIFT_LEFT", "SHIFT_RIGHT", "ACCESSIBLE_SYM", "ADD", "ALL", + "ALTER", "ANALYZE_SYM", "AND_SYM", "ASC", "ASENSITIVE_SYM", "AS", + "BEFORE_SYM", "BETWEEN_SYM", "BIGINT", "BINARY", "BIT_AND", "BIT_OR", + "BIT_XOR", "BLOB_MARIADB_SYM", "BLOB_ORACLE_SYM", "BODY_ORACLE_SYM", + "BOTH", "BY", "CALL_SYM", "CASCADE", "CASE_SYM", "CAST_SYM", "CHANGE", + "CHAR_SYM", "CHECK_SYM", "COLLATE_SYM", "CONDITION_SYM", "CONSTRAINT", + "CONTINUE_MARIADB_SYM", "CONTINUE_ORACLE_SYM", "CONVERT_SYM", + "COUNT_SYM", "CREATE", "CROSS", "CUME_DIST_SYM", "CURDATE", + "CURRENT_ROLE", "CURRENT_USER", "CURSOR_SYM", "CURTIME", "DATABASE", + "DATABASES", "DATE_ADD_INTERVAL", "DATE_SUB_INTERVAL", "DAY_HOUR_SYM", + "DAY_MICROSECOND_SYM", "DAY_MINUTE_SYM", "DAY_SECOND_SYM", "DECIMAL_SYM", + "DECLARE_MARIADB_SYM", "DECLARE_ORACLE_SYM", "DEFAULT", + "DELETE_DOMAIN_ID_SYM", "DELETE_SYM", "DENSE_RANK_SYM", "DESCRIBE", + "DESC", "DETERMINISTIC_SYM", "DISTINCT", "DIV_SYM", "DO_DOMAIN_IDS_SYM", + "DOUBLE_SYM", "DROP", "DUAL_SYM", "EACH_SYM", "ELSEIF_MARIADB_SYM", + "ELSE", "ELSIF_ORACLE_SYM", "EMPTY_SYM", "ENCLOSED", "ESCAPED", + "EXCEPT_SYM", "EXISTS", "EXTRACT_SYM", "FALSE_SYM", "FETCH_SYM", + "FIRST_VALUE_SYM", "FLOAT_SYM", "FOREIGN", "FOR_SYM", "FROM", + "FULLTEXT_SYM", "GOTO_ORACLE_SYM", "GRANT", "GROUP_CONCAT_SYM", + "JSON_ARRAYAGG_SYM", "JSON_OBJECTAGG_SYM", "JSON_TABLE_SYM", "GROUP_SYM", + "HAVING", "HOUR_MICROSECOND_SYM", "HOUR_MINUTE_SYM", "HOUR_SECOND_SYM", + "IF_SYM", "IGNORE_DOMAIN_IDS_SYM", "IGNORE_SYM", "IGNORED_SYM", + "INDEX_SYM", "INFILE", "INNER_SYM", "INOUT_SYM", "INSENSITIVE_SYM", + "INSERT", "IN_SYM", "INTERSECT_SYM", "INTERVAL_SYM", "INTO", "INT_SYM", + "IS", "ITERATE_SYM", "JOIN_SYM", "KEYS", "KEY_SYM", "KILL_SYM", + "LAG_SYM", "LEADING", "LEAD_SYM", "LEAVE_SYM", "LEFT", "LIKE", "LIMIT", + "LINEAR_SYM", "LINES", "LOAD", "LOCATOR_SYM", "LOCK_SYM", "LONGBLOB", + "LONG_SYM", "LONGTEXT", "LOOP_SYM", "LOW_PRIORITY", + "MASTER_SSL_VERIFY_SERVER_CERT_SYM", "MATCH", "MAX_SYM", "MAXVALUE_SYM", + "MEDIAN_SYM", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIN_SYM", + "MINUS_ORACLE_SYM", "MINUTE_MICROSECOND_SYM", "MINUTE_SECOND_SYM", + "MODIFIES_SYM", "MOD_SYM", "NATURAL", "NEG", "NESTED_SYM", "NOT_SYM", + "NO_WRITE_TO_BINLOG", "NOW_SYM", "NTH_VALUE_SYM", "NTILE_SYM", + "NULL_SYM", "NUMERIC_SYM", "ON", "OPTIMIZE", "OPTIONALLY", "ORDER_SYM", + "ORDINALITY_SYM", "OR_SYM", "OTHERS_ORACLE_SYM", "OUTER", "OUTFILE", + "OUT_SYM", "OVER_SYM", "PACKAGE_ORACLE_SYM", "PAGE_CHECKSUM_SYM", + "PARSE_VCOL_EXPR_SYM", "PARTITION_SYM", "PATH_SYM", + "PERCENTILE_CONT_SYM", "PERCENTILE_DISC_SYM", "PERCENT_RANK_SYM", + "PORTION_SYM", "POSITION_SYM", "PRECISION", "PRIMARY_SYM", + "PROCEDURE_SYM", "PURGE", "RAISE_ORACLE_SYM", "RANGE_SYM", "RANK_SYM", + "READS_SYM", "READ_SYM", "READ_WRITE_SYM", "REAL", "RECURSIVE_SYM", + "REFERENCES", "REF_SYSTEM_ID_SYM", "REGEXP", "RELEASE_SYM", "RENAME", + "REPEAT_SYM", "REQUIRE_SYM", "RESIGNAL_SYM", "RESTRICT", "RETURNING_SYM", + "RETURN_MARIADB_SYM", "RETURN_ORACLE_SYM", "REVOKE", "RIGHT", + "ROW_NUMBER_SYM", "ROWS_SYM", "ROWTYPE_ORACLE_SYM", + "SECOND_MICROSECOND_SYM", "SELECT_SYM", "SENSITIVE_SYM", "SEPARATOR_SYM", + "SERVER_OPTIONS", "SET", "SHOW", "SIGNAL_SYM", "SMALLINT", "SPATIAL_SYM", + "SPECIFIC_SYM", "SQL_BIG_RESULT", "SQLEXCEPTION_SYM", "SQL_SMALL_RESULT", + "SQLSTATE_SYM", "SQL_SYM", "SQLWARNING_SYM", "SSL_SYM", "STARTING", + "STATS_AUTO_RECALC_SYM", "STATS_PERSISTENT_SYM", + "STATS_SAMPLE_PAGES_SYM", "STDDEV_SAMP_SYM", "STD_SYM", "STRAIGHT_JOIN", + "SUM_SYM", "SYSDATE", "TABLE_REF_PRIORITY", "TABLE_SYM", "TERMINATED", + "THEN_SYM", "TINYBLOB", "TINYINT", "TINYTEXT", "TO_SYM", "TRAILING", + "TRIGGER_SYM", "TRUE_SYM", "UNDO_SYM", "UNION_SYM", "UNIQUE_SYM", + "UNLOCK_SYM", "UNSIGNED", "UPDATE_SYM", "USAGE", "USE_SYM", "USING", + "UTC_DATE_SYM", "UTC_TIMESTAMP_SYM", "UTC_TIME_SYM", "VALUES_IN_SYM", + "VALUES_LESS_SYM", "VALUES", "VARBINARY", "VARCHAR", "VARIANCE_SYM", + "VAR_SAMP_SYM", "VARYING", "WHEN_SYM", "WHERE", "WHILE_SYM", "WITH", + "XOR", "YEAR_MONTH_SYM", "ZEROFILL", "BODY_MARIADB_SYM", + "ELSEIF_ORACLE_SYM", "ELSIF_MARIADB_SYM", "EXCEPTION_ORACLE_SYM", + "GOTO_MARIADB_SYM", "OTHERS_MARIADB_SYM", "PACKAGE_MARIADB_SYM", + "RAISE_MARIADB_SYM", "ROWTYPE_MARIADB_SYM", "ROWNUM_SYM", "REPLACE", + "SUBSTRING", "TRIM", "ACCOUNT_SYM", "ACTION", "ADMIN_SYM", "ADDDATE_SYM", + "AFTER_SYM", "AGAINST", "AGGREGATE_SYM", "ALGORITHM_SYM", "ALWAYS_SYM", + "ANY_SYM", "ASCII_SYM", "AT_SYM", "ATOMIC_SYM", "AUTHORS_SYM", + "AUTOEXTEND_SIZE_SYM", "AUTO_INC", "AUTO_SYM", "AVG_ROW_LENGTH", + "AVG_SYM", "BACKUP_SYM", "BEGIN_MARIADB_SYM", "BEGIN_ORACLE_SYM", + "BINLOG_SYM", "BIT_SYM", "BLOCK_SYM", "BOOL_SYM", "BOOLEAN_SYM", + "BTREE_SYM", "BYTE_SYM", "CACHE_SYM", "CASCADED", "CATALOG_NAME_SYM", + "CHAIN_SYM", "CHANGED", "CHANNEL_SYM", "CHARSET", "CHECKPOINT_SYM", + "CHECKSUM_SYM", "CIPHER_SYM", "CLASS_ORIGIN_SYM", "CLIENT_SYM", + "CLOB_MARIADB_SYM", "CLOB_ORACLE_SYM", "CLOSE_SYM", "COALESCE", + "CODE_SYM", "COLLATION_SYM", "COLUMNS", "COLUMN_ADD_SYM", + "COLUMN_CHECK_SYM", "COLUMN_CREATE_SYM", "COLUMN_DELETE_SYM", + "COLUMN_GET_SYM", "COLUMN_SYM", "COLUMN_NAME_SYM", "COMMENT_SYM", + "COMMITTED_SYM", "COMMIT_SYM", "COMPACT_SYM", "COMPLETION_SYM", + "COMPRESSED_SYM", "CONCURRENT", "CONNECTION_SYM", "CONSISTENT_SYM", + "CONSTRAINT_CATALOG_SYM", "CONSTRAINT_NAME_SYM", "CONSTRAINT_SCHEMA_SYM", + "CONTAINS_SYM", "CONTEXT_SYM", "CONTRIBUTORS_SYM", "CPU_SYM", "CUBE_SYM", + "CURRENT_SYM", "CURRENT_POS_SYM", "CURSOR_NAME_SYM", "CYCLE_SYM", + "DATAFILE_SYM", "DATA_SYM", "DATETIME", "DATE_SYM", "DAY_SYM", + "DEALLOCATE_SYM", "DEFINER_SYM", "DELAYED_SYM", "DELAY_KEY_WRITE_SYM", + "DES_KEY_FILE", "DIAGNOSTICS_SYM", "DIRECTORY_SYM", "DISABLE_SYM", + "DISCARD", "DISK_SYM", "DO_SYM", "DUMPFILE", "DUPLICATE_SYM", + "DYNAMIC_SYM", "ENABLE_SYM", "END", "ENDS_SYM", "ENGINES_SYM", + "ENGINE_SYM", "ENUM", "ERROR_SYM", "ERRORS", "ESCAPE_SYM", "EVENTS_SYM", + "EVENT_SYM", "EVERY_SYM", "EXCHANGE_SYM", "EXAMINED_SYM", "EXCLUDE_SYM", + "EXECUTE_SYM", "EXCEPTION_MARIADB_SYM", "EXIT_MARIADB_SYM", + "EXIT_ORACLE_SYM", "EXPANSION_SYM", "EXPIRE_SYM", "EXPORT_SYM", + "EXTENDED_SYM", "EXTENT_SIZE_SYM", "FAST_SYM", "FAULTS_SYM", + "FEDERATED_SYM", "FILE_SYM", "FIRST_SYM", "FIXED_SYM", "FLUSH_SYM", + "FOLLOWS_SYM", "FOLLOWING_SYM", "FORCE_SYM", "FORMAT_SYM", "FOUND_SYM", + "FULL", "FUNCTION_SYM", "GENERAL", "GENERATED_SYM", "GET_FORMAT", + "GET_SYM", "GLOBAL_SYM", "GRANTS", "HANDLER_SYM", "HARD_SYM", "HASH_SYM", + "HELP_SYM", "HIGH_PRIORITY", "HISTORY_SYM", "HOST_SYM", "HOSTS_SYM", + "HOUR_SYM", "ID_SYM", "IDENTIFIED_SYM", "IGNORE_SERVER_IDS_SYM", + "IMMEDIATE_SYM", "IMPORT", "INCREMENT_SYM", "INDEXES", + "INITIAL_SIZE_SYM", "INSERT_METHOD", "INSTALL_SYM", "INVOKER_SYM", + "IO_SYM", "IPC_SYM", "ISOLATION", "ISOPEN_SYM", "ISSUER_SYM", + "INVISIBLE_SYM", "JSON_SYM", "KEY_BLOCK_SIZE", "LANGUAGE_SYM", + "LAST_SYM", "LAST_VALUE", "LASTVAL_SYM", "LEAVES", "LESS_SYM", + "LEVEL_SYM", "LIST_SYM", "LOCAL_SYM", "LOCKED_SYM", "LOCKS_SYM", + "LOGFILE_SYM", "LOGS_SYM", "MASTER_CONNECT_RETRY_SYM", + "MASTER_DELAY_SYM", "MASTER_GTID_POS_SYM", "MASTER_HOST_SYM", + "MASTER_LOG_FILE_SYM", "MASTER_LOG_POS_SYM", "MASTER_PASSWORD_SYM", + "MASTER_PORT_SYM", "MASTER_SERVER_ID_SYM", "MASTER_SSL_CAPATH_SYM", + "MASTER_SSL_CA_SYM", "MASTER_SSL_CERT_SYM", "MASTER_SSL_CIPHER_SYM", + "MASTER_SSL_CRL_SYM", "MASTER_SSL_CRLPATH_SYM", "MASTER_SSL_KEY_SYM", + "MASTER_SSL_SYM", "MASTER_SYM", "MASTER_USER_SYM", "MASTER_USE_GTID_SYM", + "MASTER_HEARTBEAT_PERIOD_SYM", "MASTER_DEMOTE_TO_SLAVE_SYM", + "MAX_CONNECTIONS_PER_HOUR", "MAX_QUERIES_PER_HOUR", "MAX_ROWS", + "MAX_SIZE_SYM", "MAX_UPDATES_PER_HOUR", "MAX_STATEMENT_TIME_SYM", + "MAX_USER_CONNECTIONS_SYM", "MEDIUM_SYM", "MEMORY_SYM", "MERGE_SYM", + "MESSAGE_TEXT_SYM", "MICROSECOND_SYM", "MIGRATE_SYM", "MINUTE_SYM", + "MINVALUE_SYM", "MIN_ROWS", "MODE_SYM", "MODIFY_SYM", "MONITOR_SYM", + "MONTH_SYM", "MUTEX_SYM", "MYSQL_SYM", "MYSQL_ERRNO_SYM", "NAMES_SYM", + "NAME_SYM", "NATIONAL_SYM", "NCHAR_SYM", "NEVER_SYM", "NEXT_SYM", + "NEXTVAL_SYM", "NOCACHE_SYM", "NOCYCLE_SYM", "NODEGROUP_SYM", "NONE_SYM", + "NOTFOUND_SYM", "NO_SYM", "NOMAXVALUE_SYM", "NOMINVALUE_SYM", + "NO_WAIT_SYM", "NOWAIT_SYM", "NUMBER_MARIADB_SYM", "NUMBER_ORACLE_SYM", + "NVARCHAR_SYM", "OF_SYM", "OFFSET_SYM", "OLD_PASSWORD_SYM", "ONE_SYM", + "ONLY_SYM", "ONLINE_SYM", "OPEN_SYM", "OPTIONS_SYM", "OPTION", + "OVERLAPS_SYM", "OWNER_SYM", "PACK_KEYS_SYM", "PAGE_SYM", "PARSER_SYM", + "PARTIAL", "PARTITIONS_SYM", "PARTITIONING_SYM", "PASSWORD_SYM", + "PERIOD_SYM", "PERSISTENT_SYM", "PHASE_SYM", "PLUGINS_SYM", "PLUGIN_SYM", + "PORT_SYM", "PRECEDES_SYM", "PRECEDING_SYM", "PREPARE_SYM", + "PRESERVE_SYM", "PREV_SYM", "PREVIOUS_SYM", "PRIVILEGES", "PROCESS", + "PROCESSLIST_SYM", "PROFILE_SYM", "PROFILES_SYM", "PROXY_SYM", + "QUARTER_SYM", "QUERY_SYM", "QUICK", "RAW_MARIADB_SYM", "RAW_ORACLE_SYM", + "READ_ONLY_SYM", "REBUILD_SYM", "RECOVER_SYM", "REDOFILE_SYM", + "REDO_BUFFER_SIZE_SYM", "REDUNDANT_SYM", "RELAY", "RELAYLOG_SYM", + "RELAY_LOG_FILE_SYM", "RELAY_LOG_POS_SYM", "RELAY_THREAD", "RELOAD", + "REMOVE_SYM", "REORGANIZE_SYM", "REPAIR", "REPEATABLE_SYM", "REPLAY_SYM", + "REPLICATION", "RESET_SYM", "RESTART_SYM", "RESOURCES", "RESTORE_SYM", + "RESUME_SYM", "RETURNED_SQLSTATE_SYM", "RETURNS_SYM", "REUSE_SYM", + "REVERSE_SYM", "ROLE_SYM", "ROLLBACK_SYM", "ROLLUP_SYM", "ROUTINE_SYM", + "ROWCOUNT_SYM", "ROW_SYM", "ROW_COUNT_SYM", "ROW_FORMAT_SYM", + "RTREE_SYM", "SAVEPOINT_SYM", "SCHEDULE_SYM", "SCHEMA_NAME_SYM", + "SECOND_SYM", "SECURITY_SYM", "SEQUENCE_SYM", "SERIALIZABLE_SYM", + "SERIAL_SYM", "SESSION_SYM", "SERVER_SYM", "SETVAL_SYM", "SHARE_SYM", + "SHUTDOWN", "SIGNED_SYM", "SIMPLE_SYM", "SKIP_SYM", "SLAVE", "SLAVES", + "SLAVE_POS_SYM", "SLOW", "SNAPSHOT_SYM", "SOCKET_SYM", "SOFT_SYM", + "SONAME_SYM", "SOUNDS_SYM", "SOURCE_SYM", "SQL_BUFFER_RESULT", + "SQL_CACHE_SYM", "SQL_CALC_FOUND_ROWS", "SQL_NO_CACHE_SYM", "SQL_THREAD", + "STAGE_SYM", "STARTS_SYM", "START_SYM", "STATEMENT_SYM", "STATUS_SYM", + "STOP_SYM", "STORAGE_SYM", "STORED_SYM", "STRING_SYM", + "SUBCLASS_ORIGIN_SYM", "SUBDATE_SYM", "SUBJECT_SYM", "SUBPARTITIONS_SYM", + "SUBPARTITION_SYM", "SUPER_SYM", "SUSPEND_SYM", "SWAPS_SYM", + "SWITCHES_SYM", "SYSTEM", "SYSTEM_TIME_SYM", "TABLES", "TABLESPACE", + "TABLE_CHECKSUM_SYM", "TABLE_NAME_SYM", "TEMPORARY", "TEMPTABLE_SYM", + "TEXT_SYM", "THAN_SYM", "TIES_SYM", "TIMESTAMP", "TIMESTAMP_ADD", + "TIMESTAMP_DIFF", "TIME_SYM", "TRANSACTION_SYM", "TRANSACTIONAL_SYM", + "THREADS_SYM", "TRIGGERS_SYM", "TRIM_ORACLE", "TRUNCATE_SYM", "TYPE_SYM", + "UDF_RETURNS_SYM", "UNBOUNDED_SYM", "UNCOMMITTED_SYM", "UNDEFINED_SYM", + "UNDOFILE_SYM", "UNDO_BUFFER_SIZE_SYM", "UNICODE_SYM", "UNINSTALL_SYM", + "UNKNOWN_SYM", "UNTIL_SYM", "UPGRADE_SYM", "USER_SYM", "USE_FRM", + "VALUE_SYM", "VARCHAR2_MARIADB_SYM", "VARCHAR2_ORACLE_SYM", "VARIABLES", + "VERSIONING_SYM", "VIA_SYM", "VIEW_SYM", "VISIBLE_SYM", "VIRTUAL_SYM", + "WAIT_SYM", "WARNINGS", "WEEK_SYM", "WEIGHT_STRING_SYM", "WINDOW_SYM", + "WITHIN", "WITHOUT", "WORK_SYM", "WRAPPER_SYM", "WRITE_SYM", "X509_SYM", + "XA_SYM", "XML_SYM", "YEAR_SYM", "CONDITIONLESS_JOIN", "ON_SYM", + "PREC_BELOW_NOT", "'='", "'>'", "'<'", "'|'", "'&'", "'-'", "'+'", "'*'", + "'/'", "'%'", "'^'", "'~'", "SUBQUERY_AS_EXPR", + "PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE", "USER", + "PREC_BELOW_CONTRACTION_TOKEN2", "'('", "')'", "EMPTY_FROM_CLAUSE", + "','", "'!'", "'{'", "'}'", "';'", "'.'", "$accept", "query", "$@1", + "opt_end_of_input", "directly_executable_statement", "verb_clause", + "deallocate", "deallocate_or_drop", "prepare", "$@2", "execute", "$@3", + "$@4", "execute_using", "$@5", "execute_params", "help", "$@6", "change", + "$@7", "master_defs", "master_def", "ignore_server_id_list", + "ignore_server_id", "do_domain_id_list", "do_domain_id", + "ignore_domain_id_list", "ignore_domain_id", "master_file_def", + "optional_connection_name", "connection_name", "optional_for_channel", + "for_channel", "create", "$@8", "$@9", "$@10", "$@11", "$@12", "$@13", + "$@14", "$@15", "$@16", "$@17", "$@18", "$@19", "$@20", "$@21", "$@22", + "$@23", "$@24", "opt_sequence", "sequence_defs", "sequence_def", + "force_lookahead", "server_def", "$@25", "server_options_list", + "server_option", "event_tail", "$@26", "ev_schedule_time", "$@27", + "opt_ev_status", "ev_starts", "ev_ends", "opt_ev_on_completion", + "ev_on_completion", "opt_ev_comment", "ev_sql_stmt", "$@28", + "clear_privileges", "opt_aggregate", "sp_handler", "sp_name", + "sp_a_chistics", "sp_c_chistics", "sp_chistic", "sp_c_chistic", + "sp_suid", "call", "$@29", "$@30", "$@31", "opt_sp_cparam_list", + "opt_sp_cparams", "sp_cparams", "sp_fdparam_list", "$@32", "sp_fdparams", + "sp_param_name", "sp_pdparam_list", "sp_pdparams", "sp_parameter_type", + "sp_parenthesized_pdparam_list", "$@33", "sp_parenthesized_fdparam_list", + "sp_proc_stmts", "sp_proc_stmts1", "optionally_qualified_column_ident", + "row_field_definition", "row_field_definition_list", "row_type_body", + "sp_decl_idents_init_vars", "sp_decl_variable_list", "$@34", + "sp_decl_handler", "$@35", "opt_parenthesized_cursor_formal_parameters", + "sp_cursor_stmt_lex", "sp_cursor_stmt", "$@36", "sp_handler_type", + "sp_hcond_list", "sp_hcond_element", "sp_cond", "sqlstate", "opt_value", + "sp_hcond", "raise_stmt_oracle", "signal_stmt", "signal_value", + "opt_signal_value", "opt_set_signal_information", + "signal_information_item_list", "signal_allowed_expr", + "signal_condition_information_item_name", "resignal_stmt", + "get_diagnostics", "which_area", "diagnostics_information", + "statement_information", "statement_information_item", + "simple_target_specification", "statement_information_item_name", + "condition_number", "condition_information", + "condition_information_item", "condition_information_item_name", + "sp_decl_ident", "sp_decl_idents", "sp_proc_stmt_if", "$@37", + "sp_proc_stmt_statement", "$@38", "RETURN_ALLMODES_SYM", + "sp_proc_stmt_return", "$@39", "sp_proc_stmt_exit_oracle", "$@40", + "$@41", "sp_proc_stmt_continue_oracle", "$@42", "$@43", + "sp_proc_stmt_leave", "sp_proc_stmt_iterate", "sp_proc_stmt_goto_oracle", + "expr_lex", "@44", "assignment_source_lex", "assignment_source_expr", + "$@45", "for_loop_bound_expr", "$@46", "cursor_actual_parameters", + "opt_parenthesized_cursor_actual_parameters", "sp_proc_stmt_with_cursor", + "sp_proc_stmt_open", "sp_proc_stmt_fetch_head", "sp_proc_stmt_fetch", + "sp_proc_stmt_close", "sp_fetch_list", "sp_if", "$@47", "$@48", + "sp_elseifs", "case_stmt_specification", "$@49", "case_stmt_body", + "$@50", "simple_when_clause_list", "searched_when_clause_list", + "simple_when_clause", "$@51", "searched_when_clause", "$@52", + "else_clause_opt", "sp_opt_label", "opt_sp_for_loop_direction", + "sp_for_loop_index_and_bounds", "sp_for_loop_bounds", "loop_body", + "repeat_body", "pop_sp_loop_label", "sp_labeled_control", "$@53", "$@54", + "$@55", "$@56", "$@57", "$@58", "sp_unlabeled_control", "$@59", "$@60", + "$@61", "$@62", "$@63", "trg_action_time", "trg_event", "create_body", + "$@64", "create_like", "opt_create_select", + "create_select_query_expression", "opt_create_partitioning", + "opt_partitioning", "partitioning", "$@65", "have_partitioning", + "partition_entry", "$@66", "partition", "$@67", "part_type_def", "$@68", + "$@69", "$@70", "opt_linear", "opt_key_algo", "part_field_list", + "part_field_item_list", "part_field_item", "part_column_list", + "part_func", "sub_part_func", "opt_num_parts", "opt_sub_part", "$@71", + "$@72", "sub_part_field_list", "sub_part_field_item", "part_func_expr", + "opt_num_subparts", "part_defs", "part_def_list", "opt_partition", + "part_definition", "$@73", "part_name", "opt_part_values", "$@74", + "$@75", "part_func_max", "part_values_in", "part_value_list", + "part_value_item", "$@76", "$@77", "part_value_item_list", + "part_value_expr_item", "opt_sub_partition", "sub_part_list", + "sub_part_definition", "$@78", "sub_name", "opt_part_options", + "part_option_list", "part_option", "opt_subpart_options", + "subpart_option_list", "server_part_option", "opt_versioning_rotation", + "$@79", "opt_versioning_interval_start", "opt_vers_auto_part", "opt_as", + "opt_create_database_options", "create_database_options", + "create_database_option", "opt_if_not_exists_table_element", + "opt_if_not_exists", "create_or_replace", "opt_create_table_options", + "create_table_options_space_separated", "create_table_options", + "create_table_option", "$@80", "engine_defined_option", + "opt_versioning_option", "versioning_option", "default_charset", + "default_collation", "storage_engines", "known_storage_engines", + "row_types", "merge_insert_types", "udf_type", "create_field_list", + "create_field_list_parens", "field_list", "field_list_item", + "column_def", "key_def", "$@81", "$@82", "$@83", "$@84", "$@85", "$@86", + "$@87", "constraint_def", "period_for_system_time", + "period_for_application_time", "opt_check_constraint", + "check_constraint", "opt_constraint_no_id", "opt_constraint", + "constraint", "field_spec", "@88", "field_type_or_serial", "$@89", + "$@90", "opt_serial_attribute", "opt_serial_attribute_list", + "opt_asrow_attribute", "opt_asrow_attribute_list", "field_def", "$@91", + "opt_generated_always", "vcol_opt_specifier", "vcol_opt_attribute", + "vcol_opt_attribute_list", "vcol_attribute", "parse_vcol_expr", "$@92", + "parenthesized_expr", "virtual_column_func", "expr_or_literal", + "column_default_expr", "field_type", "qualified_field_type", "udt_name", + "field_type_all", "field_type_numeric", "opt_binary_and_compression", + "field_type_string", "field_type_temporal", "field_type_lob", + "field_type_misc", "char", "nchar", "varchar", "nvarchar", "int_type", + "real_type", "srid_option", "float_options", "precision", + "field_options", "last_field_options", "field_length_str", + "field_length", "field_scale", "opt_field_length", "opt_field_scale", + "opt_precision", "attribute_list", "attribute", "opt_compression_method", + "opt_compressed", "opt_enable", "compressed", + "compressed_deprecated_data_type_attribute", + "compressed_deprecated_column_attribute", "asrow_attribute", + "serial_attribute", "with_or_without_system", "charset", "charset_name", + "charset_name_or_default", "opt_load_data_charset", + "old_or_new_charset_name", "old_or_new_charset_name_or_default", + "collation_name", "collation_name_or_default", "opt_default", + "charset_or_alias", "opt_binary", "binary", "opt_bin_mod", "ws_nweights", + "$@93", "ws_level_flag_desc", "ws_level_flag_reverse", "ws_level_flags", + "ws_level_number", "ws_level_list_item", "ws_level_list", + "ws_level_range", "ws_level_list_or_range", "opt_ws_levels", + "opt_primary", "references", "opt_ref_list", "ref_list", + "opt_match_clause", "opt_on_update_delete", "delete_option", + "constraint_key_type", "key_or_index", "opt_key_or_index", + "keys_or_index", "fulltext", "spatial", "normal_key_options", + "fulltext_key_options", "spatial_key_options", "normal_key_opts", + "spatial_key_opts", "fulltext_key_opts", "opt_USING_key_algorithm", + "opt_key_algorithm_clause", "key_using_alg", "all_key_opt", + "normal_key_opt", "spatial_key_opt", "fulltext_key_opt", + "btree_or_rtree", "ignorability", "key_list", "opt_without_overlaps", + "key_part", "opt_ident", "string_list", "alter", "$@94", "$@95", "$@96", + "$@97", "$@98", "$@99", "$@100", "$@101", "$@102", "$@103", "$@104", + "$@105", "$@106", "account_locking_option", "opt_password_expire_option", + "opt_account_locking_and_opt_password_expiration", + "ev_alter_on_schedule_completion", "opt_ev_rename_to", "opt_ev_sql_stmt", + "ident_or_empty", "alter_commands", "$@107", "$@108", "$@109", "$@110", + "remove_partitioning", "all_or_alt_part_name_list", "add_partition_rule", + "$@111", "add_part_extra", "reorg_partition_rule", "$@112", + "reorg_parts_rule", "$@113", "alt_part_name_list", "alt_part_name_item", + "alter_list", "add_column", "alter_list_item", + "opt_index_lock_algorithm", "alter_algorithm_option", + "alter_lock_option", "opt_column", "opt_ignore", "alter_options", + "$@114", "alter_options_part2", "alter_option_list", "alter_option", + "opt_restrict", "opt_place", "opt_to", "slave", "$@115", "$@116", + "start", "opt_start_transaction_option_list", + "start_transaction_option_list", "start_transaction_option", + "slave_thread_opts", "$@117", "slave_thread_opt_list", + "slave_thread_opt", "slave_until", "slave_until_opts", "checksum", + "$@118", "opt_checksum_type", "repair_table_or_view", "$@119", "repair", + "$@120", "opt_mi_repair_type", "mi_repair_types", "mi_repair_type", + "opt_view_repair_type", "analyze", "$@121", "analyze_table_list", + "analyze_table_elem_spec", "opt_persistent_stat_clause", + "persistent_stat_spec", "persistent_column_stat_spec", "$@122", + "persistent_index_stat_spec", "$@123", "table_column_list", + "table_index_list", "table_index_name", "binlog_base64_event", + "check_view_or_table", "$@124", "check", "$@125", "opt_mi_check_type", + "mi_check_types", "mi_check_type", "opt_view_check_type", "optimize", + "$@126", "opt_no_write_to_binlog", "rename", "$@127", "rename_list", + "table_to_table_list", "table_to_table", "keycache", "$@128", + "keycache_list_or_parts", "keycache_list", "assign_to_keycache", + "assign_to_keycache_parts", "key_cache_name", "preload", "$@129", + "preload_list_or_parts", "preload_list", "preload_keys", + "preload_keys_parts", "adm_partition", "$@130", "cache_keys_spec", + "$@131", "cache_key_list_or_empty", "opt_ignore_leaves", "select", + "$@132", "$@133", "select_into", "$@134", "$@135", "simple_table", + "table_value_constructor", "$@136", "query_specification_start", "$@137", + "$@138", "query_specification", "select_into_query_specification", + "query_expression", "query_expression_no_with_clause", + "query_expression_body_ext", "$@139", "$@140", + "query_expression_body_ext_parens", "query_expression_body", "$@141", + "query_primary", "query_simple", "subselect", "subquery", + "opt_from_clause", "from_clause", "table_reference_list", + "select_options", "opt_history_unit", "history_point", + "for_portion_of_time_clause", "opt_for_portion_of_time_clause", + "opt_for_system_time_clause", "system_time_expr", "select_option_list", + "select_option", "select_lock_type", "opt_select_lock_type", + "opt_lock_wait_timeout_new", "select_item_list", "select_item", + "remember_tok_start", "remember_name", "remember_end", "select_alias", + "opt_default_time_precision", "opt_time_precision", "optional_braces", + "expr", "boolean_test", "predicate", "bit_expr", "or", "and", "not", + "not2", "comp_op", "all_or_any", "opt_dyncol_type", "dyncol_type", + "numeric_dyncol_type", "temporal_dyncol_type", "string_dyncol_type", + "dyncall_create_element", "dyncall_create_list", "plsql_cursor_attr", + "explicit_cursor_attr", "trim_operands", "trim_operands_regular", + "trim_operands_special", "column_default_non_parenthesized_expr", + "primary_expr", "string_factor_expr", "simple_expr", + "mysql_concatenation_expr", "function_call_keyword_timestamp", + "function_call_keyword", "substring_operands", + "substring_operands_regular", "substring_operands_special", + "function_call_nonkeyword", "function_call_conflict", + "function_call_generic", "@142", "fulltext_options", + "opt_natural_language_mode", "opt_query_expansion", "opt_udf_expr_list", + "udf_expr_list", "udf_expr", "sum_expr", "$@143", "$@144", "$@145", + "$@146", "$@147", "window_func_expr", "window_func", + "simple_window_func", "inverse_distribution_function", + "percentile_function", "$@148", "inverse_distribution_function_def", + "order_by_single_element_list", "window_name", "variable", "$@149", + "variable_aux", "opt_distinct", "opt_gconcat_separator", + "opt_gorder_clause", "gorder_list", "opt_glimit_clause", "glimit_clause", + "glimit_options", "in_sum_expr", "$@150", "cast_type", + "cast_type_numeric", "cast_type_temporal", "opt_expr_list", "expr_list", + "ident_list_arg", "ident_list", "when_list", "when_list_opt_else", + "table_ref", "json_text_literal", "json_text_literal_or_num", + "join_table_list", "json_table_columns_clause", + "json_table_columns_list", "json_table_column", "$@151", "$@152", + "json_table_column_type", "json_table_field_type", + "json_opt_on_empty_or_error", "json_on_response", + "json_on_error_response", "json_on_empty_response", "table_function", + "$@153", "$@154", "esc_table_ref", "derived_table_list", "join_table", + "$@155", "$@156", "$@157", "$@158", "$@159", "$@160", "inner_join", + "normal_join", "opt_use_partition", "use_partition", "table_factor", + "table_primary_ident_opt_parens", "table_primary_derived_opt_parens", + "table_reference_list_parens", "nested_table_reference_list", + "join_table_parens", "table_primary_ident", "table_primary_derived", + "opt_outer", "index_hint_clause", "index_hint_type", + "index_hint_definition", "$@161", "$@162", "index_hints_list", + "opt_index_hints_list", "$@163", "opt_key_definition", "$@164", + "opt_key_usage_list", "key_usage_element", "key_usage_list", + "using_list", "interval", "interval_time_stamp", "date_time_type", + "table_alias", "opt_table_alias_clause", "table_alias_clause", "opt_all", + "opt_where_clause", "$@165", "opt_having_clause", "$@166", + "opt_group_clause", "group_list", "olap_opt", "opt_window_clause", + "window_def_list", "window_def", "window_spec", "$@167", + "opt_window_ref", "opt_window_partition_clause", + "opt_window_order_clause", "opt_window_frame_clause", + "window_frame_units", "window_frame_extent", "window_frame_start", + "window_frame_bound", "opt_window_frame_exclusion", "alter_order_clause", + "alter_order_list", "alter_order_item", "opt_order_clause", + "order_clause", "$@168", "order_list", "order_dir", "opt_limit_clause", + "limit_clause", "fetch_first_clause", "first_or_next", "row_or_rows", + "only_or_with_ties", "opt_global_limit_clause", "limit_options", + "limit_option", "limit_rows_option", "delete_limit_clause", + "order_limit_lock", "opt_order_limit_lock", "query_expression_tail", + "opt_query_expression_tail", "opt_procedure_or_into", "order_or_limit", + "opt_plus", "int_num", "ulong_num", "real_ulong_num", "longlong_num", + "ulonglong_num", "real_ulonglong_num", "dec_num_error", "dec_num", + "choice", "bool", "procedure_clause", "$@169", "procedure_list", + "procedure_list2", "procedure_item", "select_var_list_init", "$@170", + "select_var_list", "select_var_ident", "select_outvar", "into", + "into_destination", "$@171", "$@172", "do", "$@173", "drop", "$@174", + "$@175", "$@176", "$@177", "table_list", "table_name", + "table_name_with_opt_use_partition", "table_alias_ref_list", + "table_alias_ref", "opt_if_exists_table_element", "opt_if_exists", + "opt_temporary", "insert", "$@178", "$@179", "replace", "$@180", "$@181", + "insert_start", "stmt_end", "insert_lock_option", "replace_lock_option", + "insert_replace_option", "opt_into", "insert_table", "$@182", + "insert_field_spec", "$@183", "insert_field_list", "opt_fields", + "fields", "insert_values", "values_list", "ident_eq_list", + "ident_eq_value", "equal", "opt_equal", "opt_with", "opt_by", + "no_braces", "$@184", "no_braces_with_names", "$@185", "opt_values", + "opt_values_with_names", "values", "values_with_names", "expr_or_ignore", + "expr_or_ignore_or_default", "opt_insert_update", "$@186", "$@187", + "update_table_list", "update", "$@188", "$@189", "$@190", "update_list", + "update_elem", "insert_update_list", "insert_update_elem", + "opt_low_priority", "delete", "$@191", "opt_delete_system_time", + "delete_part2", "delete_single_table", "delete_single_table_for_period", + "single_multi", "$@192", "$@193", "$@194", "$@195", "opt_returning", + "$@196", "table_wild_list", "table_wild_one", "opt_wild", + "opt_delete_options", "opt_delete_option", "truncate", "$@197", "$@198", + "opt_table_sym", "opt_profile_defs", "profile_defs", "profile_def", + "opt_profile_args", "show", "$@199", "show_param", "$@200", "$@201", + "show_engine_param", "master_or_binary", "opt_storage", "opt_db", + "opt_full", "from_or_in", "binlog_in", "binlog_from", "wild_and_where", + "describe", "$@202", "$@203", "explainable_command", "describe_command", + "analyze_stmt_command", "opt_extended_describe", "opt_format_json", + "opt_describe_column", "explain_for_connection", "flush", "$@204", + "flush_options", "$@205", "opt_flush_lock", "flush_lock", "$@206", + "flush_options_list", "flush_option", "opt_table_list", "backup", + "backup_statements", "$@207", "opt_delete_gtid_domain", + "delete_domain_id_list", "delete_domain_id", + "optional_flush_tables_arguments", "reset", "$@208", "reset_options", + "reset_option", "$@209", "$@210", "slave_reset_options", + "master_reset_options", "purge", "$@211", "kill", "$@212", "kill_type", + "kill_option", "opt_connection", "kill_expr", "shutdown", "$@213", + "shutdown_option", "use", "load", "$@214", "$@215", "$@216", "$@217", + "data_or_xml", "opt_local", "load_data_lock", "opt_duplicate", + "opt_field_term", "field_term_list", "field_term", "opt_line_term", + "line_term_list", "line_term", "opt_xml_rows_identified_by", + "opt_ignore_lines", "lines_or_rows", "opt_field_or_var_spec", + "fields_or_vars", "field_or_var", "opt_load_data_set_spec", + "load_data_set_list", "load_data_set_elem", "text_literal", + "text_string", "hex_or_bin_String", "param_marker", "signed_literal", + "literal", "NUM_literal", "temporal_literal", "with_clause", "$@218", + "opt_recursive", "with_list", "with_list_element", "opt_cycle", "$@219", + "opt_with_column_list", "with_column_list", "ident_sys_alloc", + "comma_separated_ident_list", "with_element_head", "insert_ident", + "table_wild", "select_sublist_qualified_asterisk", "order_ident", + "simple_ident", "simple_ident_nospvar", "field_ident", "table_ident", + "table_ident_opt_wild", "table_ident_nodb", "IDENT_cli", "ident_cli", + "IDENT_sys", "ident_cli_func", "ident_func", "TEXT_STRING_sys", + "TEXT_STRING_literal", "TEXT_STRING_filesystem", "ident_table_alias", + "ident_cli_set_usual_case", "ident_sysvar_name", "ident", "label_ident", + "ident_or_text", "user_maybe_role", "user_or_role", "user", + "keyword_table_alias", "keyword_ident", "keyword_sysvar_name", + "keyword_set_usual_case", "non_reserved_keyword_udt", + "keyword_sp_var_not_label", "keyword_sp_head", "keyword_verb_clause", + "keyword_set_special_case", "keyword_sysvar_type", "keyword_data_type", + "keyword_cast_type", "keyword_func_sp_var_and_label", + "keyword_func_sp_var_not_label", "keyword_sp_var_and_label", + "reserved_keyword_udt_not_param_type", "set", "$@220", "set_param", + "$@221", "$@222", "$@223", "set_stmt_option_list", + "start_option_value_list_following_option_type", "$@224", + "option_value_list", "option_value", "$@225", "option_type", + "opt_var_type", "opt_var_ident_type", "set_stmt_option", "$@226", + "$@227", "$@228", "option_value_following_option_type", "$@229", "$@230", + "$@231", "option_value_no_option_type", "$@232", "$@233", "$@234", + "$@235", "$@236", "$@237", "$@238", "$@239", "$@240", "$@241", + "transaction_characteristics", "transaction_access_mode", + "isolation_level", "transaction_access_mode_types", "isolation_types", + "text_or_password", "set_expr_or_default", "lock", "$@242", + "opt_lock_wait_timeout", "table_or_tables", "table_lock_list", + "table_lock", "lock_option", "unlock", "$@243", "handler", "$@244", + "handler_tail", "$@245", "handler_read_or_scan", "handler_scan_function", + "handler_rkey_function", "$@246", "handler_rkey_mode", "revoke", + "revoke_command", "admin_option_for_role", "grant", "grant_command", + "opt_with_admin", "opt_with_admin_option", "role_list", "current_role", + "role_name", "grant_role", "opt_table", "grant_privileges", + "opt_privileges", "object_privilege_list", "column_list_privilege", + "column_privilege", "object_privilege", "opt_and", "require_list", + "require_list_element", "grant_ident", "user_list", "grant_list", + "user_and_role_list", "via_or_with", "using_or_as", "grant_user", + "auth_expression", "auth_token", "opt_auth_str", "opt_require_clause", + "resource_option", "resource_option_list", "opt_resource_options", + "opt_grant_options", "opt_grant_option", "grant_option_list", + "grant_option", "begin_stmt_mariadb", "$@247", "compound_statement", + "opt_not", "opt_work", "opt_chain", "opt_release", "commit", "rollback", + "savepoint", "release", "unit_type_decl", "union_option", + "query_expression_option", "definer_opt", "no_definer", "definer", + "view_algorithm", "opt_view_suid", "view_suid", "view_list_opt", + "view_list", "view_select", "$@248", "view_check_option", + "trigger_action_order", "trigger_follows_precedes_clause", + "trigger_tail", "$@249", "$@250", "$@251", "$@252", "$@253", + "sf_return_type", "$@254", "xa", "opt_format_xid", "xid", + "begin_or_start", "opt_join_or_resume", "opt_one_phase", "opt_suspend", + "$@255", "opt_migrate", "install", "uninstall", "keep_gcc_happy", + "_empty", "statement", "sp_statement", "$@256", "$@257", "$@258", + "sp_if_then_statements", "sp_case_then_statements", + "reserved_keyword_udt", "keyword_sp_block_section", "keyword_label", + "keyword_sp_decl", "opt_truncate_table_storage_clause", + "ident_for_loop_index", "row_field_name", "while_body", "$@259", + "for_loop_statements", "sp_control_label", "sp_block_label", + "remember_end_opt", "sp_opt_default", "sp_opt_inout", + "sp_proc_stmts1_implicit_block", "$@260", "remember_lex", + "keyword_directly_assignable", "ident_directly_assignable", + "ident_cli_directly_assignable", "set_assign", "$@261", "$@262", "$@263", + "labels_declaration_oracle", "label_declaration_oracle", + "opt_exception_clause", "exception_handlers", "exception_handler", + "$@264", "sp_no_param", "opt_sp_parenthesized_fdparam_list", + "opt_sp_parenthesized_pdparam_list", "opt_sp_name", + "opt_package_routine_end_name", "sp_tail_is", "sp_instr_addr", "sp_body", + "$@265", "$@266", "$@267", "create_package_chistic", + "create_package_chistics", "opt_create_package_chistics", + "opt_create_package_chistics_init", "$@268", + "package_implementation_executable_section", + "package_implementation_declare_section", + "package_implementation_declare_section_list1", + "package_implementation_declare_section_list2", "package_routine_lex", + "package_specification_function", "$@269", + "package_specification_procedure", "$@270", + "package_implementation_routine_definition", + "package_implementation_function_body", "$@271", + "package_implementation_procedure_body", "$@272", + "package_implementation_item_declaration", + "opt_package_specification_element_list", + "package_specification_element_list", "package_specification_element", + "sp_decl_variable_list_anchored", "sp_param_name_and_mode", "sp_param", + "sp_param_anchored", "sf_c_chistics_and_body_standalone", "$@273", + "sp_tail_standalone", "$@274", "$@275", "drop_routine", "create_routine", + "$@276", "$@277", "$@278", "$@279", "$@280", "$@281", "$@282", + "opt_sp_decl_body_list", "sp_decl_body_list", "$@283", + "sp_decl_non_handler_list", "sp_decl_handler_list", + "opt_sp_decl_handler_list", "sp_decl_non_handler", "$@284", + "sp_proc_stmt", "sp_labelable_stmt", "sp_proc_stmt_compound_ok", + "sp_labeled_block", "$@285", "$@286", "$@287", "opt_not_atomic", + "sp_unlabeled_block", "$@288", "$@289", "$@290", + "sp_block_statements_and_exceptions", "$@291", YY_NULLPTR +}; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} +#endif + +#define YYPACT_NINF (-5620) + +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) + +#define YYTABLE_NINF (-3833) + +#define yytable_value_is_error(Yyn) \ + 0 + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const int yypact[] = +{ + 40187, -5620, -5620, 95170, -5620, -5620, 2648, 1295, 95170, -5620, + 156, -5620, 1258, -5620, -5620, -5620, -5620, -5620, 4411, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 155, 427, -5620, -5620, + 409, -5620, -5620, -5620, -5620, 691, 81091, 1202, 627, -5620, + 84796, -5620, -5620, -5620, -5620, 84796, -5620, -5620, 95170, -5620, + -5620, 1314, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 640, -5620, 1809, 2579, -5620, -5620, -5620, -5620, -5620, -5620, + 1887, -5620, -5620, -5620, -5620, -5620, -5620, 427, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 1366, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 1751, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 95911, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 395, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 1946, -5620, -5620, + -5620, -5620, -5620, 208, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 53, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 95170, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 409, -5620, -5620, -5620, 1702, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 1366, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 95170, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 238, -5620, + -5620, 268, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 71, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2631, -5620, + -5620, 137, 2400, 2481, -5620, -5620, 1929, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 2997, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2407, + -5620, -5620, -5620, -5620, 3803, 1923, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 48366, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 137, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 214, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 1735, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 96652, 95170, 1771, 1789, 95170, 2491, 81832, 2491, + -5620, 118, -5620, -5620, 2266, -5620, 1939, -5620, 427, 2443, + 1902, 2398, 2701, 969, 2409, 82573, 1275, 2491, -5620, 2133, + 2491, 2491, 2491, 2491, 2491, 2491, -5620, 2491, 2491, 1074, + 104062, 69976, -5620, -5620, 952, 2586, -5620, -5620, -5620, -5620, + -5620, -5620, 5802, 427, 24152, 2690, -5620, -5620, 2250, 4706, + 2041, -5620, 2512, -5620, -5620, 95170, -5620, 2491, 5802, -5620, + 2512, 70717, 3531, 52082, 7775, 2512, 427, 2606, -5620, 2037, + -5620, -5620, -5620, -5620, -5620, -5620, 95170, -5620, 1366, -5620, + -5620, 2489, -5620, -5620, 81832, -5620, -5620, -5620, -5620, -5620, + 2785, 24152, 252, 2547, -5620, -5620, 2442, 49107, 81832, 2736, + 2701, 2753, -5620, 1899, 530, -5620, 2153, 2245, 2701, 416, + 2264, 2701, 2669, 2491, 2491, -5620, -5620, 2759, 2759, 2759, + 2509, 2759, -5620, 2759, 2851, 2235, 353, -5620, -5620, 2217, + 95170, 2736, -5620, 2736, -5620, 2877, 2736, 2736, 2366, 2884, + 2889, 199, 2494, 1766, 1766, 2266, 43920, 398, 2711, -5620, + 2851, 1689, 2138, 2054, 2054, 2054, 1689, 137, 1689, -5620, + 3033, 1939, 2940, 95170, -5620, 2946, -5620, 2268, -5620, -5620, + -5620, 95170, 95170, 279, -5620, 2343, -5620, 2319, 62, 72199, + -5620, 2968, -5620, -5620, -5620, -5620, -5620, -5620, 2834, 351, + 2466, 2693, 2395, -5620, 2892, 81832, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 95170, 2360, -5620, -5620, 24152, 3038, + 2398, -5620, 2886, -5620, -5620, -5620, -5620, 49107, -5620, -5620, + -5620,104062, -5620, -5620, -5620, 1476, 67012, -5620, 2386, 2706, + -5620, 2399, 1506, 1544, -5620, -5620, 1582, 1640, 1659, -5620, + -5620, -5620, 1761, -5620, -5620, -5620,103321, 1649, 2391, -5620, + -5620, 3056, -5620, -5620, 85537, 358, 95170, 3054, 2491, 95170, + 95170, 95170, 95170, 95170, -5620, 81832, -5620, -5620, 2491, 2491, + -5620, -5620, 3055, -5620, 2611, 2565, 2084, 2444, 2777, -5620, + 2645, -5620, 2478, 2556, 2687, 2492, 2506, 2535, 224, -5620, + 2519, -5620, 1226, 2941, 332, 376, 2959, 378, 412, 3098, + 2969, 425, 174, 446, 2757, 482, -5620, -5620, -5620, -5620, + 2992, 3104, 2529, -5620, 2536, -5620, 3042, 2906, 344, -5620, + -5620, 198, 2983, 1370, 49107,106095,104803, 83314,106095,106095, + 106095, -5620, -5620, 280, 95170,105449, 95170, 7384, -5620, -5620, + 41697, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 95170, -5620, -5620, -5620, -5620, -5620, -5620, 1757, 1329, 8291, + -5620, 2560, -5620, -5620, -5620, -5620, -5620, 86278, -5620, 223, + 254, 3076, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 30304, 2576, 2602, 2603, 19538, 2615, 2619, + 2629, 2636, 2640, 2444, 2444, 2444, 2641, 2644, 2667, 2671, + 2704, 2712, 2713, -5620, 2721, 2733, 2738, 2739, 2749, 2760, + 24921, 2766, 2770, 2775, 37938, 2776, 2780, 2784, 2819, 24152, + 2641, 2823, 2827, -5620, 2830, 2855, 2860, 2866, 2882, 2890, + 2893, 2900, 3354, 2907, 2908, 2919, 2923, -5620, 2444, 2641, + 2641, 2932, 2938, 2444, 2949, 2955, 2960, 2973, 2978, 2989, + 2999, 3000, 3006, 3007, 3011, 3012, 308, 3013, 3020, 3025, + 3026, 3027, 3028, 3030, 2674, 3031, 3032, 3041, 2742, 3043, + 3046, 3049, 3050, 317, 3052, 3053, 318, 3058, 3064, 3065, + 3068, 3070, 3077, 3084, 31073, 31842, 30304, 17231, -5620, 95170, + 97393, -5620, -5620, 3307, 2189, 3138, 1725, 30304, -5620, -5620, + -5620, 3351, -5620, 3389, -5620, -5620, -5620, -5620, 3283, 3294, + -5620, 3311, -5620, -5620, 3320, 2813, -5620, 3505, -5620, -5620, + -5620, -5620, -5620, 2789, -5620, 3085, 3598, 3620, 3086, 3087, + -5620, -5620, 496, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 2980, 2903, -5620, 3505, + -5620, -5620, 75163, -5620, 5448, -5620, -5620, 2611, 3234, 3522, + -5620, 3689, -5620, 3618, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 3531, -5620, -5620, 53586, + 3612, 880, -5620, -5620, 339, -5620, 404, 475, 65530, -5620, + 389, 66271, 489, 87019, 1128, -5620, 72940, -5620, 517, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3089, + -5620, 3202, 3416, 3100, 2751, 1876, -5620, -5620, 236, 957, + 3189, 93, -5620, 1005, -5620, 1876, -5620, 75904, 356, 2279, + -5620, 981, -5620, 3764, -5620, -5620, 3204, 3191, 3217, -5620, + 3066, -5620, 2701, -5620, 375, -5620, 356, 1876, 2279, -5620, + 3392, 3470, 1076, 3416, -5620, -47, -5620, -5620, -5620, 3760, + -5620, 3122, -5620, 3728, -5620, 95170, 391, 49107, -5620, -5620, + -5620, -5620, 3124, 49107, 49107, 1159, 1160, 3307, 3125, 24152, + -5620, -5620, 4138, 55842, 3328, 1578, 7, -5620, -5620, 1809, + 95170, -5620, -5620, 1055, -5620, 3558, -5620, 3143, -5620, 98134, + 1160, 3796, -5620, -5620, -5620, 852, 3533, -5620, 3146, -5620, + -5620, -5620, -5620, 49107, 95170, 2701, -5620, -5620, -5620, -5620, + 3147, -5620, -5620, 3356, 3239, -5620, 3176, -5620, -5620, 230, + -5620, -5620, 3933, -5620, 95170, -5620, 2736, -5620, -5620, 2736, + -5620, -5620, -5620, 2736, 2736, 2237, 2736, -5620, -5620, 3203, + -5620, 3485, 3490, 2892, -5620, 3175, 43179, 95170, 3950, -5620, + 3969, -5620, -5620, -5620, 3180, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 3749, 3936, 3936, -5620, 54338, -5620, -5620, + 3839, 2711, 1052, 3681, 57346, 3827, 3916, 59602, -5620, 356, + -5620, -5620, -5620, -5620, 553, 95170, -5620, 553, 553, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 137, -5620, -5620, 2443, 3608, 73681, 95170, 1689, 2138, + 18769, 3962, 3964, -5620, -5620, -5620, 2701, 430, 3594, -5620, + 95170, -5620, -5620, -5620, 2444, 4004, -5620, -5620, -5620, -5620, + -5620, 49107, 3429, 72199, 2491, -5620, -5620, -5620, 351, -5620, + 1915, 95170, 49107, 3265, -5620, 49107, 3226, 24152, -5620, -5620, + 3703, 3307, -5620, 3588, -5620, -5620, 49107, 1840, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 3237, -5620, -5620, -5620, 3237, 925, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3238, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 3798, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3238, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 218, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3635, 3093, 1220, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3635, -5620, 1220, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3238, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3248, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 3635, -5620, 1220, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 3237, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 3237, -5620, -5620, 1220, 3237, -5620, 3249, 3238, 3635, + 1359, 1900, 3238, -5620, -5620, 3237, 3251, 3237, 3237, 3237, + 3237, -5620, 3237, 4019, 3252, -5620, 3238, -5620, -5620, -5620, + -5620, -5620, -5620, 130, 3237, 3237, 3237, 3237, 3256, 222, + -5620, 229, 249, 250, 253, 264, 265, -5620, -5620, -5620, + -5620, 3909, 95170, 3911, -5620, 3692, 1649, 3255, 3259, -5620, + 49107, 3988, 49107, 3921, 2711, -5620, 3269, -5620, 3268, -5620, + -5620, 3938, 95170, 95170, -5620, -5620, -5620, -5620, 3273, 76645, + -5620, 75163, 49107, -5620, -5620, 3888, 3430, -5620, -5620, -5620, + -5620, -5620, -5620, 3371, -5620, -5620, 3296, -5620, -5620, -5620, + -5620, 3744, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 75163, -5620, -5620, 3746, 3747, -5620, 72199, 2129, 8165, 97393, + -5620, 3940, -5620, -5620, -5620, 3760, -5620, -5620, 25690, -5620, + 26459, -5620, -5620, -5620, 3577, 1363, 823, -5620, -5620, -5620, + -5620, -5620, -5620, 4040, -5620, -5620, -5620, -5620, -5620, -5620, + 3774, 95170, 3526, 3961, 3942, -5620, -5620, -5620, -5620, -5620, + 3779, 3315, 3920, 3313, -5620, -5620, 275, -5620, 3321, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 49107, + 55090, -5620, -5620, -5620, 3323, -5620, -5620, -5620, 3326, 30304, + 30304, -5620, 4064, 4064, 4064, 24152, 3016, 473, 3686, 24152, + 24152, 24152, 2309, 3335, -5620, -5620, -5620, 396, -5620, 24152, + 24152, 38685, 3338, 520, 5444, 24152, 4002, 4002, -5620, 24152, + 24152, 17231, 4773, 24152, 24152, 24152, 97393, 38685, 3778, 3337, + -5620, 3333, 2373, 24152, 2378, 24152, -5620, -5620, 24152, 24152, + 24152, 24152, 3341, 32611, 3343, 24152, 24152, 3345, 3480, 4064, + 4064, 2401, 436, -5620, -5620, -5620, 4064, 4064, -5620, 24152, + 24152, 18000, 24152, 24152, 2413, 24152, 24152, 24152, 24152, 24152, + 24152, -5620, 24152, 24152, 1611, 24152, 24152, 49107, 24152, 24152, + 4003, 49107, 24152, 24152, 4005, 24152, 24152, 49107, 24152, -5620, + 24152, 3626, 3626, -5620, 24152, 18000, 24152, 3349, 39432, 24152, + 24152, 24152, 24921, -5620, 24921, -5620, -5620, 3353, 2883, 545, + 137, 24152, 3350, -5620, -5620, -5620, -5620, 24152, 24152, 24152, + 32611, -5620, -5620, -5620, 670, -5620, -5620, -5620, 27228, 32611, + 3357, 32611, 32611, 3971, 2265, 32611, 32611, 32611, 32611, 32611, + 32611, 32611, 33380, 34149, 32611, 32611, 32611, 32611, -5620, 81832, + 30304, 51330, 3360, 4006, -5620, 77386, -5620, 1588, 1061, -5620, + 2701, 4706, 35687, -5620, 3359, -5620, 3856, 49107, -5620, 3362, + 4022, 75163, 72199, 2129, 3380, -5620, 1529, 276, -5620, 76645, + 95170, -5620, -5620, -5620, 4078, 24152, -5620, -5620, -5620, -5620, + -5620, 3365, 533, 3372, -5620, 1176, -5620, -5620, -5620, -5620, + -5620, 95170, -5620, 87760, 52834, 3467, 4029, 3397, 2736, 88501, + 95170, 49107, 95170, 98875, 95170, 95170, 49107, 75163, 49107, -5620, + -5620, -5620, 1020, 1876, 95170, 1876, 2279, 1036, 1876, 4008, + -5620, -5620, 1029, 1029, -5620, -5620, -5620, -5620, -5620, -5620, + 1876, 95170, 95170, 1876, 72199, -5620, 2279, 1847, -5620, 3683, + 3475, -5620, -5620, -5620, 3726, -5620, -5620, 4052, 3398, -5620, + 3750, -5620, 3493, -5620, -5620, 49107, -5620, -5620, 2279, -5620, + 2279, 2279, 4055, 1876, 1876, 1876, -5620, 44661, 3404, 3407, + -5620, 3405, -5620, 3409, -5620, 4035, -5620, -5620, -5620, 3765, + 4190, 4043, 3426, -5620, -5620, 3974, 63, -5620, 3851, -5620, + 3976, -5620, 24152, 3307, 20307, 3709, -5620, -5620, 3710, 3711, + 3712, -5620, -5620, -5620, -5620, 3857, 3713, -5620, 2701, 3714, + -5620, -5620, -5620, 3443, -5620, -5620, -5620, 81832, 35687, -5620, + 3444, -5620, 3464, -5620, 271, -5620, -5620, 4108, 3553, 24152, + -5620, -5620, 49107, 3945, -5620, 2701, 1899, 95170, -5620, -5620, + 4186, -5620, 1828, 4107, -5620, -5620, 3564, 416, -5620, 4107, + 1019, -5620, -5620, 2759, 3645, -5620, -5620, -5620, 81832, -5620, + -5620, -5620, -5620, -5620, -5620, 95170, -5620, 76645, 72199, 81832, + 2736, 2736, -5620, 49107, 2736, 95170, -5620, -5620, -5620, 2736, + 2736, 2736, 3507, -5620, 2186, 3482, 3483, 3486, 3487, 2014, + 3491, 45402, 2414, 4772, 4112, 4115, -5620, 4065, 3039, 4065, + -5620, -5620, 45402, 44661, 3497, 3950, -5620, -5620, -5620, -5620, + 81832, 3498, -5620, -5620, 3492, -5620, 24152, 4219, 4149, 3839, + -5620, -5620, 58098, 1518, 86278, -5620, -5620, -5620, 3848, 4037, + 993, -5620, 3502, 3630, -5620, 190, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 24152, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 30304, 2671, -5620, 3307, -5620, -5620, -5620, -5620, + -5620, 276, 260, -5620, -5620, -5620, 466, 3872, 1643, -5620, + -5620, 81832, 1643, -5620, 3516, 3817, -5620, 3819, 147, -5620, + 49107, -5620, -5620, -5620, -5620, -5620, 49107, 3518, -5620, 3715, + 95170, 2360, 3524, 3523, 3307, 4026, -5620, 3703, -5620, -5620, + -5620, 5802, 4243, 5776, 164, 3581, -5620, -5620, -5620, -5620, + -5620, 49107, -5620, -5620, 1857, 3549, 2897, -5620, -5620, -5620, + 3635, 276, 3635, -5620, -5620, 2931, 1086, -5620, -5620, -5620, + 1086, -5620, 435, 3612, 78127, 3635, -5620, -5620, -5620, -5620, + 4020, 1220, 1750, 78868, 2573, 3941, -5620, -5620, -5620, 1086, + 2759, -5620, -5620, 3635, -5620, -5620, -5620, 2759, 1086, -5620, + 4023, -5620, -5620, -5620, 1086, 3635,104062, 2023, 1220, -5620, + -5620, 1220, 1086, 534, 95170, 2023, 4097, -5620, 1750, 4279, + 1220, 3635, 1086, 4307, -5620, 1086, -5620, -5620, 220, -5620, + -5620, 1649, -5620, -5620, -5620, 3749, 3637, -5620, 3556, -5620, + -5620, 915, 4121, -5620, -5620, 4141, 95170, 4220, 61084, -5620, + -5620, 4146, -5620, 95170, 3569, -5620, -5620, 3570, 188, 49107, + 49107, 5802, -5620, -5620, 3574, -5620, -5620, -5620, 4068, -5620, + -5620, 85, 4293, -5620, -5620, -5620, 46143, 46143, 1226, 2941, + -5620, -5620, 2959, -5620, -5620, 2969, -5620, 174, -5620, 2757, + -5620, -5620, -5620, -5620, 2067, -5620, -5620, -5620, 4035, 24152, + 50589, 3307, -5620, -5620, 49107, -5620, 4211, -5620, -5620,101839, + 145, -5620, -5620, 256, 49107, -5620, -5620, -5620, -5620, 4206, + 3717, 95170, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 95170, + 2360, -5620, 95170,104062, 5802, 5802, -5620, 82573, -5620, 1305, + 1529, -5620, 4319, 97393, 24152, -5620, 3583, -5620, 3584, 3587, + 3029, 3943, 24152, 24152, -5620, 2810, 83, 452, -5620, 3589, + 3603, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3596, + -5620, -5620, 555, 560, 3602, -5620, -5620, -5620, 3604, 137, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 4240, -5620, 270, -5620, -5620, -5620, 24152, 567, 1171, 1172, + 3614, 406, 457, 1199, 3323, 2090, 3607, 38685, 97393, 4064, + 3610, 493, 4064, 3616, 1218, 1297, 602, 1522, 1696, -5620, + 1156, -5620, 1317, 1335, -5620, -5620, 3619, 3622, 4064, 3623, + -5620, 3624, 3627, 3631, 1430, 462, 3632, -5620, -5620, 21076, + 21845, 22614, 3141, 3633, -5620, -5620, 1466, 1838, 4064, 3636, + 1974, 1527, 1642, -5620, 2114, 1644, 1701, 3638, 3125, 2113, + 2273, -5620, -5620, -5620, -5620, 3640, 2296, 2318, 3643, 3646, + 2342, 2348, 49107, 3647, 3648, 2361, 49107, 1707, 2390, 3649, + 1708, 463, 3650, 3653, 2408, 3659, 1738, -5620, 97393, 95170, + 3661, 3655, 292, 3663, 2418, 4773, 4773, -5620, 24152, 3664, + 363, 97393, 2564, 1384, -5620, 3138, -5620, -5620, -5620, -5620, + 207, -5620, 3641, 3138, 3651, 3282, 17231, -5620, 1262, 1809, + 32611, 32611, 3666, 32611, 32611, 1524, 540, 540, 3678, 3678, + 1222, 620, 24921, 1524, 24921, 1524, 3678, 3678, 3678, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 4229, 3674, 3677, + 3684, 3687, -70, 3682, -5620, -5620, -5620, -5620, -5620, -5620, + 58, 4089, -5620, 3878, 1328, 24152, -5620, 3718, 4439, 4440, + 4441, -5620, -5620, -5620, -5620, 75163, 75163, 3693, -5620, 1019, + 4047, 4345, 76645, 4349, -5620, 3696, 46143, 46143, -5620, 3697, + -5620, 24152, 3695, 3702, 3704, 99616, -5620, 4357, 276, 79609, + 3307, 75163, 334, 18769, 95170, 95170, -5620, 87019, 4363, 868, + 3989, -5620, 3719, 3721, -5620, 276, 18769, 3720, 1229, 535, + -5620, 3722, 3727, -5620, -5620, -5620, -5620, 24152, 3731, 95170, + 95170, -5620, -5620, -5620, -5620, 95170, -5620, -5620, -5620, -5620, + -5620, -5620, 2701, 24152, 95170, 1876, -5620, -5620, -5620, 1876, + 95170, 1876, -5620, 2701, 4369, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 1876, -5620, -5620, -5620, -5620, + -5620, 3899, 356, 3066, 4008, 4107, 2279, 49107, 1876, 1876, + 24152, -5620, -5620, -5620, -5620, 4257, 3749, 20307, 3736, 3735, + -5620, -5620, 5802, 95170, 97393, 4465, -5620, -5620, 7227, -5620, + 81832, 89242, 49107, -5620, -5620, -5620, 2474, -5620, -5620, -5620, + -5620, -5620, 3307, 2547, 2671, -5620, 3738, 3307, -5620, -5620, + 4421, -5620, -5620, -5620, -5620, 2701, -5620, -5620, 4518, -5620, + 49107, -5620, -5620, 56594, 56594, 1926, -5620,100357, -5620, 2701, + 3307, 49107, 1537, 256, -5620, 4475, -5620, -5620, 3859, -5620, + -5620, -5620, 3751, -5620, 4161, -5620, -5620, -5620, -5620, -5620, + -5620, 3753, -5620, 4400, -5620, 2147, 200, 95170, 524, 147, + -5620, 95170, 95170, 49107, -5620, 95170, -5620, 95170, 2736, -5620, + -5620, 2736, 49107, 95170, 95170, 2736, 24152, 45402, -5620, -5620, + -5620, -5620, -5620, 45402, -5620, 2756, -5620, 3956, 2017, 2017, + -5620, -5620, -5620, -5620, -5620, 4382, 4065, 4065, 45402, 4384, + 4184, -5620, 95170, 4387, 490, -5620, 54338, 95170, 3307, 24152, + -5620, 3793, 4149, -5620, 211, 244, 190, -5620, 4039, 256, + -5620, -5620, 59602, 4105, 59602, 59602, 97393, 3998, 24152, -5620, + 4427, 3782, 3307, 18769, 18769, 2147, 2701, -5620, 276, 276, + 4001, 4296, 4297, 3906, 2701, 4298, 4299, 4301, -5620, -5620, + -5620, -5620, -5620, 3272, 2101, 227, 1204, 72199, 4259, 1019, + 4373, 3799, -5620, 49107, 4450, -5620, -5620, -5620, -5620, 24152, + -5620, -5620, -5620, 6955, -5620, 3824, 3825, 3826, 3828, 3829, + 3831, 3832, 3834, 3835, 3836, 3837, 3840, 3842, 3843, 3844, + 3846, 3847, 3849, 3853, 3855, 3860, 3863, 3864, 3865, 3867, + 298, -5620, -5620, 3852, -5620, -5620, -5620, -5620, 95170, 4426, + 3854, 3861, 3862, 3866, -5620, -5620, 95170, -5620, 2120, 4294, + 4324, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 80350, 276, -5620, -5620, 2151, -5620, + -5620, 2219, -5620, -5620, -5620, -5620, -5620, 2229, 69235, -5620, + 24152, 24152, -5620, -5620, -5620, -5620, -5620, 2023, 2023, 3833, + -5620, 3868, -5620, -5620, -5620, -5620, -5620, 4279, -5620, 3869, + -5620, 64789, -5620, -5620, -5620, -5620, 3586, -5620, 4187, -5620, + 2017, 95170, 4323, 61084, -5620, 4057, 4467, -5620, -5620, 44661, + -5620, 3870, 49107, -5620, 76645, 75163, -5620, -5620, -5620, 3873, + 1305, 9164, -5620, -5620, 4604, 72199, 4306, -5620, -5620, 3871, + -5620, 3874, 4353, 4356, -5620, 97393, -5620, -5620, -5620, 3307, + -5620, -5620, 3877, -5620, -5620, 3974, 3936, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 3889, 4150, 4260, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 4506, -5620, -5620, -5620, -5620, 2262, 284, -5620, + -5620, -5620,106095,106095,106095, -5620, 4235, -5620,102580, 24152, + -5620, 1820, -5620, 24152, -5620, -5620, 24152, -5620, 3307, 3334, + 106826, 78868, -5620, 78868,106826, 24152, -5620, 3885, -5620, 4514, + 4516, -5620, -5620, -5620, 24152, -5620, 24152, 24152, 1842, 24152, + 24152, 24152, 24152, -5620, 24152, -5620, 24152, 24152, -5620, 32611, + -5620, 3883, 3891, -5620, -5620, 3892, -5620, 24152, 24152, -5620, + -5620, -5620, 24152, 24152, 24152, -5620, -5620, 3893, -5620, -5620, + -5620, -5620, 24152, 24152, 24152, -5620, 24152, 3198, 24152, 3381, + 24152, 3579, 24152, -5620, 27997, -5620, 3894, -5620, -5620, 24152, + 24152, -5620, 24152, 24152, 24152, -5620, -5620, -5620, 24152, -5620, + 4463, 24152, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 24152, -5620, 492, 28766, -5620, 24152, 24152, 24152, -5620, -5620, + 24152, 3890, 3895, -5620, 95170, 2501, 3183, 256, 3898, -5620, + -5620, 3912, 3914, 3125, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 520, 32611, 499, 32611, 1809, 3318, 17231, -5620, 1379, + 1809, 4773, 4773, 95170, 4615, 3904, -5620, 24152, 24152, 18000, + 24152, 97393, 24152, 3908, 3907, -5620, 3917, 32611, -5620, -5620, + 3918, -5620, 2485, 3183, 4007, 4364, -5620, 3307, 35687, 4416, + -5620, 49107, 4419, 4466, 4125, -5620, 75163, 72199, 4583, 4584, + -5620, 3307, -5620, 3926, -5620, -5620, -5620, 3927, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 552, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 24152, 75163, -5620, -5620, -5620, + -5620, 276, -5620, 3939, 3944, -5620, -5620, 276, 276, 18769, + -5620, 40942, -5620, -5620, 195, 4223, 4485, -5620, -5620, 95170, + 1176, 95170, -5620, 52834, 52834, 89983, 3307, 12, -5620, -5620, + -5620, -5620, 3307, -5620, -5620, -5620, -5620, -5620, -5620, 3952, + -5620, -5620, -5620, 4689, -5620, -5620, 4369, -5620, 2711, 2279, + -5620, -5620, 3307, 39432, 1467, -5620, -5620, -5620, 20307, 9586, + -5620, 3946, 3947, 3948, -5620, 49107, 3949, 4401, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3951, -5620, + -5620, 20307, 3965, -5620, 4107, -5620, 3873, 1320, 3968, 3954, + -5620, -5620, -5620, -5620, -5620, -5620, 287, 291, 2762, 2711, + -5620, -5620, 381, -5620, -5620, -5620, -5620, -5620, 897, -5620, + -5620, 4107, -5620, 1828, 2701, 3991, 299, 256, 4180, -5620, + -5620, 2147, 1446, 1446, 4529, 200, 4404, -5620, 4259, 4607, + 4531, 4536, -5620, 3272, -5620, -5620, 364, -5620, -5620, -5620, + 95170, -5620, -5620, -25, -5620, 49107, 1922, 3969, 3969, -5620, + 2017, 333, -5620, 32611, 4691, -5620, 4453, 45402, 4587, 4589, + -5620, 45402, -5620, -5620, 2283, -5620, -5620, 74422, -5620, -5620, + -5620, 3307, 226, 2436, 24152, 95170, -5620, 3793, 4030, -5620, + -5620, 244, -5620, -5620, -5620, -5620, 59602, -5620, -5620, -5620, + 1518, 3967, 2436, 1052, 3970, -5620, -5620, -5620, -5620, 79609, + 74422, -5620, 4344, 4346, 1917, -5620, -5620, -5620, -5620, 276, + 276, -5620, 479, 276, -5620, -5620, 294, -5620, -5620, 1205, + 325, 3272, -5620, 2701, 2701, 2701, 2701, 256, 2701, 2701, + 2301, -5620, 326, -5620, -5620, 81832, -5620, 4722, 4724, -5620, + 4725, -5620, -5620, 1309, -5620, 3062, 1047, -5620, 1051, -5620, + 4517, 95170, 4705, 3799, -5620, 441, 2360, 3307, -5620, 4476, + 3984, 3985, 256, 3987, 256, 256, 2701, 2701, 3952, 2701, + 256, 2701, 2701, 2701, 2701, 2701, 2701, 2701, 256, 2701, + 1545, 3690, 408, 2701, 256, 5776, -5620, -5620, 2312, 2367, + -5620, 67753, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 4737, -5620, -5620, -5620, -5620, -5620, 1750, 2759, 1750, -5620, + 104062, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3307, 3307, -5620, -5620, 95170, 4738, -5620, -5620, -5620, -5620, + 3673, -5620, -5620, -5620, 4309, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 3986, 44661, 1004, -5620, 58850, 4532, + 2711, 4010, -5620, 1019, -5620, -5620, 1656, 4597, -5620, 3996, + 24152, -5620, 536, 4197, 4012, 61825, 72199, 72199, -5620, 2831, + -5620, 49107, -5620, 4640, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 24152, -5620, -5620, 95170, 2360, 3888, -5620, -5620, -5620, + -5620, -5620, 4433,106095, 4000, 3307, 24152, 3307, 3307, 24152, + 3237, 3237, 3238, 3256, -5620, 4694, -5620, 4631, 3237, 3237, + -5620, 3237, 4636, 3237, 3237, -5620, 4014, -5620, -5620, 4015, + 4016, 4017, 3125, -5620, 24152, 24152, 2473, 129, 129, 24152, + 1925, 1976, 505, -5620, 2495, 2513, 2533, 1509, 97393, -5620, + -5620, 2617, 2632, 2633, 2709, 2754, -5620, 1986, 3425, 1998, + 3307, 24152, 3307, 24152, 3307, 24152, 3307, 24921, 2767, -5620, + 2355, 3748, -5620, 2377, 3999, 2781, 2812, 2381, -5620, 3017, + 4768, 2410, 24921, 2817, 2828, 2033, 2047, 2856, 97393, 95170, + 4013, 4025, 4025, 349, -5620, 4027, -5620, -5620, -5620, 4033, + -5620, 24152, 24152, 4021, 3138, -5620, 24152, 1809, 32611, 515, + 32611, -5620, -5620, 4229, -5620, 24152, -5620, 4593, 4028, 3688, + 4031, 4032, 3141, 4038, 4041, 4044, 4048, 3307, -5620, -5620, + 95170, 4049, 1725, -5620, 3952, -5620, 4652, -5620, 4752, 4054, + 4069, 4058, 3918, -5620, 75163, -5620, 49107, -5620, 4692, 3570, + -5620, 72199, 72199, -5620, 84055, -5620, 60343, 95170, 95170, -5620, + 3307, -5620, 18769, 334, 4797, 4800, -5620, -5620, -5620, -5620, + 127, 4602, -5620, -5620, -5620, -5620, 18769, 276, -5620, 276, + 18769, 3727, -5620, -5620, -5620, -5620, 3745, -5620, 356, -5620, + -5620, -5620, 1876, 4056, -5620, 276, 1178, -5620, 20307, 4059, + 4062, -5620, 4659, -5620, 520, 316, -5620, 3749, -5620, 4530, + -5620, -5620, 4066, 90724, -5620, 4070, -5620, -5620, 4611, -5620, + -5620, 4053, 56594, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 356, 4114, 4300, -5620, -5620, -5620, + -5620, -5620, 3233, -5620, 4162, 4165, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 49107, 4648, 72199, 1047, 4448, + 49107, 49107, 7198, 9207, 3272, -5620, 2087, 2701, -5620, -5620, + -5620, 364, -5620, 4079, 95170, -5620, 3799, 4080, 472, 4080, + -5620, -5620, -5620, -5620, 1725, 2017, 2017, 4188, 4561, 45402, + 45402, 4231, 4562, 24152, 4083, -5620, 95170, -5620, 1200, -5620, + 4486, -5620, -5620, 24152, -5620, -5620, -5620, -5620, 3307, 4816, + 4090, -5620, -5620, -5620, -5620, -5620, -5620, 24152, -5620, 58098, + 24152, 4091, 4093, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 492, 492, -5620, -5620, 492, 492, -5620, -5620, -5620, -5620, + 492, 492, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 2101, -5620, 4842, 585, -5620, 4668, -5620, -5620, + -5620, -5620, 956, 256, 256, 256, 3690, 1977, -5620, 3062, + 439, 4431, -5620, 6672, 1809, 1596, 4591, 2223, -5620, 2419, + -5620, 4826, -5620, 205, -5620, -5620, -5620, 312, 324, -5620, + 371, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 95170, + -5620, 4669, -5620, -5620, -5620, -5620, 3251, 266, -5620, -5620, + 4102, -5620, -5620, -5620, -5620, -5620, -5620, 64789, -5620, -5620, + 61084, 2711, -5620, 95170, 4444, 4633, -5620, -5620, -5620, -5620, + -5620, -5620, 520, -5620, 3307, -5620, 4755, -5620, -5620, -5620, + -5620, 147, 147, -5620, -5620, -5620, -5620, 316, -5620, -5620, + 4640, 4386, -5620, 1483, 3307, -5620, -5620, -5620, -5620, -5620, + -5620, 95170, 505, 3307, -5620, 1750, -5620, -5620, 3237, -5620, + 1750, -5620, -5620, -5620, -5620, -5620, -5620, 1750, -5620, -5620, + -5620, -5620, 4109, 4773, 4773, -5620, 4827, 4637, 4726, 2885, + 24152, 24152, -5620, 24152, -5620, -5620, -5620, 1374, 4116, 4586, + -5620, -5620, -5620, -5620, -5620, -5620, 24152, 24152, 24152, 3307, + 3307, 3307, 4773, -5620, -5620, 3195, -5620, -5620,106826, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 408, 4773, -5620, -5620, + 24152, 24152, -5620, -5620, -5620, 95170, 3183, 4117, 4394, -5620, + -5620, -5620, 3183, 4258, -5620, -5620, 3183, 256, -5620, -5620, + -5620, 2500, 3138, -5620, 24152, 1809, 4696, 4122, 4838, 4127, + -5620, -5620, -5620, -5620, -5620, -5620, 24152, 84055, -5620, 4130, + 4132, -5620, -5620, -5620, 4569, 24152, 4748, 4701, -5620, 3183, + 95170, -5620, -5620, -5620, 72199, 3696, 3696, 91465, -5620, -5620, + -5620, -5620, 1891, 276, 276, 18769, -5620, -5620, 4140, 4142, + 18769, 18769, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 356, -5620, 39432, 2711, 23383, + -5620, -5620, -5620, 20307, -5620, 4143, 39432, 4613, -5620, -5620, + -5620, 4532, 228, -5620, -5620, -5620, 4530, -5620, 92206, -5620, + 4148, -5620, 4139, -5620, 1895, 4482, 4758, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 4153, -5620, -5620, -5620, 4170, -5620, 4155, + -5620, -5620, -5620, 49107, -5620, -5620, 4185, -5620, -5620, 42438, + 4774, 4201, 4525, 49107, 276, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 4528, 276, 276, 276, 276, 276, + 276, 276, 276, 276, 276, 1624, 95170, 276, 276, -5620, + -5620, 4730, -5620, 6555, -5620, -5620, -5620, -5620, -5620, 276, + -5620, 2087, -5620, -5620, 1321, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 608, 4746, 4900, 4175, -5620, -5620, 4707, -5620, + -5620, -5620, -5620, 4282, 4712, 3799, 2745, -5620, -5620, -5620, + 4661, -5620, -5620, -5620, 4662, 3307, 95170, -5620, -5620, -5620, + 1324, 1987, 4796, 2436, 4191, 95170, 2436, 244, 190, 3307, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 354, -5620, 81832, -5620, -5620, -5620, -5620, + -5620, 4937, 4939, -5620, -5620, -5620, -5620, 4379, 420, 4269, + 1909, 4756, 4590, 4759, 2169, 3707, 276, 4760, 4914, -5620, + 688, 276, 4763, 4825, 4280, 4828, 4769, -5620, 4284, 4590, + 4775, 4398, 4777, 4779, 4780, -5620, -5620, 9207, -5620, -5620, + -5620, -5620, 166, 46884, -5620, -5620, -5620, -5620, -5620, 4388, + 24152, 24152, 4798, 95170, 4799, -5620, 4617, -5620, 95170, -5620, + 520, -5620, -5620, -5620, 4519, -5620, 2515, -5620, -5620, 2574, + -5620, -5620, 2582, -5620, -5620, -5620, -5620, -5620, 4747, 95170, + -5620, -5620, 3870, -5620, 4877, -5620, 4567, 3380, -5620, -5620, + 137, 4423, 4695, 4695, -5620, -5620, -5620, 4807, -5620, -5620, + -5620, -5620, 4858, 2360,106095, 4588, -5620, -5620, -5620, -5620, + -5620, -5620, 4234, 4236, 24152, 2759, 4726, 59602, 4238, -5620, + -5620, 2887, 2209, 2583, 4521, 4473, -5620, 4412, -5620, 2910, + 3307, 3307, 771, 3238, -5620, -5620, -5620, -5620, 4869, 3237, + -5620, 4956, -5620, 3237, 1750, -5620, -5620, -5620, -5620, -5620, + 4249, 2590, 1875, 2943, 2947, -5620, -5620, -5620, 4251, -5620, + -5620, 301, -5620, 4250, -5620, 2597, 4968, 1980, 24152, -5620, + 4254, -5620, -5620, 95170, -5620, -5620, 4773, 1330, -5620, 2598, + -5620, -5620, -5620, 4255, 3696, -5620, -5620, 62566, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, 18769, 18769, 4107, -5620, 4141, + 2671, -5620, -5620, -5620, -5620, 4630, 4262, 4256, -5620, -5620, + -5620, 4252, 137, 39432, -5620, -5620, 64789, -5620, -5620, 4264, + 4263, -5620, -5620, -5620, 90724, -5620, 2622, -5620, -5620, 4987, + 20307, 2701, 2601, 4268, -5620, 81832, 4274, 4275, 49848, 1920, + 95170, 2625, -5620, -5620, -5620, -5620, -5620, 2125, -5620, 1356, + 2736, 2474, 2474, -5620, 4261, 49107, -5620, 276, -5620, 390, + 392, 428, 448, -5620, 3952, 256, 256, 2701, 2701, 276, + 256, 81832, 1868, 256, 3952, 3952, 458, 2701, 1173, 390, + -5620, -5620, -5620, 256, 390, 255, -5620, -5620, 9210, -5620, + 9207, 71458,107566, -5620, -5620, -5620, 4629, 1321, -5620, 95170, + 4061, -5620, -5620, 1781, 4405, -5620, 4281, 95170, -5620, 2701, + -5620, 5007, 5032, -5620, -5620, 4688, 24152, 4290, 24152, 4291, + 2658, -5620, 2474, -5620, 2474, -5620, 1324, 5010, 5012, 4955, + 5013, 1987, -5620, 2456, -5620, -5620, -5620, -5620, -5620, -5620, + 244, -5620, -5620, 4302, -5620, -5620, -5620, -5620, 4634, -5620, + 5049, -5620, 4754, 47625, 2736, -5620, 1810, 4342, -5620, -5620, + -5620, 4946, 3054, 3054, 409, 3054, 92206, 95170, 49107, 490, + 1283, 4930, 2491, 1991, 4351, 4868, 3054, 3054, 92947, 409, + 39432, -5620, -5620, -5620, 3054, -5620, 3054, 49107, 93688, 409, + -5620, -5620, -5620, 95170, -5620, 3054, 409, -5620, 409, 409, + 92206, -5620, 8027, -5620, -5620, 42438, 315, -5620, 3307, 4773, + 4704, -5620, -5620, 4428, 2701, 4673, -5620, -5620, 4782, -5620, + 95170, 297, -5620, 256, -5620, 256, -5620, 256, -5620, 281, + -5620, 32611, -5620, 3697, -5620, -5620, 2179, -5620, -5620, 4675, + 4532, 4819, -5620, -5620,106095, -5620, -5620, 4322, 2436, -5620, + 4325, -5620, -5620, -5620, -5620, 24152, -5620, 4557, -5620, 4663, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 3952, -5620, -5620, -5620, 4327, -5620, 256, -5620, 24152, -5620, + -5620, 4329, 3858, 2436, -5620, -5620, 4425, 4364, 4333, -5620, + 4701, 95170, -5620, -5620, 18769, 18769, -5620, -5620, -5620, 4467, + -5620, -5620, -5620, 39432, 63307, 4335, 4331, -5620, 276, -5620, + 109, -5620, 95170, -5620, -5620, 3952, 4697, -5620, 2663, -5620, + -5620, 95170, 4338, 4537, 95170, 95170, -5620, -5620, 4343, 95170, + -5620, -5620, -5620, 42438, 4348, 4961, 4963, 2474, -5620, 2736, + 4889, 49848, -5620, 2736, 2736, 68494, 95170, 4350, 2701, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 4354, -5620, + -5620, -5620, -5620, -5620, 2701, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 5075, + -5620, 4730, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 4352, -5620, -5620, -5620, -5620, -5620, -5620, + 107566, 1345, -5620, -5620, -5620, -5620, 4358, -5620, 4362, -5620, + -5620, 4355, 4347, -5620, -5620, -5620, 5027, 2087, -5620, -5620, + -5620, 4933, 1596, -5620, -5620, 4360, -5620, 69235, -5620, -5620, + -5620, -5620, 4361, 4359, 3307, 95170, 3307, 95170, -5620, 5022, + 5022, -5620, 2759, 2759, 5086, 2759, -5620, 5087, 5088, 2456, + -5620, -5620, 5125, 420, 4750, 439, 1809, 409, 1809, 5030, + -5620, -5620, 95170, 49848, 92206, 49848, -5620, 4871, -5620, 74422, + 49848, 3054, 95170, -5620, 5035, -5620, 4999, 49848, 49848, -5620, + -5620, 92206, 4381, -5620, 2436, 2690, 95170, 49848, -5620, -5620, + -5620, 3183, 4850, 49848, 92206, -5620, 92206, -5620, 4690, 4878, + 3708, -5620, 4391, 4393, 95170, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 1247, -5620, -5620, 2681, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 563, 95170, -5620, 1291, 4592, -5620, 2179, + -5620, -5620, -5620, 49107, -5620, 24152, -5620, -5620, 2957, -5620, + -5620, 4397, -5620, 4399, 3967, -5620, 4295, 4534, 4439, 4440, + 4441, 4577, 4745, -5620, 4585, -5620, 4174, 4569, 4409, 32611, + -5620, -5620, 2062, -5620, -5620, -5620, -5620, 97393, -5620, -5620, + 4402, -5620, 39432, 20307, -5620, -5620, -5620, 4829, -5620, 2682, + 2436, 4418, 95170, 4420, 2688, 2694, 95170, 4424, -5620, 24152, + 2736, -5620, -5620, 49848, 49107, -5620, 4903, -51, 49848, 49848, + -5620, 4417, 5136, -5620, -5620, 4422, -5620, -5620, 49107, -5620, + -5620, 228, 255, 210, 327, -5620, 285, 1345, -5620, -5620, + 95170, -5620, 95170, -5620, 95170, -5620, 95170, -5620, -5620, -5620, + 4798, 4061, 95170, -5620, 95170, -5620,101098, 6083, 2700, 2717, + 2463, -5620, -5620, -5620, -5620, 2759, -5620, 2759, 2759, -5620, + 4430, -5620, -5620, -5620, 5092, -5620, 5093, -5620, 2385, 508, + -5620, 49848, 1857, 4935, 4931, 5144, -5620, 49848, 4263, 95170, + -5620, -5620, 1656, -5620, 39432, -5620, -5620, 4932, 4936, -5620, + 4941, 315, -5620, 95170, -5620, -5620, -5620, 4539, -5620, 5802, + 4641, 5156, 5157, -5620, 95170, 94429, -5620, -5620, 5215, 32611, + -5620, -5620, 5071, -5620, 3749, 2436, -5620, -5620, -5620, 1382, + -5620, 5183, 1737, -5620, -5620, 1364, -5620, -5620, -5620, -5620, + 95170, 4455, 4540, -5620, -5620, 4527, -5620, -5620, 3716, -5620, + 116, 64048, -5620, -5620, -5620, -5620, 1019, 95170, -5620, 5209, + 4458, 2101, 1019, 1019, 4459, 95170, 2971, 49848, 4903, 1608, + 4464, 1446, -5620, 1446, -5620, -5620, 3149, 69235, -5620, -5620, + 3897, 95170, 4462, 5226, -5620, -5620, 4460, -5620, 4468, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 95170, 82573, + -5620, 2223, -5620, 2087, -5620, -5620, 5034, 2724, -5620, -5620, + -5620, -5620, -5620, 5180, -5620, 5185, 4469, 4474, -5620, -5620, + -5620, -5620, 49848, -15, -5620, -5620, 5111, -5620, 5158, 5159, + 315, -5620, 49107, 5039, 79609, -5620, -5620, -5620, 409, -5620, + 95170, 49848, 49107, -5620, -5620, 4263, 897, 24152, 4831, 5254, + -5620, 4680, 4681, -5620, -5620, 2728, -5620, -5620, 4543, 1725, + 4971, -5620, -5620, -5620, 4295, -5620, -5620, 4619, 1816, -5620, + 2768, -5620, -5620, -5620, 3183, -5620, 4490, -5620, 4852, 276, + 276, 4853, 276, 276, 276, 276, 4494, 3716, -5620, -5620, + -5620, 4844, -5620, -5620, -5620, 1350, 2436, 4495, 95170, 4497, + 2797, 1401, 1269, 95170, 4496, -5620, -5620, -5620, 1446, 95170, + 5099, -5620, 4501, -5620, 4502, 4503, -5620, -5620, 5123, 2701, + -5620, 4594, -5620, -5620, 3149, -5620, -5620, -5620, 4544, 5127, + 5089, -5620, 81832, 34918, -5620, 4992, -5620, 4952, 5193, -5620, + 5240, 3740, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 4867, -5620, 4079, 4080, -5620, -5620, 49107, 4617, + -5620, 2745, -5620,101098, 8917, -5620, -5620, 90724, 90724, 5136, + 3183, 4701, -5620, -5620, -5620, 34918, -5620, -5620, 4701, -5620, + -5620, -5620, -5620, -5620, 5141, -5620, 3307, 24152, -5620, -5620, + -5620, -5620, -5620, -5620, 94429, -5620, -5620, 490, -5620, -5620, + -5620, -5620, -5620, 95170, -5620, 4520, -5620, -5620, 152, 276, + 2701, 2701, 276, 3543, 3543, 3183, 81832, 4601, -5620, -5620, + 276, 1446, 2701, 276, 1446, -5620, -5620, 1574, 1350, -5620, + -5620, -5620, -5620, -5620, -5620, 750, 1019, -5620, 4711, 1574, + 1401, -5620, -5620, 1574, 1269, -5620, -5620, 4522, 95170, 4524, + 4526, -5620, 2805, -5620, 1680, 5098, 95170, 4533, 95170, 95170, + -5620, -5620, -5620, -5620, -5620, -5620, 4880, -5620, 4535, 4541, + 3690, 3690, 17231, -5620, -5620, -5620, -5620, -5620, -5620, 5109, + -5620, 4571, 1369, 276, -5620, 3200, -5620, -5620, -5620, 95170, + -5620, 5062, 4958, 5184, 4891, 5254, -5620, -5620, 5108, -5620, + -5620, -5620, -5620, -5620, 2191, 4542, 2839, -5620, -5620, 2848, + -5620, -5620, -5620, -5620, 4545, 3307, -5620, 39432, -5620, 4540, + -5620, -5620, 2858, -5620, 29535, -5620, -5620, -5620, 2701, -5620, + -5620, 2701, -5620, -5620, -5620, -5620, -5620, 2870, -5620, 81832, + -5620, -5620, 256, -5620, -5620, 5143, 4983, -5620, 4741, 1350, + 2695, -5620, -5620, -5620, -5620, -5620, 4547, 95170, 95170, 4549, + -5620, 95170, -5620, -5620, -5620, 1609, -5620, 2871, 95170, 2878, + 2917, -5620, -5620, -5620, -5620, 4552, 4550, -5620, 101, -5620, + -5620, 3200, 95170, 95170, -5620, 4061, -5620, -5620, -5620, -5620, + -5620, 4688, -5620, 5105, 2745, -5620, -5620, -5620, 4701, 4554, + -5620, 276, 5083, -5620, -5620, 4520, -5620, 4558, -5620, 1725, + -5620, -5620, 81832, -5620, 4601, -5620, -5620, -5620, -5620, -5620, + -5620, 1574, -5620, -5620, 2928, 4458, 95170, -5620, 1442, 1442, + 1350, 2944, 1401, 1269, -5620, 445, -5620, 3378, 3378, 1517, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2745, + 1312, 2951, 39432, 20307, 4861, 4486, -5620, 29535, 4563, 3823, + -5620, -5620, -5620, 4889, 4564, 4458, -5620, -5620, 537, 5014, + 5139, 5147, -5620, 1350, -5620, -5620, -5620, 4573, -5620, 3378, + -5620, -5620, -5620, -5620, -5620, 1763, 4061, 4920, 5242, -5620, + 3960, -5620, -5620, -5620, 5152, 1312, 1312, -5620, -5620, -5620, + 5292, 4796, -5620, -5620, -5620, 3823, -5620, -5620, 1350, 4578, + -5620, -5620, -5620, 5063, 5261, -5620, -5620, -5620, -5620, 1763, + -5620, -5620, 4715, -5620, -5620, -5620, -5620, -5620, -5620, 1281, + 5162, -5620, 5163, -5620, 2759, 5224, -5620, -5620, 1350, 1442, + 1442, -5620, -5620, -5620, -5620, 5253, 4938, -5620, 5341, 4595, + -5620, -5620, -5620, 1726, 1982, 36439, 5114, -5620, -5620, 81832, + -5620, -5620, -5620, -5620, 81832, -5620, 2965, -5620, -5620, 39432, + -5620, -5620, 5802, -5620, -5620, 37191, 4596, -5620, 276, -5620, + 5254, -5620, 39432, -5620, -5620, -5620, 20307, -5620, -5620 +}; + +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int16 yydefact[] = +{ + 0, 3619, 2, 0, 2503, 2504, 1016, 2296, 0, 430, + 0, 1243, 612, 2746, 3829, 2141, 2290, 2289, 2062, 2761, + 470, 220, 2809, 376, 2064, 2363, 0, 0, 466, 2862, + 1259, 2879, 754, 496, 2886, 0, 320, 0, 0, 473, + 318, 220, 1308, 3262, 2190, 0, 3368, 2128, 0, 1306, + 468, 2461, 2714, 2759, 2760, 2789, 2622, 2880, 2903, 2931, + 2067, 2699, 2698, 2700, 3002, 2701, 2702, 2703, 2704, 2705, + 3003, 2597, 2706, 2707, 2708, 2710, 2709, 2711, 2712, 3004, + 2598, 3524, 3620, 2599, 2671, 2713, 2673, 2672, 2715, 2600, + 2601, 2716, 2717, 2718, 2720, 2719, 2603, 2602, 2721, 2723, + 2722, 2674, 2675, 2724, 3005, 2725, 2727, 2604, 3000, 2605, + 2606, 2607, 2726, 2608, 2728, 3529, 2729, 2730, 2609, 2731, + 2732, 2733, 2734, 2736, 2735, 2737, 2738, 2740, 2741, 2742, + 2739, 2743, 2744, 2747, 2745, 2677, 2676, 3006, 2610, 2748, + 2749, 2750, 2751, 2753, 2754, 2752, 2755, 2034, 2756, 2757, + 2758, 2766, 2767, 2769, 2768, 2678, 2770, 2771, 2772, 2774, + 2773, 2775, 2777, 2611, 2612, 2613, 2776, 2778, 2762, 2763, + 2764, 2765, 2780, 2779, 2781, 2782, 2783, 2679, 1259, 2615, + 2999, 2784, 2785, 3677, 2786, 2787, 3007, 2616, 2668, 2788, + 3370, 2791, 2790, 85, 2792, 2618, 2793, 3008, 3009, 2794, + 2795, 2797, 2799, 2796, 2800, 2801, 2807, 2619, 2798, 2802, + 2803, 2804, 2805, 2806, 2808, 2680, 2810, 2811, 3010, 3011, + 2812, 2813, 2814, 2815, 2669, 2816, 2817, 2818, 2819, 2832, + 2833, 2823, 2824, 2826, 2827, 2830, 2825, 2831, 2836, 2835, + 2837, 2838, 2839, 2840, 2841, 2834, 2821, 2828, 2829, 2822, + 2842, 2843, 2820, 2844, 2846, 2845, 2847, 2681, 2848, 2849, + 2850, 2851, 2852, 3012, 2853, 2854, 2856, 2855, 2857, 3013, + 2858, 2859, 2860, 2665, 2861, 2682, 2683, 2863, 2864, 3014, + 2865, 2866, 2871, 2872, 2873, 2868, 2867, 2869, 2870, 2684, + 2685, 2686, 2874, 2875, 2876, 2878, 2877, 2621, 2620, 3015, + 2623, 2881, 2882, 2624, 2883, 2885, 2884, 2667, 2625, 2887, + 2888, 2890, 2889, 2626, 2627, 2628, 2891, 2892, 2893, 2894, + 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2687, 2688, + 2904, 2905, 2906, 2908, 2907, 2909, 2910, 2914, 2911, 2912, + 2913, 2915, 2629, 2916, 1259, 2917, 2918, 2919, 2630, 2921, + 2920, 2631, 2922, 2923, 2924, 2925, 2926, 2666, 3529, 2927, + 2928, 2930, 2689, 2929, 2932, 2933, 0, 2934, 2935, 3016, + 2632, 2936, 2937, 2690, 2670, 2633, 3017, 2939, 2375, 2697, + 2938, 2940, 2635, 2636, 2941, 2942, 2943, 2634, 2944, 2637, + 3018, 2945, 2947, 2946, 2948, 2949, 2950, 2951, 2638, 2952, + 2953, 2639, 2954, 2640, 2955, 2956, 3019, 2957, 2959, 2958, + 2960, 2961, 2962, 2963, 2964, 2965, 2967, 2969, 2968, 2966, + 2970, 2971, 2691, 2972, 2641, 2692, 3021, 3022, 2693, 2973, + 2974, 2975, 2976, 3020, 2170, 2977, 2978, 2644, 2979, 2980, + 2982, 2981, 2642, 2643, 2983, 2984, 2648, 3023, 2985, 3024, + 2694, 2695, 2986, 2987, 2997, 2988, 2990, 2989, 2992, 2991, + 2998, 3025, 3678, 2645, 2993, 2994, 2646, 2995, 2647, 2996, + 2696, 0, 0, 3, 3621, 22, 0, 45, 27, 33, + 17, 21, 16, 47, 60, 53, 30, 3816, 3817, 3819, + 43, 3560, 42, 11, 63, 64, 19, 50, 12, 15, + 18, 41, 49, 37, 44, 57, 58, 1329, 1305, 1333, + 1304, 1300, 1296, 1315, 1316, 1317, 1323, 25, 26, 34, + 51, 68, 23, 65, 61, 24, 2296, 13, 28, 29, + 14, 52, 46, 38, 62, 69, 39, 0, 3681, 3675, + 3673, 3676, 3671, 3672, 3001, 2596, 3674, 59, 40, 67, + 32, 54, 31, 9, 10, 20, 55, 56, 48, 70, + 35, 66, 36, 8, 3682, 0, 3622, 2050, 168, 3526, + 3818, 2561, 2560, 2598, 3633, 2599, 2601, 2652, 2602, 2655, + 2656, 2649, 2610, 2657, 3634, 2613, 2614, 2653, 2558, 2616, + 2658, 2617, 2619, 2650, 2651, 2659, 2654, 2628, 2660, 2630, + 2661, 2662, 2663, 2638, 2639, 2664, 2643, 2559, 2647, 2508, + 2524, 0, 2525, 2555, 2553, 2557, 2551, 2556, 2549, 2550, + 2554, 2552, 1060, 0, 0, 0, 0, 2060, 0, 2060, + 1151, 1374, 3558, 3559, 3560, 1260, 0, 1261, 0, 0, + 244, 400, 131, 0, 0, 3620, 2165, 2060, 2038, 2060, + 2060, 2060, 2060, 2060, 2060, 2060, 2063, 2060, 2060, 0, + 0, 0, 400, 2070, 2365, 0, 2385, 2386, 2380, 3358, + 3359, 3353, 378, 0, 0, 0, 2263, 2262, 0, 0, + 305, 317, 320, 313, 316, 0, 220, 2060, 378, 319, + 320, 0, 1338, 0, 2268, 320, 0, 2139, 2379, 0, + 400, 2462, 2459, 2070, 2336, 2338, 0, 2334, 3529, 1446, + 1445, 0, 3825, 3827, 0, 2514, 1238, 1270, 1195, 3530, + 3531, 0, 77, 80, 2302, 343, 0, 0, 0, 610, + 0, 0, 1203, 0, 3531, 3541, 2377, 0, 131, 1176, + 0, 131, 2173, 2060, 2060, 3602, 3603, 0, 0, 0, + 3597, 0, 3604, 0, 1333, 0, 1319, 1, 5, 0, + 0, 610, 970, 610, 971, 0, 610, 610, 0, 0, + 0, 0, 3565, 3558, 3559, 3560, 0, 2020, 1875, 1334, + 1333, 1967, 1971, 3546, 3546, 3546, 0, 0, 1967, 1324, + 2764, 2999, 2885, 0, 2281, 2295, 2279, 2497, 1302, 1298, + 3683, 0, 0, 2608, 1019, 1061, 1024, 228, 0, 0, + 1026, 0, 1037, 2530, 2529, 2528, 1034, 220, 0, 1153, + 0, 0, 0, 3566, 3565, 0, 1215, 2283, 2284, 2285, + 2286, 2287, 2288, 2291, 0, 250, 400, 432, 0, 443, + 434, 437, 0, 132, 133, 1241, 1244, 0, 613, 296, + 298, 0, 3650, 295, 297, 3649, 0, 3794, 0, 0, + 374, 283, 372, 3646, 3643, 3648, 3644, 3647, 3645, 3783, + 373, 3680, 0, 287, 3830, 3784, 3785, 3787, 0, 2169, + 2168, 0, 2167, 2142, 0, 2165, 0, 2058, 2060, 0, + 0, 0, 0, 0, 220, 0, 220, 2043, 2060, 2060, + 471, 3679, 0, 3654, 3418, 3436, 3437, 1387, 3433, 3438, + 0, 3435, 3430, 0, 0, 3432, 3429, 0, 0, 3457, + 3431, 3434, 2599, 2732, 2773, 2613, 2781, 2782, 2895, 2899, + 2904, 2915, 2919, 2663, 2635, 2960, 3411, 3399, 3413, 3412, + 0, 0, 3416, 3421, 0, 3420, 0, 0, 2072, 2366, + 2367, 2371, 0, 2389, 0, 0, 391, 0, 0, 0, + 0, 3815, 380, 381, 0, 385, 0, 378, 3813, 3805, + 0, 400, 3812, 3807, 3806, 3808, 3809, 3810, 3811, 411, + 0, 412, 413, 3814, 467, 3801, 3802, 0, 0, 378, + 3689, 0, 3803, 3799, 3800, 1257, 1679, 0, 2436, 2505, + 2506, 0, 2449, 2454, 2455, 2447, 2448, 2452, 2428, 2451, + 2427, 2453, 1448, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1387, 1387, 1387, 1384, 0, 0, 0, + 0, 0, 0, 2445, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1384, 0, 0, 2444, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1577, 2446, 1387, 1384, + 1384, 0, 0, 1387, 0, 0, 0, 3002, 2597, 3004, + 2652, 2604, 2605, 2606, 2607, 2649, 2676, 3006, 3007, 3008, + 3010, 3011, 3012, 3013, 2864, 3014, 3015, 2667, 2893, 2689, + 3016, 3017, 3019, 2692, 3021, 3022, 2693, 3020, 2664, 3023, + 3024, 3025, 2645, 2696, 0, 0, 0, 0, 1447, 0, + 0, 1331, 1523, 755, 1393, 1405, 1421, 0, 1521, 1520, + 1524, 1526, 1532, 1440, 1553, 1492, 1493, 1495, 1494, 1499, + 1500, 0, 1655, 1501, 0, 0, 1498, 2441, 1497, 1496, + 2442, 2443, 1491, 2483, 2513, 0, 0, 2507, 3001, 2596, + 498, 497, 0, 339, 332, 327, 335, 329, 331, 330, + 336, 337, 338, 333, 328, 334, 321, 0, 306, 0, + 314, 3542, 0, 1262, 378, 474, 340, 3418, 2700, 2899, + 3391, 0, 3398, 0, 3557, 3551, 3554, 3553, 3549, 3552, + 3550, 3555, 1359, 3556, 1358, 1309, 1339, 1356, 1357, 0, + 0, 0, 2586, 2585, 890, 2583, 3283, 3284, 0, 2587, + 0, 0, 3285, 2952, 2973, 2584, 0, 2519, 0, 2520, + 2580, 2578, 2582, 2581, 2575, 2576, 2579, 3263, 3268, 3264, + 2577, 0, 2296, 0, 0, 2276, 968, 967, 0, 0, + 0, 0, 2212, 0, 890, 2276, 2213, 0, 1932, 2266, + 2269, 0, 3287, 2226, 969, 3288, 2262, 0, 2198, 2214, + 2175, 2219, 131, 3289, 131, 2265, 1932, 2276, 0, 2191, + 0, 0, 0, 2296, 1373, 0, 315, 3369, 2140, 1149, + 2108, 1307, 2094, 0, 469, 0, 2075, 0, 2335, 3525, + 3826, 3709, 0, 0, 0, 0, 3534, 1721, 2035, 0, + 81, 76, 0, 0, 0, 0, 2502, 3371, 86, 0, + 0, 3616, 74, 0, 2353, 0, 2351, 2348, 2350, 0, + 3534, 0, 2376, 1183, 1183, 0, 0, 1175, 1177, 1178, + 1183, 1183, 2174, 0, 0, 0, 2435, 2433, 2434, 2515, + 3599, 2432, 2431, 3608, 3610, 3593, 0, 3596, 3595, 3605, + 1322, 1321, 6, 71, 0, 142, 610, 220, 220, 610, + 167, 148, 151, 610, 610, 610, 610, 160, 162, 0, + 222, 0, 0, 3565, 1337, 2809, 0, 0, 1349, 1335, + 1769, 1336, 1801, 1771, 1741, 1732, 1731, 1797, 1798, 1800, + 1799, 1802, 1804, 1794, 0, 0, 2033, 0, 2028, 1876, + 1881, 1875, 0, 0, 0, 0, 0, 0, 1966, 1932, + 1975, 1937, 1968, 1301, 1964, 0, 1297, 1362, 1362, 3548, + 3547, 3545, 3544, 3543, 1969, 1320, 1328, 1326, 1327, 1970, + 1318, 0, 2293, 2499, 0, 0, 2298, 0, 1967, 1971, + 0, 0, 0, 2099, 2098, 2101, 0, 904, 0, 229, + 0, 3563, 3564, 3562, 1387, 2531, 2534, 3561, 2535, 229, + 2061, 0, 0, 0, 2060, 1157, 1158, 1152, 1154, 1156, + 0, 0, 0, 0, 2297, 0, 246, 252, 245, 441, + 0, 401, 3668, 0, 438, 87, 0, 1245, 2051, 2053, + 3797, 3026, 3027, 3028, 3029, 3030, 3031, 3033, 3034, 3032, + 3035, 3036, 834, 857, 3037, 3038, 3039, 857, 874, 3040, + 3041, 3042, 3043, 3044, 3045, 3046, 3047, 820, 3048, 3049, + 3050, 3051, 3052, 3053, 3054, 3055, 3056, 3057, 3058, 3060, + 3059, 3061, 3062, 3063, 3064, 3065, 3066, 3067, 3068, 840, + 3069, 3070, 3071, 3072, 3073, 3074, 3076, 3075, 3077, 3078, + 3079, 3080, 836, 3081, 3082, 3083, 3085, 3084, 3086, 3087, + 3088, 3089, 3090, 3091, 3092, 3093, 3094, 840, 3095, 3096, + 3097, 3098, 3099, 3101, 3100, 3104, 3105, 3106, 3107, 3108, + 3109, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, + 3119, 830, 3120, 3121, 3122, 3123, 3124, 3125, 3102, 3126, + 3103, 3127, 3128, 3129, 3130, 3131, 3132, 3133, 3134, 3135, + 874, 786, 786, 3136, 3137, 3138, 3139, 3140, 3141, 3142, + 874, 833, 786, 3145, 3146, 3143, 3144, 3147, 3148, 3149, + 3150, 3151, 3153, 3152, 3156, 3154, 3155, 840, 3157, 3158, + 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, 3167, 3168, + 3169, 3171, 3172, 3170, 3173, 3174, 3175, 3176, 3177, 3178, + 3179, 3180, 3181, 3182, 3183, 3184, 835, 3185, 3187, 3186, + 3188, 3189, 3190, 3191, 3193, 3194, 3195, 3196, 3197, 3198, + 3199, 3200, 3203, 3201, 3202, 3204, 3205, 3206, 3207, 3208, + 0, 3209, 3210, 832, 3211, 3212, 3216, 3213, 3217, 3214, + 3218, 3215, 3219, 3220, 3221, 3222, 3223, 3224, 3225, 3226, + 3228, 3229, 3230, 3231, 3232, 874, 831, 786, 3233, 3234, + 3235, 3237, 3238, 3239, 3240, 3241, 3242, 3243, 3244, 3245, + 3246, 3247, 3248, 3250, 3251, 3249, 857, 824, 3252, 3254, + 3253, 3255, 3256, 3257, 3258, 3259, 3260, 3261, 3192, 3227, + 3236, 857, 780, 781, 786, 857, 799, 0, 840, 874, + 0, 821, 840, 826, 2595, 857, 0, 857, 857, 857, + 857, 3649, 857, 0, 276, 284, 840, 764, 770, 772, + 771, 773, 774, 857, 857, 857, 857, 857, 861, 767, + 769, 2588, 2589, 2590, 2591, 2593, 2594, 3632, 768, 2592, + 3790, 0, 0, 0, 3796, 0, 3620, 0, 0, 3788, + 0, 2143, 0, 1347, 1875, 2145, 2150, 2159, 2163, 2166, + 2040, 0, 0, 0, 3768, 3767, 2046, 2045, 3766, 0, + 2047, 0, 0, 2048, 2036, 0, 447, 449, 3419, 3417, + 3454, 3453, 3458, 0, 3455, 3451, 0, 3410, 3459, 3444, + 3448, 0, 3460, 3445, 3452, 3466, 3465, 3467, 3462, 3461, + 0, 3464, 3450, 0, 3449, 3470, 0, 3414, 0, 0, + 423, 0, 2077, 2078, 2074, 1149, 2073, 2372, 0, 2364, + 0, 1280, 2391, 2390, 2387, 1867, 3355, 3360, 3642, 3641, + 3640, 3639, 2526, 0, 3636, 3638, 3635, 3637, 2527, 400, + 392, 0, 0, 2864, 0, 399, 398, 397, 420, 400, + 386, 409, 0, 0, 3623, 379, 3624, 382, 418, 421, + 460, 456, 464, 458, 3822, 3820, 3690, 3804, 274, 0, + 0, 2505, 2506, 2438, 2437, 2507, 2429, 2450, 0, 0, + 0, 1527, 1873, 1873, 1873, 0, 0, 1729, 0, 0, + 0, 0, 1873, 0, 1565, 1539, 1538, 0, 1566, 0, + 0, 0, 0, 0, 0, 0, 1685, 1685, 1651, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1723, + 1725, 2483, 1873, 0, 1873, 0, 1392, 1571, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1873, + 1873, 1873, 0, 1583, 1585, 1584, 1873, 1873, 1573, 0, + 0, 0, 0, 0, 1873, 0, 0, 0, 0, 0, + 1719, 2456, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1719, 0, 0, 0, 0, 0, 0, 2458, + 0, 0, 0, 2457, 0, 0, 0, 0, 0, 0, + 1719, 0, 0, 1529, 0, 1528, 1530, 0, 1331, 756, + 0, 0, 0, 1444, 1442, 1443, 1441, 0, 0, 0, + 0, 1450, 1452, 1454, 0, 1449, 1451, 1453, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1531, 0, + 0, 0, 0, 0, 2430, 0, 1604, 0, 510, 2361, + 0, 0, 0, 304, 1264, 2536, 0, 0, 400, 3417, + 0, 0, 0, 3414, 1374, 1355, 3290, 0, 889, 0, + 0, 892, 894, 893, 3322, 0, 891, 3331, 3329, 3327, + 3326, 0, 0, 3270, 3272, 0, 898, 900, 899, 3320, + 897, 0, 3306, 0, 0, 0, 0, 0, 610, 0, + 0, 0, 0, 0, 0, 0, 0, 2243, 0, 1373, + 1373, 2192, 0, 2276, 0, 2276, 2266, 0, 2276, 2272, + 2232, 2225, 0, 0, 667, 1949, 1933, 2218, 2270, 2271, + 2276, 0, 0, 2276, 0, 2233, 2266, 2276, 2187, 0, + 0, 2179, 2184, 2180, 0, 2186, 2185, 2188, 2176, 2177, + 0, 2205, 0, 2217, 2224, 0, 2204, 2211, 0, 2222, + 2266, 2266, 0, 2276, 2276, 2276, 1150, 0, 1374, 0, + 3656, 2460, 2463, 2469, 2475, 2079, 2076, 2337, 272, 0, + 0, 0, 1272, 1274, 1273, 1290, 1197, 3533, 0, 3535, + 0, 3537, 0, 78, 0, 0, 2329, 2327, 0, 0, + 0, 2321, 2323, 2326, 2322, 0, 0, 2328, 131, 0, + 2324, 2330, 2303, 2306, 2313, 1373, 2304, 0, 0, 341, + 344, 346, 0, 349, 1867, 3374, 3373, 0, 0, 0, + 1201, 1204, 0, 2358, 2355, 131, 0, 2662, 3540, 3538, + 0, 1171, 1187, 134, 1181, 1182, 0, 0, 1174, 134, + 3355, 3617, 3618, 0, 0, 3594, 3611, 3592, 0, 3606, + 3607, 3591, 7, 4, 154, 0, 145, 0, 0, 0, + 610, 610, 137, 0, 610, 0, 3770, 1374, 1374, 610, + 610, 610, 0, 1766, 0, 1732, 1797, 1798, 1800, 0, + 1799, 0, 0, 1867, 0, 0, 1789, 1815, 0, 1815, + 1791, 1792, 0, 0, 0, 1349, 1795, 2516, 2029, 2032, + 0, 2021, 2023, 2024, 2528, 2026, 0, 0, 1878, 1881, + 1943, 1944, 0, 1364, 0, 1957, 1958, 1956, 0, 1934, + 1950, 1955, 1953, 0, 1925, 0, 1974, 1965, 2013, 1363, + 1972, 1973, 1325, 2282, 0, 2280, 2299, 2300, 2498, 1303, + 1299, 3351, 3352, 3349, 3350, 3348, 3684, 3685, 3687, 1021, + 905, 2100, 904, 603, 606, 605, 0, 0, 2071, 227, + 2533, 0, 2071, 1038, 0, 2534, 3495, 0, 3502, 3484, + 0, 1155, 3567, 3568, 1032, 1030, 0, 1216, 1217, 1220, + 0, 250, 0, 253, 255, 0, 400, 433, 435, 444, + 3631, 378, 0, 0, 1255, 0, 1253, 1252, 1250, 1251, + 1249, 0, 1240, 1246, 1247, 290, 0, 855, 858, 792, + 874, 872, 874, 806, 875, 0, 844, 842, 841, 837, + 844, 808, 914, 820, 0, 874, 907, 911, 908, 816, + 0, 786, 909, 0, 912, 787, 814, 807, 813, 844, + 0, 803, 811, 874, 779, 815, 802, 0, 844, 817, + 822, 825, 827, 829, 844, 874, 0, 3620, 786, 801, + 800, 786, 844, 0, 0, 3620, 838, 823, 909, 920, + 786, 874, 844, 0, 862, 844, 288, 375, 1976, 3709, + 3792, 3793, 3786, 3789, 3791, 1794, 0, 2146, 2153, 2055, + 2057, 2497, 0, 1348, 2148, 1923, 0, 0, 0, 2161, + 2059, 0, 3769, 0, 2042, 3408, 3482, 2041, 1159, 0, + 0, 378, 472, 448, 402, 3447, 1388, 3463, 0, 3468, + 3469, 3406, 225, 224, 3415, 223, 0, 0, 0, 0, + 3456, 3439, 0, 3443, 3442, 0, 3440, 0, 3441, 0, + 3446, 3423, 3422, 2473, 0, 2472, 3668, 377, 2079, 3009, + 3023, 2373, 2369, 2368, 0, 2388, 0, 1868, 1869, 0, + 0, 1871, 3357, 1976, 0, 3354, 3691, 393, 400, 0, + 0, 0, 415, 387, 400, 402, 414, 453, 275, 0, + 250, 383, 0, 0, 378, 378, 400, 3620, 3709, 3355, + 3290, 1680, 1682, 0, 0, 1874, 0, 1697, 0, 0, + 0, 0, 0, 0, 1507, 0, 0, 0, 1634, 0, + 1697, 1662, 2006, 2007, 1987, 1988, 1986, 1989, 1385, 0, + 1990, 2005, 0, 0, 0, 1660, 1330, 1313, 0, 0, + 1843, 1844, 1845, 1846, 1847, 1848, 1849, 1850, 1851, 1852, + 1853, 1854, 1856, 1861, 1857, 1858, 1859, 1860, 1855, 1862, + 0, 1842, 0, 1686, 1647, 1649, 0, 0, 0, 756, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1873, + 0, 0, 1873, 0, 0, 0, 0, 0, 0, 1661, + 0, 1659, 0, 0, 1658, 1551, 0, 0, 1873, 0, + 1578, 0, 0, 0, 0, 0, 0, 1557, 1558, 0, + 0, 0, 1483, 0, 1481, 1482, 0, 0, 1873, 0, + 0, 0, 0, 1474, 0, 0, 0, 0, 1720, 0, + 0, 1865, 1863, 1866, 1864, 0, 0, 1721, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1555, 0, 0, + 0, 2488, 938, 0, 0, 0, 0, 1522, 0, 0, + 0, 0, 1390, 1389, 1391, 1402, 1396, 1400, 1394, 1398, + 0, 1455, 3003, 1403, 0, 0, 0, 1406, 1415, 1419, + 0, 0, 0, 0, 0, 1426, 1424, 1425, 1437, 1438, + 1422, 1423, 0, 1428, 0, 1427, 1434, 1435, 1436, 1439, + 1525, 901, 1533, 1893, 1653, 1654, 1678, 1897, 0, 0, + 0, 0, 2484, 1374, 1477, 1476, 1478, 1479, 1480, 511, + 0, 505, 508, 522, 0, 0, 2360, 0, 2676, 2692, + 2693, 322, 325, 324, 326, 0, 0, 1263, 1267, 3355, + 0, 0, 0, 0, 3486, 3396, 0, 0, 1370, 1310, + 1369, 0, 0, 0, 0, 0, 3312, 3324, 0, 0, + 3321, 0, 0, 0, 0, 0, 3294, 0, 0, 0, + 0, 3267, 3333, 3334, 3337, 0, 0, 0, 2973, 0, + 3269, 3274, 3265, 3278, 3280, 3282, 2234, 0, 0, 0, + 0, 2239, 2236, 2229, 2242, 2714, 2238, 2255, 2237, 2231, + 2244, 2230, 0, 0, 0, 2276, 2248, 2251, 2245, 2276, + 0, 2276, 2247, 0, 2274, 2261, 2260, 2259, 2202, 2201, + 2195, 2267, 2252, 2246, 220, 2276, 2200, 2199, 2181, 2182, + 2183, 0, 1932, 0, 2272, 134, 2266, 0, 2276, 2276, + 0, 2258, 2221, 2223, 2127, 0, 1794, 0, 0, 2113, + 2106, 2093, 378, 0, 0, 0, 2080, 2081, 378, 3828, + 0, 0, 0, 495, 1290, 1276, 1292, 1199, 1198, 1196, + 3532, 3536, 1722, 80, 2121, 2119, 82, 2118, 2120, 83, + 2339, 2315, 2314, 2316, 2320, 131, 2325, 2317, 0, 2331, + 2332, 350, 354, 0, 0, 0, 3372, 0, 611, 0, + 75, 0, 1205, 1976, 2354, 2356, 2349, 3539, 0, 1172, + 1189, 1188, 1184, 1185, 0, 1169, 135, 1180, 1179, 1173, + 2171, 3600, 3609, 3613, 3598, 601, 986, 0, 3404, 3502, + 189, 0, 0, 0, 140, 0, 3720, 0, 610, 161, + 163, 610, 0, 0, 0, 610, 0, 0, 1811, 1803, + 1805, 1806, 1807, 0, 1810, 0, 1352, 0, 1340, 1340, + 1350, 1813, 1793, 1790, 1816, 0, 1815, 1815, 0, 0, + 1773, 1772, 0, 1867, 895, 2025, 0, 0, 1877, 0, + 1879, 1888, 1878, 1946, 2689, 0, 0, 1366, 0, 1976, + 1360, 2437, 0, 0, 0, 0, 0, 0, 0, 1945, + 1942, 0, 2301, 0, 0, 601, 0, 604, 2100, 2100, + 0, 0, 0, 0, 0, 0, 0, 0, 230, 239, + 1025, 2532, 1027, 0, 0, 0, 0, 0, 3514, 3355, + 1052, 3569, 1028, 0, 0, 1219, 248, 247, 251, 0, + 3668, 439, 436, 378, 431, 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, + 134, 89, 110, 0, 1242, 1254, 2052, 1248, 0, 0, + 0, 0, 0, 0, 804, 878, 0, 805, 0, 846, + 847, 845, 850, 782, 778, 915, 919, 918, 809, 810, + 789, 910, 906, 913, 0, 872, 788, 784, 0, 1014, + 796, 0, 785, 828, 783, 797, 280, 0, 0, 3655, + 0, 0, 3662, 286, 812, 794, 798, 3620, 3620, 277, + 285, 0, 775, 790, 921, 791, 793, 920, 776, 0, + 777, 1976, 1981, 1977, 3795, 303, 0, 302, 0, 2147, + 1340, 0, 0, 0, 2500, 0, 1960, 1924, 2160, 0, + 2164, 2163, 0, 3765, 0, 0, 1161, 1160, 2044, 2049, + 3355, 378, 292, 405, 451, 0, 0, 3403, 226, 3478, + 3481, 2497, 0, 0, 3424, 0, 424, 3630, 2081, 2370, + 2374, 1281, 1283, 1284, 1282, 1290, 0, 2548, 2547, 2546, + 2517, 1872, 2518, 2543, 2541, 2545, 2539, 2544, 2537, 2538, + 2542, 2540, 0, 3363, 3364, 3362, 3356, 3361, 394, 395, + 416, 419, 0, 388, 389, 403, 407, 0, 3626, 3625, + 422, 461, 445, 445, 445, 3823, 0, 1258, 0, 0, + 2487, 0, 1629, 0, 1630, 1631, 0, 1508, 1730, 0, + 0, 0, 1536, 0, 0, 0, 1633, 0, 1386, 0, + 0, 1511, 1503, 1314, 0, 1664, 0, 0, 0, 0, + 0, 0, 0, 1669, 0, 1667, 0, 0, 1724, 0, + 1726, 2484, 0, 1639, 1674, 0, 1637, 0, 0, 1663, + 1675, 1676, 0, 0, 0, 1643, 1641, 0, 1645, 1579, + 1642, 1644, 0, 0, 0, 1576, 0, 0, 0, 0, + 0, 0, 0, 1554, 0, 1590, 0, 1627, 1591, 0, + 0, 1588, 0, 0, 0, 1606, 1540, 1541, 0, 1542, + 1593, 0, 1516, 1547, 1548, 1513, 1514, 1607, 1596, 1515, + 0, 1550, 1976, 0, 1534, 0, 0, 0, 1552, 1582, + 0, 0, 0, 1512, 0, 0, 0, 1976, 0, 1608, + 1556, 0, 0, 757, 1332, 1504, 2485, 1397, 1401, 1395, + 1399, 0, 0, 0, 0, 1414, 0, 0, 1407, 1417, + 1420, 0, 0, 1895, 0, 0, 1672, 1719, 1719, 1719, + 1719, 0, 0, 0, 1623, 1624, 0, 0, 504, 503, + 0, 507, 591, 0, 524, 512, 501, 2362, 0, 0, + 1265, 0, 0, 0, 0, 3397, 0, 0, 0, 0, + 1374, 1375, 1375, 2483, 3291, 3292, 3293, 0, 2573, 2572, + 2570, 2574, 2571, 2521, 2523, 0, 2522, 2568, 2566, 2569, + 2564, 2562, 2563, 2567, 2565, 0, 0, 3310, 903, 902, + 3323, 0, 3345, 0, 0, 3330, 3328, 0, 0, 0, + 3273, 0, 3339, 3340, 0, 0, 0, 3308, 3307, 0, + 0, 0, 3300, 0, 0, 0, 2257, 0, 2228, 2241, + 2240, 2277, 2278, 2254, 2250, 2196, 2253, 2249, 2273, 1976, + 2206, 2227, 2197, 0, 2220, 2178, 2274, 2235, 1875, 2266, + 2193, 2194, 2256, 0, 1349, 1375, 2109, 1374, 2110, 378, + 2464, 0, 2471, 0, 2068, 0, 0, 3620, 1239, 1279, + 1271, 1278, 1275, 1290, 1288, 1277, 964, 963, 0, 1291, + 79, 0, 0, 2318, 134, 2312, 2333, 2307, 0, 345, + 355, 347, 351, 352, 353, 348, 2783, 2864, 0, 1875, + 3376, 3615, 1212, 1210, 1209, 1211, 1200, 1206, 1207, 2359, + 2357, 134, 2378, 1187, 0, 1190, 3620, 1976, 0, 3612, + 155, 602, 0, 0, 0, 986, 0, 165, 3514, 0, + 0, 0, 138, 169, 3720, 3777, 3620, 3762, 3771, 3583, + 0, 156, 3774, 228, 3772, 0, 0, 1808, 1809, 1770, + 1340, 1342, 1341, 0, 0, 1344, 0, 0, 0, 0, + 1778, 0, 1774, 1776, 0, 1840, 1832, 0, 2030, 2022, + 2027, 2482, 1885, 1929, 0, 0, 1311, 1888, 0, 1947, + 1938, 0, 1367, 1365, 1959, 1936, 0, 1952, 1951, 1954, + 1364, 1926, 1929, 0, 1374, 3686, 3688, 1022, 607, 0, + 0, 1023, 0, 0, 0, 233, 236, 234, 235, 2100, + 2100, 183, 2100, 2100, 182, 184, 0, 178, 175, 185, + 2100, 1039, 171, 0, 0, 0, 0, 1976, 0, 0, + 0, 191, 0, 3489, 3488, 0, 3504, 0, 0, 3506, + 0, 3505, 3503, 3474, 3485, 0, 1047, 1017, 0, 1054, + 1056, 0, 0, 3569, 1218, 0, 250, 254, 442, 0, + 0, 0, 1976, 0, 1976, 1976, 0, 0, 1976, 0, + 1976, 0, 0, 0, 0, 0, 0, 0, 1976, 0, + 0, 0, 1976, 0, 1976, 0, 88, 1256, 0, 3620, + 261, 0, 260, 3755, 292, 853, 851, 854, 852, 873, + 0, 848, 849, 916, 917, 879, 909, 0, 909, 282, + 0, 3111, 279, 767, 2588, 2589, 2590, 2591, 2593, 2594, + 3664, 3663, 3751, 3750, 0, 0, 795, 312, 311, 309, + 378, 299, 307, 301, 0, 308, 1984, 1985, 1982, 1980, + 1983, 3831, 2144, 2056, 2163, 0, 2498, 1373, 0, 2156, + 1875, 0, 2162, 3355, 3409, 3483, 1159, 0, 293, 0, + 0, 402, 3518, 0, 0, 0, 0, 0, 2474, 426, + 2065, 0, 1290, 1294, 2381, 3366, 3367, 3365, 396, 417, + 390, 0, 410, 402, 0, 250, 0, 455, 457, 446, + 465, 459, 0, 445, 1683, 1681, 0, 1698, 1727, 0, + 857, 857, 840, 861, 1713, 3118, 1707, 1710, 0, 859, + 1715, 857, 1708, 859, 0, 1706, 0, 1704, 1705, 0, + 0, 0, 1635, 1632, 0, 0, 0, 1689, 1689, 0, + 0, 0, 0, 1431, 0, 0, 0, 1618, 0, 1640, + 1638, 0, 0, 0, 0, 0, 1646, 0, 1562, 1560, + 1489, 0, 1487, 0, 1488, 0, 1490, 0, 0, 1628, + 0, 1457, 1475, 0, 0, 0, 1722, 0, 1992, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2489, 0, 0, 927, 933, 936, 937, 939, 931, 0, + 1600, 0, 0, 0, 1412, 1408, 0, 1416, 0, 0, + 0, 1430, 1429, 1897, 1896, 0, 1671, 0, 0, 1721, + 0, 0, 1721, 0, 0, 0, 2486, 1375, 1605, 1374, + 514, 0, 532, 506, 1976, 509, 0, 523, 0, 535, + 0, 0, 0, 323, 0, 1268, 0, 454, 0, 3395, + 3487, 0, 0, 1368, 1376, 1371, 0, 0, 0, 3314, + 3313, 3325, 0, 0, 0, 0, 3298, 3296, 3295, 3271, + 0, 0, 3344, 3338, 3335, 3336, 0, 0, 3277, 0, + 0, 3275, 3279, 3281, 2216, 2215, 0, 2275, 1932, 2189, + 2208, 2210, 2276, 2129, 2133, 0, 1867, 2117, 0, 0, + 2111, 2115, 0, 2470, 0, 0, 2082, 1794, 273, 0, + 3692, 3833, 0, 1834, 84, 0, 2319, 2310, 0, 2305, + 2308, 0, 0, 3387, 3388, 3380, 3383, 3381, 3382, 3386, + 3389, 3390, 3377, 3384, 1932, 0, 0, 1202, 1208, 2352, + 1186, 136, 0, 1170, 0, 0, 3651, 2172, 3601, 3614, + 1001, 1003, 1002, 987, 988, 0, 0, 0, 1047, 0, + 0, 0, 614, 614, 170, 3779, 0, 0, 3715, 3718, + 3716, 3719, 3721, 3620, 0, 200, 3569, 3620, 0, 3620, + 158, 1767, 1351, 1343, 1345, 1340, 1340, 0, 1731, 0, + 0, 0, 1731, 0, 0, 495, 0, 1812, 1829, 896, + 2395, 1886, 1887, 0, 1882, 1930, 1931, 1884, 1880, 0, + 1889, 1891, 1312, 1948, 1940, 1935, 1361, 0, 1928, 0, + 0, 0, 2016, 2018, 665, 664, 238, 237, 242, 243, + 1976, 1976, 2105, 2104, 1976, 1976, 177, 174, 2103, 2102, + 1976, 1976, 172, 2071, 195, 194, 196, 197, 199, 198, + 193, 1035, 0, 3492, 0, 3499, 3494, 3497, 3477, 3476, + 3475, 3472, 0, 1976, 1976, 1976, 0, 1976, 3513, 3515, + 0, 0, 1036, 904, 3527, 0, 0, 205, 3571, 0, + 3573, 0, 1222, 0, 1221, 249, 3668, 1976, 1976, 103, + 1976, 95, 96, 91, 123, 124, 93, 94, 99, 98, + 100, 101, 104, 105, 102, 97, 92, 127, 129, 128, + 106, 2012, 2011, 2010, 130, 125, 126, 90, 291, 0, + 268, 266, 267, 3666, 3665, 3752, 0, 0, 3753, 3798, + 0, 819, 1015, 818, 281, 278, 839, 1976, 289, 310, + 0, 1875, 2501, 0, 0, 1961, 2157, 2149, 2151, 2039, + 2037, 3658, 0, 452, 406, 450, 0, 3402, 3407, 3480, + 3479, 3502, 3502, 400, 3668, 400, 425, 0, 1285, 1290, + 1294, 0, 1286, 2392, 404, 408, 3628, 3627, 462, 3709, + 3821, 0, 0, 1728, 1699, 909, 1712, 1714, 0, 1711, + 909, 856, 860, 1717, 1703, 1709, 1716, 909, 1506, 1537, + 1510, 1509, 0, 0, 0, 1569, 0, 1687, 1693, 0, + 0, 0, 1544, 0, 1670, 1668, 1546, 0, 0, 1620, + 2486, 1595, 1666, 1572, 1597, 1549, 0, 0, 0, 1486, + 1484, 1485, 0, 1563, 1586, 0, 1473, 1587, 0, 1570, + 1594, 1502, 1994, 1993, 1991, 1517, 1976, 0, 1574, 1535, + 0, 0, 1599, 2490, 2491, 0, 0, 0, 938, 924, + 925, 926, 0, 928, 930, 932, 0, 1976, 1433, 1432, + 1404, 0, 1413, 1410, 0, 1418, 1899, 1898, 0, 0, + 1611, 1613, 1612, 1615, 1614, 1609, 1719, 1376, 1625, 0, + 515, 516, 518, 520, 597, 0, 510, 539, 499, 0, + 514, 502, 1266, 1269, 0, 3393, 3392, 0, 1372, 1380, + 1379, 2480, 2484, 0, 0, 0, 3311, 3332, 0, 0, + 0, 0, 3342, 3341, 3343, 3309, 3304, 3302, 3301, 1998, + 1999, 1997, 1995, 1996, 2207, 1932, 2203, 0, 1875, 0, + 1832, 1375, 2107, 0, 3657, 0, 2088, 0, 2085, 2092, + 488, 2156, 0, 2083, 2054, 3696, 3693, 3694, 0, 1837, + 0, 1838, 1835, 1836, 1976, 0, 0, 371, 363, 358, + 366, 360, 362, 361, 367, 368, 369, 370, 364, 359, + 365, 357, 356, 0, 3375, 1213, 1214, 0, 1193, 1191, + 3652, 3653, 143, 0, 3405, 164, 0, 149, 152, 715, + 0, 0, 0, 0, 2100, 2100, 2100, 2100, 2100, 2100, + 2100, 2100, 2100, 2100, 0, 2100, 2100, 2100, 2100, 2100, + 2100, 2100, 2100, 2100, 2100, 0, 0, 2100, 2100, 139, + 483, 491, 615, 618, 654, 656, 643, 644, 480, 0, + 141, 0, 3708, 3707, 3620, 3714, 3717, 269, 3702, 3698, + 3701, 231, 0, 0, 0, 257, 3700, 3699, 0, 680, + 681, 679, 678, 0, 0, 3569, 0, 1354, 1353, 1779, + 0, 1783, 1788, 1784, 0, 1775, 0, 1796, 1841, 1833, + 0, 0, 2403, 1929, 0, 0, 1929, 0, 0, 1375, + 2014, 1374, 176, 181, 180, 173, 186, 179, 1040, 192, + 3493, 3491, 3490, 0, 3498, 0, 3473, 3509, 3507, 3508, + 3511, 0, 0, 3510, 3512, 1041, 1042, 1048, 1043, 1147, + 1147, 0, 1147, 0, 0, 1147, 2100, 0, 0, 495, + 1165, 2100, 0, 0, 0, 0, 0, 1130, 0, 1147, + 0, 0, 0, 0, 0, 1068, 1129, 616, 1018, 1067, + 1069, 1081, 491, 0, 1102, 1132, 1133, 1131, 3528, 0, + 0, 0, 1053, 0, 208, 206, 216, 3570, 0, 2071, + 0, 3573, 1224, 1225, 0, 440, 0, 116, 118, 0, + 120, 122, 0, 112, 114, 259, 3667, 3754, 0, 0, + 843, 300, 2163, 2154, 0, 1962, 0, 1374, 2071, 294, + 0, 0, 3516, 3516, 427, 429, 428, 2122, 1287, 1295, + 2394, 2393, 0, 250, 445, 0, 1684, 1700, 1718, 1701, + 1702, 1636, 0, 0, 0, 0, 1693, 0, 0, 1694, + 1652, 0, 0, 0, 0, 0, 1505, 0, 1616, 0, + 1561, 1559, 0, 840, 1464, 1466, 1462, 1465, 0, 859, + 1468, 0, 821, 859, 909, 1472, 1458, 1459, 1460, 1461, + 0, 0, 0, 0, 0, 2492, 922, 1602, 0, 935, + 929, 927, 934, 0, 1409, 0, 0, 1901, 0, 1673, + 0, 1626, 519, 0, 598, 594, 0, 0, 540, 0, + 541, 537, 513, 0, 3394, 1378, 1377, 0, 3318, 3316, + 3315, 3347, 3346, 3299, 3297, 0, 0, 134, 2132, 1923, + 2134, 2135, 2126, 2116, 2114, 2466, 0, 2089, 2091, 2477, + 2476, 2488, 0, 0, 2071, 2084, 1976, 3695, 1087, 0, + 1088, 1099, 1101, 1293, 0, 2344, 0, 2342, 2311, 2345, + 0, 0, 0, 0, 146, 0, 0, 0, 1012, 2625, + 0, 0, 684, 686, 687, 688, 689, 0, 716, 691, + 610, 965, 965, 718, 2493, 0, 663, 2100, 484, 1976, + 1976, 1976, 1976, 641, 1976, 1976, 1976, 0, 0, 2100, + 1976, 0, 0, 1976, 1976, 1976, 1976, 0, 0, 1976, + 649, 650, 648, 1976, 1976, 2392, 490, 492, 904, 619, + 614, 0, 0, 3670, 3670, 3744, 0, 3745, 3746, 262, + 3763, 475, 476, 0, 0, 3573, 0, 0, 3589, 0, + 3589, 0, 0, 1734, 1733, 0, 0, 0, 0, 0, + 0, 1822, 0, 1821, 0, 1827, 1831, 0, 0, 0, + 0, 2396, 2398, 0, 2031, 1883, 1892, 1890, 1927, 1939, + 0, 2019, 2017, 0, 3500, 3496, 1979, 1978, 0, 1045, + 0, 1044, 1049, 1012, 610, 1148, 608, 0, 1106, 1110, + 1107, 608, 2058, 2058, 1259, 2058, 0, 0, 0, 0, + 2058, 0, 2060, 2058, 0, 0, 2058, 2058, 0, 1259, + 0, 493, 1168, 1166, 2058, 1167, 2058, 0, 0, 1259, + 1119, 1063, 1120, 0, 1064, 2058, 1259, 1086, 1259, 1259, + 0, 617, 904, 1065, 1066, 715, 1162, 215, 204, 0, + 0, 1055, 1057, 0, 0, 1058, 3572, 1031, 3575, 2071, + 1230, 0, 108, 1976, 109, 1976, 107, 1976, 3758, 0, + 2071, 0, 1963, 2158, 2152, 3519, 0, 3401, 3400, 0, + 2156, 0, 3629, 463, 445, 1567, 1568, 1690, 1929, 1688, + 0, 1695, 1696, 1650, 1592, 0, 1545, 0, 1617, 0, + 1598, 1564, 1467, 1463, 1470, 822, 1469, 1471, 1589, 1518, + 1976, 1575, 1580, 1581, 0, 1601, 1976, 1411, 0, 1904, + 1903, 0, 0, 1929, 1610, 517, 595, 512, 0, 536, + 539, 0, 500, 2481, 0, 0, 3305, 3303, 2209, 1960, + 2467, 2465, 2087, 0, 0, 0, 2086, 2096, 0, 2069, + 0, 1289, 0, 1839, 2340, 1976, 0, 2309, 0, 1192, + 1194, 0, 0, 0, 0, 0, 717, 1013, 0, 0, + 690, 2496, 683, 715, 0, 0, 0, 965, 707, 610, + 0, 1012, 966, 610, 610, 0, 0, 0, 0, 2009, + 2008, 638, 631, 630, 633, 632, 635, 634, 0, 627, + 624, 636, 626, 651, 0, 639, 621, 676, 677, 675, + 645, 652, 622, 623, 629, 628, 625, 668, 673, 671, + 670, 669, 674, 672, 640, 655, 637, 653, 482, 599, + 620, 491, 2002, 2003, 2000, 2001, 660, 659, 2004, 657, + 658, 3670, 3670, 0, 372, 3646, 3644, 3647, 3645, 3780, + 3724, 3725, 3729, 3727, 3738, 3731, 0, 3731, 0, 3661, + 3747, 0, 263, 265, 240, 232, 0, 0, 479, 477, + 478, 0, 0, 157, 271, 258, 231, 0, 3776, 231, + 3573, 1735, 0, 0, 1780, 0, 1785, 0, 1777, 1817, + 1817, 1828, 0, 0, 0, 0, 2397, 0, 0, 2404, + 2406, 1941, 0, 1043, 0, 0, 0, 1259, 0, 0, + 1134, 1104, 0, 0, 0, 0, 1075, 0, 1084, 0, + 0, 2058, 0, 1136, 0, 1135, 0, 0, 0, 1145, + 1146, 0, 1919, 1921, 1929, 0, 0, 0, 1124, 1143, + 1144, 0, 0, 0, 0, 1094, 0, 1080, 1147, 0, + 1147, 1103, 0, 682, 0, 1164, 1105, 202, 207, 217, + 218, 1033, 0, 3574, 1029, 0, 1231, 1227, 1228, 1223, + 117, 121, 113, 0, 0, 2155, 0, 0, 3523, 3517, + 3521, 2123, 2071, 0, 3824, 0, 1692, 1648, 0, 1619, + 1621, 0, 923, 0, 1900, 1894, 0, 0, 0, 0, + 0, 0, 1913, 1905, 0, 1677, 0, 597, 0, 0, + 525, 538, 544, 543, 3319, 3317, 2130, 0, 2090, 2478, + 2489, 489, 0, 0, 3668, 1100, 2343, 0, 3385, 0, + 1929, 1010, 0, 0, 0, 0, 0, 0, 685, 0, + 610, 961, 962, 1012, 0, 692, 984, 2493, 1012, 1012, + 722, 0, 710, 720, 765, 2495, 485, 647, 2332, 646, + 600, 0, 2392, 0, 0, 3743, 0, 3726, 3728, 3730, + 0, 3749, 0, 3748, 3620, 270, 0, 241, 3710, 1374, + 213, 3760, 3620, 3590, 3620, 159, 0, 1867, 0, 0, + 0, 1825, 1823, 2401, 2402, 0, 2399, 0, 0, 2405, + 0, 1050, 1046, 1051, 0, 1089, 0, 1108, 0, 0, + 1074, 0, 1245, 0, 0, 1127, 1115, 0, 1070, 0, + 1117, 1118, 1159, 1072, 0, 1922, 494, 0, 0, 1079, + 0, 1162, 1071, 1096, 1077, 1109, 1163, 209, 1059, 378, + 0, 0, 0, 1226, 0, 1233, 3759, 3756, 0, 0, + 3522, 3520, 0, 2066, 1794, 1929, 1543, 1519, 1603, 0, + 1910, 0, 0, 1908, 1907, 0, 1902, 1909, 596, 593, + 0, 0, 533, 551, 547, 0, 549, 550, 572, 2071, + 0, 0, 2095, 2097, 3697, 2346, 3355, 0, 1007, 0, + 1008, 0, 3355, 3355, 0, 0, 0, 1012, 984, 2493, + 943, 0, 693, 0, 697, 699, 724, 0, 719, 711, + 732, 0, 0, 661, 481, 3670, 0, 3670, 0, 3709, + 3722, 3781, 3734, 3732, 3704, 3703, 3778, 264, 3620, 3620, + 3584, 205, 214, 0, 3775, 3773, 2862, 0, 1743, 1745, + 1768, 1782, 1787, 0, 1818, 0, 0, 0, 2400, 2408, + 2407, 3501, 0, 1091, 609, 1004, 0, 1122, 0, 0, + 1162, 1076, 0, 0, 0, 1116, 1137, 1114, 1259, 1920, + 0, 0, 0, 1113, 1095, 1097, 1205, 0, 211, 187, + 3576, 0, 0, 1232, 1237, 0, 1234, 1236, 0, 1346, + 0, 2382, 1691, 1911, 0, 1912, 1915, 0, 0, 1916, + 0, 529, 531, 521, 0, 526, 0, 545, 0, 2100, + 2100, 0, 2100, 2100, 2100, 2100, 565, 573, 575, 576, + 577, 0, 2131, 2468, 2479, 972, 1929, 0, 0, 0, + 0, 974, 976, 0, 0, 712, 705, 701, 0, 0, + 947, 985, 0, 695, 0, 0, 887, 941, 750, 0, + 753, 0, 885, 723, 725, 883, 884, 727, 0, 0, + 0, 766, 0, 0, 865, 0, 868, 0, 0, 721, + 0, 733, 864, 871, 2494, 642, 487, 662, 3741, 3737, + 3739, 3736, 0, 3661, 3620, 3620, 3764, 3711, 0, 216, + 3710, 0, 1742, 0, 0, 1820, 1819, 1834, 0, 0, + 0, 539, 1090, 1005, 1123, 0, 1112, 495, 539, 1128, + 1073, 1125, 1126, 495, 0, 1078, 210, 0, 203, 188, + 219, 3577, 3578, 1229, 0, 3757, 2124, 895, 1906, 1914, + 1918, 1917, 527, 0, 534, 558, 548, 554, 0, 2100, + 0, 0, 2100, 0, 0, 0, 0, 0, 542, 574, + 2100, 0, 0, 2100, 0, 993, 995, 1138, 973, 997, + 996, 978, 994, 1006, 1011, 1010, 3355, 190, 0, 1138, + 975, 999, 982, 1138, 977, 998, 980, 0, 0, 0, + 0, 703, 0, 946, 0, 951, 0, 0, 0, 0, + 751, 752, 888, 726, 886, 882, 876, 870, 2505, 2506, + 0, 0, 0, 762, 763, 866, 759, 760, 761, 0, + 741, 0, 0, 872, 863, 734, 3710, 3710, 3723, 3620, + 231, 0, 0, 0, 0, 187, 1747, 1744, 0, 1752, + 1754, 1753, 1755, 1746, 0, 0, 0, 1111, 1093, 0, + 1121, 1083, 1085, 1082, 0, 212, 1235, 0, 2383, 533, + 530, 558, 0, 556, 0, 552, 546, 553, 0, 590, + 584, 0, 586, 587, 585, 582, 569, 0, 567, 0, + 989, 992, 1976, 990, 144, 1140, 1139, 979, 0, 972, + 0, 150, 983, 153, 981, 708, 0, 0, 0, 0, + 944, 0, 948, 949, 950, 0, 942, 0, 0, 0, + 0, 877, 881, 2440, 2439, 0, 1381, 869, 0, 736, + 880, 735, 3620, 3620, 3782, 3735, 3589, 3709, 1374, 218, + 3761, 0, 1749, 0, 0, 1826, 1824, 1092, 539, 2125, + 2137, 0, 2409, 528, 555, 0, 563, 559, 561, 564, + 589, 588, 0, 566, 0, 583, 666, 991, 1142, 1141, + 1009, 1138, 1000, 709, 0, 1008, 0, 945, 0, 0, + 972, 0, 974, 976, 758, 0, 867, 728, 728, 742, + 3706, 3705, 3742, 3740, 231, 3712, 3585, 201, 1748, 0, + 1756, 0, 0, 0, 0, 2395, 557, 0, 0, 578, + 571, 568, 147, 0, 0, 1008, 957, 956, 0, 0, + 953, 952, 694, 972, 698, 700, 1382, 0, 739, 729, + 731, 738, 744, 745, 743, 746, 3733, 0, 0, 1751, + 0, 1762, 1761, 1750, 0, 1757, 1759, 1098, 2136, 2138, + 0, 2403, 562, 560, 570, 579, 581, 706, 972, 0, + 960, 958, 959, 0, 0, 696, 1383, 730, 737, 747, + 749, 3713, 0, 1739, 1740, 1738, 1737, 1736, 1763, 0, + 0, 1758, 0, 1760, 0, 2411, 580, 702, 972, 0, + 0, 748, 3586, 1765, 1764, 0, 0, 2410, 0, 2415, + 704, 955, 954, 3581, 0, 0, 2422, 3579, 3580, 0, + 3587, 2413, 2414, 2412, 0, 2417, 0, 2419, 2420, 0, + 2071, 3582, 378, 2421, 2416, 0, 2423, 2425, 0, 2384, + 187, 2418, 0, 1374, 3588, 2424, 0, 1375, 2426 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -5620, -5620, -5620, -5620, 1734, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, 2323, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 1462, -5620, 122, -5620, 128, -5620, 125, -4030, -599, + -5620, -2250, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 1619, -3408, -5553, -5620, -5620, -397, 1014, -5620, + -5620, -74, -5620, -432, -5620, -5620, -5620, -4672, -589, -818, + -5620, 42, 4620, 3260, -585, 3928, -4607, 257, -5620, -3349, + -5620, -5620, -5620, -5620, -2390, -5620, -5620, -5620, -5620, 258, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -613, -5620, + 1460, -5620, 955, -5620, -4604, -5620, -737, -5620, -5620, -5620, + 1478, -5620, -5620, 357, 947, 2847, 2843, -5620, -5620, -5620, + -5620, 1823, -5620, 2011, -5620, -2116, 3285, -5620, -5620, -5620, + -5620, -5620, 2333, -2878, -5620, -5620, -5620, 1166, -5620, -850, + -5620, 40, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -504, -5620, -2481, + 1397, -5620, 1420, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -709, -5620, -5620, -5620, 44, -5620, -5620, -5620, + -5620, -5620, 2945, -5620, 4574, -5620, -5620, -3841, -5620, 2752, + -5620, 2755, 2758, -3243, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 47, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -236, -234, 0, 550, 1031, -5620, -4149, -5620, + -5620, -100, -5620, -5620, -5620, -5620, -5620, 810, 110, 808, + -5620, 440, 2530, -3237, -5620, -5620, -5620, -5620, -5620, -5620, + -593, -145, -684, -5620, -4536, -5620, -5036, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -3957, -5620, -5620, -5620, -819, + -5620, -5620, -775, -5620, -5620, -5620, -5620, -447, -5620, -5620, + -3892, -5620, -5620, -5620, -135, -5620, 2280, 4009, -2256, 277, + -679, -5620, -4077, 600, -4290, -4162, -5620, -3974, -5620, -333, + -1367, -1329, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 240, + 113, 604, -4395, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -4391, -4358, -26, -5620, -5127, -5620, 399, -5620, -4931, -5620, + -5620, -5620, -5620, -5620, -5620, -778, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5619, -5620, -5620, -611, -623, -5620, -513, + -3206, -5620, -3230, -4595, -501, -1396, -500, -499, -498, -5620, + -1563, 934, 3875, -5620, -5620, -5620, -5620, -1515, -1717, -5620, + 1445, -3832, -1393, 984, -1424, -3834, 1461, -612, -5401, -3221, + -1385, -5620, -1349, -5620, -5620, -3645, -3817, -5620, -680, -2297, + -3637, -522, -5620, -5620, -2097, -3720, -5620, 2996, -2410, -2421, + 2187, 1391, -5620, -5620, 922, -5620, -1752, 924, -5620, -5620, + -5620, 930, -5620, -772, -5620, -5620, -5620, -5620, -3812, -5620, + -2905, -3719, -5620, 5021, 5028, -3768, -732, -727, -5620, -5620, + -5620, -261, 1773, -5620, -3509, -514, -519, -518, -3668, -151, + -4993, -3696, -3705, -3394, 3021, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 55, + 69, 1273, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 681, -2629, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -4166, -3059, -5620, -5620, 331, -5437, -4259, -4264, -4105, 3679, + -5620, -5620, -5620, -5620, 4087, -3843, -4269, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 3250, 1432, -5620, -5620, 1825, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -300, 1831, + -5620, -5620, -5620, -5620, -5620, 2359, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -441, -5620, -5620, -5620, -5620, -5620, + -128, 3092, -5620, -5620, -5620, -5620, -28, -5620, -5620, -5620, + -5620, 1988, -5620, -5620, -5620, -5620, 2539, -5620, -5620, -5620, + -5620, -5620, -5620, 1576, -5620, 2210, -5620, -2883, -5620, -5620, + 1096, -615, -5620, -5620, -421, -5620, -5620, -5620, -5620, -5620, + 60, -5620, -5620, -5620, 5050, -1912, 16, -460, -5620, -5620, + 15, -5620, -5620, 4151, -485, 2039, -719, 4815, -5620, -5620, + -5620, -5620, -2954, 1912, -5620, 4209, -5620, -5620, 4392, 1396, + 4172, 1782, 686, 2004, -2034, -628, -3534, 999, -5620, 1641, + 896, 11402, -5620, -1911, -1984, -5620, -5620, -78, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 2105, 2109, -5620, -5620, + 3555, -5620, 2042, -3550, -5620, -5620, -826, -5620, -2940, -5620, + -5620, -5620, 2044, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, 1469, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3510, -1974, -5620, + -5620, 3652, -5620, 1564, -5620, 678, -5620, -5620, -1559, -5620, + -3244, -5620, -5620, -1966, -682, -5620, 3639, -5620, 3672, -1282, + -4496, -5620, -2084, -574, -5620, -345, -5620, -5620, -5620, -5620, + -5620, -3460, -677, -675, -5620, -5620, -5620, 3270, -5620, 4265, + -5620, -5620, -5620, -5620, -5620, -5620, 3274, -5620, -2516, -5620, + -2936, 4266, 4270, 4272, -5620, 4276, -5620, -5620, -2135, 161, + -5620, 488, -5620, -5620, -5620, -5620, -5620, 986, -5620, -340, + 594, -338, -4501, -1915, 859, -5620, -5620, -2251, 3291, 3698, + -1375, -5620, 2493, -5620, 3275, 1530, -5620, 1861, -5620, 865, + 870, -5620, -5620, 1539, -5620, -5620, -5620, -5620, 365, -209, + -5620, -5620, -5620, -38, 649, -2502, -5620, 373, -3678, 4267, + -42, -5620, 1856, -2331, -3632, -1223, 735, -1331, 1867, 355, + 4899, -224, -5620, -5620, 4239, -5620, -2240, -5620, -2205, -1947, + -1549, -3475, -3094, -4904, -5620, -2429, 1121, -5620, -5620, -5620, + -5620, 879, -5620, -5620, -5620, 2537, -5620, 5182, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -693, -1210, + -5620, -5620, 2365, -1663, -552, 5201, -418, -5620, -5620, -417, + -5620, -5620, 4996, -2416, -5620, -5620, 4406, 3072, 2335, -5620, + 1214, -5620, -5620, -5620, -5620, 1033, -5620, -5620, 95, -1053, + 709, 1858, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 650, + -5620, 1050, -2242, -5620, -5620, -5620, -5620, -416, -5620, -5620, + -5620, -5620, 1056, -5620, -560, -5620, -409, -5620, -5620, -5620, + 4830, -5620, -5620, -5620, -5620, -5620, -5620, -4352, -5620, -5620, + 3139, -1776, 4832, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + 2703, -5620, -5620, -5620, -5620, -5620, -5620, 3528, 5025, 5031, + -2003, -5620, -1073, 2710, 2050, -1125, -5620, -5620, -5620, 4283, + 5036, -5620, -5620, -252, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 2660, 81, -5620, -5620, -5620, -5620, + -5620, 388, -5620, -5620, -5620, -5620, 3428, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 3845, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, 1243, -538, -5620, 577, -582, -5620, 251, -5620, -5620, + -5620, -5620, -5620, -654, -5620, -5620, -660, -5620, -1429, 4742, + -1382, -5620, -2091, -3804, -5620, 1, -5620, -5620, -5620, 2714, + -5620, -5620, -5620, -5620, 2379, -2964, -5620, 415, -5620, -5620, + -3054, -965, -2030, -4307, 9922, -5620, -5620, 50, 4942, 3289, + -5620, -5620, 165, -488, -1274, -5620, -5620, 2331, -3, 2430, + -565, -755, -779, -1110, -5620, 4500, -5620, -5620, -5620, 21, + -637, -627, 213, 89, 59, 29, 6826, 9152, 23, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, 2097, + 2098, -5620, 5058, -5620, 3083, 2807, -5620, -5620, -5620, 2100, + -5620, -5620, -5620, 5065, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, 2106, 2116, 2118, -5620, -5620, 1581, + -2754, -5620, -5620, -2295, 150, -5620, 3115, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, 3432, -583, 4546, -581, + 3644, 5074, 4579, -5620, 3900, -5620, 3901, -5620, 1388, -5620, + -1263, 2175, -1740, -3416, -5620, -5620, 2566, 951, -5620, -5620, + -2951, -3233, -5620, 2022, 849, -5620, -5620, 212, -5620, -5620, + -5620, 1389, 403, 5051, 4456, -5620, -5620, -5620, -5620, 5272, + 2211, -5620, 1010, 5297, 5298, 5299, -27, -5620, -3663, -5620, + -4504, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -4939, -5620, -5620, -5620, 2498, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -73, 4821, -5620, -5620, -5620, + -5620, 1308, -3034, -5620, -683, -5620, -5620, -5620, -5620, -5620, + 3127, -5620, 1778, -5620, -5620, -178, -2304, -5620, -2571, -5620, + -4848, 27, -626, 4833, -5620, -5620, -5620, -5620, -5620, 4808, + -5620, -5620, 1123, -5620, -4146, -4142, -173, -4138, -401, -4553, + -5620, -3789, -5620, -5620, -5620, 1513, -5620, -5620, 2043, -5620, + -5620, -5620, -5620, 366, 369, 379, -5620, 374, -5620, -4699, + -5620, -5620, -5620, -5620, 370, -5620, -5620, -4197, -5620, -5620, + -4280, -5620, 343, -5620, -5620, -5620, -5620, -5620, -5620, -5620, + -5620, -5620, -5620, -5620, -5620, -5620, -2616, -5620, -5620, -5620, + 4011, -5620, 4945, -5620, -960, 4834, -5620, -5620, -5620, -5620, + -5620, -5620, 48, -5620, -5620, -5620, -2513, -5620 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + 0, 472, 759, 2333, 473, 474, 475, 476, 477, 2299, + 478, 1309, 3053, 1311, 2264, 3056, 479, 728, 480, 2473, + 3250, 3251, 4902, 4903, 4896, 4897, 4899, 4900, 3252, 842, + 843, 3095, 3096, 481, 3113, 4282, 3763, 2335, 5063, 3107, + 5352, 2340, 5066, 2341, 5067, 3105, 4296, 4785, 2347, 2348, + 768, 4283, 3851, 3852, 6010, 1370, 3759, 3860, 3861, 3120, + 4773, 4882, 5727, 4886, 5868, 6008, 5821, 3879, 5245, 5728, + 5729, 661, 1381, 2606, 5814, 2438, 5671, 5454, 5455, 3199, + 482, 835, 2461, 3886, 1488, 2462, 2463, 5136, 5137, 3918, + 3919, 5451, 5452, 4443, 4768, 5129, 4776, 3038, 967, 1783, + 3296, 3297, 2537, 856, 857, 2545, 858, 3321, 3259, 3988, + 3989, 4472, 859, 3960, 3961, 3962, 3325, 1179, 3963, 483, + 484, 682, 690, 683, 1176, 2911, 1177, 485, 486, 726, + 2289, 2290, 2291, 2292, 3725, 3073, 3719, 3720, 4701, 860, + 861, 968, 662, 969, 970, 971, 972, 2661, 973, 3403, + 4010, 974, 3398, 4008, 975, 976, 977, 946, 838, 3353, + 3406, 4011, 3354, 3990, 3407, 2656, 978, 979, 980, 981, + 982, 1928, 947, 2626, 3999, 4486, 983, 641, 839, 1490, + 2467, 840, 2468, 3889, 841, 2465, 1493, 4017, 2594, 900, + 1847, 984, 1185, 4018, 985, 2664, 2666, 2663, 4016, 4934, + 2665, 986, 672, 700, 660, 1845, 688, 5133, 5461, 4749, + 5120, 4750, 5418, 4669, 5115, 5116, 5117, 5525, 3704, 490, + 675, 1161, 2118, 2903, 4162, 3580, 3582, 2904, 4161, 4609, + 4610, 4611, 3578, 3579, 5600, 3584, 4159, 5762, 6139, 5890, + 5891, 4151, 5895, 4618, 5009, 5010, 5011, 5321, 5602, 5768, + 6028, 5896, 6146, 6026, 6142, 6027, 6144, 6278, 6227, 6228, + 6038, 6157, 6158, 6232, 6279, 5906, 5907, 5908, 6324, 6325, + 5909, 4155, 4156, 5597, 5005, 5651, 3750, 3751, 2433, 5499, + 1320, 491, 4751, 4866, 4752, 4753, 5388, 6046, 5966, 4755, + 4756, 4757, 6235, 2193, 5414, 5400, 4783, 5542, 4758, 5071, + 5072, 5073, 5074, 5932, 6077, 5934, 5935, 6070, 6179, 6069, + 5075, 5076, 5360, 5798, 5368, 5205, 5077, 5078, 5079, 5375, + 5642, 5800, 5796, 5943, 5944, 6298, 6299, 5959, 6259, 5960, + 6305, 6338, 6339, 5945, 492, 674, 2067, 6093, 6094, 6095, + 1785, 5643, 1786, 1787, 1788, 2509, 1789, 1790, 1791, 1792, + 1793, 1794, 1795, 1796, 1797, 1798, 3312, 2496, 2497, 3272, + 3273, 2487, 2488, 4512, 2489, 4513, 2555, 5961, 5962, 3265, + 2493, 6192, 2494, 3286, 6105, 5946, 5963, 5948, 2513, 2143, + 2144, 3798, 2158, 2159, 3629, 3630, 2436, 2514, 3280, 2515, + 3315, 4577, 5304, 4583, 4584, 4585, 4113, 4114, 4115, 4116, + 4117, 3538, 5949, 5635, 5930, 6072, 6075, 6186, 6290, 5369, + 5080, 5373, 1278, 5081, 5082, 6047, 6059, 6063, 6048, 6064, + 6060, 5792, 3754, 6049, 6050, 6051, 6066, 6062, 4273, 6052, + 5619, 5919, 5620, 5356, 3288, 493, 630, 4393, 1457, 3185, + 1459, 1469, 3883, 3211, 3210, 1472, 1471, 3203, 4363, 4837, + 5182, 4392, 3880, 4397, 5551, 804, 4868, 5858, 5702, 5866, + 5704, 4869, 5049, 4870, 5843, 5992, 4871, 5723, 5864, 6004, + 5050, 5051, 4872, 4873, 4874, 6164, 6165, 6166, 5191, 2237, + 818, 819, 1477, 1478, 1479, 3348, 5546, 5217, 494, 3745, + 3089, 495, 1337, 1338, 1339, 2311, 2312, 3092, 3093, 4263, + 4709, 496, 1304, 3049, 2301, 3081, 497, 1323, 3736, 3737, + 3738, 4257, 498, 1485, 2457, 2458, 3215, 4404, 4894, 5250, + 5559, 5735, 5555, 5875, 5876, 499, 846, 1496, 500, 643, + 2482, 2483, 2484, 3254, 501, 1939, 638, 502, 2127, 2124, + 2917, 2918, 503, 1303, 2251, 2252, 2253, 2254, 3700, 504, + 2634, 3371, 3372, 3373, 3374, 3044, 4232, 3045, 3046, 3709, + 4492, 505, 782, 1449, 506, 781, 1448, 507, 508, 699, + 754, 692, 2134, 510, 511, 4670, 2707, 513, 788, 786, + 1121, 515, 1441, 1437, 516, 2708, 1122, 778, 779, 1389, + 1205, 3783, 3784, 2573, 2574, 3153, 3140, 1206, 1207, 1418, + 2410, 3170, 2929, 2930, 2233, 2931, 4174, 4628, 6256, 1968, + 1857, 1307, 1124, 1125, 1126, 2078, 2079, 2094, 1127, 2088, + 2854, 4556, 4976, 4977, 4978, 4979, 2793, 2794, 2898, 1128, + 2783, 2784, 2785, 1129, 1130, 1131, 1132, 1133, 1134, 1135, + 2776, 2777, 2778, 1136, 1137, 1138, 2893, 4538, 4539, 4958, + 3573, 3574, 3575, 1139, 3435, 4522, 3446, 3447, 2736, 1140, + 1141, 1142, 1143, 1144, 4137, 1145, 4599, 4329, 1146, 1940, + 2671, 2734, 4946, 4527, 5277, 4948, 4949, 5281, 2676, 3423, + 4046, 4047, 4048, 2797, 2798, 1988, 1989, 1957, 1958, 1390, + 5145, 6348, 1391, 5473, 5827, 5828, 5984, 6211, 6123, 6124, + 6313, 6314, 6315, 6316, 1392, 3126, 4786, 1393, 1394, 1395, + 4313, 4314, 5146, 4790, 5148, 4794, 2371, 2372, 2375, 2376, + 1396, 1397, 1398, 1399, 2359, 1400, 1401, 1402, 3145, 5681, + 5154, 5155, 5837, 5836, 5156, 4799, 4800, 4317, 4318, 4680, + 4681, 4682, 3794, 2730, 2731, 2805, 2639, 2640, 2641, 2677, + 1410, 2386, 3161, 3804, 2388, 3802, 4324, 3806, 4330, 4331, + 2885, 3563, 4133, 3565, 4997, 5311, 5312, 5592, 5750, 5751, + 5756, 4877, 5522, 5523, 3336, 1419, 3178, 3821, 4327, 2195, + 2196, 1421, 2392, 3165, 3810, 2197, 2399, 2400, 3815, 3979, + 1422, 1423, 1435, 1440, 1426, 1424, 3326, 4833, 3327, 4118, + 4101, 5055, 5427, 2700, 2701, 5381, 4434, 1427, 3181, 4341, + 4342, 4343, 1406, 1407, 2381, 2382, 2383, 1428, 1408, 3154, + 4320, 517, 721, 518, 2590, 887, 1842, 2589, 3716, 1498, + 4226, 2568, 2569, 1832, 812, 659, 519, 663, 4487, 520, + 703, 4225, 948, 3200, 1885, 2245, 1886, 3037, 3694, 3695, + 4671, 5043, 4672, 5036, 5037, 4673, 1291, 5336, 5337, 1455, + 4359, 4360, 4354, 3031, 3688, 1292, 2238, 4219, 3028, 4220, + 3029, 3058, 4221, 5270, 5742, 6137, 3025, 521, 697, 4658, + 5769, 4213, 4214, 6219, 6220, 1289, 522, 646, 2567, 883, + 1821, 1824, 1825, 2577, 4918, 3332, 5260, 4467, 4917, 1826, + 1827, 3334, 884, 885, 523, 742, 3746, 1343, 2217, 2218, + 2219, 3012, 524, 694, 1279, 4208, 4655, 2998, 678, 5911, + 2200, 1282, 2201, 2994, 3670, 2181, 525, 1446, 1444, 833, + 526, 527, 794, 639, 2415, 528, 529, 1312, 2282, 3070, + 4239, 4240, 4685, 2283, 2284, 3717, 530, 707, 1297, 3713, + 5056, 5057, 5347, 531, 733, 1327, 1328, 2305, 2303, 3741, + 3084, 532, 2905, 533, 664, 951, 1889, 1890, 2632, 534, + 736, 1332, 535, 536, 953, 4493, 6017, 6222, 668, 2636, + 1894, 5419, 4802, 5161, 5162, 5164, 5489, 5490, 6275, 6369, + 6383, 6376, 6386, 6387, 6390, 6396, 6397, 1147, 1350, 1351, + 1148, 6098, 1149, 1150, 1151, 2709, 1295, 702, 2241, 2242, + 5331, 5607, 3035, 3691, 2623, 2624, 2243, 5038, 5039, 3602, + 3803, 1152, 4215, 5357, 1499, 2570, 1315, 609, 1153, 610, + 1154, 1155, 814, 1352, 2378, 3381, 1228, 3615, 1156, 4019, + 1465, 2125, 2446, 2447, 3382, 612, 3616, 1229, 1800, 613, + 614, 615, 616, 617, 618, 619, 544, 545, 620, 1807, + 547, 693, 1237, 2155, 2163, 2948, 2153, 2960, 3650, 2962, + 2963, 3655, 2964, 1285, 2935, 2154, 3639, 4641, 4640, 2961, + 4200, 5026, 5025, 2965, 2956, 4196, 4182, 3625, 4635, 5325, + 5324, 2943, 2942, 2941, 2951, 2952, 2953, 2954, 4193, 3635, + 2426, 548, 954, 2645, 671, 1896, 1897, 3395, 549, 696, + 550, 727, 1317, 3077, 3729, 3730, 4252, 4703, 4253, 551, + 1190, 1191, 552, 937, 3757, 3357, 2584, 1468, 939, 2585, + 2607, 941, 1849, 942, 943, 944, 945, 4382, 3872, 3873, + 3362, 2587, 2448, 2925, 3865, 4823, 2449, 4376, 4377, 4824, + 3208, 5568, 4389, 3876, 5267, 4477, 5569, 5570, 553, 708, + 554, 5456, 720, 1306, 2261, 555, 556, 557, 558, 787, + 1431, 1208, 631, 632, 633, 634, 822, 823, 3882, 4399, + 4889, 4890, 5553, 6379, 6380, 3119, 4294, 5978, 6308, 6373, + 6392, 5466, 5467, 559, 1357, 1353, 753, 2331, 2325, 2327, + 3103, 3749, 560, 561, 562, 4769, 563, 1925, 2660, 4015, + 4933, 3366, 2469, 1808, 621, 1908, 870, 4267, 902, 3298, + 1294, 3032, 2592, 987, 988, 5664, 3303, 4445, 2470, 2471, + 5445, 871, 872, 565, 566, 1450, 3183, 3184, 989, 990, + 4231, 4676, 4677, 5046, 4777, 4778, 4771, 5816, 6262, 4764, + 2248, 5818, 5819, 6112, 6307, 4290, 4291, 4292, 3765, 3766, + 5811, 5439, 5440, 5441, 5660, 5448, 5975, 5446, 5974, 5442, + 5808, 6107, 5806, 6106, 5443, 5126, 5127, 5444, 873, 3921, + 3922, 3923, 5672, 5823, 3768, 4293, 5457, 567, 568, 3117, + 4299, 4297, 4286, 4761, 5656, 5973, 874, 875, 1816, 876, + 877, 2562, 878, 2485, 991, 992, 569, 993, 2668, 2667, + 4022, 713, 994, 1301, 645, 1815, 2249, 3697 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int16 yytable[] = +{ + 611, 537, 673, 821, 711, 640, 1784, 1923, 864, 712, + 1240, 755, 2880, 1226, 1277, 514, 512, 2416, 865, 2760, + 2699, 539, 3059, 546, 827, 3100, 3202, 564, 2830, 543, + 1467, 2913, 2401, 684, 903, 2401, 2389, 684, 806, 1308, + 487, 810, 684, 3076, 488, 698, 3328, 489, 570, 3329, + 538, 3415, 2579, 2223, 1466, 3367, 1231, 1388, 2510, 542, + 509, 2706, 2500, 816, 3935, 2771, 1232, 2740, 4175, 3099, + 3692, 3217, 2126, 3337, 3180, 1184, 2814, 817, 938, 1990, + 940, 2554, 1364, 691, 1365, 4274, 2405, 1367, 1368, 541, + 2434, 3281, 3942, 2490, 2833, 886, 936, 889, 890, 891, + 892, 893, 894, 895, 2354, 896, 897, 4430, 938, 4344, + 1192, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2873, 2875, + 2876, 2877, 2878, 2879, 3822, 2492, 936, 3281, 2435, 4876, + 2191, 2379, 2519, 2320, 4875, 1183, 2601, 837, 3313, 1334, + 1818, 3708, 1341, 4470, 4338, 2982, 2983, 4770, 2912, 1302, + 724, 4217, 2224, 3024, 1497, 3416, 2498, 4784, 3758, 4905, + 4319, 3705, 723, 1318, 5130, 2145, 4797, 2148, 2149, 2845, + 4020, 4021, 3072, 1809, 3405, 2162, 3187, 2853, 2855, 4334, + 2858, 2859, 4500, 2989, 2498, 3786, 3888, 1951, 687, 3636, + 4051, 1344, 1345, 4345, 4207, 3718, 1293, 2913, 3785, 3785, + 4045, 5469, 3648, 3005, 4045, 2225, 4760, 4511, 5122, 4516, + 5241, 4511, 3790, 540, -2617, -2617, 3282, 5428, 828, 1802, + 4401, 829, 830, 831, 1923, 1500, 2516, 3018, 3019, 1803, + 832, 4867, 4708, -3650, 3149, 2501, 2518, -372, -2503, 864, + 4667, 3310, 4321, 4322, -3646, 2517, 3322, 718, 716, 865, + -2617, 3069, 4892, 2528, 2498, 3346, 800, 2534, -2797, -2797, + 1484, -486, -486, 4762, -3643, -3648, -1020, -1020, -3644, -2504, + 3409, 2546, 2512, 2512, 795, 2459, 5447, -1870, -1870, -3647, + -3645, 4908, 3322, 2512, 5601, 737, -384, -384, 2063, 2065, + 2066, 3253, 3862, -3378, -3378, 5150, 5563, -3379, -3379, 2182, + 665, 2108, 1438, 2073, 1834, 1835, 1836, 1837, 4754, 4754, + -2100, 2074, 731, 1863, 2912, 740, 732, 800, 1453, 5044, + 2075, 1453, 2523, 3392, 2637, 2073, 2427, 4666, 4667, 3547, + 1840, 2522, 1489, 2074, 6145, 4526, 1833, 2524, 3322, 2031, + 2521, 2526, 2075, 4153, 5557, 3535, 1843, 1844, 2049, 2053, + 3322, 2535, 4579, 2538, 2539, 2540, 2541, 4373, 2542, 2430, + 5913, 5624, 5625, 735, 4303, 3632, 4763, 1453, 2525, 2548, + 2549, 2550, 2551, 2552, 3417, 2498, 3972, 3393, 2512, 2498, + 4762, -2652, 3431, 4849, 2529, 715, 820, 5249, 2329, 3206, + 3785, 42, 5614, 2498, 2678, 2679, 2073, 3322, 4930, 3356, + 4579, -2614, -2614, 2689, 2074, 4580, 715, 3277, 3548, 4264, + -3378, 2187, 5083, 2075, -3379, 2512, 3322, 4288, 3322, 4754, + 2692, 2693, 2694, 4415, 2695, 3094, 2696, 4190, 2697, 3825, + 3826, 1453, 3347, 2750, 3322, 2753, 3576, -2614, 3396, 2073, + 2547, 3163, 49, 4362, 5188, 4204, -2668, 2074, 5189, 2575, + 2766, 2767, 2769, 4580, 3322, -3378, 2075, 2772, 2773, -3379, + 2692, 2693, 2694, 5119, 2695, 2789, 2696, 1927, 2697, 2692, + 2693, 2694, 783, 2695, 3322, 2696, 4356, 2697, 2076, 1412, + 1373, 5190, 42, 4763, 3322, 2073, 756, 680, 4402, 5379, + 2073, 5382, 4003, 2074, 1475, 2073, 2073, 3549, 2074, 3752, + 2076, 879, 2075, 2074, 2074, 784, 1210, 2075, 4255, 4256, + 3684, 3047, 2075, 2075, 4642, 5799, 2147, -2669, 5433, 5179, + 4098, 1453, 1882, 797, 1414, -1945, 2073, 5384, 6257, 2430, + 4431, -2670, 2073, 49, 2074, -3456, 880, 1210, 2073, 3188, + 2074, 3863, 51, 2075, 4352, 1872, 2074, 5386, 2073, 2075, + 2119, -2797, 514, 799, 2095, 2075, 2074, 5404, 3808, 1453, + 6104, 1210, 6210, 666, 1439, 2075, 5083, 5128, 4779, 1882, + 42, 2076, 869, 5180, 4668, 1453, 5990, 1453, 2073, -3439, + 1305, -3443, 4830, 4931, 5447, 2077, 2074, 2682, 2073, -2497, + 3483, 1887, 635, 2073, 1453, 2075, 2074, 509, 3109, -3378, + 2073, 2074, 5721, -3379, 1461, 2075, 635, 2077, 2074, 1404, + 2075, 2256, 4835, 4607, 2076, -3442, 4298, 2075, 5848, 805, + 807, 49, 6171, 807, 3592, 815, 6173, 4780, -3440, 5780, + 51, 5463, 3193, 4774, 2095, 2073, 6330, 5809, 4821, 4358, + 537, 2234, 4388, 2074, 2137, 785, 2431, 2098, 1335, -3441, + 5544, 729, 2075, 2146, 514, 512, 936, 755, 815, 2114, + 2076, 2160, 5131, 2096, 2097, 2076, 863, 1388, 868, 743, + 2076, 2076, 5793, 2220, 543, 2222, 4511, 3048, 2077, 4614, + 1413, 539, 1181, 546, 642, -3446, 6340, 2336, 815, 543, + 2339, 2123, 2194, 2235, 2342, 2343, 2345, 2346, 4432, 509, + 5211, 2076, 1873, 1298, 542, 4867, 4781, 2076, 669, 3570, + 709, 815, 5810, 2076, 1230, 4448, 1236, 3571, 2445, 542, + 6361, 2077, 1235, 2076, 1316, 815, 1415, 2098, 1182, 730, + 1336, 2586, 2099, 4836, 867, 5193, 5376, 5195, 6331, 1420, + 5207, 5212, 5659, 1227, 1420, 1379, 1420, 744, 676, 541, + 4287, 3433, 1234, 2076, 5225, 4625, 4626, 1363, 1883, 4205, + 2598, 734, 1460, 2076, 5991, 3677, 5849, 2077, 2076, 5545, + 5850, 1462, 2077, 797, 42, 2076, 2506, 2077, 2077, 4754, + 5644, 2188, 1233, 2120, 2683, 3685, 3307, 6258, 826, 1463, + 1443, -1945, 2846, 847, 1447, 4861, 3536, 1483, 1451, 1452, + 6104, 1254, 1436, 2474, 6282, 1883, 815, 844, 2077, 899, + 2076, 1888, 2099, 704, 2077, 5736, 2431, 1329, 1884, 4403, + 2077, 1405, 815, 995, 3809, 49, 4302, 4191, 5420, 827, + 2077, 1486, 1254, 3706, 51, 3811, 5433, 3577, 3756, 3179, + 3785, 4357, 2385, 1874, 797, 2481, 1287, 6404, 3707, 5453, + 4476, 4308, 2221, 4643, 4192, 4312, 1254, 1374, 866, 1473, + 2077, -3565, 6127, 3432, -3378, 2262, 710, 3207, -3379, 2330, + 2077, 2847, 539, 540, 546, 2077, 4362, 1801, 3739, 1806, + 543, 1828, 2077, 1830, 4822, 4188, 807, 807, 807, 807, + 1838, 4457, 815, 4754, 3101, 1321, 2454, 863, 3365, 868, + 3394, 637, 3796, 844, 5668, 543, 844, 738, 669, 2486, + 542, 2262, 3633, 667, 3877, 637, 471, 2077, 5572, 4374, + 3541, 3542, 2450, 3753, 2183, 4621, 755, 3634, 5083, 3207, + 5450, 6141, 1476, 1417, 705, 542, 1839, 741, 1841, 3550, + 541, 4265, 4288, 5132, 4581, 1805, 2481, 5173, 5232, 3555, + 3556, 797, 3559, 3560, 1914, 739, 1438, 5968, 5659, 5970, + 2848, 1918, 6132, 1921, 3813, 867, 5675, 1864, 4876, 3864, + 2481, 537, 882, 4875, 5678, 5213, 5679, 1929, 1907, 1907, + 5181, 1907, 1907, 1907, 4893, 514, 512, -2617, 1907, 3323, + 2166, 539, 4581, 546, -2617, -2617, 5661, 564, 5822, 543, + 3916, 801, -2509, 3952, 3953, -3650, 2704, 471, 4323, -372, + 2401, 3788, 3789, 3678, 1906, 1906, -3646, 1906, 1906, 1906, + 538, 2923, 1990, 828, 1906, 3323, 829, 830, 831, 542, + 509, 2232, 5350, -2510, 2638, 832, -3643, -3648, -2797, 1454, + -3644, -486, 1454, 5421, 1905, 1905, -1020, 1905, 1905, 1905, + 3445, -3647, -3645, 4909, 1905, 3986, 5083, -1870, 2986, 541, + 2988, 3166, 2659, 2992, 540, 2434, -384, 2980, 5564, 1804, + 4867, 4014, 5214, -3378, 3537, 3000, 5558, -3379, 3003, 3135, + 3915, 3323, 3006, 6187, 2936, 6189, 6190, 2032, 1454, 866, + 3150, 3289, -115, 3323, -115, 471, 2050, 2054, 3289, 2946, + 5805, 5807, -2652, 2435, -119, 3264, -119, 3267, 3021, 3022, + 3023, 1299, 2050, 5663, -3456, 3279, 2071, 4582, 2070, 4490, + 3278, 2445, 5141, 2063, 2065, 5165, -2652, 5033, 5168, 5428, + 5428, 670, 2068, 1361, 4049, 5294, 4050, 4511, 3290, 5296, + 3323, 4511, 3304, 5188, 4754, 3305, 4754, 5189, 3545, 2588, + 3295, -111, 1454, -111, 3316, 3017, 4834, 2914, -3439, 3323, + -3443, 3323, 2512, 2481, 4782, 2508, 3317, -2668, 1904, 1904, + 2095, 1904, 1904, 1904, -2614, 5169, 2698, 3323, 1904, 815, + 5190, -2614, -2614, 540, 6244, 6245, 3453, 3934, 3454, 2512, + 3462, -2668, 2512, 3465, -3442, 6251, 5699, 3323, 5701, 2096, + 2097, 2512, 5951, 5706, 2073, 2073, 815, -3440, 5014, 3477, + 5711, 5712, 2074, 2074, -2163, 815, 2770, 3323, 815, 677, + 5718, 2075, 2075, 815, 2419, 6296, 5083, 3323, -3441, 3496, + 2899, 2637, 2073, -2100, 3434, -2100, 2095, 3455, -2669, 3456, + 2074, 2297, 1454, 3524, 3484, 3525, 2669, 1453, 2582, 2075, + 669, 2073, -2670, 6285, 815, 3980, 938, 3308, 4754, 2074, + 4099, 3323, -2669, 2098, -3446, 2096, 2097, 6264, 2075, 4803, + 5980, 3256, 5407, 3464, 936, 5171, -2670, 2502, 2686, 4125, + 1454, 4126, 4100, 4806, 2882, 4532, 5737, 4533, 4, 5, + 2900, 1210, 2244, 2504, 797, 4593, 1454, 4594, 1454, 471, + 797, 797, 709, -2163, 2161, 2095, 3344, 3472, 2102, 2103, + 2104, 2105, 2106, 2107, 4980, 1454, 2491, 2298, 3207, 5730, + 2945, -1870, 3651, 2914, 706, 3867, 2308, 2838, 4045, 2098, + 2073, 670, 4119, 2184, 2096, 2097, 669, 3439, 2074, 4178, + 797, 2321, 3440, -1830, 3363, 3733, 5708, 2075, 2099, 3449, + 2073, 4787, 4788, 2924, 2808, 669, 2352, 2202, 2074, 4381, + -3266, 2334, 686, 5374, 3718, 3785, 3785, 2075, 2073, 4, + 5, 2857, 4895, 4791, 4792, 2672, 2074, 1466, 4390, 2076, + 2076, 3269, 3469, 797, 2361, 2075, 5817, 2070, 2102, 2103, + 2104, 2105, 2106, 2107, 5083, 2642, 2984, 6363, 2098, 2259, + 5855, 2068, 2849, 3270, 2384, 2647, 1420, 2076, 2949, 2337, + 2338, 6310, 2990, 5845, 2099, 2653, 2637, 2073, 879, 709, + 4, 5, 2408, 949, 1831, 3004, 2076, 1934, 4636, 4206, + 2530, 5068, 2314, 5574, 2075, 5207, -1870, 844, 3266, 844, + 2189, 4394, 4645, 2417, 2418, 537, 4648, 4237, 3642, 1466, + 3868, 5215, 5863, 880, 2228, 6129, 1436, 2439, 710, 514, + 512, -3276, 2286, 2073, 4236, 5846, 644, 5151, 797, 4234, + 815, 2074, 4163, 2302, 3866, 4067, -1870, 2362, 807, 797, + 2075, 1240, 797, 2099, 1226, 6116, 2077, 2077, 3585, 2969, + 5317, 4259, 635, 797, 5845, 3187, 4405, 2913, -1830, 2073, + 5886, 772, 6168, 6205, 509, 2076, 2390, 2074, -714, 6286, + 2322, 3734, 1456, 6311, 2077, 3281, 2075, 3281, 1388, 4358, + 3370, 755, 2257, 2095, 2139, 2076, 4451, 1231, 4453, 5779, + 4922, 4923, 3405, 2077, 5824, 5989, 5825, 1232, 5491, 2995, + 3452, -1870, 4268, 2076, 2881, 5845, 5846, 5123, 1892, 701, + -3678, 5291, 2096, 2097, 6002, 2073, 938, 5865, 2937, 1865, + 2073, 2506, 5408, 2074, 5409, 3982, 2901, 4954, 2074, 2643, + 3174, 5431, 2075, 3867, 936, 710, -1259, 2075, 5739, 2507, + -3679, 5996, 2996, 2445, 2971, 2972, 1254, 2974, 2976, 2977, + 2978, 2642, -715, 4152, 2572, -1870, 1951, 5846, 5410, 2987, + 5576, 4138, 4141, 4144, 4145, 2644, 4003, 2315, 5731, 3082, + 3027, 2491, 2077, 2391, 2912, 3992, 2098, 3002, -3675, 5389, + -3266, 2429, 5152, 3643, 2920, 4497, 4930, 950, 5411, 5402, + 5403, 2098, 2077, 3735, 4238, 5595, 4157, -1870, 2076, 2706, + 4391, 4124, 1388, 4127, 824, 2185, 4131, 4132, 5632, 6041, + 2077, 3870, 4368, 1388, 1388, 6042, -3673, 6306, 4206, -1830, + 4537, 3111, 3112, 3598, 3599, 3115, 2531, 2140, 2950, 2203, + 3122, 3123, 3124, 670, 2076, 2073, 4212, 2073, -3471, 3066, + 5976, 1935, 6271, 2074, 2229, 2074, 6287, 4409, 4469, 4411, + 4412, 5273, 2075, 2190, 2075, 4417, 3554, -2163, 3868, 2077, + 6288, 2099, 3333, 4425, 2486, 4395, 3085, 4433, 2985, 4436, + 6248, 4674, 845, 6364, -3676, 6058, 2099, 2997, 6270, 3118, + 3121, -3276, 3071, 3346, 2991, 849, 850, 2258, 2260, 2073, + 2076, 4955, 898, -3674, 2073, 2076, 6042, 2074, 2434, 2095, + 2073, 2073, 2074, 2560, 6312, 2077, 2075, 4846, 2074, 2074, + 881, 2075, 3271, 5732, 938, 636, 3189, 2075, 2075, 670, + 3116, 5412, 1893, 3104, 2902, 2643, 6043, 5887, 2096, 2097, + 3869, 2073, 936, 6309, 3110, 3175, 2435, 1866, 670, 2074, + 2230, 2077, 3460, 5153, 5124, 1383, -2163, 6042, 2075, 3674, + 2401, 3981, 2401, 2401, 5910, 5413, 2231, -3678, 2300, 4304, + 3586, 637, 5318, -3471, 4270, 3589, 3590, 2502, 5432, 2557, + 2295, 4931, 1412, 4130, 6347, 3155, 1413, 797, 2434, 2571, + 5358, 1210, 5942, 2504, 1818, 5581, 5942, -3679, 4770, 2581, + 807, 3631, 2098, 6111, 3191, 1813, 815, 2077, 815, 797, + 5883, 3814, 2077, 3817, 3818, 3777, 5715, 6043, 6131, 709, + 2076, 3778, 2076, 2073, 6133, 685, 2435, 1414, 3223, 1867, + 3664, 2074, 1415, 689, 3665, -3675, 3667, 815, 695, 5857, + 2075, 2073, 5705, 815, 3192, 2073, 3201, 2642, 715, 2074, + 3672, 5020, 5458, 2074, 1930, 3627, 5023, 5024, 2075, 882, + 5278, 4461, 2075, 3680, 3681, 1416, 3349, 3350, 6043, 3870, + 3347, 6238, 3647, -3673, 2076, 6249, 3652, 6239, 2649, 2076, + 3299, 3193, 4851, 3367, 4206, 2076, 2076, 2099, 4271, 1964, + 1965, 1966, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + 5358, 5459, 5888, 5910, 1931, 5192, 797, 815, 4880, 2881, + 5206, 2638, 5778, 4463, 5313, 5216, 2076, 4818, 2146, 4427, + 2508, 5498, 2296, 3450, 3451, 2073, 3391, 2077, 2073, 2077, + 3871, -3676, 3221, 2074, 2013, 4660, 2074, 2475, 1454, 2018, + 5942, 6204, 2075, -2100, -2100, 2075, 4661, 5636, 3351, 5947, + -3674, 3457, 2070, 5754, 2475, 3733, 4935, 5942, 514, 2101, + 2102, 2103, 2104, 2105, 2106, 2107, 2068, 2932, 1932, -1259, + 3467, 5513, 3384, 2459, -3471, 710, 2850, 2073, 4807, 2073, + 6289, 2077, 3385, 6045, 2179, 2074, 2077, 2074, 6198, 2073, + 2801, 2802, 2077, 2077, 2075, 6020, 2075, 2074, 2076, 3194, + 864, 2073, 717, 4881, 797, 2933, 2075, 903, 797, 2074, + 865, 3195, 783, 2179, 797, 5110, 2076, 5359, 2075, 2894, + 2076, 2643, 1184, 2077, 3706, 2831, 5938, 2100, 2101, 2102, + 2103, 2104, 2105, 2106, 2107, 3300, 2073, 5882, 6143, 3707, + 1933, 6147, 5916, 6044, 2074, 784, 5889, 5460, 3696, 3468, + 2073, 2895, 1814, 2075, 3281, 514, 2839, 2481, 2074, 3281, + 3167, 2506, 853, 854, 6045, 4937, 3281, 2075, 4272, 3473, + 4939, 1429, 4004, 1380, 5157, 5158, 815, 4940, 2886, 2507, + 4100, 4100, 6302, 4428, 4100, 4100, 1254, 3474, -1870, 719, + 4100, 4100, 3301, 5931, 797, 5933, 2638, 6083, 815, 815, + 2076, 5942, 1831, 2076, 5999, 2077, 815, 2938, 5507, 6021, + 4762, 3196, 6182, 3558, 3399, 6045, 2073, 4832, 6092, 5939, + 3404, 3734, 6381, 2077, 2074, 2896, 3543, 2077, 2955, 2180, + 1430, 5763, 1293, 2075, 5532, 5111, 807, 807, 797, 807, + 807, 807, 807, 797, 815, 797, 5372, 5372, 4827, 4828, + 4829, 807, 2076, 6377, 2076, 1230, 3168, 1236, 2180, 3853, + 2934, 6115, 5159, 1235, 2076, 5885, 888, 5364, 3001, 807, + 4462, 815, 4898, 4901, 2476, 4904, 2076, 2532, 6303, 5309, + 2533, 3197, 3482, 5916, 1227, 785, 4429, 4592, -904, 4595, + -904, 2476, 797, 1234, 2080, 2081, 2082, 5942, 2083, -221, + -2347, 5310, 3266, 6382, 797, 3985, 2897, 2077, 6053, 5788, + 2077, 2076, 2073, 4763, 5794, 5795, 2430, 5479, 3494, 5480, + 2074, 5365, 3624, 1233, 3822, 2076, 4481, 4482, 5940, 2075, + 6071, 5673, 6304, 1923, 3169, 3572, 1417, 2364, 6276, 5160, + 6183, 5326, 5327, 3735, 811, 2100, 2101, 2102, 2103, 2104, + 2105, 2106, 2107, 5615, 815, 2906, 6193, 6194, 2477, 2077, + 2478, 2077, 777, 5185, 2104, 2105, 2106, 2107, 3618, 797, + 2344, 2077, 3470, 4211, 3087, 2477, 2073, 2478, 3619, 3499, + 5567, 6213, 4665, 2077, 2074, -2347, 2554, 6202, 6203, 2481, + 2861, 2076, 5397, 2075, 2803, 815, 6378, 2804, 2452, 2073, + 4348, 5928, 3106, 2365, 815, 815, 815, 2074, 5757, 938, + 797, 3595, 807, 2602, 2366, 2084, 2075, 6184, 2077, 725, + 5366, 2073, 2367, -72, 4254, 2603, 2675, 936, 797, 2074, + 2440, 4433, 2077, -342, 1425, 5764, 5765, 5398, 2075, 797, + 797, -2347, 3007, 6160, 2881, 2073, 6163, 815, 1319, 2368, + 2479, 2073, 4993, 2074, 2434, 3659, 5197, 6326, 3732, 2074, + 3660, 1923, 2075, 5926, 2073, 5376, 755, 2479, 2075, 3663, + 757, 6241, 2074, 6097, 2453, 3666, 4349, 2198, 1388, 6214, + 2604, 2075, 6061, 6065, 1388, 2688, 2862, 2076, 5367, 3689, + 2675, 5034, 2435, 2073, 3500, 2675, 3503, 1324, 2077, 1388, + 2199, 2074, 2863, 6356, 2401, 2369, 5399, 6291, 815, 3769, + 2075, 2073, 3770, 844, 4206, 6097, 3775, 797, 2675, 2074, + 5198, 2073, 2445, 797, 2480, 3090, 5199, 3216, 2075, 2074, + 2675, 3136, 5372, 2370, 3302, 5766, 3714, 3137, 2075, 3138, + 844, 2480, 3302, 5247, 3797, 3698, 3471, 5170, 797, 2749, + 2508, 2076, 6292, 3504, 2752, 3814, 2586, 4325, 758, 3520, + 3523, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 3722, + 3723, 815, 5264, 2864, 2076, 4307, 2073, 2768, 4452, 4311, + 815, 3091, 1325, -904, 2074, 4440, 4181, 4506, 4441, 2788, + 3530, 5745, 802, 2075, 2077, 6335, 2076, 3337, 2073, 5845, + 3764, 760, 3767, 2431, 808, 776, 2074, 5767, 3772, 3774, + 4326, 3309, 3139, 5272, 15, 2075, 2073, 6371, 6372, 6284, + 2076, 6061, 809, 3281, 2074, 6065, 2076, 539, 4111, 546, + 6357, 777, 4179, 2075, 5297, 543, 2073, 5506, 1326, 2076, + 5604, 5605, 4112, 1828, 2074, 3341, 3724, 3854, 4183, 4442, + 3343, 5846, 714, 2075, 4186, 4187, 797, 797, 2077, 6329, + 6370, 2385, 2605, 24, 869, 542, 2401, 2073, 2076, 5833, + 2445, 5537, 4026, 3361, 3361, 4468, 4504, 4505, 4942, 4943, + 715, 2077, 6300, 6300, 2075, 1809, 2076, 4514, 3495, 3706, + 1388, 5834, 2481, 2914, 4059, 541, 2076, 815, 5339, 4986, + 3283, 797, 811, 2077, 3707, 5206, 5040, 4962, -592, 2498, + 5000, 797, 4884, 5770, 3452, 4510, 3284, 4465, 3402, 4885, + 2073, 4517, 4982, 4154, 6337, 5301, 3408, 2077, 2074, 3410, + 3383, 3945, 3390, 2077, 3323, 2073, 2073, 2075, 3389, 5835, + 3570, 3946, 5012, 2074, 2074, -2341, 2077, -2341, 5017, 625, + 5415, 2076, 2075, 2075, 539, 5417, 546, 3855, 863, 834, + 868, 1997, 543, 1180, 3856, 3198, 543, 42, 3388, 3198, + 3857, 1186, 825, 2076, 4301, 2077, 1286, 4530, 1375, 836, + 2014, 2015, 4383, 4384, 4, 5, 4385, 4386, 4387, 2881, + 1376, 2076, 542, 2077, 514, 3443, 542, 5487, 3387, 1923, + 3781, 1851, 715, 2077, 3782, 3624, 622, 848, 5488, 47, + 952, 2076, 2073, 6061, 6065, 4831, 3323, 1809, 49, 540, + 2074, 1809, 541, 4052, 3498, 1160, 867, 51, 4531, 2075, + 1162, 938, 820, 3984, 4057, 4058, 2313, 5142, 4546, 3543, + 679, 60, 2318, 2319, 5143, 3858, 5144, 5328, 1178, 936, + 4548, 3618, 1346, 1377, 1288, 1347, 1348, 2073, 2077, 1852, + 1349, 3619, 1853, 3945, 3132, 2074, 3133, 3945, 4243, 4244, + 2073, 4812, 4813, 3946, 2075, 4814, 4815, 3946, 2074, 797, + 2077, 4816, 4817, 797, 2073, 4570, 1290, 2075, 4170, 1854, + 2407, 4093, 2074, 2409, 2409, 2076, 3532, 1855, 2077, 4571, + 4989, 2075, 1300, 5554, 4991, 1305, 3859, 2364, 4097, 2168, + 2076, 2076, 1466, 2073, 5565, 2073, 1310, 3364, 2077, 3365, + 2073, 2074, 3386, 2074, 4206, 6350, 6352, 2070, 2074, 1313, + 2075, 2073, 2075, 3430, 4206, 4206, 2146, 2075, 2146, 2074, + 3458, 2068, 2747, 6408, 623, 5700, 540, 1319, 2075, 681, + 866, 1322, 6200, 681, 5380, 5383, 5385, 5387, 681, 2073, + 5390, 5391, 5713, 3506, 3501, 5395, 3502, 2074, 5401, 1331, + 3927, 5405, 3930, 2365, 5380, 5722, 2075, 5724, 5416, 5380, + 2822, 2823, 815, 815, 2366, 1333, -3560, 2076, 2073, 815, + 2073, 3260, 2367, 3361, 3361, 3261, 2074, 3262, 2074, 3263, + 1378, 3936, 2077, 3937, 1340, 2075, 815, 2075, 815, 6152, + 6153, 3637, 3638, 2073, 4483, 4484, 4485, 2077, 2077, 2368, + 1342, 2074, 2085, 2086, 2087, 3260, 3617, 2401, 3623, 3261, + 2075, 3268, 2076, 3263, 3622, 2169, 3658, 807, 3127, 1356, + 1240, 1240, 807, 1226, 1226, 2076, 2073, 2170, 5248, 776, + 2073, 807, 745, 746, 2074, 4654, 624, 807, 2074, 2076, + 2073, 5285, 4974, 2075, 3621, 1432, 1433, 2075, 2074, 3938, + 4458, 3937, 783, 1362, 2073, 2369, -1319, 2075, 4808, 3939, + -1319, 3940, 2074, 5338, 797, 1360, 1231, 1231, 2076, 747, + 2076, 2075, 1366, 1409, 2077, 2076, 1232, 1232, 1369, 1371, + 2244, 4704, 2171, 2370, 1372, 784, 2076, 815, 3701, 797, + 2172, -2294, 4012, 5774, 4013, 4562, 3671, 4563, 4898, 2073, + 4901, -1319, 4904, 3507, 4622, 1447, -1319, 2074, 748, 4218, + 4206, 625, 2073, 4315, 2076, 4316, 2075, 797, 1388, 2077, + 2074, 4447, 1388, 1445, 3728, 2173, 3509, 1458, 797, 2075, + 1442, 4371, 2077, 4372, -3560, 761, 4913, 4656, 1470, -1319, + -2294, 5316, 4438, 2076, 4439, 2076, 2077, 755, 3510, 1346, + 3614, 5583, 1347, 1348, 3755, 4206, 1460, 1946, 3760, 3761, + 797, 626, 807, 2208, 807, 1474, 3232, 3233, 2076, 797, + 3773, 807, 3513, 1480, 797, 2077, 762, 2077, 3514, 1481, + 797, 3245, 2077, 3247, -2292, 4554, 4462, 3502, 1482, 1487, + 3186, 3518, 763, 2077, 4646, 797, 4647, 3661, 3620, 3795, + 2502, 2076, 1492, 2384, 3800, 2076, 5743, 4557, 3668, 2262, + 820, 4561, 4659, 2262, 2503, 2076, 2504, 5936, 4, 5, + 3521, 2077, 1810, 1495, 2073, 785, 1811, 1819, 709, 2076, + 5524, 1812, 2074, -2292, 1820, 4295, 2365, 2174, 3528, 709, + 4565, 2075, 4566, 2089, -2294, 1831, 4340, 2366, 3540, 4887, + 2077, 4888, 2077, 5977, 815, 3146, 1846, 2692, 2693, 2694, + 797, 2695, 1850, 2696, 2175, 2697, 4245, 1848, 5936, 4, + 5, 5594, 471, 1856, 2076, 2077, 3248, 3249, 5881, 1859, + 844, 2073, 2146, 749, 3302, 3302, -2294, 2076, 1809, 2074, + 709, 2445, 2445, 3964, 3731, -2294, 1354, 1355, 2075, 1358, + 750, 1359, 1858, 4525, -2294, 3920, 1388, -3426, 2077, 764, + 1860, 4246, 2077, 3929, 2881, 2146, 1527, 1861, -2294, 3492, + 1862, -3428, 2077, 5952, 1868, 4534, 751, 5566, -2062, 1876, + 4994, 815, 2262, 5029, 1802, -3425, 2077, -2292, 3147, 2090, + 765, 4963, 1869, 4535, 1803, 5252, 5972, 5253, -3427, 5953, + 4375, 1870, 1871, 5040, 4964, 2091, 627, 1877, 1875, -940, + 628, 1878, 3426, 4536, 3299, 1879, 2370, 752, 3965, 3944, + 4965, 3949, 709, 4247, 5547, 1880, 4081, 1955, 3974, -2292, + 3976, 2077, 3552, 1881, 710, 624, 797, 2089, -2292, 797, + 2073, 815, 815, 1891, 2077, 710, 1938, -2292, 2074, 2076, + 4966, 3828, 815, 5912, 5254, 1952, 5255, 2075, 709, 3835, + -940, -2292, 5256, 5286, 5257, 2262, 4248, 2073, 4128, 2008, + 5299, 5773, 5300, 2089, 5937, 2074, 2092, 5307, 5319, 2262, + 5320, 1953, 1954, 629, 2075, 1903, 1910, 3948, 1915, 1916, + 1917, -3560, 2924, 2924, 1959, 1920, 710, 4541, 1960, 2505, + 1747, 5954, 5344, 5955, 5345, 5362, 2076, 5363, 1961, 2176, + 625, 2040, 4542, 4543, 2073, 1962, 1466, 1466, 709, 1963, + 1967, 2209, 2074, 1969, 2109, 5937, 5830, 2110, 815, 4967, + 815, 2075, 5027, 2090, 2506, 1907, 1907, 1907, 5478, 3617, + 4316, 3623, 5938, 5618, 4591, 4663, 1970, 3622, 5292, 2091, + 1971, 3944, 2507, 3949, 3839, 3944, 2077, 3949, 2073, 1254, + -1319, 5733, 5776, 5734, 5777, 2210, 2074, 2211, 5782, 2090, + 5777, 1906, 1906, 1906, 5783, 2075, 5777, 3621, 710, 2044, + 5831, 5915, 4316, 1972, 2491, 2091, 2177, 5921, 5922, 4544, + 4968, 1973, 1974, 5938, 2178, 5752, -1657, 5832, 4714, 4316, + 1975, 1905, 1905, 1905, 5982, 5758, 5983, -1656, 6013, 4083, + 6014, 3947, 1976, 2077, 710, 2076, 5279, 1977, 1978, 3948, + 2092, 3572, 1466, 3948, 2111, 4249, 4250, 4251, 1979, 5502, + 5503, 4110, 5505, 2112, 4545, 5939, 1349, 5510, -940, 1980, + 5514, 3779, 2076, 5517, 5518, 1983, 5956, 4553, 6022, 1984, + 6023, 5526, 4547, 5527, 1985, 1992, 2092, 2212, 2070, 1993, + 4134, 4559, 5533, 1994, 2113, 2401, 514, 2692, 2693, 5422, + 2498, 5423, 2068, 5424, 710, 5425, 2115, 6057, 1194, 4372, + 5018, 5019, 5338, 3614, 5719, 6180, 5939, 6181, 797, 2076, + 1388, 1388, 4560, 815, 815, 4383, 4384, 4568, 1995, 4385, + 4386, 4387, 1998, 5937, 4969, 4970, 1999, 2213, 4569, 2000, + 3966, 3967, 2073, 2117, 3968, 4152, 3969, 4029, 3970, 6216, + 2074, 5054, 2077, 815, 4230, 1904, 1904, 1904, 6217, 2075, + 5320, 3620, 3840, 2076, 2001, -2525, 4572, 1195, 6224, 2002, + 6225, 766, 537, 3947, 5940, 2003, 4197, 3947, 4199, 2077, + 6233, 6250, 6234, 5777, 2214, -2062, 514, 512, 6252, -166, + 5777, 2004, 539, 1361, 546, 4950, 2122, 5284, 564, 2005, + 543, 5938, 2006, 4266, 1230, 1230, 1236, 1236, 3841, 2007, + 2831, 487, 1235, 1235, 5524, 488, 2009, 2010, 489, 570, + 5290, 538, 797, 4289, 6265, 5940, 2077, 6253, 2011, 5777, + 542, 509, 2012, 1227, 1227, 656, 5121, 4085, 6283, 4772, + 5777, 2016, 1234, 1234, 1003, 1004, 955, 2017, 1007, -2294, + 1009, 2073, 1011, 5302, 6293, 2131, 5777, 5303, 2019, 2074, + 541, 6317, 767, 5320, 2020, 4, 5, 5746, 2075, 2021, + 2077, 9, 1233, 1233, 2215, 6394, 4707, 6395, 3232, 3233, + 956, 5925, 2022, 4971, 4972, 5879, 3842, 2023, 5936, 4, + 5, 6169, 2121, 3245, 5939, 3247, 2216, 807, 2024, 4649, + 4650, 14, 797, 4651, 4924, 4652, 4926, 4653, 2025, 2026, + 709, 2073, 5200, 5200, 797, 2027, 2028, 2076, 797, 2074, + 2029, 2030, 2033, 5752, 815, 1196, 957, 1197, 2075, 2034, + 20, 4555, 2886, 958, 2035, 2036, 2037, 2038, 1198, 2039, + 2041, 2042, -2292, 5952, 23, 2093, 3483, 2132, 2130, 3843, + 2043, 2133, 2045, 2508, 1199, 2046, 815, 815, 2047, 2048, + 959, 2051, 2052, 5201, 5201, 3844, 3845, 2055, 960, 5953, + 3846, 3847, 3848, 2056, 2057, 2924, 4444, 2058, 5707, 2059, + 28, 4953, 3706, 3706, 540, 6087, 2060, 4919, 3248, 3249, + 5958, 5898, 815, 2061, 2116, -2511, -2512, 3707, 3707, 1466, + 2138, 2164, 2165, 5940, 961, 1809, 636, 2186, 4398, 2167, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 2204, 2205, 2207, 2077, 2206, 2076, 3829, 3830, 2227, + -940, 5941, 2226, 2236, 2239, 2240, 2250, 2262, 3849, 4261, + 2294, 4973, 4995, 5586, 39, 5936, 4, 5, 2304, 962, + 963, 3945, 783, 2310, 5202, 2306, -1319, 2316, 2317, 2323, + -1319, 3946, -713, -713, 862, 2324, 710, 709, 2326, 2328, + 2332, 5954, 1801, 5955, 1806, 3274, 2349, 6024, 2350, 901, + -740, 4455, 5941, 2351, 2353, 784, 2076, 6237, 3850, 2093, + 2362, 539, 2373, 546, 3287, 5937, 2374, 2377, 5898, 543, + 5952, -1319, 797, 3292, 6399, 2387, -1319, 2393, 2403, 3294, + 1033, 2404, 5142, 1284, 6343, 6344, 50, 3306, 6345, 5143, + 6346, 5144, 2418, 815, 815, 2093, 5953, 3318, 797, 542, + 3320, 2414, 2437, 2077, 2427, 1200, 2428, 2441, 2456, -1319, + 1805, 4496, 2444, 2460, 2466, 2472, 2486, 2495, 4364, 4365, + 4366, 4367, 2499, 4369, 4370, 82, 2491, 2520, 2527, 541, + 2536, 6319, 2073, 5938, 2543, 2553, 2556, 2721, 2558, 2544, + 2074, 2563, 2566, 6128, 2559, 2564, 1907, 964, 2572, 2075, + 2364, 2576, 4558, 5683, 5684, 2578, 5686, -940, 2580, 1053, + 2583, 4413, 4414, 2077, 4416, 2591, 4418, 4419, 4420, 4421, + 4422, 4423, 4424, 2593, 4426, 2595, 2596, 2597, 4435, 2599, + 2600, 2627, 1906, 2635, 2646, 2648, 5956, 2650, 6154, 2651, + 2654, 5185, 5185, 710, 2655, 785, 2652, 2657, 5954, 2658, + 5955, 709, 5899, 2662, 2722, 2674, 4574, 6221, 2733, 5900, + 2673, 2675, 1905, 2684, 2746, 2691, 2365, 965, 2705, 2747, + 2748, 2759, 5937, 2761, 5901, 2764, 5939, 2366, 2765, 2827, + 2812, 6103, 2816, 2837, 1804, 2367, 2856, 2841, 2860, 2887, + 901, 2915, 2888, 2916, 2921, 1799, -2264, 4612, 1067, 2922, + 2928, 2939, 2944, 540, 2947, 2966, 2967, 4, 5, 2993, + 6229, 815, 2368, 797, 6407, 862, -3527, 2968, 815, 815, + 2723, 4630, 2724, 3008, 4633, 4634, 3009, 3010, 2725, 3011, + 3013, 3015, 3020, 4340, -2112, 3014, 3030, 3033, 3034, 3036, + 5938, 3043, 3039, 3040, 3041, 2265, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 2076, 3042, 5899, + 1201, 1202, 1203, 1204, 3050, 3051, 5900, 3064, 2369, 3060, + 3061, 3062, 3063, 3065, 3067, 3068, 3074, 3075, 3078, 3079, + 4683, 5901, 3083, 3088, 3094, 5940, 1904, 3097, 2726, 514, + 514, 3102, 6221, 5956, 1902, 1902, 2370, 1902, 1902, 1902, + 3125, 5902, 3191, -2264, 1902, 966, 5838, 710, 5839, 5840, + 4375, 5587, 3128, 3129, 5903, 2364, 3130, 3131, 5588, 2364, + 3142, 3134, 797, 3143, 815, 3144, 3152, 797, 797, 3157, + 3156, 5904, 2727, 5939, 3159, 5613, 3160, 3172, 3173, 3176, + 3190, 807, 3192, 6229, 3177, 3204, 1033, -2536, 5242, 3205, + 3213, 5203, 5203, 4687, 3218, 3219, 797, 797, 6297, 3220, + 3214, 3224, 2364, 4798, 2077, 3255, 4878, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 3258, 3193, + 2547, 2365, 3285, 3293, 3311, 2365, 3314, 3319, 3331, 4629, + 3330, -715, 2366, 3335, 5183, 6388, 2366, 1416, 3339, 3342, + 2367, 3344, 3345, 3352, 2367, 3355, 3358, 3376, 5902, 6398, + 3400, 3419, 5957, 3422, 3424, 6388, 3401, 3425, 3444, 3436, + 3427, 5903, 6398, 3437, 2728, 1053, 3438, 2368, 2365, 3964, + -1319, 2368, 3441, 3452, 3442, 2729, 3459, 3792, 5904, 2366, + 3463, 4789, 5940, -1870, -1870, -715, 3466, 2367, 762, 3475, + 5958, 5371, 3476, 3478, 3479, -1870, 1275, 3480, 2266, 5204, + 5204, 3481, 3485, 3493, 3706, 4688, 3497, 1033, 3505, 669, + -1456, 5905, 3508, 4689, 2368, 3511, 3512, 3516, 3517, 3707, + 3551, 3522, 3526, 2369, 4793, 3527, 3920, 2369, 4690, 3529, + 2637, 3533, 3534, 3539, 3544, 3557, 3564, 3194, 4691, 4692, + 4693, 2107, 4765, 3566, 3965, 4457, 3567, 4912, 4694, 3195, + 4914, 2370, -1622, 3568, 1067, 2370, 3569, 3576, -1870, 3583, + 2031, 2049, 2053, 4920, 3593, 3591, 3594, 3596, 3597, 3600, + 2369, 3588, 3604, 3793, 3626, 864, 5184, 514, 512, 3605, + 3641, 3606, 5941, 3644, -715, 865, 1053, 3669, 4936, 647, + 5353, 3645, 514, 3646, 3653, 5497, -1870, 3649, 2370, 3654, + -1870, 3657, 3673, 1275, -1870, 3683, 3686, 3687, 3693, 5509, + 3711, 3712, 3740, -1870, -1870, 5641, 3744, 3748, 5905, 3742, + -1870, 764, 3780, 3743, -1870, 3747, 5396, 4, 5, -1870, + 3787, -1870, 3791, 3805, 3816, -1870, 3812, 3820, 4350, 4351, + 3823, 4353, 4355, -1870, 2267, -1870, 648, 5958, 3831, 3196, + -1870, 3824, -715, 3834, 3832, 3833, 3836, 3837, 2268, 3838, + 2269, 5589, 4985, 3875, 5590, 2265, 3878, 3885, 3881, 3944, + -1870, 3949, 3924, 5591, 5588, 1067, 3917, 3890, 3891, 3892, + -1870, 3893, 3894, -1870, 3895, 3896, 4695, 3897, 3898, 3899, + 3900, 2285, 2270, 3901, 4630, 3902, 3903, 3904, 4696, 3905, + 3906, 3931, 3907, -1870, 3971, 2271, 3908, 4612, 3909, 3932, + 3954, 815, 3975, 3910, 5016, 649, 3911, 3912, 3913, 3197, + 3914, 3955, -1870, 3977, 3925, 3978, -1870, 650, 3991, 3993, + 3996, 3926, 3927, 3997, 4005, -1870, 3928, 3948, 2272, 5941, + 5512, 3930, 4007, 5185, 2831, 2481, 4006, 3981, 3994, 4001, + 4009, 3995, 4023, 5041, -1870, 4053, 2273, 4054, 5042, 4055, + 4068, 4069, 4070, 4076, 4089, 5052, -1665, 4108, 4120, -1870, + 4135, 4121, 4109, 4122, 4136, -1870, -1870, 514, 4148, 4149, + 5633, 5125, 1809, 4697, 5638, 5639, 4150, 3577, 5587, -1870, + 651, -1870, 4160, 4164, 4158, 5588, 4166, 4167, 4698, 4168, + 797, 4171, 4172, 4176, 4177, 2950, 5084, 2949, 4184, 4209, + 797, 3323, 4229, 4185, 4262, 4269, 4223, 4224, 4235, 3365, + 4233, 4241, 4275, 4279, 4280, 4228, 4242, 4277, 1802, 4281, + 4306, 4305, 4333, 5112, 2274, 4309, 4699, 4310, 1803, 4337, + -2015, 2275, 4346, 4378, 4347, 4379, 4380, 4396, 4400, 4406, + 4700, 2276, -715, 4407, 4408, 5183, 4410, 4450, 4456, 5869, + 4459, 3947, 4629, 4460, 4471, 2277, 4473, 4466, -1814, -1814, + 3340, 4478, 4479, 4491, 1809, 4499, 4509, 4501, 2266, 4508, + -1814, 4515, 5015, 3795, 4518, 4519, 4520, 4521, 4564, 4598, + 4575, 4590, 2886, 864, 4576, 4615, 2073, 2278, 4600, 4586, + 2279, 4601, 4602, 865, 2074, 4587, -715, 4616, 4603, 762, + 4624, 4604, 815, 2075, 4605, 2637, 2280, 4606, 4638, 4613, + 3945, 4639, 4619, 4617, 4644, 3706, 4664, 4620, 4657, 4662, + 3946, 4675, 670, 4686, 4663, 4678, -1870, 652, 4705, 4684, + 3707, 4713, 4710, -1814, 4706, 4711, 4716, 2281, 4767, 4775, + -1781, -1786, 4796, 5186, 4801, 2710, 2711, 2712, 2713, 4804, + 5084, 4810, 4805, 4820, 653, 4811, 4825, 4838, 4883, 4891, + 807, 4906, 4910, 4915, 4916, 5246, 4921, 5589, 4929, 4941, + 5590, -1814, 4944, 4945, 4947, -1814, 4956, 4987, 3536, -1814, + 4957, 4581, 4996, 4998, 4323, 514, 5259, 4999, -1814, -1814, + 5002, 2714, 2715, 2716, 5003, -715, 5004, 2899, 5008, -1814, + 5021, 5054, 5022, 5035, -1814, 6367, -1814, 51, 5053, 5058, + -1814, 5059, 5060, 5061, 2267, 514, 799, 5062, -1814, 5065, + -1814, 5085, 5086, 5087, 2146, -1814, 5099, 4849, 2268, 5134, + 2269, 5787, 764, 5135, 5138, -256, 1163, 1907, 5139, 5140, + 5147, 5149, 2717, 2718, -1870, -1814, 5163, 5176, 3964, 5177, + 2883, 5187, 5178, 5194, 5185, -1814, 5196, 5209, -1814, 5210, + 5219, 2076, 2270, -715, 5220, 5221, 5223, 5222, 5174, 5224, + 5227, 5237, 5226, 1906, 5228, 2271, 5229, 5230, -1814, 5258, + 4612, 5240, 5243, 5244, 5251, 5261, 5262, 5265, 5589, 5266, + 5269, 5590, 5271, -73, 5275, 5274, 5276, -1814, 5283, 5287, + 5749, -1814, 5288, 1905, 5293, 5289, 2719, 5295, 2272, 5298, + -1814, 5305, 5306, 5308, 5314, 5322, 5330, 5346, 5333, 5334, + 2831, 5820, 5332, 3965, 5341, 5342, 2273, 5351, 5376, -1814, + 3266, 4683, 4878, 5354, 5355, 654, 5449, 514, 5335, 5462, + 5470, 5464, 815, 5471, -1814, 5084, 5472, 5361, 1164, 5475, + 5477, -1814, 5484, 655, 5185, 5482, 1165, 5483, 5485, 5494, + 5493, 5492, 797, 5500, -1814, 5495, -1814, 5498, 2077, 2720, + 5511, 1166, 5515, 5516, 4394, 5550, 5552, 5548, 815, 5571, + 5573, 1167, 1168, 1169, 5575, 5577, 5579, 5582, 5580, 5585, + 5596, 1170, 5599, 5612, 1809, 5611, 5617, 5622, 5430, 656, + 5623, 5630, 5626, 5631, 2274, 5634, 3920, 5629, 5650, 5666, + 5646, 2275, 5667, 5648, 3920, 5665, 5669, -1870, 5655, 5677, + 5676, 2276, 4439, 5435, 5661, 5438, 657, 1904, 5663, 5680, + 2638, 5685, 5687, 5688, 658, 2277, 5690, 5359, 5703, 5710, + 3945, 5692, 5709, 5714, 5720, 5199, 5504, -1870, 6273, -1870, + 3946, 5725, -1870, -1870, 1157, 5363, 5740, 5747, 5754, 5748, + 5084, 5521, 864, 5753, 2721, 5755, 5757, 2278, 5760, 5771, + 2279, 5531, 865, 5052, 5052, 797, 5775, 5779, 5534, 5781, + 5535, 5536, 5791, 5785, 5797, 5520, 2280, 2831, 5364, 5801, + 5841, 5437, 5842, 5844, 797, 5530, 5852, 5854, 5853, 5860, + 5052, 1157, 5862, 5861, 5867, 5870, 5349, 5052, 5871, 5872, + 5878, 5880, 5084, 5884, 6096, 5893, 5894, 2281, 5897, 5917, + 5918, 5923, 5965, 5929, 4721, 5985, 5969, 5556, 5987, 1171, + 5986, 2722, 5981, 5988, 5971, 5993, 5998, 5994, 5995, 6007, + 6009, 1172, 5392, 5393, 6011, 6012, 6015, 6016, 6019, 6025, + 6029, 6032, 5406, 6037, 6040, 6054, 6096, 6056, 6068, 6074, + 6076, 6078, 6079, 6080, 5186, 6084, 5429, 6085, 6099, 2881, + 6086, 6100, 6101, 6102, 6108, 6134, 6082, 1907, 6156, 6141, + 6170, 6185, 6175, 6177, 5468, 6178, 6191, 6196, 6197, 6206, + 6207, 6208, 6188, 6209, -2509, 6212, 4846, 2723, 5603, 2724, + -2510, 4851, 6215, 6269, 6218, 2725, 6240, 6243, 6246, 6255, + 5041, 5610, 6254, 1906, 6274, 5436, 6272, 3797, 1157, 5052, + 6277, 6320, 6333, 6323, 6328, 6403, 6332, 6341, 5621, -1814, + 6334, 5621, 5621, 6336, 6342, 6349, 5627, 6354, 6358, 6359, + 5084, 1173, 6360, 1905, 6362, 6365, 6366, 6368, 5637, 6363, + 6364, 6374, 6389, 5645, 6375, 4189, 3710, 4437, 6402, 5562, + 5561, 5560, 4284, 6096, 5920, 2726, 4819, 2881, 5670, 5979, + 6114, 6267, 5187, 2926, 1382, 5465, 1801, 2442, 1806, 1174, + 4454, 4907, 4449, 5340, 4911, 3324, 2907, 3721, 4702, 5549, + 4495, 4475, 3222, 1175, 1494, 3411, 5804, 5803, 5694, 3412, + 5696, 5652, 5233, 3413, 4865, 5716, 5007, 5598, 5013, 2727, + 6140, 3581, 6400, 5089, 5090, 5091, 5092, 5093, 5094, 5095, + 5096, 5097, 5098, 5315, 5100, 5101, 5102, 5103, 5104, 5105, + 5106, 5107, 5108, 5109, 5761, 6223, 5113, 5114, 6322, 6281, + 6039, 5435, 5759, 5438, 1805, 3827, 2432, 5231, 5501, 5695, + 5967, 6155, 3795, 5697, 3795, 5543, 5628, 5236, 5370, 6199, + 6301, 6195, 6130, 6119, 6120, 6121, 6122, 1904, 3944, 4975, + 3949, 955, 4938, 6201, 4507, 6138, 2511, 1945, 3275, 5698, + 5084, 5052, 5084, 4578, 3956, 4990, 815, 5084, 4988, 5052, + 4992, 6327, 769, 1157, 5084, 5084, 9, 1157, 5052, 770, + 6294, 2728, -1814, 5717, 5084, 956, 6295, 5927, 4276, 5437, + 5084, 5052, 2729, 5052, 6167, 2638, 2710, 2711, 2712, 2713, + 1157, 5726, 6172, 5647, 1945, 6174, 14, 5847, 3291, 1157, + 5693, 4715, -1814, 5234, -1814, 5208, 3948, -1814, -1814, 5649, + 5218, 5738, 5691, 5541, 2628, 2451, 6005, 3098, 4260, 4258, + 797, 957, 3884, 6136, 5851, 20, 3257, 4488, 958, 4165, + 6266, 3702, 2714, 2715, 2716, 4002, 4928, 798, 1804, 23, + 4123, 5815, 2412, 4878, 6236, 1411, 4216, 2363, 2135, 5815, + 2411, 5815, 4336, 5263, 4173, 959, 5001, 4092, 4090, 2831, + 2825, 4143, 4140, 960, 1157, 1157, 1157, 1157, 4608, 5621, + 1945, 2884, 4528, 5784, 5280, 28, 2745, 1157, 2681, 2735, + 5789, 797, 755, 2717, 2718, 5084, 5084, 6268, 6117, 6353, + 6351, 5682, 3148, 3151, 5481, 797, 5032, 6125, 5343, 961, + 6126, 2355, 2356, 5436, 3141, 3807, 2357, 5812, 2358, 5813, + 2690, 807, 2360, 3920, 3162, 4597, 514, 6280, 4332, 807, + 5167, 807, 4596, 5829, 5166, 6018, 5859, 5593, 5329, 4339, + 3947, 5584, 5282, 4335, 5606, 1434, 2406, 4981, 2420, 39, + 5172, 780, 771, 3799, 962, 963, 3973, 2719, 5084, 1296, + 3368, 4927, 2246, 4000, 5084, 5045, 5856, 5772, 4361, 5031, + 5348, 2831, 6318, 5028, 1823, 3338, 3675, 1829, 5950, 1280, + 5052, 2999, 5950, 1945, 3676, 1281, 4210, 2413, 3715, 5802, + 1283, 5873, 5877, 5616, 3086, 2633, 4932, 6321, 5486, 6355, + 5689, 6401, 6405, 1947, 3998, 5815, 869, 3690, 5608, 4024, + 4201, 1238, 4202, 3418, 3640, 4203, 4198, 5892, 1239, 3397, + 2720, 50, 4195, 4194, 4637, 1193, 2129, 2150, 4985, 3108, + 4826, 4169, 5268, 3874, 5621, 6406, 5175, 2927, 2621, 2622, + 4278, 5741, 5924, 4879, 5084, 1330, 2309, 789, 773, 774, + 775, 1924, 4925, 3414, 4498, 6109, 5378, 1936, 5964, 5047, + 82, 6110, 6263, 1926, 4766, 5653, 5657, 4285, 5394, 1157, + 5658, 5654, 5674, 1945, 6391, 807, 5662, 0, 3944, 6393, + 3949, 1817, 964, 1937, 0, 901, 0, 2561, 0, 0, + 6000, 0, 0, 0, 0, 0, 0, 0, 0, 5084, + 863, 0, 868, 0, 0, 955, 0, 0, 543, 797, + 0, 815, 0, 0, 0, 2721, 0, 6001, 5084, 797, + 0, 0, 0, 0, 0, 0, 5950, 0, 0, 0, + 9, 0, 0, 0, 0, 0, 0, 0, 542, 956, + 0, 0, 0, 5950, 3225, 0, 3948, 0, 0, 0, + 0, 0, 965, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 867, 0, + 0, 0, 0, 0, 1945, 6055, 0, 1945, 3226, 0, + 6067, 0, 2722, 0, 0, 957, 6073, 0, 3380, 20, + 0, 0, 958, 0, 0, 0, 0, 0, 0, 1944, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 815, + 1157, 0, 901, 0, 0, 3227, 862, 0, 0, 959, + 0, 0, 0, 0, 0, 0, 0, 960, 0, 0, + 0, 0, 0, 0, 0, 797, 0, 0, 0, 28, + 5829, 0, 0, 0, 4683, 4683, 1991, 1157, 2723, 0, + 2724, 0, 0, 0, 0, 0, 2725, 0, 0, 0, + 0, 0, 0, 961, 0, 0, 0, 0, 0, 0, + 3947, 5877, 0, 0, 0, 0, 0, 0, 0, 0, + 5892, 0, 0, 0, 0, 0, 0, 5950, 0, 0, + 966, 0, 866, 815, 0, 0, 5815, 0, 0, 0, + 0, 0, 0, 39, 0, 0, 0, 0, 962, 963, + 0, 0, 0, 0, 0, 0, 2726, 0, 0, 0, + 0, 0, 2072, 0, 0, 6176, 0, 0, 0, 0, + 0, 0, 0, 5621, 0, 5621, 5621, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -1870, + -1870, 0, 0, 2070, 0, 0, 0, 0, 0, 0, + 2727, -1870, 0, 0, 6081, 0, 807, 2068, 0, 0, + 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, + 0, 0, 0, 5950, 0, 0, 0, 4878, 0, 6261, + 6261, 0, 0, 0, 2831, 0, 2637, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 82, 0, 815, 0, 0, 0, + 0, 0, 0, 0, -1870, 2152, 0, 0, 0, 0, + 0, 0, 0, 0, 5621, 5621, 964, 0, 6247, 5950, + 5950, 2128, 0, 0, 0, 5621, 0, 0, 0, 0, + 0, 0, 2728, 0, 0, 6149, 6150, 0, 0, 6260, + 6260, 0, -1870, 2729, 0, 0, -1870, 6161, 0, 0, + -1870, 0, 0, 0, 0, 0, 0, 0, 0, -1870, + -1870, 5950, 0, 0, 3613, 0, 0, 0, 4878, 815, + -1870, 0, 0, 0, 0, -1870, 0, -1870, 0, 0, + 0, -1870, 0, 5621, 0, 0, 965, 0, 0, -1870, + 0, -1870, 0, 0, 0, 2293, -1870, 3228, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2831, + 0, 0, 0, 0, 0, 0, -1870, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1870, 3229, 3230, -1870, + 3231, 3232, 3233, 3234, 3235, 0, 3236, 3237, 3238, 3239, + 3240, 3241, 3242, 3243, 0, 3244, 3245, 3246, 3247, -1870, + 0, 0, 0, 6230, 0, 0, 6231, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1870, 0, + 0, 0, -1870, 0, 0, 0, 0, 0, 0, 0, + 0, -1870, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2402, 2285, 0, 2402, + -1870, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2831, 0, 0, -1870, 815, 0, 0, 1945, + 0, 815, -1870, 0, 966, 0, 2831, 0, 1157, 0, + 1157, 0, 2831, 0, 0, -1870, 0, -1870, 0, 2831, + 0, 3248, 3249, 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, 1157, + 1157, 0, 0, 0, 0, 1157, 0, 0, 0, 1157, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 1157, + 1157, 1945, 0, 0, 0, 1157, 0, 0, 0, 1157, + 1157, 1157, 0, 1157, 1157, 1157, 1945, 1945, 0, 0, + 0, 0, 0, 1157, 0, 1157, 0, 0, 1157, 1157, + 1157, 1157, 0, 1157, 0, 1157, 1157, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 1157, 1157, 1157, 1157, 0, 1157, 1157, 1157, 1157, 1157, + 1157, 0, 1157, 1157, 0, 1157, 1157, 0, 1157, 1157, + 0, 0, 1157, 1157, 0, 1157, 1157, 0, 1157, 0, + 1157, 0, 0, 0, 1157, 1157, 1157, 0, 0, 1157, + 1157, 1157, 1157, 0, 1157, 0, 0, 0, 0, 0, + 0, 1157, 0, 4721, 4, 5, 0, 1157, 1157, 1157, + 1157, 0, 0, 0, 0, 0, 0, 3943, 1157, 1157, + 0, 1157, 1157, 0, 0, 1157, 1157, 1157, 1157, 1157, + 1157, 1157, 1157, 1157, 1157, 1157, 1157, 1157, 6030, 6031, + 1157, 6033, 6034, 6035, 6036, 1945, 0, 0, 0, 0, + 0, 0, 1945, 0, 0, 0, -904, 0, -904, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1157, 0, 0, 0, 0, + 0, 0, 0, 0, 2430, 0, 0, 0, 0, 0, + -1870, 0, 0, 1945, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, -1062, -1062, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4721, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 4722, 1902, 1902, 1902, 0, 0, 0, 3613, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4839, 3943, + 4840, 4841, 0, 3943, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6148, 0, + 0, 6151, 4842, 0, 4843, 0, 0, 0, 0, 6159, + 4844, 0, 6162, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1157, 0, 1157, 0, 0, 0, 0, 0, + 4724, 2430, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4845, 0, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4722, 0, 0, + 0, 2625, 0, 0, 0, 0, 0, 4725, 4726, 4727, + 0, 0, 0, -1870, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4846, 2638, 4728, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1870, 0, -1870, 0, 0, -1870, -1870, + 0, 0, 0, 0, 0, 0, 4847, 0, 4848, 0, + 0, 0, 0, 0, 0, 0, 1157, 4724, 0, 4849, + 0, 0, 1945, 0, 1945, 0, 0, 0, 0, 0, + 0, 4729, 0, 4730, 0, 0, 0, 0, 0, 0, + 0, 0, 4850, 1991, 1157, 0, 0, 0, 0, 0, + 0, -904, 1157, 4731, 0, 0, 0, 0, 2744, 1991, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4732, 0, 0, 4725, 4726, 4727, 0, 4733, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4734, 4728, 0, 0, 0, 0, 0, + 4735, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4736, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 955, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4851, 0, 0, 0, 0, 0, 0, 0, 4729, 0, + 4730, 0, 0, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 956, 0, 0, 0, 0, 0, 0, 0, + 4731, 0, 4737, 0, 0, 0, 0, 4852, 0, 0, + 0, 0, 4738, 14, 0, 0, 0, 2892, 4732, 0, + 0, 0, 0, 0, 1991, 4733, 0, 0, -3669, -3669, + -3669, 0, 0, 0, 0, 0, 0, 0, 957, 0, + 4734, 0, 20, 0, 0, 958, 0, 4735, 0, 0, + 4739, 4853, 4854, 0, 0, 0, 23, 0, 4855, 0, + 0, 0, 4736, 4740, 0, 2959, 0, 0, 0, 0, + 4856, 0, 959, 0, 0, 0, 0, 0, 0, 0, + 960, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 4857, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4741, 0, 0, 0, 0, 0, 4742, 0, + 0, 0, 0, 0, 0, 4858, 961, 0, 0, 4737, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4738, + 0, 0, 0, 1945, 1157, 0, 0, 0, 0, 0, + 0, 0, 1157, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, + 0, 962, 963, 0, 0, 0, 4743, 4739, 0, 4719, + 1799, 4720, 0, 4744, 0, 0, 4721, 4, 5, 0, + 4740, 0, 4859, 0, 0, 0, 0, 0, 0, 901, + 1991, 0, 0, 0, 0, 0, 1157, 0, 0, 0, + 0, 0, 0, 0, 0, 4745, 0, 1945, 1945, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4741, + 4746, 4747, 0, 0, 0, 4742, -3669, 0, 50, -904, + 955, -904, 0, 4748, 0, 0, 0, 0, 0, 1157, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 4860, 0, 0, 0, 0, 9, 0, 2430, 0, 0, + 0, 4861, 4862, 4863, 956, 0, 0, 82, 0, 0, + 0, 0, 1902, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4743, 0, 14, 0, 0, 1945, 964, + 4744, 0, 0, 0, 2402, 0, 3171, 5118, 1157, 0, + 0, 1945, 0, 4722, 0, 0, 0, 0, 0, 0, + 957, 0, 0, 0, 20, 0, 1157, 958, 0, 0, + 1157, 1157, 4745, 1157, 1157, 4723, 0, 0, 23, 0, + 0, 0, 1157, 0, 1157, 0, 0, 4746, 4747, 0, + 0, 0, -3669, 0, 959, 0, 0, 0, 0, 0, + 4748, 0, 960, 0, 4864, 0, 0, 0, 0, 965, + 0, 0, 0, 0, 28, 1157, 0, 0, 0, 0, + 0, 0, 0, 4724, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 955, 961, 0, + 0, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1157, 0, 0, 0, 1945, 0, 0, + 0, 0, 9, 0, 0, 0, 1157, 0, -1062, 0, + 0, 956, 0, 0, 0, 0, 0, 1157, 39, 0, + 4725, 4726, 4727, 962, 963, 0, 0, 0, 0, 0, + 0, 0, 14, 1157, 0, 0, 0, 0, 0, 0, + 4728, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 957, 0, 0, + 0, 20, 0, 0, 958, 0, 0, 0, 0, 0, + 1157, 0, 0, 0, 0, 23, 0, 1157, 0, 0, + 0, 0, 0, 0, 1945, 0, 0, 966, 0, 0, + 50, 959, 0, 0, 4729, 0, 4730, 1158, -3832, 960, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 28, 0, 0, -904, 0, 4731, 0, 0, 0, + 0, 4759, 4759, 1945, 1945, 0, 0, 0, 0, 82, + 0, 0, 0, 0, 4732, 961, 0, 0, 0, 0, + 0, 4733, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 964, 0, 0, 0, 0, 4734, 0, 0, 0, + 0, 0, 0, 4735, 0, 3420, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 1157, 0, 4736, 0, + 962, 963, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3832, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 1158, 0, 0, 0, 0, 0, + 0, 965, 1945, 0, 1945, 1945, 1945, 0, 1157, 0, + 0, 0, 4759, 1157, 1157, 4737, 0, 0, 0, 1991, + 3461, 0, 0, 0, 0, 4738, 0, 50, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4739, 0, 0, 82, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4740, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 964, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3531, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3546, 0, 4741, 0, 0, 0, 0, + 0, 4742, 0, 0, 4, 5, 0, 0, 0, 0, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 966, + 0, 1922, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1241, 0, 1242, 0, 0, 0, 965, 0, + 0, 0, 676, 0, 0, 0, 0, 0, 0, 1158, + 0, 0, 0, 1158, 0, 0, 1210, 3943, 0, 4743, + 0, 0, 0, 0, 1243, 1244, 4744, 0, 0, 0, + 0, 0, 0, 0, 1245, 1945, 1158, 0, 0, 0, + 0, 0, 0, 3603, 0, 1158, 0, 0, 16, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 4745, 2152, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4746, 4747, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4748, 0, 0, 1157, + 1246, 0, 0, 1157, 0, 0, 1157, 0, 0, 0, + 0, 0, 0, 0, 1247, 1157, 0, 0, 0, 0, + 1158, 1158, 1158, 1158, 1157, 0, 1157, 1157, 0, 1157, + 1157, 1157, 1157, 1158, 1157, 0, 1157, 1157, 0, 1157, + 0, 0, 0, 0, 0, 0, 966, 1157, 1157, 0, + 0, 0, 1157, 1157, 1157, 0, 2625, 0, 0, 0, + 0, 0, 1157, 1157, 1157, 0, 1157, 0, 1157, 1248, + 1157, 0, 1157, 0, 1157, 0, 0, 0, 0, 1157, + 1157, 1249, 1157, 1157, 1157, 0, 0, 0, 1157, 0, + 0, 1157, 0, 0, 0, 2293, 2293, 0, 0, 0, + 1157, 0, 0, 1157, 0, 1157, 1157, 1157, 0, 0, + 1157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4759, 0, 0, 4721, 4, 5, 0, 0, + 0, 0, 1157, 0, 1157, 0, 1250, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1157, 1157, 1157, + 1157, 1945, 1157, 5538, 0, 4840, 0, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 0, 0, 4842, 0, 1251, + 0, 0, 0, 0, 0, 5539, 0, 0, 0, 0, + 0, 0, 0, 0, 2402, 0, 2402, 2402, 3819, 1252, + 0, 0, 0, 0, 0, 1157, 2430, 0, 1253, 0, + 0, 0, 0, 0, 0, 1158, 0, 5540, 0, 1157, + 0, 1254, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1255, 0, 0, 1945, 4759, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4722, 0, 0, 1256, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4846, 0, 0, 0, -2264, 1257, 0, 0, 1258, 0, + 1259, 1157, 0, 905, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1902, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4848, 0, 0, 0, 1260, 1261, 0, + 0, 0, 4724, 1262, 1263, 906, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1264, 0, 0, 0, 0, 0, 908, 4850, 0, 0, + 0, 0, 0, 0, 0, 909, 1158, 0, 0, 0, + 0, 1265, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 910, 0, 0, 4725, + 4726, 4727, 0, 1266, 1157, 0, 0, 2625, 0, 0, + 911, 0, 0, 1158, 0, 912, 1945, 0, 0, 4728, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 955, 0, 0, 0, 913, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1267, 0, 9, + 0, 0, 0, 0, 0, 4851, 0, 0, 956, 0, + 0, 0, 1268, 4729, 0, 4730, 0, 0, 0, 0, + 0, 1269, 0, 0, 1270, 1271, 0, 0, 0, -3660, + 0, 0, 0, 0, 0, 4731, 0, 914, 0, 1272, + 0, 915, 0, 0, 0, 0, 0, 4759, 0, 4759, + 0, 5434, 0, 4732, 957, 0, 0, 0, -3659, 916, + 4733, 958, 0, 917, 918, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 4734, 1273, 0, 0, 0, + 0, 0, 4735, 0, 1274, 0, 4853, 0, 959, 0, + 0, 0, 0, 4855, 919, 0, 960, 4736, 0, 0, + 0, 920, 921, -3286, 0, 1275, 0, 0, -3659, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 0, 4857, 0, 0, 0, + 1157, 0, 961, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1157, 0, 4146, 4737, -3286, 0, 0, 2608, 0, + 0, 4759, 1276, 0, 4738, 0, 1157, 0, 0, 1157, + 1991, 0, -3659, 0, 0, 0, 0, 962, 963, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1157, 1157, 0, 0, 2609, 1157, + 0, 0, 4739, 1902, 0, 0, 0, 0, 1945, 0, + 0, 0, 0, 0, 0, 4740, 0, 4859, 0, 0, + 0, 1157, 0, 1157, 0, 1157, 0, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2959, 0, 0, + 0, 2610, 1157, 0, -3659, 0, 2611, 0, 1945, 0, + 0, 0, 0, 0, 4741, 0, 0, 2612, 2613, 0, + 4742, 1157, 1157, 0, 0, 0, 1157, 0, 1157, 0, + 1157, 0, 0, 0, 0, 1157, 0, 0, 0, 0, + 0, 0, 0, -3660, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1799, 964, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1945, 0, 4743, 0, + 0, 0, 1157, 0, 0, 4744, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1157, 0, 0, 0, + 1157, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1158, 0, 1158, 4745, 1157, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5434, + 0, 0, 4746, 4747, 0, 965, 0, 0, 0, 0, + 0, 0, 1945, 0, 0, 4748, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3943, 0, 2402, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2614, 0, 0, 1158, 1158, 0, 0, 0, + 0, 1158, 2615, 0, 0, 1158, 1158, 1158, 0, 0, + 0, 0, 0, 2616, 0, 1158, 1158, 0, 0, 2617, + 0, 1158, 0, 0, 0, 1158, 1158, 1158, 0, 1158, + 1158, 1158, 0, 1157, 0, 0, 0, 0, 0, 1158, + 0, 1158, 0, 1157, 1158, 1158, 1158, 1158, 0, 1158, + 2618, 1158, 1158, 0, 2619, 0, 0, 1157, 0, 1945, + 1157, 0, 0, 0, 0, 1158, 1158, 1158, 1158, 1158, + 0, 1158, 1158, 1158, 1158, 1158, 1158, 0, 1158, 1158, + 0, 1158, 1158, 2620, 1158, 1158, 0, 0, 1158, 1158, + 0, 1158, 1158, 966, 1158, 0, 1158, 0, 0, 0, + 1158, 1158, 1158, 0, 0, 1158, 1158, 1158, 1158, 0, + 1158, 0, 0, 0, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 1158, 1158, 1158, 1158, 0, 0, 0, + 0, 0, 0, 0, 1158, 1158, 0, 1158, 1158, 0, + 2402, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, + 1158, 1158, 1158, 1158, 0, 0, 1158, 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, 1158, 0, 1512, 1513, 0, 0, 0, 1517, 1518, + 0, 0, 0, 0, 0, 0, 0, 0, 1527, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4540, 0, 0, 1549, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1562, 0, 0, 0, + 1157, 1157, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 1577, 0, 6118, 0, 1157, 1157, 1157, 0, + 4573, 0, 0, 0, 0, 0, 0, 4759, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1157, 1157, 1601, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4759, 3943, 0, 1158, 4759, + 1158, 1620, 1621, 1622, 1157, 0, 0, 0, 0, 0, + 0, 1630, 1631, 1632, 0, 0, 1157, 0, 862, 0, + 0, 0, 0, 0, 0, 1157, 0, 0, 4632, 1647, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1157, 0, 0, 0, 0, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1676, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1703, 0, + 0, 0, 0, 0, 2293, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4759, 0, 0, 0, + 0, 1725, 1726, 1727, 4759, 0, 0, 955, 0, 0, + 4759, 4759, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1746, 1747, 4721, 4, 5, 4721, 4, + 5, 0, 9, 4759, 0, 0, 0, 0, 0, 0, + 1158, 956, 0, 0, 0, 0, 0, 0, 1158, 0, + 4759, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 1761, 0, 1762, 1763, 0, 0, 0, -904, 0, + -904, 2402, 0, 0, 0, 0, 0, 957, 0, 0, + 1764, 20, 0, 0, 958, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 23, 2430, 0, 0, 2430, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 959, 0, 0, 0, 0, 1765, 1766, 0, 960, + 0, 0, 0, 0, 0, 0, 0, 4759, 0, 0, + 0, 28, 0, 0, 0, 0, 0, 0, 0, 4759, + 0, 0, 4722, 4759, 0, 4722, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 961, 0, 0, 0, 0, + 0, 0, 1768, 0, 0, 0, 0, 0, 0, 0, + 1157, 1157, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4759, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, + 962, 963, 0, 1769, 0, 0, 0, 0, 0, 0, + 0, 0, 4724, 0, 0, 4724, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1157, 0, 0, 1945, 0, 0, + 0, 0, 0, 0, 0, 1158, 0, 0, 4759, 6242, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1770, 1771, 50, 0, 4725, + 4726, 4727, 4725, 4726, 4727, 0, 0, 0, 0, 0, + 4759, 1772, 1773, 0, 0, 0, 0, 0, 1157, 4728, + 1158, 0, 4728, 0, 0, 0, 0, 0, 1158, 1158, + 0, 0, 0, 0, 0, 0, 82, 1945, 0, 0, + 0, 0, 0, 0, 0, 1157, 1157, 0, 0, 0, + 0, 0, 0, 1775, 0, 0, 0, 0, 964, 4759, + 0, 4759, 4759, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4729, 0, 4730, 4729, 0, 4730, 0, + 1157, 0, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -904, 0, 4731, 0, 0, 4731, 0, + 0, 0, 4759, 0, 0, 0, 0, 0, 0, 0, + 0, 3987, 0, 4732, 0, 0, 4732, 0, 0, 0, + 4733, 0, 0, 4733, 0, 1158, 1158, 1158, 965, 0, + 0, 0, 0, 0, 0, 4734, 0, 4759, 4734, 0, + 0, 0, 4735, 0, 0, 4735, 0, 1777, 0, 955, + 1778, 0, 0, 1779, 0, 0, 0, 4736, 0, 0, + 4736, 0, 0, 0, 0, 0, 1157, 4759, 1157, 0, + 0, 0, 0, 0, 9, 0, 1780, 0, 0, 0, + 0, 0, 0, 956, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1782, 0, 0, 0, + 0, 0, 1158, 0, 14, 0, 1158, 1158, 0, 1158, + 1158, 0, 0, 0, 4737, 0, 0, 4737, 1158, 0, + 1158, 0, 0, 0, 4738, 0, 0, 4738, 0, 957, + 0, 0, 0, 20, 0, 0, 958, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4739, 959, 0, 4739, 966, 0, 0, 0, + 0, 960, 0, 0, 0, 4740, 0, 1158, 4740, 0, + 0, 1157, 0, 28, 0, 0, 0, 0, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 1157, 0, 961, 0, 0, + 0, 0, 0, 1158, 4741, 0, 0, 4741, 0, 0, + 4742, 0, 0, 4742, 0, 0, 0, 0, 1157, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1157, 1157, 1159, 39, 0, 0, + 0, 0, 962, 963, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 1158, 0, 0, 0, 0, 4743, 0, + 0, 4743, 0, 0, 0, 4744, 0, 0, 4744, 0, + 0, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2402, + 0, 0, 0, 0, 0, 0, 0, 4745, 0, 50, + 4745, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4746, 4747, 0, 4746, 4747, 0, 0, 0, + 0, 0, 0, 0, 0, 4748, 0, 0, 4748, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 0, 0, 0, 0, 4146, + 964, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1158, 0, 0, 0, 0, 1158, + 1158, 0, 0, 4222, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 965, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 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, 1157, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1157, + 0, 0, 0, 0, 0, 0, 0, 1945, 0, 0, + 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 1158, 0, 1157, + 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, 1159, 0, 0, 966, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 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, 1157, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 1158, + 0, 0, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 1159, 1159, 1159, 1159, + 1158, 0, 1158, 1158, 0, 1158, 1158, 1158, 1158, 1159, + 1158, 0, 1158, 1158, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 1158, 1158, 0, 0, 0, 1158, 1158, + 1158, 0, 0, 0, 0, 0, 0, 0, 1158, 1158, + 1158, 0, 1158, 0, 1158, 0, 1158, 0, 1158, 0, + 1158, 0, 0, 0, 0, 1158, 1158, 0, 1158, 1158, + 1158, 0, 0, 0, 1158, 0, 0, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 1158, 0, 0, 1158, + 0, 1158, 1158, 1158, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1157, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, + 1158, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1158, 1158, 1158, 1158, 0, 1158, 0, + 0, 0, 0, 1158, 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, 796, 0, + 0, 1158, 0, 1945, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 1158, 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, 1945, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1157, 0, 0, + 0, 0, 0, 0, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2625, + 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, 1157, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 1157, 0, 0, 0, 0, 1314, + 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, 1403, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1157, 0, 0, 0, 1157, 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, 1158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1895, 0, 0, 0, + 1158, 1158, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1157, 1158, 0, 1158, + 0, 1158, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1158, 1158, 0, + 0, 0, 1158, 0, 1158, 0, 1158, 0, 0, 0, + 0, 1158, 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, 1158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 0, 1158, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 1159, 0, 1158, 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, 1159, 1159, 0, 0, 0, 0, 1159, 0, 0, + 0, 1159, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 1159, 1159, 0, 0, 0, 0, 1159, 0, 0, + 0, 1159, 1159, 1159, 0, 1159, 1159, 1159, 0, 1158, + 0, 0, 0, 0, 0, 1159, 0, 1159, 0, 1158, + 1159, 1159, 1159, 1159, 0, 1159, 0, 1159, 1159, 0, + 0, 0, 0, 1158, 0, 0, 1158, 0, 0, 0, + 0, 1159, 1159, 1159, 1159, 1159, 0, 1159, 1159, 1159, + 1159, 1159, 1159, 0, 1159, 1159, 0, 1159, 1159, 0, + 1159, 1159, 0, 0, 1159, 1159, 0, 1159, 1159, 0, + 1159, 0, 1159, 0, 0, 0, 1159, 1159, 1159, 0, + 0, 1159, 1159, 1159, 1159, 0, 1159, 0, 0, 2247, + 0, 0, 0, 1159, 0, 2255, 0, 0, 0, 1159, + 1159, 1159, 1159, 0, 0, 0, 0, 0, 0, 0, + 1159, 1159, 0, 1159, 1159, 0, 0, 1159, 1159, 1159, + 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, + 0, 0, 1159, 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, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1403, 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, 1158, 1158, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 1158, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2443, 0, 0, 1158, 1158, 0, 0, + 0, 0, 0, 0, 2455, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 1159, 0, 0, 0, + 1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 1158, 1158, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 1158, + 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, 1159, 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, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 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, 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, 0, 0, 0, 0, 0, 1158, 1158, 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, 2565, 0, 2565, 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, + 1158, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 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, 1158, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 1158, 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, 1158, 0, 1159, 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, 1159, 1159, 1159, 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, 2809, + 0, 0, 0, 2813, 0, 0, 0, 0, 0, 2819, + 0, 0, 1158, 0, 1158, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 1159, 1159, 0, 1159, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2919, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1123, 0, 0, 0, + 0, 0, 0, 1159, 0, 0, 0, 1158, 0, 0, + 0, 0, 0, 2973, 0, 1159, 0, 0, 2979, 0, + 2981, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1158, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3016, 0, 0, + 1158, 1158, 0, 0, 0, 0, 0, 0, 0, 3026, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 1159, + 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, + 1491, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3114, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 0, 1403, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1403, 1403, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 1159, 1159, 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, 1159, 3209, 0, 0, 0, 0, 0, 3212, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1956, + 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1158, + 0, 0, 1982, 0, 0, 0, 0, 0, 0, 0, + 0, 1996, 1159, 1159, 0, 1158, 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, 2069, + 0, 0, 0, 0, 0, 0, 0, 0, 3360, 3360, + 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, 3375, 0, 0, 0, + 0, 0, 0, 0, 0, 1158, 1895, 0, 0, 0, + 0, 1159, 0, 0, 0, 1159, 0, 0, 1159, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 1159, 1159, + 0, 1159, 1159, 1159, 1159, 0, 1159, 0, 1159, 1159, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 1159, + 1159, 0, 0, 0, 1159, 1159, 1159, 0, 0, 0, + 0, 0, 0, 0, 1159, 1159, 1159, 0, 1159, 0, + 1159, 0, 1159, 0, 1159, 0, 1159, 0, 0, 0, + 0, 1159, 1159, 0, 1159, 1159, 1159, 0, 0, 0, + 1159, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 1159, 0, 1159, 1159, 1159, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 1159, 0, 0, 1159, + 0, 2263, 0, 0, 0, 0, 0, 0, 0, 1159, + 1159, 1159, 1159, 0, 1159, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 3515, 0, 0, 0, 3519, 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, 1159, 0, 1158, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 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, 1158, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1158, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 3360, 3360, + 0, 0, 2425, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1159, 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, 2464, + 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, 1158, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 0, 3679, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 3703, 0, 0, 0, 0, 0, + 1158, 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, 0, 3762, 0, 0, 0, 0, + 0, 0, 0, 0, 3771, 0, 0, 0, 0, 1403, + 0, 0, 0, 0, 0, 1403, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1403, 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, 1158, + 0, 0, 0, 1158, 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, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 1159, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1158, 1159, 0, 1159, 0, 1159, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1159, 0, 0, 0, 0, 0, + 0, 1403, 0, 0, 3983, 0, 0, 0, 0, 0, + 0, 0, 0, 1159, 1159, 0, 0, 0, 1159, 0, + 1159, 0, 1159, 0, 0, 0, 0, 1159, 0, 0, + 2631, 0, 2631, 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, 1159, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 1159, 0, 0, 0, 0, 2680, 0, 0, + 0, 2685, 0, 2687, 0, 0, 0, 0, 0, 0, + 1159, 2702, 2703, 0, 0, 0, 0, 2732, 0, 0, + 0, 2737, 2738, 2739, 0, 2741, 2742, 2743, 0, 0, + 0, 0, 0, 0, 0, 2751, 0, 2754, 0, 0, + 2755, 2756, 2757, 2758, 0, 0, 0, 2762, 2763, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2774, 2775, 2782, 2786, 2787, 0, 2790, 2791, 2792, + 2795, 2796, 0, 0, 2799, 2800, 0, 2806, 2807, 0, + 2810, 2811, 0, 0, 0, 2815, 0, 2817, 2818, 0, + 2820, 0, 2821, 0, 0, 0, 2824, 2782, 2826, 0, + 0, 2832, 0, 2834, 2835, 1159, 2836, 0, 0, 0, + 0, 0, 0, 2840, 0, 1159, 0, 0, 0, 2842, + 2843, 2844, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2919, 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, 2940, 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, 0, 0, 0, 0, 0, 0, 4227, 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, 3052, 0, 3057, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 1159, 0, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4300, 1159, 1159, + 1159, 3080, 0, 0, 0, 0, 0, 0, 0, 1403, + 0, 0, 0, 1403, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 3158, 0, + 0, 0, 1159, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 1159, 3182, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1403, 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, 4489, 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, 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, 3369, 1159, 1159, 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, 3421, 0, 0, 0, + 0, 0, 0, 0, 3428, 3429, 0, 0, 4623, 0, + 0, 0, 0, 0, 0, 0, 1159, 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, 3448, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 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, 1159, 1159, 0, + 0, 3487, 3489, 3491, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4712, 0, 0, + 0, 0, 4717, 4718, 0, 0, 0, 0, 0, 0, + 0, 0, 1159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1403, 1403, 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, 3553, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 3561, 0, 3562, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, + 1159, 0, 0, 0, 0, 0, 0, 3587, 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, 3601, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2425, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2425, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3656, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3662, 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, 1159, 0, 0, 0, 0, 0, 0, + 0, 0, 3682, 0, 0, 0, 0, 0, 0, 3057, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1159, 1159, 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, 3776, 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, 3801, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3801, 0, 0, 0, 0, 2425, 2425, 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, 3887, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5064, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5088, 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, 3950, 3951, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1159, 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, 4025, 0, 0, 0, 4027, 0, 0, 4028, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4056, 0, 0, 0, + 0, 4060, 4061, 4062, 4063, 0, 4064, 0, 4065, 4066, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4071, + 4072, 0, 0, 0, 4073, 4074, 4075, 0, 0, 0, + 0, 0, 0, 0, 4077, 4078, 4079, 0, 4080, 0, + 4082, 1159, 4084, 0, 4086, 0, 4088, 0, 0, 0, + 0, 2792, 4091, 0, 2792, 0, 4094, 0, 0, 0, + 4095, 0, 0, 4096, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4103, 0, 4104, 4105, 4106, + 0, 0, 4107, 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, 4129, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4139, 4142, 0, 0, 4147, 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, 5377, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159, + 0, 0, 0, 0, 0, 0, 0, 4180, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2425, 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, + 3057, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, + 0, 0, 0, 3057, 0, 0, 0, 0, 0, 0, + 5508, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5528, + 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159, + 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, 4328, 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, 1159, 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, 1159, 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, + 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, 4474, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4494, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1159, 0, 0, 4502, 1159, + 0, 4503, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4523, 4524, 0, 0, + 0, 4529, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4549, 0, 4550, 0, 4551, 0, 4552, + 0, 0, 0, 0, 0, 5744, 0, 0, 0, 0, + 0, 0, 0, 0, 4567, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4588, 4589, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 3801, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5790, 0, 1159, 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, 2425, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2425, 0, + 0, 0, 2425, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3057, 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, 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, 4795, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3801, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3801, + 0, 0, 4809, 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, 5997, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6003, 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, 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, + 6113, 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, 4951, 4952, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4959, 4960, + 4961, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4983, 4984, 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, 5006, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2425, 0, 0, + 0, 0, 2425, 2425, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3057, 0, 0, 0, 3057, 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, 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, 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, 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, 5238, 5239, 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, 3801, 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, + 3801, 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, 2425, 2425, 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, 3057, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5474, 0, + 5476, 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, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5578, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3801, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2425, 2425, 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, 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, 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, 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, 3801, 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, 3057, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5786, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 996, 0, 0, 0, 0, 997, + 998, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, 6006, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 1015, 1016, 0, 0, 0, 0, 0, 0, 0, 1017, + 1018, 0, 1019, 0, 0, 0, 0, 0, 0, 1020, + 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, + 0, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, + 1029, 0, 0, 1030, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, + 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, + 0, 0, 1038, 0, 0, 571, 0, 0, 0, 0, + 0, 1039, 0, 0, 1040, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 6135, + 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, + 0, 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, + 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, + 0, 1058, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1059, 0, 0, 0, 0, 0, 0, 0, + 1060, 1061, 0, 0, 0, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 2069, 0, 0, 0, 0, 1062, + 0, 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1068, 1069, 1070, 0, 0, 49, 0, 0, 1071, + 1072, 0, 0, 0, 0, 51, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 1073, 1074, + 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, 68, + 69, 70, 1078, 72, 73, 74, 75, 76, 77, 78, + 1079, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 1080, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 1085, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 1086, 1087, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 3057, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 1088, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 1089, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 1090, 1091, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 1092, 264, 265, + 266, 267, 268, 1093, 270, 271, 272, 273, 274, 275, + 276, 277, 1094, 1095, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 3057, 293, + 294, 295, 296, 595, 297, 298, 1096, 300, 301, 302, + 303, 304, 305, 306, 1097, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 1098, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 1099, 363, 364, 365, 601, 367, 368, 1100, 370, 371, + 372, 373, 374, 375, 1101, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 1102, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, + 431, 432, 1107, 1108, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 1109, 448, 1110, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 1111, 607, 1112, 464, 465, 466, 0, 467, 608, 469, + 1113, 0, 0, 0, 0, 0, 0, 0, 0, 1114, + 1115, 0, 0, 996, 0, 1116, 0, 0, 997, 998, + 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, + 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, + 1016, 0, 0, 0, 2779, 0, 0, 0, 1017, 1018, + 0, 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, + 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, + 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 1029, + 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, + 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, + 0, 1038, 0, 0, 571, 0, 0, 0, 0, 0, + 1039, 0, 0, 1040, 0, 0, 0, 0, 0, 0, + 0, 0, 1041, 2780, 1042, 0, 1043, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, + 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, + 1052, 1053, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 1054, + 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, 0, + 1058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1059, 0, 0, 0, 0, 0, 0, 0, 1060, + 1061, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1062, 0, + 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 2781, 0, + 1067, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, + 1076, 61, 62, 63, 1077, 65, 66, 67, 68, 69, + 70, 1078, 72, 73, 74, 75, 76, 77, 78, 1079, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 1080, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 1081, + 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 1085, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 1086, 1087, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 1088, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 1089, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 1090, 1091, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 1092, 264, 265, 266, + 267, 268, 1093, 270, 271, 272, 273, 274, 275, 276, + 277, 1094, 1095, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 1096, 300, 301, 302, 303, + 304, 305, 306, 1097, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 1098, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 1099, + 363, 364, 365, 601, 367, 368, 1100, 370, 371, 372, + 373, 374, 375, 1101, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 1102, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, + 432, 1107, 1108, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 1109, 448, 1110, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 1111, + 607, 1112, 464, 465, 466, 0, 467, 608, 469, 1113, + 0, 0, 0, 0, 0, 0, 0, 0, 1114, 1115, + 0, 0, 996, 0, 1116, 0, 0, 997, 998, 1117, + 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, + 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 2421, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2422, 1014, 1015, 1016, + 0, 0, 0, 0, 0, 0, 0, 1017, 1018, 0, + 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, 0, + 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, + 1028, 0, 0, 0, 0, 0, 0, 0, 2423, 0, + 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 1031, + 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, 0, + 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, + 1038, 0, 0, 571, 0, 0, 0, 0, 0, 1039, + 0, 0, 1040, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1044, + 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, 0, + 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, 1052, + 1053, 0, 2424, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 1054, 1055, + 1056, 0, 1057, 0, 0, 0, 0, 0, 0, 1058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1059, 0, 0, 0, 0, 0, 0, 0, 1060, 1061, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1062, 0, 0, + 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1068, + 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, + 61, 62, 63, 1077, 65, 66, 67, 68, 69, 70, + 1078, 72, 73, 74, 75, 76, 77, 78, 1079, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 1080, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 1081, 108, + 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 1085, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 1086, + 1087, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 1088, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 1089, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 1090, + 1091, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 1092, 264, 265, 266, 267, + 268, 1093, 270, 271, 272, 273, 274, 275, 276, 277, + 1094, 1095, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 1096, 300, 301, 302, 303, 304, + 305, 306, 1097, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 1098, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 1099, 363, + 364, 365, 601, 367, 368, 1100, 370, 371, 372, 373, + 374, 375, 1101, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 1102, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, + 1107, 1108, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 1109, 448, 1110, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 1111, 607, + 1112, 464, 465, 466, 0, 467, 608, 469, 1113, 0, + 0, 0, 0, 0, 0, 0, 0, 1114, 1115, 0, + 0, 996, 0, 1116, 0, 0, 997, 998, 1117, 0, + 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, + 0, 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, + 0, 0, 0, 0, 0, 0, 1020, 1021, 0, 0, + 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, + 0, 0, 0, 0, 0, 0, 0, 1029, 0, 0, + 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 1031, 1032, + 1033, 0, 1034, 0, 0, 0, 0, 0, 0, 0, + 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, + 0, 0, 571, 0, 0, 0, 0, 0, 1039, 0, + 0, 1040, 0, 0, 0, 0, 0, 0, 0, 0, + 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1044, 1045, + 0, 1046, 0, 0, 0, 1047, 0, 0, 0, 0, + 1048, 0, 0, 29, 1049, 0, 1050, 1051, 1052, 1053, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, + 0, 1057, 0, 0, 0, 0, 0, 0, 1058, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1059, + 0, 0, 0, 0, 0, 0, 0, 1060, 1061, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1062, 0, 0, 0, + 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1068, 1069, + 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, 1955, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, + 62, 63, 1077, 65, 66, 67, 68, 69, 70, 1078, + 72, 73, 74, 75, 76, 77, 78, 1079, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 1080, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 1081, 108, 1082, + 1083, 1084, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 1085, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 1086, 1087, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 1088, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 1089, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 1090, 1091, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 1092, 264, 265, 266, 267, 268, + 1093, 270, 271, 272, 273, 274, 275, 276, 277, 1094, + 1095, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 1096, 300, 301, 302, 303, 304, 305, + 306, 1097, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 1098, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 1099, 363, 364, + 365, 601, 367, 368, 1100, 370, 371, 372, 373, 374, + 375, 1101, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 1102, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, + 1108, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 1109, 448, 1110, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 1111, 607, 1112, + 464, 465, 466, 0, 467, 608, 469, 1113, 0, 0, + 0, 0, 0, 0, 0, 0, 1114, 1115, 0, 0, + 996, 0, 1116, 0, 0, 997, 998, 1117, 0, 0, + 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, + 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, + 0, 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, + 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, + 0, 0, 0, 0, 0, 0, 3054, 0, 0, 1030, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, + 0, 1034, 0, 0, 0, 0, 0, 0, 0, 1035, + 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, 0, + 3055, 571, 0, 0, 0, 0, 0, 1039, 0, 0, + 1040, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 1042, 0, 1043, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1044, 1045, 0, + 1046, 0, 0, 0, 1047, 0, 0, 0, 0, 1048, + 0, 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, + 1057, 0, 0, 0, 0, 0, 0, 1058, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1059, 0, + 0, 0, 0, 0, 0, 0, 1060, 1061, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1062, 0, 0, 0, 0, + 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, + 0, 0, 0, 0, 0, 1071, 1072, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, + 63, 1077, 65, 66, 67, 68, 69, 70, 1078, 72, + 73, 74, 75, 76, 77, 78, 1079, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 1080, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, + 1084, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 1085, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 1086, 1087, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 1088, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 1089, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 1090, 1091, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 1092, 264, 265, 266, 267, 268, 1093, + 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 1096, 300, 301, 302, 303, 304, 305, 306, + 1097, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 1098, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 1099, 363, 364, 365, + 601, 367, 368, 1100, 370, 371, 372, 373, 374, 375, + 1101, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 1102, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 1109, 448, 1110, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 1111, 607, 1112, 464, + 465, 466, 0, 467, 608, 469, 1113, 0, 0, 0, + 0, 0, 0, 0, 0, 1114, 1115, 0, 0, 996, + 0, 1116, 0, 0, 997, 998, 1117, 0, 0, 0, + 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, + 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, + 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, + 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, + 0, 0, 0, 0, 0, 1029, 0, 0, 1030, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, + 1034, 0, 0, 0, 3486, 0, 0, 0, 1035, 1036, + 1037, 22, 0, 0, 0, 0, 0, 1038, 0, 0, + 571, 0, 0, 0, 0, 0, 1039, 0, 0, 1040, + 0, 0, 0, 0, 0, 0, 0, 0, 1041, 0, + 1042, 0, 1043, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1044, 1045, 0, 1046, + 0, 0, 0, 1047, 0, 0, 0, 0, 1048, 0, + 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, + 0, 0, 0, 0, 0, 0, 1058, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1059, 0, 0, + 0, 0, 0, 0, 0, 1060, 1061, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1062, 0, 0, 0, 0, 0, + 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, + 0, 0, 0, 0, 1071, 1072, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, + 1077, 65, 66, 67, 68, 69, 70, 1078, 72, 73, + 74, 75, 76, 77, 78, 1079, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 1080, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 1085, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 1086, 1087, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 1088, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 1089, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 1090, 1091, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 1092, 264, 265, 266, 267, 268, 1093, 270, + 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 1096, 300, 301, 302, 303, 304, 305, 306, 1097, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 1098, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 1099, 363, 364, 365, 601, + 367, 368, 1100, 370, 371, 372, 373, 374, 375, 1101, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 1102, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 1103, + 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 1109, 448, 1110, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 1111, 607, 1112, 464, 465, + 466, 0, 467, 608, 469, 1113, 0, 0, 0, 0, + 0, 0, 0, 0, 1114, 1115, 0, 0, 996, 0, + 1116, 0, 0, 997, 998, 1117, 0, 0, 0, 1118, + 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, + 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, + 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, + 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, + 0, 0, 0, 0, 1029, 0, 0, 1030, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, + 0, 0, 0, 3488, 0, 0, 0, 1035, 1036, 1037, + 22, 0, 0, 0, 0, 0, 1038, 0, 0, 571, + 0, 0, 0, 0, 0, 1039, 0, 0, 1040, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 1042, + 0, 1043, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1044, 1045, 0, 1046, 0, + 0, 0, 1047, 0, 0, 0, 0, 1048, 0, 0, + 29, 1049, 0, 1050, 1051, 1052, 1053, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, + 0, 0, 0, 0, 0, 1058, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1059, 0, 0, 0, + 0, 0, 0, 0, 1060, 1061, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1062, 0, 0, 0, 0, 0, 0, + 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1067, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, + 0, 0, 0, 1071, 1072, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, + 65, 66, 67, 68, 69, 70, 1078, 72, 73, 74, + 75, 76, 77, 78, 1079, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 1080, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 1085, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 1086, 1087, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 1088, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 1089, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 1090, 1091, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 1092, 264, 265, 266, 267, 268, 1093, 270, 271, + 272, 273, 274, 275, 276, 277, 1094, 1095, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 1096, 300, 301, 302, 303, 304, 305, 306, 1097, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 1098, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 1099, 363, 364, 365, 601, 367, + 368, 1100, 370, 371, 372, 373, 374, 375, 1101, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 1102, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 1103, 1104, + 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 1109, 448, 1110, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 1111, 607, 1112, 464, 465, 466, + 0, 467, 608, 469, 1113, 0, 0, 0, 0, 0, + 0, 0, 0, 1114, 1115, 0, 0, 996, 0, 1116, + 0, 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, + 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, + 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, + 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, + 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, + 0, 0, 0, 1029, 0, 0, 1030, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, + 0, 0, 3490, 0, 0, 0, 1035, 1036, 1037, 22, + 0, 0, 0, 0, 0, 1038, 0, 0, 571, 0, + 0, 0, 0, 0, 1039, 0, 0, 1040, 0, 0, + 0, 0, 0, 0, 0, 0, 1041, 0, 1042, 0, + 1043, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, + 0, 1047, 0, 0, 0, 0, 1048, 0, 0, 29, + 1049, 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, + 0, 0, 0, 0, 1058, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1059, 0, 0, 0, 0, + 0, 0, 0, 1060, 1061, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1062, 0, 0, 0, 0, 0, 0, 1063, + 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, + 0, 0, 1071, 1072, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, + 66, 67, 68, 69, 70, 1078, 72, 73, 74, 75, + 76, 77, 78, 1079, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 1080, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 1085, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 1086, 1087, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 1088, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 1089, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 1090, 1091, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 1092, 264, 265, 266, 267, 268, 1093, 270, 271, 272, + 273, 274, 275, 276, 277, 1094, 1095, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 1096, + 300, 301, 302, 303, 304, 305, 306, 1097, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 1098, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 1099, 363, 364, 365, 601, 367, 368, + 1100, 370, 371, 372, 373, 374, 375, 1101, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 1102, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, + 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 1109, + 448, 1110, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 1111, 607, 1112, 464, 465, 466, 0, + 467, 608, 469, 1113, 0, 0, 0, 0, 0, 0, + 0, 0, 1114, 1115, 0, 0, 996, 0, 1116, 0, + 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, + 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, + 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, + 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, + 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, 0, + 0, 0, 5030, 0, 0, 1030, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, + 0, 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, + 0, 0, 0, 0, 1038, 0, 3055, 571, 0, 0, + 0, 0, 0, 1039, 0, 0, 1040, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, + 1047, 0, 0, 0, 0, 1048, 0, 0, 29, 1049, + 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, + 0, 0, 0, 1058, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1059, 0, 0, 0, 0, 0, + 0, 0, 1060, 1061, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, + 0, 1065, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, + 0, 1071, 1072, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, + 67, 68, 69, 70, 1078, 72, 73, 74, 75, 76, + 77, 78, 1079, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 1080, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 1085, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 1086, 1087, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 1088, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 1089, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 1090, 1091, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 1092, + 264, 265, 266, 267, 268, 1093, 270, 271, 272, 273, + 274, 275, 276, 277, 1094, 1095, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 1096, 300, + 301, 302, 303, 304, 305, 306, 1097, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 1098, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 1099, 363, 364, 365, 601, 367, 368, 1100, + 370, 371, 372, 373, 374, 375, 1101, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 1102, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, + 429, 430, 431, 432, 1107, 1108, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 1109, 448, + 1110, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 1111, 607, 1112, 464, 465, 466, 0, 467, + 608, 469, 1113, 0, 0, 0, 0, 0, 0, 0, + 0, 1114, 1115, 0, 0, 996, 0, 1116, 0, 0, + 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, + 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, 0, + 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, 0, + 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, + 13, 0, 1027, 1028, 0, 0, 0, 0, 0, 0, + 0, 1029, 0, 0, 1030, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, + 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, + 0, 0, 0, 1038, 0, 0, 571, 0, 0, 0, + 0, 0, 1039, 0, 0, 1040, 0, 0, 0, 0, + 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, + 0, 0, 0, 0, 1048, 0, 0, 29, 1049, 0, + 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, + 0, 0, 1058, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1059, 0, 0, 0, 0, 0, 0, + 0, 1060, 1061, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, 0, + 1065, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, + 1071, 1072, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 1073, + 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, + 68, 69, 70, 1078, 72, 73, 74, 75, 76, 77, + 78, 1079, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 1080, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 1085, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 1086, 1087, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 1088, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 1089, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 1090, 1091, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 1092, 264, + 265, 266, 267, 268, 1093, 270, 271, 272, 273, 274, + 275, 276, 277, 1094, 1095, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 1096, 300, 301, + 302, 303, 304, 305, 306, 1097, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 1098, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 1099, 363, 364, 365, 601, 367, 368, 1100, 370, + 371, 372, 373, 374, 375, 1101, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 1102, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, + 430, 431, 432, 1107, 1108, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 1109, 448, 1110, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 1111, 607, 1112, 464, 465, 466, 0, 467, 608, + 469, 1113, 0, 0, 0, 0, 0, 0, 0, 0, + 1114, 1115, 0, 0, 996, 0, 1116, 0, 0, 997, + 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, + 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 1015, 1016, 0, 0, 0, 0, 0, 0, 0, 1017, + 1018, 0, 1019, 0, 0, 0, 0, 0, 0, 1020, + 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, + 0, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, + 1029, 0, 0, 1030, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, + 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, + 0, 0, 1038, 0, 0, 571, 0, 0, 0, 0, + 0, 1039, 0, 0, 1040, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, + 0, 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, + 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, + 0, 1058, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1059, 0, 0, 0, 0, 0, 0, 0, + 1060, 1061, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1062, + 0, 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, + 1072, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 1073, 1074, + 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, 68, + 69, 70, 1078, 72, 73, 74, 75, 76, 77, 78, + 1079, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 1080, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 1085, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 1086, 1087, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 1088, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 1089, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 1090, 1091, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 1092, 264, 265, + 266, 267, 268, 1093, 270, 271, 272, 273, 274, 275, + 276, 277, 1094, 1095, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 1096, 300, 301, 302, + 303, 304, 305, 306, 1097, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 1098, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 1099, 363, 364, 365, 601, 367, 368, 1100, 370, 371, + 372, 373, 374, 375, 1101, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 1102, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, + 431, 432, 1107, 1108, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 1109, 448, 1110, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 1111, 607, 1112, 464, 465, 466, 0, 467, 608, 469, + 1113, 0, 0, 0, 0, 0, 0, 0, 0, 1114, + 1115, 0, 0, 996, 0, 1116, 0, 0, 997, 998, + 1981, 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, + 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, + 1016, 0, 0, 0, 0, 0, 0, 0, 1017, 1018, + 0, 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, + 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, + 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 1029, + 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, + 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, + 0, 1038, 0, 0, 571, 0, 0, 0, 0, 0, + 1039, 0, 0, 1040, 0, 0, 0, 0, 0, 0, + 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, + 0, 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, + 1052, 1053, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 1054, + 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, 0, + 1058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1059, 0, 0, 0, 0, 0, 0, 0, 1060, + 1061, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1062, 0, + 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, + 1076, 61, 62, 63, 1077, 65, 66, 67, 68, 69, + 70, 1078, 72, 73, 74, 75, 76, 77, 78, 1079, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 1080, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 1081, + 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 1085, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 1086, 1087, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 1088, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 1089, 2629, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 1090, 1091, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 1092, 264, 265, 266, + 267, 268, 1093, 270, 271, 272, 273, 274, 275, 276, + 277, 1094, 1095, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 1096, 300, 301, 302, 303, + 304, 305, 306, 1097, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 1098, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 1099, + 363, 364, 365, 601, 367, 368, 1100, 370, 371, 372, + 373, 374, 375, 1101, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 1102, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, + 432, 1107, 1108, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 2630, 448, 1110, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 1111, + 607, 1112, 464, 465, 466, 0, 467, 608, 469, 1113, + 0, 0, 0, 0, 0, 0, 0, 0, 1114, 1115, + 0, 0, 996, 0, 1116, 0, 0, 997, 998, 1117, + 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, + 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, + 0, 0, 0, 0, 0, 0, 0, 1017, 1018, 0, + 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, 0, + 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, + 1028, 0, 0, 0, 0, 0, 0, 0, 1029, 0, + 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 1031, + 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, 0, + 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, + 1038, 0, 0, 571, 0, 0, 0, 0, 0, 1039, + 0, 0, 1040, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1044, + 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, 0, + 0, 1048, 0, 0, 29, 1049, 0, 1050, 1051, 1052, + 1053, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 1054, 1055, + 1056, 0, 1057, 0, 0, 0, 0, 0, 0, 1058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1059, 0, 0, 0, 0, 0, 0, 0, 1060, 1061, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1062, 0, 0, + 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1068, + 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, + 61, 62, 63, 1077, 65, 66, 67, 68, 69, 70, + 1078, 72, 73, 74, 75, 76, 77, 78, 1079, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 1080, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 1081, 108, + 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 1085, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 1086, + 1087, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 1088, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 1089, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 1090, + 1091, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 1092, 264, 265, 266, 267, + 268, 1093, 270, 271, 272, 273, 274, 275, 276, 277, + 1094, 1095, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 1096, 300, 301, 302, 303, 304, + 305, 306, 1097, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 1098, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 1099, 363, + 364, 365, 601, 367, 368, 1100, 370, 371, 372, 373, + 374, 375, 1101, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 1102, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, + 1107, 1108, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 2630, 448, 1110, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 1111, 607, + 1112, 464, 465, 466, 0, 467, 608, 469, 1113, 0, + 0, 0, 0, 0, 0, 0, 0, 1114, 1115, 0, + 0, 996, 0, 1116, 0, 0, 997, 998, 1117, 0, + 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 0, 0, 0, 0, 0, 0, 0, 1012, 0, + 0, 0, 0, 0, 0, 2851, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, + 0, 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, + 0, 0, 0, 0, 0, 0, 1020, 1021, 0, 0, + 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, + 0, 0, 0, 0, 0, 0, 0, 1029, 0, 0, + 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 1031, 1032, + 1033, 0, 1034, 0, 0, 0, 0, 0, 0, 0, + 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, + 0, 0, 571, 0, 0, 0, 0, 0, 1039, 0, + 0, 1040, 0, 0, 0, 0, 0, 0, 0, 0, + 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1044, 1045, + 0, 1046, 0, 0, 0, 1047, 0, 0, 0, 0, + 1048, 0, 0, 29, 0, 0, 1050, 1051, 1052, 1053, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, + 0, 1057, 0, 0, 0, 0, 0, 0, 1058, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1059, + 0, 0, 0, 0, 0, 0, 0, 1060, 1061, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1062, 0, 0, 0, + 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1068, 1069, + 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, + 62, 63, 1077, 65, 66, 67, 68, 69, 2852, 1078, + 72, 73, 74, 75, 76, 77, 78, 1079, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 1080, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 1081, 108, 1082, + 1083, 1084, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 1085, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 1086, 1087, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 1088, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 1089, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 1090, 1091, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 1092, 264, 265, 266, 267, 268, + 1093, 270, 271, 272, 273, 274, 275, 276, 277, 1094, + 1095, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 1096, 300, 301, 302, 303, 304, 305, + 306, 1097, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 1098, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 1099, 363, 364, + 365, 601, 367, 368, 1100, 370, 371, 372, 373, 374, + 375, 1101, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 1102, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, + 1108, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 1109, 448, 1110, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 1111, 607, 1112, + 464, 465, 466, 0, 467, 608, 469, 1113, 0, 0, + 0, 0, 0, 0, 0, 0, 1114, 1115, 0, 0, + 996, 0, 1116, 0, 0, 997, 998, 1117, 0, 0, + 0, 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 0, 0, 0, 0, 0, 0, 0, 1012, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, + 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, + 0, 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, + 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, + 0, 0, 0, 0, 0, 0, 1029, 0, 0, 1030, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, + 0, 1034, 0, 0, 0, 0, 0, 0, 0, 1035, + 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, 0, + 0, 571, 0, 0, 0, 0, 0, 1039, 0, 0, + 4087, 0, 0, 0, 0, 0, 0, 0, 0, 1041, + 0, 1042, 0, 1043, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1044, 1045, 0, + 1046, 0, 0, 0, 1047, 0, 0, 0, 0, 1048, + 0, 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, + 1057, 0, 0, 0, 0, 0, 0, 1058, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1059, 0, + 0, 0, 0, 0, 0, 0, 1060, 1061, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1062, 0, 0, 0, 0, + 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, + 0, 0, 0, 0, 0, 1071, 1072, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, + 63, 1077, 65, 66, 67, 68, 69, 70, 1078, 72, + 73, 74, 75, 76, 77, 78, 1079, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 1080, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, + 1084, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 1085, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 1086, 1087, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 1088, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 1089, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 1090, 1091, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 1092, 264, 265, 266, 267, 268, 1093, + 270, 271, 272, 273, 274, 275, 276, 277, 1094, 1095, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 1096, 300, 301, 302, 303, 304, 305, 306, + 1097, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 1098, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 1099, 363, 364, 365, + 601, 367, 368, 1100, 370, 371, 372, 373, 374, 375, + 1101, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 1102, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 1109, 448, 1110, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 1111, 607, 1112, 464, + 465, 466, 0, 467, 608, 469, 1113, 0, 0, 0, + 0, 0, 0, 0, 0, 1114, 1115, 0, 0, 996, + 0, 1116, 0, 0, 997, 998, 1117, 0, 0, 0, + 1118, 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, + 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, + 0, 0, 0, 0, 0, 0, 1012, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, + 0, 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, + 0, 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, + 1024, 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, + 0, 0, 0, 0, 0, 1029, 0, 0, 1030, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, + 1034, 0, 0, 0, 0, 0, 0, 0, 1035, 1036, + 1037, 22, 0, 0, 0, 0, 0, 1038, 0, 0, + 571, 0, 0, 0, 0, 0, 1039, 0, 0, 4102, + 0, 0, 0, 0, 0, 0, 0, 0, 1041, 0, + 1042, 0, 1043, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1044, 1045, 0, 1046, + 0, 0, 0, 1047, 0, 0, 0, 0, 1048, 0, + 0, 29, 1049, 0, 1050, 1051, 1052, 1053, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, + 0, 0, 0, 0, 0, 0, 1058, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1059, 0, 0, + 0, 0, 0, 0, 0, 1060, 1061, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1062, 0, 0, 0, 0, 0, + 0, 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1067, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, + 0, 0, 0, 0, 1071, 1072, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, + 1077, 65, 66, 67, 68, 69, 70, 1078, 72, 73, + 74, 75, 76, 77, 78, 1079, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 1080, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 1085, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 1086, 1087, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 1088, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 1089, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 1090, 1091, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 1092, 264, 265, 266, 267, 268, 1093, 270, + 271, 272, 273, 274, 275, 276, 277, 1094, 1095, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 1096, 300, 301, 302, 303, 304, 305, 306, 1097, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 1098, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 1099, 363, 364, 365, 601, + 367, 368, 1100, 370, 371, 372, 373, 374, 375, 1101, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 1102, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 1103, + 1104, 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 1109, 448, 1110, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 1111, 607, 1112, 464, 465, + 466, 0, 467, 608, 469, 1113, 0, 0, 0, 0, + 0, 0, 0, 0, 1114, 1115, 0, 0, 996, 0, + 1116, 0, 0, 997, 998, 1117, 0, 0, 0, 1118, + 1119, 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, + 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, + 0, 0, 0, 0, 0, 1012, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, + 0, 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, + 0, 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, + 1025, 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, + 0, 0, 0, 0, 1029, 0, 0, 1030, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, + 0, 0, 0, 0, 0, 0, 0, 1035, 1036, 1037, + 22, 0, 0, 0, 0, 0, 1038, 0, 0, 571, + 0, 0, 0, 0, 0, 1039, 0, 0, 1040, 0, + 0, 0, 0, 0, 0, 0, 0, 1041, 0, 1042, + 0, 1043, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1044, 1045, 6226, 1046, 0, + 0, 0, 1047, 0, 0, 0, 0, 1048, 0, 0, + 29, 0, 0, 1050, 1051, 1052, 1053, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, + 0, 0, 0, 0, 0, 1058, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1059, 0, 0, 0, + 0, 0, 0, 0, 1060, 1061, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1062, 0, 0, 0, 0, 0, 0, + 1063, 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1067, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, + 0, 0, 0, 1071, 1072, 0, 0, 0, 0, 0, + 0, 0, 0, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, + 65, 66, 67, 68, 69, 70, 1078, 72, 73, 74, + 75, 76, 77, 78, 1079, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 1080, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 1085, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 1086, 1087, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 1088, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 1089, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 1090, 1091, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 1092, 264, 265, 266, 267, 268, 1093, 270, 271, + 272, 273, 274, 275, 276, 277, 1094, 1095, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 1096, 300, 301, 302, 303, 304, 305, 306, 1097, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 1098, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 1099, 363, 364, 365, 601, 367, + 368, 1100, 370, 371, 372, 373, 374, 375, 1101, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 1102, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 1103, 1104, + 1105, 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 1109, 448, 1110, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 1111, 607, 1112, 464, 465, 466, + 0, 467, 608, 469, 1113, 0, 0, 0, 0, 0, + 0, 0, 0, 1114, 1115, 0, 0, 996, 0, 1116, + 0, 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, + 0, 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, + 1005, 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, + 0, 0, 0, 0, 1012, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, + 0, 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, + 0, 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, + 0, 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, + 0, 0, 0, 1029, 0, 0, 1030, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, + 0, 0, 0, 0, 0, 0, 1035, 1036, 1037, 22, + 0, 0, 0, 0, 0, 1038, 0, 0, 571, 0, + 0, 0, 0, 0, 1039, 0, 0, 1948, 0, 0, + 0, 0, 0, 0, 0, 0, 1041, 0, 1042, 0, + 1043, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, + 0, 1047, 0, 0, 0, 0, 1048, 0, 0, 29, + 0, 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, + 0, 0, 0, 0, 1058, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1059, 0, 0, 0, 0, + 0, 0, 0, 1060, 1061, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1062, 0, 0, 0, 0, 0, 0, 1063, + 1064, 0, 1065, 1066, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1067, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, + 0, 0, 1071, 1072, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, + 66, 67, 68, 69, 70, 1078, 72, 73, 74, 75, + 76, 77, 78, 1079, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 1080, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 1085, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 1086, 1087, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 1088, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 1089, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 1090, 1091, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 1092, 264, 265, 266, 267, 268, 1093, 270, 271, 272, + 273, 274, 275, 276, 277, 1094, 1095, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 1096, + 300, 301, 302, 303, 304, 305, 306, 1097, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 1098, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 1099, 363, 364, 365, 601, 367, 368, + 1100, 370, 371, 372, 373, 374, 375, 1101, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 1102, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, + 1106, 429, 430, 431, 432, 1107, 1108, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 1109, + 448, 1110, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 1111, 607, 1112, 464, 465, 466, 0, + 467, 608, 469, 1113, 0, 0, 0, 0, 0, 0, + 0, 0, 1949, 1950, 0, 0, 996, 0, 1116, 0, + 0, 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, + 0, 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, + 1006, 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, + 0, 0, 0, 1012, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1013, 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, + 0, 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, + 0, 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, + 1026, 13, 0, 1027, 1028, 0, 0, 0, 0, 0, + 0, 0, 1029, 0, 0, 1030, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, + 0, 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, + 0, 0, 0, 0, 1038, 0, 0, 571, 0, 0, + 0, 0, 0, 1039, 0, 0, 2062, 0, 0, 0, + 0, 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, + 1047, 0, 0, 0, 0, 1048, 0, 0, 29, 0, + 0, 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, + 0, 0, 0, 1058, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1059, 0, 0, 0, 0, 0, + 0, 0, 1060, 1061, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, + 0, 1065, 1066, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1067, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, + 0, 1071, 1072, 0, 0, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 1073, 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, + 67, 68, 69, 70, 1078, 72, 73, 74, 75, 76, + 77, 78, 1079, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 1080, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 1085, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 1086, 1087, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 1088, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 1089, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 1090, 1091, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 1092, + 264, 265, 266, 267, 268, 1093, 270, 271, 272, 273, + 274, 275, 276, 277, 1094, 1095, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 1096, 300, + 301, 302, 303, 304, 305, 306, 1097, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 1098, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 1099, 363, 364, 365, 601, 367, 368, 1100, + 370, 371, 372, 373, 374, 375, 1101, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 1102, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, + 429, 430, 431, 432, 1107, 1108, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 1109, 448, + 1110, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 1111, 607, 1112, 464, 465, 466, 0, 467, + 608, 469, 1113, 0, 0, 0, 0, 0, 0, 0, + 0, 1949, 1950, 0, 0, 996, 0, 1116, 0, 0, + 997, 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, + 1120, 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, + 1007, 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, + 0, 0, 1012, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1013, + 1014, 1015, 1016, 0, 0, 0, 0, 0, 0, 0, + 1017, 1018, 0, 1019, 0, 0, 0, 0, 0, 0, + 1020, 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, + 13, 0, 1027, 1028, 0, 0, 0, 0, 0, 0, + 0, 1029, 0, 0, 1030, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, + 0, 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, + 0, 0, 0, 1038, 0, 0, 571, 0, 0, 0, + 0, 0, 1039, 0, 0, 2064, 0, 0, 0, 0, + 0, 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, + 0, 0, 0, 0, 1048, 0, 0, 29, 0, 0, + 1050, 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, + 0, 0, 1058, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1059, 0, 0, 0, 0, 0, 0, + 0, 1060, 1061, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1062, 0, 0, 0, 0, 0, 0, 1063, 1064, 0, + 1065, 1066, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1067, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, + 1071, 1072, 0, 0, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 1073, + 1074, 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, + 68, 69, 70, 1078, 72, 73, 74, 75, 76, 77, + 78, 1079, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 1080, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 1085, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 1086, 1087, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 1088, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 1089, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 1090, 1091, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 1092, 264, + 265, 266, 267, 268, 1093, 270, 271, 272, 273, 274, + 275, 276, 277, 1094, 1095, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 1096, 300, 301, + 302, 303, 304, 305, 306, 1097, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 1098, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 1099, 363, 364, 365, 601, 367, 368, 1100, 370, + 371, 372, 373, 374, 375, 1101, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 1102, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, + 430, 431, 432, 1107, 1108, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 1109, 448, 1110, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 1111, 607, 1112, 464, 465, 466, 0, 467, 608, + 469, 1113, 0, 0, 0, 0, 0, 0, 0, 0, + 1949, 1950, 0, 0, 996, 0, 1116, 0, 0, 997, + 998, 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, + 999, 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, + 1008, 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, + 0, 1012, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1013, 1014, + 1015, 1016, 0, 0, 0, 0, 0, 0, 0, 1017, + 1018, 0, 1019, 0, 0, 0, 0, 0, 0, 1020, + 1021, 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, + 0, 1027, 1028, 0, 0, 0, 0, 0, 0, 0, + 1029, 0, 0, 1030, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, + 0, 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, + 0, 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, + 0, 0, 1038, 0, 0, 571, 0, 0, 0, 0, + 0, 1039, 0, 0, 1040, 0, 0, 0, 0, 0, + 0, 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, + 0, 0, 0, 1048, 0, 0, 29, 0, 0, 1050, + 1051, 1052, 1053, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 1054, 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, + 0, 1058, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1059, 0, 0, 0, 0, 0, 0, 0, + 1060, 1061, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1062, + 0, 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, + 1066, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1067, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, + 1072, 0, 0, 0, 0, 0, 0, 0, 0, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 1073, 1074, + 1075, 1076, 61, 62, 63, 1077, 65, 66, 67, 68, + 69, 70, 1078, 72, 73, 74, 75, 76, 77, 78, + 1079, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 1080, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 1081, 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 1085, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 1086, 1087, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 1088, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 1089, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 1090, 1091, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 1092, 264, 265, + 266, 267, 268, 1093, 270, 271, 272, 273, 274, 275, + 276, 277, 1094, 1095, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 1096, 300, 301, 302, + 303, 304, 305, 306, 1097, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 1098, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 1099, 363, 364, 365, 601, 367, 368, 1100, 370, 371, + 372, 373, 374, 375, 1101, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 1102, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, + 431, 432, 1107, 1108, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 1109, 448, 1110, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 1111, 607, 1112, 464, 465, 466, 0, 467, 608, 469, + 1113, 0, 0, 0, 0, 0, 0, 0, 0, 1114, + 1115, 0, 0, 996, 0, 1116, 0, 0, 997, 998, + 1117, 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, + 1000, 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, + 1009, 1010, 1011, 0, 0, 0, 0, 0, 0, 0, + 1012, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, + 1016, 0, 0, 0, 0, 0, 0, 0, 1017, 1018, + 0, 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, + 0, 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, + 1027, 1028, 0, 0, 0, 0, 0, 0, 0, 1029, + 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 1031, 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, + 0, 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, + 0, 1038, 0, 0, 571, 0, 0, 0, 0, 0, + 1039, 0, 0, 2872, 0, 0, 0, 0, 0, 0, + 0, 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1044, 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, + 0, 0, 1048, 0, 0, 29, 0, 0, 1050, 1051, + 1052, 1053, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 1054, + 1055, 1056, 0, 1057, 0, 0, 0, 0, 0, 0, + 1058, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1059, 0, 0, 0, 0, 0, 0, 0, 1060, + 1061, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1062, 0, + 0, 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1067, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1068, 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, + 0, 0, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, + 1076, 61, 62, 63, 1077, 65, 66, 67, 68, 69, + 70, 1078, 72, 73, 74, 75, 76, 77, 78, 1079, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 1080, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 1081, + 108, 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 1085, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 1086, 1087, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 1088, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 1089, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 1090, 1091, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 1092, 264, 265, 266, + 267, 268, 1093, 270, 271, 272, 273, 274, 275, 276, + 277, 1094, 1095, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 1096, 300, 301, 302, 303, + 304, 305, 306, 1097, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 1098, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 1099, + 363, 364, 365, 601, 367, 368, 1100, 370, 371, 372, + 373, 374, 375, 1101, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 1102, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, + 432, 1107, 1108, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 1109, 448, 1110, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 1111, + 607, 1112, 464, 465, 466, 0, 467, 608, 469, 1113, + 0, 0, 0, 0, 0, 0, 0, 0, 1114, 1115, + 0, 0, 996, 0, 1116, 0, 0, 997, 998, 1117, + 0, 0, 0, 1118, 1119, 0, 0, 1120, 999, 1000, + 0, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, + 1010, 1011, 0, 0, 0, 0, 0, 0, 0, 1012, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1013, 1014, 1015, 1016, + 0, 0, 0, 0, 0, 0, 0, 1017, 1018, 0, + 1019, 0, 0, 0, 0, 0, 0, 1020, 1021, 0, + 0, 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, + 1028, 0, 0, 0, 0, 0, 0, 0, 1029, 0, + 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 1031, + 1032, 1033, 0, 1034, 0, 0, 0, 0, 0, 0, + 0, 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, + 1038, 0, 0, 571, 0, 0, 0, 0, 0, 1039, + 0, 0, 2874, 0, 0, 0, 0, 0, 0, 0, + 0, 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1044, + 1045, 0, 1046, 0, 0, 0, 1047, 0, 0, 0, + 0, 1048, 0, 0, 29, 0, 0, 1050, 1051, 1052, + 1053, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 1054, 1055, + 1056, 0, 1057, 0, 0, 0, 0, 0, 0, 1058, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1059, 0, 0, 0, 0, 0, 0, 0, 1060, 1061, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1062, 0, 0, + 0, 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1067, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1068, + 1069, 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, + 0, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, + 61, 62, 63, 1077, 65, 66, 67, 68, 69, 70, + 1078, 72, 73, 74, 75, 76, 77, 78, 1079, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 1080, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 1081, 108, + 1082, 1083, 1084, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 1085, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 1086, + 1087, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 1088, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 1089, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 1090, + 1091, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 1092, 264, 265, 266, 267, + 268, 1093, 270, 271, 272, 273, 274, 275, 276, 277, + 1094, 1095, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 1096, 300, 301, 302, 303, 304, + 305, 306, 1097, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 1098, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 1099, 363, + 364, 365, 601, 367, 368, 1100, 370, 371, 372, 373, + 374, 375, 1101, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 1102, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, + 1107, 1108, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 1109, 448, 1110, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 1111, 607, + 1112, 464, 465, 466, 0, 467, 608, 469, 1113, 0, + 0, 0, 0, 0, 0, 0, 0, 1114, 1115, 0, + 0, 996, 0, 1116, 0, 0, 997, 998, 1117, 0, + 0, 0, 1118, 1119, 0, 0, 1120, 6088, 6089, 0, + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, + 1011, 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, 1014, 1015, 1016, 0, + 0, 0, 0, 0, 0, 0, 1017, 1018, 0, 1019, + 0, 0, 0, 0, 0, 0, 1020, 1021, 0, 0, + 1022, 1023, 1024, 1025, 0, 1026, 13, 0, 1027, 1028, + 0, 0, 0, 0, 0, 0, 0, 1029, 0, 0, + 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 1031, 1032, + 1033, 0, 1034, 0, 0, 0, 0, 0, 0, 0, + 1035, 1036, 1037, 22, 0, 0, 0, 0, 0, 1038, + 0, 0, 571, 0, 0, 0, 0, 0, 1039, 0, + 0, 1948, 0, 0, 0, 0, 0, 0, 0, 0, + 1041, 0, 1042, 0, 1043, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1044, 1045, + 0, 1046, 0, 0, 0, 1047, 0, 0, 0, 0, + 1048, 0, 0, 29, 0, 0, 1050, 1051, 1052, 1053, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 1054, 1055, 1056, + 0, 1057, 0, 0, 0, 0, 0, 0, 1058, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1059, + 0, 0, 0, 0, 0, 0, 0, 1060, 1061, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1062, 0, 0, 0, + 0, 0, 0, 1063, 1064, 0, 1065, 1066, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1067, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1068, 1069, + 1070, 0, 0, 0, 0, 0, 1071, 1072, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 1073, 1074, 1075, 1076, 61, + 62, 63, 1077, 65, 66, 67, 68, 69, 70, 1078, + 72, 73, 74, 75, 76, 77, 78, 1079, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 1080, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 1081, 108, 1082, + 1083, 1084, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 1085, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 1086, 1087, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 1088, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 1089, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 1090, 1091, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 1092, 264, 265, 266, 267, 268, + 1093, 270, 271, 272, 273, 274, 275, 276, 277, 1094, + 1095, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 1096, 300, 301, 302, 303, 304, 305, + 306, 1097, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 1098, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 1099, 363, 364, + 365, 601, 367, 368, 1100, 370, 371, 372, 373, 374, + 375, 1101, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 1102, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 1103, 1104, 1105, 1106, 429, 430, 431, 432, 1107, + 1108, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 1109, 448, 1110, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 1111, 607, 1112, + 464, 465, 466, 0, 467, 608, 469, 1113, 0, 0, + 0, 0, 0, 0, 0, 0, 6090, 6091, 0, 0, + 996, 0, 0, 0, 0, 1986, 0, 6092, 0, 0, + 0, 0, 1119, 0, 0, 1120, 1941, 1942, 0, 1001, + 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, + 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, 13, 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, 19, 0, 0, 0, 0, 0, 1033, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 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, 29, 0, 0, 0, 0, 0, 1053, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 1067, 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, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 2908, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 2909, 426, 427, 2910, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 6384, 467, 608, 469, 470, 2828, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1120, 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, 13, 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, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 6384, 467, 608, 469, 470, 2828, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 6385, + 0, 0, 0, 0, 0, 0, 2829, 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, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 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, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 1986, 467, 608, 469, + 470, 0, 0, 0, 0, 0, 0, 1941, 1942, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2829, 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, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 1986, 467, 608, 469, 470, 0, 0, + 0, 0, 0, 0, 1941, 1942, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1987, 0, 0, + 0, 0, 0, 0, 0, 1120, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 2828, 467, 608, 469, 470, 0, 0, 0, 0, 0, + 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1120, 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, + 13, 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, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1, 0, 2, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2829, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 9, 0, 10, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 14, 0, 0, 15, 0, + 16, 17, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 23, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 33, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 37, 38, 39, 0, + 40, 0, 0, 0, 0, 41, 0, 0, 0, 0, + 0, 42, 0, 0, 0, 43, 44, 45, 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, 46, 0, 47, 0, 48, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 50, 51, 0, 0, 0, 52, 53, 54, 0, 55, + 56, 57, 58, 59, 0, 60, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 0, 96, 97, 98, 99, 100, 101, + 102, 0, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 0, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 0, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 0, 179, 0, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 0, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 0, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 0, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 0, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 0, 467, 468, 469, 470, 1, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 5, 0, 0, 0, 471, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, + 9, 0, 10, 0, 11, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 15, 0, 16, 17, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, + 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 0, 27, 0, 0, 0, 28, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 30, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, + 34, 0, 0, 0, 0, 0, 0, 0, 0, 35, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 37, 38, 39, 0, 40, 0, 0, 0, 0, + 41, 0, 0, 0, 0, 0, 42, 0, 0, 0, + 43, 44, 45, 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, 46, 0, 47, 0, + 48, 0, 0, 0, 0, 0, 0, 49, 0, 0, + 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, + 52, 53, 54, 0, 55, 56, 57, 58, 59, 0, + 60, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 0, 96, + 97, 98, 99, 100, 101, 102, 0, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 0, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 149, 150, 151, 0, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 178, 0, + 179, 0, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 0, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 0, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 0, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 0, 314, 315, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 0, 467, 468, + 469, 470, 1, 0, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, + 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 0, 0, 0, 10, 0, 11, + 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, + 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, + 16, 17, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 32, 33, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 35, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 37, 38, 0, 0, + 40, 0, 0, 0, 0, 41, 0, 0, 0, 0, + 0, 42, 0, 0, 0, 43, 44, 45, 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, 46, 0, 47, 0, 48, 0, 0, 0, 0, + 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, + 0, 51, 0, 0, 0, 52, 53, 54, 0, 55, + 56, 57, 58, 59, 0, 60, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, 0, 0, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 0, 96, 97, 98, 99, 100, 101, + 102, 0, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 0, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 0, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 0, 179, 0, 180, 181, 182, + 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 0, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 0, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 0, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 0, 314, 315, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, + 465, 466, 0, 467, 468, 469, 470, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 471, 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, 5068, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 762, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 3706, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3707, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 764, 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 5069, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 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, 5070, 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, 13, 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, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1385, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 42, 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, 49, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1386, 0, + 0, 0, 0, 0, 0, 0, 793, 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, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1384, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1385, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, + 0, 0, 0, 0, 1387, 0, 0, 793, 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, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1385, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 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, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1386, 0, 0, 0, 0, 1387, 0, 0, 793, 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, + 13, 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, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1385, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1386, 0, 0, 0, 0, 0, 0, 0, 793, + 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, 13, 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, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 3359, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 793, 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, 13, 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, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5235, 0, 0, 0, 0, 0, 0, + 0, 5070, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 5496, 0, 0, 571, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 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, 5070, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 790, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 791, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 792, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 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, 793, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 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, 793, 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, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 715, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 5070, 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, 1464, 0, 0, 13, 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, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 0, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2057, 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, 13, 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, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 1209, 467, 608, 469, 470, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 5, 0, 0, 0, 0, 0, 0, 2883, + 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, 1210, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1211, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 1212, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 1213, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 1214, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 1215, 184, 185, 186, 589, + 1216, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 1217, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 1218, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 1219, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 1220, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 1221, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 1222, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 1223, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 1224, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 1225, 463, 464, 465, 466, 1209, 467, 608, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 5, 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, 1210, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1211, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 1212, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 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, 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, 52, 53, 54, 1213, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 1214, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 1215, 184, 185, + 186, 589, 1216, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 1217, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 1218, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 1219, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 1220, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 1221, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 1222, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 1225, 463, 464, 465, 466, 2136, + 467, 608, 469, 470, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 5, 813, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 715, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 2380, 467, 608, 469, 470, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 5, 813, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 715, + 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, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 2670, 467, 608, 469, 470, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 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, 13, 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, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 2287, 467, 608, 469, 470, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1941, 1942, 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, 2288, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13, 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, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 2287, 467, 608, + 469, 470, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1941, 1942, 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, 0, 0, + 0, 0, 13, 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, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 2394, 998, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1941, 1942, 0, 0, 0, + 0, 0, 0, 0, 2395, 0, 2396, 0, 2397, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 2398, 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, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 2394, 998, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1941, 1942, 0, + 0, 0, 0, 0, 0, 0, 2395, 0, 2396, 0, + 2397, 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, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, 3163, + 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, 0, 0, 0, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 3164, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 2394, 998, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1941, + 1942, 0, 0, 0, 0, 0, 0, 0, 2395, 0, + 2396, 0, 2397, 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, 13, 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, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 4464, 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, 0, 0, 0, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 2394, 998, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1941, 1942, 0, 0, 0, 0, 0, 0, 0, + 2395, 0, 2396, 0, 2397, 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, + 13, 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, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1941, 1942, 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, 0, 0, 0, + 0, 13, 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, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 2889, 2890, 2891, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 4631, 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, 13, 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, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 3340, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 1941, 1942, 0, 0, 0, + 0, 0, 0, 0, 0, 4480, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 5323, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 0, + 0, 0, 0, 0, 0, 0, 0, 5609, 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, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 0, 0, 0, 0, 0, 3322, 0, 0, 5914, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 709, + 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, 13, 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, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 710, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 3957, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 3958, 0, 680, 0, 3959, 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, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 3323, 0, + 0, 715, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1453, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2141, 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, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 813, 1454, 0, 0, 0, 0, 0, 0, + 0, 0, 715, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1453, 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, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 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, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 0, 1454, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1501, 1502, 1503, + 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, 1513, + 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, 1523, + 1524, 1525, 1526, 1527, 1528, 1529, 0, 1530, 1531, 1532, + 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 0, 1541, + 13, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, 1550, + 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, + 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 19, 1569, + 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 0, + 1579, 1580, 1581, 1582, 1583, 0, 0, 22, 1584, 1585, + 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1595, + 0, 1596, 1597, 0, 1598, 1599, 1600, 1601, 1602, 1603, + 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, + 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, + 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, 1633, + 1634, 1635, 1636, 1637, 1638, 1639, 1640, 29, 1641, 1642, + 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 31, + 1652, 1653, 1654, 1655, 0, 1656, 1657, 1658, 1659, 1660, + 34, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, 1669, + 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, 1679, + 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, 1689, + 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, 1699, + 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, 1709, + 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, 1719, + 1720, 0, 1721, 1722, 1723, 1724, 1725, 1726, 1727, 1728, + 1729, 1730, 1731, 1732, 1733, 1734, 1735, 0, 1736, 1737, + 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, 1747, + 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, 1757, + 52, 53, 54, 0, 55, 56, 57, 58, 59, 0, + 1758, 1759, 1760, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 1761, 85, 1762, 1763, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 0, 1764, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 1765, 1766, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 1767, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 1768, 586, 587, + 179, 0, 180, 181, 182, 0, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 1769, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 0, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 1770, 1771, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 0, 1772, 1773, 292, 1774, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 0, 1775, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 1776, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 0, 374, 375, 376, 377, 602, 0, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 1777, 423, 424, 1778, 426, 427, 1779, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 0, 1780, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 1781, 463, 464, 465, 466, 0, 467, 608, + 469, 1782, 4, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1501, 1502, + 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, 1512, + 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, 1522, + 1523, 1524, 1525, 1526, 1527, 1528, 1529, 0, 1530, 1531, + 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, 0, + 1541, 13, 1542, 1543, 1544, 1545, 1546, 1547, 1548, 1549, + 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, + 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 19, + 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, + 0, 1579, 1580, 1581, 1582, 1583, 0, 0, 22, 1584, + 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, + 1595, 0, 1596, 1597, 0, 1598, 1599, 1600, 1601, 1602, + 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, + 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, + 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, 1632, + 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 29, 1641, + 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, + 31, 1652, 1653, 1654, 1655, 0, 1656, 1657, 1658, 1659, + 1660, 34, 1661, 1662, 1663, 1664, 1665, 1666, 1667, 1668, + 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, 1678, + 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, 1688, + 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, 1698, + 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, 1708, + 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, 1718, + 1719, 1720, 0, 1721, 1722, 1723, 1724, 1725, 1726, 1727, + 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 0, 1736, + 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, 1746, + 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, 1756, + 1757, 52, 53, 54, 0, 55, 56, 57, 58, 59, + 0, 1758, 1759, 1760, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 1761, 85, 1762, + 1763, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 0, 1764, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 1765, 1766, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 1767, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 1768, 586, + 587, 179, 0, 180, 181, 182, 0, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 1769, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 0, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 1770, 1771, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 0, 1772, 1773, 292, + 1774, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 0, 1775, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 4446, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 0, 374, 375, 376, 377, 602, 0, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 1777, 423, 424, 1778, 426, 427, 1779, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 0, 1780, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 1781, 463, 464, 465, 466, 0, 467, + 608, 469, 1782, 4, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1501, + 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, 1511, + 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, + 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 0, 1530, + 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, 1540, + 0, 1541, 13, 1542, 1543, 1544, 1545, 1546, 1547, 1548, + 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, + 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, + 19, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, + 1578, 0, 1579, 1580, 1581, 1582, 1583, 0, 0, 22, + 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, + 1594, 1595, 0, 1596, 1597, 0, 1598, 1599, 1600, 1601, + 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, 1611, + 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, + 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, 1631, + 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, 29, + 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, + 1651, 31, 1652, 1653, 1654, 1655, 0, 1656, 1657, 1658, + 1659, 1660, 34, 1661, 1662, 1663, 1664, 1665, 1666, 1667, + 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, 1677, + 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, 1687, + 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, 1697, + 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, 1707, + 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, 1717, + 1718, 1719, 1720, 0, 1721, 1722, 1723, 1724, 1725, 1726, + 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, 0, + 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, 1745, + 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, 1755, + 1756, 1757, 52, 53, 54, 0, 55, 56, 57, 58, + 59, 0, 1758, 1759, 1760, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 1761, 85, + 1762, 1763, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 0, 1764, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 1765, 1766, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 1767, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 1768, + 586, 587, 179, 0, 180, 181, 182, 0, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 1769, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 0, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 1770, 1771, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 0, 1772, 1773, + 292, 1774, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 0, + 1775, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 0, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 5640, 374, 375, 376, 377, 602, + 0, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 1777, 423, 424, 1778, 426, 427, + 1779, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 0, 1780, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 1781, 463, 464, 465, 466, 0, + 467, 608, 469, 1782, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, 1510, + 1511, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, + 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 0, + 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, 1539, + 1540, 0, 1541, 13, 1542, 1543, 1544, 1545, 1546, 1547, + 1548, 1549, 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, + 1558, 1559, 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, + 1568, 19, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, + 1577, 1578, 0, 1579, 1580, 1581, 1582, 1583, 0, 0, + 22, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 3941, + 1593, 1594, 1595, 0, 1596, 1597, 0, 1598, 1599, 1600, + 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, 1610, + 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, 1620, + 1621, 1622, 1623, 1624, 1625, 1626, 1627, 1628, 1629, 1630, + 1631, 1632, 1633, 1634, 1635, 1636, 1637, 1638, 1639, 1640, + 29, 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, + 1650, 1651, 31, 1652, 1653, 1654, 1655, 0, 1656, 1657, + 1658, 1659, 1660, 34, 1661, 1662, 1663, 1664, 1665, 1666, + 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, 1676, + 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, 1686, + 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, 1696, + 1697, 1698, 1699, 1700, 1701, 1702, 1703, 1704, 1705, 1706, + 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, 1716, + 1717, 1718, 1719, 1720, 0, 1721, 1722, 1723, 1724, 1725, + 1726, 1727, 1728, 1729, 1730, 1731, 1732, 1733, 1734, 1735, + 0, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, 1744, + 1745, 1746, 1747, 1748, 1749, 1750, 1751, 1752, 1753, 1754, + 1755, 1756, 1757, 52, 53, 54, 0, 55, 56, 57, + 58, 59, 0, 1758, 1759, 1760, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 1761, + 85, 1762, 1763, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 0, 1764, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 1765, 1766, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 1767, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 1768, 586, 587, 179, 0, 180, 181, 182, 0, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 1769, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 0, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 1770, 1771, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 0, 1772, + 1773, 292, 1774, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 0, 1775, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 0, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 0, 374, 375, 376, 377, + 602, 0, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 1777, 423, 424, 1778, 426, + 427, 1779, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 0, 1780, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 0, 463, 464, 465, 466, + 0, 467, 608, 469, 1782, 4, 5, 813, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 715, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 904, 905, 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, 906, 0, 0, 0, + 907, 0, 0, 0, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 908, 0, 0, + 0, 0, 0, 0, 0, 0, 909, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 910, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 911, 0, 0, 0, 0, 912, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 913, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 914, 0, + 0, 0, 915, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 916, 0, 0, 0, 917, 918, 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, 919, 0, 0, 0, 0, + 0, 0, 920, 921, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 922, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 923, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 924, 161, 162, 163, 164, 925, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 926, 927, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 928, 321, 322, 323, 929, 325, 326, + 327, 328, 329, 930, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 931, 342, 343, 598, 345, 346, + 932, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 933, 379, 380, 381, 934, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 935, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 813, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 715, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1187, 905, 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, 906, 0, 0, + 0, 907, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 908, 0, + 0, 0, 0, 0, 0, 0, 0, 909, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 910, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 911, 0, 0, 0, 0, 912, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 913, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 914, + 0, 0, 0, 915, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 916, 0, 0, 0, 917, 918, 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, 919, 0, 0, 0, + 0, 0, 0, 920, 921, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 1188, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 922, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 923, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 924, 161, 162, 163, 164, 925, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 926, + 927, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 928, 321, 322, 323, 1189, 325, + 326, 327, 328, 329, 930, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 931, 342, 343, 598, 345, + 346, 932, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 933, 379, 380, 381, 934, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 935, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 0, + 0, 0, 2692, 2693, 5422, 0, 5423, 0, 5424, 715, + 5425, 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, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5426, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 715, 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, 907, 1464, 0, 0, 13, 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, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 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, 2156, 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, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2157, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 0, 0, 1346, 0, 0, 1347, 1348, 0, + 0, 0, 1349, 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, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 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, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 813, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 715, 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, 2141, + 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, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2142, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 813, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 715, 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, 1464, 0, + 0, 13, 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, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 813, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 715, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2192, 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, 13, 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, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 813, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 715, 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, 907, + 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 1941, 1942, 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, + 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 2889, 2890, 2891, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 813, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 715, 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, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3276, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 813, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 715, + 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, 2141, 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, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 813, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 715, 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, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3628, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 813, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 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, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3933, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 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, 0, 0, 0, 0, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 679, + 0, 0, 0, 0, 0, 0, 0, 0, 680, 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, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 813, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 715, 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, + 13, 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, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 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, 849, + 850, 0, 0, 0, 0, 0, 0, 0, 0, 851, + 0, 13, 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, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 852, 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, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 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, 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, 52, 53, 54, 0, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 0, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 0, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 853, 854, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 183, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 855, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 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, 0, 0, + 0, 0, 13, 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, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1911, 0, 0, 0, 0, 0, 0, 22, + 1912, 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 1913, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 715, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4627, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 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, + 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 680, 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, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 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, 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1822, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 1941, 1942, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1943, 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, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 1941, 1942, + 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, 0, 0, 0, 0, 13, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2151, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 1941, + 1942, 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, 0, 0, 0, 0, 13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2957, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 2958, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 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, 2970, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 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, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 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, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3699, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1941, 1942, 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, 0, 0, 0, + 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2957, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 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, 0, 0, + 0, 0, 13, 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, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 0, 0, 0, 0, 0, 0, 4679, + 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 601, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 715, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 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, 5048, 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, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 588, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 607, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 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, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5519, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 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, 0, 0, 0, 0, 13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 5529, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 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, 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, + 0, 0, 0, 0, 5874, 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, 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, 52, 53, 54, + 572, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 588, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 607, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 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, 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 572, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 588, 184, 185, 186, 589, 188, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 0, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 607, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 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, 0, 0, 0, 0, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 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, 52, + 53, 54, 572, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 574, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 584, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 588, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 722, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 607, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 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, 0, 0, 0, 0, + 13, 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, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, + 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 572, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 574, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 577, 96, + 578, 98, 99, 100, 101, 102, 579, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 803, 114, + 580, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 581, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 583, 148, 149, 150, 151, 584, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 587, + 179, 0, 180, 181, 182, 588, 184, 185, 186, 589, + 188, 189, 590, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 593, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 594, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 595, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 596, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 598, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 600, 359, 360, + 361, 362, 363, 364, 365, 601, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 602, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 605, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 607, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 1941, 1942, 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, 0, 0, 0, + 0, 13, 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, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 573, 0, 574, 575, 84, 85, 86, + 87, 88, 89, 576, 91, 92, 93, 94, 95, 577, + 96, 578, 98, 99, 100, 101, 102, 579, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 0, 112, 113, + 114, 580, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 581, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 582, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 583, 148, 149, 150, 151, + 584, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 163, 164, 585, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 586, + 587, 179, 0, 180, 181, 182, 588, 184, 185, 186, + 589, 188, 189, 590, 191, 192, 591, 0, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 592, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 593, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 594, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 595, 297, 298, 299, 300, + 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, + 311, 312, 313, 596, 314, 597, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 598, 345, 346, 347, 599, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 600, 359, + 360, 361, 362, 363, 364, 365, 601, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 602, 379, + 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 603, + 399, 400, 604, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 605, 435, 436, 437, 438, + 439, 440, 441, 442, 606, 444, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 607, 463, 464, 465, 466, 0, 467, + 608, 469, 470, 4, 5, 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, 0, 0, + 0, 0, 13, 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, + 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 571, 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, 29, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, 56, 57, 58, + 59, 0, 0, 0, 0, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 573, 0, 574, 575, 84, 85, + 86, 87, 88, 89, 576, 91, 92, 93, 94, 95, + 577, 96, 578, 98, 99, 100, 101, 102, 579, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 0, 112, + 113, 114, 580, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 581, 125, 126, 127, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 582, 139, 0, 140, + 141, 142, 143, 144, 145, 146, 583, 148, 149, 150, + 151, 584, 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 585, 166, 0, 0, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 586, 587, 179, 0, 180, 181, 182, 588, 184, 185, + 186, 589, 188, 189, 590, 191, 192, 591, 0, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 592, 208, 209, 210, 211, 212, 213, 214, + 215, 216, 593, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 0, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, + 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 594, 285, 286, 287, 288, 289, 290, 291, + 292, 0, 293, 294, 295, 296, 595, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 596, 314, 597, 316, 317, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 598, 345, 346, 347, 599, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 600, + 359, 360, 361, 362, 363, 364, 365, 2307, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 602, + 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 0, 394, 395, 396, 397, + 603, 399, 400, 604, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 605, 435, 436, 437, + 438, 439, 440, 441, 442, 606, 444, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 607, 463, 464, 465, 466, 0, + 467, 608, 469, 470, 4, 5, 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, 0, + 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 571, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 2975, 53, 54, 572, 55, 56, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 573, 0, 574, 575, 84, + 85, 86, 87, 88, 89, 576, 91, 92, 93, 94, + 95, 577, 96, 578, 98, 99, 100, 101, 102, 579, + 103, 104, 105, 106, 107, 108, 109, 110, 111, 0, + 112, 113, 114, 580, 116, 117, 118, 119, 120, 121, + 122, 123, 124, 581, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 582, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 583, 148, 149, + 150, 151, 584, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 163, 164, 585, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 586, 587, 179, 0, 180, 181, 182, 588, 184, + 185, 186, 589, 188, 189, 590, 191, 192, 591, 0, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 592, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 593, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 594, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 595, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, + 309, 310, 311, 312, 313, 596, 314, 597, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 598, 345, 346, 347, + 599, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 600, 359, 360, 361, 362, 363, 364, 365, 601, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 602, 379, 380, 381, 382, 383, 384, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 603, 399, 400, 604, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 605, 435, 436, + 437, 438, 439, 440, 441, 442, 606, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 607, 463, 464, 465, 466, + 0, 467, 608, 469, 470, 4, 5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 715, 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, 13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3607, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 3608, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 3609, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 84, 85, 86, 87, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 101, 102, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 586, 587, 179, 0, 180, 181, 182, 3610, + 184, 185, 186, 589, 0, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 0, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 289, + 290, 291, 292, 3611, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 362, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 373, 0, 375, 376, + 377, 602, 379, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 3612, 463, 464, 465, + 466, 0, 467, 608, 469, 470, 4, 5, 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, 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, + 0, 571, 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, 29, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, 572, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 573, 0, 574, + 575, 84, 85, 86, 87, 88, 89, 576, 91, 92, + 93, 94, 95, 577, 96, 578, 98, 99, 100, 101, + 102, 579, 103, 104, 105, 106, 107, 108, 109, 110, + 111, 0, 112, 113, 114, 580, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 581, 125, 126, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 136, 137, 582, + 139, 0, 140, 141, 142, 143, 144, 145, 146, 583, + 148, 149, 150, 151, 584, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 585, 166, + 0, 0, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 3726, 177, 586, 587, 179, 0, 180, 181, 182, + 588, 184, 185, 186, 589, 188, 189, 590, 191, 192, + 591, 0, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 592, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 593, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 0, + 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, + 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, + 270, 271, 272, 273, 274, 275, 276, 277, 3727, 279, + 280, 281, 282, 283, 284, 594, 285, 286, 287, 288, + 289, 290, 291, 292, 0, 293, 294, 295, 296, 595, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 596, 314, 597, + 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 598, 345, + 346, 347, 599, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 600, 359, 360, 361, 362, 363, 364, 365, + 601, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 602, 379, 380, 381, 382, 383, 384, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 0, 394, + 395, 396, 397, 603, 399, 400, 604, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 605, + 435, 436, 437, 438, 439, 440, 441, 442, 606, 444, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, 459, 460, 461, 607, 463, 464, + 465, 466, 0, 467, 608, 469, 470, 4, 5, 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, 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, + 0, 0, 571, 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, 5826, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 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, + 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, 52, 53, 54, 572, + 55, 56, 57, 58, 59, 0, 0, 0, 0, 61, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, 573, 0, + 574, 575, 84, 85, 86, 87, 88, 89, 576, 91, + 92, 93, 94, 95, 577, 96, 578, 98, 99, 100, + 101, 102, 579, 103, 104, 105, 106, 107, 108, 109, + 110, 111, 0, 112, 113, 114, 580, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 581, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 582, 139, 0, 140, 141, 142, 143, 144, 145, 146, + 583, 148, 149, 150, 151, 584, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 585, + 166, 0, 0, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 586, 587, 179, 0, 180, 181, + 182, 588, 184, 185, 186, 589, 188, 189, 590, 191, + 192, 591, 0, 194, 195, 196, 197, 198, 199, 200, + 201, 202, 203, 204, 205, 206, 592, 208, 209, 210, + 211, 212, 213, 214, 215, 216, 593, 217, 218, 219, + 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, + 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, + 0, 250, 251, 252, 253, 254, 255, 256, 257, 258, + 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, + 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, + 279, 280, 281, 282, 283, 284, 594, 285, 286, 287, + 288, 289, 290, 291, 292, 0, 293, 294, 295, 296, + 595, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 596, 314, + 597, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 598, + 345, 346, 347, 599, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 600, 359, 360, 361, 362, 363, 364, + 365, 601, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 602, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 0, + 394, 395, 396, 397, 603, 399, 400, 604, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 605, 435, 436, 437, 438, 439, 440, 441, 442, 606, + 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, 459, 460, 461, 607, 463, + 464, 465, 466, 0, 467, 608, 469, 470, 4, 5, + 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, 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 3377, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, 54, + 3378, 55, 56, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 573, + 0, 574, 575, 84, 85, 86, 87, 88, 89, 576, + 91, 92, 93, 94, 95, 577, 96, 578, 98, 99, + 100, 101, 102, 579, 103, 104, 105, 106, 107, 108, + 109, 110, 111, 0, 112, 113, 114, 580, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 581, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 582, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 583, 148, 149, 150, 151, 584, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 585, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 586, 587, 179, 0, 180, + 181, 182, 3379, 184, 185, 186, 589, 188, 189, 590, + 191, 192, 591, 0, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 592, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 593, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 594, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 595, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 596, + 314, 597, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 598, 345, 346, 347, 599, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 600, 359, 360, 361, 362, 363, + 364, 365, 601, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 602, 379, 380, 381, 382, 383, + 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 603, 399, 400, 604, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 605, 435, 436, 437, 438, 439, 440, 441, 442, + 606, 444, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 0, + 463, 464, 465, 466, 0, 467, 608, 469, 470, 4, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 715, 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, 13, 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, 19, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 3608, 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, 29, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, 52, 53, + 54, 3609, 55, 56, 57, 58, 59, 0, 0, 0, + 0, 61, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 573, 0, 574, 575, 84, 85, 86, 87, 88, 89, + 576, 91, 92, 93, 94, 95, 577, 96, 578, 98, + 99, 100, 101, 102, 579, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 0, 112, 113, 114, 580, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 581, 125, + 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 582, 139, 0, 140, 141, 142, 143, 144, + 145, 146, 583, 148, 149, 150, 151, 584, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 585, 166, 0, 0, 167, 168, 169, 170, 171, + 172, 173, 174, 175, 176, 177, 586, 587, 179, 0, + 180, 181, 182, 3610, 184, 185, 186, 589, 0, 189, + 590, 191, 192, 591, 0, 194, 195, 196, 197, 198, + 199, 200, 201, 202, 203, 204, 205, 206, 592, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 593, 217, + 218, 219, 220, 221, 222, 223, 0, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 0, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 594, 285, + 286, 287, 288, 289, 290, 291, 292, 3611, 293, 294, + 295, 296, 595, 297, 298, 299, 300, 301, 302, 303, + 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, + 596, 314, 597, 316, 317, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 598, 345, 346, 347, 599, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 600, 359, 360, 361, 362, + 363, 364, 365, 601, 367, 368, 369, 370, 371, 372, + 373, 0, 375, 376, 377, 602, 379, 380, 381, 382, + 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 0, 394, 395, 396, 397, 603, 399, 400, 604, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 605, 435, 436, 437, 438, 439, 440, 441, + 442, 606, 444, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 3612, 463, 464, 465, 466, 0, 467, 608, 469, 470, + 4, 5, 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, 0, 0, 851, 0, 13, + 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, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, + 0, 0, 0, 0, 0, 852, 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, 29, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, + 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, 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, 52, + 53, 54, 0, 55, 56, 57, 58, 59, 0, 0, + 0, 0, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 573, 0, 0, 575, 84, 85, 86, 87, 88, + 89, 576, 91, 92, 93, 94, 95, 577, 96, 578, + 98, 99, 100, 101, 102, 579, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 0, 112, 113, 114, 580, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 581, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 582, 139, 0, 140, 141, 142, 143, + 144, 145, 146, 583, 148, 149, 150, 151, 0, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 163, 164, 585, 166, 0, 0, 167, 168, 169, 170, + 171, 172, 173, 174, 175, 176, 177, 586, 587, 179, + 0, 180, 181, 182, 183, 184, 185, 186, 589, 188, + 189, 590, 191, 192, 591, 0, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 592, + 208, 209, 210, 211, 212, 213, 214, 215, 216, 593, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 0, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, 279, 280, 281, 282, 283, 284, 594, + 285, 286, 287, 288, 289, 290, 291, 292, 0, 293, + 294, 295, 296, 595, 297, 298, 299, 300, 301, 302, + 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, + 313, 596, 314, 597, 316, 317, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 598, 345, 346, 347, 599, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 600, 359, 360, 361, + 362, 363, 364, 365, 601, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 602, 379, 380, 381, + 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 0, 394, 395, 396, 397, 603, 399, 400, + 604, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 605, 435, 436, 437, 438, 439, 440, + 441, 442, 606, 444, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, + 461, 855, 463, 464, 465, 466, 0, 467, 608, 469, + 470, 4, 5, 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, 0, 0, 0, 0, + 13, 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, 19, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 22, 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, 29, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 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, 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, + 52, 53, 54, 0, 55, 56, 57, 58, 59, 0, + 0, 0, 0, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, + 78, 79, 573, 0, 0, 575, 84, 85, 86, 87, + 88, 89, 576, 91, 92, 93, 94, 95, 0, 96, + 578, 98, 99, 100, 101, 102, 0, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 0, 112, 113, 114, + 0, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 0, 125, 126, 127, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 582, 139, 0, 140, 141, 142, + 143, 144, 145, 146, 0, 148, 149, 150, 151, 0, + 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 585, 166, 0, 0, 167, 168, 169, + 170, 171, 172, 173, 174, 175, 176, 177, 586, 0, + 179, 0, 180, 181, 182, 183, 184, 185, 186, 589, + 188, 189, 0, 191, 192, 591, 0, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 592, 208, 209, 210, 211, 212, 213, 214, 215, 216, + 0, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 0, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 0, 285, 286, 287, 288, 289, 290, 291, 292, 0, + 293, 294, 295, 296, 0, 297, 298, 299, 300, 301, + 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, + 312, 313, 0, 314, 597, 316, 317, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 0, 345, 346, 347, 599, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 0, 359, 360, + 361, 362, 363, 364, 365, 0, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 0, 379, 380, + 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 0, 394, 395, 396, 397, 603, 399, + 400, 604, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 0, 435, 436, 437, 438, 439, + 440, 441, 442, 606, 444, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, + 460, 461, 462, 463, 464, 465, 466, 0, 467, 608, + 469, 470, 4, 5, 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, 0, 0, 0, + 0, 13, 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, 19, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, + 0, 0, 0, 0, 0, 0, 0, 1898, 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, 29, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 34, 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, 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, 1909, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 1899, 55, 0, 57, 58, 59, + 0, 0, 0, 0, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 0, 72, 73, 74, 75, 76, + 77, 78, 79, 0, 0, 0, 0, 84, 85, 86, + 87, 88, 0, 0, 91, 92, 93, 94, 95, 0, + 0, 0, 98, 99, 100, 101, 102, 0, 103, 104, + 105, 106, 0, 0, 0, 0, 0, 0, 112, 0, + 114, 0, 116, 117, 1900, 119, 120, 121, 122, 123, + 124, 0, 125, 126, 127, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 0, 139, 0, 140, 141, + 142, 143, 144, 145, 146, 0, 148, 149, 150, 151, + 0, 152, 153, 154, 155, 156, 157, 158, 159, 160, + 161, 162, 0, 0, 0, 166, 0, 0, 167, 168, + 169, 170, 171, 172, 173, 174, 175, 176, 177, 0, + 0, 0, 0, 0, 181, 182, 1901, 184, 185, 186, + 0, 188, 189, 0, 191, 192, 0, 0, 194, 0, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 0, 208, 209, 210, 211, 212, 213, 214, 215, + 216, 0, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 0, 250, 251, 252, 253, + 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, + 284, 0, 285, 286, 287, 288, 289, 290, 291, 292, + 0, 293, 294, 295, 296, 0, 0, 0, 299, 0, + 301, 302, 0, 304, 305, 306, 307, 0, 309, 310, + 311, 312, 0, 0, 0, 0, 316, 317, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 0, 343, 0, 345, 346, 347, 0, 349, + 350, 0, 352, 353, 354, 355, 356, 357, 0, 359, + 360, 361, 362, 363, 364, 365, 0, 367, 368, 369, + 0, 371, 372, 373, 374, 0, 376, 377, 4, 5, + 380, 381, 0, 0, 384, 385, 386, 0, 388, 0, + 390, 391, 392, 393, 0, 394, 395, 396, 397, 0, + 399, 400, 0, 402, 0, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 0, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 0, 435, 436, 0, 438, + 439, 440, 441, 0, 0, 444, 445, 13, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + 459, 460, 461, 0, 0, 464, 465, 0, 0, 467, + 0, 469, 470, 0, 0, 19, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, + 0, 0, 0, 1898, 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, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 34, 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, 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, + 1919, 0, 0, 0, 0, 0, 0, 52, 53, 54, + 1899, 55, 0, 57, 58, 59, 0, 0, 0, 0, + 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 0, 72, 73, 74, 75, 76, 77, 78, 79, 0, + 0, 0, 0, 84, 85, 86, 87, 88, 0, 0, + 91, 92, 93, 94, 95, 0, 0, 0, 98, 99, + 100, 101, 102, 0, 103, 104, 105, 106, 0, 0, + 0, 0, 0, 0, 112, 0, 114, 0, 116, 117, + 1900, 119, 120, 121, 122, 123, 124, 0, 125, 126, + 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 0, 139, 0, 140, 141, 142, 143, 144, 145, + 146, 0, 148, 149, 150, 151, 0, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 0, 0, + 0, 166, 0, 0, 167, 168, 169, 170, 171, 172, + 173, 174, 175, 176, 177, 0, 0, 0, 0, 0, + 181, 182, 1901, 184, 185, 186, 0, 188, 189, 0, + 191, 192, 0, 0, 194, 0, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 0, 208, 209, + 210, 211, 212, 213, 214, 215, 216, 0, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 0, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 283, 284, 0, 285, 286, + 287, 288, 289, 290, 291, 292, 0, 293, 294, 295, + 296, 0, 0, 0, 299, 0, 301, 302, 0, 304, + 305, 306, 307, 0, 309, 310, 311, 312, 0, 0, + 0, 0, 316, 317, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 0, 343, + 0, 345, 346, 347, 0, 349, 350, 0, 352, 353, + 354, 355, 356, 357, 0, 359, 360, 361, 362, 363, + 364, 365, 0, 367, 368, 369, 0, 371, 372, 373, + 374, 0, 376, 377, 4, 5, 380, 381, 0, 0, + 384, 385, 386, 0, 388, 0, 390, 391, 392, 393, + 0, 394, 395, 396, 397, 0, 399, 400, 0, 402, + 0, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 0, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 0, 435, 436, 0, 438, 439, 440, 441, 0, + 0, 444, 445, 13, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, 459, 460, 461, 0, + 0, 464, 465, 0, 0, 467, 0, 469, 470, 0, + 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 22, 0, 0, 0, 0, 0, 0, 0, 0, 1898, + 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, + 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 34, 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, 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, 52, 53, 54, 1899, 55, 0, 57, + 58, 59, 0, 0, 0, 0, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 0, 72, 73, 74, + 75, 76, 77, 78, 79, 0, 0, 0, 0, 84, + 85, 86, 87, 88, 0, 0, 91, 92, 93, 94, + 95, 0, 0, 0, 98, 99, 100, 101, 102, 0, + 103, 104, 105, 106, 0, 0, 0, 0, 0, 0, + 112, 0, 114, 0, 116, 117, 1900, 119, 120, 121, + 122, 123, 124, 0, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 135, 136, 137, 0, 139, 0, + 140, 141, 142, 143, 144, 145, 146, 0, 148, 149, + 150, 151, 0, 152, 153, 154, 155, 156, 157, 158, + 159, 160, 161, 162, 0, 0, 0, 166, 0, 0, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 0, 0, 0, 0, 0, 181, 182, 1901, 184, + 185, 186, 0, 188, 189, 0, 191, 192, 0, 0, + 194, 0, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 0, 208, 209, 210, 211, 212, 213, + 214, 215, 216, 0, 217, 218, 219, 220, 221, 222, + 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, + 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 0, 250, 251, + 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, + 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, + 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, + 282, 283, 284, 0, 285, 286, 287, 288, 289, 290, + 291, 292, 0, 293, 294, 295, 296, 0, 0, 0, + 299, 0, 301, 302, 0, 304, 305, 306, 307, 0, + 309, 310, 311, 312, 0, 0, 0, 0, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 0, 343, 0, 345, 346, 347, + 0, 349, 350, 0, 352, 353, 354, 355, 356, 357, + 0, 359, 360, 361, 362, 363, 364, 365, 0, 367, + 368, 369, 0, 371, 372, 373, 374, 0, 376, 377, + 0, 0, 380, 381, 0, 0, 384, 385, 386, 0, + 388, 0, 390, 391, 392, 393, 0, 394, 395, 396, + 397, 0, 399, 400, 0, 402, 0, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 0, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 0, 435, 436, + 0, 438, 439, 440, 441, 0, 0, 444, 445, 0, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, 459, 460, 461, 4, 5, 464, 465, 0, + 0, 467, 0, 469, 470, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1508, 1509, + 1510, 1511, 0, 4030, 1514, 1515, 1516, 0, 0, 1519, + 1520, 1521, 1522, 1523, 1524, 1525, 1526, 4031, 1528, 1529, + 0, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1538, + 1539, 1540, 0, 1541, 13, 1542, 1543, 1544, 1545, 1546, + 1547, 1548, 4032, 1550, 1551, 1552, 1553, 1554, 1555, 1556, + 1557, 1558, 1559, 1560, 1561, 4033, 1563, 1564, 1565, 1566, + 1567, 1568, 19, 1569, 1570, 1571, 1572, 1573, 1574, 1575, + 1576, 4034, 1578, 0, 1579, 1580, 1581, 1582, 1583, 0, + 0, 22, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, + 3941, 1593, 1594, 1595, 0, 1596, 1597, 0, 1598, 4035, + 1600, 4036, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1609, + 1610, 1611, 1612, 1613, 1614, 1615, 1616, 1617, 1618, 1619, + 0, 0, 0, 1623, 1624, 1625, 1626, 1627, 1628, 1629, + 0, 0, 0, 1633, 1634, 1635, 1636, 1637, 1638, 1639, + 1640, 29, 1641, 1642, 1643, 1644, 1645, 1646, 0, 1648, + 1649, 1650, 1651, 31, 1652, 1653, 1654, 1655, 0, 1656, + 1657, 1658, 1659, 1660, 34, 1661, 1662, 1663, 1664, 1665, + 1666, 1667, 1668, 1669, 1670, 1671, 1672, 1673, 1674, 1675, + 0, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685, + 1686, 1687, 1688, 1689, 1690, 1691, 1692, 1693, 1694, 1695, + 1696, 1697, 1698, 1699, 0, 1701, 1702, 0, 1704, 1705, + 1706, 1707, 1708, 1709, 1710, 1711, 1712, 1713, 1714, 1715, + 1716, 1717, 1718, 1719, 1720, 0, 1721, 1722, 1723, 1724, + 0, 0, 0, 1728, 1729, 1730, 1731, 1732, 1733, 1734, + 1735, 4037, 1736, 1737, 1738, 1739, 1740, 1741, 1742, 1743, + 1744, 1745, 0, 4038, 1748, 1749, 1750, 1751, 1752, 1753, + 1754, 1755, 1756, 1757, 52, 53, 54, 0, 55, 56, + 57, 58, 59, 0, 1758, 1759, 1760, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 574, 575, + 0, 85, 0, 0, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 0, 0, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 4039, 4040, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 584, 152, 153, 154, 0, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 0, 586, 587, 179, 0, 180, 181, 182, 0, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 0, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 0, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 4041, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 0, + 0, 0, 292, 1774, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 0, 0, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 0, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 0, 374, 375, 376, + 377, 602, 4042, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 0, 423, 424, 0, + 426, 427, 4043, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 0, 4044, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 0, 463, 464, 465, + 466, 0, 467, 608, 469, 4, 5, 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, + 0, 0, 0, 0, 13, 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, 19, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, + 852, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, + 0, 0, 5431, 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, 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, 52, 53, 54, 0, 55, 56, + 57, 58, 59, 0, 0, 0, 0, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 79, 573, 0, 0, 575, + 0, 85, 0, 0, 88, 89, 576, 91, 92, 93, + 94, 95, 577, 96, 578, 98, 99, 100, 0, 0, + 579, 103, 104, 105, 106, 107, 108, 109, 110, 111, + 0, 112, 113, 114, 580, 116, 117, 118, 119, 120, + 121, 122, 123, 124, 581, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 0, 0, 137, 582, 139, + 0, 140, 141, 142, 143, 144, 145, 146, 583, 148, + 149, 150, 151, 0, 152, 153, 154, 0, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 585, 166, 0, + 0, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 0, 586, 587, 179, 0, 180, 181, 182, 5432, + 184, 185, 186, 589, 188, 189, 590, 191, 192, 591, + 0, 194, 195, 196, 197, 198, 199, 200, 201, 202, + 203, 204, 205, 206, 592, 208, 209, 210, 211, 212, + 213, 214, 0, 216, 593, 217, 218, 219, 220, 221, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 0, 250, + 251, 252, 253, 254, 255, 256, 0, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, + 271, 272, 273, 274, 0, 0, 277, 278, 279, 280, + 281, 282, 283, 284, 594, 285, 286, 287, 288, 0, + 0, 0, 292, 0, 293, 294, 295, 296, 595, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 596, 314, 597, 316, + 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 0, 0, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 598, 345, 346, + 347, 599, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 600, 359, 360, 361, 0, 363, 364, 365, 601, + 367, 368, 369, 370, 371, 372, 0, 374, 375, 376, + 377, 602, 0, 380, 381, 382, 383, 384, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 0, 394, 395, + 396, 397, 603, 399, 400, 604, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, + 416, 417, 418, 419, 420, 421, 0, 423, 424, 0, + 426, 427, 0, 429, 430, 431, 432, 433, 605, 435, + 436, 437, 438, 439, 440, 441, 442, 606, 444, 445, + 446, 447, 448, 449, 0, 0, 452, 453, 454, 455, + 456, 457, 458, 459, 460, 461, 1781, 463, 464, 465, + 466, 0, 467, 608, 469 +}; + +static const yytype_int16 yycheck[] = +{ + 3, 0, 30, 631, 82, 8, 856, 967, 645, 82, + 693, 471, 2109, 693, 694, 0, 0, 1446, 645, 2003, + 1967, 0, 2264, 0, 639, 2320, 2442, 0, 2058, 0, + 809, 2122, 1414, 36, 660, 1417, 1411, 40, 623, 721, + 0, 626, 45, 2294, 0, 48, 2559, 0, 0, 2565, + 0, 2667, 1828, 1276, 809, 2626, 693, 776, 1621, 0, + 0, 1973, 1577, 628, 3285, 2012, 693, 1982, 3602, 2319, + 3034, 2461, 1182, 2575, 2405, 688, 2042, 629, 661, 1044, + 661, 1798, 761, 41, 763, 3753, 1417, 766, 767, 0, + 1457, 2512, 3298, 1517, 2060, 647, 661, 649, 650, 651, + 652, 653, 654, 655, 1386, 657, 658, 3911, 691, 3829, + 691, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, + 2104, 2105, 2106, 2107, 3178, 1518, 691, 2548, 1457, 4393, + 1255, 1405, 1647, 1343, 4393, 687, 1876, 641, 2548, 738, + 877, 3046, 741, 3986, 3822, 2179, 2180, 4293, 2122, 714, + 178, 3685, 1277, 2237, 847, 2668, 1549, 4299, 3109, 4439, + 3797, 3044, 165, 728, 4771, 1218, 4315, 1220, 1221, 2080, + 3413, 3414, 2288, 856, 2655, 1228, 2432, 2088, 2089, 3811, + 2091, 2092, 4023, 2186, 1577, 3139, 3220, 1013, 38, 2943, + 3434, 743, 744, 3830, 3669, 3073, 700, 2288, 3138, 3139, + 3430, 5140, 2956, 2206, 3434, 1278, 4283, 4039, 4761, 4043, + 4882, 4043, 3148, 0, 6, 7, 2513, 5121, 639, 856, + 3883, 639, 639, 639, 1184, 851, 1622, 2230, 2231, 856, + 639, 4393, 4262, 15, 2369, 1620, 1632, 15, 15, 876, + 12, 2545, 16, 17, 15, 1630, 26, 97, 83, 876, + 42, 2285, 47, 1768, 1647, 67, 42, 1772, 6, 7, + 825, 6, 7, 53, 15, 15, 6, 7, 15, 15, + 2660, 1786, 1621, 1622, 526, 1485, 5124, 6, 7, 15, + 15, 15, 26, 1632, 5320, 47, 6, 7, 1114, 1115, + 1116, 127, 65, 6, 7, 4796, 15, 6, 7, 63, + 145, 1127, 787, 33, 889, 890, 891, 892, 4282, 4283, + 31, 41, 315, 89, 2288, 47, 344, 42, 42, 4671, + 50, 42, 1746, 178, 53, 33, 42, 11, 12, 122, + 895, 1727, 836, 41, 182, 206, 888, 1761, 26, 31, + 1725, 1765, 50, 3580, 47, 53, 898, 899, 31, 31, + 26, 1775, 51, 1777, 1778, 1779, 1780, 31, 1782, 99, + 244, 5354, 5355, 366, 31, 31, 156, 42, 1764, 1793, + 1794, 1795, 1796, 1797, 2669, 1768, 3330, 232, 1727, 1772, + 53, 42, 299, 217, 1769, 31, 268, 4891, 158, 242, + 3330, 254, 283, 1786, 1953, 1954, 33, 26, 143, 314, + 51, 6, 7, 1962, 41, 104, 31, 2504, 201, 110, + 123, 318, 4719, 50, 123, 1764, 26, 3766, 26, 4393, + 24, 25, 26, 3898, 28, 127, 30, 232, 32, 3183, + 3184, 42, 244, 1992, 26, 1994, 378, 42, 2643, 33, + 310, 251, 305, 3851, 4839, 433, 42, 41, 4839, 1824, + 2009, 2010, 2011, 104, 26, 168, 50, 2016, 2017, 168, + 24, 25, 26, 4753, 28, 2024, 30, 971, 32, 24, + 25, 26, 119, 28, 26, 30, 182, 32, 208, 123, + 281, 4839, 254, 156, 26, 33, 471, 267, 47, 99, + 33, 99, 3375, 41, 143, 33, 33, 290, 41, 299, + 208, 143, 50, 41, 41, 152, 71, 50, 127, 128, + 3026, 448, 50, 50, 387, 5642, 127, 42, 5122, 99, + 28, 42, 178, 526, 168, 314, 33, 99, 427, 99, + 122, 42, 33, 305, 41, 203, 178, 71, 33, 73, + 41, 314, 314, 50, 65, 371, 41, 99, 33, 50, + 54, 299, 537, 537, 14, 50, 41, 99, 314, 42, + 5961, 71, 6115, 408, 788, 50, 4873, 4764, 96, 178, + 254, 208, 645, 153, 258, 42, 591, 42, 33, 203, + 50, 203, 4386, 328, 5432, 315, 41, 114, 33, 582, + 128, 393, 197, 33, 42, 50, 41, 537, 2338, 312, + 33, 41, 5533, 312, 542, 50, 197, 315, 41, 211, + 50, 1304, 173, 4147, 208, 203, 641, 50, 110, 622, + 623, 305, 6059, 626, 2919, 628, 6063, 155, 203, 5622, + 314, 5135, 268, 4296, 14, 33, 99, 352, 53, 314, + 639, 688, 3875, 41, 1209, 292, 386, 107, 232, 203, + 335, 598, 50, 1218, 639, 639, 1221, 1117, 661, 1147, + 208, 1226, 54, 43, 44, 208, 645, 1386, 645, 598, + 208, 208, 723, 1272, 645, 1274, 4508, 614, 315, 4154, + 127, 660, 685, 660, 528, 203, 6305, 1366, 691, 660, + 1369, 1179, 1257, 740, 1373, 1374, 1375, 1376, 290, 639, + 4849, 208, 528, 706, 645, 4867, 234, 208, 281, 779, + 40, 714, 427, 208, 693, 3921, 693, 787, 1473, 660, + 6339, 315, 693, 208, 727, 728, 173, 107, 686, 676, + 314, 1841, 192, 294, 645, 4840, 787, 4842, 201, 781, + 4845, 53, 5441, 693, 786, 772, 788, 676, 57, 660, + 386, 299, 693, 208, 4859, 4171, 4172, 760, 414, 747, + 1870, 358, 787, 208, 779, 3015, 258, 315, 208, 454, + 5701, 709, 315, 776, 254, 208, 341, 315, 315, 4753, + 5375, 688, 693, 287, 311, 3027, 252, 686, 638, 727, + 793, 580, 122, 643, 787, 629, 504, 824, 801, 802, + 6201, 366, 787, 1496, 6241, 414, 809, 642, 315, 659, + 208, 613, 192, 173, 315, 252, 386, 287, 474, 378, + 315, 423, 825, 673, 580, 305, 3780, 632, 5118, 1444, + 315, 834, 366, 145, 314, 3166, 5440, 779, 314, 649, + 3780, 547, 1407, 669, 847, 782, 696, 6400, 160, 5129, + 314, 3787, 477, 726, 659, 3791, 366, 658, 645, 817, + 315, 743, 5989, 780, 577, 782, 196, 782, 577, 639, + 315, 201, 851, 660, 851, 315, 4284, 856, 3083, 856, + 851, 884, 315, 886, 299, 3639, 889, 890, 891, 892, + 893, 782, 895, 4867, 2323, 730, 1481, 876, 782, 876, + 755, 506, 3153, 738, 5457, 876, 741, 669, 281, 779, + 851, 782, 578, 758, 3209, 506, 779, 315, 5270, 593, + 2835, 2836, 1474, 723, 688, 4162, 1386, 593, 5235, 782, + 5127, 779, 581, 577, 294, 876, 894, 669, 896, 732, + 851, 642, 4291, 335, 643, 856, 782, 593, 782, 2860, + 2861, 954, 2863, 2864, 957, 717, 1441, 5805, 5657, 5807, + 290, 964, 5998, 966, 3169, 876, 5470, 743, 5232, 742, + 782, 970, 614, 5232, 5475, 287, 5477, 980, 955, 956, + 560, 958, 959, 960, 779, 970, 970, 779, 965, 769, + 1242, 970, 643, 970, 786, 787, 786, 970, 5670, 970, + 3250, 787, 779, 3307, 3308, 787, 1971, 779, 782, 787, + 2392, 3146, 3147, 3016, 955, 956, 787, 958, 959, 960, + 970, 2131, 1987, 1444, 965, 769, 1444, 1444, 1444, 970, + 970, 1283, 5062, 779, 763, 1444, 787, 787, 786, 763, + 787, 786, 763, 5120, 955, 956, 786, 958, 959, 960, + 780, 787, 787, 787, 965, 3350, 5363, 786, 2183, 970, + 2185, 2392, 787, 2188, 851, 2432, 786, 2177, 787, 856, + 5232, 787, 384, 786, 782, 2200, 779, 786, 2203, 2361, + 782, 769, 2207, 6076, 2137, 6078, 6079, 779, 763, 876, + 2372, 2520, 780, 769, 782, 779, 779, 779, 2527, 2152, + 5653, 5654, 763, 2432, 780, 2490, 782, 2492, 2233, 2234, + 2235, 708, 779, 786, 782, 2511, 1119, 768, 1117, 4002, + 2505, 1876, 4785, 1949, 1950, 4803, 787, 4661, 4806, 6033, + 6034, 704, 1117, 780, 3431, 4969, 3433, 4969, 2523, 4973, + 769, 4973, 2538, 5538, 5118, 2541, 5120, 5538, 785, 1842, + 2535, 780, 763, 782, 2550, 2228, 4389, 2122, 782, 769, + 782, 769, 2511, 782, 692, 730, 2551, 763, 955, 956, + 14, 958, 959, 960, 779, 4807, 780, 769, 965, 1182, + 5538, 786, 787, 970, 6177, 6178, 780, 3284, 782, 2538, + 2749, 787, 2541, 2752, 782, 6188, 5503, 769, 5505, 43, + 44, 2550, 5797, 5510, 33, 33, 1209, 782, 4624, 2768, + 5517, 5518, 41, 41, 299, 1218, 780, 769, 1221, 528, + 5527, 50, 50, 1226, 1448, 780, 5533, 769, 782, 2788, + 169, 53, 33, 28, 782, 30, 14, 780, 763, 782, + 41, 1319, 763, 780, 782, 782, 1939, 42, 1833, 50, + 281, 33, 763, 6246, 1257, 3339, 1839, 723, 5232, 41, + 768, 769, 787, 107, 782, 43, 44, 6206, 50, 4323, + 5823, 2481, 99, 780, 1839, 4809, 787, 57, 1960, 780, + 763, 782, 3522, 4337, 2110, 780, 723, 782, 19, 20, + 229, 71, 1295, 73, 1297, 780, 763, 782, 763, 779, + 1303, 1304, 40, 299, 787, 14, 782, 151, 768, 769, + 770, 771, 772, 773, 4558, 763, 391, 1320, 782, 72, + 787, 143, 787, 2288, 684, 369, 1329, 782, 4558, 107, + 33, 704, 3537, 376, 43, 44, 281, 782, 41, 787, + 1343, 1344, 782, 143, 2607, 448, 5512, 50, 192, 782, + 33, 4305, 4306, 2132, 2036, 281, 1383, 376, 41, 50, + 232, 1364, 735, 5082, 4242, 4305, 4306, 50, 33, 19, + 20, 2090, 4406, 4309, 4310, 1940, 41, 2132, 331, 208, + 208, 295, 780, 1386, 1387, 50, 5666, 1386, 768, 769, + 770, 771, 772, 773, 5701, 572, 376, 116, 107, 239, + 5707, 1386, 732, 317, 1407, 1909, 1448, 208, 232, 1367, + 1368, 99, 376, 144, 192, 1919, 53, 33, 143, 40, + 19, 20, 1425, 471, 141, 2204, 208, 98, 4182, 3669, + 71, 75, 580, 5274, 50, 5540, 258, 1272, 2491, 1274, + 435, 390, 4196, 1446, 1447, 1444, 4200, 127, 580, 2204, + 494, 763, 5721, 178, 378, 5991, 1441, 1460, 196, 1444, + 1444, 232, 1312, 33, 3714, 196, 208, 143, 1471, 3711, + 1473, 41, 3588, 1323, 270, 3459, 298, 10, 1481, 1482, + 50, 2164, 1485, 192, 2164, 5981, 315, 315, 160, 2168, + 160, 3741, 197, 1496, 144, 3751, 3886, 3588, 298, 33, + 136, 491, 752, 6110, 1444, 208, 454, 41, 225, 67, + 1345, 614, 803, 201, 315, 3936, 50, 3938, 2237, 314, + 2630, 1981, 363, 14, 644, 208, 3936, 2164, 3938, 779, + 4481, 4482, 4013, 315, 5672, 5842, 5674, 2164, 5170, 510, + 769, 178, 3747, 208, 2109, 144, 196, 226, 178, 235, + 74, 780, 43, 44, 5861, 33, 2139, 5723, 2139, 333, + 33, 341, 389, 41, 391, 3341, 505, 193, 41, 746, + 577, 226, 50, 369, 2139, 196, 281, 50, 287, 359, + 74, 5850, 553, 2338, 2169, 2170, 366, 2172, 2173, 2174, + 2175, 572, 236, 3577, 127, 232, 2422, 196, 425, 2184, + 5278, 3567, 3568, 3569, 3570, 782, 4489, 755, 361, 2302, + 2238, 391, 315, 561, 3588, 3355, 107, 2202, 74, 5094, + 492, 1456, 298, 755, 2128, 4015, 143, 675, 455, 5104, + 5105, 107, 315, 736, 314, 5313, 3583, 459, 208, 3551, + 593, 3552, 2361, 3554, 634, 688, 3561, 3562, 5367, 299, + 315, 695, 3857, 2372, 2373, 386, 74, 6264, 3898, 459, + 151, 2340, 2341, 2926, 2927, 2344, 307, 787, 492, 688, + 2349, 2350, 2351, 704, 208, 33, 3679, 33, 369, 2278, + 5818, 352, 6218, 41, 608, 41, 244, 3892, 3983, 3894, + 3895, 4934, 50, 688, 50, 3900, 434, 782, 494, 315, + 258, 192, 787, 3908, 779, 654, 2305, 3912, 688, 3914, + 101, 4227, 743, 432, 74, 314, 192, 688, 6214, 2347, + 2348, 492, 2287, 67, 688, 76, 77, 568, 568, 33, + 208, 357, 658, 74, 33, 208, 386, 41, 3105, 14, + 33, 33, 41, 1816, 432, 315, 50, 173, 41, 41, + 475, 50, 666, 506, 2337, 460, 2436, 50, 50, 704, + 2345, 588, 392, 2328, 703, 746, 497, 403, 43, 44, + 566, 33, 2337, 6269, 2339, 782, 3105, 551, 704, 41, + 704, 315, 2747, 459, 463, 775, 782, 386, 50, 3012, + 3172, 787, 3174, 3175, 5768, 622, 720, 321, 743, 3783, + 472, 506, 472, 494, 358, 2915, 2916, 57, 463, 1812, + 232, 328, 123, 434, 6310, 2380, 127, 1820, 3185, 1822, + 10, 71, 5796, 73, 2561, 5300, 5800, 321, 5974, 1832, + 1833, 2941, 107, 5975, 191, 74, 1839, 315, 1841, 1842, + 458, 3172, 315, 3174, 3175, 3127, 5524, 497, 5997, 40, + 208, 3133, 208, 33, 6003, 653, 3185, 168, 2471, 633, + 2985, 41, 173, 40, 2989, 321, 2991, 1870, 45, 5712, + 50, 33, 5509, 1876, 231, 33, 2441, 572, 31, 41, + 3005, 4635, 101, 41, 127, 2938, 4640, 4641, 50, 614, + 4944, 3975, 50, 3018, 3019, 206, 2589, 2590, 497, 695, + 244, 6165, 2955, 321, 208, 296, 2959, 6166, 1911, 208, + 2536, 268, 338, 4484, 4154, 208, 208, 192, 472, 1023, + 1024, 1025, 766, 767, 768, 769, 770, 771, 772, 773, + 10, 150, 568, 5907, 177, 4840, 1939, 1940, 342, 2504, + 4845, 763, 5620, 3977, 4998, 4850, 208, 4363, 2513, 404, + 730, 141, 374, 782, 782, 33, 2639, 315, 33, 315, + 756, 321, 2466, 41, 1068, 4216, 41, 127, 763, 1073, + 5944, 6109, 50, 768, 769, 50, 4218, 5371, 2591, 5796, + 321, 782, 1981, 601, 127, 448, 4499, 5961, 1973, 767, + 768, 769, 770, 771, 772, 773, 1981, 468, 241, 704, + 782, 10, 2639, 3213, 695, 196, 2084, 33, 4339, 33, + 568, 315, 2639, 744, 167, 41, 315, 41, 649, 33, + 409, 410, 315, 315, 50, 209, 50, 41, 208, 386, + 2667, 33, 145, 437, 2037, 506, 50, 2663, 2041, 41, + 2667, 398, 119, 167, 2047, 421, 208, 127, 50, 461, + 208, 746, 2665, 315, 145, 2058, 293, 766, 767, 768, + 769, 770, 771, 772, 773, 42, 33, 5745, 6025, 160, + 313, 6028, 5777, 723, 41, 152, 712, 296, 3038, 782, + 33, 493, 321, 50, 4505, 2070, 2070, 782, 41, 4510, + 572, 341, 443, 444, 744, 4505, 4517, 50, 652, 782, + 4510, 47, 3376, 337, 117, 118, 2109, 4517, 2111, 359, + 4350, 4351, 595, 568, 4354, 4355, 366, 782, 755, 753, + 4360, 4361, 99, 5791, 2127, 5793, 763, 5944, 2131, 2132, + 208, 6105, 141, 208, 5854, 315, 2139, 2140, 5197, 323, + 53, 498, 462, 2862, 2648, 744, 33, 4387, 779, 386, + 2654, 614, 170, 315, 41, 567, 2838, 315, 2161, 312, + 106, 99, 2666, 50, 5223, 541, 2169, 2170, 2171, 2172, + 2173, 2174, 2175, 2176, 2177, 2178, 5081, 5082, 4383, 4384, + 4385, 2184, 208, 457, 208, 2164, 668, 2164, 312, 88, + 661, 5980, 205, 2164, 208, 458, 63, 72, 2201, 2202, + 3976, 2204, 4407, 4408, 364, 4410, 208, 307, 691, 229, + 310, 568, 782, 5918, 2164, 292, 671, 4128, 71, 4130, + 73, 364, 2225, 2164, 35, 36, 37, 6201, 39, 463, + 528, 251, 3285, 251, 2237, 3345, 648, 315, 5916, 5633, + 315, 208, 33, 156, 5638, 5639, 99, 5152, 782, 5154, + 41, 126, 2935, 2164, 5308, 208, 3996, 3997, 495, 50, + 5928, 5467, 745, 3223, 746, 2893, 577, 81, 6225, 282, + 590, 5025, 5026, 736, 141, 766, 767, 768, 769, 770, + 771, 772, 773, 5342, 2287, 2120, 6090, 6091, 448, 315, + 450, 315, 154, 384, 770, 771, 772, 773, 2935, 2302, + 63, 315, 780, 3678, 2307, 448, 33, 450, 2935, 782, + 131, 120, 4224, 315, 41, 613, 4033, 6106, 6107, 782, + 55, 208, 454, 50, 713, 2328, 600, 716, 413, 33, + 413, 723, 2335, 147, 2337, 2338, 2339, 41, 601, 2922, + 2343, 2922, 2345, 214, 158, 156, 50, 667, 315, 403, + 225, 33, 166, 602, 3729, 226, 47, 2922, 2361, 41, + 1464, 4566, 315, 417, 226, 303, 304, 499, 50, 2372, + 2373, 669, 2207, 6041, 2939, 33, 6044, 2380, 141, 193, + 540, 33, 4587, 41, 3751, 2970, 217, 6279, 3081, 41, + 2975, 3351, 50, 5787, 33, 787, 2856, 540, 50, 2984, + 0, 6169, 41, 5953, 489, 2990, 489, 128, 3127, 218, + 281, 50, 5921, 5922, 3133, 106, 151, 208, 293, 3032, + 47, 4663, 3751, 33, 782, 47, 782, 528, 315, 3148, + 151, 41, 167, 6325, 3816, 249, 568, 6249, 2441, 3118, + 50, 33, 3121, 2278, 4684, 5995, 3125, 2450, 47, 41, + 281, 33, 3207, 2456, 614, 627, 287, 2460, 50, 41, + 47, 47, 5367, 277, 2537, 403, 3065, 53, 50, 55, + 2305, 614, 2545, 4889, 3154, 3040, 780, 4808, 2481, 106, + 730, 208, 6250, 782, 106, 3816, 3596, 51, 7, 782, + 782, 766, 767, 768, 769, 770, 771, 772, 773, 573, + 574, 2504, 4918, 238, 208, 3787, 33, 106, 3937, 3791, + 2513, 683, 613, 366, 41, 148, 3626, 4032, 151, 106, + 782, 5575, 787, 50, 315, 6293, 208, 5029, 33, 144, + 3115, 602, 3117, 386, 763, 128, 41, 475, 3123, 3124, + 104, 2544, 128, 4933, 101, 50, 33, 6359, 6360, 6245, + 208, 6060, 763, 4974, 41, 6064, 208, 2536, 57, 2536, + 6328, 154, 3615, 50, 4974, 2536, 33, 5196, 669, 208, + 5324, 5325, 71, 2576, 41, 2578, 650, 476, 3631, 212, + 2583, 196, 3, 50, 3637, 3638, 2589, 2590, 315, 6285, + 6358, 3156, 463, 150, 2667, 2536, 3978, 33, 208, 136, + 3355, 5230, 782, 2606, 2607, 3980, 4030, 4031, 4523, 4524, + 31, 315, 6257, 6258, 50, 3298, 208, 4041, 780, 145, + 3339, 158, 782, 3588, 782, 2536, 208, 2630, 5044, 4576, + 57, 2634, 141, 315, 160, 5540, 4666, 4552, 153, 4032, + 4606, 2644, 419, 5607, 769, 4038, 73, 3978, 2651, 426, + 33, 4044, 4567, 168, 6299, 780, 2659, 315, 41, 2662, + 2639, 3298, 2639, 315, 769, 33, 33, 50, 2639, 206, + 779, 3298, 4619, 41, 41, 780, 315, 782, 787, 413, + 5109, 208, 50, 50, 2663, 5114, 2663, 586, 2667, 787, + 2667, 1050, 2663, 682, 593, 2438, 2667, 254, 2639, 2442, + 599, 690, 763, 208, 782, 315, 695, 782, 214, 311, + 1069, 1070, 533, 534, 19, 20, 537, 538, 539, 3284, + 226, 208, 2663, 315, 2709, 2709, 2667, 271, 2639, 3689, + 713, 647, 31, 315, 717, 3418, 88, 328, 282, 296, + 154, 208, 33, 6252, 6253, 768, 769, 3430, 305, 2536, + 41, 3434, 2663, 3435, 780, 65, 2667, 314, 782, 50, + 510, 3344, 268, 3344, 3446, 3447, 1334, 22, 782, 3451, + 258, 328, 1340, 1341, 29, 674, 31, 5027, 737, 3344, + 782, 3418, 23, 289, 178, 26, 27, 33, 315, 705, + 31, 3418, 708, 3430, 780, 41, 782, 3434, 36, 37, + 33, 4350, 4351, 3430, 50, 4354, 4355, 3434, 41, 2812, + 315, 4360, 4361, 2816, 33, 782, 779, 50, 3597, 735, + 1424, 3503, 41, 1427, 1428, 208, 2829, 743, 315, 782, + 4582, 50, 343, 5249, 4586, 50, 735, 81, 3520, 88, + 208, 208, 3597, 33, 5260, 33, 299, 780, 315, 782, + 33, 41, 2639, 41, 5094, 6315, 6316, 2856, 41, 417, + 50, 33, 50, 53, 5104, 5105, 3431, 50, 3433, 41, + 780, 2856, 782, 6407, 226, 5504, 2663, 141, 50, 36, + 2667, 128, 6103, 40, 5089, 5090, 5091, 5092, 45, 33, + 5095, 5096, 5521, 780, 780, 5100, 782, 41, 5103, 746, + 780, 5106, 782, 147, 5109, 5534, 50, 5536, 5113, 5114, + 2051, 2052, 2915, 2916, 158, 670, 268, 208, 33, 2922, + 33, 24, 166, 2926, 2927, 28, 41, 30, 41, 32, + 436, 780, 315, 782, 670, 50, 2939, 50, 2941, 6033, + 6034, 2944, 2945, 33, 113, 114, 115, 315, 315, 193, + 281, 41, 763, 764, 765, 24, 2935, 4339, 2935, 28, + 50, 30, 208, 32, 2935, 214, 2969, 2970, 782, 460, + 3653, 3654, 2975, 3653, 3654, 208, 33, 226, 4890, 128, + 33, 2984, 351, 352, 41, 4208, 338, 2990, 41, 208, + 33, 782, 4555, 50, 2935, 784, 785, 50, 41, 780, + 3960, 782, 119, 786, 33, 249, 123, 50, 4339, 780, + 127, 782, 41, 5043, 3017, 780, 3653, 3654, 208, 388, + 208, 50, 145, 312, 315, 208, 3653, 3654, 662, 145, + 3033, 4254, 281, 277, 145, 152, 208, 3040, 3041, 3042, + 289, 101, 780, 5614, 782, 28, 3004, 30, 5253, 33, + 5255, 168, 5257, 780, 4164, 787, 173, 41, 427, 3687, + 5300, 413, 33, 780, 208, 782, 50, 3070, 3787, 315, + 41, 3921, 3791, 127, 3077, 324, 780, 734, 3081, 50, + 47, 780, 315, 782, 436, 88, 4461, 4212, 120, 206, + 150, 5006, 780, 208, 782, 208, 315, 3557, 780, 23, + 2935, 5306, 26, 27, 3107, 5345, 787, 31, 3111, 3112, + 3113, 463, 3115, 47, 3117, 281, 515, 516, 208, 3122, + 3123, 3124, 780, 657, 3127, 315, 129, 315, 780, 436, + 3133, 530, 315, 532, 101, 780, 4912, 782, 743, 779, + 2431, 780, 145, 315, 4197, 3148, 4199, 2982, 2935, 3152, + 57, 208, 114, 3156, 3157, 208, 5572, 780, 2993, 782, + 268, 780, 4215, 782, 71, 208, 73, 18, 19, 20, + 780, 315, 786, 287, 33, 292, 470, 786, 40, 208, + 5210, 782, 41, 150, 128, 3770, 147, 436, 780, 40, + 780, 50, 782, 55, 254, 141, 3824, 158, 780, 780, + 315, 782, 315, 5819, 3207, 166, 151, 24, 25, 26, + 3213, 28, 647, 30, 463, 32, 454, 606, 18, 19, + 20, 5312, 779, 779, 208, 315, 625, 626, 5744, 584, + 3065, 33, 3797, 602, 3307, 3308, 296, 208, 3921, 41, + 40, 3996, 3997, 3321, 3079, 305, 748, 749, 50, 751, + 619, 753, 475, 780, 314, 3258, 3975, 779, 315, 262, + 704, 499, 315, 3266, 3829, 3830, 71, 580, 328, 128, + 735, 779, 315, 73, 333, 780, 645, 5261, 281, 287, + 780, 3284, 782, 4658, 3921, 779, 315, 254, 249, 151, + 293, 96, 333, 780, 3921, 780, 5809, 782, 779, 99, + 3865, 203, 333, 5333, 109, 167, 658, 203, 551, 160, + 662, 782, 283, 780, 3940, 779, 277, 686, 3321, 3298, + 125, 3298, 40, 561, 5239, 283, 128, 311, 3331, 296, + 3333, 315, 50, 427, 196, 338, 3339, 55, 305, 3342, + 33, 3344, 3345, 360, 315, 196, 786, 314, 41, 208, + 155, 3186, 3355, 5769, 780, 779, 782, 50, 40, 3194, + 160, 328, 780, 780, 782, 782, 604, 33, 50, 15, + 780, 5613, 782, 55, 225, 41, 238, 780, 780, 782, + 782, 779, 779, 735, 50, 955, 956, 3298, 958, 959, + 960, 743, 4171, 4172, 779, 965, 196, 780, 779, 306, + 307, 201, 780, 203, 782, 780, 208, 782, 779, 658, + 413, 737, 780, 780, 33, 779, 4171, 4172, 40, 779, + 779, 355, 41, 779, 73, 225, 5677, 38, 3431, 234, + 3433, 50, 4655, 151, 341, 3412, 3413, 3414, 780, 3418, + 782, 3418, 293, 780, 4126, 782, 779, 3418, 4963, 167, + 779, 3430, 359, 3430, 182, 3434, 315, 3434, 33, 366, + 577, 780, 780, 782, 782, 399, 41, 401, 780, 151, + 782, 3412, 3413, 3414, 780, 50, 782, 3418, 196, 737, + 780, 5776, 782, 779, 391, 167, 735, 5782, 5783, 780, + 295, 779, 779, 293, 743, 5586, 213, 780, 4277, 782, + 779, 3412, 3413, 3414, 780, 5596, 782, 213, 780, 128, + 782, 3298, 779, 315, 196, 208, 4945, 779, 779, 3430, + 238, 4149, 4277, 3434, 213, 763, 764, 765, 779, 5192, + 5193, 3534, 5195, 213, 780, 386, 31, 5200, 160, 779, + 5203, 785, 208, 5206, 5207, 779, 346, 780, 780, 779, + 782, 5214, 127, 5216, 779, 779, 238, 491, 3557, 779, + 3563, 780, 5225, 779, 751, 4947, 3551, 24, 25, 26, + 4963, 28, 3557, 30, 196, 32, 787, 780, 47, 782, + 4633, 4634, 5612, 3418, 5531, 780, 386, 782, 3591, 208, + 4309, 4310, 780, 3596, 3597, 533, 534, 780, 779, 537, + 538, 539, 779, 225, 409, 410, 779, 541, 780, 779, + 24, 25, 33, 15, 28, 5599, 30, 283, 32, 780, + 41, 782, 315, 3626, 3697, 3412, 3413, 3414, 780, 50, + 782, 3418, 360, 208, 779, 15, 780, 106, 780, 779, + 782, 644, 3641, 3430, 495, 779, 3649, 3434, 3651, 315, + 780, 780, 782, 782, 588, 658, 3641, 3641, 780, 662, + 782, 779, 3641, 780, 3641, 780, 763, 780, 3641, 779, + 3641, 293, 779, 3746, 3653, 3654, 3653, 3654, 406, 779, + 3683, 3641, 3653, 3654, 5714, 3641, 779, 779, 3641, 3641, + 780, 3641, 3695, 3766, 6207, 495, 315, 780, 779, 782, + 3641, 3641, 779, 3653, 3654, 708, 4759, 128, 780, 4294, + 782, 779, 3653, 3654, 24, 25, 43, 779, 28, 779, + 30, 33, 32, 780, 780, 203, 782, 780, 779, 41, + 3641, 780, 735, 782, 779, 19, 20, 780, 50, 779, + 315, 68, 3653, 3654, 678, 780, 513, 782, 515, 516, + 77, 780, 779, 558, 559, 5739, 484, 779, 18, 19, + 20, 6056, 782, 530, 386, 532, 700, 3770, 779, 24, + 25, 98, 3775, 28, 4483, 30, 4485, 32, 779, 779, + 40, 33, 75, 75, 3787, 779, 779, 208, 3791, 41, + 779, 779, 779, 5884, 3797, 264, 123, 266, 50, 779, + 127, 53, 3805, 130, 779, 779, 779, 779, 277, 779, + 779, 779, 779, 73, 141, 677, 128, 128, 584, 547, + 779, 203, 779, 730, 293, 779, 3829, 3830, 779, 779, + 157, 779, 779, 126, 126, 563, 564, 779, 165, 99, + 568, 569, 570, 779, 779, 4624, 3919, 779, 5511, 779, + 177, 4533, 145, 145, 3641, 5952, 779, 4472, 625, 626, + 660, 145, 3865, 779, 779, 779, 779, 160, 160, 4624, + 258, 782, 670, 495, 201, 4558, 460, 688, 3881, 779, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 127, 688, 676, 315, 704, 208, 3188, 3189, 429, + 160, 752, 510, 143, 782, 177, 782, 782, 636, 3744, + 582, 716, 4594, 55, 241, 18, 19, 20, 360, 246, + 247, 4558, 119, 127, 217, 782, 123, 394, 782, 782, + 127, 4558, 225, 225, 645, 579, 196, 40, 699, 763, + 7, 201, 3921, 203, 3921, 2500, 743, 5894, 463, 660, + 53, 3954, 752, 463, 779, 152, 208, 6162, 686, 677, + 10, 3940, 782, 3940, 2519, 225, 217, 31, 145, 3940, + 73, 168, 3975, 2528, 6390, 136, 173, 296, 151, 2534, + 122, 65, 22, 694, 24, 25, 313, 2542, 28, 29, + 30, 31, 3995, 3996, 3997, 677, 99, 2552, 4001, 3940, + 2555, 393, 408, 315, 42, 474, 42, 3, 743, 206, + 3921, 4014, 583, 787, 311, 427, 779, 779, 3853, 3854, + 3855, 3856, 224, 3858, 3859, 352, 391, 779, 779, 3940, + 779, 6273, 33, 293, 15, 779, 127, 411, 127, 787, + 41, 786, 54, 5990, 352, 786, 4023, 374, 127, 50, + 81, 782, 53, 5482, 5483, 787, 5485, 160, 120, 201, + 787, 3896, 3897, 315, 3899, 177, 3901, 3902, 3903, 3904, + 3905, 3906, 3907, 643, 3909, 704, 780, 333, 3913, 333, + 333, 141, 4023, 506, 44, 311, 346, 561, 6035, 128, + 311, 384, 384, 196, 779, 292, 154, 177, 201, 786, + 203, 40, 386, 782, 478, 779, 4109, 6137, 106, 393, + 787, 47, 4023, 427, 336, 780, 147, 444, 780, 782, + 787, 780, 225, 780, 408, 780, 386, 158, 648, 780, + 127, 391, 127, 780, 3921, 166, 779, 787, 167, 779, + 851, 782, 136, 287, 782, 856, 430, 4150, 290, 127, + 770, 73, 787, 3940, 782, 688, 127, 19, 20, 151, + 6144, 4164, 193, 4166, 6406, 876, 105, 770, 4171, 4172, + 544, 4174, 546, 490, 4177, 4178, 701, 451, 552, 127, + 782, 688, 127, 4811, 780, 435, 779, 782, 779, 154, + 293, 217, 427, 3, 151, 57, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 208, 782, 386, + 679, 680, 681, 682, 363, 239, 393, 360, 249, 510, + 510, 510, 510, 510, 510, 782, 782, 763, 120, 676, + 4233, 408, 287, 47, 127, 495, 4023, 673, 612, 4224, + 4225, 596, 6272, 346, 955, 956, 277, 958, 959, 960, + 743, 535, 191, 430, 965, 582, 5685, 196, 5687, 5688, + 4825, 403, 780, 780, 548, 81, 780, 780, 410, 81, + 158, 780, 4275, 158, 4277, 210, 779, 4280, 4281, 787, + 782, 565, 656, 386, 65, 5338, 137, 439, 251, 787, + 418, 4294, 231, 6277, 664, 779, 122, 480, 4883, 480, + 782, 594, 594, 250, 780, 782, 4309, 4310, 6255, 283, + 595, 68, 81, 4316, 315, 734, 4394, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 779, 268, + 310, 147, 391, 310, 237, 147, 57, 30, 782, 4174, + 703, 72, 158, 222, 75, 6375, 158, 206, 128, 203, + 166, 782, 782, 779, 166, 287, 63, 146, 535, 6389, + 154, 42, 465, 780, 780, 6395, 649, 780, 128, 780, + 427, 548, 6402, 770, 748, 201, 780, 193, 147, 4457, + 577, 193, 780, 769, 780, 759, 779, 203, 565, 158, + 780, 203, 495, 6, 7, 126, 780, 166, 129, 780, + 660, 5080, 780, 780, 780, 18, 690, 780, 270, 702, + 702, 780, 780, 780, 145, 362, 780, 122, 780, 281, + 779, 705, 782, 370, 193, 782, 780, 780, 780, 160, + 779, 782, 782, 249, 203, 782, 4439, 249, 385, 780, + 53, 780, 787, 780, 780, 779, 217, 386, 395, 396, + 397, 773, 4287, 779, 4457, 782, 779, 4460, 405, 398, + 4463, 277, 780, 779, 290, 277, 779, 378, 81, 591, + 31, 31, 31, 4472, 427, 782, 131, 128, 782, 782, + 249, 763, 787, 299, 127, 5122, 217, 4472, 4472, 787, + 127, 787, 752, 504, 225, 5122, 201, 128, 4501, 88, + 5065, 782, 4487, 782, 782, 5184, 119, 787, 277, 782, + 123, 780, 613, 690, 127, 258, 780, 782, 53, 5199, + 782, 100, 47, 136, 137, 5375, 365, 127, 705, 670, + 143, 262, 576, 782, 147, 782, 5101, 19, 20, 152, + 158, 154, 158, 750, 439, 158, 507, 549, 3839, 3840, + 123, 3842, 3843, 166, 416, 168, 145, 660, 557, 498, + 173, 779, 293, 657, 268, 268, 268, 268, 430, 268, + 432, 713, 4575, 314, 716, 57, 203, 127, 779, 4558, + 193, 4558, 156, 725, 410, 290, 734, 763, 763, 763, + 203, 763, 763, 206, 763, 763, 543, 763, 763, 763, + 763, 1312, 464, 763, 4607, 763, 763, 763, 555, 763, + 763, 317, 763, 226, 427, 477, 763, 4620, 763, 295, + 787, 4624, 299, 763, 4627, 214, 763, 763, 763, 568, + 763, 763, 245, 576, 780, 168, 249, 226, 34, 333, + 287, 780, 780, 287, 755, 258, 780, 4558, 510, 752, + 5202, 782, 392, 384, 4657, 782, 506, 787, 787, 782, + 154, 787, 427, 4666, 277, 780, 528, 153, 4667, 153, + 787, 780, 780, 780, 780, 4678, 213, 787, 780, 292, + 65, 769, 787, 769, 780, 298, 299, 4672, 780, 782, + 5369, 4764, 5375, 640, 5373, 5374, 779, 779, 403, 312, + 289, 314, 338, 287, 697, 410, 287, 241, 655, 584, + 4713, 128, 128, 787, 787, 492, 4719, 232, 779, 30, + 4723, 769, 321, 779, 733, 545, 780, 779, 763, 782, + 779, 763, 203, 126, 203, 786, 782, 333, 5375, 203, + 287, 50, 712, 4746, 606, 158, 693, 158, 5375, 782, + 780, 613, 408, 31, 408, 31, 31, 240, 53, 283, + 707, 623, 72, 779, 779, 75, 779, 30, 30, 5729, + 461, 4558, 4607, 787, 177, 637, 780, 245, 6, 7, + 770, 584, 770, 143, 5467, 352, 155, 787, 270, 95, + 18, 155, 4627, 4796, 780, 780, 780, 780, 30, 206, + 787, 780, 4805, 5440, 779, 153, 33, 669, 780, 782, + 672, 780, 780, 5440, 41, 782, 126, 65, 780, 129, + 128, 780, 4825, 50, 780, 53, 688, 779, 31, 780, + 5467, 31, 763, 779, 232, 145, 177, 779, 782, 780, + 5467, 311, 704, 232, 782, 779, 459, 436, 734, 779, + 160, 203, 690, 81, 554, 690, 408, 719, 779, 779, + 299, 299, 779, 594, 378, 92, 93, 94, 95, 53, + 4873, 780, 782, 31, 463, 782, 208, 446, 287, 53, + 4883, 212, 780, 439, 251, 4888, 131, 713, 502, 780, + 716, 119, 65, 256, 168, 123, 780, 780, 504, 127, + 314, 643, 206, 65, 782, 4890, 4909, 780, 136, 137, + 780, 138, 139, 140, 782, 225, 347, 169, 217, 147, + 780, 782, 780, 780, 152, 6354, 154, 314, 780, 447, + 158, 173, 779, 763, 416, 4920, 4920, 782, 166, 754, + 168, 167, 741, 418, 5509, 173, 418, 217, 430, 203, + 432, 5630, 262, 53, 247, 780, 250, 4934, 676, 247, + 299, 299, 189, 190, 577, 193, 170, 30, 5046, 30, + 779, 702, 593, 217, 384, 203, 217, 217, 206, 65, + 217, 208, 464, 293, 159, 705, 217, 159, 4823, 705, + 592, 603, 217, 4934, 217, 477, 217, 217, 226, 252, + 5003, 203, 203, 386, 485, 128, 439, 584, 713, 314, + 203, 716, 154, 602, 780, 427, 780, 245, 780, 498, + 725, 249, 549, 4934, 155, 613, 253, 71, 510, 780, + 258, 780, 782, 65, 780, 780, 406, 50, 782, 787, + 5043, 5669, 780, 5046, 780, 782, 528, 779, 787, 277, + 6103, 5054, 5130, 779, 779, 644, 427, 5042, 5042, 654, + 53, 780, 5065, 31, 292, 5068, 378, 5070, 362, 779, + 779, 299, 117, 662, 384, 65, 370, 65, 65, 30, + 446, 779, 5085, 741, 312, 331, 314, 141, 315, 316, + 160, 385, 741, 225, 390, 422, 314, 669, 5101, 424, + 281, 395, 396, 397, 782, 780, 549, 780, 445, 780, + 685, 405, 779, 782, 5797, 780, 419, 779, 5121, 708, + 583, 160, 779, 160, 606, 236, 5129, 779, 53, 782, + 780, 613, 105, 779, 5137, 780, 203, 750, 786, 780, + 779, 623, 782, 5122, 786, 5122, 735, 4934, 786, 127, + 763, 65, 65, 65, 743, 637, 31, 127, 287, 160, + 5797, 411, 127, 782, 314, 287, 5194, 780, 6221, 782, + 5797, 780, 785, 786, 674, 782, 584, 780, 601, 780, + 5183, 5209, 5819, 649, 411, 440, 601, 669, 779, 787, + 672, 5219, 5819, 5196, 5197, 5198, 367, 779, 5226, 779, + 5228, 5229, 299, 779, 787, 5208, 688, 5210, 72, 787, + 780, 5122, 120, 120, 5217, 5218, 281, 73, 287, 287, + 5223, 721, 281, 287, 685, 584, 5061, 5230, 72, 72, + 15, 160, 5235, 50, 5953, 780, 696, 719, 711, 30, + 782, 782, 780, 779, 18, 65, 786, 5250, 779, 543, + 65, 478, 218, 779, 786, 144, 217, 99, 99, 428, + 6, 555, 5097, 5098, 584, 584, 723, 296, 649, 779, + 418, 418, 5107, 779, 430, 780, 5995, 780, 782, 180, + 779, 779, 779, 160, 594, 741, 5121, 160, 296, 5854, + 201, 339, 99, 53, 427, 154, 702, 5274, 697, 779, + 589, 203, 780, 779, 5139, 779, 426, 198, 737, 247, + 352, 127, 779, 422, 779, 207, 173, 544, 5321, 546, + 779, 338, 780, 218, 779, 552, 585, 780, 779, 779, + 5333, 5334, 780, 5274, 251, 5122, 782, 6017, 838, 5342, + 782, 480, 203, 780, 780, 6398, 332, 427, 5351, 577, + 203, 5354, 5355, 780, 112, 203, 5359, 65, 780, 296, + 5363, 655, 101, 5274, 649, 203, 203, 143, 5371, 116, + 432, 30, 258, 5376, 779, 3641, 3053, 3915, 782, 5257, + 5255, 5253, 3763, 6102, 5781, 612, 4372, 5952, 5462, 5821, + 5979, 6209, 702, 2133, 774, 5137, 5375, 1469, 5375, 693, + 3940, 4446, 3924, 5046, 4457, 2558, 2121, 3074, 4242, 5244, + 4013, 3991, 2467, 707, 840, 2663, 5652, 5651, 5496, 2664, + 5498, 5421, 4872, 2665, 4393, 5525, 4616, 5317, 4620, 656, + 6023, 2901, 6392, 4724, 4725, 4726, 4727, 4728, 4729, 4730, + 4731, 4732, 4733, 5003, 4735, 4736, 4737, 4738, 4739, 4740, + 4741, 4742, 4743, 4744, 5599, 6139, 4747, 4748, 6277, 6234, + 5907, 5440, 5597, 5440, 5375, 3185, 1457, 4867, 5191, 5497, + 5803, 6036, 5475, 5499, 5477, 5235, 5363, 4873, 5079, 6102, + 6258, 6092, 5995, 5984, 5984, 5984, 5984, 5274, 5467, 4555, + 5467, 43, 4508, 6105, 4033, 6017, 1621, 997, 2502, 5502, + 5503, 5504, 5505, 4112, 3317, 4583, 5509, 5510, 4578, 5512, + 4586, 6283, 491, 1013, 5517, 5518, 68, 1017, 5521, 491, + 6252, 748, 750, 5526, 5527, 77, 6253, 5788, 3755, 5440, + 5533, 5534, 759, 5536, 6048, 763, 92, 93, 94, 95, + 1040, 5544, 6060, 5378, 1044, 6064, 98, 5698, 2527, 1049, + 5495, 4278, 780, 4872, 782, 4846, 5467, 785, 786, 5394, + 4851, 5564, 5493, 5232, 1885, 1478, 5866, 2317, 3743, 3738, + 5573, 123, 3213, 6014, 5702, 127, 2484, 4001, 130, 3591, + 6208, 3042, 138, 139, 140, 3375, 4490, 537, 5375, 141, + 3551, 5664, 1441, 5671, 6159, 780, 3684, 1388, 1206, 5672, + 1428, 5674, 3820, 4917, 3600, 157, 4607, 3502, 3499, 5612, + 2055, 3569, 3568, 165, 1114, 1115, 1116, 1117, 4149, 5622, + 1120, 2111, 4058, 5626, 4946, 177, 1987, 1127, 1956, 1977, + 5633, 5634, 6092, 189, 190, 5638, 5639, 6211, 5983, 6316, + 6315, 5480, 2368, 2373, 5156, 5648, 4660, 5987, 5054, 201, + 5988, 1386, 1386, 5440, 2363, 3162, 1386, 5660, 1386, 5662, + 1962, 5664, 1386, 5666, 2389, 4135, 5651, 6232, 3807, 5672, + 4805, 5674, 4133, 5676, 4804, 5884, 5714, 5312, 5029, 3823, + 5467, 5308, 4947, 3816, 5329, 786, 1419, 4566, 1449, 241, + 4811, 509, 491, 3156, 246, 247, 3331, 253, 5701, 703, + 2628, 4487, 1296, 3368, 5707, 4672, 5709, 5612, 3850, 4659, + 5060, 5714, 6272, 4657, 884, 2576, 3013, 885, 5796, 694, + 5723, 2193, 5800, 1223, 3014, 694, 3676, 1444, 3068, 5648, + 694, 5734, 5735, 5345, 2306, 1890, 4493, 6275, 5161, 6321, + 5489, 6395, 6402, 1001, 3365, 5818, 5819, 3033, 5333, 3418, + 3653, 693, 3654, 2670, 2947, 3655, 3650, 5760, 693, 2644, + 316, 313, 3646, 3645, 4183, 691, 1187, 1221, 5771, 2337, + 4382, 3596, 4923, 3207, 5777, 6403, 4825, 2133, 1878, 1878, + 3758, 5569, 5785, 4394, 5787, 734, 1330, 515, 491, 491, + 491, 970, 4484, 2666, 4016, 5973, 5087, 989, 5801, 4676, + 352, 5974, 6203, 970, 4291, 5431, 5440, 3764, 5099, 1309, + 5440, 5432, 5469, 1313, 6379, 5818, 5447, -1, 5797, 6384, + 5797, 876, 374, 989, -1, 2536, -1, 1816, -1, -1, + 5858, -1, -1, -1, -1, -1, -1, -1, -1, 5842, + 5819, -1, 5819, -1, -1, 43, -1, -1, 5819, 5852, + -1, 5854, -1, -1, -1, 411, -1, 5860, 5861, 5862, + -1, -1, -1, -1, -1, -1, 5944, -1, -1, -1, + 68, -1, -1, -1, -1, -1, -1, -1, 5819, 77, + -1, -1, -1, 5961, 108, -1, 5797, -1, -1, -1, + -1, -1, 444, -1, -1, -1, -1, -1, -1, -1, + 98, -1, -1, -1, -1, -1, -1, -1, 5819, -1, + -1, -1, -1, -1, 1414, 5918, -1, 1417, 142, -1, + 5923, -1, 478, -1, -1, 123, 5929, -1, 2639, 127, + -1, -1, 130, -1, -1, -1, -1, -1, -1, 997, + -1, -1, -1, 141, -1, -1, -1, -1, -1, 5952, + 1450, -1, 2663, -1, -1, 179, 2667, -1, -1, 157, + -1, -1, -1, -1, -1, -1, -1, 165, -1, -1, + -1, -1, -1, -1, -1, 5978, -1, -1, -1, 177, + 5983, -1, -1, -1, 5987, 5988, 1044, 1487, 544, -1, + 546, -1, -1, -1, -1, -1, 552, -1, -1, -1, + -1, -1, -1, 201, -1, -1, -1, -1, -1, -1, + 5797, 6014, -1, -1, -1, -1, -1, -1, -1, -1, + 6023, -1, -1, -1, -1, -1, -1, 6105, -1, -1, + 582, -1, 5819, 6036, -1, -1, 6109, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, 246, 247, + -1, -1, -1, -1, -1, -1, 612, -1, -1, -1, + -1, -1, 1120, -1, -1, 6068, -1, -1, -1, -1, + -1, -1, -1, 6076, -1, 6078, 6079, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6, + 7, -1, -1, 6092, -1, -1, -1, -1, -1, -1, + 656, 18, -1, -1, 5939, -1, 6109, 6092, -1, -1, + -1, -1, -1, -1, -1, 313, -1, -1, -1, -1, + -1, -1, -1, 6201, -1, -1, -1, 6205, -1, 6202, + 6203, -1, -1, -1, 6137, -1, 53, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 352, -1, 6159, -1, -1, -1, + -1, -1, -1, -1, 81, 1223, -1, -1, -1, -1, + -1, -1, -1, -1, 6177, 6178, 374, -1, 6181, 6257, + 6258, 733, -1, -1, -1, 6188, -1, -1, -1, -1, + -1, -1, 748, -1, -1, 6030, 6031, -1, -1, 6202, + 6203, -1, 119, 759, -1, -1, 123, 6042, -1, -1, + 127, -1, -1, -1, -1, -1, -1, -1, -1, 136, + 137, 6299, -1, -1, 2935, -1, -1, -1, 6306, 6232, + 147, -1, -1, -1, -1, 152, -1, 154, -1, -1, + -1, 158, -1, 6246, -1, -1, 444, -1, -1, 166, + -1, 168, -1, -1, -1, 1313, 173, 481, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6272, + -1, -1, -1, -1, -1, -1, 193, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 203, 511, 512, 206, + 514, 515, 516, 517, 518, -1, 520, 521, 522, 523, + 524, 525, 526, 527, -1, 529, 530, 531, 532, 226, + -1, -1, -1, 6148, -1, -1, 6151, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 245, -1, + -1, -1, 249, -1, -1, -1, -1, -1, -1, -1, + -1, 258, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 1414, 3068, -1, 1417, + 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6375, -1, -1, 292, 6379, -1, -1, 1879, + -1, 6384, 299, -1, 582, -1, 6389, -1, 1888, -1, + 1890, -1, 6395, -1, -1, 312, -1, 314, -1, 6402, + -1, 625, 626, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1949, + 1950, -1, -1, -1, -1, 1955, -1, -1, -1, 1959, + 1960, 1961, -1, -1, -1, -1, -1, -1, -1, 1969, + 1970, 1971, -1, -1, -1, 1975, -1, -1, -1, 1979, + 1980, 1981, -1, 1983, 1984, 1985, 1986, 1987, -1, -1, + -1, -1, -1, 1993, -1, 1995, -1, -1, 1998, 1999, + 2000, 2001, -1, 2003, -1, 2005, 2006, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2019, + 2020, 2021, 2022, 2023, -1, 2025, 2026, 2027, 2028, 2029, + 2030, -1, 2032, 2033, -1, 2035, 2036, -1, 2038, 2039, + -1, -1, 2042, 2043, -1, 2045, 2046, -1, 2048, -1, + 2050, -1, -1, -1, 2054, 2055, 2056, -1, -1, 2059, + 2060, 2061, 2062, -1, 2064, -1, -1, -1, -1, -1, + -1, 2071, -1, 18, 19, 20, -1, 2077, 2078, 2079, + 2080, -1, -1, -1, -1, -1, -1, 3298, 2088, 2089, + -1, 2091, 2092, -1, -1, 2095, 2096, 2097, 2098, 2099, + 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, 5899, 5900, + 2110, 5902, 5903, 5904, 5905, 2115, -1, -1, -1, -1, + -1, -1, 2122, -1, -1, -1, 71, -1, 73, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2145, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, -1, -1, -1, + 577, -1, -1, 2163, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6, 7, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 18, 19, 20, -1, -1, -1, -1, -1, -1, -1, + 145, 3412, 3413, 3414, -1, -1, -1, 3418, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 46, 3430, + 48, 49, -1, 3434, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6029, -1, + -1, 6032, 70, -1, 72, -1, -1, -1, -1, 6040, + 78, -1, 6043, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2262, -1, 2264, -1, -1, -1, -1, -1, + 215, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 110, -1, -1, -1, -1, -1, 2288, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2299, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 145, -1, -1, + -1, 1879, -1, -1, -1, -1, -1, 272, 273, 274, + -1, -1, -1, 750, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 173, 763, 292, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 780, -1, 782, -1, -1, 785, 786, + -1, -1, -1, -1, -1, -1, 204, -1, 206, -1, + -1, -1, -1, -1, -1, -1, 2386, 215, -1, 217, + -1, -1, 2392, -1, 2394, -1, -1, -1, -1, -1, + -1, 346, -1, 348, -1, -1, -1, -1, -1, -1, + -1, -1, 240, 1971, 2414, -1, -1, -1, -1, -1, + -1, 366, 2422, 368, -1, -1, -1, -1, 1986, 1987, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 386, -1, -1, 272, 273, 274, -1, 393, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 408, 292, -1, -1, -1, -1, -1, + 415, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 430, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 338, -1, -1, -1, -1, -1, -1, -1, 346, -1, + 348, -1, -1, 68, -1, -1, -1, -1, -1, -1, + -1, -1, 77, -1, -1, -1, -1, -1, -1, -1, + 368, -1, 487, -1, -1, -1, -1, 375, -1, -1, + -1, -1, 497, 98, -1, -1, -1, 2115, 386, -1, + -1, -1, -1, -1, 2122, 393, -1, -1, 113, 114, + 115, -1, -1, -1, -1, -1, -1, -1, 123, -1, + 408, -1, 127, -1, -1, 130, -1, 415, -1, -1, + 535, 419, 420, -1, -1, -1, 141, -1, 426, -1, + -1, -1, 430, 548, -1, 2163, -1, -1, -1, -1, + 438, -1, 157, -1, -1, -1, -1, -1, -1, -1, + 165, -1, -1, -1, -1, -1, -1, -1, -1, 2629, + -1, 459, 177, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 587, -1, -1, -1, -1, -1, 593, -1, + -1, -1, -1, -1, -1, 483, 201, -1, -1, 487, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 497, + -1, -1, -1, 2673, 2674, -1, -1, -1, -1, -1, + -1, -1, 2682, 2683, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, 246, 247, -1, -1, -1, 651, 535, -1, 11, + 3921, 13, -1, 658, -1, -1, 18, 19, 20, -1, + 548, -1, 550, -1, -1, -1, -1, -1, -1, 3940, + 2288, -1, -1, -1, -1, -1, 2736, -1, -1, -1, + -1, -1, -1, -1, -1, 690, -1, 2747, 2748, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 587, + 705, 706, -1, -1, -1, 593, 311, -1, 313, 71, + 43, 73, -1, 718, -1, -1, -1, -1, -1, 2779, + 2780, 2781, -1, -1, -1, -1, -1, -1, -1, -1, + 618, -1, -1, -1, -1, 68, -1, 99, -1, -1, + -1, 629, 630, 631, 77, -1, -1, 352, -1, -1, + -1, -1, 4023, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 651, -1, 98, -1, -1, 2828, 374, + 658, -1, -1, -1, 2392, -1, 2394, 782, 2838, -1, + -1, 2841, -1, 145, -1, -1, -1, -1, -1, -1, + 123, -1, -1, -1, 127, -1, 2856, 130, -1, -1, + 2860, 2861, 690, 2863, 2864, 167, -1, -1, 141, -1, + -1, -1, 2872, -1, 2874, -1, -1, 705, 706, -1, + -1, -1, 427, -1, 157, -1, -1, -1, -1, -1, + 718, -1, 165, -1, 722, -1, -1, -1, -1, 444, + -1, -1, -1, -1, 177, 2905, -1, -1, -1, -1, + -1, -1, -1, 215, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 43, 201, -1, + -1, 2931, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2943, -1, -1, -1, 2947, -1, -1, + -1, -1, 68, -1, -1, -1, 2956, -1, 786, -1, + -1, 77, -1, -1, -1, -1, -1, 2967, 241, -1, + 272, 273, 274, 246, 247, -1, -1, -1, -1, -1, + -1, -1, 98, 2983, -1, -1, -1, -1, -1, -1, + 292, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 674, -1, -1, -1, -1, -1, -1, 123, -1, -1, + -1, 127, -1, -1, 130, -1, -1, -1, -1, -1, + 3020, -1, -1, -1, -1, 141, -1, 3027, -1, -1, + -1, -1, -1, -1, 3034, -1, -1, 582, -1, -1, + 313, 157, -1, -1, 346, -1, 348, 721, 321, 165, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 177, -1, -1, 366, -1, 368, -1, -1, -1, + -1, 4282, 4283, 3073, 3074, -1, -1, -1, -1, 352, + -1, -1, -1, -1, 386, 201, -1, -1, -1, -1, + -1, 393, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 374, -1, -1, -1, -1, 408, -1, -1, -1, + -1, -1, -1, 415, -1, 2673, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, 3126, -1, 430, -1, + 246, 247, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 427, -1, -1, -1, -1, 3159, + -1, -1, -1, -1, 838, -1, -1, -1, -1, -1, + -1, 444, 3172, -1, 3174, 3175, 3176, -1, 3178, -1, + -1, -1, 4393, 3183, 3184, 487, -1, -1, -1, 2747, + 2748, -1, -1, -1, -1, 497, -1, 313, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3219, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 535, -1, -1, 352, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 548, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 374, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2828, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2841, -1, 587, -1, -1, -1, -1, + -1, 593, -1, -1, 19, 20, -1, -1, -1, -1, + 3300, 3301, -1, -1, -1, -1, -1, -1, -1, 582, + -1, 427, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 47, -1, 49, -1, -1, -1, 444, -1, + -1, -1, 57, -1, -1, -1, -1, -1, -1, 1013, + -1, -1, -1, 1017, -1, -1, 71, 4558, -1, 651, + -1, -1, -1, -1, 79, 80, 658, -1, -1, -1, + -1, -1, -1, -1, 89, 3365, 1040, -1, -1, -1, + -1, -1, -1, 2931, -1, 1049, -1, -1, 103, 104, + -1, -1, -1, -1, -1, -1, -1, -1, 690, 2947, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 705, 706, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 718, -1, -1, 3419, + 145, -1, -1, 3423, -1, -1, 3426, -1, -1, -1, + -1, -1, -1, -1, 159, 3435, -1, -1, -1, -1, + 1114, 1115, 1116, 1117, 3444, -1, 3446, 3447, -1, 3449, + 3450, 3451, 3452, 1127, 3454, -1, 3456, 3457, -1, 3459, + -1, -1, -1, -1, -1, -1, 582, 3467, 3468, -1, + -1, -1, 3472, 3473, 3474, -1, 3034, -1, -1, -1, + -1, -1, 3482, 3483, 3484, -1, 3486, -1, 3488, 214, + 3490, -1, 3492, -1, 3494, -1, -1, -1, -1, 3499, + 3500, 226, 3502, 3503, 3504, -1, -1, -1, 3508, -1, + -1, 3511, -1, -1, -1, 3073, 3074, -1, -1, -1, + 3520, -1, -1, 3523, -1, 3525, 3526, 3527, -1, -1, + 3530, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4753, -1, -1, 18, 19, 20, -1, -1, + -1, -1, 3552, -1, 3554, -1, 281, 3557, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3567, 3568, 3569, + 3570, 3571, 3572, 46, -1, 48, -1, 3577, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3588, -1, + -1, -1, -1, -1, -1, -1, -1, 70, -1, 324, + -1, -1, -1, -1, -1, 78, -1, -1, -1, -1, + -1, -1, -1, -1, 3172, -1, 3174, 3175, 3176, 344, + -1, -1, -1, -1, -1, 3625, 99, -1, 353, -1, + -1, -1, -1, -1, -1, 1309, -1, 110, -1, 3639, + -1, 366, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 377, -1, -1, 3655, 4867, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 145, -1, -1, 400, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3688, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 173, -1, -1, -1, 429, 430, -1, -1, 433, -1, + 435, 3711, -1, 48, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4934, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 206, -1, -1, -1, 462, 463, -1, + -1, -1, 215, 468, 469, 80, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 485, -1, -1, -1, -1, -1, 101, 240, -1, -1, + -1, -1, -1, -1, -1, 110, 1450, -1, -1, -1, + -1, 506, -1, 3783, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 131, -1, -1, 272, + 273, 274, -1, 528, 3804, -1, -1, 3365, -1, -1, + 145, -1, -1, 1487, -1, 150, 3816, -1, -1, 292, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 43, -1, -1, -1, 173, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 582, -1, 68, + -1, -1, -1, -1, -1, 338, -1, -1, 77, -1, + -1, -1, 597, 346, -1, 348, -1, -1, -1, -1, + -1, 606, -1, -1, 609, 610, -1, -1, -1, 98, + -1, -1, -1, -1, -1, 368, -1, 232, -1, 624, + -1, 236, -1, -1, -1, -1, -1, 5118, -1, 5120, + -1, 5122, -1, 386, 123, -1, -1, -1, 127, 254, + 393, 130, -1, 258, 259, -1, -1, -1, -1, -1, + -1, -1, 141, -1, -1, 408, 661, -1, -1, -1, + -1, -1, 415, -1, 669, -1, 419, -1, 157, -1, + -1, -1, -1, 426, 289, -1, 165, 430, -1, -1, + -1, 296, 297, 688, -1, 690, -1, -1, 177, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3978, -1, + -1, -1, -1, -1, -1, -1, 459, -1, -1, -1, + 3990, -1, 201, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4011, -1, 3571, 487, 740, -1, -1, 353, -1, + -1, 5232, 747, -1, 497, -1, 4026, -1, -1, 4029, + 3588, -1, 241, -1, -1, -1, -1, 246, 247, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4054, 4055, -1, -1, 393, 4059, + -1, -1, 535, 5274, -1, -1, -1, -1, 4068, -1, + -1, -1, -1, -1, -1, 548, -1, 550, -1, -1, + -1, 4081, -1, 4083, -1, 4085, -1, 4087, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3655, -1, -1, + -1, 436, 4102, -1, 313, -1, 441, -1, 4108, -1, + -1, -1, -1, -1, 587, -1, -1, 452, 453, -1, + 593, 4121, 4122, -1, -1, -1, 4126, -1, 4128, -1, + 4130, -1, -1, -1, -1, 4135, -1, -1, -1, -1, + -1, -1, -1, 352, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5375, 374, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4176, -1, 651, -1, + -1, -1, 4182, -1, -1, 658, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4196, -1, -1, -1, + 4200, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 1888, -1, 1890, 690, 4218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5440, + -1, -1, 705, 706, -1, 444, -1, -1, -1, -1, + -1, -1, 4242, -1, -1, 718, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5467, -1, 3816, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 607, -1, -1, 1949, 1950, -1, -1, -1, + -1, 1955, 617, -1, -1, 1959, 1960, 1961, -1, -1, + -1, -1, -1, 628, -1, 1969, 1970, -1, -1, 634, + -1, 1975, -1, -1, -1, 1979, 1980, 1981, -1, 1983, + 1984, 1985, -1, 4313, -1, -1, -1, -1, -1, 1993, + -1, 1995, -1, 4323, 1998, 1999, 2000, 2001, -1, 2003, + 665, 2005, 2006, -1, 669, -1, -1, 4337, -1, 4339, + 4340, -1, -1, -1, -1, 2019, 2020, 2021, 2022, 2023, + -1, 2025, 2026, 2027, 2028, 2029, 2030, -1, 2032, 2033, + -1, 2035, 2036, 698, 2038, 2039, -1, -1, 2042, 2043, + -1, 2045, 2046, 582, 2048, -1, 2050, -1, -1, -1, + 2054, 2055, 2056, -1, -1, 2059, 2060, 2061, 2062, -1, + 2064, -1, -1, -1, -1, -1, -1, 2071, -1, -1, + -1, -1, -1, 2077, 2078, 2079, 2080, -1, -1, -1, + -1, -1, -1, -1, 2088, 2089, -1, 2091, 2092, -1, + 3978, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, + 2104, 2105, 2106, 2107, -1, -1, 2110, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2145, -1, 56, 57, -1, -1, -1, 61, 62, + -1, -1, -1, -1, -1, -1, -1, -1, 71, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4068, -1, -1, 96, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 109, -1, -1, -1, + 4530, 4531, -1, 4533, -1, -1, -1, -1, -1, -1, + -1, -1, 125, -1, 127, -1, 4546, 4547, 4548, -1, + 4108, -1, -1, -1, -1, -1, -1, 5768, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4570, 4571, 155, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5796, 5797, -1, 2262, 5800, + 2264, 174, 175, 176, 4594, -1, -1, -1, -1, -1, + -1, 184, 185, 186, -1, -1, 4606, -1, 5819, -1, + -1, -1, -1, -1, -1, 4615, -1, -1, 4176, 202, + -1, -1, -1, -1, -1, 2299, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4635, -1, -1, -1, -1, + 4640, 4641, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 234, -1, -1, -1, -1, -1, -1, -1, 4659, + -1, -1, -1, 4663, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 261, -1, + -1, -1, -1, -1, 4242, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5907, -1, -1, -1, + -1, 284, 285, 286, 5915, -1, -1, 43, -1, -1, + 5921, 5922, 2386, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 306, 307, 18, 19, 20, 18, 19, + 20, -1, 68, 5944, -1, -1, -1, -1, -1, -1, + 2414, 77, -1, -1, -1, -1, -1, -1, 2422, -1, + 5961, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 98, -1, -1, -1, -1, -1, -1, -1, + -1, 354, -1, 356, 357, -1, -1, -1, 71, -1, + 73, 4339, -1, -1, -1, -1, -1, 123, -1, -1, + 373, 127, -1, -1, 130, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 141, 99, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 157, -1, -1, -1, -1, 409, 410, -1, 165, + -1, -1, -1, -1, -1, -1, -1, 6048, -1, -1, + -1, 177, -1, -1, -1, -1, -1, -1, -1, 6060, + -1, -1, 145, 6064, -1, 145, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 201, -1, -1, -1, -1, + -1, -1, 455, -1, -1, -1, -1, -1, -1, -1, + 4880, 4881, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 6105, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + 246, 247, -1, 496, -1, -1, -1, -1, -1, -1, + -1, -1, 215, -1, -1, 215, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4944, -1, -1, 4947, -1, -1, + -1, -1, -1, -1, -1, 2629, -1, -1, 6169, 6170, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 558, 559, 313, -1, 272, + 273, 274, 272, 273, 274, -1, -1, -1, -1, -1, + 6201, 574, 575, -1, -1, -1, -1, -1, 4998, 292, + 2674, -1, 292, -1, -1, -1, -1, -1, 2682, 2683, + -1, -1, -1, -1, -1, -1, 352, 5017, -1, -1, + -1, -1, -1, -1, -1, 5025, 5026, -1, -1, -1, + -1, -1, -1, 616, -1, -1, -1, -1, 374, 6250, + -1, 6252, 6253, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 346, -1, 348, 346, -1, 348, -1, + 5060, -1, 2736, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 366, -1, 368, -1, -1, 368, -1, + -1, -1, 6293, -1, -1, -1, -1, -1, -1, -1, + -1, 427, -1, 386, -1, -1, 386, -1, -1, -1, + 393, -1, -1, 393, -1, 2779, 2780, 2781, 444, -1, + -1, -1, -1, -1, -1, 408, -1, 6328, 408, -1, + -1, -1, 415, -1, -1, 415, -1, 710, -1, 43, + 713, -1, -1, 716, -1, -1, -1, 430, -1, -1, + 430, -1, -1, -1, -1, -1, 5146, 6358, 5148, -1, + -1, -1, -1, -1, 68, -1, 739, -1, -1, -1, + -1, -1, -1, 77, 2838, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 759, -1, -1, -1, + -1, -1, 2856, -1, 98, -1, 2860, 2861, -1, 2863, + 2864, -1, -1, -1, 487, -1, -1, 487, 2872, -1, + 2874, -1, -1, -1, 497, -1, -1, 497, -1, 123, + -1, -1, -1, 127, -1, -1, 130, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 141, -1, -1, + -1, 2905, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 535, 157, -1, 535, 582, -1, -1, -1, + -1, 165, -1, -1, -1, 548, -1, 2931, 548, -1, + -1, 5261, -1, 177, -1, -1, -1, -1, -1, 2943, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 2956, -1, -1, 5285, -1, 201, -1, -1, + -1, -1, -1, 2967, 587, -1, -1, 587, -1, -1, + 593, -1, -1, 593, -1, -1, -1, -1, 5308, 2983, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5324, 5325, 674, 241, -1, -1, + -1, -1, 246, 247, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3020, -1, -1, -1, + -1, -1, -1, 3027, -1, -1, -1, -1, 651, -1, + -1, 651, -1, -1, -1, 658, -1, -1, 658, -1, + -1, -1, -1, 721, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4947, + -1, -1, -1, -1, -1, -1, -1, 690, -1, 313, + 690, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 705, 706, -1, 705, 706, -1, -1, -1, + -1, -1, -1, -1, -1, 718, -1, -1, 718, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 352, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3126, -1, -1, -1, -1, -1, -1, 5017, + 374, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3159, -1, -1, -1, -1, + 838, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3178, -1, -1, -1, -1, 3183, + 3184, -1, -1, 427, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 444, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3219, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5575, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5599, + -1, -1, -1, -1, -1, -1, -1, 5607, -1, -1, + -1, -1, -1, 5613, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3300, 3301, -1, 5629, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 1013, -1, -1, 582, 1017, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1040, -1, -1, -1, -1, -1, -1, -1, + -1, 1049, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5739, + -1, -1, -1, -1, -1, 3419, -1, -1, -1, 3423, + -1, -1, 3426, -1, -1, -1, -1, -1, -1, -1, + -1, 3435, -1, -1, -1, -1, 1114, 1115, 1116, 1117, + 3444, -1, 3446, 3447, -1, 3449, 3450, 3451, 3452, 1127, + 3454, -1, 3456, 3457, -1, 3459, -1, -1, -1, -1, + -1, -1, -1, 3467, 3468, -1, -1, -1, 3472, 3473, + 3474, -1, -1, -1, -1, -1, -1, -1, 3482, 3483, + 3484, -1, 3486, -1, 3488, -1, 3490, -1, 3492, -1, + 3494, -1, -1, -1, -1, 3499, 3500, -1, 3502, 3503, + 3504, -1, -1, -1, 3508, -1, -1, 3511, -1, -1, + -1, -1, -1, -1, -1, -1, 3520, -1, -1, 3523, + -1, 3525, 3526, 3527, -1, -1, 3530, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5867, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3552, -1, + 3554, -1, -1, 3557, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3567, 3568, 3569, 3570, -1, 3572, -1, + -1, -1, -1, 3577, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 526, -1, + -1, 3625, -1, 5953, -1, -1, -1, -1, -1, -1, + -1, 1309, -1, -1, -1, 3639, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5995, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 6007, -1, -1, + -1, -1, -1, -1, 3688, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3711, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5607, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6092, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1450, -1, -1, -1, -1, -1, -1, 3783, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3804, -1, -1, -1, -1, -1, -1, -1, -1, 1487, + -1, -1, -1, -1, 6144, -1, -1, -1, -1, 727, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 776, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6273, -1, -1, -1, 6277, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3990, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4011, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4026, -1, -1, 4029, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 954, -1, -1, -1, + 4054, 4055, -1, -1, -1, 4059, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6406, 4081, -1, 4083, + -1, 4085, -1, 4087, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4121, 4122, -1, + -1, -1, 4126, -1, 4128, -1, 4130, -1, -1, -1, + -1, 4135, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4182, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4196, -1, -1, -1, 4200, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 1888, -1, 1890, -1, 4218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 1949, 1950, -1, -1, -1, -1, 1955, -1, -1, + -1, 1959, 1960, 1961, -1, -1, -1, -1, -1, -1, + -1, 1969, 1970, -1, -1, -1, -1, 1975, -1, -1, + -1, 1979, 1980, 1981, -1, 1983, 1984, 1985, -1, 4313, + -1, -1, -1, -1, -1, 1993, -1, 1995, -1, 4323, + 1998, 1999, 2000, 2001, -1, 2003, -1, 2005, 2006, -1, + -1, -1, -1, 4337, -1, -1, 4340, -1, -1, -1, + -1, 2019, 2020, 2021, 2022, 2023, -1, 2025, 2026, 2027, + 2028, 2029, 2030, -1, 2032, 2033, -1, 2035, 2036, -1, + 2038, 2039, -1, -1, 2042, 2043, -1, 2045, 2046, -1, + 2048, -1, 2050, -1, -1, -1, 2054, 2055, 2056, -1, + -1, 2059, 2060, 2061, 2062, -1, 2064, -1, -1, 1297, + -1, -1, -1, 2071, -1, 1303, -1, -1, -1, 2077, + 2078, 2079, 2080, -1, -1, -1, -1, -1, -1, -1, + 2088, 2089, -1, 2091, 2092, -1, -1, 2095, 2096, 2097, + 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2106, 2107, + -1, -1, 2110, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2145, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 1386, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4530, 4531, -1, 4533, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4546, 4547, 4548, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 1471, -1, -1, 4570, 4571, -1, -1, + -1, -1, -1, -1, 1482, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2262, -1, 2264, -1, -1, -1, + 4594, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4606, -1, -1, -1, -1, -1, -1, -1, + -1, 4615, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2299, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4635, -1, -1, -1, -1, 4640, 4641, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4659, -1, -1, -1, 4663, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2386, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2414, -1, -1, -1, + -1, -1, -1, -1, 2422, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4880, 4881, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 1820, -1, 1822, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4944, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2629, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4998, -1, 2674, -1, -1, -1, + -1, -1, -1, -1, 2682, 2683, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5025, 5026, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5060, -1, 2736, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2779, 2780, 2781, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2037, + -1, -1, -1, 2041, -1, -1, -1, -1, -1, 2047, + -1, -1, 5146, -1, 5148, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 2838, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2856, -1, + -1, -1, 2860, 2861, -1, 2863, 2864, -1, -1, -1, + -1, -1, -1, -1, 2872, -1, 2874, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2127, + -1, -1, -1, -1, -1, -1, -1, 2905, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 674, -1, -1, -1, + -1, -1, -1, 2931, -1, -1, -1, 5261, -1, -1, + -1, -1, -1, 2171, -1, 2943, -1, -1, 2176, -1, + 2178, -1, -1, -1, -1, -1, -1, -1, 2956, -1, + -1, 5285, -1, -1, -1, -1, -1, -1, -1, 2967, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5308, 2983, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2225, -1, -1, + 5324, 5325, -1, -1, -1, -1, -1, -1, -1, 2237, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3020, -1, -1, -1, -1, -1, -1, 3027, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 838, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2343, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3126, -1, + -1, -1, -1, 2361, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2372, 2373, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3159, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3178, -1, -1, -1, -1, 3183, 3184, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3219, 2450, -1, -1, -1, -1, -1, 2456, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5575, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1017, + -1, -1, -1, -1, -1, 5599, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5613, + -1, -1, 1040, -1, -1, -1, -1, -1, -1, -1, + -1, 1049, 3300, 3301, -1, 5629, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1117, + -1, -1, -1, -1, -1, -1, -1, -1, 2606, 2607, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2634, -1, -1, -1, + -1, -1, -1, -1, -1, 5739, 2644, -1, -1, -1, + -1, 3419, -1, -1, -1, 3423, -1, -1, 3426, -1, + -1, -1, -1, -1, -1, -1, -1, 3435, -1, -1, + -1, -1, -1, -1, -1, -1, 3444, -1, 3446, 3447, + -1, 3449, 3450, 3451, 3452, -1, 3454, -1, 3456, 3457, + -1, 3459, -1, -1, -1, -1, -1, -1, -1, 3467, + 3468, -1, -1, -1, 3472, 3473, 3474, -1, -1, -1, + -1, -1, -1, -1, 3482, 3483, 3484, -1, 3486, -1, + 3488, -1, 3490, -1, 3492, -1, 3494, -1, -1, -1, + -1, 3499, 3500, -1, 3502, 3503, 3504, -1, -1, -1, + 3508, -1, -1, 3511, -1, -1, -1, -1, -1, -1, + -1, -1, 3520, -1, -1, 3523, -1, 3525, 3526, 3527, + -1, -1, 3530, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5867, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3552, -1, 3554, -1, -1, 3557, + -1, 1309, -1, -1, -1, -1, -1, -1, -1, 3567, + 3568, 3569, 3570, -1, 3572, -1, -1, -1, -1, 3577, + -1, -1, -1, -1, 2812, -1, -1, -1, 2816, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3625, -1, 5953, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3639, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5995, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 6007, -1, -1, -1, -1, -1, -1, + 3688, -1, -1, -1, -1, -1, -1, -1, 2926, 2927, + -1, -1, 1450, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3711, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 1487, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 6092, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3783, -1, -1, -1, 3017, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3804, -1, -1, -1, + -1, -1, -1, -1, 3042, -1, -1, -1, -1, -1, + 6144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3113, -1, -1, -1, -1, + -1, -1, -1, -1, 3122, -1, -1, -1, -1, 3127, + -1, -1, -1, -1, -1, 3133, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3148, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6273, + -1, -1, -1, 6277, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3990, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4011, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4026, -1, + -1, 4029, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4054, 4055, -1, -1, + -1, 4059, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 6406, 4081, -1, 4083, -1, 4085, -1, 4087, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4102, -1, -1, -1, -1, -1, + -1, 3339, -1, -1, 3342, -1, -1, -1, -1, -1, + -1, -1, -1, 4121, 4122, -1, -1, -1, 4126, -1, + 4128, -1, 4130, -1, -1, -1, -1, 4135, -1, -1, + 1888, -1, 1890, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4182, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4196, -1, + -1, -1, 4200, -1, -1, -1, -1, 1955, -1, -1, + -1, 1959, -1, 1961, -1, -1, -1, -1, -1, -1, + 4218, 1969, 1970, -1, -1, -1, -1, 1975, -1, -1, + -1, 1979, 1980, 1981, -1, 1983, 1984, 1985, -1, -1, + -1, -1, -1, -1, -1, 1993, -1, 1995, -1, -1, + 1998, 1999, 2000, 2001, -1, -1, -1, 2005, 2006, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2019, 2020, 2021, 2022, 2023, -1, 2025, 2026, 2027, + 2028, 2029, -1, -1, 2032, 2033, -1, 2035, 2036, -1, + 2038, 2039, -1, -1, -1, 2043, -1, 2045, 2046, -1, + 2048, -1, 2050, -1, -1, -1, 2054, 2055, 2056, -1, + -1, 2059, -1, 2061, 2062, 4313, 2064, -1, -1, -1, + -1, -1, -1, 2071, -1, 4323, -1, -1, -1, 2077, + 2078, 2079, -1, -1, -1, -1, -1, -1, -1, 4337, + -1, -1, 4340, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 3591, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 2145, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3695, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2262, -1, 2264, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4530, 4531, -1, 4533, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3775, 4546, 4547, + 4548, 2299, -1, -1, -1, -1, -1, -1, -1, 3787, + -1, -1, -1, 3791, -1, -1, -1, -1, -1, -1, + -1, -1, 4570, 4571, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4594, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4606, -1, + -1, -1, -1, -1, -1, -1, -1, 4615, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4635, 2386, -1, + -1, -1, 4640, 4641, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4659, -1, -1, -1, 4663, 2414, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 3975, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4001, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 2629, 4880, 4881, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 2674, -1, -1, -1, + -1, -1, -1, -1, 2682, 2683, -1, -1, 4166, -1, + -1, -1, -1, -1, -1, -1, 4944, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2736, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4998, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5025, 5026, -1, + -1, 2779, 2780, 2781, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4275, -1, -1, + -1, -1, 4280, 4281, -1, -1, -1, -1, -1, -1, + -1, -1, 5060, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4309, 4310, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2856, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 2872, -1, 2874, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5146, -1, + 5148, -1, -1, -1, -1, -1, -1, 2905, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 2931, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2943, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 2956, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 2967, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 2983, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 5261, -1, -1, -1, -1, -1, -1, + -1, -1, 3020, -1, -1, -1, -1, -1, -1, 3027, + -1, -1, -1, -1, -1, -1, -1, 5285, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5308, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5324, 5325, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 3126, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3159, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3178, -1, -1, -1, -1, 3183, 3184, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3219, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4713, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4723, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3300, 3301, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5575, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5599, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5613, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5629, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3419, -1, -1, -1, 3423, -1, -1, 3426, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3444, -1, -1, -1, + -1, 3449, 3450, 3451, 3452, -1, 3454, -1, 3456, 3457, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3467, + 3468, -1, -1, -1, 3472, 3473, 3474, -1, -1, -1, + -1, -1, -1, -1, 3482, 3483, 3484, -1, 3486, -1, + 3488, 5739, 3490, -1, 3492, -1, 3494, -1, -1, -1, + -1, 3499, 3500, -1, 3502, -1, 3504, -1, -1, -1, + 3508, -1, -1, 3511, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 3523, -1, 3525, 3526, 3527, + -1, -1, 3530, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 3557, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3568, 3569, -1, -1, 3572, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5085, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5867, + -1, -1, -1, -1, -1, -1, -1, 3625, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 3639, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 3688, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5953, -1, -1, -1, -1, + -1, -1, -1, 3711, -1, -1, -1, -1, -1, -1, + 5198, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 5217, + -1, -1, -1, -1, -1, -1, -1, 5995, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6007, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 3804, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 6092, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 6144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 3990, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4011, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 6273, -1, -1, 4026, 6277, + -1, 4029, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4054, 4055, -1, -1, + -1, 4059, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4081, -1, 4083, -1, 4085, -1, 4087, + -1, -1, -1, -1, -1, 5573, -1, -1, -1, -1, + -1, -1, -1, -1, 4102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 4121, 4122, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4135, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5634, -1, 6406, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 4182, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4196, -1, + -1, -1, 4200, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4313, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 4323, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 4337, + -1, -1, 4340, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5852, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5862, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5978, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4530, 4531, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 4546, 4547, + 4548, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4570, 4571, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4615, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 4635, -1, -1, + -1, -1, 4640, 4641, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 4659, -1, -1, -1, 4663, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 4880, 4881, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 4944, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 4998, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5025, 5026, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5060, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5146, -1, + 5148, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5285, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5308, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 5324, 5325, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 5575, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 5613, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 5629, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 3, -1, -1, -1, -1, 8, + 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, 5867, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 6007, + -1, 180, 181, -1, 183, -1, -1, -1, 187, -1, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, 254, -1, -1, -1, -1, + -1, -1, -1, -1, 6092, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, 305, -1, -1, 308, + 309, -1, -1, -1, -1, 314, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, 6273, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, 6406, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, 64, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, 163, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, -1, -1, + -1, -1, 192, -1, -1, 195, 196, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, 288, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, -1, -1, -1, + -1, 192, -1, -1, 195, 196, -1, 198, 199, 200, + 201, -1, 203, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, -1, -1, -1, -1, + 192, -1, -1, 195, 196, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, 311, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + 143, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, -1, -1, -1, -1, 192, + -1, -1, 195, 196, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, 128, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, -1, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, 128, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, -1, 183, -1, + -1, -1, 187, -1, -1, -1, -1, 192, -1, -1, + 195, 196, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, 128, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, -1, -1, -1, -1, 192, -1, -1, 195, + 196, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, 143, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, -1, -1, -1, -1, 192, -1, -1, 195, 196, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + -1, -1, -1, -1, 192, -1, -1, 195, 196, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, -1, + -1, -1, -1, 192, -1, -1, 195, 196, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, -1, -1, + -1, -1, 192, -1, -1, 195, 196, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, -1, -1, -1, + -1, 192, -1, -1, 195, 196, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, 40, -1, + -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, -1, -1, -1, -1, + 192, -1, -1, 195, -1, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, 774, -1, -1, 8, 9, 779, -1, -1, + -1, 783, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 57, 58, 59, 60, -1, -1, + -1, -1, -1, -1, -1, 68, 69, -1, 71, -1, + -1, -1, -1, -1, -1, 78, 79, -1, -1, 82, + 83, 84, 85, -1, 87, 88, -1, 90, 91, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, 120, 121, 122, + -1, 124, -1, -1, -1, -1, -1, -1, -1, 132, + 133, 134, 135, -1, -1, -1, -1, -1, 141, -1, + -1, 144, -1, -1, -1, -1, -1, 150, -1, -1, + 153, -1, -1, -1, -1, -1, -1, -1, -1, 162, + -1, 164, -1, 166, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 180, 181, -1, + 183, -1, -1, -1, 187, -1, -1, -1, -1, 192, + -1, -1, 195, 196, -1, 198, 199, 200, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, 219, 220, 221, -1, + 223, -1, -1, -1, -1, -1, -1, 230, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 241, -1, + -1, -1, -1, -1, -1, -1, 249, 250, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 268, -1, -1, -1, -1, + -1, -1, 275, 276, -1, 278, 279, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 300, 301, 302, + -1, -1, -1, -1, -1, 308, 309, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, -1, -1, -1, + -1, -1, -1, -1, -1, 768, 769, -1, -1, 3, + -1, 774, -1, -1, 8, 9, 779, -1, -1, -1, + 783, 784, -1, -1, 787, 19, 20, -1, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, + -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 57, 58, 59, 60, -1, -1, -1, + -1, -1, -1, -1, 68, 69, -1, 71, -1, -1, + -1, -1, -1, -1, 78, 79, -1, -1, 82, 83, + 84, 85, -1, 87, 88, -1, 90, 91, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, 120, 121, 122, -1, + 124, -1, -1, -1, -1, -1, -1, -1, 132, 133, + 134, 135, -1, -1, -1, -1, -1, 141, -1, -1, + 144, -1, -1, -1, -1, -1, 150, -1, -1, 153, + -1, -1, -1, -1, -1, -1, -1, -1, 162, -1, + 164, -1, 166, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 180, 181, -1, 183, + -1, -1, -1, 187, -1, -1, -1, -1, 192, -1, + -1, 195, 196, -1, 198, 199, 200, 201, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, 219, 220, 221, -1, 223, + -1, -1, -1, -1, -1, -1, 230, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 241, -1, -1, + -1, -1, -1, -1, -1, 249, 250, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 268, -1, -1, -1, -1, -1, + -1, 275, 276, -1, 278, 279, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 290, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 300, 301, 302, -1, + -1, -1, -1, -1, 308, 309, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, 768, 769, -1, -1, 3, -1, + 774, -1, -1, 8, 9, 779, -1, -1, -1, 783, + 784, -1, -1, 787, 19, 20, -1, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, + -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 57, 58, 59, 60, -1, -1, -1, -1, + -1, -1, -1, 68, 69, -1, 71, -1, -1, -1, + -1, -1, -1, 78, 79, -1, -1, 82, 83, 84, + 85, -1, 87, 88, -1, 90, 91, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, 120, 121, 122, -1, 124, + -1, -1, -1, -1, -1, -1, -1, 132, 133, 134, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, 150, -1, -1, 153, -1, + -1, -1, -1, -1, -1, -1, -1, 162, -1, 164, + -1, 166, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 180, 181, 182, 183, -1, + -1, -1, 187, -1, -1, -1, -1, 192, -1, -1, + 195, -1, -1, 198, 199, 200, 201, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, 219, 220, 221, -1, 223, -1, + -1, -1, -1, -1, -1, 230, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 241, -1, -1, -1, + -1, -1, -1, -1, 249, 250, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, + 275, 276, -1, 278, 279, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 290, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 300, 301, 302, -1, -1, + -1, -1, -1, 308, 309, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, 768, 769, -1, -1, 3, -1, 774, + -1, -1, 8, 9, 779, -1, -1, -1, 783, 784, + -1, -1, 787, 19, 20, -1, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, -1, -1, -1, + -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 57, 58, 59, 60, -1, -1, -1, -1, -1, + -1, -1, 68, 69, -1, 71, -1, -1, -1, -1, + -1, -1, 78, 79, -1, -1, 82, 83, 84, 85, + -1, 87, 88, -1, 90, 91, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, 102, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, 120, 121, 122, -1, 124, -1, + -1, -1, -1, -1, -1, -1, 132, 133, 134, 135, + -1, -1, -1, -1, -1, 141, -1, -1, 144, -1, + -1, -1, -1, -1, 150, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, -1, 162, -1, 164, -1, + 166, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 180, 181, -1, 183, -1, -1, + -1, 187, -1, -1, -1, -1, 192, -1, -1, 195, + -1, -1, 198, 199, 200, 201, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, 219, 220, 221, -1, 223, -1, -1, + -1, -1, -1, -1, 230, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 241, -1, -1, -1, -1, + -1, -1, -1, 249, 250, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, -1, 275, + 276, -1, 278, 279, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 300, 301, 302, -1, -1, -1, + -1, -1, 308, 309, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, 768, 769, -1, -1, 3, -1, 774, -1, + -1, 8, 9, 779, -1, -1, -1, 783, 784, -1, + -1, 787, 19, 20, -1, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, -1, -1, -1, -1, + -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 57, 58, 59, 60, -1, -1, -1, -1, -1, -1, + -1, 68, 69, -1, 71, -1, -1, -1, -1, -1, + -1, 78, 79, -1, -1, 82, 83, 84, 85, -1, + 87, 88, -1, 90, 91, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, 102, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, 120, 121, 122, -1, 124, -1, -1, + -1, -1, -1, -1, -1, 132, 133, 134, 135, -1, + -1, -1, -1, -1, 141, -1, -1, 144, -1, -1, + -1, -1, -1, 150, -1, -1, 153, -1, -1, -1, + -1, -1, -1, -1, -1, 162, -1, 164, -1, 166, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 180, 181, -1, 183, -1, -1, -1, + 187, -1, -1, -1, -1, 192, -1, -1, 195, -1, + -1, 198, 199, 200, 201, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, 219, 220, 221, -1, 223, -1, -1, -1, + -1, -1, -1, 230, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 241, -1, -1, -1, -1, -1, + -1, -1, 249, 250, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 268, -1, -1, -1, -1, -1, -1, 275, 276, + -1, 278, 279, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 290, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 300, 301, 302, -1, -1, -1, -1, + -1, 308, 309, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, -1, -1, -1, -1, -1, -1, -1, + -1, 768, 769, -1, -1, 3, -1, 774, -1, -1, + 8, 9, 779, -1, -1, -1, 783, 784, -1, -1, + 787, 19, 20, -1, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, -1, -1, -1, -1, -1, + -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + 58, 59, 60, -1, -1, -1, -1, -1, -1, -1, + 68, 69, -1, 71, -1, -1, -1, -1, -1, -1, + 78, 79, -1, -1, 82, 83, 84, 85, -1, 87, + 88, -1, 90, 91, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, 102, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, 120, 121, 122, -1, 124, -1, -1, -1, + -1, -1, -1, -1, 132, 133, 134, 135, -1, -1, + -1, -1, -1, 141, -1, -1, 144, -1, -1, -1, + -1, -1, 150, -1, -1, 153, -1, -1, -1, -1, + -1, -1, -1, -1, 162, -1, 164, -1, 166, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 180, 181, -1, 183, -1, -1, -1, 187, + -1, -1, -1, -1, 192, -1, -1, 195, -1, -1, + 198, 199, 200, 201, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, 219, 220, 221, -1, 223, -1, -1, -1, -1, + -1, -1, 230, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 241, -1, -1, -1, -1, -1, -1, + -1, 249, 250, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 268, -1, -1, -1, -1, -1, -1, 275, 276, -1, + 278, 279, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 290, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 300, 301, 302, -1, -1, -1, -1, -1, + 308, 309, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + 768, 769, -1, -1, 3, -1, 774, -1, -1, 8, + 9, 779, -1, -1, -1, 783, 784, -1, -1, 787, + 19, 20, -1, 22, 23, 24, 25, 26, 27, 28, + 29, 30, 31, 32, -1, -1, -1, -1, -1, -1, + -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 57, 58, + 59, 60, -1, -1, -1, -1, -1, -1, -1, 68, + 69, -1, 71, -1, -1, -1, -1, -1, -1, 78, + 79, -1, -1, 82, 83, 84, 85, -1, 87, 88, + -1, 90, 91, -1, -1, -1, -1, -1, -1, -1, + 99, -1, -1, 102, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, 120, 121, 122, -1, 124, -1, -1, -1, -1, + -1, -1, -1, 132, 133, 134, 135, -1, -1, -1, + -1, -1, 141, -1, -1, 144, -1, -1, -1, -1, + -1, 150, -1, -1, 153, -1, -1, -1, -1, -1, + -1, -1, -1, 162, -1, 164, -1, 166, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 180, 181, -1, 183, -1, -1, -1, 187, -1, + -1, -1, -1, 192, -1, -1, 195, -1, -1, 198, + 199, 200, 201, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + 219, 220, 221, -1, 223, -1, -1, -1, -1, -1, + -1, 230, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 241, -1, -1, -1, -1, -1, -1, -1, + 249, 250, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 268, + -1, -1, -1, -1, -1, -1, 275, 276, -1, 278, + 279, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 290, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 300, 301, 302, -1, -1, -1, -1, -1, 308, + 309, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, + 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, -1, -1, 768, + 769, -1, -1, 3, -1, 774, -1, -1, 8, 9, + 779, -1, -1, -1, 783, 784, -1, -1, 787, 19, + 20, -1, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, -1, -1, -1, -1, -1, -1, -1, + 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, 58, 59, + 60, -1, -1, -1, -1, -1, -1, -1, 68, 69, + -1, 71, -1, -1, -1, -1, -1, -1, 78, 79, + -1, -1, 82, 83, 84, 85, -1, 87, 88, -1, + 90, 91, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + 120, 121, 122, -1, 124, -1, -1, -1, -1, -1, + -1, -1, 132, 133, 134, 135, -1, -1, -1, -1, + -1, 141, -1, -1, 144, -1, -1, -1, -1, -1, + 150, -1, -1, 153, -1, -1, -1, -1, -1, -1, + -1, -1, 162, -1, 164, -1, 166, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 180, 181, -1, 183, -1, -1, -1, 187, -1, -1, + -1, -1, 192, -1, -1, 195, -1, -1, 198, 199, + 200, 201, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, 219, + 220, 221, -1, 223, -1, -1, -1, -1, -1, -1, + 230, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 241, -1, -1, -1, -1, -1, -1, -1, 249, + 250, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 268, -1, + -1, -1, -1, -1, -1, 275, 276, -1, 278, 279, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 290, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 300, 301, 302, -1, -1, -1, -1, -1, 308, 309, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, + 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, 768, 769, + -1, -1, 3, -1, 774, -1, -1, 8, 9, 779, + -1, -1, -1, 783, 784, -1, -1, 787, 19, 20, + -1, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 57, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, 68, 69, -1, + 71, -1, -1, -1, -1, -1, -1, 78, 79, -1, + -1, 82, 83, 84, 85, -1, 87, 88, -1, 90, + 91, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, 102, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, 120, + 121, 122, -1, 124, -1, -1, -1, -1, -1, -1, + -1, 132, 133, 134, 135, -1, -1, -1, -1, -1, + 141, -1, -1, 144, -1, -1, -1, -1, -1, 150, + -1, -1, 153, -1, -1, -1, -1, -1, -1, -1, + -1, 162, -1, 164, -1, 166, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 180, + 181, -1, 183, -1, -1, -1, 187, -1, -1, -1, + -1, 192, -1, -1, 195, -1, -1, 198, 199, 200, + 201, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, 219, 220, + 221, -1, 223, -1, -1, -1, -1, -1, -1, 230, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 241, -1, -1, -1, -1, -1, -1, -1, 249, 250, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 268, -1, -1, + -1, -1, -1, -1, 275, 276, -1, 278, 279, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 290, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 300, + 301, 302, -1, -1, -1, -1, -1, 308, 309, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, -1, + -1, -1, -1, -1, -1, -1, -1, 768, 769, -1, + -1, 3, -1, 774, -1, -1, 8, 9, 779, -1, + -1, -1, 783, 784, -1, -1, 787, 19, 20, -1, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 58, 59, 60, -1, + -1, -1, -1, -1, -1, -1, 68, 69, -1, 71, + -1, -1, -1, -1, -1, -1, 78, 79, -1, -1, + 82, 83, 84, 85, -1, 87, 88, -1, 90, 91, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + 102, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, 120, 121, + 122, -1, 124, -1, -1, -1, -1, -1, -1, -1, + 132, 133, 134, 135, -1, -1, -1, -1, -1, 141, + -1, -1, 144, -1, -1, -1, -1, -1, 150, -1, + -1, 153, -1, -1, -1, -1, -1, -1, -1, -1, + 162, -1, 164, -1, 166, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 180, 181, + -1, 183, -1, -1, -1, 187, -1, -1, -1, -1, + 192, -1, -1, 195, -1, -1, 198, 199, 200, 201, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, 219, 220, 221, + -1, 223, -1, -1, -1, -1, -1, -1, 230, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 241, + -1, -1, -1, -1, -1, -1, -1, 249, 250, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 268, -1, -1, -1, + -1, -1, -1, 275, 276, -1, 278, 279, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 290, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 300, 301, + 302, -1, -1, -1, -1, -1, 308, 309, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, 768, 769, -1, -1, + 3, -1, -1, -1, -1, 8, -1, 779, -1, -1, + -1, -1, 784, -1, -1, 787, 19, 20, -1, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, 122, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, 201, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 290, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, 3, 756, 757, 758, 759, 8, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, 3, 756, 757, 758, 759, 8, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 19, 20, -1, -1, -1, -1, -1, -1, -1, 780, + -1, -1, -1, -1, -1, -1, 787, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, 8, 756, 757, 758, + 759, -1, -1, -1, -1, -1, -1, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 787, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 8, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 779, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + 8, 756, 757, 758, 759, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 787, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 5, -1, 7, 8, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 48, 49, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, -1, 68, -1, 70, -1, 72, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 98, -1, -1, 101, -1, + 103, 104, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 127, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, 141, -1, + -1, -1, -1, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 161, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 171, -1, + 173, -1, -1, -1, 177, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, 204, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, 218, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 239, 240, 241, -1, + 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 294, -1, 296, -1, 298, -1, -1, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, -1, + 313, 314, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, -1, 328, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, -1, 367, 368, 369, 370, 371, 372, + 373, -1, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, -1, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, -1, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, -1, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, -1, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, -1, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, -1, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, -1, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 5, -1, -1, + 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, 779, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 48, 49, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 66, -1, + 68, -1, 70, -1, 72, -1, -1, -1, -1, -1, + -1, -1, 80, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 98, -1, -1, 101, -1, 103, 104, -1, -1, -1, + -1, -1, 110, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 127, + -1, -1, -1, 131, -1, -1, -1, 135, -1, -1, + -1, -1, -1, 141, -1, -1, -1, -1, -1, -1, + -1, -1, 150, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 161, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 171, -1, 173, -1, -1, -1, 177, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, 204, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, 216, 217, + 218, -1, -1, -1, -1, -1, -1, -1, -1, 227, + 228, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 239, 240, 241, -1, 243, -1, -1, -1, -1, + 248, -1, -1, -1, -1, -1, 254, -1, -1, -1, + 258, 259, 260, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 294, -1, 296, -1, + 298, -1, -1, -1, -1, -1, -1, 305, -1, -1, + -1, -1, -1, -1, -1, 313, 314, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, -1, + 328, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, -1, 367, + 368, 369, 370, 371, 372, 373, -1, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, -1, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, -1, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, -1, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 5, -1, -1, 8, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 19, 20, -1, -1, + -1, 779, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 48, 49, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 66, -1, -1, -1, 70, -1, 72, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + 103, 104, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 161, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 171, -1, + 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, 204, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, 216, 217, 218, -1, -1, -1, -1, + -1, -1, -1, -1, 227, 228, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 239, 240, -1, -1, + 243, -1, -1, -1, -1, 248, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, 260, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 294, -1, 296, -1, 298, -1, -1, -1, -1, + -1, -1, 305, -1, -1, -1, -1, -1, -1, -1, + -1, 314, -1, -1, -1, 318, 319, 320, -1, 322, + 323, 324, 325, 326, -1, 328, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, -1, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, -1, 367, 368, 369, 370, 371, 372, + 373, -1, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, -1, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, -1, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, -1, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, -1, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, -1, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, -1, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, -1, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 779, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 75, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 129, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, 145, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 160, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 262, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 254, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 305, -1, -1, -1, -1, -1, + -1, -1, -1, 314, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, + -1, -1, -1, -1, -1, -1, 787, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 111, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, 784, -1, -1, 787, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 779, -1, -1, -1, -1, 784, -1, -1, 787, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 779, -1, -1, -1, -1, -1, -1, -1, 787, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, 770, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 787, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 779, -1, -1, -1, -1, -1, -1, + -1, 787, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, 141, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 787, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 787, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 787, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 787, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 85, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, -1, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 779, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 3, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, 779, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 71, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 3, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 71, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 99, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, 3, + 756, 757, 758, 759, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, 3, 756, 757, 758, 759, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, 3, 756, 757, 758, 759, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, 3, 756, 757, 758, 759, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 3, 756, 757, + 758, 759, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 8, 9, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 19, 20, -1, -1, -1, + -1, -1, -1, -1, 28, -1, 30, -1, 32, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 251, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 8, 9, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 19, 20, -1, + -1, -1, -1, -1, -1, -1, 28, -1, 30, -1, + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 251, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 8, 9, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, + 20, -1, -1, -1, -1, -1, -1, -1, 28, -1, + 30, -1, 32, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 251, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 8, 9, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 19, 20, -1, -1, -1, -1, -1, -1, -1, + 28, -1, 30, -1, 32, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, 770, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, 770, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, 770, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, 770, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, 770, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, 26, -1, -1, 770, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, 196, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, 209, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 265, -1, 267, -1, 269, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, 769, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 42, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, 21, 763, -1, -1, -1, -1, -1, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 42, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, 763, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, -1, 75, 76, 77, + 78, 79, 80, 81, 82, 83, 84, 85, -1, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, -1, + 128, 129, 130, 131, 132, -1, -1, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + -1, 149, 150, -1, 152, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, -1, 213, 214, 215, 216, 217, + 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, -1, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, -1, 296, 297, + 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, + 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, + 318, 319, 320, -1, 322, 323, 324, 325, 326, -1, + 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, -1, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, -1, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, -1, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, -1, 574, 575, 576, 577, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, -1, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, -1, 661, 662, 663, 664, 665, -1, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + -1, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, 46, + 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, -1, 75, 76, + 77, 78, 79, 80, 81, 82, 83, 84, 85, -1, + 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, + -1, 128, 129, 130, 131, 132, -1, -1, 135, 136, + 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, + 147, -1, 149, 150, -1, 152, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, + 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, + 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, + 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, + 207, 208, 209, 210, 211, -1, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, + 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, -1, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, -1, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, + 317, 318, 319, 320, -1, 322, 323, 324, 325, 326, + -1, 328, 329, 330, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, -1, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, -1, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, -1, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, -1, 574, 575, 576, + 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, -1, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, -1, 661, 662, 663, 664, 665, -1, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, -1, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, -1, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, + -1, 87, 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, + 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, + 126, -1, 128, 129, 130, 131, 132, -1, -1, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, -1, 149, 150, -1, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, + 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 210, 211, -1, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, + 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, + 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, + 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, + 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, + 276, 277, 278, -1, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, 294, -1, + 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, + 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, + 316, 317, 318, 319, 320, -1, 322, 323, 324, 325, + 326, -1, 328, 329, 330, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, -1, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, -1, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, -1, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, -1, 574, 575, + 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, -1, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, -1, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + -1, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, -1, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, -1, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, -1, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, -1, 128, 129, 130, 131, 132, -1, -1, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, -1, 149, 150, -1, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, + 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, + 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, + 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, -1, 213, 214, + 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, -1, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + -1, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, -1, 322, 323, 324, + 325, 326, -1, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, -1, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, -1, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, -1, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, -1, 574, + 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + -1, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, -1, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, -1, 661, 662, 663, 664, + 665, -1, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, -1, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, -1, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 47, 48, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, + 84, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 101, -1, -1, + -1, -1, -1, -1, -1, -1, 110, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 131, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, 145, -1, -1, -1, -1, 150, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 173, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 232, -1, + -1, -1, 236, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 254, -1, -1, -1, 258, 259, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 289, -1, -1, -1, -1, + -1, -1, 296, 297, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 47, 48, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, + -1, 84, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 101, -1, + -1, -1, -1, -1, -1, -1, -1, 110, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 131, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, 145, -1, -1, -1, -1, 150, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 173, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 232, + -1, -1, -1, 236, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 254, -1, -1, -1, 258, 259, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 289, -1, -1, -1, + -1, -1, -1, 296, 297, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, 24, 25, 26, -1, 28, -1, 30, 31, + 32, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 84, 85, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, 23, -1, -1, 26, 27, -1, + -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 85, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, 21, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 31, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, 21, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, 21, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, 21, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 258, + -1, -1, -1, -1, -1, -1, -1, -1, 267, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, 21, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 76, + 77, -1, -1, -1, -1, -1, -1, -1, -1, 86, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, -1, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, -1, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + -1, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 128, -1, -1, -1, -1, -1, -1, 135, + 136, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 267, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 128, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 30, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 99, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 99, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 63, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 99, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 99, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, 225, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 99, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, 225, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, -1, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, 321, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, 144, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, 321, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, + 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, + 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, 470, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + 568, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, + 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, 323, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, -1, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, + 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, + 377, 378, 379, 380, 381, 382, 383, -1, 385, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, 412, 413, -1, 415, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, + 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, 439, 440, 441, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, + 457, 458, -1, 460, 461, 462, 463, 464, 465, 466, + 467, 468, 469, 470, 471, 472, 473, -1, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, + 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, 582, 583, 584, 585, 586, + 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, + 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, -1, 682, 683, 684, 685, 686, + 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, + 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, 750, 751, 752, 753, 754, -1, 756, + 757, 758, 759, 19, 20, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 88, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 116, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 135, + -1, -1, -1, -1, -1, -1, -1, -1, 144, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 195, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 207, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 218, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 318, 319, 320, 321, 322, 323, 324, 325, + 326, -1, -1, -1, -1, 331, 332, 333, 334, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, -1, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, + 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, + 376, 377, 378, 379, 380, 381, 382, 383, -1, 385, + 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, + 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, + 406, 407, 408, 409, 410, 411, 412, 413, -1, 415, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, -1, -1, 445, + 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, + 456, 457, 458, -1, 460, 461, 462, 463, 464, 465, + 466, 467, 468, 469, 470, 471, 472, 473, -1, 475, + 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, + 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, + 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, + 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, + 526, 527, 528, 529, 530, 531, -1, 533, 534, 535, + 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, + 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, + 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, + 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, + 576, -1, 578, 579, 580, 581, 582, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, + 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, + 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, + 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, + 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, + 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, + 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, + 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, + 676, 677, 678, 679, 680, -1, 682, 683, 684, 685, + 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, + 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, + 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, + 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, + 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, + 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, + 746, 747, 748, 749, 750, 751, 752, 753, 754, -1, + 756, 757, 758, 759, 19, 20, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 88, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, 323, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, -1, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, -1, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, -1, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, 439, 440, 441, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, 456, 457, 458, -1, 460, 461, 462, 463, 464, + 465, 466, 467, 468, 469, 470, 471, 472, 473, -1, + 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, + 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, 582, 583, 584, + 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, + 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, + 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, + 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, + 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, + 675, 676, 677, 678, 679, 680, -1, 682, 683, 684, + 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, + 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, + -1, 756, 757, 758, 759, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 99, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, 321, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, 455, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, -1, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, + 504, 505, -1, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, + 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, 660, -1, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758, 759, 19, 20, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 88, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 116, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 135, -1, -1, -1, -1, -1, -1, -1, + -1, 144, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 195, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 207, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 218, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 318, 319, 320, 321, 322, + 323, 324, 325, 326, -1, -1, -1, -1, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, -1, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, + 383, -1, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, + 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, + 413, -1, 415, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, + 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, + -1, -1, 445, 446, 447, 448, 449, 450, 451, 452, + 453, 454, 455, 456, 457, 458, -1, 460, 461, 462, + 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, + 473, -1, 475, 476, 477, 478, 479, 480, 481, 482, + 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, + 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, + 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, + 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, + 523, 524, 525, 526, 527, 528, 529, 530, 531, -1, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, + 573, 574, 575, 576, -1, 578, 579, 580, 581, 582, + 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, + 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, + 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, + 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, + 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, + 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, + 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, + 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, + 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, + 673, 674, 675, 676, 677, 678, 679, 680, -1, 682, + 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, + 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, + 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, + 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, + 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, + 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, + 753, 754, -1, 756, 757, 758, 759, 19, 20, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 88, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 116, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 135, -1, -1, -1, -1, -1, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 195, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 207, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 218, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 318, 319, 320, 321, + 322, 323, 324, 325, 326, -1, -1, -1, -1, 331, + 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, -1, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, + 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, + 382, 383, -1, 385, 386, 387, 388, 389, 390, 391, + 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, + 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, + 412, 413, -1, 415, 416, 417, 418, 419, 420, 421, + 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, + 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, + 442, -1, -1, 445, 446, 447, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, -1, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, + 472, 473, -1, 475, 476, 477, 478, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, + 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + -1, 533, 534, 535, 536, 537, 538, 539, 540, 541, + 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, + 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, + 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, + 572, 573, 574, 575, 576, -1, 578, 579, 580, 581, + 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, + 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, + 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, + 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, + 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, + 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, + 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, + 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, + 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, + 672, 673, 674, 675, 676, 677, 678, 679, 680, -1, + 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, + 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, + 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, + 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, + 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, + 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, + 752, 753, 754, -1, 756, 757, 758, 759, 19, 20, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 88, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, 323, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + -1, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, + 381, 382, 383, -1, 385, 386, 387, 388, 389, 390, + 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, 412, 413, -1, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, + 441, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, 456, 457, 458, -1, 460, + 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, + 471, 472, 473, -1, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, + 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, + 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, + 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, + 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, + 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, + 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, + -1, 682, 683, 684, 685, 686, 687, 688, 689, 690, + 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, + 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, + 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + 751, 752, 753, 754, -1, 756, 757, 758, 759, 19, + 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 88, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 116, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 135, -1, -1, -1, -1, + -1, -1, -1, -1, 144, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 195, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 207, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 218, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 318, 319, + 320, 321, 322, 323, 324, 325, 326, -1, -1, -1, + -1, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, -1, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, + 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, + 380, 381, 382, 383, -1, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, + 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, + 410, 411, 412, 413, -1, 415, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, + 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, + 440, 441, 442, -1, -1, 445, 446, 447, 448, 449, + 450, 451, 452, 453, 454, 455, 456, 457, 458, -1, + 460, 461, 462, 463, 464, 465, 466, 467, -1, 469, + 470, 471, 472, 473, -1, 475, 476, 477, 478, 479, + 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, + 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, + 500, 501, 502, 503, 504, 505, -1, 507, 508, 509, + 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, + 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, + 530, 531, -1, 533, 534, 535, 536, 537, 538, 539, + 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, + 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, + 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, + 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, + 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, + 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, + 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, + 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, + 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, + 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, + 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, + 660, -1, 662, 663, 664, 665, 666, 667, 668, 669, + 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, + 680, -1, 682, 683, 684, 685, 686, 687, 688, 689, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, + 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, + 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, + 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 753, 754, -1, 756, 757, 758, 759, + 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 86, -1, 88, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 116, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 135, -1, -1, -1, + -1, -1, -1, -1, -1, 144, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 195, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 207, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 218, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 318, + 319, 320, -1, 322, 323, 324, 325, 326, -1, -1, + -1, -1, 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, -1, -1, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, + 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, + 379, 380, 381, 382, 383, -1, 385, 386, 387, 388, + 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, + 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, + 409, 410, 411, 412, 413, -1, 415, 416, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 426, -1, 428, + 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, + 439, 440, 441, 442, -1, -1, 445, 446, 447, 448, + 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, + -1, 460, 461, 462, 463, 464, 465, 466, 467, 468, + 469, 470, 471, 472, 473, -1, 475, 476, 477, 478, + 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, + 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, + 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, + 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, + 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, + 529, 530, 531, -1, 533, 534, 535, 536, 537, 538, + 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, + 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, + 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, + 569, 570, 571, 572, 573, 574, 575, 576, -1, 578, + 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, + 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, + 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, + 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, + 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, + 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, + 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, + 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, + 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, + 679, 680, -1, 682, 683, 684, 685, 686, 687, 688, + 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, + 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, + 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, + 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, + 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, + 749, 750, 751, 752, 753, 754, -1, 756, 757, 758, + 759, 19, 20, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 88, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 116, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 135, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 195, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 207, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 218, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 318, 319, 320, -1, 322, 323, 324, 325, 326, -1, + -1, -1, -1, 331, 332, 333, 334, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, -1, -1, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 363, 364, 365, -1, 367, + 368, 369, 370, 371, 372, 373, -1, 375, 376, 377, + 378, 379, 380, 381, 382, 383, -1, 385, 386, 387, + -1, 389, 390, 391, 392, 393, 394, 395, 396, 397, + -1, 399, 400, 401, 402, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, -1, 415, 416, 417, + 418, 419, 420, 421, -1, 423, 424, 425, 426, -1, + 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 442, -1, -1, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, -1, + 458, -1, 460, 461, 462, 463, 464, 465, 466, 467, + 468, 469, -1, 471, 472, 473, -1, 475, 476, 477, + 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, + 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, + -1, 499, 500, 501, 502, 503, 504, 505, 506, 507, + 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, + 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, + 528, 529, 530, 531, -1, 533, 534, 535, 536, 537, + 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, + 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, + 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, + -1, 569, 570, 571, 572, 573, 574, 575, 576, -1, + 578, 579, 580, 581, -1, 583, 584, 585, 586, 587, + 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, + 598, 599, -1, 601, 602, 603, 604, 605, 606, 607, + 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, + 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, + 628, 629, 630, -1, 632, 633, 634, 635, 636, 637, + 638, 639, 640, 641, 642, 643, 644, -1, 646, 647, + 648, 649, 650, 651, 652, -1, 654, 655, 656, 657, + 658, 659, 660, 661, 662, 663, 664, -1, 666, 667, + 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, + 678, 679, 680, -1, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, -1, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, -1, 756, 757, + 758, 759, 19, 20, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 88, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 116, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 135, -1, + -1, -1, -1, -1, -1, -1, -1, 144, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 195, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 207, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 218, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 311, -1, -1, -1, -1, -1, + -1, 318, 319, 320, 321, 322, -1, 324, 325, 326, + -1, -1, -1, -1, 331, 332, 333, 334, 335, 336, + 337, 338, 339, 340, -1, 342, 343, 344, 345, 346, + 347, 348, 349, -1, -1, -1, -1, 354, 355, 356, + 357, 358, -1, -1, 361, 362, 363, 364, 365, -1, + -1, -1, 369, 370, 371, 372, 373, -1, 375, 376, + 377, 378, -1, -1, -1, -1, -1, -1, 385, -1, + 387, -1, 389, 390, 391, 392, 393, 394, 395, 396, + 397, -1, 399, 400, 401, 402, 403, 404, 405, 406, + 407, 408, 409, 410, 411, -1, 413, -1, 415, 416, + 417, 418, 419, 420, 421, -1, 423, 424, 425, 426, + -1, 428, 429, 430, 431, 432, 433, 434, 435, 436, + 437, 438, -1, -1, -1, 442, -1, -1, 445, 446, + 447, 448, 449, 450, 451, 452, 453, 454, 455, -1, + -1, -1, -1, -1, 461, 462, 463, 464, 465, 466, + -1, 468, 469, -1, 471, 472, -1, -1, 475, -1, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, + 487, -1, 489, 490, 491, 492, 493, 494, 495, 496, + 497, -1, 499, 500, 501, 502, 503, 504, 505, 506, + 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, + 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, + 527, 528, 529, 530, 531, -1, 533, 534, 535, 536, + 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, + 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, + 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, + 567, -1, 569, 570, 571, 572, 573, 574, 575, 576, + -1, 578, 579, 580, 581, -1, -1, -1, 585, -1, + 587, 588, -1, 590, 591, 592, 593, -1, 595, 596, + 597, 598, -1, -1, -1, -1, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, -1, 630, -1, 632, 633, 634, -1, 636, + 637, -1, 639, 640, 641, 642, 643, 644, -1, 646, + 647, 648, 649, 650, 651, 652, -1, 654, 655, 656, + -1, 658, 659, 660, 661, -1, 663, 664, 19, 20, + 667, 668, -1, -1, 671, 672, 673, -1, 675, -1, + 677, 678, 679, 680, -1, 682, 683, 684, 685, -1, + 687, 688, -1, 690, -1, 692, 693, 694, 695, 696, + 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, + 707, 708, 709, 710, 711, -1, 713, 714, 715, 716, + 717, 718, 719, 720, 721, -1, 723, 724, -1, 726, + 727, 728, 729, -1, -1, 732, 733, 88, 735, 736, + 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, + 747, 748, 749, -1, -1, 752, 753, -1, -1, 756, + -1, 758, 759, -1, -1, 116, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 135, -1, -1, -1, -1, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 195, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 207, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 218, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 311, -1, -1, -1, -1, -1, -1, 318, 319, 320, + 321, 322, -1, 324, 325, 326, -1, -1, -1, -1, + 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, + -1, 342, 343, 344, 345, 346, 347, 348, 349, -1, + -1, -1, -1, 354, 355, 356, 357, 358, -1, -1, + 361, 362, 363, 364, 365, -1, -1, -1, 369, 370, + 371, 372, 373, -1, 375, 376, 377, 378, -1, -1, + -1, -1, -1, -1, 385, -1, 387, -1, 389, 390, + 391, 392, 393, 394, 395, 396, 397, -1, 399, 400, + 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, + 411, -1, 413, -1, 415, 416, 417, 418, 419, 420, + 421, -1, 423, 424, 425, 426, -1, 428, 429, 430, + 431, 432, 433, 434, 435, 436, 437, 438, -1, -1, + -1, 442, -1, -1, 445, 446, 447, 448, 449, 450, + 451, 452, 453, 454, 455, -1, -1, -1, -1, -1, + 461, 462, 463, 464, 465, 466, -1, 468, 469, -1, + 471, 472, -1, -1, 475, -1, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, -1, 489, 490, + 491, 492, 493, 494, 495, 496, 497, -1, 499, 500, + 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, + 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, + 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, + 531, -1, 533, 534, 535, 536, 537, 538, 539, 540, + 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, + 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, + 561, 562, 563, 564, 565, 566, 567, -1, 569, 570, + 571, 572, 573, 574, 575, 576, -1, 578, 579, 580, + 581, -1, -1, -1, 585, -1, 587, 588, -1, 590, + 591, 592, 593, -1, 595, 596, 597, 598, -1, -1, + -1, -1, 603, 604, 605, 606, 607, 608, 609, 610, + 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, + 621, 622, 623, 624, 625, 626, 627, 628, -1, 630, + -1, 632, 633, 634, -1, 636, 637, -1, 639, 640, + 641, 642, 643, 644, -1, 646, 647, 648, 649, 650, + 651, 652, -1, 654, 655, 656, -1, 658, 659, 660, + 661, -1, 663, 664, 19, 20, 667, 668, -1, -1, + 671, 672, 673, -1, 675, -1, 677, 678, 679, 680, + -1, 682, 683, 684, 685, -1, 687, 688, -1, 690, + -1, 692, 693, 694, 695, 696, 697, 698, 699, 700, + 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, + 711, -1, 713, 714, 715, 716, 717, 718, 719, 720, + 721, -1, 723, 724, -1, 726, 727, 728, 729, -1, + -1, 732, 733, 88, 735, 736, 737, 738, 739, 740, + 741, 742, 743, 744, 745, 746, 747, 748, 749, -1, + -1, 752, 753, -1, -1, 756, -1, 758, 759, -1, + -1, 116, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 135, -1, -1, -1, -1, -1, -1, -1, -1, 144, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 195, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 207, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 218, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 318, 319, 320, 321, 322, -1, 324, + 325, 326, -1, -1, -1, -1, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, -1, 342, 343, 344, + 345, 346, 347, 348, 349, -1, -1, -1, -1, 354, + 355, 356, 357, 358, -1, -1, 361, 362, 363, 364, + 365, -1, -1, -1, 369, 370, 371, 372, 373, -1, + 375, 376, 377, 378, -1, -1, -1, -1, -1, -1, + 385, -1, 387, -1, 389, 390, 391, 392, 393, 394, + 395, 396, 397, -1, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, -1, 413, -1, + 415, 416, 417, 418, 419, 420, 421, -1, 423, 424, + 425, 426, -1, 428, 429, 430, 431, 432, 433, 434, + 435, 436, 437, 438, -1, -1, -1, 442, -1, -1, + 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, + 455, -1, -1, -1, -1, -1, 461, 462, 463, 464, + 465, 466, -1, 468, 469, -1, 471, 472, -1, -1, + 475, -1, 477, 478, 479, 480, 481, 482, 483, 484, + 485, 486, 487, -1, 489, 490, 491, 492, 493, 494, + 495, 496, 497, -1, 499, 500, 501, 502, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, + 525, 526, 527, 528, 529, 530, 531, -1, 533, 534, + 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, + 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, + 565, 566, 567, -1, 569, 570, 571, 572, 573, 574, + 575, 576, -1, 578, 579, 580, 581, -1, -1, -1, + 585, -1, 587, 588, -1, 590, 591, 592, 593, -1, + 595, 596, 597, 598, -1, -1, -1, -1, 603, 604, + 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, + 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, + 625, 626, 627, 628, -1, 630, -1, 632, 633, 634, + -1, 636, 637, -1, 639, 640, 641, 642, 643, 644, + -1, 646, 647, 648, 649, 650, 651, 652, -1, 654, + 655, 656, -1, 658, 659, 660, 661, -1, 663, 664, + -1, -1, 667, 668, -1, -1, 671, 672, 673, -1, + 675, -1, 677, 678, 679, 680, -1, 682, 683, 684, + 685, -1, 687, 688, -1, 690, -1, 692, 693, 694, + 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, -1, 713, 714, + 715, 716, 717, 718, 719, 720, 721, -1, 723, 724, + -1, 726, 727, 728, 729, -1, -1, 732, 733, -1, + 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, + 745, 746, 747, 748, 749, 19, 20, 752, 753, -1, + -1, 756, -1, 758, 759, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, -1, 57, 58, 59, 60, -1, -1, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + -1, 75, 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, -1, 87, 88, 89, 90, 91, 92, 93, + 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, -1, 128, 129, 130, 131, 132, -1, + -1, 135, 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, -1, 149, 150, -1, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + -1, -1, -1, 177, 178, 179, 180, 181, 182, 183, + -1, -1, -1, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, -1, 203, + 204, 205, 206, 207, 208, 209, 210, 211, -1, 213, + 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + -1, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 256, 257, -1, 259, 260, -1, 262, 263, + 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, + 274, 275, 276, 277, 278, -1, 280, 281, 282, 283, + -1, -1, -1, 287, 288, 289, 290, 291, 292, 293, + 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, + 304, 305, -1, 307, 308, 309, 310, 311, 312, 313, + 314, 315, 316, 317, 318, 319, 320, -1, 322, 323, + 324, 325, 326, -1, 328, 329, 330, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, 352, 353, + -1, 355, -1, -1, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, -1, -1, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, 427, 428, 429, 430, -1, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, -1, 456, 457, 458, -1, 460, 461, 462, -1, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, -1, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, -1, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, -1, 559, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, -1, + -1, -1, 576, 577, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, -1, -1, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, -1, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, -1, 661, 662, 663, + 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, -1, 711, 712, -1, + 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, -1, 739, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, -1, 751, 752, 753, + 754, -1, 756, 757, 758, 19, 20, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 88, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 116, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 135, -1, -1, -1, -1, -1, -1, -1, -1, + 144, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 195, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 207, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 218, -1, -1, -1, -1, -1, + -1, -1, 226, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 318, 319, 320, -1, 322, 323, + 324, 325, 326, -1, -1, -1, -1, 331, 332, 333, + 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, -1, -1, 353, + -1, 355, -1, -1, 358, 359, 360, 361, 362, 363, + 364, 365, 366, 367, 368, 369, 370, 371, -1, -1, + 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, + -1, 385, 386, 387, 388, 389, 390, 391, 392, 393, + 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, -1, -1, 411, 412, 413, + -1, 415, 416, 417, 418, 419, 420, 421, 422, 423, + 424, 425, 426, -1, 428, 429, 430, -1, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 442, -1, + -1, 445, 446, 447, 448, 449, 450, 451, 452, 453, + 454, -1, 456, 457, 458, -1, 460, 461, 462, 463, + 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, + -1, 475, 476, 477, 478, 479, 480, 481, 482, 483, + 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, + 494, 495, -1, 497, 498, 499, 500, 501, 502, 503, + 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, + 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, + 524, 525, 526, 527, 528, 529, 530, 531, -1, 533, + 534, 535, 536, 537, 538, 539, -1, 541, 542, 543, + 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, + 554, 555, 556, 557, -1, -1, 560, 561, 562, 563, + 564, 565, 566, 567, 568, 569, 570, 571, 572, -1, + -1, -1, 576, -1, 578, 579, 580, 581, 582, 583, + 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, + 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, + 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, + 614, -1, -1, 617, 618, 619, 620, 621, 622, 623, + 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, + 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, + 644, 645, 646, 647, 648, -1, 650, 651, 652, 653, + 654, 655, 656, 657, 658, 659, -1, 661, 662, 663, + 664, 665, -1, 667, 668, 669, 670, 671, 672, 673, + 674, 675, 676, 677, 678, 679, 680, -1, 682, 683, + 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, + 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, -1, 711, 712, -1, + 714, 715, -1, 717, 718, 719, 720, 721, 722, 723, + 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, + 734, 735, 736, 737, -1, -1, 740, 741, 742, 743, + 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, + 754, -1, 756, 757, 758 +}; + +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ +static const yytype_int16 yystos[] = +{ + 0, 5, 7, 8, 19, 20, 48, 49, 66, 68, + 70, 72, 80, 88, 98, 101, 103, 104, 110, 116, + 127, 131, 135, 141, 150, 161, 171, 173, 177, 195, + 204, 207, 216, 217, 218, 227, 228, 239, 240, 241, + 243, 248, 254, 258, 259, 260, 294, 296, 298, 305, + 313, 314, 318, 319, 320, 322, 323, 324, 325, 326, + 328, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 363, 364, 365, 367, 368, 369, 370, + 371, 372, 373, 375, 376, 377, 378, 379, 380, 381, + 382, 383, 385, 386, 387, 388, 389, 390, 391, 392, + 393, 394, 395, 396, 397, 399, 400, 401, 402, 403, + 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, + 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, + 425, 426, 428, 429, 430, 431, 432, 433, 434, 435, + 436, 437, 438, 439, 440, 441, 442, 445, 446, 447, + 448, 449, 450, 451, 452, 453, 454, 455, 456, 458, + 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, + 470, 471, 472, 473, 475, 476, 477, 478, 479, 480, + 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, + 491, 492, 493, 494, 495, 496, 497, 499, 500, 501, + 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, + 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, + 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, + 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, + 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, + 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, + 563, 564, 565, 566, 567, 569, 570, 571, 572, 573, + 574, 575, 576, 578, 579, 580, 581, 583, 584, 585, + 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, + 596, 597, 598, 599, 601, 602, 603, 604, 605, 606, + 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, + 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, + 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, + 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, + 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, + 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, + 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, + 677, 678, 679, 680, 682, 683, 684, 685, 686, 687, + 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, + 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, + 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, + 748, 749, 750, 751, 752, 753, 754, 756, 757, 758, + 759, 779, 789, 792, 793, 794, 795, 796, 798, 804, + 806, 821, 868, 907, 908, 915, 916, 929, 964, 989, + 1007, 1069, 1122, 1223, 1276, 1279, 1289, 1294, 1300, 1313, + 1316, 1322, 1325, 1330, 1337, 1349, 1352, 1355, 1356, 1358, + 1361, 1362, 1364, 1365, 1368, 1369, 1372, 1609, 1611, 1624, + 1627, 1665, 1674, 1692, 1700, 1714, 1718, 1719, 1723, 1724, + 1734, 1741, 1749, 1751, 1757, 1760, 1761, 1793, 1815, 1837, + 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1848, 1889, 1896, + 1898, 1907, 1910, 1946, 1948, 1953, 1954, 1955, 1956, 1981, + 1990, 1991, 1992, 1994, 2019, 2021, 2022, 2075, 2076, 2094, + 2100, 144, 321, 350, 352, 353, 360, 366, 368, 374, + 388, 398, 412, 422, 427, 441, 456, 457, 463, 467, + 470, 473, 488, 498, 568, 582, 600, 602, 631, 635, + 645, 653, 665, 686, 689, 722, 731, 750, 757, 1815, + 1817, 1826, 1833, 1837, 1838, 1839, 1840, 1841, 1842, 1843, + 1846, 2002, 88, 226, 338, 413, 463, 658, 662, 735, + 1224, 1960, 1961, 1962, 1963, 197, 460, 506, 1324, 1721, + 1826, 965, 528, 1317, 208, 2102, 1675, 88, 145, 214, + 226, 289, 436, 463, 644, 662, 708, 735, 743, 1623, + 992, 859, 930, 1625, 1752, 145, 408, 758, 1766, 281, + 704, 1892, 990, 1324, 1123, 1008, 57, 528, 1706, 258, + 267, 904, 909, 911, 1826, 653, 735, 1892, 994, 909, + 910, 859, 1359, 1849, 1701, 909, 1897, 1666, 1826, 1357, + 991, 235, 1795, 1628, 173, 294, 684, 1735, 1947, 40, + 196, 1405, 1993, 2099, 3, 31, 1820, 145, 1892, 753, + 1950, 1610, 482, 1826, 1324, 403, 917, 1899, 805, 598, + 676, 1826, 1324, 1742, 1950, 1826, 1758, 47, 669, 717, + 47, 669, 1693, 598, 676, 351, 352, 388, 427, 602, + 619, 645, 686, 1984, 1358, 1365, 1368, 0, 7, 790, + 602, 88, 129, 145, 262, 293, 644, 735, 838, 1201, + 1202, 1623, 1960, 1961, 1962, 1963, 128, 154, 1375, 1376, + 1605, 1353, 1350, 119, 152, 292, 1367, 1957, 1366, 1957, + 448, 460, 591, 787, 1720, 1721, 1812, 1826, 1362, 1364, + 42, 787, 787, 386, 1243, 1826, 862, 1826, 763, 763, + 862, 141, 1622, 21, 1820, 1826, 1828, 1622, 1268, 1269, + 268, 1393, 1964, 1965, 1960, 763, 1892, 1349, 1352, 1624, + 1627, 1665, 1674, 1717, 787, 869, 311, 945, 946, 966, + 969, 972, 817, 818, 1820, 743, 1314, 1892, 328, 76, + 77, 86, 144, 443, 444, 750, 891, 892, 894, 900, + 927, 928, 1817, 1837, 1838, 1839, 1840, 1841, 1846, 1993, + 2004, 2019, 2020, 2066, 2084, 2085, 2087, 2088, 2090, 143, + 178, 475, 614, 1677, 1690, 1691, 1622, 1613, 63, 1622, + 1622, 1622, 1622, 1622, 1622, 1622, 1622, 1622, 658, 1892, + 977, 1817, 2006, 2020, 47, 48, 80, 84, 101, 110, + 131, 145, 150, 173, 232, 236, 254, 258, 259, 289, + 296, 297, 353, 393, 436, 441, 452, 453, 607, 611, + 617, 628, 634, 665, 669, 698, 1828, 1911, 1915, 1916, + 1917, 1919, 1921, 1922, 1923, 1924, 945, 960, 1630, 471, + 675, 1753, 154, 1762, 1890, 43, 77, 123, 130, 157, + 165, 201, 246, 247, 374, 444, 582, 886, 929, 931, + 932, 933, 934, 936, 939, 942, 943, 944, 954, 955, + 956, 957, 958, 964, 979, 982, 989, 2011, 2012, 2026, + 2027, 2092, 2093, 2095, 2100, 1892, 3, 8, 9, 19, + 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 40, 57, 58, 59, 60, 68, 69, 71, + 78, 79, 82, 83, 84, 85, 87, 90, 91, 99, + 102, 120, 121, 122, 124, 132, 133, 134, 141, 150, + 153, 162, 164, 166, 180, 181, 183, 187, 192, 196, + 198, 199, 200, 201, 219, 220, 221, 223, 230, 241, + 249, 250, 268, 275, 276, 278, 279, 290, 300, 301, + 302, 308, 309, 327, 328, 329, 330, 334, 341, 349, + 366, 379, 381, 382, 383, 398, 410, 411, 466, 478, + 500, 501, 546, 552, 561, 562, 585, 593, 605, 649, + 656, 663, 694, 713, 714, 715, 716, 721, 722, 735, + 737, 749, 751, 759, 768, 769, 774, 779, 783, 784, + 787, 1368, 1374, 1399, 1400, 1401, 1402, 1406, 1417, 1421, + 1422, 1423, 1424, 1425, 1426, 1427, 1431, 1432, 1433, 1441, + 1447, 1448, 1449, 1450, 1451, 1453, 1456, 1785, 1788, 1790, + 1791, 1792, 1809, 1816, 1818, 1819, 1826, 1833, 1844, 1845, + 65, 1009, 510, 250, 362, 370, 385, 395, 396, 397, + 405, 543, 555, 655, 693, 707, 912, 914, 737, 905, + 911, 1826, 859, 1622, 886, 980, 911, 47, 333, 611, + 1908, 1909, 1917, 1919, 47, 106, 264, 266, 277, 293, + 474, 679, 680, 681, 682, 1378, 1385, 1386, 1959, 3, + 71, 99, 144, 321, 366, 463, 468, 506, 556, 577, + 593, 644, 661, 687, 717, 750, 1166, 1815, 1824, 1835, + 1837, 1838, 1839, 1841, 1842, 1843, 1846, 1850, 1860, 1871, + 2002, 47, 49, 79, 80, 89, 145, 159, 214, 226, + 281, 324, 344, 353, 366, 377, 400, 430, 433, 435, + 462, 463, 468, 469, 485, 506, 528, 582, 597, 606, + 609, 610, 624, 661, 669, 690, 747, 1166, 1200, 1702, + 1706, 1707, 1709, 1718, 1817, 1861, 911, 1892, 178, 1673, + 779, 1644, 1653, 945, 2008, 1794, 1630, 1736, 1826, 1950, + 343, 2101, 1828, 1331, 1290, 50, 1951, 1399, 1472, 799, + 299, 801, 1725, 417, 1812, 1814, 1826, 1900, 1828, 141, + 1068, 1820, 128, 1295, 528, 613, 669, 1743, 1744, 287, + 1951, 746, 1759, 670, 817, 232, 314, 1280, 1281, 1282, + 670, 817, 281, 1695, 1622, 1622, 23, 26, 27, 31, + 1786, 1787, 1821, 1983, 1983, 1983, 460, 1982, 1983, 1983, + 780, 780, 786, 1826, 1068, 1068, 145, 1068, 1068, 662, + 843, 145, 145, 281, 658, 214, 226, 289, 436, 1964, + 337, 860, 860, 1960, 111, 135, 779, 784, 1374, 1377, + 1477, 1480, 1492, 1495, 1496, 1497, 1508, 1509, 1510, 1511, + 1513, 1514, 1515, 1812, 211, 423, 1600, 1601, 1606, 312, + 1538, 1375, 123, 127, 168, 173, 206, 577, 1387, 1563, + 1568, 1569, 1578, 1579, 1583, 226, 1582, 1595, 1605, 47, + 106, 1958, 1958, 1958, 1578, 1580, 1368, 1371, 1372, 1579, + 1581, 1370, 47, 1826, 1716, 127, 1715, 787, 1354, 1351, + 2023, 1826, 1826, 42, 763, 1647, 1648, 1226, 734, 1228, + 787, 542, 709, 727, 85, 1828, 1829, 1830, 1915, 1229, + 120, 1234, 1233, 859, 281, 143, 581, 1270, 1271, 1272, + 657, 436, 743, 1964, 1828, 1301, 1826, 779, 872, 945, + 967, 1399, 114, 974, 972, 287, 1315, 1616, 1617, 1812, + 2020, 45, 46, 47, 48, 49, 50, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 87, 89, 90, 91, 92, 93, 94, 95, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 117, + 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, + 129, 130, 131, 132, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 145, 146, 147, 149, 150, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 208, 209, 210, 211, 213, 214, 215, 216, + 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, + 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, + 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, + 278, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 296, 297, 298, 299, + 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, + 310, 311, 312, 313, 314, 315, 316, 317, 328, 329, + 330, 354, 356, 357, 373, 409, 410, 431, 455, 496, + 558, 559, 574, 575, 577, 616, 649, 710, 713, 716, + 739, 750, 759, 887, 927, 1128, 1130, 1131, 1132, 1134, + 1135, 1136, 1137, 1138, 1139, 1140, 1141, 1142, 1143, 1817, + 1836, 1837, 1838, 1839, 1840, 1841, 1846, 1847, 2001, 2002, + 786, 470, 782, 74, 321, 2103, 2086, 2090, 894, 786, + 128, 1678, 128, 1678, 1679, 1680, 1687, 1688, 1826, 1690, + 1826, 141, 1621, 1622, 862, 862, 862, 862, 1826, 859, + 1828, 859, 1614, 1622, 1622, 993, 151, 978, 606, 1920, + 647, 647, 705, 708, 735, 743, 779, 1398, 475, 584, + 704, 580, 735, 89, 743, 333, 551, 633, 333, 333, + 203, 333, 371, 528, 669, 551, 287, 203, 782, 779, + 283, 427, 178, 414, 474, 1632, 1634, 393, 613, 1754, + 1755, 360, 178, 392, 1768, 1812, 1893, 1894, 144, 321, + 391, 463, 1817, 1827, 1840, 1841, 1842, 1846, 2003, 311, + 1827, 128, 136, 561, 1826, 1827, 1827, 1827, 1826, 311, + 1827, 1826, 427, 2092, 1994, 1995, 2021, 945, 959, 1826, + 127, 177, 241, 313, 98, 352, 2027, 2093, 786, 1323, + 1457, 19, 20, 30, 1816, 1833, 31, 1787, 153, 768, + 769, 1424, 779, 779, 779, 311, 1399, 1475, 1476, 779, + 779, 779, 779, 779, 1398, 1398, 1398, 779, 1397, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 779, 1399, 779, 779, 779, 8, 779, 1473, 1474, + 1809, 1816, 779, 779, 779, 779, 1399, 1397, 779, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 15, 779, + 779, 779, 779, 1398, 1397, 1397, 779, 779, 1398, 779, + 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, + 779, 31, 779, 779, 779, 779, 779, 779, 779, 779, + 737, 779, 779, 779, 737, 779, 779, 779, 779, 31, + 779, 779, 779, 31, 779, 779, 779, 779, 779, 779, + 779, 779, 153, 1424, 153, 1424, 1424, 1124, 1368, 1399, + 1793, 1826, 1816, 33, 41, 50, 208, 315, 1403, 1404, + 35, 36, 37, 39, 156, 763, 764, 765, 1407, 55, + 151, 167, 238, 677, 1405, 14, 43, 44, 107, 192, + 766, 767, 768, 769, 770, 771, 772, 773, 1424, 73, + 38, 213, 213, 751, 1821, 787, 779, 15, 1010, 54, + 287, 782, 763, 1821, 1327, 1829, 1831, 1326, 733, 1920, + 584, 203, 128, 203, 1360, 1386, 3, 1828, 258, 644, + 787, 57, 99, 1167, 1168, 1647, 1828, 127, 1647, 1647, + 1916, 99, 1816, 1854, 1863, 1851, 57, 99, 1170, 1171, + 1828, 787, 1647, 1852, 782, 670, 1721, 779, 88, 214, + 226, 281, 289, 324, 436, 463, 658, 735, 743, 167, + 312, 1713, 63, 688, 376, 688, 688, 318, 688, 435, + 688, 1713, 47, 1081, 1828, 1567, 1568, 1573, 128, 151, + 1708, 1710, 376, 688, 127, 688, 704, 676, 47, 355, + 399, 401, 491, 541, 588, 678, 700, 1696, 1697, 1698, + 817, 477, 817, 1573, 1713, 1710, 510, 429, 378, 608, + 704, 720, 1721, 1392, 688, 740, 143, 1267, 1654, 782, + 177, 1796, 1797, 1804, 1826, 1633, 1634, 1812, 2038, 2104, + 782, 1332, 1333, 1334, 1335, 1812, 1616, 363, 568, 239, + 568, 1952, 782, 1399, 802, 57, 270, 416, 430, 432, + 464, 477, 510, 528, 606, 613, 623, 637, 669, 672, + 688, 719, 1726, 1731, 1732, 1817, 1892, 3, 74, 918, + 919, 920, 921, 1816, 582, 232, 374, 1405, 1826, 797, + 743, 1292, 1892, 1746, 360, 1745, 782, 653, 1826, 1952, + 127, 1283, 1284, 1283, 580, 755, 394, 782, 1283, 1283, + 1617, 1826, 1820, 782, 579, 1986, 699, 1987, 763, 158, + 639, 1985, 7, 791, 1826, 825, 1068, 859, 859, 1068, + 829, 831, 1068, 1068, 63, 1068, 1068, 836, 837, 743, + 463, 463, 1964, 779, 1477, 1497, 1509, 1510, 1511, 1512, + 1513, 1826, 10, 1383, 81, 147, 158, 166, 193, 249, + 277, 1504, 1505, 782, 217, 1506, 1507, 31, 1822, 1822, + 3, 1602, 1603, 1604, 1826, 1828, 1539, 136, 1542, 1538, + 454, 561, 1570, 296, 8, 28, 30, 32, 251, 1574, + 1575, 1788, 1816, 151, 65, 1575, 1567, 1387, 1826, 1387, + 1388, 1388, 1371, 1717, 393, 1722, 1786, 1826, 1826, 1579, + 1582, 47, 57, 99, 203, 1399, 1888, 42, 42, 1820, + 99, 386, 1065, 1066, 1078, 1079, 1174, 408, 863, 1826, + 1398, 3, 863, 1812, 583, 1829, 1830, 1831, 1930, 1934, + 1622, 1272, 413, 489, 862, 1812, 743, 1302, 1303, 1617, + 787, 870, 873, 874, 1399, 973, 311, 968, 970, 2000, + 2016, 2017, 427, 807, 1616, 127, 364, 448, 450, 540, + 614, 782, 1318, 1319, 1320, 2091, 779, 1149, 1150, 1152, + 1152, 391, 1150, 1158, 1160, 779, 1145, 1146, 1150, 224, + 1145, 1158, 57, 71, 73, 306, 341, 359, 730, 1133, + 1138, 1140, 1160, 1166, 1175, 1177, 1133, 1158, 1133, 1145, + 779, 1158, 1133, 1152, 1152, 1133, 1152, 779, 1145, 1158, + 71, 307, 307, 310, 1145, 1152, 779, 890, 1152, 1152, + 1152, 1152, 1152, 15, 787, 893, 1145, 310, 1152, 1152, + 1152, 1152, 1152, 779, 1146, 1154, 127, 1826, 127, 352, + 1993, 2088, 2089, 786, 786, 1812, 54, 1676, 1619, 1620, + 1813, 1826, 127, 1381, 1382, 1538, 782, 1681, 787, 1689, + 120, 1826, 862, 787, 1914, 1917, 1831, 1929, 1616, 1615, + 1612, 177, 2010, 643, 976, 704, 780, 333, 1831, 333, + 333, 1930, 214, 226, 281, 463, 861, 1918, 353, 393, + 436, 441, 452, 453, 607, 617, 628, 634, 665, 669, + 698, 1922, 1924, 1802, 1803, 1816, 961, 141, 1267, 479, + 735, 1399, 1756, 1756, 1338, 506, 1767, 53, 763, 1534, + 1535, 1536, 572, 746, 782, 1891, 44, 945, 311, 1826, + 561, 128, 154, 945, 311, 779, 953, 177, 786, 787, + 1996, 935, 782, 985, 983, 988, 984, 2097, 2096, 1616, + 3, 1458, 1828, 787, 779, 47, 1466, 1537, 1466, 1466, + 1399, 1476, 114, 311, 427, 1399, 1472, 1399, 106, 1466, + 1537, 780, 24, 25, 26, 28, 30, 32, 780, 1587, + 1591, 1592, 1399, 1399, 1809, 780, 1363, 1364, 1373, 1793, + 92, 93, 94, 95, 138, 139, 140, 189, 190, 253, + 316, 411, 478, 544, 546, 552, 612, 656, 748, 759, + 1531, 1532, 1399, 106, 1459, 1459, 1446, 1399, 1399, 1399, + 1531, 1399, 1399, 1399, 1816, 1474, 336, 782, 787, 106, + 1466, 1399, 106, 1466, 1399, 1399, 1399, 1399, 1399, 780, + 1402, 780, 1399, 1399, 780, 648, 1466, 1466, 106, 1466, + 780, 1587, 1466, 1466, 1399, 1399, 1428, 1429, 1430, 64, + 163, 288, 1399, 1418, 1419, 1420, 1399, 1399, 106, 1466, + 1399, 1399, 1399, 1414, 1415, 1399, 1399, 1471, 1472, 1399, + 1399, 409, 410, 713, 716, 1533, 1399, 1399, 1472, 1812, + 1399, 1399, 127, 1812, 1471, 1399, 127, 1399, 1399, 1812, + 1399, 1399, 1532, 1532, 1399, 1418, 1399, 780, 8, 787, + 1810, 1826, 1399, 1471, 1399, 1399, 1399, 780, 782, 1364, + 1399, 787, 1399, 1399, 1399, 1401, 122, 201, 290, 732, + 1405, 47, 340, 1401, 1408, 1401, 779, 1374, 1401, 1401, + 167, 55, 151, 167, 238, 1402, 1402, 1402, 1402, 1402, + 1402, 1402, 153, 1402, 153, 1402, 1402, 1402, 1402, 1402, + 1172, 1828, 1424, 779, 1455, 1548, 1826, 779, 136, 328, + 329, 330, 1816, 1434, 461, 493, 567, 648, 1416, 169, + 229, 505, 703, 1011, 1015, 1750, 1820, 914, 410, 713, + 716, 913, 1456, 1790, 1809, 782, 287, 1328, 1329, 1812, + 945, 782, 127, 1831, 1830, 1931, 861, 1918, 770, 1390, + 1391, 1393, 468, 506, 661, 1862, 1647, 1917, 1826, 73, + 1399, 1881, 1880, 1879, 787, 787, 1647, 782, 1853, 232, + 492, 1882, 1883, 1884, 1885, 1826, 1872, 99, 717, 1816, + 1855, 1867, 1857, 1858, 1860, 1871, 688, 127, 770, 1068, + 63, 862, 862, 1812, 862, 318, 862, 862, 862, 1812, + 1831, 1812, 1392, 1392, 376, 688, 1713, 862, 1713, 1708, + 376, 688, 1713, 151, 1711, 510, 553, 688, 1705, 1705, + 1713, 1826, 862, 1713, 1830, 1708, 1713, 1820, 490, 701, + 451, 127, 1699, 782, 435, 688, 1812, 1710, 1708, 1708, + 127, 1713, 1713, 1713, 1480, 1664, 1812, 1393, 1656, 1658, + 779, 1651, 2009, 782, 779, 1800, 154, 1635, 885, 427, + 3, 151, 782, 217, 1343, 1345, 1346, 448, 614, 1291, + 363, 239, 1399, 800, 99, 143, 803, 1399, 1659, 1660, + 510, 510, 510, 510, 360, 510, 817, 510, 782, 1392, + 1727, 1828, 913, 923, 782, 763, 1535, 1901, 120, 676, + 1399, 1293, 1616, 287, 1748, 817, 1744, 1826, 47, 1278, + 627, 683, 1285, 1286, 127, 819, 820, 673, 1282, 819, + 1891, 1786, 596, 1988, 1828, 833, 1826, 827, 1914, 1930, + 1828, 1068, 1068, 822, 1812, 1068, 862, 2077, 1393, 1973, + 847, 1393, 1068, 1068, 1068, 743, 1493, 782, 780, 780, + 780, 780, 780, 782, 780, 1477, 47, 53, 55, 128, + 1384, 1536, 158, 158, 210, 1516, 166, 249, 1504, 1516, + 1477, 1495, 779, 1383, 1607, 1828, 782, 787, 1399, 65, + 137, 1540, 1542, 251, 649, 1571, 1575, 572, 668, 746, + 1389, 1816, 439, 251, 577, 782, 787, 664, 1564, 649, + 1571, 1596, 1399, 2024, 2025, 1227, 1648, 1066, 73, 1166, + 418, 191, 231, 268, 386, 398, 498, 568, 865, 867, + 1631, 1828, 1631, 1235, 779, 480, 242, 782, 1938, 1812, + 1232, 1231, 1812, 782, 595, 1304, 1826, 872, 780, 782, + 283, 945, 970, 886, 68, 108, 142, 179, 481, 511, + 512, 514, 515, 516, 517, 518, 520, 521, 522, 523, + 524, 525, 526, 527, 529, 530, 531, 532, 625, 626, + 808, 809, 816, 127, 1321, 734, 1617, 1319, 779, 896, + 24, 28, 30, 32, 1158, 1157, 1647, 1158, 30, 295, + 317, 666, 1147, 1148, 1148, 1175, 99, 1172, 1158, 1133, + 1176, 1177, 1167, 57, 73, 391, 1161, 1148, 1222, 1786, + 1158, 1222, 1148, 310, 1148, 1158, 888, 889, 2007, 2020, + 42, 99, 1993, 2014, 1133, 1133, 1148, 252, 723, 1826, + 2014, 237, 1144, 1176, 57, 1178, 1133, 1158, 1148, 30, + 1148, 895, 26, 769, 903, 904, 1584, 1586, 2104, 1506, + 703, 782, 1683, 787, 1689, 222, 1562, 1563, 1688, 128, + 770, 1826, 203, 1826, 782, 782, 67, 244, 1273, 1616, + 1616, 886, 779, 947, 950, 287, 314, 1913, 63, 770, + 1812, 1826, 1928, 1928, 780, 782, 1999, 2016, 1635, 1399, + 1831, 1339, 1340, 1341, 1342, 1812, 146, 144, 321, 463, + 1817, 1823, 1832, 1837, 1838, 1839, 1840, 1841, 1842, 1843, + 1846, 2002, 178, 232, 755, 1895, 1586, 1894, 940, 945, + 154, 649, 1826, 937, 945, 947, 948, 952, 1826, 872, + 1826, 977, 979, 980, 2008, 2084, 2104, 1891, 1862, 42, + 1816, 1399, 780, 1467, 780, 780, 283, 427, 1399, 1399, + 53, 299, 780, 299, 782, 1442, 780, 770, 780, 782, + 782, 780, 780, 1364, 128, 780, 1444, 1445, 1399, 782, + 782, 782, 769, 780, 782, 780, 782, 782, 780, 779, + 1809, 1816, 1466, 780, 780, 1466, 780, 782, 782, 780, + 780, 780, 151, 782, 782, 780, 780, 1466, 780, 780, + 780, 780, 782, 128, 782, 780, 128, 1399, 128, 1399, + 128, 1399, 128, 780, 782, 780, 1466, 780, 780, 782, + 782, 780, 782, 782, 782, 780, 780, 780, 782, 780, + 780, 782, 780, 780, 780, 1812, 780, 780, 780, 1812, + 782, 780, 782, 782, 780, 782, 782, 782, 780, 780, + 782, 1816, 1826, 780, 787, 53, 504, 782, 1189, 780, + 780, 1531, 1531, 1472, 780, 785, 1816, 122, 201, 290, + 732, 779, 50, 1399, 434, 1401, 1401, 779, 1374, 1401, + 1401, 1399, 1399, 1549, 217, 1551, 779, 779, 779, 779, + 779, 787, 1393, 1438, 1439, 1440, 378, 779, 1020, 1021, + 1013, 1020, 1014, 591, 1023, 160, 472, 1399, 763, 1831, + 1831, 782, 1891, 427, 131, 1917, 128, 782, 1928, 1928, + 782, 1399, 1807, 1816, 787, 787, 787, 99, 144, 321, + 463, 577, 750, 1817, 1820, 1825, 1834, 1837, 1838, 1839, + 1840, 1842, 1843, 1846, 2002, 1875, 127, 1647, 99, 1172, + 1173, 1831, 31, 578, 593, 1887, 1888, 1826, 1826, 1864, + 1863, 127, 580, 755, 504, 782, 782, 1647, 1888, 787, + 1856, 787, 1647, 782, 782, 1859, 1399, 780, 1826, 862, + 862, 1820, 1399, 862, 1713, 1713, 862, 1713, 1820, 128, + 1712, 859, 1713, 613, 1573, 1698, 1711, 819, 1708, 1812, + 1713, 1713, 1399, 258, 1506, 1660, 780, 782, 1652, 886, + 1797, 1801, 1803, 53, 1636, 1637, 2092, 2105, 1828, 99, + 1336, 1826, 1334, 1812, 1006, 1345, 145, 160, 1198, 1347, + 801, 782, 100, 1737, 817, 1732, 1616, 1733, 921, 924, + 925, 920, 573, 574, 650, 922, 454, 561, 1826, 1902, + 1903, 1820, 1616, 448, 614, 736, 1296, 1297, 1298, 1586, + 47, 1747, 670, 782, 365, 1277, 1694, 782, 127, 1989, + 1064, 1065, 299, 723, 1210, 1826, 314, 1912, 1938, 844, + 1826, 1826, 1812, 824, 862, 2046, 2047, 862, 2072, 1068, + 1068, 1812, 862, 1826, 862, 1068, 1399, 1477, 1477, 785, + 576, 713, 717, 1379, 1380, 1426, 1380, 158, 1516, 1516, + 1508, 158, 203, 299, 1530, 1826, 1535, 1166, 1169, 1603, + 1826, 1399, 1543, 1808, 1541, 750, 1545, 1540, 314, 580, + 1572, 1571, 507, 1586, 1575, 1576, 439, 1575, 1575, 1816, + 549, 1565, 1808, 123, 779, 1888, 1888, 1064, 1820, 1648, + 1648, 557, 268, 268, 657, 1820, 268, 268, 268, 182, + 360, 406, 484, 547, 563, 564, 568, 569, 570, 636, + 686, 840, 841, 88, 476, 586, 593, 599, 674, 735, + 845, 846, 65, 314, 742, 1932, 270, 369, 494, 566, + 695, 756, 1926, 1927, 1934, 314, 1941, 1891, 203, 855, + 1240, 779, 1966, 1230, 1303, 127, 871, 1399, 2000, 971, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 782, 819, 734, 877, 878, + 1826, 2067, 2068, 2069, 156, 780, 780, 780, 780, 1826, + 782, 317, 295, 99, 1172, 1157, 780, 782, 780, 780, + 782, 144, 1128, 1817, 1837, 1838, 1839, 1840, 1841, 1846, + 1399, 1399, 2014, 2014, 787, 763, 1178, 209, 265, 269, + 901, 902, 903, 906, 1405, 1826, 24, 25, 28, 30, + 32, 427, 1380, 1620, 1826, 299, 1826, 576, 168, 1577, + 1480, 787, 1689, 1812, 1917, 1831, 1891, 427, 897, 898, + 951, 34, 1930, 333, 787, 787, 287, 287, 1802, 962, + 1636, 782, 1343, 1345, 1822, 755, 506, 392, 941, 154, + 938, 949, 780, 782, 787, 1997, 986, 975, 981, 1827, + 981, 981, 2098, 427, 1825, 1399, 782, 1399, 1399, 283, + 57, 71, 96, 109, 125, 153, 155, 295, 307, 409, + 410, 559, 666, 716, 739, 1130, 1468, 1469, 1470, 1167, + 1167, 1468, 1472, 780, 153, 153, 1399, 1472, 1472, 782, + 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1402, 787, 780, + 780, 1399, 1399, 1399, 1399, 1399, 780, 1399, 1399, 1399, + 1399, 128, 1399, 128, 1399, 128, 1399, 153, 1399, 780, + 1415, 1399, 1414, 1472, 1399, 1399, 1399, 1472, 28, 768, + 1584, 1588, 153, 1399, 1399, 1399, 1399, 1399, 787, 787, + 1826, 57, 71, 1184, 1185, 1186, 1187, 1188, 1587, 1586, + 780, 769, 769, 1373, 1401, 780, 782, 1401, 50, 1399, + 434, 1531, 1531, 1550, 1826, 65, 780, 1452, 1471, 1399, + 1430, 1471, 1399, 1420, 1471, 1471, 1816, 1399, 780, 782, + 779, 1029, 1402, 1021, 168, 1059, 1060, 1587, 697, 1024, + 338, 1016, 1012, 913, 287, 1329, 287, 241, 584, 1929, + 1830, 128, 128, 1391, 1394, 1394, 787, 787, 787, 1647, + 1399, 1831, 1874, 1647, 779, 779, 1647, 1647, 1888, 792, + 232, 632, 659, 1886, 1884, 1883, 1873, 1826, 1882, 1826, + 1868, 1857, 1858, 1867, 433, 747, 1584, 1589, 1703, 30, + 1712, 1538, 1708, 1669, 1670, 1810, 1381, 1394, 1393, 1655, + 1657, 1660, 427, 780, 779, 1629, 1618, 1812, 786, 321, + 1993, 2028, 1344, 779, 1660, 763, 819, 127, 314, 1728, + 1729, 763, 782, 36, 37, 454, 499, 561, 604, 763, + 764, 765, 1904, 1906, 1538, 127, 128, 1299, 1297, 819, + 1286, 1820, 733, 1287, 110, 642, 1993, 2005, 1586, 545, + 358, 472, 652, 1216, 1216, 203, 1210, 333, 1941, 126, + 203, 203, 823, 839, 840, 2046, 2080, 386, 867, 1993, + 2043, 2044, 2045, 2073, 1974, 862, 834, 2079, 641, 2078, + 1812, 782, 1380, 31, 1402, 50, 287, 1477, 1508, 158, + 158, 1477, 1508, 1498, 1499, 780, 782, 1525, 1526, 1168, + 1608, 16, 17, 782, 1544, 51, 104, 1566, 1399, 1455, + 1546, 1547, 1545, 712, 1572, 1576, 1389, 782, 1566, 1570, + 1393, 1597, 1598, 1599, 1173, 1168, 408, 408, 413, 489, + 1648, 1648, 65, 1648, 1650, 1648, 182, 547, 314, 1648, + 1649, 1649, 841, 1236, 1820, 1820, 1820, 1820, 1586, 1820, + 1820, 780, 782, 31, 593, 1828, 1935, 1936, 31, 31, + 31, 50, 1925, 533, 534, 537, 538, 539, 1939, 1940, + 331, 593, 1239, 1225, 390, 654, 240, 1241, 1826, 1967, + 53, 1966, 47, 378, 1305, 872, 283, 779, 779, 1586, + 779, 1586, 1586, 1820, 1820, 1589, 1820, 1586, 1820, 1820, + 1820, 1820, 1820, 1820, 1820, 1586, 1820, 404, 568, 671, + 1791, 122, 290, 1586, 1594, 1820, 1586, 809, 780, 782, + 148, 151, 212, 881, 1993, 2015, 649, 927, 1128, 898, + 30, 1176, 1786, 1176, 888, 1826, 30, 782, 2092, 461, + 787, 1480, 1689, 1392, 251, 1575, 245, 1685, 1538, 1891, + 1273, 177, 899, 780, 1399, 950, 314, 1943, 584, 770, + 770, 1930, 1930, 113, 114, 115, 963, 1626, 1341, 1812, + 1345, 143, 1348, 1763, 1399, 948, 1826, 872, 2010, 352, + 975, 787, 1399, 1399, 1152, 1152, 1145, 1154, 95, 155, + 1150, 1149, 1151, 1153, 1152, 155, 1153, 1150, 780, 780, + 780, 780, 1443, 1399, 1399, 780, 206, 1461, 1461, 1399, + 782, 782, 780, 782, 780, 780, 780, 151, 1435, 1436, + 1816, 780, 780, 780, 780, 780, 782, 127, 782, 1399, + 1399, 1399, 1399, 780, 780, 53, 1409, 780, 53, 780, + 780, 780, 28, 30, 30, 780, 782, 1399, 780, 780, + 782, 782, 780, 1816, 1826, 787, 779, 1179, 1179, 51, + 104, 643, 768, 1181, 1182, 1183, 782, 782, 1399, 1399, + 780, 1472, 1401, 780, 782, 1401, 1551, 1543, 206, 1454, + 780, 780, 780, 780, 780, 780, 779, 1394, 1440, 1017, + 1018, 1019, 1826, 780, 1589, 153, 65, 779, 1031, 763, + 779, 1021, 1831, 1812, 128, 1931, 1931, 53, 1395, 1820, + 1826, 770, 1816, 1826, 1826, 1876, 1888, 1887, 31, 31, + 1866, 1865, 387, 726, 232, 1888, 1647, 1647, 1888, 24, + 25, 28, 30, 32, 1573, 1704, 1713, 782, 1667, 1647, + 1535, 1660, 780, 782, 177, 1363, 11, 12, 258, 1001, + 1363, 1638, 1640, 1643, 1506, 311, 2029, 2030, 779, 225, + 1527, 1528, 1529, 1826, 779, 1730, 232, 250, 362, 370, + 385, 395, 396, 397, 405, 543, 555, 640, 655, 693, + 707, 926, 925, 1905, 1573, 734, 554, 513, 816, 1288, + 690, 690, 1812, 203, 1830, 1239, 408, 1812, 1812, 11, + 13, 18, 145, 167, 215, 272, 273, 274, 292, 346, + 348, 368, 386, 393, 408, 415, 430, 487, 497, 535, + 548, 587, 593, 651, 658, 690, 705, 706, 718, 997, + 999, 1070, 1072, 1073, 1075, 1077, 1078, 1079, 1086, 1817, + 1070, 2081, 53, 156, 2037, 1820, 2043, 779, 882, 1993, + 2032, 2034, 862, 848, 1966, 779, 884, 2032, 2033, 96, + 155, 234, 692, 1084, 2033, 835, 1494, 1380, 1380, 203, + 1501, 1508, 1508, 203, 1503, 1399, 779, 1006, 1826, 1523, + 1524, 378, 1770, 1808, 53, 782, 1808, 1571, 1575, 1399, + 780, 782, 1588, 1588, 1588, 1588, 1588, 1588, 1631, 846, + 31, 53, 299, 1933, 1937, 208, 1926, 1586, 1586, 1586, + 1791, 768, 1584, 1585, 1939, 173, 294, 1237, 446, 46, + 48, 49, 70, 72, 78, 110, 173, 204, 206, 217, + 240, 338, 375, 419, 420, 426, 438, 459, 483, 550, + 618, 629, 630, 631, 722, 1004, 1071, 1073, 1244, 1249, + 1251, 1254, 1260, 1261, 1262, 1264, 1265, 1559, 1405, 1949, + 342, 437, 849, 287, 419, 426, 851, 780, 782, 1968, + 1969, 53, 47, 779, 1306, 2000, 812, 813, 1586, 814, + 815, 1586, 810, 811, 1586, 2068, 212, 890, 15, 787, + 780, 902, 1826, 1538, 1826, 439, 251, 1686, 1682, 1349, + 1793, 131, 1938, 1938, 960, 1999, 960, 1638, 1348, 502, + 143, 328, 1769, 1998, 987, 2104, 1826, 1176, 1151, 1176, + 1176, 780, 1531, 1531, 65, 256, 1460, 168, 1463, 1464, + 780, 1399, 1399, 1472, 193, 357, 780, 314, 1437, 1399, + 1399, 1399, 1531, 96, 109, 125, 155, 234, 295, 409, + 410, 558, 559, 716, 1138, 1139, 1410, 1411, 1412, 1413, + 1468, 1594, 1531, 1399, 1399, 1826, 1587, 780, 1189, 1184, + 1182, 1184, 1185, 1586, 780, 1472, 206, 1552, 65, 780, + 1471, 1395, 780, 782, 347, 1062, 1399, 1015, 217, 1032, + 1033, 1034, 1587, 1017, 1931, 1820, 1826, 787, 1647, 1647, + 1888, 780, 780, 1888, 1888, 1870, 1869, 1573, 1670, 1538, + 99, 1659, 1525, 1394, 1660, 780, 1641, 1642, 1805, 1806, + 1810, 1826, 1793, 1639, 1685, 1643, 2031, 2030, 47, 1250, + 1258, 1259, 1826, 780, 782, 1589, 1738, 1739, 447, 173, + 779, 763, 782, 826, 1812, 754, 830, 832, 75, 594, + 787, 1087, 1088, 1089, 1090, 1098, 1099, 1104, 1105, 1106, + 1198, 1201, 1202, 1811, 1826, 167, 741, 418, 1812, 1648, + 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 418, + 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, 1648, + 421, 541, 1826, 1648, 1648, 1002, 1003, 1004, 782, 1072, + 998, 1647, 2037, 226, 463, 1993, 2063, 2064, 2065, 883, + 864, 54, 335, 995, 203, 53, 875, 876, 247, 676, + 247, 1966, 22, 29, 31, 1478, 1500, 299, 1502, 299, + 1530, 143, 298, 459, 1518, 1519, 1522, 117, 118, 205, + 282, 1771, 1772, 170, 1773, 1566, 1548, 1547, 1566, 1572, + 1571, 1394, 1599, 593, 1820, 1935, 30, 30, 593, 99, + 153, 560, 1238, 75, 217, 384, 594, 702, 1090, 1098, + 1099, 1266, 1198, 1266, 217, 1266, 217, 217, 281, 287, + 75, 126, 217, 594, 702, 1103, 1198, 1266, 1648, 217, + 65, 1006, 53, 287, 384, 763, 1198, 1275, 1648, 217, + 159, 705, 159, 217, 705, 1266, 217, 592, 217, 217, + 217, 1071, 782, 1003, 1249, 779, 1089, 603, 1399, 1399, + 203, 855, 862, 203, 386, 856, 1826, 1631, 1363, 1968, + 1307, 485, 780, 782, 780, 782, 780, 782, 252, 1826, + 1684, 128, 439, 1390, 1631, 584, 314, 1942, 1942, 203, + 1661, 154, 872, 981, 427, 780, 780, 1462, 1808, 1786, + 1463, 1465, 1574, 780, 780, 782, 780, 498, 549, 613, + 780, 780, 1145, 155, 1153, 71, 1153, 1176, 780, 780, + 782, 780, 780, 780, 1180, 780, 782, 780, 65, 229, + 251, 1553, 1554, 1808, 780, 1019, 1531, 160, 472, 780, + 782, 1035, 780, 770, 1878, 1877, 1888, 1888, 819, 1562, + 406, 1798, 780, 782, 787, 1364, 1645, 1646, 1810, 1631, + 901, 780, 782, 1528, 780, 782, 50, 1740, 1657, 1820, + 816, 779, 828, 1828, 779, 779, 1221, 1811, 10, 127, + 1100, 1826, 780, 782, 72, 126, 225, 293, 1102, 1197, + 1104, 1068, 1198, 1199, 1199, 1107, 787, 1812, 1648, 99, + 1586, 1593, 99, 1586, 99, 1586, 99, 1586, 1074, 1589, + 1586, 1586, 1820, 1820, 1648, 1586, 1828, 454, 499, 568, + 1083, 1586, 1589, 1589, 99, 1586, 1820, 99, 389, 391, + 425, 455, 588, 622, 1082, 1593, 1586, 1593, 1000, 1769, + 1072, 1070, 26, 28, 30, 32, 99, 1590, 1591, 1820, + 1826, 226, 463, 892, 1817, 1837, 1840, 1841, 1846, 2049, + 2050, 2051, 2057, 2062, 2065, 2018, 2055, 2018, 2053, 427, + 2065, 879, 880, 2068, 865, 866, 1949, 2074, 101, 150, + 296, 996, 654, 1968, 780, 877, 1979, 1980, 1820, 1979, + 53, 31, 378, 1481, 1399, 779, 1399, 779, 780, 1198, + 1198, 1519, 65, 65, 117, 65, 1772, 271, 282, 1774, + 1775, 1572, 779, 446, 30, 331, 141, 1068, 141, 1067, + 741, 1067, 1621, 1621, 1324, 1621, 1250, 1259, 1812, 1166, + 1621, 160, 1622, 10, 1621, 741, 225, 1621, 1621, 99, + 1826, 1324, 1560, 1561, 1810, 1005, 1621, 1621, 1812, 99, + 1826, 1324, 1259, 1621, 1324, 1324, 1324, 1250, 46, 78, + 110, 1262, 1085, 1087, 335, 454, 1274, 1531, 669, 1820, + 422, 1242, 314, 1970, 1631, 1310, 1826, 47, 779, 1308, + 813, 815, 811, 15, 787, 1631, 1402, 131, 1939, 1944, + 1945, 424, 1685, 281, 975, 782, 1566, 780, 1399, 549, + 445, 1589, 780, 1586, 1565, 780, 55, 403, 410, 713, + 716, 725, 1555, 1556, 1790, 1566, 685, 1061, 1016, 779, + 1022, 1034, 1036, 1826, 1888, 1888, 1577, 1799, 1805, 770, + 1826, 780, 782, 1647, 283, 1259, 1739, 419, 780, 1218, + 1220, 1826, 779, 583, 1218, 1218, 779, 1826, 1088, 779, + 160, 160, 1199, 1068, 236, 1191, 1221, 1826, 1068, 1068, + 660, 927, 1108, 1129, 1131, 1826, 780, 1820, 779, 1820, + 53, 1063, 1002, 2055, 2053, 786, 2082, 2051, 2062, 2057, + 2052, 786, 2052, 786, 2013, 780, 782, 105, 2037, 203, + 849, 864, 2070, 1128, 2070, 1968, 779, 780, 1530, 1530, + 127, 1517, 1517, 1786, 1786, 65, 1786, 65, 65, 1775, + 31, 1238, 411, 1237, 1405, 1324, 1405, 1100, 1826, 1811, + 1250, 1811, 1246, 287, 1248, 1168, 1811, 1621, 1258, 127, + 160, 1811, 1811, 1250, 782, 1566, 1009, 1826, 1811, 1587, + 314, 1106, 1250, 1255, 1250, 780, 1826, 850, 857, 858, + 72, 361, 506, 780, 782, 1309, 252, 723, 1826, 287, + 584, 1945, 1662, 1631, 1812, 1808, 780, 780, 780, 725, + 1556, 1557, 1790, 649, 601, 440, 1558, 601, 1790, 1062, + 779, 1029, 1025, 99, 303, 304, 403, 475, 1037, 1668, + 1803, 787, 1646, 1660, 2016, 367, 780, 782, 1566, 779, + 1218, 779, 780, 780, 1826, 779, 1399, 1068, 1221, 1826, + 1812, 299, 1209, 723, 1221, 1221, 1110, 787, 1101, 1102, + 1109, 787, 1733, 1001, 1000, 2037, 2060, 2037, 2058, 352, + 427, 2048, 1826, 1826, 862, 1993, 2035, 2068, 2039, 2040, + 1393, 854, 855, 2071, 2035, 2035, 195, 1482, 1483, 1826, + 1535, 780, 780, 136, 158, 206, 1521, 1520, 1786, 1786, + 1786, 780, 120, 1252, 120, 144, 196, 1217, 110, 258, + 1106, 1318, 281, 287, 73, 1811, 1826, 1273, 1245, 1561, + 287, 287, 281, 1274, 1256, 1258, 1247, 685, 852, 2092, + 584, 72, 72, 1826, 225, 1311, 1312, 1826, 15, 1402, + 160, 1506, 1566, 458, 50, 458, 136, 403, 568, 712, + 1027, 1028, 1826, 780, 696, 1030, 1039, 711, 145, 386, + 393, 408, 535, 548, 565, 705, 1053, 1054, 1055, 1058, + 1075, 1707, 1631, 244, 770, 1891, 1220, 30, 782, 1219, + 845, 1891, 1891, 782, 1826, 780, 1221, 1209, 723, 779, + 1192, 1216, 1091, 1216, 1093, 1094, 18, 225, 293, 386, + 495, 752, 1075, 1111, 1112, 1121, 1163, 1164, 1165, 1190, + 1405, 1131, 73, 99, 201, 203, 346, 465, 660, 1115, + 1117, 1155, 1156, 1164, 1826, 780, 1076, 1077, 2018, 786, + 2018, 786, 2104, 2083, 2056, 2054, 2035, 2084, 1975, 851, + 2037, 218, 780, 782, 1484, 65, 65, 779, 779, 1811, + 591, 779, 1253, 144, 99, 99, 1274, 1812, 217, 1173, + 1324, 1826, 1811, 1812, 1257, 1296, 1399, 428, 853, 6, + 842, 584, 584, 780, 782, 723, 296, 1764, 1557, 649, + 209, 323, 780, 782, 1587, 779, 1041, 1043, 1038, 418, + 1648, 1648, 418, 1648, 1648, 1648, 1648, 779, 1048, 1055, + 430, 299, 386, 497, 723, 744, 1075, 1203, 1206, 1211, + 1212, 1213, 1217, 1566, 780, 1826, 780, 780, 314, 1204, + 1208, 1212, 1215, 1205, 1207, 1212, 1214, 1826, 782, 1097, + 1095, 1216, 1193, 1826, 180, 1194, 779, 1092, 779, 779, + 160, 1820, 702, 1164, 741, 160, 201, 1172, 19, 20, + 768, 769, 779, 1125, 1126, 1127, 1374, 1421, 1789, 296, + 339, 99, 53, 391, 1156, 1162, 2061, 2059, 427, 2013, + 2034, 2033, 2041, 1812, 856, 2039, 1478, 1483, 127, 1132, + 1134, 1135, 1136, 1486, 1487, 1527, 1529, 1102, 1587, 1032, + 1127, 1006, 1034, 1006, 154, 1399, 1312, 1663, 1169, 1026, + 1028, 779, 1042, 1043, 1044, 182, 1040, 1043, 1648, 1820, + 1820, 1648, 1590, 1590, 1587, 1828, 697, 1049, 1050, 1648, + 1216, 1820, 1648, 1216, 1263, 1264, 1265, 1213, 752, 1891, + 589, 1263, 1215, 1263, 1214, 780, 1826, 779, 779, 1096, + 780, 782, 462, 590, 667, 203, 1195, 1218, 779, 1218, + 1218, 426, 1159, 1791, 1791, 1124, 198, 737, 649, 1125, + 1157, 1155, 2039, 2039, 2035, 864, 247, 352, 127, 422, + 842, 1485, 207, 120, 218, 780, 780, 780, 779, 1671, + 1672, 1810, 1765, 1030, 780, 782, 182, 1046, 1047, 1402, + 1820, 1820, 1051, 780, 782, 1080, 1828, 1586, 1265, 1264, + 585, 1203, 1817, 780, 1218, 1218, 779, 1826, 101, 296, + 780, 1218, 780, 780, 780, 779, 1396, 427, 686, 1116, + 1826, 1993, 2036, 2036, 1979, 2104, 1393, 857, 1481, 218, + 1478, 1032, 782, 1647, 251, 1776, 1043, 782, 1045, 1052, + 1828, 1050, 1263, 780, 1219, 1218, 67, 244, 258, 568, + 1196, 1196, 1203, 780, 1204, 1205, 780, 1587, 1113, 1114, + 1163, 1113, 595, 691, 745, 1118, 864, 2042, 1976, 1478, + 99, 201, 432, 1488, 1489, 1490, 1491, 780, 1672, 1660, + 480, 1770, 1047, 780, 1056, 1057, 1058, 1191, 780, 1219, + 99, 201, 332, 203, 203, 1203, 780, 1163, 1119, 1120, + 1121, 427, 112, 24, 25, 28, 30, 1478, 1479, 203, + 1489, 1491, 1489, 1490, 65, 1773, 1058, 1203, 780, 296, + 101, 1121, 649, 116, 432, 203, 203, 1786, 143, 1777, + 1203, 1196, 1196, 1977, 30, 779, 1779, 457, 600, 1971, + 1972, 170, 251, 1778, 3, 780, 1780, 1781, 1810, 258, + 1782, 1828, 1978, 1828, 780, 782, 1783, 1784, 1810, 1631, + 2092, 1781, 782, 1647, 842, 1784, 1393, 1660, 1394 +}; + +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_int16 yyr1[] = +{ + 0, 788, 789, 790, 789, 789, 791, 791, 792, 792, + 792, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, + 793, 794, 795, 795, 797, 796, 798, 799, 800, 798, + 801, 802, 801, 803, 803, 805, 804, 807, 806, 808, + 808, 809, 809, 809, 809, 809, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, + 809, 810, 810, 810, 811, 812, 812, 812, 813, 814, + 814, 814, 815, 816, 816, 816, 816, 816, 816, 816, + 816, 817, 817, 818, 819, 819, 820, 822, 823, 821, + 824, 821, 825, 826, 821, 827, 828, 821, 829, 830, + 821, 831, 832, 821, 833, 821, 834, 821, 835, 821, + 836, 821, 837, 821, 821, 821, 838, 821, 821, 839, + 839, 840, 840, 841, 841, 841, 841, 841, 841, 841, + 841, 841, 841, 841, 841, 841, 841, 842, 842, 844, + 843, 845, 845, 846, 846, 846, 846, 846, 846, 846, + 848, 847, 850, 849, 849, 851, 851, 851, 851, 852, + 852, 853, 853, 854, 854, 855, 856, 856, 858, 857, + 859, 860, 860, 861, 861, 861, 861, 862, 862, 863, + 863, 864, 864, 865, 865, 865, 865, 865, 865, 865, + 866, 866, 867, 867, 869, 868, 870, 868, 871, 868, + 872, 872, 873, 873, 874, 874, 875, 876, 875, 877, + 877, 878, 879, 879, 880, 880, 881, 881, 881, 883, + 882, 884, 885, 885, 886, 886, 887, 887, 887, 888, + 889, 889, 890, 891, 893, 892, 892, 892, 895, 894, + 896, 896, 897, 899, 898, 900, 900, 900, 900, 901, + 901, 902, 903, 903, 904, 905, 905, 906, 906, 906, + 906, 906, 906, 907, 907, 908, 909, 909, 910, 910, + 911, 911, 912, 912, 913, 913, 913, 914, 914, 914, + 914, 914, 914, 914, 914, 914, 914, 914, 914, 914, + 915, 916, 917, 917, 918, 918, 919, 919, 920, 921, + 921, 922, 922, 922, 923, 924, 924, 925, 926, 926, + 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, + 926, 926, 927, 927, 928, 928, 930, 929, 932, 931, + 933, 933, 935, 934, 934, 936, 936, 937, 936, 938, + 936, 939, 939, 940, 939, 941, 939, 942, 943, 944, + 946, 945, 947, 949, 948, 951, 950, 952, 952, 953, + 953, 954, 954, 954, 955, 956, 956, 956, 957, 957, + 958, 959, 959, 961, 962, 960, 963, 963, 963, 963, + 965, 964, 967, 966, 966, 968, 968, 969, 969, 971, + 970, 973, 972, 974, 974, 975, 975, 976, 976, 977, + 978, 978, 978, 979, 980, 981, 983, 982, 984, 982, + 985, 986, 987, 982, 988, 982, 990, 989, 991, 989, + 992, 993, 989, 994, 989, 995, 995, 996, 996, 996, + 998, 997, 997, 997, 999, 999, 1000, 1000, 1001, 1001, + 1002, 1003, 1003, 1005, 1004, 1006, 1008, 1007, 1010, 1009, + 1011, 1012, 1011, 1011, 1011, 1013, 1011, 1011, 1014, 1011, + 1015, 1015, 1016, 1016, 1017, 1017, 1018, 1018, 1019, 1020, + 1021, 1022, 1023, 1023, 1024, 1025, 1024, 1026, 1024, 1027, + 1027, 1028, 1029, 1030, 1030, 1031, 1031, 1032, 1032, 1033, + 1033, 1035, 1034, 1036, 1037, 1038, 1037, 1039, 1037, 1037, + 1037, 1037, 1040, 1040, 1041, 1041, 1042, 1042, 1044, 1045, + 1043, 1046, 1046, 1047, 1047, 1048, 1048, 1049, 1049, 1051, + 1050, 1052, 1053, 1053, 1054, 1054, 1055, 1055, 1056, 1056, + 1057, 1057, 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1058, + 1058, 1059, 1060, 1059, 1059, 1061, 1061, 1062, 1062, 1063, + 1063, 1064, 1064, 1065, 1065, 1066, 1066, 1066, 1067, 1067, + 1068, 1068, 1069, 1069, 1070, 1070, 1071, 1071, 1072, 1072, + 1072, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1074, 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1073, + 1073, 1073, 1073, 1073, 1073, 1073, 1073, 1075, 1075, 1075, + 1075, 1076, 1076, 1077, 1078, 1079, 1080, 1081, 1082, 1082, + 1082, 1082, 1082, 1082, 1082, 1083, 1083, 1083, 1084, 1084, + 1084, 1084, 1085, 1086, 1087, 1087, 1088, 1088, 1088, 1088, + 1088, 1089, 1089, 1091, 1090, 1092, 1090, 1093, 1090, 1094, + 1090, 1095, 1090, 1096, 1090, 1097, 1090, 1098, 1099, 1100, + 1101, 1101, 1102, 1103, 1103, 1104, 1104, 1105, 1107, 1106, + 1109, 1108, 1110, 1108, 1111, 1111, 1112, 1112, 1113, 1113, + 1114, 1114, 1115, 1115, 1115, 1115, 1116, 1115, 1115, 1115, + 1117, 1117, 1118, 1118, 1118, 1118, 1119, 1119, 1120, 1120, + 1121, 1121, 1121, 1121, 1123, 1122, 1124, 1124, 1125, 1125, + 1126, 1126, 1127, 1127, 1128, 1129, 1129, 1130, 1130, 1130, + 1131, 1131, 1131, 1131, 1131, 1131, 1132, 1132, 1132, 1132, + 1132, 1132, 1132, 1132, 1132, 1132, 1133, 1133, 1133, 1133, + 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1135, 1135, + 1135, 1135, 1135, 1136, 1136, 1136, 1136, 1136, 1136, 1136, + 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1137, 1137, + 1138, 1139, 1139, 1140, 1140, 1141, 1141, 1141, 1141, 1141, + 1142, 1142, 1142, 1142, 1142, 1143, 1143, 1143, 1144, 1144, + 1145, 1145, 1145, 1146, 1147, 1147, 1147, 1147, 1147, 1147, + 1148, 1149, 1149, 1149, 1149, 1150, 1151, 1152, 1152, 1153, + 1153, 1154, 1154, 1155, 1155, 1156, 1156, 1156, 1156, 1156, + 1156, 1156, 1157, 1157, 1158, 1158, 1159, 1159, 1160, 1161, + 1162, 1163, 1163, 1163, 1164, 1164, 1164, 1165, 1165, 1166, + 1166, 1167, 1167, 1168, 1168, 1169, 1169, 1170, 1170, 1171, + 1171, 1172, 1173, 1173, 1174, 1174, 1175, 1175, 1175, 1176, + 1176, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, + 1178, 1178, 1180, 1179, 1181, 1181, 1182, 1183, 1183, 1183, + 1183, 1184, 1185, 1186, 1186, 1187, 1188, 1188, 1189, 1189, + 1190, 1190, 1191, 1192, 1192, 1193, 1193, 1194, 1194, 1194, + 1194, 1195, 1195, 1195, 1195, 1195, 1196, 1196, 1196, 1196, + 1196, 1197, 1197, 1198, 1198, 1199, 1199, 1200, 1200, 1200, + 1201, 1202, 1203, 1203, 1204, 1204, 1205, 1205, 1206, 1206, + 1207, 1207, 1208, 1208, 1209, 1209, 1210, 1210, 1210, 1211, + 1211, 1212, 1212, 1212, 1212, 1212, 1213, 1213, 1214, 1215, + 1215, 1216, 1216, 1216, 1217, 1217, 1218, 1218, 1219, 1219, + 1220, 1220, 1221, 1221, 1222, 1222, 1224, 1225, 1223, 1226, + 1223, 1227, 1223, 1223, 1228, 1223, 1229, 1223, 1230, 1223, + 1231, 1223, 1232, 1223, 1233, 1223, 1223, 1234, 1235, 1236, + 1223, 1237, 1237, 1238, 1238, 1238, 1238, 1239, 1239, 1239, + 1239, 1239, 1240, 1240, 1240, 1240, 1241, 1241, 1242, 1242, + 1243, 1243, 1244, 1244, 1244, 1244, 1244, 1244, 1244, 1244, + 1244, 1244, 1245, 1244, 1244, 1246, 1244, 1247, 1244, 1244, + 1244, 1244, 1244, 1244, 1248, 1244, 1249, 1250, 1250, 1252, + 1251, 1253, 1253, 1253, 1255, 1254, 1256, 1257, 1256, 1258, + 1258, 1259, 1260, 1260, 1261, 1262, 1262, 1262, 1262, 1262, + 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, + 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, + 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1262, 1263, 1263, + 1263, 1263, 1263, 1264, 1264, 1265, 1265, 1266, 1266, 1267, + 1267, 1269, 1268, 1270, 1270, 1271, 1271, 1272, 1272, 1273, + 1273, 1273, 1274, 1274, 1274, 1275, 1275, 1275, 1275, 1277, + 1276, 1278, 1276, 1276, 1276, 1279, 1280, 1280, 1281, 1281, + 1282, 1282, 1282, 1284, 1283, 1285, 1285, 1286, 1286, 1286, + 1287, 1287, 1287, 1288, 1288, 1290, 1289, 1291, 1291, 1291, + 1292, 1293, 1292, 1295, 1294, 1296, 1296, 1297, 1297, 1298, + 1298, 1298, 1299, 1299, 1299, 1301, 1300, 1302, 1302, 1303, + 1304, 1304, 1305, 1305, 1306, 1307, 1306, 1308, 1309, 1308, + 1310, 1310, 1310, 1311, 1311, 1311, 1312, 1312, 1313, 1313, + 1314, 1315, 1314, 1317, 1316, 1318, 1318, 1319, 1319, 1320, + 1320, 1320, 1320, 1320, 1320, 1321, 1321, 1323, 1322, 1324, + 1324, 1324, 1326, 1325, 1325, 1327, 1327, 1328, 1328, 1329, + 1331, 1330, 1332, 1332, 1333, 1333, 1334, 1335, 1336, 1336, + 1338, 1337, 1339, 1339, 1340, 1340, 1341, 1342, 1344, 1343, + 1346, 1345, 1347, 1347, 1348, 1348, 1350, 1349, 1351, 1349, + 1353, 1352, 1354, 1352, 1355, 1355, 1357, 1356, 1359, 1360, + 1358, 1361, 1362, 1363, 1363, 1364, 1364, 1366, 1365, 1367, + 1365, 1368, 1368, 1369, 1370, 1369, 1369, 1371, 1371, 1372, + 1373, 1374, 1374, 1375, 1375, 1376, 1377, 1377, 1378, 1378, + 1379, 1379, 1379, 1380, 1380, 1380, 1381, 1382, 1382, 1383, + 1383, 1384, 1384, 1384, 1384, 1385, 1385, 1386, 1386, 1386, + 1387, 1387, 1388, 1388, 1389, 1389, 1389, 1389, 1390, 1390, + 1390, 1391, 1391, 1392, 1393, 1394, 1395, 1395, 1395, 1395, + 1395, 1396, 1396, 1396, 1397, 1397, 1397, 1398, 1398, 1399, + 1399, 1399, 1399, 1399, 1400, 1400, 1400, 1400, 1400, 1400, + 1400, 1400, 1400, 1400, 1400, 1400, 1401, 1401, 1401, 1401, + 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, 1401, + 1401, 1401, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, + 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, 1402, + 1402, 1403, 1403, 1404, 1404, 1405, 1405, 1406, 1406, 1407, + 1407, 1407, 1407, 1407, 1407, 1408, 1408, 1409, 1409, 1410, + 1410, 1410, 1411, 1411, 1411, 1411, 1411, 1411, 1412, 1412, + 1412, 1413, 1413, 1414, 1415, 1415, 1416, 1416, 1416, 1416, + 1417, 1418, 1418, 1419, 1420, 1420, 1420, 1420, 1420, 1420, + 1420, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, + 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, + 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, 1421, + 1422, 1422, 1422, 1422, 1423, 1423, 1424, 1424, 1424, 1424, + 1424, 1424, 1425, 1425, 1426, 1426, 1427, 1427, 1427, 1427, + 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1427, + 1427, 1427, 1427, 1427, 1427, 1427, 1427, 1428, 1428, 1429, + 1429, 1430, 1430, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, + 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, + 1432, 1432, 1432, 1432, 1434, 1433, 1433, 1433, 1433, 1433, + 1433, 1433, 1433, 1433, 1433, 1433, 1435, 1435, 1436, 1436, + 1437, 1437, 1438, 1438, 1439, 1439, 1440, 1441, 1441, 1441, + 1441, 1441, 1441, 1441, 1442, 1443, 1441, 1441, 1441, 1441, + 1441, 1441, 1441, 1441, 1441, 1441, 1441, 1444, 1441, 1445, + 1441, 1446, 1441, 1447, 1447, 1448, 1448, 1448, 1449, 1449, + 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, 1449, + 1449, 1450, 1452, 1451, 1451, 1453, 1453, 1454, 1455, 1457, + 1456, 1458, 1458, 1458, 1458, 1459, 1459, 1460, 1460, 1461, + 1461, 1462, 1462, 1463, 1463, 1464, 1465, 1467, 1466, 1468, + 1468, 1468, 1468, 1468, 1468, 1468, 1468, 1469, 1469, 1469, + 1469, 1469, 1469, 1469, 1469, 1470, 1470, 1470, 1470, 1471, + 1471, 1472, 1472, 1473, 1473, 1474, 1474, 1475, 1475, 1476, + 1476, 1477, 1477, 1478, 1478, 1478, 1479, 1479, 1479, 1479, + 1479, 1480, 1481, 1482, 1482, 1484, 1483, 1485, 1483, 1486, + 1486, 1486, 1487, 1487, 1487, 1487, 1488, 1488, 1488, 1488, + 1488, 1489, 1489, 1489, 1490, 1491, 1493, 1494, 1492, 1495, + 1495, 1496, 1496, 1497, 1498, 1497, 1499, 1497, 1497, 1500, + 1497, 1501, 1497, 1497, 1502, 1497, 1503, 1497, 1497, 1504, + 1504, 1504, 1505, 1505, 1506, 1506, 1507, 1508, 1508, 1508, + 1508, 1508, 1509, 1509, 1510, 1510, 1511, 1511, 1512, 1512, + 1513, 1513, 1514, 1515, 1515, 1516, 1516, 1517, 1517, 1517, + 1517, 1518, 1518, 1520, 1519, 1521, 1519, 1522, 1522, 1523, + 1524, 1523, 1526, 1525, 1527, 1527, 1528, 1528, 1529, 1529, + 1530, 1530, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, + 1531, 1531, 1531, 1531, 1532, 1532, 1532, 1532, 1532, 1532, + 1532, 1532, 1532, 1533, 1533, 1533, 1533, 1534, 1534, 1534, + 1535, 1535, 1536, 1537, 1537, 1538, 1539, 1538, 1540, 1541, + 1540, 1542, 1542, 1543, 1543, 1544, 1544, 1544, 1545, 1545, + 1546, 1546, 1547, 1549, 1548, 1550, 1550, 1551, 1551, 1552, + 1552, 1553, 1553, 1554, 1554, 1555, 1555, 1556, 1556, 1556, + 1557, 1557, 1557, 1558, 1558, 1558, 1558, 1558, 1558, 1559, + 1560, 1560, 1561, 1562, 1562, 1564, 1563, 1565, 1565, 1566, + 1566, 1566, 1567, 1567, 1568, 1568, 1568, 1568, 1569, 1569, + 1569, 1569, 1569, 1570, 1570, 1571, 1571, 1572, 1572, 1573, + 1574, 1574, 1574, 1575, 1575, 1575, 1575, 1575, 1575, 1576, + 1577, 1577, 1577, 1577, 1578, 1578, 1578, 1579, 1579, 1580, + 1581, 1582, 1582, 1582, 1583, 1583, 1584, 1584, 1585, 1585, + 1586, 1586, 1586, 1586, 1586, 1586, 1587, 1587, 1587, 1587, + 1587, 1588, 1588, 1588, 1588, 1589, 1589, 1589, 1589, 1589, + 1590, 1590, 1590, 1590, 1590, 1591, 1592, 1592, 1593, 1593, + 1594, 1594, 1594, 1596, 1595, 1597, 1597, 1598, 1598, 1599, + 1601, 1600, 1602, 1602, 1603, 1604, 1604, 1604, 1605, 1607, + 1608, 1606, 1606, 1606, 1610, 1609, 1612, 1611, 1613, 1611, + 1611, 1611, 1611, 1614, 1611, 1611, 1611, 1611, 1615, 1611, + 1611, 1616, 1616, 1617, 1618, 1619, 1619, 1620, 1621, 1621, + 1622, 1622, 1623, 1623, 1625, 1626, 1624, 1628, 1629, 1627, + 1630, 1631, 1632, 1632, 1632, 1633, 1633, 1634, 1634, 1635, + 1635, 1637, 1636, 1638, 1638, 1639, 1638, 1640, 1641, 1641, + 1642, 1642, 1643, 1644, 1644, 1645, 1645, 1646, 1647, 1647, + 1648, 1648, 1649, 1649, 1650, 1650, 1652, 1651, 1654, 1653, + 1655, 1655, 1656, 1656, 1657, 1657, 1658, 1658, 1659, 1659, + 1660, 1660, 1661, 1662, 1663, 1661, 1664, 1664, 1666, 1667, + 1668, 1665, 1669, 1669, 1670, 1670, 1671, 1671, 1672, 1673, + 1673, 1675, 1674, 1676, 1676, 1677, 1677, 1678, 1679, 1680, + 1681, 1682, 1680, 1683, 1684, 1680, 1685, 1686, 1685, 1687, + 1687, 1688, 1688, 1689, 1689, 1690, 1690, 1691, 1691, 1691, + 1693, 1694, 1692, 1695, 1695, 1696, 1696, 1697, 1697, 1698, + 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1698, 1699, 1699, + 1701, 1700, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1703, 1702, 1704, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, + 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1702, 1705, + 1705, 1705, 1706, 1706, 1707, 1707, 1708, 1708, 1709, 1709, + 1710, 1710, 1711, 1711, 1712, 1712, 1713, 1713, 1713, 1715, + 1714, 1716, 1714, 1717, 1717, 1717, 1717, 1717, 1717, 1718, + 1718, 1719, 1720, 1720, 1720, 1720, 1721, 1721, 1722, 1722, + 1722, 1723, 1725, 1724, 1727, 1726, 1726, 1728, 1728, 1729, + 1730, 1729, 1731, 1731, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, 1732, + 1732, 1732, 1733, 1733, 1734, 1735, 1736, 1735, 1735, 1737, + 1737, 1738, 1738, 1738, 1739, 1740, 1740, 1742, 1741, 1743, + 1743, 1745, 1744, 1746, 1744, 1744, 1747, 1747, 1748, 1748, + 1749, 1750, 1749, 1752, 1751, 1753, 1753, 1753, 1754, 1754, + 1754, 1755, 1755, 1756, 1756, 1758, 1757, 1759, 1759, 1760, + 1762, 1763, 1764, 1765, 1761, 1766, 1766, 1767, 1767, 1768, + 1768, 1768, 1769, 1769, 1769, 1770, 1770, 1771, 1771, 1772, + 1772, 1772, 1772, 1773, 1773, 1774, 1774, 1775, 1775, 1776, + 1776, 1777, 1777, 1778, 1778, 1779, 1779, 1779, 1780, 1780, + 1781, 1781, 1782, 1782, 1783, 1783, 1784, 1785, 1785, 1785, + 1785, 1786, 1786, 1787, 1787, 1787, 1788, 1788, 1788, 1789, + 1789, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, 1790, + 1790, 1791, 1791, 1791, 1791, 1791, 1792, 1792, 1792, 1794, + 1793, 1795, 1795, 1796, 1796, 1797, 1798, 1799, 1798, 1800, + 1800, 1801, 1802, 1803, 1803, 1804, 1805, 1805, 1806, 1806, + 1807, 1807, 1808, 1809, 1809, 1809, 1809, 1809, 1810, 1810, + 1810, 1810, 1810, 1811, 1811, 1811, 1811, 1812, 1812, 1812, + 1813, 1813, 1814, 1815, 1815, 1816, 1816, 1816, 1817, 1818, + 1818, 1818, 1818, 1819, 1820, 1821, 1822, 1823, 1823, 1824, + 1824, 1825, 1825, 1825, 1826, 1826, 1827, 1827, 1828, 1828, + 1828, 1829, 1829, 1829, 1830, 1830, 1831, 1832, 1832, 1832, + 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1832, 1833, + 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, 1833, + 1833, 1833, 1834, 1834, 1834, 1834, 1834, 1834, 1834, 1834, + 1834, 1834, 1834, 1834, 1834, 1835, 1835, 1835, 1835, 1835, + 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1835, 1836, 1836, + 1836, 1836, 1836, 1836, 1836, 1836, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1838, + 1838, 1838, 1838, 1838, 1838, 1839, 1839, 1839, 1839, 1839, + 1839, 1839, 1839, 1839, 1839, 1840, 1840, 1840, 1841, 1841, + 1841, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1842, + 1842, 1842, 1842, 1842, 1842, 1842, 1842, 1843, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, + 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1844, 1845, + 1845, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, + 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, 1846, + 1846, 1846, 1846, 1846, 1846, 1846, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1849, 1848, 1850, 1850, 1851, 1850, 1852, 1850, + 1853, 1850, 1854, 1854, 1855, 1855, 1856, 1855, 1857, 1857, + 1859, 1858, 1858, 1860, 1860, 1860, 1861, 1861, 1861, 1861, + 1862, 1862, 1862, 1862, 1864, 1863, 1865, 1863, 1866, 1863, + 1868, 1867, 1869, 1867, 1870, 1867, 1872, 1871, 1873, 1871, + 1874, 1871, 1875, 1871, 1876, 1871, 1877, 1871, 1878, 1871, + 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1879, 1871, 1880, + 1871, 1881, 1871, 1882, 1882, 1882, 1882, 1883, 1884, 1885, + 1885, 1886, 1886, 1886, 1886, 1887, 1887, 1887, 1888, 1888, + 1888, 1888, 1888, 1890, 1889, 1891, 1891, 1891, 1892, 1892, + 1893, 1893, 1894, 1895, 1895, 1895, 1895, 1895, 1897, 1896, + 1899, 1898, 1900, 1900, 1901, 1900, 1902, 1902, 1903, 1903, + 1904, 1904, 1904, 1904, 1905, 1904, 1906, 1906, 1906, 1906, + 1906, 1907, 1908, 1908, 1908, 1908, 1908, 1909, 1909, 1910, + 1911, 1911, 1911, 1911, 1912, 1912, 1913, 1913, 1914, 1914, + 1915, 1916, 1917, 1917, 1918, 1918, 1919, 1919, 1920, 1920, + 1921, 1921, 1921, 1921, 1922, 1923, 1923, 1923, 1923, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, 1924, + 1924, 1925, 1925, 1926, 1926, 1927, 1927, 1927, 1928, 1928, + 1928, 1928, 1929, 1929, 1930, 1930, 1931, 1931, 1932, 1932, + 1933, 1933, 1934, 1934, 1934, 1934, 1935, 1935, 1936, 1937, + 1937, 1937, 1938, 1938, 1938, 1938, 1938, 1939, 1939, 1939, + 1939, 1939, 1940, 1940, 1941, 1941, 1942, 1942, 1943, 1943, + 1944, 1944, 1945, 1945, 1947, 1946, 1948, 1949, 1949, 1950, + 1950, 1951, 1951, 1951, 1952, 1952, 1952, 1953, 1954, 1954, + 1954, 1955, 1956, 1957, 1957, 1957, 1958, 1958, 1958, 1959, + 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1959, 1960, 1960, + 1961, 1962, 1963, 1963, 1963, 1964, 1964, 1965, 1965, 1966, + 1966, 1967, 1967, 1969, 1968, 1970, 1970, 1970, 1970, 1971, + 1971, 1972, 1972, 1974, 1975, 1976, 1977, 1978, 1973, 1980, + 1979, 1981, 1981, 1981, 1981, 1981, 1981, 1982, 1982, 1983, + 1983, 1983, 1984, 1984, 1984, 1985, 1985, 1985, 1986, 1986, + 1987, 1988, 1987, 1989, 1989, 1990, 1990, 1991, 1991, 1992, + 1993, 1994, 1994, 1995, 1996, 1995, 1997, 1995, 1998, 1995, + 1999, 2000, 2001, 2002, 2002, 2003, 2003, 2003, 2003, 2003, + 2003, 2003, 2003, 2004, 2004, 2004, 2004, 2004, 2004, 2004, + 2004, 2005, 2005, 2005, 2006, 2007, 2009, 2008, 2010, 2011, + 2012, 2013, 2014, 2014, 2014, 2015, 2015, 2015, 2017, 2016, + 2018, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2020, + 2020, 2021, 2021, 2023, 2022, 2024, 2022, 2025, 2022, 2026, + 2026, 2027, 2028, 2028, 2029, 2029, 2031, 2030, 2032, 2033, + 2033, 2034, 2034, 2035, 2035, 2036, 2036, 2037, 2037, 2038, + 2040, 2041, 2042, 2039, 2043, 2043, 2044, 2044, 2045, 2045, + 2047, 2046, 2048, 2048, 2049, 2049, 2049, 2050, 2050, 2051, + 2051, 2052, 2054, 2053, 2056, 2055, 2057, 2057, 2057, 2059, + 2058, 2061, 2060, 2062, 2063, 2063, 2064, 2064, 2065, 2065, + 2066, 2066, 2067, 2068, 2068, 2068, 2069, 2069, 2069, 2069, + 2071, 2070, 2073, 2074, 2072, 2075, 2075, 2075, 2075, 2075, + 2077, 2076, 2078, 2076, 2079, 2076, 2076, 2080, 2076, 2081, + 2082, 2083, 2076, 2084, 2084, 2086, 2085, 2085, 2087, 2087, + 2088, 2088, 2089, 2089, 2090, 2090, 2090, 2091, 2090, 2092, + 2092, 2092, 2092, 2092, 2092, 2093, 2093, 2093, 2093, 2093, + 2093, 2093, 2093, 2093, 2093, 2093, 2094, 2094, 2094, 2094, + 2096, 2095, 2097, 2098, 2095, 2099, 2099, 2101, 2100, 2102, + 2103, 2100, 2105, 2104 +}; + +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 1, 0, 4, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 0, 5, 3, 0, 0, 6, + 0, 0, 3, 1, 3, 0, 3, 0, 7, 1, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, + 1, 0, 1, 3, 1, 0, 1, 3, 1, 0, + 1, 3, 1, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 1, 1, 0, 1, 3, 0, 0, 8, + 0, 8, 0, 0, 15, 0, 0, 17, 0, 0, + 15, 0, 0, 15, 0, 6, 0, 10, 0, 11, + 0, 5, 0, 5, 8, 6, 0, 3, 1, 0, + 1, 1, 2, 3, 2, 1, 3, 2, 1, 3, + 3, 3, 1, 1, 1, 1, 3, 0, 1, 0, + 12, 1, 3, 2, 2, 2, 2, 2, 2, 2, + 0, 12, 0, 6, 2, 0, 1, 3, 1, 0, + 2, 0, 2, 0, 1, 4, 0, 2, 0, 3, + 0, 0, 1, 1, 1, 1, 2, 3, 1, 0, + 2, 0, 2, 2, 2, 2, 2, 3, 3, 1, + 1, 2, 3, 3, 0, 4, 0, 6, 0, 8, + 0, 3, 0, 1, 3, 1, 0, 0, 2, 3, + 1, 1, 0, 1, 3, 1, 1, 1, 1, 0, + 4, 3, 0, 3, 2, 3, 1, 3, 5, 2, + 1, 3, 3, 1, 0, 4, 4, 1, 0, 6, + 0, 3, 0, 0, 3, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 3, 0, 1, 1, 1, 1, + 2, 1, 1, 2, 3, 3, 1, 1, 0, 1, + 0, 2, 3, 5, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 4, 0, 1, 1, 3, 1, 3, 3, 1, + 2, 1, 1, 1, 1, 1, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 0, 5, 0, 2, + 1, 1, 0, 3, 1, 1, 2, 0, 4, 0, + 5, 1, 2, 0, 4, 0, 5, 2, 2, 2, + 0, 2, 0, 0, 3, 0, 3, 1, 3, 0, + 3, 1, 1, 1, 3, 3, 4, 5, 2, 4, + 2, 1, 3, 0, 0, 6, 0, 2, 2, 2, + 0, 6, 0, 3, 1, 1, 2, 1, 2, 0, + 5, 0, 5, 0, 2, 0, 1, 0, 1, 2, + 5, 3, 5, 3, 5, 1, 0, 5, 0, 5, + 0, 0, 0, 8, 0, 5, 0, 3, 0, 3, + 0, 0, 5, 0, 3, 1, 1, 1, 1, 1, + 0, 5, 3, 1, 2, 4, 0, 4, 1, 4, + 1, 0, 1, 0, 4, 0, 0, 3, 0, 6, + 6, 0, 4, 2, 2, 0, 3, 2, 0, 3, + 0, 1, 0, 3, 0, 1, 1, 3, 1, 4, + 3, 3, 0, 2, 0, 0, 7, 0, 10, 1, + 3, 1, 1, 0, 2, 0, 3, 1, 3, 0, + 1, 0, 6, 1, 0, 0, 4, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 3, 0, 0, + 5, 1, 3, 1, 1, 0, 3, 1, 3, 0, + 4, 1, 0, 1, 2, 1, 1, 1, 0, 1, + 2, 1, 3, 4, 3, 3, 3, 3, 4, 4, + 3, 0, 0, 6, 3, 0, 2, 0, 1, 0, + 1, 0, 1, 1, 2, 1, 1, 3, 0, 3, + 0, 3, 1, 3, 0, 1, 1, 2, 1, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 0, 6, 1, 1, 3, 4, 4, 2, 2, + 2, 3, 3, 3, 1, 3, 1, 3, 3, 3, + 3, 0, 1, 2, 4, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, + 2, 1, 3, 0, 9, 0, 10, 0, 9, 0, + 9, 0, 11, 0, 12, 0, 10, 2, 7, 7, + 0, 1, 4, 0, 1, 0, 1, 2, 0, 4, + 0, 3, 0, 3, 0, 1, 2, 1, 0, 1, + 2, 1, 0, 1, 2, 3, 0, 6, 5, 5, + 0, 2, 0, 1, 1, 1, 0, 1, 2, 1, + 1, 2, 2, 1, 0, 3, 1, 3, 3, 1, + 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 3, 3, 3, 2, + 1, 1, 3, 3, 3, 3, 0, 1, 2, 2, + 3, 3, 2, 3, 3, 4, 3, 3, 3, 1, + 2, 2, 2, 2, 3, 3, 2, 2, 2, 3, + 3, 2, 3, 2, 2, 2, 2, 2, 5, 5, + 1, 1, 2, 2, 1, 2, 1, 2, 3, 2, + 1, 1, 1, 1, 1, 1, 1, 2, 0, 3, + 0, 1, 1, 5, 0, 1, 1, 1, 2, 2, + 1, 3, 3, 3, 3, 1, 1, 0, 1, 0, + 1, 0, 1, 2, 1, 1, 2, 4, 1, 3, + 2, 1, 0, 2, 0, 1, 0, 1, 2, 2, + 2, 3, 2, 1, 1, 1, 2, 1, 2, 2, + 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 2, 1, 1, 0, + 1, 1, 1, 2, 1, 2, 3, 3, 2, 2, + 0, 1, 0, 4, 1, 1, 1, 0, 1, 2, + 1, 1, 2, 1, 3, 3, 1, 1, 0, 2, + 0, 1, 5, 0, 3, 3, 1, 0, 2, 2, + 2, 0, 3, 3, 6, 6, 1, 1, 2, 2, + 2, 2, 2, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 0, 1, 0, 1, 0, 1, 1, 2, + 1, 2, 1, 2, 0, 2, 0, 2, 2, 2, + 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 2, 4, 2, 0, 4, + 1, 4, 0, 1, 1, 3, 0, 0, 9, 0, + 5, 0, 7, 7, 0, 6, 0, 6, 0, 11, + 0, 10, 0, 11, 0, 8, 8, 0, 0, 0, + 9, 1, 1, 0, 1, 1, 3, 0, 2, 3, + 5, 5, 0, 3, 1, 4, 0, 3, 0, 2, + 0, 1, 0, 2, 2, 2, 2, 1, 1, 1, + 4, 4, 0, 6, 4, 0, 5, 0, 6, 4, + 3, 1, 7, 7, 0, 7, 2, 1, 1, 0, + 6, 0, 3, 2, 0, 5, 0, 0, 6, 1, + 3, 1, 1, 3, 3, 3, 2, 2, 4, 4, + 2, 7, 6, 5, 5, 4, 5, 4, 4, 2, + 2, 7, 5, 6, 3, 6, 6, 4, 6, 1, + 1, 1, 1, 1, 3, 3, 3, 5, 0, 1, + 1, 2, 2, 3, 3, 3, 3, 0, 1, 0, + 1, 0, 2, 0, 1, 2, 1, 1, 1, 0, + 1, 1, 0, 2, 1, 0, 1, 1, 1, 0, + 7, 0, 5, 5, 4, 3, 0, 1, 1, 3, + 3, 2, 2, 0, 2, 1, 3, 0, 1, 1, + 0, 2, 4, 1, 3, 0, 5, 0, 1, 1, + 3, 0, 4, 0, 4, 0, 1, 1, 2, 1, + 1, 1, 0, 2, 2, 0, 5, 1, 3, 2, + 0, 3, 1, 4, 1, 0, 4, 1, 0, 4, + 0, 1, 3, 0, 1, 3, 1, 1, 2, 6, + 3, 0, 4, 0, 3, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 2, 0, 2, 0, 6, 0, + 1, 1, 0, 5, 4, 3, 5, 1, 3, 4, + 0, 6, 1, 1, 1, 3, 2, 3, 1, 1, + 0, 6, 1, 1, 1, 3, 3, 4, 0, 6, + 0, 2, 0, 4, 0, 2, 0, 3, 0, 4, + 0, 3, 0, 4, 1, 1, 0, 3, 0, 0, + 5, 6, 7, 1, 2, 1, 1, 0, 3, 0, + 3, 3, 3, 1, 0, 4, 3, 1, 1, 1, + 1, 1, 4, 0, 1, 2, 1, 1, 0, 1, + 0, 1, 1, 2, 1, 2, 9, 0, 1, 0, + 2, 3, 1, 4, 4, 2, 1, 1, 1, 1, + 3, 5, 0, 1, 0, 2, 1, 2, 3, 1, + 1, 3, 4, 0, 0, 0, 0, 2, 2, 1, + 1, 0, 2, 3, 0, 2, 3, 0, 2, 3, + 3, 3, 2, 1, 3, 4, 3, 4, 3, 4, + 3, 4, 3, 3, 6, 1, 3, 4, 5, 7, + 6, 8, 5, 6, 4, 3, 5, 4, 6, 3, + 4, 1, 3, 3, 3, 3, 3, 3, 3, 5, + 5, 5, 6, 6, 3, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, + 1, 1, 1, 2, 1, 1, 1, 2, 1, 2, + 2, 2, 1, 4, 1, 3, 1, 1, 1, 1, + 3, 1, 1, 1, 4, 4, 4, 3, 3, 3, + 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 6, 4, 4, 7, 6, 3, 4, 6, + 6, 4, 4, 4, 4, 4, 4, 6, 8, 10, + 1, 1, 3, 1, 1, 3, 1, 2, 2, 2, + 2, 2, 1, 3, 4, 6, 4, 6, 2, 2, + 4, 4, 4, 10, 6, 8, 6, 4, 4, 6, + 4, 3, 4, 1, 4, 3, 4, 1, 1, 5, + 3, 5, 3, 6, 8, 2, 2, 8, 8, 6, + 6, 2, 6, 2, 6, 8, 4, 1, 3, 4, + 8, 8, 4, 2, 2, 2, 6, 6, 4, 8, + 4, 4, 8, 4, 6, 6, 4, 6, 8, 6, + 5, 8, 7, 10, 0, 5, 4, 4, 4, 6, + 8, 6, 6, 6, 6, 6, 2, 3, 0, 4, + 0, 3, 0, 1, 1, 3, 4, 4, 5, 4, + 4, 4, 5, 4, 0, 0, 7, 4, 5, 4, + 5, 4, 4, 4, 4, 4, 5, 0, 9, 0, + 8, 0, 7, 3, 3, 1, 1, 1, 3, 3, + 3, 3, 3, 4, 4, 4, 6, 4, 6, 4, + 6, 5, 0, 7, 4, 4, 4, 4, 1, 0, + 3, 3, 1, 3, 5, 0, 1, 0, 2, 0, + 3, 4, 2, 0, 1, 2, 1, 0, 3, 2, + 3, 3, 3, 2, 1, 1, 1, 1, 1, 2, + 1, 2, 2, 1, 2, 1, 2, 2, 3, 0, + 1, 1, 3, 1, 3, 1, 3, 4, 5, 1, + 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 1, 4, 1, 3, 0, 3, 0, 5, 2, + 4, 4, 1, 1, 1, 1, 0, 1, 2, 1, + 2, 1, 1, 2, 3, 3, 0, 0, 10, 1, + 4, 1, 3, 3, 0, 6, 0, 8, 4, 0, + 8, 0, 10, 6, 0, 8, 0, 10, 6, 1, + 2, 1, 1, 2, 0, 1, 5, 1, 1, 1, + 1, 1, 1, 3, 1, 3, 3, 3, 3, 3, + 3, 3, 5, 3, 2, 0, 1, 0, 2, 3, + 3, 1, 1, 0, 7, 0, 7, 1, 2, 0, + 0, 2, 0, 2, 0, 1, 1, 1, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 0, 1, 2, 0, 1, 0, 0, 3, 0, 0, + 3, 0, 4, 4, 2, 0, 1, 1, 0, 2, + 3, 1, 3, 0, 7, 0, 1, 0, 3, 0, + 3, 0, 3, 1, 1, 1, 4, 2, 2, 2, + 1, 2, 2, 0, 3, 2, 2, 3, 3, 3, + 3, 1, 2, 0, 1, 0, 4, 4, 2, 0, + 1, 1, 0, 1, 2, 5, 4, 1, 4, 7, + 5, 8, 3, 1, 1, 1, 1, 1, 2, 1, + 1, 3, 3, 1, 3, 1, 1, 1, 1, 1, + 0, 2, 3, 4, 1, 2, 1, 0, 1, 1, + 1, 0, 2, 2, 2, 1, 0, 1, 2, 2, + 2, 1, 2, 2, 2, 2, 1, 1, 1, 1, + 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 6, 0, 1, 3, 1, 3, + 0, 2, 3, 1, 1, 2, 1, 3, 2, 0, + 0, 7, 2, 1, 0, 3, 0, 8, 0, 8, + 4, 5, 5, 0, 6, 4, 4, 4, 0, 6, + 1, 1, 3, 1, 2, 1, 3, 1, 0, 2, + 0, 2, 0, 1, 0, 0, 12, 0, 0, 10, + 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, + 1, 0, 2, 1, 2, 0, 3, 3, 0, 1, + 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, + 0, 1, 1, 1, 1, 1, 0, 4, 0, 4, + 0, 1, 0, 1, 3, 1, 5, 3, 1, 1, + 1, 1, 0, 0, 0, 7, 5, 1, 0, 0, + 0, 13, 3, 1, 3, 3, 3, 1, 3, 0, + 1, 0, 3, 0, 3, 2, 3, 3, 2, 5, + 0, 0, 7, 0, 0, 8, 0, 0, 3, 1, + 3, 2, 4, 0, 2, 0, 2, 1, 1, 1, + 0, 0, 7, 0, 1, 0, 1, 1, 3, 1, + 1, 2, 2, 2, 1, 1, 1, 1, 0, 3, + 0, 3, 2, 4, 4, 3, 4, 4, 1, 3, + 3, 3, 3, 6, 2, 2, 0, 6, 0, 8, + 5, 2, 1, 1, 1, 5, 5, 2, 2, 1, + 4, 3, 2, 3, 2, 2, 1, 4, 4, 3, + 3, 3, 2, 2, 3, 4, 3, 3, 3, 3, + 4, 4, 3, 2, 3, 3, 3, 3, 3, 4, + 4, 3, 3, 4, 4, 3, 4, 4, 3, 1, + 1, 1, 1, 1, 0, 1, 0, 2, 0, 1, + 1, 1, 0, 2, 0, 2, 0, 3, 3, 0, + 4, 0, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 2, 1, 1, 0, 3, 0, 1, + 1, 5, 0, 4, 0, 4, 1, 0, 1, 4, + 0, 3, 3, 1, 2, 2, 2, 2, 3, 4, + 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, + 1, 2, 0, 1, 2, 2, 0, 3, 1, 0, + 5, 0, 1, 3, 1, 0, 3, 0, 3, 3, + 1, 0, 5, 0, 3, 2, 0, 1, 0, 2, + 5, 0, 6, 0, 4, 0, 1, 1, 2, 2, + 3, 0, 1, 1, 2, 0, 3, 0, 4, 2, + 0, 0, 0, 0, 23, 1, 1, 0, 1, 0, + 1, 1, 0, 1, 1, 0, 2, 2, 1, 3, + 4, 3, 3, 0, 2, 2, 1, 3, 3, 0, + 4, 0, 3, 1, 1, 0, 3, 2, 3, 1, + 1, 2, 0, 2, 3, 1, 5, 1, 1, 2, + 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 2, 2, 2, 0, + 4, 0, 1, 1, 3, 7, 0, 0, 4, 0, + 3, 1, 1, 1, 3, 1, 1, 1, 3, 5, + 3, 5, 1, 1, 3, 4, 5, 4, 1, 3, + 4, 4, 5, 1, 5, 3, 2, 1, 3, 2, + 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 3, 1, 3, 0, 3, 0, 3, + 0, 5, 1, 3, 1, 3, 0, 3, 1, 3, + 0, 3, 1, 1, 1, 1, 0, 1, 1, 1, + 0, 2, 2, 2, 0, 4, 0, 6, 0, 6, + 0, 4, 0, 6, 0, 6, 0, 4, 0, 6, + 0, 6, 0, 5, 0, 7, 0, 9, 0, 9, + 2, 3, 2, 4, 3, 5, 2, 0, 4, 0, + 4, 0, 6, 1, 1, 3, 3, 1, 3, 2, + 2, 2, 2, 2, 1, 1, 4, 4, 1, 1, + 1, 1, 1, 0, 5, 0, 2, 1, 1, 1, + 1, 3, 3, 1, 1, 2, 2, 2, 0, 3, + 0, 3, 3, 2, 0, 6, 1, 2, 1, 1, + 1, 1, 1, 1, 0, 5, 1, 1, 1, 1, + 1, 3, 6, 6, 7, 5, 3, 4, 1, 3, + 8, 8, 6, 4, 0, 3, 0, 3, 1, 3, + 2, 1, 1, 1, 0, 1, 1, 2, 0, 1, + 1, 1, 3, 3, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 1, 3, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 1, 2, 2, + 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, + 2, 0, 1, 3, 1, 2, 2, 2, 1, 3, + 3, 1, 1, 3, 1, 3, 1, 3, 1, 1, + 1, 1, 4, 5, 4, 1, 3, 1, 2, 0, + 2, 5, 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 0, 2, 0, 2, 0, 3, + 2, 1, 2, 1, 0, 3, 1, 0, 1, 0, + 1, 0, 3, 2, 0, 1, 2, 4, 4, 5, + 4, 2, 3, 2, 2, 2, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 3, 3, 3, 3, 0, 1, 3, 3, 0, + 3, 1, 3, 0, 3, 0, 3, 4, 4, 1, + 1, 0, 2, 0, 0, 0, 0, 0, 20, 0, + 2, 4, 4, 3, 4, 3, 3, 0, 3, 1, + 3, 5, 1, 1, 1, 0, 1, 1, 0, 2, + 0, 0, 3, 0, 2, 6, 3, 4, 4, 1, + 0, 1, 1, 1, 0, 3, 0, 5, 0, 7, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 0, 6, 4, 1, + 1, 0, 1, 2, 2, 1, 1, 2, 0, 2, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 4, 0, 6, 0, 7, 1, + 2, 3, 1, 2, 1, 2, 0, 5, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 7, 2, 1, 1, 2, 1, 1, + 0, 2, 1, 3, 1, 1, 2, 1, 2, 1, + 2, 0, 0, 8, 0, 6, 4, 4, 1, 0, + 5, 0, 5, 2, 1, 1, 1, 2, 3, 3, + 5, 5, 2, 2, 3, 1, 6, 8, 4, 6, + 0, 5, 0, 0, 8, 6, 4, 4, 4, 5, + 0, 6, 0, 12, 0, 12, 10, 0, 12, 0, + 0, 0, 15, 1, 1, 0, 3, 1, 2, 3, + 2, 3, 1, 1, 1, 4, 2, 0, 6, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 6, 0, 0, 9, 1, 2, 0, 5, 0, + 0, 7, 0, 4 +}; + + +enum { YYENOMEM = -2 }; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (thd, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value, thd); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + FILE *yyoutput = yyo; + YY_USE (yyoutput); + YY_USE (thd); + if (!yyvaluep) + return; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ + +static void +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, THD *thd) +{ + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); + + yy_symbol_value_print (yyo, yykind, yyvaluep, thd); + YYFPRINTF (yyo, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule, THD *thd) +{ + int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)], thd); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule, thd); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + + + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep, THD *thd) +{ + YY_USE (yyvaluep); + YY_USE (thd); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + switch (yykind) + { + case YYSYMBOL_expr_lex: /* expr_lex */ +#line 1551 "/home/buildbot/git/mkdist/sql/yy_oracle.yy" +{ + /* + In case of a syntax/oom error let's free the sp_expr_lex + instance, but only if it has not been linked to any structures + such as sp_instr_jump_if_not::m_lex_keeper yet, e.g.: + IF f1() THEN1 + i.e. THEN1 came instead of the expected THEN causing a syntax error. + */ + if (!((*yyvaluep).expr_lex)->sp_lex_in_use) + delete ((*yyvaluep).expr_lex); +} +#line 28691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case YYSYMBOL_cursor_actual_parameters: /* cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_oracle.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 28708 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case YYSYMBOL_opt_parenthesized_cursor_actual_parameters: /* opt_parenthesized_cursor_actual_parameters */ +#line 1610 "/home/buildbot/git/mkdist/sql/yy_oracle.yy" +{ + if (((*yyvaluep).sp_assignment_lex_list)) + { + sp_assignment_lex *elem; + List_iterator li(*((*yyvaluep).sp_assignment_lex_list)); + while ((elem= li++)) + { + if (!elem->sp_lex_in_use) + delete elem; + } + } +} +#line 28725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + default: + break; + } + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (THD *thd) +{ +/* Lookahead token kind. */ +int yychar; + + +/* The semantic value of the lookahead symbol. */ +/* Default value used for initialization, for pacifying older GCCs + or non-GCC compilers. */ +YY_INITIAL_VALUE (static YYSTYPE yyval_default;) +YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); + + /* Number of syntax errors so far. */ + int yynerrs = 0; + + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; + + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = YYEMPTY; /* Cause a token to be read. */ + + goto yysetstate; + + +/*------------------------------------------------------------. +| yynewstate -- push a new state, which is found in yystate. | +`------------------------------------------------------------*/ +yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); + + if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else + { + /* Get the current used size of the three stacks, in elements. */ + YYPTRDIFF_T yysize = yyssp - yyss + 1; + +# if defined yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; + } +# else /* defined YYSTACK_RELOCATE */ + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + YYNOMEM; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (&yylval, thd); + } + + if (yychar <= YYEOF) + { + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + /* Discard the shifted token. */ + yychar = YYEMPTY; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: /* query: END_OF_INPUT */ +#line 1976 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->bootstrap && + (!(thd->lex->lex_options & OPTION_LEX_FOUND_COMMENT))) + my_yyabort_error((ER_EMPTY_QUERY, MYF(0))); + + thd->lex->sql_command= SQLCOM_EMPTY_QUERY; + YYLIP->found_semicolon= NULL; + } +#line 29008 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3: /* $@1: %empty */ +#line 1985 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_input_stream *lip = YYLIP; + + if ((thd->client_capabilities & CLIENT_MULTI_QUERIES) && + lip->multi_statements && + ! lip->eof()) + { + /* + We found a well formed query, and multi queries are allowed: + - force the parser to stop after the ';' + - mark the start of the next query for the next invocation + of the parser. + */ + lip->next_state= MY_LEX_END; + lip->found_semicolon= lip->get_ptr(); + } + else + { + /* Single query, terminated. */ + lip->found_semicolon= NULL; + } + } +#line 29035 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 5: /* query: directly_executable_statement END_OF_INPUT */ +#line 2010 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Single query, not terminated. */ + YYLIP->found_semicolon= NULL; + } +#line 29044 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 71: /* deallocate: deallocate_or_drop PREPARE_SYM ident */ +#line 2093 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_deallocate_prepare((yyvsp[0].ident_sys)); + } +#line 29052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 74: /* $@2: %empty */ +#line 2105 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PREPARE..FROM"; } +#line 29058 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 75: /* prepare: PREPARE_SYM ident FROM $@2 expr */ +#line 2107 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_prepare((yyvsp[-3].ident_sys), (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 29068 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 76: /* execute: EXECUTE_SYM ident execute_using */ +#line 2116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute((yyvsp[-1].ident_sys), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29077 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 77: /* $@3: %empty */ +#line 2121 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE IMMEDIATE"; } +#line 29083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 78: /* $@4: %empty */ +#line 2123 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= NULL; } +#line 29089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 79: /* execute: EXECUTE_SYM IMMEDIATE_SYM $@3 expr $@4 execute_using */ +#line 2125 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_execute_immediate((yyvsp[-2].item), (yyvsp[0].item_list))) + MYSQL_YYABORT; + } +#line 29098 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 80: /* execute_using: %empty */ +#line 2132 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 29104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 81: /* $@5: %empty */ +#line 2134 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "EXECUTE..USING"; } +#line 29110 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 82: /* execute_using: USING $@5 execute_params */ +#line 2136 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= (yyvsp[0].item_list); + Lex->clause_that_disallows_subselect= NULL; + } +#line 29119 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 83: /* execute_params: expr_or_ignore_or_default */ +#line 2144 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 29128 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 84: /* execute_params: execute_params ',' expr_or_ignore_or_default */ +#line 2149 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.item_list)= (yyvsp[-2].item_list))->push_back((yyvsp[0].item), thd->mem_root)) + MYSQL_YYABORT; + } +#line 29137 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 85: /* $@6: %empty */ +#line 2160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HELP")); + } +#line 29146 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 86: /* help: HELP_SYM $@6 ident_or_text */ +#line 2165 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_HELP; + lex->help_arg= (yyvsp[0].lex_str).str; + } +#line 29156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 87: /* $@7: %empty */ +#line 2176 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_CHANGE_MASTER; + } +#line 29164 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 88: /* change: CHANGE MASTER_SYM optional_connection_name TO_SYM $@7 master_defs optional_for_channel */ +#line 2181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 29170 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 91: /* master_def: MASTER_HOST_SYM '=' TEXT_STRING_sys */ +#line 2191 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.host = (yyvsp[0].lex_str).str; + } +#line 29178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 92: /* master_def: MASTER_USER_SYM '=' TEXT_STRING_sys */ +#line 2195 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.user = (yyvsp[0].lex_str).str; + } +#line 29186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 93: /* master_def: MASTER_PASSWORD_SYM '=' TEXT_STRING_sys */ +#line 2199 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.password = (yyvsp[0].lex_str).str; + } +#line 29194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 94: /* master_def: MASTER_PORT_SYM '=' ulong_num */ +#line 2203 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.port = (yyvsp[0].ulong_num); + } +#line 29202 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 95: /* master_def: MASTER_CONNECT_RETRY_SYM '=' ulong_num */ +#line 2207 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connect_retry = (yyvsp[0].ulong_num); + } +#line 29210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 96: /* master_def: MASTER_DELAY_SYM '=' ulong_num */ +#line 2211 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].ulong_num) > MASTER_DELAY_MAX) + { + my_error(ER_MASTER_DELAY_VALUE_OUT_OF_RANGE, MYF(0), + (ulong) (yyvsp[0].ulong_num), (ulong) MASTER_DELAY_MAX); + } + else + Lex->mi.sql_delay = (yyvsp[0].ulong_num); + } +#line 29224 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 97: /* master_def: MASTER_SSL_SYM '=' ulong_num */ +#line 2221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 29233 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 98: /* master_def: MASTER_SSL_CA_SYM '=' TEXT_STRING_sys */ +#line 2226 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_ca= (yyvsp[0].lex_str).str; + } +#line 29241 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 99: /* master_def: MASTER_SSL_CAPATH_SYM '=' TEXT_STRING_sys */ +#line 2230 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_capath= (yyvsp[0].lex_str).str; + } +#line 29249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 100: /* master_def: MASTER_SSL_CERT_SYM '=' TEXT_STRING_sys */ +#line 2234 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cert= (yyvsp[0].lex_str).str; + } +#line 29257 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 101: /* master_def: MASTER_SSL_CIPHER_SYM '=' TEXT_STRING_sys */ +#line 2238 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_cipher= (yyvsp[0].lex_str).str; + } +#line 29265 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 102: /* master_def: MASTER_SSL_KEY_SYM '=' TEXT_STRING_sys */ +#line 2242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_key= (yyvsp[0].lex_str).str; + } +#line 29273 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 103: /* master_def: MASTER_SSL_VERIFY_SERVER_CERT_SYM '=' ulong_num */ +#line 2246 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_verify_server_cert= (yyvsp[0].ulong_num) ? + LEX_MASTER_INFO::LEX_MI_ENABLE : LEX_MASTER_INFO::LEX_MI_DISABLE; + } +#line 29282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 104: /* master_def: MASTER_SSL_CRL_SYM '=' TEXT_STRING_sys */ +#line 2251 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crl= (yyvsp[0].lex_str).str; + } +#line 29290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 105: /* master_def: MASTER_SSL_CRLPATH_SYM '=' TEXT_STRING_sys */ +#line 2255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.ssl_crlpath= (yyvsp[0].lex_str).str; + } +#line 29298 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 106: /* master_def: MASTER_HEARTBEAT_PERIOD_SYM '=' NUM_literal */ +#line 2260 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.heartbeat_period= (float) (yyvsp[0].item_num)->val_real(); + if (unlikely(Lex->mi.heartbeat_period > + SLAVE_MAX_HEARTBEAT_PERIOD) || + unlikely(Lex->mi.heartbeat_period < 0.0)) + my_yyabort_error((ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE, MYF(0), + SLAVE_MAX_HEARTBEAT_PERIOD)); + + if (unlikely(Lex->mi.heartbeat_period > slave_net_timeout)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX)); + } + if (unlikely(Lex->mi.heartbeat_period < 0.001)) + { + if (unlikely(Lex->mi.heartbeat_period != 0.0)) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN, + ER_THD(thd, ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN)); + Lex->mi.heartbeat_period= 0.0; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_DISABLE; + } + Lex->mi.heartbeat_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29330 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 107: /* master_def: IGNORE_SERVER_IDS_SYM '=' '(' ignore_server_id_list ')' */ +#line 2288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_server_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 108: /* master_def: DO_DOMAIN_IDS_SYM '=' '(' do_domain_id_list ')' */ +#line 2292 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_do_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29346 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 109: /* master_def: IGNORE_DOMAIN_IDS_SYM '=' '(' ignore_domain_id_list ')' */ +#line 2296 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.repl_ignore_domain_ids_opt= LEX_MASTER_INFO::LEX_MI_ENABLE; + } +#line 29354 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 114: /* ignore_server_id: ulong_num */ +#line 2311 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_server_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 29362 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 118: /* do_domain_id: ulong_num */ +#line 2324 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_do_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 29370 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 122: /* ignore_domain_id: ulong_num */ +#line 2337 "/home/buildbot/git/sql/sql_yacc.yy" + { + insert_dynamic(&Lex->mi.repl_ignore_domain_ids, (uchar*) &((yyvsp[0].ulong_num))); + } +#line 29378 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 123: /* master_file_def: MASTER_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2344 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.log_file_name = (yyvsp[0].lex_str).str; + } +#line 29386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 124: /* master_file_def: MASTER_LOG_POS_SYM '=' ulonglong_num */ +#line 2348 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If the user specified a value < BIN_LOG_HEADER_SIZE, adjust it + instead of causing subsequent errors. + We need to do it in this file, because only there we know that + MASTER_LOG_POS has been explicitly specified. On the contrary + in change_master() (sql_repl.cc) we cannot distinguish between 0 + (MASTER_LOG_POS explicitly specified as 0) and 0 (unspecified), + whereas we want to distinguish (specified 0 means "read the binlog + from 0" (4 in fact), unspecified means "don't change the position + (keep the preceding value)"). + */ + Lex->mi.pos= MY_MAX(BIN_LOG_HEADER_SIZE, (yyvsp[0].ulonglong_number)); + } +#line 29405 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 125: /* master_file_def: RELAY_LOG_FILE_SYM '=' TEXT_STRING_sys */ +#line 2363 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_name = (yyvsp[0].lex_str).str; + } +#line 29413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 126: /* master_file_def: RELAY_LOG_POS_SYM '=' ulong_num */ +#line 2367 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.relay_log_pos = (yyvsp[0].ulong_num); + /* Adjust if < BIN_LOG_HEADER_SIZE (same comment as Lex->mi.pos) */ + Lex->mi.relay_log_pos= MY_MAX(BIN_LOG_HEADER_SIZE, Lex->mi.relay_log_pos); + } +#line 29423 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 127: /* master_file_def: MASTER_USE_GTID_SYM '=' CURRENT_POS_SYM */ +#line 2373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_CURRENT_POS; + } +#line 29433 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 128: /* master_file_def: MASTER_USE_GTID_SYM '=' SLAVE_POS_SYM */ +#line 2379 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_SLAVE_POS; + } +#line 29443 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 129: /* master_file_def: MASTER_USE_GTID_SYM '=' NO_SYM */ +#line 2385 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->mi.use_gtid_opt != LEX_MASTER_INFO::LEX_GTID_UNCHANGED)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MASTER_use_gtid")); + Lex->mi.use_gtid_opt= LEX_MASTER_INFO::LEX_GTID_NO; + } +#line 29453 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 130: /* master_file_def: MASTER_DEMOTE_TO_SLAVE_SYM '=' bool */ +#line 2391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.is_demotion_opt= (bool) (yyvsp[0].ulong_num); + } +#line 29461 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 131: /* optional_connection_name: %empty */ +#line 2398 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->mi.connection_name= null_clex_str; + } +#line 29470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 133: /* connection_name: TEXT_STRING_sys */ +#line 2407 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } +#line 29482 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 134: /* optional_for_channel: %empty */ +#line 2418 "/home/buildbot/git/sql/sql_yacc.yy" + { + /*do nothing */ + } +#line 29490 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 136: /* for_channel: FOR_SYM CHANNEL_SYM TEXT_STRING_sys */ +#line 2427 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->mi.connection_name.str != NULL) + { + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "CONNECTION_NAME AND FOR CHANNEL CAN NOT BE SPECIFIED AT THE SAME TIME)")); + } + else + { + Lex->mi.connection_name= (yyvsp[0].lex_str); +#ifdef HAVE_REPLICATION + if (unlikely(check_master_connection_name(&(yyvsp[0].lex_str)))) + my_yyabort_error((ER_WRONG_ARGUMENTS, MYF(0), "MASTER_CONNECTION_NAME")); +#endif + } + + } +#line 29510 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 137: /* $@8: %empty */ +#line 2448 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_table())) + MYSQL_YYABORT; + lex->create_info.init(); + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->current_select->parsing_place= BEFORE_OPT_LIST; + if (lex->set_command_with_check(SQLCOM_CREATE_TABLE, (yyvsp[-2].num), (yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29526 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 138: /* $@9: %empty */ +#line 2460 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + lex->alter_info.reset(); + /* + For CREATE TABLE we should not open the table even if it exists. + If the table exists, we should either not create it or replace it + */ + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + lex->inc_select_stack_outer_barrier(); + } +#line 29547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 139: /* create: create_or_replace opt_temporary TABLE_SYM opt_if_not_exists $@8 table_ident $@9 create_body */ +#line 2477 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 29557 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 140: /* $@10: %empty */ +#line 2483 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_create_sequence())) + MYSQL_YYABORT; + lex->create_info.init(); + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_SEQUENCE, (yyvsp[-3].num), + (yyvsp[-4].object_ddl_options) | (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_UPDATING, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + + /* + For CREATE TABLE, an non-existing table is not an error. + Instruct open_tables() to just take an MDL lock if the + table does not exist. + */ + lex->alter_info.reset(); + lex->query_tables->open_strategy= TABLE_LIST::OPEN_STUB; + lex->name= null_clex_str; + lex->create_last_non_select_table= lex->last_table(); + if (unlikely(!(lex->create_info.seq_create_info= + new (thd->mem_root) sequence_definition()))) + MYSQL_YYABORT; + } +#line 29591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 141: /* create: create_or_replace opt_temporary SEQUENCE_SYM opt_if_not_exists table_ident $@10 opt_sequence opt_create_table_options */ +#line 2513 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->create_info.seq_create_info->check_and_adjust(1))) + { + my_error(ER_SEQUENCE_INVALID_DATA, MYF(0), + lex->first_select_lex()->table_list.first->db.str, + lex->first_select_lex()->table_list.first-> + table_name.str); + MYSQL_YYABORT; + } + + /* No fields specified, generate them */ + if (unlikely(prepare_sequence_fields(thd, + &lex->alter_info.create_list))) + MYSQL_YYABORT; + + /* CREATE SEQUENCE always creates a sequence */ + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= 1; + + create_table_set_open_action_and_adjust_tables(lex); + Lex->pop_select(); //main select + } +#line 29620 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 142: /* $@11: %empty */ +#line 2538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29629 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 143: /* $@12: %empty */ +#line 2545 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::MULTIPLE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 144: /* create: create_or_replace INDEX_SYM opt_if_not_exists $@11 ident opt_key_algorithm_clause ON table_ident $@12 '(' key_list ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 145: /* $@13: %empty */ +#line 2557 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29657 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 146: /* $@14: %empty */ +#line 2564 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index(Key::UNIQUE, &(yyvsp[-3].ident_sys), (yyvsp[-2].key_alg), (yyvsp[-8].object_ddl_options) | (yyvsp[-5].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29668 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 147: /* create: create_or_replace UNIQUE_SYM INDEX_SYM opt_if_not_exists $@13 ident opt_key_algorithm_clause ON table_ident $@14 '(' key_list opt_without_overlaps ')' opt_lock_wait_timeout normal_key_options opt_index_lock_algorithm */ +#line 2573 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 148: /* $@15: %empty */ +#line 2577 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 149: /* $@16: %empty */ +#line 2583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29696 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 150: /* create: create_or_replace fulltext INDEX_SYM $@15 opt_if_not_exists ident ON table_ident $@16 '(' key_list ')' opt_lock_wait_timeout fulltext_key_options opt_index_lock_algorithm */ +#line 2591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29704 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 151: /* $@17: %empty */ +#line 2595 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 29713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 152: /* $@18: %empty */ +#line 2601 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_create_index_prepare((yyvsp[0].table))) + MYSQL_YYABORT; + if (Lex->add_create_index((yyvsp[-6].key_type), &(yyvsp[-2].ident_sys), HA_KEY_ALG_UNDEF, (yyvsp[-7].object_ddl_options) | (yyvsp[-3].object_ddl_options))) + MYSQL_YYABORT; + } +#line 29724 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 153: /* create: create_or_replace spatial INDEX_SYM $@17 opt_if_not_exists ident ON table_ident $@18 '(' key_list ')' opt_lock_wait_timeout spatial_key_options opt_index_lock_algorithm */ +#line 2609 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 154: /* $@19: %empty */ +#line 2613 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + } +#line 29740 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 155: /* create: create_or_replace DATABASE opt_if_not_exists ident $@19 opt_create_database_options */ +#line 2617 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->set_command_with_check(SQLCOM_CREATE_DB, 0, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + lex->name= (yyvsp[-2].ident_sys); + } +#line 29752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 156: /* $@20: %empty */ +#line 2626 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + if (Lex->add_create_view(thd, (yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), + DTYPE_ALGORITHM_UNDEFINED, (yyvsp[-3].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 29765 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 157: /* create: create_or_replace definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@20 view_list_opt AS view_select */ +#line 2635 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29773 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 158: /* $@21: %empty */ +#line 2640 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_view(thd, (yyvsp[-6].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-5].num), (yyvsp[-3].view_suid), (yyvsp[0].table)))) + MYSQL_YYABORT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->inc_select_stack_outer_barrier(); + } +#line 29785 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 159: /* create: create_or_replace view_algorithm definer_opt opt_view_suid VIEW_SYM opt_if_not_exists table_ident $@21 view_list_opt AS view_select */ +#line 2648 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29793 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 160: /* $@22: %empty */ +#line 2652 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 29803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 161: /* create: create_or_replace definer_opt TRIGGER_SYM $@22 trigger_tail */ +#line 2658 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29811 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 162: /* $@23: %empty */ +#line 2662 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + } +#line 29821 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 163: /* create: create_or_replace definer_opt EVENT_SYM $@23 event_tail */ +#line 2668 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 29829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 164: /* create: create_or_replace USER_SYM opt_if_not_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 2673 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_USER, + (yyvsp[-7].object_ddl_options) | (yyvsp[-5].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 29839 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 165: /* create: create_or_replace ROLE_SYM opt_if_not_exists clear_privileges role_list opt_with_admin */ +#line 2680 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_command_with_check(SQLCOM_CREATE_ROLE, + (yyvsp[-5].object_ddl_options) | (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 29849 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 166: /* $@24: %empty */ +#line 2685 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->set_command(SQLCOM_CREATE_SERVER, (yyvsp[0].object_ddl_options)); } +#line 29855 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 167: /* create: create_or_replace $@24 server_def */ +#line 2687 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 29861 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 169: /* opt_sequence: %empty */ +#line 2692 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 29867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 173: /* sequence_def: MINVALUE_SYM opt_equal longlong_num */ +#line 2703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.seq_create_info->min_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 29876 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 174: /* sequence_def: NO_SYM MINVALUE_SYM */ +#line 2708 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 29886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 175: /* sequence_def: NOMINVALUE_SYM */ +#line 2714 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; + } +#line 29896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 176: /* sequence_def: MAXVALUE_SYM opt_equal longlong_num */ +#line 2720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->max_value= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 29908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 177: /* sequence_def: NO_SYM MAXVALUE_SYM */ +#line 2728 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 29918 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 178: /* sequence_def: NOMAXVALUE_SYM */ +#line 2734 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; + } +#line 29928 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 179: /* sequence_def: START_SYM opt_with longlong_num */ +#line 2740 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_start)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "START")); + Lex->create_info.seq_create_info->start= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_start; + } +#line 29940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 180: /* sequence_def: INCREMENT_SYM opt_by longlong_num */ +#line 2748 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_increment)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "INCREMENT")); + Lex->create_info.seq_create_info->increment= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment; + } +#line 29952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 181: /* sequence_def: CACHE_SYM opt_equal longlong_num */ +#line 2756 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 29964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 182: /* sequence_def: NOCACHE_SYM */ +#line 2764 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); + Lex->create_info.seq_create_info->cache= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; + } +#line 29976 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 183: /* sequence_def: CYCLE_SYM */ +#line 2772 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 1; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 29988 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 184: /* sequence_def: NOCYCLE_SYM */ +#line 2780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); + Lex->create_info.seq_create_info->cycle= 0; + Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; + } +#line 30000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 185: /* sequence_def: RESTART_SYM */ +#line 2788 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart; + } +#line 30016 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 186: /* sequence_def: RESTART_SYM opt_with longlong_num */ +#line 2800 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sql_command != SQLCOM_ALTER_SEQUENCE)) + { + thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); + MYSQL_YYABORT; + } + if (unlikely(Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart)) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); + Lex->create_info.seq_create_info->restart= (yyvsp[0].longlong_number); + Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value; + } +#line 30033 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 187: /* force_lookahead: %empty */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30039 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 188: /* force_lookahead: FORCE_LOOKAHEAD */ +#line 2815 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30045 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 189: /* $@25: %empty */ +#line 2819 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 30055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 190: /* server_def: SERVER_SYM opt_if_not_exists ident_or_text $@25 FOREIGN DATA_SYM WRAPPER_SYM ident_or_text OPTIONS_SYM '(' server_options_list ')' */ +#line 2826 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->server_options.scheme= (yyvsp[-4].lex_str); } +#line 30061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 193: /* server_option: USER_SYM TEXT_STRING_sys */ +#line 2836 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.username.str == 0); + Lex->server_options.username= (yyvsp[0].lex_str); + } +#line 30070 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 194: /* server_option: HOST_SYM TEXT_STRING_sys */ +#line 2841 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.host.str == 0); + Lex->server_options.host= (yyvsp[0].lex_str); + } +#line 30079 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 195: /* server_option: DATABASE TEXT_STRING_sys */ +#line 2846 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.db.str == 0); + Lex->server_options.db= (yyvsp[0].lex_str); + } +#line 30088 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 196: /* server_option: OWNER_SYM TEXT_STRING_sys */ +#line 2851 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.owner.str == 0); + Lex->server_options.owner= (yyvsp[0].lex_str); + } +#line 30097 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 197: /* server_option: PASSWORD_SYM TEXT_STRING_sys */ +#line 2856 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.password.str == 0); + Lex->server_options.password= (yyvsp[0].lex_str); + } +#line 30106 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 198: /* server_option: SOCKET_SYM TEXT_STRING_sys */ +#line 2861 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS(Lex->server_options.socket.str == 0); + Lex->server_options.socket= (yyvsp[0].lex_str); + } +#line 30115 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 199: /* server_option: PORT_SYM ulong_num */ +#line 2866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->server_options.port= (yyvsp[0].ulong_num); + } +#line 30123 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 200: /* $@26: %empty */ +#line 2873 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->stmt_definition_begin= (yyvsp[-2].simple_string); + if (unlikely(lex->add_create_options_with_check((yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + if (unlikely(!(lex->event_parse_data= + Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + lex->event_parse_data->identifier= (yyvsp[0].spname); + lex->event_parse_data->on_completion= + Event_parse_data::ON_COMPLETION_DROP; + + lex->sql_command= SQLCOM_CREATE_EVENT; + /* We need that for disallowing subqueries */ + } +#line 30144 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 201: /* event_tail: remember_name opt_if_not_exists sp_name $@26 ON SCHEDULE_SYM ev_schedule_time opt_ev_on_completion opt_ev_status opt_ev_comment DO_SYM ev_sql_stmt */ +#line 2894 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_CREATE_EVENT; + } +#line 30156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 202: /* $@27: %empty */ +#line 2905 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_expression= (yyvsp[-1].item); + Lex->event_parse_data->interval= (yyvsp[0].interval); + } +#line 30165 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 204: /* ev_schedule_time: AT_SYM expr */ +#line 2912 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_execute_at= (yyvsp[0].item); + } +#line 30173 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 205: /* opt_ev_status: %empty */ +#line 2918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30179 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 206: /* opt_ev_status: ENABLE_SYM */ +#line 2920 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::ENABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30189 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 207: /* opt_ev_status: DISABLE_SYM ON SLAVE */ +#line 2926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::SLAVESIDE_DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30199 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 208: /* opt_ev_status: DISABLE_SYM */ +#line 2932 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->status= Event_parse_data::DISABLED; + Lex->event_parse_data->status_changed= true; + (yyval.num)= 1; + } +#line 30209 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 209: /* ev_starts: %empty */ +#line 2941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, 0); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->event_parse_data->item_starts= item; + } +#line 30220 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 210: /* ev_starts: STARTS_SYM expr */ +#line 2948 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_starts= (yyvsp[0].item); + } +#line 30228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 212: /* ev_ends: ENDS_SYM expr */ +#line 2956 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->item_ends= (yyvsp[0].item); + } +#line 30236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 213: /* opt_ev_on_completion: %empty */ +#line 2962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30242 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 215: /* ev_on_completion: ON COMPLETION_SYM opt_not PRESERVE_SYM */ +#line 2968 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->event_parse_data->on_completion= (yyvsp[-1].num) + ? Event_parse_data::ON_COMPLETION_DROP + : Event_parse_data::ON_COMPLETION_PRESERVE; + (yyval.num)= 1; + } +#line 30253 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 216: /* opt_ev_comment: %empty */ +#line 2977 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 30259 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 217: /* opt_ev_comment: COMMENT_SYM TEXT_STRING_sys */ +#line 2979 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->comment= Lex->event_parse_data->comment= (yyvsp[0].lex_str); + (yyval.num)= 1; + } +#line 30268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 218: /* $@28: %empty */ +#line 2986 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + /* + This stops the following : + - CREATE EVENT ... DO CREATE EVENT ...; + - ALTER EVENT ... DO CREATE EVENT ...; + - CREATE EVENT ... DO ALTER EVENT DO ....; + - CREATE PROCEDURE ... BEGIN CREATE EVENT ... END| + This allows: + - CREATE EVENT ... DO DROP EVENT yyy; + - CREATE EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO ALTER EVENT yyy; + (the nested ALTER EVENT can have anything but DO clause) + - ALTER EVENT ... DO DROP EVENT yyy; + - CREATE PROCEDURE ... BEGIN ALTER EVENT ... END| + (the nested ALTER EVENT can have anything but DO clause) + - CREATE PROCEDURE ... BEGIN DROP EVENT ... END| + */ + if (unlikely(lex->sphead)) + my_yyabort_error((ER_EVENT_RECURSION_FORBIDDEN, MYF(0))); + + if (unlikely(!lex->make_sp_head(thd, + lex->event_parse_data->identifier, + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_ptr()); + } +#line 30305 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 219: /* ev_sql_stmt: $@28 sp_proc_stmt force_lookahead */ +#line 3019 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* return back to the original memory root ASAP */ + if (Lex->sp_body_finalize_event(thd)) + MYSQL_YYABORT; + } +#line 30315 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 220: /* clear_privileges: %empty */ +#line 3028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->users_list.empty(); + lex->first_select_lex()->db= null_clex_str; + lex->account_options.reset(); + } +#line 30326 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 221: /* opt_aggregate: %empty */ +#line 3037 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= NOT_AGGREGATE; } +#line 30332 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 222: /* opt_aggregate: AGGREGATE_SYM */ +#line 3038 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_aggregate_type)= GROUP_AGGREGATE; } +#line 30338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 223: /* sp_handler: FUNCTION_SYM */ +#line 3043 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_function; } +#line 30344 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 224: /* sp_handler: PROCEDURE_SYM */ +#line 3044 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_procedure; } +#line 30350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 225: /* sp_handler: PACKAGE_ORACLE_SYM */ +#line 3045 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_spec; } +#line 30356 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 226: /* sp_handler: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM */ +#line 3046 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_handler)= &sp_handler_package_body; } +#line 30362 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 227: /* sp_name: ident '.' ident */ +#line 3052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30371 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 228: /* sp_name: ident */ +#line 3057 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spname)= Lex->make_sp_name(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 229: /* sp_a_chistics: %empty */ +#line 3064 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 230: /* sp_a_chistics: sp_a_chistics sp_chistic */ +#line 3065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 231: /* sp_c_chistics: %empty */ +#line 3069 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 232: /* sp_c_chistics: sp_c_chistics sp_c_chistic */ +#line 3070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 233: /* sp_chistic: COMMENT_SYM TEXT_STRING_sys */ +#line 3076 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.comment= (yyvsp[0].lex_str); } +#line 30410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 234: /* sp_chistic: LANGUAGE_SYM SQL_SYM */ +#line 3078 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Just parse it, we only have one language for now. */ } +#line 30416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 235: /* sp_chistic: NO_SYM SQL_SYM */ +#line 3080 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_NO_SQL; } +#line 30422 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 236: /* sp_chistic: CONTAINS_SYM SQL_SYM */ +#line 3082 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_CONTAINS_SQL; } +#line 30428 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 237: /* sp_chistic: READS_SYM SQL_SYM DATA_SYM */ +#line 3084 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_READS_SQL_DATA; } +#line 30434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 238: /* sp_chistic: MODIFIES_SYM SQL_SYM DATA_SYM */ +#line 3086 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.daccess= SP_MODIFIES_SQL_DATA; } +#line 30440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 239: /* sp_chistic: sp_suid */ +#line 3088 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.suid= (yyvsp[0].sp_suid); } +#line 30446 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 240: /* sp_c_chistic: sp_chistic */ +#line 3093 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 30452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 241: /* sp_c_chistic: opt_not DETERMINISTIC_SYM */ +#line 3094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.detistic= ! (yyvsp[-1].num); } +#line 30458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 242: /* sp_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 3098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_SUID; } +#line 30464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 243: /* sp_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 3099 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_suid)= SP_IS_NOT_SUID; } +#line 30470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 244: /* $@29: %empty */ +#line 3104 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 245: /* call: CALL_SYM ident $@29 opt_sp_cparam_list */ +#line 3109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 30488 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 246: /* $@30: %empty */ +#line 3114 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30497 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 247: /* call: CALL_SYM ident '.' ident $@30 opt_sp_cparam_list */ +#line 3119 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 30506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 248: /* $@31: %empty */ +#line 3124 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->call_statement_start(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 249: /* call: CALL_SYM ident '.' ident '.' ident $@31 opt_sp_cparam_list */ +#line 3129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 30524 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 254: /* sp_cparams: sp_cparams ',' expr */ +#line 3148 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 30532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 255: /* sp_cparams: expr */ +#line 3152 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_back((yyvsp[0].item), thd->mem_root); + } +#line 30540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 256: /* sp_fdparam_list: %empty */ +#line 3160 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + Lex->sphead->m_param_end= Lex->sphead->m_param_begin; + } +#line 30549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 257: /* $@32: %empty */ +#line 3165 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start(); + } +#line 30557 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 258: /* sp_fdparam_list: $@32 sp_fdparams */ +#line 3169 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 30565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 261: /* sp_param_name: ident */ +#line 3181 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.spvar)= Lex->sp_param_init(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30574 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 266: /* sp_parameter_type: IN_SYM */ +#line 3199 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_IN; } +#line 30580 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 267: /* sp_parameter_type: OUT_SYM */ +#line 3200 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_OUT; } +#line 30586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 268: /* sp_parameter_type: INOUT_SYM */ +#line 3201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_INOUT; } +#line 30592 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 269: /* $@33: %empty */ +#line 3206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= YYLIP->get_cpp_tok_start() + 1; + } +#line 30600 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 270: /* sp_parenthesized_pdparam_list: '(' $@33 sp_pdparam_list ')' */ +#line 3211 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_end= YYLIP->get_cpp_tok_start(); + } +#line 30608 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 272: /* sp_proc_stmts: %empty */ +#line 3221 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 274: /* sp_proc_stmts1: sp_proc_stmt ';' */ +#line 3226 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30620 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 276: /* optionally_qualified_column_ident: sp_decl_ident */ +#line 3233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 277: /* optionally_qualified_column_ident: sp_decl_ident '.' ident */ +#line 3239 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(&(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 278: /* optionally_qualified_column_ident: sp_decl_ident '.' ident '.' ident */ +#line 3245 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.qualified_column_ident)= new (thd->mem_root) + Qualified_column_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 30650 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 279: /* row_field_definition: row_field_name field_type */ +#line 3255 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 30659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 280: /* row_field_definition_list: row_field_definition */ +#line 3263 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition_list)= Row_definition_list::make(thd->mem_root, (yyvsp[0].spvar_definition)))) + MYSQL_YYABORT; + } +#line 30668 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 281: /* row_field_definition_list: row_field_definition_list ',' row_field_definition */ +#line 3268 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.spvar_definition_list)= (yyvsp[-2].spvar_definition_list))->append_uniq(thd->mem_root, (yyvsp[0].spvar_definition))) + MYSQL_YYABORT; + } +#line 30677 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 282: /* row_type_body: '(' row_field_definition_list ')' */ +#line 3275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_definition_list)= (yyvsp[-1].spvar_definition_list); } +#line 30683 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 283: /* sp_decl_idents_init_vars: sp_decl_idents */ +#line 3280 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_variable_declarations_init(thd, (yyvsp[0].num)); + } +#line 30691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 284: /* $@34: %empty */ +#line 3288 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_ROUTINE_LOCAL); + } +#line 30700 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 285: /* sp_decl_variable_list: sp_decl_idents_init_vars field_type $@34 sp_opt_default */ +#line 3293 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_finalize(thd, (yyvsp[-3].num), + &Lex->last_field[0], + (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 30712 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 286: /* sp_decl_variable_list: sp_decl_idents_init_vars ROW_SYM row_type_body sp_opt_default */ +#line 3303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_row_finalize(thd, (yyvsp[-3].num), (yyvsp[-1].spvar_definition_list), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-3].num)); + } +#line 30722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 288: /* $@35: %empty */ +#line 3313 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_init(thd, (yyvsp[-2].num)))) + MYSQL_YYABORT; + } +#line 30731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 289: /* sp_decl_handler: sp_handler_type HANDLER_SYM FOR_SYM $@35 sp_hcond_list sp_proc_stmt */ +#line 3318 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_finalize(thd, (yyvsp[-5].num)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).curs= 0; + (yyval.spblock).hndlrs= 1; + } +#line 30742 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 292: /* sp_cursor_stmt_lex: %empty */ +#line 3333 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->lex->sphead); + if (unlikely(!((yyval.sp_cursor_stmt)= new (thd->mem_root) + sp_lex_cursor(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 30753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 293: /* $@36: %empty */ +#line 3343 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].sp_cursor_stmt)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 30764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 294: /* sp_cursor_stmt: sp_cursor_stmt_lex $@36 select */ +#line 3350 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex == (yyvsp[-2].sp_cursor_stmt)); + Lex->pop_select(); //main select + if (unlikely((yyvsp[-2].sp_cursor_stmt)->stmt_finalize(thd)) || + unlikely((yyvsp[-2].sp_cursor_stmt)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + (yyval.sp_cursor_stmt)= (yyvsp[-2].sp_cursor_stmt); + } +#line 30777 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 295: /* sp_handler_type: EXIT_MARIADB_SYM */ +#line 3361 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 30783 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 296: /* sp_handler_type: CONTINUE_MARIADB_SYM */ +#line 3362 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 30789 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 297: /* sp_handler_type: EXIT_ORACLE_SYM */ +#line 3363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::EXIT; } +#line 30795 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 298: /* sp_handler_type: CONTINUE_ORACLE_SYM */ +#line 3364 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= sp_handler::CONTINUE; } +#line 30801 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 299: /* sp_hcond_list: sp_hcond_element */ +#line 3370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 30807 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 300: /* sp_hcond_list: sp_hcond_list ',' sp_hcond_element */ +#line 3372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)+= 1; } +#line 30813 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 301: /* sp_hcond_element: sp_hcond */ +#line 3377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *ctx= lex->spcont->parent_context(); + + if (unlikely(ctx->check_duplicate_handler((yyvsp[0].spcondvalue)))) + my_yyabort_error((ER_SP_DUP_HANDLER, MYF(0))); + + sp_instr_hpush_jump *i= (sp_instr_hpush_jump *)sp->last_instruction(); + i->add_condition((yyvsp[0].spcondvalue)); + } +#line 30829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 302: /* sp_cond: ulong_num */ +#line 3392 "/home/buildbot/git/sql/sql_yacc.yy" + { /* mysql errno */ + if (unlikely((yyvsp[0].ulong_num) == 0)) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "CONDITION", "0")); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].ulong_num)); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 304: /* sqlstate: SQLSTATE_SYM opt_value TEXT_STRING_literal */ +#line 3404 "/home/buildbot/git/sql/sql_yacc.yy" + { /* SQLSTATE */ + + /* + An error is triggered: + - if the specified string is not a valid SQLSTATE, + - or if it represents the completion condition -- it is not + allowed to SIGNAL, or declare a handler for the completion + condition. + */ + if (unlikely(!is_sqlstate_valid(&(yyvsp[0].lex_str)) || + is_sqlstate_completion((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_SP_BAD_SQLSTATE, MYF(0), (yyvsp[0].lex_str).str)); + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value((yyvsp[0].lex_str).str); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30862 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 305: /* opt_value: %empty */ +#line 3423 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30868 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 306: /* opt_value: VALUE_SYM */ +#line 3424 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 30874 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 307: /* sp_hcond: sp_cond */ +#line 3429 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= (yyvsp[0].spcondvalue); + } +#line 30882 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 308: /* sp_hcond: ident */ +#line 3433 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= Lex->spcont->find_declared_or_predefined_condition(thd, &(yyvsp[0].ident_sys)); + if (unlikely((yyval.spcondvalue) == NULL)) + my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 30892 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 309: /* sp_hcond: SQLWARNING_SYM */ +#line 3439 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::WARNING); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 310: /* sp_hcond: not FOUND_SYM */ +#line 3445 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::NOT_FOUND); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30912 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 311: /* sp_hcond: SQLEXCEPTION_SYM */ +#line 3451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30922 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 312: /* sp_hcond: OTHERS_ORACLE_SYM */ +#line 3457 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spcondvalue)= new (thd->mem_root) sp_condition_value(sp_condition_value::EXCEPTION); + if (unlikely((yyval.spcondvalue) == NULL)) + MYSQL_YYABORT; + } +#line 30932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 313: /* raise_stmt_oracle: RAISE_ORACLE_SYM opt_set_signal_information */ +#line 3467 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 30941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 314: /* raise_stmt_oracle: RAISE_ORACLE_SYM signal_value opt_set_signal_information */ +#line 3472 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 30950 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 315: /* signal_stmt: SIGNAL_SYM signal_value opt_set_signal_information */ +#line 3480 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_signal_statement(thd, (yyvsp[-1].spcondvalue))) + MYSQL_YYABORT; + } +#line 30959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 316: /* signal_value: ident */ +#line 3488 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spcondvalue)= Lex->stmt_signal_value((yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 30968 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 317: /* signal_value: sqlstate */ +#line 3493 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 30974 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 318: /* opt_signal_value: %empty */ +#line 3498 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= NULL; } +#line 30980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 319: /* opt_signal_value: signal_value */ +#line 3500 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spcondvalue)= (yyvsp[0].spcondvalue); } +#line 30986 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 320: /* opt_set_signal_information: %empty */ +#line 3505 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->m_parser_state->m_yacc.m_set_signal_info.clear(); + } +#line 30994 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 322: /* signal_information_item_list: signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3513 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + info->clear(); + info->m_item[index]= (yyvsp[0].item); + } +#line 31006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 323: /* signal_information_item_list: signal_information_item_list ',' signal_condition_information_item_name '=' signal_allowed_expr */ +#line 3522 "/home/buildbot/git/sql/sql_yacc.yy" + { + Set_signal_information *info; + info= &thd->m_parser_state->m_yacc.m_set_signal_info; + int index= (int) (yyvsp[-2].diag_condition_item_name); + if (unlikely(info->m_item[index] != NULL)) + my_yyabort_error((ER_DUP_SIGNAL_SET, MYF(0), + Diag_condition_item_names[index].str)); + info->m_item[index]= (yyvsp[0].item); + } +#line 31020 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 324: /* signal_allowed_expr: literal */ +#line 3538 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31026 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 325: /* signal_allowed_expr: variable */ +#line 3540 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].item)->type() == Item::FUNC_ITEM) + { + Item_func *item= (Item_func*) (yyvsp[0].item); + if (unlikely(item->functype() == Item_func::SUSERVAR_FUNC)) + { + /* + Don't allow the following syntax: + SIGNAL/RESIGNAL ... + SET = @foo := expr + */ + thd->parse_error(); + MYSQL_YYABORT; + } + } + (yyval.item)= (yyvsp[0].item); + } +#line 31048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 326: /* signal_allowed_expr: simple_ident */ +#line 3558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 327: /* signal_condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CLASS_ORIGIN; } +#line 31060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 328: /* signal_condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3566 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SUBCLASS_ORIGIN; } +#line 31066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 329: /* signal_condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_CATALOG; } +#line 31072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 330: /* signal_condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_SCHEMA; } +#line 31078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 331: /* signal_condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3572 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CONSTRAINT_NAME; } +#line 31084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 332: /* signal_condition_information_item_name: CATALOG_NAME_SYM */ +#line 3574 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CATALOG_NAME; } +#line 31090 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 333: /* signal_condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_SCHEMA_NAME; } +#line 31096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 334: /* signal_condition_information_item_name: TABLE_NAME_SYM */ +#line 3578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_TABLE_NAME; } +#line 31102 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 335: /* signal_condition_information_item_name: COLUMN_NAME_SYM */ +#line 3580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_COLUMN_NAME; } +#line 31108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 336: /* signal_condition_information_item_name: CURSOR_NAME_SYM */ +#line 3582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_CURSOR_NAME; } +#line 31114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 337: /* signal_condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MESSAGE_TEXT; } +#line 31120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 338: /* signal_condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_MYSQL_ERRNO; } +#line 31126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 339: /* signal_condition_information_item_name: ROW_NUMBER_SYM */ +#line 3588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_condition_item_name)= DIAG_ROW_NUMBER; } +#line 31132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 340: /* resignal_stmt: RESIGNAL_SYM opt_signal_value opt_set_signal_information */ +#line 3593 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_resignal_statement(thd, (yyvsp[-1].spcondvalue)))) + MYSQL_YYABORT; + } +#line 31141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 341: /* get_diagnostics: GET_SYM which_area DIAGNOSTICS_SYM diagnostics_information */ +#line 3601 "/home/buildbot/git/sql/sql_yacc.yy" + { + Diagnostics_information *info= (yyvsp[0].diag_info); + + info->set_which_da((yyvsp[-2].diag_area)); + + Lex->sql_command= SQLCOM_GET_DIAGNOSTICS; + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_get_diagnostics(info); + + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 31157 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 342: /* which_area: %empty */ +#line 3616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31163 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 343: /* which_area: CURRENT_SYM */ +#line 3618 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.diag_area)= Diagnostics_information::CURRENT_AREA; } +#line 31169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 344: /* diagnostics_information: statement_information */ +#line 3623 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Statement_information((yyvsp[0].stmt_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31179 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 345: /* diagnostics_information: CONDITION_SYM condition_number condition_information */ +#line 3629 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.diag_info)= new (thd->mem_root) Condition_information((yyvsp[-1].item), (yyvsp[0].cond_info_list)); + if (unlikely((yyval.diag_info) == NULL)) + MYSQL_YYABORT; + } +#line 31189 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 346: /* statement_information: statement_information_item */ +#line 3638 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.stmt_info_list) == NULL) || + unlikely((yyval.stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 31200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 347: /* statement_information: statement_information ',' statement_information_item */ +#line 3645 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].stmt_info_list)->push_back((yyvsp[0].stmt_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.stmt_info_list)= (yyvsp[-2].stmt_info_list); + } +#line 31210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 348: /* statement_information_item: simple_target_specification '=' statement_information_item_name */ +#line 3654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.stmt_info_item)= new (thd->mem_root) Statement_information_item((yyvsp[0].stmt_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.stmt_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 31220 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 349: /* simple_target_specification: ident_cli */ +#line 3663 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= thd->lex->create_item_for_sp_var(&(yyvsp[0].ident_cli), NULL)))) + MYSQL_YYABORT; + } +#line 31229 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 350: /* simple_target_specification: '@' ident_or_text */ +#line 3668 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 31244 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 351: /* statement_information_item_name: NUMBER_MARIADB_SYM */ +#line 3682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31250 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 352: /* statement_information_item_name: NUMBER_ORACLE_SYM */ +#line 3684 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::NUMBER; } +#line 31256 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 353: /* statement_information_item_name: ROW_COUNT_SYM */ +#line 3686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.stmt_info_item_name)= Statement_information_item::ROW_COUNT; } +#line 31262 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 354: /* condition_number: signal_allowed_expr */ +#line 3695 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 31268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 355: /* condition_information: condition_information_item */ +#line 3700 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_list)= new (thd->mem_root) List; + if (unlikely((yyval.cond_info_list) == NULL) || + unlikely((yyval.cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 31279 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 356: /* condition_information: condition_information ',' condition_information_item */ +#line 3707 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].cond_info_list)->push_back((yyvsp[0].cond_info_item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.cond_info_list)= (yyvsp[-2].cond_info_list); + } +#line 31289 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 357: /* condition_information_item: simple_target_specification '=' condition_information_item_name */ +#line 3716 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.cond_info_item)= new (thd->mem_root) Condition_information_item((yyvsp[0].cond_info_item_name), (yyvsp[-2].item)); + if (unlikely((yyval.cond_info_item) == NULL)) + MYSQL_YYABORT; + } +#line 31299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 358: /* condition_information_item_name: CLASS_ORIGIN_SYM */ +#line 3725 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CLASS_ORIGIN; } +#line 31305 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 359: /* condition_information_item_name: SUBCLASS_ORIGIN_SYM */ +#line 3727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SUBCLASS_ORIGIN; } +#line 31311 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 360: /* condition_information_item_name: CONSTRAINT_CATALOG_SYM */ +#line 3729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_CATALOG; } +#line 31317 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 361: /* condition_information_item_name: CONSTRAINT_SCHEMA_SYM */ +#line 3731 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_SCHEMA; } +#line 31323 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 362: /* condition_information_item_name: CONSTRAINT_NAME_SYM */ +#line 3733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CONSTRAINT_NAME; } +#line 31329 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 363: /* condition_information_item_name: CATALOG_NAME_SYM */ +#line 3735 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CATALOG_NAME; } +#line 31335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 364: /* condition_information_item_name: SCHEMA_NAME_SYM */ +#line 3737 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::SCHEMA_NAME; } +#line 31341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 365: /* condition_information_item_name: TABLE_NAME_SYM */ +#line 3739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::TABLE_NAME; } +#line 31347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 366: /* condition_information_item_name: COLUMN_NAME_SYM */ +#line 3741 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::COLUMN_NAME; } +#line 31353 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 367: /* condition_information_item_name: CURSOR_NAME_SYM */ +#line 3743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::CURSOR_NAME; } +#line 31359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 368: /* condition_information_item_name: MESSAGE_TEXT_SYM */ +#line 3745 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MESSAGE_TEXT; } +#line 31365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 369: /* condition_information_item_name: MYSQL_ERRNO_SYM */ +#line 3747 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::MYSQL_ERRNO; } +#line 31371 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 370: /* condition_information_item_name: RETURNED_SQLSTATE_SYM */ +#line 3749 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::RETURNED_SQLSTATE; } +#line 31377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 371: /* condition_information_item_name: ROW_NUMBER_SYM */ +#line 3751 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.cond_info_item_name)= Condition_information_item::ROW_NUMBER; } +#line 31383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 373: /* sp_decl_ident: keyword_sp_decl */ +#line 3757 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_ident_cli(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 31392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 374: /* sp_decl_idents: sp_decl_ident */ +#line 3765 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= 1; + } +#line 31408 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 375: /* sp_decl_idents: sp_decl_idents ',' ident */ +#line 3777 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* NOTE: field definition is filled in sp_decl section. */ + + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + + if (unlikely(spc->find_variable(&(yyvsp[0].ident_sys), TRUE))) + my_yyabort_error((ER_SP_DUP_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + spc->add_variable(thd, &(yyvsp[0].ident_sys)); + (yyval.num)= (yyvsp[-2].num) + 1; + } +#line 31424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 376: /* $@37: %empty */ +#line 3792 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sphead->new_cont_backpatch(NULL); + } +#line 31434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 377: /* sp_proc_stmt_if: IF_SYM $@37 sp_if END IF_SYM */ +#line 3798 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sphead->do_cont_backpatch(); } +#line 31440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 378: /* $@38: %empty */ +#line 3802 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + lex->sphead->reset_lex(thd); + /* + We should not push main select here, it will be done or not + done by the statement, we just provide only a new LEX for the + statement here as if it is start of parsing a new statement. + */ + lex->sphead->m_tmp_query= lip->get_tok_start(); + } +#line 31457 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 379: /* sp_proc_stmt_statement: $@38 sp_statement */ +#line 3815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->sp_proc_stmt_statement_finalize(thd, yychar == YYEMPTY) || + Lex->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 31467 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 382: /* $@39: %empty */ +#line 3830 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= (yyvsp[0].expr_lex)->sphead; + if (unlikely(sp->m_handler->add_instr_freturn(thd, sp, (yyvsp[0].expr_lex)->spcont, + (yyvsp[0].expr_lex)->get_item(), (yyvsp[0].expr_lex)))) + MYSQL_YYABORT; + } +#line 31478 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 383: /* sp_proc_stmt_return: RETURN_ALLMODES_SYM expr_lex $@39 */ +#line 3836 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 384: /* sp_proc_stmt_return: RETURN_ORACLE_SYM */ +#line 3838 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + if (unlikely(sp->m_handler->add_instr_preturn(thd, sp, + lex->spcont))) + MYSQL_YYABORT; + } +#line 31496 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 385: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM */ +#line 3849 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, NULL))) + MYSQL_YYABORT; + } +#line 31505 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 386: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident */ +#line 3854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_exit_statement(thd, &(yyvsp[0].ident_sys), NULL))) + MYSQL_YYABORT; + } +#line 31514 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 387: /* $@40: %empty */ +#line 3859 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 31523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 388: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM WHEN_SYM expr_lex $@40 */ +#line 3863 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31529 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 389: /* $@41: %empty */ +#line 3865 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_exit_statement(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].expr_lex)->get_item()))) + MYSQL_YYABORT; + } +#line 31538 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 390: /* sp_proc_stmt_exit_oracle: EXIT_ORACLE_SYM label_ident WHEN_SYM expr_lex $@41 */ +#line 3869 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31544 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 391: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM */ +#line 3874 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd))) + MYSQL_YYABORT; + } +#line 31553 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 392: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident */ +#line 3879 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_continue_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 393: /* $@42: %empty */ +#line 3884 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd))) + MYSQL_YYABORT; + } +#line 31571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 394: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM WHEN_SYM expr_lex $@42 */ +#line 3888 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31577 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 395: /* $@43: %empty */ +#line 3890 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->sp_continue_when_statement(thd, &(yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 31586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 396: /* sp_proc_stmt_continue_oracle: CONTINUE_ORACLE_SYM label_ident WHEN_SYM expr_lex $@43 */ +#line 3894 "/home/buildbot/git/sql/sql_yacc.yy" + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } +#line 31592 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 397: /* sp_proc_stmt_leave: LEAVE_SYM label_ident */ +#line 3900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_leave_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31601 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 398: /* sp_proc_stmt_iterate: ITERATE_SYM label_ident */ +#line 3908 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_iterate_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 399: /* sp_proc_stmt_goto_oracle: GOTO_ORACLE_SYM label_ident */ +#line 3916 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_goto_statement(thd, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 31619 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 400: /* @44: %empty */ +#line 3924 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.expr_lex)= new (thd->mem_root) + sp_expr_lex(thd, thd->lex)))) + MYSQL_YYABORT; + Lex->sphead->reset_lex(thd, (yyval.expr_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 31633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 401: /* expr_lex: @44 expr */ +#line 3934 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.expr_lex)= (yyvsp[-1].expr_lex); + (yyval.expr_lex)->set_item((yyvsp[0].item)); + Lex->pop_select(); //min select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + if ((yyval.expr_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 31647 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 402: /* assignment_source_lex: %empty */ +#line 3947 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->sphead); + if (unlikely(!((yyval.assignment_lex)= new (thd->mem_root) + sp_assignment_lex(thd, thd->lex)))) + MYSQL_YYABORT; + } +#line 31658 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 403: /* $@45: %empty */ +#line 3957 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(thd->free_list == NULL); + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 31669 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 404: /* assignment_source_expr: assignment_source_lex $@45 expr */ +#line 3964 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), thd->free_list); + thd->free_list= NULL; + Lex->pop_select(); //min select + if ((yyval.assignment_lex)->sphead->restore_lex(thd)) + MYSQL_YYABORT; + } +#line 31683 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 405: /* $@46: %empty */ +#line 3977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->reset_lex(thd, (yyvsp[0].assignment_lex)); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + Lex->current_select->parsing_place= FOR_LOOP_BOUND; + } +#line 31694 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 406: /* for_loop_bound_expr: assignment_source_lex $@46 expr */ +#line 3984 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].assignment_lex) == thd->lex); + (yyval.assignment_lex)= (yyvsp[-2].assignment_lex); + (yyval.assignment_lex)->set_item_and_free_list((yyvsp[0].item), NULL); + Lex->pop_select(); //main select + if (unlikely((yyval.assignment_lex)->sphead->restore_lex(thd))) + MYSQL_YYABORT; + Lex->current_select->parsing_place= NO_MATTER; + } +#line 31708 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 407: /* cursor_actual_parameters: assignment_source_expr */ +#line 3997 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.sp_assignment_lex_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 31718 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 408: /* cursor_actual_parameters: cursor_actual_parameters ',' assignment_source_expr */ +#line 4003 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.sp_assignment_lex_list)= (yyvsp[-2].sp_assignment_lex_list); + (yyval.sp_assignment_lex_list)->push_back((yyvsp[0].assignment_lex), thd->mem_root); + } +#line 31727 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 409: /* opt_parenthesized_cursor_actual_parameters: %empty */ +#line 4010 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= NULL; } +#line 31733 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 410: /* opt_parenthesized_cursor_actual_parameters: '(' cursor_actual_parameters ')' */ +#line 4011 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_assignment_lex_list)= (yyvsp[-1].sp_assignment_lex_list); } +#line 31739 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 414: /* sp_proc_stmt_open: OPEN_SYM ident opt_parenthesized_cursor_actual_parameters */ +#line 4022 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_open_cursor(thd, &(yyvsp[-1].ident_sys), (yyvsp[0].sp_assignment_lex_list)))) + MYSQL_YYABORT; + } +#line 31748 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 415: /* sp_proc_stmt_fetch_head: FETCH_SYM ident INTO */ +#line 4030 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 31757 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 416: /* sp_proc_stmt_fetch_head: FETCH_SYM FROM ident INTO */ +#line 4035 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 31766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 417: /* sp_proc_stmt_fetch_head: FETCH_SYM NEXT_SYM FROM ident INTO */ +#line 4040 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_cfetch(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + } +#line 31775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 418: /* sp_proc_stmt_fetch: sp_proc_stmt_fetch_head sp_fetch_list */ +#line 4047 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 31781 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 419: /* sp_proc_stmt_fetch: FETCH_SYM GROUP_SYM NEXT_SYM ROW_SYM */ +#line 4049 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_add_agg_cfetch())) + MYSQL_YYABORT; + } +#line 31790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 420: /* sp_proc_stmt_close: CLOSE_SYM ident */ +#line 4057 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint offset; + sp_instr_cclose *i; + + if (unlikely(!lex->spcont->find_cursor(&(yyvsp[0].ident_sys), &offset, false))) + my_yyabort_error((ER_SP_CURSOR_MISMATCH, MYF(0), (yyvsp[0].ident_sys).str)); + i= new (thd->mem_root) + sp_instr_cclose(sp->instructions(), lex->spcont, offset); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 31809 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 421: /* sp_fetch_list: ident */ +#line 4075 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 31829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 422: /* sp_fetch_list: sp_fetch_list ',' ident */ +#line 4091 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + sp_pcontext *spc= lex->spcont; + sp_variable *spv= likely(spc != NULL) + ? spc->find_variable(&(yyvsp[0].ident_sys), false) + : NULL; + + if (unlikely(!spv)) + my_yyabort_error((ER_SP_UNDECLARED_VAR, MYF(0), (yyvsp[0].ident_sys).str)); + + /* An SP local variable */ + sp_instr_cfetch *i= (sp_instr_cfetch *)sp->last_instruction(); + i->add_to_varlist(spv); + } +#line 31849 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 423: /* $@47: %empty */ +#line 4110 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_if_expr(thd))) + MYSQL_YYABORT; + } +#line 31858 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 424: /* $@48: %empty */ +#line 4115 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-3].expr_lex)->sp_if_after_statements(thd))) + MYSQL_YYABORT; + } +#line 31867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 425: /* sp_if: expr_lex THEN_SYM $@47 sp_if_then_statements $@48 sp_elseifs */ +#line 4120 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sphead->backpatch(lex->spcont->pop_label()); + } +#line 31877 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 430: /* $@49: %empty */ +#line 4136 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + + /** + An example of the CASE statement in use is +
    +            CREATE PROCEDURE proc_19194_simple(i int)
    +            BEGIN
    +              DECLARE str CHAR(10);
    +
    +              CASE i
    +                WHEN 1 THEN SET str="1";
    +                WHEN 2 THEN SET str="2";
    +                WHEN 3 THEN SET str="3";
    +                ELSE SET str="unknown";
    +              END CASE;
    +
    +              SELECT str;
    +            END
    +            
    + The actions are used to generate the following code: +
    +            SHOW PROCEDURE CODE proc_19194_simple;
    +            Pos     Instruction
    +            0       set str@1 NULL
    +            1       set_case_expr (12) 0 i@0
    +            2       jump_if_not 5(12) (case_expr@0 = 1)
    +            3       set str@1 _latin1'1'
    +            4       jump 12
    +            5       jump_if_not 8(12) (case_expr@0 = 2)
    +            6       set str@1 _latin1'2'
    +            7       jump 12
    +            8       jump_if_not 11(12) (case_expr@0 = 3)
    +            9       set str@1 _latin1'3'
    +            10      jump 12
    +            11      set str@1 _latin1'unknown'
    +            12      stmt 0 "SELECT str"
    +            
    + */ + + Lex->sphead->new_cont_backpatch(NULL); + + /* + BACKPATCH: Creating target label for the jump to after END CASE + (instruction 12 in the example) + */ + Lex->spcont->push_label(thd, &empty_clex_str, Lex->sphead->instructions()); + } +#line 31931 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 431: /* case_stmt_specification: CASE_SYM $@49 case_stmt_body else_clause_opt END CASE_SYM */ +#line 4189 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + BACKPATCH: Resolving forward jump from + "case_stmt_action_then" to after END CASE + (jump from instruction 4 to 12, 7 to 12 ... in the example) + */ + Lex->sphead->backpatch(Lex->spcont->pop_label()); + + if ((yyvsp[-3].num)) + Lex->spcont->pop_case_expr_id(); + + Lex->sphead->do_cont_backpatch(); + } +#line 31949 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 432: /* $@50: %empty */ +#line 4206 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_expr())) + MYSQL_YYABORT; + } +#line 31958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 433: /* case_stmt_body: expr_lex $@50 simple_when_clause_list */ +#line 4211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 31964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 434: /* case_stmt_body: searched_when_clause_list */ +#line 4213 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 31970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 439: /* $@51: %empty */ +#line 4228 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Simple case: = */ + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(true))) + MYSQL_YYABORT; + } +#line 31980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 440: /* simple_when_clause: WHEN_SYM expr_lex $@51 THEN_SYM sp_case_then_statements */ +#line 4235 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 31989 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 441: /* $@52: %empty */ +#line 4243 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].expr_lex)->case_stmt_action_when(false))) + MYSQL_YYABORT; + } +#line 31998 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 442: /* searched_when_clause: WHEN_SYM expr_lex $@52 THEN_SYM sp_case_then_statements */ +#line 4249 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->case_stmt_action_then())) + MYSQL_YYABORT; + } +#line 32007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 443: /* else_clause_opt: %empty */ +#line 4257 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_head *sp= lex->sphead; + uint ip= sp->instructions(); + sp_instr_error *i= new (thd->mem_root) + sp_instr_error(ip, lex->spcont, ER_SP_CASE_NOT_FOUND); + if (unlikely(i == NULL) || + unlikely(sp->add_instr(i))) + MYSQL_YYABORT; + } +#line 32022 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 445: /* sp_opt_label: %empty */ +#line 4271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 32028 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 446: /* sp_opt_label: label_ident */ +#line 4272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 32034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 447: /* opt_sp_for_loop_direction: %empty */ +#line 4277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 32040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 448: /* opt_sp_for_loop_direction: REVERSE_SYM */ +#line 4278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= -1; } +#line 32046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 449: /* sp_for_loop_index_and_bounds: ident_for_loop_index sp_for_loop_bounds */ +#line 4283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_declarations(thd, &(yyval.for_loop), &(yyvsp[-1].ident_sys), (yyvsp[0].for_loop_bounds)))) + MYSQL_YYABORT; + } +#line 32055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 450: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr DOT_DOT_SYM for_loop_bound_expr */ +#line 4292 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds)= Lex_for_loop_bounds_intrange((yyvsp[-3].num), (yyvsp[-2].assignment_lex), (yyvsp[0].assignment_lex)); + } +#line 32063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 451: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction for_loop_bound_expr */ +#line 4296 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.for_loop_bounds).m_direction= (yyvsp[-1].num); + (yyval.for_loop_bounds).m_index= (yyvsp[0].assignment_lex); + (yyval.for_loop_bounds).m_target_bound= NULL; + (yyval.for_loop_bounds).m_implicit_cursor= false; + } +#line 32074 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 452: /* sp_for_loop_bounds: IN_SYM opt_sp_for_loop_direction '(' sp_cursor_stmt ')' */ +#line 4303 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_implicit_cursor_statement(thd, &(yyval.for_loop_bounds), + (yyvsp[-1].sp_cursor_stmt)))) + MYSQL_YYABORT; + } +#line 32084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 453: /* loop_body: sp_proc_stmts1 END LOOP_SYM */ +#line 4312 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + uint ip= lex->sphead->instructions(); + sp_label *lab= lex->spcont->last_label(); /* Jumping back */ + sp_instr_jump *i= new (thd->mem_root) + sp_instr_jump(ip, lex->spcont, lab->ip); + if (unlikely(i == NULL) || + unlikely(lex->sphead->add_instr(i))) + MYSQL_YYABORT; + } +#line 32099 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 454: /* repeat_body: sp_proc_stmts1 UNTIL_SYM expr_lex END REPEAT_SYM */ +#line 4326 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].expr_lex)->sp_repeat_loop_finalize(thd)) + MYSQL_YYABORT; + } +#line 32108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 455: /* pop_sp_loop_label: sp_opt_label */ +#line 4334 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_pop_loop_label(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 32117 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 456: /* $@53: %empty */ +#line 4342 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 457: /* sp_labeled_control: sp_control_label LOOP_SYM $@53 loop_body pop_sp_loop_label */ +#line 4347 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 458: /* $@54: %empty */ +#line 4349 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 459: /* sp_labeled_control: sp_control_label WHILE_SYM $@54 while_body pop_sp_loop_label */ +#line 4354 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32147 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 460: /* $@55: %empty */ +#line 4356 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 461: /* $@56: %empty */ +#line 4361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-3].lex_str)))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32167 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 462: /* $@57: %empty */ +#line 4368 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 32176 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 463: /* sp_labeled_control: sp_control_label FOR_SYM $@55 sp_for_loop_index_and_bounds $@56 for_loop_statements $@57 pop_sp_loop_label */ +#line 4373 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-4].for_loop)))) + MYSQL_YYABORT; + } +#line 32185 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 464: /* $@58: %empty */ +#line 4378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_label(thd, &(yyvsp[-1].lex_str)))) + MYSQL_YYABORT; + } +#line 32194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 465: /* sp_labeled_control: sp_control_label REPEAT_SYM $@58 repeat_body pop_sp_loop_label */ +#line 4383 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 32200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 466: /* $@59: %empty */ +#line 4388 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32209 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 467: /* sp_unlabeled_control: LOOP_SYM $@59 loop_body */ +#line 4393 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32217 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 468: /* $@60: %empty */ +#line 4397 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32226 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 469: /* sp_unlabeled_control: WHILE_SYM $@60 while_body */ +#line 4402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 470: /* $@61: %empty */ +#line 4406 "/home/buildbot/git/sql/sql_yacc.yy" + { + // See "The FOR LOOP statement" comments in sql_lex.cc + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); // The outer DECLARE..BEGIN..END block + } +#line 32245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 471: /* $@62: %empty */ +#line 4413 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) // The inner WHILE block + MYSQL_YYABORT; + if (unlikely(Lex->sp_for_loop_condition_test(thd, (yyvsp[0].for_loop)))) + MYSQL_YYABORT; + } +#line 32256 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 472: /* sp_unlabeled_control: FOR_SYM $@61 sp_for_loop_index_and_bounds $@62 for_loop_statements */ +#line 4420 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_for_loop_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + Lex->sp_pop_loop_empty_label(thd); // The inner WHILE block + if (unlikely(Lex->sp_for_loop_outer_block_finalize(thd, (yyvsp[-2].for_loop)))) + MYSQL_YYABORT; + } +#line 32268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 473: /* $@63: %empty */ +#line 4428 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_loop_empty_label(thd))) + MYSQL_YYABORT; + } +#line 32277 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 474: /* sp_unlabeled_control: REPEAT_SYM $@63 repeat_body */ +#line 4433 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_pop_loop_empty_label(thd); + } +#line 32285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 475: /* trg_action_time: BEFORE_SYM */ +#line 4440 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_BEFORE; } +#line 32291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 476: /* trg_action_time: AFTER_SYM */ +#line 4442 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.action_time= TRG_ACTION_AFTER; } +#line 32297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 477: /* trg_event: INSERT */ +#line 4447 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_INSERT; } +#line 32303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 478: /* trg_event: UPDATE_SYM */ +#line 4449 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_UPDATE; } +#line 32309 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 479: /* trg_event: DELETE_SYM */ +#line 4451 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->trg_chistics.event= TRG_EVENT_DELETE; } +#line 32315 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 480: /* $@64: %empty */ +#line 4456 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.option_list= NULL; } +#line 32321 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 481: /* create_body: create_field_list_parens $@64 opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32327 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 482: /* create_body: opt_create_table_options opt_create_partitioning opt_create_select */ +#line 4458 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32333 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 483: /* create_body: create_like */ +#line 4460 "/home/buildbot/git/sql/sql_yacc.yy" + { + + Lex->create_info.add(DDL_options_st::OPT_LIKE); + TABLE_LIST *src_table= Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, 0, TL_READ, MDL_SHARED_READ); + if (unlikely(! src_table)) + MYSQL_YYABORT; + /* CREATE TABLE ... LIKE is not allowed for views. */ + src_table->required_type= TABLE_TYPE_NORMAL; + } +#line 32348 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 484: /* create_like: LIKE table_ident */ +#line 4473 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[0].table); } +#line 32354 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 485: /* create_like: LEFT_PAREN_LIKE LIKE table_ident ')' */ +#line 4474 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table)= (yyvsp[-1].table); } +#line 32360 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 486: /* opt_create_select: %empty */ +#line 4478 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 487: /* opt_create_select: opt_duplicate opt_as create_select_query_expression opt_versioning_option */ +#line 4481 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.add(DDL_options_st::OPT_CREATE_SELECT); + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 32376 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 488: /* create_select_query_expression: query_expression */ +#line 4490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_insert_select((yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 32385 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 489: /* create_select_query_expression: LEFT_PAREN_WITH with_clause query_expression_no_with_clause ')' */ +#line 4495 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *first_select= (yyvsp[-1].select_lex_unit)->first_select(); + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to(first_select); + if (Lex->parsed_insert_select(first_select)) + MYSQL_YYABORT; + } +#line 32397 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 490: /* opt_create_partitioning: opt_partitioning */ +#line 4506 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Remove all tables used in PARTITION clause from the global table + list. Partitioning with subqueries is not allowed anyway. + */ + TABLE_LIST *last_non_sel_table= Lex->create_last_non_select_table; + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + } +#line 32411 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 491: /* opt_partitioning: %empty */ +#line 4542 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32417 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 493: /* $@65: %empty */ +#line 4548 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + if (lex->sql_command == SQLCOM_ALTER_TABLE) + { + lex->alter_info.partition_flags|= ALTER_PARTITION_INFO; + } + } +#line 32432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 495: /* have_partitioning: %empty */ +#line 4563 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + LEX_CSTRING partition_name={STRING_WITH_LEN("partition")}; + if (unlikely(!plugin_is_ready(&partition_name, MYSQL_STORAGE_ENGINE_PLUGIN))) + my_yyabort_error((ER_OPTION_PREVENTS_STATEMENT, MYF(0), + "--skip-partition")); +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), "partitioning", + "--with-plugin-partition")); +#endif + } +#line 32448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 496: /* $@66: %empty */ +#line 4578 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->part_info)) + { + thd->parse_error(ER_PARTITION_ENTRY_ERROR); + MYSQL_YYABORT; + } + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + We enter here when opening the frm file to translate + partition info string into part_info data structure. + */ + } +#line 32466 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 497: /* partition_entry: PARTITION_SYM $@66 partition */ +#line 4592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 32474 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 498: /* $@67: %empty */ +#line 4599 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->safe_to_cache_query= 1; } +#line 32480 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 500: /* part_type_def: opt_linear KEY_SYM opt_key_algo '(' part_field_list ')' */ +#line 4605 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->list_of_part_fields= TRUE; + part_info->column_list= FALSE; + part_info->part_type= HASH_PARTITION; + } +#line 32491 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 501: /* $@68: %empty */ +#line 4612 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= HASH_PARTITION; } +#line 32497 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 502: /* part_type_def: opt_linear HASH_SYM $@68 part_func */ +#line 4613 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 503: /* part_type_def: RANGE_SYM part_func */ +#line 4615 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 32509 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 504: /* part_type_def: RANGE_SYM part_column_list */ +#line 4617 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= RANGE_PARTITION; } +#line 32515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 505: /* $@69: %empty */ +#line 4619 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_PART_FUNC; + } +#line 32523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 506: /* part_type_def: LIST_SYM $@69 part_func */ +#line 4623 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->part_type= LIST_PARTITION; + Select->parsing_place= NO_MATTER; + } +#line 32532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 507: /* part_type_def: LIST_SYM part_column_list */ +#line 4628 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->part_type= LIST_PARTITION; } +#line 32538 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 508: /* $@70: %empty */ +#line 4630 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->vers_init_info(thd))) + MYSQL_YYABORT; + } +#line 32547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 510: /* opt_linear: %empty */ +#line 4638 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32553 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 511: /* opt_linear: LINEAR_SYM */ +#line 4640 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->linear_hash_ind= TRUE;} +#line 32559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 512: /* opt_key_algo: %empty */ +#line 4645 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_NONE;} +#line 32565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 513: /* opt_key_algo: ALGORITHM_SYM '=' real_ulong_num */ +#line 4647 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch ((yyvsp[0].ulong_num)) { + case 1: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_51; + break; + case 2: + Lex->part_info->key_algorithm= partition_info::KEY_ALGORITHM_55; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 32583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 514: /* part_field_list: %empty */ +#line 4663 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 515: /* part_field_list: part_field_item_list */ +#line 4664 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32595 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 516: /* part_field_item_list: part_field_item */ +#line 4668 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32601 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 517: /* part_field_item_list: part_field_item_list ',' part_field_item */ +#line 4669 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32607 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 518: /* part_field_item: ident */ +#line 4674 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_columns++; + if (unlikely(part_info->part_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + if (unlikely(part_info->num_columns > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of partition fields")); + } +#line 32622 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 519: /* part_column_list: COLUMNS '(' part_field_list ')' */ +#line 4688 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->column_list= TRUE; + part_info->list_of_part_fields= TRUE; + } +#line 32632 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 520: /* part_func: '(' part_func_expr ')' */ +#line 4698 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->set_part_expr(thd, (yyvsp[-1].item), FALSE))) + MYSQL_YYABORT; + part_info->num_columns= 1; + part_info->column_list= FALSE; + } +#line 32644 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 521: /* sub_part_func: '(' part_func_expr ')' */ +#line 4709 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->part_info->set_part_expr(thd, (yyvsp[-1].item), TRUE))) + MYSQL_YYABORT; + } +#line 32653 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 522: /* opt_num_parts: %empty */ +#line 4717 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 523: /* opt_num_parts: PARTITIONS_SYM real_ulong_num */ +#line 4719 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + partition_info *part_info= Lex->part_info; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "partitions")); + + part_info->num_parts= num_parts; + part_info->use_default_num_partitions= FALSE; + } +#line 32673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 524: /* opt_sub_part: %empty */ +#line 4731 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 525: /* $@71: %empty */ +#line 4733 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->subpart_type= HASH_PARTITION; } +#line 32685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 526: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear HASH_SYM sub_part_func $@71 opt_num_subparts */ +#line 4734 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 527: /* $@72: %empty */ +#line 4737 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->subpart_type= HASH_PARTITION; + part_info->list_of_subpart_fields= TRUE; + } +#line 32701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 528: /* opt_sub_part: SUBPARTITION_SYM BY opt_linear KEY_SYM opt_key_algo '(' sub_part_field_list ')' $@72 opt_num_subparts */ +#line 4742 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32707 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 529: /* sub_part_field_list: sub_part_field_item */ +#line 4746 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 530: /* sub_part_field_list: sub_part_field_list ',' sub_part_field_item */ +#line 4747 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 531: /* sub_part_field_item: ident */ +#line 4752 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->subpart_field_list.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + + if (unlikely(part_info->subpart_field_list.elements > MAX_REF_PARTS)) + my_yyabort_error((ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR, MYF(0), + "list of subpartition fields")); + } +#line 32734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 532: /* part_func_expr: bit_expr */ +#line 4766 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + (yyval.item)=(yyvsp[0].item); + } +#line 32747 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 533: /* opt_num_subparts: %empty */ +#line 4777 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 534: /* opt_num_subparts: SUBPARTITIONS_SYM real_ulong_num */ +#line 4779 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint num_parts= (yyvsp[0].ulong_num); + LEX *lex= Lex; + if (unlikely(num_parts == 0)) + my_yyabort_error((ER_NO_PARTS_ERROR, MYF(0), "subpartitions")); + lex->part_info->num_subparts= num_parts; + lex->part_info->use_default_num_subpartitions= FALSE; + } +#line 32766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 535: /* part_defs: %empty */ +#line 4791 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == RANGE_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "RANGE")); + if (unlikely(part_info->part_type == LIST_PARTITION)) + my_yyabort_error((ER_PARTITIONS_MUST_BE_DEFINED_ERROR, MYF(0), + "LIST")); + } +#line 32780 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 536: /* part_defs: '(' part_def_list ')' */ +#line 4801 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + uint count_curr_parts= part_info->partitions.elements; + if (part_info->num_parts != 0) + { + if (unlikely(part_info->num_parts != + count_curr_parts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_PART_ERROR); + MYSQL_YYABORT; + } + } + else if (count_curr_parts > 0) + { + part_info->num_parts= count_curr_parts; + } + part_info->count_curr_subparts= 0; + } +#line 32803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 537: /* part_def_list: part_definition */ +#line 4822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32809 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 538: /* part_def_list: part_def_list ',' part_definition */ +#line 4823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32815 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 541: /* $@73: %empty */ +#line 4833 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= new (thd->mem_root) partition_element(); + + if (unlikely(!p_elem) || + unlikely(part_info->partitions.push_back(p_elem, thd->mem_root))) + MYSQL_YYABORT; + + p_elem->part_state= PART_NORMAL; + p_elem->id= part_info->partitions.elements - 1; + part_info->curr_part_elem= p_elem; + part_info->current_partition= p_elem; + part_info->use_default_partitions= FALSE; + part_info->use_default_num_partitions= FALSE; + } +#line 32835 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 542: /* part_definition: opt_partition $@73 part_name opt_part_values opt_part_options opt_sub_partition */ +#line 4852 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 543: /* part_name: ident */ +#line 4857 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *p_elem= part_info->curr_part_elem; + if (unlikely(check_ident_length(&(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + p_elem->partition_name= (yyvsp[0].ident_sys).str; + } +#line 32853 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 544: /* opt_part_values: %empty */ +#line 4868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->error_if_requires_values())) + MYSQL_YYABORT; + if (unlikely(part_info->part_type == VERSIONING_PARTITION)) + my_yyabort_error((ER_VERS_WRONG_PARTS, MYF(0), + lex->create_last_non_select_table-> + table_name.str)); + } + else + part_info->part_type= HASH_PARTITION; + } +#line 32873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 545: /* $@74: %empty */ +#line 4884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != RANGE_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "RANGE", "LESS THAN")); + } + else + part_info->part_type= RANGE_PARTITION; + } +#line 32890 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 546: /* opt_part_values: VALUES_LESS_SYM THAN_SYM $@74 part_func_max */ +#line 4896 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 547: /* $@75: %empty */ +#line 4898 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "IN")); + } + else + part_info->part_type= LIST_PARTITION; + } +#line 32913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 548: /* opt_part_values: VALUES_IN_SYM $@75 part_values_in */ +#line 4910 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32919 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 549: /* opt_part_values: CURRENT_SYM */ +#line 4912 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_current(thd)) + MYSQL_YYABORT; +#endif + } +#line 32930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 550: /* opt_part_values: HISTORY_SYM */ +#line 4919 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef WITH_PARTITION_STORAGE_ENGINE + if (Lex->part_values_history(thd)) + MYSQL_YYABORT; +#endif + } +#line 32941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 551: /* opt_part_values: DEFAULT */ +#line 4926 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + if (! lex->is_partition_management()) + { + if (unlikely(part_info->part_type != LIST_PARTITION)) + my_yyabort_error((ER_PARTITION_WRONG_VALUES_ERROR, MYF(0), + "LIST", "DEFAULT")); + } + else + part_info->part_type= LIST_PARTITION; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 32962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 552: /* part_func_max: MAXVALUE_SYM */ +#line 4946 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + + if (unlikely(part_info->num_columns && + part_info->num_columns != 1U)) + { + part_info->print_debug("Kilroy II", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + else + part_info->num_columns= 1U; + if (unlikely(part_info->init_column_part(thd))) + MYSQL_YYABORT; + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 32984 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 553: /* part_func_max: part_value_item */ +#line 4963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 32990 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 554: /* part_values_in: part_value_item */ +#line 4968 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + part_info->print_debug("part_values_in: part_value_item", NULL); + + if (part_info->num_columns != 1U) + { + if (unlikely(!lex->is_partition_management() || + part_info->num_columns == 0 || + part_info->num_columns > MAX_REF_PARTS)) + { + part_info->print_debug("Kilroy III", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + /* + Reorganize the current large array into a list of small + arrays with one entry in each array. This can happen + in the first partition of an ALTER TABLE statement where + we ADD or REORGANIZE partitions. Also can only happen + for LIST partitions. + */ + if (unlikely(part_info->reorganize_into_single_field_col_val(thd))) + MYSQL_YYABORT; + } + } +#line 33021 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 555: /* part_values_in: '(' part_value_list ')' */ +#line 4995 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_columns < 2U)) + { + thd->parse_error(ER_ROW_SINGLE_PARTITION_FIELD_ERROR); + MYSQL_YYABORT; + } + } +#line 33034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 556: /* part_value_list: part_value_item */ +#line 5006 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 557: /* part_value_list: part_value_list ',' part_value_item */ +#line 5007 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 558: /* $@76: %empty */ +#line 5012 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug("( part_value_item", NULL); + /* Initialisation code needed for each list of value expressions */ + if (unlikely(!(part_info->part_type == LIST_PARTITION && + part_info->num_columns == 1U) && + part_info->init_column_part(thd))) + MYSQL_YYABORT; + } +#line 33060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 559: /* $@77: %empty */ +#line 5021 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 560: /* part_value_item: '(' $@76 part_value_item_list $@77 ')' */ +#line 5023 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->print_debug(") part_value_item", NULL); + if (part_info->num_columns == 0) + part_info->num_columns= part_info->curr_list_object; + if (unlikely(part_info->num_columns != part_info->curr_list_object)) + { + /* + All value items lists must be of equal length, in some cases + which is covered by the above if-statement we don't know yet + how many columns is in the partition so the assignment above + ensures that we only report errors when we know we have an + error. + */ + part_info->print_debug("Kilroy I", NULL); + thd->parse_error(ER_PARTITION_COLUMN_LIST_ERROR); + MYSQL_YYABORT; + } + part_info->curr_list_object= 0; + } +#line 33091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 561: /* part_value_item_list: part_value_expr_item */ +#line 5046 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33097 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 562: /* part_value_item_list: part_value_item_list ',' part_value_expr_item */ +#line 5047 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33103 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 563: /* part_value_expr_item: MAXVALUE_SYM */ +#line 5052 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->part_type == LIST_PARTITION)) + { + thd->parse_error(ER_MAXVALUE_IN_VALUES_IN); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_max_value(thd))) + MYSQL_YYABORT; + } +#line 33118 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 564: /* part_value_expr_item: bit_expr */ +#line 5063 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + partition_info *part_info= lex->part_info; + Item *part_expr= (yyvsp[0].item); + + if (unlikely(!lex->safe_to_cache_query)) + { + thd->parse_error(ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR); + MYSQL_YYABORT; + } + if (unlikely(part_info->add_column_list_value(thd, part_expr))) + MYSQL_YYABORT; + } +#line 33136 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 565: /* opt_sub_partition: %empty */ +#line 5081 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (unlikely(part_info->num_subparts != 0 && + !part_info->use_default_subpartitions)) + { + /* + We come here when we have defined subpartitions on the first + partition but not on all the subsequent partitions. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } +#line 33154 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 566: /* opt_sub_partition: '(' sub_part_list ')' */ +#line 5095 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + if (part_info->num_subparts != 0) + { + if (unlikely(part_info->num_subparts != + part_info->count_curr_subparts)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + } + else if (part_info->count_curr_subparts > 0) + { + if (unlikely(part_info->partitions.elements > 1)) + { + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + part_info->num_subparts= part_info->count_curr_subparts; + } + part_info->count_curr_subparts= 0; + } +#line 33181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 567: /* sub_part_list: sub_part_definition */ +#line 5120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33187 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 568: /* sub_part_list: sub_part_list ',' sub_part_definition */ +#line 5121 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33193 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 569: /* $@78: %empty */ +#line 5126 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + partition_element *curr_part= part_info->current_partition; + partition_element *sub_p_elem= new (thd->mem_root) + partition_element(curr_part); + if (unlikely(part_info->use_default_subpartitions && + part_info->partitions.elements >= 2)) + { + /* + create table t1 (a int) + partition by list (a) subpartition by hash (a) + (partition p0 values in (1), + partition p1 values in (2) subpartition sp11); + causes use to arrive since we are on the second + partition, but still use_default_subpartitions + is set. When we come here we're processing at least + the second partition (the current partition processed + have already been put into the partitions list. + */ + thd->parse_error(ER_PARTITION_WRONG_NO_SUBPART_ERROR); + MYSQL_YYABORT; + } + if (unlikely(!sub_p_elem) || + unlikely(curr_part->subpartitions.push_back(sub_p_elem, thd->mem_root))) + MYSQL_YYABORT; + + sub_p_elem->id= curr_part->subpartitions.elements - 1; + part_info->curr_part_elem= sub_p_elem; + part_info->use_default_subpartitions= FALSE; + part_info->use_default_num_subpartitions= FALSE; + part_info->count_curr_subparts++; + } +#line 33230 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 570: /* sub_part_definition: SUBPARTITION_SYM $@78 sub_name opt_subpart_options */ +#line 5158 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 571: /* sub_name: ident_or_text */ +#line 5163 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(check_ident_length(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + Lex->part_info->curr_part_elem->partition_name= (yyvsp[0].lex_str).str; + } +#line 33246 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 572: /* opt_part_options: %empty */ +#line 5171 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33252 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 573: /* opt_part_options: part_option_list */ +#line 5172 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33258 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 574: /* part_option_list: part_option_list part_option */ +#line 5176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33264 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 575: /* part_option_list: part_option */ +#line 5177 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33270 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 576: /* part_option: server_part_option */ +#line 5181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33276 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 577: /* part_option: engine_defined_option */ +#line 5183 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->part_info->curr_part_elem->option_list, + &Lex->option_list_last); + } +#line 33285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 578: /* opt_subpart_options: %empty */ +#line 5190 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 579: /* opt_subpart_options: subpart_option_list */ +#line 5191 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 580: /* subpart_option_list: subpart_option_list server_part_option */ +#line 5195 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 581: /* subpart_option_list: server_part_option */ +#line 5196 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33309 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 582: /* server_part_option: TABLESPACE opt_equal ident_or_text */ +#line 5201 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatibility with MySQL */ } +#line 33315 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 583: /* server_part_option: opt_storage ENGINE_SYM opt_equal storage_engines */ +#line 5203 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->curr_part_elem->engine_type= (yyvsp[0].db_type); + part_info->default_engine_type= (yyvsp[0].db_type); + } +#line 33325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 584: /* server_part_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5209 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->curr_part_elem->connect_string.str= (yyvsp[0].lex_str).str; + lex->part_info->curr_part_elem->connect_string.length= (yyvsp[0].lex_str).length; + } +#line 33335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 585: /* server_part_option: NODEGROUP_SYM opt_equal real_ulong_num */ +#line 5215 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->nodegroup_id= (uint16) (yyvsp[0].ulong_num); } +#line 33341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 586: /* server_part_option: MAX_ROWS opt_equal real_ulonglong_num */ +#line 5217 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_max_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 33347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 587: /* server_part_option: MIN_ROWS opt_equal real_ulonglong_num */ +#line 5219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_min_rows= (ha_rows) (yyvsp[0].ulonglong_number); } +#line 33353 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 588: /* server_part_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5221 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->data_file_name= (yyvsp[0].lex_str).str; } +#line 33359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 589: /* server_part_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5223 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->index_file_name= (yyvsp[0].lex_str).str; } +#line 33365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 590: /* server_part_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5225 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->part_info->curr_part_elem->part_comment= (yyvsp[0].lex_str).str; } +#line 33371 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 591: /* opt_versioning_rotation: %empty */ +#line 5229 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 592: /* $@79: %empty */ +#line 5230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "INTERVAL"; } +#line 33383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 593: /* opt_versioning_rotation: $@79 INTERVAL_SYM expr interval opt_versioning_interval_start opt_vers_auto_part */ +#line 5232 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_interval(thd, (yyvsp[-3].item), (yyvsp[-2].interval), (yyvsp[-1].item), (yyvsp[0].num), + table_name))) + MYSQL_YYABORT; + } +#line 33395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 594: /* opt_versioning_rotation: LIMIT ulonglong_num opt_vers_auto_part */ +#line 5240 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + const char *table_name= Lex->create_last_non_select_table->table_name.str; + if (unlikely(part_info->vers_set_limit((yyvsp[-1].ulonglong_number), (yyvsp[0].num), table_name))) + MYSQL_YYABORT; + } +#line 33406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 595: /* opt_versioning_interval_start: %empty */ +#line 5251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= NULL; + } +#line 33414 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 596: /* opt_versioning_interval_start: STARTS_SYM literal */ +#line 5255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 33422 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 597: /* opt_vers_auto_part: %empty */ +#line 5262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 33430 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 598: /* opt_vers_auto_part: AUTO_SYM */ +#line 5266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 1; + } +#line 33438 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 599: /* opt_as: %empty */ +#line 5275 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33444 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 600: /* opt_as: AS */ +#line 5276 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33450 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 601: /* opt_create_database_options: %empty */ +#line 5280 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33456 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 602: /* opt_create_database_options: create_database_options */ +#line 5281 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33462 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 603: /* create_database_options: create_database_option */ +#line 5285 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33468 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 604: /* create_database_options: create_database_options create_database_option */ +#line 5286 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33474 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 605: /* create_database_option: default_collation */ +#line 5290 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33480 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 606: /* create_database_option: default_charset */ +#line 5291 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 33486 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 607: /* create_database_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5293 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 33495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 608: /* opt_if_not_exists_table_element: %empty */ +#line 5301 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + } +#line 33503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 609: /* opt_if_not_exists_table_element: IF_SYM not EXISTS */ +#line 5305 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + } +#line 33511 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 610: /* opt_if_not_exists: %empty */ +#line 5312 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 33519 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 611: /* opt_if_not_exists: IF_SYM not EXISTS */ +#line 5316 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_NOT_EXISTS); + } +#line 33527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 612: /* create_or_replace: CREATE */ +#line 5323 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).init(); + } +#line 33535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 613: /* create_or_replace: CREATE OR_SYM REPLACE */ +#line 5327 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_OR_REPLACE); + } +#line 33543 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 621: /* create_table_option: ENGINE_SYM opt_equal ident_or_text */ +#line 5350 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->m_sql_cmd) + { + DBUG_ASSERT(lex->sql_command == SQLCOM_ALTER_TABLE); + if (!(lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table())) + MYSQL_YYABORT; + } + Storage_engine_name *opt= + lex->m_sql_cmd->option_storage_engine_name(); + DBUG_ASSERT(opt); // Expect a proper Sql_cmd + *opt= Storage_engine_name((yyvsp[0].lex_str)); + lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; + } +#line 33562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 622: /* create_table_option: MAX_ROWS opt_equal ulonglong_num */ +#line 5365 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.max_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS; + } +#line 33571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 623: /* create_table_option: MIN_ROWS opt_equal ulonglong_num */ +#line 5370 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.min_rows= (yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS; + } +#line 33580 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 624: /* create_table_option: AVG_ROW_LENGTH opt_equal ulong_num */ +#line 5375 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.avg_row_length=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH; + } +#line 33589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 625: /* create_table_option: PASSWORD_SYM opt_equal TEXT_STRING_sys */ +#line 5380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.password=(yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_PASSWORD; + } +#line 33598 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 626: /* create_table_option: COMMENT_SYM opt_equal TEXT_STRING_sys */ +#line 5385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.comment=(yyvsp[0].lex_str); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 33607 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 627: /* create_table_option: AUTO_INC opt_equal ulonglong_num */ +#line 5390 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.auto_increment_value=(yyvsp[0].ulonglong_number); + Lex->create_info.used_fields|= HA_CREATE_USED_AUTO; + } +#line 33616 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 628: /* create_table_option: PACK_KEYS_SYM opt_equal ulong_num */ +#line 5395 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_PACK_KEYS; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_PACK_KEYS; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 33635 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 629: /* create_table_option: PACK_KEYS_SYM opt_equal DEFAULT */ +#line 5410 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_PACK_KEYS | HA_OPTION_NO_PACK_KEYS); + Lex->create_info.used_fields|= HA_CREATE_USED_PACK_KEYS; + } +#line 33645 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 630: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal ulong_num */ +#line 5416 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_OFF; + break; + case 1: + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_ON; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 33664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 631: /* create_table_option: STATS_AUTO_RECALC_SYM opt_equal DEFAULT */ +#line 5431 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_auto_recalc= HA_STATS_AUTO_RECALC_DEFAULT; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_AUTO_RECALC; + } +#line 33673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 632: /* create_table_option: STATS_PERSISTENT_SYM opt_equal ulong_num */ +#line 5436 "/home/buildbot/git/sql/sql_yacc.yy" + { + switch((yyvsp[0].ulong_num)) { + case 0: + Lex->create_info.table_options|= HA_OPTION_NO_STATS_PERSISTENT; + break; + case 1: + Lex->create_info.table_options|= HA_OPTION_STATS_PERSISTENT; + break; + default: + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 33692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 633: /* create_table_option: STATS_PERSISTENT_SYM opt_equal DEFAULT */ +#line 5451 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options&= + ~(HA_OPTION_STATS_PERSISTENT | HA_OPTION_NO_STATS_PERSISTENT); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_PERSISTENT; + } +#line 33702 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 634: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal ulong_num */ +#line 5457 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* From user point of view STATS_SAMPLE_PAGES can be specified as + STATS_SAMPLE_PAGES=N (where 0 0xffff)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + Lex->create_info.stats_sample_pages=(yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 33724 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 635: /* create_table_option: STATS_SAMPLE_PAGES_SYM opt_equal DEFAULT */ +#line 5475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.stats_sample_pages=0; + Lex->create_info.used_fields|= HA_CREATE_USED_STATS_SAMPLE_PAGES; + } +#line 33733 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 636: /* create_table_option: CHECKSUM_SYM opt_equal ulong_num */ +#line 5480 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 33742 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 637: /* create_table_option: TABLE_CHECKSUM_SYM opt_equal ulong_num */ +#line 5485 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_CHECKSUM : HA_OPTION_NO_CHECKSUM; + Lex->create_info.used_fields|= HA_CREATE_USED_CHECKSUM; + } +#line 33751 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 638: /* create_table_option: PAGE_CHECKSUM_SYM opt_equal choice */ +#line 5490 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_PAGE_CHECKSUM; + Lex->create_info.page_checksum= (yyvsp[0].choice); + } +#line 33760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 639: /* create_table_option: DELAY_KEY_WRITE_SYM opt_equal ulong_num */ +#line 5495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.table_options|= (yyvsp[0].ulong_num) ? HA_OPTION_DELAY_KEY_WRITE : HA_OPTION_NO_DELAY_KEY_WRITE; + Lex->create_info.used_fields|= HA_CREATE_USED_DELAY_KEY_WRITE; + } +#line 33769 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 640: /* create_table_option: ROW_FORMAT_SYM opt_equal row_types */ +#line 5500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.row_type= (yyvsp[0].row_type); + Lex->create_info.used_fields|= HA_CREATE_USED_ROW_FORMAT; + } +#line 33778 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 641: /* $@80: %empty */ +#line 5505 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->table_list.save_and_clear(&Lex->save_list); + } +#line 33786 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 642: /* create_table_option: UNION_SYM opt_equal $@80 '(' opt_table_list ')' */ +#line 5509 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Move the union list to the merge_list and exclude its tables + from the global list. + */ + LEX *lex=Lex; + lex->create_info.merge_list= lex->first_select_lex()->table_list.first; + lex->first_select_lex()->table_list= lex->save_list; + /* + When excluding union list from the global list we assume that + elements of the former immediately follow elements which represent + table being created/altered and parent tables. + */ + TABLE_LIST *last_non_sel_table= lex->create_last_non_select_table; + DBUG_ASSERT(last_non_sel_table->next_global == + lex->create_info.merge_list); + last_non_sel_table->next_global= 0; + Lex->query_tables_last= &last_non_sel_table->next_global; + + lex->create_info.used_fields|= HA_CREATE_USED_UNION; + } +#line 33812 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 645: /* create_table_option: INSERT_METHOD opt_equal merge_insert_types */ +#line 5533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.merge_insert_method= (yyvsp[0].ulong_num); + Lex->create_info.used_fields|= HA_CREATE_USED_INSERT_METHOD; + } +#line 33821 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 646: /* create_table_option: DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5538 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.data_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_DATADIR; + } +#line 33830 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 647: /* create_table_option: INDEX_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys */ +#line 5543 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.index_file_name= (yyvsp[0].lex_str).str; + Lex->create_info.used_fields|= HA_CREATE_USED_INDEXDIR; + } +#line 33839 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 648: /* create_table_option: TABLESPACE ident */ +#line 5548 "/home/buildbot/git/sql/sql_yacc.yy" + { /* Compatiblity with MySQL */ } +#line 33845 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 649: /* create_table_option: STORAGE_SYM DISK_SYM */ +#line 5550 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_DISK;} +#line 33851 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 650: /* create_table_option: STORAGE_SYM MEMORY_SYM */ +#line 5552 "/home/buildbot/git/sql/sql_yacc.yy" + {Lex->create_info.storage_media= HA_SM_MEMORY;} +#line 33857 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 651: /* create_table_option: CONNECTION_SYM opt_equal TEXT_STRING_sys */ +#line 5554 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.connect_string.str= (yyvsp[0].lex_str).str; + Lex->create_info.connect_string.length= (yyvsp[0].lex_str).length; + Lex->create_info.used_fields|= HA_CREATE_USED_CONNECTION; + } +#line 33867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 652: /* create_table_option: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 5560 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_KEY_BLOCK_SIZE; + Lex->create_info.key_block_size= (yyvsp[0].ulong_num); + } +#line 33876 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 653: /* create_table_option: TRANSACTIONAL_SYM opt_equal choice */ +#line 5565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_TRANSACTIONAL; + Lex->create_info.transactional= (yyvsp[0].choice); + } +#line 33885 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 654: /* create_table_option: engine_defined_option */ +#line 5570 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->create_info.option_list, &Lex->option_list_last); + } +#line 33893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 655: /* create_table_option: SEQUENCE_SYM opt_equal choice */ +#line 5574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.used_fields|= HA_CREATE_USED_SEQUENCE; + Lex->create_info.sequence= ((yyvsp[0].choice) == HA_CHOICE_YES); + } +#line 33902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 657: /* engine_defined_option: IDENT_sys equal TEXT_STRING_sys */ +#line 5583 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].lex_str).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].lex_str), true); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 658: /* engine_defined_option: IDENT_sys equal ident */ +#line 5590 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ident_sys).length > ENGINE_OPTION_MAX_LENGTH)) + my_yyabort_error((ER_VALUE_TOO_LONG, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), false); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 659: /* engine_defined_option: IDENT_sys equal real_ulonglong_num */ +#line 5597 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys), (yyvsp[0].ulonglong_number), thd->mem_root); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33933 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 660: /* engine_defined_option: IDENT_sys equal DEFAULT */ +#line 5602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.engine_option_value_ptr)= new (thd->mem_root) engine_option_value((yyvsp[-2].ident_sys)); + MYSQL_YYABORT_UNLESS((yyval.engine_option_value_ptr)); + } +#line 33942 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 663: /* versioning_option: WITH_SYSTEM_SYM VERSIONING_SYM */ +#line 5615 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) + { + if (!DBUG_IF("sysvers_force")) + { + my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CREATE TEMPORARY TABLE"); + MYSQL_YYABORT; + } + } + else + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } + } +#line 33962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 664: /* default_charset: opt_default charset opt_equal charset_name_or_default */ +#line 5634 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_info.add_table_option_default_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 33971 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 665: /* default_collation: opt_default COLLATE_SYM opt_equal collation_name_or_default */ +#line 5642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_specification_st *cinfo= &Lex->create_info; + if (unlikely(cinfo->add_table_option_default_collation((yyvsp[0].Lex_extended_collation)))) + MYSQL_YYABORT; + } +#line 33981 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 666: /* storage_engines: ident_or_text */ +#line 5651 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Storage_engine_name((yyvsp[0].lex_str)). + resolve_storage_engine_with_error(thd, &(yyval.db_type), + thd->lex->create_info.tmp_table())) + MYSQL_YYABORT; + } +#line 33992 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 667: /* known_storage_engines: ident_or_text */ +#line 5661 "/home/buildbot/git/sql/sql_yacc.yy" + { + plugin_ref plugin; + if (likely((plugin= ha_resolve_by_name(thd, &(yyvsp[0].lex_str), false)))) + (yyval.db_type)= plugin_hton(plugin); + else + my_yyabort_error((ER_UNKNOWN_STORAGE_ENGINE, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 34004 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 668: /* row_types: DEFAULT */ +#line 5671 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DEFAULT; } +#line 34010 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 669: /* row_types: FIXED_SYM */ +#line 5672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_FIXED; } +#line 34016 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 670: /* row_types: DYNAMIC_SYM */ +#line 5673 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_DYNAMIC; } +#line 34022 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 671: /* row_types: COMPRESSED_SYM */ +#line 5674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPRESSED; } +#line 34028 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 672: /* row_types: REDUNDANT_SYM */ +#line 5675 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_REDUNDANT; } +#line 34034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 673: /* row_types: COMPACT_SYM */ +#line 5676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_COMPACT; } +#line 34040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 674: /* row_types: PAGE_SYM */ +#line 5677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.row_type)= ROW_TYPE_PAGE; } +#line 34046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 675: /* merge_insert_types: NO_SYM */ +#line 5681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_DISABLED; } +#line 34052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 676: /* merge_insert_types: FIRST_SYM */ +#line 5682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_FIRST; } +#line 34058 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 677: /* merge_insert_types: LAST_SYM */ +#line 5683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= MERGE_INSERT_TO_LAST; } +#line 34064 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 678: /* udf_type: STRING_SYM */ +#line 5687 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) STRING_RESULT; } +#line 34070 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 679: /* udf_type: REAL */ +#line 5688 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) REAL_RESULT; } +#line 34076 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 680: /* udf_type: DECIMAL_SYM */ +#line 5689 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) DECIMAL_RESULT; } +#line 34082 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 681: /* udf_type: INT_SYM */ +#line 5690 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num) = (int) INT_RESULT; } +#line 34088 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 682: /* create_field_list: field_list */ +#line 5696 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 683: /* create_field_list_parens: LEFT_PAREN_ALT field_list ')' */ +#line 5703 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + } +#line 34104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 686: /* field_list_item: column_def */ +#line 5714 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34110 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 690: /* field_list_item: PERIOD_SYM period_for_application_time */ +#line 5718 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 691: /* column_def: field_spec */ +#line 5723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.create_field)= (yyvsp[0].create_field); } +#line 34122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 692: /* column_def: field_spec opt_constraint references */ +#line 5725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_column_foreign_key(&((yyvsp[-2].create_field)->field_name), &(yyvsp[-1].lex_str), + (yyvsp[0].table), DDL_options()))) + MYSQL_YYABORT; + (yyval.create_field)= (yyvsp[-2].create_field); + } +#line 34133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 693: /* $@81: %empty */ +#line 5735 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-1].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34143 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 694: /* key_def: key_or_index opt_if_not_exists opt_ident opt_USING_key_algorithm $@81 '(' key_list ')' normal_key_options */ +#line 5740 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34149 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 695: /* $@82: %empty */ +#line 5742 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key(Key::MULTIPLE, &(yyvsp[-2].ident_sys), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 696: /* key_def: key_or_index opt_if_not_exists ident TYPE_SYM btree_or_rtree $@82 '(' key_list ')' normal_key_options */ +#line 5747 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34165 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 697: /* $@83: %empty */ +#line 5749 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34175 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 698: /* key_def: fulltext opt_key_or_index opt_if_not_exists opt_ident $@83 '(' key_list ')' fulltext_key_options */ +#line 5754 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 699: /* $@84: %empty */ +#line 5756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), &(yyvsp[0].lex_str), HA_KEY_ALG_UNDEF, (yyvsp[-1].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34191 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 700: /* key_def: spatial opt_key_or_index opt_if_not_exists opt_ident $@84 '(' key_list ')' spatial_key_options */ +#line 5761 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34197 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 701: /* $@85: %empty */ +#line 5765 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-3].key_type), (yyvsp[-1].lex_str).str ? &(yyvsp[-1].lex_str) : &(yyvsp[-4].lex_str), (yyvsp[0].key_alg), (yyvsp[-2].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34207 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 702: /* key_def: opt_constraint constraint_key_type opt_if_not_exists opt_ident opt_USING_key_algorithm $@85 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5770 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34213 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 703: /* $@86: %empty */ +#line 5773 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_list= NULL; + if (unlikely(Lex->add_key((yyvsp[-4].key_type), (yyvsp[-2].ident_sys).str ? &(yyvsp[-2].ident_sys) : &(yyvsp[-5].lex_str), (yyvsp[0].key_alg), (yyvsp[-3].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34223 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 704: /* key_def: opt_constraint constraint_key_type opt_if_not_exists ident TYPE_SYM btree_or_rtree $@86 '(' key_list opt_without_overlaps ')' normal_key_options */ +#line 5778 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 34229 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 705: /* $@87: %empty */ +#line 5780 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->check_add_key((yyvsp[-1].object_ddl_options))) || + unlikely(!(Lex->last_key= (new (thd->mem_root) + Key(Key::MULTIPLE, + (yyvsp[-4].lex_str).str ? &(yyvsp[-4].lex_str) : &(yyvsp[0].lex_str), + HA_KEY_ALG_UNDEF, true, (yyvsp[-1].object_ddl_options)))))) + MYSQL_YYABORT; + Lex->option_list= NULL; + } +#line 34243 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 706: /* key_def: opt_constraint FOREIGN KEY_SYM opt_if_not_exists opt_ident $@87 '(' key_list ')' references */ +#line 5790 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_table_foreign_key((yyvsp[-5].lex_str).str ? &(yyvsp[-5].lex_str) : &(yyvsp[-9].lex_str), + (yyvsp[-9].lex_str).str ? &(yyvsp[-9].lex_str) : &(yyvsp[-5].lex_str), (yyvsp[0].table), (yyvsp[-6].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 34253 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 707: /* constraint_def: opt_constraint check_constraint */ +#line 5799 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), FALSE); + } +#line 34261 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 708: /* period_for_system_time: PERIOD_SYM FOR_SYSTEM_TIME_SYM '(' ident ',' ident ')' */ +#line 5807 "/home/buildbot/git/sql/sql_yacc.yy" + { + Vers_parse_info &info= Lex->vers_get_info(); + info.set_period((yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys)); + } +#line 34270 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 709: /* period_for_application_time: FOR_SYM ident '(' ident ',' ident ')' */ +#line 5815 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_period((yyvsp[-5].ident_sys), (yyvsp[-3].ident_sys), (yyvsp[-1].ident_sys))) + MYSQL_YYABORT; + } +#line 34279 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 710: /* opt_check_constraint: %empty */ +#line 5822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (Virtual_column_info*) 0; } +#line 34285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 711: /* opt_check_constraint: check_constraint */ +#line 5823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.virtual_column)= (yyvsp[0].virtual_column);} +#line 34291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 712: /* check_constraint: CHECK_SYM '(' expr ')' */ +#line 5828 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 34302 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 713: /* opt_constraint_no_id: %empty */ +#line 5837 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 714: /* opt_constraint_no_id: CONSTRAINT */ +#line 5838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34314 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 715: /* opt_constraint: %empty */ +#line 5842 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 34320 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 716: /* opt_constraint: constraint */ +#line 5843 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 34326 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 717: /* constraint: CONSTRAINT opt_ident */ +#line 5847 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 34332 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 718: /* @88: %empty */ +#line 5852 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].lex_str), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].lex_str).str)); + + if (unlikely(!f)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].lex_str)); + (yyval.create_field)= f; + lex->parsing_options.lookup_keywords_after_qualifier= true; + } +#line 34352 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 719: /* field_spec: field_ident @88 field_type_or_serial opt_check_constraint */ +#line 5868 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->parsing_options.lookup_keywords_after_qualifier= false; + (yyval.create_field)= (yyvsp[-2].create_field); + + (yyval.create_field)->check_constraint= (yyvsp[0].virtual_column); + + if (unlikely((yyval.create_field)->check(thd))) + MYSQL_YYABORT; + + lex->alter_info.create_list.push_back((yyval.create_field), thd->mem_root); + + (yyval.create_field)->create_if_not_exists= Lex->check_exists; + if ((yyval.create_field)->flags & PRI_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::PRIMARY, lex->check_exists); + else if ((yyval.create_field)->flags & UNIQUE_KEY_FLAG) + lex->add_key_to_list(&(yyvsp[-3].lex_str), Key::UNIQUE, lex->check_exists); + } +#line 34375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 720: /* $@89: %empty */ +#line 5890 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[0].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + } +#line 34384 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 721: /* field_type_or_serial: qualified_field_type $@89 field_def */ +#line 5895 "/home/buildbot/git/sql/sql_yacc.yy" + { + auto tmp= (yyvsp[-2].Lex_field_type).charset_collation_attrs(); + if (tmp.merge_column_charset_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + Lex->last_field->set_charset_collation_attrs(tmp); + } +#line 34395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 722: /* $@90: %empty */ +#line 5902 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_handler(&type_handler_ulonglong); + Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG + | UNSIGNED_FLAG | UNIQUE_KEY_FLAG; + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 34406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 724: /* opt_serial_attribute: %empty */ +#line 5912 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34412 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 725: /* opt_serial_attribute: opt_serial_attribute_list */ +#line 5913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34418 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 726: /* opt_serial_attribute_list: opt_serial_attribute_list serial_attribute */ +#line 5917 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 728: /* opt_asrow_attribute: %empty */ +#line 5922 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34430 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 729: /* opt_asrow_attribute: opt_asrow_attribute_list */ +#line 5923 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34436 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 730: /* opt_asrow_attribute_list: opt_asrow_attribute_list asrow_attribute */ +#line 5927 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34442 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 732: /* field_def: %empty */ +#line 5932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 34448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 734: /* field_def: attribute_list compressed_deprecated_column_attribute */ +#line 5934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 34454 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 735: /* field_def: attribute_list compressed_deprecated_column_attribute attribute_list */ +#line 5936 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-2].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 34463 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 736: /* $@91: %empty */ +#line 5941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info= (yyvsp[0].virtual_column); + } +#line 34471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 737: /* field_def: opt_generated_always AS virtual_column_func $@91 vcol_opt_specifier vcol_opt_attribute */ +#line 5945 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 34479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 738: /* field_def: opt_generated_always AS ROW_SYM START_SYM opt_asrow_attribute */ +#line 5949 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_start()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 34489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 739: /* field_def: opt_generated_always AS ROW_SYM END opt_asrow_attribute */ +#line 5955 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->last_field_generated_always_as_row_end()) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 34499 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 740: /* opt_generated_always: %empty */ +#line 5963 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34505 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 741: /* opt_generated_always: GENERATED_SYM ALWAYS_SYM */ +#line 5964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34511 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 742: /* vcol_opt_specifier: %empty */ +#line 5969 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 34519 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 743: /* vcol_opt_specifier: VIRTUAL_SYM */ +#line 5973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(FALSE); + } +#line 34527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 744: /* vcol_opt_specifier: PERSISTENT_SYM */ +#line 5977 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 34535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 745: /* vcol_opt_specifier: STORED_SYM */ +#line 5981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->vcol_info->set_stored_in_db_flag(TRUE); + } +#line 34543 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 746: /* vcol_opt_attribute: %empty */ +#line 5987 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 747: /* vcol_opt_attribute: vcol_opt_attribute_list */ +#line 5988 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34555 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 748: /* vcol_opt_attribute_list: vcol_opt_attribute_list vcol_attribute */ +#line 5992 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 34561 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 750: /* vcol_attribute: UNIQUE_SYM */ +#line 5998 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 34571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 751: /* vcol_attribute: UNIQUE_SYM KEY_SYM */ +#line 6004 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 34581 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 752: /* vcol_attribute: COMMENT_SYM TEXT_STRING_sys */ +#line 6009 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->comment= (yyvsp[0].lex_str); } +#line 34587 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 753: /* vcol_attribute: INVISIBLE_SYM */ +#line 6011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->invisible= INVISIBLE_USER; + } +#line 34595 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 754: /* $@92: %empty */ +#line 6018 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + "PARSE_VCOL_EXPR" can only be used by the SQL server + when reading a '*.frm' file. + Prevent the end user from invoking this command. + */ + MYSQL_YYABORT_UNLESS(Lex->parse_vcol_expr); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 34610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 755: /* parse_vcol_expr: PARSE_VCOL_EXPR_SYM $@92 expr */ +#line 6029 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= add_virtual_expression(thd, (yyvsp[0].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + Lex->last_field->vcol_info= v; + Lex->pop_select(); //main select + } +#line 34622 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 757: /* parenthesized_expr: expr ',' expr_list */ +#line 6041 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[0].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 34633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 758: /* virtual_column_func: '(' parenthesized_expr ')' */ +#line 6051 "/home/buildbot/git/sql/sql_yacc.yy" + { + Virtual_column_info *v= + add_virtual_expression(thd, (yyvsp[-1].item)); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 34645 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 759: /* virtual_column_func: subquery */ +#line 6059 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= new (thd->mem_root) Item_singlerow_subselect(thd, (yyvsp[0].select_lex)))) + MYSQL_YYABORT; + Virtual_column_info *v= add_virtual_expression(thd, item); + if (unlikely(!v)) + MYSQL_YYABORT; + (yyval.virtual_column)= v; + } +#line 34659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 763: /* column_default_expr: expr_or_literal */ +#line 6075 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.virtual_column)= add_virtual_expression(thd, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 34668 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 764: /* field_type: field_type_all */ +#line 6082 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 34676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 765: /* qualified_field_type: field_type_all */ +#line 6089 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->map_data_type(Lex_ident_sys(), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type))); + } +#line 34684 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 766: /* qualified_field_type: sp_decl_ident '.' field_type_all */ +#line 6093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->map_data_type((yyvsp[-2].ident_sys), &((yyval.Lex_field_type)= (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 34693 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 767: /* udt_name: IDENT_sys */ +#line 6100 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 34699 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 768: /* udt_name: reserved_keyword_udt */ +#line 6101 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 34705 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 769: /* udt_name: non_reserved_keyword_udt */ +#line 6102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].kwd); } +#line 34711 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 775: /* field_type_all: udt_name float_options srid_option */ +#line 6112 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_field_type_udt(&(yyval.Lex_field_type), (yyvsp[-2].lex_str), (yyvsp[-1].Lex_length_and_dec))) + MYSQL_YYABORT; + } +#line 34720 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 776: /* field_type_numeric: int_type opt_field_length last_field_options */ +#line 6120 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length_flags((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec), (uint32) (yyvsp[0].ulong_num)); + } +#line 34728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 777: /* field_type_numeric: real_type opt_precision last_field_options */ +#line 6123 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set((yyvsp[-2].type_handler), (yyvsp[-1].Lex_length_and_dec)); } +#line 34734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 778: /* field_type_numeric: FLOAT_SYM float_options last_field_options */ +#line 6125 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_float, (yyvsp[-1].Lex_length_and_dec)); + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length() && !(yyvsp[-1].Lex_length_and_dec).has_explicit_dec()) + { + if (unlikely((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_DOUBLE)) + my_yyabort_error((ER_WRONG_FIELD_SPEC, MYF(0), + Lex->last_field->field_name.str)); + if ((yyvsp[-1].Lex_length_and_dec).length() > PRECISION_FOR_FLOAT) + (yyval.Lex_field_type).set(&type_handler_double); + else + (yyval.Lex_field_type).set(&type_handler_float); + } + } +#line 34752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 779: /* field_type_numeric: BIT_SYM opt_field_length */ +#line 6139 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_bit, (yyvsp[0].Lex_length_and_dec)); + } +#line 34760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 780: /* field_type_numeric: BOOL_SYM */ +#line 6143 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 34768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 781: /* field_type_numeric: BOOLEAN_SYM */ +#line 6147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set_handler_length(&type_handler_stiny, 1); + } +#line 34776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 782: /* field_type_numeric: DECIMAL_SYM float_options last_field_options */ +#line 6151 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 34782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 783: /* field_type_numeric: NUMBER_ORACLE_SYM float_options last_field_options */ +#line 6153 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec)); + else + (yyval.Lex_field_type).set(&type_handler_double); + } +#line 34793 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 784: /* field_type_numeric: NUMERIC_SYM float_options last_field_options */ +#line 6160 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 34799 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 785: /* field_type_numeric: FIXED_SYM float_options last_field_options */ +#line 6162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdecimal, (yyvsp[-1].Lex_length_and_dec));} +#line 34805 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 786: /* opt_binary_and_compression: %empty */ +#line 6167 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 34811 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 787: /* opt_binary_and_compression: binary */ +#line 6168 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 34817 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 788: /* opt_binary_and_compression: binary compressed_deprecated_data_type_attribute */ +#line 6169 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs); } +#line 34823 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 789: /* opt_binary_and_compression: compressed opt_binary */ +#line 6170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[0].Lex_exact_charset_extended_collation_attrs); } +#line 34829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 790: /* field_type_string: char opt_field_length opt_binary */ +#line 6175 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 34837 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 791: /* field_type_string: nchar opt_field_length opt_bin_mod */ +#line 6179 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[-1].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 34846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 792: /* field_type_string: BINARY opt_field_length */ +#line 6184 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_string, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); + } +#line 34854 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 793: /* field_type_string: varchar opt_field_length opt_binary_and_compression */ +#line 6188 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 34862 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 794: /* field_type_string: VARCHAR2_ORACLE_SYM opt_field_length opt_binary_and_compression */ +#line 6192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); + } +#line 34870 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 795: /* field_type_string: nvarchar opt_field_length opt_compressed opt_bin_mod */ +#line 6196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-2].Lex_length_and_dec), + Lex_exact_charset_extended_collation_attrs::national((yyvsp[0].num))); + } +#line 34879 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 796: /* field_type_string: VARBINARY opt_field_length opt_compressed */ +#line 6201 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34887 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 797: /* field_type_string: RAW_ORACLE_SYM opt_field_length opt_compressed */ +#line 6205 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_varchar, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34895 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 798: /* field_type_temporal: YEAR_SYM opt_field_length last_field_options */ +#line 6212 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].Lex_length_and_dec).has_explicit_length()) + { + if ((yyvsp[-1].Lex_length_and_dec).length() != 4) + { + char buff[sizeof("YEAR()") + MY_INT64_NUM_DECIMAL_DIGITS + 1]; + my_snprintf(buff, sizeof(buff), "YEAR(%u)", (uint) (yyvsp[-1].Lex_length_and_dec).length()); + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + buff, "YEAR(4)"); + } + } + (yyval.Lex_field_type).set(&type_handler_year, (yyvsp[-1].Lex_length_and_dec)); + } +#line 34915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 799: /* field_type_temporal: DATE_SYM */ +#line 6227 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_newdate); } +#line 34921 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 800: /* field_type_temporal: TIME_SYM opt_field_length */ +#line 6229 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_time2) : + static_cast(&type_handler_time), + (yyvsp[0].Lex_length_and_dec)); + } +#line 34932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 801: /* field_type_temporal: TIMESTAMP opt_field_length */ +#line 6236 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(opt_mysql56_temporal_format ? + static_cast(&type_handler_timestamp2): + static_cast(&type_handler_timestamp), + (yyvsp[0].Lex_length_and_dec)); + } +#line 34943 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 802: /* field_type_temporal: DATETIME opt_field_length */ +#line 6243 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(thd->type_handler_for_datetime(), (yyvsp[0].Lex_length_and_dec)); + } +#line 34951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 803: /* field_type_lob: TINYBLOB opt_compressed */ +#line 6251 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_tiny_blob, &my_charset_bin); + } +#line 34959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 804: /* field_type_lob: BLOB_MARIADB_SYM opt_field_length opt_compressed */ +#line 6255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34967 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 805: /* field_type_lob: BLOB_ORACLE_SYM field_length opt_compressed */ +#line 6259 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), &my_charset_bin); + } +#line 34975 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 806: /* field_type_lob: BLOB_ORACLE_SYM opt_compressed */ +#line 6263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 34983 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 807: /* field_type_lob: MEDIUMBLOB opt_compressed */ +#line 6267 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 34991 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 808: /* field_type_lob: LONGBLOB opt_compressed */ +#line 6271 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob, &my_charset_bin); + } +#line 34999 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 809: /* field_type_lob: LONG_SYM VARBINARY opt_compressed */ +#line 6275 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_medium_blob, &my_charset_bin); + } +#line 35007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 810: /* field_type_lob: LONG_SYM varchar opt_binary_and_compression */ +#line 6279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 811: /* field_type_lob: TINYTEXT opt_binary_and_compression */ +#line 6281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_tiny_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 812: /* field_type_lob: TEXT_SYM opt_field_length opt_binary_and_compression */ +#line 6283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 813: /* field_type_lob: MEDIUMTEXT opt_binary_and_compression */ +#line 6285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 814: /* field_type_lob: LONGTEXT opt_binary_and_compression */ +#line 6287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 815: /* field_type_lob: CLOB_ORACLE_SYM opt_binary_and_compression */ +#line 6289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_long_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 816: /* field_type_lob: LONG_SYM opt_binary_and_compression */ +#line 6291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_medium_blob, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 817: /* field_type_lob: JSON_SYM opt_compressed */ +#line 6293 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_field_type).set(&type_handler_long_blob_json, &my_charset_utf8mb4_bin); + } +#line 35057 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 818: /* field_type_misc: ENUM '(' string_list ')' opt_binary */ +#line 6300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_enum, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 819: /* field_type_misc: SET '(' string_list ')' opt_binary */ +#line 6302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_field_type).set(&type_handler_set, (yyvsp[0].Lex_exact_charset_extended_collation_attrs)); } +#line 35069 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 820: /* char: CHAR_SYM */ +#line 6306 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35075 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 821: /* nchar: NCHAR_SYM */ +#line 6310 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35081 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 822: /* nchar: NATIONAL_SYM CHAR_SYM */ +#line 6311 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35087 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 823: /* varchar: char VARYING */ +#line 6315 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35093 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 824: /* varchar: VARCHAR */ +#line 6316 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35099 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 825: /* nvarchar: NATIONAL_SYM VARCHAR */ +#line 6320 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35105 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 826: /* nvarchar: NVARCHAR_SYM */ +#line 6321 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35111 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 827: /* nvarchar: NCHAR_SYM VARCHAR */ +#line 6322 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35117 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 828: /* nvarchar: NATIONAL_SYM CHAR_SYM VARYING */ +#line 6323 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35123 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 829: /* nvarchar: NCHAR_SYM VARYING */ +#line 6324 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35129 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 830: /* int_type: INT_SYM */ +#line 6328 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slong; } +#line 35135 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 831: /* int_type: TINYINT */ +#line 6329 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_stiny; } +#line 35141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 832: /* int_type: SMALLINT */ +#line 6330 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sshort; } +#line 35147 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 833: /* int_type: MEDIUMINT */ +#line 6331 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_sint24; } +#line 35153 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 834: /* int_type: BIGINT */ +#line 6332 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_slonglong; } +#line 35159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 835: /* real_type: REAL */ +#line 6337 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.type_handler)= thd->variables.sql_mode & MODE_REAL_AS_FLOAT ? + static_cast(&type_handler_float) : + static_cast(&type_handler_double); + } +#line 35169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 836: /* real_type: DOUBLE_SYM */ +#line 6342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35175 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 837: /* real_type: DOUBLE_SYM PRECISION */ +#line 6343 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.type_handler)= &type_handler_double; } +#line 35181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 838: /* srid_option: %empty */ +#line 6348 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->srid= 0; } +#line 35187 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 839: /* srid_option: REF_SYSTEM_ID_SYM '=' NUM */ +#line 6351 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->srid=atoi((yyvsp[0].lex_str).str); + } +#line 35195 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 840: /* float_options: %empty */ +#line 6357 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35201 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 843: /* precision: '(' NUM ',' NUM ')' */ +#line 6363 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[-3].lex_str).str, (yyvsp[-1].lex_str).str); } +#line 35207 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 844: /* field_options: %empty */ +#line 6367 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35213 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 845: /* field_options: SIGNED_SYM */ +#line 6368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 846: /* field_options: UNSIGNED */ +#line 6369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG; } +#line 35225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 847: /* field_options: ZEROFILL */ +#line 6370 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35231 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 848: /* field_options: UNSIGNED ZEROFILL */ +#line 6371 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35237 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 849: /* field_options: ZEROFILL UNSIGNED */ +#line 6372 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= UNSIGNED_FLAG | ZEROFILL_FLAG; } +#line 35243 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 850: /* last_field_options: field_options */ +#line 6376 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= ((yyval.ulong_num)= (yyvsp[0].ulong_num)); } +#line 35249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 851: /* field_length_str: '(' LONG_NUM ')' */ +#line 6380 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 852: /* field_length_str: '(' ULONGLONG_NUM ')' */ +#line 6381 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35261 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 853: /* field_length_str: '(' DECIMAL_NUM ')' */ +#line 6382 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35267 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 854: /* field_length_str: '(' NUM ')' */ +#line 6383 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[-1].lex_str).str; } +#line 35273 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 855: /* field_length: field_length_str */ +#line 6386 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set((yyvsp[0].const_simple_string), NULL); } +#line 35279 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 856: /* field_scale: field_length_str */ +#line 6390 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).set(NULL, (yyvsp[0].const_simple_string)); } +#line 35285 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 857: /* opt_field_length: %empty */ +#line 6395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); /* use default length */ } +#line 35291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 859: /* opt_field_scale: %empty */ +#line 6400 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 861: /* opt_precision: %empty */ +#line 6405 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec).reset(); } +#line 35303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 862: /* opt_precision: precision */ +#line 6406 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_length_and_dec)= (yyvsp[0].Lex_length_and_dec); } +#line 35309 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 863: /* attribute_list: attribute_list attribute */ +#line 6412 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.Lex_exact_charset_extended_collation_attrs)= (yyvsp[-1].Lex_exact_charset_extended_collation_attrs)).merge_column_collate_clause_and_collate_clause((yyvsp[0].Lex_exact_charset_extended_collation_attrs))) + MYSQL_YYABORT; + } +#line 35318 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 865: /* attribute: NULL_SYM */ +#line 6421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags&= ~NOT_NULL_FLAG; + Lex->last_field->explicitly_nullable= true; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35328 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 866: /* attribute: DEFAULT column_default_expr */ +#line 6427 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->default_value= (yyvsp[0].virtual_column); + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 867: /* attribute: ON UPDATE_SYM NOW_SYM opt_default_time_precision */ +#line 6432 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + Lex->last_field->on_update= item; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 868: /* attribute: AUTO_INC */ +#line 6439 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 869: /* attribute: SERIAL_SYM DEFAULT VALUE_SYM */ +#line 6441 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG | UNIQUE_KEY_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + (yyval.Lex_exact_charset_extended_collation_attrs).init(); + } +#line 35366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 870: /* attribute: COLLATE_SYM collation_name */ +#line 6448 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 35374 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 871: /* attribute: serial_attribute */ +#line 6451 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 872: /* opt_compression_method: %empty */ +#line 6455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= NULL; } +#line 35386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 873: /* opt_compression_method: equal ident */ +#line 6456 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.const_simple_string)= (yyvsp[0].ident_sys).str; } +#line 35392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 874: /* opt_compressed: %empty */ +#line 6460 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 875: /* opt_compressed: compressed */ +#line 6461 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 35404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 876: /* opt_enable: %empty */ +#line 6465 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 877: /* opt_enable: ENABLE_SYM */ +#line 6466 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 35416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 878: /* compressed: COMPRESSED_SYM opt_compression_method */ +#line 6471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed((yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 35425 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 879: /* compressed_deprecated_data_type_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field->set_compressed_deprecated(thd, (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 35434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 880: /* compressed_deprecated_column_attribute: COMPRESSED_SYM opt_compression_method */ +#line 6487 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->last_field-> + set_compressed_deprecated_column_attribute(thd, (yyvsp[-1].kwd).pos(), (yyvsp[0].const_simple_string)))) + MYSQL_YYABORT; + } +#line 35444 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 881: /* asrow_attribute: not NULL_SYM opt_enable */ +#line 6496 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->flags|= NOT_NULL_FLAG; + } +#line 35452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 882: /* asrow_attribute: opt_primary KEY_SYM */ +#line 6500 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->last_field->flags|= PRI_KEY_FLAG | NOT_NULL_FLAG; + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 35462 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 885: /* serial_attribute: engine_defined_option */ +#line 6511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->last_field->option_list, &Lex->option_list_last); + } +#line 35470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 886: /* serial_attribute: with_or_without_system VERSIONING_SYM */ +#line 6515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->versioning= (yyvsp[-1].vers_column_versioning); + Lex->create_info.options|= HA_VERSIONED_TABLE; + if (Lex->alter_info.flags & ALTER_DROP_SYSTEM_VERSIONING) + { + my_yyabort_error((ER_VERS_NOT_VERSIONED, MYF(0), + Lex->create_last_non_select_table->table_name.str)); + } + } +#line 35484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 887: /* with_or_without_system: WITH_SYSTEM_SYM */ +#line 6528 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.versioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITH_VERSIONING; + } +#line 35494 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 888: /* with_or_without_system: WITHOUT SYSTEM */ +#line 6534 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_COLUMN_UNVERSIONED; + Lex->create_info.vers_info.unversioned_fields= true; + (yyval.vers_column_versioning)= Column_definition::WITHOUT_VERSIONING; + } +#line 35504 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 889: /* charset: CHAR_SYM SET */ +#line 6543 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[-1].kwd); } +#line 35510 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 890: /* charset: CHARSET */ +#line 6544 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.kwd)= (yyvsp[0].kwd); } +#line 35516 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 891: /* charset_name: ident_or_text */ +#line 6549 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, MY_CS_PRIMARY, + MYF(utf8_flag))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 35527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 892: /* charset_name: BINARY */ +#line 6555 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 35533 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 893: /* charset_name_or_default: charset_name */ +#line 6559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 35539 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 894: /* charset_name_or_default: DEFAULT */ +#line 6560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 35545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 895: /* opt_load_data_charset: %empty */ +#line 6564 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= NULL; } +#line 35551 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 896: /* opt_load_data_charset: charset charset_name_or_default */ +#line 6565 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 35557 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 897: /* old_or_new_charset_name: ident_or_text */ +#line 6570 "/home/buildbot/git/sql/sql_yacc.yy" + { + myf utf8_flag= thd->get_utf8_flag(); + if (unlikely(!((yyval.charset)=get_charset_by_csname((yyvsp[0].lex_str).str, + MY_CS_PRIMARY, + MYF(utf8_flag))) && + !((yyval.charset)=get_old_charset_by_name((yyvsp[0].lex_str).str)))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), (yyvsp[0].lex_str).str)); + } +#line 35570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 898: /* old_or_new_charset_name: BINARY */ +#line 6578 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_bin; } +#line 35576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 899: /* old_or_new_charset_name_or_default: old_or_new_charset_name */ +#line 6582 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=(yyvsp[0].charset); } +#line 35582 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 900: /* old_or_new_charset_name_or_default: DEFAULT */ +#line 6583 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)=NULL; } +#line 35588 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 901: /* collation_name: ident_or_text */ +#line 6588 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_extended_collation).set_by_name((yyvsp[0].lex_str).str, thd->get_utf8_flag())) + MYSQL_YYABORT; + } +#line 35597 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 902: /* collation_name_or_default: collation_name */ +#line 6595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation)=(yyvsp[0].Lex_extended_collation); } +#line 35603 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 903: /* collation_name_or_default: DEFAULT */ +#line 6596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_extended_collation).set_collate_default(); } +#line 35609 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 904: /* opt_default: %empty */ +#line 6600 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 905: /* opt_default: DEFAULT */ +#line 6601 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 35621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 906: /* charset_or_alias: charset charset_name */ +#line 6605 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= (yyvsp[0].charset); } +#line 35627 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 907: /* charset_or_alias: ASCII_SYM */ +#line 6606 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.charset)= &my_charset_latin1; } +#line 35633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 908: /* charset_or_alias: UNICODE_SYM */ +#line 6608 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.charset)= get_charset_by_csname("ucs2", MY_CS_PRIMARY,MYF(0))))) + my_yyabort_error((ER_UNKNOWN_CHARACTER_SET, MYF(0), "ucs2")); + } +#line 35642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 909: /* opt_binary: %empty */ +#line 6615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).init(); } +#line 35648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 911: /* binary: BYTE_SYM */ +#line 6621 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset(&my_charset_bin)); + } +#line 35656 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 912: /* binary: charset_or_alias */ +#line 6625 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset(Lex_exact_charset((yyvsp[0].charset))); + } +#line 35664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 913: /* binary: charset_or_alias BINARY */ +#line 6629 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[-1].charset)))) + MYSQL_YYABORT; + } +#line 35673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 914: /* binary: BINARY */ +#line 6633 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_exact_charset_extended_collation_attrs).set_contextually_typed_binary_style(); } +#line 35679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 915: /* binary: BINARY charset_or_alias */ +#line 6635 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_binary(Lex_exact_charset((yyvsp[0].charset)))) + MYSQL_YYABORT; + } +#line 35688 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 916: /* binary: charset_or_alias COLLATE_SYM DEFAULT */ +#line 6640 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_charset_collate_default(Lex_exact_charset((yyvsp[-2].charset))); + } +#line 35696 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 917: /* binary: charset_or_alias COLLATE_SYM collation_name */ +#line 6644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].Lex_extended_collation).merge_exact_charset(Lex_exact_charset((yyvsp[-2].charset)))) + MYSQL_YYABORT; + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 35706 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 918: /* binary: COLLATE_SYM collation_name */ +#line 6650 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs)= Lex_exact_charset_extended_collation_attrs((yyvsp[0].Lex_extended_collation)); + } +#line 35714 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 919: /* binary: COLLATE_SYM DEFAULT */ +#line 6654 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_exact_charset_extended_collation_attrs).set_collate_default(); + } +#line 35722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 920: /* opt_bin_mod: %empty */ +#line 6660 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 35728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 921: /* opt_bin_mod: BINARY */ +#line 6661 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 35734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 922: /* $@93: %empty */ +#line 6666 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[0].ulong_num) == 0)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 35746 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 923: /* ws_nweights: '(' real_ulong_num $@93 ')' */ +#line 6674 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-2].ulong_num); } +#line 35752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 924: /* ws_level_flag_desc: ASC */ +#line 6678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35758 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 925: /* ws_level_flag_desc: DESC */ +#line 6679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_DESC_SHIFT; } +#line 35764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 926: /* ws_level_flag_reverse: REVERSE_SYM */ +#line 6683 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1 << MY_STRXFRM_REVERSE_SHIFT; } +#line 35770 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 927: /* ws_level_flags: %empty */ +#line 6686 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 928: /* ws_level_flags: ws_level_flag_desc */ +#line 6687 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 929: /* ws_level_flags: ws_level_flag_desc ws_level_flag_reverse */ +#line 6688 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[-1].ulong_num) | (yyvsp[0].ulong_num); } +#line 35788 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 930: /* ws_level_flags: ws_level_flag_reverse */ +#line 6689 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) ; } +#line 35794 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 931: /* ws_level_number: real_ulong_num */ +#line 6694 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (yyvsp[0].ulong_num) < 1 ? 1 : ((yyvsp[0].ulong_num) > MY_STRXFRM_NLEVELS ? MY_STRXFRM_NLEVELS : (yyvsp[0].ulong_num)); + (yyval.ulong_num)--; + } +#line 35803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 932: /* ws_level_list_item: ws_level_number ws_level_flags */ +#line 6702 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ulong_num)= (1 | (yyvsp[0].ulong_num)) << (yyvsp[-1].ulong_num); + } +#line 35811 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 933: /* ws_level_list: ws_level_list_item */ +#line 6708 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35817 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 934: /* ws_level_list: ws_level_list ',' ws_level_list_item */ +#line 6709 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)|= (yyvsp[0].ulong_num); } +#line 35823 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 935: /* ws_level_range: ws_level_number '-' ws_level_number */ +#line 6714 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint start= (yyvsp[-2].ulong_num); + uint end= (yyvsp[0].ulong_num); + for ((yyval.ulong_num)= 0; start <= end; start++) + (yyval.ulong_num)|= (1 << start); + } +#line 35834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 936: /* ws_level_list_or_range: ws_level_list */ +#line 6723 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 937: /* ws_level_list_or_range: ws_level_range */ +#line 6724 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 938: /* opt_ws_levels: %empty */ +#line 6728 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 35852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 939: /* opt_ws_levels: LEVEL_SYM ws_level_list_or_range */ +#line 6729 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num); } +#line 35858 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 942: /* references: REFERENCES table_ident opt_ref_list opt_match_clause opt_on_update_delete */ +#line 6743 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)=(yyvsp[-3].table); + } +#line 35866 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 943: /* opt_ref_list: %empty */ +#line 6750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ref_list.empty(); } +#line 35872 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 945: /* ref_list: ref_list ',' ident */ +#line 6756 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + Lex->ref_list.push_back(key, thd->mem_root); + } +#line 35883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 946: /* ref_list: ident */ +#line 6763 "/home/buildbot/git/sql/sql_yacc.yy" + { + Key_part_spec *key= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely(key == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->ref_list.empty(); + lex->ref_list.push_back(key, thd->mem_root); + } +#line 35896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 947: /* opt_match_clause: %empty */ +#line 6775 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_UNDEF; } +#line 35902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 948: /* opt_match_clause: MATCH FULL */ +#line 6777 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_FULL; } +#line 35908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 949: /* opt_match_clause: MATCH PARTIAL */ +#line 6779 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_PARTIAL; } +#line 35914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 950: /* opt_match_clause: MATCH SIMPLE_SYM */ +#line 6781 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->fk_match_option= Foreign_key::FK_MATCH_SIMPLE; } +#line 35920 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 951: /* opt_on_update_delete: %empty */ +#line 6786 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 35930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 952: /* opt_on_update_delete: ON UPDATE_SYM delete_option */ +#line 6792 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= FK_OPTION_UNDEF; + } +#line 35940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 953: /* opt_on_update_delete: ON DELETE_SYM delete_option */ +#line 6798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= FK_OPTION_UNDEF; + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 35950 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 954: /* opt_on_update_delete: ON UPDATE_SYM delete_option ON DELETE_SYM delete_option */ +#line 6805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[-3].m_fk_option); + lex->fk_delete_opt= (yyvsp[0].m_fk_option); + } +#line 35960 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 955: /* opt_on_update_delete: ON DELETE_SYM delete_option ON UPDATE_SYM delete_option */ +#line 6812 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->fk_update_opt= (yyvsp[0].m_fk_option); + lex->fk_delete_opt= (yyvsp[-3].m_fk_option); + } +#line 35970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 956: /* delete_option: RESTRICT */ +#line 6820 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_RESTRICT; } +#line 35976 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 957: /* delete_option: CASCADE */ +#line 6821 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_CASCADE; } +#line 35982 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 958: /* delete_option: SET NULL_SYM */ +#line 6822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_NULL; } +#line 35988 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 959: /* delete_option: NO_SYM ACTION */ +#line 6823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_NO_ACTION; } +#line 35994 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 960: /* delete_option: SET DEFAULT */ +#line 6824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_fk_option)= FK_OPTION_SET_DEFAULT; } +#line 36000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 961: /* constraint_key_type: PRIMARY_SYM KEY_SYM */ +#line 6828 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::PRIMARY; } +#line 36006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 962: /* constraint_key_type: UNIQUE_SYM opt_key_or_index */ +#line 6829 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::UNIQUE; } +#line 36012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 963: /* key_or_index: KEY_SYM */ +#line 6833 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 964: /* key_or_index: INDEX_SYM */ +#line 6834 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 965: /* opt_key_or_index: %empty */ +#line 6838 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 967: /* keys_or_index: KEYS */ +#line 6843 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 968: /* keys_or_index: INDEX_SYM */ +#line 6844 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 969: /* keys_or_index: INDEXES */ +#line 6845 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 970: /* fulltext: FULLTEXT_SYM */ +#line 6849 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_type)= Key::FULLTEXT;} +#line 36054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 971: /* spatial: SPATIAL_SYM */ +#line 6854 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_SPATIAL + (yyval.key_type)= Key::SPATIAL; +#else + my_yyabort_error((ER_FEATURE_DISABLED, MYF(0), sym_group_geom.name, + sym_group_geom.needed_define)); +#endif + } +#line 36067 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 972: /* normal_key_options: %empty */ +#line 6865 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36073 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 973: /* normal_key_options: normal_key_opts */ +#line 6866 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36079 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 974: /* fulltext_key_options: %empty */ +#line 6870 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36085 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 975: /* fulltext_key_options: fulltext_key_opts */ +#line 6871 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 976: /* spatial_key_options: %empty */ +#line 6875 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36097 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 977: /* spatial_key_options: spatial_key_opts */ +#line 6876 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->option_list= Lex->option_list; } +#line 36103 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 984: /* opt_USING_key_algorithm: %empty */ +#line 6895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36109 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 985: /* opt_USING_key_algorithm: USING btree_or_rtree */ +#line 6896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36115 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 986: /* opt_key_algorithm_clause: %empty */ +#line 6901 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_UNDEF; } +#line 36121 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 987: /* opt_key_algorithm_clause: USING btree_or_rtree */ +#line 6902 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36127 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 988: /* opt_key_algorithm_clause: TYPE_SYM btree_or_rtree */ +#line 6903 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= (yyvsp[0].key_alg); } +#line 36133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 989: /* key_using_alg: USING btree_or_rtree */ +#line 6908 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36139 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 990: /* key_using_alg: TYPE_SYM btree_or_rtree */ +#line 6910 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.algorithm= (yyvsp[0].key_alg); } +#line 36145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 991: /* all_key_opt: KEY_BLOCK_SIZE opt_equal ulong_num */ +#line 6915 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.block_size= (yyvsp[0].ulong_num); + Lex->last_key->key_create_info.flags|= HA_USES_BLOCK_SIZE; + } +#line 36154 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 992: /* all_key_opt: COMMENT_SYM TEXT_STRING_sys */ +#line 6920 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_key->key_create_info.comment= (yyvsp[0].lex_str); } +#line 36160 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 993: /* all_key_opt: VISIBLE_SYM */ +#line 6922 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* This is mainly for MySQL 8.0 compatibility */ + } +#line 36168 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 994: /* all_key_opt: ignorability */ +#line 6926 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->key_create_info.is_ignored= (yyvsp[0].num); + } +#line 36176 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 995: /* all_key_opt: engine_defined_option */ +#line 6930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].engine_option_value_ptr)->link(&Lex->option_list, &Lex->option_list_last); + } +#line 36184 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1000: /* fulltext_key_opt: WITH PARSER_SYM IDENT_sys */ +#line 6947 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(plugin_is_ready(&(yyvsp[0].ident_sys), MYSQL_FTPARSER_PLUGIN))) + Lex->last_key->key_create_info.parser_name= (yyvsp[0].ident_sys); + else + my_yyabort_error((ER_FUNCTION_NOT_DEFINED, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 36195 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1001: /* btree_or_rtree: BTREE_SYM */ +#line 6956 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_BTREE; } +#line 36201 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1002: /* btree_or_rtree: RTREE_SYM */ +#line 6957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_RTREE; } +#line 36207 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1003: /* btree_or_rtree: HASH_SYM */ +#line 6958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.key_alg)= HA_KEY_ALG_HASH; } +#line 36213 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1004: /* ignorability: IGNORED_SYM */ +#line 6962 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 36219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1005: /* ignorability: NOT_SYM IGNORED_SYM */ +#line 6963 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 36225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1006: /* key_list: key_list ',' key_part order_dir */ +#line 6968 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1007: /* key_list: key_part order_dir */ +#line 6973 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].key_part)->asc= (yyvsp[0].num); + Lex->last_key->columns.push_back((yyvsp[-1].key_part), thd->mem_root); + } +#line 36243 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1008: /* opt_without_overlaps: %empty */ +#line 6980 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1009: /* opt_without_overlaps: ',' ident WITHOUT OVERLAPS_SYM */ +#line 6982 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_key->without_overlaps= true; + Lex->last_key->period= (yyvsp[-2].ident_sys); + } +#line 36258 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1010: /* key_part: ident */ +#line 6990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 36268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1011: /* key_part: ident '(' NUM ')' */ +#line 6996 "/home/buildbot/git/sql/sql_yacc.yy" + { + int key_part_len= atoi((yyvsp[-1].lex_str).str); + if (unlikely(!key_part_len)) + my_yyabort_error((ER_KEY_PART_0, MYF(0), (yyvsp[-3].ident_sys).str)); + (yyval.key_part)= new (thd->mem_root) Key_part_spec(&(yyvsp[-3].ident_sys), (uint) key_part_len); + if (unlikely((yyval.key_part) == NULL)) + MYSQL_YYABORT; + } +#line 36281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1012: /* opt_ident: %empty */ +#line 7007 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 36287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1013: /* opt_ident: field_ident */ +#line 7008 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 36293 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1014: /* string_list: text_string */ +#line 7013 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 36299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1015: /* string_list: string_list ',' text_string */ +#line 7015 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->last_field->interval_list.push_back((yyvsp[0].string), thd->mem_root); } +#line 36305 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1016: /* $@94: %empty */ +#line 7024 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->name= null_clex_str; + Lex->table_type= TABLE_TYPE_UNKNOWN; + Lex->sql_command= SQLCOM_ALTER_TABLE; + Lex->duplicates= DUP_ERROR; + Lex->first_select_lex()->order_list.empty(); + Lex->create_info.init(); + Lex->create_info.row_type= ROW_TYPE_NOT_USED; + Lex->alter_info.reset(); + Lex->no_write_to_binlog= 0; + Lex->create_info.storage_media= HA_SM_DEFAULT; + if (Lex->main_select_push()) + MYSQL_YYABORT; + DBUG_ASSERT(!Lex->m_sql_cmd); + } +#line 36325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1017: /* $@95: %empty */ +#line 7040 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-2].object_ddl_options)); + if (!Lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, MDL_SHARED_UPGRADABLE)) + MYSQL_YYABORT; + Lex->first_select_lex()->db= + (Lex->first_select_lex()->table_list.first)->db; + Lex->create_last_non_select_table= Lex->last_table(); + Lex->mark_first_table_as_inserting(); + } +#line 36341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1018: /* alter: ALTER $@94 alter_options TABLE_SYM opt_if_exists table_ident opt_lock_wait_timeout $@95 alter_commands */ +#line 7052 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (likely(!Lex->m_sql_cmd)) + { + /* Create a generic ALTER TABLE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } + Lex->pop_select(); //main select + } +#line 36356 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1019: /* $@96: %empty */ +#line 7063 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + if (Lex->main_select_push(true)) + MYSQL_YYABORT; + } +#line 36366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1020: /* alter: ALTER DATABASE ident_or_empty $@96 create_database_options */ +#line 7069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= (yyvsp[-2].ident_sys); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 36380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1021: /* $@97: %empty */ +#line 7079 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.init(); + Lex->create_info.schema_comment= thd->make_clex_string((yyvsp[0].lex_str)); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } +#line 36390 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1022: /* alter: ALTER DATABASE COMMENT_SYM opt_equal TEXT_STRING_sys $@97 opt_create_database_options */ +#line 7085 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= Lex_ident_sys(); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + } +#line 36403 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1023: /* alter: ALTER DATABASE ident UPGRADE_SYM DATA_SYM DIRECTORY_SYM NAME_SYM */ +#line 7094 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "DATABASE")); + lex->sql_command= SQLCOM_ALTER_DB_UPGRADE; + lex->name= (yyvsp[-4].ident_sys); + } +#line 36415 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1024: /* $@98: %empty */ +#line 7102 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_procedure_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 36424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1025: /* alter: ALTER PROCEDURE_SYM sp_name $@98 sp_a_chistics stmt_end */ +#line 7107 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36430 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1026: /* $@99: %empty */ +#line 7109 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_function_start((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 36439 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1027: /* alter: ALTER FUNCTION_SYM sp_name $@99 sp_a_chistics stmt_end */ +#line 7114 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36445 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1028: /* $@100: %empty */ +#line 7116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, (yyvsp[-4].num), (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 36456 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1029: /* alter: ALTER view_algorithm definer_opt opt_view_suid VIEW_SYM table_ident $@100 view_list_opt AS view_select stmt_end */ +#line 7122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36462 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1030: /* $@101: %empty */ +#line 7129 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + if (Lex->add_alter_view(thd, VIEW_ALGORITHM_INHERIT, (yyvsp[-2].view_suid), (yyvsp[0].table))) + MYSQL_YYABORT; + } +#line 36473 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1031: /* alter: ALTER definer_opt opt_view_suid VIEW_SYM table_ident $@101 view_list_opt AS view_select stmt_end */ +#line 7135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1032: /* $@102: %empty */ +#line 7137 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + /* + It is safe to use Lex->spname because + ALTER EVENT xxx RENATE TO yyy DO ALTER EVENT RENAME TO + is not allowed. Lex->spname is used in the case of RENAME TO + If it had to be supported spname had to be added to + Event_parse_data. + */ + + if (unlikely(!(Lex->event_parse_data= Event_parse_data::new_instance(thd)))) + MYSQL_YYABORT; + Lex->event_parse_data->identifier= (yyvsp[0].spname); + + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_begin= (yyvsp[-2].simple_string); + } +#line 36502 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1033: /* alter: ALTER definer_opt remember_name EVENT_SYM sp_name $@102 ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_status opt_ev_comment opt_ev_sql_stmt */ +#line 7160 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyvsp[-4].num) || (yyvsp[-3].num) || (yyvsp[-2].num) || (yyvsp[-1].num) || (yyvsp[0].num)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + /* + sql_command is set here because some rules in ev_sql_stmt + can overwrite it + */ + Lex->sql_command= SQLCOM_ALTER_EVENT; + Lex->stmt_definition_end= (char*)YYLIP->get_cpp_ptr(); + + Lex->pop_select(); //main select + } +#line 36522 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1034: /* $@103: %empty */ +#line 7176 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SERVER; + lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 36532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1035: /* alter: ALTER SERVER_SYM ident_or_text $@103 OPTIONS_SYM '(' server_options_list ')' */ +#line 7180 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 36538 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1036: /* alter: ALTER USER_SYM opt_if_exists clear_privileges grant_list opt_require_clause opt_resource_options opt_account_locking_and_opt_password_expiration */ +#line 7184 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_info.set((yyvsp[-5].object_ddl_options)); + Lex->sql_command= SQLCOM_ALTER_USER; + } +#line 36547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1037: /* $@104: %empty */ +#line 7189 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_ALTER_SEQUENCE; + DBUG_ASSERT(!lex->m_sql_cmd); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 36559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1038: /* $@105: %empty */ +#line 7197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!(lex->create_info.seq_create_info= new (thd->mem_root) + sequence_definition()) || + !lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, TL_OPTION_SEQUENCE, + TL_WRITE, MDL_EXCLUSIVE)) + MYSQL_YYABORT; + } +#line 36573 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1039: /* $@106: %empty */ +#line 7207 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Create a generic ALTER SEQUENCE statment. */ + Lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_sequence((yyvsp[-4].object_ddl_options)); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36584 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1040: /* alter: ALTER SEQUENCE_SYM opt_if_exists $@104 table_ident $@105 sequence_defs $@106 stmt_end */ +#line 7212 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36590 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1041: /* account_locking_option: LOCK_SYM */ +#line 7217 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_LOCKED; + } +#line 36598 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1042: /* account_locking_option: UNLOCK_SYM */ +#line 7221 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.account_locked= ACCOUNTLOCK_UNLOCKED; + } +#line 36606 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1043: /* opt_password_expire_option: %empty */ +#line 7228 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NOW; + } +#line 36614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1044: /* opt_password_expire_option: NEVER_SYM */ +#line 7232 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_NEVER; + } +#line 36622 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1045: /* opt_password_expire_option: DEFAULT */ +#line 7236 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_DEFAULT; + } +#line 36630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1046: /* opt_password_expire_option: INTERVAL_SYM NUM DAY_SYM */ +#line 7240 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.password_expire= PASSWORD_EXPIRE_INTERVAL; + if (!(Lex->account_options.num_expiration_days= atoi((yyvsp[-1].lex_str).str))) + my_yyabort_error((ER_WRONG_VALUE, MYF(0), "DAY", (yyvsp[-1].lex_str).str)); + } +#line 36640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1052: /* ev_alter_on_schedule_completion: %empty */ +#line 7256 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 36646 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1053: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time */ +#line 7257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36652 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1054: /* ev_alter_on_schedule_completion: ev_on_completion */ +#line 7258 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36658 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1055: /* ev_alter_on_schedule_completion: ON SCHEDULE_SYM ev_schedule_time ev_on_completion */ +#line 7259 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1056: /* opt_ev_rename_to: %empty */ +#line 7263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 36670 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1057: /* opt_ev_rename_to: RENAME TO_SYM sp_name */ +#line 7265 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use lex's spname to hold the new name. + The original name is in the Event_parse_data object + */ + Lex->spname= (yyvsp[0].spname); + (yyval.num)= 1; + } +#line 36683 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1058: /* opt_ev_sql_stmt: %empty */ +#line 7276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0;} +#line 36689 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1059: /* opt_ev_sql_stmt: DO_SYM ev_sql_stmt */ +#line 7277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 36695 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1060: /* ident_or_empty: %empty */ +#line 7282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys)= Lex_ident_sys(); } +#line 36701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1063: /* alter_commands: DISCARD TABLESPACE */ +#line 7289 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::DISCARD_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1064: /* alter_commands: IMPORT TABLESPACE */ +#line 7297 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_discard_import_tablespace( + Sql_cmd_discard_import_tablespace::IMPORT_TABLESPACE); + if (unlikely(Lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1070: /* alter_commands: DROP PARTITION_SYM opt_if_exists alt_part_name_list */ +#line 7319 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_DROP; + DBUG_ASSERT(!Lex->if_exists()); + Lex->create_info.add((yyvsp[-1].object_ddl_options)); + } +#line 36735 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1071: /* alter_commands: REBUILD_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7326 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_REBUILD; + lex->no_write_to_binlog= (yyvsp[-1].num); + } +#line 36745 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1072: /* $@107: %empty */ +#line 7333 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_optimize_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1074: /* alter_commands: ANALYZE_SYM PARTITION_SYM opt_no_write_to_binlog all_or_alt_part_name_list */ +#line 7346 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_analyze_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1075: /* $@108: %empty */ +#line 7357 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_check_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36789 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1077: /* $@109: %empty */ +#line 7369 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_repair_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36804 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1079: /* alter_commands: COALESCE PARTITION_SYM opt_no_write_to_binlog real_ulong_num */ +#line 7381 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->alter_info.partition_flags|= ALTER_PARTITION_COALESCE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->alter_info.num_parts= (yyvsp[0].ulong_num); + } +#line 36815 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1080: /* alter_commands: TRUNCATE_SYM PARTITION_SYM all_or_alt_part_name_list */ +#line 7388 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->check_opt.init(); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_alter_table_truncate_partition(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36829 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1082: /* alter_commands: EXCHANGE_SYM PARTITION_SYM alt_part_name_item WITH TABLE_SYM table_ident have_partitioning */ +#line 7400 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table_exchange_partition((yyvsp[-1].table))) + MYSQL_YYABORT; + } +#line 36838 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1083: /* alter_commands: CONVERT_SYM PARTITION_SYM alt_part_name_item TO_SYM TABLE_SYM table_ident have_partitioning */ +#line 7406 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->stmt_alter_table((yyvsp[-1].table))) + MYSQL_YYABORT; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + lex->alter_info.partition_flags|= ALTER_PARTITION_CONVERT_OUT; + } +#line 36852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1084: /* $@110: %empty */ +#line 7416 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), nullptr, 0, + TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + + /* + This will appear as (new_db, new_name) in alter_ctx. + new_db will be IX-locked and new_name X-locked. + */ + lex->first_select_lex()->db= (yyvsp[0].table)->db; + lex->name= (yyvsp[0].table)->table; + if (lex->first_select_lex()->db.str == NULL && + lex->copy_db_to(&lex->first_select_lex()->db)) + MYSQL_YYABORT; + + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->part_info->num_parts= 1; + /* + OR-ed with ALTER_PARTITION_ADD because too many checks of + ALTER_PARTITION_ADD required. + */ + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD | + ALTER_PARTITION_CONVERT_IN; + } +#line 36886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1085: /* alter_commands: CONVERT_SYM TABLE_SYM table_ident $@110 TO_SYM PARTITION_SYM part_definition */ +#line 7446 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_alter_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 36897 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1086: /* remove_partitioning: REMOVE_SYM PARTITIONING_SYM */ +#line 7456 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REMOVE; + } +#line 36905 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1087: /* all_or_alt_part_name_list: ALL */ +#line 7463 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ALL; + } +#line 36913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1089: /* $@111: %empty */ +#line 7472 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->alter_info.partition_flags|= ALTER_PARTITION_ADD; + DBUG_ASSERT(!Lex->create_info.if_not_exists()); + lex->create_info.set((yyvsp[-1].object_ddl_options)); + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 36929 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1090: /* add_partition_rule: ADD PARTITION_SYM opt_if_not_exists opt_no_write_to_binlog $@111 add_part_extra */ +#line 7484 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36935 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1092: /* add_part_extra: '(' part_def_list ')' */ +#line 7490 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info->num_parts= lex->part_info->partitions.elements; + } +#line 36944 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1093: /* add_part_extra: PARTITIONS_SYM real_ulong_num */ +#line 7495 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->part_info->num_parts= (yyvsp[0].ulong_num); + } +#line 36952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1094: /* $@112: %empty */ +#line 7502 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->part_info= new (thd->mem_root) partition_info(); + if (unlikely(!lex->part_info)) + MYSQL_YYABORT; + + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 36965 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1096: /* reorg_parts_rule: %empty */ +#line 7515 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_TABLE_REORG; + } +#line 36973 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1097: /* $@113: %empty */ +#line 7519 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_REORGANIZE; + } +#line 36981 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1098: /* reorg_parts_rule: alt_part_name_list $@113 INTO '(' part_def_list ')' */ +#line 7523 "/home/buildbot/git/sql/sql_yacc.yy" + { + partition_info *part_info= Lex->part_info; + part_info->num_parts= part_info->partitions.elements; + } +#line 36990 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1099: /* alt_part_name_list: alt_part_name_item */ +#line 7530 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 36996 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1100: /* alt_part_name_list: alt_part_name_list ',' alt_part_name_item */ +#line 7531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37002 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1101: /* alt_part_name_item: ident */ +#line 7536 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.partition_names.push_back((yyvsp[0].ident_sys).str, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 37012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1105: /* alter_list_item: add_column column_def opt_place */ +#line 7558 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->create_last_non_select_table= lex->last_table(); + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37023 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1106: /* alter_list_item: ADD key_def */ +#line 7565 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->create_last_non_select_table= Lex->last_table(); + Lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37032 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1107: /* alter_list_item: ADD period_for_system_time */ +#line 7570 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_PERIOD; + } +#line 37040 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1108: /* alter_list_item: ADD PERIOD_SYM opt_if_not_exists_table_element period_for_application_time */ +#line 7575 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_period_info &period= Lex->create_info.period_info; + period.create_if_not_exists= Lex->check_exists; + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37050 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1109: /* alter_list_item: add_column '(' create_field_list ')' */ +#line 7581 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_PARSER_ADD_COLUMN; + if (!lex->alter_info.key_list.is_empty()) + lex->alter_info.flags|= ALTER_ADD_INDEX; + } +#line 37061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1110: /* alter_list_item: ADD constraint_def */ +#line 7588 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + } +#line 37069 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1111: /* alter_list_item: ADD CONSTRAINT IF_SYM not EXISTS field_ident check_constraint */ +#line 7592 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_CHECK_CONSTRAINT; + Lex->add_constraint((yyvsp[-1].lex_str), (yyvsp[0].virtual_column), TRUE); + } +#line 37078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1112: /* alter_list_item: CHANGE opt_column opt_if_exists_table_element field_ident field_spec opt_place */ +#line 7598 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN | ALTER_RENAME_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-2].lex_str); + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1113: /* alter_list_item: MODIFY_SYM opt_column opt_if_exists_table_element field_spec opt_place */ +#line 7606 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_CHANGE_COLUMN; + Lex->create_last_non_select_table= Lex->last_table(); + (yyvsp[-1].create_field)->change= (yyvsp[-1].create_field)->field_name; + (yyvsp[-1].create_field)->after= (yyvsp[0].lex_str); + } +#line 37100 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1114: /* alter_list_item: DROP opt_column opt_if_exists_table_element field_ident opt_restrict */ +#line 7613 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::COLUMN, (yyvsp[-1].lex_str).str, (yyvsp[-2].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_PARSER_DROP_COLUMN; + } +#line 37114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1115: /* alter_list_item: DROP CONSTRAINT opt_if_exists_table_element field_ident */ +#line 7623 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::CHECK_CONSTRAINT, + (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 37129 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1116: /* alter_list_item: DROP FOREIGN KEY_SYM opt_if_exists_table_element field_ident */ +#line 7634 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::FOREIGN_KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_FOREIGN_KEY; + } +#line 37143 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1117: /* alter_list_item: DROP opt_constraint_no_id PRIMARY_SYM KEY_SYM */ +#line 7644 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, primary_key_name.str, + FALSE)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37158 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1118: /* alter_list_item: DROP key_or_index opt_if_exists_table_element field_ident */ +#line 7655 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[0].lex_str).str, (yyvsp[-1].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + lex->alter_info.flags|= ALTER_DROP_INDEX; + } +#line 37172 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1119: /* alter_list_item: DISABLE_SYM KEYS */ +#line 7665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::DISABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37182 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1120: /* alter_list_item: ENABLE_SYM KEYS */ +#line 7671 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.keys_onoff= Alter_info::ENABLE; + lex->alter_info.flags|= ALTER_KEYS_ONOFF; + } +#line 37192 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1121: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident SET DEFAULT column_default_expr */ +#line 7677 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (check_expression((yyvsp[0].virtual_column), &(yyvsp[-3].lex_str), VCOL_DEFAULT)) + MYSQL_YYABORT; + if (unlikely(Lex->add_alter_list((yyvsp[-3].lex_str), (yyvsp[0].virtual_column), (yyvsp[-4].num)))) + MYSQL_YYABORT; + } +#line 37203 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1122: /* alter_list_item: ALTER key_or_index opt_if_exists_table_element ident ignorability */ +#line 7684 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + Alter_index_ignorability *ac= new (thd->mem_root) + Alter_index_ignorability((yyvsp[-1].ident_sys).str, (yyvsp[0].num), (yyvsp[-2].num)); + if (ac == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_index_ignorability_list.push_back(ac); + lex->alter_info.flags|= ALTER_INDEX_IGNORABILITY; + } +#line 37217 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1123: /* alter_list_item: ALTER opt_column opt_if_exists_table_element field_ident DROP DEFAULT */ +#line 7694 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].lex_str), (Virtual_column_info*) 0, (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37226 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1124: /* alter_list_item: RENAME opt_to table_ident */ +#line 7699 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_alter_table((yyvsp[0].table))) + MYSQL_YYABORT; + Lex->alter_info.flags|= ALTER_RENAME; + } +#line 37236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1125: /* alter_list_item: RENAME COLUMN_SYM opt_if_exists_table_element ident TO_SYM ident */ +#line 7705 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_alter_list((yyvsp[-2].ident_sys), (yyvsp[0].ident_sys), (yyvsp[-3].num)))) + MYSQL_YYABORT; + } +#line 37245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1126: /* alter_list_item: RENAME key_or_index opt_if_exists_table_element field_ident TO_SYM field_ident */ +#line 7710 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_rename_key *ak= new (thd->mem_root) + Alter_rename_key((yyvsp[-2].lex_str), (yyvsp[0].lex_str), (yyvsp[-3].num)); + if (ak == NULL) + MYSQL_YYABORT; + lex->alter_info.alter_rename_key_list.push_back(ak); + lex->alter_info.flags|= ALTER_RENAME_INDEX; + } +#line 37259 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1127: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default */ +#line 7720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[0].charset))) + MYSQL_YYABORT; + } +#line 37268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1128: /* alter_list_item: CONVERT_SYM TO_SYM charset charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 7726 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->add_alter_list_item_convert_to_charset((yyvsp[-2].charset), (yyvsp[0].Lex_extended_collation))) + MYSQL_YYABORT; + } +#line 37277 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1129: /* alter_list_item: create_table_options_space_separated */ +#line 7731 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_OPTIONS; + } +#line 37286 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1130: /* alter_list_item: FORCE_SYM */ +#line 7736 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_RECREATE; + } +#line 37294 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1131: /* alter_list_item: alter_order_clause */ +#line 7740 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->alter_info.flags|= ALTER_ORDER; + } +#line 37303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1134: /* alter_list_item: ADD SYSTEM VERSIONING_SYM */ +#line 7747 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_ADD_SYSTEM_VERSIONING; + Lex->create_info.options|= HA_VERSIONED_TABLE; + } +#line 37312 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1135: /* alter_list_item: DROP SYSTEM VERSIONING_SYM */ +#line 7752 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_SYSTEM_VERSIONING; + Lex->create_info.options&= ~HA_VERSIONED_TABLE; + } +#line 37321 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1136: /* alter_list_item: DROP PERIOD_SYM FOR_SYSTEM_TIME_SYM */ +#line 7757 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.flags|= ALTER_DROP_PERIOD; + } +#line 37329 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1137: /* alter_list_item: DROP PERIOD_SYM opt_if_exists_table_element FOR_SYM ident */ +#line 7761 "/home/buildbot/git/sql/sql_yacc.yy" + { + Alter_drop *ad= new Alter_drop(Alter_drop::PERIOD, (yyvsp[0].ident_sys).str, (yyvsp[-2].num)); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + Lex->alter_info.drop_list.push_back(ad, thd->mem_root); + Lex->alter_info.flags|= ALTER_DROP_CHECK_CONSTRAINT; + } +#line 37341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1143: /* alter_algorithm_option: ALGORITHM_SYM opt_equal DEFAULT */ +#line 7780 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.set_requested_algorithm( + Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT); + } +#line 37350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1144: /* alter_algorithm_option: ALGORITHM_SYM opt_equal ident */ +#line 7785 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_algorithm(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_ALGORITHM, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 37359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1145: /* alter_lock_option: LOCK_SYM opt_equal DEFAULT */ +#line 7793 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_DEFAULT; + } +#line 37368 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1146: /* alter_lock_option: LOCK_SYM opt_equal ident */ +#line 7798 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->alter_info.set_requested_lock(&(yyvsp[0].ident_sys)))) + my_yyabort_error((ER_UNKNOWN_ALTER_LOCK, MYF(0), (yyvsp[0].ident_sys).str)); + } +#line 37377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1147: /* opt_column: %empty */ +#line 7805 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37383 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1148: /* opt_column: COLUMN_SYM */ +#line 7806 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37389 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1149: /* opt_ignore: %empty */ +#line 7810 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 37395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1150: /* opt_ignore: IGNORE_SYM */ +#line 7811 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 37401 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1151: /* $@114: %empty */ +#line 7815 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 0;} +#line 37407 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1157: /* alter_option: IGNORE_SYM */ +#line 7829 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1;} +#line 37413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1158: /* alter_option: ONLINE_SYM */ +#line 7831 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.requested_lock= + Alter_info::ALTER_TABLE_LOCK_NONE; + } +#line 37422 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1159: /* opt_restrict: %empty */ +#line 7838 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_DEFAULT; } +#line 37428 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1160: /* opt_restrict: RESTRICT */ +#line 7839 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_RESTRICT; } +#line 37434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1161: /* opt_restrict: CASCADE */ +#line 7840 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->drop_mode= DROP_CASCADE; } +#line 37440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1162: /* opt_place: %empty */ +#line 7844 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 37446 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1163: /* opt_place: AFTER_SYM ident */ +#line 7846 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str)= (yyvsp[0].ident_sys); + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 37455 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1164: /* opt_place: FIRST_SYM */ +#line 7851 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str).str= first_keyword; + (yyval.lex_str).length= 5; /* Length of "first" */ + Lex->alter_info.flags |= ALTER_COLUMN_ORDER; + } +#line 37465 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1165: /* opt_to: %empty */ +#line 7859 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1166: /* opt_to: TO_SYM */ +#line 7860 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37477 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1167: /* opt_to: '=' */ +#line 7861 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37483 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1168: /* opt_to: AS */ +#line 7862 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1169: /* $@115: %empty */ +#line 7867 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_START; + lex->type = 0; + /* If you change this code don't forget to update SLAVE START too */ + } +#line 37500 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1170: /* slave: START_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel $@115 slave_until */ +#line 7874 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1171: /* $@116: %empty */ +#line 7876 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_START; + lex->type = 0; + /* If you change this code don't forget to update STOP SLAVE too */ + } +#line 37517 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1172: /* slave: START_SYM ALL SLAVES slave_thread_opts $@116 */ +#line 7882 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1173: /* slave: STOP_SYM SLAVE optional_connection_name slave_thread_opts optional_for_channel */ +#line 7884 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 37534 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1174: /* slave: STOP_SYM ALL SLAVES slave_thread_opts */ +#line 7891 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_SLAVE_ALL_STOP; + lex->type = 0; + /* If you change this code don't forget to update SLAVE STOP too */ + } +#line 37545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1175: /* start: START_SYM TRANSACTION_SYM opt_start_transaction_option_list */ +#line 7901 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_BEGIN; + /* READ ONLY and READ WRITE are mutually exclusive. */ + if (unlikely(((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_WRITE) && + ((yyvsp[0].num) & MYSQL_START_TRANS_OPT_READ_ONLY))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + lex->start_transaction_opt= (yyvsp[0].num); + } +#line 37562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1176: /* opt_start_transaction_option_list: %empty */ +#line 7917 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= 0; + } +#line 37570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1177: /* opt_start_transaction_option_list: start_transaction_option_list */ +#line 7921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 37578 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1178: /* start_transaction_option_list: start_transaction_option */ +#line 7928 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[0].num); + } +#line 37586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1179: /* start_transaction_option_list: start_transaction_option_list ',' start_transaction_option */ +#line 7932 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (yyvsp[-2].num) | (yyvsp[0].num); + } +#line 37594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1180: /* start_transaction_option: WITH CONSISTENT_SYM SNAPSHOT_SYM */ +#line 7939 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT; + } +#line 37602 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1181: /* start_transaction_option: READ_SYM ONLY_SYM */ +#line 7943 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_ONLY; + } +#line 37610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1182: /* start_transaction_option: READ_SYM WRITE_SYM */ +#line 7947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= MYSQL_START_TRANS_OPT_READ_WRITE; + } +#line 37618 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1183: /* $@117: %empty */ +#line 7953 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt= 0; } +#line 37624 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1184: /* slave_thread_opts: $@117 slave_thread_opt_list */ +#line 7955 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1187: /* slave_thread_opt: %empty */ +#line 7964 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37636 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1188: /* slave_thread_opt: SQL_THREAD */ +#line 7965 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_SQL; } +#line 37642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1189: /* slave_thread_opt: RELAY_THREAD */ +#line 7966 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->slave_thd_opt|=SLAVE_IO; } +#line 37648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1190: /* slave_until: %empty */ +#line 7970 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1191: /* slave_until: UNTIL_SYM slave_until_opts */ +#line 7972 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(((lex->mi.log_file_name || lex->mi.pos) && + (lex->mi.relay_log_name || lex->mi.relay_log_pos)) || + !((lex->mi.log_file_name && lex->mi.pos) || + (lex->mi.relay_log_name && lex->mi.relay_log_pos)))) + my_yyabort_error((ER_BAD_SLAVE_UNTIL_COND, MYF(0))); + } +#line 37667 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1192: /* slave_until: UNTIL_SYM MASTER_GTID_POS_SYM '=' TEXT_STRING_sys */ +#line 7981 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mi.gtid_pos_str = (yyvsp[0].lex_str); + } +#line 37675 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1195: /* $@118: %empty */ +#line 7993 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_CHECKSUM; + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1196: /* checksum: CHECKSUM_SYM table_or_tables $@118 table_list opt_checksum_type */ +#line 8000 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1197: /* opt_checksum_type: %empty */ +#line 8004 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= 0; } +#line 37698 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1198: /* opt_checksum_type: QUICK */ +#line 8005 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_QUICK; } +#line 37704 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1199: /* opt_checksum_type: EXTENDED_SYM */ +#line 8006 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags= T_EXTEND; } +#line 37710 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1201: /* $@119: %empty */ +#line 8012 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 37716 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1203: /* $@120: %empty */ +#line 8018 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_REPAIR; + lex->no_write_to_binlog= (yyvsp[0].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37730 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1204: /* repair: REPAIR opt_no_write_to_binlog $@120 repair_table_or_view */ +#line 8028 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_repair_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37742 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1205: /* opt_mi_repair_type: %empty */ +#line 8038 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 37748 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1206: /* opt_mi_repair_type: mi_repair_types */ +#line 8039 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37754 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1207: /* mi_repair_types: mi_repair_type */ +#line 8043 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1208: /* mi_repair_types: mi_repair_type mi_repair_types */ +#line 8044 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1209: /* mi_repair_type: QUICK */ +#line 8048 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 37772 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1210: /* mi_repair_type: EXTENDED_SYM */ +#line 8049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 37778 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1211: /* mi_repair_type: USE_FRM */ +#line 8050 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_USEFRM; } +#line 37784 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1212: /* opt_view_repair_type: %empty */ +#line 8054 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1213: /* opt_view_repair_type: FOR_SYM UPGRADE_SYM */ +#line 8055 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 37796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1214: /* opt_view_repair_type: FROM MYSQL_SYM */ +#line 8056 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FROM_MYSQL; } +#line 37802 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1215: /* $@121: %empty */ +#line 8061 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_ANALYZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37816 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1216: /* analyze: ANALYZE_SYM opt_no_write_to_binlog table_or_tables $@121 analyze_table_list */ +#line 8071 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_analyze_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 37828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1220: /* opt_persistent_stat_clause: %empty */ +#line 8091 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1221: /* opt_persistent_stat_clause: PERSISTENT_SYM FOR_SYM persistent_stat_spec */ +#line 8093 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->with_persistent_for_clause= TRUE; + } +#line 37842 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1222: /* persistent_stat_spec: ALL */ +#line 8100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37848 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1223: /* persistent_stat_spec: COLUMNS persistent_column_stat_spec INDEXES persistent_index_stat_spec */ +#line 8102 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37854 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1224: /* persistent_column_stat_spec: ALL */ +#line 8106 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1225: /* $@122: %empty */ +#line 8108 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->column_list= new (thd->mem_root) List; + if (unlikely(lex->column_list == NULL)) + MYSQL_YYABORT; + } +#line 37871 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1226: /* persistent_column_stat_spec: '(' $@122 table_column_list ')' */ +#line 8116 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37877 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1227: /* persistent_index_stat_spec: ALL */ +#line 8120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1228: /* $@123: %empty */ +#line 8122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + lex->index_list= new (thd->mem_root) List; + if (unlikely(lex->index_list == NULL)) + MYSQL_YYABORT; + } +#line 37894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1229: /* persistent_index_stat_spec: '(' $@123 table_index_list ')' */ +#line 8130 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 37900 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1230: /* table_column_list: %empty */ +#line 8135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37906 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1231: /* table_column_list: ident */ +#line 8137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 37915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1232: /* table_column_list: table_column_list ',' ident */ +#line 8142 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->column_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), thd->mem_root); + } +#line 37924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1233: /* table_index_list: %empty */ +#line 8150 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 37930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1236: /* table_index_name: ident */ +#line 8157 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_STRING)), + thd->mem_root); + } +#line 37940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1237: /* table_index_name: PRIMARY_SYM */ +#line 8164 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_STRING str= {(char*) "PRIMARY", 7}; + Lex->index_list->push_back((LEX_STRING*) + thd->memdup(&str, sizeof(LEX_STRING)), + thd->mem_root); + } +#line 37951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1238: /* binlog_base64_event: BINLOG_SYM TEXT_STRING_sys */ +#line 8174 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[0].lex_str); + Lex->ident.str= NULL; + Lex->ident.length= 0; + } +#line 37962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1239: /* binlog_base64_event: BINLOG_SYM '@' ident_or_text ',' '@' ident_or_text */ +#line 8182 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_BINLOG_BASE64_EVENT; + Lex->comment= (yyvsp[-3].lex_str); + Lex->ident= (yyvsp[0].lex_str); + } +#line 37972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1241: /* $@124: %empty */ +#line 8192 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->table_type= TABLE_TYPE_VIEW; } +#line 37978 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1243: /* $@125: %empty */ +#line 8197 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->sql_command = SQLCOM_CHECK; + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 37992 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1244: /* check: CHECK_SYM $@125 check_view_or_table */ +#line 8207 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "CHECK")); + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_check_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1245: /* opt_mi_check_type: %empty */ +#line 8219 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags = T_MEDIUM; } +#line 38012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1246: /* opt_mi_check_type: mi_check_types */ +#line 8220 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1247: /* mi_check_types: mi_check_type */ +#line 8224 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1248: /* mi_check_types: mi_check_type mi_check_types */ +#line 8225 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 38030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1249: /* mi_check_type: QUICK */ +#line 8229 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_QUICK; } +#line 38036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1250: /* mi_check_type: FAST_SYM */ +#line 8230 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_FAST; } +#line 38042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1251: /* mi_check_type: MEDIUM_SYM */ +#line 8231 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_MEDIUM; } +#line 38048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1252: /* mi_check_type: EXTENDED_SYM */ +#line 8232 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_EXTEND; } +#line 38054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1253: /* mi_check_type: CHANGED */ +#line 8233 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.flags|= T_CHECK_ONLY_CHANGED; } +#line 38060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1254: /* mi_check_type: FOR_SYM UPGRADE_SYM */ +#line 8234 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1255: /* opt_view_check_type: %empty */ +#line 8238 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1256: /* opt_view_check_type: FOR_SYM UPGRADE_SYM */ +#line 8239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->check_opt.sql_flags|= TT_FOR_UPGRADE; } +#line 38078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1257: /* $@126: %empty */ +#line 8244 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_OPTIMIZE; + lex->no_write_to_binlog= (yyvsp[-1].num); + lex->check_opt.init(); + lex->alter_info.reset(); + /* Will be overridden during execution. */ + YYPS->m_lock_type= TL_UNLOCK; + } +#line 38092 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1258: /* optimize: OPTIMIZE opt_no_write_to_binlog table_or_tables $@126 table_list opt_lock_wait_timeout */ +#line 8254 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_optimize_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 38104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1259: /* opt_no_write_to_binlog: %empty */ +#line 8264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 38110 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1260: /* opt_no_write_to_binlog: NO_WRITE_TO_BINLOG */ +#line 8265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1261: /* opt_no_write_to_binlog: LOCAL_SYM */ +#line 8266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 38122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1262: /* $@127: %empty */ +#line 8271 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_RENAME_TABLE; + Lex->create_info.set((yyvsp[0].object_ddl_options)); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1263: /* rename: RENAME table_or_tables opt_if_exists $@127 table_to_table_list */ +#line 8278 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1264: /* rename: RENAME USER_SYM clear_privileges rename_list */ +#line 8282 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_RENAME_USER; + } +#line 38149 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1265: /* rename_list: user TO_SYM user */ +#line 8289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1266: /* rename_list: rename_list ',' user TO_SYM user */ +#line 8295 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[-2].lex_user), thd->mem_root) || + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 38169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1269: /* table_to_table: table_ident opt_lock_wait_timeout TO_SYM table_ident */ +#line 8309 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *sl= lex->current_select; + if (unlikely(!sl->add_table_to_list(thd, (yyvsp[-3].table),NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE)) || + unlikely(!sl->add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + TL_IGNORE, MDL_EXCLUSIVE))) + MYSQL_YYABORT; + } +#line 38185 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1270: /* $@128: %empty */ +#line 8324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.reset(); + } +#line 38193 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1271: /* keycache: CACHE_SYM INDEX_SYM $@128 keycache_list_or_parts IN_SYM key_cache_name */ +#line 8328 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ASSIGN_TO_KEYCACHE; + lex->ident= (yyvsp[0].lex_str); + } +#line 38203 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1276: /* assign_to_keycache: table_ident cache_keys_spec */ +#line 8347 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38215 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1277: /* assign_to_keycache_parts: table_ident adm_partition cache_keys_spec */ +#line 8358 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, 0, TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38227 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1278: /* key_cache_name: ident */ +#line 8368 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 38233 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1279: /* key_cache_name: DEFAULT */ +#line 8369 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str) = default_key_cache_base; } +#line 38239 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1280: /* $@129: %empty */ +#line 8374 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_PRELOAD_KEYS; + lex->alter_info.reset(); + if (lex->main_select_push()) + MYSQL_YYABORT; + } +#line 38251 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1281: /* preload: LOAD INDEX_SYM INTO CACHE_SYM $@129 preload_list_or_parts */ +#line 8382 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 38259 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1286: /* preload_keys: table_ident cache_keys_spec opt_ignore_leaves */ +#line 8399 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-2].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38271 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1287: /* preload_keys_parts: table_ident adm_partition cache_keys_spec opt_ignore_leaves */ +#line 8410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-3].table), NULL, (yyvsp[0].num), TL_READ, + MDL_SHARED_READ, + Select-> + pop_index_hints()))) + MYSQL_YYABORT; + } +#line 38283 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1288: /* $@130: %empty */ +#line 8421 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->alter_info.partition_flags|= ALTER_PARTITION_ADMIN; + } +#line 38291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1290: /* $@131: %empty */ +#line 8428 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->first_select_lex()->alloc_index_hints(thd); + Select->set_index_hint_type(INDEX_HINT_USE, + INDEX_HINT_MASK_ALL); + } +#line 38301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1292: /* cache_key_list_or_empty: %empty */ +#line 8437 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 38307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1294: /* opt_ignore_leaves: %empty */ +#line 8443 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 38313 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1295: /* opt_ignore_leaves: IGNORE_SYM LEAVES */ +#line 8444 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_OPTION_IGNORE_LEAVES; } +#line 38319 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1296: /* $@132: %empty */ +#line 8454 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 38330 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1297: /* select: query_expression_no_with_clause $@132 opt_procedure_or_into */ +#line 8461 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause(NULL); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 38341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1298: /* $@133: %empty */ +#line 8468 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex_unit)->fake_select_lex ? + (yyvsp[0].select_lex_unit)->fake_select_lex : + (yyvsp[0].select_lex_unit)->first_select())) + MYSQL_YYABORT; + } +#line 38352 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1299: /* select: with_clause query_expression_no_with_clause $@133 opt_procedure_or_into */ +#line 8475 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyvsp[-2].select_lex_unit)->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex_unit)->first_select()); + if (Lex->select_finalize((yyvsp[-2].select_lex_unit), (yyvsp[0].select_lock))) + MYSQL_YYABORT; + } +#line 38364 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1300: /* $@134: %empty */ +#line 8486 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 38373 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1301: /* select_into: select_into_query_specification $@134 opt_order_limit_lock */ +#line 8491 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 38387 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1302: /* $@135: %empty */ +#line 8502 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->push_select((yyvsp[0].select_lex))) + MYSQL_YYABORT; + } +#line 38396 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1303: /* select_into: with_clause select_into_query_specification $@135 opt_order_limit_lock */ +#line 8507 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX_UNIT *unit; + if (!(unit = Lex->create_unit((yyvsp[-2].select_lex)))) + MYSQL_YYABORT; + if ((yyvsp[0].order_limit_lock)) + unit= Lex->add_tail_to_query_expression_body(unit, (yyvsp[0].order_limit_lock)); + unit->set_with_clause((yyvsp[-3].with_clause)); + (yyvsp[-3].with_clause)->attach_to((yyvsp[-2].select_lex)); + if (Lex->select_finalize(unit)) + MYSQL_YYABORT; + } +#line 38412 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1304: /* simple_table: query_specification */ +#line 8521 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 38418 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1305: /* simple_table: table_value_constructor */ +#line 8522 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 38424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1306: /* $@136: %empty */ +#line 8527 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_TVC_start()) + MYSQL_YYABORT; + } +#line 38433 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1307: /* table_value_constructor: VALUES $@136 values_list */ +#line 8532 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_TVC_end())) + MYSQL_YYABORT; + } +#line 38442 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1308: /* $@137: %empty */ +#line 8540 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel; + LEX *lex= Lex; + if (!(sel= lex->alloc_select(TRUE)) || lex->push_select(sel)) + MYSQL_YYABORT; + sel->init_select(); + sel->braces= FALSE; + } +#line 38455 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1309: /* $@138: %empty */ +#line 8549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= SELECT_LIST; + } +#line 38463 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1310: /* query_specification_start: SELECT_SYM $@137 select_options $@138 select_item_list */ +#line 8553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 38471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1311: /* query_specification: query_specification_start opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8565 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 38479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1312: /* select_into_query_specification: query_specification_start into opt_from_clause opt_where_clause opt_group_clause opt_having_clause opt_window_clause */ +#line 8578 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lex)= Lex->pop_select(); + } +#line 38487 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1313: /* query_expression: query_expression_no_with_clause */ +#line 8636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause(NULL); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 38496 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1314: /* query_expression: with_clause query_expression_no_with_clause */ +#line 8642 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].select_lex_unit)->set_with_clause((yyvsp[-1].with_clause)); + (yyvsp[-1].with_clause)->attach_to((yyvsp[0].select_lex_unit)->first_select()); + (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); + } +#line 38506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1315: /* query_expression_no_with_clause: query_expression_body_ext */ +#line 8655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 38512 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1316: /* query_expression_no_with_clause: query_expression_body_ext_parens */ +#line 8656 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[0].select_lex_unit); } +#line 38518 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1317: /* $@139: %empty */ +#line 8671 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].select_lex_unit)->first_select()->next_select()) + { + if (Lex->parsed_multi_operand_query_expression_body((yyvsp[0].select_lex_unit))) + MYSQL_YYABORT; + } + } +#line 38530 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1318: /* query_expression_body_ext: query_expression_body $@139 opt_query_expression_tail */ +#line 8679 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].order_limit_lock)) + (yyval.select_lex_unit)= (yyvsp[-2].select_lex_unit); + else + (yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)); + } +#line 38541 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1319: /* $@140: %empty */ +#line 8686 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select(!(yyvsp[0].select_lex_unit)->first_select()->next_select() ? + (yyvsp[0].select_lex_unit)->first_select() : (yyvsp[0].select_lex_unit)->fake_select_lex); + } +#line 38550 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1320: /* query_expression_body_ext: query_expression_body_ext_parens $@140 query_expression_tail */ +#line 8691 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_tail_to_query_expression_body_ext_parens((yyvsp[-2].select_lex_unit), (yyvsp[0].order_limit_lock)))) + MYSQL_YYABORT; + } +#line 38559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1321: /* query_expression_body_ext_parens: '(' query_expression_body_ext_parens ')' */ +#line 8699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); } +#line 38565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1322: /* query_expression_body_ext_parens: '(' query_expression_body_ext ')' */ +#line 8701 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= (yyvsp[-1].select_lex_unit)->first_select()->next_select() ? + (yyvsp[-1].select_lex_unit)->fake_select_lex : (yyvsp[-1].select_lex_unit)->first_select(); + sel->braces= true; + (yyval.select_lex_unit)= (yyvsp[-1].select_lex_unit); + } +#line 38576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1323: /* query_expression_body: query_simple */ +#line 8716 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->push_select((yyvsp[0].select_lex)); + if (!((yyval.select_lex_unit)= Lex->create_unit((yyvsp[0].select_lex)))) + MYSQL_YYABORT; + } +#line 38586 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1324: /* $@141: %empty */ +#line 8723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].select_lex_unit)->first_select()->next_select()) + { + Lex->pop_select(); + } + } +#line 38597 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1325: /* query_expression_body: query_expression_body unit_type_decl $@141 query_primary */ +#line 8730 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body((yyvsp[-3].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-2].unit_operation).unit_type, + (yyvsp[-2].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 38608 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1326: /* query_expression_body: query_expression_body_ext_parens unit_type_decl query_primary */ +#line 8739 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex_unit)= Lex->add_primary_to_query_expression_body_ext_parens( + (yyvsp[-2].select_lex_unit), (yyvsp[0].select_lex), + (yyvsp[-1].unit_operation).unit_type, + (yyvsp[-1].unit_operation).distinct))) + MYSQL_YYABORT; + } +#line 38620 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1327: /* query_primary: query_simple */ +#line 8755 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex); } +#line 38626 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1328: /* query_primary: query_expression_body_ext_parens */ +#line 8757 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex_unit)->first_select(); } +#line 38632 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1329: /* query_simple: simple_table */ +#line 8766 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_lex)= (yyvsp[0].select_lex);} +#line 38638 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1330: /* subselect: query_expression */ +#line 8771 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 38647 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1331: /* subquery: query_expression_body_ext_parens */ +#line 8812 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].select_lex_unit)->fake_select_lex) + (yyvsp[0].select_lex_unit)->first_select()->braces= false; + else + (yyvsp[0].select_lex_unit)->fake_select_lex->braces= false; + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[0].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 38660 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1332: /* subquery: '(' with_clause query_expression_no_with_clause ')' */ +#line 8821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].select_lex_unit)->set_with_clause((yyvsp[-2].with_clause)); + (yyvsp[-2].with_clause)->attach_to((yyvsp[-1].select_lex_unit)->first_select()); + if (!((yyval.select_lex)= Lex->parsed_subselect((yyvsp[-1].select_lex_unit)))) + MYSQL_YYABORT; + } +#line 38671 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1336: /* table_reference_list: join_table_list */ +#line 8840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->context.table_list= + Select->context.first_name_resolution_table= + Select->table_list.first; + } +#line 38681 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1339: /* select_options: select_option_list */ +#line 8855 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((Select->options & SELECT_DISTINCT) && + (Select->options & SELECT_ALL))) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "ALL", "DISTINCT")); + } +#line 38691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1340: /* opt_history_unit: %empty */ +#line 8864 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 38699 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1341: /* opt_history_unit: TRANSACTION_SYM */ +#line 8868 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TRX_ID; + } +#line 38707 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1342: /* opt_history_unit: TIMESTAMP */ +#line 8872 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_range_unit)= VERS_TIMESTAMP; + } +#line 38715 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1343: /* history_point: TIMESTAMP TEXT_STRING */ +#line 8879 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item; + if (!(item= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true))) + MYSQL_YYABORT; + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, item); + } +#line 38728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1344: /* history_point: function_call_keyword_timestamp */ +#line 8888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)); + } +#line 38736 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1345: /* history_point: opt_history_unit bit_expr */ +#line 8892 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.vers_history_point)= Vers_history_point((yyvsp[-1].vers_range_unit), (yyvsp[0].item)); + } +#line 38744 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1346: /* for_portion_of_time_clause: FOR_SYM PORTION_SYM OF_SYM remember_tok_start ident FROM bit_expr TO_SYM bit_expr */ +#line 8900 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(0 == strcasecmp((yyvsp[-4].ident_sys).str, "SYSTEM_TIME"))) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-5].simple_string)); + MYSQL_YYABORT; + } + Lex->period_conditions.init(SYSTEM_TIME_FROM_TO, + Vers_history_point(VERS_TIMESTAMP, (yyvsp[-2].item)), + Vers_history_point(VERS_TIMESTAMP, (yyvsp[0].item)), + (yyvsp[-4].ident_sys)); + } +#line 38760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1347: /* opt_for_portion_of_time_clause: %empty */ +#line 8915 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 38768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1348: /* opt_for_portion_of_time_clause: for_portion_of_time_clause */ +#line 8919 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 38776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1349: /* opt_for_system_time_clause: %empty */ +#line 8926 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= false; + } +#line 38784 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1350: /* opt_for_system_time_clause: FOR_SYSTEM_TIME_SYM system_time_expr */ +#line 8930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= true; + } +#line 38792 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1351: /* system_time_expr: AS OF_SYM history_point */ +#line 8937 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_AS_OF, (yyvsp[0].vers_history_point)); + } +#line 38800 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1352: /* system_time_expr: ALL */ +#line 8941 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_ALL); + } +#line 38808 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1353: /* system_time_expr: FROM history_point TO_SYM history_point */ +#line 8945 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_FROM_TO, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 38816 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1354: /* system_time_expr: BETWEEN_SYM history_point AND_SYM history_point */ +#line 8949 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BETWEEN, (yyvsp[-2].vers_history_point), (yyvsp[0].vers_history_point)); + } +#line 38824 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1358: /* select_option: SQL_NO_CACHE_SYM */ +#line 8962 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_NO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_NO_CACHE")); + Select->options|= OPTION_NO_QUERY_CACHE; + } +#line 38837 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1359: /* select_option: SQL_CACHE_SYM */ +#line 8971 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Allow this flag once per query. + */ + if (Select->options & OPTION_TO_QUERY_CACHE) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SQL_CACHE")); + Select->options|= OPTION_TO_QUERY_CACHE; + } +#line 38850 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1360: /* select_lock_type: FOR_SYM UPDATE_SYM opt_lock_wait_timeout_new */ +#line 8984 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= TRUE; + } +#line 38860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1361: /* select_lock_type: LOCK_SYM IN_SYM SHARE_SYM MODE_SYM opt_lock_wait_timeout_new */ +#line 8990 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + (yyval.select_lock).defined_lock= TRUE; + (yyval.select_lock).update_lock= FALSE; + } +#line 38870 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1362: /* opt_select_lock_type: %empty */ +#line 9000 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 38878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1363: /* opt_select_lock_type: select_lock_type */ +#line 9004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 38886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1364: /* opt_lock_wait_timeout_new: %empty */ +#line 9011 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 38894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1365: /* opt_lock_wait_timeout_new: WAIT_SYM ulong_num */ +#line 9015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= (yyvsp[0].ulong_num); + } +#line 38904 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1366: /* opt_lock_wait_timeout_new: NOWAIT_SYM */ +#line 9021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).defined_timeout= TRUE; + (yyval.select_lock).timeout= 0; + } +#line 38914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1367: /* opt_lock_wait_timeout_new: SKIP_SYM LOCKED_SYM */ +#line 9027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + (yyval.select_lock).skip_locked= 1; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SKIP_LOCKED); + } +#line 38924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1370: /* select_item_list: '*' */ +#line 9038 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool is_parsing_returning= + thd->lex->current_select->parsing_place == + IN_RETURNING; + SELECT_LEX *correct_select= is_parsing_returning ? + thd->lex->returning() : + thd->lex->current_select; + Item *item= new (thd->mem_root) + Item_field(thd, &correct_select->context, + star_clex_str); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_item_to_list(thd, item))) + MYSQL_YYABORT; + correct_select->with_wild++; + } +#line 38945 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1371: /* select_item: remember_name select_sublist_qualified_asterisk remember_end */ +#line 9058 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_item_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + } +#line 38954 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1372: /* select_item: remember_name expr remember_end select_alias */ +#line 9063 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-3].simple_string) < (yyvsp[-1].simple_string)); + + if (unlikely(add_item_to_list(thd, (yyvsp[-2].item)))) + MYSQL_YYABORT; + if ((yyvsp[0].lex_str).str) + { + if (unlikely(Lex->sql_command == SQLCOM_CREATE_VIEW && + check_column_name((yyvsp[0].lex_str).str))) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), (yyvsp[0].lex_str).str)); + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + else if (!(yyvsp[-2].item)->name.str || (yyvsp[-2].item)->name.str == item_empty_name) + { + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + } + } +#line 38977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1373: /* remember_tok_start: %empty */ +#line 9084 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_tok_start(); + } +#line 38985 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1374: /* remember_name: %empty */ +#line 9090 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_start(); + } +#line 38993 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1375: /* remember_end: %empty */ +#line 9096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_end_rtrim(); + } +#line 39001 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1376: /* select_alias: %empty */ +#line 9102 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=null_clex_str;} +#line 39007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1377: /* select_alias: AS ident */ +#line 9103 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1378: /* select_alias: AS TEXT_STRING_sys */ +#line 9104 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1379: /* select_alias: ident */ +#line 9105 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys); } +#line 39025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1380: /* select_alias: TEXT_STRING_sys */ +#line 9106 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str); } +#line 39031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1381: /* opt_default_time_precision: %empty */ +#line 9110 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1382: /* opt_default_time_precision: '(' ')' */ +#line 9111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= NOT_FIXED_DEC; } +#line 39043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1383: /* opt_default_time_precision: '(' real_ulong_num ')' */ +#line 9112 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1384: /* opt_time_precision: %empty */ +#line 9116 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1385: /* opt_time_precision: '(' ')' */ +#line 9117 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 39061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1386: /* opt_time_precision: '(' real_ulong_num ')' */ +#line 9118 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].ulong_num); } +#line 39067 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1387: /* optional_braces: %empty */ +#line 9122 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39073 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1388: /* optional_braces: '(' ')' */ +#line 9123 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 39079 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1389: /* expr: expr or expr */ +#line 9129 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Design notes: + Do not use a manually maintained stack like thd->lex->xxx_list, + but use the internal bison stack ($$, $1 and $3) instead. + Using the bison stack is: + - more robust to changes in the grammar, + - guaranteed to be in sync with the parser state, + - better for performances (no memory allocation). + */ + Item_cond_or *item1; + Item_cond_or *item3; + if (is_cond_or((yyvsp[-2].item))) + { + item1= (Item_cond_or*) (yyvsp[-2].item); + if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + (X1 OR X2) OR (Y1 OR Y2) ==> OR (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 OR X2) OR Y ==> OR (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_or((yyvsp[0].item))) + { + item3= (Item_cond_or*) (yyvsp[0].item); + /* + X OR (Y1 OR Y2) ==> OR (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X OR Y */ + (yyval.item)= new (thd->mem_root) Item_cond_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39134 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1390: /* expr: expr XOR expr */ +#line 9180 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* XOR is a proprietary extension */ + (yyval.item)= new (thd->mem_root) Item_func_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1391: /* expr: expr and expr */ +#line 9187 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* See comments in rule expr: expr or expr */ + Item_cond_and *item1; + Item_cond_and *item3; + if (is_cond_and((yyvsp[-2].item))) + { + item1= (Item_cond_and*) (yyvsp[-2].item); + if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + (X1 AND X2) AND (Y1 AND Y2) ==> AND (X1, X2, Y1, Y2) + */ + item3->add_at_head(item1->argument_list()); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* + (X1 AND X2) AND Y ==> AND (X1, X2, Y) + */ + item1->add((yyvsp[0].item), thd->mem_root); + (yyval.item) = (yyvsp[-2].item); + } + } + else if (is_cond_and((yyvsp[0].item))) + { + item3= (Item_cond_and*) (yyvsp[0].item); + /* + X AND (Y1 AND Y2) ==> AND (X, Y1, Y2) + */ + item3->add_at_head((yyvsp[-2].item), thd->mem_root); + (yyval.item) = (yyvsp[0].item); + } + else + { + /* X AND Y */ + (yyval.item)= new (thd->mem_root) Item_cond_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } + } +#line 39192 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1392: /* expr: NOT_SYM expr */ +#line 9230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39202 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1394: /* boolean_test: boolean_test IS TRUE_SYM */ +#line 9240 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_istrue(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39212 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1395: /* boolean_test: boolean_test IS not TRUE_SYM */ +#line 9246 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnottrue(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39222 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1396: /* boolean_test: boolean_test IS FALSE_SYM */ +#line 9252 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isfalse(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39232 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1397: /* boolean_test: boolean_test IS not FALSE_SYM */ +#line 9258 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotfalse(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39242 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1398: /* boolean_test: boolean_test IS UNKNOWN_SYM */ +#line 9264 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39252 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1399: /* boolean_test: boolean_test IS not UNKNOWN_SYM */ +#line 9270 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39262 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1400: /* boolean_test: boolean_test IS NULL_SYM */ +#line 9276 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnull(thd, (yyvsp[-2].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39272 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1401: /* boolean_test: boolean_test IS not NULL_SYM */ +#line 9282 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_isnotnull(thd, (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1402: /* boolean_test: boolean_test EQUAL_SYM predicate */ +#line 9288 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_equal(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39292 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1403: /* boolean_test: boolean_test comp_op predicate */ +#line 9294 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (*(yyvsp[-1].boolfunc2creator))(0)->create(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39302 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1404: /* boolean_test: boolean_test comp_op all_or_any '(' subselect ')' */ +#line 9300 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= all_any_subquery_creator(thd, (yyvsp[-5].item), (yyvsp[-4].boolfunc2creator), (yyvsp[-3].num), (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39312 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1406: /* predicate: predicate IN_SYM subquery */ +#line 9310 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-2].item), (yyvsp[0].select_lex)); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39322 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1407: /* predicate: predicate not IN_SYM subquery */ +#line 9316 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_in_subselect(thd, (yyvsp[-3].item), (yyvsp[0].select_lex)); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1408: /* predicate: predicate IN_SYM '(' expr ')' */ +#line 9325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-4].item), true, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39345 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1409: /* predicate: predicate IN_SYM '(' expr ',' expr_list ')' */ +#line 9331 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-6].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39357 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1410: /* predicate: predicate not IN_SYM '(' expr ')' */ +#line 9339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= handle_sql2003_note184_exception(thd, (yyvsp[-5].item), false, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39367 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1411: /* predicate: predicate not IN_SYM '(' expr ',' expr_list ')' */ +#line 9345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-7].item), thd->mem_root); + Item_func_in *item= new (thd->mem_root) Item_func_in(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1412: /* predicate: predicate BETWEEN_SYM predicate AND_SYM predicate */ +#line 9354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_between(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39390 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1413: /* predicate: predicate not BETWEEN_SYM predicate AND_SYM predicate */ +#line 9360 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_between *item; + item= new (thd->mem_root) Item_func_between(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39402 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1414: /* predicate: predicate SOUNDS_SYM LIKE predicate */ +#line 9368 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item1= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[-3].item)); + Item *item4= new (thd->mem_root) Item_func_soundex(thd, (yyvsp[0].item)); + if (unlikely(item1 == NULL) || unlikely(item4 == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_eq(thd, item1, item4); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1415: /* predicate: predicate LIKE predicate */ +#line 9378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-2].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39426 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1416: /* predicate: predicate LIKE predicate ESCAPE_SYM predicate */ +#line 9384 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + (yyval.item)= new (thd->mem_root) Item_func_like(thd, (yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!(yyval.item))) + MYSQL_YYABORT; + } +#line 39437 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1417: /* predicate: predicate not LIKE predicate */ +#line 9391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-3].item), (yyvsp[0].item), escape(thd), false); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1418: /* predicate: predicate not LIKE predicate ESCAPE_SYM predicate */ +#line 9398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->escape_used= true; + Item *item= new (thd->mem_root) Item_func_like(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[0].item), true); + if (unlikely(!item)) + MYSQL_YYABORT; + (yyval.item)= item->neg_transformer(thd); + } +#line 39460 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1419: /* predicate: predicate REGEXP predicate */ +#line 9406 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1420: /* predicate: predicate not REGEXP predicate */ +#line 9412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_func_regex(thd, (yyvsp[-3].item), (yyvsp[0].item)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= negate_expression(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39483 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1422: /* bit_expr: bit_expr '|' bit_expr */ +#line 9425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_or(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39493 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1423: /* bit_expr: bit_expr '&' bit_expr */ +#line 9431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_and(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1424: /* bit_expr: bit_expr SHIFT_LEFT bit_expr */ +#line 9437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_left(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39513 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1425: /* bit_expr: bit_expr SHIFT_RIGHT bit_expr */ +#line 9443 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_shift_right(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1426: /* bit_expr: bit_expr ORACLE_CONCAT_SYM bit_expr */ +#line 9449 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat_operator_oracle(thd, + (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39534 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1427: /* bit_expr: bit_expr '+' bit_expr */ +#line 9456 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_plus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39544 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1428: /* bit_expr: bit_expr '-' bit_expr */ +#line 9462 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minus(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39554 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1429: /* bit_expr: bit_expr '+' INTERVAL_SYM expr interval */ +#line 9468 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39564 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1430: /* bit_expr: bit_expr '-' INTERVAL_SYM expr interval */ +#line 9474 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-4].item), (yyvsp[-1].item), (yyvsp[0].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39574 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1431: /* bit_expr: INTERVAL_SYM expr interval '+' expr */ +#line 9481 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39584 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1432: /* bit_expr: '+' INTERVAL_SYM expr interval '+' expr */ +#line 9487 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1433: /* bit_expr: '-' INTERVAL_SYM expr interval '+' expr */ +#line 9493 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[0].item), (yyvsp[-3].item), (yyvsp[-2].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39604 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1434: /* bit_expr: bit_expr '*' bit_expr */ +#line 9499 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mul(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1435: /* bit_expr: bit_expr '/' bit_expr */ +#line 9505 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39624 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1436: /* bit_expr: bit_expr '%' bit_expr */ +#line 9511 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39634 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1437: /* bit_expr: bit_expr DIV_SYM bit_expr */ +#line 9517 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_int_div(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39644 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1438: /* bit_expr: bit_expr MOD_SYM bit_expr */ +#line 9523 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1439: /* bit_expr: bit_expr '^' bit_expr */ +#line 9529 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_xor(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1449: /* comp_op: '=' */ +#line 9558 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_eq_creator; } +#line 39670 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1450: /* comp_op: GE */ +#line 9559 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ge_creator; } +#line 39676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1451: /* comp_op: '>' */ +#line 9560 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_gt_creator; } +#line 39682 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1452: /* comp_op: LE */ +#line 9561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_le_creator; } +#line 39688 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1453: /* comp_op: '<' */ +#line 9562 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_lt_creator; } +#line 39694 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1454: /* comp_op: NE */ +#line 9563 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.boolfunc2creator) = &comp_ne_creator; } +#line 39700 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1455: /* all_or_any: ALL */ +#line 9567 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 39706 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1456: /* all_or_any: ANY_SYM */ +#line 9568 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 39712 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1457: /* opt_dyncol_type: %empty */ +#line 9573 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_NULL); /* automatic type */ + } +#line 39720 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1458: /* opt_dyncol_type: AS dyncol_type */ +#line 9576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type)= (yyvsp[0].Lex_dyncol_type); } +#line 39726 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1462: /* numeric_dyncol_type: INT_SYM */ +#line 9586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_INT); } +#line 39732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1463: /* numeric_dyncol_type: UNSIGNED INT_SYM */ +#line 9587 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_UINT); } +#line 39738 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1464: /* numeric_dyncol_type: DOUBLE_SYM */ +#line 9588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 39744 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1465: /* numeric_dyncol_type: REAL */ +#line 9589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 39750 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1466: /* numeric_dyncol_type: FLOAT_SYM */ +#line 9590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DOUBLE); } +#line 39756 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1467: /* numeric_dyncol_type: DECIMAL_SYM float_options */ +#line 9591 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DECIMAL, (yyvsp[0].Lex_length_and_dec)); } +#line 39762 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1468: /* temporal_dyncol_type: DATE_SYM */ +#line 9595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATE); } +#line 39768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1469: /* temporal_dyncol_type: TIME_SYM opt_field_scale */ +#line 9596 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_TIME, (yyvsp[0].Lex_length_and_dec)); } +#line 39774 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1470: /* temporal_dyncol_type: DATETIME opt_field_scale */ +#line 9597 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_dyncol_type).set(DYN_COL_DATETIME, (yyvsp[0].Lex_length_and_dec)); } +#line 39780 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1471: /* string_dyncol_type: char opt_binary */ +#line 9602 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_dyncol_type).set(DYN_COL_STRING, (yyvsp[0].Lex_exact_charset_extended_collation_attrs), thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 39789 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1472: /* string_dyncol_type: nchar */ +#line 9607 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_dyncol_type).set(DYN_COL_STRING, national_charset_info); + } +#line 39797 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1473: /* dyncall_create_element: expr ',' expr opt_dyncol_type */ +#line 9614 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def)= (DYNCALL_CREATE_DEF *) + alloc_root(thd->mem_root, sizeof(DYNCALL_CREATE_DEF)); + if (unlikely((yyval.dyncol_def) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def)->key= (yyvsp[-3].item); + (yyval.dyncol_def)->value= (yyvsp[-1].item); + (yyval.dyncol_def)->type= (DYNAMIC_COLUMN_TYPE)(yyvsp[0].Lex_dyncol_type).dyncol_type(); + (yyval.dyncol_def)->cs= (yyvsp[0].Lex_dyncol_type).charset_collation(); + if ((yyvsp[0].Lex_dyncol_type).has_explicit_length()) + (yyval.dyncol_def)->len= (yyvsp[0].Lex_dyncol_type).length(); + else + (yyval.dyncol_def)->len= 0; + if ((yyvsp[0].Lex_dyncol_type).has_explicit_dec()) + (yyval.dyncol_def)->frac= (yyvsp[0].Lex_dyncol_type).dec(); + else + (yyval.dyncol_def)->len= 0; + } +#line 39820 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1474: /* dyncall_create_list: dyncall_create_element */ +#line 9636 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.dyncol_def_list)= new (thd->mem_root) List; + if (unlikely((yyval.dyncol_def_list) == NULL)) + MYSQL_YYABORT; + (yyval.dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + } +#line 39831 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1475: /* dyncall_create_list: dyncall_create_list ',' dyncall_create_element */ +#line 9643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].dyncol_def_list)->push_back((yyvsp[0].dyncol_def), thd->mem_root); + (yyval.dyncol_def_list)= (yyvsp[-2].dyncol_def_list); + } +#line 39840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1476: /* plsql_cursor_attr: ISOPEN_SYM */ +#line 9651 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ISOPEN; } +#line 39846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1477: /* plsql_cursor_attr: FOUND_SYM */ +#line 9652 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_FOUND; } +#line 39852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1478: /* plsql_cursor_attr: NOTFOUND_SYM */ +#line 9653 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_NOTFOUND; } +#line 39858 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1479: /* plsql_cursor_attr: ROWCOUNT_SYM */ +#line 9654 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.plsql_cursor_attr)= PLSQL_CURSOR_ATTR_ROWCOUNT; } +#line 39864 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1480: /* explicit_cursor_attr: ident PERCENT_ORACLE_SYM plsql_cursor_attr */ +#line 9659 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_plsql_cursor_attr(thd, &(yyvsp[-2].ident_sys), (yyvsp[0].plsql_cursor_attr))))) + MYSQL_YYABORT; + } +#line 39873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1483: /* trim_operands_regular: expr */ +#line 9672 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 39879 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1484: /* trim_operands_special: LEADING expr FROM expr */ +#line 9676 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39885 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1485: /* trim_operands_special: TRAILING expr FROM expr */ +#line 9677 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39891 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1486: /* trim_operands_special: BOTH expr FROM expr */ +#line 9678 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39897 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1487: /* trim_operands_special: LEADING FROM expr */ +#line 9679 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_LEADING, (yyvsp[0].item)); } +#line 39903 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1488: /* trim_operands_special: TRAILING FROM expr */ +#line 9680 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_TRAILING, (yyvsp[0].item)); } +#line 39909 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1489: /* trim_operands_special: BOTH FROM expr */ +#line 9681 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[0].item)); } +#line 39915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1490: /* trim_operands_special: expr FROM expr */ +#line 9682 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trim).set(TRIM_BOTH, (yyvsp[-2].item), (yyvsp[0].item)); } +#line 39921 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1497: /* column_default_non_parenthesized_expr: param_marker */ +#line 9720 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item_param); } +#line 39927 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1499: /* column_default_non_parenthesized_expr: sum_expr */ +#line 9723 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top || Lex->json_table) + { + my_error(ER_INVALID_GROUP_FUNC_USE, MYF(0)); + MYSQL_YYABORT; + } + } +#line 39939 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1500: /* column_default_non_parenthesized_expr: window_func_expr */ +#line 9731 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->select_stack_top) + { + my_error(ER_WRONG_PLACEMENT_OF_WINDOW_FUNCTION, MYF(0)); + MYSQL_YYABORT; + } + } +#line 39951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1502: /* column_default_non_parenthesized_expr: ROW_SYM '(' expr ',' expr_list ')' */ +#line 9740 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39962 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1503: /* column_default_non_parenthesized_expr: EXISTS '(' subselect ')' */ +#line 9747 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_exists_subselect(thd, (yyvsp[-1].select_lex)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 39972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1504: /* column_default_non_parenthesized_expr: '{' ident expr '}' */ +#line 9753 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].item)->make_odbc_literal(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 39981 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1505: /* column_default_non_parenthesized_expr: MATCH ident_list_arg AGAINST '(' bit_expr fulltext_options ')' */ +#line 9758 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + Item_func_match *i1= new (thd->mem_root) Item_func_match(thd, *(yyvsp[-5].item_list), + (yyvsp[-1].num)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + Select->add_ftfunc_to_list(thd, i1); + (yyval.item)= i1; + } +#line 39995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1506: /* column_default_non_parenthesized_expr: CAST_SYM '(' expr AS cast_type ')' */ +#line 9768 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40004 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1507: /* column_default_non_parenthesized_expr: CASE_SYM when_list_opt_else END */ +#line 9773 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new(thd->mem_root) Item_func_case_searched(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1508: /* column_default_non_parenthesized_expr: CASE_SYM expr when_list_opt_else END */ +#line 9778 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-2].item), thd->mem_root); + if (unlikely(!((yyval.item)= new (thd->mem_root) Item_func_case_simple(thd, *(yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 40023 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1509: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr ',' cast_type ')' */ +#line 9784 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].Lex_cast_type).create_typecast_item_or_error(thd, (yyvsp[-3].item))))) + MYSQL_YYABORT; + } +#line 40032 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1510: /* column_default_non_parenthesized_expr: CONVERT_SYM '(' expr USING charset_name ')' */ +#line 9789 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_conv_charset(thd, (yyvsp[-3].item), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1511: /* column_default_non_parenthesized_expr: DEFAULT '(' simple_ident ')' */ +#line 9795 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_splocal *il= (yyvsp[-1].item)->get_item_splocal(); + if (unlikely(il)) + my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); + (yyval.item)= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), + (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->default_used= TRUE; + } +#line 40057 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1512: /* column_default_non_parenthesized_expr: VALUE_SYM '(' simple_ident_nospvar ')' */ +#line 9806 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_insert_value(thd, Lex->current_context(), + (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40068 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1513: /* column_default_non_parenthesized_expr: NEXT_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9813 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40077 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1514: /* column_default_non_parenthesized_expr: NEXTVAL_SYM '(' table_ident ')' */ +#line 9818 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_nextval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40086 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1515: /* column_default_non_parenthesized_expr: PREVIOUS_SYM VALUE_SYM FOR_SYM table_ident */ +#line 9823 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[0].table))))) + MYSQL_YYABORT; + } +#line 40095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1516: /* column_default_non_parenthesized_expr: LASTVAL_SYM '(' table_ident ')' */ +#line 9828 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_lastval(thd, (yyvsp[-1].table))))) + MYSQL_YYABORT; + } +#line 40104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1517: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ')' */ +#line 9833 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-3].table), (yyvsp[-1].longlong_number), 0, 1)))) + MYSQL_YYABORT; + } +#line 40113 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1518: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ')' */ +#line 9838 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-5].table), (yyvsp[-3].longlong_number), 0, (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 40122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1519: /* column_default_non_parenthesized_expr: SETVAL_SYM '(' table_ident ',' longlong_num ',' bool ',' ulonglong_num ')' */ +#line 9843 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_func_setval(thd, (yyvsp[-7].table), (yyvsp[-5].longlong_number), (yyvsp[-1].ulonglong_number), (yyvsp[-3].ulong_num))))) + MYSQL_YYABORT; + } +#line 40131 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1522: /* primary_expr: '(' parenthesized_expr ')' */ +#line 9852 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[-1].item); } +#line 40137 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1523: /* primary_expr: subquery */ +#line 9854 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->create_item_query_expression(thd, (yyvsp[0].select_lex)->master_unit()))) + MYSQL_YYABORT; + } +#line 40146 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1525: /* string_factor_expr: string_factor_expr COLLATE_SYM collation_name */ +#line 9863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= new (thd->mem_root) + Item_func_set_collation(thd, (yyvsp[-2].item), (yyvsp[0].Lex_extended_collation))))) + MYSQL_YYABORT; + } +#line 40156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1527: /* simple_expr: BINARY simple_expr */ +#line 9873 "/home/buildbot/git/sql/sql_yacc.yy" + { + Type_cast_attributes at(&my_charset_bin); + if (unlikely(!((yyval.item)= type_handler_long_blob.create_typecast_item(thd, (yyvsp[0].item), at)))) + MYSQL_YYABORT; + } +#line 40166 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1528: /* simple_expr: '+' simple_expr */ +#line 9879 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 40174 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1529: /* simple_expr: '-' simple_expr */ +#line 9883 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item)->neg(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40184 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1530: /* simple_expr: '~' simple_expr */ +#line 9889 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_bit_neg(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1531: /* simple_expr: not2 simple_expr */ +#line 9895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= negate_expression(thd, (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40204 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1533: /* mysql_concatenation_expr: mysql_concatenation_expr MYSQL_CONCAT_SYM simple_expr */ +#line 9905 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_concat(thd, (yyvsp[-2].item), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40214 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1534: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ')' */ +#line 9914 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_datetime_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1535: /* function_call_keyword_timestamp: TIMESTAMP '(' expr ',' expr ')' */ +#line 9921 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40235 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1536: /* function_call_keyword: CHAR_SYM '(' expr_list ')' */ +#line 9935 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1537: /* function_call_keyword: CHAR_SYM '(' expr_list USING charset_name ')' */ +#line 9941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_char(thd, *(yyvsp[-3].item_list), (yyvsp[-1].charset)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1538: /* function_call_keyword: CURRENT_USER optional_braces */ +#line 9947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_user(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 40268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1539: /* function_call_keyword: CURRENT_ROLE optional_braces */ +#line 9956 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_current_role(thd, + Lex->current_context()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 40281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1540: /* function_call_keyword: DATE_SYM '(' expr ')' */ +#line 9965 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_typecast(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40291 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1541: /* function_call_keyword: DAY_SYM '(' expr ')' */ +#line 9971 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_dayofmonth(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1542: /* function_call_keyword: HOUR_SYM '(' expr ')' */ +#line 9977 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_hour(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40311 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1543: /* function_call_keyword: INSERT '(' expr ',' expr ',' expr ',' expr ')' */ +#line 9983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_insert(thd, (yyvsp[-7].item), (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40321 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1544: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ')' */ +#line 9989 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + if (unlikely(list->push_front((yyvsp[-1].item), thd->mem_root)) || + unlikely(list->push_front((yyvsp[-3].item), thd->mem_root))) + MYSQL_YYABORT; + Item_row *item= new (thd->mem_root) Item_row(thd, *list); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40340 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1545: /* function_call_keyword: INTERVAL_SYM '(' expr ',' expr ',' expr_list ')' */ +#line 10004 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].item_list)->push_front((yyvsp[-3].item), thd->mem_root); + (yyvsp[-1].item_list)->push_front((yyvsp[-5].item), thd->mem_root); + Item_row *item= new (thd->mem_root) Item_row(thd, *(yyvsp[-1].item_list)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_func_interval(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1546: /* function_call_keyword: LEFT '(' expr ',' expr ')' */ +#line 10015 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_left(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1547: /* function_call_keyword: MINUTE_SYM '(' expr ')' */ +#line 10021 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_minute(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1548: /* function_call_keyword: MONTH_SYM '(' expr ')' */ +#line 10027 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_month(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40385 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1549: /* function_call_keyword: RIGHT '(' expr ',' expr ')' */ +#line 10033 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_right(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40395 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1550: /* function_call_keyword: SECOND_SYM '(' expr ')' */ +#line 10039 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_second(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40405 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1551: /* function_call_keyword: SQL_SYM PERCENT_ORACLE_SYM ROWCOUNT_SYM */ +#line 10045 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_oracle_sql_rowcount(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query= 0; + } +#line 40417 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1552: /* function_call_keyword: TIME_SYM '(' expr ')' */ +#line 10053 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_time_typecast(thd, (yyvsp[-1].item), + AUTO_SEC_PART_DIGITS); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40428 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1553: /* function_call_keyword: function_call_keyword_timestamp */ +#line 10060 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 40436 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1554: /* function_call_keyword: TRIM '(' trim_operands ')' */ +#line 10064 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_trim(thd, (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 40446 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1555: /* function_call_keyword: USER_SYM '(' ')' */ +#line 10070 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_user(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->safe_to_cache_query=0; + } +#line 40458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1556: /* function_call_keyword: YEAR_SYM '(' expr ')' */ +#line 10078 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_year(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40468 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1559: /* substring_operands_regular: expr ',' expr ',' expr */ +#line 10092 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40476 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1560: /* substring_operands_regular: expr ',' expr */ +#line 10096 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1561: /* substring_operands_special: expr FROM expr FOR_SYM expr */ +#line 10103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-4].item), (yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40492 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1562: /* substring_operands_special: expr FROM expr */ +#line 10107 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.substring_spec)= Lex_substring_spec_st::init((yyvsp[-2].item), (yyvsp[0].item)); + } +#line 40500 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1563: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' expr ')' */ +#line 10127 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40511 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1564: /* function_call_nonkeyword: ADDDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10134 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40521 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1565: /* function_call_nonkeyword: CURDATE optional_braces */ +#line 10140 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_local(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40532 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1566: /* function_call_nonkeyword: CURTIME opt_time_precision */ +#line 10147 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40543 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1567: /* function_call_nonkeyword: DATE_ADD_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10154 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40553 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1568: /* function_call_nonkeyword: DATE_SUB_INTERVAL '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40563 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1569: /* function_call_nonkeyword: EXTRACT_SYM '(' interval FROM expr ')' */ +#line 10166 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_extract(thd, (yyvsp[-3].interval), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40573 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1570: /* function_call_nonkeyword: GET_FORMAT '(' date_time_type ',' expr ')' */ +#line 10172 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_get_format(thd, (yyvsp[-3].date_time_type), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1571: /* function_call_nonkeyword: NOW_SYM opt_time_precision */ +#line 10178 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_local(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1572: /* function_call_nonkeyword: POSITION_SYM '(' bit_expr IN_SYM expr ')' */ +#line 10185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_locate(thd, (yyvsp[-1].item), (yyvsp[-3].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40604 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1573: /* function_call_nonkeyword: ROWNUM_SYM optional_braces */ +#line 10196 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_rownum(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40614 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1574: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' expr ')' */ +#line 10202 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-3].item), (yyvsp[-1].item), + INTERVAL_DAY, 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40625 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1575: /* function_call_nonkeyword: SUBDATE_SYM '(' expr ',' INTERVAL_SYM expr interval ')' */ +#line 10209 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-5].item), (yyvsp[-2].item), (yyvsp[-1].interval), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40635 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1576: /* function_call_nonkeyword: SUBSTRING '(' substring_operands ')' */ +#line 10215 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_substr(thd, (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 40645 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1577: /* function_call_nonkeyword: SYSDATE */ +#line 10222 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, 0)))) + MYSQL_YYABORT; + } +#line 40654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1578: /* function_call_nonkeyword: SYSDATE '(' ')' */ +#line 10228 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, 0)))) + MYSQL_YYABORT; + } +#line 40663 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1579: /* function_call_nonkeyword: SYSDATE '(' real_ulong_num ')' */ +#line 10233 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_sysdate(thd, (uint) (yyvsp[-1].ulong_num))))) + MYSQL_YYABORT; + } +#line 40672 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1580: /* function_call_nonkeyword: TIMESTAMP_ADD '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10238 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_date_add_interval(thd, (yyvsp[-1].item), (yyvsp[-3].item), (yyvsp[-5].interval_time_st), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40682 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1581: /* function_call_nonkeyword: TIMESTAMP_DIFF '(' interval_time_stamp ',' expr ',' expr ')' */ +#line 10244 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_timestamp_diff(thd, (yyvsp[-3].item), (yyvsp[-1].item), (yyvsp[-5].interval_time_st)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1582: /* function_call_nonkeyword: TRIM_ORACLE '(' trim_operands ')' */ +#line 10250 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= (yyvsp[-1].trim).make_item_func_trim_oracle(thd)))) + MYSQL_YYABORT; + } +#line 40701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1583: /* function_call_nonkeyword: UTC_DATE_SYM optional_braces */ +#line 10255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curdate_utc(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40712 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1584: /* function_call_nonkeyword: UTC_TIME_SYM opt_time_precision */ +#line 10262 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_curtime_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40723 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1585: /* function_call_nonkeyword: UTC_TIMESTAMP_SYM opt_time_precision */ +#line 10269 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_now_utc(thd, (yyvsp[0].num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + Lex->safe_to_cache_query=0; + } +#line 40734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1586: /* function_call_nonkeyword: COLUMN_ADD_SYM '(' expr ',' dyncall_create_list ')' */ +#line 10277 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_add(thd, (yyvsp[-3].item), *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40744 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1587: /* function_call_nonkeyword: COLUMN_DELETE_SYM '(' expr ',' expr_list ')' */ +#line 10284 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_delete(thd, (yyvsp[-3].item), *(yyvsp[-1].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40754 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1588: /* function_call_nonkeyword: COLUMN_CREATE_SYM '(' dyncall_create_list ')' */ +#line 10291 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_create(thd, *(yyvsp[-1].dyncol_def_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1589: /* function_call_nonkeyword: COLUMN_GET_SYM '(' expr ',' expr AS cast_type ')' */ +#line 10298 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= create_func_dyncol_get(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].Lex_cast_type).type_handler(), + (yyvsp[-1].Lex_cast_type), (yyvsp[-1].Lex_cast_type).charset()); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1590: /* function_call_conflict: ASCII_SYM '(' expr ')' */ +#line 10313 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_ascii(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40785 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1591: /* function_call_conflict: CHARSET '(' expr ')' */ +#line 10319 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_charset(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40795 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1592: /* function_call_conflict: IF_SYM '(' expr ',' expr ',' expr ')' */ +#line 10325 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_if(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40805 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1593: /* function_call_conflict: LAST_VALUE '(' expr ')' */ +#line 10334 "/home/buildbot/git/sql/sql_yacc.yy" + { + List *list= new (thd->mem_root) List; + if (unlikely(list == NULL)) + MYSQL_YYABORT; + list->push_back((yyvsp[-1].item), thd->mem_root); + + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *list); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40820 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1594: /* function_call_conflict: LAST_VALUE '(' expr_list ',' expr ')' */ +#line 10345 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].item_list)->push_back((yyvsp[-1].item), thd->mem_root); + (yyval.item)= new (thd->mem_root) Item_func_last_value(thd, *(yyvsp[-3].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40831 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1595: /* function_call_conflict: MOD_SYM '(' expr ',' expr ')' */ +#line 10352 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_mod(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40841 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1596: /* function_call_conflict: PASSWORD_SYM '(' expr ')' */ +#line 10358 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* i1; + i1= new (thd->mem_root) Item_func_password(thd, (yyvsp[-1].item)); + if (unlikely(i1 == NULL)) + MYSQL_YYABORT; + (yyval.item)= i1; + } +#line 40853 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1597: /* function_call_conflict: REPEAT_SYM '(' expr ',' expr ')' */ +#line 10366 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_repeat(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40863 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1598: /* function_call_conflict: REPLACE '(' expr ',' expr ',' expr ')' */ +#line 10372 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Schema::find_implied(thd)-> + make_item_func_replace(thd, (yyvsp[-5].item), (yyvsp[-3].item), (yyvsp[-1].item))))) + MYSQL_YYABORT; + } +#line 40873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1599: /* function_call_conflict: TRUNCATE_SYM '(' expr ',' expr ')' */ +#line 10378 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_round(thd, (yyvsp[-3].item), (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1600: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr opt_ws_levels ')' */ +#line 10384 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-2].item), 0, 0, (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1601: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS CHAR_SYM ws_nweights opt_ws_levels ')' */ +#line 10390 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, (yyvsp[-5].item), 0, (yyvsp[-2].ulong_num), + (yyvsp[-1].ulong_num) | MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40905 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1602: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr AS BINARY ws_nweights ')' */ +#line 10398 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_char_typecast(thd, (yyvsp[-4].item), (yyvsp[-1].ulong_num), + &my_charset_bin); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) + Item_func_weight_string(thd, item, 0, (yyvsp[-1].ulong_num), + MY_STRXFRM_PAD_WITH_SPACE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40921 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1603: /* function_call_conflict: WEIGHT_STRING_SYM '(' expr ',' ulong_num ',' ulong_num ',' ulong_num ')' */ +#line 10410 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_func_weight_string(thd, (yyvsp[-7].item), (yyvsp[-5].ulong_num), (yyvsp[-3].ulong_num), + (yyvsp[-1].ulong_num)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 40932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1604: /* @142: %empty */ +#line 10429 "/home/buildbot/git/sql/sql_yacc.yy" + { +#ifdef HAVE_DLOPEN + udf_func *udf= 0; + LEX *lex= Lex; + if (using_udf_functions && + (udf= find_udf((yyvsp[-1].ident_sys).str, (yyvsp[-1].ident_sys).length)) && + udf->type == UDFTYPE_AGGREGATE) + { + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } + /* Temporary placing the result of find_udf in $3 */ + (yyval.udf)= udf; +#endif + } +#line 40955 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1605: /* function_call_generic: ident_func '(' @142 opt_udf_expr_list ')' */ +#line 10448 "/home/buildbot/git/sql/sql_yacc.yy" + { + const Type_handler *h; + Create_func *builder; + Item *item= NULL; + + if (unlikely(check_routine_name(&(yyvsp[-4].ident_sys)))) + MYSQL_YYABORT; + + /* + Implementation note: + names are resolved with the following order: + - MySQL native functions, + - User Defined Functions, + - Constructors, like POINT(1,1) + - Stored Functions (assuming the current database) + + This will be revised with WL#2128 (SQL PATH) + */ + builder= Schema::find_implied(thd)-> + find_native_function_builder(thd, (yyvsp[-4].ident_sys)); + if (builder) + { + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + else if ((h= Type_handler::handler_by_name(thd, (yyvsp[-4].ident_sys))) && + (item= h->make_constructor_item(thd, (yyvsp[-1].item_list)))) + { + // Found a constructor with a proper argument count + } + else + { +#ifdef HAVE_DLOPEN + /* Retrieving the result of find_udf */ + udf_func *udf= (yyvsp[-2].udf); + + if (udf) + { + if (udf->type == UDFTYPE_AGGREGATE) + { + Select->in_sum_expr--; + } + + item= Create_udf_func::s_singleton.create(thd, udf, (yyvsp[-1].item_list)); + } + else +#endif + { + builder= find_qualified_function_builder(thd); + DBUG_ASSERT(builder); + item= builder->create_func(thd, &(yyvsp[-4].ident_sys), (yyvsp[-1].item_list)); + } + } + + if (unlikely(! ((yyval.item)= item))) + MYSQL_YYABORT; + } +#line 41016 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1606: /* function_call_generic: CONTAINS_SYM '(' opt_expr_list ')' */ +#line 10505 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41026 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1607: /* function_call_generic: OVERLAPS_SYM '(' opt_expr_list ')' */ +#line 10511 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1608: /* function_call_generic: WITHIN '(' opt_expr_list ')' */ +#line 10517 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.item)= Lex->make_item_func_call_native_or_parse_error(thd, + (yyvsp[-3].kwd), (yyvsp[-1].item_list)))) + MYSQL_YYABORT; + } +#line 41046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1609: /* function_call_generic: ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10523 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1610: /* function_call_generic: ident_cli '.' ident_cli '.' ident_cli '(' opt_expr_list ')' */ +#line 10528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_call_generic(thd, &(yyvsp[-7].ident_cli), &(yyvsp[-5].ident_cli), &(yyvsp[-3].ident_cli), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41064 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1611: /* function_call_generic: ident_cli '.' REPLACE '(' opt_expr_list ')' */ +#line 10533 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_replace(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41073 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1612: /* function_call_generic: ident_cli '.' SUBSTRING '(' opt_expr_list ')' */ +#line 10538 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41082 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1613: /* function_call_generic: ident_cli '.' SUBSTRING '(' substring_operands_special ')' */ +#line 10543 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_substr(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].substring_spec))))) + MYSQL_YYABORT; + } +#line 41091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1614: /* function_call_generic: ident_cli '.' TRIM '(' opt_expr_list ')' */ +#line 10548 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].item_list))))) + MYSQL_YYABORT; + } +#line 41100 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1615: /* function_call_generic: ident_cli '.' TRIM '(' trim_operands_special ')' */ +#line 10553 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_func_trim(thd, (yyvsp[-5].ident_cli), (yyvsp[-3].kwd), (yyvsp[-1].trim))))) + MYSQL_YYABORT; + } +#line 41109 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1616: /* fulltext_options: opt_natural_language_mode opt_query_expansion */ +#line 10573 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].num) | (yyvsp[0].num); } +#line 41115 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1617: /* fulltext_options: IN_SYM BOOLEAN_SYM MODE_SYM */ +#line 10575 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_BOOL; } +#line 41121 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1618: /* opt_natural_language_mode: %empty */ +#line 10579 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41127 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1619: /* opt_natural_language_mode: IN_SYM NATURAL LANGUAGE_SYM MODE_SYM */ +#line 10580 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_NL; } +#line 41133 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1620: /* opt_query_expansion: %empty */ +#line 10584 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 41139 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1621: /* opt_query_expansion: WITH QUERY_SYM EXPANSION_SYM */ +#line 10585 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= FT_EXPAND; } +#line 41145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1622: /* opt_udf_expr_list: %empty */ +#line 10589 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 41151 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1623: /* opt_udf_expr_list: udf_expr_list */ +#line 10590 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 41157 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1624: /* udf_expr_list: udf_expr */ +#line 10595 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root); + } +#line 41168 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1625: /* udf_expr_list: udf_expr_list ',' udf_expr */ +#line 10602 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 41177 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1626: /* udf_expr: remember_name expr remember_end select_alias */ +#line 10610 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Use Item::name as a storage for the attribute value of user + defined function argument. It is safe to use Item::name + because the syntax will not allow having an explicit name here. + See WL#1017 re. udf attributes. + */ + if ((yyvsp[0].lex_str).str) + { + (yyvsp[-2].item)->base_flags|= item_base_t::IS_EXPLICIT_NAME; + (yyvsp[-2].item)->set_name(thd, (yyvsp[0].lex_str)); + } + /* + A field has to have its proper name in order for name + resolution to work, something we are only guaranteed if we + parse it out. If we hijack the input stream with + remember_name we may get quoted or escaped names. + */ + else if ((yyvsp[-2].item)->type() != Item::FIELD_ITEM && + (yyvsp[-2].item)->type() != Item::REF_ITEM /* For HAVING */ ) + (yyvsp[-2].item)->set_name(thd, (yyvsp[-3].simple_string), (uint) ((yyvsp[-1].simple_string) - (yyvsp[-3].simple_string)), thd->charset()); + (yyval.item)= (yyvsp[-2].item); + } +#line 41205 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1627: /* sum_expr: AVG_SYM '(' in_sum_expr ')' */ +#line 10637 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41215 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1628: /* sum_expr: AVG_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10643 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_avg(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1629: /* sum_expr: BIT_AND '(' in_sum_expr ')' */ +#line 10649 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_and(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41235 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1630: /* sum_expr: BIT_OR '(' in_sum_expr ')' */ +#line 10655 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_or(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41245 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1631: /* sum_expr: BIT_XOR '(' in_sum_expr ')' */ +#line 10661 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_xor(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1632: /* sum_expr: COUNT_SYM '(' opt_all '*' ')' */ +#line 10667 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *item= new (thd->mem_root) Item_int(thd, (int32) 0L, 1); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, item); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41268 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1633: /* sum_expr: COUNT_SYM '(' in_sum_expr ')' */ +#line 10676 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41278 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1634: /* $@143: %empty */ +#line 10682 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41284 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1635: /* $@144: %empty */ +#line 10684 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr--; } +#line 41290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1636: /* sum_expr: COUNT_SYM '(' DISTINCT $@143 expr_list $@144 ')' */ +#line 10686 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_count(thd, *(yyvsp[-2].item_list)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41300 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1637: /* sum_expr: MIN_SYM '(' in_sum_expr ')' */ +#line 10692 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41310 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1638: /* sum_expr: MIN_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10703 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_min(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41320 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1639: /* sum_expr: MAX_SYM '(' in_sum_expr ')' */ +#line 10709 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41330 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1640: /* sum_expr: MAX_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10715 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_max(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41340 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1641: /* sum_expr: STD_SYM '(' in_sum_expr ')' */ +#line 10721 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1642: /* sum_expr: VARIANCE_SYM '(' in_sum_expr ')' */ +#line 10727 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41360 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1643: /* sum_expr: STDDEV_SAMP_SYM '(' in_sum_expr ')' */ +#line 10733 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_std(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41370 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1644: /* sum_expr: VAR_SAMP_SYM '(' in_sum_expr ')' */ +#line 10739 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_variance(thd, (yyvsp[-1].item), 1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1645: /* sum_expr: SUM_SYM '(' in_sum_expr ')' */ +#line 10745 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), FALSE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41390 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1646: /* sum_expr: SUM_SYM '(' DISTINCT in_sum_expr ')' */ +#line 10751 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_sum(thd, (yyvsp[-1].item), TRUE); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1647: /* $@145: %empty */ +#line 10757 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1648: /* sum_expr: GROUP_CONCAT_SYM '(' opt_distinct $@145 expr_list opt_gorder_clause opt_gconcat_separator opt_glimit_clause ')' */ +#line 10761 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + (yyval.item)= new (thd->mem_root) + Item_func_group_concat(thd, Lex->current_context(), + (yyvsp[-6].num), (yyvsp[-4].item_list), + sel->gorder_list, (yyvsp[-2].string), (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-4].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 41426 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1649: /* $@146: %empty */ +#line 10777 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1650: /* sum_expr: JSON_ARRAYAGG_SYM '(' opt_distinct $@146 expr_list opt_gorder_clause opt_glimit_clause ')' */ +#line 10780 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + List *args= (yyvsp[-3].item_list); + sel->in_sum_expr--; + if (args && args->elements > 1) + { + /* JSON_ARRAYAGG supports only one parameter */ + my_error(ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT, MYF(0), "JSON_ARRAYAGG"); + MYSQL_YYABORT; + } + String* s= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely(s == NULL)) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) + Item_func_json_arrayagg(thd, Lex->current_context(), + (yyvsp[-5].num), args, + sel->gorder_list, s, (yyvsp[-1].num), + sel->limit_params.select_limit, + sel->limit_params.offset_limit); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + sel->limit_params.clear(); + (yyvsp[-3].item_list)->empty(); + sel->gorder_list.empty(); + } +#line 41463 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1651: /* $@147: %empty */ +#line 10807 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->in_sum_expr++; } +#line 41469 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1652: /* sum_expr: JSON_OBJECTAGG_SYM '(' $@147 expr ',' expr ')' */ +#line 10809 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->in_sum_expr--; + + (yyval.item)= new (thd->mem_root) Item_func_json_objectagg(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41482 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1653: /* window_func_expr: window_func OVER_SYM window_name */ +#line 10821 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), (yyvsp[0].lex_str_ptr)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 41494 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1654: /* window_func_expr: window_func OVER_SYM window_spec */ +#line 10830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-2].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 41513 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1657: /* window_func: function_call_generic */ +#line 10852 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item* item = (Item*)(yyvsp[0].item); + /* Only UDF aggregate here possible */ + if ((item == NULL) || + (item->type() != Item::SUM_FUNC_ITEM) + || (((Item_sum *)item)->sum_func() != Item_sum::UDF_SUM_FUNC)) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 41529 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1658: /* simple_window_func: ROW_NUMBER_SYM '(' ')' */ +#line 10867 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_row_number(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41539 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1659: /* simple_window_func: RANK_SYM '(' ')' */ +#line 10874 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1660: /* simple_window_func: DENSE_RANK_SYM '(' ')' */ +#line 10881 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_dense_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1661: /* simple_window_func: PERCENT_RANK_SYM '(' ')' */ +#line 10888 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percent_rank(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41569 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1662: /* simple_window_func: CUME_DIST_SYM '(' ')' */ +#line 10895 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_cume_dist(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41579 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1663: /* simple_window_func: NTILE_SYM '(' expr ')' */ +#line 10902 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_ntile(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1664: /* simple_window_func: FIRST_VALUE_SYM '(' expr ')' */ +#line 10909 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_first_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41599 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1665: /* simple_window_func: LAST_VALUE '(' expr ')' */ +#line 10916 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_last_value(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41609 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1666: /* simple_window_func: NTH_VALUE_SYM '(' expr ',' expr ')' */ +#line 10923 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_nth_value(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41619 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1667: /* simple_window_func: LEAD_SYM '(' expr ')' */ +#line 10930 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1668: /* simple_window_func: LEAD_SYM '(' expr ',' expr ')' */ +#line 10941 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lead(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41643 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1669: /* simple_window_func: LAG_SYM '(' expr ')' */ +#line 10948 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* No second argument defaults to 1. */ + Item* item_offset= new (thd->mem_root) Item_uint(thd, 1); + if (unlikely(item_offset == NULL)) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-1].item), item_offset); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41657 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1670: /* simple_window_func: LAG_SYM '(' expr ',' expr ')' */ +#line 10959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_lag(thd, (yyvsp[-3].item), (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41667 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1671: /* inverse_distribution_function: percentile_function OVER_SYM '(' opt_window_partition_clause ')' */ +#line 10971 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_spec(thd, lex->win_ref, + Select->group_list, + Select->order_list, + NULL))) + MYSQL_YYABORT; + (yyval.item)= new (thd->mem_root) Item_window_func(thd, (Item_sum *) (yyvsp[-4].item), + thd->lex->win_spec); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + if (unlikely(Select->add_window_func((Item_window_func *) (yyval.item)))) + MYSQL_YYABORT; + } +#line 41686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1672: /* $@148: %empty */ +#line 10989 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 41692 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1673: /* percentile_function: inverse_distribution_function_def WITHIN GROUP_SYM '(' $@148 order_by_single_element_list ')' */ +#line 10991 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[-6].item); + } +#line 41700 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1674: /* percentile_function: MEDIAN_SYM '(' expr ')' */ +#line 10995 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *args= new (thd->mem_root) Item_decimal(thd, "0.5", 3, + thd->charset()); + if (unlikely(args == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + Select->prepare_add_window_spec(thd); + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),FALSE))) + MYSQL_YYABORT; + + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, args); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41718 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1675: /* inverse_distribution_function_def: PERCENTILE_CONT_SYM '(' expr ')' */ +#line 11012 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_cont(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1676: /* inverse_distribution_function_def: PERCENTILE_DISC_SYM '(' expr ')' */ +#line 11018 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_sum_percentile_disc(thd, (yyvsp[-1].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 41738 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1677: /* order_by_single_element_list: ORDER_SYM BY order_ident order_dir */ +#line 11027 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 41747 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1678: /* window_name: ident */ +#line 11036 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 41757 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1679: /* $@149: %empty */ +#line 11045 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(! Lex->parsing_options.allows_variable)) + my_yyabort_error((ER_VIEW_SELECT_VARIABLE, MYF(0))); + } +#line 41766 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1680: /* variable: '@' $@149 variable_aux */ +#line 11050 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= (yyvsp[0].item); + } +#line 41774 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1681: /* variable_aux: ident_or_text SET_VAR expr */ +#line 11057 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_func_set_user_var *item; + if (!(yyvsp[-2].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= item= new (thd->mem_root) Item_func_set_user_var(thd, &(yyvsp[-2].lex_str), (yyvsp[0].item)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + lex->set_var_list.push_back(item, thd->mem_root); + } +#line 41793 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1682: /* variable_aux: ident_or_text */ +#line 11072 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + (yyval.item)= new (thd->mem_root) Item_func_get_user_var(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 41810 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1683: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name */ +#line 11085 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-1].var_type), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 41819 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1684: /* variable_aux: '@' opt_var_ident_type ident_sysvar_name '.' ident */ +#line 11090 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_sysvar(thd, (yyvsp[-3].var_type), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 41828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1685: /* opt_distinct: %empty */ +#line 11097 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 41834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1686: /* opt_distinct: DISTINCT */ +#line 11098 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 41840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1687: /* opt_gconcat_separator: %empty */ +#line 11103 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String(",", 1, &my_charset_latin1); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 41850 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1688: /* opt_gconcat_separator: SEPARATOR_SYM text_string */ +#line 11108 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string) = (yyvsp[0].string); } +#line 41856 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1691: /* gorder_list: gorder_list ',' order_ident order_dir */ +#line 11118 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 41865 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1692: /* gorder_list: order_ident order_dir */ +#line 11123 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_gorder_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 41874 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1693: /* opt_glimit_clause: %empty */ +#line 11130 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 41880 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1694: /* opt_glimit_clause: glimit_clause */ +#line 11131 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 41886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1695: /* glimit_clause: LIMIT glimit_options */ +#line 11137 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 41894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1696: /* glimit_options: limit_options */ +#line 11144 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 41902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1697: /* $@150: %empty */ +#line 11153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->current_select->inc_in_sum_expr())) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 41915 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1698: /* in_sum_expr: opt_all $@150 expr */ +#line 11162 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->in_sum_expr--; + (yyval.item)= (yyvsp[0].item); + } +#line 41924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1699: /* cast_type: BINARY opt_field_length */ +#line 11170 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), &my_charset_bin); } +#line 41930 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1700: /* cast_type: CHAR_SYM opt_field_length opt_binary */ +#line 11172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 41940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1701: /* cast_type: VARCHAR field_length opt_binary */ +#line 11178 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 41950 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1702: /* cast_type: VARCHAR2_ORACLE_SYM field_length opt_binary */ +#line 11184 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[-1].Lex_length_and_dec), (yyvsp[0].Lex_exact_charset_extended_collation_attrs), + thd->variables.collation_connection)) + MYSQL_YYABORT; + } +#line 41960 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1703: /* cast_type: NCHAR_SYM opt_field_length */ +#line 11190 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_long_blob, (yyvsp[0].Lex_length_and_dec), national_charset_info); + } +#line 41968 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1704: /* cast_type: cast_type_numeric */ +#line 11193 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 41974 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1705: /* cast_type: cast_type_temporal */ +#line 11194 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type)= (yyvsp[0].Lex_cast_type); } +#line 41980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1706: /* cast_type: udt_name */ +#line 11196 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_cast_type_udt(&(yyval.Lex_cast_type), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 41989 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1707: /* cast_type_numeric: INT_SYM */ +#line 11203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 41995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1708: /* cast_type_numeric: SIGNED_SYM */ +#line 11204 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42001 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1709: /* cast_type_numeric: SIGNED_SYM INT_SYM */ +#line 11205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_slonglong); } +#line 42007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1710: /* cast_type_numeric: UNSIGNED */ +#line 11206 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42013 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1711: /* cast_type_numeric: UNSIGNED INT_SYM */ +#line 11207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_ulonglong); } +#line 42019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1712: /* cast_type_numeric: DECIMAL_SYM float_options */ +#line 11208 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdecimal, (yyvsp[0].Lex_length_and_dec)); } +#line 42025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1713: /* cast_type_numeric: FLOAT_SYM */ +#line 11209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_float); } +#line 42031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1714: /* cast_type_numeric: DOUBLE_SYM opt_precision */ +#line 11210 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_double, (yyvsp[0].Lex_length_and_dec)); } +#line 42037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1715: /* cast_type_temporal: DATE_SYM */ +#line 11214 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_newdate); } +#line 42043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1716: /* cast_type_temporal: TIME_SYM opt_field_scale */ +#line 11215 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_time2, (yyvsp[0].Lex_length_and_dec)); } +#line 42049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1717: /* cast_type_temporal: DATETIME opt_field_scale */ +#line 11216 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.Lex_cast_type).set(&type_handler_datetime2, (yyvsp[0].Lex_length_and_dec)); } +#line 42055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1718: /* cast_type_temporal: INTERVAL_SYM DAY_SECOND_SYM field_scale */ +#line 11218 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.Lex_cast_type).set(&type_handler_interval_DDhhmmssff, (yyvsp[0].Lex_length_and_dec)); + } +#line 42063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1719: /* opt_expr_list: %empty */ +#line 11224 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= NULL; } +#line 42069 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1720: /* opt_expr_list: expr_list */ +#line 11225 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list);} +#line 42075 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1721: /* expr_list: expr */ +#line 11230 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_list)= List::make(thd->mem_root, (yyvsp[0].item))))) + MYSQL_YYABORT; + } +#line 42084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1722: /* expr_list: expr_list ',' expr */ +#line 11235 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42093 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1723: /* ident_list_arg: ident_list */ +#line 11242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[0].item_list); } +#line 42099 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1724: /* ident_list_arg: '(' ident_list ')' */ +#line 11243 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item_list)= (yyvsp[-1].item_list); } +#line 42105 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1725: /* ident_list: simple_ident */ +#line 11248 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL) || + unlikely((yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1726: /* ident_list: ident_list ',' simple_ident */ +#line 11255 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root); + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42125 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1727: /* when_list: WHEN_SYM expr THEN_SYM expr */ +#line 11263 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_list)= new (thd->mem_root) List; + if (unlikely((yyval.item_list) == NULL)) + MYSQL_YYABORT; + if (unlikely((yyval.item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyval.item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 42138 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1728: /* when_list: when_list WHEN_SYM expr THEN_SYM expr */ +#line 11272 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-4].item_list)->push_back((yyvsp[-2].item), thd->mem_root) || + (yyvsp[-4].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-4].item_list); + } +#line 42149 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1730: /* when_list_opt_else: when_list ELSE expr */ +#line 11283 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-2].item_list)->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + (yyval.item_list)= (yyvsp[-2].item_list); + } +#line 42159 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1731: /* table_ref: table_factor */ +#line 11293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42165 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1732: /* table_ref: join_table */ +#line 11295 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->nest_last_join(thd)))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1733: /* json_text_literal: TEXT_STRING */ +#line 11307 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1734: /* json_text_literal: NCHAR_STRING */ +#line 11311 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= national_charset_info; + } +#line 42194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1735: /* json_text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 11315 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= (yyvsp[-1].charset); + (yyval.lex_string_with_metadata)= (yyvsp[0].lex_string_with_metadata); + } +#line 42203 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1737: /* json_text_literal_or_num: NUM */ +#line 11324 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42211 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1738: /* json_text_literal_or_num: LONG_NUM */ +#line 11328 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1739: /* json_text_literal_or_num: DECIMAL_NUM */ +#line 11332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42227 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1740: /* json_text_literal_or_num: FLOAT_NUM */ +#line 11336 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_text_literal_cs= NULL; + } +#line 42235 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1741: /* join_table_list: derived_table_list */ +#line 11342 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT_UNLESS((yyval.table_list)=(yyvsp[0].table_list)); } +#line 42241 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1742: /* json_table_columns_clause: COLUMNS '(' json_table_columns_list ')' */ +#line 11347 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42247 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1744: /* json_table_columns_list: json_table_columns_list ',' json_table_column */ +#line 11353 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42253 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1745: /* $@151: %empty */ +#line 11358 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Create_field *f= new (thd->mem_root) Create_field(); + + if (unlikely(check_string_char_length(&(yyvsp[0].ident_sys), 0, NAME_CHAR_LEN, + system_charset_info, 1))) + my_yyabort_error((ER_TOO_LONG_IDENT, MYF(0), (yyvsp[0].ident_sys).str)); + + lex->json_table->m_cur_json_table_column= + new (thd->mem_root) Json_table_column(f, + lex->json_table->get_cur_nested_path()); + + if (unlikely(!f || + !lex->json_table->m_cur_json_table_column)) + MYSQL_YYABORT; + + lex->init_last_field(f, &(yyvsp[0].ident_sys)); + } +#line 42276 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1746: /* json_table_column: ident $@151 json_table_column_type */ +#line 11377 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->json_table-> + m_cur_json_table_column->m_field->check(thd))) + MYSQL_YYABORT; + lex->json_table->m_columns.push_back( + lex->json_table->m_cur_json_table_column, thd->mem_root); + } +#line 42289 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1747: /* $@152: %empty */ +#line 11386 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Json_table_nested_path *np= new (thd->mem_root) + Json_table_nested_path(); + np->set_path(thd, (yyvsp[0].lex_string_with_metadata)); + lex->json_table->start_nested_path(np); + } +#line 42301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1748: /* json_table_column: NESTED_SYM PATH_SYM json_text_literal $@152 json_table_columns_clause */ +#line 11394 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->json_table->end_nested_path(); + } +#line 42310 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1749: /* json_table_column_type: FOR_SYM ORDINALITY_SYM */ +#line 11402 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_field_type_st type; + type.set(&type_handler_slong); + Lex->last_field->set_attributes(thd, type, + COLUMN_DEFINITION_TABLE_FIELD); + Lex->json_table->m_cur_json_table_column-> + set(Json_table_column::FOR_ORDINALITY); + } +#line 42323 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1750: /* json_table_column_type: json_table_field_type PATH_SYM json_text_literal json_opt_on_empty_or_error */ +#line 11412 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::PATH, (yyvsp[-1].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + { + MYSQL_YYABORT; + } + } +#line 42338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1751: /* json_table_column_type: json_table_field_type EXISTS PATH_SYM json_text_literal */ +#line 11423 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_field->set_attributes(thd, (yyvsp[-3].Lex_field_type), + COLUMN_DEFINITION_TABLE_FIELD); + if (Lex->json_table->m_cur_json_table_column-> + set(thd, Json_table_column::EXISTS_PATH, (yyvsp[0].lex_string_with_metadata), + (yyvsp[-3].Lex_field_type).charset_collation_attrs())) + MYSQL_YYABORT; + } +#line 42351 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1756: /* json_opt_on_empty_or_error: %empty */ +#line 11442 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42357 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1761: /* json_on_response: ERROR_SYM */ +#line 11451 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_ERROR; + } +#line 42365 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1762: /* json_on_response: NULL_SYM */ +#line 11455 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_NULL; + } +#line 42373 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1763: /* json_on_response: DEFAULT json_text_literal_or_num */ +#line 11459 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.json_on_response).m_response= Json_table_column::RESPONSE_DEFAULT; + (yyval.json_on_response).m_default= (yyvsp[0].lex_string_with_metadata); + Lex->json_table->m_cur_json_table_column->m_defaults_cs= + thd->variables.collation_connection; + } +#line 42384 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1764: /* json_on_error_response: json_on_response ON ERROR_SYM */ +#line 11469 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_error= (yyvsp[-2].json_on_response); + } +#line 42392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1765: /* json_on_empty_response: json_on_response ON EMPTY_SYM */ +#line 11476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->json_table->m_cur_json_table_column->m_on_empty= (yyvsp[-2].json_on_response); + } +#line 42400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1766: /* $@153: %empty */ +#line 11483 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_table_function_arg_context(Lex, thd->mem_root); + //TODO: introduce IN_TABLE_FUNC_ARGUMENT? + Select->parsing_place= IN_ON; + } +#line 42410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1767: /* $@154: %empty */ +#line 11489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_function_json_table *jt= + new (thd->mem_root) Table_function_json_table((yyvsp[-1].item)); + if (unlikely(!jt)) + MYSQL_YYABORT; + /* See comment for class Table_function_json_table: */ + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION); + Lex->json_table= jt; + + Select->parsing_place= NO_MATTER; + jt->set_name_resolution_context(Lex->pop_context()); + } +#line 42427 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1768: /* table_function: JSON_TABLE_SYM '(' $@153 expr ',' $@154 json_text_literal json_table_columns_clause ')' opt_table_alias_clause */ +#line 11502 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + if (unlikely((yyvsp[0].lex_str_ptr) == NULL)) + { + /* Alias is not optional. */ + my_error(ER_JSON_TABLE_ALIAS_REQUIRED, MYF(0)); + MYSQL_YYABORT; + } + if (unlikely(Lex->json_table->m_nested_path.set_path(thd, (yyvsp[-3].lex_string_with_metadata)))) + MYSQL_YYABORT; + if (!((yyval.table_list)= sel->add_table_to_list(thd, + new (thd->mem_root) Table_ident(thd, &any_db, + (yyvsp[0].lex_str_ptr), TRUE), + NULL, + TL_OPTION_TABLE_FUNCTION, + YYPS->m_lock_type, + YYPS->m_mdl_type, + 0,0,0))) + MYSQL_YYABORT; + (yyval.table_list)->table_function= Lex->json_table; + Lex->json_table= 0; + status_var_increment(thd->status_var.feature_json); + } +#line 42455 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1769: /* esc_table_ref: table_ref */ +#line 11535 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[0].table_list); } +#line 42461 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1770: /* esc_table_ref: '{' ident table_ref '}' */ +#line 11536 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)=(yyvsp[-1].table_list); } +#line 42467 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1771: /* derived_table_list: esc_table_ref */ +#line 11543 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table_list)=(yyvsp[0].table_list); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42476 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1772: /* derived_table_list: derived_table_list ',' esc_table_ref */ +#line 11548 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42485 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1773: /* join_table: table_ref normal_join table_ref */ +#line 11562 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + if (unlikely(Select->add_cross_joined_table((yyvsp[-2].table_list), (yyvsp[0].table_list), (yyvsp[-1].num)))) + MYSQL_YYABORT; + } +#line 42495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1774: /* $@155: %empty */ +#line 11569 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-3].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 42509 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1775: /* join_table: table_ref normal_join table_ref ON $@155 expr */ +#line 11579 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].table_list)->straight=(yyvsp[-4].num); + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 42520 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1776: /* $@156: %empty */ +#line 11587 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + } +#line 42530 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1777: /* join_table: table_ref normal_join table_ref USING $@156 '(' using_list ')' */ +#line 11593 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].table_list)->straight=(yyvsp[-6].num); + add_join_natural((yyvsp[-7].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 42540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1778: /* join_table: table_ref NATURAL inner_join table_factor */ +#line 11599 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-3].table_list) && ((yyval.table_list)=(yyvsp[0].table_list))); + Select->add_joined_table((yyvsp[-3].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyvsp[0].table_list)->straight=(yyvsp[-1].num); + add_join_natural((yyvsp[-3].table_list),(yyvsp[0].table_list),NULL,Select); + } +#line 42552 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1779: /* $@157: %empty */ +#line 11610 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 42566 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1780: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_ref ON $@157 expr */ +#line 11620 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_on(thd, (yyvsp[-3].table_list), (yyvsp[0].item)); + (yyvsp[-3].table_list)->on_context= Lex->pop_context(); + (yyvsp[-3].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-3].table_list); + Select->parsing_place= NO_MATTER; + } +#line 42578 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1781: /* $@158: %empty */ +#line 11628 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42588 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1782: /* join_table: table_ref LEFT opt_outer JOIN_SYM table_factor $@158 USING '(' using_list ')' */ +#line 11634 "/home/buildbot/git/sql/sql_yacc.yy" + { + add_join_natural((yyvsp[-9].table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + (yyvsp[-5].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[-5].table_list); + } +#line 42598 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1783: /* join_table: table_ref NATURAL LEFT opt_outer JOIN_SYM table_factor */ +#line 11640 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[-5].table_list),(yyvsp[0].table_list),NULL,Select); + (yyvsp[0].table_list)->outer_join|=JOIN_TYPE_LEFT; + (yyval.table_list)=(yyvsp[0].table_list); + } +#line 42611 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1784: /* $@159: %empty */ +#line 11652 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[-1].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[-1].table_list)); + /* Change the current name resolution context to a local context. */ + if (unlikely(push_new_name_resolution_context(thd, (yyvsp[-5].table_list), (yyvsp[-1].table_list)))) + MYSQL_YYABORT; + Select->parsing_place= IN_ON; + } +#line 42625 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1785: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_ref ON $@159 expr */ +#line 11662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_on(thd, (yyval.table_list), (yyvsp[0].item)); + (yyvsp[-7].table_list)->on_context= Lex->pop_context(); + Select->parsing_place= NO_MATTER; + } +#line 42638 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1786: /* $@160: %empty */ +#line 11671 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-4].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + } +#line 42648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1787: /* join_table: table_ref RIGHT opt_outer JOIN_SYM table_factor $@160 USING '(' using_list ')' */ +#line 11677 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + add_join_natural((yyval.table_list),(yyvsp[-5].table_list),(yyvsp[-1].string_list),Select); + } +#line 42659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1788: /* join_table: table_ref NATURAL RIGHT opt_outer JOIN_SYM table_factor */ +#line 11684 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-5].table_list) && (yyvsp[0].table_list)); + Select->add_joined_table((yyvsp[-5].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + add_join_natural((yyvsp[0].table_list),(yyvsp[-5].table_list),NULL,Select); + LEX *lex= Lex; + if (unlikely(!((yyval.table_list)= lex->current_select->convert_right_join()))) + MYSQL_YYABORT; + } +#line 42673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1789: /* inner_join: JOIN_SYM */ +#line 11697 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1790: /* inner_join: INNER_SYM JOIN_SYM */ +#line 11698 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1791: /* inner_join: STRAIGHT_JOIN */ +#line 11699 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 1; } +#line 42691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1792: /* normal_join: inner_join */ +#line 11703 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = (yyvsp[0].num); } +#line 42697 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1793: /* normal_join: CROSS JOIN_SYM */ +#line 11704 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num) = 0; } +#line 42703 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1794: /* opt_use_partition: %empty */ +#line 11712 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string_list)= 0;} +#line 42709 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1796: /* use_partition: PARTITION_SYM '(' using_list ')' have_partitioning */ +#line 11718 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string_list)= (yyvsp[-2].string_list); + Select->parsing_place= Select->save_parsing_place; + Select->save_parsing_place= NO_MATTER; + } +#line 42719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1797: /* table_factor: table_primary_ident_opt_parens */ +#line 11726 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1798: /* table_factor: table_primary_derived_opt_parens */ +#line 11727 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1799: /* table_factor: join_table_parens */ +#line 11729 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].table_list)->nested_join->nest_type= 0; + (yyval.table_list)= (yyvsp[0].table_list); + } +#line 42740 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1800: /* table_factor: table_reference_list_parens */ +#line 11733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42746 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1801: /* table_factor: table_function */ +#line 11734 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42752 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1802: /* table_primary_ident_opt_parens: table_primary_ident */ +#line 11738 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42758 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1803: /* table_primary_ident_opt_parens: '(' table_primary_ident_opt_parens ')' */ +#line 11739 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1804: /* table_primary_derived_opt_parens: table_primary_derived */ +#line 11743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 42770 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1805: /* table_primary_derived_opt_parens: '(' table_primary_derived_opt_parens ')' */ +#line 11744 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1806: /* table_reference_list_parens: '(' table_reference_list_parens ')' */ +#line 11748 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1807: /* table_reference_list_parens: '(' nested_table_reference_list ')' */ +#line 11750 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->end_nested_join(thd))) + MYSQL_YYABORT; + } +#line 42791 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1808: /* nested_table_reference_list: table_ref ',' table_ref */ +#line 11758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Select->init_nested_join(thd)) + MYSQL_YYABORT; + Select->add_joined_table((yyvsp[-2].table_list)); + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list)->embedding; + } +#line 42803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1809: /* nested_table_reference_list: nested_table_reference_list ',' table_ref */ +#line 11766 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->add_joined_table((yyvsp[0].table_list)); + (yyval.table_list)= (yyvsp[-2].table_list); + } +#line 42812 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1810: /* join_table_parens: '(' join_table_parens ')' */ +#line 11773 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[-1].table_list); } +#line 42818 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1811: /* join_table_parens: '(' join_table ')' */ +#line 11775 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (!((yyval.table_list)= lex->current_select->nest_last_join(thd))) + { + thd->parse_error(); + MYSQL_YYABORT; + } + } +#line 42831 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1812: /* table_primary_ident: table_ident opt_use_partition opt_for_system_time_clause opt_table_alias_clause opt_key_definition */ +#line 11789 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + if ((yyvsp[-2].num)) + (yyval.table_list)->vers_conditions= Lex->vers_conditions; + } +#line 42847 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1813: /* table_primary_derived: subquery opt_for_system_time_clause table_alias_clause */ +#line 11805 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Lex->parsed_derived_table((yyvsp[-2].select_lex)->master_unit(), (yyvsp[-1].num), (yyvsp[0].lex_str_ptr)))) + MYSQL_YYABORT; + } +#line 42856 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1814: /* table_primary_derived: subquery opt_for_system_time_clause */ +#line 11812 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING alias; + if ((yyvsp[-1].select_lex)->make_unique_derived_name(thd, &alias) || + !((yyval.table_list)= Lex->parsed_derived_table((yyvsp[-1].select_lex)->master_unit(), (yyvsp[0].num), &alias))) + MYSQL_YYABORT; + } +#line 42867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1815: /* opt_outer: %empty */ +#line 11822 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1816: /* opt_outer: OUTER */ +#line 11823 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42879 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1817: /* index_hint_clause: %empty */ +#line 11828 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (thd->variables.old_behavior & OLD_MODE_IGNORE_INDEX_ONLY_FOR_JOIN) ? + INDEX_HINT_MASK_JOIN : INDEX_HINT_MASK_ALL; + } +#line 42888 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1818: /* index_hint_clause: FOR_SYM JOIN_SYM */ +#line 11832 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_JOIN; } +#line 42894 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1819: /* index_hint_clause: FOR_SYM ORDER_SYM BY */ +#line 11833 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_ORDER; } +#line 42900 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1820: /* index_hint_clause: FOR_SYM GROUP_SYM BY */ +#line 11834 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= INDEX_HINT_MASK_GROUP; } +#line 42906 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1821: /* index_hint_type: FORCE_SYM */ +#line 11838 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_FORCE; } +#line 42912 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1822: /* index_hint_type: IGNORE_SYM */ +#line 11839 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.index_hint)= INDEX_HINT_IGNORE; } +#line 42918 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1823: /* $@161: %empty */ +#line 11844 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type((yyvsp[-2].index_hint), (yyvsp[0].num)); + } +#line 42926 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1825: /* $@162: %empty */ +#line 11849 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_index_hint_type(INDEX_HINT_USE, (yyvsp[0].num)); + } +#line 42934 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1830: /* $@163: %empty */ +#line 11862 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->alloc_index_hints(thd); } +#line 42940 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1832: /* $@164: %empty */ +#line 11866 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->clear_index_hints(); } +#line 42946 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1834: /* opt_key_usage_list: %empty */ +#line 11871 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, NULL, 0); } +#line 42952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1835: /* opt_key_usage_list: key_usage_list */ +#line 11872 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 42958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1836: /* key_usage_element: ident */ +#line 11877 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, (yyvsp[0].ident_sys).str, (yyvsp[0].ident_sys).length); } +#line 42964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1837: /* key_usage_element: PRIMARY_SYM */ +#line 11879 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->add_index_hint(thd, "PRIMARY", 7); } +#line 42970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1840: /* using_list: ident */ +#line 11889 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.string_list)= new (thd->mem_root) List))) + MYSQL_YYABORT; + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + (yyval.string_list)->push_back(s, thd->mem_root); + } +#line 42985 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1841: /* using_list: using_list ',' ident */ +#line 11900 "/home/buildbot/git/sql/sql_yacc.yy" + { + String *s= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(unlikely(s == NULL))) + MYSQL_YYABORT; + if (unlikely((yyvsp[-2].string_list)->push_back(s, thd->mem_root))) + MYSQL_YYABORT; + (yyval.string_list)= (yyvsp[-2].string_list); + } +#line 43000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1842: /* interval: interval_time_stamp */ +#line 11913 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1843: /* interval: DAY_HOUR_SYM */ +#line 11914 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_HOUR; } +#line 43012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1844: /* interval: DAY_MICROSECOND_SYM */ +#line 11915 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MICROSECOND; } +#line 43018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1845: /* interval: DAY_MINUTE_SYM */ +#line 11916 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_MINUTE; } +#line 43024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1846: /* interval: DAY_SECOND_SYM */ +#line 11917 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_DAY_SECOND; } +#line 43030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1847: /* interval: HOUR_MICROSECOND_SYM */ +#line 11918 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MICROSECOND; } +#line 43036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1848: /* interval: HOUR_MINUTE_SYM */ +#line 11919 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_MINUTE; } +#line 43042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1849: /* interval: HOUR_SECOND_SYM */ +#line 11920 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_HOUR_SECOND; } +#line 43048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1850: /* interval: MINUTE_MICROSECOND_SYM */ +#line 11921 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_MICROSECOND; } +#line 43054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1851: /* interval: MINUTE_SECOND_SYM */ +#line 11922 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_MINUTE_SECOND; } +#line 43060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1852: /* interval: SECOND_MICROSECOND_SYM */ +#line 11923 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_SECOND_MICROSECOND; } +#line 43066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1853: /* interval: YEAR_MONTH_SYM */ +#line 11924 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval)=INTERVAL_YEAR_MONTH; } +#line 43072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1854: /* interval_time_stamp: DAY_SYM */ +#line 11928 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_DAY; } +#line 43078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1855: /* interval_time_stamp: WEEK_SYM */ +#line 11929 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_WEEK; } +#line 43084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1856: /* interval_time_stamp: HOUR_SYM */ +#line 11930 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_HOUR; } +#line 43090 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1857: /* interval_time_stamp: MINUTE_SYM */ +#line 11931 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MINUTE; } +#line 43096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1858: /* interval_time_stamp: MONTH_SYM */ +#line 11932 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MONTH; } +#line 43102 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1859: /* interval_time_stamp: QUARTER_SYM */ +#line 11933 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_QUARTER; } +#line 43108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1860: /* interval_time_stamp: SECOND_SYM */ +#line 11934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_SECOND; } +#line 43114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1861: /* interval_time_stamp: MICROSECOND_SYM */ +#line 11935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_MICROSECOND; } +#line 43120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1862: /* interval_time_stamp: YEAR_SYM */ +#line 11936 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.interval_time_st)=INTERVAL_YEAR; } +#line 43126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1863: /* date_time_type: DATE_SYM */ +#line 11940 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATE;} +#line 43132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1864: /* date_time_type: TIME_SYM */ +#line 11941 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_TIME;} +#line 43138 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1865: /* date_time_type: DATETIME */ +#line 11942 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43144 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1866: /* date_time_type: TIMESTAMP */ +#line 11943 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.date_time_type)=MYSQL_TIMESTAMP_DATETIME;} +#line 43150 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1870: /* opt_table_alias_clause: %empty */ +#line 11953 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)=0; } +#line 43156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1871: /* opt_table_alias_clause: table_alias_clause */ +#line 11954 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str_ptr)= (yyvsp[0].lex_str_ptr); } +#line 43162 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1872: /* table_alias_clause: table_alias ident_table_alias */ +#line 11959 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_str_ptr)= (LEX_CSTRING*) thd->memdup(&(yyvsp[0].ident_sys),sizeof(LEX_STRING)); + if (unlikely((yyval.lex_str_ptr) == NULL)) + MYSQL_YYABORT; + } +#line 43172 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1875: /* opt_where_clause: %empty */ +#line 11972 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->where= 0; } +#line 43178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1876: /* $@165: %empty */ +#line 11974 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_WHERE; + } +#line 43186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1877: /* opt_where_clause: WHERE $@165 expr */ +#line 11978 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *select= Select; + select->where= normalize_cond(thd, (yyvsp[0].item)); + select->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43198 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1879: /* $@166: %empty */ +#line 11990 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_HAVING; + } +#line 43206 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1880: /* opt_having_clause: HAVING $@166 expr */ +#line 11994 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->having= normalize_cond(thd, (yyvsp[0].item)); + sel->parsing_place= NO_MATTER; + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + } +#line 43218 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1883: /* group_list: group_list ',' order_ident order_dir */ +#line 12014 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43227 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1884: /* group_list: order_ident order_dir */ +#line 12019 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_group_to_list(thd, (yyvsp[-1].item),(bool) (yyvsp[0].num)))) + MYSQL_YYABORT; + } +#line 43236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1885: /* olap_opt: %empty */ +#line 12026 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43242 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1886: /* olap_opt: WITH_CUBE_SYM */ +#line 12028 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH CUBE' is reserved in the MySQL syntax, but not implemented, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH CUBE + SQL-2003: GROUP BY ... CUBE(col1, col2, col3) + */ + LEX *lex=Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH CUBE", + "global union parameters")); + lex->current_select->olap= CUBE_TYPE; + + my_yyabort_error((ER_NOT_SUPPORTED_YET, MYF(0), "CUBE")); + } +#line 43263 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1887: /* olap_opt: WITH_ROLLUP_SYM */ +#line 12045 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + 'WITH ROLLUP' is needed for backward compatibility, + and cause LALR(2) conflicts. + This syntax is not standard. + MySQL syntax: GROUP BY col1, col2, col3 WITH ROLLUP + SQL-2003: GROUP BY ... ROLLUP(col1, col2, col3) + */ + LEX *lex= Lex; + if (unlikely(lex->current_select->get_linkage() == GLOBAL_OPTIONS_TYPE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "WITH ROLLUP", + "global union parameters")); + lex->current_select->olap= ROLLUP_TYPE; + } +#line 43282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1888: /* opt_window_clause: %empty */ +#line 12067 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43288 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1889: /* opt_window_clause: WINDOW_SYM window_def_list */ +#line 12070 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43294 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1892: /* window_def: window_name AS window_spec */ +#line 12080 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(Select->add_window_def(thd, (yyvsp[-2].lex_str_ptr), lex->win_ref, + Select->group_list, + Select->order_list, + lex->win_frame))) + MYSQL_YYABORT; + } +#line 43307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1893: /* $@167: %empty */ +#line 12092 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->prepare_add_window_spec(thd); } +#line 43313 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1894: /* window_spec: '(' $@167 opt_window_ref opt_window_partition_clause opt_window_order_clause opt_window_frame_clause ')' */ +#line 12096 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 43319 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1895: /* opt_window_ref: %empty */ +#line 12100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1896: /* opt_window_ref: ident */ +#line 12102 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->win_ref= (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + if (unlikely(thd->lex->win_ref == NULL)) + MYSQL_YYABORT; + } +#line 43335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1897: /* opt_window_partition_clause: %empty */ +#line 12110 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 43341 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1899: /* opt_window_order_clause: %empty */ +#line 12115 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 43347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1900: /* opt_window_order_clause: ORDER_SYM BY order_list */ +#line 12116 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->order_list= *((yyvsp[0].select_order)); } +#line 43353 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1901: /* opt_window_frame_clause: %empty */ +#line 12120 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 43359 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1902: /* opt_window_frame_clause: window_frame_units window_frame_extent opt_window_frame_exclusion */ +#line 12122 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->win_frame= + new (thd->mem_root) Window_frame((yyvsp[-2].frame_units), + lex->frame_top_bound, + lex->frame_bottom_bound, + (yyvsp[0].frame_exclusion)); + if (unlikely(lex->win_frame == NULL)) + MYSQL_YYABORT; + } +#line 43374 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1903: /* window_frame_units: ROWS_SYM */ +#line 12135 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_ROWS; } +#line 43380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1904: /* window_frame_units: RANGE_SYM */ +#line 12136 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_units)= Window_frame::UNITS_RANGE; } +#line 43386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1905: /* window_frame_extent: window_frame_start */ +#line 12141 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[0].window_frame_bound); + lex->frame_bottom_bound= + new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely(lex->frame_bottom_bound == NULL)) + MYSQL_YYABORT; + } +#line 43400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1906: /* window_frame_extent: BETWEEN_SYM window_frame_bound AND_SYM window_frame_bound */ +#line 12151 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->frame_top_bound= (yyvsp[-2].window_frame_bound); + lex->frame_bottom_bound= (yyvsp[0].window_frame_bound); + } +#line 43410 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1907: /* window_frame_start: UNBOUNDED_SYM PRECEDING_SYM */ +#line 12160 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43421 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1908: /* window_frame_start: CURRENT_SYM ROW_SYM */ +#line 12167 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::CURRENT, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1909: /* window_frame_start: literal PRECEDING_SYM */ +#line 12174 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::PRECEDING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43443 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1910: /* window_frame_bound: window_frame_start */ +#line 12183 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.window_frame_bound)= (yyvsp[0].window_frame_bound); } +#line 43449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1911: /* window_frame_bound: UNBOUNDED_SYM FOLLOWING_SYM */ +#line 12185 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, NULL); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43460 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1912: /* window_frame_bound: literal FOLLOWING_SYM */ +#line 12192 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.window_frame_bound)= new (thd->mem_root) + Window_frame_bound(Window_frame_bound::FOLLOWING, (yyvsp[-1].item)); + if (unlikely((yyval.window_frame_bound) == NULL)) + MYSQL_YYABORT; + } +#line 43471 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1913: /* opt_window_frame_exclusion: %empty */ +#line 12201 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 43477 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1914: /* opt_window_frame_exclusion: EXCLUDE_SYM CURRENT_SYM ROW_SYM */ +#line 12203 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_CURRENT_ROW; } +#line 43483 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1915: /* opt_window_frame_exclusion: EXCLUDE_SYM GROUP_SYM */ +#line 12205 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_GROUP; } +#line 43489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1916: /* opt_window_frame_exclusion: EXCLUDE_SYM TIES_SYM */ +#line 12207 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_TIES; } +#line 43495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1917: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_MARIADB_SYM */ +#line 12209 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 43501 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1918: /* opt_window_frame_exclusion: EXCLUDE_SYM NO_SYM OTHERS_ORACLE_SYM */ +#line 12211 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.frame_exclusion)= Window_frame::EXCL_NONE; } +#line 43507 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1922: /* alter_order_item: simple_ident_nospvar order_dir */ +#line 12229 "/home/buildbot/git/sql/sql_yacc.yy" + { + bool ascending= ((yyvsp[0].num) == 1) ? true : false; + if (unlikely(add_order_to_list(thd, (yyvsp[-1].item), ascending))) + MYSQL_YYABORT; + } +#line 43517 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1923: /* opt_order_clause: %empty */ +#line 12242 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= NULL; } +#line 43523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1924: /* opt_order_clause: order_clause */ +#line 12244 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_order)= (yyvsp[0].select_order); } +#line 43529 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1925: /* $@168: %empty */ +#line 12249 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->where= THD_WHERE::ORDER_CLAUSE; + } +#line 43537 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1926: /* order_clause: ORDER_SYM BY $@168 order_list */ +#line 12253 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[0].select_order); + } +#line 43545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1927: /* order_list: order_list ',' order_ident order_dir */ +#line 12260 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= (yyvsp[-3].select_order); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item),(bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 43555 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1928: /* order_list: order_ident order_dir */ +#line 12266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_order)= new (thd->mem_root) SQL_I_List(); + if (add_to_list(thd, *(yyval.select_order), (yyvsp[-1].item), (bool) (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 43565 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1929: /* order_dir: %empty */ +#line 12274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 43571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1930: /* order_dir: ASC */ +#line 12275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 43577 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1931: /* order_dir: DESC */ +#line 12276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 43583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1932: /* opt_limit_clause: %empty */ +#line 12282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit).clear(); } +#line 43589 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1933: /* opt_limit_clause: limit_clause */ +#line 12284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.select_limit)= (yyvsp[0].select_limit); } +#line 43595 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1934: /* limit_clause: LIMIT limit_options */ +#line 12289 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43606 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1935: /* limit_clause: LIMIT limit_options ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12297 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[-3].select_limit); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1936: /* limit_clause: LIMIT ROWS_SYM EXAMINED_SYM limit_rows_option */ +#line 12302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).clear(); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43624 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1937: /* limit_clause: fetch_first_clause */ +#line 12307 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit)= (yyvsp[0].select_limit); + if (!(yyval.select_limit).select_limit || + !(yyval.select_limit).select_limit->basic_const_item() || + (yyval.select_limit).select_limit->val_int() > 0) + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + } +#line 43636 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1938: /* fetch_first_clause: FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12318 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43650 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1939: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next row_or_rows only_or_with_ties */ +#line 12329 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + (yyval.select_limit).select_limit= one; + (yyval.select_limit).offset_limit= (yyvsp[-5].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43664 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1940: /* fetch_first_clause: FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12339 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= 0; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43675 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1941: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows FETCH_SYM first_or_next limit_option row_or_rows only_or_with_ties */ +#line 12347 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[-6].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= (yyvsp[0].num); + } +#line 43686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1942: /* fetch_first_clause: OFFSET_SYM limit_option row_or_rows */ +#line 12354 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= 0; + (yyval.select_limit).offset_limit= (yyvsp[-1].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43697 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1947: /* only_or_with_ties: ONLY_SYM */ +#line 12373 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 43703 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1948: /* only_or_with_ties: WITH TIES_SYM */ +#line 12374 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 43709 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1949: /* opt_global_limit_clause: opt_limit_clause */ +#line 12380 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->limit_params= (yyvsp[0].select_limit); + } +#line 43717 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1950: /* limit_options: limit_option */ +#line 12387 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= NULL; + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1951: /* limit_options: limit_option ',' limit_option */ +#line 12394 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[0].item); + (yyval.select_limit).offset_limit= (yyvsp[-2].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43739 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1952: /* limit_options: limit_option OFFSET_SYM limit_option */ +#line 12401 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_limit).select_limit= (yyvsp[-2].item); + (yyval.select_limit).offset_limit= (yyvsp[0].item); + (yyval.select_limit).explicit_limit= true; + (yyval.select_limit).with_ties= false; + } +#line 43750 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1953: /* limit_option: ident_cli */ +#line 12411 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 43759 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1954: /* limit_option: ident_cli '.' ident_cli */ +#line 12416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_limit(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 43768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1955: /* limit_option: param_marker */ +#line 12421 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_param)->limit_clause_param= TRUE; + } +#line 43776 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1956: /* limit_option: ULONGLONG_NUM */ +#line 12425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 43786 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1957: /* limit_option: LONG_NUM */ +#line 12431 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 43796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1958: /* limit_option: NUM */ +#line 12437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 43806 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1959: /* limit_rows_option: limit_option */ +#line 12446 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->limit_rows_examined= (yyvsp[0].item); + } +#line 43814 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1960: /* delete_limit_clause: %empty */ +#line 12453 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->current_select->limit_params.select_limit= 0; + } +#line 43823 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1961: /* delete_limit_clause: LIMIT limit_option */ +#line 12458 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *sel= Select; + sel->limit_params.select_limit= (yyvsp[0].item); + Lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_LIMIT); + sel->limit_params.explicit_limit= 1; + } +#line 43834 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1962: /* delete_limit_clause: LIMIT ROWS_SYM EXAMINED_SYM */ +#line 12464 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 43840 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1963: /* delete_limit_clause: LIMIT limit_option ROWS_SYM EXAMINED_SYM */ +#line 12465 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(); MYSQL_YYABORT; } +#line 43846 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1964: /* order_limit_lock: order_or_limit */ +#line 12470 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); + (yyval.order_limit_lock)->lock.empty(); + } +#line 43855 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1965: /* order_limit_lock: order_or_limit select_lock_type */ +#line 12475 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= (yyvsp[-1].order_limit_lock); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 43864 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1966: /* order_limit_lock: select_lock_type */ +#line 12480 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit.clear(); + (yyval.order_limit_lock)->lock= (yyvsp[0].select_lock); + } +#line 43877 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1967: /* opt_order_limit_lock: %empty */ +#line 12492 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); + (yyval.order_limit_lock)= NULL; + } +#line 43886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1968: /* opt_order_limit_lock: order_limit_lock */ +#line 12496 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.order_limit_lock)= (yyvsp[0].order_limit_lock); } +#line 43892 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1971: /* opt_procedure_or_into: %empty */ +#line 12509 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock).empty(); + } +#line 43900 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1972: /* opt_procedure_or_into: procedure_clause opt_select_lock_type */ +#line 12513 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 43908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1973: /* opt_procedure_or_into: into opt_select_lock_type */ +#line 12517 "/home/buildbot/git/sql/sql_yacc.yy" + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_WARN_DEPRECATED_SYNTAX, + ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX), + " INTO " + " FROM...'"); + (yyval.select_lock)= (yyvsp[0].select_lock); + } +#line 43922 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1974: /* order_or_limit: order_clause opt_limit_clause */ +#line 12531 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= (yyvsp[-1].select_order); + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 43934 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1975: /* order_or_limit: limit_clause */ +#line 12539 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.order_limit_lock)= new(thd->mem_root) Lex_order_limit_lock; + if (!(yyval.order_limit_lock)) + YYABORT; + (yyval.order_limit_lock)->order_list= NULL; + (yyval.order_limit_lock)->limit= (yyvsp[0].select_limit); + } +#line 43946 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1978: /* int_num: opt_plus NUM */ +#line 12555 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= (int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43952 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1979: /* int_num: '-' NUM */ +#line 12556 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.num)= -(int) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1980: /* ulong_num: opt_plus NUM */ +#line 12560 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1981: /* ulong_num: HEX_NUM */ +#line 12561 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= strtoul((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 43970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1982: /* ulong_num: opt_plus LONG_NUM */ +#line 12562 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43976 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1983: /* ulong_num: opt_plus ULONGLONG_NUM */ +#line 12563 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43982 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1984: /* ulong_num: opt_plus DECIMAL_NUM */ +#line 12564 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43988 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1985: /* ulong_num: opt_plus FLOAT_NUM */ +#line 12565 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 43994 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1986: /* real_ulong_num: NUM */ +#line 12569 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44000 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1987: /* real_ulong_num: HEX_NUM */ +#line 12570 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (ulong) strtol((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44006 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1988: /* real_ulong_num: LONG_NUM */ +#line 12571 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1989: /* real_ulong_num: ULONGLONG_NUM */ +#line 12572 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulong_num)= (ulong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1990: /* real_ulong_num: dec_num_error */ +#line 12573 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1991: /* longlong_num: opt_plus NUM */ +#line 12577 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1992: /* longlong_num: LONG_NUM */ +#line 12578 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= (longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44036 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1993: /* longlong_num: '-' NUM */ +#line 12579 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44042 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1994: /* longlong_num: '-' LONG_NUM */ +#line 12580 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.longlong_number)= -(longlong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1995: /* ulonglong_num: opt_plus NUM */ +#line 12584 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44054 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1996: /* ulonglong_num: opt_plus ULONGLONG_NUM */ +#line 12585 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44060 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1997: /* ulonglong_num: opt_plus LONG_NUM */ +#line 12586 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1998: /* ulonglong_num: opt_plus DECIMAL_NUM */ +#line 12587 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 1999: /* ulonglong_num: opt_plus FLOAT_NUM */ +#line 12588 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44078 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2000: /* real_ulonglong_num: NUM */ +#line 12592 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44084 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2001: /* real_ulonglong_num: ULONGLONG_NUM */ +#line 12593 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44090 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2002: /* real_ulonglong_num: HEX_NUM */ +#line 12594 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulonglong_number)= strtoull((yyvsp[0].lex_str).str, (char**) 0, 16); } +#line 44096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2003: /* real_ulonglong_num: LONG_NUM */ +#line 12595 "/home/buildbot/git/sql/sql_yacc.yy" + { int error; (yyval.ulonglong_number)= (ulonglong) my_strtoll10((yyvsp[0].lex_str).str, (char**) 0, &error); } +#line 44102 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2004: /* real_ulonglong_num: dec_num_error */ +#line 12596 "/home/buildbot/git/sql/sql_yacc.yy" + { MYSQL_YYABORT; } +#line 44108 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2005: /* dec_num_error: dec_num */ +#line 12601 "/home/buildbot/git/sql/sql_yacc.yy" + { thd->parse_error(ER_ONLY_INTEGERS_ALLOWED); } +#line 44114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2008: /* choice: ulong_num */ +#line 12610 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= (yyvsp[0].ulong_num) != 0 ? HA_CHOICE_YES : HA_CHOICE_NO; } +#line 44120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2009: /* choice: DEFAULT */ +#line 12611 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.choice)= HA_CHOICE_UNDEF; } +#line 44126 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2010: /* bool: ulong_num */ +#line 12615 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= (yyvsp[0].ulong_num) != 0; } +#line 44132 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2011: /* bool: TRUE_SYM */ +#line 12616 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 1; } +#line 44138 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2012: /* bool: FALSE_SYM */ +#line 12617 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ulong_num)= 0; } +#line 44144 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2013: /* $@169: %empty */ +#line 12622 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + + lex->proc_list.elements=0; + lex->proc_list.first=0; + lex->proc_list.next= &lex->proc_list.first; + Item_field *item= new (thd->mem_root) + Item_field(thd, &lex->current_select->context, + (yyvsp[0].ident_sys)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + if (unlikely(add_proc_to_list(thd, item))) + MYSQL_YYABORT; + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + + /* + PROCEDURE CLAUSE cannot handle subquery as one of its parameter, + so disallow any subqueries further. + Alow subqueries back once the parameters are reduced. + */ + Lex->clause_that_disallows_subselect= "PROCEDURE"; + Select->options|= OPTION_PROCEDURE_CLAUSE; + } +#line 44172 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2014: /* procedure_clause: PROCEDURE_SYM ident $@169 '(' procedure_list ')' */ +#line 12646 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* Subqueries are allowed from now.*/ + Lex->clause_that_disallows_subselect= NULL; + } +#line 44181 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2015: /* procedure_list: %empty */ +#line 12653 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44187 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2016: /* procedure_list: procedure_list2 */ +#line 12654 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44193 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2019: /* procedure_item: remember_name expr remember_end */ +#line 12664 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(add_proc_to_list(thd, (yyvsp[-1].item)))) + MYSQL_YYABORT; + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44204 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2020: /* $@170: %empty */ +#line 12673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe && + unlikely((!(lex->result= new (thd->mem_root) + select_dumpvar(thd))))) + MYSQL_YYABORT; + } +#line 44216 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2021: /* select_var_list_init: $@170 select_var_list */ +#line 12681 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44222 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2023: /* select_var_list: select_var_ident */ +#line 12686 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2024: /* select_var_ident: select_outvar */ +#line 12690 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->result) + { + if (unlikely((yyvsp[0].myvar) == NULL)) + MYSQL_YYABORT; + ((select_dumpvar *)Lex->result)->var_list.push_back((yyvsp[0].myvar), thd->mem_root); + } + else + { + /* + The parser won't create select_result instance only + if it's an EXPLAIN. + */ + DBUG_ASSERT(Lex->describe); + } + } +#line 44249 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2025: /* select_outvar: '@' ident_or_text */ +#line 12710 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.myvar) = Lex->result ? new (thd->mem_root) my_var_user(&(yyvsp[0].lex_str)) : NULL; + } +#line 44263 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2026: /* select_outvar: ident_or_text */ +#line 12720 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[0].lex_str))) && Lex->result)) + MYSQL_YYABORT; + } +#line 44272 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2027: /* select_outvar: ident '.' ident */ +#line 12725 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.myvar)= Lex->create_outvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))) && Lex->result)) + MYSQL_YYABORT; + } +#line 44281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2028: /* into: INTO into_destination */ +#line 12733 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2029: /* $@171: %empty */ +#line 12738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str, 0))) || + unlikely(!(lex->result= + new (thd->mem_root) + select_export(thd, lex->exchange)))) + MYSQL_YYABORT; + } +#line 44302 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2030: /* $@172: %empty */ +#line 12749 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 44308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2032: /* into_destination: DUMPFILE TEXT_STRING_filesystem */ +#line 12752 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (!lex->describe) + { + lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + if (unlikely(!(lex->exchange= + new (thd->mem_root) sql_exchange((yyvsp[0].lex_str).str,1)))) + MYSQL_YYABORT; + if (unlikely(!(lex->result= + new (thd->mem_root) + select_dump(thd, lex->exchange)))) + MYSQL_YYABORT; + } + } +#line 44327 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2033: /* into_destination: select_var_list_init */ +#line 12767 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->uncacheable(UNCACHEABLE_SIDEEFFECT); + } +#line 44335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2034: /* $@173: %empty */ +#line 12778 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_DO; + if (lex->main_select_push(true)) + MYSQL_YYABORT; + lex->init_select(); + } +#line 44347 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2035: /* do: DO_SYM $@173 expr_list */ +#line 12786 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->insert_list= (yyvsp[0].item_list); + Lex->pop_select(); //main select + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 44358 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2036: /* $@174: %empty */ +#line 12800 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_TABLE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 44369 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2037: /* drop: DROP opt_temporary table_or_tables opt_if_exists $@174 table_list opt_lock_wait_timeout opt_restrict */ +#line 12807 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2038: /* $@175: %empty */ +#line 12809 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 44384 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2039: /* drop: DROP INDEX_SYM $@175 opt_if_exists_table_element ident ON table_ident opt_lock_wait_timeout */ +#line 12814 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Alter_drop *ad= (new (thd->mem_root) + Alter_drop(Alter_drop::KEY, (yyvsp[-3].ident_sys).str, (yyvsp[-4].num))); + if (unlikely(ad == NULL)) + MYSQL_YYABORT; + lex->sql_command= SQLCOM_DROP_INDEX; + lex->alter_info.reset(); + lex->alter_info.flags= ALTER_DROP_INDEX; + lex->alter_info.drop_list.push_back(ad, thd->mem_root); + if (unlikely(!lex->current_select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + TL_READ_NO_INSERT, + MDL_SHARED_UPGRADABLE))) + MYSQL_YYABORT; + Lex->pop_select(); //main select + } +#line 44406 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2040: /* drop: DROP DATABASE opt_if_exists ident */ +#line 12832 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_command(SQLCOM_DROP_DB, (yyvsp[-1].object_ddl_options)); + lex->name= (yyvsp[0].ident_sys); + } +#line 44416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2041: /* drop: DROP USER_SYM opt_if_exists clear_privileges user_list */ +#line 12838 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_USER, (yyvsp[-2].object_ddl_options)); + } +#line 44424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2042: /* drop: DROP ROLE_SYM opt_if_exists clear_privileges role_list */ +#line 12842 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_ROLE, (yyvsp[-2].object_ddl_options)); + } +#line 44432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2043: /* $@176: %empty */ +#line 12846 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_VIEW, (yyvsp[0].object_ddl_options)); + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 44443 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2044: /* drop: DROP VIEW_SYM opt_if_exists $@176 table_list opt_restrict */ +#line 12853 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2045: /* drop: DROP EVENT_SYM opt_if_exists sp_name */ +#line 12855 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->set_command(SQLCOM_DROP_EVENT, (yyvsp[-1].object_ddl_options)); + } +#line 44458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2046: /* drop: DROP TRIGGER_SYM opt_if_exists sp_name */ +#line 12860 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_TRIGGER, (yyvsp[-1].object_ddl_options)); + lex->spname= (yyvsp[0].spname); + } +#line 44468 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2047: /* drop: DROP SERVER_SYM opt_if_exists ident_or_text */ +#line 12866 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_DROP_SERVER, (yyvsp[-1].object_ddl_options)); + Lex->server_options.reset((yyvsp[0].lex_str)); + } +#line 44477 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2048: /* $@177: %empty */ +#line 12872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_SEQUENCE, (yyvsp[-2].num), (yyvsp[0].object_ddl_options)); + lex->table_type= TABLE_TYPE_SEQUENCE; + YYPS->m_lock_type= TL_UNLOCK; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 44489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2049: /* drop: DROP opt_temporary SEQUENCE_SYM opt_if_exists $@177 table_list */ +#line 12880 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44495 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2053: /* table_name: table_ident */ +#line 12891 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!thd->lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type)) + MYSQL_YYABORT; + } +#line 44508 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2054: /* table_name_with_opt_use_partition: table_ident opt_use_partition */ +#line 12903 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + } +#line 44522 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2057: /* table_alias_ref: table_ident_opt_wild */ +#line 12921 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[0].table), NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 44536 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2058: /* opt_if_exists_table_element: %empty */ +#line 12934 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= FALSE; + (yyval.num)= 0; + } +#line 44545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2059: /* opt_if_exists_table_element: IF_SYM EXISTS */ +#line 12939 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->check_exists= TRUE; + (yyval.num)= 1; + } +#line 44554 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2060: /* opt_if_exists: %empty */ +#line 12947 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_NONE); + } +#line 44562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2061: /* opt_if_exists: IF_SYM EXISTS */ +#line 12951 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.object_ddl_options).set(DDL_options_st::OPT_IF_EXISTS); + } +#line 44570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2062: /* opt_temporary: %empty */ +#line 12957 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 44576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2063: /* opt_temporary: TEMPORARY */ +#line 12958 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= HA_LEX_CREATE_TMP_TABLE; } +#line 44582 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2064: /* $@178: %empty */ +#line 12966 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_INSERT; + Lex->duplicates= DUP_ERROR; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 44593 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2065: /* $@179: %empty */ +#line 12973 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-3].lock_type), true, false); + } +#line 44601 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2066: /* insert: INSERT $@178 insert_start insert_lock_option opt_ignore opt_into insert_table $@179 insert_field_spec opt_insert_update opt_returning stmt_end */ +#line 12978 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 44610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2067: /* $@180: %empty */ +#line 12986 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REPLACE; + Lex->duplicates= DUP_REPLACE; + thd->get_stmt_da()->opt_clear_warning_info(thd->query_id); + thd->get_stmt_da()->reset_current_row_for_warning(1); + } +#line 44621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2068: /* $@181: %empty */ +#line 12993 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->set_lock_for_tables((yyvsp[-2].lock_type), true, false); + } +#line 44629 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2069: /* replace: REPLACE $@180 insert_start replace_lock_option opt_into insert_table $@181 insert_field_spec opt_returning stmt_end */ +#line 12998 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + thd->get_stmt_da()->reset_current_row_for_warning(0); + } +#line 44638 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2070: /* insert_start: %empty */ +#line 13004 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + Lex->init_select(); + Lex->inc_select_stack_outer_barrier(); + Lex->current_select->parsing_place= BEFORE_OPT_LIST; + } +#line 44650 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2071: /* stmt_end: %empty */ +#line 13013 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 44660 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2072: /* insert_lock_option: %empty */ +#line 13022 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + If it is SP we do not allow insert optimisation when result of + insert visible only after the table unlocking but everyone can + read table. + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 44673 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2074: /* insert_lock_option: HIGH_PRIORITY */ +#line 13031 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE; } +#line 44679 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2075: /* replace_lock_option: %empty */ +#line 13035 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 44685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2077: /* insert_replace_option: LOW_PRIORITY */ +#line 13040 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 44691 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2078: /* insert_replace_option: DELAYED_SYM */ +#line 13042 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->keyword_delayed_begin_offset= (uint)((yyvsp[0].kwd).pos() - thd->query()); + Lex->keyword_delayed_end_offset= (uint)((yyvsp[0].kwd).end() - thd->query()); + (yyval.lock_type)= TL_WRITE_DELAYED; + } +#line 44701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2081: /* $@182: %empty */ +#line 13052 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->save_parsing_place= Select->parsing_place; + } +#line 44709 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2082: /* insert_table: $@182 table_name_with_opt_use_partition */ +#line 13056 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + //lex->field_list.empty(); + lex->many_values.empty(); + lex->insert_list=0; + } +#line 44720 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2083: /* insert_field_spec: insert_values */ +#line 13065 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44726 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2084: /* insert_field_spec: insert_field_list insert_values */ +#line 13066 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2085: /* $@183: %empty */ +#line 13068 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item)) || + unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + lex->current_select->parsing_place= NO_MATTER; + } +#line 44745 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2087: /* insert_field_list: LEFT_PAREN_ALT opt_fields ')' */ +#line 13081 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->current_select->parsing_place= AFTER_LIST; + } +#line 44753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2090: /* fields: fields ',' insert_ident */ +#line 13093 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 44759 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2091: /* fields: insert_ident */ +#line 13094 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 44765 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2092: /* insert_values: create_select_query_expression */ +#line 13100 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44771 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2097: /* ident_eq_value: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13115 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(lex->field_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 44782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2098: /* equal: '=' */ +#line 13124 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44788 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2099: /* equal: SET_VAR */ +#line 13125 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44794 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2100: /* opt_equal: %empty */ +#line 13129 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44800 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2101: /* opt_equal: equal */ +#line 13130 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44806 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2102: /* opt_with: opt_equal */ +#line 13134 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44812 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2103: /* opt_with: WITH */ +#line 13135 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44818 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2104: /* opt_by: opt_equal */ +#line 13139 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44824 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2105: /* opt_by: BY */ +#line 13140 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44830 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2106: /* $@184: %empty */ +#line 13145 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 44839 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2107: /* no_braces: '(' $@184 opt_values ')' */ +#line 13150 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 44851 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2108: /* $@185: %empty */ +#line 13161 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!(Lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 44860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2109: /* no_braces_with_names: '(' $@185 opt_values_with_names ')' */ +#line 13166 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + thd->get_stmt_da()->inc_current_row_for_warning(); + if (unlikely(lex->many_values.push_back(lex->insert_list, + thd->mem_root))) + MYSQL_YYABORT; + } +#line 44872 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2110: /* opt_values: %empty */ +#line 13176 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2112: /* opt_values_with_names: %empty */ +#line 13181 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 44884 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2114: /* values: values ',' expr_or_ignore_or_default */ +#line 13187 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 44893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2115: /* values: expr_or_ignore_or_default */ +#line 13192 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 44902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2116: /* values_with_names: values_with_names ',' remember_name expr_or_ignore_or_default remember_end */ +#line 13200 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2117: /* values_with_names: remember_name expr_or_ignore_or_default remember_end */ +#line 13208 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->insert_list->push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + // give some name in case of using in table value constuctor (TVC) + if (!(yyvsp[-1].item)->name.str || (yyvsp[-1].item)->name.str == item_empty_name) + (yyvsp[-1].item)->set_name(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 44926 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2118: /* expr_or_ignore: expr */ +#line 13218 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 44932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2119: /* expr_or_ignore: IGNORE_SYM */ +#line 13220 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_ignore_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44942 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2120: /* expr_or_ignore_or_default: expr_or_ignore */ +#line 13228 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item);} +#line 44948 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2121: /* expr_or_ignore_or_default: DEFAULT */ +#line 13230 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_default_specification(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 44958 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2123: /* $@186: %empty */ +#line 13239 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates= DUP_UPDATE; } +#line 44964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2124: /* $@187: %empty */ +#line 13241 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= IN_UPDATE_ON_DUP_KEY; + } +#line 44972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2125: /* opt_insert_update: ON DUPLICATE_SYM $@186 KEY_SYM UPDATE_SYM $@187 insert_update_list */ +#line 13245 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + } +#line 44980 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2126: /* update_table_list: table_ident opt_use_partition for_portion_of_time_clause opt_table_alias_clause opt_key_definition */ +#line 13253 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.table_list)= Select->add_table_to_list(thd, (yyvsp[-4].table), (yyvsp[-1].lex_str_ptr), + 0, + YYPS->m_lock_type, + YYPS->m_mdl_type, + Select->pop_index_hints(), + (yyvsp[-3].string_list)))) + MYSQL_YYABORT; + (yyval.table_list)->period_conditions= Lex->period_conditions; + } +#line 44995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2127: /* update_table_list: join_table_list */ +#line 13263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.table_list)= (yyvsp[0].table_list); } +#line 45001 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2128: /* $@188: %empty */ +#line 13270 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->sql_command= SQLCOM_UPDATE; + lex->duplicates= DUP_ERROR; + } +#line 45014 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2129: /* $@189: %empty */ +#line 13280 "/home/buildbot/git/sql/sql_yacc.yy" + { + SELECT_LEX *slex= Lex->first_select_lex(); + if (slex->table_list.elements > 1) + Lex->sql_command= SQLCOM_UPDATE_MULTI; + else if (slex->get_table_list()->derived) + { + /* it is single table update and it is update of derived table */ + my_error(ER_NON_UPDATABLE_TABLE, MYF(0), + slex->get_table_list()->alias.str, "UPDATE"); + MYSQL_YYABORT; + } + /* + In case of multi-update setting write lock for all tables may + be too pessimistic. We will decrease lock level if possible in + mysql_multi_update(). + */ + slex->set_lock_for_tables((yyvsp[-4].lock_type), slex->table_list.elements == 1, false); + } +#line 45037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2130: /* $@190: %empty */ +#line 13299 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-1].select_order)) + Select->order_list= *((yyvsp[-1].select_order)); + } +#line 45046 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2131: /* update: UPDATE_SYM $@188 opt_low_priority opt_ignore update_table_list SET update_list $@189 opt_where_clause opt_order_clause delete_limit_clause $@190 stmt_end */ +#line 13302 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45052 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2134: /* update_elem: simple_ident_nospvar equal DEFAULT */ +#line 13312 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *def= new (thd->mem_root) Item_default_value(thd, + Lex->current_context(), (yyvsp[-2].item), 1); + if (!def || add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, def)) + MYSQL_YYABORT; + } +#line 45063 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2135: /* update_elem: simple_ident_nospvar equal expr_or_ignore */ +#line 13319 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (add_item_to_list(thd, (yyvsp[-2].item)) || add_value_to_list(thd, (yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 45072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2138: /* insert_update_elem: simple_ident_nospvar equal expr_or_ignore_or_default */ +#line 13332 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-2].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[0].item), thd->mem_root))) + MYSQL_YYABORT; + } +#line 45083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2139: /* opt_low_priority: %empty */ +#line 13341 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 45089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2140: /* opt_low_priority: LOW_PRIORITY */ +#line 13342 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 45095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2141: /* $@191: %empty */ +#line 13349 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_DELETE; + YYPS->m_lock_type= TL_WRITE_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_WRITE; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->ignore= 0; + lex->first_select_lex()->order_list.empty(); + } +#line 45111 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2142: /* delete: DELETE_SYM $@191 delete_part2 */ +#line 13361 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 45120 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2143: /* opt_delete_system_time: %empty */ +#line 13369 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_HISTORY); + } +#line 45128 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2144: /* opt_delete_system_time: BEFORE_SYM SYSTEM_TIME_SYM history_point */ +#line 13373 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->vers_conditions.init(SYSTEM_TIME_BEFORE, (yyvsp[0].vers_history_point)); + } +#line 45136 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2145: /* delete_part2: opt_delete_options single_multi */ +#line 13379 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45142 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2146: /* delete_part2: HISTORY_SYM delete_single_table opt_delete_system_time */ +#line 13381 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->last_table()->vers_conditions= Lex->vers_conditions; + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45153 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2147: /* delete_single_table: FROM table_ident opt_use_partition */ +#line 13391 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select-> + add_table_to_list(thd, (yyvsp[-1].table), NULL, TL_OPTION_UPDATING, + YYPS->m_lock_type, + YYPS->m_mdl_type, + NULL, + (yyvsp[0].string_list)))) + MYSQL_YYABORT; + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2148: /* delete_single_table_for_period: delete_single_table opt_for_portion_of_time_clause */ +#line 13406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].num)) + Lex->last_table()->period_conditions= Lex->period_conditions; + } +#line 45178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2149: /* single_multi: delete_single_table_for_period opt_where_clause opt_order_clause delete_limit_clause opt_returning */ +#line 13418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[-2].select_order)) + Select->order_list= *((yyvsp[-2].select_order)); + Lex->pop_select(); //main select + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 45190 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2150: /* $@192: %empty */ +#line 13426 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2151: /* $@193: %empty */ +#line 13432 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45209 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2152: /* single_multi: table_wild_list $@192 FROM join_table_list opt_where_clause $@193 stmt_end */ +#line 13435 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45215 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2153: /* $@194: %empty */ +#line 13437 "/home/buildbot/git/sql/sql_yacc.yy" + { + mysql_init_multi_delete(Lex); + YYPS->m_lock_type= TL_READ_DEFAULT; + YYPS->m_mdl_type= MDL_SHARED_READ; + } +#line 45225 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2154: /* $@195: %empty */ +#line 13443 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(multi_delete_set_locks_and_link_aux_tables(Lex))) + MYSQL_YYABORT; + } +#line 45234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2155: /* single_multi: FROM table_alias_ref_list $@194 USING join_table_list opt_where_clause $@195 stmt_end */ +#line 13446 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45240 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2156: /* opt_returning: %empty */ +#line 13451 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + } +#line 45248 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2157: /* $@196: %empty */ +#line 13455 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(!Lex->has_returning()); + /* + When parsing_place is IN_RETURNING, we push select items to + item_list of builtin_select instead of current_select. + But set parsing_place of current_select to true. + + Because parsing_place for builtin_select will be IN_RETURNING, + regardless there is SELECT in RETURNING. Example, if + there is RETURNING (SELECT...), then when we parse + SELECT inside RETURNING, builtin_select->parsing_place + will still be true. So the select items of SELECT inside + RETURNING will be added to item_list of builtin_select which + is incorrect. We want to prevent this from happening. + Since for every new select, a new SELECT_LEX + object is created and pushed to select stack, current_select + will point to SELECT inside RETURNING, and also has + parsing_place not set to IN_RETURNING by default. + So items are correctly added to item_list of SELECT inside + RETURNING instead of builtin_select. + */ + + thd->lex->current_select->parsing_place= IN_RETURNING; + thd->lex->push_context(&thd->lex->returning()->context); + } +#line 45278 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2158: /* opt_returning: RETURNING_SYM $@196 select_item_list */ +#line 13481 "/home/buildbot/git/sql/sql_yacc.yy" + { + thd->lex->pop_context(); + thd->lex->current_select->parsing_place= NO_MATTER; + } +#line 45287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2161: /* table_wild_one: ident opt_wild */ +#line 13494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 45306 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2162: /* table_wild_one: ident '.' ident opt_wild */ +#line 13509 "/home/buildbot/git/sql/sql_yacc.yy" + { + Table_ident *ti= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely(ti == NULL)) + MYSQL_YYABORT; + if (unlikely(!Select-> + add_table_to_list(thd, + ti, + NULL, + (TL_OPTION_UPDATING | + TL_OPTION_ALIAS), + YYPS->m_lock_type, + YYPS->m_mdl_type))) + MYSQL_YYABORT; + } +#line 45325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2163: /* opt_wild: %empty */ +#line 13526 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45331 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2164: /* opt_wild: '.' '*' */ +#line 13527 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2165: /* opt_delete_options: %empty */ +#line 13531 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2166: /* opt_delete_options: opt_delete_option opt_delete_options */ +#line 13532 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 45349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2167: /* opt_delete_option: QUICK */ +#line 13536 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_QUICK; } +#line 45355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2168: /* opt_delete_option: LOW_PRIORITY */ +#line 13537 "/home/buildbot/git/sql/sql_yacc.yy" + { YYPS->m_lock_type= TL_WRITE_LOW_PRIORITY; } +#line 45361 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2169: /* opt_delete_option: IGNORE_SYM */ +#line 13538 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 45367 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2170: /* $@197: %empty */ +#line 13543 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= Lex; + lex->sql_command= SQLCOM_TRUNCATE; + lex->alter_info.reset(); + lex->first_select_lex()->options= 0; + lex->sql_cache= LEX::SQL_CACHE_UNSPECIFIED; + lex->first_select_lex()->order_list.empty(); + YYPS->m_lock_type= TL_WRITE; + YYPS->m_mdl_type= MDL_EXCLUSIVE; + } +#line 45382 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2171: /* $@198: %empty */ +#line 13554 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX* lex= thd->lex; + DBUG_ASSERT(!lex->m_sql_cmd); + lex->m_sql_cmd= new (thd->mem_root) Sql_cmd_truncate_table(); + if (unlikely(lex->m_sql_cmd == NULL)) + MYSQL_YYABORT; + } +#line 45394 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2172: /* truncate: TRUNCATE_SYM $@197 opt_table_sym table_name opt_lock_wait_timeout $@198 opt_truncate_table_storage_clause */ +#line 13561 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 45400 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2179: /* profile_def: CPU_SYM */ +#line 13579 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CPU; + } +#line 45408 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2180: /* profile_def: MEMORY_SYM */ +#line 13583 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_MEMORY; + } +#line 45416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2181: /* profile_def: BLOCK_SYM IO_SYM */ +#line 13587 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_BLOCK_IO; + } +#line 45424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2182: /* profile_def: CONTEXT_SYM SWITCHES_SYM */ +#line 13591 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_CONTEXT; + } +#line 45432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2183: /* profile_def: PAGE_SYM FAULTS_SYM */ +#line 13595 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_PAGE_FAULTS; + } +#line 45440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2184: /* profile_def: IPC_SYM */ +#line 13599 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_IPC; + } +#line 45448 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2185: /* profile_def: SWAPS_SYM */ +#line 13603 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SWAPS; + } +#line 45456 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2186: /* profile_def: SOURCE_SYM */ +#line 13607 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_SOURCE; + } +#line 45464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2187: /* profile_def: ALL */ +#line 13611 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_options|= PROFILE_ALL; + } +#line 45472 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2188: /* opt_profile_args: %empty */ +#line 13618 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= 0; + } +#line 45480 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2189: /* opt_profile_args: FOR_SYM QUERY_SYM NUM */ +#line 13622 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->profile_query_id= atoi((yyvsp[0].lex_str).str); + } +#line 45488 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2190: /* $@199: %empty */ +#line 13631 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + } +#line 45503 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2191: /* show: SHOW $@199 show_param */ +#line 13642 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 45512 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2192: /* show_param: DATABASES wild_and_where */ +#line 13650 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_DATABASES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SCHEMATA))) + MYSQL_YYABORT; + } +#line 45523 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2193: /* show_param: opt_full TABLES opt_db wild_and_where */ +#line 13657 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLE_NAMES)) + MYSQL_YYABORT; + } +#line 45535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2194: /* show_param: opt_full TRIGGERS_SYM opt_db wild_and_where */ +#line 13665 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TRIGGERS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TRIGGERS)) + MYSQL_YYABORT; + } +#line 45547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2195: /* show_param: EVENTS_SYM opt_db wild_and_where */ +#line 13673 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_EVENTS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_EVENTS)) + MYSQL_YYABORT; + } +#line 45559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2196: /* show_param: TABLE_SYM STATUS_SYM opt_db wild_and_where */ +#line 13681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_TABLE_STATUS; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_TABLES)) + MYSQL_YYABORT; + } +#line 45571 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2197: /* show_param: OPEN_SYM TABLES opt_db wild_and_where */ +#line 13689 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; + lex->first_select_lex()->db= (yyvsp[-1].lex_str); + if (prepare_schema_table(thd, lex, 0, SCH_OPEN_TABLES)) + MYSQL_YYABORT; + } +#line 45583 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2198: /* show_param: PLUGINS_SYM */ +#line 13697 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PLUGINS))) + MYSQL_YYABORT; + } +#line 45594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2199: /* show_param: PLUGINS_SYM SONAME_SYM TEXT_STRING_sys */ +#line 13704 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->ident= (yyvsp[0].lex_str); + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 45605 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2200: /* show_param: PLUGINS_SYM SONAME_SYM wild_and_where */ +#line 13711 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PLUGINS; + if (unlikely(prepare_schema_table(thd, Lex, 0, SCH_ALL_PLUGINS))) + MYSQL_YYABORT; + } +#line 45615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2201: /* show_param: ENGINE_SYM known_storage_engines show_engine_param */ +#line 13717 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= (yyvsp[-1].db_type); } +#line 45621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2202: /* show_param: ENGINE_SYM ALL show_engine_param */ +#line 13719 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->create_info.db_type= NULL; } +#line 45627 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2203: /* show_param: opt_full COLUMNS from_or_in table_ident opt_db wild_and_where */ +#line 13721 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_FIELDS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 45640 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2204: /* show_param: master_or_binary LOGS_SYM */ +#line 13730 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOGS; + } +#line 45648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2205: /* show_param: SLAVE HOSTS_SYM */ +#line 13734 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_SLAVE_HOSTS; + } +#line 45656 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2206: /* $@200: %empty */ +#line 13738 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_BINLOG_EVENTS; + } +#line 45665 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2208: /* $@201: %empty */ +#line 13744 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_RELAYLOG_EVENTS; + } +#line 45674 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2209: /* show_param: RELAYLOG_SYM optional_connection_name EVENTS_SYM binlog_in binlog_from $@201 opt_global_limit_clause optional_for_channel */ +#line 13749 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 45680 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2210: /* show_param: keys_or_index from_or_in table_ident opt_db opt_where_clause */ +#line 13751 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_KEYS; + if ((yyvsp[-1].lex_str).str) + (yyvsp[-2].table)->change_db(&(yyvsp[-1].lex_str)); + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[-2].table), SCH_STATISTICS))) + MYSQL_YYABORT; + } +#line 45693 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2211: /* show_param: opt_storage ENGINES_SYM */ +#line 13760 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_ENGINES))) + MYSQL_YYABORT; + } +#line 45704 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2212: /* show_param: AUTHORS_SYM */ +#line 13767 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_AUTHORS; + } +#line 45713 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2213: /* show_param: CONTRIBUTORS_SYM */ +#line 13772 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_CONTRIBUTORS; + } +#line 45722 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2214: /* show_param: PRIVILEGES */ +#line 13777 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_PRIVILEGES; + } +#line 45731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2215: /* show_param: COUNT_SYM '(' '*' ')' WARNINGS */ +#line 13782 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("warning_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 45740 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2216: /* show_param: COUNT_SYM '(' '*' ')' ERRORS */ +#line 13787 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING var= {STRING_WITH_LEN("error_count")}; + (void) create_select_for_variable(thd, &var); + } +#line 45749 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2217: /* show_param: WARNINGS opt_global_limit_clause */ +#line 13792 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_WARNS;} +#line 45755 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2218: /* show_param: ERRORS opt_global_limit_clause */ +#line 13794 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_ERRORS;} +#line 45761 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2219: /* show_param: PROFILES_SYM */ +#line 13796 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command = SQLCOM_SHOW_PROFILES; } +#line 45767 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2220: /* show_param: PROFILE_SYM opt_profile_defs opt_profile_args opt_global_limit_clause */ +#line 13798 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_PROFILE; + if (unlikely(prepare_schema_table(thd, lex, NULL, SCH_PROFILES))) + MYSQL_YYABORT; + } +#line 45778 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2221: /* show_param: opt_var_type STATUS_SYM wild_and_where */ +#line 13805 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_STATUS))) + MYSQL_YYABORT; + } +#line 45790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2222: /* show_param: opt_full PROCESSLIST_SYM */ +#line 13813 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} +#line 45796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2223: /* show_param: opt_var_type VARIABLES wild_and_where */ +#line 13815 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_VARIABLES; + lex->option_type= (yyvsp[-2].var_type); + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_SESSION_VARIABLES))) + MYSQL_YYABORT; + } +#line 45808 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2224: /* show_param: charset wild_and_where */ +#line 13823 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CHARSETS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_CHARSETS))) + MYSQL_YYABORT; + } +#line 45819 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2225: /* show_param: COLLATION_SYM wild_and_where */ +#line 13830 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_COLLATIONS; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_COLLATIONS))) + MYSQL_YYABORT; + } +#line 45830 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2226: /* show_param: GRANTS */ +#line 13837 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_GRANTS; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user_and_current_role; + } +#line 45842 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2227: /* show_param: GRANTS FOR_SYM user_or_role clear_privileges */ +#line 13845 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SHOW_GRANTS; + lex->grant_user=(yyvsp[-1].lex_user); + } +#line 45852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2228: /* show_param: CREATE DATABASE opt_if_not_exists ident */ +#line 13851 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->set_command(SQLCOM_SHOW_CREATE_DB, (yyvsp[-1].object_ddl_options)); + Lex->name= (yyvsp[0].ident_sys); + } +#line 45861 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2229: /* show_param: CREATE TABLE_SYM table_ident */ +#line 13856 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL,0)) + MYSQL_YYABORT; + lex->create_info.storage_media= HA_SM_DEFAULT; + } +#line 45873 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2230: /* show_param: CREATE VIEW_SYM table_ident */ +#line 13864 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_VIEW; + } +#line 45885 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2231: /* show_param: CREATE SEQUENCE_SYM table_ident */ +#line 13872 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE; + if (!lex->first_select_lex()->add_table_to_list(thd, (yyvsp[0].table), NULL, 0)) + MYSQL_YYABORT; + lex->table_type= TABLE_TYPE_SEQUENCE; + } +#line 45897 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2232: /* show_param: BINLOG_SYM STATUS_SYM */ +#line 13880 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 45905 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2233: /* show_param: MASTER_SYM STATUS_SYM */ +#line 13884 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_SHOW_BINLOG_STAT; + } +#line 45913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2234: /* show_param: ALL SLAVES STATUS_SYM */ +#line 13888 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status(true))) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 45924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2235: /* show_param: SLAVE optional_connection_name STATUS_SYM optional_for_channel */ +#line 13895 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(Lex->m_sql_cmd= new (thd->mem_root) + Sql_cmd_show_slave_status())) + MYSQL_YYABORT; + Lex->sql_command = SQLCOM_SHOW_SLAVE_STAT; + } +#line 45935 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2236: /* show_param: CREATE PROCEDURE_SYM sp_name */ +#line 13902 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_PROC; + lex->spname= (yyvsp[0].spname); + } +#line 45946 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2237: /* show_param: CREATE FUNCTION_SYM sp_name */ +#line 13909 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + lex->sql_command = SQLCOM_SHOW_CREATE_FUNC; + lex->spname= (yyvsp[0].spname); + } +#line 45957 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2238: /* show_param: CREATE PACKAGE_MARIADB_SYM sp_name */ +#line 13916 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 45967 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2239: /* show_param: CREATE PACKAGE_ORACLE_SYM sp_name */ +#line 13922 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE; + lex->spname= (yyvsp[0].spname); + } +#line 45977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2240: /* show_param: CREATE PACKAGE_MARIADB_SYM BODY_MARIADB_SYM sp_name */ +#line 13928 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 45987 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2241: /* show_param: CREATE PACKAGE_ORACLE_SYM BODY_ORACLE_SYM sp_name */ +#line 13934 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command = SQLCOM_SHOW_CREATE_PACKAGE_BODY; + lex->spname= (yyvsp[0].spname); + } +#line 45997 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2242: /* show_param: CREATE TRIGGER_SYM sp_name */ +#line 13940 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_CREATE_TRIGGER; + lex->spname= (yyvsp[0].spname); + } +#line 46007 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2243: /* show_param: CREATE USER_SYM */ +#line 13946 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + if (unlikely(!(Lex->grant_user= + (LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + Lex->grant_user->user= current_user; + } +#line 46019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2244: /* show_param: CREATE USER_SYM user */ +#line 13954 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_CREATE_USER; + Lex->grant_user= (yyvsp[0].lex_user); + } +#line 46028 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2245: /* show_param: PROCEDURE_SYM STATUS_SYM wild_and_where */ +#line 13959 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PROC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46039 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2246: /* show_param: FUNCTION_SYM STATUS_SYM wild_and_where */ +#line 13966 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_FUNC; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46050 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2247: /* show_param: PACKAGE_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13973 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2248: /* show_param: PACKAGE_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13980 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2249: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM STATUS_SYM wild_and_where */ +#line 13987 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2250: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM STATUS_SYM wild_and_where */ +#line 13994 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SHOW_STATUS_PACKAGE_BODY; + if (unlikely(prepare_schema_table(thd, lex, 0, SCH_PROCEDURES))) + MYSQL_YYABORT; + } +#line 46094 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2251: /* show_param: PROCEDURE_SYM CODE_SYM sp_name */ +#line 14001 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PROC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46103 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2252: /* show_param: FUNCTION_SYM CODE_SYM sp_name */ +#line 14006 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_FUNC_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46112 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2253: /* show_param: PACKAGE_MARIADB_SYM BODY_MARIADB_SYM CODE_SYM sp_name */ +#line 14011 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46121 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2254: /* show_param: PACKAGE_ORACLE_SYM BODY_ORACLE_SYM CODE_SYM sp_name */ +#line 14016 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_PACKAGE_BODY_CODE; + Lex->spname= (yyvsp[0].spname); + } +#line 46130 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2255: /* show_param: CREATE EVENT_SYM sp_name */ +#line 14021 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->spname= (yyvsp[0].spname); + Lex->sql_command = SQLCOM_SHOW_CREATE_EVENT; + } +#line 46139 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2256: /* show_param: describe_command opt_format_json FOR_SYM expr */ +#line 14030 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46151 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2257: /* show_param: ANALYZE_SYM opt_format_json FOR_SYM expr */ +#line 14038 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_SHOW_ANALYZE; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_ANALYZE_JSON : SCH_ANALYZE_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46163 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2258: /* show_param: IDENT_sys remember_tok_start wild_and_where */ +#line 14046 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + bool in_plugin; + lex->sql_command= SQLCOM_SHOW_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-2].ident_sys), &in_plugin); + if (unlikely(!table || !table->old_format || !in_plugin)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-1].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(lex->wild && table->idx_field1 < 0)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(make_schema_select(thd, Lex->current_select, table))) + MYSQL_YYABORT; + } +#line 46186 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2259: /* show_engine_param: STATUS_SYM */ +#line 14068 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_STATUS; } +#line 46192 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2260: /* show_engine_param: MUTEX_SYM */ +#line 14070 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_MUTEX; } +#line 46198 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2261: /* show_engine_param: LOGS_SYM */ +#line 14072 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHOW_ENGINE_LOGS; } +#line 46204 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2266: /* opt_db: %empty */ +#line 14086 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 46210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2267: /* opt_db: from_or_in ident */ +#line 14087 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 46216 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2268: /* opt_full: %empty */ +#line 14091 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=0; } +#line 46222 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2269: /* opt_full: FULL */ +#line 14092 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->verbose=1; } +#line 46228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2272: /* binlog_in: %empty */ +#line 14101 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = 0; } +#line 46234 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2273: /* binlog_in: IN_SYM TEXT_STRING_sys */ +#line 14102 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.log_file_name = (yyvsp[0].lex_str).str; } +#line 46240 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2274: /* binlog_from: %empty */ +#line 14106 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = 4; /* skip magic number */ } +#line 46246 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2275: /* binlog_from: FROM ulonglong_num */ +#line 14107 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->mi.pos = (yyvsp[0].ulonglong_number); } +#line 46252 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2276: /* wild_and_where: %empty */ +#line 14111 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.simple_string)= 0; } +#line 46258 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2277: /* wild_and_where: LIKE remember_tok_start TEXT_STRING_sys */ +#line 14113 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 46271 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2278: /* wild_and_where: WHERE remember_tok_start expr */ +#line 14122 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->where= normalize_cond(thd, (yyvsp[0].item)); + if ((yyvsp[0].item)) + (yyvsp[0].item)->top_level_item(); + (yyval.simple_string)= (yyvsp[-1].simple_string); + } +#line 46282 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2279: /* $@202: %empty */ +#line 14133 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->sql_command= SQLCOM_SHOW_FIELDS; + lex->first_select_lex()->db= null_clex_str; + lex->verbose= 0; + if (unlikely(prepare_schema_table(thd, lex, (yyvsp[0].table), SCH_COLUMNS))) + MYSQL_YYABORT; + } +#line 46299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2280: /* describe: describe_command table_ident $@202 opt_describe_column */ +#line 14146 "/home/buildbot/git/sql/sql_yacc.yy" + { + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + } +#line 46308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2281: /* $@203: %empty */ +#line 14151 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_NORMAL; } +#line 46314 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2282: /* describe: describe_command opt_extended_describe $@203 explainable_command */ +#line 14153 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->first_select_lex()->options|= SELECT_DESCRIBE; + } +#line 46323 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2291: /* analyze_stmt_command: ANALYZE_SYM opt_format_json explainable_command */ +#line 14175 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->analyze_stmt= true; + } +#line 46331 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2292: /* opt_extended_describe: EXTENDED_SYM */ +#line 14181 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED; } +#line 46337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2293: /* opt_extended_describe: EXTENDED_SYM ALL */ +#line 14183 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_EXTENDED | DESCRIBE_EXTENDED2; } +#line 46343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2294: /* opt_extended_describe: PARTITIONS_SYM */ +#line 14184 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->describe|= DESCRIBE_PARTITIONS; } +#line 46349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2295: /* opt_extended_describe: opt_format_json */ +#line 14185 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2296: /* opt_format_json: %empty */ +#line 14189 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46361 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2297: /* opt_format_json: FORMAT_SYM '=' ident_or_text */ +#line 14191 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("JSON"))) + Lex->explain_json= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("TRADITIONAL"))) + DBUG_ASSERT(Lex->explain_json==false); + else + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "EXPLAIN/ANALYZE", (yyvsp[0].lex_str).str)); + } +#line 46375 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2298: /* opt_describe_column: %empty */ +#line 14203 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46381 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2299: /* opt_describe_column: text_string */ +#line 14204 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->wild= (yyvsp[0].string); } +#line 46387 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2300: /* opt_describe_column: ident */ +#line 14206 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->wild= new (thd->mem_root) String((const char*) (yyvsp[0].ident_sys).str, + (yyvsp[0].ident_sys).length, + system_charset_info); + if (unlikely(Lex->wild == NULL)) + MYSQL_YYABORT; + } +#line 46399 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2301: /* explain_for_connection: describe_command opt_format_json FOR_SYM CONNECTION_SYM expr */ +#line 14222 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->wild=0; + lex->ident= null_clex_str; + if (Lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + lex->current_select->parsing_place= SELECT_LIST; + lex->create_info.init(); + Select->parsing_place= NO_MATTER; + Lex->pop_select(); //main select + Lex->sql_command= SQLCOM_SHOW_EXPLAIN; + if (unlikely(prepare_schema_table(thd, Lex, 0, + Lex->explain_json ? SCH_EXPLAIN_JSON : SCH_EXPLAIN_TABULAR))) + MYSQL_YYABORT; + add_value_to_list(thd, (yyvsp[0].item)); + } +#line 46421 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2302: /* $@204: %empty */ +#line 14245 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_FLUSH; + lex->type= 0; + lex->no_write_to_binlog= (yyvsp[0].num); + } +#line 46432 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2303: /* flush: FLUSH_SYM opt_no_write_to_binlog $@204 flush_options */ +#line 14251 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46438 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2304: /* $@205: %empty */ +#line 14256 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_TABLES; + /* + Set type of metadata and table locks for + FLUSH TABLES table_list [WITH READ LOCK]. + */ + YYPS->m_lock_type= TL_READ_NO_INSERT; + YYPS->m_mdl_type= MDL_SHARED_HIGH_PRIO; + } +#line 46452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2305: /* flush_options: table_or_tables $@205 opt_table_list opt_flush_lock */ +#line 14266 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2306: /* flush_options: flush_options_list */ +#line 14268 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2307: /* opt_flush_lock: %empty */ +#line 14272 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2308: /* opt_flush_lock: flush_lock */ +#line 14274 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *tables= Lex->query_tables; + for (; tables; tables= tables->next_global) + { + tables->mdl_request.set_type(MDL_SHARED_NO_WRITE); + /* Ignore temporary tables. */ + tables->open_type= OT_BASE_ONLY; + } + } +#line 46484 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2309: /* flush_lock: WITH READ_SYM LOCK_SYM optional_flush_tables_arguments */ +#line 14287 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_READ_LOCK | (yyvsp[0].num); } +#line 46490 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2310: /* $@206: %empty */ +#line 14289 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->query_tables == NULL)) + { + // Table list can't be empty + thd->parse_error(ER_NO_TABLES_USED); + MYSQL_YYABORT; + } + Lex->type|= REFRESH_FOR_EXPORT; + } +#line 46504 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2311: /* flush_lock: FOR_SYM $@206 EXPORT_SYM */ +#line 14297 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46510 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2313: /* flush_options_list: flush_option */ +#line 14303 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46516 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2314: /* flush_option: ERROR_SYM LOGS_SYM */ +#line 14308 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ERROR_LOG; } +#line 46522 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2315: /* flush_option: ENGINE_SYM LOGS_SYM */ +#line 14310 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_ENGINE_LOG; } +#line 46528 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2316: /* flush_option: GENERAL LOGS_SYM */ +#line 14312 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GENERAL_LOG; } +#line 46534 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2317: /* flush_option: SLOW LOGS_SYM */ +#line 14314 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLOW_LOG; } +#line 46540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2318: /* flush_option: BINARY LOGS_SYM opt_delete_gtid_domain */ +#line 14316 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_BINARY_LOG; } +#line 46546 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2319: /* flush_option: RELAY LOGS_SYM optional_connection_name optional_for_channel */ +#line 14318 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_RELAY_LOG)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH", "RELAY LOGS")); + lex->type|= REFRESH_RELAY_LOG; + lex->relay_log_connection_name= lex->mi.connection_name; + } +#line 46558 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2320: /* flush_option: QUERY_SYM CACHE_SYM */ +#line 14326 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE_FREE; } +#line 46564 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2321: /* flush_option: HOSTS_SYM */ +#line 14328 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_HOSTS; } +#line 46570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2322: /* flush_option: PRIVILEGES */ +#line 14330 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_GRANT; } +#line 46576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2323: /* flush_option: LOGS_SYM */ +#line 14332 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_LOG; + Lex->relay_log_connection_name= empty_clex_str; + } +#line 46585 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2324: /* flush_option: STATUS_SYM */ +#line 14337 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_STATUS; } +#line 46591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2325: /* flush_option: SLAVE optional_connection_name */ +#line 14339 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->type & REFRESH_SLAVE)) + my_yyabort_error((ER_WRONG_USAGE, MYF(0), "FLUSH","SLAVE")); + lex->type|= REFRESH_SLAVE; + lex->reset_slave_info.all= false; + } +#line 46603 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2326: /* flush_option: MASTER_SYM */ +#line 14347 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_MASTER; } +#line 46609 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2327: /* flush_option: DES_KEY_FILE */ +#line 14349 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_DES_KEY_FILE; } +#line 46615 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2328: /* flush_option: RESOURCES */ +#line 14351 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_USER_RESOURCES; } +#line 46621 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2329: /* flush_option: SSL_SYM */ +#line 14353 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SSL;} +#line 46627 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2330: /* flush_option: THREADS_SYM */ +#line 14355 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_THREADS;} +#line 46633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2331: /* flush_option: IDENT_sys remember_tok_start */ +#line 14357 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_GENERIC; + ST_SCHEMA_TABLE *table= find_schema_table(thd, &(yyvsp[-1].ident_sys)); + if (unlikely(!table || !table->reset_table)) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].simple_string)); + MYSQL_YYABORT; + } + if (unlikely(Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[-1].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root))) + MYSQL_YYABORT; + } +#line 46651 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2332: /* opt_table_list: %empty */ +#line 14373 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46657 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2333: /* opt_table_list: table_list */ +#line 14374 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46663 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2334: /* backup: BACKUP_SYM backup_statements */ +#line 14378 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46669 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2335: /* backup_statements: STAGE_SYM ident */ +#line 14383 "/home/buildbot/git/sql/sql_yacc.yy" + { + int type; + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP STAGE")); + if ((type= find_type((yyvsp[0].ident_sys).str, &backup_stage_names, + FIND_TYPE_NO_PREFIX)) <= 0) + my_yyabort_error((ER_BACKUP_UNKNOWN_STAGE, MYF(0), (yyvsp[0].ident_sys).str)); + Lex->sql_command= SQLCOM_BACKUP; + Lex->backup_stage= (backup_stages) (type-1); + break; + } +#line 46685 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2336: /* $@207: %empty */ +#line 14395 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP LOCK")); + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 46696 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2337: /* backup_statements: LOCK_SYM $@207 table_ident */ +#line 14402 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[0].table), NULL, 0, + TL_READ, MDL_SHARED_HIGH_PRIO))) + MYSQL_YYABORT; + Lex->sql_command= SQLCOM_BACKUP_LOCK; + Lex->pop_select(); //main select + } +#line 46708 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2338: /* backup_statements: UNLOCK_SYM */ +#line 14410 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "BACKUP UNLOCK")); + /* Table list is empty for unlock */ + Lex->sql_command= SQLCOM_BACKUP_LOCK; + } +#line 46719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2339: /* opt_delete_gtid_domain: %empty */ +#line 14419 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2340: /* opt_delete_gtid_domain: DELETE_DOMAIN_ID_SYM '=' '(' delete_domain_id_list ')' */ +#line 14421 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46731 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2344: /* delete_domain_id: ulonglong_num */ +#line 14431 "/home/buildbot/git/sql/sql_yacc.yy" + { + uint32 value= (uint32) (yyvsp[0].ulonglong_number); + if ((yyvsp[0].ulonglong_number) > UINT_MAX32) + { + my_printf_error(ER_BINLOG_CANT_DELETE_GTID_DOMAIN, + "The value of gtid domain being deleted ('%llu') " + "exceeds its maximum size " + "of 32 bit unsigned integer", MYF(0), (yyvsp[0].ulonglong_number)); + MYSQL_YYABORT; + } + insert_dynamic(&Lex->delete_gtid_domain, (uchar*) &value); + } +#line 46748 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2345: /* optional_flush_tables_arguments: %empty */ +#line 14446 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= 0;} +#line 46754 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2346: /* optional_flush_tables_arguments: AND_SYM DISABLE_SYM CHECKPOINT_SYM */ +#line 14447 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.num)= REFRESH_CHECKPOINT; } +#line 46760 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2347: /* $@208: %empty */ +#line 14452 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RESET; lex->type=0; + } +#line 46769 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2348: /* reset: RESET_SYM $@208 reset_options */ +#line 14457 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46775 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2351: /* $@209: %empty */ +#line 14466 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_SLAVE; } +#line 46781 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2352: /* reset_option: SLAVE $@209 optional_connection_name slave_reset_options optional_for_channel */ +#line 14469 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46787 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2353: /* $@210: %empty */ +#line 14471 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->type|= REFRESH_MASTER; + Lex->next_binlog_file_number= 0; + } +#line 46796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2355: /* reset_option: QUERY_SYM CACHE_SYM */ +#line 14476 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->type|= REFRESH_QUERY_CACHE;} +#line 46802 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2356: /* slave_reset_options: %empty */ +#line 14480 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= false; } +#line 46808 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2357: /* slave_reset_options: ALL */ +#line 14481 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->reset_slave_info.all= true; } +#line 46814 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2358: /* master_reset_options: %empty */ +#line 14485 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46820 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2359: /* master_reset_options: TO_SYM ulong_num */ +#line 14487 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->next_binlog_file_number = (yyvsp[0].ulong_num); + } +#line 46828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2360: /* purge: PURGE master_or_binary LOGS_SYM TO_SYM TEXT_STRING_sys */ +#line 14494 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_purge_to((yyvsp[0].lex_str)); + } +#line 46836 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2361: /* $@211: %empty */ +#line 14498 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->clause_that_disallows_subselect= "PURGE..BEFORE"; } +#line 46842 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2362: /* purge: PURGE master_or_binary LOGS_SYM BEFORE_SYM $@211 expr */ +#line 14500 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->clause_that_disallows_subselect= NULL; + if (Lex->stmt_purge_before((yyvsp[0].item))) + MYSQL_YYABORT; + } +#line 46852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2363: /* $@212: %empty */ +#line 14512 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->value_list.empty(); + lex->users_list.empty(); + lex->sql_command= SQLCOM_KILL; + lex->kill_type= KILL_TYPE_ID; + } +#line 46864 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2364: /* kill: KILL_SYM $@212 kill_type kill_option */ +#line 14520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->kill_signal= (killed_state) ((yyvsp[-1].num) | (yyvsp[0].num)); + } +#line 46872 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2365: /* kill_type: %empty */ +#line 14526 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 46878 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2366: /* kill_type: HARD_SYM */ +#line 14527 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_HARD_BIT; } +#line 46884 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2367: /* kill_type: SOFT_SYM */ +#line 14528 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 46890 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2368: /* kill_option: opt_connection kill_expr */ +#line 14532 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_CONNECTION; } +#line 46896 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2369: /* kill_option: QUERY_SYM kill_expr */ +#line 14533 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (int) KILL_QUERY; } +#line 46902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2370: /* kill_option: QUERY_SYM ID_SYM expr */ +#line 14535 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (int) KILL_QUERY; + Lex->kill_type= KILL_TYPE_QUERY; + Lex->value_list.push_front((yyvsp[0].item), thd->mem_root); + } +#line 46912 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2371: /* opt_connection: %empty */ +#line 14543 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46918 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2372: /* opt_connection: CONNECTION_SYM */ +#line 14544 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 46924 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2373: /* kill_expr: expr */ +#line 14549 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->value_list.push_front((yyval.item), thd->mem_root); + } +#line 46932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2374: /* kill_expr: USER_SYM user */ +#line 14553 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root); + Lex->kill_type= KILL_TYPE_USER; + } +#line 46941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2375: /* $@213: %empty */ +#line 14560 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sql_command= SQLCOM_SHUTDOWN; } +#line 46947 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2376: /* shutdown: SHUTDOWN $@213 shutdown_option */ +#line 14561 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 46953 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2377: /* shutdown_option: %empty */ +#line 14565 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->is_shutdown_wait_for_slaves= false; } +#line 46959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2378: /* shutdown_option: WAIT_SYM FOR_SYM ALL SLAVES */ +#line 14567 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->is_shutdown_wait_for_slaves= true; + } +#line 46967 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2379: /* use: USE_SYM ident */ +#line 14576 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_CHANGE_DB; + lex->first_select_lex()->db= (yyvsp[0].ident_sys); + } +#line 46977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2380: /* $@214: %empty */ +#line 14587 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + + if (unlikely(lex->sphead)) + { + my_error(ER_SP_BADSTATEMENT, MYF(0), + (yyvsp[0].filetype) == FILETYPE_CSV ? "LOAD DATA" : "LOAD XML"); + MYSQL_YYABORT; + } + if (lex->main_select_push()) + MYSQL_YYABORT; + lex->init_select(); + } +#line 46995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2381: /* $@215: %empty */ +#line 14601 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_LOAD; + lex->local_file= (yyvsp[-2].num); + lex->duplicates= DUP_ERROR; + lex->ignore= 0; + if (unlikely(!(lex->exchange= new (thd->mem_root) + sql_exchange((yyvsp[0].lex_str).str, 0, (yyvsp[-5].filetype))))) + MYSQL_YYABORT; + } +#line 47010 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2382: /* $@216: %empty */ +#line 14612 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (unlikely(!Select->add_table_to_list(thd, (yyvsp[-1].table), NULL, + TL_OPTION_UPDATING, + (yyvsp[-9].lock_type), MDL_SHARED_WRITE, + NULL, (yyvsp[0].string_list)))) + MYSQL_YYABORT; + lex->field_list.empty(); + lex->update_list.empty(); + lex->value_list.empty(); + lex->many_values.empty(); + } +#line 47027 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2383: /* $@217: %empty */ +#line 14625 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->cs= (yyvsp[0].charset); } +#line 47033 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2384: /* load: LOAD data_or_xml $@214 load_data_lock opt_local INFILE TEXT_STRING_filesystem $@215 opt_duplicate INTO TABLE_SYM table_ident opt_use_partition $@216 opt_load_data_charset $@217 opt_xml_rows_identified_by opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec opt_load_data_set_spec stmt_end */ +#line 14630 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->mark_first_table_as_inserting(); + } +#line 47041 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2385: /* data_or_xml: DATA_SYM */ +#line 14636 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_CSV; } +#line 47047 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2386: /* data_or_xml: XML_SYM */ +#line 14637 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.filetype)= FILETYPE_XML; } +#line 47053 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2387: /* opt_local: %empty */ +#line 14641 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0;} +#line 47059 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2388: /* opt_local: LOCAL_SYM */ +#line 14642 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1;} +#line 47065 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2389: /* load_data_lock: %empty */ +#line 14646 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_DEFAULT; } +#line 47071 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2390: /* load_data_lock: CONCURRENT */ +#line 14648 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + Ignore this option in SP to avoid problem with query cache and + triggers with non default priority locks + */ + (yyval.lock_type)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 47083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2391: /* load_data_lock: LOW_PRIORITY */ +#line 14655 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lock_type)= TL_WRITE_LOW_PRIORITY; } +#line 47089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2392: /* opt_duplicate: %empty */ +#line 14659 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_ERROR; } +#line 47095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2393: /* opt_duplicate: REPLACE */ +#line 14660 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->duplicates=DUP_REPLACE; } +#line 47101 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2394: /* opt_duplicate: IGNORE_SYM */ +#line 14661 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ignore= 1; } +#line 47107 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2399: /* field_term: TERMINATED BY text_string */ +#line 14676 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->field_term= (yyvsp[0].string); + } +#line 47116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2400: /* field_term: OPTIONALLY ENCLOSED BY text_string */ +#line 14681 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + DBUG_ASSERT(lex->exchange != 0); + lex->exchange->enclosed= (yyvsp[0].string); + lex->exchange->opt_enclosed= 1; + } +#line 47127 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2401: /* field_term: ENCLOSED BY text_string */ +#line 14688 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->enclosed= (yyvsp[0].string); + } +#line 47136 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2402: /* field_term: ESCAPED BY text_string */ +#line 14693 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->escaped= (yyvsp[0].string); + } +#line 47145 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2407: /* line_term: TERMINATED BY text_string */ +#line 14711 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_term= (yyvsp[0].string); + } +#line 47154 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2408: /* line_term: STARTING BY text_string */ +#line 14716 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->line_start= (yyvsp[0].string); + } +#line 47163 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2409: /* opt_xml_rows_identified_by: %empty */ +#line 14723 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47169 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2410: /* opt_xml_rows_identified_by: ROWS_SYM IDENTIFIED_SYM BY text_string */ +#line 14725 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->exchange->line_term = (yyvsp[0].string); } +#line 47175 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2412: /* opt_ignore_lines: IGNORE_SYM NUM lines_or_rows */ +#line 14731 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT(Lex->exchange != 0); + Lex->exchange->skip_lines= atol((yyvsp[-1].lex_str).str); + } +#line 47184 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2413: /* lines_or_rows: LINES */ +#line 14738 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47190 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2414: /* lines_or_rows: ROWS_SYM */ +#line 14739 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 47196 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2415: /* opt_field_or_var_spec: %empty */ +#line 14743 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47202 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2416: /* opt_field_or_var_spec: '(' fields_or_vars ')' */ +#line 14744 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47208 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2417: /* opt_field_or_var_spec: '(' ')' */ +#line 14745 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47214 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2418: /* fields_or_vars: fields_or_vars ',' field_or_var */ +#line 14750 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47220 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2419: /* fields_or_vars: field_or_var */ +#line 14752 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->field_list.push_back((yyvsp[0].item), thd->mem_root); } +#line 47226 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2420: /* field_or_var: simple_ident_nospvar */ +#line 14756 "/home/buildbot/git/sql/sql_yacc.yy" + {(yyval.item)= (yyvsp[0].item);} +#line 47232 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2421: /* field_or_var: '@' ident_or_text */ +#line 14758 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[0].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + (yyval.item)= new (thd->mem_root) Item_user_var_as_out_param(thd, &(yyvsp[0].lex_str)); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47248 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2422: /* opt_load_data_set_spec: %empty */ +#line 14772 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47254 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2423: /* opt_load_data_set_spec: SET load_data_set_list */ +#line 14773 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 47260 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2426: /* load_data_set_elem: simple_ident_nospvar equal remember_name expr_or_ignore_or_default remember_end */ +#line 14783 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->update_list.push_back((yyvsp[-4].item), thd->mem_root)) || + unlikely(lex->value_list.push_back((yyvsp[-1].item), thd->mem_root))) + MYSQL_YYABORT; + (yyvsp[-1].item)->set_name_no_truncate(thd, (yyvsp[-2].simple_string), (uint) ((yyvsp[0].simple_string) - (yyvsp[-2].simple_string)), thd->charset()); + } +#line 47272 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2427: /* text_literal: TEXT_STRING */ +#line 14796 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 47281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2428: /* text_literal: NCHAR_STRING */ +#line 14801 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_nchar((yyvsp[0].lex_string_with_metadata))))) + MYSQL_YYABORT; + } +#line 47290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2429: /* text_literal: UNDERSCORE_CHARSET TEXT_STRING */ +#line 14806 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= thd->make_string_literal_charset((yyvsp[0].lex_string_with_metadata), (yyvsp[-1].charset))))) + MYSQL_YYABORT; + } +#line 47299 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2430: /* text_literal: text_literal TEXT_STRING_literal */ +#line 14811 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_basic_constant)= (yyvsp[-1].item_basic_constant)->make_string_literal_concat(thd, &(yyvsp[0].lex_str))))) + MYSQL_YYABORT; + } +#line 47308 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2431: /* text_string: TEXT_STRING_literal */ +#line 14819 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.string)= new (thd->mem_root) String((const char*) (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length, + thd->variables.collation_connection); + if (unlikely((yyval.string) == NULL)) + MYSQL_YYABORT; + } +#line 47320 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2432: /* text_string: hex_or_bin_String */ +#line 14826 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.string)= (yyvsp[0].string); } +#line 47326 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2433: /* hex_or_bin_String: HEX_NUM */ +#line 14832 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 47338 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2434: /* hex_or_bin_String: HEX_STRING */ +#line 14840 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + (yyval.string)= tmp->val_str((String*) 0); + } +#line 47350 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2435: /* hex_or_bin_String: BIN_NUM */ +#line 14848 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item *tmp= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, + (yyvsp[0].lex_str).length); + if (unlikely(tmp == NULL)) + MYSQL_YYABORT; + /* + it is OK only emulate fix_fields, because we need only + value of constant + */ + (yyval.string)= tmp->val_str((String*) 0); + } +#line 47366 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2436: /* param_marker: PARAM_MARKER */ +#line 14863 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, ¶m_clex_str, + YYLIP->get_tok_start(), + YYLIP->get_tok_start() + 1)))) + MYSQL_YYABORT; + } +#line 47377 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2437: /* param_marker: COLON_ORACLE_SYM ident_cli */ +#line 14870 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), (yyvsp[0].ident_cli).end())))) + MYSQL_YYABORT; + } +#line 47387 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2438: /* param_marker: COLON_ORACLE_SYM NUM */ +#line 14876 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item_param)= Lex->add_placeholder(thd, &null_clex_str, + (yyvsp[-1].kwd).pos(), + YYLIP->get_ptr())))) + MYSQL_YYABORT; + } +#line 47398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2439: /* signed_literal: '+' NUM_literal */ +#line 14885 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 47404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2440: /* signed_literal: '-' NUM_literal */ +#line 14887 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[0].item_num)->max_length++; + (yyval.item)= (yyvsp[0].item_num)->neg(thd); + } +#line 47413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2441: /* literal: text_literal */ +#line 14894 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_basic_constant); } +#line 47419 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2442: /* literal: NUM_literal */ +#line 14895 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item_num); } +#line 47425 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2443: /* literal: temporal_literal */ +#line 14896 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)= (yyvsp[0].item); } +#line 47431 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2444: /* literal: NULL_SYM */ +#line 14898 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + For the digest computation, in this context only, + NULL is considered a literal, hence reduced to '?' + REDUCE: + TOK_GENERIC_VALUE := NULL_SYM + */ + YYLIP->reduce_digest_token(TOK_GENERIC_VALUE, NULL_SYM); + (yyval.item)= new (thd->mem_root) Item_null(thd); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + YYLIP->next_state= MY_LEX_OPERATOR_OR_IDENT; + } +#line 47449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2445: /* literal: FALSE_SYM */ +#line 14912 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "FALSE",0); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47459 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2446: /* literal: TRUE_SYM */ +#line 14918 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bool(thd, (char*) "TRUE",1); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47469 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2447: /* literal: HEX_NUM */ +#line 14924 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_hybrid(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47479 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2448: /* literal: HEX_STRING */ +#line 14930 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_hex_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47489 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2449: /* literal: BIN_NUM */ +#line 14936 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)= new (thd->mem_root) Item_bin_string(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 47499 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2450: /* literal: UNDERSCORE_CHARSET hex_or_bin_String */ +#line 14942 "/home/buildbot/git/sql/sql_yacc.yy" + { + Item_string_with_introducer *item_str; + LEX_CSTRING tmp; + (yyvsp[0].string)->get_value(&tmp); + /* + Pass NULL as name. Name will be set in the "select_item" rule and + will include the introducer and the original hex/bin notation. + */ + item_str= new (thd->mem_root) + Item_string_with_introducer(thd, null_clex_str, + tmp, (yyvsp[-1].charset)); + if (unlikely(!item_str || + !item_str->check_well_formed_result(true))) + MYSQL_YYABORT; + + (yyval.item)= item_str; + } +#line 47521 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2451: /* NUM_literal: NUM */ +#line 14963 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 47535 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2452: /* NUM_literal: LONG_NUM */ +#line 14973 "/home/buildbot/git/sql/sql_yacc.yy" + { + int error; + (yyval.item_num)= new (thd->mem_root) + Item_int(thd, (yyvsp[0].lex_str).str, + (longlong) my_strtoll10((yyvsp[0].lex_str).str, NULL, &error), + (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 47549 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2453: /* NUM_literal: ULONGLONG_NUM */ +#line 14983 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_uint(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL)) + MYSQL_YYABORT; + } +#line 47559 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2454: /* NUM_literal: DECIMAL_NUM */ +#line 14989 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_decimal(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length, + thd->charset()); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 47570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2455: /* NUM_literal: FLOAT_NUM */ +#line 14996 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item_num)= new (thd->mem_root) Item_float(thd, (yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + if (unlikely((yyval.item_num) == NULL) || unlikely(thd->is_error())) + MYSQL_YYABORT; + } +#line 47580 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2456: /* temporal_literal: DATE_SYM TEXT_STRING */ +#line 15006 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_newdate.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 47591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2457: /* temporal_literal: TIME_SYM TEXT_STRING */ +#line 15013 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_time2.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 47602 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2458: /* temporal_literal: TIMESTAMP TEXT_STRING */ +#line 15020 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= type_handler_datetime.create_literal_item(thd, + (yyvsp[0].lex_string_with_metadata).str, (yyvsp[0].lex_string_with_metadata).length, + YYCSCL, true)))) + MYSQL_YYABORT; + } +#line 47613 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2459: /* $@218: %empty */ +#line 15030 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + With_clause *with_clause= + new With_clause((yyvsp[0].num), Lex->curr_with_clause); + if (unlikely(with_clause == NULL)) + MYSQL_YYABORT; + lex->derived_tables|= DERIVED_WITH; + lex->with_cte_resolution= true; + lex->curr_with_clause= with_clause; + with_clause->add_to_list(&lex->with_clauses_list, + lex->with_clauses_list_last_next); + if (lex->current_select && + lex->current_select->parsing_place == BEFORE_OPT_LIST) + lex->current_select->parsing_place= NO_MATTER; + } +#line 47633 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2460: /* with_clause: WITH opt_recursive $@218 with_list */ +#line 15046 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.with_clause)= Lex->curr_with_clause; + Lex->curr_with_clause= Lex->curr_with_clause->pop(); + } +#line 47642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2461: /* opt_recursive: %empty */ +#line 15054 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 47648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2462: /* opt_recursive: RECURSIVE_SYM */ +#line 15055 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 47654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2465: /* with_list_element: with_element_head opt_with_column_list AS '(' query_expression ')' opt_cycle */ +#line 15069 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + const char *query_start= lex->sphead ? lex->sphead->m_tmp_query + : thd->query(); + const char *spec_start= (yyvsp[-3].kwd).pos() + 1; + With_element *elem= new With_element((yyvsp[-6].with_element_head), *(yyvsp[-5].ident_sys_list), (yyvsp[-2].select_lex_unit)); + if (elem == NULL || Lex->curr_with_clause->add_with_element(elem)) + MYSQL_YYABORT; + if (elem->set_unparsed_spec(thd, spec_start, (yyvsp[-1].kwd).pos(), + spec_start - query_start)) + MYSQL_YYABORT; + if ((yyvsp[0].ident_sys_list)) + { + elem->set_cycle_list((yyvsp[0].ident_sys_list)); + } + elem->set_tables_end_pos(lex->query_tables_last); + } +#line 47676 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2466: /* opt_cycle: %empty */ +#line 15090 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= NULL; } +#line 47682 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2467: /* $@219: %empty */ +#line 15093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!Lex->curr_with_clause->with_recursive) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[0].kwd).pos()); + } + } +#line 47693 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2468: /* opt_cycle: CYCLE_SYM $@219 comma_separated_ident_list RESTRICT */ +#line 15100 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); + } +#line 47701 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2469: /* opt_with_column_list: %empty */ +#line 15108 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= new (thd->mem_root) List) == NULL) + MYSQL_YYABORT; + } +#line 47710 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2470: /* opt_with_column_list: '(' with_column_list ')' */ +#line 15113 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_sys_list)= (yyvsp[-1].ident_sys_list); } +#line 47716 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2472: /* ident_sys_alloc: ident_cli */ +#line 15122 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_ptr)= new (thd->mem_root) Lex_ident_sys(thd, &(yyvsp[0].ident_cli)); + } +#line 47724 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2473: /* comma_separated_ident_list: ident_sys_alloc */ +#line 15129 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.ident_sys_list)= new (thd->mem_root) List; + if (unlikely((yyval.ident_sys_list) == NULL || (yyval.ident_sys_list)->push_back((yyvsp[0].ident_sys_ptr)))) + MYSQL_YYABORT; + } +#line 47734 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2474: /* comma_separated_ident_list: comma_separated_ident_list ',' ident_sys_alloc */ +#line 15135 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.ident_sys_list)= (yyvsp[-2].ident_sys_list))->push_back((yyvsp[0].ident_sys_ptr))) + MYSQL_YYABORT; + } +#line 47743 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2475: /* with_element_head: ident */ +#line 15144 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING *name= + (LEX_CSTRING *) thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)); + (yyval.with_element_head)= new (thd->mem_root) With_element_head(name); + if (unlikely(name == NULL || (yyval.with_element_head) == NULL)) + MYSQL_YYABORT; + (yyval.with_element_head)->tables_pos.set_start_pos(Lex->query_tables_last); + } +#line 47756 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2476: /* insert_ident: simple_ident_nospvar */ +#line 15161 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 47762 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2477: /* insert_ident: table_wild */ +#line 15162 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 47768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2478: /* table_wild: ident '.' '*' */ +#line 15167 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 47777 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2479: /* table_wild: ident '.' ident '.' '*' */ +#line 15172 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys))))) + MYSQL_YYABORT; + } +#line 47786 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2480: /* select_sublist_qualified_asterisk: ident_cli '.' '*' */ +#line 15180 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 47795 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2481: /* select_sublist_qualified_asterisk: ident_cli '.' ident_cli '.' '*' */ +#line 15185 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_qualified_asterisk(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli))))) + MYSQL_YYABORT; + } +#line 47804 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2482: /* order_ident: expr */ +#line 15192 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 47810 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2483: /* simple_ident: ident_cli */ +#line 15198 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47819 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2484: /* simple_ident: ident_cli '.' ident_cli */ +#line 15203 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47828 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2485: /* simple_ident: '.' ident_cli '.' ident_cli */ +#line 15208 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_cli empty((yyvsp[-2].ident_cli).pos(), 0); + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &empty, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47838 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2486: /* simple_ident: ident_cli '.' ident_cli '.' ident_cli */ +#line 15214 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_cli), &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47847 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2487: /* simple_ident: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15219 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47856 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2488: /* simple_ident_nospvar: ident */ +#line 15227 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nosp(thd, &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47865 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2489: /* simple_ident_nospvar: ident '.' ident */ +#line 15232 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident_nospvar(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47874 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2490: /* simple_ident_nospvar: COLON_ORACLE_SYM ident_cli '.' ident_cli */ +#line 15237 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->make_item_colon_ident_ident(thd, &(yyvsp[-2].ident_cli), &(yyvsp[0].ident_cli))))) + MYSQL_YYABORT; + } +#line 47883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2491: /* simple_ident_nospvar: '.' ident '.' ident */ +#line 15242 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys none; + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &none, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2492: /* simple_ident_nospvar: ident '.' ident '.' ident */ +#line 15248 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.item)= Lex->create_item_ident(thd, &(yyvsp[-4].ident_sys), &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys))))) + MYSQL_YYABORT; + } +#line 47902 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2493: /* field_ident: ident */ +#line 15255 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 47908 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2494: /* field_ident: ident '.' ident '.' ident */ +#line 15257 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-4].ident_sys).str, + table->db.str))) + my_yyabort_error((ER_WRONG_DB_NAME, MYF(0), (yyvsp[-4].ident_sys).str)); + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->table_name.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 47923 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2495: /* field_ident: ident '.' ident */ +#line 15268 "/home/buildbot/git/sql/sql_yacc.yy" + { + TABLE_LIST *table= Select->table_list.first; + if (unlikely(my_strcasecmp(table_alias_charset, (yyvsp[-2].ident_sys).str, + table->alias.str))) + my_yyabort_error((ER_WRONG_TABLE_NAME, MYF(0), (yyvsp[-2].ident_sys).str)); + (yyval.lex_str)=(yyvsp[0].ident_sys); + } +#line 47935 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2496: /* field_ident: '.' ident */ +#line 15275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 47941 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2497: /* table_ident: ident */ +#line 15280 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2498: /* table_ident: ident '.' ident */ +#line 15286 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47961 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2499: /* table_ident: '.' ident */ +#line 15292 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* For Delphi */ + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[0].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47972 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2500: /* table_ident_opt_wild: ident opt_wild */ +#line 15302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(&(yyvsp[-1].ident_sys)); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47982 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2501: /* table_ident_opt_wild: ident '.' ident opt_wild */ +#line 15308 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.table)= new (thd->mem_root) Table_ident(thd, &(yyvsp[-3].ident_sys), &(yyvsp[-1].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 47992 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2502: /* table_ident_nodb: ident */ +#line 15317 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db= any_db; + (yyval.table)= new (thd->mem_root) Table_ident(thd, &db, &(yyvsp[0].ident_sys), 0); + if (unlikely((yyval.table) == NULL)) + MYSQL_YYABORT; + } +#line 48003 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2507: /* ident_cli: keyword_ident */ +#line 15333 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48009 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2508: /* IDENT_sys: IDENT_cli */ +#line 15338 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48018 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2511: /* ident_cli_func: keyword_func_sp_var_and_label */ +#line 15347 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48024 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2512: /* ident_cli_func: keyword_func_sp_var_not_label */ +#line 15348 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48030 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2513: /* ident_func: ident_cli_func */ +#line 15353 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->to_ident_sys_alloc(&(yyval.ident_sys), &(yyvsp[0].ident_cli)))) + MYSQL_YYABORT; + } +#line 48039 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2514: /* TEXT_STRING_sys: TEXT_STRING */ +#line 15362 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_sys(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48048 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2515: /* TEXT_STRING_literal: TEXT_STRING */ +#line 15370 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_connection(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48057 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2516: /* TEXT_STRING_filesystem: TEXT_STRING */ +#line 15378 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (thd->make_text_string_filesystem(&(yyval.lex_str), &(yyvsp[0].lex_string_with_metadata))) + MYSQL_YYABORT; + } +#line 48066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2518: /* ident_table_alias: keyword_table_alias */ +#line 15387 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48075 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2519: /* ident_cli_set_usual_case: IDENT_cli */ +#line 15394 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].ident_cli); } +#line 48081 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2520: /* ident_cli_set_usual_case: keyword_set_usual_case */ +#line 15395 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 48087 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2522: /* ident_sysvar_name: keyword_sysvar_name */ +#line 15401 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2523: /* ident_sysvar_name: TEXT_STRING_sys */ +#line 15406 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_sys(thd, &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 48105 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2525: /* ident: keyword_ident */ +#line 15416 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48114 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2527: /* label_ident: keyword_label */ +#line 15425 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 48123 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2528: /* ident_or_text: ident */ +#line 15432 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].ident_sys);} +#line 48129 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2529: /* ident_or_text: TEXT_STRING_sys */ +#line 15433 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48135 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2530: /* ident_or_text: LEX_HOSTNAME */ +#line 15434 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)=(yyvsp[0].lex_str);} +#line 48141 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2531: /* user_maybe_role: ident_or_text */ +#line 15439 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0))) + MYSQL_YYABORT; + } +#line 48156 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2532: /* user_maybe_role: ident_or_text '@' ident_or_text */ +#line 15450 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user = (yyvsp[-2].lex_str); (yyval.lex_user)->host=(yyvsp[0].lex_str); + + if (unlikely(check_string_char_length(&(yyval.lex_user)->user, ER_USERNAME, + username_char_length, + system_charset_info, 0)) || + unlikely(check_host_name(&(yyval.lex_user)->host))) + MYSQL_YYABORT; + if ((yyval.lex_user)->host.str[0]) + { + /* + Convert hostname part of username to lowercase. + It's OK to use in-place lowercase as long as + the character set is utf8. + */ + my_casedn_str(system_charset_info, (char*) (yyval.lex_user)->host.str); + } + else + { + /* + fix historical undocumented convention that empty host is the + same as '%' + */ + (yyval.lex_user)->host= host_not_specified; + } + } +#line 48189 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2533: /* user_maybe_role: CURRENT_USER optional_braces */ +#line 15479 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*)thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_user; + (yyval.lex_user)->auth= new (thd->mem_root) USER_AUTH(); + } +#line 48200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 2536: /* user: user_maybe_role */ +#line 15490 "/home/buildbot/git/sql/sql_yacc.yy" + { + if ((yyvsp[0].lex_user)->user.str != current_user.str && (yyvsp[0].lex_user)->host.str == 0) + (yyvsp[0].lex_user)->host= host_not_specified; + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 48210 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3262: /* $@220: %empty */ +#line 16359 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + } +#line 48219 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3263: /* set: SET $@220 set_param */ +#line 16364 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48228 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3266: /* $@221: %empty */ +#line 16374 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= OPT_DEFAULT; + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48238 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3267: /* set_param: TRANSACTION_SYM $@221 transaction_characteristics */ +#line 16380 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48247 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3268: /* $@222: %empty */ +#line 16385 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 48255 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3270: /* $@223: %empty */ +#line 16391 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->table_or_sp_used())) + my_yyabort_error((ER_SUBQUERIES_NOT_SUPPORTED, MYF(0), "SET STATEMENT")); + lex->stmt_var_list= lex->var_list; + lex->var_list.empty(); + if (Lex->check_main_unit_semantics()) + MYSQL_YYABORT; + } +#line 48269 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3276: /* $@224: %empty */ +#line 16418 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[0].kwd).pos())) + MYSQL_YYABORT; + } +#line 48278 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3277: /* start_option_value_list_following_option_type: TRANSACTION_SYM $@224 transaction_characteristics */ +#line 16423 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3280: /* $@225: %empty */ +#line 16438 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->option_type= (yyvsp[0].var_type); + } +#line 48295 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3283: /* option_type: GLOBAL_SYM */ +#line 16446 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 48301 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3284: /* option_type: LOCAL_SYM */ +#line 16447 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3285: /* option_type: SESSION_SYM */ +#line 16448 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48313 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3286: /* opt_var_type: %empty */ +#line 16452 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48319 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3287: /* opt_var_type: GLOBAL_SYM */ +#line 16453 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 48325 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3288: /* opt_var_type: LOCAL_SYM */ +#line 16454 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48331 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3289: /* opt_var_type: SESSION_SYM */ +#line 16455 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48337 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3290: /* opt_var_ident_type: %empty */ +#line 16459 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_DEFAULT; } +#line 48343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3291: /* opt_var_ident_type: GLOBAL_SYM '.' */ +#line 16460 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_GLOBAL; } +#line 48349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3292: /* opt_var_ident_type: LOCAL_SYM '.' */ +#line 16461 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3293: /* opt_var_ident_type: SESSION_SYM '.' */ +#line 16462 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.var_type)=OPT_SESSION; } +#line 48361 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3294: /* $@226: %empty */ +#line 16471 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 48370 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3295: /* set_stmt_option: ident_cli equal $@226 set_expr_or_default */ +#line 16476 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 48382 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3296: /* $@227: %empty */ +#line 16484 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 48391 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3297: /* set_stmt_option: ident_cli '.' ident equal $@227 set_expr_or_default */ +#line 16489 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, + &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 48404 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3298: /* $@228: %empty */ +#line 16498 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push(false)) + MYSQL_YYABORT; + } +#line 48413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3299: /* set_stmt_option: DEFAULT '.' ident equal $@228 set_expr_or_default */ +#line 16503 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, + &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + Lex->pop_select(); //min select + } +#line 48424 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3300: /* $@229: %empty */ +#line 16515 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48433 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3301: /* option_value_following_option_type: ident_cli equal $@229 set_expr_or_default */ +#line 16520 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(Lex->option_type, &tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48445 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3302: /* $@230: %empty */ +#line 16528 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48454 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3303: /* option_value_following_option_type: ident_cli '.' ident equal $@230 set_expr_or_default */ +#line 16533 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_system_variable(thd, Lex->option_type, &tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48466 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3304: /* $@231: %empty */ +#line 16541 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 48475 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3305: /* option_value_following_option_type: DEFAULT '.' ident equal $@231 set_expr_or_default */ +#line 16546 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48485 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3306: /* $@232: %empty */ +#line 16556 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48494 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3307: /* option_value_no_option_type: ident_cli_set_usual_case equal $@232 set_expr_or_default */ +#line 16561 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3308: /* $@233: %empty */ +#line 16569 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 48515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3309: /* option_value_no_option_type: ident_cli_set_usual_case '.' ident equal $@233 set_expr_or_default */ +#line 16574 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3310: /* $@234: %empty */ +#line 16582 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-3].kwd).pos())) + MYSQL_YYABORT; + } +#line 48536 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3311: /* option_value_no_option_type: DEFAULT '.' ident equal $@234 set_expr_or_default */ +#line 16587 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable(Lex->option_type, &(yyvsp[-3].ident_sys), (yyvsp[0].item)))) + MYSQL_YYABORT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3312: /* $@235: %empty */ +#line 16594 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!(yyvsp[-1].lex_str).length) + { + thd->parse_error(); + MYSQL_YYABORT; + } + + if (sp_create_assignment_lex(thd, (yyvsp[-2].lex_str).str)) + MYSQL_YYABORT; + } +#line 48562 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3313: /* option_value_no_option_type: '@' ident_or_text equal $@235 expr */ +#line 16605 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_user_variable(thd, &(yyvsp[-3].lex_str), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48572 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3314: /* $@236: %empty */ +#line 16611 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].lex_str).str)) + MYSQL_YYABORT; + } +#line 48581 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3315: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name equal $@236 set_expr_or_default */ +#line 16616 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable((yyvsp[-4].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48591 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3316: /* $@237: %empty */ +#line 16622 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 48600 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3317: /* option_value_no_option_type: '@' '@' opt_var_ident_type ident_sysvar_name '.' ident equal $@237 set_expr_or_default */ +#line 16627 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_system_variable(thd, (yyvsp[-6].var_type), &(yyvsp[-5].ident_sys), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48610 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3318: /* $@238: %empty */ +#line 16633 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-6].lex_str).str)) + MYSQL_YYABORT; + } +#line 48619 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3319: /* option_value_no_option_type: '@' '@' opt_var_ident_type DEFAULT '.' ident equal $@238 set_expr_or_default */ +#line 16638 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->set_default_system_variable((yyvsp[-6].var_type), &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48629 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3320: /* option_value_no_option_type: charset old_or_new_charset_name_or_default */ +#line 16644 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex= thd->lex; + CHARSET_INFO *cs2; + cs2= (yyvsp[0].charset) ? (yyvsp[0].charset): global_system_variables.character_set_client; + set_var_collation_client *var; + var= (new (thd->mem_root) + set_var_collation_client(cs2, + thd->variables.collation_database, + cs2)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + lex->var_list.push_back(var, thd->mem_root); + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48651 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3321: /* option_value_no_option_type: NAMES_SYM equal expr */ +#line 16662 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + sp_pcontext *spc= lex->spcont; + LEX_CSTRING names= { STRING_WITH_LEN("names") }; + if (unlikely(spc && spc->find_variable(&names, false))) + my_error(ER_SP_BAD_VAR_SHADOW, MYF(0), names.str); + else + thd->parse_error(); + MYSQL_YYABORT; + } +#line 48666 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3322: /* option_value_no_option_type: NAMES_SYM charset_name_or_default */ +#line 16673 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_names((yyvsp[-1].kwd).pos(), (yyvsp[0].charset), + Lex_extended_collation_st::collate_default(), + yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 48677 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3323: /* option_value_no_option_type: NAMES_SYM charset_name_or_default COLLATE_SYM collation_name_or_default */ +#line 16681 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->set_names((yyvsp[-3].kwd).pos(), (yyvsp[-2].charset), (yyvsp[0].Lex_extended_collation), yychar == YYEMPTY)) + MYSQL_YYABORT; + } +#line 48686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3324: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role */ +#line 16686 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-2].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + LEX_USER *user; + if (unlikely(!(user=(LEX_USER *) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + user->user= current_user; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role(user, + (yyvsp[0].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48712 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3325: /* option_value_no_option_type: DEFAULT ROLE_SYM grant_role FOR_SYM user */ +#line 16708 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-4].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_default_role *var= (new (thd->mem_root) + set_var_default_role((yyvsp[0].lex_user), (yyvsp[-2].lex_user)->user)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + thd->lex->autocommit= TRUE; + if (lex->sphead) + lex->sphead->m_flags|= sp_head::HAS_SET_AUTOCOMMIT_STMT; + if (unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3326: /* option_value_no_option_type: ROLE_SYM role_name */ +#line 16724 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + LEX *lex = Lex; + set_var_role *var= new (thd->mem_root) set_var_role((yyvsp[0].lex_user)->user); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root)) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48747 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3327: /* $@239: %empty */ +#line 16735 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 48756 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3328: /* option_value_no_option_type: ROLE_SYM equal $@239 set_expr_or_default */ +#line 16740 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].kwd)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3329: /* $@240: %empty */ +#line 16748 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 48777 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3330: /* option_value_no_option_type: PASSWORD_SYM equal $@240 text_or_password */ +#line 16753 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48787 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3331: /* $@241: %empty */ +#line 16759 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (sp_create_assignment_lex(thd, (yyvsp[-1].kwd).pos())) + MYSQL_YYABORT; + } +#line 48796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3332: /* option_value_no_option_type: PASSWORD_SYM FOR_SYM $@241 user equal text_or_password */ +#line 16764 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_create_set_password_instr(thd, (yyvsp[-2].lex_user), (yyvsp[0].user_auth), + yychar == YYEMPTY))) + MYSQL_YYABORT; + } +#line 48806 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3337: /* transaction_access_mode: transaction_access_mode_types */ +#line 16780 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].num)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_read_only"), + &null_clex_str, + item)); + if (unlikely(var == NULL)) + MYSQL_YYABORT; + if (unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 48826 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3338: /* isolation_level: ISOLATION LEVEL_SYM isolation_types */ +#line 16799 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + Item *item= new (thd->mem_root) Item_int(thd, (int32) (yyvsp[0].tx_isolation)); + if (unlikely(item == NULL)) + MYSQL_YYABORT; + set_var *var= (new (thd->mem_root) + set_var(thd, lex->option_type, + find_sys_var(thd, "tx_isolation"), + &null_clex_str, + item)); + if (unlikely(var == NULL) || + unlikely(lex->var_list.push_back(var, thd->mem_root))) + MYSQL_YYABORT; + } +#line 48845 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3339: /* transaction_access_mode_types: READ_SYM ONLY_SYM */ +#line 16816 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= true; } +#line 48851 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3340: /* transaction_access_mode_types: READ_SYM WRITE_SYM */ +#line 16817 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 48857 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3341: /* isolation_types: READ_SYM UNCOMMITTED_SYM */ +#line 16821 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_UNCOMMITTED; } +#line 48863 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3342: /* isolation_types: READ_SYM COMMITTED_SYM */ +#line 16822 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_READ_COMMITTED; } +#line 48869 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3343: /* isolation_types: REPEATABLE_SYM READ_SYM */ +#line 16823 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_REPEATABLE_READ; } +#line 48875 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3344: /* isolation_types: SERIALIZABLE_SYM */ +#line 16824 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.tx_isolation)= ISO_SERIALIZABLE; } +#line 48881 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3345: /* text_or_password: TEXT_STRING */ +#line 16830 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 48890 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3346: /* text_or_password: PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16835 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 48899 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3347: /* text_or_password: OLD_PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 16840 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= new (thd->mem_root) USER_AUTH(); + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + (yyval.user_auth)->auth_str.str= Item_func_password::alloc(thd, + (yyvsp[-1].lex_string_with_metadata).str, (yyvsp[-1].lex_string_with_metadata).length, Item_func_password::OLD); + (yyval.user_auth)->auth_str.length= SCRAMBLED_PASSWORD_CHAR_LENGTH_323; + } +#line 48911 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3348: /* set_expr_or_default: expr */ +#line 16850 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=(yyvsp[0].item); } +#line 48917 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3349: /* set_expr_or_default: DEFAULT */ +#line 16851 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item)=0; } +#line 48923 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3350: /* set_expr_or_default: ON */ +#line 16853 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ON", 2); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48933 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3351: /* set_expr_or_default: ALL */ +#line 16859 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "ALL", 3); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48943 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3352: /* set_expr_or_default: BINARY */ +#line 16865 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.item)=new (thd->mem_root) Item_string_sys(thd, "binary", 6); + if (unlikely((yyval.item) == NULL)) + MYSQL_YYABORT; + } +#line 48953 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3353: /* $@242: %empty */ +#line 16876 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "LOCK")); + lex->sql_command= SQLCOM_LOCK_TABLES; + } +#line 48965 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3354: /* lock: LOCK_SYM table_or_tables $@242 table_lock_list opt_lock_wait_timeout */ +#line 16884 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 48971 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3355: /* opt_lock_wait_timeout: %empty */ +#line 16889 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 48977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3356: /* opt_lock_wait_timeout: WAIT_SYM ulong_num */ +#line 16891 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), (yyvsp[0].ulong_num))) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), (yyvsp[0].ulong_num)))) + MYSQL_YYABORT; + } +#line 48987 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3357: /* opt_lock_wait_timeout: NOWAIT_SYM */ +#line 16897 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("lock_wait_timeout"), 0)) || + unlikely(set_statement_var_if_exists(thd, STRING_WITH_LEN("innodb_lock_wait_timeout"), 0))) + MYSQL_YYABORT; + } +#line 48997 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3358: /* table_or_tables: TABLE_SYM */ +#line 16905 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49003 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3359: /* table_or_tables: TABLES */ +#line 16906 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 49009 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3362: /* table_lock: table_ident opt_table_alias_clause lock_option */ +#line 16916 "/home/buildbot/git/sql/sql_yacc.yy" + { + thr_lock_type lock_type= (thr_lock_type) (yyvsp[0].num); + bool lock_for_write= (lock_type >= TL_FIRST_WRITE); + ulong table_options= lock_for_write ? TL_OPTION_UPDATING : 0; + enum_mdl_type mdl_type= !lock_for_write + ? MDL_SHARED_READ + : lock_type == TL_WRITE_CONCURRENT_INSERT + ? MDL_SHARED_WRITE + : MDL_SHARED_NO_READ_WRITE; + + if (unlikely(!Lex->current_select_or_default()-> + add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[-1].lex_str_ptr), table_options, + lock_type, mdl_type))) + MYSQL_YYABORT; + } +#line 49029 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3363: /* lock_option: READ_SYM */ +#line 16934 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ_NO_INSERT; } +#line 49035 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3364: /* lock_option: WRITE_SYM */ +#line 16935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_DEFAULT; } +#line 49041 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3365: /* lock_option: WRITE_SYM CONCURRENT */ +#line 16937 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.num)= (Lex->sphead ? TL_WRITE_DEFAULT : TL_WRITE_CONCURRENT_INSERT); + } +#line 49049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3366: /* lock_option: LOW_PRIORITY WRITE_SYM */ +#line 16941 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_WRITE_LOW_PRIORITY; } +#line 49055 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3367: /* lock_option: READ_SYM LOCAL_SYM */ +#line 16942 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= TL_READ; } +#line 49061 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3368: /* $@243: %empty */ +#line 16947 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "UNLOCK")); + lex->sql_command= SQLCOM_UNLOCK_TABLES; + } +#line 49073 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3369: /* unlock: UNLOCK_SYM $@243 table_or_tables */ +#line 16955 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49079 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3370: /* $@244: %empty */ +#line 16964 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->main_select_push()) + MYSQL_YYABORT; + } +#line 49088 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3371: /* handler: HANDLER_SYM $@244 handler_tail */ +#line 16969 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->pop_select(); //main select + } +#line 49096 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3372: /* handler_tail: table_ident OPEN_SYM opt_table_alias_clause */ +#line 16976 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_OPEN; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-2].table), (yyvsp[0].lex_str_ptr), 0)) + MYSQL_YYABORT; + } +#line 49109 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3373: /* handler_tail: table_ident_nodb CLOSE_SYM */ +#line 16985 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->sql_command = SQLCOM_HA_CLOSE; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3374: /* $@245: %empty */ +#line 16994 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_BADSTATEMENT, MYF(0), "HANDLER")); + lex->clause_that_disallows_subselect= "HANDLER..READ"; + lex->sql_command = SQLCOM_HA_READ; + lex->ha_rkey_mode= HA_READ_KEY_EXACT; /* Avoid purify warnings */ + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (unlikely(one == NULL)) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + if (!lex->current_select->add_table_to_list(thd, (yyvsp[-1].table), 0, 0)) + MYSQL_YYABORT; + } +#line 49144 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3375: /* handler_tail: table_ident_nodb READ_SYM $@245 handler_read_or_scan opt_where_clause opt_global_limit_clause */ +#line 17012 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + SELECT_LEX *select= Select; + lex->clause_that_disallows_subselect= NULL; + if (!lex->current_select->limit_params.explicit_limit) + { + Item *one= new (thd->mem_root) Item_int(thd, (int32) 1); + if (one == NULL) + MYSQL_YYABORT; + select->limit_params.select_limit= one; + select->limit_params.offset_limit= 0; + lex->limit_rows_examined= 0; + } + /* Stored functions are not supported for HANDLER READ. */ + if (lex->uses_stored_routines()) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "stored functions in HANDLER ... READ"); + MYSQL_YYABORT; + } + } +#line 49170 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3376: /* handler_read_or_scan: handler_scan_function */ +#line 17036 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= null_clex_str; } +#line 49176 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3377: /* handler_read_or_scan: ident handler_rkey_function */ +#line 17037 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ident= (yyvsp[-1].ident_sys); } +#line 49182 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3378: /* handler_scan_function: FIRST_SYM */ +#line 17041 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49188 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3379: /* handler_scan_function: NEXT_SYM */ +#line 17042 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49194 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3380: /* handler_rkey_function: FIRST_SYM */ +#line 17046 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RFIRST; } +#line 49200 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3381: /* handler_rkey_function: NEXT_SYM */ +#line 17047 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RNEXT; } +#line 49206 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3382: /* handler_rkey_function: PREV_SYM */ +#line 17048 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RPREV; } +#line 49212 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3383: /* handler_rkey_function: LAST_SYM */ +#line 17049 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->ha_read_mode = RLAST; } +#line 49218 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3384: /* $@246: %empty */ +#line 17051 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->ha_read_mode = RKEY; + lex->ha_rkey_mode=(yyvsp[0].ha_rkey_mode); + if (unlikely(!(lex->insert_list= new (thd->mem_root) List_item))) + MYSQL_YYABORT; + } +#line 49230 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3385: /* handler_rkey_function: handler_rkey_mode $@246 '(' values ')' */ +#line 17059 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49236 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3386: /* handler_rkey_mode: '=' */ +#line 17063 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_EXACT; } +#line 49242 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3387: /* handler_rkey_mode: GE */ +#line 17064 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_NEXT; } +#line 49248 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3388: /* handler_rkey_mode: LE */ +#line 17065 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_KEY_OR_PREV; } +#line 49254 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3389: /* handler_rkey_mode: '>' */ +#line 17066 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_AFTER_KEY; } +#line 49260 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3390: /* handler_rkey_mode: '<' */ +#line 17067 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ha_rkey_mode)=HA_READ_BEFORE_KEY; } +#line 49266 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3391: /* revoke: REVOKE clear_privileges revoke_command */ +#line 17074 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49272 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3392: /* revoke_command: grant_privileges ON opt_table grant_ident FROM user_and_role_list */ +#line 17079 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_table(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident))) + MYSQL_YYABORT; + } +#line 49281 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3393: /* revoke_command: grant_privileges ON sp_handler grant_ident FROM user_and_role_list */ +#line 17084 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_sp(thd, (yyvsp[-5].lex_grant), *(yyvsp[-2].lex_grant_ident), *(yyvsp[-3].sp_handler))) + MYSQL_YYABORT; + } +#line 49290 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3394: /* revoke_command: ALL opt_privileges ',' GRANT OPTION FROM user_and_role_list */ +#line 17089 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_REVOKE_ALL; + } +#line 49298 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3395: /* revoke_command: PROXY_SYM ON user FROM user_list */ +#line 17093 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_revoke_proxy(thd, (yyvsp[-2].lex_user))) + MYSQL_YYABORT; + } +#line 49307 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3396: /* revoke_command: admin_option_for_role FROM user_and_role_list */ +#line 17098 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_REVOKE_ROLE; + if (unlikely(Lex->users_list.push_front((yyvsp[-2].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49317 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3397: /* admin_option_for_role: ADMIN_SYM OPTION FOR_SYM grant_role */ +#line 17107 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 49323 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3398: /* admin_option_for_role: grant_role */ +#line 17109 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; (yyval.lex_user)= (yyvsp[0].lex_user); } +#line 49329 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3399: /* grant: GRANT clear_privileges grant_command */ +#line 17114 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49335 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3400: /* grant_command: grant_privileges ON opt_table grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17120 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_table(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 49344 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3401: /* grant_command: grant_privileges ON sp_handler grant_ident TO_SYM grant_list opt_require_clause opt_grant_options */ +#line 17126 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_sp(thd, (yyvsp[-7].lex_grant), *(yyvsp[-4].lex_grant_ident), *(yyvsp[-5].sp_handler), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 49353 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3402: /* grant_command: PROXY_SYM ON user TO_SYM grant_list opt_grant_option */ +#line 17131 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_grant_proxy(thd, (yyvsp[-3].lex_user), (yyvsp[0].privilege))) + MYSQL_YYABORT; + } +#line 49362 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3403: /* grant_command: grant_role TO_SYM grant_list opt_with_admin_option */ +#line 17136 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_GRANT_ROLE; + /* The first role is the one that is granted */ + if (unlikely(Lex->users_list.push_front((yyvsp[-3].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49374 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3404: /* opt_with_admin: %empty */ +#line 17147 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = 0; } +#line 49380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3405: /* opt_with_admin: WITH ADMIN_SYM user_or_role */ +#line 17148 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->definer = (yyvsp[0].lex_user); } +#line 49386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3406: /* opt_with_admin_option: %empty */ +#line 17152 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= false; } +#line 49392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3407: /* opt_with_admin_option: WITH ADMIN_SYM OPTION */ +#line 17153 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->with_admin_option= true; } +#line 49398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3408: /* role_list: grant_role */ +#line 17158 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49407 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3409: /* role_list: role_list ',' grant_role */ +#line 17163 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49416 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3410: /* current_role: CURRENT_ROLE optional_braces */ +#line 17171 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + (yyval.lex_user)->user= current_role; + } +#line 49426 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3411: /* role_name: ident_or_text */ +#line 17180 "/home/buildbot/git/sql/sql_yacc.yy" + { + CHARSET_INFO *cs= system_charset_info; + /* trim end spaces (as they'll be lost in mysql.user anyway) */ + (yyvsp[0].lex_str).length= cs->lengthsp((yyvsp[0].lex_str).str, (yyvsp[0].lex_str).length); + ((char*) (yyvsp[0].lex_str).str)[(yyvsp[0].lex_str).length] = '\0'; + if (unlikely((yyvsp[0].lex_str).length == 0)) + my_yyabort_error((ER_INVALID_ROLE, MYF(0), "")); + if (unlikely(!((yyval.lex_user)=(LEX_USER*) thd->calloc(sizeof(LEX_USER))))) + MYSQL_YYABORT; + if (lex_string_eq(&(yyvsp[0].lex_str), &none)) + (yyval.lex_user)->user= none; + else if (lex_string_eq(&(yyvsp[0].lex_str), &public_name)) + (yyval.lex_user)->user= public_name; + else if (check_string_char_length(&((yyval.lex_user)->user= (yyvsp[0].lex_str)), ER_USERNAME, + username_char_length, cs, 0)) + MYSQL_YYABORT; + (yyval.lex_user)->host= empty_clex_str; + } +#line 49449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3417: /* grant_privileges: ALL opt_privileges */ +#line 17210 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege(GLOBAL_ACLS, true))) + MYSQL_YYABORT; + } +#line 49458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3420: /* object_privilege_list: object_privilege */ +#line 17223 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege((yyvsp[0].privilege)))) + MYSQL_YYABORT; + } +#line 49467 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3421: /* object_privilege_list: column_list_privilege */ +#line 17228 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant)= new (thd->mem_root) Lex_grant_privilege()) || + (yyval.lex_grant)->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 49478 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3422: /* object_privilege_list: object_privilege_list ',' object_privilege */ +#line 17235 "/home/buildbot/git/sql/sql_yacc.yy" + { + ((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_object_privilege((yyvsp[0].privilege)); + } +#line 49486 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3423: /* object_privilege_list: object_privilege_list ',' column_list_privilege */ +#line 17239 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (((yyval.lex_grant)= (yyvsp[-2].lex_grant))->add_column_list_privilege(thd, (yyvsp[0].column_list_privilege).m_columns[0], + (yyvsp[0].column_list_privilege).m_privilege)) + MYSQL_YYABORT; + } +#line 49496 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3424: /* column_list_privilege: column_privilege '(' comma_separated_ident_list ')' */ +#line 17248 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.column_list_privilege)= Lex_column_list_privilege((yyvsp[-1].ident_sys_list), (yyvsp[-3].privilege)); + } +#line 49504 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3425: /* column_privilege: SELECT_SYM */ +#line 17254 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 49510 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3426: /* column_privilege: INSERT */ +#line 17255 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 49516 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3427: /* column_privilege: UPDATE_SYM */ +#line 17256 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 49522 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3428: /* column_privilege: REFERENCES */ +#line 17257 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 49528 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3429: /* object_privilege: SELECT_SYM */ +#line 17261 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SELECT_ACL; } +#line 49534 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3430: /* object_privilege: INSERT */ +#line 17262 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INSERT_ACL; } +#line 49540 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3431: /* object_privilege: UPDATE_SYM */ +#line 17263 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= UPDATE_ACL; } +#line 49546 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3432: /* object_privilege: REFERENCES */ +#line 17264 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REFERENCES_ACL; } +#line 49552 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3433: /* object_privilege: DELETE_SYM */ +#line 17265 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_ACL;} +#line 49558 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3434: /* object_privilege: USAGE */ +#line 17266 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 49564 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3435: /* object_privilege: INDEX_SYM */ +#line 17267 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= INDEX_ACL;} +#line 49570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3436: /* object_privilege: ALTER */ +#line 17268 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_ACL;} +#line 49576 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3437: /* object_privilege: CREATE */ +#line 17269 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_ACL;} +#line 49582 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3438: /* object_privilege: DROP */ +#line 17270 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DROP_ACL;} +#line 49588 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3439: /* object_privilege: EXECUTE_SYM */ +#line 17271 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EXECUTE_ACL;} +#line 49594 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3440: /* object_privilege: RELOAD */ +#line 17272 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= RELOAD_ACL;} +#line 49600 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3441: /* object_privilege: SHUTDOWN */ +#line 17273 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHUTDOWN_ACL;} +#line 49606 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3442: /* object_privilege: PROCESS */ +#line 17274 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= PROCESS_ACL;} +#line 49612 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3443: /* object_privilege: FILE_SYM */ +#line 17275 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FILE_ACL;} +#line 49618 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3444: /* object_privilege: GRANT OPTION */ +#line 17276 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 49624 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3445: /* object_privilege: SHOW DATABASES */ +#line 17277 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_DB_ACL;} +#line 49630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3446: /* object_privilege: SUPER_SYM */ +#line 17278 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SUPER_ACL;} +#line 49636 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3447: /* object_privilege: CREATE TEMPORARY TABLES */ +#line 17279 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TMP_ACL;} +#line 49642 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3448: /* object_privilege: LOCK_SYM TABLES */ +#line 17280 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= LOCK_TABLES_ACL; } +#line 49648 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3449: /* object_privilege: REPLICATION SLAVE */ +#line 17281 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ACL; } +#line 49654 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3450: /* object_privilege: REPLICATION CLIENT_SYM */ +#line 17282 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; /*Compatibility*/ } +#line 49660 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3451: /* object_privilege: CREATE VIEW_SYM */ +#line 17283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_VIEW_ACL; } +#line 49666 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3452: /* object_privilege: SHOW VIEW_SYM */ +#line 17284 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SHOW_VIEW_ACL; } +#line 49672 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3453: /* object_privilege: CREATE ROUTINE_SYM */ +#line 17285 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_PROC_ACL; } +#line 49678 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3454: /* object_privilege: ALTER ROUTINE_SYM */ +#line 17286 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= ALTER_PROC_ACL; } +#line 49684 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3455: /* object_privilege: CREATE USER_SYM */ +#line 17287 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_USER_ACL; } +#line 49690 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3456: /* object_privilege: EVENT_SYM */ +#line 17288 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= EVENT_ACL;} +#line 49696 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3457: /* object_privilege: TRIGGER_SYM */ +#line 17289 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= TRIGGER_ACL; } +#line 49702 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3458: /* object_privilege: CREATE TABLESPACE */ +#line 17290 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CREATE_TABLESPACE_ACL; } +#line 49708 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3459: /* object_privilege: DELETE_SYM HISTORY_SYM */ +#line 17291 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= DELETE_HISTORY_ACL; } +#line 49714 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3460: /* object_privilege: SET USER_SYM */ +#line 17292 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SET_USER_ACL; } +#line 49720 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3461: /* object_privilege: FEDERATED_SYM ADMIN_SYM */ +#line 17293 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= FEDERATED_ADMIN_ACL; } +#line 49726 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3462: /* object_privilege: CONNECTION_SYM ADMIN_SYM */ +#line 17294 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= CONNECTION_ADMIN_ACL; } +#line 49732 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3463: /* object_privilege: READ_SYM ONLY_SYM ADMIN_SYM */ +#line 17295 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 49738 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3464: /* object_privilege: READ_ONLY_SYM ADMIN_SYM */ +#line 17296 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= READ_ONLY_ADMIN_ACL; } +#line 49744 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3465: /* object_privilege: BINLOG_SYM MONITOR_SYM */ +#line 17297 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_MONITOR_ACL; } +#line 49750 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3466: /* object_privilege: BINLOG_SYM ADMIN_SYM */ +#line 17298 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_ADMIN_ACL; } +#line 49756 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3467: /* object_privilege: BINLOG_SYM REPLAY_SYM */ +#line 17299 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= BINLOG_REPLAY_ACL; } +#line 49762 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3468: /* object_privilege: REPLICATION MASTER_SYM ADMIN_SYM */ +#line 17300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_MASTER_ADMIN_ACL; } +#line 49768 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3469: /* object_privilege: REPLICATION SLAVE ADMIN_SYM */ +#line 17301 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= REPL_SLAVE_ADMIN_ACL; } +#line 49774 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3470: /* object_privilege: SLAVE MONITOR_SYM */ +#line 17302 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= SLAVE_MONITOR_ACL; } +#line 49780 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3471: /* opt_and: %empty */ +#line 17306 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49786 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3472: /* opt_and: AND_SYM */ +#line 17307 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 49792 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3475: /* require_list_element: SUBJECT_SYM TEXT_STRING */ +#line 17317 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_subject.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "SUBJECT")); + lex->account_options.x509_subject= (yyvsp[0].lex_string_with_metadata); + } +#line 49803 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3476: /* require_list_element: ISSUER_SYM TEXT_STRING */ +#line 17324 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.x509_issuer.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "ISSUER")); + lex->account_options.x509_issuer= (yyvsp[0].lex_string_with_metadata); + } +#line 49814 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3477: /* require_list_element: CIPHER_SYM TEXT_STRING */ +#line 17331 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + if (lex->account_options.ssl_cipher.str) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CIPHER")); + lex->account_options.ssl_cipher= (yyvsp[0].lex_string_with_metadata); + } +#line 49825 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3478: /* grant_ident: '*' */ +#line 17341 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING db; + if (unlikely(Lex->copy_db_to(&db))) + MYSQL_YYABORT; + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name(db, + Lex_grant_object_name::STAR))) + MYSQL_YYABORT; + } +#line 49838 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3479: /* grant_ident: ident '.' '*' */ +#line 17350 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[-2].ident_sys), + Lex_grant_object_name::IDENT_STAR))) + MYSQL_YYABORT; + } +#line 49848 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3480: /* grant_ident: '*' '.' '*' */ +#line 17356 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name( + null_clex_str, + Lex_grant_object_name::STAR_STAR))) + MYSQL_YYABORT; + } +#line 49859 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3481: /* grant_ident: table_ident */ +#line 17363 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.lex_grant_ident)= new (thd->mem_root) Lex_grant_object_name((yyvsp[0].table)))) + MYSQL_YYABORT; + } +#line 49868 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3482: /* user_list: user */ +#line 17371 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49877 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3483: /* user_list: user_list ',' user */ +#line 17376 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49886 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3484: /* grant_list: grant_user */ +#line 17384 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49895 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3485: /* grant_list: grant_list ',' grant_user */ +#line 17389 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49904 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3486: /* user_and_role_list: user_or_role */ +#line 17397 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49913 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3487: /* user_and_role_list: user_and_role_list ',' user_or_role */ +#line 17402 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->users_list.push_back((yyvsp[0].lex_user), thd->mem_root))) + MYSQL_YYABORT; + } +#line 49922 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3492: /* grant_user: user IDENTIFIED_SYM BY TEXT_STRING */ +#line 17413 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-3].lex_user)->auth->pwtext= (yyvsp[0].lex_string_with_metadata); + } +#line 49932 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3493: /* grant_user: user IDENTIFIED_SYM BY PASSWORD_SYM TEXT_STRING */ +#line 17419 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-4].lex_user); + (yyvsp[-4].lex_user)->auth= new (thd->mem_root) USER_AUTH(); + (yyvsp[-4].lex_user)->auth->auth_str= (yyvsp[0].lex_string_with_metadata); + } +#line 49942 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3494: /* grant_user: user IDENTIFIED_SYM via_or_with auth_expression */ +#line 17425 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[-3].lex_user); + (yyvsp[-3].lex_user)->auth= (yyvsp[0].user_auth); + } +#line 49951 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3495: /* grant_user: user_or_role */ +#line 17430 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex_user)= (yyvsp[0].lex_user); + } +#line 49959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3496: /* auth_expression: auth_token OR_SYM auth_expression */ +#line 17437 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[-2].user_auth); + DBUG_ASSERT((yyval.user_auth)->next == NULL); + (yyval.user_auth)->next= (yyvsp[0].user_auth); + } +#line 49969 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3497: /* auth_expression: auth_token */ +#line 17443 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + } +#line 49977 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3498: /* auth_token: ident_or_text opt_auth_str */ +#line 17450 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.user_auth)= (yyvsp[0].user_auth); + (yyval.user_auth)->plugin= (yyvsp[-1].lex_str); + } +#line 49986 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3499: /* opt_auth_str: %empty */ +#line 17458 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + } +#line 49995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3500: /* opt_auth_str: using_or_as TEXT_STRING_sys */ +#line 17463 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->auth_str= (yyvsp[0].lex_str); + } +#line 50005 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3501: /* opt_auth_str: using_or_as PASSWORD_SYM '(' TEXT_STRING ')' */ +#line 17469 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.user_auth)=(USER_AUTH*) thd->calloc(sizeof(USER_AUTH)))) + MYSQL_YYABORT; + (yyval.user_auth)->pwtext= (yyvsp[-1].lex_string_with_metadata); + } +#line 50015 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3503: /* opt_require_clause: REQUIRE_SYM require_list */ +#line 17479 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_SPECIFIED; + } +#line 50023 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3504: /* opt_require_clause: REQUIRE_SYM SSL_SYM */ +#line 17483 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_ANY; + } +#line 50031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3505: /* opt_require_clause: REQUIRE_SYM X509_SYM */ +#line 17487 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_X509; + } +#line 50039 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3506: /* opt_require_clause: REQUIRE_SYM NONE_SYM */ +#line 17491 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.ssl_type= SSL_TYPE_NONE; + } +#line 50047 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3507: /* resource_option: MAX_QUERIES_PER_HOUR ulong_num */ +#line 17498 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.questions=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::QUERIES_PER_HOUR; + } +#line 50056 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3508: /* resource_option: MAX_UPDATES_PER_HOUR ulong_num */ +#line 17503 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.updates=(yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::UPDATES_PER_HOUR; + } +#line 50065 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3509: /* resource_option: MAX_CONNECTIONS_PER_HOUR ulong_num */ +#line 17508 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.conn_per_hour= (yyvsp[0].ulong_num); + Lex->account_options.specified_limits|= USER_RESOURCES::CONNECTIONS_PER_HOUR; + } +#line 50074 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3510: /* resource_option: MAX_USER_CONNECTIONS_SYM int_num */ +#line 17513 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.user_conn= (yyvsp[0].num); + Lex->account_options.specified_limits|= USER_RESOURCES::USER_CONNECTIONS; + } +#line 50083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3511: /* resource_option: MAX_STATEMENT_TIME_SYM NUM_literal */ +#line 17518 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->account_options.max_statement_time= (yyvsp[0].item_num)->val_real(); + Lex->account_options.specified_limits|= USER_RESOURCES::MAX_STATEMENT_TIME; + } +#line 50092 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3512: /* resource_option_list: resource_option_list resource_option */ +#line 17525 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50098 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3513: /* resource_option_list: resource_option */ +#line 17526 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50104 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3514: /* opt_resource_options: %empty */ +#line 17530 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50110 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3516: /* opt_grant_options: %empty */ +#line 17536 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50116 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3517: /* opt_grant_options: WITH grant_option_list */ +#line 17537 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[0].privilege); } +#line 50122 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3518: /* opt_grant_option: %empty */ +#line 17541 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50128 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3519: /* opt_grant_option: WITH GRANT OPTION */ +#line 17542 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL; } +#line 50134 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3520: /* grant_option_list: grant_option_list grant_option */ +#line 17546 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= (yyvsp[-1].privilege) | (yyvsp[0].privilege); } +#line 50140 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3522: /* grant_option: GRANT OPTION */ +#line 17551 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= GRANT_ACL;} +#line 50146 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3523: /* grant_option: resource_option */ +#line 17552 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.privilege)= NO_ACL; } +#line 50152 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3524: /* $@247: %empty */ +#line 17557 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command = SQLCOM_BEGIN; + lex->start_transaction_opt= 0; + } +#line 50162 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3525: /* begin_stmt_mariadb: BEGIN_MARIADB_SYM $@247 opt_work */ +#line 17562 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50168 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3526: /* compound_statement: sp_proc_stmt_compound_ok */ +#line 17567 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command= SQLCOM_COMPOUND; + if (Lex->sp_body_finalize_procedure(thd)) + MYSQL_YYABORT; + } +#line 50178 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3527: /* opt_not: %empty */ +#line 17575 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 50184 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3528: /* opt_not: not */ +#line 17576 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 50190 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3529: /* opt_work: %empty */ +#line 17580 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50196 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3530: /* opt_work: WORK_SYM */ +#line 17581 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50202 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3531: /* opt_chain: %empty */ +#line 17586 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50208 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3532: /* opt_chain: AND_SYM NO_SYM CHAIN_SYM */ +#line 17587 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50214 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3533: /* opt_chain: AND_SYM CHAIN_SYM */ +#line 17588 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50220 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3534: /* opt_release: %empty */ +#line 17593 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_UNKNOWN; } +#line 50226 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3535: /* opt_release: RELEASE_SYM */ +#line 17594 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_YES; } +#line 50232 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3536: /* opt_release: NO_SYM RELEASE_SYM */ +#line 17595 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.m_yes_no_unk)= TVL_NO; } +#line 50238 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3537: /* commit: COMMIT_SYM opt_work opt_chain opt_release */ +#line 17600 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_COMMIT; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50251 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3538: /* rollback: ROLLBACK_SYM opt_work opt_chain opt_release */ +#line 17612 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK; + /* Don't allow AND CHAIN RELEASE. */ + MYSQL_YYABORT_UNLESS((yyvsp[-1].m_yes_no_unk) != TVL_YES || (yyvsp[0].m_yes_no_unk) != TVL_YES); + lex->tx_chain= (yyvsp[-1].m_yes_no_unk); + lex->tx_release= (yyvsp[0].m_yes_no_unk); + } +#line 50264 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3539: /* rollback: ROLLBACK_SYM opt_work TO_SYM SAVEPOINT_SYM ident */ +#line 17621 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50274 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3540: /* rollback: ROLLBACK_SYM opt_work TO_SYM ident */ +#line 17627 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_ROLLBACK_TO_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50284 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3541: /* savepoint: SAVEPOINT_SYM ident */ +#line 17636 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50294 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3542: /* release: RELEASE_SYM SAVEPOINT_SYM ident */ +#line 17645 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->sql_command= SQLCOM_RELEASE_SAVEPOINT; + lex->ident= (yyvsp[0].ident_sys); + } +#line 50304 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3543: /* unit_type_decl: UNION_SYM union_option */ +#line 17658 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= UNION_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 50310 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3544: /* unit_type_decl: INTERSECT_SYM union_option */ +#line 17660 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= INTERSECT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 50316 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3545: /* unit_type_decl: EXCEPT_SYM union_option */ +#line 17662 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.unit_operation).unit_type= EXCEPT_TYPE; (yyval.unit_operation).distinct= (yyvsp[0].num); } +#line 50322 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3546: /* union_option: %empty */ +#line 17669 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 50328 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3547: /* union_option: DISTINCT */ +#line 17670 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=1; } +#line 50334 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3548: /* union_option: ALL */ +#line 17671 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)=0; } +#line 50340 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3549: /* query_expression_option: STRAIGHT_JOIN */ +#line 17675 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_STRAIGHT_JOIN; } +#line 50346 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3550: /* query_expression_option: HIGH_PRIORITY */ +#line 17677 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYPS->m_lock_type= TL_READ_HIGH_PRIORITY; + YYPS->m_mdl_type= MDL_SHARED_READ; + Select->options|= SELECT_HIGH_PRIORITY; + } +#line 50356 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3551: /* query_expression_option: DISTINCT */ +#line 17682 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 50362 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3552: /* query_expression_option: UNIQUE_SYM */ +#line 17683 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_DISTINCT; } +#line 50368 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3553: /* query_expression_option: SQL_SMALL_RESULT */ +#line 17684 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_SMALL_RESULT; } +#line 50374 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3554: /* query_expression_option: SQL_BIG_RESULT */ +#line 17685 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_BIG_RESULT; } +#line 50380 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3555: /* query_expression_option: SQL_BUFFER_RESULT */ +#line 17686 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_BUFFER_RESULT; } +#line 50386 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3556: /* query_expression_option: SQL_CALC_FOUND_ROWS */ +#line 17687 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= OPTION_FOUND_ROWS; } +#line 50392 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3557: /* query_expression_option: ALL */ +#line 17688 "/home/buildbot/git/sql/sql_yacc.yy" + { Select->options|= SELECT_ALL; } +#line 50398 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3560: /* no_definer: %empty */ +#line 17704 "/home/buildbot/git/sql/sql_yacc.yy" + { + /* + We have to distinguish missing DEFINER-clause from case when + CURRENT_USER specified as definer explicitly in order to properly + handle CREATE TRIGGER statements which come to replication thread + from older master servers (i.e. to create non-suid trigger in this + case). + */ + thd->lex->definer= 0; + } +#line 50413 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3561: /* definer: DEFINER_SYM '=' user_or_role */ +#line 17718 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->definer= (yyvsp[0].lex_user); + Lex->account_options.reset(); + } +#line 50422 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3562: /* view_algorithm: ALGORITHM_SYM '=' UNDEFINED_SYM */ +#line 17731 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= DTYPE_ALGORITHM_UNDEFINED; } +#line 50428 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3563: /* view_algorithm: ALGORITHM_SYM '=' MERGE_SYM */ +#line 17732 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_MERGE; } +#line 50434 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3564: /* view_algorithm: ALGORITHM_SYM '=' TEMPTABLE_SYM */ +#line 17733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_ALGORITHM_TMPTABLE; } +#line 50440 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3565: /* opt_view_suid: %empty */ +#line 17737 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFAULT; } +#line 50446 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3566: /* opt_view_suid: view_suid */ +#line 17738 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= (yyvsp[0].view_suid); } +#line 50452 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3567: /* view_suid: SQL_SYM SECURITY_SYM DEFINER_SYM */ +#line 17742 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_DEFINER; } +#line 50458 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3568: /* view_suid: SQL_SYM SECURITY_SYM INVOKER_SYM */ +#line 17743 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.view_suid)= VIEW_SUID_INVOKER; } +#line 50464 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3569: /* view_list_opt: %empty */ +#line 17748 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50470 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3570: /* view_list_opt: '(' view_list ')' */ +#line 17749 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 50476 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3571: /* view_list: ident */ +#line 17754 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 50486 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3572: /* view_list: view_list ',' ident */ +#line 17760 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->view_list.push_back((LEX_CSTRING*) + thd->memdup(&(yyvsp[0].ident_sys), sizeof(LEX_CSTRING)), + thd->mem_root); + } +#line 50496 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3573: /* $@248: %empty */ +#line 17768 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->parsing_options.allows_variable= FALSE; + lex->create_view->select.str= (char *) YYLIP->get_cpp_ptr(); + } +#line 50506 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3574: /* view_select: $@248 query_expression view_check_option */ +#line 17775 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->parsed_create_view((yyvsp[-1].select_lex_unit), (yyvsp[0].num))) + MYSQL_YYABORT; + } +#line 50515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3575: /* view_check_option: %empty */ +#line 17782 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_NONE; } +#line 50521 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3576: /* view_check_option: WITH CHECK_SYM OPTION */ +#line 17783 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 50527 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3577: /* view_check_option: WITH CASCADED CHECK_SYM OPTION */ +#line 17784 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_CASCADED; } +#line 50533 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3578: /* view_check_option: WITH LOCAL_SYM CHECK_SYM OPTION */ +#line 17785 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= VIEW_CHECK_LOCAL; } +#line 50539 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3579: /* trigger_action_order: FOLLOWS_SYM */ +#line 17796 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_FOLLOWS; } +#line 50545 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3580: /* trigger_action_order: PRECEDES_SYM */ +#line 17798 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.trigger_action_order_type)= TRG_ORDER_PRECEDES; } +#line 50551 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3581: /* trigger_follows_precedes_clause: %empty */ +#line 17803 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= TRG_ORDER_NONE; + (yyval.trg_execution_order).anchor_trigger_name.str= NULL; + (yyval.trg_execution_order).anchor_trigger_name.length= 0; + } +#line 50561 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3582: /* trigger_follows_precedes_clause: trigger_action_order ident_or_text */ +#line 17810 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.trg_execution_order).ordering_clause= (yyvsp[-1].trigger_action_order_type); + (yyval.trg_execution_order).anchor_trigger_name= (yyvsp[0].lex_str); + } +#line 50570 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3583: /* $@249: %empty */ +#line 17819 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->add_create_options_with_check((yyvsp[0].object_ddl_options)))) + MYSQL_YYABORT; + } +#line 50579 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3584: /* $@250: %empty */ +#line 17828 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $9 */ + Lex->raw_trg_on_table_name_begin= YYLIP->get_tok_start(); + } +#line 50587 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3585: /* $@251: %empty */ +#line 17834 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $13 */ + Lex->raw_trg_on_table_name_end= YYLIP->get_tok_start(); + } +#line 50595 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3586: /* $@252: %empty */ +#line 17839 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->trg_chistics.ordering_clause_begin= YYLIP->get_cpp_ptr(); + } +#line 50603 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3587: /* $@253: %empty */ +#line 17843 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $18 */ + LEX *lex= thd->lex; + Lex_input_stream *lip= YYLIP; + + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_RECURSIVE_CREATE, MYF(0), "TRIGGER")); + + lex->stmt_definition_begin= (yyvsp[-16].simple_string); + lex->ident.str= (yyvsp[-9].simple_string); + lex->ident.length= (yyvsp[-5].simple_string) - (yyvsp[-9].simple_string); + lex->spname= (yyvsp[-13].spname); + (*static_cast(&lex->trg_chistics))= ((yyvsp[0].trg_execution_order)); + lex->trg_chistics.ordering_clause_end= lip->get_cpp_ptr(); + + if (unlikely(!lex->make_sp_head(thd, (yyvsp[-13].spname), &sp_handler_trigger, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + + lex->sphead->set_body_start(thd, lip->get_cpp_tok_start()); + } +#line 50628 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3588: /* trigger_tail: remember_name opt_if_not_exists $@249 sp_name trg_action_time trg_event ON remember_name $@250 table_ident FOR_SYM remember_name $@251 EACH_SYM ROW_SYM $@252 trigger_follows_precedes_clause $@253 sp_proc_stmt force_lookahead */ +#line 17864 "/home/buildbot/git/sql/sql_yacc.yy" + { /* $21 */ + LEX *lex= Lex; + + lex->sql_command= SQLCOM_CREATE_TRIGGER; + if (lex->sp_body_finalize_trigger(thd)) + MYSQL_YYABORT; + + /* + We have to do it after parsing trigger body, because some of + sp_proc_stmt alternatives are not saving/restoring LEX, so + lex->query_tables can be wiped out. + */ + if (!lex->first_select_lex()-> + add_table_to_list(thd, (yyvsp[-10].table), (LEX_CSTRING*) 0, + TL_OPTION_UPDATING, TL_READ_NO_INSERT, + MDL_SHARED_NO_WRITE)) + MYSQL_YYABORT; + } +#line 50651 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3589: /* $@254: %empty */ +#line 17892 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->init_last_field(&lex->sphead->m_return_field_def, + &empty_clex_str); + } +#line 50661 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3590: /* sf_return_type: $@254 field_type */ +#line 17898 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sf_return_fill_definition((yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 50670 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3591: /* xa: XA_SYM begin_or_start xid opt_join_or_resume */ +#line 17908 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_START; + } +#line 50678 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3592: /* xa: XA_SYM END xid opt_suspend */ +#line 17912 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_END; + } +#line 50686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3593: /* xa: XA_SYM PREPARE_SYM xid */ +#line 17916 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_PREPARE; + } +#line 50694 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3594: /* xa: XA_SYM COMMIT_SYM xid opt_one_phase */ +#line 17920 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_COMMIT; + } +#line 50702 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3595: /* xa: XA_SYM ROLLBACK_SYM xid */ +#line 17924 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_ROLLBACK; + } +#line 50710 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3596: /* xa: XA_SYM RECOVER_SYM opt_format_xid */ +#line 17928 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sql_command = SQLCOM_XA_RECOVER; + Lex->verbose= (yyvsp[0].num); + } +#line 50719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3597: /* opt_format_xid: %empty */ +#line 17935 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= false; } +#line 50725 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3598: /* opt_format_xid: FORMAT_SYM '=' ident_or_text */ +#line 17937 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("SQL"))) + (yyval.num)= true; + else if (lex_string_eq(&(yyvsp[0].lex_str), STRING_WITH_LEN("RAW"))) + (yyval.num)= false; + else + { + my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), + "XA RECOVER", (yyvsp[0].lex_str).str)); + (yyval.num)= false; + } + } +#line 50742 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3599: /* xid: text_string */ +#line 17953 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[0].string)->length() <= MAXGTRIDSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length(), 0, 0); + } +#line 50753 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3600: /* xid: text_string ',' text_string */ +#line 17960 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-2].string)->length() <= MAXGTRIDSIZE && (yyvsp[0].string)->length() <= MAXBQUALSIZE); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set(1L, (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length(), (yyvsp[0].string)->ptr(), (yyvsp[0].string)->length()); + } +#line 50764 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3601: /* xid: text_string ',' text_string ',' ulong_num */ +#line 17967 "/home/buildbot/git/sql/sql_yacc.yy" + { + MYSQL_YYABORT_UNLESS((yyvsp[-4].string)->length() <= MAXGTRIDSIZE && + (yyvsp[-2].string)->length() <= MAXBQUALSIZE && + (yyvsp[0].ulong_num) <= static_cast( + std::numeric_limits::max())); + if (unlikely(!(Lex->xid=(XID *)thd->alloc(sizeof(XID))))) + MYSQL_YYABORT; + Lex->xid->set((yyvsp[0].ulong_num), (yyvsp[-4].string)->ptr(), (yyvsp[-4].string)->length(), (yyvsp[-2].string)->ptr(), (yyvsp[-2].string)->length()); + } +#line 50778 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3602: /* begin_or_start: BEGIN_MARIADB_SYM */ +#line 17979 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50784 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3603: /* begin_or_start: BEGIN_ORACLE_SYM */ +#line 17980 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50790 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3604: /* begin_or_start: START_SYM */ +#line 17981 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50796 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3605: /* opt_join_or_resume: %empty */ +#line 17985 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 50802 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3606: /* opt_join_or_resume: JOIN_SYM */ +#line 17986 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_JOIN; } +#line 50808 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3607: /* opt_join_or_resume: RESUME_SYM */ +#line 17987 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_RESUME; } +#line 50814 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3608: /* opt_one_phase: %empty */ +#line 17991 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 50820 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3609: /* opt_one_phase: ONE_SYM PHASE_SYM */ +#line 17992 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_ONE_PHASE; } +#line 50826 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3610: /* opt_suspend: %empty */ +#line 17997 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_NONE; } +#line 50832 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3611: /* $@255: %empty */ +#line 17999 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_SUSPEND; } +#line 50838 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3613: /* opt_migrate: %empty */ +#line 18004 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 50844 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3614: /* opt_migrate: FOR_SYM MIGRATE_SYM */ +#line 18005 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->xa_opt=XA_FOR_MIGRATE; } +#line 50850 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3615: /* install: INSTALL_SYM PLUGIN_SYM opt_if_not_exists ident SONAME_SYM TEXT_STRING_sys */ +#line 18010 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_install_plugin((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 50859 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3616: /* install: INSTALL_SYM SONAME_SYM TEXT_STRING_sys */ +#line 18015 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_install_plugin((yyvsp[0].lex_str)); + } +#line 50867 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3617: /* uninstall: UNINSTALL_SYM PLUGIN_SYM opt_if_exists ident */ +#line 18022 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_name((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 50876 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3618: /* uninstall: UNINSTALL_SYM SONAME_SYM opt_if_exists TEXT_STRING_sys */ +#line 18027 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_uninstall_plugin_by_soname((yyvsp[-1].object_ddl_options), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 50885 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3619: /* keep_gcc_happy: IMPOSSIBLE_ACTION */ +#line 18036 "/home/buildbot/git/sql/sql_yacc.yy" + { + YYERROR; + } +#line 50893 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3624: /* $@256: %empty */ +#line 18477 "/home/buildbot/git/sql/sql_yacc.yy" + { + // Direct procedure call (without the CALL keyword) + Lex_ident_sys tmp(thd, &(yyvsp[0].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->call_statement_start(thd, &tmp))) + MYSQL_YYABORT; + } +#line 50905 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3625: /* sp_statement: ident_cli_directly_assignable $@256 opt_sp_cparam_list */ +#line 18485 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 50914 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3626: /* $@257: %empty */ +#line 18490 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-2].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->call_statement_start(thd, &tmp, &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 50925 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3627: /* sp_statement: ident_cli_directly_assignable '.' ident $@257 opt_sp_cparam_list */ +#line 18497 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 50934 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3628: /* $@258: %empty */ +#line 18502 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-4].ident_cli)); + if (unlikely(Lex->call_statement_start(thd, &tmp, &(yyvsp[-2].ident_sys), &(yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 50944 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3629: /* sp_statement: ident_cli_directly_assignable '.' ident '.' ident $@258 opt_sp_cparam_list */ +#line 18508 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->check_cte_dependencies_and_resolve_references()) + MYSQL_YYABORT; + } +#line 50953 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3630: /* sp_if_then_statements: sp_proc_stmts1_implicit_block */ +#line 18515 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 50959 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3631: /* sp_case_then_statements: sp_proc_stmts1_implicit_block */ +#line 18519 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 50965 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3655: /* row_field_name: ident_directly_assignable */ +#line 18569 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (!((yyval.spvar_definition)= Lex->row_field_name(thd, (yyvsp[0].ident_sys)))) + MYSQL_YYABORT; + } +#line 50974 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3656: /* $@259: %empty */ +#line 18577 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyvsp[-1].expr_lex)->sp_while_loop_expression(thd))) + MYSQL_YYABORT; + } +#line 50983 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3657: /* while_body: expr_lex LOOP_SYM $@259 sp_proc_stmts1 END LOOP_SYM */ +#line 18582 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_while_loop_finalize(thd))) + MYSQL_YYABORT; + } +#line 50992 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3658: /* for_loop_statements: LOOP_SYM sp_proc_stmts1 END LOOP_SYM */ +#line 18590 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 50998 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3660: /* sp_block_label: labels_declaration_oracle */ +#line 18600 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->block_label_declare(&(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + (yyval.lex_str)= (yyvsp[0].lex_str); + } +#line 51008 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3661: /* remember_end_opt: %empty */ +#line 18609 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (yychar == YYEMPTY) + (yyval.simple_string)= (char*) YYLIP->get_cpp_ptr_rtrim(); + else + (yyval.simple_string)= (char*) YYLIP->get_cpp_tok_end_rtrim(); + } +#line 51019 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3662: /* sp_opt_default: _empty */ +#line 18618 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = NULL; } +#line 51025 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3663: /* sp_opt_default: DEFAULT expr */ +#line 18619 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item); } +#line 51031 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3664: /* sp_opt_default: SET_VAR expr */ +#line 18620 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.item) = (yyvsp[0].item); } +#line 51037 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3665: /* sp_opt_inout: _empty */ +#line 18624 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_IN; } +#line 51043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3667: /* sp_opt_inout: IN_SYM OUT_SYM */ +#line 18626 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spvar_mode)= sp_variable::MODE_INOUT; } +#line 51049 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3668: /* $@260: %empty */ +#line 18630 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51057 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3669: /* sp_proc_stmts1_implicit_block: $@260 sp_proc_stmts1 */ +#line 18634 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd))) + MYSQL_YYABORT; + } +#line 51066 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3670: /* remember_lex: %empty */ +#line 18642 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.lex)= thd->lex; + } +#line 51074 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3680: /* ident_directly_assignable: keyword_directly_assignable */ +#line 18661 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely((yyval.ident_sys).copy_keyword(thd, &(yyvsp[0].kwd)))) + MYSQL_YYABORT; + } +#line 51083 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3682: /* ident_cli_directly_assignable: keyword_directly_assignable */ +#line 18669 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.ident_cli)= (yyvsp[0].kwd); } +#line 51089 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3683: /* $@261: %empty */ +#line 18675 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + if (sp_create_assignment_lex(thd, (yyvsp[-1].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 51100 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3684: /* set_assign: ident_cli_directly_assignable SET_VAR $@261 set_expr_or_default */ +#line 18682 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex_ident_sys tmp(thd, &(yyvsp[-3].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(Lex->set_variable(&tmp, (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, + false))) + MYSQL_YYABORT; + } +#line 51113 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3685: /* $@262: %empty */ +#line 18691 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex=Lex; + lex->set_stmt_init(); + if (sp_create_assignment_lex(thd, (yyvsp[-3].ident_cli).pos())) + MYSQL_YYABORT; + } +#line 51124 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3686: /* set_assign: ident_cli_directly_assignable '.' ident SET_VAR $@262 set_expr_or_default */ +#line 18698 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + DBUG_ASSERT(lex->var_list.is_empty()); + Lex_ident_sys tmp(thd, &(yyvsp[-5].ident_cli)); + if (unlikely(!tmp.str) || + unlikely(lex->set_variable(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, + false))) + MYSQL_YYABORT; + } +#line 51139 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3687: /* $@263: %empty */ +#line 18709 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + if (unlikely(!lex->is_trigger_new_or_old_reference(&(yyvsp[-3].ident_sys)))) + { + thd->parse_error(ER_SYNTAX_ERROR, (yyvsp[-4].kwd).pos()); + MYSQL_YYABORT; + } + lex->set_stmt_init(); + if (sp_create_assignment_lex(thd, (yyvsp[-4].kwd).pos())) + MYSQL_YYABORT; + } +#line 51155 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3688: /* set_assign: COLON_ORACLE_SYM ident '.' ident SET_VAR $@263 set_expr_or_default */ +#line 18721 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX_CSTRING tmp= { (yyvsp[-5].ident_sys).str, (yyvsp[-5].ident_sys).length }; + if (unlikely(Lex->set_trigger_field(&tmp, &(yyvsp[-3].ident_sys), (yyvsp[0].item))) || + unlikely(sp_create_assignment_instr(thd, yychar == YYEMPTY, + false))) + MYSQL_YYABORT; + } +#line 51167 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3689: /* labels_declaration_oracle: label_declaration_oracle */ +#line 18732 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 51173 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3690: /* labels_declaration_oracle: labels_declaration_oracle label_declaration_oracle */ +#line 18733 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].lex_str); } +#line 51179 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3691: /* label_declaration_oracle: SHIFT_LEFT label_ident SHIFT_RIGHT */ +#line 18738 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_push_goto_label(thd, &(yyvsp[-1].ident_sys)))) + MYSQL_YYABORT; + (yyval.lex_str)= (yyvsp[-1].ident_sys); + } +#line 51189 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3692: /* opt_exception_clause: _empty */ +#line 18746 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 0; } +#line 51195 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3693: /* opt_exception_clause: EXCEPTION_ORACLE_SYM exception_handlers */ +#line 18747 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[0].num); } +#line 51201 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3694: /* exception_handlers: exception_handler */ +#line 18751 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= 1; } +#line 51207 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3695: /* exception_handlers: exception_handlers exception_handler */ +#line 18752 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.num)= (yyvsp[-1].num) + 1; } +#line 51213 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3696: /* $@264: %empty */ +#line 18757 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_init(thd, sp_handler::EXIT))) + MYSQL_YYABORT; + } +#line 51222 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3697: /* exception_handler: WHEN_SYM $@264 sp_hcond_list THEN_SYM sp_proc_stmts1_implicit_block */ +#line 18764 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_handler_declaration_finalize(thd, sp_handler::EXIT))) + MYSQL_YYABORT; + } +#line 51231 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3698: /* sp_no_param: _empty */ +#line 18772 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->m_param_begin= Lex->sphead->m_param_end= + YYLIP->get_cpp_tok_start() + 1; + } +#line 51240 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3703: /* opt_sp_name: _empty */ +#line 18790 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spname)= NULL; } +#line 51246 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3704: /* opt_sp_name: sp_name */ +#line 18791 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spname)= (yyvsp[0].spname); } +#line 51252 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3705: /* opt_package_routine_end_name: _empty */ +#line 18796 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= null_clex_str; } +#line 51258 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3706: /* opt_package_routine_end_name: ident */ +#line 18797 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.lex_str)= (yyvsp[0].ident_sys); } +#line 51264 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3709: /* sp_instr_addr: %empty */ +#line 18806 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.sp_instr_addr)= Lex->sphead->instructions(); } +#line 51270 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3710: /* $@265: %empty */ +#line 18810 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51278 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3711: /* $@266: %empty */ +#line 18814 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 51287 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3712: /* $@267: %empty */ +#line 18820 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-3].spblock).hndlrs+= (yyvsp[0].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-3].spblock)))) + MYSQL_YYABORT; + } +#line 51297 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3714: /* create_package_chistic: COMMENT_SYM TEXT_STRING_sys */ +#line 18830 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.comment= (yyvsp[0].lex_str); } +#line 51303 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3715: /* create_package_chistic: sp_suid */ +#line 18832 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.suid= (yyvsp[0].sp_suid); } +#line 51309 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3716: /* create_package_chistics: create_package_chistic */ +#line 18836 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51315 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3717: /* create_package_chistics: create_package_chistics create_package_chistic */ +#line 18837 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51321 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3719: /* opt_create_package_chistics: create_package_chistics */ +#line 18842 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51327 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3720: /* $@268: %empty */ +#line 18846 "/home/buildbot/git/sql/sql_yacc.yy" + { Lex->sp_chistics.init(); } +#line 51333 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3722: /* package_implementation_executable_section: END */ +#line 18853 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_add_empty(thd))) + MYSQL_YYABORT; + (yyval.spblock_handlers).init(0); + } +#line 51343 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3723: /* package_implementation_executable_section: BEGIN_ORACLE_SYM sp_block_statements_and_exceptions END */ +#line 18858 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock_handlers)= (yyvsp[-1].spblock_handlers); } +#line 51349 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3726: /* package_implementation_declare_section: package_implementation_declare_section_list1 package_implementation_declare_section_list2 */ +#line 18870 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).join((yyvsp[-1].spblock), (yyvsp[0].spblock)); } +#line 51355 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3728: /* package_implementation_declare_section_list1: package_implementation_declare_section_list1 package_implementation_item_declaration */ +#line 18877 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).join((yyvsp[-1].spblock), (yyvsp[0].spblock)); } +#line 51361 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3730: /* package_implementation_declare_section_list2: package_implementation_declare_section_list2 package_implementation_routine_definition */ +#line 18884 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).join((yyvsp[-1].spblock), (yyvsp[0].spblock)); } +#line 51367 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3731: /* package_routine_lex: %empty */ +#line 18888 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!((yyval.lex)= new (thd->mem_root) + sp_lex_local(thd, thd->lex)))) + MYSQL_YYABORT; + thd->m_parser_state->m_yacc.reset_before_substatement(); + } +#line 51378 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3732: /* $@269: %empty */ +#line 18899 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].lex)->sphead->get_package()); + (yyvsp[-1].lex)->sql_command= SQLCOM_CREATE_FUNCTION; + sp_name *spname= (yyvsp[-2].lex)->make_sp_name_package_routine(thd, &(yyvsp[0].ident_sys)); + if (unlikely(!spname)) + MYSQL_YYABORT; + thd->lex= (yyvsp[-1].lex); + if (unlikely(!(yyvsp[-1].lex)->make_sp_head_no_recursive(thd, spname, + &sp_handler_package_function, + NOT_AGGREGATE))) + MYSQL_YYABORT; + (yyvsp[-2].lex)->sphead->get_package()->m_current_routine= (yyvsp[-1].lex); + (void) is_native_function_with_warn(thd, &(yyvsp[0].ident_sys)); + } +#line 51397 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3733: /* package_specification_function: remember_lex package_routine_lex ident $@269 opt_sp_parenthesized_fdparam_list RETURN_ORACLE_SYM sf_return_type sp_c_chistics */ +#line 18916 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= thd->lex->sphead; + sp->restore_thd_mem_root(thd); + thd->lex= (yyvsp[-7].lex); + (yyval.lex)= (yyvsp[-6].lex); + } +#line 51408 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3734: /* $@270: %empty */ +#line 18926 "/home/buildbot/git/sql/sql_yacc.yy" + { + DBUG_ASSERT((yyvsp[-2].lex)->sphead->get_package()); + (yyvsp[-1].lex)->sql_command= SQLCOM_CREATE_PROCEDURE; + sp_name *spname= (yyvsp[-2].lex)->make_sp_name_package_routine(thd, &(yyvsp[0].ident_sys)); + if (unlikely(!spname)) + MYSQL_YYABORT; + thd->lex= (yyvsp[-1].lex); + if (unlikely(!(yyvsp[-1].lex)->make_sp_head_no_recursive(thd, spname, + &sp_handler_package_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + (yyvsp[-2].lex)->sphead->get_package()->m_current_routine= (yyvsp[-1].lex); + } +#line 51426 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3735: /* package_specification_procedure: remember_lex package_routine_lex ident $@270 opt_sp_parenthesized_pdparam_list sp_c_chistics */ +#line 18941 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_head *sp= thd->lex->sphead; + sp->restore_thd_mem_root(thd); + thd->lex= (yyvsp[-5].lex); + (yyval.lex)= (yyvsp[-4].lex); + } +#line 51437 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3736: /* package_implementation_routine_definition: FUNCTION_SYM package_specification_function package_implementation_function_body ';' */ +#line 18953 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_implementation((yyvsp[-2].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + (yyval.spblock).init(); + } +#line 51449 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3737: /* package_implementation_routine_definition: PROCEDURE_SYM package_specification_procedure package_implementation_procedure_body ';' */ +#line 18962 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_implementation((yyvsp[-2].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + (yyval.spblock).init(); + } +#line 51461 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3738: /* package_implementation_routine_definition: package_specification_element */ +#line 18969 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).init(); } +#line 51467 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3739: /* $@271: %empty */ +#line 18975 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + sp_head *sp= pkg->m_current_routine->sphead; + thd->lex= pkg->m_current_routine; + sp->reset_thd_mem_root(thd); + sp->set_c_chistics(thd->lex->sp_chistics); + sp->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51480 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3740: /* package_implementation_function_body: sp_tail_is remember_lex $@271 sp_body opt_package_routine_end_name */ +#line 18984 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->lex->sp_body_finalize_function(thd) || + thd->lex->sphead->check_package_routine_end_name((yyvsp[0].lex_str)))) + MYSQL_YYABORT; + thd->lex= (yyvsp[-3].lex); + } +#line 51491 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3741: /* $@272: %empty */ +#line 18994 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + sp_head *sp= pkg->m_current_routine->sphead; + thd->lex= pkg->m_current_routine; + sp->reset_thd_mem_root(thd); + sp->set_c_chistics(thd->lex->sp_chistics); + sp->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51504 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3742: /* package_implementation_procedure_body: sp_tail_is remember_lex $@272 sp_body opt_package_routine_end_name */ +#line 19003 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(thd->lex->sp_body_finalize_procedure(thd) || + thd->lex->sphead->check_package_routine_end_name((yyvsp[0].lex_str)))) + MYSQL_YYABORT; + thd->lex= (yyvsp[-3].lex); + } +#line 51515 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3748: /* package_specification_element: FUNCTION_SYM package_specification_function ';' */ +#line 19028 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_declaration((yyvsp[-1].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + } +#line 51526 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3749: /* package_specification_element: PROCEDURE_SYM package_specification_procedure ';' */ +#line 19035 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg= Lex->get_sp_package(); + if (unlikely(pkg->add_routine_declaration((yyvsp[-1].lex)))) + MYSQL_YYABORT; + pkg->m_current_routine= NULL; + } +#line 51537 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3750: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars optionally_qualified_column_ident PERCENT_ORACLE_SYM TYPE_SYM sp_opt_default */ +#line 19047 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_with_ref_finalize(thd, (yyvsp[-4].num), (yyvsp[-3].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-4].num)); + } +#line 51547 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3751: /* sp_decl_variable_list_anchored: sp_decl_idents_init_vars optionally_qualified_column_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM sp_opt_default */ +#line 19055 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_variable_declarations_rowtype_finalize(thd, (yyvsp[-4].num), (yyvsp[-3].qualified_column_ident), (yyvsp[0].item)))) + MYSQL_YYABORT; + (yyval.spblock).init_using_vars((yyvsp[-4].num)); + } +#line 51557 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3752: /* sp_param_name_and_mode: sp_param_name sp_opt_inout */ +#line 19064 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-1].spvar)->mode= (yyvsp[0].spvar_mode); + (yyval.spvar)= (yyvsp[-1].spvar); + } +#line 51566 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3753: /* sp_param: sp_param_name_and_mode field_type */ +#line 19072 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_param_fill_definition((yyval.spvar)= (yyvsp[-1].spvar), (yyvsp[0].Lex_field_type)))) + MYSQL_YYABORT; + } +#line 51575 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3754: /* sp_param: sp_param_name_and_mode ROW_SYM row_type_body */ +#line 19077 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_row(thd, (yyval.spvar)= (yyvsp[-2].spvar), (yyvsp[0].spvar_definition_list)))) + MYSQL_YYABORT; + } +#line 51584 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3756: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM */ +#line 19086 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, (yyval.spvar)= (yyvsp[-5].spvar), (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51593 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3757: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident '.' ident '.' ident PERCENT_ORACLE_SYM TYPE_SYM */ +#line 19091 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_type_reference(thd, (yyval.spvar)= (yyvsp[-7].spvar), (yyvsp[-6].ident_sys), (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51602 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3758: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM */ +#line 19096 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-3].spvar), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51611 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3759: /* sp_param_anchored: sp_param_name_and_mode sp_decl_ident '.' ident PERCENT_ORACLE_SYM ROWTYPE_ORACLE_SYM */ +#line 19101 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->spvar_fill_table_rowtype_reference(thd, (yyval.spvar)= (yyvsp[-5].spvar), (yyvsp[-4].ident_sys), (yyvsp[-2].ident_sys)))) + MYSQL_YYABORT; + } +#line 51620 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3760: /* $@273: %empty */ +#line 19110 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= thd->lex; + lex->sphead->set_c_chistics(lex->sp_chistics); + lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51630 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3761: /* sf_c_chistics_and_body_standalone: sp_c_chistics $@273 sp_tail_is sp_body force_lookahead */ +#line 19116 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_function(thd))) + MYSQL_YYABORT; + } +#line 51639 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3762: /* $@274: %empty */ +#line 19124 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(!Lex->make_sp_head_no_recursive(thd, (yyvsp[0].spname), + &sp_handler_procedure, + DEFAULT_AGGREGATE))) + MYSQL_YYABORT; + } +#line 51650 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3763: /* $@275: %empty */ +#line 19132 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sphead->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51659 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3764: /* sp_tail_standalone: sp_name $@274 opt_sp_parenthesized_pdparam_list sp_c_chistics $@275 sp_tail_is sp_body opt_sp_name */ +#line 19139 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_body_finalize_procedure_standalone(thd, (yyvsp[0].spname)))) + MYSQL_YYABORT; + } +#line 51668 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3765: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident '.' ident */ +#line 19147 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-3].object_ddl_options), (yyvsp[-2].ident_sys), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51677 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3766: /* drop_routine: DROP FUNCTION_SYM opt_if_exists ident */ +#line 19152 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_function((yyvsp[-1].object_ddl_options), (yyvsp[0].ident_sys))) + MYSQL_YYABORT; + } +#line 51686 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3767: /* drop_routine: DROP PROCEDURE_SYM opt_if_exists sp_name */ +#line 19157 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_drop_procedure((yyvsp[-1].object_ddl_options), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51695 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3768: /* drop_routine: DROP PACKAGE_ORACLE_SYM opt_if_exists sp_name */ +#line 19162 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_PACKAGE, (yyvsp[-1].object_ddl_options)); + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "PACKAGE")); + lex->spname= (yyvsp[0].spname); + } +#line 51707 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3769: /* drop_routine: DROP PACKAGE_ORACLE_SYM BODY_ORACLE_SYM opt_if_exists sp_name */ +#line 19170 "/home/buildbot/git/sql/sql_yacc.yy" + { + LEX *lex= Lex; + lex->set_command(SQLCOM_DROP_PACKAGE_BODY, (yyvsp[-1].object_ddl_options)); + if (unlikely(lex->sphead)) + my_yyabort_error((ER_SP_NO_DROP_SP, MYF(0), "PACKAGE BODY")); + lex->spname= (yyvsp[0].spname); + } +#line 51719 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3770: /* $@276: %empty */ +#line 19182 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_procedure_start((yyvsp[-3].object_ddl_options) | (yyvsp[0].object_ddl_options))) + MYSQL_YYABORT; + } +#line 51728 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3771: /* create_routine: create_or_replace definer_opt PROCEDURE_SYM opt_if_not_exists $@276 sp_tail_standalone */ +#line 19187 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->stmt_create_routine_finalize(); + } +#line 51736 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3772: /* $@277: %empty */ +#line 19192 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51745 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3773: /* create_routine: create_or_replace definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@277 opt_sp_parenthesized_fdparam_list RETURN_ORACLE_SYM sf_return_type sf_c_chistics_and_body_standalone opt_sp_name */ +#line 19200 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_finalize_standalone((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51754 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3774: /* $@278: %empty */ +#line 19206 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_start((yyvsp[-5].object_ddl_options) | (yyvsp[-1].object_ddl_options), (yyvsp[-3].sp_aggregate_type), (yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51763 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3775: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists sp_name $@278 opt_sp_parenthesized_fdparam_list RETURN_ORACLE_SYM sf_return_type sf_c_chistics_and_body_standalone opt_sp_name */ +#line 19214 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_stored_function_finalize_standalone((yyvsp[0].spname))) + MYSQL_YYABORT; + } +#line 51772 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3776: /* create_routine: create_or_replace no_definer opt_aggregate FUNCTION_SYM opt_if_not_exists ident RETURNS_SYM udf_type SONAME_SYM TEXT_STRING_sys */ +#line 19220 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (Lex->stmt_create_udf_function((yyvsp[-9].object_ddl_options) | (yyvsp[-5].object_ddl_options), (yyvsp[-7].sp_aggregate_type), (yyvsp[-4].ident_sys), + (Item_result) (yyvsp[-2].num), (yyvsp[0].lex_str))) + MYSQL_YYABORT; + } +#line 51782 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3777: /* $@279: %empty */ +#line 19227 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg; + if (unlikely(!(pkg= Lex-> + create_package_start(thd, + SQLCOM_CREATE_PACKAGE, + &sp_handler_package_spec, + (yyvsp[-1].spname), (yyvsp[-5].object_ddl_options) | (yyvsp[-2].object_ddl_options))))) + MYSQL_YYABORT; + pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + } +#line 51798 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3778: /* create_routine: create_or_replace definer_opt PACKAGE_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init $@279 sp_tail_is opt_package_specification_element_list END remember_end_opt opt_sp_name */ +#line 19241 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_package_finalize(thd, (yyvsp[-7].spname), (yyvsp[0].spname), (yyvsp[-1].simple_string)))) + MYSQL_YYABORT; + } +#line 51807 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3779: /* $@280: %empty */ +#line 19247 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_package *pkg; + if (unlikely(!(pkg= Lex-> + create_package_start(thd, + SQLCOM_CREATE_PACKAGE_BODY, + &sp_handler_package_body, + (yyvsp[-1].spname), (yyvsp[-6].object_ddl_options) | (yyvsp[-2].object_ddl_options))))) + MYSQL_YYABORT; + pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); + Lex->sp_block_init(thd); + } +#line 51824 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3780: /* $@281: %empty */ +#line 19261 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 51833 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3781: /* $@282: %empty */ +#line 19266 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-2].spblock).hndlrs+= (yyvsp[0].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-2].spblock)))) + MYSQL_YYABORT; + } +#line 51843 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3782: /* create_routine: create_or_replace definer_opt PACKAGE_ORACLE_SYM BODY_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init $@280 sp_tail_is package_implementation_declare_section $@281 package_implementation_executable_section $@282 remember_end_opt opt_sp_name */ +#line 19272 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->create_package_finalize(thd, (yyvsp[-9].spname), (yyvsp[0].spname), (yyvsp[-1].simple_string)))) + MYSQL_YYABORT; + } +#line 51852 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3783: /* opt_sp_decl_body_list: _empty */ +#line 19280 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).init(); + } +#line 51860 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3784: /* opt_sp_decl_body_list: sp_decl_body_list */ +#line 19283 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[0].spblock); } +#line 51866 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3785: /* $@283: %empty */ +#line 19288 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sphead->sp_add_instr_cpush_for_cursors(thd, Lex->spcont))) + MYSQL_YYABORT; + } +#line 51875 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3786: /* sp_decl_body_list: sp_decl_non_handler_list $@283 opt_sp_decl_handler_list */ +#line 19293 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).join((yyvsp[-2].spblock), (yyvsp[0].spblock)); + } +#line 51883 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3788: /* sp_decl_non_handler_list: sp_decl_non_handler ';' */ +#line 19300 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[-1].spblock); } +#line 51889 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3789: /* sp_decl_non_handler_list: sp_decl_non_handler_list sp_decl_non_handler ';' */ +#line 19302 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).join((yyvsp[-2].spblock), (yyvsp[-1].spblock)); + } +#line 51897 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3790: /* sp_decl_handler_list: sp_decl_handler ';' */ +#line 19308 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock)= (yyvsp[-1].spblock); } +#line 51903 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3791: /* sp_decl_handler_list: sp_decl_handler_list sp_decl_handler ';' */ +#line 19310 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyval.spblock).join((yyvsp[-2].spblock), (yyvsp[-1].spblock)); + } +#line 51911 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3792: /* opt_sp_decl_handler_list: _empty */ +#line 19316 "/home/buildbot/git/sql/sql_yacc.yy" + { (yyval.spblock).init(); } +#line 51917 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3795: /* sp_decl_non_handler: ident_directly_assignable CONDITION_SYM FOR_SYM sp_cond */ +#line 19323 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->spcont->declare_condition(thd, &(yyvsp[-3].ident_sys), (yyvsp[0].spcondvalue)))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; + (yyval.spblock).conds= 1; + } +#line 51928 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3796: /* sp_decl_non_handler: ident_directly_assignable EXCEPTION_ORACLE_SYM */ +#line 19330 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_condition_value *spcond= new (thd->mem_root) + sp_condition_value_user_defined(); + if (unlikely(!spcond) || + unlikely(Lex->spcont->declare_condition(thd, &(yyvsp[-1].ident_sys), spcond))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).hndlrs= (yyval.spblock).curs= 0; + (yyval.spblock).conds= 1; + } +#line 51942 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3797: /* $@284: %empty */ +#line 19340 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd); + } +#line 51950 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3798: /* sp_decl_non_handler: CURSOR_SYM ident_directly_assignable $@284 opt_parenthesized_cursor_formal_parameters IS sp_cursor_stmt */ +#line 19345 "/home/buildbot/git/sql/sql_yacc.yy" + { + sp_pcontext *param_ctx= Lex->spcont; + if (unlikely(Lex->sp_block_finalize(thd))) + MYSQL_YYABORT; + if (unlikely(Lex->sp_declare_cursor(thd, &(yyvsp[-4].ident_sys), (yyvsp[0].sp_cursor_stmt), param_ctx, false))) + MYSQL_YYABORT; + (yyval.spblock).vars= (yyval.spblock).conds= (yyval.spblock).hndlrs= 0; + (yyval.spblock).curs= 1; + } +#line 51964 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3804: /* sp_proc_stmt: labels_declaration_oracle sp_labelable_stmt */ +#line 19363 "/home/buildbot/git/sql/sql_yacc.yy" + {} +#line 51970 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3815: /* sp_labelable_stmt: NULL_SYM */ +#line 19377 "/home/buildbot/git/sql/sql_yacc.yy" + { } +#line 51976 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3820: /* $@285: %empty */ +#line 19391 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd, &(yyvsp[-1].lex_str)); + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 51986 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3821: /* sp_labeled_block: sp_block_label BEGIN_ORACLE_SYM $@285 sp_block_statements_and_exceptions END sp_opt_label */ +#line 19399 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, Lex_spblock((yyvsp[-2].spblock_handlers)), &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 51995 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3822: /* $@286: %empty */ +#line 19405 "/home/buildbot/git/sql/sql_yacc.yy" + { + Lex->sp_block_init(thd, &(yyvsp[-1].lex_str)); + } +#line 52003 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3823: /* $@287: %empty */ +#line 19409 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 52012 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3824: /* sp_labeled_block: sp_block_label DECLARE_ORACLE_SYM $@286 opt_sp_decl_body_list $@287 BEGIN_ORACLE_SYM sp_block_statements_and_exceptions END sp_opt_label */ +#line 19417 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-5].spblock).hndlrs+= (yyvsp[-2].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-5].spblock), &(yyvsp[0].lex_str)))) + MYSQL_YYABORT; + } +#line 52022 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3827: /* $@288: %empty */ +#line 19431 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 52034 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3828: /* sp_unlabeled_block: BEGIN_ORACLE_SYM opt_not_atomic $@288 sp_block_statements_and_exceptions END */ +#line 19440 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_finalize(thd, Lex_spblock((yyvsp[-1].spblock_handlers))))) + MYSQL_YYABORT; + } +#line 52043 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3829: /* $@289: %empty */ +#line 19445 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->maybe_start_compound_statement(thd))) + MYSQL_YYABORT; + Lex->sp_block_init(thd); + } +#line 52053 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3830: /* $@290: %empty */ +#line 19451 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) + MYSQL_YYABORT; + } +#line 52062 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3831: /* sp_unlabeled_block: DECLARE_ORACLE_SYM $@289 opt_sp_decl_body_list $@290 BEGIN_ORACLE_SYM sp_block_statements_and_exceptions END */ +#line 19458 "/home/buildbot/git/sql/sql_yacc.yy" + { + (yyvsp[-4].spblock).hndlrs+= (yyvsp[-1].spblock_handlers).hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, (yyvsp[-4].spblock)))) + MYSQL_YYABORT; + } +#line 52072 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3832: /* $@291: %empty */ +#line 19468 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_executable_section(thd, (yyvsp[-1].sp_instr_addr)))) + MYSQL_YYABORT; + } +#line 52081 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + case 3833: /* sp_block_statements_and_exceptions: sp_instr_addr sp_proc_stmts $@291 opt_exception_clause */ +#line 19473 "/home/buildbot/git/sql/sql_yacc.yy" + { + if (unlikely(Lex->sp_block_with_exceptions_finalize_exceptions(thd, (yyvsp[-3].sp_instr_addr), (yyvsp[0].num)))) + MYSQL_YYABORT; + (yyval.spblock_handlers).init((yyvsp[0].num)); + } +#line 52091 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + break; + + +#line 52095 "/home/buildbot/git/mkdist/sql/yy_oracle.cc" + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + yyerror (thd, YY_("syntax error")); + } + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, thd); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + /* Pop stack until we find a state that shifts the error token. */ + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + YY_ACCESSING_SYMBOL (yystate), yyvsp, thd); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturnlab; + + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturnlab; + + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ +yyexhaustedlab: + yyerror (thd, YY_("memory exhausted")); + yyresult = 2; + goto yyreturnlab; + + +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, thd); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, thd); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + + return yyresult; +} + diff -Nru mariadb-10.11.6/sql/yy_oracle.hh mariadb-10.11.9/sql/yy_oracle.hh --- mariadb-10.11.6/sql/yy_oracle.hh 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/sql/yy_oracle.hh 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1,981 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + 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 3 of the License, 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_ORA_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_ORACLE_HH_INCLUDED +# define YY_ORA_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_ORACLE_HH_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int ORAdebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + ABORT_SYM = 258, /* ABORT_SYM */ + IMPOSSIBLE_ACTION = 259, /* IMPOSSIBLE_ACTION */ + FORCE_LOOKAHEAD = 260, /* FORCE_LOOKAHEAD */ + END_OF_INPUT = 261, /* END_OF_INPUT */ + COLON_ORACLE_SYM = 262, /* COLON_ORACLE_SYM */ + PARAM_MARKER = 263, /* PARAM_MARKER */ + FOR_SYSTEM_TIME_SYM = 264, /* FOR_SYSTEM_TIME_SYM */ + LEFT_PAREN_ALT = 265, /* LEFT_PAREN_ALT */ + LEFT_PAREN_WITH = 266, /* LEFT_PAREN_WITH */ + LEFT_PAREN_LIKE = 267, /* LEFT_PAREN_LIKE */ + ORACLE_CONCAT_SYM = 268, /* ORACLE_CONCAT_SYM */ + PERCENT_ORACLE_SYM = 269, /* PERCENT_ORACLE_SYM */ + WITH_CUBE_SYM = 270, /* WITH_CUBE_SYM */ + WITH_ROLLUP_SYM = 271, /* WITH_ROLLUP_SYM */ + WITH_SYSTEM_SYM = 272, /* WITH_SYSTEM_SYM */ + IDENT = 273, /* IDENT */ + IDENT_QUOTED = 274, /* IDENT_QUOTED */ + LEX_HOSTNAME = 275, /* LEX_HOSTNAME */ + UNDERSCORE_CHARSET = 276, /* UNDERSCORE_CHARSET */ + BIN_NUM = 277, /* BIN_NUM */ + DECIMAL_NUM = 278, /* DECIMAL_NUM */ + FLOAT_NUM = 279, /* FLOAT_NUM */ + HEX_NUM = 280, /* HEX_NUM */ + HEX_STRING = 281, /* HEX_STRING */ + LONG_NUM = 282, /* LONG_NUM */ + NCHAR_STRING = 283, /* NCHAR_STRING */ + NUM = 284, /* NUM */ + TEXT_STRING = 285, /* TEXT_STRING */ + ULONGLONG_NUM = 286, /* ULONGLONG_NUM */ + AND_AND_SYM = 287, /* AND_AND_SYM */ + DOT_DOT_SYM = 288, /* DOT_DOT_SYM */ + EQUAL_SYM = 289, /* EQUAL_SYM */ + GE = 290, /* GE */ + LE = 291, /* LE */ + MYSQL_CONCAT_SYM = 292, /* MYSQL_CONCAT_SYM */ + NE = 293, /* NE */ + NOT2_SYM = 294, /* NOT2_SYM */ + OR2_SYM = 295, /* OR2_SYM */ + SET_VAR = 296, /* SET_VAR */ + SHIFT_LEFT = 297, /* SHIFT_LEFT */ + SHIFT_RIGHT = 298, /* SHIFT_RIGHT */ + ACCESSIBLE_SYM = 299, /* ACCESSIBLE_SYM */ + ADD = 300, /* ADD */ + ALL = 301, /* ALL */ + ALTER = 302, /* ALTER */ + ANALYZE_SYM = 303, /* ANALYZE_SYM */ + AND_SYM = 304, /* AND_SYM */ + ASC = 305, /* ASC */ + ASENSITIVE_SYM = 306, /* ASENSITIVE_SYM */ + AS = 307, /* AS */ + BEFORE_SYM = 308, /* BEFORE_SYM */ + BETWEEN_SYM = 309, /* BETWEEN_SYM */ + BIGINT = 310, /* BIGINT */ + BINARY = 311, /* BINARY */ + BIT_AND = 312, /* BIT_AND */ + BIT_OR = 313, /* BIT_OR */ + BIT_XOR = 314, /* BIT_XOR */ + BLOB_MARIADB_SYM = 315, /* BLOB_MARIADB_SYM */ + BLOB_ORACLE_SYM = 316, /* BLOB_ORACLE_SYM */ + BODY_ORACLE_SYM = 317, /* BODY_ORACLE_SYM */ + BOTH = 318, /* BOTH */ + BY = 319, /* BY */ + CALL_SYM = 320, /* CALL_SYM */ + CASCADE = 321, /* CASCADE */ + CASE_SYM = 322, /* CASE_SYM */ + CAST_SYM = 323, /* CAST_SYM */ + CHANGE = 324, /* CHANGE */ + CHAR_SYM = 325, /* CHAR_SYM */ + CHECK_SYM = 326, /* CHECK_SYM */ + COLLATE_SYM = 327, /* COLLATE_SYM */ + CONDITION_SYM = 328, /* CONDITION_SYM */ + CONSTRAINT = 329, /* CONSTRAINT */ + CONTINUE_MARIADB_SYM = 330, /* CONTINUE_MARIADB_SYM */ + CONTINUE_ORACLE_SYM = 331, /* CONTINUE_ORACLE_SYM */ + CONVERT_SYM = 332, /* CONVERT_SYM */ + COUNT_SYM = 333, /* COUNT_SYM */ + CREATE = 334, /* CREATE */ + CROSS = 335, /* CROSS */ + CUME_DIST_SYM = 336, /* CUME_DIST_SYM */ + CURDATE = 337, /* CURDATE */ + CURRENT_ROLE = 338, /* CURRENT_ROLE */ + CURRENT_USER = 339, /* CURRENT_USER */ + CURSOR_SYM = 340, /* CURSOR_SYM */ + CURTIME = 341, /* CURTIME */ + DATABASE = 342, /* DATABASE */ + DATABASES = 343, /* DATABASES */ + DATE_ADD_INTERVAL = 344, /* DATE_ADD_INTERVAL */ + DATE_SUB_INTERVAL = 345, /* DATE_SUB_INTERVAL */ + DAY_HOUR_SYM = 346, /* DAY_HOUR_SYM */ + DAY_MICROSECOND_SYM = 347, /* DAY_MICROSECOND_SYM */ + DAY_MINUTE_SYM = 348, /* DAY_MINUTE_SYM */ + DAY_SECOND_SYM = 349, /* DAY_SECOND_SYM */ + DECIMAL_SYM = 350, /* DECIMAL_SYM */ + DECLARE_MARIADB_SYM = 351, /* DECLARE_MARIADB_SYM */ + DECLARE_ORACLE_SYM = 352, /* DECLARE_ORACLE_SYM */ + DEFAULT = 353, /* DEFAULT */ + DELETE_DOMAIN_ID_SYM = 354, /* DELETE_DOMAIN_ID_SYM */ + DELETE_SYM = 355, /* DELETE_SYM */ + DENSE_RANK_SYM = 356, /* DENSE_RANK_SYM */ + DESCRIBE = 357, /* DESCRIBE */ + DESC = 358, /* DESC */ + DETERMINISTIC_SYM = 359, /* DETERMINISTIC_SYM */ + DISTINCT = 360, /* DISTINCT */ + DIV_SYM = 361, /* DIV_SYM */ + DO_DOMAIN_IDS_SYM = 362, /* DO_DOMAIN_IDS_SYM */ + DOUBLE_SYM = 363, /* DOUBLE_SYM */ + DROP = 364, /* DROP */ + DUAL_SYM = 365, /* DUAL_SYM */ + EACH_SYM = 366, /* EACH_SYM */ + ELSEIF_MARIADB_SYM = 367, /* ELSEIF_MARIADB_SYM */ + ELSE = 368, /* ELSE */ + ELSIF_ORACLE_SYM = 369, /* ELSIF_ORACLE_SYM */ + EMPTY_SYM = 370, /* EMPTY_SYM */ + ENCLOSED = 371, /* ENCLOSED */ + ESCAPED = 372, /* ESCAPED */ + EXCEPT_SYM = 373, /* EXCEPT_SYM */ + EXISTS = 374, /* EXISTS */ + EXTRACT_SYM = 375, /* EXTRACT_SYM */ + FALSE_SYM = 376, /* FALSE_SYM */ + FETCH_SYM = 377, /* FETCH_SYM */ + FIRST_VALUE_SYM = 378, /* FIRST_VALUE_SYM */ + FLOAT_SYM = 379, /* FLOAT_SYM */ + FOREIGN = 380, /* FOREIGN */ + FOR_SYM = 381, /* FOR_SYM */ + FROM = 382, /* FROM */ + FULLTEXT_SYM = 383, /* FULLTEXT_SYM */ + GOTO_ORACLE_SYM = 384, /* GOTO_ORACLE_SYM */ + GRANT = 385, /* GRANT */ + GROUP_CONCAT_SYM = 386, /* GROUP_CONCAT_SYM */ + JSON_ARRAYAGG_SYM = 387, /* JSON_ARRAYAGG_SYM */ + JSON_OBJECTAGG_SYM = 388, /* JSON_OBJECTAGG_SYM */ + JSON_TABLE_SYM = 389, /* JSON_TABLE_SYM */ + GROUP_SYM = 390, /* GROUP_SYM */ + HAVING = 391, /* HAVING */ + HOUR_MICROSECOND_SYM = 392, /* HOUR_MICROSECOND_SYM */ + HOUR_MINUTE_SYM = 393, /* HOUR_MINUTE_SYM */ + HOUR_SECOND_SYM = 394, /* HOUR_SECOND_SYM */ + IF_SYM = 395, /* IF_SYM */ + IGNORE_DOMAIN_IDS_SYM = 396, /* IGNORE_DOMAIN_IDS_SYM */ + IGNORE_SYM = 397, /* IGNORE_SYM */ + IGNORED_SYM = 398, /* IGNORED_SYM */ + INDEX_SYM = 399, /* INDEX_SYM */ + INFILE = 400, /* INFILE */ + INNER_SYM = 401, /* INNER_SYM */ + INOUT_SYM = 402, /* INOUT_SYM */ + INSENSITIVE_SYM = 403, /* INSENSITIVE_SYM */ + INSERT = 404, /* INSERT */ + IN_SYM = 405, /* IN_SYM */ + INTERSECT_SYM = 406, /* INTERSECT_SYM */ + INTERVAL_SYM = 407, /* INTERVAL_SYM */ + INTO = 408, /* INTO */ + INT_SYM = 409, /* INT_SYM */ + IS = 410, /* IS */ + ITERATE_SYM = 411, /* ITERATE_SYM */ + JOIN_SYM = 412, /* JOIN_SYM */ + KEYS = 413, /* KEYS */ + KEY_SYM = 414, /* KEY_SYM */ + KILL_SYM = 415, /* KILL_SYM */ + LAG_SYM = 416, /* LAG_SYM */ + LEADING = 417, /* LEADING */ + LEAD_SYM = 418, /* LEAD_SYM */ + LEAVE_SYM = 419, /* LEAVE_SYM */ + LEFT = 420, /* LEFT */ + LIKE = 421, /* LIKE */ + LIMIT = 422, /* LIMIT */ + LINEAR_SYM = 423, /* LINEAR_SYM */ + LINES = 424, /* LINES */ + LOAD = 425, /* LOAD */ + LOCATOR_SYM = 426, /* LOCATOR_SYM */ + LOCK_SYM = 427, /* LOCK_SYM */ + LONGBLOB = 428, /* LONGBLOB */ + LONG_SYM = 429, /* LONG_SYM */ + LONGTEXT = 430, /* LONGTEXT */ + LOOP_SYM = 431, /* LOOP_SYM */ + LOW_PRIORITY = 432, /* LOW_PRIORITY */ + MASTER_SSL_VERIFY_SERVER_CERT_SYM = 433, /* MASTER_SSL_VERIFY_SERVER_CERT_SYM */ + MATCH = 434, /* MATCH */ + MAX_SYM = 435, /* MAX_SYM */ + MAXVALUE_SYM = 436, /* MAXVALUE_SYM */ + MEDIAN_SYM = 437, /* MEDIAN_SYM */ + MEDIUMBLOB = 438, /* MEDIUMBLOB */ + MEDIUMINT = 439, /* MEDIUMINT */ + MEDIUMTEXT = 440, /* MEDIUMTEXT */ + MIN_SYM = 441, /* MIN_SYM */ + MINUS_ORACLE_SYM = 442, /* MINUS_ORACLE_SYM */ + MINUTE_MICROSECOND_SYM = 443, /* MINUTE_MICROSECOND_SYM */ + MINUTE_SECOND_SYM = 444, /* MINUTE_SECOND_SYM */ + MODIFIES_SYM = 445, /* MODIFIES_SYM */ + MOD_SYM = 446, /* MOD_SYM */ + NATURAL = 447, /* NATURAL */ + NEG = 448, /* NEG */ + NESTED_SYM = 449, /* NESTED_SYM */ + NOT_SYM = 450, /* NOT_SYM */ + NO_WRITE_TO_BINLOG = 451, /* NO_WRITE_TO_BINLOG */ + NOW_SYM = 452, /* NOW_SYM */ + NTH_VALUE_SYM = 453, /* NTH_VALUE_SYM */ + NTILE_SYM = 454, /* NTILE_SYM */ + NULL_SYM = 455, /* NULL_SYM */ + NUMERIC_SYM = 456, /* NUMERIC_SYM */ + ON = 457, /* ON */ + OPTIMIZE = 458, /* OPTIMIZE */ + OPTIONALLY = 459, /* OPTIONALLY */ + ORDER_SYM = 460, /* ORDER_SYM */ + ORDINALITY_SYM = 461, /* ORDINALITY_SYM */ + OR_SYM = 462, /* OR_SYM */ + OTHERS_ORACLE_SYM = 463, /* OTHERS_ORACLE_SYM */ + OUTER = 464, /* OUTER */ + OUTFILE = 465, /* OUTFILE */ + OUT_SYM = 466, /* OUT_SYM */ + OVER_SYM = 467, /* OVER_SYM */ + PACKAGE_ORACLE_SYM = 468, /* PACKAGE_ORACLE_SYM */ + PAGE_CHECKSUM_SYM = 469, /* PAGE_CHECKSUM_SYM */ + PARSE_VCOL_EXPR_SYM = 470, /* PARSE_VCOL_EXPR_SYM */ + PARTITION_SYM = 471, /* PARTITION_SYM */ + PATH_SYM = 472, /* PATH_SYM */ + PERCENTILE_CONT_SYM = 473, /* PERCENTILE_CONT_SYM */ + PERCENTILE_DISC_SYM = 474, /* PERCENTILE_DISC_SYM */ + PERCENT_RANK_SYM = 475, /* PERCENT_RANK_SYM */ + PORTION_SYM = 476, /* PORTION_SYM */ + POSITION_SYM = 477, /* POSITION_SYM */ + PRECISION = 478, /* PRECISION */ + PRIMARY_SYM = 479, /* PRIMARY_SYM */ + PROCEDURE_SYM = 480, /* PROCEDURE_SYM */ + PURGE = 481, /* PURGE */ + RAISE_ORACLE_SYM = 482, /* RAISE_ORACLE_SYM */ + RANGE_SYM = 483, /* RANGE_SYM */ + RANK_SYM = 484, /* RANK_SYM */ + READS_SYM = 485, /* READS_SYM */ + READ_SYM = 486, /* READ_SYM */ + READ_WRITE_SYM = 487, /* READ_WRITE_SYM */ + REAL = 488, /* REAL */ + RECURSIVE_SYM = 489, /* RECURSIVE_SYM */ + REFERENCES = 490, /* REFERENCES */ + REF_SYSTEM_ID_SYM = 491, /* REF_SYSTEM_ID_SYM */ + REGEXP = 492, /* REGEXP */ + RELEASE_SYM = 493, /* RELEASE_SYM */ + RENAME = 494, /* RENAME */ + REPEAT_SYM = 495, /* REPEAT_SYM */ + REQUIRE_SYM = 496, /* REQUIRE_SYM */ + RESIGNAL_SYM = 497, /* RESIGNAL_SYM */ + RESTRICT = 498, /* RESTRICT */ + RETURNING_SYM = 499, /* RETURNING_SYM */ + RETURN_MARIADB_SYM = 500, /* RETURN_MARIADB_SYM */ + RETURN_ORACLE_SYM = 501, /* RETURN_ORACLE_SYM */ + REVOKE = 502, /* REVOKE */ + RIGHT = 503, /* RIGHT */ + ROW_NUMBER_SYM = 504, /* ROW_NUMBER_SYM */ + ROWS_SYM = 505, /* ROWS_SYM */ + ROWTYPE_ORACLE_SYM = 506, /* ROWTYPE_ORACLE_SYM */ + SECOND_MICROSECOND_SYM = 507, /* SECOND_MICROSECOND_SYM */ + SELECT_SYM = 508, /* SELECT_SYM */ + SENSITIVE_SYM = 509, /* SENSITIVE_SYM */ + SEPARATOR_SYM = 510, /* SEPARATOR_SYM */ + SERVER_OPTIONS = 511, /* SERVER_OPTIONS */ + SET = 512, /* SET */ + SHOW = 513, /* SHOW */ + SIGNAL_SYM = 514, /* SIGNAL_SYM */ + SMALLINT = 515, /* SMALLINT */ + SPATIAL_SYM = 516, /* SPATIAL_SYM */ + SPECIFIC_SYM = 517, /* SPECIFIC_SYM */ + SQL_BIG_RESULT = 518, /* SQL_BIG_RESULT */ + SQLEXCEPTION_SYM = 519, /* SQLEXCEPTION_SYM */ + SQL_SMALL_RESULT = 520, /* SQL_SMALL_RESULT */ + SQLSTATE_SYM = 521, /* SQLSTATE_SYM */ + SQL_SYM = 522, /* SQL_SYM */ + SQLWARNING_SYM = 523, /* SQLWARNING_SYM */ + SSL_SYM = 524, /* SSL_SYM */ + STARTING = 525, /* STARTING */ + STATS_AUTO_RECALC_SYM = 526, /* STATS_AUTO_RECALC_SYM */ + STATS_PERSISTENT_SYM = 527, /* STATS_PERSISTENT_SYM */ + STATS_SAMPLE_PAGES_SYM = 528, /* STATS_SAMPLE_PAGES_SYM */ + STDDEV_SAMP_SYM = 529, /* STDDEV_SAMP_SYM */ + STD_SYM = 530, /* STD_SYM */ + STRAIGHT_JOIN = 531, /* STRAIGHT_JOIN */ + SUM_SYM = 532, /* SUM_SYM */ + SYSDATE = 533, /* SYSDATE */ + TABLE_REF_PRIORITY = 534, /* TABLE_REF_PRIORITY */ + TABLE_SYM = 535, /* TABLE_SYM */ + TERMINATED = 536, /* TERMINATED */ + THEN_SYM = 537, /* THEN_SYM */ + TINYBLOB = 538, /* TINYBLOB */ + TINYINT = 539, /* TINYINT */ + TINYTEXT = 540, /* TINYTEXT */ + TO_SYM = 541, /* TO_SYM */ + TRAILING = 542, /* TRAILING */ + TRIGGER_SYM = 543, /* TRIGGER_SYM */ + TRUE_SYM = 544, /* TRUE_SYM */ + UNDO_SYM = 545, /* UNDO_SYM */ + UNION_SYM = 546, /* UNION_SYM */ + UNIQUE_SYM = 547, /* UNIQUE_SYM */ + UNLOCK_SYM = 548, /* UNLOCK_SYM */ + UNSIGNED = 549, /* UNSIGNED */ + UPDATE_SYM = 550, /* UPDATE_SYM */ + USAGE = 551, /* USAGE */ + USE_SYM = 552, /* USE_SYM */ + USING = 553, /* USING */ + UTC_DATE_SYM = 554, /* UTC_DATE_SYM */ + UTC_TIMESTAMP_SYM = 555, /* UTC_TIMESTAMP_SYM */ + UTC_TIME_SYM = 556, /* UTC_TIME_SYM */ + VALUES_IN_SYM = 557, /* VALUES_IN_SYM */ + VALUES_LESS_SYM = 558, /* VALUES_LESS_SYM */ + VALUES = 559, /* VALUES */ + VARBINARY = 560, /* VARBINARY */ + VARCHAR = 561, /* VARCHAR */ + VARIANCE_SYM = 562, /* VARIANCE_SYM */ + VAR_SAMP_SYM = 563, /* VAR_SAMP_SYM */ + VARYING = 564, /* VARYING */ + WHEN_SYM = 565, /* WHEN_SYM */ + WHERE = 566, /* WHERE */ + WHILE_SYM = 567, /* WHILE_SYM */ + WITH = 568, /* WITH */ + XOR = 569, /* XOR */ + YEAR_MONTH_SYM = 570, /* YEAR_MONTH_SYM */ + ZEROFILL = 571, /* ZEROFILL */ + BODY_MARIADB_SYM = 572, /* BODY_MARIADB_SYM */ + ELSEIF_ORACLE_SYM = 573, /* ELSEIF_ORACLE_SYM */ + ELSIF_MARIADB_SYM = 574, /* ELSIF_MARIADB_SYM */ + EXCEPTION_ORACLE_SYM = 575, /* EXCEPTION_ORACLE_SYM */ + GOTO_MARIADB_SYM = 576, /* GOTO_MARIADB_SYM */ + OTHERS_MARIADB_SYM = 577, /* OTHERS_MARIADB_SYM */ + PACKAGE_MARIADB_SYM = 578, /* PACKAGE_MARIADB_SYM */ + RAISE_MARIADB_SYM = 579, /* RAISE_MARIADB_SYM */ + ROWTYPE_MARIADB_SYM = 580, /* ROWTYPE_MARIADB_SYM */ + ROWNUM_SYM = 581, /* ROWNUM_SYM */ + REPLACE = 582, /* REPLACE */ + SUBSTRING = 583, /* SUBSTRING */ + TRIM = 584, /* TRIM */ + ACCOUNT_SYM = 585, /* ACCOUNT_SYM */ + ACTION = 586, /* ACTION */ + ADMIN_SYM = 587, /* ADMIN_SYM */ + ADDDATE_SYM = 588, /* ADDDATE_SYM */ + AFTER_SYM = 589, /* AFTER_SYM */ + AGAINST = 590, /* AGAINST */ + AGGREGATE_SYM = 591, /* AGGREGATE_SYM */ + ALGORITHM_SYM = 592, /* ALGORITHM_SYM */ + ALWAYS_SYM = 593, /* ALWAYS_SYM */ + ANY_SYM = 594, /* ANY_SYM */ + ASCII_SYM = 595, /* ASCII_SYM */ + AT_SYM = 596, /* AT_SYM */ + ATOMIC_SYM = 597, /* ATOMIC_SYM */ + AUTHORS_SYM = 598, /* AUTHORS_SYM */ + AUTOEXTEND_SIZE_SYM = 599, /* AUTOEXTEND_SIZE_SYM */ + AUTO_INC = 600, /* AUTO_INC */ + AUTO_SYM = 601, /* AUTO_SYM */ + AVG_ROW_LENGTH = 602, /* AVG_ROW_LENGTH */ + AVG_SYM = 603, /* AVG_SYM */ + BACKUP_SYM = 604, /* BACKUP_SYM */ + BEGIN_MARIADB_SYM = 605, /* BEGIN_MARIADB_SYM */ + BEGIN_ORACLE_SYM = 606, /* BEGIN_ORACLE_SYM */ + BINLOG_SYM = 607, /* BINLOG_SYM */ + BIT_SYM = 608, /* BIT_SYM */ + BLOCK_SYM = 609, /* BLOCK_SYM */ + BOOL_SYM = 610, /* BOOL_SYM */ + BOOLEAN_SYM = 611, /* BOOLEAN_SYM */ + BTREE_SYM = 612, /* BTREE_SYM */ + BYTE_SYM = 613, /* BYTE_SYM */ + CACHE_SYM = 614, /* CACHE_SYM */ + CASCADED = 615, /* CASCADED */ + CATALOG_NAME_SYM = 616, /* CATALOG_NAME_SYM */ + CHAIN_SYM = 617, /* CHAIN_SYM */ + CHANGED = 618, /* CHANGED */ + CHANNEL_SYM = 619, /* CHANNEL_SYM */ + CHARSET = 620, /* CHARSET */ + CHECKPOINT_SYM = 621, /* CHECKPOINT_SYM */ + CHECKSUM_SYM = 622, /* CHECKSUM_SYM */ + CIPHER_SYM = 623, /* CIPHER_SYM */ + CLASS_ORIGIN_SYM = 624, /* CLASS_ORIGIN_SYM */ + CLIENT_SYM = 625, /* CLIENT_SYM */ + CLOB_MARIADB_SYM = 626, /* CLOB_MARIADB_SYM */ + CLOB_ORACLE_SYM = 627, /* CLOB_ORACLE_SYM */ + CLOSE_SYM = 628, /* CLOSE_SYM */ + COALESCE = 629, /* COALESCE */ + CODE_SYM = 630, /* CODE_SYM */ + COLLATION_SYM = 631, /* COLLATION_SYM */ + COLUMNS = 632, /* COLUMNS */ + COLUMN_ADD_SYM = 633, /* COLUMN_ADD_SYM */ + COLUMN_CHECK_SYM = 634, /* COLUMN_CHECK_SYM */ + COLUMN_CREATE_SYM = 635, /* COLUMN_CREATE_SYM */ + COLUMN_DELETE_SYM = 636, /* COLUMN_DELETE_SYM */ + COLUMN_GET_SYM = 637, /* COLUMN_GET_SYM */ + COLUMN_SYM = 638, /* COLUMN_SYM */ + COLUMN_NAME_SYM = 639, /* COLUMN_NAME_SYM */ + COMMENT_SYM = 640, /* COMMENT_SYM */ + COMMITTED_SYM = 641, /* COMMITTED_SYM */ + COMMIT_SYM = 642, /* COMMIT_SYM */ + COMPACT_SYM = 643, /* COMPACT_SYM */ + COMPLETION_SYM = 644, /* COMPLETION_SYM */ + COMPRESSED_SYM = 645, /* COMPRESSED_SYM */ + CONCURRENT = 646, /* CONCURRENT */ + CONNECTION_SYM = 647, /* CONNECTION_SYM */ + CONSISTENT_SYM = 648, /* CONSISTENT_SYM */ + CONSTRAINT_CATALOG_SYM = 649, /* CONSTRAINT_CATALOG_SYM */ + CONSTRAINT_NAME_SYM = 650, /* CONSTRAINT_NAME_SYM */ + CONSTRAINT_SCHEMA_SYM = 651, /* CONSTRAINT_SCHEMA_SYM */ + CONTAINS_SYM = 652, /* CONTAINS_SYM */ + CONTEXT_SYM = 653, /* CONTEXT_SYM */ + CONTRIBUTORS_SYM = 654, /* CONTRIBUTORS_SYM */ + CPU_SYM = 655, /* CPU_SYM */ + CUBE_SYM = 656, /* CUBE_SYM */ + CURRENT_SYM = 657, /* CURRENT_SYM */ + CURRENT_POS_SYM = 658, /* CURRENT_POS_SYM */ + CURSOR_NAME_SYM = 659, /* CURSOR_NAME_SYM */ + CYCLE_SYM = 660, /* CYCLE_SYM */ + DATAFILE_SYM = 661, /* DATAFILE_SYM */ + DATA_SYM = 662, /* DATA_SYM */ + DATETIME = 663, /* DATETIME */ + DATE_SYM = 664, /* DATE_SYM */ + DAY_SYM = 665, /* DAY_SYM */ + DEALLOCATE_SYM = 666, /* DEALLOCATE_SYM */ + DEFINER_SYM = 667, /* DEFINER_SYM */ + DELAYED_SYM = 668, /* DELAYED_SYM */ + DELAY_KEY_WRITE_SYM = 669, /* DELAY_KEY_WRITE_SYM */ + DES_KEY_FILE = 670, /* DES_KEY_FILE */ + DIAGNOSTICS_SYM = 671, /* DIAGNOSTICS_SYM */ + DIRECTORY_SYM = 672, /* DIRECTORY_SYM */ + DISABLE_SYM = 673, /* DISABLE_SYM */ + DISCARD = 674, /* DISCARD */ + DISK_SYM = 675, /* DISK_SYM */ + DO_SYM = 676, /* DO_SYM */ + DUMPFILE = 677, /* DUMPFILE */ + DUPLICATE_SYM = 678, /* DUPLICATE_SYM */ + DYNAMIC_SYM = 679, /* DYNAMIC_SYM */ + ENABLE_SYM = 680, /* ENABLE_SYM */ + END = 681, /* END */ + ENDS_SYM = 682, /* ENDS_SYM */ + ENGINES_SYM = 683, /* ENGINES_SYM */ + ENGINE_SYM = 684, /* ENGINE_SYM */ + ENUM = 685, /* ENUM */ + ERROR_SYM = 686, /* ERROR_SYM */ + ERRORS = 687, /* ERRORS */ + ESCAPE_SYM = 688, /* ESCAPE_SYM */ + EVENTS_SYM = 689, /* EVENTS_SYM */ + EVENT_SYM = 690, /* EVENT_SYM */ + EVERY_SYM = 691, /* EVERY_SYM */ + EXCHANGE_SYM = 692, /* EXCHANGE_SYM */ + EXAMINED_SYM = 693, /* EXAMINED_SYM */ + EXCLUDE_SYM = 694, /* EXCLUDE_SYM */ + EXECUTE_SYM = 695, /* EXECUTE_SYM */ + EXCEPTION_MARIADB_SYM = 696, /* EXCEPTION_MARIADB_SYM */ + EXIT_MARIADB_SYM = 697, /* EXIT_MARIADB_SYM */ + EXIT_ORACLE_SYM = 698, /* EXIT_ORACLE_SYM */ + EXPANSION_SYM = 699, /* EXPANSION_SYM */ + EXPIRE_SYM = 700, /* EXPIRE_SYM */ + EXPORT_SYM = 701, /* EXPORT_SYM */ + EXTENDED_SYM = 702, /* EXTENDED_SYM */ + EXTENT_SIZE_SYM = 703, /* EXTENT_SIZE_SYM */ + FAST_SYM = 704, /* FAST_SYM */ + FAULTS_SYM = 705, /* FAULTS_SYM */ + FEDERATED_SYM = 706, /* FEDERATED_SYM */ + FILE_SYM = 707, /* FILE_SYM */ + FIRST_SYM = 708, /* FIRST_SYM */ + FIXED_SYM = 709, /* FIXED_SYM */ + FLUSH_SYM = 710, /* FLUSH_SYM */ + FOLLOWS_SYM = 711, /* FOLLOWS_SYM */ + FOLLOWING_SYM = 712, /* FOLLOWING_SYM */ + FORCE_SYM = 713, /* FORCE_SYM */ + FORMAT_SYM = 714, /* FORMAT_SYM */ + FOUND_SYM = 715, /* FOUND_SYM */ + FULL = 716, /* FULL */ + FUNCTION_SYM = 717, /* FUNCTION_SYM */ + GENERAL = 718, /* GENERAL */ + GENERATED_SYM = 719, /* GENERATED_SYM */ + GET_FORMAT = 720, /* GET_FORMAT */ + GET_SYM = 721, /* GET_SYM */ + GLOBAL_SYM = 722, /* GLOBAL_SYM */ + GRANTS = 723, /* GRANTS */ + HANDLER_SYM = 724, /* HANDLER_SYM */ + HARD_SYM = 725, /* HARD_SYM */ + HASH_SYM = 726, /* HASH_SYM */ + HELP_SYM = 727, /* HELP_SYM */ + HIGH_PRIORITY = 728, /* HIGH_PRIORITY */ + HISTORY_SYM = 729, /* HISTORY_SYM */ + HOST_SYM = 730, /* HOST_SYM */ + HOSTS_SYM = 731, /* HOSTS_SYM */ + HOUR_SYM = 732, /* HOUR_SYM */ + ID_SYM = 733, /* ID_SYM */ + IDENTIFIED_SYM = 734, /* IDENTIFIED_SYM */ + IGNORE_SERVER_IDS_SYM = 735, /* IGNORE_SERVER_IDS_SYM */ + IMMEDIATE_SYM = 736, /* IMMEDIATE_SYM */ + IMPORT = 737, /* IMPORT */ + INCREMENT_SYM = 738, /* INCREMENT_SYM */ + INDEXES = 739, /* INDEXES */ + INITIAL_SIZE_SYM = 740, /* INITIAL_SIZE_SYM */ + INSERT_METHOD = 741, /* INSERT_METHOD */ + INSTALL_SYM = 742, /* INSTALL_SYM */ + INVOKER_SYM = 743, /* INVOKER_SYM */ + IO_SYM = 744, /* IO_SYM */ + IPC_SYM = 745, /* IPC_SYM */ + ISOLATION = 746, /* ISOLATION */ + ISOPEN_SYM = 747, /* ISOPEN_SYM */ + ISSUER_SYM = 748, /* ISSUER_SYM */ + INVISIBLE_SYM = 749, /* INVISIBLE_SYM */ + JSON_SYM = 750, /* JSON_SYM */ + KEY_BLOCK_SIZE = 751, /* KEY_BLOCK_SIZE */ + LANGUAGE_SYM = 752, /* LANGUAGE_SYM */ + LAST_SYM = 753, /* LAST_SYM */ + LAST_VALUE = 754, /* LAST_VALUE */ + LASTVAL_SYM = 755, /* LASTVAL_SYM */ + LEAVES = 756, /* LEAVES */ + LESS_SYM = 757, /* LESS_SYM */ + LEVEL_SYM = 758, /* LEVEL_SYM */ + LIST_SYM = 759, /* LIST_SYM */ + LOCAL_SYM = 760, /* LOCAL_SYM */ + LOCKED_SYM = 761, /* LOCKED_SYM */ + LOCKS_SYM = 762, /* LOCKS_SYM */ + LOGFILE_SYM = 763, /* LOGFILE_SYM */ + LOGS_SYM = 764, /* LOGS_SYM */ + MASTER_CONNECT_RETRY_SYM = 765, /* MASTER_CONNECT_RETRY_SYM */ + MASTER_DELAY_SYM = 766, /* MASTER_DELAY_SYM */ + MASTER_GTID_POS_SYM = 767, /* MASTER_GTID_POS_SYM */ + MASTER_HOST_SYM = 768, /* MASTER_HOST_SYM */ + MASTER_LOG_FILE_SYM = 769, /* MASTER_LOG_FILE_SYM */ + MASTER_LOG_POS_SYM = 770, /* MASTER_LOG_POS_SYM */ + MASTER_PASSWORD_SYM = 771, /* MASTER_PASSWORD_SYM */ + MASTER_PORT_SYM = 772, /* MASTER_PORT_SYM */ + MASTER_SERVER_ID_SYM = 773, /* MASTER_SERVER_ID_SYM */ + MASTER_SSL_CAPATH_SYM = 774, /* MASTER_SSL_CAPATH_SYM */ + MASTER_SSL_CA_SYM = 775, /* MASTER_SSL_CA_SYM */ + MASTER_SSL_CERT_SYM = 776, /* MASTER_SSL_CERT_SYM */ + MASTER_SSL_CIPHER_SYM = 777, /* MASTER_SSL_CIPHER_SYM */ + MASTER_SSL_CRL_SYM = 778, /* MASTER_SSL_CRL_SYM */ + MASTER_SSL_CRLPATH_SYM = 779, /* MASTER_SSL_CRLPATH_SYM */ + MASTER_SSL_KEY_SYM = 780, /* MASTER_SSL_KEY_SYM */ + MASTER_SSL_SYM = 781, /* MASTER_SSL_SYM */ + MASTER_SYM = 782, /* MASTER_SYM */ + MASTER_USER_SYM = 783, /* MASTER_USER_SYM */ + MASTER_USE_GTID_SYM = 784, /* MASTER_USE_GTID_SYM */ + MASTER_HEARTBEAT_PERIOD_SYM = 785, /* MASTER_HEARTBEAT_PERIOD_SYM */ + MASTER_DEMOTE_TO_SLAVE_SYM = 786, /* MASTER_DEMOTE_TO_SLAVE_SYM */ + MAX_CONNECTIONS_PER_HOUR = 787, /* MAX_CONNECTIONS_PER_HOUR */ + MAX_QUERIES_PER_HOUR = 788, /* MAX_QUERIES_PER_HOUR */ + MAX_ROWS = 789, /* MAX_ROWS */ + MAX_SIZE_SYM = 790, /* MAX_SIZE_SYM */ + MAX_UPDATES_PER_HOUR = 791, /* MAX_UPDATES_PER_HOUR */ + MAX_STATEMENT_TIME_SYM = 792, /* MAX_STATEMENT_TIME_SYM */ + MAX_USER_CONNECTIONS_SYM = 793, /* MAX_USER_CONNECTIONS_SYM */ + MEDIUM_SYM = 794, /* MEDIUM_SYM */ + MEMORY_SYM = 795, /* MEMORY_SYM */ + MERGE_SYM = 796, /* MERGE_SYM */ + MESSAGE_TEXT_SYM = 797, /* MESSAGE_TEXT_SYM */ + MICROSECOND_SYM = 798, /* MICROSECOND_SYM */ + MIGRATE_SYM = 799, /* MIGRATE_SYM */ + MINUTE_SYM = 800, /* MINUTE_SYM */ + MINVALUE_SYM = 801, /* MINVALUE_SYM */ + MIN_ROWS = 802, /* MIN_ROWS */ + MODE_SYM = 803, /* MODE_SYM */ + MODIFY_SYM = 804, /* MODIFY_SYM */ + MONITOR_SYM = 805, /* MONITOR_SYM */ + MONTH_SYM = 806, /* MONTH_SYM */ + MUTEX_SYM = 807, /* MUTEX_SYM */ + MYSQL_SYM = 808, /* MYSQL_SYM */ + MYSQL_ERRNO_SYM = 809, /* MYSQL_ERRNO_SYM */ + NAMES_SYM = 810, /* NAMES_SYM */ + NAME_SYM = 811, /* NAME_SYM */ + NATIONAL_SYM = 812, /* NATIONAL_SYM */ + NCHAR_SYM = 813, /* NCHAR_SYM */ + NEVER_SYM = 814, /* NEVER_SYM */ + NEXT_SYM = 815, /* NEXT_SYM */ + NEXTVAL_SYM = 816, /* NEXTVAL_SYM */ + NOCACHE_SYM = 817, /* NOCACHE_SYM */ + NOCYCLE_SYM = 818, /* NOCYCLE_SYM */ + NODEGROUP_SYM = 819, /* NODEGROUP_SYM */ + NONE_SYM = 820, /* NONE_SYM */ + NOTFOUND_SYM = 821, /* NOTFOUND_SYM */ + NO_SYM = 822, /* NO_SYM */ + NOMAXVALUE_SYM = 823, /* NOMAXVALUE_SYM */ + NOMINVALUE_SYM = 824, /* NOMINVALUE_SYM */ + NO_WAIT_SYM = 825, /* NO_WAIT_SYM */ + NOWAIT_SYM = 826, /* NOWAIT_SYM */ + NUMBER_MARIADB_SYM = 827, /* NUMBER_MARIADB_SYM */ + NUMBER_ORACLE_SYM = 828, /* NUMBER_ORACLE_SYM */ + NVARCHAR_SYM = 829, /* NVARCHAR_SYM */ + OF_SYM = 830, /* OF_SYM */ + OFFSET_SYM = 831, /* OFFSET_SYM */ + OLD_PASSWORD_SYM = 832, /* OLD_PASSWORD_SYM */ + ONE_SYM = 833, /* ONE_SYM */ + ONLY_SYM = 834, /* ONLY_SYM */ + ONLINE_SYM = 835, /* ONLINE_SYM */ + OPEN_SYM = 836, /* OPEN_SYM */ + OPTIONS_SYM = 837, /* OPTIONS_SYM */ + OPTION = 838, /* OPTION */ + OVERLAPS_SYM = 839, /* OVERLAPS_SYM */ + OWNER_SYM = 840, /* OWNER_SYM */ + PACK_KEYS_SYM = 841, /* PACK_KEYS_SYM */ + PAGE_SYM = 842, /* PAGE_SYM */ + PARSER_SYM = 843, /* PARSER_SYM */ + PARTIAL = 844, /* PARTIAL */ + PARTITIONS_SYM = 845, /* PARTITIONS_SYM */ + PARTITIONING_SYM = 846, /* PARTITIONING_SYM */ + PASSWORD_SYM = 847, /* PASSWORD_SYM */ + PERIOD_SYM = 848, /* PERIOD_SYM */ + PERSISTENT_SYM = 849, /* PERSISTENT_SYM */ + PHASE_SYM = 850, /* PHASE_SYM */ + PLUGINS_SYM = 851, /* PLUGINS_SYM */ + PLUGIN_SYM = 852, /* PLUGIN_SYM */ + PORT_SYM = 853, /* PORT_SYM */ + PRECEDES_SYM = 854, /* PRECEDES_SYM */ + PRECEDING_SYM = 855, /* PRECEDING_SYM */ + PREPARE_SYM = 856, /* PREPARE_SYM */ + PRESERVE_SYM = 857, /* PRESERVE_SYM */ + PREV_SYM = 858, /* PREV_SYM */ + PREVIOUS_SYM = 859, /* PREVIOUS_SYM */ + PRIVILEGES = 860, /* PRIVILEGES */ + PROCESS = 861, /* PROCESS */ + PROCESSLIST_SYM = 862, /* PROCESSLIST_SYM */ + PROFILE_SYM = 863, /* PROFILE_SYM */ + PROFILES_SYM = 864, /* PROFILES_SYM */ + PROXY_SYM = 865, /* PROXY_SYM */ + QUARTER_SYM = 866, /* QUARTER_SYM */ + QUERY_SYM = 867, /* QUERY_SYM */ + QUICK = 868, /* QUICK */ + RAW_MARIADB_SYM = 869, /* RAW_MARIADB_SYM */ + RAW_ORACLE_SYM = 870, /* RAW_ORACLE_SYM */ + READ_ONLY_SYM = 871, /* READ_ONLY_SYM */ + REBUILD_SYM = 872, /* REBUILD_SYM */ + RECOVER_SYM = 873, /* RECOVER_SYM */ + REDOFILE_SYM = 874, /* REDOFILE_SYM */ + REDO_BUFFER_SIZE_SYM = 875, /* REDO_BUFFER_SIZE_SYM */ + REDUNDANT_SYM = 876, /* REDUNDANT_SYM */ + RELAY = 877, /* RELAY */ + RELAYLOG_SYM = 878, /* RELAYLOG_SYM */ + RELAY_LOG_FILE_SYM = 879, /* RELAY_LOG_FILE_SYM */ + RELAY_LOG_POS_SYM = 880, /* RELAY_LOG_POS_SYM */ + RELAY_THREAD = 881, /* RELAY_THREAD */ + RELOAD = 882, /* RELOAD */ + REMOVE_SYM = 883, /* REMOVE_SYM */ + REORGANIZE_SYM = 884, /* REORGANIZE_SYM */ + REPAIR = 885, /* REPAIR */ + REPEATABLE_SYM = 886, /* REPEATABLE_SYM */ + REPLAY_SYM = 887, /* REPLAY_SYM */ + REPLICATION = 888, /* REPLICATION */ + RESET_SYM = 889, /* RESET_SYM */ + RESTART_SYM = 890, /* RESTART_SYM */ + RESOURCES = 891, /* RESOURCES */ + RESTORE_SYM = 892, /* RESTORE_SYM */ + RESUME_SYM = 893, /* RESUME_SYM */ + RETURNED_SQLSTATE_SYM = 894, /* RETURNED_SQLSTATE_SYM */ + RETURNS_SYM = 895, /* RETURNS_SYM */ + REUSE_SYM = 896, /* REUSE_SYM */ + REVERSE_SYM = 897, /* REVERSE_SYM */ + ROLE_SYM = 898, /* ROLE_SYM */ + ROLLBACK_SYM = 899, /* ROLLBACK_SYM */ + ROLLUP_SYM = 900, /* ROLLUP_SYM */ + ROUTINE_SYM = 901, /* ROUTINE_SYM */ + ROWCOUNT_SYM = 902, /* ROWCOUNT_SYM */ + ROW_SYM = 903, /* ROW_SYM */ + ROW_COUNT_SYM = 904, /* ROW_COUNT_SYM */ + ROW_FORMAT_SYM = 905, /* ROW_FORMAT_SYM */ + RTREE_SYM = 906, /* RTREE_SYM */ + SAVEPOINT_SYM = 907, /* SAVEPOINT_SYM */ + SCHEDULE_SYM = 908, /* SCHEDULE_SYM */ + SCHEMA_NAME_SYM = 909, /* SCHEMA_NAME_SYM */ + SECOND_SYM = 910, /* SECOND_SYM */ + SECURITY_SYM = 911, /* SECURITY_SYM */ + SEQUENCE_SYM = 912, /* SEQUENCE_SYM */ + SERIALIZABLE_SYM = 913, /* SERIALIZABLE_SYM */ + SERIAL_SYM = 914, /* SERIAL_SYM */ + SESSION_SYM = 915, /* SESSION_SYM */ + SERVER_SYM = 916, /* SERVER_SYM */ + SETVAL_SYM = 917, /* SETVAL_SYM */ + SHARE_SYM = 918, /* SHARE_SYM */ + SHUTDOWN = 919, /* SHUTDOWN */ + SIGNED_SYM = 920, /* SIGNED_SYM */ + SIMPLE_SYM = 921, /* SIMPLE_SYM */ + SKIP_SYM = 922, /* SKIP_SYM */ + SLAVE = 923, /* SLAVE */ + SLAVES = 924, /* SLAVES */ + SLAVE_POS_SYM = 925, /* SLAVE_POS_SYM */ + SLOW = 926, /* SLOW */ + SNAPSHOT_SYM = 927, /* SNAPSHOT_SYM */ + SOCKET_SYM = 928, /* SOCKET_SYM */ + SOFT_SYM = 929, /* SOFT_SYM */ + SONAME_SYM = 930, /* SONAME_SYM */ + SOUNDS_SYM = 931, /* SOUNDS_SYM */ + SOURCE_SYM = 932, /* SOURCE_SYM */ + SQL_BUFFER_RESULT = 933, /* SQL_BUFFER_RESULT */ + SQL_CACHE_SYM = 934, /* SQL_CACHE_SYM */ + SQL_CALC_FOUND_ROWS = 935, /* SQL_CALC_FOUND_ROWS */ + SQL_NO_CACHE_SYM = 936, /* SQL_NO_CACHE_SYM */ + SQL_THREAD = 937, /* SQL_THREAD */ + STAGE_SYM = 938, /* STAGE_SYM */ + STARTS_SYM = 939, /* STARTS_SYM */ + START_SYM = 940, /* START_SYM */ + STATEMENT_SYM = 941, /* STATEMENT_SYM */ + STATUS_SYM = 942, /* STATUS_SYM */ + STOP_SYM = 943, /* STOP_SYM */ + STORAGE_SYM = 944, /* STORAGE_SYM */ + STORED_SYM = 945, /* STORED_SYM */ + STRING_SYM = 946, /* STRING_SYM */ + SUBCLASS_ORIGIN_SYM = 947, /* SUBCLASS_ORIGIN_SYM */ + SUBDATE_SYM = 948, /* SUBDATE_SYM */ + SUBJECT_SYM = 949, /* SUBJECT_SYM */ + SUBPARTITIONS_SYM = 950, /* SUBPARTITIONS_SYM */ + SUBPARTITION_SYM = 951, /* SUBPARTITION_SYM */ + SUPER_SYM = 952, /* SUPER_SYM */ + SUSPEND_SYM = 953, /* SUSPEND_SYM */ + SWAPS_SYM = 954, /* SWAPS_SYM */ + SWITCHES_SYM = 955, /* SWITCHES_SYM */ + SYSTEM = 956, /* SYSTEM */ + SYSTEM_TIME_SYM = 957, /* SYSTEM_TIME_SYM */ + TABLES = 958, /* TABLES */ + TABLESPACE = 959, /* TABLESPACE */ + TABLE_CHECKSUM_SYM = 960, /* TABLE_CHECKSUM_SYM */ + TABLE_NAME_SYM = 961, /* TABLE_NAME_SYM */ + TEMPORARY = 962, /* TEMPORARY */ + TEMPTABLE_SYM = 963, /* TEMPTABLE_SYM */ + TEXT_SYM = 964, /* TEXT_SYM */ + THAN_SYM = 965, /* THAN_SYM */ + TIES_SYM = 966, /* TIES_SYM */ + TIMESTAMP = 967, /* TIMESTAMP */ + TIMESTAMP_ADD = 968, /* TIMESTAMP_ADD */ + TIMESTAMP_DIFF = 969, /* TIMESTAMP_DIFF */ + TIME_SYM = 970, /* TIME_SYM */ + TRANSACTION_SYM = 971, /* TRANSACTION_SYM */ + TRANSACTIONAL_SYM = 972, /* TRANSACTIONAL_SYM */ + THREADS_SYM = 973, /* THREADS_SYM */ + TRIGGERS_SYM = 974, /* TRIGGERS_SYM */ + TRIM_ORACLE = 975, /* TRIM_ORACLE */ + TRUNCATE_SYM = 976, /* TRUNCATE_SYM */ + TYPE_SYM = 977, /* TYPE_SYM */ + UDF_RETURNS_SYM = 978, /* UDF_RETURNS_SYM */ + UNBOUNDED_SYM = 979, /* UNBOUNDED_SYM */ + UNCOMMITTED_SYM = 980, /* UNCOMMITTED_SYM */ + UNDEFINED_SYM = 981, /* UNDEFINED_SYM */ + UNDOFILE_SYM = 982, /* UNDOFILE_SYM */ + UNDO_BUFFER_SIZE_SYM = 983, /* UNDO_BUFFER_SIZE_SYM */ + UNICODE_SYM = 984, /* UNICODE_SYM */ + UNINSTALL_SYM = 985, /* UNINSTALL_SYM */ + UNKNOWN_SYM = 986, /* UNKNOWN_SYM */ + UNTIL_SYM = 987, /* UNTIL_SYM */ + UPGRADE_SYM = 988, /* UPGRADE_SYM */ + USER_SYM = 989, /* USER_SYM */ + USE_FRM = 990, /* USE_FRM */ + VALUE_SYM = 991, /* VALUE_SYM */ + VARCHAR2_MARIADB_SYM = 992, /* VARCHAR2_MARIADB_SYM */ + VARCHAR2_ORACLE_SYM = 993, /* VARCHAR2_ORACLE_SYM */ + VARIABLES = 994, /* VARIABLES */ + VERSIONING_SYM = 995, /* VERSIONING_SYM */ + VIA_SYM = 996, /* VIA_SYM */ + VIEW_SYM = 997, /* VIEW_SYM */ + VISIBLE_SYM = 998, /* VISIBLE_SYM */ + VIRTUAL_SYM = 999, /* VIRTUAL_SYM */ + WAIT_SYM = 1000, /* WAIT_SYM */ + WARNINGS = 1001, /* WARNINGS */ + WEEK_SYM = 1002, /* WEEK_SYM */ + WEIGHT_STRING_SYM = 1003, /* WEIGHT_STRING_SYM */ + WINDOW_SYM = 1004, /* WINDOW_SYM */ + WITHIN = 1005, /* WITHIN */ + WITHOUT = 1006, /* WITHOUT */ + WORK_SYM = 1007, /* WORK_SYM */ + WRAPPER_SYM = 1008, /* WRAPPER_SYM */ + WRITE_SYM = 1009, /* WRITE_SYM */ + X509_SYM = 1010, /* X509_SYM */ + XA_SYM = 1011, /* XA_SYM */ + XML_SYM = 1012, /* XML_SYM */ + YEAR_SYM = 1013, /* YEAR_SYM */ + CONDITIONLESS_JOIN = 1014, /* CONDITIONLESS_JOIN */ + ON_SYM = 1015, /* ON_SYM */ + PREC_BELOW_NOT = 1016, /* PREC_BELOW_NOT */ + SUBQUERY_AS_EXPR = 1017, /* SUBQUERY_AS_EXPR */ + PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE = 1018, /* PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE */ + USER = 1019, /* USER */ + PREC_BELOW_CONTRACTION_TOKEN2 = 1020, /* PREC_BELOW_CONTRACTION_TOKEN2 */ + EMPTY_FROM_CLAUSE = 1021 /* EMPTY_FROM_CLAUSE */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 192 "/home/buildbot/git/sql/sql_yacc.yy" + + int num; + ulong ulong_num; + ulonglong ulonglong_number; + longlong longlong_number; + uint sp_instr_addr; + + /* structs */ + LEX_CSTRING lex_str; + Lex_ident_cli_st kwd; + Lex_ident_cli_st ident_cli; + Lex_ident_sys_st ident_sys; + Lex_column_list_privilege_st column_list_privilege; + Lex_string_with_metadata_st lex_string_with_metadata; + Lex_spblock_st spblock; + Lex_spblock_handlers_st spblock_handlers; + Lex_length_and_dec_st Lex_length_and_dec; + Lex_cast_type_st Lex_cast_type; + Lex_field_type_st Lex_field_type; + Lex_exact_charset_extended_collation_attrs_st + Lex_exact_charset_extended_collation_attrs; + Lex_extended_collation_st Lex_extended_collation; + Lex_dyncol_type_st Lex_dyncol_type; + Lex_for_loop_st for_loop; + Lex_for_loop_bounds_st for_loop_bounds; + Lex_trim_st trim; + Json_table_column::On_response json_on_response; + Lex_substring_spec_st substring_spec; + vers_history_point_t vers_history_point; + struct + { + enum sub_select_type unit_type; + bool distinct; + } unit_operation; + struct + { + SELECT_LEX *first; + SELECT_LEX *prev_last; + } select_list; + SQL_I_List *select_order; + Lex_select_lock select_lock; + Lex_select_limit select_limit; + Lex_order_limit_lock *order_limit_lock; + + /* pointers */ + Lex_ident_sys *ident_sys_ptr; + Create_field *create_field; + Spvar_definition *spvar_definition; + Row_definition_list *spvar_definition_list; + const Type_handler *type_handler; + const class Sp_handler *sp_handler; + CHARSET_INFO *charset; + Condition_information_item *cond_info_item; + DYNCALL_CREATE_DEF *dyncol_def; + Diagnostics_information *diag_info; + Item *item; + Item_num *item_num; + Item_param *item_param; + Item_basic_constant *item_basic_constant; + Key_part_spec *key_part; + LEX *lex; + sp_expr_lex *expr_lex; + sp_assignment_lex *assignment_lex; + class sp_lex_cursor *sp_cursor_stmt; + LEX_CSTRING *lex_str_ptr; + LEX_USER *lex_user; + USER_AUTH *user_auth; + List *cond_info_list; + List *dyncol_def_list; + List *item_list; + List *sp_assignment_lex_list; + List *stmt_info_list; + List *string_list; + List *ident_sys_list; + Statement_information_item *stmt_info_item; + String *string; + TABLE_LIST *table_list; + Table_ident *table; + Qualified_column_ident *qualified_column_ident; + char *simple_string; + const char *const_simple_string; + chooser_compare_func_creator boolfunc2creator; + class Lex_grant_privilege *lex_grant; + class Lex_grant_object_name *lex_grant_ident; + class my_var *myvar; + class sp_condition_value *spcondvalue; + class sp_head *sphead; + class sp_name *spname; + class sp_variable *spvar; + class With_element_head *with_element_head; + class With_clause *with_clause; + class Virtual_column_info *virtual_column; + engine_option_value *engine_option_value_ptr; + + handlerton *db_type; + st_select_lex *select_lex; + st_select_lex_unit *select_lex_unit; + struct p_elem_val *p_elem_value; + class Window_frame *window_frame; + class Window_frame_bound *window_frame_bound; + udf_func *udf; + st_trg_execution_order trg_execution_order; + + /* enums */ + enum enum_sp_suid_behaviour sp_suid; + enum enum_sp_aggregate_type sp_aggregate_type; + enum enum_view_suid view_suid; + enum Condition_information_item::Name cond_info_item_name; + enum enum_diag_condition_item_name diag_condition_item_name; + enum Diagnostics_information::Which_area diag_area; + enum enum_fk_option m_fk_option; + enum Item_udftype udf_type; + enum Key::Keytype key_type; + enum Statement_information_item::Name stmt_info_item_name; + enum enum_filetype filetype; + enum enum_tx_isolation tx_isolation; + enum enum_var_type var_type; + enum enum_yes_no_unknown m_yes_no_unk; + enum ha_choice choice; + enum ha_key_alg key_alg; + enum ha_rkey_function ha_rkey_mode; + enum index_hint_type index_hint; + enum interval_type interval, interval_time_st; + enum row_type row_type; + enum sp_variable::enum_mode spvar_mode; + enum thr_lock_type lock_type; + enum enum_mysql_timestamp_type date_time_type; + enum Window_frame_bound::Bound_precedence_type bound_precedence_type; + enum Window_frame::Frame_units frame_units; + enum Window_frame::Frame_exclusion frame_exclusion; + enum trigger_order_type trigger_action_order_type; + DDL_options_st object_ddl_options; + enum vers_kind_t vers_range_unit; + enum Column_definition::enum_column_versioning vers_column_versioning; + enum plsql_cursor_attr_t plsql_cursor_attr; + privilege_t privilege; + +#line 968 "/home/buildbot/git/mkdist/sql/yy_oracle.hh" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + + + +int ORAparse (THD *thd); + + +#endif /* !YY_ORA_HOME_BUILDBOT_GIT_MKDIST_SQL_YY_ORACLE_HH_INCLUDED */ diff -Nru mariadb-10.11.6/sql-common/client.c mariadb-10.11.9/sql-common/client.c --- mariadb-10.11.6/sql-common/client.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql-common/client.c 2024-08-03 07:29:58.000000000 +0000 @@ -21,7 +21,7 @@ The differences for the two cases are: - Things that only works for the client: - - Trying to automaticly determinate user name if not supplied to + - Trying to automatically determinate user name if not supplied to mysql_real_connect() - Support for reading local file with LOAD DATA LOCAL - SHARED memory handling @@ -30,7 +30,7 @@ - Things that only works for the server - Alarm handling on connect - In all other cases, the code should be idential for the client and + In all other cases, the code should be identical for the client and server. */ @@ -1455,7 +1455,7 @@ mysql_reconnect()). This is a change: < 5.0.3 mysql->reconnect was set to 1 by default. How this change impacts existing apps: - - existing apps which relyed on the default will see a behaviour change; + - existing apps which relied on the default will see a behaviour change; they will have to set reconnect=1 after mysql_real_connect(). - existing apps which explicitly asked for reconnection (the only way they could do it was by setting mysql.reconnect to 1 after mysql_real_connect()) @@ -1936,7 +1936,7 @@ /* - Write 1-8 bytes of string length header infromation to dest depending on + Write 1-8 bytes of string length header information to dest depending on value of src_len, then copy src_len bytes from src to dest. @param dest Destination buffer of size src_len+8 @@ -2217,7 +2217,7 @@ } #endif /* HAVE_OPENSSL */ - DBUG_PRINT("info",("Server version = '%s' capabilites: %lu status: %u client_flag: %lu", + DBUG_PRINT("info",("Server version = '%s' capabilities: %lu status: %u client_flag: %lu", mysql->server_version, mysql->server_capabilities, mysql->server_status, mysql->client_flag)); @@ -2354,7 +2354,7 @@ to send data to the server. It transparently wraps the data into a change user or authentication - handshake packet, if neccessary. + handshake packet, if necessary. */ static int client_mpvio_write_packet(struct st_plugin_vio *mpv, const uchar *pkt, int pkt_len) @@ -3756,7 +3756,7 @@ mysql->options.compress= 1; /* Remember for connect */ mysql->options.client_flag|= CLIENT_COMPRESS; break; - case MYSQL_OPT_NAMED_PIPE: /* This option is depricated */ + case MYSQL_OPT_NAMED_PIPE: /* This option is deprecated */ mysql->options.protocol=MYSQL_PROTOCOL_PIPE; /* Force named pipe */ break; case MYSQL_OPT_LOCAL_INFILE: /* Allow LOAD DATA LOCAL ?*/ diff -Nru mariadb-10.11.6/sql-common/my_time.c mariadb-10.11.9/sql-common/my_time.c --- mariadb-10.11.6/sql-common/my_time.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/sql-common/my_time.c 2024-08-03 07:29:58.000000000 +0000 @@ -475,7 +475,7 @@ DESCRIPTION - At least the following formats are recogniced (based on number of digits) + At least the following formats are recognized (based on number of digits) YYMMDD, YYYYMMDD, YYMMDDHHMMSS, YYYYMMDDHHMMSS YY-MM-DD, YYYY-MM-DD, YY-MM-DD HH.MM.SS YYYYMMDDTHHMMSS where T is a the character T (ISO8601) @@ -1223,7 +1223,7 @@ /* Convert time in MYSQL_TIME representation in system time zone to its - my_time_t form (number of seconds in UTC since begginning of Unix Epoch). + my_time_t form (number of seconds in UTC since beginning of Unix Epoch). SYNOPSIS my_system_gmt_sec() @@ -1291,7 +1291,7 @@ two days earlier, and then add these days to the final value. The same trick is done for the values close to 0 in time_t - representation for platfroms with unsigned time_t (QNX). + representation for platforms with unsigned time_t (QNX). To be more verbose, here is a sample (extracted from the code below): (calc_daynr(2038, 1, 19) - (long) days_at_timestart)*86400L + 4*3600L @@ -1303,9 +1303,9 @@ will give -3600. On some platforms, (E.g. on QNX) time_t is unsigned and localtime(-3600) - wil give us a date around 2106 year. Which is no good. + will give us a date around 2106 year. Which is no good. - Theoreticaly, there could be problems with the latter conversion: + Theoretically, there could be problems with the latter conversion: there are at least two timezones, which had time switches near 1 Jan of 1970 (because of political reasons). These are America/Hermosillo and America/Mazatlan time zones. They changed their offset on @@ -1335,7 +1335,7 @@ else { /* - We can get 0 in time_t representaion only on 1969, 31 of Dec or on + We can get 0 in time_t representation only on 1969, 31 of Dec or on 1970, 1 of Jan. For both dates we use shift, which is added to t->day in order to step out a bit from the border. This is required for platforms, where time_t is unsigned. @@ -1430,9 +1430,9 @@ First check will pass for platforms with signed time_t. instruction above (tmp+= shift*86400L) could exceed MAX_INT32 (== TIMESTAMP_MAX_VALUE) and overflow will happen. - So, tmp < TIMESTAMP_MIN_VALUE will be triggered. On platfroms + So, tmp < TIMESTAMP_MIN_VALUE will be triggered. On platforms with unsigned time_t tmp+= shift*86400L might result in a number, - larger then TIMESTAMP_MAX_VALUE, so another check will work. + larger than TIMESTAMP_MAX_VALUE, so another check will work. */ if (!IS_TIME_T_VALID_FOR_TIMESTAMP(tmp)) { @@ -1545,8 +1545,8 @@ - 0.225 sec (current) - 0.219 sec (array) - It demonstrated an additional 3% performance imrovement one these queries. - However, as the array size is too huge, we afraid that it will flush data + It demonstrated an additional 3% performance improvement one these queries. + However, as the array size is too huge, we are afraid that it will flush data from the CPU memory cache, which under real load may affect negatively. Let's keep using the fmt_number4() version with division and remainder diff -Nru mariadb-10.11.6/storage/archive/CMakeLists.txt mariadb-10.11.9/storage/archive/CMakeLists.txt --- mariadb-10.11.6/storage/archive/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/archive/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -14,5 +14,5 @@ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA SET(ARCHIVE_SOURCES azio.c ha_archive.cc ha_archive.h) -MYSQL_ADD_PLUGIN(archive ${ARCHIVE_SOURCES} STORAGE_ENGINE LINK_LIBRARIES ${ZLIB_LIBRARY}) +MYSQL_ADD_PLUGIN(archive ${ARCHIVE_SOURCES} STORAGE_ENGINE LINK_LIBRARIES ${ZLIB_LIBRARIES}) diff -Nru mariadb-10.11.6/storage/archive/ha_archive.cc mariadb-10.11.9/storage/archive/ha_archive.cc --- mariadb-10.11.6/storage/archive/ha_archive.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/archive/ha_archive.cc 2024-08-03 07:29:59.000000000 +0000 @@ -267,6 +267,9 @@ archive_reader_open= FALSE; } +/* Stack size 50264 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int archive_discover(handlerton *hton, THD* thd, TABLE_SHARE *share) { DBUG_ENTER("archive_discover"); @@ -308,6 +311,7 @@ my_free(frm_ptr); DBUG_RETURN(my_errno); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** @brief Read version 1 meta file (5.0 compatibility routine). @@ -478,6 +482,10 @@ See ha_example.cc for a longer description. */ + +/* Stack size 49608 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + Archive_share *ha_archive::get_share(const char *table_name, int *rc) { Archive_share *tmp_share; @@ -540,6 +548,7 @@ DBUG_RETURN(tmp_share); } +PRAGMA_REENABLE_CHECK_STACK_FRAME int Archive_share::init_archive_writer() @@ -761,6 +770,9 @@ of creation. */ +/* Stack size 49608 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int ha_archive::create(const char *name, TABLE *table_arg, HA_CREATE_INFO *create_info) { @@ -878,6 +890,7 @@ /* Return error number, if we got one */ DBUG_RETURN(error ? error : -1); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* This is where the actual row is written out. @@ -1496,6 +1509,10 @@ The table can become fragmented if data was inserted, read, and then inserted again. What we do is open up the file and recompress it completely. */ + +/* Stack size 50152 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int ha_archive::optimize(THD* thd, HA_CHECK_OPT* check_opt) { int rc= 0; @@ -1621,6 +1638,7 @@ DBUG_RETURN(rc); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* Below is an example of how to setup row level locking. diff -Nru mariadb-10.11.6/storage/archive/ha_archive.h mariadb-10.11.9/storage/archive/ha_archive.h --- mariadb-10.11.6/storage/archive/ha_archive.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/archive/ha_archive.h 2024-08-03 07:29:59.000000000 +0000 @@ -88,8 +88,8 @@ public: ha_archive(handlerton *hton, TABLE_SHARE *table_arg); ~ha_archive() = default; - const char *index_type(uint inx) { return "NONE"; } - ulonglong table_flags() const + const char *index_type(uint inx) override { return "NONE"; } + ulonglong table_flags() const override { return (HA_NO_TRANSACTIONS | HA_REC_NOT_IN_SEQ | HA_CAN_BIT_FIELD | HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | @@ -97,66 +97,66 @@ HA_HAS_RECORDS | HA_CAN_REPAIR | HA_SLOW_RND_POS | HA_FILE_BASED | HA_CAN_INSERT_DELAYED | HA_CAN_GEOMETRY); } - ulong index_flags(uint idx, uint part, bool all_parts) const + ulong index_flags(uint idx, uint part, bool all_parts) const override { return HA_ONLY_WHOLE_INDEX; } - virtual void get_auto_increment(ulonglong offset, ulonglong increment, - ulonglong nb_desired_values, - ulonglong *first_value, - ulonglong *nb_reserved_values); - uint max_supported_keys() const { return 1; } - uint max_supported_key_length() const { return sizeof(ulonglong); } - uint max_supported_key_part_length() const { return sizeof(ulonglong); } - ha_rows records() { return share->rows_recorded; } - int index_init(uint keynr, bool sorted); - virtual int index_read(uchar * buf, const uchar * key, - uint key_len, enum ha_rkey_function find_flag); - virtual int index_read_idx(uchar * buf, uint index, const uchar * key, - uint key_len, enum ha_rkey_function find_flag); - int index_next(uchar * buf); - int open(const char *name, int mode, uint test_if_locked); - int close(void); - int write_row(const uchar * buf); + void get_auto_increment(ulonglong offset, ulonglong increment, + ulonglong nb_desired_values, + ulonglong *first_value, + ulonglong *nb_reserved_values) override; + uint max_supported_keys() const override { return 1; } + uint max_supported_key_length() const override { return sizeof(ulonglong); } + uint max_supported_key_part_length() const override { return sizeof(ulonglong); } + ha_rows records() override { return share->rows_recorded; } + int index_init(uint keynr, bool sorted) override; + int index_read(uchar * buf, const uchar * key, + uint key_len, enum ha_rkey_function find_flag) override; + int index_read_idx(uchar * buf, uint index, const uchar * key, + uint key_len, enum ha_rkey_function find_flag); + int index_next(uchar * buf) override; + int open(const char *name, int mode, uint test_if_locked) override; + int close(void) override; + int write_row(const uchar * buf) override; int real_write_row(const uchar *buf, azio_stream *writer); - int truncate(); - int rnd_init(bool scan=1); - int rnd_next(uchar *buf); - int rnd_pos(uchar * buf, uchar *pos); + int truncate() override; + int rnd_init(bool scan=1) override; + int rnd_next(uchar *buf) override; + int rnd_pos(uchar * buf, uchar *pos) override; int get_row(azio_stream *file_to_read, uchar *buf); int get_row_version2(azio_stream *file_to_read, uchar *buf); int get_row_version3(azio_stream *file_to_read, uchar *buf); Archive_share *get_share(const char *table_name, int *rc); int init_archive_reader(); // Always try auto_repair in case of HA_ERR_CRASHED_ON_USAGE - bool auto_repair(int error) const + bool auto_repair(int error) const override { return error == HA_ERR_CRASHED_ON_USAGE; } int read_data_header(azio_stream *file_to_read); - void position(const uchar *record); - int info(uint); - int extra(enum ha_extra_function operation); - void update_create_info(HA_CREATE_INFO *create_info); - int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info); - int optimize(THD* thd, HA_CHECK_OPT* check_opt); - int repair(THD* thd, HA_CHECK_OPT* check_opt); - int check_for_upgrade(HA_CHECK_OPT *check_opt); - void start_bulk_insert(ha_rows rows, uint flags); - int end_bulk_insert(); - enum row_type get_row_type() const + void position(const uchar *record) override; + int info(uint) override; + int extra(enum ha_extra_function operation) override; + void update_create_info(HA_CREATE_INFO *create_info) override; + int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) override; + int optimize(THD* thd, HA_CHECK_OPT* check_opt) override; + int repair(THD* thd, HA_CHECK_OPT* check_opt) override; + int check_for_upgrade(HA_CHECK_OPT *check_opt) override; + void start_bulk_insert(ha_rows rows, uint flags) override; + int end_bulk_insert() override; + enum row_type get_row_type() const override { return ROW_TYPE_COMPRESSED; } THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); - bool is_crashed() const; - int check(THD* thd, HA_CHECK_OPT* check_opt); - bool check_and_repair(THD *thd); + enum thr_lock_type lock_type) override; + bool is_crashed() const override; + int check(THD* thd, HA_CHECK_OPT* check_opt) override; + bool check_and_repair(THD *thd) override; uint32 max_row_length(const uchar *buf); bool fix_rec_buff(unsigned int length); int unpack_row(azio_stream *file_to_read, uchar *record); unsigned int pack_row(const uchar *record, azio_stream *writer); - bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes); - int external_lock(THD *thd, int lock_type); + bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes) override; + int external_lock(THD *thd, int lock_type) override; private: void flush_and_clear_pending_writes(); }; diff -Nru mariadb-10.11.6/storage/blackhole/ha_blackhole.h mariadb-10.11.9/storage/blackhole/ha_blackhole.h --- mariadb-10.11.6/storage/blackhole/ha_blackhole.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/blackhole/ha_blackhole.h 2024-08-03 07:29:59.000000000 +0000 @@ -49,15 +49,15 @@ The name of the index type that will be used for display don't implement this method unless you really have indexes */ - const char *index_type(uint key_number); - ulonglong table_flags() const + const char *index_type(uint key_number) override; + ulonglong table_flags() const override { return(HA_NULL_IN_KEY | HA_CAN_FULLTEXT | HA_CAN_SQL_HANDLER | HA_BINLOG_STMT_CAPABLE | HA_BINLOG_ROW_CAPABLE | HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY | HA_CAN_ONLINE_BACKUPS | HA_FILE_BASED | HA_CAN_GEOMETRY | HA_CAN_INSERT_DELAYED); } - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return ((table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) ? 0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE | @@ -67,39 +67,39 @@ #define BLACKHOLE_MAX_KEY MAX_KEY /* Max allowed keys */ #define BLACKHOLE_MAX_KEY_SEG 16 /* Max segments for key */ #define BLACKHOLE_MAX_KEY_LENGTH 3500 /* Like in InnoDB */ - uint max_supported_keys() const { return BLACKHOLE_MAX_KEY; } - uint max_supported_key_length() const { return BLACKHOLE_MAX_KEY_LENGTH; } - uint max_supported_key_part_length() const { return BLACKHOLE_MAX_KEY_LENGTH; } - int open(const char *name, int mode, uint test_if_locked); - int close(void); - int truncate(); - int rnd_init(bool scan); - int rnd_next(uchar *buf); - int rnd_pos(uchar * buf, uchar *pos); + uint max_supported_keys() const override { return BLACKHOLE_MAX_KEY; } + uint max_supported_key_length() const override { return BLACKHOLE_MAX_KEY_LENGTH; } + uint max_supported_key_part_length() const override { return BLACKHOLE_MAX_KEY_LENGTH; } + int open(const char *name, int mode, uint test_if_locked) override; + int close(void) override; + int truncate() override; + int rnd_init(bool scan) override; + int rnd_next(uchar *buf) override; + int rnd_pos(uchar * buf, uchar *pos) override; int index_read_map(uchar * buf, const uchar * key, key_part_map keypart_map, - enum ha_rkey_function find_flag); + enum ha_rkey_function find_flag) override; int index_read_idx_map(uchar * buf, uint idx, const uchar * key, key_part_map keypart_map, - enum ha_rkey_function find_flag); - int index_read_last_map(uchar * buf, const uchar * key, key_part_map keypart_map); - int index_next(uchar * buf); - int index_prev(uchar * buf); - int index_first(uchar * buf); - int index_last(uchar * buf); - void position(const uchar *record); - int info(uint flag); - int external_lock(THD *thd, int lock_type); + enum ha_rkey_function find_flag) override; + int index_read_last_map(uchar * buf, const uchar * key, key_part_map keypart_map) override; + int index_next(uchar * buf) override; + int index_prev(uchar * buf) override; + int index_first(uchar * buf) override; + int index_last(uchar * buf) override; + void position(const uchar *record) override; + int info(uint flag) override; + int external_lock(THD *thd, int lock_type) override; int create(const char *name, TABLE *table_arg, - HA_CREATE_INFO *create_info); + HA_CREATE_INFO *create_info) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); - int delete_table(const char *name) + enum thr_lock_type lock_type) override; + int delete_table(const char *name) override { return 0; } private: - virtual int write_row(const uchar *buf); - virtual int update_row(const uchar *old_data, const uchar *new_data); - virtual int delete_row(const uchar *buf); + int write_row(const uchar *buf) override; + int update_row(const uchar *old_data, const uchar *new_data) override; + int delete_row(const uchar *buf) override; }; diff -Nru mariadb-10.11.6/storage/columnstore/CMakeLists.txt mariadb-10.11.9/storage/columnstore/CMakeLists.txt --- mariadb-10.11.6/storage/columnstore/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -1,6 +1,7 @@ #set(PLUGIN_COLUMNSTORE "NO" CACHE STRING "Enable ColumnStore engine") -if("NO" STREQUAL "${PLUGIN_COLUMNSTORE}") +if("NO" STREQUAL "${PLUGIN_COLUMNSTORE}" OR + (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/columnstore/CMakeLists.txt)) return() endif() diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/CMakeLists.txt mariadb-10.11.9/storage/columnstore/columnstore/CMakeLists.txt --- mariadb-10.11.6/storage/columnstore/columnstore/CMakeLists.txt 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/CMakeLists.txt 2024-08-03 07:30:01.000000000 +0000 @@ -223,6 +223,7 @@ MY_CHECK_AND_SET_COMPILER_FLAG("-DMASK_LONGDOUBLE") ENDIF() + SET (CMAKE_REQUIRED_FLAGS "-Werror -Wall") SET (ENGINE_LDFLAGS "-Wl,--no-as-needed -Wl,--add-needed") SET (ENGINE_DT_LIB datatypes) diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/VERSION mariadb-10.11.9/storage/columnstore/columnstore/VERSION --- mariadb-10.11.6/storage/columnstore/columnstore/VERSION 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/VERSION 2024-08-03 07:30:01.000000000 +0000 @@ -1,4 +1,4 @@ COLUMNSTORE_VERSION_MAJOR=6 COLUMNSTORE_VERSION_MINOR=4 -COLUMNSTORE_VERSION_PATCH=7 +COLUMNSTORE_VERSION_PATCH=8 COLUMNSTORE_VERSION_RELEASE=2 diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1915,4 +1915,3 @@ } // end of namespace datatypes -// vim:ts=2 sw=2: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_datatype.h mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype.h --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_datatype.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype.h 2024-08-03 07:30:01.000000000 +0000 @@ -2522,6 +2522,4 @@ } // end of namespace datatypes -#endif // MCS_DATATYPE_H_INCLUDED - -// vim:ts=2 sw=2: +#endif // MCS_DATATYPE_H_INCLUDED \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_datatype_basic.h 2024-08-03 07:30:01.000000000 +0000 @@ -80,4 +80,3 @@ } // end of namespace datatypes #endif // MCS_DATATYPE_BASIC_H_INCLUDED -// vim:ts=2 sw=2: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_double.h mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_double.h --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_double.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_double.h 2024-08-03 07:30:01.000000000 +0000 @@ -55,5 +55,4 @@ } // end of namespace datatypes -#endif // MCS_DOUBLE_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_DOUBLE_H_INCLUDED \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_float128.h mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_float128.h --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_float128.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_float128.h 2024-08-03 07:30:01.000000000 +0000 @@ -725,5 +725,4 @@ } // namespace datatypes -#endif // MCS_TSFLOAT128_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_TSFLOAT128_H_INCLUDED \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_int128.cpp mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int128.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_int128.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int128.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -113,4 +113,3 @@ } } // end of namespace datatypes -// vim:ts=2 sw=2: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_int128.h mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int128.h --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_int128.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int128.h 2024-08-03 07:30:01.000000000 +0000 @@ -324,4 +324,3 @@ } // end of namespace datatypes #endif // MCS_TSINT128_H_INCLUDED -// vim:ts=2 sw=2: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_int64.h mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int64.h --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_int64.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_int64.h 2024-08-03 07:30:01.000000000 +0000 @@ -180,5 +180,4 @@ } // end of namespace datatypes -#endif // MCS_INT64_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_INT64_H_INCLUDED \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_longdouble.h mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_longdouble.h --- mariadb-10.11.6/storage/columnstore/columnstore/datatypes/mcs_longdouble.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/datatypes/mcs_longdouble.h 2024-08-03 07:30:01.000000000 +0000 @@ -55,5 +55,4 @@ } // end of namespace datatypes -#endif // MCS_LONGDOUBLE_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_LONGDOUBLE_H_INCLUDED \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackage/CMakeLists.txt 2024-08-03 07:30:01.000000000 +0000 @@ -9,7 +9,7 @@ FLEX_TARGET(ddl_scan ddl.l ${CMAKE_CURRENT_BINARY_DIR}/ddl-scan.cpp COMPILE_FLAGS "-i -L -Pddl") ADD_FLEX_BISON_DEPENDENCY(ddl_scan ddl_gram) -set_source_files_properties(ddl-scan.cpp PROPERTIES COMPILE_FLAGS -Wno-sign-compare) +set_source_files_properties(ddl-scan.cpp PROPERTIES COMPILE_FLAGS "-Wno-register -Wno-deprecated-register -Wno-sign-compare -DYY_NO_INPUT") ########### next target ############### diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/altertableprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2539,7 +2539,6 @@ } } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/createtableprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -830,4 +830,3 @@ } } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1491,4 +1491,3 @@ } } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/ddlpackageprocessor.h 2024-08-03 07:30:01.000000000 +0000 @@ -54,7 +54,7 @@ #define EXPORT #endif -//#define IDB_DDL_DEBUG +// #define IDB_DDL_DEBUG namespace ddlpackageprocessor { #define SUMMARY_INFO(message) \ @@ -891,5 +891,4 @@ #undef EXPORT -#endif // DDLPACKAGEPROCESSOR_H -// vim:ts=4 sw=4: +#endif // DDLPACKAGEPROCESSOR_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/ddlpackageproc/droptableprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1367,4 +1367,3 @@ } // namespace ddlpackageprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackage/CMakeLists.txt 2024-08-03 07:30:01.000000000 +0000 @@ -10,7 +10,7 @@ FLEX_TARGET(dml_scan dml.l ${CMAKE_CURRENT_BINARY_DIR}/dml-scan.cpp COMPILE_FLAGS "-i -L -Pdml") ADD_FLEX_BISON_DEPENDENCY(dml_scan dml_gram) -set_source_files_properties(dml-scan.cpp PROPERTIES COMPILE_FLAGS -Wno-sign-compare) +set_source_files_properties(dml-scan.cpp PROPERTIES COMPILE_FLAGS "-Wno-register -Wno-deprecated-register -Wno-sign-compare -DYY_NO_INPUT") ########### next target ############### diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -97,4 +97,3 @@ return fOidNextValueMap; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/autoincrementdata.h 2024-08-03 07:30:01.000000000 +0000 @@ -50,5 +50,4 @@ boost::mutex fOIDnextvalLock; }; -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/dmlpackageprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -913,4 +913,3 @@ return rc; } } // namespace dmlpackageprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/insertpackageprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -432,4 +432,3 @@ } // namespace dmlpackageprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -101,4 +101,3 @@ } } // namespace dmlpackageprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/dmlpackageproc/tablelockdata.h 2024-08-03 07:30:01.000000000 +0000 @@ -62,5 +62,4 @@ #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/calpontselectexecutionplan.h 2024-08-03 07:30:01.000000000 +0000 @@ -940,5 +940,4 @@ } } // namespace execplan -#endif // CALPONTSELECTEXECUTIONPLAN_H -// vim:ts=4 sw=4: +#endif // CALPONTSELECTEXECUTIONPLAN_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/calpontsystemcatalog.h 2024-08-03 07:30:01.000000000 +0000 @@ -1284,5 +1284,4 @@ } // namespace execplan -#endif // EXECPLAN_CALPONTSYSTEMCATALOG_H -// vim:ts=4 sw=4: +#endif // EXECPLAN_CALPONTSYSTEMCATALOG_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/clientrotator.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -399,4 +399,3 @@ } } // namespace execplan -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/clientrotator.h 2024-08-03 07:30:01.000000000 +0000 @@ -167,5 +167,4 @@ }; } // namespace execplan -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/constantcolumn.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -347,4 +347,3 @@ } } // namespace execplan -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/constantfilter.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -308,4 +308,3 @@ } } // namespace execplan -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/execplan/sessionmanager.h 2024-08-03 07:30:01.000000000 +0000 @@ -69,7 +69,7 @@ * immediately, causing all subsequent references to fail. This only affects * 'leakcheck'. */ -//#define DESTROYSHMSEG +// #define DESTROYSHMSEG class SessionManager { @@ -214,5 +214,4 @@ } // namespace execplan -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/anydatalist.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -170,4 +170,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/batchprimitiveprocessor-jl.h 2024-08-03 07:30:01.000000000 +0000 @@ -44,7 +44,7 @@ #include "brm.h" #include "command-jl.h" #include "resourcemanager.h" -//#include "tableband.h" +// #include "tableband.h" namespace joblist { @@ -367,5 +367,4 @@ } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/columncommand-jl.h 2024-08-03 07:30:01.000000000 +0000 @@ -130,5 +130,4 @@ } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -828,4 +828,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/crossenginestep.h 2024-08-03 07:30:01.000000000 +0000 @@ -250,6 +250,4 @@ } // namespace joblist -#endif // JOBLIST_CROSSENGINESTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_CROSSENGINESTEP_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/diskjoinstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -163,7 +163,7 @@ RGData rgData; bool more = true; int64_t memUsage = 0, combinedMemUsage = 0; - int rowCount = 0; + [[maybe_unused]] int rowCount = 0; RowGroup l_smallRG = smallRG; try @@ -224,7 +224,7 @@ RGData rgData; bool more = true; int64_t largeSize = 0; - int rowCount = 0; + [[maybe_unused]] int rowCount = 0; RowGroup l_largeRG = largeRG; largeIterationCount++; diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/distributedenginecomm.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1150,4 +1150,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/elementtype.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/elementtype.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/elementtype.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/elementtype.h 2024-08-03 07:30:01.000000000 +0000 @@ -245,14 +245,14 @@ #ifndef NO_DATALISTS -//#include "bandeddl.h" -//#include "wsdl.h" +// #include "bandeddl.h" +// #include "wsdl.h" #include "fifo.h" -//#include "bucketdl.h" -//#include "constantdatalist.h" -//#include "swsdl.h" -//#include "zdl.h" -//#include "deliverywsdl.h" +// #include "bucketdl.h" +// #include "constantdatalist.h" +// #include "swsdl.h" +// #include "zdl.h" +// #include "deliverywsdl.h" namespace joblist { @@ -639,5 +639,4 @@ #endif -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/errorinfo.h 2024-08-03 07:30:01.000000000 +0000 @@ -53,5 +53,4 @@ } // namespace joblist -#endif // JOBLIST_ERROR_INFO_H_ -// vim:ts=4 sw=4: +#endif // JOBLIST_ERROR_INFO_H_ \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/expressionstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -790,4 +790,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/fifo.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/fifo.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/fifo.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/fifo.h 2024-08-03 07:30:01.000000000 +0000 @@ -530,5 +530,4 @@ } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/groupconcat.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1050,4 +1050,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_common.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -822,4 +822,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_execplantojoblist.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -3446,7 +3446,6 @@ } } // namespace joblist -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_graphics.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -418,7 +418,6 @@ } // end namespace jlf_graphics -// vim:ts=4 sw=4 syntax=cpp: #ifdef __clang__ #pragma clang diagnostic pop diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_subquery.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -875,4 +875,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jlf_tuplejoblist.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -4559,7 +4559,6 @@ } } // namespace joblist -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblist.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1233,4 +1233,3 @@ #pragma clang diagnostic pop #endif -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/joblist.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblist.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/joblist.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblist.h 2024-08-03 07:30:01.000000000 +0000 @@ -261,5 +261,4 @@ #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/joblistfactory.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2314,7 +2314,6 @@ } } // namespace joblist -// vim:ts=4 sw=4: #ifdef __clang__ #pragma clang diagnostic pop diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jobstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -244,4 +244,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jobstep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jobstep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/jobstep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/jobstep.h 2024-08-03 07:30:01.000000000 +0000 @@ -567,5 +567,4 @@ } // namespace joblist -#endif // JOBLIST_JOBSTEP_H_ -// vim:ts=4 sw=4: +#endif // JOBLIST_JOBSTEP_H_ \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/lbidlist.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -920,4 +920,3 @@ } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/limitedorderby.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -303,4 +303,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/passthrucommand-jl.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -110,4 +110,3 @@ } }; // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pcolscan.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -472,4 +472,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pcolstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -616,4 +616,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/pdictionaryscan.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -929,4 +929,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/primitivemsg.h 2024-08-03 07:30:01.000000000 +0000 @@ -885,5 +885,4 @@ #pragma pack(pop) -#endif // JOBLIST_PRIMITIVE_H -// vim:ts=4 sw=4: +#endif // JOBLIST_PRIMITIVE_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/primitivestep.h 2024-08-03 07:30:01.000000000 +0000 @@ -111,18 +111,24 @@ pColStep(const PassThruStep& rhs); - virtual ~pColStep(){} + virtual ~pColStep() + { + } /** @brief Starts processing. Set at least the RID list before calling. * * Starts processing. Set at least the RID list before calling this. */ - virtual void run(){} + virtual void run() + { + } /** @brief Sync's the caller with the end of execution. * * Does nothing. Returns when this instance is finished. */ - virtual void join(){} + virtual void join() + { + } virtual const std::string toString() const; @@ -347,19 +353,25 @@ const execplan::CalpontSystemCatalog::ColType& ct, const JobInfo& jobInfo); pColScanStep(const pColStep& rhs); - ~pColScanStep(){} + ~pColScanStep() + { + } /** @brief Starts processing. * * Starts processing. */ - virtual void run(){} + virtual void run() + { + } /** @brief Sync's the caller with the end of execution. * * Does nothing. Returns when this instance is finished. */ - virtual void join(){} + virtual void join() + { + } virtual bool isDictCol() const { @@ -549,12 +561,18 @@ pDictionaryStep(execplan::CalpontSystemCatalog::OID oid, execplan::CalpontSystemCatalog::OID tabelOid, const execplan::CalpontSystemCatalog::ColType& ct, const JobInfo& jobInfo); - virtual ~pDictionaryStep(){} + virtual ~pDictionaryStep() + { + } /** @brief virtual void Run method */ - virtual void run(){} - virtual void join(){} + virtual void run() + { + } + virtual void join() + { + } // void setOutList(StringDataList* rids); void setInputList(DataList_t* rids) { @@ -1506,7 +1524,7 @@ protected: // void unblockDataLists(FifoDataList* fifo, StringFifoDataList* strFifo, StrDataList* strResult, - //DataList_t* result); + // DataList_t* result); private: // This i/f is not meaningful in this step @@ -1676,5 +1694,4 @@ } // namespace joblist -#endif // JOBLIST_PRIMITIVESTEP_H -// vim:ts=4 sw=4: +#endif // JOBLIST_PRIMITIVESTEP_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/rowestimator.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -269,8 +269,8 @@ float tempFactor = 1.0; uint64_t adjustedMin = 0, adjustedMax = 0; - uint128_t adjustedBigMin, adjustedBigMax; - uint32_t distinctValuesEstimate; + uint128_t adjustedBigMin = 0, adjustedBigMax = 0; + uint32_t distinctValuesEstimate = 0; // Adjust values based on column type and estimate the if (!ct.isWideDecimalType()) diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerystep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -533,4 +533,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerystep.h 2024-08-03 07:30:01.000000000 +0000 @@ -274,5 +274,4 @@ } // namespace joblist -#endif // SUBQUERY_STEP_H -// vim:ts=4 sw=4: +#endif // SUBQUERY_STEP_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/subquerytransformer.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -622,4 +622,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuple-bps.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -3334,4 +3334,3 @@ template bool TupleBPS::compareSingleValue(uint8_t COP, int128_t val1, int128_t val2) const; } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -5962,4 +5962,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleaggregatestep.h 2024-08-03 07:30:01.000000000 +0000 @@ -225,6 +225,4 @@ } // namespace joblist -#endif // JOBLIST_TUPLEAGGREGATESTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_TUPLEAGGREGATESTEP_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1258,4 +1258,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleannexstep.h 2024-08-03 07:30:01.000000000 +0000 @@ -194,6 +194,4 @@ } // namespace joblist -#endif // JOBLIST_TUPLEANNEXSTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_TUPLEANNEXSTEP_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -842,4 +842,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tupleconstantstep.h 2024-08-03 07:30:01.000000000 +0000 @@ -190,6 +190,4 @@ } // namespace joblist -#endif // JOBLIST_TUPLECONSTANTSTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_TUPLECONSTANTSTEP_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2017,4 +2017,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehashjoin.h 2024-08-03 07:30:01.000000000 +0000 @@ -653,5 +653,4 @@ } // namespace joblist -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -408,4 +408,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/tuplehavingstep.h 2024-08-03 07:30:01.000000000 +0000 @@ -117,5 +117,3 @@ } // namespace joblist #endif // JOBLIST_TUPLEHAVINGSTEP_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/virtualtable.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -158,4 +158,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1599,4 +1599,3 @@ } } // namespace joblist -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/joblist/windowfunctionstep.h 2024-08-03 07:30:01.000000000 +0000 @@ -226,6 +226,4 @@ } // namespace joblist -#endif // JOBLIST_WINDOWFUNCTIONSTEP_H - -// vim:ts=4 sw=4: +#endif // JOBLIST_WINDOWFUNCTIONSTEP_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_autoi.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -176,4 +176,3 @@ return autoincrement; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs.h 2024-08-03 07:30:01.000000000 +0000 @@ -118,6 +118,22 @@ return HA_MAX_REC_LENGTH; } +#ifdef MARIADB_NEW_COST_MODEL + /** @brief + Called in test_quick_select to determine if indexes should be used. + */ + virtual IO_AND_CPU_COST scan_time() override + { + IO_AND_CPU_COST cost; + cost.io= 0.0; + /* + For now, assume all cost is CPU cost. + The numbers are also very inadequate for the new cost model. + */ + cost.cpu= (double)(stats.records + stats.deleted) / 20.0 + 10; + return cost; + } +#else /** @brief Called in test_quick_select to determine if indexes should be used. */ @@ -125,6 +141,7 @@ { return (double)(stats.records + stats.deleted) / 20.0 + 10; } +#endif /** @brief Analyze table command. diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_datatype.h 2024-08-03 07:30:01.000000000 +0000 @@ -842,6 +842,4 @@ } // end of namespace datatypes -#endif - -// vim:ts=2 sw=2: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_ddl.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2810,4 +2810,3 @@ } } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_dml.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1001,4 +1001,3 @@ return rc; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_execplan.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -10481,4 +10481,3 @@ } } // namespace cal_impl_if -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_impl_if.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_impl_if.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_impl_if.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_mcs_impl_if.h 2024-08-03 07:30:01.000000000 +0000 @@ -30,6 +30,7 @@ #include #include #include +#include #include "idb_mysql.h" #include "ha_mcs_sysvars.h" diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/ha_pseudocolumn.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -584,4 +584,3 @@ } } // namespace cal_impl_if -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h --- mariadb-10.11.6/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dbcon/mysql/idb_mysql.h 2024-08-03 07:30:01.000000000 +0000 @@ -33,8 +33,8 @@ #endif #endif -//#define INFINIDB_DEBUG -//#define DEBUG_WALK_COND +// #define INFINIDB_DEBUG +// #define DEBUG_WALK_COND #define MYSQL_SERVER 1 // needed for definition of struct THD in mysql_priv.h #define USE_CALPONT_REGEX @@ -119,5 +119,4 @@ } } // namespace -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/ddlproc/ddlproc.cpp mariadb-10.11.9/storage/columnstore/columnstore/ddlproc/ddlproc.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/ddlproc/ddlproc.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/ddlproc/ddlproc.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -248,4 +248,3 @@ return ServiceDDLProc(opt).Run(); } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/ddlproc/ddlprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -876,4 +876,3 @@ return rc; } } // namespace ddlprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -547,4 +547,3 @@ errMsg = fErrMsg; } } // namespace dmlprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h --- mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/batchinsertprocessor.h 2024-08-03 07:30:01.000000000 +0000 @@ -94,5 +94,4 @@ }; } // namespace dmlprocessor -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/dmlproc.cpp mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlproc.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/dmlproc.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlproc.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -639,14 +639,7 @@ // Couldn't check the return code b/c // fuser returns 1 for unused port. -#if defined(__GNUC__) && __GNUC__ >= 5 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-result" - (void)::system(cmd.c_str()); -#pragma GCC diagnostic pop -#else - (void)::system(cmd.c_str()); -#endif + std::ignore = ::system(cmd.c_str()); } catch (...) { @@ -698,4 +691,3 @@ return ServiceDMLProc(opt).Run(); } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2001,4 +2001,3 @@ } } // namespace dmlprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/dmlprocessor.h mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlprocessor.h --- mariadb-10.11.6/storage/columnstore/columnstore/dmlproc/dmlprocessor.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/dmlproc/dmlprocessor.h 2024-08-03 07:30:01.000000000 +0000 @@ -331,5 +331,4 @@ } // namespace dmlprocessor -#endif // DMLPROCESSOR_H -// vim:ts=4 sw=4: +#endif // DMLPROCESSOR_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp mariadb-10.11.9/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/exemgr/activestatementcounter.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -57,4 +57,3 @@ --fStatementCount; condvar.notify_one(); } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/exemgr/activestatementcounter.h mariadb-10.11.9/storage/columnstore/columnstore/exemgr/activestatementcounter.h --- mariadb-10.11.6/storage/columnstore/columnstore/exemgr/activestatementcounter.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/exemgr/activestatementcounter.h 2024-08-03 07:30:01.000000000 +0000 @@ -63,5 +63,4 @@ BRM::VSS fVss; }; -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/exemgr/main.cpp mariadb-10.11.9/storage/columnstore/columnstore/exemgr/main.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/exemgr/main.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/exemgr/main.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1825,4 +1825,3 @@ return ServiceExeMgr(opt).Run(); } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp mariadb-10.11.9/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1063,4 +1063,3 @@ return ss.str(); } } // namespace oam -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h mariadb-10.11.9/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h --- mariadb-10.11.6/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/oam/oamcpp/liboamcpp.h 2024-08-03 07:30:01.000000000 +0000 @@ -425,5 +425,4 @@ #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp mariadb-10.11.9/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/oamapps/columnstoreDB/columnstoreDB.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -271,7 +271,7 @@ Oam oam; BRM::DBRM dbrm; - char c; + signed char c; // Invokes member function `int operator ()(void);' while ((c = getopt(argc, argv, "c:h")) != -1) diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp mariadb-10.11.9/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/oamapps/postConfigure/mycnfUpgrade.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -284,4 +284,3 @@ exit(0); } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp mariadb-10.11.9/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/oamapps/sessionWalker/sessionwalker.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -133,4 +133,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/blockcacheclient.h 2024-08-03 07:30:01.000000000 +0000 @@ -177,5 +177,4 @@ } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/blockrequestprocessor.h 2024-08-03 07:30:01.000000000 +0000 @@ -191,5 +191,4 @@ }; } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/filerequest.h mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/filerequest.h --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/filerequest.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/filerequest.h 2024-08-03 07:30:01.000000000 +0000 @@ -321,5 +321,4 @@ } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/iomanager.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1442,4 +1442,3 @@ } } // namespace dbbc -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/iomanager.h mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/iomanager.h --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/blockcache/iomanager.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/blockcache/iomanager.h 2024-08-03 07:30:01.000000000 +0000 @@ -43,7 +43,7 @@ #include "fileblockrequestqueue.h" #include "filebuffermgr.h" -//#define SHARED_NOTHING_DEMO_2 +// #define SHARED_NOTHING_DEMO_2 namespace dbbc { @@ -148,5 +148,4 @@ void purgeFDCache(std::vector& files); } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/column.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/column.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/column.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/column.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -18,7 +18,7 @@ #include #include -//#define NDEBUG +// #define NDEBUG #include #include #include @@ -1636,7 +1636,7 @@ T>::type* = nullptr> // gcc >= 5 #else sizeof(T) == sizeof(int128_t), - T>::type*> // gcc 4.8.5 + T>::type*> // gcc 4.8.5 #endif #else sizeof(T) == sizeof(int128_t), @@ -1672,7 +1672,7 @@ #if ___GNUC__ >= 5 typename std::enable_if::type* = nullptr> // gcc >= 5 #else - typename std::enable_if::type*> // gcc 4.8.5 + typename std::enable_if::type*> // gcc 4.8.5 #endif #else typename std::enable_if::type* = nullptr> @@ -1763,5 +1763,4 @@ template void primitives::PrimitiveProcessor::columnScanAndFilter(NewColRequestHeader*, ColResultHeader*); -} // namespace primitives -// vim:ts=4 sw=4: +} // namespace primitives \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/dictionary.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -620,4 +620,3 @@ } } // namespace primitives -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/index.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/index.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/index.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/index.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1130,4 +1130,3 @@ } } // namespace primitives -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/linux-port/primitiveprocessor.h 2024-08-03 07:30:01.000000000 +0000 @@ -563,5 +563,4 @@ } // namespace primitives -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/batchprimitiveprocessor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2806,4 +2806,3 @@ } } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/columncommand.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1226,4 +1226,3 @@ } } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/columncommand.h mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/columncommand.h --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/columncommand.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/columncommand.h 2024-08-03 07:30:01.000000000 +0000 @@ -307,5 +307,4 @@ } // namespace primitiveprocessor -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/primitiveserver.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2575,4 +2575,3 @@ // end workaround } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/primproc.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/primproc.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/primproc.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/primproc.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -786,4 +786,3 @@ return ServicePrimProc(opt).Run(); } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/udf.cpp mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/udf.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/primitives/primproc/udf.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/primitives/primproc/udf.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -69,4 +69,3 @@ } } // namespace primitiveprocessor -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/MetadataFile.cpp mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/MetadataFile.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/MetadataFile.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/MetadataFile.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -28,6 +28,7 @@ #include #include #include +#include #define max(x, y) (x > y ? x : y) #define min(x, y) (x < y ? x : y) diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/S3Storage.h mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/S3Storage.h --- mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/S3Storage.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/S3Storage.h 2024-08-03 07:30:01.000000000 +0000 @@ -18,6 +18,7 @@ #ifndef S3STORAGE_H_ #define S3STORAGE_H_ +#include #include #include #include "CloudStorage.h" diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/smcat.cpp mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/smcat.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/smcat.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/smcat.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -94,7 +94,7 @@ void catFileOnline(const char* filename, int prefixlen) { uint8_t data[8192]; - off_t offset = 0; + [[maybe_unused]] off_t offset = 0; int read_err, write_err, count; idbdatafile::SMDataFile df(filename, O_RDONLY, 0); diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/storage-manager/src/unit_tests.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1063,10 +1063,10 @@ copy_cmd* cmd = (copy_cmd*)buf; cmd->opcode = COPY; cmd->file1.flen = strlen(source); - strncpy(cmd->file1.filename, source, cmd->file1.flen); + memcpy(cmd->file1.filename, source, cmd->file1.flen); f_name* file2 = (f_name*)&cmd->file1.filename[cmd->file1.flen]; file2->flen = strlen(dest); - strncpy(file2->filename, dest, file2->flen); + memcpy(file2->filename, dest, file2->flen); uint len = (uint64_t)&file2->filename[file2->flen] - (uint64_t)buf; diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp mariadb-10.11.9/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tests/primitives_column_scan_and_filter.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -965,4 +965,3 @@ EXPECT_EQ(out->Max, __col16block_cdf_umax); EXPECT_EQ(out->Min, __col16block_cdf_umin); } -// vim:ts=2 sw=2: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp mariadb-10.11.9/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tests/primitives_scan_bench.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -427,4 +427,3 @@ BENCHMARK_REGISTER_F(FilterBenchFixture, BM_ColumnScan8Byte1FilterVectorizedCode); BENCHMARK_MAIN(); -// vim:ts=2 sw=2: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/bincvt/li2bin.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -278,4 +278,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/clearShm/main.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/clearShm/main.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/clearShm/main.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/clearShm/main.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -221,4 +221,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/dbbuilder/dbbuilder.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -324,4 +324,3 @@ return 1; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/ddlcleanup/ddlcleanup.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -80,4 +80,3 @@ return ddlcleanuputil::ddl_cleanup(); } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/editem/editem.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/editem/editem.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/editem/editem.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/editem/editem.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1040,4 +1040,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/passwd/secrets.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/passwd/secrets.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/passwd/secrets.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/passwd/secrets.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -13,6 +13,7 @@ #include "secrets.h" #include +#include #include #include #include @@ -35,12 +36,11 @@ using std::string; - #ifdef OPENSSL_VERSION_PREREQ -#if OPENSSL_VERSION_PREREQ(3,0) - #define EVP_CIPHER_key_length EVP_CIPHER_get_key_length - #define EVP_CIPHER_iv_length EVP_CIPHER_get_iv_length - #define EVP_CIPHER_blocksize EVP_CIPHER_get_blocksize +#if OPENSSL_VERSION_PREREQ(3, 0) +#define EVP_CIPHER_key_length EVP_CIPHER_get_key_length +#define EVP_CIPHER_iv_length EVP_CIPHER_get_iv_length +#define EVP_CIPHER_blocksize EVP_CIPHER_get_blocksize #endif #endif @@ -96,10 +96,6 @@ namespace { using HexLookupTable = std::array; -HexLookupTable init_hex_lookup_table() noexcept; - -// Hex char -> byte val lookup table. -const HexLookupTable hex_lookup_table = init_hex_lookup_table(); /* used in the bin2hex function */ const char hex_upper[] = "0123456789ABCDEF"; @@ -134,6 +130,9 @@ return rval; } +// Hex char -> byte val lookup table. +const HexLookupTable hex_lookup_table = init_hex_lookup_table(); + bool hex2bin(const char* in, unsigned int in_len, uint8_t* out) { // Input length must be multiple of two. diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/qfe/server.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/qfe/server.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/qfe/server.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/qfe/server.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -513,4 +513,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/sendPlan/sendplan.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -390,4 +390,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/tools/setConfig/main.cpp mariadb-10.11.9/storage/columnstore/columnstore/tools/setConfig/main.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/tools/setConfig/main.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/tools/setConfig/main.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -148,4 +148,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/cacheutils/cacheutils.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -354,4 +354,3 @@ } } // namespace cacheutils -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h mariadb-10.11.9/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/cacheutils/cacheutils.h 2024-08-03 07:30:01.000000000 +0000 @@ -73,6 +73,4 @@ int purgePrimProcFdCache(const std::vector files, const int pmId); } // namespace cacheutils -// vim:ts=4 sw=4: - #endif diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/cloudio/SocketPool.h mariadb-10.11.9/storage/columnstore/columnstore/utils/cloudio/SocketPool.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/cloudio/SocketPool.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/cloudio/SocketPool.h 2024-08-03 07:30:01.000000000 +0000 @@ -18,6 +18,7 @@ #ifndef _SOCKETPOOL_H_ #define _SOCKETPOOL_H_ +#include #include #include #include diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/common/hashfamily.h mariadb-10.11.9/storage/columnstore/columnstore/utils/common/hashfamily.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/common/hashfamily.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/common/hashfamily.h 2024-08-03 07:30:01.000000000 +0000 @@ -51,5 +51,4 @@ }; } // namespace utils -#endif -// vim:ts=2 sw=2: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/common/mcs_basic_types.h mariadb-10.11.9/storage/columnstore/columnstore/utils/common/mcs_basic_types.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/common/mcs_basic_types.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/common/mcs_basic_types.h 2024-08-03 07:30:01.000000000 +0000 @@ -22,5 +22,4 @@ using int128_t = __int128; using uint128_t = unsigned __int128; -#endif // MCS_BASIC_TYPES_H_INCLUDED -// vim:ts=2 sw=2: +#endif // MCS_BASIC_TYPES_H_INCLUDED \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/common/simd_sse.h mariadb-10.11.9/storage/columnstore/columnstore/utils/common/simd_sse.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/common/simd_sse.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/common/simd_sse.h 2024-08-03 07:30:01.000000000 +0000 @@ -892,4 +892,3 @@ } // namespace simd #endif // if defined(__x86_64__ ) -// vim:ts=2 sw=2: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/compress/idbcompress.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/compress/idbcompress.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/compress/idbcompress.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/compress/idbcompress.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -672,4 +672,3 @@ #endif } // namespace compress -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configcpp.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -669,4 +669,3 @@ } } // namespace config -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configcpp.h mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configcpp.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configcpp.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configcpp.h 2024-08-03 07:30:01.000000000 +0000 @@ -244,5 +244,4 @@ #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configstream.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configstream.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configstream.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configstream.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -64,4 +64,3 @@ } } // namespace config -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configstream.h mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configstream.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/configstream.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/configstream.h 2024-08-03 07:30:01.000000000 +0000 @@ -62,5 +62,4 @@ } // namespace config -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/xmlparser.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -285,4 +285,3 @@ } } // namespace config -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/xmlparser.h mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/xmlparser.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/configcpp/xmlparser.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/configcpp/xmlparser.h 2024-08-03 07:30:01.000000000 +0000 @@ -64,5 +64,4 @@ } // namespace config -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/dataconvert/dataconvert.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1418,7 +1418,7 @@ { int64_t val64; number_int_value(data, typeCode, colType, pushWarning, prm.noRoundup(), val64); - char ival = (char)val64; + signed char ival = (signed char)val64; if (ival < 0 && ival != static_cast(joblist::TINYINTEMPTYROW) && ival != static_cast(joblist::TINYINTNULL)) @@ -3388,4 +3388,3 @@ } } // namespace dataconvert -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -270,4 +270,3 @@ } } // namespace ddlcleanuputil -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h mariadb-10.11.9/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/ddlcleanup/ddlcleanuputil.h 2024-08-03 07:30:01.000000000 +0000 @@ -29,6 +29,4 @@ { int ddl_cleanup(); } -// vim:ts=4 sw=4: - #endif diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_abs.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -79,4 +79,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_add_time.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -303,4 +303,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ascii.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -56,4 +56,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_between.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_between.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_between.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_between.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -376,4 +376,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_bitwise.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -494,4 +494,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_case.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_case.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_case.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_case.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -723,4 +723,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_cast.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1549,4 +1549,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ceil.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -598,4 +598,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_char.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_char.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_char.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_char.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -178,4 +178,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_char_length.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -121,4 +121,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_coalesce.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -244,4 +244,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -65,4 +65,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat_oracle.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -71,4 +71,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_concat_ws.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -121,4 +121,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_conv.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -304,4 +304,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_convert_tz.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -220,4 +220,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_crc32.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -64,4 +64,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_date.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_date.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -149,4 +149,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date_add.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -816,4 +816,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_date_format.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -416,4 +416,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_day.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_day.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_day.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_day.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -143,4 +143,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayname.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -179,4 +179,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayofweek.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -166,4 +166,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_dayofyear.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -160,4 +160,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_div.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_div.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_div.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_div.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -108,4 +108,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_elt.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -96,4 +96,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_exp.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -110,4 +110,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_extract.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -254,4 +254,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_find_in_set.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -127,4 +127,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_floor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -555,4 +555,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_from_days.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -80,4 +80,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_from_unixtime.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -212,4 +212,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_get_format.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -107,4 +107,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_greatest.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -240,4 +240,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_hex.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -140,4 +140,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_hour.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -156,4 +156,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_idbpartition.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -63,4 +63,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_if.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_if.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_if.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_if.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -234,4 +234,3 @@ } } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ifnull.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -205,4 +205,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_in.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_in.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_in.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_in.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -386,4 +386,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_insert.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -102,4 +102,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_instr.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -85,4 +85,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_isnull.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -79,4 +79,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_last_day.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -195,4 +195,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_lcase.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -68,4 +68,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_least.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_least.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_least.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_least.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -218,4 +218,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_left.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_left.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_left.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_left.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -73,4 +73,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_length.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_length.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_length.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_length.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -55,4 +55,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_lpad.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -127,4 +127,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ltrim.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -93,4 +93,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ltrim_oracle.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -97,4 +97,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_makedate.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -190,4 +190,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_maketime.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -171,4 +171,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_math.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_math.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_math.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_math.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2276,4 +2276,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_md5.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -512,4 +512,3 @@ } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_microsecond.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -137,4 +137,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_minute.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -137,4 +137,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_mod.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -531,4 +531,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_month.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_month.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_month.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_month.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -142,4 +142,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_monthname.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -191,4 +191,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_nullif.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -964,7 +964,7 @@ { // strip off micro seconds value = value.substr(0, 14); - int64_t x = atoll(value.c_str()); + x = atoll(value.c_str()); if (s > 5) s = 0; @@ -1022,4 +1022,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_period_add.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -94,4 +94,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_period_diff.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -113,4 +113,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_pow.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -121,4 +121,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_quarter.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -139,4 +139,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_quote.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -80,4 +80,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rand.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -98,4 +98,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_regexp.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -248,4 +248,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_repeat.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -90,4 +90,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_replace.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -173,4 +173,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_replace_oracle.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -167,4 +167,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_reverse.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -93,4 +93,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_right.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_right.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_right.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_right.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -73,4 +73,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_round.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_round.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_round.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_round.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -645,7 +645,7 @@ { IDB_Decimal x = getDecimalVal(row, parm, isNull, op_ct); int64_t e = (x.scale < 0) ? (-x.scale) : x.scale; - int64_t p = 1; + [[maybe_unused]] int64_t p = 1; while (e-- > 0) p *= 10; @@ -716,4 +716,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rpad.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -127,4 +127,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rtrim.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -157,4 +157,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_rtrim_oracle.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -161,4 +161,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sec_to_time.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -231,4 +231,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_second.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_second.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_second.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_second.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -144,4 +144,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sha.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -655,4 +655,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sign.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -71,4 +71,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_space.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_space.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_space.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_space.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -57,4 +57,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_str_to_date.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -264,4 +264,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_strcmp.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -74,4 +74,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_substr.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -98,4 +98,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_substring_index.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -205,4 +205,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_sysdate.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -105,4 +105,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_time.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_time.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -169,4 +169,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time_format.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -229,4 +229,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_time_to_sec.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -195,4 +195,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_timediff.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -349,4 +349,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_timestampdiff.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -196,4 +196,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_to_days.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -151,4 +151,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_trim.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -168,4 +168,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_trim_oracle.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -166,4 +166,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_truncate.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -522,7 +522,7 @@ { // strip off micro seconds value = value.substr(0, 14); - int64_t x = atoll(value.c_str()); + x = atoll(value.c_str()); if (s > 5) s = 0; @@ -613,7 +613,7 @@ { // strip off micro seconds value = value.substr(0, 14); - int64_t x = atoll(value.c_str()); + x = atoll(value.c_str()); if (s > 5) s = 0; @@ -721,4 +721,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_ucase.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -77,4 +77,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_unhex.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -112,4 +112,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_unix_timestamp.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -223,4 +223,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_week.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_week.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_week.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_week.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -169,4 +169,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_weekday.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -164,4 +164,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_year.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_year.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_year.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_year.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -140,4 +140,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/func_yearweek.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -173,4 +173,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/functor.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/functor.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/funcexp/functor.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/funcexp/functor.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -361,4 +361,3 @@ } } // namespace funcexp -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h mariadb-10.11.9/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/libmysql_client/libmysql_client.h 2024-08-03 07:30:01.000000000 +0000 @@ -91,4 +91,3 @@ #endif // UTILS_LIBMYSQL_CL_H -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/loggingcpp/errorcodes.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -103,4 +103,3 @@ return (fPreamble + msg); } } // namespace logging -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h mariadb-10.11.9/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/loggingcpp/exceptclasses.h 2024-08-03 07:30:01.000000000 +0000 @@ -307,5 +307,4 @@ } // namespace logging -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/messageqcpp/inetstreamsocket.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -101,8 +101,6 @@ // some static functions namespace { -using messageqcpp::ByteStream; - // @bug 2441 - Retry after 512 read() error. // ERESTARTSYS (512) is a kernal I/O errno that is similar to a EINTR, except // that it is not supposed to "leak" out into the user space. But we are @@ -937,16 +935,8 @@ char buf = '\0'; (void)::recv(socketParms().sd(), &buf, 1, 0); #else -#if defined(__GNUC__) && __GNUC__ >= 5 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-result" - char buf = '\0'; - ::read(socketParms().sd(), &buf, 1); // we know 1 byte is in the recv buffer -#pragma GCC diagnostic pop -#else char buf = '\0'; - ::read(socketParms().sd(), &buf, 1); // we know 1 byte is in the recv buffer -#endif // pragma + std::ignore = ::read(socketParms().sd(), &buf, 1); // we know 1 byte is in the recv buffer #endif return; } diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h mariadb-10.11.9/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/messageqcpp/messagequeue.h 2024-08-03 07:30:01.000000000 +0000 @@ -337,5 +337,4 @@ #undef EXPORT -#endif // MESSAGEQCPP_MESSAGEQUEUE_H -// vim:ts=4 sw=4: +#endif // MESSAGEQCPP_MESSAGEQUEUE_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/multicast/multicast.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/multicast/multicast.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/multicast/multicast.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/multicast/multicast.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -93,4 +93,3 @@ } // namespace multicast -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/regr/regrmysql.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/regr/regrmysql.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/regr/regrmysql.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/regr/regrmysql.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1405,4 +1405,3 @@ return valOut; } } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/rowgroup/rowgroup.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1751,4 +1751,3 @@ } // namespace rowgroup -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h mariadb-10.11.9/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/rowgroup/rowgroup.h 2024-08-03 07:30:01.000000000 +0000 @@ -31,7 +31,7 @@ #include #include #include -//#define NDEBUG +// #define NDEBUG #include #include #include @@ -1525,8 +1525,8 @@ inline void setUseStringTable(bool); // RGData *convertToInlineData(uint64_t *size = NULL) const; // caller manages the memory returned by - //this void convertToInlineDataInPlace(); RGData *convertToStringTable(uint64_t *size = NULL) const; void - //convertToStringTableInPlace(); + // this void convertToInlineDataInPlace(); RGData *convertToStringTable(uint64_t *size = NULL) + // const; void convertToStringTableInPlace(); void serializeRGData(messageqcpp::ByteStream&) const; inline uint32_t getStringTableThreshold() const; @@ -2184,5 +2184,4 @@ } // namespace rowgroup -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/rwlock/rwlock.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -746,4 +746,3 @@ } } // namespace rwlock -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/rwlock/rwlock.h mariadb-10.11.9/storage/columnstore/columnstore/utils/rwlock/rwlock.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/rwlock/rwlock.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/rwlock/rwlock.h 2024-08-03 07:30:01.000000000 +0000 @@ -46,9 +46,15 @@ namespace rwlock { -const std::array RWLockNames = { { - "all", "VSS", "ExtentMap", "FreeList", "VBBM", "CopyLocks", "ExtentMapIndex", -} }; +const std::array RWLockNames = {{ + "all", + "VSS", + "ExtentMap", + "FreeList", + "VBBM", + "CopyLocks", + "ExtentMapIndex", +}}; /// the layout of the shmseg struct State @@ -283,5 +289,4 @@ #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/startup/installdir.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/startup/installdir.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/startup/installdir.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/startup/installdir.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -112,4 +112,3 @@ } } // namespace startup -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/startup/installdir.h mariadb-10.11.9/storage/columnstore/columnstore/utils/startup/installdir.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/startup/installdir.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/startup/installdir.h 2024-08-03 07:30:01.000000000 +0000 @@ -53,5 +53,4 @@ } // namespace startup -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/testbc/iomanager.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/testbc/iomanager.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/testbc/iomanager.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/testbc/iomanager.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -325,4 +325,3 @@ } } // namespace dbbc -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/testbc/iomanager.h mariadb-10.11.9/storage/columnstore/columnstore/utils/testbc/iomanager.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/testbc/iomanager.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/testbc/iomanager.h 2024-08-03 07:30:01.000000000 +0000 @@ -99,5 +99,4 @@ }; } // namespace dbbc -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/threadpool/prioritythreadpool.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -322,4 +322,3 @@ } } // namespace threadpool -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfmysql.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -535,4 +535,3 @@ return 0; } } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfsdk.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -375,4 +375,3 @@ } } // namespace udfsdk -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/udfsdk/udfsdk.h 2024-08-03 07:30:01.000000000 +0000 @@ -314,4 +314,3 @@ #undef EXPORT -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/framebound.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -72,4 +72,3 @@ } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/framebound.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/framebound.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/framebound.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/framebound.h 2024-08-03 07:30:01.000000000 +0000 @@ -146,6 +146,4 @@ } // namespace windowfunction -#endif // UTILS_FRAMEBOUND_H - -// vim:ts=4 sw=4: +#endif // UTILS_FRAMEBOUND_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -411,4 +411,3 @@ template class FrameBoundExpressionRange; } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrange.h 2024-08-03 07:30:01.000000000 +0000 @@ -214,6 +214,4 @@ } // namespace windowfunction -#endif // UTILS_FRAMEBOUNDRANGE_H - -// vim:ts=4 sw=4: +#endif // UTILS_FRAMEBOUNDRANGE_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -139,4 +139,3 @@ template class FrameBoundExpressionRow; } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/frameboundrow.h 2024-08-03 07:30:01.000000000 +0000 @@ -148,5 +148,3 @@ } // namespace windowfunction #endif // UTILS_FRAMEBOUNDROW_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/idborderby.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -898,4 +898,3 @@ } } // namespace ordering -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_count.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -184,4 +184,3 @@ WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_count.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_count.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_count.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_count.h 2024-08-03 07:30:01.000000000 +0000 @@ -49,5 +49,3 @@ } // namespace windowfunction #endif // UTILS_WF_COUNT_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -306,4 +306,3 @@ template void WF_lead_lag::parseParms(const std::vector&); } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_lead_lag.h 2024-08-03 07:30:01.000000000 +0000 @@ -54,5 +54,3 @@ } // namespace windowfunction #endif // UTILS_WF_LEAD_LAG_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -185,4 +185,3 @@ WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_min_max.h 2024-08-03 07:30:01.000000000 +0000 @@ -48,5 +48,3 @@ } // namespace windowfunction #endif // UTILS_WF_MIN_MAX_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -271,4 +271,3 @@ WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_nth_value.h 2024-08-03 07:30:01.000000000 +0000 @@ -52,5 +52,3 @@ } // namespace windowfunction #endif // UTILS_WF_NTH_VALUE_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -154,4 +154,3 @@ } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ntile.h 2024-08-03 07:30:01.000000000 +0000 @@ -49,5 +49,3 @@ } // namespace windowfunction #endif // UTILS_WF_NTILE_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -382,4 +382,3 @@ WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_percentile.h 2024-08-03 07:30:01.000000000 +0000 @@ -50,5 +50,3 @@ } // namespace windowfunction #endif // UTILS_WF_PERCENTILE_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -145,4 +145,3 @@ } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_ranking.h 2024-08-03 07:30:01.000000000 +0000 @@ -48,5 +48,3 @@ } // namespace windowfunction #endif // UTILS_WF_RANKING_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -86,4 +86,3 @@ } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_row_number.h 2024-08-03 07:30:01.000000000 +0000 @@ -47,5 +47,3 @@ } // namespace windowfunction #endif // UTILS_WF_ROW_NUMBER_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_stats.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -234,4 +234,3 @@ WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_stats.h 2024-08-03 07:30:01.000000000 +0000 @@ -50,5 +50,3 @@ } // namespace windowfunction #endif // UTILS_WF_STATS_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -306,4 +306,3 @@ int, const string&, int, WindowFunctionColumn*); } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_sum_avg.h 2024-08-03 07:30:01.000000000 +0000 @@ -61,6 +61,4 @@ } // namespace windowfunction -#endif // UTILS_WF_SUM_AVG_H - -// vim:ts=4 sw=4: +#endif // UTILS_WF_SUM_AVG_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1191,4 +1191,3 @@ fPrev = c; } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/wf_udaf.h 2024-08-03 07:30:01.000000000 +0000 @@ -113,6 +113,4 @@ } // namespace windowfunction -#endif // UTILS_WF_UDAF_H - -// vim:ts=4 sw=4: +#endif // UTILS_WF_UDAF_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowframe.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -81,4 +81,3 @@ } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowframe.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowframe.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowframe.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowframe.h 2024-08-03 07:30:01.000000000 +0000 @@ -121,5 +121,3 @@ } // namespace windowfunction #endif // UTILS_WINDOWFRAME_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunction.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -259,4 +259,3 @@ } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunction.h 2024-08-03 07:30:01.000000000 +0000 @@ -113,5 +113,3 @@ } // namespace windowfunction #endif // UTILS_WINDOWFUNCTION_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -797,4 +797,3 @@ } } // namespace windowfunction -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h --- mariadb-10.11.6/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/utils/windowfunction/windowfunctiontype.h 2024-08-03 07:30:01.000000000 +0000 @@ -305,5 +305,3 @@ } // namespace windowfunction #endif // UTILS_WINDOWFUNCTIONTYPE_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/brmshmimpl.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -410,4 +410,3 @@ } // namespace BRM -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/load_brm.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -127,4 +127,3 @@ return 0; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/slavecomm.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2432,4 +2432,3 @@ } // namespace BRM -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/versioning/BRM/vbbm.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -40,7 +40,6 @@ #include #include -namespace bi = boost::interprocess; #include #include @@ -1076,8 +1075,8 @@ } var = VBBM_MAGIC_V2; - int bytesWritten = 0; - int bytesToWrite = 12; + [[maybe_unused]] int bytesWritten = 0; + [[maybe_unused]] int bytesToWrite = 12; bytesWritten += out->write((char*)&var, 4); bytesWritten += out->write((char*)&vbbm->vbCurrentSize, 4); bytesWritten += out->write((char*)&vbbm->nFiles, 4); diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/client/we_clients.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/client/we_clients.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/client/we_clients.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/client/we_clients.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -545,4 +545,3 @@ } // namespace WriteEngine -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/client/we_clients.h mariadb-10.11.9/storage/columnstore/columnstore/writeengine/client/we_clients.h --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/client/we_clients.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/client/we_clients.h 2024-08-03 07:30:01.000000000 +0000 @@ -32,7 +32,7 @@ #include #include "bytestream.h" -//#include "we_message.h" +// #include "we_message.h" #include "threadsafequeue.h" #include "rwlock_local.h" #include "resourcemanager.h" @@ -181,5 +181,4 @@ #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -52,4 +52,3 @@ } // namespace redistribute -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistribute.h 2024-08-03 07:30:01.000000000 +0000 @@ -45,6 +45,4 @@ } // namespace redistribute -#endif // WE_REDISTRIBUTE_H - -// vim:ts=4 sw=4: +#endif // WE_REDISTRIBUTE_H \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -698,4 +698,3 @@ } // namespace redistribute -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrol.h 2024-08-03 07:30:01.000000000 +0000 @@ -126,5 +126,3 @@ } // namespace redistribute #endif // WE_REDISTRIBUTECONTROL_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -838,4 +838,3 @@ } // namespace redistribute -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributecontrolthread.h 2024-08-03 07:30:01.000000000 +0000 @@ -127,5 +127,3 @@ } // namespace redistribute #endif // WE_REDISTRIBUTECONTROLTHREAD_H - -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1520,4 +1520,3 @@ } // namespace redistribute -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/redistribute/we_redistributeworkerthread.h 2024-08-03 07:30:01.000000000 +0000 @@ -142,6 +142,4 @@ } // namespace redistribute -#endif // WE_REDISTRIBUTEWORKERTHREAD_H - -// vim:ts=4 sw=4: +#endif \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/server/we_ddlcommandproc.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -4952,4 +4952,3 @@ } } // namespace WriteEngine -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/shared/we_brm.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1741,4 +1741,3 @@ } } // namespace WriteEngine -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/shared/we_chunkmanager.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -2667,4 +2667,3 @@ } } // namespace WriteEngine -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/splitter/we_splitterapp.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -572,4 +572,3 @@ return SPLTR_EXIT_STATUS; } -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_colop.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -1910,4 +1910,3 @@ } } // namespace WriteEngine -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -109,4 +109,3 @@ return fColsExtsInfoMap; } } // namespace WriteEngine -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/we_tablemetadata.h 2024-08-03 07:30:01.000000000 +0000 @@ -99,5 +99,4 @@ #undef EXPORT -#endif -// vim:ts=4 sw=4: +#endif // WE_TABLEMETADATA_H__ \ No newline at end of file diff -Nru mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp --- mariadb-10.11.6/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp 2023-10-26 14:54:57.000000000 +0000 +++ mariadb-10.11.9/storage/columnstore/columnstore/writeengine/wrapper/writeengine.cpp 2024-08-03 07:30:01.000000000 +0000 @@ -6628,4 +6628,3 @@ } } // end of namespace -// vim:ts=4 sw=4: diff -Nru mariadb-10.11.6/storage/connect/CMakeLists.txt mariadb-10.11.9/storage/connect/CMakeLists.txt --- mariadb-10.11.6/storage/connect/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -406,7 +406,7 @@ STORAGE_ENGINE COMPONENT connect-engine RECOMPILE_FOR_EMBEDDED - LINK_LIBRARIES ${ZLIB_LIBRARY} ${XML_LIBRARY} ${ICONV_LIBRARY} + LINK_LIBRARIES ${ZLIB_LIBRARIES} ${XML_LIBRARY} ${ICONV_LIBRARY} ${ODBC_LIBRARY} ${JDBC_LIBRARY} ${MONGOC_LIBRARY} ${IPHLPAPI_LIBRARY} ${REST_LIBRARY}) IF(NOT TARGET connect) diff -Nru mariadb-10.11.6/storage/connect/array.h mariadb-10.11.9/storage/connect/array.h --- mariadb-10.11.6/storage/connect/array.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/array.h 2024-08-03 07:29:59.000000000 +0000 @@ -38,11 +38,11 @@ //ARRAY(PGLOBAL g, PARRAY par, int k); // Implementation - virtual int GetType(void) {return TYPE_ARRAY;} - virtual int GetResultType(void) {return Type;} - virtual int GetLength(void) {return Len;} - virtual int GetLengthEx(void) {return Len;} - virtual int GetScale() {return 0;} + int GetType(void) override {return TYPE_ARRAY;} + int GetResultType(void) override {return Type;} + int GetLength(void) override {return Len;} + int GetLengthEx(void) override {return Len;} + int GetScale() override {return 0;} int GetNval(void) {return Nval;} int GetSize(void) {return Size;} // PVAL GetValp(void) {return Valp;} @@ -51,13 +51,13 @@ // Methods using XOBJECT::GetIntValue; - virtual void Reset(void) {Bot = -1;} - virtual int Qcompare(int *, int *); - virtual bool Compare(PXOB) {assert(false); return false;} - virtual bool SetFormat(PGLOBAL, FORMAT&) {assert(false); return false;} + void Reset(void) override {Bot = -1;} + int Qcompare(int *, int *) override; + bool Compare(PXOB) override {assert(false); return false;} + bool SetFormat(PGLOBAL, FORMAT&) override {assert(false); return false;} //virtual int CheckSpcCol(PTDB, int) {return 0;} - virtual void Printf(PGLOBAL g, FILE *f, uint n); - virtual void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n) override; + void Prints(PGLOBAL g, char *ps, uint z) override; // void Empty(void); void SetPrecision(PGLOBAL g, int p); bool AddValue(PGLOBAL g, PSZ sp); @@ -119,7 +119,7 @@ void SetPars(PARRAY par, int i) {Pars[i] = par;} // Methods - virtual int Qcompare(int *i1, int *i2); // Sort compare routine + int Qcompare(int *i1, int *i2) override; // Sort compare routine bool Sort(PGLOBAL g); protected: diff -Nru mariadb-10.11.6/storage/connect/blkfil.h mariadb-10.11.9/storage/connect/blkfil.h --- mariadb-10.11.6/storage/connect/blkfil.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/blkfil.h 2024-08-03 07:29:59.000000000 +0000 @@ -27,8 +27,8 @@ // Methods virtual void Reset(PGLOBAL) = 0; virtual int BlockEval(PGLOBAL) = 0; - virtual void Printf(PGLOBAL g, FILE *f, uint n); - virtual void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n) override; + void Prints(PGLOBAL g, char *ps, uint z) override; protected: BLOCKFILTER(void) = default; // Standard constructor not to be used @@ -50,8 +50,8 @@ BLKFILLOG(PTDBDOS tdbp, int op, PBF *bfp, int n); // Methods - virtual void Reset(PGLOBAL g); - virtual int BlockEval(PGLOBAL g); + void Reset(PGLOBAL g) override; + int BlockEval(PGLOBAL g) override; protected: BLKFILLOG(void) = default; // Standard constructor not to be used @@ -70,8 +70,8 @@ BLKFILARI(PGLOBAL g, PTDBDOS tdbp, int op, PXOB *xp); // Methods - virtual void Reset(PGLOBAL g); - virtual int BlockEval(PGLOBAL g); + void Reset(PGLOBAL g) override; + int BlockEval(PGLOBAL g) override; virtual void MakeValueBitmap(void) {} protected: @@ -93,8 +93,8 @@ BLKFILAR2(PGLOBAL g, PTDBDOS tdbp, int op, PXOB *xp); // Methods - virtual int BlockEval(PGLOBAL g); - virtual void MakeValueBitmap(void); + int BlockEval(PGLOBAL g) override; + void MakeValueBitmap(void) override; protected: BLKFILAR2(void) = default; // Standard constructor not to be used @@ -114,8 +114,8 @@ BLKFILMR2(PGLOBAL g, PTDBDOS tdbp, int op, PXOB *xp); // Methods - virtual int BlockEval(PGLOBAL g); - virtual void MakeValueBitmap(void); + int BlockEval(PGLOBAL g) override; + void MakeValueBitmap(void) override; protected: BLKFILMR2(void) = default; // Standard constructor not to be used @@ -137,8 +137,8 @@ BLKSPCARI(PTDBDOS tdbp, int op, PXOB *xp, int bsize); // Methods - virtual void Reset(PGLOBAL g); - virtual int BlockEval(PGLOBAL g); + void Reset(PGLOBAL g) override; + int BlockEval(PGLOBAL g) override; protected: BLKSPCARI(void) = default; // Standard constructor not to be used @@ -159,8 +159,8 @@ BLKFILIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp); // Methods - virtual void Reset(PGLOBAL g); - virtual int BlockEval(PGLOBAL g); + void Reset(PGLOBAL g) override; + int BlockEval(PGLOBAL g) override; virtual void MakeValueBitmap(void) {} protected: @@ -181,8 +181,8 @@ // Methods //virtual void Reset(PGLOBAL g); - virtual int BlockEval(PGLOBAL g); - virtual void MakeValueBitmap(void); + int BlockEval(PGLOBAL g) override; + void MakeValueBitmap(void) override; protected: // Member @@ -205,8 +205,8 @@ BLKSPCIN(PGLOBAL g, PTDBDOS tdbp, int op, int opm, PXOB *xp, int bsize); // Methods - virtual void Reset(PGLOBAL g); - virtual int BlockEval(PGLOBAL g); + void Reset(PGLOBAL g) override; + int BlockEval(PGLOBAL g) override; protected: // Member diff -Nru mariadb-10.11.6/storage/connect/cmgfam.h mariadb-10.11.9/storage/connect/cmgfam.h --- mariadb-10.11.6/storage/connect/cmgfam.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/cmgfam.h 2024-08-03 07:29:59.000000000 +0000 @@ -26,18 +26,18 @@ CMGFAM(PCMGFAM txfp); // Implementation - virtual AMT GetAmType(void) { return TYPE_AM_MGO; } + AMT GetAmType(void) override { return TYPE_AM_MGO; } virtual bool GetUseTemp(void) { return false; } virtual int GetPos(void); virtual int GetNextPos(void); void SetTdbp(PTDBDOS tdbp) { Tdbp = tdbp; } - virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) CMGFAM(this); } + PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) CMGFAM(this); } void SetLrecl(int lrecl) { Lrecl = lrecl; } // Methods virtual void Reset(void); virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); + int Cardinality(PGLOBAL g) override; virtual int MaxBlkSize(PGLOBAL g, int s); virtual bool AllocateBuffer(PGLOBAL g) { return false; } virtual int GetRowID(void); diff -Nru mariadb-10.11.6/storage/connect/colblk.h mariadb-10.11.9/storage/connect/colblk.h --- mariadb-10.11.6/storage/connect/colblk.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/colblk.h 2024-08-03 07:29:59.000000000 +0000 @@ -27,12 +27,12 @@ public: // Implementation - virtual int GetType(void) {return TYPE_COLBLK;} - virtual int GetResultType(void) {return Buf_Type;} - virtual int GetScale(void) {return Format.Prec;} + int GetType(void) override {return TYPE_COLBLK;} + int GetResultType(void) override {return Buf_Type;} + int GetScale(void) override {return Format.Prec;} virtual int GetPrecision(void) {return Precision;} - virtual int GetLength(void) {return Long;} - virtual int GetLengthEx(void); + int GetLength(void) override {return Long;} + int GetLengthEx(void) override; virtual int GetAmType() {return TYPE_AM_ERROR;} virtual void SetOk(void) {Status |= BUF_EMPTY;} virtual PTDB GetTo_Tdb(void) {return To_Tdb;} @@ -65,17 +65,17 @@ void SetNullable(bool b) {Nullable = b;} void SetName(PSZ name_var) { Name= name_var; } // Methods - virtual void Reset(void); - virtual bool Compare(PXOB xp); - virtual bool SetFormat(PGLOBAL, FORMAT&); + void Reset(void) override; + bool Compare(PXOB xp) override; + bool SetFormat(PGLOBAL, FORMAT&) override; virtual bool IsSpecial(void) {return false;} - virtual bool Eval(PGLOBAL g); + bool Eval(PGLOBAL g) override; virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); virtual void SetTo_Val(PVAL) {} virtual void ReadColumn(PGLOBAL g); virtual void WriteColumn(PGLOBAL g); - virtual void Printf(PGLOBAL g, FILE *, uint); - virtual void Prints(PGLOBAL g, char *, uint); + void Printf(PGLOBAL g, FILE *, uint) override; + void Prints(PGLOBAL g, char *, uint) override; virtual bool VarSize(void) {return false;} bool InitValue(PGLOBAL g); @@ -108,13 +108,12 @@ SPCBLK(PCOLUMN cp); // Implementation - virtual int GetAmType(void) = 0; virtual bool GetRnm(void) {return false;} // Methods - virtual bool IsSpecial(void) {return true;} - virtual void ReadColumn(PGLOBAL g) = 0; - virtual void WriteColumn(PGLOBAL g); + bool IsSpecial(void) override {return true;} + void ReadColumn(PGLOBAL g) override = 0; + void WriteColumn(PGLOBAL g) override; protected: // Default constructor not to be used @@ -130,11 +129,11 @@ RIDBLK(PCOLUMN cp, bool rnm); // Implementation - virtual int GetAmType(void) {return TYPE_AM_ROWID;} - virtual bool GetRnm(void) {return Rnm;} + int GetAmType(void) override {return TYPE_AM_ROWID;} + bool GetRnm(void) override {return Rnm;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: bool Rnm; // False for RowID, True for RowNum @@ -149,11 +148,11 @@ FIDBLK(PCOLUMN cp, OPVAL op); // Implementation - virtual int GetAmType(void) {return TYPE_AM_FILID;} + int GetAmType(void) override {return TYPE_AM_FILID;} // Methods - virtual void Reset(void) {} // This is a pseudo constant column - virtual void ReadColumn(PGLOBAL g); + void Reset(void) override {} // This is a pseudo constant column + void ReadColumn(PGLOBAL g) override; protected: PCSZ Fn; // The current To_File of the table @@ -169,11 +168,11 @@ TIDBLK(PCOLUMN cp); // Implementation - virtual int GetAmType(void) {return TYPE_AM_TABID;} + int GetAmType(void) override {return TYPE_AM_TABID;} // Methods - virtual void Reset(void) {} // This is a pseudo constant column - virtual void ReadColumn(PGLOBAL g); + void Reset(void) override {} // This is a pseudo constant column + void ReadColumn(PGLOBAL g) override; protected: // Default constructor not to be used @@ -192,11 +191,11 @@ PRTBLK(PCOLUMN cp); // Implementation - virtual int GetAmType(void) {return TYPE_AM_PRTID;} + int GetAmType(void) override {return TYPE_AM_PRTID;} // Methods - virtual void Reset(void) {} // This is a pseudo constant column - virtual void ReadColumn(PGLOBAL g); + void Reset(void) override {} // This is a pseudo constant column + void ReadColumn(PGLOBAL g) override; protected: // Default constructor not to be used @@ -215,11 +214,11 @@ SIDBLK(PCOLUMN cp); // Implementation - virtual int GetAmType(void) {return TYPE_AM_SRVID;} + int GetAmType(void) override {return TYPE_AM_SRVID;} // Methods - virtual void Reset(void) {} // This is a pseudo constant column - virtual void ReadColumn(PGLOBAL g); + void Reset(void) override {} // This is a pseudo constant column + void ReadColumn(PGLOBAL g) override; protected: // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/domdoc.h mariadb-10.11.9/storage/connect/domdoc.h --- mariadb-10.11.6/storage/connect/domdoc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/domdoc.h 2024-08-03 07:29:59.000000000 +0000 @@ -73,7 +73,7 @@ // Methods virtual RCODE GetContent(PGLOBAL g, char *buf, int len); virtual bool SetContent(PGLOBAL g, char *txtp, int len); - virtual PXNODE Clone(PGLOBAL g, PXNODE np); + PXNODE Clone(PGLOBAL g, PXNODE np) override; virtual PXLIST GetChildElements(PGLOBAL g, char *xp, PXLIST lp); virtual PXLIST SelectNodes(PGLOBAL g, char *xp, PXLIST lp); virtual PXNODE SelectSingleNode(PGLOBAL g, char *xp, PXNODE np); diff -Nru mariadb-10.11.6/storage/connect/filamap.h mariadb-10.11.9/storage/connect/filamap.h --- mariadb-10.11.6/storage/connect/filamap.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filamap.h 2024-08-03 07:29:59.000000000 +0000 @@ -24,32 +24,32 @@ MAPFAM(PMAPFAM tmfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_MAP;} - virtual int GetPos(void); - virtual int GetNextPos(void); - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_MAP;} + int GetPos(void) override; + int GetNextPos(void) override; + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) MAPFAM(this);} // Methods - virtual void Reset(void); - virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g) {return (g) ? -1 : 0;} - virtual int MaxBlkSize(PGLOBAL g, int s) {return s;} - virtual int GetRowID(void); - virtual bool RecordPos(PGLOBAL g); - virtual bool SetPos(PGLOBAL g, int recpos); - virtual int SkipRecord(PGLOBAL g, bool header); - virtual bool OpenTableFile(PGLOBAL g); - virtual bool DeferReading(void) {return false;} + void Reset(void) override; + int GetFileLength(PGLOBAL g) override; + int Cardinality(PGLOBAL g) override {return (g) ? -1 : 0;} + int MaxBlkSize(PGLOBAL g, int s) override {return s;} + int GetRowID(void) override; + bool RecordPos(PGLOBAL g) override; + bool SetPos(PGLOBAL g, int recpos) override; + int SkipRecord(PGLOBAL g, bool header) override; + bool OpenTableFile(PGLOBAL g) override; + bool DeferReading(void) override {return false;} virtual int GetNext(PGLOBAL g) {return RC_EF;} - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: - virtual int InitDelete(PGLOBAL g, int fpos, int spos); + int InitDelete(PGLOBAL g, int fpos, int spos) override; // Members char *Memory; // Pointer on file mapping view. @@ -70,18 +70,18 @@ MBKFAM(PMAPFAM tmfp) : MAPFAM(tmfp) {} // Implementation - virtual PTXF Duplicate(PGLOBAL g) + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) MBKFAM(this);} // Methods - virtual void Reset(void); - virtual int Cardinality(PGLOBAL g); - virtual int MaxBlkSize(PGLOBAL g, int s) + void Reset(void) override; + int Cardinality(PGLOBAL g) override; + int MaxBlkSize(PGLOBAL g, int s) override {return TXTFAM::MaxBlkSize(g, s);} - virtual int GetRowID(void); - virtual int SkipRecord(PGLOBAL g, bool header); - virtual int ReadBuffer(PGLOBAL g); - virtual void Rewind(void); + int GetRowID(void) override; + int SkipRecord(PGLOBAL g, bool header) override; + int ReadBuffer(PGLOBAL g) override; + void Rewind(void) override; protected: // No additional members @@ -97,22 +97,22 @@ MPXFAM(PMAPFAM tmfp) : MBKFAM(tmfp) {} // Implementation - virtual int GetPos(void); - virtual PTXF Duplicate(PGLOBAL g) + int GetPos(void) override; + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) MPXFAM(this);} // Methods - virtual int Cardinality(PGLOBAL g) {return TXTFAM::Cardinality(g);} - virtual int MaxBlkSize(PGLOBAL g, int s) + int Cardinality(PGLOBAL g) override {return TXTFAM::Cardinality(g);} + int MaxBlkSize(PGLOBAL g, int s) override {return TXTFAM::MaxBlkSize(g, s);} - virtual bool SetPos(PGLOBAL g, int recpos); - virtual int GetNextPos(void) {return GetPos() + 1;} - virtual bool DeferReading(void) {return false;} - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); + bool SetPos(PGLOBAL g, int recpos) override; + int GetNextPos(void) override {return GetPos() + 1;} + bool DeferReading(void) override {return false;} + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; protected: - virtual int InitDelete(PGLOBAL g, int fpos, int spos); + int InitDelete(PGLOBAL g, int fpos, int spos) override; // No additional members }; // end of class MPXFAM diff -Nru mariadb-10.11.6/storage/connect/filamdbf.h mariadb-10.11.9/storage/connect/filamdbf.h --- mariadb-10.11.6/storage/connect/filamdbf.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filamdbf.h 2024-08-03 07:29:59.000000000 +0000 @@ -55,23 +55,23 @@ DBFFAM(PDBFFAM txfp) : FIXFAM(txfp), DBFBASE((PDBF)txfp) {} // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_DBF;} - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_DBF;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) DBFFAM(this);} // Methods - virtual int GetNerr(void) {return Nerr;} - virtual int Cardinality(PGLOBAL g); - virtual bool OpenTableFile(PGLOBAL g); - virtual bool AllocateBuffer(PGLOBAL g); - virtual void ResetBuffer(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + int GetNerr(void) override {return Nerr;} + int Cardinality(PGLOBAL g) override; + bool OpenTableFile(PGLOBAL g) override; + bool AllocateBuffer(PGLOBAL g) override; + void ResetBuffer(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: - virtual bool CopyHeader(PGLOBAL g); + bool CopyHeader(PGLOBAL g) override; //virtual int InitDelete(PGLOBAL g, int fpos, int spos); // Members @@ -88,18 +88,18 @@ DBMFAM(PDBMFAM txfp) : MPXFAM(txfp), DBFBASE((PDBF)txfp) {} // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_DBF;} - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_DBF;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) DBMFAM(this);} - virtual int GetDelRows(void); + int GetDelRows(void) override; // Methods - virtual int GetNerr(void) {return Nerr;} - virtual int Cardinality(PGLOBAL g); - virtual bool AllocateBuffer(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void Rewind(void); + int GetNerr(void) override {return Nerr;} + int Cardinality(PGLOBAL g) override; + bool AllocateBuffer(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void Rewind(void) override; protected: // Members diff -Nru mariadb-10.11.6/storage/connect/filamfix.h mariadb-10.11.9/storage/connect/filamfix.h --- mariadb-10.11.6/storage/connect/filamfix.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filamfix.h 2024-08-03 07:29:59.000000000 +0000 @@ -25,28 +25,28 @@ FIXFAM(PFIXFAM txfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_FIX;} - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_FIX;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) FIXFAM(this);} // Methods - virtual int Cardinality(PGLOBAL g) {return TXTFAM::Cardinality(g);} - virtual int MaxBlkSize(PGLOBAL g, int s) + int Cardinality(PGLOBAL g) override {return TXTFAM::Cardinality(g);} + int MaxBlkSize(PGLOBAL g, int s) override {return TXTFAM::MaxBlkSize(g, s);} - virtual bool SetPos(PGLOBAL g, int recpos); - virtual int GetNextPos(void) {return Fpos + 1;} - virtual bool AllocateBuffer(PGLOBAL g); - virtual void ResetBuffer(PGLOBAL g); + bool SetPos(PGLOBAL g, int recpos) override; + int GetNextPos(void) override {return Fpos + 1;} + bool AllocateBuffer(PGLOBAL g) override; + void ResetBuffer(PGLOBAL g) override; virtual int WriteModifiedBlock(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; protected: virtual bool CopyHeader(PGLOBAL g) {return false;} - virtual bool MoveIntermediateLines(PGLOBAL g, bool *b); - virtual int InitDelete(PGLOBAL g, int fpos, int spos); + bool MoveIntermediateLines(PGLOBAL g, bool *b) override; + int InitDelete(PGLOBAL g, int fpos, int spos) override; // No additional members }; // end of class FIXFAM @@ -64,22 +64,22 @@ BGXFAM(PBGXFAM txfp); // Implementation - virtual PTXF Duplicate(PGLOBAL g) + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) BGXFAM(this);} // Methods - virtual int Cardinality(PGLOBAL g); - virtual bool OpenTableFile(PGLOBAL g); - virtual int WriteModifiedBlock(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + int Cardinality(PGLOBAL g) override; + bool OpenTableFile(PGLOBAL g) override; + int WriteModifiedBlock(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: - virtual bool OpenTempFile(PGLOBAL g); - virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); + bool OpenTempFile(PGLOBAL g) override; + bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL) override; int BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req); bool BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req); bool BigSeek(PGLOBAL g, HANDLE h, BIGINT pos diff -Nru mariadb-10.11.6/storage/connect/filamgz.h mariadb-10.11.9/storage/connect/filamgz.h --- mariadb-10.11.6/storage/connect/filamgz.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filamgz.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,28 +28,28 @@ GZFAM(PGZFAM txfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_GZ;} - virtual int GetPos(void); - virtual int GetNextPos(void); - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_GZ;} + int GetPos(void) override; + int GetNextPos(void) override; + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) GZFAM(this);} // Methods - virtual void Reset(void); - virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g) {return (g) ? -1 : 0;} - virtual int MaxBlkSize(PGLOBAL g, int s) {return s;} - virtual bool AllocateBuffer(PGLOBAL g); - virtual int GetRowID(void); - virtual bool RecordPos(PGLOBAL g); - virtual bool SetPos(PGLOBAL g, int recpos); - virtual int SkipRecord(PGLOBAL g, bool header); - virtual bool OpenTableFile(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + void Reset(void) override; + int GetFileLength(PGLOBAL g) override; + int Cardinality(PGLOBAL g) override {return (g) ? -1 : 0;} + int MaxBlkSize(PGLOBAL g, int s) override {return s;} + bool AllocateBuffer(PGLOBAL g) override; + int GetRowID(void) override; + bool RecordPos(PGLOBAL g) override; + bool SetPos(PGLOBAL g, int recpos) override; + int SkipRecord(PGLOBAL g, bool header) override; + bool OpenTableFile(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: int Zerror(PGLOBAL g); // GZ error function @@ -71,23 +71,23 @@ ZBKFAM(PZBKFAM txfp); // Implementation - virtual int GetPos(void); - virtual int GetNextPos(void) {return 0;} - virtual PTXF Duplicate(PGLOBAL g) + int GetPos(void) override; + int GetNextPos(void) override {return 0;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) ZBKFAM(this);} // Methods - virtual int Cardinality(PGLOBAL g); - virtual int MaxBlkSize(PGLOBAL g, int s); - virtual bool AllocateBuffer(PGLOBAL g); - virtual int GetRowID(void); - virtual bool RecordPos(PGLOBAL g); - virtual int SkipRecord(PGLOBAL g, bool header); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + int Cardinality(PGLOBAL g) override; + int MaxBlkSize(PGLOBAL g, int s) override; + bool AllocateBuffer(PGLOBAL g) override; + int GetRowID(void) override; + bool RecordPos(PGLOBAL g) override; + int SkipRecord(PGLOBAL g, bool header) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: // Members @@ -108,15 +108,15 @@ GZXFAM(PZIXFAM txfp) : ZBKFAM(txfp) {} // Implementation - virtual int GetNextPos(void) {return 0;} - virtual PTXF Duplicate(PGLOBAL g) + int GetNextPos(void) override {return 0;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) GZXFAM(this);} // Methods - virtual int Cardinality(PGLOBAL g); - virtual bool AllocateBuffer(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); + int Cardinality(PGLOBAL g) override; + bool AllocateBuffer(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; protected: // No additional Members @@ -140,21 +140,21 @@ ZLBFAM(PZLBFAM txfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_ZLIB;} - virtual int GetPos(void); - virtual int GetNextPos(void); - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_ZLIB;} + int GetPos(void) override; + int GetNextPos(void) override; + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) ZLBFAM(this);} inline void SetOptimized(bool b) {Optimized = b;} // Methods - virtual int GetFileLength(PGLOBAL g); - virtual bool SetPos(PGLOBAL g, int recpos); - virtual bool AllocateBuffer(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + int GetFileLength(PGLOBAL g) override; + bool SetPos(PGLOBAL g, int recpos) override; + bool AllocateBuffer(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: bool WriteCompressedBuffer(PGLOBAL g); diff -Nru mariadb-10.11.6/storage/connect/filamtxt.h mariadb-10.11.9/storage/connect/filamtxt.h --- mariadb-10.11.6/storage/connect/filamtxt.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filamtxt.h 2024-08-03 07:29:59.000000000 +0000 @@ -134,35 +134,35 @@ DOSFAM(PBLKFAM tdfp, PDOSDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_DOS;} - virtual bool GetUseTemp(void) {return UseTemp;} - virtual int GetPos(void); - virtual int GetNextPos(void); - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_DOS;} + bool GetUseTemp(void) override {return UseTemp;} + int GetPos(void) override; + int GetNextPos(void) override; + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) DOSFAM(this);} // Methods - virtual void Reset(void); - virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); - virtual int MaxBlkSize(PGLOBAL g, int s); - virtual bool AllocateBuffer(PGLOBAL g); - virtual int GetRowID(void); - virtual bool RecordPos(PGLOBAL g); - virtual bool SetPos(PGLOBAL g, int recpos); - virtual int SkipRecord(PGLOBAL g, bool header); - virtual bool OpenTableFile(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + void Reset(void) override; + int GetFileLength(PGLOBAL g) override; + int Cardinality(PGLOBAL g) override; + int MaxBlkSize(PGLOBAL g, int s) override; + bool AllocateBuffer(PGLOBAL g) override; + int GetRowID(void) override; + bool RecordPos(PGLOBAL g) override; + bool SetPos(PGLOBAL g, int recpos) override; + int SkipRecord(PGLOBAL g, bool header) override; + bool OpenTableFile(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: virtual bool OpenTempFile(PGLOBAL g); virtual bool MoveIntermediateLines(PGLOBAL g, bool *b); virtual int RenameTempFile(PGLOBAL g); - virtual int InitDelete(PGLOBAL g, int fpos, int spos); + int InitDelete(PGLOBAL g, int fpos, int spos) override; // Members FILE *Stream; // Points to Dos file structure @@ -183,25 +183,25 @@ BLKFAM(PBLKFAM txfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_BLK;} - virtual int GetPos(void); - virtual int GetNextPos(void); - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_BLK;} + int GetPos(void) override; + int GetNextPos(void) override; + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) BLKFAM(this);} // Methods - virtual void Reset(void); - virtual int Cardinality(PGLOBAL g); - virtual int MaxBlkSize(PGLOBAL g, int s); - virtual bool AllocateBuffer(PGLOBAL g); - virtual int GetRowID(void); - virtual bool RecordPos(PGLOBAL g); - virtual bool SetPos(PGLOBAL g, int recpos); - virtual int SkipRecord(PGLOBAL g, bool header); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + void Reset(void) override; + int Cardinality(PGLOBAL g) override; + int MaxBlkSize(PGLOBAL g, int s) override; + bool AllocateBuffer(PGLOBAL g) override; + int GetRowID(void) override; + bool RecordPos(PGLOBAL g) override; + bool SetPos(PGLOBAL g, int recpos) override; + int SkipRecord(PGLOBAL g, bool header) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: // Members @@ -222,24 +222,24 @@ BINFAM(PBINFAM txfp) : DOSFAM(txfp) {Recsize = txfp->Recsize;} // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_BIN;} + AMT GetAmType(void) override {return TYPE_AM_BIN;} //virtual int GetPos(void); //virtual int GetNextPos(void); - virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) BINFAM(this); } + PTXF Duplicate(PGLOBAL g) override { return (PTXF)new(g) BINFAM(this); } // Methods //virtual void Reset(void) {TXTFAM::Reset();} //virtual int GetFileLength(PGLOBAL g); //virtual int Cardinality(PGLOBAL g); - virtual int MaxBlkSize(PGLOBAL g, int s) {return s;} - virtual bool AllocateBuffer(PGLOBAL g); + int MaxBlkSize(PGLOBAL g, int s) override {return s;} + bool AllocateBuffer(PGLOBAL g) override; //virtual int GetRowID(void); //virtual bool RecordPos(PGLOBAL g); //virtual bool SetPos(PGLOBAL g, int recpos); - virtual int SkipRecord(PGLOBAL g, bool header) {return RC_OK;} + int SkipRecord(PGLOBAL g, bool header) override {return RC_OK;} //virtual bool OpenTableFile(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; //virtual int DeleteRecords(PGLOBAL g, int irc); //virtual void CloseTableFile(PGLOBAL g, bool abort); //virtual void Rewind(void); diff -Nru mariadb-10.11.6/storage/connect/filamvct.h mariadb-10.11.9/storage/connect/filamvct.h --- mariadb-10.11.6/storage/connect/filamvct.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filamvct.h 2024-08-03 07:29:59.000000000 +0000 @@ -34,27 +34,27 @@ VCTFAM(PVCTFAM txfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_VCT;} - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_VCT;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) VCTFAM(this);} - virtual int GetFileLength(PGLOBAL g); + int GetFileLength(PGLOBAL g) override; // Methods - virtual void Reset(void); - virtual int MaxBlkSize(PGLOBAL g, int s); - virtual bool AllocateBuffer(PGLOBAL g); + void Reset(void) override; + int MaxBlkSize(PGLOBAL g, int s) override; + bool AllocateBuffer(PGLOBAL g) override; virtual bool InitInsert(PGLOBAL g); - virtual void ResetBuffer(PGLOBAL g) {} - virtual int Cardinality(PGLOBAL g); - virtual int GetRowID(void); + void ResetBuffer(PGLOBAL g) override {} + int Cardinality(PGLOBAL g) override; + int GetRowID(void) override; // Database routines - virtual bool OpenTableFile(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + bool OpenTableFile(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; // Specific functions virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp); @@ -62,9 +62,9 @@ protected: virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn); - virtual bool OpenTempFile(PGLOBAL g); + bool OpenTempFile(PGLOBAL g) override; virtual bool MoveLines(PGLOBAL g) {return false;} - virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); + bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL) override; virtual bool CleanUnusedSpace(PGLOBAL g); virtual int GetBlockInfo(PGLOBAL g); virtual bool SetBlockInfo(PGLOBAL g); @@ -98,25 +98,25 @@ VCMFAM(PVCMFAM txfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_VMP;} - virtual PTXF Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_VMP;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) VCMFAM(this);} // Methods - virtual bool AllocateBuffer(PGLOBAL g); - virtual bool InitInsert(PGLOBAL g); + bool AllocateBuffer(PGLOBAL g) override; + bool InitInsert(PGLOBAL g) override; // Database routines - virtual bool OpenTableFile(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); + bool OpenTableFile(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; protected: // Specific functions - virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); - virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp); - virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp); + bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL) override; + bool ReadBlock(PGLOBAL g, PVCTCOL colp) override; + bool WriteBlock(PGLOBAL g, PVCTCOL colp) override; // Members char* Memory; // Pointer on file mapping view. @@ -137,29 +137,29 @@ VECFAM(PVECFAM txfp); // Implementation - virtual PTXF Duplicate(PGLOBAL g) + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) VECFAM(this);} // Methods - virtual bool AllocateBuffer(PGLOBAL g); - virtual bool InitInsert(PGLOBAL g); - virtual void ResetBuffer(PGLOBAL g); + bool AllocateBuffer(PGLOBAL g) override; + bool InitInsert(PGLOBAL g) override; + void ResetBuffer(PGLOBAL g) override; // Database routines - virtual bool OpenTableFile(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); + bool OpenTableFile(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; // Specific functions - virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp); - virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp); + bool ReadBlock(PGLOBAL g, PVCTCOL colp) override; + bool WriteBlock(PGLOBAL g, PVCTCOL colp) override; protected: - virtual bool OpenTempFile(PGLOBAL g); - virtual bool MoveLines(PGLOBAL g); - virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); - virtual int RenameTempFile(PGLOBAL g); + bool OpenTempFile(PGLOBAL g) override; + bool MoveLines(PGLOBAL g) override; + bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL) override; + int RenameTempFile(PGLOBAL g) override; bool OpenColumnFile(PGLOBAL g, PCSZ opmode, int i); // Members @@ -184,16 +184,16 @@ VMPFAM(PVMPFAM txfp); // Implementation - virtual PTXF Duplicate(PGLOBAL g) + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) VMPFAM(this);} // Methods - virtual bool AllocateBuffer(PGLOBAL g); + bool AllocateBuffer(PGLOBAL g) override; // Database routines - virtual bool OpenTableFile(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); + bool OpenTableFile(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; protected: bool MapColumnFile(PGLOBAL g, MODE mode, int i); @@ -214,33 +214,33 @@ BGVFAM(PBGVFAM txfp); // Implementation - virtual PTXF Duplicate(PGLOBAL g) + PTXF Duplicate(PGLOBAL g) override {return (PTXF)new(g) BGVFAM(this);} // Methods - virtual bool AllocateBuffer(PGLOBAL g); + bool AllocateBuffer(PGLOBAL g) override; // Database routines - virtual bool OpenTableFile(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + bool OpenTableFile(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; // Specific functions - virtual bool ReadBlock(PGLOBAL g, PVCTCOL colp); - virtual bool WriteBlock(PGLOBAL g, PVCTCOL colp); + bool ReadBlock(PGLOBAL g, PVCTCOL colp) override; + bool WriteBlock(PGLOBAL g, PVCTCOL colp) override; protected: bool BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b = false); bool BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req); bool BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req); - virtual bool MakeEmptyFile(PGLOBAL g, PCSZ fn); - virtual bool OpenTempFile(PGLOBAL g); - virtual bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL); - virtual bool CleanUnusedSpace(PGLOBAL g); - virtual bool SetBlockInfo(PGLOBAL g); - virtual int GetBlockInfo(PGLOBAL g); + bool MakeEmptyFile(PGLOBAL g, PCSZ fn) override; + bool OpenTempFile(PGLOBAL g) override; + bool MoveIntermediateLines(PGLOBAL g, bool *b = NULL) override; + bool CleanUnusedSpace(PGLOBAL g) override; + bool SetBlockInfo(PGLOBAL g) override; + int GetBlockInfo(PGLOBAL g) override; // Members HANDLE Hfile; // Handle to big file diff -Nru mariadb-10.11.6/storage/connect/filamzip.h mariadb-10.11.9/storage/connect/filamzip.h --- mariadb-10.11.6/storage/connect/filamzip.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filamzip.h 2024-08-03 07:29:59.000000000 +0000 @@ -97,16 +97,16 @@ UNZFAM(PUNZFAM txfp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_ZIP;} - virtual PTXF Duplicate(PGLOBAL g) {return (PTXF) new(g) UNZFAM(this);} + AMT GetAmType(void) override {return TYPE_AM_ZIP;} + PTXF Duplicate(PGLOBAL g) override {return (PTXF) new(g) UNZFAM(this);} // Methods - virtual int Cardinality(PGLOBAL g); - virtual int GetFileLength(PGLOBAL g); + int Cardinality(PGLOBAL g) override; + int GetFileLength(PGLOBAL g) override; //virtual int MaxBlkSize(PGLOBAL g, int s) {return s;} - virtual bool OpenTableFile(PGLOBAL g); - virtual bool DeferReading(void) { return false; } - virtual int GetNext(PGLOBAL g); + bool OpenTableFile(PGLOBAL g) override; + bool DeferReading(void) override { return false; } + int GetNext(PGLOBAL g) override; //virtual int ReadBuffer(PGLOBAL g); //virtual int WriteBuffer(PGLOBAL g); //virtual int DeleteRecords(PGLOBAL g, int irc); @@ -129,14 +129,14 @@ UZXFAM(PUZXFAM txfp); // Implementation - virtual AMT GetAmType(void) { return TYPE_AM_ZIP; } - virtual PTXF Duplicate(PGLOBAL g) { return (PTXF) new(g)UZXFAM(this); } + AMT GetAmType(void) override { return TYPE_AM_ZIP; } + PTXF Duplicate(PGLOBAL g) override { return (PTXF) new(g)UZXFAM(this); } // Methods - virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); - virtual bool OpenTableFile(PGLOBAL g); - virtual int GetNext(PGLOBAL g); + int GetFileLength(PGLOBAL g) override; + int Cardinality(PGLOBAL g) override; + bool OpenTableFile(PGLOBAL g) override; + int GetNext(PGLOBAL g) override; //virtual int ReadBuffer(PGLOBAL g); protected: @@ -156,14 +156,14 @@ UZDFAM(PUZDFAM txfp); // Implementation - virtual AMT GetAmType(void) { return TYPE_AM_ZIP; } - virtual PTXF Duplicate(PGLOBAL g) { return (PTXF) new(g)UZDFAM(this); } + AMT GetAmType(void) override { return TYPE_AM_ZIP; } + PTXF Duplicate(PGLOBAL g) override { return (PTXF) new(g)UZDFAM(this); } // Methods - virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); - virtual bool OpenTableFile(PGLOBAL g); - virtual int GetNext(PGLOBAL g); + int GetFileLength(PGLOBAL g) override; + int Cardinality(PGLOBAL g) override; + bool OpenTableFile(PGLOBAL g) override; + int GetNext(PGLOBAL g) override; //virtual int ReadBuffer(PGLOBAL g); protected: @@ -184,17 +184,17 @@ ZIPFAM(PDOSDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_ZIP;} + AMT GetAmType(void) override {return TYPE_AM_ZIP;} // Methods - virtual int Cardinality(PGLOBAL g) {return 0;} - virtual int GetFileLength(PGLOBAL g) {return g ? 0 : 1;} + int Cardinality(PGLOBAL g) override {return 0;} + int GetFileLength(PGLOBAL g) override {return g ? 0 : 1;} //virtual int MaxBlkSize(PGLOBAL g, int s) {return s;} - virtual bool OpenTableFile(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); + bool OpenTableFile(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; //virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); + void CloseTableFile(PGLOBAL g, bool abort) override; protected: // Members @@ -213,14 +213,14 @@ ZPXFAM(PDOSDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_ZIP;} + AMT GetAmType(void) override {return TYPE_AM_ZIP;} // Methods - virtual int Cardinality(PGLOBAL g) {return 0;} - virtual int GetFileLength(PGLOBAL g) {return g ? 0 : 1;} - virtual bool OpenTableFile(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual void CloseTableFile(PGLOBAL g, bool abort); + int Cardinality(PGLOBAL g) override {return 0;} + int GetFileLength(PGLOBAL g) override {return g ? 0 : 1;} + bool OpenTableFile(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + void CloseTableFile(PGLOBAL g, bool abort) override; protected: // Members diff -Nru mariadb-10.11.6/storage/connect/filter.h mariadb-10.11.9/storage/connect/filter.h --- mariadb-10.11.6/storage/connect/filter.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/filter.h 2024-08-03 07:29:59.000000000 +0000 @@ -34,11 +34,11 @@ FILTER(PFIL fil1); // Implementation - virtual int GetType(void) {return TYPE_FILTER;} - virtual int GetResultType(void) {return TYPE_INT;} - virtual int GetLength(void) {return 1;} - virtual int GetLengthEx(void) {assert(FALSE); return 0;} - virtual int GetScale() {return 0;}; + int GetType(void) override {return TYPE_FILTER;} + int GetResultType(void) override {return TYPE_INT;} + int GetLength(void) override {return 1;} + int GetLengthEx(void) override {assert(FALSE); return 0;} + int GetScale() override {return 0;}; PFIL GetNext(void) {return Next;} OPVAL GetOpc(void) {return Opc;} int GetOpm(void) {return Opm;} @@ -50,19 +50,19 @@ void SetNext(PFIL filp) {Next = filp;} // Methods - virtual void Reset(void); - virtual bool Compare(PXOB) {return FALSE;} // Not used yet - virtual bool Init(PGLOBAL); - virtual bool Eval(PGLOBAL); - virtual bool SetFormat(PGLOBAL, FORMAT&) {return TRUE;} // NUY + void Reset(void) override; + bool Compare(PXOB) override {return FALSE;} // Not used yet + bool Init(PGLOBAL) override; + bool Eval(PGLOBAL) override; + bool SetFormat(PGLOBAL, FORMAT&) override {return TRUE;} // NUY //virtual int CheckColumn(PGLOBAL g, PSQL sqlp, PXOB &xp, int &ag); //virtual int RefNum(PSQL); //virtual PXOB SetSelect(PGLOBAL, PSQL, bool) {return NULL;} // NUY //virtual PXOB CheckSubQuery(PGLOBAL, PSQL); //virtual bool CheckLocal(PTDB); //virtual int CheckSpcCol(PTDB tdbp, int n); - virtual void Printf(PGLOBAL g, FILE *f, uint n); - virtual void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n) override; + void Prints(PGLOBAL g, char *ps, uint z) override; // PFIL Linearize(bool nosep); // PFIL Link(PGLOBAL g, PFIL fil2); // PFIL RemoveLastSep(void); @@ -102,7 +102,7 @@ class FILTERX : public FILTER { public: // Methods - virtual bool Eval(PGLOBAL) = 0; // just to prevent direct FILTERX use + bool Eval(PGLOBAL) override = 0; // just to prevent direct FILTERX use // Fake operator new used to change a filter into a derived filter void * operator new(size_t, PFIL filp) {return filp;} @@ -123,7 +123,7 @@ FILTERCMP(PGLOBAL g); // Methods - virtual bool Eval(PGLOBAL); + bool Eval(PGLOBAL) override; }; // end of class FILTEREQ /***********************************************************************/ @@ -132,7 +132,7 @@ class FILTERAND : public FILTERX { public: // Methods - virtual bool Eval(PGLOBAL); + bool Eval(PGLOBAL) override; }; // end of class FILTERAND /***********************************************************************/ @@ -141,7 +141,7 @@ class FILTEROR : public FILTERX { public: // Methods - virtual bool Eval(PGLOBAL); + bool Eval(PGLOBAL) override; }; // end of class FILTEROR /***********************************************************************/ @@ -150,7 +150,7 @@ class FILTERNOT : public FILTERX { public: // Methods - virtual bool Eval(PGLOBAL); + bool Eval(PGLOBAL) override; }; // end of class FILTERNOT /***********************************************************************/ @@ -159,7 +159,7 @@ class FILTERIN : public FILTERX { public: // Methods - virtual bool Eval(PGLOBAL); + bool Eval(PGLOBAL) override; }; // end of class FILTERIN /***********************************************************************/ @@ -171,8 +171,8 @@ FILTERTRUE(PVAL valp) {Value = valp; Value->SetValue_bool(TRUE);} // Methods - virtual void Reset(void); - virtual bool Eval(PGLOBAL); + void Reset(void) override; + bool Eval(PGLOBAL) override; }; // end of class FILTERTRUE #endif // __FILTER__ diff -Nru mariadb-10.11.6/storage/connect/ha_connect.cc mariadb-10.11.9/storage/connect/ha_connect.cc --- mariadb-10.11.6/storage/connect/ha_connect.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/ha_connect.cc 2024-08-03 07:29:59.000000000 +0000 @@ -6454,6 +6454,9 @@ ha_create_table() in handle.cc */ +/* Stack size 25608 in clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int ha_connect::create(const char *name, TABLE *table_arg, HA_CREATE_INFO *create_info) { @@ -6998,6 +7001,7 @@ table= st; DBUG_RETURN(rc); } // end of create +PRAGMA_REENABLE_CHECK_STACK_FRAME /** Used to check whether a file based outward table can be populated by @@ -7005,6 +7009,10 @@ - file does not exist or is void - user has file privilege */ + +/* Stack size 16664 in clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + bool ha_connect::FileExists(const char *fn, bool bf) { if (!fn || !*fn) @@ -7055,6 +7063,7 @@ return true; } // end of FileExists +PRAGMA_REENABLE_CHECK_STACK_FRAME // Called by SameString and NoFieldOptionChange bool ha_connect::CheckString(PCSZ str1, PCSZ str2) diff -Nru mariadb-10.11.6/storage/connect/ha_connect.h mariadb-10.11.9/storage/connect/ha_connect.h --- mariadb-10.11.6/storage/connect/ha_connect.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/ha_connect.h 2024-08-03 07:29:59.000000000 +0000 @@ -224,13 +224,13 @@ /** @brief The name that will be used for display purposes. */ - const char *table_type() const {return "CONNECT";} + const char *table_type() const override {return "CONNECT";} /** @brief The name of the index type that will be used for display. Don't implement this method unless you really have indexes. */ - const char *index_type(uint inx); + const char *index_type(uint inx) override; /** @brief The file extensions. @@ -241,15 +241,15 @@ Check if a storage engine supports a particular alter table in-place @note Called without holding thr_lock.c lock. */ - virtual enum_alter_inplace_result + enum_alter_inplace_result check_if_supported_inplace_alter(TABLE *altered_table, - Alter_inplace_info *ha_alter_info); + Alter_inplace_info *ha_alter_info) override; /** @brief This is a list of flags that indicate what functionality the storage engine implements. The current table flags are documented in handler.h */ - ulonglong table_flags() const; + ulonglong table_flags() const override; /** @brief This is a bitmap of flags that indicates how the storage engine @@ -261,7 +261,7 @@ If all_parts is set, MySQL wants to know the flags for the combined index, up to and including 'part'. */ - ulong index_flags(uint inx, uint part, bool all_parts) const; + ulong index_flags(uint inx, uint part, bool all_parts) const override; /** @brief unireg.cc will call max_supported_record_length(), max_supported_keys(), @@ -270,7 +270,7 @@ send. Return *real* limits of your storage engine here; MySQL will do min(your_limits, MySQL_limits) automatically. */ - uint max_supported_record_length() const { return HA_MAX_REC_LENGTH; } + uint max_supported_record_length() const override { return HA_MAX_REC_LENGTH; } /** @brief unireg.cc will call this to make sure that the storage engine can handle @@ -281,7 +281,7 @@ There is no need to implement ..._key_... methods if your engine doesn't support indexes. */ - uint max_supported_keys() const { return 10; } + uint max_supported_keys() const override { return 10; } /** @brief unireg.cc will call this to make sure that the storage engine can handle @@ -292,7 +292,7 @@ There is no need to implement ..._key_... methods if your engine doesn't support indexes. */ - uint max_supported_key_parts() const { return 10; } + uint max_supported_key_parts() const override { return 10; } /** @brief unireg.cc will call this to make sure that the storage engine can handle @@ -303,17 +303,17 @@ There is no need to implement ..._key_... methods if your engine doesn't support indexes. */ - uint max_supported_key_length() const { return 255; } + uint max_supported_key_length() const override { return 255; } /** @brief Called in test_quick_select to determine if indexes should be used. */ - virtual double scan_time() { return (double) (stats.records+stats.deleted) / 20.0+10; } + double scan_time() override { return (double) (stats.records+stats.deleted) / 20.0+10; } /** @brief This method will never be called if you do not implement indexes. */ - virtual double read_time(uint, uint, ha_rows rows) + double read_time(uint, uint, ha_rows rows) override { return (double) rows / 20.0+1; } /* @@ -322,7 +322,7 @@ Most of these methods are not obligatory, skip them and MySQL will treat them as not implemented */ - virtual bool get_error_message(int error, String *buf); + bool get_error_message(int error, String *buf) override; /** Push condition down to the table handler. @@ -346,27 +346,27 @@ Calls to rnd_init/rnd_end, index_init/index_end etc do not affect the condition stack. */ -virtual const COND *cond_push(const COND *cond); +const COND *cond_push(const COND *cond) override; PCFIL CheckCond(PGLOBAL g, PCFIL filp, const Item *cond); const char *GetValStr(OPVAL vop, bool neg); PFIL CondFilter(PGLOBAL g, Item *cond); //PFIL CheckFilter(PGLOBAL g); /** admin commands - called from mysql_admin_table */ -virtual int check(THD* thd, HA_CHECK_OPT* check_opt); +int check(THD* thd, HA_CHECK_OPT* check_opt) override; /** Number of rows in table. It will only be called if (table_flags() & (HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT)) != 0 */ - virtual ha_rows records(); + ha_rows records() override; /** Type of table for caching query CONNECT should not use caching because its tables are external data prone to me modified out of MariaDB */ - virtual uint8 table_cache_type(void) + uint8 table_cache_type(void) override { #if defined(MEMORY_TRACE) // Temporary until bug MDEV-4771 is fixed @@ -379,37 +379,37 @@ /** @brief We implement this in ha_connect.cc; it's a required method. */ - int open(const char *name, int mode, uint test_if_locked); // required + int open(const char *name, int mode, uint test_if_locked) override; // required /** @brief We implement this in ha_connect.cc; it's a required method. */ - int close(void); // required + int close(void) override; // required /** @brief We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int write_row(const uchar *buf); + int write_row(const uchar *buf) override; /** @brief We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int update_row(const uchar *old_data, const uchar *new_data); + int update_row(const uchar *old_data, const uchar *new_data) override; /** @brief We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int delete_row(const uchar *buf); + int delete_row(const uchar *buf) override; // Added to the connect handler - int index_init(uint idx, bool sorted); - int index_end(); + int index_init(uint idx, bool sorted) override; + int index_end() override; int index_read(uchar * buf, const uchar * key, uint key_len, - enum ha_rkey_function find_flag); - int index_next_same(uchar *buf, const uchar *key, uint keylen); + enum ha_rkey_function find_flag) override; + int index_next_same(uchar *buf, const uchar *key, uint keylen) override; /** @brief We implement this in ha_connect.cc. It's not an obligatory method; @@ -422,25 +422,25 @@ We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int index_next(uchar *buf); + int index_next(uchar *buf) override; /** @brief We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ -int index_prev(uchar *buf); +int index_prev(uchar *buf) override; /** @brief We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int index_first(uchar *buf); + int index_first(uchar *buf) override; /** @brief We implement this in ha_connect.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int index_last(uchar *buf); + int index_last(uchar *buf) override; /* Index condition pushdown implementation */ //Item *idx_cond_push(uint keyno, Item* idx_cond); @@ -453,57 +453,57 @@ cursor to the start of the table; no need to deallocate and allocate it again. This is a required method. */ - int rnd_init(bool scan); //required - int rnd_end(); - int rnd_next(uchar *buf); ///< required - int rnd_pos(uchar *buf, uchar *pos); ///< required - void position(const uchar *record); ///< required - int info(uint); ///< required - int extra(enum ha_extra_function operation); - int start_stmt(THD *thd, thr_lock_type lock_type); - int external_lock(THD *thd, int lock_type); ///< required - int delete_all_rows(void); + int rnd_init(bool scan) override; //required + int rnd_end() override; + int rnd_next(uchar *buf) override; ///< required + int rnd_pos(uchar *buf, uchar *pos) override; ///< required + void position(const uchar *record) override; ///< required + int info(uint) override; ///< required + int extra(enum ha_extra_function operation) override; + int start_stmt(THD *thd, thr_lock_type lock_type) override; + int external_lock(THD *thd, int lock_type) override; ///< required + int delete_all_rows(void) override; ha_rows records_in_range(uint inx, const key_range *start_key, - const key_range *end_key, page_range *pages); + const key_range *end_key, page_range *pages) override; /** These methods can be overridden, but their default implementation provide useful functionality. */ - int rename_table(const char *from, const char *to); + int rename_table(const char *from, const char *to) override; /** Delete a table in the engine. Called for base as well as temporary tables. */ - int delete_table(const char *name); + int delete_table(const char *name) override; /** Called by delete_table and rename_table */ int delete_or_rename_table(const char *from, const char *to); int create(const char *name, TABLE *form, - HA_CREATE_INFO *create_info); ///< required + HA_CREATE_INFO *create_info) override; ///< required bool check_if_incompatible_data(HA_CREATE_INFO *info, - uint table_changes); + uint table_changes) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); ///< required - int optimize(THD* thd, HA_CHECK_OPT* check_opt); + enum thr_lock_type lock_type) override; ///< required + int optimize(THD* thd, HA_CHECK_OPT* check_opt) override; /** * Multi Range Read interface */ int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param, - uint n_ranges, uint mode, HANDLER_BUFFER *buf); - int multi_range_read_next(range_id_t *range_info); + uint n_ranges, uint mode, HANDLER_BUFFER *buf) override; + int multi_range_read_next(range_id_t *range_info) override; ha_rows multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq, void *seq_init_param, uint n_ranges, uint *bufsz, - uint *flags, Cost_estimate *cost); + uint *flags, Cost_estimate *cost) override; ha_rows multi_range_read_info(uint keyno, uint n_ranges, uint keys, uint key_parts, uint *bufsz, - uint *flags, Cost_estimate *cost); - int multi_range_read_explain_info(uint mrr_mode, char *str, size_t size); + uint *flags, Cost_estimate *cost) override; + int multi_range_read_explain_info(uint mrr_mode, char *str, size_t size) override; - int reset(void) {ds_mrr.dsmrr_close(); return 0;} + int reset(void) override {ds_mrr.dsmrr_close(); return 0;} /* Index condition pushdown implementation */ // Item *idx_cond_push(uint keyno, Item* idx_cond); diff -Nru mariadb-10.11.6/storage/connect/ioapi.h mariadb-10.11.9/storage/connect/ioapi.h --- mariadb-10.11.6/storage/connect/ioapi.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/ioapi.h 2024-08-03 07:29:59.000000000 +0000 @@ -144,7 +144,7 @@ typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); -/* here is the "old" 32 bits structure structure */ +/* here is the "old" 32 bits structure */ typedef struct zlib_filefunc_def_s { open_file_func zopen_file; diff -Nru mariadb-10.11.6/storage/connect/jdbconn.h mariadb-10.11.9/storage/connect/jdbconn.h --- mariadb-10.11.6/storage/connect/jdbconn.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/jdbconn.h 2024-08-03 07:29:59.000000000 +0000 @@ -23,7 +23,7 @@ // Constructor JDBConn(PGLOBAL g, PCSZ wrapper); - virtual void AddJars(PSTRG jpop, char sep); + void AddJars(PSTRG jpop, char sep) override; PQRYRES AllocateResult(PGLOBAL g, PTDB tdbp); // Attributes @@ -34,9 +34,9 @@ public: // Operations - virtual bool Connect(PJPARM sop); - virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, - PCSZ filter, bool pipe) {return true;} + bool Connect(PJPARM sop) override; + bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, + PCSZ filter, bool pipe) override {return true;} virtual int GetResultSize(PCSZ sql, PCOL colp); virtual int ExecuteCommand(PCSZ sql); virtual int ExecuteQuery(PCSZ sql); diff -Nru mariadb-10.11.6/storage/connect/jmgfam.h mariadb-10.11.9/storage/connect/jmgfam.h --- mariadb-10.11.6/storage/connect/jmgfam.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/jmgfam.h 2024-08-03 07:29:59.000000000 +0000 @@ -31,35 +31,35 @@ JMGFAM(PJMGFAM txfp); // Implementation - virtual AMT GetAmType(void) { return TYPE_AM_MGO; } - virtual bool GetUseTemp(void) { return false; } - virtual int GetPos(void); - virtual int GetNextPos(void); - virtual PTXF Duplicate(PGLOBAL g) { return (PTXF)new(g) JMGFAM(this); } + AMT GetAmType(void) override { return TYPE_AM_MGO; } + bool GetUseTemp(void) override { return false; } + int GetPos(void) override; + int GetNextPos(void) override; + PTXF Duplicate(PGLOBAL g) override { return (PTXF)new(g) JMGFAM(this); } void SetLrecl(int lrecl) { Lrecl = lrecl; } // Methods - virtual void Reset(void); - virtual int GetFileLength(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); - virtual int MaxBlkSize(PGLOBAL g, int s); - virtual bool AllocateBuffer(PGLOBAL g) { return false; } - virtual int GetRowID(void); - virtual bool RecordPos(PGLOBAL g); - virtual bool SetPos(PGLOBAL g, int recpos); - virtual int SkipRecord(PGLOBAL g, bool header); - virtual bool OpenTableFile(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); - virtual int WriteBuffer(PGLOBAL g); - virtual int DeleteRecords(PGLOBAL g, int irc); - virtual void CloseTableFile(PGLOBAL g, bool abort); - virtual void Rewind(void); + void Reset(void) override; + int GetFileLength(PGLOBAL g) override; + int Cardinality(PGLOBAL g) override; + int MaxBlkSize(PGLOBAL g, int s) override; + bool AllocateBuffer(PGLOBAL g) override { return false; } + int GetRowID(void) override; + bool RecordPos(PGLOBAL g) override; + bool SetPos(PGLOBAL g, int recpos) override; + int SkipRecord(PGLOBAL g, bool header) override; + bool OpenTableFile(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; + int WriteBuffer(PGLOBAL g) override; + int DeleteRecords(PGLOBAL g, int irc) override; + void CloseTableFile(PGLOBAL g, bool abort) override; + void Rewind(void) override; protected: - virtual bool OpenTempFile(PGLOBAL g) { return false; } - virtual bool MoveIntermediateLines(PGLOBAL g, bool *b) { return false; } - virtual int RenameTempFile(PGLOBAL g) { return RC_OK; } - virtual int InitDelete(PGLOBAL g, int fpos, int spos); + bool OpenTempFile(PGLOBAL g) override { return false; } + bool MoveIntermediateLines(PGLOBAL g, bool *b) override { return false; } + int RenameTempFile(PGLOBAL g) override { return RC_OK; } + int InitDelete(PGLOBAL g, int fpos, int spos) override; bool Init(PGLOBAL g); //bool MakeCursor(PGLOBAL g); diff -Nru mariadb-10.11.6/storage/connect/jmgoconn.h mariadb-10.11.9/storage/connect/jmgoconn.h --- mariadb-10.11.6/storage/connect/jmgoconn.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/jmgoconn.h 2024-08-03 07:29:59.000000000 +0000 @@ -61,9 +61,9 @@ // Implementation public: - virtual void AddJars(PSTRG jpop, char sep); - virtual bool Connect(PJPARM sop); - virtual bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, PCSZ filter, bool pipe); + void AddJars(PSTRG jpop, char sep) override; + bool Connect(PJPARM sop) override; + bool MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, PCSZ filter, bool pipe) override; // PQRYRES AllocateResult(PGLOBAL g, TDBEXT *tdbp, int n); // Attributes diff -Nru mariadb-10.11.6/storage/connect/json.h mariadb-10.11.9/storage/connect/json.h --- mariadb-10.11.6/storage/connect/json.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/json.h 2024-08-03 07:29:59.000000000 +0000 @@ -142,14 +142,14 @@ JOBJECT(int i) : JSON(i) {} // Methods - virtual void Clear(void) {First = Last = NULL;} + void Clear(void) override {First = Last = NULL;} //virtual JTYP GetValType(void) {return TYPE_JOB;} - virtual PJPR GetFirst(void) {return First;} - virtual int GetSize(bool b); - virtual PJOB GetObject(void) {return this;} - virtual PSZ GetText(PGLOBAL g, PSTRG text); - virtual bool Merge(PGLOBAL g, PJSON jsp); - virtual bool IsNull(void); + PJPR GetFirst(void) override {return First;} + int GetSize(bool b) override; + PJOB GetObject(void) override {return this;} + PSZ GetText(PGLOBAL g, PSTRG text) override; + bool Merge(PGLOBAL g, PJSON jsp) override; + bool IsNull(void) override; // Specific PJPR AddPair(PGLOBAL g, PCSZ key); @@ -174,15 +174,15 @@ JARRAY(int i) : JSON(i) {} // Methods - virtual void Clear(void) {First = Last = NULL; Size = 0;} - virtual int size(void) { return Size; } - virtual PJAR GetArray(void) {return this;} - virtual int GetSize(bool b); - virtual PJVAL GetArrayValue(int i); - virtual PSZ GetText(PGLOBAL g, PSTRG text); - virtual bool Merge(PGLOBAL g, PJSON jsp); - virtual bool DeleteValue(int n); - virtual bool IsNull(void); + void Clear(void) override {First = Last = NULL; Size = 0;} + int size(void) override { return Size; } + PJAR GetArray(void) override {return this;} + int GetSize(bool b) override; + PJVAL GetArrayValue(int i) override; + PSZ GetText(PGLOBAL g, PSTRG text) override; + bool Merge(PGLOBAL g, PJSON jsp) override; + bool DeleteValue(int n) override; + bool IsNull(void) override; // Specific PJVAL AddArrayValue(PGLOBAL g, PJVAL jvp = NULL, int* x = NULL); @@ -221,14 +221,14 @@ //using JSON::SetVal; // Methods - virtual void Clear(void); + void Clear(void) override; //virtual JTYP GetType(void) {return TYPE_JVAL;} virtual JTYP GetValType(void); - virtual PJOB GetObject(void); - virtual PJAR GetArray(void); - virtual PJSON GetJsp(void) {return (DataType == TYPE_JSON ? Jsp : NULL);} - virtual PSZ GetText(PGLOBAL g, PSTRG text); - virtual bool IsNull(void); + PJOB GetObject(void) override; + PJAR GetArray(void) override; + PJSON GetJsp(void) override {return (DataType == TYPE_JSON ? Jsp : NULL);} + PSZ GetText(PGLOBAL g, PSTRG text) override; + bool IsNull(void) override; // Specific //inline PVL GetVal(void) { return Val; } @@ -239,7 +239,7 @@ long long GetBigint(void); double GetFloat(void); PVAL GetValue(PGLOBAL g); - void SetValue(PJSON jsp); + void SetValue(PJSON jsp) override; void SetValue(PGLOBAL g, PVAL valp); void SetString(PGLOBAL g, PSZ s, int ci = 0); void SetInteger(PGLOBAL g, int n); @@ -288,9 +288,9 @@ public: JOUTSTR(PGLOBAL g); - virtual bool WriteStr(const char* s); - virtual bool WriteChr(const char c); - virtual bool Escape(const char* s); + bool WriteStr(const char* s) override; + bool WriteChr(const char c) override; + bool Escape(const char* s) override; // Member char* Strp; // The serialized string @@ -305,9 +305,9 @@ public: JOUTFILE(PGLOBAL g, FILE* str, int pty) : JOUT(g) { Stream = str; Pretty = pty; } - virtual bool WriteStr(const char* s); - virtual bool WriteChr(const char c); - virtual bool Escape(const char* s); + bool WriteStr(const char* s) override; + bool WriteChr(const char c) override; + bool Escape(const char* s) override; // Member FILE* Stream; @@ -320,8 +320,8 @@ public: JOUTPRT(PGLOBAL g, FILE* str) : JOUTFILE(g, str, 2) { M = 0; B = false; } - virtual bool WriteStr(const char* s); - virtual bool WriteChr(const char c); + bool WriteStr(const char* s) override; + bool WriteChr(const char c) override; // Member int M; diff -Nru mariadb-10.11.6/storage/connect/libdoc.cpp mariadb-10.11.9/storage/connect/libdoc.cpp --- mariadb-10.11.6/storage/connect/libdoc.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/libdoc.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -63,23 +63,23 @@ LIBXMLDOC(char *nsl, char *nsdf, char *enc, PFBLOCK fp); // Properties - virtual short GetDocType(void) {return TYPE_FB_XML2;} - virtual void *GetDocPtr(void) {return Docp;} - virtual void SetNofree(bool b) {Nofreelist = b;} + short GetDocType(void) override {return TYPE_FB_XML2;} + void *GetDocPtr(void) override {return Docp;} + void SetNofree(bool b) override {Nofreelist = b;} // Methods - virtual bool Initialize(PGLOBAL g, PCSZ entry, bool zipped); - virtual bool ParseFile(PGLOBAL g, char *fn); - virtual bool NewDoc(PGLOBAL g, PCSZ ver); - virtual void AddComment(PGLOBAL g, char *com); - virtual PXNODE GetRoot(PGLOBAL g); - virtual PXNODE NewRoot(PGLOBAL g, char *name); - virtual PXNODE NewPnode(PGLOBAL g, char *name); - virtual PXATTR NewPattr(PGLOBAL g); - virtual PXLIST NewPlist(PGLOBAL g); - virtual int DumpDoc(PGLOBAL g, char *ofn); - virtual void CloseDoc(PGLOBAL g, PFBLOCK xp); - virtual PFBLOCK LinkXblock(PGLOBAL g, MODE m, int rc, char *fn); + bool Initialize(PGLOBAL g, PCSZ entry, bool zipped) override; + bool ParseFile(PGLOBAL g, char *fn) override; + bool NewDoc(PGLOBAL g, PCSZ ver) override; + void AddComment(PGLOBAL g, char *com) override; + PXNODE GetRoot(PGLOBAL g) override; + PXNODE NewRoot(PGLOBAL g, char *name) override; + PXNODE NewPnode(PGLOBAL g, char *name) override; + PXATTR NewPattr(PGLOBAL g) override; + PXLIST NewPlist(PGLOBAL g) override; + int DumpDoc(PGLOBAL g, char *ofn) override; + void CloseDoc(PGLOBAL g, PFBLOCK xp) override; + PFBLOCK LinkXblock(PGLOBAL g, MODE m, int rc, char *fn) override; protected: // bool CheckDocument(FILE *of, xmlNodePtr np); @@ -93,7 +93,6 @@ xmlXPathContextPtr Ctxp; xmlXPathObjectPtr Xop; xmlXPathObjectPtr NlXop; - xmlErrorPtr Xerr; char *Buf; // Temporary bool Nofreelist; }; // end of class LIBXMLDOC @@ -106,23 +105,23 @@ friend class XML2NODELIST; public: // Properties - virtual char *GetName(PGLOBAL g) {return (char*)Nodep->name;} - virtual int GetType(void); - virtual PXNODE GetNext(PGLOBAL g); - virtual PXNODE GetChild(PGLOBAL g); + char *GetName(PGLOBAL g) override {return (char*)Nodep->name;} + int GetType(void) override; + PXNODE GetNext(PGLOBAL g) override; + PXNODE GetChild(PGLOBAL g) override; // Methods - virtual RCODE GetContent(PGLOBAL g, char *buf, int len); - virtual bool SetContent(PGLOBAL g, char *txtp, int len); - virtual PXNODE Clone(PGLOBAL g, PXNODE np); - virtual PXLIST GetChildElements(PGLOBAL g, char *xp, PXLIST lp); - virtual PXLIST SelectNodes(PGLOBAL g, char *xp, PXLIST lp); - virtual PXNODE SelectSingleNode(PGLOBAL g, char *xp, PXNODE np); - virtual PXATTR GetAttribute(PGLOBAL g, char *name, PXATTR ap); - virtual PXNODE AddChildNode(PGLOBAL g, PCSZ name, PXNODE np); - virtual PXATTR AddProperty(PGLOBAL g, char *name, PXATTR ap); - virtual void AddText(PGLOBAL g, PCSZ txtp); - virtual void DeleteChild(PGLOBAL g, PXNODE dnp); + RCODE GetContent(PGLOBAL g, char *buf, int len) override; + bool SetContent(PGLOBAL g, char *txtp, int len) override; + PXNODE Clone(PGLOBAL g, PXNODE np) override; + PXLIST GetChildElements(PGLOBAL g, char *xp, PXLIST lp) override; + PXLIST SelectNodes(PGLOBAL g, char *xp, PXLIST lp) override; + PXNODE SelectSingleNode(PGLOBAL g, char *xp, PXNODE np) override; + PXATTR GetAttribute(PGLOBAL g, char *name, PXATTR ap) override; + PXNODE AddChildNode(PGLOBAL g, PCSZ name, PXNODE np) override; + PXATTR AddProperty(PGLOBAL g, char *name, PXATTR ap) override; + void AddText(PGLOBAL g, PCSZ txtp) override; + void DeleteChild(PGLOBAL g, PXNODE dnp) override; protected: // Constructor @@ -142,9 +141,9 @@ friend class XML2NODE; public: // Methods - virtual int GetLength(void); - virtual PXNODE GetItem(PGLOBAL g, int n, PXNODE np); - virtual bool DropItem(PGLOBAL g, int n); + int GetLength(void) override; + PXNODE GetItem(PGLOBAL g, int n, PXNODE np) override; + bool DropItem(PGLOBAL g, int n) override; protected: // Constructor @@ -162,12 +161,12 @@ friend class XML2NODE; public: // Properties - virtual char *GetName(PGLOBAL g) {return (char*)Atrp->name;} - virtual PXATTR GetNext(PGLOBAL g); + char *GetName(PGLOBAL g) override {return (char*)Atrp->name;} + PXATTR GetNext(PGLOBAL g) override; // Methods - virtual RCODE GetText(PGLOBAL g, char *bufp, int len); - virtual bool SetText(PGLOBAL g, char *txtp, int len); + RCODE GetText(PGLOBAL g, char *bufp, int len) override; + bool SetText(PGLOBAL g, char *txtp, int len) override; protected: // Constructor @@ -327,7 +326,6 @@ Ctxp = NULL; Xop = NULL; NlXop = NULL; - Xerr = NULL; Buf = NULL; Nofreelist = false; } // end of LIBXMLDOC constructor @@ -365,8 +363,8 @@ Encoding = (char*)Docp->encoding; return false; - } else if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + } else if (xmlGetLastError()) + xmlResetLastError(); return true; } // end of ParseFile @@ -505,9 +503,9 @@ #if 1 // This function does not crash ( if (xmlSaveFormatFileEnc((const char *)ofn, Docp, Encoding, 0) < 0) { - xmlErrorPtr err = xmlGetLastError(); + const xmlError *err = xmlGetLastError(); strcpy(g->Message, (err) ? err->message : "Error saving XML doc"); - xmlResetError(Xerr); + xmlResetLastError(); rc = -1; } // endif Save // rc = xmlDocDump(of, Docp); @@ -546,8 +544,8 @@ if (Nlist) { xmlXPathFreeNodeSet(Nlist); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); Nlist = NULL; } // endif Nlist @@ -555,8 +553,8 @@ if (Xop) { xmlXPathFreeObject(Xop); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); Xop = NULL; } // endif Xop @@ -564,8 +562,8 @@ if (NlXop) { xmlXPathFreeObject(NlXop); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); NlXop = NULL; } // endif NlXop @@ -573,8 +571,8 @@ if (Ctxp) { xmlXPathFreeContext(Ctxp); - if ((Xerr = xmlGetLastError())) - xmlResetError(Xerr); + if (xmlGetLastError()) + xmlResetLastError(); Ctxp = NULL; } // endif Ctxp @@ -590,6 +588,7 @@ /******************************************************************/ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp) { + const xmlError *xerr; xmlNodeSetPtr nl; if (trace(1)) @@ -649,11 +648,11 @@ } else xmlXPathFreeObject(Xop); // Caused node not found - if ((Xerr = xmlGetLastError())) { - strcpy(g->Message, Xerr->message); - xmlResetError(Xerr); + if ((xerr = xmlGetLastError())) { + strcpy(g->Message, xerr->message); + xmlResetLastError(); return NULL; - } // endif Xerr + } // endif xerr } // endif Xop @@ -1079,7 +1078,7 @@ /******************************************************************/ void XML2NODE::DeleteChild(PGLOBAL g, PXNODE dnp) { - xmlErrorPtr xerr; + const xmlError *xerr; if (trace(1)) htrc("DeleteChild: node=%p\n", dnp); @@ -1122,7 +1121,7 @@ if (trace(1)) htrc("DeleteChild: errmsg=%-.256s\n", xerr->message); - xmlResetError(xerr); + xmlResetLastError(); } // end of DeleteChild /* -------------------- class XML2NODELIST ---------------------- */ diff -Nru mariadb-10.11.6/storage/connect/mongo.h mariadb-10.11.9/storage/connect/mongo.h --- mariadb-10.11.6/storage/connect/mongo.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/mongo.h 2024-08-03 07:29:59.000000000 +0000 @@ -69,11 +69,11 @@ MGODEF(void); // Implementation - virtual const char *GetType(void) { return "MONGO"; } + const char *GetType(void) override { return "MONGO"; } // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members diff -Nru mariadb-10.11.6/storage/connect/mycat.h mariadb-10.11.9/storage/connect/mycat.h --- mariadb-10.11.6/storage/connect/mycat.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/mycat.h 2024-08-03 07:29:59.000000000 +0000 @@ -101,13 +101,13 @@ void SetHandler(PHC hc) {Hc= hc;} // Methods - void Reset(void); + void Reset(void) override; bool StoreIndex(PGLOBAL, PTABDEF) {return false;} // Temporary PTABDEF GetTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR type, PRELDEF *prp = NULL); PTDB GetTable(PGLOBAL g, PTABLE tablep, - MODE mode = MODE_READ, LPCSTR type = NULL); - void ClearDB(PGLOBAL g); + MODE mode = MODE_READ, LPCSTR type = NULL) override; + void ClearDB(PGLOBAL g) override; protected: PTABDEF MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am); diff -Nru mariadb-10.11.6/storage/connect/mysql-test/connect/r/drop-open-error.result mariadb-10.11.9/storage/connect/mysql-test/connect/r/drop-open-error.result --- mariadb-10.11.6/storage/connect/mysql-test/connect/r/drop-open-error.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/mysql-test/connect/r/drop-open-error.result 2024-08-03 07:29:59.000000000 +0000 @@ -3,7 +3,7 @@ ERROR HY000: Too long value for 'SRCDEF' drop table mdev9949; Warnings: -Warning 1017 Can't find file: 'MYSQLD_DATADIR/test/mdev9949.dos' (errno: 2 "No such file or directory") +Warning 1017 Can't find file: 'DATADIR/test/mdev9949.dos' (errno: 2 "No such file or directory") drop table t1; select @@secure_file_priv 'must be NULL'; must be NULL diff -Nru mariadb-10.11.6/storage/connect/mysql-test/connect/r/mysql.result mariadb-10.11.9/storage/connect/mysql-test/connect/r/mysql.result --- mariadb-10.11.6/storage/connect/mysql-test/connect/r/mysql.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/mysql-test/connect/r/mysql.result 2024-08-03 07:29:59.000000000 +0000 @@ -229,6 +229,7 @@ 20 30 # Start of mysqldump ------ +/*M!999999\- enable the sandbox mode */ /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t2` ( diff -Nru mariadb-10.11.6/storage/connect/mysql-test/connect/t/drop-open-error.test mariadb-10.11.9/storage/connect/mysql-test/connect/t/drop-open-error.test --- mariadb-10.11.6/storage/connect/mysql-test/connect/t/drop-open-error.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/mysql-test/connect/t/drop-open-error.test 2024-08-03 07:29:59.000000000 +0000 @@ -13,8 +13,9 @@ create table tcon engine=connect table_type=mysql CONNECTION='mysql://root@localhost/test/t1' SRCDEF='select c from t1 where c in ("foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar", "foo", "bar", "qux", "foobar")'; # copy the invalid frm (as created by the statement above before the MDEV-9949 fix) +let $MARIADB_DATADIR=`select @@datadir`; copy_file $MTR_SUITE_DIR/std_data/mdev9949.frm $datadir/test/mdev9949.frm; ---replace_result $datadir MYSQLD_DATADIR/ ./ MYSQLD_DATADIR/ +--replace_result $MARIADB_DATADIR DATADIR/ './' 'DATADIR/' drop table mdev9949; drop table t1; diff -Nru mariadb-10.11.6/storage/connect/reldef.h mariadb-10.11.9/storage/connect/reldef.h --- mariadb-10.11.6/storage/connect/reldef.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/reldef.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,20 +91,20 @@ RECFM GetTableFormat(const char* type); bool SepIndex(void) {return GetBoolCatInfo("SepIndex", false);} bool IsReadOnly(void) {return Read_Only;} - virtual AMT GetDefType(void) {return TYPE_AM_TAB;} + AMT GetDefType(void) override {return TYPE_AM_TAB;} virtual PIXDEF GetIndx(void) {return NULL;} virtual void SetIndx(PIXDEF) {} virtual bool IsHuge(void) {return false;} const CHARSET_INFO *data_charset() {return m_data_charset;} - const char *GetCsName(void) {return csname;} + const char *GetCsName(void) {return csname;} // Methods - int GetColCatInfo(PGLOBAL g); - void SetIndexInfo(void); - bool DropTable(PGLOBAL g, PSZ name); - virtual bool Define(PGLOBAL g, PCATLG cat, - LPCSTR name, LPCSTR schema, LPCSTR am); - virtual bool DefineAM(PGLOBAL, LPCSTR, int) = 0; + int GetColCatInfo(PGLOBAL g); + void SetIndexInfo(void); + bool DropTable(PGLOBAL g, PSZ name); + bool Define(PGLOBAL g, PCATLG cat, + LPCSTR name, LPCSTR schema, LPCSTR am) override; + virtual bool DefineAM(PGLOBAL, LPCSTR, int) = 0; protected: // Members @@ -135,12 +135,12 @@ OEMDEF(void) {Hdll = NULL; Pxdef = NULL; Module = Subtype = NULL;} // Implementation - virtual const char *GetType(void) {return "OEM";} - virtual AMT GetDefType(void) {return TYPE_AM_OEM;} + const char *GetType(void) override {return "OEM";} + AMT GetDefType(void) override {return TYPE_AM_OEM;} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE mode); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE mode) override; protected: PTABDEF GetXdef(PGLOBAL g); diff -Nru mariadb-10.11.6/storage/connect/tabbson.h mariadb-10.11.9/storage/connect/tabbson.h --- mariadb-10.11.6/storage/connect/tabbson.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabbson.h 2024-08-03 07:29:59.000000000 +0000 @@ -71,11 +71,11 @@ BSONDEF(void); // Implementation - virtual const char* GetType(void) { return "BSON"; } + const char* GetType(void) override { return "BSON"; } // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -170,30 +170,30 @@ TDBBSN(TDBBSN* tdbp); // Implementation - virtual AMT GetAmType(void) { return TYPE_AM_JSN; } - virtual bool SkipHeader(PGLOBAL g); - virtual PTDB Duplicate(PGLOBAL g) { return (PTDB)new(g) TDBBSN(this); } + AMT GetAmType(void) override { return TYPE_AM_JSN; } + bool SkipHeader(PGLOBAL g) override; + PTDB Duplicate(PGLOBAL g) override { return (PTDB)new(g) TDBBSN(this); } PBVAL GetRow(void) { return Row; } // Methods - virtual PTDB Clone(PTABS t); - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PCOL colp); - virtual int RowNumber(PGLOBAL g, bool b = FALSE) {return (b) ? M : N;} - virtual bool CanBeFiltered(void) + PTDB Clone(PTABS t) override; + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + PCOL InsertSpecialColumn(PCOL colp) override; + int RowNumber(PGLOBAL g, bool b = FALSE) override {return (b) ? M : N;} + bool CanBeFiltered(void) override {return Txfp->GetAmType() == TYPE_AM_MGO || !Xcol;} // Database routines - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual bool PrepareWriting(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual void CloseDB(PGLOBAL g); + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + bool PrepareWriting(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + void CloseDB(PGLOBAL g) override; // Specific routine - virtual int EstimatedLength(void); + int EstimatedLength(void) override; protected: PBVAL FindRow(PGLOBAL g); @@ -242,15 +242,15 @@ BSONCOL(BSONCOL* colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) { return Tbp->GetAmType(); } - virtual bool Stringify(void) { return Sgfy; } + int GetAmType(void) override { return Tbp->GetAmType(); } + bool Stringify(void) override { return Sgfy; } // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; bool ParseJpath(PGLOBAL g); - virtual PSZ GetJpath(PGLOBAL g, bool proj); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + PSZ GetJpath(PGLOBAL g, bool proj) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b); @@ -288,30 +288,30 @@ TDBBSON(PBTDB tdbp); // Implementation - virtual AMT GetAmType(void) { return TYPE_AM_JSON; } - virtual PTDB Duplicate(PGLOBAL g) { return (PTDB)new(g) TDBBSON(this); } + AMT GetAmType(void) override { return TYPE_AM_JSON; } + PTDB Duplicate(PGLOBAL g) override { return (PTDB)new(g) TDBBSON(this); } PBVAL GetDoc(void) { return Docp; } // Methods - virtual PTDB Clone(PTABS t); + PTDB Clone(PTABS t) override; // Database routines - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual void ResetSize(void); - virtual int GetProgCur(void) { return N; } - virtual int GetRecpos(void); - virtual bool SetRecpos(PGLOBAL g, int recpos); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual bool PrepareWriting(PGLOBAL g) { return false; } - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + void ResetSize(void) override; + int GetProgCur(void) override { return N; } + int GetRecpos(void) override; + bool SetRecpos(PGLOBAL g, int recpos) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + bool PrepareWriting(PGLOBAL g) override { return false; } + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; int MakeDocument(PGLOBAL g); // Optimization routines - virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add); + int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) override; protected: int MakeNewDoc(PGLOBAL g); @@ -335,7 +335,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + PQRYRES GetResult(PGLOBAL g) override; // Members PTOS Topt; diff -Nru mariadb-10.11.6/storage/connect/tabcmg.h mariadb-10.11.9/storage/connect/tabcmg.h --- mariadb-10.11.6/storage/connect/tabcmg.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabcmg.h 2024-08-03 07:29:59.000000000 +0000 @@ -17,9 +17,9 @@ CMGDISC(PGLOBAL g, int *lg) : MGODISC(g, lg) { drv = "C"; } // Methods - virtual void GetDoc(void); -//virtual bool Find(PGLOBAL g, int i, int k, bool b); - virtual bool Find(PGLOBAL g); + void GetDoc(void) override; +//bool Find(PGLOBAL g, int i, int k, bool b) override; + bool Find(PGLOBAL g) override; // BSON Function //bool FindInDoc(PGLOBAL g, bson_iter_t *iter, const bson_t *doc, @@ -49,24 +49,24 @@ TDBCMG(TDBCMG *tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_MGO;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBCMG(this);} + AMT GetAmType(void) override {return TYPE_AM_MGO;} + PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBCMG(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PCOL colp); - virtual int RowNumber(PGLOBAL g, bool b = FALSE) {return N;} + PTDB Clone(PTABS t) override; + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + PCOL InsertSpecialColumn(PCOL colp) override; + int RowNumber(PGLOBAL g, bool b = FALSE) override {return N;} // Database routines - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); - virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; + bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) override; protected: bool Init(PGLOBAL g); @@ -96,13 +96,13 @@ MGOCOL(MGOCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) { return Tmgp->GetAmType(); } - virtual bool Stringify(void) { return Sgfy; } + int GetAmType(void) override { return Tmgp->GetAmType(); } + bool Stringify(void) override { return Sgfy; } // Methods - virtual PSZ GetJpath(PGLOBAL g, bool proj); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + PSZ GetJpath(PGLOBAL g, bool proj) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: // Default constructor not to be used @@ -124,7 +124,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + virtual PQRYRES GetResult(PGLOBAL g) override; // Members PTOS Topt; diff -Nru mariadb-10.11.6/storage/connect/tabcol.h mariadb-10.11.9/storage/connect/tabcol.h --- mariadb-10.11.6/storage/connect/tabcol.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabcol.h 2024-08-03 07:29:59.000000000 +0000 @@ -38,8 +38,8 @@ // Methods PTABLE Link(PTABLE); - void Printf(PGLOBAL g, FILE *f, uint n); - void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n) override; + void Prints(PGLOBAL g, char *ps, uint z) override; protected: // Members @@ -64,11 +64,11 @@ COLUMN(LPCSTR name); // Implementation - virtual int GetType(void) {return TYPE_COLUMN;} - virtual int GetResultType(void) {assert(false); return TYPE_VOID;} - virtual int GetLength(void) {assert(false); return 0;} - virtual int GetLengthEx(void) {assert(false); return 0;} - virtual int GetScale() {assert(false); return 0;}; + int GetType(void) override {return TYPE_COLUMN;} + int GetResultType(void) override {assert(false); return TYPE_VOID;} + int GetLength(void) override {assert(false); return 0;} + int GetLengthEx(void) override {assert(false); return 0;} + int GetScale() override {assert(false); return 0;}; LPCSTR GetName(void) {return Name;} LPCSTR GetQualifier(void) {return Qualifier;} PTABLE GetTo_Table(void) {return To_Table;} @@ -78,13 +78,13 @@ void SetTo_Col(PCOL colp) {To_Col = colp;} // Methods - virtual void Printf(PGLOBAL g, FILE *f, uint n); - virtual void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n) override; + void Prints(PGLOBAL g, char *ps, uint z) override; // All methods below should never be used for COLUMN's - virtual void Reset(void) {assert(false);} - virtual bool Compare(PXOB) {assert(false); return false;} - virtual bool SetFormat(PGLOBAL, FORMAT&); - virtual bool Eval(PGLOBAL) {assert(false); return true;} + void Reset(void) override {assert(false);} + bool Compare(PXOB) override {assert(false); return false;} + bool SetFormat(PGLOBAL, FORMAT&) override; + bool Eval(PGLOBAL) override {assert(false); return true;} private: // Members diff -Nru mariadb-10.11.6/storage/connect/tabdos.h mariadb-10.11.9/storage/connect/tabdos.h --- mariadb-10.11.6/storage/connect/tabdos.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabdos.h 2024-08-03 07:29:59.000000000 +0000 @@ -36,11 +36,11 @@ DOSDEF(void); // Implementation - virtual AMT GetDefType(void) {return TYPE_AM_DOS;} - virtual const char *GetType(void) {return "DOS";} - virtual PIXDEF GetIndx(void) {return To_Indx;} - virtual void SetIndx(PIXDEF xdp) {To_Indx = xdp;} - virtual bool IsHuge(void) {return Huge;} + AMT GetDefType(void) override {return TYPE_AM_DOS;} + const char *GetType(void) override {return "DOS";} + PIXDEF GetIndx(void) override {return To_Indx;} + void SetIndx(PIXDEF xdp) override {To_Indx = xdp;} + bool IsHuge(void) override {return Huge;} PCSZ GetFn(void) {return Fn;} PCSZ GetOfn(void) {return Ofn;} PCSZ GetEntry(void) {return Entry;} @@ -63,11 +63,11 @@ int *GetTo_Pos(void) {return To_Pos;} // Methods - virtual int Indexable(void) + int Indexable(void) override {return (!Multiple && !Mulentries && Compressed != 1) ? 1 : 0;} virtual bool DeleteIndexFile(PGLOBAL g, PIXDEF pxdf); - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE mode); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE mode) override; bool InvalidateIndex(PGLOBAL g); bool GetOptFileName(PGLOBAL g, char *filename); void RemoveOptValues(PGLOBAL g); @@ -133,62 +133,62 @@ inline PXOB *GetLink(void) {return To_Link;} // Implementation - virtual AMT GetAmType(void) {return Txfp->GetAmType();} - virtual PCSZ GetFile(PGLOBAL) {return Txfp->To_File;} - virtual void SetFile(PGLOBAL, PCSZ fn) {Txfp->To_File = fn;} - virtual void SetAbort(bool b) {Abort = b;} - virtual RECFM GetFtype(void) {return Ftype;} + AMT GetAmType(void) override {return Txfp->GetAmType();} + PCSZ GetFile(PGLOBAL) override {return Txfp->To_File;} + void SetFile(PGLOBAL, PCSZ fn) override {Txfp->To_File = fn;} + void SetAbort(bool b) override {Abort = b;} + RECFM GetFtype(void) override {return Ftype;} virtual bool SkipHeader(PGLOBAL) {return false;} - virtual void RestoreNrec(void) {Txfp->SetNrec(1);} - virtual PTDB Duplicate(PGLOBAL g) + void RestoreNrec(void) override {Txfp->SetNrec(1);} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBDOS(g, this);} // Methods - virtual PTDB Clone(PTABS t); - virtual void ResetDB(void) {Txfp->Reset();} - virtual bool IsUsingTemp(PGLOBAL g); - virtual bool IsIndexed(void) {return Indxd;} - virtual void ResetSize(void) {MaxSize = Cardinal = -1;} - virtual int ResetTableOpt(PGLOBAL g, bool dop, bool dox); + PTDB Clone(PTABS t) override; + void ResetDB(void) override {Txfp->Reset();} + bool IsUsingTemp(PGLOBAL g) override; + bool IsIndexed(void) override {return Indxd;} + void ResetSize(void) override {MaxSize = Cardinal = -1;} + int ResetTableOpt(PGLOBAL g, bool dop, bool dox) override; virtual int MakeBlockValues(PGLOBAL g); virtual bool SaveBlockValues(PGLOBAL g); - virtual bool GetBlockValues(PGLOBAL g); + bool GetBlockValues(PGLOBAL g) override; virtual PBF InitBlockFilter(PGLOBAL g, PFIL filp); //virtual PBX InitBlockIndex(PGLOBAL g); virtual int TestBlock(PGLOBAL g); - virtual void PrintAM(FILE *f, char *m); + void PrintAM(FILE *f, char *m) override; // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; virtual char *GetOpenMode(PGLOBAL, char*) {return NULL;} virtual int GetFileLength(PGLOBAL g) {return Txfp->GetFileLength(g);} - virtual int GetProgMax(PGLOBAL g); - virtual int GetProgCur(void); + int GetProgMax(PGLOBAL g) override; + int GetProgCur(void) override; //virtual int GetAffectedRows(void) {return Txfp->GetDelRows();} - virtual int GetRecpos(void) {return Txfp->GetPos();} - virtual bool SetRecpos(PGLOBAL g, int recpos) + int GetRecpos(void) override {return Txfp->GetPos();} + bool SetRecpos(PGLOBAL g, int recpos) override {return Txfp->SetPos(g, recpos);} - virtual int RowNumber(PGLOBAL g, bool b = false); - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + int RowNumber(PGLOBAL g, bool b = false) override; + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; virtual int ReadBuffer(PGLOBAL g) {return Txfp->ReadBuffer(g);} // Specific routine virtual int EstimatedLength(void); // Optimization routines - virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add); + int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) override; bool InitialyzeIndex(PGLOBAL g, PIXDEF xdp, bool sorted); void ResetBlockFilter(PGLOBAL g); bool GetDistinctColumnValues(PGLOBAL g, int nrec); protected: - virtual bool PrepareWriting(PGLOBAL g); + bool PrepareWriting(PGLOBAL g) override; PBF CheckBlockFilari(PGLOBAL g, PXOB *arg, int op, bool *cnv); // Members @@ -219,10 +219,10 @@ DOSCOL(DOSCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_DOS;} - virtual void SetTo_Val(PVAL valp) {To_Val = valp;} - virtual int GetClustered(void) {return Clustered;} - virtual int IsClustered(void) {return (Clustered && + int GetAmType(void) override {return TYPE_AM_DOS;} + void SetTo_Val(PVAL valp) override {To_Val = valp;} + int GetClustered(void) override {return Clustered;} + int IsClustered(void) override {return (Clustered && ((PDOSDEF)(((PTDBDOS)To_Tdb)->To_Def))->IsOptimized());} virtual int IsSorted(void) {return Sorted;} virtual PVBLK GetMin(void) {return Min;} @@ -233,10 +233,10 @@ virtual PVBLK GetDval(void) {return Dval;} // Methods - virtual bool VarSize(void); - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + bool VarSize(void) override; + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: virtual bool SetMinMax(PGLOBAL g); diff -Nru mariadb-10.11.6/storage/connect/tabext.h mariadb-10.11.9/storage/connect/tabext.h --- mariadb-10.11.6/storage/connect/tabext.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabext.h 2024-08-03 07:29:59.000000000 +0000 @@ -59,7 +59,7 @@ EXTDEF(void); // Constructor // Implementation - virtual const char *GetType(void) { return "EXT"; } + const char *GetType(void) override { return "EXT"; } inline PCSZ GetTabname(void) { return Tabname; } inline PCSZ GetTabschema(void) { return Tabschema; } inline PCSZ GetUsername(void) { return Username; }; @@ -72,8 +72,8 @@ inline int GetOptions(void) { return Options; } // Methods - virtual int Indexable(void) { return 2; } - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); + int Indexable(void) override { return 2; } + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; protected: // Members @@ -115,15 +115,15 @@ // Implementation // Properties - virtual bool IsRemote(void) { return true; } + bool IsRemote(void) override { return true; } // Methods - virtual PCSZ GetServer(void) { return "Remote"; } - virtual int GetRecpos(void); + PCSZ GetServer(void) override { return "Remote"; } + int GetRecpos(void) override; // Database routines - virtual int GetMaxSize(PGLOBAL g); - virtual int GetProgMax(PGLOBAL g); + int GetMaxSize(PGLOBAL g) override; + int GetProgMax(PGLOBAL g) override; protected: // Internal functions @@ -185,9 +185,9 @@ inline void SetCrp(PCOLRES crp) { Crp = crp; } // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL) = 0; - virtual void WriteColumn(PGLOBAL) = 0; + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; + void ReadColumn(PGLOBAL) override = 0; + void WriteColumn(PGLOBAL) override = 0; protected: // Constructor for count(*) column diff -Nru mariadb-10.11.6/storage/connect/tabfix.h mariadb-10.11.9/storage/connect/tabfix.h --- mariadb-10.11.6/storage/connect/tabfix.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabfix.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,30 +28,30 @@ TDBFIX(PGLOBAL g, PTDBFIX tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_FIX;} - virtual void RestoreNrec(void); - virtual PTDB Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_FIX;} + void RestoreNrec(void) override; + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBFIX(g, this);} // Methods - virtual PTDB Clone(PTABS t); - virtual void ResetDB(void); - virtual bool IsUsingTemp(PGLOBAL g); - virtual int RowNumber(PGLOBAL g, bool b = false); - virtual int ResetTableOpt(PGLOBAL g, bool dop, bool dox); - virtual void ResetSize(void); - virtual int GetBadLines(void) {return Txfp->GetNerr();} + PTDB Clone(PTABS t) override; + void ResetDB(void) override; + bool IsUsingTemp(PGLOBAL g) override; + int RowNumber(PGLOBAL g, bool b = false) override; + int ResetTableOpt(PGLOBAL g, bool dop, bool dox) override; + void ResetSize(void) override; + int GetBadLines(void) override {return Txfp->GetNerr();} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int GetProgMax(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int GetProgMax(PGLOBAL g) override; + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; protected: - virtual bool PrepareWriting(PGLOBAL g) {return false;} + bool PrepareWriting(PGLOBAL g) override {return false;} // Members char Teds; /* Binary table default endian setting */ @@ -69,14 +69,14 @@ BINCOL(BINCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_BIN;} + int GetAmType(void) override {return TYPE_AM_BIN;} int GetDeplac(void) {return Deplac;} int GetFileSize(void) {return N ? N : GetTypeSize(Buf_Type, Long);} // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; // Static static void SetEndian(void); @@ -105,7 +105,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g) + PQRYRES GetResult(PGLOBAL g) override {return DBFColumns(g, ((PTABDEF)To_Def)->GetPath(), Fn, Topt, false);} // Members diff -Nru mariadb-10.11.6/storage/connect/tabfmt.h mariadb-10.11.9/storage/connect/tabfmt.h --- mariadb-10.11.6/storage/connect/tabfmt.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabfmt.h 2024-08-03 07:29:59.000000000 +0000 @@ -27,13 +27,13 @@ CSVDEF(void); // Implementation - virtual const char *GetType(void) {return "CSV";} + const char *GetType(void) override {return "CSV";} char GetSep(void) {return Sep;} char GetQot(void) {return Qot;} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE mode); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE mode) override; protected: // Members @@ -60,29 +60,29 @@ TDBCSV(PGLOBAL g, PTDBCSV tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_CSV;} - virtual PTDB Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_CSV;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBCSV(g, this);} // Methods - virtual PTDB Clone(PTABS t); + PTDB Clone(PTABS t) override; //virtual bool IsUsingTemp(PGLOBAL g); - virtual int GetBadLines(void) {return (int)Nerr;} + int GetBadLines(void) override {return (int)Nerr;} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual bool OpenDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int CheckWrite(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); // Physical file read + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + bool OpenDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int CheckWrite(PGLOBAL g) override; + int ReadBuffer(PGLOBAL g) override; // Physical file read // Specific routines - virtual int EstimatedLength(void); - virtual bool SkipHeader(PGLOBAL g); + int EstimatedLength(void) override; + bool SkipHeader(PGLOBAL g) override; virtual bool CheckErr(void); protected: - virtual bool PrepareWriting(PGLOBAL g); + bool PrepareWriting(PGLOBAL g) override; // Members PSZ *Field; // Field to write to current line @@ -112,12 +112,12 @@ CSVCOL(CSVCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType() {return TYPE_AM_CSV;} + int GetAmType() override {return TYPE_AM_CSV;} // Methods - virtual bool VarSize(void); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + bool VarSize(void) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: // Default constructor not to be used @@ -143,26 +143,26 @@ TDBFMT(PGLOBAL g, PTDBFMT tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_FMT;} - virtual PTDB Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_FMT;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBFMT(g, this);} // Methods - virtual PTDB Clone(PTABS t); + PTDB Clone(PTABS t) override; // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); -//virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; +//int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; //virtual int CheckWrite(PGLOBAL g); - virtual int ReadBuffer(PGLOBAL g); // Physical file read + int ReadBuffer(PGLOBAL g) override; // Physical file read // Specific routines - virtual int EstimatedLength(void); + int EstimatedLength(void) override; protected: - virtual bool PrepareWriting(PGLOBAL g) + bool PrepareWriting(PGLOBAL g) override {snprintf(g->Message, sizeof(g->Message), MSG(TABLE_READ_ONLY), "FMT"); return true;} // Members @@ -182,7 +182,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + PQRYRES GetResult(PGLOBAL g) override; // Members PTOS Topt; diff -Nru mariadb-10.11.6/storage/connect/tabjdbc.h mariadb-10.11.9/storage/connect/tabjdbc.h --- mariadb-10.11.6/storage/connect/tabjdbc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabjdbc.h 2024-08-03 07:29:59.000000000 +0000 @@ -29,11 +29,11 @@ JDBCDEF(void); // Implementation - virtual const char *GetType(void) { return "JDBC"; } + const char *GetType(void) override { return "JDBC"; } // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; int ParseURL(PGLOBAL g, char *url, bool b = true); bool SetParms(PJPARM sjp); @@ -60,25 +60,25 @@ TDBJDBC(PTDBJDBC tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_JDBC;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJDBC(this);} + AMT GetAmType(void) override {return TYPE_AM_JDBC;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBJDBC(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual bool SetRecpos(PGLOBAL g, int recpos); - virtual void ResetSize(void); - virtual PCSZ GetServer(void) { return "JDBC"; } + PTDB Clone(PTABS t) override; + bool SetRecpos(PGLOBAL g, int recpos) override; + void ResetSize(void) override; + PCSZ GetServer(void) override { return "JDBC"; } virtual int Indexable(void) { return 2; } // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); - virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; + bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) override; protected: // Internal functions @@ -108,12 +108,12 @@ JDBCCOL(JDBCCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) { return TYPE_AM_JDBC; } + int GetAmType(void) override { return TYPE_AM_JDBC; } // Methods //virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: // Constructor for count(*) column @@ -135,19 +135,19 @@ TDBXJDC(PJDBCDEF tdp = NULL); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_XDBC;} + AMT GetAmType(void) override {return TYPE_AM_XDBC;} // Methods // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; //virtual int GetProgMax(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - //virtual void CloseDB(PGLOBAL g); + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + //void CloseDB(PGLOBAL g) override; protected: // Internal functions @@ -170,11 +170,11 @@ JSRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "JDBC"); // Implementation - virtual int GetAmType(void) {return TYPE_AM_JDBC;} + int GetAmType(void) override {return TYPE_AM_JDBC;} // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: // Members @@ -192,7 +192,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + virtual PQRYRES GetResult(PGLOBAL g) override; // Members int Maxres; // Returned lines limit @@ -208,7 +208,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + virtual PQRYRES GetResult(PGLOBAL g) override; // Members PCSZ Schema; // Points to schema name or NULL @@ -227,7 +227,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + virtual PQRYRES GetResult(PGLOBAL g) override; // Members PCSZ Colpat; // Points to catalog column pattern diff -Nru mariadb-10.11.6/storage/connect/tabjmg.h mariadb-10.11.9/storage/connect/tabjmg.h --- mariadb-10.11.6/storage/connect/tabjmg.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabjmg.h 2024-08-03 07:29:59.000000000 +0000 @@ -18,9 +18,9 @@ JMGDISC(PGLOBAL g, int *lg); // Methods - virtual bool Init(PGLOBAL g); - virtual void GetDoc(void) {} - virtual bool Find(PGLOBAL g); + bool Init(PGLOBAL g) override; + void GetDoc(void) override {} + bool Find(PGLOBAL g) override; protected: // Function @@ -51,25 +51,25 @@ TDBJMG(TDBJMG *tdbp); // Implementation - virtual AMT GetAmType(void) { return TYPE_AM_MGO; } - virtual PTDB Duplicate(PGLOBAL g) { return (PTDB)new(g) TDBJMG(this); } + AMT GetAmType(void) override { return TYPE_AM_MGO; } + PTDB Duplicate(PGLOBAL g) override { return (PTDB)new(g) TDBJMG(this); } // Methods - virtual PTDB Clone(PTABS t); - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PCOL colp); + PTDB Clone(PTABS t) override; + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + PCOL InsertSpecialColumn(PCOL colp) override; //virtual void SetFilter(PFIL fp); - virtual int RowNumber(PGLOBAL g, bool b = FALSE) { return N; } + int RowNumber(PGLOBAL g, bool b = FALSE) override { return N; } // Database routines - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); - virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; + bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) override; protected: bool Init(PGLOBAL g); @@ -106,14 +106,14 @@ JMGCOL(JMGCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return Tmgp->GetAmType();} - virtual bool Stringify(void) { return Sgfy; } + int GetAmType(void) override {return Tmgp->GetAmType();} + bool Stringify(void) override { return Sgfy; } // Methods //virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual PSZ GetJpath(PGLOBAL g, bool proj); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + PSZ GetJpath(PGLOBAL g, bool proj) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; //bool AddValue(PGLOBAL g, bson_t *doc, char *key, bool upd); protected: @@ -138,7 +138,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + virtual PQRYRES GetResult(PGLOBAL g) override; // Members PTOS Topt; diff -Nru mariadb-10.11.6/storage/connect/tabjson.h mariadb-10.11.9/storage/connect/tabjson.h --- mariadb-10.11.6/storage/connect/tabjson.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabjson.h 2024-08-03 07:29:59.000000000 +0000 @@ -93,11 +93,11 @@ JSONDEF(void); // Implementation - virtual const char *GetType(void) {return "JSON";} + const char *GetType(void) override {return "JSON";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -141,32 +141,32 @@ TDBJSN(TDBJSN *tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_JSN;} - virtual bool SkipHeader(PGLOBAL g); - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSN(this);} + AMT GetAmType(void) override {return TYPE_AM_JSN;} + bool SkipHeader(PGLOBAL g) override; + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBJSN(this);} PJSON GetRow(void) {return Row;} void SetG(PGLOBAL g) {G = g;} // Methods - virtual PTDB Clone(PTABS t); - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PCOL colp); - virtual int RowNumber(PGLOBAL g, bool b = FALSE) + PTDB Clone(PTABS t) override; + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + PCOL InsertSpecialColumn(PCOL colp) override; + int RowNumber(PGLOBAL g, bool b = FALSE) override {return (b) ? M : N;} - virtual bool CanBeFiltered(void) + bool CanBeFiltered(void) override {return Txfp->GetAmType() == TYPE_AM_MGO || !Xcol;} // Database routines - //virtual int Cardinality(PGLOBAL g); - //virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual bool PrepareWriting(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual void CloseDB(PGLOBAL g); + //int Cardinality(PGLOBAL g) override; + //int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + bool PrepareWriting(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + void CloseDB(PGLOBAL g) override; // Specific routine - virtual int EstimatedLength(void); + int EstimatedLength(void) override; protected: PJSON FindRow(PGLOBAL g); @@ -216,15 +216,15 @@ JSONCOL(JSONCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return Tjp->GetAmType();} - virtual bool Stringify(void) { return Sgfy; } + int GetAmType(void) override {return Tjp->GetAmType();} + bool Stringify(void) override { return Sgfy; } // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; bool ParseJpath(PGLOBAL g); - virtual PSZ GetJpath(PGLOBAL g, bool proj); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + PSZ GetJpath(PGLOBAL g, bool proj) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: bool CheckExpand(PGLOBAL g, int i, PSZ nm, bool b); @@ -269,30 +269,30 @@ TDBJSON(PJTDB tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_JSON;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBJSON(this);} + AMT GetAmType(void) override {return TYPE_AM_JSON;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBJSON(this);} PJAR GetDoc(void) {return Doc;} // Methods - virtual PTDB Clone(PTABS t); + PTDB Clone(PTABS t) override; // Database routines - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual void ResetSize(void); - virtual int GetProgCur(void) {return N;} - virtual int GetRecpos(void); - virtual bool SetRecpos(PGLOBAL g, int recpos); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual bool PrepareWriting(PGLOBAL g) {return false;} - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + void ResetSize(void) override; + int GetProgCur(void) override {return N;} + int GetRecpos(void) override; + bool SetRecpos(PGLOBAL g, int recpos) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + bool PrepareWriting(PGLOBAL g) override {return false;} + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; int MakeDocument(PGLOBAL g); // Optimization routines - virtual int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add); + int MakeIndex(PGLOBAL g, PIXDEF pxdf, bool add) override; protected: int MakeNewDoc(PGLOBAL g); @@ -314,7 +314,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + PQRYRES GetResult(PGLOBAL g) override; // Members PTOS Topt; diff -Nru mariadb-10.11.6/storage/connect/tabmac.h mariadb-10.11.9/storage/connect/tabmac.h --- mariadb-10.11.6/storage/connect/tabmac.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabmac.h 2024-08-03 07:29:59.000000000 +0000 @@ -48,23 +48,23 @@ //TDBMAC(PGLOBAL g, PTDBMAC tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_MAC;} -//virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMAC(g, this);} + AMT GetAmType(void) override {return TYPE_AM_MAC;} +// PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBMAC(g, this);} // Methods -//virtual PTDB Clone(PTABS t); +//PTDB Clone(PTABS t) override; virtual int GetRecpos(void) {return N;} - virtual int RowNumber(PGLOBAL g, bool b = false) {return N;} + int RowNumber(PGLOBAL g, bool b = false) override {return N;} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g) {return GetMaxSize(g);} - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g) {} + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override {return GetMaxSize(g);} + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override {} protected: // Specific routines @@ -94,10 +94,10 @@ //MACCOL(MACCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_MAC;} + int GetAmType(void) override {return TYPE_AM_MAC;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: MACCOL(void) {} // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/tabmul.cpp mariadb-10.11.9/storage/connect/tabmul.cpp --- mariadb-10.11.6/storage/connect/tabmul.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabmul.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -125,8 +125,11 @@ /* have a LRECL that is the sum of the lengths of all components. */ /* This is why we use a big filename array to take care of that. */ /***********************************************************************/ + +PRAGMA_DISABLE_CHECK_STACK_FRAME + bool TDBMUL::InitFileNames(PGLOBAL g) - { +{ #define PFNZ 4096 #define FNSZ (_MAX_DRIVE+_MAX_DIR+_MAX_FNAME+_MAX_EXT) PTDBDIR dirp; @@ -234,6 +237,7 @@ NumFiles = n; return false; } // end of InitFileNames +PRAGMA_REENABLE_CHECK_STACK_FRAME /***********************************************************************/ /* The table column list is the sub-table column list. */ diff -Nru mariadb-10.11.6/storage/connect/tabmul.h mariadb-10.11.9/storage/connect/tabmul.h --- mariadb-10.11.6/storage/connect/tabmul.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabmul.h 2024-08-03 07:29:59.000000000 +0000 @@ -32,31 +32,31 @@ TDBMUL(PTDBMUL tdbp); // Implementation - virtual AMT GetAmType(void) {return Tdbp->GetAmType();} - virtual PTDB Duplicate(PGLOBAL g); + AMT GetAmType(void) override {return Tdbp->GetAmType();} + PTDB Duplicate(PGLOBAL g) override; // Methods - virtual void ResetDB(void); - virtual PTDB Clone(PTABS t); - virtual bool IsSame(PTDB tp) {return tp == (PTDB)Tdbp;} - virtual PCSZ GetFile(PGLOBAL g) {return Tdbp->GetFile(g);} - virtual int GetRecpos(void) {return 0;} - virtual PCOL ColDB(PGLOBAL g, PSZ name, int num); + void ResetDB(void) override; + PTDB Clone(PTABS t) override; + bool IsSame(PTDB tp) override {return tp == (PTDB)Tdbp;} + PCSZ GetFile(PGLOBAL g) override {return Tdbp->GetFile(g);} + int GetRecpos(void) override {return 0;} + PCOL ColDB(PGLOBAL g, PSZ name, int num) override; bool InitFileNames(PGLOBAL g); // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override {strcpy(g->Message, MSG(MUL_MAKECOL_ERR)); return NULL;} - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual int GetProgMax(PGLOBAL g); - virtual int GetProgCur(void); - virtual int RowNumber(PGLOBAL g, bool b = false); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + int GetProgMax(PGLOBAL g) override; + int GetProgCur(void) override; + int RowNumber(PGLOBAL g, bool b = false) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; protected: @@ -83,10 +83,10 @@ TDBMSD(PTDBMSD tdbp) : TDBMUL(tdbp) {} // Implementation - virtual PTDB Duplicate(PGLOBAL g); + PTDB Duplicate(PGLOBAL g); // Methods - virtual PTDB Clone(PTABS t); + PTDB Clone(PTABS t) override; bool InitFileNames(PGLOBAL g); // Database routines @@ -108,11 +108,11 @@ DIRDEF(void) {Fn = NULL; Incl = false; Huge = false;} // Implementation - virtual const char *GetType(void) {return "DIR";} + const char *GetType(void) override {return "DIR";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -137,21 +137,21 @@ TDBDIR(PSZ fpat); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_DIR;} + AMT GetAmType(void) override {return TYPE_AM_DIR;} // Methods - virtual int GetRecpos(void) {return iFile;} + int GetRecpos(void) override {return iFile;} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int GetMaxSize(PGLOBAL g); - virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} - virtual int GetProgCur(void) {return iFile;} - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int GetMaxSize(PGLOBAL g) override; + int GetProgMax(PGLOBAL g) override {return GetMaxSize(g);} + int GetProgCur(void) override {return iFile;} + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; protected: void Init(void); @@ -195,11 +195,11 @@ TDBSDR(PSZ fpat) : TDBDIR(fpat) {Sub = NULL;} // Database routines - virtual int GetMaxSize(PGLOBAL g); - virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); -//virtual void CloseDB(PGLOBAL g); + int GetMaxSize(PGLOBAL g) override; + int GetProgMax(PGLOBAL g) override {return GetMaxSize(g);} + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; +//void CloseDB(PGLOBAL g) override; protected: int FindInDir(PGLOBAL g); @@ -230,10 +230,10 @@ DIRCOL(DIRCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_DIR;} + int GetAmType(void) override {return TYPE_AM_DIR;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/tabmysql.h mariadb-10.11.9/storage/connect/tabmysql.h --- mariadb-10.11.6/storage/connect/tabmysql.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabmysql.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,7 +28,7 @@ MYSQLDEF(void); // Implementation - virtual const char *GetType(void) {return "MYSQL";} + const char *GetType(void) override {return "MYSQL";} inline PSZ GetHostname(void) {return Hostname;}; //inline PSZ GetDatabase(void) {return Tabschema;}; //inline PSZ GetTabname(void) {return Tabname;} @@ -39,8 +39,8 @@ // Methods //virtual int Indexable(void) {return 2;} - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; bool ParseURL(PGLOBAL g, char *url, bool b = true); bool GetServerInfo(PGLOBAL g, const char *server_name); @@ -77,30 +77,30 @@ TDBMYSQL(PTDBMY tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_MYSQL;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYSQL(this);} + AMT GetAmType(void) override {return TYPE_AM_MYSQL;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBMYSQL(this);} // Methods - virtual PTDB Clone(PTABS t); + PTDB Clone(PTABS t) override; //virtual int GetAffectedRows(void) {return AftRows;} - virtual int GetRecpos(void) {return N;} - virtual int GetProgMax(PGLOBAL g); - virtual void ResetDB(void) {N = 0;} - virtual int RowNumber(PGLOBAL g, bool b = false); - virtual bool IsView(void) {return Isview;} - virtual PCSZ GetServer(void) {return Server;} + int GetRecpos(void) override {return N;} + int GetProgMax(PGLOBAL g) override; + void ResetDB(void) override {N = 0;} + int RowNumber(PGLOBAL g, bool b = false) override; + bool IsView(void) override {return Isview;} + PCSZ GetServer(void) override {return Server;} void SetDatabase(LPCSTR db) {Schema = (char*)db;} // Schema routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); -//virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); - virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override; +//int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; + bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) override; // Specific routines bool SetColumnRanks(PGLOBAL g); @@ -112,7 +112,7 @@ bool MakeSelect(PGLOBAL g, bool mx); bool MakeInsert(PGLOBAL g); int BindColumns(PGLOBAL g __attribute__((unused))); - virtual bool MakeCommand(PGLOBAL g); + bool MakeCommand(PGLOBAL g) override; //int MakeUpdate(PGLOBAL g); //int MakeDelete(PGLOBAL g); int SendCommand(PGLOBAL g); @@ -154,13 +154,13 @@ MYSQLCOL(MYSQLCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_MYSQL;} + int GetAmType(void) override {return TYPE_AM_MYSQL;} void InitBind(PGLOBAL g); // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; bool FindRank(PGLOBAL g); protected: @@ -182,19 +182,19 @@ TDBMYEXC(PTDBMYX tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_MYX;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBMYEXC(this);} + AMT GetAmType(void) override {return TYPE_AM_MYX;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBMYEXC(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual bool IsView(void) {return Isview;} + PTDB Clone(PTABS t) override; + bool IsView(void) override {return Isview;} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; protected: // Internal functions @@ -223,8 +223,8 @@ MYXCOL(MYXCOL *colp, PTDB tdbp); // Constructor used in copy process // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: // Members @@ -242,7 +242,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + PQRYRES GetResult(PGLOBAL g) override; // Members PCSZ Host; // Host machine to use diff -Nru mariadb-10.11.6/storage/connect/taboccur.h mariadb-10.11.9/storage/connect/taboccur.h --- mariadb-10.11.6/storage/connect/taboccur.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/taboccur.h 2024-08-03 07:29:59.000000000 +0000 @@ -26,11 +26,11 @@ OCCURDEF(void) {Pseudo = 3; Colist = Xcol = NULL;} // Implementation - virtual const char *GetType(void) {return "OCCUR";} + const char *GetType(void) override {return "OCCUR";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -50,21 +50,21 @@ TDBOCCUR(POCCURDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_OCCUR;} + AMT GetAmType(void) override {return TYPE_AM_OCCUR;} void SetTdbp(PTDBASE tdbp) {Tdbp = tdbp;} // Methods - virtual void ResetDB(void) {N = 0; Tdbp->ResetDB();} - virtual int RowNumber(PGLOBAL g, bool b = FALSE); + void ResetDB(void) override {N = 0; Tdbp->ResetDB();} + int RowNumber(PGLOBAL g, bool b = FALSE) override; bool MakeColumnList(PGLOBAL g); bool ViewColumnList(PGLOBAL g); // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual bool InitTable(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + bool InitTable(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; protected: // Members @@ -89,12 +89,12 @@ OCCURCOL(PCOLDEF cdp, PTDBOCCUR tdbp, int n); // Implementation - virtual int GetAmType(void) {return TYPE_AM_OCCUR;} + int GetAmType(void) override {return TYPE_AM_OCCUR;} int GetI(void) {return I;} // Methods - virtual void Reset(void) {} // Evaluated only by TDBOCCUR - virtual void ReadColumn(PGLOBAL g); + void Reset(void) override {} // Evaluated only by TDBOCCUR + void ReadColumn(PGLOBAL g) override; void Xreset(void) {I = 0;}; protected: @@ -114,10 +114,10 @@ RANKCOL(PCOLDEF cdp, PTDBOCCUR tdbp, int n) : COLBLK(cdp, tdbp, n) {} // Implementation - virtual int GetAmType(void) {return TYPE_AM_OCCUR;} + int GetAmType(void) override {return TYPE_AM_OCCUR;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/tabodbc.h mariadb-10.11.9/storage/connect/tabodbc.h --- mariadb-10.11.6/storage/connect/tabodbc.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabodbc.h 2024-08-03 07:29:59.000000000 +0000 @@ -31,14 +31,14 @@ ODBCDEF(void); // Implementation - virtual const char *GetType(void) {return "ODBC";} + const char *GetType(void) override {return "ODBC";} PSZ GetConnect(void) {return Connect;} int GetCatver(void) {return Catver;} // Methods - virtual int Indexable(void) {return 2;} - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + int Indexable(void) override {return 2;} + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -63,28 +63,28 @@ TDBODBC(PTDBODBC tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_ODBC;} - virtual PTDB Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_ODBC;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBODBC(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual bool SetRecpos(PGLOBAL g, int recpos); - virtual PCSZ GetFile(PGLOBAL g); - virtual void SetFile(PGLOBAL g, PCSZ fn); - virtual void ResetSize(void); - virtual PCSZ GetServer(void) {return "ODBC";} + PTDB Clone(PTABS t) override; + bool SetRecpos(PGLOBAL g, int recpos) override; + PCSZ GetFile(PGLOBAL g) override; + void SetFile(PGLOBAL g, PCSZ fn) override; + void ResetSize(void) override; + PCSZ GetServer(void) override {return "ODBC";} virtual int Indexable(void) {return 2;} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); - virtual bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; + bool ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) override; protected: // Internal functions @@ -109,16 +109,16 @@ public: // Constructors ODBCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "ODBC"); - ODBCCOL(ODBCCOL *colp, PTDB tdbp); // Constructor used in copy process + ODBCCOL(ODBCCOL *colp, PTDB tdbp); // Constructor used in opy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_ODBC;} - SQLLEN *GetStrLen(void) {return StrLen;} + int GetAmType(void) override {return TYPE_AM_ODBC;} + SQLLEN *GetStrLen(void) {return StrLen;} // Methods //virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; void AllocateBuffers(PGLOBAL g, int rows); void *GetBuffer(DWORD rows); SWORD GetBuflen(void); @@ -146,20 +146,20 @@ TDBXDBC(PTDBXDBC tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_XDBC;} - virtual PTDB Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_XDBC;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBXDBC(this);} // Methods - virtual PTDB Clone(PTABS t); + PTDB Clone(PTABS t) override; // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; protected: // Internal functions @@ -185,8 +185,8 @@ // Implementation // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: // Members @@ -203,8 +203,8 @@ TDBDRV(PODEF tdp) : TDBCAT(tdp) {Maxres = tdp->Maxres;} protected: - // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + // Specific routines + PQRYRES GetResult(PGLOBAL g) override; // Members int Maxres; // Returned lines limit @@ -219,8 +219,8 @@ TDBSRC(PODEF tdp) : TDBDRV(tdp) {} protected: - // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + // Specific routines + PQRYRES GetResult(PGLOBAL g) override; // No additional Members }; // end of class TDBSRC @@ -234,8 +234,8 @@ TDBOTB(PODEF tdp); protected: - // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + // Specific routines + PQRYRES GetResult(PGLOBAL g) override; // Members PCSZ Dsn; // Points to connection string @@ -254,8 +254,8 @@ TDBOCL(PODEF tdp); protected: - // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + // Specific routines + PQRYRES GetResult(PGLOBAL g) override; // Members char *Colpat; // Points to column pattern diff -Nru mariadb-10.11.6/storage/connect/tabpivot.h mariadb-10.11.9/storage/connect/tabpivot.h --- mariadb-10.11.6/storage/connect/tabpivot.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabpivot.h 2024-08-03 07:29:59.000000000 +0000 @@ -27,7 +27,7 @@ bool SkipColumn(PCOLRES crp, char *skc); // The sorting function - virtual int Qcompare(int *, int *); + int Qcompare(int *, int *) override; protected: // Members @@ -64,11 +64,11 @@ PIVOTDEF(void); // Implementation - virtual const char *GetType(void) {return "PIVOT";} + const char *GetType(void) override {return "PIVOT";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -96,22 +96,22 @@ TDBPIVOT(PPIVOTDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_PIVOT;} + AMT GetAmType(void) override {return TYPE_AM_PIVOT;} // Methods - virtual int GetRecpos(void) {return N;} - virtual void ResetDB(void) {N = 0;} - virtual int RowNumber(PGLOBAL g, bool b = FALSE); + int GetRecpos(void) override {return N;} + void ResetDB(void) override {N = 0;} + int RowNumber(PGLOBAL g, bool b = FALSE) override; // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g) {return (g) ? 10 : 0;} - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override {return (g) ? 10 : 0;} + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; protected: // Internal routines @@ -154,10 +154,10 @@ FNCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i); // Implementation - virtual int GetAmType(void) {return TYPE_AM_FNC;} + int GetAmType(void) override {return TYPE_AM_FNC;} // Methods - virtual void Reset(void) {} + void Reset(void) override {} bool InitColumn(PGLOBAL g); bool CompareColumn(void); @@ -177,13 +177,13 @@ SRCCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int n); // Implementation - virtual int GetAmType(void) {return TYPE_AM_SRC;} + int GetAmType(void) override {return TYPE_AM_SRC;} // Methods using PRXCOL::Init; - virtual void Reset(void) {} + void Reset(void) override {} void SetColumn(void); - virtual bool Init(PGLOBAL g, PTDB tp); + bool Init(PGLOBAL g, PTDB tp) override; bool CompareLast(void); protected: diff -Nru mariadb-10.11.6/storage/connect/tabrest.h mariadb-10.11.9/storage/connect/tabrest.h --- mariadb-10.11.6/storage/connect/tabrest.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabrest.h 2024-08-03 07:29:59.000000000 +0000 @@ -33,11 +33,11 @@ RESTDEF(void) { Tdp = NULL; Http = Uri = Fn = NULL; } // Implementation - virtual const char *GetType(void) { return "REST"; } + const char *GetType(void) override { return "REST"; } // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members diff -Nru mariadb-10.11.6/storage/connect/tabsys.h mariadb-10.11.9/storage/connect/tabsys.h --- mariadb-10.11.6/storage/connect/tabsys.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabsys.h 2024-08-03 07:29:59.000000000 +0000 @@ -27,11 +27,11 @@ INIDEF(void); // Implementation - virtual const char *GetType(void) {return "INI";} + const char *GetType(void) override {return "INI";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -53,30 +53,30 @@ TDBINI(PTDBINI tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_INI;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBINI(this);} + AMT GetAmType(void) override {return TYPE_AM_INI;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBINI(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual int GetRecpos(void) {return N;} - virtual int GetProgCur(void) {return N;} + PTDB Clone(PTABS t) override; + int GetRecpos(void) override {return N;} + int GetProgCur(void) override {return N;} //virtual int GetAffectedRows(void) {return 0;} - virtual PCSZ GetFile(PGLOBAL g) {return Ifile;} - virtual void SetFile(PGLOBAL g, PCSZ fn) {Ifile = fn;} - virtual void ResetDB(void) {Seclist = Section = NULL; N = 0;} - virtual void ResetSize(void) {MaxSize = -1; Seclist = NULL;} - virtual int RowNumber(PGLOBAL g, bool b = false) {return N;} + PCSZ GetFile(PGLOBAL g) override {return Ifile;} + void SetFile(PGLOBAL g, PCSZ fn) override {Ifile = fn;} + void ResetDB(void) override {Seclist = Section = NULL; N = 0;} + void ResetSize(void) override {MaxSize = -1; Seclist = NULL;} + int RowNumber(PGLOBAL g, bool b = false) override {return N;} char *GetSeclist(PGLOBAL g); // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; protected: // Members @@ -97,13 +97,13 @@ INICOL(INICOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_INI;} - virtual void SetTo_Val(PVAL valp) {To_Val = valp;} + int GetAmType(void) override {return TYPE_AM_INI;} + void SetTo_Val(PVAL valp) override {To_Val = valp;} // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; virtual void AllocBuf(PGLOBAL g); protected: @@ -132,24 +132,24 @@ TDBXIN(PTDBXIN tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_INI;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBXIN(this);} + AMT GetAmType(void) override {return TYPE_AM_INI;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBXIN(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual int GetRecpos(void); - virtual bool SetRecpos(PGLOBAL g, int recpos); - virtual void ResetDB(void) + PTDB Clone(PTABS t) override; + int GetRecpos(void) override; + bool SetRecpos(PGLOBAL g, int recpos) override; + void ResetDB(void) override {Seclist = Section = Keycur = NULL; N = 0; Oldsec = -1;} char *GetKeylist(PGLOBAL g, char *sec); // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; protected: // Members @@ -171,8 +171,8 @@ // Implementation // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; protected: // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/tabtbl.h mariadb-10.11.9/storage/connect/tabtbl.h --- mariadb-10.11.6/storage/connect/tabtbl.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabtbl.h 2024-08-03 07:29:59.000000000 +0000 @@ -24,11 +24,11 @@ TBLDEF(void); // Implementation - virtual const char *GetType(void) {return "TBL";} + const char *GetType(void) override {return "TBL";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -48,21 +48,21 @@ TDBTBL(PTBLDEF tdp = NULL); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_TBL;} + AMT GetAmType(void) override {return TYPE_AM_TBL;} // Methods - virtual void ResetDB(void); - virtual int GetRecpos(void) {return Rows;} - virtual int GetBadLines(void) {return (int)Nbc;} + void ResetDB(void) override; + int GetRecpos(void) override {return Rows;} + int GetBadLines(void) override {return (int)Nbc;} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual int RowNumber(PGLOBAL g, bool b = FALSE); - virtual PCOL InsertSpecialColumn(PCOL scp); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + int RowNumber(PGLOBAL g, bool b = FALSE) override; + PCOL InsertSpecialColumn(PCOL scp) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; protected: // Internal functions @@ -89,7 +89,7 @@ TBTBLK(PVAL valp) {Value = valp;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; // Fake operator new used to change TIDBLK into SDTBLK void * operator new(size_t size, TIDBLK *sp) {return sp;} @@ -143,11 +143,11 @@ virtual void ResetDB(void); // Database routines - virtual int Cardinality(PGLOBAL g) { return 10; } - virtual int GetMaxSize(PGLOBAL g) { return 10; } // Temporary - virtual int RowNumber(PGLOBAL g, bool b = FALSE); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); + int Cardinality(PGLOBAL g) override { return 10; } + int GetMaxSize(PGLOBAL g) override { return 10; } // Temporary + int RowNumber(PGLOBAL g, bool b = FALSE) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; protected: // Internal functions diff -Nru mariadb-10.11.6/storage/connect/tabutil.h mariadb-10.11.9/storage/connect/tabutil.h --- mariadb-10.11.6/storage/connect/tabutil.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabutil.h 2024-08-03 07:29:59.000000000 +0000 @@ -40,11 +40,11 @@ PRXDEF(void); // Implementation - virtual const char *GetType(void) {return "PRX";} + const char *GetType(void) override {return "PRX";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE mode); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE mode) override; protected: // Members @@ -63,27 +63,27 @@ TDBPRX(PTDBPRX tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_PRX;} - virtual PTDB Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_PRX;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBPRX(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual int GetRecpos(void) {return Tdbp->GetRecpos();} - virtual void ResetDB(void) {Tdbp->ResetDB();} - virtual int RowNumber(PGLOBAL g, bool b = FALSE); - virtual PCSZ GetServer(void) {return (Tdbp) ? Tdbp->GetServer() : (PSZ)"?";} + PTDB Clone(PTABS t) override; + int GetRecpos(void) override {return Tdbp->GetRecpos();} + void ResetDB(void) override {Tdbp->ResetDB();} + int RowNumber(PGLOBAL g, bool b = FALSE) override; + PCSZ GetServer(void) override {return (Tdbp) ? Tdbp->GetServer() : (PSZ)"?";} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; virtual bool InitTable(PGLOBAL g); - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g) {if (Tdbp) Tdbp->CloseDB(g);} + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override {if (Tdbp) Tdbp->CloseDB(g);} PTDB GetSubTable(PGLOBAL g, PTABLE tabp, bool b = false); void RemoveNext(PTABLE tp); @@ -106,16 +106,16 @@ PRXCOL(PRXCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_PRX;} + int GetAmType(void) override {return TYPE_AM_PRX;} // Methods using COLBLK::Init; - virtual void Reset(void); - virtual bool IsSpecial(void) {return Pseudo;} - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) + void Reset(void) override; + bool IsSpecial(void) override {return Pseudo;} + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override {return false;} - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; virtual bool Init(PGLOBAL g, PTDB tp); protected: @@ -141,7 +141,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + PQRYRES GetResult(PGLOBAL g) override; // Members PSZ Db; // Database of the table diff -Nru mariadb-10.11.6/storage/connect/tabvct.cpp mariadb-10.11.9/storage/connect/tabvct.cpp --- mariadb-10.11.6/storage/connect/tabvct.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabvct.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -71,11 +71,6 @@ #include "tabvct.h" #include "valblk.h" -#if defined(UNIX) -//add dummy strerror (NGC) -char *strerror(int num); -#endif // UNIX - /***********************************************************************/ /* External function. */ /***********************************************************************/ diff -Nru mariadb-10.11.6/storage/connect/tabvct.h mariadb-10.11.9/storage/connect/tabvct.h --- mariadb-10.11.6/storage/connect/tabvct.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabvct.h 2024-08-03 07:29:59.000000000 +0000 @@ -29,12 +29,12 @@ VCTDEF(void) {Split = false; Estimate = Header = 0;} // Implementation - virtual const char *GetType(void) {return "VCT";} + const char *GetType(void) override {return "VCT";} int GetEstimate(void) {return Estimate;} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE mode); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE mode) override; protected: int MakeFnPattern(char *fpat); @@ -62,20 +62,20 @@ TDBVCT(PGLOBAL g, PTDBVCT tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_VCT;} - virtual PTDB Duplicate(PGLOBAL g) + AMT GetAmType(void) override {return TYPE_AM_VCT;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBVCT(g, this);} bool IsSplit(void) {return ((VCTDEF*)To_Def)->Split;} // Methods - virtual PTDB Clone(PTABS t); - virtual bool IsUsingTemp(PGLOBAL g); + PTDB Clone(PTABS t) override; + bool IsUsingTemp(PGLOBAL g) override; // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual void CloseDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + void CloseDB(PGLOBAL g) override; protected: // Members @@ -98,13 +98,13 @@ VCTCOL(VCTCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_VCT;} + int GetAmType(void) override {return TYPE_AM_VCT;} // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void SetOk(void); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; + void SetOk(void) override; protected: virtual void ReadBlock(PGLOBAL g); diff -Nru mariadb-10.11.6/storage/connect/tabvir.h mariadb-10.11.9/storage/connect/tabvir.h --- mariadb-10.11.6/storage/connect/tabvir.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabvir.h 2024-08-03 07:29:59.000000000 +0000 @@ -24,12 +24,12 @@ VIRDEF(void) = default; // Implementation - virtual const char *GetType(void) {return "VIRTUAL";} + const char *GetType(void) override {return "VIRTUAL";} // Methods - virtual bool DefineAM(PGLOBAL, LPCSTR, int) {Pseudo = 3; return false;} - virtual int Indexable(void) {return 3;} - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL, LPCSTR, int) override {Pseudo = 3; return false;} + int Indexable(void) override {return 3;} + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -44,24 +44,24 @@ TDBVIR(PVIRDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_VIR;} + AMT GetAmType(void) override {return TYPE_AM_VIR;} // Methods - virtual int GetRecpos(void) {return N;} - virtual bool SetRecpos(PGLOBAL g, int recpos) + int GetRecpos(void) override {return N;} + bool SetRecpos(PGLOBAL g, int recpos) override {N = recpos - 2; return false;} - virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;} + int RowNumber(PGLOBAL g, bool b = false) override {return N + 1;} int TestFilter(PFIL filp, bool nop); // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g) {return (g) ? Size : 1;} - virtual int GetMaxSize(PGLOBAL g) {return Size;} - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g) {} + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override {return (g) ? Size : 1;} + int GetMaxSize(PGLOBAL g) override {return Size;} + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override {} protected: // Members @@ -79,10 +79,10 @@ VIRCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "VIRTUAL"); // Implementation - virtual int GetAmType(void) {return TYPE_AM_VIR;} + int GetAmType(void) override {return TYPE_AM_VIR;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: // Default constructor not to be used @@ -100,11 +100,11 @@ TDBVICL(PVIRDEF tdp) : TDBCAT(tdp) {} // Methods - virtual int Cardinality(PGLOBAL g) {return 2;} // Avoid DBUG_ASSERT + int Cardinality(PGLOBAL g) override {return 2;} // Avoid DBUG_ASSERT protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + PQRYRES GetResult(PGLOBAL g) override; // Members }; // end of class TDBVICL diff -Nru mariadb-10.11.6/storage/connect/tabwmi.h mariadb-10.11.9/storage/connect/tabwmi.h --- mariadb-10.11.6/storage/connect/tabwmi.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabwmi.h 2024-08-03 07:29:59.000000000 +0000 @@ -66,22 +66,22 @@ TDBWMI(PWMIDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_WMI;} + AMT GetAmType(void) override {return TYPE_AM_WMI;} // Methods virtual int GetRecpos(void); virtual int GetProgCur(void) {return N;} - virtual int RowNumber(PGLOBAL g, bool b = false) {return N + 1;} + int RowNumber(PGLOBAL g, bool b = false) override {return N + 1;} // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g) {return GetMaxSize(g);} - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override {return GetMaxSize(g);} + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; protected: // Specific routines @@ -118,10 +118,10 @@ WMICOL(PCOLDEF cdp, PTDB tdbp, int n); // Implementation - virtual int GetAmType(void) {return TYPE_AM_WMI;} + int GetAmType(void) override {return TYPE_AM_WMI;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: WMICOL(void) {} // Default constructor not to be used @@ -143,7 +143,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + virtual PQRYRES GetResult(PGLOBAL g) override; // Members char *Nsp; // Name space diff -Nru mariadb-10.11.6/storage/connect/tabxcl.h mariadb-10.11.9/storage/connect/tabxcl.h --- mariadb-10.11.6/storage/connect/tabxcl.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabxcl.h 2024-08-03 07:29:59.000000000 +0000 @@ -29,11 +29,11 @@ XCLDEF(void); // Implementation - virtual const char *GetType(void) {return "XCL";} + const char *GetType(void) override {return "XCL";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE mode); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE mode) override; protected: // Members @@ -54,17 +54,17 @@ TDBXCL(PXCLDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_XCOL;} + AMT GetAmType(void) override {return TYPE_AM_XCOL;} // Methods - virtual void ResetDB(void) {N = 0; Tdbp->ResetDB();} - virtual int RowNumber(PGLOBAL g, bool b = FALSE); + void ResetDB(void) override {N = 0; Tdbp->ResetDB();} + int RowNumber(PGLOBAL g, bool b = FALSE) override; // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; protected: // Members @@ -89,9 +89,9 @@ // Methods using PRXCOL::Init; - virtual void Reset(void) {} // Evaluated only by TDBXCL - virtual void ReadColumn(PGLOBAL g); - virtual bool Init(PGLOBAL g, PTDB tp = NULL); + void Reset(void) override {} // Evaluated only by TDBXCL + void ReadColumn(PGLOBAL g) override; + bool Init(PGLOBAL g, PTDB tp = NULL) override; protected: // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/tabxml.h mariadb-10.11.9/storage/connect/tabxml.h --- mariadb-10.11.6/storage/connect/tabxml.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabxml.h 2024-08-03 07:29:59.000000000 +0000 @@ -25,11 +25,11 @@ XMLDEF(void); // Implementation - virtual const char *GetType(void) {return "XML";} + const char *GetType(void) override {return "XML";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -72,18 +72,18 @@ TDBXML(PTDBXML tdbp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_XML;} - virtual PTDB Duplicate(PGLOBAL g) {return (PTDB)new(g) TDBXML(this);} + AMT GetAmType(void) override {return TYPE_AM_XML;} + PTDB Duplicate(PGLOBAL g) override {return (PTDB)new(g) TDBXML(this);} // Methods - virtual PTDB Clone(PTABS t); - virtual int GetRecpos(void); - virtual int GetProgCur(void) {return N;} - virtual PCSZ GetFile(PGLOBAL g) {return Xfile;} - virtual void SetFile(PGLOBAL g, PCSZ fn) {Xfile = fn;} - virtual void ResetDB(void) {N = 0;} - virtual void ResetSize(void) {MaxSize = -1;} - virtual int RowNumber(PGLOBAL g, bool b = false); + PTDB Clone(PTABS t) override; + int GetRecpos(void) override; + int GetProgCur(void) override {return N;} + PCSZ GetFile(PGLOBAL g) override {return Xfile;} + void SetFile(PGLOBAL g, PCSZ fn) override {Xfile = fn;} + void ResetDB(void) override {N = 0;} + void ResetSize(void) override {MaxSize = -1;} + int RowNumber(PGLOBAL g, bool b = false) override; int LoadTableFile(PGLOBAL g, char *filename); bool Initialize(PGLOBAL g); bool SetTabNode(PGLOBAL g); @@ -91,19 +91,19 @@ bool CheckRow(PGLOBAL g, bool b); // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual PCOL InsertSpecialColumn(PCOL colp); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + PCOL InsertSpecialColumn(PCOL colp) override; //virtual int GetMaxSame(PGLOBAL g) {return (Xpand) ? Limit : 1;} - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; //virtual bool NeedIndexing(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); - virtual int CheckWrite(PGLOBAL g) {Checked = true; return 0;} - virtual const CHARSET_INFO *data_charset(); + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; + int CheckWrite(PGLOBAL g) override {Checked = true; return 0;} + const CHARSET_INFO *data_charset() override; protected: // Members @@ -164,14 +164,14 @@ XMLCOL(XMLCOL *colp, PTDB tdbp); // Constructor used in copy process // Implementation - virtual int GetAmType(void) {return TYPE_AM_XML;} - virtual void SetTo_Val(PVAL valp) {To_Val = valp;} + int GetAmType(void) override {return TYPE_AM_XML;} + void SetTo_Val(PVAL valp) override {To_Val = valp;} bool ParseXpath(PGLOBAL g, bool mode); // Methods - virtual bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check); - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + bool SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check) override; + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; bool AllocBuf(PGLOBAL g, bool mode); void AllocNodes(PGLOBAL g, PXDOC dp); @@ -234,8 +234,8 @@ XMULCOL(PVAL valp) {Value = valp; Mul = true;} // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; }; // end of class XMULCOL /***********************************************************************/ @@ -248,8 +248,8 @@ XPOSCOL(PVAL valp) {Value = valp;} // Methods - virtual void ReadColumn(PGLOBAL g); - virtual void WriteColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; + void WriteColumn(PGLOBAL g) override; }; // end of class XPOSCOL /***********************************************************************/ @@ -262,7 +262,7 @@ protected: // Specific routines - virtual PQRYRES GetResult(PGLOBAL g); + PQRYRES GetResult(PGLOBAL g) override; // Members PTOS Topt; diff -Nru mariadb-10.11.6/storage/connect/tabzip.h mariadb-10.11.9/storage/connect/tabzip.h --- mariadb-10.11.6/storage/connect/tabzip.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/tabzip.h 2024-08-03 07:29:59.000000000 +0000 @@ -26,11 +26,11 @@ ZIPDEF(void) = default; // Implementation - virtual const char *GetType(void) {return "ZIP";} + const char *GetType(void) override {return "ZIP";} // Methods - virtual bool DefineAM(PGLOBAL g, LPCSTR am, int poff); - virtual PTDB GetTable(PGLOBAL g, MODE m); + bool DefineAM(PGLOBAL g, LPCSTR am, int poff) override; + PTDB GetTable(PGLOBAL g, MODE m) override; protected: // Members @@ -47,22 +47,22 @@ TDBZIP(PZIPDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_ZIP;} - virtual PCSZ GetFile(PGLOBAL) {return zfn;} - virtual void SetFile(PGLOBAL, PCSZ fn) {zfn = fn;} + AMT GetAmType(void) override {return TYPE_AM_ZIP;} + PCSZ GetFile(PGLOBAL) override {return zfn;} + void SetFile(PGLOBAL, PCSZ fn) override {zfn = fn;} // Methods - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL g); - virtual int GetMaxSize(PGLOBAL g); - virtual int GetRecpos(void) {return 0;} + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL g) override; + int GetMaxSize(PGLOBAL g) override; + int GetRecpos(void) override {return 0;} // Database routines - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; protected: bool open(PGLOBAL g, const char *filename); @@ -87,10 +87,10 @@ ZIPCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "ZIP"); // Implementation - virtual int GetAmType(void) { return TYPE_AM_ZIP; } + int GetAmType(void) override { return TYPE_AM_ZIP; } // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/unzip.c mariadb-10.11.9/storage/connect/unzip.c --- mariadb-10.11.6/storage/connect/unzip.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/unzip.c 2024-08-03 07:29:59.000000000 +0000 @@ -122,7 +122,7 @@ const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; -/* unz_file_info_interntal contain internal info about a file in zipfile*/ +/* unz_file_info64_internal contain internal info about a file in zipfile*/ typedef struct unz_file_info64_internal_s { ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */ @@ -542,7 +542,7 @@ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; - /* number of the disk with the start of the zip64 end of central directory */ + /* number of the disk with the start of the zip64 end of central directory */ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK) return 0; if (uL != 0) @@ -590,10 +590,10 @@ ZPOS64_T central_pos; uLong uL; - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ + uLong number_disk; /* number of the current disk, used for + spanning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the disk with central dir, used + for spanning ZIP, unsupported, always 0*/ ZPOS64_T number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ diff -Nru mariadb-10.11.6/storage/connect/unzip.h mariadb-10.11.9/storage/connect/unzip.h --- mariadb-10.11.6/storage/connect/unzip.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/unzip.h 2024-08-03 07:29:59.000000000 +0000 @@ -306,7 +306,7 @@ Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file - if szFileName!=NULL, the filemane string will be copied in szFileName + if szFileName!=NULL, the filename string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). diff -Nru mariadb-10.11.6/storage/connect/valblk.h mariadb-10.11.9/storage/connect/valblk.h --- mariadb-10.11.6/storage/connect/valblk.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/valblk.h 2024-08-03 07:29:59.000000000 +0000 @@ -149,54 +149,54 @@ TYPBLK(void *mp, int size, int type, int prec = 0, bool un = false); // Implementation - virtual bool Init(PGLOBAL g, bool check); - virtual int GetVlen(void) {return sizeof(TYPE);} + bool Init(PGLOBAL g, bool check) override; + int GetVlen(void) override {return sizeof(TYPE);} - virtual char GetTinyValue(int n) {return (char)UnalignedRead(n);} - virtual uchar GetUTinyValue(int n) {return (uchar)UnalignedRead(n);} - virtual short GetShortValue(int n) {return (short)UnalignedRead(n);} - virtual ushort GetUShortValue(int n) {return (ushort)UnalignedRead(n);} - virtual int GetIntValue(int n) {return (int)UnalignedRead(n);} - virtual uint GetUIntValue(int n) {return (uint)UnalignedRead(n);} - virtual longlong GetBigintValue(int n) {return (longlong)UnalignedRead(n);} - virtual ulonglong GetUBigintValue(int n) {return (ulonglong)UnalignedRead(n);} - virtual double GetFloatValue(int n) {return (double)UnalignedRead(n);} - virtual char *GetCharString(char *p, int n); - virtual void Reset(int n) {UnalignedWrite(n, 0);} + char GetTinyValue(int n) override {return (char)UnalignedRead(n);} + uchar GetUTinyValue(int n) override {return (uchar)UnalignedRead(n);} + short GetShortValue(int n) override {return (short)UnalignedRead(n);} + ushort GetUShortValue(int n) override {return (ushort)UnalignedRead(n);} + int GetIntValue(int n) override {return (int)UnalignedRead(n);} + uint GetUIntValue(int n) override {return (uint)UnalignedRead(n);} + longlong GetBigintValue(int n) override {return (longlong)UnalignedRead(n);} + ulonglong GetUBigintValue(int n) override {return (ulonglong)UnalignedRead(n);} + double GetFloatValue(int n) override {return (double)UnalignedRead(n);} + char *GetCharString(char *p, int n) override; + void Reset(int n) override {UnalignedWrite(n, 0);} // Methods using VALBLK::SetValue; - virtual void SetValue(PCSZ sp, int n); - virtual void SetValue(const char *sp, uint len, int n); - virtual void SetValue(short sval, int n) + void SetValue(PCSZ sp, int n) override; + void SetValue(const char *sp, uint len, int n) override; + void SetValue(short sval, int n) override {UnalignedWrite(n, (TYPE)sval); SetNull(n, false);} - virtual void SetValue(ushort sval, int n) + void SetValue(ushort sval, int n) override {UnalignedWrite(n, (TYPE)sval); SetNull(n, false);} - virtual void SetValue(int lval, int n) + void SetValue(int lval, int n) override {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);} - virtual void SetValue(uint lval, int n) + void SetValue(uint lval, int n) override {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);} - virtual void SetValue(longlong lval, int n) + void SetValue(longlong lval, int n) override {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);} - virtual void SetValue(ulonglong lval, int n) + void SetValue(ulonglong lval, int n) override {UnalignedWrite(n, (TYPE)lval); SetNull(n, false);} - virtual void SetValue(double fval, int n) + void SetValue(double fval, int n) override {UnalignedWrite(n, (TYPE)fval); SetNull(n, false);} - virtual void SetValue(char cval, int n) + void SetValue(char cval, int n) override {UnalignedWrite(n, (TYPE)cval); SetNull(n, false);} - virtual void SetValue(uchar cval, int n) + void SetValue(uchar cval, int n) override {UnalignedWrite(n, (TYPE)cval); SetNull(n, false);} - virtual void SetValue(PVAL valp, int n); - virtual void SetValue(PVBLK pv, int n1, int n2); - virtual void SetMin(PVAL valp, int n); - virtual void SetMax(PVAL valp, int n); - virtual void Move(int i, int j); - virtual int CompVal(PVAL vp, int n); - virtual int CompVal(int i1, int i2); - virtual void *GetValPtr(int n); - virtual void *GetValPtrEx(int n); - virtual int Find(PVAL vp); - virtual int GetMaxLength(void); + void SetValue(PVAL valp, int n) override; + void SetValue(PVBLK pv, int n1, int n2) override; + void SetMin(PVAL valp, int n) override; + void SetMax(PVAL valp, int n) override; + void Move(int i, int j) override; + int CompVal(PVAL vp, int n) override; + int CompVal(int i1, int i2) override; + void *GetValPtr(int n) override; + void *GetValPtrEx(int n) override; + int Find(PVAL vp) override; + int GetMaxLength(void) override; protected: // Specialized functions @@ -229,38 +229,38 @@ CHRBLK(void *mp, int size, int type, int len, int prec, bool b); // Implementation - virtual bool Init(PGLOBAL g, bool check); - virtual int GetVlen(void) {return Long;} - virtual PSZ GetCharValue(int n); - virtual char GetTinyValue(int n); - virtual uchar GetUTinyValue(int n); - virtual short GetShortValue(int n); - virtual ushort GetUShortValue(int n); - virtual int GetIntValue(int n); - virtual uint GetUIntValue(int n); - virtual longlong GetBigintValue(int n); - virtual ulonglong GetUBigintValue(int n); - virtual double GetFloatValue(int n); - virtual char *GetCharString(char *p, int n); - virtual void Reset(int n); - virtual void SetPrec(int p) {Ci = (p != 0);} - virtual bool IsCi(void) {return Ci;} + bool Init(PGLOBAL g, bool check) override; + int GetVlen(void) override {return Long;} + PSZ GetCharValue(int n) override; + char GetTinyValue(int n) override; + uchar GetUTinyValue(int n) override; + short GetShortValue(int n) override; + ushort GetUShortValue(int n) override; + int GetIntValue(int n) override; + uint GetUIntValue(int n) override; + longlong GetBigintValue(int n) override; + ulonglong GetUBigintValue(int n) override; + double GetFloatValue(int n) override; + char *GetCharString(char *p, int n) override; + void Reset(int n) override; + void SetPrec(int p) override {Ci = (p != 0);} + bool IsCi(void) override {return Ci;} // Methods using VALBLK::SetValue; - virtual void SetValue(PCSZ sp, int n); - virtual void SetValue(const char *sp, uint len, int n); - virtual void SetValue(PVAL valp, int n); - virtual void SetValue(PVBLK pv, int n1, int n2); - virtual void SetMin(PVAL valp, int n); - virtual void SetMax(PVAL valp, int n); - virtual void Move(int i, int j); - virtual int CompVal(PVAL vp, int n); - virtual int CompVal(int i1, int i2); - virtual void *GetValPtr(int n); - virtual void *GetValPtrEx(int n); - virtual int Find(PVAL vp); - virtual int GetMaxLength(void); + void SetValue(PCSZ sp, int n) override; + void SetValue(const char *sp, uint len, int n) override; + void SetValue(PVAL valp, int n) override; + void SetValue(PVBLK pv, int n1, int n2) override; + void SetMin(PVAL valp, int n) override; + void SetMax(PVAL valp, int n) override; + void Move(int i, int j) override; + int CompVal(PVAL vp, int n) override; + int CompVal(int i1, int i2) override; + void *GetValPtr(int n) override; + void *GetValPtrEx(int n) override; + int Find(PVAL vp) override; + int GetMaxLength(void) override; protected: // Members @@ -282,39 +282,39 @@ STRBLK(PGLOBAL g, void *mp, int size, int type); // Implementation - virtual void SetNull(int n, bool b) {if (b) {Strp[n] = NULL;}} - virtual bool IsNull(int n) {return Strp[n] == NULL;} - virtual void SetNullable(bool) {} // Always nullable - virtual bool Init(PGLOBAL g, bool check); - virtual int GetVlen(void) {return sizeof(PSZ);} - virtual PSZ GetCharValue(int n) {return Strp[n];} - virtual char GetTinyValue(int n); - virtual uchar GetUTinyValue(int n); - virtual short GetShortValue(int n); - virtual ushort GetUShortValue(int n); - virtual int GetIntValue(int n); - virtual uint GetUIntValue(int n); - virtual longlong GetBigintValue(int n); - virtual ulonglong GetUBigintValue(int n); - virtual double GetFloatValue(int n) {return atof(Strp[n]);} - virtual char *GetCharString(char *, int n) {return Strp[n];} - virtual void Reset(int n) {Strp[n] = NULL;} + void SetNull(int n, bool b) override {if (b) {Strp[n] = NULL;}} + bool IsNull(int n) override {return Strp[n] == NULL;} + void SetNullable(bool) override {} // Always nullable + bool Init(PGLOBAL g, bool check) override; + int GetVlen(void) override {return sizeof(PSZ);} + PSZ GetCharValue(int n) override {return Strp[n];} + char GetTinyValue(int n) override; + uchar GetUTinyValue(int n) override; + short GetShortValue(int n) override; + ushort GetUShortValue(int n) override; + int GetIntValue(int n) override; + uint GetUIntValue(int n) override; + longlong GetBigintValue(int n) override; + ulonglong GetUBigintValue(int n) override; + double GetFloatValue(int n) override {return atof(Strp[n]);} + char *GetCharString(char *, int n) override {return Strp[n];} + void Reset(int n) override {Strp[n] = NULL;} // Methods using VALBLK::SetValue; - virtual void SetValue(PCSZ sp, int n); - virtual void SetValue(const char *sp, uint len, int n); - virtual void SetValue(PVAL valp, int n); - virtual void SetValue(PVBLK pv, int n1, int n2); - virtual void SetMin(PVAL valp, int n); - virtual void SetMax(PVAL valp, int n); - virtual void Move(int i, int j); - virtual int CompVal(PVAL vp, int n); - virtual int CompVal(int i1, int i2); - virtual void *GetValPtr(int n); - virtual void *GetValPtrEx(int n); - virtual int Find(PVAL vp); - virtual int GetMaxLength(void); + void SetValue(PCSZ sp, int n) override; + void SetValue(const char *sp, uint len, int n) override; + void SetValue(PVAL valp, int n) override; + void SetValue(PVBLK pv, int n1, int n2) override; + void SetMin(PVAL valp, int n) override; + void SetMax(PVAL valp, int n) override; + void Move(int i, int j) override; + int CompVal(PVAL vp, int n) override; + int CompVal(int i1, int i2) override; + void *GetValPtr(int n) override; + void *GetValPtrEx(int n) override; + int Find(PVAL vp) override; + int GetMaxLength(void) override; // Specific void SetSorted(bool b) {Sorted = b;} @@ -334,12 +334,12 @@ DATBLK(void *mp, int size); // Implementation - virtual bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); - virtual char *GetCharString(char *p, int n); + bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0) override; + char *GetCharString(char *p, int n) override; // Methods using TYPBLK::SetValue; - virtual void SetValue(PCSZ sp, int n); + void SetValue(PCSZ sp, int n) override; protected: // Members @@ -364,8 +364,8 @@ // Methods using STRBLK::SetValue; using STRBLK::CompVal; - virtual void SetValue(PCSZ p, int n) {Strp[n] = (char*)p;} - virtual int CompVal(int i1, int i2); + void SetValue(PCSZ p, int n) override {Strp[n] = (char*)p;} + int CompVal(int i1, int i2) override; protected: // Members diff -Nru mariadb-10.11.6/storage/connect/value.h mariadb-10.11.9/storage/connect/value.h --- mariadb-10.11.6/storage/connect/value.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/value.h 2024-08-03 07:29:59.000000000 +0000 @@ -123,8 +123,8 @@ virtual bool IsEqual(PVAL vp, bool chktype) = 0; virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); virtual bool FormatValue(PVAL vp, PCSZ fmt) = 0; - virtual void Printf(PGLOBAL g, FILE *, uint); - virtual void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *, uint) override; + void Prints(PGLOBAL g, char *ps, uint z) override; /** Set value from a non-aligned in-memory value in the machine byte order. @@ -194,48 +194,48 @@ TYPVAL(TYPE n, int type, int prec = 0, bool un = false); // Implementation - virtual bool IsTypeNum(void) {return true;} - virtual bool IsZero(void) {return Tval == 0;} - virtual void Reset(void) {Tval = 0;} - virtual int GetValLen(void); - virtual int GetValPrec() {return Prec;} - virtual int GetSize(void) {return sizeof(TYPE);} + bool IsTypeNum(void) override {return true;} + bool IsZero(void) override {return Tval == 0;} + void Reset(void) override {Tval = 0;} + int GetValLen(void) override; + int GetValPrec() override {return Prec;} + int GetSize(void) override {return sizeof(TYPE);} //virtual PSZ GetCharValue(void) {return VALUE::GetCharValue();} - virtual char GetTinyValue(void) {return (char)Tval;} - virtual uchar GetUTinyValue(void) {return (uchar)Tval;} - virtual short GetShortValue(void) {return (short)Tval;} - virtual ushort GetUShortValue(void) {return (ushort)Tval;} - virtual int GetIntValue(void) {return (int)Tval;} - virtual uint GetUIntValue(void) {return (uint)Tval;} - virtual longlong GetBigintValue(void) {return (longlong)Tval;} - virtual ulonglong GetUBigintValue(void) {return (ulonglong)Tval;} - virtual double GetFloatValue(void) {return (double)Tval;} - virtual void *GetTo_Val(void) {return &Tval;} + char GetTinyValue(void) override {return (char)Tval;} + uchar GetUTinyValue(void) override {return (uchar)Tval;} + short GetShortValue(void) override {return (short)Tval;} + ushort GetUShortValue(void) override {return (ushort)Tval;} + int GetIntValue(void) override {return (int)Tval;} + uint GetUIntValue(void) override {return (uint)Tval;} + longlong GetBigintValue(void) override {return (longlong)Tval;} + ulonglong GetUBigintValue(void) override {return (ulonglong)Tval;} + double GetFloatValue(void) override {return (double)Tval;} + void *GetTo_Val(void) override {return &Tval;} // Methods - virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(const char *p, int n); - virtual void SetValue_psz(PCSZ s); - virtual void SetValue_bool(bool b) {Tval = (b) ? 1 : 0;} - virtual int CompareValue(PVAL vp); - virtual void SetValue(char c) {Tval = (TYPE)c; Null = false;} - virtual void SetValue(uchar c) {Tval = (TYPE)c; Null = false;} - virtual void SetValue(short i) {Tval = (TYPE)i; Null = false;} - virtual void SetValue(ushort i) {Tval = (TYPE)i; Null = false;} - virtual void SetValue(int n) {Tval = (TYPE)n; Null = false;} - virtual void SetValue(uint n) {Tval = (TYPE)n; Null = false;} - virtual void SetValue(longlong n) {Tval = (TYPE)n; Null = false;} - virtual void SetValue(ulonglong n) {Tval = (TYPE)n; Null = false;} - virtual void SetValue(double f) {Tval = (TYPE)f; Null = false;} - virtual void SetValue_pvblk(PVBLK blk, int n); - virtual void SetBinValue(void *p); - virtual bool GetBinValue(void *buf, int buflen, bool go); - virtual int ShowValue(char *buf, int len); - virtual char *GetCharString(char *p); - virtual bool IsEqual(PVAL vp, bool chktype); - virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); - virtual bool SetConstFormat(PGLOBAL, FORMAT&); - virtual bool FormatValue(PVAL vp, PCSZ fmt); + bool SetValue_pval(PVAL valp, bool chktype) override; + bool SetValue_char(const char *p, int n) override; + void SetValue_psz(PCSZ s) override; + void SetValue_bool(bool b) override {Tval = (b) ? 1 : 0;} + int CompareValue(PVAL vp) override; + void SetValue(char c) override {Tval = (TYPE)c; Null = false;} + void SetValue(uchar c) override {Tval = (TYPE)c; Null = false;} + void SetValue(short i) override {Tval = (TYPE)i; Null = false;} + void SetValue(ushort i) override {Tval = (TYPE)i; Null = false;} + void SetValue(int n) override {Tval = (TYPE)n; Null = false;} + void SetValue(uint n) override {Tval = (TYPE)n; Null = false;} + void SetValue(longlong n) override {Tval = (TYPE)n; Null = false;} + void SetValue(ulonglong n) override {Tval = (TYPE)n; Null = false;} + void SetValue(double f) override {Tval = (TYPE)f; Null = false;} + void SetValue_pvblk(PVBLK blk, int n) override; + void SetBinValue(void *p) override; + bool GetBinValue(void *buf, int buflen, bool go) override; + int ShowValue(char *buf, int len) override; + char *GetCharString(char *p) override; + bool IsEqual(PVAL vp, bool chktype) override; + bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) override; + bool SetConstFormat(PGLOBAL, FORMAT&) override; + bool FormatValue(PVAL vp, PCSZ fmt) override; protected: static TYPE MinMaxVal(bool b); @@ -268,49 +268,49 @@ TYPVAL(PGLOBAL g, PSZ s, int n, int c); // Implementation - virtual bool IsTypeNum(void) {return false;} - virtual bool IsZero(void) {return *Strp == 0;} - virtual void Reset(void) {*Strp = 0;} - virtual int GetValLen(void) {return Len;}; - virtual int GetValPrec() {return (Ci) ? 1 : 0;} - virtual int GetSize(void) {return (Strp) ? (int)strlen(Strp) : 0;} - virtual PSZ GetCharValue(void) {return Strp;} - virtual char GetTinyValue(void); - virtual uchar GetUTinyValue(void); - virtual short GetShortValue(void); - virtual ushort GetUShortValue(void); - virtual int GetIntValue(void); - virtual uint GetUIntValue(void); - virtual longlong GetBigintValue(void); - virtual ulonglong GetUBigintValue(void); - virtual double GetFloatValue(void) {return atof(Strp);} - virtual void *GetTo_Val(void) {return Strp;} - virtual void SetPrec(int prec) {Ci = prec != 0;} + bool IsTypeNum(void) override {return false;} + bool IsZero(void) override {return *Strp == 0;} + void Reset(void) override {*Strp = 0;} + int GetValLen(void) override {return Len;}; + int GetValPrec() override {return (Ci) ? 1 : 0;} + int GetSize(void) override {return (Strp) ? (int)strlen(Strp) : 0;} + PSZ GetCharValue(void) override {return Strp;} + char GetTinyValue(void) override; + uchar GetUTinyValue(void) override; + short GetShortValue(void) override; + ushort GetUShortValue(void) override; + int GetIntValue(void) override; + uint GetUIntValue(void) override; + longlong GetBigintValue(void) override; + ulonglong GetUBigintValue(void) override; + double GetFloatValue(void) override {return atof(Strp);} + void *GetTo_Val(void) override {return Strp;} + void SetPrec(int prec) override {Ci = prec != 0;} // Methods - virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(const char *p, int n); - virtual void SetValue_psz(PCSZ s); - virtual void SetValue_pvblk(PVBLK blk, int n); - virtual void SetValue(char c); - virtual void SetValue(uchar c); - virtual void SetValue(short i); - virtual void SetValue(ushort i); - virtual void SetValue(int n); - virtual void SetValue(uint n); - virtual void SetValue(longlong n); - virtual void SetValue(ulonglong n); - virtual void SetValue(double f); - virtual void SetBinValue(void *p); - virtual int CompareValue(PVAL vp); - virtual bool GetBinValue(void *buf, int buflen, bool go); - virtual int ShowValue(char *buf, int len); - virtual char *GetCharString(char *p); - virtual bool IsEqual(PVAL vp, bool chktype); - virtual bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op); - virtual bool FormatValue(PVAL vp, PCSZ fmt); - virtual bool SetConstFormat(PGLOBAL, FORMAT&); - virtual void Prints(PGLOBAL g, char *ps, uint z); + bool SetValue_pval(PVAL valp, bool chktype) override; + bool SetValue_char(const char *p, int n) override; + void SetValue_psz(PCSZ s) override; + void SetValue_pvblk(PVBLK blk, int n) override; + void SetValue(char c) override; + void SetValue(uchar c) override; + void SetValue(short i) override; + void SetValue(ushort i) override; + void SetValue(int n) override; + void SetValue(uint n) override; + void SetValue(longlong n) override; + void SetValue(ulonglong n) override; + void SetValue(double f) override; + void SetBinValue(void *p) override; + int CompareValue(PVAL vp) override; + bool GetBinValue(void *buf, int buflen, bool go) override; + int ShowValue(char *buf, int len) override; + char *GetCharString(char *p) override; + bool IsEqual(PVAL vp, bool chktype) override; + bool Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) override; + bool FormatValue(PVAL vp, PCSZ fmt) override; + bool SetConstFormat(PGLOBAL, FORMAT&) override; + void Prints(PGLOBAL g, char *ps, uint z) override; protected: // Members @@ -329,16 +329,16 @@ DECVAL(PGLOBAL g, PSZ s, int n, int prec, bool uns); // Implementation - virtual bool IsTypeNum(void) {return true;} - virtual bool IsZero(void); - virtual void Reset(void); - virtual int GetValPrec() {return Prec;} + bool IsTypeNum(void) override {return true;} + bool IsZero(void) override; + void Reset(void) override; + int GetValPrec() override {return Prec;} // Methods - virtual bool GetBinValue(void *buf, int buflen, bool go); - virtual int ShowValue(char *buf, int len); - virtual bool IsEqual(PVAL vp, bool chktype); - virtual int CompareValue(PVAL vp); + bool GetBinValue(void *buf, int buflen, bool go) override; + int ShowValue(char *buf, int len) override; + bool IsEqual(PVAL vp, bool chktype) override; + int CompareValue(PVAL vp) override; protected: // Members @@ -355,47 +355,47 @@ BINVAL(PGLOBAL g, void *p, int cl, int n); // Implementation - virtual bool IsTypeNum(void) {return false;} - virtual bool IsZero(void); - virtual void Reset(void); - virtual int GetValLen(void) {return Clen;}; - virtual int GetValPrec() {return 0;} - virtual int GetSize(void) {return Len;} - virtual PSZ GetCharValue(void) {return (PSZ)Binp;} - virtual char GetTinyValue(void); - virtual uchar GetUTinyValue(void); - virtual short GetShortValue(void); - virtual ushort GetUShortValue(void); - virtual int GetIntValue(void); - virtual uint GetUIntValue(void); - virtual longlong GetBigintValue(void); - virtual ulonglong GetUBigintValue(void); - virtual double GetFloatValue(void); - virtual void *GetTo_Val(void) {return Binp;} + bool IsTypeNum(void) override {return false;} + bool IsZero(void) override; + void Reset(void) override; + int GetValLen(void) override {return Clen;}; + int GetValPrec() override {return 0;} + int GetSize(void) override {return Len;} + PSZ GetCharValue(void) override {return (PSZ)Binp;} + char GetTinyValue(void) override; + uchar GetUTinyValue(void) override; + short GetShortValue(void) override; + ushort GetUShortValue(void) override; + int GetIntValue(void) override; + uint GetUIntValue(void) override; + longlong GetBigintValue(void) override; + ulonglong GetUBigintValue(void) override; + double GetFloatValue(void) override; + void *GetTo_Val(void) override {return Binp;} // Methods - virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(const char *p, int n); - virtual void SetValue_psz(PCSZ s); - virtual void SetValue_pvblk(PVBLK blk, int n); - virtual void SetValue(char c); - virtual void SetValue(uchar c); - virtual void SetValue(short i); - virtual void SetValue(ushort i); - virtual void SetValue(int n); - virtual void SetValue(uint n); - virtual void SetValue(longlong n); - virtual void SetValue(ulonglong n); - virtual void SetValue(double f); - virtual void SetBinValue(void *p); + bool SetValue_pval(PVAL valp, bool chktype) override; + bool SetValue_char(const char *p, int n) override; + void SetValue_psz(PCSZ s) override; + void SetValue_pvblk(PVBLK blk, int n) override; + void SetValue(char c) override; + void SetValue(uchar c) override; + void SetValue(short i) override; + void SetValue(ushort i) override; + void SetValue(int n) override; + void SetValue(uint n) override; + void SetValue(longlong n) override; + void SetValue(ulonglong n) override; + void SetValue(double f) override; + void SetBinValue(void *p) override; virtual void SetBinValue(void* p, ulong len); - virtual bool GetBinValue(void *buf, int buflen, bool go); - virtual int CompareValue(PVAL) {assert(false); return 0;} - virtual int ShowValue(char *buf, int len); - virtual char *GetCharString(char *p); - virtual bool IsEqual(PVAL vp, bool chktype); - virtual bool FormatValue(PVAL vp, PCSZ fmt); - virtual bool SetConstFormat(PGLOBAL, FORMAT&); + bool GetBinValue(void *buf, int buflen, bool go) override; + int CompareValue(PVAL) override {assert(false); return 0;} + int ShowValue(char *buf, int len) override; + char *GetCharString(char *p) override; + bool IsEqual(PVAL vp, bool chktype) override; + bool FormatValue(PVAL vp, PCSZ fmt) override; + bool SetConstFormat(PGLOBAL, FORMAT&) override; protected: // Members @@ -415,15 +415,15 @@ using TYPVAL::SetValue; // Implementation - virtual bool SetValue_pval(PVAL valp, bool chktype); - virtual bool SetValue_char(const char *p, int n); - virtual void SetValue_psz(PCSZ s); - virtual void SetValue_pvblk(PVBLK blk, int n); - virtual void SetValue(int n); - virtual PSZ GetCharValue(void) { return Sdate; } - virtual char *GetCharString(char *p); - virtual int ShowValue(char *buf, int len); - virtual bool FormatValue(PVAL vp, PCSZ fmt); + bool SetValue_pval(PVAL valp, bool chktype) override; + bool SetValue_char(const char *p, int n) override; + void SetValue_psz(PCSZ s) override; + void SetValue_pvblk(PVBLK blk, int n) override; + void SetValue(int n) override; + PSZ GetCharValue(void) override { return Sdate; } + char *GetCharString(char *p) override; + int ShowValue(char *buf, int len) override; + bool FormatValue(PVAL vp, PCSZ fmt) override; bool SetFormat(PGLOBAL g, PCSZ fmt, int len, int year = 0); bool SetFormat(PGLOBAL g, PVAL valp); bool IsFormatted(void) {return Pdtp != NULL;} diff -Nru mariadb-10.11.6/storage/connect/xindex.h mariadb-10.11.9/storage/connect/xindex.h --- mariadb-10.11.6/storage/connect/xindex.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/xindex.h 2024-08-03 07:29:59.000000000 +0000 @@ -200,8 +200,8 @@ void FreeIndex(void) {PlgDBfree(Index);} // Methods - virtual void Printf(PGLOBAL g, FILE *f, uint n); - virtual void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n) override; + void Prints(PGLOBAL g, char *ps, uint z) override; virtual bool Init(PGLOBAL g) = 0; virtual bool Make(PGLOBAL g, PIXDEF sxp) = 0; #if defined(XMAP) @@ -214,7 +214,7 @@ virtual int FastFind(void) = 0; virtual bool Reorder(PGLOBAL) {return true;} virtual int Range(PGLOBAL, int = 0, bool = true) {return -1;} // Means error - virtual int Qcompare(int *, int *) = 0; + int Qcompare(int *, int *) override = 0; virtual int GroupSize(void) {return 1;} virtual void Close(void) = 0; @@ -254,32 +254,32 @@ PCOL *cp, PXOB *xp = NULL, int k = 0); // Implementation - virtual IDT GetType(void) {return TYPE_IDX_INDX;} - virtual bool IsMul(void) {return (Nval < Nk) ? true : Mul;} + IDT GetType(void) override {return TYPE_IDX_INDX;} + bool IsMul(void) override {return (Nval < Nk) ? true : Mul;} //virtual bool HaveSame(void) {return Op == OP_SAME;} - virtual int GetCurPos(void) {return (Pex) ? Pex[Cur_K] : Cur_K;} - virtual void SetNval(int n) {Nval = n;} + int GetCurPos(void) override {return (Pex) ? Pex[Cur_K] : Cur_K;} + void SetNval(int n) override {Nval = n;} int GetMaxSame(void) {return MaxSame;} // Methods - virtual void Reset(void); - virtual bool Init(PGLOBAL g); + void Reset(void) override; + bool Init(PGLOBAL g) override; #if defined(XMAP) - virtual bool MapInit(PGLOBAL g); + bool MapInit(PGLOBAL g) override; #endif // XMAP - virtual int Qcompare(int *, int *); - virtual int Fetch(PGLOBAL g); - virtual int FastFind(void); - virtual int GroupSize(void); - virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); - virtual int MaxRange(void) {return MaxSame;} + int Qcompare(int *, int *) override; + int Fetch(PGLOBAL g) override; + int FastFind(void) override; + int GroupSize(void) override; + int Range(PGLOBAL g, int limit = 0, bool incl = true) override; + int MaxRange(void) override {return MaxSame;} virtual int ColMaxSame(PXCOL kp); - virtual void Close(void); - virtual bool NextVal(bool eq); - virtual bool PrevVal(void); - virtual bool Make(PGLOBAL g, PIXDEF sxp); + void Close(void) override; + bool NextVal(bool eq) override; + bool PrevVal(void) override; + bool Make(PGLOBAL g, PIXDEF sxp) override; virtual bool SaveIndex(PGLOBAL g, PIXDEF sxp); - virtual bool Reorder(PGLOBAL g); + bool Reorder(PGLOBAL g) override; bool GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk); protected: @@ -310,16 +310,16 @@ XINDXS(PTDBDOS tdbp, PIXDEF xdp, PXLOAD pxp, PCOL *cp, PXOB *xp = NULL); // Implementation - virtual void SetNval(int n) {assert(n == 1);} + void SetNval(int n) override {assert(n == 1);} // Methods - virtual int Qcompare(int *, int *); - virtual int Fetch(PGLOBAL g); - virtual int FastFind(void); - virtual bool NextVal(bool eq); - virtual bool PrevVal(void); - virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); - virtual int GroupSize(void); + int Qcompare(int *, int *) override; + int Fetch(PGLOBAL g) override; + int FastFind(void) override; + bool NextVal(bool eq) override; + bool PrevVal(void) override; + int Range(PGLOBAL g, int limit = 0, bool incl = true) override; + int GroupSize(void) override; protected: // Members @@ -367,14 +367,14 @@ XFILE(void); // Methods - virtual bool Open(PGLOBAL g, char *filename, int id, MODE mode); - virtual bool Seek(PGLOBAL g, int low, int high, int origin); - virtual bool Read(PGLOBAL g, void *buf, int n, int size); - virtual int Write(PGLOBAL g, void *buf, int n, int size, bool& rc); - virtual void Close(char *fn, int id); - virtual void Close(void); + bool Open(PGLOBAL g, char *filename, int id, MODE mode) override; + bool Seek(PGLOBAL g, int low, int high, int origin) override; + bool Read(PGLOBAL g, void *buf, int n, int size) override; + int Write(PGLOBAL g, void *buf, int n, int size, bool& rc) override; + void Close(char *fn, int id) override; + void Close(void) override; #if defined(XMAP) - virtual void *FileView(PGLOBAL g, char *fn); + void *FileView(PGLOBAL g, char *fn) override; #endif // XMAP protected: @@ -395,13 +395,13 @@ // Methods using XLOAD::Close; - virtual bool Open(PGLOBAL g, char *filename, int id, MODE mode); - virtual bool Seek(PGLOBAL g, int low, int high, int origin); - virtual bool Read(PGLOBAL g, void *buf, int n, int size); - virtual int Write(PGLOBAL g, void *buf, int n, int size, bool& rc); - virtual void Close(char *fn, int id); + bool Open(PGLOBAL g, char *filename, int id, MODE mode) override; + bool Seek(PGLOBAL g, int low, int high, int origin) override; + bool Read(PGLOBAL g, void *buf, int n, int size) override; + int Write(PGLOBAL g, void *buf, int n, int size, bool& rc) override; + void Close(char *fn, int id) override; #if defined(XMAP) - virtual void *FileView(PGLOBAL g, char *fn); + void *FileView(PGLOBAL g, char *fn) override; #endif // XMAP protected: @@ -418,21 +418,21 @@ XXROW(PTDBDOS tbxp); // Implementation - virtual IDT GetType(void) {return TYPE_IDX_XROW;} - virtual void Reset(void); + IDT GetType(void) override {return TYPE_IDX_XROW;} + void Reset(void) override; // Methods - virtual bool Init(PGLOBAL g); + bool Init(PGLOBAL g) override; #if defined(XMAP) - virtual bool MapInit(PGLOBAL) {return true;} + bool MapInit(PGLOBAL) override {return true;} #endif // XMAP - virtual int Fetch(PGLOBAL g); - virtual int FastFind(void); - virtual int MaxRange(void) {return 1;} - virtual int Range(PGLOBAL g, int limit = 0, bool incl = true); - virtual int Qcompare(int *, int *) {assert(false); return 0;} - virtual bool Make(PGLOBAL, PIXDEF) {return false;} - virtual void Close(void) {} + int Fetch(PGLOBAL g) override; + int FastFind(void) override; + int MaxRange(void) override {return 1;} + int Range(PGLOBAL g, int limit = 0, bool incl = true) override; + int Qcompare(int *, int *) override {assert(false); return 0;} + bool Make(PGLOBAL, PIXDEF) override {return false;} + void Close(void) override {} protected: // Members diff -Nru mariadb-10.11.6/storage/connect/xobject.h mariadb-10.11.9/storage/connect/xobject.h --- mariadb-10.11.6/storage/connect/xobject.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/xobject.h 2024-08-03 07:29:59.000000000 +0000 @@ -75,17 +75,17 @@ XVOID(void) {Constant = true;} // Implementation - virtual int GetType(void) {return TYPE_VOID;} - virtual int GetLength(void) {return 0;} - virtual int GetLengthEx(void) {return 0;} - virtual PSZ GetCharValue(void) {return NULL;} - virtual int GetIntValue(void) {return 0;} - virtual double GetFloatValue(void) {return 0.0;} - virtual int GetScale() {return 0;} + int GetType(void) override {return TYPE_VOID;} + int GetLength(void) override {return 0;} + int GetLengthEx(void) override {return 0;} + PSZ GetCharValue(void) override {return NULL;} + int GetIntValue(void) override {return 0;} + double GetFloatValue(void) override {return 0.0;} + int GetScale() override {return 0;} // Methods - virtual bool Compare(PXOB xp) {return xp->GetType() == TYPE_VOID;} - virtual bool SetFormat(PGLOBAL, FORMAT&) {return true;} + bool Compare(PXOB xp) override {return xp->GetType() == TYPE_VOID;} + bool SetFormat(PGLOBAL, FORMAT&) override {return true;} }; // end of class XVOID @@ -100,20 +100,20 @@ CONSTANT(PVAL valp) {Value = valp; Constant = true;} // Implementation - virtual int GetType(void) {return TYPE_CONST;} - virtual int GetResultType(void) {return Value->Type;} - virtual int GetLength(void) {return Value->GetValLen();} - virtual int GetScale() {return Value->GetValPrec();} - virtual int GetLengthEx(void); + int GetType(void) override {return TYPE_CONST;} + int GetResultType(void) override {return Value->Type;} + int GetLength(void) override {return Value->GetValLen();} + int GetScale() override {return Value->GetValPrec();} + int GetLengthEx(void) override; // Methods - virtual bool Compare(PXOB xp); - virtual bool SetFormat(PGLOBAL g, FORMAT& fmt) + bool Compare(PXOB xp) override; + bool SetFormat(PGLOBAL g, FORMAT& fmt) override {return Value->SetConstFormat(g, fmt);} void Convert(PGLOBAL g, int newtype); void SetValue(PVAL vp) {Value = vp;} - virtual void Printf(PGLOBAL g, FILE *, uint); - virtual void Prints(PGLOBAL g, char *, uint); + void Printf(PGLOBAL g, FILE *, uint) override; + void Prints(PGLOBAL g, char *, uint) override; }; // end of class CONSTANT /***********************************************************************/ diff -Nru mariadb-10.11.6/storage/connect/xtable.h mariadb-10.11.9/storage/connect/xtable.h --- mariadb-10.11.6/storage/connect/xtable.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/xtable.h 2024-08-03 07:29:59.000000000 +0000 @@ -109,8 +109,8 @@ virtual PTDB Copy(PTABS t); virtual void PrintAM(FILE *f, char *m) {fprintf(f, "%s AM(%d)\n", m, GetAmType());} - virtual void Printf(PGLOBAL g, FILE *f, uint n); - virtual void Prints(PGLOBAL g, char *ps, uint z); + void Printf(PGLOBAL g, FILE *f, uint n) override; + void Prints(PGLOBAL g, char *ps, uint z) override; virtual PCSZ GetServer(void) = 0; virtual int GetBadLines(void) {return 0;} virtual CHARSET_INFO *data_charset(void); @@ -173,7 +173,7 @@ inline void SetKindex(PKXBASE kxp) {To_Kindex = kxp;} // Properties - PKXBASE GetKindex(void) {return To_Kindex;} + PKXBASE GetKindex(void) override {return To_Kindex;} PXOB *GetLink(void) {return To_Link;} PIXDEF GetXdp(void) {return To_Xdp;} void ResetKindex(PGLOBAL g, PKXBASE kxp); @@ -182,17 +182,17 @@ // Methods virtual bool IsUsingTemp(PGLOBAL) {return false;} - virtual PCATLG GetCat(void); - virtual void PrintAM(FILE *f, char *m); - virtual int GetProgMax(PGLOBAL g) {return GetMaxSize(g);} + PCATLG GetCat(void) override; + void PrintAM(FILE *f, char *m) override; + int GetProgMax(PGLOBAL g) override {return GetMaxSize(g);} virtual void RestoreNrec(void) {} virtual int ResetTableOpt(PGLOBAL g, bool dop, bool dox); - virtual PCSZ GetServer(void) {return "Current";} + PCSZ GetServer(void) override {return "Current";} // Database routines virtual int MakeIndex(PGLOBAL g, PIXDEF, bool) {strcpy(g->Message, "Remote index"); return RC_INFO;} - virtual bool ReadKey(PGLOBAL, OPVAL, const key_range *) + bool ReadKey(PGLOBAL, OPVAL, const key_range *) override {assert(false); return true;} protected: @@ -218,23 +218,23 @@ TDBCAT(PTABDEF tdp); // Implementation - virtual AMT GetAmType(void) {return TYPE_AM_CAT;} + AMT GetAmType(void) override {return TYPE_AM_CAT;} // Methods - virtual int GetRecpos(void) {return N;} - virtual int GetProgCur(void) {return N;} - virtual int RowNumber(PGLOBAL, bool = false) {return N + 1;} - virtual bool SetRecpos(PGLOBAL g, int recpos); + int GetRecpos(void) override {return N;} + int GetProgCur(void) override {return N;} + int RowNumber(PGLOBAL, bool = false) override {return N + 1;} + bool SetRecpos(PGLOBAL g, int recpos) override; // Database routines - virtual PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n); - virtual int Cardinality(PGLOBAL) {return 10;} // To avoid assert - virtual int GetMaxSize(PGLOBAL g); - virtual bool OpenDB(PGLOBAL g); - virtual int ReadDB(PGLOBAL g); - virtual int WriteDB(PGLOBAL g); - virtual int DeleteDB(PGLOBAL g, int irc); - virtual void CloseDB(PGLOBAL g); + PCOL MakeCol(PGLOBAL g, PCOLDEF cdp, PCOL cprec, int n) override; + int Cardinality(PGLOBAL) override {return 10;} // To avoid assert + int GetMaxSize(PGLOBAL g) override; + bool OpenDB(PGLOBAL g) override; + int ReadDB(PGLOBAL g) override; + int WriteDB(PGLOBAL g) override; + int DeleteDB(PGLOBAL g, int irc) override; + void CloseDB(PGLOBAL g) override; protected: // Specific routines @@ -258,10 +258,10 @@ CATCOL(PCOLDEF cdp, PTDB tdbp, int n); // Implementation - virtual int GetAmType(void) {return TYPE_AM_ODBC;} + int GetAmType(void) override {return TYPE_AM_ODBC;} // Methods - virtual void ReadColumn(PGLOBAL g); + void ReadColumn(PGLOBAL g) override; protected: CATCOL(void) = default; // Default constructor not to be used diff -Nru mariadb-10.11.6/storage/connect/zip.c mariadb-10.11.9/storage/connect/zip.c --- mariadb-10.11.6/storage/connect/zip.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/zip.c 2024-08-03 07:29:59.000000000 +0000 @@ -14,8 +14,8 @@ Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions. Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data - It is used when recreting zip archive with RAW when deleting items from a zip. - ZIP64 data is automaticly added to items that needs it, and existing ZIP64 data need to be removed. + It is used when recreating zip archive with RAW when deleting items from a zip. + ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed. Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required) Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer @@ -25,15 +25,13 @@ #include #include #include +#include #include #include "zlib.h" #include "zip.h" -#include "my_attribute.h" #ifdef STDC # include -# include -# include #endif #ifdef NO_ERRNO_H extern int errno; @@ -48,7 +46,7 @@ /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef VERSIONMADEBY -# define VERSIONMADEBY (0x0) /* platform depedent */ +# define VERSIONMADEBY (0x0) /* platform dependent */ #endif #ifndef Z_BUFSIZE @@ -62,9 +60,6 @@ #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif /* #define SIZECENTRALDIRITEM (0x2e) @@ -117,7 +112,7 @@ struct linkedlist_datablock_internal_s* next_datablock; uLong avail_in_this_block; uLong filled_in_this_block; - uLong unused; /* for future use and alignement */ + uLong unused; /* for future use and alignment */ unsigned char data[SIZEDATA_INDATABLOCK]; } linkedlist_datablock_internal; @@ -139,40 +134,40 @@ uInt pos_in_buffered_data; /* last written byte in buffered_data */ ZPOS64_T pos_local_header; /* offset of the local header of the file - currenty writing */ + currently writing */ char* central_header; /* central header data for the current file */ uLong size_centralExtra; uLong size_centralheader; /* size of the central header for cur file */ uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */ uLong flag; /* flag of the file currently writing */ - int method; /* compression method of file currenty wr.*/ + int method; /* compression method of file currently wr.*/ int raw; /* 1 for directly writing raw data */ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ uLong dosDate; uLong crc32; int encrypt; - int zip64; /* Add ZIP64 extened information in the extra field */ + int zip64; /* Add ZIP64 extended information in the extra field */ ZPOS64_T pos_zip64extrainfo; ZPOS64_T totalCompressedData; ZPOS64_T totalUncompressedData; #ifndef NOCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const z_crc_t* pcrc_32_tab; - int crypt_header_size; + unsigned crypt_header_size; #endif } curfile64_info; typedef struct { zlib_filefunc64_32_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ + voidpf filestream; /* io structure of the zipfile */ linkedlist_data central_dir;/* datablock with central dir in construction*/ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ - curfile64_info ci; /* info on the file curretly writing */ + curfile64_info ci; /* info on the file currently writing */ ZPOS64_T begin_pos; /* position of the beginning of the zipfile */ - ZPOS64_T add_position_when_writting_offset; + ZPOS64_T add_position_when_writing_offset; ZPOS64_T number_entry; #ifndef NO_ADDFILEINEXISTINGZIP @@ -187,8 +182,7 @@ #include "crypt.h" #endif -local linkedlist_datablock_internal* allocate_new_datablock() -{ +local linkedlist_datablock_internal* allocate_new_datablock(void) { linkedlist_datablock_internal* ldi; ldi = (linkedlist_datablock_internal*) ALLOC(sizeof(linkedlist_datablock_internal)); @@ -201,30 +195,26 @@ return ldi; } -local void free_datablock(linkedlist_datablock_internal* ldi) -{ +local void free_datablock(linkedlist_datablock_internal* ldi) { while (ldi!=NULL) { linkedlist_datablock_internal* ldinext = ldi->next_datablock; - TRYFREE(ldi); + free(ldi); ldi = ldinext; } } -local void init_linkedlist(linkedlist_data* ll) -{ +local void init_linkedlist(linkedlist_data* ll) { ll->first_block = ll->last_block = NULL; } -local void free_linkedlist(linkedlist_data* ll) -{ +local void free_linkedlist(linkedlist_data* ll) { free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL; } -local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) -{ +local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len) { linkedlist_datablock_internal* ldi; const unsigned char* from_copy; @@ -239,7 +229,7 @@ } ldi = ll->last_block; - from_copy = (unsigned char*)buf; + from_copy = (const unsigned char*)buf; while (len>0) { @@ -284,9 +274,7 @@ nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T) */ -local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)); -local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) -{ +local int zip64local_putValue(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte) { unsigned char buf[8]; int n; for (n = 0; n < nbByte; n++) @@ -302,15 +290,13 @@ } } - if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) + if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,(uLong)nbByte)!=(uLong)nbByte) return ZIP_ERRNO; else return ZIP_OK; } -local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte)); -local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) -{ +local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte) { unsigned char* buf=(unsigned char*)dest; int n; for (n = 0; n < nbByte; n++) { @@ -330,25 +316,21 @@ /****************************************************************************/ -local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) -{ +local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm) { uLong year = (uLong)ptm->tm_year; if (year>=1980) year-=1980; else if (year>=80) year-=80; return - (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | - ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); + (uLong) (((uLong)(ptm->tm_mday) + (32 * (uLong)(ptm->tm_mon+1)) + (512 * year)) << 16) | + (((uLong)ptm->tm_sec/2) + (32 * (uLong)ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); } /****************************************************************************/ -local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)); - -local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi) -{ +local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int* pi) { unsigned char c; int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1); if (err==1) @@ -369,10 +351,7 @@ /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ -local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); - -local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ +local int zip64local_getShort(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) { uLong x ; int i = 0; int err; @@ -391,10 +370,7 @@ return err; } -local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); - -local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) -{ +local int zip64local_getLong(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX) { uLong x ; int i = 0; int err; @@ -421,11 +397,8 @@ return err; } -local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)); - -local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) -{ +local int zip64local_getLong64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX) { ZPOS64_T x; int i = 0; int err; @@ -476,10 +449,7 @@ Locate the Central directory of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); - -local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; @@ -519,18 +489,18 @@ if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; - for (i=(int)uReadSize-3; (i--)>0;) { + for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } - } + if (uPosFound!=0) break; } - TRYFREE(buf); + free(buf); return uPosFound; } @@ -538,10 +508,7 @@ Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before the global comment) */ -local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)); - -local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) -{ +local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; ZPOS64_T uSizeFile; ZPOS64_T uBackRead; @@ -587,7 +554,7 @@ // Signature "0x07064b50" Zip64 end of central directory locater if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07)) { - uPosFound = uReadPos+i; + uPosFound = uReadPos+(unsigned)i; break; } } @@ -596,7 +563,7 @@ break; } - TRYFREE(buf); + free(buf); if (uPosFound == 0) return 0; @@ -608,7 +575,7 @@ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; - /* number of the disk with the start of the zip64 end of central directory */ + /* number of the disk with the start of the zip64 end of central directory */ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK) return 0; if (uL != 0) @@ -638,8 +605,7 @@ return relativeOffset; } -static int LoadCentralDirectoryRecord(zip64_internal* pziinit) -{ +local int LoadCentralDirectoryRecord(zip64_internal* pziinit) { int err=ZIP_OK; ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ @@ -648,10 +614,10 @@ ZPOS64_T central_pos; uLong uL; - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ + uLong number_disk; /* number of the current disk, used for + spanning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number of the disk with central dir, used + for spanning ZIP, unsupported, always 0*/ ZPOS64_T number_entry; ZPOS64_T number_entry_CD; /* total number of entries in the central dir @@ -808,7 +774,7 @@ } byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); - pziinit->add_position_when_writting_offset = byte_before_the_zipfile; + pziinit->add_position_when_writing_offset = byte_before_the_zipfile; { ZPOS64_T size_central_dir_to_read = size_central_dir; @@ -831,7 +797,7 @@ size_central_dir_to_read-=read_this; } - TRYFREE(buf_read); + free(buf_read); } pziinit->begin_pos = byte_before_the_zipfile; pziinit->number_entry = number_entry_CD; @@ -847,79 +813,72 @@ /************************************************************/ -static zipFile zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) -{ - zip64_internal ziinit; +extern zipFile ZEXPORT zipOpen3(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def) { zip64_internal* zi; int err=ZIP_OK; - ziinit.z_filefunc.zseek32_file = NULL; - ziinit.z_filefunc.ztell32_file = NULL; + if (!(zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)))) + return NULL; + + zi->z_filefunc.zseek32_file = NULL; + zi->z_filefunc.ztell32_file = NULL; if (pzlib_filefunc64_32_def==NULL) - fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64); + fill_fopen64_filefunc(&zi->z_filefunc.zfile_func64); else - ziinit.z_filefunc = *pzlib_filefunc64_32_def; + zi->z_filefunc = *pzlib_filefunc64_32_def; - ziinit.filestream = ZOPEN64(ziinit.z_filefunc, + zi->filestream = ZOPEN64(zi->z_filefunc, pathname, (append == APPEND_STATUS_CREATE) ? (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); - if (ziinit.filestream == NULL) + if (zi->filestream == NULL) + { + free(zi); return NULL; + } if (append == APPEND_STATUS_CREATEAFTER) - ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END); + ZSEEK64(zi->z_filefunc,zi->filestream,0,SEEK_END); - ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream); - ziinit.in_opened_file_inzip = 0; - ziinit.ci.stream_initialised = 0; - ziinit.number_entry = 0; - ziinit.add_position_when_writting_offset = 0; - init_linkedlist(&(ziinit.central_dir)); - - - - zi = (zip64_internal*)ALLOC(sizeof(zip64_internal)); - if (zi==NULL) - { - ZCLOSE64(ziinit.z_filefunc,ziinit.filestream); - return NULL; - } + zi->begin_pos = ZTELL64(zi->z_filefunc,zi->filestream); + zi->in_opened_file_inzip = 0; + zi->ci.stream_initialised = 0; + zi->number_entry = 0; + zi->add_position_when_writing_offset = 0; + init_linkedlist(&(zi->central_dir)); /* now we add file in a zipfile */ # ifndef NO_ADDFILEINEXISTINGZIP - ziinit.globalcomment = NULL; + zi->globalcomment = NULL; if (append == APPEND_STATUS_ADDINZIP) { // Read and Cache Central Directory Records - err = LoadCentralDirectoryRecord(&ziinit); + err = LoadCentralDirectoryRecord(zi); } if (globalcomment) { - *globalcomment = ziinit.globalcomment; + *globalcomment = zi->globalcomment; } # endif /* !NO_ADDFILEINEXISTINGZIP*/ if (err != ZIP_OK) { # ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(ziinit.globalcomment); + free(zi->globalcomment); # endif /* !NO_ADDFILEINEXISTINGZIP*/ - TRYFREE(zi); + free(zi); return NULL; } else { - *zi = ziinit; return (zipFile)zi; } } -extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) -{ +extern zipFile ZEXPORT zipOpen2(const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def) { if (pzlib_filefunc32_def != NULL) { zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; @@ -930,8 +889,7 @@ return zipOpen3(pathname, append, globalcomment, NULL); } -extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) -{ +extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def) { if (pzlib_filefunc_def != NULL) { zlib_filefunc64_32_def zlib_filefunc64_32_def_fill; @@ -946,18 +904,15 @@ -extern zipFile ZEXPORT zipOpen (const char* pathname, int append) -{ +extern zipFile ZEXPORT zipOpen(const char* pathname, int append) { return zipOpen3((const void*)pathname,append,NULL,NULL); } -extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append) -{ +extern zipFile ZEXPORT zipOpen64(const void* pathname, int append) { return zipOpen3(pathname,append,NULL,NULL); } -static int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) -{ +local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local) { /* write the local header */ int err; uInt size_filename = (uInt)strlen(filename); @@ -1035,8 +990,8 @@ // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file) zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2); - err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)HeaderID,2); + err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)DataSize,2); err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8); err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8); @@ -1053,24 +1008,23 @@ It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize unnecessary allocations. */ -extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting __attribute__((unused)), - uLong versionMadeBy, uLong flagBase, int zip64) -{ +extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase, int zip64) { zip64_internal* zi; uInt size_filename; uInt size_comment; uInt i; int err = ZIP_OK; -#ifdef NOCRYPT +# ifdef NOCRYPT if (password != NULL) return ZIP_PARAMERROR; -#endif +# endif if (file == NULL) return ZIP_PARAMERROR; @@ -1083,6 +1037,17 @@ return ZIP_PARAMERROR; #endif + // The filename and comment length must fit in 16 bits. + if ((filename!=NULL) && (strlen(filename)>0xffff)) + return ZIP_PARAMERROR; + if ((comment!=NULL) && (strlen(comment)>0xffff)) + return ZIP_PARAMERROR; + // The extra field length must fit in 16 bits. If the member also requires + // a Zip64 extra block, that will also need to fit within that 16-bit + // length, but that will be checked for later. + if ((size_extrafield_local>0xffff) || (size_extrafield_global>0xffff)) + return ZIP_PARAMERROR; + zi = (zip64_internal*)file; if (zi->in_opened_file_inzip == 1) @@ -1164,7 +1129,7 @@ if(zi->ci.pos_local_header >= 0xffffffff) zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4); else - zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writting_offset,4); + zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset,4); for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); @@ -1262,35 +1227,33 @@ return err; } -extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, - uLong versionMadeBy, uLong flagBase) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, versionMadeBy, flagBase, 0); +extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting, + uLong versionMadeBy, uLong flagBase) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, versionMadeBy, flagBase, 0); } -extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, - int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, VERSIONMADEBY, 0, 0); +extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, + int windowBits,int memLevel, int strategy, + const char* password, uLong crcForCrypting) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, 0); } extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, @@ -1298,70 +1261,64 @@ const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits,int memLevel, int strategy, - const char* password, uLong crcForCrypting, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - windowBits, memLevel, strategy, - password, crcForCrypting, VERSIONMADEBY, 0, zip64); + const char* password, uLong crcForCrypting, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + windowBits, memLevel, strategy, + password, crcForCrypting, VERSIONMADEBY, 0, zip64); } extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, 0); + const char* comment, int method, int level, int raw) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); } extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void* extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int raw, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, raw, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, zip64); + const void* extrafield_local, uInt size_extrafield_local, + const void* extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int raw, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, raw, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); } -extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void*extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level, int zip64) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, zip64); -} - -extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi, - const void* extrafield_local, uInt size_extrafield_local, - const void*extrafield_global, uInt size_extrafield_global, - const char* comment, int method, int level) -{ - return zipOpenNewFileInZip4_64 (file, filename, zipfi, - extrafield_local, size_extrafield_local, - extrafield_global, size_extrafield_global, - comment, method, level, 0, - -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, - NULL, 0, VERSIONMADEBY, 0, 0); +extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level, int zip64) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, zip64); +} + +extern int ZEXPORT zipOpenNewFileInZip(zipFile file, const char* filename, const zip_fileinfo* zipfi, + const void* extrafield_local, uInt size_extrafield_local, + const void*extrafield_global, uInt size_extrafield_global, + const char* comment, int method, int level) { + return zipOpenNewFileInZip4_64(file, filename, zipfi, + extrafield_local, size_extrafield_local, + extrafield_global, size_extrafield_global, + comment, method, level, 0, + -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, + NULL, 0, VERSIONMADEBY, 0, 0); } -local int zip64FlushWriteBuffer(zip64_internal* zi) -{ +local int zip64FlushWriteBuffer(zip64_internal* zi) { int err=ZIP_OK; if (zi->ci.encrypt != 0) @@ -1399,8 +1356,7 @@ return err; } -extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len) -{ +extern int ZEXPORT zipWriteInFileInZip(zipFile file, const void* buf, unsigned int len) { zip64_internal* zi; int err=ZIP_OK; @@ -1450,7 +1406,7 @@ else #endif { - zi->ci.stream.next_in = (Bytef*)buf; + zi->ci.stream.next_in = (Bytef*)(uintptr_t)buf; zi->ci.stream.avail_in = len; while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) @@ -1501,17 +1457,15 @@ return err; } -extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32) -{ +extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, uLong uncompressed_size, uLong crc32) { return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32); } -extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32) -{ +extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, ZPOS64_T uncompressed_size, uLong crc32) { zip64_internal* zi; ZPOS64_T compressed_size; uLong invalidValue = 0xffffffff; - short datasize = 0; + unsigned datasize = 0; int err=ZIP_OK; if (file == NULL) @@ -1648,7 +1602,7 @@ if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree) { - // we can not write more data to the buffer that we have room for. + // we cannot write more data to the buffer that we have room for. return ZIP_BADZIPFILE; } @@ -1742,15 +1696,13 @@ return err; } -extern int ZEXPORT zipCloseFileInZip (zipFile file) -{ +extern int ZEXPORT zipCloseFileInZip(zipFile file) { return zipCloseFileInZipRaw (file,0,0); } -static int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) -{ +local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip) { int err = ZIP_OK; - ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writting_offset; + ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset; err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4); @@ -1769,8 +1721,7 @@ return err; } -static int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) -{ +local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; uLong Zip64DataSize = 44; @@ -1803,13 +1754,13 @@ if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ { - ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8); } return err; } -static int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) -{ + +local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip) { int err = ZIP_OK; /*signature*/ @@ -1844,20 +1795,19 @@ if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ { - ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; + ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; if(pos >= 0xffffffff) { err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4); } else - err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); + err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset),4); } return err; } -static int Write_GlobalComment(zip64_internal* zi, const char* global_comment) -{ +local int Write_GlobalComment(zip64_internal* zi, const char* global_comment) { int err = ZIP_OK; uInt size_global_comment = 0; @@ -1874,8 +1824,7 @@ return err; } -extern int ZEXPORT zipClose (zipFile file, const char* global_comment) -{ +extern int ZEXPORT zipClose(zipFile file, const char* global_comment) { zip64_internal* zi; int err = 0; uLong size_centraldir = 0; @@ -1916,8 +1865,8 @@ } free_linkedlist(&(zi->central_dir)); - pos = centraldir_pos_inzip - zi->add_position_when_writting_offset; - if(pos >= 0xffffffff || zi->number_entry > 0xFFFF) + pos = centraldir_pos_inzip - zi->add_position_when_writing_offset; + if(pos >= 0xffffffff || zi->number_entry >= 0xFFFF) { ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream); Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip); @@ -1936,15 +1885,14 @@ err = ZIP_ERRNO; #ifndef NO_ADDFILEINEXISTINGZIP - TRYFREE(zi->globalcomment); + free(zi->globalcomment); #endif - TRYFREE(zi); + free(zi); return err; } -extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader) -{ +extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader) { char* p = pData; int size = 0; char* pNewHeader; @@ -1954,10 +1902,10 @@ int retVal = ZIP_OK; - if(pData == NULL || *dataLen < 4) + if(pData == NULL || dataLen == NULL || *dataLen < 4) return ZIP_PARAMERROR; - pNewHeader = (char*)ALLOC(*dataLen); + pNewHeader = (char*)ALLOC((unsigned)*dataLen); pTmp = pNewHeader; while(p < (pData + *dataLen)) @@ -1996,7 +1944,7 @@ else retVal = ZIP_ERRNO; - TRYFREE(pNewHeader); + free(pNewHeader); return retVal; } diff -Nru mariadb-10.11.6/storage/connect/zip.h mariadb-10.11.9/storage/connect/zip.h --- mariadb-10.11.6/storage/connect/zip.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/connect/zip.h 2024-08-03 07:29:59.000000000 +0000 @@ -88,12 +88,12 @@ /* tm_zip contain date/time info */ typedef struct tm_zip_s { - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ + int tm_sec; /* seconds after the minute - [0,59] */ + int tm_min; /* minutes after the hour - [0,59] */ + int tm_hour; /* hours since midnight - [0,23] */ + int tm_mday; /* day of the month - [1,31] */ + int tm_mon; /* months since January - [0,11] */ + int tm_year; /* years - [1980..2044] */ } tm_zip; typedef struct @@ -113,8 +113,8 @@ #define APPEND_STATUS_CREATEAFTER (1) #define APPEND_STATUS_ADDINZIP (2) -extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); -extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append)); +extern zipFile ZEXPORT zipOpen(const char *pathname, int append); +extern zipFile ZEXPORT zipOpen64(const void *pathname, int append); /* Create a zipfile. pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on @@ -131,50 +131,55 @@ /* Note : there is no delete function into a zipfile. If you want delete file into a zipfile, you must open a zipfile, and create another - Of couse, you can use RAW reading and writing to copy the file you did not want delte + Of course, you can use RAW reading and writing to copy the file you did not want delete */ -extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, - int append, - zipcharpc* globalcomment, - zlib_filefunc_def* pzlib_filefunc_def)); +extern zipFile ZEXPORT zipOpen2(const char *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc_def* pzlib_filefunc_def); -extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname, +extern zipFile ZEXPORT zipOpen2_64(const void *pathname, int append, zipcharpc* globalcomment, - zlib_filefunc64_def* pzlib_filefunc_def)); + zlib_filefunc64_def* pzlib_filefunc_def); -extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level)); - -extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int zip64)); +extern zipFile ZEXPORT zipOpen3(const void *pathname, + int append, + zipcharpc* globalcomment, + zlib_filefunc64_32_def* pzlib_filefunc64_32_def); + +extern int ZEXPORT zipOpenNewFileInZip(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level); + +extern int ZEXPORT zipOpenNewFileInZip64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int zip64); /* Open a file in the ZIP for writing. filename : the filename in zip (if NULL, '-' without quote will be used *zipfi contain supplemental information if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local - contains the extrafield data the the local header + contains the extrafield data for the local header if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global - contains the extrafield data the the local header + contains the extrafield data for the global header if comment != NULL, comment contain the comment string method contain the compression method (0 for store, Z_DEFLATED for deflate) level contain the level of compression (can be Z_DEFAULT_COMPRESSION) @@ -184,70 +189,69 @@ */ -extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw)); - - -extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int zip64)); +extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw); + + +extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int zip64); /* Same than zipOpenNewFileInZip, except if raw=1, we write raw file */ -extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting)); - -extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - int zip64 - )); +extern int ZEXPORT zipOpenNewFileInZip3(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting); + +extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + int zip64); /* Same than zipOpenNewFileInZip2, except @@ -256,47 +260,45 @@ crcForCrypting : crc of file to compress (needed for crypting) */ -extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - uLong versionMadeBy, - uLong flagBase - )); - - -extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file, - const char* filename, - const zip_fileinfo* zipfi, - const void* extrafield_local, - uInt size_extrafield_local, - const void* extrafield_global, - uInt size_extrafield_global, - const char* comment, - int method, - int level, - int raw, - int windowBits, - int memLevel, - int strategy, - const char* password, - uLong crcForCrypting, - uLong versionMadeBy, - uLong flagBase, - int zip64 - )); +extern int ZEXPORT zipOpenNewFileInZip4(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase); + + +extern int ZEXPORT zipOpenNewFileInZip4_64(zipFile file, + const char* filename, + const zip_fileinfo* zipfi, + const void* extrafield_local, + uInt size_extrafield_local, + const void* extrafield_global, + uInt size_extrafield_global, + const char* comment, + int method, + int level, + int raw, + int windowBits, + int memLevel, + int strategy, + const char* password, + uLong crcForCrypting, + uLong versionMadeBy, + uLong flagBase, + int zip64); /* Same than zipOpenNewFileInZip4, except versionMadeBy : value for Version made by field @@ -304,25 +306,25 @@ */ -extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, - const void* buf, - unsigned len)); +extern int ZEXPORT zipWriteInFileInZip(zipFile file, + const void* buf, + unsigned len); /* Write data in the zipfile */ -extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); +extern int ZEXPORT zipCloseFileInZip(zipFile file); /* Close the current file in the zipfile */ -extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, - uLong uncompressed_size, - uLong crc32)); - -extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file, - ZPOS64_T uncompressed_size, - uLong crc32)); +extern int ZEXPORT zipCloseFileInZipRaw(zipFile file, + uLong uncompressed_size, + uLong crc32); + +extern int ZEXPORT zipCloseFileInZipRaw64(zipFile file, + ZPOS64_T uncompressed_size, + uLong crc32); /* Close the current file in the zipfile, for file opened with @@ -330,14 +332,14 @@ uncompressed_size and crc32 are value for the uncompressed size */ -extern int ZEXPORT zipClose OF((zipFile file, - const char* global_comment)); +extern int ZEXPORT zipClose(zipFile file, + const char* global_comment); /* Close the zipfile */ -extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader)); +extern int ZEXPORT zipRemoveExtraInfoBlock(char* pData, int* dataLen, short sHeader); /* zipRemoveExtraInfoBlock - Added by Mathias Svensson diff -Nru mariadb-10.11.6/storage/csv/ha_tina.cc mariadb-10.11.9/storage/csv/ha_tina.cc --- mariadb-10.11.6/storage/csv/ha_tina.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/csv/ha_tina.cc 2024-08-03 07:29:59.000000000 +0000 @@ -184,7 +184,8 @@ tina_hton= (handlerton *)p; mysql_mutex_init(csv_key_mutex_tina, &tina_mutex, MY_MUTEX_INIT_FAST); (void) my_hash_init(csv_key_memory_tina_share, &tina_open_tables, - system_charset_info, 32, 0, 0, (my_hash_get_key) + Lex_ident_table::charset_info(), + 32, 0, 0, (my_hash_get_key) tina_get_key, 0, 0); tina_hton->db_type= DB_TYPE_CSV_DB; tina_hton->create= tina_create_handler; diff -Nru mariadb-10.11.6/storage/csv/ha_tina.h mariadb-10.11.9/storage/csv/ha_tina.h --- mariadb-10.11.6/storage/csv/ha_tina.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/csv/ha_tina.h 2024-08-03 07:29:59.000000000 +0000 @@ -102,14 +102,14 @@ delete file_buff; free_root(&blobroot, MYF(0)); } - const char *index_type(uint inx) { return "NONE"; } - ulonglong table_flags() const + const char *index_type(uint inx) override { return "NONE"; } + ulonglong table_flags() const override { return (HA_NO_TRANSACTIONS | HA_REC_NOT_IN_SEQ | HA_NO_AUTO_INCREMENT | HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | HA_CAN_EXPORT | HA_CAN_REPAIR | HA_SLOW_RND_POS); } - ulong index_flags(uint idx, uint part, bool all_parts) const + ulong index_flags(uint idx, uint part, bool all_parts) const override { /* We will never have indexes so this will never be called(AKA we return @@ -124,7 +124,7 @@ /* Called in test_quick_select to determine if indexes should be used. */ - virtual double scan_time() { return (double) (stats.records+stats.deleted) / 20.0+10; } + double scan_time() override { return (double) (stats.records+stats.deleted) / 20.0+10; } /* The next method will never be called */ virtual bool fast_key_read() { return 1;} /* @@ -132,38 +132,38 @@ (e.g. save number of records seen on full table scan and/or use file size as upper bound) */ - ha_rows estimate_rows_upper_bound() { return HA_POS_ERROR; } + ha_rows estimate_rows_upper_bound() override { return HA_POS_ERROR; } - int open(const char *name, int mode, uint open_options); - int close(void); - int write_row(const uchar * buf); - int update_row(const uchar * old_data, const uchar * new_data); - int delete_row(const uchar * buf); - int rnd_init(bool scan=1); - int rnd_next(uchar *buf); - int rnd_pos(uchar * buf, uchar *pos); - bool check_and_repair(THD *thd); - int check(THD* thd, HA_CHECK_OPT* check_opt); - bool is_crashed() const; - int rnd_end(); - int repair(THD* thd, HA_CHECK_OPT* check_opt); + int open(const char *name, int mode, uint open_options) override; + int close(void) override; + int write_row(const uchar * buf) override; + int update_row(const uchar * old_data, const uchar * new_data) override; + int delete_row(const uchar * buf) override; + int rnd_init(bool scan=1) override; + int rnd_next(uchar *buf) override; + int rnd_pos(uchar * buf, uchar *pos) override; + bool check_and_repair(THD *thd) override; + int check(THD* thd, HA_CHECK_OPT* check_opt) override; + bool is_crashed() const override; + int rnd_end() override; + int repair(THD* thd, HA_CHECK_OPT* check_opt) override; /* This is required for SQL layer to know that we support autorepair */ - bool auto_repair(int error) const + bool auto_repair(int error) const override { return error == HA_ERR_CRASHED_ON_USAGE; } bool auto_repair() const { return 1; } - void position(const uchar *record); - int info(uint); - int reset(); - int extra(enum ha_extra_function operation); - int delete_all_rows(void); - int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info); + void position(const uchar *record) override; + int info(uint) override; + int reset() override; + int extra(enum ha_extra_function operation) override; + int delete_all_rows(void) override; + int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) override; bool check_if_incompatible_data(HA_CREATE_INFO *info, - uint table_changes); + uint table_changes) override; - int external_lock(THD *thd, int lock_type); + int external_lock(THD *thd, int lock_type) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); + enum thr_lock_type lock_type) override; /* These functions used to get/update status of the handler. diff -Nru mariadb-10.11.6/storage/example/ha_example.h mariadb-10.11.9/storage/example/ha_example.h --- mariadb-10.11.6/storage/example/ha_example.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/example/ha_example.h 2024-08-03 07:29:59.000000000 +0000 @@ -74,13 +74,13 @@ The name of the index type that will be used for display. Don't implement this method unless you really have indexes. */ - const char *index_type(uint inx) { return "HASH"; } + const char *index_type(uint inx) override { return "HASH"; } /** @brief This is a list of flags that indicate what functionality the storage engine implements. The current table flags are documented in handler.h */ - ulonglong table_flags() const + ulonglong table_flags() const override { /* We are saying that this engine is just statement capable to have @@ -100,7 +100,7 @@ If all_parts is set, MySQL wants to know the flags for the combined index, up to and including 'part'. */ - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return 0; } @@ -112,7 +112,7 @@ send. Return *real* limits of your storage engine here; MySQL will do min(your_limits, MySQL_limits) automatically. */ - uint max_supported_record_length() const { return HA_MAX_REC_LENGTH; } + uint max_supported_record_length() const override { return HA_MAX_REC_LENGTH; } /** @brief unireg.cc will call this to make sure that the storage engine can handle @@ -123,7 +123,7 @@ There is no need to implement ..._key_... methods if your engine doesn't support indexes. */ - uint max_supported_keys() const { return 0; } + uint max_supported_keys() const override { return 0; } /** @brief unireg.cc will call this to make sure that the storage engine can handle @@ -134,7 +134,7 @@ There is no need to implement ..._key_... methods if your engine doesn't support indexes. */ - uint max_supported_key_parts() const { return 0; } + uint max_supported_key_parts() const override { return 0; } /** @brief unireg.cc will call this to make sure that the storage engine can handle @@ -145,17 +145,17 @@ There is no need to implement ..._key_... methods if your engine doesn't support indexes. */ - uint max_supported_key_length() const { return 0; } + uint max_supported_key_length() const override { return 0; } /** @brief Called in test_quick_select to determine if indexes should be used. */ - virtual double scan_time() { return (double) (stats.records+stats.deleted) / 20.0+10; } + double scan_time() override { return (double) (stats.records+stats.deleted) / 20.0+10; } /** @brief This method will never be called if you do not implement indexes. */ - virtual double read_time(uint, uint, ha_rows rows) + double read_time(uint, uint, ha_rows rows) override { return (double) rows / 20.0+1; } /* @@ -167,61 +167,61 @@ /** @brief We implement this in ha_example.cc; it's a required method. */ - int open(const char *name, int mode, uint test_if_locked); // required + int open(const char *name, int mode, uint test_if_locked) override; // required /** @brief We implement this in ha_example.cc; it's a required method. */ - int close(void); // required + int close(void) override; // required /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int write_row(const uchar *buf); + int write_row(const uchar *buf) override; /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int update_row(const uchar *old_data, const uchar *new_data); + int update_row(const uchar *old_data, const uchar *new_data) override; /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int delete_row(const uchar *buf); + int delete_row(const uchar *buf) override; /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ int index_read_map(uchar *buf, const uchar *key, - key_part_map keypart_map, enum ha_rkey_function find_flag); + key_part_map keypart_map, enum ha_rkey_function find_flag) override; /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int index_next(uchar *buf); + int index_next(uchar *buf) override; /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int index_prev(uchar *buf); + int index_prev(uchar *buf) override; /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int index_first(uchar *buf); + int index_first(uchar *buf) override; /** @brief We implement this in ha_example.cc. It's not an obligatory method; skip it and and MySQL will treat it as not implemented. */ - int index_last(uchar *buf); + int index_last(uchar *buf) override; /** @brief Unlike index_init(), rnd_init() can be called two consecutive times @@ -231,24 +231,24 @@ cursor to the start of the table; no need to deallocate and allocate it again. This is a required method. */ - int rnd_init(bool scan); //required - int rnd_end(); - int rnd_next(uchar *buf); ///< required - int rnd_pos(uchar *buf, uchar *pos); ///< required - void position(const uchar *record); ///< required - int info(uint); ///< required - int extra(enum ha_extra_function operation); - int external_lock(THD *thd, int lock_type); ///< required - int delete_all_rows(void); + int rnd_init(bool scan) override; //required + int rnd_end() override; + int rnd_next(uchar *buf) override; ///< required + int rnd_pos(uchar *buf, uchar *pos) override; ///< required + void position(const uchar *record) override; ///< required + int info(uint) override; ///< required + int extra(enum ha_extra_function operation) override; + int external_lock(THD *thd, int lock_type) override; ///< required + int delete_all_rows(void) override; ha_rows records_in_range(uint inx, const key_range *min_key, - const key_range *max_key, page_range *pages); - int delete_table(const char *from); + const key_range *max_key, page_range *pages) override; + int delete_table(const char *from) override; int create(const char *name, TABLE *form, - HA_CREATE_INFO *create_info); ///< required + HA_CREATE_INFO *create_info) override; ///< required enum_alter_inplace_result check_if_supported_inplace_alter(TABLE* altered_table, - Alter_inplace_info* ha_alter_info); + Alter_inplace_info* ha_alter_info) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); ///< required + enum thr_lock_type lock_type) override; ///< required }; diff -Nru mariadb-10.11.6/storage/federated/ha_federated.cc mariadb-10.11.9/storage/federated/ha_federated.cc --- mariadb-10.11.6/storage/federated/ha_federated.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/federated/ha_federated.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1656,7 +1656,7 @@ public: bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, - const char* msg, Sql_condition ** cond_hdl) + const char* msg, Sql_condition ** cond_hdl) override { return sql_errno >= ER_ABORTING_CONNECTION && sql_errno <= ER_NET_WRITE_INTERRUPTED; diff -Nru mariadb-10.11.6/storage/federated/ha_federated.h mariadb-10.11.9/storage/federated/ha_federated.h --- mariadb-10.11.6/storage/federated/ha_federated.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/federated/ha_federated.h 2024-08-03 07:29:59.000000000 +0000 @@ -131,13 +131,13 @@ don't implement this method unless you really have indexes */ // perhaps get index type - const char *index_type(uint inx) { return "REMOTE"; } + const char *index_type(uint inx) override { return "REMOTE"; } /* This is a list of flags that says what the storage engine implements. The current table flags are documented in handler.h */ - ulonglong table_flags() const + ulonglong table_flags() const override { /* fix server to be able to get remote server table flags */ return (HA_PRIMARY_KEY_IN_READ_INDEX | HA_FILE_BASED @@ -160,15 +160,15 @@ index up to and including 'part'. */ /* fix server to be able to get remote server index flags */ - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return (HA_READ_NEXT | HA_READ_RANGE | HA_READ_AFTER_KEY); } - uint max_supported_record_length() const { return HA_MAX_REC_LENGTH; } - uint max_supported_keys() const { return MAX_KEY; } - uint max_supported_key_parts() const { return MAX_REF_PARTS; } - uint max_supported_key_length() const { return FEDERATED_MAX_KEY_LENGTH; } - uint max_supported_key_part_length() const { return FEDERATED_MAX_KEY_LENGTH; } + uint max_supported_record_length() const override { return HA_MAX_REC_LENGTH; } + uint max_supported_keys() const override { return MAX_KEY; } + uint max_supported_key_parts() const override { return MAX_REF_PARTS; } + uint max_supported_key_length() const override { return FEDERATED_MAX_KEY_LENGTH; } + uint max_supported_key_part_length() const override { return FEDERATED_MAX_KEY_LENGTH; } /* Called in test_quick_select to determine if indexes should be used. Normally, we need to know number of blocks . For federated we need to @@ -180,7 +180,7 @@ The reason for "records * 1000" is that such a large number forces this to use indexes " */ - double scan_time() + double scan_time() override { DBUG_PRINT("info", ("records %lu", (ulong) stats.records)); return (double)(stats.records*1000); @@ -188,7 +188,7 @@ /* The next method will never be called if you do not implement indexes. */ - double read_time(uint index, uint ranges, ha_rows rows) + double read_time(uint index, uint ranges, ha_rows rows) override { /* Per Brian, this number is bugus, but this method must be implemented, @@ -197,33 +197,33 @@ return (double) rows / 20.0+1; } - const key_map *keys_to_use_for_scanning() { return &key_map_full; } + const key_map *keys_to_use_for_scanning() override { return &key_map_full; } /* Everything below are methods that we implment in ha_federated.cc. Most of these methods are not obligatory, skip them and MySQL will treat them as not implemented */ - int open(const char *name, int mode, uint test_if_locked); // required - int close(void); // required + int open(const char *name, int mode, uint test_if_locked) override; // required + int close(void) override; // required - void start_bulk_insert(ha_rows rows, uint flags); - int end_bulk_insert(); - int write_row(const uchar *buf); - int update_row(const uchar *old_data, const uchar *new_data); - int delete_row(const uchar *buf); - int index_init(uint keynr, bool sorted); - ha_rows estimate_rows_upper_bound(); + void start_bulk_insert(ha_rows rows, uint flags) override; + int end_bulk_insert() override; + int write_row(const uchar *buf) override; + int update_row(const uchar *old_data, const uchar *new_data) override; + int delete_row(const uchar *buf) override; + int index_init(uint keynr, bool sorted) override; + ha_rows estimate_rows_upper_bound() override; int index_read(uchar *buf, const uchar *key, - uint key_len, enum ha_rkey_function find_flag); + uint key_len, enum ha_rkey_function find_flag) override; int index_read_idx(uchar *buf, uint idx, const uchar *key, uint key_len, enum ha_rkey_function find_flag); - int index_next(uchar *buf); - int index_end(); + int index_next(uchar *buf) override; + int index_end() override; int read_range_first(const key_range *start_key, const key_range *end_key, - bool eq_range, bool sorted); - int read_range_next(); + bool eq_range, bool sorted) override; + int read_range_next() override; /* unlike index_init(), rnd_init() can be called two times without rnd_end() in between (it only makes sense if scan=1). @@ -232,17 +232,17 @@ position it to the start of the table, no need to deallocate and allocate it again */ - int rnd_init(bool scan); //required - int rnd_end(); - int rnd_next(uchar *buf); //required + int rnd_init(bool scan) override; //required + int rnd_end() override; + int rnd_next(uchar *buf) override; //required int rnd_next_int(uchar *buf); - int rnd_pos(uchar *buf, uchar *pos); //required - void position(const uchar *record); //required + int rnd_pos(uchar *buf, uchar *pos) override; //required + void position(const uchar *record) override; //required /* A ref is a pointer inside a local buffer. It is not comparable to other ref's. This is never called as HA_NON_COMPARABLE_ROWID is set. */ - int cmp_ref(const uchar *ref1, const uchar *ref2) + int cmp_ref(const uchar *ref1, const uchar *ref2) override { #ifdef NOT_YET DBUG_ASSERT(0); @@ -251,38 +251,38 @@ return handler::cmp_ref(ref1,ref2); /* Works if table scan is used */ #endif } - int info(uint); //required - int extra(ha_extra_function operation); + int info(uint) override; //required + int extra(ha_extra_function operation) override; void update_auto_increment(void); - int repair(THD* thd, HA_CHECK_OPT* check_opt); - int optimize(THD* thd, HA_CHECK_OPT* check_opt); - int delete_table(const char *name) + int repair(THD* thd, HA_CHECK_OPT* check_opt) override; + int optimize(THD* thd, HA_CHECK_OPT* check_opt) override; + int delete_table(const char *name) override { return 0; } - int delete_all_rows(void); - int truncate(); + int delete_all_rows(void) override; + int truncate() override; int create(const char *name, TABLE *form, - HA_CREATE_INFO *create_info); //required + HA_CREATE_INFO *create_info) override; //required ha_rows records_in_range(uint inx, const key_range *start_key, const key_range *end_key, - page_range *pages); - uint8 table_cache_type() { return HA_CACHE_TBL_NOCACHE; } + page_range *pages) override; + uint8 table_cache_type() override { return HA_CACHE_TBL_NOCACHE; } THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); //required - bool get_error_message(int error, String *buf); + enum thr_lock_type lock_type) override; //required + bool get_error_message(int error, String *buf) override; MYSQL_RES *store_result(MYSQL *mysql); void free_result(); - int external_lock(THD *thd, int lock_type); + int external_lock(THD *thd, int lock_type) override; int connection_commit(); int connection_rollback(); int connection_autocommit(bool state); int execute_simple_query(const char *query, int len); - int reset(void); + int reset(void) override; }; diff -Nru mariadb-10.11.6/storage/federatedx/federatedx_io_mysql.cc mariadb-10.11.9/storage/federatedx/federatedx_io_mysql.cc --- mariadb-10.11.6/storage/federatedx/federatedx_io_mysql.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/federatedx/federatedx_io_mysql.cc 2024-08-03 07:29:59.000000000 +0000 @@ -73,55 +73,55 @@ bool test_all_restrict() const; public: federatedx_io_mysql(FEDERATEDX_SERVER *); - ~federatedx_io_mysql(); + ~federatedx_io_mysql() override; int simple_query(const char *fmt, ...); - int query(const char *buffer, size_t length); - virtual FEDERATEDX_IO_RESULT *store_result(); + int query(const char *buffer, size_t length) override; + FEDERATEDX_IO_RESULT *store_result() override; - virtual size_t max_query_size() const; + size_t max_query_size() const override; - virtual my_ulonglong affected_rows() const; - virtual my_ulonglong last_insert_id() const; + my_ulonglong affected_rows() const override; + my_ulonglong last_insert_id() const override; - virtual int error_code(); - virtual const char *error_str(); + int error_code() override; + const char *error_str() override; - void reset(); - int commit(); - int rollback(); + void reset() override; + int commit() override; + int rollback() override; - int savepoint_set(ulong sp); - ulong savepoint_release(ulong sp); - ulong savepoint_rollback(ulong sp); - void savepoint_restrict(ulong sp); + int savepoint_set(ulong sp) override; + ulong savepoint_release(ulong sp) override; + ulong savepoint_rollback(ulong sp) override; + void savepoint_restrict(ulong sp) override; - ulong last_savepoint() const; - ulong actual_savepoint() const; - bool is_autocommit() const; + ulong last_savepoint() const override; + ulong actual_savepoint() const override; + bool is_autocommit() const override; bool table_metadata(ha_statistics *stats, const char *table_name, - uint table_name_length, uint flag); + uint table_name_length, uint flag) override; /* resultset operations */ - virtual void free_result(FEDERATEDX_IO_RESULT *io_result); - virtual unsigned int get_num_fields(FEDERATEDX_IO_RESULT *io_result); - virtual my_ulonglong get_num_rows(FEDERATEDX_IO_RESULT *io_result); - virtual FEDERATEDX_IO_ROW *fetch_row(FEDERATEDX_IO_RESULT *io_result, - FEDERATEDX_IO_ROWS **current= NULL); - virtual ulong *fetch_lengths(FEDERATEDX_IO_RESULT *io_result); - virtual const char *get_column_data(FEDERATEDX_IO_ROW *row, - unsigned int column); - virtual bool is_column_null(const FEDERATEDX_IO_ROW *row, - unsigned int column) const; - - virtual size_t get_ref_length() const; - virtual void mark_position(FEDERATEDX_IO_RESULT *io_result, - void *ref, FEDERATEDX_IO_ROWS *current); - virtual int seek_position(FEDERATEDX_IO_RESULT **io_result, - const void *ref); - virtual void set_thd(void *thd); + void free_result(FEDERATEDX_IO_RESULT *io_result) override; + unsigned int get_num_fields(FEDERATEDX_IO_RESULT *io_result) override; + my_ulonglong get_num_rows(FEDERATEDX_IO_RESULT *io_result) override; + FEDERATEDX_IO_ROW *fetch_row(FEDERATEDX_IO_RESULT *io_result, + FEDERATEDX_IO_ROWS **current= NULL) override; + ulong *fetch_lengths(FEDERATEDX_IO_RESULT *io_result) override; + const char *get_column_data(FEDERATEDX_IO_ROW *row, + unsigned int column) override; + bool is_column_null(const FEDERATEDX_IO_ROW *row, + unsigned int column) const override; + + size_t get_ref_length() const override; + void mark_position(FEDERATEDX_IO_RESULT *io_result, + void *ref, FEDERATEDX_IO_ROWS *current) override; + int seek_position(FEDERATEDX_IO_RESULT **io_result, + const void *ref) override; + void set_thd(void *thd) override; }; @@ -451,11 +451,14 @@ get_port(), get_socket(), 0)) DBUG_RETURN(ER_CONNECT_TO_FOREIGN_DATA_SOURCE); + + if ((error= mysql_real_query(&mysql, STRING_WITH_LEN("set time_zone='+00:00'")))) + DBUG_RETURN(error); + mysql.reconnect= 1; } - if (!(error= mysql_real_query(&mysql, STRING_WITH_LEN("set time_zone='+00:00'")))) - error= mysql_real_query(&mysql, buffer, (ulong)length); + error= mysql_real_query(&mysql, buffer, (ulong)length); DBUG_RETURN(error); } diff -Nru mariadb-10.11.6/storage/federatedx/federatedx_io_null.cc mariadb-10.11.9/storage/federatedx/federatedx_io_null.cc --- mariadb-10.11.6/storage/federatedx/federatedx_io_null.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/federatedx/federatedx_io_null.cc 2024-08-03 07:29:59.000000000 +0000 @@ -56,52 +56,52 @@ { public: federatedx_io_null(FEDERATEDX_SERVER *); - ~federatedx_io_null(); + ~federatedx_io_null() override; - int query(const char *buffer, size_t length); - virtual FEDERATEDX_IO_RESULT *store_result(); + int query(const char *buffer, size_t length) override; + FEDERATEDX_IO_RESULT *store_result() override; - virtual size_t max_query_size() const; + size_t max_query_size() const override; - virtual my_ulonglong affected_rows() const; - virtual my_ulonglong last_insert_id() const; + my_ulonglong affected_rows() const override; + my_ulonglong last_insert_id() const override; - virtual int error_code(); - virtual const char *error_str(); + int error_code() override; + const char *error_str() override; - void reset(); - int commit(); - int rollback(); + void reset() override; + int commit() override; + int rollback() override; - int savepoint_set(ulong sp); - ulong savepoint_release(ulong sp); - ulong savepoint_rollback(ulong sp); - void savepoint_restrict(ulong sp); + int savepoint_set(ulong sp) override; + ulong savepoint_release(ulong sp) override; + ulong savepoint_rollback(ulong sp) override; + void savepoint_restrict(ulong sp) override; - ulong last_savepoint() const; - ulong actual_savepoint() const; - bool is_autocommit() const; + ulong last_savepoint() const override; + ulong actual_savepoint() const override; + bool is_autocommit() const override; bool table_metadata(ha_statistics *stats, const char *table_name, - uint table_name_length, uint flag); + uint table_name_length, uint flag) override; /* resultset operations */ - virtual void free_result(FEDERATEDX_IO_RESULT *io_result); - virtual unsigned int get_num_fields(FEDERATEDX_IO_RESULT *io_result); - virtual my_ulonglong get_num_rows(FEDERATEDX_IO_RESULT *io_result); - virtual FEDERATEDX_IO_ROW *fetch_row(FEDERATEDX_IO_RESULT *io_result, - FEDERATEDX_IO_ROWS **current= NULL); - virtual ulong *fetch_lengths(FEDERATEDX_IO_RESULT *io_result); - virtual const char *get_column_data(FEDERATEDX_IO_ROW *row, - unsigned int column); - virtual bool is_column_null(const FEDERATEDX_IO_ROW *row, - unsigned int column) const; - virtual size_t get_ref_length() const; - virtual void mark_position(FEDERATEDX_IO_RESULT *io_result, - void *ref, FEDERATEDX_IO_ROWS *current); - virtual int seek_position(FEDERATEDX_IO_RESULT **io_result, - const void *ref); + void free_result(FEDERATEDX_IO_RESULT *io_result) override; + unsigned int get_num_fields(FEDERATEDX_IO_RESULT *io_result) override; + my_ulonglong get_num_rows(FEDERATEDX_IO_RESULT *io_result) override; + FEDERATEDX_IO_ROW *fetch_row(FEDERATEDX_IO_RESULT *io_result, + FEDERATEDX_IO_ROWS **current= NULL) override; + ulong *fetch_lengths(FEDERATEDX_IO_RESULT *io_result) override; + const char *get_column_data(FEDERATEDX_IO_ROW *row, + unsigned int column) override; + bool is_column_null(const FEDERATEDX_IO_ROW *row, + unsigned int column) const override; + size_t get_ref_length() const override; + void mark_position(FEDERATEDX_IO_RESULT *io_result, + void *ref, FEDERATEDX_IO_ROWS *current) override; + int seek_position(FEDERATEDX_IO_RESULT **io_result, + const void *ref) override; }; diff -Nru mariadb-10.11.6/storage/federatedx/federatedx_pushdown.h mariadb-10.11.9/storage/federatedx/federatedx_pushdown.h --- mariadb-10.11.6/storage/federatedx/federatedx_pushdown.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/federatedx/federatedx_pushdown.h 2024-08-03 07:29:59.000000000 +0000 @@ -33,10 +33,10 @@ public: ha_federatedx_derived_handler(THD* thd_arg, TABLE_LIST *tbl); ~ha_federatedx_derived_handler(); - int init_scan(); - int next_row(); - int end_scan(); - void print_error(int, unsigned long); + int init_scan() override; + int next_row() override; + int end_scan() override; + void print_error(int, unsigned long) override; }; @@ -56,8 +56,8 @@ public: ha_federatedx_select_handler(THD* thd_arg, SELECT_LEX *sel); ~ha_federatedx_select_handler(); - int init_scan(); - int next_row(); - int end_scan(); - void print_error(int, unsigned long); + int init_scan() override; + int next_row() override; + int end_scan() override; + void print_error(int, unsigned long) override; }; diff -Nru mariadb-10.11.6/storage/federatedx/ha_federatedx.cc mariadb-10.11.9/storage/federatedx/ha_federatedx.cc --- mariadb-10.11.6/storage/federatedx/ha_federatedx.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/federatedx/ha_federatedx.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1824,7 +1824,7 @@ public: bool handle_condition(THD *thd, uint sql_errno, const char* sqlstate, Sql_condition::enum_warning_level *level, - const char* msg, Sql_condition ** cond_hdl) + const char* msg, Sql_condition ** cond_hdl) override { return sql_errno >= ER_ABORTING_CONNECTION && sql_errno <= ER_NET_WRITE_INTERRUPTED; diff -Nru mariadb-10.11.6/storage/federatedx/ha_federatedx.h mariadb-10.11.9/storage/federatedx/ha_federatedx.h --- mariadb-10.11.6/storage/federatedx/ha_federatedx.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/federatedx/ha_federatedx.h 2024-08-03 07:29:59.000000000 +0000 @@ -322,13 +322,13 @@ don't implement this method unless you really have indexes */ // perhaps get index type - const char *index_type(uint inx) { return "REMOTE"; } + const char *index_type(uint inx) override { return "REMOTE"; } /* This is a list of flags that says what the storage engine implements. The current table flags are documented in handler.h */ - ulonglong table_flags() const + ulonglong table_flags() const override { /* fix server to be able to get remote server table flags */ return (HA_PRIMARY_KEY_IN_READ_INDEX | HA_FILE_BASED @@ -348,15 +348,15 @@ index up to and including 'part'. */ /* fix server to be able to get remote server index flags */ - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return (HA_READ_NEXT | HA_READ_RANGE); } - uint max_supported_record_length() const { return HA_MAX_REC_LENGTH; } - uint max_supported_keys() const { return MAX_KEY; } - uint max_supported_key_parts() const { return MAX_REF_PARTS; } - uint max_supported_key_length() const { return FEDERATEDX_MAX_KEY_LENGTH; } - uint max_supported_key_part_length() const { return FEDERATEDX_MAX_KEY_LENGTH; } + uint max_supported_record_length() const override { return HA_MAX_REC_LENGTH; } + uint max_supported_keys() const override { return MAX_KEY; } + uint max_supported_key_parts() const override { return MAX_REF_PARTS; } + uint max_supported_key_length() const override { return FEDERATEDX_MAX_KEY_LENGTH; } + uint max_supported_key_part_length() const override { return FEDERATEDX_MAX_KEY_LENGTH; } /* Called in test_quick_select to determine if indexes should be used. Normally, we need to know number of blocks . For federatedx we need to @@ -368,7 +368,7 @@ The reason for "records * 1000" is that such a large number forces this to use indexes " */ - double scan_time() + double scan_time() override { DBUG_PRINT("info", ("records %lu", (ulong) stats.records)); return (double)(stats.records*1000); @@ -376,7 +376,7 @@ /* The next method will never be called if you do not implement indexes. */ - double read_time(uint index, uint ranges, ha_rows rows) + double read_time(uint index, uint ranges, ha_rows rows) override { /* Per Brian, this number is bugus, but this method must be implemented, @@ -385,33 +385,33 @@ return (double) rows / 20.0+1; } - const key_map *keys_to_use_for_scanning() { return &key_map_full; } + const key_map *keys_to_use_for_scanning() override { return &key_map_full; } /* Everything below are methods that we implment in ha_federatedx.cc. Most of these methods are not obligatory, skip them and MySQL will treat them as not implemented */ - int open(const char *name, int mode, uint test_if_locked); // required - int close(void); // required + int open(const char *name, int mode, uint test_if_locked) override; // required + int close(void) override; // required - void start_bulk_insert(ha_rows rows, uint flags); - int end_bulk_insert(); - int write_row(const uchar *buf); - int update_row(const uchar *old_data, const uchar *new_data); - int delete_row(const uchar *buf); - int index_init(uint keynr, bool sorted); - ha_rows estimate_rows_upper_bound(); + void start_bulk_insert(ha_rows rows, uint flags) override; + int end_bulk_insert() override; + int write_row(const uchar *buf) override; + int update_row(const uchar *old_data, const uchar *new_data) override; + int delete_row(const uchar *buf) override; + int index_init(uint keynr, bool sorted) override; + ha_rows estimate_rows_upper_bound() override; int index_read(uchar *buf, const uchar *key, - uint key_len, enum ha_rkey_function find_flag); + uint key_len, enum ha_rkey_function find_flag) override; int index_read_idx(uchar *buf, uint idx, const uchar *key, uint key_len, enum ha_rkey_function find_flag); - int index_next(uchar *buf); - int index_end(); + int index_next(uchar *buf) override; + int index_end() override; int read_range_first(const key_range *start_key, const key_range *end_key, - bool eq_range, bool sorted); - int read_range_next(); + bool eq_range, bool sorted) override; + int read_range_next() override; /* unlike index_init(), rnd_init() can be called two times without rnd_end() in between (it only makes sense if scan=1). @@ -420,16 +420,16 @@ position it to the start of the table, no need to deallocate and allocate it again */ - int rnd_init(bool scan); //required - int rnd_end(); - int rnd_next(uchar *buf); //required - int rnd_pos(uchar *buf, uchar *pos); //required - void position(const uchar *record); //required + int rnd_init(bool scan) override; //required + int rnd_end() override; + int rnd_next(uchar *buf) override; //required + int rnd_pos(uchar *buf, uchar *pos) override; //required + void position(const uchar *record) override; //required /* A ref is a pointer inside a local buffer. It is not comparable to other ref's. This is never called as HA_NON_COMPARABLE_ROWID is set. */ - int cmp_ref(const uchar *ref1, const uchar *ref2) + int cmp_ref(const uchar *ref1, const uchar *ref2) override { #ifdef NOT_YET DBUG_ASSERT(0); @@ -438,29 +438,29 @@ return handler::cmp_ref(ref1,ref2); /* Works if table scan is used */ #endif } - int info(uint); //required - int extra(ha_extra_function operation); + int info(uint) override; //required + int extra(ha_extra_function operation) override; void update_auto_increment(void); - int repair(THD* thd, HA_CHECK_OPT* check_opt); - int optimize(THD* thd, HA_CHECK_OPT* check_opt); - int delete_table(const char *name) + int repair(THD* thd, HA_CHECK_OPT* check_opt) override; + int optimize(THD* thd, HA_CHECK_OPT* check_opt) override; + int delete_table(const char *name) override { return 0; } - int delete_all_rows(void); + int delete_all_rows(void) override; int create(const char *name, TABLE *form, - HA_CREATE_INFO *create_info); //required + HA_CREATE_INFO *create_info) override; //required ha_rows records_in_range(uint inx, const key_range *start_key, - const key_range *end_key, page_range *pages); - uint8 table_cache_type() { return HA_CACHE_TBL_NOCACHE; } + const key_range *end_key, page_range *pages) override; + uint8 table_cache_type() override { return HA_CACHE_TBL_NOCACHE; } THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); //required - bool get_error_message(int error, String *buf); - int start_stmt(THD *thd, thr_lock_type lock_type); - int external_lock(THD *thd, int lock_type); - int reset(void); + enum thr_lock_type lock_type) override; //required + bool get_error_message(int error, String *buf) override; + int start_stmt(THD *thd, thr_lock_type lock_type) override; + int external_lock(THD *thd, int lock_type) override; + int reset(void) override; int free_result(void); const FEDERATEDX_SHARE *get_federatedx_share() const { return share; } diff -Nru mariadb-10.11.6/storage/heap/ha_heap.cc mariadb-10.11.9/storage/heap/ha_heap.cc --- mariadb-10.11.6/storage/heap/ha_heap.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/heap/ha_heap.cc 2024-08-03 07:29:59.000000000 +0000 @@ -440,31 +440,22 @@ SYNOPSIS disable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ disable all non-unique keys - HA_KEY_SWITCH_ALL disable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE dis. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE dis. all keys and make persistent DESCRIPTION - Disable indexes and clear keys to use for scanning. - - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_NONUNIQ_SAVE is not implemented with HEAP. - HA_KEY_SWITCH_ALL_SAVE is not implemented with HEAP. + See handler::ha_disable_indexes() RETURN 0 ok HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_heap::disable_indexes(uint mode) +int ha_heap::disable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { + DBUG_ASSERT(map.is_clear_all()); if (!(error= heap_disable_indexes(file))) set_keys_for_scanning(); } @@ -482,11 +473,6 @@ SYNOPSIS enable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ enable all non-unique keys - HA_KEY_SWITCH_ALL enable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE en. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE en. all keys and make persistent DESCRIPTION Enable indexes and set keys to use for scanning. @@ -495,10 +481,7 @@ since the heap storage engine cannot repair the indexes. To be sure, call handler::delete_all_rows() before. - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_NONUNIQ_SAVE is not implemented with HEAP. - HA_KEY_SWITCH_ALL_SAVE is not implemented with HEAP. + See also handler::ha_enable_indexes() RETURN 0 ok @@ -506,12 +489,13 @@ HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_heap::enable_indexes(uint mode) +int ha_heap::enable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { + DBUG_ASSERT(map.is_prefix(table->s->keys)); if (!(error= heap_enable_indexes(file))) set_keys_for_scanning(); } diff -Nru mariadb-10.11.6/storage/heap/ha_heap.h mariadb-10.11.9/storage/heap/ha_heap.h --- mariadb-10.11.6/storage/heap/ha_heap.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/heap/ha_heap.h 2024-08-03 07:29:59.000000000 +0000 @@ -37,15 +37,15 @@ public: ha_heap(handlerton *hton, TABLE_SHARE *table); ~ha_heap() = default; - handler *clone(const char *name, MEM_ROOT *mem_root); - const char *index_type(uint inx) + handler *clone(const char *name, MEM_ROOT *mem_root) override; + const char *index_type(uint inx) override { return ((table_share->key_info[inx].algorithm == HA_KEY_ALG_BTREE) ? "BTREE" : "HASH"); } /* Rows also use a fixed-size format */ - enum row_type get_row_type() const { return ROW_TYPE_FIXED; } - ulonglong table_flags() const + enum row_type get_row_type() const override { return ROW_TYPE_FIXED; } + ulonglong table_flags() const override { return (HA_FAST_KEY_READ | HA_NO_BLOBS | HA_NULL_IN_KEY | HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | @@ -53,73 +53,73 @@ HA_REC_NOT_IN_SEQ | HA_CAN_INSERT_DELAYED | HA_NO_TRANSACTIONS | HA_HAS_RECORDS | HA_STATS_RECORDS_IS_EXACT | HA_CAN_HASH_KEYS); } - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return ((table_share->key_info[inx].algorithm == HA_KEY_ALG_BTREE) ? HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER | HA_READ_RANGE : HA_ONLY_WHOLE_INDEX | HA_KEY_SCAN_NOT_ROR); } - const key_map *keys_to_use_for_scanning() { return &btree_keys; } - uint max_supported_keys() const { return MAX_KEY; } - uint max_supported_key_part_length() const { return MAX_KEY_LENGTH; } - double scan_time() + const key_map *keys_to_use_for_scanning() override { return &btree_keys; } + uint max_supported_keys() const override { return MAX_KEY; } + uint max_supported_key_part_length() const override { return MAX_KEY_LENGTH; } + double scan_time() override { return (double) (stats.records+stats.deleted) / 20.0+10; } - double read_time(uint index, uint ranges, ha_rows rows) + double read_time(uint index, uint ranges, ha_rows rows) override { return (double) (rows +1)/ 20.0; } - double keyread_time(uint index, uint ranges, ha_rows rows) + double keyread_time(uint index, uint ranges, ha_rows rows) override { return (double) (rows + ranges) / 20.0 ; } - double avg_io_cost() + double avg_io_cost() override { return 0.05; } /* 1/20 */ - int open(const char *name, int mode, uint test_if_locked); - int close(void); + int open(const char *name, int mode, uint test_if_locked) override; + int close(void) override; void set_keys_for_scanning(void); - int write_row(const uchar * buf); - int update_row(const uchar * old_data, const uchar * new_data); - int delete_row(const uchar * buf); - virtual void get_auto_increment(ulonglong offset, ulonglong increment, - ulonglong nb_desired_values, - ulonglong *first_value, - ulonglong *nb_reserved_values); + int write_row(const uchar * buf) override; + int update_row(const uchar * old_data, const uchar * new_data) override; + int delete_row(const uchar * buf) override; + void get_auto_increment(ulonglong offset, ulonglong increment, + ulonglong nb_desired_values, + ulonglong *first_value, + ulonglong *nb_reserved_values) override; int index_read_map(uchar * buf, const uchar * key, key_part_map keypart_map, - enum ha_rkey_function find_flag); - int index_read_last_map(uchar *buf, const uchar *key, key_part_map keypart_map); + enum ha_rkey_function find_flag) override; + int index_read_last_map(uchar *buf, const uchar *key, key_part_map keypart_map) override; int index_read_idx_map(uchar * buf, uint index, const uchar * key, key_part_map keypart_map, - enum ha_rkey_function find_flag); - int index_next(uchar * buf); - int index_prev(uchar * buf); - int index_first(uchar * buf); - int index_last(uchar * buf); - int rnd_init(bool scan); - int rnd_next(uchar *buf); - int rnd_pos(uchar * buf, uchar *pos); - void position(const uchar *record); - int can_continue_handler_scan(); - int info(uint); - int extra(enum ha_extra_function operation); - int reset(); - int external_lock(THD *thd, int lock_type); - int delete_all_rows(void); - int reset_auto_increment(ulonglong value); - int disable_indexes(uint mode); - int enable_indexes(uint mode); - int indexes_are_disabled(void); + enum ha_rkey_function find_flag) override; + int index_next(uchar * buf) override; + int index_prev(uchar * buf) override; + int index_first(uchar * buf) override; + int index_last(uchar * buf) override; + int rnd_init(bool scan) override; + int rnd_next(uchar *buf) override; + int rnd_pos(uchar * buf, uchar *pos) override; + void position(const uchar *record) override; + int can_continue_handler_scan() override; + int info(uint) override; + int extra(enum ha_extra_function operation) override; + int reset() override; + int external_lock(THD *thd, int lock_type) override; + int delete_all_rows(void) override; + int reset_auto_increment(ulonglong value) override; + int disable_indexes(key_map map, bool persist) override; + int enable_indexes(key_map map, bool persist) override; + int indexes_are_disabled(void) override; ha_rows records_in_range(uint inx, const key_range *start_key, - const key_range *end_key, page_range *pages); - int delete_table(const char *from); - void drop_table(const char *name); - int rename_table(const char * from, const char * to); - int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info); - void update_create_info(HA_CREATE_INFO *create_info); + const key_range *end_key, page_range *pages) override; + int delete_table(const char *from) override; + void drop_table(const char *name) override; + int rename_table(const char * from, const char * to) override; + int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) override; + void update_create_info(HA_CREATE_INFO *create_info) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); - int cmp_ref(const uchar *ref1, const uchar *ref2) + enum thr_lock_type lock_type) override; + int cmp_ref(const uchar *ref1, const uchar *ref2) override { return memcmp(ref1, ref2, sizeof(HEAP_PTR)); } - bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes); - int find_unique_row(uchar *record, uint unique_idx); + bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes) override; + int find_unique_row(uchar *record, uint unique_idx) override; private: void update_key_stats(); }; diff -Nru mariadb-10.11.6/storage/heap/hp_info.c mariadb-10.11.9/storage/heap/hp_info.c --- mariadb-10.11.6/storage/heap/hp_info.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/heap/hp_info.c 2024-08-03 07:29:59.000000000 +0000 @@ -40,6 +40,10 @@ x->errkey = info->errkey; x->create_time = info->s->create_time; if (flag & HA_STATUS_AUTO) - x->auto_increment= info->s->auto_increment + 1; + { + x->auto_increment= info->s->auto_increment+1; + if (!x->auto_increment) /* This shouldn't happen */ + x->auto_increment= ~(ulonglong) 0; + } DBUG_RETURN(0); } /* heap_info */ diff -Nru mariadb-10.11.6/storage/innobase/CMakeLists.txt mariadb-10.11.9/storage/innobase/CMakeLists.txt --- mariadb-10.11.6/storage/innobase/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -48,6 +48,13 @@ IF(HAVE_LIBNUMA) LINK_LIBRARIES(numa) ENDIF() + IF(CMAKE_SIZEOF_VOID_P EQUAL 8) + IF(CMAKE_SYSTEM_PROCESSOR MATCHES "(aarch|AARCH|p(ower)?pc|x86_|amd)64") + OPTION(WITH_INNODB_PMEM "Support memory-mapped InnoDB redo log" ON) + ELSE() # Disable by default on ISA that are not covered by our CI + OPTION(WITH_INNODB_PMEM "Support memory-mapped InnoDB redo log" OFF) + ENDIF() + ENDIF() ENDIF() ENDIF() @@ -71,7 +78,7 @@ OPTION(WITH_INNODB_EXTRA_DEBUG "Enable extra InnoDB debug checks" OFF) IF(WITH_INNODB_EXTRA_DEBUG) - ADD_DEFINITIONS(-DUNIV_ZIP_DEBUG) + ADD_DEFINITIONS(-DUNIV_ZIP_DEBUG -DLOG_LATCH_DEBUG) ENDIF() ADD_FEATURE_INFO(INNODB_EXTRA_DEBUG WITH_INNODB_EXTRA_DEBUG "Extra InnoDB debug checks") @@ -133,7 +140,6 @@ btr/btr0pcur.cc btr/btr0sea.cc btr/btr0defragment.cc - buf/buf0block_hint.cc buf/buf0buddy.cc buf/buf0buf.cc buf/buf0dblwr.cc @@ -428,26 +434,16 @@ ut/ut0vec.cc ut/ut0wqueue.cc) -OPTION(WITH_PMEM "Support redo log in persistent memory" OFF) -FIND_PACKAGE(PMEM) -IF(PMEM_FOUND) - INCLUDE_DIRECTORIES(${PMEM_INCLUDES}) - ADD_COMPILE_FLAGS(log/log0log.cc log/log0recv.cc - buf/buf0flu.cc mtr/mtr0mtr.cc trx/trx0trx.cc srv/srv0start.cc - COMPILE_FLAGS "-DHAVE_PMEM") - SET(PMEM_LIBRARY ${PMEM_LIBRARIES}) -ELSE() - IF(WITH_PMEM) - MESSAGE(FATAL_ERROR "WITH_PMEM=ON cannot be satisfied") - ENDIF() +IF(WITH_INNODB_PMEM) + ADD_DEFINITIONS(-DHAVE_PMEM) + SET(INNOBASE_SOURCES ${INNOBASE_SOURCES} include/cache.h sync/cache.cc) ENDIF() MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE MODULE_OUTPUT_NAME ha_innodb DEFAULT RECOMPILE_FOR_EMBEDDED LINK_LIBRARIES - ${ZLIB_LIBRARY} - ${PMEM_LIBRARY} + ${ZLIB_LIBRARIES} ${NUMA_LIBRARY} ${LIBSYSTEMD} ${LINKER_SCRIPT}) diff -Nru mariadb-10.11.6/storage/innobase/btr/btr0btr.cc mariadb-10.11.9/storage/innobase/btr/btr0btr.cc --- mariadb-10.11.6/storage/innobase/btr/btr0btr.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/btr/btr0btr.cc 2024-08-03 07:29:59.000000000 +0000 @@ -216,10 +216,11 @@ @param[in] merge whether change buffer merge should be attempted @param[in,out] mtr mini-transaction @param[out] err error code +@param[out] first set if this is a first-time access to the page @return block */ buf_block_t *btr_block_get(const dict_index_t &index, uint32_t page, rw_lock_type_t mode, bool merge, - mtr_t *mtr, dberr_t *err) + mtr_t *mtr, dberr_t *err, bool *first) { ut_ad(mode != RW_NO_LATCH); dberr_t local_err; @@ -242,6 +243,8 @@ *err= DB_PAGE_CORRUPTED; block= nullptr; } + else if (!buf_page_make_young_if_needed(&block->page) && first) + *first= true; } else if (*err == DB_DECRYPTION_FAILED) btr_decryption_failed(index); @@ -261,6 +264,8 @@ mtr_t* mtr, /*!< in: mtr */ dberr_t* err) /*!< out: error code */ { + ut_ad(mode != RW_NO_LATCH); + if (!index->table || !index->table->space) { *err= DB_TABLESPACE_NOT_FOUND; @@ -282,13 +287,12 @@ if (UNIV_LIKELY(block != nullptr)) { - if (UNIV_UNLIKELY(mode == RW_NO_LATCH)); - else if (!!page_is_comp(block->page.frame) != - index->table->not_redundant() || - btr_page_get_index_id(block->page.frame) != index->id || - !fil_page_index_page_check(block->page.frame) || - index->is_spatial() != - (fil_page_get_type(block->page.frame) == FIL_PAGE_RTREE)) + if (!!page_is_comp(block->page.frame) != + index->table->not_redundant() || + btr_page_get_index_id(block->page.frame) != index->id || + !fil_page_index_page_check(block->page.frame) || + index->is_spatial() != + (fil_page_get_type(block->page.frame) == FIL_PAGE_RTREE)) { *err= DB_PAGE_CORRUPTED; block= nullptr; @@ -302,6 +306,8 @@ *err= DB_CORRUPTION; block= nullptr; } + else + buf_page_make_young_if_needed(&block->page); } else if (*err == DB_DECRYPTION_FAILED) btr_decryption_failed(*index); @@ -553,13 +559,42 @@ root->page.frame)), 0, RW_X_LATCH, nullptr, BUF_GET, mtr, err); if (new_block) + { + buf_page_make_young_if_needed(&new_block->page); *err= flst_remove(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, new_block, - PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, mtr); + PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, + fil_system.sys_space->free_limit, mtr); + } ut_d(if (*err == DB_SUCCESS) flst_validate(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, mtr)); return new_block; } +static MY_ATTRIBUTE((nonnull, warn_unused_result)) +/** Acquire a latch on the index root page for allocating or freeing pages. +@param index index tree +@param mtr mini-transaction +@param err error code +@return root page +@retval nullptr if an error occurred */ +buf_block_t *btr_root_block_sx(dict_index_t *index, mtr_t *mtr, dberr_t *err) +{ + buf_block_t *root= + mtr->get_already_latched(page_id_t{index->table->space_id, index->page}, + MTR_MEMO_PAGE_SX_FIX); + if (!root) + { + root= btr_root_block_get(index, RW_SX_LATCH, mtr, err); + if (UNIV_UNLIKELY(!root)) + return root; + } +#ifdef BTR_CUR_HASH_ADAPT + else + ut_ad(!root->index || !root->index->freed()); +#endif + return root; +} + /**************************************************************//** Allocates a new file page to be used in an index tree. NOTE: we assume that the caller has made the reservation for free extents! @@ -581,21 +616,9 @@ page should be initialized. */ dberr_t* err) /*!< out: error code */ { - const auto savepoint= mtr->get_savepoint(); - buf_block_t *root= btr_root_block_get(index, RW_NO_LATCH, mtr, err); + buf_block_t *root= btr_root_block_sx(index, mtr, err); if (UNIV_UNLIKELY(!root)) return root; - - const bool have_latch= mtr->have_u_or_x_latch(*root); -#ifdef BTR_CUR_HASH_ADAPT - ut_ad(!have_latch || !root->index || !root->index->freed()); -#endif - mtr->rollback_to_savepoint(savepoint); - - if (!have_latch && - UNIV_UNLIKELY(!(root= btr_root_block_get(index, RW_SX_LATCH, mtr, err)))) - return root; - fseg_header_t *seg_header= root->page.frame + (level ? PAGE_HEADER + PAGE_BTR_SEG_TOP : PAGE_HEADER + PAGE_BTR_SEG_LEAF); return fseg_alloc_free_page_general(seg_header, hint_page_no, file_direction, @@ -644,7 +667,8 @@ buf_block_t *root= btr_get_latched_root(*index, mtr); dberr_t err= flst_add_first(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, - block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, mtr); + block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, + fil_system.sys_space->free_limit, mtr); ut_d(if (err == DB_SUCCESS) flst_validate(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, mtr)); return err; @@ -688,24 +712,16 @@ fil_space_t *space= index->table->space; dberr_t err; - const auto savepoint= mtr->get_savepoint(); - if (buf_block_t *root= btr_root_block_get(index, RW_NO_LATCH, mtr, &err)) + if (buf_block_t *root= btr_root_block_sx(index, mtr, &err)) { - const bool have_latch= mtr->have_u_or_x_latch(*root); -#ifdef BTR_CUR_HASH_ADAPT - ut_ad(!have_latch || !root->index || !root->index->freed()); -#endif - mtr->rollback_to_savepoint(savepoint); - if (have_latch || - (root= btr_root_block_get(index, RW_SX_LATCH, mtr, &err))) - err= fseg_free_page(&root->page.frame[blob || - page_is_leaf(block->page.frame) - ? PAGE_HEADER + PAGE_BTR_SEG_LEAF - : PAGE_HEADER + PAGE_BTR_SEG_TOP], - space, page, mtr, space_latched); + err= fseg_free_page(&root->page.frame[blob || + page_is_leaf(block->page.frame) + ? PAGE_HEADER + PAGE_BTR_SEG_LEAF + : PAGE_HEADER + PAGE_BTR_SEG_TOP], + space, page, mtr, space_latched); + if (err == DB_SUCCESS) + buf_page_free(space, page, mtr); } - if (err == DB_SUCCESS) - buf_page_free(space, page, mtr); /* The page was marked free in the allocation bitmap, but it should remain exclusively latched until mtr_t::commit() or until it @@ -873,7 +889,8 @@ /************************************************************//** Returns the upper level node pointer to a page. It is assumed that mtr holds an x-latch on the tree. -@return rec_get_offsets() of the node pointer record */ +@return rec_get_offsets() of the node pointer record +@retval nullptr on corruption */ static rec_offs* btr_page_get_father_block( @@ -1245,7 +1262,7 @@ { if (buf_block_t *block= buf_page_get_low({SRV_TMP_SPACE_ID, index->page}, 0, RW_X_LATCH, nullptr, BUF_GET, &mtr, - nullptr, false)) + nullptr, false, nullptr)) { btr_free_but_not_root(block, MTR_LOG_NO_REDO); mtr.set_log_mode(MTR_LOG_NO_REDO); @@ -1282,54 +1299,71 @@ return autoinc; } -/** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC, -or fall back to MAX(auto_increment_column). -@param[in] table table containing an AUTO_INCREMENT column -@param[in] col_no index of the AUTO_INCREMENT column -@return the AUTO_INCREMENT value -@retval 0 on error or if no AUTO_INCREMENT value was used yet */ -ib_uint64_t -btr_read_autoinc_with_fallback(const dict_table_t* table, unsigned col_no) +dict_index_t *dict_table_t::get_index(const dict_col_t &col) const { - ut_ad(table->persistent_autoinc); - ut_ad(!table->is_temporary()); + dict_index_t *index= dict_table_get_first_index(this); - dict_index_t* index = dict_table_get_first_index(table); + while (index && (index->fields[0].col != &col || index->is_corrupted())) + index= dict_table_get_next_index(index); - if (index == NULL) { - return 0; - } + return index; +} - mtr_t mtr; - mtr.start(); - buf_block_t* block = buf_page_get( - page_id_t(index->table->space_id, index->page), - index->table->space->zip_size(), - RW_S_LATCH, &mtr); - - ib_uint64_t autoinc = block - ? page_get_autoinc(block->page.frame) : 0; - const bool retry = block && autoinc == 0 - && !page_is_empty(block->page.frame); - mtr.commit(); +/** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC, +or fall back to MAX(auto_increment_column). +@param table table containing an AUTO_INCREMENT column +@param col_no index of the AUTO_INCREMENT column +@param mysql_version TABLE_SHARE::mysql_version +@param max the maximum value of the AUTO_INCREMENT column +@return the AUTO_INCREMENT value +@retval 0 on error or if no AUTO_INCREMENT value was used yet */ +uint64_t btr_read_autoinc_with_fallback(const dict_table_t *table, + unsigned col_no, ulong mysql_version, + uint64_t max) +{ + ut_ad(table->persistent_autoinc); + ut_ad(!table->is_temporary()); - if (retry) { - /* This should be an old data file where - PAGE_ROOT_AUTO_INC was initialized to 0. - Fall back to reading MAX(autoinc_col). - There should be an index on it. */ - const dict_col_t* autoinc_col - = dict_table_get_nth_col(table, col_no); - while (index && index->fields[0].col != autoinc_col) { - index = dict_table_get_next_index(index); - } + uint64_t autoinc= 0; + mtr_t mtr; + mtr.start(); - if (index) { - autoinc = row_search_max_autoinc(index); - } - } + if (buf_block_t *block= + buf_page_get(page_id_t(table->space_id, + dict_table_get_first_index(table)->page), + table->space->zip_size(), RW_SX_LATCH, &mtr)) + { + autoinc= page_get_autoinc(block->page.frame); + + if (autoinc > 0 && autoinc <= max && mysql_version >= 100210); + else if (dict_index_t *index= + table->get_index(*dict_table_get_nth_col(table, col_no))) + { + /* Read MAX(autoinc_col), in case this table had originally been + created before MariaDB 10.2.4 introduced persistent AUTO_INCREMENT + and MariaDB 10.2.10 fixed MDEV-12123, and there could be a garbage + value in the PAGE_ROOT_AUTO_INC field. */ + const uint64_t max_autoinc= row_search_max_autoinc(index); + const bool need_adjust{autoinc > max || autoinc < max_autoinc}; + ut_ad(max_autoinc <= max); - return autoinc; + if (UNIV_UNLIKELY(need_adjust) && !high_level_read_only && !opt_readonly) + { + sql_print_information("InnoDB: Resetting PAGE_ROOT_AUTO_INC from " + UINT64PF " to " UINT64PF + " on table %`.*s.%`s (created with version %lu)", + autoinc, max_autoinc, + int(table->name.dblen()), table->name.m_name, + table->name.basename(), mysql_version); + autoinc= max_autoinc; + index->set_modified(mtr); + page_set_autoinc(block, max_autoinc, &mtr, true); + } + } + } + + mtr.commit(); + return autoinc; } /** Write the next available AUTO_INCREMENT value to PAGE_ROOT_AUTO_INC. @@ -1351,6 +1385,7 @@ if (buf_block_t *root= buf_page_get(page_id_t(space->id, index->page), space->zip_size(), RW_SX_LATCH, &mtr)) { + buf_page_make_young_if_needed(&root->page); mtr.set_named_space(space); page_set_autoinc(root, autoinc, &mtr, reset); } @@ -2542,6 +2577,11 @@ offsets = btr_page_get_father_block(nullptr, heap, mtr, &cursor); + if (UNIV_UNLIKELY(!offsets)) { + mem_heap_free(heap); + return DB_CORRUPTION; + } + /* Replace the address of the old child node (= page) with the address of the new lower half */ @@ -3478,6 +3518,14 @@ offsets = btr_page_get_father_block(offsets, heap, mtr, &cursor); } + + if (UNIV_UNLIKELY(!offsets)) { +parent_corrupted: + mem_heap_free(heap); + *err = DB_CORRUPTION; + return nullptr; + } + father_block = btr_cur_get_block(&cursor); father_page_zip = buf_block_get_page_zip(father_block); @@ -3502,6 +3550,10 @@ &cursor); } + if (UNIV_UNLIKELY(!offsets)) { + goto parent_corrupted; + } + blocks[n_blocks++] = b = btr_cur_get_block(&cursor); } @@ -3717,6 +3769,11 @@ NULL, heap, mtr, &father_cursor); } + if (UNIV_UNLIKELY(!offsets)) { + err = DB_CORRUPTION; + goto func_exit; + } + if (adjust) { nth_rec = page_rec_get_n_recs_before(btr_cur_get_rec(cursor)); if (UNIV_UNLIKELY(!nth_rec || nth_rec == ULINT_UNDEFINED)) { diff -Nru mariadb-10.11.6/storage/innobase/btr/btr0bulk.cc mariadb-10.11.9/storage/innobase/btr/btr0bulk.cc --- mariadb-10.11.6/storage/innobase/btr/btr0bulk.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/btr/btr0bulk.cc 2024-08-03 07:29:59.000000000 +0000 @@ -52,6 +52,7 @@ if (m_page_no == FIL_NULL) { mtr_t alloc_mtr; + dberr_t err= DB_SUCCESS; /* We commit redo log for allocation by a separate mtr, because we don't guarantee pages are committed following @@ -60,28 +61,15 @@ alloc_mtr.start(); m_index->set_modified(alloc_mtr); - uint32_t n_reserved; - dberr_t err = fsp_reserve_free_extents( - &n_reserved, m_index->table->space, 1, FSP_NORMAL, - &alloc_mtr); - if (UNIV_UNLIKELY(err != DB_SUCCESS)) { -oom: - alloc_mtr.commit(); - m_mtr.commit(); - return err; - } - /* Allocate a new page. */ new_block = btr_page_alloc(m_index, 0, FSP_UP, m_level, &alloc_mtr, &m_mtr, &err); + alloc_mtr.commit(); if (!new_block) { - goto oom; + m_mtr.commit(); + return err; } - m_index->table->space->release_free_extents(n_reserved); - - alloc_mtr.commit(); - new_page = buf_block_get_frame(new_block); m_page_no = new_block->page.id().page_no(); @@ -849,7 +837,7 @@ m_block->page.fix(); /* No other threads can modify this block. */ - m_modify_clock = buf_block_get_modify_clock(m_block); + m_modify_clock = m_block->modify_clock; m_mtr.commit(); } @@ -969,10 +957,10 @@ /** Log free check */ inline void BtrBulk::logFreeCheck() { - if (log_sys.check_flush_or_checkpoint()) { + if (log_sys.check_for_checkpoint()) { release(); - log_check_margins(); + log_free_check(); latch(); } diff -Nru mariadb-10.11.6/storage/innobase/btr/btr0cur.cc mariadb-10.11.9/storage/innobase/btr/btr0cur.cc --- mariadb-10.11.6/storage/innobase/btr/btr0cur.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/btr/btr0cur.cc 2024-08-03 07:29:59.000000000 +0000 @@ -756,6 +756,7 @@ ulint compress_limit, const rec_t *rec) { + ut_ad(bpage.frame == page_align(rec)); if (UNIV_LIKELY_NULL(bpage.zip.data) && !page_zip_available(&bpage.zip, is_clust, node_ptr_max_size, 1)) return true; @@ -817,7 +818,7 @@ /* Determine the maximum length of the index field. */ field_max_size = dict_col_get_fixed_size(col, comp); - if (field_max_size) { + if (field_max_size && field->fixed_len) { /* dict_index_add_col() should guarantee this */ ut_ad(!field->prefix_len || field->fixed_len == field->prefix_len); @@ -935,7 +936,7 @@ return PAGE_CUR_LE; } -static MY_ATTRIBUTE((nonnull)) +MY_ATTRIBUTE((nonnull,warn_unused_result)) /** Acquire a latch on the previous page without violating the latching order. @param block index page @param page_id page identifier with valid space identifier @@ -946,8 +947,9 @@ @retval 0 if an error occurred @retval 1 if the page could be latched in the wrong order @retval -1 if the latch on block was temporarily released */ -int btr_latch_prev(buf_block_t *block, page_id_t page_id, ulint zip_size, - rw_lock_type_t rw_latch, mtr_t *mtr, dberr_t *err) +static int btr_latch_prev(buf_block_t *block, page_id_t page_id, + ulint zip_size, + rw_lock_type_t rw_latch, mtr_t *mtr, dberr_t *err) { ut_ad(rw_latch == RW_S_LATCH || rw_latch == RW_X_LATCH); ut_ad(page_id.space() == block->page.id().space()); @@ -955,47 +957,90 @@ const auto prev_savepoint= mtr->get_savepoint(); ut_ad(block == mtr->at_savepoint(prev_savepoint - 1)); - page_id.set_page_no(btr_page_get_prev(block->page.frame)); + const page_t *const page= block->page.frame; + page_id.set_page_no(btr_page_get_prev(page)); + /* We are holding a latch on the current page. + + We will start by buffer-fixing the left sibling. Waiting for a latch + on it while holding a latch on the current page could lead to a + deadlock, because another thread could hold that latch and wait for + a right sibling page latch (the current page). + + If there is a conflict, we will temporarily release our latch on the + current block while waiting for a latch on the left sibling. The + buffer-fixes on both blocks will prevent eviction. */ + + retry: + /* Pass no_wait pointer to ensure that we don't wait on the current page + latch while holding the next page latch to avoid latch ordering violation. */ + bool no_wait= false; + int ret= 1; + buf_block_t *prev= buf_page_get_gen(page_id, zip_size, RW_NO_LATCH, nullptr, - BUF_GET, mtr, err, false); + BUF_GET, mtr, err, false, &no_wait); if (UNIV_UNLIKELY(!prev)) + { + /* Check if we had to return because we couldn't wait on latch. */ + if (no_wait) + goto ordered_latch; return 0; + } - int ret= 1; - if (UNIV_UNLIKELY(rw_latch == RW_S_LATCH)) + static_assert(MTR_MEMO_PAGE_S_FIX == mtr_memo_type_t(BTR_SEARCH_LEAF), ""); + static_assert(MTR_MEMO_PAGE_X_FIX == mtr_memo_type_t(BTR_MODIFY_LEAF), ""); + + if (rw_latch == RW_S_LATCH + ? prev->page.lock.s_lock_try() : prev->page.lock.x_lock_try()) { - if (UNIV_LIKELY(prev->page.lock.s_lock_try())) + mtr->lock_register(prev_savepoint, mtr_memo_type_t(rw_latch)); + if (UNIV_UNLIKELY(prev->page.id() != page_id)) { - mtr->lock_register(prev_savepoint, MTR_MEMO_PAGE_S_FIX); - goto prev_latched; + fail: + /* the page was just read and found to be corrupted */ + mtr->rollback_to_savepoint(prev_savepoint); + return 0; } - block->page.lock.s_unlock(); } else { - if (UNIV_LIKELY(prev->page.lock.x_lock_try())) + ut_ad(mtr->at_savepoint(mtr->get_savepoint() - 1)->page.id() == page_id); + mtr->release_last_page(); +ordered_latch: + if (rw_latch == RW_S_LATCH) + block->page.lock.s_unlock(); + else + block->page.lock.x_unlock(); + + prev= buf_page_get_gen(page_id, zip_size, rw_latch, prev, + BUF_GET, mtr, err); + if (rw_latch == RW_S_LATCH) + block->page.lock.s_lock(); + else + block->page.lock.x_lock(); + + const page_id_t prev_page_id= page_id; + page_id.set_page_no(btr_page_get_prev(page)); + + if (UNIV_UNLIKELY(page_id != prev_page_id)) { - mtr->lock_register(prev_savepoint, MTR_MEMO_PAGE_X_FIX); - goto prev_latched; + mtr->release_last_page(); + if (page_id.page_no() == FIL_NULL) + return -1; + goto retry; } - block->page.lock.x_unlock(); - } - ret= -1; - mtr->lock_register(prev_savepoint - 1, MTR_MEMO_BUF_FIX); - mtr->rollback_to_savepoint(prev_savepoint); - prev= buf_page_get_gen(page_id, zip_size, rw_latch, prev, - BUF_GET, mtr, err, false); - if (UNIV_UNLIKELY(!prev)) - return 0; - mtr->upgrade_buffer_fix(prev_savepoint - 1, rw_latch); + if (UNIV_UNLIKELY(!prev)) + goto fail; - prev_latched: - if (memcmp_aligned<2>(FIL_PAGE_TYPE + prev->page.frame, - FIL_PAGE_TYPE + block->page.frame, 2) || - memcmp_aligned<2>(PAGE_HEADER + PAGE_INDEX_ID + prev->page.frame, - PAGE_HEADER + PAGE_INDEX_ID + block->page.frame, 8) || - page_is_comp(prev->page.frame) != page_is_comp(block->page.frame)) + ret= -1; + } + + const page_t *const p= prev->page.frame; + if (memcmp_aligned<4>(FIL_PAGE_NEXT + p, FIL_PAGE_OFFSET + page, 4) || + memcmp_aligned<2>(FIL_PAGE_TYPE + p, FIL_PAGE_TYPE + page, 2) || + memcmp_aligned<2>(PAGE_HEADER + PAGE_INDEX_ID + p, + PAGE_HEADER + PAGE_INDEX_ID + page, 8) || + page_is_comp(p) != page_is_comp(page)) { ut_ad("corrupted" == 0); // FIXME: remove this *err= DB_CORRUPTION; @@ -1156,6 +1201,19 @@ mtr_s_lock_index(index(), mtr); } + dberr_t err; + + if (!index()->table->space) + { + corrupted: + ut_ad("corrupted" == 0); // FIXME: remove this + err= DB_CORRUPTION; + func_exit: + if (UNIV_LIKELY_NULL(heap)) + mem_heap_free(heap); + return err; + } + const ulint zip_size= index()->table->space->zip_size(); /* Start with the root page. */ @@ -1169,7 +1227,6 @@ low_bytes= 0; ulint buf_mode= BUF_GET; search_loop: - dberr_t err; auto block_savepoint= mtr->get_savepoint(); buf_block_t *block= buf_page_get_gen(page_id, zip_size, rw_latch, guess, buf_mode, mtr, @@ -1181,10 +1238,7 @@ btr_decryption_failed(*index()); /* fall through */ default: - func_exit: - if (UNIV_LIKELY_NULL(heap)) - mem_heap_free(heap); - return err; + goto func_exit; case DB_SUCCESS: /* This must be a search to perform an insert, delete mark, or delete; try using the change buffer */ @@ -1251,16 +1305,11 @@ btr_page_get_index_id(block->page.frame) != index()->id || fil_page_get_type(block->page.frame) == FIL_PAGE_RTREE || !fil_page_index_page_check(block->page.frame)) - { - corrupted: - ut_ad("corrupted" == 0); // FIXME: remove this - err= DB_CORRUPTION; - goto func_exit; - } + goto corrupted; page_cur.block= block; ut_ad(block == mtr->at_savepoint(block_savepoint)); - ut_ad(rw_latch != RW_NO_LATCH); + const bool not_first_access{buf_page_make_young_if_needed(&block->page)}; #ifdef UNIV_ZIP_DEBUG if (const page_zip_des_t *page_zip= buf_block_get_page_zip(block)) ut_a(page_zip_validate(page_zip, block->page.frame, index())); @@ -1400,11 +1449,6 @@ !btr_block_get(*index(), btr_page_get_next(block->page.frame), RW_X_LATCH, false, mtr, &err)) goto func_exit; - if (btr_cur_need_opposite_intention(block->page, index()->is_clust(), - lock_intention, - node_ptr_max_size, compress_limit, - page_cur.rec)) - goto need_opposite_intention; } reached_latched_leaf: @@ -1426,6 +1470,13 @@ ut_ad(up_match != ULINT_UNDEFINED || mode != PAGE_CUR_LE); ut_ad(low_match != ULINT_UNDEFINED || mode != PAGE_CUR_LE); + if (latch_mode == BTR_MODIFY_TREE && + btr_cur_need_opposite_intention(block->page, index()->is_clust(), + lock_intention, + node_ptr_max_size, compress_limit, + page_cur.rec)) + goto need_opposite_intention; + #ifdef BTR_CUR_HASH_ADAPT /* We do a dirty read of btr_search_enabled here. We will properly check btr_search_enabled again in @@ -1539,6 +1590,9 @@ case BTR_SEARCH_PREV: /* btr_pcur_move_to_prev() */ ut_ad(rw_latch == RW_S_LATCH || rw_latch == RW_X_LATCH); + if (!not_first_access) + buf_read_ahead_linear(page_id, zip_size, false); + if (page_has_prev(block->page.frame) && page_rec_is_first(page_cur.rec, block->page.frame)) { @@ -1578,6 +1632,8 @@ buf_mode= btr_op == BTR_DELETE_OP ? BUF_GET_IF_IN_POOL_OR_WATCH : BUF_GET_IF_IN_POOL; + else if (!not_first_access) + buf_read_ahead_linear(page_id, zip_size, false); break; case BTR_MODIFY_TREE: ut_ad(rw_latch == RW_X_LATCH); @@ -1611,6 +1667,14 @@ slot.type= MTR_MEMO_X_LOCK; } +/** Mark a non-leaf page "least recently used", but avoid invoking +buf_page_t::set_accessed(), because we do not want linear read-ahead */ +static void btr_cur_nonleaf_make_young(buf_page_t *bpage) +{ + if (UNIV_UNLIKELY(buf_page_peek_if_too_old(bpage))) + buf_page_make_young(bpage); +} + ATTRIBUTE_COLD dberr_t btr_cur_t::pessimistic_search_leaf(const dtuple_t *tuple, page_cur_mode_t mode, mtr_t *mtr) @@ -1713,6 +1777,8 @@ if (height != btr_page_get_level(block->page.frame)) goto corrupted; + btr_cur_nonleaf_make_young(&block->page); + #ifdef UNIV_ZIP_DEBUG const page_zip_des_t *page_zip= buf_block_get_page_zip(block); ut_a(!page_zip || page_zip_validate(page_zip, block->page.frame, index())); @@ -1799,6 +1865,8 @@ btr_decryption_failed(*index); goto func_exit; } + else + btr_cur_nonleaf_make_young(&block->page); #ifdef UNIV_ZIP_DEBUG if (const page_zip_des_t *page_zip= buf_block_get_page_zip(block)) @@ -1934,18 +2002,15 @@ ut_ad(n_blocks < BTR_MAX_LEVELS); ut_ad(savepoint + n_blocks == mtr->get_savepoint()); + bool first_access= false; buf_block_t* block= btr_block_get(*index, page, height ? upper_rw_latch : root_leaf_rw_latch, - !height, mtr, &err); + !height, mtr, &err, &first_access); ut_ad(!block == (err != DB_SUCCESS)); if (!block) - { - if (err == DB_DECRYPTION_FAILED) - btr_decryption_failed(*index); break; - } if (first) page_cur_set_before_first(block, &page_cur); @@ -2029,10 +2094,16 @@ offsets= rec_get_offsets(page_cur.rec, index, offsets, 0, ULINT_UNDEFINED, &heap); + page= btr_node_ptr_get_child_page_no(page_cur.rec, offsets); ut_ad(latch_mode != BTR_MODIFY_TREE || upper_rw_latch == RW_X_LATCH); - if (latch_mode != BTR_MODIFY_TREE); + if (latch_mode != BTR_MODIFY_TREE) + { + if (!height && first && first_access) + buf_read_ahead_linear(page_id_t(block->page.id().space(), page), + block->page.zip_size(), false); + } else if (btr_cur_need_opposite_intention(block->page, index->is_clust(), lock_intention, node_ptr_max_size, compress_limit, @@ -2070,7 +2141,6 @@ } /* Go to the child node */ - page= btr_node_ptr_get_child_page_no(page_cur.rec, offsets); n_blocks++; } @@ -3837,22 +3907,14 @@ const page_id_t block_id{block->page.id()}; const page_id_t prev_id(block_id.space(), prev_page_no); - dberr_t err; buf_block_t* prev_block - = buf_page_get_gen(prev_id, 0, RW_NO_LATCH, nullptr, - BUF_PEEK_IF_IN_POOL, mtr, &err); - /* Since we already held an x-latch on prev_block, it must - be available and not be corrupted unless the buffer pool got - corrupted somehow. */ + = mtr->get_already_latched(prev_id, MTR_MEMO_PAGE_X_FIX); if (UNIV_UNLIKELY(!prev_block)) { - return err; + return DB_CORRUPTION; } ut_ad(!memcmp_aligned<4>(prev_block->page.frame + FIL_PAGE_NEXT, block->page.frame + FIL_PAGE_OFFSET, 4)); - /* We must already have an x-latch on prev_block! */ - ut_ad(mtr->memo_contains_flagged(prev_block, MTR_MEMO_PAGE_X_FIX)); - lock_rec_reset_and_inherit_gap_locks(*prev_block, block_id, PAGE_HEAP_NO_SUPREMUM, page_rec_get_heap_no(rec)); @@ -6077,7 +6139,6 @@ for (ulint blob_npages = 0;; ++blob_npages) { buf_block_t* block; const ulint commit_freq = 4; - uint32_t r_extents; ut_ad(page_align(field_ref) == page_align(rec)); @@ -6112,22 +6173,14 @@ hint_prev = rec_block->page.id().page_no(); } - error = fsp_reserve_free_extents( - &r_extents, index->table->space, 1, - FSP_BLOB, &mtr, 1); - if (UNIV_UNLIKELY(error != DB_SUCCESS)) { -alloc_fail: - mtr.commit(); - goto func_exit; - } - block = btr_page_alloc(index, hint_prev + 1, FSP_NO_DIR, 0, &mtr, &mtr, &error); - index->table->space->release_free_extents(r_extents); if (!block) { - goto alloc_fail; +alloc_fail: + mtr.commit(); + goto func_exit; } const uint32_t space_id = block->page.id().space(); @@ -6660,6 +6713,10 @@ mtr.commit(); return copied_len; } + if (!buf_page_make_young_if_needed(&block->page)) { + buf_read_ahead_linear(id, 0, false); + } + page = buf_block_get_frame(block); blob_header = page + offset; diff -Nru mariadb-10.11.6/storage/innobase/btr/btr0pcur.cc mariadb-10.11.9/storage/innobase/btr/btr0pcur.cc --- mariadb-10.11.6/storage/innobase/btr/btr0pcur.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/btr/btr0pcur.cc 2024-08-03 07:29:59.000000000 +0000 @@ -25,9 +25,10 @@ *******************************************************/ #include "btr0pcur.h" -#include "ut0byte.h" +#include "buf0rea.h" #include "rem0cmp.h" #include "trx0trx.h" +#include "ibuf0ibuf.h" /**************************************************************//** Resets a persistent cursor object, freeing ::old_rec_buf if it is @@ -178,10 +179,8 @@ cursor->old_n_fields, &cursor->old_rec_buf, &cursor->buf_size); - cursor->block_when_stored.store(block); - - /* Function try to check if block is S/X latch. */ - cursor->modify_clock = buf_block_get_modify_clock(block); + cursor->old_page_id = block->page.id(); + cursor->modify_clock = block->modify_clock; } /**************************************************************//** @@ -213,99 +212,80 @@ } /** Optimistically latches the leaf page or pages requested. -@param[in] block guessed buffer block -@param[in,out] pcur cursor -@param[in,out] latch_mode BTR_SEARCH_LEAF, ... -@param[in,out] mtr mini-transaction -@return true if success */ +@param pcur persistent cursor +@param latch_mode BTR_SEARCH_LEAF, ... +@param mtr mini-transaction +@return true on success */ TRANSACTIONAL_TARGET -static bool btr_pcur_optimistic_latch_leaves(buf_block_t *block, - btr_pcur_t *pcur, +static bool btr_pcur_optimistic_latch_leaves(btr_pcur_t *pcur, btr_latch_mode *latch_mode, mtr_t *mtr) { - ut_ad(block->page.buf_fix_count()); - ut_ad(block->page.in_file()); - ut_ad(block->page.frame); - static_assert(BTR_SEARCH_PREV & BTR_SEARCH_LEAF, ""); static_assert(BTR_MODIFY_PREV & BTR_MODIFY_LEAF, ""); static_assert((BTR_SEARCH_PREV ^ BTR_MODIFY_PREV) == (RW_S_LATCH ^ RW_X_LATCH), ""); + buf_block_t *const block= + buf_page_optimistic_fix(pcur->btr_cur.page_cur.block, pcur->old_page_id); + + if (!block) + return false; + + if (*latch_mode == BTR_SEARCH_LEAF || *latch_mode == BTR_MODIFY_LEAF) + return buf_page_optimistic_get(block, rw_lock_type_t(*latch_mode), + pcur->modify_clock, mtr); + + ut_ad(*latch_mode == BTR_SEARCH_PREV || *latch_mode == BTR_MODIFY_PREV); const rw_lock_type_t mode= rw_lock_type_t(*latch_mode & (RW_X_LATCH | RW_S_LATCH)); - switch (*latch_mode) { - default: - ut_ad(*latch_mode == BTR_SEARCH_LEAF || *latch_mode == BTR_MODIFY_LEAF); - return buf_page_optimistic_get(mode, block, pcur->modify_clock, mtr); - case BTR_SEARCH_PREV: - case BTR_MODIFY_PREV: - page_id_t id{0}; - uint32_t left_page_no; - ulint zip_size; - buf_block_t *left_block= nullptr; - { - transactional_shared_lock_guard g{block->page.lock}; - if (block->modify_clock != pcur->modify_clock) - return false; - id= block->page.id(); - zip_size= block->zip_size(); - left_page_no= btr_page_get_prev(block->page.frame); - } - - if (left_page_no != FIL_NULL) - { - left_block= - buf_page_get_gen(page_id_t(id.space(), left_page_no), zip_size, - mode, nullptr, BUF_GET_POSSIBLY_FREED, mtr); - - if (left_block && - btr_page_get_next(left_block->page.frame) != id.page_no()) - { -release_left_block: - mtr->release_last_page(); - return false; - } - } - - if (buf_page_optimistic_get(mode, block, pcur->modify_clock, mtr)) - { - if (btr_page_get_prev(block->page.frame) == left_page_no) - { - /* block was already buffer-fixed while entering the function and - buf_page_optimistic_get() buffer-fixes it again. */ - ut_ad(2 <= block->page.buf_fix_count()); - *latch_mode= btr_latch_mode(mode); - return true; - } - - mtr->release_last_page(); - } - - ut_ad(block->page.buf_fix_count()); - if (left_block) - goto release_left_block; - return false; + uint64_t modify_clock; + uint32_t left_page_no; + const page_t *const page= block->page.frame; + { + transactional_shared_lock_guard g{block->page.lock}; + modify_clock= block->modify_clock; + left_page_no= btr_page_get_prev(page); } -} -/** Structure acts as functor to do the latching of leaf pages. -It returns true if latching of leaf pages succeeded and false -otherwise. */ -struct optimistic_latch_leaves -{ - btr_pcur_t *const cursor; - btr_latch_mode *const latch_mode; - mtr_t *const mtr; + const auto savepoint= mtr->get_savepoint(); + mtr->memo_push(block, MTR_MEMO_BUF_FIX); - bool operator()(buf_block_t *hint) const + if (UNIV_UNLIKELY(modify_clock != pcur->modify_clock)) { - return hint && - btr_pcur_optimistic_latch_leaves(hint, cursor, latch_mode, mtr); + fail: + mtr->rollback_to_savepoint(savepoint); + return false; } -}; + + buf_block_t *prev; + if (left_page_no != FIL_NULL) + { + prev= buf_page_get_gen(page_id_t(pcur->old_page_id.space(), + left_page_no), block->zip_size(), + mode, nullptr, BUF_GET_POSSIBLY_FREED, mtr); + if (!prev || + page_is_comp(prev->page.frame) != page_is_comp(block->page.frame) || + memcmp_aligned<2>(block->page.frame, prev->page.frame, 2) || + memcmp_aligned<2>(block->page.frame + PAGE_HEADER + PAGE_INDEX_ID, + prev->page.frame + PAGE_HEADER + PAGE_INDEX_ID, 8)) + goto fail; + } + else + prev= nullptr; + + mtr->upgrade_buffer_fix(savepoint, mode); + + if (UNIV_UNLIKELY(block->modify_clock != modify_clock) || + UNIV_UNLIKELY(block->page.is_freed()) || + (prev && + memcmp_aligned<4>(FIL_PAGE_NEXT + prev->page.frame, + FIL_PAGE_OFFSET + page, 4))) + goto fail; + + return true; +} /** Restores the stored position of a persistent cursor bufferfixing the page and obtaining the specified latches. If the cursor position @@ -328,6 +308,7 @@ record with the same unique field values as in the stored record, btr_pcur_t::NOT_SAME cursor position is not on user rec or points on the record with not the samebuniq field values as in the stored */ +TRANSACTIONAL_TARGET btr_pcur_t::restore_status btr_pcur_t::restore_position(btr_latch_mode restore_latch_mode, mtr_t *mtr) { @@ -358,7 +339,6 @@ latch_mode = BTR_LATCH_MODE_WITHOUT_INTENTION(restore_latch_mode); pos_state = BTR_PCUR_IS_POSITIONED; - block_when_stored.clear(); return restore_status::NOT_SAME; } @@ -375,9 +355,8 @@ case BTR_SEARCH_PREV: case BTR_MODIFY_PREV: /* Try optimistic restoration. */ - if (block_when_stored.run_with_hint( - optimistic_latch_leaves{this, &restore_latch_mode, - mtr})) { + if (btr_pcur_optimistic_latch_leaves(this, &restore_latch_mode, + mtr)) { pos_state = BTR_PCUR_IS_POSITIONED; latch_mode = restore_latch_mode; @@ -482,16 +461,22 @@ since the cursor can now be on a different page! But we can retain the value of old_rec */ - block_when_stored.store(btr_pcur_get_block(this)); - modify_clock= buf_block_get_modify_clock( - block_when_stored.block()); + old_page_id = btr_cur.page_cur.block->page.id(); + modify_clock = btr_cur.page_cur.block->modify_clock; mem_heap_free(heap); return restore_status::SAME_ALL; } - if (n_matched_fields >= index->n_uniq) - ret_val= restore_status::SAME_UNIQ; + if (n_matched_fields >= index->n_uniq + /* Unique indexes can contain "NULL" keys, and if all + unique fields are NULL and not all tuple + fields match to record fields, then treat it as if + restored cursor position points to the record with + not the same unique key. */ + && !(index->n_nullable + && dtuple_contains_null(tuple, index->n_uniq))) + ret_val= restore_status::SAME_UNIQ; } mem_heap_free(heap); @@ -539,10 +524,11 @@ } dberr_t err; + bool first_access = false; buf_block_t* next_block = btr_block_get( *cursor->index(), next_page_no, rw_lock_type_t(cursor->latch_mode & (RW_X_LATCH | RW_S_LATCH)), - page_is_leaf(page), mtr, &err); + page_is_leaf(page), mtr, &err, &first_access); if (UNIV_UNLIKELY(!next_block)) { return err; @@ -561,6 +547,11 @@ const auto s = mtr->get_savepoint(); mtr->rollback_to_savepoint(s - 2, s - 1); + if (first_access) { + buf_read_ahead_linear(next_block->page.id(), + next_block->zip_size(), + ibuf_inside(mtr)); + } return DB_SUCCESS; } @@ -603,40 +594,33 @@ return true; } - buf_block_t* block = btr_pcur_get_block(cursor); - - if (page_has_prev(block->page.frame)) { - buf_block_t* left_block - = mtr->at_savepoint(mtr->get_savepoint() - 1); - const page_t* const left = left_block->page.frame; - if (memcmp_aligned<4>(left + FIL_PAGE_NEXT, - block->page.frame - + FIL_PAGE_OFFSET, 4)) { - /* This should be the right sibling page, or - if there is none, the current block. */ - ut_ad(left_block == block - || !memcmp_aligned<4>(left + FIL_PAGE_PREV, - block->page.frame - + FIL_PAGE_OFFSET, 4)); - /* The previous one must be the left sibling. */ - left_block - = mtr->at_savepoint(mtr->get_savepoint() - 2); - ut_ad(!memcmp_aligned<4>(left_block->page.frame - + FIL_PAGE_NEXT, - block->page.frame - + FIL_PAGE_OFFSET, 4)); - } + buf_block_t* block = mtr->at_savepoint(0); + ut_ad(block == btr_pcur_get_block(cursor)); + const page_t* const page = block->page.frame; + /* btr_pcur_optimistic_latch_leaves() will acquire a latch on + the preceding page if one exists; + if that fails, btr_cur_t::search_leaf() invoked by + btr_pcur_open_with_no_init() will also acquire a latch on the + succeeding page. Our caller only needs one page latch. */ + ut_ad(mtr->get_savepoint() <= 3); + + if (page_has_prev(page)) { + buf_block_t* const left_block = mtr->at_savepoint(1); + ut_ad(!memcmp_aligned<4>(page + FIL_PAGE_OFFSET, + left_block->page.frame + + FIL_PAGE_NEXT, 4)); if (btr_pcur_is_before_first_on_page(cursor)) { + /* Reposition on the previous page. */ page_cur_set_after_last(left_block, &cursor->btr_cur.page_cur); /* Release the right sibling. */ - } else { - /* Release the left sibling. */ + mtr->rollback_to_savepoint(0, 1); block = left_block; } - mtr->release(*block); } + mtr->rollback_to_savepoint(1); + ut_ad(block == mtr->at_savepoint(0)); cursor->latch_mode = latch_mode; cursor->old_rec = nullptr; return false; diff -Nru mariadb-10.11.6/storage/innobase/btr/btr0sea.cc mariadb-10.11.9/storage/innobase/btr/btr0sea.cc --- mariadb-10.11.6/storage/innobase/btr/btr0sea.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/btr/btr0sea.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1143,7 +1143,6 @@ } block->page.fix(); - block->page.set_accessed(); buf_page_make_young_if_needed(&block->page); static_assert(ulint{MTR_MEMO_PAGE_S_FIX} == ulint{BTR_SEARCH_LEAF}, ""); diff -Nru mariadb-10.11.6/storage/innobase/buf/buf0block_hint.cc mariadb-10.11.9/storage/innobase/buf/buf0block_hint.cc --- mariadb-10.11.6/storage/innobase/buf/buf0block_hint.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/buf/buf0block_hint.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2020, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2020, 2021, MariaDB Corporation. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License, version 2.0, as published by the -Free Software Foundation. - -This program is also distributed with certain software (including but not -limited to OpenSSL) that is licensed under separate terms, as designated in a -particular file or component or in included license documentation. The authors -of MySQL hereby grant you an additional permission to link the program and -your derivative works with the separately licensed software that they have -included with MySQL. - -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, version 2.0, -for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*****************************************************************************/ - -#include "buf0block_hint.h" -namespace buf { - -TRANSACTIONAL_TARGET -void Block_hint::buffer_fix_block_if_still_valid() -{ - /* To check if m_block belongs to the current buf_pool, we must - prevent freeing memory while we check, and until we buffer-fix the - block. For this purpose it is enough to latch any of the many - latches taken by buf_pool_t::resize(). - - Similar to buf_page_optimistic_get(), we must validate - m_block->page.id() after acquiring the hash_lock, because the object - may have been freed and not actually attached to buf_pool.page_hash - at the moment. (The block could have been reused to store a - different page, and that slice of buf_pool.page_hash could be protected - by another hash_lock that we are not holding.) - - Finally, we must ensure that the block is not being freed. */ - if (m_block) - { - auto &cell= buf_pool.page_hash.cell_get(m_page_id.fold()); - transactional_shared_lock_guard g - {buf_pool.page_hash.lock_get(cell)}; - if (buf_pool.is_uncompressed(m_block) && m_page_id == m_block->page.id() && - m_block->page.frame && m_block->page.in_file()) - m_block->page.fix(); - else - clear(); - } -} -} // namespace buf diff -Nru mariadb-10.11.6/storage/innobase/buf/buf0buf.cc mariadb-10.11.9/storage/innobase/buf/buf0buf.cc --- mariadb-10.11.6/storage/innobase/buf/buf0buf.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/buf/buf0buf.cc 2024-08-03 07:29:59.000000000 +0000 @@ -77,6 +77,8 @@ if (srv_numa_interleave) { struct bitmask *numa_mems_allowed = numa_get_mems_allowed(); + MEM_MAKE_DEFINED(numa_mems_allowed, + sizeof *numa_mems_allowed); ib::info() << "Setting NUMA memory policy to" " MPOL_INTERLEAVE"; if (set_mempolicy(MPOL_INTERLEAVE, @@ -404,7 +406,7 @@ if (id.space() == SRV_TMP_SPACE_ID && innodb_encrypt_temporary_tables) { - slot = buf_pool.io_buf_reserve(); + slot = buf_pool.io_buf_reserve(false); slot->allocate(); bool ok = buf_tmp_page_decrypt(slot->crypt_buf, dst_frame); slot->release(); @@ -426,7 +428,7 @@ return false; } - slot = buf_pool.io_buf_reserve(); + slot = buf_pool.io_buf_reserve(false); slot->allocate(); decompress_with_slot: @@ -449,7 +451,7 @@ return false; } - slot = buf_pool.io_buf_reserve(); + slot = buf_pool.io_buf_reserve(false); slot->allocate(); /* decrypt using crypt_buf to dst_frame */ @@ -742,6 +744,205 @@ #ifndef UNIV_INNOCHECKSUM +#ifdef __linux__ +#include +#include +#include + +/** Memory Pressure + +based off https://www.kernel.org/doc/html/latest/accounting/psi.html#pressure-interface +and https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html#memory */ +class mem_pressure +{ + /* triggers + eventfd */ + struct pollfd m_fds[3]; + nfds_t m_num_fds; + int m_event_fd= -1; + Atomic_relaxed m_abort= false; + + std::thread m_thd; + /* mem pressure garbage collection restricted to interval */ + static constexpr ulonglong max_interval_us= 60*1000000; + +public: + mem_pressure() : m_num_fds(0) {} + + bool setup() + { + static_assert(array_elements(m_fds) == (array_elements(m_triggers) + 1), + "insufficient fds"); + std::string memcgroup{"/sys/fs/cgroup"}; + std::string cgroup; + { + std::ifstream selfcgroup("/proc/self/cgroup"); + std::getline(selfcgroup, cgroup, '\n'); + } + + cgroup.erase(0, 3); // Remove "0::" + memcgroup+= cgroup + "/memory.pressure"; + + m_num_fds= 0; + for (auto trig= std::begin(m_triggers); trig!= std::end(m_triggers); ++trig) + { + if ((m_fds[m_num_fds].fd= + open(memcgroup.c_str(), O_RDWR | O_NONBLOCK | O_CLOEXEC)) < 0) + { + /* User can't do anything about it, no point giving warning */ + shutdown(); + return false; + } + my_register_filename(m_fds[m_num_fds].fd, memcgroup.c_str(), FILE_BY_OPEN, 0, MYF(0)); + ssize_t slen= strlen(*trig); + if (write(m_fds[m_num_fds].fd, *trig, slen) < slen) + { + /* we may fail this one, but continue to the next */ + my_close(m_fds[m_num_fds].fd, MYF(MY_WME)); + continue; + } + m_fds[m_num_fds].events= POLLPRI; + m_num_fds++; + } + if (m_num_fds < 1) + return false; + + if ((m_event_fd= eventfd(0, EFD_CLOEXEC|EFD_NONBLOCK)) == -1) + { + /* User can't do anything about it, no point giving warning */ + shutdown(); + return false; + } + my_register_filename(m_event_fd, "mem_pressure_eventfd", FILE_BY_DUP, 0, MYF(0)); + m_fds[m_num_fds].fd= m_event_fd; + m_fds[m_num_fds].events= POLLIN; + m_num_fds++; + m_thd= std::thread(pressure_routine, this); + sql_print_information("InnoDB: Initialized memory pressure event listener"); + return true; + } + + void shutdown() + { + /* m_event_fd is in this list */ + while (m_num_fds) + { + m_num_fds--; + my_close(m_fds[m_num_fds].fd, MYF(MY_WME)); + m_fds[m_num_fds].fd= -1; + } + } + + static void pressure_routine(mem_pressure *m); + +#ifdef UNIV_DEBUG + void trigger_collection() + { + uint64_t u= 1; + if (m_event_fd >=0 && write(m_event_fd, &u, sizeof(uint64_t)) != sizeof(uint64_t)) + sql_print_information("InnoDB: (Debug) Failed to trigger memory pressure"); + else /* assumed failed to meet intialization criteria, so trigger directy */ + buf_pool.garbage_collect(); + } +#endif + + void quit() + { + uint64_t u= 1; + m_abort= true; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-result" + /* return result ignored, cannot do anything with it */ + write(m_event_fd, &u, sizeof(uint64_t)); +#pragma GCC diagnostic pop + } + + void join() + { + if (m_thd.joinable()) + { + quit(); + m_thd.join(); + } + } + + static const char* const m_triggers[2]; +}; + + +/* + ref: https://docs.kernel.org/accounting/psi.html + maximum window size (second number) 10 seconds. + window size in multiples of 2 second interval required (for Unprivileged) + Time is in usec. +*/ +const char* const mem_pressure::m_triggers[]= + {"some 5000000 10000000", /* 5s out of 10s */ + "full 10000 2000000"}; /* 10ms out of 2s */ + +static mem_pressure mem_pressure_obj; + +void mem_pressure::pressure_routine(mem_pressure *m) +{ + DBUG_ASSERT(m == &mem_pressure_obj); + if (my_thread_init()) + { + m->shutdown(); + return; + } + + ulonglong last= microsecond_interval_timer() - max_interval_us; + while (!m->m_abort) + { + if (poll(&m->m_fds[0], m->m_num_fds, -1) < 0) + { + if (errno == EINTR) + continue; + else + break; + } + if (!m->m_abort) + break; + + for (pollfd &p : st_::span(m->m_fds, m->m_num_fds)) + { + if (p.revents & POLLPRI) + { + ulonglong now= microsecond_interval_timer(); + if ((now - last) > max_interval_us) + { + last= now; + buf_pool.garbage_collect(); + } + } + +#ifdef UNIV_DEBUG + if (p.revents & POLLIN) + { + uint64_t u; + /* we haven't aborted, so this must be a debug trigger */ + if (read(p.fd, &u, sizeof(u)) >=0) + buf_pool.garbage_collect(); + } +#endif + } + } + m->shutdown(); + + my_thread_end(); +} + +/** Initialize mem pressure. */ +ATTRIBUTE_COLD void buf_mem_pressure_detect_init() +{ + mem_pressure_obj.setup(); +} + +ATTRIBUTE_COLD void buf_mem_pressure_shutdown() +{ + mem_pressure_obj.join(); +} +#endif /* __linux__ */ + #if defined(DBUG_OFF) && defined(HAVE_MADVISE) && defined(MADV_DODUMP) /** Enable buffers to be dumped to core files @@ -863,6 +1064,7 @@ if (srv_numa_interleave) { struct bitmask *numa_mems_allowed= numa_get_mems_allowed(); + MEM_MAKE_DEFINED(numa_mems_allowed, sizeof *numa_mems_allowed); if (mbind(mem, mem_size(), MPOL_INTERLEAVE, numa_mems_allowed->maskp, numa_mems_allowed->size, MPOL_MF_MOVE)) @@ -1099,6 +1301,11 @@ chunk_t::map_ref= chunk_t::map_reg; buf_LRU_old_ratio_update(100 * 3 / 8, false); btr_search_sys_create(); + +#ifdef __linux__ + if (srv_operation == SRV_OPERATION_NORMAL) + buf_mem_pressure_detect_init(); +#endif ut_ad(is_initialised()); return false; } @@ -1300,14 +1507,17 @@ n_slots= 0; } -buf_tmp_buffer_t *buf_pool_t::io_buf_t::reserve() +buf_tmp_buffer_t *buf_pool_t::io_buf_t::reserve(bool wait_for_reads) { for (;;) { for (buf_tmp_buffer_t *s= slots, *e= slots + n_slots; s != e; s++) if (s->acquire()) return s; + buf_dblwr.flush_buffered_writes(); os_aio_wait_until_no_pending_writes(true); + if (!wait_for_reads) + continue; for (buf_tmp_buffer_t *s= slots, *e= slots + n_slots; s != e; s++) if (s->acquire()) return s; @@ -1384,17 +1594,14 @@ /* reserve free_list length */ if (UT_LIST_GET_LEN(withdraw) < withdraw_target) { - buf_flush_LRU( - std::max(withdraw_target - - UT_LIST_GET_LEN(withdraw), - srv_LRU_scan_depth), - true); - mysql_mutex_unlock(&buf_pool.mutex); - buf_dblwr.flush_buffered_writes(); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - buf_flush_wait_LRU_batch_end(); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - mysql_mutex_lock(&buf_pool.mutex); + try_LRU_scan = false; + mysql_mutex_unlock(&mutex); + mysql_mutex_lock(&flush_list_mutex); + page_cleaner_wakeup(true); + my_cond_wait(&done_flush_list, + &flush_list_mutex.m_mutex); + mysql_mutex_unlock(&flush_list_mutex); + mysql_mutex_lock(&mutex); } /* relocate blocks/buddies in withdrawn area */ @@ -1536,6 +1743,7 @@ inline void buf_pool_t::resize() { ut_ad(this == &buf_pool); + ut_ad(srv_shutdown_state < SRV_SHUTDOWN_CLEANUP); bool warning = false; @@ -1878,6 +2086,100 @@ return; } +#ifdef __linux__ +inline void buf_pool_t::garbage_collect() +{ + mysql_mutex_lock(&mutex); + size_t freed= 0; + +#ifdef BTR_CUR_HASH_ADAPT + /* buf_LRU_free_page() will temporarily release and reacquire + buf_pool.mutex for invoking btr_search_drop_page_hash_index(). Thus, + we must protect ourselves with the hazard pointer. */ +rescan: +#else + lru_hp.set(nullptr); +#endif + for (buf_page_t *bpage= UT_LIST_GET_LAST(LRU), *prev; bpage; bpage= prev) + { + prev= UT_LIST_GET_PREV(LRU, bpage); +#ifdef BTR_CUR_HASH_ADAPT + lru_hp.set(prev); +#endif + auto state= bpage->state(); + ut_ad(state >= buf_page_t::FREED); + ut_ad(bpage->in_LRU_list); + + /* We try to free any pages that can be freed without writing out + anything. */ + switch (bpage->oldest_modification()) { + case 0: + try_to_evict: + if (buf_LRU_free_page(bpage, true)) + { + evicted: + freed++; +#ifdef BTR_CUR_HASH_ADAPT + bpage= prev; + prev= lru_hp.get(); + if (!prev && bpage) + goto rescan; +#endif + } + continue; + case 1: + break; + default: + if (state >= buf_page_t::UNFIXED) + continue; + } + + if (state < buf_page_t::READ_FIX && bpage->lock.u_lock_try(true)) + { + ut_ad(!bpage->is_io_fixed()); + lsn_t oldest_modification= bpage->oldest_modification(); + switch (oldest_modification) { + case 1: + mysql_mutex_lock(&flush_list_mutex); + oldest_modification= bpage->oldest_modification(); + if (oldest_modification) + { + ut_ad(oldest_modification == 1); + delete_from_flush_list(bpage); + } + mysql_mutex_unlock(&flush_list_mutex); + /* fall through */ + case 0: + bpage->lock.u_unlock(true); + goto try_to_evict; + default: + if (bpage->state() < buf_page_t::UNFIXED && + oldest_modification <= log_sys.get_flushed_lsn()) + { + release_freed_page(bpage); + goto evicted; + } + else + bpage->lock.u_unlock(true); + } + } + } + +#if defined MADV_FREE + /* FIXME: Issue fewer calls for larger contiguous blocks of + memory. For now, we assume that this is acceptable, because this + code should be executed rarely. */ + for (buf_page_t *bpage= UT_LIST_GET_FIRST(free); bpage; + bpage= UT_LIST_GET_NEXT(list, bpage)) + madvise(bpage->frame, srv_page_size, MADV_FREE); +#endif + mysql_mutex_unlock(&mutex); + sql_print_information("InnoDB: Memory pressure event freed %zu pages", + freed); + return; +} +#endif /* __linux__ */ + /** Thread pool task invoked by innodb_buffer_pool_size changes. */ static void buf_resize_callback(void *) { @@ -1906,12 +2208,23 @@ void buf_resize_start() { - srv_thread_pool->submit_task(&buf_resize_task); +#if !defined(DBUG_OFF) && defined(__linux__) + DBUG_EXECUTE_IF("trigger_garbage_collection", + { + mem_pressure_obj.trigger_collection(); + } + ); +#endif + + srv_thread_pool->submit_task(&buf_resize_task); } void buf_resize_shutdown() { - buf_resize_task.wait(); +#ifdef __linux__ + buf_mem_pressure_shutdown(); +#endif + buf_resize_task.wait(); } @@ -1985,7 +2298,10 @@ got_block: bpage->fix(); if (watch_is_sentinel(*bpage)) + { + ut_ad(!bpage->oldest_modification()); bpage= nullptr; + } page_hash.lock_get(chain).unlock(); return bpage; } @@ -2057,6 +2373,7 @@ } else { + ut_ad(!w->oldest_modification()); const auto state= w->state(); ut_ad(~buf_page_t::LRU_MASK & state); ut_ad(state >= buf_page_t::UNFIXED + 1); @@ -2146,6 +2463,12 @@ mtr->memo_push(block, MTR_MEMO_PAGE_X_MODIFY); } +static void buf_inc_get(ha_handler_stats *stats) +{ + mariadb_increment_pages_accessed(stats); + ++buf_pool.stat.n_page_gets; +} + /** Get read access to a compressed page (usually of type FIL_PAGE_TYPE_ZBLOB or FIL_PAGE_TYPE_ZBLOB2). The page must be released with unfix(). @@ -2161,8 +2484,8 @@ { ut_ad(zip_size); ut_ad(ut_is_2pow(zip_size)); - ++buf_pool.stat.n_page_gets; - mariadb_increment_pages_accessed(); + ha_handler_stats *const stats= mariadb_stats; + buf_inc_get(stats); buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(page_id.fold()); page_hash_latch &hash_lock= buf_pool.page_hash.lock_get(chain); @@ -2220,14 +2543,21 @@ if (discard_attempted || !bpage->frame) { - /* Even when we are holding a hash_lock, it should be - acceptable to wait for a page S-latch here, because - buf_page_t::read_complete() will not wait for buf_pool.mutex, - and because S-latch would not conflict with a U-latch - that would be protecting buf_page_t::write_complete(). */ - bpage->lock.s_lock(); + const bool got_s_latch= bpage->lock.s_lock_try(); hash_lock.unlock_shared(); - break; + if (UNIV_LIKELY(got_s_latch)) + break; + /* We may fail to acquire bpage->lock because + buf_page_t::read_complete() may be invoking + buf_pool_t::corrupted_evict() on this block, which it would + hold an exclusive latch on. + + Let us aqcuire and release buf_pool.mutex to ensure that any + buf_pool_t::corrupted_evict() will proceed before we reacquire + the hash_lock that it could be waiting for. */ + mysql_mutex_lock(&buf_pool.mutex); + mysql_mutex_unlock(&buf_pool.mutex); + goto lookup; } hash_lock.unlock_shared(); @@ -2246,7 +2576,6 @@ ut_ad(s < buf_page_t::READ_FIX || s >= buf_page_t::WRITE_FIX); } - bpage->set_accessed(); buf_page_make_young_if_needed(bpage); #ifdef UNIV_DEBUG @@ -2258,7 +2587,7 @@ switch (dberr_t err= buf_read_page(page_id, zip_size)) { case DB_SUCCESS: case DB_SUCCESS_LOCKED_REC: - mariadb_increment_pages_read(); + mariadb_increment_pages_read(stats); goto lookup; default: ib::error() << "Reading compressed page " << page_id @@ -2385,6 +2714,9 @@ while reading the page from file then it makes sure that it does merging of change buffer changes while reading the page from file. +@param[in,out] no_wait If not NULL on input, then we must not +wait for current page latch. On output, the value is set to true if we had to +return because we could not wait on page latch. @return pointer to the block or NULL */ TRANSACTIONAL_TARGET buf_block_t* @@ -2396,7 +2728,8 @@ ulint mode, mtr_t* mtr, dberr_t* err, - bool allow_ibuf_merge) + bool allow_ibuf_merge, + bool* no_wait) { unsigned access_time; ulint retries = 0; @@ -2435,9 +2768,8 @@ ut_ad(!mtr || !ibuf_inside(mtr) || ibuf_page_low(page_id, zip_size, FALSE, NULL)); - ++buf_pool.stat.n_page_gets; - mariadb_increment_pages_accessed(); - + ha_handler_stats* const stats = mariadb_stats; + buf_inc_get(stats); auto& chain= buf_pool.page_hash.cell_get(page_id.fold()); page_hash_latch& hash_lock = buf_pool.page_hash.lock_get(chain); loop: @@ -2508,7 +2840,7 @@ switch (dberr_t local_err = buf_read_page(page_id, zip_size)) { case DB_SUCCESS: case DB_SUCCESS_LOCKED_REC: - mariadb_increment_pages_read(); + mariadb_increment_pages_read(stats); buf_read_ahead_random(page_id, zip_size, ibuf_inside(mtr)); break; default: @@ -2537,9 +2869,10 @@ if (state > buf_page_t::READ_FIX && state < buf_page_t::WRITE_FIX) { if (mode == BUF_PEEK_IF_IN_POOL) { ignore_block: + block->unfix(); +ignore_unfixed: ut_ad(mode == BUF_GET_POSSIBLY_FREED || mode == BUF_PEEK_IF_IN_POOL); - block->unfix(); if (err) { *err = DB_CORRUPTION; } @@ -2553,16 +2886,35 @@ in buf_page_t::read_complete() or buf_pool_t::corrupted_evict(), or after buf_zip_decompress() in this function. */ - block->page.lock.s_lock(); + if (!no_wait) { + block->page.lock.s_lock(); + } else if (!block->page.lock.s_lock_try()) { + ut_ad(rw_latch == RW_NO_LATCH); + /* We should not wait trying to acquire S latch for + current page while holding latch for the next page. + It would violate the latching order resulting in + possible deadlock. Caller must handle the failure. */ + block->page.unfix(); + *no_wait= true; + return nullptr; + } state = block->page.state(); ut_ad(state < buf_page_t::READ_FIX || state >= buf_page_t::WRITE_FIX); const page_id_t id{block->page.id()}; block->page.lock.s_unlock(); - if (UNIV_UNLIKELY(id != page_id)) { + if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED)) { + if (UNIV_UNLIKELY(id == page_id)) { + /* The page read was completed, and + another thread marked the page as free + while we were waiting. */ + goto ignore_block; + } + ut_ad(id == page_id_t{~0ULL}); block->page.unfix(); + if (++retries < BUF_PAGE_READ_MAX_RETRIES) { goto loop; } @@ -2573,6 +2925,7 @@ return nullptr; } + ut_ad(id == page_id); } else if (mode != BUF_PEEK_IF_IN_POOL) { } else if (!mtr) { ut_ad(!block->page.oldest_modification()); @@ -2779,83 +3132,72 @@ #endif /* UNIV_DEBUG */ ut_ad(block->page.frame); + /* The state = block->page.state() may be stale at this point, + and in fact, at any point of time if we consider its + buffer-fix component. If the block is being read into the + buffer pool, it is possible that buf_page_t::read_complete() + will invoke buf_pool_t::corrupted_evict() and therefore + invalidate it (invoke buf_page_t::set_corrupt_id() and set the + state to FREED). Therefore, after acquiring the page latch we + must recheck the state. */ + if (state >= buf_page_t::UNFIXED && allow_ibuf_merge && fil_page_get_type(block->page.frame) == FIL_PAGE_INDEX && page_is_leaf(block->page.frame)) { block->page.lock.x_lock(); - ut_ad(block->page.id() == page_id - || (state >= buf_page_t::READ_FIX - && state < buf_page_t::WRITE_FIX)); - -#ifdef BTR_CUR_HASH_ADAPT - btr_search_drop_page_hash_index(block, true); -#endif /* BTR_CUR_HASH_ADAPT */ - - dberr_t e; - - if (UNIV_UNLIKELY(block->page.id() != page_id)) { -page_id_mismatch: - state = block->page.state(); - e = DB_CORRUPTION; -ibuf_merge_corrupted: - if (err) { - *err = e; - } - - if (block->page.id().is_corrupted()) { - buf_pool.corrupted_evict(&block->page, state); - } - return nullptr; - } - state = block->page.state(); ut_ad(state < buf_page_t::READ_FIX); if (state >= buf_page_t::IBUF_EXIST && state < buf_page_t::REINIT) { block->page.clear_ibuf_exist(); - e = ibuf_merge_or_delete_for_page(block, page_id, - block->zip_size()); - if (UNIV_UNLIKELY(e != DB_SUCCESS)) { - goto ibuf_merge_corrupted; + if (dberr_t local_err = + ibuf_merge_or_delete_for_page(block, page_id, + block->zip_size())) { + if (err) { + *err = local_err; + } + goto release_and_ignore_block; } + } else if (state < buf_page_t::UNFIXED) { +release_and_ignore_block: + block->page.lock.x_unlock(); + goto ignore_block; } - if (rw_latch == RW_X_LATCH) { - goto get_latch_valid; - } else { +#ifdef BTR_CUR_HASH_ADAPT + btr_search_drop_page_hash_index(block, true); +#endif /* BTR_CUR_HASH_ADAPT */ + + switch (rw_latch) { + case RW_NO_LATCH: block->page.lock.x_unlock(); - goto get_latch; + break; + case RW_S_LATCH: + block->page.lock.x_unlock(); + block->page.lock.s_lock(); + break; + case RW_SX_LATCH: + block->page.lock.x_u_downgrade(); + break; + default: + ut_ad(rw_latch == RW_X_LATCH); } + + mtr->memo_push(block, mtr_memo_type_t(rw_latch)); } else { -get_latch: switch (rw_latch) { case RW_NO_LATCH: mtr->memo_push(block, MTR_MEMO_BUF_FIX); return block; case RW_S_LATCH: block->page.lock.s_lock(); - ut_ad(!block->page.is_read_fixed()); - if (UNIV_UNLIKELY(block->page.id() != page_id)) { - block->page.lock.s_unlock(); - block->page.lock.x_lock(); - goto page_id_mismatch; - } -get_latch_valid: - mtr->memo_push(block, mtr_memo_type_t(rw_latch)); -#ifdef BTR_CUR_HASH_ADAPT - btr_search_drop_page_hash_index(block, true); -#endif /* BTR_CUR_HASH_ADAPT */ break; case RW_SX_LATCH: block->page.lock.u_lock(); ut_ad(!block->page.is_io_fixed()); - if (UNIV_UNLIKELY(block->page.id() != page_id)) { - block->page.lock.u_x_upgrade(); - goto page_id_mismatch; - } - goto get_latch_valid; + break; default: ut_ad(rw_latch == RW_X_LATCH); if (block->page.lock.x_lock_upgraded()) { @@ -2864,29 +3206,26 @@ mtr->page_lock_upgrade(*block); return block; } - if (UNIV_UNLIKELY(block->page.id() != page_id)) { - goto page_id_mismatch; - } - goto get_latch_valid; } - ut_ad(page_id_t(page_get_space_id(block->page.frame), - page_get_page_no(block->page.frame)) - == page_id); + mtr->memo_push(block, mtr_memo_type_t(rw_latch)); + state = block->page.state(); - if (mode == BUF_GET_POSSIBLY_FREED - || mode == BUF_PEEK_IF_IN_POOL) { - return block; + if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED)) { + mtr->release_last_page(); + goto ignore_unfixed; } - const bool not_first_access{block->page.set_accessed()}; - buf_page_make_young_if_needed(&block->page); - if (!not_first_access) { - buf_read_ahead_linear(page_id, block->zip_size(), - ibuf_inside(mtr)); - } + ut_ad(state < buf_page_t::READ_FIX + || state > buf_page_t::WRITE_FIX); + +#ifdef BTR_CUR_HASH_ADAPT + btr_search_drop_page_hash_index(block, true); +#endif /* BTR_CUR_HASH_ADAPT */ } + ut_ad(page_id_t(page_get_space_id(block->page.frame), + page_get_page_no(block->page.frame)) == page_id); return block; } @@ -2901,6 +3240,9 @@ @param[out] err DB_SUCCESS or error code @param[in] allow_ibuf_merge Allow change buffer merge while reading the pages from file. +@param[in,out] no_wait If not NULL on input, then we must not +wait for current page latch. On output, the value is set to true if we had to +return because we could not wait on page latch. @return pointer to the block or NULL */ buf_block_t* buf_page_get_gen( @@ -2911,12 +3253,14 @@ ulint mode, mtr_t* mtr, dberr_t* err, - bool allow_ibuf_merge) + bool allow_ibuf_merge, + bool* no_wait) { buf_block_t *block= recv_sys.recover(page_id); if (UNIV_LIKELY(!block)) return buf_page_get_low(page_id, zip_size, rw_latch, - guess, mode, mtr, err, allow_ibuf_merge); + guess, mode, mtr, err, allow_ibuf_merge, + no_wait); else if (UNIV_UNLIKELY(block == reinterpret_cast(-1))) { corrupted: @@ -2982,84 +3326,76 @@ return block; } -/********************************************************************//** -This is the general function used to get optimistic access to a database -page. -@return TRUE if success */ TRANSACTIONAL_TARGET -bool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block, - uint64_t modify_clock, mtr_t *mtr) +buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) +{ + buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(id.fold()); + transactional_shared_lock_guard g + {buf_pool.page_hash.lock_get(chain)}; + if (UNIV_UNLIKELY(!buf_pool.is_uncompressed(block) || + id != block->page.id() || !block->page.frame)) + return nullptr; + const auto state= block->page.state(); + if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED || + state >= buf_page_t::READ_FIX)) + return nullptr; + block->page.fix(); + return block; +} + +buf_block_t *buf_page_optimistic_get(buf_block_t *block, + rw_lock_type_t rw_latch, + uint64_t modify_clock, mtr_t *mtr) { - ut_ad(block); - ut_ad(mtr); ut_ad(mtr->is_active()); ut_ad(rw_latch == RW_S_LATCH || rw_latch == RW_X_LATCH); + ut_ad(block->page.buf_fix_count()); - if (have_transactional_memory); - else if (UNIV_UNLIKELY(!block->page.frame)) - return false; - else + if (rw_latch == RW_S_LATCH) { - const auto state= block->page.state(); - if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED || - state >= buf_page_t::READ_FIX)) - return false; - } + if (!block->page.lock.s_lock_try()) + { + fail: + block->page.unfix(); + return nullptr; + } - bool success; - const page_id_t id{block->page.id()}; - buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(id.fold()); - bool have_u_not_x= false; + ut_ad(!ibuf_inside(mtr) || + ibuf_page(block->page.id(), block->zip_size(), nullptr)); - { - transactional_shared_lock_guard g - {buf_pool.page_hash.lock_get(chain)}; - if (UNIV_UNLIKELY(id != block->page.id() || !block->page.frame)) - return false; - const auto state= block->page.state(); - if (UNIV_UNLIKELY(state < buf_page_t::UNFIXED || - state >= buf_page_t::READ_FIX)) - return false; - - if (rw_latch == RW_S_LATCH) - success= block->page.lock.s_lock_try(); - else + if (modify_clock != block->modify_clock || block->page.is_freed()) { - have_u_not_x= block->page.lock.have_u_not_x(); - success= have_u_not_x || block->page.lock.x_lock_try(); + block->page.lock.s_unlock(); + goto fail; } - } - - if (!success) - return false; - if (have_u_not_x) + ut_ad(!block->page.is_read_fixed()); + buf_page_make_young_if_needed(&block->page); + mtr->memo_push(block, MTR_MEMO_PAGE_S_FIX); + } + else if (block->page.lock.have_u_not_x()) { block->page.lock.u_x_upgrade(); + block->page.unfix(); mtr->page_lock_upgrade(*block); - ut_ad(id == block->page.id()); ut_ad(modify_clock == block->modify_clock); } + else if (!block->page.lock.x_lock_try()) + goto fail; else { - ut_ad(rw_latch == RW_S_LATCH || !block->page.is_io_fixed()); - ut_ad(id == block->page.id()); - ut_ad(!ibuf_inside(mtr) || ibuf_page(id, block->zip_size(), nullptr)); + ut_ad(!block->page.is_io_fixed()); + ut_ad(!ibuf_inside(mtr) || + ibuf_page(block->page.id(), block->zip_size(), nullptr)); if (modify_clock != block->modify_clock || block->page.is_freed()) { - if (rw_latch == RW_S_LATCH) - block->page.lock.s_unlock(); - else - block->page.lock.x_unlock(); - return false; + block->page.lock.x_unlock(); + goto fail; } - block->page.fix(); - ut_ad(!block->page.is_read_fixed()); - block->page.set_accessed(); buf_page_make_young_if_needed(&block->page); - mtr->memo_push(block, mtr_memo_type_t(rw_latch)); + mtr->memo_push(block, MTR_MEMO_PAGE_X_FIX); } ut_d(if (!(++buf_dbg_counter % 5771)) buf_pool.validate()); @@ -3069,7 +3405,7 @@ ut_ad(~buf_page_t::LRU_MASK & state); ut_ad(block->page.frame); - return true; + return block; } /** Try to S-latch a page. @@ -3105,8 +3441,7 @@ ut_ad(block->page.buf_fix_count()); ut_ad(block->page.id() == page_id); - ++buf_pool.stat.n_page_gets; - mariadb_increment_pages_accessed(); + buf_inc_get(mariadb_stats); return block; } @@ -3679,15 +4014,13 @@ All pages must be in a replaceable state (not modified or latched). */ void buf_pool_invalidate() { - mysql_mutex_lock(&buf_pool.mutex); - /* It is possible that a write batch that has been posted earlier is still not complete. For buffer pool invalidation to proceed we must ensure there is NO write activity happening. */ - ut_d(mysql_mutex_unlock(&buf_pool.mutex)); + os_aio_wait_until_no_pending_writes(false); ut_d(buf_pool.assert_all_freed()); - ut_d(mysql_mutex_lock(&buf_pool.mutex)); + mysql_mutex_lock(&buf_pool.mutex); while (UT_LIST_GET_LEN(buf_pool.LRU)) { buf_LRU_scan_and_free_block(); diff -Nru mariadb-10.11.6/storage/innobase/buf/buf0dblwr.cc mariadb-10.11.9/storage/innobase/buf/buf0dblwr.cc --- mariadb-10.11.6/storage/innobase/buf/buf0dblwr.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/buf/buf0dblwr.cc 2024-08-03 07:29:59.000000000 +0000 @@ -283,6 +283,7 @@ init(TRX_SYS_DOUBLEWRITE + read_buf); const bool upgrade_to_innodb_file_per_table= + !srv_read_only_mode && mach_read_from_4(TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED + TRX_SYS_DOUBLEWRITE + read_buf) != TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N; @@ -336,11 +337,14 @@ os_file_flush(file); } else - for (ulint i= 0; i < size * 2; i++, page += srv_page_size) - if (mach_read_from_8(my_assume_aligned<8>(page + FIL_PAGE_LSN))) - /* Each valid page header must contain a nonzero FIL_PAGE_LSN field. */ + { + alignas(8) char checkpoint[8]; + mach_write_to_8(checkpoint, log_sys.next_checkpoint_lsn); + for (auto i= size * 2; i--; page += srv_page_size) + if (memcmp_aligned<8>(page + FIL_PAGE_LSN, checkpoint, 8) >= 0) + /* Valid pages are not older than the log checkpoint. */ recv_sys.dblwr.add(page); - + } err= DB_SUCCESS; goto func_exit; } diff -Nru mariadb-10.11.6/storage/innobase/buf/buf0dump.cc mariadb-10.11.9/storage/innobase/buf/buf0dump.cc --- mariadb-10.11.6/storage/innobase/buf/buf0dump.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/buf/buf0dump.cc 2024-08-03 07:29:59.000000000 +0000 @@ -33,7 +33,7 @@ #include "buf0rea.h" #include "buf0dump.h" -#include "dict0dict.h" +#include "dict0load.h" #include "os0file.h" #include "srv0srv.h" #include "srv0start.h" @@ -180,7 +180,7 @@ char buf[FN_REFLEN]; mysql_mutex_lock(&LOCK_global_system_variables); - snprintf(buf, sizeof buf, "%s/%s", get_buf_dump_dir(), + snprintf(buf, sizeof buf, "%s" FN_ROOTDIR "%s", get_buf_dump_dir(), srv_buf_dump_filename); mysql_mutex_unlock(&LOCK_global_system_variables); @@ -214,7 +214,7 @@ format = "%s%s"; break; default: - format = "%s/%s"; + format = "%s" FN_ROOTDIR "%s"; } snprintf(path, path_size, format, @@ -562,6 +562,22 @@ if (!SHUTTING_DOWN()) { std::sort(dump, dump + dump_n); + std::set missing; + for (const page_id_t id : st_::span + (dump, dump_n)) { + missing.emplace(id.space()); + } + for (std::set::iterator i = missing.begin(); + i != missing.end(); ) { + auto j = i++; + if (fil_space_t* space = fil_space_t::get(*j)) { + space->release(); + missing.erase(j); + } + } + if (!missing.empty()) { + dict_check_tablespaces_and_store_max_id(&missing); + } } /* Avoid calling the expensive fil_space_t::get() for each @@ -650,9 +666,7 @@ ut_free(dump); - if (i == dump_n) { - os_aio_wait_until_no_pending_reads(true); - } + os_aio_wait_until_no_pending_reads(true); ut_sprintf_timestamp(now); diff -Nru mariadb-10.11.6/storage/innobase/buf/buf0flu.cc mariadb-10.11.9/storage/innobase/buf/buf0flu.cc --- mariadb-10.11.6/storage/innobase/buf/buf0flu.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/buf/buf0flu.cc 2024-08-03 07:29:59.000000000 +0000 @@ -274,30 +274,22 @@ ut_d(buf_flush_validate_low()); } -/** Note that a block is no longer dirty, while not removing -it from buf_pool.flush_list -@param temporary whether the page belongs to the temporary tablespace -@param error whether an error may have occurred while writing */ -inline void buf_page_t::write_complete(bool temporary, bool error) -{ - ut_ad(temporary == fsp_is_system_temporary(id().space())); - if (UNIV_UNLIKELY(error)); - else if (temporary) - { - ut_ad(oldest_modification() == 2); - oldest_modification_= 0; - } - else +void buf_page_t::write_complete(bool persistent, bool error, uint32_t state) +{ + ut_ad(!persistent == fsp_is_system_temporary(id().space())); + ut_ad(state >= WRITE_FIX); + + if (UNIV_LIKELY(!error)) { + ut_d(lsn_t om= oldest_modification()); + ut_ad(om >= 2); + ut_ad(persistent == (om > 2)); /* We use release memory order to guarantee that callers of oldest_modification_acquire() will observe the block as being detached from buf_pool.flush_list, after reading the value 0. */ - ut_ad(oldest_modification() > 2); - oldest_modification_.store(1, std::memory_order_release); + oldest_modification_.store(persistent, std::memory_order_release); } - const auto s= state(); - ut_ad(s >= WRITE_FIX); - zip.fix.fetch_sub((s >= WRITE_FIX_REINIT) + zip.fix.fetch_sub((state >= WRITE_FIX_REINIT) ? (WRITE_FIX_REINIT - UNFIXED) : (WRITE_FIX - UNFIXED)); lock.u_unlock(true); @@ -311,18 +303,10 @@ inline void buf_pool_t::n_flush_dec() { - mysql_mutex_lock(&flush_list_mutex); + mysql_mutex_assert_owner(&flush_list_mutex); ut_ad(page_cleaner_status >= LRU_FLUSH); if ((page_cleaner_status-= LRU_FLUSH) < LRU_FLUSH) pthread_cond_broadcast(&done_flush_LRU); - mysql_mutex_unlock(&flush_list_mutex); -} - -inline void buf_pool_t::n_flush_dec_holding_mutex() -{ - mysql_mutex_assert_owner(&flush_list_mutex); - ut_ad(page_cleaner_status >= LRU_FLUSH); - page_cleaner_status-= LRU_FLUSH; } /** Complete write of a file page from buf_pool. @@ -352,28 +336,26 @@ mysql_mutex_assert_not_owner(&buf_pool.mutex); mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex); - if (request.is_LRU()) + const bool persistent= bpage->oldest_modification() != 2; + + if (UNIV_UNLIKELY(!persistent) && UNIV_LIKELY(!error)) { - const bool temp= bpage->oldest_modification() == 2; - if (!temp && state < buf_page_t::WRITE_FIX_REINIT && - request.node->space->use_doublewrite()) - buf_dblwr.write_completed(); /* We must hold buf_pool.mutex while releasing the block, so that no other thread can access it before we have freed it. */ mysql_mutex_lock(&buf_pool.mutex); - bpage->write_complete(temp, error); - if (!error) - buf_LRU_free_page(bpage, true); + bpage->write_complete(persistent, error, state); + buf_LRU_free_page(bpage, true); mysql_mutex_unlock(&buf_pool.mutex); - - buf_pool.n_flush_dec(); } else { + bpage->write_complete(persistent, error, state); if (state < buf_page_t::WRITE_FIX_REINIT && request.node->space->use_doublewrite()) + { + ut_ad(persistent); buf_dblwr.write_completed(); - bpage->write_complete(false, error); + } } } @@ -655,7 +637,7 @@ ut_ad(!bpage->zip_size() || !page_compressed); /* Find free slot from temporary memory array */ - *slot= buf_pool.io_buf_reserve(); + *slot= buf_pool.io_buf_reserve(true); ut_a(*slot); (*slot)->allocate(); @@ -740,30 +722,32 @@ } /** Write a flushable page to a file or free a freeable block. -@param evict whether to evict the page on write completion @param space tablespace @return whether a page write was initiated and buf_pool.mutex released */ -bool buf_page_t::flush(bool evict, fil_space_t *space) +bool buf_page_t::flush(fil_space_t *space) { mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex); ut_ad(in_file()); ut_ad(in_LRU_list); ut_ad((space->purpose == FIL_TYPE_TEMPORARY) == (space == fil_system.temp_space)); - ut_ad(evict || space != fil_system.temp_space); ut_ad(space->referenced()); const auto s= state(); - ut_a(s >= FREED); + + const lsn_t lsn= + mach_read_from_8(my_assume_aligned<8> + (FIL_PAGE_LSN + (zip.data ? zip.data : frame))); + ut_ad(lsn + ? lsn >= oldest_modification() || oldest_modification() == 2 + : space->purpose != FIL_TYPE_TABLESPACE); if (s < UNFIXED) { + ut_a(s >= FREED); if (UNIV_LIKELY(space->purpose == FIL_TYPE_TABLESPACE)) { - const lsn_t lsn= - mach_read_from_8(my_assume_aligned<8> - (FIL_PAGE_LSN + (zip.data ? zip.data : frame))); - ut_ad(lsn >= oldest_modification()); + freed: if (lsn > log_sys.get_flushed_lsn()) { mysql_mutex_unlock(&buf_pool.mutex); @@ -775,6 +759,12 @@ return false; } + if (UNIV_UNLIKELY(lsn < space->get_create_lsn())) + { + ut_ad(space->purpose == FIL_TYPE_TABLESPACE); + goto freed; + } + ut_d(const auto f=) zip.fix.fetch_add(WRITE_FIX - UNFIXED); ut_ad(f >= UNFIXED); ut_ad(f < READ_FIX); @@ -787,22 +777,11 @@ mysql_mutex_unlock(&buf_pool.mutex); IORequest::Type type= IORequest::WRITE_ASYNC; - if (UNIV_UNLIKELY(evict)) - { - type= IORequest::WRITE_LRU; - mysql_mutex_lock(&buf_pool.flush_list_mutex); - buf_pool.n_flush_inc(); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - } /* Apart from the U-lock, this block will also be protected by is_write_fixed() and oldest_modification()>1. Thus, it cannot be relocated or removed. */ - DBUG_PRINT("ib_buf", ("%s %u page %u:%u", - evict ? "LRU" : "flush_list", - id().space(), id().page_no())); - buf_block_t *block= reinterpret_cast(this); page_t *write_frame= zip.data; @@ -854,10 +833,7 @@ { switch (space->chain.start->punch_hole) { case 1: - static_assert(IORequest::PUNCH_LRU - IORequest::PUNCH == - IORequest::WRITE_LRU - IORequest::WRITE_ASYNC, ""); - type= - IORequest::Type(type + (IORequest::PUNCH - IORequest::WRITE_ASYNC)); + type= IORequest::PUNCH; break; case 2: size= orig_size; @@ -869,15 +845,9 @@ if ((s & LRU_MASK) == REINIT || !space->use_doublewrite()) { - if (UNIV_LIKELY(space->purpose == FIL_TYPE_TABLESPACE)) - { - const lsn_t lsn= - mach_read_from_8(my_assume_aligned<8>(FIL_PAGE_LSN + - (write_frame ? write_frame - : frame))); - ut_ad(lsn >= oldest_modification()); + if (UNIV_LIKELY(space->purpose == FIL_TYPE_TABLESPACE) && + lsn > log_sys.get_flushed_lsn()) log_write_up_to(lsn, true); - } space->io(IORequest{type, this, slot}, physical_offset(), size, write_frame, this); } @@ -890,10 +860,8 @@ /** Check whether a page can be flushed from the buf_pool. @param id page identifier @param fold id.fold() -@param evict true=buf_pool.LRU; false=buf_pool.flush_list @return whether the page can be flushed */ -static bool buf_flush_check_neighbor(const page_id_t id, ulint fold, - bool evict) +static bool buf_flush_check_neighbor(const page_id_t id, ulint fold) { mysql_mutex_assert_owner(&buf_pool.mutex); ut_ad(fold == id.fold()); @@ -902,26 +870,16 @@ const buf_page_t *bpage= buf_pool.page_hash.get(id, buf_pool.page_hash.cell_get(fold)); - if (!bpage || buf_pool.watch_is_sentinel(*bpage)) - return false; - - /* We avoid flushing 'non-old' blocks in an eviction flush, because the - flushed blocks are soon freed */ - if (evict && !bpage->is_old()) - return false; - - return bpage->oldest_modification() > 1 && !bpage->is_io_fixed(); + return bpage && bpage->oldest_modification() > 1 && !bpage->is_io_fixed(); } /** Check which neighbors of a page can be flushed from the buf_pool. @param space tablespace @param id page identifier of a dirty page @param contiguous whether to consider contiguous areas of pages -@param evict true=buf_pool.LRU; false=buf_pool.flush_list @return last page number that can be flushed */ static page_id_t buf_flush_check_neighbors(const fil_space_t &space, - page_id_t &id, bool contiguous, - bool evict) + page_id_t &id, bool contiguous) { ut_ad(id.page_no() < space.size + (space.physical_size() == 2048 ? 1 @@ -954,7 +912,7 @@ for (page_id_t i= id - 1;; --i) { fold--; - if (!buf_flush_check_neighbor(i, fold, evict)) + if (!buf_flush_check_neighbor(i, fold)) { low= i + 1; break; @@ -970,7 +928,7 @@ while (++i < high) { ++fold; - if (!buf_flush_check_neighbor(i, fold, evict)) + if (!buf_flush_check_neighbor(i, fold)) break; } @@ -1047,24 +1005,37 @@ @param page_id page identifier @param bpage buffer page @param contiguous whether to consider contiguous areas of pages -@param evict true=buf_pool.LRU; false=buf_pool.flush_list @param n_flushed number of pages flushed so far in this batch @param n_to_flush maximum number of pages we are allowed to flush @return number of pages flushed */ static ulint buf_flush_try_neighbors(fil_space_t *space, const page_id_t page_id, buf_page_t *bpage, - bool contiguous, bool evict, + bool contiguous, ulint n_flushed, ulint n_to_flush) { - mysql_mutex_unlock(&buf_pool.mutex); - ut_ad(space->id == page_id.space()); ut_ad(bpage->id() == page_id); + { + const lsn_t lsn= + mach_read_from_8(my_assume_aligned<8> + (FIL_PAGE_LSN + + (bpage->zip.data ? bpage->zip.data : bpage->frame))); + ut_ad(lsn >= bpage->oldest_modification()); + if (UNIV_UNLIKELY(lsn < space->get_create_lsn())) + { + ut_a(!bpage->flush(space)); + mysql_mutex_unlock(&buf_pool.mutex); + return 0; + } + } + + mysql_mutex_unlock(&buf_pool.mutex); + ulint count= 0; page_id_t id= page_id; - page_id_t high= buf_flush_check_neighbors(*space, id, contiguous, evict); + page_id_t high= buf_flush_check_neighbors(*space, id, contiguous); ut_ad(page_id >= id); ut_ad(page_id < high); @@ -1101,7 +1072,7 @@ ut_ad(!buf_pool.watch_is_sentinel(*b)); ut_ad(b->oldest_modification() > 1); flush: - if (b->flush(evict, space)) + if (b->flush(space)) { ++count; continue; @@ -1109,9 +1080,10 @@ } /* We avoid flushing 'non-old' blocks in an eviction flush, because the flushed blocks are soon freed */ - else if ((!evict || b->is_old()) && !buf_pool.watch_is_sentinel(*b) && - b->oldest_modification() > 1 && b->lock.u_lock_try(true)) + else if (b->oldest_modification() > 1 && b->lock.u_lock_try(true)) { + /* For the buf_pool.watch[] sentinels, oldest_modification() == 0 */ + ut_ad(!buf_pool.watch_is_sentinel(*b)); if (b->oldest_modification() < 2) b->lock.u_unlock(true); else @@ -1233,10 +1205,8 @@ /** Flush dirty blocks from the end buf_pool.LRU, and move clean blocks to buf_pool.free. @param max maximum number of blocks to flush -@param evict whether dirty pages are to be evicted after flushing them @param n counts of flushed and evicted pages */ -static void buf_flush_LRU_list_batch(ulint max, bool evict, - flush_counters_t *n) +static void buf_flush_LRU_list_batch(ulint max, flush_counters_t *n) { ulint scanned= 0; ulint free_limit= srv_LRU_scan_depth; @@ -1252,9 +1222,21 @@ static_assert(FIL_NULL > SRV_TMP_SPACE_ID, "consistency"); static_assert(FIL_NULL > SRV_SPACE_ID_UPPER_BOUND, "consistency"); + /* BUF_LRU_MIN_LEN (256) is too high value for low buffer pool(BP) size. For + example, for BP size lower than 80M and 16 K page size, the limit is more than + 5% of total BP and for lowest BP 5M, it is 80% of the BP. Non-data objects + like explicit locks could occupy part of the BP pool reducing the pages + available for LRU. If LRU reaches minimum limit and if no free pages are + available, server would hang with page cleaner not able to free any more + pages. To avoid such hang, we adjust the LRU limit lower than the limit for + data objects as checked in buf_LRU_check_size_of_non_data_objects() i.e. one + page less than 5% of BP. */ + size_t pool_limit= buf_pool.curr_size / 20 - 1; + auto buf_lru_min_len= std::min(pool_limit, BUF_LRU_MIN_LEN); + for (buf_page_t *bpage= UT_LIST_GET_LAST(buf_pool.LRU); bpage && - ((UT_LIST_GET_LEN(buf_pool.LRU) > BUF_LRU_MIN_LEN && + ((UT_LIST_GET_LEN(buf_pool.LRU) > buf_lru_min_len && UT_LIST_GET_LEN(buf_pool.free) < free_limit) || recv_recovery_is_on()); ++scanned, bpage= buf_pool.lru_hp.get()) @@ -1284,8 +1266,12 @@ if (state < buf_page_t::READ_FIX && bpage->lock.u_lock_try(true)) { ut_ad(!bpage->is_io_fixed()); - bool do_evict= evict; switch (bpage->oldest_modification()) { + case 2: + /* LRU flushing will always evict pages of the temporary tablespace, + in buf_page_write_complete(). */ + ++n->evicted; + break; case 1: mysql_mutex_lock(&buf_pool.flush_list_mutex); if (ut_d(lsn_t lsn=) bpage->oldest_modification()) @@ -1298,12 +1284,8 @@ case 0: bpage->lock.u_unlock(true); goto evict; - case 2: - /* LRU flushing will always evict pages of the temporary tablespace. */ - do_evict= true; } - /* Block is ready for flush. Dispatch an IO request. - If do_evict, the page may be evicted by buf_page_write_complete(). */ + /* Block is ready for flush. Dispatch an IO request. */ const page_id_t page_id(bpage->id()); const uint32_t space_id= page_id.space(); if (!space || space->id != space_id) @@ -1338,6 +1320,7 @@ no_space: mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_flush_discard_page(bpage); + ++n->evicted; continue; } @@ -1350,8 +1333,8 @@ if (neighbors && space->is_rotational()) n->flushed+= buf_flush_try_neighbors(space, page_id, bpage, neighbors == 1, - do_evict, n->flushed, max); - else if (bpage->flush(do_evict, space)) + n->flushed, max); + else if (bpage->flush(space)) ++n->flushed; else continue; @@ -1369,24 +1352,25 @@ space->release(); if (scanned) + { MONITOR_INC_VALUE_CUMULATIVE(MONITOR_LRU_BATCH_SCANNED, MONITOR_LRU_BATCH_SCANNED_NUM_CALL, MONITOR_LRU_BATCH_SCANNED_PER_CALL, scanned); + } } /** Flush and move pages from LRU or unzip_LRU list to the free list. Whether LRU or unzip_LRU is used depends on the state of the system. @param max maximum number of blocks to flush -@param evict whether dirty pages are to be evicted after flushing them @param n counts of flushed and evicted pages */ -static void buf_do_LRU_batch(ulint max, bool evict, flush_counters_t *n) +static void buf_do_LRU_batch(ulint max, flush_counters_t *n) { if (buf_LRU_evict_from_unzip_LRU()) buf_free_from_unzip_LRU_list_batch(); n->evicted= 0; n->flushed= 0; - buf_flush_LRU_list_batch(max, evict, n); + buf_flush_LRU_list_batch(max, n); mysql_mutex_assert_owner(&buf_pool.mutex); buf_lru_freed_page_count+= n->evicted; @@ -1498,8 +1482,8 @@ { if (neighbors && space->is_rotational()) count+= buf_flush_try_neighbors(space, page_id, bpage, - neighbors == 1, false, count, max_n); - else if (bpage->flush(false, space)) + neighbors == 1, count, max_n); + else if (bpage->flush(space)) ++count; else continue; @@ -1518,10 +1502,13 @@ space->release(); if (scanned) + { MONITOR_INC_VALUE_CUMULATIVE(MONITOR_FLUSH_BATCH_SCANNED, MONITOR_FLUSH_BATCH_SCANNED_NUM_CALL, MONITOR_FLUSH_BATCH_SCANNED_PER_CALL, scanned); + } + return count; } @@ -1665,7 +1652,7 @@ goto was_freed; } mysql_mutex_unlock(&buf_pool.flush_list_mutex); - if (bpage->flush(false, space)) + if (bpage->flush(space)) { ++n_flush; if (!--max_n_flush) @@ -1723,30 +1710,42 @@ The caller must invoke buf_dblwr.flush_buffered_writes() after releasing buf_pool.mutex. @param max_n wished maximum mumber of blocks flushed -@param evict whether to evict pages after flushing -@return evict ? number of processed pages : number of pages written */ -ulint buf_flush_LRU(ulint max_n, bool evict) +@return number of pages written */ +static ulint buf_flush_LRU(ulint max_n) { mysql_mutex_assert_owner(&buf_pool.mutex); flush_counters_t n; - buf_do_LRU_batch(max_n, evict, &n); + buf_do_LRU_batch(max_n, &n); ulint pages= n.flushed; if (n.evicted) { - if (evict) - pages+= n.evicted; buf_pool.try_LRU_scan= true; pthread_cond_broadcast(&buf_pool.done_free); } + else if (!pages && !buf_pool.try_LRU_scan) + /* For example, with the minimum innodb_buffer_pool_size=5M and + the default innodb_page_size=16k there are only a little over 316 + pages in the buffer pool. The buffer pool can easily be exhausted + by a workload of some dozen concurrent connections. The system could + reach a deadlock like the following: + + (1) Many threads are waiting in buf_LRU_get_free_block() + for buf_pool.done_free. + (2) Some threads are waiting for a page latch which is held by + another thread that is waiting in buf_LRU_get_free_block(). + (3) This thread is the only one that could make progress, but + we fail to do so because all the pages that we scanned are + buffer-fixed or latched by some thread. */ + buf_pool.LRU_warn(); return pages; } #ifdef HAVE_PMEM -# include +# include "cache.h" #endif /** Write checkpoint information to the log header and release mutex. @@ -1797,15 +1796,18 @@ log_write_and_flush_prepare(); resizing= resize_lsn.load(std::memory_order_relaxed); /* FIXME: issue an asynchronous write */ - log.write(offset, {c, get_block_size()}); + ut_ad(ut_is_2pow(write_size)); + ut_ad(write_size >= 512); + ut_ad(write_size <= 4096); + log.write(offset, {c, write_size}); if (resizing > 1 && resizing <= next_checkpoint_lsn) { + resize_log.write(CHECKPOINT_1, {c, write_size}); byte *buf= static_cast(aligned_malloc(4096, 4096)); memset_aligned<4096>(buf, 0, 4096); header_write(buf, resizing, is_encrypted()); resize_log.write(0, {buf, 4096}); aligned_free(buf); - resize_log.write(CHECKPOINT_1, {c, get_block_size()}); } if (srv_file_flush_method != SRV_O_DSYNC) @@ -1860,8 +1862,7 @@ ut_ad(!log.is_opened()); bool success; log.m_file= - os_file_create_func(get_log_file_path().c_str(), - OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, + os_file_create_func(get_log_file_path().c_str(), OS_FILE_OPEN, OS_FILE_NORMAL, OS_LOG_FILE, false, &success); ut_a(success); ut_a(log.is_opened()); @@ -1876,7 +1877,7 @@ { my_munmap(buf, file_size); buf= resize_buf; - buf_free= START_OFFSET + (get_lsn() - resizing); + set_buf_free(START_OFFSET + (get_lsn() - resizing)); } else #endif @@ -1918,9 +1919,7 @@ static bool log_checkpoint_low(lsn_t oldest_lsn, lsn_t end_lsn) { ut_ad(!srv_read_only_mode); -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(oldest_lsn <= end_lsn); ut_ad(end_lsn == log_sys.get_lsn()); @@ -2124,6 +2123,8 @@ limit= lsn; buf_pool.page_cleaner_set_idle(false); pthread_cond_signal(&buf_pool.do_flush_list); + if (furious) + log_sys.set_check_for_checkpoint(); } mysql_mutex_unlock(&buf_pool.flush_list_mutex); } @@ -2132,66 +2133,90 @@ /** Conduct checkpoint-related flushing for innodb_flush_sync=ON, and try to initiate checkpoints until the target is met. @param lsn minimum value of buf_pool.get_oldest_modification(LSN_MAX) */ -ATTRIBUTE_COLD static void buf_flush_sync_for_checkpoint(lsn_t lsn) +ATTRIBUTE_COLD ATTRIBUTE_NOINLINE +static void buf_flush_sync_for_checkpoint(lsn_t lsn) { ut_ad(!srv_read_only_mode); mysql_mutex_assert_not_owner(&buf_pool.flush_list_mutex); - for (;;) + /* During furious flush, we need to keep generating free pages. Otherwise + concurrent mtrs could be blocked holding latches for the pages to be flushed + causing deadlock in rare occasion. + + Ideally we should be acquiring buffer pool mutex for the check but it is more + expensive and we are not using the mutex while calling need_LRU_eviction() as + of today. It is a quick and dirty read of the LRU and free list length. + Atomic read of try_LRU_scan should eventually let us do the eviction. + Correcting the inaccuracy would need more consideration to avoid any possible + performance regression. */ + if (buf_pool.need_LRU_eviction()) { - if (ulint n_flushed= buf_flush_list(srv_max_io_capacity, lsn)) - { - MONITOR_INC_VALUE_CUMULATIVE(MONITOR_FLUSH_SYNC_TOTAL_PAGE, - MONITOR_FLUSH_SYNC_COUNT, - MONITOR_FLUSH_SYNC_PAGES, n_flushed); - } + mysql_mutex_lock(&buf_pool.flush_list_mutex); + buf_pool.page_cleaner_set_idle(false); + buf_pool.n_flush_inc(); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); - switch (srv_file_flush_method) { - case SRV_NOSYNC: - case SRV_O_DIRECT_NO_FSYNC: - break; - default: - fil_flush_file_spaces(); - } + mysql_mutex_lock(&buf_pool.mutex); + /* Confirm that eviction is needed after acquiring buffer pool mutex. */ + if (buf_pool.need_LRU_eviction()) + /* We intend to only evict pages keeping maximum flush bandwidth for + flush list pages advancing checkpoint. However, if the LRU tail is full + of dirty pages, we might need some flushing. */ + std::ignore= buf_flush_LRU(srv_io_capacity); + mysql_mutex_unlock(&buf_pool.mutex); - log_sys.latch.wr_lock(SRW_LOCK_CALL); - const lsn_t newest_lsn= log_sys.get_lsn(); mysql_mutex_lock(&buf_pool.flush_list_mutex); - lsn_t measure= buf_pool.get_oldest_modification(0); - const lsn_t checkpoint_lsn= measure ? measure : newest_lsn; + buf_pool.n_flush_dec(); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + } - if (!recv_recovery_is_on() && - checkpoint_lsn > log_sys.last_checkpoint_lsn + SIZE_OF_FILE_CHECKPOINT) - { - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - log_checkpoint_low(checkpoint_lsn, newest_lsn); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - measure= buf_pool.get_oldest_modification(LSN_MAX); - } - else - { - log_sys.latch.wr_unlock(); - if (!measure) - measure= LSN_MAX; - } + if (ulint n_flushed= buf_flush_list(srv_max_io_capacity, lsn)) + { + MONITOR_INC_VALUE_CUMULATIVE(MONITOR_FLUSH_SYNC_TOTAL_PAGE, + MONITOR_FLUSH_SYNC_COUNT, + MONITOR_FLUSH_SYNC_PAGES, n_flushed); + } - /* After attempting log checkpoint, check if we have reached our target. */ - const lsn_t target= buf_flush_sync_lsn; + switch (srv_file_flush_method) { + case SRV_NOSYNC: + case SRV_O_DIRECT_NO_FSYNC: + break; + default: + fil_flush_file_spaces(); + } - if (measure >= target) - buf_flush_sync_lsn= 0; - else if (measure >= buf_flush_async_lsn) - buf_flush_async_lsn= 0; + log_sys.latch.wr_lock(SRW_LOCK_CALL); + const lsn_t newest_lsn= log_sys.get_lsn(); + mysql_mutex_lock(&buf_pool.flush_list_mutex); + lsn_t measure= buf_pool.get_oldest_modification(0); + const lsn_t checkpoint_lsn= measure ? measure : newest_lsn; - /* wake up buf_flush_wait() */ - pthread_cond_broadcast(&buf_pool.done_flush_list); + if (!recv_recovery_is_on() && + checkpoint_lsn > log_sys.last_checkpoint_lsn + SIZE_OF_FILE_CHECKPOINT) + { mysql_mutex_unlock(&buf_pool.flush_list_mutex); + log_checkpoint_low(checkpoint_lsn, newest_lsn); + mysql_mutex_lock(&buf_pool.flush_list_mutex); + measure= buf_pool.get_oldest_modification(LSN_MAX); + } + else + { + log_sys.latch.wr_unlock(); + if (!measure) + measure= LSN_MAX; + } - lsn= std::max(lsn, target); + /* After attempting log checkpoint, check if we have reached our target. */ + const lsn_t target= buf_flush_sync_lsn; - if (measure >= lsn) - return; - } + if (measure >= target) + buf_flush_sync_lsn= 0; + else if (measure >= buf_flush_async_lsn) + buf_flush_async_lsn= 0; + + /* wake up buf_flush_wait() */ + pthread_cond_broadcast(&buf_pool.done_flush_list); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); } /** Check if the adpative flushing threshold is recommended based on @@ -2285,7 +2310,7 @@ sum_pages += last_pages_in; - const ulint time_elapsed = std::max(curr_time - prev_time, 1); + const ulint time_elapsed = std::max(ulint(curr_time - prev_time), 1); /* We update our variables every innodb_flushing_avg_loops iterations to smooth out transition in workload. */ @@ -2371,11 +2396,19 @@ goto func_exit; } +TPOOL_SUPPRESS_TSAN +bool buf_pool_t::need_LRU_eviction() const +{ + /* try_LRU_scan==false means that buf_LRU_get_free_block() is waiting + for buf_flush_page_cleaner() to evict some blocks */ + return UNIV_UNLIKELY(!try_LRU_scan || + (UT_LIST_GET_LEN(LRU) > BUF_LRU_MIN_LEN && + UT_LIST_GET_LEN(free) < srv_LRU_scan_depth / 2)); +} + #if defined __aarch64__&&defined __GNUC__&&__GNUC__==4&&!defined __clang__ -/* Avoid GCC 4.8.5 internal compiler error "could not split insn". -We would only need this for buf_flush_page_cleaner(), -but GCC 4.8.5 does not support pop_options. */ -# pragma GCC optimize ("O0") +/* Avoid GCC 4.8.5 internal compiler error "could not split insn". */ +__attribute__((optimize(0))) #endif /** page_cleaner thread tasked with flushing dirty pages from the buffer pools. As of now we'll have only one coordinator. */ @@ -2397,6 +2430,10 @@ for (;;) { + DBUG_EXECUTE_IF("ib_page_cleaner_sleep", + { + std::this_thread::sleep_for(std::chrono::seconds(1)); + }); lsn_limit= buf_flush_sync_lsn; if (UNIV_UNLIKELY(lsn_limit != 0) && UNIV_LIKELY(srv_flush_sync)) @@ -2409,21 +2446,24 @@ } mysql_mutex_lock(&buf_pool.flush_list_mutex); - if (buf_pool.ran_out()) - goto no_wait; - else if (srv_shutdown_state > SRV_SHUTDOWN_INITIATED) - break; + if (!buf_pool.need_LRU_eviction()) + { + if (srv_shutdown_state > SRV_SHUTDOWN_INITIATED) + break; - if (buf_pool.page_cleaner_idle() && - (!UT_LIST_GET_LEN(buf_pool.flush_list) || - srv_max_dirty_pages_pct_lwm == 0.0)) - /* We are idle; wait for buf_pool.page_cleaner_wakeup() */ - my_cond_wait(&buf_pool.do_flush_list, - &buf_pool.flush_list_mutex.m_mutex); - else - my_cond_timedwait(&buf_pool.do_flush_list, - &buf_pool.flush_list_mutex.m_mutex, &abstime); - no_wait: + if (buf_pool.page_cleaner_idle() && + (!UT_LIST_GET_LEN(buf_pool.flush_list) || + srv_max_dirty_pages_pct_lwm == 0.0)) + { + buf_pool.LRU_warned.clear(std::memory_order_release); + /* We are idle; wait for buf_pool.page_cleaner_wakeup() */ + my_cond_wait(&buf_pool.do_flush_list, + &buf_pool.flush_list_mutex.m_mutex); + } + else + my_cond_timedwait(&buf_pool.do_flush_list, + &buf_pool.flush_list_mutex.m_mutex, &abstime); + } set_timespec(abstime, 1); lsn_limit= buf_flush_sync_lsn; @@ -2445,9 +2485,9 @@ do { - DBUG_EXECUTE_IF("ib_log_checkpoint_avoid", continue;); - DBUG_EXECUTE_IF("ib_log_checkpoint_avoid_hard", continue;); - + IF_DBUG(if (_db_keyword_(nullptr, "ib_log_checkpoint_avoid", 1) || + _db_keyword_(nullptr, "ib_log_checkpoint_avoid_hard", 1)) + continue,); if (!recv_recovery_is_on() && !srv_startup_is_before_trx_rollback_phase && srv_operation <= SRV_OPERATION_EXPORT_RESTORED) @@ -2455,7 +2495,7 @@ } while (false); - if (!buf_pool.ran_out()) + if (!buf_pool.need_LRU_eviction()) continue; mysql_mutex_lock(&buf_pool.flush_list_mutex); oldest_lsn= buf_pool.get_oldest_modification(0); @@ -2484,30 +2524,20 @@ if (oldest_lsn >= soft_lsn_limit) buf_flush_async_lsn= soft_lsn_limit= 0; } - else if (buf_pool.ran_out()) + else if (buf_pool.need_LRU_eviction()) { buf_pool.page_cleaner_set_idle(false); buf_pool.n_flush_inc(); - /* Remove clean blocks from buf_pool.flush_list before the LRU scan. */ - for (buf_page_t *p= UT_LIST_GET_FIRST(buf_pool.flush_list); p; ) - { - const lsn_t lsn{p->oldest_modification()}; - ut_ad(lsn > 2 || lsn == 1); - buf_page_t *n= UT_LIST_GET_NEXT(list, p); - if (lsn <= 1) - buf_pool.delete_from_flush_list(p); - p= n; - } mysql_mutex_unlock(&buf_pool.flush_list_mutex); n= srv_max_io_capacity; mysql_mutex_lock(&buf_pool.mutex); LRU_flush: - n= buf_flush_LRU(n, false); + n= buf_flush_LRU(n); mysql_mutex_unlock(&buf_pool.mutex); last_pages+= n; check_oldest_and_set_idle: mysql_mutex_lock(&buf_pool.flush_list_mutex); - buf_pool.n_flush_dec_holding_mutex(); + buf_pool.n_flush_dec(); oldest_lsn= buf_pool.get_oldest_modification(0); if (!oldest_lsn) goto fully_unemployed; @@ -2549,10 +2579,11 @@ else { maybe_unemployed: - const bool below{dirty_pct < pct_lwm}; - pct_lwm= 0.0; - if (below) + if (dirty_pct < pct_lwm) + { + pct_lwm= 0.0; goto possibly_unemployed; + } } } else if (dirty_pct < srv_max_buf_pool_modified_pct) @@ -2598,9 +2629,13 @@ MONITOR_FLUSH_ADAPTIVE_PAGES, n_flushed); } - else if (buf_flush_async_lsn <= oldest_lsn) + else if (buf_flush_async_lsn <= oldest_lsn && + !buf_pool.need_LRU_eviction()) goto check_oldest_and_set_idle; + else + mysql_mutex_lock(&buf_pool.mutex); + n= srv_max_io_capacity; n= n >= n_flushed ? n - n_flushed : 0; goto LRU_flush; } @@ -2635,6 +2670,16 @@ #endif } +ATTRIBUTE_COLD void buf_pool_t::LRU_warn() +{ + mysql_mutex_assert_owner(&mutex); + if (!LRU_warned.test_and_set(std::memory_order_acquire)) + sql_print_warning("InnoDB: Could not free any blocks in the buffer pool!" + " %zu blocks are in use and %zu free." + " Consider increasing innodb_buffer_pool_size.", + UT_LIST_GET_LEN(LRU), UT_LIST_GET_LEN(free)); +} + /** Initialize page_cleaner. */ ATTRIBUTE_COLD void buf_flush_page_cleaner_init() { diff -Nru mariadb-10.11.6/storage/innobase/buf/buf0lru.cc mariadb-10.11.9/storage/innobase/buf/buf0lru.cc --- mariadb-10.11.6/storage/innobase/buf/buf0lru.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/buf/buf0lru.cc 2024-08-03 07:29:59.000000000 +0000 @@ -60,10 +60,6 @@ frames in the buffer pool, we set this to TRUE */ static bool buf_lru_switched_on_innodb_mon = false; -/** True if diagnostic message about difficult to find free blocks -in the buffer bool has already printed. */ -static bool buf_lru_free_blocks_error_printed; - /******************************************************************//** These statistics are not 'of' LRU but 'for' LRU. We keep count of I/O and page_zip_decompress() operations. Based on the statistics, @@ -389,123 +385,94 @@ @return the free control block, in state BUF_BLOCK_MEMORY */ buf_block_t *buf_LRU_get_free_block(bool have_mutex) { - ulint n_iterations = 0; - ulint flush_failures = 0; - MONITOR_INC(MONITOR_LRU_GET_FREE_SEARCH); - if (have_mutex) { - mysql_mutex_assert_owner(&buf_pool.mutex); - goto got_mutex; - } - DBUG_EXECUTE_IF("recv_ran_out_of_buffer", - if (recv_recovery_is_on() - && recv_sys.apply_log_recs) { - mysql_mutex_lock(&buf_pool.mutex); - goto flush_lru; - }); -get_mutex: - mysql_mutex_lock(&buf_pool.mutex); -got_mutex: - buf_LRU_check_size_of_non_data_objects(); - buf_block_t* block; - - DBUG_EXECUTE_IF("ib_lru_force_no_free_page", - if (!buf_lru_free_blocks_error_printed) { - n_iterations = 21; - goto not_found;}); + bool waited= false; + MONITOR_INC(MONITOR_LRU_GET_FREE_SEARCH); + if (!have_mutex) + mysql_mutex_lock(&buf_pool.mutex); + + buf_LRU_check_size_of_non_data_objects(); + + buf_block_t *block; retry: - /* If there is a block in the free list, take it */ - if ((block = buf_LRU_get_free_only()) != nullptr) { + /* If there is a block in the free list, take it */ + block= buf_LRU_get_free_only(); + if (block) + { got_block: - if (!have_mutex) { - mysql_mutex_unlock(&buf_pool.mutex); - } - block->page.zip.clear(); - return block; - } + const ulint LRU_size= UT_LIST_GET_LEN(buf_pool.LRU); + const ulint available= UT_LIST_GET_LEN(buf_pool.free); + const ulint scan_depth= srv_LRU_scan_depth / 2; + ut_ad(LRU_size <= BUF_LRU_MIN_LEN || + available >= scan_depth || buf_pool.need_LRU_eviction()); - MONITOR_INC( MONITOR_LRU_GET_FREE_LOOPS ); - if (n_iterations || buf_pool.try_LRU_scan) { - /* If no block was in the free list, search from the - end of the LRU list and try to free a block there. - If we are doing for the first time we'll scan only - tail of the LRU list otherwise we scan the whole LRU - list. */ - if (buf_LRU_scan_and_free_block(n_iterations - ? ULINT_UNDEFINED : 100)) { - goto retry; - } + ut_d(bool signalled = false); - /* Tell other threads that there is no point - in scanning the LRU list. */ - buf_pool.try_LRU_scan = false; - } + if (UNIV_UNLIKELY(available < scan_depth) && LRU_size > BUF_LRU_MIN_LEN) + { + mysql_mutex_lock(&buf_pool.flush_list_mutex); + if (!buf_pool.page_cleaner_active()) + { + buf_pool.page_cleaner_wakeup(true); + ut_d(signalled = true); + } + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + } - for (;;) { - if ((block = buf_LRU_get_free_only()) != nullptr) { - goto got_block; - } - mysql_mutex_unlock(&buf_pool.mutex); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - const auto n_flush = buf_pool.n_flush(); - if (!buf_pool.try_LRU_scan) { - buf_pool.page_cleaner_wakeup(true); - } - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - mysql_mutex_lock(&buf_pool.mutex); - if (!n_flush) { - goto not_found; - } - if (!buf_pool.try_LRU_scan) { - my_cond_wait(&buf_pool.done_free, - &buf_pool.mutex.m_mutex); - } - } + if (!have_mutex) + mysql_mutex_unlock(&buf_pool.mutex); + + DBUG_EXECUTE_IF("ib_free_page_sleep", + { + static bool do_sleep = true; + if (do_sleep && signalled) + { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + do_sleep = false; + } + }); + + block->page.zip.clear(); + return block; + } + + MONITOR_INC(MONITOR_LRU_GET_FREE_LOOPS); + if (waited || buf_pool.try_LRU_scan) + { + /* If no block was in the free list, search from the end of the + LRU list and try to free a block there. If we are doing for the + first time we'll scan only tail of the LRU list otherwise we scan + the whole LRU list. */ + if (buf_LRU_scan_and_free_block(waited ? ULINT_UNDEFINED : 100)) + goto retry; + + /* Tell other threads that there is no point in scanning the LRU + list. */ + buf_pool.try_LRU_scan= false; + } + + waited= true; + + while (!(block= buf_LRU_get_free_only())) + { + buf_pool.stat.LRU_waits++; -not_found: - if (n_iterations > 1) { - MONITOR_INC( MONITOR_LRU_GET_FREE_WAITS ); - } - - if (n_iterations == 21 && !buf_lru_free_blocks_error_printed - && srv_buf_pool_old_size == srv_buf_pool_size) { - buf_lru_free_blocks_error_printed = true; - mysql_mutex_unlock(&buf_pool.mutex); - ib::warn() << "Difficult to find free blocks in the buffer pool" - " (" << n_iterations << " search iterations)! " - << flush_failures << " failed attempts to" - " flush a page!" - " Consider increasing innodb_buffer_pool_size." - " Pending flushes (fsync): " - << fil_n_pending_tablespace_flushes - << ". " << os_n_file_reads << " OS file reads, " - << os_n_file_writes << " OS file writes, " - << os_n_fsyncs - << " OS fsyncs."; - mysql_mutex_lock(&buf_pool.mutex); - } - - /* No free block was found: try to flush the LRU list. - The freed blocks will be up for grabs for all threads. - - TODO: A more elegant way would have been to return one freed - up block to the caller here but the code that deals with - removing the block from buf_pool.page_hash and buf_pool.LRU is fairly - involved (particularly in case of ROW_FORMAT=COMPRESSED pages). We - can do that in a separate patch sometime in future. */ -#ifndef DBUG_OFF -flush_lru: -#endif - if (!buf_flush_LRU(innodb_lru_flush_size, true)) { - MONITOR_INC(MONITOR_LRU_SINGLE_FLUSH_FAILURE_COUNT); - ++flush_failures; - } - - n_iterations++; - buf_pool.stat.LRU_waits++; - mysql_mutex_unlock(&buf_pool.mutex); - buf_dblwr.flush_buffered_writes(); - goto get_mutex; + timespec abstime; + set_timespec(abstime, 1); + + mysql_mutex_lock(&buf_pool.flush_list_mutex); + if (!buf_pool.page_cleaner_active()) + buf_pool.page_cleaner_wakeup(true); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + if (my_cond_timedwait(&buf_pool.done_free, &buf_pool.mutex.m_mutex, + &abstime)) + { + buf_pool.LRU_warn(); + buf_LRU_check_size_of_non_data_objects(); + } + } + + goto got_block; } /** Move the LRU_old pointer so that the length of the old blocks list @@ -787,6 +754,14 @@ mysql_mutex_unlock(&buf_pool.mutex); } +bool buf_page_make_young_if_needed(buf_page_t *bpage) +{ + const bool not_first{bpage->set_accessed()}; + if (UNIV_UNLIKELY(buf_page_peek_if_too_old(bpage))) + buf_page_make_young(bpage); + return not_first; +} + /** Try to free a block. If bpage is a descriptor of a compressed-only ROW_FORMAT=COMPRESSED page, the buf_page_t object will be freed as well. The caller must hold buf_pool.mutex. diff -Nru mariadb-10.11.6/storage/innobase/buf/buf0rea.cc mariadb-10.11.9/storage/innobase/buf/buf0rea.cc --- mariadb-10.11.6/storage/innobase/buf/buf0rea.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/buf/buf0rea.cc 2024-08-03 07:29:59.000000000 +0000 @@ -300,12 +300,15 @@ } ut_ad(bpage->in_file()); - ulonglong mariadb_timer= 0; + ulonglong mariadb_timer = 0; if (sync) { thd_wait_begin(nullptr, THD_WAIT_DISKIO); - if (mariadb_stats_active()) - mariadb_timer= mariadb_measure(); + if (const ha_handler_stats *stats = mariadb_stats) { + if (stats->active) { + mariadb_timer = mariadb_measure(); + } + } } DBUG_LOG("ib_buf", @@ -324,15 +327,16 @@ if (UNIV_UNLIKELY(fio.err != DB_SUCCESS)) { buf_pool.corrupted_evict(bpage, buf_page_t::READ_FIX); } else if (sync) { - thd_wait_end(NULL); + thd_wait_end(nullptr); /* The i/o was already completed in space->io() */ fio.err = bpage->read_complete(*fio.node); space->release(); if (fio.err == DB_FAIL) { fio.err = DB_PAGE_CORRUPTED; } - if (mariadb_timer) - mariadb_increment_pages_read_time(mariadb_timer); + if (mariadb_timer) { + mariadb_increment_pages_read_time(mariadb_timer); + } } return fio.err; @@ -423,6 +427,7 @@ if (count) { + mariadb_increment_pages_prefetched(count); DBUG_PRINT("ib_buf", ("random read-ahead %zu pages from %s: %u", count, space->chain.start->name, low.page_no())); @@ -575,7 +580,7 @@ hash_lock.lock_shared(); const buf_page_t* bpage= buf_pool.page_hash.get(i, chain); - if (!bpage) + if (!bpage || buf_pool.watch_is_sentinel(*bpage)) { hash_lock.unlock_shared(); if (i == page_id) @@ -597,6 +602,12 @@ uint32_t prev= mach_read_from_4(my_assume_aligned<4>(f + FIL_PAGE_PREV)); uint32_t next= mach_read_from_4(my_assume_aligned<4>(f + FIL_PAGE_NEXT)); hash_lock.unlock_shared(); + /* The underlying file page of this buffer pool page could actually + be marked as freed, or a read of the page into the buffer pool might + be in progress. We may read uninitialized data here. + Suppress warnings of comparing uninitialized values. */ + MEM_MAKE_DEFINED(&prev, sizeof prev); + MEM_MAKE_DEFINED(&next, sizeof next); if (prev == FIL_NULL || next == FIL_NULL) goto fail; page_id_t id= page_id; @@ -661,6 +672,7 @@ if (count) { + mariadb_increment_pages_prefetched(count); DBUG_PRINT("ib_buf", ("random read-ahead %zu pages from %s: %u", count, space->chain.start->name, new_low.page_no())); diff -Nru mariadb-10.11.6/storage/innobase/dict/dict0boot.cc mariadb-10.11.9/storage/innobase/dict/dict0boot.cc --- mariadb-10.11.6/storage/innobase/dict/dict0boot.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/dict/dict0boot.cc 2024-08-03 07:29:59.000000000 +0000 @@ -42,7 +42,10 @@ static buf_block_t *dict_hdr_get(mtr_t *mtr) { /* We assume that the DICT_HDR page is always readable and available. */ - return buf_page_get_gen(hdr_page_id, 0, RW_X_LATCH, nullptr, BUF_GET, mtr); + buf_block_t *b= + buf_page_get_gen(hdr_page_id, 0, RW_X_LATCH, nullptr, BUF_GET, mtr); + buf_page_make_young_if_needed(&b->page); + return b; } /**********************************************************************//** diff -Nru mariadb-10.11.6/storage/innobase/dict/dict0crea.cc mariadb-10.11.9/storage/innobase/dict/dict0crea.cc --- mariadb-10.11.6/storage/innobase/dict/dict0crea.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/dict/dict0crea.cc 2024-08-03 07:29:59.000000000 +0000 @@ -353,9 +353,6 @@ /* Always set this bit for all new created tables */ DICT_TF2_FLAG_SET(table, DICT_TF2_FTS_AUX_HEX_NAME); - DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name", - DICT_TF2_FLAG_UNSET(table, - DICT_TF2_FTS_AUX_HEX_NAME);); if (DICT_TF2_FLAG_IS_SET(table, DICT_TF2_USE_FILE_PER_TABLE)) { /* This table will need a new tablespace. */ diff -Nru mariadb-10.11.6/storage/innobase/dict/dict0dict.cc mariadb-10.11.9/storage/innobase/dict/dict0dict.cc --- mariadb-10.11.6/storage/innobase/dict/dict0dict.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/dict/dict0dict.cc 2024-08-03 07:29:59.000000000 +0000 @@ -657,47 +657,22 @@ /** Acquire MDL shared for the table name. @tparam trylock whether to use non-blocking operation @param[in,out] table table object -@param[in,out] thd background thread -@param[out] mdl mdl ticket +@param[in,out] mdl_context MDL context +@param[out] mdl MDL ticket @param[in] table_op operation to perform when opening @return table object after locking MDL shared @retval nullptr if the table is not readable, or if trylock && MDL blocked */ template +__attribute__((nonnull, warn_unused_result)) dict_table_t* dict_acquire_mdl_shared(dict_table_t *table, - THD *thd, - MDL_ticket **mdl, + MDL_context *mdl_context, MDL_ticket **mdl, dict_table_op_t table_op) { - if (!table || !mdl) - return table; - - MDL_context *mdl_context= static_cast(thd_mdl_context(thd)); - size_t db_len; - dict_table_t *not_found= nullptr; - - if (trylock) - { - dict_sys.freeze(SRW_LOCK_CALL); - db_len= dict_get_db_name_len(table->name.m_name); - dict_sys.unfreeze(); - } - else - { - ut_ad(dict_sys.frozen_not_locked()); - db_len= dict_get_db_name_len(table->name.m_name); - } - - if (db_len == 0) - return table; /* InnoDB system tables are not covered by MDL */ - - if (!mdl_context) - return nullptr; - table_id_t table_id= table->id; char db_buf[NAME_LEN + 1], db_buf1[NAME_LEN + 1]; char tbl_buf[NAME_LEN + 1], tbl_buf1[NAME_LEN + 1]; - size_t tbl_len; + size_t db_len, tbl_len; bool unaccessible= false; if (!table->parse_name(db_buf, tbl_buf, &db_len, &tbl_len)) @@ -768,7 +743,6 @@ if (!table || !table->is_accessible()) { - table= nullptr; return_without_mdl: if (trylock) dict_sys.unfreeze(); @@ -777,7 +751,7 @@ mdl_context->release_lock(*mdl); *mdl= nullptr; } - return not_found; + return nullptr; } size_t db1_len, tbl1_len; @@ -815,6 +789,50 @@ } template dict_table_t* dict_acquire_mdl_shared +(dict_table_t*,MDL_context*,MDL_ticket**,dict_table_op_t); + +/** Acquire MDL shared for the table name. +@tparam trylock whether to use non-blocking operation +@param[in,out] table table object +@param[in,out] thd background thread +@param[out] mdl mdl ticket +@param[in] table_op operation to perform when opening +@return table object after locking MDL shared +@retval nullptr if the table is not readable, or if trylock && MDL blocked */ +template +dict_table_t* +dict_acquire_mdl_shared(dict_table_t *table, + THD *thd, + MDL_ticket **mdl, + dict_table_op_t table_op) +{ + if (!table || !mdl) + return table; + + MDL_context *mdl_context= static_cast(thd_mdl_context(thd)); + size_t db_len; + + if (trylock) + { + dict_sys.freeze(SRW_LOCK_CALL); + db_len= dict_get_db_name_len(table->name.m_name); + dict_sys.unfreeze(); + } + else + { + ut_ad(dict_sys.frozen_not_locked()); + db_len= dict_get_db_name_len(table->name.m_name); + } + + if (db_len == 0) + return table; /* InnoDB system tables are not covered by MDL */ + + return mdl_context + ? dict_acquire_mdl_shared(table, mdl_context, mdl, table_op) + : nullptr; +} + +template dict_table_t* dict_acquire_mdl_shared (dict_table_t*,THD*,MDL_ticket**,dict_table_op_t); template dict_table_t* dict_acquire_mdl_shared (dict_table_t*,THD*,MDL_ticket**,dict_table_op_t); @@ -960,9 +978,6 @@ { latch.wr_lock(SRW_LOCK_ARGS(file, line)); latch_ex_wait_start.store(0, std::memory_order_relaxed); - ut_ad(!latch_readers); - ut_ad(!latch_ex); - ut_d(latch_ex= pthread_self()); return; } @@ -978,35 +993,36 @@ ib::warn() << "A long wait (" << waited << " seconds) was observed for dict_sys.latch"; latch.wr_lock(SRW_LOCK_ARGS(file, line)); - ut_ad(!latch_readers); - ut_ad(!latch_ex); - ut_d(latch_ex= pthread_self()); } #ifdef UNIV_PFS_RWLOCK ATTRIBUTE_NOINLINE void dict_sys_t::unlock() { - ut_ad(latch_ex == pthread_self()); - ut_ad(!latch_readers); - ut_d(latch_ex= 0); latch.wr_unlock(); } ATTRIBUTE_NOINLINE void dict_sys_t::freeze(const char *file, unsigned line) { latch.rd_lock(file, line); - ut_ad(!latch_ex); - ut_d(latch_readers++); } ATTRIBUTE_NOINLINE void dict_sys_t::unfreeze() { - ut_ad(!latch_ex); - ut_ad(latch_readers--); latch.rd_unlock(); } #endif /* UNIV_PFS_RWLOCK */ +/** Report an error about failing to open a table. +@param name table name */ +static void dict_table_open_failed(const table_name_t &name) +{ + my_printf_error(ER_TABLE_CORRUPT, + "Table %`.*s.%`s is corrupted." + " Please drop the table and recreate.", + MYF(ME_ERROR_LOG), + int(name.dblen()), name.m_name, name.basename()); +} + /**********************************************************************//** Returns a table object and increments its open handle count. NOTE! This is a high-level function to be used mainly from outside the @@ -1039,18 +1055,20 @@ if (!(ignore_err & ~DICT_ERR_IGNORE_FK_NOKEY) && !table->is_readable() && table->corrupted) { - ulint algo = table->space->get_compression_algo(); - if (algo <= PAGE_ALGORITHM_LAST && !fil_comp_algo_loaded(algo)) { - my_printf_error(ER_PROVIDER_NOT_LOADED, - "Table %s is compressed with %s, which is not currently loaded. " - "Please load the %s provider plugin to open the table", - MYF(ME_ERROR_LOG), table->name, - page_compression_algorithms[algo], page_compression_algorithms[algo]); - } else { - my_printf_error(ER_TABLE_CORRUPT, - "Table %s is corrupted. Please drop the table and recreate.", - MYF(ME_ERROR_LOG), table->name); - } + ulint algo= table->space->get_compression_algo(); + if (algo <= PAGE_ALGORITHM_LAST && !fil_comp_algo_loaded(algo)) + my_printf_error(ER_PROVIDER_NOT_LOADED, + "Table %`.*s.%`s is compressed with %s," + " which is not currently loaded. " + "Please load the %s provider plugin" + " to open the table", + MYF(ME_ERROR_LOG), + int(table->name.dblen()), table->name.m_name, + table->name.basename(), + page_compression_algorithms[algo], + page_compression_algorithms[algo]); + else + dict_table_open_failed(table->name); dict_sys.unfreeze(); DBUG_RETURN(nullptr); } @@ -1070,8 +1088,7 @@ if (!(ignore_err & ~DICT_ERR_IGNORE_FK_NOKEY) && !table->is_readable() && table->corrupted) { - ib::error() << "Table " << table->name - << " is corrupted. Please drop the table and recreate."; + dict_table_open_failed(table->name); if (!dict_locked) dict_sys.unlock(); DBUG_RETURN(nullptr); @@ -1992,7 +2009,6 @@ new_index->n_fields = new_index->n_def; new_index->trx_id = index->trx_id; new_index->set_committed(index->is_committed()); - new_index->nulls_equal = index->nulls_equal; n_ord = new_index->n_uniq; /* Flag the ordering columns and also set column max_prefix */ @@ -2809,8 +2825,7 @@ for (dict_index_t* index = dict_table_get_first_index(table); index; index = dict_table_get_next_index(index)) { - if (types_idx != index - && !index->to_be_dropped + if (!index->to_be_dropped && !dict_index_is_online_ddl(index) && dict_foreign_qualify_index( table, col_names, columns, n_cols, @@ -3530,6 +3545,7 @@ const char* ptr1; const char* id; CHARSET_INFO* cs; + bool if_exists = false; ut_a(trx->mysql_thd); @@ -3583,6 +3599,7 @@ ptr1 = dict_accept(cs, ptr1, "EXISTS", &success); if (success) { ptr = ptr1; + if_exists = true; } } @@ -3593,14 +3610,14 @@ goto syntax_error; } - ut_a(*n < 1000); - (*constraints_to_drop)[*n] = id; - (*n)++; - if (std::find_if(table->foreign_set.begin(), - table->foreign_set.end(), - dict_foreign_matches_id(id)) - == table->foreign_set.end()) { + table->foreign_set.end(), + dict_foreign_matches_id(id)) + == table->foreign_set.end()) { + + if (if_exists) { + goto loop; + } if (!srv_read_only_mode) { FILE* ef = dict_foreign_err_file; @@ -3622,6 +3639,9 @@ return(DB_CANNOT_DROP_CONSTRAINT); } + ut_a(*n < 1000); + (*constraints_to_drop)[*n] = id; + (*n)++; goto loop; syntax_error: diff -Nru mariadb-10.11.6/storage/innobase/dict/dict0load.cc mariadb-10.11.9/storage/innobase/dict/dict0load.cc --- mariadb-10.11.6/storage/innobase/dict/dict0load.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/dict/dict0load.cc 2024-08-03 07:29:59.000000000 +0000 @@ -33,8 +33,8 @@ #include "dict0boot.h" #include "dict0crea.h" #include "dict0dict.h" -#include "dict0mem.h" #include "dict0stats.h" +#include "ibuf0ibuf.h" #include "fsp0file.h" #include "fts0priv.h" #include "mach0data.h" @@ -865,18 +865,30 @@ return READ_OK; } -/** Check each tablespace found in the data dictionary. -Then look at each table defined in SYS_TABLES that has a space_id > 0 -to find all the file-per-table tablespaces. - -In a crash recovery we already have some tablespace objects created from -processing the REDO log. We will compare the -space_id information in the data dictionary to what we find in the -tablespace file. In addition, more validation will be done if recovery -was needed and force_recovery is not set. +/** @return SELECT MAX(space) FROM sys_tables */ +static uint32_t dict_find_max_space_id(btr_pcur_t *pcur, mtr_t *mtr) +{ + uint32_t max_space_id= 0; -We also scan the biggest space id, and store it to fil_system. */ -void dict_check_tablespaces_and_store_max_id() + for (const rec_t *rec= dict_startscan_system(pcur, mtr, dict_sys.sys_tables); + rec; rec= dict_getnext_system_low(pcur, mtr)) + if (!dict_sys_tables_rec_check(rec)) + { + ulint len; + const byte *field= + rec_get_nth_field_old(rec, DICT_FLD__SYS_TABLES__SPACE, &len); + ut_ad(len == 4); + max_space_id= std::max(max_space_id, mach_read_from_4(field)); + } + + return max_space_id; +} + +/** Check MAX(SPACE) FROM SYS_TABLES and store it in fil_system. +Open each data file if an encryption plugin has been loaded. + +@param spaces set of tablespace files to open */ +void dict_check_tablespaces_and_store_max_id(const std::set *spaces) { uint32_t max_space_id = 0; btr_pcur_t pcur; @@ -888,6 +900,12 @@ dict_sys.lock(SRW_LOCK_CALL); + if (!spaces && ibuf.empty + && !encryption_key_id_exists(FIL_DEFAULT_ENCRYPTION_KEY)) { + max_space_id = dict_find_max_space_id(&pcur, &mtr); + goto done; + } + for (const rec_t *rec = dict_startscan_system(&pcur, &mtr, dict_sys.sys_tables); rec; rec = dict_getnext_system_low(&pcur, &mtr)) { @@ -919,14 +937,6 @@ continue; } - if (flags2 & DICT_TF2_DISCARDED) { - sql_print_information("InnoDB: Ignoring tablespace" - " for %.*s because " - "the DISCARD flag is set", - static_cast(len), field); - continue; - } - /* For tables or partitions using .ibd files, the flag DICT_TF2_USE_FILE_PER_TABLE was not set in MIX_LEN before MySQL 5.6.5. The flag should not have been @@ -939,6 +949,19 @@ continue; } + if (spaces && spaces->find(uint32_t(space_id)) + == spaces->end()) { + continue; + } + + if (flags2 & DICT_TF2_DISCARDED) { + sql_print_information("InnoDB: Ignoring tablespace" + " for %.*s because " + "the DISCARD flag is set", + static_cast(len), field); + continue; + } + const span name{field, len}; char* filepath = fil_make_filepath(nullptr, name, @@ -971,6 +994,7 @@ ut_free(filepath); } +done: mtr.commit(); fil_set_max_space_id_if_bigger(max_space_id); @@ -2246,22 +2270,10 @@ /* The tablespace may already be open. */ table->space = fil_space_for_table_exists_in_mem(table->space_id, table->flags); - if (table->space) { - return; - } - - if (ignore_err >= DICT_ERR_IGNORE_TABLESPACE) { - table->file_unreadable = true; + if (table->space || table->file_unreadable) { return; } - if (!(ignore_err & DICT_ERR_IGNORE_RECOVER_LOCK)) { - ib::error() << "Failed to find tablespace for table " - << table->name << " in the cache. Attempting" - " to load the tablespace with space id " - << table->space_id; - } - /* Use the remote filepath if needed. This parameter is optional in the call to fil_ibd_open(). If not supplied, it will be built from the table->name. */ @@ -2284,6 +2296,12 @@ if (!table->space) { /* We failed to find a sensible tablespace file */ table->file_unreadable = true; + + if (!(ignore_err & DICT_ERR_IGNORE_RECOVER_LOCK)) { + sql_print_error("InnoDB: Failed to load tablespace " + ULINTPF " for table %s", + table->space_id, table->name); + } } ut_free(filepath); diff -Nru mariadb-10.11.6/storage/innobase/dict/dict0stats.cc mariadb-10.11.9/storage/innobase/dict/dict0stats.cc --- mariadb-10.11.6/storage/innobase/dict/dict0stats.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/dict/dict0stats.cc 2024-08-03 07:29:59.000000000 +0000 @@ -752,16 +752,9 @@ } } -/*********************************************************************//** -Write all zeros (or 1 where it makes sense) into a table and its indexes' -statistics members. The resulting stats correspond to an empty table. */ -static -void -dict_stats_empty_table( -/*===================*/ - dict_table_t* table, /*!< in/out: table */ +void dict_stats_empty_table( + dict_table_t* table, bool empty_defrag_stats) - /*!< in: whether to empty defrag stats */ { /* Initialize table/index level stats is now protected by table level lock_mutex.*/ @@ -3512,25 +3505,35 @@ break; case 1: /* mysql.innodb_table_stats.clustered_index_size */ - + { ut_a(dtype_get_mtype(type) == DATA_INT); ut_a(len == 8); table->stat_clustered_index_size - = (ulint) mach_read_from_8(data); - + = std::max( + (ulint) mach_read_from_8(data), 1); break; + } case 2: /* mysql.innodb_table_stats.sum_of_other_index_sizes */ - + { ut_a(dtype_get_mtype(type) == DATA_INT); ut_a(len == 8); - table->stat_sum_of_other_index_sizes + ulint stat_other_idx_size = (ulint) mach_read_from_8(data); + if (!stat_other_idx_size + && UT_LIST_GET_LEN(table->indexes) > 1) { + stat_other_idx_size + = UT_LIST_GET_LEN(table->indexes) - 1; + } + table->stat_sum_of_other_index_sizes + = std::max( + (ulint) mach_read_from_8(data), + UT_LIST_GET_LEN(table->indexes) - 1); break; - + } default: /* someone changed SELECT @@ -3713,12 +3716,14 @@ if (stat_name_len == 4 /* strlen("size") */ && strncasecmp("size", stat_name, stat_name_len) == 0) { - index->stat_index_size = (ulint) stat_value; + index->stat_index_size + = std::max((ulint) stat_value, 1); arg->stats_were_modified = true; } else if (stat_name_len == 12 /* strlen("n_leaf_pages") */ && strncasecmp("n_leaf_pages", stat_name, stat_name_len) == 0) { - index->stat_n_leaf_pages = (ulint) stat_value; + index->stat_n_leaf_pages + = std::max((ulint) stat_value, 1); arg->stats_were_modified = true; } else if (stat_name_len == 12 /* strlen("n_page_split") */ && strncasecmp("n_page_split", stat_name, stat_name_len) @@ -3798,7 +3803,8 @@ index->stat_n_diff_key_vals[n_pfx - 1] = stat_value; if (sample_size != UINT64_UNDEFINED) { - index->stat_n_sample_sizes[n_pfx - 1] = sample_size; + index->stat_n_sample_sizes[n_pfx - 1] = + std::max(sample_size, 1); } else { /* hmm, strange... the user must have UPDATEd the table manually and SET sample_size = NULL */ @@ -3874,6 +3880,10 @@ goto release_and_exit; } +#ifdef ENABLED_DEBUG_SYNC + DEBUG_SYNC(thd, "dict_stats_mdl_acquired"); +#endif /* ENABLED_DEBUG_SYNC */ + trx = trx_create(); trx_start_internal_read_only(trx); diff -Nru mariadb-10.11.6/storage/innobase/dict/dict0stats_bg.cc mariadb-10.11.9/storage/innobase/dict/dict0stats_bg.cc --- mariadb-10.11.6/storage/innobase/dict/dict0stats_bg.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/dict/dict0stats_bg.cc 2024-08-03 07:29:59.000000000 +0000 @@ -69,6 +69,8 @@ /** Whether the global data structures have been initialized */ static bool stats_initialised; +static THD *dict_stats_thd; + /*****************************************************************//** Free the resources occupied by the recalc pool, called once during thread de-initialization. */ @@ -90,6 +92,9 @@ defrag_pool_t defrag_empty_pool; recalc_pool.swap(recalc_empty_pool); defrag_pool.swap(defrag_empty_pool); + + if (dict_stats_thd) + destroy_background_thd(dict_stats_thd); } /*****************************************************************//** @@ -361,52 +366,50 @@ { ut_ad(i->state == recalc::IN_PROGRESS); recalc_pool.erase(i); - const bool reschedule= !update_now && recalc_pool.empty(); if (err == DB_SUCCESS_LOCKED_REC) recalc_pool.emplace_back(recalc{table_id, recalc::IDLE}); mysql_mutex_unlock(&recalc_pool_mutex); - if (reschedule) - dict_stats_schedule(MIN_RECALC_INTERVAL * 1000); } return update_now; } -static tpool::timer* dict_stats_timer; -static std::mutex dict_stats_mutex; +/** Check if the recalc pool is empty. */ +static bool is_recalc_pool_empty() +{ + mysql_mutex_lock(&recalc_pool_mutex); + bool empty= recalc_pool.empty(); + mysql_mutex_unlock(&recalc_pool_mutex); + return empty; +} +static tpool::timer* dict_stats_timer; static void dict_stats_func(void*) { - THD *thd= innobase_create_background_thd("InnoDB statistics"); - set_current_thd(thd); - while (dict_stats_process_entry_from_recalc_pool(thd)) {} - dict_defrag_process_entries_from_defrag_pool(thd); + if (!dict_stats_thd) + dict_stats_thd= innobase_create_background_thd("InnoDB statistics"); + set_current_thd(dict_stats_thd); + + while (dict_stats_process_entry_from_recalc_pool(dict_stats_thd)) {} + dict_defrag_process_entries_from_defrag_pool(dict_stats_thd); + + innobase_reset_background_thd(dict_stats_thd); set_current_thd(nullptr); - destroy_background_thd(thd); + if (!is_recalc_pool_empty()) + dict_stats_schedule(MIN_RECALC_INTERVAL * 1000); } void dict_stats_start() { - std::lock_guard lk(dict_stats_mutex); - if (!dict_stats_timer) - dict_stats_timer= srv_thread_pool->create_timer(dict_stats_func); + DBUG_ASSERT(!dict_stats_timer); + dict_stats_timer= srv_thread_pool->create_timer(dict_stats_func); } static void dict_stats_schedule(int ms) { - std::unique_lock lk(dict_stats_mutex, std::defer_lock); - /* - Use try_lock() to avoid deadlock in dict_stats_shutdown(), which - uses dict_stats_mutex too. If there is simultaneous timer reschedule, - the first one will win, which is fine. - */ - if (!lk.try_lock()) - { - return; - } - if (dict_stats_timer) + if(dict_stats_timer) dict_stats_timer->set_time(ms,0); } @@ -418,7 +421,6 @@ /** Shut down the dict_stats_thread. */ void dict_stats_shutdown() { - std::lock_guard lk(dict_stats_mutex); delete dict_stats_timer; dict_stats_timer= 0; } diff -Nru mariadb-10.11.6/storage/innobase/fil/fil0crypt.cc mariadb-10.11.9/storage/innobase/fil/fil0crypt.cc --- mariadb-10.11.6/storage/innobase/fil/fil0crypt.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fil/fil0crypt.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1348,6 +1348,8 @@ bool fil_crypt_must_default_encrypt() { + /* prevents a race condition with fil_crypt_set_rotate_key_age() */ + mysql_mutex_assert_owner(&fil_system.mutex); return !srv_fil_crypt_rotate_key_age || !srv_encrypt_rotate; } @@ -2201,6 +2203,27 @@ mysql_mutex_unlock(&fil_crypt_threads_mutex); } +/** Add the import tablespace to default_encrypt list +if necessary and signal fil_crypt_threads +@param space imported tablespace */ +void fil_crypt_add_imported_space(fil_space_t *space) +{ + mysql_mutex_lock(&fil_crypt_threads_mutex); + + mysql_mutex_lock(&fil_system.mutex); + + if (fil_crypt_must_default_encrypt()) + { + fil_system.default_encrypt_tables.push_back(*space); + space->is_in_default_encrypt= true; + } + + mysql_mutex_unlock(&fil_system.mutex); + + pthread_cond_broadcast(&fil_crypt_threads_cond); + mysql_mutex_unlock(&fil_crypt_threads_mutex); +} + /********************************************************************* Adjust encrypt tables @param[in] val New setting for innodb-encrypt-tables */ @@ -2290,7 +2313,7 @@ << space->chain.start->name << " (" << space->id << ") active threads " << crypt_data->rotate_state.active_threads - << "flushing=" + << " flushing=" << crypt_data->rotate_state.flushing << "."; last = now; } diff -Nru mariadb-10.11.6/storage/innobase/fil/fil0fil.cc mariadb-10.11.9/storage/innobase/fil/fil0fil.cc --- mariadb-10.11.6/storage/innobase/fil/fil0fil.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fil/fil0fil.cc 2024-08-03 07:29:59.000000000 +0000 @@ -66,13 +66,16 @@ } /** Try to close a file to adhere to the innodb_open_files limit. +@param ignore_space Ignore the tablespace which is acquired by caller @param print_info whether to diagnose why a file cannot be closed @return whether a file was closed */ -bool fil_space_t::try_to_close(bool print_info) +bool fil_space_t::try_to_close(fil_space_t *ignore_space, bool print_info) { mysql_mutex_assert_owner(&fil_system.mutex); for (fil_space_t &space : fil_system.space_list) { + if (&space == ignore_space) + continue; switch (space.purpose) { case FIL_TYPE_TEMPORARY: continue; @@ -324,7 +327,7 @@ clear_closing(); if (++fil_system.n_open >= srv_max_n_open_files) { reacquire(); - try_to_close(true); + try_to_close(this, true); release(); } } @@ -341,8 +344,9 @@ ut_ad(!node->is_open()); ut_ad(node->space->is_closing()); mysql_mutex_assert_owner(&fil_system.mutex); - ulint type; static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096, "compatibility"); +#if defined _WIN32 || defined O_DIRECT + ulint type; switch (FSP_FLAGS_GET_ZIP_SSIZE(node->space->flags)) { case 1: case 2: @@ -351,14 +355,16 @@ default: type= OS_DATA_FILE; } +#else + constexpr auto type= OS_DATA_FILE; +#endif for (;;) { bool success; node->handle= os_file_create(innodb_data_file_key, node->name, node->is_raw_disk - ? OS_FILE_OPEN_RAW | OS_FILE_ON_ERROR_NO_EXIT - : OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, + ? OS_FILE_OPEN_RAW : OS_FILE_OPEN, OS_FILE_AIO, type, srv_read_only_mode, &success); @@ -378,7 +384,7 @@ /* The following call prints an error message */ if (os_file_get_last_error(true) == EMFILE + 100 && - fil_space_t::try_to_close(true)) + fil_space_t::try_to_close(nullptr, true)) continue; ib::warn() << "Cannot open '" << node->name << "'."; @@ -436,7 +442,7 @@ for (ulint count= 0; fil_system.n_open >= srv_max_n_open_files; count++) { - if (fil_space_t::try_to_close(count > 1)) + if (fil_space_t::try_to_close(nullptr, count > 1)) count= 0; else if (count >= 2) { @@ -560,7 +566,7 @@ ut_ad(UT_LIST_GET_LAST(space->chain) == node); ut_ad(size >= FIL_IBD_FILE_INITIAL_SIZE); ut_ad(node->space == space); - ut_ad(space->referenced() || space->is_being_truncated); + ut_ad(space->referenced()); *success = space->size >= size; @@ -649,8 +655,7 @@ default: ut_ad(space->purpose == FIL_TYPE_TABLESPACE || space->purpose == FIL_TYPE_IMPORT); - if (space->purpose == FIL_TYPE_TABLESPACE - && !space->is_being_truncated) { + if (space->purpose == FIL_TYPE_TABLESPACE) { goto do_flush; } break; @@ -735,12 +740,10 @@ bool success= false; const bool acquired= space->acquire(); mysql_mutex_lock(&fil_system.mutex); - if (acquired || space->is_being_truncated) - { + if (acquired) while (fil_space_extend_must_retry(space, UT_LIST_GET_LAST(space->chain), size, &success)) mysql_mutex_lock(&fil_system.mutex); - } mysql_mutex_unlock(&fil_system.mutex); if (acquired) space->release(); @@ -927,9 +930,7 @@ log_sys.latch.wr_unlock(); } else { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); if (space->max_lsn) { ut_d(space->max_lsn = 0); fil_system.named_spaces.remove(*space); @@ -1690,30 +1691,27 @@ /*******************************************************************//** Allocates and builds a file name from a path, a table or tablespace name and a suffix. The string must be freed by caller with ut_free(). -@param[in] path NULL or the directory path or the full path and filename. +@param[in] path nullptr or the directory path or the full path and filename @param[in] name {} if path is full, or Table/Tablespace name -@param[in] ext the file extension to use -@param[in] trim_name true if the last name on the path should be trimmed. +@param[in] extension the file extension to use +@param[in] trim_name true if the last name on the path should be trimmed @return own: file name */ -char* fil_make_filepath(const char *path, const fil_space_t::name_type &name, - ib_extention ext, bool trim_name) +char* fil_make_filepath_low(const char *path, + const fil_space_t::name_type &name, + ib_extention extension, bool trim_name) { /* The path may contain the basename of the file, if so we do not need the name. If the path is NULL, we can use the default path, but there needs to be a name. */ ut_ad(path || name.data()); - /* If we are going to strip a name off the path, there better be a - path and a new name to put back on. */ - ut_ad(!trim_name || (path && name.data())); - if (path == NULL) { path = fil_path_to_mysql_datadir; } ulint len = 0; /* current length */ ulint path_len = strlen(path); - const char* suffix = dot_ext[ext]; + const char* suffix = dot_ext[extension]; ulint suffix_len = strlen(suffix); ulint full_len = path_len + 1 + name.size() + suffix_len + 1; @@ -1796,8 +1794,16 @@ char *fil_make_filepath(const char* path, const table_name_t name, ib_extention suffix, bool strip_name) { - return fil_make_filepath(path, {name.m_name, strlen(name.m_name)}, - suffix, strip_name); + return fil_make_filepath_low(path, {name.m_name, strlen(name.m_name)}, + suffix, strip_name); +} + +/** Wrapper function over fil_make_filepath_low() to build directory name. +@param path the directory path or the full path and filename +@return own: directory name */ +static inline char *fil_make_dirpath(const char *path) +{ + return fil_make_filepath_low(path, fil_space_t::name_type{}, NO_EXT, true); } dberr_t fil_space_t::rename(const char *path, bool log, bool replace) @@ -1838,14 +1844,32 @@ return DB_TABLESPACE_NOT_FOUND; } - exists= false; - if (replace); - else if (!os_file_status(path, &exists, &ftype) || exists) + if (!replace) { - sql_print_error("InnoDB: Cannot rename '%s' to '%s'" - " because the target file exists.", - old_path, path); - return DB_TABLESPACE_EXISTS; + char *schema_path= fil_make_dirpath(path); + if (!schema_path) + return DB_ERROR; + + exists= false; + bool schema_fail= os_file_status(schema_path, &exists, &ftype) && !exists; + ut_free(schema_path); + + if (schema_fail) + { + sql_print_error("InnoDB: Cannot rename '%s' to '%s'" + " because the target schema directory doesn't exist.", + old_path, path); + return DB_ERROR; + } + + exists= false; + if (!os_file_status(path, &exists, &ftype) || exists) + { + sql_print_error("InnoDB: Cannot rename '%s' to '%s'" + " because the target file exists.", + old_path, path); + return DB_TABLESPACE_EXISTS; + } } mtr_t mtr; @@ -1903,9 +1927,10 @@ mtr.flag_wr_unlock(); log_write_up_to(lsn, true); - ulint type; static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096, "compatibility"); +#if defined _WIN32 || defined O_DIRECT + ulint type; switch (FSP_FLAGS_GET_ZIP_SSIZE(flags)) { case 1: case 2: @@ -1914,10 +1939,13 @@ default: type = OS_DATA_FILE; } +#else + constexpr auto type = OS_DATA_FILE; +#endif file = os_file_create( innodb_data_file_key, path, - OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT, + OS_FILE_CREATE, OS_FILE_AIO, type, srv_read_only_mode, &success); if (!success) { @@ -2184,8 +2212,6 @@ goto corrupted; } - os_file_get_last_error(operation_not_for_export, - !operation_not_for_export); if (!operation_not_for_export) { goto corrupted; } @@ -2448,21 +2474,15 @@ mysql_mutex_unlock(&fil_system.mutex); if (space) { - /* Compare the filename we are trying to open with the - filename from the first node of the tablespace we opened - previously. Fail if it is different. */ - fil_node_t* node = UT_LIST_GET_FIRST(space->chain); - if (0 != strcmp(innobase_basename(filename), - innobase_basename(node->name))) { - ib::info() - << "Ignoring data file '" << filename - << "' with space ID " << space->id - << ". Another data file called " << node->name - << " exists with the same space ID."; - space = NULL; - return(FIL_LOAD_ID_CHANGED); - } - return(FIL_LOAD_OK); + sql_print_information("InnoDB: Ignoring data file '%s'" + " with space ID " ULINTPF + ". Another data file called %s" + " exists" + " with the same space ID.", + filename, space->id, + UT_LIST_GET_FIRST(space->chain)->name); + space = NULL; + return FIL_LOAD_ID_CHANGED; } if (srv_operation == SRV_OPERATION_RESTORE) { @@ -2755,12 +2775,12 @@ } DBUG_EXECUTE_IF("intermittent_recovery_failure", - if (type.is_read() && !(~get_rnd_value() & 0x3ff0)) + if (type.is_read() && !(~my_timer_cycles() & 0x3ff0)) goto io_error;); DBUG_EXECUTE_IF("intermittent_read_failure", if (srv_was_started && type.is_read() && - !(~get_rnd_value() & 0x3ff0)) goto io_error;); + !(~my_timer_cycles() & 0x3ff0)) goto io_error;); if (UNIV_LIKELY_NULL(UT_LIST_GET_NEXT(chain, node))) { ut_ad(this == fil_system.sys_space @@ -3027,11 +3047,9 @@ ut_ad(!is_predefined_tablespace(space->id)); /* We are serving mtr_commit(). While there is an active - mini-transaction, we should have !space->stop_new_ops. This is + mini-transaction, we should have !space->is_stopping(). This is guaranteed by meta-data locks or transactional locks. */ - ut_ad(!space->is_stopping() - || space->is_being_truncated /* fil_truncate_prepare() */ - || space->referenced()); + ut_ad(!space->is_stopping() || space->referenced()); } #endif /* UNIV_DEBUG */ @@ -3042,9 +3060,7 @@ fil_names_dirty( fil_space_t* space) { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(recv_recovery_is_on()); ut_ad(log_sys.get_lsn() != 0); ut_ad(space->max_lsn == 0); @@ -3058,9 +3074,7 @@ tablespace was modified for the first time since fil_names_clear(). */ ATTRIBUTE_NOINLINE ATTRIBUTE_COLD void mtr_t::name_write() { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_d(fil_space_validate_for_mtr_commit(m_user_space)); ut_ad(!m_user_space->max_lsn); m_user_space->max_lsn= log_sys.get_lsn(); @@ -3080,13 +3094,11 @@ and write out FILE_MODIFY if needed, and write FILE_CHECKPOINT. @param lsn checkpoint LSN @return current LSN */ -lsn_t fil_names_clear(lsn_t lsn) +ATTRIBUTE_COLD lsn_t fil_names_clear(lsn_t lsn) { mtr_t mtr; -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(lsn); ut_ad(log_sys.is_latest()); diff -Nru mariadb-10.11.6/storage/innobase/fil/fil0pagecompress.cc mariadb-10.11.9/storage/innobase/fil/fil0pagecompress.cc --- mariadb-10.11.6/storage/innobase/fil/fil0pagecompress.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fil/fil0pagecompress.cc 2024-08-03 07:29:59.000000000 +0000 @@ -49,11 +49,6 @@ #include "buf0lru.h" #include "ibuf0ibuf.h" #include "zlib.h" -#ifdef __linux__ -#include -#include -#include -#endif #include "row0mysql.h" #include "lz4.h" #include "lzo/lzo1x.h" diff -Nru mariadb-10.11.6/storage/innobase/fsp/fsp0file.cc mariadb-10.11.9/storage/innobase/fsp/fsp0file.cc --- mariadb-10.11.6/storage/innobase/fsp/fsp0file.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fsp/fsp0file.cc 2024-08-03 07:29:59.000000000 +0000 @@ -435,12 +435,22 @@ return(err); } + if (!m_space_id) { + m_space_id = recv_sys.dblwr.find_first_page( + m_filepath, m_handle); + if (m_space_id) { + m_defer= false; + goto free_first_page; + } else return err; + } + if (!m_defer) { err = find_space_id(); if (err != DB_SUCCESS || m_space_id == 0) { - ib::error() << "Datafile '" << m_filepath - << "' is corrupted. Cannot determine " - "the space ID from the first 64 pages."; + sql_print_error( + "InnoDB: Datafile '%s' is corrupted." + " Cannot determine the space ID from" + " the first 64 pages.", m_filepath); return(err); } } @@ -453,7 +463,7 @@ m_space_id, m_filepath, m_handle)) { return m_defer ? err : DB_CORRUPTION; } - +free_first_page: /* Free the previously read first page and then re-validate. */ free_first_page(); m_defer = false; @@ -492,11 +502,12 @@ return DB_SUCCESS; } - ib::info() << error_txt << " in datafile: " << m_filepath - << ", Space ID:" << m_space_id << ", Flags: " - << m_flags; + sql_print_information( + "InnoDB: %s in datafile: %s, Space ID: " UINT32PF + ", " "Flags: " UINT32PF, + error_txt, m_filepath, m_space_id, m_flags); m_is_valid = false; - return(DB_CORRUPTION); + return DB_CORRUPTION; } /* Check if the whole page is blank. */ diff -Nru mariadb-10.11.6/storage/innobase/fsp/fsp0fsp.cc mariadb-10.11.9/storage/innobase/fsp/fsp0fsp.cc --- mariadb-10.11.6/storage/innobase/fsp/fsp0fsp.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fsp/fsp0fsp.cc 2024-08-03 07:29:59.000000000 +0000 @@ -42,8 +42,6 @@ #include "fsp0types.h" #include "log.h" -typedef uint32_t page_no_t; - /** Returns the first extent descriptor for a segment. We think of the extent lists of the segment catenated in the order FSEG_FULL -> FSEG_NOT_FULL -> FSEG_FREE. @@ -261,6 +259,7 @@ } /** Mark a page used in an extent descriptor. +@param[in] space tablespace @param[in,out] seg_inode segment inode @param[in,out] iblock segment inode page @param[in] page page number @@ -270,8 +269,9 @@ @return error code */ static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t -fseg_mark_page_used(fseg_inode_t *seg_inode, buf_block_t *iblock, - ulint page, xdes_t *descr, buf_block_t *xdes, mtr_t *mtr) +fseg_mark_page_used(const fil_space_t *space, + fseg_inode_t *seg_inode, buf_block_t *iblock, + uint32_t page, xdes_t *descr, buf_block_t *xdes, mtr_t *mtr) { ut_ad(fil_page_get_type(iblock->page.frame) == FIL_PAGE_INODE); ut_ad(!((page_offset(seg_inode) - FSEG_ARR_OFFSET) % FSEG_INODE_SIZE)); @@ -280,15 +280,16 @@ const uint16_t xoffset= uint16_t(descr - xdes->page.frame + XDES_FLST_NODE); const uint16_t ioffset= uint16_t(seg_inode - iblock->page.frame); + const uint32_t limit= space->free_limit; if (!xdes_get_n_used(descr)) { /* We move the extent from the free list to the NOT_FULL list */ if (dberr_t err= flst_remove(iblock, uint16_t(FSEG_FREE + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; if (dberr_t err= flst_add_last(iblock, uint16_t(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; } @@ -305,10 +306,10 @@ { /* We move the extent from the NOT_FULL list to the FULL list */ if (dberr_t err= flst_remove(iblock, uint16_t(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; if (dberr_t err= flst_add_last(iblock, uint16_t(FSEG_FULL + ioffset), - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; mtr->write<4>(*iblock, seg_inode + FSEG_NOT_FULL_N_USED, not_full_n_used - FSP_EXTENT_SIZE); @@ -332,7 +333,7 @@ xdes_get_descriptor_with_space_hdr( buf_block_t* header, const fil_space_t* space, - page_no_t offset, + uint32_t offset, mtr_t* mtr, dberr_t* err = nullptr, buf_block_t** desc_block = nullptr, @@ -396,7 +397,7 @@ @param[out] err error code @param[out] xdes extent descriptor page @return the extent descriptor */ -static xdes_t *xdes_get_descriptor(const fil_space_t *space, page_no_t offset, +static xdes_t *xdes_get_descriptor(const fil_space_t *space, uint32_t offset, mtr_t *mtr, dberr_t *err= nullptr, buf_block_t **xdes= nullptr) { @@ -842,8 +843,7 @@ if (i) { buf_block_t *f= buf_LRU_get_free_block(false); - buf_block_t *block= buf_page_create(space, static_cast(i), - zip_size, mtr, f); + buf_block_t *block= buf_page_create(space, i, zip_size, mtr, f); if (UNIV_UNLIKELY(block != f)) buf_pool.free_block(f); fsp_init_file_page(space, block, mtr); @@ -855,9 +855,7 @@ { buf_block_t *f= buf_LRU_get_free_block(false); buf_block_t *block= - buf_page_create(space, - static_cast(i + FSP_IBUF_BITMAP_OFFSET), - zip_size, mtr, f); + buf_page_create(space, i + FSP_IBUF_BITMAP_OFFSET, zip_size, mtr, f); if (UNIV_UNLIKELY(block != f)) buf_pool.free_block(f); fsp_init_file_page(space, block, mtr); @@ -889,7 +887,7 @@ xdes_set_free(*xdes, descr, FSP_IBUF_BITMAP_OFFSET, mtr); xdes_set_state(*xdes, descr, XDES_FREE_FRAG, mtr); if (dberr_t err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr)) + xdes, xoffset, space->free_limit, mtr)) return err; byte *n_used= FSP_HEADER_OFFSET + FSP_FRAG_N_USED + header->page.frame; mtr->write<4>(*header, n_used, 2U + mach_read_from_4(n_used)); @@ -898,7 +896,7 @@ { if (dberr_t err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_FREE, - xdes, xoffset, mtr)) + xdes, xoffset, space->free_limit, mtr)) return err; count++; } @@ -949,7 +947,11 @@ first = flst_get_first(FSP_HEADER_OFFSET + FSP_FREE + header->page.frame); - if (first.page == FIL_NULL) { + if (first.page >= space->free_limit) { + if (first.page != FIL_NULL) { + goto flst_corrupted; + } + *err = fsp_fill_free_list(false, space, header, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { goto corrupted; @@ -958,8 +960,20 @@ first = flst_get_first(FSP_HEADER_OFFSET + FSP_FREE + header->page.frame); if (first.page == FIL_NULL) { + *err = DB_OUT_OF_FILE_SPACE; return nullptr; /* No free extents left */ } + if (first.page >= space->free_limit) { + goto flst_corrupted; + } + } + + if (first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE + || first.boffset >= space->physical_size() + - (XDES_SIZE + FIL_PAGE_DATA_END)) { + flst_corrupted: + *err = DB_CORRUPTION; + goto corrupted; } descr = xdes_lst_get_descriptor(*space, first, mtr, @@ -972,7 +986,7 @@ *err = flst_remove(header, FSP_HEADER_OFFSET + FSP_FREE, desc_block, static_cast(descr - desc_block->page.frame + XDES_FLST_NODE), - mtr); + space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } @@ -989,11 +1003,12 @@ @param[in,out] xdes extent descriptor page @param[in,out] descr extent descriptor @param[in] bit slot to allocate in the extent +@param[in] space tablespace @param[in,out] mtr mini-transaction @return error code */ static dberr_t fsp_alloc_from_free_frag(buf_block_t *header, buf_block_t *xdes, xdes_t *descr, - ulint bit, mtr_t *mtr) + uint32_t bit, fil_space_t *space, mtr_t *mtr) { if (UNIV_UNLIKELY(xdes_get_state(descr) != XDES_FREE_FRAG || !xdes_is_free(descr, bit))) @@ -1006,14 +1021,15 @@ if (xdes_is_full(descr)) { + const uint32_t limit= space->free_limit; /* The fragment is full: move it to another list */ const uint16_t xoffset= static_cast(descr - xdes->page.frame + XDES_FLST_NODE); if (dberr_t err= flst_remove(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; if (dberr_t err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_FULL_FRAG, - xdes, xoffset, mtr)) + xdes, xoffset, limit, mtr)) return err; xdes_set_state(*xdes, descr, XDES_FULL_FRAG, mtr); n_used-= FSP_EXTENT_SIZE; @@ -1028,40 +1044,13 @@ @param[in] offset page number of the allocated page @param[in,out] mtr mini-transaction @return block, initialized */ -static -buf_block_t* -fsp_page_create(fil_space_t *space, page_no_t offset, mtr_t *mtr) +static buf_block_t* fsp_page_create(fil_space_t *space, uint32_t offset, + mtr_t *mtr) { - buf_block_t *block, *free_block; - - if (UNIV_UNLIKELY(space->is_being_truncated)) - { - const page_id_t page_id{space->id, offset}; - buf_pool_t::hash_chain &chain= buf_pool.page_hash.cell_get(page_id.fold()); - mysql_mutex_lock(&buf_pool.mutex); - block= reinterpret_cast - (buf_pool.page_hash.get(page_id, chain)); - if (block && block->page.oldest_modification() <= 1) - block= nullptr; - mysql_mutex_unlock(&buf_pool.mutex); - - if (block) - { - ut_ad(block->page.buf_fix_count() >= 1); - ut_ad(block->page.lock.x_lock_count() == 1); - ut_ad(mtr->have_x_latch(*block)); - free_block= block; - goto got_free_block; - } - } - - free_block= buf_LRU_get_free_block(false); -got_free_block: - block= buf_page_create(space, static_cast(offset), - space->zip_size(), mtr, free_block); + buf_block_t *free_block= buf_LRU_get_free_block(false), + *block= buf_page_create(space, offset, space->zip_size(), mtr, free_block); if (UNIV_UNLIKELY(block != free_block)) buf_pool.free_block(free_block); - fsp_init_file_page(space, block, mtr); return block; } @@ -1102,8 +1091,11 @@ /* Else take the first extent in free_frag list */ fil_addr_t first = flst_get_first(FSP_HEADER_OFFSET + FSP_FREE_FRAG + block->page.frame); - if (first.page == FIL_NULL) + if (first.page >= space->free_limit) { + if (first.page != FIL_NULL) + goto flst_corrupted; + /* There are no partially full fragments: allocate a free extent and add it to the FREE_FRAG list. NOTE that the allocation may have as a side-effect that an extent containing a descriptor @@ -1114,13 +1106,23 @@ return nullptr; *err= flst_add_last(block, FSP_HEADER_OFFSET + FSP_FREE_FRAG, xdes, static_cast(descr - xdes->page.frame + - XDES_FLST_NODE), mtr); + XDES_FLST_NODE), + space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) return nullptr; xdes_set_state(*xdes, descr, XDES_FREE_FRAG, mtr); } else { + if (first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE || + first.boffset >= space->physical_size() - + (XDES_SIZE + FIL_PAGE_DATA_END)) + { + flst_corrupted: + *err= DB_CORRUPTION; + goto err_exit; + } + descr= xdes_lst_get_descriptor(*space, first, mtr, &xdes, err); if (!descr) return nullptr; @@ -1167,7 +1169,7 @@ } } - *err= fsp_alloc_from_free_frag(block, xdes, descr, free, mtr); + *err= fsp_alloc_from_free_frag(block, xdes, descr, free, space, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) goto corrupted; return fsp_page_create(space, page_no, init_mtr); @@ -1179,7 +1181,7 @@ @param[in] offset page number in the extent @param[in,out] mtr mini-transaction @return error code */ -static dberr_t fsp_free_extent(fil_space_t* space, page_no_t offset, +static dberr_t fsp_free_extent(fil_space_t* space, uint32_t offset, mtr_t* mtr) { ut_ad(space->is_owner()); @@ -1206,7 +1208,8 @@ space->free_len++; return flst_add_last(block, FSP_HEADER_OFFSET + FSP_FREE, xdes, static_cast(descr - xdes->page.frame + - XDES_FLST_NODE), mtr); + XDES_FLST_NODE), + space->free_limit, mtr); } MY_ATTRIBUTE((nonnull)) @@ -1216,7 +1219,7 @@ @param[in] offset page number @param[in,out] mtr mini-transaction @return error code */ -static dberr_t fsp_free_page(fil_space_t *space, page_no_t offset, mtr_t *mtr) +static dberr_t fsp_free_page(fil_space_t *space, uint32_t offset, mtr_t *mtr) { xdes_t* descr; ulint frag_n_used; @@ -1260,16 +1263,17 @@ const uint16_t xoffset= static_cast(descr - xdes->page.frame + XDES_FLST_NODE); + const uint32_t limit = space->free_limit; if (state == XDES_FULL_FRAG) { /* The fragment was full: move it to another list */ err = flst_remove(header, FSP_HEADER_OFFSET + FSP_FULL_FRAG, - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } err = flst_add_last(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -1291,7 +1295,7 @@ if (!xdes_get_n_used(descr)) { /* The extent has become free: move it to another list */ err = flst_remove(header, FSP_HEADER_OFFSET + FSP_FREE_FRAG, - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (err == DB_SUCCESS) { err = fsp_free_extent(space, offset, mtr); } @@ -1385,7 +1389,7 @@ #endif return flst_add_last(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - block, FSEG_INODE_PAGE_NODE, mtr); + block, FSEG_INODE_PAGE_NODE, space->free_limit, mtr); } MY_ATTRIBUTE((nonnull, warn_unused_result)) @@ -1441,12 +1445,13 @@ { /* There are no other unused headers left on the page: move it to another list */ + const uint32_t limit= space->free_limit; *err= flst_remove(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - block, FSEG_INODE_PAGE_NODE, mtr); + block, FSEG_INODE_PAGE_NODE, limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) return nullptr; *err= flst_add_last(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FULL, - block, FSEG_INODE_PAGE_NODE, mtr); + block, FSEG_INODE_PAGE_NODE, limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) return nullptr; } @@ -1479,16 +1484,17 @@ } const ulint physical_size= space->physical_size(); + const uint32_t limit= space->free_limit; if (ULINT_UNDEFINED == fsp_seg_inode_page_find_free(iblock->page.frame, 0, physical_size)) { /* Move the page to another list */ if (flst_remove(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FULL, - iblock, FSEG_INODE_PAGE_NODE, mtr) != DB_SUCCESS) + iblock, FSEG_INODE_PAGE_NODE, limit, mtr) != DB_SUCCESS) return; if (flst_add_last(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - iblock, FSEG_INODE_PAGE_NODE, mtr) != DB_SUCCESS) + iblock, FSEG_INODE_PAGE_NODE, limit, mtr) != DB_SUCCESS) return; } @@ -1500,7 +1506,7 @@ /* There are no other used headers left on the page: free it */ if (flst_remove(header, FSP_HEADER_OFFSET + FSP_SEG_INODES_FREE, - iblock, FSEG_INODE_PAGE_NODE, mtr) == DB_SUCCESS) + iblock, FSEG_INODE_PAGE_NODE, limit, mtr) == DB_SUCCESS) fsp_free_page(space, iblock->page.id().page_no(), mtr); } @@ -1756,7 +1762,6 @@ ut_d(const auto x = block->page.lock.x_lock_count()); ut_ad(x || block->page.lock.not_recursive()); - ut_ad(x == 1 || space->is_being_truncated); ut_ad(x <= 2); ut_ad(!fil_page_get_type(block->page.frame)); mtr->write<1>(*block, FIL_PAGE_TYPE + 1 + block->page.frame, @@ -1874,7 +1879,8 @@ static_cast(inode - iblock->page.frame + FSEG_FREE), xdes, static_cast(descr - xdes->page.frame + - XDES_FLST_NODE), mtr)) + XDES_FLST_NODE), + space->free_limit, mtr)) return err; xdes_set_state(*xdes, descr, XDES_FSEG, mtr); mtr->memcpy(*xdes, descr + XDES_ID, inode + FSEG_ID, 8); @@ -1909,11 +1915,25 @@ ut_ad(!memcmp(FSEG_MAGIC_N_BYTES, FSEG_MAGIC_N + inode, 4)); ut_d(space->modify_check(*mtr)); + if (UNIV_UNLIKELY(page_offset(inode) < FSEG_ARR_OFFSET)) + { + corrupted: + *err= DB_CORRUPTION; + space->set_corrupted(); + return nullptr; + } + if (flst_get_len(inode + FSEG_FREE)) { + const fil_addr_t first= flst_get_first(inode + FSEG_FREE); + if (first.page >= space->free_limit || + first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE || + first.boffset >= space->physical_size() - + (XDES_SIZE + FIL_PAGE_DATA_END)) + goto corrupted; + /* Segment free list is not empty, allocate from it */ - return xdes_lst_get_descriptor(*space, flst_get_first(inode + FSEG_FREE), - mtr, xdes, err); + return xdes_lst_get_descriptor(*space, first, mtr, xdes, err); } xdes_t* descr= fsp_alloc_free_extent(space, 0, xdes, mtr, err); @@ -1925,7 +1945,8 @@ static_cast(inode - iblock->page.frame + FSEG_FREE), *xdes, static_cast(descr - (*xdes)->page.frame + - XDES_FLST_NODE), mtr); + XDES_FLST_NODE), + space->free_limit, mtr); if (UNIV_LIKELY(*err != DB_SUCCESS)) return nullptr; /* Try to fill the segment free list */ @@ -2011,29 +2032,42 @@ } } - /* In the big if-else below we look for ret_page and ret_descr */ - /*-------------------------------------------------------------*/ - if ((xdes_get_state(descr) == XDES_FSEG) - && mach_read_from_8(descr + XDES_ID) == seg_id - && xdes_is_free(descr, hint % FSP_EXTENT_SIZE)) { + const uint32_t extent_size = FSP_EXTENT_SIZE; + ret_descr = descr; + /* Try to get the page from extent which belongs to segment */ + if (xdes_get_state(descr) == XDES_FSEG + && mach_read_from_8(descr + XDES_ID) == seg_id) { + /* Get the page from the segment extent */ + if (xdes_is_free(descr, hint % extent_size)) { take_hinted_page: - /* 1. We can take the hinted page - =================================*/ - ret_descr = descr; - ret_page = hint; - /* Skip the check for extending the tablespace. If the - page hint were not within the size of the tablespace, - we would have got (descr == NULL) above and reset the hint. */ - goto got_hinted_page; - /*-----------------------------------------------------------*/ - } else if (xdes_get_state(descr) == XDES_FREE - && reserved - used < reserved / FSEG_FILLFACTOR - && used >= FSEG_FRAG_LIMIT) { - - /* 2. We allocate the free extent from space and can take - ========================================================= - the hinted page - ===============*/ + ret_page = hint; + goto got_hinted_page; + } else if (!xdes_is_full(descr)) { + /* Take the page from the same extent as the + hinted page (and the extent already belongs to + the segment) */ + ret_page = xdes_find_free(descr, hint % extent_size); + if (ret_page == FIL_NULL) { + ut_ad(!has_done_reservation); + return nullptr; + } + ret_page += xdes_get_offset(ret_descr); + goto alloc_done; + } + } + + /** If the number of unused but reserved pages in a segment is + esser than minimum value of 1/8 of reserved pages or + 4 * FSP_EXTENT_SIZE and there are at least half of extent size + used pages, then we allow a new empty extent to be added to + the segment in fseg_alloc_free_page_general(). Otherwise, we use + unused pages of the segment. */ + if (used < extent_size / 2 || + reserved - used >= reserved / 8 || + reserved - used >= extent_size * 4) { + } else if (xdes_get_state(descr) == XDES_FREE) { + /* Allocate the free extent from space and can + take the hinted page */ ret_descr = fsp_alloc_free_extent(space, hint, &xdes, mtr, err); @@ -2053,61 +2087,42 @@ + FSEG_FREE), xdes, static_cast(ret_descr - xdes->page.frame - + XDES_FLST_NODE), mtr); + + XDES_FLST_NODE), + space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } /* Try to fill the segment free list */ *err = fseg_fill_free_list(seg_inode, iblock, space, - hint + FSP_EXTENT_SIZE, mtr); + hint + extent_size, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } goto take_hinted_page; - /*-----------------------------------------------------------*/ - } else if ((direction != FSP_NO_DIR) - && ((reserved - used) < reserved / FSEG_FILLFACTOR) - && (used >= FSEG_FRAG_LIMIT) - && (ret_descr = fseg_alloc_free_extent(seg_inode, iblock, - &xdes, space, - mtr, err))) { - /* 3. We take any free extent (which was already assigned above - =============================================================== - in the if-condition to ret_descr) and take the lowest or - ======================================================== - highest page in it, depending on the direction - ==============================================*/ + } else if (direction != FSP_NO_DIR) { + + ret_descr = fseg_alloc_free_extent(seg_inode, iblock, + &xdes, space, mtr, err); + + if (!ret_descr) { + ut_ad(*err != DB_SUCCESS); + return nullptr; + } + /* Take any free extent (which was already assigned + above in the if-condition to ret_descr) and take the + lowest or highest page in it, depending on the direction */ ret_page = xdes_get_offset(ret_descr); if (direction == FSP_DOWN) { - ret_page += FSP_EXTENT_SIZE - 1; - } - ut_ad(!has_done_reservation || ret_page != FIL_NULL); - /*-----------------------------------------------------------*/ - } else if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { - return nullptr; - } else if ((xdes_get_state(descr) == XDES_FSEG) - && mach_read_from_8(descr + XDES_ID) == seg_id - && (!xdes_is_full(descr))) { - - /* 4. We can take the page from the same extent as the - ====================================================== - hinted page (and the extent already belongs to the - ================================================== - segment) - ========*/ - ret_descr = descr; - ret_page = xdes_find_free(ret_descr, hint % FSP_EXTENT_SIZE); - if (ret_page == FIL_NULL) { - ut_ad(!has_done_reservation); - } else { - ret_page += xdes_get_offset(ret_descr); + ret_page += extent_size - 1; } - /*-----------------------------------------------------------*/ - } else if (reserved - used > 0) { - /* 5. We take any unused page from the segment - ==============================================*/ + goto alloc_done; + } + + /* Try to take individual page from the segment or tablespace */ + if (reserved - used > 0) { + /* Take any unused page from the segment */ fil_addr_t first; if (flst_get_len(seg_inode + FSEG_NOT_FULL) > 0) { @@ -2116,7 +2131,15 @@ first = flst_get_first(seg_inode + FSEG_FREE); } else { ut_ad(!has_done_reservation); - return(NULL); + return nullptr; + } + + if (first.page >= space->free_limit + || first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE + || first.boffset >= space->physical_size() + - (XDES_SIZE + FIL_PAGE_DATA_END)) { + *err= DB_CORRUPTION; + return nullptr; } ret_descr = xdes_lst_get_descriptor(*space, first, mtr, &xdes); @@ -2130,10 +2153,9 @@ } else { ret_page += xdes_get_offset(ret_descr); } - /*-----------------------------------------------------------*/ - } else if (used < FSEG_FRAG_LIMIT) { - /* 6. We allocate an individual page from the space - ===================================================*/ + + } else if (used < extent_size / 2) { + /* Allocate an individual page from the space */ buf_block_t* block = fsp_alloc_free_page( space, hint, mtr, init_mtr, err); @@ -2156,13 +2178,11 @@ /* fsp_alloc_free_page() invoked fsp_init_file_page() already. */ return(block); - /*-----------------------------------------------------------*/ } else { - /* 7. We allocate a new extent and take its first page - ======================================================*/ + /* In worst case, try to allocate a new extent + and take its first page */ ret_descr = fseg_alloc_free_extent(seg_inode, iblock, &xdes, space, mtr, err); - if (!ret_descr) { ut_ad(!has_done_reservation || *err); return nullptr; @@ -2175,14 +2195,13 @@ /* Page could not be allocated */ ut_ad(!has_done_reservation); - return(NULL); + return nullptr; } - +alloc_done: if (space->size <= ret_page && !is_predefined_tablespace(space->id)) { /* It must be that we are extending a single-table tablespace whose size is still < 64 pages */ - - if (ret_page >= FSP_EXTENT_SIZE) { + if (ret_page >= extent_size) { sql_print_error("InnoDB: Trying to extend '%s'" " by single page(s) though the" " space size " UINT32PF "." @@ -2190,33 +2209,34 @@ space->chain.start->name, space->size, ret_page); ut_ad(!has_done_reservation); - return(NULL); + return nullptr; } if (!fsp_try_extend_data_file_with_pages( space, ret_page, header, mtr)) { /* No disk space left */ ut_ad(!has_done_reservation); - return(NULL); + return nullptr; } } -got_hinted_page: - /* ret_descr == NULL if the block was allocated from free_frag - (XDES_FREE_FRAG) */ + /* Skip the check for extending the tablespace. + If the page hint were not within the size of the tablespace, + descr set to nullptr above and reset the hint and the block + was allocated from free_frag (XDES_FREE_FRAG) */ if (ret_descr != NULL) { +got_hinted_page: /* At this point we know the extent and the page offset. The extent is still in the appropriate list (FSEG_NOT_FULL or FSEG_FREE), and the page is not yet marked as used. */ - ut_d(buf_block_t* xxdes); ut_ad(xdes_get_descriptor(space, ret_page, mtr, err, &xxdes) == ret_descr); ut_ad(xdes == xxdes); - ut_ad(xdes_is_free(ret_descr, ret_page % FSP_EXTENT_SIZE)); + ut_ad(xdes_is_free(ret_descr, ret_page % extent_size)); - *err = fseg_mark_page_used(seg_inode, iblock, ret_page, - ret_descr, xdes, mtr); + *err = fseg_mark_page_used(space, seg_inode, iblock, ret_page, + ret_descr, xdes, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return nullptr; } @@ -2493,7 +2513,7 @@ fseg_inode_t* seg_inode, buf_block_t* iblock, fil_space_t* space, - page_no_t offset, + uint32_t offset, mtr_t* mtr #ifdef BTR_CUR_HASH_ADAPT ,bool ahi=false @@ -2557,18 +2577,19 @@ const uint16_t xoffset= uint16_t(descr - xdes->page.frame + XDES_FLST_NODE); const uint16_t ioffset= uint16_t(seg_inode - iblock->page.frame); + const uint32_t limit = space->free_limit; if (xdes_is_full(descr)) { /* The fragment is full: move it to another list */ err = flst_remove(iblock, static_cast(FSEG_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } err = flst_add_last(iblock, static_cast(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2586,7 +2607,7 @@ if (!xdes_get_n_used(descr)) { err = flst_remove(iblock, static_cast(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2731,11 +2752,12 @@ #endif /* BTR_CUR_HASH_ADAPT */ uint16_t lst; + uint32_t limit = space->free_limit; if (xdes_is_full(descr)) { lst = static_cast(FSEG_FULL + ioffset); remove: - err = flst_remove(iblock, lst, xdes, xoffset, mtr); + err = flst_remove(iblock, lst, xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2745,7 +2767,7 @@ } else { err = flst_remove( iblock, static_cast(FSEG_NOT_FULL + ioffset), - xdes, xoffset, mtr); + xdes, xoffset, limit, mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { return err; } @@ -2859,7 +2881,7 @@ return true; } - page_no_t page_no = fseg_get_nth_frag_page_no(inode, n); + uint32_t page_no = fseg_get_nth_frag_page_no(inode, n); if (fseg_free_page_low(inode, iblock, space, page_no, mtr #ifdef BTR_CUR_HASH_ADAPT @@ -2995,7 +3017,10 @@ return nullptr; } - if (first.page == FIL_NULL) + if (first.page >= space->free_limit || + first.boffset < FSP_HEADER_OFFSET + FSP_HEADER_SIZE || + first.boffset >= space->physical_size() - + (XDES_SIZE + FIL_PAGE_DATA_END)) goto corrupted; return xdes_lst_get_descriptor(*space, first, mtr, nullptr, err); diff -Nru mariadb-10.11.6/storage/innobase/fsp/fsp0sysspace.cc mariadb-10.11.9/storage/innobase/fsp/fsp0sysspace.cc --- mariadb-10.11.6/storage/innobase/fsp/fsp0sysspace.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fsp/fsp0sysspace.cc 2024-08-03 07:29:59.000000000 +0000 @@ -33,6 +33,7 @@ #include "os0file.h" #include "row0mysql.h" #include "buf0dblwr.h" +#include "log.h" /** The server header file is included to access opt_initialize global variable. If server passes the option for create/open DB to SE, we should remove such @@ -568,7 +569,7 @@ } err = it->read_first_page( - m_ignore_read_only ? false : srv_read_only_mode); + m_ignore_read_only && srv_read_only_mode); if (err != DB_SUCCESS) { return(err); @@ -582,47 +583,62 @@ /* Check the contents of the first page of the first datafile. */ - for (int retry = 0; retry < 2; ++retry) { + err = it->validate_first_page(); - err = it->validate_first_page(); - - if (err != DB_SUCCESS - && (retry == 1 - || recv_sys.dblwr.restore_first_page( + if (err != DB_SUCCESS) { + if (recv_sys.dblwr.restore_first_page( it->m_space_id, it->m_filepath, - it->handle()))) { - + it->handle())) { it->close(); - return(err); } + err = it->read_first_page( + m_ignore_read_only && srv_read_only_mode); } /* Make sure the tablespace space ID matches the space ID on the first page of the first datafile. */ - if (space_id() != it->m_space_id) { - - ib::error() - << "The data file '" << it->filepath() - << "' has the wrong space ID. It should be " - << space_id() << ", but " << it->m_space_id - << " was found"; - + if (err != DB_SUCCESS || space_id() != it->m_space_id) { + sql_print_error("InnoDB: The data file '%s'" + " has the wrong space ID." + " It should be " UINT32PF ", but " UINT32PF + " was found", it->filepath(), + space_id(), it->m_space_id); it->close(); - - return(err); + return err; } - if (srv_operation == SRV_OPERATION_NORMAL) { + if (srv_force_recovery != 6 + && srv_operation == SRV_OPERATION_NORMAL + && !log_sys.next_checkpoint_lsn + && log_sys.format == log_t::FORMAT_3_23) { + + log_sys.latch.wr_lock(SRW_LOCK_CALL); /* Prepare for possible upgrade from 0-sized ib_logfile0. */ - ut_ad(!log_sys.next_checkpoint_lsn); log_sys.next_checkpoint_lsn = mach_read_from_8( it->m_first_page + 26/*FIL_PAGE_FILE_FLUSH_LSN*/); + if (log_sys.next_checkpoint_lsn < 8204) { + /* Before MDEV-14425, InnoDB had a minimum LSN + of 8192+12=8204. Likewise, mariadb-backup + --prepare would create an empty ib_logfile0 + after applying the log. We will allow an + upgrade from such an empty log. */ + sql_print_error("InnoDB: ib_logfile0 is " + "empty, and LSN is unknown."); + err = DB_CORRUPTION; + } else { + log_sys.last_checkpoint_lsn = + recv_sys.lsn = recv_sys.file_checkpoint = + log_sys.next_checkpoint_lsn; + log_sys.set_recovered_lsn(log_sys.next_checkpoint_lsn); + log_sys.next_checkpoint_no = 0; + } + + log_sys.latch.wr_unlock(); } it->close(); - - return(DB_SUCCESS); + return err; } /** Check if a file can be opened in the correct mode. diff -Nru mariadb-10.11.6/storage/innobase/fts/fts0fts.cc mariadb-10.11.9/storage/innobase/fts/fts0fts.cc --- mariadb-10.11.6/storage/innobase/fts/fts0fts.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fts/fts0fts.cc 2024-08-03 07:29:59.000000000 +0000 @@ -2187,6 +2187,22 @@ return(result); } +/** Compare two doubly indirected pointers */ +static int fts_ptr2_cmp(const void *p1, const void *p2) +{ + const void *a= **static_cast(p1); + const void *b= **static_cast(p2); + return b > a ? -1 : a > b; +} + +/** Compare a singly indirected pointer to a doubly indirected one */ +static int fts_ptr1_ptr2_cmp(const void *p1, const void *p2) +{ + const void *a= *static_cast(p1); + const void *b= **static_cast(p2); + return b > a ? -1 : a > b; +} + /******************************************************************//** Create a savepoint instance. @return savepoint instance */ @@ -2209,8 +2225,8 @@ savepoint->name = mem_heap_strdup(heap, name); } - savepoint->tables = rbt_create( - sizeof(fts_trx_table_t*), fts_trx_table_cmp); + static_assert(!offsetof(fts_trx_table_t, table), "ABI"); + savepoint->tables = rbt_create(sizeof(fts_trx_table_t*), fts_ptr2_cmp); return(savepoint); } @@ -2258,6 +2274,19 @@ return(ftt); } +/** Compare two doc_id */ +static inline int doc_id_cmp(doc_id_t a, doc_id_t b) +{ + return b > a ? -1 : a > b; +} + +/** Compare two DOC_ID. */ +int fts_doc_id_cmp(const void *p1, const void *p2) +{ + return doc_id_cmp(*static_cast(p1), + *static_cast(p2)); +} + /******************************************************************//** Create an FTS trx table. @return FTS trx table */ @@ -2276,7 +2305,8 @@ ftt->table = table; ftt->fts_trx = fts_trx; - ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_trx_row_doc_id_cmp); + static_assert(!offsetof(fts_trx_row_t, doc_id), "ABI"); + ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_doc_id_cmp); return(ftt); } @@ -2300,7 +2330,8 @@ ftt->table = ftt_src->table; ftt->fts_trx = ftt_src->fts_trx; - ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_trx_row_doc_id_cmp); + static_assert(!offsetof(fts_trx_row_t, doc_id), "ABI"); + ftt->rows = rbt_create(sizeof(fts_trx_row_t), fts_doc_id_cmp); /* Copy the rb tree values to the new savepoint. */ rbt_merge_uniq(ftt->rows, ftt_src->rows); @@ -2325,13 +2356,9 @@ { fts_trx_table_t* ftt; ib_rbt_bound_t parent; - ib_rbt_t* tables; - fts_savepoint_t* savepoint; - - savepoint = static_cast(ib_vector_last(savepoints)); - - tables = savepoint->tables; - rbt_search_cmp(tables, &parent, &table->id, fts_trx_table_id_cmp, NULL); + ib_rbt_t* tables = static_cast( + ib_vector_last(savepoints))->tables; + rbt_search_cmp(tables, &parent, &table, fts_ptr1_ptr2_cmp, nullptr); if (parent.result == 0) { fts_trx_table_t** fttp; @@ -2555,89 +2582,88 @@ return(DB_SUCCESS); } -/*********************************************************************//** -This function fetch the Doc ID from CONFIG table, and compare with +/** Read the synced document id from the fts configuration table +@param table fts table +@param doc_id document id to be read +@param trx transaction to read from config table +@return DB_SUCCESS in case of success */ +static +dberr_t fts_read_synced_doc_id(const dict_table_t *table, + doc_id_t *doc_id, + trx_t *trx) +{ + dberr_t error; + char table_name[MAX_FULL_NAME_LEN]; + + fts_table_t fts_table; + fts_table.suffix= "CONFIG"; + fts_table.table_id= table->id; + fts_table.type= FTS_COMMON_TABLE; + fts_table.table= table; + ut_a(table->fts->doc_col != ULINT_UNDEFINED); + + trx->op_info = "update the next FTS document id"; + pars_info_t *info= pars_info_create(); + pars_info_bind_function(info, "my_func", fts_fetch_store_doc_id, + doc_id); + + fts_get_table_name(&fts_table, table_name); + pars_info_bind_id(info, "config_table", table_name); + + que_t *graph= fts_parse_sql( + &fts_table, info, + "DECLARE FUNCTION my_func;\n" + "DECLARE CURSOR c IS SELECT value FROM $config_table" + " WHERE key = 'synced_doc_id' FOR UPDATE;\n" + "BEGIN\n" + "" + "OPEN c;\n" + "WHILE 1 = 1 LOOP\n" + " FETCH c INTO my_func();\n" + " IF c % NOTFOUND THEN\n" + " EXIT;\n" + " END IF;\n" + "END LOOP;\n" + "CLOSE c;"); + + *doc_id= 0; + error = fts_eval_sql(trx, graph); + que_graph_free(graph); + return error; +} + +/** This function fetch the Doc ID from CONFIG table, and compare with the Doc ID supplied. And store the larger one to the CONFIG table. +@param table fts table +@param cmp_doc_id Doc ID to compare +@param doc_id larger document id after comparing "cmp_doc_id" to + the one stored in CONFIG table +@param trx transaction @return DB_SUCCESS if OK */ -static MY_ATTRIBUTE((nonnull)) +static dberr_t fts_cmp_set_sync_doc_id( -/*====================*/ - const dict_table_t* table, /*!< in: table */ - doc_id_t cmp_doc_id, /*!< in: Doc ID to compare */ - ibool read_only, /*!< in: TRUE if read the - synced_doc_id only */ - doc_id_t* doc_id) /*!< out: larger document id - after comparing "cmp_doc_id" - to the one stored in CONFIG - table */ + const dict_table_t *table, + doc_id_t cmp_doc_id, + doc_id_t *doc_id, + trx_t *trx=nullptr) { if (srv_read_only_mode) { return DB_READ_ONLY; } - trx_t* trx; - pars_info_t* info; - dberr_t error; - fts_table_t fts_table; - que_t* graph = NULL; - fts_cache_t* cache = table->fts->cache; - char table_name[MAX_FULL_NAME_LEN]; - ut_a(table->fts->doc_col != ULINT_UNDEFINED); - - fts_table.suffix = "CONFIG"; - fts_table.table_id = table->id; - fts_table.type = FTS_COMMON_TABLE; - fts_table.table = table; - - trx= trx_create(); -retry: - trx_start_internal(trx); - - trx->op_info = "update the next FTS document id"; + fts_cache_t* cache= table->fts->cache; + dberr_t error = DB_SUCCESS; + const trx_t* const caller_trx = trx; - info = pars_info_create(); - - pars_info_bind_function( - info, "my_func", fts_fetch_store_doc_id, doc_id); - - fts_get_table_name(&fts_table, table_name); - pars_info_bind_id(info, "config_table", table_name); - - graph = fts_parse_sql( - &fts_table, info, - "DECLARE FUNCTION my_func;\n" - "DECLARE CURSOR c IS SELECT value FROM $config_table" - " WHERE key = 'synced_doc_id' FOR UPDATE;\n" - "BEGIN\n" - "" - "OPEN c;\n" - "WHILE 1 = 1 LOOP\n" - " FETCH c INTO my_func();\n" - " IF c % NOTFOUND THEN\n" - " EXIT;\n" - " END IF;\n" - "END LOOP;\n" - "CLOSE c;"); - - *doc_id = 0; - - error = fts_eval_sql(trx, graph); - - que_graph_free(graph); - - // FIXME: We need to retry deadlock errors - if (error != DB_SUCCESS) { - goto func_exit; + if (trx == nullptr) { + trx = trx_create(); + trx_start_internal_read_only(trx); } +retry: + error = fts_read_synced_doc_id(table, doc_id, trx); - if (read_only) { - /* InnoDB stores actual synced_doc_id value + 1 in - FTS_CONFIG table. Reduce the value by 1 while reading - after startup. */ - if (*doc_id) *doc_id -= 1; - goto func_exit; - } + if (error != DB_SUCCESS) goto func_exit; if (cmp_doc_id == 0 && *doc_id) { cache->synced_doc_id = *doc_id - 1; @@ -2662,6 +2688,10 @@ func_exit: + if (caller_trx) { + return error; + } + if (UNIV_LIKELY(error == DB_SUCCESS)) { fts_sql_commit(trx); } else { @@ -2669,6 +2699,7 @@ ib::error() << "(" << error << ") while getting next doc id " "for table " << table->name; + fts_sql_rollback(trx); if (error == DB_DEADLOCK || error == DB_LOCK_WAIT_TIMEOUT) { @@ -3860,6 +3891,13 @@ return(error); } +/** Sort an array of doc_id */ +void fts_doc_ids_sort(ib_vector_t *doc_ids) +{ + doc_id_t *const data= reinterpret_cast(doc_ids->data); + std::sort(data, data + doc_ids->used); +} + /*********************************************************************//** Add rows to the DELETED_CACHE table. @return DB_SUCCESS if all went well else error code*/ @@ -3881,7 +3919,7 @@ ut_a(ib_vector_size(doc_ids) > 0); - ib_vector_sort(doc_ids, fts_doc_id_cmp); + fts_doc_ids_sort(doc_ids); info = pars_info_create(); @@ -4140,8 +4178,8 @@ /* After each Sync, update the CONFIG table about the max doc id we just sync-ed to index table */ - error = fts_cmp_set_sync_doc_id(sync->table, sync->max_doc_id, FALSE, - &last_doc_id); + error = fts_cmp_set_sync_doc_id(sync->table, sync->max_doc_id, + &last_doc_id, trx); /* Get the list of deleted documents that are either in the cache or were headed there but were deleted before the add @@ -4161,6 +4199,7 @@ mysql_mutex_unlock(&cache->lock); if (UNIV_LIKELY(error == DB_SUCCESS)) { + DEBUG_SYNC_C("fts_crash_before_commit_sync"); fts_sql_commit(trx); } else { fts_sql_rollback(trx); @@ -4822,7 +4861,7 @@ /* Then compare this value with the ID value stored in the CONFIG table. The larger one will be our new initial Doc ID */ - fts_cmp_set_sync_doc_id(table, 0, FALSE, &max_doc_id); + fts_cmp_set_sync_doc_id(table, 0, &max_doc_id); /* If DICT_TF2_FTS_ADD_DOC_ID is set, we are in the process of creating index (and add doc id column. No need to recovery @@ -5575,8 +5614,8 @@ l_ftt = rbt_value(fts_trx_table_t*, node); rbt_search_cmp( - s_tables, &parent, &(*l_ftt)->table->id, - fts_trx_table_id_cmp, NULL); + s_tables, &parent, &(*l_ftt)->table, + fts_ptr1_ptr2_cmp, nullptr); if (parent.result == 0) { fts_trx_table_t** s_ftt; @@ -6131,7 +6170,17 @@ start_doc = cache->synced_doc_id; if (!start_doc) { - fts_cmp_set_sync_doc_id(table, 0, TRUE, &start_doc); + trx_t *trx = trx_create(); + trx_start_internal_read_only(trx); + dberr_t err= fts_read_synced_doc_id(table, &start_doc, trx); + fts_sql_commit(trx); + trx->free(); + if (err != DB_SUCCESS) { + goto func_exit; + } + if (start_doc) { + start_doc--; + } cache->synced_doc_id = start_doc; } diff -Nru mariadb-10.11.6/storage/innobase/fts/fts0opt.cc mariadb-10.11.9/storage/innobase/fts/fts0opt.cc --- mariadb-10.11.6/storage/innobase/fts/fts0opt.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fts/fts0opt.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1016,7 +1016,7 @@ que_graph_free(graph); if (error == DB_SUCCESS) { - ib_vector_sort(doc_ids->doc_ids, fts_doc_id_cmp); + fts_doc_ids_sort(doc_ids->doc_ids); } if (alloc_bk_trx) { diff -Nru mariadb-10.11.6/storage/innobase/fts/fts0que.cc mariadb-10.11.9/storage/innobase/fts/fts0que.cc --- mariadb-10.11.6/storage/innobase/fts/fts0que.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fts/fts0que.cc 2024-08-03 07:29:59.000000000 +0000 @@ -385,22 +385,6 @@ ulint* total); /*!< out: total words in document */ #endif -/******************************************************************** -Compare two fts_doc_freq_t doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_freq_doc_id_cmp( -/*================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const fts_doc_freq_t* fq1 = (const fts_doc_freq_t*) p1; - const fts_doc_freq_t* fq2 = (const fts_doc_freq_t*) p2; - - return((int) (fq1->doc_id - fq2->doc_id)); -} - #if 0 /*******************************************************************//** Print the table used for calculating LCS. */ @@ -506,14 +490,11 @@ if (r2->rank < r1->rank) { return(-1); } else if (r2->rank == r1->rank) { - if (r1->doc_id < r2->doc_id) { - return(1); - } else if (r1->doc_id > r2->doc_id) { - return(1); + return -1; } - return(0); + return r1->doc_id > r2->doc_id; } return(1); @@ -674,8 +655,9 @@ word_freq.doc_count = 0; + static_assert(!offsetof(fts_doc_freq_t, doc_id), "ABI"); word_freq.doc_freqs = rbt_create( - sizeof(fts_doc_freq_t), fts_freq_doc_id_cmp); + sizeof(fts_doc_freq_t), fts_doc_id_cmp); parent.last = rbt_add_node( query->word_freqs, &parent, &word_freq); @@ -1253,8 +1235,9 @@ /* Create the rb tree that will hold the doc ids of the intersection. */ + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query->intersection = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; @@ -1540,8 +1523,9 @@ to create a new result set for fts_query_intersect(). */ if (query->oper == FTS_EXIST) { + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query->intersection = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; } @@ -3012,8 +2996,9 @@ if (query->oper == FTS_EXIST) { ut_ad(query->intersection == NULL); + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query->intersection = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; } @@ -3123,8 +3108,8 @@ /* Create new result set to store the sub-expression result. We will merge this result set with the parent after processing. */ - query->doc_ids = rbt_create(sizeof(fts_ranking_t), - fts_ranking_doc_id_cmp); + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); + query->doc_ids = rbt_create(sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += SIZEOF_RBT_CREATE; @@ -3661,8 +3646,9 @@ result = static_cast( ut_zalloc_nokey(sizeof(*result))); + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); result->rankings_by_id = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query->total_size += sizeof(fts_result_t) + SIZEOF_RBT_CREATE; result_is_null = true; @@ -4038,7 +4024,7 @@ DEBUG_SYNC_C("fts_deleted_doc_ids_append"); /* Sort the vector so that we can do a binary search over the ids. */ - ib_vector_sort(query.deleted->doc_ids, fts_doc_id_cmp); + fts_doc_ids_sort(query.deleted->doc_ids); /* Convert the query string to lower case before parsing. We own the ut_malloc'ed result and so remember to free it before return. */ @@ -4065,8 +4051,9 @@ query.heap = mem_heap_create(128); /* Create the rb tree for the doc id (current) set. */ + static_assert(!offsetof(fts_ranking_t, doc_id), "ABI"); query.doc_ids = rbt_create( - sizeof(fts_ranking_t), fts_ranking_doc_id_cmp); + sizeof(fts_ranking_t), fts_doc_id_cmp); query.parser = index->parser; query.total_size += SIZEOF_RBT_CREATE; diff -Nru mariadb-10.11.6/storage/innobase/fut/fut0lst.cc mariadb-10.11.9/storage/innobase/fut/fut0lst.cc --- mariadb-10.11.6/storage/innobase/fut/fut0lst.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/fut/fut0lst.cc 2024-08-03 07:29:59.000000000 +0000 @@ -113,17 +113,18 @@ } /** Insert a node after another one. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur insert position block -@param[in] coffset byte offset of the insert position -@param[in,out] add block to be added -@param[in] aoffset byte offset of the block to be added -@param[in,out] mtr mini-transaction */ +@param base base node block +@param boffset byte offset of the base node +@param cur insert position block +@param coffset byte offset of the insert position +@param add block to be added +@param aoffset byte offset of the block to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction */ static dberr_t flst_insert_after(buf_block_t *base, uint16_t boffset, buf_block_t *cur, uint16_t coffset, buf_block_t *add, uint16_t aoffset, - mtr_t *mtr) + uint32_t limit, mtr_t *mtr) { ut_ad(base != cur || boffset != coffset); ut_ad(base != add || boffset != aoffset); @@ -139,6 +140,15 @@ MTR_MEMO_PAGE_SX_FIX)); fil_addr_t next_addr= flst_get_next_addr(cur->page.frame + coffset); + if (next_addr.page >= limit) + { + if (UNIV_UNLIKELY(next_addr.page != FIL_NULL)) + return DB_CORRUPTION; + } + else if (UNIV_UNLIKELY(next_addr.boffset < FIL_PAGE_DATA || + next_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; flst_write_addr(*add, add->page.frame + aoffset + FLST_PREV, cur->page.id().page_no(), coffset, mtr); @@ -167,18 +177,19 @@ } /** Insert a node before another one. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur insert position block -@param[in] coffset byte offset of the insert position -@param[in,out] add block to be added -@param[in] aoffset byte offset of the block to be added -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param cur insert position block +@param coffset byte offset of the insert position +@param add block to be added +@param aoffset byte offset of the block to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ static dberr_t flst_insert_before(buf_block_t *base, uint16_t boffset, buf_block_t *cur, uint16_t coffset, buf_block_t *add, uint16_t aoffset, - mtr_t *mtr) + uint32_t limit, mtr_t *mtr) { ut_ad(base != cur || boffset != coffset); ut_ad(base != add || boffset != aoffset); @@ -194,6 +205,15 @@ MTR_MEMO_PAGE_SX_FIX)); fil_addr_t prev_addr= flst_get_prev_addr(cur->page.frame + coffset); + if (prev_addr.page >= limit) + { + if (UNIV_UNLIKELY(prev_addr.page != FIL_NULL)) + return DB_CORRUPTION; + } + else if (UNIV_UNLIKELY(prev_addr.boffset < FIL_PAGE_DATA || + prev_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; flst_write_addr(*add, add->page.frame + aoffset + FLST_PREV, prev_addr.page, prev_addr.boffset, mtr); @@ -234,14 +254,9 @@ flst_zero_both(block, base + FLST_FIRST, mtr); } -/** Append a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,outr] mtr mini-transaction */ dberr_t flst_add_last(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) { ut_ad(base != add || boffset != aoffset); ut_ad(boffset < base->physical_size()); @@ -258,6 +273,13 @@ else { fil_addr_t addr= flst_get_last(base->page.frame + boffset); + if (UNIV_UNLIKELY(addr.page >= limit)) + return DB_CORRUPTION; + else if (UNIV_UNLIKELY(addr.boffset < FIL_PAGE_DATA || + addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; + buf_block_t *cur= add; dberr_t err; if (addr.page != add->page.id().page_no() && @@ -266,19 +288,13 @@ BUF_GET_POSSIBLY_FREED, mtr, &err))) return err; return flst_insert_after(base, boffset, cur, addr.boffset, - add, aoffset, mtr); + add, aoffset, limit, mtr); } } -/** Prepend a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,out] mtr mini-transaction -@return error code */ dberr_t flst_add_first(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) { ut_ad(base != add || boffset != aoffset); ut_ad(boffset < base->physical_size()); @@ -296,6 +312,12 @@ else { fil_addr_t addr= flst_get_first(base->page.frame + boffset); + if (UNIV_UNLIKELY(addr.page >= limit)) + return DB_CORRUPTION; + else if (UNIV_UNLIKELY(addr.boffset < FIL_PAGE_DATA || + addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; buf_block_t *cur= add; dberr_t err; if (addr.page != add->page.id().page_no() && @@ -304,19 +326,13 @@ BUF_GET_POSSIBLY_FREED, mtr, &err))) return err; return flst_insert_before(base, boffset, cur, addr.boffset, - add, aoffset, mtr); + add, aoffset, limit, mtr); } } -/** Remove a file list node. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur block to be removed -@param[in] coffset byte offset of the current record to be removed -@param[in,out] mtr mini-transaction -@return error code */ dberr_t flst_remove(buf_block_t *base, uint16_t boffset, - buf_block_t *cur, uint16_t coffset, mtr_t *mtr) + buf_block_t *cur, uint16_t coffset, + uint32_t limit, mtr_t *mtr) { ut_ad(boffset < base->physical_size()); ut_ad(coffset < cur->physical_size()); @@ -329,9 +345,27 @@ const fil_addr_t next_addr= flst_get_next_addr(cur->page.frame + coffset); dberr_t err= DB_SUCCESS; - if (prev_addr.page == FIL_NULL) + if (next_addr.page >= limit) + { + if (next_addr.page != FIL_NULL) + return DB_CORRUPTION; + } + else if (UNIV_UNLIKELY(next_addr.boffset < FIL_PAGE_DATA || + next_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; + + if (prev_addr.page >= limit) + { + if (prev_addr.page != FIL_NULL) + return DB_CORRUPTION; flst_write_addr(*base, base->page.frame + boffset + FLST_FIRST, next_addr.page, next_addr.boffset, mtr); + } + else if (UNIV_UNLIKELY(prev_addr.boffset < FIL_PAGE_DATA || + prev_addr.boffset >= base->physical_size() - + FIL_PAGE_DATA_END)) + return DB_CORRUPTION; else { buf_block_t *b= cur; @@ -375,25 +409,19 @@ ut_ad(mtr->memo_contains_flagged(base, MTR_MEMO_PAGE_X_FIX | MTR_MEMO_PAGE_SX_FIX)); - /* We use two mini-transaction handles: the first is used to lock - the base node, and prevent other threads from modifying the list. - The second is used to traverse the list. We cannot run the second - mtr without committing it at times, because if the list is long, - the x-locked pages could fill the buffer, resulting in a deadlock. */ - mtr_t mtr2; - const uint32_t len= flst_get_len(base->page.frame + boffset); fil_addr_t addr= flst_get_first(base->page.frame + boffset); for (uint32_t i= len; i--; ) { - mtr2.start(); + ut_ad(addr.boffset >= FIL_PAGE_DATA); + ut_ad(addr.boffset < base->physical_size() - FIL_PAGE_DATA_END); const buf_block_t *b= buf_page_get_gen(page_id_t(base->page.id().space(), addr.page), base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr); ut_ad(b); addr= flst_get_next_addr(b->page.frame + addr.boffset); - mtr2.commit(); + mtr->release_last_page(); } ut_ad(addr.page == FIL_NULL); @@ -402,13 +430,14 @@ for (uint32_t i= len; i--; ) { - mtr2.start(); + ut_ad(addr.boffset >= FIL_PAGE_DATA); + ut_ad(addr.boffset < base->physical_size() - FIL_PAGE_DATA_END); const buf_block_t *b= buf_page_get_gen(page_id_t(base->page.id().space(), addr.page), base->zip_size(), RW_SX_LATCH, nullptr, BUF_GET, mtr); ut_ad(b); addr= flst_get_prev_addr(b->page.frame + addr.boffset); - mtr2.commit(); + mtr->release_last_page(); } ut_ad(addr.page == FIL_NULL); diff -Nru mariadb-10.11.6/storage/innobase/gis/gis0sea.cc mariadb-10.11.9/storage/innobase/gis/gis0sea.cc --- mariadb-10.11.6/storage/innobase/gis/gis0sea.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/gis/gis0sea.cc 2024-08-03 07:29:59.000000000 +0000 @@ -289,10 +289,6 @@ mtr->rollback_to_savepoint(1); } - ut_ad((my_latch_mode | 4) == BTR_CONT_MODIFY_TREE - || !page_is_leaf(btr_cur_get_page(btr_cur)) - || !btr_cur->page_cur.block->page.lock.have_any()); - const auto block_savepoint = mtr->get_savepoint(); block = buf_page_get_gen( page_id_t(index->table->space_id, @@ -304,6 +300,8 @@ break; } + buf_page_make_young_if_needed(&block->page); + page = buf_block_get_frame(block); page_ssn = page_get_ssn_id(page); @@ -509,7 +507,7 @@ mysql_mutex_unlock(&rtr_info->matches->rtr_match_mutex); cursor->btr_cur.page_cur.rec = rec.r_rec; - cursor->btr_cur.page_cur.block = &rtr_info->matches->block; + cursor->btr_cur.page_cur.block = rtr_info->matches->block; DEBUG_SYNC_C("rtr_pcur_move_to_next_return"); return(true); @@ -670,8 +668,13 @@ buf_mode, mtr, &err, false); if (!block) { - if (err == DB_DECRYPTION_FAILED) - btr_decryption_failed(*index); + if (err) + { + err_exit: + if (err == DB_DECRYPTION_FAILED) + btr_decryption_failed(*index); + mtr->rollback_to_savepoint(savepoint); + } func_exit: if (UNIV_LIKELY_NULL(heap)) mem_heap_free(heap); @@ -683,6 +686,8 @@ return err; } + buf_page_make_young_if_needed(&block->page); + const page_t *page= buf_block_get_frame(block); #ifdef UNIV_ZIP_DEBUG if (rw_latch != RW_NO_LATCH) { @@ -733,7 +738,8 @@ #endif } - if (height == 0) { + if (height == 0) + { if (rw_latch == RW_NO_LATCH) { ut_ad(block == mtr->at_savepoint(block_savepoint)); @@ -817,7 +823,7 @@ if (page_cur_search_with_match(tuple, page_mode, &up_match, &low_match, &cur->page_cur, nullptr)) { err= DB_CORRUPTION; - goto func_exit; + goto err_exit; } } @@ -1312,21 +1318,15 @@ rtr_info->index = index; if (init_matches) { - rtr_info->heap = mem_heap_create(sizeof(*(rtr_info->matches))); rtr_info->matches = static_cast( - mem_heap_zalloc( - rtr_info->heap, - sizeof(*rtr_info->matches))); + ut_zalloc_nokey(sizeof *rtr_info->matches)); rtr_info->matches->matched_recs = UT_NEW_NOKEY(rtr_rec_vector()); - rtr_info->matches->bufp = page_align(rtr_info->matches->rec_buf - + UNIV_PAGE_SIZE_MAX + 1); mysql_mutex_init(rtr_match_mutex_key, &rtr_info->matches->rtr_match_mutex, nullptr); - rtr_info->matches->block.page.lock.init(); } rtr_info->path = UT_NEW_NOKEY(rtr_node_path_t()); @@ -1445,18 +1445,16 @@ if (free_all) { if (rtr_info->matches) { - if (rtr_info->matches->matched_recs != NULL) { - UT_DELETE(rtr_info->matches->matched_recs); + if (rtr_info->matches->block) { + buf_block_free(rtr_info->matches->block); + rtr_info->matches->block = nullptr; } - rtr_info->matches->block.page.lock.free(); + UT_DELETE(rtr_info->matches->matched_recs); mysql_mutex_destroy( &rtr_info->matches->rtr_match_mutex); - } - - if (rtr_info->heap) { - mem_heap_free(rtr_info->heap); + ut_free(rtr_info->matches); } if (initialized) { @@ -1566,7 +1564,7 @@ if (auto matches = rtr_info->matches) { mysql_mutex_lock(&matches->rtr_match_mutex); - if (matches->block.page.id() == id) { + if (matches->block->page.id() == id) { matches->matched_recs->clear(); matches->valid = false; } @@ -1580,23 +1578,6 @@ lock_sys.prdt_page_free_from_discard(id, true); } -/** Structure acts as functor to get the optimistic access of the page. -It returns true if it successfully gets the page. */ -struct optimistic_get -{ - btr_pcur_t *const r_cursor; - mtr_t *const mtr; - - optimistic_get(btr_pcur_t *r_cursor,mtr_t *mtr) - :r_cursor(r_cursor), mtr(mtr) {} - - bool operator()(buf_block_t *hint) const - { - return hint && buf_page_optimistic_get( - RW_X_LATCH, hint, r_cursor->modify_clock, mtr); - } -}; - /** Restore the stored position of a persistent cursor bufferfixing the page */ static bool @@ -1628,8 +1609,11 @@ r_cursor->modify_clock = 100; ); - if (r_cursor->block_when_stored.run_with_hint( - optimistic_get(r_cursor, mtr))) { + if (buf_page_optimistic_fix(r_cursor->btr_cur.page_cur.block, + r_cursor->old_page_id) + && buf_page_optimistic_get(r_cursor->btr_cur.page_cur.block, + RW_X_LATCH, r_cursor->modify_clock, + mtr)) { ut_ad(r_cursor->pos_state == BTR_PCUR_IS_POSITIONED); ut_ad(r_cursor->rel_pos == BTR_PCUR_ON); @@ -1703,6 +1687,8 @@ goto func_exit; } + buf_page_make_young_if_needed(&page_cursor->block->page); + /* Get the page SSN */ page = buf_block_get_frame(page_cursor->block); page_ssn = page_get_ssn_id(page); @@ -1772,7 +1758,7 @@ ulint data_len; rtr_rec_t rtr_rec; - buf = match_rec->block.page.frame + match_rec->used; + buf = match_rec->block->page.frame + match_rec->used; ut_ad(page_rec_is_leaf(rec)); copy = rec_copy(buf, rec, offsets); @@ -1869,43 +1855,6 @@ new_seq, level, child_no, my_cursor, mbr_inc); } -/** Copy a buf_block_t, except "block->page.lock". -@param[in,out] matches copy to match->block -@param[in] block block to copy */ -static -void -rtr_copy_buf( - matched_rec_t* matches, - const buf_block_t* block) -{ - /* Copy all members of "block" to "matches->block" except "lock". - We skip "lock" because it is not used - from the dummy buf_block_t we create here and because memcpy()ing - it generates (valid) compiler warnings that the vtable pointer - will be copied. */ - matches->block.page.lock.free(); - new (&matches->block.page) buf_page_t(block->page); - matches->block.page.frame = block->page.frame; - matches->block.unzip_LRU = block->unzip_LRU; - - ut_d(matches->block.in_unzip_LRU_list = block->in_unzip_LRU_list); - ut_d(matches->block.in_withdraw_list = block->in_withdraw_list); - - /* Skip buf_block_t::lock */ - matches->block.modify_clock = block->modify_clock; -#ifdef BTR_CUR_HASH_ADAPT - matches->block.n_hash_helps = block->n_hash_helps; - matches->block.n_fields = block->n_fields; - matches->block.left_side = block->left_side; -#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG - matches->block.n_pointers = 0; -#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */ - matches->block.curr_n_fields = block->curr_n_fields; - matches->block.curr_left_side = block->curr_left_side; - matches->block.index = block->index; -#endif /* BTR_CUR_HASH_ADAPT */ -} - /****************************************************************//** Generate a shadow copy of the page block header to save the matched records */ @@ -1919,16 +1868,18 @@ { ut_ad(matches->matched_recs->empty()); matches->locked = false; - rtr_copy_buf(matches, block); - matches->block.page.frame = matches->bufp; matches->valid = false; + if (!matches->block) { + matches->block = buf_block_alloc(); + } + + matches->block->page.init(buf_page_t::MEMORY, block->page.id()); /* We have to copy PAGE_*_SUPREMUM_END bytes so that we can use infimum/supremum of this page as normal btr page for search. */ - memcpy(matches->block.page.frame, page, page_is_comp(page) - ? PAGE_NEW_SUPREMUM_END : PAGE_OLD_SUPREMUM_END); matches->used = page_is_comp(page) ? PAGE_NEW_SUPREMUM_END : PAGE_OLD_SUPREMUM_END; + memcpy(matches->block->page.frame, page, matches->used); #ifdef RTR_SEARCH_DIAGNOSTIC ulint pageno = page_get_page_no(page); fprintf(stderr, "INNODB_RTR: Searching leaf page %d\n", @@ -2355,7 +2306,7 @@ #endif /* UNIV_DEBUG */ /* Pop the last match record and position on it */ match_rec->matched_recs->pop_back(); - page_cur_position(test_rec.r_rec, &match_rec->block, + page_cur_position(test_rec.r_rec, match_rec->block, cursor); } } else { diff -Nru mariadb-10.11.6/storage/innobase/handler/ha_innodb.cc mariadb-10.11.9/storage/innobase/handler/ha_innodb.cc --- mariadb-10.11.6/storage/innobase/handler/ha_innodb.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/handler/ha_innodb.cc 2024-08-03 07:29:59.000000000 +0000 @@ -47,10 +47,13 @@ #include #include #include +#include #include "sql_type_geom.h" #include "scope.h" #include "srv0srv.h" +extern my_bool opt_readonly; + // MYSQL_PLUGIN_IMPORT extern my_bool lower_case_file_system; // MYSQL_PLUGIN_IMPORT extern char mysql_unpacked_real_data_home[]; @@ -106,8 +109,7 @@ #include "ut0mem.h" #include "row0ext.h" #include "mariadb_stats.h" -thread_local ha_handler_stats mariadb_dummy_stats; -thread_local ha_handler_stats *mariadb_stats= &mariadb_dummy_stats; +simple_thread_local ha_handler_stats *mariadb_stats; #include "lz4.h" #include "lzo/lzo1x.h" @@ -116,6 +118,7 @@ #include "snappy-c.h" #include +#include // TT_FOR_UPGRADE #define thd_get_trx_isolation(X) ((enum_tx_isolation)thd_tx_isolation(X)) @@ -874,6 +877,10 @@ /* check_func */ NULL, /* update_func */ NULL, /* default */ TRUE); +static MYSQL_THDVAR_BOOL(snapshot_isolation, PLUGIN_VAR_OPCMDARG, + "Use snapshot isolation (write-write conflict detection).", + NULL, NULL, FALSE); + static MYSQL_THDVAR_BOOL(strict_mode, PLUGIN_VAR_OPCMDARG, "Use strict mode when evaluating create options.", NULL, NULL, TRUE); @@ -1036,7 +1043,7 @@ {"defragment_count", &export_vars.innodb_defragment_count, SHOW_SIZE_T}, {"instant_alter_column", - &export_vars.innodb_instant_alter_column, SHOW_ULONG}, + &export_vars.innodb_instant_alter_column, SHOW_SIZE_T}, /* Online alter table status variables */ {"onlineddl_rowlog_rows", @@ -1072,6 +1079,9 @@ {"encryption_num_key_requests", &export_vars.innodb_encryption_key_requests, SHOW_LONGLONG}, + /* InnoDB bulk operations */ + {"bulk_operations", &export_vars.innodb_bulk_operations, SHOW_SIZE_T}, + {NullS, NullS, SHOW_LONG} }; @@ -1204,11 +1214,8 @@ } log_requests; -/** @brief Adjust some InnoDB startup parameters based on file contents -or innodb_page_size. */ -static -void -innodb_params_adjust(); +/** Adjust some InnoDB startup parameters based on the data directory */ +static void innodb_params_adjust(); /*******************************************************************//** This function is used to prepare an X/Open XA distributed transaction. @@ -1575,7 +1582,8 @@ ibuf_delete_for_discarded_space(id); /* Any changes must be persisted before we return. */ - log_write_up_to(mtr.commit_lsn(), true); + if (mtr.commit_lsn()) + log_write_up_to(mtr.commit_lsn(), true); } my_free(namebuf); @@ -2080,7 +2088,7 @@ ut_d(purge_sys.resume_FTS()); } -static void innodb_ddl_recovery_done(handlerton*) +static int innodb_ddl_recovery_done(handlerton*) { ut_ad(!ddl_recovery_done); ut_d(ddl_recovery_done= true); @@ -2091,6 +2099,7 @@ drop_garbage_tables_after_restore(); srv_init_purge_tasks(); } + return 0; } /********************************************************************//** @@ -2164,6 +2173,9 @@ return(HA_ERR_LOCK_DEADLOCK); + case DB_RECORD_CHANGED: + return HA_ERR_RECORD_CHANGED; + case DB_LOCK_WAIT_TIMEOUT: /* Starting from 5.0.13, we let MySQL just roll back the latest SQL statement in a lock wait timeout. Previously, we @@ -2807,9 +2819,7 @@ trx->check_unique_secondary = !thd_test_options( thd, OPTION_RELAXED_UNIQUE_CHECKS); -#ifdef WITH_WSREP - trx->wsrep = wsrep_on(thd); -#endif + trx->snapshot_isolation = THDVAR(thd, snapshot_isolation) & 1; DBUG_VOID_RETURN; } @@ -3182,9 +3192,9 @@ } #endif - table->lock_mutex_lock(); + table->lock_shared_lock(); auto len= UT_LIST_GET_LEN(table->locks); - table->lock_mutex_unlock(); + table->lock_shared_unlock(); return len == 0; } @@ -3671,6 +3681,11 @@ 2ULL << 20, LLONG_MAX, 1024*1024L); +static MYSQL_SYSVAR_UINT(log_write_ahead_size, log_sys.write_size, + PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + "Redo log write size to avoid read-on-write; must be a power of two", + nullptr, nullptr, 512, 512, 4096, 1); + /****************************************************************//** Gives the file extension of an InnoDB single-table tablespace. */ static const char* ha_innobase_exts[] = { @@ -3792,6 +3807,13 @@ DBUG_RETURN(HA_ERR_INITIALIZATION); } + if (!ut_is_2pow(log_sys.write_size)) { + sql_print_error("InnoDB: innodb_log_write_ahead_size=%u" + " is not a power of two", + log_sys.write_size); + DBUG_RETURN(HA_ERR_INITIALIZATION); + } + if (compression_algorithm_is_not_loaded(innodb_compression_algorithm, ME_ERROR_LOG)) DBUG_RETURN(HA_ERR_INITIALIZATION); @@ -3981,6 +4003,21 @@ } } + ulint min_open_files_limit = srv_undo_tablespaces + + srv_sys_space.m_files.size() + + srv_tmp_space.m_files.size() + 1; + if (min_open_files_limit > innobase_open_files) { + sql_print_warning( + "InnoDB: innodb_open_files=%lu is not greater " + "than the number of system tablespace files, " + "temporary tablespace files, " + "innodb_undo_tablespaces=%lu; adjusting " + "to innodb_open_files=%zu", + innobase_open_files, srv_undo_tablespaces, + min_open_files_limit); + innobase_open_files = (ulong) min_open_files_limit; + } + srv_max_n_open_files = innobase_open_files; srv_innodb_status = (ibool) innobase_create_status_file; @@ -4001,7 +4038,7 @@ data_mysql_default_charset_coll = (ulint) default_charset_info->number; -#ifndef _WIN32 +#if !defined _WIN32 && defined O_DIRECT if (srv_use_atomic_writes && my_may_have_atomic_write) { /* Force O_DIRECT on Unixes (on Windows writes are always @@ -4026,11 +4063,6 @@ } #endif - if (srv_read_only_mode) { - ib::info() << "Started in read only mode"; - srv_use_doublewrite_buf = FALSE; - } - #if !defined LINUX_NATIVE_AIO && !defined HAVE_URING && !defined _WIN32 /* Currently native AIO is supported only on windows and linux and that also when the support is compiled in. In all other @@ -4046,9 +4078,7 @@ } #endif -#ifndef _WIN32 - ut_ad(srv_file_flush_method <= SRV_O_DIRECT_NO_FSYNC); -#else +#ifdef _WIN32 switch (srv_file_flush_method) { case SRV_ALL_O_DIRECT_FSYNC + 1 /* "async_unbuffered"="unbuffered" */: srv_file_flush_method = SRV_ALL_O_DIRECT_FSYNC; @@ -4059,6 +4089,8 @@ default: ut_ad(srv_file_flush_method <= SRV_ALL_O_DIRECT_FSYNC); } +#else + ut_ad(srv_file_flush_method <= SRV_O_DIRECT_NO_FSYNC); #endif innodb_buffer_pool_size_init(); @@ -4302,9 +4334,6 @@ trx_commit_for_mysql(trx); } else { trx->will_lock = false; -#ifdef WITH_WSREP - trx->wsrep = false; -#endif /* WITH_WSREP */ } #ifdef WITH_WSREP @@ -4345,7 +4374,7 @@ Do this only if transaction is using REPEATABLE READ isolation level. */ trx->isolation_level = innobase_map_isolation_level( - thd_get_trx_isolation(thd)); + thd_get_trx_isolation(thd)) & 3; if (trx->isolation_level == TRX_ISO_REPEATABLE_READ) { trx->read_view.open(trx); @@ -5348,67 +5377,6 @@ } } } - -/********************************************************************* -Test ut_format_name(). */ -static -void -test_ut_format_name() -/*=================*/ -{ - char buf[NAME_LEN * 3]; - - struct { - const char* name; - ulint buf_size; - const char* expected; - } test_data[] = { - {"test/t1", sizeof(buf), "`test`.`t1`"}, - {"test/t1", 12, "`test`.`t1`"}, - {"test/t1", 11, "`test`.`t1"}, - {"test/t1", 10, "`test`.`t"}, - {"test/t1", 9, "`test`.`"}, - {"test/t1", 8, "`test`."}, - {"test/t1", 7, "`test`"}, - {"test/t1", 6, "`test"}, - {"test/t1", 5, "`tes"}, - {"test/t1", 4, "`te"}, - {"test/t1", 3, "`t"}, - {"test/t1", 2, "`"}, - {"test/t1", 1, ""}, - {"test/t1", 0, "BUF_NOT_CHANGED"}, - {"table", sizeof(buf), "`table`"}, - {"ta'le", sizeof(buf), "`ta'le`"}, - {"ta\"le", sizeof(buf), "`ta\"le`"}, - {"ta`le", sizeof(buf), "`ta``le`"}, - }; - - for (size_t i = 0; i < UT_ARR_SIZE(test_data); i++) { - - memcpy(buf, "BUF_NOT_CHANGED", strlen("BUF_NOT_CHANGED") + 1); - - char* ret; - - ret = ut_format_name(test_data[i].name, - buf, - test_data[i].buf_size); - - ut_a(ret == buf); - - if (strcmp(buf, test_data[i].expected) == 0) { - ib::info() << "ut_format_name(" << test_data[i].name - << ", buf, " << test_data[i].buf_size << ")," - " expected " << test_data[i].expected - << ", OK"; - } else { - ib::error() << "ut_format_name(" << test_data[i].name - << ", buf, " << test_data[i].buf_size << ")," - " expected " << test_data[i].expected - << ", ERROR: got " << buf; - ut_error; - } - } -} #endif /* !DBUG_OFF */ /** Match index columns between MySQL and InnoDB. @@ -5567,15 +5535,13 @@ @param[in] ib_table InnoDB dict_table_t @param[in,out] s_templ InnoDB template structure @param[in] add_v new virtual columns added along with - add index call -@param[in] locked true if dict_sys.latch is held */ + add index call */ void innobase_build_v_templ( const TABLE* table, const dict_table_t* ib_table, dict_vcol_templ_t* s_templ, - const dict_add_v_col_t* add_v, - bool locked) + const dict_add_v_col_t* add_v) { ulint ncol = unsigned(ib_table->n_cols) - DATA_N_SYS_COLS; ulint n_v_col = ib_table->n_v_cols; @@ -5583,6 +5549,7 @@ DBUG_ENTER("innobase_build_v_templ"); ut_ad(ncol < REC_MAX_N_FIELDS); + ut_ad(ib_table->lock_mutex_is_owner()); if (add_v != NULL) { n_v_col += add_v->n_v_col; @@ -5590,20 +5557,7 @@ ut_ad(n_v_col > 0); - if (!locked) { - dict_sys.lock(SRW_LOCK_CALL); - } - -#if 0 - /* This does not (need to) hold for ctx->new_table in - alter_rebuild_apply_log() */ - ut_ad(dict_sys.locked()); -#endif - if (s_templ->vtempl) { - if (!locked) { - dict_sys.unlock(); - } DBUG_VOID_RETURN; } @@ -5707,12 +5661,9 @@ j++; } - if (!locked) { - dict_sys.unlock(); - } - s_templ->db_name = table->s->db.str; s_templ->tb_name = table->s->table_name.str; + DBUG_VOID_RETURN; } @@ -5766,9 +5717,9 @@ return ret; } -/********************************************************************//** -Get the upper limit of the MySQL integral and floating-point type. -@return maximum allowed value for the field */ +/** Get the maximum integer value of a numeric column. +@param field column definition +@return maximum allowed integer value */ ulonglong innobase_get_int_col_max_value(const Field *field) { ulonglong max_value = 0; @@ -5833,46 +5784,45 @@ @param[in,out] table persistent table @param[in] field the AUTO_INCREMENT column */ -static -void -initialize_auto_increment(dict_table_t* table, const Field* field) +static void initialize_auto_increment(dict_table_t *table, const Field& field, + const TABLE_SHARE &s) { - ut_ad(!table->is_temporary()); - - const unsigned col_no = innodb_col_no(field); - - table->autoinc_mutex.wr_lock(); - - table->persistent_autoinc = static_cast( - dict_table_get_nth_col_pos(table, col_no, NULL) + 1) - & dict_index_t::MAX_N_FIELDS; - - if (table->autoinc) { - /* Already initialized. Our caller checked - table->persistent_autoinc without - autoinc_mutex protection, and there might be multiple - ha_innobase::open() executing concurrently. */ - } else if (srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) { - /* If the recovery level is set so high that writes - are disabled we force the AUTOINC counter to 0 - value effectively disabling writes to the table. - Secondly, we avoid reading the table in case the read - results in failure due to a corrupted table/index. - - We will not return an error to the client, so that the - tables can be dumped with minimal hassle. If an error - were returned in this case, the first attempt to read - the table would fail and subsequent SELECTs would succeed. */ - } else if (table->persistent_autoinc) { - table->autoinc = innobase_next_autoinc( - btr_read_autoinc_with_fallback(table, col_no), - 1 /* need */, - 1 /* auto_increment_increment */, - 0 /* auto_increment_offset */, - innobase_get_int_col_max_value(field)); - } + ut_ad(!table->is_temporary()); + const unsigned col_no= innodb_col_no(&field); + table->autoinc_mutex.wr_lock(); + table->persistent_autoinc= + uint16_t(dict_table_get_nth_col_pos(table, col_no, nullptr) + 1) & + dict_index_t::MAX_N_FIELDS; + if (table->autoinc) + /* Already initialized. Our caller checked + table->persistent_autoinc without + autoinc_mutex protection, and there might be multiple + ha_innobase::open() executing concurrently. */; + else if (srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) + /* If innodb_force_recovery is set so high that writes + are disabled we force the AUTOINC counter to 0 + value effectively disabling writes to the table. + Secondly, we avoid reading the table in case the read + results in failure due to a corrupted table/index. + + We will not return an error to the client, so that the + tables can be dumped with minimal hassle. If an error + were returned in this case, the first attempt to read + the table would fail and subsequent SELECTs would succeed. */; + else if (table->persistent_autoinc) + { + uint64_t max_value= innobase_get_int_col_max_value(&field); + table->autoinc= + innobase_next_autoinc(btr_read_autoinc_with_fallback(table, col_no, + s.mysql_version, + max_value), + 1 /* need */, + 1 /* auto_increment_increment */, + 0 /* auto_increment_offset */, + max_value); + } - table->autoinc_mutex.wr_unlock(); + table->autoinc_mutex.wr_unlock(); } /** Open an InnoDB table @@ -5991,15 +5941,15 @@ key_used_on_scan = m_primary_key; if (ib_table->n_v_cols) { - dict_sys.lock(SRW_LOCK_CALL); + ib_table->lock_mutex_lock(); + if (ib_table->vc_templ == NULL) { ib_table->vc_templ = UT_NEW_NOKEY(dict_vcol_templ_t()); innobase_build_v_templ( - table, ib_table, ib_table->vc_templ, NULL, - true); + table, ib_table, ib_table->vc_templ); } - dict_sys.unlock(); + ib_table->lock_mutex_unlock(); } if (!check_index_consistency(table, ib_table)) { @@ -6108,7 +6058,7 @@ || m_prebuilt->table->persistent_autoinc || !m_prebuilt->table->is_readable()) { } else if (const Field* ai = table->found_next_number_field) { - initialize_auto_increment(m_prebuilt->table, ai); + initialize_auto_increment(m_prebuilt->table, *ai, *table->s); } /* Set plugin parser for fulltext index */ @@ -7397,26 +7347,55 @@ ulint num_v = 0; - if (active_index != MAX_KEY - && active_index == pushed_idx_cond_keyno) { - m_prebuilt->idx_cond = this; - goto icp; - } else if (pushed_rowid_filter && rowid_filter_is_active) { -icp: - /* Push down an index condition or an end_range check. */ + /* MDEV-31154: For pushed down index condition we don't support virtual + column and idx_cond_push() does check for it. For row ID filtering we + don't need such restrictions but we get into trouble trying to use the + ICP path. + + 1. It should be fine to follow no_icp path if primary key is generated. + However, with user specified primary key(PK), the row is identified by + the PK and those columns need to be converted to mysql format in + row_search_idx_cond_check before doing the comparison. Since secondary + indexes always have PK appended in innodb, it works with current ICP + handling code when fetch_primary_key_cols is set to TRUE. + + 2. Although ICP comparison and Row ID comparison works on different + columns the current ICP code can be shared by both. + + 3. In most cases, it works today by jumping to goto no_icp when we + encounter a virtual column. This is hackish and already have some + issues as it cannot handle PK and all states are not reset properly, + for example, idx_cond_n_cols is not reset. + + 4. We already encountered MDEV-28747 m_prebuilt->idx_cond was being set. + + Neither ICP nor row ID comparison needs virtual columns and the code is + simplified to handle both. It should handle the issues. */ + + const bool pushed_down = active_index != MAX_KEY + && active_index == pushed_idx_cond_keyno; + + m_prebuilt->idx_cond = pushed_down ? this : nullptr; + + if (m_prebuilt->idx_cond || m_prebuilt->pk_filter) { + /* Push down an index condition, end_range check or row ID + filter */ for (ulint i = 0; i < n_fields; i++) { const Field* field = table->field[i]; const bool is_v = !field->stored_in_db(); - if (is_v && skip_virtual) { - num_v++; - continue; - } + bool index_contains = index->contains_col_or_prefix( is_v ? num_v : i - num_v, is_v); - if (is_v && index_contains) { - m_prebuilt->n_template = 0; - num_v = 0; - goto no_icp; + + if (is_v) { + if (index_contains) { + /* We want to ensure that ICP is not + used with virtual columns. */ + ut_ad(!pushed_down); + m_prebuilt->idx_cond = nullptr; + } + num_v++; + continue; } /* Test if an end_range or an index condition @@ -7436,7 +7415,7 @@ which would be acceptable if end_range==NULL. */ if (build_template_needs_field_in_icp( index, m_prebuilt, index_contains, - is_v ? num_v : i - num_v, is_v)) { + i - num_v, false)) { if (!whole_row) { field = build_template_needs_field( index_contains, @@ -7445,15 +7424,10 @@ fetch_primary_key_cols, index, table, i, num_v); if (!field) { - if (is_v) { - num_v++; - } continue; } } - ut_ad(!is_v); - mysql_row_templ_t* templ= build_template_field( m_prebuilt, clust_index, index, table, field, i - num_v, 0); @@ -7530,15 +7504,16 @@ */ } - if (is_v) { - num_v++; - } } - ut_ad(m_prebuilt->idx_cond_n_cols > 0); - ut_ad(m_prebuilt->idx_cond_n_cols == m_prebuilt->n_template); - num_v = 0; + ut_ad(m_prebuilt->idx_cond_n_cols == m_prebuilt->n_template); + if (m_prebuilt->idx_cond_n_cols == 0) { + /* No columns to push down. It is safe to jump to np ICP + path. */ + m_prebuilt->idx_cond = nullptr; + goto no_icp; + } /* Include the fields that are not needed in index condition pushdown. */ @@ -7553,7 +7528,7 @@ bool index_contains = index->contains_col_or_prefix( is_v ? num_v : i - num_v, is_v); - if (!build_template_needs_field_in_icp( + if (is_v || !build_template_needs_field_in_icp( index, m_prebuilt, index_contains, is_v ? num_v : i - num_v, is_v)) { /* Not needed in ICP */ @@ -7586,7 +7561,7 @@ } else { no_icp: /* No index condition pushdown */ - m_prebuilt->idx_cond = NULL; + ut_ad(!m_prebuilt->idx_cond); ut_ad(num_v == 0); for (ulint i = 0; i < n_fields; i++) { @@ -7817,20 +7792,6 @@ #endif if ((error_result = update_auto_increment())) { - /* We don't want to mask autoinc overflow errors. */ - - /* Handle the case where the AUTOINC sub-system - failed during initialization. */ - if (m_prebuilt->autoinc_error == DB_UNSUPPORTED) { - error_result = ER_AUTOINC_READ_FAILED; - /* Set the error message to report too. */ - my_error(ER_AUTOINC_READ_FAILED, MYF(0)); - goto func_exit; - } else if (m_prebuilt->autoinc_error != DB_SUCCESS) { - error = m_prebuilt->autoinc_error; - goto report_error; - } - /* MySQL errors are passed straight back. */ goto func_exit; } @@ -7968,7 +7929,6 @@ } } -report_error: /* Cleanup and exit. */ if (error == DB_TABLESPACE_DELETED) { ib_senderrf( @@ -8697,7 +8657,10 @@ } #ifdef WITH_WSREP - if (error == DB_SUCCESS && trx->is_wsrep() + if (error == DB_SUCCESS && + /* For sequences, InnoDB transaction may not have been started yet. + Check THD-level wsrep state in that case. */ + (trx->is_wsrep() || (!trx_is_started(trx) && wsrep_on(m_user_thd))) && wsrep_thd_is_local(m_user_thd) && !wsrep_thd_ignore_table(m_user_thd)) { DBUG_PRINT("wsrep", ("update row key")); @@ -8755,6 +8718,7 @@ : PLAIN_DELETE; trx->fts_next_doc_id = 0; + ut_ad(!trx->is_bulk_insert()); error = row_update_for_mysql(m_prebuilt); #ifdef WITH_WSREP @@ -8862,47 +8826,63 @@ DBUG_RETURN(0); } -/*********************************************************************//** -Converts a search mode flag understood by MySQL to a flag understood -by InnoDB. */ -page_cur_mode_t -convert_search_mode_to_innobase( -/*============================*/ - ha_rkey_function find_flag) -{ - switch (find_flag) { - case HA_READ_KEY_EXACT: - /* this does not require the index to be UNIQUE */ - case HA_READ_KEY_OR_NEXT: - return(PAGE_CUR_GE); - case HA_READ_AFTER_KEY: - return(PAGE_CUR_G); - case HA_READ_BEFORE_KEY: - return(PAGE_CUR_L); - case HA_READ_KEY_OR_PREV: - case HA_READ_PREFIX_LAST: - case HA_READ_PREFIX_LAST_OR_PREV: - return(PAGE_CUR_LE); - case HA_READ_MBR_CONTAIN: - return(PAGE_CUR_CONTAIN); - case HA_READ_MBR_INTERSECT: - return(PAGE_CUR_INTERSECT); - case HA_READ_MBR_WITHIN: - return(PAGE_CUR_WITHIN); - case HA_READ_MBR_DISJOINT: - return(PAGE_CUR_DISJOINT); - case HA_READ_MBR_EQUAL: - return(PAGE_CUR_MBR_EQUAL); - case HA_READ_PREFIX: - return(PAGE_CUR_UNSUPP); - /* do not use "default:" in order to produce a gcc warning: - enumeration value '...' not handled in switch - (if -Wswitch or -Wall is used) */ - } - - my_error(ER_CHECK_NOT_IMPLEMENTED, MYF(0), "this functionality"); +/** Convert a MariaDB search mode to an InnoDB search mode. +@tparam last_match whether last_match_mode is to be set +@param find_flag MariaDB search mode +@param mode InnoDB search mode +@param last_match_mode pointer to ha_innobase::m_last_match_mode +@return whether the search mode is unsupported */ +template +static bool convert_search_mode_to_innobase(ha_rkey_function find_flag, + page_cur_mode_t &mode, + uint *last_match_mode= nullptr) +{ + mode= PAGE_CUR_LE; + if (last_match) + *last_match_mode= 0; + + switch (find_flag) { + case HA_READ_KEY_EXACT: + /* this does not require the index to be UNIQUE */ + if (last_match) + *last_match_mode= ROW_SEL_EXACT; + /* fall through */ + case HA_READ_KEY_OR_NEXT: + mode= PAGE_CUR_GE; + return false; + case HA_READ_AFTER_KEY: + mode= PAGE_CUR_G; + return false; + case HA_READ_BEFORE_KEY: + mode= PAGE_CUR_L; + return false; + case HA_READ_PREFIX_LAST: + if (last_match) + *last_match_mode= ROW_SEL_EXACT_PREFIX; + /* fall through */ + case HA_READ_KEY_OR_PREV: + case HA_READ_PREFIX_LAST_OR_PREV: + return false; + case HA_READ_MBR_CONTAIN: + mode= PAGE_CUR_CONTAIN; + return false; + case HA_READ_MBR_INTERSECT: + mode= PAGE_CUR_INTERSECT; + return false; + case HA_READ_MBR_WITHIN: + mode= PAGE_CUR_WITHIN; + return false; + case HA_READ_MBR_DISJOINT: + mode= PAGE_CUR_DISJOINT; + return false; + case HA_READ_MBR_EQUAL: + mode= PAGE_CUR_MBR_EQUAL; + return false; + case HA_READ_PREFIX: + break; + } - return(PAGE_CUR_UNSUPP); + return true; } /* @@ -8980,8 +8960,7 @@ mariadb_set_stats set_stats_temporary(handler_stats); DEBUG_SYNC_C("ha_innobase_index_read_begin"); - ut_a(m_prebuilt->trx == thd_to_trx(m_user_thd)); - ut_ad(key_len != 0 || find_flag != HA_READ_KEY_EXACT); + ut_ad(m_prebuilt->trx == thd_to_trx(m_user_thd)); dict_index_t* index = m_prebuilt->index; @@ -9017,7 +8996,8 @@ build_template(false); } - if (key_ptr != NULL) { + if (key_len) { + ut_ad(key_ptr); /* Convert the search key value to InnoDB format into m_prebuilt->search_tuple */ @@ -9027,84 +9007,58 @@ m_prebuilt->srch_key_val_len, index, (byte*) key_ptr, - (ulint) key_len); + key_len); DBUG_ASSERT(m_prebuilt->search_tuple->n_fields > 0); } else { + ut_ad(find_flag != HA_READ_KEY_EXACT); /* We position the cursor to the last or the first entry in the index */ dtuple_set_n_fields(m_prebuilt->search_tuple, 0); } - page_cur_mode_t mode = convert_search_mode_to_innobase(find_flag); + page_cur_mode_t mode; - ulint match_mode = 0; - - if (find_flag == HA_READ_KEY_EXACT) { - - match_mode = ROW_SEL_EXACT; - - } else if (find_flag == HA_READ_PREFIX_LAST) { - - match_mode = ROW_SEL_EXACT_PREFIX; + if (convert_search_mode_to_innobase(find_flag, mode, + &m_last_match_mode)) { + table->status = STATUS_NOT_FOUND; + DBUG_RETURN(HA_ERR_UNSUPPORTED); } - m_last_match_mode = (uint) match_mode; - - dberr_t ret = mode == PAGE_CUR_UNSUPP ? DB_UNSUPPORTED - : row_search_mvcc(buf, mode, m_prebuilt, match_mode, 0); + dberr_t ret = + row_search_mvcc(buf, mode, m_prebuilt, m_last_match_mode, 0); DBUG_EXECUTE_IF("ib_select_query_failure", ret = DB_ERROR;); - int error; - - switch (ret) { - case DB_SUCCESS: - error = 0; + if (UNIV_LIKELY(ret == DB_SUCCESS)) { table->status = 0; - break; + DBUG_RETURN(0); + } - case DB_RECORD_NOT_FOUND: - error = HA_ERR_KEY_NOT_FOUND; - table->status = STATUS_NOT_FOUND; - break; - - case DB_END_OF_INDEX: - error = HA_ERR_KEY_NOT_FOUND; - table->status = STATUS_NOT_FOUND; - break; + table->status = STATUS_NOT_FOUND; + switch (ret) { case DB_TABLESPACE_DELETED: ib_senderrf( m_prebuilt->trx->mysql_thd, IB_LOG_LEVEL_ERROR, ER_TABLESPACE_DISCARDED, table->s->table_name.str); - - table->status = STATUS_NOT_FOUND; - error = HA_ERR_TABLESPACE_MISSING; - break; - + DBUG_RETURN(HA_ERR_TABLESPACE_MISSING); + case DB_RECORD_NOT_FOUND: + case DB_END_OF_INDEX: + DBUG_RETURN(HA_ERR_KEY_NOT_FOUND); case DB_TABLESPACE_NOT_FOUND: - ib_senderrf( m_prebuilt->trx->mysql_thd, IB_LOG_LEVEL_ERROR, ER_TABLESPACE_MISSING, table->s->table_name.str); - - table->status = STATUS_NOT_FOUND; - error = HA_ERR_TABLESPACE_MISSING; - break; - + DBUG_RETURN(HA_ERR_TABLESPACE_MISSING); default: - error = convert_error_code_to_mysql( - ret, m_prebuilt->table->flags, m_user_thd); - - table->status = STATUS_NOT_FOUND; - break; + DBUG_RETURN(convert_error_code_to_mysql( + ret, m_prebuilt->table->flags, + m_user_thd)); } - - DBUG_RETURN(error); } /*******************************************************************//** @@ -9531,8 +9485,6 @@ DBUG_ENTER("rnd_pos"); DBUG_DUMP("key", pos, ref_length); - ut_a(m_prebuilt->trx == thd_to_trx(ha_thd())); - /* Note that we assume the length of the row reference is fixed for the table, and it is == ref_length */ @@ -9956,7 +9908,8 @@ } ulint rcode = DB_SUCCESS; - char cache_key[513] = {'\0'}; + char cache_key[MAX_FULL_NAME_LEN] = {'\0'}; + char db_name[MAX_DATABASE_NAME_LEN+1] = {'\0'}; size_t cache_key_len = 0; if ( !((referenced) ? @@ -10046,14 +9999,38 @@ return DB_ERROR; } - strncpy(cache_key, + char * fk_table = (wsrep_protocol_version > 1) ? ((referenced) ? foreign->referenced_table->name.m_name : foreign->foreign_table->name.m_name) : - foreign->foreign_table->name.m_name, sizeof(cache_key) - 1); - cache_key_len = strlen(cache_key); + foreign->foreign_table->name.m_name; + + /* convert db and table name parts separately to system charset */ + ulint db_name_len = dict_get_db_name_len(fk_table); + strmake(db_name, fk_table, db_name_len); + uint errors; + cache_key_len= innobase_convert_to_system_charset(cache_key, + db_name, sizeof(cache_key), &errors); + if (errors) { + WSREP_WARN("unexpected foreign key table %s %s", + foreign->referenced_table->name.m_name, + foreign->foreign_table->name.m_name); + return DB_ERROR; + } + /* after db name adding 0 and then converted table name */ + cache_key[db_name_len]= '\0'; + cache_key_len++; + + cache_key_len+= innobase_convert_to_system_charset(cache_key+cache_key_len, + fk_table+db_name_len+1, sizeof(cache_key), &errors); + if (errors) { + WSREP_WARN("unexpected foreign key table %s %s", + foreign->referenced_table->name.m_name, + foreign->foreign_table->name.m_name); + return DB_ERROR; + } #ifdef WSREP_DEBUG_PRINT ulint j; fprintf(stderr, "FK parent key, table: %s %s len: %lu ", @@ -10063,16 +10040,6 @@ } fprintf(stderr, "\n"); #endif - char *p = strchr(cache_key, '/'); - - if (p) { - *p = '\0'; - } else { - WSREP_WARN("unexpected foreign key table %s %s", - foreign->referenced_table->name.m_name, - foreign->foreign_table->name.m_name); - } - wsrep_buf_t wkey_part[3]; wsrep_key_t wkey = {wkey_part, 3}; @@ -11809,8 +11776,6 @@ /* Set the flags2 when create table or alter tables */ m_flags2 |= DICT_TF2_FTS_AUX_HEX_NAME; - DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name", - m_flags2 &= ~DICT_TF2_FTS_AUX_HEX_NAME;); DBUG_RETURN(true); } @@ -12289,7 +12254,7 @@ dict_index_t* index = NULL; fkerr_t index_error = FK_SUCCESS; dict_index_t* err_index = NULL; - ulint err_col; + ulint err_col = 0; const bool tmp_table = m_flags2 & DICT_TF2_TEMPORARY; const CHARSET_INFO* cs = thd_charset(m_thd); const char* operation = "Create "; @@ -13370,7 +13335,7 @@ | HA_STATUS_VARIABLE | HA_STATUS_AUTO); - fil_crypt_set_encrypt_tables(srv_encrypt_tables); + fil_crypt_add_imported_space(m_prebuilt->table->space); } } @@ -13403,6 +13368,49 @@ DBUG_RETURN(0); } +/** Report a DROP TABLE failure due to a FOREIGN KEY constraint. +@param name table name +@param foreign constraint */ +ATTRIBUTE_COLD +static void delete_table_cannot_drop_foreign(const table_name_t &name, + const dict_foreign_t &foreign) +{ + mysql_mutex_lock(&dict_foreign_err_mutex); + rewind(dict_foreign_err_file); + ut_print_timestamp(dict_foreign_err_file); + fputs(" Cannot drop table ", dict_foreign_err_file); + ut_print_name(dict_foreign_err_file, nullptr, name.m_name); + fputs("\nbecause it is referenced by ", dict_foreign_err_file); + ut_print_name(dict_foreign_err_file, nullptr, foreign.foreign_table_name); + putc('\n', dict_foreign_err_file); + mysql_mutex_unlock(&dict_foreign_err_mutex); +} + +/** Check if DROP TABLE would fail due to a FOREIGN KEY constraint. +@param table table to be dropped +@param sqlcom thd_sql_command(current_thd) +@return whether child tables that refer to this table exist */ +static bool delete_table_check_foreigns(const dict_table_t &table, + enum_sql_command sqlcom) +{ + const bool drop_db{sqlcom == SQLCOM_DROP_DB}; + for (const auto foreign : table.referenced_set) + { + /* We should allow dropping a referenced table if creating + that referenced table has failed for some reason. For example + if referenced table is created but it column types that are + referenced do not match. */ + if (foreign->foreign_table == &table || + (drop_db && + dict_tables_have_same_db(table.name.m_name, + foreign->foreign_table_name_lookup))) + continue; + delete_table_cannot_drop_foreign(table.name, *foreign); + return true; + } + + return false; +} /** DROP TABLE (possibly as part of DROP DATABASE, CREATE/ALTER TABLE) @param name table name @@ -13417,8 +13425,8 @@ DBUG_EXECUTE_IF("test_normalize_table_name_low", test_normalize_table_name_low();); - DBUG_EXECUTE_IF("test_ut_format_name", test_ut_format_name();); + const enum_sql_command sqlcom= enum_sql_command(thd_sql_command(thd)); trx_t *parent_trx= check_trx_exists(thd); dict_table_t *table; @@ -13455,6 +13463,13 @@ DBUG_RETURN(0); } + if (parent_trx->check_foreigns && + delete_table_check_foreigns(*table, sqlcom)) + { + dict_sys.unlock(); + DBUG_RETURN(HA_ERR_ROW_IS_REFERENCED); + } + table->acquire(); dict_sys.unlock(); @@ -13487,14 +13502,7 @@ /* FOREIGN KEY constraints cannot exist on partitioned tables. */; #endif else - { - dict_sys.freeze(SRW_LOCK_CALL); - for (const dict_foreign_t* f : table->referenced_set) - if (dict_table_t* child= f->foreign_table) - if ((err= lock_table_for_trx(child, trx, LOCK_X)) != DB_SUCCESS) - break; - dict_sys.unfreeze(); - } + err= lock_table_children(table, trx); } dict_table_t *table_stats= nullptr, *index_stats= nullptr; @@ -13504,7 +13512,6 @@ const bool fts= err == DB_SUCCESS && (table->flags2 & (DICT_TF2_FTS_HAS_DOC_ID | DICT_TF2_FTS)); - const enum_sql_command sqlcom= enum_sql_command(thd_sql_command(thd)); if (fts) { @@ -13662,36 +13669,16 @@ DBUG_RETURN(convert_error_code_to_mysql(err, 0, NULL)); } - if (!table->no_rollback() && trx->check_foreigns) + if (!table->no_rollback()) { - const bool drop_db= sqlcom == SQLCOM_DROP_DB; - for (auto foreign : table->referenced_set) + if (trx->check_foreigns && delete_table_check_foreigns(*table, sqlcom)) { - /* We should allow dropping a referenced table if creating - that referenced table has failed for some reason. For example - if referenced table is created but it column types that are - referenced do not match. */ - if (foreign->foreign_table == table || - (drop_db && - dict_tables_have_same_db(table->name.m_name, - foreign->foreign_table_name_lookup))) - continue; - mysql_mutex_lock(&dict_foreign_err_mutex); - rewind(dict_foreign_err_file); - ut_print_timestamp(dict_foreign_err_file); - fputs(" Cannot drop table ", dict_foreign_err_file); - ut_print_name(dict_foreign_err_file, trx, table->name.m_name); - fputs("\nbecause it is referenced by ", dict_foreign_err_file); - ut_print_name(dict_foreign_err_file, trx, foreign->foreign_table_name); - putc('\n', dict_foreign_err_file); - mysql_mutex_unlock(&dict_foreign_err_mutex); err= DB_CANNOT_DROP_CONSTRAINT; goto err_exit; } - } - if (!table->no_rollback()) err= trx->drop_table_foreign(table->name); + } if (err == DB_SUCCESS && table_stats && index_stats) err= trx->drop_table_statistics(table->name); @@ -13810,6 +13797,19 @@ update_thd(); +#ifdef UNIV_DEBUG + if (!thd_test_options(m_user_thd, OPTION_NO_FOREIGN_KEY_CHECKS)) + { + /* fk_truncate_illegal_if_parent() should have failed in + Sql_cmd_truncate_table::handler_truncate() if foreign_key_checks=ON + and child tables exist. */ + dict_sys.freeze(SRW_LOCK_CALL); + for (const auto foreign : m_prebuilt->table->referenced_set) + ut_ad(foreign->foreign_table == m_prebuilt->table); + dict_sys.unfreeze(); + } +#endif + if (is_read_only()) DBUG_RETURN(HA_ERR_TABLE_READONLY); @@ -13892,14 +13892,7 @@ dict_table_t *table_stats = nullptr, *index_stats = nullptr; MDL_ticket *mdl_table = nullptr, *mdl_index = nullptr; - dberr_t error= DB_SUCCESS; - - dict_sys.freeze(SRW_LOCK_CALL); - for (const dict_foreign_t *f : ib_table->referenced_set) - if (dict_table_t *child= f->foreign_table) - if ((error= lock_table_for_trx(child, trx, LOCK_X)) != DB_SUCCESS) - break; - dict_sys.unfreeze(); + dberr_t error= lock_table_children(ib_table, trx); if (error == DB_SUCCESS) error= lock_table_for_trx(ib_table, trx, LOCK_X); @@ -14090,16 +14083,7 @@ /* There is no need to lock any FOREIGN KEY child tables. */ } else if (dict_table_t *table = dict_table_open_on_name( norm_from, false, DICT_ERR_IGNORE_FK_NOKEY)) { - dict_sys.freeze(SRW_LOCK_CALL); - for (const dict_foreign_t* f : table->referenced_set) { - if (dict_table_t* child = f->foreign_table) { - error = lock_table_for_trx(child, trx, LOCK_X); - if (error != DB_SUCCESS) { - break; - } - } - } - dict_sys.unfreeze(); + error = lock_table_children(table, trx); if (error == DB_SUCCESS) { error = lock_table_for_trx(table, trx, LOCK_X); } @@ -14238,14 +14222,14 @@ dict_index_t* index; dtuple_t* range_start; dtuple_t* range_end; - ha_rows n_rows; + ha_rows n_rows = HA_POS_ERROR; page_cur_mode_t mode1; page_cur_mode_t mode2; mem_heap_t* heap; DBUG_ENTER("records_in_range"); - ut_a(m_prebuilt->trx == thd_to_trx(ha_thd())); + ut_ad(m_prebuilt->trx == thd_to_trx(ha_thd())); m_prebuilt->trx->op_info = "estimating records in index range"; @@ -14258,12 +14242,7 @@ /* There exists possibility of not being able to find requested index due to inconsistency between MySQL and InoDB dictionary info. Necessary message should have been printed in innobase_get_index() */ - if (!m_prebuilt->table->space) { - n_rows = HA_POS_ERROR; - goto func_exit; - } - if (!index) { - n_rows = HA_POS_ERROR; + if (!index || !m_prebuilt->table->space) { goto func_exit; } if (index->is_corrupted()) { @@ -14279,61 +14258,50 @@ + sizeof(dtuple_t))); range_start = dtuple_create(heap, key->ext_key_parts); - dict_index_copy_types(range_start, index, key->ext_key_parts); range_end = dtuple_create(heap, key->ext_key_parts); - dict_index_copy_types(range_end, index, key->ext_key_parts); - row_sel_convert_mysql_key_to_innobase( - range_start, - m_prebuilt->srch_key_val1, - m_prebuilt->srch_key_val_len, - index, - (byte*) (min_key ? min_key->key : (const uchar*) 0), - (ulint) (min_key ? min_key->length : 0)); - - DBUG_ASSERT(min_key - ? range_start->n_fields > 0 - : range_start->n_fields == 0); - - row_sel_convert_mysql_key_to_innobase( - range_end, - m_prebuilt->srch_key_val2, - m_prebuilt->srch_key_val_len, - index, - (byte*) (max_key ? max_key->key : (const uchar*) 0), - (ulint) (max_key ? max_key->length : 0)); - - DBUG_ASSERT(max_key - ? range_end->n_fields > 0 - : range_end->n_fields == 0); - - mode1 = convert_search_mode_to_innobase( - min_key ? min_key->flag : HA_READ_KEY_EXACT); - - mode2 = convert_search_mode_to_innobase( - max_key ? max_key->flag : HA_READ_KEY_EXACT); - - if (mode1 != PAGE_CUR_UNSUPP && mode2 != PAGE_CUR_UNSUPP) { - - if (dict_index_is_spatial(index)) { - /*Only min_key used in spatial index. */ - n_rows = rtr_estimate_n_rows_in_range( - index, range_start, mode1); - } else { - btr_pos_t tuple1(range_start, mode1, pages->first_page); - btr_pos_t tuple2(range_end, mode2, pages->last_page); - n_rows = btr_estimate_n_rows_in_range( - index, &tuple1, &tuple2); - pages->first_page= tuple1.page_id.raw(); - pages->last_page= tuple2.page_id.raw(); - } + if (!min_key) { + mode1 = PAGE_CUR_GE; + dtuple_set_n_fields(range_start, 0); + } else if (convert_search_mode_to_innobase(min_key->flag, mode1)) { + goto unsupported; } else { + dict_index_copy_types(range_start, index, key->ext_key_parts); + row_sel_convert_mysql_key_to_innobase( + range_start, + m_prebuilt->srch_key_val1, + m_prebuilt->srch_key_val_len, + index, min_key->key, min_key->length); + DBUG_ASSERT(range_start->n_fields > 0); + } - n_rows = HA_POS_ERROR; + if (!max_key) { + mode2 = PAGE_CUR_GE; + dtuple_set_n_fields(range_end, 0); + } else if (convert_search_mode_to_innobase(max_key->flag, mode2)) { + goto unsupported; + } else { + dict_index_copy_types(range_end, index, key->ext_key_parts); + row_sel_convert_mysql_key_to_innobase( + range_end, + m_prebuilt->srch_key_val2, + m_prebuilt->srch_key_val_len, + index, max_key->key, max_key->length); + DBUG_ASSERT(range_end->n_fields > 0); } - mem_heap_free(heap); + if (dict_index_is_spatial(index)) { + /*Only min_key used in spatial index. */ + n_rows = rtr_estimate_n_rows_in_range( + index, range_start, mode1); + } else { + btr_pos_t tuple1(range_start, mode1, pages->first_page); + btr_pos_t tuple2(range_end, mode2, pages->last_page); + n_rows = btr_estimate_n_rows_in_range(index, &tuple1, &tuple2); + pages->first_page= tuple1.page_id.raw(); + pages->last_page= tuple2.page_id.raw(); + } DBUG_EXECUTE_IF( "print_btr_estimate_n_rows_in_range_return_value", @@ -14344,11 +14312,7 @@ (longlong) n_rows); ); -func_exit: - - m_prebuilt->trx->op_info = (char*)""; - - /* The MySQL optimizer seems to believe an estimate of 0 rows is + /* The MariaDB optimizer seems to believe an estimate of 0 rows is always accurate and may return the result 'Empty set' based on that. The accuracy is not guaranteed, and even if it were, for a locking read we should anyway perform the search to set the next-key lock. @@ -14358,6 +14322,10 @@ n_rows = 1; } +unsupported: + mem_heap_free(heap); +func_exit: + m_prebuilt->trx->op_info = ""; DBUG_RETURN((ha_rows) n_rows); } @@ -14678,7 +14646,7 @@ Returns statistics information of the table to the MySQL interpreter, in various fields of the handle object. @return HA_ERR_* error code or 0 */ - +TRANSACTIONAL_TARGET int ha_innobase::info_low( /*==================*/ @@ -14710,12 +14678,7 @@ DBUG_ASSERT(ib_table->get_ref_count() > 0); if (!ib_table->is_readable()) { - ib_table->stats_mutex_lock(); - ib_table->stat_initialized = true; - ib_table->stat_n_rows = 0; - ib_table->stat_clustered_index_size = 0; - ib_table->stat_sum_of_other_index_sizes = 0; - ib_table->stats_mutex_unlock(); + dict_stats_empty_table(ib_table, true); } if (flag & HA_STATUS_TIME) { @@ -14764,19 +14727,37 @@ ulint stat_clustered_index_size; ulint stat_sum_of_other_index_sizes; - ib_table->stats_mutex_lock(); - ut_a(ib_table->stat_initialized); - n_rows = ib_table->stat_n_rows; +#if !defined NO_ELISION && !defined SUX_LOCK_GENERIC + if (xbegin()) { + if (ib_table->stats_mutex_is_locked()) + xabort(); + + n_rows = ib_table->stat_n_rows; + + stat_clustered_index_size + = ib_table->stat_clustered_index_size; + + stat_sum_of_other_index_sizes + = ib_table->stat_sum_of_other_index_sizes; + + xend(); + } else +#endif + { + ib_table->stats_shared_lock(); - stat_clustered_index_size - = ib_table->stat_clustered_index_size; + n_rows = ib_table->stat_n_rows; - stat_sum_of_other_index_sizes - = ib_table->stat_sum_of_other_index_sizes; + stat_clustered_index_size + = ib_table->stat_clustered_index_size; - ib_table->stats_mutex_unlock(); + stat_sum_of_other_index_sizes + = ib_table->stat_sum_of_other_index_sizes; + + ib_table->stats_shared_unlock(); + } /* The MySQL optimizer seems to assume in a left join that n_rows @@ -14819,11 +14800,13 @@ stats.index_file_length = ulonglong(stat_sum_of_other_index_sizes) * size; - space->s_lock(); - stats.delete_length = 1024 - * fsp_get_available_space_in_free_extents( + if (flag & HA_STATUS_VARIABLE_EXTRA) { + space->s_lock(); + stats.delete_length = 1024 + * fsp_get_available_space_in_free_extents( *space); - space->s_unlock(); + space->s_unlock(); + } } stats.check_time = 0; stats.mrr_length_per_rec= (uint)ref_length + 8; // 8 = max(sizeof(void *)); @@ -14894,9 +14877,9 @@ stats.create_time = (ulong) stat_info.ctime; } - ib_table->stats_mutex_lock(); + ib_table->stats_shared_lock(); auto _ = make_scope_exit([ib_table]() { - ib_table->stats_mutex_unlock(); }); + ib_table->stats_shared_unlock(); }); ut_a(ib_table->stat_initialized); @@ -14966,7 +14949,8 @@ index selectivity is 2 times better than our estimate: */ - rec_per_key_int = rec_per_key_int / 2; + rec_per_key_int /= 1 + + thd_double_innodb_cardinality(m_user_thd); if (rec_per_key_int == 0) { rec_per_key_int = 1; @@ -15165,6 +15149,7 @@ ulint n_rows_in_table = ULINT_UNDEFINED; bool is_ok = true; dberr_t ret; + uint handler_flags= check_opt->handler_flags; DBUG_ENTER("ha_innobase::check"); DBUG_ASSERT(thd == ha_thd()); @@ -15173,6 +15158,27 @@ ut_a(m_prebuilt->trx == thd_to_trx(thd)); ut_ad(m_prebuilt->trx->mysql_thd == thd); + if (handler_flags || check_for_upgrade(check_opt)) { + /* The file was already checked and fixed as part of open */ + print_check_msg(thd, table->s->db.str, table->s->table_name.str, + "check", "note", + (opt_readonly || high_level_read_only + || !(check_opt->sql_flags & TT_FOR_UPGRADE)) + ? "Auto_increment will be" + " checked on each open until" + " CHECK TABLE FOR UPGRADE is executed" + : "Auto_increment checked and" + " .frm file version updated", 1); + if (handler_flags && (check_opt->sql_flags & TT_FOR_UPGRADE)) { + /* + No other issues found (as handler_flags was only + set if there as not other problems with the table + than auto_increment). + */ + DBUG_RETURN(HA_ADMIN_OK); + } + } + if (m_prebuilt->mysql_template == NULL) { /* Build the template; we will use a dummy template in index scans done in checking */ @@ -15355,7 +15361,7 @@ } /* Restore the original isolation level */ - m_prebuilt->trx->isolation_level = old_isolation_level; + m_prebuilt->trx->isolation_level = old_isolation_level & 3; #ifdef BTR_CUR_HASH_ADAPT # if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG /* We validate the whole adaptive hash index for all tables @@ -15376,6 +15382,35 @@ DBUG_RETURN(is_ok ? HA_ADMIN_OK : HA_ADMIN_CORRUPT); } +/** +Check if we there is a problem with the InnoDB table. +@param check_opt check options +@retval HA_ADMIN_OK if Table is ok +@retval HA_ADMIN_NEEDS_ALTER User should run ALTER TABLE FOR UPGRADE +@retval HA_ADMIN_NEEDS_CHECK User should run CHECK TABLE FOR UPGRADE +@retval HA_ADMIN_FAILED if InnoDB is in read-only mode */ +int ha_innobase::check_for_upgrade(HA_CHECK_OPT *check_opt) +{ + /* + Check if there is a possibility that the auto increment value + stored in PAGE_ROOT_AUTO_INC could be corrupt. + */ + if (table->s->mysql_version >= 100210); + else if (const Field *auto_increment= table->found_next_number_field) + { + uint col_no= innodb_col_no(auto_increment); + const dict_col_t *autoinc_col= + dict_table_get_nth_col(m_prebuilt->table, col_no); + if (m_prebuilt->table->get_index(*autoinc_col)) + { + check_opt->handler_flags= 1; + return (high_level_read_only && !opt_readonly) + ? HA_ADMIN_FAILED : HA_ADMIN_NEEDS_CHECK; + } + } + return HA_ADMIN_OK; +} + /*******************************************************************//** Gets the foreign key create info for a table stored in InnoDB. @return own: character string in the form which can be inserted to the @@ -15433,7 +15468,6 @@ char tmp_buff[NAME_LEN+1]; char name_buff[NAME_LEN+1]; const char* ptr; - LEX_CSTRING* referenced_key_name; LEX_CSTRING* name = NULL; if (dict_table_t::is_temporary_name(foreign->foreign_table_name)) { @@ -15534,18 +15568,16 @@ if (foreign->referenced_index && foreign->referenced_index->name != NULL) { - referenced_key_name = thd_make_lex_string( + f_key_info.referenced_key_name = thd_make_lex_string( thd, - f_key_info.referenced_key_name, + nullptr, foreign->referenced_index->name, strlen(foreign->referenced_index->name), 1); } else { - referenced_key_name = NULL; + f_key_info.referenced_key_name = NULL; } - f_key_info.referenced_key_name = referenced_key_name; - pf_key_info = (FOREIGN_KEY_INFO*) thd_memdup(thd, &f_key_info, sizeof(FOREIGN_KEY_INFO)); @@ -15674,15 +15706,17 @@ { /* Warning: since it is not sure that MariaDB calls external_lock() before calling this function, m_prebuilt->trx can be obsolete! */ - trx_t* trx = check_trx_exists(ha_thd()); + trx_t* trx; switch (operation) { case HA_EXTRA_FLUSH: + (void)check_trx_exists(ha_thd()); if (m_prebuilt->blob_heap) { row_mysql_prebuilt_free_blob_heap(m_prebuilt); } break; case HA_EXTRA_RESET_STATE: + trx = check_trx_exists(ha_thd()); reset_template(); trx->duplicates = 0; stmt_boundary: @@ -15691,18 +15725,23 @@ trx->bulk_insert = false; break; case HA_EXTRA_NO_KEYREAD: + (void)check_trx_exists(ha_thd()); m_prebuilt->read_just_key = 0; break; case HA_EXTRA_KEYREAD: + (void)check_trx_exists(ha_thd()); m_prebuilt->read_just_key = 1; break; case HA_EXTRA_KEYREAD_PRESERVE_FIELDS: + (void)check_trx_exists(ha_thd()); m_prebuilt->keep_other_fields_on_keyread = 1; break; case HA_EXTRA_INSERT_WITH_UPDATE: + trx = check_trx_exists(ha_thd()); trx->duplicates |= TRX_DUP_IGNORE; goto stmt_boundary; case HA_EXTRA_NO_IGNORE_DUP_KEY: + trx = check_trx_exists(ha_thd()); trx->duplicates &= ~TRX_DUP_IGNORE; if (trx->is_bulk_insert()) { /* Allow a subsequent INSERT into an empty table @@ -15714,9 +15753,11 @@ } goto stmt_boundary; case HA_EXTRA_WRITE_CAN_REPLACE: + trx = check_trx_exists(ha_thd()); trx->duplicates |= TRX_DUP_REPLACE; goto stmt_boundary; case HA_EXTRA_WRITE_CANNOT_REPLACE: + trx = check_trx_exists(ha_thd()); trx->duplicates &= ~TRX_DUP_REPLACE; if (trx->is_bulk_insert()) { /* Allow a subsequent INSERT into an empty table @@ -15725,6 +15766,7 @@ } goto stmt_boundary; case HA_EXTRA_BEGIN_ALTER_COPY: + trx = check_trx_exists(ha_thd()); m_prebuilt->table->skip_alter_undo = 1; if (m_prebuilt->table->is_temporary() || !m_prebuilt->table->versioned_by_id()) { @@ -15737,8 +15779,30 @@ .first->second.set_versioned(0); break; case HA_EXTRA_END_ALTER_COPY: + trx = check_trx_exists(ha_thd()); + if (m_prebuilt->table->skip_alter_undo) { + if (dberr_t err= trx->bulk_insert_apply()) { + m_prebuilt->table->skip_alter_undo = 0; + return convert_error_code_to_mysql( + err, + m_prebuilt->table->flags, + trx->mysql_thd); + } + + trx->end_bulk_insert(*m_prebuilt->table); + trx->bulk_insert = false; + /* During copy alter operation, InnoDB + updates the stats only for non-persistent + tables. */ + if (!dict_stats_is_persistent_enabled( + m_prebuilt->table)) { + dict_stats_update_if_needed( + m_prebuilt->table, *trx); + } + } m_prebuilt->table->skip_alter_undo = 0; - if (!m_prebuilt->table->is_temporary()) { + if (!m_prebuilt->table->is_temporary() + && !high_level_read_only) { log_buffer_flush_to_disk(); } break; @@ -15819,7 +15883,7 @@ } /* fall through */ default: - trx->end_bulk_insert(*m_prebuilt->table); + trx->bulk_insert_apply_for_table(m_prebuilt->table); if (!trx->bulk_insert) { break; } @@ -16013,7 +16077,7 @@ } /* fall through */ default: - trx->end_bulk_insert(*m_prebuilt->table); + trx->bulk_insert_apply_for_table(m_prebuilt->table); if (!trx->bulk_insert) { break; } @@ -16383,7 +16447,7 @@ if (lock_type != TL_IGNORE && trx->n_mysql_tables_in_use == 0) { trx->isolation_level = innobase_map_isolation_level( - (enum_tx_isolation) thd_tx_isolation(thd)); + (enum_tx_isolation) thd_tx_isolation(thd)) & 3; if (trx->isolation_level <= TRX_ISO_READ_COMMITTED) { @@ -16613,6 +16677,13 @@ if (error != DB_SUCCESS) { *first_value = (~(ulonglong) 0); + /* This is an error case. We do the error handling by calling + the error code conversion function. Specifically, we need to + call thd_mark_transaction_to_rollback() to inform sql that we + have rolled back innodb transaction after a deadlock error. We + ignore the returned mysql error code here. */ + std::ignore = convert_error_code_to_mysql( + error, m_prebuilt->table->flags, m_user_thd); return; } @@ -17548,6 +17619,7 @@ { mtr_t mtr; uint space_id = *static_cast(save); + srv_fil_make_page_dirty_debug= space_id; mysql_mutex_unlock(&LOCK_global_system_variables); fil_space_t* space = fil_space_t::get(space_id); @@ -18247,12 +18319,27 @@ = DICT_INDEX_MERGE_THRESHOLD_DEFAULT; /** Force an InnoDB log checkpoint. */ +/** Force an InnoDB log checkpoint. */ static void -checkpoint_now_set(THD*, st_mysql_sys_var*, void*, const void *save) +checkpoint_now_set(THD* thd, st_mysql_sys_var*, void*, const void *save) { if (!*static_cast(save)) return; + + if (srv_read_only_mode) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_UNSUPPORTED, + "InnoDB doesn't force checkpoint " + "when %s", + (srv_force_recovery + == SRV_FORCE_NO_LOG_REDO) + ? "innodb-force-recovery=6." + : "innodb-read-only=1."); + return; + } + const auto size= log_sys.is_encrypted() ? SIZE_OF_FILE_CHECKPOINT + 8 : SIZE_OF_FILE_CHECKPOINT; mysql_mutex_unlock(&LOCK_global_system_variables); @@ -18270,11 +18357,20 @@ void buf_flush_list_now_set(THD*, st_mysql_sys_var*, void*, const void* save) { - if (*(my_bool*) save) { - mysql_mutex_unlock(&LOCK_global_system_variables); - buf_flush_sync(); - mysql_mutex_lock(&LOCK_global_system_variables); - } + if (!*(my_bool*) save) + return; + const uint s= srv_fil_make_page_dirty_debug; + mysql_mutex_unlock(&LOCK_global_system_variables); + if (s == 0 || srv_is_undo_tablespace(s)) + { + fil_space_t *space= fil_system.sys_space; + if (s) { space= fil_space_get(s); } + while (buf_flush_list_space(space, nullptr)); + os_aio_wait_until_no_pending_writes(true); + } + else + buf_flush_sync(); + mysql_mutex_lock(&LOCK_global_system_variables); } /** Override current MERGE_THRESHOLD setting for all indexes at dictionary @@ -18458,7 +18554,7 @@ const bool in_progress(buf_pool.get_oldest_modification(LSN_MAX) < log_sys.resize_in_progress()); if (in_progress) - my_cond_timedwait(&buf_pool.do_flush_list, + my_cond_timedwait(&buf_pool.done_flush_list, &buf_pool.flush_list_mutex.m_mutex, &abstime); mysql_mutex_unlock(&buf_pool.flush_list_mutex); if (!log_sys.resize_in_progress()) @@ -18469,6 +18565,15 @@ mysql_mutex_lock(&LOCK_global_system_variables); } +static void innodb_log_spin_wait_delay_update(THD *, st_mysql_sys_var*, + void *, const void *save) +{ + log_sys.latch.wr_lock(SRW_LOCK_CALL); + mtr_t::spin_wait_delay= *static_cast(save); + mtr_t::finisher_update(); + log_sys.latch.wr_unlock(); +} + /** Update innodb_status_output or innodb_status_output_locks, which control InnoDB "status monitor" output to the error log. @param[out] var current value @@ -18637,6 +18742,25 @@ wsrep_thd_UNLOCK(vthd); wsrep_thd_kill_UNLOCK(vthd); } + +#ifdef ENABLED_DEBUG_SYNC + DBUG_EXECUTE_IF( + "wsrep_after_kill", + {const char act[]= + "now " + "SIGNAL wsrep_after_kill_reached " + "WAIT_FOR wsrep_after_kill_continue"; + DBUG_ASSERT(!debug_sync_set_action(bf_thd, STRING_WITH_LEN(act))); + };); + DBUG_EXECUTE_IF( + "wsrep_after_kill_2", + {const char act2[]= + "now " + "SIGNAL wsrep_after_kill_reached_2 " + "WAIT_FOR wsrep_after_kill_continue_2"; + DBUG_ASSERT(!debug_sync_set_action(bf_thd, STRING_WITH_LEN(act2))); + };); +#endif /* ENABLED_DEBUG_SYNC*/ } /** This function forces the victim transaction to abort. Aborting the @@ -19285,10 +19409,10 @@ NULL, NULL, UNIV_PAGE_SIZE_DEF, UNIV_PAGE_SIZE_MIN, UNIV_PAGE_SIZE_MAX, 0); -static MYSQL_SYSVAR_SIZE_T(log_buffer_size, log_sys.buf_size, +static MYSQL_SYSVAR_UINT(log_buffer_size, log_sys.buf_size, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, "Redo log buffer size in bytes.", - NULL, NULL, 16U << 20, 2U << 20, SIZE_T_MAX, 4096); + NULL, NULL, 16U << 20, 2U << 20, log_sys.buf_size_max, 4096); #if defined __linux__ || defined _WIN32 static MYSQL_SYSVAR_BOOL(log_file_buffering, log_sys.log_buffered, @@ -19303,6 +19427,12 @@ nullptr, innodb_log_file_size_update, 96 << 20, 4 << 20, std::numeric_limits::max(), 4096); +static MYSQL_SYSVAR_UINT(log_spin_wait_delay, mtr_t::spin_wait_delay, + PLUGIN_VAR_OPCMDARG, + "Delay between log buffer spin lock polls (0 to use a blocking latch)", + nullptr, innodb_log_spin_wait_delay_update, + 0, 0, 6000, 0); + static MYSQL_SYSVAR_UINT(old_blocks_pct, innobase_old_blocks_pct, PLUGIN_VAR_RQCMDARG, "Percentage of the buffer pool to reserve for 'old' blocks.", @@ -19368,8 +19498,10 @@ 10 << 20, 10 << 20, 1ULL << (32 + UNIV_PAGE_SIZE_SHIFT_MAX), 0); +static ulong innodb_purge_rseg_truncate_frequency; + static MYSQL_SYSVAR_ULONG(purge_rseg_truncate_frequency, - srv_purge_rseg_truncate_frequency, + innodb_purge_rseg_truncate_frequency, PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_DEPRECATED, "Deprecated parameter with no effect", NULL, NULL, 128, 1, 128, 0); @@ -19620,6 +19752,10 @@ "Do not allow creating a table without primary key (off by default)", NULL, NULL, FALSE); +static MYSQL_SYSVAR_BOOL(alter_copy_bulk, innodb_alter_copy_bulk, + PLUGIN_VAR_NOCMDARG, + "Allow bulk insert operation for copy alter operation", NULL, NULL, TRUE); + const char *page_compression_algorithms[]= { "none", "zlib", "lz4", "lzo", "lzma", "bzip2", "snappy", 0 }; static TYPELIB page_compression_algorithms_typelib= { @@ -19760,6 +19896,8 @@ MYSQL_SYSVAR(log_file_buffering), #endif MYSQL_SYSVAR(log_file_size), + MYSQL_SYSVAR(log_write_ahead_size), + MYSQL_SYSVAR(log_spin_wait_delay), MYSQL_SYSVAR(log_group_home_dir), MYSQL_SYSVAR(max_dirty_pages_pct), MYSQL_SYSVAR(max_dirty_pages_pct_lwm), @@ -19780,6 +19918,7 @@ MYSQL_SYSVAR(ft_server_stopword_table), MYSQL_SYSVAR(ft_user_stopword_table), MYSQL_SYSVAR(disable_sort_file_cache), + MYSQL_SYSVAR(snapshot_isolation), MYSQL_SYSVAR(stats_on_metadata), MYSQL_SYSVAR(stats_transient_sample_pages), MYSQL_SYSVAR(stats_persistent), @@ -19852,6 +19991,7 @@ MYSQL_SYSVAR(saved_page_number_debug), #endif /* UNIV_DEBUG */ MYSQL_SYSVAR(force_primary_key), + MYSQL_SYSVAR(alter_copy_bulk), MYSQL_SYSVAR(fatal_semaphore_wait_threshold), /* Table page compression feature */ MYSQL_SYSVAR(compression_default), @@ -19918,20 +20058,32 @@ i_s_innodb_tablespaces_encryption maria_declare_plugin_end; -/** @brief Adjust some InnoDB startup parameters based on file contents -or innodb_page_size. */ -static -void -innodb_params_adjust() +/** Adjust some InnoDB startup parameters based on the data directory */ +static void innodb_params_adjust() { - MYSQL_SYSVAR_NAME(max_undo_log_size).max_val - = 1ULL << (32U + srv_page_size_shift); - MYSQL_SYSVAR_NAME(max_undo_log_size).min_val - = MYSQL_SYSVAR_NAME(max_undo_log_size).def_val - = ulonglong(SRV_UNDO_TABLESPACE_SIZE_IN_PAGES) - << srv_page_size_shift; - MYSQL_SYSVAR_NAME(max_undo_log_size).max_val - = 1ULL << (32U + srv_page_size_shift); + MYSQL_SYSVAR_NAME(max_undo_log_size).max_val= + 1ULL << (32U + srv_page_size_shift); + MYSQL_SYSVAR_NAME(max_undo_log_size).min_val= + MYSQL_SYSVAR_NAME(max_undo_log_size).def_val= + ulonglong{SRV_UNDO_TABLESPACE_SIZE_IN_PAGES} << srv_page_size_shift; + MYSQL_SYSVAR_NAME(max_undo_log_size).max_val= + 1ULL << (32U + srv_page_size_shift); +#if 0 /* FIXME: INFORMATION_SCHEMA.SYSTEM_VARIABLES won't reflect this. */ + /* plugin_opt_set_limits() would have copied all MYSQL_SYSVAR + before innodb_init() was invoked. Therefore, changing the + min_val, def_val, max_val will have no observable effect. */ +# if defined __linux__ || defined _WIN32 + uint &min_val= MYSQL_SYSVAR_NAME(log_write_ahead_size).min_val; + if (min_val < log_sys.write_size) + { + min_val= log_sys.write_size; + MYSQL_SYSVAR_NAME(log_write_ahead_size).def_val= log_sys.write_size; + } +# endif + ut_ad(MYSQL_SYSVAR_NAME(log_write_ahead_size).min_val <= + log_sys.write_size); +#endif + ut_ad(MYSQL_SYSVAR_NAME(log_write_ahead_size).max_val == 4096); } /**************************************************************************** @@ -20606,6 +20758,10 @@ if (old_part.length >= new_part.length) return Compare_keys::NotEqual; + if (old_part.length == old_field.key_length() && + new_part.length != new_field.length) + return Compare_keys::NotEqual; + return Compare_keys::EqualButKeyPartLength; } diff -Nru mariadb-10.11.6/storage/innobase/handler/ha_innodb.h mariadb-10.11.9/storage/innobase/handler/ha_innodb.h --- mariadb-10.11.6/storage/innobase/handler/ha_innodb.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/handler/ha_innodb.h 2024-08-03 07:29:59.000000000 +0000 @@ -209,6 +209,7 @@ int rename_table(const char* from, const char* to) override; inline int defragment_table(); int check(THD* thd, HA_CHECK_OPT* check_opt) override; + int check_for_upgrade(HA_CHECK_OPT* check_opt) override; inline void reload_statistics(); @@ -879,15 +880,13 @@ @param[in] ib_table InnoDB dict_table_t @param[in,out] s_templ InnoDB template structure @param[in] add_v new virtual columns added along with - add index call -@param[in] locked true if innobase_share_mutex is held */ + add index call */ void innobase_build_v_templ( const TABLE* table, const dict_table_t* ib_table, dict_vcol_templ_t* s_templ, - const dict_add_v_col_t* add_v, - bool locked); + const dict_add_v_col_t* add_v = nullptr); /** callback used by MySQL server layer to initialized the table virtual columns' template @@ -909,6 +908,12 @@ innodb_col_no(const Field* field) MY_ATTRIBUTE((nonnull, warn_unused_result)); +/** Get the maximum integer value of a numeric column. +@param field column definition +@return maximum allowed integer value */ +ulonglong innobase_get_int_col_max_value(const Field *field) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + /********************************************************************//** Helper function to push frm mismatch error to error log and if needed to sql-layer. */ diff -Nru mariadb-10.11.6/storage/innobase/handler/handler0alter.cc mariadb-10.11.9/storage/innobase/handler/handler0alter.cc --- mariadb-10.11.6/storage/innobase/handler/handler0alter.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/handler/handler0alter.cc 2024-08-03 07:29:59.000000000 +0000 @@ -374,10 +374,12 @@ } } - /* In case of discarded tablespace, InnoDB can't - read the root page. So assign the null bytes based - on nullabled fields */ - if (!oindex.table->space) { + /* Discard tablespace doesn't remove the instantness + from the table definition. if n_core_null_bytes wasn't + initialized then assign it based on nullable fields */ + if (!oindex.table->space + && oindex.n_core_null_bytes + == dict_index_t::NO_CORE_NULL_BYTES) { oindex.n_core_null_bytes = static_cast( UT_BITS_IN_BYTES(unsigned(oindex.n_nullable))); } @@ -845,14 +847,13 @@ } } -/* Report an InnoDB error to the client by invoking my_error(). */ -static ATTRIBUTE_COLD __attribute__((nonnull)) +/* Report an InnoDB error to the client by invoking my_error(). +@param error InnoDB error code +@param table table name +@param flags table flags */ +ATTRIBUTE_COLD __attribute__((nonnull)) void -my_error_innodb( -/*============*/ - dberr_t error, /*!< in: InnoDB error code */ - const char* table, /*!< in: table name */ - ulint flags) /*!< in: table flags */ +my_error_innodb(dberr_t error, const char *table, ulint flags) { switch (error) { case DB_MISSING_HISTORY: @@ -864,6 +865,9 @@ case DB_DEADLOCK: my_error(ER_LOCK_DEADLOCK, MYF(0)); break; + case DB_RECORD_CHANGED: + my_error(ER_CHECKREAD, MYF(0), table); + break; case DB_LOCK_WAIT_TIMEOUT: my_error(ER_LOCK_WAIT_TIMEOUT, MYF(0)); break; @@ -1165,7 +1169,7 @@ trx_start_for_ddl(trx); } - ~ha_innobase_inplace_ctx() + ~ha_innobase_inplace_ctx() override { UT_DELETE(m_stage); if (instant_table) { @@ -1274,7 +1278,7 @@ /** Share context between partitions. @param[in] ctx context from another partition of the table */ - void set_shared_data(const inplace_alter_handler_ctx& ctx) + void set_shared_data(const inplace_alter_handler_ctx& ctx) override { if (add_autoinc != ULINT_UNDEFINED) { const ha_innobase_inplace_ctx& ha_ctx = @@ -1458,11 +1462,6 @@ } }; -/********************************************************************//** -Get the upper limit of the MySQL integral and floating-point type. -@return maximum allowed value for the field */ -ulonglong innobase_get_int_col_max_value(const Field *field); - /** Determine if fulltext indexes exist in a given table. @param table MySQL table @return number of fulltext indexes */ @@ -1730,11 +1729,9 @@ ut_ad(!is_null || nullable); n_nullable += nullable; n_add++; - uint l; + uint l = (*af)->pack_length(); switch ((*af)->type()) { case MYSQL_TYPE_VARCHAR: - l = reinterpret_cast - (*af)->get_length(); variable_length: if (l >= min_local_len) { max_size += blob_prefix @@ -1748,7 +1745,6 @@ if (!is_null) { min_size += l; } - l = (*af)->pack_length(); max_size += l; lenlen += l > 255 ? 2 : 1; } @@ -1762,7 +1758,6 @@ ((*af))->get_length(); goto variable_length; default: - l = (*af)->pack_length(); if (l > 255 && ib_table.not_redundant()) { goto variable_length; } @@ -2317,12 +2312,16 @@ } } + bool need_rebuild = false; + switch (ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE) { case ALTER_OPTIONS: - if (alter_options_need_rebuild(ha_alter_info, table)) { + if ((srv_file_per_table && !m_prebuilt->table->space_id) + || alter_options_need_rebuild(ha_alter_info, table)) { reason_rebuild = my_get_err_msg( ER_ALTER_OPERATION_TABLE_OPTIONS_NEED_REBUILD); ha_alter_info->unsupported_reason = reason_rebuild; + need_rebuild= true; break; } /* fall through */ @@ -2434,7 +2433,7 @@ /* We should be able to do the operation in-place. See if we can do it online (LOCK=NONE) or without rebuild. */ - bool online = true, need_rebuild = false; + bool online = true; const uint fulltext_indexes = innobase_fulltext_exist(altered_table); /* Fix the key parts. */ @@ -2744,6 +2743,9 @@ online = false; } + static constexpr const char *not_implemented + = "Not implemented for system-versioned operations"; + if (ha_alter_info->handler_flags & ALTER_ADD_NON_UNIQUE_NON_PRIM_INDEX) { /* ADD FULLTEXT|SPATIAL INDEX requires a lock. @@ -2771,6 +2773,12 @@ goto cannot_create_many_fulltext_index; } + if (altered_table->versioned()) { + ha_alter_info->unsupported_reason + = not_implemented; + DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); + } + add_fulltext = true; if (ha_alter_info->online && !ha_alter_info->unsupported_reason) { @@ -2807,12 +2815,18 @@ } } + if (m_prebuilt->table->is_stats_table()) { + if (ha_alter_info->online) { + ha_alter_info->unsupported_reason = + table_share->table_name.str; + } + online= false; + } + // FIXME: implement Online DDL for system-versioned operations if (ha_alter_info->handler_flags & INNOBASE_ALTER_VERSIONED_REBUILD) { - if (ha_alter_info->online) { - ha_alter_info->unsupported_reason = - "Not implemented for system-versioned operations"; + ha_alter_info->unsupported_reason = not_implemented; } online = false; @@ -4338,7 +4352,8 @@ row_mysql_unlock_data_dictionary(trx); for (pfs_os_file_t d : deleted) os_file_close(d); - log_write_up_to(trx->commit_lsn, true); + if (trx->commit_lsn) + log_write_up_to(trx->commit_lsn, true); } /** Commit a DDL transaction and unlink any deleted files. */ @@ -4681,11 +4696,13 @@ col_map[old_i - num_old_v] = i; if (!old_table->versioned() || !altered_table->versioned()) { - } else if (old_i == old_table->vers_start) { - new_table->vers_start = (i + num_v) + } else if (old_i - num_old_v == old_table->vers_start) { + ut_ad(field->vers_sys_start()); + new_table->vers_start = i & dict_index_t::MAX_N_FIELDS; - } else if (old_i == old_table->vers_end) { - new_table->vers_end = (i + num_v) + } else if (old_i - num_old_v == old_table->vers_end) { + ut_ad(field->vers_sys_end()); + new_table->vers_end = i & dict_index_t::MAX_N_FIELDS; } goto found_col; @@ -6217,24 +6234,20 @@ /* Convert the table to the instant ALTER TABLE format. */ mtr.commit(); mtr.start(); - index->set_modified(mtr); - if (buf_block_t* root = btr_root_block_get(index, RW_SX_LATCH, &mtr, + if (buf_block_t* root = btr_root_block_get(index, RW_S_LATCH, &mtr, &err)) { if (fil_page_get_type(root->page.frame) != FIL_PAGE_INDEX) { DBUG_ASSERT("wrong page type" == 0); err = DB_CORRUPTION; goto func_exit; } - - btr_set_instant(root, *index, &mtr); - mtr.commit(); - mtr.start(); - index->set_modified(mtr); - err = row_ins_clust_index_entry_low( - BTR_NO_LOCKING_FLAG, BTR_MODIFY_TREE, index, - index->n_uniq, entry, 0, thr); } + mtr.commit(); + mtr.start(); + err = row_ins_clust_index_entry_low( + BTR_NO_LOCKING_FLAG, BTR_MODIFY_TREE, index, + index->n_uniq, entry, 0, thr); goto func_exit; } @@ -6526,16 +6539,16 @@ acquiring an InnoDB table lock even for online operation, to ensure that the rollback of recovered transactions will not run concurrently with online ADD INDEX. */ - user_table->lock_mutex_lock(); + user_table->lock_shared_lock(); for (lock_t *lock = UT_LIST_GET_FIRST(user_table->locks); lock; lock = UT_LIST_GET_NEXT(un_member.tab_lock.locks, lock)) { if (lock->trx->is_recovered) { - user_table->lock_mutex_unlock(); + user_table->lock_shared_unlock(); goto acquire_lock; } } - user_table->lock_mutex_unlock(); + user_table->lock_shared_unlock(); } if (fts_exist) { @@ -7360,6 +7373,7 @@ ut_d(dict_table_check_for_dup_indexes(user_table, CHECK_PARTIAL_OK)); if (ctx->need_rebuild()) { + export_vars.innodb_bulk_operations++; ctx->new_table->acquire(); } @@ -7441,6 +7455,7 @@ row_mysql_lock_data_dictionary(ctx->trx); } else { row_merge_drop_indexes(ctx->trx, user_table, true); + user_table->indexes.start->online_log = nullptr; ctx->trx->commit(); } @@ -7775,6 +7790,7 @@ for (const auto &a : add_fk) { + if (!a->foreign_index) continue; for (ulint i= 0; i < a->n_fields; i++) { if (a->foreign_index->fields[i].col == col) @@ -8506,6 +8522,15 @@ DBUG_RETURN(true); } + if ((ha_alter_info->handler_flags & ALTER_OPTIONS) + && ctx->page_compression_level + && !ctx->old_table->not_redundant()) { + my_error(ER_ILLEGAL_HA_CREATE_OPTION, MYF(0), + table_type(), + "PAGE_COMPRESSED=1 ROW_FORMAT=REDUNDANT"); + DBUG_RETURN(true); + } + if (!(ha_alter_info->handler_flags & INNOBASE_ALTER_DATA) && alter_templ_needs_rebuild(altered_table, ha_alter_info, ctx->new_table) @@ -8774,10 +8799,11 @@ } s_templ = UT_NEW_NOKEY(dict_vcol_templ_t()); + ctx->new_table->lock_mutex_lock(); innobase_build_v_templ( - altered_table, ctx->new_table, s_templ, NULL, false); - + altered_table, ctx->new_table, s_templ); ctx->new_table->vc_templ = s_templ; + ctx->new_table->lock_mutex_unlock(); } else if (ctx->num_to_add_vcol > 0 && ctx->num_to_drop_vcol == 0) { /* if there is ongoing drop virtual column, then we disallow inplace add index on newly added virtual column, so it does @@ -8792,10 +8818,12 @@ add_v->v_col = ctx->add_vcol; add_v->v_col_name = ctx->add_vcol_name; + ctx->new_table->lock_mutex_lock(); innobase_build_v_templ( - altered_table, ctx->new_table, s_templ, add_v, false); + altered_table, ctx->new_table, s_templ, add_v); old_templ = ctx->new_table->vc_templ; ctx->new_table->vc_templ = s_templ; + ctx->new_table->lock_mutex_unlock(); } /* Drop virtual column without rebuild will keep dict table @@ -9861,13 +9889,7 @@ const dict_col_t* autoinc_col = dict_table_get_nth_col(ctx->old_table, innodb_col_no(ai)); - dict_index_t* index - = dict_table_get_first_index(ctx->old_table); - while (index != NULL - && index->fields[0].col != autoinc_col) { - index = dict_table_get_next_index(index); - } - + auto index = ctx->old_table->get_index(*autoinc_col); ut_ad(index); ib_uint64_t max_in_table = index @@ -10242,6 +10264,7 @@ @param ctx In-place ALTER TABLE context @param altered_table MySQL table that is being altered @param old_table MySQL table as it is before the ALTER operation +@param statistics_exist whether to update InnoDB persistent statistics @param trx Data dictionary transaction @param table_name Table name in MySQL @retval true Failure @@ -10515,6 +10538,7 @@ @param ha_alter_info Data used during in-place alter @param ctx In-place ALTER TABLE context @param old_table MySQL table as it is before the ALTER operation +@param statistics_exist whether to update InnoDB persistent statistics @param trx Data dictionary transaction @param table_name Table name in MySQL @retval true Failure @@ -10528,6 +10552,7 @@ ha_innobase_inplace_ctx*ctx, TABLE* altered_table, const TABLE* old_table, + bool statistics_exist, trx_t* trx, const char* table_name) { @@ -10642,6 +10667,10 @@ goto handle_error; } + if (!statistics_exist) { + continue; + } + error = dict_stats_delete_from_index_stats(db, table, index->name, trx); switch (error) { @@ -10653,7 +10682,8 @@ } } - if (const size_t size = ha_alter_info->rename_keys.size()) { + if (!statistics_exist) { + } else if (const size_t size = ha_alter_info->rename_keys.size()) { char tmp_name[5]; char db[MAX_DB_UTF8_LEN], table[MAX_TABLE_UTF8_LEN]; @@ -11070,11 +11100,10 @@ if (ctx->new_table->n_v_cols > 0) { s_templ = UT_NEW_NOKEY( dict_vcol_templ_t()); - s_templ->vtempl = NULL; - - innobase_build_v_templ(altered_table, ctx->new_table, s_templ, - NULL, true); + ctx->new_table->lock_mutex_lock(); + innobase_build_v_templ(altered_table, ctx->new_table, s_templ); ctx->new_table->vc_templ = s_templ; + ctx->new_table->lock_mutex_unlock(); } dberr_t error = row_log_table_apply( @@ -11220,16 +11249,7 @@ fts_optimize_remove_table(ctx->old_table); } - dict_sys.freeze(SRW_LOCK_CALL); - for (auto f : ctx->old_table->referenced_set) { - if (dict_table_t* child = f->foreign_table) { - error = lock_table_for_trx(child, trx, LOCK_X); - if (error != DB_SUCCESS) { - break; - } - } - } - dict_sys.unfreeze(); + error = lock_table_children(ctx->old_table, trx); if (ctx->new_table->fts) { ut_ad(!ctx->new_table->fts->add_wq); @@ -11409,6 +11429,8 @@ } } + DEBUG_SYNC(m_user_thd, "innodb_commit_inplace_before_lock"); + DBUG_EXECUTE_IF("stats_lock_fail", error = DB_LOCK_WAIT_TIMEOUT; trx_rollback_for_mysql(trx);); @@ -11492,7 +11514,9 @@ goto fail; } } else if (commit_try_norebuild(ha_alter_info, ctx, - altered_table, table, trx, + altered_table, table, + table_stats && index_stats, + trx, table_share->table_name.str)) { goto fail; } @@ -11666,7 +11690,6 @@ } unlock_and_close_files(deleted, trx); - log_write_up_to(trx->commit_lsn, true); DBUG_EXECUTE_IF("innodb_alter_commit_crash_after_commit", DBUG_SUICIDE();); trx->free(); @@ -11723,7 +11746,6 @@ } unlock_and_close_files(deleted, trx); - log_write_up_to(trx->commit_lsn, true); DBUG_EXECUTE_IF("innodb_alter_commit_crash_after_commit", DBUG_SUICIDE();); trx->free(); diff -Nru mariadb-10.11.6/storage/innobase/handler/i_s.cc mariadb-10.11.9/storage/innobase/handler/i_s.cc --- mariadb-10.11.6/storage/innobase/handler/i_s.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/handler/i_s.cc 2024-08-03 07:29:59.000000000 +0000 @@ -4539,6 +4539,15 @@ DBUG_RETURN(0); } +/** Handle the error for information schema query +@param err error value +@param thd thread +@return 0 if query is interrupted or error */ +static int i_s_sys_error_handling(int err, THD *thd) +{ + return thd_kill_level(thd) ? 0 : err; +} + /** Convert one SYS_TABLES record to dict_table_t. @param pcur persistent cursor position on SYS_TABLES record @param mtr mini-transaction (nullptr=use the dict_sys cache) @@ -4587,6 +4596,7 @@ { btr_pcur_t pcur; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_tables_fill_table"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -4616,8 +4626,15 @@ dict_sys.unlock(); if (!err_msg) { - i_s_dict_fill_sys_tables(thd, table_rec, - tables->table); + err = i_s_dict_fill_sys_tables( + thd, table_rec, tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + if (table_rec) { + dict_mem_table_free(table_rec); + } + goto func_exit; + } } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_CANT_FIND_SYSTEM_REC, "%s", @@ -4635,8 +4652,10 @@ mtr.commit(); dict_sys.unlock(); +func_exit: + ut_free(pcur.old_rec_buf); - DBUG_RETURN(0); + DBUG_RETURN(err); } /*******************************************************************//** @@ -4750,9 +4769,9 @@ Field **fields= table_to_fill->field; { - table->stats_mutex_lock(); + table->stats_shared_lock(); auto _ = make_scope_exit([table]() { - table->stats_mutex_unlock(); dict_sys.unlock(); }); + table->stats_shared_unlock(); dict_sys.unlock(); }); OK(fields[SYS_TABLESTATS_ID]->store(longlong(table->id), TRUE)); @@ -4807,6 +4826,7 @@ btr_pcur_t pcur; const rec_t* rec; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_tables_fill_table_stats"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -4832,8 +4852,12 @@ &table_rec); if (UNIV_LIKELY(!err_msg)) { - i_s_dict_fill_sys_tablestats(thd, table_rec, + err = i_s_dict_fill_sys_tablestats(thd, table_rec, tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + goto func_exit; + } } else { ut_ad(!table_rec); dict_sys.unlock(); @@ -4851,8 +4875,9 @@ mtr.commit(); dict_sys.unlock(); - - DBUG_RETURN(0); +func_exit: + ut_free(pcur.old_rec_buf); + DBUG_RETURN(err); } /*******************************************************************//** @@ -5024,6 +5049,7 @@ const rec_t* rec; mem_heap_t* heap; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_indexes_fill_table"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -5059,11 +5085,13 @@ dict_sys.unlock(); if (!err_msg) { - if (int err = i_s_dict_fill_sys_indexes( - thd, table_id, space_id, &index_rec, - tables->table)) { - mem_heap_free(heap); - DBUG_RETURN(err); + err = i_s_dict_fill_sys_indexes( + thd, table_id, space_id, + &index_rec, + tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + goto func_exit; } } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, @@ -5081,9 +5109,11 @@ mtr.commit(); dict_sys.unlock(); +func_exit: mem_heap_free(heap); + ut_free(pcur.old_rec_buf); - DBUG_RETURN(0); + DBUG_RETURN(err); } /*******************************************************************//** Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_indexes @@ -5232,6 +5262,7 @@ const char* col_name; mem_heap_t* heap; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_columns_fill_table"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -5263,9 +5294,14 @@ dict_sys.unlock(); if (!err_msg) { - i_s_dict_fill_sys_columns(thd, table_id, col_name, - &column_rec, nth_v_col, - tables->table); + err = i_s_dict_fill_sys_columns( + thd, table_id, col_name, + &column_rec, nth_v_col, + tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + goto func_exit; + } } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_CANT_FIND_SYSTEM_REC, "%s", @@ -5282,9 +5318,11 @@ mtr.commit(); dict_sys.unlock(); +func_exit: mem_heap_free(heap); + ut_free(pcur.old_rec_buf); - DBUG_RETURN(0); + DBUG_RETURN(err); } /*******************************************************************//** @@ -5416,6 +5454,7 @@ ulint pos; ulint base_pos; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_virtual_fill_table"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -5444,8 +5483,13 @@ dict_sys.unlock(); if (!err_msg) { - i_s_dict_fill_sys_virtual(thd, table_id, pos, base_pos, - tables->table); + err = i_s_dict_fill_sys_virtual( + thd, table_id, pos, base_pos, + tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + goto func_exit; + } } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_CANT_FIND_SYSTEM_REC, "%s", @@ -5462,6 +5506,9 @@ dict_sys.unlock(); DBUG_RETURN(0); +func_exit: + ut_free(pcur.old_rec_buf); + DBUG_RETURN(err); } /** Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_virtual @@ -5589,6 +5636,7 @@ mem_heap_t* heap; index_id_t last_id; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_fields_fill_table"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -5624,8 +5672,13 @@ dict_sys.unlock(); if (!err_msg) { - i_s_dict_fill_sys_fields(thd, index_id, &field_rec, - pos, tables->table); + err = i_s_dict_fill_sys_fields( + thd, index_id, &field_rec, + pos, tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + goto func_exit; + } last_id = index_id; } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, @@ -5643,9 +5696,11 @@ mtr.commit(); dict_sys.unlock(); +func_exit: mem_heap_free(heap); + ut_free(pcur.old_rec_buf); - DBUG_RETURN(0); + DBUG_RETURN(err); } /*******************************************************************//** Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_fields @@ -5782,6 +5837,7 @@ const rec_t* rec; mem_heap_t* heap; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_foreign_fill_table"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -5809,8 +5865,12 @@ dict_sys.unlock(); if (!err_msg) { - i_s_dict_fill_sys_foreign(thd, &foreign_rec, - tables->table); + err = i_s_dict_fill_sys_foreign( + thd, &foreign_rec, tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + goto func_exit; + } } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_CANT_FIND_SYSTEM_REC, "%s", @@ -5827,9 +5887,11 @@ mtr.commit(); dict_sys.unlock(); +func_exit: mem_heap_free(heap); + ut_free(pcur.old_rec_buf); - DBUG_RETURN(0); + DBUG_RETURN(err); } /*******************************************************************//** @@ -5963,6 +6025,7 @@ const rec_t* rec; mem_heap_t* heap; mtr_t mtr; + int err = 0; DBUG_ENTER("i_s_sys_foreign_cols_fill_table"); RETURN_IF_INNODB_NOT_STARTED(tables->schema_table_name.str); @@ -5994,9 +6057,13 @@ dict_sys.unlock(); if (!err_msg) { - i_s_dict_fill_sys_foreign_cols( - thd, name, for_col_name, ref_col_name, pos, - tables->table); + err = i_s_dict_fill_sys_foreign_cols( + thd, name, for_col_name, + ref_col_name, pos, tables->table); + if (err) { + err = i_s_sys_error_handling(err, thd); + goto func_exit; + } } else { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_CANT_FIND_SYSTEM_REC, "%s", @@ -6013,9 +6080,11 @@ mtr.commit(); dict_sys.unlock(); +func_exit: mem_heap_free(heap); + ut_free(pcur.old_rec_buf); - DBUG_RETURN(0); + DBUG_RETURN(err); } /*******************************************************************//** Bind the dynamic table INFORMATION_SCHEMA.innodb_sys_foreign_cols @@ -6218,6 +6287,8 @@ mysql_mutex_unlock(&fil_system.mutex); if (err == DB_SUCCESS) err= i_s_sys_tablespaces_fill(thd, *fil_system.temp_space, tables->table); + else + err = i_s_sys_error_handling(err, thd); DBUG_RETURN(err); } diff -Nru mariadb-10.11.6/storage/innobase/ibuf/ibuf0ibuf.cc mariadb-10.11.9/storage/innobase/ibuf/ibuf0ibuf.cc --- mariadb-10.11.6/storage/innobase/ibuf/ibuf0ibuf.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/ibuf/ibuf0ibuf.cc 2024-08-03 07:29:59.000000000 +0000 @@ -24,6 +24,7 @@ Created 7/19/1997 Heikki Tuuri *******************************************************/ +#include #include "ibuf0ibuf.h" #include "btr0sea.h" @@ -309,8 +310,13 @@ buf_block_t* block = buf_page_get( page_id_t(IBUF_SPACE_ID, FSP_IBUF_HEADER_PAGE_NO), 0, RW_X_LATCH, mtr); + if (UNIV_UNLIKELY(!block)) { + return nullptr; + } + + buf_page_make_young_if_needed(&block->page); - return block ? block->page.frame : nullptr; + return block->page.frame; } /** Acquire the change buffer root page. @@ -326,7 +332,12 @@ buf_block_t *block= buf_page_get_gen(page_id_t{IBUF_SPACE_ID, FSP_IBUF_TREE_ROOT_PAGE_NO}, 0, RW_SX_LATCH, nullptr, BUF_GET, mtr, err); - ut_ad(!block || ibuf.empty == page_is_empty(block->page.frame)); + if (block) + { + ut_ad(ibuf.empty == page_is_empty(block->page.frame)); + buf_page_make_young_if_needed(&block->page); + } + return block; } @@ -408,7 +419,8 @@ + header_page->page.frame, &ibuf.seg_size, &mtr); do { - DBUG_EXECUTE_IF("intermittent_read_failure", continue;); + IF_DBUG(if (_db_keyword_(nullptr, "intermittent_read_failure", + 1)) continue,); ut_ad(ibuf.seg_size >= 2); } while (0); @@ -1822,7 +1834,7 @@ err = flst_add_last(ibuf_root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, - &mtr); + fil_system.sys_space->free_limit, &mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) { goto corrupted; } @@ -1853,7 +1865,6 @@ static void ibuf_remove_free_page() { mtr_t mtr; - mtr_t mtr2; page_t* header_page; log_free_check(); @@ -1880,26 +1891,28 @@ return; } - ibuf_mtr_start(&mtr2); - - buf_block_t* root = ibuf_tree_root_get(&mtr2); + buf_block_t* root = ibuf_tree_root_get(&mtr); if (UNIV_UNLIKELY(!root)) { - ibuf_mtr_commit(&mtr2); goto early_exit; } - mysql_mutex_unlock(&ibuf_mutex); - + const auto root_savepoint = mtr.get_savepoint() - 1; const uint32_t page_no = flst_get_last(PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST + root->page.frame).page; + if (page_no >= fil_system.sys_space->free_limit) { + goto early_exit; + } + + mysql_mutex_unlock(&ibuf_mutex); + /* NOTE that we must release the latch on the ibuf tree root because in fseg_free_page we access level 1 pages, and the root is a level 2 page. */ - - ibuf_mtr_commit(&mtr2); + root->page.lock.u_unlock(); + mtr.lock_register(root_savepoint, MTR_MEMO_BUF_FIX); ibuf_exit(&mtr); /* Since pessimistic inserts were prevented, we know that the @@ -1922,15 +1935,7 @@ ibuf_enter(&mtr); mysql_mutex_lock(&ibuf_mutex); - - root = ibuf_tree_root_get(&mtr, &err); - if (UNIV_UNLIKELY(!root)) { - mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); - goto func_exit; - } - - ut_ad(page_no == flst_get_last(PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST - + root->page.frame).page); + mtr.upgrade_buffer_fix(root_savepoint, RW_X_LATCH); /* Remove the page from the free list and update the ibuf size data */ if (buf_block_t* block = @@ -1939,7 +1944,7 @@ err = flst_remove(root, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST_NODE, - &mtr); + fil_system.sys_space->free_limit, &mtr); } mysql_mutex_unlock(&ibuf_pessimistic_insert_mutex); @@ -2321,7 +2326,8 @@ /** Merge the change buffer to some pages. */ static void ibuf_read_merge_pages(const uint32_t* space_ids, - const uint32_t* page_nos, ulint n_stored) + const uint32_t* page_nos, ulint n_stored, + bool slow_shutdown_cleanup) { for (ulint i = 0; i < n_stored; i++) { const uint32_t space_id = space_ids[i]; @@ -2346,30 +2352,28 @@ if (UNIV_LIKELY(page_nos[i] < size)) { mtr.start(); dberr_t err; - buf_block_t *block = + /* Load the page and apply change buffers. */ + std::ignore = buf_page_get_gen(page_id_t(space_id, page_nos[i]), zip_size, RW_X_LATCH, nullptr, BUF_GET_POSSIBLY_FREED, &mtr, &err, true); - bool remove = !block - || fil_page_get_type(block->page.frame) - != FIL_PAGE_INDEX - || !page_is_leaf(block->page.frame); mtr.commit(); if (err == DB_TABLESPACE_DELETED) { s->x_unlock(); goto tablespace_deleted; } - if (!remove) { - s->x_unlock(); - continue; - } } s->x_unlock(); - if (srv_shutdown_state == SRV_SHUTDOWN_NONE - || srv_fast_shutdown) { + /* During slow shutdown cleanup, we apply all pending IBUF + changes and need to cleanup any left-over IBUF records. There + are a few cases when the changes are already discarded and IBUF + bitmap is cleaned but we miss to delete the record. Even after + the issues are fixed, we need to keep this safety measure for + upgraded DBs with such left over records. */ + if (!slow_shutdown_cleanup) { continue; } @@ -2440,7 +2444,7 @@ space_ids, page_nos, &n_pages); ibuf_mtr_commit(&mtr); - ibuf_read_merge_pages(space_ids, page_nos, n_pages); + ibuf_read_merge_pages(space_ids, page_nos, n_pages, true); return(sum_sizes + 1); } @@ -2521,7 +2525,7 @@ } #endif /* UNIV_DEBUG */ - ibuf_read_merge_pages(spaces, pages, n_pages); + ibuf_read_merge_pages(spaces, pages, n_pages, false); } return(n_pages); diff -Nru mariadb-10.11.6/storage/innobase/include/btr0btr.h mariadb-10.11.9/storage/innobase/include/btr0btr.h --- mariadb-10.11.6/storage/innobase/include/btr0btr.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/btr0btr.h 2024-08-03 07:29:59.000000000 +0000 @@ -89,10 +89,12 @@ @param[in] merge whether change buffer merge should be attempted @param[in,out] mtr mini-transaction @param[out] err error code +@param[out] first set if this is a first-time access to the page @return block */ buf_block_t *btr_block_get(const dict_index_t &index, uint32_t page, rw_lock_type_t mode, bool merge, - mtr_t *mtr, dberr_t *err= nullptr); + mtr_t *mtr, dberr_t *err= nullptr, + bool *first= nullptr); /**************************************************************//** Gets the index id field of a page. @@ -187,13 +189,16 @@ /** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC, or fall back to MAX(auto_increment_column). -@param[in] table table containing an AUTO_INCREMENT column -@param[in] col_no index of the AUTO_INCREMENT column -@return the AUTO_INCREMENT value -@retval 0 on error or if no AUTO_INCREMENT value was used yet */ -ib_uint64_t -btr_read_autoinc_with_fallback(const dict_table_t* table, unsigned col_no) - MY_ATTRIBUTE((nonnull, warn_unused_result)); +@param table table containing an AUTO_INCREMENT column +@param col_no index of the AUTO_INCREMENT column +@param mysql_version TABLE_SHARE::mysql_version +@param max the maximum value of the AUTO_INCREMENT column +@return the AUTO_INCREMENT value +@retval 0 on error or if no AUTO_INCREMENT value was used yet */ +uint64_t btr_read_autoinc_with_fallback(const dict_table_t *table, + unsigned col_no, ulong mysql_version, + uint64_t max) + MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Write the next available AUTO_INCREMENT value to PAGE_ROOT_AUTO_INC. @param[in,out] index clustered index diff -Nru mariadb-10.11.6/storage/innobase/include/btr0pcur.h mariadb-10.11.9/storage/innobase/include/btr0pcur.h --- mariadb-10.11.6/storage/innobase/include/btr0pcur.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/btr0pcur.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,7 +28,6 @@ #include "dict0dict.h" #include "btr0cur.h" -#include "buf0block_hint.h" #include "btr0btr.h" #include "gis0rtree.h" @@ -332,8 +331,8 @@ /** BTR_PCUR_ON, BTR_PCUR_BEFORE, or BTR_PCUR_AFTER, depending on whether cursor was on, before, or after the old_rec record */ btr_pcur_pos_t rel_pos= btr_pcur_pos_t(0); - /** buffer block when the position was stored */ - buf::Block_hint block_when_stored; + /** the page identifier of old_rec */ + page_id_t old_page_id{0,0}; /** the modify clock value of the buffer block when the cursor position was stored */ ib_uint64_t modify_clock= 0; @@ -432,7 +431,8 @@ } /** Open a cursor on the first user record satisfying the search condition; -in case of no match, after the last index record. */ +in case of no match, after the last index record. +@return DB_SUCCESS or error code */ MY_ATTRIBUTE((nonnull, warn_unused_result)) inline dberr_t diff -Nru mariadb-10.11.6/storage/innobase/include/buf0block_hint.h mariadb-10.11.9/storage/innobase/include/buf0block_hint.h --- mariadb-10.11.6/storage/innobase/include/buf0block_hint.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/buf0block_hint.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2020, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2020, MariaDB Corporation. -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License, version 2.0, as published by the -Free Software Foundation. - -This program is also distributed with certain software (including but not -limited to OpenSSL) that is licensed under separate terms, as designated in a -particular file or component or in included license documentation. The authors -of MySQL hereby grant you an additional permission to link the program and -your derivative works with the separately licensed software that they have -included with MySQL. - -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, version 2.0, -for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -*****************************************************************************/ -#pragma once -#include "buf0buf.h" - -namespace buf { -class Block_hint { -public: - /** Stores the pointer to the block, which is currently buffer-fixed. - @param block a pointer to a buffer-fixed block to be stored */ - inline void store(buf_block_t *block) - { - ut_ad(block->page.buf_fix_count()); - m_block= block; - m_page_id= block->page.id(); - } - - /** Clears currently stored pointer. */ - inline void clear() { m_block= nullptr; } - - /** Invoke f on m_block(which may be null) - @param f The function to be executed. It will be passed the pointer. - If you wish to use the block pointer subsequently, - you need to ensure you buffer-fix it before returning from f. - @return the return value of f - */ - template - bool run_with_hint(const F &f) - { - buffer_fix_block_if_still_valid(); - /* m_block could be changed during f() call, so we use local - variable to remember which block we need to unfix */ - buf_block_t *block= m_block; - bool res= f(block); - if (block) - block->page.unfix(); - return res; - } - - buf_block_t *block() const { return m_block; } - - private: - /** The block pointer stored by store(). */ - buf_block_t *m_block= nullptr; - /** If m_block is non-null, the m_block->page.id at time it was stored. */ - page_id_t m_page_id{0, 0}; - - /** A helper function which checks if m_block is not a dangling pointer and - still points to block with page with m_page_id and if so, buffer-fixes it, - otherwise clear()s it */ - void buffer_fix_block_if_still_valid(); -}; -} // namespace buf diff -Nru mariadb-10.11.6/storage/innobase/include/buf0buf.h mariadb-10.11.9/storage/innobase/include/buf0buf.h --- mariadb-10.11.6/storage/innobase/include/buf0buf.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/buf0buf.h 2024-08-03 07:29:59.000000000 +0000 @@ -158,14 +158,25 @@ #define buf_page_get(ID, SIZE, LA, MTR) \ buf_page_get_gen(ID, SIZE, LA, NULL, BUF_GET, MTR) -/** Try to acquire a page latch. -@param rw_latch RW_S_LATCH or RW_X_LATCH +/** Try to buffer-fix a page. @param block guessed block +@param id expected block->page.id() +@return block if it was buffer-fixed +@retval nullptr if the block no longer is valid */ +buf_block_t *buf_page_optimistic_fix(buf_block_t *block, page_id_t id) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + +/** Try to acquire a page latch after buf_page_optimistic_fix(). +@param block buffer-fixed block +@param rw_latch RW_S_LATCH or RW_X_LATCH @param modify_clock expected value of block->modify_clock @param mtr mini-transaction -@return whether the latch was acquired (the page is an allocated file page) */ -bool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block, - uint64_t modify_clock, mtr_t *mtr); +@return block if the latch was acquired +@retval nullptr if block->unfix() was called because it no longer is valid */ +buf_block_t *buf_page_optimistic_get(buf_block_t *block, + rw_lock_type_t rw_latch, + uint64_t modify_clock, mtr_t *mtr) + MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Try to S-latch a page. Suitable for using when holding the lock_sys latches (as it avoids deadlock). @@ -198,6 +209,9 @@ @param[out] err DB_SUCCESS or error code @param[in] allow_ibuf_merge Allow change buffer merge while reading the pages from file. +@param[in,out] no_wait If not NULL on input, then we must not +wait for current page latch. On output, the value is set to true if we had to +return because we could not wait on page latch. @return pointer to the block or NULL */ buf_block_t* buf_page_get_gen( @@ -208,7 +222,8 @@ ulint mode, mtr_t* mtr, dberr_t* err = NULL, - bool allow_ibuf_merge = false) + bool allow_ibuf_merge = false, + bool* no_wait = nullptr) MY_ATTRIBUTE((nonnull(6), warn_unused_result)); /** This is the low level function used to get access to a database page. @@ -225,6 +240,11 @@ while reading the page from file then it makes sure that it does merging of change buffer changes while reading the page from file. +@param[in] holds_next_page_latch True if caller holds next page latch. +We must not wait for current page latch. +@param[in,out] no_wait If not NULL on input, then we must not +wait for current page latch. On output, the value is set to true if we had to +return because we could not wait on page latch. @return pointer to the block or NULL */ buf_block_t* buf_page_get_low( @@ -235,7 +255,8 @@ ulint mode, mtr_t* mtr, dberr_t* err, - bool allow_ibuf_merge); + bool allow_ibuf_merge, + bool* no_wait); /** Initialize a page in the buffer pool. The page is usually not read from a file even if it cannot be found in the buffer buf_pool. This is one @@ -262,8 +283,6 @@ buf_page_create_deferred(uint32_t space_id, ulint zip_size, mtr_t *mtr, buf_block_t *free_block); -/** Move a block to the start of the LRU list. */ -void buf_page_make_young(buf_page_t *bpage); /** Mark the page status as FREED for the given tablespace and page number. @param[in,out] space tablespace @param[in] page page number @@ -285,15 +304,6 @@ @return true if bpage should be made younger */ inline bool buf_page_peek_if_too_old(const buf_page_t *bpage); -/** Move a page to the start of the buffer pool LRU list if it is too old. -@param[in,out] bpage buffer pool page */ -inline void buf_page_make_young_if_needed(buf_page_t *bpage) -{ - if (UNIV_UNLIKELY(buf_page_peek_if_too_old(bpage))) { - buf_page_make_young(bpage); - } -} - /********************************************************************//** Increments the modify clock of a frame by 1. The caller must (1) own the buf_pool.mutex and block bufferfix count has to be zero, (2) or own an x-lock @@ -303,15 +313,6 @@ buf_block_modify_clock_inc( /*=======================*/ buf_block_t* block); /*!< in: block */ -/********************************************************************//** -Returns the value of the modify clock. The caller must have an s-lock -or x-lock on the block. -@return value */ -UNIV_INLINE -ib_uint64_t -buf_block_get_modify_clock( -/*=======================*/ - buf_block_t* block); /*!< in: block */ #endif /* !UNIV_INNOCHECKSUM */ /** Check if a buffer is all zeroes. @@ -656,12 +657,9 @@ access_time= 0; } - void set_os_unused() + void set_os_unused() const { MEM_NOACCESS(frame, srv_page_size); -#ifdef MADV_FREE - madvise(frame, srv_page_size, MADV_FREE); -#endif } void set_os_used() const @@ -785,17 +783,16 @@ @retval DB_FAIL if the page contains the wrong ID */ dberr_t read_complete(const fil_node_t &node); - /** Note that a block is no longer dirty, while not removing - it from buf_pool.flush_list - @param temporary whether the page belongs to the temporary tablespace - @param error whether an error may have occurred while writing */ - inline void write_complete(bool temporary, bool error); + /** Release a write fix after a page write was completed. + @param persistent whether the page belongs to a persistent tablespace + @param error whether an error may have occurred while writing + @param state recently read state() value with the correct io-fix */ + void write_complete(bool persistent, bool error, uint32_t state); /** Write a flushable page to a file or free a freeable block. - @param evict whether to evict the page on write completion @param space tablespace @return whether a page write was initiated and buf_pool.mutex released */ - bool flush(bool evict, fil_space_t *space); + bool flush(fil_space_t *space); /** Notify that a page in a temporary tablespace has been modified. */ void set_temp_modified() @@ -1301,6 +1298,11 @@ /** Resize from srv_buf_pool_old_size to srv_buf_pool_size. */ inline void resize(); +#ifdef __linux__ + /** Collect garbage (release pages from the LRU list) */ + inline void garbage_collect(); +#endif + /** @return whether resize() is in progress */ bool resize_in_progress() const { @@ -1504,13 +1506,11 @@ { return !recv_recovery_is_on() && UT_LIST_GET_LEN(free) + UT_LIST_GET_LEN(LRU) < - n_chunks_new / 4 * chunks->size; + (n_chunks_new * chunks->size) / 4; } - /** @return whether the buffer pool has run out */ - TPOOL_SUPPRESS_TSAN - bool ran_out() const - { return UNIV_UNLIKELY(!try_LRU_scan || !UT_LIST_GET_LEN(free)); } + /** @return whether the buffer pool is running low */ + bool need_LRU_eviction() const; /** @return whether the buffer pool is shrinking */ inline bool is_shrinking() const @@ -1767,10 +1767,6 @@ /** Decrement the number of pending LRU flush */ inline void n_flush_dec(); - /** Decrement the number of pending LRU flush - while holding flush_list_mutex */ - inline void n_flush_dec_holding_mutex(); - /** @return whether flush_list flushing is active */ bool flush_list_active() const { @@ -1836,6 +1832,9 @@ Set whenever the free list grows, along with a broadcast of done_free. Protected by buf_pool.mutex. */ Atomic_relaxed try_LRU_scan; + /** Whether we have warned to be running out of buffer pool */ + std::atomic_flag LRU_warned; + /* @} */ /** @name LRU replacement algorithm fields */ @@ -1898,7 +1897,8 @@ a delete-buffering operation is pending. Protected by mutex. */ buf_page_t watch[innodb_purge_threads_MAX + 1]; /** Reserve a buffer. */ - buf_tmp_buffer_t *io_buf_reserve() { return io_buf.reserve(); } + buf_tmp_buffer_t *io_buf_reserve(bool wait_for_reads) + { return io_buf.reserve(wait_for_reads); } /** Remove a block from flush_list. @param bpage buffer pool page */ @@ -1919,6 +1919,9 @@ /** Free a page whose underlying file page has been freed. */ ATTRIBUTE_COLD void release_freed_page(buf_page_t *bpage) noexcept; + /** Issue a warning that we could not free up buffer pool pages. */ + ATTRIBUTE_COLD void LRU_warn(); + private: /** Temporary memory for page_compressed and encrypted I/O */ struct io_buf_t @@ -1933,7 +1936,7 @@ void close(); /** Reserve a buffer */ - buf_tmp_buffer_t *reserve(); + buf_tmp_buffer_t *reserve(bool wait_for_reads); } io_buf; /** whether resize() is in the critical path */ diff -Nru mariadb-10.11.6/storage/innobase/include/buf0buf.inl mariadb-10.11.9/storage/innobase/include/buf0buf.inl --- mariadb-10.11.6/storage/innobase/include/buf0buf.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/buf0buf.inl 2024-08-03 07:29:59.000000000 +0000 @@ -116,17 +116,3 @@ block->modify_clock++; } - -/********************************************************************//** -Returns the value of the modify clock. The caller must have an s-lock -or x-lock on the block. -@return value */ -UNIV_INLINE -ib_uint64_t -buf_block_get_modify_clock( -/*=======================*/ - buf_block_t* block) /*!< in: block */ -{ - ut_ad(block->page.lock.have_any()); - return(block->modify_clock); -} diff -Nru mariadb-10.11.6/storage/innobase/include/buf0dblwr.h mariadb-10.11.9/storage/innobase/include/buf0dblwr.h --- mariadb-10.11.6/storage/innobase/include/buf0dblwr.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/buf0dblwr.h 2024-08-03 07:29:59.000000000 +0000 @@ -105,7 +105,8 @@ If we are upgrading from a version before MySQL 4.1, then this function performs the necessary update operations to support innodb_file_per_table. If we are in a crash recovery, this function - loads the pages from double write buffer into memory. + loads the pages from double write buffer which are not older than + the checkpoint into memory. @param file File handle @param path Path name of file @return DB_SUCCESS or error code */ diff -Nru mariadb-10.11.6/storage/innobase/include/buf0flu.h mariadb-10.11.9/storage/innobase/include/buf0flu.h --- mariadb-10.11.6/storage/innobase/include/buf0flu.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/buf0flu.h 2024-08-03 07:29:59.000000000 +0000 @@ -85,16 +85,6 @@ bool buf_flush_list_space(fil_space_t *space, ulint *n_flushed= nullptr) MY_ATTRIBUTE((warn_unused_result)); -/** Write out dirty blocks from buf_pool.LRU, -and move clean blocks to buf_pool.free. -The caller must invoke buf_dblwr.flush_buffered_writes() -after releasing buf_pool.mutex. -@param max_n wished maximum mumber of blocks flushed -@param evict whether to evict pages after flushing -@return evict ? number of processed pages : number of pages written -@retval 0 if a buf_pool.LRU batch is already running */ -ulint buf_flush_LRU(ulint max_n, bool evict); - /** Wait until a LRU flush batch ends. */ void buf_flush_wait_LRU_batch_end(); /** Wait until all persistent pages are flushed up to a limit. diff -Nru mariadb-10.11.6/storage/innobase/include/buf0lru.h mariadb-10.11.9/storage/innobase/include/buf0lru.h --- mariadb-10.11.6/storage/innobase/include/buf0lru.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/buf0lru.h 2024-08-03 07:29:59.000000000 +0000 @@ -108,6 +108,16 @@ blocks in the LRU list, else put to the start; if the LRU list is very short, added to the start regardless of this parameter */ + +/** Move a block to the start of the buf_pool.LRU list. +@param bpage buffer pool page */ +void buf_page_make_young(buf_page_t *bpage); +/** Flag a page accessed in buf_pool and move it to the start of buf_pool.LRU +if it is too old. +@param bpage buffer pool page +@return whether this is not the first access */ +bool buf_page_make_young_if_needed(buf_page_t *bpage); + /******************************************************************//** Adds a block to the LRU list of decompressed zip pages. */ void diff -Nru mariadb-10.11.6/storage/innobase/include/cache.h mariadb-10.11.9/storage/innobase/include/cache.h --- mariadb-10.11.6/storage/innobase/include/cache.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/cache.h 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,33 @@ +/***************************************************************************** + +Copyright (c) 2024, MariaDB plc + +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; version 2 of the License. + +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, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +#pragma once +#include + +#if defined __x86_64__ || defined __aarch64__ || defined __powerpc64__ +struct pmem_control +{ + void (*persist)(const void *, size_t); +public: + pmem_control(); +}; +extern const pmem_control pmem; +# define pmem_persist(buf, size) pmem.persist(buf, size) +#else +void pmem_persist(const void *buf, size_t size); +#endif diff -Nru mariadb-10.11.6/storage/innobase/include/data0data.h mariadb-10.11.9/storage/innobase/include/data0data.h --- mariadb-10.11.6/storage/innobase/include/data0data.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/data0data.h 2024-08-03 07:29:59.000000000 +0000 @@ -339,15 +339,12 @@ dtuple_t* tuple, /*!< in: data tuple */ ulint n) /*!< in: number of fields to set */ MY_ATTRIBUTE((nonnull)); -/**********************************************************************//** -Checks if a dtuple contains an SQL null value. -@return TRUE if some field is SQL null */ +/** Checks if a dtuple contains an SQL null value. +@param tuple tuple +@param fields_number number of fields in the tuple to check +@return true if some field is SQL null */ UNIV_INLINE -ibool -dtuple_contains_null( -/*=================*/ - const dtuple_t* tuple) /*!< in: dtuple */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); +bool dtuple_contains_null(const dtuple_t *tuple, ulint fields_number = 0); /**********************************************************//** Checks that a data field is typed. Asserts an error if not. @return TRUE if ok */ diff -Nru mariadb-10.11.6/storage/innobase/include/data0data.inl mariadb-10.11.9/storage/innobase/include/data0data.inl --- mariadb-10.11.6/storage/innobase/include/data0data.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/data0data.inl 2024-08-03 07:29:59.000000000 +0000 @@ -596,28 +596,18 @@ memset(data, 0, len); } -/**********************************************************************//** -Checks if a dtuple contains an SQL null value. -@return TRUE if some field is SQL null */ +/** Checks if a dtuple contains an SQL null value. +@param tuple tuple +@param fields_number number of fields in the tuple to check +@return true if some field is SQL null */ UNIV_INLINE -ibool -dtuple_contains_null( -/*=================*/ - const dtuple_t* tuple) /*!< in: dtuple */ +bool dtuple_contains_null(const dtuple_t *tuple, ulint fields_number) { - ulint n; - ulint i; - - n = dtuple_get_n_fields(tuple); - - for (i = 0; i < n; i++) { - if (dfield_is_null(dtuple_get_nth_field(tuple, i))) { - - return(TRUE); - } - } - - return(FALSE); + ulint n= fields_number ? fields_number : dtuple_get_n_fields(tuple); + for (ulint i= 0; i < n; i++) + if (dfield_is_null(dtuple_get_nth_field(tuple, i))) + return true; + return false; } /**************************************************************//** diff -Nru mariadb-10.11.6/storage/innobase/include/db0err.h mariadb-10.11.9/storage/innobase/include/db0err.h --- mariadb-10.11.6/storage/innobase/include/db0err.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/db0err.h 2024-08-03 07:29:59.000000000 +0000 @@ -32,23 +32,25 @@ enum dberr_t { DB_SUCCESS, - DB_SUCCESS_LOCKED_REC = 9, /*!< like DB_SUCCESS, but a new + DB_SUCCESS_LOCKED_REC= 9, /*!< like DB_SUCCESS, but a new explicit record lock was created */ /* The following are error codes */ - DB_ERROR = 11, + DB_RECORD_CHANGED, + DB_ERROR, DB_INTERRUPTED, DB_OUT_OF_MEMORY, DB_OUT_OF_FILE_SPACE, DB_LOCK_WAIT, DB_DEADLOCK, - DB_ROLLBACK, DB_DUPLICATE_KEY, DB_MISSING_HISTORY, /*!< required history data has been deleted due to lack of space in rollback segment */ - DB_CLUSTER_NOT_FOUND = 30, - DB_TABLE_NOT_FOUND, +#ifdef WITH_WSREP + DB_ROLLBACK, +#endif + DB_TABLE_NOT_FOUND= 31, DB_TOO_BIG_RECORD, /*!< a record in an index would not fit on a compressed page, or it would become bigger than 1/2 free space in diff -Nru mariadb-10.11.6/storage/innobase/include/dict0dict.h mariadb-10.11.9/storage/innobase/include/dict0dict.h --- mariadb-10.11.6/storage/innobase/include/dict0dict.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dict0dict.h 2024-08-03 07:29:59.000000000 +0000 @@ -35,6 +35,7 @@ #include #include +class MDL_context; class MDL_ticket; /** the first table or index ID for other than hard-coded system tables */ @@ -139,6 +140,21 @@ MDL_ticket **mdl, dict_table_op_t table_op= DICT_TABLE_OP_NORMAL); +/** Acquire MDL shared for the table name. +@tparam trylock whether to use non-blocking operation +@param[in,out] table table object +@param[in,out] mdl_context MDL context +@param[out] mdl MDL ticket +@param[in] table_op operation to perform when opening +@return table object after locking MDL shared +@retval nullptr if the table is not readable, or if trylock && MDL blocked */ +template +__attribute__((nonnull, warn_unused_result)) +dict_table_t* +dict_acquire_mdl_shared(dict_table_t *table, + MDL_context *mdl_context, MDL_ticket **mdl, + dict_table_op_t table_op); + /** Look up a table by numeric identifier. @param[in] table_id table identifier @param[in] dict_locked data dictionary locked @@ -684,35 +700,32 @@ dict_table_has_indexed_v_cols( const dict_table_t* table); -/********************************************************************//** -Gets the approximately estimated number of rows in the table. +TPOOL_SUPPRESS_TSAN +/** Get the estimated number of rows in the table. @return estimated number of rows */ -UNIV_INLINE -ib_uint64_t -dict_table_get_n_rows( -/*==================*/ - const dict_table_t* table) /*!< in: table */ - MY_ATTRIBUTE((warn_unused_result)); -/********************************************************************//** -Increment the number of rows in the table by one. -Notice that this operation is not protected by any latch, the number is -approximate. */ -UNIV_INLINE -void -dict_table_n_rows_inc( -/*==================*/ - dict_table_t* table) /*!< in/out: table */ - MY_ATTRIBUTE((nonnull)); -/********************************************************************//** -Decrement the number of rows in the table by one. -Notice that this operation is not protected by any latch, the number is -approximate. */ -UNIV_INLINE -void -dict_table_n_rows_dec( -/*==================*/ - dict_table_t* table) /*!< in/out: table */ - MY_ATTRIBUTE((nonnull)); +inline uint64_t dict_table_get_n_rows(const dict_table_t *table) +{ + ut_ad(table->stat_initialized); + return table->stat_n_rows; +} + +/** Increment the number of rows in the table by one. +Note that this operation is not protected by any latch, +the number is approximate. */ +TPOOL_SUPPRESS_TSAN inline void dict_table_n_rows_inc(dict_table_t *table) +{ + if (auto n_rows= table->stat_n_rows + 1) + table->stat_n_rows= n_rows; +} + +/** Decrement the number of rows in the table by one. +Note that this operation is not protected by any latch, +the number is approximate. */ +TPOOL_SUPPRESS_TSAN inline void dict_table_n_rows_dec(dict_table_t *table) +{ + if (auto n_rows= table->stat_n_rows) + table->stat_n_rows= n_rows - 1; +} /** Get nth virtual column @param[in] table target table @@ -1314,13 +1327,7 @@ std::atomic latch_ex_wait_start; /** the rw-latch protecting the data dictionary cache */ - alignas(CPU_LEVEL1_DCACHE_LINESIZE) srw_lock latch; -#ifdef UNIV_DEBUG - /** whether latch is being held in exclusive mode (by any thread) */ - Atomic_relaxed latch_ex; - /** number of S-latch holders */ - Atomic_counter latch_readers; -#endif + alignas(CPU_LEVEL1_DCACHE_LINESIZE) IF_DBUG(srw_lock_debug,srw_lock) latch; public: /** Indexes of SYS_TABLE[] */ enum @@ -1488,15 +1495,12 @@ } #ifdef UNIV_DEBUG - /** @return whether any thread (not necessarily the current thread) - is holding the latch; that is, this check may return false - positives */ - bool frozen() const { return latch_readers || latch_ex; } - /** @return whether any thread (not necessarily the current thread) - is holding a shared latch */ - bool frozen_not_locked() const { return latch_readers; } + /** @return whether the current thread is holding the latch */ + bool frozen() const { return latch.have_any(); } + /** @return whether the current thread is holding a shared latch */ + bool frozen_not_locked() const { return latch.have_rd(); } /** @return whether the current thread holds the exclusive latch */ - bool locked() const { return latch_ex == pthread_self(); } + bool locked() const { return latch.have_wr(); } #endif private: /** Acquire the exclusive latch */ @@ -1511,13 +1515,7 @@ /** Exclusively lock the dictionary cache. */ void lock(SRW_LOCK_ARGS(const char *file, unsigned line)) { - if (latch.wr_lock_try()) - { - ut_ad(!latch_readers); - ut_ad(!latch_ex); - ut_d(latch_ex= pthread_self()); - } - else + if (!latch.wr_lock_try()) lock_wait(SRW_LOCK_ARGS(file, line)); } @@ -1530,27 +1528,11 @@ ATTRIBUTE_NOINLINE void unfreeze(); #else /** Unlock the data dictionary cache. */ - void unlock() - { - ut_ad(latch_ex == pthread_self()); - ut_ad(!latch_readers); - ut_d(latch_ex= 0); - latch.wr_unlock(); - } + void unlock() { latch.wr_unlock(); } /** Acquire a shared lock on the dictionary cache. */ - void freeze() - { - latch.rd_lock(); - ut_ad(!latch_ex); - ut_d(latch_readers++); - } + void freeze() { latch.rd_lock(); } /** Release a shared lock on the dictionary cache. */ - void unfreeze() - { - ut_ad(!latch_ex); - ut_ad(latch_readers--); - latch.rd_unlock(); - } + void unfreeze() { latch.rd_unlock(); } #endif /** Estimate the used memory occupied by the data dictionary diff -Nru mariadb-10.11.6/storage/innobase/include/dict0dict.inl mariadb-10.11.9/storage/innobase/include/dict0dict.inl --- mariadb-10.11.6/storage/innobase/include/dict0dict.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dict0dict.inl 2024-08-03 07:29:59.000000000 +0000 @@ -306,56 +306,6 @@ return(false); } -/********************************************************************//** -Gets the approximately estimated number of rows in the table. -@return estimated number of rows */ -UNIV_INLINE -ib_uint64_t -dict_table_get_n_rows( -/*==================*/ - const dict_table_t* table) /*!< in: table */ -{ - ut_ad(table->stat_initialized); - - return(table->stat_n_rows); -} - -/********************************************************************//** -Increment the number of rows in the table by one. -Notice that this operation is not protected by any latch, the number is -approximate. */ -UNIV_INLINE -void -dict_table_n_rows_inc( -/*==================*/ - dict_table_t* table) /*!< in/out: table */ -{ - if (table->stat_initialized) { - ib_uint64_t n_rows = table->stat_n_rows; - if (n_rows < 0xFFFFFFFFFFFFFFFFULL) { - table->stat_n_rows = n_rows + 1; - } - } -} - -/********************************************************************//** -Decrement the number of rows in the table by one. -Notice that this operation is not protected by any latch, the number is -approximate. */ -UNIV_INLINE -void -dict_table_n_rows_dec( -/*==================*/ - dict_table_t* table) /*!< in/out: table */ -{ - if (table->stat_initialized) { - ib_uint64_t n_rows = table->stat_n_rows; - if (n_rows > 0) { - table->stat_n_rows = n_rows - 1; - } - } -} - #ifdef UNIV_DEBUG /********************************************************************//** Gets the nth column of a table. diff -Nru mariadb-10.11.6/storage/innobase/include/dict0load.h mariadb-10.11.9/storage/innobase/include/dict0load.h --- mariadb-10.11.6/storage/innobase/include/dict0load.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dict0load.h 2024-08-03 07:29:59.000000000 +0000 @@ -35,22 +35,16 @@ #include "btr0types.h" #include +#include /** A stack of table names related through foreign key constraints */ typedef std::deque > dict_names_t; -/** Check each tablespace found in the data dictionary. -Then look at each table defined in SYS_TABLES that has a space_id > 0 -to find all the file-per-table tablespaces. +/** Check MAX(SPACE) FROM SYS_TABLES and store it in fil_system. +Open each data file if an encryption plugin has been loaded. -In a crash recovery we already have some tablespace objects created from -processing the REDO log. We will compare the -space_id information in the data dictionary to what we find in the -tablespace file. In addition, more validation will be done if recovery -was needed and force_recovery is not set. - -We also scan the biggest space id, and store it to fil_system. */ -void dict_check_tablespaces_and_store_max_id(); +@param spaces set of tablespace files to open */ +void dict_check_tablespaces_and_store_max_id(const std::set *spaces); /** Make sure the data_file_name is saved in dict_table_t if needed. @param[in,out] table Table object */ diff -Nru mariadb-10.11.6/storage/innobase/include/dict0mem.h mariadb-10.11.9/storage/innobase/include/dict0mem.h --- mariadb-10.11.6/storage/innobase/include/dict0mem.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dict0mem.h 2024-08-03 07:29:59.000000000 +0000 @@ -1010,8 +1010,6 @@ /*!< number of columns the user defined to be in the index: in the internal representation we add more columns */ - unsigned nulls_equal:1; - /*!< if true, SQL NULL == SQL NULL */ unsigned n_uniq:10;/*!< number of fields from the beginning which are enough to determine an index entry uniquely */ @@ -2026,38 +2024,36 @@ #ifdef UNIV_DEBUG /** @return whether the current thread holds the lock_mutex */ - bool lock_mutex_is_owner() const - { return lock_mutex_owner == pthread_self(); } + bool lock_mutex_is_owner() const { return lock_latch.have_wr(); } /** @return whether the current thread holds the stats_mutex (lock_mutex) */ - bool stats_mutex_is_owner() const - { return lock_mutex_owner == pthread_self(); } + bool stats_mutex_is_owner() const { return lock_latch.have_wr(); } #endif /* UNIV_DEBUG */ - void lock_mutex_init() { lock_mutex.init(); } - void lock_mutex_destroy() { lock_mutex.destroy(); } - /** Acquire lock_mutex */ - void lock_mutex_lock() + void lock_mutex_init() { - ut_ad(!lock_mutex_is_owner()); - lock_mutex.wr_lock(); - ut_ad(!lock_mutex_owner.exchange(pthread_self())); - } - /** Try to acquire lock_mutex */ - bool lock_mutex_trylock() - { - ut_ad(!lock_mutex_is_owner()); - bool acquired= lock_mutex.wr_lock_try(); - ut_ad(!acquired || !lock_mutex_owner.exchange(pthread_self())); - return acquired; - } - /** Release lock_mutex */ - void lock_mutex_unlock() - { - ut_ad(lock_mutex_owner.exchange(0) == pthread_self()); - lock_mutex.wr_unlock(); +#ifdef UNIV_DEBUG + lock_latch.SRW_LOCK_INIT(0); +#else + lock_latch.init(); +#endif } + void lock_mutex_destroy() { lock_latch.destroy(); } + /** Acquire exclusive lock_latch */ + void lock_mutex_lock() { lock_latch.wr_lock(ut_d(SRW_LOCK_CALL)); } + /** Try to acquire exclusive lock_latch */ + bool lock_mutex_trylock() { return lock_latch.wr_lock_try(); } + /** Release exclusive lock_latch */ + void lock_mutex_unlock() { lock_latch.wr_unlock(); } + /** Acquire shared lock_latch */ + void lock_shared_lock() { lock_latch.rd_lock(ut_d(SRW_LOCK_CALL)); } + /** Release shared lock_latch */ + void lock_shared_unlock() { lock_latch.rd_unlock(); } + #ifndef SUX_LOCK_GENERIC - /** @return whether the lock mutex is held by some thread */ - bool lock_mutex_is_locked() const noexcept { return lock_mutex.is_locked(); } + /** @return whether an exclusive lock_latch is held by some thread */ + bool lock_mutex_is_locked() const noexcept + { return lock_latch.is_write_locked(); } + bool stats_mutex_is_locked() const noexcept + { return lock_latch.is_write_locked(); } #endif /* stats mutex lock currently defaults to lock_mutex but in the future, @@ -2068,6 +2064,8 @@ void stats_mutex_destroy() { lock_mutex_destroy(); } void stats_mutex_lock() { lock_mutex_lock(); } void stats_mutex_unlock() { lock_mutex_unlock(); } + void stats_shared_lock() { lock_shared_lock(); } + void stats_shared_unlock() { lock_shared_unlock(); } /** Rename the data file. @param new_name name of the table @@ -2350,18 +2348,19 @@ /** Mutex protecting autoinc and freed_indexes. */ srw_spin_mutex autoinc_mutex; private: - /** Mutex protecting locks on this table. */ - srw_spin_mutex lock_mutex; #ifdef UNIV_DEBUG - /** The owner of lock_mutex (0 if none) */ - Atomic_relaxed lock_mutex_owner{0}; + typedef srw_lock_debug lock_latch_type; +#else + typedef srw_spin_lock_low lock_latch_type; #endif + /** RW-lock protecting locks and statistics on this table */ + lock_latch_type lock_latch; public: /** Autoinc counter value to give to the next inserted row. */ uint64_t autoinc; /** The transaction that currently holds the the AUTOINC lock on this table. - Protected by lock_mutex. + Protected by lock_latch. The thread that is executing autoinc_trx may read this field without holding a latch, in row_lock_table_autoinc_for_mysql(). Only the autoinc_trx thread may clear this field; it cannot be @@ -2420,9 +2419,9 @@ /** Magic number. */ ulint magic_n; #endif /* UNIV_DEBUG */ - /** mysql_row_templ_t for base columns used for compute the virtual - columns */ - dict_vcol_templ_t* vc_templ; + /** mysql_row_templ_t for base columns used for compute the virtual + columns; protected by lock_latch */ + dict_vcol_templ_t *vc_templ; /* @return whether the table has any other transcation lock other than the given transaction */ @@ -2436,7 +2435,7 @@ } /** @return whether a DDL operation is in progress on this table */ - bool is_active_ddl() const + bool is_native_online_ddl() const { return UT_LIST_GET_FIRST(indexes)->online_log; } @@ -2448,6 +2447,9 @@ /** @return number of unique columns in FTS_DOC_ID index */ unsigned fts_n_uniq() const { return versioned() ? 2 : 1; } + /** @return the index for that starts with a specific column */ + dict_index_t *get_index(const dict_col_t &col) const; + /** Create metadata. @param name table name @param space tablespace diff -Nru mariadb-10.11.6/storage/innobase/include/dict0mem.inl mariadb-10.11.9/storage/innobase/include/dict0mem.inl --- mariadb-10.11.6/storage/innobase/include/dict0mem.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dict0mem.inl 2024-08-03 07:29:59.000000000 +0000 @@ -63,6 +63,5 @@ & index->MAX_N_FIELDS; /* The '1 +' above prevents allocation of an empty mem block */ - index->nulls_equal = false; ut_d(index->magic_n = DICT_INDEX_MAGIC_N); } diff -Nru mariadb-10.11.6/storage/innobase/include/dict0stats.h mariadb-10.11.9/storage/innobase/include/dict0stats.h --- mariadb-10.11.6/storage/innobase/include/dict0stats.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dict0stats.h 2024-08-03 07:29:59.000000000 +0000 @@ -235,4 +235,13 @@ void test_dict_stats_all(); #endif /* UNIV_ENABLE_UNIT_TEST_DICT_STATS */ +/** Write all zeros (or 1 where it makes sense) into a table +and its indexes'statistics members. The resulting stats +correspond to an empty table. +@param table table stats to be emptied +@param empty_defrag_stats empty the defrag stats */ +void +dict_stats_empty_table( + dict_table_t* table, + bool empty_defrag_stats); #endif /* dict0stats_h */ diff -Nru mariadb-10.11.6/storage/innobase/include/dyn0buf.h mariadb-10.11.9/storage/innobase/include/dyn0buf.h --- mariadb-10.11.6/storage/innobase/include/dyn0buf.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dyn0buf.h 2024-08-03 07:29:59.000000000 +0000 @@ -57,11 +57,7 @@ /** Gets the number of used bytes in a block. @return number of bytes used */ - ulint used() const - MY_ATTRIBUTE((warn_unused_result)) - { - return(static_cast(m_used & ~DYN_BLOCK_FULL_FLAG)); - } + uint32_t used() const { return m_used; } /** Gets pointer to the start of data. @@ -153,8 +149,7 @@ /** Storage */ byte m_data[MAX_DATA_SIZE]; - /** number of data bytes used in this block; - DYN_BLOCK_FULL_FLAG is set when the block becomes full */ + /** number of data bytes used in this block */ uint32_t m_used; friend class mtr_buf_t; diff -Nru mariadb-10.11.6/storage/innobase/include/dyn0types.h mariadb-10.11.9/storage/innobase/include/dyn0types.h --- mariadb-10.11.6/storage/innobase/include/dyn0types.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/dyn0types.h 2024-08-03 07:29:59.000000000 +0000 @@ -33,7 +33,4 @@ /** This is the initial 'payload' size of a dynamic array */ #define DYN_ARRAY_DATA_SIZE 512 -/** Flag for dyn_block_t::used that indicates a full block */ -#define DYN_BLOCK_FULL_FLAG 0x1000000UL - #endif /* dyn0types_h */ diff -Nru mariadb-10.11.6/storage/innobase/include/fil0crypt.h mariadb-10.11.9/storage/innobase/include/fil0crypt.h --- mariadb-10.11.6/storage/innobase/include/fil0crypt.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fil0crypt.h 2024-08-03 07:29:59.000000000 +0000 @@ -337,6 +337,11 @@ @param[in] val New max roation iops */ void fil_crypt_set_rotation_iops(uint val); +/** Add the import tablespace to default_encrypt list +if necessary and signal fil_crypt_threads +@param space imported tablespace */ +void fil_crypt_add_imported_space(fil_space_t *space); + /********************************************************************* Adjust encrypt tables @param[in] val New setting for innodb-encrypt-tables */ diff -Nru mariadb-10.11.6/storage/innobase/include/fil0fil.h mariadb-10.11.9/storage/innobase/include/fil0fil.h --- mariadb-10.11.6/storage/innobase/include/fil0fil.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fil0fil.h 2024-08-03 07:29:59.000000000 +0000 @@ -63,7 +63,7 @@ SRV_LITTLESYNC, /** do not flush after writing */ SRV_NOSYNC, - /** invoke os_file_set_nocache() on data files. This implies using + /** Open or create files with O_DIRECT. This implies using unbuffered I/O but still fdatasync(), because some filesystems might not flush meta-data on write completion */ SRV_O_DIRECT, @@ -347,7 +347,6 @@ ~fil_space_t() { ut_ad(!latch_owner); - ut_ad(!latch_count); latch.destroy(); } @@ -359,8 +358,6 @@ lsn_t max_lsn; /** tablespace identifier */ uint32_t id; - /** whether undo tablespace truncation is in progress */ - bool is_being_truncated; fil_type_t purpose;/*!< purpose */ UT_LIST_BASE_NODE_T(fil_node_t) chain; /*!< base node for the file chain */ @@ -413,9 +410,9 @@ /** The reference count */ static constexpr uint32_t PENDING= ~(STOPPING | CLOSING | NEEDS_FSYNC); /** latch protecting all page allocation bitmap pages */ - srw_lock latch; + IF_DBUG(srw_lock_debug, srw_lock) latch; + /** the thread that holds the exclusive latch, or 0 */ pthread_t latch_owner; - ut_d(Atomic_relaxed latch_count;) public: /** MariaDB encryption data */ fil_space_crypt_t *crypt_data; @@ -440,6 +437,8 @@ /** LSN of freeing last page; protected by freed_range_mutex */ lsn_t last_freed_lsn; + /** LSN of undo tablespace creation or 0; protected by latch */ + lsn_t create_lsn; public: /** @return whether doublewrite buffering is needed */ inline bool use_doublewrite() const; @@ -447,6 +446,12 @@ /** @return whether a page has been freed */ inline bool is_freed(uint32_t page); + /** Set create_lsn. */ + inline void set_create_lsn(lsn_t lsn); + + /** @return the latest tablespace rebuild LSN, or 0 */ + lsn_t get_create_lsn() const { return create_lsn; } + /** Apply freed_ranges to the file. @param writable whether the file is writable @return number of pages written or hole-punched */ @@ -524,9 +529,6 @@ /** Note that operations on the tablespace must stop. */ inline void set_stopping(); - /** Note that operations on the tablespace can resume after truncation */ - inline void clear_stopping(); - /** Drop the tablespace and wait for any pending operations to cease @param id tablespace identifier @param detached_handle pointer to file to be closed later, or nullptr @@ -644,9 +646,10 @@ public: /** Try to close a file to adhere to the innodb_open_files limit. + @param ignore_space Ignore the tablespace which is acquired by caller @param print_info whether to diagnose why a file cannot be closed @return whether a file was closed */ - static bool try_to_close(bool print_info); + static bool try_to_close(fil_space_t *ignore_space, bool print_info); /** Close all tablespace files at shutdown */ static void close_all(); @@ -1001,40 +1004,32 @@ bool recheck, bool encrypt); #ifdef UNIV_DEBUG - bool is_latched() const { return latch_count != 0; } + bool is_latched() const { return latch.have_any(); } #endif - bool is_owner() const { return latch_owner == pthread_self(); } + bool is_owner() const + { + const bool owner{latch_owner == pthread_self()}; + ut_ad(owner == latch.have_wr()); + return owner; + } /** Acquire the allocation latch in exclusive mode */ void x_lock() { latch.wr_lock(SRW_LOCK_CALL); ut_ad(!latch_owner); latch_owner= pthread_self(); - ut_ad(!latch_count.fetch_add(1)); } /** Release the allocation latch from exclusive mode */ void x_unlock() { - ut_ad(latch_count.fetch_sub(1) == 1); ut_ad(latch_owner == pthread_self()); latch_owner= 0; latch.wr_unlock(); } /** Acquire the allocation latch in shared mode */ - void s_lock() - { - ut_ad(!is_owner()); - latch.rd_lock(SRW_LOCK_CALL); - ut_ad(!latch_owner); - ut_d(latch_count.fetch_add(1)); - } + void s_lock() { latch.rd_lock(SRW_LOCK_CALL); } /** Release the allocation latch from shared mode */ - void s_unlock() - { - ut_ad(latch_count.fetch_sub(1)); - ut_ad(!latch_owner); - latch.rd_unlock(); - } + void s_unlock() { latch.rd_unlock(); } typedef span name_type; @@ -1555,14 +1550,6 @@ #endif } -inline void fil_space_t::clear_stopping() -{ - mysql_mutex_assert_owner(&fil_system.mutex); - static_assert(STOPPING_WRITES == 1U << 30, "compatibility"); - ut_d(auto n=) n_pending.fetch_sub(STOPPING_WRITES, std::memory_order_relaxed); - ut_ad((n & STOPPING) == STOPPING_WRITES); -} - /** Flush pending writes from the file system cache to the file. */ template inline void fil_space_t::flush() { @@ -1642,17 +1629,34 @@ /*******************************************************************//** Allocates and builds a file name from a path, a table or tablespace name and a suffix. The string must be freed by caller with ut_free(). -@param[in] path NULL or the directory path or the full path and filename. +@param[in] path nullptr or the directory path or the full path and filename @param[in] name {} if path is full, or Table/Tablespace name -@param[in] ext the file extension to use -@param[in] trim_name true if the last name on the path should be trimmed. +@param[in] extension the file extension to use +@param[in] trim_name true if the last name on the path should be trimmed @return own: file name */ -char* fil_make_filepath(const char *path, const fil_space_t::name_type &name, - ib_extention ext, bool trim_name); +char* fil_make_filepath_low(const char *path, + const fil_space_t::name_type &name, + ib_extention extension, bool trim_name); char *fil_make_filepath(const char* path, const table_name_t name, ib_extention suffix, bool strip_name); +/** Wrapper function over fil_make_filepath_low to build file name. +@param path nullptr or the directory path or the full path and filename +@param name {} if path is full, or Table/Tablespace name +@param extension the file extension to use +@param trim_name true if the last name on the path should be trimmed +@return own: file name */ +static inline char* +fil_make_filepath(const char* path, const fil_space_t::name_type &name, + ib_extention extension, bool trim_name) +{ + /* If we are going to strip a name off the path, there better be a + path and a new name to put back on. */ + ut_ad(!trim_name || (path && name.data())); + return fil_make_filepath_low(path, name, extension, trim_name); +} + /** Create a tablespace file. @param[in] space_id Tablespace ID @param[in] name Tablespace name in dbname/tablename format. @@ -1802,7 +1806,7 @@ and write out FILE_MODIFY if needed, and write FILE_CHECKPOINT. @param lsn checkpoint LSN @return current LSN */ -lsn_t fil_names_clear(lsn_t lsn); +ATTRIBUTE_COLD lsn_t fil_names_clear(lsn_t lsn); #ifdef UNIV_ENABLE_UNIT_TEST_MAKE_FILEPATH void test_make_filepath(); diff -Nru mariadb-10.11.6/storage/innobase/include/fsp0fsp.h mariadb-10.11.9/storage/innobase/include/fsp0fsp.h --- mariadb-10.11.6/storage/innobase/include/fsp0fsp.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fsp0fsp.h 2024-08-03 07:29:59.000000000 +0000 @@ -209,24 +209,6 @@ static constexpr byte FSEG_MAGIC_N_BYTES[4]={0x05,0xd6,0x69,0xd2}; -#define FSEG_FILLFACTOR 8 /* If the number of unused but reserved - pages in a segment is less than - reserved pages / FSEG_FILLFACTOR, - and there are - at least FSEG_FRAG_LIMIT used pages, - then we allow a new empty extent to - be added to the segment in - fseg_alloc_free_page_general(). - Otherwise, we - use unused pages of the segment. */ - -#define FSEG_FRAG_LIMIT FSEG_FRAG_ARR_N_SLOTS - /* If the segment has >= this many - used pages, it may be expanded by - allocating extents to the segment; - until that only individual fragment - pages are allocated from the space */ - #define FSEG_FREE_LIST_LIMIT 40 /* If the reserved size of a segment is at least this many extents, we allow extents to be put to the free @@ -294,7 +276,7 @@ @param[in] descr extent descriptor @param[in] offset page offset within extent @return whether the page is free */ -inline bool xdes_is_free(const xdes_t *descr, ulint offset) +inline bool xdes_is_free(const xdes_t *descr, uint32_t offset) { ut_ad(offset < FSP_EXTENT_SIZE); ulint index= XDES_FREE_BIT + XDES_BITS_PER_PAGE * offset; diff -Nru mariadb-10.11.6/storage/innobase/include/fts0fts.h mariadb-10.11.9/storage/innobase/include/fts0fts.h --- mariadb-10.11.6/storage/innobase/include/fts0fts.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fts0fts.h 2024-08-03 07:29:59.000000000 +0000 @@ -163,6 +163,9 @@ struct fts_doc_ids_t; struct fts_index_cache_t; +/** Compare two DOC_ID. */ +int fts_doc_id_cmp(const void *p1, const void *p2) + __attribute__((nonnull, warn_unused_result)); /** Initialize the "fts_table" for internal query into FTS auxiliary tables */ @@ -412,6 +415,9 @@ mem_heap_free(static_cast(doc_ids->self_heap->arg)); } +/** Sort an array of doc_id */ +void fts_doc_ids_sort(ib_vector_t *doc_ids); + /******************************************************************//** Notify the FTS system about an operation on an FTS-indexed table. */ void diff -Nru mariadb-10.11.6/storage/innobase/include/fts0priv.h mariadb-10.11.9/storage/innobase/include/fts0priv.h --- mariadb-10.11.6/storage/innobase/include/fts0priv.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fts0priv.h 2024-08-03 07:29:59.000000000 +0000 @@ -271,27 +271,6 @@ word, /*!< in: the word to fetch */ fts_fetch_t* fetch) /*!< in: fetch callback.*/ MY_ATTRIBUTE((nonnull)); -/******************************************************************//** -Compare two fts_trx_table_t instances, we actually compare the -table id's here. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_cmp( -/*==============*/ - const void* v1, /*!< in: id1 */ - const void* v2) /*!< in: id2 */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); -/******************************************************************//** -Compare a table id with a trx_table_t table id. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_id_cmp( -/*=================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ - MY_ATTRIBUTE((nonnull, warn_unused_result)); #define fts_sql_commit(trx) trx_commit_for_mysql(trx) #define fts_sql_rollback(trx) (trx)->rollback() /******************************************************************//** diff -Nru mariadb-10.11.6/storage/innobase/include/fts0priv.inl mariadb-10.11.9/storage/innobase/include/fts0priv.inl --- mariadb-10.11.6/storage/innobase/include/fts0priv.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fts0priv.inl 2024-08-03 07:29:59.000000000 +0000 @@ -34,29 +34,6 @@ ib_id_t id, /* in: a table/index id */ char* str) /* in: buffer to write the id to */ { - -#ifdef _WIN32 - - DBUG_EXECUTE_IF("innodb_test_wrong_non_windows_fts_aux_table_name", - return(sprintf(str, UINT64PFx, id));); - - /* Use this to construct old(5.6.14 and 5.7.3) windows - ambiguous aux table names */ - DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name", - return(sprintf(str, "%016llu", (ulonglong) id));); - -#else /* _WIN32 */ - - /* Use this to construct old(5.6.14 and 5.7.3) windows - ambiguous aux table names */ - DBUG_EXECUTE_IF("innodb_test_wrong_windows_fts_aux_table_name", - return(sprintf(str, "%016llu", (ulonglong) id));); - - DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name", - return(sprintf(str, "%016llx", (ulonglong) id));); - -#endif /* _WIN32 */ - return(sprintf(str, "%016llx", (ulonglong) id)); } @@ -75,47 +52,3 @@ if the id is HEX or DEC and do the right thing with it. */ return(sscanf(str, UINT64PFx, id) == 1); } - -/******************************************************************//** -Compare two fts_trx_table_t instances. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_cmp( -/*==============*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const dict_table_t* table1 - = (*static_cast(p1))->table; - - const dict_table_t* table2 - = (*static_cast(p2))->table; - - return((table1->id > table2->id) - ? 1 - : (table1->id == table2->id) - ? 0 - : -1); -} - -/******************************************************************//** -Compare a table id with a fts_trx_table_t table id. -@return < 0 if n1 < n2, 0 if n1 == n2,> 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_table_id_cmp( -/*=================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const uintmax_t* table_id = static_cast(p1); - const dict_table_t* table2 - = (*static_cast(p2))->table; - - return((*table_id > table2->id) - ? 1 - : (*table_id == table2->id) - ? 0 - : -1); -} diff -Nru mariadb-10.11.6/storage/innobase/include/fts0types.h mariadb-10.11.9/storage/innobase/include/fts0types.h --- mariadb-10.11.6/storage/innobase/include/fts0types.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fts0types.h 2024-08-03 07:29:59.000000000 +0000 @@ -278,44 +278,6 @@ extern const fts_index_selector_t fts_index_selector[]; /******************************************************************//** -Compare two fts_trx_row_t instances doc_ids. */ -UNIV_INLINE -int -fts_trx_row_doc_id_cmp( -/*===================*/ - /*!< out: - < 0 if n1 < n2, - 0 if n1 == n2, - > 0 if n1 > n2 */ - const void* p1, /*!< in: id1 */ - const void* p2); /*!< in: id2 */ - -/******************************************************************//** -Compare two fts_ranking_t instances doc_ids. */ -UNIV_INLINE -int -fts_ranking_doc_id_cmp( -/*===================*/ - /*!< out: - < 0 if n1 < n2, - 0 if n1 == n2, - > 0 if n1 > n2 */ - const void* p1, /*!< in: id1 */ - const void* p2); /*!< in: id2 */ - -/******************************************************************//** -Compare two doc_ids. */ -UNIV_INLINE -int fts_doc_id_cmp( -/*==================*/ - /*!< out: - < 0 if n1 < n2, - 0 if n1 == n2, - > 0 if n1 > n2 */ - const void* p1, /*!< in: id1 */ - const void* p2); /*!< in: id2 */ - -/******************************************************************//** Duplicate a string. */ UNIV_INLINE void diff -Nru mariadb-10.11.6/storage/innobase/include/fts0types.inl mariadb-10.11.9/storage/innobase/include/fts0types.inl --- mariadb-10.11.6/storage/innobase/include/fts0types.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fts0types.inl 2024-08-03 07:29:59.000000000 +0000 @@ -47,53 +47,6 @@ } /******************************************************************//** -Compare two fts_trx_row_t doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_trx_row_doc_id_cmp( -/*===================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const fts_trx_row_t* tr1 = (const fts_trx_row_t*) p1; - const fts_trx_row_t* tr2 = (const fts_trx_row_t*) p2; - - return((int)(tr1->doc_id - tr2->doc_id)); -} - -/******************************************************************//** -Compare two fts_ranking_t doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int -fts_ranking_doc_id_cmp( -/*===================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const fts_ranking_t* rk1 = (const fts_ranking_t*) p1; - const fts_ranking_t* rk2 = (const fts_ranking_t*) p2; - - return((int)(rk1->doc_id - rk2->doc_id)); -} - -/******************************************************************//** -Compare two doc_ids. -@return < 0 if n1 < n2, 0 if n1 == n2, > 0 if n1 > n2 */ -UNIV_INLINE -int fts_doc_id_cmp( -/*==================*/ - const void* p1, /*!< in: id1 */ - const void* p2) /*!< in: id2 */ -{ - const doc_id_t* up1 = static_cast(p1); - const doc_id_t* up2 = static_cast(p2); - - return static_cast(*up1 - *up2); -} - -/******************************************************************//** Get the first character's code position for FTS index partition */ extern ulint diff -Nru mariadb-10.11.6/storage/innobase/include/fut0lst.h mariadb-10.11.9/storage/innobase/include/fut0lst.h --- mariadb-10.11.6/storage/innobase/include/fut0lst.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/fut0lst.h 2024-08-03 07:29:59.000000000 +0000 @@ -78,34 +78,40 @@ MY_ATTRIBUTE((nonnull)); /** Append a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param add block to be added +@param aoffset byte offset of the node to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ dberr_t flst_add_last(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Prepend a file list node to a list. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] add block to be added -@param[in] aoffset byte offset of the node to be added -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param add block to be added +@param aoffset byte offset of the node to be added +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ dberr_t flst_add_first(buf_block_t *base, uint16_t boffset, - buf_block_t *add, uint16_t aoffset, mtr_t *mtr) + buf_block_t *add, uint16_t aoffset, + uint32_t limit, mtr_t *mtr) MY_ATTRIBUTE((nonnull, warn_unused_result)); /** Remove a file list node. -@param[in,out] base base node block -@param[in] boffset byte offset of the base node -@param[in,out] cur block to be removed -@param[in] coffset byte offset of the current record to be removed -@param[in,out] mtr mini-transaction +@param base base node block +@param boffset byte offset of the base node +@param cur block to be removed +@param coffset byte offset of the current record to be removed +@param limit fil_space_t::free_limit +@param mtr mini-transaction @return error code */ dberr_t flst_remove(buf_block_t *base, uint16_t boffset, - buf_block_t *cur, uint16_t coffset, mtr_t *mtr) + buf_block_t *cur, uint16_t coffset, + uint32_t limit, mtr_t *mtr) MY_ATTRIBUTE((nonnull, warn_unused_result)); /** @return the length of a list */ @@ -117,11 +123,9 @@ /** @return a file address */ inline fil_addr_t flst_read_addr(const byte *faddr) { - fil_addr_t addr= { mach_read_from_4(faddr + FIL_ADDR_PAGE), - mach_read_from_2(faddr + FIL_ADDR_BYTE) }; - ut_a(addr.page == FIL_NULL || addr.boffset >= FIL_PAGE_DATA); - ut_a(ut_align_offset(faddr, srv_page_size) >= FIL_PAGE_DATA); - return addr; + ut_ad(ut_align_offset(faddr, srv_page_size) >= FIL_PAGE_DATA); + return fil_addr_t{mach_read_from_4(faddr + FIL_ADDR_PAGE), + mach_read_from_2(faddr + FIL_ADDR_BYTE)}; } /** @return list first node address */ diff -Nru mariadb-10.11.6/storage/innobase/include/gis0type.h mariadb-10.11.9/storage/innobase/include/gis0type.h --- mariadb-10.11.6/storage/innobase/include/gis0type.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/gis0type.h 2024-08-03 07:29:59.000000000 +0000 @@ -66,10 +66,7 @@ /* Structure for matched records on the leaf page */ typedef struct matched_rec { - byte* bufp; /*!< aligned buffer point */ - byte rec_buf[UNIV_PAGE_SIZE_MAX * 2]; - /*!< buffer used to copy matching rec */ - buf_block_t block; /*!< the shadow buffer block */ + buf_block_t* block; /*!< the shadow buffer block */ ulint used; /*!< memory used */ rtr_rec_vector* matched_recs; /*!< vector holding the matching rec */ mysql_mutex_t rtr_match_mutex;/*!< mutex protect the match_recs @@ -107,7 +104,6 @@ /*!< mutex protect the "path" vector */ rtr_mbr_t mbr; /*!< the search MBR */ que_thr_t* thr; /*!< the search thread */ - mem_heap_t* heap; /*!< memory heap */ btr_cur_t* cursor; /*!< cursor used for search */ dict_index_t* index; /*!< index it is searching */ bool need_prdt_lock; diff -Nru mariadb-10.11.6/storage/innobase/include/lock0lock.h mariadb-10.11.9/storage/innobase/include/lock0lock.h --- mariadb-10.11.6/storage/innobase/include/lock0lock.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/lock0lock.h 2024-08-03 07:29:59.000000000 +0000 @@ -438,6 +438,13 @@ bool no_wait= false) MY_ATTRIBUTE((nonnull, warn_unused_result)); +/** Lock the child tables of a table. +@param table parent table +@param trx transaction +@return error code */ +dberr_t lock_table_children(dict_table_t *table, trx_t *trx) + MY_ATTRIBUTE((nonnull, warn_unused_result)); + /** Exclusively lock the data dictionary tables. @param trx dictionary transaction @return error code @@ -724,13 +731,8 @@ bool m_initialised; /** mutex proteting the locks */ - alignas(CPU_LEVEL1_DCACHE_LINESIZE) srw_spin_lock latch; -#ifdef UNIV_DEBUG - /** The owner of exclusive latch (0 if none); protected by latch */ - std::atomic writer{0}; - /** Number of shared latches */ - std::atomic readers{0}; -#endif + alignas(CPU_LEVEL1_DCACHE_LINESIZE) + IF_DBUG(srw_lock_debug,srw_spin_lock) latch; #ifdef SUX_LOCK_GENERIC protected: /** mutex for hash_latch::wait() */ @@ -789,71 +791,35 @@ void wr_lock() { mysql_mutex_assert_not_owner(&wait_mutex); - ut_ad(!is_writer()); latch.wr_lock(); - ut_ad(!writer.exchange(pthread_self(), - std::memory_order_relaxed)); } /** Release exclusive lock_sys.latch */ - void wr_unlock() - { - ut_ad(writer.exchange(0, std::memory_order_relaxed) == - pthread_self()); - latch.wr_unlock(); - } + void wr_unlock() { latch.wr_unlock(); } /** Acquire shared lock_sys.latch */ void rd_lock() { mysql_mutex_assert_not_owner(&wait_mutex); - ut_ad(!is_writer()); latch.rd_lock(); - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_d(readers.fetch_add(1, std::memory_order_relaxed)); } /** Release shared lock_sys.latch */ - void rd_unlock() - { - ut_ad(!is_writer()); - ut_ad(readers.fetch_sub(1, std::memory_order_relaxed)); - latch.rd_unlock(); - } + void rd_unlock() { latch.rd_unlock(); } #endif /** Try to acquire exclusive lock_sys.latch @return whether the latch was acquired */ - bool wr_lock_try() - { - ut_ad(!is_writer()); - if (!latch.wr_lock_try()) return false; - ut_ad(!writer.exchange(pthread_self(), - std::memory_order_relaxed)); - return true; - } + bool wr_lock_try() { return latch.wr_lock_try(); } /** Try to acquire shared lock_sys.latch @return whether the latch was acquired */ - bool rd_lock_try() - { - ut_ad(!is_writer()); - if (!latch.rd_lock_try()) return false; - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_d(readers.fetch_add(1, std::memory_order_relaxed)); - return true; - } + bool rd_lock_try() { return latch.rd_lock_try(); } /** Assert that wr_lock() has been invoked by this thread */ - void assert_locked() const { ut_ad(is_writer()); } + void assert_locked() const { ut_ad(latch.have_wr()); } /** Assert that wr_lock() has not been invoked by this thread */ - void assert_unlocked() const { ut_ad(!is_writer()); } + void assert_unlocked() const { ut_ad(!latch.have_wr()); } #ifdef UNIV_DEBUG /** @return whether the current thread is the lock_sys.latch writer */ - bool is_writer() const - { -# ifdef SUX_LOCK_GENERIC - return writer.load(std::memory_order_relaxed) == pthread_self(); -# else - return writer.load(std::memory_order_relaxed) == pthread_self() || - (xtest() && !latch.is_locked_or_waiting()); -# endif - } + bool is_writer() const { return latch.have_wr(); } + /** @return whether the current thread is holding lock_sys.latch */ + bool is_holder() const { return latch.have_any(); } /** Assert that a lock shard is exclusively latched (by some thread) */ void assert_locked(const lock_t &lock) const; /** Assert that a table lock shard is exclusively latched by this thread */ @@ -965,14 +931,14 @@ /** @return the index of an array element */ inline ulint lock_sys_t::hash_table::calc_hash(ulint fold) const { - ut_ad(lock_sys.is_writer() || lock_sys.readers); + ut_ad(lock_sys.is_holder()); return calc_hash(fold, n_cells); } /** Get a hash table cell. */ inline hash_cell_t *lock_sys_t::hash_table::cell_get(ulint fold) const { - ut_ad(lock_sys.is_writer() || lock_sys.readers); + ut_ad(lock_sys.is_holder()); return &array[calc_hash(fold)]; } diff -Nru mariadb-10.11.6/storage/innobase/include/log0crypt.h mariadb-10.11.9/storage/innobase/include/log0crypt.h --- mariadb-10.11.6/storage/innobase/include/log0crypt.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/log0crypt.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,6 +28,9 @@ #include "log0log.h" +/** innodb_encrypt_log: whether to encrypt the redo log */ +extern my_bool srv_encrypt_log; + /** Initialize the redo log encryption key and random parameters when creating a new redo log. The random parameters will be persisted in the log header. diff -Nru mariadb-10.11.6/storage/innobase/include/log0log.h mariadb-10.11.9/storage/innobase/include/log0log.h --- mariadb-10.11.6/storage/innobase/include/log0log.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/log0log.h 2024-08-03 07:29:59.000000000 +0000 @@ -79,13 +79,6 @@ /** Make a checkpoint at the latest lsn on shutdown. */ ATTRIBUTE_COLD void logs_empty_and_mark_files_at_shutdown(); -/** -Checks that there is enough free space in the log to start a new query step. -Flushes the log buffer or makes a new checkpoint if necessary. NOTE: this -function may only be called if the calling thread owns no synchronization -objects! */ -ATTRIBUTE_COLD void log_check_margins(); - /******************************************************//** Prints info of the log. */ void @@ -139,6 +132,9 @@ /** Redo log buffer */ struct log_t { + /** The maximum buf_size */ + static constexpr unsigned buf_size_max= os_file_request_size_max; + /** The original (not version-tagged) InnoDB redo log format */ static constexpr uint32_t FORMAT_3_23= 0; /** The MySQL 5.7.9/MariaDB 10.2.2 log format */ @@ -172,51 +168,92 @@ static constexpr lsn_t FIRST_LSN= START_OFFSET; private: - /** The log sequence number of the last change of durable InnoDB files */ + /** the lock bit in buf_free */ + static constexpr size_t buf_free_LOCK= ~(~size_t{0} >> 1); alignas(CPU_LEVEL1_DCACHE_LINESIZE) + /** first free offset within buf used; + the most significant bit is set by lock_lsn() to protect this field + as well as write_to_buf, waits */ + std::atomic buf_free; +public: + /** number of write requests (to buf); protected by lock_lsn() or lsn_lock */ + size_t write_to_buf; + /** log record buffer, written to by mtr_t::commit() */ + byte *buf; +private: + /** The log sequence number of the last change of durable InnoDB files; + protected by lock_lsn() or lsn_lock or latch.wr_lock() */ std::atomic lsn; /** the first guaranteed-durable log sequence number */ std::atomic flushed_to_disk_lsn; - /** log sequence number when log resizing was initiated, or 0 */ - std::atomic resize_lsn; - /** set when there may be need to flush the log buffer, or - preflush buffer pool pages, or initiate a log checkpoint. - This must hold if lsn - last_checkpoint_lsn > max_checkpoint_age. */ - std::atomic check_flush_or_checkpoint_; - +public: + /** number of append_prepare_wait(); protected by lock_lsn() or lsn_lock */ + size_t waits; + /** innodb_log_buffer_size (size of buf,flush_buf if !is_pmem(), in bytes) */ + unsigned buf_size; + /** log file size in bytes, including the header */ + lsn_t file_size; -#if defined(__aarch64__) -/* On ARM, we do more spinning */ -typedef srw_spin_lock log_rwlock_t; -#define LSN_LOCK_ATTR MY_MUTEX_INIT_FAST +#ifdef LOG_LATCH_DEBUG + typedef srw_lock_debug log_rwlock; + typedef srw_mutex log_lsn_lock; + + bool latch_have_wr() const { return latch.have_wr(); } + bool latch_have_rd() const { return latch.have_rd(); } + bool latch_have_any() const { return latch.have_any(); } #else -typedef srw_lock log_rwlock_t; -#define LSN_LOCK_ATTR nullptr +# ifndef UNIV_DEBUG +# elif defined SUX_LOCK_GENERIC + bool latch_have_wr() const { return true; } + bool latch_have_rd() const { return true; } + bool latch_have_any() const { return true; } +# else + bool latch_have_wr() const { return latch.is_write_locked(); } + bool latch_have_rd() const { return latch.is_locked(); } + bool latch_have_any() const { return latch.is_locked(); } +# endif +# ifdef __aarch64__ + /* On ARM, we spin more */ + typedef srw_spin_lock log_rwlock; + typedef pthread_mutex_wrapper log_lsn_lock; +# else + typedef srw_lock log_rwlock; + typedef srw_mutex log_lsn_lock; +# endif #endif + /** exclusive latch for checkpoint, shared for mtr_t::commit() to buf */ + alignas(CPU_LEVEL1_DCACHE_LINESIZE) log_rwlock latch; + + /** number of std::swap(buf, flush_buf) and writes from buf to log; + protected by latch.wr_lock() */ + ulint write_to_log; -public: - /** rw-lock protecting buf */ - alignas(CPU_LEVEL1_DCACHE_LINESIZE) log_rwlock_t latch; -private: /** Last written LSN */ lsn_t write_lsn; -public: - /** log record buffer, written to by mtr_t::commit() */ - byte *buf; + /** buffer for writing data to ib_logfile0, or nullptr if is_pmem() In write_buf(), buf and flush_buf are swapped */ byte *flush_buf; - /** number of std::swap(buf, flush_buf) and writes from buf to log; - protected by latch.wr_lock() */ - ulint write_to_log; - + /** set when there may be need to initiate a log checkpoint. + This must hold if lsn - last_checkpoint_lsn > max_checkpoint_age. */ + std::atomic need_checkpoint; + /** whether a checkpoint is pending; protected by latch.wr_lock() */ + Atomic_relaxed checkpoint_pending; + /** next checkpoint number (protected by latch.wr_lock()) */ + byte next_checkpoint_no; + /** recommended maximum buf_free size, after which the buffer is flushed */ + unsigned max_buf_free; /** Log sequence number when a log file overwrite (broken crash recovery) was noticed. Protected by latch.wr_lock(). */ lsn_t overwrite_warned; - /** innodb_log_buffer_size (size of buf,flush_buf if !is_pmem(), in bytes) */ - size_t buf_size; + /** latest completed checkpoint (protected by latch.wr_lock()) */ + Atomic_relaxed last_checkpoint_lsn; + /** next checkpoint LSN (protected by latch.wr_lock()) */ + lsn_t next_checkpoint_lsn; + /** Log file */ + log_file_t log; private: /** Log file being constructed during resizing; protected by latch */ log_file_t resize_log; @@ -227,37 +264,21 @@ /** Buffer for writing to resize_log; @see flush_buf */ byte *resize_flush_buf; - /** spin lock protecting lsn, buf_free in append_prepare() */ - alignas(CPU_LEVEL1_DCACHE_LINESIZE) pthread_mutex_t lsn_lock; - void init_lsn_lock() { pthread_mutex_init(&lsn_lock, LSN_LOCK_ATTR); } - void lock_lsn() { pthread_mutex_lock(&lsn_lock); } - void unlock_lsn() { pthread_mutex_unlock(&lsn_lock); } - void destroy_lsn_lock() { pthread_mutex_destroy(&lsn_lock); } - -public: - /** first free offset within buf use; protected by lsn_lock */ - Atomic_relaxed buf_free; - /** number of write requests (to buf); protected by exclusive lsn_lock */ - ulint write_to_buf; - /** number of waits in append_prepare(); protected by lsn_lock */ - ulint waits; - /** recommended maximum size of buf, after which the buffer is flushed */ - size_t max_buf_free; + /** Special implementation of lock_lsn() for IA-32 and AMD64 */ + void lsn_lock_bts() noexcept; + /** Acquire a lock for updating buf_free and related fields. + @return the value of buf_free */ + size_t lock_lsn() noexcept; - /** log file size in bytes, including the header */ - lsn_t file_size; -private: + /** log sequence number when log resizing was initiated, or 0 */ + std::atomic resize_lsn; /** the log sequence number at the start of the log file */ lsn_t first_lsn; -#if defined __linux__ || defined _WIN32 - /** The physical block size of the storage */ - uint32_t block_size; -#endif public: + /** current innodb_log_write_ahead_size */ + uint write_size; /** format of the redo log: e.g., FORMAT_10_8 */ uint32_t format; - /** Log file */ - log_file_t log; #if defined __linux__ || defined _WIN32 /** whether file system caching is enabled for the log */ my_bool log_buffered; @@ -285,21 +306,31 @@ /*!< this is the maximum allowed value for lsn - last_checkpoint_lsn when a new query step is started */ - /** latest completed checkpoint (protected by latch.wr_lock()) */ - Atomic_relaxed last_checkpoint_lsn; - /** next checkpoint LSN (protected by log_sys.latch) */ - lsn_t next_checkpoint_lsn; - /** next checkpoint number (protected by latch.wr_lock()) */ - ulint next_checkpoint_no; - /** whether a checkpoint is pending */ - Atomic_relaxed checkpoint_pending; /** buffer for checkpoint header */ byte *checkpoint_buf; /* @} */ +private: + /** A lock when the spin-only lock_lsn() is not being used */ + log_lsn_lock lsn_lock; +public: + bool is_initialised() const noexcept { return max_buf_free != 0; } + /** whether there is capacity in the log buffer */ + bool buf_free_ok() const noexcept + { + ut_ad(!is_pmem()); + return (buf_free.load(std::memory_order_relaxed) & ~buf_free_LOCK) < + max_buf_free; + } + + inline void set_recovered() noexcept; + + void set_buf_free(size_t f) noexcept + { ut_ad(f < buf_free_LOCK); buf_free.store(f, std::memory_order_relaxed); } + #ifdef HAVE_PMEM bool is_pmem() const noexcept { return !flush_buf; } #else @@ -308,6 +339,9 @@ bool is_opened() const noexcept { return log.is_opened(); } + /** @return target write LSN to react on !buf_free_ok() */ + inline lsn_t get_write_target() const; + /** @return LSN at which log resizing was started and is still in progress @retval 0 if no log resizing is in progress */ lsn_t resize_in_progress() const noexcept @@ -334,9 +368,12 @@ inline void resize_write(lsn_t lsn, const byte *end, size_t len, size_t seq) noexcept; +private: /** Write resize_buf to resize_log. @param length the used length of resize_buf */ - ATTRIBUTE_COLD void resize_write_buf(size_t length) noexcept; + ATTRIBUTE_COLD ATTRIBUTE_NOINLINE + void resize_write_buf(size_t length) noexcept; +public: /** Rename a log file after resizing. @return whether an error occurred */ @@ -405,9 +442,7 @@ void set_recovered_lsn(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_write_locked()); -#endif /* SUX_LOCK_GENERIC */ + ut_ad(latch_have_wr()); write_lsn= lsn; this->lsn.store(lsn, std::memory_order_relaxed); flushed_to_disk_lsn.store(lsn, std::memory_order_relaxed); @@ -419,13 +454,14 @@ inline void persist(lsn_t lsn) noexcept; #endif - bool check_flush_or_checkpoint() const + bool check_for_checkpoint() const { - return UNIV_UNLIKELY - (check_flush_or_checkpoint_.load(std::memory_order_relaxed)); + return UNIV_UNLIKELY(need_checkpoint.load(std::memory_order_relaxed)); + } + void set_check_for_checkpoint(bool need= true) + { + need_checkpoint.store(need, std::memory_order_relaxed); } - void set_check_flush_or_checkpoint(bool flag= true) - { check_flush_or_checkpoint_.store(flag, std::memory_order_relaxed); } /** Make previous write_buf() durable and update flushed_to_disk_lsn. */ bool flush(lsn_t lsn) noexcept; @@ -434,28 +470,33 @@ void close(); #if defined __linux__ || defined _WIN32 - /** @return the physical block size of the storage */ - size_t get_block_size() const noexcept - { ut_ad(block_size); return block_size; } /** Set the log block size for file I/O. */ - void set_block_size(uint32_t size) noexcept { block_size= size; } -#else - /** @return the physical block size of the storage */ - static size_t get_block_size() { return 512; } + void set_block_size(uint32 size) noexcept + { + if (write_size < size) + write_size= size; + } #endif private: /** Wait in append_prepare() for buffer to become available - @param ex whether log_sys.latch is exclusively locked */ - ATTRIBUTE_COLD static void append_prepare_wait(bool ex) noexcept; + @tparam spin whether to use the spin-only lock_lsn() + @param b the value of buf_free + @param ex whether log_sys.latch is exclusively locked + @param lsn log sequence number to write up to + @return the new value of buf_free */ + template + ATTRIBUTE_COLD size_t append_prepare_wait(size_t b, bool ex, lsn_t lsn) + noexcept; public: /** Reserve space in the log buffer for appending data. + @tparam spin whether to use the spin-only lock_lsn() @tparam pmem log_sys.is_pmem() @param size total length of the data to append(), in bytes @param ex whether log_sys.latch is exclusively locked @return the start LSN and the buffer position for append() */ - template - inline std::pair append_prepare(size_t size, bool ex) noexcept; + template + std::pair append_prepare(size_t size, bool ex) noexcept; /** Append a string of bytes to the redo log. @param d destination @@ -463,9 +504,7 @@ @param size length of str, in bytes */ void append(byte *&d, const void *s, size_t size) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_locked()); -#endif + ut_ad(latch_have_any()); ut_ad(d + size <= buf + (is_pmem() ? file_size : buf_size)); memcpy(d, s, size); d+= size; diff -Nru mariadb-10.11.6/storage/innobase/include/log0recv.h mariadb-10.11.9/storage/innobase/include/log0recv.h --- mariadb-10.11.6/storage/innobase/include/log0recv.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/log0recv.h 2024-08-03 07:29:59.000000000 +0000 @@ -44,6 +44,11 @@ @return whether the page was recovered correctly */ bool recv_recover_page(fil_space_t* space, buf_page_t* bpage); +/** Read the latest checkpoint information from log file +and store it in log_sys.next_checkpoint and recv_sys.file_checkpoint +@return error code or DB_SUCCESS */ +dberr_t recv_recovery_read_checkpoint(); + /** Start recovering from a redo log checkpoint. of first system tablespace page @return error code or DB_SUCCESS */ @@ -114,7 +119,19 @@ @param name tablespace filepath @param file tablespace file handle @return whether the operation failed */ - bool restore_first_page(uint32_t space_id, const char *name, os_file_t file); + bool restore_first_page(uint32_t space_id, const char *name, + pfs_os_file_t file); + + /** Restore the first page of the given tablespace from + doublewrite buffer. + 1) Find the page which has page_no as 0 + 2) Read first 3 pages from tablespace file + 3) Compare the space_ids from the pages with page0 which + was retrieved from doublewrite buffer + @param name tablespace filepath + @param file tablespace file handle + @return space_id or 0 in case of error */ + uint32_t find_first_page(const char *name, pfs_os_file_t file); typedef std::deque > list; diff -Nru mariadb-10.11.6/storage/innobase/include/mach0data.inl mariadb-10.11.9/storage/innobase/include/mach0data.inl --- mariadb-10.11.6/storage/innobase/include/mach0data.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/mach0data.inl 2024-08-03 07:29:59.000000000 +0000 @@ -25,6 +25,7 @@ Created 11/28/1995 Heikki Tuuri ***********************************************************************/ +#include "my_valgrind.h" #ifndef UNIV_INNOCHECKSUM #include "mtr0types.h" @@ -39,7 +40,9 @@ byte* b, /*!< in: pointer to byte where to store */ ulint n) /*!< in: ulint integer to be stored, >= 0, < 256 */ { +#if !defined HAVE_valgrind || __has_feature(memory_sanitizer) ut_ad((n & ~0xFFUL) == 0); +#endif b[0] = (byte) n; } @@ -56,7 +59,9 @@ byte* b, /*!< in: pointer to two bytes where to store */ ulint n) /*!< in: ulint integer to be stored */ { +#if !defined HAVE_valgrind || __has_feature(memory_sanitizer) ut_ad((n & ~0xFFFFUL) == 0); +#endif b[0] = (byte)(n >> 8); b[1] = (byte)(n); diff -Nru mariadb-10.11.6/storage/innobase/include/mariadb_stats.h mariadb-10.11.9/storage/innobase/include/mariadb_stats.h --- mariadb-10.11.6/storage/innobase/include/mariadb_stats.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/mariadb_stats.h 2024-08-03 07:29:59.000000000 +0000 @@ -16,54 +16,73 @@ *****************************************************************************/ -#ifndef mariadb_stats_h -#define mariadb_stats_h - -/* Include file to handle mariadbd handler specific stats */ +#pragma once #include "ha_handler_stats.h" #include "my_rdtsc.h" -/* Not active threads are ponting to this structure */ -extern thread_local ha_handler_stats mariadb_dummy_stats; +/* We do not want a dynamic initialization function to be +conditionally invoked on each access to a C++11 extern thread_local. */ +#if __cplusplus >= 202002L +# define simple_thread_local constinit thread_local +#else +# define simple_thread_local IF_WIN(__declspec(thread),__thread) +#endif -/* Points to either THD->handler_stats or mariad_dummy_stats */ -extern thread_local ha_handler_stats *mariadb_stats; +/** Pointer to handler::active_handler_stats or nullptr (via .tbss) */ +extern simple_thread_local ha_handler_stats *mariadb_stats; /* - Returns 1 if MariaDB wants engine status + Returns nonzero if MariaDB wants engine status */ -inline bool mariadb_stats_active() +inline uint mariadb_stats_active() { - return mariadb_stats->active != 0; + if (ha_handler_stats *stats= mariadb_stats) + return stats->active; + return 0; } -inline bool mariadb_stats_active(ha_handler_stats *stats) +/* The following functions increment different engine status */ + +inline void mariadb_increment_pages_accessed(ha_handler_stats *stats) { - return stats->active != 0; + if (stats) + stats->pages_accessed++; } -/* The following functions increment different engine status */ - inline void mariadb_increment_pages_accessed() { - mariadb_stats->pages_accessed++; + mariadb_increment_pages_accessed(mariadb_stats); } inline void mariadb_increment_pages_updated(ulonglong count) { - mariadb_stats->pages_updated+= count; + if (ha_handler_stats *stats= mariadb_stats) + stats->pages_updated+= count; +} + +inline void mariadb_increment_pages_read(ha_handler_stats *stats) +{ + if (stats) + stats->pages_read_count++; } inline void mariadb_increment_pages_read() { - mariadb_stats->pages_read_count++; + mariadb_increment_pages_read(mariadb_stats); } inline void mariadb_increment_undo_records_read() { - mariadb_stats->undo_records_read++; + if (ha_handler_stats *stats= mariadb_stats) + stats->undo_records_read++; +} + +inline void mariadb_increment_pages_prefetched(ulint n_pages) +{ + if (ha_handler_stats *stats= mariadb_stats) + stats->pages_prefetched += n_pages; } /* @@ -92,7 +111,7 @@ ulonglong end_time= mariadb_measure(); /* Check that we only call this if active, see example! */ DBUG_ASSERT(start_time); - DBUG_ASSERT(mariadb_stats_active(stats)); + DBUG_ASSERT(stats->active); stats->pages_read_time+= (end_time - start_time); } @@ -105,15 +124,12 @@ class mariadb_set_stats { public: - uint flag; mariadb_set_stats(ha_handler_stats *stats) { - mariadb_stats= stats ? stats : &mariadb_dummy_stats; + mariadb_stats= stats; } ~mariadb_set_stats() { - mariadb_stats= &mariadb_dummy_stats; + mariadb_stats= nullptr; } }; - -#endif /* mariadb_stats_h */ diff -Nru mariadb-10.11.6/storage/innobase/include/mtr0mtr.h mariadb-10.11.9/storage/innobase/include/mtr0mtr.h --- mariadb-10.11.6/storage/innobase/include/mtr0mtr.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/mtr0mtr.h 2024-08-03 07:29:59.000000000 +0000 @@ -89,8 +89,9 @@ { auto s= m_memo.size(); rollback_to_savepoint(s - 1, s); } /** Commit a mini-transaction that is shrinking a tablespace. - @param space tablespace that is being shrunk */ - ATTRIBUTE_COLD void commit_shrink(fil_space_t &space); + @param space tablespace that is being shrunk + @param size new size in pages */ + ATTRIBUTE_COLD void commit_shrink(fil_space_t &space, uint32_t size); /** Commit a mini-transaction that is deleting or renaming a file. @param space tablespace that is being renamed or deleted @@ -105,7 +106,7 @@ This is to be used at log_checkpoint(). @param checkpoint_lsn the log sequence number of a checkpoint, or 0 @return current LSN */ - lsn_t commit_files(lsn_t checkpoint_lsn= 0); + ATTRIBUTE_COLD lsn_t commit_files(lsn_t checkpoint_lsn= 0); /** @return mini-transaction savepoint (current size of m_memo) */ ulint get_savepoint() const @@ -694,14 +695,40 @@ /** Encrypt the log */ ATTRIBUTE_NOINLINE void encrypt(); + /** Commit the mini-transaction log. + @tparam pmem log_sys.is_pmem() + @param mtr mini-transaction + @param lsns {start_lsn,flush_ahead} */ + template + static void commit_log(mtr_t *mtr, std::pair lsns); + /** Append the redo log records to the redo log buffer. @return {start_lsn,flush_ahead} */ std::pair do_write(); /** Append the redo log records to the redo log buffer. + @tparam spin whether to use the spin-only log_sys.lock_lsn() + @tparam pmem log_sys.is_pmem() + @param mtr mini-transaction @param len number of bytes to write @return {start_lsn,flush_ahead} */ - std::pair finish_write(size_t len); + template static + std::pair finish_writer(mtr_t *mtr, size_t len); + + /** The applicable variant of commit_log() */ + static void (*commit_logger)(mtr_t *, std::pair); + /** The applicable variant of finish_writer() */ + static std::pair (*finisher)(mtr_t *, size_t); + + std::pair finish_write(size_t len) + { return finisher(this, len); } +public: + /** Poll interval in log_sys.lock_lsn(); 0 to use log_sys.lsn_lock. + Protected by LOCK_global_system_variables and log_sys.latch. */ + static unsigned spin_wait_delay; + /** Update finisher when spin_wait_delay is changing to or from 0. */ + static void finisher_update(); +private: /** Release all latches. */ void release(); diff -Nru mariadb-10.11.6/storage/innobase/include/os0file.h mariadb-10.11.9/storage/innobase/include/os0file.h --- mariadb-10.11.6/storage/innobase/include/os0file.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/os0file.h 2024-08-03 07:29:59.000000000 +0000 @@ -46,6 +46,18 @@ #include #endif /* !_WIN32 */ +/** The maximum size of a read or write request. + +According to Linux "man 2 read" and "man 2 write" this applies to +both 32-bit and 64-bit systems. + +On FreeBSD, the limit is close to the Linux one, INT_MAX. + +On Microsoft Windows, the limit is UINT_MAX (4 GiB - 1). + +On other systems, the limit typically is up to SSIZE_T_MAX. */ +static constexpr unsigned os_file_request_size_max= 0x7ffff000; + extern bool os_has_said_disk_full; /** File offset in bytes */ @@ -109,25 +121,21 @@ /** Options for os_file_create_func @{ */ enum os_file_create_t { - OS_FILE_OPEN = 51, /*!< to open an existing file (if - doesn't exist, error) */ - OS_FILE_CREATE, /*!< to create new file (if - exists, error) */ - OS_FILE_OVERWRITE, /*!< to create a new file, if exists - the overwrite old file */ - OS_FILE_OPEN_RAW, /*!< to open a raw device or disk - partition */ - OS_FILE_CREATE_PATH, /*!< to create the directories */ - OS_FILE_OPEN_RETRY, /*!< open with retry */ - - /** Flags that can be combined with the above values. Please ensure - that the above values stay below 128. */ - - OS_FILE_ON_ERROR_NO_EXIT = 128, /*!< do not exit on unknown errors */ - OS_FILE_ON_ERROR_SILENT = 256 /*!< don't print diagnostic messages to - the log unless it is a fatal error, - this flag is only used if - ON_ERROR_NO_EXIT is set */ + /** create a new file */ + OS_FILE_CREATE= 0, + /** open an existing file */ + OS_FILE_OPEN, + /** retry opening an existing file */ + OS_FILE_OPEN_RETRY, + /** open a raw block device */ + OS_FILE_OPEN_RAW, + + /** do not display diagnostic messages */ + OS_FILE_ON_ERROR_SILENT= 4, + + OS_FILE_CREATE_SILENT= OS_FILE_CREATE | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_SILENT= OS_FILE_OPEN | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_RETRY_SILENT= OS_FILE_OPEN_RETRY | OS_FILE_ON_ERROR_SILENT }; static const ulint OS_FILE_READ_ONLY = 333; @@ -142,9 +150,11 @@ /* @} */ /** Types for file create @{ */ -static const ulint OS_DATA_FILE = 100; -static const ulint OS_LOG_FILE = 101; -static const ulint OS_DATA_FILE_NO_O_DIRECT = 103; +static constexpr ulint OS_DATA_FILE = 100; +static constexpr ulint OS_LOG_FILE = 101; +#if defined _WIN32 || defined O_DIRECT +static constexpr ulint OS_DATA_FILE_NO_O_DIRECT = 103; +#endif /* @} */ /** Error codes from os_file_get_last_error @{ */ @@ -189,14 +199,10 @@ WRITE_ASYNC= WRITE_SYNC | 1, /** A doublewrite batch */ DBLWR_BATCH= WRITE_ASYNC | 8, - /** Write data; evict the block on write completion */ - WRITE_LRU= WRITE_ASYNC | 32, /** Write data and punch hole for the rest */ - PUNCH= WRITE_ASYNC | 64, - /** Write data and punch hole; evict the block on write completion */ - PUNCH_LRU= PUNCH | WRITE_LRU, + PUNCH= WRITE_ASYNC | 16, /** Zero out a range of bytes in fil_space_t::io() */ - PUNCH_RANGE= WRITE_SYNC | 128, + PUNCH_RANGE= WRITE_SYNC | 32, }; constexpr IORequest(buf_page_t *bpage, buf_tmp_buffer_t *slot, @@ -209,7 +215,6 @@ bool is_read() const { return (type & READ_SYNC) != 0; } bool is_write() const { return (type & WRITE_SYNC) != 0; } - bool is_LRU() const { return (type & (WRITE_LRU ^ WRITE_ASYNC)) != 0; } bool is_async() const { return (type & (READ_SYNC ^ READ_ASYNC)) != 0; } void write_complete(int io_error) const; @@ -347,7 +352,7 @@ pfs_os_file_t os_file_create_simple_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success); @@ -356,7 +361,7 @@ os_file_create_simple_no_error_handling(), not directly this function! A simple function to open or create a file. @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -367,28 +372,12 @@ pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) MY_ATTRIBUTE((warn_unused_result)); -#ifdef _WIN32 -#define os_file_set_nocache(fd, file_name, operation_name) do{}while(0) -#else -/** Tries to disable OS caching on an opened file descriptor. -@param[in] fd file descriptor to alter -@param[in] file_name file name, used in the diagnostic message -@param[in] name "open" or "create"; used in the diagnostic - message */ -void -os_file_set_nocache( -/*================*/ - int fd, /*!< in: file descriptor to alter */ - const char* file_name, - const char* operation_name); -#endif - #ifndef _WIN32 /* On Microsoft Windows, mandatory locking is used */ /** Obtain an exclusive lock on a file. @param fd file descriptor @@ -417,7 +406,7 @@ pfs_os_file_t os_file_create_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, @@ -615,7 +604,7 @@ pfs_os_file_create_simple_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -631,7 +620,7 @@ @param[in] key Performance Schema Key @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -646,7 +635,7 @@ pfs_os_file_create_simple_no_error_handling_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -679,7 +668,7 @@ pfs_os_file_create_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, diff -Nru mariadb-10.11.6/storage/innobase/include/os0file.inl mariadb-10.11.9/storage/innobase/include/os0file.inl --- mariadb-10.11.6/storage/innobase/include/os0file.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/os0file.inl 2024-08-03 07:29:59.000000000 +0000 @@ -45,7 +45,7 @@ pfs_os_file_create_simple_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -80,7 +80,7 @@ @param[in] key Performance Schema Key @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -95,7 +95,7 @@ pfs_os_file_create_simple_no_error_handling_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success, @@ -146,7 +146,7 @@ pfs_os_file_create_func( mysql_pfs_key_t key, const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, diff -Nru mariadb-10.11.6/storage/innobase/include/row0merge.h mariadb-10.11.9/storage/innobase/include/row0merge.h --- mariadb-10.11.6/storage/innobase/include/row0merge.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/row0merge.h 2024-08-03 07:29:59.000000000 +0000 @@ -165,14 +165,11 @@ prepare_inplace_alter_table_dict(). */ void row_merge_drop_temp_indexes(); -/** Create temporary merge files in the given paramater path, and if -UNIV_PFS_IO defined, register the file descriptor with Performance Schema. -@param[in] path location for creating temporary merge files, or NULL +/** Create a temporary file at the specified path. +@param path location for creating temporary merge files, or nullptr @return File descriptor */ -pfs_os_file_t -row_merge_file_create_low( - const char* path) - MY_ATTRIBUTE((warn_unused_result)); +pfs_os_file_t row_merge_file_create_low(const char *path) + MY_ATTRIBUTE((warn_unused_result)); /*********************************************************************//** Destroy a merge file. And de-register the file from Performance Schema if UNIV_PFS_IO is defined. */ @@ -419,6 +416,14 @@ ulint space) /*!< in: space id */ MY_ATTRIBUTE((warn_unused_result)); +/* Report an InnoDB error to the client by invoking my_error(). +@param error InnoDB error code +@param table table name +@param flags table flags */ +ATTRIBUTE_COLD __attribute__((nonnull)) +void +my_error_innodb(dberr_t error, const char *table, ulint flags); + /** Buffer for bulk insert */ class row_merge_bulk_t { diff -Nru mariadb-10.11.6/storage/innobase/include/row0row.h mariadb-10.11.9/storage/innobase/include/row0row.h --- mariadb-10.11.6/storage/innobase/include/row0row.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/row0row.h 2024-08-03 07:29:59.000000000 +0000 @@ -370,6 +370,12 @@ mtr_t* mtr) /*!< in: mtr */ MY_ATTRIBUTE((nonnull, warn_unused_result)); +/** Get the byte offset of the DB_TRX_ID column +@param[in] rec clustered index record +@param[in] index clustered index +@return the byte offset of DB_TRX_ID, from the start of rec */ +ulint row_trx_id_offset(const rec_t* rec, const dict_index_t* index); + #define ROW_COPY_DATA 1 #define ROW_COPY_POINTERS 2 diff -Nru mariadb-10.11.6/storage/innobase/include/row0sel.h mariadb-10.11.9/storage/innobase/include/row0sel.h --- mariadb-10.11.6/storage/innobase/include/row0sel.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/row0sel.h 2024-08-03 07:29:59.000000000 +0000 @@ -115,8 +115,8 @@ ulint buf_len, /*!< in: buffer length */ dict_index_t* index, /*!< in: index of the key value */ const byte* key_ptr, /*!< in: MySQL key value */ - ulint key_len); /*!< in: MySQL key value length */ - + ulint key_len) /*!< in: MySQL key value length */ + MY_ATTRIBUTE((nonnull(1,4,5))); /** Search for rows in the database using cursor. Function is mainly used for tables that are shared across connections and diff -Nru mariadb-10.11.6/storage/innobase/include/srv0mon.h mariadb-10.11.9/storage/innobase/include/srv0mon.h --- mariadb-10.11.6/storage/innobase/include/srv0mon.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/srv0mon.h 2024-08-03 07:29:59.000000000 +0000 @@ -194,7 +194,6 @@ MONITOR_FLUSH_ADAPTIVE_AVG_PASS, MONITOR_LRU_GET_FREE_LOOPS, - MONITOR_LRU_GET_FREE_WAITS, MONITOR_FLUSH_AVG_PAGE_RATE, MONITOR_FLUSH_LSN_AVG_RATE, @@ -215,7 +214,6 @@ MONITOR_LRU_BATCH_SCANNED_PER_CALL, MONITOR_LRU_BATCH_FLUSH_TOTAL_PAGE, MONITOR_LRU_BATCH_EVICT_TOTAL_PAGE, - MONITOR_LRU_SINGLE_FLUSH_FAILURE_COUNT, MONITOR_LRU_GET_FREE_SEARCH, MONITOR_LRU_SEARCH_SCANNED, MONITOR_LRU_SEARCH_SCANNED_NUM_CALL, diff -Nru mariadb-10.11.6/storage/innobase/include/srv0srv.h mariadb-10.11.9/storage/innobase/include/srv0srv.h --- mariadb-10.11.6/storage/innobase/include/srv0srv.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/srv0srv.h 2024-08-03 07:29:59.000000000 +0000 @@ -121,10 +121,6 @@ ulint_ctr_n_t n_temp_blocks_decrypted; }; -/** We are prepared for a situation that we have this many threads waiting for -a transactional lock inside InnoDB. srv_start() sets the value. */ -extern ulint srv_max_n_threads; - extern const char* srv_main_thread_op_info; /** Prefix used by MySQL to indicate pre-5.1 table name encoding */ @@ -210,14 +206,11 @@ extern uint srv_n_fil_crypt_threads; extern uint srv_n_fil_crypt_threads_started; -/** Rate at which UNDO records should be purged. */ -extern ulong srv_purge_rseg_truncate_frequency; - /** Enable or Disable Truncate of UNDO tablespace. */ extern my_bool srv_undo_log_truncate; /** Default size of UNDO tablespace (10MiB for innodb_page_size=16k) */ -constexpr ulint SRV_UNDO_TABLESPACE_SIZE_IN_PAGES= (10U << 20) / +constexpr uint32_t SRV_UNDO_TABLESPACE_SIZE_IN_PAGES= (10U << 20) / UNIV_PAGE_SIZE_DEF; extern char* srv_log_group_home_dir; @@ -317,6 +310,7 @@ extern my_bool srv_force_primary_key; +extern my_bool innodb_alter_copy_bulk; extern ulong srv_max_purge_lag; extern ulong srv_max_purge_lag_delay; @@ -615,7 +609,6 @@ ulint innodb_data_reads; /*!< I/O read requests */ ulint innodb_dblwr_pages_written; /*!< srv_dblwr_pages_written */ ulint innodb_dblwr_writes; /*!< srv_dblwr_writes */ - ulint innodb_deadlocks; ulint innodb_history_list_length; lsn_t innodb_lsn_current; lsn_t innodb_lsn_flushed; @@ -647,7 +640,10 @@ operations*/ /** Number of instant ALTER TABLE operations that affect columns */ - ulong innodb_instant_alter_column; + Atomic_counter innodb_instant_alter_column; + + /* Number of InnoDB bulk operations */ + Atomic_counter innodb_bulk_operations; ulint innodb_onlineddl_rowlog_rows; /*!< Online alter rows */ ulint innodb_onlineddl_rowlog_pct_used; /*!< Online alter percentage diff -Nru mariadb-10.11.6/storage/innobase/include/srw_lock.h mariadb-10.11.9/storage/innobase/include/srw_lock.h --- mariadb-10.11.6/storage/innobase/include/srw_lock.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/srw_lock.h 2024-08-03 07:29:59.000000000 +0000 @@ -34,7 +34,6 @@ # define SUX_LOCK_GENERIC /* Use dummy implementation for debugging purposes */ #endif -#ifdef SUX_LOCK_GENERIC /** An exclusive-only variant of srw_lock */ template class pthread_mutex_wrapper final @@ -70,12 +69,14 @@ inline void pthread_mutex_wrapper::wr_lock() { if (!wr_lock_try()) wr_wait(); } # endif -#endif + +template class ssux_lock_impl; /** Futex-based mutex */ template class srw_mutex_impl final { + friend ssux_lock_impl; /** The lock word, containing HOLDER + 1 if the lock is being held, plus the number of waiters */ std::atomic lock; @@ -97,6 +98,8 @@ inline void wait(uint32_t lk); /** Wake up one wait() thread */ void wake(); + /** Wake up all wait() threads */ + inline void wake_all(); public: /** @return whether the mutex is being held or waited for */ bool is_locked_or_waiting() const @@ -155,7 +158,7 @@ /** Slim shared-update-exclusive lock with no recursion */ template -class ssux_lock_impl final +class ssux_lock_impl { #ifdef UNIV_PFS_RWLOCK friend class ssux_lock; @@ -209,27 +212,25 @@ /** @return whether the lock is being held or waited for */ bool is_vacant() const { return !is_locked_or_waiting(); } #endif /* !DBUG_OFF */ - - bool rd_lock_try() +private: + /** Try to acquire a shared latch. + @return the lock word value if the latch was not acquired + @retval 0 if the latch was acquired */ + uint32_t rd_lock_try_low() { uint32_t lk= 0; while (!readers.compare_exchange_weak(lk, lk + 1, std::memory_order_acquire, std::memory_order_relaxed)) if (lk & WRITER) - return false; - return true; + return lk; + return 0; } +public: - bool u_lock_try() - { - if (!writer.wr_lock_try()) - return false; - IF_DBUG_ASSERT(uint32_t lk=,) - readers.fetch_add(1, std::memory_order_acquire); - DBUG_ASSERT(lk < WRITER - 1); - return true; - } + bool rd_lock_try() { return rd_lock_try_low() == 0; } + + bool u_lock_try() { return writer.wr_lock_try(); } bool wr_lock_try() { @@ -248,9 +249,6 @@ void u_lock() { writer.wr_lock(); - IF_DBUG_ASSERT(uint32_t lk=,) - readers.fetch_add(1, std::memory_order_acquire); - DBUG_ASSERT(lk < WRITER - 1); } void wr_lock() { @@ -272,15 +270,15 @@ void u_wr_upgrade() { DBUG_ASSERT(writer.is_locked()); - uint32_t lk= readers.fetch_add(WRITER - 1, std::memory_order_acquire); - if (lk != 1) - wr_wait(lk - 1); + uint32_t lk= readers.fetch_add(WRITER, std::memory_order_acquire); + if (lk) + wr_wait(lk); } void wr_u_downgrade() { DBUG_ASSERT(writer.is_locked()); DBUG_ASSERT(is_write_locked()); - readers.store(1, std::memory_order_release); + readers.store(0, std::memory_order_release); /* Note: Any pending rd_lock() will not be woken up until u_unlock() */ } @@ -293,10 +291,6 @@ } void u_unlock() { - IF_DBUG_ASSERT(uint32_t lk=,) - readers.fetch_sub(1, std::memory_order_release); - DBUG_ASSERT(lk); - DBUG_ASSERT(lk < WRITER); writer.wr_unlock(); } void wr_unlock() @@ -406,7 +400,7 @@ class ssux_lock { PSI_rwlock *pfs_psi; - ssux_lock_impl lock; + ssux_lock_impl lock; ATTRIBUTE_NOINLINE void psi_rd_lock(const char *file, unsigned line); ATTRIBUTE_NOINLINE void psi_wr_lock(const char *file, unsigned line); @@ -541,7 +535,7 @@ /** @return whether any lock may be held by any thread */ bool is_locked_or_waiting() const noexcept { return lock.is_locked_or_waiting(); } - /** @return whether an exclusive lock may be held by any thread */ + /** @return whether a shared or exclusive lock may be held by any thread */ bool is_locked() const noexcept { return lock.is_locked(); } /** @return whether an exclusive lock may be held by any thread */ bool is_write_locked() const noexcept { return lock.is_write_locked(); } @@ -552,3 +546,51 @@ typedef srw_lock_impl srw_spin_lock; #endif + +#ifdef UNIV_DEBUG +# include + +class srw_lock_debug : private srw_lock +{ + /** The owner of the exclusive lock (0 if none) */ + std::atomic writer; + /** Protects readers */ + mutable srw_mutex readers_lock; + /** Threads that hold the lock in shared mode */ + std::atomic*> readers; + + /** Register a read lock. */ + void readers_register(); + +public: + void SRW_LOCK_INIT(mysql_pfs_key_t key); + void destroy(); + +#ifndef SUX_LOCK_GENERIC + /** @return whether any lock may be held by any thread */ + bool is_locked_or_waiting() const noexcept + { return srw_lock::is_locked_or_waiting(); } + /** @return whether an exclusive lock may be held by any thread */ + bool is_write_locked() const noexcept { return srw_lock::is_write_locked(); } +#endif + + /** Acquire an exclusive lock */ + void wr_lock(SRW_LOCK_ARGS(const char *file, unsigned line)); + /** @return whether an exclusive lock was acquired */ + bool wr_lock_try(); + /** Release after wr_lock() */ + void wr_unlock(); + /** Acquire a shared lock */ + void rd_lock(SRW_LOCK_ARGS(const char *file, unsigned line)); + /** @return whether a shared lock was acquired */ + bool rd_lock_try(); + /** Release after rd_lock() */ + void rd_unlock(); + /** @return whether this thread is between rd_lock() and rd_unlock() */ + bool have_rd() const noexcept; + /** @return whether this thread is between wr_lock() and wr_unlock() */ + bool have_wr() const noexcept; + /** @return whether this thread is holding rd_lock() or wr_lock() */ + bool have_any() const noexcept; +}; +#endif diff -Nru mariadb-10.11.6/storage/innobase/include/sux_lock.h mariadb-10.11.9/storage/innobase/include/sux_lock.h --- mariadb-10.11.6/storage/innobase/include/sux_lock.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/sux_lock.h 2024-08-03 07:29:59.000000000 +0000 @@ -285,7 +285,7 @@ typedef sux_lock> block_lock; #ifndef UNIV_PFS_RWLOCK -typedef sux_lock> index_lock; +typedef sux_lock> index_lock; #else typedef sux_lock index_lock; diff -Nru mariadb-10.11.6/storage/innobase/include/trx0purge.h mariadb-10.11.9/storage/innobase/include/trx0purge.h --- mariadb-10.11.6/storage/innobase/include/trx0purge.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/trx0purge.h 2024-08-03 07:29:59.000000000 +0000 @@ -55,80 +55,74 @@ @return number of undo log pages handled in the batch */ ulint trx_purge(ulint n_tasks, ulint history_size); -/** Rollback segements from a given transaction with trx-no -scheduled for purge. */ -class TrxUndoRsegs { -private: - typedef std::vector > - trx_rsegs_t; -public: - typedef trx_rsegs_t::iterator iterator; - typedef trx_rsegs_t::const_iterator const_iterator; - - TrxUndoRsegs() = default; - - /** Constructor */ - TrxUndoRsegs(trx_rseg_t& rseg) - : trx_no(rseg.last_trx_no()), m_rsegs(1, &rseg) {} - /** Constructor */ - TrxUndoRsegs(trx_id_t trx_no, trx_rseg_t& rseg) - : trx_no(trx_no), m_rsegs(1, &rseg) {} - - bool operator!=(const TrxUndoRsegs& other) const - { return trx_no != other.trx_no; } - bool empty() const { return m_rsegs.empty(); } - void erase(iterator& it) { m_rsegs.erase(it); } - iterator begin() { return(m_rsegs.begin()); } - iterator end() { return(m_rsegs.end()); } - const_iterator begin() const { return m_rsegs.begin(); } - const_iterator end() const { return m_rsegs.end(); } - - /** Compare two TrxUndoRsegs based on trx_no. - @param elem1 first element to compare - @param elem2 second element to compare - @return true if elem1 > elem2 else false.*/ - bool operator()(const TrxUndoRsegs& lhs, const TrxUndoRsegs& rhs) - { - return(lhs.trx_no > rhs.trx_no); - } - - /** Copy of trx_rseg_t::last_trx_no() */ - trx_id_t trx_no= 0; -private: - /** Rollback segments of a transaction, scheduled for purge. */ - trx_rsegs_t m_rsegs{}; -}; - -typedef std::priority_queue< - TrxUndoRsegs, - std::vector >, - TrxUndoRsegs> purge_pq_t; - -/** Chooses the rollback segment with the oldest committed transaction */ -struct TrxUndoRsegsIterator { - /** Constructor */ - TrxUndoRsegsIterator(); - /** Sets the next rseg to purge in purge_sys. - Executed in the purge coordinator thread. - @retval false when nothing is to be purged - @retval true when purge_sys.rseg->latch was locked */ - inline bool set_next(); - -private: - // Disable copying - TrxUndoRsegsIterator(const TrxUndoRsegsIterator&); - TrxUndoRsegsIterator& operator=(const TrxUndoRsegsIterator&); - - /** The current element to process */ - TrxUndoRsegs m_rsegs; - /** Track the current element in m_rsegs */ - TrxUndoRsegs::const_iterator m_iter; -}; - /** The control structure used in the purge operation */ class purge_sys_t { - friend TrxUndoRsegsIterator; + /** Min-heap based priority queue of (trx_no, trx_sys.rseg_array index) + pairs, ordered on trx_no. The highest 64-TRX_NO_SHIFT bits of each element is + trx_no, the lowest 8 bits is rseg's index in trx_sys.rseg_array. */ + class purge_queue + { + public: + typedef std::vector> container_type; + /** Number of bits reseved to shift trx_no in purge queue element */ + static constexpr unsigned TRX_NO_SHIFT= 8; + + bool empty() const { return m_array.empty(); } + void clear() { m_array.clear(); } + + /** Push (trx_no, trx_sys.rseg_array index) into min-heap. + @param trx_no_rseg (trx_no << TRX_NO_SHIFT | (trx_sys.rseg_array index)) */ + void push_trx_no_rseg(container_type::value_type trx_no_rseg) + { + m_array.push_back(trx_no_rseg); + std::push_heap(m_array.begin(), m_array.end(), + std::greater()); + } + + /** Push rseg to priority queue. + @param trx_no trx_no of committed transaction + @param rseg rseg of committed transaction*/ + void push(trx_id_t trx_no, const trx_rseg_t &rseg) + { + ut_ad(trx_no < 1ULL << (DATA_TRX_ID_LEN * CHAR_BIT)); + ut_ad(&rseg >= trx_sys.rseg_array); + ut_ad(&rseg < trx_sys.rseg_array + TRX_SYS_N_RSEGS); + push_trx_no_rseg(trx_no << TRX_NO_SHIFT | + byte(&rseg - trx_sys.rseg_array)); + } + + /** Extracts rseg from (trx_no, trx_sys.rseg_array index) pair. + @param trx_no_rseg (trx_no << TRX_NO_SHIFT | (trx_sys.rseg_array index) + @return pointer to rseg in trx_sys.rseg_array */ + static trx_rseg_t *rseg(container_type::value_type trx_no_rseg) { + byte i= static_cast(trx_no_rseg); + ut_ad(i < TRX_SYS_N_RSEGS); + return &trx_sys.rseg_array[i]; + } + + /** Pop rseg from priority queue. + @return pointer to popped trx_rseg_t object */ + trx_rseg_t *pop() + { + ut_ad(!empty()); + std::pop_heap(m_array.begin(), m_array.end(), + std::greater()); + trx_rseg_t *r = rseg(m_array.back()); + m_array.pop_back(); + return r; + } + + /** Clone m_array. + @return m_array clone */ + container_type clone_container() const{ return m_array; } + + private: + /** Array of (trx_no, trx_sys.rseg_array index) pairs. */ + container_type m_array; + }; + + public: /** latch protecting view, m_enabled */ alignas(CPU_LEVEL1_DCACHE_LINESIZE) mutable srw_spin_lock latch; @@ -140,6 +134,15 @@ bool m_initialized{false}; /** whether purge is enabled; protected by latch and std::atomic */ std::atomic m_enabled{false}; + /** The primary candidate for iterator::free_history() is + rseg=trx_sys.rseg_array[skipped_rseg]. This field may be changed + after invoking rseg.set_skip_allocation() and rseg.clear_skip_allocation() + and while holding the exclusive rseg.latch. + + This may only be 0 if innodb_undo_tablespaces=0, because rollback segment + 0 always resides in the system tablespace and would never be used when + dedicated undo tablespaces are in use. */ + Atomic_relaxed skipped_rseg; public: /** whether purge is active (may hold table handles) */ std::atomic m_active{false}; @@ -197,6 +200,11 @@ return undo_no <= other.undo_no; } + /** Remove unnecessary history data from a rollback segment. + @param rseg rollback segment + @return error code */ + inline dberr_t free_history_rseg(trx_rseg_t &rseg) const; + /** Free the undo pages up to this. */ dberr_t free_history() const; @@ -230,24 +238,46 @@ record */ uint16_t hdr_offset; /*!< Header byte offset on the page */ + /** Binary min-heap of (trx_no, trx_sys.rseg_array index) pairs, ordered on + trx_no. It is protected by the pq_mutex */ + purge_queue purge_queue; + + /** Mutex protecting purge_queue */ + mysql_mutex_t pq_mutex; - TrxUndoRsegsIterator - rseg_iter; /*!< Iterator to get the next rseg - to process */ public: - purge_pq_t purge_queue; /*!< Binary min-heap, ordered on - TrxUndoRsegs::trx_no. It is protected - by the pq_mutex */ - mysql_mutex_t pq_mutex; /*!< Mutex protecting purge_queue */ - - /** Undo tablespace file truncation (only accessed by the - srv_purge_coordinator_thread) */ - struct { - /** The undo tablespace that is currently being truncated */ - fil_space_t* current; - /** The undo tablespace that was last truncated */ - fil_space_t* last; - } truncate; + + void enqueue(trx_id_t trx_no, const trx_rseg_t &rseg) { + mysql_mutex_assert_owner(&pq_mutex); + purge_queue.push(trx_no, rseg); + } + + /** Push to purge queue without acquiring pq_mutex. + @param rseg rseg to push */ + void enqueue(const trx_rseg_t &rseg) { enqueue(rseg.last_trx_no(), rseg); } + + /** Clone purge queue container. + @return purge queue container clone */ + purge_queue::container_type clone_queue_container() const { + mysql_mutex_assert_owner(&pq_mutex); + return purge_queue.clone_container(); + } + + /** Acquare purge_queue_mutex */ + void queue_lock() { mysql_mutex_lock(&pq_mutex); } + + /** Release purge queue mutex */ + void queue_unlock() { mysql_mutex_unlock(&pq_mutex); } + + /** innodb_undo_log_truncate=ON state; + only modified by purge_coordinator_callback() */ + struct { + /** The undo tablespace that is currently being truncated */ + Atomic_relaxed current; + /** The number of the undo tablespace that was last truncated, + relative from srv_undo_space_id_start */ + uint32_t last; + } truncate_undo_space; /** Create the instance */ void create(); @@ -317,8 +347,9 @@ /** Update the last not yet purged history log info in rseg when we have purged a whole undo log. Advances also purge_trx_no - past the purged log. */ - void rseg_get_next_history_log(); + past the purged log. + @return whether anything is to be purged */ + bool rseg_get_next_history_log(); public: /** @@ -357,6 +388,26 @@ typically via purge_sys_t::view_guard. */ return view.sees(id); } + +private: + /** Enable the use of a rollback segment and advance skipped_rseg, + after iterator::free_history_rseg() had invoked + rseg.set_skip_allocation(). */ + inline void rseg_enable(trx_rseg_t &rseg); + + /** Try to start truncating a tablespace. + @param id undo tablespace identifier + @param size the maximum desired undo tablespace size, in pages + @return undo tablespace whose truncation was started + @retval nullptr if truncation is not currently possible */ + inline fil_space_t *undo_truncate_try(uint32_t id, uint32_t size); +public: + /** Check if innodb_undo_log_truncate=ON needs to be handled. + This is only to be called by purge_coordinator_callback(). + @return undo tablespace chosen by innodb_undo_log_truncate=ON + @retval nullptr if truncation is not currently possible */ + fil_space_t *truncating_tablespace(); + /** A wrapper around trx_sys_t::clone_oldest_view(). */ template void clone_oldest_view() @@ -403,6 +454,11 @@ @param already_stopped True indicates purge threads were already stopped */ void stop_FTS(const dict_table_t &table, bool already_stopped=false); + + /** Cleanse purge queue to remove the rseg that reside in undo-tablespace + marked for truncate. + @param space undo tablespace being truncated */ + void cleanse_purge_queue(const fil_space_t &space); }; /** The global data structure coordinating a purge */ diff -Nru mariadb-10.11.6/storage/innobase/include/trx0rseg.h mariadb-10.11.9/storage/innobase/include/trx0rseg.h --- mariadb-10.11.6/storage/innobase/include/trx0rseg.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/trx0rseg.h 2024-08-03 07:29:59.000000000 +0000 @@ -59,7 +59,7 @@ /** tablespace containing the rollback segment; constant after init() */ fil_space_t *space; /** latch protecting everything except page_no, space */ - srw_spin_lock latch; + IF_DBUG(srw_lock_debug,srw_spin_lock) latch; /** rollback segment header page number; constant after init() */ uint32_t page_no; /** length of the TRX_RSEG_HISTORY list (number of transactions) */ @@ -73,14 +73,15 @@ /** Reference counter to track is_persistent() transactions, with SKIP flag. */ std::atomic ref; - +public: /** Whether undo tablespace truncation is pending */ static constexpr uint32_t SKIP= 1; /** Transaction reference count multiplier */ static constexpr uint32_t REF= 2; + /** @return the reference count and flags */ uint32_t ref_load() const { return ref.load(std::memory_order_relaxed); } - +private: /** Set the SKIP bit */ void ref_set_skip() { @@ -169,19 +170,21 @@ /** Last not yet purged undo log header; FIL_NULL if all purged */ uint32_t last_page_no; - /** trx_t::no | last_offset << 48 */ + /** trx_t::no << 16 | last_offset */ uint64_t last_commit_and_offset; /** @return the commit ID of the last committed transaction */ trx_id_t last_trx_no() const - { return last_commit_and_offset & ((1ULL << 48) - 1); } + { return last_commit_and_offset >> 16; } /** @return header offset of the last committed transaction */ uint16_t last_offset() const - { return static_cast(last_commit_and_offset >> 48); } + { + return static_cast(last_commit_and_offset); + } void set_last_commit(uint16_t last_offset, trx_id_t trx_no) { - last_commit_and_offset= static_cast(last_offset) << 48 | trx_no; + last_commit_and_offset= trx_no << 16 | static_cast(last_offset); } /** @return the page identifier */ diff -Nru mariadb-10.11.6/storage/innobase/include/trx0sys.h mariadb-10.11.9/storage/innobase/include/trx0sys.h --- mariadb-10.11.6/storage/innobase/include/trx0sys.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/trx0sys.h 2024-08-03 07:29:59.000000000 +0000 @@ -437,10 +437,10 @@ not accessible by concurrent threads. */ - static void rw_trx_hash_initializer(LF_HASH *, - rw_trx_hash_element_t *element, - trx_t *trx) + static void rw_trx_hash_initializer(LF_HASH *, void *el, const void *t) { + rw_trx_hash_element_t *element= static_cast(el); + trx_t *trx= static_cast(const_cast(t)); ut_ad(element->trx == 0); element->trx= trx; element->id= trx->id; @@ -454,7 +454,7 @@ Pins are used to protect object from being destroyed or reused. They are normally stored in trx object for quick access. If caller doesn't have trx - available, we try to get it using currnet_trx(). If caller doesn't have trx + available, we try to get it using current_trx(). If caller doesn't have trx at all, temporary pins are allocated. */ @@ -480,9 +480,10 @@ template - static my_bool eliminate_duplicates(rw_trx_hash_element_t *element, - eliminate_duplicates_arg *arg) + static my_bool eliminate_duplicates(void *el, void *a) { + rw_trx_hash_element_t *element= static_cast(el); + auto arg= static_cast*>(a); for (trx_ids_t::iterator it= arg->ids.begin(); it != arg->ids.end(); it++) { if (*it == element->id) @@ -508,17 +509,17 @@ } - template struct debug_iterator_arg + struct debug_iterator_arg { - walk_action *action; - T *argument; + my_hash_walk_action action; + void *argument; }; - template - static my_bool debug_iterator(rw_trx_hash_element_t *element, - debug_iterator_arg *arg) + static my_bool debug_iterator(void *el, void *a) { + rw_trx_hash_element_t *element= static_cast(el); + debug_iterator_arg *arg= static_cast(a); element->mutex.wr_lock(); if (element->trx) validate_element(element->trx); @@ -726,7 +727,7 @@ @param caller_trx used to get/set pins @param action called for every element in hash - @param argument opque argument passed to action + @param argument opaque argument passed to action May return the same element multiple times if hash is under contention. If caller doesn't like to see the same transaction multiple times, it has @@ -749,28 +750,24 @@ @retval 1 iteration was interrupted (action returned 1) */ - template - int iterate(trx_t *caller_trx, walk_action *action, T *argument= nullptr) + int iterate(trx_t *caller_trx, my_hash_walk_action action, + void *argument= nullptr) { LF_PINS *pins= caller_trx ? get_pins(caller_trx) : lf_hash_get_pins(&hash); ut_a(pins); #ifdef UNIV_DEBUG - debug_iterator_arg debug_arg= { action, argument }; - action= reinterpret_cast(debug_iterator); - argument= reinterpret_cast(&debug_arg); + debug_iterator_arg debug_arg= { action, argument }; + action= debug_iterator; + argument= reinterpret_cast(&debug_arg); #endif - int res= lf_hash_iterate(&hash, pins, - reinterpret_cast(action), - const_cast(static_cast - (argument))); + int res= lf_hash_iterate(&hash, pins, action, argument); if (!caller_trx) lf_hash_put_pins(pins); return res; } - template - int iterate(walk_action *action, T *argument= nullptr) + int iterate(my_hash_walk_action action, void *argument= nullptr) { return iterate(current_trx(), action, argument); } @@ -902,8 +899,8 @@ uint64_t recovered_binlog_offset; /** Latest recovered binlog file name */ char recovered_binlog_filename[TRX_SYS_MYSQL_LOG_NAME_LEN]; - /** FIL_PAGE_LSN of the page with the latest recovered binlog metadata */ - lsn_t recovered_binlog_lsn; + /** Set when latest position is from pre-version 10.3.5 TRX_SYS. */ + bool recovered_binlog_is_legacy_pos; /** @@ -1191,6 +1188,11 @@ return count; } + /** Disable further allocation of transactions in a rollback segment + that are subject to innodb_undo_log_truncate=ON + @param space undo tablespace that will be truncated */ + inline void undo_truncate_start(fil_space_t &space); + /** Set the undo log empty value */ void set_undo_non_empty(bool val) { @@ -1206,9 +1208,10 @@ @return error code */ inline dberr_t reset_page(mtr_t *mtr); private: - static my_bool find_same_or_older_callback(rw_trx_hash_element_t *element, - trx_id_t *id) + static my_bool find_same_or_older_callback(void *el, void *i) { + auto element= static_cast(el); + auto id= static_cast(i); return element->id <= *id; } @@ -1222,9 +1225,10 @@ }; - static my_bool copy_one_id(rw_trx_hash_element_t *element, - snapshot_ids_arg *arg) + static my_bool copy_one_id(void* el, void *a) { + auto element= static_cast(el); + auto arg= static_cast(a); if (element->id < arg->m_id) { trx_id_t no= element->no; diff -Nru mariadb-10.11.6/storage/innobase/include/trx0trx.h mariadb-10.11.9/storage/innobase/include/trx0trx.h --- mariadb-10.11.6/storage/innobase/include/trx0trx.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/trx0trx.h 2024-08-03 07:29:59.000000000 +0000 @@ -785,13 +785,19 @@ const char* op_info; /*!< English text describing the current operation, or an empty string */ - uint isolation_level;/*!< TRX_ISO_REPEATABLE_READ, ... */ - bool check_foreigns; /*!< normally TRUE, but if the user - wants to suppress foreign key checks, - (in table imports, for example) we - set this FALSE */ + /** TRX_ISO_REPEATABLE_READ, ... */ + unsigned isolation_level:2; + /** when set, REPEATABLE READ will actually be Snapshot Isolation, due to + detecting write/write conflicts and disabling "semi-consistent read" */ + unsigned snapshot_isolation:1; + /** normally set; "SET foreign_key_checks=0" can be issued to suppress + foreign key checks, in table imports, for example */ + unsigned check_foreigns:1; + /** normally set; "SET unique_checks=0, foreign_key_checks=0" + enables bulk insert into an empty table */ + unsigned check_unique_secondary:1; /** whether an insert into an empty table is active */ - bool bulk_insert; + unsigned bulk_insert:1; /*------------------------------*/ /* MySQL has a transaction coordinator to coordinate two phase commit between multiple storage engines and the binary log. When @@ -805,13 +811,6 @@ /** whether this is holding the prepare mutex */ bool active_commit_ordered; /*------------------------------*/ - bool check_unique_secondary; - /*!< normally TRUE, but if the user - wants to speed up inserts by - suppressing unique key checks - for secondary indexes when we decide - if we can use the insert buffer for - them, we set this FALSE */ bool flush_log_later;/* In 2PC, we hold the prepare_commit mutex across both phases. In that case, we @@ -1108,6 +1107,7 @@ { ut_ad(state == TRX_STATE_NOT_STARTED); ut_ad(!id); + ut_ad(!*detailed_error); ut_ad(!mutex_is_owner()); ut_ad(!has_logged()); ut_ad(!is_referenced()); @@ -1172,8 +1172,8 @@ { if (UNIV_LIKELY(!bulk_insert)) return nullptr; - ut_ad(!check_unique_secondary); - ut_ad(!check_foreigns); + ut_ad(table->skip_alter_undo || !check_unique_secondary); + ut_ad(table->skip_alter_undo || !check_foreigns); auto it= mod_tables.find(table); if (it == mod_tables.end() || !it->second.bulk_buffer_exist()) return nullptr; @@ -1188,10 +1188,16 @@ return UNIV_UNLIKELY(bulk_insert) ? bulk_insert_apply_low(): DB_SUCCESS; } + /** Do the bulk insert for the buffered insert operation of a table. + @param table bulk insert operation + @return DB_SUCCESS or error code. */ + dberr_t bulk_insert_apply_for_table(dict_table_t *table); private: /** Apply the buffered bulk inserts. */ dberr_t bulk_insert_apply_low(); + /** Rollback the bulk insert operation for the transaction */ + void bulk_rollback_low(); /** Assign a rollback segment for modifying temporary tables. @return the assigned rollback segment */ trx_rseg_t *assign_temp_rseg(); diff -Nru mariadb-10.11.6/storage/innobase/include/trx0undo.inl mariadb-10.11.9/storage/innobase/include/trx0undo.inl --- mariadb-10.11.6/storage/innobase/include/trx0undo.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/trx0undo.inl 2024-08-03 07:29:59.000000000 +0000 @@ -125,5 +125,6 @@ { uint16_t end= trx_undo_page_get_end(undo_page, page_no, offset); uint16_t next= mach_read_from_2(undo_page->page.frame + rec); - return next == end ? nullptr : undo_page->page.frame + next; + ut_ad(next <= end); + return next >= end ? nullptr : undo_page->page.frame + next; } diff -Nru mariadb-10.11.6/storage/innobase/include/ut0counter.h mariadb-10.11.9/storage/innobase/include/ut0counter.h --- mariadb-10.11.6/storage/innobase/include/ut0counter.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/ut0counter.h 2024-08-03 07:29:59.000000000 +0000 @@ -31,30 +31,6 @@ #include "univ.i" #include "my_rdtsc.h" -/** Use the result of my_timer_cycles(), which mainly uses RDTSC for cycles -as a random value. See the comments for my_timer_cycles() */ -/** @return result from RDTSC or similar functions. */ -static inline size_t -get_rnd_value() -{ - size_t c = static_cast(my_timer_cycles()); - - if (c != 0) { - return c; - } - - /* We may go here if my_timer_cycles() returns 0, - so we have to have the plan B for the counter. */ -#if !defined(_WIN32) - return (size_t)pthread_self(); -#else - LARGE_INTEGER cnt; - QueryPerformanceCounter(&cnt); - - return static_cast(cnt.QuadPart); -#endif /* !_WIN32 */ -} - /** Atomic which occupies whole CPU cache line. Note: We rely on the default constructor of std::atomic and do not explicitly initialize the contents. This works for us, @@ -90,7 +66,7 @@ /** Add to the counter. @param[in] n amount to be added */ - void add(Type n) { add(get_rnd_value(), n); } + void add(Type n) { add(size_t(my_pseudo_random()), n); } /** Add to the counter. @param[in] index a reasonably thread-unique identifier diff -Nru mariadb-10.11.6/storage/innobase/include/ut0new.h mariadb-10.11.9/storage/innobase/include/ut0new.h --- mariadb-10.11.6/storage/innobase/include/ut0new.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/ut0new.h 2024-08-03 07:29:59.000000000 +0000 @@ -1071,9 +1071,8 @@ { void *ptr = my_large_malloc(&n_bytes, MYF(0)); - ut_dontdump(ptr, n_bytes, true); - if (ptr) { + ut_dontdump(ptr, n_bytes, true); os_total_large_mem_allocated += n_bytes; } return ptr; diff -Nru mariadb-10.11.6/storage/innobase/include/ut0ut.h mariadb-10.11.9/storage/innobase/include/ut0ut.h --- mariadb-10.11.6/storage/innobase/include/ut0ut.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/ut0ut.h 2024-08-03 07:29:59.000000000 +0000 @@ -242,20 +242,6 @@ FILE* ef, /*!< in: stream */ const trx_t* trx, /*!< in: transaction */ const char* name); /*!< in: table name to print */ -/** Format a table name, quoted as an SQL identifier. -If the name contains a slash '/', the result will contain two -identifiers separated by a period (.), as in SQL -database_name.table_name. -@see table_name_t -@param[in] name table or index name -@param[out] formatted formatted result, will be NUL-terminated -@param[in] formatted_size size of the buffer in bytes -@return pointer to 'formatted' */ -char* -ut_format_name( - const char* name, - char* formatted, - ulint formatted_size); /**********************************************************************//** Catenate files. */ diff -Nru mariadb-10.11.6/storage/innobase/include/ut0vec.h mariadb-10.11.9/storage/innobase/include/ut0vec.h --- mariadb-10.11.6/storage/innobase/include/ut0vec.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/ut0vec.h 2024-08-03 07:29:59.000000000 +0000 @@ -201,15 +201,6 @@ const ib_vector_t* vec); /* in: vector */ /******************************************************************** -Sort the vector elements. */ -UNIV_INLINE -void -ib_vector_sort( -/*===========*/ - ib_vector_t* vec, /* in/out: vector */ - ib_compare_t compare); /* in: the comparator to use for sort */ - -/******************************************************************** The default ib_vector_t heap free. Does nothing. */ UNIV_INLINE void diff -Nru mariadb-10.11.6/storage/innobase/include/ut0vec.inl mariadb-10.11.9/storage/innobase/include/ut0vec.inl --- mariadb-10.11.6/storage/innobase/include/ut0vec.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/include/ut0vec.inl 2024-08-03 07:29:59.000000000 +0000 @@ -305,19 +305,6 @@ } /******************************************************************** -Sort the vector elements. */ -UNIV_INLINE -void -ib_vector_sort( -/*===========*/ - /* out: void */ - ib_vector_t* vec, /* in: vector */ - ib_compare_t compare)/* in: the comparator to use for sort */ -{ - qsort(vec->data, vec->used, vec->sizeof_value, compare); -} - -/******************************************************************** Destroy the vector. Make sure the vector owns the allocator, e.g., the heap in the the heap allocator. */ UNIV_INLINE diff -Nru mariadb-10.11.6/storage/innobase/lock/lock0lock.cc mariadb-10.11.9/storage/innobase/lock/lock0lock.cc --- mariadb-10.11.6/storage/innobase/lock/lock0lock.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/lock/lock0lock.cc 2024-08-03 07:29:59.000000000 +0000 @@ -47,6 +47,7 @@ #include "que0que.h" #include "scope.h" #include +#include #include @@ -173,7 +174,7 @@ ut_ad(!table.is_temporary()); if (is_writer()) return; - ut_ad(readers); + ut_ad(latch.have_rd()); ut_ad(table.lock_mutex_is_owner()); } @@ -182,7 +183,7 @@ { if (lock_sys.is_writer()) return; - ut_ad(lock_sys.readers); + ut_ad(lock_sys.is_holder()); ut_ad(latch(cell_get(id.fold()))->is_locked()); } @@ -191,7 +192,7 @@ { if (is_writer()) return; - ut_ad(lock_sys.readers); + ut_ad(lock_sys.is_holder()); ut_ad(hash_table::latch(const_cast(&cell))->is_locked()); } #endif @@ -295,7 +296,6 @@ if (tortoise == hare) { ut_ad(l > 1); - lock_sys.deadlocks++; /* Note: Normally, trx should be part of any deadlock cycle that is found. However, if innodb_deadlock_detect=OFF had been in effect in the past, it is possible that trx will be waiting @@ -426,13 +426,10 @@ { mysql_mutex_assert_not_owner(&wait_mutex); latch.wr_lock(file, line); - ut_ad(!writer.exchange(pthread_self(), std::memory_order_relaxed)); } /** Release exclusive lock_sys.latch */ void lock_sys_t::wr_unlock() { - ut_ad(writer.exchange(0, std::memory_order_relaxed) == - pthread_self()); latch.wr_unlock(); } @@ -441,15 +438,11 @@ { mysql_mutex_assert_not_owner(&wait_mutex); latch.rd_lock(file, line); - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_d(readers.fetch_add(1, std::memory_order_relaxed)); } /** Release shared lock_sys.latch */ void lock_sys_t::rd_unlock() { - ut_ad(!writer.load(std::memory_order_relaxed)); - ut_ad(readers.fetch_sub(1, std::memory_order_relaxed)); latch.rd_unlock(); } #endif @@ -509,8 +502,10 @@ @param[in] lock_rec other waiting record lock @param[in] trx trx requesting conflicting record lock +@param[in] type_mode lock type mode of requesting trx */ -static void wsrep_assert_no_bf_bf_wait(const lock_t *lock, const trx_t *trx) +static void wsrep_assert_no_bf_bf_wait(const lock_t *lock, const trx_t *trx, + const unsigned type_mode = LOCK_NONE) { ut_ad(!lock->is_table()); lock_sys.assert_locked(*lock); @@ -552,6 +547,15 @@ return; } + if (type_mode != LOCK_NONE) + ib::error() << " Requested lock " + << ((type_mode & LOCK_TABLE) ? "on table " : " on record ") + << ((type_mode & LOCK_WAIT) ? " WAIT " : " ") + << ((type_mode & LOCK_GAP) ? " GAP " : " ") + << ((type_mode & LOCK_REC_NOT_GAP) ? " RECORD " : " ") + << ((type_mode & LOCK_INSERT_INTENTION) ? " INSERT INTENTION " : " ") + << ((type_mode & LOCK_X) ? " LOCK_X " : " LOCK_S "); + mtr_t mtr; ib::error() << "Conflicting lock on table: " @@ -588,6 +592,80 @@ << " query: " << wsrep_thd_query(trx.mysql_thd); return true; } + +/** Checks if a lock request for a new lock has to wait for request + lock2 in Galera. +@param trx trx of new lock +@param type_mode precise mode of the new lock + to set: LOCK_S or LOCK_X, possibly + ORed to LOCK_GAP or LOCK_REC_NOT_GAP, + LOCK_INSERT_INTENTION. +@param lock2 another record lock; NOTE that + it is assumed that this has a lock bit + set on the same record as in the new + lock we are setting. +@return TRUE if new lock has to wait for lock2 to be removed */ + +ATTRIBUTE_NOINLINE ATTRIBUTE_COLD +bool lock_rec_has_to_wait_wsrep(const trx_t *trx, + const unsigned type_mode, + const lock_t *lock2) +{ + const trx_t* trx2= lock2->trx; + + if (trx->is_wsrep_UK_scan() && + wsrep_thd_is_BF(trx2->mysql_thd, false)) + { + /* New lock request from a transaction is using unique key + scan and this transaction is a wsrep high priority transaction + (brute force). If conflicting transaction is also wsrep high + priority transaction we should avoid lock conflict because + ordering of these transactions is already decided and + conflicting transaction will be later replayed. */ + + return false; + } + + if (wsrep_thd_is_BF(trx->mysql_thd, false) && + wsrep_thd_is_BF(trx2->mysql_thd, false)) + { + /* Both transactions are high priority transactions. */ + + if (((type_mode & LOCK_S) && lock2->is_insert_intention()) || + ((type_mode & LOCK_INSERT_INTENTION) && lock2->mode() == LOCK_S)) + { + ut_ad(!wsrep_thd_is_local(trx->mysql_thd)); + ut_ad(!wsrep_thd_is_local(trx2->mysql_thd)); + + /* High priority applier transaction might take S-locks to + conflicting primary/unique key records and those local + transactions are BF-killed. However, these S-locks + are released at commit time. Therefore, high priority + applier transaction when requesting insert intention (II-lock) + lock for primary/unique index might notice conflicting + S-lock. Certification makes sure that applier transactions + do not insert duplicate keys and so we can allow + S-lock and II-lock. */ + return false; + } + + if (wsrep_thd_order_before(trx->mysql_thd, trx2->mysql_thd)) + { + /* If two high priority threads have lock conflict, we look at the + order of these transactions and honor the earlier transaction. */ + + return false; + } + + /* We very well can let bf to wait normally as other + BF will be replayed in case of conflict. For debug + builds we will do additional sanity checks to catch + unsupported bf wait if any. */ + ut_d(wsrep_assert_no_bf_bf_wait(lock2, trx, type_mode)); + } + + return true; +} #endif /* WITH_WSREP */ /*********************************************************************//** @@ -697,31 +775,8 @@ #endif /* HAVE_REPLICATION */ #ifdef WITH_WSREP - /* New lock request from a transaction is using unique key - scan and this transaction is a wsrep high priority transaction - (brute force). If conflicting transaction is also wsrep high - priority transaction we should avoid lock conflict because - ordering of these transactions is already decided and - conflicting transaction will be later replayed. */ - if (trx->is_wsrep_UK_scan() - && wsrep_thd_is_BF(lock2->trx->mysql_thd, false)) { - return false; - } - - /* if BF-BF conflict, we have to look at write set order */ - if (trx->is_wsrep() && - (type_mode & LOCK_MODE_MASK) == LOCK_X && - (lock2->type_mode & LOCK_MODE_MASK) == LOCK_X && - wsrep_thd_order_before(trx->mysql_thd, - lock2->trx->mysql_thd)) { - return false; - } - - /* We very well can let bf to wait normally as other - BF will be replayed in case of conflict. For debug - builds we will do additional sanity checks to catch - unsupported bf wait if any. */ - ut_d(wsrep_assert_no_bf_bf_wait(lock2, trx)); + if (trx->is_wsrep()) + return lock_rec_has_to_wait_wsrep(trx, type_mode, lock2); #endif /* WITH_WSREP */ return true; @@ -976,8 +1031,31 @@ for (lock_t *lock= UT_LIST_GET_FIRST(table->locks); lock; lock= UT_LIST_GET_NEXT(un_member.tab_lock.locks, lock)) { - /* if victim has also BF status, but has earlier seqno, we have to wait */ - if (lock->trx != trx && + /* Victim trx needs to be different from BF trx and it has to have a + THD so that we can kill it. Victim might not have THD in two cases: + + (1) An incomplete transaction that was recovered from undo logs + on server startup (and not yet rolled back). + + (2) Transaction that is in XA PREPARE state and whose client + connection was disconnected. + + Neither of these can complete before lock_wait_wsrep() releases + lock_sys.latch. + + (1) trx_t::commit_in_memory() is clearing both + trx_t::state and trx_t::is_recovered before it invokes + lock_release(trx_t*) (which would be blocked by the exclusive + lock_sys.latch that we are holding here). Hence, it is not + possible to write a debug assertion to document this scenario. + + (2) If is in XA PREPARE state, it would eventually be rolled + back and the lock conflict would be resolved when an XA COMMIT + or XA ROLLBACK statement is executed in some other connection. + + If victim has also BF status, but has earlier seqno, we have to wait. + */ + if (lock->trx != trx && lock->trx->mysql_thd && !(wsrep_thd_is_BF(lock->trx->mysql_thd, false) && wsrep_thd_order_before(lock->trx->mysql_thd, trx->mysql_thd))) { @@ -1009,8 +1087,11 @@ lock= lock_rec_get_next(heap_no, lock); do { - /* if victim has also BF status, but has earlier seqno, we have to wait */ - if (lock->trx != trx && + /* This is similar case as above except here we have + record-locks instead of table locks. See details + from comment above. + */ + if (lock->trx != trx && lock->trx->mysql_thd && !(wsrep_thd_is_BF(lock->trx->mysql_thd, false) && wsrep_thd_order_before(lock->trx->mysql_thd, trx->mysql_thd))) { @@ -1036,8 +1117,12 @@ std::vector> victim_id; for (trx_t *v : victims) + { + /* Victim must have THD */ + ut_ad(v->mysql_thd); victim_id.emplace_back(std::pair {thd_get_thread_id(v->mysql_thd), v->id}); + } DBUG_EXECUTE_IF("sync.before_wsrep_thd_abort", { @@ -1218,6 +1303,13 @@ type_mode = type_mode & ~(LOCK_GAP | LOCK_REC_NOT_GAP); } + /* Extra bitmap size in bytes over and above the current number of + records when a record lock is created. 8 x LOCK_PAGE_DEFAULT_BITMAP_SIZE + extra record locks of same type for newly inserted records can be added + without needing to create a new lock object. Useful when the number of + records in a page is growing. */ + static constexpr size_t LOCK_PAGE_DEFAULT_BITMAP_SIZE = 8; + if (UNIV_LIKELY(!(type_mode & (LOCK_PREDICATE | LOCK_PRDT_PAGE)))) { n_bytes = (page_dir_get_n_heap(page) + 7) / 8; } else { @@ -1246,13 +1338,19 @@ ut_ad(trx->mutex_is_owner()); ut_ad(trx->state != TRX_STATE_NOT_STARTED); + auto cached_bytes = sizeof *trx->lock.rec_pool - sizeof *lock; + if (trx->lock.rec_cached >= UT_ARR_SIZE(trx->lock.rec_pool) - || sizeof *lock + n_bytes > sizeof *trx->lock.rec_pool) { + || n_bytes > cached_bytes) { + n_bytes += LOCK_PAGE_DEFAULT_BITMAP_SIZE; lock = static_cast( mem_heap_alloc(trx->lock.lock_heap, sizeof *lock + n_bytes)); } else { lock = &trx->lock.rec_pool[trx->lock.rec_cached++].lock; + /* Use all the extra bytes for lock bitmap. */ + ut_ad(n_bytes <= cached_bytes); + n_bytes = cached_bytes; } lock->trx = trx; @@ -1380,6 +1478,11 @@ const trx_t* trx) /*!< in: transaction */ { lock_sys.rec_hash.assert_locked(lock->un_member.rec_lock.page_id); + DBUG_EXECUTE_IF("innodb_skip_lock_bitmap", { + if (!trx->in_rollback) { + return nullptr; + } + }); for (/* No op */; lock != NULL; @@ -1724,14 +1827,6 @@ if (heap_no < lock_rec_get_n_bits(lock) && (p[bit_offset] & bit_mask) && lock_has_to_wait(wait_lock, lock)) { -#ifdef WITH_WSREP - if (lock->trx->is_wsrep() && - wsrep_thd_order_before(wait_lock->trx->mysql_thd, - lock->trx->mysql_thd)) { - /* don't wait for another BF lock */ - continue; - } -#endif return(lock); } } @@ -3815,6 +3910,9 @@ } lock_sys.rd_unlock(); +#ifdef WITH_WSREP + DEBUG_SYNC_C("after_lock_table_for_trx"); +#endif return err; } @@ -3940,6 +4038,8 @@ dberr_t lock_table_for_trx(dict_table_t *table, trx_t *trx, lock_mode mode, bool no_wait) { + ut_ad(!dict_sys.frozen()); + mem_heap_t *heap= mem_heap_create(512); sel_node_t *node= sel_node_create(heap); que_thr_t *thr= pars_complete_graph_for_exec(node, trx, heap, nullptr); @@ -3976,6 +4076,67 @@ return err; } +/** Lock the child tables of a table. +@param table parent table +@param trx transaction +@return error code */ +dberr_t lock_table_children(dict_table_t *table, trx_t *trx) +{ + MDL_context *mdl_context= + static_cast(thd_mdl_context(trx->mysql_thd)); + ut_ad(mdl_context); + struct table_mdl{dict_table_t* table; MDL_ticket *mdl;}; + std::vector children; + children.emplace_back(table_mdl{table, nullptr}); + + dberr_t err= DB_SUCCESS; + dict_sys.freeze(SRW_LOCK_CALL); + + rescan: + for (auto f : table->referenced_set) + if (dict_table_t *child= f->foreign_table) + { + if (std::find_if(children.begin(), children.end(), + [&](const table_mdl &c){ return c.table == child; }) != + children.end()) + continue; /* We already acquired MDL on this child table. */ + MDL_ticket *mdl= nullptr; + child->acquire(); + child= dict_acquire_mdl_shared(child, mdl_context, &mdl, + DICT_TABLE_OP_NORMAL); + if (child) + { + if (!mdl) + child->release(); + children.emplace_back(table_mdl{child, mdl}); + goto rescan; + } + err= DB_LOCK_WAIT_TIMEOUT; + break; + } + dict_sys.unfreeze(); + + if (err == DB_SUCCESS) + for (const table_mdl &child : children) + if (child.mdl) + if ((err= lock_table_for_trx(child.table, trx, LOCK_X)) != DB_SUCCESS) + break; + + dict_sys.freeze(SRW_LOCK_CALL); + for (table_mdl &child : children) + { + if (child.mdl) + { + child.table->release(); + mdl_context->release_lock(child.mdl); + } + } + dict_sys.unfreeze(); + + return err; +} + + /** Exclusively lock the data dictionary tables. @param trx dictionary transaction @return error code @@ -4125,7 +4286,7 @@ ulint count= 1000; /* We will not attempt hardware lock elision (memory transaction) here. Both lock_rec_dequeue_from_page() and lock_table_dequeue() - would likely lead to a memory transaction due to a system call, to + would likely lead to a memory transaction abort due to a system call, to wake up a waiting transaction. */ lock_sys.rd_lock(SRW_LOCK_CALL); trx->mutex_lock(); @@ -4295,28 +4456,82 @@ } } -/** Reset lock bit for supremum and rebuild waiting queue. +/** Reset a lock bit and rebuild waiting queue. @param cell rec hash cell of in_lock @param lock the lock with supemum bit set */ -static void lock_rec_unlock_supremum(hash_cell_t &cell, lock_t *lock) +static void lock_rec_unlock(hash_cell_t &cell, lock_t *lock, ulint heap_no) { - ut_ad(lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)); + ut_ad(lock_rec_get_nth_bit(lock, heap_no)); #ifdef SAFE_MUTEX ut_ad(!mysql_mutex_is_owner(&lock_sys.wait_mutex)); #endif /* SAFE_MUTEX */ ut_ad(!lock->is_table()); ut_ad(lock_sys.is_writer() || lock->trx->mutex_is_owner()); - lock_rec_reset_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM); + lock_rec_reset_nth_bit(lock, heap_no); - lock_t *first_lock= lock_sys_t::get_first( - cell, lock->un_member.rec_lock.page_id, PAGE_HEAP_NO_SUPREMUM); + lock_t *first_lock= + lock_sys_t::get_first(cell, lock->un_member.rec_lock.page_id, heap_no); lock_rec_rebuild_waiting_queue( #if defined(UNIV_DEBUG) || !defined(DBUG_OFF) lock->trx, #endif /* defined(UNIV_DEBUG) || !defined(DBUG_OFF) */ - cell, first_lock, PAGE_HEAP_NO_SUPREMUM); + cell, first_lock, heap_no); +} + +/** Release locks to unmodified records on a clustered index page. +@param cell lock_sys.rec_hash cell of lock +@param lock record lock +@param offsets storage for rec_get_offsets() +@param heap storage for rec_get_offsets() +@param mtr mini-transaction (will be started and committed) */ +static void lock_rec_unlock_unmodified(hash_cell_t &cell, lock_t *lock, + rec_offs *&offsets, mem_heap_t *&heap, + mtr_t &mtr) +{ + ut_ad(!lock->is_waiting()); + + dict_index_t *const index= lock->index; + + mtr.start(); + if (buf_block_t *block= + btr_block_get(*index, lock->un_member.rec_lock.page_id.page_no(), + RW_S_LATCH, true, &mtr)) + { + if (UNIV_UNLIKELY(!page_is_leaf(block->page.frame))) + { + ut_ad("corrupted lock system" == 0); + goto func_exit; + } + + for (ulint i= PAGE_HEAP_NO_USER_LOW; i < lock_rec_get_n_bits(lock); ++i) + { + if (!lock_rec_get_nth_bit(lock, i)); + else if (const rec_t *rec= + page_find_rec_with_heap_no(block->page.frame, i)) + { + if (index->is_clust()) + { + if (trx_read_trx_id(rec + row_trx_id_offset(rec, index)) == + lock->trx->id) + continue; + unlock_rec: + lock_rec_unlock(cell, lock, i); + } + else + { + offsets= rec_get_offsets(rec, index, offsets, index->n_core_fields, + ULINT_UNDEFINED, &heap); + if (lock->trx != + lock_sec_rec_some_has_impl(lock->trx, rec, index, offsets)) + goto unlock_rec; + } + } + } + } +func_exit: + mtr.commit(); } /** Release non-exclusive locks on XA PREPARE, @@ -4334,6 +4549,12 @@ DBUG_ASSERT(trx->state == TRX_STATE_PREPARED); bool all_released= true; + mtr_t mtr; + rec_offs offsets_[REC_OFFS_NORMAL_SIZE]; + rec_offs *offsets= offsets_; + mem_heap_t *heap= nullptr; + rec_offs_init(offsets_); + lock_sys.rd_lock(SRW_LOCK_CALL); trx->mutex_lock(); @@ -4350,20 +4571,24 @@ if (!lock->is_table()) { ut_ad(!lock->index->table->is_temporary()); - bool supremum_bit = lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM); - bool rec_granted_exclusive_not_gap = + bool supremum_bit= lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM); + bool rec_granted_exclusive_not_gap= lock->is_rec_granted_exclusive_not_gap(); if (!supremum_bit && rec_granted_exclusive_not_gap) continue; - auto &lock_hash= lock_sys.hash_get(lock->type_mode); - auto cell= lock_hash.cell_get(lock->un_member.rec_lock.page_id.fold()); + if (UNIV_UNLIKELY(lock->type_mode & (LOCK_PREDICATE | LOCK_PRDT_PAGE))) + continue; /* SPATIAL INDEX locking is broken. */ + auto cell= + lock_sys.rec_hash.cell_get(lock->un_member.rec_lock.page_id.fold()); auto latch= lock_sys_t::hash_table::latch(cell); if (latch->try_acquire()) { if (!rec_granted_exclusive_not_gap) lock_rec_dequeue_from_page(lock, false); else if (supremum_bit) - lock_rec_unlock_supremum(*cell, lock); + lock_rec_unlock(*cell, lock, PAGE_HEAP_NO_SUPREMUM); + else + lock_rec_unlock_unmodified(*cell, lock, offsets, heap, mtr); latch->release(); } else @@ -4396,9 +4621,43 @@ lock_sys.rd_unlock(); trx->mutex_unlock(); + if (UNIV_LIKELY_NULL(heap)) + mem_heap_free(heap); return all_released; } +/*********************************************************************//** +Removes table locks of the transaction on a table to be dropped. */ +static +void +lock_trx_table_locks_remove( +/*========================*/ + const lock_t* lock_to_remove) /*!< in: lock to remove */ +{ + trx_t* trx = lock_to_remove->trx; + + ut_ad(lock_to_remove->is_table()); + lock_sys.assert_locked(*lock_to_remove->un_member.tab_lock.table); + ut_ad(trx->mutex_is_owner()); + + for (lock_list::iterator it = trx->lock.table_locks.begin(), + end = trx->lock.table_locks.end(); it != end; ++it) { + const lock_t* lock = *it; + + ut_ad(!lock || trx == lock->trx); + ut_ad(!lock || lock->is_table()); + ut_ad(!lock || lock->un_member.tab_lock.table); + + if (lock == lock_to_remove) { + *it = NULL; + return; + } + } + + /* Lock must exist in the vector. */ + ut_error; +} + /** Release non-exclusive locks on XA PREPARE, and release possible other transactions waiting because of these locks. */ void lock_release_on_prepare(trx_t *trx) @@ -4409,52 +4668,72 @@ if (lock_release_on_prepare_try(trx)) return; - LockMutexGuard g{SRW_LOCK_CALL}; - trx->mutex_lock(); + mtr_t mtr; + rec_offs offsets_[REC_OFFS_NORMAL_SIZE]; + rec_offs *offsets= offsets_; + mem_heap_t *heap= nullptr; + + rec_offs_init(offsets_); - for (lock_t *prev, *lock= UT_LIST_GET_LAST(trx->lock.trx_locks); lock; - lock= prev) { - ut_ad(lock->trx == trx); - prev= UT_LIST_GET_PREV(trx_locks, lock); - if (!lock->is_table()) + LockMutexGuard g{SRW_LOCK_CALL}; + trx->mutex_lock(); + + for (lock_t *prev, *lock= UT_LIST_GET_LAST(trx->lock.trx_locks); lock; + lock= prev) { - ut_ad(!lock->index->table->is_temporary()); - if (!lock->is_rec_granted_exclusive_not_gap()) - lock_rec_dequeue_from_page(lock, false); - else if (lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)) + ut_ad(lock->trx == trx); + prev= UT_LIST_GET_PREV(trx_locks, lock); + if (!lock->is_table()) { - auto &lock_hash= lock_sys.hash_get(lock->type_mode); - auto cell= lock_hash.cell_get(lock->un_member.rec_lock.page_id.fold()); - lock_rec_unlock_supremum(*cell, lock); + ut_ad(!lock->index->table->is_temporary()); + if (!lock->is_rec_granted_exclusive_not_gap()) + lock_rec_dequeue_from_page(lock, false); + else if (UNIV_UNLIKELY(lock->type_mode & + (LOCK_PREDICATE | LOCK_PRDT_PAGE))) + /* SPATIAL INDEX locking is broken. */; + else + { + auto cell= lock_sys.rec_hash.cell_get(lock->un_member.rec_lock. + page_id.fold()); + if (lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)) + lock_rec_unlock(*cell, lock, PAGE_HEAP_NO_SUPREMUM); + else + { + ut_ad(lock->trx->isolation_level > TRX_ISO_READ_COMMITTED || + /* Insert-intention lock is valid for supremum for isolation + level > TRX_ISO_READ_COMMITTED */ + lock->mode() == LOCK_X || + !lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)); + lock_rec_unlock_unmodified(*cell, lock, offsets, heap, mtr); + } + } } else - ut_ad(lock->trx->isolation_level > TRX_ISO_READ_COMMITTED || - /* Insert-intention lock is valid for supremum for isolation - level > TRX_ISO_READ_COMMITTED */ - lock->mode() == LOCK_X || - !lock_rec_get_nth_bit(lock, PAGE_HEAP_NO_SUPREMUM)); - } - else - { - ut_d(dict_table_t *table= lock->un_member.tab_lock.table); - ut_ad(!table->is_temporary()); - switch (lock->mode()) { - case LOCK_IS: - case LOCK_S: - lock_table_dequeue(lock, false); - break; - case LOCK_IX: - case LOCK_X: - ut_ad(table->id >= DICT_HDR_FIRST_ID || trx->dict_operation); - /* fall through */ - default: - break; + { + ut_d(dict_table_t *table= lock->un_member.tab_lock.table); + ut_ad(!table->is_temporary()); + switch (lock->mode()) { + case LOCK_IS: + case LOCK_S: + lock_table_dequeue(lock, false); + lock_trx_table_locks_remove(lock); + break; + case LOCK_IX: + case LOCK_X: + ut_ad(table->id >= DICT_HDR_FIRST_ID || trx->dict_operation); + /* fall through */ + default: + break; + } } } } trx->mutex_unlock(); + + if (UNIV_LIKELY_NULL(heap)) + mem_heap_free(heap); } /** Release locks on a table whose creation is being rolled back */ @@ -4491,38 +4770,6 @@ trx->mutex_unlock(); } -/*********************************************************************//** -Removes table locks of the transaction on a table to be dropped. */ -static -void -lock_trx_table_locks_remove( -/*========================*/ - const lock_t* lock_to_remove) /*!< in: lock to remove */ -{ - trx_t* trx = lock_to_remove->trx; - - ut_ad(lock_to_remove->is_table()); - lock_sys.assert_locked(*lock_to_remove->un_member.tab_lock.table); - ut_ad(trx->mutex_is_owner()); - - for (lock_list::iterator it = trx->lock.table_locks.begin(), - end = trx->lock.table_locks.end(); it != end; ++it) { - const lock_t* lock = *it; - - ut_ad(!lock || trx == lock->trx); - ut_ad(!lock || lock->is_table()); - ut_ad(!lock || lock->un_member.tab_lock.table); - - if (lock == lock_to_remove) { - *it = NULL; - return; - } - } - - /* Lock must exist in the vector. */ - ut_error; -} - /*===================== VALIDATION AND DEBUGGING ====================*/ /** Print info of a table lock. @@ -4768,7 +5015,7 @@ if (const lock_t* wait_lock = trx->lock.wait_lock) { const my_hrtime_t suspend_time= trx->lock.suspend_time; fprintf(file, - "------- TRX HAS BEEN WAITING %llu ns" + "------- TRX HAS BEEN WAITING %llu us" " FOR THIS LOCK TO BE GRANTED:\n", now.val - suspend_time.val); @@ -5255,8 +5502,10 @@ } } -static my_bool lock_validate_table_locks(rw_trx_hash_element_t *element, void*) + +static my_bool lock_validate_table_locks(void *el, void*) { + rw_trx_hash_element_t *element= static_cast(el); lock_sys.assert_locked(); element->mutex.wr_lock(); if (element->trx) @@ -5414,47 +5663,43 @@ return err; } -/*********************************************************************//** -Creates an explicit record lock for a running transaction that currently only -has an implicit lock on the record. The transaction instance must have a -reference count > 0 so that it can't be committed and freed before this -function has completed. */ -static -bool -lock_rec_convert_impl_to_expl_for_trx( -/*==================================*/ - trx_t* trx, /*!< in/out: active transaction */ - const page_id_t id, /*!< in: page identifier */ - const rec_t* rec, /*!< in: user record on page */ - dict_index_t* index) /*!< in: index of record */ +/** Create an explicit record lock for a transaction that currently only +has an implicit lock on the record. +@param trx referenced, active transaction, or nullptr +@param id page identifier +@param rec record in the page +@param index the index B-tree that the record belongs to +@return trx, with the reference released */ +static trx_t *lock_rec_convert_impl_to_expl_for_trx(trx_t *trx, + const page_id_t id, + const rec_t *rec, + dict_index_t *index) { - if (!trx) - return false; + if (trx) + { + ut_ad(trx->is_referenced()); + ut_ad(page_rec_is_leaf(rec)); + ut_ad(!rec_is_metadata(rec, *index)); - ut_ad(trx->is_referenced()); - ut_ad(page_rec_is_leaf(rec)); - ut_ad(!rec_is_metadata(rec, *index)); + ulint heap_no= page_rec_get_heap_no(rec); - DEBUG_SYNC_C("before_lock_rec_convert_impl_to_expl_for_trx"); - ulint heap_no= page_rec_get_heap_no(rec); + { + LockGuard g{lock_sys.rec_hash, id}; + trx->mutex_lock(); + ut_ad(!trx_state_eq(trx, TRX_STATE_NOT_STARTED)); - { - LockGuard g{lock_sys.rec_hash, id}; - trx->mutex_lock(); - ut_ad(!trx_state_eq(trx, TRX_STATE_NOT_STARTED)); + if (!trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) && + !lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, heap_no, + trx)) + lock_rec_add_to_queue(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, + page_align(rec), heap_no, index, trx, true); + } - if (!trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY) && - !lock_rec_has_expl(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, heap_no, - trx)) - lock_rec_add_to_queue(LOCK_X | LOCK_REC_NOT_GAP, g.cell(), id, - page_align(rec), heap_no, index, trx, true); + trx->release_reference(); + trx->mutex_unlock(); } - trx->mutex_unlock(); - trx->release_reference(); - - DEBUG_SYNC_C("after_lock_rec_convert_impl_to_expl_for_trx"); - return false; + return trx; } @@ -5468,10 +5713,10 @@ }; -static my_bool lock_rec_other_trx_holds_expl_callback( - rw_trx_hash_element_t *element, - lock_rec_other_trx_holds_expl_arg *arg) +static my_bool lock_rec_other_trx_holds_expl_callback(void *el, void *a) { + auto element= static_cast(el); + auto arg= static_cast(a); element->mutex.wr_lock(); if (element->trx) { @@ -5545,10 +5790,11 @@ @param[in] rec record on the leaf page @param[in] index the index of the record @param[in] offsets rec_get_offsets(rec,index) -@return whether caller_trx already holds an exclusive lock on rec */ +@return unsafe pointer to a transaction that held an exclusive lock on rec +@retval nullptr if no transaction held an exclusive lock */ template static -bool +const trx_t * lock_rec_convert_impl_to_expl( trx_t* caller_trx, page_id_t id, @@ -5572,10 +5818,10 @@ trx_id = lock_clust_rec_some_has_impl(rec, index, offsets); if (trx_id == 0) { - return false; + return nullptr; } if (UNIV_UNLIKELY(trx_id == caller_trx->id)) { - return true; + return caller_trx; } trx = trx_sys.find(caller_trx, trx_id); @@ -5586,7 +5832,7 @@ offsets); if (trx == caller_trx) { trx->release_reference(); - return true; + return trx; } ut_d(lock_rec_other_trx_holds_expl(caller_trx, trx, rec, id)); @@ -5631,11 +5877,18 @@ /* If a transaction has no explicit x-lock set on the record, set one for it */ - if (lock_rec_convert_impl_to_expl(thr_get_trx(thr), - block->page.id(), + trx_t *trx = thr_get_trx(thr); + if (const trx_t *owner = + lock_rec_convert_impl_to_expl(trx, block->page.id(), rec, index, offsets)) { - /* We already hold an implicit exclusive lock. */ - return DB_SUCCESS; + if (owner == trx) { + /* We already hold an exclusive lock. */ + return DB_SUCCESS; + } + + if (trx->snapshot_isolation && trx->read_view.is_open()) { + return DB_RECORD_CHANGED; + } } err = lock_rec_lock(true, LOCK_X | LOCK_REC_NOT_GAP, @@ -5798,12 +6051,19 @@ return DB_SUCCESS; } - if (!page_rec_is_supremum(rec) - && lock_rec_convert_impl_to_expl( - trx, block->page.id(), rec, index, offsets) - && gap_mode == LOCK_REC_NOT_GAP) { - /* We already hold an implicit exclusive lock. */ - return DB_SUCCESS; + if (page_rec_is_supremum(rec)) { + } else if (const trx_t *owner = + lock_rec_convert_impl_to_expl(trx, block->page.id(), + rec, index, offsets)) { + if (owner == trx) { + if (gap_mode == LOCK_REC_NOT_GAP) { + /* We already hold an exclusive lock. */ + return DB_SUCCESS; + } + } else if (trx->snapshot_isolation + && trx->read_view.is_open()) { + return DB_RECORD_CHANGED; + } } #ifdef WITH_WSREP @@ -5883,13 +6143,28 @@ ulint heap_no = page_rec_get_heap_no(rec); trx_t *trx = thr_get_trx(thr); - if (!lock_table_has(trx, index->table, LOCK_X) - && heap_no != PAGE_HEAP_NO_SUPREMUM - && lock_rec_convert_impl_to_expl(trx, id, - rec, index, offsets) - && gap_mode == LOCK_REC_NOT_GAP) { - /* We already hold an implicit exclusive lock. */ - return DB_SUCCESS; + if (lock_table_has(trx, index->table, LOCK_X) + || heap_no == PAGE_HEAP_NO_SUPREMUM) { + } else if (const trx_t *owner = + lock_rec_convert_impl_to_expl(trx, id, + rec, index, offsets)) { + if (owner == trx) { + if (gap_mode == LOCK_REC_NOT_GAP) { + /* We already hold an exclusive lock. */ + return DB_SUCCESS; + } + } else if (trx->snapshot_isolation + && trx->read_view.is_open()) { + return DB_RECORD_CHANGED; + } + } + + if (heap_no > PAGE_HEAP_NO_SUPREMUM && gap_mode != LOCK_GAP + && trx->snapshot_isolation + && trx->read_view.is_open() + && !trx->read_view.changes_visible( + trx_read_trx_id(rec + row_trx_id_offset(rec, index)))) { + return DB_RECORD_CHANGED; } dberr_t err = lock_rec_lock(false, gap_mode | mode, @@ -6117,7 +6392,7 @@ if (!table->lock_mutex_trylock()) { /* The correct latching order is: - lock_sys.latch, table->lock_mutex_lock(), lock_sys.wait_mutex. + lock_sys.latch, table->lock_latch, lock_sys.wait_mutex. Thus, we must release lock_sys.wait_mutex for a blocking wait. */ mysql_mutex_unlock(&lock_sys.wait_mutex); table->lock_mutex_lock(); @@ -6257,13 +6532,14 @@ /** Do an exhaustive check for any locks (table or rec) against the table. - @param[in] table check if there are any locks held on records in this table - or on the table itself + @param t check if there are any locks held on records in this table + or on the table itself */ -static my_bool lock_table_locks_lookup(rw_trx_hash_element_t *element, - const dict_table_t *table) +static my_bool lock_table_locks_lookup(void *el, void *t) { + auto element= static_cast(el); + const dict_table_t *table= static_cast(t); lock_sys.assert_locked(); element->mutex.wr_lock(); if (element->trx) @@ -6313,9 +6589,9 @@ else #endif { - table->lock_mutex_lock(); + table->lock_shared_lock(); len= UT_LIST_GET_LEN(table->locks); - table->lock_mutex_unlock(); + table->lock_shared_unlock(); } if (len) return true; @@ -6323,7 +6599,7 @@ { LockMutexGuard g{SRW_LOCK_CALL}; trx_sys.rw_trx_hash.iterate(lock_table_locks_lookup, - const_cast(table)); + static_cast(table)); } #endif /* UNIV_DEBUG */ return false; @@ -6552,6 +6828,7 @@ if (!cycle) goto func_exit; /* One of the transactions was already aborted. */ + lock_sys.deadlocks++; victim= cycle; undo_no_t victim_weight= calc_victim_weight(victim, trx); unsigned victim_pos= l; @@ -6656,6 +6933,7 @@ print(buf); } + DBUG_EXECUTE_IF("innodb_deadlock_victim_self", victim= trx;); ut_ad(victim->state == TRX_STATE_ACTIVE); /* victim->lock.was_chosen_as_deadlock_victim must always be set before diff -Nru mariadb-10.11.6/storage/innobase/log/log0log.cc mariadb-10.11.9/storage/innobase/log/log0log.cc --- mariadb-10.11.6/storage/innobase/log/log0log.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/log/log0log.cc 2024-08-03 07:29:59.000000000 +0000 @@ -69,9 +69,7 @@ void log_t::set_capacity() { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); /* Margin for the free space in the smallest log, before a new query step which modifies the database, is started */ @@ -100,6 +98,7 @@ /* LSN 0 and 1 are reserved; @see buf_page_t::oldest_modification_ */ lsn.store(FIRST_LSN, std::memory_order_relaxed); flushed_to_disk_lsn.store(FIRST_LSN, std::memory_order_relaxed); + need_checkpoint.store(true, std::memory_order_relaxed); write_lsn= FIRST_LSN; #ifndef HAVE_PMEM @@ -124,17 +123,16 @@ TRASH_ALLOC(flush_buf, buf_size); checkpoint_buf= static_cast(aligned_malloc(4096, 4096)); memset_aligned<4096>(checkpoint_buf, 0, 4096); + max_buf_free= buf_size / LOG_BUF_FLUSH_RATIO - LOG_BUF_FLUSH_MARGIN; #else ut_ad(!checkpoint_buf); ut_ad(!buf); ut_ad(!flush_buf); + max_buf_free= 1; #endif latch.SRW_LOCK_INIT(log_latch_key); - init_lsn_lock(); - - max_buf_free= buf_size / LOG_BUF_FLUSH_RATIO - LOG_BUF_FLUSH_MARGIN; - set_check_flush_or_checkpoint(); + lsn_lock.init(); last_checkpoint_lsn= FIRST_LSN; log_capacity= 0; @@ -143,7 +141,7 @@ next_checkpoint_lsn= 0; checkpoint_pending= false; - buf_free= 0; + set_buf_free(0); ut_ad(is_initialised()); #ifndef HAVE_PMEM @@ -175,11 +173,13 @@ ut_ad(is_opened()); if (dberr_t err= os_file_write_func(IORequestWrite, "ib_logfile0", m_file, buf.data(), offset, buf.size())) - ib::fatal() << "write(\"ib_logfile0\") returned " << err; + ib::fatal() << "write(\"ib_logfile0\") returned " << err + << ". Operating system error number " + << IF_WIN(GetLastError(), errno) << "."; } #ifdef HAVE_PMEM -# include +# include "cache.h" /** Attempt to memory map a file. @param file log file handle @@ -236,11 +236,10 @@ log.close(); mprotect(ptr, size_t(size), PROT_READ); buf= static_cast(ptr); -# if defined __linux__ || defined _WIN32 - set_block_size(CPU_LEVEL1_DCACHE_LINESIZE); -# endif + max_buf_free= 1; log_maybe_unbuffered= true; log_buffered= false; + mtr_t::finisher_update(); return true; } } @@ -264,6 +263,7 @@ TRASH_ALLOC(buf, buf_size); TRASH_ALLOC(flush_buf, buf_size); + max_buf_free= buf_size / LOG_BUF_FLUSH_RATIO - LOG_BUF_FLUSH_MARGIN; #endif #if defined __linux__ || defined _WIN32 @@ -271,12 +271,16 @@ log_buffered ? "Buffered log writes" : "File system buffers for log disabled", - block_size); + write_size); #endif + mtr_t::finisher_update(); #ifdef HAVE_PMEM - checkpoint_buf= static_cast(aligned_malloc(block_size, block_size)); - memset_aligned<64>(checkpoint_buf, 0, block_size); + ut_ad(ut_is_2pow(write_size)); + ut_ad(write_size >= 512); + ut_ad(write_size <= 4096); + checkpoint_buf= static_cast(aligned_malloc(write_size, write_size)); + memset_aligned<512>(checkpoint_buf, 0, write_size); return true; #endif } @@ -309,9 +313,7 @@ void log_t::create(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_write_locked()); -#endif + ut_ad(latch_have_wr()); ut_ad(!recv_no_log_write); ut_ad(is_latest()); ut_ad(this == &log_sys); @@ -328,12 +330,12 @@ { mprotect(buf, size_t(file_size), PROT_READ | PROT_WRITE); memset_aligned<4096>(buf, 0, 4096); - buf_free= START_OFFSET; + set_buf_free(START_OFFSET); } else #endif { - buf_free= 0; + set_buf_free(0); memset_aligned<4096>(flush_buf, 0, buf_size); memset_aligned<4096>(buf, 0, buf_size); } @@ -429,7 +431,7 @@ log_buffered ? "Buffered log writes" : "File system buffers for log disabled", - block_size); + write_size); } log_resize_release(); } @@ -462,11 +464,12 @@ resize_lsn.store(1, std::memory_order_relaxed); resize_target= 0; resize_log.m_file= - os_file_create_func(path.c_str(), - OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT, + os_file_create_func(path.c_str(), OS_FILE_CREATE, OS_FILE_NORMAL, OS_LOG_FILE, false, &success); if (success) { + ut_ad(!(size_t(file_size) & (write_size - 1))); + ut_ad(!(size_t(size) & (write_size - 1))); log_resize_release(); void *ptr= nullptr, *ptr2= nullptr; @@ -522,7 +525,7 @@ { memcpy_aligned<16>(resize_buf, buf, (buf_free + 15) & ~15); start_lsn= first_lsn + - (~lsn_t{get_block_size() - 1} & (write_lsn - first_lsn)); + (~lsn_t{write_size - 1} & (write_lsn - first_lsn)); } } resize_lsn.store(start_lsn, std::memory_order_relaxed); @@ -578,32 +581,30 @@ /** Write an aligned buffer to ib_logfile0. @param buf buffer to be written -@param len length of data to be written +@param length length of data to be written @param offset log file offset */ -static void log_write_buf(const byte *buf, size_t len, lsn_t offset) +static void log_write_buf(const byte *buf, size_t length, lsn_t offset) { ut_ad(write_lock.is_owner()); ut_ad(!recv_no_log_write); - ut_d(const size_t block_size_1= log_sys.get_block_size() - 1); + ut_d(const size_t block_size_1= log_sys.write_size - 1); ut_ad(!(offset & block_size_1)); - ut_ad(!(len & block_size_1)); + ut_ad(!(length & block_size_1)); ut_ad(!(size_t(buf) & block_size_1)); - ut_ad(len); + ut_ad(length); + + const lsn_t maximum_write_length{log_sys.file_size - offset}; + ut_ad(maximum_write_length <= log_sys.file_size - log_sys.START_OFFSET); - if (UNIV_LIKELY(offset + len <= log_sys.file_size)) + if (UNIV_UNLIKELY(length > maximum_write_length)) { -write: - log_sys.log.write(offset, {buf, len}); - return; + log_sys.log.write(offset, {buf, size_t(maximum_write_length)}); + length-= size_t(maximum_write_length); + buf+= size_t(maximum_write_length); + ut_ad(log_sys.START_OFFSET + length < offset); + offset= log_sys.START_OFFSET; } - - const size_t write_len= size_t(log_sys.file_size - offset); - log_sys.log.write(offset, {buf, write_len}); - len-= write_len; - buf+= write_len; - ut_ad(log_sys.START_OFFSET + len < offset); - offset= log_sys.START_OFFSET; - goto write; + log_sys.log.write(offset, {buf, length}); } /** Invoke commit_checkpoint_notify_ha() to notify that outstanding @@ -778,11 +779,12 @@ } #endif +ATTRIBUTE_COLD ATTRIBUTE_NOINLINE /** Write resize_buf to resize_log. @param length the used length of resize_buf */ -ATTRIBUTE_COLD void log_t::resize_write_buf(size_t length) noexcept +void log_t::resize_write_buf(size_t length) noexcept { - const size_t block_size_1= get_block_size() - 1; + const size_t block_size_1= write_size - 1; ut_ad(!(resize_target & block_size_1)); ut_ad(!(length & block_size_1)); ut_ad(length > block_size_1); @@ -802,7 +804,7 @@ } ut_a(os_file_write_func(IORequestWrite, "ib_logfile101", resize_log.m_file, - resize_flush_buf, offset, length) == DB_SUCCESS); + buf, offset, length) == DB_SUCCESS); } /** Write buf to ib_logfile0. @@ -810,11 +812,9 @@ @return the current log sequence number */ template inline lsn_t log_t::write_buf() noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_write_locked()); -#endif - ut_ad(!srv_read_only_mode); + ut_ad(latch_have_wr()); ut_ad(!is_pmem()); + ut_ad(!srv_read_only_mode); const lsn_t lsn{get_lsn(std::memory_order_relaxed)}; @@ -826,66 +826,91 @@ } else { + ut_ad(write_lock.is_owner()); ut_ad(!recv_no_log_write); write_lock.set_pending(lsn); ut_ad(write_lsn >= get_flushed_lsn()); - const size_t block_size_1{get_block_size() - 1}; - lsn_t offset{calc_lsn_offset(write_lsn) & ~lsn_t{block_size_1}}; + const size_t write_size_1{write_size - 1}; + ut_ad(ut_is_2pow(write_size)); + size_t length{buf_free.load(std::memory_order_relaxed)}; + lsn_t offset{calc_lsn_offset(write_lsn)}; + ut_ad(length >= (offset & write_size_1)); + ut_ad(write_size_1 >= 511); - DBUG_PRINT("ib_log", ("write " LSN_PF " to " LSN_PF " at " LSN_PF, - write_lsn, lsn, offset)); - const byte *write_buf{buf}; - size_t length{buf_free}; - ut_ad(length >= (calc_lsn_offset(write_lsn) & block_size_1)); - const size_t new_buf_free{length & block_size_1}; - buf_free= new_buf_free; - ut_ad(new_buf_free == ((lsn - first_lsn) & block_size_1)); + const byte *const write_buf{buf}; + offset&= ~lsn_t{write_size_1}; - if (new_buf_free) + if (length <= write_size_1) { + ut_ad(!((length ^ (size_t(lsn) - size_t(first_lsn))) & write_size_1)); + /* Keep filling the same buffer until we have more than one block. */ #if 0 /* TODO: Pad the last log block with dummy records. */ - buf_free= log_pad(lsn, get_block_size() - new_buf_free, - buf + new_buf_free, flush_buf); + buf_free= log_pad(lsn, (write_size_1 + 1) - length, + buf + length, flush_buf); ... /* TODO: Update the LSN and adjust other code. */ #else - /* The rest of the block will be written as garbage. - (We want to avoid memset() while holding mutex.) - This block will be overwritten later, once records beyond - the current LSN are generated. */ # ifdef HAVE_valgrind - MEM_MAKE_DEFINED(buf + length, get_block_size() - new_buf_free); - if (UNIV_LIKELY_NULL(resize_flush_buf)) - MEM_MAKE_DEFINED(resize_buf + length, get_block_size() - new_buf_free); + MEM_MAKE_DEFINED(buf + length, (write_size_1 + 1) - length); + if (UNIV_LIKELY_NULL(resize_buf)) + MEM_MAKE_DEFINED(resize_buf + length, (write_size_1 + 1) - length); # endif buf[length]= 0; /* allow recovery to catch EOF faster */ - length&= ~block_size_1; - memcpy_aligned<16>(flush_buf, buf + length, (new_buf_free + 15) & ~15); - if (UNIV_LIKELY_NULL(resize_flush_buf)) - memcpy_aligned<16>(resize_flush_buf, resize_buf + length, - (new_buf_free + 15) & ~15); - length+= get_block_size(); #endif + length= write_size_1 + 1; + } + else + { + const size_t new_buf_free{length & write_size_1}; + ut_ad(new_buf_free == ((lsn - first_lsn) & write_size_1)); + buf_free.store(new_buf_free, std::memory_order_relaxed); + + if (new_buf_free) + { + /* The rest of the block will be written as garbage. + (We want to avoid memset() while holding exclusive log_sys.latch) + This block will be overwritten later, once records beyond + the current LSN are generated. */ +#ifdef HAVE_valgrind + MEM_MAKE_DEFINED(buf + length, (write_size_1 + 1) - new_buf_free); + if (UNIV_LIKELY_NULL(resize_buf)) + MEM_MAKE_DEFINED(resize_buf + length, (write_size_1 + 1) - + new_buf_free); +#endif + buf[length]= 0; /* allow recovery to catch EOF faster */ + length&= ~write_size_1; + memcpy_aligned<16>(flush_buf, buf + length, (new_buf_free + 15) & ~15); + if (UNIV_LIKELY_NULL(resize_buf)) + memcpy_aligned<16>(resize_flush_buf, resize_buf + length, + (new_buf_free + 15) & ~15); + length+= write_size_1 + 1; + } + + std::swap(buf, flush_buf); + std::swap(resize_buf, resize_flush_buf); } - std::swap(buf, flush_buf); - std::swap(resize_buf, resize_flush_buf); write_to_log++; if (release_latch) latch.wr_unlock(); - if (UNIV_UNLIKELY(srv_shutdown_state > SRV_SHUTDOWN_INITIATED)) - { - service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, - "InnoDB log write: " LSN_PF, write_lsn); - } + DBUG_PRINT("ib_log", ("write " LSN_PF " to " LSN_PF " at " LSN_PF, + write_lsn, lsn, offset)); /* Do the write to the log file */ log_write_buf(write_buf, length, offset); + if (UNIV_LIKELY_NULL(resize_buf)) resize_write_buf(length); write_lsn= lsn; + + if (UNIV_UNLIKELY(srv_shutdown_state > SRV_SHUTDOWN_INITIATED)) + { + service_manager_extend_timeout(INNODB_EXTEND_TIMEOUT_INTERVAL, + "InnoDB log write: " LSN_PF, write_lsn); + } } + set_check_for_checkpoint(false); return lsn; } @@ -927,8 +952,9 @@ void log_write_up_to(lsn_t lsn, bool durable, const completion_callback *callback) { - ut_ad(!srv_read_only_mode); + ut_ad(!srv_read_only_mode || log_sys.buf_free_ok()); ut_ad(lsn != LSN_MAX); + ut_ad(lsn != 0); if (UNIV_UNLIKELY(recv_no_ibuf_operations)) { @@ -985,7 +1011,6 @@ @param durable whether to wait for a durable write to complete */ void log_buffer_flush_to_disk(bool durable) { - ut_ad(!srv_read_only_mode); log_write_up_to(log_sys.get_lsn(std::memory_order_acquire), durable); } @@ -1017,16 +1042,6 @@ #endif } -/******************************************************************** - -Tries to establish a big enough margin of free space in the log buffer, such -that a new log entry can be catenated without an immediate need for a flush. */ -ATTRIBUTE_COLD static void log_flush_margin() -{ - if (log_sys.buf_free > log_sys.max_buf_free) - log_buffer_flush_to_disk(false); -} - /****************************************************************//** Tries to establish a big enough margin of free space in the log, such that a new log entry can be catenated without an immediate need for a @@ -1034,12 +1049,12 @@ owns no synchronization objects! */ ATTRIBUTE_COLD static void log_checkpoint_margin() { - while (log_sys.check_flush_or_checkpoint()) + while (log_sys.check_for_checkpoint()) { log_sys.latch.rd_lock(SRW_LOCK_CALL); ut_ad(!recv_no_log_write); - if (!log_sys.check_flush_or_checkpoint()) + if (!log_sys.check_for_checkpoint()) { func_exit: log_sys.latch.rd_unlock(); @@ -1055,7 +1070,7 @@ #ifndef DBUG_OFF skip_checkpoint: #endif - log_sys.set_check_flush_or_checkpoint(false); + log_sys.set_check_for_checkpoint(false); goto func_exit; } @@ -1069,30 +1084,17 @@ } } -/** -Checks that there is enough free space in the log to start a new query step. -Flushes the log buffer or makes a new checkpoint if necessary. NOTE: this -function may only be called if the calling thread owns no synchronization -objects! */ -ATTRIBUTE_COLD void log_check_margins() -{ - do - { - log_flush_margin(); - log_checkpoint_margin(); - ut_ad(!recv_no_log_write); - } - while (log_sys.check_flush_or_checkpoint()); -} - /** Wait for a log checkpoint if needed. NOTE that this function may only be called while not holding any synchronization objects except dict_sys.latch. */ void log_free_check() { - ut_ad(!lock_sys.is_writer()); - if (log_sys.check_flush_or_checkpoint()) - log_check_margins(); + ut_ad(!lock_sys.is_holder()); + if (log_sys.check_for_checkpoint()) + { + ut_ad(!recv_no_log_write); + log_checkpoint_margin(); + } } extern void buf_resize_shutdown(); @@ -1311,6 +1313,7 @@ void log_t::close() { ut_ad(this == &log_sys); + ut_ad(!(buf_free & buf_free_LOCK)); if (!is_initialised()) return; close_file(); @@ -1328,7 +1331,7 @@ #endif latch.destroy(); - destroy_lsn_lock(); + lsn_lock.destroy(); recv_sys.close(); diff -Nru mariadb-10.11.6/storage/innobase/log/log0recv.cc mariadb-10.11.9/storage/innobase/log/log0recv.cc --- mariadb-10.11.6/storage/innobase/log/log0recv.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/log/log0recv.cc 2024-08-03 07:29:59.000000000 +0000 @@ -833,7 +833,21 @@ filename= tbl_name + 1; } } - space->add(filename, OS_FILE_CLOSED, size, false, false); + pfs_os_file_t handle= OS_FILE_CLOSED; + if (srv_operation == SRV_OPERATION_RESTORE) + { + /* During mariadb-backup --backup, a table could be renamed, + created and dropped, and we may be missing the file at this + point of --prepare. Try to create the file if it does not exist + already. If the file exists, we'll pass handle=OS_FILE_CLOSED + and the file will be opened normally in fil_space_t::acquire() + inside recv_sys_t::recover_deferred(). */ + bool success; + handle= os_file_create(innodb_data_file_key, filename, + OS_FILE_CREATE_SILENT, + OS_FILE_AIO, OS_DATA_FILE, false, &success); + } + space->add(filename, handle, size, false, false); space->recv_size= it->second.size; space->size_in_header= size; return space; @@ -1238,7 +1252,8 @@ file_name_t& f = p.first->second; - if (auto d = deferred_spaces.find(space_id)) { + auto d = deferred_spaces.find(space_id); + if (d) { if (deleted) { d->deleted = true; goto got_deleted; @@ -1311,7 +1326,16 @@ FILE_* record. */ ut_ad(space == NULL); - if (srv_force_recovery) { + if (srv_operation == SRV_OPERATION_RESTORE && d + && ftype == FILE_RENAME) { +rename: + d->file_name = fname.name; + f.name = fname.name; + break; + } + + if (srv_force_recovery + || srv_operation == SRV_OPERATION_RESTORE) { /* Without innodb_force_recovery, missing tablespaces will only be reported in @@ -1330,7 +1354,11 @@ break; case FIL_LOAD_DEFER: - /** Skip the deferred spaces + if (d && ftype == FILE_RENAME + && srv_operation == SRV_OPERATION_RESTORE) { + goto rename; + } + /* Skip the deferred spaces when lsn is already processed */ if (!if_exists) { deferred_spaces.add( @@ -1685,7 +1713,7 @@ std::string path{get_log_file_path()}; bool success; os_file_t file{os_file_create_func(path.c_str(), - OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, + OS_FILE_OPEN, OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode, &success)}; if (file == OS_FILE_CLOSED) @@ -1715,8 +1743,7 @@ { path= get_log_file_path(LOG_FILE_NAME_PREFIX).append(std::to_string(i)); file= os_file_create_func(path.c_str(), - OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT | - OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_SILENT, OS_FILE_NORMAL, OS_LOG_FILE, true, &success); if (file == OS_FILE_CLOSED) break; @@ -1735,20 +1762,6 @@ { if (wrong_size) return DB_CORRUPTION; - if (log_sys.next_checkpoint_lsn < 8204) - { - /* Before MDEV-14425, InnoDB had a minimum LSN of 8192+12=8204. - Likewise, mariadb-backup --prepare would create an empty - ib_logfile0 after applying the log. We will allow an upgrade - from such an empty log. - - If a user replaces the redo log with an empty file and the - FIL_PAGE_FILE_FLUSH_LSN field was zero in the system - tablespace (see SysTablespace::read_lsn_and_check_flags()) we - must refuse to start up. */ - sql_print_error("InnoDB: ib_logfile0 is empty, and LSN is unknown."); - return DB_CORRUPTION; - } lsn= log_sys.next_checkpoint_lsn; log_sys.format= log_t::FORMAT_3_23; goto upgrade; @@ -1760,7 +1773,7 @@ lsn= 0; buf= my_assume_aligned<4096>(log_sys.buf); if (!log_sys.is_pmem()) - if (dberr_t err= log_sys.log.read(0, {buf, 4096})) + if (dberr_t err= log_sys.log.read(0, {buf, log_sys.START_OFFSET})) return err; /* Check the header page checksum. There was no checksum in the first redo log format (version 0). */ @@ -1829,12 +1842,7 @@ for (size_t field= log_t::CHECKPOINT_1; field <= log_t::CHECKPOINT_2; field+= log_t::CHECKPOINT_2 - log_t::CHECKPOINT_1) { - if (log_sys.is_pmem()) - buf= log_sys.buf + field; - else - if (dberr_t err= log_sys.log.read(field, - {buf, log_sys.get_block_size()})) - return err; + buf= log_sys.buf + field; const lsn_t checkpoint_lsn{mach_read_from_8(buf)}; const lsn_t end_lsn{mach_read_from_8(buf + 8)}; if (checkpoint_lsn < first_lsn || end_lsn < checkpoint_lsn || @@ -2409,7 +2417,7 @@ { const size_t s(*this - start); ut_ad(s + len <= srv_page_size); - if (!log_sys.is_encrypted()) + if (!len || !log_sys.is_encrypted()) { if (start.ptr + s == ptr && ptr + len <= end()) return ptr; @@ -2505,11 +2513,9 @@ noexcept { restart: -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked() || + ut_ad(log_sys.latch_have_wr() || srv_operation == SRV_OPERATION_BACKUP || srv_operation == SRV_OPERATION_BACKUP_NO_DEFER); -#endif mysql_mutex_assert_owner(&mutex); ut_ad(log_sys.next_checkpoint_lsn); ut_ad(log_sys.is_latest()); @@ -2757,8 +2763,7 @@ case INIT_PAGE: last_offset= FIL_PAGE_TYPE; free_or_init_page: - if (store) - store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE); + store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE); if (UNIV_UNLIKELY(rlen != 0)) goto record_corrupted; copy_if_needed: @@ -2822,7 +2827,7 @@ { if (UNIV_UNLIKELY(rlen + last_offset > srv_page_size)) goto record_corrupted; - if (store && UNIV_UNLIKELY(!page_no) && file_checkpoint) + if (UNIV_UNLIKELY(!page_no) && file_checkpoint) { const bool has_size= last_offset <= FSP_HEADER_OFFSET + FSP_SIZE && last_offset + rlen >= FSP_HEADER_OFFSET + FSP_SIZE + 4; @@ -3205,7 +3210,7 @@ skipped_after_init = false; ut_ad(end_lsn == page_lsn); if (end_lsn != page_lsn) { - sql_print_warning( + sql_print_information( "InnoDB: The last skipped log record" " LSN " LSN_PF " is not equal to page LSN " LSN_PF, @@ -3866,6 +3871,30 @@ garbage_collect(); + for (auto id= srv_undo_tablespaces_open; id--;) + { + const trunc& t= truncated_undo_spaces[id]; + if (t.lsn) + { + /* The entire undo tablespace will be reinitialized by + innodb_undo_log_truncate=ON. Discard old log for all pages. + Even though we recv_sys_t::parse() already invoked trim(), + this will be needed in case recovery consists of multiple batches + (there was an invocation with !last_batch). */ + trim({id + srv_undo_space_id_start, 0}, t.lsn); + if (fil_space_t *space = fil_space_get(id + srv_undo_space_id_start)) + { + ut_ad(UT_LIST_GET_LEN(space->chain) == 1); + ut_ad(space->recv_size >= t.pages); + fil_node_t *file= UT_LIST_GET_FIRST(space->chain); + ut_ad(file->is_open()); + os_file_truncate(file->name, file->handle, + os_offset_t{space->recv_size} << + srv_page_size_shift, true); + } + } + } + if (!pages.empty()) { recv_no_ibuf_operations = !last_batch || @@ -3877,30 +3906,6 @@ apply_log_recs= true; - for (auto id= srv_undo_tablespaces_open; id--;) - { - const trunc& t= truncated_undo_spaces[id]; - if (t.lsn) - { - /* The entire undo tablespace will be reinitialized by - innodb_undo_log_truncate=ON. Discard old log for all pages. - Even though we recv_sys_t::parse() already invoked trim(), - this will be needed in case recovery consists of multiple batches - (there was an invocation with !last_batch). */ - trim({id + srv_undo_space_id_start, 0}, t.lsn); - if (fil_space_t *space = fil_space_get(id + srv_undo_space_id_start)) - { - ut_ad(UT_LIST_GET_LEN(space->chain) == 1); - ut_ad(space->recv_size >= t.pages); - fil_node_t *file= UT_LIST_GET_FIRST(space->chain); - ut_ad(file->is_open()); - os_file_truncate(file->name, file->handle, - os_offset_t{space->recv_size} << - srv_page_size_shift, true); - } - } - } - fil_system.extend_to_recv_size(); fil_space_t *space= nullptr; @@ -4009,10 +4014,9 @@ DBUG_ENTER("recv_scan_log"); ut_ad(log_sys.is_latest()); - const size_t block_size_1{log_sys.get_block_size() - 1}; + const size_t block_size_1{log_sys.write_size - 1}; mysql_mutex_lock(&recv_sys.mutex); - ut_d(recv_sys.after_apply= last_phase); if (!last_phase) recv_sys.clear(); else @@ -4038,9 +4042,7 @@ lsn_t rewound_lsn= 0; for (ut_d(lsn_t source_offset= 0);;) { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); #ifdef UNIV_DEBUG const bool wrap{source_offset + recv_sys.len == log_sys.file_size}; #endif @@ -4106,9 +4108,10 @@ const lsn_t end{recv_sys.file_checkpoint}; ut_ad(!end || end == recv_sys.lsn); + bool corrupt_fs= recv_sys.is_corrupt_fs(); mysql_mutex_unlock(&recv_sys.mutex); - if (!end) + if (!end && !corrupt_fs) { recv_sys.set_corrupt_log(); sql_print_error("InnoDB: Missing FILE_CHECKPOINT(" LSN_PF @@ -4193,7 +4196,7 @@ if (recv_sys.is_corrupt_log()) break; - if (recv_sys.offset < log_sys.get_block_size() && + if (recv_sys.offset < log_sys.write_size && recv_sys.lsn == recv_sys.scanned_lsn) goto got_eof; @@ -4221,6 +4224,7 @@ recv_sys.lsn= rewound_lsn; } func_exit: + ut_d(recv_sys.after_apply= last_phase); mysql_mutex_unlock(&recv_sys.mutex); DBUG_RETURN(!store); } @@ -4433,9 +4437,7 @@ static dberr_t recv_rename_files() { mysql_mutex_assert_owner(&recv_sys.mutex); -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); dberr_t err= DB_SUCCESS; @@ -4507,12 +4509,54 @@ return err; } +dberr_t recv_recovery_read_checkpoint() +{ + ut_ad(srv_operation <= SRV_OPERATION_EXPORT_RESTORED || + srv_operation == SRV_OPERATION_RESTORE || + srv_operation == SRV_OPERATION_RESTORE_EXPORT); + ut_d(mysql_mutex_lock(&buf_pool.mutex)); + ut_ad(UT_LIST_GET_LEN(buf_pool.LRU) == 0); + ut_ad(UT_LIST_GET_LEN(buf_pool.unzip_LRU) == 0); + ut_d(mysql_mutex_unlock(&buf_pool.mutex)); + + if (srv_force_recovery >= SRV_FORCE_NO_LOG_REDO) + { + sql_print_information("InnoDB: innodb_force_recovery=6" + " skips redo log apply"); + return DB_SUCCESS; + } + + log_sys.latch.wr_lock(SRW_LOCK_CALL); + dberr_t err= recv_sys.find_checkpoint(); + log_sys.latch.wr_unlock(); + return err; +} + +inline void log_t::set_recovered() noexcept +{ + ut_ad(get_flushed_lsn() == get_lsn()); + ut_ad(recv_sys.lsn == get_lsn()); + size_t offset{recv_sys.offset}; + if (!is_pmem()) + { + const size_t bs{log_sys.write_size}, bs_1{bs - 1}; + memmove_aligned<512>(buf, buf + (offset & ~bs_1), bs); + offset&= bs_1; + } +#ifdef HAVE_PMEM + else + mprotect(buf, size_t(file_size), PROT_READ | PROT_WRITE); +#endif + set_buf_free(offset); +} + /** Start recovering from a redo log checkpoint. of first system tablespace page @return error code or DB_SUCCESS */ dberr_t recv_recovery_from_checkpoint_start() { - bool rescan = false; + bool rescan = false; + dberr_t err = DB_SUCCESS; ut_ad(srv_operation <= SRV_OPERATION_EXPORT_RESTORED || srv_operation == SRV_OPERATION_RESTORE @@ -4525,20 +4569,12 @@ if (srv_force_recovery >= SRV_FORCE_NO_LOG_REDO) { sql_print_information("InnoDB: innodb_force_recovery=6" " skips redo log apply"); - return(DB_SUCCESS); + return err; } recv_sys.recovery_on = true; log_sys.latch.wr_lock(SRW_LOCK_CALL); - - dberr_t err = recv_sys.find_checkpoint(); - if (err != DB_SUCCESS) { -early_exit: - log_sys.latch.wr_unlock(); - return err; - } - log_sys.set_capacity(); /* Start reading the log from the checkpoint lsn. The variable @@ -4548,7 +4584,9 @@ ut_ad(recv_sys.pages.empty()); if (log_sys.format == log_t::FORMAT_3_23) { - goto early_exit; +early_exit: + log_sys.latch.wr_unlock(); + return err; } if (log_sys.is_latest()) { @@ -4569,6 +4607,9 @@ LSN_PF, recv_sys.lsn); goto err_exit; } + if (recv_sys.is_corrupt_fs()) { + goto err_exit; + } ut_ad(recv_sys.file_checkpoint); if (rewind) { recv_sys.lsn = log_sys.next_checkpoint_lsn; @@ -4607,9 +4648,9 @@ do { rescan = recv_scan_log(false); - ut_ad(!recv_sys.is_corrupt_fs()); - if (recv_sys.is_corrupt_log()) { + if (recv_sys.is_corrupt_log() || + recv_sys.is_corrupt_fs()) { goto err_exit; } @@ -4682,24 +4723,11 @@ } if (!srv_read_only_mode && log_sys.is_latest()) { - ut_ad(log_sys.get_flushed_lsn() == log_sys.get_lsn()); - ut_ad(recv_sys.lsn == log_sys.get_lsn()); - if (!log_sys.is_pmem()) { - const size_t bs_1{log_sys.get_block_size() - 1}; - const size_t ro{recv_sys.offset}; - recv_sys.offset &= bs_1; - memmove_aligned<64>(log_sys.buf, - log_sys.buf + (ro & ~bs_1), - log_sys.get_block_size()); -#ifdef HAVE_PMEM - } else { - mprotect(log_sys.buf, size_t(log_sys.file_size), - PROT_READ | PROT_WRITE); -#endif - } - log_sys.buf_free = recv_sys.offset; + log_sys.set_recovered(); if (recv_needed_recovery - && srv_operation <= SRV_OPERATION_EXPORT_RESTORED) { + && srv_operation <= SRV_OPERATION_EXPORT_RESTORED + && recv_sys.lsn - log_sys.next_checkpoint_lsn + < log_sys.log_capacity) { /* Write a FILE_CHECKPOINT marker as the first thing, before generating any other redo log. This ensures that subsequent crash recovery will be possible even @@ -4708,6 +4736,7 @@ } } + DBUG_EXECUTE_IF("before_final_redo_apply", goto err_exit;); mysql_mutex_lock(&recv_sys.mutex); if (UNIV_UNLIKELY(recv_sys.scanned_lsn != recv_sys.lsn) && log_sys.is_latest()) { @@ -4843,7 +4872,7 @@ } bool recv_dblwr_t::restore_first_page(uint32_t space_id, const char *name, - os_file_t file) + pfs_os_file_t file) { const page_id_t page_id(space_id, 0); const byte* page= find_page(page_id); @@ -4851,10 +4880,10 @@ { /* If the first page of the given user tablespace is not there in the doublewrite buffer, then the recovery is going to fail - now. Hence this is treated as error. */ - ib::error() - << "Corrupted page " << page_id << " of datafile '" - << name <<"' could not be found in the doublewrite buffer."; + now. Report error only when doublewrite buffer is not empty */ + if (pages.size()) + ib::error() << "Corrupted page " << page_id << " of datafile '" + << name << "' could not be found in the doublewrite buffer."; return true; } @@ -4868,3 +4897,58 @@ IORequestWrite, name, file, page, 0, physical_size) != DB_SUCCESS; } + +uint32_t recv_dblwr_t::find_first_page(const char *name, pfs_os_file_t file) +{ + os_offset_t file_size= os_file_get_size(file); + if (file_size != (os_offset_t) -1) + { + for (const page_t *page : pages) + { + uint32_t space_id= page_get_space_id(page); + byte *read_page= nullptr; + if (page_get_page_no(page) > 0 || space_id == 0) + { +next_page: + aligned_free(read_page); + continue; + } + uint32_t flags= mach_read_from_4( + FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page); + page_id_t page_id(space_id, 0); + size_t page_size= fil_space_t::physical_size(flags); + if (file_size < 4 * page_size) + goto next_page; + read_page= + static_cast(aligned_malloc(3 * page_size, page_size)); + /* Read 3 pages from the file and match the space id + with the space id which is stored in + doublewrite buffer page. */ + if (os_file_read(IORequestRead, file, read_page, page_size, + 3 * page_size, nullptr) != DB_SUCCESS) + goto next_page; + for (ulint j= 0; j <= 2; j++) + { + byte *cur_page= read_page + j * page_size; + if (buf_is_zeroes(span(cur_page, page_size))) + { + space_id= 0; + goto early_exit; + } + if (mach_read_from_4(cur_page + FIL_PAGE_OFFSET) != j + 1 || + memcmp(cur_page + FIL_PAGE_SPACE_ID, + page + FIL_PAGE_SPACE_ID, 4) || + buf_page_is_corrupted(false, cur_page, flags)) + goto next_page; + } + if (!restore_first_page(space_id, name, file)) + { +early_exit: + aligned_free(read_page); + return space_id; + } + break; + } + } + return 0; +} diff -Nru mariadb-10.11.6/storage/innobase/log/log0sync.cc mariadb-10.11.9/storage/innobase/log/log0sync.cc --- mariadb-10.11.6/storage/innobase/log/log0sync.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/log/log0sync.cc 2024-08-03 07:29:59.000000000 +0000 @@ -187,7 +187,7 @@ } const unsigned int MAX_SPINS = 1; /** max spins in acquire */ -thread_local group_commit_waiter_t thread_local_waiter; +static thread_local group_commit_waiter_t thread_local_waiter; static inline void do_completion_callback(const completion_callback* cb) { diff -Nru mariadb-10.11.6/storage/innobase/mtr/mtr0mtr.cc mariadb-10.11.9/storage/innobase/mtr/mtr0mtr.cc --- mariadb-10.11.6/storage/innobase/mtr/mtr0mtr.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/mtr/mtr0mtr.cc 2024-08-03 07:29:59.000000000 +0000 @@ -37,6 +37,31 @@ #include "srv0start.h" #include "log.h" #include "mariadb_stats.h" +#include "my_cpu.h" + +#ifdef HAVE_PMEM +void (*mtr_t::commit_logger)(mtr_t *, std::pair); +#endif +std::pair (*mtr_t::finisher)(mtr_t *, size_t); +unsigned mtr_t::spin_wait_delay; + +void mtr_t::finisher_update() +{ + ut_ad(log_sys.latch_have_wr()); +#ifdef HAVE_PMEM + if (log_sys.is_pmem()) + { + commit_logger= mtr_t::commit_log; + finisher= spin_wait_delay + ? mtr_t::finish_writer : mtr_t::finish_writer; + return; + } + commit_logger= mtr_t::commit_log; +#endif + finisher= + (spin_wait_delay + ? mtr_t::finish_writer : mtr_t::finish_writer); +} void mtr_memo_slot_t::release() const { @@ -82,9 +107,7 @@ inline buf_page_t *buf_pool_t::prepare_insert_into_flush_list(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(recv_recovery_is_on() || log_sys.latch.is_locked()); -#endif + ut_ad(recv_recovery_is_on() || log_sys.latch_have_any()); ut_ad(lsn >= log_sys.last_checkpoint_lsn); mysql_mutex_assert_owner(&flush_list_mutex); static_assert(log_t::FIRST_LSN >= 2, "compatibility"); @@ -234,7 +257,14 @@ if (block->page.oldest_modification() <= 1) { log_sys.latch.rd_lock(SRW_LOCK_CALL); - const lsn_t lsn= log_sys.last_checkpoint_lsn; + /* For unlogged mtrs (MTR_LOG_NO_REDO), we use the current system LSN. The + mtr that generated the LSN is either already committed or in mtr_t::commit. + Shared latch and relaxed atomics should be fine here as it is guaranteed + that both the current mtr and the mtr that generated the LSN would have + added the dirty pages to flush list before we access the minimum LSN during + checkpoint. log_checkpoint_low() acquires exclusive log_sys.latch before + commencing. */ + const lsn_t lsn= log_sys.get_lsn(); mysql_mutex_lock(&buf_pool.flush_list_mutex); buf_pool.insert_into_flush_list (buf_pool.prepare_insert_into_flush_list(lsn), block, lsn); @@ -308,149 +338,174 @@ m_memo.clear(); } -/** Commit a mini-transaction. */ -void mtr_t::commit() +inline lsn_t log_t::get_write_target() const { - ut_ad(is_active()); - ut_ad(!is_inside_ibuf()); + ut_ad(latch_have_any()); + if (UNIV_LIKELY(buf_free_ok())) + return 0; + /* The LSN corresponding to the end of buf is + write_lsn - (first_lsn & 4095) + buf_free, + but we use simpler arithmetics to return a smaller write target in + order to minimize waiting in log_write_up_to(). */ + ut_ad(max_buf_free >= 4096 * 4); + return write_lsn + max_buf_free / 2; +} - /* This is a dirty read, for debugging. */ - ut_ad(!m_modifications || !recv_no_log_write); - ut_ad(!m_modifications || m_log_mode != MTR_LOG_NONE); - ut_ad(!m_latch_ex); +template +void mtr_t::commit_log(mtr_t *mtr, std::pair lsns) +{ + size_t modified= 0; + const lsn_t write_lsn= pmem ? 0 : log_sys.get_write_target(); - if (m_modifications && (m_log_mode == MTR_LOG_NO_REDO || !m_log.empty())) + if (mtr->m_made_dirty) { - if (UNIV_UNLIKELY(!is_logged())) + auto it= mtr->m_memo.rbegin(); + + mysql_mutex_lock(&buf_pool.flush_list_mutex); + + buf_page_t *const prev= + buf_pool.prepare_insert_into_flush_list(lsns.first); + + while (it != mtr->m_memo.rend()) { - release_unlogged(); - goto func_exit; + const mtr_memo_slot_t &slot= *it++; + if (slot.type & MTR_MEMO_MODIFY) + { + ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY || + slot.type == MTR_MEMO_PAGE_SX_MODIFY); + modified++; + buf_block_t *b= static_cast(slot.object); + ut_ad(b->page.id() < end_page_id); + ut_d(const auto s= b->page.state()); + ut_ad(s > buf_page_t::FREED); + ut_ad(s < buf_page_t::READ_FIX); + ut_ad(mach_read_from_8(b->page.frame + FIL_PAGE_LSN) <= + mtr->m_commit_lsn); + mach_write_to_8(b->page.frame + FIL_PAGE_LSN, mtr->m_commit_lsn); + if (UNIV_LIKELY_NULL(b->page.zip.data)) + memcpy_aligned<8>(FIL_PAGE_LSN + b->page.zip.data, + FIL_PAGE_LSN + b->page.frame, 8); + buf_pool.insert_into_flush_list(prev, b, lsns.first); + } } - ut_ad(!srv_read_only_mode); - std::pair lsns{do_write()}; - process_freed_pages(); - size_t modified= 0; + ut_ad(modified); + buf_pool.flush_list_requests+= modified; + buf_pool.page_cleaner_wakeup(); + mysql_mutex_unlock(&buf_pool.flush_list_mutex); - if (m_made_dirty) + if (mtr->m_latch_ex) { - auto it= m_memo.rbegin(); - - mysql_mutex_lock(&buf_pool.flush_list_mutex); + log_sys.latch.wr_unlock(); + mtr->m_latch_ex= false; + } + else + log_sys.latch.rd_unlock(); - buf_page_t *const prev= - buf_pool.prepare_insert_into_flush_list(lsns.first); + mtr->release(); + } + else + { + if (mtr->m_latch_ex) + { + log_sys.latch.wr_unlock(); + mtr->m_latch_ex= false; + } + else + log_sys.latch.rd_unlock(); - while (it != m_memo.rend()) - { - const mtr_memo_slot_t &slot= *it++; + for (auto it= mtr->m_memo.rbegin(); it != mtr->m_memo.rend(); ) + { + const mtr_memo_slot_t &slot= *it++; + ut_ad(slot.object); + switch (slot.type) { + case MTR_MEMO_S_LOCK: + static_cast(slot.object)->s_unlock(); + break; + case MTR_MEMO_SPACE_X_LOCK: + static_cast(slot.object)->set_committed_size(); + static_cast(slot.object)->x_unlock(); + break; + case MTR_MEMO_X_LOCK: + case MTR_MEMO_SX_LOCK: + static_cast(slot.object)-> + u_or_x_unlock(slot.type == MTR_MEMO_SX_LOCK); + break; + default: + buf_page_t *bpage= static_cast(slot.object); + ut_d(const auto s=) + bpage->unfix(); if (slot.type & MTR_MEMO_MODIFY) { ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY || slot.type == MTR_MEMO_PAGE_SX_MODIFY); - modified++; - buf_block_t *b= static_cast(slot.object); - ut_ad(b->page.id() < end_page_id); - ut_d(const auto s= b->page.state()); - ut_ad(s > buf_page_t::FREED); + ut_ad(bpage->oldest_modification() > 1); + ut_ad(bpage->oldest_modification() < mtr->m_commit_lsn); + ut_ad(bpage->id() < end_page_id); + ut_ad(s >= buf_page_t::FREED); ut_ad(s < buf_page_t::READ_FIX); - ut_ad(mach_read_from_8(b->page.frame + FIL_PAGE_LSN) <= - m_commit_lsn); - mach_write_to_8(b->page.frame + FIL_PAGE_LSN, m_commit_lsn); - if (UNIV_LIKELY_NULL(b->page.zip.data)) - memcpy_aligned<8>(FIL_PAGE_LSN + b->page.zip.data, - FIL_PAGE_LSN + b->page.frame, 8); - buf_pool.insert_into_flush_list(prev, b, lsns.first); + ut_ad(mach_read_from_8(bpage->frame + FIL_PAGE_LSN) <= + mtr->m_commit_lsn); + mach_write_to_8(bpage->frame + FIL_PAGE_LSN, mtr->m_commit_lsn); + if (UNIV_LIKELY_NULL(bpage->zip.data)) + memcpy_aligned<8>(FIL_PAGE_LSN + bpage->zip.data, + FIL_PAGE_LSN + bpage->frame, 8); + modified++; + } + switch (auto latch= slot.type & ~MTR_MEMO_MODIFY) { + case MTR_MEMO_PAGE_S_FIX: + bpage->lock.s_unlock(); + continue; + case MTR_MEMO_PAGE_SX_FIX: + case MTR_MEMO_PAGE_X_FIX: + bpage->lock.u_or_x_unlock(latch == MTR_MEMO_PAGE_SX_FIX); + continue; + default: + ut_ad(latch == MTR_MEMO_BUF_FIX); } } + } - ut_ad(modified); - buf_pool.flush_list_requests+= modified; - buf_pool.page_cleaner_wakeup(); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); + buf_pool.add_flush_list_requests(modified); + mtr->m_memo.clear(); + } - if (m_latch_ex) - { - log_sys.latch.wr_unlock(); - m_latch_ex= false; - } - else - log_sys.latch.rd_unlock(); + mariadb_increment_pages_updated(modified); - release(); - } - else - { - if (m_latch_ex) - { - log_sys.latch.wr_unlock(); - m_latch_ex= false; - } - else - log_sys.latch.rd_unlock(); + if (UNIV_UNLIKELY(lsns.second != PAGE_FLUSH_NO)) + buf_flush_ahead(mtr->m_commit_lsn, lsns.second == PAGE_FLUSH_SYNC); - for (auto it= m_memo.rbegin(); it != m_memo.rend(); ) - { - const mtr_memo_slot_t &slot= *it++; - ut_ad(slot.object); - switch (slot.type) { - case MTR_MEMO_S_LOCK: - static_cast(slot.object)->s_unlock(); - break; - case MTR_MEMO_SPACE_X_LOCK: - static_cast(slot.object)->set_committed_size(); - static_cast(slot.object)->x_unlock(); - break; - case MTR_MEMO_X_LOCK: - case MTR_MEMO_SX_LOCK: - static_cast(slot.object)-> - u_or_x_unlock(slot.type == MTR_MEMO_SX_LOCK); - break; - default: - buf_page_t *bpage= static_cast(slot.object); - const auto s= bpage->unfix(); - if (slot.type & MTR_MEMO_MODIFY) - { - ut_ad(slot.type == MTR_MEMO_PAGE_X_MODIFY || - slot.type == MTR_MEMO_PAGE_SX_MODIFY); - ut_ad(bpage->oldest_modification() > 1); - ut_ad(bpage->oldest_modification() < m_commit_lsn); - ut_ad(bpage->id() < end_page_id); - ut_ad(s >= buf_page_t::FREED); - ut_ad(s < buf_page_t::READ_FIX); - ut_ad(mach_read_from_8(bpage->frame + FIL_PAGE_LSN) <= - m_commit_lsn); - if (s >= buf_page_t::UNFIXED) - { - mach_write_to_8(bpage->frame + FIL_PAGE_LSN, m_commit_lsn); - if (UNIV_LIKELY_NULL(bpage->zip.data)) - memcpy_aligned<8>(FIL_PAGE_LSN + bpage->zip.data, - FIL_PAGE_LSN + bpage->frame, 8); - } - modified++; - } - switch (auto latch= slot.type & ~MTR_MEMO_MODIFY) { - case MTR_MEMO_PAGE_S_FIX: - bpage->lock.s_unlock(); - continue; - case MTR_MEMO_PAGE_SX_FIX: - case MTR_MEMO_PAGE_X_FIX: - bpage->lock.u_or_x_unlock(latch == MTR_MEMO_PAGE_SX_FIX); - continue; - default: - ut_ad(latch == MTR_MEMO_BUF_FIX); - } - } - } + if (!pmem && UNIV_UNLIKELY(write_lsn != 0)) + log_write_up_to(write_lsn, false); +} - buf_pool.add_flush_list_requests(modified); - m_memo.clear(); - } +/** Commit a mini-transaction. */ +void mtr_t::commit() +{ + ut_ad(is_active()); + ut_ad(!is_inside_ibuf()); - mariadb_increment_pages_updated(modified); + /* This is a dirty read, for debugging. */ + ut_ad(!m_modifications || !recv_no_log_write); + ut_ad(!m_modifications || m_log_mode != MTR_LOG_NONE); + ut_ad(!m_latch_ex); - if (UNIV_UNLIKELY(lsns.second != PAGE_FLUSH_NO)) - buf_flush_ahead(m_commit_lsn, lsns.second == PAGE_FLUSH_SYNC); + if (m_modifications && (m_log_mode == MTR_LOG_NO_REDO || !m_log.empty())) + { + if (UNIV_UNLIKELY(!is_logged())) + { + release_unlogged(); + goto func_exit; + } + + ut_ad(!srv_read_only_mode); + std::pair lsns{do_write()}; + process_freed_pages(); +#ifdef HAVE_PMEM + commit_logger(this, lsns); +#else + commit_log(this, lsns); +#endif } else { @@ -492,15 +547,23 @@ m_memo.erase(m_memo.begin() + begin, m_memo.begin() + end); } +/** Set create_lsn. */ +inline void fil_space_t::set_create_lsn(lsn_t lsn) +{ + /* Concurrent log_checkpoint_low() must be impossible. */ + ut_ad(latch.have_wr()); + create_lsn= lsn; +} + /** Commit a mini-transaction that is shrinking a tablespace. -@param space tablespace that is being shrunk */ -void mtr_t::commit_shrink(fil_space_t &space) +@param space tablespace that is being shrunk +@param size new size in pages */ +void mtr_t::commit_shrink(fil_space_t &space, uint32_t size) { ut_ad(is_active()); ut_ad(!is_inside_ibuf()); ut_ad(!high_level_read_only); ut_ad(m_modifications); - ut_ad(m_made_dirty); ut_ad(!m_memo.empty()); ut_ad(!recv_recovery_is_on()); ut_ad(m_log_mode == MTR_LOG_ALL); @@ -514,18 +577,25 @@ const lsn_t start_lsn= do_write().first; ut_d(m_log.erase()); + fil_node_t *file= UT_LIST_GET_LAST(space.chain); + mysql_mutex_lock(&fil_system.mutex); + ut_ad(file->is_open()); + space.size= file->size= size; + space.set_create_lsn(m_commit_lsn); + mysql_mutex_unlock(&fil_system.mutex); + + space.clear_freed_ranges(); + /* Durably write the reduced FSP_SIZE before truncating the data file. */ log_write_and_flush(); -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); os_file_truncate(space.chain.start->name, space.chain.start->handle, - os_offset_t{space.size} << srv_page_size_shift, true); + os_offset_t{size} << srv_page_size_shift, true); space.clear_freed_ranges(); - const page_id_t high{space.id, space.size}; + const page_id_t high{space.id, size}; size_t modified= 0; auto it= m_memo.rbegin(); mysql_mutex_lock(&buf_pool.flush_list_mutex); @@ -586,13 +656,6 @@ log_sys.latch.wr_unlock(); m_latch_ex= false; - mysql_mutex_lock(&fil_system.mutex); - ut_ad(space.is_being_truncated); - ut_ad(space.is_stopping_writes()); - space.clear_stopping(); - space.is_being_truncated= false; - mysql_mutex_unlock(&fil_system.mutex); - release(); release_resources(); } @@ -680,11 +743,9 @@ This is to be used at log_checkpoint(). @param checkpoint_lsn the log sequence number of a checkpoint, or 0 @return current LSN */ -lsn_t mtr_t::commit_files(lsn_t checkpoint_lsn) +ATTRIBUTE_COLD lsn_t mtr_t::commit_files(lsn_t checkpoint_lsn) { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_write_locked()); -#endif + ut_ad(log_sys.latch_have_wr()); ut_ad(is_active()); ut_ad(!is_inside_ibuf()); ut_ad(m_log_mode == MTR_LOG_ALL); @@ -835,79 +896,179 @@ " last checkpoint LSN=" LSN_PF ", current LSN=" LSN_PF "%s.", lsn_t{log_sys.last_checkpoint_lsn}, lsn, - srv_shutdown_state != SRV_SHUTDOWN_INITIATED + srv_shutdown_state > SRV_SHUTDOWN_INITIATED ? ". Shutdown is in progress" : ""); } -/** Wait in append_prepare() for buffer to become available -@param ex whether log_sys.latch is exclusively locked */ -ATTRIBUTE_COLD void log_t::append_prepare_wait(bool ex) noexcept +static ATTRIBUTE_NOINLINE void lsn_delay(size_t delay, size_t mult) noexcept +{ + delay*= mult * 2; // GCC 13.2.0 -O2 targeting AMD64 wants to unroll twice + HMT_low(); + do + MY_RELAX_CPU(); + while (--delay); + HMT_medium(); +} + +#if defined __clang_major__ && __clang_major__ < 10 +/* Only clang-10 introduced support for asm goto */ +#elif defined __APPLE__ +/* At least some versions of Apple Xcode do not support asm goto */ +#elif defined __GNUC__ && (defined __i386__ || defined __x86_64__) +# if SIZEOF_SIZE_T == 8 +# define LOCK_TSET \ + __asm__ goto("lock btsq $63, %0\n\t" "jnc %l1" \ + : : "m"(buf_free) : "cc", "memory" : got) +# else +# define LOCK_TSET \ + __asm__ goto("lock btsl $31, %0\n\t" "jnc %l1" \ + : : "m"(buf_free) : "cc", "memory" : got) +# endif +#elif defined _MSC_VER && (defined _M_IX86 || defined _M_X64) +# if SIZEOF_SIZE_T == 8 +# define LOCK_TSET \ + if (!_interlockedbittestandset64 \ + (reinterpret_cast(&buf_free), 63)) return +# else +# define LOCK_TSET \ + if (!_interlockedbittestandset \ + (reinterpret_cast(&buf_free), 31)) return +# endif +#endif + +#ifdef LOCK_TSET +ATTRIBUTE_NOINLINE +void log_t::lsn_lock_bts() noexcept +{ + LOCK_TSET; + { + const size_t m= mtr_t::spin_wait_delay; + constexpr size_t DELAY= 10, MAX_ITERATIONS= 10; + for (size_t delay_count= DELAY, delay_iterations= 1;; + lsn_delay(delay_iterations, m)) + { + if (!(buf_free.load(std::memory_order_relaxed) & buf_free_LOCK)) + LOCK_TSET; + if (!delay_count); + else if (delay_iterations < MAX_ITERATIONS) + delay_count= DELAY, delay_iterations++; + else + delay_count--; + } + } + +# ifdef __GNUC__ + got: + return; +# endif +} + +inline +#else +ATTRIBUTE_NOINLINE +#endif +size_t log_t::lock_lsn() noexcept +{ +#ifdef LOCK_TSET + lsn_lock_bts(); + return ~buf_free_LOCK & buf_free.load(std::memory_order_relaxed); +# undef LOCK_TSET +#else + size_t b= buf_free.fetch_or(buf_free_LOCK, std::memory_order_acquire); + if (b & buf_free_LOCK) + { + const size_t m= mtr_t::spin_wait_delay; + constexpr size_t DELAY= 10, MAX_ITERATIONS= 10; + for (size_t delay_count= DELAY, delay_iterations= 1; + ((b= buf_free.load(std::memory_order_relaxed)) & buf_free_LOCK) || + (buf_free_LOCK & (b= buf_free.fetch_or(buf_free_LOCK, + std::memory_order_acquire))); + lsn_delay(delay_iterations, m)) + if (!delay_count); + else if (delay_iterations < MAX_ITERATIONS) + delay_count= DELAY, delay_iterations++; + else + delay_count--; + } + return b; +#endif +} + +template +ATTRIBUTE_COLD size_t log_t::append_prepare_wait(size_t b, bool ex, lsn_t lsn) + noexcept { - log_sys.waits++; - log_sys.unlock_lsn(); + waits++; + ut_ad(buf_free.load(std::memory_order_relaxed) == + (spin ? (b | buf_free_LOCK) : b)); + if (spin) + buf_free.store(b, std::memory_order_release); + else + lsn_lock.wr_unlock(); if (ex) - log_sys.latch.wr_unlock(); + latch.wr_unlock(); else - log_sys.latch.rd_unlock(); + latch.rd_unlock(); - DEBUG_SYNC_C("log_buf_size_exceeded"); - log_buffer_flush_to_disk(log_sys.is_pmem()); + log_write_up_to(lsn, is_pmem()); if (ex) - log_sys.latch.wr_lock(SRW_LOCK_CALL); + latch.wr_lock(SRW_LOCK_CALL); else - log_sys.latch.rd_lock(SRW_LOCK_CALL); + latch.rd_lock(SRW_LOCK_CALL); + + if (spin) + return lock_lsn(); - log_sys.lock_lsn(); + lsn_lock.wr_lock(); + return buf_free.load(std::memory_order_relaxed); } /** Reserve space in the log buffer for appending data. +@tparam spin whether to use the spin-only lock_lsn() @tparam pmem log_sys.is_pmem() @param size total length of the data to append(), in bytes @param ex whether log_sys.latch is exclusively locked @return the start LSN and the buffer position for append() */ -template +template inline std::pair log_t::append_prepare(size_t size, bool ex) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_locked()); -# ifndef _WIN32 // there is no accurate is_write_locked() on SRWLOCK - ut_ad(ex == latch.is_write_locked()); -# endif -#endif + ut_ad(ex ? latch_have_wr() : latch_have_rd()); ut_ad(pmem == is_pmem()); - const lsn_t checkpoint_margin{last_checkpoint_lsn + log_capacity - size}; - const size_t avail{(pmem ? size_t(capacity()) : buf_size) - size}; - lock_lsn(); + if (!spin) + lsn_lock.wr_lock(); + size_t b{spin ? lock_lsn() : buf_free.load(std::memory_order_relaxed)}; write_to_buf++; - for (ut_d(int count= 50); - UNIV_UNLIKELY((pmem - ? size_t(get_lsn() - - get_flushed_lsn(std::memory_order_relaxed)) - : size_t{buf_free}) > avail); ) - { - append_prepare_wait(ex); - ut_ad(count--); - } + const lsn_t l{lsn.load(std::memory_order_relaxed)}, end_lsn{l + size}; + + if (UNIV_UNLIKELY(pmem + ? (end_lsn - + get_flushed_lsn(std::memory_order_relaxed)) > capacity() + : b + size >= buf_size)) + b= append_prepare_wait(b, ex, l); - const lsn_t l{lsn.load(std::memory_order_relaxed)}; - lsn.store(l + size, std::memory_order_relaxed); - const size_t b{buf_free}; - size_t new_buf_free{b}; - new_buf_free+= size; + size_t new_buf_free= b + size; if (pmem && new_buf_free >= file_size) new_buf_free-= size_t(capacity()); - buf_free= new_buf_free; - unlock_lsn(); - if (UNIV_UNLIKELY(l > checkpoint_margin) || - (!pmem && b >= max_buf_free)) - set_check_flush_or_checkpoint(); + lsn.store(end_lsn, std::memory_order_relaxed); + + if (UNIV_UNLIKELY(end_lsn >= last_checkpoint_lsn + log_capacity)) + set_check_for_checkpoint(true); + + byte *our_buf= buf; + if (spin) + buf_free.store(new_buf_free, std::memory_order_release); + else + { + buf_free.store(new_buf_free, std::memory_order_relaxed); + lsn_lock.wr_unlock(); + } - return {l, &buf[b]}; + return {l, our_buf + b}; } /** Finish appending data to the log. @@ -915,9 +1076,7 @@ @return whether buf_flush_ahead() will have to be invoked */ static mtr_t::page_flush_ahead log_close(lsn_t lsn) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(log_sys.latch.is_locked()); -#endif + ut_ad(log_sys.latch_have_any()); const lsn_t checkpoint_age= lsn - log_sys.last_checkpoint_lsn; @@ -930,7 +1089,7 @@ else if (UNIV_LIKELY(checkpoint_age <= log_sys.max_checkpoint_age)) return mtr_t::PAGE_FLUSH_ASYNC; - log_sys.set_check_flush_or_checkpoint(); + log_sys.set_check_for_checkpoint(); return mtr_t::PAGE_FLUSH_SYNC; } @@ -982,17 +1141,14 @@ ut_ad(!recv_no_log_write); ut_ad(is_logged()); ut_ad(m_log.size()); -#ifndef SUX_LOCK_GENERIC - ut_ad(!m_latch_ex || log_sys.latch.is_write_locked()); -#endif + ut_ad(!m_latch_ex || log_sys.latch_have_wr()); #ifndef DBUG_OFF do { - if (m_log_mode != MTR_LOG_ALL) + if (m_log_mode != MTR_LOG_ALL || + _db_keyword_(nullptr, "skip_page_checksum", 1)) continue; - DBUG_EXECUTE_IF("skip_page_checksum", continue;); - for (const mtr_memo_slot_t& slot : m_memo) if (slot.type & MTR_MEMO_MODIFY) { @@ -1043,9 +1199,7 @@ inline void log_t::resize_write(lsn_t lsn, const byte *end, size_t len, size_t seq) noexcept { -#ifndef SUX_LOCK_GENERIC - ut_ad(latch.is_locked()); -#endif + ut_ad(latch_have_any()); if (UNIV_LIKELY_NULL(resize_buf)) { @@ -1150,53 +1304,47 @@ } } -/** Write the mini-transaction log to the redo log buffer. -@param len number of bytes to write -@return {start_lsn,flush_ahead} */ +template std::pair -mtr_t::finish_write(size_t len) +mtr_t::finish_writer(mtr_t *mtr, size_t len) { + ut_ad(log_sys.is_latest()); ut_ad(!recv_no_log_write); - ut_ad(is_logged()); -#ifndef SUX_LOCK_GENERIC -# ifndef _WIN32 // there is no accurate is_write_locked() on SRWLOCK - ut_ad(m_latch_ex == log_sys.latch.is_write_locked()); -# endif -#endif + ut_ad(mtr->is_logged()); + ut_ad(mtr->m_latch_ex ? log_sys.latch_have_wr() : log_sys.latch_have_rd()); - const size_t size{m_commit_lsn ? 5U + 8U : 5U}; - std::pair start; + const size_t size{mtr->m_commit_lsn ? 5U + 8U : 5U}; + std::pair start= + log_sys.append_prepare(len, mtr->m_latch_ex); - if (!log_sys.is_pmem()) + if (!pmem) { - start= log_sys.append_prepare(len, m_latch_ex); - m_log.for_each_block([&start](const mtr_buf_t::block_t *b) + mtr->m_log.for_each_block([&start](const mtr_buf_t::block_t *b) { log_sys.append(start.second, b->begin(), b->used()); return true; }); #ifdef HAVE_PMEM write_trailer: #endif *start.second++= log_sys.get_sequence_bit(start.first + len - size); - if (m_commit_lsn) + if (mtr->m_commit_lsn) { - mach_write_to_8(start.second, m_commit_lsn); - m_crc= my_crc32c(m_crc, start.second, 8); + mach_write_to_8(start.second, mtr->m_commit_lsn); + mtr->m_crc= my_crc32c(mtr->m_crc, start.second, 8); start.second+= 8; } - mach_write_to_4(start.second, m_crc); + mach_write_to_4(start.second, mtr->m_crc); start.second+= 4; } #ifdef HAVE_PMEM else { - start= log_sys.append_prepare(len, m_latch_ex); if (UNIV_LIKELY(start.second + len <= &log_sys.buf[log_sys.file_size])) { - m_log.for_each_block([&start](const mtr_buf_t::block_t *b) + mtr->m_log.for_each_block([&start](const mtr_buf_t::block_t *b) { log_sys.append(start.second, b->begin(), b->used()); return true; }); goto write_trailer; } - m_log.for_each_block([&start](const mtr_buf_t::block_t *b) + mtr->m_log.for_each_block([&start](const mtr_buf_t::block_t *b) { size_t size{b->used()}; const size_t size_left(&log_sys.buf[log_sys.file_size] - start.second); @@ -1219,14 +1367,14 @@ byte tail[5 + 8]; tail[0]= log_sys.get_sequence_bit(start.first + len - size); - if (m_commit_lsn) + if (mtr->m_commit_lsn) { - mach_write_to_8(tail + 1, m_commit_lsn); - m_crc= my_crc32c(m_crc, tail + 1, 8); - mach_write_to_4(tail + 9, m_crc); + mach_write_to_8(tail + 1, mtr->m_commit_lsn); + mtr->m_crc= my_crc32c(mtr->m_crc, tail + 1, 8); + mach_write_to_4(tail + 9, mtr->m_crc); } else - mach_write_to_4(tail + 1, m_crc); + mach_write_to_4(tail + 1, mtr->m_crc); ::memcpy(start.second, tail, size_left); ::memcpy(log_sys.buf + log_sys.START_OFFSET, tail + size_left, @@ -1235,12 +1383,14 @@ ((size >= size_left) ? log_sys.START_OFFSET : log_sys.file_size) + (size - size_left); } +#else + static_assert(!pmem, ""); #endif log_sys.resize_write(start.first, start.second, len, size); - m_commit_lsn= start.first + len; - return {start.first, log_close(m_commit_lsn)}; + mtr->m_commit_lsn= start.first + len; + return {start.first, log_close(mtr->m_commit_lsn)}; } bool mtr_t::have_x_latch(const buf_block_t &block) const @@ -1362,7 +1512,7 @@ ut_ad(slot.type == MTR_MEMO_BUF_FIX); buf_block_t *block= static_cast(slot.object); ut_d(const auto state= block->page.state()); - ut_ad(state > buf_page_t::UNFIXED); + ut_ad(state > buf_page_t::FREED); ut_ad(state > buf_page_t::WRITE_FIX || state < buf_page_t::READ_FIX); static_assert(int{MTR_MEMO_PAGE_S_FIX} == int{RW_S_LATCH}, ""); static_assert(int{MTR_MEMO_PAGE_X_FIX} == int{RW_X_LATCH}, ""); diff -Nru mariadb-10.11.6/storage/innobase/os/os0file.cc mariadb-10.11.9/storage/innobase/os/os0file.cc --- mariadb-10.11.6/storage/innobase/os/os0file.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/os/os0file.cc 2024-08-03 07:29:59.000000000 +0000 @@ -200,17 +200,10 @@ bool on_error_silent); /** Does error handling when a file operation fails. -@param[in] name name of a file or NULL -@param[in] operation operation name that failed -@return true if we should retry the operation */ -static -bool -os_file_handle_error( - const char* name, - const char* operation) +@param operation name of operation that failed */ +static void os_file_handle_error(const char *operation) { - /* Exit in case of unknown error */ - return(os_file_handle_error_cond_exit(name, operation, true, false)); + os_file_handle_error_cond_exit(nullptr, operation, true, false); } /** Does error handling when a file operation fails. @@ -327,6 +320,12 @@ ssize_t m_n; /** Offset from where to read/write */ os_offset_t m_offset; + + /** Do the read/write + @param request The IO context and type + @param n Number of bytes to read/write + @return the number of bytes read/written or negative value on error */ + ssize_t execute_low(const IORequest& request, ssize_t n); }; #ifndef _WIN32 /* On Microsoft Windows, mandatory locking is used */ @@ -680,28 +679,46 @@ /** Do the read/write @param[in] request The IO context and type +@param[in] n Number of bytes to read/write +@return the number of bytes read/written or negative value on error */ +ssize_t +SyncFileIO::execute_low(const IORequest& request, ssize_t n) +{ + ut_ad(n > 0); + ut_ad(size_t(n) <= os_file_request_size_max); + + if (request.is_read()) + return IF_WIN(tpool::pread(m_fh, m_buf, n, m_offset), pread(m_fh, m_buf, n, m_offset)); + return IF_WIN(tpool::pwrite(m_fh, m_buf, n, m_offset), pwrite(m_fh, m_buf, n, m_offset)); +} + +/** Do the read/write +@param[in] request The IO context and type @return the number of bytes read/written or negative value on error */ ssize_t SyncFileIO::execute(const IORequest& request) { - ssize_t n_bytes; + ssize_t n_bytes= 0; + ut_ad(m_n > 0); - if (request.is_read()) { -#ifdef _WIN32 - n_bytes = tpool::pread(m_fh, m_buf, m_n, m_offset); -#else - n_bytes = pread(m_fh, m_buf, m_n, m_offset); -#endif - } else { - ut_ad(request.is_write()); -#ifdef _WIN32 - n_bytes = tpool::pwrite(m_fh, m_buf, m_n, m_offset); -#else - n_bytes = pwrite(m_fh, m_buf, m_n, m_offset); -#endif - } + while (size_t(m_n) > os_file_request_size_max) + { + ssize_t n_partial_bytes= execute_low(request, os_file_request_size_max); + if (n_partial_bytes < 0) + return n_partial_bytes; + n_bytes+= n_partial_bytes; + if (n_partial_bytes != os_file_request_size_max) + return n_bytes; + advance(os_file_request_size_max); + } - return(n_bytes); + if (ssize_t n= execute_low(request, m_n)) + { + if (n < 0) + return n; + n_bytes += n; + } + return n_bytes; } #ifndef _WIN32 @@ -942,7 +959,7 @@ ib::error() << "The OS said file flush did not succeed"; - os_file_handle_error(NULL, "flush"); + os_file_handle_error("flush"); /* It is a fatal error if a file flush does not succeed, because then the database can get corrupt on disk */ @@ -965,7 +982,7 @@ pfs_os_file_t os_file_create_simple_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) @@ -974,76 +991,52 @@ *success = false; - int create_flag; - const char* mode_str = NULL; - - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); - - if (create_mode == OS_FILE_OPEN) { - mode_str = "OPEN"; - - if (access_type == OS_FILE_READ_ONLY) { - - create_flag = O_RDONLY; - - } else if (read_only) { - - create_flag = O_RDONLY; - - } else { - create_flag = O_RDWR; - } - - } else if (read_only) { - - mode_str = "OPEN"; - create_flag = O_RDONLY; + int create_flag = O_RDONLY | O_CLOEXEC; + if (read_only) { } else if (create_mode == OS_FILE_CREATE) { - - mode_str = "CREATE"; - create_flag = O_RDWR | O_CREAT | O_EXCL; - - } else if (create_mode == OS_FILE_CREATE_PATH) { - - mode_str = "CREATE PATH"; - /* Create subdirs along the path if needed. */ - - *success = os_file_create_subdirs_if_needed(name); - - if (!*success) { - - ib::error() - << "Unable to create subdirectories '" - << name << "'"; - - return(OS_FILE_CLOSED); - } - - create_flag = O_RDWR | O_CREAT | O_EXCL; - create_mode = OS_FILE_CREATE; + create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC; } else { - - ib::error() - << "Unknown file create mode (" - << create_mode - << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); + ut_ad(create_mode == OS_FILE_OPEN); + if (access_type != OS_FILE_READ_ONLY) { + create_flag = O_RDWR | O_CLOEXEC; + } } bool retry; +#ifdef O_DIRECT + int direct_flag = 0; + /* This function is always called for data files, we should disable + OS caching (O_DIRECT) here as we do in os_file_create_func(), so + we open the same file in the same mode, see man page of open(2). */ + switch (srv_file_flush_method) { + case SRV_O_DSYNC: + case SRV_O_DIRECT: + case SRV_O_DIRECT_NO_FSYNC: + direct_flag = O_DIRECT; + break; + } +#else + constexpr int direct_flag = 0; +#endif + do { - file = open(name, create_flag | O_CLOEXEC, os_innodb_umask); + file = open(name, create_flag | direct_flag, os_innodb_umask); if (file == -1) { +#ifdef O_DIRECT + if (direct_flag && errno == EINVAL) { + direct_flag = 0; + retry = true; + continue; + } +#endif *success = false; - retry = os_file_handle_error( + retry = os_file_handle_error_no_exit( name, - create_mode == OS_FILE_OPEN - ? "open" : "create"); + create_mode == OS_FILE_CREATE + ? "create" : "open", false); } else { *success = true; retry = false; @@ -1051,22 +1044,6 @@ } while (retry); - /* This function is always called for data files, we should disable - OS caching (O_DIRECT) here as we do in os_file_create_func(), so - we open the same file in the same mode, see man page of open(2). */ - if (!srv_read_only_mode && *success) { - switch (srv_file_flush_method) { - case SRV_O_DSYNC: - case SRV_O_DIRECT: - case SRV_O_DIRECT_NO_FSYNC: - os_file_set_nocache(file, name, mode_str); - break; - default: - break; - } - } - -#ifndef _WIN32 if (!read_only && *success && access_type == OS_FILE_READ_WRITE @@ -1077,7 +1054,6 @@ close(file); file = -1; } -#endif /* !_WIN32 */ return(file); } @@ -1111,6 +1087,60 @@ return(true); } +#ifdef O_DIRECT +# if defined __linux +/** Note that the log file uses buffered I/O. */ +static ATTRIBUTE_COLD void os_file_log_buffered() +{ + log_sys.log_maybe_unbuffered= false; + log_sys.log_buffered= true; +} +# endif + +/** @return whether the log file may work with unbuffered I/O. */ +static ATTRIBUTE_COLD bool os_file_log_maybe_unbuffered(const struct stat &st) +{ + MSAN_STAT_WORKAROUND(&st); +# ifdef __linux__ + char b[20 + sizeof "/sys/dev/block/" ":" "/../queue/physical_block_size"]; + if (snprintf(b, sizeof b, "/sys/dev/block/%u:%u/queue/physical_block_size", + major(st.st_dev), minor(st.st_dev)) >= + static_cast(sizeof b)) + return false; + int f= open(b, O_RDONLY); + if (f == -1) + { + if (snprintf(b, sizeof b, "/sys/dev/block/%u:%u/../queue/" + "physical_block_size", + major(st.st_dev), minor(st.st_dev)) >= + static_cast(sizeof b)) + return false; + f= open(b, O_RDONLY); + } + unsigned long s= 0; + if (f != -1) + { + ssize_t l= read(f, b, sizeof b); + if (l > 0 && size_t(l) < sizeof b && b[l - 1] == '\n') + { + char *end= b; + s= strtoul(b, &end, 10); + if (b == end || *end != '\n') + s = 0; + } + close(f); + } + if (s > 4096 || s < 64 || !ut_is_2pow(s)) + return false; + log_sys.set_block_size(uint32_t(s)); +# else + constexpr unsigned long s= 4096; +# endif + + return !(st.st_size & (s - 1)); +} +#endif + /** NOTE! Use the corresponding macro os_file_create(), not directly this function! Opens an existing file or creates a new. @@ -1131,71 +1161,81 @@ pfs_os_file_t os_file_create_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, bool* success) { - bool on_error_no_exit; - bool on_error_silent; - *success = false; DBUG_EXECUTE_IF( "ib_create_table_fail_disk_full", - *success = false; errno = ENOSPC; return(OS_FILE_CLOSED); ); - int create_flag; - const char* mode_str = NULL; - - on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT - ? true : false; - on_error_silent = create_mode & OS_FILE_ON_ERROR_SILENT - ? true : false; - - create_mode &= ulint(~(OS_FILE_ON_ERROR_NO_EXIT - | OS_FILE_ON_ERROR_SILENT)); - - if (create_mode == OS_FILE_OPEN - || create_mode == OS_FILE_OPEN_RAW - || create_mode == OS_FILE_OPEN_RETRY) { - - mode_str = "OPEN"; - - create_flag = read_only ? O_RDONLY : O_RDWR; - - } else if (read_only) { - - mode_str = "OPEN"; - - create_flag = O_RDONLY; - - } else if (create_mode == OS_FILE_CREATE) { - - mode_str = "CREATE"; - create_flag = O_RDWR | O_CREAT | O_EXCL; - - } else if (create_mode == OS_FILE_OVERWRITE) { - - mode_str = "OVERWRITE"; - create_flag = O_RDWR | O_CREAT | O_TRUNC; + int create_flag; + if (read_only) { + create_flag = O_RDONLY | O_CLOEXEC; + } else if (create_mode == OS_FILE_CREATE + || create_mode == OS_FILE_CREATE_SILENT) { + create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC; } else { - ib::error() - << "Unknown file create mode (" << create_mode << ")" - << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); + ut_ad(create_mode == OS_FILE_OPEN + || create_mode == OS_FILE_OPEN_SILENT + || create_mode == OS_FILE_OPEN_RETRY + || create_mode == OS_FILE_OPEN_RETRY_SILENT + || create_mode == OS_FILE_OPEN_RAW); + create_flag = O_RDWR | O_CLOEXEC; } +#ifdef O_DIRECT + struct stat st; ut_a(type == OS_LOG_FILE - || type == OS_DATA_FILE - || type == OS_DATA_FILE_NO_O_DIRECT); + || type == OS_DATA_FILE || type == OS_DATA_FILE_NO_O_DIRECT); + int direct_flag = 0; + if (type == OS_DATA_FILE) { + switch (srv_file_flush_method) { + case SRV_O_DSYNC: + case SRV_O_DIRECT: + case SRV_O_DIRECT_NO_FSYNC: + direct_flag = O_DIRECT; + break; + default: + break; + } +# ifdef __linux__ + } else if (type == OS_LOG_FILE && create_mode != OS_FILE_CREATE + && create_mode != OS_FILE_CREATE_SILENT + && !log_sys.is_opened()) { + if (stat(name, &st)) { + if (errno == ENOENT) { + if (create_mode & OS_FILE_ON_ERROR_SILENT) { + goto not_found; + } + sql_print_error( + "InnoDB: File %s was not found", name); + goto not_found; + } + log_sys.set_block_size(512); + goto skip_o_direct; + } else if (!os_file_log_maybe_unbuffered(st) + || log_sys.log_buffered) { +skip_o_direct: + os_file_log_buffered(); + } else { + direct_flag = O_DIRECT; + log_sys.log_maybe_unbuffered = true; + } +# endif + } +#else + ut_a(type == OS_LOG_FILE || type == OS_DATA_FILE); + constexpr int direct_flag = 0; +#endif ut_a(purpose == OS_FILE_AIO || purpose == OS_FILE_NORMAL); /* We let O_DSYNC only affect log files */ @@ -1211,115 +1251,66 @@ } os_file_t file; - bool retry; - do { - file = open(name, create_flag | O_CLOEXEC, os_innodb_umask); + for (;;) { + file = open(name, create_flag | direct_flag, os_innodb_umask); if (file == -1) { - const char* operation; - - operation = (create_mode == OS_FILE_CREATE - && !read_only) ? "create" : "open"; - - *success = false; - - if (on_error_no_exit) { - retry = os_file_handle_error_no_exit( - name, operation, on_error_silent); - } else { - retry = os_file_handle_error(name, operation); +#ifdef O_DIRECT + if (direct_flag && errno == EINVAL) { + direct_flag = 0; +# ifdef __linux__ + if (type == OS_LOG_FILE) { + os_file_log_buffered(); + } +# endif + if (create_mode == OS_FILE_CREATE + || create_mode == OS_FILE_CREATE_SILENT) { + /* Linux may create the file + before rejecting the O_DIRECT. */ + unlink(name); + } + continue; + } +#endif + if (!os_file_handle_error_no_exit( + name, (create_flag & O_CREAT) + ? "create" : "open", + create_mode & OS_FILE_ON_ERROR_SILENT)) { + break; } } else { *success = true; - retry = false; + break; } - - } while (retry); + } if (!*success) { - return file; +#ifdef __linux__ +not_found: +#endif + return OS_FILE_CLOSED; } -#if (defined __sun__ && defined DIRECTIO_ON) || defined O_DIRECT - if (type == OS_DATA_FILE) { - switch (srv_file_flush_method) { - case SRV_O_DSYNC: - case SRV_O_DIRECT: - case SRV_O_DIRECT_NO_FSYNC: -# ifdef __linux__ -use_o_direct: -# endif - os_file_set_nocache(file, name, mode_str); - break; - default: - break; - } - } -# ifdef __linux__ - else if (type == OS_LOG_FILE && !log_sys.is_opened()) { - struct stat st; - char b[20 + sizeof "/sys/dev/block/" ":" - "/../queue/physical_block_size"]; - int f; - if (fstat(file, &st)) { - goto skip_o_direct; - } - MSAN_STAT_WORKAROUND(&st); - if (snprintf(b, sizeof b, - "/sys/dev/block/%u:%u/queue/physical_block_size", - major(st.st_dev), minor(st.st_dev)) - >= static_cast(sizeof b)) { - goto skip_o_direct; - } - if ((f = open(b, O_RDONLY)) == -1) { - if (snprintf(b, sizeof b, - "/sys/dev/block/%u:%u/../queue/" - "physical_block_size", - major(st.st_dev), minor(st.st_dev)) - >= static_cast(sizeof b)) { - goto skip_o_direct; - } - f = open(b, O_RDONLY); - } - if (f != -1) { - ssize_t l = read(f, b, sizeof b); - unsigned long s = 0; - - if (l > 0 && static_cast(l) < sizeof b - && b[l - 1] == '\n') { - char* end = b; - s = strtoul(b, &end, 10); - if (b == end || *end != '\n') { - s = 0; - } - } - close(f); - if (s > 4096 || s < 64 || !ut_is_2pow(s)) { - goto skip_o_direct; - } - log_sys.log_maybe_unbuffered= true; - log_sys.set_block_size(uint32_t(s)); - if (!log_sys.log_buffered && !(st.st_size & (s - 1))) { - goto use_o_direct; - } +#ifdef __linux__ + if ((create_flag & O_CREAT) && type == OS_LOG_FILE) { + if (fstat(file, &st) || !os_file_log_maybe_unbuffered(st)) { + os_file_log_buffered(); } else { -skip_o_direct: - log_sys.log_maybe_unbuffered= false; - log_sys.log_buffered= true; - log_sys.set_block_size(512); + close(file); + return os_file_create_func(name, OS_FILE_OPEN, purpose, + type, false, success); } } -# endif #endif -#ifndef _WIN32 if (!read_only && create_mode != OS_FILE_OPEN_RAW && !my_disable_locking && os_file_lock(file, name)) { - if (create_mode == OS_FILE_OPEN_RETRY) { + if (create_mode == OS_FILE_OPEN_RETRY + || create_mode == OS_FILE_OPEN_RETRY_SILENT) { ib::info() << "Retrying to lock the first data file"; @@ -1341,7 +1332,6 @@ close(file); file = -1; } -#endif /* !_WIN32 */ return(file); } @@ -1351,7 +1341,7 @@ A simple function to open or create a file. @param[in] name name of the file or path as a null-terminated string -@param[in] create_mode create mode +@param[in] create_mode OS_FILE_CREATE or OS_FILE_OPEN @param[in] access_type OS_FILE_READ_ONLY, OS_FILE_READ_WRITE, or OS_FILE_READ_ALLOW_DELETE; the last option is used by a backup program reading the file @@ -1362,59 +1352,33 @@ pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) { os_file_t file; - int create_flag; - - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); + int create_flag = O_RDONLY | O_CLOEXEC; *success = false; - if (create_mode == OS_FILE_OPEN) { - - if (access_type == OS_FILE_READ_ONLY) { - - create_flag = O_RDONLY; - - } else if (read_only) { - - create_flag = O_RDONLY; - - } else { - + if (read_only) { + } else if (create_mode == OS_FILE_CREATE) { + create_flag = O_RDWR | O_CREAT | O_EXCL | O_CLOEXEC; + } else { + ut_ad(create_mode == OS_FILE_OPEN); + if (access_type != OS_FILE_READ_ONLY) { ut_a(access_type == OS_FILE_READ_WRITE || access_type == OS_FILE_READ_ALLOW_DELETE); create_flag = O_RDWR; } - - } else if (read_only) { - - create_flag = O_RDONLY; - - } else if (create_mode == OS_FILE_CREATE) { - - create_flag = O_RDWR | O_CREAT | O_EXCL; - - } else { - - ib::error() - << "Unknown file create mode " - << create_mode << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); } - file = open(name, create_flag | O_CLOEXEC, os_innodb_umask); + file = open(name, create_flag, os_innodb_umask); *success = (file != -1); -#ifndef _WIN32 if (!read_only && *success && access_type == OS_FILE_READ_WRITE @@ -1426,7 +1390,6 @@ file = -1; } -#endif /* !_WIN32 */ return(file); } @@ -1532,7 +1495,7 @@ if (!ret) return true; - os_file_handle_error(NULL, "close"); + os_file_handle_error("close"); return false; } @@ -1805,7 +1768,7 @@ if (srv_start_raw_disk_in_use && GetLastError() == ERROR_INVALID_FUNCTION) return true; - os_file_handle_error(nullptr, "flush"); + os_file_handle_error("flush"); /* It is a fatal error if a file flush does not succeed, because then the database can get corrupt on disk */ @@ -1919,7 +1882,7 @@ pfs_os_file_t os_file_create_simple_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) @@ -1928,82 +1891,31 @@ *success = false; - DWORD access; + DWORD access = GENERIC_READ; DWORD create_flag; DWORD attributes = 0; - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); ut_ad(srv_operation == SRV_OPERATION_NORMAL); - if (create_mode == OS_FILE_OPEN) { - - create_flag = OPEN_EXISTING; - - } else if (read_only) { - + if (read_only || create_mode == OS_FILE_OPEN) { create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_CREATE) { - - create_flag = CREATE_NEW; - - } else if (create_mode == OS_FILE_CREATE_PATH) { - - /* Create subdirs along the path if needed. */ - *success = os_file_create_subdirs_if_needed(name); - - if (!*success) { - - ib::error() - << "Unable to create subdirectories '" - << name << "'"; - - return(OS_FILE_CLOSED); - } - - create_flag = CREATE_NEW; - create_mode = OS_FILE_CREATE; - } else { - - ib::error() - << "Unknown file create mode (" - << create_mode << ") for file '" - << name << "'"; - - return(OS_FILE_CLOSED); + ut_ad(create_mode == OS_FILE_CREATE); + create_flag = CREATE_NEW; } if (access_type == OS_FILE_READ_ONLY) { - - access = GENERIC_READ; - } else if (read_only) { - ib::info() << "Read only mode set. Unable to" " open file '" << name << "' in RW mode, " << "trying RO mode"; - - access = GENERIC_READ; - - } else if (access_type == OS_FILE_READ_WRITE) { - - access = GENERIC_READ | GENERIC_WRITE; - } else { - - ib::error() - << "Unknown file access type (" << access_type << ") " - "for file '" << name << "'"; - - return(OS_FILE_CLOSED); + ut_ad(access_type == OS_FILE_READ_WRITE); + access = GENERIC_READ | GENERIC_WRITE; } - bool retry; - - do { + for (;;) { /* Use default security attributes and no template file. */ file = CreateFile( @@ -2011,22 +1923,18 @@ FILE_SHARE_READ | FILE_SHARE_DELETE, my_win_file_secattr(), create_flag, attributes, NULL); - if (file == INVALID_HANDLE_VALUE) { - - *success = false; - - retry = os_file_handle_error( - name, create_mode == OS_FILE_OPEN ? - "open" : "create"); - - } else { - - retry = false; - + if (file != INVALID_HANDLE_VALUE) { *success = true; + break; } - } while (retry); + if (!os_file_handle_error_no_exit(name, + create_flag == CREATE_NEW + ? "create" : "open", + false)) { + break; + } + } return(file); } @@ -2095,16 +2003,13 @@ pfs_os_file_t os_file_create_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint purpose, ulint type, bool read_only, bool* success) { os_file_t file; - bool retry; - bool on_error_no_exit; - bool on_error_silent; *success = false; @@ -2115,54 +2020,30 @@ return(OS_FILE_CLOSED); ); - DWORD create_flag; + DWORD create_flag = OPEN_EXISTING; DWORD share_mode = read_only ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE : FILE_SHARE_READ | FILE_SHARE_DELETE; - on_error_no_exit = create_mode & OS_FILE_ON_ERROR_NO_EXIT - ? true : false; - - on_error_silent = create_mode & OS_FILE_ON_ERROR_SILENT - ? true : false; - - create_mode &= ~(OS_FILE_ON_ERROR_NO_EXIT | OS_FILE_ON_ERROR_SILENT); - - if (create_mode == OS_FILE_OPEN_RAW) { - + switch (create_mode) { + case OS_FILE_OPEN_RAW: ut_a(!read_only); - /* On Windows Physical devices require admin privileges and have to have the write-share mode set. See the remarks section for the CreateFile() function documentation in MSDN. */ share_mode |= FILE_SHARE_WRITE; - - create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_OPEN - || create_mode == OS_FILE_OPEN_RETRY) { - - create_flag = OPEN_EXISTING; - - } else if (read_only) { - - create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_CREATE) { - + break; + case OS_FILE_CREATE_SILENT: + case OS_FILE_CREATE: create_flag = CREATE_NEW; - - } else if (create_mode == OS_FILE_OVERWRITE) { - - create_flag = CREATE_ALWAYS; - - } else { - ib::error() - << "Unknown file create mode (" << create_mode << ") " - << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); + break; + default: + ut_ad(create_mode == OS_FILE_OPEN + || create_mode == OS_FILE_OPEN_SILENT + || create_mode == OS_FILE_OPEN_RETRY_SILENT + || create_mode == OS_FILE_OPEN_RETRY); + break; } DWORD attributes = (purpose == OS_FILE_AIO && srv_use_native_aio) @@ -2175,10 +2056,8 @@ if (srv_file_flush_method == SRV_O_DSYNC) attributes|= FILE_FLAG_WRITE_THROUGH; } - else if (type == OS_DATA_FILE) - { - switch (srv_file_flush_method) - { + else if (type == OS_DATA_FILE) { + switch (srv_file_flush_method) { case SRV_FSYNC: case SRV_LITTLESYNC: case SRV_NOSYNC: @@ -2222,18 +2101,11 @@ break; } - operation = (create_mode == OS_FILE_CREATE && !read_only) ? - "create" : "open"; + operation = create_flag == CREATE_NEW ? "create" : "open"; - if (on_error_no_exit) { - retry = os_file_handle_error_no_exit( - name, operation, on_error_silent); - } - else { - retry = os_file_handle_error(name, operation); - } - - if (!retry) { + if (!os_file_handle_error_no_exit(name, operation, + create_mode + & OS_FILE_ON_ERROR_SILENT)) { break; } } @@ -2260,79 +2132,42 @@ pfs_os_file_t os_file_create_simple_no_error_handling_func( const char* name, - ulint create_mode, + os_file_create_t create_mode, ulint access_type, bool read_only, bool* success) { os_file_t file; - *success = false; - - DWORD access; - DWORD create_flag; + DWORD access = GENERIC_READ; + DWORD create_flag = OPEN_EXISTING; DWORD attributes = 0; - DWORD share_mode = read_only - ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE - : FILE_SHARE_READ | FILE_SHARE_DELETE; + DWORD share_mode = FILE_SHARE_READ | FILE_SHARE_DELETE; ut_a(name); - ut_a(!(create_mode & OS_FILE_ON_ERROR_SILENT)); - ut_a(!(create_mode & OS_FILE_ON_ERROR_NO_EXIT)); - - if (create_mode == OS_FILE_OPEN) { - - create_flag = OPEN_EXISTING; - - } else if (read_only) { - - create_flag = OPEN_EXISTING; - - } else if (create_mode == OS_FILE_CREATE) { - - create_flag = CREATE_NEW; - + if (read_only) { + share_mode = FILE_SHARE_READ | FILE_SHARE_WRITE + | FILE_SHARE_DELETE; } else { + if (create_mode == OS_FILE_CREATE) { + create_flag = CREATE_NEW; + } else { + ut_ad(create_mode == OS_FILE_OPEN); + } - ib::error() - << "Unknown file create mode (" << create_mode << ") " - << " for file '" << name << "'"; - - return(OS_FILE_CLOSED); - } - - if (access_type == OS_FILE_READ_ONLY) { - - access = GENERIC_READ; - - } else if (read_only) { - - access = GENERIC_READ; - - } else if (access_type == OS_FILE_READ_WRITE) { - - access = GENERIC_READ | GENERIC_WRITE; - - } else if (access_type == OS_FILE_READ_ALLOW_DELETE) { - - ut_a(!read_only); - - access = GENERIC_READ; - - /*!< A backup program has to give mysqld the maximum - freedom to do what it likes with the file */ - - share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE - | FILE_SHARE_READ; - - } else { - - ib::error() - << "Unknown file access type (" << access_type << ") " - << "for file '" << name << "'"; - - return(OS_FILE_CLOSED); + switch (access_type) { + case OS_FILE_READ_ONLY: break; + case OS_FILE_READ_WRITE: + access = GENERIC_READ | GENERIC_WRITE; + break; + default: + ut_ad(access_type == OS_FILE_READ_ALLOW_DELETE); + /* A backup program has to give mariadbd the maximum + freedom to do what it likes with the file */ + share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE + | FILE_SHARE_READ; + } } file = CreateFile((LPCTSTR) name, @@ -2500,7 +2335,7 @@ ut_ad(file); if (!CloseHandle(file)) { - os_file_handle_error(NULL, "close"); + os_file_handle_error("close"); return false; } @@ -2938,8 +2773,8 @@ if (ulint(n_bytes) == n || err != DB_SUCCESS) return err; - os_file_handle_error_cond_exit(type.node ? type.node->name : nullptr, "read", - false, false); + os_file_handle_error_no_exit(type.node ? type.node->name : nullptr, "read", + false); sql_print_error("InnoDB: Tried to read %zu bytes at offset %llu" " of file %s, but was only able to read %zd", n, offset, type.node ? type.node->name : "(unknown)", @@ -3042,53 +2877,6 @@ return(false); } -#ifndef _WIN32 -/** Tries to disable OS caching on an opened file descriptor. -@param[in] fd file descriptor to alter -@param[in] file_name file name, used in the diagnostic message -@param[in] name "open" or "create"; used in the diagnostic - message */ -void -os_file_set_nocache( - int fd MY_ATTRIBUTE((unused)), - const char* file_name MY_ATTRIBUTE((unused)), - const char* operation_name MY_ATTRIBUTE((unused))) -{ - /* some versions of Solaris may not have DIRECTIO_ON */ -#if defined(__sun__) && defined(DIRECTIO_ON) - if (directio(fd, DIRECTIO_ON) == -1) { - int errno_save = errno; - - ib::error() - << "Failed to set DIRECTIO_ON on file " - << file_name << "; " << operation_name << ": " - << strerror(errno_save) << "," - " continuing anyway."; - } -#elif defined(O_DIRECT) - if (fcntl(fd, F_SETFL, O_DIRECT) == -1) { - int errno_save = errno; - static bool warning_message_printed = false; - if (errno_save == EINVAL) { - if (!warning_message_printed) { - warning_message_printed = true; - ib::info() - << "Setting O_DIRECT on file " - << file_name << " failed"; - } - } else { - ib::warn() - << "Failed to set O_DIRECT on file " - << file_name << "; " << operation_name - << " : " << strerror(errno_save) - << ", continuing anyway."; - } - } -#endif /* defined(__sun__) && defined(DIRECTIO_ON) */ -} - -#endif /* _WIN32 */ - /** Check if the file system supports sparse files. @param fh file handle @return true if the file system supports sparse files */ @@ -3177,8 +2965,18 @@ return true; } current_size &= ~4095ULL; +# ifdef __linux__ + if (!fallocate(file, 0, current_size, + size - current_size)) { + err = 0; + break; + } + + err = errno; +# else err = posix_fallocate(file, current_size, size - current_size); +# endif } } while (err == EINTR && srv_shutdown_state <= SRV_SHUTDOWN_INITIATED); @@ -3457,7 +3255,7 @@ if (UNIV_UNLIKELY(cb->m_err != 0)) ib::info () << "IO Error: " << cb->m_err - << "during write of " + << " during write of " << cb->m_len << " bytes, for file " << request.node->name << "(" << cb->m_fh << "), returned " << cb->m_ret_len; @@ -3698,11 +3496,11 @@ void os_aio_free() { - srv_thread_pool->disable_aio(); delete read_slots; delete write_slots; read_slots= nullptr; write_slots= nullptr; + srv_thread_pool->disable_aio(); } /** Wait until there are no pending asynchronous writes. */ @@ -3863,8 +3661,9 @@ if (srv_thread_pool->submit_io(cb)) { slots->release(cb); - os_file_handle_error(type.node->name, type.is_read() - ? "aio read" : "aio write"); + os_file_handle_error_no_exit(type.node->name, type.is_read() + ? "aio read" : "aio write", + false); err = DB_IO_ERROR; type.node->space->release(); } @@ -4194,7 +3993,6 @@ != DB_SUCCESS) { sql_print_error("InnoDB: Unable to read first page of file %s", name); -corrupted: aligned_free(page); return false; } @@ -4211,25 +4009,35 @@ if (!fil_space_t::is_valid_flags(flags, space->id)) { uint32_t cflags= fsp_flags_convert_from_101(flags); - if (cflags == UINT32_MAX) + if (cflags != UINT32_MAX) { -invalid: - ib::error() << "Expected tablespace flags " - << ib::hex(space->flags) - << " but found " << ib::hex(flags) - << " in the file " << name; - goto corrupted; + uint32_t cf= cflags & ~FSP_FLAGS_MEM_MASK; + uint32_t sf= space->flags & ~FSP_FLAGS_MEM_MASK; + + if (fil_space_t::is_flags_equal(cf, sf) || + fil_space_t::is_flags_equal(sf, cf)) + { + flags= cflags; + goto flags_ok; + } } - uint32_t cf= cflags & ~FSP_FLAGS_MEM_MASK; - uint32_t sf= space->flags & ~FSP_FLAGS_MEM_MASK; + aligned_free(page); + goto invalid; + } - if (!fil_space_t::is_flags_equal(cf, sf) && - !fil_space_t::is_flags_equal(sf, cf)) - goto invalid; - flags= cflags; + if (!fil_space_t::is_flags_equal((flags & ~FSP_FLAGS_MEM_MASK), + (space->flags & ~FSP_FLAGS_MEM_MASK)) && + !fil_space_t::is_flags_equal((space->flags & ~FSP_FLAGS_MEM_MASK), + (flags & ~FSP_FLAGS_MEM_MASK))) + { +invalid: + sql_print_error("InnoDB: Expected tablespace flags 0x%zx but found 0x%zx" + " in the file %s", space->flags, flags, name); + return false; } + flags_ok: ut_ad(!(flags & FSP_FLAGS_MEM_MASK)); /* Try to read crypt_data from page 0 if it is not yet read. */ diff -Nru mariadb-10.11.6/storage/innobase/page/page0page.cc mariadb-10.11.9/storage/innobase/page/page0page.cc --- mariadb-10.11.6/storage/innobase/page/page0page.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/page/page0page.cc 2024-08-03 07:29:59.000000000 +0000 @@ -811,11 +811,11 @@ the predefined infimum record, then it would still be the infimum, and we would have ret_pos == 0. */ - if (UNIV_UNLIKELY(!ret_pos - || ret_pos == ULINT_UNDEFINED)) { + if (UNIV_UNLIKELY(ret_pos == ULINT_UNDEFINED)) { *err = DB_CORRUPTION; return nullptr; } + *err = page_zip_reorganize(new_block, index, page_zip_level, mtr); switch (*err) { diff -Nru mariadb-10.11.6/storage/innobase/page/page0zip.cc mariadb-10.11.9/storage/innobase/page/page0zip.cc --- mariadb-10.11.6/storage/innobase/page/page0zip.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/page/page0zip.cc 2024-08-03 07:29:59.000000000 +0000 @@ -3269,7 +3269,6 @@ ibool sloppy) /*!< in: FALSE=strict, TRUE=ignore the MIN_REC_FLAG */ { - page_zip_des_t temp_page_zip; ibool valid; if (memcmp(page_zip->data + FIL_PAGE_PREV, page + FIL_PAGE_PREV, @@ -3310,7 +3309,7 @@ MEM_CHECK_DEFINED(page, srv_page_size); MEM_CHECK_DEFINED(page_zip->data, page_zip_get_size(page_zip)); - temp_page_zip = *page_zip; + page_zip_des_t temp_page_zip(*page_zip); valid = page_zip_decompress_low(&temp_page_zip, temp_page, TRUE); if (!valid) { fputs("page_zip_validate(): failed to decompress\n", stderr); diff -Nru mariadb-10.11.6/storage/innobase/pars/pars0pars.cc mariadb-10.11.9/storage/innobase/pars/pars0pars.cc --- mariadb-10.11.6/storage/innobase/pars/pars0pars.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/pars/pars0pars.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1778,9 +1778,6 @@ ulint flags = 0; ulint flags2 = DICT_TF2_FTS_AUX_HEX_NAME; - DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name", - flags2 &= ~DICT_TF2_FTS_AUX_HEX_NAME;); - n_cols = que_node_list_get_len(column_defs); table = dict_table_t::create( diff -Nru mariadb-10.11.6/storage/innobase/rem/rem0rec.cc mariadb-10.11.9/storage/innobase/rem/rem0rec.cc --- mariadb-10.11.6/storage/innobase/rem/rem0rec.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/rem/rem0rec.cc 2024-08-03 07:29:59.000000000 +0000 @@ -427,7 +427,7 @@ } if (!field->fixed_len - || (format == REC_LEAF_TEMP + || (format <= REC_LEAF_TEMP_INSTANT && !dict_col_get_fixed_size(col, true))) { /* Variable-length field: read the length */ len = *lens--; diff -Nru mariadb-10.11.6/storage/innobase/row/row0ftsort.cc mariadb-10.11.9/storage/innobase/row/row0ftsort.cc --- mariadb-10.11.6/storage/innobase/row/row0ftsort.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0ftsort.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1630,9 +1630,6 @@ /* We should set the flags2 with aux_table_name here, in order to get the correct aux table names. */ index->table->flags2 |= DICT_TF2_FTS_AUX_HEX_NAME; - DBUG_EXECUTE_IF("innodb_test_wrong_fts_aux_table_name", - index->table->flags2 &= ~DICT_TF2_FTS_AUX_HEX_NAME - & ((1U << DICT_TF2_BITS) - 1);); fts_table.type = FTS_INDEX_TABLE; fts_table.index_id = index->id; fts_table.table_id = table->id; diff -Nru mariadb-10.11.6/storage/innobase/row/row0import.cc mariadb-10.11.9/storage/innobase/row/row0import.cc --- mariadb-10.11.6/storage/innobase/row/row0import.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0import.cc 2024-08-03 07:29:59.000000000 +0000 @@ -45,9 +45,11 @@ #include "lzo/lzo1x.h" #include "snappy-c.h" #include "log.h" +#include "table.h" +#include "ha_innodb.h" #include "scope.h" - +#include "dict0crea.h" #include #ifdef HAVE_MY_AES_H @@ -117,7 +119,6 @@ row_import() UNIV_NOTHROW : m_table(NULL), - m_version(0), m_hostname(NULL), m_table_name(NULL), m_autoinc(0), @@ -193,10 +194,62 @@ dberr_t match_flags(THD *thd) const ; + ulint find_fts_idx_offset() const + { + for (ulint i= 0; i < m_n_indexes; i++) + { + const char* index_name= + reinterpret_cast(m_indexes[i].m_name); + if (!strcmp(index_name, FTS_DOC_ID_INDEX_NAME)) + return i; + } + return ULINT_UNDEFINED; + } - dict_table_t* m_table; /*!< Table instance */ + const row_index_t *find_index_by_name(const char *name) const + { + for (ulint i= 0; i < m_n_indexes; i++) + { + const char* index_name= + reinterpret_cast(m_indexes[i].m_name); + if (!strcmp(index_name, name)) + return &m_indexes[i]; + } + return nullptr; + } + + /** @return whether cfg file has FTS_DOC_ID + & FTS_DOC_ID_INDEX*/ + bool has_hidden_fts() const + { + if (m_missing) return false; + ulint col_offset= find_col(FTS_DOC_ID_COL_NAME); + if (col_offset == ULINT_UNDEFINED) return false; + + const dict_col_t *col= &m_cols[col_offset]; + if (col->mtype != DATA_INT + || (col->prtype & ~(DATA_NOT_NULL + | DATA_UNSIGNED | DATA_BINARY_TYPE + | DATA_FTS_DOC_ID)) + || col->len != sizeof(doc_id_t)) + return false; + + return find_index_by_name(FTS_DOC_ID_INDEX_NAME) != nullptr; + } + + /** Need to check whether the table need to add system + generated fts column and system generated fts document index + @param table table to be imported + @return whether the table has to add system generated + fts column and fts index */ + bool need_hidden_fts(dict_table_t *table) const + { + return has_hidden_fts() && !table->fts_doc_id_index && + m_n_cols == static_cast(table->n_cols + 1) && + m_n_indexes == UT_LIST_GET_LEN(table->indexes) + 1; + } - ulint m_version; /*!< Version of config file */ + dict_table_t* m_table; /*!< Table instance */ byte* m_hostname; /*!< Hostname where the tablespace was exported */ @@ -550,7 +603,7 @@ if (m_xdes != 0) { const xdes_t* xdesc = xdes(page_no, m_xdes); - ulint pos = page_no % FSP_EXTENT_SIZE; + uint32_t pos = page_no % FSP_EXTENT_SIZE; return xdes_is_free(xdesc, pos); } @@ -1082,7 +1135,6 @@ return(i); } } - return(ULINT_UNDEFINED); } @@ -1803,14 +1855,39 @@ bool clust_index = m_index->m_srv_index == m_cluster_index; /* This will also position the cursor on the first user record. */ + rec_t* rec = m_rec_iter.open(block, m_index->m_srv_index); - if (!m_rec_iter.open(block, m_index->m_srv_index)) { + if (!rec) { return DB_CORRUPTION; } + ulint deleted; + + if (!page_has_prev(block->page.frame) + && m_index->m_srv_index->is_instant()) { + /* Expect to find the hidden metadata record */ + if (page_rec_is_supremum(rec)) { + return DB_CORRUPTION; + } + + const ulint info_bits = rec_get_info_bits(rec, comp); + + if (!(info_bits & REC_INFO_MIN_REC_FLAG)) { + return DB_CORRUPTION; + } + + if (!(info_bits & REC_INFO_DELETED_FLAG) + != !m_index->m_srv_index->table->instant) { + return DB_CORRUPTION; + } + + deleted = 0; + goto first; + } + while (!m_rec_iter.end()) { - rec_t* rec = m_rec_iter.current(); - ibool deleted = rec_get_deleted_flag(rec, comp); + rec = m_rec_iter.current(); + deleted = rec_get_deleted_flag(rec, comp); /* For the clustered index we have to adjust the BLOB reference and the system fields irrespective of the @@ -1818,6 +1895,7 @@ cluster records is required for purge to work later. */ if (deleted || clust_index) { +first: m_offsets = rec_get_offsets( rec, m_index->m_srv_index, m_offsets, m_index->m_srv_index->n_core_fields, @@ -2075,7 +2153,7 @@ we no longer evict the pages on DISCARD TABLESPACE. */ buf_page_get_low(block->page.id(), get_zip_size(), RW_NO_LATCH, nullptr, BUF_PEEK_IF_IN_POOL, - nullptr, nullptr, false); + nullptr, nullptr, false, nullptr); uint16_t page_type; @@ -2104,14 +2182,30 @@ return DB_SUCCESS; } -/*****************************************************************//** -Clean up after import tablespace. */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +static void reload_fts_table(row_prebuilt_t *prebuilt, + dict_table_t* table) +{ + ut_ad(prebuilt->table != table); + /* Reload the table in case of hidden fts column */ + const table_id_t id= prebuilt->table->id; + prebuilt->table->release(); + dict_sys.remove(prebuilt->table); + prebuilt->table= + dict_table_open_on_id(id, true, DICT_TABLE_OP_NORMAL); + prebuilt->table->space= table->space; +} + +/** Clean up after import tablespace. +@param prebuilt prebuilt from handler +@param err error code +@param fts_table constructed table which has system generated + fulltext document id +@return error code or DB_SUCCESS */ +static dberr_t -row_import_cleanup( -/*===============*/ - row_prebuilt_t* prebuilt, /*!< in/out: prebuilt from handler */ - dberr_t err) /*!< in: error code */ +row_import_cleanup(row_prebuilt_t* prebuilt, + dberr_t err, + dict_table_t* fts_table = nullptr) { if (err != DB_SUCCESS) { dict_table_t* table = prebuilt->table; @@ -2131,11 +2225,44 @@ index = UT_LIST_GET_NEXT(indexes, index)) { index->page = FIL_NULL; } + + prebuilt->trx->rollback(); } + else { + DBUG_EXECUTE_IF("ib_import_before_commit_crash", DBUG_SUICIDE();); + prebuilt->trx->commit(); + } + + if (fts_table && fts_table != prebuilt->table) { - DBUG_EXECUTE_IF("ib_import_before_commit_crash", DBUG_SUICIDE();); + if (err == DB_SUCCESS) { + reload_fts_table(prebuilt, fts_table); + ib::warn() << "Added system generated FTS_DOC_ID " + "and FTS_DOC_ID_INDEX while importing " + "the tablespace " << prebuilt->table->name; + } else if (fts_table->space) { + fil_close_tablespace(fts_table->space_id); + fts_table->space = NULL; + } + + if (!prebuilt->trx->dict_operation_lock_mode) { + dict_sys.lock(SRW_LOCK_CALL); + } + + dict_index_t* index = UT_LIST_GET_FIRST( + fts_table->indexes); + while (index) { + dict_index_t* next_index = + UT_LIST_GET_NEXT(indexes, index); + dict_index_remove_from_cache(fts_table, index); + index = next_index; + } + dict_mem_table_free(fts_table); - prebuilt->trx->commit(); + if (!prebuilt->trx->dict_operation_lock_mode) { + dict_sys.unlock(); + } + } if (prebuilt->trx->dict_operation_lock_mode) { row_mysql_unlock_data_dictionary(prebuilt->trx); @@ -2148,14 +2275,17 @@ return(err); } -/*****************************************************************//** -Report error during tablespace import. */ -static MY_ATTRIBUTE((nonnull, warn_unused_result)) +/** Report error during tablespace import. +@param prebuilt prebuilt from the handler +@param err error code +@param fts_table table definition containing hidden FTS_DOC_ID column +@return error code or DB_SUCCESS */ +static dberr_t row_import_error( -/*=============*/ - row_prebuilt_t* prebuilt, /*!< in/out: prebuilt from handler */ - dberr_t err) /*!< in: error code */ + row_prebuilt_t* prebuilt, + dberr_t err, + dict_table_t* fts_table=nullptr) { if (!trx_is_interrupted(prebuilt->trx)) { char table_name[MAX_FULL_NAME_LEN + 1]; @@ -2170,7 +2300,7 @@ table_name, (ulong) err, ut_strerr(err)); } - return row_import_cleanup(prebuilt, err); + return row_import_cleanup(prebuilt, err, fts_table); } /*****************************************************************//** @@ -2992,17 +3122,13 @@ return(DB_IO_ERROR); } - cfg.m_version = mach_read_from_4(row); - /* Check the version number. */ - switch (cfg.m_version) { + switch (mach_read_from_4(row)) { case IB_EXPORT_CFG_VERSION_V1: - return(row_import_read_v1(file, thd, &cfg)); default: - ib_errf(thd, IB_LOG_LEVEL_ERROR, ER_IO_READ_ERROR, - "Unsupported meta-data version number (" ULINTPF "), " - "file ignored", cfg.m_version); + ib_senderrf(thd, IB_LOG_LEVEL_ERROR, ER_NOT_SUPPORTED_YET, + "meta-data version"); } return(DB_ERROR); @@ -3066,7 +3192,139 @@ ); } -/* find, parse instant metadata, performing variaous checks, +/** Add fts index to the table +@param table fts index to be added on the table */ +static void add_fts_index(dict_table_t *table) +{ + dict_index_t *fts_index= dict_mem_index_create( + table, FTS_DOC_ID_INDEX_NAME, DICT_UNIQUE, 2); + fts_index->page= FIL_NULL; + fts_index->cached= 1; + fts_index->n_uniq= 1; + /* Add fields for FTS_DOC_ID_INDEX */ + dict_index_add_col( + fts_index, table, + &table->cols[table->n_cols - (DATA_N_SYS_COLS + 1)], 0); + dict_index_t *clust_index= UT_LIST_GET_FIRST(table->indexes); + for (ulint i= 0; i < clust_index->n_uniq; i++) + dict_index_add_col(fts_index, table, clust_index->fields[i].col, + clust_index->fields[i].prefix_len); +#ifdef BTR_CUR_HASH_ADAPT + fts_index->search_info= btr_search_info_create(fts_index->heap); + fts_index->search_info->ref_count= 0; +#endif /* BTR_CUR_HASH_ADAPT */ + UT_LIST_ADD_LAST(fts_index->table->indexes, fts_index); +} + +/** Append the hidden fts column and fts doc index to the +existing table +@param table table to be imported +@param thd thread +@param cfg metadata required by import +@return table which has fts doc id and fts doc id index */ +static dict_table_t *build_fts_hidden_table( + dict_table_t *table, const row_import &cfg) +{ + dict_table_t *new_table= dict_table_t::create( + {table->name.m_name, strlen(table->name.m_name)}, + table->space, table->n_t_cols - (DATA_N_SYS_COLS - 1), + table->n_v_cols, table->flags, + table->flags2); + + new_table->id= table->id; + new_table->space_id= table->space_id; + const char* col_name= &table->col_names[0]; + /* Copy columns from old table to new fts table */ + for (ulint new_i= 0; + new_i < ulint(new_table->n_cols - (DATA_N_SYS_COLS + 1)); + new_i++) + { + dict_mem_table_add_col(new_table, new_table->heap, col_name, + table->cols[new_i].mtype, + table->cols[new_i].prtype, + table->cols[new_i].len); + col_name+= strlen(col_name) + 1; + } + + unsigned fts_col_ind= unsigned(table->n_cols - DATA_N_SYS_COLS); + fts_add_doc_id_column(new_table, new_table->heap); + new_table->cols[fts_col_ind].ind= + fts_col_ind & dict_index_t::MAX_N_FIELDS; + new_table->cols[fts_col_ind].ord_part= 1; + dict_table_add_system_columns(new_table, new_table->heap); + + col_name= &table->v_col_names[0]; + for (ulint new_i= 0; new_i < new_table->n_v_cols; new_i++) + { + dict_col_t old_vcol= table->v_cols[new_i].m_col; + dict_mem_table_add_v_col(new_table, new_table->heap, col_name, + old_vcol.mtype, old_vcol.prtype, + old_vcol.len, old_vcol.ind + 1, + table->v_cols[new_i].num_base); + for (ulint i= 0; i < table->v_cols[new_i].num_base; i++) + { + dict_col_t *base_col= dict_table_get_nth_col( + new_table, table->v_cols[new_i].base_col[i]->ind); + new_table->v_cols[new_i].base_col[i]= base_col; + } + col_name+= strlen(col_name) + 1; + } + + bool is_clustered= true; + /* Copy indexes from old table to new table */ + for (dict_index_t *old_index= UT_LIST_GET_FIRST(table->indexes); + old_index; is_clustered= false) + { + dict_index_t *new_index= dict_mem_index_create( + new_table, old_index->name, old_index->type, + old_index->n_fields + is_clustered); + + new_index->id= old_index->id; + new_index->n_uniq= old_index->n_uniq; + new_index->type= old_index->type; + new_index->cached= 1; + new_index->n_user_defined_cols= old_index->n_user_defined_cols; + new_index->n_core_null_bytes= old_index->n_core_null_bytes; + /* Copy all fields from old index to new index */ + for (ulint i= 0; i < old_index->n_fields; i++) + { + dict_field_t *field= dict_index_get_nth_field(old_index, i); + dict_col_t *col= field->col; + if (col->is_virtual()) + { + dict_v_col_t *v_col= reinterpret_cast(col); + col= &new_table->v_cols[v_col->v_pos].m_col; + } + else + { + unsigned ind= field->col->ind; + if (ind >= fts_col_ind) ind++; + col= &new_table->cols[ind]; + } + dict_index_add_col(new_index, new_table, col, + field->prefix_len); + if (i < old_index->n_uniq) col->ord_part= 1; + } + + if (is_clustered) + { + /* Add fts doc id in clustered index */ + dict_index_add_col( + new_index, new_table, &table->cols[fts_col_ind], 0); + new_index->fields[old_index->n_fields].fixed_len= sizeof(doc_id_t); + } + + new_index->search_info= old_index->search_info; + UT_LIST_ADD_LAST(new_index->table->indexes, new_index); + old_index= UT_LIST_GET_NEXT(indexes, old_index); + if (UT_LIST_GET_LEN(new_table->indexes) + == cfg.find_fts_idx_offset()) + add_fts_index(new_table); + } + return new_table; +} + +/* find, parse instant metadata, performing various checks, and apply it to dict_table_t @return DB_SUCCESS or some error */ static dberr_t handle_instant_metadata(dict_table_t *table, @@ -4235,6 +4493,107 @@ return(err); } +static void row_import_autoinc(dict_table_t *table, row_prebuilt_t *prebuilt, + uint64_t autoinc) +{ + if (!table->persistent_autoinc) + { + ut_ad(!autoinc); + return; + } + + if (autoinc) + { + btr_write_autoinc(dict_table_get_first_index(table), autoinc - 1); + autoinc_set: + table->autoinc= autoinc; + sql_print_information("InnoDB: %`.*s.%`s autoinc value set to " UINT64PF, + int(table->name.dblen()), table->name.m_name, + table->name.basename(), autoinc); + } + else if (TABLE *t= prebuilt->m_mysql_table) + { + if (const Field *ai= t->found_next_number_field) + { + autoinc= 1 + + btr_read_autoinc_with_fallback(table, innodb_col_no(ai), + t->s->mysql_version, + innobase_get_int_col_max_value(ai)); + goto autoinc_set; + } + } +} + +/** Update the virtual column position in SYS_COLUMNS and SYS_VIRTUAL +@param table_id table identifier +@param new_pos position value +@param trx transaction +@return DB_SUCCESS or error code */ +dberr_t update_vcol_pos(table_id_t table_id, ulint new_pos, trx_t *trx) +{ + pars_info_t *info= pars_info_create(); + pars_info_add_ull_literal(info, "id", table_id); + pars_info_add_int4_literal(info, "old_pos", new_pos - 1); + DBUG_EXECUTE_IF("ib_import_vcol_update_fail", + return DB_DUPLICATE_KEY;); + return que_eval_sql(info, + "PROCEDURE UPDATE_VCOL () IS\n" + "BEGIN\n" + "UPDATE SYS_COLUMNS SET POS = POS + 1 " + "WHERE TABLE_ID= :id AND POS = :old_pos;\n" + "UPDATE SYS_VIRTUAL SET POS = POS + 1 " + "WHERE TABLE_ID= :id AND POS = :old_pos;\n" + "END\n;", trx); +} + +/** +1) Update the position of the columns and +2) Insert the hidden fts doc id in the sys columns table +3) Insert the hidden fts doc id in the sys indexes and +sys_fields table +@param table table to be imported +@param fts_pos position of fts doc id column +@param trx transaction +@return DB_SUCCESS or error code */ +static +dberr_t innodb_insert_hidden_fts_col(dict_table_t* table, + ulint fts_pos, + trx_t* trx) +{ + dict_index_t* fts_idx= + dict_table_get_index_on_name(table, FTS_DOC_ID_INDEX_NAME); + if (!fts_idx) return DB_ERROR; + for (ulint new_i= 0; new_i < table->n_v_cols; new_i++) + { + ulint pos= dict_create_v_col_pos( + table->v_cols[new_i].v_pos, + table->v_cols[new_i].m_col.ind); + if (dberr_t err= update_vcol_pos(table->id, pos, trx)) + return err; + } + pars_info_t *info= pars_info_create(); + pars_info_add_ull_literal(info, "id", table->id); + dict_hdr_get_new_id(NULL, &fts_idx->id, NULL); + pars_info_add_ull_literal(info, "idx_id", fts_idx->id); + pars_info_add_int4_literal(info, "pos", fts_pos); + pars_info_add_int4_literal(info, "space", fts_idx->table->space_id); + pars_info_add_int4_literal(info, "page_no", fts_idx->page); + + return que_eval_sql(info, + "PROCEDURE ADD_FTS_COL () IS\n" + "BEGIN\n" + "INSERT INTO SYS_COLUMNS VALUES" + "(:id,:pos,'FTS_DOC_ID',6, 1795, 8, 0);\n" + "UPDATE SYS_TABLES SET N_COLS = N_COLS + 1" + " WHERE ID = :id;\n" + "INSERT INTO SYS_INDEXES VALUES" + "(:id, :idx_id, 'FTS_DOC_ID_INDEX', 1," + " 2, :space, :page_no, 50);\n" + "INSERT INTO SYS_FIELDS VALUES" + "(:idx_id, 1, 'FTS_DOC_ID');\n" + "END;\n", trx); +} + /*****************************************************************//** Imports a tablespace. The space id in the .ibd file must match the space id of the table in the data dictionary. @@ -4260,9 +4619,27 @@ ut_ad(trx); ut_ad(trx->state == TRX_STATE_ACTIVE); ut_ad(!table->is_readable()); + ut_ad(prebuilt->table == table); ibuf_delete_for_discarded_space(table->space_id); +#ifdef BTR_CUR_HASH_ADAPT + /* On DISCARD TABLESPACE, we did not drop any adaptive hash + index entries. If we replaced the discarded tablespace with a + smaller one here, there could still be some adaptive hash + index entries that point to cached garbage pages in the buffer + pool, because PageConverter::operator() only evicted those + pages that were replaced by the imported pages. We must + detach any remaining adaptive hash index entries, because the + adaptive hash index must be a subset of the table contents; + false positives are not tolerated. */ + for (dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); index; + index = UT_LIST_GET_NEXT(indexes, index)) { + index = index->clone_if_needed(); + } +#endif /* BTR_CUR_HASH_ADAPT */ + UT_LIST_GET_FIRST(table->indexes)->clear_instant_alter(); + /* Assign an undo segment for the transaction, so that the transaction will be recovered after a crash. */ @@ -4288,7 +4665,6 @@ row_import cfg; THD* thd = trx->mysql_thd; - err = row_import_read_cfg(table, thd, cfg); /* Check if the table column definitions match the contents @@ -4296,8 +4672,16 @@ if (err == DB_SUCCESS) { - if (dberr_t err = handle_instant_metadata(table, cfg)) { - return row_import_error(prebuilt, err); + if (cfg.need_hidden_fts(table)) { + cfg.m_table = table = build_fts_hidden_table( + table, cfg); + } + + err = handle_instant_metadata(table, cfg); + if (err != DB_SUCCESS) { +import_error: + return row_import_error( + prebuilt, err, table); } /* We have a schema file, try and match it with our @@ -4333,7 +4717,7 @@ "table %s when .cfg file is missing.", table->name.m_name); err = DB_ERROR; - return row_import_error(prebuilt, err); + goto import_error; } FetchIndexRootPages fetchIndexRootPages(table, trx); @@ -4362,7 +4746,7 @@ } if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } trx->op_info = "importing tablespace"; @@ -4382,21 +4766,6 @@ DBUG_EXECUTE_IF("ib_import_reset_space_and_lsn_failure", err = DB_TOO_MANY_CONCURRENT_TRXS;); -#ifdef BTR_CUR_HASH_ADAPT - /* On DISCARD TABLESPACE, we did not drop any adaptive hash - index entries. If we replaced the discarded tablespace with a - smaller one here, there could still be some adaptive hash - index entries that point to cached garbage pages in the buffer - pool, because PageConverter::operator() only evicted those - pages that were replaced by the imported pages. We must - detach any remaining adaptive hash index entries, because the - adaptive hash index must be a subset of the table contents; - false positives are not tolerated. */ - for (dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); index; - index = UT_LIST_GET_NEXT(indexes, index)) { - index = index->clone_if_needed(); - } -#endif /* BTR_CUR_HASH_ADAPT */ if (err != DB_SUCCESS) { char table_name[MAX_FULL_NAME_LEN + 1]; @@ -4413,7 +4782,7 @@ table_name, ut_strerr(err)); } - return row_import_cleanup(prebuilt, err); + goto import_error; } /* If the table is stored in a remote tablespace, we need to @@ -4476,7 +4845,8 @@ dict_index_t* index = dict_table_get_first_index(table); if (!dict_index_is_clust(index)) { - return row_import_error(prebuilt, DB_CORRUPTION); + err = DB_CORRUPTION; + goto import_error; } /* Update the Btree segment headers for index node and @@ -4488,7 +4858,7 @@ err = DB_CORRUPTION;); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } else if (cfg.requires_purge(index->name)) { /* Purge any delete-marked records that couldn't be @@ -4507,7 +4877,7 @@ DBUG_EXECUTE_IF("ib_import_cluster_failure", err = DB_CORRUPTION;); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } /* For secondary indexes, purge any records that couldn't be purged @@ -4520,7 +4890,7 @@ err = DB_CORRUPTION;); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } /* Ensure that the next available DB_ROW_ID is not smaller than @@ -4535,9 +4905,9 @@ /* Ensure that all pages dirtied during the IMPORT make it to disk. The only dirty pages generated should be from the pessimistic purge of delete marked records that couldn't be purged in Phase I. */ - while (buf_flush_list_space(prebuilt->table->space)); + while (buf_flush_list_space(table->space)); - for (ulint count = 0; prebuilt->table->space->referenced(); count++) { + for (ulint count = 0; table->space->referenced(); count++) { /* Issue a warning every 10.24 seconds, starting after 2.56 seconds */ if ((count & 511) == 128) { @@ -4548,38 +4918,48 @@ } ib::info() << "Phase IV - Flush complete"; - prebuilt->table->space->set_imported(); + /* Set tablespace purpose as FIL_TYPE_TABLESPACE, + so that rollback can go ahead smoothly */ + table->space->set_imported(); + err = lock_sys_tables(trx); + if (err != DB_SUCCESS) { + goto import_error; + } /* The dictionary latches will be released in in row_import_cleanup() after the transaction commit, for both success and error. */ row_mysql_lock_data_dictionary(trx); + if (prebuilt->table != table) { + /* Add fts_doc_id and fts_doc_idx in data dictionary */ + err = innodb_insert_hidden_fts_col( + table, cfg.find_col(FTS_DOC_ID_COL_NAME), trx); + DBUG_EXECUTE_IF("ib_import_fts_error", + err= DB_DUPLICATE_KEY;); + if (err != DB_SUCCESS) { + goto import_error; + } + } /* Update the root pages of the table's indexes. */ err = row_import_update_index_root(trx, table, false); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } err = row_import_update_discarded_flag(trx, table->id, false); if (err != DB_SUCCESS) { - return row_import_error(prebuilt, err); + goto import_error; } table->file_unreadable = false; table->flags2 &= ~DICT_TF2_DISCARDED & ((1U << DICT_TF2_BITS) - 1); /* Set autoinc value read from .cfg file, if one was specified. - Otherwise, keep the PAGE_ROOT_AUTO_INC as is. */ - if (autoinc) { - ib::info() << table->name << " autoinc value set to " - << autoinc; - - table->autoinc = autoinc--; - btr_write_autoinc(dict_table_get_first_index(table), autoinc); - } + Otherwise, read the PAGE_ROOT_AUTO_INC and set it to table autoinc. */ + row_import_autoinc(table, prebuilt, autoinc); - return row_import_cleanup(prebuilt, err); + return row_import_cleanup(prebuilt, err, table); } diff -Nru mariadb-10.11.6/storage/innobase/row/row0ins.cc mariadb-10.11.9/storage/innobase/row/row0ins.cc --- mariadb-10.11.6/storage/innobase/row/row0ins.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0ins.cc 2024-08-03 07:29:59.000000000 +0000 @@ -2000,7 +2000,7 @@ /* In a unique secondary index we allow equal key values if they contain SQL NULLs */ - if (!dict_index_is_clust(index) && !index->nulls_equal) { + if (!dict_index_is_clust(index)) { for (i = 0; i < n_unique; i++) { if (dfield_is_null(dtuple_get_nth_field(entry, i))) { @@ -2102,16 +2102,8 @@ /* If the secondary index is unique, but one of the fields in the n_unique first fields is NULL, a unique key violation cannot occur, since we define NULL != NULL in this case */ - - if (!index->nulls_equal) { - for (ulint i = 0; i < n_unique; i++) { - if (UNIV_SQL_NULL == dfield_get_len( - dtuple_get_nth_field(entry, i))) { - - DBUG_RETURN(DB_SUCCESS); - } - } - } + if (index->n_nullable && dtuple_contains_null(entry, n_unique)) + DBUG_RETURN(DB_SUCCESS); /* Store old value on n_fields_cmp */ @@ -2569,12 +2561,6 @@ return(error); } -#ifdef HAVE_REPLICATION /* Working around MDEV-24622 */ -extern "C" int thd_is_slave(const MYSQL_THD thd); -#else -# define thd_is_slave(thd) 0 -#endif - #if defined __aarch64__&&defined __GNUC__&&__GNUC__==4&&!defined __clang__ /* Avoid GCC 4.8.5 internal compiler error due to srw_mutex::wr_unlock(). We would only need this for row_ins_clust_index_entry_low(), @@ -2638,14 +2624,17 @@ ut_ad(!dict_index_is_online_ddl(index)); ut_ad(!index->table->persistent_autoinc); ut_ad(!index->is_instant()); + ut_ad(!entry->info_bits); mtr.set_log_mode(MTR_LOG_NO_REDO); } else { index->set_modified(mtr); - if (UNIV_UNLIKELY(entry->is_metadata())) { + if (UNIV_UNLIKELY(entry->info_bits != 0)) { + ut_ad(entry->is_metadata()); ut_ad(index->is_instant()); ut_ad(!dict_index_is_online_ddl(index)); ut_ad(mode == BTR_MODIFY_TREE); + ut_ad(flags == BTR_NO_LOCKING_FLAG); } else { if (mode == BTR_MODIFY_LEAF && dict_index_is_online_ddl(index)) { @@ -2712,7 +2701,7 @@ block = btr_pcur_get_block(&pcur); - DBUG_EXECUTE_IF("row_ins_row_level", goto skip_bulk_insert;); + DBUG_EXECUTE_IF("row_ins_row_level", goto row_level_insert;); if (!(flags & BTR_NO_UNDO_LOG_FLAG) && page_is_empty(block->page.frame) @@ -2720,36 +2709,33 @@ && !trx->check_unique_secondary && !trx->check_foreigns && !trx->dict_operation && block->page.id().page_no() == index->page - && !index->table->skip_alter_undo - && !index->table->n_rec_locks - && !index->table->is_active_ddl() - && !index->table->has_spatial_index() - && !index->table->versioned() - && !thd_is_slave(trx->mysql_thd) /* FIXME: MDEV-24622 */) { - DEBUG_SYNC_C("empty_root_page_insert"); - - trx->bulk_insert = true; + && !index->table->is_native_online_ddl() + && (!dict_table_is_partition(index->table) + || thd_sql_command(trx->mysql_thd) == SQLCOM_INSERT)) { + + if (!index->table->n_rec_locks + && !index->table->versioned() + && !index->table->is_temporary() + && !index->table->has_spatial_index()) { - if (!index->table->is_temporary()) { + ut_ad(!index->table->skip_alter_undo); + trx->bulk_insert = true; err = lock_table(index->table, NULL, LOCK_X, thr); - if (err != DB_SUCCESS) { trx->error_state = err; trx->bulk_insert = false; goto err_exit; } - if (index->table->n_rec_locks) { avoid_bulk: trx->bulk_insert = false; - goto skip_bulk_insert; + goto row_level_insert; } - #ifdef WITH_WSREP if (trx->is_wsrep()) { if (!wsrep_thd_is_local_transaction(trx->mysql_thd)) - goto skip_bulk_insert; + goto row_level_insert; if (wsrep_append_table_key(trx->mysql_thd, *index->table)) { trx->error_state = DB_ROLLBACK; @@ -2781,17 +2767,36 @@ goto avoid_bulk; } + export_vars.innodb_bulk_operations++; + goto err_exit; + } + } else if (flags == (BTR_NO_UNDO_LOG_FLAG | BTR_NO_LOCKING_FLAG) + && !index->table->n_rec_locks) { + + ut_ad(index->table->skip_alter_undo); + ut_ad(!entry->is_metadata()); + if (innodb_alter_copy_bulk + && !index->table->is_temporary() + && !index->table->versioned() + && !index->table->has_spatial_index()) { + ut_ad(page_is_empty(block->page.frame)); + /* This code path has been executed at the + start of the alter operation. Consecutive + insert operation are buffered in the + bulk buffer and doesn't check for constraint + validity of foreign key relationship. */ + trx_start_if_not_started(trx, true); + trx->bulk_insert = true; + auto m = trx->mod_tables.emplace(index->table, 0); + m.first->second.start_bulk_insert(index->table); + err = m.first->second.bulk_insert_buffered( + *entry, *index, trx); goto err_exit; } } -skip_bulk_insert: +row_level_insert: if (UNIV_UNLIKELY(entry->info_bits != 0)) { - ut_ad(entry->is_metadata()); - ut_ad(flags == BTR_NO_LOCKING_FLAG); - ut_ad(index->is_instant()); - ut_ad(!dict_index_is_online_ddl(index)); - const rec_t* rec = btr_pcur_get_rec(&pcur); if (rec_get_info_bits(rec, page_rec_is_comp(rec)) @@ -2895,9 +2900,20 @@ } } + if (err == DB_SUCCESS && entry->info_bits) { + if (buf_block_t* root + = btr_root_block_get(index, RW_X_LATCH, &mtr, + &err)) { + btr_set_instant(root, *index, &mtr); + } else { + ut_ad("cannot find root page" == 0); + } + } + mtr.commit(); if (big_rec) { + ut_ad(err == DB_SUCCESS); /* Online table rebuild could read (and ignore) the incomplete record at this point. If online rebuild is in progress, the @@ -3389,9 +3405,12 @@ if (index->is_btree()) { if (auto t= trx->check_bulk_buffer(index->table)) { - /* MDEV-25036 FIXME: check also foreign key - constraints */ - ut_ad(!trx->check_foreigns); + /* MDEV-25036 FIXME: + row_ins_check_foreign_constraint() check + should be done before buffering the insert + operation. */ + ut_ad(index->table->skip_alter_undo + || !trx->check_foreigns); return t->bulk_insert_buffered(*entry, *index, trx); } } diff -Nru mariadb-10.11.6/storage/innobase/row/row0merge.cc mariadb-10.11.9/storage/innobase/row/row0merge.cc --- mariadb-10.11.6/storage/innobase/row/row0merge.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0merge.cc 2024-08-03 07:29:59.000000000 +0000 @@ -120,7 +120,7 @@ ut_ad(mtr_started == scan_mtr->is_active()); DBUG_EXECUTE_IF("row_merge_instrument_log_check_flush", - log_sys.set_check_flush_or_checkpoint();); + log_sys.set_check_for_checkpoint();); for (idx_tuple_vec::iterator it = m_dtuple_vec.begin(); it != m_dtuple_vec.end(); @@ -128,7 +128,7 @@ dtuple = *it; ut_ad(dtuple); - if (log_sys.check_flush_or_checkpoint()) { + if (log_sys.check_for_checkpoint()) { if (mtr_started) { if (!btr_pcur_move_to_prev_on_page(pcur)) { error = DB_CORRUPTION; @@ -526,8 +526,6 @@ @param[in,out] row table row @param[in] ext cache of externally stored column prefixes, or NULL -@param[in] history_fts row is historical in a system-versioned table - on which a FTS_DOC_ID_INDEX(FTS_DOC_ID) exists @param[in,out] doc_id Doc ID if we are creating FTS index @param[in,out] conv_heap memory heap where to allocate data when @@ -550,7 +548,6 @@ fts_psort_t* psort_info, dtuple_t* row, const row_ext_t* ext, - const bool history_fts, doc_id_t* doc_id, mem_heap_t* conv_heap, dberr_t* err, @@ -615,7 +612,7 @@ : NULL; /* Process the Doc ID column */ - if (!v_col && (history_fts || *doc_id) + if (!v_col && *doc_id && col->ind == index->table->fts->doc_col) { fts_write_doc_id((byte*) &write_doc_id, *doc_id); @@ -676,7 +673,7 @@ } /* Tokenize and process data for FTS */ - if (!history_fts && (index->type & DICT_FTS)) { + if (index->type & DICT_FTS) { fts_doc_item_t* doc_item; byte* value; void* ptr; @@ -1895,6 +1892,7 @@ DBUG_ENTER("row_merge_read_clustered_index"); ut_ad((old_table == new_table) == !col_map); + ut_ad(old_table->fts || !new_table->fts || !new_table->versioned()); ut_ad(!defaults || col_map); ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE)); ut_ad(trx->id); @@ -2120,7 +2118,6 @@ dtuple_t* row; row_ext_t* ext; page_cur_t* cur = btr_pcur_get_page_cur(&pcur); - bool history_row, history_fts = false; stage->n_pk_recs_inc(); @@ -2235,6 +2232,8 @@ goto err_exit; } + buf_page_make_young_if_needed(&block->page); + page_cur_set_before_first(block, cur); if (!page_cur_move_to_next(cur) || page_cur_is_after_last(cur)) { @@ -2380,11 +2379,6 @@ row_heap); ut_ad(row); - history_row = new_table->versioned() - && dtuple_get_nth_field(row, new_table->vers_end) - ->vers_history_row(); - history_fts = history_row && new_table->fts; - for (ulint i = 0; i < n_nonnull; i++) { dfield_t* field = &row->fields[nonnull[i]]; @@ -2413,7 +2407,7 @@ } /* Get the next Doc ID */ - if (add_doc_id && !history_fts) { + if (add_doc_id) { doc_id++; } else { doc_id = 0; @@ -2453,7 +2447,9 @@ add_autoinc); if (new_table->versioned()) { - if (history_row) { + if (dtuple_get_nth_field(row, + new_table->vers_end) + ->vers_history_row()) { if (dfield_get_type(dfield)->prtype & DATA_NOT_NULL) { err = DB_UNSUPPORTED; my_error(ER_UNSUPPORTED_EXTENSION, MYF(0), @@ -2569,7 +2565,7 @@ if (UNIV_LIKELY (row && (rows_added = row_merge_buf_add( buf, fts_index, old_table, new_table, - psort_info, row, ext, history_fts, + psort_info, row, ext, &doc_id, conv_heap, &err, &v_heap, eval_table, trx, col_collate)))) { @@ -2902,7 +2898,7 @@ (!(rows_added = row_merge_buf_add( buf, fts_index, old_table, new_table, psort_info, - row, ext, history_fts, &doc_id, + row, ext, &doc_id, conv_heap, &err, &v_heap, eval_table, trx, col_collate)))) { /* An empty buffer should have enough @@ -3545,17 +3541,6 @@ of file marker). Thus, it must be at least one block. */ ut_ad(file->offset > 0); - /* These thd_progress* calls will crash on sol10-64 when innodb_plugin - is used. MDEV-9356: innodb.innodb_bug53290 fails (crashes) on - sol10-64 in buildbot. - */ -#ifndef __sun__ - /* Progress report only for "normal" indexes. */ - if (dup && !(dup->index->type & DICT_FTS)) { - thd_progress_init(trx->mysql_thd, 1); - } -#endif /* __sun__ */ - if (global_system_variables.log_warnings > 2) { sql_print_information("InnoDB: Online DDL : merge-sorting" " has estimated " ULINTPF " runs", @@ -3564,15 +3549,6 @@ /* Merge the runs until we have one big run */ do { - /* Report progress of merge sort to MySQL for - show processlist progress field */ - /* Progress report only for "normal" indexes. */ -#ifndef __sun__ - if (dup && !(dup->index->type & DICT_FTS)) { - thd_progress_report(trx->mysql_thd, file->offset - num_runs, file->offset); - } -#endif /* __sun__ */ - error = row_merge(trx, dup, file, block, tmpfd, &num_runs, run_offset, stage, crypt_block, space); @@ -3596,13 +3572,6 @@ ut_free(run_offset); - /* Progress report only for "normal" indexes. */ -#ifndef __sun__ - if (dup && !(dup->index->type & DICT_FTS)) { - thd_progress_end(trx->mysql_thd); - } -#endif /* __sun__ */ - DBUG_RETURN(error); } @@ -4380,9 +4349,7 @@ UNIV_PFS_IO defined, register the file descriptor with Performance Schema. @param[in] path location for creating temporary merge files, or NULL @return File descriptor */ -pfs_os_file_t -row_merge_file_create_low( - const char* path) +static pfs_os_file_t row_merge_file_create_mode(const char *path, int mode) { if (!path) { path = mysql_tmpdir; @@ -4423,6 +4390,13 @@ return(fd); } +/** Create a temporary file at the specified path. +@param path location for creating temporary merge files, or nullptr +@return File descriptor */ +pfs_os_file_t row_merge_file_create_low(const char *path) +{ + return row_merge_file_create_mode(path, O_BINARY | O_SEQUENTIAL); +} /** Create a merge file in the given location. @param[out] merge_file merge file structure @@ -4433,16 +4407,16 @@ merge_file_t* merge_file, const char* path) { - merge_file->fd = row_merge_file_create_low(path); merge_file->offset = 0; merge_file->n_rec = 0; - - if (merge_file->fd != OS_FILE_CLOSED) { - if (srv_disable_sort_file_cache) { - os_file_set_nocache(merge_file->fd, - "row0merge.cc", "sort"); - } - } + merge_file->fd = + row_merge_file_create_mode(path, +#if !defined _WIN32 && defined O_DIRECT + srv_disable_sort_file_cache + ? O_DIRECT | O_BINARY | O_SEQUENTIAL + : +#endif + O_BINARY | O_SEQUENTIAL); return(merge_file->fd); } @@ -5346,6 +5320,9 @@ else if (index->is_primary() && table->persistent_autoinc) btr_write_autoinc(index, table->autoinc - 1); err= btr_bulk.finish(err); + if (err == DB_SUCCESS && index->is_clust()) + table->stat_n_rows= (file && file->fd != OS_FILE_CLOSED) + ? file->n_rec : buf.n_tuples; return err; } @@ -5359,8 +5336,17 @@ continue; dberr_t err= write_to_index(i, trx); - if (err != DB_SUCCESS) + switch (err) { + default: + if (table->skip_alter_undo) + my_error_innodb(err, table->name.m_name, table->flags); + return err; + case DB_SUCCESS: + break; + case DB_DUPLICATE_KEY: + trx->error_info= index; return err; + } i++; } @@ -5377,18 +5363,8 @@ return err; } -dberr_t trx_t::bulk_insert_apply_low() +void trx_t::bulk_rollback_low() { - ut_ad(bulk_insert); - ut_ad(!check_unique_secondary); - ut_ad(!check_foreigns); - dberr_t err; - for (auto& t : mod_tables) - if (t.second.is_bulk_insert()) - if ((err= t.second.write_bulk(t.first, this)) != DB_SUCCESS) - goto bulk_rollback; - return DB_SUCCESS; -bulk_rollback: undo_no_t low_limit= UINT64_MAX; for (auto& t : mod_tables) { @@ -5398,9 +5374,37 @@ low_limit= t.second.get_first(); delete t.second.bulk_store; t.second.bulk_store= nullptr; + t.second.end_bulk_insert(); } } trx_savept_t bulk_save{low_limit}; rollback(&bulk_save); - return err; +} + +dberr_t trx_t::bulk_insert_apply_for_table(dict_table_t *table) +{ + auto it= mod_tables.find(table); + if (it != mod_tables.end()) + { + if (dberr_t err= it->second.write_bulk(table, this)) + { + bulk_rollback_low(); + return err; + } + it->second.end_bulk_insert(); + } + return DB_SUCCESS; +} + +dberr_t trx_t::bulk_insert_apply_low() +{ + ut_ad(bulk_insert); + for (auto& t : mod_tables) + if (t.second.is_bulk_insert()) + if (dberr_t err= t.second.write_bulk(t.first, this)) + { + bulk_rollback_low(); + return err; + } + return DB_SUCCESS; } diff -Nru mariadb-10.11.6/storage/innobase/row/row0mysql.cc mariadb-10.11.9/storage/innobase/row/row0mysql.cc --- mariadb-10.11.6/storage/innobase/row/row0mysql.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0mysql.cc 2024-08-03 07:29:59.000000000 +0000 @@ -695,6 +695,7 @@ DBUG_RETURN(true); case DB_DEADLOCK: + case DB_RECORD_CHANGED: case DB_LOCK_TABLE_FULL: rollback: /* Roll back the whole transaction; this resolution was added @@ -1585,7 +1586,8 @@ for (dict_foreign_t* foreign : table->referenced_set) { ut_ad(foreign->foreign_table); - if (foreign->foreign_table->fts) { + if (foreign->foreign_table->space + && foreign->foreign_table->fts) { fts_init_doc_id(foreign->foreign_table); } @@ -2383,7 +2385,6 @@ dict_table_change_id_in_cache(table, new_id); dict_index_t* index = UT_LIST_GET_FIRST(table->indexes); - if (index) index->clear_instant_alter(); /* Reset the root page numbers. */ for (; index; index = UT_LIST_GET_NEXT(indexes, index)) { diff -Nru mariadb-10.11.6/storage/innobase/row/row0purge.cc mariadb-10.11.9/storage/innobase/row/row0purge.cc --- mariadb-10.11.6/storage/innobase/row/row0purge.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0purge.cc 2024-08-03 07:29:59.000000000 +0000 @@ -822,7 +822,6 @@ buf_page_get(page_id_t(rseg.space->id, page_no), 0, RW_X_LATCH, &mtr)) { - block->page.set_accessed(); buf_page_make_young_if_needed(&block->page); byte* data_field = block->page.frame diff -Nru mariadb-10.11.6/storage/innobase/row/row0quiesce.cc mariadb-10.11.9/storage/innobase/row/row0quiesce.cc --- mariadb-10.11.6/storage/innobase/row/row0quiesce.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0quiesce.cc 2024-08-03 07:29:59.000000000 +0000 @@ -431,6 +431,10 @@ /*********************************************************************//** Write the table meta data after quiesce. @return DB_SUCCESS or error code */ + +/* Stack size 20904 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_quiesce_write_cfg( @@ -488,6 +492,7 @@ return(err); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /*********************************************************************//** Check whether a table has an FTS index defined on it. diff -Nru mariadb-10.11.6/storage/innobase/row/row0sel.cc mariadb-10.11.9/storage/innobase/row/row0sel.cc --- mariadb-10.11.6/storage/innobase/row/row0sel.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0sel.cc 2024-08-03 07:29:59.000000000 +0000 @@ -864,6 +864,13 @@ column version if any */ mtr_t* mtr) /*!< in: mtr */ { + if (prebuilt->trx->snapshot_isolation) { + ut_ad(prebuilt->trx->isolation_level + == TRX_ISO_READ_UNCOMMITTED); + *old_vers = rec; + return; + } + if (prebuilt->old_vers_heap) { mem_heap_empty(prebuilt->old_vers_heap); } else { @@ -1184,11 +1191,11 @@ ut_ad(page_align(first_rec) == cur_block->page.frame); ut_ad(match->valid); - match->block.page.lock.x_lock(); + match->block->page.lock.x_lock(); retry: cur_block = btr_pcur_get_block(pcur); - ut_ad(match->block.page.lock.have_x() - || match->block.page.lock.have_s()); + ut_ad(match->block->page.lock.have_x() + || match->block->page.lock.have_s()); ut_ad(page_is_leaf(cur_block->page.frame)); err = lock_sec_rec_read_check_and_lock( @@ -1222,6 +1229,7 @@ if (!cur_block) { goto func_end; } + buf_page_make_young_if_needed(&cur_block->page); } else { mtr->start(); goto func_end; @@ -1287,7 +1295,7 @@ ULINT_UNDEFINED, &heap); err = lock_sec_rec_read_check_and_lock( - 0, &match->block, rtr_rec->r_rec, index, + 0, match->block, rtr_rec->r_rec, index, my_offsets, static_cast(mode), type, thr); @@ -1303,7 +1311,7 @@ match->locked = true; func_end: - match->block.page.lock.x_unlock(); + match->block->page.lock.x_unlock(); if (heap != NULL) { mem_heap_free(heap); } @@ -3400,7 +3408,7 @@ if (dict_index_is_spatial(sec_index) && btr_cur->rtr_info->matches && (page_align(rec) - == btr_cur->rtr_info->matches->block.page.frame + == btr_cur->rtr_info->matches->block->page.frame || rec != btr_pcur_get_rec(prebuilt->pcur))) { #ifdef UNIV_DEBUG rtr_info_t* rtr_info = btr_cur->rtr_info; @@ -4455,13 +4463,11 @@ DBUG_RETURN(DB_RECORD_NOT_FOUND); } +#if SIZEOF_SIZE_T < 8 + if (UNIV_LIKELY(~prebuilt->n_rows_fetched)) +#endif prebuilt->n_rows_fetched++; - if (prebuilt->n_rows_fetched > 1000000000) { - /* Prevent wrap-over */ - prebuilt->n_rows_fetched = 500000000; - } - mode = pcur->search_mode; } @@ -5253,7 +5259,20 @@ if (UNIV_LIKELY(prebuilt->row_read_type != ROW_READ_TRY_SEMI_CONSISTENT) || unique_search - || index != clust_index) { + || index != clust_index + /* If read view was opened, sel_set_rec_lock() + would return DB_RECORD_CHANGED, and we would not be + here. As read view wasn't opened, do locking read + instead of semi-consistent one for READ COMMITTED. + For READ UNCOMMITTED + row_sel_build_committed_vers_for_mysql() must read + uncommitted version of the record. For REPEATABLE + READ and SERIALIZABLE prebuilt->row_read_type + must be not equal to ROW_READ_TRY_SEMI_CONSISTENT, + so there will be locking read for those isolation + levels. */ + || (trx->snapshot_isolation && trx->isolation_level + == TRX_ISO_READ_COMMITTED )) { if (!prebuilt->skip_locked) { goto lock_wait_or_error; } diff -Nru mariadb-10.11.6/storage/innobase/row/row0umod.cc mariadb-10.11.9/storage/innobase/row/row0umod.cc --- mariadb-10.11.6/storage/innobase/row/row0umod.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0umod.cc 2024-08-03 07:29:59.000000000 +0000 @@ -190,7 +190,7 @@ @param[in] rec clustered index record @param[in] index clustered index @return the byte offset of DB_TRX_ID, from the start of rec */ -static ulint row_trx_id_offset(const rec_t* rec, const dict_index_t* index) +ulint row_trx_id_offset(const rec_t* rec, const dict_index_t* index) { ut_ad(index->n_uniq <= MAX_REF_PARTS); ulint trx_id_offset = index->trx_id_offset; diff -Nru mariadb-10.11.6/storage/innobase/row/row0undo.cc mariadb-10.11.9/storage/innobase/row/row0undo.cc --- mariadb-10.11.6/storage/innobase/row/row0undo.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0undo.cc 2024-08-03 07:29:59.000000000 +0000 @@ -318,6 +318,8 @@ return nullptr; } + buf_page_make_young_if_needed(&undo_page->page); + uint16_t offset = undo->top_offset; buf_block_t* prev_page = undo_page; diff -Nru mariadb-10.11.6/storage/innobase/row/row0upd.cc mariadb-10.11.9/storage/innobase/row/row0upd.cc --- mariadb-10.11.6/storage/innobase/row/row0upd.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/row/row0upd.cc 2024-08-03 07:29:59.000000000 +0000 @@ -2158,6 +2158,25 @@ return(inherit); } +/** Mark 'disowned' BLOBs as 'owned' and 'inherited' again, +after resuming from a lock wait. +@param entry clustered index entry */ +static ATTRIBUTE_COLD void row_upd_reown_inherited_fields(dtuple_t *entry) +{ + for (ulint i= 0; i < entry->n_fields; i++) + { + const dfield_t *dfield= dtuple_get_nth_field(entry, i); + if (dfield_is_ext(dfield)) + { + byte *blob_len= static_cast(dfield->data) + + dfield->len - (BTR_EXTERN_FIELD_REF_SIZE - BTR_EXTERN_LEN); + ut_ad(*blob_len & BTR_EXTERN_OWNER_FLAG); + *blob_len= byte((*blob_len & ~BTR_EXTERN_OWNER_FLAG) | + BTR_EXTERN_INHERITED_FLAG); + } + } +} + /***********************************************************//** Marks the clustered index record deleted and inserts the updated version of the record to the index. This function should be used when the ordering @@ -2236,12 +2255,16 @@ /* If the clustered index record is already delete marked, then we are here after a DB_LOCK_WAIT. Skip delete marking clustered index and disowning - its blobs. */ + its blobs. Mark the BLOBs in the index entry + (which we copied from the already "disowned" rec) + as "owned", like it was on the previous call of + row_upd_clust_rec_by_insert(). */ ut_ad(row_get_rec_trx_id(rec, index, offsets) == trx->id); ut_ad(!trx_undo_roll_ptr_is_insert( row_get_rec_roll_ptr(rec, index, offsets))); + row_upd_reown_inherited_fields(entry); goto check_fk; } diff -Nru mariadb-10.11.6/storage/innobase/srv/srv0mon.cc mariadb-10.11.9/storage/innobase/srv/srv0mon.cc --- mariadb-10.11.6/storage/innobase/srv/srv0mon.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/srv/srv0mon.cc 2024-08-03 07:29:59.000000000 +0000 @@ -364,11 +364,6 @@ MONITOR_NONE, MONITOR_DEFAULT_START, MONITOR_LRU_GET_FREE_LOOPS}, - {"buffer_LRU_get_free_waits", "buffer", - "Total sleep waits in LRU get free.", - MONITOR_NONE, - MONITOR_DEFAULT_START, MONITOR_LRU_GET_FREE_WAITS}, - {"buffer_flush_avg_page_rate", "buffer", "Average number of pages at which flushing is happening", MONITOR_NONE, @@ -472,11 +467,6 @@ MONITOR_EXISTING | MONITOR_DEFAULT_ON), MONITOR_DEFAULT_START, MONITOR_LRU_BATCH_EVICT_TOTAL_PAGE}, - {"buffer_LRU_single_flush_failure_count", "Buffer", - "Number of times attempt to flush a single page from LRU failed", - MONITOR_NONE, - MONITOR_DEFAULT_START, MONITOR_LRU_SINGLE_FLUSH_FAILURE_COUNT}, - {"buffer_LRU_get_free_search", "Buffer", "Number of searches performed for a clean page", MONITOR_NONE, diff -Nru mariadb-10.11.6/storage/innobase/srv/srv0srv.cc mariadb-10.11.9/storage/innobase/srv/srv0srv.cc --- mariadb-10.11.6/storage/innobase/srv/srv0srv.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/srv/srv0srv.cc 2024-08-03 07:29:59.000000000 +0000 @@ -106,9 +106,6 @@ any of the rollback-segment based on configuration used. */ uint32_t srv_undo_tablespaces_active; -/** Rate at which UNDO records should be purged. */ -ulong srv_purge_rseg_truncate_frequency; - /** Enable or Disable Truncate of UNDO tablespace. Note: If enabled then UNDO tablespace will be selected for truncate. While Server waits for undo-tablespace to truncate if user disables @@ -356,6 +353,10 @@ PRIMARY KEY */ my_bool srv_force_primary_key; +/** innodb_alter_copy_bulk; Whether to allow bulk insert operation +inside InnoDB alter for copy algorithm; */ +my_bool innodb_alter_copy_bulk; + /** Key version to encrypt the temporary tablespace */ my_bool innodb_encrypt_temporary_tables; @@ -901,6 +902,9 @@ export_vars.innodb_data_written = srv_stats.data_written + (dblwr << srv_page_size_shift); + export_vars.innodb_buffer_pool_read_requests + = buf_pool.stat.n_page_gets; + export_vars.innodb_buffer_pool_bytes_data = buf_pool.stat.LRU_bytes + (UT_LIST_GET_LEN(buf_pool.unzip_LRU) @@ -1503,7 +1507,8 @@ ulint n_pages_handled= trx_purge(n_threads, history_size); if (!trx_sys.history_exists()) goto no_history; - if (purge_sys.truncate.current || srv_shutdown_state != SRV_SHUTDOWN_NONE) + if (purge_sys.truncating_tablespace() || + srv_shutdown_state != SRV_SHUTDOWN_NONE) { purge_truncation_task.wait(); trx_purge_truncate_history(); diff -Nru mariadb-10.11.6/storage/innobase/srv/srv0start.cc mariadb-10.11.9/storage/innobase/srv/srv0start.cc --- mariadb-10.11.6/storage/innobase/srv/srv0start.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/srv/srv0start.cc 2024-08-03 07:29:59.000000000 +0000 @@ -91,10 +91,6 @@ #include "zlib.h" #include "log.h" -/** We are prepared for a situation that we have this many threads waiting for -a transactional lock inside InnoDB. srv_start() sets the value. */ -ulint srv_max_n_threads; - /** Log sequence number at shutdown */ lsn_t srv_shutdown_lsn; @@ -179,7 +175,7 @@ /* We will retain ib_logfile0 until we have written a new logically empty log as ib_logfile101 and atomically renamed it to - ib_logfile0 in log_t::rename_resized(). */ + ib_logfile0 in log_t::resize_rename(). */ delete_log_files(); ut_ad(!os_aio_pending_reads()); @@ -201,7 +197,7 @@ bool ret; os_file_t file{ os_file_create_func(logfile0.c_str(), - OS_FILE_CREATE | OS_FILE_ON_ERROR_NO_EXIT, + OS_FILE_CREATE, OS_FILE_NORMAL, OS_LOG_FILE, false, &ret) }; @@ -374,6 +370,11 @@ sys_header->page.frame + TRX_SYS_DOUBLEWRITE + FSEG_HEADER_SIZE + TRX_SYS_DOUBLEWRITE_REPEAT, sys_header->page.frame + TRX_SYS_DOUBLEWRITE + FSEG_HEADER_SIZE, 12); + mtr->write<4>( + *sys_header, + TRX_SYS_DOUBLEWRITE + TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED + + sys_header->page.frame, + TRX_SYS_DOUBLEWRITE_SPACE_ID_STORED_N); } return DB_SUCCESS; @@ -468,7 +469,7 @@ rseg->init(nullptr, FIL_NULL); } - if (trx_sys.recovered_binlog_lsn + if (*trx_sys.recovered_binlog_filename #ifdef WITH_WSREP || !trx_sys.recovered_wsrep_xid.is_null() #endif /* WITH_WSREP */ @@ -476,7 +477,7 @@ { /* Update binlog offset, binlog file name & wsrep xid in system tablespace rollback segment */ - if (trx_sys.recovered_binlog_lsn) + if (*trx_sys.recovered_binlog_filename) { ut_d(const size_t len = strlen(trx_sys.recovered_binlog_filename) + 1); ut_ad(len > 1); @@ -632,15 +633,15 @@ } } - pfs_os_file_t fh= os_file_create(innodb_data_file_key, name, OS_FILE_OPEN | - OS_FILE_ON_ERROR_NO_EXIT | - OS_FILE_ON_ERROR_SILENT, + pfs_os_file_t fh= os_file_create(innodb_data_file_key, name, + OS_FILE_OPEN_SILENT, OS_FILE_AIO, OS_DATA_FILE, srv_read_only_mode, &success); if (!success) return 0; + ulint n_retries = 5; os_offset_t size= os_file_get_size(fh); ut_a(size != os_offset_t(-1)); @@ -648,15 +649,25 @@ { page_t *page= static_cast(aligned_malloc(srv_page_size, srv_page_size)); +undo_retry: if (os_file_read(IORequestRead, fh, page, 0, srv_page_size, nullptr) != DB_SUCCESS) { err_exit: + if (n_retries && srv_operation == SRV_OPERATION_BACKUP) + { + sql_print_information("InnoDB: Retrying to read undo " + "tablespace %s", name); + n_retries--; + goto undo_retry; + } ib::error() << "Unable to read first page of file " << name; aligned_free(page); return ~0U; } + DBUG_EXECUTE_IF("undo_space_read_fail", goto err_exit;); + uint32_t id= mach_read_from_4(FIL_PAGE_SPACE_ID + page); if (id == 0 || id >= SRV_SPACE_ID_UPPER_BOUND || memcmp_aligned<2>(FIL_PAGE_SPACE_ID + page, @@ -669,13 +680,9 @@ space_id= id; fsp_flags= mach_read_from_4(FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page); - if (buf_page_is_corrupted(false, page, fsp_flags)) - { - sql_print_error("InnoDB: Checksum mismatch in the first page of file %s", - name); - if (recv_sys.dblwr.restore_first_page(space_id, name, fh)) - goto err_exit; - } + if (buf_page_is_corrupted(false, page, fsp_flags) && + recv_sys.dblwr.restore_first_page(space_id, name, fh)) + goto err_exit; aligned_free(page); } @@ -731,9 +738,7 @@ fh = os_file_create_func( name, - OS_FILE_OPEN_RETRY - | OS_FILE_ON_ERROR_NO_EXIT - | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_RETRY_SILENT, OS_FILE_NORMAL, OS_DATA_FILE, srv_read_only_mode, @@ -755,8 +760,7 @@ auto logfilename = get_log_file_path(); fh = os_file_create_func(logfilename.c_str(), - OS_FILE_OPEN_RETRY | OS_FILE_ON_ERROR_NO_EXIT - | OS_FILE_ON_ERROR_SILENT, + OS_FILE_OPEN_RETRY_SILENT, OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode, &ret); @@ -819,7 +823,7 @@ { char name[OS_FILE_MAX_PATH]; snprintf(name, sizeof name, "%s/undo%03u", srv_undo_dir, i); - uint32_t space_id= srv_undo_tablespace_open(create_new_undo, name, i); + uint32_t space_id= srv_undo_tablespace_open(false, name, i); if (!space_id || space_id == ~0U) break; if (0 == srv_undo_tablespaces_open++) @@ -1122,10 +1126,14 @@ if (srv_force_recovery) { ib::info() << "!!! innodb_force_recovery is set to " << srv_force_recovery << " !!!"; + if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { + srv_read_only_mode = true; + } } - if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { - srv_read_only_mode = true; + if (srv_read_only_mode) { + sql_print_information("InnoDB: Started in read only mode"); + srv_use_doublewrite_buf = false; } high_level_read_only = srv_read_only_mode @@ -1175,12 +1183,6 @@ mysql_stage_register("innodb", srv_stages, static_cast(UT_ARR_SIZE(srv_stages))); - srv_max_n_threads = - 1 /* dict_stats_thread */ - + 1 /* fts_optimize_thread */ - + 128 /* safety margin */ - + max_connections; - srv_boot(); ib::info() << my_crc32c_implementation(); @@ -1302,6 +1304,10 @@ ut_ad(buf_page_cleaner_is_active); } + if (innodb_encrypt_temporary_tables && !log_crypt_init()) { + return srv_init_abort(DB_ERROR); + } + /* Check if undo tablespaces and redo log files exist before creating a new system tablespace */ if (create_new_db) { @@ -1310,6 +1316,11 @@ return(srv_init_abort(DB_ERROR)); } recv_sys.debug_free(); + } else { + err = recv_recovery_read_checkpoint(); + if (err != DB_SUCCESS) { + return srv_init_abort(err); + } } /* Open or create the data files. */ @@ -1334,12 +1345,9 @@ " old data files which contain your precious data!"; /* fall through */ default: - /* Other errors might come from Datafile::validate_first_page() */ - return(srv_init_abort(err)); - } - - if (innodb_encrypt_temporary_tables && !log_crypt_init()) { - return srv_init_abort(DB_ERROR); + /* Other errors might be flagged by + Datafile::validate_first_page() */ + return srv_init_abort(err); } if (create_new_db) { @@ -1355,10 +1363,10 @@ return srv_init_abort(err); } - srv_undo_space_id_start= 1; + srv_undo_space_id_start = 1; } - /* Open log file and data files in the systemtablespace: we keep + /* Open data files in the system tablespace: we keep them open until database shutdown */ ut_d(fil_system.sys_space->recv_size = srv_sys_space_size_debug); @@ -1513,6 +1521,71 @@ fil_system.space_id_reuse_warned = false; + if (srv_operation > SRV_OPERATION_EXPORT_RESTORED) { + ut_ad(srv_operation == SRV_OPERATION_RESTORE_EXPORT + || srv_operation == SRV_OPERATION_RESTORE); + return(err); + } + + /* Upgrade or resize or rebuild the redo logs before + generating any dirty pages, so that the old redo log + file will not be written to. */ + + if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { + /* Completely ignore the redo log. */ + } else if (srv_read_only_mode) { + /* Leave the redo log alone. */ + } else if (log_sys.file_size == srv_log_file_size + && log_sys.format + == (srv_encrypt_log + ? log_t::FORMAT_ENC_10_8 + : log_t::FORMAT_10_8)) { + /* No need to add or remove encryption, + upgrade, or resize. */ + delete_log_files(); + } else { + /* Prepare to delete the old redo log file */ + const lsn_t lsn{srv_prepare_to_delete_redo_log_file()}; + + DBUG_EXECUTE_IF("innodb_log_abort_1", + return(srv_init_abort(DB_ERROR));); + /* Prohibit redo log writes from any other + threads until creating a log checkpoint at the + end of create_log_file(). */ + ut_d(recv_no_log_write = true); + ut_ad(!os_aio_pending_reads()); + ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex)); + ut_ad(!buf_pool.get_oldest_modification(0)); + ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex)); + /* os_aio_pending_writes() may hold here if + some write_io_callback() did not release the + slot yet. However, the page write itself must + have completed, because the buf_pool.flush_list + is empty. In debug builds, we wait for this to + happen, hoping to get a hung process if this + assumption does not hold. */ + ut_d(os_aio_wait_until_no_pending_writes(false)); + + /* Close the redo log file, so that we can replace it */ + log_sys.close_file(); + + DBUG_EXECUTE_IF("innodb_log_abort_5", + return(srv_init_abort(DB_ERROR));); + DBUG_PRINT("ib_log", ("After innodb_log_abort_5")); + + err = create_log_file(false, lsn); + + if (err == DB_SUCCESS && log_sys.resize_rename()) { + err = DB_ERROR; + } + + if (err != DB_SUCCESS) { + return(srv_init_abort(err)); + } + } + + recv_sys.debug_free(); + if (!srv_read_only_mode) { const uint32_t flags = FSP_FLAGS_PAGE_SSIZE(); for (uint32_t id = srv_undo_space_id_start; @@ -1597,71 +1670,6 @@ return(srv_init_abort(DB_ERROR)); } } - - if (srv_operation > SRV_OPERATION_EXPORT_RESTORED) { - ut_ad(srv_operation == SRV_OPERATION_RESTORE_EXPORT - || srv_operation == SRV_OPERATION_RESTORE); - return(err); - } - - /* Upgrade or resize or rebuild the redo logs before - generating any dirty pages, so that the old redo log - file will not be written to. */ - - if (srv_force_recovery == SRV_FORCE_NO_LOG_REDO) { - /* Completely ignore the redo log. */ - } else if (srv_read_only_mode) { - /* Leave the redo log alone. */ - } else if (log_sys.file_size == srv_log_file_size - && log_sys.format - == (srv_encrypt_log - ? log_t::FORMAT_ENC_10_8 - : log_t::FORMAT_10_8)) { - /* No need to add or remove encryption, - upgrade, or resize. */ - delete_log_files(); - } else { - /* Prepare to delete the old redo log file */ - const lsn_t lsn{srv_prepare_to_delete_redo_log_file()}; - - DBUG_EXECUTE_IF("innodb_log_abort_1", - return(srv_init_abort(DB_ERROR));); - /* Prohibit redo log writes from any other - threads until creating a log checkpoint at the - end of create_log_file(). */ - ut_d(recv_no_log_write = true); - ut_ad(!os_aio_pending_reads()); - ut_d(mysql_mutex_lock(&buf_pool.flush_list_mutex)); - ut_ad(!buf_pool.get_oldest_modification(0)); - ut_d(mysql_mutex_unlock(&buf_pool.flush_list_mutex)); - /* os_aio_pending_writes() may hold here if - some write_io_callback() did not release the - slot yet. However, the page write itself must - have completed, because the buf_pool.flush_list - is empty. In debug builds, we wait for this to - happen, hoping to get a hung process if this - assumption does not hold. */ - ut_d(os_aio_wait_until_no_pending_writes(false)); - - /* Close the redo log file, so that we can replace it */ - log_sys.close_file(); - - DBUG_EXECUTE_IF("innodb_log_abort_5", - return(srv_init_abort(DB_ERROR));); - DBUG_PRINT("ib_log", ("After innodb_log_abort_5")); - - err = create_log_file(false, lsn); - - if (err == DB_SUCCESS && log_sys.resize_rename()) { - err = DB_ERROR; - } - - if (err != DB_SUCCESS) { - return(srv_init_abort(err)); - } - } - - recv_sys.debug_free(); } ut_ad(err == DB_SUCCESS); @@ -1771,21 +1779,13 @@ } if (srv_force_recovery < SRV_FORCE_NO_UNDO_LOG_SCAN) { - /* The following call is necessary for the insert + /* The following call is necessary for the change buffer to work with multiple tablespaces. We must know the mapping between space id's and .ibd file names. - In a crash recovery, we check that the info in data - dictionary is consistent with what we already know - about space id's from the calls to fil_ibd_load(). - - In a normal startup, we create the space objects for - every table in the InnoDB data dictionary that has - an .ibd file. - We also determine the maximum tablespace id used. */ - dict_check_tablespaces_and_store_max_id(); + dict_check_tablespaces_and_store_max_id(nullptr); } if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO @@ -1933,7 +1933,7 @@ better prevent any further changes from being buffered. */ innodb_change_buffering= 0; - if (trx_sys.is_initialised()) + if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO && srv_was_started) while (trx_sys.any_active_transactions()) std::this_thread::sleep_for(std::chrono::milliseconds(1)); } diff -Nru mariadb-10.11.6/storage/innobase/sync/cache.cc mariadb-10.11.9/storage/innobase/sync/cache.cc --- mariadb-10.11.6/storage/innobase/sync/cache.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/sync/cache.cc 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,160 @@ +/***************************************************************************** + +Copyright (c) 2024, MariaDB plc + +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; version 2 of the License. + +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, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +/* This is based on the implementation of pmem_persist() in +https://github.com/pmem/pmdk/, Copyright 2014-2020, Intel Corporation, +last revised in libpmem-1.12.0. */ + +#include "my_global.h" +#include "cache.h" +#include + +#if defined __x86_64__ || defined __aarch64__ || defined __powerpc64__ +# ifdef __x86_64__ +static void pmem_clflush(const void *buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__("clflush %0" :: + "m"(*reinterpret_cast(u)) : "memory"); +} + +static void pmem_clflushopt(const void *buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__(".byte 0x66; clflush %0" /* clflushopt */ :: + "m"(*reinterpret_cast(u)) : "memory"); + __asm__ __volatile__("sfence" ::: "memory"); +} + +static void pmem_clwb(const void *buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__(".byte 0x66; xsaveopt %0" /* clwb */ :: + "m"(*reinterpret_cast(u)) : "memory"); + __asm__ __volatile__("sfence" ::: "memory"); +} + +# include +static decltype(pmem_control::persist) pmem_persist_init() +{ + uint32_t eax= 0, ebx= 0, ecx= 0, edx= 0; + __cpuid_count(7, 0, eax, ebx, ecx, edx); + if (ebx & 1U<<24 /* CLWB */) + return pmem_clwb; + else if (ebx & 1U<<23 /* CLFLUSHOPT */) + return pmem_clflushopt; + else + return pmem_clflush; +} +# elif defined __aarch64__ +static void pmem_cvac(const void* buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__("dc cvac, %0" :: "r"(u) : "memory"); + __asm__ __volatile__("dmb ishst" ::: "memory"); +} + +static void pmem_cvap(const void* buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + __asm__ __volatile__(".arch armv8.2-a\n dc cvap, %0" :: "r"(u) : "memory"); + __asm__ __volatile__("dmb ishst" ::: "memory"); +} + +# include +# include +# ifndef HWCAP_DCPOP +# define HWCAP_DCPOP (1 << 16) +# endif + +static decltype(pmem_control::persist) pmem_persist_init() +{ + return (getauxval(AT_HWCAP) & HWCAP_DCPOP) ? pmem_cvap : pmem_cvac; +} +# elif defined __powerpc64__ +static void pmem_phwsync(const void* buf, size_t size) +{ + for (uintptr_t u= uintptr_t(buf) & ~(CPU_LEVEL1_DCACHE_LINESIZE), + end= uintptr_t(buf) + size; + u < end; u+= CPU_LEVEL1_DCACHE_LINESIZE) + { + /* GCC is just passing the inline asm snippets to the assembler, + and it does not even define these mnemonics by itself. Clang does, + and it includes a built-in assembler. + + Let us hope that having a recent enough GCC is an adequate proxy + for having a recent enough assembler. */ +# if __GNUC__ >= 11 || (defined __clang_major__ && __clang_major__ >= 12) + __asm__ __volatile__("dcbstps 0,%0" :: "r"(u) : "memory"); +# else + __asm__ __volatile__(".long (0x7cc000AC | %0 << 11)" :: "r"(u) : "memory"); +# endif + } + +# if __GNUC__ >= 11 || (defined __clang_major__ && __clang_major__ >= 18) + __asm__ __volatile__("phwsync" ::: "memory"); +# else + __asm__ __volatile__(".long 0x7c80040a" ::: "memory"); +# endif +} + +# include +static void pmem_fence(const void*, size_t) +{ + std::atomic_thread_fence(std::memory_order_seq_cst); +} + +# include +# ifndef AT_HWCAP2 +# define AT_HWCAP2 26 +# endif +# ifndef PPC_FEATURE2_ARCH_3_1 +# define PPC_FEATURE2_ARCH_3_1 4 +# endif + +static decltype(pmem_control::persist) pmem_persist_init() +{ + return (getauxval(AT_HWCAP2) & PPC_FEATURE2_ARCH_3_1) + ? pmem_phwsync : pmem_fence; +} +# endif + +pmem_control::pmem_control() : persist(pmem_persist_init()) {} +const pmem_control pmem; +#else +void pmem_persist(const void *buf, size_t size) +{ +# if defined __riscv && __riscv_xlen == 64 + __asm__ __volatile__("fence w,w" ::: "memory"); +# elif defined __loongarch64 + __asm__ __volatile__("dbar 0" ::: "memory"); +# else +# error "Missing implementation; recompile with cmake -DWITH_INNODB_PMEM=OFF" +# endif +} +#endif diff -Nru mariadb-10.11.6/storage/innobase/sync/srw_lock.cc mariadb-10.11.9/storage/innobase/sync/srw_lock.cc --- mariadb-10.11.6/storage/innobase/sync/srw_lock.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/sync/srw_lock.cc 2024-08-03 07:29:59.000000000 +0000 @@ -143,8 +143,7 @@ HMT_medium(); } -#ifdef SUX_LOCK_GENERIC -# ifndef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP +#ifndef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP template<> void pthread_mutex_wrapper::wr_wait() { const unsigned delay= srw_pause_delay(); @@ -158,8 +157,9 @@ pthread_mutex_lock(&lock); } -# endif +#endif +#ifdef SUX_LOCK_GENERIC template void ssux_lock_impl::init(); template void ssux_lock_impl::init(); template void ssux_lock_impl::destroy(); @@ -191,6 +191,13 @@ pthread_mutex_unlock(&mutex); } template +inline void srw_mutex_impl::wake_all() +{ + pthread_mutex_lock(&mutex); + pthread_cond_broadcast(&cond); + pthread_mutex_unlock(&mutex); +} +template void ssux_lock_impl::wake() { pthread_mutex_lock(&writer.mutex); @@ -207,6 +214,8 @@ { WaitOnAddress(&lock, &lk, 4, INFINITE); } template void srw_mutex_impl::wake() { WakeByAddressSingle(&lock); } +template +inline void srw_mutex_impl::wake_all() { WakeByAddressAll(&lock); } template inline void ssux_lock_impl::wait(uint32_t lk) @@ -244,6 +253,8 @@ { SRW_FUTEX(&lock, WAIT, lk); } template void srw_mutex_impl::wake() { SRW_FUTEX(&lock, WAKE, 1); } +template +void srw_mutex_impl::wake_all() { SRW_FUTEX(&lock, WAKE, INT_MAX); } template inline void ssux_lock_impl::wait(uint32_t lk) @@ -304,9 +315,8 @@ for (auto spin= srv_n_spin_wait_rounds;;) { DBUG_ASSERT(~HOLDER & lk); - if (lk & HOLDER) - lk= lock.load(std::memory_order_relaxed); - else + lk= lock.load(std::memory_order_relaxed); + if (!(lk & HOLDER)) { #ifdef IF_NOT_FETCH_OR_GOTO static_assert(HOLDER == (1U << 31), "compatibility"); @@ -316,10 +326,10 @@ if (!((lk= lock.fetch_or(HOLDER, std::memory_order_relaxed)) & HOLDER)) goto acquired; #endif - srw_pause(delay); } if (!--spin) break; + srw_pause(delay); } } @@ -392,14 +402,52 @@ template void ssux_lock_impl::rd_wait() { + const unsigned delay= srw_pause_delay(); + + if (spinloop) + { + for (auto spin= srv_n_spin_wait_rounds; spin; spin--) + { + srw_pause(delay); + if (rd_lock_try()) + return; + } + } + + /* Subscribe to writer.wake() or write.wake_all() calls by + concurrently executing rd_wait() or writer.wr_unlock(). */ + uint32_t wl= 1 + writer.lock.fetch_add(1, std::memory_order_acquire); + for (;;) { - writer.wr_lock(); - bool acquired= rd_lock_try(); - writer.wr_unlock(); - if (acquired) + if (UNIV_LIKELY(writer.HOLDER & wl)) + writer.wait(wl); + uint32_t lk= rd_lock_try_low(); + if (!lk) break; + if (UNIV_UNLIKELY(lk == WRITER)) /* A wr_lock() just succeeded. */ + /* Immediately wake up (also) wr_lock(). We may also unnecessarily + wake up other concurrent threads that are executing rd_wait(). + If we invoked writer.wake() here to wake up just one thread, + we could wake up a rd_wait(), which then would invoke writer.wake(), + waking up possibly another rd_wait(), and we could end up doing + lots of non-productive context switching until the wr_lock() + is finally woken up. */ + writer.wake_all(); + srw_pause(delay); + wl= writer.lock.load(std::memory_order_acquire); + ut_ad(wl); } + + /* Unsubscribe writer.wake() and writer.wake_all(). */ + wl= writer.lock.fetch_sub(1, std::memory_order_release); + ut_ad(wl); + + /* Wake any other threads that may be blocked in writer.wait(). + All other waiters than this rd_wait() would end up acquiring writer.lock + and waking up other threads on unlock(). */ + if (wl > 1) + writer.wake_all(); } template void ssux_lock_impl::rd_wait(); @@ -462,17 +510,40 @@ void srw_lock_impl::psi_wr_lock(const char *file, unsigned line) { PSI_rwlock_locker_state state; - const bool nowait= lock.wr_lock_try(); +# if defined _WIN32 || defined SUX_LOCK_GENERIC + const bool nowait2= lock.wr_lock_try(); +# else + const bool nowait1= lock.writer.wr_lock_try(); + uint32_t lk= 0; + const bool nowait2= nowait1 && + lock.readers.compare_exchange_strong(lk, lock.WRITER, + std::memory_order_acquire, + std::memory_order_relaxed); +# endif if (PSI_rwlock_locker *locker= PSI_RWLOCK_CALL(start_rwlock_wrwait) (&state, pfs_psi, - nowait ? PSI_RWLOCK_TRYWRITELOCK : PSI_RWLOCK_WRITELOCK, file, line)) + nowait2 ? PSI_RWLOCK_TRYWRITELOCK : PSI_RWLOCK_WRITELOCK, file, line)) { - if (!nowait) +# if defined _WIN32 || defined SUX_LOCK_GENERIC + if (!nowait2) lock.wr_lock(); +# else + if (!nowait1) + lock.wr_lock(); + else if (!nowait2) + lock.u_wr_upgrade(); +# endif PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, 0); } - else if (!nowait) +# if defined _WIN32 || defined SUX_LOCK_GENERIC + else if (!nowait2) + lock.wr_lock(); +# else + else if (!nowait1) lock.wr_lock(); + else if (!nowait2) + lock.u_wr_upgrade(); +# endif } void ssux_lock::psi_rd_lock(const char *file, unsigned line) @@ -507,25 +578,48 @@ void ssux_lock::psi_wr_lock(const char *file, unsigned line) { PSI_rwlock_locker_state state; - const bool nowait= lock.wr_lock_try(); +# if defined _WIN32 || defined SUX_LOCK_GENERIC + const bool nowait2= lock.wr_lock_try(); +# else + const bool nowait1= lock.writer.wr_lock_try(); + uint32_t lk= 0; + const bool nowait2= nowait1 && + lock.readers.compare_exchange_strong(lk, lock.WRITER, + std::memory_order_acquire, + std::memory_order_relaxed); +# endif if (PSI_rwlock_locker *locker= PSI_RWLOCK_CALL(start_rwlock_wrwait) (&state, pfs_psi, - nowait ? PSI_RWLOCK_TRYEXCLUSIVELOCK : PSI_RWLOCK_EXCLUSIVELOCK, + nowait2 ? PSI_RWLOCK_TRYEXCLUSIVELOCK : PSI_RWLOCK_EXCLUSIVELOCK, file, line)) { - if (!nowait) +# if defined _WIN32 || defined SUX_LOCK_GENERIC + if (!nowait2) + lock.wr_lock(); +# else + if (!nowait1) lock.wr_lock(); + else if (!nowait2) + lock.u_wr_upgrade(); +# endif PSI_RWLOCK_CALL(end_rwlock_rdwait)(locker, 0); } - else if (!nowait) +# if defined _WIN32 || defined SUX_LOCK_GENERIC + else if (!nowait2) + lock.wr_lock(); +# else + else if (!nowait1) lock.wr_lock(); + else if (!nowait2) + lock.u_wr_upgrade(); +# endif } void ssux_lock::psi_u_wr_upgrade(const char *file, unsigned line) { PSI_rwlock_locker_state state; DBUG_ASSERT(lock.writer.is_locked()); - uint32_t lk= 1; + uint32_t lk= 0; const bool nowait= lock.readers.compare_exchange_strong(lk, ssux_lock_impl::WRITER, std::memory_order_acquire, @@ -548,3 +642,124 @@ template void ssux_lock_impl::u_unlock(); template void ssux_lock_impl::wr_unlock(); #endif /* UNIV_PFS_RWLOCK */ + +#ifdef UNIV_DEBUG +void srw_lock_debug::SRW_LOCK_INIT(mysql_pfs_key_t key) +{ + srw_lock::SRW_LOCK_INIT(key); + readers_lock.init(); + ut_ad(!readers.load(std::memory_order_relaxed)); + ut_ad(!have_any()); +} + +void srw_lock_debug::destroy() +{ + ut_ad(!writer); + if (auto r= readers.load(std::memory_order_relaxed)) + { + readers.store(0, std::memory_order_relaxed); + ut_ad(r->empty()); + delete r; + } + srw_lock::destroy(); +} + +bool srw_lock_debug::wr_lock_try() +{ + ut_ad(!have_any()); + if (!srw_lock::wr_lock_try()) + return false; + ut_ad(!writer); + writer.store(pthread_self(), std::memory_order_relaxed); + return true; +} + +void srw_lock_debug::wr_lock(SRW_LOCK_ARGS(const char *file, unsigned line)) +{ + ut_ad(!have_any()); + srw_lock::wr_lock(SRW_LOCK_ARGS(file, line)); + ut_ad(!writer); + writer.store(pthread_self(), std::memory_order_relaxed); +} + +void srw_lock_debug::wr_unlock() +{ + ut_ad(have_wr()); + writer.store(0, std::memory_order_relaxed); + srw_lock::wr_unlock(); +} + +void srw_lock_debug::readers_register() +{ + readers_lock.wr_lock(); + auto r= readers.load(std::memory_order_relaxed); + if (!r) + { + r= new std::unordered_multiset(); + readers.store(r, std::memory_order_relaxed); + } + r->emplace(pthread_self()); + readers_lock.wr_unlock(); +} + +bool srw_lock_debug::rd_lock_try() +{ + ut_ad(!have_any()); + if (!srw_lock::rd_lock_try()) + return false; + readers_register(); + return true; +} + +void srw_lock_debug::rd_lock(SRW_LOCK_ARGS(const char *file, unsigned line)) +{ + ut_ad(!have_any()); + srw_lock::rd_lock(SRW_LOCK_ARGS(file, line)); + readers_register(); +} + +void srw_lock_debug::rd_unlock() +{ + const pthread_t self= pthread_self(); + ut_ad(writer != self); + readers_lock.wr_lock(); + auto r= readers.load(std::memory_order_relaxed); + ut_ad(r); + auto i= r->find(self); + ut_ad(i != r->end()); + r->erase(i); + readers_lock.wr_unlock(); + + srw_lock::rd_unlock(); +} + +bool srw_lock_debug::have_rd() const noexcept +{ + if (auto r= readers.load(std::memory_order_relaxed)) + { + readers_lock.wr_lock(); + bool found= r->find(pthread_self()) != r->end(); + readers_lock.wr_unlock(); +# ifndef SUX_LOCK_GENERIC + ut_ad(!found || is_locked()); +# endif + return found; + } + return false; +} + +bool srw_lock_debug::have_wr() const noexcept +{ + if (writer != pthread_self()) + return false; +# ifndef SUX_LOCK_GENERIC + ut_ad(is_write_locked()); +# endif + return true; +} + +bool srw_lock_debug::have_any() const noexcept +{ + return have_wr() || have_rd(); +} +#endif diff -Nru mariadb-10.11.6/storage/innobase/trx/trx0purge.cc mariadb-10.11.9/storage/innobase/trx/trx0purge.cc --- mariadb-10.11.6/storage/innobase/trx/trx0purge.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/trx/trx0purge.cc 2024-08-03 07:29:59.000000000 +0000 @@ -41,6 +41,7 @@ #include "dict0load.h" #include #include +#include "log.h" /** Maximum allowable purge history length. <=0 means 'infinite'. */ ulong srv_max_purge_lag = 0; @@ -55,84 +56,6 @@ my_bool srv_purge_view_update_only_debug; #endif /* UNIV_DEBUG */ -/** Sentinel value */ -static const TrxUndoRsegs NullElement; - -/** Default constructor */ -TrxUndoRsegsIterator::TrxUndoRsegsIterator() - : m_rsegs(NullElement), m_iter(m_rsegs.begin()) -{ -} - -/** Sets the next rseg to purge in purge_sys. -Executed in the purge coordinator thread. -@retval false when nothing is to be purged -@retval true when purge_sys.rseg->latch was locked */ -inline bool TrxUndoRsegsIterator::set_next() -{ - ut_ad(!purge_sys.next_stored); - mysql_mutex_lock(&purge_sys.pq_mutex); - - /* Only purge consumes events from the priority queue, user - threads only produce the events. */ - - /* Check if there are more rsegs to process in the - current element. */ - if (m_iter != m_rsegs.end()) { - /* We are still processing rollback segment from - the same transaction and so expected transaction - number shouldn't increase. Undo the increment of - expected commit done by caller assuming rollback - segments from given transaction are done. */ - purge_sys.tail.trx_no = (*m_iter)->last_trx_no(); - } else if (!purge_sys.purge_queue.empty()) { - m_rsegs = purge_sys.purge_queue.top(); - purge_sys.purge_queue.pop(); - ut_ad(purge_sys.purge_queue.empty() - || purge_sys.purge_queue.top() != m_rsegs); - m_iter = m_rsegs.begin(); - } else { - /* Queue is empty, reset iterator. */ - purge_sys.rseg = NULL; - mysql_mutex_unlock(&purge_sys.pq_mutex); - m_rsegs = NullElement; - m_iter = m_rsegs.begin(); - return false; - } - - purge_sys.rseg = *m_iter++; - mysql_mutex_unlock(&purge_sys.pq_mutex); - - /* We assume in purge of externally stored fields that space - id is in the range of UNDO tablespace space ids */ - ut_ad(purge_sys.rseg->space->id == TRX_SYS_SPACE - || srv_is_undo_tablespace(purge_sys.rseg->space->id)); - - purge_sys.rseg->latch.wr_lock(SRW_LOCK_CALL); - trx_id_t last_trx_no = purge_sys.rseg->last_trx_no(); - purge_sys.hdr_offset = purge_sys.rseg->last_offset(); - purge_sys.hdr_page_no = purge_sys.rseg->last_page_no; - - /* Only the purge_coordinator_task will access this object - purge_sys.rseg_iter, or any of purge_sys.hdr_page_no, - purge_sys.tail. - The field purge_sys.head and purge_sys.view are modified by - purge_sys_t::clone_end_view() - in the purge_coordinator_task - while holding exclusive purge_sys.latch. - The purge_sys.view may also be modified by - purge_sys_t::wake_if_not_active() while holding exclusive - purge_sys.latch. - The purge_sys.head may be read by - purge_truncation_callback(). */ - ut_ad(last_trx_no == m_rsegs.trx_no); - ut_a(purge_sys.hdr_page_no != FIL_NULL); - ut_a(purge_sys.tail.trx_no <= last_trx_no); - purge_sys.tail.trx_no = last_trx_no; - - return(true); -} - /** Build a purge 'query' graph. The actual purge is performed by executing this query graph. @return own: the query graph */ @@ -168,10 +91,15 @@ ut_ad(this == &purge_sys); ut_ad(!m_initialized); ut_ad(!enabled()); + ut_ad(!m_active); + /* If innodb_undo_tablespaces>0, the rollback segment 0 + (which always resides in the system tablespace) will + never be used; @see trx_assign_rseg_low() */ + skipped_rseg= srv_undo_tablespaces > 0; m_paused= 0; query= purge_graph_build(); next_stored= false; - rseg= NULL; + rseg= nullptr; page_no= 0; offset= 0; hdr_page_no= 0; @@ -179,8 +107,8 @@ latch.SRW_LOCK_INIT(trx_purge_latch_key); end_latch.init(); mysql_mutex_init(purge_sys_pq_mutex_key, &pq_mutex, nullptr); - truncate.current= NULL; - truncate.last= NULL; + truncate_undo_space.current= nullptr; + truncate_undo_space.last= 0; m_initialized= true; } @@ -339,7 +267,8 @@ that is known to be corrupted. */ ut_a(flst_add_first(rseg_header, TRX_RSEG + TRX_RSEG_HISTORY, undo_page, uint16_t(page_offset(undo_header) + - TRX_UNDO_HISTORY_NODE), mtr) == DB_SUCCESS); + TRX_UNDO_HISTORY_NODE), rseg->space->free_limit, + mtr) == DB_SUCCESS); mtr->write<2>(*undo_page, TRX_UNDO_SEG_HDR + TRX_UNDO_STATE + undo_page->page.frame, undo_state); @@ -350,14 +279,21 @@ } /** Free an undo log segment. -@param block rollback segment header page +@param rseg_hdr rollback segment header page +@param block undo segment header page @param mtr mini-transaction */ -static void trx_purge_free_segment(buf_block_t *block, mtr_t &mtr) +static void trx_purge_free_segment(buf_block_t *rseg_hdr, buf_block_t *block, + mtr_t &mtr) { + ut_ad(mtr.memo_contains_flagged(rseg_hdr, MTR_MEMO_PAGE_X_FIX)); + ut_ad(mtr.memo_contains_flagged(block, MTR_MEMO_PAGE_X_FIX)); + while (!fseg_free_step_not_header(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + block->page.frame, &mtr)) { + rseg_hdr->fix(); block->fix(); + ut_d(const page_id_t rseg_hdr_id{rseg_hdr->page.id()}); ut_d(const page_id_t id{block->page.id()}); mtr.commit(); /* NOTE: If the server is killed after the log that was produced @@ -368,26 +304,73 @@ This does not matter when using multiple innodb_undo_tablespaces; innodb_undo_log_truncate=ON will be able to reclaim the space. */ mtr.start(); + rseg_hdr->page.lock.x_lock(); + ut_ad(rseg_hdr->page.id() == rseg_hdr_id); block->page.lock.x_lock(); ut_ad(block->page.id() == id); - mtr.memo_push(block, MTR_MEMO_PAGE_X_MODIFY); + mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_FIX); + mtr.memo_push(block, MTR_MEMO_PAGE_X_FIX); } while (!fseg_free_step(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + block->page.frame, &mtr)); } +void purge_sys_t::rseg_enable(trx_rseg_t &rseg) +{ + ut_ad(this == &purge_sys); + ut_ad(rseg.latch.have_wr()); + uint8_t skipped= skipped_rseg; + ut_ad(skipped < TRX_SYS_N_RSEGS); + if (&rseg == &trx_sys.rseg_array[skipped]) + { + /* If this rollback segment is subject to innodb_undo_log_truncate=ON, + we must not clear the flag. But we will advance purge_sys.skipped_rseg + to be able to choose another candidate for this soft truncation, and + to prevent the following scenario: + + (1) purge_sys_t::iterator::free_history_rseg() had invoked + rseg.set_skip_allocation() + (2) undo log truncation had completed on this rollback segment + (3) SET GLOBAL innodb_undo_log_truncate=OFF + (4) purge_sys_t::iterator::free_history_rseg() would not be able to + invoke rseg.set_skip_allocation() on any other rollback segment + before this rseg has grown enough */ + if (truncate_undo_space.current != rseg.space) + rseg.clear_skip_allocation(); + skipped++; + /* If innodb_undo_tablespaces>0, the rollback segment 0 + (which always resides in the system tablespace) will + never be used; @see trx_assign_rseg_low() */ + if (!(skipped&= (TRX_SYS_N_RSEGS - 1)) && srv_undo_tablespaces) + skipped++; + skipped_rseg= skipped; + } +} + /** Remove unnecessary history data from a rollback segment. @param rseg rollback segment @param limit truncate anything before this -@param all whether everything can be truncated @return error code */ -static dberr_t -trx_purge_truncate_rseg_history(trx_rseg_t &rseg, - const purge_sys_t::iterator &limit, bool all) +inline dberr_t purge_sys_t::iterator::free_history_rseg(trx_rseg_t &rseg) const { fil_addr_t hdr_addr; mtr_t mtr; + bool freed= false; + uint32_t rseg_ref= 0; + const auto last_boffset= srv_page_size - TRX_UNDO_LOG_OLD_HDR_SIZE; + /* Technically, rseg.space->free_limit is not protected by + rseg.latch, which we are holding, but rseg.space->latch. The value + that we are reading may become stale (too small) if other pages are + being allocated in this tablespace, for other rollback + segments. Nothing can be added to this rseg without holding + rseg.latch, and hence we can validate the entire file-based list + against the limit that we are reading here. + + Note: The read here may look like a data race. On none of our target + architectures this should be an actual problem, because the uint32_t + value should always fit in a register and be correctly aligned. */ + const auto last_page= rseg.space->free_limit; mtr.start(); @@ -397,17 +380,29 @@ { func_exit: mtr.commit(); + if (freed && (rseg.SKIP & rseg_ref)) + purge_sys.rseg_enable(rseg); return err; } hdr_addr= flst_get_last(TRX_RSEG + TRX_RSEG_HISTORY + rseg_hdr->page.frame); - hdr_addr.boffset= static_cast(hdr_addr.boffset - - TRX_UNDO_HISTORY_NODE); -loop: if (hdr_addr.page == FIL_NULL) goto func_exit; + if (hdr_addr.page >= last_page || + hdr_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + hdr_addr.boffset >= last_boffset) + { + corrupted: + err= DB_CORRUPTION; + goto func_exit; + } + + hdr_addr.boffset= static_cast(hdr_addr.boffset - + TRX_UNDO_HISTORY_NODE); + +loop: buf_block_t *b= buf_page_get_gen(page_id_t(rseg.space->id, hdr_addr.page), 0, RW_X_LATCH, nullptr, BUF_GET_POSSIBLY_FREED, @@ -418,25 +413,56 @@ const trx_id_t undo_trx_no= mach_read_from_8(b->page.frame + hdr_addr.boffset + TRX_UNDO_TRX_NO); - if (undo_trx_no >= limit.trx_no) + if (undo_trx_no >= trx_no) { - if (undo_trx_no == limit.trx_no) - err = trx_undo_truncate_start(&rseg, hdr_addr.page, - hdr_addr.boffset, limit.undo_no); + if (undo_trx_no == trx_no) + err= trx_undo_truncate_start(&rseg, hdr_addr.page, + hdr_addr.boffset, undo_no); goto func_exit; } - - if (!all) - goto func_exit; + else + { + rseg_ref= rseg.ref_load(); + if (rseg_ref >= rseg.REF || !purge_sys.sees(rseg.needs_purge)) + { + /* We cannot clear this entire rseg because trx_assign_rseg_low() + has already chosen it for a future trx_undo_assign(), or + because some recently started transaction needs purging. + + If this invocation could not reduce rseg.history_size at all + (!freed), we will try to ensure progress and prevent our + starvation by disabling one rollback segment for future + trx_assign_rseg_low() invocations until a future invocation has + made progress and invoked purge_sys_t::rseg_enable(rseg) on that + rollback segment. */ + + if (!(rseg.SKIP & rseg_ref) && !freed && + ut_d(!trx_rseg_n_slots_debug &&) + &rseg == &trx_sys.rseg_array[purge_sys.skipped_rseg]) + /* If rseg.space == purge_sys.truncate_undo_space.current + the following will be a no-op. A possible conflict + with innodb_undo_log_truncate=ON will be handled in + purge_sys_t::rseg_enable(). */ + rseg.set_skip_allocation(); + goto func_exit; + } + } fil_addr_t prev_hdr_addr= flst_get_prev_addr(b->page.frame + hdr_addr.boffset + TRX_UNDO_HISTORY_NODE); + if (prev_hdr_addr.page == FIL_NULL); + else if (prev_hdr_addr.page >= last_page || + prev_hdr_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + prev_hdr_addr.boffset >= last_boffset) + goto corrupted; + prev_hdr_addr.boffset= static_cast(prev_hdr_addr.boffset - TRX_UNDO_HISTORY_NODE); err= flst_remove(rseg_hdr, TRX_RSEG + TRX_RSEG_HISTORY, b, - uint16_t(hdr_addr.boffset + TRX_UNDO_HISTORY_NODE), &mtr); + uint16_t(hdr_addr.boffset + TRX_UNDO_HISTORY_NODE), + last_page, &mtr); if (UNIV_UNLIKELY(err != DB_SUCCESS)) goto func_exit; @@ -459,7 +485,7 @@ free_segment: ut_ad(rseg.curr_size >= seg_size); rseg.curr_size-= seg_size; - trx_purge_free_segment(b, mtr); + trx_purge_free_segment(rseg_hdr, b, mtr); break; case TRX_UNDO_CACHED: /* rseg.undo_cached must point to this page */ @@ -490,50 +516,27 @@ mtr.commit(); ut_ad(rseg.history_size > 0); rseg.history_size--; + freed= true; mtr.start(); rseg_hdr->page.lock.x_lock(); ut_ad(rseg_hdr->page.id() == rseg.page_id()); - mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_MODIFY); + mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_FIX); + + if (hdr_addr.page == FIL_NULL) + goto func_exit; goto loop; } -/** Cleanse purge queue to remove the rseg that reside in undo-tablespace -marked for truncate. -@param[in] space undo tablespace being truncated */ -static void trx_purge_cleanse_purge_queue(const fil_space_t& space) -{ - typedef std::vector purge_elem_list_t; - purge_elem_list_t purge_elem_list; - - mysql_mutex_lock(&purge_sys.pq_mutex); - - /* Remove rseg instances that are in the purge queue before we start - truncate of corresponding UNDO truncate. */ - while (!purge_sys.purge_queue.empty()) { - purge_elem_list.push_back(purge_sys.purge_queue.top()); - purge_sys.purge_queue.pop(); - } - - for (purge_elem_list_t::iterator it = purge_elem_list.begin(); - it != purge_elem_list.end(); - ++it) { - - for (TrxUndoRsegs::iterator it2 = it->begin(); - it2 != it->end(); - ++it2) { - if ((*it2)->space == &space) { - it->erase(it2); - break; - } - } - - if (!it->empty()) { - purge_sys.purge_queue.push(*it); - } - } - - mysql_mutex_unlock(&purge_sys.pq_mutex); +void purge_sys_t::cleanse_purge_queue(const fil_space_t &space) +{ + mysql_mutex_lock(&pq_mutex); + auto purge_elem_list= clone_queue_container(); + purge_queue.clear(); + for (auto elem : purge_elem_list) + if (purge_queue::rseg(elem)->space != &space) + purge_queue.push_trx_no_rseg(elem); + mysql_mutex_unlock(&pq_mutex); } dberr_t purge_sys_t::iterator::free_history() const @@ -544,9 +547,7 @@ ut_ad(rseg.is_persistent()); log_free_check(); rseg.latch.wr_lock(SRW_LOCK_CALL); - dberr_t err= - trx_purge_truncate_rseg_history(rseg, *this, !rseg.is_referenced() && - purge_sys.sees(rseg.needs_purge)); + dberr_t err= free_history_rseg(rseg); rseg.latch.wr_unlock(); if (err) return err; @@ -554,6 +555,64 @@ return DB_SUCCESS; } +inline void trx_sys_t::undo_truncate_start(fil_space_t &space) +{ + ut_ad(this == &trx_sys); + /* Undo tablespace always are a single file. */ + ut_a(UT_LIST_GET_LEN(space.chain) == 1); + fil_node_t *file= UT_LIST_GET_FIRST(space.chain); + /* The undo tablespace files are never closed. */ + ut_ad(file->is_open()); + sql_print_information("InnoDB: Starting to truncate %s", file->name); + + for (auto &rseg : rseg_array) + if (rseg.space == &space) + { + /* Prevent a race with purge_sys_t::iterator::free_history_rseg() */ + rseg.latch.rd_lock(SRW_LOCK_CALL); + /* Once set, this rseg will not be allocated to subsequent + transactions, but we will wait for existing active + transactions to finish. */ + rseg.set_skip_allocation(); + rseg.latch.rd_unlock(); + } +} + +inline fil_space_t *purge_sys_t::undo_truncate_try(uint32_t id, uint32_t size) +{ + ut_ad(srv_is_undo_tablespace(id)); + fil_space_t *space= fil_space_get(id); + if (space && space->get_size() > size) + { + truncate_undo_space.current= space; + trx_sys.undo_truncate_start(*space); + return space; + } + return nullptr; +} + +fil_space_t *purge_sys_t::truncating_tablespace() +{ + ut_ad(this == &purge_sys); + + fil_space_t *space= truncate_undo_space.current; + if (space || srv_undo_tablespaces_active < 2 || !srv_undo_log_truncate) + return space; + + const uint32_t size= + uint32_t(std::min(ulonglong{std::numeric_limits::max()}, + srv_max_undo_log_size >> srv_page_size_shift)); + for (uint32_t i= truncate_undo_space.last, j= i;; ) + { + if (fil_space_t *s= undo_truncate_try(srv_undo_space_id_start + i, size)) + return s; + ++i; + i%= srv_undo_tablespaces_active; + if (i == j) + return nullptr; + } +} + #if defined __GNUC__ && __GNUC__ == 4 && !defined __clang__ # if defined __arm__ || defined __aarch64__ /* Work around an internal compiler error in GCC 4.8.5 */ @@ -579,55 +638,14 @@ head.undo_no= 0; } - if (head.free_history() != DB_SUCCESS || srv_undo_tablespaces_active < 2) + if (head.free_history() != DB_SUCCESS) return; - while (srv_undo_log_truncate) + while (fil_space_t *space= purge_sys.truncating_tablespace()) { - if (!purge_sys.truncate.current) - { - const ulint threshold= - ulint(srv_max_undo_log_size >> srv_page_size_shift); - for (uint32_t i= purge_sys.truncate.last - ? purge_sys.truncate.last->id - srv_undo_space_id_start : 0, - j= i;; ) - { - const uint32_t space_id= srv_undo_space_id_start + i; - ut_ad(srv_is_undo_tablespace(space_id)); - fil_space_t *space= fil_space_get(space_id); - ut_a(UT_LIST_GET_LEN(space->chain) == 1); - - if (space && space->get_size() > threshold) - { - purge_sys.truncate.current= space; - break; - } - - ++i; - i %= srv_undo_tablespaces_active; - if (i == j) - return; - } - } - - fil_space_t &space= *purge_sys.truncate.current; - /* Undo tablespace always are a single file. */ - fil_node_t *file= UT_LIST_GET_FIRST(space.chain); - /* The undo tablespace files are never closed. */ - ut_ad(file->is_open()); - - DBUG_LOG("undo", "marking for truncate: " << file->name); - - for (auto &rseg : trx_sys.rseg_array) - if (rseg.space == &space) - /* Once set, this rseg will not be allocated to subsequent - transactions, but we will wait for existing active - transactions to finish. */ - rseg.set_skip_allocation(); - for (auto &rseg : trx_sys.rseg_array) { - if (rseg.space != &space) + if (rseg.space != space) continue; rseg.latch.rd_lock(SRW_LOCK_CALL); @@ -660,15 +678,9 @@ rseg.latch.rd_unlock(); } - ib::info() << "Truncating " << file->name; - trx_purge_cleanse_purge_queue(space); - - log_free_check(); - - mtr_t mtr; - mtr.start(); - mtr.x_lock_space(&space); - const auto space_id= space.id; + const char *file_name= UT_LIST_GET_FIRST(space->chain)->name; + sql_print_information("InnoDB: Truncating %s", file_name); + purge_sys.cleanse_purge_queue(*space); /* Lock all modified pages of the tablespace. @@ -678,104 +690,41 @@ mini-transaction commit and the server was killed, then discarding the to-be-trimmed pages without flushing would break crash recovery. */ - rescan: - mysql_mutex_lock(&buf_pool.flush_list_mutex); - for (buf_page_t *bpage= UT_LIST_GET_LAST(buf_pool.flush_list); bpage; ) - { - ut_ad(bpage->oldest_modification()); - ut_ad(bpage->in_file()); - - buf_page_t *prev= UT_LIST_GET_PREV(list, bpage); - - if (bpage->oldest_modification() > 2 && bpage->id().space() == space_id) - { - ut_ad(bpage->frame); - bpage->fix(); - { - /* Try to acquire an exclusive latch while the cache line is - fresh after fix(). */ - const bool got_lock{bpage->lock.x_lock_try()}; - buf_pool.flush_hp.set(prev); - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - if (!got_lock) - bpage->lock.x_lock(); - } -#ifdef BTR_CUR_HASH_ADAPT - /* There is no AHI on undo tablespaces. */ - ut_ad(!reinterpret_cast(bpage)->index); -#endif - ut_ad(!bpage->is_io_fixed()); - ut_ad(bpage->id().space() == space_id); - - if (bpage->oldest_modification() > 2) - { - mtr.memo_push(reinterpret_cast(bpage), - MTR_MEMO_PAGE_X_FIX); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - ut_ad(bpage->oldest_modification() > 2); - bpage->reset_oldest_modification(); - } - else - { - bpage->unfix(); - bpage->lock.x_unlock(); - mysql_mutex_lock(&buf_pool.flush_list_mutex); - } - - if (prev != buf_pool.flush_hp.get()) - { - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - goto rescan; - } - } - - bpage= prev; - } - - mysql_mutex_unlock(&buf_pool.flush_list_mutex); - - /* Re-initialize tablespace, in a single mini-transaction. */ - const ulint size= SRV_UNDO_TABLESPACE_SIZE_IN_PAGES; + if (UNIV_UNLIKELY(srv_shutdown_state != SRV_SHUTDOWN_NONE) && + srv_fast_shutdown) + return; /* Adjust the tablespace metadata. */ mysql_mutex_lock(&fil_system.mutex); - space.set_stopping(); - space.is_being_truncated= true; - if (space.crypt_data) + if (space->crypt_data) { - space.reacquire(); + space->reacquire(); mysql_mutex_unlock(&fil_system.mutex); - fil_space_crypt_close_tablespace(&space); - space.release(); + fil_space_crypt_close_tablespace(space); + space->release(); } else mysql_mutex_unlock(&fil_system.mutex); - for (auto i= 6000; space.referenced(); - std::this_thread::sleep_for(std::chrono::milliseconds(10))) - { - if (!--i) - { - mtr.commit(); - ib::error() << "Failed to freeze UNDO tablespace " << file->name; - return; - } - } + /* Re-initialize tablespace, in a single mini-transaction. */ + const uint32_t size= SRV_UNDO_TABLESPACE_SIZE_IN_PAGES; + + log_free_check(); + mtr_t mtr; + mtr.start(); + mtr.x_lock_space(space); /* Associate the undo tablespace with mtr. During mtr::commit_shrink(), InnoDB can use the undo tablespace object to clear all freed ranges */ - mtr.set_named_space(&space); - mtr.trim_pages(page_id_t(space.id, size)); - ut_a(fsp_header_init(&space, size, &mtr) == DB_SUCCESS); - mysql_mutex_lock(&fil_system.mutex); - space.size= file->size= size; - mysql_mutex_unlock(&fil_system.mutex); + mtr.set_named_space(space); + mtr.trim_pages(page_id_t(space->id, size)); + ut_a(fsp_header_init(space, size, &mtr) == DB_SUCCESS); for (auto &rseg : trx_sys.rseg_array) { - if (rseg.space != &space) + if (rseg.space != space) continue; ut_ad(!rseg.is_referenced()); @@ -784,7 +733,7 @@ possibly before this server had been started up. */ dberr_t err; - buf_block_t *rblock= trx_rseg_header_create(&space, + buf_block_t *rblock= trx_rseg_header_create(space, &rseg - trx_sys.rseg_array, trx_sys.get_max_trx_id(), &mtr, &err); @@ -797,7 +746,7 @@ rseg.reinit(rblock->page.id().page_no()); } - mtr.commit_shrink(space); + mtr.commit_shrink(*space, size); /* No mutex; this is only updated by the purge coordinator. */ export_vars.innodb_undo_truncations++; @@ -814,14 +763,15 @@ purge_sys.next_stored= false; } - DBUG_EXECUTE_IF("ib_undo_trunc", ib::info() << "ib_undo_trunc"; + DBUG_EXECUTE_IF("ib_undo_trunc", + sql_print_information("InnoDB: ib_undo_trunc"); log_buffer_flush_to_disk(); DBUG_SUICIDE();); - ib::info() << "Truncated " << file->name; - purge_sys.truncate.last= purge_sys.truncate.current; - ut_ad(&space == purge_sys.truncate.current); - purge_sys.truncate.current= nullptr; + sql_print_information("InnoDB: Truncated %s", file_name); + ut_ad(space == purge_sys.truncate_undo_space.current); + purge_sys.truncate_undo_space.current= nullptr; + purge_sys.truncate_undo_space.last= space->id - srv_undo_space_id_start; } } @@ -849,11 +799,11 @@ return nullptr; } -void purge_sys_t::rseg_get_next_history_log() +bool purge_sys_t::rseg_get_next_history_log() { fil_addr_t prev_log_addr; - ut_ad(rseg->latch.is_write_locked()); + ut_ad(rseg->latch.have_wr()); ut_a(rseg->last_page_no != FIL_NULL); tail.trx_no= rseg->last_trx_no() + 1; @@ -865,21 +815,24 @@ { const byte *log_hdr= undo_page->page.frame + rseg->last_offset(); prev_log_addr= flst_get_prev_addr(log_hdr + TRX_UNDO_HISTORY_NODE); + if (prev_log_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + prev_log_addr.boffset >= srv_page_size - TRX_UNDO_LOG_OLD_HDR_SIZE) + goto corrupted; prev_log_addr.boffset = static_cast(prev_log_addr.boffset - TRX_UNDO_HISTORY_NODE); } else - prev_log_addr.page= FIL_NULL; + goto corrupted; - if (prev_log_addr.page == FIL_NULL) + if (prev_log_addr.page >= rseg->space->free_limit) + corrupted: rseg->last_page_no= FIL_NULL; else { /* Read the previous log header. */ trx_id_t trx_no= 0; if (const buf_block_t* undo_page= - get_page(page_id_t(rseg->space->id, - prev_log_addr.page))) + get_page(page_id_t(rseg->space->id, prev_log_addr.page))) { const byte *log_hdr= undo_page->page.frame + prev_log_addr.boffset; trx_no= mach_read_from_8(log_hdr + TRX_UNDO_TRX_NO); @@ -897,12 +850,13 @@ can never produce events from an empty rollback segment. */ mysql_mutex_lock(&pq_mutex); - purge_queue.push(*rseg); + enqueue(*rseg); mysql_mutex_unlock(&pq_mutex); } } rseg->latch.wr_unlock(); + return choose_next_log(); } /** Position the purge sys "iterator" on the undo record to use for purging. @@ -910,11 +864,37 @@ @retval true when purge_sys.rseg->latch was locked */ bool purge_sys_t::choose_next_log() { - if (!rseg_iter.set_next()) + ut_ad(!next_stored); + + mysql_mutex_lock(&pq_mutex); + if (purge_queue.empty()) { + rseg = nullptr; + mysql_mutex_unlock(&purge_sys.pq_mutex); return false; + } + rseg= purge_queue.pop(); + mysql_mutex_unlock(&purge_sys.pq_mutex); - hdr_offset= rseg->last_offset(); - hdr_page_no= rseg->last_page_no; + /* We assume in purge of externally stored fields that space + id is in the range of UNDO tablespace space ids */ + ut_ad(rseg->space == fil_system.sys_space || + srv_is_undo_tablespace(rseg->space->id)); + + rseg->latch.wr_lock(SRW_LOCK_CALL); + trx_id_t last_trx_no = rseg->last_trx_no(); + hdr_offset = rseg->last_offset(); + hdr_page_no = rseg->last_page_no; + + /* Only the purge_coordinator_task will access this any of + purge_sys.hdr_page_no, purge_sys.tail. The field purge_sys.head and + purge_sys.view are modified by clone_end_view() in the + purge_coordinator_task while holding exclusive purge_sys.latch. The + purge_sys.view may also be modified by wake_if_not_active() while holding + exclusive purge_sys.latch. The purge_sys.head may be read by + purge_truncation_callback(). */ + ut_a(hdr_page_no != FIL_NULL); + ut_a(tail.trx_no <= last_trx_no); + tail.trx_no = last_trx_no; if (!rseg->needs_purge) { @@ -945,7 +925,7 @@ if (!b) goto purge_nothing; undo_rec= - trx_undo_page_get_first_rec(b, page_no, hdr_offset); + trx_undo_page_get_first_rec(b, hdr_page_no, hdr_offset); if (!undo_rec) goto purge_nothing; } @@ -969,16 +949,13 @@ { ut_ad(next_stored); ut_ad(tail.trx_no < low_limit_no()); - ut_ad(rseg->latch.is_write_locked()); + ut_ad(rseg->latch.have_wr()); if (!offset) { - /* It is the dummy undo log record, which means that there is no - need to purge this undo log */ - rseg_get_next_history_log(); - - /* Look for the next undo log and record to purge */ - if (choose_next_log()) + /* It is the dummy undo log record, which means that there is no need to + purge this undo log. Look for the next undo log and record to purge */ + if (rseg_get_next_history_log()) rseg->latch.wr_unlock(); return {nullptr, 1}; } @@ -1026,9 +1003,8 @@ else { got_no_rec: - rseg_get_next_history_log(); /* Look for the next undo log and record to purge */ - locked= choose_next_log(); + locked= rseg_get_next_history_log(); } if (locked) diff -Nru mariadb-10.11.6/storage/innobase/trx/trx0rec.cc mariadb-10.11.9/storage/innobase/trx/trx0rec.cc --- mariadb-10.11.6/storage/innobase/trx/trx0rec.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/trx/trx0rec.cc 2024-08-03 07:29:59.000000000 +0000 @@ -1840,7 +1840,7 @@ auto m = trx->mod_tables.emplace(index->table, trx->undo_no); ut_ad(m.first->second.valid(trx->undo_no)); - if (m.second && index->table->is_active_ddl()) { + if (m.second && index->table->is_native_online_ddl()) { trx->apply_online_log= true; } @@ -2069,9 +2069,10 @@ mtr.start(); trx_undo_rec_t *undo_rec= nullptr; - if (const buf_block_t* undo_page= + if (buf_block_t* undo_page= buf_page_get(page_id_t(rseg->space->id, page_no), 0, RW_S_LATCH, &mtr)) { + buf_page_make_young_if_needed(&undo_page->page); undo_rec= undo_page->page.frame + offset; const size_t end= mach_read_from_2(undo_rec); if (UNIV_UNLIKELY(end <= offset || diff -Nru mariadb-10.11.6/storage/innobase/trx/trx0roll.cc mariadb-10.11.9/storage/innobase/trx/trx0roll.cc --- mariadb-10.11.6/storage/innobase/trx/trx0roll.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/trx/trx0roll.cc 2024-08-03 07:29:59.000000000 +0000 @@ -151,7 +151,7 @@ mod_tables.erase(j); } else if (!apply_online_log) - apply_online_log= j->first->is_active_ddl(); + apply_online_log= j->first->is_native_online_ddl(); } MONITOR_INC(MONITOR_TRX_ROLLBACK_SAVEPOINT); } @@ -221,7 +221,7 @@ even if trx->state is TRX_STATE_NOT_STARTED. */ ut_ad(!(trx->lock.was_chosen_as_deadlock_victim & 1)); #ifdef WITH_WSREP - trx->wsrep= false; + ut_ad(!trx->is_wsrep()); trx->lock.was_chosen_as_deadlock_victim= false; #endif return(DB_SUCCESS); diff -Nru mariadb-10.11.6/storage/innobase/trx/trx0rseg.cc mariadb-10.11.9/storage/innobase/trx/trx0rseg.cc --- mariadb-10.11.6/storage/innobase/trx/trx0rseg.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/trx/trx0rseg.cc 2024-08-03 07:29:59.000000000 +0000 @@ -201,7 +201,7 @@ memcpy(xid.data, TRX_RSEG + TRX_RSEG_WSREP_XID_DATA + rseg_header->page.frame, XIDDATASIZE); - return true; + return wsrep_is_wsrep_xid(&xid); } /** Read the WSREP XID from the TRX_SYS page (in case of upgrade). @@ -210,6 +210,11 @@ @return whether the WSREP XID is present */ static bool trx_rseg_init_wsrep_xid(const page_t* page, XID& xid) { + if (memcmp(TRX_SYS + TRX_SYS_WSREP_XID_INFO + page, + field_ref_zero, TRX_SYS_WSREP_XID_LEN) == 0) { + return false; + } + if (mach_read_from_4(TRX_SYS + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_MAGIC_N_FLD + page) @@ -232,7 +237,8 @@ memcpy(xid.data, TRX_SYS + TRX_SYS_WSREP_XID_INFO + TRX_SYS_WSREP_XID_DATA + page, XIDDATASIZE); - return true; + + return wsrep_is_wsrep_xid(&xid); } /** Recover the latest WSREP checkpoint XID. @@ -296,8 +302,13 @@ if (err) *err= DB_TABLESPACE_NOT_FOUND; return nullptr; } - return buf_page_get_gen(page_id(), 0, RW_X_LATCH, nullptr, - BUF_GET, mtr, err); + + buf_block_t *block= buf_page_get_gen(page_id(), 0, RW_X_LATCH, nullptr, + BUF_GET, mtr, err); + if (UNIV_LIKELY(block != nullptr)) + buf_page_make_young_if_needed(&block->page); + + return block; } /** Upgrade a rollback segment header page to MariaDB 10.3 format. @@ -443,7 +454,14 @@ { if (!rseg->space) return DB_TABLESPACE_NOT_FOUND; + + /* Access the tablespace header page to recover rseg->space->free_limit */ + page_id_t page_id{rseg->space->id, 0}; dberr_t err; + if (!buf_page_get_gen(page_id, 0, RW_S_LATCH, nullptr, BUF_GET, mtr, &err)) + return err; + mtr->release_last_page(); + page_id.set_page_no(rseg->page_no); const buf_block_t *rseg_hdr= buf_page_get_gen(rseg->page_id(), 0, RW_S_LATCH, nullptr, BUF_GET, mtr, &err); @@ -462,24 +480,43 @@ TRX_RSEG + TRX_RSEG_BINLOG_NAME + rseg_hdr->page.frame; if (*binlog_name) { - lsn_t lsn= mach_read_from_8(my_assume_aligned<8> - (FIL_PAGE_LSN + rseg_hdr->page.frame)); static_assert(TRX_RSEG_BINLOG_NAME_LEN == sizeof trx_sys.recovered_binlog_filename, "compatibility"); - if (lsn > trx_sys.recovered_binlog_lsn) - { - trx_sys.recovered_binlog_lsn= lsn; - trx_sys.recovered_binlog_offset= + + /* Always prefer a position from rollback segment over + a legacy position from before version 10.3.5. */ + int cmp= *trx_sys.recovered_binlog_filename && + !trx_sys.recovered_binlog_is_legacy_pos + ? strncmp(reinterpret_cast(binlog_name), + trx_sys.recovered_binlog_filename, + TRX_RSEG_BINLOG_NAME_LEN) + : 1; + + if (cmp >= 0) { + uint64_t binlog_offset = mach_read_from_8(TRX_RSEG + TRX_RSEG_BINLOG_OFFSET + rseg_hdr->page.frame); - memcpy(trx_sys.recovered_binlog_filename, binlog_name, - TRX_RSEG_BINLOG_NAME_LEN); + if (cmp) + { + memcpy(trx_sys.recovered_binlog_filename, binlog_name, + TRX_RSEG_BINLOG_NAME_LEN); + trx_sys.recovered_binlog_offset= binlog_offset; + } + else if (binlog_offset > trx_sys.recovered_binlog_offset) + trx_sys.recovered_binlog_offset= binlog_offset; + trx_sys.recovered_binlog_is_legacy_pos= false; } - + } #ifdef WITH_WSREP - trx_rseg_read_wsrep_checkpoint(rseg_hdr, trx_sys.recovered_wsrep_xid); + XID tmp_xid; + tmp_xid.null(); + /* Update recovered wsrep xid only if we found wsrep xid from + rseg header page and read xid seqno is larger than currently + recovered xid seqno. */ + if (trx_rseg_read_wsrep_checkpoint(rseg_hdr, tmp_xid) && + wsrep_xid_seqno(&tmp_xid) > wsrep_xid_seqno(&trx_sys.recovered_wsrep_xid)) + trx_sys.recovered_wsrep_xid.set(&tmp_xid); #endif - } } if (srv_operation == SRV_OPERATION_RESTORE) @@ -501,6 +538,11 @@ fil_addr_t node_addr= flst_get_last(TRX_RSEG + TRX_RSEG_HISTORY + rseg_hdr->page.frame); + if (node_addr.page >= rseg->space->free_limit || + node_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE || + node_addr.boffset >= srv_page_size - TRX_UNDO_LOG_OLD_HDR_SIZE) + return DB_CORRUPTION; + node_addr.boffset= static_cast(node_addr.boffset - TRX_UNDO_HISTORY_NODE); rseg->last_page_no= node_addr.page; @@ -527,7 +569,7 @@ if (rseg->last_page_no != FIL_NULL) /* There is no need to cover this operation by the purge mutex because we are still bootstrapping. */ - purge_sys.purge_queue.push(*rseg); + purge_sys.enqueue(*rseg); } trx_sys.set_undo_non_empty(rseg->history_size > 0); @@ -548,11 +590,8 @@ trx_sys.recovered_binlog_offset = mach_read_from_8( TRX_SYS_MYSQL_LOG_INFO + TRX_SYS_MYSQL_LOG_OFFSET + TRX_SYS + page); + trx_sys.recovered_binlog_is_legacy_pos= true; } - -#ifdef WITH_WSREP - trx_rseg_init_wsrep_xid(page, trx_sys.recovered_wsrep_xid); -#endif } /** Initialize or recover the rollback segments at startup. */ @@ -562,6 +601,7 @@ *trx_sys.recovered_binlog_filename = '\0'; trx_sys.recovered_binlog_offset = 0; + trx_sys.recovered_binlog_is_legacy_pos= false; #ifdef WITH_WSREP trx_sys.recovered_wsrep_xid.null(); XID wsrep_sys_xid; @@ -570,7 +610,17 @@ #endif mtr_t mtr; dberr_t err = DB_SUCCESS; - + /* mariabackup --prepare only deals with the redo log and the data + files, not with transactions or the data dictionary, that's why + trx_lists_init_at_db_start() does not invoke purge_sys.create() and + purge queue mutex stays uninitialized, and trx_rseg_mem_restore() quits + before initializing undo log lists. */ + if (srv_operation != SRV_OPERATION_RESTORE) + /* Acquiring purge queue mutex here should be fine from the + deadlock prevention point of view, because executing that + function is a prerequisite for starting the purge subsystem or + any transactions. */ + purge_sys.queue_lock(); for (ulint rseg_id = 0; rseg_id < TRX_SYS_N_RSEGS; rseg_id++) { mtr.start(); if (const buf_block_t* sys = trx_sysf_get(&mtr, false)) { @@ -583,7 +633,11 @@ + sys->page.frame); trx_rseg_init_binlog_info(sys->page.frame); #ifdef WITH_WSREP - wsrep_sys_xid.set(&trx_sys.recovered_wsrep_xid); + if (trx_rseg_init_wsrep_xid( + sys->page.frame, trx_sys.recovered_wsrep_xid)) { + wsrep_sys_xid.set( + &trx_sys.recovered_wsrep_xid); + } #endif } @@ -636,7 +690,8 @@ mtr.commit(); } - + if (srv_operation != SRV_OPERATION_RESTORE) + purge_sys.queue_unlock(); if (err != DB_SUCCESS) { for (auto& rseg : trx_sys.rseg_array) { while (auto u = UT_LIST_GET_FIRST(rseg.undo_list)) { @@ -648,7 +703,7 @@ } #ifdef WITH_WSREP - if (!wsrep_sys_xid.is_null()) { + if (srv_operation == SRV_OPERATION_NORMAL && !wsrep_sys_xid.is_null()) { /* Upgrade from a version prior to 10.3.5, where WSREP XID was stored in TRX_SYS page. If no rollback segment has a WSREP XID set, diff -Nru mariadb-10.11.6/storage/innobase/trx/trx0trx.cc mariadb-10.11.9/storage/innobase/trx/trx0trx.cc --- mariadb-10.11.6/storage/innobase/trx/trx0trx.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/trx/trx0trx.cc 2024-08-03 07:29:59.000000000 +0000 @@ -412,12 +412,12 @@ #endif read_view.mem_noaccess(); MEM_NOACCESS(&lock, sizeof lock); - MEM_NOACCESS(&op_info, sizeof op_info); - MEM_NOACCESS(&isolation_level, sizeof isolation_level); - MEM_NOACCESS(&check_foreigns, sizeof check_foreigns); + MEM_NOACCESS(&op_info, sizeof op_info + + sizeof(unsigned) /* isolation_level, snapshot_isolation, + check_foreigns, check_unique_secondary, + bulk_insert */); MEM_NOACCESS(&is_registered, sizeof is_registered); MEM_NOACCESS(&active_commit_ordered, sizeof active_commit_ordered); - MEM_NOACCESS(&check_unique_secondary, sizeof check_unique_secondary); MEM_NOACCESS(&flush_log_later, sizeof flush_log_later); MEM_NOACCESS(&duplicates, sizeof duplicates); MEM_NOACCESS(&dict_operation, sizeof dict_operation); @@ -538,6 +538,7 @@ DBUG_LOG("trx", "Free prepared: " << trx); trx->state = TRX_STATE_NOT_STARTED; ut_ad(!UT_LIST_GET_LEN(trx->lock.trx_locks)); + ut_d(*trx->detailed_error = '\0'); trx->free(); } @@ -582,6 +583,7 @@ undo.top_page_no), 0, RW_S_LATCH, nullptr, BUF_GET, &mtr, &err)) { + buf_page_make_young_if_needed(&block->page); buf_block_t *undo_block= block; const trx_undo_rec_t *undo_rec= block->page.frame + undo.top_offset; @@ -921,6 +923,7 @@ #ifdef WITH_WSREP trx->xid.null(); + trx->wsrep = wsrep_on(trx->mysql_thd); #endif /* WITH_WSREP */ ut_a(ib_vector_is_empty(trx->autoinc_locks)); @@ -980,7 +983,13 @@ trx_undo_t *&undo= rsegs.m_redo.undo; ut_ad(undo->state == TRX_UNDO_ACTIVE || undo->state == TRX_UNDO_PREPARED); - ut_ad(undo->size == 1); + + if (UNIV_UNLIKELY(undo->size != 1)) + { + sql_print_error("InnoDB: Undo log for transaction " TRX_ID_FMT + " is corrupted (" UINT32PF "!=1)", id, undo->size); + ut_ad("corrupted undo log" == 0); + } if (buf_block_t *u= buf_page_get(page_id_t(rseg->space->id, undo->hdr_page_no), 0, @@ -1135,15 +1144,23 @@ } else if (rseg->last_page_no == FIL_NULL) { - mysql_mutex_lock(&purge_sys.pq_mutex); + /* trx_sys.assign_new_trx_no() and + purge_sys.enqueue() must be invoked in the same + critical section protected with purge queue mutex to avoid rseg with + greater last commit number to be pushed to purge queue prior to rseg with + lesser last commit number. In other words pushing to purge queue must be + serialized along with assigning trx_no. Otherwise purge coordinator + thread can also fetch redo log records from rseg with greater last commit + number before rseg with lesser one. */ + purge_sys.queue_lock(); trx_sys.assign_new_trx_no(this); const trx_id_t end{rw_trx_hash_element->no}; + rseg->last_page_no= undo->hdr_page_no; /* end cannot be less than anything in rseg. User threads only produce events when a rollback segment is empty. */ - purge_sys.purge_queue.push(TrxUndoRsegs{end, *rseg}); - mysql_mutex_unlock(&purge_sys.pq_mutex); - rseg->last_page_no= undo->hdr_page_no; rseg->set_last_commit(undo->hdr_offset, end); + purge_sys.enqueue(end, *rseg); + purge_sys.queue_unlock(); } else trx_sys.assign_new_trx_no(this); @@ -1481,6 +1498,8 @@ trx_finalize_for_fts(this, undo_no != 0); #ifdef WITH_WSREP + ut_ad(is_wsrep() == wsrep_on(mysql_thd)); + /* Serialization history has been written and the transaction is committed in memory, which makes this commit ordered. Release commit order critical section. */ @@ -1504,6 +1523,7 @@ mutex.wr_lock(); state= TRX_STATE_NOT_STARTED; + *detailed_error= '\0'; mod_tables.clear(); check_foreigns= true; @@ -2081,9 +2101,9 @@ } -static my_bool trx_recover_reset_callback(rw_trx_hash_element_t *element, - void*) +static my_bool trx_recover_reset_callback(void *el, void*) { + rw_trx_hash_element_t *element= static_cast(el); element->mutex.wr_lock(); if (trx_t *trx= element->trx) { @@ -2135,9 +2155,10 @@ }; -static my_bool trx_get_trx_by_xid_callback(rw_trx_hash_element_t *element, - trx_get_trx_by_xid_callback_arg *arg) +static my_bool trx_get_trx_by_xid_callback(void *el, void *a) { + auto element= static_cast(el); + auto arg= static_cast(a); my_bool found= 0; element->mutex.wr_lock(); if (trx_t *trx= element->trx) diff -Nru mariadb-10.11.6/storage/innobase/trx/trx0undo.cc mariadb-10.11.9/storage/innobase/trx/trx0undo.cc --- mariadb-10.11.6/storage/innobase/trx/trx0undo.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/trx/trx0undo.cc 2024-08-03 07:29:59.000000000 +0000 @@ -25,8 +25,8 @@ *******************************************************/ #include "trx0undo.h" +#include "buf0rea.h" #include "fsp0fsp.h" -#include "mach0data.h" #include "mtr0log.h" #include "srv0mon.h" #include "srv0srv.h" @@ -134,8 +134,9 @@ uint16_t offset) { uint16_t start= trx_undo_page_get_start(block, page_no, offset); - return start == trx_undo_page_get_end(block, page_no, offset) - ? nullptr : block->page.frame + start; + uint16_t end= trx_undo_page_get_end(block, page_no, offset); + ut_ad(start <= end); + return start >= end ? nullptr : block->page.frame + start; } /** Get the last undo log record on a page. @@ -149,8 +150,10 @@ trx_undo_page_get_last_rec(const buf_block_t *block, uint32_t page_no, uint16_t offset) { + uint16_t start= trx_undo_page_get_start(block, page_no, offset); uint16_t end= trx_undo_page_get_end(block, page_no, offset); - return trx_undo_page_get_start(block, page_no, offset) == end + ut_ad(start <= end); + return start >= end ? nullptr : block->page.frame + mach_read_from_2(block->page.frame + end - 2); } @@ -178,8 +181,12 @@ block= buf_page_get(page_id_t(block->page.id().space(), prev_page_no), 0, shared ? RW_S_LATCH : RW_X_LATCH, mtr); + if (UNIV_UNLIKELY(!block)) + return nullptr; - return block ? trx_undo_page_get_last_rec(block, page_no, offset) : nullptr; + if (!buf_page_make_young_if_needed(&block->page)) + buf_read_ahead_linear(block->page.id(), 0, false); + return trx_undo_page_get_last_rec(block, page_no, offset); } /** Get the previous undo log record. @@ -268,12 +275,16 @@ uint16_t offset, ulint mode, const buf_block_t*& block, mtr_t *mtr, dberr_t *err) { - block= buf_page_get_gen(page_id_t{space.id, page_no}, 0, mode, - nullptr, BUF_GET, mtr, err); + buf_block_t *b= buf_page_get_gen(page_id_t{space.id, page_no}, 0, mode, + nullptr, BUF_GET, mtr, err); + block= b; if (!block) return nullptr; - if (trx_undo_rec_t *rec= trx_undo_page_get_first_rec(block, page_no, offset)) + if (!buf_page_make_young_if_needed(&b->page)) + buf_read_ahead_linear(b->page.id(), 0, false); + + if (trx_undo_rec_t *rec= trx_undo_page_get_first_rec(b, page_no, offset)) return rec; return trx_undo_get_next_rec_from_next_page(block, page_no, offset, mode, @@ -298,7 +309,7 @@ dict_sys.unfreeze(); ut_ad(table); - if (!table->is_active_ddl()) + if (!table->is_native_online_ddl()) return; dict_index_t *index= dict_table_get_first_index(table); @@ -502,7 +513,7 @@ *err = flst_add_last(block, TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST, block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, - mtr); + space->free_limit, mtr); *id = slot_no; mtr->write<4>(*rseg_hdr, TRX_RSEG + TRX_RSEG_UNDO_SLOTS @@ -663,6 +674,8 @@ 0, RW_X_LATCH, nullptr, BUF_GET, mtr, err); if (!header_block) goto func_exit; + buf_page_make_young_if_needed(&header_block->page); + *err= fsp_reserve_free_extents(&n_reserved, rseg->space, 1, FSP_UNDO, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) @@ -683,7 +696,8 @@ mtr->undo_create(*new_block); trx_undo_page_init(*new_block); *err= flst_add_last(header_block, TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST, - new_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, mtr); + new_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, + rseg->space->free_limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) new_block= nullptr; else @@ -732,14 +746,32 @@ return FIL_NULL; } + buf_page_make_young_if_needed(&header_block->page); + + const uint32_t limit = rseg->space->free_limit; + *err = flst_remove(header_block, TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST, undo_block, TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE, - mtr); + limit, mtr); if (UNIV_UNLIKELY(*err != DB_SUCCESS)) { return FIL_NULL; } + const fil_addr_t last_addr = flst_get_last( + TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + + header_block->page.frame); + if (UNIV_UNLIKELY(last_addr.page == page_no) + || UNIV_UNLIKELY(last_addr.page != FIL_NULL + && last_addr.page >= limit) + || UNIV_UNLIKELY(last_addr.boffset < TRX_UNDO_PAGE_HDR + + TRX_UNDO_PAGE_NODE) + || UNIV_UNLIKELY(last_addr.boffset >= srv_page_size + - TRX_UNDO_LOG_OLD_HDR_SIZE)) { + *err = DB_CORRUPTION; + return FIL_NULL; + } + *err = fseg_free_page(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER + header_block->page.frame, rseg->space, page_no, mtr); @@ -748,9 +780,6 @@ } buf_page_free(rseg->space, page_no, mtr); - const fil_addr_t last_addr = flst_get_last( - TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST - + header_block->page.frame); rseg->curr_size--; if (!in_history) { @@ -794,6 +823,9 @@ { ut_ad(is_temp == !undo.rseg->is_persistent()); + if (UNIV_UNLIKELY(undo.last_page_no == FIL_NULL)) + return DB_CORRUPTION; + for (mtr_t mtr;;) { mtr.start(); @@ -887,15 +919,13 @@ trx_undo_rec_t* last_rec; mtr_t mtr; + ut_ad(rseg->is_persistent()); + if (!limit) { return DB_SUCCESS; } loop: - mtr_start(&mtr); - - if (!rseg->is_persistent()) { - mtr.set_log_mode(MTR_LOG_NO_REDO); - } + mtr.start(); dberr_t err; const buf_block_t* undo_page; @@ -954,8 +984,8 @@ ut_ad(id < TRX_RSEG_N_SLOTS); mtr.start(); - const buf_block_t* block = buf_page_get( - page_id_t(rseg->space->id, page_no), 0, RW_X_LATCH, &mtr); + const page_id_t page_id{rseg->space->id, page_no}; + const buf_block_t* block = buf_page_get(page_id, 0, RW_X_LATCH, &mtr); if (UNIV_UNLIKELY(!block)) { corrupted: mtr.commit(); @@ -1057,6 +1087,15 @@ fil_addr_t last_addr = flst_get_last( TRX_UNDO_SEG_HDR + TRX_UNDO_PAGE_LIST + block->page.frame); + if (last_addr.page >= rseg->space->free_limit + || last_addr.boffset < TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_NODE + || last_addr.boffset >= srv_page_size + - TRX_UNDO_LOG_OLD_HDR_SIZE) { + corrupted_undo: + ut_free(undo); + goto corrupted; + } + undo->last_page_no = last_addr.page; undo->top_page_no = last_addr.page; @@ -1065,8 +1104,7 @@ RW_X_LATCH, &mtr); if (UNIV_UNLIKELY(!last)) { - ut_free(undo); - goto corrupted; + goto corrupted_undo; } if (const trx_undo_rec_t* rec = trx_undo_page_get_last_rec( @@ -1263,6 +1301,8 @@ return NULL; } + buf_page_make_young_if_needed(&block->page); + UT_LIST_REMOVE(rseg->undo_cached, undo); *pundo = undo; @@ -1297,19 +1337,24 @@ ut_ad(mtr->get_log_mode() == MTR_LOG_ALL); trx_undo_t* undo = trx->rsegs.m_redo.undo; + buf_block_t* block; if (undo) { - return buf_page_get_gen( + block = buf_page_get_gen( page_id_t(undo->rseg->space->id, undo->last_page_no), 0, RW_X_LATCH, undo->guess_block, BUF_GET, mtr, err); + if (UNIV_LIKELY(block != nullptr)) { + buf_page_make_young_if_needed(&block->page); + } + return block; } *err = DB_SUCCESS; trx_rseg_t* rseg = trx->rsegs.m_redo.rseg; rseg->latch.wr_lock(SRW_LOCK_CALL); - buf_block_t* block = trx_undo_reuse_cached( + block = trx_undo_reuse_cached( trx, rseg, &trx->rsegs.m_redo.undo, mtr, err); if (!block) { @@ -1350,12 +1395,17 @@ : &trx->rsegs.m_redo.undo)); ut_ad(mtr->get_log_mode() == (is_temp ? MTR_LOG_NO_REDO : MTR_LOG_ALL)); + buf_block_t* block; if (*undo) { - return buf_page_get_gen( + block = buf_page_get_gen( page_id_t(rseg->space->id, (*undo)->last_page_no), 0, RW_X_LATCH, (*undo)->guess_block, BUF_GET, mtr, err); + if (UNIV_LIKELY(block != nullptr)) { + buf_page_make_young_if_needed(&block->page); + } + return block; } DBUG_EXECUTE_IF( @@ -1365,7 +1415,6 @@ *err = DB_SUCCESS; rseg->latch.wr_lock(SRW_LOCK_CALL); - buf_block_t* block; if (is_temp) { ut_ad(!UT_LIST_GET_LEN(rseg->undo_cached)); } else { diff -Nru mariadb-10.11.6/storage/innobase/unittest/CMakeLists.txt mariadb-10.11.9/storage/innobase/unittest/CMakeLists.txt --- mariadb-10.11.6/storage/innobase/unittest/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/unittest/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -17,6 +17,10 @@ ${CMAKE_SOURCE_DIR}/unittest/mytap ${CMAKE_SOURCE_DIR}/storage/innobase/include ${CMAKE_SOURCE_DIR}/tpool) +ADD_EXECUTABLE(innodb_rbt-t innodb_rbt-t.cc ../ut/ut0rbt.cc) +TARGET_LINK_LIBRARIES(innodb_rbt-t mysys mytap) +ADD_DEPENDENCIES(innodb_rbt-t GenError) +MY_ADD_TEST(innodb_rbt) ADD_EXECUTABLE(innodb_fts-t innodb_fts-t.cc) TARGET_LINK_LIBRARIES(innodb_fts-t mysys mytap) ADD_DEPENDENCIES(innodb_fts-t GenError) diff -Nru mariadb-10.11.6/storage/innobase/unittest/innodb_rbt-t.cc mariadb-10.11.9/storage/innobase/unittest/innodb_rbt-t.cc --- mariadb-10.11.6/storage/innobase/unittest/innodb_rbt-t.cc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/unittest/innodb_rbt-t.cc 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,83 @@ +#include "tap.h" +#include "ut0rbt.h" +#include "ut0new.h" + +const size_t alloc_max_retries= 0; +void os_thread_sleep(ulint) { abort(); } +void ut_dbg_assertion_failed(const char *, const char *, unsigned) +{ abort(); } +namespace ib { fatal_or_error::~fatal_or_error() { abort(); } } +#ifdef UNIV_PFS_MEMORY +PSI_memory_key mem_key_other, mem_key_std; +PSI_memory_key ut_new_get_key_by_file(uint32_t) { return mem_key_std; } +#endif + +static const uint64_t doc_ids[]= +{ + 103571, 104018, 106821, 108647, 109352, 109379, + 110325, 122868, 210682130, 231275441, 234172769, 366236849, + 526467159, 1675241735, 1675243405, 1947751899, 1949940363, 2033691953, + 2148227299, 2256289791, 2294223591, 2367501260, 2792700091, 2792701220, + 2817121627, 2820680352, 2821165664, 3253312130, 3404918378, 3532599429, + 3538712078, 3539373037, 3546479309, 3566641838, 3580209634, 3580871267, + 3693930556, 3693932734, 3693932983, 3781949558, 3839877411, 3930968983 +}; + +static int fts_doc_id_cmp(const void *p1, const void *p2) +{ + uint64_t a= *static_cast(p1), + b= *static_cast(p2); + return b > a ? -1 : a > b; +} + + +static int fts_doc_id_buggy_cmp(const void *p1, const void *p2) +{ + return int(*static_cast(p1) - + *static_cast(p2)); +} + +typedef int (*comparator) (const void*, const void*); + +static void rbt_populate(ib_rbt_t *rbt) +{ + ib_rbt_bound_t parent; + for (const uint64_t &doc_id : doc_ids) + { + if (rbt_search(rbt, &parent, &doc_id)) + rbt_add_node(rbt, &parent, &doc_id); + } +} + +static void rbt_populate2(ib_rbt_t *rbt) +{ + for (const uint64_t &doc_id : doc_ids) + rbt_insert(rbt, &doc_id, &doc_id); +} + +static bool rbt_search_all(ib_rbt_t *rbt) +{ + ib_rbt_bound_t parent; + for (const uint64_t &doc_id : doc_ids) + if (rbt_search(rbt, &parent, &doc_id)) + return false; + return true; +} + +static void rbt_test(comparator cmp, bool buggy) +{ + ib_rbt_t *rbt= rbt_create(sizeof(uint64_t), cmp); + rbt_populate(rbt); + ok(rbt_search_all(rbt) != buggy, "search after populate"); + rbt_free(rbt); + rbt= rbt_create(sizeof(uint64_t), cmp); + rbt_populate2(rbt); + ok(rbt_search_all(rbt) != buggy, "search after populate2"); + rbt_free(rbt); +} + +int main () +{ + rbt_test(fts_doc_id_buggy_cmp, true); + rbt_test(fts_doc_id_cmp, false); +} diff -Nru mariadb-10.11.6/storage/innobase/ut/ut0ut.cc mariadb-10.11.9/storage/innobase/ut/ut0ut.cc --- mariadb-10.11.6/storage/innobase/ut/ut0ut.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/innobase/ut/ut0ut.cc 2024-08-03 07:29:59.000000000 +0000 @@ -258,47 +258,6 @@ } } -/** Format a table name, quoted as an SQL identifier. -If the name contains a slash '/', the result will contain two -identifiers separated by a period (.), as in SQL -database_name.table_name. -@see table_name_t -@param[in] name table or index name -@param[out] formatted formatted result, will be NUL-terminated -@param[in] formatted_size size of the buffer in bytes -@return pointer to 'formatted' */ -char* -ut_format_name( - const char* name, - char* formatted, - ulint formatted_size) -{ - switch (formatted_size) { - case 1: - formatted[0] = '\0'; - /* FALL-THROUGH */ - case 0: - return(formatted); - } - - char* end; - - end = innobase_convert_name(formatted, formatted_size, - name, strlen(name), NULL); - - /* If the space in 'formatted' was completely used, then sacrifice - the last character in order to write '\0' at the end. */ - if ((ulint) (end - formatted) == formatted_size) { - end--; - } - - ut_a((ulint) (end - formatted) < formatted_size); - - *end = '\0'; - - return(formatted); -} - /**********************************************************************//** Catenate files. */ void @@ -353,14 +312,16 @@ return("Lock wait"); case DB_DEADLOCK: return("Deadlock"); + case DB_RECORD_CHANGED: + return("Record changed"); +#ifdef WITH_WSREP case DB_ROLLBACK: return("Rollback"); +#endif case DB_DUPLICATE_KEY: return("Duplicate key"); case DB_MISSING_HISTORY: return("Required history data has been deleted"); - case DB_CLUSTER_NOT_FOUND: - return("Cluster not found"); case DB_TABLE_NOT_FOUND: return("Table not found"); case DB_TOO_BIG_RECORD: diff -Nru mariadb-10.11.6/storage/maria/CMakeLists.txt mariadb-10.11.9/storage/maria/CMakeLists.txt --- mariadb-10.11.6/storage/maria/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -124,7 +124,7 @@ IF (CURL_FOUND) INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIRS}) MYSQL_ADD_PLUGIN(s3 ha_s3.cc ${S3_SOURCES} COMPONENT s3-engine - LINK_LIBRARIES ${CURL_LIBRARIES} z STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) + LINK_LIBRARIES ${CURL_LIBRARIES} ${ZLIB_LIBRARIES} STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) ENDIF() SET(CPACK_RPM_s3-engine_PACKAGE_SUMMARY "Amazon S3 archival storage engine for MariaDB" PARENT_SCOPE) @@ -132,7 +132,7 @@ IF(TARGET s3) MYSQL_ADD_EXECUTABLE(aria_s3_copy aria_s3_copy.cc ${S3_SOURCES} COMPONENT s3-engine) - TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl ${CURL_LIBRARIES} ${ZLIB_LIBRARY}) + TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl ${CURL_LIBRARIES} ${ZLIB_LIBRARIES}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libmarias3) ADD_DEFINITIONS(-DWITH_S3_STORAGE_ENGINE) ENDIF() diff -Nru mariadb-10.11.6/storage/maria/aria_chk.c mariadb-10.11.9/storage/maria/aria_chk.c --- mariadb-10.11.6/storage/maria/aria_chk.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/aria_chk.c 2024-08-03 07:29:59.000000000 +0000 @@ -145,7 +145,8 @@ { if ((ma_control_file_open(FALSE, opt_require_control_file || !(check_param.testflag & T_SILENT), - TRUE))) + TRUE, + control_file_open_flags))) { if (opt_require_control_file || (opt_transaction_logging && (check_param.testflag & T_REP_ANY))) diff -Nru mariadb-10.11.6/storage/maria/aria_pack.c mariadb-10.11.9/storage/maria/aria_pack.c --- mariadb-10.11.6/storage/maria/aria_pack.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/aria_pack.c 2024-08-03 07:29:59.000000000 +0000 @@ -239,7 +239,8 @@ if (!opt_ignore_control_file && (no_control_file= ma_control_file_open(FALSE, (opt_require_control_file || - !silent), FALSE)) && + !silent), FALSE, + control_file_open_flags)) && opt_require_control_file) { error= 1; diff -Nru mariadb-10.11.6/storage/maria/aria_read_log.c mariadb-10.11.9/storage/maria/aria_read_log.c --- mariadb-10.11.6/storage/maria/aria_read_log.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/aria_read_log.c 2024-08-03 07:29:59.000000000 +0000 @@ -104,7 +104,7 @@ goto end; } /* we don't want to create a control file, it MUST exist */ - if (ma_control_file_open(FALSE, TRUE, TRUE)) + if (ma_control_file_open(FALSE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't open control file (%d)\n", errno); goto err; diff -Nru mariadb-10.11.6/storage/maria/aria_s3_copy.cc mariadb-10.11.9/storage/maria/aria_s3_copy.cc --- mariadb-10.11.6/storage/maria/aria_s3_copy.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/aria_s3_copy.cc 2024-08-03 07:29:59.000000000 +0000 @@ -87,7 +87,9 @@ &opt_block_size, &opt_block_size, 0, GET_ULONG, REQUIRED_ARG, 4*1024*1024, 64*1024, 16*1024*1024, MALLOC_OVERHEAD, 1024, 0 }, {"s3_protocol_version", 'L', - "Protocol used to communication with S3. One of \"Auto\", \"Amazon\" or \"Original\".", + "Protocol used to communication with S3. One of \"Auto\", \"Legacy\", " + "\"Original\", \"Amazon\", \"Path\" or \"Domain\". " + "Note: \"Legacy\", \"Original\" and \"Amazon\" are deprecated.", &opt_protocol_version, &opt_protocol_version, &s3_protocol_typelib, GET_ENUM, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"force", 'f', "Force copy even if target exists", @@ -195,7 +197,7 @@ my_exit(-1); } if (opt_s3_debug) - ms3_debug(); + ms3_debug(1); } /* get_options */ @@ -218,9 +220,20 @@ ms3_set_option(global_s3_client, MS3_OPT_BUFFER_CHUNK_SIZE, &block_size); - if (opt_protocol_version) + if (opt_protocol_version > 2) { - uint8_t protocol_version= (uint8_t) opt_protocol_version; + uint8_t protocol_version; + switch (opt_protocol_version) + { + case 3: /* Legacy means v1 */ + case 4: /* Path means v1 */ + protocol_version= 1; + break; + case 5: /* Domain means v2 */ + protocol_version= 2; + break; + } + ms3_set_option(global_s3_client, MS3_OPT_FORCE_PROTOCOL_VERSION, &protocol_version); } diff -Nru mariadb-10.11.6/storage/maria/ha_maria.cc mariadb-10.11.9/storage/maria/ha_maria.cc --- mariadb-10.11.6/storage/maria/ha_maria.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ha_maria.cc 2024-08-03 07:29:59.000000000 +0000 @@ -38,6 +38,7 @@ #include "ma_recovery.h" C_MODE_END #include "ma_trnman.h" +#include "ma_loghandler.h" //#include "sql_priv.h" #include "protocol.h" @@ -45,6 +46,7 @@ #include "key.h" #include "log.h" #include "sql_parse.h" +#include "mysql/service_print_check_msg.h" #include "debug.h" /* @@ -428,10 +430,8 @@ const char *fmt, va_list args) { THD *thd= (THD *) param->thd; - Protocol *protocol= thd->protocol; - size_t length, msg_length; + size_t msg_length __attribute__((unused)); char msgbuf[MYSQL_ERRMSG_SIZE]; - char name[NAME_LEN * 2 + 2]; if (param->testflag & T_SUPPRESS_ERR_HANDLING) return; @@ -460,27 +460,10 @@ _ma_check_print(param, msg_type, msgbuf); return; } - length= (uint) (strxmov(name, param->db_name, ".", param->table_name, - NullS) - name); - /* - TODO: switch from protocol to push_warning here. The main reason we didn't - it yet is parallel repair, which threads have no THD object accessible via - current_thd. - - Also we likely need to lock mutex here (in both cases with protocol and - push_warning). - */ - protocol->prepare_for_resend(); - protocol->store(name, (uint)length, system_charset_info); - protocol->store(param->op_name, strlen(param->op_name), system_charset_info); - protocol->store(msg_type, system_charset_info); - protocol->store(msgbuf, msg_length, system_charset_info); - if (protocol->write()) - sql_print_error("Failed on my_net_write, writing to stderr instead: %s.%s: %s\n", - param->db_name, param->table_name, msgbuf); - else if (thd->variables.log_warnings > 2) + print_check_msg(thd, param->db_name, param->table_name, + param->op_name, msg_type->str, msgbuf, 0); + if (thd->variables.log_warnings > 2) _ma_check_print(param, msg_type, msgbuf); - return; } @@ -1806,6 +1789,11 @@ _ma_check_print_warning(param, "Number of rows changed from %s to %s", llstr(rows, llbuff), llstr(file->state->records, llbuff2)); + /* + ma_check_print_warning() may generate an error in case of creating keys + for ALTER TABLE. In this case we should signal an error. + */ + error= thd->is_error(); } } else @@ -1952,41 +1940,46 @@ SYNOPSIS disable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ disable all non-unique keys - HA_KEY_SWITCH_ALL disable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE dis. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE dis. all keys and make persistent - - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + + DESCRIPTION + See handler::ha_disable_indexes() RETURN 0 ok HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_maria::disable_indexes(uint mode) +int ha_maria::disable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { /* call a storage engine function to switch the key map */ + DBUG_ASSERT(map.is_clear_all()); error= maria_disable_indexes(file); } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { - maria_extra(file, HA_EXTRA_NO_KEYS, 0); + /* auto-inc key cannot be disabled */ + if (table->s->next_number_index < MAX_KEY) + DBUG_ASSERT(map.is_set(table->s->next_number_index)); + + /* unique keys cannot be disabled either */ + for (uint i=0; i < table->s->keys; i++) + DBUG_ASSERT(!(table->key_info[i].flags & HA_NOSAME) || map.is_set(i)); + + ulonglong ullmap= map.to_ulonglong(); + + /* make sure auto-inc key is enabled even if it's > 64 */ + if (map.length() > MARIA_KEYMAP_BITS && + table->s->next_number_index < MAX_KEY) + maria_set_key_active(ullmap, table->s->next_number_index); + + maria_extra(file, HA_EXTRA_NO_KEYS, &ullmap); info(HA_STATUS_CONST); // Read new key info error= 0; } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } return error; } @@ -1996,21 +1989,14 @@ SYNOPSIS enable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ enable all non-unique keys - HA_KEY_SWITCH_ALL enable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE en. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE en. all keys and make persistent DESCRIPTION Enable indexes, which might have been disabled by disable_index() before. - The modes without _SAVE work only if both data and indexes are empty, - since the MARIA repair would enable them persistently. + If persist=false, it works only if both data and indexes are empty, + since the Aria repair would enable them persistently. To be sure in these cases, call handler::delete_all_rows() before. - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + See also handler::ha_enable_indexes() RETURN 0 ok @@ -2019,18 +2005,19 @@ HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_maria::enable_indexes(uint mode) +int ha_maria::enable_indexes(key_map map, bool persist) { int error; ha_rows start_rows= file->state->records; - DBUG_PRINT("info", ("ha_maria::enable_indexes mode: %d", mode)); + DBUG_PRINT("info", ("ha_maria::enable_indexes mode: %d", persist)); if (maria_is_all_keys_active(file->s->state.key_map, file->s->base.keys)) { /* All indexes are enabled already. */ return 0; } - if (mode == HA_KEY_SWITCH_ALL) + DBUG_ASSERT(map.is_prefix(table->s->keys)); + if (!persist) { error= maria_enable_indexes(file); /* @@ -2039,7 +2026,7 @@ but mode==HA_KEY_SWITCH_ALL forbids it. */ } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { THD *thd= table->in_use; HA_CHECK *param= (HA_CHECK*) thd->alloc(sizeof *param); @@ -2104,11 +2091,6 @@ info(HA_STATUS_CONST); thd_proc_info(thd, save_proc_info); } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } DBUG_EXECUTE_IF("maria_flush_whole_log", { DBUG_PRINT("maria_flush_whole_log", ("now")); @@ -2311,7 +2293,7 @@ { int first_error, first_errno= 0, error; my_bool abort= file->s->deleting, empty_table= 0; - uint enable_index_mode= HA_KEY_SWITCH_NONUNIQ_SAVE; + bool enable_persistently= true; DBUG_ENTER("ha_maria::end_bulk_insert"); if ((first_error= maria_end_bulk_insert(file, abort))) @@ -2340,7 +2322,7 @@ first_error= 1; first_errno= my_errno; } - enable_index_mode= HA_KEY_SWITCH_ALL; + enable_persistently= false; empty_table= 1; /* Ignore all changed pages, required by _ma_renable_logging_for_table() @@ -2352,7 +2334,7 @@ if (!abort && can_enable_indexes) { - if ((error= enable_indexes(enable_index_mode))) + if ((error= enable_indexes(key_map(table->s->keys), enable_persistently))) { if (!first_error) { @@ -3361,6 +3343,8 @@ if (ha_create_info->tmp_table()) { create_flags|= HA_CREATE_TMP_TABLE | HA_CREATE_DELAY_KEY_WRITE; + if (ha_create_info->options & HA_LEX_CREATE_GLOBAL_TMP_TABLE) + create_flags|= HA_CREATE_GLOBAL_TMP_TABLE; create_info.transactional= 0; } if (ha_create_info->options & HA_CREATE_KEEP_FILES) @@ -3894,7 +3878,8 @@ if (!aria_readonly) res= maria_upgrade(); res= res || maria_init(); - tmp= ma_control_file_open(!aria_readonly, !aria_readonly, !aria_readonly); + tmp= ma_control_file_open(!aria_readonly, !aria_readonly, !aria_readonly, + control_file_open_flags); res= res || aria_readonly ? tmp == CONTROL_FILE_LOCKED : tmp != 0; res= res || ((force_start_after_recovery_failures != 0 && !aria_readonly) && diff -Nru mariadb-10.11.6/storage/maria/ha_maria.h mariadb-10.11.9/storage/maria/ha_maria.h --- mariadb-10.11.6/storage/maria/ha_maria.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ha_maria.h 2024-08-03 07:29:59.000000000 +0000 @@ -77,7 +77,7 @@ { return max_supported_key_length(); } enum row_type get_row_type() const override final; void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share) override final; - virtual double scan_time() override final; + double scan_time() override final; int open(const char *name, int mode, uint test_if_locked) override; int close(void) override final; @@ -122,8 +122,8 @@ int external_lock(THD * thd, int lock_type) override; int start_stmt(THD *thd, thr_lock_type lock_type) override final; int delete_all_rows(void) override final; - int disable_indexes(uint mode) override final; - int enable_indexes(uint mode) override final; + int disable_indexes(key_map map, bool persist) override final; + int enable_indexes(key_map map, bool persist) override final; int indexes_are_disabled(void) override final; void start_bulk_insert(ha_rows rows, uint flags) override final; int end_bulk_insert() override final; diff -Nru mariadb-10.11.6/storage/maria/ha_s3.cc mariadb-10.11.9/storage/maria/ha_s3.cc --- mariadb-10.11.6/storage/maria/ha_s3.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ha_s3.cc 2024-08-03 07:29:59.000000000 +0000 @@ -121,6 +121,29 @@ } } +static void update_s3_debug(MYSQL_THD thd, + struct st_mysql_sys_var *var + __attribute__((unused)), + void *var_ptr __attribute__((unused)), + const void *save) +{ + char new_state= *(char *) save; + if (s3_debug != new_state) + { + s3_debug= new_state; + if (s3_hton) // If library is initalized + { + ms3_debug(new_state); + if (!new_state) + { + /* Ensure that all logging is written to log */ + fflush(stderr); + } + } + } +} + + /* Define system variables for S3 */ static MYSQL_SYSVAR_ULONG(block_size, s3_block_size, @@ -129,9 +152,9 @@ 4*1024*1024, 65536, 16*1024*1024, 8192); static MYSQL_SYSVAR_BOOL(debug, s3_debug, - PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, + PLUGIN_VAR_RQCMDARG, "Generates trace file from libmarias3 on stderr for debugging", - 0, 0, 0); + 0, update_s3_debug, 0); static MYSQL_SYSVAR_BOOL(slave_ignore_updates, s3_slave_ignore_updates, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, @@ -147,7 +170,10 @@ static MYSQL_SYSVAR_ENUM(protocol_version, s3_protocol_version, PLUGIN_VAR_RQCMDARG, "Protocol used to communication with S3. One of " - "\"Auto\", \"Amazon\" or \"Original\".", + "\"Auto\", \"Legacy\", \"Original\", \"Amazon\", " + "\"Path\" or \"Domain\". " + "Note: \"Legacy\", \"Original\" and \"Amazon\" are " + "deprecated.", NULL, NULL, 0, &s3_protocol_typelib); static MYSQL_SYSVAR_ULONG(pagecache_age_threshold, @@ -549,6 +575,7 @@ s3_deinit(s3_client); if (error) maria_delete_table_files(name, 1, 0); + } else #endif /* MOVE_TABLE_TO_S3 */ { @@ -1048,7 +1075,7 @@ s3_pagecache.big_block_free= s3_free; s3_init_library(); if (s3_debug) - ms3_debug(); + ms3_debug(1); struct s3_func s3f_real = { diff -Nru mariadb-10.11.6/storage/maria/libmarias3/README.rst mariadb-10.11.9/storage/maria/libmarias3/README.rst --- mariadb-10.11.6/storage/maria/libmarias3/README.rst 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/README.rst 2024-08-03 07:30:01.000000000 +0000 @@ -45,6 +45,17 @@ | S3NOVERIFY | Set to ``1`` if the host should not use SSL verification | +------------+----------------------------------------------------------+ +If you have minion installed, you should be able to use same settings as used by +MariaDB mtr s3 tests: + +export S3KEY=minio +export S3SECRET=minioadmin +export S3REGION= +export S3BUCKET=storage-engine +export S3HOST=127.0.0.1 +export S3PORT=9000 +export S3USEHTTP=1 + The test suite is automatically built along with the library and can be executed with ``make check`` or ``make distcheck``. Before pushing, please ALWAYS ensure that ``make check`` and ``make distcheck`` works! diff -Nru mariadb-10.11.6/storage/maria/libmarias3/docs/api/functions.rst mariadb-10.11.9/storage/maria/libmarias3/docs/api/functions.rst --- mariadb-10.11.6/storage/maria/libmarias3/docs/api/functions.rst 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/docs/api/functions.rst 2024-08-03 07:30:01.000000000 +0000 @@ -147,7 +147,7 @@ res= ms3_list(ms3, s3bucket, NULL, &list); if (res) { - printf("Error occured: %d\n", res); + printf("Error occurred: %d\n", res); return; } list_it= list; @@ -220,7 +220,7 @@ res= ms3_put(ms3, s3bucket, "test/ms3.txt", (const uint8_t*)test_string, strlen(test_string)); if (res) { - printf("Error occured: %d\n", res); + printf("Error occurred: %d\n", res); return; } ms3_deinit(ms3); @@ -290,7 +290,7 @@ res= ms3_get(ms3, s3bucket, "test/ms3.txt", &data, &length); if (res) { - printf("Error occured: %d\n", res); + printf("Error occurred: %d\n", res); return; } printf("File contents: %s\n", data); @@ -348,7 +348,7 @@ res = ms3_delete(ms3, s3bucket, "test/ms3.txt"); if (res) { - printf("Error occured: %d\n", res); + printf("Error occurred: %d\n", res); return; } ms3_deinit(ms3); @@ -384,7 +384,7 @@ res= ms3_status(ms3, s3bucket, "test/ms3.txt", &status); if (res) { - printf("Error occured: %d\n", res); + printf("Error occurred: %d\n", res); return; } printf("File length: %ld\n", status.length); diff -Nru mariadb-10.11.6/storage/maria/libmarias3/docs/api/types.rst mariadb-10.11.9/storage/maria/libmarias3/docs/api/types.rst --- mariadb-10.11.6/storage/maria/libmarias3/docs/api/types.rst 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/docs/api/types.rst 2024-08-03 07:30:01.000000000 +0000 @@ -49,6 +49,8 @@ * ``MS3_OPT_BUFFER_CHUNK_SIZE`` - Set the chunk size in bytes for the receive buffer. Default is 1MB. If you are receiving a large file a realloc will have to happen every time the buffer is full. For performance reasons you may want to increase the size of this buffer to reduce the reallocs and associated memory copies. The ``value`` parameter of :c:func:`ms3_set_option` should be a pointer to a :c:type:`size_t` greater than 1. * ``MS3_OPT_FORCE_LIST_VERSION`` - An internal option for the regression suite only. The ``value`` parameter of :c:func:`ms3_set_option` should be a pointer to a :c:type:`uint8_t` of value ``1`` or ``2`` * ``MS3_OPT_FORCE_PROTOCOL_VERSION`` - Set to 1 to force talking to the S3 server using version 1 of the List Bucket API, this is for S3 compatible servers. Set to 2 to force talking to the S3 server version 2 of the List Bucket API. This is for use when the autodetect bsaed on providing a base_domain does the wrong thing. The ``value`` parameter of :c:func:`ms3_set_option` should be a pointer to a :c:type:`uint8_t` of value ``1`` or ``2`` + * ``MS3_OPT_READ_CB`` - Custom read callback for :c:func:`ms3_get`. The ``value`` parameter of :c:func:`ms3_set_option` should be a :c:type:`ms3_read_callback` function. + * ``MS3_OPT_USER_DATA`` - User data for the custom read callback. The ``value`` parameter of :c:func:`ms3_set_option` is the pointer that will be passed as the ``userdata`` argument of the callback. Built-In Types ============== diff -Nru mariadb-10.11.6/storage/maria/libmarias3/libmarias3/marias3.h mariadb-10.11.9/storage/maria/libmarias3/libmarias3/marias3.h --- mariadb-10.11.6/storage/maria/libmarias3/libmarias3/marias3.h 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/libmarias3/marias3.h 2024-08-03 07:30:01.000000000 +0000 @@ -55,6 +55,12 @@ typedef char *(*ms3_strdup_callback)(const char *str); typedef void *(*ms3_calloc_callback)(size_t nmemb, size_t size); +/** The callback function for MS3_OPT_READ_CB. The function and the user data + * set with MS3_OPT_USER_DATA are passed to Curl. For more information, refer + * to CURLOPT_WRITE_FUNCTION. */ +typedef size_t (*ms3_read_callback)(void *buffer, size_t size, + size_t nitems, void *userdata); + enum ms3_error_code_t { MS3_ERR_NONE, @@ -70,6 +76,7 @@ MS3_ERR_SERVER, MS3_ERR_TOO_BIG, MS3_ERR_AUTH_ROLE, + MS3_ERR_ENDPOINT, MS3_ERR_MAX // Always the last error }; @@ -82,6 +89,8 @@ MS3_OPT_BUFFER_CHUNK_SIZE, MS3_OPT_FORCE_LIST_VERSION, MS3_OPT_FORCE_PROTOCOL_VERSION, + MS3_OPT_READ_CB, + MS3_OPT_USER_DATA, MS3_OPT_PORT_NUMBER }; @@ -124,7 +133,7 @@ const char *ms3_error(uint8_t errcode); MS3_API -void ms3_debug(void); +void ms3_debug(int debug_state); MS3_API uint8_t ms3_list(ms3_st *ms3, const char *bucket, const char *prefix, diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/assume_role.c mariadb-10.11.9/storage/maria/libmarias3/src/assume_role.c --- mariadb-10.11.6/storage/maria/libmarias3/src/assume_role.c 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/assume_role.c 2024-08-03 07:30:01.000000000 +0000 @@ -373,7 +373,7 @@ time_t now; struct tm tmp_tm; char headerbuf[3072]; - char secrethead[45]; + char secrethead[MAX_S3_SECRET_LENGTH + S3_SECRET_EXTRA_LENGTH]; char date[9]; char sha256hash[65]; char post_hash[65]; @@ -445,7 +445,7 @@ // User signing key hash // Date hashed using AWS4:secret_key - snprintf(secrethead, sizeof(secrethead), "AWS4%.*s", 40, secret); + snprintf(secrethead, sizeof(secrethead), "AWS4%.*s", MAX_S3_SECRET_LENGTH, secret); strftime(headerbuf, sizeof(headerbuf), "%Y%m%d", &tmp_tm); hmac_sha256((uint8_t *)secrethead, strlen(secrethead), (uint8_t *)headerbuf, strlen(headerbuf), hmac_hash); diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/error.c mariadb-10.11.9/storage/maria/libmarias3/src/error.c --- mariadb-10.11.6/storage/maria/libmarias3/src/error.c 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/error.c 2024-08-03 07:30:01.000000000 +0000 @@ -35,5 +35,7 @@ "Authentication error", "File not found", "S3 server error", - "Data too big. Maximum data size is 4GB" + "Data too big. Maximum data size is 4GB", + "Error in role", + "Endpoint permanently moved" }; diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/include.am mariadb-10.11.9/storage/maria/libmarias3/src/include.am --- mariadb-10.11.6/storage/maria/libmarias3/src/include.am 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/include.am 2024-08-03 07:30:01.000000000 +0000 @@ -18,7 +18,7 @@ src_libmarias3_la_SOURCES= src_libmarias3_la_LIBADD= src_libmarias3_la_LDFLAGS= -src_libmarias3_la_CFLAGS= -DBUILDING_MS3 +src_libmarias3_la_CFLAGS= -DBUILDING_MS3 -fPIC src_libmarias3_la_SOURCES+= src/marias3.c src_libmarias3_la_SOURCES+= src/request.c diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/marias3.c mariadb-10.11.9/storage/maria/libmarias3/src/marias3.c --- mariadb-10.11.6/storage/maria/libmarias3/src/marias3.c 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/marias3.c 2024-08-03 07:30:01.000000000 +0000 @@ -52,7 +52,7 @@ pthread_mutex_unlock(&(mutex_buf[n])); } -static int curl_needs_openssl_locking() +static int curl_needs_openssl_locking(void) { curl_version_info_data *data = curl_version_info(CURLVERSION_NOW); @@ -214,6 +214,8 @@ ms3->list_container.start = NULL; ms3->list_container.pool_list = NULL; ms3->list_container.pool_free = 0; + ms3->read_cb= 0; + ms3->user_data= 0; ms3->iam_role = NULL; ms3->role_key = NULL; @@ -354,14 +356,16 @@ return ms3->last_error; } -void ms3_debug(void) +void ms3_debug(int debug_state) { bool state = ms3debug_get(); - ms3debug_set(!state); - - if (state) + if (state != (bool) debug_state) { - ms3debug("enabling debug"); + ms3debug_set((bool) debug_state); + if (debug_state) + { + ms3debug("enabling debug"); + } } } @@ -449,15 +453,23 @@ buf.data = NULL; buf.length = 0; - if (!ms3 || !bucket || !key || key[0] == '\0' || !data || !length) + if (!ms3 || !bucket || !key || key[0] == '\0') + { + return MS3_ERR_PARAMETER; + } + else if (!ms3->read_cb && (!data || !length)) { return MS3_ERR_PARAMETER; } res = execute_request(ms3, MS3_CMD_GET, bucket, key, NULL, NULL, NULL, NULL, 0, NULL, &buf); - *data = buf.data; - *length = buf.length; + if (!ms3->read_cb) + { + *data = buf.data; + *length = buf.length; + } + return res; } @@ -617,7 +629,7 @@ return MS3_ERR_PARAMETER; } - ms3->list_version = protocol_version; + ms3->protocol_version = protocol_version; break; } @@ -634,6 +646,24 @@ ms3->port = port_number; break; } + + case MS3_OPT_READ_CB: + { + if (!value) + { + return MS3_ERR_PARAMETER; + } + + ms3->read_cb = value; + break; + } + + case MS3_OPT_USER_DATA: + { + ms3->user_data = value; + break; + } + default: return MS3_ERR_PARAMETER; } diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/request.c mariadb-10.11.9/storage/maria/libmarias3/src/request.c --- mariadb-10.11.6/storage/maria/libmarias3/src/request.c 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/request.c 2024-08-03 07:30:01.000000000 +0000 @@ -413,7 +413,7 @@ time_t now; struct tm tmp_tm; char headerbuf[3072]; - char secrethead[45]; + char secrethead[MAX_S3_SECRET_LENGTH + S3_SECRET_EXTRA_LENGTH]; char date[9]; char sha256hash[65]; char post_hash[65]; @@ -520,7 +520,7 @@ // User signing key hash // Date hashed using AWS4:secret_key - snprintf(secrethead, sizeof(secrethead), "AWS4%.*s", 40, secret); + snprintf(secrethead, sizeof(secrethead), "AWS4%.*s", MAX_S3_SECRET_LENGTH, secret); strftime(headerbuf, sizeof(headerbuf), "%Y%m%d", &tmp_tm); hmac_sha256((uint8_t *)secrethead, strlen(secrethead), (uint8_t *)headerbuf, strlen(headerbuf), hmac_hash); @@ -829,9 +829,19 @@ if (ms3->port) curl_easy_setopt(curl, CURLOPT_PORT, (long)ms3->port); + if (ms3->read_cb && cmd == MS3_CMD_GET) + { + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ms3->read_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, ms3->user_data); + } + else + { + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, body_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&mem); + } + + curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, ms3->buffer_chunk_size); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, body_callback); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&mem); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_res = curl_easy_perform(curl); @@ -848,6 +858,18 @@ curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code); ms3debug("Response code: %ld", response_code); + if (response_code == 301) + { + char *message = parse_error_message((char *)mem.data, mem.length); + + if (message) + { + ms3debug("Response message: %s", message); + } + + set_error_nocopy(ms3, message); + res = MS3_ERR_ENDPOINT; + } if (response_code == 404) { char *message = parse_error_message((char *)mem.data, mem.length); diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/request.h mariadb-10.11.9/storage/maria/libmarias3/src/request.h --- mariadb-10.11.6/storage/maria/libmarias3/src/request.h 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/request.h 2024-08-03 07:30:01.000000000 +0000 @@ -26,6 +26,8 @@ // Maxmum S3 file size is 1024 bytes so for protection we make the maximum // URI length this #define MAX_URI_LENGTH 1024 +#define MAX_S3_SECRET_LENGTH 128 +#define S3_SECRET_EXTRA_LENGTH 5 #define READ_BUFFER_DEFAULT_SIZE 1024*1024 diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/response.c mariadb-10.11.9/storage/maria/libmarias3/src/response.c --- mariadb-10.11.6/storage/maria/libmarias3/src/response.c 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/response.c 2024-08-03 07:30:01.000000000 +0000 @@ -395,7 +395,7 @@ } } while ((member = xml_node_child(roles, ++roles_it))); - if (!strcmp(response_role_name, role_name)) + if (response_role_name && !strcmp(response_role_name, role_name)) { ms3debug("Role Found ARN = %s",response_role_arn); sprintf(arn, "%s", response_role_arn); diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/structs.h mariadb-10.11.9/storage/maria/libmarias3/src/structs.h --- mariadb-10.11.6/storage/maria/libmarias3/src/structs.h 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/structs.h 2024-08-03 07:30:01.000000000 +0000 @@ -64,6 +64,8 @@ bool first_run; char *path_buffer; char *query_buffer; + void *read_cb; + void *user_data; struct ms3_list_container_st list_container; }; diff -Nru mariadb-10.11.6/storage/maria/libmarias3/src/xml.c mariadb-10.11.9/storage/maria/libmarias3/src/xml.c --- mariadb-10.11.6/storage/maria/libmarias3/src/xml.c 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/src/xml.c 2024-08-03 07:30:01.000000000 +0000 @@ -800,7 +800,7 @@ return node; - /* A failure occured, so free all allocalted resources + /* A failure occurred, so free all allocalted resources */ exit_failure: if (tag_open) { diff -Nru mariadb-10.11.6/storage/maria/libmarias3/tests/error.c mariadb-10.11.9/storage/maria/libmarias3/tests/error.c --- mariadb-10.11.6/storage/maria/libmarias3/tests/error.c 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/tests/error.c 2024-08-03 07:30:01.000000000 +0000 @@ -35,7 +35,7 @@ (void) argv; // Enable here so cppcheck shows coverage - ms3_debug(); + ms3_debug(1); ASSERT_NOT_NULL(ms3); errmsg = ms3_error(255); ASSERT_STREQ(errmsg, "No such error code"); diff -Nru mariadb-10.11.6/storage/maria/libmarias3/tests/include.am mariadb-10.11.9/storage/maria/libmarias3/tests/include.am --- mariadb-10.11.6/storage/maria/libmarias3/tests/include.am 2021-06-30 08:51:11.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/tests/include.am 2024-08-03 07:30:01.000000000 +0000 @@ -67,3 +67,7 @@ check_PROGRAMS+= t/list noinst_PROGRAMS+= t/list +t_read_cb_SOURCES= tests/read_cb.c +t_read_cb_LDADD= src/libmarias3.la +check_PROGRAMS+= t/read_cb +noinst_PROGRAMS+= t/read_cb diff -Nru mariadb-10.11.6/storage/maria/libmarias3/tests/read_cb.c mariadb-10.11.9/storage/maria/libmarias3/tests/read_cb.c --- mariadb-10.11.6/storage/maria/libmarias3/tests/read_cb.c 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/maria/libmarias3/tests/read_cb.c 2024-08-03 07:30:01.000000000 +0000 @@ -0,0 +1,129 @@ +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: + * Copyright 2023 MariaDB Corporation Ab. All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#include +#include + +#define NUM_BYTES 64 * 1024 + +/* Tests basic GET with a custom read callback */ +int total_reads = 0; + +static size_t read_cb(void *buf, size_t size, size_t nitems, void *userdata) +{ + char** dat = (char**)userdata; + char* ptr = *dat; + memcpy(ptr, buf, size * nitems); + ptr += size * nitems; + *dat = ptr; + total_reads++; + return nitems * size; +} + +int main(int argc, char *argv[]) +{ + int res; + int initial_reads; + uint8_t *data; + size_t length; + ms3_st *ms3; + size_t buffer_size; + char *test_string = malloc(NUM_BYTES); + char *dest = malloc(NUM_BYTES); + char* userdata = dest; + char *s3key = getenv("S3KEY"); + char *s3secret = getenv("S3SECRET"); + char *s3region = getenv("S3REGION"); + char *s3bucket = getenv("S3BUCKET"); + char *s3host = getenv("S3HOST"); + char *s3noverify = getenv("S3NOVERIFY"); + char *s3usehttp = getenv("S3USEHTTP"); + char *s3port = getenv("S3PORT"); + + SKIP_IF_(!s3key, "Environment variable S3KEY missing"); + SKIP_IF_(!s3secret, "Environment variable S3SECRET missing"); + SKIP_IF_(!s3region, "Environment variable S3REGION missing"); + SKIP_IF_(!s3bucket, "Environment variable S3BUCKET missing"); + + (void) argc; + (void) argv; + + memset(test_string, 'a', NUM_BYTES); + memset(dest, 'b', NUM_BYTES); + + ms3_library_init(); + ms3 = ms3_init(s3key, s3secret, s3region, s3host); + + if (s3noverify && !strcmp(s3noverify, "1")) + { + ms3_set_option(ms3, MS3_OPT_DISABLE_SSL_VERIFY, NULL); + } + + if (s3usehttp && !strcmp(s3usehttp, "1")) + { + ms3_set_option(ms3, MS3_OPT_USE_HTTP, NULL); + } + + if (s3port) + { + int port = atol(s3port); + ms3_set_option(ms3, MS3_OPT_PORT_NUMBER, &port); + } + + ASSERT_NOT_NULL(ms3); + + res = ms3_put(ms3, s3bucket, "test/read_cb.dat", + (const uint8_t *)test_string, + NUM_BYTES); + ASSERT_EQ_(res, 0, "Result: %u", res); + res = ms3_set_option(ms3, MS3_OPT_READ_CB, read_cb); + ASSERT_EQ_(res, 0, "Result: %u", res); + res = ms3_set_option(ms3, MS3_OPT_USER_DATA, &userdata); + ASSERT_EQ_(res, 0, "Result: %u", res); + length = 0; + data = 0; + res = ms3_get(ms3, s3bucket, "test/read_cb.dat", &data, &length); + ASSERT_EQ_(res, 0, "Result: %u", res); + ASSERT_EQ(data, 0); + ASSERT_EQ(length, 0); + ASSERT_EQ(memcmp(test_string, dest, NUM_BYTES), 0); + + /** Test that the callbacks work with a smaller chunk size */ + memset(dest, 'c', NUM_BYTES); + userdata = dest; + buffer_size = 1024; + res = ms3_set_option(ms3, MS3_OPT_BUFFER_CHUNK_SIZE, &buffer_size); + ASSERT_EQ_(res, 0, "Result: %u", res); + initial_reads = total_reads; + res = ms3_get(ms3, s3bucket, "test/read_cb.dat", &data, &length); + ASSERT_EQ_(res, 0, "Result: %u", res); + ASSERT_EQ(memcmp(test_string, dest, NUM_BYTES), 0); + ASSERT_TRUE_((total_reads - initial_reads) > initial_reads * 2, + "Expected more than %d reads but got only %d", + initial_reads * 2, total_reads - initial_reads); + + res = ms3_delete(ms3, s3bucket, "test/read_cb.dat"); + ASSERT_EQ_(res, 0, "Result: %u", res); + free(test_string); + free(dest); + ms3_free(data); + ms3_deinit(ms3); + ms3_library_deinit(); + return 0; +} diff -Nru mariadb-10.11.6/storage/maria/ma_bitmap.c mariadb-10.11.9/storage/maria/ma_bitmap.c --- mariadb-10.11.6/storage/maria/ma_bitmap.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_bitmap.c 2024-08-03 07:29:59.000000000 +0000 @@ -232,7 +232,7 @@ uint max_page_size; MARIA_FILE_BITMAP *bitmap= &share->bitmap; uint size= share->block_size; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; pgcache_page_no_t first_bitmap_with_space; #ifndef DBUG_OFF /* We want to have a copy of the bitmap to be able to print differences */ diff -Nru mariadb-10.11.6/storage/maria/ma_blockrec.c mariadb-10.11.9/storage/maria/ma_blockrec.c --- mariadb-10.11.6/storage/maria/ma_blockrec.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_blockrec.c 2024-08-03 07:29:59.000000000 +0000 @@ -488,7 +488,7 @@ { MARIA_ROW *row= &info->cur_row, *new_row= &info->new_row; MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; uint default_extents; DBUG_ENTER("_ma_init_block_record"); @@ -2654,7 +2654,6 @@ LSN lsn; my_off_t position; uint save_my_errno; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("write_block_record"); head_block= bitmap_blocks->block; @@ -2721,7 +2720,7 @@ for every data segment we want to store. */ if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, - row->head_length, myflag)) + row->head_length, MY_WME | share->malloc_flag)) DBUG_RETURN(1); tmp_data_used= 0; /* Either 0 or last used uchar in 'data' */ @@ -4750,7 +4749,7 @@ MARIA_EXTENT_CURSOR extent; MARIA_COLUMNDEF *column, *end_column; MARIA_ROW *cur_row= &info->cur_row; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf myflag= MY_WME | share->malloc_flag; DBUG_ENTER("_ma_read_block_record2"); start_of_data= data; @@ -5089,7 +5088,6 @@ uint flag, row_extents, row_extents_size; uint field_lengths __attribute__ ((unused)); uchar *extents, *end; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("read_row_extent_info"); if (!(data= get_record_position(share, buff, @@ -5113,7 +5111,7 @@ if (info->cur_row.extents_buffer_length < row_extents_size && _ma_alloc_buffer(&info->cur_row.extents, &info->cur_row.extents_buffer_length, - row_extents_size, myflag)) + row_extents_size, MY_WME | share->malloc_flag)) DBUG_RETURN(1); memcpy(info->cur_row.extents, data, ROW_EXTENT_SIZE); data+= ROW_EXTENT_SIZE; @@ -5283,7 +5281,7 @@ my_bool _ma_scan_init_block_record(MARIA_HA *info) { MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; DBUG_ENTER("_ma_scan_init_block_record"); DBUG_ASSERT(info->dfile.file == share->bitmap.file.file); diff -Nru mariadb-10.11.6/storage/maria/ma_check.c mariadb-10.11.9/storage/maria/ma_check.c --- mariadb-10.11.6/storage/maria/ma_check.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_check.c 2024-08-03 07:29:59.000000000 +0000 @@ -125,6 +125,7 @@ param->max_stage= 1; param->stack_end_ptr= &my_thread_var->stack_ends_here; param->max_allowed_lsn= (LSN) ~0ULL; + /* Flag when initializing buffers possible used by parallel repair threads */ param->malloc_flags= MY_THREAD_SPECIFIC; } @@ -1305,7 +1306,6 @@ ulong UNINIT_VAR(left_length); uint b_type; char llbuff[22],llbuff2[22],llbuff3[22]; - myf myflag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("check_dynamic_record"); pos= 0; @@ -1413,7 +1413,8 @@ { if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, block_info.rec_len + - share->base.extra_rec_buff_size, myflag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) { _ma_check_print_error(param, @@ -2130,7 +2131,7 @@ if (!(record= (uchar*) my_malloc(PSI_INSTRUMENT_ME, share->base.default_rec_buff_size, - MYF(param->malloc_flags)))) + MYF(MY_THREAD_SPECIFIC)))) { _ma_check_print_error(param,"Not enough memory for record"); DBUG_RETURN(-1); @@ -2507,6 +2508,11 @@ maria_versioning(info, 0); /* remember original number of rows */ *info->state= info->s->state.state; + if (share->data_file_type == BLOCK_RECORD) + share->state.state.data_file_length= MY_ALIGN(sort_info->filelength, + (my_off_t) share->block_size); + else + share->state.state.data_file_length= sort_info->filelength; return 0; } @@ -2743,7 +2749,7 @@ READ_CACHE, share->pack.header_length, 1, MYF(MY_WME))) goto err; } - if (sort_info.new_info->s->data_file_type != BLOCK_RECORD) + if (!block_record) { /* When writing to not block records, we need a write buffer */ if (!rep_quick) @@ -2756,7 +2762,7 @@ sort_info.new_info->opt_flag|=WRITE_CACHE_USED; } } - else if (block_record) + else { scan_inited= 1; if (maria_scan_init(sort_info.info)) @@ -2766,10 +2772,10 @@ if (!(sort_param.record= (uchar *) my_malloc(PSI_INSTRUMENT_ME, (uint) share->base.default_rec_buff_size, - MYF(param->malloc_flags))) || + MYF(MY_THREAD_SPECIFIC))) || _ma_alloc_buffer(&sort_param.rec_buff, &sort_param.rec_buff_size, share->base.default_rec_buff_size, - MYF(param->malloc_flags))) + MYF(MY_THREAD_SPECIFIC))) { _ma_check_print_error(param, "Not enough memory for extra record"); goto err; @@ -3389,7 +3395,7 @@ length= page.size; bzero(buff+length,keyinfo->block_length-length); if (write_page(share, new_file, buff, keyinfo->block_length, - new_page_pos, MYF(MY_NABP | MY_WAIT_IF_FULL))) + new_page_pos, MYF(MY_NABP | MY_WAIT_IF_FULL) & param->myf_rw)) { _ma_check_print_error(param,"Can't write indexblock, error: %d",my_errno); goto err; @@ -3721,7 +3727,7 @@ buff_length=(ulong) MY_MIN(param->write_buffer_length,length); if (!(buff=my_malloc(PSI_INSTRUMENT_ME, buff_length, - MYF(param->malloc_flags)))) + MYF(MY_THREAD_SPECIFIC)))) { buff=tmp_buff; buff_length=IO_SIZE; } @@ -3867,10 +3873,10 @@ if (!(sort_param.record= (uchar*) my_malloc(PSI_INSTRUMENT_ME, (size_t) share->base.default_rec_buff_size, - MYF(param->malloc_flags))) || + MYF(MY_THREAD_SPECIFIC))) || _ma_alloc_buffer(&sort_param.rec_buff, &sort_param.rec_buff_size, share->base.default_rec_buff_size, - MYF(param->malloc_flags))) + MYF(MY_THREAD_SPECIFIC))) { _ma_check_print_error(param, "Not enough memory for extra record"); goto err; @@ -3889,7 +3895,7 @@ sort_param.wordlist=NULL; init_alloc_root(PSI_INSTRUMENT_ME, &sort_param.wordroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0, - MYF(param->malloc_flags)); + MYF(MY_THREAD_SPECIFIC)); sort_param.key_cmp=sort_key_cmp; sort_param.lock_in_memory=maria_lock_memory; @@ -4109,6 +4115,9 @@ _ma_check_print_error(param, "Couldn't change to new data file"); goto err; } + /* Inform sort_delete_record that we are using the new file */ + sort_info.new_info->dfile.file= info->rec_cache.file= info->dfile.file; + if (param->testflag & T_UNPACK) restore_data_file_type(share); @@ -4457,7 +4466,7 @@ if (!(sort_param=(MARIA_SORT_PARAM *) my_malloc(PSI_INSTRUMENT_ME, (uint) share->base.keys * (sizeof(MARIA_SORT_PARAM) + share->base.pack_reclength), - MYF(MY_ZEROFILL | param->malloc_flags)))) + MYF(MY_ZEROFILL | MY_THREAD_SPECIFIC)))) { _ma_check_print_error(param,"Not enough memory for key!"); goto err; @@ -4515,9 +4524,10 @@ sort_param[i].record= (((uchar *)(sort_param+share->base.keys))+ (share->base.pack_reclength * i)); + /* These buffers are per thread */ if (_ma_alloc_buffer(&sort_param[i].rec_buff, &sort_param[i].rec_buff_size, share->base.default_rec_buff_size, - MYF(param->malloc_flags))) + MYF(0))) { _ma_check_print_error(param,"Not enough memory!"); goto err; @@ -4546,7 +4556,7 @@ sort_param[i].key_length+=ft_max_word_len_for_sort-HA_FT_MAXBYTELEN; init_alloc_root(PSI_INSTRUMENT_ME, &sort_param[i].wordroot, FTPARSER_MEMROOT_ALLOC_SIZE, 0, - MYF(param->malloc_flags)); + MYF(MY_THREAD_SPECIFIC)); } } sort_info.total_keys=i; @@ -6105,7 +6115,7 @@ if (!(block= (MA_SORT_KEY_BLOCKS*) my_malloc(PSI_INSTRUMENT_ME, (sizeof(MA_SORT_KEY_BLOCKS)+buffer_length+IO_SIZE)*blocks, - MYF(param->malloc_flags)))) + MYF(MY_THREAD_SPECIFIC)))) { _ma_check_print_error(param,"Not enough memory for sort-key-blocks"); return(0); diff -Nru mariadb-10.11.6/storage/maria/ma_control_file.c mariadb-10.11.9/storage/maria/ma_control_file.c --- mariadb-10.11.6/storage/maria/ma_control_file.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_control_file.c 2024-08-03 07:29:59.000000000 +0000 @@ -272,7 +272,8 @@ CONTROL_FILE_ERROR ma_control_file_open(my_bool create_if_missing, my_bool print_error, - my_bool wait_for_lock) + my_bool wait_for_lock, + int open_flags) { uchar buffer[CF_MAX_SIZE]; char name[FN_REFLEN], errmsg_buff[256]; @@ -280,7 +281,6 @@ " file is probably in use by another process"; uint new_cf_create_time_size, new_cf_changeable_size, new_block_size; my_off_t file_size; - int open_flags= O_BINARY | /*O_DIRECT |*/ O_RDWR | O_CLOEXEC; int error= CONTROL_FILE_UNKNOWN_ERROR; DBUG_ENTER("ma_control_file_open"); @@ -460,6 +460,15 @@ DBUG_RETURN(error); } +/* + The most common way to open the control file when writing tests +*/ + +CONTROL_FILE_ERROR ma_control_file_open_or_create() +{ + return ma_control_file_open(TRUE, TRUE, TRUE, + control_file_open_flags); +} /* Write information durably to the control file; stores this information into @@ -630,7 +639,7 @@ int error= CONTROL_FILE_UNKNOWN_ERROR; uint recovery_fails; File file; - DBUG_ENTER("ma_control_file_open"); + DBUG_ENTER("print_aria_log_control"); if (fn_format(name, CONTROL_FILE_BASE_NAME, maria_data_root, "", MYF(MY_WME)) == NullS) diff -Nru mariadb-10.11.6/storage/maria/ma_control_file.h mariadb-10.11.9/storage/maria/ma_control_file.h --- mariadb-10.11.6/storage/maria/ma_control_file.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_control_file.h 2024-08-03 07:29:59.000000000 +0000 @@ -68,10 +68,13 @@ CONTROL_FILE_ERROR ma_control_file_open(my_bool create_if_missing, my_bool print_error, - my_bool wait_for_lock); + my_bool wait_for_lock, + int open_flags); int ma_control_file_write_and_force(LSN last_checkpoint_lsn_arg, uint32 last_logno_arg, TrID max_trid_arg, uint8 recovery_failures_arg); +/* For simple programs that creates Aria files*/ +CONTROL_FILE_ERROR ma_control_file_open_or_create(); int ma_control_file_end(void); my_bool ma_control_file_inited(void); my_bool print_aria_log_control(void); diff -Nru mariadb-10.11.6/storage/maria/ma_create.c mariadb-10.11.9/storage/maria/ma_create.c --- mariadb-10.11.6/storage/maria/ma_create.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_create.c 2024-08-03 07:29:59.000000000 +0000 @@ -101,7 +101,7 @@ DBUG_ASSERT(maria_inited); - if (flags & HA_CREATE_TMP_TABLE) + if ((flags & HA_CREATE_TMP_TABLE) && !(flags & HA_CREATE_GLOBAL_TMP_TABLE)) common_flag|= MY_THREAD_SPECIFIC; if (!ci) diff -Nru mariadb-10.11.6/storage/maria/ma_dynrec.c mariadb-10.11.9/storage/maria/ma_dynrec.c --- mariadb-10.11.6/storage/maria/ma_dynrec.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_dynrec.c 2024-08-03 07:29:59.000000000 +0000 @@ -1488,7 +1488,6 @@ uchar *UNINIT_VAR(to); uint UNINIT_VAR(left_length); MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("_ma_read_dynamic_record"); if (filepos == HA_OFFSET_ERROR) @@ -1525,7 +1524,8 @@ { if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, block_info.rec_len + - share->base.extra_rec_buff_size, flag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) goto err; } to= info->rec_buff; @@ -1784,7 +1784,6 @@ uchar *UNINIT_VAR(to); MARIA_BLOCK_INFO block_info; MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); DBUG_ENTER("_ma_read_rnd_dynamic_record"); #ifdef MARIA_EXTERNAL_LOCKING @@ -1875,7 +1874,8 @@ { if (_ma_alloc_buffer(&info->rec_buff, &info->rec_buff_size, block_info.rec_len + - share->base.extra_rec_buff_size, flag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) goto err; } to= info->rec_buff; diff -Nru mariadb-10.11.6/storage/maria/ma_extra.c mariadb-10.11.9/storage/maria/ma_extra.c --- mariadb-10.11.6/storage/maria/ma_extra.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_extra.c 2024-08-03 07:29:59.000000000 +0000 @@ -239,25 +239,17 @@ break; /* we're going to modify pieces of the state, stall Checkpoint */ - mysql_mutex_lock(&share->intern_lock); if (info->lock_type == F_UNLCK) { - mysql_mutex_unlock(&share->intern_lock); error= 1; /* Not possibly if not lock */ break; } + mysql_mutex_lock(&share->intern_lock); if (maria_is_any_key_active(share->state.key_map)) { - MARIA_KEYDEF *key= share->keyinfo; - uint i; - for (i =0 ; i < share->base.keys ; i++,key++) - { - if (!(key->flag & HA_NOSAME) && info->s->base.auto_key != i+1) - { - maria_clear_key_active(share->state.key_map, i); - info->update|= HA_STATE_CHANGED; - } - } + if (share->state.key_map != *(ulonglong*)extra_arg) + info->update|= HA_STATE_CHANGED; + share->state.key_map= *(ulonglong*)extra_arg; if (!share->changed) { @@ -542,7 +534,7 @@ { int error= 0; MARIA_SHARE *share= info->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; DBUG_ENTER("maria_reset"); /* Free buffers and reset the following flags: @@ -601,6 +593,20 @@ return share ? share->id : 0; } +/* + Disable MY_WAIT_IF_FULL flag for temporary tables + + Temporary tables does not have MY_WAIT_IF_FULL in share->write_flags +*/ + +uint _ma_write_flags_callback(void *callback_data, myf flags) +{ + MARIA_SHARE *share= (MARIA_SHARE*) callback_data; + if (share) + flags&= ~(~share->write_flag & MY_WAIT_IF_FULL); + return flags; +} + /** @brief flushes the data and/or index file of a table diff -Nru mariadb-10.11.6/storage/maria/ma_loghandler.c mariadb-10.11.9/storage/maria/ma_loghandler.c --- mariadb-10.11.6/storage/maria/ma_loghandler.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_loghandler.c 2024-08-03 07:29:59.000000000 +0000 @@ -1099,10 +1099,6 @@ uchar maria_trans_file_magic[]= { (uchar) 254, (uchar) 254, (uchar) 11, '\001', 'M', 'A', 'R', 'I', 'A', 'L', 'O', 'G' }; -#define LOG_HEADER_DATA_SIZE (sizeof(maria_trans_file_magic) + \ - 8 + 4 + 4 + 4 + 2 + 3 + \ - LSN_STORE_SIZE) - /* Write log file page header in the just opened new log file @@ -3605,6 +3601,9 @@ @retval 1 Error */ +/* Stack size 26120 from clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + my_bool translog_init_with_table(const char *directory, uint32 log_file_max_size, uint32 server_version, @@ -4238,6 +4237,7 @@ ma_message_no_user(0, "log initialization failed"); DBUG_RETURN(1); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* diff -Nru mariadb-10.11.6/storage/maria/ma_loghandler.h mariadb-10.11.9/storage/maria/ma_loghandler.h --- mariadb-10.11.6/storage/maria/ma_loghandler.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_loghandler.h 2024-08-03 07:29:59.000000000 +0000 @@ -534,5 +534,13 @@ } enum_maria_sync_log_dir; extern ulong sync_log_dir; +/* sizeof(maria_trans_file_magic) */ +#define LOG_MAGIC_SIZE 12 +#define LOG_HEADER_DATA_SIZE (LOG_MAGIC_SIZE + \ + 8 + 4 + 4 + 4 + 2 + 3 + \ + LSN_STORE_SIZE) +/* Flags when creating aria_log_control */ +#define control_file_open_flags (O_BINARY | /*O_DIRECT |*/ O_RDWR | O_CLOEXEC) + C_MODE_END #endif diff -Nru mariadb-10.11.6/storage/maria/ma_open.c mariadb-10.11.9/storage/maria/ma_open.c --- mariadb-10.11.6/storage/maria/ma_open.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_open.c 2024-08-03 07:29:59.000000000 +0000 @@ -94,7 +94,7 @@ uint errpos; MARIA_HA info,*m_info; my_bitmap_map *changed_fields_bitmap; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); + myf flag= MY_WME | share->malloc_flag; DBUG_ENTER("maria_clone_internal"); errpos= 0; @@ -171,7 +171,6 @@ mysql_mutex_lock(&share->intern_lock); info.read_record= share->read_record; share->reopen++; - share->write_flag=MYF(MY_NABP | MY_WAIT_IF_FULL); if (share->options & HA_OPTION_READ_ONLY_DATA) { info.lock_type=F_RDLCK; @@ -266,7 +265,9 @@ uint i,j,len,errpos,head_length,base_pos,keys, realpath_err, key_parts,base_key_parts,unique_key_parts,fulltext_keys,uniques; uint internal_table= MY_TEST(open_flags & HA_OPEN_INTERNAL_TABLE); - myf common_flag= open_flags & HA_OPEN_TMP_TABLE ? MY_THREAD_SPECIFIC : 0; + myf common_flag= (((open_flags & HA_OPEN_TMP_TABLE) && + !(open_flags & HA_OPEN_GLOBAL_TMP_TABLE)) ? + MY_THREAD_SPECIFIC : 0); uint file_version; size_t info_length; char name_buff[FN_REFLEN], org_name[FN_REFLEN], index_name[FN_REFLEN], @@ -984,11 +985,13 @@ share->options|= HA_OPTION_READ_ONLY_DATA; share->is_log_table= FALSE; + share->write_flag=MYF(MY_NABP | MY_WAIT_IF_FULL); if (open_flags & HA_OPEN_TMP_TABLE || share->options & HA_OPTION_TMP_TABLE) { - common_flag|= MY_THREAD_SPECIFIC; share->options|= HA_OPTION_TMP_TABLE; share->temporary= share->delay_key_write= 1; + share->malloc_flag= + (open_flags & HA_OPEN_GLOBAL_TMP_TABLE) ? 0 : MY_THREAD_SPECIFIC; share->write_flag=MYF(MY_NABP); share->w_locks++; /* We don't have to update status */ share->tot_locks++; @@ -1555,6 +1558,9 @@ @retval 1 Error */ +/* Stack size 26376 from clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + uint _ma_state_info_write_sub(File file, MARIA_STATE_INFO *state, uint pWrite) { uchar buff[MARIA_STATE_INFO_SIZE + MARIA_STATE_EXTRA_SIZE]; @@ -1629,6 +1635,7 @@ MYF(MY_NABP)); DBUG_RETURN(res != 0); } +PRAGMA_REENABLE_CHECK_STACK_FRAME static uchar *_ma_state_info_read(uchar *ptr, MARIA_STATE_INFO *state, myf flag) @@ -2046,9 +2053,8 @@ int _ma_open_datafile(MARIA_HA *info, MARIA_SHARE *share) { - myf flags= (share->mode & O_NOFOLLOW) ? MY_NOSYMLINKS | MY_WME : MY_WME; - if (share->temporary) - flags|= MY_THREAD_SPECIFIC; + myf flags= ((share->mode & O_NOFOLLOW) ? MY_NOSYMLINKS | MY_WME : MY_WME) | + share->malloc_flag; DEBUG_SYNC_C("mi_open_datafile"); info->dfile.file= share->bitmap.file.file= mysql_file_open(key_file_dfile, share->data_file_name.str, diff -Nru mariadb-10.11.6/storage/maria/ma_packrec.c mariadb-10.11.9/storage/maria/ma_packrec.c --- mariadb-10.11.6/storage/maria/ma_packrec.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_packrec.c 2024-08-03 07:29:59.000000000 +0000 @@ -1417,7 +1417,6 @@ uchar *header= info->header; uint head_length,UNINIT_VAR(ref_length); MARIA_SHARE *share= maria->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); if (file >= 0) { @@ -1444,7 +1443,8 @@ */ if (_ma_alloc_buffer(rec_buff_p, rec_buff_size_p, info->rec_len + info->blob_len + - share->base.extra_rec_buff_size, flag)) + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) return BLOCK_FATAL_ERROR; /* not enough memory */ bit_buff->blob_pos= *rec_buff_p + info->rec_len; bit_buff->blob_end= bit_buff->blob_pos + info->blob_len; @@ -1586,7 +1586,6 @@ uchar *header) { MARIA_SHARE *share= maria->s; - myf flag= MY_WME | (share->temporary ? MY_THREAD_SPECIFIC : 0); header+= read_pack_length((uint) share->pack.version, header, &info->rec_len); @@ -1596,7 +1595,8 @@ &info->blob_len); /* _ma_alloc_rec_buff sets my_errno on error */ if (_ma_alloc_buffer(rec_buff_p, rec_buff_size_p, - info->blob_len + share->base.extra_rec_buff_size, flag)) + info->blob_len + share->base.extra_rec_buff_size, + MY_WME | share->malloc_flag)) return 0; /* not enough memory */ bit_buff->blob_pos= *rec_buff_p; bit_buff->blob_end= *rec_buff_p + info->blob_len; diff -Nru mariadb-10.11.6/storage/maria/ma_pagecache.c mariadb-10.11.9/storage/maria/ma_pagecache.c --- mariadb-10.11.6/storage/maria/ma_pagecache.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_pagecache.c 2024-08-03 07:29:59.000000000 +0000 @@ -687,6 +687,8 @@ /* FIXME: ENGINE=Aria occasionally writes uninitialized data */ __msan_unpoison(args.page, pagecache->block_size); #endif + /* Reset MY_WAIT_IF_FULL for temporary tables */ + flags= _ma_write_flags_callback(filedesc->callback_data, flags); res= (int)my_pwrite(filedesc->file, args.page, pagecache->block_size, ((my_off_t) pageno << pagecache->shift), flags); (*filedesc->post_write_hook)(res, &args); diff -Nru mariadb-10.11.6/storage/maria/ma_range.c mariadb-10.11.9/storage/maria/ma_range.c --- mariadb-10.11.6/storage/maria/ma_range.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_range.c 2024-08-03 07:29:59.000000000 +0000 @@ -191,8 +191,8 @@ info->s->state.key_root[inx], final_page); if (pos >= 0.0) { - DBUG_PRINT("exit",("pos: %ld",(ulong) (pos*info->state->records))); - DBUG_RETURN((ulong) (pos*info->state->records+0.5)); + DBUG_PRINT("exit",("pos: %lld",(longlong) (pos*info->state->records))); + DBUG_RETURN((ha_rows) (pos*info->state->records+0.5)); } DBUG_RETURN(HA_POS_ERROR); } @@ -214,7 +214,7 @@ { int flag; uint keynr, UNINIT_VAR(max_keynr); - my_bool after_key; + my_bool last_key_on_page; uchar *keypos; double offset; MARIA_KEYDEF *keyinfo= key->keyinfo; @@ -230,7 +230,7 @@ goto err; *final_page= pos; flag= (*keyinfo->bin_search)(key, &page, nextflag, &keypos, - info->lastkey_buff, &after_key); + info->lastkey_buff, &last_key_on_page); keynr= _ma_keynr(&page, keypos, &max_keynr); if (flag) @@ -274,7 +274,7 @@ There may be identical keys in the tree. Try to match on of those. Matches keynr + [0-1] */ - if ((offset= _ma_search_pos(info, key, SEARCH_FIND, + if ((offset= _ma_search_pos(info, key, nextflag, _ma_kpos(page.node,keypos), final_page)) < 0) DBUG_RETURN(offset); /* Read error */ @@ -290,9 +290,10 @@ /* - Get keynummer of current key and max number of keys in nod + Get keynumber of current key and max number of keys in nod - keynr >= 0 && key_nr <= max_key + @return key position on page (0 - (ret_max_key - 1)) + ret_max_key contains how many keys there was on the page */ static uint _ma_keynr(MARIA_PAGE *page, uchar *keypos, uint *ret_max_key) diff -Nru mariadb-10.11.6/storage/maria/ma_recovery.c mariadb-10.11.9/storage/maria/ma_recovery.c --- mariadb-10.11.6/storage/maria/ma_recovery.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_recovery.c 2024-08-03 07:29:59.000000000 +0000 @@ -1163,11 +1163,12 @@ /* The record may come from REPAIR, ALTER TABLE ENABLE KEYS, OPTIMIZE. */ + prototype_redo_exec_hook(REDO_REPAIR_TABLE) { int error= 1; MARIA_HA *info; - HA_CHECK param; + HA_CHECK *param; char *name; my_bool quick_repair; DBUG_ENTER("exec_REDO_LOGREC_REDO_REPAIR_TABLE"); @@ -1199,35 +1200,39 @@ */ tprint(tracef, " repairing...\n"); - maria_chk_init(¶m); - param.isam_file_name= name= info->s->open_file_name.str; - param.testflag= uint8korr(rec->header + FILEID_STORE_SIZE); - param.tmpdir= maria_tmpdir; - param.max_trid= max_long_trid; + if (!(param= my_malloc(PSI_INSTRUMENT_ME, sizeof(*param), MYF(MY_WME)))) + DBUG_RETURN(0); + + maria_chk_init(param); + param->isam_file_name= name= info->s->open_file_name.str; + param->testflag= uint8korr(rec->header + FILEID_STORE_SIZE); + param->tmpdir= maria_tmpdir; + param->max_trid= max_long_trid; DBUG_ASSERT(maria_tmpdir); info->s->state.key_map= uint8korr(rec->header + FILEID_STORE_SIZE + 8); - quick_repair= MY_TEST(param.testflag & T_QUICK); + quick_repair= MY_TEST(param->testflag & T_QUICK); - if (param.testflag & T_REP_PARALLEL) + if (param->testflag & T_REP_PARALLEL) { - if (maria_repair_parallel(¶m, info, name, quick_repair)) + if (maria_repair_parallel(param, info, name, quick_repair)) goto end; } - else if (param.testflag & T_REP_BY_SORT) + else if (param->testflag & T_REP_BY_SORT) { - if (maria_repair_by_sort(¶m, info, name, quick_repair)) + if (maria_repair_by_sort(param, info, name, quick_repair)) goto end; } - else if (maria_repair(¶m, info, name, quick_repair)) + else if (maria_repair(param, info, name, quick_repair)) goto end; if (_ma_update_state_lsns(info->s, rec->lsn, trnman_get_min_safe_trid(), - TRUE, !(param.testflag & T_NO_CREATE_RENAME_LSN))) + TRUE, !(param->testflag & T_NO_CREATE_RENAME_LSN))) goto end; error= 0; end: + my_free(param); DBUG_RETURN(error); } @@ -2579,6 +2584,8 @@ return error; } +/* Stack size 18776 in clang. Ok as this is during recover */ +PRAGMA_DISABLE_CHECK_STACK_FRAME static int run_redo_phase(LSN lsn, LSN lsn_end, enum maria_apply_log_way apply) { @@ -2822,6 +2829,7 @@ translog_free_record_header(&rec); DBUG_RETURN(1); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** diff -Nru mariadb-10.11.6/storage/maria/ma_rt_test.c mariadb-10.11.9/storage/maria/ma_rt_test.c --- mariadb-10.11.6/storage/maria/ma_rt_test.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_rt_test.c 2024-08-03 07:29:59.000000000 +0000 @@ -101,7 +101,7 @@ if (maria_init() || (init_pagecache(maria_pagecache, maria_block_size * 16, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff -Nru mariadb-10.11.6/storage/maria/ma_test1.c mariadb-10.11.9/storage/maria/ma_test1.c --- mariadb-10.11.6/storage/maria/ma_test1.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_test1.c 2024-08-03 07:29:59.000000000 +0000 @@ -81,7 +81,7 @@ if (maria_init() || (init_pagecache(maria_pagecache, maria_block_size * 16, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff -Nru mariadb-10.11.6/storage/maria/ma_test2.c mariadb-10.11.9/storage/maria/ma_test2.c --- mariadb-10.11.6/storage/maria/ma_test2.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/ma_test2.c 2024-08-03 07:29:59.000000000 +0000 @@ -90,7 +90,7 @@ if (maria_init() || (init_pagecache(maria_pagecache, pagecache_size, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff -Nru mariadb-10.11.6/storage/maria/maria_def.h mariadb-10.11.9/storage/maria/maria_def.h --- mariadb-10.11.6/storage/maria/maria_def.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/maria_def.h 2024-08-03 07:29:59.000000000 +0000 @@ -754,6 +754,11 @@ ulong max_pack_length; ulong state_diff_length; uint rec_reflength; /* rec_reflength in use now */ + /* + Extra flag to use for my_malloc(); set to MY_THREAD_SPECIFIC for temporary + tables whose memory allocation should be accounted to the current THD. + */ + uint malloc_flag; uint keypage_header; uint32 ftkeys; /* Number of distinct full-text keys + 1 */ @@ -1740,6 +1745,7 @@ extern my_bool ma_killed_standalone(MARIA_HA *); extern uint _ma_file_callback_to_id(void *callback_data); +extern uint _ma_write_flags_callback(void *callback_data, myf flags); extern void free_maria_share(MARIA_SHARE *share); static inline void unmap_file(MARIA_HA *info __attribute__((unused))) diff -Nru mariadb-10.11.6/storage/maria/s3_func.c mariadb-10.11.9/storage/maria/s3_func.c --- mariadb-10.11.6/storage/maria/s3_func.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/s3_func.c 2024-08-03 07:29:59.000000000 +0000 @@ -39,7 +39,7 @@ /* Used by ha_s3.cc and tools to define different protocol options */ -static const char *protocol_types[]= {"Auto", "Original", "Amazon", NullS}; +static const char *protocol_types[]= {"Auto", "Original", "Amazon", "Legacy", "Path", "Domain", NullS}; TYPELIB s3_protocol_typelib= {array_elements(protocol_types)-1,"", protocol_types, NULL}; @@ -154,9 +154,23 @@ errno, ms3_error(errno)); my_errno= HA_ERR_NO_SUCH_TABLE; } - if (s3->protocol_version) + if (s3->protocol_version > 2) + { + uint8_t protocol_version; + switch (s3->protocol_version) + { + case 3: /* Legacy means v1 */ + case 4: /* Path means v1 */ + protocol_version= 1; + break; + case 5: /* Domain means v2 */ + protocol_version= 2; + break; + } + ms3_set_option(s3_client, MS3_OPT_FORCE_PROTOCOL_VERSION, - &s3->protocol_version); + &protocol_version); + } if (s3->port) ms3_set_option(s3_client, MS3_OPT_PORT_NUMBER, &s3->port); diff -Nru mariadb-10.11.6/storage/maria/test_ma_backup.c mariadb-10.11.9/storage/maria/test_ma_backup.c --- mariadb-10.11.6/storage/maria/test_ma_backup.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/test_ma_backup.c 2024-08-03 07:29:59.000000000 +0000 @@ -47,7 +47,7 @@ if (maria_init() || (init_pagecache(maria_pagecache, maria_block_size * 2000, 0, 0, maria_block_size, 0, MY_WME) == 0) || - ma_control_file_open(TRUE, TRUE, TRUE) || + ma_control_file_open_or_create() || (init_pagecache(maria_log_pagecache, TRANSLOG_PAGECACHE_SIZE, 0, 0, TRANSLOG_PAGE_SIZE, 0, MY_WME) == 0) || diff -Nru mariadb-10.11.6/storage/maria/unittest/CMakeLists.txt mariadb-10.11.9/storage/maria/unittest/CMakeLists.txt --- mariadb-10.11.6/storage/maria/unittest/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -15,7 +15,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/zlib ${CMAKE_SOURCE_DIR}/unittest/mytap) -LINK_LIBRARIES(aria myisam mytap mysys dbug strings ${ZLIB_LIBRARY}) +LINK_LIBRARIES(aria myisam mytap mysys dbug strings ${ZLIB_LIBRARIES}) MY_ADD_TESTS(ma_control_file trnman) diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_control_file-t.c mariadb-10.11.9/storage/maria/unittest/ma_control_file-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_control_file-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_control_file-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -114,7 +114,7 @@ { CONTROL_FILE_ERROR error; error_handler_hook= my_ignore_message; - error= ma_control_file_open(TRUE, TRUE, TRUE); + error= ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags); error_handler_hook= default_error_handler_hook; return error; } diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_pagecache_consist.c mariadb-10.11.9/storage/maria/unittest/ma_pagecache_consist.c --- mariadb-10.11.6/storage/maria/unittest/ma_pagecache_consist.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_pagecache_consist.c 2024-08-03 07:29:59.000000000 +0000 @@ -403,10 +403,6 @@ exit(1); } -#ifdef HAVE_THR_SETCONCURRENCY - thr_setconcurrency(2); -#endif - if ((pagen= init_pagecache(&pagecache, PCACHE_SIZE, 0, 0, TEST_PAGE_SIZE, 0, 0)) == 0) { diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_pagecache_rwconsist.c mariadb-10.11.9/storage/maria/unittest/ma_pagecache_rwconsist.c --- mariadb-10.11.6/storage/maria/unittest/ma_pagecache_rwconsist.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_pagecache_rwconsist.c 2024-08-03 07:29:59.000000000 +0000 @@ -272,10 +272,6 @@ exit(1); } -#ifdef HAVE_THR_SETCONCURRENCY - thr_setconcurrency(2); -#endif - if ((pagen= init_pagecache(&pagecache, PCACHE_SIZE, 0, 0, TEST_PAGE_SIZE, 0, 0)) == 0) { diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_pagecache_rwconsist2.c mariadb-10.11.9/storage/maria/unittest/ma_pagecache_rwconsist2.c --- mariadb-10.11.6/storage/maria/unittest/ma_pagecache_rwconsist2.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_pagecache_rwconsist2.c 2024-08-03 07:29:59.000000000 +0000 @@ -268,10 +268,6 @@ exit(1); } -#ifdef HAVE_THR_SETCONCURRENCY - thr_setconcurrency(2); -#endif - if ((pagen= init_pagecache(&pagecache, PCACHE_SIZE, 0, 0, TEST_PAGE_SIZE, 0, 0)) == 0) { diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_pagecache_single.c mariadb-10.11.9/storage/maria/unittest/ma_pagecache_single.c --- mariadb-10.11.6/storage/maria/unittest/ma_pagecache_single.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_pagecache_single.c 2024-08-03 07:29:59.000000000 +0000 @@ -795,10 +795,6 @@ exit(1); } -#ifdef HAVE_THR_SETCONCURRENCY - thr_setconcurrency(2); -#endif - if ((pagen= init_pagecache(&pagecache, PCACHE_SIZE, 0, 0, TEST_PAGE_SIZE, 0, MYF(MY_WME))) == 0) { diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -143,6 +143,8 @@ } +PRAGMA_DISABLE_CHECK_STACK_FRAME + int main(int argc __attribute__((unused)), char *argv[]) { uint32 i; @@ -197,7 +199,7 @@ } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); @@ -664,5 +666,6 @@ my_end(0); return(MY_TEST(exit_status())); } +PRAGMA_REENABLE_CHECK_STACK_FRAME #include "../ma_check_standalone.h" diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_first_lsn-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -66,7 +66,7 @@ } #endif - if (ma_control_file_open(TRUE, TRUE,TRUE)) + if (ma_control_file_open(TRUE, TRUE,TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_max_lsn-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -64,7 +64,7 @@ } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_multigroup-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_multigroup-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_multigroup-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_multigroup-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -280,7 +280,7 @@ bzero(long_tr_id, 6); - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); @@ -443,7 +443,7 @@ end_pagecache(&pagecache, 1); ma_control_file_end(); - if (ma_control_file_open(TRUE,TRUE,TRUE)) + if (ma_control_file_open(TRUE,TRUE,TRUE, control_file_open_flags)) { fprintf(stderr, "pass2: Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_multithread-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_multithread-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_multithread-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_multithread-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -331,11 +331,7 @@ exit(1); } -#ifdef HAVE_THR_SETCONCURRENCY - thr_setconcurrency(2); -#endif - - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_noflush-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_noflush-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_noflush-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_noflush-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -65,7 +65,7 @@ } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_nologs-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_nologs-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_nologs-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_nologs-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -66,7 +66,7 @@ } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); @@ -139,7 +139,7 @@ } } - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_pagecache-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_pagecache-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_pagecache-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_pagecache-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -69,7 +69,7 @@ } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_purge-t.c mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_purge-t.c --- mariadb-10.11.6/storage/maria/unittest/ma_test_loghandler_purge-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/maria/unittest/ma_test_loghandler_purge-t.c 2024-08-03 07:29:59.000000000 +0000 @@ -67,7 +67,7 @@ } #endif - if (ma_control_file_open(TRUE, TRUE, TRUE)) + if (ma_control_file_open(TRUE, TRUE, TRUE, control_file_open_flags)) { fprintf(stderr, "Can't init control file (%d)\n", errno); exit(1); diff -Nru mariadb-10.11.6/storage/mroonga/CMakeLists.txt mariadb-10.11.9/storage/mroonga/CMakeLists.txt --- mariadb-10.11.6/storage/mroonga/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -57,6 +57,11 @@ "${PLUGIN_MROONGA}" STREQUAL "NO") return() endif() + if(WITHOUT_DYNAMIC_PLUGINS) + if(NOT (PLUGIN_MROONGA STREQUAL STATIC)) + return() + endif() + endif() endif() set(MRN_BUNDLED_GROONGA_RELATIVE_DIR "vendor/groonga") diff -Nru mariadb-10.11.6/storage/mroonga/ha_mroonga.cpp mariadb-10.11.9/storage/mroonga/ha_mroonga.cpp --- mariadb-10.11.6/storage/mroonga/ha_mroonga.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/ha_mroonga.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include "mrn.hpp" #include "mrn_mysql.h" #include "mrn_mysql_compat.h" @@ -296,6 +297,7 @@ #endif /* global variables */ +bool mrn_initialized = false; handlerton *mrn_hton_ptr; HASH mrn_open_tables; mysql_mutex_t mrn_open_tables_mutex; @@ -1963,6 +1965,8 @@ mrn::PathMapper::default_mysql_data_home_path = mysql_data_home; #endif + mrn_initialized = true; + return 0; error_allocated_long_term_share_hash_init: @@ -2057,6 +2061,8 @@ mysql_mutex_destroy(&mrn_query_log_mutex); mysql_mutex_destroy(&mrn_log_mutex); + mrn_initialized = false; + return 0; } @@ -4351,9 +4357,9 @@ // TODO: implemented by "reindex" instead of "remove and recreate". // Because "remove and recreate" invalidates opened indexes by // other threads. - error = wrapper_disable_indexes_mroonga(HA_KEY_SWITCH_ALL); + error = wrapper_disable_indexes_mroonga(key_map(table->s->keys), false); if (!error) { - error = wrapper_enable_indexes_mroonga(HA_KEY_SWITCH_ALL); + error = wrapper_enable_indexes_mroonga(key_map(table->s->keys), false); } } } @@ -13639,197 +13645,184 @@ DBUG_RETURN(error); } -int ha_mroonga::wrapper_disable_indexes_mroonga(uint mode) +int ha_mroonga::wrapper_disable_indexes_mroonga(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (share->wrap_key_nr[i] < MAX_KEY) { - continue; - } - if (!grn_index_tables[i]) { - DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); - DBUG_RETURN(0); - } + uint i; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; + } + if (share->wrap_key_nr[i] < MAX_KEY) { + continue; + } + if (!grn_index_tables[i]) { + DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); + DBUG_RETURN(0); + } + } + KEY *key_info = table_share->key_info; + for (i = 0; i < table_share->keys; i++) { + if (!(key_info[i].flags & HA_FULLTEXT) && + !mrn_is_geo_key(&key_info[i])) { + continue; } - KEY *key_info = table_share->key_info; - for (i = 0; i < table_share->keys; i++) { - if (!(key_info[i].flags & HA_FULLTEXT) && - !mrn_is_geo_key(&key_info[i])) { - continue; - } - int sub_error = generic_disable_index(i, key_info); - if (error != 0 && sub_error != 0) { - error = sub_error; - } + int sub_error = generic_disable_index(i, key_info); + if (error != 0 && sub_error != 0) { + error = sub_error; } - } else { - error = HA_ERR_WRONG_COMMAND; } DBUG_RETURN(error); } -int ha_mroonga::wrapper_disable_indexes(uint mode) +int ha_mroonga::wrapper_disable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); MRN_SET_WRAP_SHARE_KEY(share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); - error = wrap_handler->ha_disable_indexes(mode); + error = wrap_handler->ha_disable_indexes(map, persist); MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); if (error == HA_ERR_WRONG_COMMAND) { error = 0; } if (!error) { - error = wrapper_disable_indexes_mroonga(mode); + error = wrapper_disable_indexes_mroonga(map, persist); } DBUG_RETURN(error); } -int ha_mroonga::storage_disable_indexes(uint mode) +int ha_mroonga::storage_disable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (!grn_index_tables[i]) { - DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); - DBUG_RETURN(0); - } + uint i; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; + } + if (!grn_index_tables[i]) { + DBUG_PRINT("info", ("mroonga: keys are disabled already %u", i)); + DBUG_RETURN(0); + } + } + KEY *key_info = table_share->key_info; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; + } + if (map.is_set(i)) { + continue; } - KEY *key_info = table_share->key_info; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE && - (key_info[i].flags & HA_NOSAME)) { - continue; - } - int sub_error = generic_disable_index(i, key_info); - if (error != 0 && sub_error != 0) { - error = sub_error; - } + int sub_error = generic_disable_index(i, key_info); + if (error != 0 && sub_error != 0) { + error = sub_error; } - } else { - DBUG_RETURN(HA_ERR_WRONG_COMMAND); } DBUG_RETURN(error); } -int ha_mroonga::disable_indexes(uint mode) +int ha_mroonga::disable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); if (share->wrapper_mode) { - error = wrapper_disable_indexes(mode); + error = wrapper_disable_indexes(map, persist); } else { - error = storage_disable_indexes(mode); + error = storage_disable_indexes(map, persist); } DBUG_RETURN(error); } -int ha_mroonga::wrapper_enable_indexes_mroonga(uint mode) +int ha_mroonga::wrapper_enable_indexes_mroonga(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i, j; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (share->wrap_key_nr[i] < MAX_KEY) { - continue; - } - if (!grn_index_columns[i]) { - break; - } + uint i, j; + for (i = 0; i < table_share->keys; i++) { + if (i == table->s->primary_key) { + continue; } - if (i == table_share->keys) { - DBUG_PRINT("info", ("mroonga: keys are enabled already")); - DBUG_RETURN(0); + if (share->wrap_key_nr[i] < MAX_KEY) { + continue; + } + if (!grn_index_columns[i]) { + break; + } + } + if (i == table_share->keys) { + DBUG_PRINT("info", ("mroonga: keys are enabled already")); + DBUG_RETURN(0); + } + KEY *p_key_info = &table->key_info[table_share->primary_key]; + KEY *key_info = table_share->key_info; + uint n_keys = table_share->keys; + MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_tables, n_keys); + MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_columns, n_keys); + bitmap_clear_all(table->read_set); + mrn_set_bitmap_by_key(table->read_set, p_key_info); + mrn::PathMapper mapper(share->table_name); + for (i = 0, j = 0; i < n_keys; i++) { + if (!(key_info[i].flags & HA_FULLTEXT) && + !mrn_is_geo_key(&key_info[i])) { + j++; + continue; } - KEY *p_key_info = &table->key_info[table_share->primary_key]; - KEY *key_info = table_share->key_info; - uint n_keys = table_share->keys; - MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_tables, n_keys); - MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_columns, n_keys); - bitmap_clear_all(table->read_set); - mrn_set_bitmap_by_key(table->read_set, p_key_info); - mrn::PathMapper mapper(share->table_name); - for (i = 0, j = 0; i < n_keys; i++) { - if (!(key_info[i].flags & HA_FULLTEXT) && - !mrn_is_geo_key(&key_info[i])) { - j++; - continue; - } - if ((error = mrn_add_index_param(share, &key_info[i], i))) - { + if ((error = mrn_add_index_param(share, &key_info[i], i))) + { + break; + } + index_tables[i] = NULL; + index_columns[i] = NULL; + if (!grn_index_columns[i]) { + if ( + (key_info[i].flags & HA_FULLTEXT) && + (error = wrapper_create_index_fulltext(mapper.table_name(), + i, &key_info[i], + index_tables, index_columns, + share)) + ) { + break; + } else if ( + mrn_is_geo_key(&key_info[i]) && + (error = wrapper_create_index_geo(mapper.table_name(), + i, &key_info[i], + index_tables, index_columns, + share)) + ) { break; } - index_tables[i] = NULL; - index_columns[i] = NULL; - if (!grn_index_columns[i]) { - if ( - (key_info[i].flags & HA_FULLTEXT) && - (error = wrapper_create_index_fulltext(mapper.table_name(), - i, &key_info[i], - index_tables, index_columns, - share)) - ) { - break; - } else if ( - mrn_is_geo_key(&key_info[i]) && - (error = wrapper_create_index_geo(mapper.table_name(), - i, &key_info[i], - index_tables, index_columns, - share)) - ) { - break; - } - grn_index_columns[i] = index_columns[i]; - } - mrn_set_bitmap_by_key(table->read_set, &key_info[i]); + grn_index_columns[i] = index_columns[i]; } - if (!error && i > j) - { - error = wrapper_fill_indexes(ha_thd(), table->key_info, index_columns, - n_keys); - } - bitmap_set_all(table->read_set); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); - } else { - error = HA_ERR_WRONG_COMMAND; + mrn_set_bitmap_by_key(table->read_set, &key_info[i]); } + if (!error && i > j) + { + error = wrapper_fill_indexes(ha_thd(), table->key_info, index_columns, + n_keys); + } + bitmap_set_all(table->read_set); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); DBUG_RETURN(error); } -int ha_mroonga::wrapper_enable_indexes(uint mode) +int ha_mroonga::wrapper_enable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); - int mroonga_error = wrapper_enable_indexes_mroonga(mode); + int mroonga_error = wrapper_enable_indexes_mroonga(map, persist); MRN_SET_WRAP_SHARE_KEY(share, table->s); MRN_SET_WRAP_TABLE_KEY(this, table); - error = wrap_handler->ha_enable_indexes(mode); + error = wrap_handler->ha_enable_indexes(map, persist); MRN_SET_BASE_SHARE_KEY(share, table->s); MRN_SET_BASE_TABLE_KEY(this, table); if (error == HA_ERR_WRONG_COMMAND) { @@ -13838,95 +13831,86 @@ DBUG_RETURN(error); } -int ha_mroonga::storage_enable_indexes(uint mode) +int ha_mroonga::storage_enable_indexes(key_map map, bool persist) { int error = 0; uint n_keys = table_share->keys; MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_tables, n_keys); MRN_ALLOCATE_VARIABLE_LENGTH_ARRAYS(grn_obj *, index_columns, n_keys); bool have_multiple_column_index = false; - bool skip_unique_key = (mode == HA_KEY_SWITCH_NONUNIQ_SAVE); MRN_DBUG_ENTER_METHOD(); - if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE || mode == HA_KEY_SWITCH_ALL) { - uint i; - for (i = 0; i < table_share->keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (!grn_index_columns[i]) { - break; - } + uint i; + for (i = 0; i < n_keys; i++) { + if (i == table->s->primary_key) { + continue; } - if (i == table_share->keys) { - DBUG_PRINT("info", ("mroonga: keys are enabled already")); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); - DBUG_RETURN(0); + if (!grn_index_columns[i]) { + break; + } + } + if (i == n_keys) { + DBUG_PRINT("info", ("mroonga: keys are enabled already")); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); + MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); + DBUG_RETURN(0); + } + KEY *key_info = table->key_info; + bitmap_clear_all(table->read_set); + mrn::PathMapper mapper(share->table_name); + for (; i < n_keys; i++) { + if (!map.is_set(i)) { + continue; } - KEY *key_info = table->key_info; - bitmap_clear_all(table->read_set); - mrn::PathMapper mapper(share->table_name); - for (i = 0; i < n_keys; i++) { - if (i == table->s->primary_key) { - continue; - } - if (skip_unique_key && (key_info[i].flags & HA_NOSAME)) { - continue; - } - if ((error = mrn_add_index_param(share, &key_info[i], i))) + if ((error = mrn_add_index_param(share, &key_info[i], i))) + { + break; + } + index_tables[i] = NULL; + if (!grn_index_columns[i]) { + if ((error = storage_create_index(table, mapper.table_name(), grn_table, + share, &key_info[i], index_tables, + index_columns, i))) { break; } - index_tables[i] = NULL; - if (!grn_index_columns[i]) { - if ((error = storage_create_index(table, mapper.table_name(), grn_table, - share, &key_info[i], index_tables, - index_columns, i))) - { - break; - } - if ( - KEY_N_KEY_PARTS(&(key_info[i])) != 1 && - !(key_info[i].flags & HA_FULLTEXT) - ) { - mrn_set_bitmap_by_key(table->read_set, &key_info[i]); - have_multiple_column_index = true; - } - grn_index_tables[i] = index_tables[i]; - grn_index_columns[i] = index_columns[i]; - } else { - index_columns[i] = NULL; + if ( + KEY_N_KEY_PARTS(&(key_info[i])) != 1 && + !(key_info[i].flags & HA_FULLTEXT) + ) { + mrn_set_bitmap_by_key(table->read_set, &key_info[i]); + have_multiple_column_index = true; } + grn_index_tables[i] = index_tables[i]; + grn_index_columns[i] = index_columns[i]; + } else { + index_columns[i] = NULL; } - if (!error && have_multiple_column_index) - { - error = storage_add_index_multiple_columns(key_info, n_keys, - index_tables, - index_columns, - skip_unique_key); - } - bitmap_set_all(table->read_set); - } else { - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); - MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); - DBUG_RETURN(HA_ERR_WRONG_COMMAND); } + if (!error && have_multiple_column_index) + { + bool skip_unique_key= !table->s->keys_in_use.is_clear_all(); + error = storage_add_index_multiple_columns(key_info, n_keys, + index_tables, + index_columns, + skip_unique_key); + } + bitmap_set_all(table->read_set); MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_tables); MRN_FREE_VARIABLE_LENGTH_ARRAYS(index_columns); DBUG_RETURN(error); } -int ha_mroonga::enable_indexes(uint mode) +int ha_mroonga::enable_indexes(key_map map, bool persist) { int error = 0; MRN_DBUG_ENTER_METHOD(); share->disable_keys = false; if (share->wrapper_mode) { - error = wrapper_enable_indexes(mode); + error = wrapper_enable_indexes(map, persist); } else { - error = storage_enable_indexes(mode); + error = storage_enable_indexes(map, persist); } DBUG_RETURN(error); } diff -Nru mariadb-10.11.6/storage/mroonga/ha_mroonga.hpp mariadb-10.11.9/storage/mroonga/ha_mroonga.hpp --- mariadb-10.11.6/storage/mroonga/ha_mroonga.hpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/ha_mroonga.hpp 2024-08-03 07:29:59.000000000 +0000 @@ -35,11 +35,8 @@ #include #include -#if __cplusplus >= 201402 -# define mrn_override override -#else -# define mrn_override -#endif +#define mrn_override override + #if (MYSQL_VERSION_ID >= 50514 && MYSQL_VERSION_ID < 50600) # define MRN_HANDLER_HAVE_FINAL_ADD_INDEX 1 @@ -406,7 +403,7 @@ public: ha_mroonga(handlerton *hton, TABLE_SHARE *share_arg); ~ha_mroonga(); - const char *table_type() const; // required + const char *table_type() const override; // required const char *index_type(uint inx) mrn_override; const char **bas_ext() const; // required @@ -455,10 +452,10 @@ int update_row(const uchar *old_data, const uchar *new_data) mrn_override; int delete_row(const uchar *buf) mrn_override; - uint max_supported_record_length() const mrn_override; - uint max_supported_keys() const mrn_override; - uint max_supported_key_parts() const mrn_override; - uint max_supported_key_length() const mrn_override; + uint max_supported_record_length() const mrn_override; + uint max_supported_keys() const mrn_override; + uint max_supported_key_parts() const mrn_override; + uint max_supported_key_length() const mrn_override; uint max_supported_key_part_length() const mrn_override; ha_rows records_in_range(uint inx, const key_range *min_key, @@ -542,8 +539,8 @@ bool is_crashed() const mrn_override; bool auto_repair(int error) const mrn_override; bool auto_repair() const; - int disable_indexes(uint mode) mrn_override; - int enable_indexes(uint mode) mrn_override; + int disable_indexes(key_map map, bool persist) mrn_override; + int enable_indexes(key_map map, bool persist) mrn_override; int check(THD* thd, HA_CHECK_OPT* check_opt) mrn_override; int repair(THD* thd, HA_CHECK_OPT* check_opt) mrn_override; bool check_and_repair(THD *thd) mrn_override; @@ -1140,12 +1137,12 @@ bool wrapper_auto_repair(int error) const; bool storage_auto_repair(int error) const; int generic_disable_index(int i, KEY *key_info); - int wrapper_disable_indexes_mroonga(uint mode); - int wrapper_disable_indexes(uint mode); - int storage_disable_indexes(uint mode); - int wrapper_enable_indexes_mroonga(uint mode); - int wrapper_enable_indexes(uint mode); - int storage_enable_indexes(uint mode); + int wrapper_disable_indexes_mroonga(key_map map, bool persist); + int wrapper_disable_indexes(key_map map, bool persist); + int storage_disable_indexes(key_map map, bool persist); + int wrapper_enable_indexes_mroonga(key_map map, bool persist); + int wrapper_enable_indexes(key_map map, bool persist); + int storage_enable_indexes(key_map map, bool persist); int wrapper_check(THD* thd, HA_CHECK_OPT* check_opt); int storage_check(THD* thd, HA_CHECK_OPT* check_opt); int wrapper_fill_indexes(THD *thd, KEY *key_info, diff -Nru mariadb-10.11.6/storage/mroonga/mrn.hpp mariadb-10.11.9/storage/mroonga/mrn.hpp --- mariadb-10.11.6/storage/mroonga/mrn.hpp 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/mrn.hpp 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,29 @@ +/* + Copyright (C) 2024 Sutou Kouhei + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +extern bool mrn_initialized; + +#ifdef __cplusplus +} +#endif diff -Nru mariadb-10.11.6/storage/mroonga/sources.am mariadb-10.11.9/storage/mroonga/sources.am --- mariadb-10.11.6/storage/mroonga/sources.am 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/sources.am 2024-08-03 07:29:59.000000000 +0000 @@ -1,4 +1,5 @@ sources = \ + mrn.hpp \ mrn_macro.hpp \ mrn_constants.hpp \ ha_mroonga.cpp \ diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_command.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_command.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_command.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_command.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -51,6 +52,15 @@ CommandInfo *info = NULL; init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_command(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count == 0) { grn_snprintf(message, MYSQL_ERRMSG_SIZE, diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_escape.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_escape.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_escape.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_escape.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -44,6 +45,15 @@ bool script_mode = false; init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_escape(): Mroonga isn't initialized"); + goto error; + } + if (!(1 <= args->arg_count && args->arg_count <= 2)) { snprintf(message, MYSQL_ERRMSG_SIZE, diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_highlight_html.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_highlight_html.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_highlight_html.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_highlight_html.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -211,6 +212,14 @@ init->ptr = NULL; + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_highlight_html(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count < 1) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_highlight_html(): wrong number of arguments: %u for 1+", diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -29,6 +30,13 @@ MRN_API my_bool last_insert_grn_id_init(UDF_INIT *init, UDF_ARGS *args, char *message) { + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "last_insert_grn_id(): Mroonga isn't initialized"); + return 1; + } if (args->arg_count != 0) { strcpy(message, "last_insert_grn_id must not have arguments"); return 1; diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_normalize.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_normalize.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_normalize.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_normalize.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -53,6 +54,15 @@ String *result_str = NULL; init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_normalize(): Mroonga isn't initialized"); + goto error; + } + if (!(1 <= args->arg_count && args->arg_count <= 2)) { sprintf(message, "mroonga_normalize(): Incorrect number of arguments: %u for 1..2", diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_query_expand.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_query_expand.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_query_expand.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_query_expand.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -74,6 +75,15 @@ MRN_DBUG_ENTER_FUNCTION(); init->ptr = NULL; + + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_query_expand(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count != 4) { sprintf(message, "mroonga_query_expand(): wrong number of arguments: %u for 4", diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_snippet.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_snippet.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_snippet.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_snippet.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -137,6 +138,13 @@ st_mrn_snip_info *snip_info = NULL; bool can_open_snippet = TRUE; init->ptr = NULL; + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_snippet(): Mroonga isn't initialized"); + goto error; + } if (args->arg_count < 11 || (args->arg_count - 11) % 3) { sprintf(message, "Incorrect number of arguments for mroonga_snippet(): %u", diff -Nru mariadb-10.11.6/storage/mroonga/udf/mrn_udf_snippet_html.cpp mariadb-10.11.9/storage/mroonga/udf/mrn_udf_snippet_html.cpp --- mariadb-10.11.6/storage/mroonga/udf/mrn_udf_snippet_html.cpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/udf/mrn_udf_snippet_html.cpp 2024-08-03 07:29:59.000000000 +0000 @@ -17,6 +17,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +#include #include #include #include @@ -194,6 +195,14 @@ init->ptr = NULL; + if (!mrn_initialized) + { + snprintf(message, + MYSQL_ERRMSG_SIZE, + "mroonga_snippet_html(): Mroonga isn't initialized"); + goto error; + } + if (args->arg_count < 1) { snprintf(message, MYSQL_ERRMSG_SIZE, "mroonga_snippet_html(): wrong number of arguments: %u for 1+", diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/CMakeLists.txt mariadb-10.11.9/storage/mroonga/vendor/groonga/CMakeLists.txt --- mariadb-10.11.6/storage/mroonga/vendor/groonga/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -200,6 +200,7 @@ include_directories( BEFORE + ${CMAKE_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/lib diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/CMakeLists.txt mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/CMakeLists.txt --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -188,3 +188,15 @@ CMAKE_C_COMPILER_VERSION VERSION_GREATER "5") ADD_COMPILE_FLAGS(ts/ts_expr_node.c COMPILE_FLAGS "-fno-tree-loop-vectorize") ENDIF() + +# Workaround long compile times with GCC and sanitizers +IF(CMAKE_C_COMPILER_ID STREQUAL "GNU" + AND CMAKE_C_COMPILER_VERSION VERSION_GREATER "11.99") + IF(WITH_UBSAN) + ADD_COMPILE_FLAGS(expr.c COMPILE_FLAGS "-fno-sanitize=undefined") + ENDIF() + IF(WITH_ASAN) + ADD_COMPILE_FLAGS(expr.c COMPILE_FLAGS "-fno-sanitize=address") + ENDIF() +ENDIF() + diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/dat.hpp mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/dat.hpp --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/dat.hpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/dat.hpp 2024-08-03 07:29:59.000000000 +0000 @@ -185,7 +185,7 @@ virtual int line() const throw() { return line_; } - virtual const char *what() const throw() { + const char *what() const throw() override { return what_; } @@ -206,7 +206,7 @@ : Exception(ex) {} virtual ~Error() throw() = default; - virtual ErrorCode code() const throw() { + ErrorCode code() const throw() override { return T; } }; diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/id-cursor.hpp mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/id-cursor.hpp --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/id-cursor.hpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/id-cursor.hpp 2024-08-03 07:29:59.000000000 +0000 @@ -44,17 +44,17 @@ UInt32 limit = MAX_UINT32, UInt32 flags = 0); - void close(); + void close() override; - const Key &next(); + const Key &next() override; - UInt32 offset() const { + UInt32 offset() const override { return offset_; } - UInt32 limit() const { + UInt32 limit() const override { return limit_; } - UInt32 flags() const { + UInt32 flags() const override { return flags_; } diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/key-cursor.hpp mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/key-cursor.hpp --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/key-cursor.hpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/key-cursor.hpp 2024-08-03 07:29:59.000000000 +0000 @@ -38,17 +38,17 @@ UInt32 limit = MAX_UINT32, UInt32 flags = 0); - void close(); + void close() override; - const Key &next(); + const Key &next() override; - UInt32 offset() const { + UInt32 offset() const override { return offset_; } - UInt32 limit() const { + UInt32 limit() const override { return limit_; } - UInt32 flags() const { + UInt32 flags() const override { return flags_; } diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/predictive-cursor.hpp mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/predictive-cursor.hpp --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/predictive-cursor.hpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/predictive-cursor.hpp 2024-08-03 07:29:59.000000000 +0000 @@ -37,17 +37,17 @@ UInt32 limit = MAX_UINT32, UInt32 flags = 0); - void close(); + void close() override; - const Key &next(); + const Key &next() override; - UInt32 offset() const { + UInt32 offset() const override { return offset_; } - UInt32 limit() const { + UInt32 limit() const override { return limit_; } - UInt32 flags() const { + UInt32 flags() const override { return flags_; } diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/prefix-cursor.hpp mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/prefix-cursor.hpp --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/dat/prefix-cursor.hpp 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/dat/prefix-cursor.hpp 2024-08-03 07:29:59.000000000 +0000 @@ -38,17 +38,17 @@ UInt32 limit = MAX_UINT32, UInt32 flags = 0); - void close(); + void close() override; - const Key &next(); + const Key &next() override; - UInt32 offset() const { + UInt32 offset() const override { return offset_; } - UInt32 limit() const { + UInt32 limit() const override { return limit_; } - UInt32 flags() const { + UInt32 flags() const override { return flags_; } diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/db.c mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/db.c --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/db.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/db.c 2024-08-03 07:29:59.000000000 +0000 @@ -38,6 +38,7 @@ #include "grn_util.h" #include "grn_cache.h" #include "grn_window_functions.h" +#include #include #include @@ -1060,6 +1061,8 @@ return ctx->rc; } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static grn_obj * grn_table_create_with_max_n_subrecs(grn_ctx *ctx, const char *name, unsigned int name_size, const char *path, @@ -1238,6 +1241,7 @@ } return res; } +PRAGMA_REENABLE_CHECK_STACK_FRAME grn_obj * grn_table_create(grn_ctx *ctx, const char *name, unsigned int name_size, @@ -4776,6 +4780,9 @@ /* column */ + +PRAGMA_DISABLE_CHECK_STACK_FRAME + grn_obj * grn_column_create(grn_ctx *ctx, grn_obj *table, const char *name, unsigned int name_size, @@ -4978,6 +4985,7 @@ if (!res && id) { grn_obj_delete_by_id(ctx, db, id, GRN_TRUE); } GRN_API_RETURN(res); } +PRAGMA_REENABLE_CHECK_STACK_FRAME grn_obj * grn_column_open(grn_ctx *ctx, grn_obj *table, @@ -8540,6 +8548,8 @@ grn_obj_close(ctx, &v); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + inline static void grn_obj_set_info_source_invalid_lexicon_error(grn_ctx *ctx, const char *message, @@ -8590,6 +8600,8 @@ source_name_size, source_name); } +PRAGMA_REENABLE_CHECK_STACK_FRAME + inline static grn_rc grn_obj_set_info_source_validate(grn_ctx *ctx, grn_obj *obj, grn_obj *value) { @@ -8597,7 +8609,7 @@ grn_obj *lexicon = NULL; grn_id lexicon_domain_id; grn_obj *lexicon_domain = NULL; - grn_bool lexicon_domain_is_table; + grn_bool lexicon_domain_is_table __attribute__((unused)); grn_bool lexicon_have_tokenizer; grn_id *source_ids; int i, n_source_ids; @@ -9330,7 +9342,7 @@ grn_bool is_close_opened_object_mode = GRN_FALSE; grn_id table_id; char table_name[GRN_TABLE_MAX_KEY_SIZE]; - int table_name_size; + int table_name_size __attribute__((unused)); grn_table_cursor *cursor; if (grn_thread_get_limit() == 1) { @@ -10317,12 +10329,10 @@ const char *error_message_tag) { grn_obj *db; - grn_db *db_raw; grn_rc rc; uint32_t spec_size; db = ctx->impl->db; - db_raw = (grn_db *)db; rc = grn_vector_decode(ctx, decoded_spec, diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/load.c mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/load.c --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/load.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/load.c 2024-08-03 07:29:59.000000000 +0000 @@ -20,6 +20,9 @@ #include "grn_ctx_impl.h" #include "grn_db.h" #include "grn_util.h" +#include + +PRAGMA_DISABLE_CHECK_STACK_FRAME static void grn_loader_save_error(grn_ctx *ctx, grn_loader *loader) @@ -1228,3 +1231,5 @@ } GRN_API_RETURN(ctx->rc); } + +PRAGMA_REENABLE_CHECK_STACK_FRAME diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/operator.c mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/operator.c --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/operator.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/operator.c 2024-08-03 07:29:59.000000000 +0000 @@ -20,6 +20,7 @@ #include "grn_db.h" #include "grn_str.h" #include "grn_normalizer.h" +#include #include @@ -31,6 +32,8 @@ # include #endif +PRAGMA_DISABLE_CHECK_STACK_FRAME + static const char *operator_names[] = { "push", "pop", @@ -1360,3 +1363,5 @@ } GRN_API_RETURN(matched); } + +PRAGMA_REENABLE_CHECK_STACK_FRAME diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_object_list.c 2024-08-03 07:29:59.000000000 +0000 @@ -18,6 +18,7 @@ #include "../grn_proc.h" #include "../grn_db.h" +#include #include @@ -73,6 +74,8 @@ GRN_OBJ_FIN(ctx, &flags); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static grn_obj * command_object_list(grn_ctx *ctx, int nargs, @@ -401,6 +404,7 @@ return NULL; } +PRAGMA_REENABLE_CHECK_STACK_FRAME void grn_proc_init_object_list(grn_ctx *ctx) diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_schema.c 2024-08-03 07:29:59.000000000 +0000 @@ -17,9 +17,8 @@ */ #include "../grn_proc.h" - #include "../grn_db.h" - +#include #include typedef struct { @@ -572,6 +571,8 @@ GRN_OBJ_FIN(ctx, &token_filters); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static void command_schema_table_command_collect_arguments(grn_ctx *ctx, grn_obj *table, @@ -692,6 +693,7 @@ #undef ADD_OBJECT_NAME #undef ADD } +PRAGMA_REENABLE_CHECK_STACK_FRAME static void command_schema_table_output_command(grn_ctx *ctx, grn_obj *table) @@ -875,6 +877,8 @@ } } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static void command_schema_column_command_collect_arguments(grn_ctx *ctx, grn_obj *table, @@ -973,6 +977,7 @@ #undef ADD_OBJECT_NAME #undef ADD } +PRAGMA_REENABLE_CHECK_STACK_FRAME static void command_schema_column_output_command(grn_ctx *ctx, diff -Nru mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/proc/proc_select.c mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_select.c --- mariadb-10.11.6/storage/mroonga/vendor/groonga/lib/proc/proc_select.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/mroonga/vendor/groonga/lib/proc/proc_select.c 2024-08-03 07:29:59.000000000 +0000 @@ -24,6 +24,7 @@ #include "../grn_util.h" #include "../grn_cache.h" #include "../grn_ii.h" +#include #include "../grn_ts.h" @@ -2912,7 +2913,7 @@ uint32_t nhits; grn_obj *outbuf = ctx->impl->output.buf; grn_content_type output_type = ctx->impl->output.type; - char cache_key[GRN_CACHE_MAX_KEY_SIZE]; + char *cache_key_buffer= 0; uint32_t cache_key_size; long long int threshold, original_threshold = 0; grn_cache *cache_obj = grn_cache_current_get(ctx); @@ -2985,8 +2986,9 @@ } GRN_HASH_EACH_END(ctx, cursor); } #undef DRILLDOWN_CACHE_SIZE - if (cache_key_size <= GRN_CACHE_MAX_KEY_SIZE) { - char *cp = cache_key; + if (cache_key_size <= GRN_CACHE_MAX_KEY_SIZE && + (cache_key_buffer= (char*) malloc(cache_key_size+1))) { + char *cp = cache_key_buffer; #define PUT_CACHE_KEY(string) \ if ((string).value) \ @@ -3066,11 +3068,12 @@ { grn_rc rc; - rc = grn_cache_fetch(ctx, cache_obj, cache_key, cache_key_size, outbuf); + rc = grn_cache_fetch(ctx, cache_obj, cache_key_buffer, cache_key_size, outbuf); if (rc == GRN_SUCCESS) { GRN_QUERY_LOG(ctx, GRN_QUERY_LOG_CACHE, ":", "cache(%" GRN_FMT_LLD ")", (long long int)GRN_TEXT_LEN(outbuf)); + free(cache_key_buffer); return ctx->rc; } } @@ -3119,7 +3122,7 @@ data->cache.length != 2 || data->cache.value[0] != 'n' || data->cache.value[1] != 'o')) { - grn_cache_update(ctx, cache_obj, cache_key, cache_key_size, outbuf); + grn_cache_update(ctx, cache_obj, cache_key_buffer, cache_key_size, outbuf); } goto exit; } @@ -3186,7 +3189,7 @@ data->cache.length != 2 || data->cache.value[0] != 'n' || data->cache.value[1] != 'o')) { - grn_cache_update(ctx, cache_obj, cache_key, cache_key_size, outbuf); + grn_cache_update(ctx, cache_obj, cache_key_buffer, cache_key_size, outbuf); } if (data->taintable > 0) { grn_db_touch(ctx, DB_OBJ(data->tables.target)->db); @@ -3200,6 +3203,7 @@ /* GRN_LOG(ctx, GRN_LOG_NONE, "%d", ctx->seqno); */ + free(cache_key_buffer); return ctx->rc; } @@ -3424,6 +3428,9 @@ strlen(prefix)); } + +PRAGMA_DISABLE_CHECK_STACK_FRAME + static grn_bool grn_select_data_fill_drilldowns(grn_ctx *ctx, grn_user_data *user_data, @@ -3562,6 +3569,7 @@ return succeeded; } } +PRAGMA_REENABLE_CHECK_STACK_FRAME static grn_obj * command_select(grn_ctx *ctx, int nargs, grn_obj **args, grn_user_data *user_data) diff -Nru mariadb-10.11.6/storage/myisam/ft_boolean_search.c mariadb-10.11.9/storage/myisam/ft_boolean_search.c --- mariadb-10.11.6/storage/myisam/ft_boolean_search.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/myisam/ft_boolean_search.c 2024-08-03 07:29:59.000000000 +0000 @@ -287,6 +287,8 @@ uchar *end= (uchar*) query + len; FT_WORD w; + w.pos= NULL; + w.len= 0; info.prev= ' '; info.quot= 0; while (ft_get_word(cs, start, end, &w, &info)) diff -Nru mariadb-10.11.6/storage/myisam/ha_myisam.cc mariadb-10.11.9/storage/myisam/ha_myisam.cc --- mariadb-10.11.6/storage/myisam/ha_myisam.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/myisam/ha_myisam.cc 2024-08-03 07:29:59.000000000 +0000 @@ -710,6 +710,16 @@ return (((TABLE*) (info->external_ref))->in_use->killed != 0); } +static void init_compute_vcols(void *table) +{ + /* + To evaluate vcols we must have current_thd set. + This will set current_thd in all threads to the same THD, but it's + safe, because vcols are always evaluated under info->s->intern_lock. + */ + set_current_thd(static_cast
    (table)->in_use); +} + static int compute_vcols(MI_INFO *info, uchar *record, int keynum) { /* This mutex is needed for parallel repair */ @@ -1011,6 +1021,7 @@ } DBUG_ASSERT(file->s->base.reclength < file->s->vreclength || !table->s->stored_fields); + param->init_fix_record= init_compute_vcols; param->fix_record= compute_vcols; table->use_all_columns(); } @@ -1559,41 +1570,38 @@ SYNOPSIS disable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ disable all non-unique keys - HA_KEY_SWITCH_ALL disable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE dis. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE dis. all keys and make persistent - - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + + DESCRIPTION + See handler::ha_disable_indexes() RETURN 0 ok HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_myisam::disable_indexes(uint mode) +int ha_myisam::disable_indexes(key_map map, bool persist) { int error; - if (mode == HA_KEY_SWITCH_ALL) + if (!persist) { /* call a storage engine function to switch the key map */ + DBUG_ASSERT(map.is_clear_all()); error= mi_disable_indexes(file); } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { - mi_extra(file, HA_EXTRA_NO_KEYS, 0); + ulonglong ullmap= map.to_ulonglong(); + + /* make sure auto-inc key is enabled even if it's > 64 */ + if (map.length() > MI_KEYMAP_BITS && + table->s->next_number_index < MAX_KEY) + mi_set_key_active(ullmap, table->s->next_number_index); + + mi_extra(file, HA_EXTRA_NO_KEYS, &ullmap); info(HA_STATUS_CONST); // Read new key info error= 0; } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } return error; } @@ -1603,21 +1611,14 @@ SYNOPSIS enable_indexes() - mode mode of operation: - HA_KEY_SWITCH_NONUNIQ enable all non-unique keys - HA_KEY_SWITCH_ALL enable all keys - HA_KEY_SWITCH_NONUNIQ_SAVE en. non-uni. and make persistent - HA_KEY_SWITCH_ALL_SAVE en. all keys and make persistent DESCRIPTION Enable indexes, which might have been disabled by disable_index() before. - The modes without _SAVE work only if both data and indexes are empty, + If persist=false, it works only if both data and indexes are empty, since the MyISAM repair would enable them persistently. To be sure in these cases, call handler::delete_all_rows() before. - IMPLEMENTATION - HA_KEY_SWITCH_NONUNIQ is not implemented. - HA_KEY_SWITCH_ALL_SAVE is not implemented. + See also handler::ha_enable_indexes() RETURN 0 ok @@ -1626,7 +1627,7 @@ HA_ERR_WRONG_COMMAND mode not implemented. */ -int ha_myisam::enable_indexes(uint mode) +int ha_myisam::enable_indexes(key_map map, bool persist) { int error; DBUG_ENTER("ha_myisam::enable_indexes"); @@ -1640,7 +1641,8 @@ DBUG_RETURN(0); } - if (mode == HA_KEY_SWITCH_ALL) + DBUG_ASSERT(map.is_prefix(table->s->keys)); + if (!persist) { error= mi_enable_indexes(file); /* @@ -1649,7 +1651,7 @@ but mode==HA_KEY_SWITCH_ALL forbids it. */ } - else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) + else { THD *thd= table->in_use; int was_error= thd->is_error(); @@ -1709,11 +1711,6 @@ restore_vcos_after_repair(); } - else - { - /* mode not implemented */ - error= HA_ERR_WRONG_COMMAND; - } DBUG_RETURN(error); } @@ -1876,7 +1873,7 @@ setting the indexes as active and trying to recreate them. */ - if (((first_error= enable_indexes(HA_KEY_SWITCH_NONUNIQ_SAVE)) != 0) && + if (((first_error= enable_indexes(key_map(table->s->keys), true))) && table->in_use->killed) { delete_all_rows(); diff -Nru mariadb-10.11.6/storage/myisam/ha_myisam.h mariadb-10.11.9/storage/myisam/ha_myisam.h --- mariadb-10.11.6/storage/myisam/ha_myisam.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/myisam/ha_myisam.h 2024-08-03 07:29:59.000000000 +0000 @@ -54,101 +54,101 @@ public: ha_myisam(handlerton *hton, TABLE_SHARE *table_arg); ~ha_myisam() = default; - handler *clone(const char *name, MEM_ROOT *mem_root); - const char *index_type(uint key_number); - ulonglong table_flags() const { return int_table_flags; } - int index_init(uint idx, bool sorted); - int index_end(); - int rnd_end(); + handler *clone(const char *name, MEM_ROOT *mem_root) override; + const char *index_type(uint key_number) override; + ulonglong table_flags() const override { return int_table_flags; } + int index_init(uint idx, bool sorted) override; + int index_end() override; + int rnd_end() override; - ulong index_flags(uint inx, uint part, bool all_parts) const; - uint max_supported_keys() const { return MI_MAX_KEY; } - uint max_supported_key_parts() const { return HA_MAX_KEY_SEG; } - uint max_supported_key_length() const { return HA_MAX_KEY_LENGTH; } - uint max_supported_key_part_length() const { return HA_MAX_KEY_LENGTH; } - void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share); - int open(const char *name, int mode, uint test_if_locked); - int close(void); - int write_row(const uchar * buf); - int update_row(const uchar * old_data, const uchar * new_data); - int delete_row(const uchar * buf); + ulong index_flags(uint inx, uint part, bool all_parts) const override; + uint max_supported_keys() const override { return MI_MAX_KEY; } + uint max_supported_key_parts() const override { return HA_MAX_KEY_SEG; } + uint max_supported_key_length() const override { return HA_MAX_KEY_LENGTH; } + uint max_supported_key_part_length() const override { return HA_MAX_KEY_LENGTH; } + void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share) override; + int open(const char *name, int mode, uint test_if_locked) override; + int close(void) override; + int write_row(const uchar * buf) override; + int update_row(const uchar * old_data, const uchar * new_data) override; + int delete_row(const uchar * buf) override; int index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map, - enum ha_rkey_function find_flag); + enum ha_rkey_function find_flag) override; int index_read_idx_map(uchar *buf, uint index, const uchar *key, key_part_map keypart_map, - enum ha_rkey_function find_flag); - int index_next(uchar * buf); - int index_prev(uchar * buf); - int index_first(uchar * buf); - int index_last(uchar * buf); - int index_next_same(uchar *buf, const uchar *key, uint keylen); - int ft_init() + enum ha_rkey_function find_flag) override; + int index_next(uchar * buf) override; + int index_prev(uchar * buf) override; + int index_first(uchar * buf) override; + int index_last(uchar * buf) override; + int index_next_same(uchar *buf, const uchar *key, uint keylen) override; + int ft_init() override { if (!ft_handler) return 1; ft_handler->please->reinit_search(ft_handler); return 0; } - FT_INFO *ft_init_ext(uint flags, uint inx,String *key) + FT_INFO *ft_init_ext(uint flags, uint inx,String *key) override { return ft_init_search(flags,file,inx, (uchar *)key->ptr(), key->length(), key->charset(), table->record[0]); } - int ft_read(uchar *buf); - int rnd_init(bool scan); - int rnd_next(uchar *buf); - int rnd_pos(uchar * buf, uchar *pos); - int remember_rnd_pos(); - int restart_rnd_next(uchar *buf); - void position(const uchar *record); - int info(uint); - int extra(enum ha_extra_function operation); - int extra_opt(enum ha_extra_function operation, ulong cache_size); - int reset(void); - int external_lock(THD *thd, int lock_type); - int delete_all_rows(void); - int reset_auto_increment(ulonglong value); - int disable_indexes(uint mode); - int enable_indexes(uint mode); - int indexes_are_disabled(void); - void start_bulk_insert(ha_rows rows, uint flags); - int end_bulk_insert(); + int ft_read(uchar *buf) override; + int rnd_init(bool scan) override; + int rnd_next(uchar *buf) override; + int rnd_pos(uchar * buf, uchar *pos) override; + int remember_rnd_pos() override; + int restart_rnd_next(uchar *buf) override; + void position(const uchar *record) override; + int info(uint) override; + int extra(enum ha_extra_function operation) override; + int extra_opt(enum ha_extra_function operation, ulong cache_size) override; + int reset(void) override; + int external_lock(THD *thd, int lock_type) override; + int delete_all_rows(void) override; + int reset_auto_increment(ulonglong value) override; + int disable_indexes(key_map map, bool persist) override; + int enable_indexes(key_map map, bool persist) override; + int indexes_are_disabled(void) override; + void start_bulk_insert(ha_rows rows, uint flags) override; + int end_bulk_insert() override; ha_rows records_in_range(uint inx, const key_range *min_key, - const key_range *max_key, page_range *pages); - void update_create_info(HA_CREATE_INFO *create_info); - int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info); + const key_range *max_key, page_range *pages) override; + void update_create_info(HA_CREATE_INFO *create_info) override; + int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); - virtual void get_auto_increment(ulonglong offset, ulonglong increment, - ulonglong nb_desired_values, - ulonglong *first_value, - ulonglong *nb_reserved_values); - int rename_table(const char * from, const char * to); - int delete_table(const char *name); - int check_for_upgrade(HA_CHECK_OPT *check_opt); - int check(THD* thd, HA_CHECK_OPT* check_opt); - int analyze(THD* thd,HA_CHECK_OPT* check_opt); - int repair(THD* thd, HA_CHECK_OPT* check_opt); - bool check_and_repair(THD *thd); - bool is_crashed() const; - bool auto_repair(int error) const + enum thr_lock_type lock_type) override; + void get_auto_increment(ulonglong offset, ulonglong increment, + ulonglong nb_desired_values, + ulonglong *first_value, + ulonglong *nb_reserved_values) override; + int rename_table(const char * from, const char * to) override; + int delete_table(const char *name) override; + int check_for_upgrade(HA_CHECK_OPT *check_opt) override; + int check(THD* thd, HA_CHECK_OPT* check_opt) override; + int analyze(THD* thd,HA_CHECK_OPT* check_opt) override; + int repair(THD* thd, HA_CHECK_OPT* check_opt) override; + bool check_and_repair(THD *thd) override; + bool is_crashed() const override; + bool auto_repair(int error) const override { return (myisam_recover_options != HA_RECOVER_OFF && error == HA_ERR_CRASHED_ON_USAGE); } - int optimize(THD* thd, HA_CHECK_OPT* check_opt); - int assign_to_keycache(THD* thd, HA_CHECK_OPT* check_opt); - int preload_keys(THD* thd, HA_CHECK_OPT* check_opt); + int optimize(THD* thd, HA_CHECK_OPT* check_opt) override; + int assign_to_keycache(THD* thd, HA_CHECK_OPT* check_opt) override; + int preload_keys(THD* thd, HA_CHECK_OPT* check_opt) override; enum_alter_inplace_result check_if_supported_inplace_alter(TABLE *new_table, - Alter_inplace_info *alter_info); - bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes); + Alter_inplace_info *alter_info) override; + bool check_if_incompatible_data(HA_CREATE_INFO *info, uint table_changes) override; #ifdef HAVE_QUERY_CACHE my_bool register_query_cache_table(THD *thd, const char *table_key, uint key_length, qc_engine_callback *engine_callback, - ulonglong *engine_data); + ulonglong *engine_data) override; #endif MI_INFO *file_ptr(void) { @@ -159,20 +159,20 @@ * Multi Range Read interface */ int multi_range_read_init(RANGE_SEQ_IF *seq, void *seq_init_param, - uint n_ranges, uint mode, HANDLER_BUFFER *buf); - int multi_range_read_next(range_id_t *range_info); + uint n_ranges, uint mode, HANDLER_BUFFER *buf) override; + int multi_range_read_next(range_id_t *range_info) override; ha_rows multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq, void *seq_init_param, uint n_ranges, uint *bufsz, - uint *flags, Cost_estimate *cost); + uint *flags, Cost_estimate *cost) override; ha_rows multi_range_read_info(uint keyno, uint n_ranges, uint keys, uint key_parts, uint *bufsz, - uint *flags, Cost_estimate *cost); - int multi_range_read_explain_info(uint mrr_mode, char *str, size_t size); + uint *flags, Cost_estimate *cost) override; + int multi_range_read_explain_info(uint mrr_mode, char *str, size_t size) override; /* Index condition pushdown implementation */ - Item *idx_cond_push(uint keyno, Item* idx_cond); - bool rowid_filter_push(Rowid_filter* rowid_filter); + Item *idx_cond_push(uint keyno, Item* idx_cond) override; + bool rowid_filter_push(Rowid_filter* rowid_filter) override; private: DsMrr_impl ds_mrr; diff -Nru mariadb-10.11.6/storage/myisam/mi_extra.c mariadb-10.11.9/storage/myisam/mi_extra.c --- mariadb-10.11.6/storage/myisam/mi_extra.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/myisam/mi_extra.c 2024-08-03 07:29:59.000000000 +0000 @@ -225,16 +225,9 @@ } if (mi_is_any_key_active(share->state.key_map)) { - MI_KEYDEF *key=share->keyinfo; - uint i; - for (i=0 ; i < share->base.keys ; i++,key++) - { - if (!(key->flag & HA_NOSAME) && info->s->base.auto_key != i+1) - { - mi_clear_key_active(share->state.key_map, i); - info->update|= HA_STATE_CHANGED; - } - } + if (share->state.key_map != *(ulonglong*)extra_arg) + info->update|= HA_STATE_CHANGED; + share->state.key_map= *(ulonglong*)extra_arg; if (!share->changed) { diff -Nru mariadb-10.11.6/storage/myisam/sort.c mariadb-10.11.9/storage/myisam/sort.c --- mariadb-10.11.6/storage/myisam/sort.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/myisam/sort.c 2024-08-03 07:29:59.000000000 +0000 @@ -529,6 +529,11 @@ { MI_SORT_PARAM *sort_param= (MI_SORT_PARAM*) arg; my_bool error= FALSE; + + MI_SORT_INFO *si= sort_param->sort_info; + if (si->param->init_fix_record) + si->param->init_fix_record(si->info->external_ref); + /* If my_thread_init fails */ if (my_thread_init() || thr_find_all_keys_exec(sort_param)) error= TRUE; diff -Nru mariadb-10.11.6/storage/myisammrg/ha_myisammrg.h mariadb-10.11.9/storage/myisammrg/ha_myisammrg.h --- mariadb-10.11.6/storage/myisammrg/ha_myisammrg.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/myisammrg/ha_myisammrg.h 2024-08-03 07:29:59.000000000 +0000 @@ -34,7 +34,7 @@ { /* Remembered MERGE child def version. See top comment in ha_myisammrg.cc */ enum_table_ref_type m_child_table_ref_type; - ulong m_child_def_version; + ulonglong m_child_def_version; public: LEX_STRING db; LEX_STRING name; @@ -44,12 +44,12 @@ { return m_child_table_ref_type; } - inline ulong get_child_def_version() + inline ulonglong get_child_def_version() { return m_child_def_version; } inline void set_child_def_version(enum_table_ref_type child_table_ref_type, - ulong version) + ulonglong version) { m_child_table_ref_type= child_table_ref_type; m_child_def_version= version; @@ -82,8 +82,8 @@ ha_myisammrg(handlerton *hton, TABLE_SHARE *table_arg); ~ha_myisammrg(); - const char *index_type(uint key_number); - ulonglong table_flags() const + const char *index_type(uint key_number) override; + ulonglong table_flags() const override { return (HA_REC_NOT_IN_SEQ | HA_AUTO_PART_KEY | HA_NO_TRANSACTIONS | HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE | @@ -93,70 +93,70 @@ HA_NO_COPY_ON_ALTER | HA_DUPLICATE_POS | HA_CAN_MULTISTEP_MERGE); } - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return ((table_share->key_info[inx].algorithm == HA_KEY_ALG_FULLTEXT) ? 0 : HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE | HA_READ_ORDER | HA_KEYREAD_ONLY); } - uint max_supported_keys() const { return MI_MAX_KEY; } - uint max_supported_key_length() const { return HA_MAX_KEY_LENGTH; } - uint max_supported_key_part_length() const { return HA_MAX_KEY_LENGTH; } - double scan_time() + uint max_supported_keys() const override { return MI_MAX_KEY; } + uint max_supported_key_length() const override{ return HA_MAX_KEY_LENGTH; } + uint max_supported_key_part_length() const override { return HA_MAX_KEY_LENGTH; } + double scan_time() override { return ulonglong2double(stats.data_file_length) / IO_SIZE + file->tables; } - int open(const char *name, int mode, uint test_if_locked); + int open(const char *name, int mode, uint test_if_locked) override; int add_children_list(void); int attach_children(void); int detach_children(void); - virtual handler *clone(const char *name, MEM_ROOT *mem_root); - int close(void); - int write_row(const uchar * buf); - int update_row(const uchar * old_data, const uchar * new_data); - int delete_row(const uchar * buf); + handler *clone(const char *name, MEM_ROOT *mem_root) override; + int close(void) override; + int write_row(const uchar * buf) override; + int update_row(const uchar * old_data, const uchar * new_data) override; + int delete_row(const uchar * buf) override; int index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map, - enum ha_rkey_function find_flag); + enum ha_rkey_function find_flag) override; int index_read_idx_map(uchar *buf, uint index, const uchar *key, key_part_map keypart_map, - enum ha_rkey_function find_flag); - int index_read_last_map(uchar *buf, const uchar *key, key_part_map keypart_map); - int index_next(uchar * buf); - int index_prev(uchar * buf); - int index_first(uchar * buf); - int index_last(uchar * buf); - int index_next_same(uchar *buf, const uchar *key, uint keylen); - int rnd_init(bool scan); - int rnd_next(uchar *buf); - int rnd_pos(uchar * buf, uchar *pos); - void position(const uchar *record); + enum ha_rkey_function find_flag) override; + int index_read_last_map(uchar *buf, const uchar *key, key_part_map keypart_map) override; + int index_next(uchar * buf) override; + int index_prev(uchar * buf) override; + int index_first(uchar * buf) override; + int index_last(uchar * buf) override; + int index_next_same(uchar *buf, const uchar *key, uint keylen) override; + int rnd_init(bool scan) override; + int rnd_next(uchar *buf) override; + int rnd_pos(uchar * buf, uchar *pos) override; + void position(const uchar *record) override; ha_rows records_in_range(uint inx, const key_range *start_key, - const key_range *end_key, page_range *pages); - int delete_all_rows(); - int info(uint); - int reset(void); - int extra(enum ha_extra_function operation); - int extra_opt(enum ha_extra_function operation, ulong cache_size); - int external_lock(THD *thd, int lock_type); - uint lock_count(void) const; + const key_range *end_key, page_range *pages) override; + int delete_all_rows() override; + int info(uint) override; + int reset(void) override; + int extra(enum ha_extra_function operation) override; + int extra_opt(enum ha_extra_function operation, ulong cache_size) override; + int external_lock(THD *thd, int lock_type) override; + uint lock_count(void) const override; int create_mrg(const char *name, HA_CREATE_INFO *create_info); - int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info); + int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); - void update_create_info(HA_CREATE_INFO *create_info); - void append_create_info(String *packet); + enum thr_lock_type lock_type) override; + void update_create_info(HA_CREATE_INFO *create_info) override; + void append_create_info(String *packet) override; MYRG_INFO *myrg_info() { return file; } TABLE *table_ptr() { return table; } enum_alter_inplace_result check_if_supported_inplace_alter(TABLE *, - Alter_inplace_info *); + Alter_inplace_info *) override; bool inplace_alter_table(TABLE *altered_table, - Alter_inplace_info *ha_alter_info); - int check(THD* thd, HA_CHECK_OPT* check_opt); - ha_rows records(); - virtual uint count_query_cache_dependant_tables(uint8 *tables_type); - virtual my_bool + Alter_inplace_info *ha_alter_info) override; + int check(THD* thd, HA_CHECK_OPT* check_opt) override; + ha_rows records() override; + uint count_query_cache_dependant_tables(uint8 *tables_type) override; + my_bool register_query_cache_dependant_tables(THD *thd, Query_cache *cache, Query_cache_block_table **block, - uint *n); - virtual void set_lock_type(enum thr_lock_type lock); + uint *n) override; + void set_lock_type(enum thr_lock_type lock) override; }; diff -Nru mariadb-10.11.6/storage/oqgraph/graphcore.cc mariadb-10.11.9/storage/oqgraph/graphcore.cc --- mariadb-10.11.6/storage/oqgraph/graphcore.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/oqgraph/graphcore.cc 2024-08-03 07:29:59.000000000 +0000 @@ -266,10 +266,10 @@ : oqgraph_cursor(arg), no_weight(), sequence(0), results(), last() { } - int fetch_row(const row &, row&); - int fetch_row(const row &, row&, const reference&); + int fetch_row(const row &, row&) override; + int fetch_row(const row &, row&, const reference&) override; - void current(reference& ref) const + void current(reference& ref) const override { ref= last; } @@ -286,10 +286,10 @@ : oqgraph_cursor(arg), position(0) { } - int fetch_row(const row &, row&); - int fetch_row(const row &, row&, const reference&); + int fetch_row(const row &, row&) override; + int fetch_row(const row &, row&, const reference&) override; - void current(reference& ref) const + void current(reference& ref) const override { ref= last; } @@ -308,10 +308,10 @@ : oqgraph_cursor(arg), position(0), last() { } - int fetch_row(const row &, row&); - int fetch_row(const row &, row&, const reference&); + int fetch_row(const row &, row&) override; + int fetch_row(const row &, row&, const reference&) override; - void current(reference& ref) const + void current(reference& ref) const override { ref= last; } diff -Nru mariadb-10.11.6/storage/oqgraph/ha_oqgraph.h mariadb-10.11.9/storage/oqgraph/ha_oqgraph.h --- mariadb-10.11.6/storage/oqgraph/ha_oqgraph.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/oqgraph/ha_oqgraph.h 2024-08-03 07:29:59.000000000 +0000 @@ -58,59 +58,59 @@ public: #if MYSQL_VERSION_ID >= 50100 ha_oqgraph(handlerton *hton, TABLE_SHARE *table); - ulonglong table_flags() const; + ulonglong table_flags() const override; #else ha_oqgraph(TABLE *table); Table_flags table_flags() const; #endif virtual ~ha_oqgraph(); - const char *index_type(uint inx) + const char *index_type(uint inx) override { return "HASH"; } /* Rows also use a fixed-size format */ - enum row_type get_row_type() const { return ROW_TYPE_FIXED; } - ulong index_flags(uint inx, uint part, bool all_parts) const; + enum row_type get_row_type() const override { return ROW_TYPE_FIXED; } + ulong index_flags(uint inx, uint part, bool all_parts) const override; const char **bas_ext() const; - uint max_supported_keys() const { return MAX_KEY; } - uint max_supported_key_part_length() const { return MAX_KEY_LENGTH; } - double scan_time() { return (double) 1000000000; } - double read_time(uint index, uint ranges, ha_rows rows) + uint max_supported_keys() const override { return MAX_KEY; } + uint max_supported_key_part_length() const override { return MAX_KEY_LENGTH; } + double scan_time() override { return (double) 1000000000; } + double read_time(uint, uint, ha_rows) override { return 1; } // Doesn't make sense to change the engine on a virtual table. - virtual bool can_switch_engines() { return false; } + virtual bool can_switch_engines() override { return false; } - int open(const char *name, int mode, uint test_if_locked); - int close(void); - int write_row(const byte * buf); - int update_row(const uchar * old_data, const uchar * new_data); - int delete_row(const byte * buf); + int open(const char *name, int mode, uint test_if_locked) override; + int close(void) override; + int write_row(const byte * buf) override; + int update_row(const uchar * old_data, const uchar * new_data) override; + int delete_row(const byte * buf) override; int index_read(byte * buf, const byte * key, - uint key_len, enum ha_rkey_function find_flag); + uint key_len, enum ha_rkey_function find_flag) override; int index_read_idx(byte * buf, uint idx, const byte * key, uint key_len, enum ha_rkey_function find_flag); - int index_next_same(byte * buf, const byte * key, uint key_len); - int rnd_init(bool scan); - int rnd_next(byte *buf); - int rnd_pos(byte * buf, byte *pos); - void position(const byte *record); - int info(uint); - int extra(enum ha_extra_function operation); - int external_lock(THD *thd, int lock_type); - int delete_all_rows(void); + int index_next_same(byte * buf, const byte * key, uint key_len) override; + int rnd_init(bool scan) override; + int rnd_next(byte *buf) override; + int rnd_pos(byte * buf, byte *pos) override; + void position(const byte *record) override; + int info(uint) override; + int extra(enum ha_extra_function operation) override; + int external_lock(THD *thd, int lock_type) override; + int delete_all_rows(void) override; ha_rows records_in_range(uint inx, const key_range *min_key, - const key_range *max_key, page_range *pages); - int delete_table(const char *from); - int rename_table(const char * from, const char * to); - int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info); - void update_create_info(HA_CREATE_INFO *create_info); + const key_range *max_key, page_range *pages) override; + int delete_table(const char *from) override; + int rename_table(const char * from, const char * to) override; + int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) override; + void update_create_info(HA_CREATE_INFO *create_info) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); - int cmp_ref(const byte *ref1, const byte *ref2); + enum thr_lock_type lock_type) override; + int cmp_ref(const byte *ref1, const byte *ref2) override; - bool get_error_message(int error, String* buf); + bool get_error_message(int error, String* buf) override; void fprint_error(const char* fmt, ...); @@ -123,7 +123,7 @@ uint key_length, qc_engine_callback *engine_callback, - ulonglong *engine_data) + ulonglong *engine_data) override { /* Do not put data from OQGRAPH tables into query cache (because there diff -Nru mariadb-10.11.6/storage/perfschema/CMakeLists.txt mariadb-10.11.9/storage/perfschema/CMakeLists.txt --- mariadb-10.11.6/storage/perfschema/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -24,7 +24,7 @@ ${CMAKE_SOURCE_DIR}/sql ${CMAKE_BINARY_DIR}/sql ${CMAKE_CURRENT_BINARY_DIR} - ${PCRE_INCLUDES} + ${PCRE_INCLUDE_DIRS} ${SSL_INCLUDE_DIRS}) ADD_DEFINITIONS(-DMYSQL_SERVER) @@ -49,7 +49,6 @@ cursor_by_user.h pfs.h pfs_account.h -pfs_atomic.h pfs_buffer_container.h pfs_builtin_memory.h pfs_column_types.h diff -Nru mariadb-10.11.6/storage/perfschema/cursor_by_account.h mariadb-10.11.9/storage/perfschema/cursor_by_account.h --- mariadb-10.11.6/storage/perfschema/cursor_by_account.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/cursor_by_account.h 2024-08-03 07:29:59.000000000 +0000 @@ -43,9 +43,9 @@ public: static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: cursor_by_account(const PFS_engine_table_share *share); diff -Nru mariadb-10.11.6/storage/perfschema/cursor_by_host.h mariadb-10.11.9/storage/perfschema/cursor_by_host.h --- mariadb-10.11.6/storage/perfschema/cursor_by_host.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/cursor_by_host.h 2024-08-03 07:29:59.000000000 +0000 @@ -43,9 +43,9 @@ public: static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: cursor_by_host(const PFS_engine_table_share *share); diff -Nru mariadb-10.11.6/storage/perfschema/cursor_by_thread.h mariadb-10.11.9/storage/perfschema/cursor_by_thread.h --- mariadb-10.11.6/storage/perfschema/cursor_by_thread.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/cursor_by_thread.h 2024-08-03 07:29:59.000000000 +0000 @@ -43,9 +43,9 @@ public: static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: cursor_by_thread(const PFS_engine_table_share *share); diff -Nru mariadb-10.11.6/storage/perfschema/cursor_by_thread_connect_attr.h mariadb-10.11.9/storage/perfschema/cursor_by_thread_connect_attr.h --- mariadb-10.11.6/storage/perfschema/cursor_by_thread_connect_attr.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/cursor_by_thread_connect_attr.h 2024-08-03 07:29:59.000000000 +0000 @@ -62,9 +62,9 @@ public: static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: cursor_by_thread_connect_attr(const PFS_engine_table_share *share); diff -Nru mariadb-10.11.6/storage/perfschema/cursor_by_user.h mariadb-10.11.9/storage/perfschema/cursor_by_user.h --- mariadb-10.11.6/storage/perfschema/cursor_by_user.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/cursor_by_user.h 2024-08-03 07:29:59.000000000 +0000 @@ -43,9 +43,9 @@ public: static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: cursor_by_user(const PFS_engine_table_share *share); diff -Nru mariadb-10.11.6/storage/perfschema/ha_perfschema.cc mariadb-10.11.9/storage/perfschema/ha_perfschema.cc --- mariadb-10.11.6/storage/perfschema/ha_perfschema.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/ha_perfschema.cc 2024-08-03 07:29:59.000000000 +0000 @@ -133,7 +133,9 @@ DBUG_RETURN(0); } -static int show_func_mutex_instances_lost(THD *thd, SHOW_VAR *var, char *buff) +static int show_func_mutex_instances_lost(THD *thd, SHOW_VAR *var, void *buff, + struct system_status_var *status_var, + enum enum_var_type) { var->type= SHOW_LONG; var->value= buff; diff -Nru mariadb-10.11.6/storage/perfschema/ha_perfschema.h mariadb-10.11.9/storage/perfschema/ha_perfschema.h --- mariadb-10.11.6/storage/perfschema/ha_perfschema.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/ha_perfschema.h 2024-08-03 07:29:59.000000000 +0000 @@ -53,10 +53,10 @@ ~ha_perfschema(); - const char *index_type(uint) { return ""; } + const char *index_type(uint) override { return ""; } /** Capabilities of the performance schema tables. */ - ulonglong table_flags(void) const + ulonglong table_flags(void) const override { /* About HA_FAST_KEY_READ: @@ -86,25 +86,25 @@ Operations supported by indexes. None, there are no indexes. */ - ulong index_flags(uint , uint , bool ) const + ulong index_flags(uint , uint , bool ) const override { return 0; } - uint max_supported_record_length(void) const + uint max_supported_record_length(void) const override { return HA_MAX_REC_LENGTH; } - uint max_supported_keys(void) const + uint max_supported_keys(void) const override { return 0; } - uint max_supported_key_parts(void) const + uint max_supported_key_parts(void) const override { return 0; } - uint max_supported_key_length(void) const + uint max_supported_key_length(void) const override { return 0; } - ha_rows estimate_rows_upper_bound(void) + ha_rows estimate_rows_upper_bound(void) override { return HA_POS_ERROR; } - double scan_time(void) + double scan_time(void) override { return 1.0; } /** @@ -114,22 +114,22 @@ @param test_if_locked unused @return 0 on success */ - int open(const char *name, int mode, uint test_if_locked); + int open(const char *name, int mode, uint test_if_locked) override; /** Close a table handle. @sa open. */ - int close(void); + int close(void) override; /** Write a row. @param buf the row to write @return 0 on success */ - int write_row(const uchar *buf); + int write_row(const uchar *buf) override; - void use_hidden_primary_key(); + void use_hidden_primary_key() override; /** Update a row. @@ -137,29 +137,29 @@ @param new_data the row new values @return 0 on success */ - int update_row(const uchar *old_data, const uchar *new_data); + int update_row(const uchar *old_data, const uchar *new_data) override; /** Delete a row. @param buf the row to delete @return 0 on success */ - int delete_row(const uchar *buf); + int delete_row(const uchar *buf) override; - int rnd_init(bool scan); + int rnd_init(bool scan) override; /** Scan end. @sa rnd_init. */ - int rnd_end(void); + int rnd_end(void) override; /** Iterator, fetch the next row. @param[out] buf the row fetched. @return 0 on success */ - int rnd_next(uchar *buf); + int rnd_next(uchar *buf) override; /** Iterator, fetch the row at a given position. @@ -167,42 +167,42 @@ @param pos the row position @return 0 on success */ - int rnd_pos(uchar *buf, uchar *pos); + int rnd_pos(uchar *buf, uchar *pos) override; /** Read the row current position. @param record the current row */ - void position(const uchar *record); + void position(const uchar *record) override; - int info(uint); + int info(uint) override; - int delete_all_rows(void); + int delete_all_rows(void) override; - int truncate(); + int truncate() override; - int delete_table(const char *from); + int delete_table(const char *from) override; - int rename_table(const char * from, const char * to); + int rename_table(const char * from, const char * to) override; int create(const char *name, TABLE *form, - HA_CREATE_INFO *create_info); + HA_CREATE_INFO *create_info) override; THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type); + enum thr_lock_type lock_type) override; - virtual uint8 table_cache_type(void) + uint8 table_cache_type(void) override { return HA_CACHE_TBL_NOCACHE; } - virtual my_bool register_query_cache_table + my_bool register_query_cache_table (THD *, const char *, uint , qc_engine_callback *engine_callback, - ulonglong *) + ulonglong *) override { *engine_callback= 0; return FALSE; } - virtual void print_error(int error, myf errflags); + void print_error(int error, myf errflags) override; private: /** diff -Nru mariadb-10.11.6/storage/perfschema/pfs_account.cc mariadb-10.11.9/storage/perfschema/pfs_account.cc --- mariadb-10.11.6/storage/perfschema/pfs_account.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_account.cc 2024-08-03 07:29:59.000000000 +0000 @@ -666,7 +666,7 @@ : m_thread(thread) {} - virtual void operator()(PFS_account *pfs) + void operator()(PFS_account *pfs) override { PFS_user *user= sanitize_user(pfs->m_user); PFS_host *host= sanitize_host(pfs->m_host); @@ -699,7 +699,7 @@ : m_thread(thread) {} - virtual void operator()(PFS_account *pfs) + void operator()(PFS_account *pfs) override { if (pfs->m_username_length > 0 && pfs->m_hostname_length > 0) { diff -Nru mariadb-10.11.6/storage/perfschema/pfs_account.h mariadb-10.11.9/storage/perfschema/pfs_account.h --- mariadb-10.11.6/storage/perfschema/pfs_account.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_account.h 2024-08-03 07:29:59.000000000 +0000 @@ -27,6 +27,7 @@ @file storage/perfschema/pfs_account.h Performance schema account (declarations). */ +#include #include "pfs_lock.h" #include "lf.h" @@ -62,22 +63,22 @@ public: inline void init_refcount(void) { - PFS_atomic::store_32(& m_refcount, 1); + m_refcount.store(1); } inline int get_refcount(void) { - return PFS_atomic::load_32(& m_refcount); + return m_refcount.load(); } inline void inc_refcount(void) { - PFS_atomic::add_32(& m_refcount, 1); + m_refcount.fetch_add(1); } inline void dec_refcount(void) { - PFS_atomic::add_32(& m_refcount, -1); + m_refcount.fetch_sub(1); } void aggregate(bool alive, PFS_user *safe_user, PFS_host *safe_host); @@ -109,7 +110,7 @@ ulonglong m_disconnected_count; private: - int m_refcount; + std::atomic m_refcount; }; int init_account(const PFS_global_param *param); diff -Nru mariadb-10.11.6/storage/perfschema/pfs_atomic.h mariadb-10.11.9/storage/perfschema/pfs_atomic.h --- mariadb-10.11.6/storage/perfschema/pfs_atomic.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_atomic.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ -/* Copyright (c) 2009, 2023, Oracle and/or its affiliates. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License, version 2.0, - as published by the Free Software Foundation. - - This program is also distributed with certain software (including - but not limited to OpenSSL) that is licensed under separate terms, - as designated in a particular file or component or in included license - documentation. The authors of MySQL hereby grant you an additional - permission to link the program and your derivative works with the - separately licensed software that they have included with MySQL. - - 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, version 2.0, for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ - -#ifndef PFS_ATOMIC_H -#define PFS_ATOMIC_H - -/** - @file storage/perfschema/pfs_atomic.h - Atomic operations (declarations). -*/ - -#include - -/** Helper for atomic operations. */ -class PFS_atomic -{ -public: - /** Atomic load. */ - static inline int32 load_32(int32 *ptr) - { - return my_atomic_load32(ptr); - } - - /** Atomic load. */ - static inline int64 load_64(int64 *ptr) - { - return my_atomic_load64(ptr); - } - - /** Atomic load. */ - static inline uint32 load_u32(uint32 *ptr) - { - return (uint32) my_atomic_load32((int32*) ptr); - } - - /** Atomic load. */ - static inline uint64 load_u64(uint64 *ptr) - { - return (uint64) my_atomic_load64((int64*) ptr); - } - - /** Atomic store. */ - static inline void store_32(int32 *ptr, int32 value) - { - my_atomic_store32(ptr, value); - } - - /** Atomic store. */ - static inline void store_64(int64 *ptr, int64 value) - { - my_atomic_store64(ptr, value); - } - - /** Atomic store. */ - static inline void store_u32(uint32 *ptr, uint32 value) - { - my_atomic_store32((int32*) ptr, (int32) value); - } - - /** Atomic store. */ - static inline void store_u64(uint64 *ptr, uint64 value) - { - my_atomic_store64((int64*) ptr, (int64) value); - } - - /** Atomic add. */ - static inline int32 add_32(int32 *ptr, int32 value) - { - return my_atomic_add32(ptr, value); - } - - /** Atomic add. */ - static inline int64 add_64(int64 *ptr, int64 value) - { - return my_atomic_add64(ptr, value); - } - - /** Atomic add. */ - static inline uint32 add_u32(uint32 *ptr, uint32 value) - { - return (uint32) my_atomic_add32((int32*) ptr, (int32) value); - } - - /** Atomic add. */ - static inline uint64 add_u64(uint64 *ptr, uint64 value) - { - return (uint64) my_atomic_add64((int64*) ptr, (int64) value); - } - - /** Atomic compare and swap. */ - static inline bool cas_32(int32 *ptr, int32 *old_value, - int32 new_value) - { - return my_atomic_cas32(ptr, old_value, new_value); - } - - /** Atomic compare and swap. */ - static inline bool cas_64(int64 *ptr, int64 *old_value, - int64 new_value) - { - return my_atomic_cas64(ptr, old_value, new_value); - } - - /** Atomic compare and swap. */ - static inline bool cas_u32(uint32 *ptr, uint32 *old_value, - uint32 new_value) - { - return my_atomic_cas32((int32*) ptr, (int32*) old_value, - (uint32) new_value); - } - - /** Atomic compare and swap. */ - static inline bool cas_u64(uint64 *ptr, uint64 *old_value, - uint64 new_value) - { - return my_atomic_cas64((int64*) ptr, (int64*) old_value, - (uint64) new_value); - } -}; - -#endif - diff -Nru mariadb-10.11.6/storage/perfschema/pfs_buffer_container.h mariadb-10.11.9/storage/perfschema/pfs_buffer_container.h --- mariadb-10.11.6/storage/perfschema/pfs_buffer_container.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_buffer_container.h 2024-08-03 07:29:59.000000000 +0000 @@ -87,7 +87,7 @@ if (m_full) return NULL; - monotonic= PFS_atomic::add_u32(& m_monotonic.m_u32, 1); + monotonic= m_monotonic.m_u32.fetch_add(1); monotonic_max= monotonic + static_cast(m_max); while (monotonic < monotonic_max) @@ -99,7 +99,8 @@ { return pfs; } - monotonic= PFS_atomic::add_u32(& m_monotonic.m_u32, 1); + monotonic= m_monotonic.m_u32.fetch_add(1); + } m_full= true; @@ -517,7 +518,7 @@ ulong get_row_count() { - ulong page_count= PFS_atomic::load_u32(& m_max_page_index.m_u32); + ulong page_count= m_max_page_index.m_u32.load(); return page_count * PFS_PAGE_SIZE; } @@ -554,11 +555,11 @@ /* 1: Try to find an available record within the existing pages */ - current_page_count= PFS_atomic::load_u32(& m_max_page_index.m_u32); + current_page_count= m_max_page_index.m_u32.load(); if (current_page_count != 0) { - monotonic= PFS_atomic::load_u32(& m_monotonic.m_u32); + monotonic= m_monotonic.m_u32.load(); monotonic_max= monotonic + current_page_count; while (monotonic < monotonic_max) @@ -602,7 +603,7 @@ counter faster and then move on to the detection of new pages, in part 2: below. */ - monotonic= PFS_atomic::add_u32(& m_monotonic.m_u32, 1); + monotonic= m_monotonic.m_u32.fetch_add(1); }; } @@ -683,7 +684,7 @@ my_atomic_storeptr(typed_addr, ptr); /* Advertise the new page */ - PFS_atomic::add_u32(& m_max_page_index.m_u32, 1); + m_max_page_index.m_u32.fetch_add(1); } pthread_mutex_unlock(& m_critical_section); @@ -1084,8 +1085,7 @@ class PFS_buffer_processor { public: - virtual ~PFS_buffer_processor () - {} + virtual ~PFS_buffer_processor()= default; virtual void operator()(T *element) = 0; }; diff -Nru mariadb-10.11.6/storage/perfschema/pfs_digest.cc mariadb-10.11.9/storage/perfschema/pfs_digest.cc --- mariadb-10.11.6/storage/perfschema/pfs_digest.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_digest.cc 2024-08-03 07:29:59.000000000 +0000 @@ -76,7 +76,7 @@ */ digest_max= param->m_digest_sizing; digest_lost= 0; - PFS_atomic::store_u32(& digest_monotonic_index.m_u32, 1); + digest_monotonic_index.m_u32.store(1); digest_full= false; if (digest_max == 0) @@ -275,7 +275,7 @@ while (++attempts <= digest_max) { - safe_index= PFS_atomic::add_u32(& digest_monotonic_index.m_u32, 1) % digest_max; + safe_index= digest_monotonic_index.m_u32.fetch_add(1) % digest_max; if (safe_index == 0) { /* Record [0] is reserved. */ @@ -407,7 +407,7 @@ Reset index which indicates where the next calculated digest information to be inserted in statements_digest_stat_array. */ - PFS_atomic::store_u32(& digest_monotonic_index.m_u32, 1); + digest_monotonic_index.m_u32.store(1); digest_full= false; } diff -Nru mariadb-10.11.6/storage/perfschema/pfs_engine_table.cc mariadb-10.11.9/storage/perfschema/pfs_engine_table.cc --- mariadb-10.11.6/storage/perfschema/pfs_engine_table.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_engine_table.cc 2024-08-03 07:29:59.000000000 +0000 @@ -343,13 +343,13 @@ class PFS_silent_check_intact : public Table_check_intact { protected: - virtual void report_error(uint code, const char *fmt, ...) {} + void report_error(uint code, const char *fmt, ...) override {} public: PFS_silent_check_intact() {} - ~PFS_silent_check_intact() + ~PFS_silent_check_intact() override {} }; @@ -672,12 +672,12 @@ public: PFS_internal_schema_access() = default; - ~PFS_internal_schema_access() = default; + ~PFS_internal_schema_access() override = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + privilege_t *save_priv) const override; - const ACL_internal_table_access *lookup(const char *name) const; + const ACL_internal_table_access *lookup(const char *name) const override; }; ACL_internal_access_result diff -Nru mariadb-10.11.6/storage/perfschema/pfs_engine_table.h mariadb-10.11.9/storage/perfschema/pfs_engine_table.h --- mariadb-10.11.6/storage/perfschema/pfs_engine_table.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_engine_table.h 2024-08-03 07:29:59.000000000 +0000 @@ -340,8 +340,8 @@ ~PFS_readonly_acl() = default; - virtual ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + ACL_internal_access_result check(privilege_t want_access, + privilege_t *save_priv) const override; }; /** Singleton instance of PFS_readonly_acl. */ @@ -358,8 +358,8 @@ ~PFS_truncatable_acl() = default; - virtual ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + ACL_internal_access_result check(privilege_t want_access, + privilege_t *save_priv) const override; }; /** Singleton instance of PFS_truncatable_acl. */ @@ -377,7 +377,7 @@ ~PFS_updatable_acl() = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + privilege_t *save_priv) const override; }; /** Singleton instance of PFS_updatable_acl. */ @@ -395,7 +395,7 @@ ~PFS_editable_acl() = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + privilege_t *save_priv) const override; }; /** Singleton instance of PFS_editable_acl. */ @@ -412,7 +412,7 @@ ~PFS_unknown_acl() = default; ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + privilege_t *save_priv) const override; }; /** Singleton instance of PFS_unknown_acl. */ @@ -430,7 +430,7 @@ ~PFS_readonly_world_acl() {} - virtual ACL_internal_access_result check(privilege_t want_access, privilege_t *save_priv) const; + ACL_internal_access_result check(privilege_t want_access, privilege_t *save_priv) const override; }; @@ -449,7 +449,7 @@ ~PFS_truncatable_world_acl() {} - virtual ACL_internal_access_result check(privilege_t want_access, privilege_t *save_priv) const; + ACL_internal_access_result check(privilege_t want_access, privilege_t *save_priv) const override; }; @@ -468,8 +468,8 @@ ~PFS_readonly_processlist_acl() {} - virtual ACL_internal_access_result check(privilege_t want_access, - privilege_t *save_priv) const; + ACL_internal_access_result check(privilege_t want_access, + privilege_t *save_priv) const override; }; /** Singleton instance of PFS_readonly_processlist_acl */ diff -Nru mariadb-10.11.6/storage/perfschema/pfs_events_stages.cc mariadb-10.11.9/storage/perfschema/pfs_events_stages.cc --- mariadb-10.11.6/storage/perfschema/pfs_events_stages.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_events_stages.cc 2024-08-03 07:29:59.000000000 +0000 @@ -34,7 +34,6 @@ #include "pfs_host.h" #include "pfs_user.h" #include "pfs_events_stages.h" -#include "pfs_atomic.h" #include "pfs_buffer_container.h" #include "pfs_builtin_memory.h" #include "m_string.h" @@ -62,7 +61,7 @@ { events_stages_history_long_size= events_stages_history_long_sizing; events_stages_history_long_full= false; - PFS_atomic::store_u32(&events_stages_history_long_index.m_u32, 0); + events_stages_history_long_index.m_u32.store(0); if (events_stages_history_long_size == 0) return 0; @@ -135,7 +134,7 @@ assert(events_stages_history_long_array != NULL); - uint index= PFS_atomic::add_u32(&events_stages_history_long_index.m_u32, 1); + uint index= events_stages_history_long_index.m_u32.fetch_add(1); index= index % events_stages_history_long_size; if (index == 0) @@ -176,7 +175,7 @@ /** Reset table EVENTS_STAGES_HISTORY_LONG data. */ void reset_events_stages_history_long(void) { - PFS_atomic::store_u32(&events_stages_history_long_index.m_u32, 0); + events_stages_history_long_index.m_u32.store(0); events_stages_history_long_full= false; PFS_events_stages *pfs= events_stages_history_long_array; diff -Nru mariadb-10.11.6/storage/perfschema/pfs_events_statements.cc mariadb-10.11.9/storage/perfschema/pfs_events_statements.cc --- mariadb-10.11.6/storage/perfschema/pfs_events_statements.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_events_statements.cc 2024-08-03 07:29:59.000000000 +0000 @@ -34,7 +34,6 @@ #include "pfs_host.h" #include "pfs_user.h" #include "pfs_events_statements.h" -#include "pfs_atomic.h" #include "pfs_buffer_container.h" #include "pfs_builtin_memory.h" #include "m_string.h" @@ -64,7 +63,7 @@ { events_statements_history_long_size= events_statements_history_long_sizing; events_statements_history_long_full= false; - PFS_atomic::store_u32(&events_statements_history_long_index.m_u32, 0); + events_statements_history_long_index.m_u32.store(0); if (events_statements_history_long_size == 0) return 0; @@ -213,7 +212,7 @@ assert(events_statements_history_long_array != NULL); - uint index= PFS_atomic::add_u32(&events_statements_history_long_index.m_u32, 1); + uint index= events_statements_history_long_index.m_u32.fetch_add(1); index= index % events_statements_history_long_size; if (index == 0) @@ -258,7 +257,7 @@ /** Reset table EVENTS_STATEMENTS_HISTORY_LONG data. */ void reset_events_statements_history_long(void) { - PFS_atomic::store_u32(&events_statements_history_long_index.m_u32, 0); + events_statements_history_long_index.m_u32.store(0); events_statements_history_long_full= false; PFS_events_statements *pfs= events_statements_history_long_array; diff -Nru mariadb-10.11.6/storage/perfschema/pfs_events_transactions.cc mariadb-10.11.9/storage/perfschema/pfs_events_transactions.cc --- mariadb-10.11.6/storage/perfschema/pfs_events_transactions.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_events_transactions.cc 2024-08-03 07:29:59.000000000 +0000 @@ -34,7 +34,6 @@ #include "pfs_host.h" #include "pfs_user.h" #include "pfs_events_transactions.h" -#include "pfs_atomic.h" #include "pfs_buffer_container.h" #include "pfs_builtin_memory.h" #include "m_string.h" @@ -62,7 +61,7 @@ { events_transactions_history_long_size= events_transactions_history_long_sizing; events_transactions_history_long_full= false; - PFS_atomic::store_u32(&events_transactions_history_long_index.m_u32, 0); + events_transactions_history_long_index.m_u32.store(0); if (events_transactions_history_long_size == 0) return 0; @@ -135,7 +134,7 @@ assert(events_transactions_history_long_array != NULL); - uint index= PFS_atomic::add_u32(&events_transactions_history_long_index.m_u32, 1); + uint index= events_transactions_history_long_index.m_u32.fetch_add(1); index= index % events_transactions_history_long_size; if (index == 0) @@ -176,7 +175,7 @@ /** Reset table EVENTS_TRANSACTIONS_HISTORY_LONG data. */ void reset_events_transactions_history_long(void) { - PFS_atomic::store_u32(&events_transactions_history_long_index.m_u32, 0); + events_transactions_history_long_index.m_u32.store(0); events_transactions_history_long_full= false; PFS_events_transactions *pfs= events_transactions_history_long_array; diff -Nru mariadb-10.11.6/storage/perfschema/pfs_events_waits.cc mariadb-10.11.9/storage/perfschema/pfs_events_waits.cc --- mariadb-10.11.6/storage/perfschema/pfs_events_waits.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_events_waits.cc 2024-08-03 07:29:59.000000000 +0000 @@ -34,7 +34,6 @@ #include "pfs_host.h" #include "pfs_account.h" #include "pfs_events_waits.h" -#include "pfs_atomic.h" #include "pfs_buffer_container.h" #include "pfs_builtin_memory.h" #include "m_string.h" @@ -66,7 +65,7 @@ { events_waits_history_long_size= events_waits_history_long_sizing; events_waits_history_long_full= false; - PFS_atomic::store_u32(&events_waits_history_long_index.m_u32, 0); + events_waits_history_long_index.m_u32.store(0); if (events_waits_history_long_size == 0) return 0; @@ -135,7 +134,7 @@ if (unlikely(events_waits_history_long_size == 0)) return; - uint index= PFS_atomic::add_u32(&events_waits_history_long_index.m_u32, 1); + uint index= events_waits_history_long_index.m_u32.fetch_add(1); index= index % events_waits_history_long_size; if (index == 0) @@ -181,7 +180,7 @@ /** Reset table EVENTS_WAITS_HISTORY_LONG data. */ void reset_events_waits_history_long(void) { - PFS_atomic::store_u32(&events_waits_history_long_index.m_u32, 0); + events_waits_history_long_index.m_u32.store(0); events_waits_history_long_full= false; PFS_events_waits *wait= events_waits_history_long_array; diff -Nru mariadb-10.11.6/storage/perfschema/pfs_global.h mariadb-10.11.9/storage/perfschema/pfs_global.h --- mariadb-10.11.6/storage/perfschema/pfs_global.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_global.h 2024-08-03 07:29:59.000000000 +0000 @@ -24,6 +24,8 @@ #ifndef PFS_GLOBAL_H #define PFS_GLOBAL_H +#include + #include "my_compiler.h" /** @@ -44,7 +46,7 @@ */ struct PFS_cacheline_uint32 { - uint32 m_u32; + std::atomic m_u32; char m_full_cache_line[CPU_LEVEL1_DCACHE_LINESIZE - sizeof(uint32)]; PFS_cacheline_uint32() @@ -58,7 +60,7 @@ */ struct PFS_cacheline_uint64 { - uint64 m_u64; + std::atomic m_u64; char m_full_cache_line[CPU_LEVEL1_DCACHE_LINESIZE - sizeof(uint64)]; PFS_cacheline_uint64() diff -Nru mariadb-10.11.6/storage/perfschema/pfs_host.cc mariadb-10.11.9/storage/perfschema/pfs_host.cc --- mariadb-10.11.6/storage/perfschema/pfs_host.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_host.cc 2024-08-03 07:29:59.000000000 +0000 @@ -350,7 +350,7 @@ : m_thread(thread) {} - virtual void operator()(PFS_host *pfs) + void operator()(PFS_host *pfs) override { pfs->aggregate(true); if (pfs->get_refcount() == 0) diff -Nru mariadb-10.11.6/storage/perfschema/pfs_host.h mariadb-10.11.9/storage/perfschema/pfs_host.h --- mariadb-10.11.6/storage/perfschema/pfs_host.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_host.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,6 +28,8 @@ Performance schema host (declarations). */ +#include + #include "pfs_lock.h" #include "lf.h" #include "pfs_con_slice.h" @@ -58,22 +60,22 @@ public: inline void init_refcount(void) { - PFS_atomic::store_32(& m_refcount, 1); + m_refcount.store(1); } inline int get_refcount(void) { - return PFS_atomic::load_32(& m_refcount); + return m_refcount.load(); } inline void inc_refcount(void) { - PFS_atomic::add_32(& m_refcount, 1); + m_refcount.fetch_add(1); } inline void dec_refcount(void) { - PFS_atomic::add_32(& m_refcount, -1); + m_refcount.fetch_sub(1); } void aggregate(bool alive); @@ -97,7 +99,7 @@ ulonglong m_disconnected_count; private: - int m_refcount; + std::atomic m_refcount; }; int init_host(const PFS_global_param *param); diff -Nru mariadb-10.11.6/storage/perfschema/pfs_instr.cc mariadb-10.11.9/storage/perfschema/pfs_instr.cc --- mariadb-10.11.6/storage/perfschema/pfs_instr.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_instr.cc 2024-08-03 07:29:59.000000000 +0000 @@ -527,7 +527,7 @@ if (pfs != NULL) { pfs->m_thread_internal_id= - PFS_atomic::add_u64(&thread_internal_id_counter.m_u64, 1); + thread_internal_id_counter.m_u64.fetch_add(1); pfs->m_parent_thread_internal_id= 0; pfs->m_processlist_id= static_cast(processlist_id); pfs->m_thread_os_id= my_thread_os_id(); diff -Nru mariadb-10.11.6/storage/perfschema/pfs_instr_class.cc mariadb-10.11.9/storage/perfschema/pfs_instr_class.cc --- mariadb-10.11.6/storage/perfschema/pfs_instr_class.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_instr_class.cc 2024-08-03 07:29:59.000000000 +0000 @@ -25,6 +25,7 @@ @file storage/perfschema/pfs_instr_class.cc Performance schema instruments meta data (implementation). */ +#include #include "my_global.h" #include "my_sys.h" @@ -36,7 +37,6 @@ #include "pfs_timer.h" #include "pfs_events_waits.h" #include "pfs_setup_object.h" -#include "pfs_atomic.h" #include "pfs_program.h" #include "pfs_buffer_container.h" #include "mysql/psi/mysql_thread.h" @@ -55,7 +55,7 @@ Indicate if the performance schema is enabled. This flag is set at startup, and never changes. */ -my_bool pfs_enabled= TRUE; +my_bool pfs_enabled= FALSE; /** PFS_INSTRUMENT option settings array @@ -76,12 +76,12 @@ - the performance schema initialization - a plugin initialization */ -static uint32 mutex_class_dirty_count= 0; -static uint32 mutex_class_allocated_count= 0; -static uint32 rwlock_class_dirty_count= 0; -static uint32 rwlock_class_allocated_count= 0; -static uint32 cond_class_dirty_count= 0; -static uint32 cond_class_allocated_count= 0; +static std::atomic mutex_class_dirty_count(0); +static std::atomic mutex_class_allocated_count(0); +static std::atomic rwlock_class_dirty_count(0); +static std::atomic rwlock_class_allocated_count(0); +static std::atomic cond_class_dirty_count(0); +static std::atomic cond_class_allocated_count(0); /** Size of the mutex class array. @sa mutex_class_array */ ulong mutex_class_max= 0; @@ -137,8 +137,8 @@ - the performance schema initialization - a plugin initialization */ -static uint32 thread_class_dirty_count= 0; -static uint32 thread_class_allocated_count= 0; +static std::atomic thread_class_dirty_count(0); +static std::atomic thread_class_allocated_count(0); static PFS_thread_class *thread_class_array= NULL; @@ -185,28 +185,28 @@ /** True if table_share_hash is initialized. */ static bool table_share_hash_inited= false; -static uint32 file_class_dirty_count= 0; -static uint32 file_class_allocated_count= 0; +static std::atomic file_class_dirty_count(0); +static std::atomic file_class_allocated_count(0); PFS_file_class *file_class_array= NULL; -static uint32 stage_class_dirty_count= 0; -static uint32 stage_class_allocated_count= 0; +static std::atomic stage_class_dirty_count(0); +static std::atomic stage_class_allocated_count(0); static PFS_stage_class *stage_class_array= NULL; -static uint32 statement_class_dirty_count= 0; -static uint32 statement_class_allocated_count= 0; +static std::atomic statement_class_dirty_count(0); +static std::atomic statement_class_allocated_count(0); static PFS_statement_class *statement_class_array= NULL; -static uint32 socket_class_dirty_count= 0; -static uint32 socket_class_allocated_count= 0; +static std::atomic socket_class_dirty_count(0); +static std::atomic socket_class_allocated_count(0); static PFS_socket_class *socket_class_array= NULL; -static uint32 memory_class_dirty_count= 0; -static uint32 memory_class_allocated_count= 0; +static std::atomic memory_class_dirty_count(0); +static std::atomic memory_class_allocated_count(0); static PFS_memory_class *memory_class_array= NULL; @@ -1092,7 +1092,7 @@ mutex_class_dirty_count is incremented *before* an entry is added mutex_class_allocated_count is incremented *after* an entry is added */ - index= PFS_atomic::add_u32(&mutex_class_dirty_count, 1); + index= mutex_class_dirty_count.fetch_add(1); if (index < mutex_class_max) { @@ -1148,7 +1148,7 @@ empty/NULL/zero, but this won't cause a crash (mutex_class_array is initialized with MY_ZEROFILL). */ - PFS_atomic::add_u32(&mutex_class_allocated_count, 1); + mutex_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1178,7 +1178,7 @@ REGISTER_CLASS_BODY_PART(index, rwlock_class_array, rwlock_class_max, name, name_length) - index= PFS_atomic::add_u32(&rwlock_class_dirty_count, 1); + index= rwlock_class_dirty_count.fetch_add(1); if (index < rwlock_class_max) { @@ -1191,7 +1191,7 @@ entry->m_timed= false; /* Set user-defined configuration options for this instrument */ configure_instr_class(entry); - PFS_atomic::add_u32(&rwlock_class_allocated_count, 1); + rwlock_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1217,7 +1217,7 @@ REGISTER_CLASS_BODY_PART(index, cond_class_array, cond_class_max, name, name_length) - index= PFS_atomic::add_u32(&cond_class_dirty_count, 1); + index= cond_class_dirty_count.fetch_add(1); if (index < cond_class_max) { @@ -1229,7 +1229,7 @@ entry->m_timed= false; /* Set user-defined configuration options for this instrument */ configure_instr_class(entry); - PFS_atomic::add_u32(&cond_class_allocated_count, 1); + cond_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1311,7 +1311,7 @@ return (index + 1); } - index= PFS_atomic::add_u32(&thread_class_dirty_count, 1); + index= thread_class_dirty_count.fetch_add(1); if (index < thread_class_max) { @@ -1320,7 +1320,7 @@ strncpy(entry->m_name, name, name_length); entry->m_name_length= name_length; entry->m_enabled= true; - PFS_atomic::add_u32(&thread_class_allocated_count, 1); + thread_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1361,7 +1361,7 @@ REGISTER_CLASS_BODY_PART(index, file_class_array, file_class_max, name, name_length) - index= PFS_atomic::add_u32(&file_class_dirty_count, 1); + index= file_class_dirty_count.fetch_add(1); if (index < file_class_max) { @@ -1373,7 +1373,7 @@ entry->m_timed= true; /* Set user-defined configuration options for this instrument */ configure_instr_class(entry); - PFS_atomic::add_u32(&file_class_allocated_count, 1); + file_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1403,7 +1403,7 @@ REGISTER_CLASS_BODY_PART(index, stage_class_array, stage_class_max, name, name_length) - index= PFS_atomic::add_u32(&stage_class_dirty_count, 1); + index= stage_class_dirty_count.fetch_add(1); if (index < stage_class_max) { @@ -1427,7 +1427,7 @@ /* Set user-defined configuration options for this instrument */ configure_instr_class(entry); - PFS_atomic::add_u32(&stage_class_allocated_count, 1); + stage_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1454,7 +1454,7 @@ REGISTER_CLASS_BODY_PART(index, statement_class_array, statement_class_max, name, name_length) - index= PFS_atomic::add_u32(&statement_class_dirty_count, 1); + index= statement_class_dirty_count.fetch_add(1); if (index < statement_class_max) { @@ -1465,7 +1465,7 @@ entry->m_timed= true; /* Set user-defined configuration options for this instrument */ configure_instr_class(entry); - PFS_atomic::add_u32(&statement_class_allocated_count, 1); + statement_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1537,7 +1537,7 @@ REGISTER_CLASS_BODY_PART(index, socket_class_array, socket_class_max, name, name_length) - index= PFS_atomic::add_u32(&socket_class_dirty_count, 1); + index= socket_class_dirty_count.fetch_add(1); if (index < socket_class_max) { @@ -1549,7 +1549,7 @@ entry->m_timed= false; /* Set user-defined configuration options for this instrument */ configure_instr_class(entry); - PFS_atomic::add_u32(&socket_class_allocated_count, 1); + socket_class_allocated_count.fetch_add(1); return (index + 1); } @@ -1590,7 +1590,7 @@ REGISTER_CLASS_BODY_PART(index, memory_class_array, memory_class_max, name, name_length) - index= PFS_atomic::add_u32(&memory_class_dirty_count, 1); + index= memory_class_dirty_count.fetch_add(1); if (index < memory_class_max) { @@ -1601,7 +1601,7 @@ /* Set user-defined configuration options for this instrument */ configure_instr_class(entry); entry->m_timed= false; /* Immutable */ - PFS_atomic::add_u32(&memory_class_allocated_count, 1); + memory_class_allocated_count.fetch_add(1); return (index + 1); } @@ -2022,7 +2022,7 @@ : m_thread(thread) {} - virtual void operator()(PFS_table_share *pfs) + void operator()(PFS_table_share *pfs) override { pfs->refresh_setup_object_flags(m_thread); } @@ -2045,7 +2045,7 @@ : m_thread(thread) {} - virtual void operator()(PFS_program *pfs) + void operator()(PFS_program *pfs) override { pfs->refresh_setup_object_flags(m_thread); } diff -Nru mariadb-10.11.6/storage/perfschema/pfs_instr_class.h mariadb-10.11.9/storage/perfschema/pfs_instr_class.h --- mariadb-10.11.6/storage/perfschema/pfs_instr_class.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_instr_class.h 2024-08-03 07:29:59.000000000 +0000 @@ -23,11 +23,12 @@ #ifndef PFS_INSTR_CLASS_H #define PFS_INSTR_CLASS_H +#include + #include "my_global.h" #include "mysql_com.h" /* NAME_LEN */ #include "lf.h" #include "pfs_global.h" -#include "pfs_atomic.h" #include "sql_array.h" /** @@ -329,22 +330,22 @@ inline void init_refcount(void) { - PFS_atomic::store_32(& m_refcount, 1); + m_refcount.store(1); } inline int get_refcount(void) { - return PFS_atomic::load_32(& m_refcount); + return m_refcount.load(); } inline void inc_refcount(void) { - PFS_atomic::add_32(& m_refcount, 1); + m_refcount.fetch_add(1); } inline void dec_refcount(void) { - PFS_atomic::add_32(& m_refcount, -1); + m_refcount.fetch_sub(1); } void refresh_setup_object_flags(PFS_thread *thread); @@ -387,7 +388,7 @@ private: /** Number of opened table handles. */ - int m_refcount; + std::atomic m_refcount; /** Table locks statistics. */ PFS_table_share_lock *m_race_lock_stat; /** Table indexes' stats. */ diff -Nru mariadb-10.11.6/storage/perfschema/pfs_lock.h mariadb-10.11.9/storage/perfschema/pfs_lock.h --- mariadb-10.11.6/storage/perfschema/pfs_lock.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_lock.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,9 +28,9 @@ Performance schema internal locks (declarations). */ -#include "my_global.h" +#include -#include "pfs_atomic.h" +#include "my_global.h" /* to cause bugs, testing */ // #define MEM(X) std::memory_order_relaxed @@ -103,7 +103,7 @@ The version number is stored in the high 30 bits. The state is stored in the low 2 bits. */ - uint32 m_version_state; + std::atomic m_version_state; uint32 copy_version_state() { @@ -119,7 +119,7 @@ { uint32 copy; - copy= PFS_atomic::load_u32(&m_version_state); + copy= m_version_state.load(); return ((copy & STATE_MASK) == PFS_LOCK_FREE); } @@ -129,7 +129,7 @@ { uint32 copy; - copy= PFS_atomic::load_u32(&m_version_state); + copy= m_version_state.load(); return ((copy & STATE_MASK) == PFS_LOCK_ALLOCATED); } @@ -144,7 +144,7 @@ { uint32 old_val; - old_val= PFS_atomic::load_u32(&m_version_state); + old_val= m_version_state.load(); if ((old_val & STATE_MASK) != PFS_LOCK_FREE) { @@ -154,7 +154,7 @@ uint32 new_val= (old_val & VERSION_MASK) + PFS_LOCK_DIRTY; bool pass; - pass= PFS_atomic::cas_u32(&m_version_state, &old_val, new_val); + pass= m_version_state.compare_exchange_strong(old_val, new_val); if (pass) { @@ -178,7 +178,7 @@ uint32 new_val= (copy & VERSION_MASK) + PFS_LOCK_DIRTY; /* We own the record, no need to use compare and swap. */ - PFS_atomic::store_u32(&m_version_state, new_val); + m_version_state.store(new_val); copy_ptr->m_version_state= new_val; } @@ -195,7 +195,7 @@ /* Increment the version, set the ALLOCATED state */ uint32 new_val= (copy->m_version_state & VERSION_MASK) + VERSION_INC + PFS_LOCK_ALLOCATED; - PFS_atomic::store_u32(&m_version_state, new_val); + m_version_state.store(new_val); } /** @@ -210,7 +210,7 @@ /* Increment the version, set the ALLOCATED state */ uint32 new_val= (copy & VERSION_MASK) + VERSION_INC + PFS_LOCK_ALLOCATED; - PFS_atomic::store_u32(&m_version_state, new_val); + m_version_state.store(new_val); } /** @@ -219,10 +219,10 @@ void set_dirty(pfs_dirty_state *copy_ptr) { /* Do not set the version to 0, read the previous value. */ - uint32 copy= PFS_atomic::load_u32(&m_version_state); + uint32 copy= m_version_state.load(); /* Increment the version, set the DIRTY state */ uint32 new_val= (copy & VERSION_MASK) + VERSION_INC + PFS_LOCK_DIRTY; - PFS_atomic::store_u32(&m_version_state, new_val); + m_version_state.store(new_val); copy_ptr->m_version_state= new_val; } @@ -238,7 +238,7 @@ /* Keep the same version, set the FREE state */ uint32 new_val= (copy->m_version_state & VERSION_MASK) + PFS_LOCK_FREE; - PFS_atomic::store_u32(&m_version_state, new_val); + m_version_state.store(new_val); } /** @@ -258,7 +258,7 @@ /* Keep the same version, set the FREE state */ uint32 new_val= (copy & VERSION_MASK) + PFS_LOCK_FREE; - PFS_atomic::store_u32(&m_version_state, new_val); + m_version_state.store(new_val); } /** @@ -268,7 +268,7 @@ */ void begin_optimistic_lock(struct pfs_optimistic_state *copy) { - copy->m_version_state= PFS_atomic::load_u32(&m_version_state); + copy->m_version_state= m_version_state.load(); } /** @@ -285,7 +285,7 @@ if ((copy->m_version_state & STATE_MASK) != PFS_LOCK_ALLOCATED) return false; - version_state= PFS_atomic::load_u32(&m_version_state); + version_state= m_version_state.load(); /* Check the version + state has not changed. */ if (copy->m_version_state != version_state) @@ -298,7 +298,7 @@ { uint32 version_state; - version_state= PFS_atomic::load_u32(&m_version_state); + version_state= m_version_state.load(); return (version_state & VERSION_MASK); } diff -Nru mariadb-10.11.6/storage/perfschema/pfs_memory.cc mariadb-10.11.9/storage/perfschema/pfs_memory.cc --- mariadb-10.11.6/storage/perfschema/pfs_memory.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_memory.cc 2024-08-03 07:29:59.000000000 +0000 @@ -33,7 +33,6 @@ #include "pfs_account.h" #include "pfs_host.h" #include "pfs_user.h" -#include "pfs_atomic.h" #include "pfs_buffer_container.h" #include "m_string.h" diff -Nru mariadb-10.11.6/storage/perfschema/pfs_setup_actor.cc mariadb-10.11.9/storage/perfschema/pfs_setup_actor.cc --- mariadb-10.11.6/storage/perfschema/pfs_setup_actor.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_setup_actor.cc 2024-08-03 07:29:59.000000000 +0000 @@ -231,7 +231,7 @@ : m_pins(pins) {} - virtual void operator()(PFS_setup_actor *pfs) + void operator()(PFS_setup_actor *pfs) override { lf_hash_delete(&setup_actor_hash, m_pins, pfs->m_key.m_hash_key, pfs->m_key.m_key_length); diff -Nru mariadb-10.11.6/storage/perfschema/pfs_setup_object.cc mariadb-10.11.9/storage/perfschema/pfs_setup_object.cc --- mariadb-10.11.6/storage/perfschema/pfs_setup_object.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_setup_object.cc 2024-08-03 07:29:59.000000000 +0000 @@ -231,7 +231,7 @@ : m_pins(pins) {} - virtual void operator()(PFS_setup_object *pfs) + void operator()(PFS_setup_object *pfs) override { lf_hash_delete(&setup_object_hash, m_pins, pfs->m_key.m_hash_key, pfs->m_key.m_key_length); diff -Nru mariadb-10.11.6/storage/perfschema/pfs_status.cc mariadb-10.11.9/storage/perfschema/pfs_status.cc --- mariadb-10.11.6/storage/perfschema/pfs_status.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_status.cc 2024-08-03 07:29:59.000000000 +0000 @@ -34,7 +34,6 @@ #include "pfs_host.h" #include "pfs_user.h" #include "pfs_status.h" -#include "pfs_atomic.h" #include "pfs_buffer_container.h" #include "sql_show.h" /* reset_status_vars */ diff -Nru mariadb-10.11.6/storage/perfschema/pfs_user.cc mariadb-10.11.9/storage/perfschema/pfs_user.cc --- mariadb-10.11.6/storage/perfschema/pfs_user.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_user.cc 2024-08-03 07:29:59.000000000 +0000 @@ -314,7 +314,7 @@ : m_thread(thread) {} - virtual void operator()(PFS_user *pfs) + void operator()(PFS_user *pfs) override { pfs->aggregate(true); if (pfs->get_refcount() == 0) diff -Nru mariadb-10.11.6/storage/perfschema/pfs_user.h mariadb-10.11.9/storage/perfschema/pfs_user.h --- mariadb-10.11.6/storage/perfschema/pfs_user.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_user.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,6 +28,8 @@ Performance schema user (declarations). */ +#include + #include "pfs_lock.h" #include "lf.h" #include "pfs_con_slice.h" @@ -58,22 +60,22 @@ public: inline void init_refcount(void) { - PFS_atomic::store_32(& m_refcount, 1); + m_refcount.store(1); } inline int get_refcount(void) { - return PFS_atomic::load_32(& m_refcount); + return m_refcount.load(); } inline void inc_refcount(void) { - PFS_atomic::add_32(& m_refcount, 1); + m_refcount.fetch_add(1); } inline void dec_refcount(void) { - PFS_atomic::add_32(& m_refcount, -1); + m_refcount.fetch_sub(1); } void aggregate(bool alive); @@ -97,7 +99,7 @@ ulonglong m_disconnected_count; private: - int m_refcount; + std::atomic m_refcount; }; int init_user(const PFS_global_param *param); diff -Nru mariadb-10.11.6/storage/perfschema/pfs_variable.cc mariadb-10.11.9/storage/perfschema/pfs_variable.cc --- mariadb-10.11.6/storage/perfschema/pfs_variable.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_variable.cc 2024-08-03 07:29:59.000000000 +0000 @@ -66,7 +66,7 @@ case SHOW_SIMPLE_FUNC: case SHOW_UNDEF: default: - return SHOW_SCOPE_UNDEF; + return SHOW_SCOPE_ALL; } return SHOW_SCOPE_UNDEF; } @@ -254,7 +254,8 @@ } /* Release lock taken in get_THD(). */ - mysql_mutex_unlock(&m_safe_thd->LOCK_thd_data); + if (m_safe_thd != current_thd) + mysql_mutex_unlock(&m_safe_thd->LOCK_thd_kill); m_materialized= true; ret= 0; @@ -354,7 +355,8 @@ } /* Release lock taken in get_THD(). */ - mysql_mutex_unlock(&m_safe_thd->LOCK_thd_data); + if (m_safe_thd != current_thd) + mysql_mutex_unlock(&m_safe_thd->LOCK_thd_kill); m_materialized= true; ret= 0; @@ -407,7 +409,8 @@ } /* Release lock taken in get_THD(). */ - mysql_mutex_unlock(&m_safe_thd->LOCK_thd_data); + if (m_safe_thd != current_thd) + mysql_mutex_unlock(&m_safe_thd->LOCK_thd_kill); m_materialized= true; ret= 0; @@ -458,7 +461,8 @@ } /* Release lock taken in get_THD(). */ - mysql_mutex_unlock(&m_safe_thd->LOCK_thd_data); + if (m_safe_thd != current_thd) + mysql_mutex_unlock(&m_safe_thd->LOCK_thd_kill); m_materialized= true; ret= 0; @@ -716,6 +720,7 @@ case SHOW_CHAR_PTR: case SHOW_ARRAY: case SHOW_FUNC: + case SHOW_SIMPLE_FUNC: case SHOW_INT: case SHOW_LONG: case SHOW_LONGLONG: @@ -761,7 +766,7 @@ /** Build an array of SHOW_VARs from the global status array. Expand nested subarrays, filter unwanted variables. - NOTE: Must be done inside of LOCK_status to guard against plugin load/unload. + NOTE: Must be done under LOCK_all_status_vars */ bool PFS_status_variable_cache::init_show_var_array(enum_var_type scope, bool strict) { @@ -880,14 +885,12 @@ */ bool PFS_status_variable_cache::do_initialize_session(void) { - /* Acquire LOCK_status to guard against plugin load/unload. */ - //if (m_current_thd->fill_status_recursion_level++ == 0) - mysql_mutex_lock(&LOCK_status); + /* Acquire LOCK_all_status_vars to guard against plugin load/unload. */ + mysql_rwlock_rdlock(&LOCK_all_status_vars); bool ret= init_show_var_array(OPT_SESSION, true); - //if (m_current_thd->fill_status_recursion_level-- == 1) - mysql_mutex_unlock(&LOCK_status); + mysql_rwlock_unlock(&LOCK_all_status_vars); return ret; } @@ -916,13 +919,12 @@ m_materialized= false; DEBUG_SYNC(m_current_thd, "before_materialize_global_status_array"); - /* Acquire LOCK_status to guard against plugin load/unload. */ - //if (m_current_thd->fill_status_recursion_level++ == 0) - mysql_mutex_lock(&LOCK_status); + /* Acquire LOCK_all_status_vars to guard against plugin load/unload. */ + mysql_rwlock_rdlock(&LOCK_all_status_vars); /* - Build array of SHOW_VARs from global status array. Do this within - LOCK_status to ensure that the array remains unchanged during + Build array of SHOW_VARs from global status array. Do this under + LOCK_all_status_vars to ensure that the array remains unchanged during materialization. */ if (!m_external_init) @@ -945,8 +947,7 @@ */ manifest(m_current_thd, m_show_var_array.front(), &status_totals, "", false, true); - //if (m_current_thd->fill_status_recursion_level-- == 1) - mysql_mutex_unlock(&LOCK_status); + mysql_rwlock_unlock(&LOCK_all_status_vars); m_materialized= true; DEBUG_SYNC(m_current_thd, "after_materialize_global_status_array"); @@ -966,13 +967,11 @@ m_materialized= false; m_cache.clear(); - /* Avoid recursive acquisition of LOCK_status. */ - //if (m_current_thd->fill_status_recursion_level++ == 0) - mysql_mutex_lock(&LOCK_status); + mysql_rwlock_rdlock(&LOCK_all_status_vars); /* - Build array of SHOW_VARs from global status array. Do this within - LOCK_status to ensure that the array remains unchanged while this + Build array of SHOW_VARs from global status array. Do this under + LOCK_all_status_vars to ensure that the array remains unchanged while this thread is materialized. */ if (!m_external_init) @@ -989,14 +988,14 @@ manifest(m_safe_thd, m_show_var_array.front(), status_vars, "", false, false); /* Release lock taken in get_THD(). */ - mysql_mutex_unlock(&m_safe_thd->LOCK_thd_data); + if (m_safe_thd != current_thd) + mysql_mutex_unlock(&m_safe_thd->LOCK_thd_kill); m_materialized= true; ret= 0; } - //if (m_current_thd->fill_status_recursion_level-- == 1) - mysql_mutex_unlock(&LOCK_status); + mysql_rwlock_unlock(&LOCK_all_status_vars); return ret; } @@ -1012,13 +1011,11 @@ m_materialized= false; m_cache.clear(); - /* Avoid recursive acquisition of LOCK_status. */ - //if (m_current_thd->fill_status_recursion_level++ == 0) - mysql_mutex_lock(&LOCK_status); + mysql_rwlock_rdlock(&LOCK_all_status_vars); /* - Build array of SHOW_VARs from global status array. Do this within - LOCK_status to ensure that the array remains unchanged while this + Build array of SHOW_VARs from global status array. Do this under + LOCK_all_status_vars to ensure that the array remains unchanged while this thread is materialized. */ if (!m_external_init) @@ -1035,14 +1032,14 @@ manifest(m_safe_thd, m_show_var_array.front(), status_vars, "", false, true); /* Release lock taken in get_THD(). */ - mysql_mutex_unlock(&m_safe_thd->LOCK_thd_data); + if (m_safe_thd != current_thd) + mysql_mutex_unlock(&m_safe_thd->LOCK_thd_kill); m_materialized= true; ret= 0; } - //if (m_current_thd->fill_status_recursion_level-- == 1) - mysql_mutex_unlock(&LOCK_status); + mysql_rwlock_unlock(&LOCK_all_status_vars); return ret; } @@ -1059,9 +1056,8 @@ m_materialized= false; m_cache.clear(); - /* Acquire LOCK_status to guard against plugin load/unload. */ - //if (m_current_thd->fill_status_recursion_level++ == 0) - mysql_mutex_lock(&LOCK_status); + /* Acquire LOCK_all_status_vars to guard against plugin load/unload. */ + mysql_rwlock_rdlock(&LOCK_all_status_vars); /* The SHOW_VAR array must be initialized externally. */ assert(m_initialized); @@ -1077,14 +1073,14 @@ manifest(m_safe_thd, m_show_var_array.front(), status_vars, "", false, true); /* Release lock taken in get_THD(). */ - mysql_mutex_unlock(&m_safe_thd->LOCK_thd_data); + if (m_safe_thd != current_thd) + mysql_mutex_unlock(&m_safe_thd->LOCK_thd_kill); m_materialized= true; ret= 0; } - //if (m_current_thd->fill_status_recursion_level-- == 1) - mysql_mutex_unlock(&LOCK_status); + mysql_rwlock_unlock(&LOCK_all_status_vars); return ret; } @@ -1103,9 +1099,8 @@ m_materialized= false; m_cache.clear(); - /* Acquire LOCK_status to guard against plugin load/unload. */ - //if (m_current_thd->fill_status_recursion_level++ == 0) - mysql_mutex_lock(&LOCK_status); + /* Acquire LOCK_all_status_vars to guard against plugin load/unload. */ + mysql_rwlock_rdlock(&LOCK_all_status_vars); /* The SHOW_VAR array must be initialized externally. */ assert(m_initialized); @@ -1122,8 +1117,7 @@ */ manifest(m_current_thd, m_show_var_array.front(), &status_totals, "", false, true); - //if (m_current_thd->fill_status_recursion_level-- == 1) - mysql_mutex_unlock(&LOCK_status); + mysql_rwlock_unlock(&LOCK_all_status_vars); m_materialized= true; return 0; @@ -1152,16 +1146,19 @@ reevaluate the new SHOW_TYPE and value. Handle nested case where SHOW_FUNC resolves to another SHOW_FUNC. */ - if (show_var_ptr->type == SHOW_FUNC) + if (show_var_ptr->type == SHOW_FUNC || show_var_ptr->type == SHOW_SIMPLE_FUNC) { show_var_tmp= *show_var_ptr; /* Execute the function reference in show_var_tmp->value, which returns show_var_tmp with a new type and new value. */ - for (const SHOW_VAR *var= show_var_ptr; var->type == SHOW_FUNC; var= &show_var_tmp) + for (const SHOW_VAR *var= show_var_ptr; + var->type == SHOW_FUNC || var->type == SHOW_SIMPLE_FUNC; + var= &show_var_tmp) { - ((mysql_show_var_func)(var->value))(thd, &show_var_tmp, value_buf.data, NULL, m_query_scope); + ((mysql_show_var_func)(var->value))(thd, &show_var_tmp, value_buf.data, + &thd->status_var, m_query_scope); } show_var_ptr= &show_var_tmp; } @@ -1213,7 +1210,7 @@ /** Resolve status value, convert to string. show_var->value is an offset into status_vars. - NOTE: Assumes LOCK_status is held. + NOTE: Assumes LOCK_all_status_vars is held. */ void Status_variable::init(const SHOW_VAR *show_var, STATUS_VAR *status_vars, enum_var_type query_scope) { @@ -1279,7 +1276,7 @@ /** Reset aggregated status counter stats for account, user and host. - NOTE: Assumes LOCK_status is held. + NOTE: Assumes LOCK_all_status_vars is held. */ void reset_pfs_status_stats() { diff -Nru mariadb-10.11.6/storage/perfschema/pfs_variable.h mariadb-10.11.9/storage/perfschema/pfs_variable.h --- mariadb-10.11.6/storage/perfschema/pfs_variable.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_variable.h 2024-08-03 07:29:59.000000000 +0000 @@ -205,14 +205,18 @@ Find_THD_variable() : m_unsafe_thd(NULL) {} Find_THD_variable(THD *unsafe_thd) : m_unsafe_thd(unsafe_thd) {} - virtual bool operator()(THD *thd) + bool operator()(THD *thd) override { //TODO: filter bg threads? if (thd != m_unsafe_thd) return false; - /* Hold this lock to keep THD during materialization. */ - mysql_mutex_lock(&thd->LOCK_thd_data); + /* + Hold this lock to keep THD during materialization. + But don't lock current_thd (to be able to use set_killed() later + */ + if (thd != current_thd) + mysql_mutex_lock(&thd->LOCK_thd_kill); return true; } void set_unsafe_thd(THD *unsafe_thd) { m_unsafe_thd= unsafe_thd; } @@ -608,18 +612,18 @@ private: /* Build SHOW_var array. */ bool init_show_var_array(enum_var_type scope, bool strict); - bool do_initialize_session(void); + bool do_initialize_session(void) override; /* Global */ - int do_materialize_global(void); + int do_materialize_global(void) override; /* Global and Session - THD */ - int do_materialize_all(THD* thd); + int do_materialize_all(THD* thd) override; /* Session - THD */ - int do_materialize_session(THD* thd); + int do_materialize_session(THD* thd) override; /* Session - PFS_thread */ - int do_materialize_session(PFS_thread *thread); + int do_materialize_session(PFS_thread *thread) override; /* Single variable - PFS_thread */ - int do_materialize_session(PFS_thread *pfs_thread, uint index); + int do_materialize_session(PFS_thread *pfs_thread, uint index) override; /* Temporary mem_root to use for materialization. */ MEM_ROOT m_mem_sysvar; @@ -660,14 +664,14 @@ bool m_show_command; private: - bool do_initialize_session(void); + bool do_initialize_session(void) override; - int do_materialize_global(void); + int do_materialize_global(void) override; /* Global and Session - THD */ - int do_materialize_all(THD* thd); - int do_materialize_session(THD *thd); - int do_materialize_session(PFS_thread *thread); - int do_materialize_session(PFS_thread *thread, uint index) { return 0; } + int do_materialize_all(THD* thd) override; + int do_materialize_session(THD *thd) override; + int do_materialize_session(PFS_thread *thread) override; + int do_materialize_session(PFS_thread *thread, uint index) override { return 0; } int do_materialize_client(PFS_client *pfs_client); /* Callback to sum user, host or account status variables. */ diff -Nru mariadb-10.11.6/storage/perfschema/pfs_visitor.cc mariadb-10.11.9/storage/perfschema/pfs_visitor.cc --- mariadb-10.11.6/storage/perfschema/pfs_visitor.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_visitor.cc 2024-08-03 07:29:59.000000000 +0000 @@ -49,7 +49,7 @@ : m_visitor(visitor) {} - virtual void operator()(THD *thd) + void operator()(THD *thd) override { m_visitor->visit_THD(thd); } @@ -132,7 +132,7 @@ : m_visitor(visitor), m_host(host) {} - virtual void operator()(THD *thd) + void operator()(THD *thd) override { PSI_thread *psi= thd->get_psi(); PFS_thread *pfs= reinterpret_cast(psi); @@ -221,7 +221,7 @@ : m_visitor(visitor), m_user(user) {} - virtual void operator()(THD *thd) + void operator()(THD *thd) override { PSI_thread *psi= thd->get_psi(); PFS_thread *pfs= reinterpret_cast(psi); @@ -310,7 +310,7 @@ : m_visitor(visitor), m_account(account) {} - virtual void operator()(THD *thd) + void operator()(THD *thd) override { PSI_thread *psi= thd->get_psi(); PFS_thread *pfs= reinterpret_cast(psi); @@ -752,7 +752,7 @@ : m_visitor(visitor) {} - virtual void operator()(PFS_table_share *pfs) + void operator()(PFS_table_share *pfs) override { if (pfs->m_enabled) { @@ -772,7 +772,7 @@ : m_visitor(visitor) {} - virtual void operator()(PFS_table *pfs) + void operator()(PFS_table *pfs) override { PFS_table_share *safe_share= sanitize_table_share(pfs->m_share); if (safe_share != NULL) @@ -811,7 +811,7 @@ : m_visitor(visitor), m_share(share) {} - virtual void operator()(PFS_table *pfs) + void operator()(PFS_table *pfs) override { if (pfs->m_share == m_share) { @@ -852,7 +852,7 @@ : m_visitor(visitor), m_share(share), m_index(index) {} - virtual void operator()(PFS_table *pfs) + void operator()(PFS_table *pfs) override { if (pfs->m_share == m_share) { @@ -1356,8 +1356,7 @@ /** Aggregate from global status. */ void PFS_connection_status_visitor::visit_global() { - /* NOTE: Requires lock on LOCK_status. */ - mysql_mutex_assert_owner(&LOCK_status); + /* NOTE: Requires lock on LOCK_all_status_vars. */ add_to_status(m_status_vars, &global_status_var); } diff -Nru mariadb-10.11.6/storage/perfschema/pfs_visitor.h mariadb-10.11.9/storage/perfschema/pfs_visitor.h --- mariadb-10.11.6/storage/perfschema/pfs_visitor.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/pfs_visitor.h 2024-08-03 07:29:59.000000000 +0000 @@ -314,11 +314,11 @@ /** Constructor. */ PFS_connection_wait_visitor(PFS_instr_class *klass); virtual ~PFS_connection_wait_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** EVENT_NAME instrument index. */ uint m_index; @@ -336,11 +336,11 @@ /** Constructor. */ PFS_connection_all_wait_visitor(); virtual ~PFS_connection_all_wait_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** Wait statistic collected. */ PFS_single_stat m_stat; @@ -359,11 +359,11 @@ /** Constructor. */ PFS_connection_stage_visitor(PFS_stage_class *klass); virtual ~PFS_connection_stage_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** EVENT_NAME instrument index. */ uint m_index; @@ -381,11 +381,11 @@ /** Constructor. */ PFS_connection_statement_visitor(PFS_statement_class *klass); virtual ~PFS_connection_statement_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** EVENT_NAME instrument index. */ uint m_index; @@ -403,11 +403,11 @@ /** Constructor. */ PFS_connection_all_statement_visitor(); virtual ~PFS_connection_all_statement_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** Statement statistic collected. */ PFS_statement_stat m_stat; @@ -426,11 +426,11 @@ /** Constructor. */ PFS_connection_transaction_visitor(PFS_transaction_class *klass); virtual ~PFS_connection_transaction_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** EVENT_NAME instrument index. */ uint m_index; @@ -450,11 +450,11 @@ /** Constructor. */ PFS_connection_all_transaction_visitor(); virtual ~PFS_connection_all_transaction_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** Statement statistic collected. */ PFS_transaction_stat m_stat; @@ -474,11 +474,11 @@ /** Constructor. */ PFS_connection_stat_visitor(); virtual ~PFS_connection_stat_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** Connection statistic collected. */ PFS_connection_stat m_stat; @@ -494,11 +494,11 @@ /** Constructor. */ PFS_connection_memory_visitor(PFS_memory_class *klass); virtual ~PFS_connection_memory_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; /** EVENT_NAME instrument index. */ uint m_index; @@ -516,12 +516,12 @@ /** Constructor. */ PFS_connection_status_visitor(STATUS_VAR *status_vars); virtual ~PFS_connection_status_visitor(); - virtual void visit_global(); - virtual void visit_host(PFS_host *pfs); - virtual void visit_account(PFS_account *pfs); - virtual void visit_user(PFS_user *pfs); - virtual void visit_thread(PFS_thread *pfs); - virtual void visit_THD(THD *thd); + void visit_global() override; + void visit_host(PFS_host *pfs) override; + void visit_account(PFS_account *pfs) override; + void visit_user(PFS_user *pfs) override; + void visit_thread(PFS_thread *pfs) override; + void visit_THD(THD *thd) override; private: STATUS_VAR *m_status_vars; @@ -536,16 +536,16 @@ public: PFS_instance_wait_visitor(); virtual ~PFS_instance_wait_visitor(); - virtual void visit_mutex_class(PFS_mutex_class *pfs); - virtual void visit_rwlock_class(PFS_rwlock_class *pfs); - virtual void visit_cond_class(PFS_cond_class *pfs); - virtual void visit_file_class(PFS_file_class *pfs); - virtual void visit_socket_class(PFS_socket_class *pfs); - virtual void visit_mutex(PFS_mutex *pfs); - virtual void visit_rwlock(PFS_rwlock *pfs); - virtual void visit_cond(PFS_cond *pfs); - virtual void visit_file(PFS_file *pfs); - virtual void visit_socket(PFS_socket *pfs); + void visit_mutex_class(PFS_mutex_class *pfs) override; + void visit_rwlock_class(PFS_rwlock_class *pfs) override; + void visit_cond_class(PFS_cond_class *pfs) override; + void visit_file_class(PFS_file_class *pfs) override; + void visit_socket_class(PFS_socket_class *pfs) override; + void visit_mutex(PFS_mutex *pfs) override; + void visit_rwlock(PFS_rwlock *pfs) override; + void visit_cond(PFS_cond *pfs) override; + void visit_file(PFS_file *pfs) override; + void visit_socket(PFS_socket *pfs) override; /** Wait statistic collected. */ PFS_single_stat m_stat; @@ -560,9 +560,9 @@ public: PFS_object_wait_visitor(); virtual ~PFS_object_wait_visitor(); - virtual void visit_global(); - virtual void visit_table_share(PFS_table_share *pfs); - virtual void visit_table(PFS_table *pfs); + void visit_global() override; + void visit_table_share(PFS_table_share *pfs) override; + void visit_table(PFS_table *pfs) override; /** Object wait statistic collected. */ PFS_single_stat m_stat; @@ -577,9 +577,9 @@ public: PFS_table_io_wait_visitor(); virtual ~PFS_table_io_wait_visitor(); - virtual void visit_global(); - virtual void visit_table_share(PFS_table_share *pfs); - virtual void visit_table(PFS_table *pfs); + void visit_global() override; + void visit_table_share(PFS_table_share *pfs) override; + void visit_table(PFS_table *pfs) override; /** Table io wait statistic collected. */ PFS_single_stat m_stat; @@ -594,8 +594,8 @@ public: PFS_table_io_stat_visitor(); virtual ~PFS_table_io_stat_visitor(); - virtual void visit_table_share(PFS_table_share *pfs); - virtual void visit_table(PFS_table *pfs); + void visit_table_share(PFS_table_share *pfs) override; + void visit_table(PFS_table *pfs) override; /** Table io statistic collected. */ PFS_table_io_stat m_stat; @@ -610,8 +610,8 @@ public: PFS_index_io_stat_visitor(); virtual ~PFS_index_io_stat_visitor(); - virtual void visit_table_share_index(PFS_table_share *pfs, uint index); - virtual void visit_table_index(PFS_table *pfs, uint index); + void visit_table_share_index(PFS_table_share *pfs, uint index) override; + void visit_table_index(PFS_table *pfs, uint index) override; /** Index io statistic collected. */ PFS_table_io_stat m_stat; @@ -626,9 +626,9 @@ public: PFS_table_lock_wait_visitor(); virtual ~PFS_table_lock_wait_visitor(); - virtual void visit_global(); - virtual void visit_table_share(PFS_table_share *pfs); - virtual void visit_table(PFS_table *pfs); + void visit_global() override; + void visit_table_share(PFS_table_share *pfs) override; + void visit_table(PFS_table *pfs) override; /** Table lock wait statistic collected. */ PFS_single_stat m_stat; @@ -643,8 +643,8 @@ public: PFS_table_lock_stat_visitor(); virtual ~PFS_table_lock_stat_visitor(); - virtual void visit_table_share(PFS_table_share *pfs); - virtual void visit_table(PFS_table *pfs); + void visit_table_share(PFS_table_share *pfs) override; + void visit_table(PFS_table *pfs) override; /** Table lock statistic collected. */ PFS_table_lock_stat m_stat; @@ -659,8 +659,8 @@ public: PFS_instance_socket_io_stat_visitor(); virtual ~PFS_instance_socket_io_stat_visitor(); - virtual void visit_socket_class(PFS_socket_class *pfs); - virtual void visit_socket(PFS_socket *pfs); + void visit_socket_class(PFS_socket_class *pfs) override; + void visit_socket(PFS_socket *pfs) override; /** Wait and byte count statistics collected. */ PFS_socket_io_stat m_socket_io_stat; @@ -675,8 +675,8 @@ public: PFS_instance_file_io_stat_visitor(); virtual ~PFS_instance_file_io_stat_visitor(); - virtual void visit_file_class(PFS_file_class *pfs); - virtual void visit_file(PFS_file *pfs); + void visit_file_class(PFS_file_class *pfs) override; + void visit_file(PFS_file *pfs) override; /** Wait and byte count statistics collected. */ PFS_file_io_stat m_file_io_stat; diff -Nru mariadb-10.11.6/storage/perfschema/table_accounts.h mariadb-10.11.9/storage/perfschema/table_accounts.h --- mariadb-10.11.6/storage/perfschema/table_accounts.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_accounts.h 2024-08-03 07:29:59.000000000 +0000 @@ -57,10 +57,10 @@ static int delete_all_rows(); protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; protected: @@ -70,7 +70,7 @@ ~table_accounts() = default; private: - virtual void make_row(PFS_account *pfs); + void make_row(PFS_account *pfs) override; /** Table share lock. */ static THR_LOCK m_table_lock; diff -Nru mariadb-10.11.6/storage/perfschema/table_all_instr.h mariadb-10.11.9/storage/perfschema/table_all_instr.h --- mariadb-10.11.6/storage/perfschema/table_all_instr.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_all_instr.h 2024-08-03 07:29:59.000000000 +0000 @@ -76,9 +76,9 @@ public: static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_all_instr(const PFS_engine_table_share *share); diff -Nru mariadb-10.11.6/storage/perfschema/table_esgs_by_account_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esgs_by_account_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esgs_by_account_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esgs_by_account_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,16 +91,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esgs_by_account_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esgs_by_host_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esgs_by_host_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esgs_by_host_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esgs_by_host_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,16 +91,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esgs_by_host_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esgs_by_thread_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esgs_by_thread_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esgs_by_thread_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esgs_by_thread_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -95,16 +95,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esgs_by_thread_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esgs_by_user_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esgs_by_user_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esgs_by_user_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esgs_by_user_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -96,16 +96,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esgs_by_user_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esgs_global_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esgs_global_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esgs_global_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esgs_global_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -62,16 +62,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esgs_global_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esms_by_account_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esms_by_account_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esms_by_account_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esms_by_account_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,16 +91,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esms_by_account_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esms_by_digest.h mariadb-10.11.9/storage/perfschema/table_esms_by_digest.h --- mariadb-10.11.6/storage/perfschema/table_esms_by_digest.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esms_by_digest.h 2024-08-03 07:29:59.000000000 +0000 @@ -65,15 +65,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esms_by_digest(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esms_by_host_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esms_by_host_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esms_by_host_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esms_by_host_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,16 +91,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esms_by_host_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esms_by_program.h mariadb-10.11.9/storage/perfschema/table_esms_by_program.h --- mariadb-10.11.6/storage/perfschema/table_esms_by_program.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esms_by_program.h 2024-08-03 07:29:59.000000000 +0000 @@ -75,15 +75,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esms_by_program(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esms_by_thread_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esms_by_thread_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esms_by_thread_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esms_by_thread_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -95,16 +95,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esms_by_thread_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esms_by_user_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esms_by_user_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esms_by_user_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esms_by_user_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,16 +91,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esms_by_user_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_esms_global_by_event_name.h mariadb-10.11.9/storage/perfschema/table_esms_global_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_esms_global_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_esms_global_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -62,16 +62,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_esms_global_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ets_by_account_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ets_by_account_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ets_by_account_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ets_by_account_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -95,16 +95,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ets_by_account_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ets_by_host_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ets_by_host_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ets_by_host_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ets_by_host_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -95,16 +95,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ets_by_host_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ets_by_thread_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ets_by_thread_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ets_by_thread_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ets_by_thread_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -99,16 +99,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ets_by_thread_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ets_by_user_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ets_by_user_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ets_by_user_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ets_by_user_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -95,16 +95,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ets_by_user_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ets_global_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ets_global_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ets_global_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ets_global_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -66,16 +66,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ets_global_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_events_stages.h mariadb-10.11.9/storage/perfschema/table_events_stages.h --- mariadb-10.11.6/storage/perfschema/table_events_stages.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_events_stages.h 2024-08-03 07:29:59.000000000 +0000 @@ -100,10 +100,10 @@ class table_events_stages_common : public PFS_engine_table { protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_events_stages_common(const PFS_engine_table_share *share, void *pos); @@ -128,10 +128,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_stages_current(); @@ -163,10 +163,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_stages_history(); @@ -195,10 +195,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_stages_history_long(); diff -Nru mariadb-10.11.6/storage/perfschema/table_events_statements.h mariadb-10.11.9/storage/perfschema/table_events_statements.h --- mariadb-10.11.6/storage/perfschema/table_events_statements.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_events_statements.h 2024-08-03 07:29:59.000000000 +0000 @@ -183,10 +183,10 @@ class table_events_statements_common : public PFS_engine_table { protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_events_statements_common(const PFS_engine_table_share *share, void *pos); @@ -215,10 +215,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_statements_current(); @@ -252,10 +252,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_statements_history(); @@ -286,10 +286,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_statements_history_long(); diff -Nru mariadb-10.11.6/storage/perfschema/table_events_transactions.h mariadb-10.11.9/storage/perfschema/table_events_transactions.h --- mariadb-10.11.6/storage/perfschema/table_events_transactions.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_events_transactions.h 2024-08-03 07:29:59.000000000 +0000 @@ -127,10 +127,10 @@ class table_events_transactions_common : public PFS_engine_table { protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_events_transactions_common(const PFS_engine_table_share *share, void *pos); @@ -156,10 +156,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_transactions_current(); @@ -198,10 +198,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_transactions_history(); @@ -231,10 +231,10 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_transactions_history_long(); diff -Nru mariadb-10.11.6/storage/perfschema/table_events_waits.h mariadb-10.11.9/storage/perfschema/table_events_waits.h --- mariadb-10.11.6/storage/perfschema/table_events_waits.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_events_waits.h 2024-08-03 07:29:59.000000000 +0000 @@ -139,10 +139,10 @@ class table_events_waits_common : public PFS_engine_table { protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_events_waits_common(const PFS_engine_table_share *share, void *pos); @@ -173,9 +173,9 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_waits_current(); @@ -209,9 +209,9 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: table_events_waits_history(); @@ -242,9 +242,9 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override;; protected: table_events_waits_history_long(); diff -Nru mariadb-10.11.6/storage/perfschema/table_events_waits_summary.h mariadb-10.11.9/storage/perfschema/table_events_waits_summary.h --- mariadb-10.11.6/storage/perfschema/table_events_waits_summary.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_events_waits_summary.h 2024-08-03 07:29:59.000000000 +0000 @@ -67,16 +67,16 @@ void make_instr_row(PFS_instr *pfs, PFS_instr_class *klass, const void *object_instance_begin, PFS_single_stat *pfs_stat); - virtual void make_mutex_row(PFS_mutex *pfs); - virtual void make_rwlock_row(PFS_rwlock *pfs); - virtual void make_cond_row(PFS_cond *pfs); - virtual void make_file_row(PFS_file *pfs); - virtual void make_socket_row(PFS_socket *pfs); + void make_mutex_row(PFS_mutex *pfs) override; + void make_rwlock_row(PFS_rwlock *pfs) override; + void make_cond_row(PFS_cond *pfs) override; + void make_file_row(PFS_file *pfs) override; + void make_socket_row(PFS_socket *pfs) override; - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_events_waits_summary_by_instance(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ews_by_account_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ews_by_account_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ews_by_account_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ews_by_account_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -103,15 +103,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ews_by_account_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ews_by_host_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ews_by_host_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ews_by_host_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ews_by_host_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -103,15 +103,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ews_by_host_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ews_by_thread_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ews_by_thread_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ews_by_thread_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ews_by_thread_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -102,15 +102,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ews_by_thread_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ews_by_user_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ews_by_user_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ews_by_user_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ews_by_user_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -103,15 +103,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ews_by_user_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_ews_global_by_event_name.h mariadb-10.11.9/storage/perfschema/table_ews_global_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_ews_global_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_ews_global_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,15 +91,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_ews_global_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_file_instances.h mariadb-10.11.9/storage/perfschema/table_file_instances.h --- mariadb-10.11.6/storage/perfschema/table_file_instances.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_file_instances.h 2024-08-03 07:29:59.000000000 +0000 @@ -61,15 +61,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_file_instances(); diff -Nru mariadb-10.11.6/storage/perfschema/table_file_summary_by_event_name.h mariadb-10.11.9/storage/perfschema/table_file_summary_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_file_summary_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_file_summary_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -62,15 +62,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_file_summary_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_file_summary_by_instance.h mariadb-10.11.9/storage/perfschema/table_file_summary_by_instance.h --- mariadb-10.11.6/storage/perfschema/table_file_summary_by_instance.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_file_summary_by_instance.h 2024-08-03 07:29:59.000000000 +0000 @@ -70,15 +70,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_file_summary_by_instance(); diff -Nru mariadb-10.11.6/storage/perfschema/table_global_status.h mariadb-10.11.9/storage/perfschema/table_global_status.h --- mariadb-10.11.6/storage/perfschema/table_global_status.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_global_status.h 2024-08-03 07:29:59.000000000 +0000 @@ -75,16 +75,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_global_status(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_global_variables.h mariadb-10.11.9/storage/perfschema/table_global_variables.h --- mariadb-10.11.6/storage/perfschema/table_global_variables.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_global_variables.h 2024-08-03 07:29:59.000000000 +0000 @@ -74,16 +74,16 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_global_variables(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_helper.h mariadb-10.11.9/storage/perfschema/table_helper.h --- mariadb-10.11.6/storage/perfschema/table_helper.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_helper.h 2024-08-03 07:29:59.000000000 +0000 @@ -659,7 +659,7 @@ private: void make_row(const CHARSET_INFO *cs, const char* str, size_t length); - char m_str[1024]; + char m_str[2048]; uint m_length; const CHARSET_INFO *m_charset; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_host_cache.h mariadb-10.11.9/storage/perfschema/table_host_cache.h --- mariadb-10.11.6/storage/perfschema/table_host_cache.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_host_cache.h 2024-08-03 07:29:59.000000000 +0000 @@ -114,15 +114,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_host_cache(); diff -Nru mariadb-10.11.6/storage/perfschema/table_hosts.h mariadb-10.11.9/storage/perfschema/table_hosts.h --- mariadb-10.11.6/storage/perfschema/table_hosts.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_hosts.h 2024-08-03 07:29:59.000000000 +0000 @@ -57,11 +57,11 @@ static int delete_all_rows(); protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); - + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; + protected: table_hosts(); @@ -70,7 +70,7 @@ ~table_hosts() = default; private: - virtual void make_row(PFS_host *pfs); + void make_row(PFS_host *pfs) override; /** Table share lock. */ static THR_LOCK m_table_lock; diff -Nru mariadb-10.11.6/storage/perfschema/table_md_locks.h mariadb-10.11.9/storage/perfschema/table_md_locks.h --- mariadb-10.11.6/storage/perfschema/table_md_locks.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_md_locks.h 2024-08-03 07:29:59.000000000 +0000 @@ -69,15 +69,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_metadata_locks(); diff -Nru mariadb-10.11.6/storage/perfschema/table_mems_by_account_by_event_name.h mariadb-10.11.9/storage/perfschema/table_mems_by_account_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_mems_by_account_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_mems_by_account_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -92,15 +92,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_mems_by_account_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_mems_by_host_by_event_name.h mariadb-10.11.9/storage/perfschema/table_mems_by_host_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_mems_by_host_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_mems_by_host_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -92,15 +92,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_mems_by_host_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_mems_by_thread_by_event_name.h mariadb-10.11.9/storage/perfschema/table_mems_by_thread_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_mems_by_thread_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_mems_by_thread_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -92,15 +92,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_mems_by_thread_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_mems_by_user_by_event_name.h mariadb-10.11.9/storage/perfschema/table_mems_by_user_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_mems_by_user_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_mems_by_user_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -92,15 +92,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_mems_by_user_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_mems_global_by_event_name.h mariadb-10.11.9/storage/perfschema/table_mems_global_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_mems_global_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_mems_global_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -94,15 +94,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_mems_global_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_os_global_by_type.h mariadb-10.11.9/storage/perfschema/table_os_global_by_type.h --- mariadb-10.11.6/storage/perfschema/table_os_global_by_type.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_os_global_by_type.h 2024-08-03 07:29:59.000000000 +0000 @@ -93,15 +93,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_os_global_by_type(); diff -Nru mariadb-10.11.6/storage/perfschema/table_performance_timers.h mariadb-10.11.9/storage/perfschema/table_performance_timers.h --- mariadb-10.11.6/storage/perfschema/table_performance_timers.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_performance_timers.h 2024-08-03 07:29:59.000000000 +0000 @@ -59,15 +59,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; protected: table_performance_timers(); diff -Nru mariadb-10.11.6/storage/perfschema/table_prepared_stmt_instances.h mariadb-10.11.9/storage/perfschema/table_prepared_stmt_instances.h --- mariadb-10.11.6/storage/perfschema/table_prepared_stmt_instances.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_prepared_stmt_instances.h 2024-08-03 07:29:59.000000000 +0000 @@ -94,15 +94,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_prepared_stmt_instances(); diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_applier_configuration.h mariadb-10.11.9/storage/perfschema/table_replication_applier_configuration.h --- mariadb-10.11.6/storage/perfschema/table_replication_applier_configuration.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_applier_configuration.h 2024-08-03 07:29:59.000000000 +0000 @@ -81,10 +81,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_applier_configuration(); @@ -96,9 +96,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_applier_status.cc mariadb-10.11.9/storage/perfschema/table_replication_applier_status.cc --- mariadb-10.11.6/storage/perfschema/table_replication_applier_status.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_applier_status.cc 2024-08-03 07:29:59.000000000 +0000 @@ -166,7 +166,7 @@ m_row.service_state= PS_RPL_NO; m_row.remaining_delay= 0; - if (slave_sql_running_state == Relay_log_info::state_delaying_string) + if (slave_sql_running_state == stage_sql_thd_waiting_until_delay.m_name) { time_t t= my_time(0), sql_delay_end= mi->rli.get_sql_delay_end(); m_row.remaining_delay= (uint)(t < sql_delay_end ? diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_applier_status.h mariadb-10.11.9/storage/perfschema/table_replication_applier_status.h --- mariadb-10.11.6/storage/perfschema/table_replication_applier_status.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_applier_status.h 2024-08-03 07:29:59.000000000 +0000 @@ -59,7 +59,7 @@ enum_rpl_yes_no service_state; uint remaining_delay; bool remaining_delay_is_set; - ulong count_transactions_retries; + ulonglong count_transactions_retries; }; /** Table PERFORMANCE_SCHEMA.replication_applier_status */ @@ -92,10 +92,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_applier_status(); @@ -107,9 +107,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_applier_status_by_coordinator.h mariadb-10.11.9/storage/perfschema/table_replication_applier_status_by_coordinator.h --- mariadb-10.11.6/storage/perfschema/table_replication_applier_status_by_coordinator.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_applier_status_by_coordinator.h 2024-08-03 07:29:59.000000000 +0000 @@ -101,10 +101,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_applier_status_by_coordinator(); @@ -116,9 +116,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_applier_status_by_worker.h mariadb-10.11.9/storage/perfschema/table_replication_applier_status_by_worker.h --- mariadb-10.11.6/storage/perfschema/table_replication_applier_status_by_worker.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_applier_status_by_worker.h 2024-08-03 07:29:59.000000000 +0000 @@ -130,10 +130,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_applier_status_by_worker(); @@ -145,9 +145,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_connection_configuration.h mariadb-10.11.9/storage/perfschema/table_replication_connection_configuration.h --- mariadb-10.11.6/storage/perfschema/table_replication_connection_configuration.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_connection_configuration.h 2024-08-03 07:29:59.000000000 +0000 @@ -153,10 +153,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_connection_configuration(); @@ -168,9 +168,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_connection_status.h mariadb-10.11.9/storage/perfschema/table_replication_connection_status.h --- mariadb-10.11.6/storage/perfschema/table_replication_connection_status.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_connection_status.h 2024-08-03 07:29:59.000000000 +0000 @@ -126,10 +126,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_connection_status(); @@ -141,9 +141,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_group_member_stats.h mariadb-10.11.9/storage/perfschema/table_replication_group_member_stats.h --- mariadb-10.11.6/storage/perfschema/table_replication_group_member_stats.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_group_member_stats.h 2024-08-03 07:29:59.000000000 +0000 @@ -91,10 +91,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_group_member_stats(); @@ -106,9 +106,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_replication_group_members.h mariadb-10.11.9/storage/perfschema/table_replication_group_members.h --- mariadb-10.11.6/storage/perfschema/table_replication_group_members.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_replication_group_members.h 2024-08-03 07:29:59.000000000 +0000 @@ -84,10 +84,10 @@ @param read_all true if all columns are read. */ - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_replication_group_members(); @@ -99,9 +99,9 @@ static PFS_engine_table_share m_share; static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; }; diff -Nru mariadb-10.11.6/storage/perfschema/table_session_account_connect_attrs.h mariadb-10.11.9/storage/perfschema/table_session_account_connect_attrs.h --- mariadb-10.11.6/storage/perfschema/table_session_account_connect_attrs.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_session_account_connect_attrs.h 2024-08-03 07:29:59.000000000 +0000 @@ -46,7 +46,7 @@ ~table_session_account_connect_attrs() = default; protected: - virtual bool thread_fits(PFS_thread *thread); + bool thread_fits(PFS_thread *thread) override; private: /** Table share lock. */ diff -Nru mariadb-10.11.6/storage/perfschema/table_session_connect.h mariadb-10.11.9/storage/perfschema/table_session_connect.h --- mariadb-10.11.6/storage/perfschema/table_session_connect.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_session_connect.h 2024-08-03 07:29:59.000000000 +0000 @@ -69,10 +69,10 @@ ~table_session_connect(); protected: - virtual void make_row(PFS_thread *pfs, uint ordinal); + void make_row(PFS_thread *pfs, uint ordinal) override; virtual bool thread_fits(PFS_thread *thread); - virtual int read_row_values(TABLE *table, unsigned char *buf, - Field **fields, bool read_all); + int read_row_values(TABLE *table, unsigned char *buf, + Field **fields, bool read_all) override; protected: /** Current row. */ row_session_connect_attrs m_row; diff -Nru mariadb-10.11.6/storage/perfschema/table_session_status.h mariadb-10.11.9/storage/perfschema/table_session_status.h --- mariadb-10.11.6/storage/perfschema/table_session_status.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_session_status.h 2024-08-03 07:29:59.000000000 +0000 @@ -76,16 +76,16 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_session_status(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_session_variables.h mariadb-10.11.9/storage/perfschema/table_session_variables.h --- mariadb-10.11.6/storage/perfschema/table_session_variables.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_session_variables.h 2024-08-03 07:29:59.000000000 +0000 @@ -74,16 +74,16 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_session_variables(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_setup_actors.h mariadb-10.11.9/storage/perfschema/table_setup_actors.h --- mariadb-10.11.6/storage/perfschema/table_setup_actors.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_setup_actors.h 2024-08-03 07:29:59.000000000 +0000 @@ -71,24 +71,24 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); - - virtual int update_row_values(TABLE *table, - const unsigned char *old_buf, - const unsigned char *new_buf, - Field **fields); - - virtual int delete_row_values(TABLE *table, - const unsigned char *buf, - Field **fields); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; + + int update_row_values(TABLE *table, + const unsigned char *old_buf, + const unsigned char *new_buf, + Field **fields) override; + + int delete_row_values(TABLE *table, + const unsigned char *buf, + Field **fields) override; table_setup_actors(); diff -Nru mariadb-10.11.6/storage/perfschema/table_setup_consumers.h mariadb-10.11.9/storage/perfschema/table_setup_consumers.h --- mariadb-10.11.6/storage/perfschema/table_setup_consumers.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_setup_consumers.h 2024-08-03 07:29:59.000000000 +0000 @@ -59,20 +59,20 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; - virtual int update_row_values(TABLE *table, - const unsigned char *old_buf, - const unsigned char *new_buf, - Field **fields); + int update_row_values(TABLE *table, + const unsigned char *old_buf, + const unsigned char *new_buf, + Field **fields) override; table_setup_consumers(); diff -Nru mariadb-10.11.6/storage/perfschema/table_setup_instruments.h mariadb-10.11.9/storage/perfschema/table_setup_instruments.h --- mariadb-10.11.6/storage/perfschema/table_setup_instruments.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_setup_instruments.h 2024-08-03 07:29:59.000000000 +0000 @@ -97,21 +97,21 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); - - virtual int update_row_values(TABLE *table, - const unsigned char *old_buf, - const unsigned char *new_buf, - Field **fields); - + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; + + int update_row_values(TABLE *table, + const unsigned char *old_buf, + const unsigned char *new_buf, + Field **fields) override; + table_setup_instruments(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_setup_objects.h mariadb-10.11.9/storage/perfschema/table_setup_objects.h --- mariadb-10.11.6/storage/perfschema/table_setup_objects.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_setup_objects.h 2024-08-03 07:29:59.000000000 +0000 @@ -70,24 +70,24 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); - - virtual int update_row_values(TABLE *table, - const unsigned char *old_buf, - const unsigned char *new_buf, - Field **fields); - - virtual int delete_row_values(TABLE *table, - const unsigned char *buf, - Field **fields); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; + + int update_row_values(TABLE *table, + const unsigned char *old_buf, + const unsigned char *new_buf, + Field **fields) override; + + int delete_row_values(TABLE *table, + const unsigned char *buf, + Field **fields) override; table_setup_objects(); diff -Nru mariadb-10.11.6/storage/perfschema/table_setup_timers.h mariadb-10.11.9/storage/perfschema/table_setup_timers.h --- mariadb-10.11.6/storage/perfschema/table_setup_timers.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_setup_timers.h 2024-08-03 07:29:59.000000000 +0000 @@ -55,20 +55,20 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; - virtual int update_row_values(TABLE *table, - const unsigned char *old_buf, - const unsigned char *new_buf, - Field **fields); + int update_row_values(TABLE *table, + const unsigned char *old_buf, + const unsigned char *new_buf, + Field **fields) override; table_setup_timers(); diff -Nru mariadb-10.11.6/storage/perfschema/table_socket_instances.h mariadb-10.11.9/storage/perfschema/table_socket_instances.h --- mariadb-10.11.6/storage/perfschema/table_socket_instances.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_socket_instances.h 2024-08-03 07:29:59.000000000 +0000 @@ -73,15 +73,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_socket_instances(); diff -Nru mariadb-10.11.6/storage/perfschema/table_socket_summary_by_event_name.h mariadb-10.11.9/storage/perfschema/table_socket_summary_by_event_name.h --- mariadb-10.11.6/storage/perfschema/table_socket_summary_by_event_name.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_socket_summary_by_event_name.h 2024-08-03 07:29:59.000000000 +0000 @@ -63,15 +63,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_socket_summary_by_event_name(); diff -Nru mariadb-10.11.6/storage/perfschema/table_socket_summary_by_instance.h mariadb-10.11.9/storage/perfschema/table_socket_summary_by_instance.h --- mariadb-10.11.6/storage/perfschema/table_socket_summary_by_instance.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_socket_summary_by_instance.h 2024-08-03 07:29:59.000000000 +0000 @@ -66,15 +66,15 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_socket_summary_by_instance(); diff -Nru mariadb-10.11.6/storage/perfschema/table_status_by_account.h mariadb-10.11.9/storage/perfschema/table_status_by_account.h --- mariadb-10.11.6/storage/perfschema/table_status_by_account.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_status_by_account.h 2024-08-03 07:29:59.000000000 +0000 @@ -111,16 +111,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_status_by_account(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_status_by_host.h mariadb-10.11.9/storage/perfschema/table_status_by_host.h --- mariadb-10.11.6/storage/perfschema/table_status_by_host.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_status_by_host.h 2024-08-03 07:29:59.000000000 +0000 @@ -109,16 +109,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_status_by_host(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_status_by_thread.h mariadb-10.11.9/storage/perfschema/table_status_by_thread.h --- mariadb-10.11.6/storage/perfschema/table_status_by_thread.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_status_by_thread.h 2024-08-03 07:29:59.000000000 +0000 @@ -107,16 +107,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_status_by_thread(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_status_by_user.h mariadb-10.11.9/storage/perfschema/table_status_by_user.h --- mariadb-10.11.6/storage/perfschema/table_status_by_user.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_status_by_user.h 2024-08-03 07:29:59.000000000 +0000 @@ -109,16 +109,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_status_by_user(); public: diff -Nru mariadb-10.11.6/storage/perfschema/table_sync_instances.h mariadb-10.11.9/storage/perfschema/table_sync_instances.h --- mariadb-10.11.6/storage/perfschema/table_sync_instances.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_sync_instances.h 2024-08-03 07:29:59.000000000 +0000 @@ -65,15 +65,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_mutex_instances(); @@ -123,15 +123,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_rwlock_instances(); @@ -175,15 +175,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; private: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_cond_instances(); diff -Nru mariadb-10.11.6/storage/perfschema/table_table_handles.h mariadb-10.11.9/storage/perfschema/table_table_handles.h --- mariadb-10.11.6/storage/perfschema/table_table_handles.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_table_handles.h 2024-08-03 07:29:59.000000000 +0000 @@ -69,16 +69,16 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_table_handles(); diff -Nru mariadb-10.11.6/storage/perfschema/table_threads.h mariadb-10.11.9/storage/perfschema/table_threads.h --- mariadb-10.11.6/storage/perfschema/table_threads.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_threads.h 2024-08-03 07:29:59.000000000 +0000 @@ -95,16 +95,16 @@ static PFS_engine_table* create(); protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); - - - virtual int update_row_values(TABLE *table, - const unsigned char *old_buf, - const unsigned char *new_buf, - Field **fields); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; + + + int update_row_values(TABLE *table, + const unsigned char *old_buf, + const unsigned char *new_buf, + Field **fields) override; protected: table_threads(); @@ -113,7 +113,7 @@ ~table_threads() = default; private: - virtual void make_row(PFS_thread *pfs); + void make_row(PFS_thread *pfs) override; /** Table share lock. */ static THR_LOCK m_table_lock; diff -Nru mariadb-10.11.6/storage/perfschema/table_tiws_by_index_usage.h mariadb-10.11.9/storage/perfschema/table_tiws_by_index_usage.h --- mariadb-10.11.6/storage/perfschema/table_tiws_by_index_usage.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_tiws_by_index_usage.h 2024-08-03 07:29:59.000000000 +0000 @@ -87,16 +87,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_tiws_by_index_usage(); diff -Nru mariadb-10.11.6/storage/perfschema/table_tiws_by_table.h mariadb-10.11.9/storage/perfschema/table_tiws_by_table.h --- mariadb-10.11.6/storage/perfschema/table_tiws_by_table.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_tiws_by_table.h 2024-08-03 07:29:59.000000000 +0000 @@ -62,16 +62,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_tiws_by_table(); diff -Nru mariadb-10.11.6/storage/perfschema/table_tlws_by_table.h mariadb-10.11.9/storage/perfschema/table_tlws_by_table.h --- mariadb-10.11.6/storage/perfschema/table_tlws_by_table.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_tlws_by_table.h 2024-08-03 07:29:59.000000000 +0000 @@ -62,16 +62,16 @@ static int delete_all_rows(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_tlws_by_table(); diff -Nru mariadb-10.11.6/storage/perfschema/table_users.h mariadb-10.11.9/storage/perfschema/table_users.h --- mariadb-10.11.6/storage/perfschema/table_users.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_users.h 2024-08-03 07:29:59.000000000 +0000 @@ -57,10 +57,10 @@ static int delete_all_rows(); protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; protected: @@ -70,7 +70,7 @@ ~table_users() = default; private: - virtual void make_row(PFS_user *pfs); + void make_row(PFS_user *pfs) override; /** Table share lock. */ static THR_LOCK m_table_lock; diff -Nru mariadb-10.11.6/storage/perfschema/table_uvar_by_thread.cc mariadb-10.11.9/storage/perfschema/table_uvar_by_thread.cc --- mariadb-10.11.6/storage/perfschema/table_uvar_by_thread.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_uvar_by_thread.cc 2024-08-03 07:29:59.000000000 +0000 @@ -46,7 +46,7 @@ : m_unsafe_thd(unsafe_thd) {} - virtual bool operator()(THD *thd) + bool operator()(THD *thd) override { if (thd != m_unsafe_thd) return false; diff -Nru mariadb-10.11.6/storage/perfschema/table_uvar_by_thread.h mariadb-10.11.9/storage/perfschema/table_uvar_by_thread.h --- mariadb-10.11.6/storage/perfschema/table_uvar_by_thread.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_uvar_by_thread.h 2024-08-03 07:29:59.000000000 +0000 @@ -154,15 +154,15 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_uvar_by_thread(); diff -Nru mariadb-10.11.6/storage/perfschema/table_variables_by_thread.h mariadb-10.11.9/storage/perfschema/table_variables_by_thread.h --- mariadb-10.11.6/storage/perfschema/table_variables_by_thread.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/table_variables_by_thread.h 2024-08-03 07:29:59.000000000 +0000 @@ -107,16 +107,16 @@ static PFS_engine_table* create(); static ha_rows get_row_count(); - virtual int rnd_init(bool scan); - virtual int rnd_next(); - virtual int rnd_pos(const void *pos); - virtual void reset_position(void); + int rnd_init(bool scan) override; + int rnd_next() override; + int rnd_pos(const void *pos) override; + void reset_position(void) override; protected: - virtual int read_row_values(TABLE *table, - unsigned char *buf, - Field **fields, - bool read_all); + int read_row_values(TABLE *table, + unsigned char *buf, + Field **fields, + bool read_all) override; table_variables_by_thread(); public: diff -Nru mariadb-10.11.6/storage/perfschema/unittest/CMakeLists.txt mariadb-10.11.9/storage/perfschema/unittest/CMakeLists.txt --- mariadb-10.11.6/storage/perfschema/unittest/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/unittest/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -22,7 +22,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/include/mysql - ${PCRE_INCLUDES} + ${PCRE_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/sql ${SSL_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/unittest/mytap diff -Nru mariadb-10.11.6/storage/perfschema/unittest/pfs_instr-t.cc mariadb-10.11.9/storage/perfschema/unittest/pfs_instr-t.cc --- mariadb-10.11.6/storage/perfschema/unittest/pfs_instr-t.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/unittest/pfs_instr-t.cc 2024-08-03 07:29:59.000000000 +0000 @@ -86,6 +86,8 @@ cleanup_instruments(); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + void test_no_instances() { int rc; @@ -245,6 +247,7 @@ cleanup_file_hash(); cleanup_instruments(); } +PRAGMA_REENABLE_CHECK_STACK_FRAME void test_with_instances() { diff -Nru mariadb-10.11.6/storage/perfschema/unittest/pfs_instr_class-t.cc mariadb-10.11.9/storage/perfschema/unittest/pfs_instr_class-t.cc --- mariadb-10.11.6/storage/perfschema/unittest/pfs_instr_class-t.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/unittest/pfs_instr_class-t.cc 2024-08-03 07:29:59.000000000 +0000 @@ -743,6 +743,7 @@ int main(int argc, char **argv) { plan(209); + pfs_enabled= 1; MY_INIT(argv[0]); do_all_tests(); my_end(0); diff -Nru mariadb-10.11.6/storage/perfschema/unittest/pfs_noop-t.cc mariadb-10.11.9/storage/perfschema/unittest/pfs_noop-t.cc --- mariadb-10.11.6/storage/perfschema/unittest/pfs_noop-t.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/unittest/pfs_noop-t.cc 2024-08-03 07:29:59.000000000 +0000 @@ -240,6 +240,7 @@ MY_INIT("pfs_noop-t"); test_noop(); + my_end(MY_CHECK_ERROR); return (exit_status()); } diff -Nru mariadb-10.11.6/storage/perfschema/unittest/stub_pfs_global.h mariadb-10.11.9/storage/perfschema/unittest/stub_pfs_global.h --- mariadb-10.11.6/storage/perfschema/unittest/stub_pfs_global.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/perfschema/unittest/stub_pfs_global.h 2024-08-03 07:29:59.000000000 +0000 @@ -58,7 +58,7 @@ void pfs_free(PFS_builtin_memory_class *, size_t, void *ptr) { if (ptr != NULL) - free(ptr); + aligned_free(ptr); } void *pfs_malloc_array(PFS_builtin_memory_class *klass, size_t n, size_t size, myf flags) diff -Nru mariadb-10.11.6/storage/rocksdb/CMakeLists.txt mariadb-10.11.9/storage/rocksdb/CMakeLists.txt --- mariadb-10.11.6/storage/rocksdb/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/CMakeLists.txt 2024-08-03 07:29:59.000000000 +0000 @@ -202,7 +202,7 @@ ADD_DEPENDENCIES(rocksdb_aux_lib GenError) # MARIAROCKS-TODO: how to properly depend on -lrt ? -TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARY}) +TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARIES}) if (UNIX AND NOT APPLE AND NOT CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") TARGET_LINK_LIBRARIES(rocksdb_aux_lib -lrt) endif() diff -Nru mariadb-10.11.6/storage/rocksdb/build_rocksdb.cmake mariadb-10.11.9/storage/rocksdb/build_rocksdb.cmake --- mariadb-10.11.6/storage/rocksdb/build_rocksdb.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/build_rocksdb.cmake 2024-08-03 07:29:59.000000000 +0000 @@ -79,7 +79,7 @@ check_lib(ZSTD ZDICT_trainFromBuffer) add_definitions(-DZLIB) -list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARY}) +list(APPEND THIRDPARTY_LIBS ${ZLIB_LIBRARIES}) ADD_FEATURE_INFO(ROCKSDB_ZLIB "ON" "zlib Compression in the RocksDB storage engine") if(CMAKE_SYSTEM_NAME MATCHES "Cygwin") diff -Nru mariadb-10.11.6/storage/rocksdb/ha_rocksdb.cc mariadb-10.11.9/storage/rocksdb/ha_rocksdb.cc --- mariadb-10.11.6/storage/rocksdb/ha_rocksdb.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/ha_rocksdb.cc 2024-08-03 07:29:59.000000000 +0000 @@ -3183,7 +3183,7 @@ } } - virtual bool is_writebatch_trx() const override { return false; } + bool is_writebatch_trx() const override { return false; } bool is_prepared() override { return m_rocksdb_tx && rocksdb::Transaction::PREPARED == m_rocksdb_tx->GetState(); @@ -3528,7 +3528,7 @@ m_notifier = std::make_shared(this); } - virtual ~Rdb_transaction_impl() override { + ~Rdb_transaction_impl() override { rollback(); // Theoretically the notifier could outlive the Rdb_transaction_impl @@ -3734,7 +3734,7 @@ true); } - virtual ~Rdb_writebatch_impl() override { + ~Rdb_writebatch_impl() override { rollback(); delete m_batch; } diff -Nru mariadb-10.11.6/storage/rocksdb/ha_rocksdb.h mariadb-10.11.9/storage/rocksdb/ha_rocksdb.h --- mariadb-10.11.6/storage/rocksdb/ha_rocksdb.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/ha_rocksdb.h 2024-08-03 07:29:59.000000000 +0000 @@ -397,7 +397,7 @@ current lookup to be covered. If the bitmap field is null, that means this index does not cover the current lookup for any record. */ - MY_BITMAP m_lookup_bitmap = {nullptr, nullptr, 0, 0}; + MY_BITMAP m_lookup_bitmap = {nullptr, nullptr, 0, 0, 0}; int alloc_key_buffers(const TABLE *const table_arg, const Rdb_tbl_def *const tbl_def_arg, @@ -441,7 +441,7 @@ ha_rocksdb(my_core::handlerton *const hton, my_core::TABLE_SHARE *const table_arg); - virtual ~ha_rocksdb() override { + ~ha_rocksdb() override { int err MY_ATTRIBUTE((__unused__)); err = finalize_bulk_load(false); if (err != 0) { @@ -458,7 +458,7 @@ const char *table_type() const - is non-virtual in class handler, so there's no point to override it. + is non-in class handler, so there's no point to override it. */ /* The following is only used by SHOW KEYS: */ @@ -623,15 +623,15 @@ bool sorted) override MY_ATTRIBUTE((__warn_unused_result__)); - virtual double scan_time() override { + double scan_time() override { DBUG_ENTER_FUNC(); DBUG_RETURN( static_cast((stats.records + stats.deleted) / 20.0 + 10)); } - virtual double read_time(uint, uint, ha_rows rows) override; - virtual void print_error(int error, myf errflag) override; + double read_time(uint, uint, ha_rows rows) override; + void print_error(int error, myf errflag) override; int open(const char *const name, int mode, uint test_if_locked) override MY_ATTRIBUTE((__warn_unused_result__)); @@ -980,11 +980,11 @@ #ifdef MARIAROCKS_NOT_YET // MDEV-10976 public: - virtual void rpl_before_delete_rows() override; - virtual void rpl_after_delete_rows() override; - virtual void rpl_before_update_rows() override; - virtual void rpl_after_update_rows() override; - virtual bool use_read_free_rpl() const override; + void rpl_before_delete_rows() override; + void rpl_after_delete_rows() override; + void rpl_before_update_rows() override; + void rpl_after_update_rows() override; + bool use_read_free_rpl() const override; #endif // MARIAROCKS_NOT_YET private: diff -Nru mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result --- mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/group_min_max.result 2024-08-03 07:29:59.000000000 +0000 @@ -3517,7 +3517,7 @@ Variable_name Value Handler_read_first 0 Handler_read_key 3 -Handler_read_last 1 +Handler_read_last 0 Handler_read_next 0 Handler_read_prev 0 Handler_read_retry 0 diff -Nru mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result --- mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/innodb_i_s_tables_disabled.result 2024-08-03 07:29:59.000000000 +0000 @@ -68,7 +68,6 @@ buffer_flush_adaptive_avg_time buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Avg time (ms) spent for adaptive flushing recently. buffer_flush_adaptive_avg_pass buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of adaptive flushes passed during the recent Avg period. buffer_LRU_get_free_loops buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Total loops in LRU get free. -buffer_LRU_get_free_waits buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Total sleep waits in LRU get free. buffer_flush_avg_page_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Average number of pages at which flushing is happening buffer_flush_lsn_avg_rate buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Average redo generation rate buffer_flush_pct_for_dirty buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Percent of IO capacity used to avoid max dirty page limit @@ -88,7 +87,6 @@ buffer_LRU_batch_scanned_per_call buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_member Pages scanned per LRU batch call buffer_LRU_batch_flush_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Total pages flushed as part of LRU batches buffer_LRU_batch_evict_total_pages buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 status_counter Total pages evicted as part of LRU batches -buffer_LRU_single_flush_failure_count Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of times attempt to flush a single page from LRU failed buffer_LRU_get_free_search Buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 counter Number of searches performed for a clean page buffer_LRU_search_scanned buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_owner Total pages scanned as part of LRU search buffer_LRU_search_num_scan buffer 0 NULL NULL NULL 0 NULL NULL NULL NULL NULL NULL NULL 0 set_member Number of times LRU search is performed diff -Nru mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/r/partition.result mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/partition.result --- mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/r/partition.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/r/partition.result 2024-08-03 07:29:59.000000000 +0000 @@ -46,7 +46,6 @@ Table Op Msg_type Msg_text test.t1 optimize status OK Table Op Msg_type Msg_text -test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK Table Op Msg_type Msg_text test.t1 repair status OK diff -Nru mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/t/disabled.def mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/t/disabled.def --- mariadb-10.11.6/storage/rocksdb/mysql-test/rocksdb/t/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/mysql-test/rocksdb/t/disabled.def 2024-08-03 07:29:59.000000000 +0000 @@ -87,6 +87,10 @@ blind_delete_without_tx_api: MDEV-12286: rocksdb.blind_delete_without_tx_api test fails information_schema: MDEV-14372: unstable testcase +bloomfilter2: MDEV-33789: rocksdb.bloomfilter2 failed on amd64-debian-12-rocksdb +write_sync: MDEV-33866: rocksdb.write_sync fails on amd64-windows-packages +locking_issues_case5_rc: MDEV-33781: rocksdb.locking_issues_case5_rc fails on amd64-windows-packages + ## ## Tests that fail for some other reason ## diff -Nru mariadb-10.11.6/storage/rocksdb/properties_collector.h mariadb-10.11.9/storage/rocksdb/properties_collector.h --- mariadb-10.11.6/storage/rocksdb/properties_collector.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/properties_collector.h 2024-08-03 07:29:59.000000000 +0000 @@ -128,7 +128,7 @@ virtual rocksdb::Status Finish( rocksdb::UserCollectedProperties *properties) override; - virtual const char *Name() const override { return "Rdb_tbl_prop_coll"; } + const char *Name() const override { return "Rdb_tbl_prop_coll"; } rocksdb::UserCollectedProperties GetReadableProperties() const override; @@ -193,7 +193,7 @@ m_table_stats_sampling_pct); } - virtual const char *Name() const override { + const char *Name() const override { return "Rdb_tbl_prop_coll_factory"; } diff -Nru mariadb-10.11.6/storage/rocksdb/rdb_compact_filter.h mariadb-10.11.9/storage/rocksdb/rdb_compact_filter.h --- mariadb-10.11.6/storage/rocksdb/rdb_compact_filter.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/rdb_compact_filter.h 2024-08-03 07:29:59.000000000 +0000 @@ -105,9 +105,9 @@ return false; } - virtual bool IgnoreSnapshots() const override { return true; } + bool IgnoreSnapshots() const override { return true; } - virtual const char *Name() const override { return "Rdb_compact_filter"; } + const char *Name() const override { return "Rdb_compact_filter"; } void get_ttl_duration_and_offset(const GL_INDEX_ID &gl_index_id, uint64 *ttl_duration, diff -Nru mariadb-10.11.6/storage/rocksdb/rdb_datadic.h mariadb-10.11.9/storage/rocksdb/rdb_datadic.h --- mariadb-10.11.6/storage/rocksdb/rdb_datadic.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/rdb_datadic.h 2024-08-03 07:29:59.000000000 +0000 @@ -1584,7 +1584,7 @@ return true; } - virtual const char *Name() const override { return "Rdb_system_merge_op"; } + const char *Name() const override { return "Rdb_system_merge_op"; } private: /* diff -Nru mariadb-10.11.6/storage/rocksdb/rdb_mutex_wrapper.h mariadb-10.11.9/storage/rocksdb/rdb_mutex_wrapper.h --- mariadb-10.11.6/storage/rocksdb/rdb_mutex_wrapper.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/rdb_mutex_wrapper.h 2024-08-03 07:29:59.000000000 +0000 @@ -39,7 +39,7 @@ public: Rdb_mutex(); - virtual ~Rdb_mutex() override; + ~Rdb_mutex() override; /* Override parent class's virtual methods of interrest. @@ -47,7 +47,7 @@ // Attempt to acquire lock. Return OK on success, or other Status on failure. // If returned status is OK, TransactionDB will eventually call UnLock(). - virtual rocksdb::Status Lock() override; + rocksdb::Status Lock() override; // Attempt to acquire lock. If timeout is non-negative, operation should be // failed after this many microseconds. @@ -59,7 +59,7 @@ int64_t timeout_time MY_ATTRIBUTE((__unused__))) override; // Unlock Mutex that was successfully locked by Lock() or TryLockUntil() - virtual void UnLock() override; + void UnLock() override; private: mysql_mutex_t m_mutex; @@ -77,7 +77,7 @@ public: Rdb_cond_var(); - virtual ~Rdb_cond_var() override; + ~Rdb_cond_var() override; /* Override parent class's virtual methods of interrest. @@ -109,10 +109,10 @@ // If any threads are waiting on *this, unblock at least one of the // waiting threads. - virtual void Notify() override; + void Notify() override; // Unblocks all threads waiting on *this. - virtual void NotifyAll() override; + void NotifyAll() override; private: mysql_cond_t m_cond; @@ -137,7 +137,7 @@ return std::make_shared(); } - virtual ~Rdb_mutex_factory() override = default; + ~Rdb_mutex_factory() override = default; }; } // namespace myrocks diff -Nru mariadb-10.11.6/storage/rocksdb/rdb_source_revision.h mariadb-10.11.9/storage/rocksdb/rdb_source_revision.h --- mariadb-10.11.6/storage/rocksdb/rdb_source_revision.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/rdb_source_revision.h 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1 @@ +#define ROCKSDB_GIT_HASH "bba5e7bc21093d7cfa765e1280a7c4fdcd284288" diff -Nru mariadb-10.11.6/storage/rocksdb/rdb_threads.h mariadb-10.11.9/storage/rocksdb/rdb_threads.h --- mariadb-10.11.6/storage/rocksdb/rdb_threads.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/rocksdb/rdb_threads.h 2024-08-03 07:29:59.000000000 +0000 @@ -148,7 +148,7 @@ } public: - virtual void run() override; + void run() override; void request_save_stats() { RDB_MUTEX_LOCK_CHECK(m_signal_mutex); @@ -175,7 +175,7 @@ std::map m_requests; public: - virtual void run() override; + void run() override; int request_manual_compaction(rocksdb::ColumnFamilyHandle *cf, rocksdb::Slice *start, rocksdb::Slice *limit, int concurrency = 0); @@ -189,7 +189,7 @@ */ struct Rdb_drop_index_thread : public Rdb_thread { - virtual void run() override; + void run() override; }; } // namespace myrocks diff -Nru mariadb-10.11.6/storage/sequence/sequence.cc mariadb-10.11.9/storage/sequence/sequence.cc --- mariadb-10.11.6/storage/sequence/sequence.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/sequence/sequence.cc 2024-08-03 07:29:59.000000000 +0000 @@ -47,7 +47,7 @@ { thr_lock_init(&lock); } - ~Sequence_share() + ~Sequence_share() override { thr_lock_delete(&lock); } @@ -64,45 +64,45 @@ Sequence_share *seqs; ha_seq(handlerton *hton, TABLE_SHARE *table_arg) : handler(hton, table_arg), seqs(0) { } - ulonglong table_flags() const + ulonglong table_flags() const override { return HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE; } /* open/close/locking */ int create(const char *name, TABLE *table_arg, - HA_CREATE_INFO *create_info) + HA_CREATE_INFO *create_info) override { return HA_ERR_WRONG_COMMAND; } - int open(const char *name, int mode, uint test_if_locked); - int close(void); - int delete_table(const char *name) + int open(const char *name, int mode, uint test_if_locked) override; + int close(void) override; + int delete_table(const char *name) override { return 0; } - THR_LOCK_DATA **store_lock(THD *, THR_LOCK_DATA **, enum thr_lock_type); + THR_LOCK_DATA **store_lock(THD *, THR_LOCK_DATA **, enum thr_lock_type) override; /* table scan */ - int rnd_init(bool scan); - int rnd_next(unsigned char *buf); - void position(const uchar *record); - int rnd_pos(uchar *buf, uchar *pos); - int info(uint flag); + int rnd_init(bool scan) override; + int rnd_next(unsigned char *buf) override; + void position(const uchar *record) override; + int rnd_pos(uchar *buf, uchar *pos) override; + int info(uint flag) override; /* indexes */ - ulong index_flags(uint inx, uint part, bool all_parts) const + ulong index_flags(uint inx, uint part, bool all_parts) const override { return HA_READ_NEXT | HA_READ_PREV | HA_READ_ORDER | HA_READ_RANGE | HA_KEYREAD_ONLY; } - uint max_supported_keys() const { return 1; } + uint max_supported_keys() const override { return 1; } int index_read_map(uchar *buf, const uchar *key, key_part_map keypart_map, - enum ha_rkey_function find_flag); - int index_next(uchar *buf); - int index_prev(uchar *buf); - int index_first(uchar *buf); - int index_last(uchar *buf); + enum ha_rkey_function find_flag) override; + int index_next(uchar *buf) override; + int index_prev(uchar *buf) override; + int index_first(uchar *buf) override; + int index_last(uchar *buf) override; ha_rows records_in_range(uint inx, const key_range *start_key, - const key_range *end_key, page_range *pages); - double scan_time() { return (double)nvalues(); } - double read_time(uint index, uint ranges, ha_rows rows) { return (double)rows; } - double keyread_time(uint index, uint ranges, ha_rows rows) { return (double)rows; } + const key_range *end_key, page_range *pages) override; + double scan_time() override { return (double)nvalues(); } + double read_time(uint index, uint ranges, ha_rows rows) override { return (double)rows; } + double keyread_time(uint index, uint ranges, ha_rows rows) override { return (double)rows; } private: void set(uchar *buf); @@ -382,10 +382,10 @@ // Reset limit because we are handling it now orig_lim->set_unlimited(); } - ~ha_seq_group_by_handler() = default; - int init_scan() { first_row= 1 ; return 0; } - int next_row(); - int end_scan() { return 0; } + ~ha_seq_group_by_handler() override = default; + int init_scan() override { first_row= 1 ; return 0; } + int next_row() override; + int end_scan() override { return 0; } }; static group_by_handler * diff -Nru mariadb-10.11.6/storage/sphinx/ha_sphinx.cc mariadb-10.11.9/storage/sphinx/ha_sphinx.cc --- mariadb-10.11.6/storage/sphinx/ha_sphinx.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/sphinx/ha_sphinx.cc 2024-08-03 07:29:59.000000000 +0000 @@ -3541,7 +3541,8 @@ return 0; } -int sphinx_showfunc_total ( THD * thd, SHOW_VAR * out, char * ) +static int sphinx_showfunc_total ( THD * thd, SHOW_VAR * out, void *, + system_status_var *, enum_var_type ) { CSphSEStats * pStats = sphinx_get_stats ( thd, out ); if ( pStats ) @@ -3552,7 +3553,8 @@ return 0; } -int sphinx_showfunc_total_found ( THD * thd, SHOW_VAR * out, char * ) +static int sphinx_showfunc_total_found ( THD * thd, SHOW_VAR * out, void *, + system_status_var *, enum_var_type ) { CSphSEStats * pStats = sphinx_get_stats ( thd, out ); if ( pStats ) @@ -3563,7 +3565,8 @@ return 0; } -int sphinx_showfunc_time ( THD * thd, SHOW_VAR * out, char * ) +static int sphinx_showfunc_time ( THD * thd, SHOW_VAR * out, void *, + system_status_var *, enum_var_type ) { CSphSEStats * pStats = sphinx_get_stats ( thd, out ); if ( pStats ) @@ -3574,7 +3577,8 @@ return 0; } -int sphinx_showfunc_word_count ( THD * thd, SHOW_VAR * out, char * ) +static int sphinx_showfunc_word_count ( THD * thd, SHOW_VAR * out, void *, + system_status_var *, enum_var_type ) { CSphSEStats * pStats = sphinx_get_stats ( thd, out ); if ( pStats ) @@ -3585,9 +3589,11 @@ return 0; } -int sphinx_showfunc_words ( THD * thd, SHOW_VAR * out, char * sBuffer ) +static int sphinx_showfunc_words ( THD * thd, SHOW_VAR * out, void * buf, + system_status_var *, enum_var_type ) { #if MYSQL_VERSION_ID>50100 + char *sBuffer = static_cast(buf); if ( sphinx_hton_ptr ) { CSphTLS * pTls = (CSphTLS *) thd_get_ha_data ( thd, sphinx_hton_ptr ); @@ -3642,7 +3648,8 @@ return 0; } -int sphinx_showfunc_error ( THD * thd, SHOW_VAR * out, char * ) +static int sphinx_showfunc_error ( THD * thd, SHOW_VAR * out, void *, + system_status_var *, enum_var_type ) { CSphSEStats * pStats = sphinx_get_stats ( thd, out ); out->type = SHOW_CHAR; diff -Nru mariadb-10.11.6/storage/sphinx/ha_sphinx.h mariadb-10.11.9/storage/sphinx/ha_sphinx.h --- mariadb-10.11.6/storage/sphinx/ha_sphinx.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/sphinx/ha_sphinx.h 2024-08-03 07:29:59.000000000 +0000 @@ -55,85 +55,85 @@ #endif ~ha_sphinx (); - const char * table_type () const { return "SPHINX"; } ///< SE name for display purposes - const char * index_type ( uint ) { return "HASH"; } ///< index type name for display purposes + const char * table_type () const override { return "SPHINX"; } ///< SE name for display purposes + const char * index_type ( uint ) override { return "HASH"; } ///< index type name for display purposes #if MYSQL_VERSION_ID>50100 - ulonglong table_flags () const { return HA_CAN_INDEX_BLOBS | + ulonglong table_flags () const override { return HA_CAN_INDEX_BLOBS | HA_CAN_TABLE_CONDITION_PUSHDOWN; } ///< bitmap of implemented flags (see handler.h for more info) #else ulong table_flags () const { return HA_CAN_INDEX_BLOBS; } ///< bitmap of implemented flags (see handler.h for more info) #endif - ulong index_flags ( uint, uint, bool ) const { return 0; } ///< bitmap of flags that says how SE implements indexes - uint max_supported_record_length () const { return HA_MAX_REC_LENGTH; } - uint max_supported_keys () const { return 1; } - uint max_supported_key_parts () const { return 1; } - uint max_supported_key_length () const { return MAX_KEY_LENGTH; } - uint max_supported_key_part_length () const { return MAX_KEY_LENGTH; } + ulong index_flags ( uint, uint, bool ) const override { return 0; } ///< bitmap of flags that says how SE implements indexes + uint max_supported_record_length () const override { return HA_MAX_REC_LENGTH; } + uint max_supported_keys () const override { return 1; } + uint max_supported_key_parts () const override { return 1; } + uint max_supported_key_length () const override { return MAX_KEY_LENGTH; } + uint max_supported_key_part_length () const override { return MAX_KEY_LENGTH; } #if MYSQL_VERSION_ID>50100 - virtual double scan_time () { return (double)( stats.records+stats.deleted )/20.0 + 10; } ///< called in test_quick_select to determine if indexes should be used + double scan_time () override { return (double)( stats.records+stats.deleted )/20.0 + 10; } ///< called in test_quick_select to determine if indexes should be used #else virtual double scan_time () { return (double)( records+deleted )/20.0 + 10; } ///< called in test_quick_select to determine if indexes should be used #endif - virtual double read_time(uint index, uint ranges, ha_rows rows) + double read_time(uint index, uint ranges, ha_rows rows) override { return ranges + (double)rows/20.0 + 1; } ///< index read time estimate public: - int open ( const char * name, int mode, uint test_if_locked ); - int close (); + int open ( const char * name, int mode, uint test_if_locked ) override; + int close () override; - int write_row ( const byte * buf ); - int update_row ( const byte * old_data, const byte * new_data ); - int delete_row ( const byte * buf ); - int extra ( enum ha_extra_function op ); + int write_row ( const byte * buf ) override; + int update_row ( const byte * old_data, const byte * new_data ) override; + int delete_row ( const byte * buf ) override; + int extra ( enum ha_extra_function op ) override; - int index_init ( uint keynr, bool sorted ); // 5.1.x + int index_init ( uint keynr, bool sorted ) override; // 5.1.x int index_init ( uint keynr ) { return index_init ( keynr, false ); } // 5.0.x - int index_end (); - int index_read ( byte * buf, const byte * key, uint key_len, enum ha_rkey_function find_flag ); + int index_end () override; + int index_read ( byte * buf, const byte * key, uint key_len, enum ha_rkey_function find_flag ) override; int index_read_idx ( byte * buf, uint idx, const byte * key, uint key_len, enum ha_rkey_function find_flag ); - int index_next ( byte * buf ); - int index_next_same ( byte * buf, const byte * key, uint keylen ); - int index_prev ( byte * buf ); - int index_first ( byte * buf ); - int index_last ( byte * buf ); + int index_next ( byte * buf ) override; + int index_next_same ( byte * buf, const byte * key, uint keylen ) override; + int index_prev ( byte * buf ) override; + int index_first ( byte * buf ) override; + int index_last ( byte * buf ) override; int get_rec ( byte * buf, const byte * key, uint keylen ); - int rnd_init ( bool scan ); - int rnd_end (); - int rnd_next ( byte * buf ); - int rnd_pos ( byte * buf, byte * pos ); - void position ( const byte * record ); + int rnd_init ( bool scan ) override; + int rnd_end () override; + int rnd_next ( byte * buf ) override; + int rnd_pos ( byte * buf, byte * pos ) override; + void position ( const byte * record ) override; #if MYSQL_VERSION_ID>=50030 - int info ( uint ); + int info ( uint ) override; #else void info ( uint ); #endif - int reset(); - int external_lock ( THD * thd, int lock_type ); - int delete_all_rows (); - ha_rows records_in_range ( uint inx, const key_range * min_key, const key_range * max_key, page_range *pages); - - int delete_table ( const char * from ); - int rename_table ( const char * from, const char * to ); - int create ( const char * name, TABLE * form, HA_CREATE_INFO * create_info ); + int reset() override; + int external_lock ( THD * thd, int lock_type ) override; + int delete_all_rows () override; + ha_rows records_in_range ( uint inx, const key_range * min_key, const key_range * max_key, page_range *pages) override; + + int delete_table ( const char * from ) override; + int rename_table ( const char * from, const char * to ) override; + int create ( const char * name, TABLE * form, HA_CREATE_INFO * create_info ) override; - THR_LOCK_DATA ** store_lock ( THD * thd, THR_LOCK_DATA ** to, enum thr_lock_type lock_type ); + THR_LOCK_DATA ** store_lock ( THD * thd, THR_LOCK_DATA ** to, enum thr_lock_type lock_type ) override; public: #if MYSQL_VERSION_ID<50610 virtual const COND * cond_push ( const COND *cond ); #else - virtual const Item * cond_push ( const Item *cond ); + const Item * cond_push ( const Item *cond ) override; #endif - virtual void cond_pop (); + void cond_pop () override; private: uint32 m_iFields; @@ -164,12 +164,6 @@ bool sphinx_show_status ( THD * thd ); #endif -int sphinx_showfunc_total_found ( THD *, SHOW_VAR *, char * ); -int sphinx_showfunc_total ( THD *, SHOW_VAR *, char * ); -int sphinx_showfunc_time ( THD *, SHOW_VAR *, char * ); -int sphinx_showfunc_word_count ( THD *, SHOW_VAR *, char * ); -int sphinx_showfunc_words ( THD *, SHOW_VAR *, char * ); - // // $Id: ha_sphinx.h 4818 2014-09-24 08:53:38Z tomat $ // diff -Nru mariadb-10.11.6/storage/spider/ha_spider.cc mariadb-10.11.9/storage/spider/ha_spider.cc --- mariadb-10.11.6/storage/spider/ha_spider.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/ha_spider.cc 2024-08-03 07:29:59.000000000 +0000 @@ -58,7 +58,7 @@ { DBUG_ENTER("ha_spider::ha_spider"); DBUG_PRINT("info",("spider this=%p", this)); - spider_alloc_calc_mem_init(mem_calc, 139); + spider_alloc_calc_mem_init(mem_calc, SPD_MID_HA_SPIDER_HA_SPIDER_1); spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this)); share = NULL; conns = NULL; @@ -118,7 +118,7 @@ { DBUG_ENTER("ha_spider::ha_spider"); DBUG_PRINT("info",("spider this=%p", this)); - spider_alloc_calc_mem_init(mem_calc, 0); + spider_alloc_calc_mem_init(mem_calc, SPD_MID_HA_SPIDER_HA_SPIDER_2); spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this)); share = NULL; conns = NULL; @@ -269,19 +269,19 @@ spider_bulk_malloc(spider_current_trx, 16, MYF(MY_WME | MY_ZEROFILL), &wide_handler, sizeof(SPIDER_WIDE_HANDLER), &searched_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &ft_discard_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &position_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &idx_read_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &idx_write_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &rnd_read_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &rnd_write_bitmap, - (uint) sizeof(uchar) * no_bytes_in_map(table->read_set), + (uint) sizeof(uchar) * my_bitmap_buffer_size(table->read_set), &partition_handler, (uint) sizeof(SPIDER_PARTITION_HANDLER), NullS) @@ -305,9 +305,9 @@ wide_handler->top_share = table->s; owner->wide_handler_owner = TRUE; memset(wide_handler->ft_discard_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); memset(wide_handler->searched_bitmap, 0, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); wide_handler_alloc = TRUE; if (!share && !spider_get_share(name, table, thd, this, &error_num)) @@ -347,21 +347,32 @@ result_list.last = NULL; result_list.current = NULL; result_list.record_num = 0; - if ( - !(result_list.sqls = new spider_string[share->link_count]) || - !(result_list.insert_sqls = new spider_string[share->link_count]) || - !(result_list.update_sqls = new spider_string[share->link_count]) || - !(result_list.tmp_sqls = new spider_string[share->link_count]) - ) { + if (!(result_list.sqls = new spider_string[share->link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error_init_result_list; + } + if (!(result_list.insert_sqls = new spider_string[share->link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error_init_result_list; + } + if (!(result_list.update_sqls = new spider_string[share->link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error_init_result_list; + } + if (!(result_list.tmp_sqls = new spider_string[share->link_count])) + { error_num = HA_ERR_OUT_OF_MEM; goto error_init_result_list; } for (roop_count = 0; roop_count < (int) share->link_count; roop_count++) { - result_list.sqls[roop_count].init_calc_mem(80); - result_list.insert_sqls[roop_count].init_calc_mem(81); - result_list.update_sqls[roop_count].init_calc_mem(82); - result_list.tmp_sqls[roop_count].init_calc_mem(83); + result_list.sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_3); + result_list.insert_sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_4); + result_list.update_sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_5); + result_list.tmp_sqls[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_6); uint all_link_idx = conn_link_idx[roop_count]; uint dbton_id = share->sql_dbton_ids[all_link_idx]; if (share->dbton_share[dbton_id]->need_change_db_table_name()) @@ -392,7 +403,7 @@ } for (roop_count = 0; roop_count < (int) table_share->fields; roop_count++) { - blob_buff[roop_count].init_calc_mem(84); + blob_buff[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_OPEN_7); blob_buff[roop_count].set_charset(table->field[roop_count]->charset()); } } @@ -472,11 +483,31 @@ owner->wide_handler = NULL; owner->wide_handler_owner = FALSE; } - wide_handler = NULL; + if (!wide_handler_owner) + wide_handler = NULL; error_wide_handler_alloc: DBUG_RETURN(error_num); } +/* + Given a SPIDER_SHARE that will be freed, update all SPIDER_TRX_HAs + of spider_current_trx to point to a NULL share, which will cause the + removal of the SPIDER_TRX_HA in spider_check_trx_ha(). +*/ +static void spider_update_current_trx_ha_with_freed_share(SPIDER_SHARE *share) +{ + SPIDER_TRX *trx= spider_current_trx; + if (trx) + { + for (uint i = 0; i < trx->trx_ha_hash.records; i++) + { + SPIDER_TRX_HA *trx_ha = (SPIDER_TRX_HA *) my_hash_element(&trx->trx_ha_hash, i); + if (trx_ha->share == share) + trx_ha->share= NULL; + } + } +} + int ha_spider::close() { int error_num= 0, roop_count; @@ -571,6 +602,7 @@ result_list.tmp_sqls = NULL; } + spider_update_current_trx_ha_with_freed_share(share); spider_free_share(share); is_clone = FALSE; pt_clone_source_handler = NULL; @@ -860,6 +892,14 @@ wide_handler->trx= trx; /* End of wide_handler setup */ + if (lock_type == F_UNLCK) + { + if (!trx->locked_connections) + { + DBUG_RETURN(0); /* No remote table actually locked by Spider */ + } + } + if (store_error_num) { DBUG_RETURN(store_error_num); @@ -888,10 +928,7 @@ if (lock_type == F_UNLCK) { - if (sql_command != SQLCOM_UNLOCK_TABLES) - { - DBUG_RETURN(0); /* Unlock remote tables only by UNLOCK TABLES. */ - } + wide_handler->sql_command = SQLCOM_UNLOCK_TABLES; if (!trx->locked_connections) { DBUG_RETURN(0); /* No remote table actually locked by Spider */ @@ -913,6 +950,8 @@ } } + if ((error_num= spider_check_trx_and_get_conn(thd, this, FALSE))) + DBUG_RETURN(error_num); if (!partition_handler || !partition_handler->handlers) { DBUG_RETURN(lock_tables()); /* Non-partitioned table */ @@ -995,9 +1034,9 @@ if (!is_clone) { memset(wide_handler->ft_discard_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); memset(wide_handler->searched_bitmap, 0, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } while (wide_handler->condition) { @@ -1225,7 +1264,7 @@ bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } } @@ -3120,7 +3159,7 @@ bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } } @@ -3173,7 +3212,7 @@ bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } } @@ -3592,7 +3631,7 @@ spider_free(spider_current_trx, multi_range_keys, MYF(0)); } if (!(multi_range_keys = (range_id_t *) - spider_malloc(spider_current_trx, 1, sizeof(range_id_t) * + spider_malloc(spider_current_trx, SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_1, sizeof(range_id_t) * (multi_range_num < result_list.multi_split_read ? multi_range_num : result_list.multi_split_read), MYF(MY_WME))) ) @@ -3605,7 +3644,7 @@ DBUG_RETURN(HA_ERR_OUT_OF_MEM); } for (roop_count = 0; roop_count < 2; roop_count++) - mrr_key_buff[roop_count].init_calc_mem(235); + mrr_key_buff[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_3); } error_num = 0; if ((range_res = mrr_funcs.next(mrr_iter, &mrr_cur_range))) @@ -5432,7 +5471,7 @@ bitmap_set_all(table->read_set); if (is_clone) memset(wide_handler->searched_bitmap, 0xFF, - no_bytes_in_map(table->read_set)); + my_bitmap_buffer_size(table->read_set)); } set_select_column_mode(); @@ -5825,6 +5864,8 @@ DBUG_RETURN(error_num); use_pre_call = FALSE; } + if ((error_num= spider_check_trx_and_get_conn(ha_thd(), this, FALSE))) + DBUG_RETURN(error_num); DBUG_RETURN(rnd_next_internal(buf)); } @@ -6068,7 +6109,7 @@ if (!ft_current) { if (!(ft_current = (st_spider_ft_info *) - spider_malloc(spider_current_trx, 2, sizeof(st_spider_ft_info), + spider_malloc(spider_current_trx, SPD_MID_HA_SPIDER_FT_INIT_EXT_1, sizeof(st_spider_ft_info), MYF(MY_WME | MY_ZEROFILL)))) { my_error(HA_ERR_OUT_OF_MEM, MYF(0)); @@ -6234,7 +6275,7 @@ DBUG_RETURN(check_error_mode_eof(error_num)); } } else { - uint dbton_id = share->use_sql_dbton_ids[roop_count]; + uint dbton_id = share->sql_dbton_ids[roop_count]; spider_db_handler *dbton_hdl = dbton_handler[dbton_id]; SPIDER_CONN *conn = conns[roop_count]; pthread_mutex_assert_not_owner(&conn->mta_conn_mutex); @@ -6551,8 +6592,6 @@ spider_init_error_table->init_error_time = (time_t) time((time_t*) 0); } - share->init_error = TRUE; - share->init = TRUE; } if (wide_handler->sql_command == SQLCOM_SHOW_CREATE || wide_handler->sql_command == SQLCOM_SHOW_FIELDS) @@ -6603,10 +6642,6 @@ share, TRUE)) ) { spider_init_error_table->init_error = error_num; -/* - if (!thd->is_error()) - my_error(error_num, MYF(0), ""); -*/ if ((spider_init_error_table->init_error_with_message = thd->is_error())) strmov(spider_init_error_table->init_error_msg, @@ -6614,8 +6649,6 @@ spider_init_error_table->init_error_time = (time_t) time((time_t*) 0); } - share->init_error = TRUE; - share->init = TRUE; } if (wide_handler->sql_command == SQLCOM_SHOW_CREATE || wide_handler->sql_command == SQLCOM_SHOW_FIELDS) @@ -6895,8 +6928,6 @@ spider_init_error_table->init_error_time = (time_t) time((time_t*) 0); } - share->init_error = TRUE; - share->init = TRUE; } if (check_error_mode(error_num)) my_errno = error_num; @@ -7186,8 +7217,6 @@ spider_init_error_table->init_error_time = (time_t) time((time_t*) 0); } - share->init_error = TRUE; - share->init = TRUE; } DBUG_RETURN(check_error_mode(error_num)); } @@ -7574,18 +7603,6 @@ DBUG_ENTER("ha_spider::update_auto_increment"); DBUG_PRINT("info",("spider this=%p", this)); force_auto_increment = TRUE; -/* - if ( - next_insert_id >= auto_inc_interval_for_cur_row.maximum() && - wide_handler->trx->thd->auto_inc_intervals_forced.get_current() - ) { - force_auto_increment = TRUE; - DBUG_PRINT("info",("spider force_auto_increment=TRUE")); - } else { - force_auto_increment = FALSE; - DBUG_PRINT("info",("spider force_auto_increment=FALSE")); - } -*/ DBUG_PRINT("info",("spider auto_increment_mode=%d", auto_increment_mode)); DBUG_PRINT("info",("spider next_number_field=%lld", @@ -7815,7 +7832,12 @@ pthread_mutex_lock(&share->lgtm_tblhnd_share->auto_increment_mutex); if (!share->lgtm_tblhnd_share->auto_increment_init) { - info(HA_STATUS_AUTO); + if ((error_num= info(HA_STATUS_AUTO))) + { + pthread_mutex_unlock( + &share->lgtm_tblhnd_share->auto_increment_mutex); + DBUG_RETURN(error_num); + } share->lgtm_tblhnd_share->auto_increment_lclval = stats.auto_increment_value; share->lgtm_tblhnd_share->auto_increment_init = TRUE; @@ -8484,7 +8506,7 @@ if (form->s->keys > 0) { if (!(tmp_share.static_key_cardinality = (longlong *) - spider_bulk_malloc(spider_current_trx, 246, MYF(MY_WME), + spider_bulk_malloc(spider_current_trx, SPD_MID_HA_SPIDER_CREATE_1, MYF(MY_WME), &tmp_share.static_key_cardinality, (uint) (sizeof(*tmp_share.static_key_cardinality) * form->s->keys), NullS)) @@ -8499,7 +8521,7 @@ } } for (roop_count = 0; roop_count < form->s->keys; roop_count++) - tmp_share.key_hint[roop_count].init_calc_mem(85); + tmp_share.key_hint[roop_count].init_calc_mem(SPD_MID_HA_SPIDER_CREATE_2); DBUG_PRINT("info",("spider tmp_share.key_hint=%p", tmp_share.key_hint)); if ((error_num = spider_parse_connect_info(&tmp_share, form->s, form->part_info, @@ -8521,7 +8543,10 @@ if ( thd->lex->create_info.or_replace() && (error_num = spider_delete_tables( - table_tables, tmp_share.table_name, &dummy)) + table_tables, tmp_share.table_name, &dummy)) && + /* In this context, no key found in mysql.spider_tables means + the Spider table does not exist */ + error_num != HA_ERR_KEY_NOT_FOUND ) { goto error; } @@ -8948,12 +8973,6 @@ ) need_lock = TRUE; - if ((error_num = spider_sys_delete_table_sts( - current_thd, name, name_len, need_lock))) - goto error; - if ((error_num = spider_sys_delete_table_crd( - current_thd, name, name_len, need_lock))) - goto error; if ( !(table_tables = spider_open_sys_table( current_thd, SPIDER_SYS_TABLES_TABLE_NAME_STR, @@ -8966,6 +8985,10 @@ (error_num = spider_delete_tables( table_tables, name, &old_link_count)) ) { + /* In this context, no key found in mysql.spider_tables means + the Spider table does not exist */ + if (error_num == HA_ERR_KEY_NOT_FOUND) + error_num= HA_ERR_NO_SUCH_TABLE; goto error; } spider_close_sys_table(current_thd, table_tables, @@ -9017,27 +9040,35 @@ } int ha_spider::disable_indexes( - uint mode + key_map map, bool persist ) { int error_num; backup_error_status(); DBUG_ENTER("ha_spider::disable_indexes"); DBUG_PRINT("info",("spider this=%p", this)); - if ((error_num = spider_db_disable_keys(this))) - DBUG_RETURN(check_error_mode(error_num)); - DBUG_RETURN(0); + if (persist) + { + if ((error_num = spider_db_disable_keys(this))) + DBUG_RETURN(check_error_mode(error_num)); + DBUG_RETURN(0); + } + DBUG_RETURN(HA_ERR_WRONG_COMMAND); } int ha_spider::enable_indexes( - uint mode + key_map map, bool persist ) { int error_num; backup_error_status(); DBUG_ENTER("ha_spider::enable_indexes"); DBUG_PRINT("info",("spider this=%p", this)); - if ((error_num = spider_db_enable_keys(this))) - DBUG_RETURN(check_error_mode(error_num)); - DBUG_RETURN(0); + if (persist) + { + if ((error_num = spider_db_enable_keys(this))) + DBUG_RETURN(check_error_mode(error_num)); + DBUG_RETURN(0); + } + DBUG_RETURN(HA_ERR_WRONG_COMMAND); } @@ -9157,7 +9188,7 @@ { SPIDER_CONDITION *tmp_cond; if (!(tmp_cond = (SPIDER_CONDITION *) - spider_malloc(spider_current_trx, 3, sizeof(*tmp_cond), MYF(MY_WME))) + spider_malloc(spider_current_trx, SPD_MID_HA_SPIDER_COND_PUSH_1, sizeof(*tmp_cond), MYF(MY_WME))) ) DBUG_RETURN(cond); tmp_cond->cond = (COND *) cond; @@ -9786,7 +9817,7 @@ ) { if (spider_bit_is_set(result_list.tmp_table_created, roop_count)) { - uint dbton_id = share->use_sql_dbton_ids[roop_count]; + uint dbton_id = share->sql_dbton_ids[roop_count]; spider_db_handler *dbton_hdl = dbton_handler[dbton_id]; SPIDER_CONN *conn = conns[roop_count]; pthread_mutex_assert_not_owner(&conn->mta_conn_mutex); @@ -10079,6 +10110,15 @@ DBUG_VOID_RETURN; } +/* + Set the initial values for each dbton_handler's first_link_idx and + strict_group_by. + + First, reset first_link_idx to -1. + Then, for each active remote server, if the corresponding + dbton_handler has not been set yet (first_link_idx == -1), set its + first_link_idx to be the index of the connection. +*/ void ha_spider::set_first_link_idx() { int roop_count, all_link_idx; @@ -10118,6 +10158,16 @@ DBUG_VOID_RETURN; } +/* + Reset the initial values for each dbton_handler's first_link_idx to + -1. + + Also, set the search_link_idx'th active server's first_link_idx to + search_link_idx. + + search_link_idx is commonly randomly set using + spider_conn_first_link_idx - see the commentary of that function. +*/ void ha_spider::reset_first_link_idx() { int all_link_idx; diff -Nru mariadb-10.11.6/storage/spider/ha_spider.h mariadb-10.11.9/storage/spider/ha_spider.h --- mariadb-10.11.6/storage/spider/ha_spider.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/ha_spider.h 2024-08-03 07:29:59.000000000 +0000 @@ -65,8 +65,10 @@ char *conn_keys_first_ptr; char **conn_keys; SPIDER_CONN **conns; - /* for active-standby mode */ + /* array of indexes of active servers */ uint *conn_link_idx; + /* A bitmap indicating whether each active server have some higher + numbered server in the same "group" left to try (can fail over) */ uchar *conn_can_fo; void **quick_targets; int *need_mons; @@ -78,6 +80,7 @@ SPIDER_POSITION *pushed_pos; SPIDER_POSITION pushed_pos_buf; SPIDER_PARTITION_HANDLER *partition_handler; + /* Whether this ha_spider is the owner of its wide_handler. */ bool wide_handler_owner = FALSE; SPIDER_WIDE_HANDLER *wide_handler = NULL; @@ -123,7 +126,7 @@ #ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT bool auto_inc_temporary; #endif - int bulk_size; + int bulk_size= 0; int direct_dup_insert; int store_error_num; uint dup_key_idx; @@ -171,14 +174,14 @@ handler *clone( const char *name, MEM_ROOT *mem_root - ); + ) override; const char **bas_ext() const; int open( const char* name, int mode, uint test_if_locked - ); - int close(); + ) override; + int close() override; int check_access_kind_for_connection( THD *thd, bool write_request @@ -190,59 +193,56 @@ THD *thd, THR_LOCK_DATA **to, enum thr_lock_type lock_type - ); + ) override; int external_lock( THD *thd, int lock_type - ); + ) override; int start_stmt( THD *thd, thr_lock_type lock_type - ); - int reset(); + ) override; + int reset() override; int extra( enum ha_extra_function operation - ); - int index_init( - uint idx, - bool sorted - ); - int index_end(); + ) override; + int index_init(uint idx, bool sorted) override; + int index_end() override; int index_read_map( uchar *buf, const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag - ); + ) override; int index_read_last_map( uchar *buf, const uchar *key, key_part_map keypart_map - ); + ) override; int index_next( uchar *buf - ); + ) override; int index_prev( uchar *buf - ); + ) override; int index_first( uchar *buf - ); + ) override; int index_last( uchar *buf - ); + ) override; int index_next_same( uchar *buf, const uchar *key, uint keylen - ); + ) override; int read_range_first( const key_range *start_key, const key_range *end_key, bool eq_range, bool sorted - ); - int read_range_next(); + ) override; + int read_range_next() override; void reset_no_where_cond(); bool check_no_where_cond(); ha_rows multi_range_read_info_const( @@ -253,7 +253,7 @@ uint *bufsz, uint *flags, Cost_estimate *cost - ); + ) override; ha_rows multi_range_read_info( uint keyno, uint n_ranges, @@ -262,110 +262,100 @@ uint *bufsz, uint *flags, Cost_estimate *cost - ); + ) override; int multi_range_read_init( RANGE_SEQ_IF *seq, void *seq_init_param, uint n_ranges, uint mode, HANDLER_BUFFER *buf - ); + ) override; int multi_range_read_next( range_id_t *range_info - ); + ) override; int multi_range_read_next_first( range_id_t *range_info ); int multi_range_read_next_next( range_id_t *range_info ); - int rnd_init( - bool scan - ); - int rnd_end(); + int rnd_init(bool scan) override; + int rnd_end() override; int rnd_next( uchar *buf - ); + ) override; void position( const uchar *record - ); + ) override; int rnd_pos( uchar *buf, uchar *pos - ); + ) override; int cmp_ref( const uchar *ref1, const uchar *ref2 - ); - int ft_init(); - void ft_end(); + ) override; + int ft_init() override; + void ft_end() override; FT_INFO *ft_init_ext( uint flags, uint inx, String *key - ); + ) override; int ft_read( uchar *buf - ); + ) override; int pre_index_read_map( const uchar *key, key_part_map keypart_map, enum ha_rkey_function find_flag, bool use_parallel - ); - int pre_index_first(bool use_parallel); - int pre_index_last(bool use_parallel); + ) override; + int pre_index_first(bool use_parallel) override; + int pre_index_last(bool use_parallel) override; int pre_index_read_last_map( const uchar *key, key_part_map keypart_map, bool use_parallel - ); - int pre_multi_range_read_next( - bool use_parallel - ); + ) override; + int pre_multi_range_read_next(bool use_parallel) override; int pre_read_range_first( const key_range *start_key, const key_range *end_key, bool eq_range, bool sorted, bool use_parallel - ); - int pre_ft_read(bool use_parallel); - int pre_rnd_next(bool use_parallel); + ) override; + int pre_ft_read(bool use_parallel) override; + int pre_rnd_next(bool use_parallel) override; int info( uint flag - ); + ) override; ha_rows records_in_range( uint inx, const key_range *start_key, const key_range *end_key, page_range *pages - ); + ) override; int check_crd(); - int pre_records(); - ha_rows records(); - int pre_calculate_checksum(); - int calculate_checksum(); - const char *table_type() const; - ulonglong table_flags() const; + int pre_records() override; + ha_rows records() override; + int pre_calculate_checksum() override; + int calculate_checksum() override; + const char *table_type() const override; + ulonglong table_flags() const override; ulong table_flags_for_partition(); - const char *index_type( - uint key_number - ); - ulong index_flags( - uint idx, - uint part, - bool all_parts - ) const; - uint max_supported_record_length() const; - uint max_supported_keys() const; - uint max_supported_key_parts() const; - uint max_supported_key_length() const; - uint max_supported_key_part_length() const; - uint8 table_cache_type(); - bool need_info_for_auto_inc(); + const char *index_type(uint key_number) override; + ulong index_flags(uint idx, uint part, bool all_parts) const override; + uint max_supported_record_length() const override; + uint max_supported_keys() const override; + uint max_supported_key_parts() const override; + uint max_supported_key_length() const override; + uint max_supported_key_part_length() const override; + uint8 table_cache_type() override; + bool need_info_for_auto_inc() override; #ifdef HANDLER_HAS_CAN_USE_FOR_AUTO_INC_INIT - bool can_use_for_auto_inc_init(); + bool can_use_for_auto_inc_init() override; #endif int update_auto_increment(); void get_auto_increment( @@ -374,38 +364,29 @@ ulonglong nb_desired_values, ulonglong *first_value, ulonglong *nb_reserved_values - ); - int reset_auto_increment( - ulonglong value - ); - void release_auto_increment(); - void start_bulk_insert( - ha_rows rows, - uint flags - ); - int end_bulk_insert(); - int write_row( - const uchar *buf - ); + ) override; + int reset_auto_increment(ulonglong value) override; + void release_auto_increment() override; + void start_bulk_insert(ha_rows rows, uint flags) override; + int end_bulk_insert() override; + int write_row(const uchar *buf) override; void direct_update_init( THD *thd, bool hs_request ); - bool start_bulk_update(); - int exec_bulk_update( - ha_rows *dup_key_found - ); - int end_bulk_update(); + bool start_bulk_update() override; + int exec_bulk_update(ha_rows *dup_key_found) override; + int end_bulk_update() override; #ifdef SPIDER_UPDATE_ROW_HAS_CONST_NEW_DATA int bulk_update_row( const uchar *old_data, const uchar *new_data, ha_rows *dup_key_found - ); + ) override; int update_row( const uchar *old_data, const uchar *new_data - ); + ) override; #else int bulk_update_row( const uchar *old_data, @@ -422,107 +403,95 @@ longlong select_limit, longlong offset_limit ); - int direct_update_rows_init( - List *update_fields - ); - int direct_update_rows( - ha_rows *update_rows, - ha_rows *found_row - ); - bool start_bulk_delete(); - int end_bulk_delete(); - int delete_row( - const uchar *buf - ); + int direct_update_rows_init(List *update_fields) override; + int direct_update_rows(ha_rows *update_rows, ha_rows *found_row) override; + bool start_bulk_delete() override; + int end_bulk_delete() override; + int delete_row(const uchar *buf) override; bool check_direct_delete_sql_part( st_select_lex *select_lex, longlong select_limit, longlong offset_limit ); - int direct_delete_rows_init(); - int direct_delete_rows( - ha_rows *delete_rows - ); - int delete_all_rows(); - int truncate(); - double scan_time(); + int direct_delete_rows_init() override; + int direct_delete_rows(ha_rows *delete_rows) override; + int delete_all_rows() override; + int truncate() override; + double scan_time() override; double read_time( uint index, uint ranges, ha_rows rows - ); - const key_map *keys_to_use_for_scanning(); - ha_rows estimate_rows_upper_bound(); + ) override; + const key_map *keys_to_use_for_scanning() override; + ha_rows estimate_rows_upper_bound() override; void print_error( int error, myf errflag - ); + ) override; bool get_error_message( int error, String *buf - ); + ) override; int create( const char *name, TABLE *form, HA_CREATE_INFO *info - ); + ) override; void update_create_info( HA_CREATE_INFO* create_info - ); + ) override; int rename_table( const char *from, const char *to - ); + ) override; int delete_table( const char *name - ); - bool is_crashed() const; + ) override; + bool is_crashed() const override; #ifdef SPIDER_HANDLER_AUTO_REPAIR_HAS_ERROR - bool auto_repair(int error) const; + bool auto_repair(int error) const override; #else bool auto_repair() const; #endif int disable_indexes( - uint mode - ); + key_map map, bool persist + ) override; int enable_indexes( - uint mode - ); + key_map map, bool persist + ) override; int check( THD* thd, HA_CHECK_OPT* check_opt - ); + ) override; int repair( THD* thd, HA_CHECK_OPT* check_opt - ); + ) override; bool check_and_repair( THD *thd - ); + ) override; int analyze( THD* thd, HA_CHECK_OPT* check_opt - ); + ) override; int optimize( THD* thd, HA_CHECK_OPT* check_opt - ); + ) override; bool is_fatal_error( int error_num, uint flags - ); + ) override; Field *field_exchange( Field *field ); const COND *cond_push( const COND* cond - ); - void cond_pop(); - int info_push( - uint info_type, - void *info - ); - void return_record_by_parent(); + ) override; + void cond_pop() override; + int info_push(uint info_type, void *info) override; + void return_record_by_parent() override; TABLE *get_table(); void set_ft_discard_bitmap(); void set_searched_bitmap(); @@ -792,3 +761,26 @@ int lock_tables(); int dml_init(); }; + + +/* This is a hack for ASAN + * Libraries such as libxml2 and libodbc do not like being unloaded before + * exit and will show as a leak in ASAN with no stack trace (as the plugin + * has been unloaded from memory). + * + * The below is designed to trick the compiler into adding a "UNIQUE" symbol + * which can be seen using: + * readelf -s storage/spider/ha_spider.so | grep UNIQUE + * + * Having this symbol means that the plugin remains in memory after dlclose() + * has been called. Thereby letting the libraries clean up properly. + */ +#if defined(__SANITIZE_ADDRESS__) +__attribute__((__used__)) +inline int dummy(void) +{ + static int d; + d++; + return d; +} +#endif diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider3_fixes.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider3_fixes_part.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider_fixes.result mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider_fixes.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider_fixes.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider_fixes.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bg/r/spider_fixes_part.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc mariadb-10.11.9/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc --- mariadb-10.11.6/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bg/t/slave_test_init.inc 2024-08-03 07:29:59.000000000 +0000 @@ -19,7 +19,7 @@ MASTER_PORT = $MASTER_1_MYPORT ; } -START SLAVE; +--source include/start_slave.inc --connection master_1 call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --connection slave1_1 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/disabled.def mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/disabled.def --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/disabled.def 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/disabled.def 2024-08-03 07:29:59.000000000 +0000 @@ -1,3 +1,4 @@ wait_timeout : MDEV-26045 -mdev_29904 : MDEV-31101 mdev_27239: MDEV-32046 +mdev_27575 : MDEV-32997 +mdev_28739_simple : MDEV-33343 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_deinit.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ ---connection master_1 -alter table mysql.spider_table_sts add column checksum bigint unsigned default null after update_time; -DROP DATABASE IF EXISTS auto_test_local; - ---let $MASTER_1_COMMENT_2_1= $MASTER_1_COMMENT_2_1_BACKUP ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_deinit.inc ---enable_result_log ---enable_query_log ---enable_warnings diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/include/spider_table_sts_init.inc 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ ---disable_warnings ---disable_query_log ---disable_result_log ---source ../t/test_init.inc ---enable_result_log ---enable_query_log ---enable_warnings ---let $MASTER_1_COMMENT_2_1_BACKUP= $MASTER_1_COMMENT_2_1 -let $MASTER_1_COMMENT_2_1= - COMMENT='table "tbl_a", host "127.0.0.1", port "$MASTER_1_MYPORT", user "root"'; ---connection master_1 -alter table mysql.spider_table_sts drop column checksum; -insert into mysql.spider_table_sts values ('auto_test_local', 'tbl_a', 0, 0, 0, 0, 0, '2019-01-01 00:00:00', '2019-01-01 00:00:00', '2019-01-01 00:00:00'); diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_default.result 2024-08-03 07:29:59.000000000 +0000 @@ -5,6 +5,7 @@ child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; connection master_1; set @old_binlog_format= @@binlog_format; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mariadb.result 2024-08-03 07:29:59.000000000 +0000 @@ -5,6 +5,7 @@ child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; connection master_1; set @old_binlog_format= @@binlog_format; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/delete_with_float_column_mysql.result 2024-08-03 07:29:59.000000000 +0000 @@ -5,6 +5,7 @@ child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; connection master_1; set @old_binlog_format= @@binlog_format; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/gbh_outer_fields_in_join.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,50 @@ +# +# MDEV-26247 Spider: Valid LEFT JOIN results in ERROR 1064 +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +CREATE TABLE t1 (a int) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE t2 (a int) ENGINE=InnoDB DEFAULT CHARSET=utf8; +CREATE TABLE t3 (a int) ENGINE=InnoDB DEFAULT CHARSET=utf8; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1), (2); +INSERT INTO t3 VALUES (1), (2), (3); +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE t1 (a int) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='srv "s_2_1", table "t1"'; +CREATE TABLE t2 (a int) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='srv "s_2_1", table "t2"'; +CREATE TABLE t3 (a int) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='srv "s_2_1", table "t3"'; +select * from t3 left join t1 on t3.a = t1.a left join t2 on t3.a = t2.a; +a a a +1 1 1 +2 NULL 2 +3 NULL NULL +select * from t1 left join t2 on t1.a = t2.a right join t3 on t3.a = t1.a; +a a a +1 1 1 +NULL NULL 2 +NULL NULL 3 +select * from t3 left join (t1 left join t2 on t1.a = t2.a) on t3.a = t1.a; +a a a +1 1 1 +2 NULL NULL +3 NULL NULL +drop table t1, t2, t3; +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26151.result 2024-08-03 07:29:59.000000000 +0000 @@ -6,6 +6,9 @@ for child3 set @old_spider_bgs_mode= @@spider_bgs_mode; set session spider_bgs_mode=1; +set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); create table td (a int, PRIMARY KEY (a)); create table ts (a int, PRIMARY KEY (a)) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_26151",TABLE "td", casual_read "3"'; @@ -26,6 +29,7 @@ drop table td, ts; drop server srv_mdev_26151; set session spider_bgs_mode=@old_spider_bgs_mode; +set global spider_same_server_link=@old_spider_same_server_link; for master_1 for child2 for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26247.result 2024-08-03 07:29:59.000000000 +0000 @@ -28,8 +28,6 @@ INSERT INTO t2 VALUES (1, 11), (2, 22), (3, 33); INSERT INTO t3 VALUES (1, 111), (2, 222), (3, 333); connection master_1; -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; CREATE DATABASE auto_test_local; USE auto_test_local; CREATE TABLE t1 ( @@ -82,7 +80,6 @@ 22 connection master_1; DROP DATABASE IF EXISTS auto_test_local; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; connection child2_1; DROP DATABASE IF EXISTS auto_test_remote; for master_1 @@ -91,6 +88,3 @@ child2_2 child2_3 for child3 -# -# end of test mdev_26247 -# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result 2024-08-03 07:29:59.000000000 +0000 @@ -2,18 +2,3 @@ # MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds # INSTALL SONAME 'ha_spider.so'; -DROP FUNCTION spider_flush_table_mon_cache; -DROP FUNCTION spider_copy_tables; -DROP FUNCTION spider_ping_table; -DROP FUNCTION spider_bg_direct_sql; -DROP FUNCTION spider_direct_sql; -UNINSTALL SONAME IF EXISTS "ha_spider"; -DROP TABLE IF EXISTS mysql.spider_xa; -DROP TABLE IF EXISTS mysql.spider_xa_member; -DROP TABLE IF EXISTS mysql.spider_xa_failed_log; -DROP TABLE IF EXISTS mysql.spider_tables; -DROP TABLE IF EXISTS mysql.spider_link_mon_servers; -DROP TABLE IF EXISTS mysql.spider_link_failed_log; -DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; -DROP TABLE IF EXISTS mysql.spider_table_sts; -DROP TABLE IF EXISTS mysql.spider_table_crd; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result 2024-08-03 07:29:59.000000000 +0000 @@ -66,9 +66,6 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE argument LIKE 'select `id`,`greeting` from %'; argument -select `id`,`greeting` from `auto_test_remote`.`tbl_a` where `greeting` = 'Aloha!' and ((`greeting` = 'Aloha!')) -select `id`,`greeting` from `auto_test_remote`.`tbl_b` where `greeting` like 'Aloha%' and ((`greeting` = 'Aloha!')) -select `id`,`greeting` from `auto_test_remote`.`tbl_c` where `greeting` like 'Aloha%' and ((`greeting` = 'Aloha!')) connection child2_1; SET @@global.general_log = @general_log_backup; SET @@global.log_output = @log_output_backup; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27186.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,34 @@ +INSTALL SONAME 'ha_spider'; +Warnings: +Warning 1105 Cannot enable tc-log at run-time. XA features of SPIDER are disabled +CREATE TABLE t (s INT) ENGINE=SPIDER PARTITION BY HASH (s); +LOAD INDEX INTO CACHE t PARTITION (p,p1); +Table Op Msg_type Msg_text +test.t preload_keys Error Unable to connect to foreign data source: localhost +test.t preload_keys Error Unable to connect to foreign data source: localhost +test.t preload_keys Error Unable to connect to foreign data source: localhost +test.t preload_keys Error Unable to connect to foreign data source: localhost +test.t preload_keys error Corrupt +DROP TABLE t; +CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY KEY() PARTITIONS 2; +HANDLER t OPEN AS h; +ERROR HY000: Unable to connect to foreign data source: localhost +DROP TABLE t; +CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY HASH (c) PARTITIONS 2; +CREATE TRIGGER t AFTER INSERT ON t FOR EACH ROW INSERT INTO t VALUES(0); +ERROR HY000: Unable to connect to foreign data source: localhost +DROP TABLE t; +CREATE TABLE t (b INT) ENGINE=InnoDB; +PREPARE s FROM 'SELECT * FROM t LIMIT 2'; +DROP TABLE t; +CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3)); +EXECUTE s; +ERROR HY000: Unable to connect to foreign data source: localhost +DROP TABLE t; +CREATE TABLE t (c INT) ENGINE=InnoDB; +LOCK TABLES t WRITE; +CREATE OR REPLACE TABLE t (d INT) ENGINE=Spider PARTITION BY LIST COLUMNS (d) (PARTITION p VALUES IN (0)); +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27575.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,17 @@ +# +# MDEV-27575 Spider: UBSAN member access within null pointer of type 'struct st_plugin_int and SIGSEGV in intern_plugin_lock on SHUTDOWN when setting Spider as default storage engine (temporary or global) +# +for master_1 +for child2 +for child3 +SET GLOBAL default_tmp_storage_engine=spider; +ERROR HY000: Table storage engine 'SPIDER' does not support the create option 'TEMPORARY' +# restart +SET GLOBAL default_storage_engine=Spider; +# restart +for master_1 +for child2 +for child3 +# +# end of test mdev_27575 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27902.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27902.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_27902.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_27902.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,49 @@ +# +# MDEV-27902 Crashes, asserts, hangs and corruptions in Spider when using HANDLER +# +for master_1 +for child2 +for child3 +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c INT) ENGINE=Spider; +HANDLER t OPEN; +Warnings: +Error 1429 Unable to connect to foreign data source: localhost +Error 1429 Unable to connect to foreign data source: localhost +HANDLER t READ next; +ERROR HY000: Unable to connect to foreign data source: localhost +dummy; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'dummy' at line 1 +HANDLER t READ next; +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +CREATE TABLE t (c INT) ENGINE=Spider; +HANDLER t OPEN; +Warnings: +Error 1429 Unable to connect to foreign data source: localhost +Error 1429 Unable to connect to foreign data source: localhost +HANDLER t READ FIRST; +ERROR HY000: Unable to connect to foreign data source: localhost +HANDLER t READ NEXT; +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +CREATE TABLE t (c INT) ENGINE=Spider; +HANDLER t OPEN; +Warnings: +Error 1429 Unable to connect to foreign data source: localhost +Error 1429 Unable to connect to foreign data source: localhost +HANDLER t READ NEXT; +ERROR HY000: Unable to connect to foreign data source: localhost +SELECT * FROM t; +ERROR HY000: Unable to connect to foreign data source: localhost +HANDLER t READ NEXT; +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test mdev_27902 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28105.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28105.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28105.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28105.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +install soname 'ha_spider'; +Warnings: +Warning 1105 Cannot enable tc-log at run-time. XA features of SPIDER are disabled +SET @@insert_id=128; +CREATE TABLE t(c TINYINT AUTO_INCREMENT KEY) ENGINE=Spider; +INSERT IGNORE INTO t VALUES(0); +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28683.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,22 @@ +# +# MDEV-28683 Spider: SIGSEGV in spider_db_direct_delete, SIGSEGV in spider_db_connect, ASAN: heap-use-after-free in spider_db_direct_delete +# +for master_1 +for child2 +for child3 +CREATE TABLE t (c INT) ENGINE=Spider; +SELECT * FROM t; +ERROR HY000: Unable to connect to foreign data source: localhost +INSERT INTO t (SELECT 1 FROM t); +ERROR HY000: Unable to connect to foreign data source: localhost +LOCK TABLES t WRITE CONCURRENT; +DELETE FROM t; +ERROR HY000: Unable to connect to foreign data source: localhost +UNLOCK TABLES; +DROP TABLE t; +for master_1 +for child2 +for child3 +# +# end of test mdev_28683 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28739.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,34 @@ +# +# MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +CREATE TABLE tbl_a (id INT); +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +set global query_cache_type= on; +set spider_same_server_link = on; +CREATE TABLE tbl_a ( +id INT +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"'; +SELECT * FROM tbl_a; +id +# restart +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28739_simple.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,21 @@ +# +# MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache +# +for master_1 +for child2 +for child3 +set global query_cache_type= on; +set spider_same_server_link=1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +SELECT * FROM t1; +c +# restart +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28856.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,6 +4,9 @@ for master_1 for child2 for child3 +set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); # testing monitoring_* @@ -172,6 +175,7 @@ 93 drop table t1, t2; drop server srv; +set global spider_same_server_link=@old_spider_same_server_link; for master_1 for child2 for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_28998.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,8 +4,7 @@ for master_1 for child2 for child3 -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; +set spider_same_server_link=1; CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2); @@ -17,7 +16,6 @@ 2 DROP TABLE t2, t1_SPIDER, t1; drop server s; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; for master_1 for child2 for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29002.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,34 @@ +for master_1 +for child2 +for child3 +SET spider_same_server_link= on; +CREATE SERVER s FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (a INT); +CREATE TABLE t1_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'"; +CREATE TABLE t2_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'"; +SELECT * FROM t1_spider, t2_spider; +a a +SELECT table_name, index_name, cardinality FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name IN ('t1_spider','t2_spider'); +table_name index_name cardinality +RENAME TABLE t1_spider TO t3_spider; +SELECT * FROM t3_spider; +a +DROP TABLE t3_spider, t2_spider, t; +drop server s; +CREATE TABLE t1 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"'; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"'; +CREATE TABLE t3 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"'; +SHOW TABLE STATUS; +Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary +t1 SPIDER 10 NULL 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL Unable to connect to foreign data source: srv 0 +t2 SPIDER 10 NULL 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL Unable to connect to foreign data source: srv 0 +t3 SPIDER 10 NULL 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL Unable to connect to foreign data source: srv 0 +Warnings: +Warning 1429 Unable to connect to foreign data source: srv +Warning 1429 Unable to connect to foreign data source: srv +Warning 1429 Unable to connect to foreign data source: srv +drop table t1, t2, t3; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29027.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29027.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29027.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29027.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,24 @@ +# +# MDEV-29027 ASAN errors in spider_db_free_result after partition DDL +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE tbl_a ( +c INT +) ENGINE=Spider DEFAULT CHARSET=utf8 PARTITION BY HASH(c) ( +PARTITION pt1 +); +ALTER TABLE tbl_a ADD PARTITION (PARTITION pt2); +DROP DATABASE auto_test_local; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29027_original.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29027_original.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29027_original.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29027_original.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,15 @@ +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t1 (a INT); +CREATE TABLE t_spider (a INT) ENGINE=SPIDER PARTITION BY HASH(a) (PARTITION p1 COMMENT = "wrapper 'mysql', srv 'srv', table 't1'"); +CREATE TABLE t2 (a INT); +ALTER TABLE t_spider ADD PARTITION (PARTITION p2 COMMENT = "wrapper 'mysql', srv 'srv', table 't2'"); +DROP TABLE t_spider, t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29163.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,8 +4,7 @@ for master_1 for child2 for child3 -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; +set spider_same_server_link=1; CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 (a INT); CREATE TABLE t2 (b INT); @@ -17,7 +16,6 @@ a DROP TABLE t1_spider, t2_spider, t3_spider, t1, t2, t3; drop server s; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; for master_1 for child2 for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29421.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,19 @@ +for master_1 +for child2 +for child3 +set @old_table_open_cache=@@global.table_open_cache; +set global table_open_cache=10; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t_s (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv", TABLE "t"'; +CREATE TABLE t1 (a INT) ENGINE=Spider; +SELECT * FROM t1; +ERROR HY000: Unable to connect to foreign data source: localhost +SELECT * FROM information_schema.tables; +DROP TABLE t, t_s, t1; +drop server srv; +set global table_open_cache=@old_table_open_cache; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29456.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,42 @@ +# +# MDEV-29456 Spider hangs in 'Waiting for table metadata lock' state on CREATE TABLE after LOCK TABLES +# +for master_1 +for child2 +for child3 +set spider_same_server_link=1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t1 (c int); +create table t2 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +CREATE TABLE t3 (c INT KEY) ENGINE=Spider; +LOCK TABLE t2 WRITE; +LOCK TABLE t3 WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +UNLOCK TABLES; +drop table t1, t2, t3; +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t1 (c INT) ENGINE=Spider; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +LOCK TABLES t2 WRITE; +LOCK TABLES t1 READ; +ERROR HY000: Unable to connect to foreign data source: localhost +CREATE TABLE t (c INT) ENGINE=Spider; +ERROR 42S01: Table 't' already exists +drop table t, t1, t2; +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +CREATE TABLE t3 (c INT) ENGINE=InnoDB; +LOCK TABLES t2 WRITE; +LOCK TABLES mysql.proc WRITE,mysql.user WRITE; +ERROR HY000: You can't combine write-locking of system tables with other tables or lock types +INSERT INTO t3 SELECT * FROM t; +drop table t, t2, t3; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test mdev_29456 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,6 +4,7 @@ for master_1 for child2 for child3 +set spider_same_server_link=1; CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t (a INT); INSERT INTO t VALUES (23),(48); diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29667.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,40 @@ +# +# MDEV-29667 Server hangs on DROP DATABASE after failing LOCK TABLES on Spider table +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +CREATE TABLE tbl_a ( +a INT +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE tbl_a ( +a INT +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"'; +CREATE TABLE tbl_b ( +a INT +) ENGINE=Spider DEFAULT CHARSET=utf8; +LOCK TABLES tbl_a WRITE; +LOCK TABLES tbl_b READ, tbl_a READ; +ERROR HY000: Unable to connect to foreign data source: localhost +connection master_1; +DROP DATABASE IF EXISTS auto_test_local; +connection child2_1; +DROP DATABASE IF EXISTS auto_test_remote; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +# +# end of test mdev_29667 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29962.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29962.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29962.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29962.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,23 @@ +# +# MDEV-29962 SIGSEGV in ha_spider::lock_tables on BEGIN after table lock +# +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t1 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +SELECT * FROM t1; +c +LOCK TABLES t1 WRITE CONCURRENT,t1 AS t2 READ; +BEGIN; +drop table t, t1; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test mdev_29962 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_29963.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,44 @@ +# +# MDEV-29963 SIGSEGV in spider_db_mbase::append_lock_tables on LOCK TABLES +# +for master_1 +for child2 +for child3 +set spider_same_server_link=1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (a INT) ENGINE=Spider; +CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +LOCK TABLES t AS a READ,t2 AS b LOW_PRIORITY WRITE,t2 AS c WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +DROP TABLE t2; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +LOCK TABLES t2 WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +DROP TABLE t2,t; +CREATE TABLE t (a INT); +CREATE TABLE t1 (a INT) ENGINE=Spider; +CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +LOCK TABLES t1 READ, t2 WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +DROP TABLE t2; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +LOCK TABLES t2 WRITE; +UNLOCK TABLES; +DROP TABLE t, t1, t2; +CREATE TABLE t1 (c INT) ENGINE=Spider; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT="WRAPPER 'mysql',srv 'srv',TABLE 't1'"; +LOCK TABLES t1 WRITE,t2 WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +TRUNCATE t2; +ERROR HY000: Unable to connect to foreign data source: localhost +LOCK TABLES t2 AS o WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test mdev_29963 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30014.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,37 @@ +# +# MDEV-30014 heap-use-after-free in ha_spider::lock_tables(), highly sporadic SIGSEGV in intern_close_table +# +for master_1 +for child2 +for child3 +set spider_same_server_link=1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t1 (c int); +create table t2 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +CREATE TABLE t3 (c INT KEY) ENGINE=Spider; +LOCK TABLE t2 WRITE,t3 WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +CREATE TABLE t4 (c INT) ENGINE=Spider; +FLUSH NO_WRITE_TO_BINLOG TABLES t4 WITH READ LOCK; +Warnings: +Error 1429 Unable to connect to foreign data source: localhost +Error 1429 Unable to connect to foreign data source: localhost +UNLOCK TABLES; +drop table t1, t2, t3, t4; +create table t1 (c int); +create table t2 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +CREATE TABLE t3 (c INT KEY) ENGINE=Spider; +LOCK TABLE t2 WRITE, t3 WRITE; +ERROR HY000: Unable to connect to foreign data source: localhost +UNLOCK TABLES; +drop table t1, t2, t3; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test mdev_30014 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30170.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,7 @@ +install soname 'ha_spider'; +DROP TABLE non_existing_table; +ERROR 42S02: Unknown table 'test.non_existing_table' +create or replace table non_existing_table (c int) engine=Spider; +drop table non_existing_table; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30392.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,8 +4,7 @@ for master_1 for child2 for child3 -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; +set spider_same_server_link=1; CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2); @@ -16,7 +15,6 @@ 2 DROP TABLE t1, t2; DROP SERVER srv; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; for master_1 for child2 for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30408.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30408.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30408.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30408.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,30 @@ +for master_1 +for child2 +for child3 +set @@optimizer_switch="semijoin=off"; +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table ten(a int primary key); +insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t2 (a int, b int); +insert into t2 select a,a from ten; +create table t1 (a int, b int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +select a.a, a.b from t1 a where exists (select * from t1 b where b.b = a.b); +a b +0 0 +1 1 +2 2 +3 3 +4 4 +5 5 +6 6 +7 7 +8 8 +9 9 +drop table ten, t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_30727.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,24 @@ +CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); +ERROR HY000: Can't initialize function 'spider_direct_sql'; Plugin 'SPIDER' is not loaded +CREATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_bg_direct_sql ('SELECT * FROM s','a','srv "b"'); +ERROR HY000: Can't initialize function 'spider_bg_direct_sql'; Plugin 'SPIDER' is not loaded +CREATE FUNCTION spider_copy_tables RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_copy_tables ('t', '0', '0'); +ERROR HY000: Can't initialize function 'spider_copy_tables'; Plugin 'SPIDER' is not loaded +CREATE FUNCTION spider_flush_table_mon_cache RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_flush_table_mon_cache (); +spider_flush_table_mon_cache () +1 +install soname 'ha_spider'; +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); +ERROR HY000: The foreign server name you are trying to reference does not exist. Data source error: b +call mtr.add_suppression(".*\\[Error\\] (mysqld|mariadbd): Can't find record in 'spider_tables'"); +SELECT spider_copy_tables ('t', '0', '0'); +ERROR HY000: Can't find record in 'spider_tables' +SELECT spider_flush_table_mon_cache (); +spider_flush_table_mon_cache () +1 +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,6 +4,7 @@ for master_1 for child2 for child3 +set spider_same_server_link=1; CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t (c BLOB) ENGINE=InnoDB; CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31475.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31475.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31475.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31475.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,23 @@ +for master_1 +for child2 +for child3 +CREATE TABLE t3 (c1 MEDIUMINT NULL, c2 CHAR(5)) ENGINE=Spider PARTITION BY KEY(c1) PARTITIONS 2; +ALTER TABLE t3 DROP PRIMARY KEY; +ERROR 42000: Can't DROP INDEX `PRIMARY`; check that it exists +SELECT * FROM t3 WHERE c1 <=> '1000-00-01 00:00:00' ORDER BY c1,c2 LIMIT 2; +ERROR HY000: Unable to connect to foreign data source: localhost +CREATE TABLE t1 (a INT UNSIGNED NOT NULL PRIMARY KEY, b INT UNSIGNED NOT NULL, c INT UNSIGNED, UNIQUE (b, c) USING HASH) ENGINE=Spider; +SELECT t1.c1 FROM t3 RIGHT JOIN t1 ON t1.c1=current_date() UNION SELECT t1.c2 FROM t1 LEFT OUTER JOIN t3 ON t1.c2; +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t1, t3; +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t1 (a INT, b VARCHAR(255), PRIMARY KEY(a)) ENGINE=Spider PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (3), PARTITION p2 VALUES LESS THAN MAXVALUE COMMENT='srv "srv"'); +DROP SERVER srv; +SELECT * FROM t1; +ERROR HY000: The foreign server name you are trying to reference does not exist. Data source error: srv +drop table t1; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result 2024-08-03 07:29:59.000000000 +0000 @@ -5,6 +5,7 @@ for child2 for child3 SET @old_spider_read_only_mode = @@session.spider_read_only_mode; +set spider_same_server_link=1; CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); set session spider_read_only_mode = default; create table t2 (c int); diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31645.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,22 +4,17 @@ for master_1 for child2 for child3 -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; +set spider_same_server_link=1; CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a)); CREATE TABLE t2 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a)) ENGINE=SPIDER COMMENT='srv "srv", WRAPPER "mysql", TABLE "t1"'; -SET SESSION optimizer_switch='semijoin=off'; -SELECT * FROM t2 -WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20); +SELECT * FROM t2 WHERE b IN (SELECT b FROM t2 WHERE a > 10); a b -SET SESSION optimizer_switch='semijoin=on'; SELECT * FROM t2 WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20); a b drop table t1, t2; drop server srv; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; for master_1 for child2 for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_31996.result 2024-08-03 07:29:59.000000000 +0000 @@ -1,6 +1,7 @@ for master_1 for child2 for child3 +set spider_same_server_link=1; CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); set session spider_delete_all_rows_type=0; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32492.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32492.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32492.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32492.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,67 @@ +# +# MDEV-32492 SIGSEGV in spider_conn_first_link_idx on DELETE +# +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c INT, PRIMARY KEY(c)) ENGINE=Spider; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `c` int(11) NOT NULL, + PRIMARY KEY (`c`) +) ENGINE=SPIDER DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +Warnings: +Error 1429 Unable to connect to foreign data source: localhost +Error 1429 Unable to connect to foreign data source: localhost +DROP TABLE t; +CREATE TABLE t (c INT) ENGINE=Spider COMMENT='port "1 1"'; +DELETE FROM t; +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +CREATE TABLE t1 (a INT,b VARCHAR(255),PRIMARY KEY(a)) ENGINE=Spider comment="srv 'srv', table 't1', read_only_mode '1'"; +INSERT INTO t1 VALUES (1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd'); +ERROR HY000: Table 'test.t1' is read only +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) NOT NULL, + `b` varchar(255) DEFAULT NULL, + PRIMARY KEY (`a`) +) ENGINE=SPIDER DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='srv ''srv'', table ''t1'', read_only_mode ''1''' +Warnings: +Error 12719 An infinite loop is detected when opening table test.t1 +DROP TABLE t1; +CREATE TABLE t1 (a INT) ENGINE=Spider comment="port '123 456'"; +INSERT IGNORE INTO t1 VALUES (42),(42); +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t1; +CREATE TABLE t1 (c INT, KEY(c)) ENGINE=Spider COMMENT='WRAPPER "mysql", SRV "srv",TABLE "t2", PK_NAME "f"'; +SET GLOBAL general_log=1; +INSERT INTO t1 VALUES (1, "aaa"),(2, "bbb"),(3, "ccc"),(4, "ddd"); +ERROR 21S01: Column count doesn't match value count at row 1 +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `c` int(11) DEFAULT NULL, + KEY `c` (`c`) +) ENGINE=SPIDER DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='WRAPPER "mysql", SRV "srv",TABLE "t2", PK_NAME "f"' +Warnings: +Error 12702 Remote table 'test.t2' is not found +DROP TABLE t1; +CREATE TABLE t1 (a INT) ENGINE=Spider comment='port "123 456"'; +SELECT * FROM t1; +ERROR HY000: Unable to connect to foreign data source: localhost +INSERT IGNORE INTO t1 VALUES (42),(42); +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t1; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test mdev_32492 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +# +# MDEV-32753 Spider engine does not load in ORACLE mode +# +select * from mysql.plugin; +name dl +create table t (c int) Engine=SPIDER; +drop table t; +# +# end of test mdev_32753 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,14 @@ +# +# MDEV-32753 Spider engine does not load in ORACLE mode +# +install soname 'ha_spider'; +select * from mysql.plugin; +name dl +SPIDER ha_spider.so +SPIDER_ALLOC_MEM ha_spider.so +SPIDER_WRAPPER_PROTOCOLS ha_spider.so +create table t (c int) Engine=SPIDER; +drop table t; +# +# end of test mdev_32753_after_start +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32753_after_start_session.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,17 @@ +# +# MDEV-32753 Spider engine does not load in ORACLE mode +# +set @old_sql_mode=@@sql_mode; +SET @@sql_mode = CONCAT(@@sql_mode, ',ORACLE'); +install soname 'ha_spider'; +select * from mysql.plugin; +name dl +SPIDER ha_spider.so +SPIDER_ALLOC_MEM ha_spider.so +SPIDER_WRAPPER_PROTOCOLS ha_spider.so +create table t (c int) Engine=SPIDER; +drop table t; +set sql_mode=@old_sql_mode; +# +# end of test mdev_32753_after_start +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_32986.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,24 @@ +# +# MDEV-32907 +# +for master_1 +for child2 +for child3 +set spider_same_server_link=1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c varchar(16)); +create table t1 (c varchar(16)) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +insert into t1 values ('TestSpiderRegex'); +select c from t1 where c regexp '(Test|Spider|Regex)'; +c +TestSpiderRegex +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test mdev_32907 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33008.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,25 @@ +for master_1 +for child2 +for child3 +set spider_same_server_link=on; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`code` varchar(10) DEFAULT NULL, +PRIMARY KEY (`id`) +); +create table t1 ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `code` varchar(10) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=SPIDER DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"' +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33191.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,14 @@ +INSTALL SONAME 'ha_spider'; +set spider_same_server_link=on; +CREATE TABLE t2(c INT); +CREATE TABLE t1(c INT) ENGINE=Spider COMMENT='socket "$SOCKET", user "root", table "t2 t3"'; +Warnings: +Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release +ALTER TABLE t1 ENGINE=Spider; +Warnings: +Warning 138 The high availability feature of Spider has been deprecated and will be removed in a future release +TRUNCATE TABLE t1; +ERROR 42S02: Table 'test.t3' doesn't exist +drop table t1, t2; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33242.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,4 @@ +set @old_old_mode=@@global.old_mode; +set global old_mode=4; +INSTALL SONAME 'ha_spider.so'; +set global old_mode=@old_old_mode; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33434.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,12 @@ +# +# MDEV-33434 MDEV-33434 UBSAN null pointer passed as argument 2, which is declared to never be null in spider_udf_direct_sql_create_conn +# +INSTALL SONAME 'ha_spider'; +SET character_set_connection=ucs2; +SELECT SPIDER_DIRECT_SQL('SELECT SLEEP(1)', '', 'srv "dummy", port "3307"'); +ERROR HY000: Unable to connect to foreign data source: localhost +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +# +# end of test mdev_33434 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33441.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,7 @@ +# +# MDEV-33441 No spider variables available is Spider is loaded upon server startup +# +set spider_same_server_link=0; +# +# end of test mdev_33441 +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33441_fail.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +# +# MDEV-33441 No spider variables available is Spider is loaded upon server startup +# +select * from mysql.plugin; +name dl +show variables like 'spider%'; +Variable_name Value +# +# end of test mdev_33441_fail +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33494.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,4 @@ +set @old_sql_mode=@@global.sql_mode; +set global sql_mode=(SELECT CONCAT (@@sql_mode,',no_zero_date')); +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33538.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,12 @@ +show create table information_schema.SPIDER_ALLOC_MEM; +Table Create Table +SPIDER_ALLOC_MEM CREATE TEMPORARY TABLE `SPIDER_ALLOC_MEM` ( + `ID` int(10) unsigned NOT NULL, + `FUNC_NAME` varchar(64), + `FILE_NAME` varchar(64), + `LINE_NO` int(10) unsigned, + `TOTAL_ALLOC_MEM` bigint(20) unsigned, + `CURRENT_ALLOC_MEM` bigint(20), + `ALLOC_MEM_COUNT` bigint(20) unsigned, + `FREE_MEM_COUNT` bigint(20) unsigned +) ENGINE=MEMORY DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33538_fail_init.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +call mtr.add_suppression("\\[ERROR\\] SPIDER plugin initialization failed"); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_WRAPPER_PROTOCOLS' registration as a INFORMATION SCHEMA failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_ALLOC_MEM' registration as a INFORMATION SCHEMA failed."); +create table mysql.spider_tables (c int); +# restart: --plugin-load-add=ha_spider +SELECT * FROM information_schema.SPIDER_ALLOC_MEM; +ID FUNC_NAME FILE_NAME LINE_NO TOTAL_ALLOC_MEM CURRENT_ALLOC_MEM ALLOC_MEM_COUNT FREE_MEM_COUNT +SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS; +WRAPPER_NAME WRAPPER_VERSION WRAPPER_DESCRIPTION WRAPPER_MATURITY diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33584.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,4 @@ +set @old_sql_mode=@@global.sql_mode; +set global sql_mode='traditional'; +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33679.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,25 @@ +# +# MDEV-33679 spider returns parsing failure on valid left join select by translating the on expression to () +# +for master_1 +for child2 +for child3 +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE `t1` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) ENGINE=MYISAM; +CREATE TABLE `t2` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL ) ENGINE=MYISAM; +SET spider_same_server_link= on; +CREATE TABLE `t1_spider` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) COMMENT='wrapper "mysql",srv "srv", table "t1"' ENGINE=SPIDER; +CREATE TABLE `t2_spider` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL +, PRIMARY KEY (`a`) USING BTREE +) COMMENT='wrapper "mysql",srv "srv",table "t2"' ENGINE=SPIDER; +INSERT INTO t1_spider VALUES(1,'oooo'); +INSERT INTO t2_spider VALUES(1,1); +SELECT t2_spider.a,t1_spider.c FRoM t2_spider LEFT join t1_spider ON (t2_spider.c = t1_spider.c) WHERE t2_spider.a = 1; +a c +1 1 +drop table t1, t2, t1_spider, t2_spider; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_33731.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +for master_1 +for child2 +for child3 +CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3)); +DELETE FROM t PARTITION (p2); +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34002.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34002.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34002.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34002.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,9 @@ +INSTALL PLUGIN Spider SONAME 'ha_spider.so'; +CREATE TABLE t (c DATE, c2 VARCHAR(1025) CHARACTER SET utf8mb3, UNIQUE KEY k(c2)) ENGINE=SPIDER; +UPDATE t SET c='ï¼’'; +ERROR HY000: Unable to connect to foreign data source: localhost +drop table t; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +Note 1305 PLUGIN SPIDER_ALLOC_MEM does not exist +Note 1305 PLUGIN SPIDER_WRAPPER_PROTOCOLS does not exist diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34003.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,18 @@ +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (0,1,0),(1,0,0),(2,0,0); +create table t1 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +SELECT * FROM t1 WHERE c=0; +c c1 c2 +0 1 0 +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34421.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34421.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34421.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34421.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,13 @@ +SET sql_mode=''; +INSTALL SONAME 'ha_spider'; +CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY KEY(c) (PARTITION p); +UNINSTALL SONAME IF EXISTS 'ha_spider'; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +INSERT INTO t SELECT 1; +ERROR 42000: Unknown storage engine 'SPIDER' +drop table t; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +Note 1305 PLUGIN SPIDER_ALLOC_MEM does not exist +Note 1305 PLUGIN SPIDER_WRAPPER_PROTOCOLS does not exist diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34541.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34541.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34541.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34541.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,35 @@ +for master_1 +for child2 +for child3 +SET SESSION spider_same_server_link=1; +SET sql_mode=''; +set @old_table_open_cache=@@global.table_open_cache; +set global table_open_cache=10; +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t1 (c INT) ENGINE=InnoDB; +CREATE TABLE t2 (c INT) ENGINE=InnoDB; +CREATE TABLE t3 (c INT) ENGINE=InnoDB; +CREATE TABLE ta (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t5 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t6 (c INT KEY) ENGINE=InnoDB PARTITION BY RANGE (c) (PARTITION p VALUES LESS THAN (5)); +CREATE TABLE t7 (a INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t8 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +SELECT * FROM t8; +ERROR HY000: Remote table 'test.t' is not found +CREATE TEMPORARY TABLE t7 (c INT) ENGINE=InnoDB SELECT * FROM t7; +ERROR HY000: Remote table 'test.t' is not found +CALL foo; +ERROR 42000: PROCEDURE test.foo does not exist +CREATE TEMPORARY TABLE t7 (c INT) ENGINE=InnoDB; +SELECT * FROM t7 JOIN t6 ON tc=t0.c; +ERROR 42S22: Unknown column 'tc' in 'on clause' +SHOW TABLE STATUS; +drop table ta, t8, t7, t6, t5, t3, t2, t1; +drop table t7; +drop server srv; +set global table_open_cache=@old_table_open_cache; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34555.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34555.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/mdev_34555.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/mdev_34555.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,32 @@ +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE '',user 'Spider', password 'foo'); +CREATE TABLE tSpider (a INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t2 (c INT,c2 CHAR(1)) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +XA START 'a'; +SELECT * FROM information_schema.table_constraints; +SELECT SLEEP (1); +SLEEP (1) +0 +SELECT * FROM t2; +ERROR HY000: Unable to connect to foreign data source: srv +SELECT SLEEP (1); +SLEEP (1) +0 +SELECT * FROM t2; +ERROR HY000: Unable to connect to foreign data source: srv +SELECT SLEEP (1); +SLEEP (1) +0 +SELECT * FROM t2; +ERROR HY000: Unable to connect to foreign data source: srv +xa end 'a'; +xa rollback 'a'; +drop table tSpider, t2; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/perfschema.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/perfschema.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/perfschema.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/perfschema.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,11 @@ +# +# MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled +# +connect foo,localhost,root; +select variable_name, variable_value from performance_schema.status_by_thread +where variable_name like '%spider_direct_aggregate%'; +variable_name variable_value +Spider_direct_aggregate 0 +Spider_direct_aggregate 0 +disconnect foo; +connection default; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/plugin_load_add_all.result 2024-08-03 07:29:59.000000000 +0000 @@ -3,5 +3,9 @@ # select * from mysql.plugin; name dl +select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = "information_schema" and TABLE_NAME like "SPIDER_%"; +TABLE_NAME +SPIDER_ALLOC_MEM +SPIDER_WRAPPER_PROTOCOLS create table t (c int) Engine=SPIDER; drop table t; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/self_reference_multi.result 2024-08-03 07:29:59.000000000 +0000 @@ -4,6 +4,9 @@ MDEV-6268 SPIDER table with no COMMENT clause causes queries to wait forever +set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); create table t2 (c int); create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_self_reference_multi",TABLE "t2"'; @@ -17,6 +20,7 @@ ERROR HY000: An infinite loop is detected when opening table test.t0 drop table t0, t1, t2; drop server srv_self_reference_multi; +set global spider_same_server_link=@old_spider_same_server_link; for master_1 for child2 for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/signal_ddl_fail.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,8 @@ +# +# MDEV-32559 Move alter table statements in spider init queries to be executed in the signal_ddl_recovery_done callback +# +select * from mysql.plugin; +name dl +# +# end of test signal_ddl_fail +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/slave_transaction_retry_errors_5digit.result 2024-08-03 07:29:59.000000000 +0000 @@ -5,11 +5,12 @@ child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; SHOW VARIABLES LIKE 'slave_transaction_retry_errors'; Variable_name Value -slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1429,2013,12701,10000,20000,30000 +slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701,10000,20000,30000 connection slave1_1; for slave1_1 for master_1 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/slave_trx_isolation.result 2024-08-03 07:29:59.000000000 +0000 @@ -5,6 +5,7 @@ child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation; set global spider_slave_trx_isolation= 1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/spider_join_with_non_spider.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,24 @@ +# +# Test joining a spider table with a non-spider table +# +for master_1 +for child2 +for child3 +set spider_same_server_link=1; +CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t1 (c int); +create table t2 (d int); +insert into t2 values (1), (2); +create table t3 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +insert into t3 values (2), (3); +select c from t3 join t2 on c = d; +c +2 +drop table t1, t2, t3; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test spider_join_with_non_spider +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/spider_table_sts.result 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -for master_1 -for child2 -for child3 -connection master_1; -alter table mysql.spider_table_sts drop column checksum; -insert into mysql.spider_table_sts values ('auto_test_local', 'tbl_a', 0, 0, 0, 0, 0, '2019-01-01 00:00:00', '2019-01-01 00:00:00', '2019-01-01 00:00:00'); - -this test is for MDEV-19842 - -drop and create databases -connection master_1; -CREATE DATABASE auto_test_local; -USE auto_test_local; - -create table -connection master_1; -CREATE TABLE tbl_a ( -pkey int NOT NULL, -PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1 - -select test 1 -connection master_1; -SELECT pkey FROM tbl_a; -ERROR HY000: System table spider_table_sts is different version - -deinit -connection master_1; -DROP DATABASE IF EXISTS auto_test_local; -ERROR HY000: System table spider_table_sts is different version -connection master_1; -alter table mysql.spider_table_sts add column checksum bigint unsigned default null after update_time; -DROP DATABASE IF EXISTS auto_test_local; -for master_1 -for child2 -for child3 - -end of test diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/subquery.result mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/subquery.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/r/subquery.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/r/subquery.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,25 @@ +# +# Test spider select with subqueries +# +for master_1 +for child2 +for child3 +set spider_same_server_link=1; +CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t1 (c1 int); +create table t2 (c2 int); +insert into t1 values (1), (2); +insert into t2 values (0), (1), (2); +create table t1s (c1 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +create table t2s (c2 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +select c1 from t1s, (select c2 from t2s where c2 > 0) t where c1 + 1 = c2; +c1 +1 +drop table t1, t2, t1s, t2s; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test subquery +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/gbh_outer_fields_in_join.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,46 @@ +--echo # +--echo # MDEV-26247 Spider: Valid LEFT JOIN results in ERROR 1064 +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; + +eval CREATE TABLE t1 (a int) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +eval CREATE TABLE t2 (a int) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; +eval CREATE TABLE t3 (a int) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; + +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (1), (2); +INSERT INTO t3 VALUES (1), (2), (3); + +--connection master_1 +CREATE DATABASE auto_test_local; +USE auto_test_local; + +eval CREATE TABLE t1 (a int) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='srv "s_2_1", table "t1"'; +eval CREATE TABLE t2 (a int) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='srv "s_2_1", table "t2"'; +eval CREATE TABLE t3 (a int) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='srv "s_2_1", table "t3"'; + +select * from t3 left join t1 on t3.a = t1.a left join t2 on t3.a = t2.a; +select * from t1 left join t2 on t1.a = t2.a right join t3 on t3.a = t1.a; +select * from t3 left join (t1 left join t2 on t1.a = t2.a) on t3.a = t1.a; + +drop table t1, t2, t3; + +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26151.test 2024-08-03 07:29:59.000000000 +0000 @@ -14,6 +14,10 @@ --let $srv=srv_mdev_26151 set @old_spider_bgs_mode= @@spider_bgs_mode; set session spider_bgs_mode=1; +set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; + evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); # casual_read != 0 && casual_read != 1 @@ -42,6 +46,7 @@ eval drop server $srv; set session spider_bgs_mode=@old_spider_bgs_mode; +set global spider_same_server_link=@old_spider_same_server_link; --disable_query_log --disable_result_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26247.test 2024-08-03 07:29:59.000000000 +0000 @@ -7,6 +7,7 @@ --source ../../t/test_init.inc --enable_result_log --enable_query_log + --connection child2_1 CREATE DATABASE auto_test_remote; USE auto_test_remote; @@ -33,10 +34,6 @@ INSERT INTO t3 VALUES (1, 111), (2, 222), (3, 333); --connection master_1 -#FIXME: this is a workaround. -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; - CREATE DATABASE auto_test_local; USE auto_test_local; @@ -71,7 +68,6 @@ --connection master_1 DROP DATABASE IF EXISTS auto_test_local; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; --connection child2_1 DROP DATABASE IF EXISTS auto_test_remote; @@ -80,6 +76,3 @@ --source ../t/test_deinit.inc --enable_query_log --enable_result_log ---echo # ---echo # end of test mdev_26247 ---echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test 2024-08-03 07:29:59.000000000 +0000 @@ -2,10 +2,7 @@ --echo # MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds --echo # -if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`) -{ ---skip test needs to be run with UBSAN -} +# this test should be checked with ubsan # init spider @@ -20,4 +17,5 @@ `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`; } +--disable_query_log --source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1 @@ +--skip-log-bin diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27186.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,37 @@ +INSTALL SONAME 'ha_spider'; + +# MDEV-27186 +CREATE TABLE t (s INT) ENGINE=SPIDER PARTITION BY HASH (s); +LOAD INDEX INTO CACHE t PARTITION (p,p1); +DROP TABLE t; + +# MDEV-27237 +CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY KEY() PARTITIONS 2; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +HANDLER t OPEN AS h; +DROP TABLE t; + +# MDEV-27334 +CREATE TABLE t (c INT PRIMARY KEY) ENGINE=SPIDER PARTITION BY HASH (c) PARTITIONS 2; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +CREATE TRIGGER t AFTER INSERT ON t FOR EACH ROW INSERT INTO t VALUES(0); +DROP TABLE t; + +# MDEV-28241 +CREATE TABLE t (b INT) ENGINE=InnoDB; +PREPARE s FROM 'SELECT * FROM t LIMIT 2'; +DROP TABLE t; +CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3)); +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +EXECUTE s; +DROP TABLE t; + +# MDEV-34101 +CREATE TABLE t (c INT) ENGINE=InnoDB; +LOCK TABLES t WRITE; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +CREATE OR REPLACE TABLE t (d INT) ENGINE=Spider PARTITION BY LIST COLUMNS (d) (PARTITION p VALUES IN (0)); +drop table t; + +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27575.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,23 @@ +--echo # +--echo # MDEV-27575 Spider: UBSAN member access within null pointer of type 'struct st_plugin_int and SIGSEGV in intern_plugin_lock on SHUTDOWN when setting Spider as default storage engine (temporary or global) +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +SET GLOBAL default_tmp_storage_engine=spider; +--source include/restart_mysqld.inc + +SET GLOBAL default_storage_engine=Spider; +--source include/restart_mysqld.inc + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_27575 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27902.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27902.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_27902.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_27902.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,56 @@ +--echo # +--echo # MDEV-27902 Crashes, asserts, hangs and corruptions in Spider when using HANDLER +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +# original case +CREATE TABLE t (c INT) ENGINE=Spider; +HANDLER t OPEN; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +HANDLER t READ next; +--error ER_PARSE_ERROR +dummy; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +HANDLER t READ next; + +drop table t; + +# case by nayuta +CREATE TABLE t (c INT) ENGINE=Spider; +HANDLER t OPEN; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +HANDLER t READ FIRST; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +HANDLER t READ NEXT; + +drop table t; + +# Another case by Roel +CREATE TABLE t (c INT) ENGINE=Spider; +HANDLER t OPEN; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +HANDLER t READ NEXT; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM t; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +HANDLER t READ NEXT; + +drop table t; + +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_27902 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1 @@ +--skip-log-bin diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28105.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,8 @@ +install soname 'ha_spider'; +SET @@insert_id=128; # 127 does not crash +CREATE TABLE t(c TINYINT AUTO_INCREMENT KEY) ENGINE=Spider; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +INSERT IGNORE INTO t VALUES(0); +drop table t; +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28683.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,29 @@ +--echo # +--echo # MDEV-28683 Spider: SIGSEGV in spider_db_direct_delete, SIGSEGV in spider_db_connect, ASAN: heap-use-after-free in spider_db_direct_delete +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +CREATE TABLE t (c INT) ENGINE=Spider; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM t; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +INSERT INTO t (SELECT 1 FROM t); +LOCK TABLES t WRITE CONCURRENT; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +DELETE FROM t; + +UNLOCK TABLES; +DROP TABLE t; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_28683 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,41 @@ +--echo # +--echo # MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; + +CREATE TABLE tbl_a (id INT); + +--connection master_1 +CREATE DATABASE auto_test_local; +USE auto_test_local; + +set global query_cache_type= on; +set spider_same_server_link = on; + +eval CREATE TABLE tbl_a ( + id INT +) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"'; + +SELECT * FROM tbl_a; + +--source include/restart_mysqld.inc + +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28739_simple.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,31 @@ +--echo # +--echo # MDEV-28739 Trying to lock uninitialized mutex or hang upon shutdown after using Spider with query_cache +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +# set @@global.debug_dbug="+d,xid_thd_trace,enter,exit,info,error:o,/tmp/trace2.out:i:F:L"; +#set @@global.debug_dbug="d:t:i:o,mysqld.trace"; + +set global query_cache_type= on; +set spider_same_server_link=1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +SELECT * FROM t1; +#shutdown; +--source include/restart_mysqld.inc +drop table t1, t2; +drop server srv; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28856.test 2024-08-03 07:29:59.000000000 +0000 @@ -9,6 +9,10 @@ # This test covers some table params under consideration for inclusion # in the engine-defined options to be implemented in MDEV-28856. +set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; + evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); @@ -152,6 +156,7 @@ drop table t1, t2; drop server srv; +set global spider_same_server_link=@old_spider_same_server_link; --disable_query_log --disable_result_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_28998.test 2024-08-03 07:29:59.000000000 +0000 @@ -2,19 +2,14 @@ --echo # MDEV-28998 ASAN errors in spider_fields::free_conn_holder or spider_create_group_by_handler --echo # -if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%ASAN%"`) -{ ---skip test needs to be run with ASAN -} +# this test should be checked with ubsan --disable_query_log --disable_result_log --source ../../t/test_init.inc --enable_result_log --enable_query_log -# FIXME: this is a workaround. -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; +set spider_same_server_link=1; evalp CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 (a INT); @@ -27,7 +22,6 @@ # Cleanup DROP TABLE t2, t1_SPIDER, t1; drop server s; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; --disable_query_log --disable_result_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29002.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,32 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +SET spider_same_server_link= on; +evalp CREATE SERVER s FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE t (a INT); +CREATE TABLE t1_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'"; +CREATE TABLE t2_spider (a INT) ENGINE=SPIDER COMMENT = "wrapper 'mysql', srv 's', table 't'"; +SELECT * FROM t1_spider, t2_spider; +SELECT table_name, index_name, cardinality FROM INFORMATION_SCHEMA.STATISTICS WHERE table_name IN ('t1_spider','t2_spider'); +RENAME TABLE t1_spider TO t3_spider; +SELECT * FROM t3_spider; + +DROP TABLE t3_spider, t2_spider, t; +drop server s; + +# case by roel +CREATE TABLE t1 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"'; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"'; +CREATE TABLE t3 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",HOST "srv",TABLE "t"'; +SHOW TABLE STATUS; +drop table t1, t2, t3; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,28 @@ +--echo # +--echo # MDEV-29027 ASAN errors in spider_db_free_result after partition DDL +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +CREATE DATABASE auto_test_local; +USE auto_test_local; + +eval CREATE TABLE tbl_a ( + c INT +) $MASTER_1_ENGINE $MASTER_1_CHARSET PARTITION BY HASH(c) ( + PARTITION pt1 +); + +ALTER TABLE tbl_a ADD PARTITION (PARTITION pt2); + +DROP DATABASE auto_test_local; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29027_original.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027_original.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29027_original.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29027_original.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,22 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +--source include/have_partition.inc +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE t1 (a INT); +CREATE TABLE t_spider (a INT) ENGINE=SPIDER PARTITION BY HASH(a) (PARTITION p1 COMMENT = "wrapper 'mysql', srv 'srv', table 't1'"); +CREATE TABLE t2 (a INT); +ALTER TABLE t_spider ADD PARTITION (PARTITION p2 COMMENT = "wrapper 'mysql', srv 'srv', table 't2'"); + +DROP TABLE t_spider, t1, t2; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29163.test 2024-08-03 07:29:59.000000000 +0000 @@ -6,9 +6,7 @@ --source ../../t/test_init.inc --enable_result_log --enable_query_log -#FIXME: this is a workaround. -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; +set spider_same_server_link=1; evalp CREATE SERVER s FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 (a INT); @@ -24,8 +22,6 @@ # Cleanup DROP TABLE t1_spider, t2_spider, t3_spider, t1, t2, t3; drop server s; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; - --disable_query_log --disable_result_log --source ../../t/test_deinit.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29421.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,26 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set @old_table_open_cache=@@global.table_open_cache; +set global table_open_cache=10; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t_s (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv", TABLE "t"'; +CREATE TABLE t1 (a INT) ENGINE=Spider; +--error 1429 +SELECT * FROM t1; +--disable_result_log +SELECT * FROM information_schema.tables; +--enable_result_log +DROP TABLE t, t_s, t1; +drop server srv; +set global table_open_cache=@old_table_open_cache; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29456.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,53 @@ +--echo # +--echo # MDEV-29456 Spider hangs in 'Waiting for table metadata lock' state on CREATE TABLE after LOCK TABLES +--echo # +--source include/have_innodb.inc +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link=1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +create table t1 (c int); +create table t2 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +CREATE TABLE t3 (c INT KEY) ENGINE=Spider; +LOCK TABLE t2 WRITE; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLE t3 WRITE; +UNLOCK TABLES; +drop table t1, t2, t3; + +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t1 (c INT) ENGINE=Spider; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +LOCK TABLES t2 WRITE; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLES t1 READ; +--error ER_TABLE_EXISTS_ERROR +CREATE TABLE t (c INT) ENGINE=Spider; +drop table t, t1, t2; + +# MDEV-30049 +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +CREATE TABLE t3 (c INT) ENGINE=InnoDB; +LOCK TABLES t2 WRITE; +--error 1428 +LOCK TABLES mysql.proc WRITE,mysql.user WRITE; # ERROR 1428 (HY000): You can't combine write-locking of system tables with other tables or lock types +INSERT INTO t3 SELECT * FROM t; +drop table t, t2, t3; + +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_29456 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29502.test 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ --enable_result_log --enable_query_log +set spider_same_server_link=1; --let $srv=srv_mdev_29502 evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29667.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,44 @@ +--echo # +--echo # MDEV-29667 Server hangs on DROP DATABASE after failing LOCK TABLES on Spider table +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +eval CREATE TABLE tbl_a ( + a INT +) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; + +--connection master_1 +CREATE DATABASE auto_test_local; +USE auto_test_local; +eval CREATE TABLE tbl_a ( + a INT +) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"'; +eval CREATE TABLE tbl_b ( + a INT +) $MASTER_1_ENGINE $MASTER_1_CHARSET; + +LOCK TABLES tbl_a WRITE; +--error 1429 +LOCK TABLES tbl_b READ, tbl_a READ; + +--connection master_1 +DROP DATABASE IF EXISTS auto_test_local; + +--connection child2_1 +DROP DATABASE IF EXISTS auto_test_remote; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log +--echo # +--echo # end of test mdev_29667 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29962.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29962.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29962.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29962.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,30 @@ +--echo # +--echo # MDEV-29962 SIGSEGV in ha_spider::lock_tables on BEGIN after table lock +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE t (c INT) ENGINE=InnoDB; +CREATE TABLE t1 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +SELECT * FROM t1; +LOCK TABLES t1 WRITE CONCURRENT,t1 AS t2 READ; +BEGIN; + +drop table t, t1; +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_29962 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_29963.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,56 @@ +--echo # +--echo # MDEV-29963 SIGSEGV in spider_db_mbase::append_lock_tables on LOCK TABLES +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link=1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE t (a INT) ENGINE=Spider; +CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLES t AS a READ,t2 AS b LOW_PRIORITY WRITE,t2 AS c WRITE; +DROP TABLE t2; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLES t2 WRITE; +DROP TABLE t2,t; + +# A less complex scenario +CREATE TABLE t (a INT); +CREATE TABLE t1 (a INT) ENGINE=Spider; +CREATE TABLE t2 (b INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLES t1 READ, t2 WRITE; +DROP TABLE t2; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +LOCK TABLES t2 WRITE; +UNLOCK TABLES; +DROP TABLE t, t1, t2; + +# MDEV-31357 +CREATE TABLE t1 (c INT) ENGINE=Spider; +CREATE TABLE t2 (c INT) ENGINE=Spider COMMENT="WRAPPER 'mysql',srv 'srv',TABLE 't1'"; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLES t1 WRITE,t2 WRITE; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +TRUNCATE t2; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLES t2 AS o WRITE; +drop table t1, t2; + +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_29963 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30014.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,46 @@ +--echo # +--echo # MDEV-30014 heap-use-after-free in ha_spider::lock_tables(), highly sporadic SIGSEGV in intern_close_table +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link=1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +create table t1 (c int); +create table t2 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +CREATE TABLE t3 (c INT KEY) ENGINE=Spider; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLE t2 WRITE,t3 WRITE; +CREATE TABLE t4 (c INT) ENGINE=Spider; +FLUSH NO_WRITE_TO_BINLOG TABLES t4 WITH READ LOCK; +UNLOCK TABLES; + +drop table t1, t2, t3, t4; + +# This is a test case in MDEV-29456 but it is more like the above +# case. +create table t1 (c int); +create table t2 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +CREATE TABLE t3 (c INT KEY) ENGINE=Spider; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +LOCK TABLE t2 WRITE, t3 WRITE; +UNLOCK TABLES; +drop table t1, t2, t3; + +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_30014 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30170.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,8 @@ +install soname 'ha_spider'; +--error ER_BAD_TABLE_ERROR +DROP TABLE non_existing_table; +# Test that create or replace a non existing spider table work +create or replace table non_existing_table (c int) engine=Spider; +drop table non_existing_table; +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30392.test 2024-08-03 07:29:59.000000000 +0000 @@ -6,9 +6,7 @@ --source ../../t/test_init.inc --enable_result_log --enable_query_log -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; - +set spider_same_server_link=1; evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 (a INT); @@ -21,7 +19,6 @@ DROP TABLE t1, t2; DROP SERVER srv; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; --disable_query_log --disable_result_log --source ../../t/test_deinit.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30408.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30408.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30408.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30408.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,26 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set @@optimizer_switch="semijoin=off"; +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +create table ten(a int primary key); +insert into ten values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +create table t2 (a int, b int); +insert into t2 select a,a from ten; +create table t1 (a int, b int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +select a.a, a.b from t1 a where exists (select * from t1 b where b.b = a.b); +drop table ten, t1, t2; +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30727.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,30 @@ +CREATE FUNCTION spider_direct_sql RETURNS INT SONAME 'ha_spider.so'; +--error ER_CANT_INITIALIZE_UDF +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); + +CREATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so'; +--error ER_CANT_INITIALIZE_UDF +SELECT spider_bg_direct_sql ('SELECT * FROM s','a','srv "b"'); + +CREATE FUNCTION spider_copy_tables RETURNS INT SONAME 'ha_spider.so'; +--error ER_CANT_INITIALIZE_UDF +SELECT spider_copy_tables ('t', '0', '0'); + +# spider_flush_table_mon_cache does not require spider init to function +CREATE FUNCTION spider_flush_table_mon_cache RETURNS INT SONAME 'ha_spider.so'; +SELECT spider_flush_table_mon_cache (); + +# The function functions properly after the plugin is installed +install soname 'ha_spider'; + +--error ER_FOREIGN_SERVER_DOESNT_EXIST +SELECT spider_direct_sql ('SELECT * FROM s','a','srv "b"'); + +call mtr.add_suppression(".*\\[Error\\] (mysqld|mariadbd): Can't find record in 'spider_tables'"); +--error ER_KEY_NOT_FOUND +SELECT spider_copy_tables ('t', '0', '0'); + +SELECT spider_flush_table_mon_cache (); + +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test 2024-08-03 07:29:59.000000000 +0000 @@ -2,21 +2,18 @@ --echo # MDEV-30981 Spider UBSAN: null pointer passed as argument 2, which is declared to never be null in spider_create_trx_alter_table on ALTER --echo # -if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`) -{ ---skip test needs to be run with UBSAN -} - +# this test should be checked with ubsan + --disable_query_log --disable_result_log --source ../../t/test_init.inc --enable_result_log --enable_query_log - + CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY LIST (c) (PARTITION p VALUES IN (1,2)); ALTER TABLE t ENGINE=InnoDB; drop table t; - + --disable_query_log --disable_result_log --source ../t/test_deinit.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test 2024-08-03 07:29:59.000000000 +0000 @@ -9,6 +9,7 @@ --enable_result_log --enable_query_log +set spider_same_server_link=1; evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t (c BLOB) ENGINE=InnoDB; CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31475.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31475.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31475.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31475.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,32 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +# test 1 +CREATE TABLE t3 (c1 MEDIUMINT NULL, c2 CHAR(5)) ENGINE=Spider PARTITION BY KEY(c1) PARTITIONS 2; +--error ER_CANT_DROP_FIELD_OR_KEY +ALTER TABLE t3 DROP PRIMARY KEY; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM t3 WHERE c1 <=> '1000-00-01 00:00:00' ORDER BY c1,c2 LIMIT 2; +CREATE TABLE t1 (a INT UNSIGNED NOT NULL PRIMARY KEY, b INT UNSIGNED NOT NULL, c INT UNSIGNED, UNIQUE (b, c) USING HASH) ENGINE=Spider; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT t1.c1 FROM t3 RIGHT JOIN t1 ON t1.c1=current_date() UNION SELECT t1.c2 FROM t1 LEFT OUTER JOIN t3 ON t1.c2; +drop table t1, t3; + +# test 2 +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t1 (a INT, b VARCHAR(255), PRIMARY KEY(a)) ENGINE=Spider PARTITION BY RANGE (a) (PARTITION p1 VALUES LESS THAN (3), PARTITION p2 VALUES LESS THAN MAXVALUE COMMENT='srv "srv"'); +DROP SERVER srv; +--error 1477 +SELECT * FROM t1; +drop table t1; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test 2024-08-03 07:29:59.000000000 +0000 @@ -10,6 +10,7 @@ --let $srv=srv_mdev_31524 SET @old_spider_read_only_mode = @@session.spider_read_only_mode; +set spider_same_server_link=1; evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); # when the user does not set var nor the table option, the default diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31645.test 2024-08-03 07:29:59.000000000 +0000 @@ -6,25 +6,17 @@ --source ../../t/test_init.inc --enable_result_log --enable_query_log -set @old_spider_disable_group_by_handler=@@spider_disable_group_by_handler; -set spider_disable_group_by_handler=1; - +set spider_same_server_link=1; evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); CREATE TABLE t1 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a)); CREATE TABLE t2 ( a bigint(20) NOT NULL, b bigint(20) DEFAULT 0, PRIMARY KEY (a)) ENGINE=SPIDER COMMENT='srv "srv", WRAPPER "mysql", TABLE "t1"'; -SET SESSION optimizer_switch='semijoin=off'; -SELECT * FROM t2 -WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20); - -SET SESSION optimizer_switch='semijoin=on'; - +SELECT * FROM t2 WHERE b IN (SELECT b FROM t2 WHERE a > 10); SELECT * FROM t2 WHERE A BETWEEN 0 AND 10 AND B IN(SELECT B FROM t2 WHERE A BETWEEN 11 AND 20); drop table t1, t2; drop server srv; -set spider_disable_group_by_handler=@old_spider_disable_group_by_handler; --disable_query_log --disable_result_log --source ../../t/test_deinit.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_31996.test 2024-08-03 07:29:59.000000000 +0000 @@ -4,6 +4,7 @@ --enable_result_log --enable_query_log +set spider_same_server_link=1; evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32492.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32492.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32492.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32492.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,62 @@ +--echo # +--echo # MDEV-32492 SIGSEGV in spider_conn_first_link_idx on DELETE +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE t (c INT, PRIMARY KEY(c)) ENGINE=Spider; +--disable_ps_protocol +SHOW CREATE TABLE t; +--enable_ps_protocol +DROP TABLE t; +CREATE TABLE t (c INT) ENGINE=Spider COMMENT='port "1 1"'; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +DELETE FROM t; +drop table t; + +CREATE TABLE t1 (a INT,b VARCHAR(255),PRIMARY KEY(a)) ENGINE=Spider comment="srv 'srv', table 't1', read_only_mode '1'"; +--error 12518 +INSERT INTO t1 VALUES (1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd'); +--disable_ps_protocol +SHOW CREATE TABLE t1; +--enable_ps_protocol +DROP TABLE t1; +CREATE TABLE t1 (a INT) ENGINE=Spider comment="port '123 456'"; +# bug crash site +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +INSERT IGNORE INTO t1 VALUES (42),(42); +drop table t1; + +CREATE TABLE t1 (c INT, KEY(c)) ENGINE=Spider COMMENT='WRAPPER "mysql", SRV "srv",TABLE "t2", PK_NAME "f"'; +SET GLOBAL general_log=1; +--error ER_WRONG_VALUE_COUNT_ON_ROW +INSERT INTO t1 VALUES (1, "aaa"),(2, "bbb"),(3, "ccc"),(4, "ddd"); +--disable_ps_protocol +SHOW CREATE TABLE t1; +--enable_ps_protocol +DROP TABLE t1; +CREATE TABLE t1 (a INT) ENGINE=Spider comment='port "123 456"'; +# bug crash site +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM t1; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +INSERT IGNORE INTO t1 VALUES (42),(42); +drop table t1; + +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_32492 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,2 @@ +--sql-mode=oracle +--plugin-load-add=ha_spider diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,12 @@ +--echo # +--echo # MDEV-32753 Spider engine does not load in ORACLE mode +--echo # + +# This test tests spider init during server startup under global +# ORACLE mode +select * from mysql.plugin; +create table t (c int) Engine=SPIDER; +drop table t; +--echo # +--echo # end of test mdev_32753 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1 @@ +--sql-mode=oracle diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,20 @@ +--echo # +--echo # MDEV-32753 Spider engine does not load in ORACLE mode +--echo # + +# This test tests spider init after startup under global ORACLE mode +install soname 'ha_spider'; +--replace_regex /\.dll/.so/ +select * from mysql.plugin; +create table t (c int) Engine=SPIDER; +drop table t; + +--disable_query_log +--disable_result_log +--source ../../include/clean_up_spider.inc +--enable_result_log +--enable_query_log + +--echo # +--echo # end of test mdev_32753_after_start +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32753_after_start_session.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,22 @@ +--echo # +--echo # MDEV-32753 Spider engine does not load in ORACLE mode +--echo # + +# This test tests spider init after startup under session ORACLE mode +set @old_sql_mode=@@sql_mode; +SET @@sql_mode = CONCAT(@@sql_mode, ',ORACLE'); +install soname 'ha_spider'; +select * from mysql.plugin; +create table t (c int) Engine=SPIDER; +drop table t; +set sql_mode=@old_sql_mode; + +--disable_query_log +--disable_result_log +--source ../../include/clean_up_spider.inc +--enable_result_log +--enable_query_log + +--echo # +--echo # end of test mdev_32753_after_start +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_32986.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,29 @@ +--echo # +--echo # MDEV-32907 +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link=1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +create table t2 (c varchar(16)); +create table t1 (c varchar(16)) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; + +insert into t1 values ('TestSpiderRegex'); +select c from t1 where c regexp '(Test|Spider|Regex)'; +drop table t1, t2; +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test mdev_32907 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33008.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,24 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link=on; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `code` varchar(10) DEFAULT NULL, + PRIMARY KEY (`id`) +); +create table t1 ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +show create table t1; +drop table t1, t2; + +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33191.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,11 @@ +INSTALL SONAME 'ha_spider'; +set spider_same_server_link=on; +CREATE TABLE t2(c INT); +--let $SOCKET=`SELECT @@global.socket` +evalp CREATE TABLE t1(c INT) ENGINE=Spider COMMENT='socket "$SOCKET", user "root", table "t2 t3"'; +ALTER TABLE t1 ENGINE=Spider; +--error ER_NO_SUCH_TABLE +TRUNCATE TABLE t1; +drop table t1, t2; +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33242.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,6 @@ +set @old_old_mode=@@global.old_mode; +set global old_mode=4; +INSTALL SONAME 'ha_spider.so'; +set global old_mode=@old_old_mode; +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,15 @@ +--echo # +--echo # MDEV-33434 MDEV-33434 UBSAN null pointer passed as argument 2, which is declared to never be null in spider_udf_direct_sql_create_conn +--echo # + +INSTALL SONAME 'ha_spider'; +SET character_set_connection=ucs2; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT SPIDER_DIRECT_SQL('SELECT SLEEP(1)', '', 'srv "dummy", port "3307"'); +--disable_query_log +--source ../../include/clean_up_spider.inc +--enable_query_log + +--echo # +--echo # end of test mdev_33434 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1 @@ +--plugin-load-add=ha_spider diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +--echo # +--echo # MDEV-33441 No spider variables available is Spider is loaded upon server startup +--echo # + +# We test that at least one spider variable exists. +set spider_same_server_link=0; + +--echo # +--echo # end of test mdev_33441 +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,2 @@ +--plugin-load-add=ha_spider +--debug-dbug=d,fail_spider_init_retry diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33441_fail.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +--source include/have_debug.inc +--echo # +--echo # MDEV-33441 No spider variables available is Spider is loaded upon server startup +--echo # +# We test that when retry fails, spider variables are deleted. +select * from mysql.plugin; +show variables like 'spider%'; +--echo # +--echo # end of test mdev_33441_fail +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33494.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,11 @@ +# This test tests spider init with global no_zero_date sql mode +set @old_sql_mode=@@global.sql_mode; +set global sql_mode=(SELECT CONCAT (@@sql_mode,',no_zero_date')); +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; + +--disable_query_log +--disable_result_log +--source ../../include/clean_up_spider.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,2 @@ +--plugin-load-add=ha_spider +--transaction-read-only=on diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,2 @@ +# we check that information_schema.SPIDER_ALLOC_MEM exists +show create table information_schema.SPIDER_ALLOC_MEM; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33538_fail_init.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,17 @@ +call mtr.add_suppression("\\[ERROR\\] SPIDER plugin initialization failed"); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_WRAPPER_PROTOCOLS' registration as a INFORMATION SCHEMA failed."); +call mtr.add_suppression(".*\\[ERROR\\] Plugin 'SPIDER_ALLOC_MEM' registration as a INFORMATION SCHEMA failed."); +# We create a table with identical name of the spider system table, to +# fail the spider init query ([ERROR] SPIDER plugin initialization +# failed at 'alter table mysql.spider_tables add column if not exists +# link_id int not null default 0 after table_name, drop primary key, +# add primary key (db_name, table_name, link_id), algorithm=copy, +# lock=shared;' by 'Unknown column 'table_name' in 'spider_tables'') +# This will cause the init of spider_alloc_mem to fail because it +# depends on the main spider plugin. +create table mysql.spider_tables (c int); +--let $restart_parameters= --plugin-load-add=ha_spider +--source include/restart_mysqld.inc +SELECT * FROM information_schema.SPIDER_ALLOC_MEM; +SELECT * FROM information_schema.SPIDER_WRAPPER_PROTOCOLS; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33584.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,11 @@ +# This test tests spider init with global no_zero_date sql mode +set @old_sql_mode=@@global.sql_mode; +set global sql_mode='traditional'; +install soname 'ha_spider'; +set global sql_mode=@old_sql_mode; + +--disable_query_log +--disable_result_log +--source ../../include/clean_up_spider.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33679.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,29 @@ +--echo # +--echo # MDEV-33679 spider returns parsing failure on valid left join select by translating the on expression to () +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE `t1` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) ENGINE=MYISAM; +CREATE TABLE `t2` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL ) ENGINE=MYISAM; +SET spider_same_server_link= on; +CREATE TABLE `t1_spider` (`c` INT(10) UNSIGNED NOT NULL, `b` VARCHAR(255) NOT NULL , PRIMARY KEY (`c`) USING BTREE ) COMMENT='wrapper "mysql",srv "srv", table "t1"' ENGINE=SPIDER; +CREATE TABLE `t2_spider` (`a` INT(10) UNSIGNED NOT NULL, `c` INT(10) UNSIGNED NOT NULL +, PRIMARY KEY (`a`) USING BTREE +) COMMENT='wrapper "mysql",srv "srv",table "t2"' ENGINE=SPIDER; +INSERT INTO t1_spider VALUES(1,'oooo'); +INSERT INTO t2_spider VALUES(1,1); +SELECT t2_spider.a,t1_spider.c FRoM t2_spider LEFT join t1_spider ON (t2_spider.c = t1_spider.c) WHERE t2_spider.a = 1; + +drop table t1, t2, t1_spider, t2_spider; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_33731.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,16 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +CREATE TABLE t (a INT) ENGINE=Spider PARTITION BY LIST (a) PARTITIONS 2 (PARTITION p1 VALUES IN (0,1),PARTITION p2 VALUES IN (2,3)); +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +DELETE FROM t PARTITION (p2); +drop table t; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34002.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34002.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34002.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34002.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,7 @@ +INSTALL PLUGIN Spider SONAME 'ha_spider.so'; +CREATE TABLE t (c DATE, c2 VARCHAR(1025) CHARACTER SET utf8mb3, UNIQUE KEY k(c2)) ENGINE=SPIDER; +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +UPDATE t SET c='ï¼’'; +drop table t; +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34003.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,20 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=InnoDB; +INSERT INTO t2 VALUES (0,1,0),(1,0,0),(2,0,0); +create table t1 (c INT KEY,c1 BLOB,c2 TEXT) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +SELECT * FROM t1 WHERE c=0; +drop table t1, t2; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34421.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34421.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34421.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34421.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +--source include/have_partition.inc +SET sql_mode=''; +INSTALL SONAME 'ha_spider'; +CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY KEY(c) (PARTITION p); +UNINSTALL SONAME IF EXISTS 'ha_spider'; +--error ER_UNKNOWN_STORAGE_ENGINE +INSERT INTO t SELECT 1; +drop table t; +--disable_query_log +--source ../../include/clean_up_spider.inc diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34541.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34541.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34541.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34541.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,48 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +SET SESSION spider_same_server_link=1; +SET sql_mode=''; + +set @old_table_open_cache=@@global.table_open_cache; +set global table_open_cache=10; + +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +CREATE TABLE t1 (c INT) ENGINE=InnoDB; +CREATE TABLE t2 (c INT) ENGINE=InnoDB; +CREATE TABLE t3 (c INT) ENGINE=InnoDB; +CREATE TABLE ta (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t5 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t6 (c INT KEY) ENGINE=InnoDB PARTITION BY RANGE (c) (PARTITION p VALUES LESS THAN (5)); +CREATE TABLE t7 (a INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t8 (c INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +--error 12702 +SELECT * FROM t8; +--error 12702 +CREATE TEMPORARY TABLE t7 (c INT) ENGINE=InnoDB SELECT * FROM t7; +--error ER_SP_DOES_NOT_EXIST +CALL foo; +CREATE TEMPORARY TABLE t7 (c INT) ENGINE=InnoDB; +--error ER_BAD_FIELD_ERROR +SELECT * FROM t7 JOIN t6 ON tc=t0.c; +--disable_result_log +SHOW TABLE STATUS; +--enable_result_log + +# we need to drop t7 twice +drop table ta, t8, t7, t6, t5, t3, t2, t1; +drop table t7; +drop server srv; +set global table_open_cache=@old_table_open_cache; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,33 @@ +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE '',user 'Spider', password 'foo'); +CREATE TABLE tSpider (a INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +CREATE TABLE t2 (c INT,c2 CHAR(1)) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; +XA START 'a'; +--disable_result_log +--error 0,ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM information_schema.table_constraints; +--enable_result_log +SELECT SLEEP (1); +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM t2; +SELECT SLEEP (1); +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM t2; +SELECT SLEEP (1); +--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE +SELECT * FROM t2; +xa end 'a'; +xa rollback 'a'; +drop table tSpider, t2; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/perfschema.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1 @@ +--loose-performance-schema diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/perfschema.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/perfschema.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/perfschema.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/perfschema.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,16 @@ +source include/have_perfschema.inc; +disable_query_log; +source ../../include/init_spider.inc; +enable_query_log; + +--echo # +--echo # MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled +--echo # +connect foo,localhost,root; +select variable_name, variable_value from performance_schema.status_by_thread +where variable_name like '%spider_direct_aggregate%'; +disconnect foo; +connection default; + +disable_query_log; +source ../../include/deinit_spider.inc; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/plugin_load_add_all.test 2024-08-03 07:29:59.000000000 +0000 @@ -3,5 +3,6 @@ --echo # # A simple test that tests plugin-load-add=ha_spider select * from mysql.plugin; +select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = "information_schema" and TABLE_NAME like "SPIDER_%"; create table t (c int) Engine=SPIDER; drop table t; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/self_reference_multi.test 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,9 @@ --echo MDEV-6268 SPIDER table with no COMMENT clause causes queries to wait forever --echo +set spider_same_server_link=1; +set @old_spider_same_server_link=@@global.spider_same_server_link; +set global spider_same_server_link=1; --let $srv=srv_self_reference_multi evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); create table t2 (c int); @@ -16,12 +19,15 @@ eval alter table t2 ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t0"'; --error 12719 select * from t0; +--replace_result test.t1 test.t0 test.t2 test.t0 --error 12719 select * from t1; +--replace_result test.t1 test.t0 test.t2 test.t0 --error 12719 select * from t2; drop table t0, t1, t2; eval drop server $srv; +set global spider_same_server_link=@old_spider_same_server_link; --disable_query_log --disable_result_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,2 @@ +--plugin-load-add=ha_spider +--debug-dbug=d,fail_spider_ddl_recovery_done diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/signal_ddl_fail.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,10 @@ +--source include/have_debug.inc +--echo # +--echo # MDEV-32559 Move alter table statements in spider init queries to be executed in the signal_ddl_recovery_done callback +--echo # +# This test tests that failure in ddl_recovery callback causes the +# plugin to be deinitialized. +select * from mysql.plugin; +--echo # +--echo # end of test signal_ddl_fail +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_join_with_non_spider.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,29 @@ +--echo # +--echo # Test joining a spider table with a non-spider table +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link=1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t1 (c int); +create table t2 (d int); +insert into t2 values (1), (2); +create table t3 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +insert into t3 values (2), (3); +select c from t3 join t2 on c = d; +drop table t1, t2, t3; +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test spider_join_with_non_spider +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.cnf 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ -!include include/default_mysqld.cnf -!include ../my_1_1.cnf diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/spider_table_sts.test 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ ---source ../include/spider_table_sts_init.inc ---echo ---echo this test is for MDEV-19842 ---echo ---echo drop and create databases - ---connection master_1 ---disable_warnings -CREATE DATABASE auto_test_local; -USE auto_test_local; ---enable_warnings - ---echo ---echo create table - ---connection master_1 ---disable_query_log -echo CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) MASTER_1_ENGINE MASTER_1_CHARSET MASTER_1_COMMENT_2_1; -eval CREATE TABLE tbl_a ( - pkey int NOT NULL, - PRIMARY KEY (pkey) -) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_2_1; ---enable_query_log - ---echo ---echo select test 1 - ---connection master_1 ---error 12609 -SELECT pkey FROM tbl_a; - ---echo ---echo deinit ---disable_warnings - ---connection master_1 ---error 12609 -DROP DATABASE IF EXISTS auto_test_local; - ---enable_warnings ---source ../include/spider_table_sts_deinit.inc ---echo ---echo end of test diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/subquery.test mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/subquery.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/bugfix/t/subquery.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/bugfix/t/subquery.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,31 @@ +--echo # +--echo # Test spider select with subqueries +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link=1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t1 (c1 int); +create table t2 (c2 int); + +insert into t1 values (1), (2); +insert into t2 values (0), (1), (2); + +create table t1s (c1 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t1"'; +create table t2s (c2 int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; + +select c1 from t1s, (select c2 from t2s where c2 > 0) t where c1 + 1 = c2; + +drop table t1, t2, t1s, t2s; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test subquery +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/feature/r/pushdown_case.result mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/pushdown_case.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/feature/r/pushdown_case.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/pushdown_case.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,57 @@ +# +# MDEV-28993 Spider: Push down CASE statement +# +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +insert into t1 values (42), (3), (848), (100); +explain select case c when 3 then "three" when 42 then "answer" else "other" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case c when 3 then "three" when 42 then "answer" else "other" end from t1; +case c when 3 then "three" when 42 then "answer" else "other" end +answer +three +other +other +explain select case c when 3 then "three" when 42 then "answer" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case c when 3 then "three" when 42 then "answer" end from t1; +case c when 3 then "three" when 42 then "answer" end +answer +three +NULL +NULL +explain select case when c = 3 then "three" when c = 42 then "answer" else "other" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case when c = 3 then "three" when c = 42 then "answer" else "other" end from t1; +case when c = 3 then "three" when c = 42 then "answer" else "other" end +answer +three +other +other +explain select case when c = 3 then "three" when c = 42 then "answer" end from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select case when c = 3 then "three" when c = 42 then "answer" end from t1; +case when c = 3 then "three" when c = 42 then "answer" end +answer +three +NULL +NULL +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 +# +# end of test pushdown_case +# diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,111 @@ +# +# MDEV-28992 Spider: Push down TIMESTAMPDIFF function +# +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +); +CREATE TABLE t1 ( +a INT, +b CHAR(1), +c DATETIME, +PRIMARY KEY(a) +) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +INSERT INTO t1 (a, b, c) VALUES +(1, 'a', '2018-11-01 10:21:39'), +(2, 'b', '2015-06-30 23:59:59'), +(3, 'c', '2013-11-01 01:01:01'); +interval year +explain select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(year, '2000-01-01 00:00:00', c) +1 a 18 +2 b 15 +3 c 13 +interval quarter +explain select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(quarter, '2000-01-01 00:00:00', c) +1 a 75 +2 b 61 +3 c 55 +interval month +explain select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(month, '2000-01-01 00:00:00', c) +1 a 226 +2 b 185 +3 c 166 +interval week +explain select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(week, '2000-01-01 00:00:00', c) +1 a 982 +2 b 808 +3 c 721 +interval day +explain select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(day, '2000-01-01 00:00:00', c) +1 a 6879 +2 b 5659 +3 c 5053 +internal hour +explain select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(hour, '2000-01-01 00:00:00', c) +1 a 165106 +2 b 135839 +3 c 121273 +internal minute +explain select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(minute, '2000-01-01 00:00:00', c) +1 a 9906381 +2 b 8150399 +3 c 7276381 +internal second +explain select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(second, '2000-01-01 00:00:00', c) +1 a 594382899 +2 b 489023999 +3 c 436582861 +internal microsecond +explain select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY +select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; +a b timestampdiff(microsecond, '2000-01-01 00:00:00', c) +1 a 594382899000000 +2 b 489023999000000 +3 c 436582861000000 +drop table t1, t2; +drop server srv; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/feature/r/slave_transaction_retry_errors.result 2024-08-03 07:29:59.000000000 +0000 @@ -5,11 +5,12 @@ child2_3 for child3 for slave1_1 +include/start_slave.inc connection slave1_1; SHOW VARIABLES LIKE 'slave_transaction_retry_errors'; Variable_name Value -slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1429,2013,12701 +slave_transaction_retry_errors 1158,1159,1160,1161,1205,1213,1020,1429,2013,12701 connection slave1_1; for slave1_1 for master_1 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/feature/t/pushdown_case.test mariadb-10.11.9/storage/spider/mysql-test/spider/feature/t/pushdown_case.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/feature/t/pushdown_case.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/feature/t/pushdown_case.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,50 @@ +--echo # +--echo # MDEV-28993 Spider: Push down CASE statement +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; +insert into t1 values (42), (3), (848), (100); + +# everything +let $query= +select case c when 3 then "three" when 42 then "answer" else "other" end from t1; +eval explain $query; +eval $query; + +# no else +let $query= +select case c when 3 then "three" when 42 then "answer" end from t1; +eval explain $query; +eval $query; + +# no value +let $query= +select case when c = 3 then "three" when c = 42 then "answer" else "other" end from t1; +eval explain $query; +eval $query; + +# neither +let $query= +select case when c = 3 then "three" when c = 42 then "answer" end from t1; +eval explain $query; +eval $query; + +drop table t1, t2; +drop server srv; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log +--echo # +--echo # end of test pushdown_case +--echo # diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test mariadb-10.11.9/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/feature/t/pushdown_timestamp_diff.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,93 @@ +--echo # +--echo # MDEV-28992 Spider: Push down TIMESTAMPDIFF function +--echo # +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +set spider_same_server_link= 1; +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +create table t2 ( + a INT, + b CHAR(1), + c DATETIME, + PRIMARY KEY(a) +); +CREATE TABLE t1 ( + a INT, + b CHAR(1), + c DATETIME, + PRIMARY KEY(a) +) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2"'; + +INSERT INTO t1 (a, b, c) VALUES + (1, 'a', '2018-11-01 10:21:39'), + (2, 'b', '2015-06-30 23:59:59'), + (3, 'c', '2013-11-01 01:01:01'); + +--echo interval year +let $query= +select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval quarter +let $query= +select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval month +let $query= +select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval week +let $query= +select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo interval day +let $query= +select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal hour +let $query= +select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal minute +let $query= +select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal second +let $query= +select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +--echo internal microsecond +let $query= +select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; +eval explain $query; +eval $query; + +drop table t1, t2; +drop server srv; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/include/clean_up_spider.inc mariadb-10.11.9/storage/spider/mysql-test/spider/include/clean_up_spider.inc --- mariadb-10.11.6/storage/spider/mysql-test/spider/include/clean_up_spider.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/include/clean_up_spider.inc 2024-08-03 07:29:59.000000000 +0000 @@ -3,7 +3,7 @@ DROP FUNCTION spider_ping_table; DROP FUNCTION spider_bg_direct_sql; DROP FUNCTION spider_direct_sql; -UNINSTALL SONAME IF EXISTS "ha_spider"; +UNINSTALL SONAME IF EXISTS 'ha_spider'; DROP TABLE IF EXISTS mysql.spider_xa; DROP TABLE IF EXISTS mysql.spider_xa_member; DROP TABLE IF EXISTS mysql.spider_xa_failed_log; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/include/init_spider.inc mariadb-10.11.9/storage/spider/mysql-test/spider/include/init_spider.inc --- mariadb-10.11.6/storage/spider/mysql-test/spider/include/init_spider.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/include/init_spider.inc 2024-08-03 07:29:59.000000000 +0000 @@ -158,27 +158,6 @@ `SELECT SUBSTRING_INDEX(plugin_version, '.', 1) FROM information_schema.plugins WHERE plugin_name = 'SPIDER'`; -if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) -{ - let $HAS_REWRITE= - `SELECT IF (STRCMP('$SERVER_NAME', 'MariaDB') = 0, - IF ($SERVER_MAJOR_VERSION = 10, - IF ($SERVER_MINOR_VERSION < 4, 0, 1), - IF ($SERVER_MAJOR_VERSION < 10, 0, 1)), - 0)`; - let $HAS_REWRITE= 0; - if ($HAS_REWRITE) - { - let $PLUGIN_NAME= spider_flush_rewrite_cache; - let $PLUGIN_EXIST= - `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`; - while (!$PLUGIN_EXIST) - { - let $PLUGIN_EXIST= - `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`; - } - } -} let $PLUGIN_NAME= spider_flush_table_mon_cache; let $PLUGIN_EXIST= `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my.cnf 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -1,177 +1,10 @@ # Use default setting for mysqld processes !include include/default_mysqld.cnf - -[mysqld.1.1] -log-bin= master-bin -loose_handlersocket_port= 20000 -loose_handlersocket_port_wr= 20001 -loose_handlersocket_threads= 2 -loose_handlersocket_threads_wr= 1 -loose_handlersocket_support_merge_table= 0 -loose_handlersocket_direct_update_mode= 2 -loose_handlersocket_unlimited_boundary= 65536 -loose_handlersocket_bulk_insert= 0 -loose_handlersocket_bulk_insert_timeout= 0 -loose_handlersocket_general_log= 1 -loose_handlersocket_timeout= 30 -loose_handlersocket_close_table_interval=2 -open_files_limit= 4096 -loose_partition= 1 - -[mysqld.2.1] -loose_handlersocket_port= 20002 -loose_handlersocket_port_wr= 20003 -loose_handlersocket_threads= 2 -loose_handlersocket_threads_wr= 1 -loose_handlersocket_support_merge_table= 0 -loose_handlersocket_direct_update_mode= 2 -loose_handlersocket_unlimited_boundary= 65536 -loose_handlersocket_bulk_insert= 0 -loose_handlersocket_bulk_insert_timeout= 0 -loose_handlersocket_general_log= 1 -loose_handlersocket_timeout= 30 -loose_handlersocket_close_table_interval=2 -open_files_limit= 4096 - -[mysqld.2.2] -loose_handlersocket_port= 20004 -loose_handlersocket_port_wr= 20005 -loose_handlersocket_threads= 2 -loose_handlersocket_threads_wr= 1 -loose_handlersocket_support_merge_table= 0 -loose_handlersocket_direct_update_mode= 2 -loose_handlersocket_unlimited_boundary= 65536 -loose_handlersocket_bulk_insert= 0 -loose_handlersocket_bulk_insert_timeout= 0 -loose_handlersocket_general_log= 1 -loose_handlersocket_timeout= 30 -loose_handlersocket_close_table_interval=2 -open_files_limit= 4096 - -[mysqld.2.3] - -[mysqld.3.1] -loose_partition= 1 - -[mysqld.3.2] -loose_partition= 1 - -[mysqld.3.3] -loose_partition= 1 - -[mysqld.4.1] -loose_partition= 1 - - -[ENV] -USE_GEOMETRY_TEST= 1 -USE_FULLTEXT_TEST= 1 -USE_HA_TEST= 1 -USE_GENERAL_LOG= 1 -USE_REPLICATION= 1 -MASTER_1_MYPORT= @mysqld.1.1.port -MASTER_1_HSRPORT= 20000 -MASTER_1_HSWPORT= 20001 -MASTER_1_MYSOCK= @mysqld.1.1.socket -MASTER_1_ENGINE_TYPE= Spider -#MASTER_1_ENGINE_TYPE= MyISAM -MASTER_1_ENGINE= ENGINE=Spider -MASTER_1_CHARSET= DEFAULT CHARSET=utf8 -MASTER_1_ENGINE2= ENGINE=MyISAM -MASTER_1_CHARSET2= DEFAULT CHARSET=utf8 -MASTER_1_CHARSET3= DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci -SLAVE1_1_MYPORT= @mysqld.4.1.port -SLAVE1_1_MYSOCK= @mysqld.4.1.socket -SLAVE1_1_ENGINE_TYPE= MyISAM -SLAVE1_1_ENGINE= ENGINE=MyISAM -SLAVE1_1_CHARSET= DEFAULT CHARSET=utf8 -USE_CHILD_GROUP2= 1 -OUTPUT_CHILD_GROUP2= 0 -CHILD2_1_MYPORT= @mysqld.2.1.port -CHILD2_1_HSRPORT= 20002 -CHILD2_1_HSWPORT= 20003 -CHILD2_1_MYSOCK= @mysqld.2.1.socket -CHILD2_1_ENGINE_TYPE= InnoDB -CHILD2_1_ENGINE= ENGINE=InnoDB -CHILD2_1_CHARSET= DEFAULT CHARSET=utf8 -CHILD2_1_CHARSET2= DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci -CHILD2_2_MYPORT= @mysqld.2.2.port -CHILD2_2_HSRPORT= 20004 -CHILD2_2_HSWPORT= 20005 -CHILD2_2_MYSOCK= @mysqld.2.2.socket -CHILD2_2_ENGINE_TYPE= InnoDB -CHILD2_2_ENGINE= ENGINE=InnoDB -CHILD2_2_CHARSET= DEFAULT CHARSET=utf8 -CHILD2_3_MYPORT= @mysqld.2.3.port -CHILD2_3_MYSOCK= @mysqld.2.3.socket -CHILD2_3_ENGINE_TYPE= InnoDB -CHILD2_3_ENGINE= ENGINE=InnoDB -CHILD2_3_CHARSET= DEFAULT CHARSET=utf8 -CHILD2_1_FT_MYPORT= @mysqld.2.1.port -CHILD2_1_FT_MYSOCK= @mysqld.2.1.socket -CHILD2_1_FT_ENGINE_TYPE= MyISAM -CHILD2_1_FT_ENGINE= ENGINE=MyISAM -CHILD2_1_FT_CHARSET= DEFAULT CHARSET=utf8 -CHILD2_2_FT_MYPORT= @mysqld.2.2.port -CHILD2_2_FT_MYSOCK= @mysqld.2.2.socket -CHILD2_2_FT_ENGINE_TYPE= MyISAM -CHILD2_2_FT_ENGINE= ENGINE=MyISAM -CHILD2_2_FT_CHARSET= DEFAULT CHARSET=utf8 -CHILD2_1_GM_MYPORT= @mysqld.2.1.port -CHILD2_1_GM_MYSOCK= @mysqld.2.1.socket -CHILD2_1_GM_ENGINE_TYPE= MyISAM -CHILD2_1_GM_ENGINE= ENGINE=MyISAM -CHILD2_1_GM_CHARSET= DEFAULT CHARSET=utf8 -CHILD2_2_GM_MYPORT= @mysqld.2.2.port -CHILD2_2_GM_MYSOCK= @mysqld.2.2.socket -CHILD2_2_GM_ENGINE_TYPE= MyISAM -CHILD2_2_GM_ENGINE= ENGINE=MyISAM -CHILD2_2_GM_CHARSET= DEFAULT CHARSET=utf8 -USE_CHILD_GROUP3= 1 -OUTPUT_CHILD_GROUP3= 0 -CHILD3_1_MYPORT= @mysqld.3.1.port -CHILD3_1_MYSOCK= @mysqld.3.1.socket -CHILD3_1_ENGINE_TYPE= InnoDB -CHILD3_1_ENGINE= ENGINE=InnoDB -CHILD3_1_CHARSET= DEFAULT CHARSET=utf8 -CHILD3_2_MYPORT= @mysqld.3.2.port -CHILD3_2_MYSOCK= @mysqld.3.2.socket -CHILD3_2_ENGINE_TYPE= InnoDB -CHILD3_2_ENGINE= ENGINE=InnoDB -CHILD3_2_CHARSET= DEFAULT CHARSET=utf8 -CHILD3_3_MYPORT= @mysqld.3.3.port -CHILD3_3_MYSOCK= @mysqld.3.3.socket -CHILD3_3_ENGINE_TYPE= InnoDB -CHILD3_3_ENGINE= ENGINE=InnoDB -CHILD3_3_CHARSET= DEFAULT CHARSET=utf8 - -STR_SEMICOLON= ; - -#The followings are set in include/init_xxx.inc files -# MASTER_1_COMMENT_2_1 -# MASTER_1_COMMENT2_2_1 -# MASTER_1_COMMENT3_2_1 -# MASTER_1_COMMENT4_2_1 -# MASTER_1_COMMENT5_2_1 -# MASTER_1_COMMENT_P_2_1 -# CHILD2_1_DROP_TABLES -# CHILD2_1_CREATE_TABLES -# CHILD2_1_SELECT_TABLES -# CHILD2_1_DROP_TABLES2 -# CHILD2_1_CREATE_TABLES2 -# CHILD2_1_SELECT_TABLES2 -# CHILD2_1_DROP_TABLES3 -# CHILD2_1_CREATE_TABLES3 -# CHILD2_1_SELECT_TABLES3 -# CHILD2_1_DROP_TABLES4 -# CHILD2_1_CREATE_TABLES4 -# CHILD2_1_SELECT_TABLES4 -# CHILD2_1_DROP_TABLES5 -# CHILD2_1_CREATE_TABLES5 -# CHILD2_1_SELECT_TABLES5 -# CHILD2_1_DROP_TABLES6 -# CHILD2_1_CREATE_TABLES6 -# CHILD2_1_SELECT_TABLES6 -# CHILD2_2_DROP_TABLES -# CHILD2_2_CREATE_TABLES -# CHILD2_2_SELECT_TABLES +!include my_1_1.cnf +!include my_2_1.cnf +!include my_2_2.cnf +!include my_2_3.cnf +!include my_3_1.cnf +!include my_3_2.cnf +!include my_3_3.cnf +!include my_4_1.cnf diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_1_1.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_1_1.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_1_1.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_1_1.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,44 @@ +[mysqld.1.1] +log-bin= master-bin +loose_handlersocket_port= 20000 +loose_handlersocket_port_wr= 20001 +loose_handlersocket_threads= 2 +loose_handlersocket_threads_wr= 1 +loose_handlersocket_support_merge_table= 0 +loose_handlersocket_direct_update_mode= 2 +loose_handlersocket_unlimited_boundary= 65536 +loose_handlersocket_bulk_insert= 0 +loose_handlersocket_bulk_insert_timeout= 0 +loose_handlersocket_general_log= 1 +loose_handlersocket_timeout= 30 +loose_handlersocket_close_table_interval=2 +open_files_limit= 4096 +loose_partition= 1 + +[ENV] +USE_GEOMETRY_TEST= 1 +USE_FULLTEXT_TEST= 1 +USE_HA_TEST= 1 +USE_GENERAL_LOG= 1 +USE_REPLICATION= 1 +MASTER_1_MYPORT= @mysqld.1.1.port +MASTER_1_HSRPORT= 20000 +MASTER_1_HSWPORT= 20001 +MASTER_1_MYSOCK= @mysqld.1.1.socket +MASTER_1_ENGINE_TYPE= Spider +#MASTER_1_ENGINE_TYPE= MyISAM +MASTER_1_ENGINE= ENGINE=Spider +MASTER_1_CHARSET= DEFAULT CHARSET=utf8 +MASTER_1_ENGINE2= ENGINE=MyISAM +MASTER_1_CHARSET2= DEFAULT CHARSET=utf8 +MASTER_1_CHARSET3= DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci + +STR_SEMICOLON= ; + +#The followings are set in include/init_xxx.inc files +# MASTER_1_COMMENT_2_1 +# MASTER_1_COMMENT2_2_1 +# MASTER_1_COMMENT3_2_1 +# MASTER_1_COMMENT4_2_1 +# MASTER_1_COMMENT5_2_1 +# MASTER_1_COMMENT_P_2_1 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_2_1.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_1.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_2_1.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_1.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,56 @@ +[mysqld.2.1] +loose_handlersocket_port= 20002 +loose_handlersocket_port_wr= 20003 +loose_handlersocket_threads= 2 +loose_handlersocket_threads_wr= 1 +loose_handlersocket_support_merge_table= 0 +loose_handlersocket_direct_update_mode= 2 +loose_handlersocket_unlimited_boundary= 65536 +loose_handlersocket_bulk_insert= 0 +loose_handlersocket_bulk_insert_timeout= 0 +loose_handlersocket_general_log= 1 +loose_handlersocket_timeout= 30 +loose_handlersocket_close_table_interval=2 +open_files_limit= 4096 + +[ENV] +USE_CHILD_GROUP2= 1 +OUTPUT_CHILD_GROUP2= 0 +CHILD2_1_MYPORT= @mysqld.2.1.port +CHILD2_1_HSRPORT= 20002 +CHILD2_1_HSWPORT= 20003 +CHILD2_1_MYSOCK= @mysqld.2.1.socket +CHILD2_1_ENGINE_TYPE= InnoDB +CHILD2_1_ENGINE= ENGINE=InnoDB +CHILD2_1_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_1_CHARSET2= DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci +CHILD2_1_FT_MYPORT= @mysqld.2.1.port +CHILD2_1_FT_MYSOCK= @mysqld.2.1.socket +CHILD2_1_FT_ENGINE_TYPE= MyISAM +CHILD2_1_FT_ENGINE= ENGINE=MyISAM +CHILD2_1_FT_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_1_GM_MYPORT= @mysqld.2.1.port +CHILD2_1_GM_MYSOCK= @mysqld.2.1.socket +CHILD2_1_GM_ENGINE_TYPE= MyISAM +CHILD2_1_GM_ENGINE= ENGINE=MyISAM +CHILD2_1_GM_CHARSET= DEFAULT CHARSET=utf8 + +#The followings are set in include/init_xxx.inc files +# CHILD2_1_DROP_TABLES +# CHILD2_1_CREATE_TABLES +# CHILD2_1_SELECT_TABLES +# CHILD2_1_DROP_TABLES2 +# CHILD2_1_CREATE_TABLES2 +# CHILD2_1_SELECT_TABLES2 +# CHILD2_1_DROP_TABLES3 +# CHILD2_1_CREATE_TABLES3 +# CHILD2_1_SELECT_TABLES3 +# CHILD2_1_DROP_TABLES4 +# CHILD2_1_CREATE_TABLES4 +# CHILD2_1_SELECT_TABLES4 +# CHILD2_1_DROP_TABLES5 +# CHILD2_1_CREATE_TABLES5 +# CHILD2_1_SELECT_TABLES5 +# CHILD2_1_DROP_TABLES6 +# CHILD2_1_CREATE_TABLES6 +# CHILD2_1_SELECT_TABLES6 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_2_2.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_2.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_2_2.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_2.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,38 @@ +[mysqld.2.2] +loose_handlersocket_port= 20004 +loose_handlersocket_port_wr= 20005 +loose_handlersocket_threads= 2 +loose_handlersocket_threads_wr= 1 +loose_handlersocket_support_merge_table= 0 +loose_handlersocket_direct_update_mode= 2 +loose_handlersocket_unlimited_boundary= 65536 +loose_handlersocket_bulk_insert= 0 +loose_handlersocket_bulk_insert_timeout= 0 +loose_handlersocket_general_log= 1 +loose_handlersocket_timeout= 30 +loose_handlersocket_close_table_interval=2 +open_files_limit= 4096 + +[ENV] +CHILD2_2_MYPORT= @mysqld.2.2.port +CHILD2_2_HSRPORT= 20004 +CHILD2_2_HSWPORT= 20005 +CHILD2_2_MYSOCK= @mysqld.2.2.socket +CHILD2_2_ENGINE_TYPE= InnoDB +CHILD2_2_ENGINE= ENGINE=InnoDB +CHILD2_2_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_2_FT_MYPORT= @mysqld.2.2.port +CHILD2_2_FT_MYSOCK= @mysqld.2.2.socket +CHILD2_2_FT_ENGINE_TYPE= MyISAM +CHILD2_2_FT_ENGINE= ENGINE=MyISAM +CHILD2_2_FT_CHARSET= DEFAULT CHARSET=utf8 +CHILD2_2_GM_MYPORT= @mysqld.2.2.port +CHILD2_2_GM_MYSOCK= @mysqld.2.2.socket +CHILD2_2_GM_ENGINE_TYPE= MyISAM +CHILD2_2_GM_ENGINE= ENGINE=MyISAM +CHILD2_2_GM_CHARSET= DEFAULT CHARSET=utf8 + +#The followings are set in include/init_xxx.inc files +# CHILD2_2_DROP_TABLES +# CHILD2_2_CREATE_TABLES +# CHILD2_2_SELECT_TABLES diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_2_3.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_3.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_2_3.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_2_3.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,9 @@ +[mysqld.2.3] +loose_partition= 1 + +[ENV] +CHILD2_3_MYPORT= @mysqld.2.3.port +CHILD2_3_MYSOCK= @mysqld.2.3.socket +CHILD2_3_ENGINE_TYPE= InnoDB +CHILD2_3_ENGINE= ENGINE=InnoDB +CHILD2_3_CHARSET= DEFAULT CHARSET=utf8 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_3_1.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_1.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_3_1.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_1.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,11 @@ +[mysqld.3.1] +loose_partition= 1 + +[ENV] +USE_CHILD_GROUP3= 1 +OUTPUT_CHILD_GROUP3= 0 +CHILD3_1_MYPORT= @mysqld.3.1.port +CHILD3_1_MYSOCK= @mysqld.3.1.socket +CHILD3_1_ENGINE_TYPE= InnoDB +CHILD3_1_ENGINE= ENGINE=InnoDB +CHILD3_1_CHARSET= DEFAULT CHARSET=utf8 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_3_2.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_2.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_3_2.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_2.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,9 @@ +[mysqld.3.2] +loose_partition= 1 + +[ENV] +CHILD3_2_MYPORT= @mysqld.3.2.port +CHILD3_2_MYSOCK= @mysqld.3.2.socket +CHILD3_2_ENGINE_TYPE= InnoDB +CHILD3_2_ENGINE= ENGINE=InnoDB +CHILD3_2_CHARSET= DEFAULT CHARSET=utf8 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_3_3.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_3.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_3_3.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_3_3.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,9 @@ +[mysqld.3.3] +loose_partition= 1 + +[ENV] +CHILD3_3_MYPORT= @mysqld.3.3.port +CHILD3_3_MYSOCK= @mysqld.3.3.socket +CHILD3_3_ENGINE_TYPE= InnoDB +CHILD3_3_ENGINE= ENGINE=InnoDB +CHILD3_3_CHARSET= DEFAULT CHARSET=utf8 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/my_4_1.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/my_4_1.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/my_4_1.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/my_4_1.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,9 @@ +[mysqld.4.1] +loose_partition= 1 + +[ENV] +SLAVE1_1_MYPORT= @mysqld.4.1.port +SLAVE1_1_MYSOCK= @mysqld.4.1.socket +SLAVE1_1_ENGINE_TYPE= MyISAM +SLAVE1_1_ENGINE= ENGINE=MyISAM +SLAVE1_1_CHARSET= DEFAULT CHARSET=utf8 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/connection_override.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/connection_override.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/connection_override.result 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/connection_override.result 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,44 @@ +for master_1 +for child2 +for child3 +set spider_same_server_link= 1; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'invalid',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2", database "test"'; +insert into t1 values (1), (2), (3); +select * from t1; +c +1 +2 +3 +drop table t1, t2; +drop server srv; +CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'invalid',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +CONNECTION='WRAPPER "mysql", srv "srv",TABLE "t2", database "test"'; +insert into t1 values (1), (2), (3); +select * from t1; +c +1 +2 +3 +drop table t1, t2; +drop server srv; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +CONNECTION='user "root", database "invalid"' +COMMENT='WRAPPER "mysql", SOCKET "$MASTER_1_MYSOCK",TABLE "t2", database "test"'; +insert into t1 values (1), (2), (3); +select * from t1; +c +1 +2 +3 +drop table t1, t2; +for master_1 +for child2 +for child3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_join.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_join.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_join.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_join.result 2024-08-03 07:29:59.000000000 +0000 @@ -167,7 +167,7 @@ SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; argument select `id`,`hr_status`,`region_code`,`region` from `auto_test_remote`.`tbl_person` where `id` = '24FC3F0A5119432BAE13DD65AABAA39C' and `region` = 510411 -select count(0) `count(0)` from `auto_test_remote`.`tbl_ncd_cm_person` t0 where ((t0.`person_id` = '24FC3F0A5119432BAE13DD65AABAA39C') and (t0.`diseaseKind_id` = '52A0328740914BCE86ED10A4D2521816')) +select count(0) `count(0)` from (select 1) t0 join `auto_test_remote`.`tbl_ncd_cm_person` t1 where ((t1.`person_id` = '24FC3F0A5119432BAE13DD65AABAA39C') and (t1.`diseaseKind_id` = '52A0328740914BCE86ED10A4D2521816')) SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT * FROM tbl_person; id hr_status region_code region diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result 2024-08-03 07:29:59.000000000 +0000 @@ -87,7 +87,7 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; argument -select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc +select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r_auto_inc` t2) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result 2024-08-03 07:29:59.000000000 +0000 @@ -86,7 +86,7 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; argument -select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t1.`c` = t2.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc +select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1) on ((t1.`c` = t2.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_join.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_join.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_join.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_join.result 2024-08-03 07:29:59.000000000 +0000 @@ -79,7 +79,7 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; argument -select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r_int` t2 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1) on ((t0.`a` = t2.`a`) and (t1.`a` = t2.`a`)) where 1 order by t0.`b` desc +select t0.`b` `b`,t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r_int` t2 left join (`auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t0.`a` = t2.`a`) and (t1.`a` = t2.`a`)) where 1 order by t0.`b` desc SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result 2024-08-03 07:29:59.000000000 +0000 @@ -87,7 +87,7 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; argument -select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join `auto_test_remote`.`ta_r_auto_inc` t2 on (t2.`b` = t3.`b`) left join `auto_test_remote`.`ta_r_3` t1 on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc +select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on (t1.`c` = t2.`c`)) on (t2.`b` = t3.`b`) where 1 order by t3.`a` desc SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result 2024-08-03 07:29:59.000000000 +0000 @@ -86,7 +86,7 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; argument -select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join `auto_test_remote`.`ta_r_3` t1 on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc +select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result 2024-08-03 07:29:59.000000000 +0000 @@ -87,7 +87,7 @@ connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; argument -select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 join `auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`)) where 1 order by t3.`a` desc +select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) join `auto_test_remote`.`ta_r_auto_inc` t2) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`)) where 1 order by t3.`a` desc SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; a b date_format(c, '%Y-%m-%d %H:%i:%s') diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/slave_trx_isolation.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/slave_trx_isolation.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/slave_trx_isolation.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/slave_trx_isolation.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc connection slave1_1; set @old_spider_slave_trx_isolation= @@spider_slave_trx_isolation; set global spider_slave_trx_isolation= 1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider3_fixes.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider3_fixes.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider3_fixes.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider3_fixes.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider3_fixes_part.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider3_fixes_part.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider3_fixes_part.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider3_fixes_part.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider_fixes.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider_fixes.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider_fixes.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider_fixes.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider_fixes_part.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider_fixes_part.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/spider_fixes_part.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/spider_fixes_part.result 2024-08-03 07:29:59.000000000 +0000 @@ -8,6 +8,7 @@ child3_2 child3_3 for slave1_1 +include/start_slave.inc drop and create databases connection master_1; @@ -109,6 +110,7 @@ 2.26 auto_increment with partition connection master_1; +include/save_master_pos.inc connection slave1_1; connection master_1; DROP TABLE IF EXISTS t1; diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/r/variable_deprecation.result mariadb-10.11.9/storage/spider/mysql-test/spider/r/variable_deprecation.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/r/variable_deprecation.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/r/variable_deprecation.result 2024-08-03 07:29:59.000000000 +0000 @@ -75,8 +75,6 @@ SHOW VARIABLES LIKE "spider_load_crd_at_startup"; Variable_name Value spider_load_crd_at_startup 0 -DROP TABLE tbl_a; -DROP TABLE tbl_b; # MDEV-28008 Deprecate spider_crd_mode and spider_sts_mode SET spider_crd_mode = 1; Warnings: diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result mariadb-10.11.9/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result --- mariadb-10.11.6/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result 2024-08-03 07:29:59.000000000 +0000 @@ -46,7 +46,7 @@ SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_a`%' ; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_b`%'; argument -select t0.`val` `val`,t0.`akey` `akey` from `auto_test_remote`.`tbl_a` t0 where (t0.`akey` = '4') +select t0.`val` `val`,t0.`akey` `akey` from `auto_test_remote`.`tbl_a` t0 join (select 1) t1 where (t0.`akey` = '4') SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_a`%' ; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_b`%' argument diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/t/connection_override.cnf mariadb-10.11.9/storage/spider/mysql-test/spider/t/connection_override.cnf --- mariadb-10.11.6/storage/spider/mysql-test/spider/t/connection_override.cnf 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/t/connection_override.cnf 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,2 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/t/connection_override.test mariadb-10.11.9/storage/spider/mysql-test/spider/t/connection_override.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/t/connection_override.test 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/t/connection_override.test 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1,43 @@ +--disable_query_log +--disable_result_log +--source test_init.inc +--enable_result_log +--enable_query_log +set spider_same_server_link= 1; + +# COMMENT overrides SERVER +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'invalid',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +COMMENT='WRAPPER "mysql", srv "srv",TABLE "t2", database "test"'; +insert into t1 values (1), (2), (3); +select * from t1; +drop table t1, t2; +drop server srv; + +# CONNECTION overrides SERVER +evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql +OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'invalid',user 'root'); +create table t2 (c int); +create table t1 (c int) ENGINE=Spider +CONNECTION='WRAPPER "mysql", srv "srv",TABLE "t2", database "test"'; +insert into t1 values (1), (2), (3); +select * from t1; +drop table t1, t2; +drop server srv; + +# COMMENT overrides CONNECTION +create table t2 (c int); +evalp create table t1 (c int) ENGINE=Spider +CONNECTION='user "root", database "invalid"' +COMMENT='WRAPPER "mysql", SOCKET "$MASTER_1_MYSOCK",TABLE "t2", database "test"'; +insert into t1 values (1), (2), (3); +select * from t1; +drop table t1, t2; + +--disable_query_log +--disable_result_log +--source test_deinit.inc +--enable_result_log +--enable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/t/slave_test_init.inc mariadb-10.11.9/storage/spider/mysql-test/spider/t/slave_test_init.inc --- mariadb-10.11.6/storage/spider/mysql-test/spider/t/slave_test_init.inc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/t/slave_test_init.inc 2024-08-03 07:29:59.000000000 +0000 @@ -19,7 +19,7 @@ MASTER_PORT = $MASTER_1_MYPORT ; } -START SLAVE; +--source include/start_slave.inc --connection master_1 call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); --connection slave1_1 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/t/spider_fixes_part.opt mariadb-10.11.9/storage/spider/mysql-test/spider/t/spider_fixes_part.opt --- mariadb-10.11.6/storage/spider/mysql-test/spider/t/spider_fixes_part.opt 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/t/spider_fixes_part.opt 2024-08-03 07:29:59.000000000 +0000 @@ -0,0 +1 @@ +--log-warnings=3 diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/t/spider_fixes_part.test mariadb-10.11.9/storage/spider/mysql-test/spider/t/spider_fixes_part.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/t/spider_fixes_part.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/t/spider_fixes_part.test 2024-08-03 07:29:59.000000000 +0000 @@ -488,7 +488,23 @@ if ($USE_REPLICATION) { save_master_pos; + --source include/save_master_pos.inc --connection slave1_1 + --let $rc= `select master_pos_wait('$_master_file', $_master_pos, 300, '')` + if (`select $rc is NULL OR $rc < 0`) + { + --vertical_results + show slave status; + --horizontal_results + show global status; + show global variables; + --let $MYSQLD_DATADIR= `select @@datadir` + --exec $MYSQL_BINLOG -v $MYSQLD_DATADIR/mysqld-relay-bin.000001; + # Check that the relay-log file is fully on disk. + --exec ls -l $MYSQLD_DATADIR; + # After that try to restart the slave SQL thread + start slave sql_thread; + } sync_with_master; --connection master_1 --disable_query_log diff -Nru mariadb-10.11.6/storage/spider/mysql-test/spider/t/variable_deprecation.test mariadb-10.11.9/storage/spider/mysql-test/spider/t/variable_deprecation.test --- mariadb-10.11.6/storage/spider/mysql-test/spider/t/variable_deprecation.test 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/mysql-test/spider/t/variable_deprecation.test 2024-08-03 07:29:59.000000000 +0000 @@ -47,9 +47,6 @@ SET GLOBAL spider_load_crd_at_startup = 0; SHOW VARIABLES LIKE "spider_load_crd_at_startup"; -DROP TABLE tbl_a; -DROP TABLE tbl_b; - --echo # MDEV-28008 Deprecate spider_crd_mode and spider_sts_mode SET spider_crd_mode = 1; SHOW VARIABLES LIKE "spider_crd_mode"; diff -Nru mariadb-10.11.6/storage/spider/spd_conn.cc mariadb-10.11.9/storage/spider/spd_conn.cc --- mariadb-10.11.6/storage/spider/spd_conn.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_conn.cc 2024-08-03 07:29:59.000000000 +0000 @@ -56,7 +56,7 @@ extern LEX_CSTRING spider_unique_id; pthread_mutex_t spider_conn_id_mutex; pthread_mutex_t spider_ipport_conn_mutex; -ulonglong spider_conn_id = 1; +ulonglong spider_conn_id; extern pthread_attr_t spider_pt_attr; @@ -93,7 +93,7 @@ HASH spider_open_connections; uint spider_open_connections_id; HASH spider_ipport_conns; -long spider_conn_mutex_id = 0; +long spider_conn_mutex_id; const char *spider_open_connections_func_name; const char *spider_open_connections_file_name; @@ -377,6 +377,19 @@ DBUG_VOID_RETURN; } +static inline void spider_memcpy_or_null(char **dest, char *alloced, + char *src, uint *dest_len, + uint tgt_len) +{ + *dest_len= tgt_len; + if (src) + { + *dest= alloced; + memcpy(*dest, src, tgt_len); + } else + *dest= NULL; +} + SPIDER_CONN *spider_create_conn( SPIDER_SHARE *share, ha_spider *spider, @@ -411,7 +424,7 @@ tables_on_different_db_are_joinable = TRUE; } if (!(conn = (SPIDER_CONN *) - spider_bulk_malloc(spider_current_trx, 18, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_CONN_1, MYF(MY_WME | MY_ZEROFILL), &conn, (uint) (sizeof(*conn)), &tmp_name, (uint) (share->conn_keys_lengths[link_idx] + 1), &tmp_host, (uint) (share->tgt_hosts_lengths[link_idx] + 1), @@ -450,130 +463,74 @@ goto error_alloc_conn; } - conn->default_database.init_calc_mem(75); + conn->default_database.init_calc_mem(SPD_MID_CREATE_CONN_2); conn->conn_key_length = share->conn_keys_lengths[link_idx]; conn->conn_key = tmp_name; memcpy(conn->conn_key, share->conn_keys[link_idx], share->conn_keys_lengths[link_idx]); conn->conn_key_hash_value = share->conn_keys_hash_value[link_idx]; - conn->tgt_host_length = share->tgt_hosts_lengths[link_idx]; - conn->tgt_host = tmp_host; - memcpy(conn->tgt_host, share->tgt_hosts[link_idx], - share->tgt_hosts_lengths[link_idx]); - - conn->tgt_username_length = share->tgt_usernames_lengths[link_idx]; - conn->tgt_username = tmp_username; - if (conn->tgt_username_length) - memcpy(conn->tgt_username, share->tgt_usernames[link_idx], - share->tgt_usernames_lengths[link_idx]); - - conn->tgt_password_length = share->tgt_passwords_lengths[link_idx]; - conn->tgt_password = tmp_password; - if (conn->tgt_password_length) - memcpy(conn->tgt_password, share->tgt_passwords[link_idx], - share->tgt_passwords_lengths[link_idx]); - - conn->tgt_socket_length = share->tgt_sockets_lengths[link_idx]; - conn->tgt_socket = tmp_socket; - if (conn->tgt_socket_length) - memcpy(conn->tgt_socket, share->tgt_sockets[link_idx], - share->tgt_sockets_lengths[link_idx]); - - conn->tgt_wrapper_length = share->tgt_wrappers_lengths[link_idx]; - conn->tgt_wrapper = tmp_wrapper; - memcpy(conn->tgt_wrapper, share->tgt_wrappers[link_idx], - share->tgt_wrappers_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_host, tmp_host, + share->tgt_hosts[link_idx], &conn->tgt_host_length, + share->tgt_hosts_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_username, tmp_username, + share->tgt_usernames[link_idx], + &conn->tgt_username_length, + share->tgt_usernames_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_password, tmp_password, + share->tgt_passwords[link_idx], + &conn->tgt_password_length, + share->tgt_passwords_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_socket, tmp_socket, + share->tgt_sockets[link_idx], + &conn->tgt_socket_length, + share->tgt_sockets_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_wrapper, tmp_wrapper, + share->tgt_wrappers[link_idx], + &conn->tgt_wrapper_length, + share->tgt_wrappers_lengths[link_idx]); if (!tables_on_different_db_are_joinable) { - conn->tgt_db_length = share->tgt_dbs_lengths[link_idx]; - conn->tgt_db = tmp_db; - memcpy(conn->tgt_db, share->tgt_dbs[link_idx], - share->tgt_dbs_lengths[link_idx]); - } - conn->tgt_ssl_ca_length = share->tgt_ssl_cas_lengths[link_idx]; - if (conn->tgt_ssl_ca_length) - { - conn->tgt_ssl_ca = tmp_ssl_ca; - memcpy(conn->tgt_ssl_ca, share->tgt_ssl_cas[link_idx], - share->tgt_ssl_cas_lengths[link_idx]); - } else - conn->tgt_ssl_ca = NULL; - conn->tgt_ssl_capath_length = share->tgt_ssl_capaths_lengths[link_idx]; - if (conn->tgt_ssl_capath_length) - { - conn->tgt_ssl_capath = tmp_ssl_capath; - memcpy(conn->tgt_ssl_capath, share->tgt_ssl_capaths[link_idx], - share->tgt_ssl_capaths_lengths[link_idx]); - } else - conn->tgt_ssl_capath = NULL; - conn->tgt_ssl_cert_length = share->tgt_ssl_certs_lengths[link_idx]; - if (conn->tgt_ssl_cert_length) - { - conn->tgt_ssl_cert = tmp_ssl_cert; - memcpy(conn->tgt_ssl_cert, share->tgt_ssl_certs[link_idx], - share->tgt_ssl_certs_lengths[link_idx]); - } else - conn->tgt_ssl_cert = NULL; - conn->tgt_ssl_cipher_length = share->tgt_ssl_ciphers_lengths[link_idx]; - if (conn->tgt_ssl_cipher_length) - { - conn->tgt_ssl_cipher = tmp_ssl_cipher; - memcpy(conn->tgt_ssl_cipher, share->tgt_ssl_ciphers[link_idx], - share->tgt_ssl_ciphers_lengths[link_idx]); - } else - conn->tgt_ssl_cipher = NULL; - conn->tgt_ssl_key_length = share->tgt_ssl_keys_lengths[link_idx]; - if (conn->tgt_ssl_key_length) - { - conn->tgt_ssl_key = tmp_ssl_key; - memcpy(conn->tgt_ssl_key, share->tgt_ssl_keys[link_idx], - share->tgt_ssl_keys_lengths[link_idx]); - } else - conn->tgt_ssl_key = NULL; - conn->tgt_default_file_length = share->tgt_default_files_lengths[link_idx]; - if (conn->tgt_default_file_length) - { - conn->tgt_default_file = tmp_default_file; - memcpy(conn->tgt_default_file, share->tgt_default_files[link_idx], - share->tgt_default_files_lengths[link_idx]); - } else - conn->tgt_default_file = NULL; - conn->tgt_default_group_length = - share->tgt_default_groups_lengths[link_idx]; - if (conn->tgt_default_group_length) - { - conn->tgt_default_group = tmp_default_group; - memcpy(conn->tgt_default_group, share->tgt_default_groups[link_idx], - share->tgt_default_groups_lengths[link_idx]); - } else - conn->tgt_default_group = NULL; - conn->tgt_dsn_length = - share->tgt_dsns_lengths[link_idx]; - if (conn->tgt_dsn_length) - { - conn->tgt_dsn = tmp_dsn; - memcpy(conn->tgt_dsn, share->tgt_dsns[link_idx], - share->tgt_dsns_lengths[link_idx]); - } else - conn->tgt_dsn = NULL; - conn->tgt_filedsn_length = - share->tgt_filedsns_lengths[link_idx]; - if (conn->tgt_filedsn_length) - { - conn->tgt_filedsn = tmp_filedsn; - memcpy(conn->tgt_filedsn, share->tgt_filedsns[link_idx], - share->tgt_filedsns_lengths[link_idx]); - } else - conn->tgt_filedsn = NULL; - conn->tgt_driver_length = - share->tgt_drivers_lengths[link_idx]; - if (conn->tgt_driver_length) - { - conn->tgt_driver = tmp_driver; - memcpy(conn->tgt_driver, share->tgt_drivers[link_idx], - share->tgt_drivers_lengths[link_idx]); - } else - conn->tgt_driver = NULL; + spider_memcpy_or_null(&conn->tgt_db, tmp_db, share->tgt_dbs[link_idx], + &conn->tgt_db_length, + share->tgt_dbs_lengths[link_idx]); + } + spider_memcpy_or_null(&conn->tgt_ssl_ca, tmp_ssl_ca, + share->tgt_ssl_cas[link_idx], + &conn->tgt_ssl_ca_length, + share->tgt_ssl_cas_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_ssl_capath, tmp_ssl_capath, + share->tgt_ssl_capaths[link_idx], + &conn->tgt_ssl_capath_length, + share->tgt_ssl_capaths_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_ssl_cert, tmp_ssl_cert, + share->tgt_ssl_certs[link_idx], + &conn->tgt_ssl_cert_length, + share->tgt_ssl_certs_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_ssl_cipher, tmp_ssl_cipher, + share->tgt_ssl_ciphers[link_idx], + &conn->tgt_ssl_cipher_length, + share->tgt_ssl_ciphers_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_ssl_key, tmp_ssl_key, + share->tgt_ssl_keys[link_idx], + &conn->tgt_ssl_key_length, + share->tgt_ssl_keys_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_default_file, tmp_default_file, + share->tgt_default_files[link_idx], + &conn->tgt_default_file_length, + share->tgt_default_files_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_default_group, tmp_default_group, + share->tgt_default_groups[link_idx], + &conn->tgt_default_group_length, + share->tgt_default_groups_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_dsn, tmp_dsn, share->tgt_dsns[link_idx], + &conn->tgt_dsn_length, + share->tgt_dsns_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_filedsn, tmp_filedsn, share->tgt_filedsns[link_idx], + &conn->tgt_filedsn_length, + share->tgt_filedsns_lengths[link_idx]); + spider_memcpy_or_null(&conn->tgt_driver, tmp_driver, share->tgt_drivers[link_idx], + &conn->tgt_driver_length, + share->tgt_drivers_lengths[link_idx]); conn->tgt_port = share->tgt_ports[link_idx]; conn->tgt_ssl_vsc = share->tgt_ssl_vscs[link_idx]; conn->dbton_id = share->sql_dbton_ids[link_idx]; @@ -1110,21 +1067,35 @@ DBUG_VOID_RETURN; } +/* + Construct merged values and insert into the loop check queue + + Search the loop_check_queue for the data node table, and if one does + not exist, construct the merged value in the same format as the + right hand side. Otherwise, merge the right hand side of the + existing SPIDER_CONN_LOOP_CHECK with the right hand side of lcptr + into one right hand side. In either case, add the + SPIDER_CONN_LOOP_CHECK to the loop check queue +*/ int spider_conn_queue_and_merge_loop_check( SPIDER_CONN *conn, SPIDER_CONN_LOOP_CHECK *lcptr ) { int error_num = HA_ERR_OUT_OF_MEM; - char *tmp_name, *from_name, *cur_name, *to_name, *full_name, *from_value, + char *tmp_name, *cur_name, *to_name, *full_name, *from_value, *merged_value; SPIDER_CONN_LOOP_CHECK *lcqptr, *lcrptr; DBUG_ENTER("spider_conn_queue_and_merge_loop_check"); DBUG_PRINT("info", ("spider conn=%p", conn)); - if (unlikely(!(lcqptr = (SPIDER_CONN_LOOP_CHECK *) + if (!(lcqptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_search_using_hash_value(&conn->loop_check_queue, lcptr->hash_value_to, - (uchar *) lcptr->to_name.str, lcptr->to_name.length)))) + (uchar *) lcptr->to_name.str, lcptr->to_name.length))) { + /* + Construct the right hand side: + ---- + */ DBUG_PRINT("info", ("spider create merged_value and insert")); lcptr->merged_value.length = spider_unique_id.length + lcptr->cur_name.length + lcptr->from_value.length + 1; @@ -1142,10 +1113,10 @@ } lcptr->flag |= SPIDER_LOP_CHK_QUEUED; } else { + /* Merge lcptr and lcqptr into a newly created lcrptr. */ DBUG_PRINT("info", ("spider append merged_value and replace")); if (unlikely(!spider_bulk_malloc(spider_current_trx, 271, MYF(MY_WME), &lcrptr, (uint) (sizeof(SPIDER_CONN_LOOP_CHECK)), - &from_name, (uint) (lcqptr->from_name.length + 1), &cur_name, (uint) (lcqptr->cur_name.length + 1), &to_name, (uint) (lcqptr->to_name.length + 1), &full_name, (uint) (lcqptr->full_name.length + 1), @@ -1157,11 +1128,11 @@ )) { goto error_alloc_loop_check_replace; } + /* + TODO: the new lcrptr has the same cur_name, to_name, full_name + and from_value as lcqptr, but they do not seem to be relevant. + */ lcrptr->hash_value_to = lcqptr->hash_value_to; - lcrptr->hash_value_full = lcqptr->hash_value_full; - lcrptr->from_name.str = from_name; - lcrptr->from_name.length = lcqptr->from_name.length; - memcpy(from_name, lcqptr->from_name.str, lcqptr->from_name.length + 1); lcrptr->cur_name.str = cur_name; lcrptr->cur_name.length = lcqptr->cur_name.length; memcpy(cur_name, lcqptr->cur_name.str, lcqptr->cur_name.length + 1); @@ -1174,8 +1145,14 @@ lcrptr->from_value.str = from_value; lcrptr->from_value.length = lcqptr->from_value.length; memcpy(from_value, lcqptr->from_value.str, lcqptr->from_value.length + 1); + /* + The merged_value of lcrptr is a concatenation of that of lcqptr + and constructed merged_value from lcptr. + */ lcrptr->merged_value.str = merged_value; - lcrptr->merged_value.length = lcqptr->merged_value.length; + lcrptr->merged_value.length = + lcqptr->merged_value.length + spider_unique_id.length + + lcptr->cur_name.length + 1 + lcptr->from_value.length; memcpy(merged_value, lcqptr->merged_value.str, lcqptr->merged_value.length); merged_value += lcqptr->merged_value.length; @@ -1202,15 +1179,6 @@ goto error_hash_insert_queue; } lcptr->flag = SPIDER_LOP_CHK_MERAGED; - lcptr->next = NULL; - if (!conn->loop_check_meraged_first) - { - conn->loop_check_meraged_first = lcptr; - conn->loop_check_meraged_last = lcptr; - } else { - conn->loop_check_meraged_last->next = lcptr; - conn->loop_check_meraged_last = lcptr; - } } DBUG_RETURN(0); @@ -1226,7 +1194,6 @@ int spider_conn_reset_queue_loop_check( SPIDER_CONN *conn ) { - int error_num; SPIDER_CONN_LOOP_CHECK *lcptr; DBUG_ENTER("spider_conn_reset_queue_loop_check"); uint l = 0; @@ -1243,30 +1210,8 @@ ++l; } - lcptr = conn->loop_check_ignored_first; - while (lcptr) - { - lcptr->flag = 0; - if ((error_num = spider_conn_queue_and_merge_loop_check(conn, lcptr))) - { - goto error_queue_and_merge; - } - lcptr = lcptr->next; - } - conn->loop_check_meraged_first = NULL; pthread_mutex_unlock(&conn->loop_check_mutex); DBUG_RETURN(0); - -error_queue_and_merge: - lcptr = lcptr->next; - while (lcptr) - { - lcptr->flag = 0; - lcptr = lcptr->next; - } - conn->loop_check_meraged_first = NULL; - pthread_mutex_unlock(&conn->loop_check_mutex); - DBUG_RETURN(error_num); } int spider_conn_queue_loop_check( @@ -1277,7 +1222,7 @@ int error_num = HA_ERR_OUT_OF_MEM; uint conn_link_idx = spider->conn_link_idx[link_idx], buf_sz; char path[FN_REFLEN + 1]; - char *tmp_name, *from_name, *cur_name, *to_name, *full_name, *from_value, + char *tmp_name, *cur_name, *to_name, *full_name, *from_value, *merged_value; user_var_entry *loop_check; char *loop_check_buf; @@ -1288,6 +1233,17 @@ LEX_CSTRING lex_str, from_str, to_str; DBUG_ENTER("spider_conn_queue_loop_check"); DBUG_PRINT("info", ("spider conn=%p", conn)); + /* + construct loop check user var name (left hand side) into + lex_str. It is of the format + + spider_lc_ + + So if the spider table name is ./test/t1, then the constructed + user var name is: + + spider_lc_./test/t1 + */ lex_str.length = top_share->path.length + SPIDER_SQL_LOP_CHK_PRM_PRF_LEN; buf_sz = lex_str.length + 2; loop_check_buf = (char *) my_alloca(buf_sz); @@ -1303,7 +1259,7 @@ loop_check_buf[lex_str.length] = '\0'; DBUG_PRINT("info", ("spider param name=%s", lex_str.str)); loop_check = get_variable(&thd->user_vars, &lex_str, FALSE); - if (!loop_check || loop_check->type != STRING_RESULT) + if (!loop_check || loop_check->type_handler()->result_type() != STRING_RESULT) { DBUG_PRINT("info", ("spider client is not Spider")); lex_str.str = ""; @@ -1313,6 +1269,16 @@ } else { lex_str.str = loop_check->value; lex_str.length = loop_check->length; + /* + Validate that there are at least four dashes in the user var + value: ---- + + Note: if the value is merged from multiple values, such as + + "------------" + + then only the first component is put into from_str + */ DBUG_PRINT("info", ("spider from_str=%s", lex_str.str)); if (unlikely(!(tmp_name = strchr(loop_check->value, '-')))) { @@ -1340,12 +1306,23 @@ } else { + /* + Validation passed. Put the first component of rhs in from_str + */ from_str.str = lex_str.str; from_str.length = tmp_name - lex_str.str + 1; } } my_afree(loop_check_buf); - + /* + construct loop_check_buf as -- e.g. + "---./test/t0--./test/t1-./test/t2", later used as + full_name + + from_str is the first component in the user var value (RHS) or + empty if user var value is empty, cur is the spider table, to_str + is the remote data node table + */ to_str.length = build_table_filename(path, FN_REFLEN, share->tgt_dbs[conn_link_idx] ? share->tgt_dbs[conn_link_idx] : "", share->tgt_table_names[conn_link_idx], "", 0); @@ -1375,7 +1352,7 @@ lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_search_using_hash_value(&conn->loop_checked, hash_value, (uchar *) loop_check_buf, buf_sz - 1); - if (unlikely( + if ( !lcptr || ( !lcptr->flag && @@ -1384,7 +1361,7 @@ memcmp(lcptr->from_value.str, lex_str.str, lex_str.length) ) ) - )) + ) { if (unlikely(lcptr)) { @@ -1395,7 +1372,6 @@ DBUG_PRINT("info", ("spider alloc_lcptr")); if (unlikely(!spider_bulk_malloc(spider_current_trx, 272, MYF(MY_WME), &lcptr, (uint) (sizeof(SPIDER_CONN_LOOP_CHECK)), - &from_name, (uint) (from_str.length + 1), &cur_name, (uint) (top_share->path.length + 1), &to_name, (uint) (to_str.length + 1), &full_name, (uint) (buf_sz), @@ -1408,9 +1384,6 @@ goto error_alloc_loop_check; } lcptr->flag = 0; - lcptr->from_name.str = from_name; - lcptr->from_name.length = from_str.length; - memcpy(from_name, from_str.str, from_str.length + 1); lcptr->cur_name.str = cur_name; lcptr->cur_name.length = top_share->path.length; memcpy(cur_name, top_share->path.str, top_share->path.length + 1); @@ -1423,29 +1396,28 @@ lcptr->from_value.str = from_value; lcptr->from_value.length = lex_str.length; memcpy(from_value, lex_str.str, lex_str.length + 1); + /* + merged_value will only be populated later, in + spider_conn_queue_and_merge_loop_check() + */ lcptr->merged_value.str = merged_value; - lcptr->hash_value_to = my_calc_hash(&conn->loop_checked, + lcptr->hash_value_to = my_calc_hash(&conn->loop_check_queue, (uchar *) to_str.str, to_str.length); - lcptr->hash_value_full = hash_value; + /* + Mark as checked. It will be added to loop_check_queue in + spider_conn_queue_and_merge_loop_check() below for checking + */ if (unlikely(my_hash_insert(&conn->loop_checked, (uchar *) lcptr))) { my_afree(loop_check_buf); goto error_hash_insert; } } else { + /* Already marked as checked, ignore and return. */ if (!lcptr->flag) { DBUG_PRINT("info", ("spider add to ignored list")); lcptr->flag |= SPIDER_LOP_CHK_IGNORED; - lcptr->next = NULL; - if (!conn->loop_check_ignored_first) - { - conn->loop_check_ignored_first = lcptr; - conn->loop_check_ignored_last = lcptr; - } else { - conn->loop_check_ignored_last->next = lcptr; - conn->loop_check_ignored_last = lcptr; - } } pthread_mutex_unlock(&conn->loop_check_mutex); my_afree(loop_check_buf); @@ -1865,7 +1837,7 @@ error_num = HA_ERR_OUT_OF_MEM; goto error_job_stack_init; } - spider_alloc_calc_mem_init(conn->bg_job_stack, 163); + spider_alloc_calc_mem_init(conn->bg_job_stack, SPD_MID_CREATE_CONN_THREAD_1); spider_alloc_calc_mem(spider_current_trx, conn->bg_job_stack, conn->bg_job_stack.max_element * @@ -3476,7 +3448,7 @@ char *buf = (char *) my_alloca(share->table_name_length + SPIDER_SQL_INT_LEN + 1); spider_string conv_name_str(buf, share->table_name_length + SPIDER_SQL_INT_LEN + 1, system_charset_info); - conv_name_str.init_calc_mem(105); + conv_name_str.init_calc_mem(SPD_MID_CREATE_MON_THREADS_1); conv_name_str.length(0); conv_name_str.q_append(share->table_name, share->table_name_length); for (roop_count = 0; roop_count < (int) share->all_link_count; @@ -3509,7 +3481,7 @@ } } if (!(share->bg_mon_thds = (THD **) - spider_bulk_malloc(spider_current_trx, 23, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_MON_THREADS_2, MYF(MY_WME | MY_ZEROFILL), &share->bg_mon_thds, (uint) (sizeof(THD *) * share->all_link_count), &share->bg_mon_threads, @@ -3787,6 +3759,24 @@ } } +/** + Returns a random (active) server with a maximum required link status + + Calculate the sum of balances of all servers whose link status is at + most the specified status ("eligible"), generate a random number + less than this balance, then find the first server cumulatively + exceeding this balance + + @param thd Connection used for generating a random number + @param link_statuses The link statuses of servers + @param access_balances The access balances of servers + @param conn_link_idx Array of indexes to servers + @param link_count Number of servers + @param link_status The maximum required link status + @retval Index to the found server + @retval -1 if no eligible servers + @retval -2 if out of memory +*/ int spider_conn_first_link_idx( THD *thd, long *link_statuses, @@ -3882,6 +3872,17 @@ DBUG_RETURN(tmp_link_idx); } +/** + Finds the next active server with a maximum required link status + + @param link_statuses The statuses of servers + @param conn_link_idx The array of active servers + @param link_idx The index of the current active server + @param link_count The number of active servers + @param link_status The required maximum link status + @return The next active server whose link status is + at most the required one. +*/ int spider_conn_link_idx_next( long *link_statuses, uint *conn_link_idx, @@ -3894,6 +3895,8 @@ link_idx++; if (link_idx >= link_count) break; + /* Asserts that the `link_idx`th active server is in the correct + "group" */ DBUG_ASSERT((conn_link_idx[link_idx] - link_idx) % link_count == 0); } while (link_statuses[conn_link_idx[link_idx]] > link_status); DBUG_PRINT("info",("spider link_idx=%d", link_idx)); diff -Nru mariadb-10.11.6/storage/spider/spd_conn.h mariadb-10.11.9/storage/spider/spd_conn.h --- mariadb-10.11.6/storage/spider/spd_conn.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_conn.h 2024-08-03 07:29:59.000000000 +0000 @@ -24,22 +24,60 @@ #define SPIDER_SIMPLE_RECORDS 3 #define SPIDER_SIMPLE_CHECKSUM_TABLE 4 +/* + The SPIDER_CONN_LOOP_CHECK has been added to the loop_check queue to + check for self-reference. +*/ #define SPIDER_LOP_CHK_QUEUED (1 << 0) +/* + The SPIDER_CONN_LOOP_CHECK is a merge of multiple + SPIDER_CONN_LOOP_CHECKs with the same data node table +*/ #define SPIDER_LOP_CHK_MERAGED (1 << 1) +/* + The SPIDER_CONN_LOOP_CHECK has been ignored because it has already + been marked as checked +*/ #define SPIDER_LOP_CHK_IGNORED (1 << 2) +/* Used for self-reference check. */ typedef struct st_spider_conn_loop_check { + /* + Could be 0, SPIDER_LOP_CHK_QUEUED, SPIDER_LOP_CHK_MERAGED, or + SPIDER_LOP_CHK_IGNORED + */ uint flag; + /* hash value of to_name, used for the hash conn->loop_checked */ my_hash_value_type hash_value_to; - my_hash_value_type hash_value_full; - LEX_CSTRING from_name; + /* + The fully qualified name of the current spider table, which will + also be used to construct the user var name to set in the data + node + */ LEX_CSTRING cur_name; + /* + The fully qualified data node table name, also used as key in + conn->loop_check_queue + */ LEX_CSTRING to_name; + /* + A concatenation of from_value, cur_name and to_name, used as key + in hash conn->loop_checked + */ LEX_CSTRING full_name; + /* + The first component of the uservar value on the current server, + consisting of information of a table that uses the current spider + table as a data node + */ LEX_CSTRING from_value; + /* + The uservar value to set in the data node, a concatenation of info + of tables, mac addresses and process ids of tables that use the + current spider table as the data node + */ LEX_CSTRING merged_value; - st_spider_conn_loop_check *next; } SPIDER_CONN_LOOP_CHECK; uchar *spider_conn_get_key( diff -Nru mariadb-10.11.6/storage/spider/spd_copy_tables.cc mariadb-10.11.9/storage/spider/spd_copy_tables.cc --- mariadb-10.11.6/storage/spider/spd_copy_tables.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_copy_tables.cc 2024-08-03 07:29:59.000000000 +0000 @@ -52,7 +52,7 @@ copy_tables->database_length = SPIDER_THD_db_length(copy_tables->trx->thd); if ( !(copy_tables->database = spider_create_string( - SPIDER_THD_db_str(copy_tables->trx->thd), + copy_tables->trx->thd->get_db(), copy_tables->database_length)) ) { my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); @@ -274,7 +274,7 @@ } do { if (!(table_conn = (SPIDER_COPY_TABLE_CONN *) - spider_bulk_malloc(spider_current_trx, 25, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_GET_COPY_TGT_TABLES_1, MYF(MY_WME | MY_ZEROFILL), &table_conn, (uint) (sizeof(SPIDER_COPY_TABLE_CONN)), &tmp_share, (uint) (sizeof(SPIDER_SHARE)), &tmp_connect_info, @@ -298,7 +298,7 @@ if ( (error_num = spider_get_sys_tables_connect_info( - table_tables, tmp_share, 0, mem_root)) || + table_tables, tmp_share, mem_root)) || (error_num = spider_get_sys_tables_link_status( table_tables, tmp_share, 0, mem_root)) || (error_num = spider_get_sys_tables_link_idx( @@ -590,7 +590,7 @@ } if (!(copy_tables->link_idxs[0] = (int *) - spider_bulk_malloc(spider_current_trx, 26, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_COPY_TABLES_CREATE_TABLE_LIST_1, MYF(MY_WME | MY_ZEROFILL), ©_tables->link_idxs[0], (uint) (sizeof(int) * copy_tables->link_idx_count[0]), ©_tables->link_idxs[1], @@ -772,7 +772,7 @@ } if (!(copy_tables = (SPIDER_COPY_TABLES *) - spider_bulk_malloc(spider_current_trx, 27, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_COPY_TABLES_BODY_1, MYF(MY_WME | MY_ZEROFILL), ©_tables, (uint) (sizeof(SPIDER_COPY_TABLES)), NullS)) ) { @@ -968,7 +968,12 @@ all_link_cnt = copy_tables->link_idx_count[0] + copy_tables->link_idx_count[1]; if ( - !(tmp_sql = new spider_string[all_link_cnt]) || + !(tmp_sql = new spider_string[all_link_cnt]) + ) { + my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); + goto error; + } + if ( !(spider = new ha_spider[all_link_cnt]) ) { my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); @@ -984,7 +989,7 @@ { tmp_spider = &spider[roop_count]; if (!(tmp_spider->dbton_handler = (spider_db_handler **) - spider_bulk_alloc_mem(spider_current_trx, 205, + spider_bulk_alloc_mem(spider_current_trx, SPD_MID_COPY_TABLES_BODY_2, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &tmp_spider->dbton_handler, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE, @@ -997,15 +1002,8 @@ tmp_spider->share = table_conn->share; tmp_spider->wide_handler = wide_handler; wide_handler->trx = copy_tables->trx; -/* - if (spider_db_append_set_names(table_conn->share)) - { - my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); - goto error_append_set_names; - } -*/ tmp_spider->conns = &table_conn->conn; - tmp_sql[roop_count].init_calc_mem(122); + tmp_sql[roop_count].init_calc_mem(SPD_MID_COPY_TABLES_BODY_3); tmp_sql[roop_count].set_charset(copy_tables->access_charset); tmp_spider->result_list.sqls = &tmp_sql[roop_count]; tmp_spider->need_mons = &table_conn->need_mon; @@ -1030,7 +1028,7 @@ { tmp_spider = &spider[roop_count]; if (!(tmp_spider->dbton_handler = (spider_db_handler **) - spider_bulk_alloc_mem(spider_current_trx, 206, + spider_bulk_alloc_mem(spider_current_trx, SPD_MID_COPY_TABLES_BODY_4, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &tmp_spider->dbton_handler, sizeof(spider_db_handler *) * SPIDER_DBTON_SIZE, @@ -1043,15 +1041,8 @@ tmp_spider->share = table_conn->share; tmp_spider->wide_handler = wide_handler; wide_handler->trx = copy_tables->trx; -/* - if (spider_db_append_set_names(table_conn->share)) - { - my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); - goto error_append_set_names; - } -*/ tmp_spider->conns = &table_conn->conn; - tmp_sql[roop_count].init_calc_mem(201); + tmp_sql[roop_count].init_calc_mem(SPD_MID_COPY_TABLES_BODY_5); tmp_sql[roop_count].set_charset(copy_tables->access_charset); tmp_spider->result_list.sqls = &tmp_sql[roop_count]; tmp_spider->need_mons = &table_conn->need_mon; @@ -1076,14 +1067,6 @@ bulk_insert_rows))) goto error_db_udf_copy_tables; -/* - for (table_conn = copy_tables->table_conn[0]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); - for (table_conn = copy_tables->table_conn[1]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); -*/ if (table_list->table) { (thd->is_error() ? trans_rollback_stmt(thd) : trans_commit_stmt(thd)); @@ -1104,8 +1087,7 @@ } delete [] spider; } - if (tmp_sql) - delete [] tmp_sql; + delete [] tmp_sql; spider_udf_free_copy_tables_alloc(copy_tables); DBUG_RETURN(1); @@ -1113,17 +1095,6 @@ error_db_udf_copy_tables: error_create_dbton_handler: error_init_dbton_handler: -/* -error_append_set_names: -*/ -/* - for (table_conn = copy_tables->table_conn[0]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); - for (table_conn = copy_tables->table_conn[1]; - table_conn; table_conn = table_conn->next) - spider_db_free_set_names(table_conn->share); -*/ error: if (spider) { @@ -1181,6 +1152,11 @@ char *message ) { DBUG_ENTER("spider_copy_tables_init_body"); + if (!spider_hton_ptr) + { + strcpy(message, "Plugin 'SPIDER' is not loaded"); + goto error; + } if (args->arg_count != 3 && args->arg_count != 4) { strcpy(message, "spider_copy_tables() requires 3 or 4 arguments"); diff -Nru mariadb-10.11.6/storage/spider/spd_db_conn.cc mariadb-10.11.9/storage/spider/spd_db_conn.cc --- mariadb-10.11.6/storage/spider/spd_db_conn.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_db_conn.cc 2024-08-03 07:29:59.000000000 +0000 @@ -63,7 +63,7 @@ const char spider_dig_upper[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /* UTC time zone for timestamp columns */ -Time_zone *UTC = 0; +Time_zone *UTC; int spider_db_connect( const SPIDER_SHARE *share, @@ -250,7 +250,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info); DBUG_ENTER("spider_db_conn_queue_action"); DBUG_PRINT("info", ("spider conn=%p", conn)); - sql_str.init_calc_mem(106); + sql_str.init_calc_mem(SPD_MID_DB_CONN_QUEUE_ACTION_1); sql_str.length(0); if (conn->queued_connect) { @@ -344,7 +344,6 @@ ) || ( conn->loop_check_queue.records && - conn->db_conn->set_loop_check_in_bulk_sql() && (error_num = spider_dbton[conn->dbton_id].db_util-> append_loop_check(&sql_str, conn)) ) || @@ -444,13 +443,6 @@ DBUG_RETURN(error_num); } if ( - conn->loop_check_queue.records && - !conn->db_conn->set_loop_check_in_bulk_sql() && - (error_num = conn->db_conn->set_loop_check((int *) conn->need_mon)) - ) { - DBUG_RETURN(error_num); - } - if ( conn->queued_trx_isolation && !conn->queued_semi_trx_isolation && conn->queued_trx_isolation_val != conn->trx_isolation && @@ -651,7 +643,7 @@ DBUG_RETURN(error_num); #ifndef DBUG_OFF spider_string tmp_query_str(sizeof(char) * (length + 1)); - tmp_query_str.init_calc_mem(107); + tmp_query_str.init_calc_mem(SPD_MID_DB_QUERY_1); char *tmp_query = (char *) tmp_query_str.c_ptr_safe(); memcpy(tmp_query, query, length); tmp_query[length] = '\0'; @@ -2174,7 +2166,7 @@ { if (!spider->direct_aggregate_item_first) { - if (!spider_bulk_malloc(spider_current_trx, 240, MYF(MY_WME), + if (!spider_bulk_malloc(spider_current_trx, SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_1, MYF(MY_WME), &spider->direct_aggregate_item_first, (uint) (sizeof(SPIDER_ITEM_HLD)), NullS) @@ -2191,7 +2183,7 @@ } else { if (!spider->direct_aggregate_item_current->next) { - if (!spider_bulk_malloc(spider_current_trx, 241, MYF(MY_WME), + if (!spider_bulk_malloc(spider_current_trx, SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_2, MYF(MY_WME), &spider->direct_aggregate_item_current->next, (uint) (sizeof(SPIDER_ITEM_HLD)), NullS) ) { @@ -2235,7 +2227,7 @@ } else { char buf[MAX_FIELD_WIDTH]; spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset); - tmp_str.init_calc_mem(242); + tmp_str.init_calc_mem(SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_3); tmp_str.length(0); if ((error_num = row->append_to_str(&tmp_str))) DBUG_RETURN(error_num); @@ -2866,7 +2858,7 @@ SPIDER_RESULT *result; SPIDER_RESULT *prev; SPIDER_SHARE *share = spider->share; - SPIDER_TRX *trx = spider->wide_handler->trx; + THD *thd= current_thd; SPIDER_POSITION *position; int roop_count, error_num; DBUG_ENTER("spider_db_free_result"); @@ -2882,10 +2874,10 @@ if ( final || - spider_param_reset_sql_alloc(trx->thd, share->reset_sql_alloc) == 1 + spider_param_reset_sql_alloc(thd, share->reset_sql_alloc) == 1 ) { int alloc_size = final ? 0 : - (spider_param_init_sql_alloc_size(trx->thd, share->init_sql_alloc_size)); + (spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size)); while (result) { position = result->first_position; @@ -2928,7 +2920,7 @@ { ulong realloced = 0; int init_sql_alloc_size = - spider_param_init_sql_alloc_size(trx->thd, share->init_sql_alloc_size); + spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size); for (roop_count = 0; roop_count < (int) share->use_dbton_count; roop_count++) { @@ -3089,7 +3081,7 @@ if (!result_list->first) { if (!(result_list->first = (SPIDER_RESULT *) - spider_malloc(spider_current_trx, 4, sizeof(*result_list->first), + spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_1, sizeof(*result_list->first), MYF(MY_WME | MY_ZEROFILL))) ) { if (!conn->mta_conn_mutex_unlock_later) @@ -3119,7 +3111,7 @@ if (result_list->bgs_current == result_list->last) { if (!(result_list->last = (SPIDER_RESULT *) - spider_malloc(spider_current_trx, 5, sizeof(*result_list->last), + spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_2, sizeof(*result_list->last), MYF(MY_WME | MY_ZEROFILL))) ) { if (!conn->mta_conn_mutex_unlock_later) @@ -3162,7 +3154,7 @@ if (result_list->current == result_list->last) { if (!(result_list->last = (SPIDER_RESULT *) - spider_malloc(spider_current_trx, 6, sizeof(*result_list->last), + spider_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_3, sizeof(*result_list->last), MYF(MY_WME | MY_ZEROFILL))) ) { if (!conn->mta_conn_mutex_unlock_later) @@ -3373,7 +3365,7 @@ } current->field_count = field_count; if (!(position = (SPIDER_POSITION *) - spider_bulk_malloc(spider_current_trx, 7, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_DB_STORE_RESULT_4, MYF(MY_WME | MY_ZEROFILL), &position, (uint) (sizeof(SPIDER_POSITION) * page_size), &tmp_row, (uint) (sizeof(SPIDER_DB_ROW) * field_count), NullS)) @@ -3436,7 +3428,7 @@ THD *thd = current_thd; char buf[MAX_FIELD_WIDTH]; spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin); - tmp_str.init_calc_mem(120); + tmp_str.init_calc_mem(SPD_MID_DB_STORE_RESULT_5); DBUG_PRINT("info",("spider store result to temporary table")); DBUG_ASSERT(!current->result_tmp_tbl); @@ -3797,7 +3789,7 @@ THD *thd = current_thd; char buf[MAX_FIELD_WIDTH]; spider_string tmp_str(buf, MAX_FIELD_WIDTH, &my_charset_bin); - tmp_str.init_calc_mem(120); + tmp_str.init_calc_mem(SPD_MID_DB_STORE_RESULT_FOR_REUSE_CURSOR_1); DBUG_PRINT("info",("spider store result to temporary table")); DBUG_ASSERT(!current->result_tmp_tbl); @@ -6537,7 +6529,7 @@ spider->conn_link_idx, roop_count, share->link_count, SPIDER_LINK_STATUS_RECOVERY) ) { - uint dbton_id = share->use_sql_dbton_ids[roop_count]; + uint dbton_id = share->sql_dbton_ids[roop_count]; spider_db_handler *dbton_hdl = spider->dbton_handler[dbton_id]; conn = spider->conns[roop_count]; pthread_mutex_assert_not_owner(&conn->mta_conn_mutex); @@ -7468,19 +7460,20 @@ } else { if (str) { - SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain(); - SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder; - spider = field_holder->spider; + SPIDER_TABLE_HOLDER *table= fields->find_table(field); + /* If table or table->spider is NULL the GBH creation + would have been skipped the first pass (see below). */ + spider = table->spider; share = spider->share; if ((error_num = share->dbton_share[dbton_id]-> append_column_name_with_alias(str, field->field_index, - field_holder->alias->ptr(), field_holder->alias->length()))) + table->alias->ptr(), table->alias->length()))) DBUG_RETURN(error_num); - } else { - if ((error_num = fields->add_field(field))) - { - DBUG_RETURN(error_num); - } + } else + { + SPIDER_TABLE_HOLDER *table= fields->find_table(field); + if (!table || !table->spider) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); } } } @@ -7583,21 +7576,20 @@ } else { if (str) { - SPIDER_FIELD_CHAIN *field_chain = fields->get_next_field_chain(); - SPIDER_FIELD_HOLDER *field_holder = field_chain->field_holder; - spider = field_holder->spider; + SPIDER_TABLE_HOLDER *table= fields->find_table(field); + /* If table or table->spider is NULL the GBH creation + would have been skipped the first pass (see below). */ + spider = table->spider; share = spider->share; - field = spider->field_exchange(field); - DBUG_ASSERT(field); if ((error_num = share->dbton_share[dbton_id]-> append_column_name_with_alias(str, field->field_index, - field_holder->alias->ptr(), field_holder->alias->length()))) - DBUG_RETURN(error_num); - } else { - if ((error_num = fields->add_field(field))) - { + table->alias->ptr(), table->alias->length()))) DBUG_RETURN(error_num); - } + } else + { + SPIDER_TABLE_HOLDER *table= fields->find_table(field); + if (!table || !table->spider) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); } DBUG_RETURN(0); } @@ -7740,7 +7732,7 @@ char tmp_buf[MAX_FIELD_WIDTH]; spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset()); String *tmp_str2; - tmp_str.init_calc_mem(126); + tmp_str.init_calc_mem(SPD_MID_DB_OPEN_ITEM_STRING_1); if (!(tmp_str2 = item->val_str(tmp_str.get_str()))) { @@ -7859,7 +7851,7 @@ char tmp_buf[MAX_FIELD_WIDTH]; spider_string tmp_str(tmp_buf, MAX_FIELD_WIDTH, str->charset()); String *tmp_str2; - tmp_str.init_calc_mem(127); + tmp_str.init_calc_mem(SPD_MID_DB_OPEN_ITEM_INT_1); if (!(tmp_str2 = item->val_str(tmp_str.get_str()))) { @@ -8909,8 +8901,8 @@ system_charset_info); spider_string where_str(where_buf, sizeof(where_buf), system_charset_info); - sql_str.init_calc_mem(128); - where_str.init_calc_mem(129); + sql_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_1); + where_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_2); sql_str.length(0); where_str.length(0); if ( @@ -9020,8 +9012,8 @@ spider_string where_clause_str(where_clause ? where_clause : "", where_clause_length + 1, str->charset()); DBUG_ENTER("spider_db_udf_ping_table_append_mon_next"); - child_table_name_str.init_calc_mem(130); - where_clause_str.init_calc_mem(131); + child_table_name_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_1); + where_clause_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_2); child_table_name_str.length(child_table_name_length); where_clause_str.length(where_clause_length); limit_str_length = my_sprintf(limit_str, (limit_str, "%lld", limit)); @@ -9138,6 +9130,9 @@ DBUG_RETURN(0); } +/* Stack size 33032 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + int spider_db_udf_ping_table_mon_next( THD *thd, SPIDER_TABLE_MON *table_mon, @@ -9174,7 +9169,7 @@ } spider_string sql_str(sql_buf, sizeof(sql_buf), thd->variables.character_set_client); - sql_str.init_calc_mem(132); + sql_str.init_calc_mem(SPD_MID_DB_UDF_PING_TABLE_MON_NEXT_1); sql_str.length(0); trx.thd = thd; spider.share = share; @@ -9284,6 +9279,7 @@ delete res; DBUG_RETURN(error_num); } +PRAGMA_REENABLE_CHECK_STACK_FRAME int spider_db_udf_copy_key_row( spider_string *str, @@ -9328,7 +9324,7 @@ KEY *key_info = &table->key_info[table->s->primary_key]; DBUG_ENTER("spider_db_udf_copy_tables"); if (!(last_row_pos = (ulong *) - spider_bulk_malloc(spider_current_trx, 30, MYF(MY_WME), + spider_bulk_malloc(spider_current_trx, SPD_MID_DB_UDF_COPY_TABLES_1, MYF(MY_WME), &last_row_pos, (uint) (sizeof(ulong) * table->s->fields), &last_lengths, (uint) (sizeof(ulong) * table->s->fields), NullS)) diff -Nru mariadb-10.11.6/storage/spider/spd_db_include.cc mariadb-10.11.9/storage/spider/spd_db_include.cc --- mariadb-10.11.6/storage/spider/spd_db_include.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_db_include.cc 2024-08-03 07:29:59.000000000 +0000 @@ -64,23 +64,7 @@ DBUG_VOID_RETURN; } -bool spider_db_conn::set_loop_check_in_bulk_sql() -{ - DBUG_ENTER("spider_db_conn::set_loop_check_in_bulk_sql"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN(FALSE); -} - -int spider_db_conn::set_loop_check( - int *need_mon -) { - DBUG_ENTER("spider_db_conn::set_loop_check"); - DBUG_PRINT("info",("spider this=%p", this)); - /* nothing to do */ - DBUG_RETURN(0); -} - -int spider_db_conn::fin_loop_check() +int spider_db_conn::fin_loop_check() /* reset flags of all relevant SPIDER_CONN_LOOP_CHECKs */ { st_spider_conn_loop_check *lcptr; DBUG_ENTER("spider_db_conn::fin_loop_check"); @@ -96,20 +80,6 @@ } my_hash_reset(&conn->loop_check_queue); } - lcptr = conn->loop_check_ignored_first; - while (lcptr) - { - lcptr->flag = 0; - lcptr = lcptr->next; - } - conn->loop_check_ignored_first = NULL; - lcptr = conn->loop_check_meraged_first; - while (lcptr) - { - lcptr->flag = 0; - lcptr = lcptr->next; - } - conn->loop_check_meraged_first = NULL; DBUG_RETURN(0); } diff -Nru mariadb-10.11.6/storage/spider/spd_db_include.h mariadb-10.11.9/storage/spider/spd_db_include.h --- mariadb-10.11.6/storage/spider/spd_db_include.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_db_include.h 2024-08-03 07:29:59.000000000 +0000 @@ -79,7 +79,6 @@ #define SPIDER_SQL_HS_LTEQUAL_STR "<=" #define SPIDER_SQL_HS_LTEQUAL_LEN (sizeof(SPIDER_SQL_HS_LTEQUAL_STR) - 1) -#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC #define SPIDER_SQL_CASE_STR "case " #define SPIDER_SQL_CASE_LEN (sizeof(SPIDER_SQL_CASE_STR) - 1) #define SPIDER_SQL_WHEN_STR " when " @@ -90,7 +89,6 @@ #define SPIDER_SQL_ELSE_LEN (sizeof(SPIDER_SQL_ELSE_STR) - 1) #define SPIDER_SQL_END_STR " end" #define SPIDER_SQL_END_LEN (sizeof(SPIDER_SQL_END_STR) - 1) -#endif #define SPIDER_SQL_USING_STR " using " #define SPIDER_SQL_USING_LEN (sizeof(SPIDER_SQL_USING_STR) - 1) @@ -542,34 +540,26 @@ spider_conn_holder *next; } SPIDER_CONN_HOLDER; +/* Record information of a local (spider) table, for use of the spider +group by handler. */ typedef struct spider_table_holder { TABLE *table; ha_spider *spider; + /* alias of the table, in the form of tk, where k is the index of + the table from `query->from' indexed by next_local. */ spider_string *alias; } SPIDER_TABLE_HOLDER; -typedef struct spider_field_holder -{ - Field *field; - ha_spider *spider; - spider_string *alias; - spider_field_holder *next; -} SPIDER_FIELD_HOLDER; - -typedef struct spider_field_chain -{ - spider_field_holder *field_holder; - spider_field_chain *next; -} SPIDER_FIELD_CHAIN; - +/* For use of the spider group by handler. */ class spider_fields { uint dbton_count; uint current_dbton_num; uint dbton_ids[SPIDER_DBTON_SIZE]; + /* Number of tables in `query->from'. */ uint table_count; - uint current_table_num; + /* All tables in `query->from', in the same order by next_local. */ SPIDER_TABLE_HOLDER *table_holder; SPIDER_LINK_IDX_CHAIN *first_link_idx_chain; SPIDER_LINK_IDX_CHAIN *last_link_idx_chain; @@ -578,13 +568,6 @@ SPIDER_CONN_HOLDER *first_conn_holder; SPIDER_CONN_HOLDER *last_conn_holder; SPIDER_CONN_HOLDER *current_conn_holder; - SPIDER_FIELD_HOLDER *first_field_holder; - SPIDER_FIELD_HOLDER *last_field_holder; - SPIDER_FIELD_HOLDER *current_field_holder; - SPIDER_FIELD_CHAIN *first_field_chain; - SPIDER_FIELD_CHAIN *last_field_chain; - SPIDER_FIELD_CHAIN *current_field_chain; - Field **first_field_ptr; Field **current_field_ptr; public: spider_fields(); @@ -627,8 +610,6 @@ long access_balance ); SPIDER_CONN_HOLDER *create_conn_holder(); - void set_pos_to_first_conn_holder(); - SPIDER_CONN_HOLDER *get_next_conn_holder(); bool has_conn_holder(); void clear_conn_holder_from_conn(); bool check_conn_same_conn( @@ -642,24 +623,14 @@ void free_conn_holder( SPIDER_CONN_HOLDER *conn_holder_arg ); - SPIDER_TABLE_HOLDER *add_table( - ha_spider *spider_arg - ); - bool all_query_fields_are_query_table_members(); - int create_table_holder( + SPIDER_TABLE_HOLDER *find_table(Field *field); + void set_table_holder( + SPIDER_TABLE_HOLDER *table_holder_arg, uint table_count_arg ); - void set_pos_to_first_table_holder(); - SPIDER_TABLE_HOLDER *get_next_table_holder(); + SPIDER_TABLE_HOLDER *get_first_table_holder(); SPIDER_TABLE_HOLDER *get_table_holder(TABLE *table); uint get_table_count(); - int add_field(Field *field_arg); - SPIDER_FIELD_HOLDER *create_field_holder(); - void set_pos_to_first_field_holder(); - SPIDER_FIELD_HOLDER *get_next_field_holder(); - SPIDER_FIELD_CHAIN *create_field_chain(); - void set_pos_to_first_field_chain(); - SPIDER_FIELD_CHAIN *get_next_field_chain(); void set_field_ptr(Field **field_arg); Field **get_next_field_ptr(); int ping_table_mon_from_table( @@ -797,11 +768,6 @@ TABLE_LIST *table_list, uint table_count ) = 0; - virtual int reappend_tables( - spider_fields *fields, - SPIDER_LINK_IDX_CHAIN *link_idx_chain, - spider_string *str - ) = 0; virtual int append_where( spider_string *str ) = 0; @@ -1056,10 +1022,6 @@ Time_zone *time_zone, int *need_mon ) = 0; - virtual bool set_loop_check_in_bulk_sql(); - virtual int set_loop_check( - int *need_mon - ); virtual int fin_loop_check(); virtual int show_master_status( SPIDER_TRX *trx, @@ -1145,10 +1107,11 @@ uint dbton_id; ha_spider *spider; spider_db_share *db_share; + /* Index of active server, used in query construction. */ int first_link_idx; SPIDER_LINK_IDX_CHAIN *link_idx_chain; - bool strict_group_by; - bool no_where_cond; + bool strict_group_by= false; + bool no_where_cond= false; spider_db_handler(ha_spider *spider, spider_db_share *db_share) : dbton_id(db_share->dbton_id), spider(spider), db_share(db_share), first_link_idx(-1) {} @@ -1530,10 +1493,6 @@ spider_fields *fields, ulong sql_type ) = 0; - virtual int reappend_tables_part( - spider_fields *fields, - ulong sql_type - ) = 0; virtual int append_where_part( ulong sql_type ) = 0; @@ -1674,6 +1633,12 @@ { STRING_WITH_LEN("Stable") } }; +/* + Type of singletons based on the type of the remote database. + + All such singletons are stored in the array `spider_dbton', see + `spider_db_init()'. +*/ typedef struct st_spider_dbton { uint dbton_id; diff -Nru mariadb-10.11.6/storage/spider/spd_db_mysql.cc mariadb-10.11.9/storage/spider/spd_db_mysql.cc --- mariadb-10.11.6/storage/spider/spd_db_mysql.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_db_mysql.cc 2024-08-03 07:29:59.000000000 +0000 @@ -319,7 +319,7 @@ spider_mysql_create_conn, spider_mysql_support_direct_join, &spider_db_mysql_utility, - "For communicating to MySQL using native protocol", + "For communication with MySQL using the native protocol", "3.4.0", SPIDER_MATURITY_STABLE }; @@ -336,7 +336,7 @@ spider_mariadb_create_conn, spider_mariadb_support_direct_join, &spider_db_mariadb_utility, - "For communicating to MariaDB using native protocol", + "For communication with MariaDB using the native protocol", "3.4.0", SPIDER_MATURITY_STABLE }; @@ -451,7 +451,7 @@ DBUG_ENTER("spider_db_mbase_row::append_escaped_to_str"); DBUG_PRINT("info",("spider this=%p", this)); spider_string tmp_str(*row, *lengths + 1, str->charset()); - tmp_str.init_calc_mem(133); + tmp_str.init_calc_mem(SPD_MID_DB_MBASE_ROW_APPEND_ESCAPED_TO_STR_1); tmp_str.length(*lengths); if (str->reserve(*lengths * 2 + 2)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -544,7 +544,7 @@ row_size = record_size + field_count; } if (!spider_bulk_malloc( - spider_current_trx, 29, MYF(MY_WME), + spider_current_trx, SPD_MID_DB_MBASE_ROW_CLONE_1, MYF(MY_WME), &clone_row->row, (uint) (sizeof(char*) * (field_count + 1)), &tmp_char, (uint) (row_size), &clone_row->lengths, (uint) (sizeof(ulong) * field_count), @@ -774,9 +774,9 @@ uint field_count; DBUG_ENTER("spider_db_mbase_result::fetch_row_from_tmp_table"); DBUG_PRINT("info",("spider this=%p", this)); - tmp_str1.init_calc_mem(117); - tmp_str2.init_calc_mem(118); - tmp_str3.init_calc_mem(170); + tmp_str1.init_calc_mem(SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_1); + tmp_str2.init_calc_mem(SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_2); + tmp_str3.init_calc_mem(SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_3); tmp_table->field[0]->val_str(tmp_str1.get_str()); tmp_table->field[1]->val_str(tmp_str2.get_str()); tmp_table->field[2]->val_str(tmp_str3.get_str()); @@ -1191,7 +1191,7 @@ uint num_fields = this->num_fields(); if (num_fields < 12 || num_fields > 14) { - DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 13")); + DBUG_PRINT("info",("spider num_fields < 12 || num_fields > 14")); DBUG_RETURN(ER_SPIDER_INVALID_REMOTE_TABLE_INFO_NUM); } @@ -1529,10 +1529,13 @@ } DBUG_RETURN(0); } - if (num_fields() != 13) + if (num_fields() < 13) { - DBUG_PRINT("info",("spider num_fields != 13")); - my_printf_error(ER_SPIDER_UNKNOWN_NUM, ER_SPIDER_UNKNOWN_STR, MYF(0)); + DBUG_PRINT("info",("spider num_fields < 13")); + my_printf_error(ER_SPIDER_CANT_NUM, ER_SPIDER_CANT_STR1, MYF(0), + "fetch index for table structure discovery because of " + "wrong number of columns in SHOW INDEX FROM output: ", + num_fields()); DBUG_RETURN(ER_SPIDER_UNKNOWN_NUM); } bool first = TRUE; @@ -1826,7 +1829,7 @@ ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - spider_alloc_calc_mem_init(lock_table_hash, 140); + spider_alloc_calc_mem_init(lock_table_hash, SPD_MID_DB_MBASE_INIT_1); spider_alloc_calc_mem(spider_current_trx, lock_table_hash, lock_table_hash.array.max_element * @@ -1929,7 +1932,7 @@ if (!spider_param_same_server_link(thd)) { - if (!strcmp(tgt_host, my_localhost)) + if (!strcmp(tgt_host, my_localhost) || !tgt_host || !tgt_host[0]) { if (!strcmp(tgt_socket, *spd_mysqld_unix_port)) { @@ -1939,7 +1942,7 @@ DBUG_RETURN(ER_SPIDER_SAME_SERVER_LINK_NUM); } } else if (!strcmp(tgt_host, "127.0.0.1") || - !strcmp(tgt_host, glob_hostname)) + !strcmp(tgt_host, glob_hostname) || !tgt_host || !tgt_host[0]) { if (tgt_port == (long) *spd_mysqld_port) { @@ -2066,7 +2069,7 @@ const char *tgt_str = conn->tgt_host; uint32 tgt_len = conn->tgt_host_length; spider_string tmp_query_str; - tmp_query_str.init_calc_mem(230); + tmp_query_str.init_calc_mem(SPD_MID_DB_MBASE_EXEC_QUERY_1); if (tmp_query_str.reserve( length + conn->tgt_wrapper_length + tgt_len + (SPIDER_SQL_SPACE_LEN * 2))) @@ -2096,7 +2099,7 @@ struct tm lt; struct tm *l_time = localtime_r(&cur_time, <); spider_string tmp_query_str; - tmp_query_str.init_calc_mem(243); + tmp_query_str.init_calc_mem(SPD_MID_DB_MBASE_EXEC_QUERY_2); uint query_length = thd->query_length(); if ((log_result_error_with_sql & 2) && query_length) { @@ -2640,7 +2643,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::xa_end"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(108); + sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_END_1); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_END_STR, SPIDER_SQL_XA_END_LEN); @@ -2683,7 +2686,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::xa_prepare"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(109); + sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_PREPARE_1); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_PREPARE_STR, SPIDER_SQL_XA_PREPARE_LEN); @@ -2726,7 +2729,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::xa_commit"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(110); + sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_COMMIT_1); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_COMMIT_STR, SPIDER_SQL_XA_COMMIT_LEN); @@ -2769,7 +2772,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::xa_rollback"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(111); + sql_str.init_calc_mem(SPD_MID_DB_MBASE_XA_ROLLBACK_1); sql_str.length(0); sql_str.q_append(SPIDER_SQL_XA_ROLLBACK_STR, SPIDER_SQL_XA_ROLLBACK_LEN); @@ -3106,7 +3109,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::set_wait_timeout"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(264); + sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_WAIT_TIMEOUT_1); sql_str.length(0); timeout_str_length = my_sprintf(timeout_str, (timeout_str, "%d", wait_timeout)); @@ -3160,7 +3163,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::set_sql_mode"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(265); + sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_SQL_MODE_1); sql_str.length(0); if (sql_str.reserve(SPIDER_SQL_SQL_MODE_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -3225,7 +3228,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); DBUG_ENTER("spider_db_mbase::set_time_zone"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(214); + sql_str.init_calc_mem(SPD_MID_DB_MBASE_SET_TIME_ZONE_1); sql_str.length(0); if (sql_str.reserve(SPIDER_SQL_TIME_ZONE_LEN + tz_str->length() + SPIDER_SQL_VALUE_QUOTE_LEN)) @@ -3263,110 +3266,6 @@ DBUG_RETURN(0); } -bool spider_db_mbase::set_loop_check_in_bulk_sql() -{ - DBUG_ENTER("spider_db_mbase::set_loop_check_in_bulk_sql"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN(TRUE); -} - -int spider_db_mbase::set_loop_check( - int *need_mon -) { - SPIDER_CONN_LOOP_CHECK *lcptr; - char sql_buf[MAX_FIELD_WIDTH]; - spider_string sql_str(sql_buf, sizeof(sql_buf), &my_charset_bin); - DBUG_ENTER("spider_db_mbase::set_loop_check"); - DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(270); - while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element( - &conn->loop_check_queue, 0))) - { - sql_str.length(0); - if (sql_str.reserve(SPIDER_SQL_SET_USER_VAL_LEN + - SPIDER_SQL_LOP_CHK_PRM_PRF_LEN + lcptr->to_name.length + - SPIDER_SQL_NAME_QUOTE_LEN + SPIDER_SQL_EQUAL_LEN + - SPIDER_SQL_VALUE_QUOTE_LEN + - lcptr->merged_value.length + SPIDER_SQL_VALUE_QUOTE_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - sql_str.q_append(SPIDER_SQL_SET_USER_VAL_STR, SPIDER_SQL_SET_USER_VAL_LEN); - sql_str.q_append(SPIDER_SQL_LOP_CHK_PRM_PRF_STR, - SPIDER_SQL_LOP_CHK_PRM_PRF_LEN); - sql_str.q_append(lcptr->to_name.str, lcptr->to_name.length); - sql_str.q_append(SPIDER_SQL_NAME_QUOTE_STR, SPIDER_SQL_NAME_QUOTE_LEN); - sql_str.q_append(SPIDER_SQL_EQUAL_STR, SPIDER_SQL_EQUAL_LEN); - sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); - sql_str.q_append(lcptr->merged_value.str, lcptr->merged_value.length); - sql_str.q_append(SPIDER_SQL_VALUE_QUOTE_STR, SPIDER_SQL_VALUE_QUOTE_LEN); - - pthread_mutex_assert_not_owner(&conn->mta_conn_mutex); - pthread_mutex_lock(&conn->mta_conn_mutex); - SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos); - conn->need_mon = need_mon; - DBUG_ASSERT(!conn->mta_conn_mutex_lock_already); - DBUG_ASSERT(!conn->mta_conn_mutex_unlock_later); - conn->mta_conn_mutex_lock_already = TRUE; - conn->mta_conn_mutex_unlock_later = TRUE; - if (spider_db_query( - conn, - sql_str.ptr(), - sql_str.length(), - -1, - need_mon) - ) { - DBUG_ASSERT(conn->mta_conn_mutex_lock_already); - DBUG_ASSERT(conn->mta_conn_mutex_unlock_later); - conn->mta_conn_mutex_lock_already = FALSE; - conn->mta_conn_mutex_unlock_later = FALSE; - DBUG_RETURN(spider_db_errorno(conn)); - } - DBUG_ASSERT(conn->mta_conn_mutex_lock_already); - DBUG_ASSERT(conn->mta_conn_mutex_unlock_later); - conn->mta_conn_mutex_lock_already = FALSE; - conn->mta_conn_mutex_unlock_later = FALSE; - SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); - pthread_mutex_unlock(&conn->mta_conn_mutex); - - my_hash_delete(&conn->loop_check_queue, (uchar*) lcptr); - } - DBUG_RETURN(0); -} - -int spider_db_mbase::fin_loop_check() -{ - st_spider_conn_loop_check *lcptr; - DBUG_ENTER("spider_db_mbase::fin_loop_check"); - DBUG_PRINT("info",("spider this=%p", this)); - if (conn->loop_check_queue.records) - { - uint l = 0; - while ((lcptr = (SPIDER_CONN_LOOP_CHECK *) my_hash_element( - &conn->loop_check_queue, l))) - { - lcptr->flag = 0; - ++l; - } - my_hash_reset(&conn->loop_check_queue); - } - lcptr = conn->loop_check_ignored_first; - while (lcptr) - { - lcptr->flag = 0; - lcptr = lcptr->next; - } - conn->loop_check_ignored_first = NULL; - lcptr = conn->loop_check_meraged_first; - while (lcptr) - { - lcptr->flag = 0; - lcptr = lcptr->next; - } - conn->loop_check_meraged_first = NULL; - DBUG_RETURN(0); -} - int spider_db_mbase::exec_simple_sql_with_result( SPIDER_TRX *trx, SPIDER_SHARE *share, @@ -3960,7 +3859,7 @@ THD *thd = field->table->in_use; Time_zone *saved_time_zone = thd->variables.time_zone; DBUG_ENTER("spider_db_mariadb_util::append_column_value"); - tmp_str.init_calc_mem(113); + tmp_str.init_calc_mem(SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_1); thd->variables.time_zone = UTC; @@ -4036,7 +3935,7 @@ DBUG_PRINT("info", ("spider append_escaped")); char buf2[MAX_FIELD_WIDTH]; spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset()); - tmp_str2.init_calc_mem(114); + tmp_str2.init_calc_mem(SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_2); tmp_str2.length(0); if ( tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) || @@ -4104,7 +4003,7 @@ THD *thd = field->table->in_use; Time_zone *saved_time_zone = thd->variables.time_zone; DBUG_ENTER("spider_db_mysql_util::append_column_value"); - tmp_str.init_calc_mem(266); + tmp_str.init_calc_mem(SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_1); thd->variables.time_zone = UTC; @@ -4255,7 +4154,7 @@ DBUG_PRINT("info", ("spider append_escaped")); char buf2[MAX_FIELD_WIDTH]; spider_string tmp_str2(buf2, MAX_FIELD_WIDTH, field->charset()); - tmp_str2.init_calc_mem(267); + tmp_str2.init_calc_mem(SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_2); tmp_str2.length(0); if ( tmp_str2.append(ptr->ptr(), ptr->length(), field->charset()) || @@ -5323,6 +5222,22 @@ DBUG_RETURN(0); } +/* + iterate over loop_check_queue and build queries for loop check + + The query is in the form of + + set @`spider_lc_.` = + '--------...' + + where from_table1, from_table2 etc. are spider tables whose direct + or indirect remote data nodes contain to_table. + + e.g. if t0->t1->t2, then the query could be: + + set @`spider_lc_./test/t2` = + '-234567890abc-def012-./test/t1--1234567890ab-cdef01-./test/t0-' + */ int spider_db_mbase_util::append_loop_check( spider_string *str, SPIDER_CONN *conn @@ -5500,14 +5415,6 @@ alias_length, use_fields, fields)); } -static bool item_func_is_timestampdiff( - const char *func_name, - int func_name_length -) { - return func_name_length == 13 && - !strncasecmp("timestampdiff", func_name, func_name_length); -} - static bool not_func_should_be_skipped( Item_func *item_func ){ @@ -5577,16 +5484,10 @@ Item_func::Functype func_type = item_func->functype(); DBUG_PRINT("info",("spider functype = %d", func_type)); - const char *func_name = (char*) item_func->func_name(); - int func_name_length = strlen(func_name); - DBUG_PRINT("info",("spider func_name = %s", func_name)); - /* The blacklist of the functions that cannot be pushed down */ switch (func_type) { case Item_func::TRIG_COND_FUNC: - case Item_func::CASE_SEARCHED_FUNC: - case Item_func::CASE_SIMPLE_FUNC: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::NOT_FUNC: /* Why the following check is necessary? */ @@ -5595,13 +5496,6 @@ break; case Item_func::FUNC_SP: case Item_func::UDF_FUNC: - /* Notes on merging regarding MDEV-29447: please refer to the - following commits for build error or merge conflicts: - 10.6: 1ed20b993b0dd4e95450cab2e8347e5bf4617a69 - 10.9: dd316b6e20265cfd832bb5585cb4c96e716387c8 - 10.10-11: 3f67f110ba1b23a89c5ede0fbeeb203cf5e164f4 - 11.0-1: 17ba6748afa8834df5658361088e6c8e65aca16f - Please remove this comment after merging. */ use_pushdown_udf= spider_param_use_pushdown_udf( spider->wide_handler->trx->thd, spider->share->use_pushdown_udf); if (!use_pushdown_udf) @@ -5611,12 +5505,18 @@ if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); break; -#ifndef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC - case Item_func::UNKNOWN_FUNC: - if (item_func_is_timestampdiff(func_name, func_name_length)) - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - break; -#endif + case Item_func::MULT_EQUAL_FUNC: + /* If there is still Item_equal by the time of + JOIN::make_aggr_tables_info() where the spider group by handler + is created, it indicates a bug in the optimizer, because there + shouldn't be any. */ + push_warning_printf( + spider->wide_handler->trx->thd, SPIDER_WARN_LEVEL_WARN, + ER_INTERNAL_ERROR, + ER_THD(spider->wide_handler->trx->thd, ER_INTERNAL_ERROR), + "Spider group by handler: Encountered multiple equalities, likely " + "an optimizer bug"); + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); default: break; } @@ -5658,7 +5558,7 @@ Item *item, **item_list = item_func->arguments(); Field *field; spider_string tmp_str; - uint roop_count, item_count = item_func->argument_count(), start_item = 0; + uint i, item_count = item_func->argument_count(), start_item = 0; LEX_CSTRING org_func_name= {SPIDER_SQL_NULL_CHAR_STR, SPIDER_SQL_NULL_CHAR_LEN}; const char *func_name = SPIDER_SQL_NULL_CHAR_STR, @@ -5667,8 +5567,8 @@ int func_name_length = SPIDER_SQL_NULL_CHAR_LEN, separator_str_length = SPIDER_SQL_NULL_CHAR_LEN, last_str_length = SPIDER_SQL_NULL_CHAR_LEN; - int use_pushdown_udf; - bool merge_func = FALSE; + int use_pushdown_udf, case_when_start, case_when_count; + bool merge_func = FALSE, case_with_else; DBUG_ENTER("spider_db_mbase_util::print_item_func"); DBUG_ASSERT(!check_item_func(item_func, spider, alias, alias_length, use_fields, fields)); @@ -5828,12 +5728,17 @@ item_count -= 2; break; } - } else if (func_name_length == 6 && - !strncasecmp("istrue", func_name, func_name_length) - ) { - last_str = SPIDER_SQL_IS_TRUE_STR; - last_str_length = SPIDER_SQL_IS_TRUE_LEN; - break; + } else if (func_name_length == 6) + { + if (!strncasecmp("istrue", func_name, func_name_length)) + { + last_str= SPIDER_SQL_IS_TRUE_STR; + last_str_length= SPIDER_SQL_IS_TRUE_LEN; + break; + } + else if (!strncasecmp("regexp", func_name, func_name_length)) + /* Keep the infix expression */ + break; } else if (func_name_length == 7) { if (!strncasecmp("isfalse", func_name, func_name_length)) @@ -5981,12 +5886,11 @@ alias, alias_length, dbton_id, use_fields, fields)); } else if (!strncasecmp("timestampdiff", func_name, func_name_length)) { -#ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC Item_func_timestamp_diff *item_func_timestamp_diff = (Item_func_timestamp_diff *) item_func; const char *interval_str; uint interval_len; - switch (item_func_timestamp_diff->int_type) + switch (item_func_timestamp_diff->get_int_type()) { case INTERVAL_YEAR: interval_str = SPIDER_SQL_YEAR_STR; @@ -6037,7 +5941,7 @@ str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); str->q_append(interval_str, interval_len); str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); - + if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); @@ -6058,9 +5962,6 @@ SPIDER_SQL_CLOSE_PAREN_LEN); } DBUG_RETURN(0); -#else - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); -#endif } } else if (func_name_length == 14) { @@ -6093,7 +5994,7 @@ char *tmp_ptr, *tmp_ptr2; DBUG_ASSERT(tmp_str.length() == 0); tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(123); + tmp_str.init_calc_mem(SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_1); tmp_str.reserve(MAX_FIELD_WIDTH); str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); if (!merge_func) @@ -6218,7 +6119,7 @@ char *tmp_ptr, *tmp_ptr2; DBUG_ASSERT(tmp_str.length() == 0); tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(124); + tmp_str.init_calc_mem(SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_2); tmp_str.reserve(MAX_FIELD_WIDTH); str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); if (!merge_func) @@ -6355,7 +6256,7 @@ char *tmp_ptr, *tmp_ptr2; DBUG_ASSERT(tmp_str.length() == 0); tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(125); + tmp_str.init_calc_mem(SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_3); tmp_str.reserve(MAX_FIELD_WIDTH); str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); if (!merge_func) @@ -6554,7 +6455,83 @@ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::CASE_SEARCHED_FUNC: case Item_func::CASE_SIMPLE_FUNC: - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + /* + Arrangement of arguments: + - Item_func_case_searched: + when1 when2 ... whenk then1 then2 .. thenk [else] + - Item_func_case_simple: + value when1 when2 ... whenk then1 then2 .. thenk [else] + */ + if (item_func->functype() == Item_func::CASE_SEARCHED_FUNC) + { + case_when_start= 0; + case_when_count= item_count / 2; + case_with_else= item_count % 2; + } + else + { + case_when_start= 1; + case_when_count= (item_count - 1) / 2; + case_with_else= item_count % 2 == 0; + } + if (str) + { + if (str->reserve(SPIDER_SQL_CASE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN); + } + if (case_when_start > 0) + { + if ((error_num = spider_db_print_item_type( + item_list[0], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + for (i = 0; i < (uint) case_when_count; i++) + { + if (str) + { + if (str->reserve(SPIDER_SQL_WHEN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[i + case_when_start], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + if (str) + { + if (str->reserve(SPIDER_SQL_THEN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[i + case_when_start + case_when_count], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + if (case_with_else) + { + if (str) + { + if (str->reserve(SPIDER_SQL_ELSE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN); + } + if ((error_num = spider_db_print_item_type( + item_list[item_count - 1], NULL, spider, str, + alias, alias_length, dbton_id, use_fields, fields))) + DBUG_RETURN(error_num); + } + if (str) + { + if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); + } + DBUG_RETURN(0); case Item_func::JSON_EXTRACT_FUNC: func_name = (char*) item_func->func_name(); func_name_length = strlen(func_name); @@ -6569,6 +6546,18 @@ last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; + case Item_func::MULT_EQUAL_FUNC: + /* If there is still Item_equal by the time of + JOIN::make_aggr_tables_info() where the spider group by handler + is created, it indicates a bug in the optimizer, because there + shouldn't be any. */ + push_warning_printf( + spider->wide_handler->trx->thd, + SPIDER_WARN_LEVEL_WARN, ER_INTERNAL_ERROR, + ER_THD(spider->wide_handler->trx->thd, ER_INTERNAL_ERROR), + "Spider group by handler: Encountered multiple equalities, likely " + "an optimizer bug"); + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); default: THD *thd = spider->wide_handler->trx->thd; SPIDER_SHARE *share = spider->share; @@ -6598,13 +6587,13 @@ Loop through the items of the current function expression to print its portion of the statement */ - for (roop_count = start_item; roop_count < item_count; roop_count++) + for (i = start_item; i < item_count; i++) { - item = item_list[roop_count]; + item = item_list[i]; if ((error_num = spider_db_print_item_type(item, field, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (roop_count == 1) + if (i == 1) { /* Remaining operands need to be preceded by the separator */ func_name = separator_str; @@ -6618,7 +6607,7 @@ } /* Print the last operand value */ - item = item_list[roop_count]; + item = item_list[i]; if ((error_num = spider_db_print_item_type(item, field, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); @@ -6803,440 +6792,250 @@ DBUG_RETURN(0); } -int spider_db_mbase_util::append_table( - ha_spider *spider, - spider_fields *fields, - spider_string *str, - TABLE_LIST *table_list, - TABLE_LIST **used_table_list, - uint *current_pos, - TABLE_LIST **cond_table_list_ptr, - bool top_down, - bool first -) { - int error_num; - bool use_cond_table_list = FALSE; - spider_mbase_share *db_share; - spider_mbase_handler *dbton_hdl; - SPIDER_TABLE_HOLDER *table_holder; - TABLE_LIST *cond_table_list = *cond_table_list_ptr; - ha_spider *spd; - DBUG_ENTER("spider_db_mbase_util::append_table"); - DBUG_PRINT("info",("spider table_list=%p", table_list)); - DBUG_PRINT("info",("spider table_list->outer_join=%u", - table_list->outer_join)); - DBUG_PRINT("info",("spider table_list->on_expr=%p", - table_list->on_expr)); - DBUG_PRINT("info",("spider table_list->join_using_fields=%p", - table_list->join_using_fields)); - DBUG_PRINT("info",("spider table_list->table=%p", - table_list->table)); - if (!top_down && table_list->embedding) - { - if ((error_num = append_embedding_tables(spider, fields, str, - table_list->embedding, used_table_list, current_pos, - cond_table_list_ptr))) +/* + Walk a TABLE_LIST, or format it to a string and append it. + + If str is NULL, walk the nested join (if any) to determine whether + to create a group by handler. Otherwise, format the TABLE_LIST to a + string and append it to str. + + Adapted from TABLE_LIST::print(). +*/ +int spider_db_mbase_util::append_table_list(spider_fields *fields, + spider_string *str, + TABLE_LIST *table, + table_map *upper_usable_tables, + table_map eliminated_tables) +{ + DBUG_ENTER("spider_db_mbase_util::append_table_list"); + /* Eliminated tables were removed from append_join(). */ + DBUG_ASSERT(!is_eliminated_table(eliminated_tables, table)); + if (!str) /* First pass (GBH creation) */ + { + DBUG_ASSERT(upper_usable_tables); + if (table->nested_join) + DBUG_RETURN(append_join(fields, str, + &table->nested_join->join_list, + upper_usable_tables, eliminated_tables)); + /* jtbm is a kind of semi join, and TABLE_LIST::print() adds an + extra " " annotation. */ + if (table->jtbm_subselect) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + /* TODO: These conditions are printed in a different way in + TABLE_LIST::print(), but they do not seem to occur very often. + Let's not worry about them now. */ + if (table->view_name.str || table->derived || table->table_function) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + *upper_usable_tables |= table->table->map; + DBUG_RETURN(0); + } + /* Second pass (query execution) */ + DBUG_ASSERT(!upper_usable_tables); + if (table->nested_join) + { + if (str->append("(")) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if (int error_num= append_join( + fields, str, &table->nested_join->join_list, + upper_usable_tables, eliminated_tables)) DBUG_RETURN(error_num); - } else if (!table_list->table) + if (str->append(")")) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + DBUG_RETURN(0); + } + /* These have been ruled out during the creation of the group by + handler, see above. */ + DBUG_ASSERT(!table->jtbm_subselect); + DBUG_ASSERT(!table->view_name.str); + DBUG_ASSERT(!table->derived); + DBUG_ASSERT(!table->table_function); + /* We have a "normal" table. Print it and append to str. */ + SPIDER_TABLE_HOLDER *table_holder = fields->get_table_holder(table->table); + ha_spider *spd = table_holder->spider; + spider_mbase_share *db_share = + (spider_mbase_share *) spd->share->dbton_share[dbton_id]; + spider_mbase_handler *dbton_hdl = + (spider_mbase_handler *) spd->dbton_handler[dbton_id]; + if (table->table->const_table) { - if ((error_num = append_tables_top_down(spider, fields, str, table_list, - used_table_list, current_pos, cond_table_list_ptr))) + if (str->append(STRING_WITH_LEN("(select 1)"))) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + } + else + if (int error_num= db_share->append_table_name( + str, spd->conn_link_idx[dbton_hdl->first_link_idx])) DBUG_RETURN(error_num); - } else { - if ( - table_list->outer_join || - table_list->on_expr || - table_list->join_using_fields - ) { - DBUG_PRINT("info",("spider use table_list")); - if (table_list->outer_join & JOIN_TYPE_LEFT) - { - if (str) - { - if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN); - } - } else { - if (str) - { - if (str->reserve(SPIDER_SQL_JOIN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN); - } - } - } else if ( - cond_table_list && - ( - cond_table_list->outer_join || - cond_table_list->on_expr || - cond_table_list->join_using_fields - ) - ) { - DBUG_PRINT("info",("spider use cond_table_list")); - if (cond_table_list->outer_join & (JOIN_TYPE_LEFT | JOIN_TYPE_RIGHT)) - { - if (str) - { - if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN); - } - } else { - if (str) - { - if (str->reserve(SPIDER_SQL_JOIN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN); - } - } - use_cond_table_list = TRUE; - } else if (*current_pos > 0 && !first) - { - DBUG_PRINT("info",("spider no condition")); - if (str) - { - if (str->reserve(SPIDER_SQL_JOIN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN); - } - } - - if (str) - { - table_holder = fields->get_table_holder(table_list->table); - spd = table_holder->spider; - db_share = (spider_mbase_share *) - spd->share->dbton_share[dbton_id]; - dbton_hdl = (spider_mbase_handler *) - spd->dbton_handler[dbton_id]; + if (str->append(" ") || + str->append(table_holder->alias->ptr(), + /* Don't append the trailing dot */ + table_holder->alias->length() - 1)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + DBUG_RETURN(0); +} - dbton_hdl->table_name_pos = str->length(); +/* + Walk an array of TABLE_LIST's, or format it to a string and append it. - if (str->reserve( - db_share->db_nm_max_length + - SPIDER_SQL_DOT_LEN + /* SPIDER_SQL_NAME_QUOTE_LEN */ 4 + - db_share->table_nm_max_length + SPIDER_SQL_SPACE_LEN + - table_holder->alias->length() - SPIDER_SQL_DOT_LEN - )) { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } + If str is NULL, walk each TABLE_LIST to determine whether to create + a group by handler. Otherwise, format the TABLE_LISTs to a string + and append it to str. - if ((error_num = db_share->append_table_name_with_adjusting(str, - spd->conn_link_idx[dbton_hdl->first_link_idx]))) - { - DBUG_RETURN(error_num); - } - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); - str->q_append(table_holder->alias->ptr(), - table_holder->alias->length() - SPIDER_SQL_DOT_LEN); - } - used_table_list[(*current_pos)++] = table_list; + Adapted from print_table_array(). +*/ +int spider_db_mbase_util::append_table_array(spider_fields *fields, + spider_string *str, + TABLE_LIST **table, + TABLE_LIST **end, + table_map *upper_usable_tables, + table_map eliminated_tables) +{ + DBUG_ENTER("spider_db_mbase_util::append_table_array"); + if (str) + { + DBUG_ASSERT(!upper_usable_tables); + if (int error_num= append_table_list(fields, str, *table, NULL, + eliminated_tables)) + DBUG_RETURN(error_num); - if (str) + for (TABLE_LIST **tbl= table + 1; tbl < end; tbl++) { - List *join_using_fields = table_list->join_using_fields; - if (!join_using_fields && cond_table_list) - { - join_using_fields = cond_table_list->join_using_fields; - } + TABLE_LIST *curr= *tbl; - if (join_using_fields) + /* JOIN_TYPE_OUTER is just a marker unrelated to real join */ + if (curr->outer_join & (JOIN_TYPE_LEFT|JOIN_TYPE_RIGHT)) { - if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - List_iterator_fast it2(*join_using_fields); - String *ptr; - while ((ptr = it2++)) - { - if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(ptr->ptr(), ptr->length()); - str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); - } - str->length(str->length() - SPIDER_SQL_COMMA_LEN); - if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) - { + /* MySQL converts right to left joins */ + if (str->append(STRING_WITH_LEN(" left join "))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); } - } - - Item *on_expr = table_list->on_expr; - if (!on_expr && cond_table_list) - { - on_expr = cond_table_list->on_expr; - } - - if (on_expr) - { - if (str) + else if (curr->straight) { - if (str->reserve(SPIDER_SQL_ON_LEN)) - { + if (str->append(STRING_WITH_LEN(" straight_join "))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN); } - if ((error_num = spider_db_print_item_type(on_expr, NULL, - spider, str, NULL, 0, dbton_id, TRUE, fields))) - { - DBUG_RETURN(error_num); - } - } + /* semi join should already have been ruled out during the + creation of the group by handler. */ + else if (curr->sj_inner_tables) + DBUG_ASSERT(0); + else + if (str->append(STRING_WITH_LEN(" join "))) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); - if (use_cond_table_list) - { - (*cond_table_list_ptr) = NULL; - DBUG_PRINT("info",("spider cond_table_list=%p", (*cond_table_list_ptr))); - } - } - DBUG_RETURN(0); -} + if (int error_num= append_table_list(fields, str, curr, NULL, + eliminated_tables)) + DBUG_RETURN(error_num); -int spider_db_mbase_util::append_tables_top_down( - ha_spider *spider, - spider_fields *fields, - spider_string *str, - TABLE_LIST *table_list, - TABLE_LIST **used_table_list, - uint *current_pos, - TABLE_LIST **cond_table_list_ptr -) { - int error_num; - uint outer_join_backup; - TABLE_LIST *cur_table_list, *prev_table_list = NULL, *cond_table_list = NULL; - bool first = TRUE; - DBUG_ENTER("spider_db_mbase_util::append_tables_top_down"); - DBUG_PRINT("info",("spider this=%p", this)); - if ( - table_list->outer_join || - table_list->on_expr || - table_list->join_using_fields - ) { - DBUG_ASSERT(!(*cond_table_list_ptr)); - (*cond_table_list_ptr) = table_list; - DBUG_PRINT("info",("spider cond_table_list=%p", table_list)); - } - List_iterator_fast it1(table_list->nested_join->join_list); - cur_table_list = it1++; - if (cur_table_list->outer_join & JOIN_TYPE_RIGHT) - { - first = FALSE; - prev_table_list = cur_table_list; - cur_table_list = it1++; - } else if (*cond_table_list_ptr) - { - first = TRUE; - cond_table_list = (*cond_table_list_ptr); - (*cond_table_list_ptr) = NULL; - if (cond_table_list->outer_join & JOIN_TYPE_LEFT) - { - if (str) + if (curr->on_expr) { - if (str->reserve(SPIDER_SQL_LEFT_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) - { + if (str->append(STRING_WITH_LEN(" on "))) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_LEFT_JOIN_STR, SPIDER_SQL_LEFT_JOIN_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } - } else { - if (str) - { - if (str->reserve(SPIDER_SQL_JOIN_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_JOIN_STR, SPIDER_SQL_JOIN_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + if (int error_num= + spider_db_print_item_type(curr->on_expr, NULL, + fields->get_first_table_holder()->spider, + str, NULL, 0, dbton_id, TRUE, fields)) + DBUG_RETURN(error_num); } } } - - do { - if (cur_table_list->outer_join & JOIN_TYPE_RIGHT) + else /* str == NULL */ + { + table_map usable_tables= 0; + if (int error_num= append_table_list(fields, str, *table, + &usable_tables, eliminated_tables)) + DBUG_RETURN(error_num); + for (TABLE_LIST **tbl= table + 1; tbl < end; tbl++) { - prev_table_list = cur_table_list; - } else { - if ((error_num = append_table(spider, fields, str, cur_table_list, - used_table_list, current_pos, cond_table_list_ptr, TRUE, first))) + TABLE_LIST *curr= *tbl; + /* semi join is an "internal" join and is unsupported. */ + if (curr->sj_inner_tables) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + if (int error_num= append_table_list(fields, str, curr, + &usable_tables, eliminated_tables)) DBUG_RETURN(error_num); - first = FALSE; - if (prev_table_list) + if (curr->on_expr) { - outer_join_backup = prev_table_list->outer_join; - prev_table_list->outer_join = JOIN_TYPE_LEFT; - if ((error_num = append_table(spider, fields, str, prev_table_list, - used_table_list, current_pos, cond_table_list_ptr, TRUE, FALSE))) - { - prev_table_list->outer_join = outer_join_backup; + /* The join refers to fields outside of the current context, + and cannot be handled by a group by handler. */ + if ((curr->on_expr->used_tables() & usable_tables) != + curr->on_expr->used_tables()) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + if (int error_num= + spider_db_print_item_type(curr->on_expr, NULL, + fields->get_first_table_holder()->spider, + str, NULL, 0, dbton_id, TRUE, fields)) DBUG_RETURN(error_num); - } - prev_table_list->outer_join = outer_join_backup; - prev_table_list = NULL; - } - } - } while ((cur_table_list = it1++)); - - if (cond_table_list) - { - if (str) - { - if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - - List *join_using_fields = cond_table_list->join_using_fields; - if (join_using_fields) - { - if (str->reserve(SPIDER_SQL_USING_LEN + SPIDER_SQL_OPEN_PAREN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - List_iterator_fast it2(*join_using_fields); - String *ptr; - while ((ptr = it2++)) - { - if (str->reserve(ptr->length() + SPIDER_SQL_COMMA_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(ptr->ptr(), ptr->length()); - str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); - } - str->length(str->length() - SPIDER_SQL_COMMA_LEN); - if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } - } - - Item *on_expr = cond_table_list->on_expr; - if (on_expr) - { - if (str) - { - if (str->reserve(SPIDER_SQL_ON_LEN)) - { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_ON_STR, SPIDER_SQL_ON_LEN); - } - if ((error_num = spider_db_print_item_type(on_expr, NULL, - spider, str, NULL, 0, dbton_id, TRUE, fields))) - { - DBUG_RETURN(error_num); } } + /* Update usable tables in the outer context. */ + if (upper_usable_tables) + *upper_usable_tables |= usable_tables; } DBUG_RETURN(0); } -int spider_db_mbase_util::append_tables_top_down_check( - TABLE_LIST *table_list, - TABLE_LIST **used_table_list, - uint *current_pos -) { - int error_num; - TABLE_LIST *cur_table_list; - DBUG_ENTER("spider_db_mbase_util::append_tables_top_down_check"); - DBUG_PRINT("info",("spider this=%p", this)); - List_iterator_fast it1(table_list->nested_join->join_list); - while ((cur_table_list = it1++)) +/* + Walk a join, or format it to a string and append the string. + + Skip all eliminated tables. + + If str is NULL, walk the tables to determine whether to create a + group by handler. Otherwise, format the join to a string and append + it to str. + + Adapted from print_join(). +*/ +int spider_db_mbase_util::append_join(spider_fields *fields, + spider_string *str, + List *tables, + table_map *upper_usable_tables, + table_map eliminated_tables) +{ + /* List is reversed => we should reverse it before using */ + List_iterator_fast ti(*tables); + TABLE_LIST **table; + THD *thd= fields->get_first_table_holder()->spider->wide_handler->trx->thd; + DBUG_ENTER("spider_db_mbase_util::append_join"); + + size_t tables_to_print= 0; + + for (TABLE_LIST *t= ti++; t ; t= ti++) + { + /* optimized_away implies const_table */ + DBUG_ASSERT(!t->optimized_away || t->table->const_table); + if (!is_eliminated_table(eliminated_tables, t)) + tables_to_print++; + } + if (tables_to_print == 0) { - if (!cur_table_list->table) - { - if ((error_num = append_tables_top_down_check( - cur_table_list, used_table_list, current_pos))) - DBUG_RETURN(error_num); - } else { - used_table_list[(*current_pos)++] = cur_table_list; - } + if (str && str->append(STRING_WITH_LEN("dual"))) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + DBUG_RETURN(0); } - DBUG_RETURN(0); -} + ti.rewind(); -int spider_db_mbase_util::append_embedding_tables( - ha_spider *spider, - spider_fields *fields, - spider_string *str, - TABLE_LIST *table_list, - TABLE_LIST **used_table_list, - uint *current_pos, - TABLE_LIST **cond_table_list_ptr -) { - int error_num; - TABLE_LIST *embedding = table_list->embedding; - DBUG_ENTER("spider_db_mbase_util::append_embedding_tables"); - DBUG_PRINT("info",("spider this=%p", this)); - if (embedding) - { - DBUG_PRINT("info",("spider embedding=%p", embedding)); - DBUG_PRINT("info",("spider embedding->outer_join=%u", - embedding->outer_join)); - DBUG_PRINT("info",("spider embedding->on_expr=%p", - embedding->on_expr)); - DBUG_PRINT("info",("spider embedding->join_using_fields=%p", - embedding->join_using_fields)); - DBUG_PRINT("info",("spider embedding->table=%p", - embedding->table)); - if ((error_num = append_embedding_tables(spider, fields, str, embedding, - used_table_list, current_pos, cond_table_list_ptr))) - DBUG_RETURN(error_num); - } else { - DBUG_PRINT("info",("spider table_list=%p", table_list)); - DBUG_PRINT("info",("spider table_list->outer_join=%u", - table_list->outer_join)); - DBUG_PRINT("info",("spider table_list->on_expr=%p", - table_list->on_expr)); - DBUG_PRINT("info",("spider table_list->join_using_fields=%p", - table_list->join_using_fields)); - DBUG_PRINT("info",("spider table_list->table=%p", - table_list->table)); - if (table_list->outer_join & JOIN_TYPE_RIGHT) - { - if ((error_num = append_tables_top_down_check(table_list, - used_table_list, current_pos))) - DBUG_RETURN(error_num); - DBUG_ASSERT(!(*cond_table_list_ptr)); - (*cond_table_list_ptr) = table_list; - DBUG_PRINT("info",("spider cond_table_list=%p", table_list)); - } else { - if ((error_num = append_tables_top_down(spider, fields, str, table_list, - used_table_list, current_pos, cond_table_list_ptr))) - DBUG_RETURN(error_num); - } + if (!(table= static_cast(thd->alloc(sizeof(TABLE_LIST*) * + tables_to_print)))) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + + TABLE_LIST *tmp, **t= table + (tables_to_print - 1); + while ((tmp= ti++)) + if (!is_eliminated_table(eliminated_tables, tmp)) + *t--= tmp; + + DBUG_ASSERT(tables->elements >= 1); + if ((*table)->sj_inner_tables) + { + /* Semi join is not supported. */ + if (!str) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + /* Semi join should have been skipped in the first pass. */ + else + DBUG_ASSERT(0); } - DBUG_RETURN(0); + int error_num= append_table_array( + fields, str, table, table + tables_to_print, upper_usable_tables, + eliminated_tables); + DBUG_RETURN(error_num); } int spider_db_mbase_util::append_from_and_tables( @@ -7245,116 +7044,17 @@ spider_string *str, TABLE_LIST *table_list, uint table_count -) { - int error_num; - uint current_pos = 0, roop_count, backup_pos, outer_join_backup; - TABLE *table; - TABLE_LIST **used_table_list, *prev_table_list = NULL, - *cond_table_list = NULL; +) +{ DBUG_ENTER("spider_db_mbase_util::append_from_and_tables"); - DBUG_PRINT("info",("spider this=%p", this)); - used_table_list = (TABLE_LIST **) - my_alloca(sizeof(TABLE_LIST *) * table_count); - if (!used_table_list) + if (str && str->append(" from ")) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - - if (str) - { - if (str->reserve(SPIDER_SQL_FROM_LEN)) - { - my_afree(used_table_list); - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); - } - - do { - table = table_list->table; - if (table->const_table) - continue; - - for (roop_count = 0; roop_count < current_pos; ++roop_count) - { - if (used_table_list[roop_count] == table_list) - break; - } - if (roop_count < current_pos) - continue; - - if (prev_table_list) - current_pos = backup_pos; - else - backup_pos = current_pos; - if ((error_num = append_table(spider, fields, str, table_list, used_table_list, - ¤t_pos, &cond_table_list, FALSE, FALSE))) - { - my_afree(used_table_list); - DBUG_RETURN(error_num); - } - if (prev_table_list) - { - outer_join_backup = prev_table_list->outer_join; - prev_table_list->outer_join = JOIN_TYPE_LEFT; - if ((error_num = append_table(spider, fields, str, prev_table_list, - used_table_list, ¤t_pos, &cond_table_list, FALSE, FALSE))) - { - prev_table_list->outer_join = outer_join_backup; - my_afree(used_table_list); - DBUG_RETURN(error_num); - } - prev_table_list->outer_join = outer_join_backup; - prev_table_list = NULL; - } - if (cond_table_list && (cond_table_list->outer_join & JOIN_TYPE_RIGHT)) - { - prev_table_list = cond_table_list; - cond_table_list = NULL; - DBUG_PRINT("info",("spider cond_table_list=%p", cond_table_list)); - } - } while ((table_list = table_list->next_local)); - my_afree(used_table_list); - DBUG_RETURN(0); -} - -int spider_db_mbase_util::reappend_tables( - spider_fields *fields, - SPIDER_LINK_IDX_CHAIN *link_idx_chain, - spider_string *str -) { - int error_num; - uint32 length; - ha_spider *spider; - spider_mbase_share *db_share; - spider_mbase_handler *dbton_hdl; - SPIDER_TABLE_HOLDER *table_holder; - SPIDER_LINK_IDX_HOLDER *link_idx_holder; - DBUG_ENTER("spider_db_mbase_util::reappend_tables"); - DBUG_PRINT("info",("spider this=%p", this)); - length = str->length(); - fields->set_pos_to_first_table_on_link_idx_chain(link_idx_chain); - fields->set_pos_to_first_table_holder(); - while ((table_holder = fields->get_next_table_holder())) - { - link_idx_holder = - fields->get_next_table_on_link_idx_chain(link_idx_chain); - spider = table_holder->spider; - db_share = (spider_mbase_share *) - spider->share->dbton_share[dbton_id]; - if (!db_share->same_db_table_name) - { - dbton_hdl = (spider_mbase_handler *) spider->dbton_handler[dbton_id]; - str->length(dbton_hdl->table_name_pos); - if ((error_num = db_share->append_table_name_with_adjusting(str, - spider->conn_link_idx[link_idx_holder->link_idx]))) - { - DBUG_RETURN(error_num); - } - } - } - str->length(length); - DBUG_RETURN(0); + const table_map eliminated_tables= table_list->select_lex->join ? + table_list->select_lex->join->eliminated_tables : 0; + int error_num = append_join(fields, str, table_list->select_lex->join_list, + NULL, eliminated_tables); + DBUG_RETURN(error_num); } - int spider_db_mbase_util::append_where( spider_string *str ) { @@ -7455,7 +7155,7 @@ { DBUG_ENTER("spider_mbase_share::spider_mbase_share"); DBUG_PRINT("info",("spider this=%p", this)); - spider_alloc_calc_mem_init(mem_calc, 71); + spider_alloc_calc_mem_init(mem_calc, SPD_MID_MBASE_SHARE_SPIDER_MBASE_SHARE_1); spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this)); DBUG_VOID_RETURN; } @@ -7529,7 +7229,7 @@ DBUG_ENTER("spider_mbase_share::init"); DBUG_PRINT("info",("spider this=%p", this)); if (!(key_select_pos = (int *) - spider_bulk_alloc_mem(spider_current_trx, 112, + spider_bulk_alloc_mem(spider_current_trx, SPD_MID_MBASE_SHARE_INIT_1, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &key_select_pos, sizeof(int) * keys, @@ -7540,24 +7240,22 @@ DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - if (keys > 0 && - !(key_hint = new spider_string[keys]) - ) { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } + if (keys > 0) + if (!(key_hint = new spider_string[keys])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); for (roop_count = 0; roop_count < keys; roop_count++) { - key_hint[roop_count].init_calc_mem(189); + key_hint[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_INIT_2); key_hint[roop_count].set_charset(spider_share->access_charset); } DBUG_PRINT("info",("spider key_hint=%p", key_hint)); - if ( - !(table_select = new spider_string[1]) || - (keys > 0 && - !(key_select = new spider_string[keys]) - ) || - (error_num = create_table_names_str()) || + if (!(table_select = new spider_string[1])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if (keys > 0) + if (!(key_select = new spider_string[keys])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if ((error_num = create_table_names_str()) || (table_share && ( (error_num = create_column_name_str()) || @@ -7571,13 +7269,13 @@ DBUG_RETURN(HA_ERR_OUT_OF_MEM); } - table_select->init_calc_mem(96); + table_select->init_calc_mem(SPD_MID_MBASE_SHARE_INIT_3); if (table_share && (error_num = append_table_select())) DBUG_RETURN(error_num); for (roop_count = 0; roop_count < keys; roop_count++) { - key_select[roop_count].init_calc_mem(97); + key_select[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_INIT_4); if ((error_num = append_key_select(roop_count))) DBUG_RETURN(error_num); } @@ -7708,11 +7406,18 @@ table_names_str = NULL; db_names_str = NULL; db_table_str = NULL; - if ( - !(table_names_str = new spider_string[spider_share->all_link_count]) || - !(db_names_str = new spider_string[spider_share->all_link_count]) || - !(db_table_str = new spider_string[spider_share->all_link_count]) - ) { + if (!(table_names_str = new spider_string[spider_share->all_link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + if (!(db_names_str = new spider_string[spider_share->all_link_count])) + { + error_num = HA_ERR_OUT_OF_MEM; + goto error; + } + if (!(db_table_str = new spider_string[spider_share->all_link_count])) + { error_num = HA_ERR_OUT_OF_MEM; goto error; } @@ -7728,9 +7433,9 @@ for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { - table_names_str[roop_count].init_calc_mem(86); - db_names_str[roop_count].init_calc_mem(87); - db_table_str[roop_count].init_calc_mem(88); + table_names_str[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_1); + db_names_str[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_2); + db_table_str[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_3); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; if (first_all_link_idx == -1) @@ -7861,15 +7566,13 @@ Field **field; TABLE_SHARE *table_share = spider_share->table_share; DBUG_ENTER("spider_mbase_share::create_column_name_str"); - if ( - table_share->fields && - !(column_name_str = new spider_string[table_share->fields]) - ) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if (table_share->fields) + if (!(column_name_str = new spider_string[table_share->fields])) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); for (field = table_share->field, str = column_name_str; *field; field++, str++) { - str->init_calc_mem(89); + str->init_calc_mem(SPD_MID_MBASE_SHARE_CREATE_COLUMN_NAME_STR_1); str->set_charset(spider_share->access_charset); if ((error_num = spider_db_append_name_with_quote_str(str, (*field)->field_name, dbton_id))) @@ -7937,8 +7640,8 @@ for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { - show_table_status[0 + (2 * roop_count)].init_calc_mem(90); - show_table_status[1 + (2 * roop_count)].init_calc_mem(91); + show_table_status[0 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_1); + show_table_status[1 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_2); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; @@ -8018,7 +7721,7 @@ for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { - show_records[roop_count].init_calc_mem(92); + show_records[roop_count].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_RECORDS_1); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; @@ -8068,8 +7771,8 @@ for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { - show_index[0 + (2 * roop_count)].init_calc_mem(93); - show_index[1 + (2 * roop_count)].init_calc_mem(94); + show_index[0 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_1); + show_index[1 + (2 * roop_count)].init_calc_mem(SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_2); if (spider_share->sql_dbton_ids[roop_count] != dbton_id) continue; @@ -8202,7 +7905,7 @@ uint strlen = str->length(); DBUG_ENTER("spider_mbase_share::discover_table_structure"); DBUG_PRINT("info",("spider this=%p", this)); - sql_str.init_calc_mem(228); + sql_str.init_calc_mem(SPD_MID_MBASE_SHARE_DISCOVER_TABLE_STRUCTURE_1); for (roop_count = 0; roop_count < (int) spider_share->all_link_count; roop_count++) { @@ -8536,7 +8239,7 @@ { DBUG_ENTER("spider_mbase_handler::spider_mbase_handler"); DBUG_PRINT("info",("spider this=%p", this)); - spider_alloc_calc_mem_init(mem_calc, 183); + spider_alloc_calc_mem_init(mem_calc, SPD_MID_MBASE_HANDLER_SPIDER_MBASE_HANDLER_1); spider_alloc_calc_mem(spider_current_trx, mem_calc, sizeof(*this)); DBUG_VOID_RETURN; } @@ -8609,14 +8312,14 @@ TABLE *table = spider->get_table(); DBUG_ENTER("spider_mbase_handler::init"); DBUG_PRINT("info",("spider this=%p", this)); - sql.init_calc_mem(59); - sql_part.init_calc_mem(60); - sql_part2.init_calc_mem(61); - ha_sql.init_calc_mem(62); - insert_sql.init_calc_mem(64); - update_sql.init_calc_mem(65); - tmp_sql.init_calc_mem(66); - dup_update_sql.init_calc_mem(166); + sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_1); + sql_part.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_2); + sql_part2.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_3); + ha_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_4); + insert_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_5); + update_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_6); + tmp_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_7); + dup_update_sql.init_calc_mem(SPD_MID_MBASE_HANDLER_INIT_8); if ( (sql.real_alloc(init_sql_alloc_size)) || (insert_sql.real_alloc(init_sql_alloc_size)) || @@ -8636,12 +8339,12 @@ upd_tmp_tbl_prm.init(); upd_tmp_tbl_prm.field_count = 1; if (!(link_for_hash = (SPIDER_LINK_FOR_HASH *) - spider_bulk_alloc_mem(spider_current_trx, 141, + spider_bulk_alloc_mem(spider_current_trx, SPD_MID_MBASE_HANDLER_INIT_9, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &link_for_hash, sizeof(SPIDER_LINK_FOR_HASH) * share->link_count, &minimum_select_bitmap, - table ? sizeof(uchar) * no_bytes_in_map(table->read_set) : 0, + table ? sizeof(uchar) * my_bitmap_buffer_size(table->read_set) : 0, NullS)) ) { DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -8740,7 +8443,7 @@ spider_string tmp_str(tmp_buf, sizeof(tmp_buf), system_charset_info); DBUG_ENTER("spider_mbase_handler::append_key_column_types"); DBUG_PRINT("info",("spider this=%p", this)); - tmp_str.init_calc_mem(115); + tmp_str.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_KEY_COLUMN_TYPES_1); start_key_part_map = start_key->keypart_map & full_key_part_map; DBUG_PRINT("info", ("spider spider_user_defined_key_parts=%u", @@ -8870,7 +8573,7 @@ const char *table_names[2], *table_aliases[2], *table_dot_aliases[2]; uint table_name_lengths[2], table_alias_lengths[2], table_dot_alias_lengths[2]; - tgt_table_name_str.init_calc_mem(99); + tgt_table_name_str.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_TMP_TABLE_AND_SQL_FOR_BKA_1); tgt_table_name_str.length(0); create_tmp_bka_table_name(tmp_table_name, &tmp_table_name_length, first_link_idx); @@ -9121,7 +8824,7 @@ const char *table_names[2], *table_aliases[2], *table_dot_aliases[2]; uint table_name_lengths[2], table_alias_lengths[2], table_dot_alias_lengths[2]; - tgt_table_name_str.init_calc_mem(233); + tgt_table_name_str.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_UNION_TABLE_AND_SQL_FOR_BKA_1); tgt_table_name_str.length(0); if ((error_num = append_table_name_with_adjusting(&tgt_table_name_str, first_link_idx, SPIDER_SQL_TYPE_SELECT_SQL))) @@ -11107,7 +10810,7 @@ char buf[MAX_FIELD_WIDTH]; spider_string tmp_str(buf, MAX_FIELD_WIDTH, share->access_charset); - tmp_str.init_calc_mem(116); + tmp_str.init_calc_mem(SPD_MID_MBASE_HANDLER_APPEND_MATCH_AGAINST_1); tmp_str.length(0); if ( tmp_str.append(ft_init_key->ptr(), ft_init_key->length(), @@ -13223,14 +12926,10 @@ int link_idx, SPIDER_LINK_IDX_CHAIN *link_idx_chain ) { - int error_num; DBUG_ENTER("spider_mbase_handler::set_sql_for_exec"); DBUG_PRINT("info",("spider this=%p", this)); if (sql_type & SPIDER_SQL_TYPE_SELECT_SQL) { - if ((error_num = spider_db_mbase_utility->reappend_tables( - spider->fields, link_idx_chain, &sql))) - DBUG_RETURN(error_num); exec_sql = &sql; } DBUG_RETURN(0); @@ -13264,7 +12963,7 @@ mysql_share->db_names_str[link_idx].charset()); const char *table_names[2], *table_aliases[2]; uint table_name_lengths[2], table_alias_lengths[2]; - tgt_table_name_str.init_calc_mem(104); + tgt_table_name_str.init_calc_mem(SPD_MID_MBASE_HANDLER_SET_SQL_FOR_EXEC_1); tgt_table_name_str.length(0); if (result_list->tmp_table_join && spider->bka_mode != 2) { @@ -15114,7 +14813,7 @@ Field **field_p; DBUG_ENTER("spider_mbase_handler::minimum_select_bitmap_create"); DBUG_PRINT("info",("spider this=%p", this)); - memset(minimum_select_bitmap, 0, no_bytes_in_map(table->read_set)); + memset(minimum_select_bitmap, 0, my_bitmap_buffer_size(table->read_set)); if ( spider->use_index_merge || spider->is_clone @@ -15125,7 +14824,7 @@ table_share->primary_key == MAX_KEY ) { /* need all columns */ - memset(minimum_select_bitmap, 0xFF, no_bytes_in_map(table->read_set)); + memset(minimum_select_bitmap, 0xFF, my_bitmap_buffer_size(table->read_set)); DBUG_VOID_RETURN; } else { /* need primary key columns */ @@ -15213,7 +14912,7 @@ DBUG_PRINT("info",("spider this=%p", this)); if (!union_table_name_pos_first) { - if (!spider_bulk_malloc(spider_current_trx, 236, MYF(MY_WME), + if (!spider_bulk_malloc(spider_current_trx, SPD_MID_MBASE_HANDLER_INIT_UNION_TABLE_NAME_POS_1, MYF(MY_WME), &union_table_name_pos_first, (uint) (sizeof(SPIDER_INT_HLD)), NullS) ) { @@ -15234,7 +14933,7 @@ { if (!union_table_name_pos_current->next) { - if (!spider_bulk_malloc(spider_current_trx, 237, MYF(MY_WME), + if (!spider_bulk_malloc(spider_current_trx, SPD_MID_MBASE_HANDLER_SET_UNION_TABLE_NAME_POS_1, MYF(MY_WME), &union_table_name_pos_current->next, (uint) (sizeof(SPIDER_INT_HLD)), NullS) ) { @@ -15296,8 +14995,7 @@ default: DBUG_RETURN(0); } - fields->set_pos_to_first_table_holder(); - table_holder = fields->get_next_table_holder(); + table_holder = fields->get_first_table_holder(); table_list = table_holder->table->pos_in_table_list; error_num = spider_db_mbase_utility->append_from_and_tables( table_holder->spider, fields, str, @@ -15305,27 +15003,6 @@ DBUG_RETURN(error_num); } -int spider_mbase_handler::reappend_tables_part( - spider_fields *fields, - ulong sql_type -) { - int error_num; - spider_string *str; - DBUG_ENTER("spider_mbase_handler::reappend_tables_part"); - DBUG_PRINT("info",("spider this=%p", this)); - switch (sql_type) - { - case SPIDER_SQL_TYPE_SELECT_SQL: - str = &sql; - break; - default: - DBUG_RETURN(0); - } - error_num = spider_db_mbase_utility->reappend_tables(fields, - link_idx_chain, str); - DBUG_RETURN(error_num); -} - int spider_mbase_handler::append_where_part( ulong sql_type ) { @@ -15678,7 +15355,7 @@ { DBUG_ENTER("spider_mbase_copy_table::init"); DBUG_PRINT("info",("spider this=%p", this)); - sql.init_calc_mem(78); + sql.init_calc_mem(SPD_MID_MBASE_COPY_TABLE_INIT_1); DBUG_RETURN(0); } diff -Nru mariadb-10.11.6/storage/spider/spd_db_mysql.h mariadb-10.11.9/storage/spider/spd_db_mysql.h --- mariadb-10.11.6/storage/spider/spd_db_mysql.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_db_mysql.h 2024-08-03 07:29:59.000000000 +0000 @@ -158,40 +158,22 @@ spider_string *to, String *from ) override; - int append_table( - ha_spider *spider, - spider_fields *fields, - spider_string *str, - TABLE_LIST *table_list, - TABLE_LIST **used_table_list, - uint *current_pos, - TABLE_LIST **cond_table_list_ptr, - bool top_down, - bool first - ); - int append_tables_top_down( - ha_spider *spider, - spider_fields *fields, - spider_string *str, - TABLE_LIST *table_list, - TABLE_LIST **used_table_list, - uint *current_pos, - TABLE_LIST **cond_table_list_ptr - ); int append_tables_top_down_check( TABLE_LIST *table_list, TABLE_LIST **used_table_list, uint *current_pos ); - int append_embedding_tables( - ha_spider *spider, - spider_fields *fields, - spider_string *str, - TABLE_LIST *table_list, - TABLE_LIST **used_table_list, - uint *current_pos, - TABLE_LIST **cond_table_list_ptr - ); + int append_table_list(spider_fields *fields, + spider_string *str, TABLE_LIST *table, + table_map *upper_usable_tables, + table_map eliminated_tables); + int append_table_array(spider_fields *fields, + spider_string *str, TABLE_LIST **table, + TABLE_LIST **end, table_map *upper_usable_tables, + table_map eliminated_tables); + int append_join(spider_fields *fields, spider_string *str, + List *tables, table_map *upper_usable_tables, + table_map eliminated_tables); int append_from_and_tables( ha_spider *spider, spider_fields *fields, @@ -199,11 +181,6 @@ TABLE_LIST *table_list, uint table_count ) override; - int reappend_tables( - spider_fields *fields, - SPIDER_LINK_IDX_CHAIN *link_idx_chain, - spider_string *str - ) override; int append_where( spider_string *str ) override; @@ -270,29 +247,29 @@ int store_to_field( Field *field, CHARSET_INFO *access_charset - ); + ) override; int append_to_str( spider_string *str - ); + ) override; int append_escaped_to_str( spider_string *str, uint dbton_id - ); - void first(); - void next(); - bool is_null(); - int val_int(); - double val_real(); + ) override; + void first() override; + void next() override; + bool is_null() override; + int val_int() override; + double val_real() override; my_decimal *val_decimal( my_decimal *decimal_value, CHARSET_INFO *access_charset - ); - SPIDER_DB_ROW *clone(); + ) override; + SPIDER_DB_ROW *clone() override; int store_to_tmp_table( TABLE *tmp_table, spider_string *str - ); - uint get_byte_size(); + ) override; + uint get_byte_size() override; }; class spider_db_mysql_row: public spider_db_mbase_row @@ -320,20 +297,20 @@ SPIDER_DB_CONN *in_db_conn ); virtual ~spider_db_mbase_result(); - bool has_result(); - void free_result(); - SPIDER_DB_ROW *current_row(); - SPIDER_DB_ROW *fetch_row(); + bool has_result() override; + void free_result() override; + SPIDER_DB_ROW *current_row() override; + SPIDER_DB_ROW *fetch_row() override; SPIDER_DB_ROW *fetch_row_from_result_buffer( spider_db_result_buffer *spider_res_buf - ); + ) override; SPIDER_DB_ROW *fetch_row_from_tmp_table( TABLE *tmp_table - ); + ) override; int fetch_table_status( int mode, ha_statistics &stat - ); + ) override; int fetch_simple_action( uint simple_action, uint position, @@ -342,20 +319,20 @@ int fetch_table_records( int mode, ha_rows &records - ); + ) override; int fetch_table_checksum( ha_spider *spider - ); + ) override; int fetch_table_cardinality( int mode, TABLE *table, longlong *cardinality, uchar *cardinality_upd, int bitmap_size - ); + ) override; int fetch_table_mon_status( int &status - ); + ) override; int fetch_show_master_status( const char **binlog_file_name, const char **binlog_pos @@ -363,25 +340,23 @@ int fetch_select_binlog_gtid_pos( const char **gtid_pos ); - longlong num_rows(); - uint num_fields(); - void move_to_pos( - longlong pos - ); - int get_errno(); + longlong num_rows() override; + uint num_fields() override; + void move_to_pos(longlong pos) override; + int get_errno() override; int fetch_columns_for_discover_table_structure( spider_string *str, CHARSET_INFO *access_charset - ); + ) override; int fetch_index_for_discover_table_structure( spider_string *str, CHARSET_INFO *access_charset - ); + ) override; int fetch_table_for_discover_table_structure( spider_string *str, SPIDER_SHARE *spider_share, CHARSET_INFO *access_charset - ); + ) override; }; class spider_db_mysql_result: public spider_db_mbase_result @@ -420,9 +395,9 @@ spider_db_mbase_util *spider_db_mbase_utility ); virtual ~spider_db_mbase(); - int init(); - bool is_connected(); - void bg_connect(); + int init() override; + bool is_connected() override; + void bg_connect() override; int connect( char *tgt_host, char *tgt_username, @@ -432,121 +407,116 @@ char *server_name, int connect_retry_count, longlong connect_retry_interval - ); - int ping(); - void bg_disconnect(); - void disconnect(); - int set_net_timeout(); + ) override; + int ping() override; + void bg_disconnect() override; + void disconnect() override; + int set_net_timeout() override; int exec_query( const char *query, uint length, int quick_mode - ); - int get_errno(); - const char *get_error(); + ) override; + int get_errno() override; + const char *get_error() override; bool is_server_gone_error( int error_num - ); + ) override; bool is_dup_entry_error( int error_num - ); + ) override; bool is_xa_nota_error( int error_num - ); + ) override; int fetch_and_print_warnings(struct tm *l_time); spider_db_result *store_result( spider_db_result_buffer **spider_res_buf, st_spider_db_request_key *request_key, int *error_num - ); + ) override; spider_db_result *use_result( ha_spider *spider, st_spider_db_request_key *request_key, int *error_num - ); - int next_result(); - uint affected_rows(); - uint matched_rows(); + ) override; + int next_result() override; + uint affected_rows() override; + uint matched_rows() override; bool inserted_info( spider_db_handler *handler, ha_copy_info *copy_info - ); - ulonglong last_insert_id(); + ) override; + ulonglong last_insert_id() override; int set_character_set( const char *csname - ); + ) override; int select_db( const char *dbname - ); + ) override; int consistent_snapshot( int *need_mon - ); - bool trx_start_in_bulk_sql(); + ) override; + bool trx_start_in_bulk_sql() override; int start_transaction( int *need_mon - ); + ) override; int commit( int *need_mon - ); + ) override; int rollback( int *need_mon - ); - bool xa_start_in_bulk_sql(); + ) override; + bool xa_start_in_bulk_sql() override; int xa_start( XID *xid, int *need_mon - ); + ) override; int xa_end( XID *xid, int *need_mon - ); + ) override; int xa_prepare( XID *xid, int *need_mon - ); + ) override; int xa_commit( XID *xid, int *need_mon - ); + ) override; int xa_rollback( XID *xid, int *need_mon - ); - bool set_trx_isolation_in_bulk_sql(); + ) override; + bool set_trx_isolation_in_bulk_sql() override; int set_trx_isolation( int trx_isolation, int *need_mon - ); - bool set_autocommit_in_bulk_sql(); + ) override; + bool set_autocommit_in_bulk_sql() override; int set_autocommit( bool autocommit, int *need_mon - ); - bool set_sql_log_off_in_bulk_sql(); + ) override; + bool set_sql_log_off_in_bulk_sql() override; int set_sql_log_off( bool sql_log_off, int *need_mon - ); - bool set_wait_timeout_in_bulk_sql(); + ) override; + bool set_wait_timeout_in_bulk_sql() override; int set_wait_timeout( int wait_timeout, int *need_mon - ); - bool set_sql_mode_in_bulk_sql(); + ) override; + bool set_sql_mode_in_bulk_sql() override; int set_sql_mode( sql_mode_t sql_mode, int *need_mon - ); - bool set_time_zone_in_bulk_sql(); + ) override; + bool set_time_zone_in_bulk_sql() override; int set_time_zone( Time_zone *time_zone, int *need_mon - ); - bool set_loop_check_in_bulk_sql(); - int set_loop_check( - int *need_mon - ); - int fin_loop_check(); + ) override; int exec_simple_sql_with_result( SPIDER_TRX *trx, SPIDER_SHARE *share, @@ -566,7 +536,7 @@ int mode, SPIDER_DB_RESULT **res1, SPIDER_DB_RESULT **res2 - ); + ) override; int select_binlog_gtid_pos( SPIDER_TRX *trx, SPIDER_SHARE *share, @@ -584,23 +554,21 @@ char *to, const char *from, size_t from_length - ); - bool have_lock_table_list(); + ) override; + bool have_lock_table_list() override; int append_lock_tables( spider_string *str - ); - int append_unlock_tables( - spider_string *str - ); - uint get_lock_table_hash_count(); - void reset_lock_table_hash(); + ) override; + int append_unlock_tables(spider_string *str) override; + uint get_lock_table_hash_count() override; + void reset_lock_table_hash() override; void set_dup_key_idx( ha_spider *spider, int link_idx - ); + ) override; bool cmp_request_key_to_snd( st_spider_db_request_key *request_key - ); + ) override; }; class spider_db_mysql: public spider_db_mbase @@ -634,8 +602,11 @@ spider_string *show_table_status; spider_string *show_records; spider_string *show_index; + /* The remote table names */ spider_string *table_names_str; + /* The remote db names */ spider_string *db_names_str; + /* fixme: this field looks useless */ spider_string *db_table_str; my_hash_value_type *db_table_str_hash_value; uint table_nm_max_length; @@ -650,20 +621,20 @@ spider_db_mbase_util *spider_db_mbase_utility ); virtual ~spider_mbase_share(); - int init(); + int init() override; uint get_column_name_length( uint field_index - ); + ) override; int append_column_name( spider_string *str, uint field_index - ); + ) override; int append_column_name_with_alias( spider_string *str, uint field_index, const char *alias, uint alias_length - ); + ) override; int append_table_name( spider_string *str, int all_link_idx @@ -676,13 +647,13 @@ spider_string *str, int *table_name_pos ); - bool need_change_db_table_name(); + bool need_change_db_table_name() override; int discover_table_structure( SPIDER_TRX *trx, SPIDER_SHARE *spider_share, spider_string *str - ); - bool checksum_support(); + ) override; + bool checksum_support() override; protected: int create_table_names_str(); void free_table_names_str(); @@ -772,17 +743,17 @@ spider_db_mbase_util *spider_db_mbase_utility ); virtual ~spider_mbase_handler(); - int init(); + int init() override; int append_index_hint( spider_string *str, int link_idx, ulong sql_type - ); + ) override; int append_table_name_with_adjusting( spider_string *str, int link_idx, ulong sql_type - ); + ) override; int append_key_column_types( const key_range *start_key, spider_string *str @@ -795,8 +766,8 @@ ); int append_tmp_table_and_sql_for_bka( const key_range *start_key - ); - int reuse_tmp_table_and_sql_for_bka(); + ) override; + int reuse_tmp_table_and_sql_for_bka() override; void create_tmp_bka_table_name( char *tmp_table_name, int *tmp_table_name_length, @@ -827,61 +798,61 @@ ); int append_union_table_and_sql_for_bka( const key_range *start_key - ); - int reuse_union_table_and_sql_for_bka(); + ) override; + int reuse_union_table_and_sql_for_bka() override; int append_insert_for_recovery( ulong sql_type, int link_idx - ); + ) override; int append_update( const TABLE *table, my_ptrdiff_t ptr_diff - ); + ) override; int append_update( const TABLE *table, my_ptrdiff_t ptr_diff, int link_idx - ); + ) override; int append_delete( const TABLE *table, my_ptrdiff_t ptr_diff - ); + ) override; int append_delete( const TABLE *table, my_ptrdiff_t ptr_diff, int link_idx - ); - int append_insert_part(); + ) override; + int append_insert_part() override; int append_insert( spider_string *str, int link_idx ); - int append_update_part(); + int append_update_part() override; int append_update( spider_string *str, int link_idx ); - int append_delete_part(); + int append_delete_part() override; int append_delete( spider_string *str ); - int append_update_set_part(); + int append_update_set_part() override; int append_update_set( spider_string *str ); - int append_direct_update_set_part(); + int append_direct_update_set_part() override; int append_direct_update_set( spider_string *str ); int append_dup_update_pushdown_part( const char *alias, uint alias_length - ); + ) override; int append_update_columns_part( const char *alias, uint alias_length - ); - int check_update_columns_part(); + ) override; + int check_update_columns_part() override; int append_update_columns( spider_string *str, const char *alias, @@ -889,28 +860,28 @@ ); int append_select_part( ulong sql_type - ); + ) override; int append_select( spider_string *str, ulong sql_type - ); + ) override; int append_table_select_part( ulong sql_type - ); + ) override; int append_table_select( spider_string *str ); int append_key_select_part( ulong sql_type, uint idx - ); + ) override; int append_key_select( spider_string *str, uint idx ); int append_minimum_select_part( ulong sql_type - ); + ) override; int append_minimum_select( spider_string *str, ulong sql_type @@ -938,47 +909,47 @@ ); int append_hint_after_table_part( ulong sql_type - ); + ) override; int append_hint_after_table( spider_string *str ); void set_where_pos( ulong sql_type - ); + ) override; void set_where_to_pos( ulong sql_type - ); + ) override; int check_item_type( Item *item - ); + ) override; int append_values_connector_part( ulong sql_type - ); + ) override; int append_values_connector( spider_string *str ); int append_values_terminator_part( ulong sql_type - ); + ) override; int append_values_terminator( spider_string *str ); int append_union_table_connector_part( ulong sql_type - ); + ) override; int append_union_table_connector( spider_string *str ); int append_union_table_terminator_part( ulong sql_type - ); + ) override; int append_union_table_terminator( spider_string *str ); int append_key_column_values_part( const key_range *start_key, ulong sql_type - ); + ) override; int append_key_column_values( spider_string *str, const key_range *start_key @@ -986,7 +957,7 @@ int append_key_column_values_with_name_part( const key_range *start_key, ulong sql_type - ); + ) override; int append_key_column_values_with_name( spider_string *str, const key_range *start_key @@ -995,7 +966,7 @@ const key_range *start_key, const key_range *end_key, ulong sql_type - ); + ) override; int append_key_where( spider_string *str, spider_string *str_part, @@ -1012,7 +983,7 @@ const uchar **ptr, bool key_eq, bool tgt_final - ); + ) override; int append_is_null( ulong sql_type, spider_string *str, @@ -1028,7 +999,7 @@ ulong sql_type, bool set_order, int key_count - ); + ) override; int append_where_terminator( ulong sql_type, spider_string *str, @@ -1039,7 +1010,7 @@ ); int append_match_where_part( ulong sql_type - ); + ) override; int append_match_where( spider_string *str ); @@ -1053,7 +1024,7 @@ uint alias_length, ulong sql_type, bool test_flg - ); + ) override; int append_condition( spider_string *str, const char *alias, @@ -1077,7 +1048,7 @@ ulong sql_type, const char *alias, uint alias_length - ); + ) override; int append_match_select( spider_string *str, const char *alias, @@ -1087,7 +1058,7 @@ ulong sql_type, const char *alias, uint alias_length - ); + ) override; int append_sum_select( spider_string *str, const char *alias, @@ -1095,15 +1066,13 @@ ); void set_order_pos( ulong sql_type - ); - void set_order_to_pos( - ulong sql_type - ); + ) override; + void set_order_to_pos(ulong sql_type) override; int append_group_by_part( const char *alias, uint alias_length, ulong sql_type - ); + ) override; int append_group_by( spider_string *str, const char *alias, @@ -1113,7 +1082,7 @@ const char *alias, uint alias_length, ulong sql_type - ); + ) override; int append_key_order_for_merge_with_alias( spider_string *str, const char *alias, @@ -1123,7 +1092,7 @@ const char *alias, uint alias_length, ulong sql_type - ); + ) override; int append_key_order_for_direct_order_limit_with_alias( spider_string *str, const char *alias, @@ -1133,7 +1102,7 @@ const char *alias, uint alias_length, ulong sql_type - ); + ) override; int append_key_order_for_handler( spider_string *str, const char *alias, @@ -1148,12 +1117,12 @@ longlong offset, longlong limit, ulong sql_type - ); + ) override; int reappend_limit_part( longlong offset, longlong limit, ulong sql_type - ); + ) override; int append_limit( spider_string *str, longlong offset, @@ -1161,25 +1130,25 @@ ); int append_select_lock_part( ulong sql_type - ); + ) override; int append_select_lock( spider_string *str ); int append_union_all_start_part( ulong sql_type - ); + ) override; int append_union_all_start( spider_string *str ); int append_union_all_part( ulong sql_type - ); + ) override; int append_union_all( spider_string *str ); int append_union_all_end_part( ulong sql_type - ); + ) override; int append_union_all_end( spider_string *str ); @@ -1187,7 +1156,7 @@ ulong sql_type, uint multi_range_cnt, bool with_comma - ); + ) override; int append_multi_range_cnt( spider_string *str, uint multi_range_cnt, @@ -1196,36 +1165,36 @@ int append_multi_range_cnt_with_name_part( ulong sql_type, uint multi_range_cnt - ); + ) override; int append_multi_range_cnt_with_name( spider_string *str, uint multi_range_cnt ); int append_insert_terminator_part( ulong sql_type - ); + ) override; int append_insert_terminator( spider_string *str ); int append_insert_values_part( ulong sql_type - ); + ) override; int append_insert_values( spider_string *str ); int append_into_part( ulong sql_type - ); + ) override; int append_into( spider_string *str ); void set_insert_to_pos( ulong sql_type - ); + ) override; int append_from_part( ulong sql_type, int link_idx - ); + ) override; int append_from( spider_string *str, ulong sql_type, @@ -1295,7 +1264,7 @@ ); int append_delete_all_rows_part( ulong sql_type - ); + ) override; int append_delete_all_rows( spider_string *str, ulong sql_type @@ -1310,7 +1279,7 @@ const key_range *end_key, ulong sql_type, int link_idx - ); + ) override; int append_explain_select( spider_string *str, const key_range *start_key, @@ -1320,32 +1289,32 @@ ); bool is_sole_projection_field( uint16 field_index - ); + ) override; bool is_bulk_insert_exec_period( bool bulk_end - ); + ) override; bool sql_is_filled_up( ulong sql_type - ); + ) override; bool sql_is_empty( ulong sql_type - ); - bool support_multi_split_read(); - bool support_bulk_update(); - int bulk_tmp_table_insert(); + ) override; + bool support_multi_split_read() override; + bool support_bulk_update() override; + int bulk_tmp_table_insert() override; int bulk_tmp_table_insert( int link_idx - ); - int bulk_tmp_table_end_bulk_insert(); - int bulk_tmp_table_rnd_init(); - int bulk_tmp_table_rnd_next(); - int bulk_tmp_table_rnd_end(); + ) override; + int bulk_tmp_table_end_bulk_insert() override; + int bulk_tmp_table_rnd_init() override; + int bulk_tmp_table_rnd_next() override; + int bulk_tmp_table_rnd_end() override; bool need_copy_for_update( int link_idx - ); - bool bulk_tmp_table_created(); - int mk_bulk_tmp_table_and_bulk_start(); - void rm_bulk_tmp_table(); + ) override; + bool bulk_tmp_table_created() override; + int mk_bulk_tmp_table_and_bulk_start() override; + void rm_bulk_tmp_table() override; int store_sql_to_bulk_tmp_table( spider_string *str, TABLE *tmp_table @@ -1357,144 +1326,126 @@ int insert_lock_tables_list( SPIDER_CONN *conn, int link_idx - ); + ) override; int append_lock_tables_list( SPIDER_CONN *conn, int link_idx, int *appended - ); + ) override; int realloc_sql( ulong *realloced - ); - int reset_sql( - ulong sql_type - ); + ) override; + int reset_sql(ulong sql_type) override; int set_sql_for_exec( ulong sql_type, int link_idx, SPIDER_LINK_IDX_CHAIN *link_idx_chain - ); + ) override; int set_sql_for_exec( ulong sql_type, int link_idx - ); + ) override; int set_sql_for_exec( spider_db_copy_table *tgt_ct, ulong sql_type - ); + ) override; int execute_sql( ulong sql_type, SPIDER_CONN *conn, int quick_mode, int *need_mon - ); - int reset(); + ) override; + int reset() override; int sts_mode_exchange( int sts_mode - ); + ) override; int show_table_status( int link_idx, int sts_mode, uint flag - ); - int crd_mode_exchange( - int crd_mode - ); - int show_index( - int link_idx, - int crd_mode - ); + ) override; + int crd_mode_exchange(int crd_mode) override; + int show_index(int link_idx, int crd_mode) override; int simple_action( uint simple_action, int link_idx ); - int show_records( - int link_idx - ); - int checksum_table( - int link_idx - ); - int show_last_insert_id( - int link_idx, - ulonglong &last_insert_id - ); + int show_records(int link_idx) override; + int checksum_table(int link_idx) override; + int show_last_insert_id(int link_idx, ulonglong &last_insert_id) override; ha_rows explain_select( const key_range *start_key, const key_range *end_key, int link_idx - ); + ) override; int lock_tables( int link_idx - ); + ) override; int unlock_tables( int link_idx - ); + ) override; int disable_keys( SPIDER_CONN *conn, int link_idx - ); + ) override; int enable_keys( SPIDER_CONN *conn, int link_idx - ); + ) override; int check_table( SPIDER_CONN *conn, int link_idx, HA_CHECK_OPT* check_opt - ); + ) override; int repair_table( SPIDER_CONN *conn, int link_idx, HA_CHECK_OPT* check_opt - ); + ) override; int analyze_table( SPIDER_CONN *conn, int link_idx - ); + ) override; int optimize_table( SPIDER_CONN *conn, int link_idx - ); + ) override; int flush_tables( SPIDER_CONN *conn, int link_idx, bool lock - ); + ) override; int flush_logs( SPIDER_CONN *conn, int link_idx - ); + ) override; int sync_from_clone_source( spider_db_handler *dbton_hdl - ); + ) override; void minimum_select_bitmap_create(); bool minimum_select_bit_is_set( uint field_index - ); + ) override; void copy_minimum_select_bitmap( uchar *bitmap - ); - int init_union_table_name_pos(); - int set_union_table_name_pos(); + ) override; + int init_union_table_name_pos() override; + int set_union_table_name_pos() override; int reset_union_table_name( spider_string *str, int link_idx, ulong sql_type - ); + ) override; int append_from_and_tables_part( spider_fields *fields, ulong sql_type - ); - int reappend_tables_part( - spider_fields *fields, - ulong sql_type - ); + ) override; int append_where_part( ulong sql_type - ); + ) override; int append_having_part( ulong sql_type - ); + ) override; int append_item_type_part( Item *item, const char *alias, @@ -1502,7 +1453,7 @@ bool use_fields, spider_fields *fields, ulong sql_type - ); + ) override; int append_list_item_select_part( List *select, const char *alias, @@ -1510,7 +1461,7 @@ bool use_fields, spider_fields *fields, ulong sql_type - ); + ) override; int append_list_item_select( List *select, spider_string *str, @@ -1526,7 +1477,7 @@ bool use_fields, spider_fields *fields, ulong sql_type - ); + ) override; int append_group_by( ORDER *order, spider_string *str, @@ -1542,7 +1493,7 @@ bool use_fields, spider_fields *fields, ulong sql_type - ); + ) override; int append_order_by( ORDER *order, spider_string *str, @@ -1555,12 +1506,12 @@ st_select_lex *select_lex, longlong select_limit, longlong offset_limit - ); + ) override; bool check_direct_delete( st_select_lex *select_lex, longlong select_limit, longlong offset_limit - ); + ) override; }; class spider_mysql_handler: public spider_mbase_handler @@ -1593,49 +1544,49 @@ spider_mbase_share *db_share ); virtual ~spider_mbase_copy_table(); - int init(); + int init() override; void set_sql_charset( CHARSET_INFO *cs - ); - int append_select_str(); + ) override; + int append_select_str() override; int append_insert_str( int insert_flg - ); + ) override; int append_table_columns( TABLE_SHARE *table_share - ); - int append_from_str(); + ) override; + int append_from_str() override; int append_table_name( int link_idx - ); - void set_sql_pos(); - void set_sql_to_pos(); + ) override; + void set_sql_pos() override; + void set_sql_to_pos() override; int append_copy_where( spider_db_copy_table *source_ct, KEY *key_info, ulong *last_row_pos, ulong *last_lengths - ); + ) override; int append_key_order_str( KEY *key_info, int start_pos, bool desc_flg - ); + ) override; int append_limit( longlong offset, longlong limit - ); - int append_into_str(); - int append_open_paren_str(); - int append_values_str(); + ) override; + int append_into_str() override; + int append_open_paren_str() override; + int append_values_str() override; int append_select_lock_str( int lock_mode - ); + ) override; int exec_query( SPIDER_CONN *conn, int quick_mode, int *need_mon - ); + ) override; int copy_key_row( spider_db_copy_table *source_ct, Field *field, @@ -1653,15 +1604,15 @@ SPIDER_DB_ROW *row, ulong **last_row_pos, ulong **last_lengths - ); + ) override; int copy_rows( TABLE *table, SPIDER_DB_ROW *row - ); - int append_insert_terminator(); + ) override; + int append_insert_terminator() override; int copy_insert_values( spider_db_copy_table *source_ct - ); + ) override; }; class spider_mysql_copy_table: public spider_mbase_copy_table diff -Nru mariadb-10.11.6/storage/spider/spd_direct_sql.cc mariadb-10.11.9/storage/spider/spd_direct_sql.cc --- mariadb-10.11.6/storage/spider/spd_direct_sql.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_direct_sql.cc 2024-08-03 07:29:59.000000000 +0000 @@ -109,7 +109,7 @@ break; } if (!(direct_sql->db_names = (char**) - spider_bulk_malloc(spider_current_trx, 31, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_TABLE_LIST_2, MYF(MY_WME | MY_ZEROFILL), &direct_sql->db_names, (uint) (sizeof(char*) * table_count), &direct_sql->table_names, (uint) (sizeof(char*) * table_count), &direct_sql->tables, (uint) (sizeof(TABLE*) * table_count), @@ -218,27 +218,27 @@ tables_on_different_db_are_joinable(); direct_sql->conn_key_length = 1 - + direct_sql->tgt_wrapper_length + 1 - + direct_sql->tgt_host_length + 1 - + 5 + 1 - + direct_sql->tgt_socket_length + 1 - + (tables_on_different_db_are_joinable ? - 0 : direct_sql->tgt_default_db_name_length + 1) - + direct_sql->tgt_username_length + 1 - + direct_sql->tgt_password_length + 1 - + direct_sql->tgt_ssl_ca_length + 1 - + direct_sql->tgt_ssl_capath_length + 1 - + direct_sql->tgt_ssl_cert_length + 1 - + direct_sql->tgt_ssl_cipher_length + 1 - + direct_sql->tgt_ssl_key_length + 1 - + 1 + 1 - + direct_sql->tgt_default_file_length + 1 - + direct_sql->tgt_default_group_length + 1 - + direct_sql->tgt_dsn_length + 1 - + direct_sql->tgt_filedsn_length + 1 - + direct_sql->tgt_driver_length; + + (direct_sql->tgt_wrapper ? direct_sql->tgt_wrapper_length + 2 : 0) + + (direct_sql->tgt_host ? direct_sql->tgt_host_length + 2 : 0) + + 5 + 2 + + (direct_sql->tgt_socket ? direct_sql->tgt_socket_length + 2 : 0) + + (!tables_on_different_db_are_joinable && direct_sql->tgt_default_db_name ? + direct_sql->tgt_default_db_name_length + 2 : 0) + + (direct_sql->tgt_username ? direct_sql->tgt_username_length + 2 : 0) + + (direct_sql->tgt_password ? direct_sql->tgt_password_length + 2 : 0) + + (direct_sql->tgt_ssl_ca ? direct_sql->tgt_ssl_ca_length + 2 : 0) + + (direct_sql->tgt_ssl_capath ? direct_sql->tgt_ssl_capath_length + 2 : 0) + + (direct_sql->tgt_ssl_cert ? direct_sql->tgt_ssl_cert_length + 2 : 0) + + (direct_sql->tgt_ssl_cipher ? direct_sql->tgt_ssl_cipher_length + 2 : 0) + + (direct_sql->tgt_ssl_key ? direct_sql->tgt_ssl_key_length + 2 : 0) + + 1 + 2 + + (direct_sql->tgt_default_file ? direct_sql->tgt_default_file_length + 2 : 0) + + (direct_sql->tgt_default_group ? direct_sql->tgt_default_group_length + 2 : 0) + + (direct_sql->tgt_dsn ? direct_sql->tgt_dsn_length + 2 : 0) + + (direct_sql->tgt_filedsn ? direct_sql->tgt_filedsn_length + 2 : 0) + + (direct_sql->tgt_driver ? direct_sql->tgt_driver_length + 2 : 0); if (!(direct_sql->conn_key = (char *) - spider_malloc(spider_current_trx, 9, direct_sql->conn_key_length + 1, + spider_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_KEY_1, direct_sql->conn_key_length + 1, MYF(MY_WME | MY_ZEROFILL))) ) DBUG_RETURN(HA_ERR_OUT_OF_MEM); @@ -246,124 +246,60 @@ *direct_sql->conn_key = '0' + 48 - direct_sql->connection_channel; else *direct_sql->conn_key = '0' + direct_sql->connection_channel; - DBUG_PRINT("info",("spider tgt_wrapper=%s", direct_sql->tgt_wrapper)); - tmp_name = strmov(direct_sql->conn_key + 1, direct_sql->tgt_wrapper); - if (direct_sql->tgt_host) - { - DBUG_PRINT("info",("spider tgt_host=%s", direct_sql->tgt_host)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_host); - } else { - DBUG_PRINT("info",("spider tgt_host=NULL")); - tmp_name++; - } + int counter= 0; + tmp_name= direct_sql->conn_key + 1; + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_wrapper); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_host); my_sprintf(port_str, (port_str, "%05ld", direct_sql->tgt_port)); - DBUG_PRINT("info",("spider port_str=%s", port_str)); - tmp_name = strmov(tmp_name + 1, port_str); - if (direct_sql->tgt_socket) - { - DBUG_PRINT("info",("spider tgt_socket=%s", direct_sql->tgt_socket)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_socket); - } - else + spider_create_conn_key_add_one(&counter, &tmp_name, port_str); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_socket); + counter++; + if (!tables_on_different_db_are_joinable && direct_sql->tgt_default_db_name) { + *tmp_name= (char) counter; + tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_db_name); tmp_name++; } - if (!tables_on_different_db_are_joinable) - { - if (direct_sql->tgt_default_db_name) - { - DBUG_PRINT("info",("spider tgt_default_db_name=%s", - direct_sql->tgt_default_db_name)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_db_name); - } else - tmp_name++; - } - if (direct_sql->tgt_username) - { - DBUG_PRINT("info",("spider tgt_username=%s", direct_sql->tgt_username)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_username); - } else - tmp_name++; - if (direct_sql->tgt_password) - { - DBUG_PRINT("info",("spider tgt_password=%s", direct_sql->tgt_password)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_password); - } else - tmp_name++; - if (direct_sql->tgt_ssl_ca) - { - DBUG_PRINT("info",("spider tgt_ssl_ca=%s", direct_sql->tgt_ssl_ca)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_ca); - } else - tmp_name++; - if (direct_sql->tgt_ssl_capath) - { - DBUG_PRINT("info",("spider tgt_ssl_capath=%s", - direct_sql->tgt_ssl_capath)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_capath); - } else - tmp_name++; - if (direct_sql->tgt_ssl_cert) - { - DBUG_PRINT("info",("spider tgt_ssl_cert=%s", direct_sql->tgt_ssl_cert)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_cert); - } else - tmp_name++; - if (direct_sql->tgt_ssl_cipher) - { - DBUG_PRINT("info",("spider tgt_ssl_cipher=%s", - direct_sql->tgt_ssl_cipher)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_cipher); - } else - tmp_name++; - if (direct_sql->tgt_ssl_key) - { - DBUG_PRINT("info",("spider tgt_ssl_key=%s", direct_sql->tgt_ssl_key)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_ssl_key); - } else - tmp_name++; - tmp_name++; - *tmp_name = '0' + ((char) direct_sql->tgt_ssl_vsc); - if (direct_sql->tgt_default_file) - { - DBUG_PRINT("info",("spider tgt_default_file=%s", - direct_sql->tgt_default_file)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_file); - } else - tmp_name++; - if (direct_sql->tgt_default_group) - { - DBUG_PRINT("info",("spider tgt_default_group=%s", - direct_sql->tgt_default_group)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_default_group); - } else - tmp_name++; - if (direct_sql->tgt_dsn) - { - DBUG_PRINT("info",("spider tgt_dsn=%s", - direct_sql->tgt_dsn)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_dsn); - } else - tmp_name++; - if (direct_sql->tgt_filedsn) - { - DBUG_PRINT("info",("spider tgt_filedsn=%s", - direct_sql->tgt_filedsn)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_filedsn); - } else - tmp_name++; - if (direct_sql->tgt_driver) - { - DBUG_PRINT("info",("spider tgt_driver=%s", - direct_sql->tgt_driver)); - tmp_name = strmov(tmp_name + 1, direct_sql->tgt_driver); - } else - tmp_name++; + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_username); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_password); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_ca); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_capath); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_cert); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_cipher); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_ssl_key); + counter++; + *tmp_name= (char) counter; + tmp_name++; + *tmp_name = '0' + ((char) direct_sql->tgt_ssl_vsc); + tmp_name++; + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_default_file); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_default_group); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_dsn); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_filedsn); + spider_create_conn_key_add_one(&counter, &tmp_name, direct_sql->tgt_driver); + tmp_name++; direct_sql->conn_key_hash_value = my_calc_hash(&spider_open_connections, (uchar*) direct_sql->conn_key, direct_sql->conn_key_length); DBUG_RETURN(0); } +static inline void spider_maybe_memcpy_string( + char **dest, + char *src, + char *tmp, + uint *dest_len, + uint src_len) +{ + *dest_len= src_len; + if (src) + { + *dest= tmp; + memcpy(*dest, src, src_len); + } else + *dest= NULL; +} + + SPIDER_CONN *spider_udf_direct_sql_create_conn( const SPIDER_DIRECT_SQL *direct_sql, int *error_num @@ -389,7 +325,7 @@ spider_dbton[direct_sql->dbton_id].db_util-> tables_on_different_db_are_joinable(); if (!(conn = (SPIDER_CONN *) - spider_bulk_malloc(spider_current_trx, 32, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_1, MYF(MY_WME | MY_ZEROFILL), &conn, (uint) (sizeof(*conn)), &tmp_name, (uint) (direct_sql->conn_key_length + 1), &tmp_host, (uint) (direct_sql->tgt_host_length + 1), @@ -420,118 +356,61 @@ *error_num = HA_ERR_OUT_OF_MEM; goto error_alloc_conn; } - conn->default_database.init_calc_mem(138); + conn->default_database.init_calc_mem(SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_2); conn->conn_key_length = direct_sql->conn_key_length; conn->conn_key = tmp_name; memcpy(conn->conn_key, direct_sql->conn_key, direct_sql->conn_key_length); - conn->tgt_wrapper_length = direct_sql->tgt_wrapper_length; - conn->tgt_wrapper = tmp_wrapper; - memcpy(conn->tgt_wrapper, direct_sql->tgt_wrapper, - direct_sql->tgt_wrapper_length); - conn->tgt_host_length = direct_sql->tgt_host_length; - conn->tgt_host = tmp_host; - memcpy(conn->tgt_host, direct_sql->tgt_host, direct_sql->tgt_host_length); + spider_maybe_memcpy_string( + &conn->tgt_wrapper, direct_sql->tgt_wrapper, tmp_wrapper, + &conn->tgt_wrapper_length, direct_sql->tgt_wrapper_length); + spider_maybe_memcpy_string( + &conn->tgt_host, direct_sql->tgt_host, tmp_host, + &conn->tgt_host_length, direct_sql->tgt_host_length); conn->tgt_port = direct_sql->tgt_port; - conn->tgt_socket_length = direct_sql->tgt_socket_length; - conn->tgt_socket = tmp_socket; - memcpy(conn->tgt_socket, direct_sql->tgt_socket, - direct_sql->tgt_socket_length); + spider_maybe_memcpy_string( + &conn->tgt_socket, direct_sql->tgt_socket, tmp_socket, + &conn->tgt_socket_length, direct_sql->tgt_socket_length); if (!tables_on_different_db_are_joinable) - { - conn->tgt_db_length = direct_sql->tgt_default_db_name_length; - conn->tgt_db = tmp_db; - memcpy(conn->tgt_db, direct_sql->tgt_default_db_name, - direct_sql->tgt_default_db_name_length); - } - conn->tgt_username_length = direct_sql->tgt_username_length; - conn->tgt_username = tmp_username; - memcpy(conn->tgt_username, direct_sql->tgt_username, - direct_sql->tgt_username_length); - conn->tgt_password_length = direct_sql->tgt_password_length; - conn->tgt_password = tmp_password; - memcpy(conn->tgt_password, direct_sql->tgt_password, - direct_sql->tgt_password_length); - conn->tgt_ssl_ca_length = direct_sql->tgt_ssl_ca_length; - if (conn->tgt_ssl_ca_length) - { - conn->tgt_ssl_ca = tmp_ssl_ca; - memcpy(conn->tgt_ssl_ca, direct_sql->tgt_ssl_ca, - direct_sql->tgt_ssl_ca_length); - } else - conn->tgt_ssl_ca = NULL; - conn->tgt_ssl_capath_length = direct_sql->tgt_ssl_capath_length; - if (conn->tgt_ssl_capath_length) - { - conn->tgt_ssl_capath = tmp_ssl_capath; - memcpy(conn->tgt_ssl_capath, direct_sql->tgt_ssl_capath, - direct_sql->tgt_ssl_capath_length); - } else - conn->tgt_ssl_capath = NULL; - conn->tgt_ssl_cert_length = direct_sql->tgt_ssl_cert_length; - if (conn->tgt_ssl_cert_length) - { - conn->tgt_ssl_cert = tmp_ssl_cert; - memcpy(conn->tgt_ssl_cert, direct_sql->tgt_ssl_cert, - direct_sql->tgt_ssl_cert_length); - } else - conn->tgt_ssl_cert = NULL; - conn->tgt_ssl_cipher_length = direct_sql->tgt_ssl_cipher_length; - if (conn->tgt_ssl_cipher_length) - { - conn->tgt_ssl_cipher = tmp_ssl_cipher; - memcpy(conn->tgt_ssl_cipher, direct_sql->tgt_ssl_cipher, - direct_sql->tgt_ssl_cipher_length); - } else - conn->tgt_ssl_cipher = NULL; - conn->tgt_ssl_key_length = direct_sql->tgt_ssl_key_length; - if (conn->tgt_ssl_key_length) - { - conn->tgt_ssl_key = tmp_ssl_key; - memcpy(conn->tgt_ssl_key, direct_sql->tgt_ssl_key, - direct_sql->tgt_ssl_key_length); - } else - conn->tgt_ssl_key = NULL; - conn->tgt_default_file_length = direct_sql->tgt_default_file_length; - if (conn->tgt_default_file_length) - { - conn->tgt_default_file = tmp_default_file; - memcpy(conn->tgt_default_file, direct_sql->tgt_default_file, - direct_sql->tgt_default_file_length); - } else - conn->tgt_default_file = NULL; - conn->tgt_default_group_length = direct_sql->tgt_default_group_length; - if (conn->tgt_default_group_length) - { - conn->tgt_default_group = tmp_default_group; - memcpy(conn->tgt_default_group, direct_sql->tgt_default_group, - direct_sql->tgt_default_group_length); - } else - conn->tgt_default_group = NULL; - conn->tgt_dsn_length = direct_sql->tgt_dsn_length; - if (conn->tgt_dsn_length) - { - conn->tgt_dsn = tmp_dsn; - memcpy(conn->tgt_dsn, direct_sql->tgt_dsn, - direct_sql->tgt_dsn_length); - } else - conn->tgt_dsn = NULL; - conn->tgt_filedsn_length = direct_sql->tgt_filedsn_length; - if (conn->tgt_filedsn_length) - { - conn->tgt_filedsn = tmp_filedsn; - memcpy(conn->tgt_filedsn, direct_sql->tgt_filedsn, - direct_sql->tgt_filedsn_length); - } else - conn->tgt_filedsn = NULL; - conn->tgt_driver_length = direct_sql->tgt_driver_length; - if (conn->tgt_driver_length) - { - conn->tgt_driver = tmp_driver; - memcpy(conn->tgt_driver, direct_sql->tgt_driver, - direct_sql->tgt_driver_length); - } else - conn->tgt_driver = NULL; + spider_maybe_memcpy_string( + &conn->tgt_db, direct_sql->tgt_default_db_name, tmp_db, + &conn->tgt_db_length, direct_sql->tgt_default_db_name_length); + spider_maybe_memcpy_string( + &conn->tgt_username, direct_sql->tgt_username, tmp_username, + &conn->tgt_username_length, direct_sql->tgt_username_length); + spider_maybe_memcpy_string( + &conn->tgt_password, direct_sql->tgt_password, tmp_password, + &conn->tgt_password_length, direct_sql->tgt_password_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_ca, direct_sql->tgt_ssl_ca, tmp_ssl_ca, + &conn->tgt_ssl_ca_length, direct_sql->tgt_ssl_ca_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_capath, direct_sql->tgt_ssl_capath, tmp_ssl_capath, + &conn->tgt_ssl_capath_length, direct_sql->tgt_ssl_capath_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_cert, direct_sql->tgt_ssl_cert, tmp_ssl_cert, + &conn->tgt_ssl_cert_length, direct_sql->tgt_ssl_cert_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_cipher, direct_sql->tgt_ssl_cipher, tmp_ssl_cipher, + &conn->tgt_ssl_cipher_length, direct_sql->tgt_ssl_cipher_length); + spider_maybe_memcpy_string( + &conn->tgt_ssl_key, direct_sql->tgt_ssl_key, tmp_ssl_key, + &conn->tgt_ssl_key_length, direct_sql->tgt_ssl_key_length); + spider_maybe_memcpy_string( + &conn->tgt_default_file, direct_sql->tgt_default_file, tmp_default_file, + &conn->tgt_default_file_length, direct_sql->tgt_default_file_length); + spider_maybe_memcpy_string( + &conn->tgt_default_group, direct_sql->tgt_default_group, tmp_default_group, + &conn->tgt_default_group_length, direct_sql->tgt_default_group_length); + spider_maybe_memcpy_string( + &conn->tgt_dsn, direct_sql->tgt_dsn, tmp_dsn, + &conn->tgt_dsn_length, direct_sql->tgt_dsn_length); + spider_maybe_memcpy_string( + &conn->tgt_filedsn, direct_sql->tgt_filedsn, tmp_filedsn, + &conn->tgt_filedsn_length, direct_sql->tgt_filedsn_length); + spider_maybe_memcpy_string( + &conn->tgt_driver, direct_sql->tgt_driver, tmp_driver, + &conn->tgt_driver_length, direct_sql->tgt_driver_length); conn->tgt_ssl_vsc = direct_sql->tgt_ssl_vsc; conn->dbton_id = direct_sql->dbton_id; conn->conn_need_mon = need_mon; @@ -1206,7 +1085,7 @@ direct_sql->tgt_default_db_name_length = SPIDER_THD_db_length(trx->thd); if ( !(direct_sql->tgt_default_db_name = spider_create_string( - SPIDER_THD_db_str(trx->thd), + trx->thd->get_db(), direct_sql->tgt_default_db_name_length)) ) { my_error(ER_OUT_OF_RESOURCES, MYF(0), HA_ERR_OUT_OF_MEM); @@ -1439,7 +1318,7 @@ DBUG_ENTER("spider_direct_sql_body"); SPIDER_BACKUP_DASTATUS; if (!(direct_sql = (SPIDER_DIRECT_SQL *) - spider_bulk_malloc(spider_current_trx, 34, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_DIRECT_SQL_BODY_1, MYF(MY_WME | MY_ZEROFILL), &direct_sql, (uint) (sizeof(SPIDER_DIRECT_SQL)), &sql, (uint) (sizeof(char) * args->lengths[0]), NullS)) @@ -1658,6 +1537,11 @@ ) { SPIDER_BG_DIRECT_SQL *bg_direct_sql; DBUG_ENTER("spider_direct_sql_init_body"); + if (!spider_hton_ptr) + { + strcpy(message, "Plugin 'SPIDER' is not loaded"); + goto error; + } if (args->arg_count != 3) { strcpy(message, "spider_(bg)_direct_sql() requires 3 arguments"); @@ -1674,7 +1558,7 @@ if (bg) { if (!(bg_direct_sql = (SPIDER_BG_DIRECT_SQL *) - spider_malloc(spider_current_trx, 10, sizeof(SPIDER_BG_DIRECT_SQL), + spider_malloc(spider_current_trx, SPD_MID_DIRECT_SQL_INIT_BODY_1, sizeof(SPIDER_BG_DIRECT_SQL), MYF(MY_WME | MY_ZEROFILL))) ) { strcpy(message, "spider_bg_direct_sql() out of memory"); diff -Nru mariadb-10.11.6/storage/spider/spd_err.h mariadb-10.11.9/storage/spider/spd_err.h --- mariadb-10.11.6/storage/spider/spd_err.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_err.h 2024-08-03 07:29:59.000000000 +0000 @@ -80,13 +80,13 @@ #define ER_SPIDER_XA_PREPARED_NUM 12604 #define ER_SPIDER_XA_PREPARED_STR "This xid is prepared" #define ER_SPIDER_XA_EXISTS_NUM 12605 -#define ER_SPIDER_XA_EXISTS_STR "This xid is already exist" +#define ER_SPIDER_XA_EXISTS_STR "This xid already exists" #define ER_SPIDER_XA_MEMBER_EXISTS_NUM 12606 -#define ER_SPIDER_XA_MEMBER_EXISTS_STR "This xid member is already exist" +#define ER_SPIDER_XA_MEMBER_EXISTS_STR "This xid member already exists" #define ER_SPIDER_XA_NOT_EXISTS_NUM 12607 -#define ER_SPIDER_XA_NOT_EXISTS_STR "This xid is not exist" +#define ER_SPIDER_XA_NOT_EXISTS_STR "This xid does not exist" #define ER_SPIDER_XA_MEMBER_NOT_EXISTS_NUM 12608 -#define ER_SPIDER_XA_MEMBER_NOT_EXISTS_STR "This xid member is not exist" +#define ER_SPIDER_XA_MEMBER_NOT_EXISTS_STR "This xid member does not exist" #define ER_SPIDER_SYS_TABLE_VERSION_NUM 12609 #define ER_SPIDER_SYS_TABLE_VERSION_STR "System table %s is different version" #define ER_SPIDER_WRONG_CHARACTER_IN_NAME_NUM 12611 diff -Nru mariadb-10.11.6/storage/spider/spd_group_by_handler.cc mariadb-10.11.9/storage/spider/spd_group_by_handler.cc --- mariadb-10.11.6/storage/spider/spd_group_by_handler.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_group_by_handler.cc 2024-08-03 07:29:59.000000000 +0000 @@ -22,6 +22,7 @@ #include "probes_mysql.h" #include "sql_class.h" #include "sql_partition.h" +#include "sql_select.h" #include "ha_partition.h" #include "sql_common.h" #include @@ -42,11 +43,9 @@ spider_fields::spider_fields() : dbton_count(0), current_dbton_num(0), - table_count(0), current_table_num(0), table_holder(NULL), + table_count(0), table_holder(NULL), first_link_idx_chain(NULL), last_link_idx_chain(NULL), current_link_idx_chain(NULL), - first_conn_holder(NULL), last_conn_holder(NULL), current_conn_holder(NULL), - first_field_holder(NULL), last_field_holder(NULL), current_field_holder(NULL), - first_field_chain(NULL), last_field_chain(NULL), current_field_chain(NULL) + first_conn_holder(NULL), last_conn_holder(NULL), current_conn_holder(NULL) { DBUG_ENTER("spider_fields::spider_fields"); DBUG_PRINT("info",("spider this=%p", this)); @@ -65,24 +64,6 @@ spider_free(spider_current_trx, current_link_idx_chain, MYF(0)); } } - if (first_field_chain) - { - while ((current_field_chain = first_field_chain)) - { - first_field_chain = current_field_chain->next; - spider_free(spider_current_trx, current_field_chain, MYF(0)); - } - } - if (first_field_holder) - { - while ((current_field_holder = first_field_holder)) - { - first_field_holder = current_field_holder->next; - spider_free(spider_current_trx, current_field_holder, MYF(0)); - } - } - if (table_holder) - spider_free(spider_current_trx, table_holder, MYF(0)); if (first_conn_holder) { while ((current_conn_holder = first_conn_holder)) @@ -364,7 +345,7 @@ DBUG_ENTER("spider_fields::create_link_idx_chain"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN((SPIDER_LINK_IDX_CHAIN *) - spider_malloc(spider_current_trx, 254, sizeof(SPIDER_LINK_IDX_CHAIN), + spider_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_LINK_IDX_CHAIN_1, sizeof(SPIDER_LINK_IDX_CHAIN), MYF(MY_WME | MY_ZEROFILL))); } @@ -471,7 +452,6 @@ void spider_fields::set_first_link_idx( ) { - SPIDER_TABLE_HOLDER *table_holder; SPIDER_LINK_IDX_HOLDER *link_idx_holder; SPIDER_LINK_IDX_CHAIN *link_idx_chain; uint dbton_id; @@ -493,11 +473,10 @@ DBUG_ASSERT(link_idx_chain); set_pos_to_first_table_on_link_idx_chain(link_idx_chain); - set_pos_to_first_table_holder(); - while ((table_holder = get_next_table_holder())) + for (uint i= 0; i < table_count; i++) { link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain); - spider = table_holder->spider; + spider = table_holder[i].spider; dbton_hdl = spider->dbton_handler[dbton_id]; dbton_hdl->first_link_idx = link_idx_holder->link_idx; } @@ -554,7 +533,7 @@ DBUG_ENTER("spider_fields::create_link_idx_holder"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_RETURN((SPIDER_LINK_IDX_HOLDER *) - spider_malloc(spider_current_trx, 253, sizeof(SPIDER_LINK_IDX_HOLDER), + spider_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_LINK_IDX_HOLDER_1, sizeof(SPIDER_LINK_IDX_HOLDER), MYF(MY_WME | MY_ZEROFILL))); } @@ -632,7 +611,7 @@ DBUG_ENTER("spider_fields::create_conn_holder"); DBUG_PRINT("info",("spider this=%p", this)); return_conn_holder = (SPIDER_CONN_HOLDER *) - spider_bulk_malloc(spider_current_trx, 252, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_FIELDS_CREATE_CONN_HOLDER_1, MYF(MY_WME | MY_ZEROFILL), &return_conn_holder, (uint) (sizeof(SPIDER_CONN_HOLDER)), &table_link_idx_holder, (uint) (table_count * sizeof(SPIDER_TABLE_LINK_IDX_HOLDER)), @@ -646,24 +625,6 @@ DBUG_RETURN(return_conn_holder); } -void spider_fields::set_pos_to_first_conn_holder( -) { - DBUG_ENTER("spider_fields::set_pos_to_first_conn_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - current_conn_holder = first_conn_holder; - DBUG_VOID_RETURN; -} - -SPIDER_CONN_HOLDER *spider_fields::get_next_conn_holder( -) { - SPIDER_CONN_HOLDER *return_conn_holder = current_conn_holder; - DBUG_ENTER("spider_fields::get_next_conn_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - if (current_conn_holder) - current_conn_holder = current_conn_holder->next; - DBUG_RETURN(return_conn_holder); -} - bool spider_fields::has_conn_holder( ) { DBUG_ENTER("spider_fields::has_conn_holder"); @@ -862,19 +823,17 @@ DBUG_VOID_RETURN; } -SPIDER_TABLE_HOLDER *spider_fields::add_table( - ha_spider *spider_arg +/* Add the table associated with an ha_spider to a table_holder. +Return the table_holder. */ +static SPIDER_TABLE_HOLDER *spider_add_table_holder( + ha_spider *spider_arg, + SPIDER_TABLE_HOLDER *table_holder ) { spider_string *str; uint length; char tmp_buf[SPIDER_SQL_INT_LEN + 2]; SPIDER_TABLE_HOLDER *return_table_holder; - SPIDER_FIELD_HOLDER *field_holder; - TABLE *table = spider_arg->get_table(); - Field *field; DBUG_ENTER("spider_fields::add_table"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_PRINT("info",("spider table_count=%u", table_count)); DBUG_PRINT("info",("spider idx_for_direct_join=%u", spider_arg->idx_for_direct_join)); length = my_sprintf(tmp_buf, (tmp_buf, "t%u", @@ -893,90 +852,49 @@ return_table_holder->spider = spider_arg; return_table_holder->alias = str; - set_pos_to_first_field_holder(); - while ((field_holder = get_next_field_holder())) - { - if (!field_holder->spider) - { - field = field_holder->field; - if ( - field->field_index < table->s->fields && - field == table->field[field->field_index] - ) { - field_holder->spider = spider_arg; - field_holder->alias = str; - } - } - } DBUG_RETURN(return_table_holder); } -/** - Verify that all fields in the query are members of tables that are in the - query. - - @return TRUE All fields in the query are members of tables - that are in the query. - FALSE At least one field in the query is not a - member of a table that is in the query. -*/ - -bool spider_fields::all_query_fields_are_query_table_members() +/* Return the table that field belongs to, or NULL if none exists. */ +SPIDER_TABLE_HOLDER *spider_fields::find_table(Field *field) { - SPIDER_FIELD_HOLDER *field_holder; - DBUG_ENTER("spider_fields::all_query_fields_are_query_table_members"); - DBUG_PRINT("info",("spider this=%p", this)); - - set_pos_to_first_field_holder(); - while ((field_holder = get_next_field_holder())) - { - if (!field_holder->spider) - { - DBUG_PRINT("info", ("spider field is not a member of a query table")); - DBUG_RETURN(FALSE); - } - } + for (uint i = 0; i < table_count; i++) + if (field->table == table_holder[i].table) + return &table_holder[i]; + return NULL; +} - DBUG_RETURN(TRUE); +void spider_fields::set_table_holder(SPIDER_TABLE_HOLDER *table_holder_arg, + uint table_count_arg) +{ + table_holder= table_holder_arg; + table_count= table_count_arg; } -int spider_fields::create_table_holder( +/* Allocate space for table_count_arg table holders. */ +static SPIDER_TABLE_HOLDER *spider_create_table_holder( uint table_count_arg ) { - DBUG_ENTER("spider_fields::create_table_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_ASSERT(!table_holder); + SPIDER_TABLE_HOLDER* table_holder; + DBUG_ENTER("spider_create_table_holder"); + if (table_count_arg == 0) + DBUG_RETURN(0); table_holder = (SPIDER_TABLE_HOLDER *) - spider_malloc(spider_current_trx, 249, + spider_malloc(spider_current_trx, SPD_MID_CREATE_TABLE_HOLDER_1, table_count_arg * sizeof(SPIDER_TABLE_HOLDER), MYF(MY_WME | MY_ZEROFILL)); - if (!table_holder) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - table_count = table_count_arg; - current_table_num = 0; - DBUG_RETURN(0); -} - -void spider_fields::set_pos_to_first_table_holder( -) { - DBUG_ENTER("spider_fields::set_pos_to_first_table_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - current_table_num = 0; - DBUG_VOID_RETURN; + DBUG_RETURN(table_holder); } -SPIDER_TABLE_HOLDER *spider_fields::get_next_table_holder( -) { - SPIDER_TABLE_HOLDER *return_table_holder; - DBUG_ENTER("spider_fields::get_next_table_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - if (current_table_num >= table_count) - DBUG_RETURN(NULL); - return_table_holder = &table_holder[current_table_num]; - ++current_table_num; - DBUG_RETURN(return_table_holder); +/* Return pointer to the first table holder. */ +SPIDER_TABLE_HOLDER *spider_fields::get_first_table_holder() +{ + DBUG_ENTER("spider_fields::get_first_spider"); + DBUG_RETURN(table_holder); } +/* Return the first table holder associated with a given table, or +NULL if not found. */ SPIDER_TABLE_HOLDER *spider_fields::get_table_holder(TABLE *table) { uint table_num; @@ -996,117 +914,12 @@ DBUG_RETURN(table_count); } -int spider_fields::add_field( - Field *field_arg -) { - SPIDER_FIELD_HOLDER *field_holder; - SPIDER_FIELD_CHAIN *field_chain; - DBUG_ENTER("spider_fields::add_field"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_PRINT("info",("spider field=%p", field_arg)); - if (!first_field_holder) - { - field_holder = create_field_holder(); - DBUG_PRINT("info",("spider field_holder=%p", field_holder)); - if (!field_holder) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - field_holder->field = field_arg; - first_field_holder = field_holder; - last_field_holder = field_holder; - } else { - field_holder = first_field_holder; - do { - if (field_holder->field == field_arg) - break; - } while ((field_holder = field_holder->next)); - if (!field_holder) - { - field_holder = create_field_holder(); - DBUG_PRINT("info",("spider field_holder=%p", field_holder)); - if (!field_holder) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - field_holder->field = field_arg; - last_field_holder->next = field_holder; - last_field_holder = field_holder; - } - } - field_chain = create_field_chain(); - DBUG_PRINT("info",("spider field_chain=%p", field_chain)); - if (!field_chain) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - field_chain->field_holder = field_holder; - if (!first_field_chain) - { - first_field_chain = field_chain; - last_field_chain = field_chain; - } else { - last_field_chain->next = field_chain; - last_field_chain = field_chain; - } - DBUG_RETURN(0); -} - -SPIDER_FIELD_HOLDER *spider_fields::create_field_holder( -) { - DBUG_ENTER("spider_fields::create_field_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN((SPIDER_FIELD_HOLDER *) - spider_malloc(spider_current_trx, 250, sizeof(SPIDER_FIELD_HOLDER), - MYF(MY_WME | MY_ZEROFILL))); -} - -void spider_fields::set_pos_to_first_field_holder( -) { - DBUG_ENTER("spider_fields::set_pos_to_first_field_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - current_field_holder = first_field_holder; - DBUG_VOID_RETURN; -} - -SPIDER_FIELD_HOLDER *spider_fields::get_next_field_holder( -) { - SPIDER_FIELD_HOLDER *return_field_holder = current_field_holder; - DBUG_ENTER("spider_fields::get_next_field_holder"); - DBUG_PRINT("info",("spider this=%p", this)); - if (current_field_holder) - current_field_holder = current_field_holder->next; - DBUG_RETURN(return_field_holder); -} - -SPIDER_FIELD_CHAIN *spider_fields::create_field_chain( -) { - DBUG_ENTER("spider_fields::create_field_chain"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN((SPIDER_FIELD_CHAIN *) - spider_malloc(spider_current_trx, 251, sizeof(SPIDER_FIELD_CHAIN), - MYF(MY_WME | MY_ZEROFILL))); -} - -void spider_fields::set_pos_to_first_field_chain( -) { - DBUG_ENTER("spider_fields::set_pos_to_first_field_chain"); - DBUG_PRINT("info",("spider this=%p", this)); - current_field_chain = first_field_chain; - DBUG_VOID_RETURN; -} - -SPIDER_FIELD_CHAIN *spider_fields::get_next_field_chain( -) { - SPIDER_FIELD_CHAIN *return_field_chain = current_field_chain; - DBUG_ENTER("spider_fields::get_next_field_chain"); - DBUG_PRINT("info",("spider this=%p", this)); - if (current_field_chain) - current_field_chain = current_field_chain->next; - DBUG_RETURN(return_field_chain); -} - void spider_fields::set_field_ptr( Field **field_arg ) { DBUG_ENTER("spider_fields::set_field_ptr"); DBUG_PRINT("info",("spider this=%p", this)); DBUG_PRINT("info",("spider field_ptr=%p", field_arg)); - first_field_ptr = field_arg; current_field_ptr = field_arg; DBUG_VOID_RETURN; } @@ -1129,15 +942,13 @@ ha_spider *tmp_spider; SPIDER_SHARE *tmp_share; int tmp_link_idx; - SPIDER_TABLE_HOLDER *table_holder; SPIDER_LINK_IDX_HOLDER *link_idx_holder; DBUG_ENTER("spider_fields::ping_table_mon_from_table"); set_pos_to_first_table_on_link_idx_chain(link_idx_chain); - set_pos_to_first_table_holder(); - while ((table_holder = get_next_table_holder())) + for (uint i= 0; i < table_count; i++) { link_idx_holder = get_next_table_on_link_idx_chain(link_idx_chain); - tmp_spider = table_holder->spider; + tmp_spider = table_holder[i].spider; tmp_link_idx = link_idx_holder->link_idx; tmp_share = tmp_spider->share; if (tmp_share->monitoring_kind[tmp_link_idx]) @@ -1173,9 +984,7 @@ query(*query_arg), fields(fields_arg) { DBUG_ENTER("spider_group_by_handler::spider_group_by_handler"); - fields->set_pos_to_first_table_holder(); - SPIDER_TABLE_HOLDER *table_holder = fields->get_next_table_holder(); - spider = table_holder->spider; + spider = fields->get_first_table_holder()->spider; trx = spider->wide_handler->trx; DBUG_VOID_RETURN; } @@ -1183,42 +992,20 @@ spider_group_by_handler::~spider_group_by_handler() { DBUG_ENTER("spider_group_by_handler::~spider_group_by_handler"); + spider_free(spider_current_trx, fields->get_first_table_holder(), MYF(0)); delete fields; DBUG_VOID_RETURN; } -int spider_group_by_handler::init_scan() +static int spider_prepare_init_scan( + const Query& query, spider_fields *fields, ha_spider *spider, + SPIDER_TRX *trx, longlong& offset_limit, THD *thd) { - int error_num, link_idx; - uint dbton_id; - spider_db_handler *dbton_hdl; + SPIDER_RESULT_LIST *result_list = &spider->result_list; st_select_lex *select_lex; - longlong select_limit; - longlong direct_order_limit; + longlong select_limit, direct_order_limit; SPIDER_SHARE *share = spider->share; - SPIDER_CONN *conn; - SPIDER_RESULT_LIST *result_list = &spider->result_list; - SPIDER_LINK_IDX_CHAIN *link_idx_chain; - SPIDER_LINK_IDX_HOLDER *link_idx_holder; - DBUG_ENTER("spider_group_by_handler::init_scan"); - store_error = 0; -#ifndef DBUG_OFF - Field **field; - for ( - field = table->field; - *field; - field++ - ) { - DBUG_PRINT("info",("spider field_name=%s", - SPIDER_field_name_str(*field))); - } -#endif - - if (trx->thd->killed) - { - my_error(ER_QUERY_INTERRUPTED, MYF(0)); - DBUG_RETURN(ER_QUERY_INTERRUPTED); - } + DBUG_ENTER("spider_prepare_init_scan"); spider->use_fields = TRUE; spider->fields = fields; @@ -1264,7 +1051,7 @@ } result_list->semi_split_read_base = 0; result_list->set_split_read = TRUE; - if ((error_num = spider_set_conn_bg_param(spider))) + if (int error_num = spider_set_conn_bg_param(spider)) DBUG_RETURN(error_num); DBUG_PRINT("info",("spider result_list.finish_flg = FALSE")); result_list->finish_flg = FALSE; @@ -1284,86 +1071,87 @@ } else { offset_limit = 0; } + DBUG_RETURN(0); +} + +static int spider_make_query(const Query& query, spider_fields* fields, ha_spider *spider, TABLE *table) +{ + uint dbton_id; + spider_db_handler* dbton_hdl; + SPIDER_RESULT_LIST *result_list = &spider->result_list; + int error_num; + DBUG_ENTER("spider_make_query"); - /* making a query */ fields->set_pos_to_first_dbton_id(); while ((dbton_id = fields->get_next_dbton_id()) < SPIDER_DBTON_SIZE) { dbton_hdl = spider->dbton_handler[dbton_id]; result_list->direct_distinct = query.distinct; - fields->set_pos_to_first_field_chain(); if ((error_num = dbton_hdl->reset_sql(SPIDER_SQL_TYPE_SELECT_SQL))) - { DBUG_RETURN(error_num); - } if ((error_num = dbton_hdl->append_select_part(SPIDER_SQL_TYPE_SELECT_SQL))) - { DBUG_RETURN(error_num); - } fields->set_field_ptr(table->field); if ((error_num = dbton_hdl->append_list_item_select_part( - query.select, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) - { + query.select, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } if ((error_num = dbton_hdl->append_from_and_tables_part( - fields, SPIDER_SQL_TYPE_SELECT_SQL))) - { + fields, SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } if (query.where) { if ((error_num = - dbton_hdl->append_where_part(SPIDER_SQL_TYPE_SELECT_SQL))) - { + dbton_hdl->append_where_part(SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } if ((error_num = dbton_hdl->append_item_type_part( - query.where, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) - { + query.where, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } } if (query.group_by) { if ((error_num = dbton_hdl->append_group_by_part( - query.group_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) - { + query.group_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } } if (query.having) { if ((error_num = - dbton_hdl->append_having_part(SPIDER_SQL_TYPE_SELECT_SQL))) - { + dbton_hdl->append_having_part(SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } if ((error_num = dbton_hdl->append_item_type_part( - query.having, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) - { + query.having, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } } if (query.order_by) { if ((error_num = dbton_hdl->append_order_by_part( - query.order_by, NULL, 0, TRUE, fields, SPIDER_SQL_TYPE_SELECT_SQL))) - { + query.order_by, NULL, 0, TRUE, fields, + SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } } - if ((error_num = dbton_hdl->append_limit_part(result_list->internal_offset, - result_list->limit_num, SPIDER_SQL_TYPE_SELECT_SQL))) - { + if ((error_num = dbton_hdl->append_limit_part( + result_list->internal_offset, result_list->limit_num, + SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } if ((error_num = dbton_hdl->append_select_lock_part( - SPIDER_SQL_TYPE_SELECT_SQL))) - { + SPIDER_SQL_TYPE_SELECT_SQL))) DBUG_RETURN(error_num); - } } + DBUG_RETURN(0); +} + +static int spider_send_query( + spider_fields *fields, ha_spider *spider, SPIDER_TRX *trx, TABLE *table, + int& store_error) +{ + int error_num, link_idx; + spider_db_handler *dbton_hdl; + SPIDER_RESULT_LIST *result_list = &spider->result_list; + SPIDER_SHARE *share = spider->share; + SPIDER_CONN *conn; + SPIDER_LINK_IDX_CHAIN *link_idx_chain; + SPIDER_LINK_IDX_HOLDER *link_idx_holder; + DBUG_ENTER("spider_send_query"); fields->set_pos_to_first_link_idx_chain(); while ((link_idx_chain = fields->get_next_link_idx_chain())) @@ -1382,12 +1170,8 @@ dbton_hdl->first_link_idx, TRUE, FALSE, !fields->is_first_link_ok_chain(link_idx_chain)))) { - if ( - error_num != HA_ERR_END_OF_FILE && - spider->need_mons[link_idx] - ) { + if (error_num != HA_ERR_END_OF_FILE && spider->need_mons[link_idx]) error_num = fields->ping_table_mon_from_table(link_idx_chain); - } if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE) { store_error = HA_ERR_END_OF_FILE; @@ -1395,14 +1179,12 @@ } DBUG_RETURN(error_num); } - } else { + } else + { pthread_mutex_assert_not_owner(&conn->mta_conn_mutex); - if ((error_num = - dbton_hdl->set_sql_for_exec(SPIDER_SQL_TYPE_SELECT_SQL, link_idx, - link_idx_chain))) - { + if ((error_num = dbton_hdl->set_sql_for_exec( + SPIDER_SQL_TYPE_SELECT_SQL, link_idx, link_idx_chain))) DBUG_RETURN(error_num); - } pthread_mutex_lock(&conn->mta_conn_mutex); SPIDER_SET_FILE_POS(&conn->mta_conn_mutex_file_pos); conn->need_mon = &spider->need_mons[link_idx]; @@ -1412,6 +1194,7 @@ conn->mta_conn_mutex_unlock_later = TRUE; if ((error_num = spider_db_set_names(spider, conn, link_idx))) + if ((error_num = spider_db_set_names(spider, conn, link_idx))) { DBUG_ASSERT(conn->mta_conn_mutex_lock_already); DBUG_ASSERT(conn->mta_conn_mutex_unlock_later); @@ -1419,37 +1202,32 @@ conn->mta_conn_mutex_unlock_later = FALSE; SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); - if ( - spider->need_mons[link_idx] - ) { + if (spider->need_mons[link_idx]) error_num = fields->ping_table_mon_from_table(link_idx_chain); - } - if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE) + if ((error_num = spider->check_error_mode_eof(error_num)) == + HA_ERR_END_OF_FILE) { store_error = HA_ERR_END_OF_FILE; error_num = 0; } DBUG_RETURN(error_num); } - spider_conn_set_timeout_from_share(conn, link_idx, - trx->thd, share); + spider_conn_set_timeout_from_share(conn, link_idx, trx->thd, share); if (dbton_hdl->execute_sql( SPIDER_SQL_TYPE_SELECT_SQL, conn, spider->result_list.quick_mode, - &spider->need_mons[link_idx]) - ) { + &spider->need_mons[link_idx])) + { DBUG_ASSERT(conn->mta_conn_mutex_lock_already); DBUG_ASSERT(conn->mta_conn_mutex_unlock_later); conn->mta_conn_mutex_lock_already = FALSE; conn->mta_conn_mutex_unlock_later = FALSE; error_num = spider_db_errorno(conn); - if ( - spider->need_mons[link_idx] - ) { + if (spider->need_mons[link_idx]) error_num = fields->ping_table_mon_from_table(link_idx_chain); - } - if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE) + if ((error_num = spider->check_error_mode_eof(error_num)) == + HA_ERR_END_OF_FILE) { store_error = HA_ERR_END_OF_FILE; error_num = 0; @@ -1465,13 +1243,10 @@ { if ((error_num = spider_db_store_result(spider, link_idx, table))) { - if ( - error_num != HA_ERR_END_OF_FILE && - spider->need_mons[link_idx] - ) { + if (error_num != HA_ERR_END_OF_FILE && spider->need_mons[link_idx]) error_num = fields->ping_table_mon_from_table(link_idx_chain); - } - if ((error_num = spider->check_error_mode_eof(error_num)) == HA_ERR_END_OF_FILE) + if ((error_num = spider->check_error_mode_eof(error_num)) == + HA_ERR_END_OF_FILE) { store_error = HA_ERR_END_OF_FILE; error_num = 0; @@ -1480,13 +1255,45 @@ } spider->result_link_idx = link_idx; spider->result_link_idx_chain = link_idx_chain; - } else { + } else + { spider_db_discard_result(spider, link_idx, conn); SPIDER_CLEAR_FILE_POS(&conn->mta_conn_mutex_file_pos); pthread_mutex_unlock(&conn->mta_conn_mutex); } } } + DBUG_RETURN(0); +} + +/* + Prepare and send query to data nodes and store the query results. +*/ +int spider_group_by_handler::init_scan() +{ + int error_num; + DBUG_ENTER("spider_group_by_handler::init_scan"); + store_error = 0; +#ifndef DBUG_OFF + for (Field **field = table->field; *field; field++) + DBUG_PRINT("info",("spider field_name=%s", SPIDER_field_name_str(*field))); +#endif + + if (trx->thd->killed) + { + my_error(ER_QUERY_INTERRUPTED, MYF(0)); + DBUG_RETURN(ER_QUERY_INTERRUPTED); + } + + if ((error_num = spider_prepare_init_scan( + query, fields, spider, trx, offset_limit, thd))) + DBUG_RETURN(error_num); + + if ((error_num = spider_make_query(query, fields, spider, table))) + DBUG_RETURN(error_num); + + if ((error_num = spider_send_query(fields, spider, trx, table, store_error))) + DBUG_RETURN(error_num); first = TRUE; DBUG_RETURN(0); @@ -1595,7 +1402,8 @@ bool keep_going; bool find_dbton = FALSE; spider_fields *fields = NULL, *fields_arg = NULL; - uint table_idx, dbton_id; + SPIDER_TABLE_HOLDER *table_holder; + uint table_idx, dbton_id, table_count= 0; long tgt_link_status; DBUG_ENTER("spider_create_group_by_handler"); @@ -1617,8 +1425,7 @@ from = query->from; do { DBUG_PRINT("info",("spider from=%p", from)); - if (from->table->const_table) - continue; + ++table_count; if (from->table->part_info) { DBUG_PRINT("info",("spider partition handler")); @@ -1633,17 +1440,11 @@ } } while ((from = from->next_local)); + if (!(table_holder= spider_create_table_holder(table_count))) + DBUG_RETURN(NULL); + table_idx = 0; from = query->from; - while (from && from->table->const_table) - { - from = from->next_local; - } - if (!from) - { - /* all tables are const_table */ - DBUG_RETURN(NULL); - } if (from->table->part_info) { partition_info *part_info = from->table->part_info; @@ -1657,6 +1458,11 @@ share = spider->share; spider->idx_for_direct_join = table_idx; ++table_idx; + if (!spider_add_table_holder(spider, table_holder)) + { + DBUG_PRINT("info",("spider can not add a table")); + goto skip_free_table_holder; + } memset(dbton_bitmap, 0, spider_bitmap_size(SPIDER_DBTON_SIZE)); for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count) { @@ -1670,8 +1476,6 @@ } while ((from = from->next_local)) { - if (from->table->const_table) - continue; if (from->table->part_info) { partition_info *part_info = from->table->part_info; @@ -1685,6 +1489,11 @@ share = spider->share; spider->idx_for_direct_join = table_idx; ++table_idx; + if (!spider_add_table_holder(spider, table_holder)) + { + DBUG_PRINT("info",("spider can not add a table")); + goto skip_free_table_holder; + } memset(dbton_bitmap_tmp, 0, spider_bitmap_size(SPIDER_DBTON_SIZE)); for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count) { @@ -1705,8 +1514,6 @@ from = query->from; do { - if (from->table->const_table) - continue; if (from->table->part_info) { partition_info *part_info = from->table->part_info; @@ -1734,10 +1541,9 @@ { fields_arg = new spider_fields(); if (!fields_arg) - { - DBUG_RETURN(NULL); - } + goto skip_free_table_holder; } + fields_arg->set_table_holder(table_holder, table_count); keep_going = TRUE; it.init(*query->select); while ((item = it++)) @@ -1844,21 +1650,9 @@ } } if (!find_dbton) - { - DBUG_RETURN(NULL); - } - - if (fields->create_table_holder(table_idx)) - { - delete fields; - DBUG_RETURN(NULL); - } + goto skip_free_table_holder; from = query->from; - while (from->table->const_table) - { - from = from->next_local; - } if (from->table->part_info) { partition_info *part_info = from->table->part_info; @@ -1879,17 +1673,10 @@ } DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str)); DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str)); - if (!fields->add_table(spider)) - { - DBUG_PRINT("info",("spider can not add a table")); - delete fields; - DBUG_RETURN(NULL); - } if (spider->dml_init()) { DBUG_PRINT("info",("spider can not init for dml")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } for ( roop_count = spider_conn_link_idx_next(share->link_statuses, @@ -1909,8 +1696,7 @@ DBUG_PRINT("info",("spider direct_join does not support with lock tables yet")); if (lock_mode) { - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } continue; } @@ -1918,26 +1704,21 @@ share->access_balances[spider->conn_link_idx[roop_count]])) { DBUG_PRINT("info",("spider can not create conn_holder")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count)) { DBUG_PRINT("info",("spider can not create link_idx_holder")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } } if (!fields->has_conn_holder()) { - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } while ((from = from->next_local)) { - if (from->table->const_table) - continue; fields->clear_conn_holder_from_conn(); if (from->table->part_info) @@ -1951,19 +1732,12 @@ spider = (ha_spider *) from->table->file; } share = spider->share; - if (!fields->add_table(spider)) - { - DBUG_PRINT("info",("spider can not add a table")); - delete fields; - DBUG_RETURN(NULL); - } DBUG_PRINT("info",("spider s->db=%s", from->table->s->db.str)); DBUG_PRINT("info",("spider s->table_name=%s", from->table->s->table_name.str)); if (spider->dml_init()) { DBUG_PRINT("info",("spider can not init for dml")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } for ( roop_count = spider_conn_link_idx_next(share->link_statuses, @@ -1982,17 +1756,13 @@ DBUG_PRINT("info",("spider connection %p can not be used for this query with locking", conn)); if (lock_mode) - { - delete fields; - DBUG_RETURN(NULL); - } + goto skip_free_fields; continue; } if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count)) { DBUG_PRINT("info",("spider can not create link_idx_holder")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } } @@ -2001,30 +1771,20 @@ if (lock_mode) { DBUG_PRINT("info",("spider some connections can not be used for this query with locking")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } } if (!fields->has_conn_holder()) { - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } } - if (!fields->all_query_fields_are_query_table_members()) - { - DBUG_PRINT("info", ("spider found a query field that is not a query table member")); - delete fields; - DBUG_RETURN(NULL); - } - fields->check_support_dbton(dbton_bitmap); if (!fields->has_conn_holder()) { DBUG_PRINT("info",("spider all chosen connections can't match dbton_id")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } /* choose a connection */ @@ -2036,16 +1796,14 @@ if (fields->make_link_idx_chain(tgt_link_status)) { DBUG_PRINT("info",("spider can not create link_idx_chain")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } /* choose link_id */ if (fields->check_link_ok_chain()) { DBUG_PRINT("info",("spider do not have link ok status")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } fields->set_first_link_idx(); @@ -2053,8 +1811,7 @@ if (!(group_by_handler = new spider_group_by_handler(thd, query, fields))) { DBUG_PRINT("info",("spider can't create group_by_handler")); - delete fields; - DBUG_RETURN(NULL); + goto skip_free_fields; } query->distinct = FALSE; query->where = NULL; @@ -2062,4 +1819,10 @@ query->having = NULL; query->order_by = NULL; DBUG_RETURN(group_by_handler); + +skip_free_fields: + delete fields; +skip_free_table_holder: + spider_free(spider_current_trx, table_holder, MYF(0)); + DBUG_RETURN(NULL); } diff -Nru mariadb-10.11.6/storage/spider/spd_group_by_handler.h mariadb-10.11.9/storage/spider/spd_group_by_handler.h --- mariadb-10.11.6/storage/spider/spd_group_by_handler.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_group_by_handler.h 2024-08-03 07:29:59.000000000 +0000 @@ -31,9 +31,9 @@ spider_fields *fields_arg ); ~spider_group_by_handler(); - int init_scan(); - int next_row(); - int end_scan(); + int init_scan() override; + int next_row() override; + int end_scan() override; }; group_by_handler *spider_create_group_by_handler( diff -Nru mariadb-10.11.6/storage/spider/spd_i_s.cc mariadb-10.11.9/storage/spider/spd_i_s.cc --- mariadb-10.11.6/storage/spider/spd_i_s.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_i_s.cc 2024-08-03 07:29:59.000000000 +0000 @@ -28,6 +28,7 @@ #include "spd_table.h" extern pthread_mutex_t spider_mem_calc_mutex; +extern handlerton *spider_hton_ptr; extern const char *spider_alloc_func_name[SPIDER_MEM_CALC_LIST_NUM]; extern const char *spider_alloc_file_name[SPIDER_MEM_CALC_LIST_NUM]; @@ -63,6 +64,8 @@ uint roop_count; TABLE *table = tables->table; DBUG_ENTER("spider_i_s_alloc_mem_fill_table"); + if (!spider_hton_ptr) + DBUG_RETURN(0); for (roop_count = 0; roop_count < SPIDER_MEM_CALC_LIST_NUM; roop_count++) { table->field[0]->store(roop_count, TRUE); @@ -177,6 +180,8 @@ SPIDER_DBTON *dbton; TABLE *table = tables->table; DBUG_ENTER("spider_i_s_wrapper_protocols_fill_table"); + if (!spider_hton_ptr) + DBUG_RETURN(0); for (roop_count = 0; roop_count < SPIDER_DBTON_SIZE; roop_count++) { dbton = &spider_dbton[roop_count]; diff -Nru mariadb-10.11.6/storage/spider/spd_include.h mariadb-10.11.9/storage/spider/spd_include.h --- mariadb-10.11.6/storage/spider/spd_include.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_include.h 2024-08-03 07:29:59.000000000 +0000 @@ -168,6 +168,278 @@ #define SPIDER_MEM_CALC_LIST_NUM 314 #define SPIDER_CONN_META_BUF_LEN 64 +/* + IDs for spider mem alloc functions, including + - spider_alloc_calc_mem_init() + - spider_string::init_calc_mem() + - spider_malloc() + - spider_bulk_alloc_mem() + - spider_bulk_malloc() + In the format of + SPD_MID__ +*/ +enum spider_malloc_id { + SPD_MID_CHECK_HS_PK_UPDATE_1, + SPD_MID_COPY_TABLES_BODY_1, + SPD_MID_COPY_TABLES_BODY_2, + SPD_MID_COPY_TABLES_BODY_3, + SPD_MID_COPY_TABLES_BODY_4, + SPD_MID_COPY_TABLES_BODY_5, + SPD_MID_CREATE_CONN_1, + SPD_MID_CREATE_CONN_2, + SPD_MID_CREATE_CONN_3, + SPD_MID_CREATE_CONN_4, + SPD_MID_CREATE_CONN_5, + SPD_MID_CREATE_CONN_6, + SPD_MID_CREATE_CONN_KEYS_1, + SPD_MID_CREATE_CONN_THREAD_1, + SPD_MID_CREATE_LONGLONG_LIST_1, + SPD_MID_CREATE_LONG_LIST_1, + SPD_MID_CREATE_MON_THREADS_1, + SPD_MID_CREATE_MON_THREADS_2, + SPD_MID_CREATE_SHARE_1, + SPD_MID_CREATE_SHARE_2, + SPD_MID_CREATE_SPIDER_OBJECT_FOR_SHARE_1, + SPD_MID_CREATE_SPIDER_OBJECT_FOR_SHARE_2, + SPD_MID_CREATE_STRING_1, + SPD_MID_CREATE_STRING_LIST_1, + SPD_MID_CREATE_TABLE_HOLDER_1, + SPD_MID_CREATE_TABLE_NAME_STRING_1, + SPD_MID_CREATE_TRX_ALTER_TABLE_1, + SPD_MID_CREATE_TRX_HA_1, + SPD_MID_DB_CONN_QUEUE_ACTION_1, + SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_1, + SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_2, + SPD_MID_DB_FETCH_FOR_ITEM_SUM_FUNC_3, + SPD_MID_DB_HANDLERSOCKET_APPEND_REQUEST_KEY_1, + SPD_MID_DB_HANDLERSOCKET_EXEC_QUERY_1, + SPD_MID_DB_HANDLERSOCKET_INIT_1, + SPD_MID_DB_HANDLERSOCKET_RESULT_FETCH_ROW_FROM_TMP_TABLE_1, + SPD_MID_DB_HANDLERSOCKET_RESULT_FETCH_ROW_FROM_TMP_TABLE_2, + SPD_MID_DB_HANDLERSOCKET_ROW_APPEND_ESCAPED_TO_STR_1, + SPD_MID_DB_HANDLERSOCKET_ROW_CLONE_1, + SPD_MID_DB_HANDLERSOCKET_ROW_STORE_TO_FIELD_1, + SPD_MID_DB_HANDLERSOCKET_UTIL_APPEND_COLUMN_VALUE_1, + SPD_MID_DB_HANDLERSOCKET_UTIL_OPEN_ITEM_FUNC_1, + SPD_MID_DB_HANDLERSOCKET_UTIL_OPEN_ITEM_FUNC_2, + SPD_MID_DB_HANDLERSOCKET_UTIL_OPEN_ITEM_FUNC_3, + SPD_MID_DB_HS_STRING_REF_BUFFER_INIT_1, + SPD_MID_DB_HS_STR_BUFFER_ADD_1, + SPD_MID_DB_HS_STR_BUFFER_ADD_2, + SPD_MID_DB_HS_STR_BUFFER_INIT_1, + SPD_MID_DB_INIT_1, + SPD_MID_DB_INIT_10, + SPD_MID_DB_INIT_11, + SPD_MID_DB_INIT_12, + SPD_MID_DB_INIT_2, + SPD_MID_DB_INIT_3, + SPD_MID_DB_INIT_4, + SPD_MID_DB_INIT_5, + SPD_MID_DB_INIT_6, + SPD_MID_DB_INIT_7, + SPD_MID_DB_INIT_8, + SPD_MID_DB_INIT_9, + SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_1, + SPD_MID_DB_MARIADB_UTIL_APPEND_COLUMN_VALUE_2, + SPD_MID_DB_MBASE_EXEC_QUERY_1, + SPD_MID_DB_MBASE_EXEC_QUERY_2, + SPD_MID_DB_MBASE_INIT_1, + SPD_MID_DB_MBASE_INIT_2, + SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_1, + SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_2, + SPD_MID_DB_MBASE_RESULT_FETCH_ROW_FROM_TMP_TABLE_3, + SPD_MID_DB_MBASE_ROW_APPEND_ESCAPED_TO_STR_1, + SPD_MID_DB_MBASE_ROW_CLONE_1, + SPD_MID_DB_MBASE_SET_SQL_MODE_1, + SPD_MID_DB_MBASE_SET_TIME_ZONE_1, + SPD_MID_DB_MBASE_SET_WAIT_TIMEOUT_1, + SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_1, + SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_2, + SPD_MID_DB_MBASE_UTIL_PRINT_ITEM_FUNC_3, + SPD_MID_DB_MBASE_XA_COMMIT_1, + SPD_MID_DB_MBASE_XA_END_1, + SPD_MID_DB_MBASE_XA_PREPARE_1, + SPD_MID_DB_MBASE_XA_ROLLBACK_1, + SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_1, + SPD_MID_DB_MYSQL_UTIL_APPEND_COLUMN_VALUE_2, + SPD_MID_DB_OPEN_ITEM_INT_1, + SPD_MID_DB_OPEN_ITEM_STRING_1, + SPD_MID_DB_ORACLE_EXEC_QUERY_1, + SPD_MID_DB_ORACLE_GET_ERROR_1, + SPD_MID_DB_ORACLE_INIT_1, + SPD_MID_DB_ORACLE_INIT_2, + SPD_MID_DB_ORACLE_RESULT_FETCH_ROW_FROM_TMP_TABLE_1, + SPD_MID_DB_ORACLE_RESULT_FETCH_ROW_FROM_TMP_TABLE_2, + SPD_MID_DB_ORACLE_RESULT_FETCH_ROW_FROM_TMP_TABLE_3, + SPD_MID_DB_ORACLE_ROW_APPEND_ESCAPED_TO_STR_1, + SPD_MID_DB_ORACLE_ROW_INIT_1, + SPD_MID_DB_ORACLE_ROW_INIT_2, + SPD_MID_DB_ORACLE_UTIL_APPEND_COLUMN_VALUE_1, + SPD_MID_DB_ORACLE_UTIL_APPEND_COLUMN_VALUE_2, + SPD_MID_DB_ORACLE_UTIL_OPEN_ITEM_FUNC_1, + SPD_MID_DB_ORACLE_UTIL_OPEN_ITEM_FUNC_2, + SPD_MID_DB_ORACLE_UTIL_OPEN_ITEM_FUNC_3, + SPD_MID_DB_QUERY_1, + SPD_MID_DB_STORE_RESULT_1, + SPD_MID_DB_STORE_RESULT_2, + SPD_MID_DB_STORE_RESULT_3, + SPD_MID_DB_STORE_RESULT_4, + SPD_MID_DB_STORE_RESULT_5, + SPD_MID_DB_STORE_RESULT_FOR_REUSE_CURSOR_1, + SPD_MID_DB_UDF_COPY_TABLES_1, + SPD_MID_DB_UDF_PING_TABLE_1, + SPD_MID_DB_UDF_PING_TABLE_2, + SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_1, + SPD_MID_DB_UDF_PING_TABLE_APPEND_MON_NEXT_2, + SPD_MID_DB_UDF_PING_TABLE_MON_NEXT_1, + SPD_MID_DIRECT_SQL_BODY_1, + SPD_MID_DIRECT_SQL_INIT_BODY_1, + SPD_MID_DISCOVER_TABLE_STRUCTURE_1, + SPD_MID_FIELDS_CREATE_CONN_HOLDER_1, + SPD_MID_FIELDS_CREATE_LINK_IDX_CHAIN_1, + SPD_MID_FIELDS_CREATE_LINK_IDX_HOLDER_1, + SPD_MID_GET_INIT_ERROR_TABLE_1, + SPD_MID_GET_LGTM_TBLHND_SHARE_1, + SPD_MID_GET_PING_TABLE_MON_1, + SPD_MID_GET_PING_TABLE_TGT_1, + SPD_MID_GET_PT_SHARE_1, + SPD_MID_GET_PT_SHARE_2, + SPD_MID_GET_SHARE_1, + SPD_MID_GET_SHARE_2, + SPD_MID_GET_TRX_1, + SPD_MID_GET_TRX_10, + SPD_MID_GET_TRX_2, + SPD_MID_GET_TRX_3, + SPD_MID_GET_TRX_4, + SPD_MID_GET_TRX_5, + SPD_MID_GET_TRX_6, + SPD_MID_GET_TRX_7, + SPD_MID_GET_TRX_8, + SPD_MID_GET_TRX_9, + SPD_MID_HANDLERSOCKET_HANDLER_INIT_1, + SPD_MID_HANDLERSOCKET_HANDLER_INIT_2, + SPD_MID_HANDLERSOCKET_HANDLER_SPIDER_HANDLERSOCKET_HANDLER_1, + SPD_MID_HANDLERSOCKET_SHARE_CREATE_COLUMN_NAME_STR_1, + SPD_MID_HANDLERSOCKET_SHARE_CREATE_TABLE_NAMES_STR_1, + SPD_MID_HANDLERSOCKET_SHARE_CREATE_TABLE_NAMES_STR_2, + SPD_MID_HANDLERSOCKET_SHARE_CREATE_TABLE_NAMES_STR_3, + SPD_MID_HANDLERSOCKET_SHARE_INIT_1, + SPD_MID_HANDLERSOCKET_SHARE_SPIDER_HANDLERSOCKET_SHARE_1, + SPD_MID_HA_SPIDER_COND_PUSH_1, + SPD_MID_HA_SPIDER_CREATE_1, + SPD_MID_HA_SPIDER_CREATE_2, + SPD_MID_HA_SPIDER_CREATE_BULK_ACCESS_LINK_1, + SPD_MID_HA_SPIDER_FT_INIT_EXT_1, + SPD_MID_HA_SPIDER_HA_SPIDER_1, + SPD_MID_HA_SPIDER_HA_SPIDER_2, + SPD_MID_HA_SPIDER_INFO_PUSH_1, + SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_1, + SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_2, + SPD_MID_HA_SPIDER_MULTI_RANGE_READ_NEXT_FIRST_3, + SPD_MID_HA_SPIDER_OPEN_1, + SPD_MID_HA_SPIDER_OPEN_2, + SPD_MID_HA_SPIDER_OPEN_3, + SPD_MID_HA_SPIDER_OPEN_4, + SPD_MID_HA_SPIDER_OPEN_5, + SPD_MID_HA_SPIDER_OPEN_6, + SPD_MID_HA_SPIDER_OPEN_7, + SPD_MID_INCREASE_LONGLONG_LIST_1, + SPD_MID_INCREASE_LONG_LIST_1, + SPD_MID_INCREASE_NULL_STRING_LIST_1, + SPD_MID_INCREASE_STRING_LIST_1, + SPD_MID_MBASE_COPY_TABLE_INIT_1, + SPD_MID_MBASE_HANDLER_APPEND_KEY_COLUMN_TYPES_1, + SPD_MID_MBASE_HANDLER_APPEND_MATCH_AGAINST_1, + SPD_MID_MBASE_HANDLER_APPEND_TMP_TABLE_AND_SQL_FOR_BKA_1, + SPD_MID_MBASE_HANDLER_APPEND_UNION_TABLE_AND_SQL_FOR_BKA_1, + SPD_MID_MBASE_HANDLER_INIT_1, + SPD_MID_MBASE_HANDLER_INIT_2, + SPD_MID_MBASE_HANDLER_INIT_3, + SPD_MID_MBASE_HANDLER_INIT_4, + SPD_MID_MBASE_HANDLER_INIT_5, + SPD_MID_MBASE_HANDLER_INIT_6, + SPD_MID_MBASE_HANDLER_INIT_7, + SPD_MID_MBASE_HANDLER_INIT_8, + SPD_MID_MBASE_HANDLER_INIT_9, + SPD_MID_MBASE_HANDLER_INIT_UNION_TABLE_NAME_POS_1, + SPD_MID_MBASE_HANDLER_SET_SQL_FOR_EXEC_1, + SPD_MID_MBASE_HANDLER_SET_UNION_TABLE_NAME_POS_1, + SPD_MID_MBASE_HANDLER_SPIDER_MBASE_HANDLER_1, + SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_1, + SPD_MID_MBASE_SHARE_APPEND_SHOW_INDEX_2, + SPD_MID_MBASE_SHARE_APPEND_SHOW_RECORDS_1, + SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_1, + SPD_MID_MBASE_SHARE_APPEND_SHOW_TABLE_STATUS_2, + SPD_MID_MBASE_SHARE_CREATE_COLUMN_NAME_STR_1, + SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_1, + SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_2, + SPD_MID_MBASE_SHARE_CREATE_TABLE_NAMES_STR_3, + SPD_MID_MBASE_SHARE_DISCOVER_TABLE_STRUCTURE_1, + SPD_MID_MBASE_SHARE_INIT_1, + SPD_MID_MBASE_SHARE_INIT_2, + SPD_MID_MBASE_SHARE_INIT_3, + SPD_MID_MBASE_SHARE_INIT_4, + SPD_MID_MBASE_SHARE_SPIDER_MBASE_SHARE_1, + SPD_MID_OPEN_ALL_TABLES_1, + SPD_MID_OPEN_SYS_TABLE_1, + SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_1, + SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_2, + SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_3, + SPD_MID_ORACLE_COPY_TABLE_COPY_ROWS_4, + SPD_MID_ORACLE_COPY_TABLE_INIT_1, + SPD_MID_ORACLE_COPY_TABLE_INIT_2, + SPD_MID_ORACLE_HANDLER_APPEND_KEY_COLUMN_TYPES_1, + SPD_MID_ORACLE_HANDLER_APPEND_MATCH_AGAINST_1, + SPD_MID_ORACLE_HANDLER_APPEND_TMP_TABLE_AND_SQL_FOR_BKA_1, + SPD_MID_ORACLE_HANDLER_APPEND_UNION_TABLE_AND_SQL_FOR_BKA_1, + SPD_MID_ORACLE_HANDLER_INIT_1, + SPD_MID_ORACLE_HANDLER_INIT_2, + SPD_MID_ORACLE_HANDLER_INIT_3, + SPD_MID_ORACLE_HANDLER_INIT_4, + SPD_MID_ORACLE_HANDLER_INIT_5, + SPD_MID_ORACLE_HANDLER_INIT_6, + SPD_MID_ORACLE_HANDLER_INIT_7, + SPD_MID_ORACLE_HANDLER_INIT_8, + SPD_MID_ORACLE_HANDLER_INIT_9, + SPD_MID_ORACLE_HANDLER_INIT_UNION_TABLE_NAME_POS_1, + SPD_MID_ORACLE_HANDLER_SET_SQL_FOR_EXEC_1, + SPD_MID_ORACLE_HANDLER_SET_UNION_TABLE_NAME_POS_1, + SPD_MID_ORACLE_HANDLER_SPIDER_ORACLE_HANDLER_1, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_AUTOINC_1, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_INDEX_1, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_INDEX_2, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_LAST_INSERT_ID_1, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_LAST_INSERT_ID_2, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_RECORDS_1, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_TABLE_STATUS_1, + SPD_MID_ORACLE_SHARE_APPEND_SHOW_TABLE_STATUS_2, + SPD_MID_ORACLE_SHARE_CREATE_COLUMN_NAME_STR_1, + SPD_MID_ORACLE_SHARE_CREATE_TABLE_NAMES_STR_1, + SPD_MID_ORACLE_SHARE_CREATE_TABLE_NAMES_STR_2, + SPD_MID_ORACLE_SHARE_CREATE_TABLE_NAMES_STR_3, + SPD_MID_ORACLE_SHARE_INIT_1, + SPD_MID_ORACLE_SHARE_INIT_2, + SPD_MID_ORACLE_SHARE_INIT_3, + SPD_MID_ORACLE_SHARE_INIT_4, + SPD_MID_ORACLE_SHARE_SPIDER_ORACLE_SHARE_1, + SPD_MID_PARSE_CONNECT_INFO_1, + SPD_MID_PING_TABLE_BODY_1, + SPD_MID_PING_TABLE_BODY_2, + SPD_MID_PING_TABLE_INIT_BODY_1, + SPD_MID_PING_TABLE_MON_FROM_TABLE_1, + SPD_MID_RELEASE_PING_TABLE_MON_LIST_1, + SPD_MID_TRX_ANOTHER_LOCK_TABLES_1, + SPD_MID_UDF_COPY_TABLES_CREATE_TABLE_LIST_1, + SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_1, + SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_2, + SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_3, + SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_4, + SPD_MID_UDF_DIRECT_SQL_CREATE_CONN_KEY_1, + SPD_MID_UDF_DIRECT_SQL_CREATE_TABLE_LIST_1, + SPD_MID_UDF_DIRECT_SQL_CREATE_TABLE_LIST_2, + SPD_MID_UDF_GET_COPY_TGT_TABLES_1 +}; + #define SPIDER_BACKUP_DASTATUS \ bool da_status; if (thd) da_status = thd->is_error(); else da_status = FALSE; #define SPIDER_RESTORE_DASTATUS \ @@ -505,20 +777,24 @@ SPIDER_IP_PORT_CONN *ip_port_conn; pthread_mutex_t loop_check_mutex; + /* + A hash of SPIDER_CONN_LOOP_CHECK, indexed by + SPIDER_CONN_LOOP_CHECK::full_name + */ HASH loop_checked; uint loop_checked_id; const char *loop_checked_func_name; const char *loop_checked_file_name; ulong loop_checked_line_no; + /* + A hash of SPIDER_CONN_LOOP_CHECK, indexed by + SPIDER_CONN_LOOP_CHECK::to_name + */ HASH loop_check_queue; uint loop_check_queue_id; const char *loop_check_queue_func_name; const char *loop_check_queue_file_name; ulong loop_check_queue_line_no; - SPIDER_CONN_LOOP_CHECK *loop_check_ignored_first; - SPIDER_CONN_LOOP_CHECK *loop_check_ignored_last; - SPIDER_CONN_LOOP_CHECK *loop_check_meraged_first; - SPIDER_CONN_LOOP_CHECK *loop_check_meraged_last; } SPIDER_CONN; typedef struct st_spider_lgtm_tblhnd_share @@ -574,6 +850,10 @@ SPD_HND_STAGE_CLEAR_TOP_TABLE_FIELDS }; +/* + A wide handler is shared among ha_spider of partitions of the same + table. It is owned by the last partition. +*/ typedef struct st_spider_wide_handler { spider_hnd_stage stage; @@ -710,15 +990,24 @@ char *table_name; uint table_name_length; uint use_count; + /** + Probably equals `active_link_count`. See also commit ddff602 of + https://github.com/nayuta-yanagisawa/spider-history + + FIXME: consider removing it and using `active_link_count` instead. + */ uint link_count; + /* Number of all links, i.e. all remote servers for the spider + table. */ uint all_link_count; + /* + The bitmap size of ha_spider::conn_can_fo, where the ha_spider + is the one `this' associates with (i.e. spider->share == this) + */ uint link_bitmap_size; pthread_mutex_t mutex; pthread_mutex_t sts_mutex; pthread_mutex_t crd_mutex; -/* - pthread_mutex_t auto_increment_mutex; -*/ TABLE_SHARE *table_share; SPIDER_LGTM_TBLHND_SHARE *lgtm_tblhnd_share; my_hash_value_type table_name_hash_value; @@ -934,6 +1223,7 @@ uint *tgt_pk_names_lengths; uint *tgt_sequence_names_lengths; uint *conn_keys_lengths; + /* The index in `spider_dbton' of each data node link. */ uint *sql_dbton_ids; uint server_names_charlen; @@ -1003,10 +1293,16 @@ uchar dbton_bitmap[spider_bitmap_size(SPIDER_DBTON_SIZE)]; spider_db_share *dbton_share[SPIDER_DBTON_SIZE]; uint use_dbton_count; + /* Actual size is `use_dbton_count'. Values are the indices of item + in `spider_dbton'. */ uint use_dbton_ids[SPIDER_DBTON_SIZE]; + /* Inverse map of `use_dbton_ids'. */ uint dbton_id_to_seq[SPIDER_DBTON_SIZE]; uint use_sql_dbton_count; + /* Actual size is `use_sql_dbton_count'. Values are the indices of + item in `spider_dbton'. */ uint use_sql_dbton_ids[SPIDER_DBTON_SIZE]; + /* Inverse map of `use_sql_dbton_ids'. */ uint sql_dbton_id_to_seq[SPIDER_DBTON_SIZE]; SPIDER_ALTER_TABLE alter_table; @@ -1138,6 +1434,7 @@ st_spider_table_mon *next; } SPIDER_TABLE_MON; +/* List of `SPIDER_TABLE_MON's */ typedef struct st_spider_table_mon_list { char *key; @@ -1214,16 +1511,42 @@ ulong sort; }; +/* + A SPIDER_TRX_HA contains the HA information of a spider table or + partition. + + Each SPIDER_TRX_HA is stored in a hash belonging to a SPIDER_TRX + i.e. its trx_ha_hash field. + + It thus may have a different lifespan from the ha_spider or + SPIDER_SHARE associated with the same spider table/partition. +*/ typedef struct st_spider_trx_ha { + /* + A fully qualified table name, used as the key in + SPIDER_TRX::trx_ha_hash + */ char *table_name; uint table_name_length; - SPIDER_TRX *trx; + /* + The associated SPIDER_SHARE. Will be used to check against a + given SPIDER_SHARE + */ SPIDER_SHARE *share; + /* + link_count and link_bitmap_size are read from and checked against + the corresponding fields of the associated SPIDER_SHARE. + */ uint link_count; uint link_bitmap_size; + /* + conn_link_idx and conn_can_fo are read from and written to the + corresponding fields of the associated ha_spider. + */ uint *conn_link_idx; uchar *conn_can_fo; + /* TODO: document */ bool wait_for_reusing; } SPIDER_TRX_HA; diff -Nru mariadb-10.11.6/storage/spider/spd_init_query.h mariadb-10.11.9/storage/spider/spd_init_query.h --- mariadb-10.11.6/storage/spider/spd_init_query.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_init_query.h 2024-08-03 07:29:59.000000000 +0000 @@ -20,6 +20,17 @@ */ static LEX_STRING spider_init_queries[] = { + /* Use the default SQL_MODE for this connection. */ + {C_STRING_WITH_LEN( + "SET @@SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO," + "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';" + )}, + {C_STRING_WITH_LEN( + "SET @@OLD_MODE = CONCAT(@@OLD_MODE, ',UTF8_IS_UTF8MB3');" + )}, + {C_STRING_WITH_LEN( + "SET tx_read_only = off;" + )}, {C_STRING_WITH_LEN( "create table if not exists mysql.spider_xa(" " format_id int not null default 0," @@ -654,6 +665,46 @@ " algorithm=copy, lock=shared;" )}, {C_STRING_WITH_LEN( + "alter table mysql.spider_link_mon_servers" + " add column if not exists filedsn text default null after dsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( + "alter table mysql.spider_tables" + " add column if not exists filedsn text default null after dsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( + "alter table mysql.spider_xa_failed_log" + " add column if not exists filedsn text default null after dsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( + "alter table mysql.spider_xa_member" + " add column if not exists filedsn text default null after dsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( + "alter table mysql.spider_link_mon_servers" + " add column if not exists driver char(64) default null after filedsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( + "alter table mysql.spider_tables" + " add column if not exists driver char(64) default null after filedsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( + "alter table mysql.spider_xa_failed_log" + " add column if not exists driver char(64) default null after filedsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( + "alter table mysql.spider_xa_member" + " add column if not exists driver char(64) default null after filedsn," + " algorithm=copy, lock=shared;" + )}, + {C_STRING_WITH_LEN( "alter table mysql.spider_link_mon_servers" " add column if not exists filedsn text default null after dsn," " algorithm=copy, lock=shared;" diff -Nru mariadb-10.11.6/storage/spider/spd_param.cc mariadb-10.11.9/storage/spider/spd_param.cc --- mariadb-10.11.6/storage/spider/spd_param.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_param.cc 2024-08-03 07:29:59.000000000 +0000 @@ -109,59 +109,61 @@ MYSQL_SYSVAR_NAME(param_name).def_val; \ } -static int spider_direct_update(THD *thd, SHOW_VAR *var, char *buff) +extern handlerton *spider_hton_ptr; +static void spider_trx_status_var(THD *thd, SHOW_VAR *var, void *buff, + ulonglong SPIDER_TRX::*counter) { - int error_num = 0; - SPIDER_TRX *trx; DBUG_ENTER("spider_direct_update"); var->type = SHOW_LONGLONG; - if ((trx = spider_get_trx(thd, TRUE, &error_num))) - var->value = (char *) &trx->direct_update_count; - DBUG_RETURN(error_num); + var->value= buff; + if (thd != current_thd) + mysql_mutex_lock(&thd->LOCK_thd_data); + SPIDER_TRX *trx = (SPIDER_TRX*)thd_get_ha_data(thd, spider_hton_ptr); + *(ulonglong*)buff= trx ? trx->*counter : 0; + if (thd != current_thd) + mysql_mutex_unlock(&thd->LOCK_thd_data); + DBUG_VOID_RETURN; } -static int spider_direct_delete(THD *thd, SHOW_VAR *var, char *buff) + +static int spider_direct_update(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) +{ + DBUG_ENTER("spider_direct_update"); + spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_update_count); + DBUG_RETURN(0); +} + +static int spider_direct_delete(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { - int error_num = 0; - SPIDER_TRX *trx; DBUG_ENTER("spider_direct_delete"); - var->type = SHOW_LONGLONG; - if ((trx = spider_get_trx(thd, TRUE, &error_num))) - var->value = (char *) &trx->direct_delete_count; - DBUG_RETURN(error_num); + spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_delete_count); + DBUG_RETURN(0); } -static int spider_direct_order_limit(THD *thd, SHOW_VAR *var, char *buff) +static int spider_direct_order_limit(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { - int error_num = 0; - SPIDER_TRX *trx; DBUG_ENTER("spider_direct_order_limit"); - var->type = SHOW_LONGLONG; - if ((trx = spider_get_trx(thd, TRUE, &error_num))) - var->value = (char *) &trx->direct_order_limit_count; - DBUG_RETURN(error_num); + spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_order_limit_count); + DBUG_RETURN(0); } -static int spider_direct_aggregate(THD *thd, SHOW_VAR *var, char *buff) +static int spider_direct_aggregate(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { - int error_num = 0; - SPIDER_TRX *trx; DBUG_ENTER("spider_direct_aggregate"); - var->type = SHOW_LONGLONG; - if ((trx = spider_get_trx(thd, TRUE, &error_num))) - var->value = (char *) &trx->direct_aggregate_count; - DBUG_RETURN(error_num); + spider_trx_status_var(thd, var, buff, &SPIDER_TRX::direct_aggregate_count); + DBUG_RETURN(0); } -static int spider_parallel_search(THD *thd, SHOW_VAR *var, char *buff) +static int spider_parallel_search(THD *thd, SHOW_VAR *var, void *buff, + system_status_var *, enum_var_type) { - int error_num = 0; - SPIDER_TRX *trx; DBUG_ENTER("spider_parallel_search"); - var->type = SHOW_LONGLONG; - if ((trx = spider_get_trx(thd, TRUE, &error_num))) - var->value = (char *) &trx->parallel_search_count; - DBUG_RETURN(error_num); + spider_trx_status_var(thd, var, buff, &SPIDER_TRX::parallel_search_count); + DBUG_RETURN(0); } struct st_mysql_show_var spider_status_variables[] = @@ -2217,7 +2219,7 @@ "Static thread count of table sts", NULL, NULL, - 10, + 1, 1, 4294967295U, 0 @@ -2236,7 +2238,7 @@ "Static thread count of table crd", NULL, NULL, - 10, + 1, 1, 4294967295U, 0 diff -Nru mariadb-10.11.6/storage/spider/spd_ping_table.cc mariadb-10.11.9/storage/spider/spd_ping_table.cc --- mariadb-10.11.6/storage/spider/spd_ping_table.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_ping_table.cc 2024-08-03 07:29:59.000000000 +0000 @@ -50,6 +50,8 @@ extern PSI_mutex_key spd_key_mutex_mon_table_cache; #endif +/* Array (of size `spider_udf_table_mon_mutex_count') of hashes of +`SPIDER_TABLE_MON_LIST'. */ HASH *spider_udf_table_mon_list_hash; uint spider_udf_table_mon_list_hash_id; const char *spider_udf_table_mon_list_hash_func_name; @@ -59,23 +61,43 @@ pthread_cond_t *spider_udf_table_mon_conds; pthread_mutex_t spider_mon_table_cache_mutex; +/* A cache to store distinct SPIDER_MON_KEYs with db name, table name +and link id read from mysql.spider_link_mon_servers table. Initialised +and populated in spider_init_ping_table_mon_cache(), and used in +spider_ping_table_cache_compare(). The udf +spider_flush_table_mon_cache is used to flag a initialisation. */ DYNAMIC_ARRAY spider_mon_table_cache; uint spider_mon_table_cache_id; const char *spider_mon_table_cache_func_name; const char *spider_mon_table_cache_file_name; ulong spider_mon_table_cache_line_no; -volatile ulonglong spider_mon_table_cache_version = 0; -volatile ulonglong spider_mon_table_cache_version_req = 1; +/* The mon table cache version, initialised at 0, and always no +greater than spider_mon_table_cache_version_req. When the inequality +is strict, an initialisation of spider_mon_table_cache will be +triggered. */ +volatile ulonglong spider_mon_table_cache_version; +/* The required mon table cache version, incremented by one by the +udf spider_flush_table_mon_cache */ +volatile ulonglong spider_mon_table_cache_version_req; + /* Get or create a `SPIDER_TABLE_MON_LIST' for a key `str' */ SPIDER_TABLE_MON_LIST *spider_get_ping_table_mon_list( SPIDER_TRX *trx, THD *thd, - spider_string *str, + spider_string *str, /* The key to search in + `spider_udf_table_mon_list_hash', + usually in the format of + "./$db_name/$table_name000000000$link_idx" */ uint conv_name_length, int link_idx, char *static_link_id, uint static_link_id_length, - uint32 server_id, + uint32 server_id, /* The server id of the monitor + server, used for creating a new + table mon list having a + `SPIDER_TABLE_MON' corresponding to + the server id as the `current' + field */ bool need_lock, int *error_num ) { @@ -85,6 +107,7 @@ ulonglong mon_table_cache_version; my_hash_value_type hash_value; DBUG_ENTER("spider_get_ping_table_mon_list"); + /* Reset the cache if the version does not match the requirement */ if (spider_mon_table_cache_version != spider_mon_table_cache_version_req) { SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME)); @@ -97,6 +120,9 @@ free_root(&mem_root, MYF(0)); } + /* Search for the table mon list in the hash, if one is not found or + if it is found but has the wrong cache version, create and + initialise a new one. */ mutex_hash= spider_udf_calc_hash(str->c_ptr(), spider_udf_table_mon_mutex_count); DBUG_PRINT("info",("spider hash key=%s", str->c_ptr())); @@ -113,12 +139,15 @@ table_mon_list->mon_table_cache_version != mon_table_cache_version ) { + /* If table_mon_list is found but the cache version does not + match, remove it from the hash and free it. */ if ( table_mon_list && table_mon_list->mon_table_cache_version != mon_table_cache_version ) spider_release_ping_table_mon_list_loop(mutex_hash, table_mon_list); - + /* create and initialise `table_mon_list' and insert it into the + hash */ if (!(table_mon_list = spider_get_ping_table_tgt(thd, str->c_ptr(), conv_name_length, link_idx, static_link_id, static_link_id_length, server_id, str, need_lock, error_num))) @@ -219,7 +248,7 @@ } spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1, system_charset_info); - conv_name_str.init_calc_mem(134); + conv_name_str.init_calc_mem(SPD_MID_RELEASE_PING_TABLE_MON_LIST_1); conv_name_str.length(0); conv_name_str.q_append(conv_name, conv_name_length); conv_name_str.q_append(link_idx_str, link_idx_str_length); @@ -240,6 +269,14 @@ DBUG_RETURN(0); } +/* + Look for a `SPIDER_MON_KEY` in `spider_mon_table_cache' whose db and + table name and link_idx matching `name' and `link_idx' with wild + card matching. If a match is found, create `SPIDER_TABLE_MON's from + all rows in mysql.spider_link_mon_servers that match the info in the + `SPIDER_MON_KEY' and populate the `table_mon_list' with these + `SPIDER_TABLE_MON's. +*/ int spider_get_ping_table_mon( THD *thd, SPIDER_TABLE_MON_LIST *table_mon_list, @@ -316,6 +353,8 @@ goto error; create_table_mon: + /* Find the first row in mysql.spider_link_mon_servers matching the + db name, table name and link_idx */ if ((error_num = spider_get_sys_table_by_idx(table_link_mon, table_key, table_link_mon->s->primary_key, 3))) { @@ -323,9 +362,12 @@ goto error; } + /* create one `SPIDER_TABLE_MON' per row in + mysql.spider_link_mon_servers with matching db name, table name and + link_idx, and add it to `table_mon_list'. */ do { if (!(table_mon = (SPIDER_TABLE_MON *) - spider_bulk_malloc(spider_current_trx, 35, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_GET_PING_TABLE_MON_1, MYF(MY_WME | MY_ZEROFILL), &table_mon, (uint) (sizeof(SPIDER_TABLE_MON)), &tmp_share, (uint) (sizeof(SPIDER_SHARE)), &tmp_connect_info, @@ -356,7 +398,7 @@ (error_num = spider_get_sys_link_mon_server_id( table_link_mon, &table_mon->server_id, mem_root)) || (error_num = spider_get_sys_link_mon_connect_info( - table_link_mon, tmp_share, 0, mem_root)) + table_link_mon, tmp_share, mem_root)) ) { table_link_mon->file->print_error(error_num, MYF(0)); spider_sys_index_end(table_link_mon); @@ -418,15 +460,21 @@ DBUG_RETURN(error_num); } +/* + creates and return table_mon_list associated with table with `name' + and `link_idx'th link. +*/ SPIDER_TABLE_MON_LIST *spider_get_ping_table_tgt( THD *thd, - char *name, + char *name, /* The table name, usually fully qualified */ uint name_length, int link_idx, char *static_link_id, uint static_link_id_length, - uint32 server_id, - spider_string *str, + uint32 server_id, /* The server_id will determine the + `current' field of the returned + `SPIDER_TABLE_MON_LIST'. */ + spider_string *str, /* str->c_ptr() == name */ bool need_lock, int *error_num ) { @@ -446,7 +494,7 @@ SPD_INIT_ALLOC_ROOT(&mem_root, 4096, 0, MYF(MY_WME)); if (!(table_mon_list = (SPIDER_TABLE_MON_LIST *) - spider_bulk_malloc(spider_current_trx, 36, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_GET_PING_TABLE_TGT_1, MYF(MY_WME | MY_ZEROFILL), &table_mon_list, (uint) (sizeof(SPIDER_TABLE_MON_LIST)), &tmp_share, (uint) (sizeof(SPIDER_SHARE)), &tmp_connect_info, @@ -471,6 +519,7 @@ memcpy(key_str, str->ptr(), table_mon_list->key_length); tmp_share->access_charset = thd->variables.character_set_client; + /* Open mysql.spider_tables */ if ( !(table_tables = spider_open_sys_table( thd, SPIDER_SYS_TABLES_TABLE_NAME_STR, @@ -480,6 +529,8 @@ my_error(*error_num, MYF(0)); goto error; } + /* store db and table names and link idx in mysql.spider_tables for + reading */ spider_store_tables_name(table_tables, name, name_length); if (static_link_id) { @@ -503,9 +554,10 @@ goto error; } } + /* Populate tmp_share with info read from mysql.spider_tables */ if ( (*error_num = spider_get_sys_tables_connect_info( - table_tables, tmp_share, 0, &mem_root)) || + table_tables, tmp_share, &mem_root)) || (*error_num = spider_get_sys_tables_link_status( table_tables, tmp_share, 0, &mem_root)) ) { @@ -527,9 +579,8 @@ tmp_share, name, name_length )) || (*error_num = spider_create_conn_keys(tmp_share)) || -/* - (*error_num = spider_db_create_table_names_str(tmp_share)) || -*/ + /* Pinally, populate `table_mon_list' with newly created + `SPIDER_TABLE_MON's */ (*error_num = spider_get_ping_table_mon( thd, table_mon_list, name, name_length, link_idx, server_id, &mem_root, need_lock)) @@ -819,6 +870,11 @@ DBUG_RETURN(error_num); } +/* + Initialise `spider_mon_table_cache' by scanning the + mysql.spider_link_mon_servers table, creating distinct + `SPIDER_MON_KEY's with the info and inserting them into the cache. +*/ int spider_init_ping_table_mon_cache( THD *thd, MEM_ROOT *mem_root, @@ -847,6 +903,7 @@ /* reset */ spider_mon_table_cache.elements = 0; + /* start at the first row */ if ((error_num = spider_sys_index_first(table_link_mon, table_link_mon->s->primary_key))) { @@ -863,10 +920,16 @@ mon_key.table_name_length = SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE + 1; mon_key.link_id_length = SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE + 1; do { + /* update content of `mon_key' */ if ((error_num = spider_get_sys_link_mon_key(table_link_mon, &mon_key, mem_root, &same))) goto error_get_sys_link_mon_key; + /* `mon_key' has changed content. since + mysql.spider_link_mon_servers is indexed by db_name, + table_name, link_idx, and server_id, it is possible that + different server_ids share the same mon_key which only has + db_name, table_name, link_idx */ if (!same) { mon_key.sort = spider_calc_for_sort(3, mon_key.db_name, @@ -937,6 +1000,13 @@ DBUG_RETURN(error_num); } +/* + Read from msyql.spider_link_mon_servers table fields the db name, + table name and link_id and search for them with wild card matching + in `spider_mon_table_cache'. store the db name, table name, and + link_id of the matching `SPIDER_MON_KEY' back to the table field on + success. +*/ int spider_ping_table_cache_compare( TABLE *table, MEM_ROOT *mem_root @@ -1024,8 +1094,8 @@ int static_link_id_length = 0; bool get_lock = FALSE, status_changed_to_ng = FALSE; DBUG_ENTER("spider_ping_table_body"); - conv_name.init_calc_mem(135); - tmp_str.init_calc_mem(247); + conv_name.init_calc_mem(SPD_MID_PING_TABLE_BODY_1); + tmp_str.init_calc_mem(SPD_MID_PING_TABLE_BODY_2); conv_name.length(0); server_id = global_system_variables.server_id; if ( @@ -1213,9 +1283,6 @@ DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 2")); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1230,9 +1297,6 @@ conv_name.c_ptr(), conv_name_length, link_idx, TRUE); status_changed_to_ng = TRUE; } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (status_changed_to_ng) { @@ -1286,9 +1350,6 @@ DBUG_PRINT("info",("spider mon_table_result->result_status=SPIDER_LINK_MON_NG 3")); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1303,9 +1364,6 @@ conv_name.c_ptr(), conv_name_length, link_idx, TRUE); status_changed_to_ng = TRUE; } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (status_changed_to_ng) { @@ -1349,9 +1407,6 @@ mon_table_result->result_status == SPIDER_LINK_MON_NG && table_mon_list->mon_status != SPIDER_LINK_MON_NG ) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1366,9 +1421,6 @@ conv_name.c_ptr(), conv_name_length, link_idx, TRUE); status_changed_to_ng = TRUE; } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (status_changed_to_ng) { @@ -1463,7 +1515,7 @@ } if (!(mon_table_result = (SPIDER_MON_TABLE_RESULT *) - spider_malloc(spider_current_trx, 11, sizeof(SPIDER_MON_TABLE_RESULT), + spider_malloc(spider_current_trx, SPD_MID_PING_TABLE_INIT_BODY_1, sizeof(SPIDER_MON_TABLE_RESULT), MYF(MY_WME | MY_ZEROFILL))) ) { strcpy(message, "spider_ping_table() out of memory"); @@ -1539,9 +1591,9 @@ SPIDER_SHARE *share, int base_link_idx, uint32 server_id, - char *conv_name, + char *conv_name, /* Usually fully qualified table name */ uint conv_name_length, - int link_idx, + int link_idx, /* The link id to ping */ char *where_clause, uint where_clause_length, long monitoring_kind, @@ -1551,9 +1603,6 @@ ) { int error_num = 0, current_mon_count, flags; uint32 first_sid; -/* - THD *thd = trx->thd; -*/ SPIDER_TABLE_MON_LIST *table_mon_list; SPIDER_TABLE_MON *table_mon; SPIDER_MON_TABLE_RESULT mon_table_result; @@ -1606,7 +1655,7 @@ buf[conv_name_length + link_idx_str_length] = '\0'; spider_string conv_name_str(buf, conv_name_length + link_idx_str_length + 1, system_charset_info); - conv_name_str.init_calc_mem(136); + conv_name_str.init_calc_mem(SPD_MID_PING_TABLE_MON_FROM_TABLE_1); conv_name_str.length(0); conv_name_str.q_append(conv_name, conv_name_length); conv_name_str.q_append(link_idx_str, link_idx_str_length + 1); @@ -1622,6 +1671,7 @@ if (monitoring_flag & 1) flags |= SPIDER_UDF_PING_TABLE_USE_ALL_MONITORING_NODES; + /* Get or create `table_mon_list' for `conv_name_str'. */ if (!(table_mon_list = spider_get_ping_table_mon_list(trx, thd, &conv_name_str, conv_name_length, link_idx, share->static_link_ids[link_idx], @@ -1653,6 +1703,8 @@ table_mon = table_mon_list->current; first_sid = table_mon->server_id; current_mon_count = 1; + /* Call spider_ping_table on each table_mon of `table_mon_list', + until one succeeds */ while (TRUE) { DBUG_PRINT("info",("spider thd->killed=%s", @@ -1697,16 +1749,13 @@ if (!spider_db_udf_ping_table_mon_next( thd, table_mon, mon_conn, &mon_table_result, conv_name, conv_name_length, link_idx, - where_clause, where_clause_length, -1, table_mon_list->list_size, + where_clause, where_clause_length, /*first_sid=*/-1, table_mon_list->list_size, 0, 0, 0, flags, monitoring_limit)) { if ( mon_table_result.result_status == SPIDER_LINK_MON_NG && table_mon_list->mon_status != SPIDER_LINK_MON_NG ) { -/* - pthread_mutex_lock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_lock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); if (table_mon_list->mon_status != SPIDER_LINK_MON_NG) { @@ -1721,9 +1770,6 @@ spider_sys_log_tables_link_failed(thd, conv_name, conv_name_length, link_idx, need_lock); } -/* - pthread_mutex_unlock(&table_mon_list->update_status_mutex); -*/ pthread_mutex_unlock(&spider_udf_table_mon_mutexes[table_mon_list->mutex_hash]); } table_mon_list->last_caller_result = mon_table_result.result_status; diff -Nru mariadb-10.11.6/storage/spider/spd_sys_table.cc mariadb-10.11.9/storage/spider/spd_sys_table.cc --- mariadb-10.11.6/storage/spider/spd_sys_table.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_sys_table.cc 2024-08-03 07:29:59.000000000 +0000 @@ -325,38 +325,6 @@ } break; } - if (!memcmp(table_name, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR, - SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN)) - { - DBUG_PRINT("info",("spider checking for SYS_TABLE_STS")); - if (table->s->fields != SPIDER_SYS_TABLE_STS_COL_CNT) - { - spider_close_sys_table(thd, table, open_tables_backup, need_lock); - table = NULL; - my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM, - ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0), - SPIDER_SYS_TABLE_STS_TABLE_NAME_STR); - *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM; - goto error_col_num_chk; - } - break; - } - if (!memcmp(table_name, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR, - SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN)) - { - DBUG_PRINT("info",("spider checking for SYS_TABLE_CRD")); - if (table->s->fields != SPIDER_SYS_TABLE_CRD_COL_CNT) - { - spider_close_sys_table(thd, table, open_tables_backup, need_lock); - table = NULL; - my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM, - ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0), - SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR); - *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM; - goto error_col_num_chk; - } - break; - } DBUG_ASSERT(0); break; case 20: @@ -378,24 +346,6 @@ } DBUG_ASSERT(0); break; - case 21: - if (!memcmp(table_name, SPIDER_SYS_RW_TBLS_TABLE_NAME_STR, - SPIDER_SYS_RW_TBLS_TABLE_NAME_LEN)) - { - DBUG_PRINT("info",("spider checking for SYS_RW_TBLS")); - if (table->s->fields != SPIDER_SYS_RW_TBLS_COL_CNT) - { - spider_close_sys_table(thd, table, open_tables_backup, need_lock); - table = NULL; - my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM, - ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0), - SPIDER_SYS_RW_TBLS_TABLE_NAME_STR); - *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM; - goto error_col_num_chk; - } - } - DBUG_ASSERT(0); - break; case 22: if (!memcmp(table_name, SPIDER_SYS_LINK_FAILED_TABLE_NAME_STR, SPIDER_SYS_LINK_FAILED_TABLE_NAME_LEN)) @@ -432,60 +382,6 @@ } break; } - if (!memcmp(table_name, SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR, - SPIDER_SYS_RWN_TBLS_TABLE_NAME_LEN)) - { - DBUG_PRINT("info",("spider checking for SYS_RWN_TBLS")); - if (table->s->fields != SPIDER_SYS_RWN_TBLS_COL_CNT) - { - spider_close_sys_table(thd, table, open_tables_backup, need_lock); - table = NULL; - my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM, - ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0), - SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR); - *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM; - goto error_col_num_chk; - } - break; - } - DBUG_ASSERT(0); - break; - case 27: - if (!memcmp(table_name, SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR, - SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_LEN)) - { - DBUG_PRINT("info",("spider checking for SYS_RW_TBL_TBLS")); - if (table->s->fields != SPIDER_SYS_RW_TBL_TBLS_COL_CNT) - { - spider_close_sys_table(thd, table, open_tables_backup, need_lock); - table = NULL; - my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM, - ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0), - SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR); - *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM; - goto error_col_num_chk; - } - break; - } - DBUG_ASSERT(0); - break; - case 31: - if (!memcmp(table_name, SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR, - SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_LEN)) - { - DBUG_PRINT("info",("spider checking for SYS_RW_TBL_PTTS")); - if (table->s->fields != SPIDER_SYS_RW_TBL_PTTS_COL_CNT) - { - spider_close_sys_table(thd, table, open_tables_backup, need_lock); - table = NULL; - my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM, - ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0), - SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR); - *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM; - goto error_col_num_chk; - } - break; - } DBUG_ASSERT(0); break; case 34: @@ -505,22 +401,6 @@ } break; } - if (!memcmp(table_name, SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR, - SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_LEN)) - { - DBUG_PRINT("info",("spider checking for SYS_RW_TBL_SPTTS")); - if (table->s->fields != SPIDER_SYS_RW_TBL_SPTTS_COL_CNT) - { - spider_close_sys_table(thd, table, open_tables_backup, need_lock); - table = NULL; - my_printf_error(ER_SPIDER_SYS_TABLE_VERSION_NUM, - ER_SPIDER_SYS_TABLE_VERSION_STR, MYF(0), - SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR); - *error_num = ER_SPIDER_SYS_TABLE_VERSION_NUM; - goto error_col_num_chk; - } - break; - } DBUG_ASSERT(0); break; default: @@ -694,6 +574,11 @@ HA_WHOLE_KEY, HA_READ_KEY_EXACT)); } +/* + Creates a key (`table_key') consisting of `col_count' key parts of + `idx'th index of the table, then positions an index cursor to that + key. +*/ int spider_get_sys_table_by_idx( TABLE *table, char *table_key, @@ -749,7 +634,7 @@ int spider_sys_index_first( TABLE *table, - const int idx + const int idx /* which index to use */ ) { int error_num; DBUG_ENTER("spider_sys_index_first"); @@ -991,6 +876,10 @@ DBUG_VOID_RETURN; } +/* + Store db and table names from `name' to `table's corresponding + fields +*/ void spider_store_tables_name( TABLE *table, const char *name, @@ -1455,52 +1344,6 @@ DBUG_VOID_RETURN; } -void spider_store_table_sts_info( - TABLE *table, - ha_statistics *stat -) { - MYSQL_TIME mysql_time; - DBUG_ENTER("spider_store_table_sts_info"); - table->field[SPIDER_TABLE_STS_DATA_FILE_LENGTH_POS]->store( - (longlong) stat->data_file_length, TRUE); - table->field[SPIDER_TABLE_STS_MAX_DATA_FILE_LENGTH_POS]->store( - (longlong) stat->max_data_file_length, TRUE); - table->field[SPIDER_TABLE_STS_INDEX_FILE_LENGTH_POS]->store( - (longlong) stat->index_file_length, TRUE); - table->field[SPIDER_TABLE_STS_RECORDS_POS]->store( - (longlong) stat->records, TRUE); - table->field[SPIDER_TABLE_STS_MEAN_REC_LENGTH_POS]->store( - (longlong) stat->mean_rec_length, TRUE); - spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) stat->check_time); - table->field[SPIDER_TABLE_STS_CHECK_TIME_POS]->store_time(&mysql_time); - spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) stat->create_time); - table->field[SPIDER_TABLE_STS_CREATE_TIME_POS]->store_time(&mysql_time); - spd_tz_system->gmt_sec_to_TIME(&mysql_time, (my_time_t) stat->update_time); - table->field[SPIDER_TABLE_STS_UPDATE_TIME_POS]->store_time(&mysql_time); - if (stat->checksum_null) - { - table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->set_null(); - table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->reset(); - } else { - table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->set_notnull(); - table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->store( - (longlong) stat->checksum, TRUE); - } - DBUG_VOID_RETURN; -} - -void spider_store_table_crd_info( - TABLE *table, - uint *seq, - longlong *cardinality -) { - DBUG_ENTER("spider_store_table_crd_info"); - table->field[SPIDER_TABLE_CRD_KEY_SEQ_POS]->store((longlong) *seq, TRUE); - table->field[SPIDER_TABLE_CRD_CARDINALITY_POS]->store( - (longlong) *cardinality, FALSE); - DBUG_VOID_RETURN; -} - int spider_insert_xa( TABLE *table, XID *xid, @@ -1607,83 +1450,6 @@ DBUG_RETURN(error_num); } -int spider_insert_or_update_table_sts( - TABLE *table, - const char *name, - uint name_length, - ha_statistics *stat -) { - int error_num; - char table_key[MAX_KEY_LENGTH]; - DBUG_ENTER("spider_insert_or_update_table_sts"); - table->use_all_columns(); - spider_store_tables_name(table, name, name_length); - spider_store_table_sts_info( - table, - stat - ); - - if ((error_num = spider_check_sys_table_for_update_all_columns(table, table_key))) - { - if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) - { - table->file->print_error(error_num, MYF(0)); - DBUG_RETURN(error_num); - } - if ((error_num = spider_write_sys_table_row(table))) - { - DBUG_RETURN(error_num); - } - } else { - if ((error_num = spider_update_sys_table_row(table, FALSE))) - { - table->file->print_error(error_num, MYF(0)); - DBUG_RETURN(error_num); - } - } - - DBUG_RETURN(0); -} - -int spider_insert_or_update_table_crd( - TABLE *table, - const char *name, - uint name_length, - longlong *cardinality, - uint number_of_keys -) { - int error_num; - uint roop_count; - char table_key[MAX_KEY_LENGTH]; - DBUG_ENTER("spider_insert_or_update_table_crd"); - table->use_all_columns(); - spider_store_tables_name(table, name, name_length); - - for (roop_count = 0; roop_count < number_of_keys; ++roop_count) - { - spider_store_table_crd_info(table, &roop_count, &cardinality[roop_count]); - if ((error_num = spider_check_sys_table_for_update_all_columns(table, table_key))) - { - if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) - { - table->file->print_error(error_num, MYF(0)); - DBUG_RETURN(error_num); - } - if ((error_num = spider_write_sys_table_row(table))) - { - DBUG_RETURN(error_num); - } - } else { - if ((error_num = spider_update_sys_table_row(table, FALSE))) - { - table->file->print_error(error_num, MYF(0)); - DBUG_RETURN(error_num); - } - } - } - DBUG_RETURN(0); -} - int spider_log_tables_link_failed( TABLE *table, char *name, @@ -2009,6 +1775,16 @@ DBUG_RETURN(0); } +/** + Delete a Spider table from mysql.spider_tables. + + @param table The table mysql.spider_tables + @param name The name of the Spider table to delete + @param old_link_count The number of links in the deleted table + + @retval 0 Success + @retval nonzero Failure +*/ int spider_delete_tables( TABLE *table, const char *name, @@ -2024,10 +1800,20 @@ { spider_store_tables_link_idx(table, roop_count); if ((error_num = spider_check_sys_table(table, table_key))) - break; + { + /* There's a problem with finding the first record for the + spider table, likely because it does not exist. Fail */ + if (roop_count == 0) + DBUG_RETURN(error_num); + /* At least one row has been deleted for the Spider table. + Success */ + else + break; + } else { if ((error_num = spider_delete_sys_table_row(table))) { + /* There's a problem deleting the row. Fail */ DBUG_RETURN(error_num); } } @@ -2372,14 +2158,16 @@ DBUG_RETURN(0); } +/* Read table info from mysql.spider_tables into a `SPIDER_SHARE' */ int spider_get_sys_tables_connect_info( - TABLE *table, - SPIDER_SHARE *share, - int link_idx, + TABLE *table, /* The mysql.spider_tables table */ + SPIDER_SHARE *share, /* The `SPIDER_SHARE' to + update info */ MEM_ROOT *mem_root ) { char *ptr; int error_num = 0; + const int link_idx= 0; DBUG_ENTER("spider_get_sys_tables_connect_info"); DBUG_PRINT("info",("spider link_idx:%d", link_idx)); if ((ptr = get_field(mem_root, table->field[SPIDER_TABLES_PRIORITY_POS]))) @@ -2654,9 +2442,14 @@ DBUG_RETURN(error_num); } +/* + Read the link status from mysql.spider_tables into a `SPIDER_SHARE' + with default value 1 (`SPIDER_LINK_STATUS_OK') +*/ int spider_get_sys_tables_link_status( - TABLE *table, - SPIDER_SHARE *share, + TABLE *table, /* The mysql.spider_tables table */ + SPIDER_SHARE *share, /* The share to read link + status into */ int link_idx, MEM_ROOT *mem_root ) { @@ -2728,64 +2521,6 @@ DBUG_RETURN(error_num); } -void spider_get_sys_table_sts_info( - TABLE *table, - ha_statistics *stat -) { - MYSQL_TIME mysql_time; - uint not_used_uint; - long not_used_long; - DBUG_ENTER("spider_get_sys_table_sts_info"); - stat->data_file_length = (ulonglong) table-> - field[SPIDER_TABLE_STS_DATA_FILE_LENGTH_POS]->val_int(); - stat->max_data_file_length = (ulonglong) table-> - field[SPIDER_TABLE_STS_MAX_DATA_FILE_LENGTH_POS]->val_int(); - stat->index_file_length = (ulonglong) table-> - field[SPIDER_TABLE_STS_INDEX_FILE_LENGTH_POS]->val_int(); - stat->records = (ha_rows) table-> - field[SPIDER_TABLE_STS_RECORDS_POS]->val_int(); - stat->mean_rec_length = (ulong) table-> - field[SPIDER_TABLE_STS_MEAN_REC_LENGTH_POS]->val_int(); - table->field[SPIDER_TABLE_STS_CHECK_TIME_POS]->get_date(&mysql_time, - SPIDER_date_mode_t(0)); - stat->check_time = (time_t) my_system_gmt_sec(&mysql_time, - ¬_used_long, ¬_used_uint); - table->field[SPIDER_TABLE_STS_CREATE_TIME_POS]->get_date(&mysql_time, - SPIDER_date_mode_t(0)); - stat->create_time = (time_t) my_system_gmt_sec(&mysql_time, - ¬_used_long, ¬_used_uint); - table->field[SPIDER_TABLE_STS_UPDATE_TIME_POS]->get_date(&mysql_time, - SPIDER_date_mode_t(0)); - stat->update_time = (time_t) my_system_gmt_sec(&mysql_time, - ¬_used_long, ¬_used_uint); - if (table->field[SPIDER_TABLE_STS_CHECKSUM_POS]->is_null()) - { - stat->checksum_null = TRUE; - stat->checksum = 0; - } else { - stat->checksum_null = FALSE; - stat->checksum = (ha_checksum) table-> - field[SPIDER_TABLE_STS_CHECKSUM_POS]->val_int(); - } - DBUG_VOID_RETURN; -} - -void spider_get_sys_table_crd_info( - TABLE *table, - longlong *cardinality, - uint number_of_keys -) { - uint seq; - DBUG_ENTER("spider_get_sys_table_crd_info"); - seq = (uint) table->field[SPIDER_TABLE_CRD_KEY_SEQ_POS]->val_int(); - if (seq < number_of_keys) - { - cardinality[seq] = (longlong) table-> - field[SPIDER_TABLE_CRD_CARDINALITY_POS]->val_int(); - } - DBUG_VOID_RETURN; -} - int spider_sys_update_tables_link_status( THD *thd, char *name, @@ -2888,11 +2623,17 @@ DBUG_RETURN(error_num); } +/* Populate `mon_key' from the current row in `table' */ int spider_get_sys_link_mon_key( - TABLE *table, - SPIDER_MON_KEY *mon_key, + TABLE *table, /* the mysql.spider_link_mon_servers + table */ + SPIDER_MON_KEY *mon_key, /* output, to be populated in this + function */ MEM_ROOT *mem_root, - int *same + int *same /* output, true if the data from the + current row in the table agrees with + existing data in `mon_key' and false + otherwise */ ) { char *db_name, *table_name, *link_id; uint db_name_length, table_name_length, link_id_length; @@ -2908,6 +2649,7 @@ DBUG_RETURN(ER_SPIDER_SYS_TABLE_VERSION_NUM); } + /* get data for `mon_key' from the table record */ if (!(db_name= get_field(mem_root, table->field[SPIDER_LINK_MON_SERVERS_DB_NAME_POS]))) @@ -2959,9 +2701,12 @@ DBUG_RETURN(0); } +/* Get the server id from the spider_link_mon_servers table field */ int spider_get_sys_link_mon_server_id( - TABLE *table, - uint32 *server_id, + TABLE *table, /* the + mysql.spider_link_mon_servers + table */ + uint32 *server_id, /* output to server_id */ MEM_ROOT *mem_root ) { char *ptr; @@ -2975,14 +2720,17 @@ DBUG_RETURN(error_num); } +/* Get connect info from the spider_link_mon_servers table fields */ int spider_get_sys_link_mon_connect_info( - TABLE *table, - SPIDER_SHARE *share, - int link_idx, + TABLE *table, /* The + mysql.spider_link_mon_servers + table */ + SPIDER_SHARE *share, /* The output spider_share */ MEM_ROOT *mem_root ) { char *ptr; int error_num = 0; + const int link_idx= 0; DBUG_ENTER("spider_get_sys_link_mon_connect_info"); if ( !table->field[SPIDER_LINK_MON_SERVERS_SERVER_POS]->is_null() && @@ -3211,9 +2959,6 @@ if ( (error_num == HA_ERR_KEY_NOT_FOUND || error_num == HA_ERR_END_OF_FILE) ) { -/* - table->file->print_error(error_num, MYF(0)); -*/ DBUG_RETURN(error_num); } } else if ((error_num = @@ -3226,260 +2971,6 @@ DBUG_RETURN(0); } -int spider_sys_insert_or_update_table_sts( - THD *thd, - const char *name, - uint name_length, - ha_statistics *stat, - bool need_lock -) { - int error_num; - TABLE *table_sts = NULL; - SPIDER_Open_tables_backup open_tables_backup; - DBUG_ENTER("spider_sys_insert_or_update_table_sts"); - if ( - !(table_sts = spider_open_sys_table( - thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR, - SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE, - &open_tables_backup, need_lock, &error_num)) - ) { - goto error; - } - if ((error_num = spider_insert_or_update_table_sts( - table_sts, - name, - name_length, - stat - ))) - goto error; - spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock); - table_sts = NULL; - DBUG_RETURN(0); - -error: - if (table_sts) - spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock); - DBUG_RETURN(error_num); -} - -int spider_sys_insert_or_update_table_crd( - THD *thd, - const char *name, - uint name_length, - longlong *cardinality, - uint number_of_keys, - bool need_lock -) { - int error_num; - TABLE *table_crd = NULL; - SPIDER_Open_tables_backup open_tables_backup; - DBUG_ENTER("spider_sys_insert_or_update_table_crd"); - if ( - !(table_crd = spider_open_sys_table( - thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR, - SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE, - &open_tables_backup, need_lock, &error_num)) - ) { - goto error; - } - if ((error_num = spider_insert_or_update_table_crd( - table_crd, - name, - name_length, - cardinality, - number_of_keys - ))) - goto error; - spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock); - table_crd = NULL; - DBUG_RETURN(0); - -error: - if (table_crd) - spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock); - DBUG_RETURN(error_num); -} - -int spider_sys_delete_table_sts( - THD *thd, - const char *name, - uint name_length, - bool need_lock -) { - int error_num; - TABLE *table_sts = NULL; - SPIDER_Open_tables_backup open_tables_backup; - DBUG_ENTER("spider_sys_delete_table_sts"); - if ( - !(table_sts = spider_open_sys_table( - thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR, - SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE, - &open_tables_backup, need_lock, &error_num)) - ) { - goto error; - } - if ((error_num = spider_delete_table_sts( - table_sts, - name, - name_length - ))) - goto error; - spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock); - table_sts = NULL; - DBUG_RETURN(0); - -error: - if (table_sts) - spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock); - DBUG_RETURN(error_num); -} - -int spider_sys_delete_table_crd( - THD *thd, - const char *name, - uint name_length, - bool need_lock -) { - int error_num; - TABLE *table_crd = NULL; - SPIDER_Open_tables_backup open_tables_backup; - DBUG_ENTER("spider_sys_delete_table_crd"); - if ( - !(table_crd = spider_open_sys_table( - thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR, - SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE, - &open_tables_backup, need_lock, &error_num)) - ) { - goto error; - } - if ((error_num = spider_delete_table_crd( - table_crd, - name, - name_length - ))) - goto error; - spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock); - table_crd = NULL; - DBUG_RETURN(0); - -error: - if (table_crd) - spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock); - DBUG_RETURN(error_num); -} - -int spider_sys_get_table_sts( - THD *thd, - const char *name, - uint name_length, - ha_statistics *stat, - bool need_lock -) { - int error_num; - char table_key[MAX_KEY_LENGTH]; - TABLE *table_sts = NULL; - SPIDER_Open_tables_backup open_tables_backup; - DBUG_ENTER("spider_sys_get_table_sts"); - if ( - !(table_sts = spider_open_sys_table( - thd, SPIDER_SYS_TABLE_STS_TABLE_NAME_STR, - SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN, TRUE, - &open_tables_backup, need_lock, &error_num)) - ) { - goto error; - } - - table_sts->use_all_columns(); - spider_store_tables_name(table_sts, name, name_length); - if ((error_num = spider_check_sys_table(table_sts, table_key))) - { - if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) - { - table_sts->file->print_error(error_num, MYF(0)); - } - goto error; - } else { - spider_get_sys_table_sts_info( - table_sts, - stat - ); - } - - spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock); - table_sts = NULL; - DBUG_RETURN(0); - -error: - if (table_sts) - spider_close_sys_table(thd, table_sts, &open_tables_backup, need_lock); - DBUG_RETURN(error_num); -} - -int spider_sys_get_table_crd( - THD *thd, - const char *name, - uint name_length, - longlong *cardinality, - uint number_of_keys, - bool need_lock -) { - int error_num; - char table_key[MAX_KEY_LENGTH]; - bool index_inited = FALSE; - TABLE *table_crd = NULL; - SPIDER_Open_tables_backup open_tables_backup; - DBUG_ENTER("spider_sys_get_table_crd"); - - if ( - !(table_crd = spider_open_sys_table( - thd, SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR, - SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN, TRUE, - &open_tables_backup, need_lock, &error_num)) - ) { - goto error; - } - - table_crd->use_all_columns(); - spider_store_tables_name(table_crd, name, name_length); - if ((error_num = spider_get_sys_table_by_idx(table_crd, table_key, 0, - SPIDER_SYS_TABLE_CRD_PK_COL_CNT - 1))) - { - if (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) - { - table_crd->file->print_error(error_num, MYF(0)); - } - goto error; - } else { - index_inited = TRUE; - do { - spider_get_sys_table_crd_info( - table_crd, - cardinality, - number_of_keys - ); - error_num = spider_sys_index_next_same(table_crd, table_key); - } while (error_num == 0); - } - index_inited = FALSE; - if ((error_num = spider_sys_index_end(table_crd))) - { - table_crd->file->print_error(error_num, MYF(0)); - goto error; - } - - spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock); - table_crd = NULL; - DBUG_RETURN(0); - -error: - if (index_inited) - spider_sys_index_end(table_crd); - - if (table_crd) - spider_close_sys_table(thd, table_crd, &open_tables_backup, need_lock); - DBUG_RETURN(error_num); -} - int spider_sys_replace( TABLE *table, bool *modified_non_trans_table diff -Nru mariadb-10.11.6/storage/spider/spd_sys_table.h mariadb-10.11.9/storage/spider/spd_sys_table.h --- mariadb-10.11.6/storage/spider/spd_sys_table.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_sys_table.h 2024-08-03 07:29:59.000000000 +0000 @@ -28,20 +28,6 @@ #define SPIDER_SYS_XA_FAILED_TABLE_NAME_LEN 20 #define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_STR "spider_table_position_for_recovery" #define SPIDER_SYS_POS_FOR_RECOVERY_TABLE_NAME_LEN 34 -#define SPIDER_SYS_TABLE_STS_TABLE_NAME_STR "spider_table_sts" -#define SPIDER_SYS_TABLE_STS_TABLE_NAME_LEN 16 -#define SPIDER_SYS_TABLE_CRD_TABLE_NAME_STR "spider_table_crd" -#define SPIDER_SYS_TABLE_CRD_TABLE_NAME_LEN 16 -#define SPIDER_SYS_RW_TBLS_TABLE_NAME_STR "spider_rewrite_tables" -#define SPIDER_SYS_RW_TBLS_TABLE_NAME_LEN 21 -#define SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_STR "spider_rewrite_table_tables" -#define SPIDER_SYS_RW_TBL_TBLS_TABLE_NAME_LEN 27 -#define SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_STR "spider_rewrite_table_partitions" -#define SPIDER_SYS_RW_TBL_PTTS_TABLE_NAME_LEN 31 -#define SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_STR "spider_rewrite_table_subpartitions" -#define SPIDER_SYS_RW_TBL_SPTTS_TABLE_NAME_LEN 34 -#define SPIDER_SYS_RWN_TBLS_TABLE_NAME_STR "spider_rewritten_tables" -#define SPIDER_SYS_RWN_TBLS_TABLE_NAME_LEN 23 #define SPIDER_SYS_XA_PREPARED_STR "PREPARED" #define SPIDER_SYS_XA_NOT_YET_STR "NOT YET" @@ -65,16 +51,12 @@ #define SPIDER_SYS_TABLE_STS_PK_COL_CNT 2 #define SPIDER_SYS_TABLE_CRD_COL_CNT 4 #define SPIDER_SYS_TABLE_CRD_PK_COL_CNT 3 -#define SPIDER_SYS_RW_TBLS_COL_CNT 3 -#define SPIDER_SYS_RW_TBL_TBLS_COL_CNT 8 -#define SPIDER_SYS_RW_TBL_PTTS_COL_CNT 7 -#define SPIDER_SYS_RW_TBL_SPTTS_COL_CNT 8 -#define SPIDER_SYS_RWN_TBLS_COL_CNT 4 #define SPIDER_SYS_LINK_MON_TABLE_DB_NAME_SIZE 64 #define SPIDER_SYS_LINK_MON_TABLE_TABLE_NAME_SIZE 64 #define SPIDER_SYS_LINK_MON_TABLE_LINK_ID_SIZE 64 +/* For insertion into `spider_mon_table_cache'. */ class SPIDER_MON_KEY: public SPIDER_SORT { public: @@ -313,21 +295,6 @@ TABLE *table ); -int spider_insert_or_update_table_sts( - TABLE *table, - const char *name, - uint name_length, - ha_statistics *stat -); - -int spider_insert_or_update_table_crd( - TABLE *table, - const char *name, - uint name_length, - longlong *cardinality, - uint number_of_keys -); - int spider_log_tables_link_failed( TABLE *table, char *name, @@ -435,7 +402,6 @@ int spider_get_sys_tables_connect_info( TABLE *table, SPIDER_SHARE *share, - int link_idx, MEM_ROOT *mem_root ); @@ -471,17 +437,6 @@ MEM_ROOT *mem_root ); -void spider_get_sys_table_sts_info( - TABLE *table, - ha_statistics *stat -); - -void spider_get_sys_table_crd_info( - TABLE *table, - longlong *cardinality, - uint number_of_keys -); - int spider_sys_update_tables_link_status( THD *thd, char *name, @@ -523,7 +478,6 @@ int spider_get_sys_link_mon_connect_info( TABLE *table, SPIDER_SHARE *share, - int link_idx, MEM_ROOT *mem_root ); @@ -533,54 +487,6 @@ MEM_ROOT *mem_root ); -int spider_sys_insert_or_update_table_sts( - THD *thd, - const char *name, - uint name_length, - ha_statistics *stat, - bool need_lock -); - -int spider_sys_insert_or_update_table_crd( - THD *thd, - const char *name, - uint name_length, - longlong *cardinality, - uint number_of_keys, - bool need_lock -); - -int spider_sys_delete_table_sts( - THD *thd, - const char *name, - uint name_length, - bool need_lock -); - -int spider_sys_delete_table_crd( - THD *thd, - const char *name, - uint name_length, - bool need_lock -); - -int spider_sys_get_table_sts( - THD *thd, - const char *name, - uint name_length, - ha_statistics *stat, - bool need_lock -); - -int spider_sys_get_table_crd( - THD *thd, - const char *name, - uint name_length, - longlong *cardinality, - uint number_of_keys, - bool need_lock -); - int spider_sys_replace( TABLE *table, bool *modified_non_trans_table diff -Nru mariadb-10.11.6/storage/spider/spd_table.cc mariadb-10.11.9/storage/spider/spd_table.cc --- mariadb-10.11.6/storage/spider/spd_table.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_table.cc 2024-08-03 07:29:59.000000000 +0000 @@ -124,6 +124,11 @@ extern SPIDER_DBTON spider_dbton_mariadb; SPIDER_THREAD *spider_table_sts_threads; SPIDER_THREAD *spider_table_crd_threads; +extern volatile ulonglong spider_mon_table_cache_version; +extern volatile ulonglong spider_mon_table_cache_version_req; +extern ulonglong spider_conn_id; +extern Time_zone *UTC; +extern ulonglong spider_thread_id; #ifdef HAVE_PSI_INTERFACE PSI_mutex_key spd_key_mutex_tbl; @@ -988,12 +993,7 @@ tmp_ptr = str; while (*tmp_ptr == ' ') tmp_ptr++; - if (*tmp_ptr) - *list_length = 1; - else { - *string_list = NULL; - DBUG_RETURN(0); - } + *list_length= 1; bool last_esc_flg = FALSE; while (TRUE) @@ -1032,7 +1032,7 @@ } if (!(*string_list = (char**) - spider_bulk_malloc(spider_current_trx, 37, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_STRING_LIST_1, MYF(MY_WME | MY_ZEROFILL), string_list, (uint) (sizeof(char*) * (*list_length)), string_length_list, (uint) (sizeof(int) * (*list_length)), NullS)) @@ -1226,7 +1226,7 @@ } if (!(*long_list = (long*) - spider_bulk_malloc(spider_current_trx, 38, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_LONG_LIST_1, MYF(MY_WME | MY_ZEROFILL), long_list, (uint) (sizeof(long) * (*list_length)), NullS)) ) { @@ -1305,7 +1305,7 @@ } if (!(*longlong_list = (longlong *) - spider_bulk_malloc(spider_current_trx, 39, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_LONGLONG_LIST_1, MYF(MY_WME | MY_ZEROFILL), longlong_list, (uint) (sizeof(longlong) * (*list_length)), NullS)) ) { @@ -1373,7 +1373,7 @@ } if (!(tmp_str_list = (char**) - spider_bulk_malloc(spider_current_trx, 40, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_STRING_LIST_1, MYF(MY_WME | MY_ZEROFILL), &tmp_str_list, (uint) (sizeof(char*) * link_count), &tmp_length_list, (uint) (sizeof(uint) * link_count), NullS)) @@ -1436,7 +1436,7 @@ DBUG_RETURN(0); if (!(tmp_str_list = (char**) - spider_bulk_malloc(spider_current_trx, 247, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_NULL_STRING_LIST_1, MYF(MY_WME | MY_ZEROFILL), &tmp_str_list, (uint) (sizeof(char*) * link_count), &tmp_length_list, (uint) (sizeof(uint) * link_count), NullS)) @@ -1494,7 +1494,7 @@ tmp_long = -1; if (!(tmp_long_list = (long*) - spider_bulk_malloc(spider_current_trx, 41, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_LONG_LIST_1, MYF(MY_WME | MY_ZEROFILL), &tmp_long_list, (uint) (sizeof(long) * link_count), NullS)) ) { @@ -1539,7 +1539,7 @@ tmp_longlong = -1; if (!(tmp_longlong_list = (longlong*) - spider_bulk_malloc(spider_current_trx, 42, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_INCREASE_LONGLONG_LIST_1, MYF(MY_WME | MY_ZEROFILL), &tmp_longlong_list, (uint) (sizeof(longlong) * link_count), NullS)) ) { @@ -2880,7 +2880,7 @@ share_alter = &share->alter_table; share_alter->all_link_count = share->all_link_count; if (!(share_alter->tmp_server_names = (char **) - spider_bulk_malloc(spider_current_trx, 43, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_PARSE_CONNECT_INFO_1, MYF(MY_WME | MY_ZEROFILL), &share_alter->tmp_server_names, (uint) (sizeof(char *) * share->all_link_count), &share_alter->tmp_tgt_table_names, @@ -3468,11 +3468,13 @@ DBUG_RETURN(error_num); } +/* Set default connect info of a SPIDER_SHARE if needed */ int spider_set_connect_info_default( - SPIDER_SHARE *share, - partition_element *part_elem, - partition_element *sub_elem, - TABLE_SHARE *table_share + SPIDER_SHARE *share, /* The `SPIDER_SHARE' to set + default connect info */ + partition_element *part_elem, /* partition info used as input */ + partition_element *sub_elem, /* subpartition info used as input */ + TABLE_SHARE *table_share /* table share info used as input */ ) { bool check_socket; bool check_database; @@ -3706,22 +3708,6 @@ } } -/* - if (!share->static_link_ids[roop_count]) - { - DBUG_PRINT("info",("spider create default static_link_ids")); - share->static_link_ids_lengths[roop_count] = - SPIDER_DB_STATIC_LINK_ID_LEN; - if ( - !(share->static_link_ids[roop_count] = spider_create_string( - SPIDER_DB_STATIC_LINK_ID_STR, - share->static_link_ids_lengths[roop_count])) - ) { - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - } - } -*/ - if (port_has_default_value) { share->tgt_ports[roop_count] = MYSQL_PORT; @@ -3811,7 +3797,11 @@ DBUG_RETURN(0); } - +/* + This function is a no-op if all share->tgt_dbs and + share->tgt_table_names are non-null, otherwise it may assign them + with db_name and table_name +*/ int spider_set_connect_info_default_db_table( SPIDER_SHARE *share, const char *db_name, @@ -3897,6 +3887,11 @@ DBUG_RETURN(0); } +/* + Parse `dbtable_name' into db name and table name, and call + spider_set_connect_info_default_db_table() to set the db/table name + values of `share' if needed +*/ int spider_set_connect_info_default_dbtable( SPIDER_SHARE *share, const char *dbtable_name, @@ -3942,6 +3937,44 @@ } #endif +void spider_create_conn_key_add_one(int* counter, char** target, char* src) +{ + (*counter)++; + if (src) + { + **target= (char) *counter; + *target= strmov(*target + 1, src); + (*target)++; + } +} + +/* + The conn keys are strings of the following format: + + 0 \ \0 \ \0 ... \ \0 + + Where idx1, idx2, etc. are the index of first, second, etc. options + where the value is specified. We have the wrapper as the first + option, host as the second, port as the third, socket as the fourth, + and so on (see below for the order of all options). So here would be + a conn key where only the host and the port are specified and + nothing else: + + 0\002localhost\000\00303306\000 + + And it has length 1 + 1 + 9 + 1 + 1 + 5 + 1 = 19. + + In case of HA, say we have another link with the same options + specified except that the port is 3307, then we place an extra NUL + before placing the next conn_key: + + 0\002localhost\000\00303306\000\0000\002localhost\000\00303307\000 + ^ ^ + conn_keys[0] conn_keys[1] + + Thus the total number of chars (share->conn_keys_charlen) needed is + (19 + 1) * 2 = 40 +*/ int spider_create_conn_keys( SPIDER_SHARE *share ) { @@ -4003,29 +4036,29 @@ } conn_keys_lengths[roop_count] = 1 - + share->tgt_wrappers_lengths[roop_count] + 1 - + share->tgt_hosts_lengths[roop_count] + 1 - + 5 + 1 - + share->tgt_sockets_lengths[roop_count] + 1 - + (tables_on_different_db_are_joinable ? - 0 : share->tgt_dbs_lengths[roop_count] + 1) - + share->tgt_usernames_lengths[roop_count] + 1 - + share->tgt_passwords_lengths[roop_count] + 1 - + share->tgt_ssl_cas_lengths[roop_count] + 1 - + share->tgt_ssl_capaths_lengths[roop_count] + 1 - + share->tgt_ssl_certs_lengths[roop_count] + 1 - + share->tgt_ssl_ciphers_lengths[roop_count] + 1 - + share->tgt_ssl_keys_lengths[roop_count] + 1 - + 1 + 1 - + share->tgt_default_files_lengths[roop_count] + 1 - + share->tgt_default_groups_lengths[roop_count] + 1 - + share->tgt_dsns_lengths[roop_count] + 1 - + share->tgt_filedsns_lengths[roop_count] + 1 - + share->tgt_drivers_lengths[roop_count]; - share->conn_keys_charlen += conn_keys_lengths[roop_count] + 2; + + (share->tgt_wrappers[roop_count] ? share->tgt_wrappers_lengths[roop_count] + 2 : 0) + + (share->tgt_hosts[roop_count] ? share->tgt_hosts_lengths[roop_count] + 2 : 0) + + 5 + 2 + + (share->tgt_sockets[roop_count] ? share->tgt_sockets_lengths[roop_count] + 2 : 0) + + (!tables_on_different_db_are_joinable && share->tgt_dbs[roop_count] ? + share->tgt_dbs_lengths[roop_count] + 2 : 0) + + (share->tgt_usernames[roop_count] ? share->tgt_usernames_lengths[roop_count] + 2 : 0) + + (share->tgt_passwords[roop_count] ? share->tgt_passwords_lengths[roop_count] + 2 : 0) + + (share->tgt_ssl_cas[roop_count] ? share->tgt_ssl_cas_lengths[roop_count] + 2 : 0) + + (share->tgt_ssl_capaths[roop_count] ? share->tgt_ssl_capaths_lengths[roop_count] + 2 : 0) + + (share->tgt_ssl_certs[roop_count] ? share->tgt_ssl_certs_lengths[roop_count] + 2 : 0) + + (share->tgt_ssl_ciphers[roop_count] ? share->tgt_ssl_ciphers_lengths[roop_count] + 2 : 0) + + (share->tgt_ssl_keys[roop_count] ? share->tgt_ssl_keys_lengths[roop_count] + 2 : 0) + + 1 + 2 + + (share->tgt_default_files[roop_count] ? share->tgt_default_files_lengths[roop_count] + 2 : 0) + + (share->tgt_default_groups[roop_count] ? share->tgt_default_groups_lengths[roop_count] + 2 : 0) + + (share->tgt_dsns[roop_count] ? share->tgt_dsns_lengths[roop_count] + 2 : 0) + + (share->tgt_filedsns[roop_count] ? share->tgt_filedsns_lengths[roop_count] + 2 : 0) + + (share->tgt_drivers[roop_count] ? share->tgt_drivers_lengths[roop_count] + 2 : 0); + share->conn_keys_charlen += conn_keys_lengths[roop_count] + 1; } if (!(share->conn_keys = (char **) - spider_bulk_alloc_mem(spider_current_trx, 45, + spider_bulk_alloc_mem(spider_current_trx, SPD_MID_CREATE_CONN_KEYS_1, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &share->conn_keys, sizeof(char *) * share->all_link_count, &share->conn_keys_lengths, length_base, @@ -4059,123 +4092,37 @@ share->conn_keys[roop_count] = tmp_name; *tmp_name = '0'; - DBUG_PRINT("info",("spider tgt_wrappers[%d]=%s", roop_count, - share->tgt_wrappers[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_wrappers[roop_count]); - if (share->tgt_hosts[roop_count]) - { - DBUG_PRINT("info",("spider tgt_hosts[%d]=%s", roop_count, - share->tgt_hosts[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_hosts[roop_count]); - } else { - tmp_name++; - } + tmp_name++; + int counter= 0; + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_wrappers[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_hosts[roop_count]); my_sprintf(port_str, (port_str, "%05ld", share->tgt_ports[roop_count])); - DBUG_PRINT("info",("spider port_str=%s", port_str)); - tmp_name = strmov(tmp_name + 1, port_str); - if (share->tgt_sockets[roop_count]) - { - DBUG_PRINT("info",("spider tgt_sockets[%d]=%s", roop_count, - share->tgt_sockets[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_sockets[roop_count]); - } else - tmp_name++; - if (!tables_on_different_db_are_joinable) - { - if (share->tgt_dbs[roop_count]) - { - DBUG_PRINT("info",("spider tgt_dbs[%d]=%s", roop_count, - share->tgt_dbs[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_dbs[roop_count]); - } else - tmp_name++; - } - if (share->tgt_usernames[roop_count]) - { - DBUG_PRINT("info",("spider tgt_usernames[%d]=%s", roop_count, - share->tgt_usernames[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_usernames[roop_count]); - } else - tmp_name++; - if (share->tgt_passwords[roop_count]) + spider_create_conn_key_add_one(&counter, &tmp_name, port_str); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_sockets[roop_count]); + counter++; + if (!tables_on_different_db_are_joinable && share->tgt_dbs[roop_count]) { - DBUG_PRINT("info",("spider tgt_passwords[%d]=%s", roop_count, - share->tgt_passwords[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_passwords[roop_count]); - } else - tmp_name++; - if (share->tgt_ssl_cas[roop_count]) - { - DBUG_PRINT("info",("spider tgt_ssl_cas[%d]=%s", roop_count, - share->tgt_ssl_cas[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_ssl_cas[roop_count]); - } else - tmp_name++; - if (share->tgt_ssl_capaths[roop_count]) - { - DBUG_PRINT("info",("spider tgt_ssl_capaths[%d]=%s", roop_count, - share->tgt_ssl_capaths[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_ssl_capaths[roop_count]); - } else - tmp_name++; - if (share->tgt_ssl_certs[roop_count]) - { - DBUG_PRINT("info",("spider tgt_ssl_certs[%d]=%s", roop_count, - share->tgt_ssl_certs[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_ssl_certs[roop_count]); - } else - tmp_name++; - if (share->tgt_ssl_ciphers[roop_count]) - { - DBUG_PRINT("info",("spider tgt_ssl_ciphers[%d]=%s", roop_count, - share->tgt_ssl_ciphers[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_ssl_ciphers[roop_count]); - } else - tmp_name++; - if (share->tgt_ssl_keys[roop_count]) - { - DBUG_PRINT("info",("spider tgt_ssl_keys[%d]=%s", roop_count, - share->tgt_ssl_keys[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_ssl_keys[roop_count]); - } else + *tmp_name= (char) counter; + tmp_name = strmov(tmp_name + 1, share->tgt_dbs[roop_count]); tmp_name++; + } + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_usernames[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_passwords[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_ssl_cas[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_ssl_capaths[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_ssl_certs[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_ssl_ciphers[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_ssl_keys[roop_count]); + counter++; + *tmp_name= (char) counter; tmp_name++; *tmp_name = '0' + ((char) share->tgt_ssl_vscs[roop_count]); - if (share->tgt_default_files[roop_count]) - { - DBUG_PRINT("info",("spider tgt_default_files[%d]=%s", roop_count, - share->tgt_default_files[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_default_files[roop_count]); - } else - tmp_name++; - if (share->tgt_default_groups[roop_count]) - { - DBUG_PRINT("info",("spider tgt_default_groups[%d]=%s", roop_count, - share->tgt_default_groups[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_default_groups[roop_count]); - } else - tmp_name++; - if (share->tgt_dsns[roop_count]) - { - DBUG_PRINT("info",("spider tgt_dsns[%d]=%s", roop_count, - share->tgt_dsns[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_dsns[roop_count]); - } else - tmp_name++; - if (share->tgt_filedsns[roop_count]) - { - DBUG_PRINT("info",("spider tgt_filedsns[%d]=%s", roop_count, - share->tgt_filedsns[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_filedsns[roop_count]); - } else - tmp_name++; - if (share->tgt_drivers[roop_count]) - { - DBUG_PRINT("info",("spider tgt_drivers[%d]=%s", roop_count, - share->tgt_drivers[roop_count])); - tmp_name = strmov(tmp_name + 1, share->tgt_drivers[roop_count]); - } else - tmp_name++; + tmp_name++; + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_default_files[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_default_groups[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_dsns[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_filedsns[roop_count]); + spider_create_conn_key_add_one(&counter, &tmp_name, share->tgt_drivers[roop_count]); tmp_name++; tmp_name++; share->conn_keys_hash_value[roop_count] = my_calc_hash( @@ -4218,7 +4165,7 @@ length = (uint) strlen(table_name); bitmap_size = spider_bitmap_size(table_share->fields); if (!(share = (SPIDER_SHARE *) - spider_bulk_malloc(spider_current_trx, 46, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_SHARE_1, MYF(MY_WME | MY_ZEROFILL), &share, (uint) (sizeof(*share)), &tmp_name, (uint) (length + 1), &tmp_static_key_cardinality, @@ -4256,14 +4203,14 @@ share->table.key_info = table_share->key_info; share->table.read_set = &table_share->all_set; - if (table_share->keys > 0 && - !(share->key_hint = new spider_string[table_share->keys]) - ) { - *error_num = HA_ERR_OUT_OF_MEM; - goto error_init_hint_string; - } + if (table_share->keys > 0) + if (!(share->key_hint = new spider_string[table_share->keys])) + { + *error_num = HA_ERR_OUT_OF_MEM; + goto error_init_hint_string; + } for (roop_count = 0; roop_count < (int) table_share->keys; roop_count++) - share->key_hint[roop_count].init_calc_mem(95); + share->key_hint[roop_count].init_calc_mem(SPD_MID_CREATE_SHARE_2); DBUG_PRINT("info",("spider share->key_hint=%p", share->key_hint)); if ((*error_num = spider_parse_connect_info(share, table_share, @@ -4450,7 +4397,7 @@ ((char *) lex_str.str)[lex_str.length] = '\0'; DBUG_PRINT("info",("spider loop check param name=%s", lex_str.str)); loop_check = get_variable(&thd->user_vars, &lex_str, FALSE); - if (loop_check && loop_check->type == STRING_RESULT) + if (loop_check && loop_check->type_handler()->result_type() == STRING_RESULT) { lex_str.length = top_share->path.length + spider_unique_id.length + 1; lex_str.str = loop_check_buf + buf_sz - top_share->path.length - @@ -4685,7 +4632,7 @@ } if (!(spider->conn_keys = (char **) - spider_bulk_alloc_mem(spider_current_trx, 47, + spider_bulk_alloc_mem(spider_current_trx, SPD_MID_GET_SHARE_1, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &spider->conn_keys, sizeof(char *) * share->link_count, &tmp_name, sizeof(char) * share->conn_keys_charlen, @@ -5140,7 +5087,7 @@ } if (!(spider->conn_keys = (char **) - spider_bulk_alloc_mem(spider_current_trx, 49, + spider_bulk_alloc_mem(spider_current_trx, SPD_MID_GET_SHARE_2, __func__, __FILE__, __LINE__, MYF(MY_WME | MY_ZEROFILL), &spider->conn_keys, sizeof(char *) * share->link_count, &tmp_name, sizeof(char) * share->conn_keys_charlen, @@ -5443,8 +5390,6 @@ ) { DBUG_ENTER("spider_free_share"); pthread_mutex_lock(&spider_tbl_mutex); - bool do_delete_thd = false; - THD *thd = current_thd; if (!--share->use_count) { spider_free_sts_thread(share); @@ -5460,49 +5405,6 @@ spider_table_remove_share_from_crd_thread(share); spider_free_spider_object_for_share(&share->crd_spider); } - if ( - share->sts_init && - share->table_share->tmp_table == NO_TMP_TABLE && - spider_param_store_last_sts(share->store_last_sts) - ) { - if (!thd) - { - /* Create a thread for Spider system table update */ - thd = spider_create_thd(); - if (!thd) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - do_delete_thd = TRUE; - } - spider_sys_insert_or_update_table_sts( - thd, - share->lgtm_tblhnd_share->table_name, - share->lgtm_tblhnd_share->table_name_length, - &share->stat, - FALSE - ); - } - if ( - share->crd_init && - share->table_share->tmp_table == NO_TMP_TABLE && - spider_param_store_last_crd(share->store_last_crd) - ) { - if (!thd) - { - /* Create a thread for Spider system table update */ - thd = spider_create_thd(); - if (!thd) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - do_delete_thd = TRUE; - } - spider_sys_insert_or_update_table_crd( - thd, - share->lgtm_tblhnd_share->table_name, - share->lgtm_tblhnd_share->table_name_length, - share->cardinality, - share->table_share->fields, - FALSE - ); - } spider_free_share_alloc(share); my_hash_delete(&spider_open_tables, (uchar*) share); pthread_mutex_destroy(&share->crd_mutex); @@ -5511,8 +5413,6 @@ free_root(&share->mem_root, MYF(0)); spider_free(spider_current_trx, share, MYF(0)); } - if (do_delete_thd) - spider_destroy_thd(thd); pthread_mutex_unlock(&spider_tbl_mutex); DBUG_RETURN(0); } @@ -5568,7 +5468,7 @@ { DBUG_PRINT("info",("spider create new lgtm tblhnd share")); if (!(lgtm_tblhnd_share = (SPIDER_LGTM_TBLHND_SHARE *) - spider_bulk_malloc(spider_current_trx, 244, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_GET_LGTM_TBLHND_SHARE_1, MYF(MY_WME | MY_ZEROFILL), &lgtm_tblhnd_share, (uint) (sizeof(*lgtm_tblhnd_share)), &tmp_name, (uint) (table_name_length + 1), NullS)) @@ -5654,7 +5554,7 @@ { DBUG_PRINT("info",("spider create new wide share")); if (!(wide_share = (SPIDER_WIDE_SHARE *) - spider_bulk_malloc(spider_current_trx, 51, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_GET_PT_SHARE_1, MYF(MY_WME | MY_ZEROFILL), &wide_share, sizeof(SPIDER_WIDE_SHARE), &tmp_name, (uint) (table_share->path.length + 1), &tmp_cardinality, @@ -5844,7 +5744,7 @@ (error_num = spider_get_sys_tables( table_tables, &db_name, &table_name, &mem_root)) || (error_num = spider_get_sys_tables_connect_info( - table_tables, &tmp_share, 0, &mem_root)) || + table_tables, &tmp_share, &mem_root)) || (error_num = spider_set_connect_info_default( &tmp_share, NULL, @@ -5946,7 +5846,7 @@ spider->wide_handler->lock_type = TL_READ_NO_INSERT; if (!(share = (SPIDER_SHARE *) - spider_bulk_malloc(spider_current_trx, 52, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_OPEN_ALL_TABLES_1, MYF(MY_WME | MY_ZEROFILL), &share, (uint) (sizeof(*share)), &connect_info, (uint) (sizeof(char *) * SPIDER_TMP_SHARE_CHAR_PTR_COUNT), @@ -6131,7 +6031,11 @@ } spider_rollback(spider_hton_ptr, thd, TRUE); + + Dummy_error_handler deh; // suppress network errors at this stage + thd->push_internal_handler(&deh); spider_free_trx(trx, TRUE, false); + thd->pop_internal_handler(); DBUG_RETURN(0); } @@ -6162,26 +6066,13 @@ void *p ) { int roop_count; - bool do_delete_thd; - THD *thd = current_thd, *tmp_thd; + THD *tmp_thd; SPIDER_CONN *conn; SPIDER_INIT_ERROR_TABLE *spider_init_error_table; SPIDER_TABLE_MON_LIST *table_mon_list; SPIDER_LGTM_TBLHND_SHARE *lgtm_tblhnd_share; DBUG_ENTER("spider_db_done"); - /* Begin Spider plugin deinit */ - if (thd) - do_delete_thd = FALSE; - else - { - /* Create a thread for Spider plugin deinit */ - thd = spider_create_thd(); - if (!thd) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - do_delete_thd = TRUE; - } - for (roop_count = SPIDER_DBTON_SIZE - 1; roop_count >= 0; roop_count--) { if (spider_dbton[roop_count].deinit) @@ -6315,6 +6206,7 @@ pthread_mutex_destroy(&spider_tbl_mutex); pthread_attr_destroy(&spider_pt_attr); + spider_hton_ptr= NULL; for (roop_count = 0; roop_count < SPIDER_MEM_CALC_LIST_NUM; roop_count++) { if (spider_alloc_func_name[roop_count]) @@ -6331,13 +6223,6 @@ )); } - /* End Spider plugin deinit */ - if (do_delete_thd) - spider_destroy_thd(thd); - -/* -DBUG_ASSERT(0); -*/ DBUG_RETURN(0); } @@ -6393,6 +6278,17 @@ DBUG_RETURN(FALSE); } + +/* + Spider is typically loaded before ddl_recovery, but DDL statements + cannot be executed before ddl_recovery, so we delay system table creation. +*/ +static int spider_after_ddl_recovery(handlerton *) +{ + DBUG_EXECUTE_IF("fail_spider_ddl_recovery_done", return 1;); + return spider_init_system_tables(); +} + int spider_db_init( void *p ) { @@ -6402,6 +6298,12 @@ handlerton *spider_hton = (handlerton *)p; DBUG_ENTER("spider_db_init"); + spider_mon_table_cache_version= 0; + spider_mon_table_cache_version_req= 1; + spider_conn_id= 1; + spider_conn_mutex_id= 0; + UTC = 0; + spider_thread_id = 1; const LEX_CSTRING aria_name={STRING_WITH_LEN("Aria")}; if (!plugin_is_ready(&aria_name, MYSQL_STORAGE_ENGINE_PLUGIN)) DBUG_RETURN(HA_ERR_RETRY_INIT); @@ -6412,17 +6314,8 @@ #ifdef HTON_CAN_READ_CONNECT_STRING_IN_PARTITION spider_hton->flags |= HTON_CAN_READ_CONNECT_STRING_IN_PARTITION; #endif - /* spider_hton->db_type = DB_TYPE_SPIDER; */ - /* - spider_hton->savepoint_offset; - spider_hton->savepoint_set = spider_savepoint_set; - spider_hton->savepoint_rollback = spider_savepoint_rollback; - spider_hton->savepoint_release = spider_savepoint_release; - spider_hton->create_cursor_read_view = spider_create_cursor_read_view; - spider_hton->set_cursor_read_view = spider_set_cursor_read_view; - spider_hton->close_cursor_read_view = spider_close_cursor_read_view; - */ spider_hton->panic = spider_panic; + spider_hton->signal_ddl_recovery_done= spider_after_ddl_recovery; spider_hton->close_connection = spider_close_connection; spider_hton->start_consistent_snapshot = spider_start_consistent_snapshot; spider_hton->flush_logs = spider_flush_logs; @@ -6478,10 +6371,6 @@ if (pthread_attr_init(&spider_pt_attr)) goto error_pt_attr_init; -/* - if (pthread_attr_setdetachstate(&spider_pt_attr, PTHREAD_CREATE_DETACHED)) - goto error_pt_attr_setstate; -*/ if (mysql_mutex_init(spd_key_mutex_tbl, &spider_tbl_mutex, MY_MUTEX_INIT_FAST)) @@ -6535,7 +6424,7 @@ (my_hash_get_key) spider_tbl_get_key, 0, 0)) goto error_open_tables_hash_init; - spider_alloc_calc_mem_init(spider_open_tables, 143); + spider_alloc_calc_mem_init(spider_open_tables, SPD_MID_DB_INIT_1); spider_alloc_calc_mem(NULL, spider_open_tables, spider_open_tables.array.max_element * @@ -6544,7 +6433,7 @@ (my_hash_get_key) spider_tbl_get_key, 0, 0)) goto error_init_error_tables_hash_init; - spider_alloc_calc_mem_init(spider_init_error_tables, 144); + spider_alloc_calc_mem_init(spider_init_error_tables, SPD_MID_DB_INIT_2); spider_alloc_calc_mem(NULL, spider_init_error_tables, spider_init_error_tables.array.max_element * @@ -6555,7 +6444,7 @@ ) goto error_open_wide_share_hash_init; - spider_alloc_calc_mem_init(spider_open_wide_share, 145); + spider_alloc_calc_mem_init(spider_open_wide_share, SPD_MID_DB_INIT_3); spider_alloc_calc_mem(NULL, spider_open_wide_share, spider_open_wide_share.array.max_element * @@ -6565,7 +6454,7 @@ (my_hash_get_key) spider_lgtm_tblhnd_share_hash_get_key, 0, 0)) goto error_lgtm_tblhnd_share_hash_init; - spider_alloc_calc_mem_init(spider_lgtm_tblhnd_share_hash, 245); + spider_alloc_calc_mem_init(spider_lgtm_tblhnd_share_hash, SPD_MID_DB_INIT_4); spider_alloc_calc_mem(NULL, spider_lgtm_tblhnd_share_hash, spider_lgtm_tblhnd_share_hash.array.max_element * @@ -6579,7 +6468,7 @@ spider_free_ipport_conn, 0)) goto error_ipport_conn__hash_init; - spider_alloc_calc_mem_init(spider_open_connections, 146); + spider_alloc_calc_mem_init(spider_open_connections, SPD_MID_DB_INIT_5); spider_alloc_calc_mem(NULL, spider_open_connections, spider_open_connections.array.max_element * @@ -6588,7 +6477,7 @@ (my_hash_get_key) spider_allocated_thds_get_key, 0, 0)) goto error_allocated_thds_hash_init; - spider_alloc_calc_mem_init(spider_allocated_thds, 149); + spider_alloc_calc_mem_init(spider_allocated_thds, SPD_MID_DB_INIT_8); spider_alloc_calc_mem(NULL, spider_allocated_thds, spider_allocated_thds.array.max_element * @@ -6598,14 +6487,14 @@ NULL, 64, 64, MYF(MY_WME))) goto error_mon_table_cache_array_init; - spider_alloc_calc_mem_init(spider_mon_table_cache, 165); + spider_alloc_calc_mem_init(spider_mon_table_cache, SPD_MID_DB_INIT_9); spider_alloc_calc_mem(NULL, spider_mon_table_cache, spider_mon_table_cache.max_element * spider_mon_table_cache.size_of_element); if (!(spider_udf_table_mon_mutexes = (pthread_mutex_t *) - spider_bulk_malloc(NULL, 53, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(NULL, SPD_MID_DB_INIT_10, MYF(MY_WME | MY_ZEROFILL), &spider_udf_table_mon_mutexes, (uint) (sizeof(pthread_mutex_t) * spider_udf_table_mon_mutex_count), &spider_udf_table_mon_conds, (uint) (sizeof(pthread_cond_t) * @@ -6641,27 +6530,22 @@ (my_hash_get_key) spider_udf_tbl_mon_list_key, 0, 0)) goto error_init_udf_table_mon_list_hash; - spider_alloc_calc_mem_init(spider_udf_table_mon_list_hash, 150); + spider_alloc_calc_mem_init(spider_udf_table_mon_list_hash, SPD_MID_DB_INIT_11); spider_alloc_calc_mem(NULL, spider_udf_table_mon_list_hash, spider_udf_table_mon_list_hash[roop_count].array.max_element * spider_udf_table_mon_list_hash[roop_count].array.size_of_element); } - if (spider_init_system_tables()) - { - goto error_system_table_creation; - } - if (!(spider_table_sts_threads = (SPIDER_THREAD *) - spider_bulk_malloc(NULL, 256, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(NULL, SPD_MID_DB_INIT_12, MYF(MY_WME | MY_ZEROFILL), &spider_table_sts_threads, (uint) (sizeof(SPIDER_THREAD) * spider_param_table_sts_thread_count()), &spider_table_crd_threads, (uint) (sizeof(SPIDER_THREAD) * spider_param_table_crd_thread_count()), NullS)) ) - goto error_alloc_mon_mutxes; + goto error_alloc_table_sts_crd_threads; for (roop_count = 0; roop_count < (int) spider_param_table_sts_thread_count(); @@ -6722,6 +6606,7 @@ { spider_free_sts_threads(&spider_table_sts_threads[roop_count]); } +error_alloc_table_sts_crd_threads: spider_free(NULL, spider_table_sts_threads, MYF(0)); roop_count= spider_udf_table_mon_mutex_count - 1; error_init_udf_table_mon_list_hash: @@ -6737,7 +6622,6 @@ error_init_udf_table_mon_cond: for (; roop_count >= 0; roop_count--) pthread_cond_destroy(&spider_udf_table_mon_conds[roop_count]); -error_system_table_creation: roop_count= spider_udf_table_mon_mutex_count - 1; error_init_udf_table_mon_mutex: for (; roop_count >= 0; roop_count--) @@ -6826,7 +6710,7 @@ ) { char *res; DBUG_ENTER("spider_create_string"); - if (!(res = (char*) spider_malloc(spider_current_trx, 13, length + 1, + if (!(res = (char*) spider_malloc(spider_current_trx, SPD_MID_CREATE_STRING_1, length + 1, MYF(MY_WME)))) DBUG_RETURN(NULL); memcpy(res, str, length); @@ -6848,7 +6732,7 @@ if (sub_name) length += sizeof("#SP#") - 1 + strlen(sub_name); } - if (!(res = (char*) spider_malloc(spider_current_trx, 14, length + 1, + if (!(res = (char*) spider_malloc(spider_current_trx, SPD_MID_CREATE_TABLE_NAME_STRING_1, length + 1, MYF(MY_WME)))) DBUG_RETURN(NULL); tmp = strmov(res, table_name); @@ -6968,7 +6852,6 @@ ) { int get_type; int error_num = 0; - bool need_to_get = TRUE; DBUG_ENTER("spider_get_sts"); if ( @@ -7004,34 +6887,10 @@ /* copy */ get_type = 0; } - if ( - !share->sts_init && - share->table_share->tmp_table == NO_TMP_TABLE && - spider_param_load_sts_at_startup(share->load_sts_at_startup) && - (!share->init || share->init_error) - ) { - error_num = spider_sys_get_table_sts( - current_thd, - share->lgtm_tblhnd_share->table_name, - share->lgtm_tblhnd_share->table_name_length, - &share->stat, - FALSE - ); - if ( - !error_num || - (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) - ) - need_to_get = FALSE; - } - - if (need_to_get) - { - if (get_type == 0) - spider_copy_sts_to_share(share, share->wide_share); - else { - error_num = spider_db_show_table_status(spider, link_idx, sts_mode, flag); - } - } + if (get_type == 0) + spider_copy_sts_to_share(share, share->wide_share); + else + error_num = spider_db_show_table_status(spider, link_idx, sts_mode, flag); if (get_type >= 2) pthread_mutex_unlock(&share->wide_share->sts_mutex); if (error_num) @@ -7103,7 +6962,6 @@ ) { int get_type; int error_num = 0; - bool need_to_get = TRUE; DBUG_ENTER("spider_get_crd"); if ( @@ -7139,35 +6997,6 @@ /* copy */ get_type = 0; } - if ( - !share->crd_init && - share->table_share->tmp_table == NO_TMP_TABLE && - spider_param_load_sts_at_startup(share->load_crd_at_startup) - ) { - error_num = spider_sys_get_table_crd( - current_thd, - share->lgtm_tblhnd_share->table_name, - share->lgtm_tblhnd_share->table_name_length, - share->cardinality, - table->s->fields, - FALSE - ); - if ( - !error_num || - (error_num != HA_ERR_KEY_NOT_FOUND && error_num != HA_ERR_END_OF_FILE) - ) - need_to_get = FALSE; - } - - if (need_to_get) - { - if (get_type == 0) - spider_copy_crd_to_share(share, share->wide_share, - table->s->fields); - else { - error_num = spider_db_show_index(spider, link_idx, table, crd_mode); - } - } if (get_type >= 2) pthread_mutex_unlock(&share->wide_share->crd_mutex); if (error_num) @@ -7284,7 +7113,7 @@ DBUG_RETURN(NULL); } if (!(spider_init_error_table = (SPIDER_INIT_ERROR_TABLE *) - spider_bulk_malloc(spider_current_trx, 54, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_GET_INIT_ERROR_TABLE_1, MYF(MY_WME | MY_ZEROFILL), &spider_init_error_table, (uint) (sizeof(*spider_init_error_table)), &tmp_name, (uint) (share->table_name_length + 1), NullS)) @@ -8345,7 +8174,7 @@ char buf[MAX_FIELD_WIDTH]; spider_string str(buf, sizeof(buf), system_charset_info); DBUG_ENTER("spider_discover_table_structure"); - str.init_calc_mem(229); + str.init_calc_mem(SPD_MID_DISCOVER_TABLE_STRUCTURE_1); str.length(0); if (str.reserve( SPIDER_SQL_CREATE_TABLE_LEN + share->db.length + @@ -8676,7 +8505,7 @@ } DBUG_PRINT("info",("spider spider=%p", (*spider))); if (!(need_mons = (int *) - spider_bulk_malloc(spider_current_trx, 255, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_SPIDER_OBJECT_FOR_SHARE_2, MYF(MY_WME | MY_ZEROFILL), &need_mons, (uint) (sizeof(int) * share->link_count), &conns, (uint) (sizeof(SPIDER_CONN *) * share->link_count), &conn_link_idx, (uint) (sizeof(uint) * share->link_count), diff -Nru mariadb-10.11.6/storage/spider/spd_table.h mariadb-10.11.9/storage/spider/spd_table.h --- mariadb-10.11.6/storage/spider/spd_table.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_table.h 2024-08-03 07:29:59.000000000 +0000 @@ -165,6 +165,8 @@ ); #endif +void spider_create_conn_key_add_one(int* counter, char** target, char* src); + int spider_create_conn_keys( SPIDER_SHARE *share ); diff -Nru mariadb-10.11.6/storage/spider/spd_trx.cc mariadb-10.11.9/storage/spider/spd_trx.cc --- mariadb-10.11.6/storage/spider/spd_trx.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/spider/spd_trx.cc 2024-08-03 07:29:59.000000000 +0000 @@ -41,7 +41,7 @@ extern handlerton *spider_hton_ptr; extern SPIDER_DBTON spider_dbton[SPIDER_DBTON_SIZE]; pthread_mutex_t spider_thread_id_mutex; -ulonglong spider_thread_id = 1; +ulonglong spider_thread_id; #ifdef HAVE_PSI_INTERFACE extern PSI_mutex_key spd_key_mutex_udf_table; @@ -166,7 +166,7 @@ spider_string sql_str(sql_buf, sizeof(sql_buf), system_charset_info); DBUG_ENTER("spider_trx_another_lock_tables"); SPIDER_BACKUP_DASTATUS; - sql_str.init_calc_mem(188); + sql_str.init_calc_mem(SPD_MID_TRX_ANOTHER_LOCK_TABLES_1); sql_str.length(0); memset((void*)&tmp_spider, 0, sizeof(ha_spider)); memset((void*)&tmp_share, 0, sizeof(SPIDER_SHARE)); @@ -482,7 +482,7 @@ share_alter = &share->alter_table; if (!(alter_table = (SPIDER_ALTER_TABLE *) - spider_bulk_malloc(spider_current_trx, 55, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_TRX_ALTER_TABLE_1, MYF(MY_WME | MY_ZEROFILL), &alter_table, (uint) (sizeof(*alter_table)), &tmp_name, (uint) (sizeof(char) * (share->table_name_length + 1)), @@ -1124,6 +1124,7 @@ DBUG_RETURN(0); } +/* Get or create a trx associated with the given THD. */ SPIDER_TRX *spider_get_trx( THD *thd, bool regist_allocated_thds, @@ -1142,7 +1143,7 @@ ) { DBUG_PRINT("info",("spider create new trx")); if (!(trx = (SPIDER_TRX *) - spider_bulk_malloc(NULL, 56, MYF(MY_WME | MY_ZEROFILL), + spider_bulk_malloc(NULL, SPD_MID_GET_TRX_1, MYF(MY_WME | MY_ZEROFILL), &trx, (uint) (sizeof(*trx)), &tmp_share, (uint) (sizeof(SPIDER_SHARE)), &tmp_wide_handler, (uint) sizeof(SPIDER_WIDE_HANDLER), @@ -1171,7 +1172,7 @@ spider_conn_get_key, 0, 0) ) goto error_init_hash; - spider_alloc_calc_mem_init(trx->trx_conn_hash, 151); + spider_alloc_calc_mem_init(trx->trx_conn_hash, SPD_MID_GET_TRX_2); spider_alloc_calc_mem( thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_conn_hash, @@ -1184,7 +1185,7 @@ spider_conn_get_key, 0, 0) ) goto error_init_another_hash; - spider_alloc_calc_mem_init(trx->trx_another_conn_hash, 152); + spider_alloc_calc_mem_init(trx->trx_another_conn_hash, SPD_MID_GET_TRX_3); spider_alloc_calc_mem( thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_another_conn_hash, @@ -1197,7 +1198,7 @@ spider_alter_tbl_get_key, 0, 0) ) goto error_init_alter_hash; - spider_alloc_calc_mem_init(trx->trx_alter_table_hash, 157); + spider_alloc_calc_mem_init(trx->trx_alter_table_hash, SPD_MID_GET_TRX_8); spider_alloc_calc_mem( thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_alter_table_hash, @@ -1210,7 +1211,7 @@ spider_trx_ha_get_key, 0, 0) ) goto error_init_trx_ha_hash; - spider_alloc_calc_mem_init(trx->trx_ha_hash, 158); + spider_alloc_calc_mem_init(trx->trx_ha_hash, SPD_MID_GET_TRX_9); spider_alloc_calc_mem( thd ? ((SPIDER_TRX *) thd_get_ha_data(thd, spider_hton_ptr)) : NULL, trx->trx_ha_hash, @@ -1262,7 +1263,7 @@ for (roop_count2 = 0; roop_count2 < (int) trx->tmp_share->link_count; ++roop_count2) { - trx->tmp_spider->result_list.sqls[roop_count2].init_calc_mem(121); + trx->tmp_spider->result_list.sqls[roop_count2].init_calc_mem(SPD_MID_GET_TRX_10); trx->tmp_spider->result_list.sqls[roop_count2].set_charset( trx->tmp_share->access_charset); } @@ -3164,6 +3165,14 @@ DBUG_RETURN(0); /* transaction is not started */ + /* In case the rollback happens due to failure of LOCK TABLE, we + need to clear the list of tables to lock. */ + for (uint i= 0; i < trx->trx_conn_hash.records; i++) + { + conn= (SPIDER_CONN *) my_hash_element(&trx->trx_conn_hash, i); + conn->db_conn->reset_lock_table_hash(); + } + if (all || (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN))) { if (trx->trx_start) @@ -3663,6 +3672,13 @@ DBUG_VOID_RETURN; } +/* + Check the info of a given SPIDER_TRX_HA with spider->share. If it + does not match or if the given SPIDER_TRX_HA is NULL, then create a + new one from spider and spider->share, and add the new SPIDER_TRX_HA + to trx->trx_ha_hash. On mismatch and non-NULL trx_ha, then it will + be removed from the hash and freed before the creation of a new one. +*/ int spider_create_trx_ha( SPIDER_TRX *trx, ha_spider *spider, @@ -3695,7 +3711,7 @@ if (need_create) { if (!(trx_ha = (SPIDER_TRX_HA *) - spider_bulk_malloc(spider_current_trx, 58, MYF(MY_WME), + spider_bulk_malloc(spider_current_trx, SPD_MID_CREATE_TRX_HA_1, MYF(MY_WME), &trx_ha, (uint) (sizeof(SPIDER_TRX_HA)), &tmp_name, (uint) (sizeof(char *) * (share->table_name_length + 1)), &conn_link_idx, (uint) (sizeof(uint) * share->link_count), @@ -3708,7 +3724,6 @@ memcpy(trx_ha->table_name, share->table_name, share->table_name_length); trx_ha->table_name[share->table_name_length] = '\0'; trx_ha->table_name_length = share->table_name_length; - trx_ha->trx = trx; trx_ha->share = share; trx_ha->link_count = share->link_count; trx_ha->link_bitmap_size = share->link_bitmap_size; @@ -3743,15 +3758,29 @@ SPIDER_TRX_HA *trx_ha; SPIDER_SHARE *share = spider->share; DBUG_ENTER("spider_check_trx_ha"); + /* + Check for mismatch in trx_ha->share, link_count and + link_bitmap_size, which is an indication of a share that has been + freed. Delete the trx_ha and return NULL on mismatch. + */ if ((trx_ha = (SPIDER_TRX_HA *) my_hash_search_using_hash_value( &trx->trx_ha_hash, share->table_name_hash_value, (uchar*) share->table_name, share->table_name_length))) { - memcpy(spider->conn_link_idx, trx_ha->conn_link_idx, - sizeof(uint) * share->link_count); - memcpy(spider->conn_can_fo, trx_ha->conn_can_fo, - sizeof(uint) * share->link_bitmap_size); - DBUG_RETURN(trx_ha); + if (trx_ha->share == share && trx_ha->link_count == share->link_count && + trx_ha->link_bitmap_size == share->link_bitmap_size) + { + memcpy(spider->conn_link_idx, trx_ha->conn_link_idx, + sizeof(uint) * share->link_count); + memcpy(spider->conn_can_fo, trx_ha->conn_can_fo, + sizeof(uint) * share->link_bitmap_size); + DBUG_RETURN(trx_ha); + } + else + { + my_hash_delete(&trx->trx_ha_hash, (uchar*) trx_ha); + spider_free(trx, trx_ha, MYF(0)); + } } DBUG_RETURN(NULL); } @@ -3793,6 +3822,15 @@ DBUG_VOID_RETURN; } +/** + Sets link indices for load balancing read connections + + Assuming `spider->share->link_count` is the number of active servers + to use, this function updates `spider->conn_link_idx` with the first + server in the same "modulus group" whose link status is not + `SPIDER_LINK_STATUS_NG`, or if one cannot be found, use the + `link_idx`th server +*/ void spider_trx_set_link_idx_for_all( ha_spider *spider ) { diff -Nru mariadb-10.11.6/storage/test_sql_discovery/test_sql_discovery.cc mariadb-10.11.9/storage/test_sql_discovery/test_sql_discovery.cc --- mariadb-10.11.6/storage/test_sql_discovery/test_sql_discovery.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/storage/test_sql_discovery/test_sql_discovery.cc 2024-08-03 07:29:59.000000000 +0000 @@ -48,7 +48,7 @@ { thr_lock_init(&lock); } - ~TSD_share() + ~TSD_share() override { thr_lock_delete(&lock); } @@ -64,17 +64,17 @@ public: ha_tsd(handlerton *hton, TABLE_SHARE *table_arg) : handler(hton, table_arg) { } - ulonglong table_flags() const + ulonglong table_flags() const override { // NO_TRANSACTIONS and everything that affects CREATE TABLE return HA_NO_TRANSACTIONS | HA_CAN_GEOMETRY | HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_AUTO_PART_KEY | HA_CAN_RTREEKEYS | HA_CAN_FULLTEXT; } - ulong index_flags(uint inx, uint part, bool all_parts) const { return 0; } + ulong index_flags(uint inx, uint part, bool all_parts) const override { return 0; } THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to, - enum thr_lock_type lock_type) + enum thr_lock_type lock_type) override { if (lock_type != TL_IGNORE && lock.type == TL_UNLOCK) lock.type = lock_type; @@ -82,17 +82,17 @@ return to; } - int rnd_init(bool scan) { return 0; } - int rnd_next(unsigned char *buf) { return HA_ERR_END_OF_FILE; } - void position(const uchar *record) { } - int rnd_pos(uchar *buf, uchar *pos) { return HA_ERR_END_OF_FILE; } - int info(uint flag) { return 0; } - uint max_supported_keys() const { return 16; } + int rnd_init(bool scan) override { return 0; } + int rnd_next(unsigned char *buf) override { return HA_ERR_END_OF_FILE; } + void position(const uchar *record) override { } + int rnd_pos(uchar *buf, uchar *pos) override { return HA_ERR_END_OF_FILE; } + int info(uint flag) override { return 0; } + uint max_supported_keys() const override { return 16; } int create(const char *name, TABLE *table_arg, - HA_CREATE_INFO *create_info) { return HA_ERR_WRONG_COMMAND; } + HA_CREATE_INFO *create_info) override { return HA_ERR_WRONG_COMMAND; } - int open(const char *name, int mode, uint test_if_locked); - int close(void); + int open(const char *name, int mode, uint test_if_locked) override; + int close(void) override; }; TSD_share *ha_tsd::get_share() diff -Nru mariadb-10.11.6/strings/ctype-uca.c mariadb-10.11.9/strings/ctype-uca.c --- mariadb-10.11.6/strings/ctype-uca.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/strings/ctype-uca.c 2024-08-03 07:30:00.000000000 +0000 @@ -39437,18 +39437,24 @@ *dst= nopad ? my_charset_utf8mb4_unicode_520_nopad_ci : my_charset_utf8mb4_unicode_520_ci; break; +#ifdef HAVE_CHARSET_ucs2 case MY_CS_ENCODING_UCS2: *dst= nopad ? my_charset_ucs2_unicode_520_nopad_ci : my_charset_ucs2_unicode_520_ci; break; +#endif +#ifdef HAVE_CHARSET_utf16 case MY_CS_ENCODING_UTF16: *dst= nopad ? my_charset_utf16_unicode_520_nopad_ci : my_charset_utf16_unicode_520_ci; break; +#endif +#ifdef HAVE_CHARSET_utf32 case MY_CS_ENCODING_UTF32: *dst= nopad ? my_charset_utf32_unicode_520_nopad_ci : my_charset_utf32_unicode_520_ci; break; +#endif } dst->number= id; diff -Nru mariadb-10.11.6/strings/ctype-uca.inl mariadb-10.11.9/strings/ctype-uca.inl --- mariadb-10.11.6/strings/ctype-uca.inl 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/strings/ctype-uca.inl 2024-08-03 07:30:00.000000000 +0000 @@ -416,8 +416,20 @@ flags & MY_STRNNCOLLSP_NCHARS_EMULATE_TRIMMED_TRAILING_SPACES ? my_space_weight(param->level) : 0; - res.nchars= 1; (*generated)++; + res.nchars++; /* Count all ignorable characters and the padded space */ + if (res.nchars > nchars) + { + /* + We scanned a number of ignorable characters at the end of the + string and reached the "nchars" limit, so the virtual padded space + does not fit. This is possible with CONCAT('a', x'00') with + nchars=2 on the second iteration when we scan the x'00'. + */ + if (param->cs->state & MY_CS_NOPAD) + res.weight= 0; + res.nchars= (uint) nchars; + } } else if (res.nchars > nchars) { diff -Nru mariadb-10.11.6/strings/ctype.c mariadb-10.11.9/strings/ctype.c --- mariadb-10.11.6/strings/ctype.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/strings/ctype.c 2024-08-03 07:30:00.000000000 +0000 @@ -871,7 +871,7 @@ my_string_metadata_get_mb(MY_STRING_METADATA *metadata, CHARSET_INFO *cs, const char *str, ulong length) { - const char *strend= str + length; + const char *strend= str ? str + length : NULL; // Avoid UB nullptr+0 for (my_string_metadata_init(metadata) ; str < strend; metadata->char_length++) diff -Nru mariadb-10.11.6/strings/dtoa.c mariadb-10.11.9/strings/dtoa.c --- mariadb-10.11.6/strings/dtoa.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/strings/dtoa.c 2024-08-03 07:30:00.000000000 +0000 @@ -1465,22 +1465,22 @@ s00= s; esign= 0; if (++s < end) - switch (c= *s) { + switch (*s) { case '-': esign= 1; /* fall through */ - case '+': c= *++s; + case '+': s++; } - if (s < end && c >= '0' && c <= '9') + if (s < end && *s >= '0' && *s <= '9') { - while (s < end && c == '0') - c= *++s; - if (s < end && c > '0' && c <= '9') { - L= c - '0'; + while (s < end && *s == '0') + s++; + if (s < end && *s > '0' && *s <= '9') { + L= *s - '0'; s1= s; - while (++s < end && (c= *s) >= '0' && c <= '9') + while (++s < end && *s >= '0' && *s <= '9') { if (L < 19999) - L= 10*L + c - '0'; + L= 10*L + *s - '0'; } if (s - s1 > 8 || L > 19999) /* Avoid confusion from exponents diff -Nru mariadb-10.11.6/strings/json_lib.c mariadb-10.11.9/strings/json_lib.c --- mariadb-10.11.6/strings/json_lib.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/strings/json_lib.c 2024-08-03 07:30:00.000000000 +0000 @@ -482,12 +482,12 @@ static int json_num_states[NS_NUM_STATES][N_NUM_CLASSES]= { -/* - + 0 1..9 POINT E END_OK ERROR */ +/* - + 0 1..9 POINT E END_OK ERROR */ /*OK*/ { JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_SYN, JE_BAD_CHR }, /*GO*/ { NS_GO1, JE_SYN, NS_Z, NS_INT, JE_SYN, JE_SYN, JE_SYN, JE_BAD_CHR }, /*GO1*/ { JE_SYN, JE_SYN, NS_Z1, NS_INT, JE_SYN, JE_SYN, JE_SYN, JE_BAD_CHR }, -/*ZERO*/ { JE_SYN, JE_SYN, JE_SYN, JE_SYN, NS_FRAC, JE_SYN, NS_OK, JE_BAD_CHR }, -/*ZE1*/ { JE_SYN, JE_SYN, JE_SYN, JE_SYN, NS_FRAC, JE_SYN, NS_OK, JE_BAD_CHR }, +/*ZERO*/ { JE_SYN, JE_SYN, JE_SYN, JE_SYN, NS_FRAC, NS_EX, NS_OK, JE_BAD_CHR }, +/*ZE1*/ { JE_SYN, JE_SYN, JE_SYN, JE_SYN, NS_FRAC, NS_EX, NS_OK, JE_BAD_CHR }, /*INT*/ { JE_SYN, JE_SYN, NS_INT, NS_INT, NS_FRAC, NS_EX, NS_OK, JE_BAD_CHR }, /*FRAC*/ { JE_SYN, JE_SYN, NS_FRAC, NS_FRAC,JE_SYN, NS_EX, NS_OK, JE_BAD_CHR }, /*EX*/ { NS_EX, NS_EX, NS_EX1, NS_EX1, JE_SYN, JE_SYN, JE_SYN, JE_BAD_CHR }, diff -Nru mariadb-10.11.6/strings/my_strtoll10.c mariadb-10.11.9/strings/my_strtoll10.c --- mariadb-10.11.6/strings/my_strtoll10.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/strings/my_strtoll10.c 2024-08-03 07:30:00.000000000 +0000 @@ -241,7 +241,7 @@ *endptr= (char*) s; if (negative) { - if (li > MAX_NEGATIVE_NUMBER) + if (li >= MAX_NEGATIVE_NUMBER) // Avoid undefined behavior goto overflow; return -((longlong) li); } diff -Nru mariadb-10.11.6/support-files/mariadb.service.in mariadb-10.11.9/support-files/mariadb.service.in --- mariadb-10.11.6/support-files/mariadb.service.in 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/support-files/mariadb.service.in 2024-08-03 07:30:00.000000000 +0000 @@ -51,7 +51,7 @@ # CAP_DAC_OVERRIDE To allow auth_pam_tool (which is SUID root) to read /etc/shadow when it's chmod 0 # does nothing for non-root, not needed if /etc/shadow is u+r # CAP_AUDIT_WRITE auth_pam_tool needs it on Debian for whatever reason -CapabilityBoundingSet=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE +AmbientCapabilities=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE # PrivateDevices=true implies NoNewPrivileges=true and # SUID auth_pam_tool suddenly doesn't do setuid anymore @@ -80,7 +80,7 @@ # Do not panic if galera_recovery script is not available. (MDEV-10538) ExecStartPre=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION" ExecStartPre=/bin/sh -c "[ ! -e @bindir@/galera_recovery ] && VAR= || \ - VAR=`cd @bindir@/..; @bindir@/galera_recovery`; [ $? -eq 0 ] \ + VAR=`@bindir@/galera_recovery`; [ $? -eq 0 ] \ && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1" # Needed to create system tables etc. @@ -138,6 +138,12 @@ TimeoutStartSec=900 TimeoutStopSec=900 +# Set the maximium number of tasks (threads) to 99% of what the system can +# handle as set by the kernel, reserve the 1% for a remote ssh connection, +# some monitoring, or that backup cron job. Without the directive this would +# be 15% (see DefaultTasksMax in systemd man pages). +TasksMax=99% + ## ## Options previously available to be set via [mysqld_safe] ## that now needs to be set by systemd config files as mysqld_safe diff -Nru mariadb-10.11.6/support-files/mariadb@.service.in mariadb-10.11.9/support-files/mariadb@.service.in --- mariadb-10.11.6/support-files/mariadb@.service.in 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/support-files/mariadb@.service.in 2024-08-03 07:30:00.000000000 +0000 @@ -181,7 +181,7 @@ # CAP_DAC_OVERRIDE To allow auth_pam_tool (which is SUID root) to read /etc/shadow when it's chmod 0 # does nothing for non-root, not needed if /etc/shadow is u+r # CAP_AUDIT_WRITE auth_pam_tool needs it on Debian for whatever reason -CapabilityBoundingSet=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE +AmbientCapabilities=CAP_IPC_LOCK CAP_DAC_OVERRIDE CAP_AUDIT_WRITE # PrivateDevices=true implies NoNewPrivileges=true and # SUID auth_pam_tool suddenly doesn't do setuid anymore @@ -252,6 +252,12 @@ TimeoutStartSec=900 TimeoutStopSec=900 +# Set the maximium number of tasks (threads) to 99% of what the system can +# handle as set by the kernel, reserve the 1% for a remote ssh connection, +# some monitoring, or that backup cron job. Without the directive this would +# be 15% (see DefaultTasksMax in systemd man pages). +TasksMax=99% + # Controlling how multiple instances are separated. See top of this file. # Note: This service isn't User=mysql by default so we need to be explicit. # It is as an option here as a user may want to use the MYSQLD_MULTI_INSTANCE diff -Nru mariadb-10.11.6/support-files/mini-benchmark.sh mariadb-10.11.9/support-files/mini-benchmark.sh --- mariadb-10.11.6/support-files/mini-benchmark.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/support-files/mini-benchmark.sh 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ #!/bin/bash # Abort on errors -set -e +set -ex display_help() { echo "Usage: $(basename "$0") [-h] [--perf] [--perf-flamegraph]" @@ -10,13 +10,33 @@ echo "regressions." echo echo "optional arguments:" + echo " --name STRING identifier for the benchmark, added to the " + echo " folder name and (if --log is set) the log file " + echo " --threads \"STRING\" quoted string of space-separated integers " + echo " representing the threads to run." + echo " example: --threads \"1 32 64 128\"" + echo " default: \"1 2 4 8 16\"" + echo " --duration INTEGER duration of each thread run in seconds" + echo " default: 60" + echo " --workload STRING sysbench workload to execute" + echo " default: oltp_read_write" + echo " --log logs the mini-benchmark stdout/stderr into the" + echo " benchmark folder." echo " --perf measure CPU cycles and instruction count in for " echo " sysbench runs" echo " --perf-flamegraph record performance counters in perf.data.* and" echo " generate flamegraphs automatically" + echo " --cpu-limit upper limit on the number of CPU cycles (in billions) used for the benchmark" + echo " default: 750" echo " -h, --help display this help and exit" } +# Default parameters +BENCHMARK_NAME='mini-benchmark' +THREADS='1 2 4 8 16' +DURATION=60 +WORKLOAD='oltp_read_write' + while : do case "$1" in @@ -28,6 +48,31 @@ display_version exit 0 ;; + --name) + shift + BENCHMARK_NAME+='-' + BENCHMARK_NAME+=$1 + shift + ;; + --threads) + shift + THREADS=$1 + shift + ;; + --duration) + shift + DURATION=$1 + shift + ;; + --workload) + shift + WORKLOAD=$1 + shift + ;; + --log) + LOG=true + shift + ;; --perf) PERF=true shift @@ -36,6 +81,11 @@ PERF_RECORD=true shift ;; + --cpu-limit) + shift + CPU_CYCLE_LIMIT=$1 + shift + ;; -*) echo "Error: Unknown option: $1" >&2 ## or call function display_help @@ -47,6 +97,13 @@ esac done +# Save results of this run in a subdirectory so that they are not overwritten by +# the next run +TIMESTAMP="$(date -Iseconds)" +mkdir "$BENCHMARK_NAME-$TIMESTAMP" +cd "$BENCHMARK_NAME-$TIMESTAMP" || exit 1 + +( # Check that the dependencies of this script are available if [ ! -e /usr/bin/pgrep ] then @@ -62,6 +119,7 @@ # If there are multiple processes, assume the last one is the actual server and # any potential other ones were just part of the service wrapper chain +# shellcheck disable=SC2005 MARIADB_SERVER_PID="$(echo "$(pgrep -f mariadbd || pgrep -f mysqld)" | tail -n 1)" if [ -z "$MARIADB_SERVER_PID" ] @@ -70,6 +128,12 @@ exit 1 fi +if [ "$PERF" == true ] && [ "$PERF_RECORD" == true ] +then + echo "ERROR: Cannot select both --perf and --perf-flamegraph options simultaneously. Please choose one or the other." + exit 1 +fi + if [ "$PERF" == true ] || [ "$PERF_RECORD" == true ] then if [ ! -e /usr/bin/perf ] @@ -102,31 +166,31 @@ echo "Ensure the MariaDB Server debug symbols are installed" for x in $(ldd /usr/sbin/mariadbd | grep -oE " /.* ") do - rpm -q --whatprovides --qf '%{name}' $x | cut -d : -f 1 + rpm -q --whatprovides --qf '%{name}' "$x" | cut -d : -f 1 done | sort -u > mariadbd-dependencies.txt # shellcheck disable=SC2046 debuginfo-install -y mariadb-server $(cat mariadbd-dependencies.txt) - - if [ ! $(perf record echo "testing perf" > /dev/null 2>&1) ] + + if ! (perf record echo "testing perf") > /dev/null 2>&1 then echo "perf does not have permission to run on this system. Skipping." - PERF="" + PERF_COMMAND="" else echo "Using 'perf' to record performance counters in perf.data files" - PERF="perf record -g --freq=99 --output=perf.data --timestamp-filename --pid=$MARIADB_SERVER_PID --" + PERF_COMMAND="perf record -g --freq=99 --output=perf.data --timestamp-filename --pid=$MARIADB_SERVER_PID --" fi -elif [ -e /usr/bin/perf ] +elif [ "$PERF" == true ] then # If flamegraphs were not requested, log normal perf counters if possible - if [ ! $(perf stat echo "testing perf" > /dev/null 2>&1) ] + if ! (perf stat echo "testing perf") > /dev/null 2>&1 then echo "perf does not have permission to run on this system. Skipping." - PERF="" + PERF_COMMAND="" else echo "Using 'perf' to log basic performance counters for benchmark" - PERF="perf stat -p $MARIADB_SERVER_PID --" + PERF_COMMAND="perf stat -p $MARIADB_SERVER_PID --" fi fi @@ -156,28 +220,23 @@ CREATE USER IF NOT EXISTS sbtest@localhost; GRANT ALL PRIVILEGES ON sbtest.* TO sbtest@localhost" -sysbench oltp_read_write prepare --tables=20 --table-size=100000 | tee sysbench-prepare.log +sysbench "$WORKLOAD" prepare --tables=20 --table-size=100000 | tee sysbench-prepare.log sync && sleep 1 # Ensure writes were propagated to disk -# Save results of this run in a subdirectory so that they are not overwritten by -# the next run -TIMESTAMP="$(date -Iseconds)" -mkdir "mini-benchmark-$TIMESTAMP" -cd "mini-benchmark-$TIMESTAMP" || exit 1 - # Run benchmark with increasing thread counts. The MariaDB Server will be using # around 300 MB of RAM and mostly reading and writing in RAM, so I/O usage is # also low. The benchmark will most likely be CPU bound to due to the load # profile, and also guaranteed to be CPU bound because of being limited to a # single CPU with 'tasksel'. -for t in 1 2 4 8 16 +for t in $THREADS do # Prepend command with perf if defined - # Output stderr to stdout as perf outpus everything in stderr - $PERF $TASKSET_SYSBENCH sysbench oltp_read_write run --threads=$t --time=60 --report-interval=10 2>&1 | tee sysbench-run-$t.log + # Output stderr to stdout as perf outputs everything in stderr + # shellcheck disable=SC2086 + $PERF_COMMAND $TASKSET_SYSBENCH sysbench "$WORKLOAD" run --threads=$t --time=$DURATION --report-interval=10 2>&1 | tee sysbench-run-$t.log done -sysbench oltp_read_write cleanup --tables=20 | tee sysbench-cleanup.log +sysbench "$WORKLOAD" cleanup --tables=20 | tee sysbench-cleanup.log # Store results from 4 thread run in a Gitlab-CI compatible metrics file grep -oE '[a-z]+:[ ]+[0-9.]+' sysbench-run-4.log | sed -r 's/\s+/ /g' | tail -n 15 > metrics.txt @@ -195,12 +254,21 @@ echo "Total: $(grep -h -e instructions sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')" echo # Newline improves readability + if [ -z "$CPU_CYCLE_LIMIT" ] + then + # 04-04-2024: We found this to be an appropriate default limit after running a few benchmarks + # Configure the limit with --cpu-limit if needed + CPU_CYCLE_LIMIT=750 + fi + CPU_CYCLE_LIMIT_LONG="${CPU_CYCLE_LIMIT}000000000" + # Final verdict based on cpu cycle count RESULT="$(grep -h -e cycles sysbench-run-*.log | sort -k 1 | awk '{s+=$1}END{print s}')" - if [ "$RESULT" -gt 850000000000 ] + if [ "$RESULT" -gt "$CPU_CYCLE_LIMIT_LONG" ] then echo # Newline improves readability - echo "Benchmark exceeded 8.5 billion cpu cycles, performance most likely regressed!" + echo "Benchmark exceeded the allowed limit of ${CPU_CYCLE_LIMIT} billion CPU cycles" + echo "Performance most likely regressed!" exit 1 fi fi @@ -216,12 +284,12 @@ then for f in perf.data.* do - perf script -i $f | stackcollapse-perf.pl | flamegraph.pl --width 3000 > $f.svg + perf script -i "$f" | stackcollapse-perf.pl | flamegraph.pl --width 1800 > "$f".svg done - echo "Flamegraphs stored in folder mini-benchmark-$TIMESTAMP/" + echo "Flamegraphs stored in folder $BENCHMARK_NAME-$TIMESTAMP/" fi -# Fallback if CPU cycle count not availalbe: final verdict based on peak QPS +# Fallback if CPU cycle count not available: final verdict based on peak QPS RESULT="$(sort -k 9 -h sysbench-run-*.log | tail -n 1 | grep -oE "qps: [0-9]+" | grep -oE "[0-9]+")" case $RESULT in ''|*[!0-9]*) @@ -240,3 +308,6 @@ fi ;; esac +# Record the output into the log file, if requested +) 2>&1 | ($LOG && tee "$BENCHMARK_NAME"-"$TIMESTAMP".log) +exit ${PIPESTATUS[0]} # Propagate errors in the sub-shell diff -Nru mariadb-10.11.6/support-files/policy/apparmor/usr.sbin.mysqld mariadb-10.11.9/support-files/policy/apparmor/usr.sbin.mysqld --- mariadb-10.11.6/support-files/policy/apparmor/usr.sbin.mysqld 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/support-files/policy/apparmor/usr.sbin.mysqld 2024-08-03 07:30:00.000000000 +0000 @@ -14,6 +14,7 @@ capability chown, capability dac_override, + capability ipc_lock, capability setgid, capability setuid, capability sys_rawio, diff -Nru mariadb-10.11.6/support-files/policy/selinux/mariadb-server.te mariadb-10.11.9/support-files/policy/selinux/mariadb-server.te --- mariadb-10.11.6/support-files/policy/selinux/mariadb-server.te 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/support-files/policy/selinux/mariadb-server.te 2024-08-03 07:30:00.000000000 +0000 @@ -25,7 +25,7 @@ class lnk_file read; class process { getattr signull }; class unix_stream_socket connectto; - class capability { sys_resource sys_nice }; + class capability { ipc_lock sys_resource sys_nice }; class tcp_socket { name_bind name_connect }; class file { execute setattr read create getattr execute_no_trans write ioctl open append unlink }; class sock_file { create unlink getattr }; @@ -87,6 +87,8 @@ # MariaDB additions allow mysqld_t self:process setpgid; +allow mysqld_t self:capability { ipc_lock }; + # This rule allows port tcp/4444 allow mysqld_t kerberos_port_t:tcp_socket { name_bind name_connect }; # This rule allows port tcp/4567 (tram_port_t may not be available on diff -Nru mariadb-10.11.6/support-files/rpm/server-postin.sh mariadb-10.11.9/support-files/rpm/server-postin.sh --- mariadb-10.11.6/support-files/rpm/server-postin.sh 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/support-files/rpm/server-postin.sh 2024-08-03 07:30:00.000000000 +0000 @@ -71,7 +71,7 @@ /usr/sbin/semodule -i /usr/share/mysql/policy/selinux/mariadb.pp fi -if [ -x /sbin/restorecon ] ; then +if [ -x /sbin/restorecon -a -d /var/lib/mysql ] ; then /sbin/restorecon -R /var/lib/mysql fi diff -Nru mariadb-10.11.6/tests/async_queries.c mariadb-10.11.9/tests/async_queries.c --- mariadb-10.11.6/tests/async_queries.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tests/async_queries.c 2024-08-03 07:30:00.000000000 +0000 @@ -358,6 +358,7 @@ return 0; } +PRAGMA_DISABLE_CHECK_STACK_FRAME int main(int argc, char *argv[]) @@ -433,3 +434,4 @@ return 0; } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff -Nru mariadb-10.11.6/tests/code_quality/cppcheck_ignorelist.txt mariadb-10.11.9/tests/code_quality/cppcheck_ignorelist.txt --- mariadb-10.11.6/tests/code_quality/cppcheck_ignorelist.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tests/code_quality/cppcheck_ignorelist.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,251 +1,85 @@ -client/mysql.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -client/mysql_upgrade.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -client/mysqladmin.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -client/mysqlbinlog.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -client/mysqlcheck.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -client/mysqlimport.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -client/mysqlshow.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -client/mysqltest.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -dbug/tests.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -lexyy.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -mysql-test/lib/My/SafeProcess/safe_process_win.cc: error: Uninitialized variable: message_text -mysys/mf_keycache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -mysys/my_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -mysys/my_fopen.c: error: Return value of allocation function 'freopen' is not stored. -mysys/my_getsystime.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -mysys/my_pread.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -mysys/my_rename.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -mysys/my_winfile.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -mysys/my_write.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -mysys/thr_lock.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_TABLE_WAIT_VARIABLES is a macro then please configure it. -mysys/tree.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -pcre/pcrecpp.cc: warning: Uninitialized variable: kmat -pcre/pcrecpp.h: error: syntax error -pcre/pcregrep.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/audit_null/audit_null.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_ed25519/server_ed25519.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_examples/auth_0x0100.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_examples/dialog_examples.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_examples/qa_auth_interface.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_examples/qa_auth_server.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_examples/test_plugin.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_gssapi/server_plugin.cc: error: syntax error -plugin/auth_gssapi/sspi.h: error: #include nested too deeply -plugin/auth_pam/auth_pam.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_pam/auth_pam_v1.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_pipe/auth_pipe.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/auth_socket/auth_socket.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/aws_key_management/aws_key_management_plugin.cc: error: syntax error -plugin/cracklib_password_check/cracklib_password_check.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/daemon_example/daemon_example.cc: error: syntax error -plugin/debug_key_management/debug_key_management_plugin.cc: error: syntax error -plugin/disks/information_schema_disks.cc: error: syntax error -plugin/example_key_management/example_key_management_plugin.cc: error: syntax error -plugin/feedback/feedback.cc: error: syntax error -plugin/file_key_management/file_key_management_plugin.cc: error: syntax error -plugin/fulltext/plugin_example.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/handler_socket/handlersocket/handlersocket.cpp: error: syntax error -plugin/locale_info/locale_info.cc: error: syntax error -plugin/metadata_lock_info/metadata_lock_info.cc: error: syntax error -plugin/metadata_lock_info/metadata_lock_info.cc: error: syntax error -plugin/qc_info/qc_info.cc: error: syntax error -plugin/query_response_time/plugin.cc: error: syntax error -plugin/query_response_time/query_response_time.cc: error: Array 'm_count[41]' accessed at index 43, which is out of bounds. -plugin/query_response_time/query_response_time.cc: error: Array 'm_total[41]' accessed at index 43, which is out of bounds. -plugin/server_audit/server_audit.c: error: Uninitialized variable: &tm_time -plugin/server_audit/server_audit.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/server_audit/server_audit.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/server_audit/server_audit.c: error: Uninitialized variable: &tm_time -plugin/simple_password_check/simple_password_check.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/sql_errlog/sql_errlog.c: error: Found a exit path from function with non-void return type that has missing return statement -plugin/sql_errlog/sql_errlog.c: error: Uninitialized variable: &t -plugin/user_variables/user_variables.cc: error: syntax error -plugin/userstat/userstat.cc: error: syntax error -plugin/versioning/versioning.cc: error: syntax error -plugin/wsrep_info/plugin.cc: error: syntax error -sql-common/client.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. -sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. -sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. -sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. -sql/debug_sync.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE is a macro then please configure it. -sql/gcalc_slicescan.cc: warning: Possible null pointer dereference: first_bottom_point -sql/gen_lex_hash.cc: error: Common realloc mistake: 'hash_map' nulled but not freed upon failure -sql/handler.h: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -sql/log.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -sql/log_event.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -sql/log_event_old.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -sql/net_serv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -sql/protocol.h: error: syntax error -sql/rpl_utility.h: error: There is an unknown macro here somewhere. Configuration is required. If CPP_UNNAMED_NS_START is a macro then please configure it. -sql/semisync_slave.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -sql/sql_select.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -sql/sql_string.cc: warning: Iterators to containers from different expressions 'to' and 'from' are used together. -sql/table.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -sql/winservice.c: error: Resource leak: mysql_upgrade_info -sql/wsrep_thd.h: error: failed to expand 'wsrep_create_appliers', Wrong number of parameters for macro 'wsrep_create_appliers'. -storage/archive/azio.c: error: Syntax Error: AST broken, 'if' doesn't have two operands. -storage/archive/ha_archive.cc: error: syntax error -storage/blackhole/ha_blackhole.cc: error: syntax error -storage/cassandra/gen-cpp/Cassandra_server.skeleton.cpp: error: Found a exit path from function with non-void return type that has missing return statement -storage/cassandra/ha_cassandra.cc: error: syntax error -storage/connect/connect.cc: error: Uninitialized variable: lg -storage/connect/domdoc.cpp: error: syntax error -storage/connect/ha_connect.cc: error: syntax error -storage/connect/myconn.cpp: error: Unmatched '{'. Configuration: 'ALPHA;MYSQL_PREPARED_STATEMENTS'. -storage/connect/myconn.cpp: error: Unmatched '{'. Configuration: 'MYSQL_PREPARED_STATEMENTS'. -storage/connect/odbconn.cpp: warning: Uninitialized variable: b -storage/connect/odbconn.cpp: warning: Uninitialized variable: b -storage/connect/odbconn.cpp: warning: Uninitialized variable: b -storage/connect/plugutil.cpp: error: Width 255 given in format string (no. 2) is larger than destination buffer 'stmsg[200]', use %199[^\"] to prevent overflowing it. -storage/connect/plugutil.cpp: error: Width 255 given in format string (no. 1) is larger than destination buffer 'stmsg[200]', use %199[^\"] to prevent overflowing it. -storage/connect/tabjson.cpp: warning: Possible null pointer dereference: Val -storage/connect/tabmul.cpp: error: Uninitialized variable: buf -storage/connect/tabmul.cpp: error: Uninitialized variable: buf -storage/connect/tabmul.cpp: error: Uninitialized variable: buf -storage/connect/taboccur.cpp: warning: Uninitialized variable: *pcrp -storage/connect/unzip.c: warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file -storage/connect/value.cpp: error: Signed integer overflow for expression 'n*126230400'. -storage/connect/zip.c: warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file -storage/csv/ha_tina.cc: error: syntax error -storage/example/ha_example.cc: error: syntax error -storage/federated/ha_federated.cc: error: syntax error -storage/heap/ha_heap.cc: error: syntax error -storage/innobase/btr/btr0btr.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/btr/btr0cur.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/btr/btr0defragment.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. -storage/innobase/btr/btr0sea.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/buf/buf0buf.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/buf/buf0dump.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. -storage/innobase/buf/buf0flu.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. -storage/innobase/buf/buf0lru.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/dict/dict0crea.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/dict/dict0dict.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/dict/dict0load.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/dict/dict0stats.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/dict/dict0stats_bg.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. -storage/innobase/fil/fil0crypt.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/fil/fil0fil.cc: error: syntax error -storage/innobase/fsp/fsp0file.cc: error: Resource leak: file -storage/innobase/fsp/fsp0fsp.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/fts/fts0fts.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/fts/fts0opt.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/fts/fts0que.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/gis/gis0rtree.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/gis/gis0sea.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/handler/ha_innodb.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/handler/handler0alter.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/handler/i_s.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/ibuf/ibuf0ibuf.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/ibuf/ibuf0ibuf.cc: error: failed to expand 'ibuf_bitmap_page_get_bits', Wrong number of parameters for macro 'ibuf_bitmap_page_get_bits'. -storage/innobase/lock/lock0lock.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/lock/lock0wait.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/lock/lock0wait.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/log/log0log.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/log/log0recv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/os/os0file.cc: error: syntax error -storage/innobase/page/page0page.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/page/page0zip.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/pars/pars0pars.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/row/row0ftsort.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/row/row0import.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/row/row0ins.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/row/row0log.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/row/row0merge.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/innobase/row/row0mysql.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/row/row0quiesce.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/row/row0sel.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/row/row0umod.cc: error: There is an unknown macro here somewhere. Configuration is required. If ut_d is a macro then please configure it. -storage/innobase/row/row0upd.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/row/row0vers.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/srv/srv0conc.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ALIGNED is a macro then please configure it. -storage/innobase/srv/srv0srv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/srv/srv0start.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. -storage/innobase/trx/trx0i_s.cc: error: Array 'table_cache->chunks[39]' accessed at index 39, which is out of bounds. -storage/innobase/trx/trx0i_s.cc: error: Array 'table_cache->chunks[39]' accessed at index 39, which is out of bounds. -storage/innobase/trx/trx0purge.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/trx/trx0rec.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/trx/trx0roll.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. -storage/innobase/trx/trx0trx.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/innobase/trx/trx0undo.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ha_maria.cc: error: syntax error -storage/maria/ma_bitmap.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_blockrec.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_check.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_checkpoint.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/maria/ma_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_ft_parser.c: error: Address of local auto-variable assigned to a function parameter. -storage/maria/ma_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_loghandler.c: warning: Uninitialized variable: data->current_offset -storage/maria/ma_open.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/maria/ma_pagecache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_pagecache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_range.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_recovery_util.c: error: va_start() or va_copy() called subsequently on 'args' without va_end() in between. -storage/maria/ma_rkey.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_rt_index.c: error: failed to expand 'rt_PAGE_END', Wrong number of parameters for macro 'rt_PAGE_END'. -storage/maria/ma_search.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_sp_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_update.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/maria/ma_update.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/ma_write.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/maria/ma_write.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/maria/maria_pack.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/ft_parser.c: error: Address of local auto-variable assigned to a function parameter. -storage/myisam/ha_myisam.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_check.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_close.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/myisam/mi_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_locking.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_open.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. -storage/myisam/mi_range.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_rkey.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_search.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_update.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/mi_write.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisam/myisampack.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -storage/myisammrg/ha_myisammrg.cc: error: syntax error -storage/oqgraph/ha_oqgraph.cc: error: syntax error -storage/perfschema/ha_perfschema.cc: error: syntax error -storage/perfschema/pfs_instr.h: error: Uninitialized variable: m_has_io_stats -storage/perfschema/pfs_instr.h: error: Uninitialized variable: m_has_lock_stats -storage/perfschema/pfs_instr_class.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ALIGNED is a macro then please configure it. -storage/perfschema/table_accounts.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_esgs_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_esgs_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_esgs_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_esms_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_esms_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_esms_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_events_waits.cc: error: Uninitialized struct member: wait.m_wait_class -storage/perfschema/table_events_waits.cc: error: Uninitialized variable: wait -storage/perfschema/table_events_waits.cc: error: Uninitialized struct member: wait.m_wait_class -storage/perfschema/table_ews_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_ews_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_ews_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_hosts.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_setup_actors.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_threads.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/perfschema/table_users.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -storage/sequence/sequence.cc: error: syntax error -storage/test_sql_discovery/test_sql_discovery.cc: error: syntax error -strings/decimal.c: warning: Possible null pointer dereference: to -strings/dump_map.c: error: Array 'fromstat[256]' accessed at index 256, which is out of bounds. -tests/mysql_client_fw.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -tests/thread_test.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. -unittest/mysys/dynstring-t.c: error: syntax error -unittest/mysys/queues-t.c: error: Uninitialized variable: i -unittest/mysys/waiting_threads-t.c: error: Uninitialized variable: m -unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. -unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. -unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. -unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. -vio/viosocket.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_SOCKET_WAIT_VARIABLES is a macro then please configure it. -vio/viosocket.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_SOCKET_WAIT_VARIABLES is a macro then please configure it. -vio/viosslfactories.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. -vio/viotest-sslconnect.cc: error: Memory pointed to by 'vio' is freed twice. -vio/viotest-sslconnect.cc: error: Memory pointed to by 'ssl_connector' is freed twice. -wsrep-lib/src/server_state.cpp: error: syntax error: keyword 'try' is not allowed in global scope -wsrep-lib/src/thread_service_v1.cpp: error: Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow. If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object +client/mysqlbinlog.cc ev->output_buf.copy(e->output_buf); warning: Possible null pointer dereference: e +client/mysqldump.c return buff; warning: Uninitialized variable: buff +client/mysqldump.c return buff; warning: Uninitialized variable: buff +include/my_global.h #error "please add -DSTACK_DIRECTION=1 or -1 to your CPPFLAGS" error: #error "please add -DSTACK_DIRECTION=1 or -1 to your CPPFLAGS" +include/my_global.h #error WHAT? sizeof(long long) < 8 ??? error: #error WHAT? sizeof(long long) < 8 ??? +include/mysql/psi/mysql_socket.h result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags); error: syntax error +include/mysql/psi/mysql_socket.h result= send(mysql_socket.fd, buf, IF_WIN((int),) n, flags); error: syntax error +include/mysql/psi/psi.h #error "You must include my_global.h in the code for the build to be correct." error: #error "You must include my_global.h in the code for the build to be correct." +mysql-test/lib/My/SafeProcess/safe_process_win.cc |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, last_err , 0, (LPSTR)&message_text, error: Uninitialized variable: message_text +mysys/file_logger.c *l_perm= new_log; error: Uninitialized struct member: new_log.lock +mysys/ma_dyncol.c float8get(store_it_here->x.double_value, data); error: Uninitialized variable: def_temp +mysys/mf_loadpath.c strmake(to, from, FN_REFLEN-1); warning: Uninitialized variable: from +mysys/my_compare.c mi_float4get(f_1,a); error: Uninitialized variable: def_temp +mysys/my_compare.c mi_float4get(f_2,b); error: Uninitialized variable: def_temp +mysys/my_compare.c mi_float8get(d_1,a); error: Uninitialized variable: def_temp +mysys/my_compare.c mi_float8get(d_2,b); error: Uninitialized variable: def_temp +mysys/my_symlink2.c create_link= (linkname && strcmp(abs_linkname,filename)); error: Uninitialized variable: abs_linkname +plugin/sql_errlog/sql_errlog.c (void) localtime_r(&event_time, &t); error: Uninitialized variable: &t +sql-common/client_plugin.c bzero(&unused, sizeof unused); error: va_list 'unused' used before va_start() was called. +sql-common/client_plugin.c plugin= add_plugin(mysql, plugin, 0, 0, unused); error: va_list 'unused' used before va_start() was called. +sql/gen_lex_hash.cc hash_map= (char*)realloc((char*)hash_map,size_hash_map); error: Common realloc mistake: 'hash_map' nulled but not freed upon failure +sql/my_apc.cc apc_calls->prev= qe; error: Non-local variable 'apc_calls->prev' will use pointer to local variable 'apc_request'. +sql/my_apc.cc apc_calls= qe; error: Non-local variable 'apc_calls' will use pointer to local variable 'apc_request'. +sql/sql_string.cc memcpy(dots, STRING_WITH_LEN("...\0")); error: failed to expand 'memcpy', Wrong number of parameters for macro 'memcpy'. +storage/cassandra/gen-cpp/Cassandra_server.skeleton.cpp printf("get_count\n"); error: Found an exit path from function with non-void return type that has missing return statement +storage/connect/connect.cc rcb= valp->SetValue_char(kp, (int)lg); error: Uninitialized variable: lg +storage/connect/connect.cc rcb= valp->SetValue_char((char*)p, (int)lg); error: Uninitialized variable: lg +storage/connect/macutil.cpp #error This is WINDOWS only DLL error: #error This is WINDOWS only DLL +storage/connect/tabjson.cpp Val->SetValue(jsp); warning: Possible null pointer dereference: Val +storage/connect/tabmac.cpp #error This is a WINDOWS only table type error: #error This is a WINDOWS only table type +storage/connect/taboccur.cpp for (i = 0, pcrp = &qrp->Colresp; (crp = *pcrp); ) { warning: Uninitialized variable: *pcrp +storage/connect/tabwmi.cpp #error This is a WINDOWS only table type error: #error This is a WINDOWS only table type +storage/connect/unzip.c us.z_filefunc = *pzlib_filefunc64_32_def; warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file +storage/connect/value.cpp if ((t -= (n * FOURYEARS)) > 2000000000) error: Signed integer overflow for expression 'n*126230400'. +storage/connect/zip.c ziinit.z_filefunc = *pzlib_filefunc64_32_def; warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file +storage/federated/ha_federated.cc DBUG_RETURN(retval); error: Uninitialized variable: retval +storage/federatedx/federatedx_pushdown.cc ha_federatedx *h= (ha_federatedx *) table->file; warning: Possible null pointer dereference: table +storage/federatedx/federatedx_pushdown.cc share= get_share(table->s->table_name.str, table); warning: Possible null pointer dereference: table +storage/heap/hp_hash.c float4get(nr, pos); error: Uninitialized variable: def_temp +storage/heap/hp_hash.c float8get(nr, pos); error: Uninitialized variable: def_temp +storage/heap/hp_hash.c float4get(f_1,key); error: Uninitialized variable: def_temp +storage/heap/hp_hash.c float8get(f_1,key); error: Uninitialized variable: def_temp +storage/maria/ma_create.c DBUG_RETURN(my_pwrite(file, buf, sizeof(buf), error: Uninitialized variable: trid_buff +storage/maria/ma_dbug.c mi_float4get(f_1,key); error: Uninitialized variable: def_temp +storage/maria/ma_dbug.c mi_float8get(d_1,key); error: Uninitialized variable: def_temp +storage/maria/ma_ft_parser.c param->mysql_ftparam= &my_param; error: Address of local auto-variable assigned to a function parameter. +storage/maria/ma_key.c float4get(nr,pos); error: Uninitialized variable: def_temp +storage/maria/ma_key.c float8get(nr,pos); error: Uninitialized variable: def_temp +storage/maria/ma_key.c float4get(f_1,key); error: Uninitialized variable: def_temp +storage/maria/ma_key.c float8get(f_1,key); error: Uninitialized variable: def_temp +storage/maria/ma_locking.c write_error= (int) my_pwrite(share->kfile.file, buff, sizeof(buff), error: Uninitialized variable: buff +storage/maria/ma_locking.c (void) my_pwrite(share->kfile.file, buff, sizeof(buff), error: Uninitialized variable: buff +storage/maria/ma_loghandler.c if (! --fc_ptr->counter) warning: Uninitialized variable: fc_ptr +storage/maria/ma_loghandler.c (offset < data->current_offset && warning: Uninitialized variable: data->current_offset +storage/maria/ma_open.c float8get(state->rec_per_key_part[i], ptr); ptr+= 8; error: Uninitialized variable: def_temp +storage/maria/ma_open.c return mysql_file_write(file, buff, (size_t) (ptr-buff), MYF(MY_NABP)) != 0; error: Uninitialized variable: buff +storage/maria/ma_open.c return mysql_file_write(file, buff, (size_t) (ptr-buff), MYF(MY_NABP)) != 0; error: Uninitialized variable: buff +storage/maria/ma_recovery_util.c va_start(args, format); error: va_start() or va_copy() called subsequently on 'args' without va_end() in between. +storage/maria/ma_search.c if (flag == 0) warning: Uninitialized variable: flag +storage/maria/ma_write.c key->data= key_buff; error: Address of local auto-variable assigned to a function parameter. +storage/maria/tablockman.c mysql_mutex_init(& lm->pool_mutex, MY_MUTEX_INIT_FAST); error: failed to expand 'mysql_mutex_init', Wrong number of parameters for macro 'mysql_mutex_init'. +storage/myisam/ft_parser.c param->mysql_ftparam= &my_param; error: Address of local auto-variable assigned to a function parameter. +storage/myisam/mi_dbug.c mi_float4get(f_1,key); error: Uninitialized variable: def_temp +storage/myisam/mi_dbug.c mi_float8get(d_1,key); error: Uninitialized variable: def_temp +storage/myisam/mi_key.c float4get(nr,pos); error: Uninitialized variable: def_temp +storage/myisam/mi_key.c float8get(nr,pos); error: Uninitialized variable: def_temp +storage/myisam/mi_key.c float4get(f_1,key); error: Uninitialized variable: def_temp +storage/myisam/mi_key.c float8get(f_1,key); error: Uninitialized variable: def_temp +storage/myisam/mi_locking.c write_error= (mysql_file_pwrite(share->kfile, buff, sizeof(buff), error: Uninitialized variable: buff +storage/myisam/mi_open.c return mysql_file_write(file, buff, (size_t) (ptr-buff), MYF(MY_NABP)) != 0; error: Uninitialized variable: buff +storage/myisam/mi_open.c return mysql_file_write(file, buff, (size_t) (ptr-buff), MYF(MY_NABP)) != 0; error: Uninitialized variable: buff +storage/myisam/mi_open.c return mysql_file_write(file, buff, (size_t) (ptr-buff), MYF(MY_NABP)) != 0; error: Uninitialized variable: buff +storage/myisam/mi_search.c if (flag == 0) warning: Uninitialized variable: flag +storage/perfschema/pfs_global.cc return NULL; error: Memory leak: ptr +storage/sequence/sequence.cc maria_declare_plugin(sequence) error: syntax error +strings/decimal.c sanity(to); warning: Possible null pointer dereference: to +strings/dump_map.c if (fromstat[i]) error: Array 'fromstat[256]' accessed at index 256, which is out of bounds. +unittest/mytap/tap.c memset(&ap, 0, sizeof(ap)); error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c vemit_tap(pass, NULL, ap); error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c memset((char*) &ap, 0, sizeof(ap)); /* Keep compiler happy */ error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c vemit_tap(1, NULL, ap); error: va_list 'ap' used before va_start() was called. +vio/viotest-sslconnect.cc delete vio; error: Memory pointed to by 'vio' is freed twice. +vio/viotest-sslconnect.cc delete ssl_connector; error: Memory pointed to by 'ssl_connector' is freed twice. +wsrep-lib/src/server_state.cpp try error: syntax error: keyword 'try' is not allowed in global scope +wsrep-lib/src/thread_service_v1.cpp throw; // Implementation broke the contract and returned. error: Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow. If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object diff -Nru mariadb-10.11.6/tests/code_quality/flawfinder_ignorelist.json mariadb-10.11.9/tests/code_quality/flawfinder_ignorelist.json --- mariadb-10.11.6/tests/code_quality/flawfinder_ignorelist.json 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tests/code_quality/flawfinder_ignorelist.json 2024-08-03 07:30:00.000000000 +0000 @@ -159,6 +159,62 @@ "rank": 1.0 }, { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/columnstore/columnstore/writeengine/shared/we_typeext.h", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 16, + "endColumn": 67, + "snippet": { + "text": " if (fs.chown(fileName.c_str(), uid, gid, funcErrno) == -1)" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "16bbd2ed7b8f86182e8f66980ee23b9e0dfe63a9330b7c16a2c2b81a3e8a9377" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/columnstore/columnstore/utils/idbdatafile/PosixFileSystem.cpp", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 18, + "endColumn": 51, + "snippet": { + "text": " if ((ret = ::chown(objectName, p_uid, p_gid)))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "1882617c363794bedb3e70a4a3be704a3ee928778709b75f971e91ffc7a224b6" + }, + "rank": 1.0 + }, + { "ruleId": "FF1033", "level": "error", "message": { @@ -215,6 +271,34 @@ "rank": 1.0 }, { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/columnstore/columnstore/utils/idbdatafile/PosixFileSystem.cpp", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 22, + "endColumn": 51, + "snippet": { + "text": "int PosixFileSystem::chown(const char* objectName," + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "357c9645f4ff806e824ffc5714887bbfaafe92c4387521d0dec855875c0c21e5" + }, + "rank": 1.0 + }, + { "ruleId": "FF1033", "level": "error", "message": { @@ -271,6 +355,34 @@ "rank": 1.0 }, { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./sql/signal_handler.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 13, + "endColumn": 68, + "snippet": { + "text": " if ((len= readlink(\"/proc/self/cwd\", buff, sizeof(buff)-1)) >= 0)" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "4c4d621e451a67f86c3e999e9dd3ceb2639bf4f63b0a946b7836b01d752ca557" + }, + "rank": 1.0 + }, + { "ruleId": "FF1010", "level": "error", "message": { @@ -308,6 +420,34 @@ { "physicalLocation": { "artifactLocation": { + "uri": "./storage/columnstore/columnstore/primitives/blockcache/fsutils.cpp", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 27, + "endColumn": 79, + "snippet": { + "text": " ssize_t realnamelen = readlink(path.string().c_str(), realname, PATH_MAX);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "52b685022ce9db6c7c332217d74745fc48b65e3e00f2cfdbde8f858d28b8aa9f" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { "uri": "./mysys/my_symlink.c", "uriBaseId": "SRCROOT" }, @@ -355,58 +495,58 @@ "rank": 1.0 }, { - "ruleId": "FF1033", + "ruleId": "FF1031", "level": "error", "message": { - "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." }, "locations": [ { "physicalLocation": { "artifactLocation": { - "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uri": "./storage/columnstore/columnstore/utils/idbdatafile/IDBFileSystem.h", "uriBaseId": "SRCROOT" }, "region": { - "startColumn": 9, - "endColumn": 50, + "startColumn": 17, + "endColumn": 46, "snippet": { - "text": " chmod(codepath, S_IRUSR|S_IRGRP|S_IROTH);" + "text": " virtual int chown(const char* objectName," } } } } ], "fingerprints": { - "contextHash/v1": "a62b28fca5c6218ee4731e78bb3eacb93604fae20c91c69cccad3834973e70d5" + "contextHash/v1": "9d9d3ce8ec5fe165af2a81280b5f9cccf73ba9fbb388bc2ffff6abdbdeb37458" }, "rank": 1.0 }, { - "ruleId": "FF1035", + "ruleId": "FF1033", "level": "error", "message": { - "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." }, "locations": [ { "physicalLocation": { "artifactLocation": { - "uri": "./storage/rocksdb/rocksdb/port/stack_trace.cc", + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", "uriBaseId": "SRCROOT" }, "region": { - "startColumn": 15, - "endColumn": 54, + "startColumn": 9, + "endColumn": 50, "snippet": { - "text": " auto read = readlink(link, name, sizeof(name) - 1);" + "text": " chmod(codepath, S_IRUSR|S_IRGRP|S_IROTH);" } } } } ], "fingerprints": { - "contextHash/v1": "acb399f2a4a15ef8da36c47631bc4ee4bcc1bb0577dfbda141d2eb5d7723af40" + "contextHash/v1": "a62b28fca5c6218ee4731e78bb3eacb93604fae20c91c69cccad3834973e70d5" }, "rank": 1.0 }, @@ -420,21 +560,21 @@ { "physicalLocation": { "artifactLocation": { - "uri": "./sql/signal_handler.cc", + "uri": "./storage/rocksdb/rocksdb/port/stack_trace.cc", "uriBaseId": "SRCROOT" }, "region": { - "startColumn": 13, - "endColumn": 66, + "startColumn": 15, + "endColumn": 54, "snippet": { - "text": " if ((len= readlink(\"/proc/self/cwd\", buff, sizeof(buff))) >= 0)" + "text": " auto read = readlink(link, name, sizeof(name) - 1);" } } } } ], "fingerprints": { - "contextHash/v1": "b55a5f3db29b1ce25e12f94e4ea344ed7fb0e63a230cf6b6deb42c28de924457" + "contextHash/v1": "acb399f2a4a15ef8da36c47631bc4ee4bcc1bb0577dfbda141d2eb5d7723af40" }, "rank": 1.0 }, @@ -605,6 +745,62 @@ "contextHash/v1": "e307b1923cc852324e3050b3e4423be7ac4d1d64af274b70b897a85b1cde815f" }, "rank": 1.0 + }, + { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/columnstore/columnstore/utils/idbdatafile/PosixFileSystem.h", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 38, + "snippet": { + "text": " int chown(const char* objectName," + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "edadf52c51b65383fbcdec8fcf70136a279635c3c98024e456b364d81f9605f7" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/columnstore/columnstore/versioning/BRM/oidserver.cpp", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 13, + "endColumn": 93, + "snippet": { + "text": " chmod(fFilename.c_str(), 0664); // XXXPAT: override umask at least for testing" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "fab02b6c6609db1b8bb60e7d58130b030d12cced8cf09f8b6ae499171f612a7b" + }, + "rank": 1.0 } ], "externalPropertyFileReferences": { diff -Nru mariadb-10.11.6/tests/mysql_client_fw.c mariadb-10.11.9/tests/mysql_client_fw.c --- mariadb-10.11.6/tests/mysql_client_fw.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tests/mysql_client_fw.c 2024-08-03 07:30:00.000000000 +0000 @@ -568,6 +568,9 @@ #define MAX_RES_FIELDS 50 #define MAX_FIELD_DATA_SIZE 255 +/* Stack usage 18888 with clang */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static int my_process_stmt_result(MYSQL_STMT *stmt) { int field_count; @@ -656,6 +659,7 @@ mysql_free_result(result); return row_count; } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* Prepare statement, execute, and process result set for given query */ @@ -1430,6 +1434,16 @@ tests_to_run[i]= NULL; } +/* + this limited check is enough, if sizeof(MYSQL) changes, it changes + everywhere +*/ +#if defined __x86_64__ + compile_time_assert(sizeof(MYSQL) == 1272); +#elif defined __i386__ + compile_time_assert(sizeof(MYSQL) == 964); +#endif + if (mysql_server_init(embedded_server_arg_count, embedded_server_args, (char**) embedded_server_groups)) diff -Nru mariadb-10.11.6/tests/mysql_client_test.c mariadb-10.11.9/tests/mysql_client_test.c --- mariadb-10.11.6/tests/mysql_client_test.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tests/mysql_client_test.c 2024-08-03 07:30:00.000000000 +0000 @@ -3842,7 +3842,7 @@ short i_data; uchar b_data; int f_data; - long bData; + int bData; char d_data[20]; double szData; MYSQL_BIND my_bind[8]; @@ -3938,7 +3938,7 @@ fprintf(stdout, "\n data (float) : %d(%lu)", f_data, length[4]); fprintf(stdout, "\n data (double) : %s(%lu)", d_data, length[5]); - fprintf(stdout, "\n data (bin) : %ld(%lu)", bData, length[6]); + fprintf(stdout, "\n data (bin) : %d(%lu)", bData, length[6]); fprintf(stdout, "\n data (str) : %g(%lu)", szData, length[7]); } @@ -20564,7 +20564,6 @@ #ifndef EMBEDDED_LIBRARY static void test_proxy_header_tcp(const char *ipaddr, int port) { - int rc; MYSQL_RES *result; int family = (strchr(ipaddr,':') == NULL)?AF_INET:AF_INET6; @@ -20639,6 +20638,11 @@ DIE_UNLESS(strncmp(row[0], normalized_addr, addrlen) == 0); DIE_UNLESS(atoi(row[0] + addrlen+1) == port); mysql_free_result(result); + if (i == 0 && !strcmp(ipaddr,"192.0.2.1")) + { + /* do "dirty" close, to get aborted message in error log.*/ + mariadb_cancel(m); + } mysql_close(m); } sprintf(query,"DROP USER 'u'@'%s'",normalized_addr); @@ -21869,6 +21873,103 @@ rc = mysql_query(mysql, "drop table mdev19838"); myquery(rc); } + +static void test_mdev_24411() +{ + int rc; + MYSQL_STMT *stmt; + MYSQL_BIND bind; + MYSQL_RES *result; + MYSQL_ROW row; + my_ulonglong row_count; + unsigned int vals[] = { 1, 2, 3}; + unsigned int vals_array_len = 3; + const char *insert_stmt= "INSERT INTO t1 VALUES (?)"; + + myheader("test_mdev_24411"); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1"); + myquery(rc); + + rc= mysql_query(mysql, "DROP TABLE IF EXISTS t2"); + myquery(rc); + + rc= mysql_query(mysql, "CREATE TABLE t1 (a INT)"); + myquery(rc); + + rc= mysql_query(mysql, "CREATE TABLE t2 (a INT)"); + myquery(rc); + + rc= mysql_query(mysql, + "CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW " + "BEGIN INSERT INTO t2 (a) VALUES (NEW.a); END;"); + myquery(rc); + + stmt= mysql_stmt_init(mysql); + check_stmt(stmt); + + rc= mysql_stmt_prepare(stmt, insert_stmt, strlen(insert_stmt)); + check_execute(stmt, rc); + + memset(&bind, 0, sizeof(bind)); + bind.buffer_type= MYSQL_TYPE_LONG; + bind.buffer= vals; + + rc= mysql_stmt_attr_set(stmt, STMT_ATTR_ARRAY_SIZE, &vals_array_len); + check_execute(stmt, rc); + + rc= mysql_stmt_bind_param(stmt, &bind); + check_execute(stmt, rc); + + rc= mysql_stmt_execute(stmt); + check_execute(stmt, rc); + + /* + It's expected that the INSERT statement adds three rows into + the table t1 + */ + row_count = mysql_stmt_affected_rows(stmt); + DIE_UNLESS(row_count == 3); + + /* + * Check that the BEFORE INSERT trigger of the table t1 does work correct + * and inserted the rows (1), (2), (3) into the table t2. + */ + rc= mysql_query(mysql, "SELECT 't1' tname, a FROM t1 " + "UNION SELECT 't2' tname, a FROM t2 ORDER BY tname,a"); + myquery(rc); + + result= mysql_store_result(mysql); + + row = mysql_fetch_row(result); + DIE_UNLESS(strcmp(row[0], "t1") == 0 && atoi(row[1]) == 1); + + row = mysql_fetch_row(result); + DIE_UNLESS(strcmp(row[0], "t1") == 0 && atoi(row[1]) == 2); + + row = mysql_fetch_row(result); + DIE_UNLESS(strcmp(row[0], "t1") == 0 && atoi(row[1]) == 3); + + row = mysql_fetch_row(result); + DIE_UNLESS(strcmp(row[0], "t2") == 0 && atoi(row[1]) == 1); + + row = mysql_fetch_row(result); + DIE_UNLESS(strcmp(row[0], "t2") == 0 && atoi(row[1]) == 2); + + row = mysql_fetch_row(result); + DIE_UNLESS(strcmp(row[0], "t2") == 0 && atoi(row[1]) == 3); + + row= mysql_fetch_row(result); + DIE_UNLESS(row == NULL); + + mysql_free_result(result); + + mysql_stmt_close(stmt); + + rc= mysql_query(mysql, "DROP TABLE t1, t2"); + myquery(rc); +} + #endif // EMBEDDED_LIBRARY @@ -21961,6 +22062,45 @@ myquery(rc); } +/* + Check that server_status returned after connecting to server + is consistent with the value of autocommit variable. +*/ +static void test_connect_autocommit() +{ + int rc; + my_bool autocommit[]= {0, 1}; + int i; + rc= mysql_query(mysql, "SET @save_autocommit=@@global.autocommit"); + myquery(rc); + for (i= 0; i < 2; i++) + { + MYSQL *con; + char query[100]; + int autocommit_val; + + con= mysql_client_init(NULL); + DIE_UNLESS(con); + autocommit_val = autocommit[i]; + snprintf(query, sizeof(query), "SET global autocommit=%d", autocommit_val); + rc= mysql_query(mysql, query); + myquery(rc); + + if (!(mysql_real_connect(con, opt_host, opt_user, opt_password, current_db, + opt_port, opt_unix_socket, 0))) + { + fprintf(stderr, "Failed to connect to database: Error: %s\n", + mysql_error(con)); + exit(1); + } + DIE_UNLESS(!!(con->server_status & SERVER_STATUS_AUTOCOMMIT) == autocommit_val); + mysql_close(con); + } + rc= mysql_query(mysql, "SET global autocommit=@save_autocommit"); + myquery(rc); +} + + static void test_execute_direct() { #ifndef EMBEDDED_LIBRARY @@ -22485,8 +22625,12 @@ { "test_mdev18408", test_mdev18408 }, { "test_mdev20261", test_mdev20261 }, { "test_mdev_30159", test_mdev_30159 }, + { "test_connect_autocommit", test_connect_autocommit}, { "test_execute_direct", test_execute_direct }, { "test_cache_metadata", test_cache_metadata}, +#ifndef EMBEDDED_LIBRARY + { "test_mdev_24411", test_mdev_24411}, +#endif { "test_mdev_10075", test_mdev_10075}, { 0, 0 } }; diff -Nru mariadb-10.11.6/tpool/CMakeLists.txt mariadb-10.11.9/tpool/CMakeLists.txt --- mariadb-10.11.6/tpool/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tpool/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -7,7 +7,7 @@ IF(WITH_URING) SET(URING_REQUIRED REQUIRED) ELSEIF(WITH_LIBAIO) - SET(LIBAIO_REQIRED REQUIRED) + SET(LIBAIO_REQUIRED REQUIRED) ENDIF() FIND_PACKAGE(URING QUIET ${URING_REQUIRED}) IF(URING_FOUND) diff -Nru mariadb-10.11.6/tpool/aio_simulated.cc mariadb-10.11.9/tpool/aio_simulated.cc --- mariadb-10.11.6/tpool/aio_simulated.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tpool/aio_simulated.cc 2024-08-03 07:30:00.000000000 +0000 @@ -142,7 +142,7 @@ pool->submit_task(&cb->m_internal_task); } - virtual int submit_io(aiocb *aiocb) override + int submit_io(aiocb *aiocb) override { aiocb->m_internal_task.m_func = simulated_aio_callback; aiocb->m_internal_task.m_arg = aiocb; @@ -152,8 +152,8 @@ return 0; } - virtual int bind(native_file_handle &fd) override { return 0; } - virtual int unbind(const native_file_handle &fd) override { return 0; } + int bind(native_file_handle &fd) override { return 0; } + int unbind(const native_file_handle &fd) override { return 0; } }; aio *create_simulated_aio(thread_pool *tp) diff -Nru mariadb-10.11.6/tpool/aio_win.cc mariadb-10.11.9/tpool/aio_win.cc --- mariadb-10.11.6/tpool/aio_win.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tpool/aio_win.cc 2024-08-03 07:30:00.000000000 +0000 @@ -102,7 +102,7 @@ m_thread.join(); } - virtual int submit_io(aiocb* cb) override + int submit_io(aiocb* cb) override { memset((OVERLAPPED *)cb, 0, sizeof(OVERLAPPED)); cb->m_internal = this; @@ -123,12 +123,12 @@ } // Inherited via aio - virtual int bind(native_file_handle& fd) override + int bind(native_file_handle& fd) override { return CreateIoCompletionPort(fd, m_completion_port, 0, 0) ? 0 : GetLastError(); } - virtual int unbind(const native_file_handle& fd) override { return 0; } + int unbind(const native_file_handle& fd) override { return 0; } }; aio* create_win_aio(thread_pool* pool, int max_io) diff -Nru mariadb-10.11.6/tpool/tpool_generic.cc mariadb-10.11.9/tpool/tpool_generic.cc --- mariadb-10.11.6/tpool/tpool_generic.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tpool/tpool_generic.cc 2024-08-03 07:30:00.000000000 +0000 @@ -244,7 +244,7 @@ unsigned int m_concurrency; /** True, if threadpool is being shutdown, false otherwise */ - bool m_in_shutdown; + bool m_in_shutdown= false; /** Maintenance timer state : true = active(ON),false = inactive(OFF)*/ enum class timer_state_t @@ -304,11 +304,11 @@ } public: thread_pool_generic(int min_threads, int max_threads); - ~thread_pool_generic(); + ~thread_pool_generic() override; void wait_begin() override; void wait_end() override; void submit_task(task *task) override; - virtual aio *create_native_aio(int max_io) override + aio *create_native_aio(int max_io) override { #ifdef _WIN32 return create_win_aio(this, max_io); @@ -436,13 +436,13 @@ m_task.wait(); } - virtual ~timer_generic() + ~timer_generic() override { disarm(); } }; timer_generic m_maintenance_timer; - virtual timer* create_timer(callback_func func, void *data) override + timer* create_timer(callback_func func, void *data) override { return new timer_generic(func, data, this); } @@ -628,7 +628,7 @@ } /* Switch timer off after 1 minute of idle time */ - if (now - idle_since > max_idle_time) + if (now - idle_since > max_idle_time && m_active_threads.empty()) { idle_since= invalid_timestamp; switch_timer(timer_state_t::OFF); @@ -722,13 +722,17 @@ /* Create a new worker.*/ bool thread_pool_generic::add_thread() { - if (m_thread_creation_pending.test_and_set()) - return false; - size_t n_threads = thread_count(); if (n_threads >= m_max_threads) return false; + + /* + Deadlock danger exists, so monitor pool health + with maintenance timer. + */ + switch_timer(timer_state_t::ON); + if (n_threads >= m_min_threads) { auto now = std::chrono::system_clock::now(); @@ -739,12 +743,18 @@ Throttle thread creation and wakeup deadlock detection timer, if is it off. */ - switch_timer(timer_state_t::ON); - return false; } } + /* Check and set "thread creation pending" flag before creating the thread. We + reset the flag in thread_pool_generic::worker_main in new thread created. The + flag must be reset back in case we fail to create the thread. If this flag is + not reset all future attempt to create thread for this pool would not work as + we would return from here. */ + if (m_thread_creation_pending.test_and_set()) + return false; + worker_data *thread_data = m_thread_data_cache.get(); m_active_threads.push_back(thread_data); try @@ -764,6 +774,7 @@ "current number of threads in pool %zu\n", e.what(), thread_count()); warning_written = true; } + m_thread_creation_pending.clear(); return false; } return true; @@ -801,7 +812,7 @@ m_tasks_dequeued(), m_wakeups(), m_spurious_wakeups(), - m_in_shutdown(), + m_timer_state(timer_state_t::ON), m_timestamp(), m_long_tasks_count(), m_waiting_task_count(), @@ -813,6 +824,7 @@ m_maintenance_timer(thread_pool_generic::maintenance_func, this, nullptr) { set_concurrency(); + // start the timer m_maintenance_timer.set_time(0, (int)m_timer_interval.count()); } diff -Nru mariadb-10.11.6/tpool/tpool_structs.h mariadb-10.11.9/tpool/tpool_structs.h --- mariadb-10.11.6/tpool/tpool_structs.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tpool/tpool_structs.h 2024-08-03 07:30:00.000000000 +0000 @@ -155,12 +155,11 @@ { mysql_mutex_lock(&m_mtx); assert(!is_full()); + const bool was_empty= is_empty(); // put element to the logical end of the array m_cache[--m_pos] = ele; - /* Notify waiters when the cache becomes - not empty, or when it becomes full */ - if (m_pos == 1 || (m_waiters && is_full())) + if (was_empty || (is_full() && m_waiters)) pthread_cond_broadcast(&m_cv); mysql_mutex_unlock(&m_mtx); } diff -Nru mariadb-10.11.6/tpool/tpool_win.cc mariadb-10.11.9/tpool/tpool_win.cc --- mariadb-10.11.6/tpool/tpool_win.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/tpool/tpool_win.cc 2024-08-03 07:30:00.000000000 +0000 @@ -143,7 +143,7 @@ /** Submit async IO. */ - virtual int submit_io(aiocb* cb) override + int submit_io(aiocb* cb) override { memset((OVERLAPPED *)cb, 0, sizeof(OVERLAPPED)); @@ -191,7 +191,7 @@ /** Binds the file handle via CreateThreadpoolIo(). */ - virtual int bind(native_file_handle& fd) override + int bind(native_file_handle& fd) override { fd.m_ptp_io = CreateThreadpoolIo(fd.m_handle, io_completion_callback, 0, &(m_pool.m_env)); @@ -203,7 +203,7 @@ /** Unbind the file handle via CloseThreadpoolIo. */ - virtual int unbind(const native_file_handle& fd) override + int unbind(const native_file_handle& fd) override { if (fd.m_ptp_io) CloseThreadpoolIo(fd.m_ptp_io); @@ -261,7 +261,7 @@ task->execute(); } - virtual void submit_task(task *task) override + void submit_task(task *task) override { auto entry= m_task_cache.get(); task->add_ref(); diff -Nru mariadb-10.11.6/unittest/embedded/CMakeLists.txt mariadb-10.11.9/unittest/embedded/CMakeLists.txt --- mariadb-10.11.6/unittest/embedded/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/embedded/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/libmysqld/include - ${PCRE_INCLUDES} + ${PCRE_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/sql ${MY_READLINE_INCLUDE_DIR} ) diff -Nru mariadb-10.11.6/unittest/mysys/CMakeLists.txt mariadb-10.11.9/unittest/mysys/CMakeLists.txt --- mariadb-10.11.6/unittest/mysys/CMakeLists.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/mysys/CMakeLists.txt 2024-08-03 07:30:00.000000000 +0000 @@ -19,7 +19,7 @@ MY_ADD_TESTS(my_vsnprintf LINK_LIBRARIES strings mysys) MY_ADD_TESTS(aes LINK_LIBRARIES mysys mysys_ssl) ADD_DEFINITIONS(${SSL_DEFINES}) -INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS}) MY_ADD_TESTS(ma_dyncol LINK_LIBRARIES mysys) IF(WIN32) diff -Nru mariadb-10.11.6/unittest/mysys/bitmap-t.c mariadb-10.11.9/unittest/mysys/bitmap-t.c --- mariadb-10.11.6/unittest/mysys/bitmap-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/mysys/bitmap-t.c 2024-08-03 07:30:00.000000000 +0000 @@ -29,6 +29,8 @@ uint get_rand_bit(uint bitsize) { + if (bitsize == 0) + return 0; return (rand() % bitsize); } @@ -121,6 +123,8 @@ return TRUE; } +PRAGMA_DISABLE_CHECK_STACK_FRAME + my_bool test_compare_operators(MY_BITMAP *map, uint bitsize) { uint i, j, test_bit1, test_bit2, test_bit3,test_bit4; @@ -226,6 +230,8 @@ test_bit1); return TRUE; } +PRAGMA_REENABLE_CHECK_STACK_FRAME + my_bool test_count_bits_set(MY_BITMAP *map, uint bitsize) { @@ -266,7 +272,7 @@ bitmap_clear_all(map); for (i=0; i < bitsize; i++) bitmap_set_bit(map, i); - if (bitmap_get_first(map) != MY_BIT_NONE) + if (bitmap_get_first_clear(map) != MY_BIT_NONE) goto error2; bitmap_clear_all(map); @@ -278,7 +284,7 @@ goto error1; bitmap_set_all(map); bitmap_clear_bit(map, test_bit); - if (bitmap_get_first(map) != test_bit) + if (bitmap_get_first_clear(map) != test_bit) goto error2; bitmap_clear_all(map); } @@ -297,14 +303,45 @@ uint no_loops= bitsize > 128 ? 128 : bitsize; for (i=0; i < no_loops; i++) { + uint count= 0, bits_set= 0; + bitmap_clear_all(map); test_bit=get_rand_bit(bitsize); for (j=0; j < test_bit; j++) bitmap_set_next(map); if (!bitmap_is_prefix(map, test_bit)) goto error1; + j= bitmap_get_first_set(map); + if (j == MY_BIT_NONE) + { + if (test_bit != 0) + goto error1; + continue; + } + count= 1; + while ((j= bitmap_get_next_set(map,j)) != MY_BIT_NONE) + count++; + if (count != test_bit) + goto error1; + + if (test_bit < 3) + continue; bitmap_clear_all(map); + for (j=1; j < test_bit; j+=2) + { + bits_set++; + bitmap_set_bit(map, j); + } + if ((j= bitmap_get_first_set(map)) == MY_BIT_NONE) + goto error1; + count= 1; + while ((j= bitmap_get_next_set(map,j)) != MY_BIT_NONE) + count++; + if (count != bits_set) + goto error1; } + return FALSE; + error1: diag("get_next error bitsize= %u, prefix_size= %u", bitsize,test_bit); return TRUE; @@ -371,7 +408,7 @@ my_bool test_compare(MY_BITMAP *map, uint bitsize) { MY_BITMAP map2; - uint32 map2buf[MAX_TESTED_BITMAP_SIZE]; + my_bitmap_map map2buf[MAX_TESTED_BITMAP_SIZE]; uint i, test_bit; uint no_loops= bitsize > 128 ? 128 : bitsize; if (my_bitmap_init(&map2, map2buf, bitsize)) @@ -431,7 +468,7 @@ { uint bitsize2 = 1 + get_rand_bit(MAX_TESTED_BITMAP_SIZE - 1); MY_BITMAP map2; - uint32 map2buf[MAX_TESTED_BITMAP_SIZE]; + my_bitmap_map map2buf[MAX_TESTED_BITMAP_SIZE]; uint i, test_bit1, test_bit2, test_bit3; if (my_bitmap_init(&map2, map2buf, bitsize2)) { @@ -477,6 +514,107 @@ return TRUE; } +my_bool test_copy(MY_BITMAP *map, uint bitsize) +{ + my_bitmap_map buff[16], buff2[16], buff3[16]; + MY_BITMAP map2, map3; + uint rnd_bit; + + my_bitmap_init(&map2, buff, sizeof(buff)*8); + my_bitmap_init(&map3, buff2, sizeof(buff)*8); + bitmap_set_all(&map2); + bitmap_set_all(&map3); + + bitsize= MY_MIN(bitsize, map2.n_bits); + bitmap_copy(map, &map2); + if (bitmap_bits_set(map) != bitsize) + { + diag("bitmap_copy failed on bitsize %d", bitsize); + return 1; + } + bitmap_set_prefix(&map2, rnd_bit= get_rand_bit(bitsize)+1); + bitmap_export((uchar*) buff3, &map2); + bitmap_import(&map3, (uchar*) buff3); + if (!bitmap_cmp(&map2, &map3)) + { + diag("bitmap_export/bitmap_import failed on bitsize %d rnd_bit: %d", + bitsize, rnd_bit); + return 1; + } + return 0; +} + +static my_bool exec_bitmap_exists_intersection(MY_BITMAP **maps, uint bitsize, + uint start, uint end, uint bit) +{ + bitmap_clear_all(maps[0]); + bitmap_clear_all(maps[1]); + bitmap_set_bit(maps[0], bit); + bitmap_set_bit(maps[1], bit); + return bitmap_exists_intersection(maps, 2, start, end); +} + +my_bool test_bitmap_exists_intersection(MY_BITMAP *map, uint bitsize) +{ + MY_BITMAP map2; + uint start_bit, end_bit, rnd_bit; + MY_BITMAP *maps[2]; + maps[0]= map; + maps[1]= &map2; + + my_bitmap_init(&map2, 0, bitsize); + bitmap_clear_all(map); + bitmap_clear_all(&map2); + + start_bit= get_rand_bit(bitsize); + end_bit= get_rand_bit(bitsize); + if (start_bit > end_bit) + swap_variables(uint, start_bit, end_bit); + rnd_bit= start_bit+get_rand_bit(end_bit-start_bit); + + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= end_bit= rnd_bit= 0; + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= rnd_bit= 0 ; end_bit= bitsize-1; + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= rnd_bit= end_bit= bitsize-1; + if (!exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + if (bitsize > 1) + { + start_bit= end_bit= 1 ; rnd_bit= 0; + if (exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + + start_bit= end_bit= bitsize-1 ; rnd_bit= bitsize-2; + if (exec_bitmap_exists_intersection(maps, bitsize, start_bit, end_bit, + rnd_bit)) + goto err; + } + + my_bitmap_free(&map2); + return 0; +err: + diag("bitmap_exist_intersection failed on bitsize: %d start_bit: %d " + "end_bit: %d rnd_bit: %d", + bitsize, start_bit, end_bit, rnd_bit); + my_bitmap_free(&map2); + return 1; +} + + my_bool do_test(uint bitsize) { MY_BITMAP map; @@ -515,6 +653,12 @@ bitmap_clear_all(&map); if (test_intersect(&map,bitsize)) goto error; + bitmap_clear_all(&map); + if (test_copy(&map,bitsize)) + goto error; + bitmap_clear_all(&map); + if (test_bitmap_exists_intersection(&map, bitsize)) + goto error; return FALSE; error: return TRUE; diff -Nru mariadb-10.11.6/unittest/mysys/crc32-t.c mariadb-10.11.9/unittest/mysys/crc32-t.c --- mariadb-10.11.6/unittest/mysys/crc32-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/mysys/crc32-t.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,4 @@ -/* Copyright (c) MariaDB 2020 +/* Copyright (c) MariaDB 2020, 2024 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -19,51 +19,127 @@ #include #include #include -#include /* - Check that optimized crc32 (ieee, or ethernet polynomical) returns the same - result as zlib (not so well optimized, yet, but trustworthy) + The following lookup table oriented computation of CRC-32 + is based on the Public Domain / Creative Commons CC0 Perl code from + http://billauer.co.il/blog/2011/05/perl-crc32-crc-xs-module/ */ -#define DO_TEST_CRC32(crc,str) \ - ok(crc32(crc,(const Bytef *)str,(uint)(sizeof(str)-1)) == my_checksum(crc, str, sizeof(str)-1), "crc32 '%s'",str) -/* Check that CRC32-C calculation returns correct result*/ -#define DO_TEST_CRC32C(crc,str,expected) \ - do { \ - unsigned int v = my_crc32c(crc, str, sizeof(str)-1); \ - printf("crc32(%u,'%s',%zu)=%u\n",crc,str,sizeof(str)-1,v); \ - ok(expected == my_crc32c(crc, str, sizeof(str)-1),"crc32c '%s'",str); \ - }while(0) - - -#define LONG_STR "1234567890234568900212345678901231213123321212123123123123123"\ - "............................................................................." \ - "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ - "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" \ - "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz" +/** Lookup tables */ +static uint32 tab_3309[256], tab_castagnoli[256]; + +/** Initialize a lookup table for a CRC-32 polynomial */ +static void init_lookup(uint32 *tab, uint32 polynomial) +{ + unsigned i; + for (i= 0; i < 256; i++) + { + uint32 x= i; + unsigned j; + for (j= 0; j < 8; j++) + if (x & 1) + x= (x >> 1) ^ polynomial; + else + x>>= 1; + tab[i]= x; + } +} + +/** Compute a CRC-32 one octet at a time based on a lookup table */ +static uint crc_(uint32 crc, const void *buf, size_t len, const uint32 *tab) +{ + const unsigned char *b= buf; + const unsigned char *const end = b + len; + crc^= 0xffffffff; + while (b != end) + crc= ((crc >> 8) & 0xffffff) ^ tab[(crc ^ *b++) & 0xff]; + crc^= 0xffffffff; + return crc; +} + +static uint crc32(uint32 crc, const void *buf, size_t len) +{ return crc_(crc, buf, len, tab_3309); } +static uint crc32c(uint32 crc, const void *buf, size_t len) +{ return crc_(crc, buf, len, tab_castagnoli); } + +static char buf[16384]; + +typedef uint (*check)(uint32, const void*, size_t); + +static size_t test_buf(check c1, check c2) +{ + size_t s; + for (s= sizeof buf; s; s--) + if (c1(0, buf, s) != c2(0, buf, s)) + break; + return s; +} + +#define DO_TEST_CRC32(crc,str,len) \ + ok(crc32(crc,str,len) == my_checksum(crc, str, len), \ + "crc32(%u,'%.*s')", crc, (int) len, str) + +/* Check that CRC-32C calculation returns correct result*/ +#define DO_TEST_CRC32C(crc,str,len) \ + ok(crc32c(crc,str,len) == my_crc32c(crc, str, len), \ + "crc32c(%u,'%.*s')", crc, (int) len, str) + +static const char STR[]= + "123456789012345678900212345678901231213123321212123123123123123" + "..........................................................................." + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" + "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"; int main(int argc __attribute__((unused)),char *argv[]) { MY_INIT(argv[0]); - plan(14); + init_lookup(tab_3309, 0xedb88320); + init_lookup(tab_castagnoli, 0x82f63b78); + + plan(36); printf("%s\n",my_crc32c_implementation()); - DO_TEST_CRC32(0,""); - DO_TEST_CRC32(1,""); - DO_TEST_CRC32(0,"12345"); - DO_TEST_CRC32(1,"12345"); - DO_TEST_CRC32(0,"1234567890123456789"); - DO_TEST_CRC32(0, LONG_STR); + DO_TEST_CRC32(0,STR,0); + DO_TEST_CRC32(1,STR,0); + DO_TEST_CRC32(0,STR,3); + DO_TEST_CRC32(0,STR,5); + DO_TEST_CRC32(1,STR,5); + DO_TEST_CRC32(0,STR,15); + DO_TEST_CRC32(0,STR,16); + DO_TEST_CRC32(0,STR,19); + DO_TEST_CRC32(0,STR,32); + DO_TEST_CRC32(0,STR,63); + DO_TEST_CRC32(0,STR,64); + DO_TEST_CRC32(0,STR,65); + DO_TEST_CRC32(0,STR,255); + DO_TEST_CRC32(0,STR,256); + DO_TEST_CRC32(0,STR,257); + DO_TEST_CRC32(0,STR,(sizeof(STR)-1)); ok(0 == my_checksum(0, NULL, 0) , "crc32 data = NULL, length = 0"); - DO_TEST_CRC32C(0,"", 0); - DO_TEST_CRC32C(1,"", 1); - DO_TEST_CRC32C(0, "12345", 416359221); - DO_TEST_CRC32C(1, "12345", 549473433); - DO_TEST_CRC32C(0, "1234567890123456789", 2366987449U); - DO_TEST_CRC32C(0, LONG_STR, 3009234172U); + DO_TEST_CRC32C(0,STR,0); + DO_TEST_CRC32C(1,STR,0); + DO_TEST_CRC32C(0,STR,3); + DO_TEST_CRC32C(0,STR,5); + DO_TEST_CRC32C(1,STR,5); + DO_TEST_CRC32C(0,STR,15); + DO_TEST_CRC32C(0,STR,16); + DO_TEST_CRC32C(0,STR,19); + DO_TEST_CRC32C(0,STR,32); + DO_TEST_CRC32C(0,STR,63); + DO_TEST_CRC32C(0,STR,64); + DO_TEST_CRC32C(0,STR,65); + DO_TEST_CRC32C(0,STR,255); + DO_TEST_CRC32C(0,STR,256); + DO_TEST_CRC32C(0,STR,257); + DO_TEST_CRC32C(0,STR,(sizeof(STR)-1)); ok(0 == my_crc32c(0, NULL, 0), "crc32c data = NULL, length = 0"); + memset(buf, 0x5a, sizeof buf); + ok(0 == test_buf(my_checksum, crc32), "crc32 with various lengths"); + ok(0 == test_buf(my_crc32c, crc32c), "crc32c with various lengths"); + my_end(0); return exit_status(); } diff -Nru mariadb-10.11.6/unittest/mysys/my_getopt-t.c mariadb-10.11.9/unittest/mysys/my_getopt-t.c --- mariadb-10.11.6/unittest/mysys/my_getopt-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/mysys/my_getopt-t.c 2024-08-03 07:30:00.000000000 +0000 @@ -378,10 +378,10 @@ "res:%d, argc:%d, opt_ull:%llu", res, arg_c, opt_ull); run("--ull=-100", NULL); - ok(res==9 && arg_c==1 && opt_ull==0ULL, + ok(res==13 && arg_c==0 && opt_ull==0ULL, "res:%d, argc:%d, opt_ull:%llu", res, arg_c, opt_ull); run("--ul=-100", NULL); - ok(res==9 && arg_c==1 && opt_ul==0UL, + ok(res==13 && arg_c==0 && opt_ul==0UL, "res:%d, argc:%d, opt_ul:%lu", res, arg_c, opt_ul); my_end(0); diff -Nru mariadb-10.11.6/unittest/sql/mf_iocache-t.cc mariadb-10.11.9/unittest/sql/mf_iocache-t.cc --- mariadb-10.11.6/unittest/sql/mf_iocache-t.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/sql/mf_iocache-t.cc 2024-08-03 07:30:00.000000000 +0000 @@ -96,6 +96,8 @@ /*** end of encryption tweaks and stubs ****************************/ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static IO_CACHE info; #define CACHE_SIZE 16384 @@ -472,3 +474,4 @@ return exit_status(); } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff -Nru mariadb-10.11.6/unittest/sql/my_apc-t.cc mariadb-10.11.9/unittest/sql/my_apc-t.cc --- mariadb-10.11.6/unittest/sql/my_apc-t.cc 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/sql/my_apc-t.cc 2024-08-03 07:30:00.000000000 +0000 @@ -123,7 +123,7 @@ int *where_to; // Where to write it Apc_order(int a, int *b) : value(a), where_to(b) {} - void call_in_target_thread() + void call_in_target_thread() override { my_sleep(int_rand(1000)); *where_to = value; diff -Nru mariadb-10.11.6/unittest/strings/strings-t.c mariadb-10.11.9/unittest/strings/strings-t.c --- mariadb-10.11.6/unittest/strings/strings-t.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/unittest/strings/strings-t.c 2024-08-03 07:30:00.000000000 +0000 @@ -1166,6 +1166,19 @@ {{CSTR("ss")}, {CSTR(UTF8_sz)}, 4, TCHAR, 0}, {{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 0, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 1, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 2, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 3, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 100, TCHAR, 0}, + + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 0, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 1, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 2, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 3, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 4, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 100, TCHAR, 0}, + {{NULL, 0}, {NULL, 0}, 0, 0, 0} }; @@ -1193,6 +1206,19 @@ {{CSTR("ss")}, {CSTR(UTF8_sz)}, 4, TVCHAR, 0}, {{CSTR("ss")}, {CSTR(UTF8_sz)}, 100, TVCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 0, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 1, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 2, TCHAR, -1}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 3, TCHAR, 0}, + {{CSTR("a" "\x01")}, {CSTR(UTF8_auml)}, 100, TCHAR, 0}, + + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 0, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 1, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 2, TCHAR, -1}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 3, TCHAR, -1}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 4, TCHAR, 0}, + {{CSTR("a" "\x01\x01")}, {CSTR(UTF8_auml)}, 100, TCHAR, 0}, + {{NULL, 0}, {NULL, 0}, 0, 0, 0} }; diff -Nru mariadb-10.11.6/vio/vio.c mariadb-10.11.9/vio/vio.c --- mariadb-10.11.6/vio/vio.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/vio/vio.c 2024-08-03 07:30:00.000000000 +0000 @@ -79,6 +79,7 @@ int vio_pipe_shutdown(Vio *vio, int how) { vio->shutdown_flag= how; + vio->state= VIO_STATE_SHUTDOWN; return CancelIoEx(vio->hPipe, NULL); } #endif @@ -98,6 +99,7 @@ #endif memset(vio, 0, sizeof(*vio)); vio->type= type; + vio->state= VIO_STATE_ACTIVE; vio->mysql_socket= MYSQL_INVALID_SOCKET; mysql_socket_setfd(&vio->mysql_socket, sd); vio->localhost= flags & VIO_LOCALHOST; diff -Nru mariadb-10.11.6/vio/viosocket.c mariadb-10.11.9/vio/viosocket.c --- mariadb-10.11.6/vio/viosocket.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/vio/viosocket.c 2024-08-03 07:30:00.000000000 +0000 @@ -288,12 +288,18 @@ int vio_socket_shutdown(Vio *vio, int how) { - int ret= shutdown(mysql_socket_getfd(vio->mysql_socket), how); + int ret; + DBUG_ENTER("vio_socket_shutdown"); + DBUG_PRINT("enter", ("sd: %d", (int)mysql_socket_getfd(vio->mysql_socket))); + + vio->state= VIO_STATE_SHUTDOWN; + ret= shutdown(mysql_socket_getfd(vio->mysql_socket), how); + #ifdef _WIN32 /* Cancel possible IO in progress (shutdown does not do that on Windows). */ (void) CancelIoEx((HANDLE)mysql_socket_getfd(vio->mysql_socket), NULL); #endif - return ret; + DBUG_RETURN(ret); } @@ -552,7 +558,8 @@ vio_should_retry(Vio *vio) { DBUG_ENTER("vio_should_retry"); - DBUG_PRINT("info", ("vio_errno: %d", vio_errno(vio))); + DBUG_PRINT("info", ("vio_errno: %d state: %d", + vio_errno(vio), (int) vio->state)); DBUG_RETURN(vio_errno(vio) == SOCKET_EINTR); } @@ -576,28 +583,30 @@ int vio_close(Vio *vio) { - int r=0; DBUG_ENTER("vio_close"); DBUG_PRINT("enter", ("sd: %d", (int)mysql_socket_getfd(vio->mysql_socket))); if (vio->type != VIO_CLOSED) { + MYSQL_SOCKET mysql_socket= vio->mysql_socket; DBUG_ASSERT(vio->type == VIO_TYPE_TCPIP || - vio->type == VIO_TYPE_SOCKET || - vio->type == VIO_TYPE_SSL); + vio->type == VIO_TYPE_SOCKET || + vio->type == VIO_TYPE_SSL); - DBUG_ASSERT(mysql_socket_getfd(vio->mysql_socket) >= 0); - if (mysql_socket_close(vio->mysql_socket)) - r= -1; - } - if (r) - { - DBUG_PRINT("vio_error", ("close() failed, error: %d",socket_errno)); - /* FIXME: error handling (not critical for MySQL) */ + + vio->type= VIO_CLOSED; + vio->state= VIO_STATE_CLOSED; + vio->mysql_socket= MYSQL_INVALID_SOCKET; + + DBUG_ASSERT(mysql_socket_getfd(mysql_socket) >= 0); + if (mysql_socket_close(mysql_socket)) + { + DBUG_PRINT("vio_error", ("close() failed, error: %d",socket_errno)); + /* FIXME: error handling (not critical for MySQL) */ + DBUG_RETURN(-1); + } } - vio->type= VIO_CLOSED; - vio->mysql_socket= MYSQL_INVALID_SOCKET; - DBUG_RETURN(r); + DBUG_RETURN(0); } @@ -917,8 +926,11 @@ my_socket sd= mysql_socket_getfd(vio->mysql_socket); MYSQL_SOCKET_WAIT_VARIABLES(locker, state) /* no ';' */ DBUG_ENTER("vio_io_wait"); - DBUG_PRINT("enter", ("timeout: %d", timeout)); + DBUG_PRINT("enter", ("sd: %d timeout: %d", + (int) mysql_socket_getfd(vio->mysql_socket), + timeout)); + DBUG_ASSERT(vio->state != VIO_STATE_CLOSED); memset(&pfd, 0, sizeof(pfd)); pfd.fd= sd; @@ -948,7 +960,7 @@ switch ((ret= poll(&pfd, 1, timeout))) { case -1: - DBUG_PRINT("error", ("poll returned -1")); + DBUG_PRINT("error", ("poll returned -1 errno: %d", vio_errno(vio))); /* On error, -1 is returned. */ break; case 0: @@ -979,6 +991,7 @@ fd_set readfds, writefds, exceptfds; MYSQL_SOCKET_WAIT_VARIABLES(locker, state) /* no ';' */ DBUG_ENTER("vio_io_wait"); + DBUG_ASSERT(vio->state != VIO_STATE_CLOSED); /* Convert the timeout, in milliseconds, to seconds and microseconds. */ if (timeout >= 0) @@ -1152,6 +1165,7 @@ { uint bytes= 0; DBUG_ENTER("vio_is_connected"); + DBUG_ASSERT(vio->state != VIO_STATE_CLOSED); /* The first step of detecting an EOF condition is verifying @@ -1159,6 +1173,7 @@ the EOF. An exceptional condition event and/or errors are interpreted as if there is data to read. */ + if (!vio_io_wait(vio, VIO_IO_EVENT_READ, 0)) DBUG_RETURN(TRUE); diff -Nru mariadb-10.11.6/win/packaging/CPackWixConfig.cmake mariadb-10.11.9/win/packaging/CPackWixConfig.cmake --- mariadb-10.11.6/win/packaging/CPackWixConfig.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/win/packaging/CPackWixConfig.cmake 2024-08-03 07:30:00.000000000 +0000 @@ -63,7 +63,7 @@ #Miscellaneous (hidden) components, part of server / or client programs - FOREACH(comp connect-engine ClientPlugins gssapi-server gssapi-client aws-key-management rocksdb-engine) + FOREACH(comp connect-engine ClientPlugins gssapi-server gssapi-client aws-key-management rocksdb-engine plugin-hashicorp-key-management) STRING(TOUPPER "${comp}" comp) SET(CPACK_COMPONENT_${comp}_GROUP "MySQLServer") SET(CPACK_COMPONENT_${comp}_HIDDEN 1) diff -Nru mariadb-10.11.6/win/packaging/heidisql.cmake mariadb-10.11.9/win/packaging/heidisql.cmake --- mariadb-10.11.6/win/packaging/heidisql.cmake 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/win/packaging/heidisql.cmake 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,4 @@ -SET(HEIDISQL_BASE_NAME "HeidiSQL_12.3_32_Portable") +SET(HEIDISQL_BASE_NAME "HeidiSQL_12.6_32_Portable") SET(HEIDISQL_ZIP "${HEIDISQL_BASE_NAME}.zip") SET(HEIDISQL_URL "http://www.heidisql.com/downloads/releases/${HEIDISQL_ZIP}") SET(HEIDISQL_DOWNLOAD_DIR ${THIRD_PARTY_DOWNLOAD_LOCATION}/${HEIDISQL_BASE_NAME}) diff -Nru mariadb-10.11.6/win/packaging/heidisql.wxi.in mariadb-10.11.9/win/packaging/heidisql.wxi.in --- mariadb-10.11.6/win/packaging/heidisql.wxi.in 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/win/packaging/heidisql.wxi.in 2024-08-03 07:30:00.000000000 +0000 @@ -68,6 +68,12 @@ + + + + + + @@ -115,6 +121,8 @@ + + diff -Nru mariadb-10.11.6/wsrep-lib/.github/workflows/build.yml mariadb-10.11.9/wsrep-lib/.github/workflows/build.yml --- mariadb-10.11.6/wsrep-lib/.github/workflows/build.yml 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/.github/workflows/build.yml 2024-08-03 07:30:02.000000000 +0000 @@ -45,11 +45,11 @@ CC: gcc version: "10" type: Release - - os: ubuntu-20.04 + - os: ubuntu-22.04 CC: gcc version: "11" type: Debug - - os: ubuntu-20.04 + - os: ubuntu-22.04 CC: gcc version: "11" type: Release @@ -61,6 +61,22 @@ CC: gcc version: "12" type: Release + - os: ubuntu-24.04 + CC: gcc + version: "13" + type: Debug + - os: ubuntu-24.04 + CC: gcc + version: "13" + type: Release + - os: ubuntu-24.04 + CC: gcc + version: "14" + type: Debug + - os: ubuntu-24.04 + CC: gcc + version: "14" + type: Release # Clang - os: ubuntu-20.04 CC: clang diff -Nru mariadb-10.11.6/wsrep-lib/CMakeLists.txt mariadb-10.11.9/wsrep-lib/CMakeLists.txt --- mariadb-10.11.6/wsrep-lib/CMakeLists.txt 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/CMakeLists.txt 2024-08-03 07:30:02.000000000 +0000 @@ -126,61 +126,7 @@ set(WSREP_LIB_LIBDL "") endif() -set(MIN_BOOST_VERSION "1.54.0") -if (WSREP_LIB_WITH_UNIT_TESTS) - if (WSREP_LIB_WITH_UNIT_TESTS_EXTRA) - message(STATUS "Compiling extra unit tests") - set(json_HEADER "boost/json/src.hpp") - # Extra tests may require packages from very recent boost which may be - # unavailable on the system. In such case download private boost distro. - check_include_file_cxx(${json_HEADER} system_json_FOUND) - if (NOT system_json_FOUND) - if (NOT WITH_BOOST) - set(WITH_BOOST "${CMAKE_SOURCE_DIR}/third_party/boost") - endif() - set(DOWNLOAD_BOOST ON) - include (cmake/boost.cmake) - set(MIN_BOOST_VERSION "${BOOST_MAJOR}.${BOOST_MINOR}.${BOOST_PATCH}") - message(STATUS "Boost includes: ${BOOST_INCLUDE_DIR}, ver: ${MIN_BOOST_VERSION}") - find_package(Boost ${MIN_BOOST_VERSION} REQUIRED - COMPONENTS json headers unit_test_framework - PATHS ${WITH_BOOST}/lib/cmake - NO_DEFAULT_PATH - ) - # Include as system header to be more permissive about generated - # warnings. - set(CMAKE_REQUIRED_FLAGS "-isystem ${BOOST_INCLUDE_DIR}") - check_include_file_cxx(${json_HEADER} json_FOUND) - if (NOT json_FOUND) - message(FATAL_ERROR "Required header 'boost/json.hpp' not found: ${json_FOUND}") - else() - include_directories(SYSTEM ${BOOST_INCLUDE_DIR}) - endif() - endif() - else() - find_package(Boost ${MIN_BOOST_VERSION} - COMPONENTS unit_test_framework - ) - - if (NOT Boost_UNIT_TEST_FRAMEWORK_FOUND) - # Check if we have header implementation available from - # extracted source tarball. - if (NOT WITH_BOOST) - message(FATAL_ERROR "System Boost not found, specify Boost installation with WITH_BOOST=") - endif() - CHECK_CXX_SOURCE_COMPILES( - " -#define BOOST_TEST_ALTERNATIVE_INIT_API -#include -bool init_unit_test() { return true; } -" - FOUND_BOOST_TEST_INCLUDED_UNIT_TEST_HPP) - if (NOT FOUND_BOOST_TEST_INCLUDED_UNIT_TEST_HPP) - message(FATAL_ERROR "Boost unit test header not found") - endif() - endif() - endif() -endif() +include(cmake/unittests.cmake) if (WSREP_LIB_WITH_DBSIM) find_package(Boost ${MIN_BOOST_VERSION} REQUIRED diff -Nru mariadb-10.11.6/wsrep-lib/cmake/unittests.cmake mariadb-10.11.9/wsrep-lib/cmake/unittests.cmake --- mariadb-10.11.6/wsrep-lib/cmake/unittests.cmake 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/cmake/unittests.cmake 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1,87 @@ +# Copyright (c) 2024, Codership Oy. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License, version 2.0, +# as published by the Free Software Foundation. +# +# This program is also distributed with certain software (including +# but not limited to OpenSSL) that is licensed under separate terms, +# as designated in a particular file or component or in included license +# documentation. The authors of MySQL hereby grant you an additional +# permission to link the program and your derivative works with the +# separately licensed software that they have included with MySQL. +# +# 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, version 2.0, for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +if (NOT WSREP_LIB_WITH_UNIT_TESTS) + return() +endif() + +set(MIN_BOOST_VERSION "1.54.0") +if (WSREP_LIB_WITH_UNIT_TESTS_EXTRA) + message(STATUS "Compiling extra unit tests") + set(json_HEADER "boost/json/src.hpp") + # Extra tests may require packages from very recent boost which may be + # unavailable on the system. In such case download private boost distro. + check_include_file_cxx(${json_HEADER} system_json_FOUND) + if (NOT system_json_FOUND) + if (NOT WITH_BOOST) + set(WITH_BOOST "${CMAKE_SOURCE_DIR}/third_party/boost") + endif() + set(DOWNLOAD_BOOST ON) + include (cmake/boost.cmake) + set(MIN_BOOST_VERSION "${BOOST_MAJOR}.${BOOST_MINOR}.${BOOST_PATCH}") + message(STATUS "Boost includes: ${BOOST_INCLUDE_DIR}, ver: ${MIN_BOOST_VERSION}") + find_package(Boost ${MIN_BOOST_VERSION} REQUIRED + COMPONENTS json headers unit_test_framework + PATHS ${WITH_BOOST}/lib/cmake + NO_DEFAULT_PATH + ) + # Include as system header to be more permissive about generated + # warnings. + set(CMAKE_REQUIRED_FLAGS "-isystem ${BOOST_INCLUDE_DIR}") + check_include_file_cxx(${json_HEADER} json_FOUND) + if (NOT json_FOUND) + message(FATAL_ERROR "Required header 'boost/json.hpp' not found: ${json_FOUND}") + else() + include_directories(SYSTEM ${BOOST_INCLUDE_DIR}) + endif() + endif() + return() +endif() # WSREP_LIB_WITH_UNIT_TESTS_EXTRA + +# Superproject has already detected Boost. Most likely MySQL 8.0 or later. +if (BOOST_INCLUDE_DIR) + message(STATUS "Boost include dir set to ${BOOST_INCLUDE_DIR}") + cmake_push_check_state() + list(APPEND CMAKE_REQUIRED_INCLUDES "${BOOST_INCLUDE_DIR}") + # Append -isystem to tolerate warnings from compiler + list(APPEND CMAKE_REQUIRED_FLAGS "-isystem ${BOOST_INCLUDE_DIR}") + check_cxx_source_compiles( + " +#define BOOST_TEST_ALTERNATIVE_INIT_API +#include +bool init_unit_test() { return true; } +" + FOUND_BOOST_TEST_INCLUDED_UNIT_TEST_HPP) + if (NOT FOUND_BOOST_TEST_INCLUDED_UNIT_TEST_HPP) + message(FATAL_ERROR + "Boost unit test header file not found from ${CMAKE_REQUIRED_INCLUDES}") + endif() + cmake_pop_check_state() + include_directories(SYSTEM ${BOOST_INCLUDE_DIR}) + return() +endif() # BOOST_INCLUDE_DIR + +# System Boost. +find_package(Boost ${MIN_BOOST_VERSION} + REQUIRED + COMPONENTS unit_test_framework + ) diff -Nru mariadb-10.11.6/wsrep-lib/dbsim/db_client_service.hpp mariadb-10.11.9/wsrep-lib/dbsim/db_client_service.hpp --- mariadb-10.11.6/wsrep-lib/dbsim/db_client_service.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/dbsim/db_client_service.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -82,6 +82,11 @@ return false; } + bool is_prepared_xa() override + { + return false; + } + bool is_xa_rollback() override { return false; diff -Nru mariadb-10.11.6/wsrep-lib/dbsim/db_threads.cpp mariadb-10.11.9/wsrep-lib/dbsim/db_threads.cpp --- mariadb-10.11.6/wsrep-lib/dbsim/db_threads.cpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/dbsim/db_threads.cpp 2024-08-03 07:30:02.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019 Codership Oy + * Copyright (C) 2019-2023 Codership Oy * * This file is part of wsrep-lib. * @@ -113,12 +113,10 @@ ::abort(); } } + static inline int append_key(const char* name, const char* type) { - key_vec.push_back(std::string(name) + "_" + type); - wsrep::log_info() << "Register key " << name << "_" << type - << " with index " << (key_cnt + 1); ops_map.push_back(std::vector()); ops_map_sync.push_back(new std::mutex()); ops_map.back().resize(oc_max); @@ -175,21 +173,6 @@ void* args; }; - pthread_key_t this_thread_key; - struct this_thread_key_initializer - { - this_thread_key_initializer() - { - pthread_key_create(&this_thread_key, nullptr); - } - - ~this_thread_key_initializer() - { - pthread_key_delete(this_thread_key); - } - }; - - class ti_thread : public ti_obj { public: @@ -229,11 +212,7 @@ void retval(void* retval) { retval_ = retval; } - static ti_thread* self() - { - return reinterpret_cast( - pthread_getspecific(this_thread_key)); - } + static ti_thread* self(); int setschedparam(int policy, const struct sched_param* param) { @@ -256,6 +235,25 @@ bool detached_; }; + thread_local ti_thread* this_ti_thread = nullptr; + + static bool main_thread_initializer() + { + const auto* main_thread_key + = reinterpret_cast( + append_key("main", "thread")); + static ti_thread main_thread(main_thread_key); + this_ti_thread = &main_thread; + return true; + } + static bool main_thread_init = main_thread_initializer(); + + ti_thread* ti_thread::self() + { + return this_ti_thread; + } + + class ti_mutex : public ti_obj { public: @@ -472,12 +470,12 @@ { thread_args* ta(reinterpret_cast(args_ptr)); ti_thread* thread = reinterpret_cast(ta->this_thread); - pthread_setspecific(this_thread_key, thread); + this_ti_thread = thread; void* (*fn)(void*) = ta->fn; void* args = ta->args; delete ta; void* ret = (*fn)(args); - pthread_setspecific(this_thread_key, nullptr); + this_ti_thread = nullptr; // If we end here the thread returned instead of calling // pthread_exit() if (thread->detached()) @@ -488,7 +486,7 @@ WSREP_NORETURN static void exit_thread(wsrep::thread_service::thread* thread, void* retval) { - pthread_setspecific(this_thread_key, nullptr); + this_ti_thread = nullptr; ti_thread* th(reinterpret_cast(thread)); th->retval(retval); if (th->detached()) diff -Nru mariadb-10.11.6/wsrep-lib/include/wsrep/client_service.hpp mariadb-10.11.9/wsrep-lib/include/wsrep/client_service.hpp --- mariadb-10.11.6/wsrep-lib/include/wsrep/client_service.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/include/wsrep/client_service.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -195,6 +195,16 @@ virtual bool is_explicit_xa() = 0; /** + * Returns true if the client has an ongoing XA transaction + * in prepared state. + * Notice: one could simply check if wsrep::transaction is + * in s_prepared state. However, wsrep::transaction does not + * transition to prepared state for read-only / empty + * transactions. + */ + virtual bool is_prepared_xa() = 0; + + /** * Returns true if the currently executing command is * a rollback for XA. This is used to avoid setting a * a deadlock error rollback as it may be unexpected diff -Nru mariadb-10.11.6/wsrep-lib/include/wsrep/logger.hpp mariadb-10.11.9/wsrep-lib/include/wsrep/logger.hpp --- mariadb-10.11.6/wsrep-lib/include/wsrep/logger.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/include/wsrep/logger.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -86,7 +86,11 @@ { if (logger_fn_) { - logger_fn_(level_, prefix_, oss_.str().c_str()); + // Prolong the lifetime of the string so it doesn't get + // destroyed right after evaluating c_str() and before + // completing the logger function call. + const std::string& tmp = oss_.str(); + logger_fn_(level_, prefix_, tmp.c_str()); } else { diff -Nru mariadb-10.11.6/wsrep-lib/include/wsrep/provider.hpp mariadb-10.11.9/wsrep-lib/include/wsrep/provider.hpp --- mariadb-10.11.6/wsrep-lib/include/wsrep/provider.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/include/wsrep/provider.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -288,6 +288,21 @@ static std::string str(int); }; + /** + * Node isolation mode. + */ + enum node_isolation + { + /** Node is not isolated. */ + not_isolated, + /** Node is isolated from the rest of the cluster on + * network level. */ + isolated, + /** As on, but also force the provider to deliver a view with + * disconnected status. */ + force_disconnect + }; + provider(wsrep::server_state& server_state) : server_state_(server_state) { } @@ -389,6 +404,16 @@ virtual std::string options() const = 0; virtual enum status options(const std::string&) = 0; + + + /** + * Set node isolation mode. + * + * @param mode node_isolation mode. + * @return Provider status indicating the result of the call. + */ + virtual enum status set_node_isolation(enum node_isolation mode) = 0; + /** * Get provider name. * diff -Nru mariadb-10.11.6/wsrep-lib/include/wsrep/reporter.hpp mariadb-10.11.9/wsrep-lib/include/wsrep/reporter.hpp --- mariadb-10.11.6/wsrep-lib/include/wsrep/reporter.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/include/wsrep/reporter.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -105,21 +105,21 @@ typedef struct { double tstamp; std::string msg; - } log_msg; + } log_msg_t ; - std::deque err_msg_; - std::deque warn_msg_; - std::deque events_; + std::deque err_msg_; + std::deque warn_msg_; + std::deque events_; size_t const max_msg_; static void write_log_msg(std::ostream& os, - const log_msg& msg); + const log_msg_t& msg); static void write_event(std::ostream& os, - const log_msg& msg); + const log_msg_t& msg); static void write_array(std::ostream& os, const std::string& label, - const std::deque& events, + const std::deque& events, void (*element_writer)(std::ostream& os, - const log_msg& msg)); + const log_msg_t& msg)); substates substate_map(enum server_state::state state); float progress_map(float progress) const; void write_file(double timestamp); diff -Nru mariadb-10.11.6/wsrep-lib/src/client_state.cpp mariadb-10.11.9/wsrep-lib/src/client_state.cpp --- mariadb-10.11.6/wsrep-lib/src/client_state.cpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/src/client_state.cpp 2024-08-03 07:30:02.000000000 +0000 @@ -68,8 +68,7 @@ keep_command_error_ = false; lock.unlock(); if (transaction_.active() && - (mode_ != m_local || - transaction_.state() != wsrep::transaction::s_prepared)) + (mode_ != m_local || !client_service_.is_prepared_xa())) { client_service_.bf_rollback(); transaction_.after_statement(); @@ -1039,8 +1038,9 @@ }; if (!allowed[state_][state]) { - wsrep::log_warning() << "client_state: Unallowed state transition: " - << state_ << " -> " << state; + wsrep::log_warning() + << "client_state: Unallowed state transition: " + << wsrep::to_string(state_) << " -> " << wsrep::to_string(state); assert(0); } state_hist_.push_back(state_); diff -Nru mariadb-10.11.6/wsrep-lib/src/reporter.cpp mariadb-10.11.9/wsrep-lib/src/reporter.cpp --- mariadb-10.11.6/wsrep-lib/src/reporter.cpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/src/reporter.cpp 2024-08-03 07:30:02.000000000 +0000 @@ -176,7 +176,7 @@ void wsrep::reporter::write_log_msg(std::ostream& os, - const log_msg& msg) + const log_msg_t& msg) { os << "\t\t{\n"; os << "\t\t\t\"timestamp\": " << std::showpoint << std::setprecision(18) @@ -187,7 +187,7 @@ void wsrep::reporter::write_event(std::ostream& os, - const log_msg& msg) + const log_msg_t& msg) { os << "\t\t{\n"; os << "\t\t\t\"timestamp\": " << std::showpoint << std::setprecision(18) @@ -199,9 +199,9 @@ void wsrep::reporter::write_array(std::ostream& os, const std::string& label, - const std::deque& msgs, + const std::deque& msgs, void (*element_writer)(std::ostream& os, - const log_msg& msg)) + const log_msg_t& msg)) { os << "\t\"" << label << "\": [\n"; for (size_t i(0); i < msgs.size(); ++i) @@ -351,7 +351,7 @@ const std::string& msg, double tstamp) { - std::deque& deque(lvl == error ? err_msg_ : warn_msg_); + std::deque& deque(lvl == error ? err_msg_ : warn_msg_); wsrep::unique_lock lock(mutex_); @@ -363,7 +363,7 @@ /* Log messages are not expected to be json formatted, so we escape the message strings here to keep the report file well formatted. */ - log_msg entry({tstamp, escape_json(msg)}); + log_msg_t entry({tstamp, escape_json(msg)}); deque.push_back(entry); write_file(tstamp); } diff -Nru mariadb-10.11.6/wsrep-lib/src/service_helpers.hpp mariadb-10.11.9/wsrep-lib/src/service_helpers.hpp --- mariadb-10.11.6/wsrep-lib/src/service_helpers.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/src/service_helpers.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -100,7 +100,29 @@ << service_name; } } -} + + template Fn resolve_function(void* dlh, const char* symbol) + { + union + { + Fn fun; + void* obj; + } alias; + (void)dlerror(); + alias.obj = dlsym(dlh, symbol); + if (alias.obj) + { + wsrep::log_info() << "Resolved symbol '" << symbol << "'"; + return alias.fun; + } + else + { + wsrep::log_info() + << "Symbol '" << symbol << "' not found from provider"; + return nullptr; + } + } +} // namespace wsrep_impl #endif // WSREP_SERVICE_HELPERS_HPP diff -Nru mariadb-10.11.6/wsrep-lib/src/transaction.cpp mariadb-10.11.9/wsrep-lib/src/transaction.cpp --- mariadb-10.11.6/wsrep-lib/src/transaction.cpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/src/transaction.cpp 2024-08-03 07:30:02.000000000 +0000 @@ -1400,10 +1400,19 @@ } return true; } - else if (client_service_.interrupted(lock)) + + if (client_service_.interrupted(lock)) { + assert(state() != s_must_abort && + state() != s_aborting && + state() != s_aborted); + + // Client was interrupted. Set the appropriate error and abort. + // For transactions in prepared state, it is OK to interrupt the + // statement, but transaction must remain in prepared state until + // commit or rollback. client_state_.override_error(wsrep::e_interrupted_error); - if (state() != s_must_abort) + if (state() != s_prepared) { state(lock, s_must_abort); } diff -Nru mariadb-10.11.6/wsrep-lib/src/wsrep_provider_v26.cpp mariadb-10.11.9/wsrep-lib/src/wsrep_provider_v26.cpp --- mariadb-10.11.6/wsrep-lib/src/wsrep_provider_v26.cpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/src/wsrep_provider_v26.cpp 2024-08-03 07:30:02.000000000 +0000 @@ -29,12 +29,13 @@ #include "wsrep/tls_service.hpp" #include "wsrep/allowlist_service.hpp" +#include "service_helpers.hpp" #include "thread_service_v1.hpp" #include "tls_service_v1.hpp" #include "allowlist_service_v1.hpp" #include "event_service_v1.hpp" #include "v26/wsrep_api.h" - +#include "v26/wsrep_node_isolation.h" #include #include @@ -671,6 +672,8 @@ { wsrep::event_service_v1_deinit(dlh); } + + wsrep_node_isolation_mode_set_fn_v1 node_isolation_mode_set; } @@ -714,6 +717,10 @@ services_enabled_.event_service = services.event_service; } } + + node_isolation_mode_set + = wsrep_impl::resolve_function( + wsrep_->dlh, WSREP_NODE_ISOLATION_MODE_SET_V1); } void wsrep::wsrep_provider_v26::deinit_services() @@ -726,6 +733,7 @@ deinit_thread_service(wsrep_->dlh); if (services_enabled_.allowlist_service) deinit_allowlist_service(wsrep_->dlh); + node_isolation_mode_set = nullptr; } wsrep::wsrep_provider_v26::wsrep_provider_v26( @@ -1162,6 +1170,40 @@ return map_return_value(wsrep_->options_set(wsrep_, opts.c_str())); } +/* + * Set node isolation mode in the provider. This function may be called from + * signal handler, so make sure that only 'safe' system calls and library + * functions are used. See + * https://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html + */ +enum wsrep::provider::status +wsrep::wsrep_provider_v26::set_node_isolation(node_isolation mode) +{ + if (not node_isolation_mode_set) + { + return error_not_implemented; + } + + enum wsrep_node_isolation_mode ws_mode = WSREP_NODE_ISOLATION_NOT_ISOLATED; + switch (mode) + { + case node_isolation::not_isolated: + ws_mode = WSREP_NODE_ISOLATION_NOT_ISOLATED; + break; + case node_isolation::isolated: + ws_mode = WSREP_NODE_ISOLATION_ISOLATED; + break; + case node_isolation::force_disconnect: + ws_mode = WSREP_NODE_ISOLATION_FORCE_DISCONNECT; + break; + } + if ((*node_isolation_mode_set)(ws_mode) != WSREP_NODE_ISOLATION_SUCCESS) + { + return error_warning; + } + return success; +} + std::string wsrep::wsrep_provider_v26::name() const { return (wsrep_->provider_name ? wsrep_->provider_name : "unknown"); diff -Nru mariadb-10.11.6/wsrep-lib/src/wsrep_provider_v26.hpp mariadb-10.11.9/wsrep-lib/src/wsrep_provider_v26.hpp --- mariadb-10.11.6/wsrep-lib/src/wsrep_provider_v26.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/src/wsrep_provider_v26.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -100,6 +100,7 @@ void reset_status() WSREP_OVERRIDE; std::string options() const WSREP_OVERRIDE; enum wsrep::provider::status options(const std::string&) WSREP_OVERRIDE; + enum status set_node_isolation(enum node_isolation mode) WSREP_OVERRIDE; std::string name() const WSREP_OVERRIDE; std::string version() const WSREP_OVERRIDE; std::string vendor() const WSREP_OVERRIDE; diff -Nru mariadb-10.11.6/wsrep-lib/test/mock_client_state.hpp mariadb-10.11.9/wsrep-lib/test/mock_client_state.hpp --- mariadb-10.11.6/wsrep-lib/test/mock_client_state.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/test/mock_client_state.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -176,6 +176,11 @@ return false; } + bool is_prepared_xa() WSREP_OVERRIDE + { + return false; + } + bool is_xa_rollback() WSREP_OVERRIDE { return false; diff -Nru mariadb-10.11.6/wsrep-lib/test/mock_provider.hpp mariadb-10.11.9/wsrep-lib/test/mock_provider.hpp --- mariadb-10.11.6/wsrep-lib/test/mock_provider.hpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/test/mock_provider.hpp 2024-08-03 07:30:02.000000000 +0000 @@ -294,6 +294,9 @@ enum wsrep::provider::status options(const std::string&) WSREP_OVERRIDE { return wsrep::provider::success; } + enum status set_node_isolation(enum node_isolation) WSREP_OVERRIDE { + return error_not_implemented; + } std::string name() const WSREP_OVERRIDE { return "mock"; } std::string version() const WSREP_OVERRIDE { return "0.0"; } std::string vendor() const WSREP_OVERRIDE { return "mock"; } diff -Nru mariadb-10.11.6/wsrep-lib/test/reporter_test.cpp mariadb-10.11.9/wsrep-lib/test/reporter_test.cpp --- mariadb-10.11.6/wsrep-lib/test/reporter_test.cpp 2023-10-09 16:37:37.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/test/reporter_test.cpp 2024-08-03 07:30:02.000000000 +0000 @@ -23,9 +23,11 @@ #include -#include #include +#include +#include #include + #include // unlink() for cleanup namespace json = boost::json; diff -Nru mariadb-10.11.6/wsrep-lib/wsrep-API/v26/wsrep_node_isolation.h mariadb-10.11.9/wsrep-lib/wsrep-API/v26/wsrep_node_isolation.h --- mariadb-10.11.6/wsrep-lib/wsrep-API/v26/wsrep_node_isolation.h 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/wsrep-lib/wsrep-API/v26/wsrep_node_isolation.h 2024-08-03 07:30:02.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2024 Codership Oy + * + * This file is part of wsrep-API. + * + * Wsrep-API 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 of the License, or + * (at your option) any later version. + * + * Wsrep-API 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 wsrep-API. If not, see . + */ + +#ifndef WSREP_NODE_ISOLATION_H +#define WSREP_NODE_ISOLATION_H + +/** @file wsrep_node_isolation.h + * + * This file defines and interface to isolate the node from + * the rest of the cluster. The purpose of isolation is to shut + * down all communication with the rest of the cluster in case + * of node failure where the node cannot continue reliably anymore, + * e.g. in case of handling a signal which will terminate the process. + */ + +/** + * Mode of node isolation. + */ +enum wsrep_node_isolation_mode +{ + /** Node is not isolated. */ + WSREP_NODE_ISOLATION_NOT_ISOLATED, + /** Node is isolated from the rest of the cluster on network + * level. All ongoing network connections will be terminated and + * no new connections are accepted. */ + WSREP_NODE_ISOLATION_ISOLATED, + /** As WSREP_NODE_ISOLATION_ON, but also force the provider + * to deliver view with status WSREP_VIEW_DISCONNECTED. */ + WSREP_NODE_ISOLATION_FORCE_DISCONNECT, +}; + +enum wsrep_node_isolation_result +{ + /** Setting the isolation mode was successful. */ + WSREP_NODE_ISOLATION_SUCCESS, + /** Invalid isolation mode was passed. */ + WSREP_NODE_ISOLATION_INVALID_VALUE +}; + +/** Set mode isolation mode according to give wsrep_node_isolation_mode + * enum. + * + * The implementation must be async signal safe to allow calling + * it from program signal handler. + * + * @param mode Mode to set. + * @return wsrep_node_isolation_result enum. + */ +typedef enum wsrep_node_isolation_result (*wsrep_node_isolation_mode_set_fn_v1)( + enum wsrep_node_isolation_mode mode); + +#define WSREP_NODE_ISOLATION_MODE_SET_V1 "wsrep_node_isolation_mode_set_v1" + +#endif /* WSREP_NODE_ISOLATION_H */ diff -Nru mariadb-10.11.6/zlib/ChangeLog mariadb-10.11.9/zlib/ChangeLog --- mariadb-10.11.6/zlib/ChangeLog 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/ChangeLog 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,16 @@ ChangeLog file for zlib +Changes in 1.3.1 (22 Jan 2024) +- Reject overflows of zip header fields in minizip +- Fix bug in inflateSync() for data held in bit buffer +- Add LIT_MEM define to use more memory for a small deflate speedup +- Fix decision on the emission of Zip64 end records in minizip +- Add bounds checking to ERR_MSG() macro, used by zError() +- Neutralize zip file traversal attacks in miniunz +- Fix a bug in ZLIB_DEBUG compiles in check_match() +- Various portability and appearance improvements + Changes in 1.3 (18 Aug 2023) - Remove K&R function definitions and zlib2ansi - Fix bug in deflateBound() for level 0 and memLevel 9 diff -Nru mariadb-10.11.6/zlib/FAQ mariadb-10.11.9/zlib/FAQ --- mariadb-10.11.6/zlib/FAQ 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/FAQ 2024-08-03 07:30:00.000000000 +0000 @@ -14,8 +14,7 @@ 2. Where can I get a Windows DLL version? The zlib sources can be compiled without change to produce a DLL. See the - file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the - precompiled DLL are found in the zlib web site at http://zlib.net/ . + file win32/DLL_FAQ.txt in the zlib distribution. 3. Where can I get a Visual Basic interface to zlib? diff -Nru mariadb-10.11.6/zlib/README mariadb-10.11.9/zlib/README --- mariadb-10.11.6/zlib/README 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/README 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.3 is a general purpose data compression library. All the code is +zlib 1.3.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and @@ -31,7 +31,7 @@ issue of Dr. Dobb's Journal; a copy of the article is available at https://marknelson.us/posts/1997/01/01/zlib-engine.html . -The changes made in version 1.3 are documented in the file ChangeLog. +The changes made in version 1.3.1 are documented in the file ChangeLog. Unsupported third party contributions are provided in directory contrib/ . @@ -83,7 +83,7 @@ Copyright notice: - (C) 1995-2023 Jean-loup Gailly and Mark Adler + (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff -Nru mariadb-10.11.6/zlib/contrib/nuget/nuget.csproj mariadb-10.11.9/zlib/contrib/nuget/nuget.csproj --- mariadb-10.11.6/zlib/contrib/nuget/nuget.csproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/nuget/nuget.csproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,43 @@ + + + + net6.0 + madler.zlib.redist + $(PackageId).win + $(PackageId).linux + $(PackageId).osx + (C) 1995-2024 Jean-loup Gailly and Mark Adler + 1.3.1 + NuGet Package for consuming native builds of zlib into .NET without complexity. + + NU5128 + $(MSBuildProjectDirectory) + Jean-loup Gailly and Mark Adler + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru mariadb-10.11.6/zlib/contrib/nuget/nuget.sln mariadb-10.11.9/zlib/contrib/nuget/nuget.sln --- mariadb-10.11.6/zlib/contrib/nuget/nuget.sln 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/nuget/nuget.sln 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nuget", "nuget.csproj", "{B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1BD3984-EF8F-4E9D-9A94-EB784E5EB1E8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/miniunz.vcxproj mariadb-10.11.9/zlib/contrib/vstudio/vc17/miniunz.vcxproj --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/miniunz.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/miniunz.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,409 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694382A} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + true + false + x86\MiniUnzip$(Configuration)\ + x86\MiniUnzip$(Configuration)\Tmp\ + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\MiniUnzip$(Configuration)\ + x64\MiniUnzip$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\MiniUnzip$(Configuration)\ + arm64\MiniUnzip$(Configuration)\Tmp\ + + + arm64\MiniUnzip$(Configuration)\ + arm64\MiniUnzip$(Configuration)\Tmp\ + + + arm\MiniUnzip$(Configuration)\ + arm\MiniUnzip$(Configuration)\Tmp\ + + + arm\MiniUnzip$(Configuration)\ + arm\MiniUnzip$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + $(OutDir)miniunz.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)miniunz.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/minizip.vcxproj mariadb-10.11.9/zlib/contrib/vstudio/vc17/minizip.vcxproj --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/minizip.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/minizip.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,405 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + true + false + x86\MiniZip$(Configuration)\ + x86\MiniZip$(Configuration)\Tmp\ + false + x64\$(Configuration)\ + x64\$(Configuration)\ + true + true + true + false + false + false + x64\$(Configuration)\ + x64\$(Configuration)\ + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\MiniZip$(Configuration)\ + arm64\MiniZip$(Configuration)\Tmp\ + + + arm64\MiniZip$(Configuration)\ + arm64\MiniZip$(Configuration)\Tmp\ + + + arm\MiniZip$(Configuration)\ + arm\MiniZip$(Configuration)\Tmp\ + + + arm\MiniZip$(Configuration)\ + arm\MiniZip$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + $(OutDir)minizip.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)minizip.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/testzlib.vcxproj mariadb-10.11.9/zlib/contrib/vstudio/vc17/testzlib.vcxproj --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/testzlib.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/testzlib.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,473 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B} + testzlib + Win32Proj + 10.0 + + + + Application + MultiByte + true + v143 + + + Application + MultiByte + true + v143 + + + Application + Unicode + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + true + v143 + + + Application + v143 + + + Application + v143 + + + Application + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + true + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x86\TestZlib$(Configuration)\ + x86\TestZlib$(Configuration)\Tmp\ + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + x64\TestZlib$(Configuration)\ + x64\TestZlib$(Configuration)\Tmp\ + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm64\TestZlib$(Configuration)\ + arm64\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + arm\TestZlib$(Configuration)\ + arm\TestZlib$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + AssemblyAndSourceCode + $(IntDir) + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)testzlib.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + %(AdditionalDependencies) + $(OutDir)testzlib.exe + true + Console + true + true + false + + + MachineX86 + false + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDebugDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + false + $(IntDir) + + + %(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj mariadb-10.11.9/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,409 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {C52F9E7B-498A-42BE-8DB4-85A15694366A} + Win32Proj + 10.0 + + + + Application + MultiByte + v143 + + + Application + Unicode + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + Application + MultiByte + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + true + false + x86\TestZlibDll$(Configuration)\ + x86\TestZlibDll$(Configuration)\Tmp\ + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\TestZlibDll$(Configuration)\ + x64\TestZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\TestZlibDll$(Configuration)\ + arm64\TestZlibDll$(Configuration)\Tmp\ + + + arm64\TestZlibDll$(Configuration)\ + arm64\TestZlibDll$(Configuration)\Tmp\ + + + arm\TestZlibDll$(Configuration)\ + arm\TestZlibDll$(Configuration)\Tmp\ + + + arm\TestZlibDll$(Configuration)\ + arm\TestZlibDll$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + false + + + MachineX86 + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + Default + MultiThreaded + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + false + + + MachineX86 + + + + + X64 + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + MachineX64 + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + + + + + + Disabled + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDebugDLL + false + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + $(OutDir)testzlib.pdb + Console + + + + + X64 + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + MachineX64 + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + + + + + + MaxSpeed + OnlyExplicitInline + true + ..\..\..;..\..\minizip;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions) + true + Default + MultiThreadedDLL + false + true + + + $(IntDir) + Level3 + ProgramDatabase + + + x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies) + $(OutDir)testzlibdll.exe + true + Console + true + true + + + + + + + + {8fd826f8-3739-44e6-8cc8-997122e53b8d} + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlib.rc mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlib.rc --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlib.rc 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlib.rc 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,32 @@ +#include + +#define IDR_VERSION1 1 +IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE + FILEVERSION 1, 3, 1, 0 + PRODUCTVERSION 1, 3, 1, 0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS 0 + FILEOS VOS_DOS_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE 0 // not used +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + + BEGIN + VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0" + VALUE "FileVersion", "1.3.1\0" + VALUE "InternalName", "zlib\0" + VALUE "OriginalFilename", "zlibwapi.dll\0" + VALUE "ProductName", "ZLib.DLL\0" + VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0" + VALUE "LegalCopyright", "(C) 1995-2024 Jean-loup Gailly & Mark Adler\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1252 + END +END diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibstat.vcxproj mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibstat.vcxproj --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibstat.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibstat.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,602 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8} + 10.0 + + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + Unicode + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + StaticLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x86\ZlibStat$(Configuration)\ + x86\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + x64\ZlibStat$(Configuration)\ + x64\ZlibStat$(Configuration)\Tmp\ + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm64\ZlibStat$(Configuration)\ + arm64\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + arm\ZlibStat$(Configuration)\ + arm\ZlibStat$(Configuration)\Tmp\ + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + OldStyle + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibstat.lib + true + + + + + X64 + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM64 /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibstat.pch + $(IntDir) + $(IntDir) + $(OutDir) + Level3 + true + + + 0x040c + + + /MACHINE:ARM /NODEFAULTLIB %(AdditionalOptions) + $(OutDir)zlibstat.lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibvc.def mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.def --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibvc.def 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.def 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,158 @@ +LIBRARY +; zlib data compression and ZIP file I/O library + +VERSION 1.3.1 + +EXPORTS + adler32 @1 + compress @2 + crc32 @3 + deflate @4 + deflateCopy @5 + deflateEnd @6 + deflateInit2_ @7 + deflateInit_ @8 + deflateParams @9 + deflateReset @10 + deflateSetDictionary @11 + gzclose @12 + gzdopen @13 + gzerror @14 + gzflush @15 + gzopen @16 + gzread @17 + gzwrite @18 + inflate @19 + inflateEnd @20 + inflateInit2_ @21 + inflateInit_ @22 + inflateReset @23 + inflateSetDictionary @24 + inflateSync @25 + uncompress @26 + zlibVersion @27 + gzprintf @28 + gzputc @29 + gzgetc @30 + gzseek @31 + gzrewind @32 + gztell @33 + gzeof @34 + gzsetparams @35 + zError @36 + inflateSyncPoint @37 + get_crc_table @38 + compress2 @39 + gzputs @40 + gzgets @41 + inflateCopy @42 + inflateBackInit_ @43 + inflateBack @44 + inflateBackEnd @45 + compressBound @46 + deflateBound @47 + gzclearerr @48 + gzungetc @49 + zlibCompileFlags @50 + deflatePrime @51 + deflatePending @52 + + unzOpen @61 + unzClose @62 + unzGetGlobalInfo @63 + unzGetCurrentFileInfo @64 + unzGoToFirstFile @65 + unzGoToNextFile @66 + unzOpenCurrentFile @67 + unzReadCurrentFile @68 + unzOpenCurrentFile3 @69 + unztell @70 + unzeof @71 + unzCloseCurrentFile @72 + unzGetGlobalComment @73 + unzStringFileNameCompare @74 + unzLocateFile @75 + unzGetLocalExtrafield @76 + unzOpen2 @77 + unzOpenCurrentFile2 @78 + unzOpenCurrentFilePassword @79 + + zipOpen @80 + zipOpenNewFileInZip @81 + zipWriteInFileInZip @82 + zipCloseFileInZip @83 + zipClose @84 + zipOpenNewFileInZip2 @86 + zipCloseFileInZipRaw @87 + zipOpen2 @88 + zipOpenNewFileInZip3 @89 + + unzGetFilePos @100 + unzGoToFilePos @101 + + fill_win32_filefunc @110 + +; zlibwapi v1.2.4 added: + fill_win32_filefunc64 @111 + fill_win32_filefunc64A @112 + fill_win32_filefunc64W @113 + + unzOpen64 @120 + unzOpen2_64 @121 + unzGetGlobalInfo64 @122 + unzGetCurrentFileInfo64 @124 + unzGetCurrentFileZStreamPos64 @125 + unztell64 @126 + unzGetFilePos64 @127 + unzGoToFilePos64 @128 + + zipOpen64 @130 + zipOpen2_64 @131 + zipOpenNewFileInZip64 @132 + zipOpenNewFileInZip2_64 @133 + zipOpenNewFileInZip3_64 @134 + zipOpenNewFileInZip4_64 @135 + zipCloseFileInZipRaw64 @136 + +; zlib1 v1.2.4 added: + adler32_combine @140 + crc32_combine @142 + deflateSetHeader @144 + deflateTune @145 + gzbuffer @146 + gzclose_r @147 + gzclose_w @148 + gzdirect @149 + gzoffset @150 + inflateGetHeader @156 + inflateMark @157 + inflatePrime @158 + inflateReset2 @159 + inflateUndermine @160 + +; zlib1 v1.2.6 added: + gzgetc_ @161 + inflateResetKeep @163 + deflateResetKeep @164 + +; zlib1 v1.2.7 added: + gzopen_w @165 + +; zlib1 v1.2.8 added: + inflateGetDictionary @166 + gzvprintf @167 + +; zlib1 v1.2.9 added: + inflateCodesUsed @168 + inflateValidate @169 + uncompress2 @170 + gzfread @171 + gzfwrite @172 + deflateGetDictionary @173 + adler32_z @174 + crc32_z @175 + +; zlib1 v1.2.12 added: + crc32_combine_gen @176 + crc32_combine_gen64 @177 + crc32_combine_op @178 diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibvc.sln mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.sln --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibvc.sln 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.sln 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,179 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33015.44 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseWithoutAsm|ARM = ReleaseWithoutAsm|ARM + ReleaseWithoutAsm|ARM64 = ReleaseWithoutAsm|ARM64 + ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32 + ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.ActiveCfg = Debug|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM.Build.0 = Debug|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|ARM64.Build.0 = Debug|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.ActiveCfg = Release|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM.Build.0 = Release|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.ActiveCfg = Release|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|ARM64.Build.0 = Release|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.ActiveCfg = Debug|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM.Build.0 = Debug|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|ARM64.Build.0 = Debug|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.ActiveCfg = Release|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM.Build.0 = Release|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.ActiveCfg = Release|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|ARM64.Build.0 = Release|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = ReleaseWithoutAsm|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = ReleaseWithoutAsm|ARM + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = ReleaseWithoutAsm|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = ReleaseWithoutAsm|ARM64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64 + {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.ActiveCfg = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM.Build.0 = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|ARM64.Build.0 = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.ActiveCfg = Debug|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM.Build.0 = Debug|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|ARM64.Build.0 = Debug|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.ActiveCfg = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM.Build.0 = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.ActiveCfg = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|ARM64.Build.0 = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.ActiveCfg = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM.Build.0 = Debug|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|ARM64.Build.0 = Debug|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.ActiveCfg = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM.Build.0 = Release|ARM + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.ActiveCfg = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|ARM64.Build.0 = Release|ARM64 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32 + {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EAA58685-56D9-43F2-8703-FD2CB020745E} + EndGlobalSection +EndGlobal diff -Nru mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibvc.vcxproj mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.vcxproj --- mariadb-10.11.6/zlib/contrib/vstudio/vc17/zlibvc.vcxproj 1970-01-01 00:00:00.000000000 +0000 +++ mariadb-10.11.9/zlib/contrib/vstudio/vc17/zlibvc.vcxproj 2024-08-03 07:30:00.000000000 +0000 @@ -0,0 +1,875 @@ + + + + + Debug + ARM + + + Debug + ARM64 + + + Debug + Win32 + + + Debug + x64 + + + ReleaseWithoutAsm + ARM + + + ReleaseWithoutAsm + ARM64 + + + ReleaseWithoutAsm + Win32 + + + ReleaseWithoutAsm + x64 + + + Release + ARM + + + Release + ARM64 + + + Release + Win32 + + + Release + x64 + + + + {8FD826F8-3739-44E6-8CC8-997122E53B8D} + 10.0 + + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + v143 + Unicode + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + true + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + DynamicLibrary + false + v143 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30128.1 + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + true + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x86\ZlibDll$(Configuration)\ + x86\ZlibDll$(Configuration)\Tmp\ + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + true + true + true + false + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + x64\ZlibDll$(Configuration)\ + x64\ZlibDll$(Configuration)\Tmp\ + false + false + false + false + false + false + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + AllRules.ruleset + + + AllRules.ruleset + AllRules.ruleset + AllRules.ruleset + + + + + + + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + zlibwapi + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm64\ZlibDll$(Configuration)\ + arm64\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + arm\ZlibDll$(Configuration)\ + arm\ZlibDll$(Configuration)\Tmp\ + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + Win32 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + + MultiThreaded + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + /MACHINE:I386 %(AdditionalOptions) + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + false + + + $(OutDir)zlibwapi.lib + false + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + _DEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + Disabled + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + + + MultiThreadedDebugDLL + false + $(IntDir)zlibvc.pch + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + ProgramDatabase + + + _DEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + .\zlibvc.def + true + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + X64 + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + MachineX64 + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + NDEBUG;%(PreprocessorDefinitions) + true + true + $(OutDir)zlibvc.tlb + + + OnlyExplicitInline + ..\..\..;%(AdditionalIncludeDirectories) + _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN32;%(PreprocessorDefinitions) + true + + + MultiThreadedDLL + false + true + $(IntDir)zlibvc.pch + All + $(IntDir) + $(IntDir) + $(OutDir) + + + Level3 + true + + + NDEBUG;%(PreprocessorDefinitions) + 0x040c + + + %(AdditionalDependencies) + $(OutDir)zlibwapi.dll + true + false + .\zlibvc.def + $(OutDir)zlibwapi.pdb + true + $(OutDir)zlibwapi.map + Windows + $(OutDir)zlibwapi.lib + + + + + + + + + + + + + + + + + + + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + %(AdditionalIncludeDirectories) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + ZLIB_INTERNAL;%(PreprocessorDefinitions) + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -Nru mariadb-10.11.6/zlib/deflate.c mariadb-10.11.9/zlib/deflate.c --- mariadb-10.11.6/zlib/deflate.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/deflate.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.3 Copyright 1995-2023 Jean-loup Gailly and Mark Adler "; + " deflate 1.3.1 Copyright 1995-2024 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -493,7 +493,7 @@ * symbols from which it is being constructed. */ - s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4); + s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, LIT_BUFS); s->pending_buf_size = (ulg)s->lit_bufsize * 4; if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || @@ -503,8 +503,14 @@ deflateEnd (strm); return Z_MEM_ERROR; } +#ifdef LIT_MEM + s->d_buf = (ushf *)(s->pending_buf + (s->lit_bufsize << 1)); + s->l_buf = s->pending_buf + (s->lit_bufsize << 2); + s->sym_end = s->lit_bufsize - 1; +#else s->sym_buf = s->pending_buf + s->lit_bufsize; s->sym_end = (s->lit_bufsize - 1) * 3; +#endif /* We avoid equality with lit_bufsize*3 because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. @@ -720,9 +726,15 @@ if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; +#ifdef LIT_MEM + if (bits < 0 || bits > 16 || + (uchf *)s->d_buf < s->pending_out + ((Buf_size + 7) >> 3)) + return Z_BUF_ERROR; +#else if (bits < 0 || bits > 16 || s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; +#endif do { put = Buf_size - s->bi_valid; if (put > bits) @@ -1294,7 +1306,7 @@ ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4); + ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, LIT_BUFS); if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || ds->pending_buf == Z_NULL) { @@ -1305,10 +1317,15 @@ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos)); zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + zmemcpy(ds->pending_buf, ss->pending_buf, ds->lit_bufsize * LIT_BUFS); ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); +#ifdef LIT_MEM + ds->d_buf = (ushf *)(ds->pending_buf + (ds->lit_bufsize << 1)); + ds->l_buf = ds->pending_buf + (ds->lit_bufsize << 2); +#else ds->sym_buf = ds->pending_buf + ds->lit_bufsize; +#endif ds->l_desc.dyn_tree = ds->dyn_ltree; ds->d_desc.dyn_tree = ds->dyn_dtree; @@ -1539,13 +1556,21 @@ */ local void check_match(deflate_state *s, IPos start, IPos match, int length) { /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); + Bytef *back = s->window + (int)match, *here = s->window + start; + IPos len = length; + if (match == (IPos)-1) { + /* match starts one byte before the current window -- just compare the + subsequent length-1 bytes */ + back++; + here++; + len--; + } + if (zmemcmp(back, here, len) != EQUAL) { + fprintf(stderr, " start %u, match %d, length %d\n", + start, (int)match, length); do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); + fprintf(stderr, "(%02x %02x)", *back++, *here++); + } while (--len != 0); z_error("invalid match"); } if (z_verbose > 1) { diff -Nru mariadb-10.11.6/zlib/deflate.h mariadb-10.11.9/zlib/deflate.h --- mariadb-10.11.6/zlib/deflate.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/deflate.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2018 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -23,6 +23,10 @@ # define GZIP #endif +/* define LIT_MEM to slightly increase the speed of deflate (order 1% to 2%) at + the cost of a larger memory footprint */ +/* #define LIT_MEM */ + /* =========================================================================== * Internal compression state. */ @@ -217,7 +221,14 @@ /* Depth of each subtree used as tie breaker for trees of equal frequency */ +#ifdef LIT_MEM +# define LIT_BUFS 5 + ushf *d_buf; /* buffer for distances */ + uchf *l_buf; /* buffer for literals/lengths */ +#else +# define LIT_BUFS 4 uchf *sym_buf; /* buffer for distances and literals/lengths */ +#endif uInt lit_bufsize; /* Size of match buffer for literals/lengths. There are 4 reasons for @@ -239,7 +250,7 @@ * - I can't count above 4 */ - uInt sym_next; /* running index in sym_buf */ + uInt sym_next; /* running index in symbol buffer */ uInt sym_end; /* symbol table full when sym_next reaches this */ ulg opt_len; /* bit length of current block with optimal trees */ @@ -318,6 +329,25 @@ extern const uch ZLIB_INTERNAL _dist_code[]; #endif +#ifdef LIT_MEM +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->sym_next] = 0; \ + s->l_buf[s->sym_next++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ + s->d_buf[s->sym_next] = dist; \ + s->l_buf[s->sym_next++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->sym_next == s->sym_end); \ + } +#else # define _tr_tally_lit(s, c, flush) \ { uch cc = (c); \ s->sym_buf[s->sym_next++] = 0; \ @@ -337,6 +367,7 @@ s->dyn_dtree[d_code(dist)].Freq++; \ flush = (s->sym_next == s->sym_end); \ } +#endif #else # define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) # define _tr_tally_dist(s, distance, length, flush) \ diff -Nru mariadb-10.11.6/zlib/gzguts.h mariadb-10.11.9/zlib/gzguts.h --- mariadb-10.11.6/zlib/gzguts.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/gzguts.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004-2019 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -210,9 +210,5 @@ /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t value -- needed when comparing unsigned to z_off64_t, which is signed (possible z_off64_t types off_t, off64_t, and long are all signed) */ -#ifdef INT_MAX -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) -#else unsigned ZLIB_INTERNAL gz_intmax(void); -# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) -#endif +#define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) diff -Nru mariadb-10.11.6/zlib/gzlib.c mariadb-10.11.9/zlib/gzlib.c --- mariadb-10.11.6/zlib/gzlib.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/gzlib.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004-2019 Mark Adler + * Copyright (C) 2004-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -563,20 +563,20 @@ #endif } -#ifndef INT_MAX /* portably return maximum value for an int (when limits.h presumed not available) -- we need to do this to cover cases where 2's complement not used, since C standard permits 1's complement and sign-bit representations, otherwise we could just use ((unsigned)-1) >> 1 */ unsigned ZLIB_INTERNAL gz_intmax(void) { - unsigned p, q; - - p = 1; +#ifdef INT_MAX + return INT_MAX; +#else + unsigned p = 1, q; do { q = p; p <<= 1; p++; } while (p > q); return q >> 1; -} #endif +} diff -Nru mariadb-10.11.6/zlib/inflate.c mariadb-10.11.9/zlib/inflate.c --- mariadb-10.11.6/zlib/inflate.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/inflate.c 2024-08-03 07:30:00.000000000 +0000 @@ -1387,7 +1387,7 @@ /* if first time, start search in bit buffer */ if (state->mode != SYNC) { state->mode = SYNC; - state->hold <<= state->bits & 7; + state->hold >>= state->bits & 7; state->bits -= state->bits & 7; len = 0; while (state->bits >= 8) { diff -Nru mariadb-10.11.6/zlib/inftrees.c mariadb-10.11.9/zlib/inftrees.c --- mariadb-10.11.6/zlib/inftrees.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/inftrees.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2023 Mark Adler + * Copyright (C) 1995-2024 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.3 Copyright 1995-2023 Mark Adler "; + " inflate 1.3.1 Copyright 1995-2024 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -57,7 +57,7 @@ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 198, 203}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 203, 77}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, diff -Nru mariadb-10.11.6/zlib/inftrees.h mariadb-10.11.9/zlib/inftrees.h --- mariadb-10.11.6/zlib/inftrees.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/inftrees.h 2024-08-03 07:30:00.000000000 +0000 @@ -41,8 +41,8 @@ examples/enough.c found in the zlib distribution. The arguments to that program are the number of symbols, the initial root table size, and the maximum bit length of a code. "enough 286 9 15" for literal/length codes - returns returns 852, and "enough 30 6 15" for distance codes returns 592. - The initial root table size (9 or 6) is found in the fifth argument of the + returns 852, and "enough 30 6 15" for distance codes returns 592. The + initial root table size (9 or 6) is found in the fifth argument of the inflate_table() calls in inflate.c and infback.c. If the root table size is changed, then these maximum sizes would be need to be recalculated and updated. */ diff -Nru mariadb-10.11.6/zlib/qnx/package.qpg mariadb-10.11.9/zlib/qnx/package.qpg --- mariadb-10.11.6/zlib/qnx/package.qpg 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/qnx/package.qpg 2024-08-03 07:30:00.000000000 +0000 @@ -25,10 +25,10 @@ - - - - + + + + @@ -63,7 +63,7 @@ - 1.3.0 + 1.3.1 Medium Stable diff -Nru mariadb-10.11.6/zlib/treebuild.xml mariadb-10.11.9/zlib/treebuild.xml --- mariadb-10.11.6/zlib/treebuild.xml 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/treebuild.xml 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ - - + + zip compression library diff -Nru mariadb-10.11.6/zlib/trees.c mariadb-10.11.9/zlib/trees.c --- mariadb-10.11.6/zlib/trees.c 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/trees.c 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2021 Jean-loup Gailly + * Copyright (C) 1995-2024 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -899,14 +899,19 @@ const ct_data *dtree) { unsigned dist; /* distance of matched string */ int lc; /* match length or unmatched char (if dist == 0) */ - unsigned sx = 0; /* running index in sym_buf */ + unsigned sx = 0; /* running index in symbol buffers */ unsigned code; /* the code to send */ int extra; /* number of extra bits to send */ if (s->sym_next != 0) do { +#ifdef LIT_MEM + dist = s->d_buf[sx]; + lc = s->l_buf[sx++]; +#else dist = s->sym_buf[sx++] & 0xff; dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; lc = s->sym_buf[sx++]; +#endif if (dist == 0) { send_code(s, lc, ltree); /* send a literal byte */ Tracecv(isgraph(lc), (stderr," '%c' ", lc)); @@ -931,8 +936,12 @@ } } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and sym_buf is ok: */ + /* Check for no overlay of pending_buf on needed symbols */ +#ifdef LIT_MEM + Assert(s->pending < 2 * (s->lit_bufsize + sx), "pendingBuf overflow"); +#else Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); +#endif } while (sx < s->sym_next); @@ -1082,9 +1091,14 @@ * the current block must be flushed. */ int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { +#ifdef LIT_MEM + s->d_buf[s->sym_next] = (ush)dist; + s->l_buf[s->sym_next++] = (uch)lc; +#else s->sym_buf[s->sym_next++] = (uch)dist; s->sym_buf[s->sym_next++] = (uch)(dist >> 8); s->sym_buf[s->sym_next++] = (uch)lc; +#endif if (dist == 0) { /* lc is the unmatched char */ s->dyn_ltree[lc].Freq++; diff -Nru mariadb-10.11.6/zlib/win32/DLL_FAQ.txt mariadb-10.11.9/zlib/win32/DLL_FAQ.txt --- mariadb-10.11.6/zlib/win32/DLL_FAQ.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/win32/DLL_FAQ.txt 2024-08-03 07:30:00.000000000 +0000 @@ -3,7 +3,7 @@ This document describes the design, the rationale, and the usage -of the official DLL build of zlib, named ZLIB1.DLL. If you have +of the common DLL build of zlib, named ZLIB1.DLL. If you have general questions about zlib, you should see the file "FAQ" found in the zlib distribution, or at the following location: http://www.gzip.org/zlib/zlib_faq.html @@ -11,13 +11,9 @@ 1. What is ZLIB1.DLL, and how can I get it? - - ZLIB1.DLL is the official build of zlib as a DLL. + - ZLIB1.DLL is the common build of zlib as a DLL. (Please remark the character '1' in the name.) - Pointers to a precompiled ZLIB1.DLL can be found in the zlib - web site at: - http://www.zlib.net/ - Applications that link to ZLIB1.DLL can rely on the following specification: @@ -379,18 +375,6 @@ code. But you can make your own private DLL build, under a different file name, as suggested in the previous answer. - -17. I made my own ZLIB1.DLL build. Can I test it for compliance? - - - We prefer that you download the official DLL from the zlib - web site. If you need something peculiar from this DLL, you - can send your suggestion to the zlib mailing list. - - However, in case you do rebuild the DLL yourself, you can run - it with the test programs found in the DLL distribution. - Running these test programs is not a guarantee of compliance, - but a failure can imply a detected problem. - ** This document is written and maintained by diff -Nru mariadb-10.11.6/zlib/win32/README-WIN32.txt mariadb-10.11.9/zlib/win32/README-WIN32.txt --- mariadb-10.11.6/zlib/win32/README-WIN32.txt 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/win32/README-WIN32.txt 2024-08-03 07:30:00.000000000 +0000 @@ -1,6 +1,6 @@ ZLIB DATA COMPRESSION LIBRARY -zlib 1.3.0 is a general purpose data compression library. All the code is +zlib 1.3.1 is a general purpose data compression library. All the code is thread safe. The data format used by the zlib library is described by RFCs (Request for Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) @@ -16,13 +16,13 @@ verify that you have the latest version of zlib; otherwise get the latest version and check whether the problem still exists or not. -PLEASE read DLL_FAQ.txt, and the the zlib FAQ http://zlib.net/zlib_faq.html -before asking for help. +PLEASE read DLL_FAQ.txt, and the zlib FAQ http://zlib.net/zlib_faq.html before +asking for help. Manifest: -The package zlib-1.3.0-win32-x86.zip will contain the following files: +The package zlib-1.3.1-win32-x86.zip will contain the following files: README-WIN32.txt This document ChangeLog Changes since previous zlib packages diff -Nru mariadb-10.11.6/zlib/zconf.h.cmakein mariadb-10.11.9/zlib/zconf.h.cmakein --- mariadb-10.11.6/zlib/zconf.h.cmakein 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/zconf.h.cmakein 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -302,14 +302,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have diff -Nru mariadb-10.11.6/zlib/zconf.h.in mariadb-10.11.9/zlib/zconf.h.in --- mariadb-10.11.6/zlib/zconf.h.in 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/zconf.h.in 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -300,14 +300,6 @@ # endif #endif -#ifndef Z_ARG /* function prototypes for stdarg */ -# if defined(STDC) || defined(Z_HAVE_STDARG_H) -# define Z_ARG(args) args -# else -# define Z_ARG(args) () -# endif -#endif - /* The following definitions for FAR are needed only for MSDOS mixed * model programming (small or medium model with some far allocations). * This was tested only with MSC; for other MSDOS compilers you may have diff -Nru mariadb-10.11.6/zlib/zlib.3 mariadb-10.11.9/zlib/zlib.3 --- mariadb-10.11.6/zlib/zlib.3 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/zlib.3 2024-08-03 07:30:00.000000000 +0000 @@ -1,4 +1,4 @@ -.TH ZLIB 3 "18 Aug 2023" +.TH ZLIB 3 "22 Jan 2024" .SH NAME zlib \- compression/decompression library .SH SYNOPSIS @@ -105,9 +105,9 @@ Send questions and/or comments to zlib@gzip.org, or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). .SH AUTHORS AND LICENSE -Version 1.3 +Version 1.3.1 .LP -Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler +Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler .LP This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages diff -Nru mariadb-10.11.6/zlib/zlib.h mariadb-10.11.9/zlib/zlib.h --- mariadb-10.11.6/zlib/zlib.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/zlib.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.3, August 18th, 2023 + version 1.3.1, January 22nd, 2024 - Copyright (C) 1995-2023 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2024 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.3" -#define ZLIB_VERNUM 0x1300 +#define ZLIB_VERSION "1.3.1" +#define ZLIB_VERNUM 0x1310 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 3 -#define ZLIB_VER_REVISION 0 +#define ZLIB_VER_REVISION 1 #define ZLIB_VER_SUBREVISION 0 /* @@ -936,10 +936,10 @@ inflateSync returns Z_OK if a possible full flush point has been found, Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. - In the success case, the application may save the current current value of - total_in which indicates where valid compressed data was found. In the - error case, the application may repeatedly call inflateSync, providing more - input each time, until success or end of the input data. + In the success case, the application may save the current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy(z_streamp dest, @@ -1758,14 +1758,14 @@ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. + len2. len2 must be non-negative. */ /* ZEXTERN uLong ZEXPORT crc32_combine_gen(z_off_t len2); Return the operator corresponding to length len2, to be used with - crc32_combine_op(). + crc32_combine_op(). len2 must be non-negative. */ ZEXTERN uLong ZEXPORT crc32_combine_op(uLong crc1, uLong crc2, uLong op); diff -Nru mariadb-10.11.6/zlib/zutil.h mariadb-10.11.9/zlib/zutil.h --- mariadb-10.11.6/zlib/zutil.h 2023-11-08 15:46:47.000000000 +0000 +++ mariadb-10.11.9/zlib/zutil.h 2024-08-03 07:30:00.000000000 +0000 @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2022 Jean-loup Gailly, Mark Adler + * Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -56,7 +56,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* (size given to avoid silly warnings with Visual C++) */ -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] +#define ERR_MSG(err) z_errmsg[(err) < -6 || (err) > 2 ? 9 : 2 - (err)] #define ERR_RETURN(strm,err) \ return (strm->msg = ERR_MSG(err), (err)) @@ -137,17 +137,8 @@ # endif #endif -#if defined(MACOS) || defined(TARGET_OS_MAC) +#if defined(MACOS) # define OS_CODE 7 -# ifndef Z_SOLO -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -# endif #endif #ifdef __acorn @@ -170,18 +161,6 @@ # define OS_CODE 19 #endif -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - #if defined(__BORLANDC__) && !defined(MSDOS) #pragma warn -8004 #pragma warn -8008